summaryrefslogtreecommitdiff
path: root/tex
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2010-07-04 15:32:09 +0300
committerMarius <mariausol@gmail.com>2010-07-04 15:32:09 +0300
commit85b7bc695629926641c7cb752fd478adfdf374f3 (patch)
tree80293f5aaa7b95a500a78392c39688d8ee7a32fc /tex
downloadcontext-85b7bc695629926641c7cb752fd478adfdf374f3.tar.gz
stable 2010-05-24 13:10
Diffstat (limited to 'tex')
-rw-r--r--tex/context/base/anch-bar.mkii194
-rw-r--r--tex/context/base/anch-bar.mkiv179
-rw-r--r--tex/context/base/anch-pgr.mkii1687
-rw-r--r--tex/context/base/anch-pgr.mkiv1727
-rw-r--r--tex/context/base/anch-pos.lua166
-rw-r--r--tex/context/base/anch-pos.mkii877
-rw-r--r--tex/context/base/anch-pos.mkiv784
-rw-r--r--tex/context/base/anch-snc.mkii177
-rw-r--r--tex/context/base/anch-snc.mkiv185
-rw-r--r--tex/context/base/attr-ini.lua648
-rw-r--r--tex/context/base/attr-ini.mkiv170
-rw-r--r--tex/context/base/back-ini.lua143
-rw-r--r--tex/context/base/back-ini.mkiv168
-rw-r--r--tex/context/base/back-pdf.lua469
-rw-r--r--tex/context/base/back-pdf.mkiv178
-rw-r--r--tex/context/base/back-u3d.mkiv156
-rw-r--r--tex/context/base/bibl-bib.lua762
-rw-r--r--tex/context/base/bibl-bib.mkiv962
-rw-r--r--tex/context/base/bibl-tra.lua194
-rw-r--r--tex/context/base/bibl-tra.mkii1778
-rw-r--r--tex/context/base/bibl-tra.mkiv1552
-rw-r--r--tex/context/base/bibl-tst.lua21
-rw-r--r--tex/context/base/blob-ini.lua165
-rw-r--r--tex/context/base/blob-ini.mkiv34
-rw-r--r--tex/context/base/buff-ini.lua838
-rw-r--r--tex/context/base/buff-ini.mkii348
-rw-r--r--tex/context/base/buff-ini.mkiv355
-rw-r--r--tex/context/base/buff-ver.mkii1340
-rw-r--r--tex/context/base/buff-ver.mkiv1193
-rw-r--r--tex/context/base/bxml-apa.mkiv613
-rw-r--r--tex/context/base/catc-act.tex61
-rw-r--r--tex/context/base/catc-ctx.tex250
-rw-r--r--tex/context/base/catc-def.tex142
-rw-r--r--tex/context/base/catc-ini.lua33
-rw-r--r--tex/context/base/catc-ini.mkii249
-rw-r--r--tex/context/base/catc-ini.mkiv317
-rw-r--r--tex/context/base/catc-sym.tex187
-rw-r--r--tex/context/base/char-act.mkiv138
-rw-r--r--tex/context/base/char-cmp.lua268
-rw-r--r--tex/context/base/char-def.lua141127
-rw-r--r--tex/context/base/char-enc.lua163
-rw-r--r--tex/context/base/char-enc.mkiv18
-rw-r--r--tex/context/base/char-ini.lua698
-rw-r--r--tex/context/base/char-ini.mkiv76
-rw-r--r--tex/context/base/char-map.lua1069
-rw-r--r--tex/context/base/char-tex.lua89
-rw-r--r--tex/context/base/char-utf.lua273
-rw-r--r--tex/context/base/char-utf.mkiv47
-rw-r--r--tex/context/base/chem-ini.lua75
-rw-r--r--tex/context/base/chem-ini.mkiv47
-rw-r--r--tex/context/base/chem-str.lua490
-rw-r--r--tex/context/base/chem-str.mkiv529
-rw-r--r--tex/context/base/colo-ema.tex590
-rw-r--r--tex/context/base/colo-ext.mkii59
-rw-r--r--tex/context/base/colo-ext.mkiv103
-rw-r--r--tex/context/base/colo-hex.mkii125
-rw-r--r--tex/context/base/colo-hex.mkiv28
-rw-r--r--tex/context/base/colo-hex.tex3
-rw-r--r--tex/context/base/colo-ini.lua480
-rw-r--r--tex/context/base/colo-ini.mkii2776
-rw-r--r--tex/context/base/colo-ini.mkiv1091
-rw-r--r--tex/context/base/colo-rgb.tex530
-rw-r--r--tex/context/base/colo-run.tex257
-rw-r--r--tex/context/base/colo-x11.tex677
-rw-r--r--tex/context/base/colo-xwi.tex142
-rw-r--r--tex/context/base/cont-cs.tex39
-rw-r--r--tex/context/base/cont-de.tex44
-rw-r--r--tex/context/base/cont-en.tex46
-rw-r--r--tex/context/base/cont-err.tex18
-rw-r--r--tex/context/base/cont-fil.tex124
-rw-r--r--tex/context/base/cont-fr.tex42
-rw-r--r--tex/context/base/cont-gb.tex42
-rw-r--r--tex/context/base/cont-it.tex41
-rw-r--r--tex/context/base/cont-log.tex359
-rw-r--r--tex/context/base/cont-mtx.tex25
-rw-r--r--tex/context/base/cont-new.mkii22
-rw-r--r--tex/context/base/cont-new.mkiv40
-rw-r--r--tex/context/base/cont-new.tex992
-rw-r--r--tex/context/base/cont-nl.tex42
-rw-r--r--tex/context/base/cont-old.tex48
-rw-r--r--tex/context/base/cont-pe.tex45
-rw-r--r--tex/context/base/cont-ro.tex38
-rw-r--r--tex/context/base/cont-sys.ori182
-rw-r--r--tex/context/base/cont-usr.ori109
-rw-r--r--tex/context/base/context-base.lmx76
-rw-r--r--tex/context/base/context-characters.lmx110
-rw-r--r--tex/context/base/context-debug.lmx112
-rw-r--r--tex/context/base/context-error.lmx59
-rw-r--r--tex/context/base/context-fonttest.lmx47
-rw-r--r--tex/context/base/context-help.lmx88
-rw-r--r--tex/context/base/context-timing.lmx52
-rw-r--r--tex/context/base/context.css241
-rw-r--r--tex/context/base/context.mkii391
-rw-r--r--tex/context/base/context.mkiv380
-rw-r--r--tex/context/base/context.rme85
-rw-r--r--tex/context/base/context.tex225
-rw-r--r--tex/context/base/core-con.lua605
-rw-r--r--tex/context/base/core-con.mkii969
-rw-r--r--tex/context/base/core-con.mkiv860
-rw-r--r--tex/context/base/core-ctx.lua93
-rw-r--r--tex/context/base/core-ctx.mkii203
-rw-r--r--tex/context/base/core-ctx.mkiv28
-rw-r--r--tex/context/base/core-def.mkii105
-rw-r--r--tex/context/base/core-def.mkiv94
-rw-r--r--tex/context/base/core-env.mkii543
-rw-r--r--tex/context/base/core-env.mkiv388
-rw-r--r--tex/context/base/core-fil.mkii347
-rw-r--r--tex/context/base/core-fil.mkiv284
-rw-r--r--tex/context/base/core-fnt.mkii726
-rw-r--r--tex/context/base/core-fnt.mkiv293
-rw-r--r--tex/context/base/core-gen.mkii166
-rw-r--r--tex/context/base/core-gen.mkiv166
-rw-r--r--tex/context/base/core-ini.mkii67
-rw-r--r--tex/context/base/core-ini.mkiv66
-rw-r--r--tex/context/base/core-job.lua202
-rw-r--r--tex/context/base/core-job.mkii415
-rw-r--r--tex/context/base/core-job.mkiv309
-rw-r--r--tex/context/base/core-mis.mkii2742
-rw-r--r--tex/context/base/core-mis.mkiv2505
-rw-r--r--tex/context/base/core-par.mkii300
-rw-r--r--tex/context/base/core-stg.mkii72
-rw-r--r--tex/context/base/core-sys.lua22
-rw-r--r--tex/context/base/core-sys.mkii396
-rw-r--r--tex/context/base/core-sys.mkiv432
-rw-r--r--tex/context/base/core-two.lua137
-rw-r--r--tex/context/base/core-two.mkii206
-rw-r--r--tex/context/base/core-two.mkiv106
-rw-r--r--tex/context/base/core-uti.lua294
-rw-r--r--tex/context/base/core-uti.mkii349
-rw-r--r--tex/context/base/core-uti.mkiv66
-rw-r--r--tex/context/base/core-var.mkii286
-rw-r--r--tex/context/base/core-var.mkiv270
-rw-r--r--tex/context/base/data-aux.lua57
-rw-r--r--tex/context/base/data-bin.lua27
-rw-r--r--tex/context/base/data-con.lua120
-rw-r--r--tex/context/base/data-crl.lua60
-rw-r--r--tex/context/base/data-ctx.lua31
-rw-r--r--tex/context/base/data-gen.lua9
-rw-r--r--tex/context/base/data-inp.lua15
-rw-r--r--tex/context/base/data-kps.lua101
-rw-r--r--tex/context/base/data-lst.lua63
-rw-r--r--tex/context/base/data-lua.lua152
-rw-r--r--tex/context/base/data-out.lua10
-rw-r--r--tex/context/base/data-pre.lua109
-rw-r--r--tex/context/base/data-res.lua2181
-rw-r--r--tex/context/base/data-sch.lua142
-rw-r--r--tex/context/base/data-tex.lua226
-rw-r--r--tex/context/base/data-tmf.lua75
-rw-r--r--tex/context/base/data-tmp.lua178
-rw-r--r--tex/context/base/data-tre.lua47
-rw-r--r--tex/context/base/data-use.lua129
-rw-r--r--tex/context/base/data-zip.lua241
-rw-r--r--tex/context/base/enco-032.mkii82
-rw-r--r--tex/context/base/enco-037.mkii276
-rw-r--r--tex/context/base/enco-acc.mkii139
-rw-r--r--tex/context/base/enco-agr.mkii364
-rw-r--r--tex/context/base/enco-ans.mkii237
-rw-r--r--tex/context/base/enco-cas.mkii143
-rw-r--r--tex/context/base/enco-chi.mkii371
-rw-r--r--tex/context/base/enco-com.mkii37
-rw-r--r--tex/context/base/enco-cyr.mkii1037
-rw-r--r--tex/context/base/enco-def.mkii922
-rw-r--r--tex/context/base/enco-ec.mkii295
-rw-r--r--tex/context/base/enco-ecm.mkii33
-rw-r--r--tex/context/base/enco-el.mkii272
-rw-r--r--tex/context/base/enco-fde.mkii128
-rw-r--r--tex/context/base/enco-ffr.mkii57
-rw-r--r--tex/context/base/enco-fpl.mkii98
-rw-r--r--tex/context/base/enco-fro.mkii35
-rw-r--r--tex/context/base/enco-fsl.mkii32
-rw-r--r--tex/context/base/enco-grk.mkii190
-rw-r--r--tex/context/base/enco-heb.mkii16
-rw-r--r--tex/context/base/enco-ibm.mkii7
-rw-r--r--tex/context/base/enco-il2.mkii157
-rw-r--r--tex/context/base/enco-ini.mkii1137
-rw-r--r--tex/context/base/enco-ini.mkiv536
-rw-r--r--tex/context/base/enco-l7x.mkii236
-rw-r--r--tex/context/base/enco-lat.mkii7
-rw-r--r--tex/context/base/enco-mis.mkii188
-rw-r--r--tex/context/base/enco-pdf.mkii278
-rw-r--r--tex/context/base/enco-pfr.mkii305
-rw-r--r--tex/context/base/enco-pol.mkii276
-rw-r--r--tex/context/base/enco-qx.mkii266
-rw-r--r--tex/context/base/enco-raw.mkii119
-rw-r--r--tex/context/base/enco-run.mkii149
-rw-r--r--tex/context/base/enco-t5.mkii244
-rw-r--r--tex/context/base/enco-tbo.mkii222
-rw-r--r--tex/context/base/enco-uc.mkii1091
-rw-r--r--tex/context/base/enco-vis.mkii3
-rw-r--r--tex/context/base/enco-vna.mkii145
-rw-r--r--tex/context/base/enco-win.mkii7
-rw-r--r--tex/context/base/enco-x5.mkii218
-rw-r--r--tex/context/base/filt-bas.mkii63
-rw-r--r--tex/context/base/filt-ini.mkii121
-rw-r--r--tex/context/base/font-afm.lua855
-rw-r--r--tex/context/base/font-agl.lua3695
-rw-r--r--tex/context/base/font-arb.mkii5
-rw-r--r--tex/context/base/font-bfm.mkii196
-rw-r--r--tex/context/base/font-chi.mkii1156
-rw-r--r--tex/context/base/font-chk.lua90
-rw-r--r--tex/context/base/font-cid.lua147
-rw-r--r--tex/context/base/font-col.lua216
-rw-r--r--tex/context/base/font-col.mkiv148
-rw-r--r--tex/context/base/font-ctx.lua624
-rw-r--r--tex/context/base/font-def.lua651
-rw-r--r--tex/context/base/font-dum.lua301
-rw-r--r--tex/context/base/font-enc.lua122
-rw-r--r--tex/context/base/font-enh.lua201
-rw-r--r--tex/context/base/font-ext.lua623
-rw-r--r--tex/context/base/font-fbk.lua316
-rw-r--r--tex/context/base/font-gds.lua294
-rw-r--r--tex/context/base/font-gds.mkiv83
-rw-r--r--tex/context/base/font-heb.mkii5
-rw-r--r--tex/context/base/font-ini.lua95
-rw-r--r--tex/context/base/font-ini.mkii4573
-rw-r--r--tex/context/base/font-ini.mkiv3896
-rw-r--r--tex/context/base/font-jap.mkii83
-rw-r--r--tex/context/base/font-log.lua58
-rw-r--r--tex/context/base/font-map.lua370
-rw-r--r--tex/context/base/font-mis.lua101
-rw-r--r--tex/context/base/font-ota.lua286
-rw-r--r--tex/context/base/font-otb.lua373
-rw-r--r--tex/context/base/font-otc.lua213
-rw-r--r--tex/context/base/font-otd.lua78
-rw-r--r--tex/context/base/font-otf.lua1752
-rw-r--r--tex/context/base/font-oti.lua57
-rw-r--r--tex/context/base/font-otn.lua2660
-rw-r--r--tex/context/base/font-otp.lua504
-rw-r--r--tex/context/base/font-ott.lua956
-rw-r--r--tex/context/base/font-pat.lua126
-rw-r--r--tex/context/base/font-run.mkii326
-rw-r--r--tex/context/base/font-run.mkiv337
-rw-r--r--tex/context/base/font-syn.lua1454
-rw-r--r--tex/context/base/font-tfm.lua736
-rw-r--r--tex/context/base/font-tra.mkiv113
-rw-r--r--tex/context/base/font-uni.mkii444
-rw-r--r--tex/context/base/font-uni.mkiv26
-rw-r--r--tex/context/base/font-unk.mkii187
-rw-r--r--tex/context/base/font-unk.mkiv162
-rw-r--r--tex/context/base/font-vf.lua213
-rw-r--r--tex/context/base/font-xtx.lua122
-rw-r--r--tex/context/base/font-xtx.mkii376
-rw-r--r--tex/context/base/grph-fig.mkii559
-rw-r--r--tex/context/base/grph-fig.mkiv640
-rw-r--r--tex/context/base/grph-fil.lua42
-rw-r--r--tex/context/base/grph-inc.lua1115
-rw-r--r--tex/context/base/grph-inc.mkii1243
-rw-r--r--tex/context/base/grph-inc.mkiv433
-rw-r--r--tex/context/base/grph-swf.lua43
-rw-r--r--tex/context/base/grph-trf.mkii579
-rw-r--r--tex/context/base/grph-trf.mkiv580
-rw-r--r--tex/context/base/grph-u3d.lua49
-rw-r--r--tex/context/base/hand-def.mkii577
-rw-r--r--tex/context/base/hand-ini.mkii483
-rw-r--r--tex/context/base/hand-ini.mkiv74
-rw-r--r--tex/context/base/java-ans.tex28
-rw-r--r--tex/context/base/java-exa.tex395
-rw-r--r--tex/context/base/java-fil.tex48
-rw-r--r--tex/context/base/java-fld.tex282
-rw-r--r--tex/context/base/java-ini.lua120
-rw-r--r--tex/context/base/java-ini.mkii713
-rw-r--r--tex/context/base/java-ini.mkiv164
-rw-r--r--tex/context/base/java-stp.tex121
-rw-r--r--tex/context/base/l-aux.lua261
-rw-r--r--tex/context/base/l-boolean.lua55
-rw-r--r--tex/context/base/l-dimen.lua432
-rw-r--r--tex/context/base/l-dir.lua363
-rw-r--r--tex/context/base/l-file.lua314
-rw-r--r--tex/context/base/l-io.lua187
-rw-r--r--tex/context/base/l-lpeg.lua165
-rw-r--r--tex/context/base/l-math.lua41
-rw-r--r--tex/context/base/l-md5.lua72
-rw-r--r--tex/context/base/l-number.lua58
-rw-r--r--tex/context/base/l-os.lua301
-rw-r--r--tex/context/base/l-pdfview.lua95
-rw-r--r--tex/context/base/l-set.lua84
-rw-r--r--tex/context/base/l-string.lua288
-rw-r--r--tex/context/base/l-table.lua910
-rw-r--r--tex/context/base/l-unicode.lua199
-rw-r--r--tex/context/base/l-url.lua134
-rw-r--r--tex/context/base/l-utils.lua176
-rw-r--r--tex/context/base/l-xml.lua23
-rw-r--r--tex/context/base/lang-all.xml376
-rw-r--r--tex/context/base/lang-alt.tex152
-rw-r--r--tex/context/base/lang-ana.tex24
-rw-r--r--tex/context/base/lang-ara.mkiv150
-rw-r--r--tex/context/base/lang-art.tex26
-rw-r--r--tex/context/base/lang-bal.tex118
-rw-r--r--tex/context/base/lang-cel.tex26
-rw-r--r--tex/context/base/lang-chi.mkii305
-rw-r--r--tex/context/base/lang-cjk.mkiv328
-rw-r--r--tex/context/base/lang-ctx.mkii53
-rw-r--r--tex/context/base/lang-cyr.tex371
-rw-r--r--tex/context/base/lang-dis.mkii59
-rw-r--r--tex/context/base/lang-frd.tex140
-rw-r--r--tex/context/base/lang-frq.tex207
-rw-r--r--tex/context/base/lang-ger.tex738
-rw-r--r--tex/context/base/lang-grk.tex94
-rw-r--r--tex/context/base/lang-ind.tex26
-rw-r--r--tex/context/base/lang-ini.lua321
-rw-r--r--tex/context/base/lang-ini.mkii696
-rw-r--r--tex/context/base/lang-ini.mkiv560
-rw-r--r--tex/context/base/lang-ita.tex518
-rw-r--r--tex/context/base/lang-jap.mkii234
-rw-r--r--tex/context/base/lang-lab.mkii295
-rw-r--r--tex/context/base/lang-lab.mkiv283
-rw-r--r--tex/context/base/lang-mis.mkii683
-rw-r--r--tex/context/base/lang-mis.mkiv689
-rw-r--r--tex/context/base/lang-run.mkii36
-rw-r--r--tex/context/base/lang-sla.mkii30
-rw-r--r--tex/context/base/lang-sla.mkiv17
-rw-r--r--tex/context/base/lang-sla.tex497
-rw-r--r--tex/context/base/lang-spa.tex74
-rw-r--r--tex/context/base/lang-spe.mkii244
-rw-r--r--tex/context/base/lang-ura.tex158
-rw-r--r--tex/context/base/lang-url.lua101
-rw-r--r--tex/context/base/lang-url.mkii306
-rw-r--r--tex/context/base/lang-url.mkiv117
-rw-r--r--tex/context/base/lang-vn.tex92
-rw-r--r--tex/context/base/lang-wrd.lua225
-rw-r--r--tex/context/base/lang-wrd.mkiv54
-rw-r--r--tex/context/base/lpdf-ano.lua589
-rw-r--r--tex/context/base/lpdf-col.lua150
-rw-r--r--tex/context/base/lpdf-fld.lua885
-rw-r--r--tex/context/base/lpdf-grp.lua68
-rw-r--r--tex/context/base/lpdf-ini.lua670
-rw-r--r--tex/context/base/lpdf-ini.mkiv271
-rw-r--r--tex/context/base/lpdf-mis.lua292
-rw-r--r--tex/context/base/lpdf-nod.lua53
-rw-r--r--tex/context/base/lpdf-pdx.lua139
-rw-r--r--tex/context/base/lpdf-pdx.mkiv71
-rw-r--r--tex/context/base/lpdf-ren.lua207
-rw-r--r--tex/context/base/lpdf-swf.lua109
-rw-r--r--tex/context/base/lpdf-u3d.lua474
-rw-r--r--tex/context/base/lpdf-wid.lua355
-rw-r--r--tex/context/base/lpdf-xmp.lua165
-rw-r--r--tex/context/base/lpdf-xmp.xml43
-rw-r--r--tex/context/base/luat-bas.mkiv65
-rw-r--r--tex/context/base/luat-cbk.lua247
-rw-r--r--tex/context/base/luat-cnf.lua115
-rw-r--r--tex/context/base/luat-cod.mkiv161
-rw-r--r--tex/context/base/luat-dum.lua126
-rw-r--r--tex/context/base/luat-env.lua283
-rw-r--r--tex/context/base/luat-exe.lua71
-rw-r--r--tex/context/base/luat-fio.lua83
-rw-r--r--tex/context/base/luat-ini.lua162
-rw-r--r--tex/context/base/luat-ini.mkiv243
-rw-r--r--tex/context/base/luat-iop.lua148
-rw-r--r--tex/context/base/luat-lib.mkiv70
-rw-r--r--tex/context/base/luat-lua.lua43
-rw-r--r--tex/context/base/luat-run.lua74
-rw-r--r--tex/context/base/luat-soc.lua11
-rw-r--r--tex/context/base/luat-sta.lua196
-rw-r--r--tex/context/base/luat-sto.lua135
-rw-r--r--tex/context/base/lxml-aux.lua543
-rw-r--r--tex/context/base/lxml-ctx.lua131
-rw-r--r--tex/context/base/lxml-ctx.mkiv64
-rw-r--r--tex/context/base/lxml-dir.lua112
-rw-r--r--tex/context/base/lxml-ent.lua69
-rw-r--r--tex/context/base/lxml-inf.lua53
-rw-r--r--tex/context/base/lxml-ini.mkiv414
-rw-r--r--tex/context/base/lxml-lpt.lua1259
-rw-r--r--tex/context/base/lxml-mis.lua99
-rw-r--r--tex/context/base/lxml-sor.lua158
-rw-r--r--tex/context/base/lxml-sor.mkiv94
-rw-r--r--tex/context/base/lxml-tab.lua1174
-rw-r--r--tex/context/base/lxml-tex.lua1410
-rw-r--r--tex/context/base/lxml-xml.lua288
-rw-r--r--tex/context/base/m-arabtex.tex450
-rw-r--r--tex/context/base/m-barcodes.mkiv122
-rw-r--r--tex/context/base/m-chart.mkii48
-rw-r--r--tex/context/base/m-chart.mkiv20
-rw-r--r--tex/context/base/m-chart.tex1285
-rw-r--r--tex/context/base/m-chemic.mkii21
-rw-r--r--tex/context/base/m-chemic.mkiv20
-rw-r--r--tex/context/base/m-chemic.tex17
-rw-r--r--tex/context/base/m-cweb.tex1371
-rw-r--r--tex/context/base/m-database.tex421
-rw-r--r--tex/context/base/m-datastrc.tex228
-rw-r--r--tex/context/base/m-directives.tex5
-rw-r--r--tex/context/base/m-dratex.tex21
-rw-r--r--tex/context/base/m-edtsnc.tex207
-rw-r--r--tex/context/base/m-educat.tex217
-rw-r--r--tex/context/base/m-format.tex409
-rw-r--r--tex/context/base/m-graph.mkii72
-rw-r--r--tex/context/base/m-graph.mkiv63
-rw-r--r--tex/context/base/m-graph.tex175
-rw-r--r--tex/context/base/m-layout.tex102
-rw-r--r--tex/context/base/m-level.tex94
-rw-r--r--tex/context/base/m-mkii.mkiv21
-rw-r--r--tex/context/base/m-mkivhacks.tex52
-rw-r--r--tex/context/base/m-narrowtt.tex39
-rw-r--r--tex/context/base/m-newmat.tex337
-rw-r--r--tex/context/base/m-obsolete.tex5
-rw-r--r--tex/context/base/m-pdfsnc.tex200
-rw-r--r--tex/context/base/m-pictex.tex255
-rw-r--r--tex/context/base/m-plus.tex30
-rw-r--r--tex/context/base/m-pstricks.lua73
-rw-r--r--tex/context/base/m-pstricks.mkii127
-rw-r--r--tex/context/base/m-pstricks.mkiv66
-rw-r--r--tex/context/base/m-pstricks.tex16
-rw-r--r--tex/context/base/m-punk.mkiv243
-rw-r--r--tex/context/base/m-punk.tex3
-rw-r--r--tex/context/base/m-quest.tex232
-rw-r--r--tex/context/base/m-r.tex174
-rw-r--r--tex/context/base/m-steps.mkii83
-rw-r--r--tex/context/base/m-steps.mkiv20
-rw-r--r--tex/context/base/m-steps.tex835
-rw-r--r--tex/context/base/m-streams.tex446
-rw-r--r--tex/context/base/m-subsub.tex76
-rw-r--r--tex/context/base/m-tex4ht.tex9
-rw-r--r--tex/context/base/m-timing.tex102
-rw-r--r--tex/context/base/m-trackers.tex5
-rw-r--r--tex/context/base/m-translate.tex88
-rw-r--r--tex/context/base/m-tryout.tex55
-rw-r--r--tex/context/base/m-units.tex825
-rw-r--r--tex/context/base/m-visual.tex316
-rw-r--r--tex/context/base/math-ali.mkiv1296
-rw-r--r--tex/context/base/math-ams.mkii336
-rw-r--r--tex/context/base/math-arr.mkii391
-rw-r--r--tex/context/base/math-arr.mkiv439
-rw-r--r--tex/context/base/math-cow.mkii31
-rw-r--r--tex/context/base/math-def.mkiv374
-rw-r--r--tex/context/base/math-del.mkiv63
-rw-r--r--tex/context/base/math-dim.lua313
-rw-r--r--tex/context/base/math-dis.mkiv20
-rw-r--r--tex/context/base/math-ent.lua2102
-rw-r--r--tex/context/base/math-eul.mkii277
-rw-r--r--tex/context/base/math-ext.lua154
-rw-r--r--tex/context/base/math-for.mkiv79
-rw-r--r--tex/context/base/math-fou.mkii196
-rw-r--r--tex/context/base/math-frc.mkii66
-rw-r--r--tex/context/base/math-frc.mkiv209
-rw-r--r--tex/context/base/math-ini.lua340
-rw-r--r--tex/context/base/math-ini.mkii684
-rw-r--r--tex/context/base/math-ini.mkiv657
-rw-r--r--tex/context/base/math-inl.mkiv26
-rw-r--r--tex/context/base/math-int.mkiv90
-rw-r--r--tex/context/base/math-lan.mkiv67
-rw-r--r--tex/context/base/math-lbr.mkii481
-rw-r--r--tex/context/base/math-map.lua440
-rw-r--r--tex/context/base/math-noa.lua369
-rw-r--r--tex/context/base/math-pln.mkii360
-rw-r--r--tex/context/base/math-pln.mkiv298
-rw-r--r--tex/context/base/math-run.mkii105
-rw-r--r--tex/context/base/math-scr.mkiv135
-rw-r--r--tex/context/base/math-tex.mkii720
-rw-r--r--tex/context/base/math-tim.mkii371
-rw-r--r--tex/context/base/math-uni.mkii237
-rw-r--r--tex/context/base/math-vfu.lua1379
-rw-r--r--tex/context/base/meta-clp.tex164
-rw-r--r--tex/context/base/meta-dum.tex123
-rw-r--r--tex/context/base/meta-fig.mkii89
-rw-r--r--tex/context/base/meta-fig.mkiv84
-rw-r--r--tex/context/base/meta-fun.lua55
-rw-r--r--tex/context/base/meta-fun.mkiv20
-rw-r--r--tex/context/base/meta-ini.mkii1054
-rw-r--r--tex/context/base/meta-ini.mkiv1275
-rw-r--r--tex/context/base/meta-mis.tex54
-rw-r--r--tex/context/base/meta-nav.tex65
-rw-r--r--tex/context/base/meta-pag.mkii226
-rw-r--r--tex/context/base/meta-pag.mkiv223
-rw-r--r--tex/context/base/meta-pdf.lua553
-rw-r--r--tex/context/base/meta-pdf.mkii2761
-rw-r--r--tex/context/base/meta-pdf.mkiv474
-rw-r--r--tex/context/base/meta-pdh.lua602
-rw-r--r--tex/context/base/meta-pdh.mkiv780
-rw-r--r--tex/context/base/meta-pre.tex68
-rw-r--r--tex/context/base/meta-tex.mkii350
-rw-r--r--tex/context/base/meta-tex.mkiv72
-rw-r--r--tex/context/base/meta-txt.tex304
-rw-r--r--tex/context/base/meta-xml.tex29
-rw-r--r--tex/context/base/metatex.tex154
-rw-r--r--tex/context/base/mlib-ctx.lua84
-rw-r--r--tex/context/base/mlib-ctx.mkiv81
-rw-r--r--tex/context/base/mlib-pdf.lua530
-rw-r--r--tex/context/base/mlib-pdf.mkiv91
-rw-r--r--tex/context/base/mlib-pps.lua897
-rw-r--r--tex/context/base/mlib-pps.mkiv70
-rw-r--r--tex/context/base/mlib-run.lua379
-rw-r--r--tex/context/base/mtx-context-arrange.tex111
-rw-r--r--tex/context/base/mtx-context-combine.tex116
-rw-r--r--tex/context/base/mtx-context-common.tex43
-rw-r--r--tex/context/base/mtx-context-ideas.tex52
-rw-r--r--tex/context/base/mtx-context-listing.tex100
-rw-r--r--tex/context/base/mtx-context-timing.tex44
-rw-r--r--tex/context/base/mult-chk.lua66
-rw-r--r--tex/context/base/mult-chk.mkii29
-rw-r--r--tex/context/base/mult-chk.mkiv103
-rw-r--r--tex/context/base/mult-cld.lua212
-rw-r--r--tex/context/base/mult-cld.mkiv29
-rw-r--r--tex/context/base/mult-clm.lua184
-rw-r--r--tex/context/base/mult-com.tex31
-rw-r--r--tex/context/base/mult-con.tex53
-rw-r--r--tex/context/base/mult-de.tex1693
-rw-r--r--tex/context/base/mult-def.lua16149
-rw-r--r--tex/context/base/mult-def.tex35
-rw-r--r--tex/context/base/mult-en.tex1693
-rw-r--r--tex/context/base/mult-fr.tex1693
-rw-r--r--tex/context/base/mult-fst.tex53
-rw-r--r--tex/context/base/mult-ini.lua105
-rw-r--r--tex/context/base/mult-ini.mkii935
-rw-r--r--tex/context/base/mult-ini.mkiv865
-rw-r--r--tex/context/base/mult-it.tex1693
-rw-r--r--tex/context/base/mult-mcs.tex208
-rw-r--r--tex/context/base/mult-mde.tex208
-rw-r--r--tex/context/base/mult-men.tex208
-rw-r--r--tex/context/base/mult-mes.lua2046
-rw-r--r--tex/context/base/mult-mfr.tex208
-rw-r--r--tex/context/base/mult-mit.tex208
-rw-r--r--tex/context/base/mult-mnl.tex208
-rw-r--r--tex/context/base/mult-mno.tex208
-rw-r--r--tex/context/base/mult-mpe.tex208
-rw-r--r--tex/context/base/mult-mro.tex208
-rw-r--r--tex/context/base/mult-nl.tex1693
-rw-r--r--tex/context/base/mult-ro.tex1693
-rw-r--r--tex/context/base/mult-sys.tex882
-rw-r--r--tex/context/base/node-aux.lua145
-rw-r--r--tex/context/base/node-bck.lua119
-rw-r--r--tex/context/base/node-bck.mkiv163
-rw-r--r--tex/context/base/node-dir.lua308
-rw-r--r--tex/context/base/node-dum.lua19
-rw-r--r--tex/context/base/node-ext.lua30
-rw-r--r--tex/context/base/node-fin.lua442
-rw-r--r--tex/context/base/node-fin.mkiv74
-rw-r--r--tex/context/base/node-fnt.lua207
-rw-r--r--tex/context/base/node-ini.lua244
-rw-r--r--tex/context/base/node-ini.mkiv90
-rw-r--r--tex/context/base/node-inj.lua466
-rw-r--r--tex/context/base/node-mig.lua120
-rw-r--r--tex/context/base/node-mig.mkiv60
-rw-r--r--tex/context/base/node-pag.lua30
-rw-r--r--tex/context/base/node-pag.mkiv20
-rw-r--r--tex/context/base/node-par.lua101
-rw-r--r--tex/context/base/node-par.mkiv78
-rw-r--r--tex/context/base/node-pro.lua149
-rw-r--r--tex/context/base/node-ref.lua533
-rw-r--r--tex/context/base/node-res.lua302
-rw-r--r--tex/context/base/node-rul.lua288
-rw-r--r--tex/context/base/node-rul.mkiv343
-rw-r--r--tex/context/base/node-seq.lua186
-rw-r--r--tex/context/base/node-ser.lua276
-rw-r--r--tex/context/base/node-shp.lua58
-rw-r--r--tex/context/base/node-tex.lua39
-rw-r--r--tex/context/base/node-tra.lua474
-rw-r--r--tex/context/base/node-tsk.lua315
-rw-r--r--tex/context/base/node-tst.lua119
-rw-r--r--tex/context/base/node-typ.lua53
-rw-r--r--tex/context/base/norm-alo.tex36
-rw-r--r--tex/context/base/norm-ctx.tex16
-rw-r--r--tex/context/base/norm-etx.tex79
-rw-r--r--tex/context/base/norm-ltx.tex177
-rw-r--r--tex/context/base/norm-ptx.tex130
-rw-r--r--tex/context/base/norm-tex.tex351
-rw-r--r--tex/context/base/norm-xtx.tex18
-rw-r--r--tex/context/base/pack-bar.mkiv67
-rw-r--r--tex/context/base/pack-box.mkii954
-rw-r--r--tex/context/base/pack-box.mkiv944
-rw-r--r--tex/context/base/pack-lyr.mkii755
-rw-r--r--tex/context/base/pack-lyr.mkiv786
-rw-r--r--tex/context/base/pack-obj.lua54
-rw-r--r--tex/context/base/pack-obj.mkii371
-rw-r--r--tex/context/base/pack-obj.mkiv399
-rw-r--r--tex/context/base/pack-rul.lua53
-rw-r--r--tex/context/base/pack-rul.mkii3650
-rw-r--r--tex/context/base/pack-rul.mkiv3686
-rw-r--r--tex/context/base/page-app.mkii225
-rw-r--r--tex/context/base/page-app.mkiv225
-rw-r--r--tex/context/base/page-bck.mkii593
-rw-r--r--tex/context/base/page-bck.mkiv563
-rw-r--r--tex/context/base/page-flt.lua227
-rw-r--r--tex/context/base/page-flt.mkiv233
-rw-r--r--tex/context/base/page-flw.mkii107
-rw-r--r--tex/context/base/page-flw.mkiv107
-rw-r--r--tex/context/base/page-imp.mkii1314
-rw-r--r--tex/context/base/page-imp.mkiv1299
-rw-r--r--tex/context/base/page-ini.mkii1558
-rw-r--r--tex/context/base/page-ini.mkiv1512
-rw-r--r--tex/context/base/page-ins.mkii103
-rw-r--r--tex/context/base/page-ins.mkiv94
-rw-r--r--tex/context/base/page-lay.mkii1429
-rw-r--r--tex/context/base/page-lay.mkiv1425
-rw-r--r--tex/context/base/page-lin.lua215
-rw-r--r--tex/context/base/page-lin.mkii312
-rw-r--r--tex/context/base/page-lin.mkiv498
-rw-r--r--tex/context/base/page-log.mkii202
-rw-r--r--tex/context/base/page-mak.mkii234
-rw-r--r--tex/context/base/page-mak.mkiv233
-rw-r--r--tex/context/base/page-mar.mkii867
-rw-r--r--tex/context/base/page-mar.mkiv824
-rw-r--r--tex/context/base/page-mis.mkii268
-rw-r--r--tex/context/base/page-mis.mkiv239
-rw-r--r--tex/context/base/page-mul.mkii1773
-rw-r--r--tex/context/base/page-mul.mkiv1751
-rw-r--r--tex/context/base/page-not.mkii72
-rw-r--r--tex/context/base/page-not.mkiv69
-rw-r--r--tex/context/base/page-one.mkii659
-rw-r--r--tex/context/base/page-one.mkiv532
-rw-r--r--tex/context/base/page-par.mkii58
-rw-r--r--tex/context/base/page-par.mkiv58
-rw-r--r--tex/context/base/page-plg.mkii202
-rw-r--r--tex/context/base/page-plg.mkiv198
-rw-r--r--tex/context/base/page-run.mkii382
-rw-r--r--tex/context/base/page-run.mkiv382
-rw-r--r--tex/context/base/page-set.mkii2766
-rw-r--r--tex/context/base/page-set.mkiv2674
-rw-r--r--tex/context/base/page-sid.mkii931
-rw-r--r--tex/context/base/page-sid.mkiv795
-rw-r--r--tex/context/base/page-spr.mkii104
-rw-r--r--tex/context/base/page-spr.mkiv103
-rw-r--r--tex/context/base/page-str.lua221
-rw-r--r--tex/context/base/page-str.mkii376
-rw-r--r--tex/context/base/page-str.mkiv144
-rw-r--r--tex/context/base/page-txt.mkii784
-rw-r--r--tex/context/base/page-txt.mkiv850
-rw-r--r--tex/context/base/pdfr-def.mkii843
-rw-r--r--tex/context/base/pdfr-ec.mkii145
-rw-r--r--tex/context/base/pdfr-il2.mkii233
-rw-r--r--tex/context/base/ppchtex.mkii3554
-rw-r--r--tex/context/base/ppchtex.mkiv3460
-rw-r--r--tex/context/base/pret-lua.lua319
-rw-r--r--tex/context/base/pret-mp.lua236
-rw-r--r--tex/context/base/pret-tex.lua87
-rw-r--r--tex/context/base/pret-xml.lua136
-rw-r--r--tex/context/base/prop-ini.mkii150
-rw-r--r--tex/context/base/prop-ini.mkiv150
-rw-r--r--tex/context/base/prop-lay.mkii143
-rw-r--r--tex/context/base/prop-lay.mkiv140
-rw-r--r--tex/context/base/prop-mis.mkii189
-rw-r--r--tex/context/base/prop-mis.mkiv74
-rw-r--r--tex/context/base/regi-8859-1.lua26
-rw-r--r--tex/context/base/regi-8859-1.mkii154
-rw-r--r--tex/context/base/regi-8859-10.lua26
-rw-r--r--tex/context/base/regi-8859-10.mkii152
-rw-r--r--tex/context/base/regi-8859-11.lua26
-rw-r--r--tex/context/base/regi-8859-13.lua26
-rw-r--r--tex/context/base/regi-8859-13.mkii152
-rw-r--r--tex/context/base/regi-8859-14.lua26
-rw-r--r--tex/context/base/regi-8859-15.lua26
-rw-r--r--tex/context/base/regi-8859-15.mkii154
-rw-r--r--tex/context/base/regi-8859-16.lua26
-rw-r--r--tex/context/base/regi-8859-16.mkii151
-rw-r--r--tex/context/base/regi-8859-2.lua26
-rw-r--r--tex/context/base/regi-8859-2.mkii152
-rw-r--r--tex/context/base/regi-8859-3.lua26
-rw-r--r--tex/context/base/regi-8859-3.mkii145
-rw-r--r--tex/context/base/regi-8859-4.lua26
-rw-r--r--tex/context/base/regi-8859-4.mkii152
-rw-r--r--tex/context/base/regi-8859-5.lua26
-rw-r--r--tex/context/base/regi-8859-5.mkii152
-rw-r--r--tex/context/base/regi-8859-6.lua26
-rw-r--r--tex/context/base/regi-8859-7.lua26
-rw-r--r--tex/context/base/regi-8859-7.mkii153
-rw-r--r--tex/context/base/regi-8859-8.lua26
-rw-r--r--tex/context/base/regi-8859-9.lua26
-rw-r--r--tex/context/base/regi-8859-9.mkii152
-rw-r--r--tex/context/base/regi-cp1250.lua26
-rw-r--r--tex/context/base/regi-cp1250.mkii153
-rw-r--r--tex/context/base/regi-cp1251.lua26
-rw-r--r--tex/context/base/regi-cp1251.mkii152
-rw-r--r--tex/context/base/regi-cp1252.lua26
-rw-r--r--tex/context/base/regi-cp1252.mkii156
-rw-r--r--tex/context/base/regi-cp1253.lua26
-rw-r--r--tex/context/base/regi-cp1253.mkii153
-rw-r--r--tex/context/base/regi-cp1254.lua26
-rw-r--r--tex/context/base/regi-cp1254.mkii153
-rw-r--r--tex/context/base/regi-cp1255.lua26
-rw-r--r--tex/context/base/regi-cp1256.lua26
-rw-r--r--tex/context/base/regi-cp1257.lua26
-rw-r--r--tex/context/base/regi-cp1257.mkii153
-rw-r--r--tex/context/base/regi-cp1258.lua26
-rw-r--r--tex/context/base/regi-cyp.mkii1169
-rw-r--r--tex/context/base/regi-cyr.mkii722
-rw-r--r--tex/context/base/regi-def.mkii21
-rw-r--r--tex/context/base/regi-ibm.mkii73
-rw-r--r--tex/context/base/regi-ini.lua88
-rw-r--r--tex/context/base/regi-ini.mkii248
-rw-r--r--tex/context/base/regi-ini.mkiv55
-rw-r--r--tex/context/base/regi-mac.mkii147
-rw-r--r--tex/context/base/regi-syn.tex73
-rw-r--r--tex/context/base/regi-uni.mkii24
-rw-r--r--tex/context/base/regi-utf.mkii52
-rw-r--r--tex/context/base/regi-vis.mkii158
-rw-r--r--tex/context/base/rlxcache.rlx71
-rw-r--r--tex/context/base/rlxtools.rlx136
-rw-r--r--tex/context/base/s-abr-01.tex324
-rw-r--r--tex/context/base/s-abr-02.tex22
-rw-r--r--tex/context/base/s-abr-03.tex22
-rw-r--r--tex/context/base/s-cdr-01.tex131
-rw-r--r--tex/context/base/s-chi-00.tex76
-rw-r--r--tex/context/base/s-faq-00.tex93
-rw-r--r--tex/context/base/s-faq-01.tex215
-rw-r--r--tex/context/base/s-faq-02.tex63
-rw-r--r--tex/context/base/s-faq-03.tex70
-rw-r--r--tex/context/base/s-fnt-01.tex61
-rw-r--r--tex/context/base/s-fnt-02.tex133
-rw-r--r--tex/context/base/s-fnt-10.tex163
-rw-r--r--tex/context/base/s-fnt-11.tex61
-rw-r--r--tex/context/base/s-fnt-20.tex140
-rw-r--r--tex/context/base/s-fnt-21.tex46
-rw-r--r--tex/context/base/s-fnt-23.tex272
-rw-r--r--tex/context/base/s-fnt-24.tex83
-rw-r--r--tex/context/base/s-fnt-25.tex194
-rw-r--r--tex/context/base/s-fnt-26.tex73
-rw-r--r--tex/context/base/s-fnt-30.tex42
-rw-r--r--tex/context/base/s-grk-00.tex77
-rw-r--r--tex/context/base/s-inf-01.tex203
-rw-r--r--tex/context/base/s-inf-02.tex27
-rw-r--r--tex/context/base/s-jap-00.tex23
-rw-r--r--tex/context/base/s-mag-01.tex406
-rw-r--r--tex/context/base/s-map-10.tex488
-rw-r--r--tex/context/base/s-mod-00.tex512
-rw-r--r--tex/context/base/s-mod-01.tex157
-rw-r--r--tex/context/base/s-mod-02.tex420
-rw-r--r--tex/context/base/s-mod.ctx24
-rw-r--r--tex/context/base/s-pre-00.tex202
-rw-r--r--tex/context/base/s-pre-01.tex404
-rw-r--r--tex/context/base/s-pre-02.tex381
-rw-r--r--tex/context/base/s-pre-03.tex257
-rw-r--r--tex/context/base/s-pre-04.tex377
-rw-r--r--tex/context/base/s-pre-05.tex240
-rw-r--r--tex/context/base/s-pre-06.tex325
-rw-r--r--tex/context/base/s-pre-07.tex212
-rw-r--r--tex/context/base/s-pre-08.tex271
-rw-r--r--tex/context/base/s-pre-09.tex380
-rw-r--r--tex/context/base/s-pre-10.tex308
-rw-r--r--tex/context/base/s-pre-11.tex220
-rw-r--r--tex/context/base/s-pre-12.tex226
-rw-r--r--tex/context/base/s-pre-13.tex302
-rw-r--r--tex/context/base/s-pre-14.tex264
-rw-r--r--tex/context/base/s-pre-15.tex186
-rw-r--r--tex/context/base/s-pre-16.tex203
-rw-r--r--tex/context/base/s-pre-17.tex399
-rw-r--r--tex/context/base/s-pre-18.tex177
-rw-r--r--tex/context/base/s-pre-19.tex347
-rw-r--r--tex/context/base/s-pre-22.tex319
-rw-r--r--tex/context/base/s-pre-23.tex109
-rw-r--r--tex/context/base/s-pre-26.tex255
-rw-r--r--tex/context/base/s-pre-27.tex181
-rw-r--r--tex/context/base/s-pre-30.tex258
-rw-r--r--tex/context/base/s-pre-50.tex101
-rw-r--r--tex/context/base/s-pre-60.tex159
-rw-r--r--tex/context/base/s-pre-61.tex273
-rw-r--r--tex/context/base/s-pre-62.tex228
-rw-r--r--tex/context/base/s-pre-63.tex73
-rw-r--r--tex/context/base/s-pre-64.tex203
-rw-r--r--tex/context/base/s-pre-66.tex133
-rw-r--r--tex/context/base/s-pre-67.tex144
-rw-r--r--tex/context/base/s-pre-70.tex170
-rw-r--r--tex/context/base/s-pre-71.tex210
-rw-r--r--tex/context/base/s-pre-93.tex210
-rw-r--r--tex/context/base/s-ptj-01.tex425
-rw-r--r--tex/context/base/s-reg-01.tex50
-rw-r--r--tex/context/base/s-syn-01.tex54
-rw-r--r--tex/context/base/s-sys-01.tex61
-rw-r--r--tex/context/base/scrn-bar.mkiv398
-rw-r--r--tex/context/base/scrn-but.mkiv127
-rw-r--r--tex/context/base/scrn-fld.mkii1247
-rw-r--r--tex/context/base/scrn-fld.mkiv686
-rw-r--r--tex/context/base/scrn-hlp.mkii171
-rw-r--r--tex/context/base/scrn-hlp.mkiv179
-rw-r--r--tex/context/base/scrn-int.lua111
-rw-r--r--tex/context/base/scrn-int.mkii2311
-rw-r--r--tex/context/base/scrn-int.mkiv610
-rw-r--r--tex/context/base/scrn-men.mkiv615
-rw-r--r--tex/context/base/scrn-nav.mkii379
-rw-r--r--tex/context/base/scrn-nav.mkiv256
-rw-r--r--tex/context/base/scrp-cjk.lua577
-rw-r--r--tex/context/base/scrp-ini.lua388
-rw-r--r--tex/context/base/scrp-ini.mkiv91
-rw-r--r--tex/context/base/sort-def.mkii450
-rw-r--r--tex/context/base/sort-ini.lua317
-rw-r--r--tex/context/base/sort-ini.mkii161
-rw-r--r--tex/context/base/sort-ini.mkiv19
-rw-r--r--tex/context/base/sort-lan.lua319
-rw-r--r--tex/context/base/sort-lan.mkii217
-rw-r--r--tex/context/base/spac-ali.mkiv677
-rw-r--r--tex/context/base/spac-def.mkiv118
-rw-r--r--tex/context/base/spac-fnt.mkiv94
-rw-r--r--tex/context/base/spac-gen.mkii4652
-rw-r--r--tex/context/base/spac-grd.mkii1074
-rw-r--r--tex/context/base/spac-grd.mkiv259
-rw-r--r--tex/context/base/spac-hor.lua32
-rw-r--r--tex/context/base/spac-hor.mkiv946
-rw-r--r--tex/context/base/spac-pag.mkiv199
-rw-r--r--tex/context/base/spac-par.mkiv192
-rw-r--r--tex/context/base/spac-ver.lua1185
-rw-r--r--tex/context/base/spac-ver.mkiv2078
-rw-r--r--tex/context/base/spec-def.mkii1016
-rw-r--r--tex/context/base/spec-dpm.mkii446
-rw-r--r--tex/context/base/spec-dpx.mkii794
-rw-r--r--tex/context/base/spec-dvi.mkii118
-rw-r--r--tex/context/base/spec-fdf.mkii3531
-rw-r--r--tex/context/base/spec-ini.mkii559
-rw-r--r--tex/context/base/spec-mis.mkii286
-rw-r--r--tex/context/base/spec-pdf.mkii484
-rw-r--r--tex/context/base/spec-ps.mkii229
-rw-r--r--tex/context/base/spec-tpd.mkii1334
-rw-r--r--tex/context/base/spec-tr.mkii107
-rw-r--r--tex/context/base/spec-tst.mkii52
-rw-r--r--tex/context/base/spec-var.mkii83
-rw-r--r--tex/context/base/spec-win.mkii99
-rw-r--r--tex/context/base/spec-xet.mkii66
-rw-r--r--tex/context/base/spec-xtx.mkii87
-rw-r--r--tex/context/base/spec-yy.mkii90
-rw-r--r--tex/context/base/strc-bkm.lua131
-rw-r--r--tex/context/base/strc-bkm.mkiv93
-rw-r--r--tex/context/base/strc-blk.lua146
-rw-r--r--tex/context/base/strc-blk.mkii548
-rw-r--r--tex/context/base/strc-blk.mkiv112
-rw-r--r--tex/context/base/strc-def.mkiv309
-rw-r--r--tex/context/base/strc-des.lua9
-rw-r--r--tex/context/base/strc-des.mkii921
-rw-r--r--tex/context/base/strc-des.mkiv1097
-rw-r--r--tex/context/base/strc-doc.lua702
-rw-r--r--tex/context/base/strc-doc.mkiv216
-rw-r--r--tex/context/base/strc-flt.lua9
-rw-r--r--tex/context/base/strc-flt.mkii2143
-rw-r--r--tex/context/base/strc-flt.mkiv1964
-rw-r--r--tex/context/base/strc-ini.lua302
-rw-r--r--tex/context/base/strc-ini.mkiv88
-rw-r--r--tex/context/base/strc-itm.lua24
-rw-r--r--tex/context/base/strc-itm.mkii1335
-rw-r--r--tex/context/base/strc-itm.mkiv1365
-rw-r--r--tex/context/base/strc-lnt.mkii197
-rw-r--r--tex/context/base/strc-lnt.mkiv173
-rw-r--r--tex/context/base/strc-lst.lua486
-rw-r--r--tex/context/base/strc-lst.mkii1150
-rw-r--r--tex/context/base/strc-lst.mkiv963
-rw-r--r--tex/context/base/strc-mar.lua18
-rw-r--r--tex/context/base/strc-mar.mkii318
-rw-r--r--tex/context/base/strc-mar.mkiv495
-rw-r--r--tex/context/base/strc-mat.lua51
-rw-r--r--tex/context/base/strc-mat.mkii2925
-rw-r--r--tex/context/base/strc-mat.mkiv771
-rw-r--r--tex/context/base/strc-not.lua338
-rw-r--r--tex/context/base/strc-not.mkii1472
-rw-r--r--tex/context/base/strc-not.mkiv1280
-rw-r--r--tex/context/base/strc-num.lua521
-rw-r--r--tex/context/base/strc-num.mkii151
-rw-r--r--tex/context/base/strc-num.mkiv511
-rw-r--r--tex/context/base/strc-pag.lua241
-rw-r--r--tex/context/base/strc-pag.mkii534
-rw-r--r--tex/context/base/strc-pag.mkiv496
-rw-r--r--tex/context/base/strc-prc.lua9
-rw-r--r--tex/context/base/strc-prc.mkiv84
-rw-r--r--tex/context/base/strc-ref.lua1243
-rw-r--r--tex/context/base/strc-ref.mkii3041
-rw-r--r--tex/context/base/strc-ref.mkiv1851
-rw-r--r--tex/context/base/strc-reg.lua735
-rw-r--r--tex/context/base/strc-reg.mkii1243
-rw-r--r--tex/context/base/strc-reg.mkiv1137
-rw-r--r--tex/context/base/strc-ren.mkiv492
-rw-r--r--tex/context/base/strc-sbe.mkiv141
-rw-r--r--tex/context/base/strc-sec.mkii2591
-rw-r--r--tex/context/base/strc-sec.mkiv792
-rw-r--r--tex/context/base/strc-swd.mkii127
-rw-r--r--tex/context/base/strc-syn.lua189
-rw-r--r--tex/context/base/strc-syn.mkii438
-rw-r--r--tex/context/base/strc-syn.mkiv431
-rw-r--r--tex/context/base/strc-xml.mkiv144
-rw-r--r--tex/context/base/supp-ali.tex173
-rw-r--r--tex/context/base/supp-box.tex3126
-rw-r--r--tex/context/base/supp-dir.mkii41
-rw-r--r--tex/context/base/supp-dir.mkiv41
-rw-r--r--tex/context/base/supp-emp.mkii398
-rw-r--r--tex/context/base/supp-eps.mkii202
-rw-r--r--tex/context/base/supp-fil.lua279
-rw-r--r--tex/context/base/supp-fil.mkii710
-rw-r--r--tex/context/base/supp-fil.mkiv464
-rw-r--r--tex/context/base/supp-fun.tex746
-rw-r--r--tex/context/base/supp-mat.mkii293
-rw-r--r--tex/context/base/supp-mat.mkiv293
-rw-r--r--tex/context/base/supp-mis.mkii733
-rw-r--r--tex/context/base/supp-mis.tex4
-rw-r--r--tex/context/base/supp-mpe.mkii1370
-rw-r--r--tex/context/base/supp-mpe.tex4
-rw-r--r--tex/context/base/supp-mps.mkii2134
-rw-r--r--tex/context/base/supp-mrk.mkii591
-rw-r--r--tex/context/base/supp-num.tex443
-rw-r--r--tex/context/base/supp-pat.mkii179
-rw-r--r--tex/context/base/supp-pdf.mkii2187
-rw-r--r--tex/context/base/supp-pdf.tex1
-rw-r--r--tex/context/base/supp-ran.lua67
-rw-r--r--tex/context/base/supp-ran.mkii122
-rw-r--r--tex/context/base/supp-ran.mkiv30
-rw-r--r--tex/context/base/supp-spe.mkii164
-rw-r--r--tex/context/base/supp-tpi.mkii353
-rw-r--r--tex/context/base/supp-vis.tex1907
-rw-r--r--tex/context/base/symb-cow.tex132
-rw-r--r--tex/context/base/symb-eur.tex64
-rw-r--r--tex/context/base/symb-glm.tex79
-rw-r--r--tex/context/base/symb-ini.mkii281
-rw-r--r--tex/context/base/symb-ini.mkiv281
-rw-r--r--tex/context/base/symb-jmn.tex204
-rw-r--r--tex/context/base/symb-mis.tex139
-rw-r--r--tex/context/base/symb-mvs.tex217
-rw-r--r--tex/context/base/symb-nav.tex126
-rw-r--r--tex/context/base/symb-run.mkii54
-rw-r--r--tex/context/base/symb-run.mkiv54
-rw-r--r--tex/context/base/symb-uni.tex1123
-rw-r--r--tex/context/base/symb-was.tex205
-rw-r--r--tex/context/base/syst-aux.mkiv7018
-rw-r--r--tex/context/base/syst-con.lua25
-rw-r--r--tex/context/base/syst-con.mkii243
-rw-r--r--tex/context/base/syst-con.mkiv145
-rw-r--r--tex/context/base/syst-ext.mkii5025
-rw-r--r--tex/context/base/syst-fnt.mkii46
-rw-r--r--tex/context/base/syst-fnt.mkiv46
-rw-r--r--tex/context/base/syst-gen.mkii4454
-rw-r--r--tex/context/base/syst-ini.tex888
-rw-r--r--tex/context/base/syst-ltx.tex56
-rw-r--r--tex/context/base/syst-lua.lua109
-rw-r--r--tex/context/base/syst-lua.mkiv37
-rw-r--r--tex/context/base/syst-new.mkii868
-rw-r--r--tex/context/base/syst-pln.tex118
-rw-r--r--tex/context/base/syst-rtp.mkii18
-rw-r--r--tex/context/base/syst-rtp.mkiv18
-rw-r--r--tex/context/base/syst-str.mkii124
-rw-r--r--tex/context/base/syst-str.mkiv36
-rw-r--r--tex/context/base/syst-tex.mkii314
-rw-r--r--tex/context/base/tabl-com.mkii21
-rw-r--r--tex/context/base/tabl-com.mkiv21
-rw-r--r--tex/context/base/tabl-ltb.mkii866
-rw-r--r--tex/context/base/tabl-ltb.mkiv866
-rw-r--r--tex/context/base/tabl-ntb.mkii1586
-rw-r--r--tex/context/base/tabl-ntb.mkiv1622
-rw-r--r--tex/context/base/tabl-nte.mkii107
-rw-r--r--tex/context/base/tabl-nte.mkiv107
-rw-r--r--tex/context/base/tabl-pln.mkii91
-rw-r--r--tex/context/base/tabl-pln.mkiv91
-rw-r--r--tex/context/base/tabl-tab.mkii2515
-rw-r--r--tex/context/base/tabl-tab.mkiv2516
-rw-r--r--tex/context/base/tabl-tbl.mkii1440
-rw-r--r--tex/context/base/tabl-tbl.mkiv1516
-rw-r--r--tex/context/base/tabl-tsp.mkii427
-rw-r--r--tex/context/base/tabl-tsp.mkiv429
-rw-r--r--tex/context/base/task-ini.lua94
-rw-r--r--tex/context/base/task-ini.mkiv22
-rw-r--r--tex/context/base/thrd-pic.tex3694
-rw-r--r--tex/context/base/thrd-ran.mkii168
-rw-r--r--tex/context/base/thrd-tab.tex2006
-rw-r--r--tex/context/base/thrd-trg.mkii127
-rw-r--r--tex/context/base/toks-ini.lua326
-rw-r--r--tex/context/base/toks-ini.mkiv78
-rw-r--r--tex/context/base/trac-deb.lua187
-rw-r--r--tex/context/base/trac-deb.mkiv51
-rw-r--r--tex/context/base/trac-inf.lua197
-rw-r--r--tex/context/base/trac-lmx.lua223
-rw-r--r--tex/context/base/trac-lmx.mkiv16
-rw-r--r--tex/context/base/trac-log.lua320
-rw-r--r--tex/context/base/trac-tex.mkiv55
-rw-r--r--tex/context/base/trac-tim.lua160
-rw-r--r--tex/context/base/trac-tra.lua341
-rw-r--r--tex/context/base/trac-vis.mkii748
-rw-r--r--tex/context/base/trac-vis.mkiv709
-rw-r--r--tex/context/base/type-buy.mkii571
-rw-r--r--tex/context/base/type-buy.mkiv82
-rw-r--r--tex/context/base/type-cbg.mkii352
-rw-r--r--tex/context/base/type-cow.mkii85
-rw-r--r--tex/context/base/type-cow.mkiv85
-rw-r--r--tex/context/base/type-def.mkii86
-rw-r--r--tex/context/base/type-def.mkiv48
-rw-r--r--tex/context/base/type-exp.mkii95
-rw-r--r--tex/context/base/type-fsf.mkii94
-rw-r--r--tex/context/base/type-ghz.mkii409
-rw-r--r--tex/context/base/type-ghz.mkiv322
-rw-r--r--tex/context/base/type-hgz.mkii1
-rw-r--r--tex/context/base/type-hgz.mkiv1
-rw-r--r--tex/context/base/type-husayni-default.mkiv146
-rw-r--r--tex/context/base/type-ini.mkii725
-rw-r--r--tex/context/base/type-ini.mkiv578
-rw-r--r--tex/context/base/type-lua.mkiv88
-rw-r--r--tex/context/base/type-mac.mkii593
-rw-r--r--tex/context/base/type-mac.mkiv593
-rw-r--r--tex/context/base/type-msw.mkii1
-rw-r--r--tex/context/base/type-msw.mkiv1
-rw-r--r--tex/context/base/type-one.mkii2748
-rw-r--r--tex/context/base/type-one.mkiv113
-rw-r--r--tex/context/base/type-otf.mkii2033
-rw-r--r--tex/context/base/type-otf.mkiv1796
-rw-r--r--tex/context/base/type-pre.mkii253
-rw-r--r--tex/context/base/type-run.mkii51
-rw-r--r--tex/context/base/type-run.mkiv51
-rw-r--r--tex/context/base/type-set.mkii81
-rw-r--r--tex/context/base/type-set.mkiv77
-rw-r--r--tex/context/base/type-siz.mkii748
-rw-r--r--tex/context/base/type-siz.mkiv398
-rw-r--r--tex/context/base/type-tmf.mkii14
-rw-r--r--tex/context/base/type-tmf.mkiv14
-rw-r--r--tex/context/base/type-win.mkii69
-rw-r--r--tex/context/base/type-win.mkiv118
-rw-r--r--tex/context/base/type-xtx.mkii563
-rw-r--r--tex/context/base/typo-brk.lua208
-rw-r--r--tex/context/base/typo-brk.mkiv93
-rw-r--r--tex/context/base/typo-cap.lua210
-rw-r--r--tex/context/base/typo-cap.mkiv212
-rw-r--r--tex/context/base/typo-dig.lua106
-rw-r--r--tex/context/base/typo-dig.mkiv51
-rw-r--r--tex/context/base/typo-ini.mkii40
-rw-r--r--tex/context/base/typo-ini.mkiv40
-rw-r--r--tex/context/base/typo-krn.lua223
-rw-r--r--tex/context/base/typo-krn.mkiv79
-rw-r--r--tex/context/base/typo-mir.lua419
-rw-r--r--tex/context/base/typo-mir.mkiv144
-rw-r--r--tex/context/base/typo-rep.lua135
-rw-r--r--tex/context/base/typo-rep.mkiv53
-rw-r--r--tex/context/base/typo-spa.lua167
-rw-r--r--tex/context/base/typo-spa.mkiv69
-rw-r--r--tex/context/base/unic-000.mkii135
-rw-r--r--tex/context/base/unic-001.mkii220
-rw-r--r--tex/context/base/unic-002.mkii104
-rw-r--r--tex/context/base/unic-003.mkii147
-rw-r--r--tex/context/base/unic-004.mkii291
-rw-r--r--tex/context/base/unic-005.mkii50
-rw-r--r--tex/context/base/unic-030.mkii113
-rw-r--r--tex/context/base/unic-031.mkii273
-rw-r--r--tex/context/base/unic-032.mkii278
-rw-r--r--tex/context/base/unic-033.mkii275
-rw-r--r--tex/context/base/unic-034.mkii274
-rw-r--r--tex/context/base/unic-035.mkii32
-rw-r--r--tex/context/base/unic-037.mkii278
-rw-r--r--tex/context/base/unic-039.mkii68
-rw-r--r--tex/context/base/unic-251.mkii34
-rw-r--r--tex/context/base/unic-cjk.mkii22
-rw-r--r--tex/context/base/unic-exp.mkii82
-rw-r--r--tex/context/base/unic-ini.mkii777
-rw-r--r--tex/context/base/unic-ini.mkiv29
-rw-r--r--tex/context/base/unic-run.mkii130
-rw-r--r--tex/context/base/verb-c.mkii484
-rw-r--r--tex/context/base/verb-eif.mkii211
-rw-r--r--tex/context/base/verb-ini.mkii1789
-rw-r--r--tex/context/base/verb-js.mkii171
-rw-r--r--tex/context/base/verb-jv.mkii222
-rw-r--r--tex/context/base/verb-mp.mkii364
-rw-r--r--tex/context/base/verb-pas.mkii266
-rw-r--r--tex/context/base/verb-pl.mkii547
-rw-r--r--tex/context/base/verb-raw.mkii7
-rw-r--r--tex/context/base/verb-sql.mkii230
-rw-r--r--tex/context/base/verb-tex.mkii294
-rw-r--r--tex/context/base/verb-xml.mkii441
-rw-r--r--tex/context/base/x-asciimath.lua267
-rw-r--r--tex/context/base/x-asciimath.mkiv96
-rw-r--r--tex/context/base/x-calcmath.lua363
-rw-r--r--tex/context/base/x-calcmath.mkii24
-rw-r--r--tex/context/base/x-calcmath.mkiv87
-rw-r--r--tex/context/base/x-cals.lua209
-rw-r--r--tex/context/base/x-cals.mkiv36
-rw-r--r--tex/context/base/x-chemml.mkii212
-rw-r--r--tex/context/base/x-chemml.mkiv262
-rw-r--r--tex/context/base/x-chemml.tex16
-rw-r--r--tex/context/base/x-chemml.xsd93
-rw-r--r--tex/context/base/x-contml.mkii491
-rw-r--r--tex/context/base/x-contml.xsd375
-rw-r--r--tex/context/base/x-corres.mkii136
-rw-r--r--tex/context/base/x-corres.rng170
-rw-r--r--tex/context/base/x-ct.lua182
-rw-r--r--tex/context/base/x-ct.mkiv29
-rw-r--r--tex/context/base/x-dir-01.tex145
-rw-r--r--tex/context/base/x-dir-05.mkii51
-rw-r--r--tex/context/base/x-dir-05.mkiv72
-rw-r--r--tex/context/base/x-fdf-00.tex41
-rw-r--r--tex/context/base/x-fe.mkii143
-rw-r--r--tex/context/base/x-fig-00.dtd24
-rw-r--r--tex/context/base/x-fig-00.tex252
-rw-r--r--tex/context/base/x-fig-00.xsd77
-rw-r--r--tex/context/base/x-fig-01.tex461
-rw-r--r--tex/context/base/x-fig-02.tex78
-rw-r--r--tex/context/base/x-fig-03.tex44
-rw-r--r--tex/context/base/x-fo.mkii4059
-rw-r--r--tex/context/base/x-foxet.mkii28
-rw-r--r--tex/context/base/x-foxet.mkiv29
-rw-r--r--tex/context/base/x-ldx.ctx23
-rw-r--r--tex/context/base/x-ldx.tex191
-rw-r--r--tex/context/base/x-mathml.lua784
-rw-r--r--tex/context/base/x-mathml.mkii28
-rw-r--r--tex/context/base/x-mathml.mkiv2369
-rw-r--r--tex/context/base/x-mathml.tex16
-rw-r--r--tex/context/base/x-mathml.xsd11
-rw-r--r--tex/context/base/x-newcml.tex456
-rw-r--r--tex/context/base/x-newmme.tex423
-rw-r--r--tex/context/base/x-newmml.mkii2744
-rw-r--r--tex/context/base/x-newmml.mkiv16
-rw-r--r--tex/context/base/x-newmml.tex16
-rw-r--r--tex/context/base/x-newmmo.tex210
-rw-r--r--tex/context/base/x-newpml.tex250
-rw-r--r--tex/context/base/x-om2cml.xsl1342
-rw-r--r--tex/context/base/x-openmath.tex4
-rw-r--r--tex/context/base/x-openmath.xsl35
-rw-r--r--tex/context/base/x-pending.mkiv39
-rw-r--r--tex/context/base/x-physml.mkii16
-rw-r--r--tex/context/base/x-physml.mkiv16
-rw-r--r--tex/context/base/x-physml.tex16
-rw-r--r--tex/context/base/x-physml.xsd172
-rw-r--r--tex/context/base/x-res-00.tex67
-rw-r--r--tex/context/base/x-res-01.tex487
-rw-r--r--tex/context/base/x-res-02.tex72
-rw-r--r--tex/context/base/x-res-03.tex44
-rw-r--r--tex/context/base/x-res-04.tex336
-rw-r--r--tex/context/base/x-res-08.tex131
-rw-r--r--tex/context/base/x-res-09.tex69
-rw-r--r--tex/context/base/x-res-10.tex75
-rw-r--r--tex/context/base/x-res-11.tex110
-rw-r--r--tex/context/base/x-res-12.tex53
-rw-r--r--tex/context/base/x-res-20.tex231
-rw-r--r--tex/context/base/x-res-50.tex425
-rw-r--r--tex/context/base/x-sch-00.tex382
-rw-r--r--tex/context/base/x-sch-01.tex122
-rw-r--r--tex/context/base/x-set-01.tex79
-rw-r--r--tex/context/base/x-set-02.tex30
-rw-r--r--tex/context/base/x-set-11.mkii573
-rw-r--r--tex/context/base/x-set-11.mkiv476
-rw-r--r--tex/context/base/x-set-11.tex110
-rw-r--r--tex/context/base/x-set-12.tex258
-rw-r--r--tex/context/base/x-set-99.tex283
-rw-r--r--tex/context/base/x-sm2om.xsl233
-rw-r--r--tex/context/base/x-xml-01.tex91
-rw-r--r--tex/context/base/x-xml-02.tex91
-rw-r--r--tex/context/base/x-xml-11.tex134
-rw-r--r--tex/context/base/x-xtag.mkiv23
-rw-r--r--tex/context/base/xetx-chr.mkii1167
-rw-r--r--tex/context/base/xetx-cls.mkii378
-rw-r--r--tex/context/base/xetx-ini.mkii132
-rw-r--r--tex/context/base/xetx-utf.mkii1989
-rw-r--r--tex/context/base/xtag-cml.tex228
-rw-r--r--tex/context/base/xtag-ent.tex117
-rw-r--r--tex/context/base/xtag-exp.tex88
-rw-r--r--tex/context/base/xtag-ext.tex439
-rw-r--r--tex/context/base/xtag-hyp.tex69
-rw-r--r--tex/context/base/xtag-ini.tex2999
-rw-r--r--tex/context/base/xtag-map.tex746
-rw-r--r--tex/context/base/xtag-mea.tex152
-rw-r--r--tex/context/base/xtag-meb.tex124
-rw-r--r--tex/context/base/xtag-mec.tex28
-rw-r--r--tex/context/base/xtag-meh.tex166
-rw-r--r--tex/context/base/xtag-men.tex98
-rw-r--r--tex/context/base/xtag-meo.tex58
-rw-r--r--tex/context/base/xtag-mer.tex185
-rw-r--r--tex/context/base/xtag-mmc.tex1265
-rw-r--r--tex/context/base/xtag-mml.tex515
-rw-r--r--tex/context/base/xtag-mmp.tex553
-rw-r--r--tex/context/base/xtag-mxa.tex101
-rw-r--r--tex/context/base/xtag-mxb.tex55
-rw-r--r--tex/context/base/xtag-mxc.tex10
-rw-r--r--tex/context/base/xtag-mxh.tex67
-rw-r--r--tex/context/base/xtag-mxn.tex84
-rw-r--r--tex/context/base/xtag-mxo.tex14
-rw-r--r--tex/context/base/xtag-mxr.tex112
-rw-r--r--tex/context/base/xtag-pml.tex85
-rw-r--r--tex/context/base/xtag-pmu.tex188
-rw-r--r--tex/context/base/xtag-pre.tex435
-rw-r--r--tex/context/base/xtag-prs.tex42
-rw-r--r--tex/context/base/xtag-raw.tex37
-rw-r--r--tex/context/base/xtag-rng.tex28
-rw-r--r--tex/context/base/xtag-run.tex319
-rw-r--r--tex/context/base/xtag-stk.tex230
-rw-r--r--tex/context/base/xtag-utf.tex21
-rw-r--r--tex/context/base/xtag-xsd.tex28
-rw-r--r--tex/context/base/xtag-xsl.tex224
-rw-r--r--tex/context/bib/bibl-ams.tex437
-rw-r--r--tex/context/bib/bibl-apa-de.tex386
-rw-r--r--tex/context/bib/bibl-apa-fr.tex389
-rw-r--r--tex/context/bib/bibl-apa.tex390
-rw-r--r--tex/context/bib/bibl-aps.tex441
-rw-r--r--tex/context/bib/bibl-num-fr.tex427
-rw-r--r--tex/context/bib/bibl-num.tex427
-rw-r--r--tex/context/bib/bibl-ssa.tex486
-rw-r--r--tex/context/config/cont-usr.tex109
-rw-r--r--tex/context/extra/mag-0000.tex44
-rw-r--r--tex/context/extra/setup-qr.tex77
-rw-r--r--tex/context/extra/showunic.tex130
-rw-r--r--tex/context/fonts/antykwa-math.lfg57
-rw-r--r--tex/context/fonts/charter-math.lfg28
-rw-r--r--tex/context/fonts/garamond-math.lfg28
-rw-r--r--tex/context/fonts/husayni.lfg178
-rw-r--r--tex/context/fonts/hvmath-math.lfg24
-rw-r--r--tex/context/fonts/informal-math.lfg22
-rw-r--r--tex/context/fonts/iwona-math.lfg57
-rw-r--r--tex/context/fonts/lm-math.lfg230
-rw-r--r--tex/context/fonts/lucida-math.lfg320
-rw-r--r--tex/context/fonts/mathtimes-math.lfg24
-rw-r--r--tex/context/fonts/px-math.lfg24
-rw-r--r--tex/context/fonts/symbol-math.lfg17
-rw-r--r--tex/context/fonts/tx-math.lfg24
-rw-r--r--tex/context/fonts/utopia-math.lfg28
-rw-r--r--tex/context/foxet/fe-bryson.xml12
-rw-r--r--tex/context/foxet/fe-ward.xml8
-rw-r--r--tex/context/foxet/fe-zapf.xml14
-rw-r--r--tex/context/foxet/fo-0101.fo17
-rw-r--r--tex/context/foxet/fo-0102.fo25
-rw-r--r--tex/context/foxet/fo-0103.fo21
-rw-r--r--tex/context/foxet/fo-0201.fo22
-rw-r--r--tex/context/foxet/fo-0301.fo56
-rw-r--r--tex/context/foxet/fo-0601.fo29
-rw-r--r--tex/context/foxet/fo-0602.fo27
-rw-r--r--tex/context/foxet/fo-0603.fo26
-rw-r--r--tex/context/foxet/fo-0604.fo26
-rw-r--r--tex/context/foxet/fo-0611.fo21
-rw-r--r--tex/context/foxet/fo-0612.fo21
-rw-r--r--tex/context/foxet/fo-0613.fo21
-rw-r--r--tex/context/foxet/fo-0621.fo106
-rw-r--r--tex/context/foxet/fo-0641.fo25
-rw-r--r--tex/context/foxet/fo-0642.fo27
-rw-r--r--tex/context/foxet/fo-0643.fo27
-rw-r--r--tex/context/foxet/fo-0644.fo27
-rw-r--r--tex/context/foxet/fo-0650.fo26
-rw-r--r--tex/context/foxet/fo-0651.fo26
-rw-r--r--tex/context/foxet/fo-0701.fo39
-rw-r--r--tex/context/foxet/fo-0801.fo55
-rw-r--r--tex/context/foxet/fo-0901.fo58
-rw-r--r--tex/context/foxet/fo-0902.fo33
-rw-r--r--tex/context/foxet/fo-1001.fo63
-rw-r--r--tex/context/foxet/fo-1002.fo31
-rw-r--r--tex/context/foxet/fo-1003.fo31
-rw-r--r--tex/context/foxet/fo-1004.fo35
-rw-r--r--tex/context/foxet/fo-1101.fo63
-rw-r--r--tex/context/foxet/fo-1102.fo128
-rw-r--r--tex/context/foxet/fo-1103.fo85
-rw-r--r--tex/context/foxet/fo-1104.fo28
-rw-r--r--tex/context/foxet/fo-1201.fo40
-rw-r--r--tex/context/interface/cont-cs.xml10290
-rw-r--r--tex/context/interface/cont-de.xml10290
-rw-r--r--tex/context/interface/cont-en.xml10290
-rw-r--r--tex/context/interface/cont-fr.xml10290
-rw-r--r--tex/context/interface/cont-it.xml10290
-rw-r--r--tex/context/interface/cont-nl.xml10290
-rw-r--r--tex/context/interface/cont-pe.xml10290
-rw-r--r--tex/context/interface/cont-ro.xml10290
-rw-r--r--tex/context/interface/keys-cs.xml1706
-rw-r--r--tex/context/interface/keys-cz.xml1590
-rw-r--r--tex/context/interface/keys-de.xml1706
-rw-r--r--tex/context/interface/keys-en.xml1706
-rw-r--r--tex/context/interface/keys-fr.xml1706
-rw-r--r--tex/context/interface/keys-it.xml1706
-rw-r--r--tex/context/interface/keys-nl.xml1706
-rw-r--r--tex/context/interface/keys-pe.xml1706
-rw-r--r--tex/context/interface/keys-ro.xml1706
-rw-r--r--tex/context/patterns/lang-agr.hyp32
-rw-r--r--tex/context/patterns/lang-agr.pat2880
-rw-r--r--tex/context/patterns/lang-bg.hyp8
-rw-r--r--tex/context/patterns/lang-bg.pat1667
-rw-r--r--tex/context/patterns/lang-bg.rme43
-rw-r--r--tex/context/patterns/lang-ca.hyp33
-rw-r--r--tex/context/patterns/lang-ca.pat876
-rw-r--r--tex/context/patterns/lang-ca.rme125
-rw-r--r--tex/context/patterns/lang-cs.hyp12
-rw-r--r--tex/context/patterns/lang-cs.pat3643
-rw-r--r--tex/context/patterns/lang-cs.rme85
-rw-r--r--tex/context/patterns/lang-cy.hyp8
-rw-r--r--tex/context/patterns/lang-cy.pat6735
-rw-r--r--tex/context/patterns/lang-cy.rme64
-rw-r--r--tex/context/patterns/lang-da.hyp8
-rw-r--r--tex/context/patterns/lang-da.pat1151
-rw-r--r--tex/context/patterns/lang-da.rme74
-rw-r--r--tex/context/patterns/lang-de.hyp8
-rw-r--r--tex/context/patterns/lang-de.pat14218
-rw-r--r--tex/context/patterns/lang-de.rme31
-rw-r--r--tex/context/patterns/lang-deo.hyp8
-rw-r--r--tex/context/patterns/lang-deo.pat14386
-rw-r--r--tex/context/patterns/lang-deo.rme31
-rw-r--r--tex/context/patterns/lang-es.hyp8
-rw-r--r--tex/context/patterns/lang-es.pat3378
-rw-r--r--tex/context/patterns/lang-es.rme25
-rw-r--r--tex/context/patterns/lang-et.hyp8
-rw-r--r--tex/context/patterns/lang-et.pat3698
-rw-r--r--tex/context/patterns/lang-et.rme80
-rw-r--r--tex/context/patterns/lang-eu.hyp8
-rw-r--r--tex/context/patterns/lang-eu.pat199
-rw-r--r--tex/context/patterns/lang-eu.rme45
-rw-r--r--tex/context/patterns/lang-fi.hyp8
-rw-r--r--tex/context/patterns/lang-fi.pat293
-rw-r--r--tex/context/patterns/lang-fi.rme78
-rw-r--r--tex/context/patterns/lang-fr.hyp8
-rw-r--r--tex/context/patterns/lang-fr.pat1081
-rw-r--r--tex/context/patterns/lang-fr.rme106
-rw-r--r--tex/context/patterns/lang-gb.hyp15
-rw-r--r--tex/context/patterns/lang-gb.pat8534
-rw-r--r--tex/context/patterns/lang-gb.rme60
-rw-r--r--tex/context/patterns/lang-hr.hyp8
-rw-r--r--tex/context/patterns/lang-hr.pat1482
-rw-r--r--tex/context/patterns/lang-hr.rme70
-rw-r--r--tex/context/patterns/lang-hu.hyp8
-rw-r--r--tex/context/patterns/lang-hu.pat62819
-rw-r--r--tex/context/patterns/lang-hu.rme11
-rw-r--r--tex/context/patterns/lang-is.hyp8
-rw-r--r--tex/context/patterns/lang-is.pat4195
-rw-r--r--tex/context/patterns/lang-is.rme79
-rw-r--r--tex/context/patterns/lang-it.hyp8
-rw-r--r--tex/context/patterns/lang-it.pat324
-rw-r--r--tex/context/patterns/lang-it.rme88
-rw-r--r--tex/context/patterns/lang-la.hyp8
-rw-r--r--tex/context/patterns/lang-la.pat342
-rw-r--r--tex/context/patterns/lang-la.rme105
-rw-r--r--tex/context/patterns/lang-lt.hyp8
-rw-r--r--tex/context/patterns/lang-lt.pat1553
-rw-r--r--tex/context/patterns/lang-lt.rme47
-rw-r--r--tex/context/patterns/lang-mn.hyp8
-rw-r--r--tex/context/patterns/lang-mn.pat995
-rw-r--r--tex/context/patterns/lang-mn.rme86
-rw-r--r--tex/context/patterns/lang-nb.hyp52
-rw-r--r--tex/context/patterns/lang-nb.pat27154
-rw-r--r--tex/context/patterns/lang-nb.rme134
-rw-r--r--tex/context/patterns/lang-nl.hyp47
-rw-r--r--tex/context/patterns/lang-nl.pat12731
-rw-r--r--tex/context/patterns/lang-nl.rhl2907
-rw-r--r--tex/context/patterns/lang-nl.rme98
-rw-r--r--tex/context/patterns/lang-nl.rpl12948
-rw-r--r--tex/context/patterns/lang-nn.hyp52
-rw-r--r--tex/context/patterns/lang-nn.pat27154
-rw-r--r--tex/context/patterns/lang-nn.rme134
-rw-r--r--tex/context/patterns/lang-pl.hyp27
-rw-r--r--tex/context/patterns/lang-pl.pat4060
-rw-r--r--tex/context/patterns/lang-pl.rme88
-rw-r--r--tex/context/patterns/lang-pt.hyp9
-rw-r--r--tex/context/patterns/lang-pt.pat313
-rw-r--r--tex/context/patterns/lang-pt.rme86
-rw-r--r--tex/context/patterns/lang-ro.hyp8
-rw-r--r--tex/context/patterns/lang-ro.pat654
-rw-r--r--tex/context/patterns/lang-ro.rme110
-rw-r--r--tex/context/patterns/lang-ru.hyp191
-rw-r--r--tex/context/patterns/lang-ru.pat4815
-rw-r--r--tex/context/patterns/lang-ru.rme77
-rw-r--r--tex/context/patterns/lang-sk.hyp12
-rw-r--r--tex/context/patterns/lang-sk.pat2474
-rw-r--r--tex/context/patterns/lang-sk.rme83
-rw-r--r--tex/context/patterns/lang-sl.hyp8
-rw-r--r--tex/context/patterns/lang-sl.pat1075
-rw-r--r--tex/context/patterns/lang-sl.rme94
-rw-r--r--tex/context/patterns/lang-sr.hyp137
-rw-r--r--tex/context/patterns/lang-sr.pat2432
-rw-r--r--tex/context/patterns/lang-sr.rme80
-rw-r--r--tex/context/patterns/lang-sv.hyp8
-rw-r--r--tex/context/patterns/lang-sv.pat4700
-rw-r--r--tex/context/patterns/lang-sv.rme112
-rw-r--r--tex/context/patterns/lang-tk.hyp8
-rw-r--r--tex/context/patterns/lang-tk.pat2378
-rw-r--r--tex/context/patterns/lang-tk.rme18
-rw-r--r--tex/context/patterns/lang-tr.hyp8
-rw-r--r--tex/context/patterns/lang-tr.pat604
-rw-r--r--tex/context/patterns/lang-tr.rme26
-rw-r--r--tex/context/patterns/lang-uk.hyp8
-rw-r--r--tex/context/patterns/lang-uk.pat1905
-rw-r--r--tex/context/patterns/lang-uk.rme70
-rw-r--r--tex/context/patterns/lang-us.hyp21
-rw-r--r--tex/context/patterns/lang-us.pat4945
-rw-r--r--tex/context/patterns/lang-us.rme40
-rw-r--r--tex/context/patterns/lang-zh.hyp8
-rw-r--r--tex/context/patterns/lang-zh.pat195
-rw-r--r--tex/context/patterns/lang-zh.rme88
-rw-r--r--tex/context/sample/aesop-de.tex25
-rw-r--r--tex/context/sample/bryson.tex9
-rw-r--r--tex/context/sample/davis.tex13
-rw-r--r--tex/context/sample/dawkins.tex20
-rw-r--r--tex/context/sample/demo-mps.tex23
-rw-r--r--tex/context/sample/demo-tex.tex23
-rw-r--r--tex/context/sample/demo-xml.tex53
-rw-r--r--tex/context/sample/douglas.tex23
-rw-r--r--tex/context/sample/hawking.tex7
-rw-r--r--tex/context/sample/knuth.tex16
-rw-r--r--tex/context/sample/linden.tex8
-rw-r--r--tex/context/sample/materie.tex50
-rw-r--r--tex/context/sample/montgomery.tex13
-rw-r--r--tex/context/sample/reich.tex11
-rw-r--r--tex/context/sample/sample.tex75
-rw-r--r--tex/context/sample/thuan.tex10
-rw-r--r--tex/context/sample/tufte.tex13
-rw-r--r--tex/context/sample/ward.tex5
-rw-r--r--tex/context/sample/weisman.tex5
-rw-r--r--tex/context/sample/zapf.tex11
-rw-r--r--tex/context/test/context-test.tex27
-rw-r--r--tex/context/user/cont-sys.rme182
-rw-r--r--tex/generic/context/luatex-basics.tex21
-rw-r--r--tex/generic/context/luatex-fonts-merged.lua12389
-rw-r--r--tex/generic/context/luatex-fonts.lua140
-rw-r--r--tex/generic/context/luatex-fonts.tex139
-rw-r--r--tex/generic/context/luatex-mplib.lua469
-rw-r--r--tex/generic/context/luatex-mplib.tex118
-rw-r--r--tex/generic/context/luatex-plain.tex25
-rw-r--r--tex/generic/context/luatex-test.tex53
-rw-r--r--tex/generic/context/m-ch-de.tex10
-rw-r--r--tex/generic/context/m-ch-en.tex10
-rw-r--r--tex/generic/context/m-ch-nl.tex10
-rw-r--r--tex/generic/context/m-metapo.tex89
-rw-r--r--tex/generic/context/mptopdf.tex176
-rw-r--r--tex/generic/context/ppchtex.noc212
-rw-r--r--tex/latex/context/m-ch-de.sty19
-rw-r--r--tex/latex/context/m-ch-en.sty19
-rw-r--r--tex/latex/context/m-ch-nl.sty19
-rw-r--r--tex/latex/context/m-metapo.sty5
-rw-r--r--tex/latex/context/m-pictex.sty5
1390 files changed, 982379 insertions, 0 deletions
diff --git a/tex/context/base/anch-bar.mkii b/tex/context/base/anch-bar.mkii
new file mode 100644
index 000000000..d08573c0f
--- /dev/null
+++ b/tex/context/base/anch-bar.mkii
@@ -0,0 +1,194 @@
+%D \module
+%D [ file=anch-bar,
+%D version=2003.03.16,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Margin Bars and alike,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Anchoring Macros / Margin Bars}
+
+\unprotect
+
+%D We will implement a sidebar mechanism using the
+%D functionality from \type {core-pos}.
+%D
+%D \starttyping
+%D \definesidebar[whow][rulecolor=green,distance=]
+%D
+%D \input tufte \par
+%D \startsidebar
+%D \input tufte \par
+%D \input tufte \par
+%D \startsidebar[whow]
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte
+%D \stopsidebar \par
+%D \input tufte \par
+%D \input tufte
+%D \stopsidebar \par
+%D \input tufte \par
+%D \input tufte \par
+%D \startsidebar
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte
+%D \stopsidebar \par
+%D \input tufte \par
+%D \input tufte \par
+%D \startsidebar
+%D \input tufte
+%D \input tufte
+%D \input tufte
+%D \input tufte
+%D \input tufte
+%D \stopsidebar
+%D \stoptyping
+
+\newcount\currentsidebar
+\newdimen\sidebardistance
+
+\def\setupsidebars
+ {\dodoubleargument\dosetupsidebars}
+
+\def\dosetupsidebars[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??br#1][#2]%
+ \else
+ \getparameters[\??br][#1]%
+ \fi}
+
+% \setupMPvariables
+% [mpos:bar]
+% [linecolor=red,
+% linewidth=2pt,
+% distance=5pt]
+
+\setupsidebars
+ [\c!rulethickness=2pt,
+ \c!rulecolor=red,
+ \c!distance=.5\bodyfontsize]
+
+\def\definesidebar
+ {\dodoubleempty\dodefinesidebar}
+
+\def\dodefinesidebar[#1][#2]%
+ {\copyparameters
+ [\??br#1][\??br]
+ [\c!rulethickness,\c!rulecolor,\c!distance]%
+ \getparameters
+ [\??br#1][#2]}
+
+\def\startsidebar
+ {\dosingleempty\dostartsidebar}
+
+\def\dostartsidebar[#1]%
+ {\bgroup
+ \dontleavehmode
+ \checktextbackgrounds
+ \global\advance\currentsidebar\plusone
+ \doifelsenothing{#1}
+ {\advance\sidebardistance\@@brdistance}
+ {\doifelsevaluenothing{\??br#1\c!distance}
+ {\advance\sidebardistance\@@brdistance}
+ {\sidebardistance\getvalue{\??br#1\c!distance}}}%
+ \startpositionoverlay{text-1}%
+ \expanded{\setMPpositiongraphicrange
+ {b:side:\the\currentsidebar}%
+ {e:side:\the\currentsidebar}%
+ {mpos:bar}%
+ {self=side:\the\currentsidebar,
+ linewidth=\getvalue{\??br#1\c!rulethickness},
+ linecolor=\getvalue{\??br#1\c!rulecolor},
+ distance=\the\sidebardistance}}%
+ \stoppositionoverlay
+ \bpos{side:\the\currentsidebar}\ignorespaces}
+
+% \def\dostopsidebar#1%
+% {\removelastspace\tpos{side:#1}\carryoverpar\egroup}
+
+\def\stopsidebar
+ {\removelastspace\tpos{side:\the\currentsidebar}\carryoverpar\egroup}
+
+\startMPpositionmethod{mpos:bar}
+ \startMPpositiongraphic{mpos:bar}{linecolor,linewidth,distance}%
+ StartPage ;
+ path p ; p :=
+ if \MPp\MPbself=\MPp\MPeself :
+ (xpart ulcorner Field[Text][Text],\MPy\MPbself+\MPh\MPbself) --
+ (xpart llcorner Field[Text][Text],\MPy\MPeself-\MPd\MPeself) ;
+ elseif RealPageNumber=\MPp\MPbself :
+ (xpart ulcorner Field[Text][Text],\MPy\MPbself+\MPh\MPbself) --
+ (llcorner Field[Text][Text]) ;
+ elseif RealPageNumber=\MPp\MPeself :
+ (ulcorner Field[Text][Text]) --
+ (xpart llcorner Field[Text][Text],\MPy\MPeself-\MPd\MPeself) ;
+ else :
+ (ulcorner Field[Text][Text]) --
+ (llcorner Field[Text][Text]) ;
+ fi ;
+ p := p shifted (-llcorner Field[Text][Text]-(\MPvar{distance},0)) ;
+ interim linecap := butt ;
+ draw p
+ withpen pencircle scaled \MPvar{linewidth}
+ withcolor \MPvar{linecolor} ;
+ StopPage ;
+ \stopMPpositiongraphic
+ \MPpositiongraphic{mpos:bar}{}%
+\stopMPpositionmethod
+
+%D We now reimplement the margin rules handler defined in
+%D \type {core-rul}:
+%D
+%D \setupmarginrules[level=5]
+%D
+%D \startmarginrule[1]
+%D First we set the level at~5. Next we typeset this first
+%D paragraph as a level~1 one. As expected no rule show up.
+%D \stopmarginrule
+%D
+%D \startmarginrule[5]
+%D The second paragraph is a level~5 one. As we can see here,
+%D the marginal rule gets a width according to its level.
+%D \stopmarginrule
+%D
+%D \startmarginrule[8]
+%D It will of course be no surprise that this third paragraph
+%D has a even thicker margin rule. This behavior can be
+%D overruled by specifying the width explictly.
+%D \stopmarginrule
+
+\definesidebar
+ [\v!margin]
+ [\c!rulecolor=\s!black,
+ \c!rulethickness=\@@karulethickness,
+ \c!distance=\dimexpr\leftmargindistance-\@@karulethickness/2\relax]
+
+\definecomplexorsimple\startmarginrule
+
+\def\simplestartmarginrule
+ {\complexstartmarginrule[1]}
+
+\def\complexstartmarginrule[#1]%
+ {\bgroup
+ \ifnum#1<\@@kalevel\relax
+ \let\stopmarginrule\egroup
+ \else
+ \def\@@kadefaultwidth{#1}%
+ \let\stopmarginrule\dostopmarginrule
+ \@EA\startsidebar\@EA[\@EA\v!margin\@EA]%
+ \fi}
+
+\def\dostopmarginrule
+ {\stopsidebar
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/anch-bar.mkiv b/tex/context/base/anch-bar.mkiv
new file mode 100644
index 000000000..1013e7609
--- /dev/null
+++ b/tex/context/base/anch-bar.mkiv
@@ -0,0 +1,179 @@
+%D \module
+%D [ file=anch-bar,
+%D version=2003.03.16,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Margin Bars and alike,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Anchoring Macros / Margin Bars}
+
+\unprotect
+
+%D We will implement a sidebar mechanism using the
+%D functionality from \type {core-pos}.
+%D
+%D \starttyping
+%D \definesidebar[whow][rulecolor=green,distance=]
+%D
+%D \input tufte \par
+%D \startsidebar
+%D \input tufte \par
+%D \input tufte \par
+%D \startsidebar[whow]
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte
+%D \stopsidebar \par
+%D \input tufte \par
+%D \input tufte
+%D \stopsidebar \par
+%D \input tufte \par
+%D \input tufte \par
+%D \startsidebar
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte \par
+%D \input tufte
+%D \stopsidebar \par
+%D \input tufte \par
+%D \input tufte \par
+%D \startsidebar
+%D \input tufte
+%D \input tufte
+%D \input tufte
+%D \input tufte
+%D \input tufte
+%D \stopsidebar
+%D \stoptyping
+
+\newcount\currentsidebar
+\newdimen\sidebardistance
+
+\unexpanded\def\setupsidebars
+ {\dodoubleargument\dosetupsidebars}
+
+\def\dosetupsidebars[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??br#1][#2]%
+ \else
+ \getparameters[\??br][#1]%
+ \fi}
+
+% \setupMPvariables
+% [mpos:bar]
+% [linecolor=red,
+% linewidth=2pt,
+% distance=5pt]
+
+\setupsidebars
+ [\c!rulethickness=2pt,
+ \c!rulecolor=red,
+ \c!distance=.5\bodyfontsize]
+
+\unexpanded\def\definesidebar
+ {\dodoubleempty\dodefinesidebar}
+
+\def\dodefinesidebar[#1][#2]%
+ {\copyparameters
+ [\??br#1][\??br]
+ [\c!rulethickness,\c!rulecolor,\c!distance]%
+ \getparameters
+ [\??br#1][#2]}
+
+\unexpanded\def\startsidebar
+ {\dosingleempty\dostartsidebar}
+
+\def\dostartsidebar[#1]%
+ {\bgroup
+ \dontleavehmode
+ \checktextbackgrounds
+ \global\advance\currentsidebar\plusone
+ \doifelsenothing{#1}
+ {\advance\sidebardistance\@@brdistance}
+ {\doifelsevaluenothing{\??br#1\c!distance}
+ {\advance\sidebardistance\@@brdistance}
+ {\sidebardistance\getvalue{\??br#1\c!distance}}}%
+ \startpositionoverlay{text-1}%
+ \expanded{\setMPpositiongraphicrange
+ {b:side:\the\currentsidebar}%
+ {e:side:\the\currentsidebar}%
+ {mpos:bar}%
+ {self=side:\the\currentsidebar,
+ linewidth=\getvalue{\??br#1\c!rulethickness},
+ linecolor=\getvalue{\??br#1\c!rulecolor},
+ distance=\the\sidebardistance}}%
+ \stoppositionoverlay
+ \bpos{side:\the\currentsidebar}\ignorespaces}
+
+% \def\dostopsidebar#1%
+% {\removelastspace\tpos{side:#1}\carryoverpar\egroup}
+
+\unexpanded\def\stopsidebar
+ {\removelastspace\tpos{side:\the\currentsidebar}\carryoverpar\egroup}
+
+\startMPpositionmethod{mpos:bar}
+ \startMPpositiongraphic{mpos:bar}{linecolor,linewidth,distance}%
+ position_anchor_bar (
+ \MPp\MPbself, \MPp\MPeself,
+ \MPy\MPbself, \MPy\MPeself,
+ \MPh\MPbself, \MPd\MPeself,
+ \MPvar{distance}, \MPvar{linewidth}, \MPvar{linecolor}
+ ) ;
+ \stopMPpositiongraphic
+ \MPpositiongraphic{mpos:bar}{}%
+\stopMPpositionmethod
+
+%D We now reimplement the margin rules handler defined in
+%D \type {core-rul}:
+%D
+%D \setupmarginrules[level=5]
+%D
+%D \startmarginrule[1]
+%D First we set the level at~5. Next we typeset this first
+%D paragraph as a level~1 one. As expected no rule show up.
+%D \stopmarginrule
+%D
+%D \startmarginrule[5]
+%D The second paragraph is a level~5 one. As we can see here,
+%D the marginal rule gets a width according to its level.
+%D \stopmarginrule
+%D
+%D \startmarginrule[8]
+%D It will of course be no surprise that this third paragraph
+%D has a even thicker margin rule. This behavior can be
+%D overruled by specifying the width explictly.
+%D \stopmarginrule
+
+\definesidebar
+ [\v!margin]
+ [\c!rulecolor=\s!black,
+ \c!rulethickness=\@@karulethickness,
+ \c!distance=\dimexpr\leftmargindistance-\@@karulethickness/2\relax]
+
+\definecomplexorsimple\startmarginrule
+
+\def\simplestartmarginrule
+ {\complexstartmarginrule[1]}
+
+\def\complexstartmarginrule[#1]%
+ {\bgroup
+ \ifnum#1<\@@kalevel\relax
+ \let\stopmarginrule\egroup
+ \else
+ \def\@@kadefaultwidth{#1}%
+ \let\stopmarginrule\dostopmarginrule
+ \@EA\startsidebar\@EA[\@EA\v!margin\@EA]%
+ \fi}
+
+\def\dostopmarginrule
+ {\stopsidebar
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/anch-pgr.mkii b/tex/context/base/anch-pgr.mkii
new file mode 100644
index 000000000..194f19755
--- /dev/null
+++ b/tex/context/base/anch-pgr.mkii
@@ -0,0 +1,1687 @@
+%D \module
+%D [ file=anch-pgr, % split off core-pos
+%D version=1999.08.01,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Positioning Graphics,
+%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 Anchoring Macros / Grapics}
+
+%D Before we come to graphics support, we have to make sure of
+%D the reference point on the page. The next macro does so and
+%D is hooked into the page building routine.
+
+\unprotect
+
+% in the future, the depth of tail will reflect page depth
+
+\ifx\textheight\undefined \def\textheight{\vsize} \fi
+
+%D The next macros so some housekeeping.
+
+\def\pageanchor{page:0} % for the moment only one pagesize
+\def\textanchor{text:\realfolio}
+\def\headanchor{head:\realfolio} % virtual position
+\def\tailanchor{tail:\realfolio} % virtual position
+
+%D Anchors:
+
+\def\dopresetpositionanchors % also mkii
+ {\bgroup
+ \!!dimena\ifdim\topskip>\strutht\topskip\else\strutht\fi
+ \!!dimenb\dimexpr\MPy\textanchor+\MPh\textanchor-\!!dimena\relax
+ \!!dimenc\dimexpr\MPy\textanchor+\strutdp\relax
+ \!!dimend\MPx\textanchor
+ \!!dimene\MPw\textanchor
+ \replacepospxywhd\headanchor\realfolio\!!dimend\!!dimenb\!!dimene\!!dimena\strutdp
+ \replacepospxywhd\tailanchor\realfolio\!!dimend\!!dimenc\!!dimene\strutht \strutdp
+ \egroup}
+
+\def\presetpositionanchors% compatibility hack (still needed?)
+ {\ifpositioning
+ \dopresetpositionanchors
+ \fi}
+
+%D The first version of this module implemented head and tail
+%D anchors. Currently we stick to just one anchor and derive
+%D the head and tail anchors from this one.
+
+\def\showanchor#1%
+ {\expanded{\writestatus{#1}
+ {\MPp{#1}\string|\MPx{#1}\string|\MPy{#1}\string|%
+ \MPw{#1}\string|\MPh{#1}\string|\MPd{#1}}}}
+
+%D We set these anchors before and after each page.
+
+\appendtoks \presetpositionanchors \to \beforeeverypage
+\appendtoks \presetpositionanchors \to \aftereverypage
+
+% todo: change with each page size change
+
+\def\registerpageposition#1% this one is flushed first !
+ {\ifpositioning\ifcase\realpageno\or
+ \ifdim\printpaperheight=\paperheight\else
+ \ifdim\printpaperwidth=\paperwidth\else
+ \setbox#1\hbox{\hpos\pageanchor{\box#1}}%
+ \fi
+ \fi
+ \fi\fi}
+
+\def\placepositionanchors % todo : depth pagebox
+ {\ifpositioning
+ \setbox\scratchbox\vbox to \textheight
+ {\simpletopskipcorrection
+ \hbox{\strut\dopositionaction\headanchor}%
+ \vfill
+ \hbox{\strut\dopositionaction\tailanchor}}%
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\makeupwidth % not \zeropoint, else wrong text backgrounds
+ \hpos\textanchor{\box\scratchbox}%
+ \else
+ \vskip\textheight
+ \fi}
+
+%D \macros
+%D {positionoverlay,startpositionoverlay}
+%D
+%D As long as we're dealing with graphics it makes much sense
+%D to use the available overlay mechanism. For this purpose, we
+%D define some dedicated overlay extensions.
+%D
+%D \startbuffer[sample]
+%D \defineoverlay [sample] [\positionoverlay{sample}]
+%D
+%D \startpositionoverlay{sample}
+%D \setMPpositiongraphic{A-1}{connectcenter}{from=A-1,to=A-2}
+%D \stoppositionoverlay
+%D \stopbuffer
+%D
+%D \typebuffer[sample]
+%D
+%D \startbuffer[graphic]
+%D \startMPpositiongraphic{connectcenter}
+%D path pa, pb ; pair ca, cb ;
+%D initialize_box(\MPpos{\MPvar{from}}) ; pa := pxy ; ca := cxy ;
+%D initialize_box(\MPpos{\MPvar{to}}) ; pb := pxy ; cb := cxy ;
+%D draw pa withcolor red ;
+%D draw pb withcolor red ;
+%D draw ca -- cb withcolor blue ;
+%D anchor_box(\MPanchor{\MPvar{from}}) ;
+%D \stopMPpositiongraphic
+%D \stopbuffer
+%D
+%D We can best demonstrate this in an example, say:
+%D
+%D \startbuffer[text]
+%D \framed
+%D [backgroundachtergrond=sample,align=middle,width=7cm]
+%D {We want to connect \hpos {A-1} {this} word with its
+%D grammatical cousin \hpos {A-2} {that}.}
+%D \stopbuffer
+%D
+%D \typebuffer[text]
+%D
+%D \startlinecorrection
+%D %\getbuffer[graphic,sample,text]
+%D \stoplinecorrection
+%D
+%D The graphic is defined in the following way, using some
+%D macros defined in an auxiliary \METAPOST\ module that is
+%D preloaded.
+%D
+%D \typebuffer[graphic]
+
+\def\MPanchoridentifier{mpa} % {mp-anchor}
+\def\MPoverlayposprefix{MO::}
+
+% obsolete and wrong anyway
+%
+% \long\def\defineMPpositiongraphic#1%
+% {\long\setvalue{\MPoverlayposprefix#1}}
+
+%D The rest of the definitions concerning such overlays may
+%D look complicated,
+
+\let\currentpositionoverlay\empty
+
+%D Position actions are automatically executed when a position
+%D is set.
+
+\let\MPanchornumber\realfolio
+
+\def\positionoverlay#1% the test prevents too many redundant positions
+ {\ifpositioning % in (not used) text* position layers
+ \vbox to \overlayheight
+ {\doifpositionactionelse{#1::\MPanchoridentifier}%
+ {\edef\MPanchorid{#1::\MPanchoridentifier:\MPanchornumber}%
+ \edef\MPanchor##1{\MPpos{\MPanchorid}}%
+ \the\everyinsertpositionaction
+ \copyposition{#1::\MPanchoridentifier}{#1::\MPanchoridentifier:\MPanchornumber}%
+ \hpos
+ {#1::\MPanchoridentifier:\MPanchornumber}%
+ % this is ok
+ %{\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}%
+ \ht\scratchbox\overlayheight
+ \dp\scratchbox\zeropoint
+ \box\scratchbox}}%
+ {\hbox to \overlaywidth{\hss}}%
+ \vfill}%
+ \fi}
+
+\def\startpositionoverlay#1%
+ {\iftrialtypesetting % we don't want redundant entries in the list
+ \@EA\gobbleuntil\@EA\stoppositionoverlay
+ \else
+ \def\currentpositionoverlay{#1}%
+ \fi}
+
+\def\stoppositionoverlay
+ {\let\currentpositionoverlay\empty}
+
+\def\resetpositionoverlay#1%
+ {\dosetpositionaction{#1::\MPanchoridentifier::}{}}
+
+%D Here the complication has to do with collecting actions
+%D for later execution. This collection is especially handy
+%D when we want to move actions to a specific layer.
+%D Such series of actions are stored in a macro (the one
+%D with the funny \type {++}) which is cleaned up after each
+%D invocation.
+
+\newtoks\everycleanpositionaction
+\newtoks\everyinsertpositionaction
+
+\def\cleanuppositionaction#1% not in trialtypesetting
+ {\ifcsname\POSactionprefix#1++\endcsname % \ifundefined{\POSactionprefix#1++}\else
+ \the\everycleanpositionaction
+ \iflocalpositioning
+ \letgvalue{\POSactionprefix#1++}\empty
+ \else
+ \setxvalue{\POSactionprefix#1++}{\getvalue{\POSactionprefix#1++}}%
+ \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
+ \edef\!!stringa{#3}% no layer, just pos itself as anchor
+ \else
+ \edef\!!stringa{\currentpositionoverlay::\MPanchoridentifier}%
+ \fi
+ \edef\!!stringc{\POSactionprefix\!!stringa++}%
+ \expanded{\dosetpositionaction{\!!stringa}{\noexpand\getvalue{\!!stringc}}}%
+ \global\let#1\relax
+ \edef\!!stringb{\executeifdefined\!!stringc\empty}%
+ \setxvalue\!!stringc{\!!stringb#1#2}%
+ \egroup}
+
+%D The indirectness enables us redefine macros for special
+%D purposes, like a cleanup.
+
+\def\handlepositionboxes#1#2#3%
+ {\handlepositionaction\dohandlepositionboxes\with{#1}{#2}{#3}\on{#2}}
+
+\def\doinsertpositionboxes#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}=\realpageno\relax % can be sped up
+ \executeifdefined{\MPoverlayposprefix#1}\gobblethreearguments{#1}{#2}{#3}%
+ \fi}
+
+\appendtoks
+ \let\dohandlepositionboxes\doinsertpositionboxes % was handle ?
+\to \everyinsertpositionaction
+
+\def\docleanpositionboxes#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}<\realpageno \else
+ \noexpand \dohandlepositionboxes{#1}{#2}{#3}% reinsert
+ \fi}
+
+\appendtoks
+ \let\dohandlepositionboxes\docleanpositionboxes
+\to \everycleanpositionaction
+
+%D A position graphic is a normal (non||reused) \METAPOST\
+%D graphic, used immediately, with zero dimensions, so that a
+%D sequence of them does not harm.
+
+\newbox\positiongraphicbox
+
+\def\startMPpositiongraphic % id setups
+ {\dodoublegroupempty\dostartMPpositiongraphic}
+
+\long\def\dostartMPpositiongraphic#1#2#3\stopMPpositiongraphic
+ {\long\setgvalue{MPG:#1}% tag list mpcode
+ {\useMPpositiongraphic{#1}{#2}{#3}}}
+
+\let\stopMPpositiongraphic\relax
+
+% \def\prepareMPpositionvariables
+% {\ifundefined{\@@meta self}\setvalue{\@@meta self}{\currentposition}\fi
+% \ifundefined{\@@meta from}\setvalue{\@@meta from}{\currentposition}\fi}
+
+\def\prepareMPpositionvariables
+ {\ifcsname\@@meta self\endcsname\else\setvalue{\@@meta self}{\currentposition}\fi
+ \ifcsname\@@meta from\endcsname\else\setvalue{\@@meta from}{\currentposition}\fi}
+
+\newif\ifcollectMPpositiongraphics \collectMPpositiongraphicstrue
+
+\long\def\useMPpositiongraphic#1#2#3%
+ {\bgroup
+ \prepareMPvariables{#2}%
+ \prepareMPpositionvariables
+ \enableincludeMPgraphics
+ \ifcollectMPpositiongraphics % no longer needed in mkiv
+ \expanded{\startMPdrawing#3\noexpand\stopMPdrawing}%
+ \global\MPdrawingdonetrue
+ \else\ifx\startMPgraphic\undefined
+ \startMPcode#3\stopMPcode
+ \else
+ \startMPgraphic#3\stopMPgraphic
+ \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \deallocateMPslot\currentMPgraphic
+ \placeMPgraphic
+ \fi\fi
+ \egroup}
+
+% Now we need a adapted action handler:
+
+\def\dopositionaction#1% test saves hash entry in etex
+ {\ifundefined{\POSactionprefix#1::}\else
+ \ifnum\MPp{#1}>\zerocount % new
+ \bgroup
+ \setbox\scratchbox\hbox
+ \bgroup
+ \traceposstring\clap\red{<#1>}%
+ \the\everyinsertpositionaction
+ \the\everypositionaction
+ \ifcollectMPpositiongraphics
+ % can save a lot of run time
+ \pushMPdrawing
+ \MPshiftdrawingtrue
+ \resetMPdrawing
+ \getvalue{\POSactionprefix#1::}%
+ \ifMPdrawingdone
+ \getMPdrawing
+ \fi
+ \resetMPdrawing
+ \popMPdrawing
+ \else
+ \getvalue{\POSactionprefix#1::}%
+ \fi
+ \cleanuppositionaction{#1}%
+ \egroup % smashed is really needed else
+ \smashedbox\scratchbox % we get problems with too big
+ \egroup % overlays (s-pre-0x.tex)
+ \else
+ % shouldn't happen too often
+ \traceposstring\clap\cyan{<#1>}%
+ \fi
+ \fi}
+
+\def\MPpositiongraphic
+ {\dodoublegroupempty\doMPpositiongraphic}
+
+\def\doMPpositiongraphic#1#2% tag setups
+ {\bgroup
+ \def\@@meta{#1:}%
+ \setupMPvariables[#2]%
+ \prepareMPpositionvariables
+ \MPshiftdrawingtrue
+ \def\doMPpositiongraphic##1##2%
+ {{% new, see (techniek)
+ \def\@@meta{##1:}%
+ \setupMPvariables[#2,##2]%
+ \prepareMPpositionvariables
+ % and needed
+ \getvalue{MPG:##1}}}% temp hack
+ \setbox\positiongraphicbox\hbox
+ {\ignorespaces
+ \executeifdefined{MPM:#1}{\executeifdefined{MPG:#1}\donothing}%
+ \removelastspace}%
+ \smashbox\positiongraphicbox
+ \box\positiongraphicbox
+ \egroup}
+
+\long\def\startMPpositionmethod#1#2\stopMPpositionmethod
+ {\long\setgvalue{MPM:#1}{#2}} % todo: var list here
+
+\let\stopMPpositionmethod\relax
+
+%D Simple one position graphics.
+
+\def\setMPpositiongraphic
+ {\dotriplegroupempty\dosetMPpositiongraphic}
+
+\def\dosetMPpositiongraphic#1#2#3% pos tag vars
+ {\ifx\currentpositionoverlay\empty
+ \dosetpositionaction{#1}{\MPpositiongraphic{#2}{#3}}%
+ \else % silly can be one
+ \handlepositiongraphics{#1}{#2}{#3}%
+ \fi}
+
+\def\handlepositiongraphics#1#2#3% combine with boxes
+ {\handlepositionaction\dohandleMPpositiongraphic\with{#1}{#2}{#3}\on{#2}}
+
+\def\doinsertMPpositiongraphic#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}=\realpageno\relax % extra saveguard
+ \def\currentposition{#1}\MPpositiongraphic{#2}{#3}%
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphic\doinsertMPpositiongraphic
+\to \everyinsertpositionaction
+
+\def\docleanMPpositiongraphic#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}<\realpageno \else
+ \noexpand \dohandleMPpositiongraphic{#1}{#2}{#3}%
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphic\docleanMPpositiongraphic
+\to \everycleanpositionaction
+
+%D Graphics that span two positions.
+
+\def\setMPpositiongraphicrange
+ {\doquadruplegroupempty\dosetMPpositiongraphicrange}
+
+\def\dosetMPpositiongraphicrange#1#2#3#4% bpos epos tag vars
+ {\ifx\currentpositionoverlay\empty
+ \dosetpositionaction{#1}{\MPpositiongraphic{#3}{#4}}%
+ \else
+ \handlepositiongraphicsrange{#1}{#2}{#3}{#4}%
+ \fi}
+
+\def\handlepositiongraphicsrange#1#2#3#4%
+ {\handlepositionaction\dohandleMPpositiongraphicrange\with{#1}{#2}{#3}{#4}\on{#2}}
+
+\def\doinsertMPpositiongraphicrange#1#2#3#4% pos pos tag setups
+ {\ifnum\MPp{#1}\MPp{#2}>\zerocount
+ \iflocalpositioning
+ \donetrue
+ \else
+ \donefalse
+ \ifnum\MPp{#1}=\realpageno
+ \donetrue
+ \else\ifnum\MPp{#2}=\realpageno
+ \donetrue
+ \else\ifnum\MPp{#1}<\realpageno\relax\ifnum\MPp{#2}>\realpageno
+ \donetrue
+ \fi\fi\fi\fi
+ \fi
+ \ifdone
+ \def\currentposition{#1}\MPpositiongraphic{#3}{#4}%
+ \fi
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphicrange\doinsertMPpositiongraphicrange
+\to \everyinsertpositionaction
+
+\def\docleanMPpositiongraphicrange#1#2#3#4% pos tag setups
+ {\ifnum\MPp{#2}<\realpageno \else
+ \noexpand \dohandleMPpositiongraphicrange{#1}{#2}{#3}{#4}%
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphicrange\docleanMPpositiongraphicrange
+\to \everycleanpositionaction
+
+% will be overloaded, and/or code below moved to core-box
+
+\defineoverlay[\v!text-2][\positionoverlay{\v!text-2}]
+\defineoverlay[\v!text-1][\positionoverlay{\v!text-1}]
+\defineoverlay[\v!text+1][\positionoverlay{\v!text+1}]
+\defineoverlay[\v!text+2][\positionoverlay{\v!text+2}]
+
+%D The auxiliary \METAPOST\ macros are defined by default,
+%D by saying:
+
+\startMPextensions
+ if unknown context_core : input mp-core.mp ; fi ;
+\stopMPextensions
+
+%D Some of these macros are pretty clever but too complicated
+%D to be nice. When things are kind of stable I'll clean up
+%D this mess.
+
+%D THIS NEEDS A CLEANUP
+
+\setupMPvariables
+ [mpos:box]
+ [linecolor=blue,
+ linewidth=\linewidth,
+ fillcolor=lightgray,
+ filloffset=\!!zeropoint]
+
+\startMPpositiongraphic{mpos:box}{fillcolor,linecolor,linewidth}
+ initialize_box(\MPpos{\MPvar{self}}) ;
+ boxfillcolor := \MPvar{fillcolor} ;
+ boxlinecolor := \MPvar{linecolor} ;
+ boxlinewidth := \MPvar{linewidth} ;
+ boxfilloffset := \MPvar{filloffset} ;
+ draw_box ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\setupMPvariables
+ [mpos:area]
+ [linecolor=blue,
+ linewidth=\linewidth,
+ fillcolor=lightgray,
+ filloffset=\!!zeropoint]
+
+\startMPpositiongraphic{mpos:area}{fillcolor,linecolor,linewidth}
+ initialize_area(\MPpos{b:\MPvar{self}},\MPpos{e:\MPvar{self}}) ;
+ boxfillcolor := \MPvar{fillcolor} ;
+ boxlinecolor := \MPvar{linecolor} ;
+ boxlinewidth := \MPvar{linewidth} ;
+ boxfilloffset := \MPvar{filloffset} ;
+ draw_area ;
+ anchor_area(\MPanchor{b:\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+%D This is already cleaned up.
+
+% gridtype = 1 => baseline
+% gridtype = 2 => betweenline
+
+\setupMPvariables
+ [mpos:par]
+ [mp=mpos:par:shape,
+ gridtype=0,
+ linetype=1,
+ filltype=1,
+ dashtype=0, % 1 = dashed, 2 = dashed with background
+ %snaptops=true, % not that nice: true/false
+ gridcolor=red,
+ linecolor=blue,
+ fillcolor=lightgray,
+ filloffset=\!!zeropoint,
+ linewidth=\linewidth,
+ gridwidth=\linewidth,
+ gridshift=\!!zeropoint,
+ lineradius=.5\bodyfontsize,
+ dashtype=1]
+
+\startuseMPgraphic{mpos:par:shape}
+ \iftracepositions show_par \else draw_par \fi ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:setup}
+ boxgridtype := \MPvar{gridtype} ;
+ boxlinetype := \MPvar{linetype} ;
+ boxfilltype := \MPvar{filltype} ;
+ boxdashtype := \MPvar{dashtype} ;
+ boxgridcolor := \MPvar{gridcolor} ;
+ boxlinecolor := \MPvar{linecolor} ;
+ boxfillcolor := \MPvar{fillcolor} ;
+ boxfilloffset := \MPvar{filloffset} ;
+ boxlinewidth := \MPvar{linewidth} ;
+ boxgridwidth := \MPvar{gridwidth} ;
+ boxgridshift := \MPvar{gridshift} ;
+ boxlineradius := \MPvar{lineradius} ;
+ %snap_multi_par_tops := \MPvar{snaptops} ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:extra}
+ % user stuff, like:
+ % snap_multi_par_tops := false ;
+\stopuseMPgraphic
+
+\ifx\MPparcounter\undefined \newcounter\MPparcounter \fi
+
+\def\MPself {\MPvar{self}}
+\def\MPbself {b:\MPself}
+\def\MPeself {e:\MPself}
+\def\MPwself {w:\MPself}
+\def\MPparanchor{p:\MPparcounter}
+
+\def\MPl#1{\MPplus{#1}20}
+\def\MPr#1{\MPplus{#1}30}
+
+\startMPpositionmethod{mpos:par} %%%%%%%%%%% will become obsolete
+ \edef\MPparcounter{\MPv\MPbself{1}{0}}%
+ \doifpositionelse\MPwself
+ {\startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+ initialize_area_par(\MPpos\MPbself,
+ \MPpos\MPeself,
+ \MPpos\MPwself) ;
+ \includeMPgraphic{mpos:par:setup} ;
+ \includeMPgraphic{mpos:par:extra} ;
+ \includeMPgraphic{\MPvar{mp}} ;
+ anchor_par(\MPanchor\MPbself) ;
+ \stopMPpositiongraphic}
+ {\startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+ initialize_par(\MPpos\MPbself,
+ \MPpos\MPeself,
+ \MPpos\textanchor,
+ \MPpos\MPparanchor,
+ \MPvv \MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
+ \includeMPgraphic{mpos:par:setup} ;
+ \includeMPgraphic{mpos:par:extra} ;
+ \includeMPgraphic{\MPvar{mp}} ;
+ anchor_par(\MPanchor\MPbself) ;
+ \stopMPpositiongraphic}%
+ \MPpositiongraphic{mpos:par}{}%
+\stopMPpositionmethod
+
+%D The next alternative works in columnsets :
+
+% \iftracepositions show\else draw\fi_multi_pars ;
+
+\startuseMPgraphic{mpos:par:columnset}
+ \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:sideline}{linecolor,lineoffset}
+ for i=1 upto nofmultipars :
+ fill leftboundary multipars[i]
+ shifted (-\MPvar{lineoffset},0)
+ rightenlarged 1mm withcolor \MPvar{linecolor} ;
+ endfor ;
+\stopuseMPgraphic
+
+\startMPpositionmethod{mpos:par:columnset}
+ \edef\MPparcounter{\MPv\MPbself{1}{0}}%
+ \startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+ \includeMPgraphic{mpos:par:setup} ;
+ \includeMPgraphic{mpos:par:extra} ;
+ prepare_multi_pars(\MPpos\MPbself,\MPpos\MPeself,\MPpos\MPwself,
+ \MPpos\MPparanchor,\MPvv\MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
+ relocate_multipars(-\MPxy\MPanchorid) ; % inside layerpos
+ \includeMPgraphic{\MPvar{mp}} ;
+ \stopMPpositiongraphic
+ \MPpositiongraphic{mpos:par}{}%
+\stopMPpositionmethod
+
+%D \starttyping
+%D \setupbackground
+%D [test]
+%D [mp=mpos:par:columnset,
+%D method=mpos:par:columnset]
+%D \stoptyping
+
+%D We need to treat floats in a special way.
+
+\startMPinitializations
+ local_multi_par_area:=\iflocalpositioning true\else false\fi;
+\stopMPinitializations
+
+\def\textbackgroundoverlay#1%
+ {\iflocalpositioning\v!local\else\v!text\fi#1}
+
+\newcounter\localpositionnumber
+
+\def\MPanchornumber
+ {\iflocalpositioning\localpositionnumber\else\realfolio\fi}
+
+%D So far for the trickery.
+
+\newcount\textbackgrounddepth
+
+\appendtoks
+ \expanded{\savecurrentvalue\noexpand\totalnofparbackgrounds{\number\nofparbackgrounds}}%
+\to \everybye
+
+\appendtoks
+ \initializeparbackgrounds
+\to \everystarttext
+
+\ifx\totalnofparbackgrounds\undefined \newcounter\totalnofparbackgrounds \fi
+\ifx\nofparbackgrounds \undefined \newcount \nofparbackgrounds \fi
+
+\def\initializeparbackgrounds
+ {\ifcase\totalnofparbackgrounds\else
+ \enableparpositions
+ \fi}
+
+\unexpanded\def\starttextbackground
+ {\bgroup
+ \advance\textbackgrounddepth\plusone
+ \dodoubleempty\dostarttextbackground}
+
+\let\dodostarttextbackground\relax
+\let\dodostoptextbackground \relax
+
+\def\currentparbackground{pbg:0}
+\def\nextparbackground {pbg:1}
+
+\def\btbanchor{b:\currentparbackground}
+\def\etbanchor{e:\currentparbackground}
+
+\def\nextbtbanchor{b:\nextparbackground}
+\def\nextetbanchor{e:\nextparbackground}
+
+\def\textbackgroundparameter#1%
+ {\csname\??td\currenttextbackground#1\endcsname}
+
+\let\backgroundvariable\textbackgroundparameter % will become obsolete
+
+% \definetextbackground[more][state=start,backgroundcolor=red] % location=paragraph
+% \definetextbackground[test][state=start,backgroundcolor=green]
+%
+% \page \placefigure[left]{}{}
+%
+% \starttextbackground[test]
+% \readfile{ward}{}{}
+% \starttextbackground[more]
+% \readfile{ward}{}{}
+% \stoptextbackground
+% \readfile{ward}{}{}
+% \stoptextbackground
+%
+% \page \placefigure[right]{}{}
+%
+% \starttextbackground[test]
+% \readfile{ward}{}{}
+% \starttextbackground[more]
+% \readfile{ward}{}{}
+% \stoptextbackground
+% \readfile{ward}{}{}
+% \stoptextbackground
+
+\def\dostarttextbackground[#1][#2]%
+ {\checktextbackgrounds
+ \def\currenttextbackground{#1}%
+ \global\advance\nofparbackgrounds\plusone
+ \edef\currentparbackground{pbg:\number\nofparbackgrounds}%
+% \bgroup
+% \advance\nofparbackgrounds\plusone
+% \xdef\nextparbackground{pbg:\number\nofparbackgrounds}%
+% \egroup
+ \xdef\nextparbackground{pbg:\number\numexpr\nofparbackgrounds+\plusone\relax}% still xdef ?
+ % todo : \synchonizepositionpage{b:\currentparbackground}{s:\currentparbackground}%
+ \setuptextbackground[#1][#2]%
+ \let\dodostarttextbackground\relax
+ \let\dodostoptextbackground \relax
+ \doif{\textbackgroundparameter\c!state}\v!start{\dopresettextbackground{#1}}%
+ \dodostarttextbackground}
+
+% todo \backgroundvariable\c!variant
+
+\def\dopresettextbackground#1% todo: \backgroundparameter
+ {\ExpandFirstAfter\processaction % \EFA niet echt nodig
+ [\textbackgroundparameter\c!location]
+ [ \v!text=>\let\dodostarttextbackground\dostarttextbackgroundtxt
+ \let\dodostoptextbackground \dostoptextbackgroundtxt,
+ \v!paragraph=>\let\dodostarttextbackground\dostarttextbackgroundpar
+ \let\dodostoptextbackground \dostoptextbackgroundpar,
+ \v!none=>\let\dodostarttextbackground\relax
+ \let\dodostoptextbackground \relax]%
+ \ifx\dodostarttextbackground\dostarttextbackgroundpar % untested
+ \ifnum\textbackgrounddepth>\plusone % new
+ \let\dodostarttextbackground\dostarttextbackgroundtxt
+ \let\dodostoptextbackground \dostoptextbackgroundtxt
+ \fi
+ \fi
+ \doifelse{\textbackgroundparameter\c!frame}\v!on
+ {\doifelse{\textbackgroundparameter\c!corner}\v!round
+ {\setvalue{\??td#1\c!frame}{2}}
+ {\setvalue{\??td#1\c!frame}{1}}}
+ {\setvalue{\??td#1\c!frame}{0}}%
+ \doifelse{\textbackgroundparameter\c!background}\v!color
+ {\setvalue{\??td#1\c!background}{1}}
+ {\setvalue{\??td#1\c!background}{0}}%
+ %\startpositionoverlay{\v!text\getvalue{\??td#1\c!level}}%
+ \startpositionoverlay{\textbackgroundoverlay{\textbackgroundparameter\c!level}}%
+ \expanded
+ {\setMPpositiongraphicrange % moet veel efficienter
+ {\btbanchor}% {b:\currentparbackground}%
+ {\etbanchor}% {e:\currentparbackground}%
+ {\textbackgroundparameter\c!method}%
+ {self=\currentparbackground,
+ mp=\textbackgroundparameter\c!mp,
+ gridtype=\textbackgroundparameter\c!alternative,
+ filltype=\textbackgroundparameter\c!background,
+ linetype=\textbackgroundparameter\c!frame,
+ dashtype=\textbackgroundparameter{dash}, % to be internationalized
+ gridcolor=\textbackgroundparameter\c!framecolor,
+ linecolor=\textbackgroundparameter\c!framecolor,
+ lineoffset=\textbackgroundparameter\c!frameoffset,
+ fillcolor=\textbackgroundparameter\c!backgroundcolor,
+ filloffset=\textbackgroundparameter\c!backgroundoffset,
+ gridwidth=\textbackgroundparameter\c!rulethickness,
+ gridshift=\textbackgroundparameter\c!voffset,
+ linewidth=\textbackgroundparameter\c!rulethickness,
+ lineradius=\textbackgroundparameter\c!radius}}%
+ \stoppositionoverlay}
+
+\def\stoptextbackground
+ {\dodostoptextbackground
+ \carryoverpar\egroup}
+
+\def\starttextbackgroundmanual
+ {\dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty
+ \fpos\currentparbackground\ignorespaces}
+
+\def\stoptextbackgroundmanual
+ {\tpos\currentparbackground
+ \dostopattributes}
+
+\def\dostarttextbackgroundtxt
+ {\ifvmode \dontleavehmode \fi % was leavevmode, brrr
+ \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty
+ \fpos\currentparbackground\ignorespaces}
+
+\def\dostoptextbackgroundtxt
+ {\tpos\currentparbackground
+ \dostopattributes}
+
+% keep this simple one, it's used in prikkels and alike
+%
+% \def\dostarttextbackgroundpar
+% {\endgraf % new
+% \getvalue{\??td\currenttextbackground\c!before}%
+% \noindent\fpos\currentparbackground\ignorespaces
+% \bgroup
+% \nobreak \vskip-\lineheight \nobreak
+% \doassignsomeskip\getvalue{\??td\currenttextbackground\c!topoffset}\to\scratchskip
+% \kern\scratchskip\nobreak
+% \dosetleftskipadaption{\getvalue{\??td\currenttextbackground\c!leftoffset}}%
+% \advance\leftskip\leftskipadaption
+% \dosetleftskipadaption{\getvalue{\??td\currenttextbackground\c!rightoffset}}%
+% \advance\rightskip\leftskipadaption
+% \dostartattributes{\??td\currenttextbackground}\c!style\c!color{}%
+% \nowhitespace
+% \seteffectivehsize
+% \par}
+%
+% \def\dostoptextbackgroundpar
+% {\par
+% \dostopattributes
+% \doassignsomeskip\getvalue{\??td\currenttextbackground\c!bottomoffset}\to\scratchskip
+% \kern\scratchskip\nobreak
+% \nobreak \vskip-\lineheight \nobreak
+% \nowhitespace
+% \egroup
+% \nobreak \noindent \strut \hfill \kern\zeropoint \tpos\currentparbackground
+% \endgraf % new
+% \getvalue{\??td\currenttextbackground\c!after}}
+
+\newskip\textbackgroundskip
+
+\def\dostarttextbackgroundpar
+ {\endgraf % new
+ \textbackgroundparameter\c!before
+ \noindent
+ \ifgridsnapping
+ \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
+ \ifdim\textbackgroundskip>\zeropoint
+ \struttedbox{\hbox{\raise\textbackgroundskip\hbox{\fpos\currentparbackground}}}%
+ \else
+ \fpos\currentparbackground
+ \fi
+ \else
+ \fpos\currentparbackground
+ \fi
+ \bgroup
+ \endgraf % we need a vertical nobreak - 29/06/2004
+ \nobreak \vskip-\lineheight \nobreak
+ \ifgridsnapping \else
+ \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
+ \ifdim\textbackgroundskip>\zeropoint
+ \kern\textbackgroundskip\nobreak
+ \fi
+ \fi
+ \dosetleftskipadaption{\textbackgroundparameter\c!leftoffset}%
+ \advance\leftskip\leftskipadaption
+ \dosetleftskipadaption{\textbackgroundparameter\c!rightoffset}%
+ \advance\rightskip\leftskipadaption
+ % new
+ \dosetraggedcommand{\textbackgroundparameter\c!align}%
+ \raggedcommand
+ %
+ \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty
+ \nowhitespace
+\nobreak % new per 23/04/2006 (else potential break when whitespace)
+ \seteffectivehsize
+ \doinhibitblank % \blank[\v!disable]% new
+ \par}
+
+\def\dostoptextbackgroundpar
+ {\par
+ \removelastskip % new
+ \dostopattributes
+ \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
+ \ifdim\lastskip>\zeropoint
+ \advance\textbackgroundskip-\lastskip
+ \fi
+ \ifgridsnapping \else \ifdim\textbackgroundskip>\zeropoint
+ \kern\textbackgroundskip\nobreak
+ \fi \fi
+ \nobreak \vskip-\lineheight \nobreak
+ \nowhitespace
+ \egroup
+\bgroup \forgeteverypar % NOT REALLY NEEDED, SAVES HASH/MEM
+ \nobreak \noindent \strut \hfill \kern\zeropoint
+ \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
+ \ifgridsnapping % experimental, pascal (todo: topoffset in same way)
+ \ifdim\textbackgroundskip>\zeropoint
+ \struttedbox{\hbox{\lower\textbackgroundskip\hbox{\tpos\currentparbackground}}}%
+ \else
+ \tpos\currentparbackground
+ \fi
+ \else
+ \tpos\currentparbackground
+ \fi
+\egroup
+ \endgraf % new
+ \textbackgroundparameter\c!after}
+
+\let\textparpages \!!zeropoint
+\let\textparheight\!!zeropoint
+\let\textparwidth \!!zeropoint
+
+\def\calculatetextpardimensions
+ {\docalculatetextpardimensions\btbanchor \etbanchor \MPparanchor}
+
+\def\calculatenexttextpardimensions
+ {\docalculatetextpardimensions\nextbtbanchor\nextetbanchor\relax}
+
+\def\docalculatetextpardimensions#1#2#3% todo: dimexpr
+ {\scratchcounter\MPp#2%\etbanchor
+ \advance\scratchcounter-\MPp#1%\btanchor
+ \edef\textparpages{\the\scratchcounter}%
+ \ifcase\scratchcounter
+ % one page
+ \scratchdimen \MPy#1%\btanchor
+ \advance\scratchdimen-\MPy#2%\etbanchor
+ \else
+ % two or more pages
+ \scratchdimen \MPy#1%\btanchor
+ \advance\scratchdimen-\MPy#2%\etbanchor
+ \advance\scratchdimen-\MPy\textanchor
+ \advance\scratchdimen \MPy\textanchor % - and then + ?
+ \advance\scratchdimen \MPh\textanchor\relax
+ \ifcase\scratchcounter>2 \ifnum\scratchcounter<5
+ % more pages
+ \scratchdimen\textheight
+ \advance\scratchcounter \minusone
+ \multiply\scratchdimen \scratchcounter
+ \else
+ % keep'm small
+ \scratchdimen5\textheight
+ \fi \fi
+ \fi
+ \edef\textparheight{\the\scratchdimen}%
+ \ifcase\scratchcounter
+ % one page
+ \scratchdimen \MPx#2%\etbanchor
+ \advance\scratchdimen-\MPx#1%\btanchor
+ \else
+ % two or more pages / maybe also hang
+ \ifx#3\relax
+ \scratchdimen\makeupwidth % \textwidth
+ \else
+ \scratchdimen\MPw\MPparanchor
+ \advance\scratchdimen-\MPl\MPparanchor
+ \advance\scratchdimen-\MPr\MPparanchor
+ \fi
+ \fi
+ \edef\textparwidth{\the\scratchdimen}}
+
+\def\mintextparheight{4\lineheight}
+
+\def\dontsplitnexttextbackground % dangerous but useful
+ {\ifdim\pagetotal>\textheight \else
+ \ifdim\pagegoal=\maxdimen \else
+ \calculatenexttextpardimensions
+ % too tricky
+ % \scratchdimen=\textparheight
+ % \advance\scratchdimen\pagetotal\relax
+ % \ifdim\scratchdimen>\pagegoal
+ % \page
+ % \fi
+ \ifdim\textparheight>\zeropoint
+ \ifdim\textparheight>\mintextparheight\else
+ \page % option
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def\definetextbackground
+ {\dodoubleempty\dodefinetextbackground}
+
+\def\dodefinetextbackground[#1][#2]%
+ {\ifsecondargument % why ?
+ \copyparameters[\??td#1][\??td]
+ [\c!state,\c!location,\c!alternative,\c!mp,\c!method,
+ \c!background,\c!backgroundcolor,\c!corner,\c!level,
+ \c!backgroundoffset,\c!before,\c!after,\c!align,dash, % dash not yet internationalized
+ \c!radius,\c!frame,\c!framecolor,\c!rulethickness,\c!voffset,\c!frameoffset,
+ \c!leftoffset,\c!rightoffset,\c!topoffset,\c!bottomoffset]%
+ \getparameters[\??td#1][#2]%
+ \doifvalue{\??td#1\c!state}\v!start\checktextbackgrounds
+ \unexpanded\setvalue{#1}%
+ {\groupedcommand{\starttextbackground[#1]}{\stoptextbackground}}%
+ \setvalue{\e!start#1}{\starttextbackground[#1]}%
+ \setvalue{\e!stop #1}{\stoptextbackground}%
+ \fi}
+
+\def\setuptextbackground
+ {\dodoubleargument\dosetuptextbackground}
+
+\def\dosetuptextbackground[#1][#2]%
+ {\ifsecondargument
+ \doifelsenothing{#1}
+ {\dodosetuptextbackground{#2}\empty}
+ {\processcommalist[#1]{\dodosetuptextbackground{#2}}}%
+ \else
+ \dodosetuptextbackground{#1}\empty
+ \fi}
+
+\def\dodosetuptextbackground#1#2%
+ {\getparameters[\??td#2][#1]%
+ \def\currenttextbackground{#2}%
+ \doifvalue{\??td#2\c!state}\v!start\checktextbackgrounds}
+
+\let\currenttextbackground\empty
+
+\def\checktextbackgrounds
+ {\ifproductionrun
+ \enabletextarearegistration
+ \enablehiddenbackground
+ \fi}
+
+\setuptextbackground
+ [\c!mp=mpos:par:columnset, % buggy: mpos:par:shape
+ \c!method=mpos:par:columnset, %
+ \c!state=\v!start,
+ \c!location=\v!text,
+ \c!leftoffset=\!!zeropoint, % 1em,
+ \c!rightoffset=\textbackgroundparameter\c!leftoffset,
+ \c!topoffset=\!!zeropoint, % \v!medium,
+ \c!bottomoffset=\textbackgroundparameter\c!topoffset,
+ \c!level=-1,
+ \c!alternative=0,
+ \c!align=,
+ dash=0, % to be internationalized
+ \c!background=\v!color,
+ \c!backgroundcolor=lightgray,
+ \c!backgroundoffset=\!!zeropoint,
+ \c!corner=\v!rectangular,
+ \c!radius=.5\bodyfontsize,
+ \c!voffset=\!!zeropoint,
+ \c!frame=\v!on,
+ \c!framecolor=blue,
+ \c!rulethickness=\linewidth]
+
+%D As an example we define a grid background:
+
+\definetextbackground
+ [\v!grid]
+ [\c!state=\v!stop,
+ \c!location=\v!paragraph,
+ \c!frame=\v!off,
+ \c!framecolor=red,
+ \c!background=,
+ \c!alternative=1]
+
+\ifx\basegrid\undefined \else \letvalue\v!grid=\basegrid \fi
+
+% lelijk, aanpassen, opties
+
+\setupMPvariables
+ [mpos:connect]
+ [linecolor=red,
+ linewidth=1pt]
+
+\setupMPvariables
+ [mpos:encircle]
+ [fillcolor=lightgray,
+ filloffset=\!!zeropoint,
+ linecolor=blue,
+ linewidth=1pt]
+
+\startuseMPgraphic{mpos:common:ec}
+ path pa ; pair ca ; color lc ; numeric lw ;
+ lw := \MPvar{linewidth} ;
+ lc := \MPvar{linecolor} ;
+ initialize_box(\MPpos{\MPvar{self}}) ;
+ pa := pxy ; ca := cxy ; pa := boundingbox pa enlarged 2lw ;
+ pa := llcorner pa...lrcorner pa...urcorner pa...ulcorner pa...cycle ;
+ drawoptions (withpen pencircle scaled lw withcolor lc) ;
+\stopuseMPgraphic
+
+\startMPpositiongraphic{mpos:encircle}{linecolor,fillcolor,linewidth}
+ \includeMPgraphic{mpos:common:ec}
+ fill pa withcolor \MPvar{fillcolor} ; draw pa ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\startMPpositiongraphic{mpos:connect}{linecolor,linewidth}
+ path pb, pc ; pair cb, cc ;
+ \includeMPgraphic{mpos:common:ec}
+ initialize_box(\MPpos{\MPvar{to}}) ;
+ pb := pxy ; cb := cxy ; pb := boundingbox pb enlarged 2lw ;
+ pb := llcorner pb...lrcorner pb...urcorner pb...ulcorner pb...cycle ;
+ pc := ca {up} .. {down} cb ;
+ cc := (pc intersection_point pa) ;
+ if intersection_found :
+ pc := pc cutbefore cc ;
+ cc := (pc intersection_point pb) ;
+ if intersection_found :
+ pc := pc cutafter cc ;
+ drawarrow pc ; drawarrow reverse pc ;
+ fi ;
+ fi ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+%D \macros
+%D {stackposdown, stackposup, stackposleft,stackposright}
+%D
+%D A non graphic example of the use of positioning, is to stack
+%D text in for instance the margin.
+%D
+%D \stackposdown \inleft {some text}The text \type {some text}
+%D goes into the left margin, and \stackposdown \inleft {some
+%D more}\type {some more} as well. When they overlap, they
+%D will not touch.
+%D
+%D Here we said \type {\stackposdown \inleft{some text}}. Instead
+%D of \stackposleft \inleft {one}stacking \stackposleft \inleft
+%D {two}vertically, one can stack horizontally by \stackposleft
+%D \inleft {three}using \type {\stackposleft}.
+%D
+%D We can go in all four directions, using \type {\stackposdown},
+%D \type {\stackposup}, \type {\stackposleft} and \type
+%D {\stackposright}.
+
+\def\stackposdistance{.5em}
+
+\newcount\currentautopos
+\newcount\previousautopos
+
+\def\POSstackprefix{stack:}
+
+\def\dostackposbox#1#2%
+ {\dowithnextbox
+ {#2{\previousautopos\currentautopos
+ \global\advance\currentautopos\plusone
+ \edef\currentposition {\POSstackprefix\number\currentautopos}%
+ \edef\previousposition{\POSstackprefix\number\previousautopos}%
+ \hpos\currentposition{\doifoverlappingelse\currentposition\previousposition{#1}{\flushnextbox}}}}%
+ \hbox}
+
+\def\stackposup {\dostackposbox{\raise\lineheight\flushnextbox}}
+\def\stackposdown {\dostackposbox{\lower\lineheight\flushnextbox}}
+\def\stackposleft {\dostackposbox{\copy\nextbox\hskip\nextboxwd\hskip\stackposdistance}}
+\def\stackposright{\dostackposbox{\hskip\stackposdistance\hskip\nextboxwd\flushnextbox}}
+
+%D \macros
+%D {stackeddown}
+%D
+%D However, a better implementation is possible with the
+%D following macro. We now have an extra key \type {stack} for
+%D margin settings. When set to \type {yes}, this macro comes
+%D into action.
+
+% Because there can be many stacked items in a line and successive lines, we
+% play dirty and adapt the position and height of the current node so that
+% this becomes visible to a next pass.
+%
+% \startbuffer
+% \inleft {test 1} test 1 \inleft {test 2} test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1} test 1 \inleft {test 2} test 2 \inleft {test 3} test 3 \endgraf
+% \inleft {test 4} test 4
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1} test 1 \endgraf
+% \inleft {test 2} test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1\\test 1} test 1 \inleft {test 2} test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1\\test 1\\test 1\\test 1\\test 1} test 1 \endgraf
+% test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft{test 1} test \inleft{test 2} test \inleft{test 3\\test 3} test
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test \endgraf
+% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+
+\newdimen\laststackvmove % use \scratchdimenone instead of skip
+
+\def\stackeddown
+ {\bgroup
+ % this macro assumes a few things and is meant to work for margin notes
+ \dowithnextbox
+ {\global\advance\currentautopos\plusone
+ \global\laststackvmove\zeropoint
+ \hpos{\POSstackprefix\number\currentautopos}
+ {\edef\next
+ {\nextboxht\the\nextboxht
+ \nextboxdp\the\nextboxdp
+ \nextboxwd\the\nextboxwd}%
+ \previousautopos\currentautopos
+ \scratchdimen\zeropoint
+ \scratchcounter\zerocount
+ \doloop
+ {\advance\previousautopos\minusone
+ \edef\currentposition {\POSstackprefix\number\currentautopos}%
+ \edef\previousposition{\POSstackprefix\number\previousautopos}%
+ \ifnum\MPp\currentposition=\MPp\previousposition\relax
+ %\registerstatus{doing \number\currentautopos/\number\previousautopos}%
+ \doifoverlappingelse\currentposition\previousposition
+ {\scratchskip\dimexpr
+ \MPy\currentposition
+ -\MPy\previousposition
+ -\MPd\currentposition % untested
+ +\MPd\previousposition % untested
+ +\MPh\currentposition
+ \relax\relax % second relax realy needed, forgotten while dimexpressing
+ % todo: also take depth into account
+ \ifdim\scratchskip<\scratchdimen
+ %\registerstatus{no \the\scratchskip}%
+ \else
+ %\registerstatus{yes \the\scratchskip}%
+ \scratchdimen\scratchskip
+ \fi}%
+ \donothing % {\registerstatus{next}}%
+ \ifnum\previousautopos<\zerocount\exitloop\fi
+ \else
+ \exitloop
+ \fi}%
+ \ifdim\scratchdimen=\zeropoint \else
+ \bgroup
+ \edef\currentposition{\POSstackprefix\number\currentautopos}%
+ \scratchskip\scratchdimen
+ \advance\scratchskip\MPh\currentposition
+ \scratchdimen-\scratchdimen
+ \advance\scratchdimen\MPy\currentposition
+ %\registerstatus{old \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
+ \expanded{\replacepospxywhd
+ {\currentposition}{\MPp\currentposition}{\MPx\currentposition}{\the\scratchdimen}%
+ {\MPw\currentposition}{\the\scratchskip}{\MPd\currentposition}}%
+ %\registerstatus{new \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
+ \egroup
+ \global\laststackvmove\scratchdimen % new
+ \setbox\nextbox\iftracepositions\@EA\ruledhbox\else\@EA\hbox\fi
+ {\lower\scratchdimen\flushnextbox}%
+ \next
+ %\registerstatus{\strut}%
+ \fi
+ \flushnextbox}%
+ \egroup}}
+
+%D The next hack make sure that margin texts near faulty
+%D strutted lines are handled ok.
+
+\newif\ifrepositionmarginbox \repositionmarginboxtrue
+
+\newcount\currentmarginpos
+
+\def\dopositionmarginbox#1%
+ {\bgroup
+ \ifrepositionmarginbox
+ \global\advance\currentmarginpos\plusone
+ %\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 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
+ \scratchdimen\noflines\lineheight
+ \else
+ \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax
+ \fi
+ \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}%
+ \fi
+ \dp#1\zeropoint
+ \ht#1\zeropoint
+ \fi
+ \graphicvadjust{\box#1}%
+ \egroup}
+
+\chardef\marginrepositionmethod\plusone % sidemethod
+\chardef\margincontentmethod \plusthree % textmethod % beware: 1 = old method
+\chardef\marginpagecheckmethod \plusone % splitmethod
+
+%D For a right menu, a sequence of calls to \type
+%D {right_menu_button} is generated.
+%D
+%D \starttyping
+%D right_menu_button (n, p, s=0/1/2, x, y, w, h, d) ;
+%D \stoptyping
+%D
+%D Here, n is the number of the button, s a status variable,
+%D while the rest is positional info. The status variable is
+%D 0, 1 or~2: not found, found and found but current page.
+
+% 0=not found 1=found 2=current page
+
+% geen leeg
+
+\newtoks\MPmenutoks
+
+\def\MPmenubuttons#1{\the\MPmenutoks}
+
+\appendtoks \global\MPmenutoks\emptytoks \to \everyshipout
+
+% 0=notfound 1=found 2=currentpage
+
+\def\do@@amposition#1#2#3%
+ {\doifelsevalue{\??am#1\c!position}\v!yes
+ {\doglobal\increment\currentamposition
+ \doifnumberelse{#2}
+ {\docheckrealreferencepage{#2}%
+ \global\chardef\currentamrealpage\ifrealreferencepage2\else1\fi}
+ {\doifreferencefoundelse{#2}
+ {\global\chardef\currentamrealpage\ifrealreferencepage2\else1\fi}
+ {\global\chardef\currentamrealpage0}}% % not found
+ \expanded
+ {\doglobal\noexpand\appendtoks
+ #1_menu_button(\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ;
+ \to \MPmenutoks}%
+ \hpos{#1:\currentamposition}{#3}}
+ {#3}}
+
+\def\do@@ammenuposition#1%
+ {\ifnum\currentamposition>0
+ \dowithnextbox{\hpos{menu:#1:\realfolio}{\flushnextbox}}\hbox
+ % \hpos{menu:#1:\realfolio} % also ok if we skip over fi
+ \fi}
+
+%D \macros
+%D {GFC, GTC, GSC}
+%D
+%D The next macros extend tables and tabulation with
+%D backgrounds and position related features. Areas are
+%D specified with symbolic names, and symbolic references to
+%D the graphics involved. Each table has its own namespace.
+
+\newcount\noftabpositions
+\newtoks \posXCtoks
+
+\def\tbPOSprefix
+ {tbp:\number\noftabpositions:}
+
+\def\tablepos
+ {\scratchtoks\posXCtoks
+ \global\posXCtoks\emptytoks
+ \the\scratchtoks}
+
+\let\tabulatepos\tablepos
+
+\def\dodododoGSC[#1:#2]%
+ {\remappositionframed{#2}{\tbPOSprefix#1}%
+ \bpos{\tbPOSprefix#1}%
+ \doglobal\appendtoks\@EA\epos\@EA{\tbPOSprefix#1}\to\posXCtoks}
+
+\def\dododoGSC[#1:#2:#3]%
+ {\doglobal\appendtoks\dodododoGSC[#1:#2]\to\posXCtoks\NC}
+
+\def\dodoGSC[#1]%
+ {\def\docommand##1{\dododoGSC[##1:##1]}%
+ \processcommalist[#1]\docommand}
+
+\def\dodododoGFC[#1:#2:#3]%
+ {\remappositionframed{#2}{\tbPOSprefix#1}%
+ \bpos{\tbPOSprefix#1}}
+
+\def\dododoGFC[#1]%
+ {\def\docommand##1{\dodododoGFC[##1:##1]}%
+ \processcommalist[#1]\docommand}
+
+\def\dodoGFC[#1]%
+ {\doglobal\appendtoks\dododoGFC[#1]\to\posXCtoks\NC}
+
+\def\dododododoGTC[#1:#2]%
+ {\epos{\tbPOSprefix#1}}
+
+\def\dodododoGTC[#1]%
+ {\def\docommand##1{\dododododoGTC[##1:##1]}%
+ \processcommalist[#1]\docommand}
+
+\def\dododoGTC[#1]%
+ {\doglobal\appendtoks\dodododoGTC[#1]\to\posXCtoks}
+
+\def\dodoGTC[#1]%
+ {\doglobal\appendtoks\dododoGTC[#1]\to\posXCtoks\NC}
+
+\def\dodododoXC[#1#2]%
+ {\if#1>\dodoGFC [#2:#2]\else
+ \if#1+\dodoGFC [#2:#2]\else
+ \if#1<\dodoGTC [#2:#2]\else
+ \if#1-\dodoGTC [#2:#2]\else
+ \if#1=\dodoGSC [#2:#2]\else
+ \dodoGSC[#1#2:#1#2]\fi\fi\fi\fi\fi}
+
+\def\dododoXC#1%
+ {\dodododoXC[#1]}
+
+\def\dodoXC[#1]%
+ {{\let\NC\relax\processcommalist[#1]\dododoXC}}
+
+\def\doGSC[#1]{\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi}
+\def\doGFC[#1]{\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi}
+\def\doGTC[#1]{\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi}
+\def\doXC [#1]{\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC}
+
+\def\tbGSC{\dosingleempty\doGSC}
+\def\tbGFC{\dosingleempty\doGFC}
+\def\tbGTC{\dosingleempty\doGTC}
+\def\tbXC {\dosingleempty\doXC }
+
+%D The amount of code to support tables and tabulation is
+%D rather minimalistic.
+
+\let\tabulatepos\tablepos
+
+\def\tabulatenormalpos
+ {\hss\tabulatepos\hss}
+
+\def\tabulateequalpos
+ {\setbox\scratchbox\hbox{\tabulateEQ}%
+ \hbox to \wd\scratchbox{\hss\kern\zeropoint\tabulatepos\hss}%
+ \hskip-\wd\scratchbox
+ \box\scratchbox}
+
+\def\tabulatenormalcolumn#1% overloaded
+ {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi
+ &\global\chardef\tabulatetype#1&}
+
+\def\tabulateequalcolumn#1% overloaded
+ {&\tabulateequalpos
+ &\global\chardef\tabulatetype#1&}
+
+\appendtoks
+ \global\advance\noftabpositions\plusone
+\to \everytabulate
+
+%D In order to prevent potential clashes with abbreviations,
+%D postpone the mapping.
+
+\appendtoks
+ \let\GSC\tbGSC \let\GFC\tbGFC \let\GTC\tbGTC \let\XC\tbXC
+\to \everytabulate
+
+%D \macros
+%D {definepositionframed}
+%D
+%D The next example show how to provide backgrounds to table
+%D cells. First we define some framed backgrounds.
+%D
+%D \startbuffer
+%D \definepositionframed[x][background=color,backgroundcolor=red]
+%D \definepositionframed[y][background=color,backgroundcolor=green]
+%D \definepositionframed[z][background=color,backgroundcolor=blue]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D % \getbuffer
+%D
+%D \startbuffer
+%D \starttabulate[|c|c|c|]
+%D \GFC[f:x] this is a small \NC table \NC in which we \NC \FR
+%D \NC will demonstrate \GFC[g:z] that this \GTC[g] positioning \NC \MR
+%D \GSC[e:y] mechanism also \GTC[f] works quite well \NC in tables \NC \LR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D The table itself defines three areas (a, b and~c) using
+%D these frames.
+%D
+%D \typebuffer
+%D % \getbuffer
+%D
+%D Tables (based on \TABLE) are supported by:
+
+\def\normalTABLEsimplebar {\unskip\!ttRightGlue&\tablepos&} % |
+\def\normalTABLEcomplexbar{\unskip\!ttRightGlue&\omit\tablepos\!ttAlternateVrule} % \|
+\def\normalTABLEquote {\unskip\!ttRightGlue&\omit\tablepos&} % "
+
+\appendtoks
+ \global\advance\noftabpositions\plusone
+\to \everytable
+
+%D Since we don't want nameclashes:
+
+\appendtoks
+ \let\GSC\tbGSC \let\GFC\tbGFC \let\GTC\tbGTC \let\XC\tbXC
+\to \everytable
+
+%D In the previous example, we could have provided an overlay to
+%D the framed definition. A more direct approach is demonstrated
+%D below:
+%D
+%D \startbuffer
+%D \def\cw#1{\color[white]{#1}}
+%D
+%D \startMPpositiongraphic{tableshade}
+%D initialize_area(\MPpos{\MPvar{from}},\MPpos{\MPvar{to}}) ;
+%D color c ; c := \MPvar{color} ;
+%D linear_shade(pxy,0,.4c,.9c) ;
+%D anchor_area(\MPanchor{\MPvar{from}}) ;
+%D \stopMPpositiongraphic
+%D
+%D \setMPpositiongraphic{b:x}{tableshade}{from=b:x,to=e:x,color=red}
+%D \setMPpositiongraphic{b:y}{tableshade}{from=b:y,to=e:y,color=green}
+%D \setMPpositiongraphic{b:z}{tableshade}{from=b:z,to=e:z,color=blue}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D The definition of the table looks about the same as the
+%D previous one:
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \GFC[b:z] \cw{this is a small} \NC \cw{table} \NC in which we \NC \FR
+%D \NC \cw{will demonstrate} \GFC[c:y] \cw{that this} \GTC[c] \cw{positioning} \NC \MR
+%D \GSC[a:x] \cw{mechanism also} \GTC[b] \cw{works quite well} \NC in tables \NC \LR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+% \definepositionframed[w][background=color,backgroundcolor=yellow]
+% \definepositionframed[x][background=color,backgroundcolor=red]
+% \definepositionframed[y][background=color,backgroundcolor=green]
+% \definepositionframed[z][background=color,backgroundcolor=blue]
+%
+% \starttabulate[|c|c|c|]
+% \NC this is a small \NC table \NC in which we \NC \FR
+% \NC will demonstrate \NC that this \NC positioning \NC \MR
+% \NC mechanism also \NC works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \GFC[f:x] this is a small \GTC table \NC in which we \NC \FR
+% \NC will demonstrate \GFC[g:z] that this \GTC[g] positioning \NC \MR
+% \GSC[e:y] mechanism also \GTC[f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \GFC[f:x,d:w] this is a small \GTC[d] table \NC in which we \NC \FR
+% \NC will demonstrate \GFC[g:z] that this \GTC[g] positioning \NC \MR
+% \GSC[e:y] mechanism also \GTC[f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \XC[+f:x] this is a small \XC table \NC in which we \NC \FR
+% \NC will demonstrate \XC[+g:z] that this \XC[-g] positioning \NC \MR
+% \XC[=e:y] mechanism also \XC[-f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \XC[+f:x,+d:w] this is a small \XC[-d] table \NC in which we \NC \FR
+% \NC will demonstrate \XC[+g:z] that this \XC[-g] positioning \NC \MR
+% \XC[=e:y] mechanism also \XC[-f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+
+% evt [b:x]
+%
+% \definepositionframed[x][background=color,fillcolor=red]
+% \definepositionframed[y][background=color,fillcolor=green]
+% \definepositionframed[z][background=color,fillcolor=blue]
+
+\def\remappositionframed#1#2% from to
+ {\copyposition{b:#1}{b:#2}%
+ \copyposition{e:#1}{e:#2}%
+ \dosetpositionaction{b:#2}{\dopositionaction{b:#1}}}
+
+\def\definepositionframed
+ {\dodoubleargument\dodefinepositionframed}
+
+\def\dodefinepositionframed[#1][#2]%
+ {\dosetpositionaction{b:#1}{\dopositionframed[#1][#2]}}
+
+\def\positionframed
+ {\dodoubleempty\dopositionframed}
+
+\def\dopositionframed[#1][#2]%
+ {\bgroup
+ \setbox\scratchbox\hbox
+ {\dimen0=\MPx{e:#1}%
+ \advance\dimen0 -\MPx{b:#1}%
+ \dimen2=\MPy{b:#1}%
+ \advance\dimen2 -\MPy{e:#1}%
+ \advance\dimen2 \MPd{e:#1}%
+ \lower\dimen2\hbox
+ {\advance\dimen2 \MPh{b:#1}%
+ \framed
+ [\c!width=\dimen0,\c!height=\dimen2,
+ \c!offset=\v!overlay,#2]{}}}%
+ \smashedbox\scratchbox
+ \egroup}
+
+% \def\sethdistances#1%
+% {\hbox{\lpos{ml:#1}\hpos{mh:#1}{\strut}\rpos{mr:#1}}}
+%
+% \def\gethdistances#1%
+% {\scratchdimen\MPx{mh:#1}%
+% \advance\scratchdimen -\MPx{ml#1}%
+% \edef\lefthdistance{\the\scratchdimen}%
+% \scratchdimen\MPx{mr:#1}%
+% \advance\scratchdimen -\MPx{mh:#1}%
+% \edef\righthdistance{\the\scratchdimen}}
+
+\protect \endinput
+
+% todo 1: shift down option
+
+% \startuseMPgraphic{mpos:par:columnset}
+% \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
+% path p ; p := boundingbox currentpicture ;
+% currentpicture := currentpicture shifted (0,-StrutDepth/2) ;
+% setbounds currentpicture to p ;
+% \stopuseMPgraphic
+
+\definetextbackground[underline] [location=text,alternative=1,background=,frame=off]
+\definetextbackground[overstrike] [location=text,alternative=2,background=,frame=off]
+\definetextbackground[exlines] [location=text,alternative=3,background=,frame=off]
+\definetextbackground[strikethrough][location=text,alternative=4,background=,frame=off]
+
+\definestartstop [underline]
+ [before={\starttextbackground[underline]},
+ after=\stoptextbackground]
+
+\definestartstop
+ [overstrike]
+ [before={\starttextbackground[overstrike]},
+ after=\stoptextbackground]
+
+\definestartstop
+ [exlines]
+ [before={\starttextbackground[exlines]},
+ after=\stoptextbackground]
+
+\definestartstop
+ [strikethrough]
+ [before={\starttextbackground[strikethrough]},
+ after=\stoptextbackground]
+
+\definetextbackground
+ [sideline]
+ [mp=mpos:par:sideline,
+ location=paragraph,
+ framecolor=red,
+ frameoffset=5mm]
+
+\definestartstop [sideline]
+ [before={\starttextbackground[sideline]},
+ after=\stoptextbackground]
+
+\starttext
+ \startunderline \input tufte \stopunderline \blank
+ \startoverstrike \input tufte \stopoverstrike \blank
+ \startexlines \input tufte \stopexlines \blank
+ \startstrikethrough \input tufte \stopstrikethrough \blank
+ \startsideline \input tufte \stopsideline \blank
+\stoptext
diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv
new file mode 100644
index 000000000..248b9ca5e
--- /dev/null
+++ b/tex/context/base/anch-pgr.mkiv
@@ -0,0 +1,1727 @@
+%D \module
+%D [ file=anch-pgr, % split off core-pos
+%D version=1999.08.01,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Positioning Graphics,
+%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 Anchoring Macros / Grapics}
+
+%D Before we come to graphics support, we have to make sure of
+%D the reference point on the page. The next macro does so and
+%D is hooked into the page building routine.
+
+%D I will speed up this module when I have a proper torture
+%D test file.
+
+\unprotect
+
+% in the future, the depth of tail will reflect page depth
+
+\ifx\textheight\undefined \def\textheight{\vsize} \fi
+
+%D The next macros so some housekeeping.
+
+\def\pageanchor{page:0} % for the moment only one pagesize
+\def\textanchor{text:\the\realpageno}
+\def\headanchor{head:\the\realpageno} % virtual position
+\def\tailanchor{tail:\the\realpageno} % virtual position
+
+%D Anchors:
+
+\def\dopresetpositionanchors % also mkii
+ {\bgroup
+ \!!dimena\ifdim\topskip>\strutht\topskip\else\strutht\fi
+ \!!dimenb\dimexpr\MPy\textanchor+\MPh\textanchor-\!!dimena\relax
+ \!!dimenc\dimexpr\MPy\textanchor+\strutdp\relax
+ \!!dimend\MPx\textanchor
+ \!!dimene\MPw\textanchor
+ \replacepospxywhd\headanchor\realfolio\!!dimend\!!dimenb\!!dimene\!!dimena\strutdp
+ \replacepospxywhd\tailanchor\realfolio\!!dimend\!!dimenc\!!dimene\strutht \strutdp
+ \egroup}
+
+\def\presetpositionanchors% compatibility hack (still needed?)
+ {\ifpositioning
+ \dopresetpositionanchors
+ \fi}
+
+%D The first version of this module implemented head and tail
+%D anchors. Currently we stick to just one anchor and derive
+%D the head and tail anchors from this one.
+
+\def\showanchor#1%
+ {\expanded{\writestatus{#1}
+ {\MPp{#1}\string|\MPx{#1}\string|\MPy{#1}\string|%
+ \MPw{#1}\string|\MPh{#1}\string|\MPd{#1}}}}
+
+%D We set these anchors before and after each page.
+
+\appendtoks \presetpositionanchors \to \beforeeverypage
+\appendtoks \presetpositionanchors \to \aftereverypage
+
+% todo: change with each page size change
+
+\def\registerpageposition#1% this one is flushed first !
+ {\ifpositioning\ifcase\realpageno\or
+ \ifdim\printpaperheight=\paperheight\else
+ \ifdim\printpaperwidth=\paperwidth\else
+ \setbox#1\hbox{\hpos\pageanchor{\box#1}}%
+ \fi
+ \fi
+ \fi\fi}
+
+\unexpanded\def\placepositionanchors % todo : depth pagebox
+ {\ifpositioning
+ \setbox\scratchbox\vbox to \textheight
+ {\simpletopskipcorrection
+ \hbox{\strut\dopositionaction\headanchor}%
+ \vfill
+ \hbox{\strut\dopositionaction\tailanchor}}%
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\makeupwidth % not \zeropoint, else wrong text backgrounds
+ \hpos\textanchor{\box\scratchbox}%
+ \else
+ \vskip\textheight
+ \fi}
+
+%D \macros
+%D {positionoverlay,startpositionoverlay}
+%D
+%D As long as we're dealing with graphics it makes much sense
+%D to use the available overlay mechanism. For this purpose, we
+%D define some dedicated overlay extensions.
+%D
+%D \startbuffer[sample]
+%D \defineoverlay [sample] [\positionoverlay{sample}]
+%D
+%D \startpositionoverlay{sample}
+%D \setMPpositiongraphic{A-1}{connectcenter}{from=A-1,to=A-2}
+%D \stoppositionoverlay
+%D \stopbuffer
+%D
+%D \typebuffer[sample]
+%D
+%D \startbuffer[graphic]
+%D \startMPpositiongraphic{connectcenter}
+%D path pa, pb ; pair ca, cb ;
+%D initialize_box(\MPpos{\MPvar{from}}) ; pa := pxy ; ca := cxy ;
+%D initialize_box(\MPpos{\MPvar{to}}) ; pb := pxy ; cb := cxy ;
+%D draw pa withcolor red ;
+%D draw pb withcolor red ;
+%D draw ca -- cb withcolor blue ;
+%D anchor_box(\MPanchor{\MPvar{from}}) ;
+%D \stopMPpositiongraphic
+%D \stopbuffer
+%D
+%D We can best demonstrate this in an example, say:
+%D
+%D \startbuffer[text]
+%D \framed
+%D [backgroundachtergrond=sample,align=middle,width=7cm]
+%D {We want to connect \hpos {A-1} {this} word with its
+%D grammatical cousin \hpos {A-2} {that}.}
+%D \stopbuffer
+%D
+%D \typebuffer[text]
+%D
+%D \startlinecorrection
+%D %\getbuffer[graphic,sample,text]
+%D \stoplinecorrection
+%D
+%D The graphic is defined in the following way, using some
+%D macros defined in an auxiliary \METAPOST\ module that is
+%D preloaded.
+%D
+%D \typebuffer[graphic]
+
+\def\MPanchoridentifier{mpa} % {mp-anchor}
+\def\MPoverlayposprefix{MO::}
+
+% obsolete and wrong anyway
+%
+% \long\unexpanded\def\defineMPpositiongraphic#1%
+% {\long\setvalue{\MPoverlayposprefix#1}}
+
+%D The rest of the definitions concerning such overlays may
+%D look complicated,
+
+\let\currentpositionoverlay\empty
+
+%D Position actions are automatically executed when a position
+%D is set.
+
+\let\MPanchornumber\realfolio
+
+\def\positionoverlay#1% the test prevents too many redundant positions
+ {\ifpositioning % in (not used) text* position layers
+ \vbox to \overlayheight
+ {\doifpositionactionelse{#1::\MPanchoridentifier}%
+ {\edef\MPanchorid{#1::\MPanchoridentifier:\MPanchornumber}%
+ \edef\MPanchor##1{\MPpos{\MPanchorid}}%
+ \the\everyinsertpositionaction
+ \copyposition{#1::\MPanchoridentifier}{#1::\MPanchoridentifier:\MPanchornumber}%
+ \hpos
+ {#1::\MPanchoridentifier:\MPanchornumber}%
+ % this is ok
+ %{\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}%
+ \ht\scratchbox\overlayheight
+ \dp\scratchbox\zeropoint
+ \box\scratchbox}}%
+ {\hbox to \overlaywidth{\hss}}%
+ \vfill}%
+ \fi}
+
+\unexpanded\def\startpositionoverlay#1%
+ {\iftrialtypesetting % we don't want redundant entries in the list
+ \@EA\gobbleuntil\@EA\stoppositionoverlay
+ \else
+ \def\currentpositionoverlay{#1}%
+ \fi}
+
+\unexpanded\def\stoppositionoverlay
+ {\let\currentpositionoverlay\empty}
+
+\def\resetpositionoverlay#1%
+ {\dosetpositionaction{#1::\MPanchoridentifier::}{}}
+
+%D Here the complication has to do with collecting actions
+%D for later execution. This collection is especially handy
+%D when we want to move actions to a specific layer.
+%D Such series of actions are stored in a macro (the one
+%D with the funny \type {++}) which is cleaned up after each
+%D invocation.
+
+\newtoks\everycleanpositionaction
+\newtoks\everyinsertpositionaction
+
+\def\cleanuppositionaction#1% not in trialtypesetting
+ {\ifcsname\POSactionprefix#1++\endcsname
+ \the\everycleanpositionaction
+ \iflocalpositioning
+ \letgvalue{\POSactionprefix#1++}\empty
+ \else
+ \setxvalue{\POSactionprefix#1++}{\getvalue{\POSactionprefix#1++}}%
+ \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
+ \edef\!!stringa{#3}% no layer, just pos itself as anchor
+ \else
+ \edef\!!stringa{\currentpositionoverlay::\MPanchoridentifier}%
+ \fi
+ \edef\!!stringc{\POSactionprefix\!!stringa++}%
+ \expanded{\dosetpositionaction{\!!stringa}{\noexpand\getvalue{\!!stringc}}}%
+ \global\let#1\relax
+ \edef\!!stringb{\executeifdefined\!!stringc\empty}%
+ \setxvalue\!!stringc{\!!stringb#1#2}%
+ \egroup}
+
+%D The indirectness enables us redefine macros for special
+%D purposes, like a cleanup.
+
+\def\handlepositionboxes#1#2#3%
+ {\handlepositionaction\dohandlepositionboxes\with{#1}{#2}{#3}\on{#2}}
+
+\def\doinsertpositionboxes#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}=\realpageno\relax % can be sped up
+ \executeifdefined{\MPoverlayposprefix#1}\gobblethreearguments{#1}{#2}{#3}%
+ \fi}
+
+\appendtoks
+ \let\dohandlepositionboxes\doinsertpositionboxes % was handle ?
+\to \everyinsertpositionaction
+
+\def\docleanpositionboxes#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}<\realpageno \else
+ \noexpand \dohandlepositionboxes{#1}{#2}{#3}% reinsert
+ \fi}
+
+\appendtoks
+ \let\dohandlepositionboxes\docleanpositionboxes
+\to \everycleanpositionaction
+
+%D A position graphic is a normal (non||reused) \METAPOST\
+%D graphic, used immediately, with zero dimensions, so that a
+%D sequence of them does not harm.
+
+\newbox\positiongraphicbox
+
+\def\startMPpositiongraphic % id setups
+ {\dodoublegroupempty\dostartMPpositiongraphic}
+
+\long\def\dostartMPpositiongraphic#1#2#3\stopMPpositiongraphic
+ {\long\setgvalue{MPG:#1}% tag list mpcode
+ {\useMPpositiongraphic{#1}{#2}{#3}}}
+
+\let\stopMPpositiongraphic\relax
+
+\def\prepareMPpositionvariables
+ {\ifcsname\@@meta self\endcsname\else\setvalue{\@@meta self}{\currentposition}\fi
+ \ifcsname\@@meta from\endcsname\else\setvalue{\@@meta from}{\currentposition}\fi}
+
+\long\def\useMPpositiongraphic#1#2#3%
+ {\bgroup
+ \prepareMPvariables{#2}%
+ \prepareMPpositionvariables
+ \enableincludeMPgraphics
+ \startMPcode#3\stopMPcode
+ \egroup}
+
+% Now we need a adapted action handler:
+
+\def\dopositionaction#1% test saves hash entry in etex
+ {\ifcsname\POSactionprefix#1::\endcsname
+ \dodopositionaction{#1}%
+ \fi}
+
+\def\dodopositionaction#1%
+ {\ifnum\MPp{#1}>\zerocount % new
+ \bgroup
+ \setbox\scratchbox\hbox
+ \bgroup
+ \traceposstring\clap\red{<#1>}%
+ \the\everyinsertpositionaction
+ \the\everypositionaction
+ \csname\POSactionprefix#1::\endcsname
+ \cleanuppositionaction{#1}%
+ \egroup % smashed is really needed else
+ \smashedbox\scratchbox % we get problems with too big
+ \egroup % overlays (s-pre-0x.tex)
+ \else
+ % shouldn't happen too often
+ \traceposstring\clap\cyan{<#1>}%
+ \fi}
+
+\def\MPpositiongraphic
+ {\dodoublegroupempty\doMPpositiongraphic}
+
+\def\doMPpositiongraphic#1#2% tag setups
+ {\bgroup
+ \def\@@meta{#1:}%
+ \setupMPvariables[#2]%
+ \prepareMPpositionvariables
+ \MPshiftdrawingtrue
+ \def\doMPpositiongraphic##1##2%
+ {{% new, see (techniek)
+ \def\@@meta{##1:}%
+ \setupMPvariables[#2,##2]%
+ \prepareMPpositionvariables
+ % and needed
+ \getvalue{MPG:##1}}}% temp hack
+ \setbox\positiongraphicbox\hbox
+ {\ignorespaces
+ \executeifdefined{MPM:#1}{\executeifdefined{MPG:#1}\donothing}%
+ \removelastspace}%
+ \smashbox\positiongraphicbox
+ \box\positiongraphicbox
+ \egroup}
+
+\long\def\startMPpositionmethod#1#2\stopMPpositionmethod
+ {\long\setgvalue{MPM:#1}{#2}} % todo: var list here
+
+\let\stopMPpositionmethod\relax
+
+%D Simple one position graphics.
+
+\def\setMPpositiongraphic
+ {\dotriplegroupempty\dosetMPpositiongraphic}
+
+\def\dosetMPpositiongraphic#1#2#3% pos tag vars
+ {\ifx\currentpositionoverlay\empty
+ \dosetpositionaction{#1}{\MPpositiongraphic{#2}{#3}}%
+ \else % silly can be one
+ \handlepositiongraphics{#1}{#2}{#3}%
+ \fi}
+
+\def\handlepositiongraphics#1#2#3% combine with boxes
+ {\handlepositionaction\dohandleMPpositiongraphic\with{#1}{#2}{#3}\on{#2}}
+
+\def\doinsertMPpositiongraphic#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}=\realpageno\relax % extra saveguard
+ \def\currentposition{#1}\MPpositiongraphic{#2}{#3}%
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphic\doinsertMPpositiongraphic
+\to \everyinsertpositionaction
+
+\def\docleanMPpositiongraphic#1#2#3% pos tag setups
+ {\ifnum\MPp{#1}<\realpageno \else
+ \noexpand \dohandleMPpositiongraphic{#1}{#2}{#3}%
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphic\docleanMPpositiongraphic
+\to \everycleanpositionaction
+
+%D Graphics that span two positions (beware, does not cross pages).
+
+\def\setMPpositiongraphicrange
+ {\doquadruplegroupempty\dosetMPpositiongraphicrange}
+
+\def\dosetMPpositiongraphicrange#1#2#3#4% bpos epos tag vars
+ {\ifx\currentpositionoverlay\empty
+ \dosetpositionaction{#1}{\MPpositiongraphic{#3}{#4}}%
+ \else
+ \handlepositiongraphicsrange{#1}{#2}{#3}{#4}%
+ \fi}
+
+\def\handlepositiongraphicsrange#1#2#3#4%
+ {\handlepositionaction\dohandleMPpositiongraphicrange\with{#1}{#2}{#3}{#4}\on{#2}}
+
+\def\doinsertMPpositiongraphicrange#1#2#3#4% pos pos tag setups
+ {\ifnum\MPp{#1}\MPp{#2}>\zerocount
+ \iflocalpositioning
+ \donetrue
+ \else
+ \donefalse
+ \ifnum\MPp{#1}=\realpageno
+ \donetrue
+ \else\ifnum\MPp{#2}=\realpageno
+ \donetrue
+ \else\ifnum\MPp{#1}<\realpageno\relax\ifnum\MPp{#2}>\realpageno
+ \donetrue
+ \fi\fi\fi\fi
+ \fi
+ \ifdone
+ \def\currentposition{#1}\MPpositiongraphic{#3}{#4}%
+ \fi
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphicrange\doinsertMPpositiongraphicrange
+\to \everyinsertpositionaction
+
+\def\docleanMPpositiongraphicrange#1#2#3#4% pos tag setups
+ {\ifnum\MPp{#2}<\realpageno \else
+ \noexpand \dohandleMPpositiongraphicrange{#1}{#2}{#3}{#4}%
+ \fi}
+
+\appendtoks
+ \let\dohandleMPpositiongraphicrange\docleanMPpositiongraphicrange
+\to \everycleanpositionaction
+
+% will be overloaded, and/or code below moved to core-box
+
+\defineoverlay[\v!text-2][\positionoverlay{\v!text-2}]
+\defineoverlay[\v!text-1][\positionoverlay{\v!text-1}]
+\defineoverlay[\v!text+1][\positionoverlay{\v!text+1}]
+\defineoverlay[\v!text+2][\positionoverlay{\v!text+2}]
+
+%D The auxiliary \METAPOST\ macros are defined by default,
+%D by saying:
+
+\startMPextensions
+ if unknown context_core : input mp-core.mp ; fi ;
+\stopMPextensions
+
+%D Some of these macros are pretty clever but too complicated
+%D to be nice. When things are kind of stable I'll clean up
+%D this mess.
+
+%D THIS NEEDS A CLEANUP
+
+\setupMPvariables
+ [mpos:box]
+ [linecolor=blue,
+ linewidth=\linewidth,
+ fillcolor=lightgray,
+ filloffset=\!!zeropoint]
+
+\startMPpositiongraphic{mpos:box}{fillcolor,linecolor,linewidth}
+ initialize_box(\MPpos{\MPvar{self}}) ;
+ boxfillcolor := \MPvar{fillcolor} ;
+ boxlinecolor := \MPvar{linecolor} ;
+ boxlinewidth := \MPvar{linewidth} ;
+ boxfilloffset := \MPvar{filloffset} ;
+ draw_box ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\setupMPvariables
+ [mpos:area]
+ [linecolor=blue,
+ linewidth=\linewidth,
+ fillcolor=lightgray,
+ filloffset=\!!zeropoint]
+
+\startMPpositiongraphic{mpos:area}{fillcolor,linecolor,linewidth}
+ initialize_area(\MPpos{b:\MPvar{self}},\MPpos{e:\MPvar{self}}) ;
+ boxfillcolor := \MPvar{fillcolor} ;
+ boxlinecolor := \MPvar{linecolor} ;
+ boxlinewidth := \MPvar{linewidth} ;
+ boxfilloffset := \MPvar{filloffset} ;
+ draw_area ;
+ anchor_area(\MPanchor{b:\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+%D This is already cleaned up.
+
+% gridtype = 1 => baseline
+% gridtype = 2 => betweenline
+
+\setupMPvariables
+ [mpos:par]
+ [mp=mpos:par:shape,
+ gridtype=0,
+ linetype=1,
+ filltype=1,
+ dashtype=0, % 1 = dashed, 2 = dashed with background
+ %snaptops=true, % not that nice: true/false
+ gridcolor=red,
+ linecolor=blue,
+ fillcolor=lightgray,
+ filloffset=\!!zeropoint,
+ linewidth=\linewidth,
+ gridwidth=\linewidth,
+ gridshift=\!!zeropoint,
+ lineradius=.5\bodyfontsize,
+ dashtype=1]
+
+\startuseMPgraphic{mpos:par:shape}
+ \iftracepositions show_par \else draw_par \fi ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:setup}
+ boxgridtype := \MPvar{gridtype} ;
+ boxlinetype := \MPvar{linetype} ;
+ boxfilltype := \MPvar{filltype} ;
+ boxdashtype := \MPvar{dashtype} ;
+ boxgridcolor := \MPvar{gridcolor} ;
+ boxlinecolor := \MPvar{linecolor} ;
+ boxfillcolor := \MPvar{fillcolor} ;
+ boxfilloffset := \MPvar{filloffset} ;
+ boxlinewidth := \MPvar{linewidth} ;
+ boxgridwidth := \MPvar{gridwidth} ;
+ boxgridshift := \MPvar{gridshift} ;
+ boxlineradius := \MPvar{lineradius} ;
+ %snap_multi_par_tops := \MPvar{snaptops} ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:extra}
+ % user stuff, like:
+ % snap_multi_par_tops := false ;
+\stopuseMPgraphic
+
+\ifx\MPparcounter\undefined \newcounter\MPparcounter \fi
+
+\def\MPself {\MPvar{self}}
+\def\MPbself {b:\MPself}
+\def\MPeself {e:\MPself}
+\def\MPwself {w:\MPself}
+\def\MPparanchor{p:\MPparcounter}
+
+\def\MPl#1{\MPplus{#1}20}
+\def\MPr#1{\MPplus{#1}30}
+
+\startMPpositionmethod{mpos:par} %%%%%%%%%%% will become obsolete
+ \edef\MPparcounter{\MPv\MPbself{1}{0}}%
+ \doifpositionelse\MPwself
+ {\startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+ initialize_area_par(\MPpos\MPbself,
+ \MPpos\MPeself,
+ \MPpos\MPwself) ;
+ \includeMPgraphic{mpos:par:setup} ;
+ \includeMPgraphic{mpos:par:extra} ;
+ \includeMPgraphic{\MPvar{mp}} ;
+ anchor_par(\MPanchor\MPbself) ;
+ \stopMPpositiongraphic}
+ {\startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+ initialize_par(\MPpos\MPbself,
+ \MPpos\MPeself,
+ \MPpos\textanchor,
+ \MPpos\MPparanchor,
+ \MPvv \MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
+ \includeMPgraphic{mpos:par:setup} ;
+ \includeMPgraphic{mpos:par:extra} ;
+ \includeMPgraphic{\MPvar{mp}} ;
+ anchor_par(\MPanchor\MPbself) ;
+ \stopMPpositiongraphic}%
+ \MPpositiongraphic{mpos:par}{}%
+\stopMPpositionmethod
+
+%D The next alternative works in columnsets :
+
+% \iftracepositions show\else draw\fi_multi_pars ;
+
+\startuseMPgraphic{mpos:par:columnset}
+ \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{mpos:par:sideline}{linecolor,lineoffset}
+ for i=1 upto nofmultipars :
+ fill leftboundary multipars[i]
+ shifted (-\MPvar{lineoffset},0)
+ rightenlarged 1mm withcolor \MPvar{linecolor} ;
+ endfor ;
+\stopuseMPgraphic
+
+\startMPpositionmethod{mpos:par:columnset}
+ \edef\MPparcounter{\MPv\MPbself{1}{0}}%
+ \startMPpositiongraphic{mpos:par}{fillcolor,filloffset,linecolor,gridcolor,linewidth,gridwidth,gridshift,lineradius}
+ \includeMPgraphic{mpos:par:setup} ;
+ \includeMPgraphic{mpos:par:extra} ;
+ prepare_multi_pars(\MPpos\MPbself,\MPpos\MPeself,\MPpos\MPwself,
+ \MPpos\MPparanchor,\MPvv\MPparanchor{0pt,0pt,0pt,0pt,0,0pt}) ;
+ relocate_multipars(-\MPxy\MPanchorid) ; % inside layerpos
+ \includeMPgraphic{\MPvar{mp}} ;
+ \stopMPpositiongraphic
+ \MPpositiongraphic{mpos:par}{}%
+\stopMPpositionmethod
+
+%D \starttyping
+%D \setupbackground
+%D [test]
+%D [mp=mpos:par:columnset,
+%D method=mpos:par:columnset]
+%D \stoptyping
+
+%D We need to treat floats in a special way.
+
+\startMPinitializations
+ local_multi_par_area:=\iflocalpositioning true\else false\fi;
+\stopMPinitializations
+
+\def\textbackgroundoverlay#1%
+ {\iflocalpositioning\v!local\else\v!text\fi#1}
+
+\newcounter\localpositionnumber
+
+\def\MPanchornumber
+ {\iflocalpositioning\localpositionnumber\else\the\realpageno\fi}
+
+%D So far for the trickery.
+
+\newcount\textbackgrounddepth
+
+\ifdefined\nofparbackgrounds\else \newcount\nofparbackgrounds \fi
+
+\ifx\totalnofparbackgrounds\undefined \newcounter\totalnofparbackgrounds \fi
+
+\appendtoks
+ \expanded{\savecurrentvalue\noexpand\totalnofparbackgrounds{\number\nofparbackgrounds}}%
+\to \everybye
+
+% actually we can just ask lua to give us the nofpositions (or a least n<>0)
+
+\appendtoks
+ % a position can be mid paragraph in which case we're behind
+ \initializeparbackgrounds
+\to \everystarttext
+
+\def\initializeparbackgrounds
+ {\ifcase\totalnofparbackgrounds\else
+ \enableparpositions
+ \fi}
+
+\unexpanded\def\starttextbackground
+ {\bgroup
+ \advance\textbackgrounddepth\plusone
+ \dodoubleempty\dostarttextbackground}
+
+\let\dodostarttextbackground\relax
+\let\dodostoptextbackground \relax
+
+\def\currentparbackground{pbg:0}
+\def\nextparbackground {pbg:1}
+
+\def\btbanchor{b:\currentparbackground}
+\def\etbanchor{e:\currentparbackground}
+
+\def\nextbtbanchor{b:\nextparbackground}
+\def\nextetbanchor{e:\nextparbackground}
+
+\def\textbackgroundparameter#1%
+ {\csname\??td\currenttextbackground#1\endcsname}
+
+\let\backgroundvariable\textbackgroundparameter % will become obsolete
+
+% \definetextbackground[more][state=start,backgroundcolor=red] % location=paragraph
+% \definetextbackground[test][state=start,backgroundcolor=green]
+%
+% \page \placefigure[left]{}{}
+%
+% \starttextbackground[test]
+% \readfile{ward}{}{}
+% \starttextbackground[more]
+% \readfile{ward}{}{}
+% \stoptextbackground
+% \readfile{ward}{}{}
+% \stoptextbackground
+%
+% \page \placefigure[right]{}{}
+%
+% \starttextbackground[test]
+% \readfile{ward}{}{}
+% \starttextbackground[more]
+% \readfile{ward}{}{}
+% \stoptextbackground
+% \readfile{ward}{}{}
+% \stoptextbackground
+
+\def\dostarttextbackground[#1][#2]%
+ {\checktextbackgrounds
+ \def\currenttextbackground{#1}%
+ \global\advance\nofparbackgrounds\plusone
+ \edef\currentparbackground{pbg:\number\nofparbackgrounds}%
+ \xdef\nextparbackground{pbg:\number\numexpr\nofparbackgrounds+\plusone\relax}% still xdef ?
+ % todo : \synchonizepositionpage{b:\currentparbackground}{s:\currentparbackground}%
+ \setuptextbackground[#1][#2]%
+ \let\dodostarttextbackground\relax
+ \let\dodostoptextbackground \relax
+ \doif{\textbackgroundparameter\c!state}\v!start{\dopresettextbackground{#1}}%
+ \dodostarttextbackground}
+
+% todo \backgroundvariable\c!variant
+
+\def\dopresettextbackground#1% todo: \backgroundparameter
+ {\normalexpanded{\noexpand\processaction[\textbackgroundparameter\c!location]}
+ [ \v!text=>\let\dodostarttextbackground\dostarttextbackgroundtxt
+ \let\dodostoptextbackground \dostoptextbackgroundtxt,
+ \v!paragraph=>\let\dodostarttextbackground\dostarttextbackgroundpar
+ \let\dodostoptextbackground \dostoptextbackgroundpar,
+ \v!none=>\let\dodostarttextbackground\relax
+ \let\dodostoptextbackground \relax]%
+ \ifx\dodostarttextbackground\dostarttextbackgroundpar % untested
+ \ifnum\textbackgrounddepth>\plusone % new
+ \let\dodostarttextbackground\dostarttextbackgroundtxt
+ \let\dodostoptextbackground \dostoptextbackgroundtxt
+ \fi
+ \fi
+ \doifelse{\textbackgroundparameter\c!frame}\v!on
+ {\doifelse{\textbackgroundparameter\c!corner}\v!round
+ {\setvalue{\??td#1\c!frame}{2}}
+ {\setvalue{\??td#1\c!frame}{1}}}
+ {\setvalue{\??td#1\c!frame}{0}}%
+ \doifelse{\textbackgroundparameter\c!background}\v!color
+ {\setvalue{\??td#1\c!background}{1}}
+ {\setvalue{\??td#1\c!background}{0}}%
+ %\startpositionoverlay{\v!text\getvalue{\??td#1\c!level}}%
+ \startpositionoverlay{\textbackgroundoverlay{\textbackgroundparameter\c!level}}%
+ \expanded
+ {\setMPpositiongraphicrange % moet veel efficienter
+ {\btbanchor}% {b:\currentparbackground}%
+ {\etbanchor}% {e:\currentparbackground}%
+ {\textbackgroundparameter\c!method}%
+ {self=\currentparbackground,
+ mp=\textbackgroundparameter\c!mp,
+ gridtype=\textbackgroundparameter\c!alternative,
+ filltype=\textbackgroundparameter\c!background,
+ linetype=\textbackgroundparameter\c!frame,
+ dashtype=\textbackgroundparameter{dash}, % to be internationalized
+ gridcolor=\textbackgroundparameter\c!framecolor,
+ linecolor=\textbackgroundparameter\c!framecolor,
+ lineoffset=\textbackgroundparameter\c!frameoffset,
+ fillcolor=\textbackgroundparameter\c!backgroundcolor,
+ filloffset=\textbackgroundparameter\c!backgroundoffset,
+ gridwidth=\textbackgroundparameter\c!rulethickness,
+ gridshift=\textbackgroundparameter\c!voffset,
+ linewidth=\textbackgroundparameter\c!rulethickness,
+ lineradius=\textbackgroundparameter\c!radius}}%
+ \stoppositionoverlay}
+
+\unexpanded\def\stoptextbackground
+ {\dodostoptextbackground
+ \carryoverpar\egroup}
+
+\unexpanded\def\starttextbackgroundmanual
+ {\dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty
+ \fpos\currentparbackground\ignorespaces}
+
+\unexpanded\def\stoptextbackgroundmanual
+ {\tpos\currentparbackground
+ \dostopattributes}
+
+\def\dostarttextbackgroundtxt
+ {\ifvmode \dontleavehmode \fi
+ \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty
+ \fpos\currentparbackground\ignorespaces}
+
+\def\dostoptextbackgroundtxt
+ {\tpos\currentparbackground
+ \dostopattributes}
+
+\newskip\textbackgroundskip
+
+\def\dostarttextbackgroundpar
+ {\endgraf % new
+ \textbackgroundparameter\c!before
+ \noindent
+ \ifgridsnapping
+ \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
+ \ifdim\textbackgroundskip>\zeropoint
+ \struttedbox{\hbox{\raise\textbackgroundskip\hbox{\fpos\currentparbackground}}}%
+ \else
+ \fpos\currentparbackground
+ \fi
+ \else
+ \fpos\currentparbackground
+ \fi
+ \bgroup
+ \endgraf % we need a vertical nobreak - 29/06/2004
+ \nobreak \vskip-\lineheight \nobreak
+ \ifgridsnapping \else
+ \doassignsomeskip\textbackgroundparameter\c!topoffset\to\textbackgroundskip
+ \ifdim\textbackgroundskip>\zeropoint
+ \kern\textbackgroundskip\nobreak
+ \fi
+ \fi
+ \dosetleftskipadaption{\textbackgroundparameter\c!leftoffset}%
+ \advance\leftskip\leftskipadaption
+ \dosetleftskipadaption{\textbackgroundparameter\c!rightoffset}%
+ \advance\rightskip\leftskipadaption
+ % new
+ \dosetraggedcommand{\textbackgroundparameter\c!align}%
+ \raggedcommand
+ %
+ \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty
+ \nowhitespace
+ \nobreak % new per 23/04/2006 (else potential break when whitespace)
+ \seteffectivehsize
+ \doinhibitblank % \blank[\v!disable]% new
+ \par}
+
+\def\dostoptextbackgroundpar
+ {\par
+ \removelastskip % new
+ \dostopattributes
+ \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
+ \ifdim\lastskip>\zeropoint
+ \advance\textbackgroundskip-\lastskip
+ \fi
+ \ifgridsnapping \else \ifdim\textbackgroundskip>\zeropoint
+ \kern\textbackgroundskip\nobreak
+ \fi \fi
+ \nobreak \vskip-\lineheight \nobreak
+ \nowhitespace
+ \egroup
+ \bgroup \forgeteverypar % NOT REALLY NEEDED, SAVES HASH/MEM
+ \nobreak \noindent \strut \hfill \kern\zeropoint
+ \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip
+ \ifgridsnapping % experimental, pascal (todo: topoffset in same way)
+ \ifdim\textbackgroundskip>\zeropoint
+ \struttedbox{\hbox{\lower\textbackgroundskip\hbox{\tpos\currentparbackground}}}%
+ \else
+ \tpos\currentparbackground
+ \fi
+ \else
+ \tpos\currentparbackground
+ \fi
+ \egroup
+ \endgraf % new
+ \textbackgroundparameter\c!after}
+
+\let\textparpages \!!zeropoint
+\let\textparheight\!!zeropoint
+\let\textparwidth \!!zeropoint
+
+\def\calculatetextpardimensions
+ {\docalculatetextpardimensions\btbanchor\etbanchor\MPparanchor}
+
+\def\calculatenexttextpardimensions
+ {\docalculatetextpardimensions\nextbtbanchor\nextetbanchor\relax}
+
+% \def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor
+% {\scratchcounter\numexpr\MPp#2-\MPp#1\relax
+% \edef\textparpages{\the\scratchcounter}%
+% \ifcase\scratchcounter
+% % one page
+% \scratchdimen\dimexpr\MPy#1-\MPy#2\relax
+% \else
+% % two or more pages
+% \ifnum\scratchcounter>2
+% \ifnum\scratchcounter<5
+% % more pages
+% \scratchdimen\textheight
+% \advance\scratchcounter \minusone
+% \multiply\scratchdimen \scratchcounter
+% \else
+% % keep'm small
+% \scratchdimen5\textheight
+% \fi
+% \else
+% \scratchdimen\dimexpr\MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor\relax
+% \fi
+% \fi
+% \edef\textparheight{\the\scratchdimen}%
+% \ifcase\scratchcounter
+% % one page
+% \scratchdimen\dimexpr\MPx#2-\MPx#1\relax
+% \else
+% % two or more pages / maybe also hang
+% \ifx#3\relax
+% \scratchdimen\makeupwidth % \textwidth
+% \else
+% \scratchdimen\dimexpr\MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor\relax
+% \fi
+% \fi
+% \edef\textparwidth{\the\scratchdimen}}
+
+\def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor (adapted 8/6/2009)
+ {\scratchcounter\numexpr\MPp#2-\MPp#1\relax
+ \edef\textparpages
+ {\the\scratchcounter}%
+ \edef\textparheight
+ {\the\dimexpr
+ \ifcase\scratchcounter
+ % one page
+ \MPy#1-\MPy#2%
+ \else
+ % two or more pages
+ \ifnum\scratchcounter>2
+ \ifnum\scratchcounter<5
+ % more pages
+ \textheight*\numexpr\scratchcounter+\minusone
+ \else
+ % keep'm small
+ 5\textheight
+ \fi
+ \else
+ \MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor
+ \fi
+ \fi
+ \relax}%
+ \edef\textparwidth
+ {\the\dimexpr
+ \ifcase\scratchcounter
+ % one page
+ \MPx#2-\MPx#1%
+ \else
+ % two or more pages / maybe also hang
+ \ifx#3\relax
+ \makeupwidth % \textwidth
+ \else
+ \MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor
+ \fi
+ \fi
+ \relax}}
+
+\def\mintextparheight{4\lineheight}
+
+\def\dontsplitnexttextbackground % dangerous but useful
+ {\ifdim\pagetotal>\textheight \else
+ \ifdim\pagegoal=\maxdimen \else
+ \calculatenexttextpardimensions
+ % too tricky
+ % \scratchdimen=\textparheight
+ % \advance\scratchdimen\pagetotal\relax
+ % \ifdim\scratchdimen>\pagegoal
+ % \page
+ % \fi
+ \ifdim\textparheight>\zeropoint
+ \ifdim\textparheight>\mintextparheight\else
+ \page % option
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\unexpanded\def\definetextbackground
+ {\dodoubleempty\dodefinetextbackground}
+
+\def\dodefinetextbackground[#1][#2]% parent and ..parameter
+ {\ifsecondargument % why ?
+ \copyparameters[\??td#1][\??td]
+ [\c!state,\c!location,\c!alternative,\c!mp,\c!method,
+ \c!background,\c!backgroundcolor,\c!corner,\c!level,
+ \c!backgroundoffset,\c!before,\c!after,\c!align,dash, % dash not yet internationalized
+ \c!radius,\c!frame,\c!framecolor,\c!rulethickness,\c!voffset,\c!frameoffset,
+ \c!leftoffset,\c!rightoffset,\c!topoffset,\c!bottomoffset]%
+ \getparameters[\??td#1][#2]%
+ \doifvalue{\??td#1\c!state}\v!start\checktextbackgrounds
+ \setuvalue{#1}%
+ {\groupedcommand{\starttextbackground[#1]}{\stoptextbackground}}%
+ \setvalue{\e!start#1}{\starttextbackground[#1]}%
+ \setvalue{\e!stop #1}{\stoptextbackground}%
+ \fi}
+
+\unexpanded\def\setuptextbackground
+ {\dodoubleargument\dosetuptextbackground}
+
+\def\dosetuptextbackground[#1][#2]%
+ {\ifsecondargument
+ \doifelsenothing{#1}
+ {\dodosetuptextbackground{#2}\empty}
+ {\processcommalist[#1]{\dodosetuptextbackground{#2}}}%
+ \else
+ \dodosetuptextbackground{#1}\empty
+ \fi}
+
+\def\dodosetuptextbackground#1#2%
+ {\getparameters[\??td#2][#1]%
+ \def\currenttextbackground{#2}%
+ \doifvalue{\??td#2\c!state}\v!start\checktextbackgrounds}
+
+\let\currenttextbackground\empty
+
+\def\checktextbackgrounds
+ {\ifproductionrun
+ \enabletextarearegistration
+ \enablehiddenbackground
+ \fi}
+
+\setuptextbackground
+ [\c!mp=mpos:par:columnset, % buggy: mpos:par:shape
+ \c!method=mpos:par:columnset, %
+ \c!state=\v!start,
+ \c!location=\v!text,
+ \c!leftoffset=\!!zeropoint, % 1em,
+ \c!rightoffset=\textbackgroundparameter\c!leftoffset,
+ \c!topoffset=\!!zeropoint, % \v!medium,
+ \c!bottomoffset=\textbackgroundparameter\c!topoffset,
+ \c!level=-1,
+ \c!alternative=0,
+ \c!align=,
+ dash=0, % to be internationalized
+ \c!background=\v!color,
+ \c!backgroundcolor=lightgray,
+ \c!backgroundoffset=\!!zeropoint,
+ \c!corner=\v!rectangular,
+ \c!radius=.5\bodyfontsize,
+ \c!voffset=\!!zeropoint,
+ \c!frame=\v!on,
+ \c!framecolor=blue,
+ \c!rulethickness=\linewidth]
+
+%D As an example we define a grid background:
+
+\definetextbackground
+ [\v!grid]
+ [\c!state=\v!stop,
+ \c!location=\v!paragraph,
+ \c!frame=\v!off,
+ \c!framecolor=red,
+ \c!background=,
+ \c!alternative=1]
+
+\ifx\basegrid\undefined \else \letvalue\v!grid=\basegrid \fi
+
+% lelijk, aanpassen, opties
+
+\setupMPvariables
+ [mpos:connect]
+ [linecolor=red,
+ linewidth=1pt]
+
+\setupMPvariables
+ [mpos:encircle]
+ [fillcolor=lightgray,
+ filloffset=\!!zeropoint,
+ linecolor=blue,
+ linewidth=1pt]
+
+% these might become macros in mp-page
+
+\startuseMPgraphic{mpos:common:ec}
+ path pa ; pair ca ; color lc ; numeric lw ;
+ lw := \MPvar{linewidth} ;
+ lc := \MPvar{linecolor} ;
+ initialize_box(\MPpos{\MPvar{self}}) ;
+ pa := pxy ; ca := cxy ; pa := boundingbox pa enlarged 2lw ;
+ pa := llcorner pa...lrcorner pa...urcorner pa...ulcorner pa...cycle ;
+ drawoptions (withpen pencircle scaled lw withcolor lc) ;
+\stopuseMPgraphic
+
+\startMPpositiongraphic{mpos:encircle}{linecolor,fillcolor,linewidth}
+ \includeMPgraphic{mpos:common:ec}
+ fill pa withcolor \MPvar{fillcolor} ; draw pa ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\startMPpositiongraphic{mpos:connect}{linecolor,linewidth}
+ path pb, pc ; pair cb, cc ;
+ \includeMPgraphic{mpos:common:ec}
+ initialize_box(\MPpos{\MPvar{to}}) ;
+ pb := pxy ; cb := cxy ; pb := boundingbox pb enlarged 2lw ;
+ pb := llcorner pb...lrcorner pb...urcorner pb...ulcorner pb...cycle ;
+ pc := ca {up} .. {down} cb ;
+ cc := (pc intersection_point pa) ;
+ if intersection_found :
+ pc := pc cutbefore cc ;
+ cc := (pc intersection_point pb) ;
+ if intersection_found :
+ pc := pc cutafter cc ;
+ drawarrow pc ; drawarrow reverse pc ;
+ fi ;
+ fi ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+%D \macros
+%D {stackposdown, stackposup, stackposleft,stackposright}
+%D
+%D A non graphic example of the use of positioning, is to stack
+%D text in for instance the margin.
+%D
+%D \stackposdown \inleft {some text}The text \type {some text}
+%D goes into the left margin, and \stackposdown \inleft {some
+%D more}\type {some more} as well. When they overlap, they
+%D will not touch.
+%D
+%D Here we said \type {\stackposdown \inleft{some text}}. Instead
+%D of \stackposleft \inleft {one}stacking \stackposleft \inleft
+%D {two}vertically, one can stack horizontally by \stackposleft
+%D \inleft {three}using \type {\stackposleft}.
+%D
+%D We can go in all four directions, using \type {\stackposdown},
+%D \type {\stackposup}, \type {\stackposleft} and \type
+%D {\stackposright}.
+
+\def\stackposdistance{.5em}
+
+\newcount\currentautopos
+\newcount\previousautopos
+
+\def\POSstackprefix{stack:}
+
+\def\dostackposbox#1#2%
+ {\dowithnextbox
+ {#2{\previousautopos\currentautopos
+ \global\advance\currentautopos\plusone
+ \edef\currentposition {\POSstackprefix\number\currentautopos}%
+ \edef\previousposition{\POSstackprefix\number\previousautopos}%
+ \hpos\currentposition{\doifoverlappingelse\currentposition\previousposition{#1}{\flushnextbox}}}}%
+ \hbox}
+
+\def\stackposup {\dostackposbox{\raise\lineheight\flushnextbox}}
+\def\stackposdown {\dostackposbox{\lower\lineheight\flushnextbox}}
+\def\stackposleft {\dostackposbox{\copy\nextbox\hskip\nextboxwd\hskip\stackposdistance}}
+\def\stackposright{\dostackposbox{\hskip\stackposdistance\hskip\nextboxwd\flushnextbox}}
+
+%D \macros
+%D {stackeddown}
+%D
+%D However, a better implementation is possible with the
+%D following macro. We now have an extra key \type {stack} for
+%D margin settings. When set to \type {yes}, this macro comes
+%D into action.
+
+% Because there can be many stacked items in a line and successive lines, we
+% play dirty and adapt the position and height of the current node so that
+% this becomes visible to a next pass.
+%
+% \startbuffer
+% \inleft {test 1} test 1 \inleft {test 2} test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1} test 1 \inleft {test 2} test 2 \inleft {test 3} test 3 \endgraf
+% \inleft {test 4} test 4
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1} test 1 \endgraf
+% \inleft {test 2} test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1\\test 1} test 1 \inleft {test 2} test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft {test 1\\test 1\\test 1\\test 1\\test 1} test 1 \endgraf
+% test 2 \endgraf
+% \inleft {test 3} test 3
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft{test 1} test \inleft{test 2} test \inleft{test 3\\test 3} test
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+%
+% \startbuffer
+% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test \endgraf
+% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test
+% \stopbuffer
+% \getbuffer \typebuffer \flushstatus \page
+
+\newdimen\laststackvmove % use \scratchdimenone instead of skip
+
+\def\stackeddown
+ {\bgroup
+ % this macro assumes a few things and is meant to work for margin notes
+ \dowithnextbox
+ {\global\advance\currentautopos\plusone
+ \global\laststackvmove\zeropoint
+ \hpos{\POSstackprefix\number\currentautopos}
+ {\edef\next
+ {\nextboxht\the\nextboxht
+ \nextboxdp\the\nextboxdp
+ \nextboxwd\the\nextboxwd}%
+ \previousautopos\currentautopos
+ \scratchdimen\zeropoint
+ \scratchcounter\zerocount
+ \doloop
+ {\advance\previousautopos\minusone
+ \edef\currentposition {\POSstackprefix\number\currentautopos}%
+ \edef\previousposition{\POSstackprefix\number\previousautopos}%
+ \ifnum\MPp\currentposition=\MPp\previousposition\relax
+ %\registerstatus{doing \number\currentautopos/\number\previousautopos}%
+ \doifoverlappingelse\currentposition\previousposition
+ {\scratchskip\dimexpr
+ \MPy\currentposition
+ -\MPy\previousposition
+ -\MPd\currentposition % untested
+ +\MPd\previousposition % untested
+ +\MPh\currentposition
+ \relax\relax % second relax realy needed, forgotten while dimexpressing
+ % todo: also take depth into account
+ \ifdim\scratchskip<\scratchdimen
+ %\registerstatus{no \the\scratchskip}%
+ \else
+ %\registerstatus{yes \the\scratchskip}%
+ \scratchdimen\scratchskip
+ \fi}%
+ \donothing % {\registerstatus{next}}%
+ \ifnum\previousautopos<\zerocount\exitloop\fi
+ \else
+ \exitloop
+ \fi}%
+ \ifdim\scratchdimen=\zeropoint \else
+ \bgroup
+ \edef\currentposition{\POSstackprefix\number\currentautopos}%
+ \scratchskip\scratchdimen
+ \advance\scratchskip\MPh\currentposition
+ \scratchdimen-\scratchdimen
+ \advance\scratchdimen\MPy\currentposition
+ %\registerstatus{old \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
+ \expanded{\replacepospxywhd
+ {\currentposition}{\MPp\currentposition}{\MPx\currentposition}{\the\scratchdimen}%
+ {\MPw\currentposition}{\the\scratchskip}{\MPd\currentposition}}%
+ %\registerstatus{new \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
+ \egroup
+ \global\laststackvmove\scratchdimen % new
+ \setbox\nextbox\iftracepositions\@EA\ruledhbox\else\@EA\hbox\fi
+ {\lower\scratchdimen\flushnextbox}%
+ \next
+ %\registerstatus{\strut}%
+ \fi
+ \flushnextbox}%
+ \egroup}}
+
+%D The next hack make sure that margin texts near faulty
+%D strutted lines are handled ok.
+
+\newif\ifrepositionmarginbox \repositionmarginboxtrue
+
+\newcount\currentmarginpos
+
+\def\dopositionmarginbox#1%
+ {\bgroup
+ \ifrepositionmarginbox
+ \global\advance\currentmarginpos\plusone
+ %\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 but bugged
+ % \setbox#1\hbox
+ % {\hskip-\MPx{\s!margin:\number\currentmarginpos}%
+ % \hskip\MPx{head:\the\realpageno}%
+ % \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
+ \scratchdimen\noflines\lineheight
+ \else
+ \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax
+ \fi
+ \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}%
+ \fi
+ \dp#1\zeropoint
+ \ht#1\zeropoint
+ \fi
+ \graphicvadjust{\dontleavehmode\box#1}% dontleavehmode is needed to get direction right
+ \egroup}
+
+\chardef\marginrepositionmethod\plusone % sidemethod
+\chardef\margincontentmethod \plusthree % textmethod % beware: 1 = old method
+\chardef\marginpagecheckmethod \plusone % splitmethod
+
+%D For a right menu, a sequence of calls to \type
+%D {right_menu_button} is generated.
+%D
+%D \starttyping
+%D right_menu_button (n, p, s=0/1/2, x, y, w, h, d) ;
+%D \stoptyping
+%D
+%D Here, n is the number of the button, s a status variable,
+%D while the rest is positional info. The status variable is
+%D 0, 1 or~2: not found, found and found but current page.
+
+% 0=not found 1=found 2=current page
+
+% geen leeg
+
+\newtoks\MPmenutoks
+
+\def\MPmenubuttons#1{\the\MPmenutoks}
+
+\appendtoks \global\MPmenutoks\emptytoks \to \everyshipout
+
+% 0=notfound 1=found 2=currentpage
+
+\def\domenuitemposition#1#2#3%
+ {\doifelsevalue{\??am#1\c!position}\v!yes
+ {\doglobal\increment\currentamposition
+ \doifreferencefoundelse{#2}% 0=not found, 1=same page, >1=elsewhere
+ {\chardef\currentamrealpage\ifnum\currentreferencerealpage=\realpageno\plusone\else\plustwo\fi}%
+ {\chardef\currentamrealpage\plustwo}%
+ \expanded
+ {\doglobal\noexpand\appendtoks
+ #1_menu_button(\number\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ;
+ \to \MPmenutoks}%
+ \hpos{#1:\currentamposition}{#3}}
+ {#3}}
+
+\def\dowholemenuposition#1%
+ {\ifnum\currentamposition>0
+ \dowithnextbox{\hpos{menu:#1:\the\realpageno}{\flushnextbox}}\hbox
+ \fi}
+
+%D \macros
+%D {GFC, GTC, GSC}
+%D
+%D The next macros extend tables and tabulation with
+%D backgrounds and position related features. Areas are
+%D specified with symbolic names, and symbolic references to
+%D the graphics involved. Each table has its own namespace.
+
+\newconditional\tablehaspositions
+\newcount\noftabpositions
+\newtoks \posXCtoks
+
+\def\dotablebpos{\bpos}
+\def\dotableepos{\epos}
+
+\def\tbPOSprefix
+ {tbp:\number\noftabpositions:}
+
+% \def\tableposindeed
+% {\scratchtoks\posXCtoks
+% \global\posXCtoks\emptytoks
+% \the\scratchtoks}
+
+\def\tablepos
+ {\normalexpanded{\global\posXCtoks\emptytoks\the\posXCtoks}}
+
+\let\tabulatepos\tablepos
+
+\def\dodododoGSC[#1:#2]%
+ {\remappositionframed{#2}{\tbPOSprefix#1}%
+ \dotablebpos{\tbPOSprefix#1}%
+ \doglobal\appendtoks\@EA\dotableepos\@EA{\tbPOSprefix#1}\to\posXCtoks}
+
+\def\dododoGSC[#1:#2:#3]%
+ {\doglobal\appendtoks\dodododoGSC[#1:#2]\to\posXCtoks\NC}
+
+\def\dodoGSC[#1]%
+ {\def\docommand##1{\dododoGSC[##1:##1]}%
+ \processcommalist[#1]\docommand}
+
+\def\dodododoGFC[#1:#2:#3]%
+ {\remappositionframed{#2}{\tbPOSprefix#1}%
+ \dotablebpos{\tbPOSprefix#1}}
+
+\def\dododoGFC[#1]%
+ {\def\docommand##1{\dodododoGFC[##1:##1]}%
+ \processcommalist[#1]\docommand}
+
+\def\dodoGFC[#1]%
+ {\doglobal\appendtoks\dododoGFC[#1]\to\posXCtoks\NC}
+
+\def\dododododoGTC[#1:#2]%
+ {\dotableepos{\tbPOSprefix#1}}
+
+\def\dodododoGTC[#1]%
+ {\def\docommand##1{\dododododoGTC[##1:##1]}%
+ \processcommalist[#1]\docommand}
+
+\def\dododoGTC[#1]%
+ {\doglobal\appendtoks\dodododoGTC[#1]\to\posXCtoks}
+
+\def\dodoGTC[#1]%
+ {\doglobal\appendtoks\dododoGTC[#1]\to\posXCtoks\NC}
+
+\def\dodododoXC[#1#2]%
+ {\if#1>\dodoGFC [#2:#2]\else
+ \if#1+\dodoGFC [#2:#2]\else
+ \if#1<\dodoGTC [#2:#2]\else
+ \if#1-\dodoGTC [#2:#2]\else
+ \if#1=\dodoGSC [#2:#2]\else
+ \dodoGSC[#1#2:#1#2]\fi\fi\fi\fi\fi}
+
+\def\dododoXC#1%
+ {\dodododoXC[#1]}
+
+\def\dodoXC[#1]%
+ {{\let\NC\relax\processcommalist[#1]\dododoXC}}
+
+\def\@@checktablepositionstate
+ {\iftrialtypesetting
+ \global\settrue\tablehaspositions
+ \firstargumentfalse
+ \fi}
+
+\def\doGSC[#1]{\@@checktablepositionstate\iffirstargument\dodoGSC[#1]\else\expandafter\NC\fi}
+\def\doGFC[#1]{\@@checktablepositionstate\iffirstargument\dodoGFC[#1]\else\expandafter\NC\fi}
+\def\doGTC[#1]{\@@checktablepositionstate\iffirstargument\dodoGTC[#1]\else\expandafter\NC\fi}
+\def\doXC [#1]{\@@checktablepositionstate\iffirstargument\dodoXC [#1]\else\expandafter\fi\NC}
+
+\def\tbGSC{\dosingleempty\doGSC}
+\def\tbGFC{\dosingleempty\doGFC}
+\def\tbGTC{\dosingleempty\doGTC}
+\def\tbXC {\dosingleempty\doXC }
+
+%D The amount of code to support tables and tabulation is
+%D rather minimalistic.
+
+\let\tabulatepos\tablepos
+
+\def\tabulatenormalpos
+ {\iftrialtypesetting
+ % nothing
+ \else\ifconditional\tablehaspositions
+ \hss\tabulatepos\hss
+ \else
+ % nothing
+ \fi\fi}
+
+\def\tabulateequalpos
+ {\iftrialtypesetting
+ \tabulateEQ
+ \else\ifconditional\tablehaspositions
+ \tabulateEQpos
+ \else
+ \tabulateEQ
+ \fi\fi}
+
+\def\tabulateEQpos
+ {\setbox\scratchbox\hbox{\tabulateEQ}%
+ \hbox to \wd\scratchbox{\hss\kern\zeropoint\tabulatepos\hss}%
+ \hskip-\wd\scratchbox
+ \box\scratchbox}
+
+\def\tabulatenormalcolumn#1% overloaded later in node-bck
+ {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi
+ &\global\chardef\tabulatetype#1&}
+
+\def\tabulateequalcolumn#1% overloaded
+ {&\tabulateequalpos
+ &\global\chardef\tabulatetype#1&}
+
+\appendtoks
+ \global\advance\noftabpositions\plusone
+ \global\setfalse\tablehaspositions
+\to \everytabulate
+
+% We need to handle paragraphs as well.
+
+\let\doflushtabulateepos\relax
+
+\def\dotabulatebpos
+ {\bpos}
+
+\def\dotabulateepos#1%
+ {\ifvoid\tablebox\tabulatecolumn
+ \epos{#1}%
+ \glet\doflushtabulateepos\relax
+ \else
+ \gdef\doflushtabulateepos{\epos{#1}}%
+ \fi}
+
+\def\splitofftabulatebox % overloaded in node-bck
+ {\dontcomplain
+ \global\setbox\tabulatebox % % % global ? % % %
+ \vsplit\tablebox\tabulatecolumn to \lineheight
+ \setbox\tabulatebox\normalvbox
+ {\unvbox\tabulatebox}%
+ \setbox\tabulatebox\hbox to \wd\tabulatebox
+ {\hss\dotabulatehook{\box\tabulatebox}\hss}%
+ \ht\tabulatebox\strutht
+ \dp\tabulatebox\strutdp
+ \box\tabulatebox
+ \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
+
+\appendtoks
+ \let\dotablebpos\dotabulatebpos
+ \let\dotableepos\dotabulateepos
+ \glet\doflushtabulateepos\relax
+\to \everytabulate
+
+%D In order to prevent potential clashes with abbreviations,
+%D postpone the mapping.
+
+\appendtoks
+ \let\GSC\tbGSC \let\GFC\tbGFC \let\GTC\tbGTC \let\XC\tbXC
+\to \everytabulate
+
+%D \macros
+%D {definepositionframed}
+%D
+%D The next example show how to provide backgrounds to table
+%D cells. First we define some framed backgrounds.
+%D
+%D \startbuffer
+%D \definepositionframed[x][background=color,backgroundcolor=red]
+%D \definepositionframed[y][background=color,backgroundcolor=green]
+%D \definepositionframed[z][background=color,backgroundcolor=blue]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D % \getbuffer
+%D
+%D \startbuffer
+%D \starttabulate[|c|c|c|]
+%D \GFC[f:x] this is a small \NC table \NC in which we \NC \FR
+%D \NC will demonstrate \GFC[g:z] that this \GTC[g] positioning \NC \MR
+%D \GSC[e:y] mechanism also \GTC[f] works quite well \NC in tables \NC \LR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D The table itself defines three areas (a, b and~c) using
+%D these frames.
+%D
+%D \typebuffer
+%D % \getbuffer
+%D
+%D Tables (based on \TABLE) are supported by:
+
+\def\normalTABLEsimplebar {\unskip\!ttRightGlue&\tablepos&} % |
+\def\normalTABLEcomplexbar{\unskip\!ttRightGlue&\omit\tablepos\!ttAlternateVrule} % \|
+\def\normalTABLEquote {\unskip\!ttRightGlue&\omit\tablepos&} % "
+
+\appendtoks
+ \global\advance\noftabpositions\plusone
+ \global\setfalse\tablehaspositions
+\to \everytable
+
+%D Since we don't want nameclashes:
+
+\appendtoks
+ \let\GSC\tbGSC \let\GFC\tbGFC \let\GTC\tbGTC \let\XC\tbXC
+\to \everytable
+
+%D In the previous example, we could have provided an overlay to
+%D the framed definition. A more direct approach is demonstrated
+%D below:
+%D
+%D \startbuffer
+%D \def\cw#1{\color[white]{#1}}
+%D
+%D \startMPpositiongraphic{tableshade}
+%D initialize_area(\MPpos{\MPvar{from}},\MPpos{\MPvar{to}}) ;
+%D color c ; c := \MPvar{color} ;
+%D linear_shade(pxy,0,.4c,.9c) ;
+%D anchor_area(\MPanchor{\MPvar{from}}) ;
+%D \stopMPpositiongraphic
+%D
+%D \setMPpositiongraphic{b:x}{tableshade}{from=b:x,to=e:x,color=red}
+%D \setMPpositiongraphic{b:y}{tableshade}{from=b:y,to=e:y,color=green}
+%D \setMPpositiongraphic{b:z}{tableshade}{from=b:z,to=e:z,color=blue}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D The definition of the table looks about the same as the
+%D previous one:
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \GFC[b:z] \cw{this is a small} \NC \cw{table} \NC in which we \NC \FR
+%D \NC \cw{will demonstrate} \GFC[c:y] \cw{that this} \GTC[c] \cw{positioning} \NC \MR
+%D \GSC[a:x] \cw{mechanism also} \GTC[b] \cw{works quite well} \NC in tables \NC \LR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+% \definepositionframed[w][background=color,backgroundcolor=yellow]
+% \definepositionframed[x][background=color,backgroundcolor=red]
+% \definepositionframed[y][background=color,backgroundcolor=green]
+% \definepositionframed[z][background=color,backgroundcolor=blue]
+%
+% \starttabulate[|c|c|c|]
+% \NC this is a small \NC table \NC in which we \NC \FR
+% \NC will demonstrate \NC that this \NC positioning \NC \MR
+% \NC mechanism also \NC works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \GFC[f:x] this is a small \GTC table \NC in which we \NC \FR
+% \NC will demonstrate \GFC[g:z] that this \GTC[g] positioning \NC \MR
+% \GSC[e:y] mechanism also \GTC[f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \GFC[f:x,d:w] this is a small \GTC[d] table \NC in which we \NC \FR
+% \NC will demonstrate \GFC[g:z] that this \GTC[g] positioning \NC \MR
+% \GSC[e:y] mechanism also \GTC[f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \XC[+f:x] this is a small \XC table \NC in which we \NC \FR
+% \NC will demonstrate \XC[+g:z] that this \XC[-g] positioning \NC \MR
+% \XC[=e:y] mechanism also \XC[-f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+%
+% \starttabulate[|c|c|c|]
+% \XC[+f:x,+d:w] this is a small \XC[-d] table \NC in which we \NC \FR
+% \NC will demonstrate \XC[+g:z] that this \XC[-g] positioning \NC \MR
+% \XC[=e:y] mechanism also \XC[-f] works quite well \NC in tables \NC \LR
+% \stoptabulate
+
+% evt [b:x]
+%
+% \definepositionframed[x][background=color,fillcolor=red]
+% \definepositionframed[y][background=color,fillcolor=green]
+% \definepositionframed[z][background=color,fillcolor=blue]
+
+\def\remappositionframed#1#2% from to
+ {\copyposition{b:#1}{b:#2}%
+ \copyposition{e:#1}{e:#2}%
+ \dosetpositionaction{b:#2}{\dopositionaction{b:#1}}}
+
+\unexpanded\def\definepositionframed
+ {\dodoubleargument\dodefinepositionframed}
+
+\def\dodefinepositionframed[#1][#2]%
+ {\dosetpositionaction{b:#1}{\dopositionframed[#1][#2]}}
+
+\def\positionframed
+ {\dodoubleempty\dopositionframed}
+
+\def\dopositionframed[#1][#2]%
+ {\bgroup
+ \setbox\scratchbox\hbox
+ {\dimen0=\MPx{e:#1}%
+ \advance\dimen0 -\MPx{b:#1}%
+ \dimen2=\MPy{b:#1}%
+ \advance\dimen2 -\MPy{e:#1}%
+ \advance\dimen2 \MPd{e:#1}%
+ \lower\dimen2\hbox
+ {\advance\dimen2 \MPh{b:#1}%
+ \framed
+ [\c!width=\dimen0,\c!height=\dimen2,
+ \c!offset=\v!overlay,#2]{}}}%
+ \smashedbox\scratchbox
+ \egroup}
+
+% \def\sethdistances#1%
+% {\hbox{\lpos{ml:#1}\hpos{mh:#1}{\strut}\rpos{mr:#1}}}
+%
+% \def\gethdistances#1%
+% {\scratchdimen\MPx{mh:#1}%
+% \advance\scratchdimen -\MPx{ml#1}%
+% \edef\lefthdistance{\the\scratchdimen}%
+% \scratchdimen\MPx{mr:#1}%
+% \advance\scratchdimen -\MPx{mh:#1}%
+% \edef\righthdistance{\the\scratchdimen}}
+
+\protect \endinput
+
+% todo 1: shift down option
+
+% \startuseMPgraphic{mpos:par:columnset}
+% \iftracepositions show_multi_pars \else draw_multi_pars \fi ;
+% path p ; p := boundingbox currentpicture ;
+% currentpicture := currentpicture shifted (0,-StrutDepth/2) ;
+% setbounds currentpicture to p ;
+% \stopuseMPgraphic
+
+\definetextbackground[underline] [location=text,alternative=1,background=,frame=off]
+\definetextbackground[overstrike] [location=text,alternative=2,background=,frame=off]
+\definetextbackground[exlines] [location=text,alternative=3,background=,frame=off]
+\definetextbackground[strikethrough][location=text,alternative=4,background=,frame=off]
+
+\definestartstop [underline]
+ [before={\starttextbackground[underline]},
+ after=\stoptextbackground]
+
+\definestartstop
+ [overstrike]
+ [before={\starttextbackground[overstrike]},
+ after=\stoptextbackground]
+
+\definestartstop
+ [exlines]
+ [before={\starttextbackground[exlines]},
+ after=\stoptextbackground]
+
+\definestartstop
+ [strikethrough]
+ [before={\starttextbackground[strikethrough]},
+ after=\stoptextbackground]
+
+\definetextbackground
+ [sideline]
+ [mp=mpos:par:sideline,
+ location=paragraph,
+ framecolor=red,
+ frameoffset=5mm]
+
+\definestartstop [sideline]
+ [before={\starttextbackground[sideline]},
+ after=\stoptextbackground]
+
+\starttext
+ \startunderline \input tufte \stopunderline \blank
+ \startoverstrike \input tufte \stopoverstrike \blank
+ \startexlines \input tufte \stopexlines \blank
+ \startstrikethrough \input tufte \stopstrikethrough \blank
+ \startsideline \input tufte \stopsideline \blank
+\stoptext
diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua
new file mode 100644
index 000000000..8066af4ce
--- /dev/null
+++ b/tex/context/base/anch-pos.lua
@@ -0,0 +1,166 @@
+if not modules then modules = { } end modules ['anch-pos'] = {
+ version = 1.001,
+ comment = "companion to anch-pos.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>We save positional information in the main utility table. Not only
+can we store much more information in <l n='lua'/> but it's also
+more efficient.</p>
+--ldx]]--
+
+local concat, format = table.concat, string.format
+local texprint, ctxcatcodes = tex.print, tex.ctxcatcodes
+local lpegmatch = lpeg.match
+
+jobpositions = jobpositions or { }
+jobpositions.collected = jobpositions.collected or { }
+jobpositions.tobesaved = jobpositions.tobesaved or { }
+
+-- these are global since they are used often at the tex end
+
+-- \the\dimexpr #2\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax
+-- \the\dimexpr #3\ifnum\positionanchormode=\plusone-\MPy\pageanchor\fi\relax
+
+ptbs, pcol = jobpositions.tobesaved, jobpositions.collected -- global
+
+local dx, dy = "0pt", "0pt"
+
+local function initializer()
+ ptbs, pcol = jobpositions.tobesaved, jobpositions.collected
+ local p = pcol["page:0"] -- page:1
+ if p then
+-- to be checked !
+--~ dx, dy = p[2] or "0pt", p[3] or "0pt"
+ end
+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)
+ commands.testcase(jobpositions.collected[name] or ptbs[name])
+end
+
+function jobpositions.MPp(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[1]) or '0' ) end
+function jobpositions.MPx(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[2]) or '0pt') end
+function jobpositions.MPy(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[3]) or '0pt') end
+function jobpositions.MPw(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[4]) or '0pt') end
+function jobpositions.MPh(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[5]) or '0pt') end
+function jobpositions.MPd(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[6]) or '0pt') end
+
+
+function jobpositions.MPx(id)
+ local jpi = pcol[id] or ptbs[id]
+ local x = jpi and jpi[2]
+ if x then
+ texprint(ctxcatcodes,format('\\the\\dimexpr%s-%s\\relax',x,dx)) -- no space after dimexpr !
+ else
+ texprint(ctxcatcodes,'0pt')
+ end
+end
+
+function jobpositions.MPy(id)
+ local jpi = pcol[id] or ptbs[id]
+ local y = jpi and jpi[3]
+ if y then
+ texprint(ctxcatcodes,format('\\the\\dimexpr%s-%s\\relax',y,dy)) -- no space after dimexpr !
+ else
+ texprint(ctxcatcodes,'0pt')
+ end
+end
+
+-- the following are only for MP so there we can leave out the pt
+
+-- can be writes and no format needed any more
+
+function jobpositions.MPxy(id)
+ local jpi = pcol[id] or ptbs[id]
+ if jpi then
+ texprint(ctxcatcodes,format('(%s-%s,%s-%s)',jpi[2],dx,jpi[3],dy))
+--~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'-',dy,')')
+ else
+ texprint(ctxcatcodes,'(0,0)')
+ end
+end
+
+function jobpositions.MPll(id)
+ local jpi = pcol[id] or ptbs[id]
+ if jpi then
+ texprint(ctxcatcodes,format('(%s-%s,%s-%s-%s)',jpi[2],dx,jpi[3],jpi[6],dy))
+--~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'-',jpi[6],'-',dy,')')
+ else
+ texprint(ctxcatcodes,'(0,0)')
+ end
+end
+
+function jobpositions.MPlr(id)
+ local jpi = pcol[id] or ptbs[id]
+ if jpi then
+ texprint(ctxcatcodes,format('(%s+%s-%s,%s-%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[6],dy))
+--~ texprint(ctxcatcodes,'(',jpi[2],'+',jpi[4],'-',dx,',',jpi[3],'-',jpi[6],'-',dy,')')
+ else
+ texprint(ctxcatcodes,'(0,0)')
+ end
+end
+
+function jobpositions.MPur(id)
+ local jpi = pcol[id] or ptbs[id]
+ if jpi then
+ texprint(ctxcatcodes,format('(%s+%s-%s,%s+%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[5],dy))
+--~ texprint(ctxcatcodes,'(',jpi[2],'+',jpi[4],'-',dx,',',jpi[3],'+',jpi[5],'-',dy,')')
+ else
+ texprint(ctxcatcodes,'(0,0)')
+ end
+end
+
+function jobpositions.MPul(id)
+ local jpi = pcol[id] or ptbs[id]
+ if jpi then
+ texprint(ctxcatcodes,format('(%s-%s,%s+%s-%s)',jpi[2],dx,jpi[3],jpi[5],dy))
+--~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'+',jpi[5],'-',dy,')')
+ else
+ texprint(ctxcatcodes,'(0,0)')
+ end
+end
+
+function jobpositions.MPpos(id)
+ local jpi = pcol[id] or ptbs[id]
+ if jpi then
+ texprint(ctxcatcodes,concat(jpi,',',1,6))
+ else
+ texprint(ctxcatcodes,'0,0,0,0,0,0')
+ end
+end
+
+local splitter = lpeg.Ct(lpeg.splitat(","))
+
+function jobpositions.MPplus(id,n,default)
+ local jpi = pcol[id] or ptbs[id]
+ if not jpi then
+ texprint(ctxcatcodes,default)
+ else
+ local split = jpi[0]
+ if not split then
+ split = lpegmatch(splitter,jpi[7])
+ jpi[0] = split
+ end
+ texprint(ctxcatcodes,split[n] or default)
+ end
+end
+
+function jobpositions.MPrest(id,default)
+ local jpi = pcol[id] or ptbs[id]
+ -- texprint(ctxcatcodes,(jpi and jpi[7] and concat(jpi,",",7,#jpi)) or default)
+ texprint(ctxcatcodes,(jpi and jpi[7]) or default)
+end
diff --git a/tex/context/base/anch-pos.mkii b/tex/context/base/anch-pos.mkii
new file mode 100644
index 000000000..589c4aa26
--- /dev/null
+++ b/tex/context/base/anch-pos.mkii
@@ -0,0 +1,877 @@
+%D \module
+%D [ file=anch-pos,
+%D version=1999.08.01,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Positioning 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.
+
+% needs a cleanup, things may change; we also need to move the mp
+% related code to meta-pos
+
+% shorter tags, ..:achtergrond:.. etc in pos actions
+
+% dubbele text- * pos's eruit
+
+% class pos -> als gelijk aan vorige, dan niet niet definieren
+% en erven, maw:
+%
+% 1 -> opslaan
+% 2 -> undef, dus == prev
+% 3 -> undef, dus == prev
+% 4 -> opslaan
+
+\writestatus{loading}{ConTeXt Anchoring Macros / Positioning}
+
+% todo: topskip als optie voor eerste regel achtergrond
+% todo: build pos layers on top of layers
+% todo: positionlayer pos van text-1 etc delen
+
+%D Although \TEX\ has a rather powerful channel to the outside
+%D world, called \type {\special}, real communication with
+%D other programs is complicated by the fact that no positional
+%D information is available. Mid 1999, I discussed this with
+%D \THANH, the author of \PDFTEX, and after some experiments,
+%D \PDFTEX\ was extended with a simple but effective mechanism,
+%D that provided positional information. The interesting
+%D thought is that, although \TEX\ is frozen, similar
+%D functionality could have been achieved with \type
+%D {\specials} and an additional \DVI\ postprocessor.
+%D
+%D Since we want to be as compatible as can be, \CONTEXT\ will
+%D support both methods, although the development is primarily
+%D driven by the \PDFTEX\ way of doing things. Since the
+%D mechanism is basically not limited to one application, for
+%D the moment we stick to building the functionality around one
+%D \CONTEXT\ special command, but at the same time we keep our
+%D eyes open for extensions in other directions.
+%D
+%D A question that may arise when one reads this module, is to
+%D what extend these macros are generic, in the sense that they
+%D could be collected in a support module instead of a core
+%D module. Since the mechanism described here will closely
+%D cooperate with the \METAPOST\ support built in \CONTEXT,
+%D which in turn will be tightly integrated with the \CONTEXT\
+%D overlay mechanisms, I decided to write a core module instead
+%D of a support one. This makes even more sense, when one takes
+%D into account that this kind of support depends on special
+%D drivers.
+
+\unprotect
+
+%D The first application of positional information was embedded
+%D graphics. Since we are interacting with text, it made sense
+%D to take the current line height and depth into account too.
+%D This is why we have two basic position macros: one for
+%D simple positions, and one for boxes.
+%D
+%D We could have sticked to one special, and actually did so in
+%D earlier experiments, but for convenience, as well for
+%D clearness, we now have two alternatives. This approach will
+%D save us quite some bytes when storing large quantities of
+%D positional information. We save as less information as
+%D needed, that is, we save no dimensions, in a \METAPOST\
+%D friendly way.
+%D
+%D The three specials involved are:
+%D
+%D \starttyping
+%D \dosetposition {identifier}
+%D \dosetpositionwhd {identifier} {width} {height} {depth}
+%D \dosetpositionplus {identifier} {width} {height} {depth} {list}
+%D \dosetpositionpapersize {width} {height}
+%D \stoptyping
+
+\newbox\positionbox
+\newif \ifpositioning
+
+\def\POSprefix{POS::}
+
+\def\setpospxy#1#2#3#4%
+ {\@EA\xdef\csname\POSprefix#1\endcsname
+ {\number#2,%
+ \the\dimexpr#3\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax,%
+ \the\dimexpr#4\ifnum\positionanchormode=\plusone-\MPy\pageanchor\fi\relax}}
+
+\def\setpospxywhd#1#2#3#4#5#6#7%
+ {\@EA\xdef\csname\POSprefix#1\endcsname
+ {\number#2,%
+ \the\dimexpr#3\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax,%
+ \the\dimexpr#4\ifnum\positionanchormode=\plusone-\MPy\pageanchor\fi\relax,%
+ \the\dimexpr#5\relax,%
+ \the\dimexpr#6\relax,%
+ \the\dimexpr#7\relax}}
+
+\def\setpospxyplus#1#2#3#4#5#6#7#8%
+ {\@EA\xdef\csname\POSprefix#1\endcsname
+ {\number#2,%
+ \the\dimexpr#3\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax,%
+ \the\dimexpr#4\ifnum\positionanchormode=\plusone-\MPy\pageanchor\fi\relax,%
+ \the\dimexpr#5\relax,%
+ \the\dimexpr#6\relax,%
+ \the\dimexpr#7\relax,%
+ #8}}
+
+%D This is real tricky! The page anchor is applied to the
+%D page box and therefore flushed first. So, when present, it
+%D is applied to all positions except itself.
+
+\chardef\positionanchormode=0 % don't relocate page origin
+\chardef\positionanchormode=1 % relocate page origin once
+
+%D The core set macros.
+
+\def\pxypos {\pospxy} % obsolete
+\def\pxyposwhd {\pospxywhd} % obsolete
+\def\pxyposplus{\pospxyplus} % obsolete
+
+\def\resetpositions
+ {\let\pospxy \gobblefourarguments
+ \let\pospxywhd \gobblesevenarguments
+ \let\pospxyplus\gobbleeightarguments}
+
+\def\setpositions
+ {\let\pospxy \setpospxy
+ \let\pospxywhd \setpospxywhd
+ \let\pospxyplus\setpospxyplus}
+
+%D We need to initialize.
+
+\resetpositions
+
+\addutilityreset{positions}
+
+%D Sometimes we want to trick the position handler a bit:
+
+\def\replacepospxywhd#1#2#3#4#5#6#7%
+ {\@EA\xdef\csname\POSprefix#1\endcsname
+ {\number#2,%
+ \the\dimexpr#3\relax,%
+ \the\dimexpr#4\relax,%
+ \the\dimexpr#5\relax,%
+ \the\dimexpr#6\relax,%
+ \the\dimexpr#7\relax}}
+
+%D For postprocessing purposes, we save the number of
+%D positions.
+
+\newcount\currentpositions % current number of positions
+\newcounter\totalnofpositions % total from previous run
+
+\appendtoks
+ \expanded{\savecurrentvalue\noexpand\totalnofpositions{\the\currentpositions}}%
+\to \everybye
+
+%D The next switch can be used to communicate a special
+%D situation. Positioning and associated actions can be
+%D executed any time. However, in for instance backgrounds
+%D they can be collected in a layer, for instance the text
+%D layer (especially the hidden text layer). In the case of
+%D floats, we run into problems, since the page information is
+%D not applicable when the content floats indeed. In such
+%D situations one can treat positions and graphics local.
+
+\newif\iflocalpositioning
+
+%D Watch out: sometimes a pagebreak occurs inside a float
+%D placement, so there we need to disable local mode.
+
+\appendtoks
+ \localpositioningtrue
+\to \everyinsidefloat
+
+\appendtoks
+ \localpositioningfalse
+\to \everypagebody
+
+\def\checkpositions
+ {\startnointerference
+ \protectlabels
+ \doutilities{positions}\jobname\empty\relax\relax
+ \global\let\checkpositions\relax
+ \stopnointerference}
+
+%D Since the positional values are to be fully expandable, we
+%D need to preload them as soon as possible, which is why we
+%D load the data when we start a text.
+
+\appendtoks \checkpositions \to \everystarttext
+
+%D Positions are either generated at a delayed write time
+%D (in \PDFTEX), or derived from the dvi file. The actual
+%D method is implemented in a special driver. If needed, the
+%D driver can fall back on the following macros.
+
+\def\dolazysaveposition#1#2#3#4% tag page x y
+ {\expanded{\writeutilitycommand{\noexpand\pospxy
+ {#1}{#2}{#3}{#4}}}}
+
+\def\dolazysavepositionwhd#1#2#3#4#5#6#7% tag page x y w h d
+ {\expanded{\writeutilitycommand{\noexpand\pospxywhd
+ {#1}{#2}{#3}{#4}{#5}{#6}{#7}}}}
+
+\def\dolazysavepositionplus#1#2#3#4#5#6#7#8% tag page x y w h d list
+ {\expanded{\writeutilitycommand{\noexpand\pospxyplus
+ {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}}
+
+\def\dosaveposition#1#2#3#4% tag page x y
+ {\expanded{\immediatewriteutilitycommand{\noexpand\pospxy
+ {#1}{#2}{#3}{#4}}}}
+
+\def\dosavepositionwhd#1#2#3#4#5#6#7% tag page x y w h d
+ {\expanded{\immediatewriteutilitycommand{\noexpand\pospxywhd
+ {#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{\immediatewriteutilitycommand{\noexpand\pospxyplus
+ {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}}
+
+%D \macros
+%D {MPp, MPx, MPy, MPw, MPh, MPd,
+%D MPxy, MPll, MPlr, MPur, MPul, MPpos}
+%D
+%D Access to the positional information is provided by macros
+%D with short names that are clearly meant for \METAPOST.
+
+\def\MPp {\doMPxyhdwlr\doMPp }
+\def\MPx {\doMPxyhdwlr\doMPx }
+\def\MPy {\doMPxyhdwlr\doMPy }
+\def\MPw {\doMPxyhdwlr\doMPw }
+\def\MPh {\doMPxyhdwlr\doMPh }
+\def\MPd {\doMPxyhdwlr\doMPd }
+\def\MPxy {\doMPxyhdwlr\doMPxy }
+\def\MPll {\doMPxyhdwlr\doMPll }
+\def\MPlr {\doMPxyhdwlr\doMPlr }
+\def\MPur {\doMPxyhdwlr\doMPur }
+\def\MPul {\doMPxyhdwlr\doMPul }
+\def\MPpos{\doMPxyhdwlr\doMPpos}
+
+\def\doMPp #1,#2,#3,#4,#5,#6,#7\relax{#1}
+\def\doMPx #1,#2,#3,#4,#5,#6,#7\relax{#2}
+\def\doMPy #1,#2,#3,#4,#5,#6,#7\relax{#3}
+\def\doMPw #1,#2,#3,#4,#5,#6,#7\relax{#4}
+\def\doMPh #1,#2,#3,#4,#5,#6,#7\relax{#5}
+\def\doMPd #1,#2,#3,#4,#5,#6,#7\relax{#6}
+\def\doMPxy #1,#2,#3,#4,#5,#6,#7\relax{(#2,#3)}
+\def\doMPll #1,#2,#3,#4,#5,#6,#7\relax{(#2,#3-#6)}
+\def\doMPlr #1,#2,#3,#4,#5,#6,#7\relax{(#2+#4,#3-#6)}
+\def\doMPur #1,#2,#3,#4,#5,#6,#7\relax{(#2+#4,#3+#5)}
+\def\doMPul #1,#2,#3,#4,#5,#6,#7\relax{(#2,#3+#5)}
+\def\doMPpos#1,#2,#3,#4,#5,#6,#7\relax{#1,#2,#3,#4,#5,#6}
+
+\def\doMPxyhdwlr#1#2%
+ {\ifcsname\POSprefix#2\endcsname
+ \@EA\@EA\@EA#1\csname\POSprefix#2\endcsname,0pt,0pt,0pt,0pt\relax
+ \else
+ #10,0pt,0pt,0pt,0pt,0pt,0pt\relax
+ \fi}
+
+%D \macros
+%D {MPplus, MPrest, MPv, MPvv}
+%D
+%D Since we will probably keep on extending, we provide a
+%D general extension macro. The plus alternative takes an
+%D extra argument, denoting what additional parameter to pick
+%D up. So, the third extra is fetched with,
+%D
+%D \starttyping
+%D \MPplus{identifier}{3}{default}
+%D \stoptyping
+%D
+%D All extras (comma separated) are fetched with:
+%D
+%D \starttyping
+%D \MPrest{identifier}
+%D \stoptyping
+%D
+%D The extra parameters are not treated.
+
+\def\MPplus {\MPdoplus\doMPplus}
+\def\MPrest#1{\MPdoplus\doMPrest{#1}{}}
+
+\def\MPdoplus#1#2#3#4%
+ {\ifcsname\POSprefix#2\endcsname
+ \@EA\@EA\@EA#1\csname\POSprefix#2\endcsname,,,,,,,,,\relax{#3}%
+ \else
+ #4%
+ \fi}
+
+\def\doMPplus#1,#2,#3,#4,#5,#6,%
+ {\dodoMPplus}
+
+\def\dodoMPplus#1,#2,#3,#4,#5,#6,#7,#8\relax#9%
+ {\ifcase#9\or#1\or#2\or#3\or#4\or#5\or#6\or#7\else\dododoMPplus#8\relax{#9}\fi}
+
+\def\dododoMPplus#1,#2,#3,#4,#5,#6,#7,#8\relax#9%
+ {\ifcase#9\or\or\or\or\or\or\or\or#1\or#2\or#3\or#4\or#5\or#6\or#7\fi}
+
+\def\doMPrest#1,#2,#3,#4,#5,#6,#7,,#8\relax#9%
+ {#7}
+
+%D \macros
+%D {MPanchor}
+%D
+%D For readability we define a few synonyms:
+
+\def\MPanchor{\MPpos}
+
+%D \macros
+%D {POSp, POSx, POSy, POSh, POSd, POSw}
+%D
+%D and:
+
+\def\POSp{\MPp} \def\POSx{\MPx} \def\POSy{\MPy}
+\def\POSh{\MPh} \def\POSd{\MPd} \def\POSw{\MPw}
+
+%D There are two low level positioning macros. Both store the
+%D position as well as execute an action associated with that
+%D position.
+
+\def\initializenextposition
+ {\ifpositioning \else
+ \global\positioningtrue
+ \dosetpositionpapersize
+ {\printpaperwidth }%
+ {\printpaperheight}%
+ \fi
+ \global\advance\currentpositions\plusone}
+
+\def\setpositiononly#1%
+ {\iftrialtypesetting
+ % nothing
+ \else
+ \initializenextposition
+ \def\currentposition{#1}%
+ \dosetposition\currentposition
+ \fi}
+
+\def\setposition#1%
+ {\iftrialtypesetting
+ % nothing
+ \else
+ \initializenextposition
+ \def\currentposition{#1}%
+ \dosetposition\currentposition
+ \traceposstring\llap\green{\currentposition>}%
+ \dopositionaction\currentposition
+ \fi}
+
+\def\setpositiondata#1#2#3#4%
+ {\iftrialtypesetting \else
+ \initializenextposition
+ \hbox
+ {\def\currentposition{#1}%
+ \dosetpositionwhd\currentposition
+ {\the\dimexpr#2\relax}%
+ {\the\dimexpr#3\relax}%
+ {\the\dimexpr#4\relax}%
+ \traceposstring\llap\green{\currentposition>}%
+ \dopositionaction\currentposition
+ \hss}%
+ \fi}
+
+\def\setpositionbox#1%
+ {\dowithnextbox
+ {\iftrialtypesetting
+ \flushnextbox
+ \else
+ \initializenextposition
+ \hbox to \nextboxwd
+ {\edef\currentposition{#1}%
+ \dosetpositionwhd\currentposition
+ {\the\nextboxwd}%
+ {\the\nextboxht}%
+ {\the\nextboxdp}%
+ \traceposstring\llap\green{\currentposition>}%
+ \setbox\positionbox\flushnextbox
+ \dopositionaction\currentposition
+ \box\positionbox
+ \hss}%
+ \fi}}
+
+\def\setpositiondataplus#1#2#3#4#5%
+ {\iftrialtypesetting \else
+ \initializenextposition
+ \hbox % bug: to \nextboxwd
+ {\edef\currentposition{#1}%
+ \dosetpositionplus\currentposition
+ {\the\dimexpr#2\relax}%
+ {\the\dimexpr#3\relax}%
+ {\the\dimexpr#4\relax}%
+ {#5}%
+ \traceposstring\rlap\magenta{<\currentposition}%
+ \dopositionaction\currentposition
+ \hss}%
+ \fi}
+
+\def\setpositionplus#1#2%
+ {\dowithnextbox
+ {\iftrialtypesetting
+ \flushnextbox
+ \else
+ \initializenextposition
+ \hbox to \nextboxwd
+ {\edef\currentposition{#1}%
+ \dosetpositionplus\currentposition
+ {\the\nextboxwd}%
+ {\the\nextboxht}%
+ {\the\nextboxdp}%
+ {#2}%
+ \traceposstring\rlap\magenta{<\currentposition}%
+ \setbox\positionbox\flushnextbox
+ \dopositionaction\currentposition
+ \box\positionbox
+ \hss}%
+ \fi}}
+
+\let\currentposition\s!unknown
+
+%D A few more low level macros take care of defining and
+%D recalling actions. We could save this information in the
+%D position containers themselves, this would save hash
+%D entries, but at the cost of much more time consuming
+%D expansion. Actions are saved globally!
+
+\newtoks\everypositionaction
+
+\let\POSactionprefix\POSprefix
+
+\def\dosetpositionaction#1%
+ {\setgvalue{\POSactionprefix#1::}}
+
+%D The lists can become quite long (also because there can
+%D be lots of parameters passed on) so we provide a hook
+%D to clean up the list afterwards.
+
+\let\cleanuppositionaction\gobbleoneargument
+
+\def\doifpositionaction#1%
+ {\ifcsname\POSactionprefix#1::\endcsname
+ \@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
+ \fi}
+
+\def\doifpositionactionelse#1%
+ {\ifcsname\POSactionprefix#1::\endcsname
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+%D We can copy a position with:
+%D
+%D \starttyping
+%D \copyposition {to} {from}
+%D \stoptyping
+%D
+%D Again, this is a global action.
+
+\def\copyposition#1#2%
+ {\ifcsname\POSprefix#2\endcsname
+ \global\@EA\let\csname\POSprefix#1\@EA\endcsname\csname\POSprefix#2\endcsname
+ \fi}
+
+%D The fact that handling positions is a two pass operation, is
+%D one of the reasons why we need to be able to test for
+%D existence, using:
+%D
+%D \starttyping
+%D \doifpositionelse {identifier} {found action} {not found action}
+%D \stoptyping
+
+\def\doifpositionelse#1%
+ {\ifcsname\POSprefix#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D We have now arrived at a few macros that would make sense as
+%D support macros, but ended up in the core.
+
+%D \macros
+%D {xypos}
+%D
+%D We have several macros available to save positions. Later
+%D we will see applications.
+%D
+%D \starttabulate[|l|l||]
+%D \NC \type {\xypos} \NC \NC simple position with no dimensions \NC \NR
+%D \NC \type {\hpos} \NC \NC position and characteristics of a \type {\hbox} \NC \NR
+%D \NC \type {\vpos} \NC \NC position and characteristics of a \type {\vbox} \NC \NR
+%D \NC \type {\bpos} \NC b: \NC begin point in a line \NC \NR
+%D \NC \type {\epos} \NC e: \NC end point in a line \NC \NR
+%D \NC \type {\fpos} \NC f: \NC begin point in a paragraph \NC \NR
+%D \NC \type {\tpos} \NC t: \NC end point in a paragraph \NC \NR
+%D \stoptabulate
+%D
+%D Each macro takes an identifier as argument, and the \type
+%D {\hpos} and \type {\vpos} also expect box content.
+
+% \def\xypos{\initializenextposition\dosetposition}
+
+\let\xypos\setpositiononly
+
+\def\hpos#1{\dontleavehmode\setpositionbox{#1}\hbox}
+\def\vpos#1{\setpositionbox{#1}\vbox}
+
+\def\bpos#1{\hpos{b:#1}{\strut}\ignorespaces}
+\def\epos#1{\removelastspace\hpos{e:#1}{\strut}}
+
+\def\fpos#1%
+ {\setpositionplus{b:#1}{\number\parposcounter}\horizontalstrut
+ \ignorespaces}
+
+\def\tpos#1%
+ {\removelastspace
+ \setpositionplus{e:#1}{\number\parposcounter}\horizontalstrut}
+
+\def\ffpos#1%
+ {\setpositionplus{b:#1}{\number\parposcounter}\horizontalstrut\wpos{#1}%
+ \ignorespaces}
+
+\def\ttpos#1%
+ {\removelastspace
+ \setpositionplus{e:#1}{\number\parposcounter}\horizontalstrut}
+
+\def\wpos#1%
+ {\dontleavehmode\vadjust % may disappear if buried
+ {\setbox0\hbox{\raise\strutdp\hbox{\rawwpos{#1}}}%
+ \rlap{\smashedbox0}}}
+
+\def\wwpos#1% \hsmashed{\llap{\rawwpos{#1}}}
+ {\rlap
+ {\setbox0\hbox{\rawwpos{#1}}%
+ \smashedbox0}}
+
+\def\rawwpos#1%
+ {\hpos{w:#1}
+ {\strut
+ \hskip-\leftskip
+ \hskip\hsize
+ \hskip-\rightskip}}
+
+% the next macro disables par positions (in inner boxes) and
+% only registers the width
+
+\def\setinnerparpositions
+ {\let\fpos\ffpos
+ \let\tpos\ttpos
+ \let\wpos\wwpos}
+
+% example of usage: (see for application "techniek")
+%
+% \appendtoks
+% \setinnerparpositions
+% \to \everytabulate
+
+%D When we want to calculate more complex backgrounds, we
+%D need to know what the current indentation scheme is. At
+%D the cost of many positions and memory, we can keep track
+%D of them. This mechanism is activated automatically
+%D based on information collected in the previous pass.
+
+\newcount\parposcounter
+
+\newif\ifpositioningpar
+
+% we can check for used entries, and if not, then not add one
+
+\def\enableparpositions % global
+ {\global\positioningtrue
+ \global\positioningpartrue}
+
+\def\disableparpositions % local
+ {\positioningparfalse}
+
+\def\registerparoptions
+ {\ifpositioningpar \ifpositioning \iftrialtypesetting \else
+ \ifinpagebody \else \ifmmode \else \ifinformula \else
+ \ifprocessingverbatim
+ \iflinepar \doregisterparoptions \fi
+ \else
+ \doregisterparoptions
+ \fi
+ \fi \fi \fi
+ \fi \fi \fi}
+
+\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
+ \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}
+
+\def\registerparsymbol
+ {\iftracepositions
+ \smashedhbox to \zeropoint
+ {\hss
+ \startcolor[blue]%
+ \llap{\infofont\number\parposcounter}%
+ \scratchdimen\onepoint
+ \vrule
+ \!!width 4\scratchdimen
+ \!!height2\scratchdimen
+ \!!depth 2\scratchdimen
+ \stopcolor
+ \hss}%
+ \fi}
+
+% \appendtoks \registerparoptions \to \everypar
+
+%D Eperimental code, don't use this yet: (must be sped up anyway)
+
+\def\@@noden{node:n:}
+\def\@@nodeo{node:o:}
+\def\@@nodep{node:p:}
+
+\def\doifelsenodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\nextnodelocation#1%
+ {\ifcsname\@@noden#1\endcsname\pluscounter{\@@noden#1}\fi}
+
+\def\newnodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \setcounter{\@@noden#1}\zerocount
+ \letgvalue {\@@nodeo#1}\!!zerocount
+ \fi}
+
+\def\tagnodelocation#1%
+ {\ifcsname\@@noden#1\endcsname\xypos{\@@nodep#1:\countervalue{\@@noden#1}}\fi}
+
+\def\getnodelocationp#1{\MPp{\@@nodep#1:\countervalue{\@@noden#1}}}
+\def\getnodelocationx#1{\MPx{\@@nodep#1:\countervalue{\@@noden#1}}}
+\def\getnodelocationy#1{\MPy{\@@nodep#1:\countervalue{\@@noden#1}}}
+
+\def\numnodelocationp#1#2{\MPp{\@@nodep#1:\number#2}}
+\def\numnodelocationx#1#2{\MPx{\@@nodep#1:\number#2}}
+\def\numnodelocationy#1#2{\MPy{\@@nodep#1:\number#2}}
+
+\def\getnodelocationn#1{\countervalue{\@@noden#1}}
+\def\getnodelocationo#1{\getvalue {\@@nodeo#1}}
+
+\chardef\nodelocationmode\plusone
+
+\def\analyzenodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \doanalyzenodelocation{#1}{\getnodelocationn{#1}}\zerocount
+ \fi}
+
+\def\doanalyzenodelocation#1#2#3% class n default
+ {\begingroup
+ \donefalse
+ \ifcase\nodelocationmode
+ % do nothing
+ \else
+ \edef\nodelocationselfn{#2}%
+ \edef\nodelocationselfp{\numnodelocationp{#1}\nodelocationselfn}%
+ \edef\nodelocationselfx{\numnodelocationx{#1}\nodelocationselfn}%
+ \edef\nodelocationselfy{\numnodelocationy{#1}\nodelocationselfn}%
+ \scratchcounter\plusone
+ \doloop
+ {\ifnum\recurselevel=\nodelocationselfn\relax
+ \donetrue
+ \else
+ \edef\nodelocationotherp{\numnodelocationp{#1}\recurselevel}%
+ \edef\nodelocationotherx{\numnodelocationx{#1}\recurselevel}%
+ \edef\nodelocationothery{\numnodelocationy{#1}\recurselevel}%
+ \ifcase\nodelocationmode
+ \or
+ % ok for single column
+ \ifcase\nodelocationotherp\relax
+ \exitloop
+ \else\ifnum\nodelocationotherp<\nodelocationselfp\relax
+ \donetrue \advance\scratchcounter\plusone
+ \else\ifnum\nodelocationotherp>\nodelocationselfp\relax
+ % skip
+ \else\ifdim\nodelocationothery>\nodelocationselfy\relax
+ \donetrue \advance\scratchcounter\plusone
+ \else\ifdim\nodelocationothery<\nodelocationselfy\relax
+ % skip
+ \else\ifdim\nodelocationotherx<\nodelocationselfx\relax
+ \donetrue \advance\scratchcounter\plusone
+ \fi\fi\fi\fi\fi\fi
+ \or
+ % acceptable for double column
+ \ifcase\nodelocationotherp\relax
+ \exitloop
+ \else\ifnum\nodelocationotherp<\nodelocationselfp\relax
+ \donetrue \advance\scratchcounter\plusone
+ \else\ifnum\nodelocationotherp>\nodelocationselfp\relax
+ % skip
+ \else\ifnum\recurselevel>\nodelocationselfn\relax
+ \donetrue \exitloop
+ \else
+ \donetrue \advance\scratchcounter\plusone
+ \fi\fi\fi\fi
+ \else
+ \exitloop
+ \fi
+ \fi}%
+ \fi
+ \ifdone \else
+ \scratchcounter#3\relax
+ \fi
+ \setxvalue{\@@nodeo#1}{\the\scratchcounter}%
+ \endgroup}
+
+\unexpanded\def\shownodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \analyzenodelocation{#1}%
+ (#1,%
+ n:\getnodelocationn{#1},%
+ p:\getnodelocationp{#1},%
+ x:\getnodelocationx{#1},%
+ y:\getnodelocationy{#1},%
+ o:\getnodelocationo{#1})%
+ \fi}
+
+%D \macros
+%D {doifoverlappingelse}
+%D
+%D A first application of positional information, is to
+%D determine if two boxes do overlap:
+%D
+%D \starttyping
+%D \doifoverlappingelse{point a}{point b}
+%D {action when overlapping}
+%D {action when not overlapping}
+%D \stoptyping
+
+\def\overlappingmargin{-2\scaledpoint}
+
+\def\doifoverlappingelse#1#2%
+ {\begingroup
+ \donefalse
+ \edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifnum\MPp\!!stringa=\MPp\!!stringb\relax
+ \!!dimena\MPx\!!stringa
+ \!!dimenb\dimexpr\MPx\!!stringa+\MPw\!!stringa\relax
+ \!!dimenc\dimexpr\MPy\!!stringa-\MPd\!!stringa\relax
+ \!!dimend\dimexpr\MPy\!!stringa+\MPh\!!stringa\relax
+ \!!dimene\MPx\!!stringb
+ \!!dimenf\dimexpr\MPx\!!stringb+\MPw\!!stringb\relax
+ \!!dimeng\dimexpr\MPy\!!stringb-\MPd\!!stringb\relax
+ \!!dimenh\dimexpr\MPy\!!stringb+\MPh\!!stringb\relax
+ \ifdim\overlappingmargin=\zeropoint\else
+ \advance\!!dimena-\overlappingmargin
+ \advance\!!dimenb+\overlappingmargin
+ \advance\!!dimenc-\overlappingmargin
+ \advance\!!dimend+\overlappingmargin
+ \advance\!!dimene-\overlappingmargin
+ \advance\!!dimenf+\overlappingmargin
+ \advance\!!dimeng-\overlappingmargin
+ \advance\!!dimenh+\overlappingmargin
+ \fi
+ % more often eh fb eg fg
+ \def\checkone##1##2%
+ {\ifdim##1<\!!dimena \else \ifdim##1>\!!dimenb \else
+ \ifdim##2<\!!dimenc \else \ifdim##2>\!!dimend \else
+ \donetrue
+ \fi\fi
+ \fi\fi}%
+ \def\checktwo##1##2%
+ {\ifdim##1<\!!dimene \else \ifdim##1>\!!dimenf \else
+ \ifdim##2<\!!dimeng \else \ifdim##2>\!!dimenh \else
+ \donetrue
+ \fi\fi
+ \fi\fi}%
+ \checkone\!!dimene\!!dimeng \ifdone \else
+ \checkone\!!dimene\!!dimenh \ifdone \else
+ \checkone\!!dimenf\!!dimeng \ifdone \else
+ \checkone\!!dimenf\!!dimenh \ifdone \else
+ \checktwo\!!dimena\!!dimenc \ifdone \else
+ \checktwo\!!dimena\!!dimend \ifdone \else
+ \checktwo\!!dimenb\!!dimene \ifdone \else
+ \checktwo\!!dimenb\!!dimenc \fi \fi \fi \fi \fi \fi \fi
+ \fi
+ \ifdone
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifpositionsonsamepageelse,
+%D doifpositionsonthispageelse}
+%D
+%D Instead of letting the user handle fuzzy expansion, we
+%D provide a simple test on positione being on the same page.
+%D
+%D \starttyping
+%D \doifpositionsonsamepageelse{point a}{point b}
+%D {action when on same page}
+%D {action when not on same page}
+%D \doifpositionsonthispageelse{point a}{point b}
+%D {action when on this page}
+%D {action when not on this page}
+%D \stoptyping
+
+\def\dodoifpositionsonsamepageelse#1#2#3#4%
+ {\bgroup
+ \scratchcounter#1\donefalse
+ \def\docommand##1%
+ {\ifcase\scratchcounter
+ \scratchcounter\MPp{##1}\donetrue
+ \else
+ \ifnum\scratchcounter=\MPp{##1}\relax\else\donefalse\fi
+ \fi}%
+ \rawprocesscommalist[#2]\docommand
+ \ifdone\egroup#3\else\egroup#4\fi}
+
+\def\doifpositionsonsamepageelse{\dodoifpositionsonsamepageelse\!!zerocount}
+\def\doifpositionsonthispageelse{\dodoifpositionsonsamepageelse\realfolio }
+
+%D Plugins:
+
+\let\MPv \MPplus
+\let\MPvv\MPrest
+
+\let\MPanchor\MPpos
+
+\let\POSp\MPp \let\POSx\MPx \let\POSy\MPy
+\let\POSh\MPh \let\POSd\MPd \let\POSw\MPw
+
+\protect \endinput
diff --git a/tex/context/base/anch-pos.mkiv b/tex/context/base/anch-pos.mkiv
new file mode 100644
index 000000000..e454747da
--- /dev/null
+++ b/tex/context/base/anch-pos.mkiv
@@ -0,0 +1,784 @@
+%D \module
+%D [ file=anch-pos, % was core-pos
+%D version=1999.08.01,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Positioning 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.
+
+% needs a cleanup, things may change; we also need to move the mp
+% related code to meta-pos
+
+% shorter tags, ..:achtergrond:.. etc in pos actions
+
+% dubbele text- * pos's eruit
+
+% class pos -> als gelijk aan vorige, dan niet niet definieren
+% en erven, maw:
+%
+% 1 -> opslaan
+% 2 -> undef, dus == prev
+% 3 -> undef, dus == prev
+% 4 -> opslaan
+
+\writestatus{loading}{ConTeXt Anchoring Macros / Positioning}
+
+% 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
+
+\registerctxluafile{anch-pos}{1.001}
+
+% todo: topskip als optie voor eerste regel achtergrond
+% todo: build pos layers on top of layers
+% todo: positionlayer pos van text-1 etc delen
+
+%D Although \TEX\ has a rather powerful channel to the outside
+%D world, called \type {\special}, real communication with
+%D other programs is complicated by the fact that no positional
+%D information is available. Mid 1999, I discussed this with
+%D \THANH, the author of \PDFTEX, and after some experiments,
+%D \PDFTEX\ was extended with a simple but effective mechanism,
+%D that provided positional information. The interesting
+%D thought is that, although \TEX\ is frozen, similar
+%D functionality could have been achieved with \type
+%D {\specials} and an additional \DVI\ postprocessor.
+%D
+%D Since we want to be as compatible as can be, \CONTEXT\ will
+%D support both methods, although the development is primarily
+%D driven by the \PDFTEX\ way of doing things. Since the
+%D mechanism is basically not limited to one application, for
+%D the moment we stick to building the functionality around one
+%D \CONTEXT\ special command, but at the same time we keep our
+%D eyes open for extensions in other directions.
+%D
+%D A question that may arise when one reads this module, is to
+%D what extend these macros are generic, in the sense that they
+%D could be collected in a support module instead of a core
+%D module. Since the mechanism described here will closely
+%D cooperate with the \METAPOST\ support built in \CONTEXT,
+%D which in turn will be tightly integrated with the \CONTEXT\
+%D overlay mechanisms, I decided to write a core module instead
+%D of a support one. This makes even more sense, when one takes
+%D into account that this kind of support depends on special
+%D drivers.
+
+\unprotect
+
+%D The first application of positional information was embedded
+%D graphics. Since we are interacting with text, it made sense
+%D to take the current line height and depth into account too.
+%D This is why we have two basic position macros: one for
+%D simple positions, and one for boxes.
+%D
+%D We could have sticked to one special, and actually did so in
+%D earlier experiments, but for convenience, as well for
+%D clearness, we now have two alternatives. This approach will
+%D save us quite some bytes when storing large quantities of
+%D positional information. We save as less information as
+%D needed, that is, we save no dimensions, in a \METAPOST\
+%D friendly way.
+%D
+%D The three specials involved are:
+%D
+%D \starttyping
+%D \dosetposition {identifier}
+%D \dosetpositionwhd {identifier} {width} {height} {depth}
+%D \dosetpositionplus {identifier} {width} {height} {depth} {list}
+%D \dosetpositionpapersize {width} {height}
+%D \stoptyping
+%D
+%D Positions are either generated at a delayed write time
+%D (in \PDFTEX), or derived from the dvi file. The actual
+%D method is implemented in a special driver. If needed, the
+%D driver can fall back on the following macros.
+
+% are the next 6 still used?
+
+\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\lastsavedpositionx {\the\dimexpr\pdflastxpos\scaledpoint\relax}
+\def\lastsavedpositiony {\the\dimexpr\pdflastypos\scaledpoint\relax}
+\let\savecurrentposition\pdfsavepos
+
+\def\dosetposition#1%
+ {\savecurrentposition
+ \normalexpanded{\ctxlatelua{ptbs['#1']={%
+ \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony"}}}}
+
+\def\dosetpositionwhd#1#2#3#4%
+ {\savecurrentposition
+ \normalexpanded{\ctxlatelua{ptbs['#1']={%
+ \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4"}}}}
+
+\def\dosetpositionplus#1#2#3#4#5%
+ {\savecurrentposition
+ \normalexpanded{\ctxlatelua{ptbs['#1']={%
+ \noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4","#5"}}}}
+
+\let\dosetpositionpapersize\gobbletwoarguments
+
+\newbox\positionbox
+\newif \ifpositioning
+
+\def\POSprefix{POS::}
+
+\let\setpospx \gobblefourarguments % suppress errors with mkii tuo file
+\let\setpospxywhd \gobblesevenarguments % suppress errors with mkii tuo file
+\let\setpospxyplus\gobbleeightarguments % suppress errors with mkii tuo file
+
+%D This is real tricky! The page anchor is applied to the
+%D page box and therefore flushed first. So, when present, it
+%D is applied to all positions except itself.
+
+\chardef\positionanchormode=0 % don't relocate page origin
+\chardef\positionanchormode=1 % relocate page origin once
+
+%D The core set macros.
+
+\let\pospxy \gobblefourarguments
+\let\pospxywhd \gobblesevenarguments
+\let\pospxyplus\gobbleeightarguments
+
+%D Sometimes we want to trick the position handler a bit:
+
+\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")}}
+
+%D For postprocessing purposes, we save the number of
+%D positions.
+
+\newcount\currentpositions % current number of positions
+
+%D The next switch can be used to communicate a special
+%D situation. Positioning and associated actions can be
+%D executed any time. However, in for instance backgrounds
+%D they can be collected in a layer, for instance the text
+%D layer (especially the hidden text layer). In the case of
+%D floats, we run into problems, since the page information is
+%D not applicable when the content floats indeed. In such
+%D situations one can treat positions and graphics local.
+
+\newif\iflocalpositioning
+
+%D Watch out: sometimes a pagebreak occurs inside a float
+%D placement, so there we need to disable local mode.
+
+\appendtoks
+ \localpositioningtrue
+\to \everyinsidefloat
+
+\appendtoks
+ \localpositioningfalse
+\to \everypagebody
+
+%D Since the positional values are to be fully expandable, we
+%D need to preload them as soon as possible, which is why we
+%D load the data when we start a text.
+
+% \appendtoks \checkpositions \to \everystarttext
+
+%D \macros
+%D {MPp, MPx, MPy, MPw, MPh, MPd,
+%D MPxy, MPll, MPlr, MPur, MPul, MPpos}
+%D
+%D Access to the positional information is provided by macros
+%D with short names that are clearly meant for \METAPOST.
+
+% \the\dimexpr\noexpand\lastsavedpositionx\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax
+% \the\dimexpr\noexpand\lastsavedpositiony\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\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")}}
+
+%D \macros
+%D {MPplus, MPrest, MPv, MPvv}
+%D
+%D Since we will probably keep on extending, we provide a
+%D general extension macro. The plus alternative takes an
+%D extra argument, denoting what additional parameter to pick
+%D up. So, the third extra is fetched with,
+%D
+%D \starttyping
+%D \MPplus{identifier}{3}{default}
+%D \stoptyping
+%D
+%D All extras (comma separated) are fetched with:
+%D
+%D \starttyping
+%D \MPrest{identifier}
+%D \stoptyping
+%D
+%D The extra parameters are not treated.
+
+\def\MPplus#1#2#3{\ctxlua{jobpositions.MPplus("#1",#2,"#3")}} \let\MPv \MPplus
+\def\MPrest #1#2{\ctxlua{jobpositions.MPrest("#1","#2")}} \let\MPvv\MPrest
+
+%D \macros
+%D {MPanchor}
+%D
+%D For readability we define a few synonyms:
+
+\def\MPanchor{\MPpos}
+
+%D \macros
+%D {POSp, POSx, POSy, POSh, POSd, POSw}
+%D
+%D and:
+
+\def\POSp{\MPp} \def\POSx{\MPx} \def\POSy{\MPy}
+\def\POSh{\MPh} \def\POSd{\MPd} \def\POSw{\MPw}
+
+%D There are two low level positioning macros. Both store the
+%D position as well as execute an action associated with that
+%D position.
+
+\def\initializenextposition
+ {\ifpositioning \else
+ \global\positioningtrue
+ \dosetpositionpapersize
+ {\printpaperwidth }%
+ {\printpaperheight}%
+ \fi
+ \global\advance\currentpositions\plusone}
+
+\def\setpositiononly#1%
+ {\iftrialtypesetting
+ % nothing
+ \else
+ \initializenextposition
+ \def\currentposition{#1}%
+ \dosetposition\currentposition
+ \fi}
+
+\def\setposition#1%
+ {\iftrialtypesetting
+ % nothing
+ \else
+ \initializenextposition
+ \def\currentposition{#1}%
+ \dosetposition\currentposition
+ \traceposstring\llap\green{\currentposition>}%
+ \dopositionaction\currentposition
+ \fi}
+
+\def\setpositiondata#1#2#3#4%
+ {\iftrialtypesetting \else
+ \initializenextposition
+ \hbox
+ {\def\currentposition{#1}%
+ \dosetpositionwhd\currentposition
+ {\the\dimexpr#2\relax}%
+ {\the\dimexpr#3\relax}%
+ {\the\dimexpr#4\relax}%
+ \traceposstring\llap\green{\currentposition>}%
+ \dopositionaction\currentposition
+ \hss}%
+ \fi}
+
+\def\setpositionbox#1%
+ {\dowithnextbox
+ {\iftrialtypesetting
+ \flushnextbox
+ \else
+ \initializenextposition
+ \hbox to \nextboxwd
+ {\edef\currentposition{#1}%
+ \dosetpositionwhd\currentposition
+ {\the\nextboxwd}%
+ {\the\nextboxht}%
+ {\the\nextboxdp}%
+ \traceposstring\llap\green{\currentposition>}%
+ \setbox\positionbox\flushnextbox
+ \dopositionaction\currentposition
+ \box\positionbox
+ \hss}%
+ \fi}}
+
+\def\setpositiondataplus#1#2#3#4#5%
+ {\iftrialtypesetting \else
+ \initializenextposition
+ \hbox % bug: to \nextboxwd
+ {\edef\currentposition{#1}%
+ \dosetpositionplus\currentposition
+ {\the\dimexpr#2\relax}%
+ {\the\dimexpr#3\relax}%
+ {\the\dimexpr#4\relax}%
+ {#5}%
+ \traceposstring\rlap\magenta{<\currentposition}%
+ \dopositionaction\currentposition
+ \hss}%
+ \fi}
+
+\def\setpositionplus#1#2%
+ {\dowithnextbox
+ {\iftrialtypesetting
+ \flushnextbox
+ \else
+ \initializenextposition
+ \hbox to \nextboxwd
+ {\edef\currentposition{#1}%
+ \dosetpositionplus\currentposition
+ {\the\nextboxwd}%
+ {\the\nextboxht}%
+ {\the\nextboxdp}%
+ {#2}%
+ \traceposstring\rlap\magenta{<\currentposition}%
+ \setbox\positionbox\flushnextbox
+ \dopositionaction\currentposition
+ \box\positionbox
+ \hss}%
+ \fi}}
+
+\let\currentposition\s!unknown
+
+%D A few more low level macros take care of defining and
+%D recalling actions. We could save this information in the
+%D position containers themselves, this would save hash
+%D entries, but at the cost of much more time consuming
+%D expansion. Actions are saved globally!
+
+\newtoks\everypositionaction
+
+\let\POSactionprefix\POSprefix
+
+\def\dosetpositionaction#1%
+ {\setgvalue{\POSactionprefix#1::}}
+
+%D The lists can become quite long (also because there can
+%D be lots of parameters passed on) so we provide a hook
+%D to clean up the list afterwards.
+
+\let\cleanuppositionaction\gobbleoneargument
+
+\def\doifpositionaction#1%
+ {\ifcsname\POSactionprefix#1::\endcsname
+ \@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
+ \fi}
+
+\def\doifpositionactionelse#1%
+ {\ifcsname\POSactionprefix#1::\endcsname
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+%D We can copy a position with:
+%D
+%D \starttyping
+%D \copyposition {to} {from}
+%D \stoptyping
+%D
+%D Again, this is a global action.
+
+\def\copyposition#1#2{\ctxlua{jobpositions.copy('#1','#2')}}
+
+%D The fact that handling positions is a two pass operation, is
+%D one of the reasons why we need to be able to test for
+%D existence, using:
+%D
+%D \starttyping
+%D \doifpositionelse {identifier} {found action} {not found action}
+%D \stoptyping
+
+\def\doifpositionelse#1{\ctxlua{jobpositions.doifelse('#1')}}
+
+%D We have now arrived at a few macros that would make sense as
+%D support macros, but ended up in the core.
+
+%D \macros
+%D {xypos}
+%D
+%D We have several macros available to save positions. Later
+%D we will see applications.
+%D
+%D \starttabulate[|l|l||]
+%D \NC \type {\xypos} \NC \NC simple position with no dimensions \NC \NR
+%D \NC \type {\hpos} \NC \NC position and characteristics of a \type {\hbox} \NC \NR
+%D \NC \type {\vpos} \NC \NC position and characteristics of a \type {\vbox} \NC \NR
+%D \NC \type {\bpos} \NC b: \NC begin point in a line \NC \NR
+%D \NC \type {\epos} \NC e: \NC end point in a line \NC \NR
+%D \NC \type {\fpos} \NC f: \NC begin point in a paragraph \NC \NR
+%D \NC \type {\tpos} \NC t: \NC end point in a paragraph \NC \NR
+%D \stoptabulate
+%D
+%D Each macro takes an identifier as argument, and the \type
+%D {\hpos} and \type {\vpos} also expect box content.
+
+% \def\xypos{\initializenextposition\dosetposition}
+
+\let\xypos\setpositiononly
+
+\def\hpos#1{\dontleavehmode\setpositionbox{#1}\hbox}
+\def\vpos#1{\setpositionbox{#1}\vbox}
+
+\def\bpos#1{\hpos{b:#1}{\strut}\ignorespaces}
+\def\epos#1{\removelastspace\hpos{e:#1}{\strut}}
+
+\def\fpos#1%
+ {\setpositionplus{b:#1}{\number\parposcounter}\horizontalstrut
+ \ignorespaces}
+
+\def\tpos#1%
+ {\removelastspace
+ \setpositionplus{e:#1}{\number\parposcounter}\horizontalstrut}
+
+\def\ffpos#1%
+ {\setpositionplus{b:#1}{\number\parposcounter}\horizontalstrut\wpos{#1}%
+ \ignorespaces}
+
+\def\ttpos#1%
+ {\removelastspace
+ \setpositionplus{e:#1}{\number\parposcounter}\horizontalstrut}
+
+\def\wpos#1%
+ {\dontleavehmode\vadjust % may disappear if buried
+ {\setbox0\hbox{\raise\strutdp\hbox{\rawwpos{#1}}}%
+ \rlap{\smashedbox0}}}
+
+\def\wwpos#1% \hsmashed{\llap{\rawwpos{#1}}}
+ {\rlap
+ {\setbox0\hbox{\rawwpos{#1}}%
+ \smashedbox0}}
+
+\def\rawwpos#1%
+ {\hpos{w:#1}
+ {\strut
+ \hskip-\leftskip
+ \hskip\hsize
+ \hskip-\rightskip}}
+
+% the next macro disables par positions (in inner boxes) and
+% only registers the width
+
+\def\setinnerparpositions
+ {\let\fpos\ffpos
+ \let\tpos\ttpos
+ \let\wpos\wwpos}
+
+% example of usage: (see for application "techniek")
+%
+% \appendtoks
+% \setinnerparpositions
+% \to \everytabulate
+
+%D When we want to calculate more complex backgrounds, we
+%D need to know what the current indentation scheme is. At
+%D the cost of many positions and memory, we can keep track
+%D of them. This mechanism is activated automatically
+%D based on information collected in the previous pass.
+
+\newcount\parposcounter
+\newif \ifpositioningpar
+\chardef \parposstrut = 1 % 0 => no strut data, so fall backs used
+\newif \iftracepositions
+
+% we can check for used entries, and if not, then not add one
+
+\def\enableparpositions % global
+ {\global\let\registerparoptions\doregisterparoptions
+ \global\positioningtrue
+ \global\positioningpartrue}
+
+\def\disableparpositions % local
+ {\positioningparfalse}
+
+\let\registerparoptions\relax
+
+\def\doregisterparoptions
+ {\ifpositioningpar \ifpositioning \iftrialtypesetting \else
+ \ifinpagebody \else \ifmmode \else \ifinformula \else
+ \ifprocessingverbatim
+ \iflinepar \dodoregisterparoptions \fi
+ \else
+ \dodoregisterparoptions
+ \fi
+ \fi \fi \fi
+ \fi \fi \fi}
+
+\def\dodoregisterparoptions
+ {\global\advance\parposcounter\plusone
+ \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}
+
+\def\registerparsymbol
+ {\iftracepositions
+ \smashedhbox to \zeropoint
+ {\hss
+ \startcolor[blue]%
+ \llap{\infofont\number\parposcounter}%
+ \scratchdimen\onepoint
+ \vrule
+ \!!width 4\scratchdimen
+ \!!height2\scratchdimen
+ \!!depth 2\scratchdimen
+ \stopcolor
+ \hss}%
+ \fi}
+
+% \appendtoks \registerparoptions \to \everypar
+
+%D Eperimental code, don't use this yet: (must be sped up anyway)
+
+\def\@@noden{node:n:}
+\def\@@nodeo{node:o:}
+\def\@@nodep{node:p:}
+
+\def\doifelsenodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\nextnodelocation#1%
+ {\ifcsname\@@noden#1\endcsname\pluscounter{\@@noden#1}\fi}
+
+\def\newnodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \setcounter{\@@noden#1}\zerocount
+ \letgvalue {\@@nodeo#1}\!!zerocount
+ \fi}
+
+\def\tagnodelocation#1%
+ {\ifcsname\@@noden#1\endcsname\xypos{\@@nodep#1:\countervalue{\@@noden#1}}\fi}
+
+\def\getnodelocationp#1{\MPp{\@@nodep#1:\countervalue{\@@noden#1}}}
+\def\getnodelocationx#1{\MPx{\@@nodep#1:\countervalue{\@@noden#1}}}
+\def\getnodelocationy#1{\MPy{\@@nodep#1:\countervalue{\@@noden#1}}}
+
+\def\numnodelocationp#1#2{\MPp{\@@nodep#1:\number#2}}
+\def\numnodelocationx#1#2{\MPx{\@@nodep#1:\number#2}}
+\def\numnodelocationy#1#2{\MPy{\@@nodep#1:\number#2}}
+
+\def\getnodelocationn#1{\countervalue{\@@noden#1}}
+\def\getnodelocationo#1{\getvalue {\@@nodeo#1}}
+
+\chardef\nodelocationmode\plusone
+
+\def\analyzenodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \doanalyzenodelocation{#1}{\getnodelocationn{#1}}\zerocount
+ \fi}
+
+\def\doanalyzenodelocation#1#2#3% class n default
+ {\begingroup
+ \donefalse
+ \ifcase\nodelocationmode
+ % do nothing
+ \else
+ \edef\nodelocationselfn{#2}%
+ \edef\nodelocationselfp{\numnodelocationp{#1}\nodelocationselfn}%
+ \edef\nodelocationselfx{\numnodelocationx{#1}\nodelocationselfn}%
+ \edef\nodelocationselfy{\numnodelocationy{#1}\nodelocationselfn}%
+ \scratchcounter\plusone
+ \doloop
+ {\ifnum\recurselevel=\nodelocationselfn\relax
+ \donetrue
+ \else
+ \edef\nodelocationotherp{\numnodelocationp{#1}\recurselevel}%
+ \edef\nodelocationotherx{\numnodelocationx{#1}\recurselevel}%
+ \edef\nodelocationothery{\numnodelocationy{#1}\recurselevel}%
+ \ifcase\nodelocationmode
+ \or
+ % ok for single column
+ \ifcase\nodelocationotherp\relax
+ \exitloop
+ \else\ifnum\nodelocationotherp<\nodelocationselfp\relax
+ \donetrue \advance\scratchcounter\plusone
+ \else\ifnum\nodelocationotherp>\nodelocationselfp\relax
+ % skip
+ \else\ifdim\nodelocationothery>\nodelocationselfy\relax
+ \donetrue \advance\scratchcounter\plusone
+ \else\ifdim\nodelocationothery<\nodelocationselfy\relax
+ % skip
+ \else\ifdim\nodelocationotherx<\nodelocationselfx\relax
+ \donetrue \advance\scratchcounter\plusone
+ \fi\fi\fi\fi\fi\fi
+ \or
+ % acceptable for double column
+ \ifcase\nodelocationotherp\relax
+ \exitloop
+ \else\ifnum\nodelocationotherp<\nodelocationselfp\relax
+ \donetrue \advance\scratchcounter\plusone
+ \else\ifnum\nodelocationotherp>\nodelocationselfp\relax
+ % skip
+ \else\ifnum\recurselevel>\nodelocationselfn\relax
+ \donetrue \exitloop
+ \else
+ \donetrue \advance\scratchcounter\plusone
+ \fi\fi\fi\fi
+ \else
+ \exitloop
+ \fi
+ \fi}%
+ \fi
+ \ifdone \else
+ \scratchcounter#3\relax
+ \fi
+ \setxvalue{\@@nodeo#1}{\the\scratchcounter}%
+ \endgroup}
+
+\unexpanded\def\shownodelocation#1%
+ {\ifcsname\@@noden#1\endcsname
+ \analyzenodelocation{#1}%
+ (#1,%
+ n:\getnodelocationn{#1},%
+ p:\getnodelocationp{#1},%
+ x:\getnodelocationx{#1},%
+ y:\getnodelocationy{#1},%
+ o:\getnodelocationo{#1})%
+ \fi}
+
+%D \macros
+%D {doifoverlappingelse}
+%D
+%D A first application of positional information, is to
+%D determine if two boxes do overlap:
+%D
+%D \starttyping
+%D \doifoverlappingelse{point a}{point b}
+%D {action when overlapping}
+%D {action when not overlapping}
+%D \stoptyping
+
+\def\overlappingmargin{-2\scaledpoint}
+
+\def\overlappingcheckone#1#2%
+ {\ifdim#1<\!!dimena \else \ifdim#1>\!!dimenb \else
+ \ifdim#2<\!!dimenc \else \ifdim#2>\!!dimend \else
+ \donetrue
+ \fi\fi
+ \fi\fi}
+
+\def\overlappingchecktwo#1#2%
+ {\ifdim#1<\!!dimene \else \ifdim#1>\!!dimenf \else
+ \ifdim#2<\!!dimeng \else \ifdim#2>\!!dimenh \else
+ \donetrue
+ \fi\fi
+ \fi\fi}
+
+\def\doifoverlappingelse#1#2% maybe do this in lua
+ {\begingroup
+ \donefalse
+ \edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifnum\MPp\!!stringa=\MPp\!!stringb\relax
+ \!!dimena\MPx\!!stringa
+ \!!dimenb\dimexpr\MPx\!!stringa+\MPw\!!stringa\relax
+ \!!dimenc\dimexpr\MPy\!!stringa-\MPd\!!stringa\relax
+ \!!dimend\dimexpr\MPy\!!stringa+\MPh\!!stringa\relax
+ \!!dimene\MPx\!!stringb
+ \!!dimenf\dimexpr\MPx\!!stringb+\MPw\!!stringb\relax
+ \!!dimeng\dimexpr\MPy\!!stringb-\MPd\!!stringb\relax
+ \!!dimenh\dimexpr\MPy\!!stringb+\MPh\!!stringb\relax
+ \ifdim\overlappingmargin=\zeropoint\else
+ \advance\!!dimena-\overlappingmargin
+ \advance\!!dimenb+\overlappingmargin
+ \advance\!!dimenc-\overlappingmargin
+ \advance\!!dimend+\overlappingmargin
+ \advance\!!dimene-\overlappingmargin
+ \advance\!!dimenf+\overlappingmargin
+ \advance\!!dimeng-\overlappingmargin
+ \advance\!!dimenh+\overlappingmargin
+ \fi
+ % more often eh fb eg fg
+ \overlappingcheckone\!!dimene\!!dimeng \ifdone \else
+ \overlappingcheckone\!!dimene\!!dimenh \ifdone \else
+ \overlappingcheckone\!!dimenf\!!dimeng \ifdone \else
+ \overlappingcheckone\!!dimenf\!!dimenh \ifdone \else
+ \overlappingchecktwo\!!dimena\!!dimenc \ifdone \else
+ \overlappingchecktwo\!!dimena\!!dimend \ifdone \else
+ \overlappingchecktwo\!!dimenb\!!dimene \ifdone \else
+ \overlappingchecktwo\!!dimenb\!!dimenc \fi \fi \fi \fi \fi \fi \fi
+ \fi
+ \ifdone
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifpositionsonsamepageelse,
+%D doifpositionsonthispageelse}
+%D
+%D Instead of letting the user handle fuzzy expansion, we
+%D provide a simple test on positione being on the same page.
+%D
+%D \starttyping
+%D \doifpositionsonsamepageelse{point a}{point b}
+%D {action when on same page}
+%D {action when not on same page}
+%D \doifpositionsonthispageelse{point a}{point b}
+%D {action when on this page}
+%D {action when not on this page}
+%D \stoptyping
+
+\def\dododoifpositionsonsamepageelse#1%
+ {\ifcase\scratchcounter
+ \scratchcounter\MPp{##}\donetrue
+ \else
+ \ifnum\scratchcounter=\MPp{#1}\relax\else\donefalse\fi
+ \fi}%
+
+\def\dodoifpositionsonsamepageelse#1#2%
+ {\begingroup
+ \scratchcounter#1\donefalse
+ \rawprocesscommalist[#2]\dododoifpositionsonsamepageelse
+ \ifdone
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifpositionsonsamepageelse{\dodoifpositionsonsamepageelse\!!zerocount}
+\def\doifpositionsonthispageelse{\dodoifpositionsonsamepageelse\realfolio }
+
+%D Plugins:
+
+\let\MPv \MPplus
+\let\MPvv\MPrest
+
+\let\MPanchor\MPpos
+
+\let\POSp\MPp \let\POSx\MPx \let\POSy\MPy
+\let\POSh\MPh \let\POSd\MPd \let\POSw\MPw
+
+\protect \endinput
diff --git a/tex/context/base/anch-snc.mkii b/tex/context/base/anch-snc.mkii
new file mode 100644
index 000000000..cf5b35d69
--- /dev/null
+++ b/tex/context/base/anch-snc.mkii
@@ -0,0 +1,177 @@
+%D \module
+%D [ file=anch-snc,
+%D version=2003.12.01,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Synchronization,
+%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 Anchoring Macros / Synchronization}
+
+\unprotect
+
+\ifx\s!set \undefined \def\s!set {set} \fi
+\ifx\s!reset \undefined \def\s!reset {reset} \fi
+\ifx\s!preset \undefined \def\s!preset {preset} \fi
+\ifx\s!syncpos\undefined \def\s!syncpos{syncpos} \fi
+
+\def\definesyncpositions[#1]%
+ {\setcounter{\s!num:\s!syncpos:#1}{0}%
+ \doglobal\appendtoksonce\getvalue {\s!reset:\s!syncpos:#1}\to\resetsyncpositions
+ \doglobal\appendtoksonce\getvalue{\s!preset:\s!syncpos:#1}\to\presetsyncpositions
+ \setgvalue{\s!syncpos:#1}{sync_n[#1] := 0 ;}%
+ \setgvalue{\s!set:\s!syncpos:#1}{\dosetsyncpositions{#1}}}
+
+\def\syncposition
+ {\dodoubleempty\dosyncposition}
+
+\def\dosyncposition[#1][#2]%
+ {\letgvalue{\s!reset:\s!syncpos:#1}\relax
+ \letgvalue{\s!preset:\s!syncpos:#1}\relax
+ \dontleavehmode
+ \dodosyncposition{#1}{#2}\s!set
+ \ignorespaces}
+
+\def\doifelselastsyncposition#1#2%
+ {\doifelse{\lastsyncclass\lastsyncposition}{#1#2}}
+
+\def\dodosyncposition#1#2#3%
+ {\letgvalue{\s!reset:\s!syncpos:#1}\relax
+ \letgvalue{\s!preset:\s!syncpos:#1}\relax
+ \ifundefined{\s!syncpos:#1}%
+ \strut
+ \else
+ \pluscounter{\s!num:\s!syncpos:#1}%
+ \setsyncpositions{#1}%
+ % option: geen w/h, alleen p 0 0 0 data
+ \setpositionplus
+ {\s!syncpos:#1:\countervalue{\s!num:\s!syncpos:#1}}%
+ {#2}%
+ \hbox{\strut\traceposstring\llap\green{#3/\countervalue{\s!num:\s!syncpos:#1}/#1/#2>>}}%
+ \fi}
+
+\def\setsyncpositions#1%
+ {\enabletextarearegistration
+ \getvalue {\s!set:\s!syncpos:#1}%
+ \letgvalue{\s!set:\s!syncpos:#1}\relax}
+
+\def\dosetsyncpositions#1%
+ {\startnointerference % removing out of sync can best be done in mp
+ \!!dimena\maxdimen
+ \!!counta\zerocount
+ \!!countc\zerocount
+ \doloop
+ {\doifpositionelse{\s!syncpos:#1:\recurselevel}
+ {\!!dimenb\MPy{\s!syncpos:#1:\recurselevel}\relax
+ \!!countb\MPp{\s!syncpos:#1:\recurselevel}\relax
+ \ifnum\!!countb=\!!counta % same page
+ \ifdim\!!dimenb>\!!dimena
+ \donefalse % out of order nodes
+ \else
+ \donetrue % nodes in order
+ \fi
+ \else
+ \donetrue % different page
+ \fi
+ \ifdone
+ \!!counta\!!countb
+ \!!dimena\!!dimenb
+ \advance\!!countc\plusone
+ \edef\!!stringa{[#1][\the\!!countc]:=}%
+ \edef\!!stringc{\s!syncpos:#1:\the\!!countc}%
+ \edef\!!stringd{\MPplus\!!stringc{1}{0}}%
+ \setxvalue{\s!syncpos:#1}%
+ {\getsyncpositions{#1}%
+ sync_p \!!stringa \MPp \!!stringc ;
+ sync_xy\!!stringa \MPxy\!!stringc ;
+ sync_w \!!stringa \MPw \!!stringc ;
+ sync_h \!!stringa \MPh \!!stringc ;
+ sync_d \!!stringa \MPd \!!stringc ;
+ \ifx\!!stringd\empty \else sync_t \!!stringa \MPplus\!!stringc{1}{0} ; \fi}%
+ \fi}
+ {\setxvalue{\s!syncpos:#1}%
+ {\getsyncpositions{#1}%
+ sync_n[#1] := \the\!!countc ;}
+ \exitloop}}%
+ \stopnointerference}
+
+\def\getsyncpositions#1%
+ {\getvalue{\s!syncpos:#1}}
+
+\newtoks\resetsyncpositions
+\newtoks\presetsyncpositions
+
+\def\resyncposition {\dodoubleargument\doresyncposition}
+\def\presyncposition{\dodoubleargument\dopresyncposition}
+
+\def\dodoresyncposition #1#2{\dodosyncposition{#1}{#2}\s!reset}
+\def\dodopresyncposition#1#2{\dodosyncposition{#1}{#2}\s!preset}
+
+\def\doresyncposition [#1][#2]{\setxvalue{\s!reset :\s!syncpos:#1}{\noexpand\dodoresyncposition{#1}{#2}}}
+\def\dopresyncposition[#1][#2]{\setxvalue{\s!preset:\s!syncpos:#1}{\noexpand\dodopresyncposition{#1}{#2}}}
+
+\def\flushsyncpositions % this order !
+ {\begingroup
+ \the\presetsyncpositions
+ \the\resetsyncpositions
+ \endgroup}
+
+\def\flushsyncxxsets#1%
+ {\setbox\scratchbox\hbox{\the#1}%
+ \ifvoid\scratchbox\else
+ \prewordbreak \let\prewordbreak\relax % only once
+ \smashbox\scratchbox
+ \box\scratchbox
+ \fi}
+
+\def\flushsyncresets {\flushsyncxxsets\resetsyncpositions }
+\def\flushsyncpresets{\flushsyncxxsets\presetsyncpositions}
+
+% \appendtoks \flushsyncpositions \to \everypar
+% \appendtoks \flushsyncpositions \to \everyheadstart
+
+% \explicitneverypar -> in grid snapper, eerst testen
+%
+% \appendtoks \flushsyncpositions \to \neverypar
+
+\protect \endinput
+
+\starttext
+
+\definesyncpositions[1]
+
+\startuseMPgraphic{sync}
+ StartPage ;
+ \getsyncpositions{1} ;
+ SyncThreshold := 2LineHeight ;
+ SyncLeftOffset := -.5LeftMarginDistance ;
+ % SetSyncThreshold(1,3,3LineHeight) ;
+ SyncWidth := - (BackSpace + SyncLeftOffset) ;
+ SetSyncColor(1,1,\MPcolor{red}) ;
+ SetSyncColor(1,2,\MPcolor{green}) ;
+ SetSyncColor(1,3,\MPcolor{blue}) ;
+ SetSyncColor(1,4,\MPcolor{yellow}) ;
+ PrepareSyncTasks(1,true,true,false) ;
+ for i = 1 upto NOfSyncPaths :
+ fill SyncPaths[i]
+ withcolor TheSyncColor(CurrentSyncClass,sync_t[CurrentSyncClass][SyncTasks[i]]) ;
+ endfor ;
+ setbounds currentpicture to Page ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay[tempoverlay][\useMPgraphic{sync}]
+
+\setupbackgrounds[page][background=tempoverlay]
+
+\syncposition[1][1] \input ward \endgraf
+\syncposition[1][2] \input ward \endgraf
+\syncposition[1][3] \input ward \endgraf
+\syncposition[1][4] \input ward \endgraf
+
+\stoptext
diff --git a/tex/context/base/anch-snc.mkiv b/tex/context/base/anch-snc.mkiv
new file mode 100644
index 000000000..f976047c9
--- /dev/null
+++ b/tex/context/base/anch-snc.mkiv
@@ -0,0 +1,185 @@
+%D \module
+%D [ file=anch-snc,
+%D version=2003.12.01,
+%D title=\CONTEXT\ Anchoring Macros,
+%D subtitle=Synchronization,
+%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.
+
+% this can be optimized (will do when used again)
+
+\writestatus{loading}{ConTeXt Anchoring Macros / Synchronization}
+
+\unprotect
+
+\ifx\s!set \undefined \def\s!set {set} \fi
+\ifx\s!reset \undefined \def\s!reset {reset} \fi
+\ifx\s!preset \undefined \def\s!preset {preset} \fi
+\ifx\s!syncpos\undefined \def\s!syncpos{syncpos} \fi
+
+\unexpanded\def\definesyncpositions[#1]%
+ {\global\let\flushsyncpositions\doflushsyncpositions % only when used
+ \setcounter{\s!num:\s!syncpos:#1}{0}%
+ \doglobal\appendtoksonce\csname\s!reset :\s!syncpos:#1\endcsname\to\resetsyncpositions
+ \doglobal\appendtoksonce\csname\s!preset:\s!syncpos:#1\endcsname\to\presetsyncpositions
+% to be tested:
+% \doglobal\expandafter\appendtoksonce\csname\s!reset :\s!syncpos:#1\endcsname\to\resetsyncpositions
+% \doglobal\expandafter\appendtoksonce\csname\s!preset:\s!syncpos:#1\endcsname\to\presetsyncpositions
+ \setgvalue{\s!syncpos:#1}{sync_n[#1] := 0 ;}%
+ \setgvalue{\s!set:\s!syncpos:#1}{\dosetsyncpositions{#1}}}
+
+\def\syncposition
+ {\dodoubleempty\dosyncposition}
+
+\def\dosyncposition[#1][#2]%
+ {\letgvalue{\s!reset :\s!syncpos:#1}\relax
+ \letgvalue{\s!preset:\s!syncpos:#1}\relax
+ \dontleavehmode
+ \dodosyncposition{#1}{#2}\s!set
+ \ignorespaces}
+
+\def\doifelselastsyncposition#1#2%
+ {\doifelse{\lastsyncclass\lastsyncposition}{#1#2}}
+
+\def\dodosyncposition#1#2#3%
+ {\letgvalue{\s!reset:\s!syncpos:#1}\relax
+ \letgvalue{\s!preset:\s!syncpos:#1}\relax
+ \ifcsname\s!syncpos:#1\endcsname
+ \pluscounter{\s!num:\s!syncpos:#1}%
+ \setsyncpositions{#1}%
+ % option: geen w/h, alleen p 0 0 0 data
+ \setpositionplus
+ {\s!syncpos:#1:\countervalue{\s!num:\s!syncpos:#1}}%
+ {#2}%
+ \hbox{\strut\traceposstring\llap\green{#3/\countervalue{\s!num:\s!syncpos:#1}/#1/#2>>}}%
+ \else
+ \strut
+ \fi}
+
+\def\setsyncpositions#1%
+ {\enabletextarearegistration
+ \getvalue {\s!set:\s!syncpos:#1}%
+ \letgvalue{\s!set:\s!syncpos:#1}\relax}
+
+\def\dosetsyncpositions#1%
+ {\startnointerference % removing out of sync can best be done in mp
+ \!!dimena\maxdimen
+ \!!counta\zerocount
+ \!!countc\zerocount
+ \doloop
+ {\doifpositionelse{\s!syncpos:#1:\recurselevel}
+ {\!!dimenb\MPy{\s!syncpos:#1:\recurselevel}\relax
+ \!!countb\MPp{\s!syncpos:#1:\recurselevel}\relax
+ \ifnum\!!countb=\!!counta % same page
+ \ifdim\!!dimenb>\!!dimena
+ \donefalse % out of order nodes
+ \else
+ \donetrue % nodes in order
+ \fi
+ \else
+ \donetrue % different page
+ \fi
+ \ifdone
+ \!!counta\!!countb
+ \!!dimena\!!dimenb
+ \advance\!!countc\plusone
+ \edef\!!stringa{[#1][\the\!!countc]:=}%
+ \edef\!!stringc{\s!syncpos:#1:\the\!!countc}%
+ \edef\!!stringd{\MPplus\!!stringc{1}{0}}%
+ \setxvalue{\s!syncpos:#1}%
+ {\getsyncpositions{#1}%
+ sync_p \!!stringa \MPp \!!stringc ;
+ sync_xy\!!stringa \MPxy\!!stringc ;
+ sync_w \!!stringa \MPw \!!stringc ;
+ sync_h \!!stringa \MPh \!!stringc ;
+ sync_d \!!stringa \MPd \!!stringc ;
+ \ifx\!!stringd\empty \else sync_t \!!stringa \MPplus\!!stringc{1}{0} ; \fi}%
+ \fi}
+ {\setxvalue{\s!syncpos:#1}%
+ {\getsyncpositions{#1}%
+ sync_n[#1] := \the\!!countc ;}
+ \exitloop}}%
+ \stopnointerference}
+
+\def\getsyncpositions#1%
+ {\getvalue{\s!syncpos:#1}}
+
+\newtoks\resetsyncpositions
+\newtoks\presetsyncpositions
+
+\def\resyncposition {\dodoubleargument\doresyncposition}
+\def\presyncposition{\dodoubleargument\dopresyncposition}
+
+\def\dodoresyncposition #1#2{\dodosyncposition{#1}{#2}\s!reset}
+\def\dodopresyncposition#1#2{\dodosyncposition{#1}{#2}\s!preset}
+
+\def\doresyncposition [#1][#2]{\setxvalue{\s!reset :\s!syncpos:#1}{\noexpand\dodoresyncposition{#1}{#2}}}
+\def\dopresyncposition[#1][#2]{\setxvalue{\s!preset:\s!syncpos:#1}{\noexpand\dodopresyncposition{#1}{#2}}}
+
+\let\flushsyncpositions\relax
+
+\def\doflushsyncpositions % this order !
+ {\begingroup
+ \the\presetsyncpositions
+ \the\resetsyncpositions
+ \endgroup}
+
+\def\flushsyncxxsets#1%
+ {\setbox\scratchbox\hbox{\the#1}%
+ \ifvoid\scratchbox\else
+ \prewordbreak \let\prewordbreak\relax % only once
+ \smashbox\scratchbox
+ \box\scratchbox
+ \fi}
+
+\def\flushsyncresets {\flushsyncxxsets\resetsyncpositions }
+\def\flushsyncpresets{\flushsyncxxsets\presetsyncpositions}
+
+% \appendtoks \flushsyncpositions \to \everypar
+% \appendtoks \flushsyncpositions \to \everyheadstart
+
+% \explicitneverypar -> in grid snapper, eerst testen
+%
+% \appendtoks \flushsyncpositions \to \neverypar
+
+\protect \endinput
+
+\starttext
+
+\definesyncpositions[1]
+
+\startuseMPgraphic{sync}
+ StartPage ;
+ \getsyncpositions{1} ;
+ SyncThreshold := 2LineHeight ;
+ SyncLeftOffset := -.5LeftMarginDistance ;
+ % SetSyncThreshold(1,3,3LineHeight) ;
+ SyncWidth := - (BackSpace + SyncLeftOffset) ;
+ SetSyncColor(1,1,\MPcolor{red}) ;
+ SetSyncColor(1,2,\MPcolor{green}) ;
+ SetSyncColor(1,3,\MPcolor{blue}) ;
+ SetSyncColor(1,4,\MPcolor{yellow}) ;
+ PrepareSyncTasks(1,true,true,false) ;
+ for i = 1 upto NOfSyncPaths :
+ fill SyncPaths[i]
+ withcolor TheSyncColor(CurrentSyncClass,sync_t[CurrentSyncClass][SyncTasks[i]]) ;
+ endfor ;
+ setbounds currentpicture to Page ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay[tempoverlay][\useMPgraphic{sync}]
+
+\setupbackgrounds[page][background=tempoverlay]
+
+\syncposition[1][1] \input ward \endgraf
+\syncposition[1][2] \input ward \endgraf
+\syncposition[1][3] \input ward \endgraf
+\syncposition[1][4] \input ward \endgraf
+
+\stoptext
diff --git a/tex/context/base/attr-ini.lua b/tex/context/base/attr-ini.lua
new file mode 100644
index 000000000..81c2f4744
--- /dev/null
+++ b/tex/context/base/attr-ini.lua
@@ -0,0 +1,648 @@
+if not modules then modules = { } end modules ['attr-ini'] = {
+ version = 1.001,
+ comment = "companion to attr-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this module is being reconstructed
+-- we can also do the nsnone via a metatable and then also se index 0
+
+local type = type
+local format, gmatch = string.format, string.gmatch
+local concat = table.concat
+local texsprint = tex.sprint
+
+local ctxcatcodes = tex.ctxcatcodes
+local unsetvalue = attributes.unsetvalue
+
+-- todo: document this but first reimplement this as it reflects the early
+-- days of luatex / mkiv and we have better ways now
+
+-- nb: attributes: color etc is much slower than normal (marks + literals) but ...
+-- nb. too many "0 g"s
+
+nodes = nodes or { }
+states = states or { }
+shipouts = shipouts or { }
+
+-- We can distinguish between rules and glyphs but it's not worth the trouble. A
+-- first implementation did that and while it saves a bit for glyphs and rules, it
+-- costs more resourses for transparencies. So why bother.
+
+--
+-- colors
+--
+
+-- we can also collapse the two attributes: n, n+1, n+2 and then
+-- at the tex end add 0, 1, 2, but this is not faster and less
+-- flexible (since sometimes we freeze color attribute values at
+-- the lua end of the game
+--
+-- we also need to store the colorvalues because we need then in mp
+--
+-- This is a compromis between speed and simplicity. We used to store the
+-- values and data in one array, which made in neccessary to store the
+-- converters that need node constructor into strings and evaluate them
+-- at runtime (after reading from storage). Think of:
+--
+-- colors.strings = colors.strings or { }
+--
+-- if environment.initex then
+-- colors.strings[color] = "return colors." .. colorspace .. "(" .. concat({...},",") .. ")"
+-- end
+--
+-- storage.register("colors/data", colors.strings, "colors.data") -- evaluated
+--
+-- We assume that only processcolors are defined in the format.
+
+colors = colors or { }
+colors.data = colors.data or { }
+colors.values = colors.values or { }
+colors.registered = colors.registered or { }
+
+colors.weightgray = true
+colors.attribute = attributes.private('color')
+colors.selector = attributes.private('colormodel')
+colors.default = 1
+colors.main = nil
+colors.triggering = true
+
+storage.register("colors/values", colors.values, "colors.values")
+storage.register("colors/registered", colors.registered, "colors.registered")
+
+local templates = {
+ rgb = "r:%s:%s:%s",
+ cmyk = "c:%s:%s:%s:%s",
+ gray = "s:%s",
+ spot = "p:%s:%s:%s:%s"
+}
+
+local models = {
+ [interfaces.variables.none] = unsetvalue,
+ black = unsetvalue,
+ bw = unsetvalue,
+ all = 1,
+ gray = 2,
+ rgb = 3,
+ cmyk = 4,
+}
+
+colors.model = "all"
+
+local data = colors.data
+local values = colors.values
+local registered = colors.registered
+
+local numbers = attributes.numbers
+local list = attributes.list
+
+local min, max, floor = math.min, math.max, math.floor
+
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+local registrations = backends.registrations
+
+local function rgbtocmyk(r,g,b) -- we could reduce
+ return 1-r, 1-g, 1-b, 0
+end
+
+local function cmyktorgb(c,m,y,k)
+ return 1.0 - min(1.0,c+k), 1.0 - min(1.0,m+k), 1.0 - min(1.0,y+k)
+end
+
+local function rgbtogray(r,g,b)
+ if colors.weightgray then
+ return .30*r+.59*g+.11*b
+ else
+ return r/3+g/3+b/3
+ end
+end
+
+local function cmyktogray(c,m,y,k)
+ return rgbtogray(cmyktorgb(c,m,y,k))
+end
+
+-- http://en.wikipedia.org/wiki/HSI_color_space
+-- http://nl.wikipedia.org/wiki/HSV_(kleurruimte)
+
+
+local function hsvtorgb(h,s,v)
+ -- h = h % 360
+ local hd = h/60
+ local hf = floor(hd)
+ local hi = hf % 6
+ -- local f = hd - hi
+ local f = hd - hf
+ local p = v * (1 - s)
+ local q = v * (1 - f * s)
+ local t = v * (1 - (1 - f) * s)
+ if hi == 0 then
+ return v, t, p
+ elseif hi == 1 then
+ return q, v, p
+ elseif hi == 2 then
+ return p, v, t
+ elseif hi == 3 then
+ return p, q, v
+ elseif hi == 4 then
+ return t, p, v
+ elseif hi == 5 then
+ return v, p, q
+ else
+ print("error in hsv -> rgb",hi,h,s,v)
+ end
+end
+
+function rgbtohsv(r,g,b)
+ local offset, maximum, other_1, other_2
+ if r >= g and r >= b then
+ offset, maximum, other_1, other_2 = 0, r, g, b
+ elseif g >= r and g >= b then
+ offset, maximum, other_1, other_2 = 2, g, b, r
+ else
+ offset, maximum, other_1, other_2 = 4, b, r, g
+ end
+ if maximum == 0 then
+ return 0, 0, 0
+ end
+ local minimum = other_1 < other_2 and other_1 or other_2
+ if maximum == minimum then
+ return 0, 0, maximum
+ end
+ local delta = maximum - minimum
+ return (offset + (other_1-other_2)/delta)*60, delta/maximum, maximum
+end
+
+function graytorgb(s) -- unweighted
+ return 1-s, 1-s, 1-s
+end
+
+function hsvtogray(h,s,v)
+ return rgb_to_gray(hsv_to_rgb(h,s,v))
+end
+
+function grayto_hsv(s)
+ return 0, 0, s
+end
+
+colors.rgbtocmyk = rgbtocmyk
+colors.rgbtogray = rgbtogray
+colors.cmyktorgb = cmyktorgb
+colors.cmyktogray = cmyktogray
+colors.rgbtohsv = rgbtohsv
+colors.hsvtorgb = hsvtorgb
+colors.hsvtogray = hsvtogray
+colors.graytohsv = graytohsv
+
+-- we can share some *data by using s, rgb and cmyk hashes, but
+-- normally the amount of colors is not that large; storing the
+-- components costs a bit of extra runtime, but we expect to gain
+-- some back because we have them at hand; the number indicates the
+-- default color space
+
+function colors.gray(s)
+ return { 2, s, s, s, s, 0, 0, 0, 1-s }
+end
+
+function colors.rgb(r,g,b)
+ local s = rgbtogray(r,g,b)
+ local c, m, y, k = rgbtocmyk(r,g,b)
+ return { 3, s, r, g, b, c, m, y, k }
+end
+
+function colors.cmyk(c,m,y,k)
+ local s = cmyktogray(c,m,y,k)
+ local r, g, b = cmyktorgb(c,m,y,k)
+ 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) == "number" then
+ local n = list[numbers.color][parent] -- hard coded ref to color number
+ if n then
+ local v = 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
+
+local function graycolor(...) graycolor = nodeinjections.graycolor return graycolor(...) end
+local function rgbcolor (...) rgbcolor = nodeinjections.rgbcolor return rgbcolor (...) end
+local function cmykcolor(...) cmykcolor = nodeinjections.cmykcolor return cmykcolor(...) end
+local function spotcolor(...) spotcolor = nodeinjections.spotcolor return spotcolor(...) end
+
+local function extender(colors,key)
+ if key == "none" then
+ local d = graycolor(0)
+ colors.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ local v = values[n]
+ local d
+ if not v then
+ local gray = graycolor(0)
+ d = { gray, gray, gray, gray }
+ logs.report("attributes","unable to revive color %s",n or "?")
+ else
+ local kind = v[1]
+ if kind == 2 then
+ local gray= graycolor(v[2])
+ d = { gray, gray, gray, gray }
+ elseif kind == 3 then
+ local gray, rgb, cmyk = graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9])
+ d = { rgb, gray, rgb, cmyk }
+ elseif kind == 4 then
+ local gray, rgb, cmyk = graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9])
+ d = { cmyk, gray, rgb, cmyk }
+ elseif kind == 5 then
+ local spot = spotcolor(v[10],v[11],v[12],v[13])
+ -- d = { spot, gray, rgb, cmyk }
+ d = { spot, spot, spot, spot }
+ end
+ end
+ data[n] = d
+ return d
+end
+
+setmetatable(colors, { __index = extender })
+setmetatable(colors.data, { __index = reviver })
+
+function colors.filter(n)
+ return concat(data[n],":",5)
+end
+
+function colors.setmodel(name,weightgray)
+ colors.model = name
+ colors.default = models[name] or 1
+ colors.weightgray = weightgray ~= false
+ return colors.default
+end
+
+function colors.register(name, colorspace, ...) -- passing 9 vars is faster (but not called that often)
+ local stamp = format(templates[colorspace],...)
+ local color = registered[stamp]
+ if not color then
+ color = #values + 1
+ values[color] = colors[colorspace](...)
+ registered[stamp] = color
+ -- colors.reviver(color)
+ end
+ if name then
+ list[colors.attribute][name] = color -- not grouped, so only global colors
+ end
+ return registered[stamp]
+end
+
+function colors.value(id)
+ return values[id]
+end
+
+shipouts.handle_color = nodes.install_attribute_handler {
+ name = "color",
+ namespace = colors,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.selective,
+ resolver = function() return colors.main end,
+}
+
+function colors.enable()
+ tasks.enableaction("shipouts","shipouts.handle_color")
+end
+
+-- transparencies
+
+transparencies = transparencies or { }
+transparencies.registered = transparencies.registered or { }
+transparencies.data = transparencies.data or { }
+transparencies.values = transparencies.values or { }
+transparencies.triggering = true
+transparencies.attribute = attributes.private('transparency')
+
+storage.register("transparencies/registered", transparencies.registered, "transparencies.registered")
+storage.register("transparencies/values", transparencies.values, "transparencies.values")
+
+local registered = transparencies.registered -- we could use a 2 dimensional table instead
+local data = transparencies.data
+local values = transparencies.values
+local template = "%s:%s"
+
+local function inject_transparency (...)
+ inject_transparency = nodeinjections.transparency
+ return inject_transparency(...)
+end
+
+local function register_transparency(...)
+ register_transparency = registrations.transparency
+ return register_transparency(...)
+end
+
+function transparencies.register(name,a,t,force) -- name is irrelevant here (can even be nil)
+ -- Force needed here for metapost converter. We could always force
+ -- but then we'd end up with transparencies resources even if we
+ -- would not use transparencies (but define them only). This is
+ -- somewhat messy.
+ local stamp = format(template,a,t)
+ local n = registered[stamp]
+ if not n then
+ n = #values + 1
+ values[n] = { a, t }
+ registered[stamp] = n
+ if force then
+ register_transparency(n,a,t)
+ end
+ elseif force and not data[n] then
+ register_transparency(n,a,t)
+ end
+ return registered[stamp]
+end
+
+local function extender(transparencies,key)
+ if key == "none" then
+ local d = inject_transparency(0)
+ transparencies.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ local v = values[n]
+ local d
+ if not v then
+ d = inject_transparency(0)
+ else
+ d = inject_transparency(n)
+ register_transparency(n,v[1],v[2])
+ end
+ data[n] = d
+ return d
+end
+
+setmetatable(transparencies, { __index = extender })
+setmetatable(transparencies.data, { __index = reviver }) -- register if used
+
+-- check if there is an identity
+
+function transparencies.value(id)
+ return values[id]
+end
+
+shipouts.handle_transparency = nodes.install_attribute_handler {
+ name = "transparency",
+ namespace = transparencies,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+function transparencies.enable()
+ tasks.enableaction("shipouts","shipouts.handle_transparency")
+end
+
+--- colorintents: overprint / knockout
+
+colorintents = colorintents or { }
+colorintents.data = colorintents.data or { }
+colorintents.attribute = attributes.private('colorintent')
+
+colorintents.registered = {
+ overprint = 1,
+ knockout = 2,
+}
+
+local data, registered = colorintents.data, colorintents.registered
+
+local function extender(colorintents,key)
+ if key == "none" then
+ local d = data[2]
+ colorintents.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ if n == 1 then
+ local d = nodeinjections.overprint() -- called once
+ data[1] = d
+ return d
+ elseif n == 2 then
+ local d = nodeinjections.knockout() -- called once
+ data[2] = d
+ return d
+ end
+end
+
+setmetatable(colorintents, { __index = extender })
+setmetatable(colorintents.data, { __index = reviver })
+
+function colorintents.register(stamp)
+ return registered[stamp] or registered.overprint
+end
+
+shipouts.handle_colorintent = nodes.install_attribute_handler {
+ name = "colorintent",
+ namespace = colorintents,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+function colorintents.enable()
+ tasks.enableaction("shipouts","shipouts.handle_colorintent")
+end
+
+--- negative / positive
+
+negatives = negatives or { }
+negatives.data = negatives.data or { }
+negatives.attribute = attributes.private("negative")
+
+negatives.registered = {
+ positive = 1,
+ negative = 2,
+}
+
+local data, registered = negatives.data, negatives.registered
+
+local function extender(negatives,key)
+ if key == "none" then
+ local d = data[1]
+ negatives.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ if n == 1 then
+ local d = nodeinjections.positive() -- called once
+ data[1] = d
+ return d
+ elseif n == 2 then
+ local d = nodeinjections.negative() -- called once
+ data[2] = d
+ return d
+ end
+end
+
+setmetatable(negatives, { __index = extender })
+setmetatable(negatives.data, { __index = reviver })
+
+function negatives.register(stamp)
+ return registered[stamp] or registered.positive
+end
+
+shipouts.handle_negative = nodes.install_attribute_handler {
+ name = "negative",
+ namespace = negatives,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+function negatives.enable()
+ tasks.enableaction("shipouts","shipouts.handle_negative")
+end
+
+-- effects -- can be optimized (todo: metatables)
+
+effects = effects or { }
+effects.data = effects.data or { }
+effects.values = effects.values or { }
+effects.registered = effects.registered or { }
+effects.stamp = "%s:%s:%s"
+effects.attribute = attributes.private("effect")
+
+storage.register("effects/registered", effects.registered, "effects.registered")
+storage.register("effects/values", effects.values, "effects.values")
+
+local data, registered, values = effects.data, effects.registered, effects.values
+
+-- valid effects: normal inner outer both hidden (stretch,rulethickness,effect)
+
+local function effect(...) effect = nodeinjections.effect return effect(...) end
+
+local function extender(effects,key)
+ if key == "none" then
+ local d = effect(0,0,0)
+ effects.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ local e = values[n] -- we could nil values[n] now but hardly needed
+ local d = effect(e[1],e[2],e[3])
+ data[n] = d
+ return d
+end
+
+setmetatable(effects, { __index = extender })
+setmetatable(effects.data, { __index = reviver })
+
+function effects.register(effect,stretch,rulethickness)
+ local stamp = format(effects.stamp,effect,stretch,rulethickness)
+ local n = registered[stamp]
+ if not n then
+ n = #values + 1
+ values[n] = { effect, stretch, rulethickness }
+ registered[stamp] = n
+ end
+ return n
+end
+
+shipouts.handle_effect = nodes.install_attribute_handler {
+ name = "effect",
+ namespace = effects,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+function effects.enable()
+ tasks.enableaction("shipouts","shipouts.handle_effect")
+end
+
+-- layers (ugly code, due to no grouping and such); currently we use exclusive layers
+-- but when we need it stacked layers might show up too; the next function based
+-- approach can be replaced by static (metatable driven) resolvers
+
+viewerlayers = viewerlayers or { }
+viewerlayers.data = viewerlayers.data or { }
+viewerlayers.registered = viewerlayers.registered or { }
+viewerlayers.values = viewerlayers.values or { }
+viewerlayers.listwise = viewerlayers.listwise or { }
+viewerlayers.attribute = attributes.private("viewerlayer")
+
+storage.register("viewerlayers/registered", viewerlayers.registered, "viewerlayers.registered")
+storage.register("viewerlayers/values", viewerlayers.values, "viewerlayers.values")
+
+local data = viewerlayers.data
+local values = viewerlayers.values
+local listwise = viewerlayers.listwise
+local registered = viewerlayers.registered
+local template = "%s"
+
+-- stacked
+
+local function extender(viewerlayers,key)
+ if key == "none" then
+ local d = nodeinjections.stoplayer()
+ viewerlayers.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ local d = nodeinjections.startlayer(values[n])
+ data[n] = d
+ return d
+end
+
+setmetatable(viewerlayers, { __index = extender })
+setmetatable(viewerlayers.data, { __index = reviver })
+
+local function initializer(...)
+ return states.initialize(...)
+end
+
+viewerlayers.register = function(name,lw) -- if not inimode redefine data[n] in first call
+ local stamp = format(template,name)
+ local n = registered[stamp]
+ if not n then
+ n = #values + 1
+ values[n] = name
+ registered[stamp] = n
+ listwise[n] = lw or false
+ end
+ return registered[stamp] -- == n
+end
+
+shipouts.handle_viewerlayer = nodes.install_attribute_handler {
+ name = "viewerlayer",
+ namespace = viewerlayers,
+ initializer = initializer,
+ finalizer = states.finalize,
+ processor = states.stacked,
+}
+
+function viewerlayers.enable()
+ tasks.enableaction("shipouts","shipouts.handle_viewerlayer")
+end
diff --git a/tex/context/base/attr-ini.mkiv b/tex/context/base/attr-ini.mkiv
new file mode 100644
index 000000000..87d06c48a
--- /dev/null
+++ b/tex/context/base/attr-ini.mkiv
@@ -0,0 +1,170 @@
+%D \module
+%D [ file=attr-ini,
+%D version=2007.06.06,
+%D title=\CONTEXT\ Attribute Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Attribute Macros / Initialization}
+
+%D Although it's still somewhat experimental, here we introduce code
+%D related to attributes.
+
+\unprotect
+
+\registerctxluafile{attr-ini}{1.001}
+
+%D This might move:
+
+\def\pushattribute#1%
+ {\global\advance\csname\??ae:\string#1\endcsname\plusone
+ \global\expandafter\mathchardef\csname\??ae:\string#1:\number\csname\??ae:\string#1\endcsname\endcsname\attribute#1}
+
+\def\popattribute#1%
+ {\attribute#1\csname\??ae:\string#1:\number\csname\??ae:\string#1\endcsname\endcsname
+ \global\advance\csname\??ae:\string#1\endcsname\minusone}
+
+\def\installattributestack#1%
+ {\expandafter\newcount\csname\??ae:\string#1\endcsname}
+
+%D For the moment we put this here (later it will move to where it's used):
+
+\definesystemattribute[state]
+\definesystemattribute[skip]
+\definesystemattribute[penalty]
+\definesystemattribute[colormodel][global] \chardef\colormodelattribute \dogetattributeid{colormodel}
+\definesystemattribute[color] \chardef\colorattribute \dogetattributeid{color}
+\definesystemattribute[transparency] \chardef\transparencyattribute \dogetattributeid{transparency}
+\definesystemattribute[background] \chardef\backgroundattribute \dogetattributeid{background}
+\definesystemattribute[colorintent] \chardef\colorintentattribute \dogetattributeid{colorintent}
+\definesystemattribute[negative] \chardef\negativeattribute \dogetattributeid{negative}
+\definesystemattribute[effect] \chardef\effectattribute \dogetattributeid{effect}
+\definesystemattribute[viewerlayer] \chardef\viewerlayerattribute \dogetattributeid{viewerlayer}
+\definesystemattribute[layoutcomponent] \chardef\layoutcomponentattribute\dogetattributeid{layoutcomponent}
+\definesystemattribute[reference] \chardef\referenceattribute \dogetattributeid{reference}
+\definesystemattribute[destination] \chardef\destinationattribute \dogetattributeid{destination}
+\definesystemattribute[graphicvadjust] \chardef\graphicvadjustattribute \dogetattributeid{graphicvadjust}
+\definesystemattribute[ruled] \chardef\ruledattribute \dogetattributeid{ruled}
+\definesystemattribute[shifted] \chardef\shiftedattribute \dogetattributeid{shifted}
+
+% \definesystemattribute[ignore]
+%
+% \edef\startignorecontent{\dosetattribute{ignore}\plusone}
+% \edef\stopignorecontent {\doresetattribute{ignore}}
+
+% todo: no need for 'color' argument, we can set that once at startup; currently
+% a bit inconsistent
+
+% 1=off 2=gray 3=spot 4=rgb 5=cmyk 6=cmy % only 1/2/4/5 are supported
+%
+% We could combine this in one attribute but this is not faster and also
+% less flexible because sometimes we want to freeze the attribute bit.
+%
+% Watch out: real color support will be implemented later.
+
+\newcount\currentcolormodel
+
+\def\dosetcolormodel#1%
+ {\currentcolormodel\ctxlua{tex.print(colors.setmodel('#1'))}%
+ \attribute\colormodelattribute\currentcolormodel}
+
+\dosetcolormodel{all}
+
+\appendtoks
+ \dosetcolormodel{all}% redundant?
+\to \everyjob
+
+\def\registerrgbcolor #1#2#3#4{\ctxlua{colors.register('#1','rgb' ,#2,#3,#4)}}
+\def\registercmykcolor#1#2#3#4#5{\ctxlua{colors.register('#1','cmyk',#2,#3,#4,#5)}}
+\def\registergraycolor #1#2{\ctxlua{colors.register('#1','gray',#2)}}
+
+% transparency
+
+\def\registertransparency#1#2#3%
+ {\setevalue{(ts:#1)}{\attribute\transparencyattribute\ctxlua{tex.write(transparencies.register(#2,#3))} }}
+
+\def\sometransparencyswitch#1{\csname(ts:#1)\endcsname}
+
+\def\sometransparencyswitch
+ {\ctxlua{transparencies.enable()}%
+ \gdef\sometransparencyswitch##1{\csname(ts:##1)\endcsname}%
+ \sometransparencyswitch}
+
+% \registertransparency {one} {1} {.5}
+% \registertransparency {two} {1} {.6}
+
+% overprint
+
+\def\registercolorintent#1#2%
+ {\setevalue{(os:#1)}{\attribute\colorintentattribute\ctxlua{tex.write(colorintents.register('#2'))} }}
+
+\def\dotriggercolorintent
+ {\ctxlua{colorintents.enable()}%
+ \gdef\dotriggercolorintent##1{\csname(os:##1)\endcsname}%
+ \dotriggercolorintent}
+
+\registercolorintent{knockout} {knockout}
+\registercolorintent{overprint}{overprint}
+
+\installattributestack\colorintentattribute
+
+\setevalue{(os:#\v!none}{\attribute\colorintentattribute\attributeunsetvalue} % does this work out ok?
+
+% negative
+
+\def\registernegative#1#2%
+ {\setevalue{(ns:#1)}{\attribute\negativeattribute\ctxlua{tex.write(negatives.register('#2'))} }}
+
+\def\dotriggernegative
+ {\ctxlua{negatives.enable()}%
+ \gdef\dotriggernegative##1{\csname(ns:##1)\endcsname}%
+ \dotriggernegative}
+
+\registernegative{positive}{positive}
+\registernegative{negative}{negative}
+
+% effect
+
+\def\registereffect#1#2#3% #2=stretch #3=rulethickness
+ {\setxvalue{(es:#1:#2:\number\dimexpr#3\relax)}%
+ {\attribute\effectattribute\ctxlua{tex.write(effects.register('#1',#2,\number\dimexpr#3\relax))} }}
+
+\def\dotriggereffect
+ {\ctxlua{effects.enable()}%
+ \gdef\dotriggereffect##1##2##3%
+ {\ifcsname(es:##1:##2:\number\dimexpr##3\relax)\endcsname\else\registereffect{##1}{##2}{##3}\fi
+ \csname(es:##1:##2:\number\dimexpr##3\relax)\endcsname}%
+ \dotriggereffect}
+
+% \registereffect{normal}
+% \registereffect{inner}
+% \registereffect{outer}
+% \registereffect{both}
+% \registereffect{hidden}
+
+% viewerlayers (will probably change a bit)
+
+% needs to work over stopitemize grouping etc
+
+\def\registerviewerlayer#1#2% global !
+ {\setxvalue{(vl:#1)}{\global\attribute\viewerlayerattribute\ctxlua{tex.write(viewerlayers.register('#2'))} }}
+
+\setevalue{(vl:)}{\global\attribute\viewerlayerattribute\attributeunsetvalue}
+
+\def\dotriggerviewerlayer
+ {\ctxlua{viewerlayers.enable()}%
+ \gdef\dotriggerviewerlayer##1{\csname(vl:##1)\endcsname}%
+ \dotriggerviewerlayer}
+
+\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/back-ini.lua b/tex/context/base/back-ini.lua
new file mode 100644
index 000000000..12a487dd4
--- /dev/null
+++ b/tex/context/base/back-ini.lua
@@ -0,0 +1,143 @@
+if not modules then modules = { } end modules ['back-ini'] = {
+ version = 1.001,
+ comment = "companion to back-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+backends = backends or { }
+
+local trace_backend = false
+
+local function nothing() return nil end
+
+backends.nothing = nothing
+
+backends.nodeinjections = {
+ rgbcolor = nothing,
+ cmykcolor = nothing,
+ graycolor = nothing,
+ spotcolor = nothing,
+ transparency = nothing,
+ overprint = nothing,
+ knockout = nothing,
+ positive = nothing,
+ negative = nothing,
+ effect = nothing,
+ startlayer = nothing,
+ stoplayer = nothing,
+ switchlayer = nothing,
+
+ reference = nothing,
+ destination = nothing,
+
+}
+
+backends.codeinjections = {
+
+ prerollreference = nothing,
+
+ insertmovie = nothing,
+ insertsound = nothing,
+
+ presetsymbollist = nothing,
+ registersymbol = nothing,
+ registeredsymbol = nothing,
+
+ registercomment = nothing,
+ embedfile = nothing,
+ attachfile = nothing,
+ adddocumentinfo = nothing,
+ setupidentity = nothing,
+ setpagetransition = nothing,
+ defineviewerlayer = nothing,
+ addbookmarks = nothing,
+ addtransparencygroup = nothing,
+
+ typesetfield = nothing,
+ doiffieldelse = nothing,
+ doiffieldgroupelse = nothing,
+ definefield = nothing,
+ clonefield = nothing,
+ definefieldset = nothing,
+ getfieldgroup = nothing,
+ setformsmethod = nothing,
+ getdefaultfieldvalue = nothing,
+
+ setupcanvas = nothing,
+
+ initializepage = nothing,
+ initializedocument = nothing,
+ finalizepage = nothing,
+ finalizedocument = nothing,
+
+ flushpageactions = nothing,
+ flushdocumentactions = nothing,
+
+ insertrenderingwindow = nothing,
+ processrendering = nothing,
+ kindofrendering = nothing,
+ flushrenderingwindow = nothing,
+
+ setfigurecolorspace = nothing,
+ setfigurealternative = nothing,
+
+}
+
+backends.registrations = {
+ grayspotcolor = nothing,
+ rgbspotcolor = nothing,
+ cmykspotcolor = nothing,
+ grayindexcolor = nothing,
+ rgbindexcolor = nothing,
+ cmykindexcolor = nothing,
+ spotcolorname = nothing,
+ transparency = nothing,
+}
+
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+local registrations = backends.registrations
+
+backends.current = "unknown"
+
+function backends.install(what)
+ if type(what) == "string" then
+ local backend = backends[what]
+ if backend then
+ if trace_backend then
+ logs.report("backend", "initializing backend %s (%s)",what,backend.comment or "no comment")
+ end
+ backends.current = what
+ for _, category in next, { "nodeinjections", "codeinjections", "registrations"} do
+ local plugin = backend[category]
+ if plugin then
+ local whereto = backends[category]
+ for name, meaning in next, whereto do
+ if plugin[name] then
+ whereto[name] = plugin[name]
+ -- logs.report("backend", "installing function %s in category %s of %s",name,category,what)
+ elseif trace_backend then
+ logs.report("backend", "no function %s in category %s of %s",name,category,what)
+ end
+ end
+ elseif trace_backend then
+ logs.report("backend", "no category %s in %s",category,what)
+ end
+ end
+ backends.helpers = backend.helpers
+ elseif trace_backend then
+ logs.report("backend", "no backend named %s",what)
+ end
+ end
+end
+
+statistics.register("used backend", function()
+ local bc = backends.current
+ if bc ~= "unknown" then
+ return string.format("%s (%s)",bc,backends[bc].comment or "no comment")
+ else
+ return nil
+ end
+end)
diff --git a/tex/context/base/back-ini.mkiv b/tex/context/base/back-ini.mkiv
new file mode 100644
index 000000000..b7bbdb56f
--- /dev/null
+++ b/tex/context/base/back-ini.mkiv
@@ -0,0 +1,168 @@
+%D \module
+%D [ file=back-ini,
+%D version=2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=Initialization,
+%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.
+
+%D Most will go away here as it is replaced by \LUA\ calls to
+%D backend functions.
+
+\writestatus{loading}{ConTeXt Backend Macros / Initialization}
+
+\registerctxluafile{back-ini}{1.001}
+
+%D We currently have a curious mix between tex and lua backend
+%D handling but eventually most will move to lua.
+
+\unprotect
+
+\ifdefined\everybackendshipout \else \newtoks\everybackendshipout \fi
+\ifdefined\everylastbackendshipout \else \newtoks\everylastbackendshipout \fi
+
+%D Right from the start \CONTEXT\ had a backend system based on
+%D runtime pluggable code. As most backend issues involved specials
+%D and since postprocessors had not that much in common, we ended up
+%D with a system where we could switch backend as well as output code
+%D for multiple backends at the same time.
+%D
+%D Because \LUATEX\ has the backend built in, and since some backend
+%D issues have been moved to the frontend I decided to provide new
+%D backend code for \MKIV, starting with what was actually used.
+%D
+%D At this moment \DVI\ is no longer used for advanced document
+%D output and we therefore dropped support for this format. Future
+%D versions might support more backends again, but this has a low
+%D priority.
+%D
+%D The big question is: what is to be considered a backend issue and
+%D what not. For the moment we treat image inclusion, object reuse,
+%D position tracking and color as frontend issues, if only because we
+%D deal with them via \LUA\ code and as such we don't depend too much
+%D on macro calls that need to inject code for the backend.
+%D
+%D Not everything here makes sense and the content of this file will
+%D definitely change.
+
+\let \dostartrotation \gobbleoneargument
+\let \dostoprotation \donothing
+\let \dostartscaling \gobbletwoarguments
+\let \dostopscaling \donothing
+\let \dostartmirroring \donothing
+\let \dostopmirroring \donothing
+
+%D \macros
+%D {doovalbox}
+%D
+%D When we look at the implementation, this is a complicated
+%D one. There are seven arguments.
+%D
+%D \starttyping
+%D \doovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill} {variant}
+%D \stoptyping
+%D
+%D This command has to return a \type{\vbox} which can be used
+%D to lay over another one (with text). The radius is in
+%D degrees, the stroke and fill are~\type{1} (true) of~\type{0}
+%D (false).
+
+\let \doovalbox \gobbleeightarguments
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D Clipping is implemented in such a way that an arbitrary code
+%D can be fed.
+%D
+%D \starttyping
+%D \dostartclipping {pathname} {width} {height}
+%D \dostopclipping
+%D \stoptyping
+
+\let \dostartclipping \gobblethreearguments
+\let \dostopclipping \donothing
+
+%D \macros
+%D {dostartobject,
+%D dostopobject,
+%D doresetobjects,
+%D doinsertobject}
+%D
+%D Reuse of object can reduce the output filesize
+%D considerably. Reusable objects are implemented with:
+%D
+%D \starttyping
+%D \dostartobject{class}{name}{width}{height}{depth}
+%D some typeset material
+%D \dostopobject
+%D \stoptyping
+%D
+%D \starttyping
+%D \doinsertobject{class}{name}
+%D \stoptyping
+%D
+%D The savings can be huge in interactive texts. The next macro needs
+%D to be called after a graphic is inserted (in order to clean up
+%D global references).
+%D
+%D \starttyping
+%D \doresetobjects
+%D \stoptyping
+
+\let \dostartobject \gobblefourarguments
+\let \dostopobject \donothing
+\let \doinsertobject \gobbletwoarguments
+\let \doresetobjects \donothing
+
+%D From now on, mapfile loading is also a special; we assume the
+%D more or less standard dvips syntax.
+
+\let \doresetmapfilelist \donothing
+\let \doloadmapfile \gobbletwoarguments % + - = | filename
+\let \doloadmapline \gobbletwoarguments % + - = | fileline
+
+%D \macros
+%D {ifusepagedestinations}
+%D
+%D In \PDF\ version 1.0 only page references were supported,
+%D while in \DVIWINDO\ 1.N only named references were accepted.
+%D Therefore \CONTEXT\ supports both methods of referencing. In
+%D \PDF\ version 1.1 named destinations arrived. Lack of
+%D continuous support of version 1.1 viewers for \MSDOS\
+%D therefore sometimes forces us to prefer page references. As
+%D a bonus, they are faster too and have no limitations. How
+%D fortunate we were having both mechanisms available when the
+%D version 3.0 (\PDF\ version 1.2) viewers proved to be too
+%D bugged to support named destinations.
+
+\newif\ifusepagedestinations % not yet interfaced in mkiv
+
+%D \macros
+%D {jobsuffix}
+%D
+%D By default, \TEX\ produces \DVI\ files which can be
+%D converted to other filetypes. Sometimes it is handy to
+%D know what the target file will be. In other driver
+%D modules we wil set \type {\jobsuffix} to \type {pdf}.
+
+\def\jobsuffix{pdf}
+
+\ifdefined\resetsystemmode \else
+ \let\setsystemmode \gobbleoneargument
+ \let\resetsystemmode\gobbleoneargument
+\fi
+
+\def\setjobsuffix#1%
+ {\resetsystemmode\jobsuffix
+ \edef\jobsuffix{#1}%
+ \setsystemmode\jobsuffix}
+
+\unexpanded\def\setupoutput[#1]{} % will be command line switch
+
+\protect \endinput
diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua
new file mode 100644
index 000000000..54e22f1a2
--- /dev/null
+++ b/tex/context/base/back-pdf.lua
@@ -0,0 +1,469 @@
+if not modules then modules = { } end modules ['back-pdf'] = {
+ version = 1.001,
+ comment = "companion to back-pdf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- we will move code to lpdf-* files (second cleanup stage)
+
+--[[ldx--
+<p>This module implements a couple of cleanup methods. We need these
+in order to meet the <l n='pdf'/> specification. Watch the double
+parenthesis; they are needed because otherwise we would pass more
+than one argument to <l n='tex'/>.</p>
+--ldx]]--
+
+local type, next, tostring = type, next, tostring
+local char, byte, format, gsub, rep, gmatch = string.char, string.byte, string.format, string.gsub, string.rep, string.gmatch
+local concat = table.concat
+local round = math.round
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local texsprint, texwrite = tex.sprint, tex.write
+local ctxcatcodes = tex.ctxcatcodes
+
+local copy_node = node.copy
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+local pdfliteral, register = nodes.pdfliteral, nodes.register
+
+local pdfconstant = lpdf.constant
+local pdfstring = lpdf.string
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfverbose = lpdf.verbose
+local pdfflushobject = lpdf.flushobject
+local pdfreserveobject = lpdf.reserveobject
+local pdfannotation = nodes.pdfannotation
+
+local pdfreserveobj = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+
+function nodeinjections.rgbcolor(r,g,b)
+ return register(pdfliteral(format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)))
+end
+
+function nodeinjections.cmykcolor(c,m,y,k)
+ return register(pdfliteral(format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)))
+end
+
+function nodeinjections.graycolor(s) -- caching 0/1 does not pay off
+ return register(pdfliteral(format("%s g %s G",s,s)))
+end
+
+function nodeinjections.spotcolor(n,f,d,p)
+ if type(p) == "string" then
+ p = gsub(p,","," ") -- brr misuse of spot
+ end
+ return register(pdfliteral(format("/%s cs /%s CS %s SCN %s scn",n,n,p,p)))
+end
+
+function nodeinjections.transparency(n)
+ return register(pdfliteral(format("/Tr%s gs",n)))
+end
+
+local effects = {
+ normal = 0,
+ inner = 0,
+ outer = 1,
+ both = 2,
+ hidden = 3,
+}
+
+function nodeinjections.effect(effect,stretch,rulethickness)
+ -- always, no zero test (removed)
+ rulethickness = number.dimenfactors["bp"] * rulethickness
+ effect = effects[effect] or effects['normal']
+ return register(pdfliteral(format("%s Tc %s w %s Tr",stretch,rulethickness,effect))) -- watch order
+end
+
+-- cached ..
+
+local cache = { }
+
+function nodeinjections.startlayer(name)
+ local c = cache[name]
+ if not c then
+ c = register(pdfliteral(format("/OC /%s BDC",name)))
+ cache[name] = c
+ end
+ return copy_node(c)
+end
+
+local stop = register(pdfliteral("EMC"))
+
+function nodeinjections.stoplayer()
+ return copy_node(stop)
+end
+
+local cache = { }
+
+function nodeinjections.switchlayer(name)
+ local c = cache[name]
+ if not c then
+ c = register(pdfliteral(format("EMC /OC /%s BDC",name)))
+ end
+ return copy_node(c)
+end
+
+-- code
+
+function codeinjections.insertmovie(specification)
+ -- managed in figure inclusion: width, height, factor, repeat, controls, preview, label, foundname
+ local width = specification.width
+ local height = specification.height
+ local factor = specification.factor or number.dimenfactors.bp
+ local moviedict = pdfdictionary {
+ F = specification.foundname,
+ Aspect = pdfarray { factor * width, factor * height },
+ Poster = (specification.preview and true) or false,
+ }
+ local controldict = pdfdictionary {
+ ShowControls = (specification.controls and true) or false,
+ Mode = (specification["repeat"] and pdfconstant("Repeat")) or nil,
+ }
+ local action = pdfdictionary {
+ Subtype = pdfconstant("Movie"),
+ Border = pdfarray { 0, 0, 0 },
+ T = format("movie %s",specification.label),
+ Movie = moviedict,
+ A = controldict,
+ }
+ node.write(pdfannotation(width,height,0,action()))
+end
+
+function codeinjections.insertsound(specification)
+ -- rmanaged in interaction: repeat, label, foundname
+ local soundclip = interactions.soundclip(specification.label)
+ if soundclip then
+ local controldict = pdfdictionary {
+ Mode = (specification["repeat"] and pdfconstant("Repeat")) or nil
+ }
+ local sounddict = pdfdictionary {
+ F = soundclip.filename
+ }
+ local action = pdfdictionary {
+ Subtype = pdfconstant("Movie"),
+ Border = pdfarray { 0, 0, 0 },
+ T = format("sound %s",specification.label),
+ Movie = sounddict,
+ A = controldict,
+ }
+ node.write(pdfannotation(0,0,0,action()))
+ end
+end
+
+-- spot- and indexcolors
+
+local pdf_separation = pdfconstant("Separation")
+local pdf_indexed = pdfconstant("Indexed")
+local pdf_device_n = pdfconstant("DeviceN")
+local pdf_device_rgb = pdfconstant("DeviceRGB")
+local pdf_device_cmyk = pdfconstant("DeviceCMYK")
+local pdf_device_gray = pdfconstant("DeviceGray")
+local pdf_extgstate = pdfconstant("ExtGState")
+
+local pdf_rbg_range = pdfarray { 0, 1, 0, 1, 0, 1 }
+local pdf_cmyk_range = pdfarray { 0, 1, 0, 1, 0, 1, 0, 1 }
+local pdf_gray_range = pdfarray { 0, 1 }
+
+local rgb_function = "dup %s mul exch dup %s mul exch %s mul"
+local cmyk_function = "dup %s mul exch dup %s mul exch dup %s mul exch %s mul"
+local gray_function = "%s mul"
+
+local documentcolorspaces = pdfdictionary()
+
+local spotcolorhash = { } -- not needed
+local spotcolornames = { }
+local indexcolorhash = { }
+local delayedindexcolors = { }
+
+function registrations.spotcolorname(name,e)
+ spotcolornames[name] = e or name
+end
+
+local function registersomespotcolor(name,noffractions,names,p,colorspace,range,funct)
+ noffractions = tonumber(noffractions) or 1 -- to be checked
+ if noffractions == 0 then
+ -- can't happen
+ elseif noffractions == 1 then
+ local dictionary = pdfdictionary {
+ FunctionType = 4,
+ Domain = { 0, 1 },
+ Range = range,
+ }
+ local n = pdfimmediateobj("stream",format("{ %s }",funct),dictionary())
+ local array = pdfarray {
+ pdf_separation,
+ pdfconstant(spotcolornames[name] or name),
+ colorspace,
+ pdfreference(n),
+ }
+ local m = pdfimmediateobj(tostring(array))
+ local mr = pdfreference(m)
+ spotcolorhash[name] = m
+ documentcolorspaces[name] = mr
+ lpdf.adddocumentcolorspace(name,mr)
+ else
+ local cnames = pdfarray()
+ local domain = pdfarray()
+ for n in gmatch(names,"[^,]+") do
+ cnames[#cnames+1] = pdfconstant(spotcolornames[n] or n)
+ domain[#domain+1] = 0
+ domain[#domain+1] = 1
+ end
+ local dictionary = pdfdictionary {
+ FunctionType = 4,
+ Domain = domain,
+ Range = range,
+ }
+ local n = pdfimmediateobj("stream",format("{ %s %s }",rep("pop ",noffractions),funct),dictionary())
+ local array = pdfarray {
+ pdf_device_n,
+ cnames,
+ colorspace,
+ pdfreference(n),
+ }
+ local m = pdfimmediateobj(tostring(array))
+ local mr = pdfreference(m)
+ spotcolorhash[name] = m
+ documentcolorspaces[name] = mr
+ lpdf.adddocumentcolorspace(name,mr)
+ end
+end
+
+function registersomeindexcolor(name,noffractions,names,p,colorspace,range,funct)
+ noffractions = tonumber(noffractions) or 1 -- to be checked
+ local cnames = pdfarray()
+ local domain = pdfarray()
+ if names == "" then
+ names = name .. ",None"
+ else
+ names = names .. ",None"
+ end
+ for n in gmatch(names,"[^,]+") do
+ cnames[#cnames+1] = pdfconstant(spotcolornames[n] or n)
+ domain[#domain+1] = 0
+ domain[#domain+1] = 1
+ end
+ local dictionary = pdfdictionary {
+ FunctionType = 4,
+ Domain = domain,
+ Range = range,
+ }
+ local n = pdfimmediateobj("stream",format("{ %s %s }",rep("exch pop ",noffractions),funct),dictionary()) -- exch pop
+ local a = pdfarray {
+ pdf_device_n,
+ cnames,
+ colorspace,
+ pdfreference(n),
+ }
+ if p == "" then
+ p = "1"
+ else
+ p = p .. ",1"
+ end
+ local pi = { }
+ for pp in gmatch(p,"[^,]+") do
+ pi[#pi+1] = tonumber(pp)
+ end
+ local vector, set, n = { }, { }, #pi
+ for i=255,0,-1 do
+ for j=1,n do
+ set[j] = format("%02X",round(pi[j]*i))
+ end
+ vector[#vector+1] = concat(set)
+ end
+ vector = pdfverbose { "<", concat(vector, " "), ">" }
+ local n = pdfimmediateobj(tostring(pdfarray{ pdf_indexed, a, 255, vector }))
+ lpdf.adddocumentcolorspace(format("%s_indexed",name),pdfreference(n))
+ return n
+end
+
+-- actually, names (parent) is the hash
+
+local function delayindexcolor(name,names,func)
+ local hash = (names ~= "" and names) or name
+ -- logs.report("index colors","delaying '%s'",name)
+ delayedindexcolors[hash] = func
+end
+
+local function indexcolorref(name) -- actually, names (parent) is the hash
+ if not indexcolorhash[name] then
+ -- logs.report("index colors","registering '%s'",name)
+ local delayedindexcolor = delayedindexcolors[name]
+ if type(delayedindexcolor) == "function" then
+ indexcolorhash[name] = delayedindexcolor()
+ delayedindexcolors[name] = true
+ end
+ end
+ return indexcolorhash[name]
+end
+
+function registrations.rgbspotcolor(name,noffractions,names,p,r,g,b)
+--~ print(name,noffractions,names,p,r,g,b)
+ if noffractions == 1 then
+ registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format(rgb_function,r,g,b))
+ else
+ registersomespotcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rbg_range,format("%s %s %s",r,g,b))
+ end
+ delayindexcolor(name,names,function()
+ return registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b))
+ end)
+end
+
+function registrations.cmykspotcolor(name,noffractions,names,p,c,m,y,k)
+ if noffractions == 1 then
+ registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k))
+ else
+ registersomespotcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format("%s %s %s %s",c,m,y,k))
+ end
+ delayindexcolor(name,names,function()
+ return registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k))
+ end)
+end
+
+function registrations.grayspotcolor(name,noffractions,names,p,s)
+ if noffractions == 1 then
+ registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s))
+ else
+ registersomespotcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,s)
+ end
+ delayindexcolor(name,names,function()
+ return registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,format(gray_function,s))
+ end)
+end
+
+function registrations.rgbindexcolor(name,noffractions,names,p,r,g,b)
+ registersomeindexcolor(name,noffractions,names,p,pdf_device_rgb,pdf_rgb_range,format(rgb_function,r,g,b))
+end
+
+function registrations.cmykindexcolor(name,noffractions,names,p,c,m,y,k)
+ registersomeindexcolor(name,noffractions,names,p,pdf_device_cmyk,pdf_cmyk_range,format(cmyk_function,c,m,y,k))
+end
+
+function registrations.grayindexcolor(name,noffractions,names,p,s)
+ registersomeindexcolor(name,noffractions,names,p,pdf_device_gray,pdf_gray_range,gray_function)
+end
+
+function codeinjections.setfigurecolorspace(data,figure)
+ local color = data.request.color
+ if color then
+ local ref = indexcolorref(color)
+ if ref then
+ figure.colorspace = ref
+ data.used.color = color
+ end
+ end
+end
+
+-- transparency
+
+local transparencies = { [0] =
+ pdfconstant("Normal"),
+ pdfconstant("Normal"),
+ pdfconstant("Multiply"),
+ pdfconstant("Screen"),
+ pdfconstant("Overlay"),
+ pdfconstant("SoftLight"),
+ pdfconstant("HardLight"),
+ pdfconstant("ColorDodge"),
+ pdfconstant("ColorBurn"),
+ pdfconstant("Darken"),
+ pdfconstant("Lighten"),
+ pdfconstant("Difference"),
+ pdfconstant("Exclusion"),
+ pdfconstant("Compatible"),
+}
+
+local documenttransparencies = { }
+local transparencyhash = { } -- share objects
+
+local done = false
+
+function registrations.transparency(n,a,t)
+ if not done then
+ local d = pdfdictionary {
+ Type = pdf_extgstate,
+ ca = 1,
+ CA = 1,
+ BM = transparencies[1],
+ AIS = false,
+ }
+ local m = pdfimmediateobj(tostring(d))
+ local mr = pdfreference(m)
+ transparencyhash[0] = m
+ documenttransparencies[0] = mr
+ lpdf.adddocumentextgstate("Tr0",mr)
+ done = true
+ end
+ if n > 0 and not transparencyhash[n] then
+ local d = pdfdictionary {
+ Type = pdf_extgstate,
+ ca = tonumber(t),
+ CA = tonumber(t),
+ BM = transparencies[a] or transparencies[0],
+ AIS = false,
+ }
+ local m = pdfimmediateobj(tostring(d))
+ local mr = pdfreference(m)
+ transparencyhash[n] = m
+ documenttransparencies[n] = mr
+ lpdf.adddocumentextgstate(format("Tr%s",n),mr)
+ end
+end
+
+function codeinjections.adddocumentinfo(key,value)
+ lpdf.addtoinfo(key,lpdf.tosixteen(value))
+end
+
+-- graphics
+
+function codeinjections.setfigurealternative(data,figure)
+ local display = data.request.display
+ if display and display ~= "" then
+ local request = data.request
+ figures.push {
+ name = request.display,
+ page = request.page,
+ size = request.size,
+ prefix = request.prefix,
+ cache = request.cache,
+ width = request.width,
+ height = request.height,
+ }
+ figures.identify()
+ local displayfigure = figures.check()
+ if displayfigure then
+ -- figure.aform = true
+ img.immediatewrite(figure)
+ local a = lpdf.array {
+ lpdf.dictionary {
+ Image = lpdf.reference(figure.objnum),
+ DefaultForPrinting = true,
+ }
+ }
+ local d = lpdf.dictionary {
+ Alternates = lpdf.reference(pdf.immediateobj(tostring(a))),
+ }
+ displayfigure.attr = d()
+ return displayfigure, figures.current()
+ end
+ end
+end
+
+-- eventually we need to load this runtime
+--
+-- backends.install((environment and environment.arguments and environment.arguments.backend) or "pdf")
+--
+-- but now we need to force this as we also load the pdf tex part which hooks into all kind of places
+
+codeinjections.finalizepage = lpdf.finalizepage
+codeinjections.finalizedocument = lpdf.finalizedocument
+
+backends.install("pdf")
diff --git a/tex/context/base/back-pdf.mkiv b/tex/context/base/back-pdf.mkiv
new file mode 100644
index 000000000..a10afd5b9
--- /dev/null
+++ b/tex/context/base/back-pdf.mkiv
@@ -0,0 +1,178 @@
+%D \module
+%D [ file=back-pdf,
+%D version=2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=\PDF,
+%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}{ConTeXt Backend Macros / PDF}
+
+\registerctxluafile{back-pdf}{1.001} % this will change
+
+\unprotect
+
+%D We will minimize the number of calls to \PDF\ specific primitives
+%D and delegate all management and injection of code to the backend.
+%D
+%D Here we initialize some internal quantities.
+
+\pdfoutput = 1
+\pdfhorigin = 1 true in
+\pdfvorigin = 1 true in
+\pdfimageresolution = 300
+\pdfpkresolution = 600
+\pdfdecimaldigits = 10
+\pdfinclusionerrorlevel = 0
+\pdfminorversion = 6 % maybe even 7
+%pdfuniqueresname = 1
+
+%D This one can be consulted by users although the suffix is also
+%D a system mode.
+
+\setjobsuffix{pdf}
+
+%D For the moment we keep these.
+
+\newtoks \pdfbackendeveryximage
+\newtoks \pdfbackendeveryxform
+
+%D These are the only official methods to add stuff to the resources.
+
+\def\pdfbackendsetcatalog #1#2{\ctxlua{lpdf.addtocatalog ("#1",\!!bs#2\!!es)}}
+\def\pdfbackendsetinfo #1#2{\ctxlua{lpdf.addtoinfo ("#1",\!!bs#2\!!es)}}
+\def\pdfbackendsetname #1#2{\ctxlua{lpdf.addtonames ("#1",\!!bs#2\!!es)}}
+
+\def\pdfbackendsetpageattribute #1#2{\ctxlua{lpdf.addtopageattributes ("#1",\!!bs#2\!!es)}}
+\def\pdfbackendsetpagesattribute#1#2{\ctxlua{lpdf.addtopagesattributes("#1",\!!bs#2\!!es)}}
+\def\pdfbackendsetpageresource #1#2{\ctxlua{lpdf.addtopageresources ("#1",\!!bs#2\!!es)}}
+
+\def\pdfbackendsetextgstate #1#2{\ctxlua{lpdf.adddocumentextgstate ("#1",lpdf.verbose(\!!bs#2\!!es))}}
+\def\pdfbackendsetcolorspace #1#2{\ctxlua{lpdf.adddocumentcolorspace("#1",lpdf.verbose(\!!bs#2\!!es))}}
+\def\pdfbackendsetpattern #1#2{\ctxlua{lpdf.adddocumentpattern ("#1",lpdf.verbose(\!!bs#2\!!es))}}
+\def\pdfbackendsetshade #1#2{\ctxlua{lpdf.adddocumentshade ("#1",lpdf.verbose(\!!bs#2\!!es))}}
+
+\def\pdfbackendcurrentresources {\ctxlua{lpdf.collectedresources()}}
+
+%D Let's block these:
+
+\let\pdfcatalog \relax \newtoks\pdfcatalog
+\let\pdfinfo \relax \newtoks\pdfinfo
+\let\pdfnames \relax \newtoks\pdfnames
+\let\pdfpageresources\relax \newtoks\pdfpageresources
+\let\pdfpageattr \relax \newtoks\pdfpageattr
+\let\pdfpagesattr \relax \newtoks\pdfpagesattr
+
+%D An example of usage is:
+
+\appendtoks
+ \pdfbackendsetinfo{ConTeXt.Version}{\contextversion}%
+ \pdfbackendsetinfo{ConTeXt.Time} {\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute}%
+ \pdfbackendsetinfo{ConTeXt.Jobname}{\jobname}%
+ \pdfbackendsetinfo{ConTeXt.Url} {www.pragma-ade.com}%
+\to \everylastbackendshipout
+
+%D Unfortunately this is still needed (also for \METAPOST\ to
+%D \PDF\ converter):
+
+% \def\doresetmapfilelist
+% {\global\let\doresetmapfilelist\relax
+% \pdfmapfile{original-empty.map}}
+%
+% \appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryxform
+% \appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryximage
+
+%D Transformations. Some day we will use primitives (once they're fixed).
+
+\def\dostartrotation#1% grouped
+ {\forcecolorhack
+ \pdfliteral{q \ctxlua{lpdf.rotationcm(#1)}}}
+
+\def\dostoprotation
+ {\pdfliteral{Q}}
+
+\def\dostartscaling#1#2% the test is needed because acrobat is bugged!
+ {\forcecolorhack
+ \pdfliteral{q \ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0
+ \ifdim#2\points=\zeropoint.0001\else#2\fi\space 0 0 cm}}
+
+\def\dostopscaling
+ {\pdfliteral{Q}}
+
+\def\dostartmirroring{\pdfliteral{-1 0 0 1 0 0 cm}}
+\def\dostopmirroring {\pdfliteral{-1 0 0 1 0 0 cm}}
+
+\def\dostartclipping#1#2#3% todo (still needed?)
+ {\PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#3}\height
+ \grabMPclippath{#1}{1}\width\height{0 0 m \width\space 0 l \width \height l 0 \height l}%
+ \pdfliteral{q 0 w \MPclippath\space W n}}
+
+\def\dostopclipping
+ {\pdfliteral{Q n}}
+
+%D The following will move to the backend \LUA\ code:
+
+\appendtoks \ctxlua{backends.codeinjections.finalizepage ()}\to \everybackendshipout % is immediate
+\appendtoks \ctxlua{backends.codeinjections.finalizedocument()}\to \everylastbackendshipout % is immediate
+
+%D Temporary hack, will be removed or improved or default.
+
+\def\TransparencyHack{\ctxlua{backends.codeinjections.addtransparencygroup()}}
+
+%D \macros
+%D {dostartobject,dostopobject,doinsertobject}
+
+%D This will change:
+
+\newbox\objectbox
+
+\def\dostartobject#1#2#3#4#5%
+ {\bgroup
+ \setbox\objectbox\vbox\bgroup
+ \def\dodostopobject{\egroup\doregisterobject{#1}{#2}}}
+
+\def\dostopobject
+ {\dodostopobject
+ \egroup}
+
+\def\doregisterobject#1#2%
+ {\the\pdfbackendeveryxform
+ \finalizeobjectbox\objectbox
+ \immediate\pdfxform resources {\pdfbackendcurrentresources}\objectbox
+ \dosetobjectreference{#1}{#2}{\the\pdflastxform}}
+
+\def\doresetobjects
+ {}
+
+\def\doinsertobject#1#2%
+ {\begingroup
+ \doifobjectreferencefoundelse{#1}{#2}
+ {\dogetobjectreference{#1}{#2}\PDFobjectreference\pdfrefxform\PDFobjectreference}%
+ \donothing
+ \endgroup}
+
+\def\doPDFgetobjectpage#1#2#3%
+ {\dogetobjectreferencepage{#1}{#2}#3%
+ \ifx#3\empty\def#3{\realfolio}\fi}
+
+\def\doPDFgetobjectpagereference#1#2#3%
+ {\dogetobjectreferencepage{#1}{#2}#3%
+ \doPDFgetpagereference{\ifx#3\empty\realfolio\else#3\fi}#3}
+
+\let\lastpredefinedsymbol\empty % some day we can do more at the lua end
+
+\def\predefinesymbol[#1]%
+ {\begingroup
+ \xdef\lastpredefinedsymbol{#1}%
+ \settightobject{SYM}{#1}\hbox{\symbol[#1]}% to be checked ... maybe only fitting
+ \dogetobjectreference{SYM}{#1}\lastref
+ \ctxlua{backends.codeinjections.registersymbol("#1",\lastref)}%
+ \endgroup}
+
+\protect \endinput
diff --git a/tex/context/base/back-u3d.mkiv b/tex/context/base/back-u3d.mkiv
new file mode 100644
index 000000000..398159feb
--- /dev/null
+++ b/tex/context/base/back-u3d.mkiv
@@ -0,0 +1,156 @@
+%D \module
+%D [ file=back-u3d,
+%D version=2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=U3D Experiment,
+%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.
+
+% This is only a placeholder that demonstrates the usage of u3d
+% resources. The user interface is rather messy an might be
+% improved. The files and setup is derived from an example by
+% Michael Vidiassov.
+
+\endinput
+
+\starttext
+
+\startluaparameterset [u3d:myset:controls:1]
+ view = {
+ name = 'default',
+ bg = {1,1,1},
+ mag = 100,
+ coo = {0,0,0},
+ c2c = {0,0,1},
+ rot = {40,0,60},
+ roo = 6,
+ lights = 'CAD'
+ },
+ js = 'cloudq.js'
+\stopluaparameterset
+
+\startluaparameterset [u3d:myset:controls:2]
+ views = {
+ {
+ name = 'AnglePositioning',
+ bg = {1,1,1},
+ azimuth = 45,
+ altitude = 45,
+ roo = 50,
+ aac = 2.5,
+ lights = 'Artwork'
+ },
+ {
+ name = 'RotationPositioning',
+ bg = {1,1,1},
+ rot = {0,45,45},
+ roo = 50,
+ aac = 2.5,
+ lights = 'Artwork'
+ },
+ {
+ name = 'VectorPositioning',
+ bg = {1,0,0},
+ c2c = {1,1,math.sqrt(2)},
+ roo = 50,
+ aac = 2.5,
+ lights = 'CAD'
+ },
+ {
+ name = 'PositionPositioning',
+ bg = {1,0,0},
+ pos = {1+25,1+25,1+50/math.sqrt(2)},
+ aac = 2.5,
+ lights = 'CAD'
+ },
+ {
+ name = 'ortho',
+ bg = {1,1,1},
+ mag = 300,
+ lights = 'CAD',
+ crossection = {}
+ }
+ },
+ view = {
+ name = 'default',
+ bg = {1,1,1},
+ c2c = {-1,-1,0},
+ roo = 50,
+ aac = 2.5,
+ roll = 45,
+ lights = 'CAD',
+ crossection = {
+ normal = {-1,-1,-1},
+ transparent = true
+ },
+ nodes = {
+ {
+ name = 'xlabel',
+ visible = false
+ },
+ {
+ name = 'ylabel',
+ opacity = 0.5
+ },
+ {
+ name = 'zlabel',
+ rendermode = 'Wireframe'
+ }
+ }
+ }
+\stopluaparameterset
+
+\useexternalfigure
+ [cloudq]
+ [cloudq.u3d]
+ [width=0.7\textwidth,
+ height=.7\textwidth,
+ display=u3d:myset:display:1,
+ controls=u3d:myset:controls:1]
+
+\useexternalfigure
+ [axes]
+ [axes.u3d]
+ [width=0.7\textwidth,
+ height=.7\textwidth,
+ controls=u3d:myset:controls:1]
+
+\startluaparameterset[u3d:myset:display:2]
+ toolbar = true,
+ preview = 'cloudq.png'
+\stopluaparameterset
+\startluaparameterset[u3d:myset:display:3]
+ toolbar = true,
+ tree = false,
+ preview = 'area.png'
+\stopluaparameterset
+\startluaparameterset[u3d:myset:display:4]
+ toolbar = true,
+ tree = false,
+ view = {
+ name = 'view',
+ bg = {0.1,0.1,0.1},
+ c2c = {-1,-1,0},
+ roo = 50,
+ aac = 2.5,
+ roll = 45,
+ lights = 'Red'
+ }
+\stopluaparameterset
+\startluaparameterset[u3d:myset:display:5]
+ toolbar = true,
+ tree = false,
+ view = 'ortho'
+\stopluaparameterset
+
+\placefigure[here]{none}{\externalfigure[cloudq][display=u3d:myset:display:2]}
+\placefigure[here]{none}{\externalfigure[axes] [display=u3d:myset:display:3]}
+\placefigure[here]{none}{\externalfigure[axes] [display=u3d:myset:display:4]}
+\placefigure[here]{none}{\externalfigure[axes] [display=u3d:myset:display:5,width=0.5\textwidth,height=.5\textwidth]}
+
+\stoptext
diff --git a/tex/context/base/bibl-bib.lua b/tex/context/base/bibl-bib.lua
new file mode 100644
index 000000000..3c0dad2fa
--- /dev/null
+++ b/tex/context/base/bibl-bib.lua
@@ -0,0 +1,762 @@
+if not modules then modules = { } end modules ['bibl-bib'] = {
+ 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--
+<p>This is a prelude to integrated bibliography support. This file just loads
+bibtex files and converts them to xml so that the we access the content
+in a convenient way. Actually handling the data takes place elsewhere.</p>
+--ldx]]--
+
+local utf = unicode.utf8
+local lower, format, gsub, concat = string.lower, string.format, string.gsub, table.concat
+local next = next
+local utfchar = utf.char
+local lpegmatch = lpeg.match
+local textoutf = characters and characters.tex.toutf
+local variables = interfaces and interfaces.variables
+
+local finalizers = xml.finalizers.tex
+local xmlfilter, xmltext = xml.filter, xml.text
+
+local trace_bibxml = false trackers.register("publications.bibxml", function(v) trace_bibtex = v end)
+
+bibtex = bibtex or { }
+
+bibtex.size = 0
+bibtex.definitions = 0
+bibtex.shortcuts = 0
+
+local defaultshortcuts = {
+ jan = "1",
+ feb = "2",
+ mar = "3",
+ apr = "4",
+ may = "5",
+ jun = "6",
+ jul = "7",
+ aug = "8",
+ sep = "9",
+ oct = "10",
+ nov = "11",
+ dec = "12",
+}
+
+local shortcuts = { }
+local data = { }
+local entries
+
+-- Currently we expand shortcuts and for large ones (like the acknowledgements
+-- in tugboat.bib this is not that efficient. However, eventually strings get
+-- hashed again.
+
+local function do_shortcut(tag,key,value)
+ bibtex.shortcuts = bibtex.shortcuts + 1
+ if lower(tag) == "@string" then
+ shortcuts[key] = value
+ end
+end
+
+local function do_definition(tag,key,tab) -- maybe check entries here (saves memory)
+ if not entries or entries[key] then
+ bibtex.definitions = bibtex.definitions + 1
+ local t = { }
+ for i=1,#tab,2 do
+ t[tab[i]] = tab[i+1]
+ end
+ local p = data[tag]
+ if not p then
+ data[tag] = { [key] = t }
+ else
+ p[key] = t
+ end
+ end
+end
+
+local function resolve(s)
+ return shortcuts[s] or defaultshortcuts[s] or s -- can be number
+end
+
+local P, R, S, C, Cc, Cs, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct
+
+local percent = P("%")
+local start = P("@")
+local comma = P(",")
+local hash = P("#")
+local escape = P("\\")
+local single = P("'")
+local double = P('"')
+local left = P('{')
+local right = P('}')
+local both = left + right
+local lineending = S("\n\r")
+local space = S(" \t\n\r\f")
+local spacing = space^0
+local equal = P("=")
+local collapsed = (space^1)/ " "
+
+local function add(a,b) if b then return a..b else return a end end
+
+local keyword = C((lpeg.R("az","AZ","09") + S("@_:-"))^1) -- lpeg.C((1-space)^1)
+local s_quoted = ((escape*single) + collapsed + (1-single))^0
+local d_quoted = ((escape*double) + collapsed + (1-double))^0
+local balanced = lpeg.patterns.balanced
+
+local s_value = (single/"") * s_quoted * (single/"")
+local d_value = (double/"") * d_quoted * (double/"")
+local b_value = (left /"") * balanced * (right /"")
+local r_value = keyword/resolve
+
+local somevalue = s_value + d_value + b_value + r_value
+local value = Cs((somevalue * ((spacing * hash * spacing)/"" * somevalue)^0))
+
+local assignment = spacing * keyword * spacing * equal * spacing * value * spacing
+local shortcut = keyword * spacing * left * spacing * (assignment * comma^0)^0 * spacing * right
+local definition = keyword * spacing * left * spacing * keyword * comma * lpeg.Ct((assignment * comma^0)^0) * spacing * right
+local comment = keyword * spacing * left * (1-right)^0 * spacing * right
+local forget = percent^1 * (1-lineending)^0
+
+-- todo \%
+
+local grammar = (space + forget + shortcut/do_shortcut + definition/do_definition + comment + 1)^0
+
+function bibtex.convert(session,content)
+ statistics.starttiming(bibtex)
+ data, shortcuts, entries = session.data, session.shortcuts, session.entries
+ -- session.size = session.size + #content
+ bibtex.size = bibtex.size + #content
+ session.size = session.size + #content
+ lpegmatch(grammar,content or "")
+ statistics.stoptiming(bibtex)
+end
+
+function bibtex.load(session,filename)
+ local filename = resolvers.find_file(filename,"bib")
+ if filename ~= "" then
+ local data = io.loaddata(filename) or ""
+ if data == "" then
+ logs.report("publications","empty file '%s', no conversion to xml",filename)
+ elseif trace_bibxml then
+ logs.report("publications","converting file '%s' to xml",filename)
+ end
+ bibtex.convert(session,data)
+ end
+end
+
+function bibtex.new()
+ return {
+ data = { },
+ shortcuts = { },
+ xml = xml.convert("<?xml version='1.0' standalone='yes'?>\n<bibtex></bibtex>"),
+ size = 0,
+ entries = nil,
+ loaded = false,
+ }
+end
+
+local escaped_pattern = xml.escaped_pattern
+
+local ihatethis = {
+ f = "\\f",
+ n = "\\n",
+ r = "\\r",
+ s = "\\s",
+ t = "\\t",
+ v = "\\v",
+ z = "\\z",
+}
+
+local command = P("\\")/"" * Cc("\\bibtexcommand{") * (R("az","AZ")^1) * Cc("}")
+local any = P(1)
+local done = P(-1)
+local one_l = P("{") / ""
+local one_r = P("}") / ""
+local two_l = P("{{") / ""
+local two_r = P("}}") / ""
+
+local filter = Cs(
+ two_l * (command + any - two_r - done)^0 * two_r * done +
+ one_l * (command + any - one_r - done)^0 * one_r * done +
+ (command + any )^0
+)
+
+function bibtex.toxml(session,options)
+ if session.loaded then
+ return
+ else
+ session.loaded = true
+ end
+ -- we can always speed this up if needed
+ -- format slows down things a bit but who cares
+ statistics.starttiming(bibtex)
+ local result = { }
+ local options = aux.settings_to_hash(options)
+ local convert = options.convert -- todo: interface
+ local strip = options.strip -- todo: interface
+ local entries = session.entries
+ result[#result+1] = format("<?xml version='1.0' standalone='yes'?>")
+ result[#result+1] = format("<bibtex>")
+ for id, categories in next, session.data do
+ id = lower(gsub(id,"^@",""))
+ for name, entry in next, categories do
+ if not entries or entries[name] then
+ result[#result+1] = format("<entry tag='%s' category='%s'>",lower(name),id)
+ for key, value in next, entry do
+ value = gsub(value,"\\(.)",ihatethis)
+ value = lpegmatch(escaped_pattern,value)
+
+ if value ~= "" then
+ if convert then
+ value = textoutf(value,true)
+ end
+ if strip then
+ -- as there is no proper namespace in bibtex we need this
+ -- kind of hackery ... bibtex databases are quite unportable
+ value = lpegmatch(filter,value) or value
+ end
+ result[#result+1] = format(" <field name='%s'>%s</field>",key,value)
+ end
+ end
+ result[#result+1] = format("</entry>")
+ end
+ end
+ end
+ result[#result+1] = format("</bibtex>")
+ result = concat(result,"\n")
+ -- alternatively we could use lxml.convert
+ session.xml = xml.convert(result, {
+ resolve_entities = true,
+ resolve_predefined_entities = true, -- in case we have escaped entities
+ -- unify_predefined_entities = true, -- &#038; -> &amp;
+ utfize_entities = true,
+ } )
+ session.data = nil
+ session.shortcuts = nil
+ statistics.stoptiming(bibtex)
+end
+
+statistics.register("bibtex load time", function()
+ local size = bibtex.size
+ if size > 0 then
+ return format("%s seconds (%s bytes, %s definitions, %s shortcuts)",
+ statistics.elapsedtime(bibtex),size,bibtex.definitions,bibtex.shortcuts)
+ else
+ return nil
+ end
+end)
+
+--~ str = [[
+--~ @COMMENT { CRAP }
+--~ @STRING{ hans = "h a n s" }
+--~ @STRING{ taco = "t a c o" }
+--~ @SOMETHING{ key1, abc = "t a c o" , def = "h a n s" }
+--~ @SOMETHING{ key2, abc = hans # taco }
+--~ @SOMETHING{ key3, abc = "hans" # taco }
+--~ @SOMETHING{ key4, abc = hans # "taco" }
+--~ @SOMETHING{ key5, abc = hans # taco # "hans" # "taco"}
+--~ @SOMETHING{ key6, abc = {oeps {oeps} oeps} }
+--~ ]]
+
+--~ local session = bibtex.new()
+--~ bibtex.convert(session,str)
+--~ bibtex.toxml(session)
+--~ print(session.size,statistics.elapsedtime(bibtex))
+
+--~ local session = bibtex.new()
+--~ bibtex.load(session,"IEEEabrv.bib")
+--~ bibtex.load(session,"IEEEfull.bib")
+--~ bibtex.load(session,"IEEEexample.bib")
+--~ bibtex.toxml(session)
+--~ print(session.size,statistics.elapsedtime(bibtex))
+
+--~ local session = bibtex.new()
+--~ bibtex.load(session,"gut.bib")
+--~ bibtex.load(session,"komoedie.bib")
+--~ bibtex.load(session,"texbook1.bib")
+--~ bibtex.load(session,"texbook2.bib")
+--~ bibtex.load(session,"texbook3.bib")
+--~ bibtex.load(session,"texgraph.bib")
+--~ bibtex.load(session,"texjourn.bib")
+--~ bibtex.load(session,"texnique.bib")
+--~ bibtex.load(session,"tugboat.bib")
+--~ bibtex.toxml(session)
+--~ print(session.size,statistics.elapsedtime(bibtex))
+
+--~ print(table.serialize(session.data))
+--~ print(table.serialize(session.shortcuts))
+--~ print(xml.serialize(session.xml))
+
+if not characters then dofile(resolvers.find_file("char-def.lua")) end
+
+local chardata = characters.data
+local concat = table.concat
+
+local P, Ct, lpegmatch = lpeg.P, lpeg.Ct, lpeg.match
+
+local space, comma = P(" "), P(",")
+
+local andsplitter = Ct(lpeg.splitat(space^1 * "and" * space^1))
+local commasplitter = Ct(lpeg.splitat(space^0 * comma * space^0))
+local spacesplitter = Ct(lpeg.splitat(space^1))
+local firstcharacter = lpeg.patterns.utf8byte
+
+function is_upper(str)
+ local first = lpegmatch(firstcharacter,str)
+ local okay = chardata[first]
+ return okay and okay.category == "lu"
+end
+
+local function splitauthors(str)
+ local authors = lpegmatch(andsplitter,str)
+ for i=1,#authors do
+ local firstnames, vons, surnames, initials, juniors, words
+ local author = authors[i]
+ local split = lpegmatch(commasplitter,author)
+ local n = #split
+ if n == 1 then
+ --~ First von Last
+ words = lpegmatch(spacesplitter,author)
+ firstnames, vons, surnames = { }, { }, { }
+ local i, n = 1, #words
+ while i <= n do
+ local w = words[i]
+ if is_upper(w) then
+ firstnames[#firstnames+1], i = w, i + 1
+ else
+ break
+ end
+ end
+ while i <= n do
+ local w = words[i]
+ if is_upper(w) then
+ break
+ else
+ vons[#vons+1], i = w, i + 1
+ end
+ end
+ while i <= n do
+ surnames[#surnames+1], i = words[i], i + 1
+ end
+ elseif n == 2 then
+ --~ von Last, First
+ words = lpegmatch(spacesplitter,split[2])
+ surnames = lpegmatch(spacesplitter,split[1])
+ firstnames, vons = { }, { }
+ local i, n = 1, #words
+ while i <= n do
+ local w = words[i]
+ if is_upper(w) then
+ firstnames[#firstnames+1], i = w, i + 1
+ else
+ break
+ end
+ end
+ while i <= n do
+ vons[#vons+1], i = words[i], i + 1
+ end
+ else
+ --~ von Last, Jr ,First
+ firstnames = lpegmatch(spacesplitter,split[1])
+ juniors = lpegmatch(spacesplitter,split[2])
+ surnames = lpegmatch(spacesplitter,split[3])
+ if n > 3 then
+ -- error
+ end
+ end
+ if #surnames == 0 then
+ surnames[1] = firstnames[#firstnames]
+ firstnames[#firstnames] = nil
+ end
+ if firstnames then
+ initials = { }
+ for i=1,#firstnames do
+ initials[i] = utfchar(lpegmatch(firstcharacter,firstnames[i]))
+ end
+ end
+ authors[i] = {
+ original = author,
+ firstnames = firstnames,
+ vons = vons,
+ surnames = surnames,
+ initials = initials,
+ juniors = juniors,
+ }
+ end
+ authors.original = str
+ return authors
+end
+
+local function the_initials(initials,symbol)
+ local t, symbol = { }, symbol or "."
+ for i=1,#initials do
+ t[i] = initials[i] .. symbol
+ end
+ return t
+end
+
+-- authors
+
+bibtex.authors = bibtex.authors or { }
+
+local authors = bibtex.authors
+
+local defaultsettings = {
+ firstnamesep = " ",
+ vonsep = " ",
+ surnamesep = " ",
+ juniorsep = " ",
+ surnamejuniorsep = ", ",
+ juniorjuniorsep = ", ",
+ surnamefirstnamesep = ", ",
+ surnameinitialsep = ", ",
+ namesep = ", ",
+ lastnamesep = " and ",
+ finalnamesep = " and ",
+}
+
+function authors.normal(author,settings)
+ local firstnames, vons, surnames, juniors = author.firstnames, author.vons, author.surnames, author.juniors
+ local result, settings = { }, settings or defaultsettings
+ if firstnames and #firstnames > 0 then
+ result[#result+1] = concat(firstnames," ")
+ result[#result+1] = settings.firstnamesep or defaultsettings.firstnamesep
+ end
+ if vons and #vons > 0 then
+ result[#result+1] = concat(vons," ")
+ result[#result+1] = settings.vonsep or defaultsettings.vonsep
+ end
+ if surnames then
+ result[#result+1] = concat(surnames," ")
+ end
+ if juniors and #juniors > 0 then
+ result[#result+1] = concat(juniors," ")
+ result[#result+1] = settings.surnamesep or defaultsettings.surnamesep
+ end
+ return concat(result)
+end
+
+function authors.normalshort(author,settings)
+ local firstnames, vons, surnames, juniors = author.firstnames, author.vons, author.surnames, author.juniors
+ local result, settings = { }, settings or defaultsettings
+ if firstnames and #firstnames > 0 then
+ result[#result+1] = concat(firstnames," ")
+ result[#result+1] = settings.firstnamesep or defaultsettings.firstnamesep
+ end
+ if vons and #vons > 0 then
+ result[#result+1] = concat(vons," ")
+ result[#result+1] = settings.vonsep or defaultsettings.vonsep
+ end
+ if surnames then
+ result[#result+1] = concat(surnames," ")
+ end
+ if juniors and #juniors > 0 then
+ result[#result+1] = concat(juniors," ")
+ result[#result+1] = settings.surnamejuniorsep or defaultsettings.surnamejuniorsep
+ end
+ return concat(result)
+end
+
+function authors.inverted(author,settings)
+ local firstnames, vons, surnames, juniors = author.firstnames, author.vons, author.surnames, author.juniors
+ local result, settings = { }, settings or defaultsettings
+ if vons and #vons > 0 then
+ result[#result+1] = concat(vons," ")
+ result[#result+1] = settings.vonsep or defaultsettings.vonsep
+ end
+ if surnames then
+ result[#result+1] = concat(surnames," ")
+ end
+ if juniors and #juniors > 0 then
+ result[#result+1] = settings.juniorjuniorsep or defaultsettings.juniorjuniorsep
+ result[#result+1] = concat(juniors," ")
+ end
+ if firstnames and #firstnames > 0 then
+ result[#result+1] = settings.surnamefirstnamesep or defaultsettings.surnamefirstnamesep
+ result[#result+1] = concat(firstnames," ")
+ end
+ return concat(result)
+end
+
+function authors.invertedshort(author,settings)
+ local vons, surnames, initials, juniors = author.vons, author.surnames, author.initials, author.juniors
+ local result, settings = { }, settings or defaultsettings
+ if vons and #vons > 0 then
+ result[#result+1] = concat(vons," ")
+ result[#result+1] = settings.vonsep or defaultsettings.vonsep
+ end
+ if surnames then
+ result[#result+1] = concat(surnames," ")
+ end
+ if juniors and #juniors > 0 then
+ result[#result+1] = settings.juniorjuniorsep or defaultsettings.juniorjuniorsep
+ result[#result+1] = concat(juniors," ")
+ end
+ if initials and #initials > 0 then
+ result[#result+1] = settings.surnameinitialsep or defaultsettings.surnameinitialsep
+ result[#result+1] = concat(the_initials(initials)," ")
+ end
+ return concat(result)
+end
+
+local lastconcatsize = 1
+
+local function bibtexconcat(t,settings)
+ local namesep = settings.namesep or defaultsettings.namesep or ", "
+ local lastnamesep = settings.lastnamesep or defaultsettings.lastnamesep or namesep
+ local finalnamesep = settings.finalnamesep or defaultsettings.finalnamesep or lastnamesep
+ local lastconcatsize = #t
+ if lastconcatsize > 2 then
+ local s = { }
+ for i=1,lastconcatsize-2 do
+ s[i] = t[i] .. namesep
+ end
+ s[lastconcatsize-1], s[lastconcatsize] = t[lastconcatsize-1] .. finalnamesep, t[lastconcatsize]
+ return concat(s)
+ elseif lastconcatsize > 1 then
+ return concat(t,lastnamesep)
+ elseif lastconcatsize > 0 then
+ return t[1]
+ else
+ return ""
+ end
+end
+
+function authors.concat(author,combiner,what,settings)
+ if type(combiner) == "string" then
+ combiner = authors[combiner or "normal"] or authors.normal
+ end
+ local split = splitauthors(author)
+ local setting = settings[what]
+ local etallimit, etaldisplay, etaltext = 1000, 1000, ""
+ if setting then
+ etallimit = settings.etallimit or 1000
+ etaldisplay = settings.etaldisplay or etallimit
+ etalltext = settings.etaltext or ""
+ end
+ local max = #split
+ if max > etallimit and etaldisplay < max then
+ max = etaldisplay
+ end
+ for i=1,max do
+ split[i] = combiner(split[i],settings)
+ end
+ local result = bibtexconcat(split,settings)
+ if max < #split then
+ return result
+ else
+ return result .. etaltext
+ end
+end
+
+function authors.short(author,year)
+ local result = { }
+ if author then
+ local authors = splitauthors(author)
+ for a=1,#authors do
+ local aa = authors[a]
+ local initials = aa.initials
+ for i=1,#initials do
+ result[#result+1] = initials[i]
+ end
+ local surnames = aa.surnames
+ for s=1,#surnames do
+ result[#result+1] = utfchar(lpegmatch(firstcharacter,surnames[s]))
+ end
+ end
+ end
+ if year then
+ result[#result+1] = year
+ end
+ return concat(result)
+end
+
+-- We can consider creating a hashtable key -> entry but I wonder if
+-- pays off.
+
+local function collectauthoryears(id,list)
+ list = aux.settings_to_hash(list)
+ id = lxml.get_id(id)
+ local found = { }
+ for e in xml.collected(id,"/bibtex/entry") do
+ if list[e.at.tag] then
+ local year = xmlfilter(e,"xml:///field[@name='year']/text()")
+ local author = xmlfilter(e,"xml:///field[@name='author']/text()")
+ if author and year then
+ local a = found[author]
+ if not a then
+ a = { }
+ found[author] = a
+ end
+ local y = a[year]
+ if not y then
+ y = { }
+ a[year] = y
+ end
+ y[#y+1] = e
+ end
+ end
+ end
+ -- found = { author = { year_1 = { e1, e2, e3 } } }
+ local done = { }
+ for author, years in next, found do
+ local yrs = { }
+ for year, entries in next, years do
+ if subyears then
+ -- -- add letters to all entries of an author and if so shouldn't
+ -- -- we tag all years of an author as soon as we do this?
+ -- if #entries > 1 then
+ -- for i=1,#years do
+ -- local entry = years[i]
+ -- -- years[i] = year .. string.char(i + string.byte("0") - 1)
+ -- end
+ -- end
+ else
+ yrs[#yrs+1] = year
+ end
+ end
+ done[author] = yrs
+ end
+ return done
+end
+
+local method, settings = "normal", { }
+
+function authors.setsettings(s)
+ settings = s or settings
+end
+
+if commands then
+
+ local texsprint = tex and tex.sprint
+ local ctxcatcodes = tex and tex.ctxcatcodes
+
+ local sessions = { }
+
+ function commands.definebibtexsession(name)
+ sessions[name] = bibtex.new()
+ end
+
+ function commands.preparebibtexsession(name,xmlname,options)
+ bibtex.toxml(sessions[name],options)
+ lxml.register(xmlname,sessions[name].xml)
+ end
+
+ function commands.registerbibtexfile(name,filename)
+ bibtex.load(sessions[name],filename)
+ end
+
+ function commands.registerbibtexentry(name,entry)
+ local session = sessions[name]
+ local entries = session.entries
+ if not entries then
+ session.entries = { [entry] = true } -- here we can keep more info
+ else
+ entries[entry] = true
+ end
+ end
+
+ -- commands.bibtexconcat = bibtexconcat
+
+ -- finalizers can be rather dumb as we have just text and no embedded xml
+
+ function finalizers.bibtexconcat(collected,method,what)
+ if collected then
+ local author = collected[1].dt[1] or ""
+ if author ~= "" then
+ texsprint(ctxcatcodes,authors.concat(author,method,what,settings))
+ end
+ end
+ end
+
+ function finalizers.bibtexshort(collected)
+ if collected then
+ local c = collected[1]
+ local year = xmlfilter(c,"xml://field[@name='year']/text()")
+ local author = xmlfilter(c,"xml://field[@name='author']/text()")
+ texsprint(ctxcatcodes,authors.short(author,year))
+ end
+ end
+
+ -- experiment:
+
+ --~ -- alternative approach: keep data at the tex end
+
+ --~ local function xbibtexconcat(t,sep,finalsep,lastsep)
+ --~ local n = #t
+ --~ if n > 0 then
+ --~ context(t[1])
+ --~ if n > 1 then
+ --~ if n > 2 then
+ --~ for i=2,n-1 do
+ --~ context.bibtexpublicationsparameter("sep")
+ --~ context(t[i])
+ --~ end
+ --~ context.bibtexpublicationsparameter("finalsep")
+ --~ else
+ --~ context.bibtexpublicationsparameter("lastsep")
+ --~ end
+ --~ context(t[n])
+ --~ end
+ --~ end
+ --~ end
+
+ -- todo : sort
+
+ -- todo: choose between bibtex or commands namespace
+
+ function bibtex.authorref(id,list)
+ local result = collectauthoryears(id,list,method,what)
+ for author, years in next, result do
+ texsprint(ctxcatcodes,authors.concat(author,method,what,settings))
+ end
+ end
+
+ function bibtex.authoryearref(id,list)
+ local result = collectauthoryears(id,list,method,what)
+ for author, years in next, result do
+ texsprint(ctxcatcodes,authors.concat(author,method,what,settings)," (",concat(years,", "),")")
+ end
+ end
+
+ function bibtex.authoryearsref(id,list)
+ local result = collectauthoryears(id,list,method,what)
+ for author, years in next, result do
+ texsprint(ctxcatcodes,"(",authors.concat(author,method,what,settings),", ",concat(years,", "),")")
+ end
+ end
+
+ function bibtex.singular_or_plural(singular,plural)
+ if lastconcatsize and lastconcatsize > 1 then
+ texsprint(ctxcatcodes,plural)
+ else
+ texsprint(ctxcatcodes,singular)
+ end
+ end
+end
+
+
+--~ local function test(sample)
+--~ local authors = splitauthors(sample)
+--~ print(table.serialize(authors))
+--~ for i=1,#authors do
+--~ local author = authors[i]
+--~ print(normalauthor (author,settings))
+--~ print(normalshortauthor (author,settings))
+--~ print(invertedauthor (author,settings))
+--~ print(invertedshortauthor(author,settings))
+--~ end
+--~ print(concatauthors(sample,settings,normalauthor))
+--~ print(concatauthors(sample,settings,normalshortauthor))
+--~ print(concatauthors(sample,settings,invertedauthor))
+--~ print(concatauthors(sample,settings,invertedshortauthor))
+--~ end
+
+--~ local sample_a = "Hagen, Hans and Hoekwater, Taco Whoever T. Ex. and Henkel Hut, Hartmut Harald von der"
+--~ local sample_b = "Hans Hagen and Taco Whoever T. Ex. Hoekwater and Hartmut Harald von der Henkel Hut"
+
+--~ test(sample_a)
+--~ test(sample_b)
diff --git a/tex/context/base/bibl-bib.mkiv b/tex/context/base/bibl-bib.mkiv
new file mode 100644
index 000000000..10abe5cb8
--- /dev/null
+++ b/tex/context/base/bibl-bib.mkiv
@@ -0,0 +1,962 @@
+%D \module
+%D [ file=bibl-bib,
+%D version=2007.08.17,
+%D title=\CONTEXT\ Bibliography Support,
+%D subtitle=Initialization,
+%D author=Hans Hagen \& Taco Hoekwater,
+%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 Bibliography Support / Experimental BibTeX}
+
+\registerctxluafile{bibl-bib}{1.001}
+
+\unprotect
+
+% todo: et al limiters
+% todo: split: citationvariant and publicationvariant
+
+%D This interface is under development. As I don't use \BIBTEX\ myself I need
+%D some motivation to spend time on it, and an occasional question on the
+%D list can be a reason. A few examples. As \BIBTEX\ databases can be poluted
+%D by local commands, we need to catch:
+%D
+%D \startbuffer
+%D \defbibtexcommand\MF {MF}
+%D \defbibtexcommand\MP {MP}
+%D \defbibtexcommand\TUB {TUGboat}
+%D \defbibtexcommand\Mc {Mac}
+%D \defbibtexcommand\sltt{\tt}
+%D \defbibtexcommand\<#1>{\type{#1}}
+%D \defbibtexcommand\acro#1{#1}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Let's define a session and load a few databases. We convert to \UTF\ and
+%D strip commands.
+%D
+%D \startbuffer
+%D \definebibtexsession [somebibtex]
+%D \registerbibtexfile [somebibtex] [tugboat.bib]
+%D \registerbibtexfile [somebibtex] [komoedie.bib]
+%D \preparebibtexsession [somebibtex] [convert,strip]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This loads an mapping (work in progress):
+%D
+%D \startbuffer
+%D \def\currentbibtexformat{apa} \input bxml-\currentbibtexformat.mkiv
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D There are several ways to handle the \XML. It helps if you're a bit
+%D familiar with \XML\ processing in \MKIV.
+%D
+%D Here we regular setups. Three elements are mapped but only one
+%D is actually used and applied to root element \type {/bibtex}.
+%D
+%D \startbuffer
+%D \startxmlsetups bibtex
+%D \xmlregistereddocumentsetups{#1}{}
+%D \xmlsetsetup{#1}{bibtex|entry|field}{bibtex:*}
+%D \xmlmain{#1}
+%D \stopxmlsetups
+%D
+%D \startxmlsetups bibtex:bibtex
+%D \xmlfilter{#1}{
+%D /entry[@category='article']
+%D /field[@name='author' and (find(text(),'Hagen') or find(text(),'Hoekwater'))]
+%D /../command(bibtex:format)
+%D }
+%D \stopxmlsetups
+%D
+%D \applytobibtexsession[somebibtex][bibtex]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D A simpler setup is given next. Here we just apply a setup to the root
+%D element directly:
+%D
+%D \startbuffer
+%D \startxmlsetups bibtex:list
+%D \xmlfilter{#1}{/bibtex/entry/command(bibtex:format)}
+%D \stopxmlsetups
+%D
+%D \applytobibtexsession[somebibtex][bibtex:list]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D A slightly more complex expression:
+%D
+%D \startbuffer
+%D \startxmlsetups bibtex:filter
+%D \xmlfilter{#1}{
+%D /bibtex
+%D /entry[@category='article']
+%D /field[@name='author' and (find(text(),'Hagen') or find(text(),'Hoekwater'))]
+%D /../command(bibtex:format)
+%D }
+%D \stopxmlsetups
+%D
+%D \applytobibtexsession[somebibtex][bibtex:filter]
+%D \stopbuffer
+%D
+%D \typebuffer
+
+\newtoks \everydefinebibtexsession
+\newtoks \everypreparebibtexsession
+\newtoks \everysetupbibtexsession
+\setfalse \tracebibtexformat
+
+\unexpanded\def\definebibtexsession {\dosingleargument\dodefinebibtexsession}
+\def\preparebibtexsession {\dodoubleempty \dopreparebibtexsession}
+\unexpanded\def\setupbibtexsession {\dodoubleargument\dosetupbibtexsession}
+
+\def\dodefinebibtexsession [#1]{\edef\currentbibtexsession{#1}%
+ \ctxlua{commands.definebibtexsession("#1")}%
+ \the\everydefinebibtexsession}
+
+\def\dopreparebibtexsession[#1][#2]{\edef\currentbibtexsession{#1}%
+ \ctxlua{commands.preparebibtexsession("#1","bibtex:#1","#2")}%
+ \the\everypreparebibtexsession}
+
+\def\dosetupbibtexsession [#1][#2]{\edef\currentbibtexsession{#1}%
+ \getparameters[\??pb#1][#2]%
+ \the\everysetupbibtexsession}
+
+\def\registerbibtexfile {\dodoubleargument\doregisterbibtexfile}
+\def\registerbibtexentry {\dodoubleargument\doregisterbibtexentry}
+\def\applytobibtexsession {\dodoubleargument\doapplytobibtexsession}
+
+\def\doregisterbibtexfile [#1][#2]{\ctxlua{commands.registerbibtexfile("#1","#2")}}
+\def\doregisterbibtexentry [#1][#2]{\ctxlua{commands.registerbibtexentry("#1","#2")}}
+\def\doapplytobibtexsession[#1][#2]{\xmlprocessregistered{bibtex:#1}{#2}{#2}}
+
+\unexpanded\def\bibtexcommand#1%
+ {\ifcsname\??pb:c:#1\endcsname \else
+ \fakebibtexcommand{#1}%
+ \fi
+ \csname\??pb:c:#1\endcsname}
+
+\def\fakebibtexcommand#1%
+ {\ifcsname#1\endcsname
+ \writestatus{bibtex}{unknown command: #1, using built-in context variant}%
+ \setugvalue{\??pb:c:#1}{\dosomebibtexcommand{#1}}%
+ \else
+ \writestatus{bibtex}{unknown command: #1}%
+ \setugvalue{\??pb:c:#1}{\dofakebibtexcommand{#1}}%
+ \fi}
+
+\let\dosomebibtexcommand \getvalue
+\def\dofakebibtexcommand#1{{\tttf#1}}
+
+\def\defbibtexcommand#1%
+ {\setuvalue{\strippedcsname#1}}
+
+\def\bibxmldoifelse#1{\xmldoifelse\currentbibxmlnode{/field[@name='#1']}}
+\def\bibxmldoif #1{\xmldoif \currentbibxmlnode{/field[@name='#1']}}
+\def\bibxmldoifnot #1{\xmldoifnot \currentbibxmlnode{/field[@name='#1']}}
+\def\bibxmlflush #1{\xmlcontext \currentbibxmlnode{/field[@name='#1']}}
+\def\bibxmlsetup {\xmlsetup \currentbibxmlnode} % {#1}
+
+\def\currentbibtexformat{apa} % ho wto interface this, maybe split loading and key
+\def\currentbibxmlnode {unset}
+\def\currentbibxmltag {unset}
+
+\startxmlsetups bibtex
+ \xmlregistereddocumentsetups{#1}{}
+ \xmlsetsetup{#1}{bibtex|entry|field}{bibtex:*}
+ \xmlmain{#1}
+\stopxmlsetups
+
+\startxmlsetups bibtex:format
+ \bibtexpublicationsparameter\c!before\relax % prevents lookahead
+ \edef\currentbibxmlnode {#1}
+ \edef\currentbibxmltag {\xmlatt{#1}{tag}}
+ \edef\currentbibxmlcategory{\xmlatt{#1}{category}}
+ \ifconditional\tracebibtexformat
+ \tracedbibxmlintro\currentbibxmltag
+ \tracedbibxmlintro\currentbibxmlcategory
+ \fi
+ \ignorespaces
+ \xmlcommand{#1}{.}{bibtex:\currentbibtexformat:\currentbibxmlcategory}
+ \removeunwantedspaces
+ \bibtexpublicationsparameter\c!after\relax % prevents lookahead
+\stopxmlsetups
+
+\startxmlsetups bibtex:list
+ \xmlfilter{#1}{/bibtex/entry/command(bibtex:format)}
+\stopxmlsetups
+
+\startxmlsetups bibtex:bibtex
+ \xmlfilter{#1}{/entry/command(bibtex:format)}
+\stopxmlsetups
+
+% formatters
+
+\let\normalbibxmlflush\bibxmlflush
+
+\definecolor[bibtextracecolor:field] [darkred]
+\definecolor[bibtextracecolor:crossref][darkblue]
+\definecolor[bibtextracecolor:key] [darkgreen]
+
+\def\tracedbibxmlintro #1{{\tttf#1 -> }}
+\def\tracedbibxmlflush #1{\color[bibtextracecolor:field] {\tttf[#1]}}
+\def\tracedbibxmltexts #1{\color[bibtextracecolor:field] {\tttf<#1>}}
+\def\tracedbibxmlcrossref#1{\color[bibtextracecolor:crossref]{\tttf#1}}
+\def\tracedbibxmlkey #1{\color[bibtextracecolor:key] {\tttf#1}}
+
+\def\tracedbibxmltext
+ {\ifconditional\tracebibtexformat
+ \expandafter\tracedbibxmltexts % plural
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\bibxmlflush
+ {\ifconditional\tracebibtexformat
+ \expandafter\tracedbibxmlflush
+ \else
+ \expandafter\normalbibxmlflush
+ \fi}
+
+\startxmlsetups bibtex:format:crossref
+ \ifconditional\tracebibtexformat
+ \tracedbibxmlcrossref{\xmlfirst\currentbibxmlnode{/field[@name='crossref']/lower()}}
+ \else
+ \cite[\xmlfirst\currentbibxmlnode{/field[@name='crossref']/lower()}]
+ \fi
+\stopxmlsetups
+
+\startxmlsetups bibtex:format:key
+ \ifconditional\tracebibtexformat
+ \tracedbibxmlkey{\normalbibxmlflush{key}}
+ \else
+ \bibxmlflush{key}
+ \fi
+\stopxmlsetups
+
+\startxmlsetups bibtex:format:common:author
+ \ifconditional\tracebibtexformat
+ \bibxmlflush\currentbibtexvariant
+ \else
+ \xmlfilter{#1}{/field[@name='\currentbibtexvariant']/bibtexconcat('\currentbibtexvariant')}
+ \fi
+\stopxmlsetups
+
+\startxmlsetups bibtex:format:author
+ \begingroup
+ \def\currentbibtexvariant{author}
+ \xmlsetup{#1}{bibtex:format:common:author}
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups bibtex:format:artauthor
+ \begingroup
+ \def\currentbibtexvariant{artauthor}
+ \xmlsetup{#1}{bibtex:format:common:author}
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups bibtex:format:editor
+ \begingroup
+ \def\currentbibtexvariant{editor}
+ \xmlsetup{#1}{bibtex:format:common:author}
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups bibtex:format:doi
+% \bibdoifelse{\@@pb@doi}{#1\expanded{\bibgotoDOI{\@@pb@thekey}{\@@pb@doi}}#2}{#3}
+ *doi*
+\stopxmlsetups
+
+
+\startxmlsetups bibtex:format:doi
+% \bibdoifelse{\@@pb@biburl}{#1\expanded{\bibgotoURL{\@@pb@thekey}{\@@pb@biburl}}#2}{#3}
+ *url*
+\stopxmlsetups
+
+\startxmlsetups bibtex:format:month
+% {\bibdoifelse\@@pb@month
+% {#1\doifnumberelse\@@pb@month
+% {\doifconversiondefinedelse\@@pbmonthconversion
+% {\convertnumber\@@pbmonthconversion\@@pb@month}{\@@pb@month}}%
+% {\@@pb@month}#2}%
+% {#3}
+ *month*
+\stopxmlsetups
+
+% lists
+
+\def\bibtexlistprocessor
+ {\ctxlua{bibtex.hacks.add(structure.lists.uservalue("\currentlist",\currentlistindex,"bibref"),\currentlistindex)}}
+
+\appendtoks
+ \definelist[\currentbibtexsession]%
+ \setuplist[\currentbibtexsession][\c!state=\v!start,\c!width=]%
+ \installstructurelistprocessor{\currentbibtexsession:userdata}{\bibtexlistprocessor}%
+\to \everydefinebibtexsession
+
+% \def\installbibtexsorter#1#2%
+% {\setvalue{\??pb:\c!sort:#1}{#2}}
+
+% \installbibtexsorter\v!no {no}
+% \installbibtexsorter\v!author {au}
+% \installbibtexsorter\v!title {ti}
+% \installbibtexsorter\v!short {ab}
+% \installbibtexsorter\empty {no}
+% \installbibtexsorter\s!default{no}
+
+% \setupbibtex
+% [\c!sorttype=\v!cite,
+% \c!sort=no]
+
+% \long\unexpanded\def\startpublication#1\stoppublication
+% {\blank
+% todo
+% \blank}
+
+% \let\stoppublication\relax
+
+\unexpanded\def\bibtexspace {\removeunwantedspaces\space}
+\unexpanded\def\bibtexperiod {\removeunwantedspaces.\space}
+\unexpanded\def\bibtexcomma {\removeunwantedspaces,\space}
+\unexpanded\def\bibtexlparent {\removeunwantedspaces\space(}
+\unexpanded\def\bibtexrparent {\removeunwantedspaces)\space}
+\unexpanded\def\bibtexlbracket{\removeunwantedspaces\space[}
+\unexpanded\def\bibtexrbracket{\removeunwantedspaces]\space}
+
+% interfacing
+
+% todo : lang en language
+% todo : directions
+
+
+% variables
+
+\newcount\bibtexblock \bibtexblock\plusone
+
+\newtoks \everysetupbibtexpublications
+\newtoks \everysetupbibtexcitations
+\newcount\bibtexcounter
+
+\def\bibtexrefprefix{\number\bibtexblock:}
+
+\let\currentbibtexsession\s!default
+\let\currentbibtexvariant\s!default
+
+% parameters: session+variant variant session shared
+
+\def\bibtexpublicationsparameter#1%
+ {\csname
+ \ifcsname\??pb\currentbibtexsession:\currentbibtexvariant#1\endcsname
+ \??pb\currentbibtexsession:\currentbibtexvariant#1%
+ \else\ifcsname\??pb:\currentbibtexvariant#1\endcsname
+ \??pb:\currentbibtexvariant#1%
+ \else\ifcsname\??pb\currentbibtexsession#1\endcsname
+ \??pb\currentbibtexsession#1%
+ \else\ifcsname\??pb#1\endcsname
+ \??pb#1%
+ \else
+ \s!empty
+ \fi\fi\fi\fi
+ \endcsname}
+
+\def\bibtexcitationparameter#1%
+ {\csname
+ \ifcsname\??pv\currentbibtexsession:\currentbibtexvariant#1\endcsname
+ \??pv\currentbibtexsession:\currentbibtexvariant#1%
+ \else\ifcsname\??pv:\currentbibtexvariant#1\endcsname
+ \??pv:\currentbibtexvariant#1%
+ \else\ifcsname\??pv\currentbibtexsession#1\endcsname
+ \??pv\currentbibtexsession#1%
+ \else\ifcsname\??pv#1\endcsname
+ \??pv#1%
+ \else
+ \s!empty
+ \fi\fi\fi\fi
+ \endcsname}
+
+% setup commands
+
+\unexpanded\def\setupbibtexpublications
+ {\let\currentpublicationclass\??pb
+ \let\everysetupbibtexwhatever\everysetupbibtexpublications
+ \dodoubleargument\dosetupbibtexwhatever}
+
+\unexpanded\def\setupbibtexcitations
+ {\let\currentpublicationclass\??pv
+ \let\everysetupbibtexwhatever\everysetupbibtexcitations
+ \dodoubleargument\dosetupbibtexwhatever}
+
+\unexpanded\def\setupbibtexpublicationvariants
+ {\let\currentpublicationclass\??pb
+ \let\everysetupbibtexwhatever\everysetupbibtexpublications
+ \dotripleargument\dosetupbibtexwhatevervariant}
+
+\unexpanded\def\setupbibtexcitationvariants
+ {\let\currentpublicationclass\??pv
+ \let\everysetupbibtexwhatever\everysetupbibtexcitations
+ \dotripleargument\dosetupbibtexwhatevervariant}
+
+\def\dosetupbibtexwhatever[#1][#2]% [sessionlist] [setup]
+ {\ifsecondargument
+ % sessions setups
+ \def\dobtxcommand##1{\getparameters[\currentpublicationclass##1][#2]}%
+ \processcommalist[#1]\dobtxcommand
+ \else
+ % setups
+ \getparameters[\currentpublicationclass][#1]%
+ \the\everysetupbibtexwhatever
+ \fi}
+
+\def\dosetupbibtexwhatevervariant[#1][#2][#3]% [sessionlist] [variantlist] [setup]
+ {\ifthirdargument
+ % sessions variants setups
+ \def\dobtxcommand##1%
+ {\def\dodobtxcommand####1{\getparameters[\currentpublicationclass##1:####1][#3]}%
+ \processcommalist[#2]\dodobtxcommand}%
+ \processcommalist[#1]\docbtxommand
+ \else\ifsecondargument
+ % variants setups
+ \def\dobtxcommand##1{\getparameters[\currentpublicationclass:##1][#2]}%
+ \processcommalist[#1]\dobtxcommand
+ \else
+ % setups
+ \getparameters[\currentpublicationclass][#1]%
+ \the\everysetupbibtexwhatever
+ \fi\fi}
+
+% some initializations
+
+\setupbibtexcitationvariants
+ [author,authoryear,authoryears]
+ [\c!namesep={, }]
+
+% loading alternatives (apa etc)
+
+\def\doloadbibtexpublicationalternative
+ {\ifproductionrun
+ \edef\bibtexpublicationsalternative{\@@pbalternative}% parent
+ \ifx\bibtexpublicationsalternative\empty \else
+ \processcommacommand[\bibtexpublicationsalternative]\dodoloadbibtexpublicationalternative
+ \let\@@pbalternative\empty
+ \fi
+ \fi}
+
+\def\dodoloadbibtexpublicationalternative#1%
+ {\doonlyonce{#1}
+ {\readsysfile{bxml-#1.mkiv}
+ {\showmessage\m!publications{6}{bxml-#1}}
+ {\showmessage\m!publications{1}{bxml-#1}}}}
+
+\appendtoks
+ \doloadbibtexpublicationalternative
+\to \everysetupbibtexpublications
+
+\appendtoks
+ \doloadbibtexpublicationalternative
+\to \everyjob
+
+% whatever, should be key
+
+\def\bibtexleftnumber#1{#1\hfill~}
+
+% testing
+
+% \showmessage\m!publications{5}{#1 is unknown}\secondoftwoarguments}
+
+\let\doifbibreferencefoundelse\secondofthreearguments
+
+% lists
+
+\newtoks\everysetupbibtexlistplacement
+
+% this will change as we need it too often .. we will use context.thebibtexnamesep
+
+\appendtoks
+ \ctxlua {bibtex.authors.setsettings {
+ namesep = \!!bs\bibtexpublicationsparameter\c!namesep\!!es,
+ lastnamesep = \!!bs\bibtexpublicationsparameter\c!lastnamesep\!!es,
+ finalnamesep = \!!bs\bibtexpublicationsparameter\c!finalnamesep\!!es,
+ firstnamesep = \!!bs\bibtexpublicationsparameter\c!firstnamesep\!!es,
+ juniorsep = \!!bs\bibtexpublicationsparameter\c!juniorsep\!!es,
+ vonsep = \!!bs\bibtexpublicationsparameter\c!vonsep\!!es,
+ surnamesep = \!!bs\bibtexpublicationsparameter\c!surnamesep\!!es,
+ namesep = \!!bs\bibtexpublicationsparameter\c!namesep\!!es,
+ lastnamesep = \!!bs\bibtexpublicationsparameter\c!lastnamesep\!!es,
+ finalnamesep = \!!bs\bibtexpublicationsparameter\c!finalnamesep\!!es,
+ author = {
+ etallimit = \!!bs\bibtexpublicationsparameter\c!authoretallimit\!!es,
+ etaldisplay = \!!bs\bibtexpublicationsparameter\c!authoretaldisplay\!!es,
+ etaltext = \!!bs\bibtexpublicationsparameter\c!authoretaltext\!!es,
+ },
+ editor = {
+ etallimit = \!!bs\bibtexpublicationsparameter\c!editoretallimit\!!es,
+ etaldisplay = \!!bs\bibtexpublicationsparameter\c!editoretaldisplay\!!es,
+ etaltext = \!!bs\bibtexpublicationsparameter\c!editoretaltext\!!es,
+ },
+ artauthor = {
+ etallimit = \!!bs\bibtexpublicationsparameter\c!artauthoretallimit\!!es,
+ etaldisplay = \!!bs\bibtexpublicationsparameter\c!artauthoretaldisplay\!!es,
+ etaltext = \!!bs\bibtexpublicationsparameter\c!artauthoretaltext\!!es,
+ },
+ } }%
+\to \everysetupbibtexlistplacement
+
+\def\completebibtexpublications{\dodoubleempty\docompletebibtexpublications}
+\unexpanded\def\placebibtexpublications {\dodoubleempty\doplacebibtexpublications}
+
+\def\docompletebibtexpublications[#1][#2]% title might become obsolete, just headtext
+ {\begingroup
+ \edef\currentbibtexsession{#1}%
+ \let\currentlist\currentbibtexsession
+ \setuplist[\currentbibtexsession][\c!criterium=\v!previous,#2]
+ \doifelsenothing{\namedlistparameter\currentbibtexsession\c!title}
+ {\systemsuppliedchapter[\currentbibtexsession]{\headtext{\currentbibtexsession}}}
+ {\normalexpanded{\systemsuppliedchapter[\currentbibtexsession]{\namedlistparameter\currentbibtexsession\c!title}}}%
+ \dodoplacebibtexpublications}
+
+\def\doplacebibtexpublications[#1][#2]%
+ {\begingroup
+ \edef\currentbibtexsession{#1}%
+ \let\currentlist\currentbibtexsession
+ \setuplist[\currentbibtexsession][\c!criterium=\v!previous,#2]%
+ \dodoplacebibtexpublications}
+
+\def\dodoplacebibtexpublications
+ {\determinelistcharacteristics[\currentbibtexsession]%
+ \the\everysetupbibtexlistplacement
+ \forgetall
+ \typesetbibtexlist
+ \endgroup
+ \global\advance\bibtexblock\plusone}
+
+\setvalue{\??pb:\c!numbering:\v!short}#1% todo var s -> short tag
+ {\bibtexlistnumberbox{\bibtexpublicationsparameter\c!numbercommand{\bibtexgetshort\currentpublicationtag}}}
+
+\setvalue{\??pb:\c!numbering:\v!bib}#1% todo var n -> number
+ {\bibtexlistnumberbox{\bibtexpublicationsparameter\c!numbercommand{\bibtexgetnumber\currentpublicationtag}}}
+
+\setvalue{\??pb:\c!numbering:\s!unknown}#1%
+ {\bibtexlistnumberbox{\bibtexpublicationsparameter\c!numbercommand{#1}}}
+
+\def\@@pblimitednumber % name
+ {\csname\??pb:\c!numbering:%
+ \ifcsname\??pb:\c!numbering:\currentbibtexnumbering\endcsname
+ \currentbibtexnumbering
+ \else
+ \s!unknown
+ \fi
+ \endcsname}
+
+\appendtoks
+ \edef\currentbibtexnumbering{\bibtexpublicationsparameter\c!numbering}%
+ \ifx\currentbibtexnumbering\v!no
+ \setuplist[\currentbibtexsession][\c!numbercommand=,\c!symbol=\v!none,\c!textcommand=\outdented]%
+ \else
+ \setuplist[\currentbibtexsession][\c!numbercommand=\@@pblimitednumber]%
+ \fi
+\to \everysetupbibtexlistplacement
+
+\newdimen\bibtexnumberwidth
+
+\def\bibtexlistnumberbox{\hbox \ifcase\bibtexnumberwidth\else to \bibtexnumberwidth\fi}
+
+\appendtoks
+ \doifelse{\bibtexpublicationsparameter\c!autohang}\v!yes
+ {\ifx\currentbibtexnumbering\v!short
+ \setbox\scratchbox\hbox{\bibtexpublicationsparameter\c!numbercommand{\bibtexpublicationsparameter\c!samplesize}}%
+ \else
+ \setbox\scratchbox\hbox{\bibtexpublicationsparameter\c!numbercommand{\ctxlua{tex.write(structure.lists.size())}}}%
+ \fi
+ \bibtexnumberwidth\wd\scratchbox
+ \setuplist[\currentbibtexsession][\c!distance=\zeropoint]}
+ {\doifelsenothing{\bibtexpublicationsparameter\c!width}
+ {\bibtexnumberwidth\zeropoint}
+ {\bibtexnumberwidth\bibtexpublicationsparameter\c!width}}%
+ \setuplist[\currentbibtexsession][\c!width=\bibtexnumberwidth]%
+\to \everysetupbibtexlistplacement
+
+\appendtoks
+ \let\maybeyear\gobbleoneargument
+ \let\noopsort \gobbleoneargument
+\to \everysetupbibtexlistplacement
+
+\appendtoks
+ \doifelse{\bibtexpublicationsparameter\c!maybeyear}\v!off
+ {\let\maybeyear\gobbleoneargument}
+ {\let\maybeyear\firstofoneargument}%
+\to \everysetupbibtexlistplacement
+
+\appendtoks
+ \doifnot{\bibtexpublicationsparameter\c!option}\v!continue
+ {\global\bibtexcounter\zerocount}%
+\to \everysetupbibtexlistplacement
+
+\appendtoks
+ \edef\currentbibtexcriterium{\namedlistparameter\currentbibtexsession\c!criterium}%
+\to \everysetupbibtexlistplacement
+
+\def\typesetbibtexlist
+ {\dobeginoflist
+ \doif{\namedlistparameter\currentbibtexsession\c!criterium}\v!cite
+ {\setuplist[\currentbibtexsession][\c!criterium=\v!here]}%
+ \doifelse{\bibtexpublicationsparameter\c!method}\v!local
+ {\ctxlua{bibtex.hacks.reset(1)}}% function can take method
+ {\ctxlua{bibtex.hacks.reset(2)}}%
+ \placestructurelist
+ {\currentbibtexsession}
+ {\currentbibtexcriterium}
+ {\namedlistparameter\currentbibtexsession\c!number}%
+ \ctxlua{bibtex.hacks.flush("\bibtexpublicationsparameter\c!sorttype")}%
+ \doendoflist}
+
+\unexpanded\def\typesetbibtexpublication#1%
+ {\edef\currentbibtexsessiontag{#1}%
+ \ifx\currentbibtexsessiontag\empty
+ % can't really happen
+ \else\ifx\currentbibtexcriterium\v!all
+ \doplacepublicationindeed
+ \else
+ \ctxlua{bibtex.hacks.doifalreadyplaced("\currentbibtexsessiontag")}
+ \donothing
+ \dotypesetbibtexpublication
+ \fi\fi}
+
+\def\dotypesetbibtexpublication
+ {\doifbibreferencefoundelse\currentbibtexsessiontag
+ {\global\advance\bibtexcounter\plusone
+ \ctxlua{bibtex.hacks.registerplaced("\currentbibtexsessiontag")}%
+ \dodolistelement{\currentbibtexsession}{}{\number\bibtexcounter}{\thebibtexpublicationlistelement}{}{}}
+ {}} % invalid
+
+\def\thebibtexpublicationlistelement
+ {\strut
+ \expanded{\reference[\bibtexrefprefix\currentbibtexsessiontag]{\number\bibtexcounter}}%
+ \dotypesetabibtexpublication\currentbibtexsessiontag
+ \strut}
+
+\def\dotypesetabibtexpublication#1%
+ {\begingroup
+ \ignorespaces
+ \xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='#1']/command(bibtex:format)}%
+ \removeunwantedspaces
+% \ignorespaces
+% \bibalternative{\bibgetvart{#1}}%
+% \removeunwantedspaces
+ \endgroup}
+
+\def\doprocessbibtexentry#1{\typesetbibtexpublication{#1}}
+
+% citations
+
+\unexpanded\def\bibtexcitation[#1]%
+ {\edef\currentbibtexsession{#1}%
+ \strictdoifnextoptionalelse\dobibtexcitation\dobibtexref}
+
+\def\dobibtexref#1%
+ {\dodobibtexcitation[#1][]}
+
+\def\dobibtexcitation[#1]%
+ {\strictdoifnextoptionalelse{\dodobibtexcitation[#1]}{\dodobibtexcitation[#1][]}}
+
+\def\dodobibtexcitation[#1][#2]%
+ {\dontleavehmode
+ \begingroup
+ \doifelsenothing{#2}\secondargumentfalse\secondargumenttrue
+ \ifsecondargument
+ \dowhateverbibtexcitation{#1}{#2}%
+ \else
+ \donumberedbibtexcitation{#1}%
+ \fi
+ \endgroup}
+
+\def\dowhatevercitation#1#2%
+ {\processcommalist[#2]\dobibtexcitationindeed
+ \setupinteraction[\c!style=]% use flag instead
+ \doifassignmentelse{#1}
+ {\getparameters[\??pb\??pb][\c!alternative=,\c!extras=,#1]%
+ \edef\currentbibtexvariant{\@@pb@@pbalternative}%
+ \ifx\currentbibtexvariant\empty
+ \edef\currentbibtexvariant{\bibtexpublicationparameter\c!refcommand}%
+ \fi
+ \ifx\@@pb@@pbextras\empty
+ \setupcite[\currentbibtexvariant][#1]%
+ \else
+ \edef\@@pb@@pbextras{{\@@pb@@pbextras\ifdefined\@@pb@@pbright\@@pb@@pbright\else\bibtexpublicationparameter\c!right\fi}}%
+ \expanded{\setupcite[\currentbibtexvariant][#1,\c!right=\@@pb@@pbextras]}%
+ \fi}%
+ {\def\currentbibtexvariant{#1}}%
+ \getvalue{bibtex\currentbibtexvariant ref}[#2]}
+
+\def\donumberedbibtexcitation#1%
+ {\processcommalist[#1]\dobibtexcitationindeed
+ \setupinteraction[\c!style=]%
+ \edef\currentbibtexvariant{\bibtexcitationparameter\c!refcommand}%
+ \getvalue{bibtex\currentbibtexvariant ref}[#1]}
+
+\def\dobibtexcitationindeed#1%
+ {\iftrialtypesetting \else
+ \expanded{\writedatatolist[\currentbibtexsession][bibref=#1]}%
+ \fi}
+
+\def\nobibtexcitation[#1]%
+ {\processcommalist[#1]\dobibtexcitationindeed}
+
+\def\bibtexnumref[#1]%
+ {\dontleavehmode
+ \begingroup
+ \bibtexcitationparameter\v!left
+ \penalty\!!tenthousand
+ \ctxlua{bibtex.hacks.resolve("","\number\bibtexblock","#1")}%
+ \bibtexcitationparameter\v!right
+ \endgroup}
+
+\def\dowithbibtexnumrefconnector#1#2%
+ {\ifnum#1>\plusone
+ \ifnum#2>\plusone
+ \ifnum#2=#1\relax
+ \bibtexpublicationsparameter\c!lastpubsep
+ \else
+ \bibtexpublicationsparameter\c!pubsep
+ \fi
+ \fi
+ \fi}
+
+\def\dowithbibtexnumref#1#2#3#4#5% n, i, prefix block ref
+ {\dowithbibtexnumrefconnector{#1}{#2}%
+ \def\bibtexrefprefix{#4:}%
+ \inbiblink[#5]}
+
+\def\dowithbibtexnumrefrange#1#2#3#4#5#6#7% n, i, prefix block ref
+ {\dowithbibtexnumrefconnector{#1}{#2}%
+ \def\bibtexrefprefix{#4:}%
+ \inbiblink[#5]%
+ \endash
+ \def\bibtexrefprefix{#6:}%
+ \inbiblink[#7]}
+
+\def\nobibtexnumref#1%
+ {[#1]}
+
+% hm
+
+% \def\@@pbinumbercommand{\executeifdefined{\??pb:\c!numbercommand:\@@pbnumbering}\firstofoneargument}
+
+% \letvalue{\??pb:\c!numbercommand:\v!yes }\firstofoneargument
+% \letvalue{\??pb:\c!numbercommand:\v!no }\gobbleoneargument
+% \setvalue{\??pb:\c!numbercommand:\v!short}{\bibtexgetshort\currentpublicationtag\gobbleoneargument}
+% \setvalue{\??pb:\c!numbercommand:\v!bib }{\bibtexgetnumber\currentpublicationtag\gobbleoneargument}
+
+% \def\bibalternative#1{\csname\??pv\@@currentalternative#1\endcsname}
+
+% basic setup
+
+% parent -> publicationlist
+%
+% \setuplist
+% [\currentbibtexsession]
+% [\c!samplesize={AA99},
+% \c!alternative=a,
+% \c!interaction=,
+% \c!pagenumber=\v!no,
+% #1,
+% \c!command=]
+
+% \setuppublicationlist
+% [\c!title=,
+% \c!command=\dospecialbibinsert,
+% \c!maybeyear=\v!on]
+
+\setupbibtexpublications
+ [\c!monthconversion=,
+ \c!alternative=apa,
+ \c!method=\v!global,
+ \c!refcommand=num,
+ \c!numbercommand=\bibtexleftnumber]
+
+\setupbibtexcitations % command ?
+ [\c!refcommand=num]
+
+% helpers
+
+\def\doifbibtexinteractionelse
+ {\iflocation
+ \edef\temp{\bibtexcitationparameter\c!interaction}%
+ \ifx\temp\v!stop
+ \@EA@EA@EA\secondoftwoarguments
+ \else
+ \@EA@EA@EA\firstoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+% variants
+
+% todo: lastsep here
+
+\newconditional\firstbibtexrefsep
+
+\def\bibtexresetrefsep
+ {\settrue\firstbibtexrefsep}
+
+\def\bibtexinsertrefsep
+ {\ifconditional\firstbibtexrefsep
+ \setfalse\firstbibtexrefsep
+ \else
+ \bibtexcitationparameter\c!pubsep
+ \fi}
+
+\def\inbibtexlink#1#2%
+ {\doifreferencefoundelse{\bibtexrefprefix#1}
+ {\goto{#2}[\bibtexrefprefix#1]}
+ {!#1!\unknownreference{#1}}}
+
+\def\dobibtexgotolink#1#2%
+ {\doifreferencefoundelse{\bibtexrefprefix#1}
+ {\goto{#2}[\bibtexrefprefix#1]}
+ {!#1!\unknownreference{#1}}}
+
+\def\dobibattexlink#1#2%
+ {\doifreferencefoundelse{\bibtexrefprefix#1}
+ {\at{#2}[\bibtexrefprefix#1]}
+ {!#1!\unknownreference{#1}}}
+
+\def\dobibtexurllink#1#2%
+ {\expanded{\useURL[bibtex:url:#1][#2]}%
+ \doifbibtexinteractionelse
+ {\goto{\url[bibtex:url:#1]}[url(bibtex:url:#1)]}
+ {\url[bibtex:url:#1]}}
+
+% todo: style, color
+
+\unexpanded\def\bibtexdataref {\dodoubleargument\dobibtexdataref}
+\unexpanded\def\bibtextyperef {\dodoubleargument\dobibtextyperef}
+\unexpanded\def\bibtexkeyref {\dodoubleargument\dobibtexkeyref}
+\unexpanded\def\bibtexserialref {\dodoubleargument\dobibtexserialref}
+\unexpanded\def\bibtexurlref {\dodoubleargument\dobibtexurlref}
+\unexpanded\def\bibtexdoiref {\dodoubleargument\dobibtexdoiref}
+\unexpanded\def\bibtexpageref {\dodoubleargument\dobibtexpageref}
+\unexpanded\def\bibtexnoneref {\dodoubleargument\dobibtexnoneref}
+\unexpanded\def\bibtexshortref {\dodoubleargument\dobibtexshortref}
+\unexpanded\def\bibtexyearref {\dodoubleargument\dobibtexyearref}
+\unexpanded\def\bibtexauthorref {\dodoubleargument\dobibtexauthorref}
+\unexpanded\def\bibtexauthoryearref {\dodoubleargument\dobibtexauthoryearref}
+\unexpanded\def\bibtexauthoryearsref{\dodoubleargument\dobibtexauthoryearsref}
+
+\def\dobibtexdataref {\doprocessbibtexref\dodobibtexdataref {ref}} % [#1][#2]
+\def\dobibtextyperef {\doprocessbibtexref\dodobibtextyperef {type}} % [#1][#2]
+\def\dobibtexkeyref {\doprocessbibtexref\dodobibtexkeyref {key}} % [#1][#2]
+\def\dobibtexserialref {\doprocessbibtexref\dodobibtexserialref {serial}} % [#1][#2]
+\def\dobibtexurlref {\doprocessbibtexref\dodobibtexurlref {url}} % [#1][#2]
+\def\dobibtexdoiref {\doprocessbibtexref\dodobibtexdoiref {doi}} % [#1][#2]
+\def\dobibtexpageref {\doprocessbibtexref\dodobibtexpageref {page}} % [#1][#2]
+\def\dobibtexnoneref {\doprocessbibtexref\dodobibtexnoneref {none}} % [#1][#2]
+\def\dobibtexshortref {\doprocessbibtexref\dodobibtexshortref {short}} % [#1][#2]
+\def\dobibtexyearref {\doprocessbibtexref\dodobibtexyearref {year}} % [#1][#2]
+\def\dobibtexauthorref {\doprocessbibtexref\dodobibtexauthorref {author}} % [#1][#2]
+\def\dobibtexauthoryearref {\doprocessbibtexref\dodobibtexauthoryearref {authoryear}} % [#1][#2]
+\def\dobibtexauthoryearsref{\doprocessbibtexref\dodobibtexauthoryearsref{authoryears}} % [#1][#2]
+
+\def\doprocessbibtexref#1#2[#3][#4]%
+ {\edef\currentbibtexsession{#3}%
+ \edef\currentbibtexvariant{#2}%
+ \def\dodoprocessbibtexref##1%
+ {% test for existence
+ \edef\currentbibtextag{##1}%
+ \bibtexinsertrefsep
+ #1{##1}}%
+ \bibtexresetrefsep
+ \bibtexcitationparameter\v!left
+ \processcommalist[#4]\dodoprocessbibtexref\relax
+ \bibtexcitationparameter\v!right}
+
+\def\dodobibtexdataref#1%
+ {\dotypesetabibtexpublication{#1}}
+
+\def\dodobibtextyperef#1%
+ {\edef\bibtexrefcontent{\xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='#1']/attribute('category')}}%
+ \bibtexrefcontent}
+
+\def\dodobibtexkeyref#1%
+ {\edef\bibtexrefcontent{\xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='key']/context()}}%
+ \dobibtexgotolink{#1}{\bibtexrefcontent}}
+
+\def\dodobibtexserialref#1%
+ {\edef\bibtexrefcontent{\xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='#1']/match()}}%
+ \dobibtexgotolink{#1}{\bibtexrefcontent}}
+
+\def\dodobibtexurlref#1%
+ {\edef\bibtexrefcontent{\xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='#1']/field[@name='url']/context()}}%
+ \dobibtexurllink{#1}{\bibtexrefcontent}}
+
+\def\dodobibtexdoiref#1%
+ {\edef\bibtexrefcontent{\xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='#1']/field[@name='doi']/context()}}%
+ \dobibtexurllink{#1}{http://dx.doi.org/\bibtexrefcontent}}
+
+\def\dodobibtexpageref#1%
+ {\dobibtexatlink{#1}{}} % second argument can become 'page'
+
+\def\dodobibtexnoneref#1%
+ {}
+
+\def\dodobibtexshortref#1%
+ {\edef\bibtexrefcontent{\xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='#1']/bibtexshort()}}%
+ \dobibtexgotolink{#1}{\bibtexrefcontent}}
+
+\def\dodobibtexyearref#1%
+ {\edef\bibtexrefcontent{\xmlfilter{bibtex:\currentbibtexsession}{/bibtex/entry[@tag='#1']/field[@name='year']/context()}}%
+ \bibtexrefcontent}
+
+% \def\bibmaybeinteractive#1#2%
+% {\doifelsevalue{@@pv\@@currentalternative\c!compress}
+% {\ifbibinteractionelse{\gotobiblink{#2}[#1]}{#2}}
+% {#2}}
+
+% \def\bibauthornumref[#1]%
+% {\getcommalistsize[#1]%
+% \global\bibitemcounter\commalistsize
+% \bibresetrefsep
+% \processcommalist[#1]\dobibauthornumref }
+%
+% \def\dobibauthornumref#1%
+% {\bibinsertrefsep
+% \doifbibreferencefoundelse{#1}
+% {\begingroup
+% \bibgetvara{#1}%
+% \bibalternative\c!inbetween
+% \setuppublications[\c!refcommand=num]%
+% \cite[#1]%
+% \endgroup}
+% {\unknownreference{#1}}}
+
+% compress years
+% andtext namesep
+% otherstext authoretallimit
+
+% we will use context.* instead at the lua end because it saves us passing settings
+
+% \def\thebibtexpubsep {\bibtexpublicationsparameter\c!pubsep}
+% \def\thebibtexlastpubsep {\bibtexpublicationsparameter\c!lastpubsep}
+% \def\thebibtexfinalpubseparator{\bibtexpublicationsparameter\c!lastpubsep}
+
+\def\dodobibtexauthorref #1{\ctxlua{bibtex.authorref ("bibtex:\currentbibtexsession","#1","normal","author")}}
+\def\dodobibtexauthoryearref #1{\ctxlua{bibtex.authoryearref ("bibtex:\currentbibtexsession","#1","normal","author")}}
+\def\dodobibtexauthoryearsref#1{\ctxlua{bibtex.authoryearsref("bibtex:\currentbibtexsession","#1","normal","author")}}
+
+\unexpanded\def\bibtexsingularplural#1#2{\ctxlua{bibtex.singular_or_plural(\!!bs#1\!!es,\!!bs#2\!!es)}}
+
+\protect \endinput
+
diff --git a/tex/context/base/bibl-tra.lua b/tex/context/base/bibl-tra.lua
new file mode 100644
index 000000000..442231028
--- /dev/null
+++ b/tex/context/base/bibl-tra.lua
@@ -0,0 +1,194 @@
+if not modules then modules = { } end modules ['bibl-bib'] = {
+ 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"
+}
+
+bibtex = bibtex or { }
+bibtex.hacks = bibtex.hacks or { }
+
+local match, gmatch, format, concat, sort = string.match, string.gmatch, string.format, table.concat, table.sort
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local variables, constants = interfaces.variables, interfaces.constants
+
+local trace_bibtex = false trackers.register("publications.bibtex", function(v) trace_bibtex = v end)
+
+local hacks = bibtex.hacks
+
+local list, done, alldone, used, registered, ordered = { }, { }, { }, { }, { }, { }
+local mode = 0
+
+local template = string.striplong([[
+ \citation{*}
+ \bibstyle{cont-%s}
+ \bibdata{%s}
+]])
+
+function hacks.process(settings)
+ local style = settings.style or ""
+ local database = settings.database or ""
+ local jobname = tex.jobname
+ if database ~= "" then
+ interfaces.showmessage("publications",3)
+ io.savedata(file.addsuffix(jobname,"aux"),format(template,style,database))
+ if trace_bibtex then
+ logs.report("publications","processing bibtex file '%s'",jobname)
+ end
+ os.execute(format("bibtex %s",jobname))
+ -- purge 'm
+ end
+end
+
+function hacks.register(str)
+ if trace_bibtex then
+ logs.report("publications","registering bibtex entry '%s'",str)
+ end
+ registered[#registered+1] = str
+ ordered[str] = #registered
+end
+
+function hacks.reset(m)
+ mode, list, done = m, { }, { }
+end
+
+function hacks.add(str,listindex)
+ if not str or mode == 0 then
+ -- skip
+ elseif mode == 1 then
+ -- all locals but no duplicates
+ local sc = structure.sections.currentid()
+ if done[str] ~= sc then
+ done[str], alldone[str] = sc, true
+ list[#list+1] = { str, listindex }
+ end
+ elseif mode == 2 then
+ -- all locals but no preceding
+ local sc = structure.sections.currentid()
+ if not alldone[str] and done[str] ~= sc then
+ done[str], alldone[str] = sc, true
+ list[#list+1] = { str, listindex }
+ end
+ end
+end
+
+local function compare(a,b)
+ local aa, bb = a[1], b[1]
+ if aa and bb then
+ return ordered[aa] < ordered[bb]
+ else
+ return true
+ end
+end
+
+function hacks.flush(sortvariant)
+ if sortvariant == "" or sortvariant == variables.cite or sortvariant == "default" then
+ -- order is cite order i.e. same as list
+ else
+ sort(list,compare)
+ end
+ for i=1,#list do
+ context.doprocessbibtexentry(list[i][1])
+ end
+end
+
+function hacks.registerplaced(str)
+ used[str] = true
+end
+
+function hacks.doifalreadyplaced(str)
+ commands.testcase(used[str])
+end
+
+-- we ask for <n>:tag but when we can't find it we go back
+-- to look for previous definitions, and when not found again
+-- we look forward
+
+local function compare(a,b)
+ return a[3] < b[3]
+end
+
+function hacks.resolve(prefix,block,reference) -- maybe already feed it split
+ local subset = jobreferences.collected[prefix or ""] or jobreferences.collected[""]
+ if subset then
+ local result, done = { }, { }
+ block = tonumber(block)
+ for rest in gmatch(reference,"([^,%s]+)") do
+ local blk, tag, found = block, nil, nil
+ if block then
+ tag = blk .. ":" .. rest
+ found = subset[tag]
+ if not found then
+ for i=block-1,1,-1 do
+ tag = i .. ":" .. rest
+ found = subset[tag]
+ if found then
+ blk = i
+ break
+ end
+ end
+ end
+ end
+ if not found then
+ blk = "*"
+ tag = blk .. ":" .. rest
+ found = subset[tag]
+ end
+ if found then
+ local current = found.entries and found.entries.text
+ if current and not done[current] then
+ result[#result+1] = { blk, rest, current }
+ done[current] = true
+ end
+ end
+ end
+ -- todo: ranges so the interface will change
+ sort(result,compare)
+ local first, last, firsti, lasti, firstr, lastr
+ local collected = { }
+ for i=1,#result do
+ local r = result[i]
+ local current = r[3]
+ if not first then
+ first, last, firsti, lasti, firstr, lastr = current, current, i, i, r, r
+ elseif current == last + 1 then
+ last, lasti, lastr = current, i, r
+ else
+ if last > first + 1 then
+ collected[#collected+1] = { firstr[1], firstr[2], lastr[1], lastr[2] }
+ else
+ collected[#collected+1] = { firstr[1], firstr[2] }
+ if last > first then
+ collected[#collected+1] = { lastr[1], lastr[2] }
+ end
+ end
+ first, last, firsti, lasti, firstr, lastr = current, current, i, i, r, r
+ end
+ end
+ if first then
+ if last > first + 1 then
+ collected[#collected+1] = { firstr[1], firstr[2], lastr[1], lastr[2] }
+ else
+ collected[#collected+1] = { firstr[1], firstr[2] }
+ if last > first then
+ collected[#collected+1] = { lastr[1], lastr[2] }
+ end
+ end
+ end
+ if #collected > 0 then
+ for i=1,#collected do
+ local c = collected[i]
+ if c[3] then
+ context.dowithbibtexnumrefrange(#collected,i,prefix,c[1],c[2],c[3],c[4])
+ else
+ context.dowithbibtexnumref(#collected,i,prefix,c[1],c[2])
+ end
+ end
+ else
+ context.nobibtexnumref("error 1")
+ end
+ else
+ context.nobibtexnumref("error 2")
+ end
+end
diff --git a/tex/context/base/bibl-tra.mkii b/tex/context/base/bibl-tra.mkii
new file mode 100644
index 000000000..087781db9
--- /dev/null
+++ b/tex/context/base/bibl-tra.mkii
@@ -0,0 +1,1778 @@
+%D \module
+%D [ file=bibl-tra,
+%D version=2009.08.13,
+%D title=\CONTEXT\ Publication Module,
+%D subtitle=Publications,
+%D author=Taco Hoekwater,
+%D date=\currentdate,
+%D copyright=Public Domain]
+%C
+%C Donated to the public domain.
+
+%D This used to be module \type {t-bib} but due to the number of differences
+%D in handling structure between \MKII\ and \MKIV\ we now have \BIBTEX\ support
+%D in the kernel. The only patches concerns some namespace issues. Also,
+%D constants and variables are now predefined. When the \MKIV\ code is well
+%D tested I might backport a couple of adaptions to this \MKII\ variant.
+
+\writestatus{loading}{ConTeXt Bibliography Support / BibTeX}
+
+\definefilesynonym[bib][obsolete]
+
+% here starts t-bib.tex
+
+%D The original was developed independantly by Taco Hoekwater while still working for Kluwer
+%D Academic publishers (it still used the dutch interface then). Development continued after
+%D he left Kluwer, and in Januari 2005, the then already internationalized file was merged
+%D with the core distribution by Hans Hagen. The current version is once again by Taco.
+%D
+%D More documentation and additional resources can be found on the contextgarden:
+%D \hyphenatedurl{http://wiki.contextgarden.net//Bibliography}.
+
+%D \subject{DONE (dd/mm/yyyy)}
+%D
+%D \startitemize
+%D \item add author definition (and associated system variable) (26/05/2005)
+%D \item add finalnamesep support for Oxford comma (17/09/2005)
+%D \item add \type{\insert...} for: doi, eprint, howpublished (19/09/2005)
+%D \item allow a defaulted \type{\setupcite} (19/11/2005)
+%D \item renamed citation type 'number' to 'serial' (19/11/2005)
+%D \item better definition of \type{\inverted...author} (19/11/2005)
+%D \item don't reset [numbercommand] in \type {\setuppublication} by default (20/11/2005)
+%D \item don't disable other \type {\setuppublication} keys if alternative is present (20/11/2005)
+%D \item drop \type{\sanitizeaccents} (20/11/2005)
+%D \item added \type{\nocite} and \type{\cite[none]} (21/11/2005)
+%D \item added headtext for it (23/11/2005)
+%D \item make \type{\cite[url]} and \type{\cite[doi]} interactive (23/11/2005)
+%D \item make right-aligned labels in the list work even when autohang=no
+%D \item use 'et al.' instead of 'et.al.'. Pointed out by Peter M�nster (30/12/2005)
+%D \item added headtext for cz (31/12/2005)
+%D \item Keep whitespace after \type{\cite} with single argument (31/12/2005)
+%D \item Fix broken \type{\cite{}} support (31/12/2005)
+%D \item Use \type{\readfile} inside \type{\usepublications} instead of \type{\readsysfile} (12/01/2006)
+%D \item Use \type{\currentbibyear} and \type{\currentbibauthor} instead of \type{\YR} and \type{\AU} (05/02/2006)
+%D \item Fix compressed version of authoryear style (05/02/2006)
+%D \item Rename the clashing data fields \type{\url} and \type{\type} to \type{\biburl} and \type{\bibtype} (05/02/2006)
+%D \item Added two french bibl files from Renaud Aubin (06/02/2006)
+%D \item Five new bib class and eight extra bib fields, for IEEEtran (07/02/2006)
+%D \item French keyword translation, provided by Renaud (08/02/2006)
+%D \item fix underscores in undefined keys (22/02/2006)
+%D \item Destroy interactivity in labels of the publication list (13/03/2006)
+%D \item fix multi-cite list compression (11/4/2006)
+%D \item fix \type{\getcitedata} (11/4/2006)
+%D \item magic for chapter bibs (18-25/4/2006)
+%D \item language setting (25/4/2006)
+%D \item use \type{\hyphenatedurl} for \type{\inserturl} (25/4/2006)
+%D \item Add \type{\docitation} to \type{\nocite}(26/4/2006)
+%D \item patents can have numbers, added to bst files (26/4/2006)
+%D \item \type{\docitation} needs a \type{\iftrialtypesetting} (27/4/2006)
+%D \item \type{\filllocalpublist}'s loop is bound by definedness, not resolvedness (27/4/2006)
+%D \item \type{\setuppublications[monthconversion=]} added (15/5/2006)
+%D \item use \type{\undefinedreference} instead of bare question marks (15/5/2006)
+%D \item add grouping around \type{\placepublications} commands (16/5/2006)
+%D \item fix a bug in \type{\cite{<item>}} (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 (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)]}
+%D \item fix the item number in the publication list with 'numbering=yes' (22/6/2006)
+%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 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
+%D in \type{left} stay in effect (12/7/2006)
+%D \item guard added against loading bbl files multiple times (13/7/2006)
+%D \item fix \type{\cite[num]} with compression is on. (14/7/2006)
+%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 saveguarding the list item extraction and reference placement
+%D code (19/7/2006)
+%D \item support \type{\setuppublicationlist[title=\chapter]} (4/8/2006)
+%D \item use the expansion of \type{\headtext{pubs}} (4/8/2006)
+%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 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 used due to a volatile \type{\commalistsize} (25/8/2006).
+%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)
+%D \item Added \type{\setuppublicationlist[maybeyear=off]} by request from
+%D Thomas Schmitz (15/9/2006)
+%D \item Removed some spurious spaces pointed out by willi egger (19/9/2006)
+%D \item Add configuration of bibtex executable name (4/11/2006)
+%D \item Fix numbering=short and numbering=bib (spotted by Matthias W�chter) (4/11/2006)
+%D \item third attempt to get a correct release (5/11/2006)
+%D \item fix a few missing dots in bibl-num.tex (7/12/2006)
+%D \item Patch for DOI's by Tobias Burnus (17/4/2007)
+%D \item Patch for \type{\insertbiburl} and \type{\insertdoi} for Tobias Burnus (18/4/2007)
+%D \item Added a missing \type{\relax} in \type{\dospecialbibinsert},
+%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 \item Multilingual setups needed another fix (27/10/2008)
+%D \item Two fixes for bibl-apa by Michael Green (27/10/2008)
+%D \item Catalan translation of 'References' (10/11/2008)
+%D \item 'chapter' -> 'chapitre' in bibl-apa-fr (27/11/2008)
+%D \item Run bibtex via os.execute in mkiv modee (01/12/2008)
+%D \item Small correction in bibl-apa's placement of volume
+%D information in articles (05/01/2009)
+%D \item Handle multi-author (more than two) cases in \type{\cite}
+%D (02/03/2009)
+%D \item Suppress a syntax error in \type{cont-xp} mode. The output is
+%D probably not right, though (02/03/2009)
+%D \item Added a \tex{loadmarkfile} at the end, and two new files
+%D from Hans. The \type{t-bib.mkiv} is needed to make the module
+%D work with the new structure code (17/04/2009)
+%D \item Added a patch to \type{t-bib.mkiv} from Hans to make the
+%D cross referencing between multiple citations an
+%D bibliographies work (27/04/2009)
+%D \item Remove a superfluous \type{\unprotect} in t-bib.mkiv (11/05/2009).
+%D \item Patch of incollection in bibl-ams.tex from Xan (08/06/2009).
+%D \item Patch of unpublished in bibl-ams.tex from Xan (22/07/2009).
+%D \item Modified \type{\bibdogetupsometextprefix} so it works for undefined
+%D language labels, from Hans (13/08/2009).
+%D \item Removed some \MKIV\ hacks as well as some things that are in the
+%D core like variables, constants and messages (HH:22/08/2009).
+%D \item Added \type{bib} in front of \type {insert} macros and initialize
+%D then later on (HH:22/08/2009).
+%D \item Removed test for type {\currentlocationreference} plus associated
+%D code (HH:22/08/2009).
+%D \stopitemize
+%D
+%D \subject{WISHLIST}
+%D
+%D \startitemize
+%D \item link back from publication list to citation
+%D \item export \type {\citation{<cited item>}}
+%D \item support mlbibtex
+%D \item don't load the whole lot, but filter entries instead
+%D \stopitemize
+
+\unprotect
+
+%D Variables, constants and messages are removed as they are now in the
+%D multilingual interface modules.
+
+\def\biblistname{pubs} % for compatibility
+
+%D how to load the references. There is some new stuff here
+%D to support Idris' (incorrect :-)) use of projects
+
+% \let\preloadbiblist\relax
+%
+% \ifx\currentcomponent\v!text
+% % single file
+% \edef\temp{\the\everystarttext}%
+% \ifx\temp\empty
+% % post-starttext
+% \def\preloadbiblist{\dousepublications\jobname }%
+% \else
+% % pre-starttext
+% \appendtoks \dousepublications\jobname \to \everystarttext
+% \fi
+% %
+% \else \ifx\currentcomponent\v!project
+% % a project file, have to set up the partial products!
+% \def\startproduct #1 %
+% {\doateverystarttext
+% \dousepublications{#1}%
+% \donextlevel\v!product\currentproduct
+% \doexecutefileonce\doexecutefileonce
+% \donotexecutefile\doexecutefile#1\\}%
+% %
+% \else \ifx\currentcomponent\v!product
+% % a product file
+% \def\preloadbiblist{\dousepublications\jobname }%
+% %
+% \else
+% % a component? not sure what to do
+% \def\preloadbiblist{\dousepublications\jobname }%
+% %
+% \fi \fi \fi
+
+\def\preloadbiblist
+ {\globallet\preloadbiblist\relax
+ \dousepublications\jobname}
+
+\definelist[pubs]
+\setuplist[pubs][\c!width=]
+
+%D \macros{bibdoif,bibdoifnot,bibdoifelse}
+%D
+%D Here are a few small helpers that are used a lot
+%D in all the typesetting commands
+%D (\type{\insert...}) we will encounter later.
+
+\long\def\bibdoifelse#1%
+ {\@EA\def\@EA\!!stringa\@EA{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\long\def\bibdoifnot#1%
+ {\@EA\def\@EA\!!stringa\@EA{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\bibdoif#1%
+ {\@EA\def\@EA\!!stringa\@EA{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D Bibtex settings separated out
+
+%D No point in writing the aux file if there is no database...
+
+\def\setupbibtex{\dosingleempty\dosetupbibtex}
+
+\def\dosetupbibtex[#1]%
+ {\let\@@pbdatabase\empty
+ \getparameters[\??pb][\c!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{\@@pbsort}]%
+ \ifx\@@pbdatabase\empty\else \writeauxfile \fi}
+
+\dosetupbibtex[bibtex=bibtex]
+
+%D \macros{writeauxfile}
+%D
+%D Unfortunately, \BIBTEX\ is not the best configurable program
+%D around. The names of the commands it parses as well as the \type{.aux}
+%D extension to the file name are both hardwired.
+%D
+%D This means \CONTEXT\ has to write a \LATEX-style auxiliary file, yuk!
+%D The good news is that it can be rather short. We'll just ask
+%D \BIBTEX\ to output the entire database(s) into the \type{bbl} file.
+%D
+%D The \type{\bibstyle} command controls how the \type{bbl} file will
+%D be sorted. The possibilities are:
+%D
+%D \startitemize[packed]
+%D \item by author (+year, title): cont-au.bst
+%D \item by title (+author, year): cont-ti.bst
+%D \item by short key as in abbrev.bst: cont-ab.bst
+%D \item not sorted at all: cont-no.bst
+%D \stopitemize
+
+\def\writeauxfile
+ {\doifmode{*\v!first}
+ {\openout \scratchwrite \jobname.aux
+ \write \scratchwrite {\string\citation{*}}%
+ \write \scratchwrite {\string\bibstyle{\bibstyle}}%
+ \write \scratchwrite {\string\bibdata{\@@pbdatabase}}%
+ \closeout\scratchwrite
+ \showmessage\m!publications{3}{}%
+ \expanded{\installprogram{\@@pbbibtex\space\jobname}}}}
+
+%D \macros{ifsortbycite,iftypesetall,ifautohang,ifbibcitecompress}
+%D
+%D The module needs some new \type{\if} statements.
+
+%D Default sort order of the reference list is by citation.
+
+\newif\ifsortbycite \sortbycitetrue
+
+%D By default, only referenced publications are typeset
+
+\newif\iftypesetall \typesetallfalse
+
+%D Hanging indentation of the publication list
+%D will not adjust itself according to the width of the label.
+
+\newif\ifautohang \autohangfalse
+
+%D Cite lists are compressed, if possible.
+
+\newif\ifbibcitecompress \bibcitecompresstrue
+
+\def\setuppublications
+ {\dosingleargument\dosetuppublications}
+
+\def\bibleftnumber#1%
+ {#1\hfill~}
+
+\def\dosetuppublications[#1]%
+ {\getparameters
+ [\??pb]
+ [\c!alternative=,#1]%
+ \doifsomething\@@pbalternative
+ {\readsysfile
+ {bibl-\@@pbalternative.tex}
+ {\showmessage\m!publications{6}{bibl-\@@pbalternative}\let\@@pbalternative\empty}
+ {\showmessage\m!publications{1}{bibl-\@@pbalternative}\let\@@pbalternative\empty}}%
+ \getparameters
+ [\??pb]
+ [#1]%
+ \processaction
+ [\@@pbcriterium]
+ [ \v!all=>\typesetalltrue,
+ \s!unknown=>\typesetallfalse]%
+ \processaction
+ [\@@pbautohang]
+ [ \v!yes=>\autohangtrue,
+ \s!unknown=>\autohangfalse]%
+ \processaction
+ [\@@pbsorttype]
+ [ \v!cite=>\sortbycitetrue,
+ \v!bbl=>\sortbycitefalse,
+ \s!default=>\sortbycitetrue,
+ \s!unknown=>\sortbycitefalse]%
+ \processaction
+ [\@@pbnumbering]
+ [ \v!yes=>\let\@@pbinumbercommand\firstofoneargument,
+ \v!no=>\let\@@pbinumbercommand\gobbleoneargument,
+ \v!short=>\def\@@pbinumbercommand##1{\getvalue{pbds-\@@pbk}},
+ \v!bib=>\def\@@pbinumbercommand##1{\getvalue{pbdn-\@@pbk}},
+ \s!unknown=>\let\@@pbinumbercommand\firstofoneargument]%
+ \processaction
+ [\@@pbrefcommand]
+ [\s!default=>\edef\@@citedefault{\@@pbrefcommand},
+ \s!unknown=>\edef\@@citedefault{\@@pbrefcommand}]}
+
+% initialize
+
+\def\@@pbrefcommand{num}
+\def\@@pbnumbercommand{\bibleftnumber}
+
+%D \macros{usepublications}
+%D
+%D We need \type{\usereferences} so that it is possible to
+%D refer to page and/or appearance number for publications
+%D in the other document.
+
+\def\usepublications[#1]%
+ {\usereferences[#1]\processcommalist[#1]\dousepublications}
+
+\def\dousepublications#1%
+ {\doonlyonce
+ {#1.\f!bibextension}
+ {\readfile{#1.\f!bibextension}
+ {\showmessage\m!publications{4}{#1.\f!bibextension}}
+ {\showmessage\m!publications{2}{#1.\f!bibextension}}}}
+
+%D \macros{setuppublicationlist}
+%D
+%D This will be the first command in (\BIBTEX-generated) \type{bbl}
+%D files. `samplesize' is a sample value (in case of \BIBTEX-generated
+%D files, this will be the longest `short' key). `totalnumber'
+%D is the total number of entries that will follow in this
+%D file.
+
+%D Both values are only needed for the label calculation
+%D if `autohang' is `true', so by default the command is
+%D not even needed, and therefore I saw no need to give
+%D it it's own system variable and it just re-uses \type{pb}.
+
+\def\setuppublicationlist
+ {\dosingleempty\dosetuppublicationlist}
+
+\def\dosetuppublicationlist[#1]%
+ {\getparameters[\??pv data][#1]%
+ \setuplist
+ [pubs]
+ [\c!samplesize={AA99},\c!totalnumber={99},
+ \c!alternative=a,\c!interaction=,\c!pagenumber=\v!no,#1]}
+
+\def\setuppublicationlayout[#1]#2%
+ {\setvalue{\??pv data#1}{#2\unskip}}
+
+%D \macros{bibalternative}
+%D
+%D A nice little shorthand that will be used so we don't have to
+%D key in the weird \type{\@@pv} parameter names all the time.
+
+\def\bibalternative#1%
+ {\getvalue{\??pv\@@currentalternative#1}}
+
+%D \macros{simplebibdef,bibcommandlist}
+%D
+%D \type{\simplebibdef} defines \type{bib@#1}, which in turn will
+%D use one argument that is stored in \type{@@pb@#1}.
+%D
+%D \type{\simplebibdef} also defines \type{insert#1}, which can be
+%D used in the argument of \type{\setuppublicationlayout} to fetch
+%D one of the \type{@@pb@} data entries. \type{insert#1} then has
+%D three arguments: \type{#1} are commands to be executed before the
+%D data, \type{#2} are commands to be executed after the data, and
+%D \type{#3} are commands to be executed if the data is not found.
+
+%D \type{\bibcommandlist} is the list of commands that is affected
+%D by this approach. Later on, it will be used to do a series
+%D of assignments from \type{#1} to \type{bib@#1}: e.g
+%D \type{\title} becomes \type{\bib@title} when used within
+%D a publication.
+
+\newtoks\initializebibdefinitions % we need to prevent clashes (HH)
+
+% \def\simplebibdef#1% hh: funny expansion ?
+% {\@EA\long\@EA\def\csname bib@#1\endcsname##1%
+% {\setvalue{\??pb @#1}{##1}%
+% \ignorespaces}%
+% \@EA\def\csname insert#1\endcsname##1##2##3%
+% {\@EA\bibdoifelse
+% \@EA{\csname @@pb@#1\endcsname}%
+% {##1\csname @@pb@#1\endcsname##2}%
+% {##3}%
+% }}
+
+\def\simplebibdef#1% hh: funny expansion ?
+ {\@EA\long\@EA\def\csname bib@#1\endcsname##1%
+ {\setvalue{\??pb @#1}{##1}\ignorespaces}%
+ \expandafter \appendtoks
+ \expandafter\let\csname insert#1\expandafter\endcsname\csname bibinsert#1\endcsname
+ \to \initializebibdefinitions
+ \@EA\unexpanded\@EA\def\csname bibinsert#1\endcsname##1##2##3%
+ {\@EA\bibdoifelse\@EA{\csname\??pb @#1\endcsname}{##1\csname\??pb @#1\endcsname##2}{##3}}}
+
+\def\bibcommandlist
+ {abstract, annotate, arttitle, assignee, bibnumber, bibtype, biburl, chapter, city,
+ comment, country, day, dayfiled, doi, edition, eprint, howpublished, isbn, issn,
+ issue, journal, keyword, keywords, lastchecked, month, monthfiled, names, nationality,
+ note, notes, organization, pages, pubname, pubyear, revision, series, size, thekey,
+ title, volume, yearfiled}
+
+\processcommacommand[\bibcommandlist]\simplebibdef
+
+\def\bibinsertdoi#1#2#3%
+ {{\bibdoifelse{\@@pb@doi}%
+ {\edef\ascii{\@EA\detokenize\@EA{\@@pb@doi}}%
+ #1\expanded{\gotoDOI{\@@pb@thekey}{\ascii}}#2}{#3}}}
+
+\def\bibinsertbiburl#1#2#3%
+ {{\bibdoifelse{\@@pb@biburl}%
+ {\edef\ascii{\@EA\detokenize\@EA{\@@pb@biburl}}%
+ #1\expanded{\gotoURL{\@@pb@thekey}{\ascii}}#2}{#3}}}
+
+\def\bibinsertmonth#1#2#3%
+ {\bibdoifelse{\@@pb@month}%
+ {#1\doifnumberelse{\@@pb@month}%
+ {\doifconversiondefinedelse\@@pbmonthconversion
+ {\convertnumber\@@pbmonthconversion{\@@pb@month}}{\@@pb@month}}%
+ {\@@pb@month}#2}{#3}}
+
+\appendtoks
+ \let\inserturl \bibinsertbiburl % for backward compat.
+ \let\inserttype\bibinsertbibtype % for backward compat.
+\to\initializebibdefinitions
+
+\def\newbibfield[#1]%
+ {\simplebibdef{#1}%
+ \edef\bibcommandlist{\bibcommandlist,#1}}
+
+%D \macros{bib@crossref}
+%D
+%D \type{\crossref} is used in database files to point to another
+%D entry. Because of this special situation, it has to be defined
+%D separately. Since this command will not be seen until at
+%D \type{\placepublications}, it may force extra runs. The same is
+%D true for \type{\cite} commands inside of publications.
+
+\def\bib@crossref#1%
+ {\setvalue{\??pb @crossref}{#1}\ignorespaces}
+
+\def\bibinsertcrossref#1#2#3%
+ {\bibdoifelse{\@@pb@crossref}
+ {#1\@EA\cite\@EA[\@@pb@crossref]#2}
+ {#3}}
+
+\appendtoks\let\insertcrossref\bibinsertcrossref\to\initializebibdefinitions
+
+%D \macros{complexbibdef,specialbibinsert}
+%D
+%D The commands \type{\artauthor}, \type{\author} and
+%D \type{\editor} are more complex than the other commands.
+%D Their argument lists have this form:
+%D
+%D \type{\author[junior]{firstnames}[inits]{von}{surname}}
+%D
+%D (bracketed stuff is optional)
+%D
+%D And not only that, but there also might be more than one of each of
+%D these commands. This is why a special command is needed to insert
+%D them, as well as one extra counter for each command.
+
+%D All of these \type{\@EA}'s and \type{\csnames} make this code
+%D look far more complex than it really is. For example, the argument
+%D \type{author} defines the macro \type{\bib@author} to do two
+%D things: increment the counter \type{\author@num} (let's say to 2)
+%D and next store it's arguments in the macro \type{\@@pb@author2}.
+%D And it defines \type{\insertauthors} to expand into
+%D \starttyping
+%D \specialbibinsert{author}{\author@num}{<before>}{<after>}{<not>}
+%D \stoptyping
+
+\def\docomplexbibdef#1%
+ {\def\currentype{#1}%
+ \dosingleempty\dodocomplexbibdef}
+
+\def\dodocomplexbibdef[#1]#2%
+ {\def\firstarg{#1}\def\secondarg{#2}%
+ \dosingleempty\dododocomplexbibdef}
+
+\def\dododocomplexbibdef[#1]#2#3%
+ {\@EA\increment\csname \currentype @num\endcsname
+ \setevalue{\??pb @\currentype\csname \currentype @num\endcsname}%
+ {{\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 insert#1s\endcsname##1##2##3%
+% {\specialbibinsert{#1}{\csname #1@num\endcsname}{##1}{\unskip ##2}{##3}}}
+
+\def\complexbibdef#1%
+ {\@EA\newcounter\csname #1@num\endcsname
+ \@EA\def\csname bib@#1\endcsname{\docomplexbibdef{#1}}%
+ \expandafter \appendtoks
+ \expandafter\let\csname insert#1s\expandafter\endcsname\csname bibinsert#1s\endcsname
+ \to \initializebibdefinitions
+ \@EA\def\csname bibinsert#1s\endcsname##1##2##3{\specialbibinsert{#1}{\csname #1@num\endcsname}{##1}{\unskip ##2}{##3}}}
+
+\processcommalist[author,artauthor,editor]\complexbibdef
+
+%D Another level of indirection is needed to control the
+%D typesetting of all of these arguments.
+
+%D Btw, there is a conflict between `author' and the predefined interface
+%D variable `auteur'. The old version is overruled `auteur' is
+%D overruled by the systemconstant definition at the top of this file!
+
+\newcount\etallimitcounter
+\newcount\etaldisplaycounter
+\newcount\todocounter
+
+\def\specialbibinsert#1#2#3#4#5%
+ {\bgroup
+ \ifnum#2>\zerocount
+ \etallimitcounter =0\bibalternative{#1etallimit}\relax
+ \etaldisplaycounter=0\bibalternative{#1etaldisplay}\relax
+ \ifnum #2>\etallimitcounter
+ \todocounter\etaldisplaycounter
+ % just in case ...
+ \ifnum\todocounter>\etallimitcounter
+ \todocounter\etallimitcounter
+ \fi
+ \else
+ \todocounter#2\relax
+ \fi
+ \ifnum\todocounter>\zerocount
+ % find the current author list
+ \let\templist\empty
+ \dorecurse{#2}
+ {\toks0=\@EA\@EA\@EA{\csname @@pb@#1\recurselevel\endcsname}%
+ \ifx\templist\empty \edef\templist{\the\toks0}%
+ \else \edef\templist{\templist,\the\toks0}\fi }%
+ \doifdefinedelse
+ {\??pv data#1\c!command}
+ {\doifemptyelsevalue
+ {\??pv data#1\c!command}
+ {#3\dospecialbibinsert{#1}{\todocounter}{\templist}#4}%
+ {#3\getvalue{\??pv data#1\c!command}{#1}{\todocounter}{\templist}#4}}%
+ {#3\dospecialbibinsert{#1}{\todocounter}{\templist}#4}%
+ \else
+ #5%
+ \fi
+ \else
+ #5%
+ \fi
+ \egroup}
+
+%D This macro does the hard work of inserting a list of people in the
+%D output, with proper regard of all the inbetween strings that can
+%D arise depending on length of the list of people.
+
+%D \#1 = type
+%D \#2 = number of items to be typeset
+%D \#3 = commacommand containing authors
+
+\def\dospecialbibinsert#1#2#3%
+ {\getcommacommandsize[#3]%
+ \scratchcounter 0
+ \def\processauthoritem##1%
+ {\advance\scratchcounter1
+ \ifnum \numexpr\scratchcounter-1\relax<#2\relax
+ \getvalue{\??pv data#1}##1%
+ \ifnum \scratchcounter=#2\relax
+ \ifnum\etallimitcounter<\commalistsize\relax \bibalternative{#1etaltext}\fi
+ \else \ifnum\numexpr\scratchcounter+1 = #2\relax
+ \ifnum \commalistsize > \plustwo \bibalternative\c!finalnamesep
+ \else \bibalternative\c!lastnamesep \fi
+ \else
+ \bibalternative\c!namesep
+ \fi \fi
+ \fi}%
+ \processcommacommand[#3]\processauthoritem }
+
+%D \macros{invertedauthor,normalauthor,invertedshortauthor,normalshortauthor}
+%D
+%D Just some commands that can be used in \type{\setuppublicationparameters}
+%D If you want to write an extension to the styles, you might
+%D as well define some of these commands yourself.
+%D
+%D The argument liust has been reordered here, and the meanings
+%D are:
+%D
+%D {\obeylines\parskip0pt
+%D \type{#1} firstnames
+%D \type{#2} von
+%D \type{#3} surname
+%D \type{#4} inits
+%D \type{#5} junior
+%D }
+%D
+
+\def\normalauthor#1#2#3#4#5%
+ {\bibdoif{#1}{#1\bibalternative\c!firstnamesep}%
+ \bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!surnamesep#5\unskip}}
+
+\def\normalshortauthor#1#2#3#4#5%
+ {\bibdoif{#4}{#4\bibalternative\c!firstnamesep}%
+ \bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!surnamesep#5\unskip}}
+
+\def\invertedauthor#1#2#3#4#5%
+ {\bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!juniorsep #5}%
+ \bibdoif{#1}{\bibalternative\c!surnamesep #1\unskip}}
+
+\def\invertedshortauthor#1#2#3#4#5%
+ {\bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!juniorsep #5}%
+ \bibdoif{#4}{\bibalternative\c!surnamesep #4\unskip}}
+
+%D \macros{clearbibitem,clearbibitemtwo,bibitemdefs}
+%D
+%D These are used in \type{\typesetapublication} to do
+%D initializations and cleanups.
+
+\def\clearbibitem#1{\setvalue{\??pb @#1}{}}%
+
+\def\clearbibitemtwo#1%
+ {\letvalue{#1@num}\!!zerocount
+ \scratchcounter\plusone
+ \doloop
+ {\doifdefinedelse{\??pb @#1\the\scratchcounter}
+ {\letvalue{\??pb @#1\the\scratchcounter}\empty
+ \advance\scratchcounter\plusone}%
+ {\exitloop}}}
+
+\def\bibitemdefs#1%
+ {\@EA\let\@EA\tempa \csname bib@#1\endcsname
+ \@EA\let\csname #1\endcsname \tempa }
+
+%D \macros{startpublication}
+%D
+%D We are coming to the end of this module, to the macros that
+%D do typesetting and read the \type{bbl} file.
+
+\newcounter\bibcounter
+
+%D Just a \type{\dosingleempty} is the most friendly
+%D of doing this: there need not even be an argument
+%D to \type{\startpublication}. Of course, then there
+%D is no key either, and it had better be an
+%D article (otherwise the layout will be all screwed up).
+%D
+%D Now prohibits comments, so % can be used for urls
+
+\def\startpublication
+ {\edef\bibmodsavedpercent{\the\catcode`\%}%
+ \catcode`\%=12
+ \dosingleempty\dostartpublication}
+
+\def\stoppublication
+ {} % the \catcode of % is reset below
+
+%D Only specifying the key in the argument is also
+%D legal. In storing this stuff into macros, some trickery with
+%D token registers is needed to fix the expansion problems. Even so,
+%D this appears to not always be 100\% safe, so people are
+%D urgently advised to use \ETEX\ instead of traditional \TEX.
+%D
+%D In \ETEX, all expansion problems are conviniently solved by
+%D the primitive \type{\protected}. To put that another way:
+%D
+%D It's not a bug in this module if it does not appear in \ETEX!
+
+\long\def\dostartpublication[#1]#2\stoppublication%
+ {\increment\bibcounter
+ \bgroup
+ \doifassignmentelse{#1}%
+ {\getparameters[\??pb][k=,t=article,n=,s=,a=,y=,o=,u=,#1]}%
+ {\getparameters[\??pb][k=#1,t=article,n=,s=,a=,y=,o=,u=]}%
+ \@EA\toks\@EA2\@EA{\@@pba}%
+ \@EA\toks\@EA4\@EA{\@@pbs}%
+ \toks0={\ignorespaces #2}%
+ \setxvalue{pbdk-\@@pbk}{\@@pbk}
+ \setxvalue{pbda-\@@pbk}{\the\toks2}
+ \setxvalue{pbdy-\@@pbk}{\@@pby}
+ \setxvalue{pbds-\@@pbk}{\the\toks4}
+ \setxvalue{pbdn-\@@pbk}{\@@pbn}
+ \setxvalue{pbdt-\@@pbk}{\@@pbt}
+ \setxvalue{pbdo-\@@pbk}{\@@pbo}
+ \setxvalue{pbdu-\@@pbk}{\@@pbu}
+ \setxvalue{pbdd-\@@pbk}{\the\toks0}
+ \xdef\allrefs{\allrefs,\@@pbk}%
+ \egroup
+ \catcode`\%=\bibmodsavedpercent\relax }
+
+% intialization of the order-list:
+
+\let\allrefs\empty
+
+%D The next macro is needed because the number command of the
+%D publist sometimes needs to fetch something from the current
+%D item (like the 'short' key). For this, the ID of the current
+%D item is passed in the implict parameter \type{\@@pbk}
+
+\def\makepbkvalue#1{\def\@@pbk{#1}}
+
+\newif\ifinpublist
+
+% from Hans
+
+\def\ignoresectionconversion
+ {\let\@@sectionconversion\secondoftwoarguments}
+
+\let\normaldosetfilterlevel\dosetfilterlevel
+
+\def\patcheddosetfilterlevel#1#2% beware: this one is \let
+ {\bgroup
+ \ignoresectionconversion
+ \edef\askedlevel{#1}%
+ \edef\askedfilter{#2}%
+% \message{ASKD: \meaning\askedlevel}%
+% \message{PREV: \meaning\v!previous}%
+ \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\filllocalpublist%
+ {\doifdefinedelse{\alltoclevels}
+ {\let\dosetfilterlevel\patcheddosetfilterlevel
+ \dosettoclevel\??li{pubs}%
+ \let\dosetfilterlevel\normaldosetfilterlevel }%
+ {\dosettoclevel\??li{pubs}}%
+ \global\let\glocalpublist\empty
+ \doloop
+ {\doifdefinedelse
+ {\r!cross cite-\jobname-\recurselevel}
+ {\doifreferencefoundelse
+ {cite-\jobname-\recurselevel}
+ {\@EA\doifreglevelelse\@EA[\currentlocationreference]
+ {\@EA\doglobal\@EA\addtocommalist\@EA
+ {\currenttextreference}\glocalpublist}{}}
+ {}}%
+ {\exitloop}}%
+ \let\localpublist\glocalpublist}
+
+\def\typesetpubslist
+ {\dobeginoflist
+% \the\initializebibdefinitions
+ \edef\askedlevel{\csname \??li pubs\c!criterium\endcsname}%
+ \ifx\askedlevel\v!all
+ \def\bibrefprefix{}%
+ \else %
+ \preparebibrefprefix
+ \fi
+ \ifsortbycite
+ \filllocalpublist
+ \iftypesetall
+ \let\localallrefs\allrefs
+ \processcommacommand[\localpublist]\typesetapublication
+ \def\removefromallrefs##1%
+ {\removefromcommalist{##1}\localallrefs }%
+ \processcommacommand[\localpublist]\removefromallrefs
+ \processcommacommand[\localallrefs]\typesetapublication
+ \else
+ \processcommacommand[\localpublist]\typesetapublication
+ \fi
+ \else
+ \iftypesetall
+ \processcommacommand[\allrefs]\typesetapublication
+ \else
+ %
+ \filllocalpublist
+ \processcommacommand[\allrefs]\maybetypesetapublication
+ \fi
+ \fi
+ \doendoflist}
+
+\newif\ifinpublist
+
+\def\maybetypesetapublication#1%
+ {\global\inpublistfalse
+ \def\test{#1}%
+ \def\runtest##1%
+ {\def\tempa{##1}\ifx \test\tempa \global\inpublisttrue \fi}%
+ \processcommacommand[\localpublist]\runtest
+ \ifinpublist \typesetapublication{#1}\fi}
+
+\def\initializepubslist
+ {\edef\@@pbnumbering{\@@pbnumbering}%
+ \ifautohang
+ \ifx\@@pbnumbering\v!short
+ \setbox\scratchbox\hbox{\@@pbnumbercommand{\getvalue{\??li pubs\c!samplesize}}}%
+ \else\iftypesetall
+ \setbox\scratchbox\hbox{\@@pbnumbercommand{\getvalue{\??li pubs\c!totalnumber}}}%
+ \else
+ \setbox\scratchbox\hbox{\@@pbnumbercommand{\numreferred}}%
+ \fi\fi
+ \edef\samplewidth{\the\wd\scratchbox}%
+ \setuplist[pubs][\c!width=\samplewidth,\c!distance=0pt]%
+ \ifx\@@pbnumbering\v!short
+ \def\@@pblimitednumber##1{\hbox to \samplewidth
+ {\@@pbnumbercommand{\getvalue{pbds-\@@pbk}}}}%
+ \else \ifx \@@pbnumbering\v!bib
+ \def\@@pblimitednumber##1{\hbox to \samplewidth
+ {\@@pbnumbercommand{\getvalue{pbdn-\@@pbk}}}}%
+ \else
+ \def\@@pblimitednumber##1{\hbox to \samplewidth{\@@pbnumbercommand{##1}}}%
+ \fi \fi
+ \else
+ \ifx\@@pbnumbering\v!short
+ \doifemptyelse
+ {\getvalue{\??li pubs\c!width}}
+ {\def\@@pblimitednumber##1{\hbox
+ {\@@pbnumbercommand{\getvalue{pbds-\@@pbk}}}}}%
+ {\def\@@pblimitednumber##1{\hbox to \getvalue{\??li pubs\c!width}%
+ {\@@pbnumbercommand{\getvalue{pbds-\@@pbk}}}}}%
+ \else \ifx \@@pbnumbering\v!bib
+ \doifemptyelse
+ {\getvalue{\??li pubs\c!width}}
+ {\def\@@pblimitednumber##1{\hbox
+ {\@@pbnumbercommand{\getvalue{pbdn-\@@pbk}}}}}%
+ {\def\@@pblimitednumber##1{\hbox to \getvalue{\??li pubs\c!width}%
+ {\@@pbnumbercommand{\getvalue{pbdn-\@@pbk}}}}}%
+ \else
+ \doifemptyelse
+ {\getvalue{\??li pubs\c!width}}
+ {\def\@@pblimitednumber##1{\hbox{\@@pbnumbercommand{##1}}}}%
+ {\def\@@pblimitednumber##1{\hbox to \getvalue{\??li pubs\c!width}{\@@pbnumbercommand{##1}}}}%
+ \fi
+ \fi
+ \fi
+ \ifx\@@pbnumbering\v!no
+ \setuplist[pubs][\c!numbercommand=,\c!symbol=\v!none,\c!textcommand=\outdented]%
+ \else
+ \setuplist[pubs][\c!numbercommand=\@@pblimitednumber]%
+ \fi
+ \doifelsevalue
+ {\??pv data\c!maybeyear}{\v!off}{\def\maybeyear##1{}}{\def\maybeyear##1{##1}}%
+ \forgetall} % bugfix 2005/03/18
+
+\def\outdented#1% move to supp-box ?
+ {\hskip -\hangindent #1}
+
+%D The full list of publications
+
+\def\completepublications
+ {\dosingleempty\docompletepublications}
+
+\def\bibdogetupsometextprefix#1#2#3%
+ {\ifcsname#2#1#3\endcsname
+ \csname#2#1#3\endcsname
+ \else\ifcsname\??la#1\c!default\endcsname
+ \@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
+ \fi\fi
+ \else
+ \expandafter\bibdogetupsometextprefix
+ \csname\??la#1\c!default\endcsname{#2}{#3}%
+ \fi
+ \else
+ \ifcsname#2#3\endcsname
+ \csname#2#3\endcsname
+ \else\ifcsname#2\s!en#3\endcsname
+ \csname#2\s!en#3\endcsname
+ \fi\fi
+ \fi\fi}
+
+\def\docompletepublications[#1]%
+ {\begingroup
+ \setuplist[pubs][\c!criterium=\v!previous,#1]
+ \begingroup
+ \let\handletextprefix\firstoftwoarguments
+ \edef\headtextpubs{\bibdogetupsometextprefix\headlanguage\c!title{pubs}}%
+ \doifdefinedelse
+ {\??pv data\v!title}
+ {\doifemptyelsevalue
+ {\??pv data\v!title}
+ {\expanded{\systemsuppliedtitle[pubs]{\headtextpubs}}}%
+ {\expanded{\getvalue{\??pv data\v!title}{\headtextpubs}}}%
+ }%
+ {\expanded{\systemsuppliedtitle[pubs]{\headtextpubs}}}%
+ \endgroup
+ \dodoplacepublications }
+
+%D And the portion with the entries only.
+
+\def\placepublications
+ {\dosingleempty\doplacepublications}
+
+\def\doplacepublications[#1]%
+ {%\getparameters[\??pv data][#1]
+ \begingroup
+ \setuplist[pubs][\c!criterium=\v!previous,#1]%
+ \dodoplacepublications }%
+
+\def\dodoplacepublications%
+ {\initializepubslist
+ \doifelsevalue
+ {\??li pubs\c!option}{\v!continue}%
+ {}%
+ {\global\let\bibcounter\!!zerocount }%
+ \inpublisttrue
+ \typesetpubslist
+ \inpublistfalse
+ \endgroup}
+
+%D \subsubject{What's in a publication}
+
+\unexpanded\def\typesetapublication#1%
+ {\doifsomething{#1}
+ {\doglobal\increment\bibcounter
+ \bgroup
+ \the\initializebibdefinitions
+ \makepbkvalue{#1}%
+ \ifgridsnapping
+ \snaptogrid\vbox{\dodolistelement{pubs}{}{\bibcounter}%
+ {\expanded{\reference[\bibrefprefix#1]{\bibcounter}}%
+ \strut \dotypesetapublication{#1}\strut }{}{}}%
+ \else
+ \dodolistelement{pubs}{}{\bibcounter}%
+ {\expanded{\reference[\bibrefprefix#1]{\bibcounter}}%
+ \strut \dotypesetapublication{#1}\strut }{}{}%
+ \fi
+ \egroup}}
+
+\def\dotypesetapublication#1%
+ {\bgroup
+ \def\@@currentalternative{data}%
+ \processcommacommand[\bibcommandlist,crossref]\clearbibitem
+ \processcommalist [artauthor,author,editor]\clearbibitemtwo
+ \processcommacommand[\bibcommandlist]\bibitemdefs
+ \processcommalist [artauthor,author,editor,crossref]\bibitemdefs
+ \let\biblanguage\empty
+ \getvalue{pbdd-#1}%
+ \ifcsname pbdt-#1\endcsname \bibalternative{\getvalue{pbdt-#1}}\fi
+ \egroup }
+
+%D An afterthought:
+
+\def\maybeyear#1{}
+
+%D An another:
+
+\def\noopsort#1{}
+
+%D This is the result of bibtex's `language' field.
+
+\def\setbiblanguage#1#2{\setvalue{\??pb @lang@#1}{#2}}
+
+\def\lang#1%
+ {\def\biblanguage{#1}%
+ \ifcsname \??pb @lang@#1\endcsname
+ \expanded{\language[\getvalue{\??pb @lang@#1}]}%
+ \fi \ignorespaces}
+
+%D \subject{Citations}
+%D
+%D \macros{cite,bibref}
+%D
+%D The indirection with \type{\dobibref} allows \LATEX\ style
+%D \type{\cite} commands with a braced argument (these might appear
+%D in included data from the \type{.bib} file).
+
+% \unexpanded\def\cite
+% {\doifnextcharelse{[}
+% {\dodocite}
+% {\dobibref}}
+% \def\dobibref#1%
+% {\docite[#1][]}
+% \def\dodocite[#1]%
+% {\startstrictinspectnextcharacter
+% \dodoubleempty\dododocite[#1]}
+% \def\dododocite[#1][#2]{%
+% \stopstrictinspectnextcharacter
+% \docite[#1][#2]}
+
+\unexpanded\def\cite
+ {\strictdoifnextoptionalelse\dodocite\dobibref}
+
+\def\dobibref#1%
+ {\docite[#1][]}
+
+\def\dodocite[#1]%
+ {\strictdoifnextoptionalelse{\docite[#1]}{\docite[#1][]}}
+
+\def\docite[#1][#2]%
+ {\begingroup
+ \setupinteraction[\c!style=]%
+ \edef\temp{#2}%
+ \ifx\empty\temp \secondargumentfalse
+ \else \secondargumenttrue \fi
+ \ifsecondargument
+ \processcommalist[#2]\docitation
+ \doifassignmentelse
+ {#1}%
+ {\getparameters[LO][\c!alternative=,\c!extras=,#1]%
+ \edef\@@currentalternative{\LOalternative}%
+ \ifx\@@currentalternative\empty
+ \edef\@@currentalternative{\@@citedefault}%
+ \fi
+ \ifx\LOextras\empty
+ \setupcite[\@@currentalternative][#1]%
+ \else
+ \expandafter\ifx\csname LOright\endcsname \relax
+ \edef\LOextras{{\LOextras\bibalternative\c!right}}%
+ \else
+ \edef\LOextras{{\LOextras\LOright}}%
+ \fi
+ \expanded{\setupcite[\@@currentalternative][#1,\c!right=\LOextras]}%
+ \fi
+ }%
+ {\def\@@currentalternative{#1}}%
+ \expanded{%
+ \processaction[\csname @@pv\@@currentalternative \c!compress\endcsname]}
+ [ \v!yes=>\bibcitecompresstrue,
+ \v!no=>\bibcitecompressfalse,
+ \s!default=>\bibcitecompresstrue,
+ \s!unknown=>\bibcitecompresstrue]%
+ \getvalue{bib\@@currentalternative ref}[#2]%
+ \else
+ \processcommalist[#1]\docitation
+ \expanded{\processaction[\csname @@pv\@@citedefault \c!compress\endcsname]}
+ [ \v!yes=>\bibcitecompresstrue,
+ \v!no=>\bibcitecompressfalse,
+ \s!default=>\bibcitecompresstrue,
+ \s!unknown=>\bibcitecompresstrue]%
+ \edef\@@currentalternative{\@@citedefault}%
+ \getvalue{bib\@@citedefault ref}[#1]%
+ \fi
+ \endgroup}
+
+%D \macros{nocite}
+
+\def\nocite[#1]%
+ {\processcommalist[#1]\addthisref
+ \processcommalist[#1]\docitation }
+
+%D \macros{setupcite}
+
+\def\setupcite{\dodoubleempty\dosetupcite}
+
+\def\dosetupcite[#1][#2]%
+ {\ifsecondargument
+ \def\dodosetupcite##1{\getparameters[\??pv##1][#2]}%
+ \processcommalist[#1]\dodosetupcite
+ \else % default case
+ \getparameters[\??pv\@@citedefault][#1]%
+ \fi }
+
+%D Low-level stuff
+
+\def\getcitedata#1[#2]#3[#4]#5to#6%
+ {\bgroup
+ \addthisref{#4}%
+ \dofetchapublication{#4}%
+ \doifdefinedelse{@@pb@bib#2}%
+ {\xdef#6{\getvalue{@@pb@bib#2}}}%
+ {\xdef#6{\getvalue{@@pb@#2}}}%
+ \egroup}
+
+\def\dofetchapublication#1%
+ {\makepbkvalue{#1}%
+ \processcommacommand[\bibcommandlist,crossref]\clearbibitem
+ \processcommalist [artauthor,author,editor]\clearbibitemtwo
+ \processcommacommand[\bibcommandlist]\bibitemdefs
+ \processcommalist [artauthor,author,editor,crossref]\bibitemdefs
+ \getvalue{pbdd-#1}}
+
+%D This new version writes a reference out to the tui file for every
+%D \type{\cite}. This will allow backlinking.
+%D
+%D Some special care is needed so that references are not added from
+%D weird locations like in the TOC or within a \type{\setbox} command.
+
+\newcounter\citationnumber
+
+\def\docitation#1{%
+ \iftrialtypesetting \else
+ \ifdoinpututilities\else
+ \doglobal\increment\citationnumber
+ \expanded{\rawreference{}{cite-\jobname-\citationnumber}{#1}}%
+ \fi \fi }
+
+%D \macros{numreferred,doifreferredelse,addthisref,publist}
+%D
+%D The interesting command here is \type{\addthisref}, which maintains
+%D the global list of references.
+%D
+%D \type{\numreferred} is needed to do automatic calculations on
+%D the label width, and \type{\doifreferredelse} will be used
+%D to implement \type{criterium=cite}.
+
+\newcounter\numreferred
+
+\long\def\doifreferredelse#1{\doifdefinedelse{pbr-#1}}
+
+\def\addthisref#1%
+ {\doifundefinedelse{pbr-#1}
+ {\setxvalue{pbr-#1}{\citationnumber}%
+ \doglobal\increment\numreferred
+ \ifx\publist\empty \gdef\publist{#1}\else\appended\gdef\publist{,#1}\fi}
+ {\setxvalue{pbr-#1}{\getvalue{pbr-#1},\citationnumber}}}
+
+\let\publist\empty
+
+%D \macros{doifbibreferencefoundelse}
+%D
+%D Some macros to fetch the information provided by
+%D \type{\startpublication}.
+
+\def\doifbibreferencefoundelse#1%
+ {\preloadbiblist
+ \doifdefinedelse{pbdk-#1}
+ {\firstoftwoarguments}
+ {\showmessage\m!publications{5}{#1 is unknown}%
+ \secondoftwoarguments}}
+
+%D \macros{ixbibauthoryear,thebibauthors,thebibyears}
+%D
+%D If compression of \type{\cite}'s argument expansion is on,
+%D the macros that deal with authors and years call this internal
+%D command to do the actual typesetting.
+%D
+%D Two entries with same author but with different years may
+%D be condensed into ``Author (year1,year2)''. This is about the
+%D only optimization that makes sense for the (author,year)
+%D style of citations (years within one author have to be unique
+%D anyway so no need to test for that, and ``Author1, Author2 (year)''
+%D creates more confusion than it does good).
+%D
+%D In the code below,
+%D the macro \type{\thebibauthors} holds the names of the alternative
+%D author info fields for the current list. This is a commalist,
+%D and \type{\thebibyears} holds the (collection of) year(s) that go with
+%D this author (possibly as a nested commalist).
+%D
+%D There had better be an author for all cases, but there
+%D does not have to be year info always. \type{\thebibyears} is
+%D pre-initialized because this makes the insertion macros simpler.
+%D
+%D In `normal' \TeX, of course there are expansion problems again.
+
+\def\ixbibauthoryear#1#2#3#4%
+ {\bgroup
+ \gdef\ixlastcommand {#4}%
+ \gdef\ixsecondcommand{#3}%
+ \gdef\ixfirstcommand {#2}%
+ \glet\thebibauthors \empty
+ \glet\thebibyears \empty
+ \getcommalistsize[#1]%
+ \ifbibcitecompress
+ \dorecurse\commalistsize{\xdef\thebibyears{\thebibyears,}}%
+ \processcommalist[#1]\docompressbibauthoryear
+ \else
+ \processcommalist[#1]\donormalbibauthoryear
+ \fi
+ \egroup
+ \dobibauthoryear}
+
+%D \macros{dodobibauthoryear}
+%D
+%D This macro only has to make sure that the lists
+%D \type{\thebibauthors} and \type{\thebibyears} are printed.
+
+\def\dobibauthoryear
+ {\scratchcounter\zerocount
+ \getcommacommandsize[\thebibauthors]%
+ \edef\authorcount{\commalistsize}%
+ \@EA\processcommalist\@EA[\thebibauthors]\dodobibauthoryear}
+
+\def\dodobibauthoryear#1%
+ {\advance\scratchcounter\plusone
+ \edef\wantednumber{\the\scratchcounter}%
+ \getfromcommacommand[\thebibyears][\wantednumber]%
+ \@EA\def\@EA\currentbibyear\@EA{\commalistelement}%
+ \setcurrentbibauthor{#1}%
+ \ifnum\scratchcounter=\plusone
+ \ixfirstcommand
+ \else\ifnum \scratchcounter=\authorcount\relax
+ \ixlastcommand
+ \else
+ \ixsecondcommand
+ \fi\fi}
+
+\def\setcurrentbibauthor#1%
+ {\getcommacommandsize[#1]%
+ \ifcase\commalistsize
+ % anonymous?
+ \def\currentbibauthor{}%
+ \or
+ \def\currentbibauthor{#1}%
+ \or
+ \expanded{\docurrentbibauthor#1}%
+ \else
+ \handlemultiplebibauthors{\commalistsize}{#1}%
+ \fi }
+
+\newcount\citescratchcounter
+
+\def\handlemultiplebibauthors#1#2%
+ {\citescratchcounter 0
+ \def\currentbibauthor{}%
+ \def\bibprocessauthoritem##1%
+ {\advance\citescratchcounter1
+ \ifnum \citescratchcounter=#1\relax
+ \edef\currentbibauthor{\currentbibauthor##1}%
+ \else \ifnum\numexpr\citescratchcounter+1 = #1\relax
+ \edef\currentbibauthor{\currentbibauthor ##1\bibalternative{andtext}}%
+ \else
+ \edef\currentbibauthor{\currentbibauthor ##1\bibalternative{namesep}}%
+ \fi
+ \fi }%
+ \processcommalist[#2]\bibprocessauthoritem }
+
+\setupcite
+ [author,authoryear,authoryears]
+ [\c!namesep={, }]
+
+%D This discovery of authoretallimit is not the best one,
+%D but it will do for now.
+
+\def\docurrentbibauthor#1,#2%
+ {\doifemptyelse{#2}
+ {\def\currentbibauthor{#1\bibalternative{otherstext}}}
+ {\@EA
+ \ifx\csname \??pv\@@currentalternative authoretallimit\endcsname\relax
+ \edef\currentbibauthor{#1\bibalternative{andtext}#2}%
+ \else
+ \edef\currentbibauthor{#1%
+ \ifcase0\bibalternative{authoretallimit}\relax\or
+ \bibalternative{otherstext}\else\bibalternative{andtext}#2\fi}%
+ \fi}}
+
+%D This is not the one Hans made for me, because I need a global
+%D edef, and the \type{\robustdoifinsetelse} doesn't listen to
+%D \type{\doglobal }
+
+\def\robustaddtocommalist#1#2% {item} \cs
+ {\robustdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\xdef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+%D \macros{donormalbibauthoryear}
+%D
+%D Now we get to the macros that fill the two lists.
+%D The `simple' one really is quite simple.
+
+\def\donormalbibauthoryear#1%
+ {\addthisref{#1}%
+ \def\myauthor{Xxxxxxxxxx}%
+ \def\myyear{0000}%
+ \doifbibreferencefoundelse{#1}
+ {\def\myauthor{{\getvalue{pbda-#1}}}%
+ \def\myyear {\getvalue{pbdy-#1}}}%
+ {}%
+ \@EA\doglobal\@EA\appendtocommalist\@EA{\myauthor}\thebibauthors
+ \@EA\doglobal\@EA\appendtocommalist\@EA{\myyear }\thebibyears}
+
+%D \macros{docompressbibauthoryear}
+%D
+%D So much for the easy parts. Nothing at all will be done if
+%D the reference is not found or the reference does not contain
+%D author data. No questions marks o.s.s. (to be fixed later)
+
+\def\docompressbibauthoryear#1%
+ {\addthisref{#1}%
+ \def\myauthor{Xxxxxxxxxx}%
+ \def\myyear {0000}%
+ \doifbibreferencefoundelse{#1}
+ {\xdef\myauthor{\csname pbda-#1\endcsname }%
+ \xdef\myyear {\csname pbdy-#1\endcsname }}
+ {}%
+ \ifx\myauthor\empty\else
+ \checkifmyauthoralreadyexists
+ \findmatchingyear
+ \fi}
+
+%D two temporary counters. One of these two can possibly be replaced
+%D by \type{\scratchcounter}.
+
+\newcount\bibitemcounter
+\newcount\bibitemwanted
+
+%D The first portion is simple enough: if this is the very first author
+%D it is quite straightforward to add it. \type{\bibitemcounter} and
+%D \type{\bibitemwanted} are needed later to insert the year
+%D information in the correct item of \type{\thebibyears}
+
+\def\checkifmyauthoralreadyexists
+ {\doifemptyelsevalue{thebibauthors}
+ {\global\bibitemwanted \plusone
+ \global\bibitemcounter \plusone
+ \xdef\thebibauthors{{\myauthor}}}
+ {% the next weirdness is because according to \getcommalistsize,
+ % the length of \type{[{{},{}}]} is 2.
+ \@EA\getcommalistsize\@EA[\thebibauthors,]%
+ \global\bibitemcounter\commalistsize
+ \global\advance\bibitemcounter\minusone
+ \global\bibitemwanted \zerocount
+ \processcommacommand[\thebibauthors]\docomparemyauthor}}
+
+%D The outer \type{\ifnum} accomplishes the addition of
+%D a new author to \type{\thebibauthors}. The messing about with
+%D the two counters is again to make sure that \type{\thebibyears}
+%D will be updated correctly.If the author {\it was} found,
+%D the counters will stay at their present values and everything
+%D will be setup properly to insert the year info.
+
+\def\docomparemyauthor#1%
+ {\global\advance\bibitemwanted \plusone
+ \def\mytempc{#1}%
+% \message{authors: \myauthor <=>\mytempc \ifx\mytempc\myauthor :Y \else :N
+% \meaning \myauthor, \meaning\mytempc\fi (\the\bibitemwanted = \the\bibitemcounter)}%
+ \ifx\mytempc\myauthor
+ \quitcommalist
+ \else
+ \ifnum\bibitemwanted = \bibitemcounter\relax
+ \global\advance\bibitemwanted \plusone
+ \global\bibitemcounter\bibitemwanted\relax
+ \@EA\doglobal\@EA\robustaddtocommalist\@EA{{\myauthor}}\thebibauthors
+ \fi
+ \fi}
+
+%D This macro should be clear now.
+
+\def\findmatchingyear
+ {\edef\wantednumber{\the\bibitemwanted}%
+ \getfromcommacommand[\thebibyears][\wantednumber]%
+ \ifx\commalistelement\empty
+ \edef\myyear{{\myyear}}%
+ \else
+ \edef\myyear{{\commalistelement, \myyear}}%
+ \fi
+ \edef\newcommalistelement{\myyear}%
+ \doglobal\replaceincommalist \thebibyears \wantednumber}
+
+%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 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.
+%D
+%D Because this macro is used within \type{\cite } that itself
+%D can be used within lists like the table of contents, it needs
+%D to save and restore \type{\savedalltoclevels} and
+%D \type{\currentlevel} (\type{\dosetfilterlevel} needs to change
+%D their values globally).
+
+\def\preparebibrefprefix
+ {\chardef\savedalltoclevels \alltoclevels
+ \let\savedcurrentlevel\currentlevel
+ \let\dosetfilterlevel\patcheddosetfilterlevel
+ \dosettoclevel\??li{pubs}%
+ \edef\bibrefprefix{\@@sectiontype\currentlevel\sectionseparator}%
+ \let\dosetfilterlevel\normaldosetfilterlevel
+ \global\let\currentlevel\savedcurrentlevel
+ \global\chardef\alltoclevels \savedalltoclevels }
+
+%D \macros{preparebibreflist}
+%D
+%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 \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
+%D \def\bibreflist%
+%D {1:2:0:3:4:article-full,
+%D 1:2:0:3:article-full,
+%D 1:2:0:article-full,
+%D 1:2:article-full,
+%D 1:article-full,
+%D article-full}
+%D \stoptyping
+
+\def\preparebibreflist#1%
+ {\let\bibreflist\empty
+ \def\storeitem##1%
+ {\ifx\bibreflist\empty
+ \edef\prefix{##1\sectionseparator}%
+ \edef\bibreflist{\prefix#1,#1}%
+ \else
+ \edef\prefix{\prefix##1\sectionseparator}%
+ \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.
+
+\newif\ifbibreffound
+
+\def\gotobiblink#1[#2]%
+ {\bgroup
+ \preparebibrefprefix
+ \preparebibreflist{#2}%
+ \global\bibreffoundfalse
+ \def\setuplink##1%
+ {\ifbibreffound\else
+ \doifreferencefoundelse
+ {##1}
+ {\global\bibreffoundtrue \goto{#1}[##1]}%
+ {}\fi}%
+ \processcommacommand[\bibreflist]\setuplink
+ \ifbibreffound \else \unknownreference{#2}\fi
+ \egroup }
+
+\def\atbiblink[#1]%
+ {\bgroup
+ \preparebibrefprefix
+ \preparebibreflist{#1}%
+ \global\bibreffoundfalse
+ \def\setuplink##1%
+ {\ifbibreffound\else
+ \doifreferencefoundelse
+ {##1}
+ {\global\bibreffoundtrue \at[##1]}%
+ {}\fi}%
+ \processcommacommand[\bibreflist]\setuplink
+ \ifbibreffound \else \unknownreference{#1}\fi
+ \egroup }
+
+\def\inbiblink[#1]%
+ {\bgroup
+ \preparebibrefprefix
+ \preparebibreflist{#1}%
+ \global\bibreffoundfalse
+ \def\setuplink##1%
+ {\ifbibreffound\else
+ \doifreferencefoundelse
+ {##1}
+ {\global\bibreffoundtrue \in[##1]}%
+ {}\fi}%
+ \processcommacommand[\bibreflist]\setuplink
+ \ifbibreffound \else \unknownreference{#1}\fi
+ \egroup }
+
+%D \macros{bibauthoryearref,bibauthoryearsref,bibauthorref,bibyearref}
+%D
+%D Now that all the hard work has been done, these are simple.
+%D \type{\ixbibauthoryearref} stores the data in the macros
+%D \type{\currentbibauthor} and \type{\currentbibyear}.
+
+\def\ifbibinteractionelse%
+ {\iflocation
+ \edef\test{\bibalternative\c!interaction}%
+ \ifx\test\v!stop
+ \@EA\@EA\@EA\secondoftwoarguments
+ \else
+ \@EA\@EA\@EA\firstoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi
+ }
+
+\def\bibmaybeinteractive#1#2%
+ {\ifbibcitecompress #2\else
+ \ifbibinteractionelse{\gotobiblink{#2}[#1]}{#2}\fi }
+
+\def\bibauthoryearref[#1]%
+ {\ixbibauthoryear{#1}%
+ {\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
+ \bibalternative\v!left{\currentbibyear}\bibalternative\v!right}}
+ {\bibalternative\c!pubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
+ \bibalternative\v!left {\currentbibyear}\bibalternative\v!right}}
+ {\bibalternative\c!lastpubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
+ \bibalternative\v!left {\currentbibyear}\bibalternative\v!right}}}
+
+\def\bibauthoryearsref[#1]%
+ {\bibalternative\v!left
+ \ixbibauthoryear{#1}
+ {\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
+ {\bibalternative\c!pubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
+ {\bibalternative\c!lastpubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}%
+ \bibalternative\v!right}
+
+\def\bibauthorref[#1]%
+ {\bibalternative\v!left
+ \ixbibauthoryear{#1}%
+ {\bibmaybeinteractive{#1}{{\currentbibauthor}}}
+ {\bibalternative\c!pubsep \bibmaybeinteractive{#1}{{\currentbibauthor}}}
+ {\bibalternative\c!lastpubsep\bibmaybeinteractive{#1}{{\currentbibauthor}}}%
+ \bibalternative\v!right}
+
+\def\bibyearref[#1]%
+ {\bibalternative\v!left
+ \ixbibauthoryear{#1}%
+ {\bibmaybeinteractive{#1}{{\currentbibyear}}}
+ {\bibalternative\c!pubsep \bibmaybeinteractive{#1}{{\currentbibyear}}}
+ {\bibalternative\c!lastpubsep\bibmaybeinteractive{#1}{{\currentbibyear}}}%
+ \bibalternative\v!right}
+
+%D ML problems:
+
+%D \macros{bibshortref,bibkeyref,bibpageref,bibtyperef,bibserialref}
+%D
+%D There is hardly any point in trying to compress these. The only
+%D thing that needs to be done is making sure that
+%D the separations are inserted correctly. And that is
+%D what \type{\refsep} does.
+
+\newif\iffirstref
+
+\def\refsep{\iffirstref\firstreffalse\else\bibalternative\c!pubsep\fi}
+
+\def\bibshortref[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobibshortref
+ \bibalternative\v!right}
+
+\def\dobibshortref#1%
+ {\addthisref{#1}\refsep
+ \doifbibreferencefoundelse{#1}{\gotobiblink{\getvalue{pbds-#1}}[#1]}
+ {\unknownreference{#1}}}
+
+
+\def\bibserialref[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobibserialref
+ \bibalternative\v!right}
+
+\def\dobibserialref#1%
+ {\addthisref{#1}\refsep
+ \doifbibreferencefoundelse{#1}{\gotobiblink{\getvalue{pbdn-#1}}[#1]}
+ {\unknownreference{#1}}}
+
+\def\bibkeyref[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobibkeyref
+ \bibalternative\v!right}
+
+\def\dobibkeyref#1%
+ {\addthisref{#1}\refsep\gotobiblink{#1}[#1]}
+
+\def\gotoDOI#1#2%
+ {\ifbibinteractionelse
+ {\useURL[bibfooDoi#1][#2]%
+ \useURL[bibfoo#1][http://dx.doi.org/#2]%
+ \goto{\url[bibfooDoi#1]}[url(bibfoo#1)]}
+ {\hyphenatedurl{#2}}}
+
+\def\bibdoiref[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobibdoiref
+ \bibalternative\v!right}
+
+\def\dobibdoiref#1%
+ {\addthisref{#1}\refsep
+ \doifbibreferencefoundelse{#1}{\expanded{\gotoDOI{#1}{\getvalue{pbdo-#1}}}}
+ {\unknownreference{#1}}}
+
+\def\biburlref[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobiburlref
+ \bibalternative\v!right}
+
+\def\gotoURL#1#2%
+ {\ifbibinteractionelse
+ {\useURL[bibfoo#1][#2]\goto{\url[bibfoo#1]}[url(bibfoo#1)]}
+ {\hyphenatedurl{#2}}}
+
+\def\dobiburlref#1%
+ {\addthisref{#1}\refsep
+ \doifbibreferencefoundelse{#1}{\expanded{\gotoURL{#1}{\getvalue{pbdu-#1}}}}
+ {\unknownreference{#1}}}
+
+\def\bibtyperef[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobibtyperef
+ \bibalternative\v!right}
+
+\def\dobibtyperef#1%
+ {\addthisref{#1}\refsep
+ \doifbibreferencefoundelse{#1}{\gotobiblink{\getvalue{pbdt-#1}}[#1]}
+ {\unknownreference{#1}}}
+
+\def\bibpageref[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobibpageref
+ \bibalternative\v!right}
+
+\def\dobibpageref#1%
+ {\addthisref{#1}\refsep
+ \ifbibinteractionelse{\atbiblink[#1]}{{\referencingfalse\at[#1]}}}
+
+\def\bibdataref[#1]%
+ {\bibalternative\v!left
+ \firstreftrue\processcommalist[#1]\dobibdata
+ \bibalternative\v!right}
+
+\def\dobibdata#1%
+ {\addthisref{#1}\refsep
+ \doifbibreferencefoundelse{#1}{\dotypesetapublication{#1}}
+ {\unknownreference{#1}}}
+
+\let\bibnoneref\nocite
+
+%D \macros{bibnumref}
+%D
+%D It makes sense to try and compress the argument list of
+%D \type{\bibnumref}. There are two things involved: the actual
+%D compression, and a sort routine. The idea is to store the
+%D found values in a new commalist called \type{\therefs}.
+
+%D But that is not too straight-forward, because \type{\in} is
+%D not expandable,
+%D so that the macro \type{\expandrefs} is needed.
+
+\def\expandrefs#1%
+ {\bgroup
+ \preparebibrefprefix
+ \preparebibreflist{#1}%
+ \global\bibreffoundfalse
+ \def\setuplink##1%
+ {\ifbibreffound\else
+ \doifreferencefoundelse
+ {##1}
+ {\global\bibreffoundtrue
+ \@EA\doglobal\@EA\addtocommalist\@EA{\reftypet}\therefs }%
+ {}\fi}%
+ \processcommacommand[\bibreflist]\setuplink
+ \ifbibreffound \else \showmessage\m!publications{5}{#1 unknown}%
+ \doglobal\addtocommalist{0}\therefs\fi
+ \egroup }
+
+%D But at least the actual sorting code is simple (note that sorting
+%D a list with exactly one entry fails to return anything, which
+%D is why the \type{\ifx} is needed).
+
+\def\bibnumref[#1]%
+ {\bibalternative\v!left
+ \penalty\!!tenthousand
+ \processcommalist[#1]\addthisref
+ \firstreftrue
+ \ifbibcitecompress
+ \glet\therefs\empty
+ \processcommalist[#1]\expandrefs
+ \sortcommacommand[\therefs]\donumericcompare
+ \ifx\empty\sortedcommalist\else
+ \let\therefs\sortedcommalist
+ \fi
+ \compresscommacommandnrs[\therefs]%
+ \processcommacommand[\compressedlist]\verysimplebibnumref
+ \else
+ \processcommalist[#1]\dosimplebibnumref
+ \fi
+ \bibalternative\v!right}
+
+\def\dosimplebibnumref #1%
+ {\refsep\ifbibinteractionelse
+ {\inbiblink[#1]}{{\referencingfalse\inbiblink[#1]}}}
+
+\def\verysimplebibnumref#1{\doverysimplebibnumref#1}
+
+\def\doverysimplebibnumref#1#2%
+ {\refsep
+ \ifcase#1\relax \unknownreference{#1}\else
+ \def\tempa{#2}\ifx\empty\tempa#1\else#1\bibalternative\c!inbetween#2\fi
+ \fi}
+
+%D By request from Sanjoy. This makes it easier to implement
+%D \type{\citeasnoun}.
+
+\def\bibauthornumref[#1]%
+ {\getcommalistsize[#1]%
+ \global\bibitemcounter\commalistsize
+ \firstreftrue
+ \processcommalist[#1]\dobibauthornumref }
+
+\def\dobibauthornumref#1%
+ {\addthisref{#1}\refsep
+ \doifbibreferencefoundelse{#1}
+ {\getvalue{pbda-#1}%
+ \bibalternative\c!inbetween
+ \bibalternative\v!left
+ \ifbibinteractionelse{\inbiblink[#1]}
+ {{\referencingfalse\inbiblink[#1]}}%
+ \bibalternative\v!right}
+ {\unknownreference{#1}}}
+
+%D And some defaults are loaded from bibl-apa:
+
+\setuppublications
+ [\v!month\v!conversion=,
+ \c!alternative=apa]
+
+\appendtoks
+ \preloadbiblist
+\to \everystarttext
+
+\protect \endinput
diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv
new file mode 100644
index 000000000..519af0c6f
--- /dev/null
+++ b/tex/context/base/bibl-tra.mkiv
@@ -0,0 +1,1552 @@
+%D \module
+%D [ file=bibl-tra,
+%D version=2009.08.22,
+%D title=\CONTEXT\ Publication Module,
+%D subtitle=Publications,
+%D author=Taco Hoekwater,
+%D date=\currentdate,
+%D copyright=Public Domain]
+%C
+%C Donated to the public domain.
+
+%D This module has been adapted to \MKIV\ by Hans Hagen so if things go wrong,
+%D he is to blame. The changes concern references and lists but teh rendering
+%D itself is unchanged. Future versions might provide variants as we have plans
+%D for an upgrade.
+%D
+%D We use a still somewhat experimental extension to the list
+%D mechanism. Eventually the bibtex module will use the bibl loader
+%D and access the data by means of lpath expressions. In that case we
+%D don't need to process the bibliography but still need to track
+%D usage as done here.
+%D
+%D A bit ongoing: make more local macros prefixed with bib, i.e. the bib
+%D namespace is reserved.
+
+\writestatus{loading}{ConTeXt Bibliography Support / BibTeX}
+
+\definefilesynonym[bib][obsolete]
+
+\registerctxluafile{bibl-tra}{1.001}
+
+%D The original was developed independantly by Taco Hoekwater while still working for Kluwer
+%D Academic publishers (it still used the dutch interface then). Development continued after
+%D he left Kluwer, and in Januari 2005, the then already internationalized file was merged
+%D with the core distribution by Hans Hagen. The current version is once again by Taco.
+%D
+%D More documentation and additional resources can be found on the contextgarden:
+%D \hyphenatedurl{http://wiki.contextgarden.net//Bibliography}.
+
+%D \subject{DONE (dd/mm/yyyy)}
+%D
+%D \startitemize
+%D \item add author definition (and associated system variable) (26/05/2005)
+%D \item add finalnamesep support for Oxford comma (17/09/2005)
+%D \item add \type{\insert...} for: doi, eprint, howpublished (19/09/2005)
+%D \item allow a defaulted \type{\setupcite} (19/11/2005)
+%D \item renamed citation type 'number' to 'serial' (19/11/2005)
+%D \item better definition of \type{\inverted...author} (19/11/2005)
+%D \item don't reset [numbercommand] in \type {\setuppublication} by default (20/11/2005)
+%D \item don't disable other \type {\setuppublication} keys if alternative is present (20/11/2005)
+%D \item drop \type{\sanitizeaccents} (20/11/2005)
+%D \item added \type{\nocite} and \type{\cite[none]} (21/11/2005)
+%D \item added headtext for it (23/11/2005)
+%D \item make \type{\cite[url]} and \type{\cite[doi]} interactive (23/11/2005)
+%D \item make right-aligned labels in the list work even when autohang=no
+%D \item use 'et al.' instead of 'et.al.'. Pointed out by Peter M\"unster (30/12/2005)
+%D \item added headtext for cz (31/12/2005)
+%D \item Keep whitespace after \type{\cite} with single argument (31/12/2005)
+%D \item Fix broken \type{\cite{}} support (31/12/2005)
+%D \item Use \type{\readfile} inside \type{\usepublications} instead of \type{\readsysfile} (12/01/2006)
+%D \item Use \type{\currentbibyear} and \type{\currentbibauthor} instead of \type{\YR} and \type{\AU} (05/02/2006)
+%D \item Fix compressed version of authoryear style (05/02/2006)
+%D \item Rename the clashing data fields \type{\url} and \type{\type} to \type{\biburl} and \type{\bibtype} (05/02/2006)
+%D \item Added two french bibl files from Renaud Aubin (06/02/2006)
+%D \item Five new bib class and eight extra bib fields, for IEEEtran (07/02/2006)
+%D \item French keyword translation, provided by Renaud (08/02/2006)
+%D \item fix underscores in undefined keys (22/02/2006)
+%D \item Destroy interactivity in labels of the publication list (13/03/2006)
+%D \item fix multi-cite list compression (11/4/2006)
+%D \item fix \type{\getcitedata} (11/4/2006)
+%D \item magic for chapter bibs (18-25/4/2006)
+%D \item language setting (25/4/2006)
+%D \item use \type{\hyphenatedurl} for \type{\inserturl} (25/4/2006)
+%D \item Add \type{\docitation} to \type{\nocite}(26/4/2006)
+%D \item patents can have numbers, added to bst files (26/4/2006)
+%D \item \type{\docitation} needs a \type{\iftrialtypesetting} (27/4/2006)
+%D \item \type{\filllocalpublist}'s loop is bound by definedness, not resolvedness (27/4/2006)
+%D \item \type{\setuppublications[monthconversion=]} added (15/5/2006)
+%D \item use \type{\undefinedreference} instead of bare question marks (15/5/2006)
+%D \item add grouping around \type{\placepublications} commands (16/5/2006)
+%D \item fix a bug in \type{\cite{<item>}} (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 (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)]}
+%D \item fix the item number in the publication list with 'numbering=yes' (22/6/2006)
+%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 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
+%D in \type{left} stay in effect (12/7/2006)
+%D \item guard added against loading bbl files multiple times (13/7/2006)
+%D \item fix \type{\cite[num]} with compression is on. (14/7/2006)
+%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 saveguarding the list item extraction and reference placement
+%D code (19/7/2006)
+%D \item support \type{\setuppublicationlist[title=\chapter]} (4/8/2006)
+%D \item use the expansion of \type{\headtext{pubs}} (4/8/2006)
+%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 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 used due to a volatile \type{\commalistsize} (25/8/2006).
+%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)
+%D \item Added \type{\setuppublicationlist[maybeyear=off]} by request from
+%D Thomas Schmitz (15/9/2006)
+%D \item Removed some spurious spaces pointed out by willi egger (19/9/2006)
+%D \item Add configuration of bibtex executable name (4/11/2006)
+%D \item Fix numbering=short and numbering=bib (spotted by Matthias W\"achter) (4/11/2006)
+%D \item third attempt to get a correct release (5/11/2006)
+%D \item fix a few missing dots in bibl-num.tex (7/12/2006)
+%D \item Patch for DOI's by Tobias Burnus (17/4/2007)
+%D \item Patch for \type{\insertbiburl} and \type{\insertdoi} for Tobias Burnus (18/4/2007)
+%D \item Added a missing \type{\relax} in \type{\dospecialbibinsert},
+%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 \item Multilingual setups needed another fix (27/10/2008)
+%D \item Two fixes for bibl-apa by Michael Green (27/10/2008)
+%D \item Catalan translation of 'References' (10/11/2008)
+%D \item 'chapter' -> 'chapitre' in bibl-apa-fr (27/11/2008)
+%D \item Run bibtex via os.execute in mkiv modee (01/12/2008)
+%D \item Small correction in bibl-apa's placement of volume
+%D information in articles (05/01/2009)
+%D \item Handle multi-author (more than two) cases in \type{\cite}
+%D (02/03/2009)
+%D \item Suppress a syntax error in \type{cont-xp} mode. The output is
+%D probably not right, though (02/03/2009)
+%D \item Added a \tex{loadmarkfile} at the end, and two new files
+%D from Hans. The \type{t-bib.mkiv} is needed to make the module
+%D work with the new structure code (17/04/2009)
+%D \item Added a patch to \type{t-bib.mkiv} from Hans to make the
+%D cross referencing between multiple citations an
+%D bibliographies work (27/04/2009)
+%D \item Remove a superfluous \type{\unprotect} in t-bib.mkiv (11/05/2009).
+%D \item Patch of incollection in bibl-ams.tex from Xan (08/06/2009).
+%D \item Patch of unpublished in bibl-ams.tex from Xan (22/07/2009).
+%D \item Modified \type{\bibdogetupsometextprefix} so it works for undefined
+%D language labels, from Hans (13/08/2009).
+%D \item Adapt referencing and list insertion to \MKIV. Update some code
+%D to the latest \CONTEXT. Change some names in order to avoid conflicts
+%D with existing core names (like \type {\insertpages}).
+%D \item All constants, variables, message etc.\ are now in the core.
+%D \item Added key: \type {method} (when \type {global}, previous shown entries are
+%D not shown again, when \type {local} they are repeated).
+%D \stopitemize
+%D
+%D \subject{WISHLIST}
+%D
+%D \startitemize
+%D \item link back from publication list to citation
+%D \item export \type {\citation{<cited item>}}
+%D \item support mlbibtex
+%D \item don't load the whole lot, but filter entries instead
+%D \item 9 vs 10, 19 vs 20 ... prevent extra runs when only subtle changes in wd of reference
+%D \stopitemize
+
+\unprotect
+
+\def\biblistname{pubs} % for compatibility
+
+\definelist
+ [pubs]
+
+\setuplist
+ [pubs]
+ [\c!state=\v!start,
+ \c!width=]
+
+\installstructurelistprocessor{pubs:userdata}%
+ {\ctxlua{bibtex.hacks.add(structure.lists.uservalue("\currentlist",\currentlistindex,"bibref"),\currentlistindex)}}
+
+\newcount\bibtexblock \bibtexblock\plusone
+
+%D \macros{bibdoif,bibdoifnot,bibdoifelse}
+%D
+%D Here are a few small helpers that are used a lot in all the typesetting commands
+%D (\type{\bibinsert...}) we will encounter later.
+
+\long\def\bibdoifelse#1%
+ {\@EA\def\@EA\!!stringa\@EA{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\long\def\bibdoifnot#1%
+ {\@EA\def\@EA\!!stringa\@EA{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\bibdoif#1%
+ {\@EA\def\@EA\!!stringa\@EA{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D Unfortunately, \BIBTEX\ is not the best configurable program
+%D around. The names of the commands it parses as well as the \type{.aux}
+%D extension to the file name are both hardwired.
+%D
+%D This means \CONTEXT\ has to write a \LATEX-style auxiliary file, yuk!
+%D The good news is that it can be rather short. We'll just ask
+%D \BIBTEX\ to output the entire database(s) into the \type{bbl} file.
+%D
+%D The \type{\bibstyle} command controls how the \type{bbl} file will
+%D be sorted. The possibilities are:
+%D
+%D \startitemize[packed]
+%D \item by author (+year, title): cont-au.bst
+%D \item by title (+author, year): cont-ti.bst
+%D \item by short key as in abbrev.bst: cont-ab.bst
+%D \item not sorted at all: cont-no.bst
+%D \stopitemize
+
+\newtoks\everysetupbibtex
+
+\unexpanded\def\setupbibtex
+ {\dosingleempty\dosetupbibtex}
+
+\def\dosetupbibtex[#1]%
+ {\let\@@pbdatabase\empty
+ \getparameters[\??pb][#1]%
+ \the\everysetupbibtex}
+
+\def\installbibtexsorter#1#2%
+ {\setvalue{\??pb:\c!sort:#1}{#2}}
+
+\installbibtexsorter\v!no {no}
+\installbibtexsorter\v!author {au}
+\installbibtexsorter\v!title {ti}
+\installbibtexsorter\v!short {ab}
+\installbibtexsorter\empty {no}
+\installbibtexsorter\s!default{no}
+
+\def\thebibtexsorter{\executeifdefined{\??pb:\c!sort:\@@pbsort}\@@pbsort}
+
+\appendtoks
+ \ifx\@@pbdatabase\empty\else
+ \doifmode{*\v!first}{\ctxlua{bibtex.hacks.process { style="\thebibtexsorter", database="\@@pbdatabase" }}}%
+ \fi
+\to \everysetupbibtex
+
+\setupbibtex
+ [\c!sorttype=\v!cite,
+ \c!sort=no]
+
+%D \macros{iftypesetall,ifbibcitecompress}
+%D
+%D The module needs some new \type{\if} statements.
+
+\newtoks\everysetuppublications
+
+\unexpanded\def\setuppublications
+ {\dosingleargument\dosetuppublications}
+
+\def\dosetuppublications[#1]%
+ {\getparameters[\??pb][\c!alternative=,#1]%
+ \doifsomething\@@pbalternative
+ {\readsysfile{bibl-\@@pbalternative.tex}
+ {\showmessage\m!publications{6}{bibl-\@@pbalternative}}
+ {\showmessage\m!publications{1}{bibl-\@@pbalternative}}%
+ \let\@@pbalternative\empty}%
+ \let\setuppublicationlayout\normalsetuppublicationlayout % overloaded in bibl-num ... vadjust needs to be done with option
+ \getparameters[\??pb][#1]% as bibl-* can have set things back
+ \the\everysetuppublications
+ \ignorespaces}
+
+%D We can omit already shown references (\v!global) or use fresh
+%D lists each time (\v!local).
+
+\chardef\bibtexoncemode\plusone % 0=disable, 1=local, 2=global
+
+\appendtoks
+ \doifelse\@@pbmethod\v!local
+ {\chardef\bibtexoncemode\plusone}%
+ {\chardef\bibtexoncemode\plustwo}%
+\to \everysetuppublications
+
+%D Cite lists are compressed, if possible. This is set later on.
+
+\newif\ifbibcitecompress\bibcitecompresstrue
+
+% \appendtoks
+% \processaction
+% [\@@pbnumbering]
+% [ \v!yes=>\let\@@pbinumbercommand\firstofoneargument,
+% \v!no=>\let\@@pbinumbercommand\gobbleoneargument,
+% \v!short=>\def\@@pbinumbercommand##1{\bibgetvars\currentpublicationkey},
+% \v!bib=>\def\@@pbinumbercommand##1{\bibgetvarn\currentpublicationkey},
+% \s!unknown=>\let\@@pbinumbercommand\firstofoneargument]%
+% \to \everysetuppublications
+
+\def\@@pbinumbercommand{\executeifdefined{\??pb:\c!numbercommand:\@@pbnumbering}\firstofoneargument}
+
+\letvalue{\??pb:\c!numbercommand:\v!yes }\firstofoneargument
+\letvalue{\??pb:\c!numbercommand:\v!no }\gobbleoneargument
+\setvalue{\??pb:\c!numbercommand:\v!short}#1{\bibgetvars\currentpublicationkey}
+\setvalue{\??pb:\c!numbercommand:\v!bib }#1{\bibgetvarn\currentpublicationkey}
+
+% to be tested
+%
+% \setvalue{\??pb:\c!numbercommand:\v!short}{\bibgetvars\currentpublicationkey\firstofoneargument}
+% \setvalue{\??pb:\c!numbercommand:\v!bib }{\bibgetvarn\currentpublicationkey\firstofoneargument}
+
+\appendtoks
+ \processaction
+ [\@@pbrefcommand]
+ [\s!default=>\edef\@@citedefault{\@@pbrefcommand},
+ \s!unknown=>\edef\@@citedefault{\@@pbrefcommand}]%
+\to \everysetuppublications
+
+\def\bibleftnumber#1{#1\hfill~}
+
+%D \macros{usepublications}
+%D
+%D After discussing it with Thomas Schmitz it became clear that using external
+%D references makes no sense as one needs to refer to it in special ways and
+%D because similar numbers can be confusing. So, for the moment this is not
+%D supported in \MKIV. (So no: see reference [3-5,9] in "some other document")
+
+\def\usepublications[#1]%
+ {\processcommalist[#1]\dousepublications}
+
+% \def\dousepublications#1%
+% {\doonlyonce{#1.\f!bibextension}
+% {\readfile{#1.\f!bibextension}
+% {\showmessage\m!publications{4}{#1.\f!bibextension}}
+% {\showmessage\m!publications{2}{#1.\f!bibextension}}}}
+
+\def\dousepublications#1%
+ {\doonlyonce{#1.\f!bibextension}{\dodousepublications{#1}}}
+
+\def\dodousepublications#1%
+ {\let\@@savedpar\par
+ \let\par\ignorespaces
+ \ifhmode\kern\zeropoint\fi
+ \readfile{#1.\f!bibextension}
+ {\showmessage\m!publications{4}{#1.\f!bibextension}}
+ {\showmessage\m!publications{2}{#1.\f!bibextension}}%
+ \ifhmode\removeunwantedspaces\fi
+ \let\par\@@savedpar}
+
+%D \macros{setuppublicationlist}
+%D
+%D This will be the first command in (\BIBTEX-generated) \type{bbl}
+%D files. `samplesize' is a sample value (in case of \BIBTEX-generated
+%D files, this will be the longest `short' key). `totalnumber'
+%D is the total number of entries that will follow in this
+%D file.
+%D
+%D Both values are only needed for the label calculation
+%D if `autohang' is `true', so by default the command is
+%D not even needed, and therefore I saw no need to give
+%D it it's own system variable and it just re-uses \type{pb}.
+
+\def\publicationlistparameter#1{\csname\??pv:l:#1\endcsname}
+
+\unexpanded\def\setuppublicationlist
+ {\dosingleempty\dosetuppublicationlist}
+
+\def\dosetuppublicationlist[#1]%
+ {\getparameters[\??pv:l:][#1]%
+ \setuplist[pubs][\c!samplesize={AA99},\c!alternative=a,\c!interaction=,\c!pagenumber=\v!no,#1,\c!command=]}
+
+\unexpanded\def\setuppublicationlayout[#1]#2%
+ {\setvalue{\??pv:l:#1}{#2}}
+
+\let\normalsetuppublicationlayout\setuppublicationlayout
+
+\setuppublicationlist[\c!title=,\c!command=\dospecialbibinsert,\c!maybeyear=\v!on]
+
+%D \macros{bibalternative}
+%D
+%D A nice little shorthand that will be used so we don't have to
+%D key in the weird \type{\@@pv} parameter names all the time.
+
+\def\bibalternative#1%
+ {\csname\??pv\@@currentalternative#1\endcsname}
+
+%D \macros{simplebibdef,bibcommandlist}
+%D
+%D \type{\simplebibdef} defines \type{bib@#1}, which in turn will
+%D use one argument that is stored in \type{@@pb@#1}.
+%D
+%D \type{\simplebibdef} also defines \type{bibinsert#1}, which can be
+%D used in the argument of \type{\setuppublicationlayout} to fetch
+%D one of the \type{@@pb@} data entries. \type{bibinsert#1} then has
+%D three arguments: \type{#1} are commands to be executed before the
+%D data, \type{#2} are commands to be executed after the data, and
+%D \type{#3} are commands to be executed if the data is not found.
+%D
+%D \type{\bibcommandlist} is the list of commands that is affected
+%D by this approach. Later on, it will be used to do a series
+%D of assignments from \type{#1} to \type{bib@#1}: e.g
+%D \type{\title} becomes \type{\bib@title} when used within
+%D a publication.
+
+\newtoks\initializebibdefinitions % we need to prevent clashes
+
+\def\simplebibdef#1% hh: funny expansion ?
+ {\@EA\long\@EA\def\csname bib@#1\endcsname##1%
+ {\setvalue{\??pb @#1}{##1}\ignorespaces}%
+ \expandafter \appendtoks
+ \expandafter\let\csname insert#1\expandafter\endcsname\csname bibinsert#1\endcsname
+ \to \initializebibdefinitions
+ \@EA\unexpanded\@EA\def\csname bibinsert#1\endcsname##1##2##3%
+ {\@EA\bibdoifelse\@EA{\csname\??pb @#1\endcsname}{##1\csname\??pb @#1\endcsname##2}{##3}}}
+
+\def\bibcommandlist
+ {abstract, annotate, arttitle, assignee, bibnumber, bibtype, biburl, chapter, city,
+ comment, country, day, dayfiled, doi, edition, eprint, howpublished, isbn, issn,
+ issue, journal, keyword, keywords, lastchecked, month, monthfiled, names, nationality,
+ note, notes, organization, pages, pubname, pubyear, revision, series, size, thekey,
+ title, volume, yearfiled}
+
+\processcommacommand[\bibcommandlist]\simplebibdef
+
+% \def\bibinsertdoi#1#2#3%
+% {\begingroup
+% \bibdoifelse{\@@pb@doi}%
+% {\edef\ascii{\detokenize\expandafter{\@@pb@doi}}% probably not ok, to less expansion
+% #1\expanded{\bibgotoDOI{\@@pb@thekey}{\ascii}}#2}{#3}%
+% \endgroup}
+%
+% \def\bibinsertbiburl#1#2#3%
+% {\begingroup
+% \bibdoifelse{\@@pb@biburl}%
+% {\edef\ascii{\detokenize\expandafter{\@@pb@biburl}}% probably not ok, to less expansion
+% #1\expanded{\bibgotoURL{\@@pb@thekey}{\ascii}}#2}{#3}%
+% \endgroup}
+
+\def\bibinsertdoi#1#2#3% let's see how this fails
+ {\bibdoifelse{\@@pb@doi}{#1\expanded{\bibgotoDOI{\@@pb@thekey}{\@@pb@doi}}#2}{#3}}
+
+\def\bibinsertbiburl#1#2#3% let's see how this fails
+ {\bibdoifelse{\@@pb@biburl}{#1\expanded{\bibgotoURL{\@@pb@thekey}{\@@pb@biburl}}#2}{#3}}
+
+\def\bibinsertmonth#1#2#3%
+ {\bibdoifelse\@@pb@month
+ {#1\doifnumberelse\@@pb@month
+ {\doifconversiondefinedelse\@@pbmonthconversion
+ {\convertnumber\@@pbmonthconversion\@@pb@month}{\@@pb@month}}%
+ {\@@pb@month}#2}%
+ {#3}}
+
+\appendtoks
+ \let\inserturl \bibinsertbiburl % for backward compat.
+ \let\inserttype\bibinsertbibtype % for backward compat.
+\to\initializebibdefinitions
+
+\def\newbibfield[#1]%
+ {\simplebibdef{#1}%
+ \edef\bibcommandlist{\bibcommandlist,#1}}
+
+%D \macros{complexbibdef,specialbibinsert}
+%D
+%D The commands \type{\artauthor}, \type{\author} and
+%D \type{\editor} are more complex than the other commands.
+%D Their argument lists have this form:
+%D
+%D \type{\author[junior]{firstnames}[inits]{von}{surname}}
+%D
+%D (bracketed stuff is optional)
+%D
+%D And not only that, but there also might be more than one of each of
+%D these commands. This is why a special command is needed to insert
+%D them, as well as one extra counter for each command.
+
+% todo: instead of \getvalue{bla@num} in specs we should do
+% \bibentrynum{bla} so that we can create a better namespace
+
+%D All of these \type{\@EA}'s and \type{\csnames} make this code
+%D look far more complex than it really is. For example, the argument
+%D \type{author} defines the macro \type{\bib@author} to do two
+%D things: increment the counter \type{\author@num} (let's say to 2)
+%D and next store it's arguments in the macro \type{\@@pb@author2}.
+%D And it defines \type{\bibinsertauthors} to expand into
+%D \starttyping
+%D \specialbibinsert{author}{\author@num}{<before>}{<after>}{<not>}
+%D \stoptyping
+
+% \def\docomplexbibdef#1%
+% {\def\currentype{#1}%
+% \dosingleempty\dodocomplexbibdef}
+
+% \def\dodocomplexbibdef[#1]#2%
+% {\def\firstarg{#1}\def\secondarg{#2}%
+% \dosingleempty\dododocomplexbibdef}
+
+% \def\dododocomplexbibdef[#1]#2#3%
+% {\@EA\increment\csname\currentype @num\endcsname
+% \setevalue{\??pb @\currentype\csname \currentype @num\endcsname}%
+% {{\secondarg}{#2}{#3}{#1}{\firstarg}}\ignorespaces}
+
+\def\docomplexbibdef#1%
+ {\dodoubleempty\dodocomplexbibdef[#1]}
+
+\def\dodocomplexbibdef[#1][#2]#3%
+ {\doquadrupleempty\dododocomplexbibdef[#1][#2][#3]}
+
+\def\dododocomplexbibdef[#1][#2][#3][#4]#5#6%
+ {\@EA\increment\csname#1@num\endcsname % todo: bib in name
+ \setevalue{\??pb @#1\csname#1@num\endcsname}{{#3}{#5}{#6}{#4}{#2}}\ignorespaces}
+
+\def\complexbibdef#1%
+ {\@EA\newcounter\csname #1@num\endcsname
+ \@EA\def\csname bib@#1\endcsname{\docomplexbibdef{#1}}%
+ \expandafter \appendtoks
+ \expandafter\let\csname insert#1s\expandafter\endcsname\csname bibinsert#1s\endcsname
+ \to \initializebibdefinitions
+ \@EA\def\csname bibinsert#1s\endcsname##1##2##3{\specialbibinsert{#1}{\csname #1@num\endcsname}{##1}{\unskip ##2}{##3}}}
+
+\processcommalist[author,artauthor,editor]\complexbibdef
+
+%D Another level of indirection is needed to control the
+%D typesetting of all of these arguments.
+
+\newcount\etallimitcounter
+\newcount\etaldisplaycounter
+\newcount\todocounter
+
+\def\specialbibinsert#1#2#3#4#5%
+ {\bgroup
+ \ifnum#2>\zerocount
+ \etallimitcounter =0\bibalternative{#1etallimit}\relax
+ \etaldisplaycounter=0\bibalternative{#1etaldisplay}\relax
+ \ifnum #2>\etallimitcounter
+ \todocounter\etaldisplaycounter
+ % just in case ...
+ \ifnum\todocounter>\etallimitcounter
+ \todocounter\etallimitcounter
+ \fi
+ \else
+ \todocounter#2\relax
+ \fi
+ \ifnum\todocounter>\zerocount
+ % find the current author list
+ \let\templist\empty
+ \dorecurse{#2}
+ {\scratchtoks\@EA\@EA\@EA{\csname\??pb @#1\recurselevel\endcsname}%
+ \edef\templist{\ifx\templist\empty\else\templist,\fi\the\scratchtoks}}%
+ #3\publicationlistparameter\c!command{#1}{\todocounter}{\templist}#4\relax
+ \else
+ #5%
+ \fi
+ \else
+ #5%
+ \fi
+ \egroup}
+
+%D This macro does the hard work of inserting a list of people in the
+%D output, with proper regard of all the inbetween strings that can
+%D arise depending on length of the list of people.
+
+%D \#1 = type
+%D \#2 = number of items to be typeset
+%D \#3 = commacommand containing authors
+
+% \def\dospecialbibinsert#1#2#3%
+% {\getcommacommandsize[#3]%
+% \scratchcounter\zerocount
+% \def\processauthoritem##1%
+% {\advance\scratchcounter\plusone
+% \ifnum\numexpr\scratchcounter-\plusone\relax<#2\relax
+% \publicationlistparameter{#1}##1%
+% \ifnum\scratchcounter=#2\relax
+% \ifnum\etallimitcounter<\commalistsize\relax
+% \bibalternative{#1etaltext}%
+% \fi
+% \else\ifnum\numexpr\scratchcounter+\plusone\relax=#2\relax
+% \ifnum\commalistsize>\plustwo
+% \bibalternative\c!finalnamesep
+% \else
+% \bibalternative\c!lastnamesep
+% \fi
+% \else
+% \bibalternative\c!namesep
+% \fi\fi
+% \fi}%
+% \processcommacommand[#3]\processauthoritem}
+
+\def\doprocessauthoritem#1#2#3%
+ {\advance\scratchcounter\plusone
+ \ifnum\numexpr\scratchcounter-\plusone\relax<#2\relax
+ \publicationlistparameter{#1}#3%
+ \ifnum\scratchcounter=#2\relax
+ \ifnum\etallimitcounter<\commalistsize\relax
+ \bibalternative{#1etaltext}%
+ \fi
+ \else\ifnum\numexpr\scratchcounter+\plusone\relax=#2\relax
+ \ifnum\commalistsize>\plustwo
+ \bibalternative\c!finalnamesep
+ \else
+ \bibalternative\c!lastnamesep
+ \fi
+ \else
+ \bibalternative\c!namesep
+ \fi\fi
+ \fi}
+
+\def\dospecialbibinsert#1#2#3%
+ {\getcommacommandsize[#3]%
+ \scratchcounter\zerocount
+ \processcommacommand[#3]{\doprocessauthoritem{#1}{#2}}}
+
+%D \macros{invertedauthor,normalauthor,invertedshortauthor,normalshortauthor}
+%D
+%D Just some commands that can be used in \type{\setuppublicationparameters}
+%D If you want to write an extension to the styles, you might
+%D as well define some of these commands yourself.
+%D
+%D The argument list has been reordered here, and the meanings
+%D are:
+%D
+%D \startlines
+%D \type{#1} firstnames
+%D \type{#2} von
+%D \type{#3} surname
+%D \type{#4} inits
+%D \type{#5} junior
+%D \stoplines
+
+\def\normalauthor#1#2#3#4#5%
+ {\bibdoif{#1}{#1\bibalternative\c!firstnamesep}%
+ \bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!surnamesep#5\unskip}}
+
+\def\normalshortauthor#1#2#3#4#5%
+ {\bibdoif{#4}{#4\bibalternative\c!firstnamesep}%
+ \bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!surnamesep#5\unskip}}
+
+\def\invertedauthor#1#2#3#4#5%
+ {\bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!juniorsep#5}%
+ \bibdoif{#1}{\bibalternative\c!surnamesep#1\unskip}}
+
+\def\invertedshortauthor#1#2#3#4#5%
+ {\bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ #3%
+ \bibdoif{#5}{\bibalternative\c!juniorsep#5}%
+ \bibdoif{#4}{\bibalternative\c!surnamesep#4\unskip}}
+
+%D \macros{clearbibitem,clearbibitemtwo,bibitemdefs}
+%D
+%D These are used in \type{\typesetapublication} to do
+%D initializations and cleanups.
+
+\def\clearbibitem#1{\setvalue{\??pb @#1}{}}%
+
+% \def\clearbibitemtwo#1%
+% {\letvalue{#1@num}\!!zerocount
+% \doloop
+% {\doifdefinedelse{\??pb @#1\recurselevel}
+% {\letvalue{\??pb @#1\recurselevel}\empty} % why not undefined?
+% {\exitloop}}}
+
+% \def\clearbibitemtwo#1%
+% {\letvalue{#1@num}\!!zerocount
+% \doloop
+% {\ifcsname\??pb @#1\recurselevel\endcsname
+% \expandafter\let\csname\??pb @#1\recurselevel\undefined
+% \else
+% \exitloop
+% \fi}}
+
+\def\clearbibitemtwo#1% is this reset really needed? after all we reset the counter and we are local
+ {%\dofastrecurse\plusone{\csname#1@num\endcsname}\plusone{\expandafter\let\csname\??pb @#1\recurselevel\undefined}%
+ \letvalue{#1@num}\!!zerocount}
+
+\def\bibitemdefs#1%
+ {\@EA\let\csname#1\expandafter\endcsname\csname bib@#1\endcsname}
+
+\def\presetbibvariables % make a fast resetter (toks)
+ {\processcommacommand[\bibcommandlist,crossref]\clearbibitem
+ \processcommalist [artauthor,author,editor]\clearbibitemtwo
+ \processcommacommand[\bibcommandlist]\bibitemdefs
+ \processcommalist [artauthor,author,editor,crossref]\bibitemdefs}
+
+%D \macros{startpublication}
+%D
+%D We are coming to the end of this module, to the macros that
+%D do typesetting and read the \type{bbl} file.
+
+\newcount\bibtexcounter
+
+%D Just a \type{\dosingleempty} is the most friendly
+%D of doing this: there need not even be an argument
+%D to \type{\startpublication}. Of course, then there
+%D is no key either, and it had better be an
+%D article (otherwise the layout will be all screwed up).
+%D
+%D Only specifying the key in the argument is also
+%D legal. In storing this stuff into macros, some trickery with
+%D token registers is needed to fix the expansion problems. Even so,
+%D this appears to not always be 100\% safe, so people are
+%D urgently advised to use \ETEX\ instead of traditional \TEX.
+%D
+%D In \ETEX, all expansion problems are conveniently solved by
+%D the primitive \type{\protected}. To put that another way:
+%D
+%D It's not a bug in this module if it does not appear in \ETEX!
+%D
+%D Now prohibits comments, so % can be used for urls
+
+\unexpanded\def\startpublication
+ {\begingroup
+ \catcode`\%=\othercatcode
+ \dosingleempty\dostartpublication}
+
+\let\stoppublication\relax
+
+% this is rather memory hungry; some day i will rewrite this so that
+% we use the database instead
+
+%D \macros{doifbibreferencefoundelse}
+%D
+%D Some macros to fetch the information provided by
+%D \type{\startpublication}.
+
+% we can consider a faster variant in the bbl file; we can also consider
+% storing the keys in lua (and then do more in lua) and use calls to
+% fetch the variables
+
+% hm, we can store at the lua end ...
+
+\long\def\dostartpublication[#1]#2\stoppublication
+ {\doifassignmentelse{#1}%
+ {\getparameters[\??pb][k=\s!unknown,t=article,n=,s=,a=,y=,o=,u=,#1]}%
+ {\getparameters[\??pb][k=#1,t=article,n=,s=,a=,y=,o=,u=]}%
+ \ctxlua{bibtex.hacks.register("\@@pbk")}%
+ \setxvalue{pbd:\@@pbk}##1{\noexpand\ifcase##1\noexpand\or
+ \@@pbk\noexpand\or
+ \@@pba\noexpand\or
+ \@@pby\noexpand\or
+ \@@pbs\noexpand\or
+ \@@pbn\noexpand\or
+ \@@pbt\noexpand\or
+ \@@pbo\noexpand\or
+ \@@pbu\noexpand\or
+ \normalunexpanded{#2}\noexpand\fi}%
+ \endgroup
+ \ignorespaces}
+
+\def\bibgetvark#1{\csname pbd:#1\endcsname\plusone }
+\def\bibgetvara#1{\csname pbd:#1\endcsname\plustwo }
+\def\bibgetvary#1{\csname pbd:#1\endcsname\plusthree}
+\def\bibgetvars#1{\csname pbd:#1\endcsname\plusfour }
+\def\bibgetvarn#1{\csname pbd:#1\endcsname\plusfive }
+\def\bibgetvart#1{\csname pbd:#1\endcsname\plussix }
+\def\bibgetvaro#1{\csname pbd:#1\endcsname\plusseven}
+\def\bibgetvaru#1{\csname pbd:#1\endcsname\pluseight}
+\def\bibgetvard#1{\csname pbd:#1\endcsname\plusnine }
+
+\def\doifbibreferencefoundelse#1%
+ {\preloadbiblist
+ \doifdefinedelse{pbd:#1}
+ \firstoftwoarguments
+ {\showmessage\m!publications{5}{#1 is unknown}\secondoftwoarguments}}
+
+%D \macros{bib@crossref}
+%D
+%D \type{\crossref} is used in database files to point to another
+%D entry. Because of this special situation, it has to be defined
+%D separately. Since this command will not be seen until at
+%D \type{\placepublications}, it may force extra runs. The same is
+%D true for \type{\cite} commands inside of publications.
+
+% used in bib self
+
+\def\bib@crossref#1% called via \csname \endcsname
+ {\setvalue{\??pb @crossref}{#1}\ignorespaces}
+
+\def\bibinsertcrossref#1#2#3%
+ {\bibdoifelse\@@pb@crossref{#1\cite[\@@pb@crossref]#2}{#3}}
+
+\appendtoks\let\insertcrossref\bibinsertcrossref\to\initializebibdefinitions
+
+%D The next macro is needed because the number command of the
+%D publist sometimes needs to fetch something from the current
+%D item (like the 'short' key). For this, the ID of the current
+%D item is passed in the implict parameter \type{\currentpublicationkey}
+
+\def\doprocessbibtexentry#1{\typesetapublication{#1}}
+
+\def\typesetpubslist
+ {\dobeginoflist
+ % \the\initializebibdefinitions % COMMENTED
+ \edef\currentlist{pubs}%
+ \doif{\listparameter\c!criterium}\v!cite{\setuplist[pubs][\c!criterium=\v!here]}%
+ \ctxlua{bibtex.hacks.reset(\number\bibtexoncemode)}%
+ \placestructurelist{pubs}{\listparameter\c!criterium}{\listparameter\c!number}%
+ \ctxlua{bibtex.hacks.flush("\@@pbsorttype")}%
+ \doendoflist}
+
+\newif\ifinpublist
+
+\def\initializepubslist
+ {\def\currentlist{pubs}%
+ \edef\@@pbnumbering{\@@pbnumbering}%
+ \doifelse\@@pbautohang\v!yes
+ {\ifx\@@pbnumbering\v!short
+ \setbox\scratchbox\hbox{\@@pbnumbercommand{\listparameter\c!samplesize}}%
+ \else
+ \setbox\scratchbox\hbox{\@@pbnumbercommand{\ctxlua{tex.write(structure.lists.size())}}}%
+ \fi
+ \edef\publistnumberbox{\hbox to \the\wd\scratchbox}%
+ \expanded{\setuplist[pubs][\c!width=\the\wd\scratchbox,\c!distance=\zeropoint]}%
+ \ifx\@@pbnumbering\v!short
+ \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvars\currentpublicationkey}}}%
+ \else\ifx\@@pbnumbering\v!bib
+ \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvarn\currentpublicationkey}}}%
+ \else
+ \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{##1}}}%
+ \fi\fi}
+ {\doifelsenothing{\listparameter\c!width}
+ {\let \publistnumberbox \hbox}
+ {\edef\publistnumberbox{\hbox to \listparameter\c!width}}%
+ \ifx\@@pbnumbering\v!short
+ \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvars\currentpublicationkey}}}%
+ \else\ifx\@@pbnumbering\v!bib
+ \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{\bibgetvarn\currentpublicationkey}}}%
+ \else
+ \def\@@pblimitednumber##1{\publistnumberbox{\@@pbnumbercommand{##1}}}%
+ \fi\fi}%
+ \ifx\@@pbnumbering\v!no
+ \setuplist[pubs][\c!numbercommand=,\c!symbol=\v!none,\c!textcommand=\outdented]%
+ \else
+ \setuplist[pubs][\c!numbercommand=\@@pblimitednumber]%
+ \fi
+ \doifelse{\publicationlistparameter\c!maybeyear}{\v!off}{\def\maybeyear##1{}}{\def\maybeyear##1{##1}}%
+ \forgetall}
+
+\def\outdented#1% move to supp-box ?
+ {\hskip-\hangindent#1\relax}
+
+%D The full list of publications
+
+\def\completepublications
+ {\dosingleempty\docompletepublications}
+
+\def\docompletepublications[#1]%
+ {\begingroup
+ \setuplist[pubs][\c!criterium=\v!previous,#1]
+ \doifelsenothing{\publicationlistparameter\c!title}
+ {\systemsuppliedchapter[pubs]{\headtext{pubs}}}
+ {\normalexpanded{\systemsuppliedchapter[pubs]{\publicationlistparameter\c!title}}}%
+ \dodoplacepublications}
+
+%D And the portion with the entries only.
+
+\def\bibrefprefix{\number\bibtexblock:}
+
+\unexpanded\def\placepublications
+ {\dosingleempty\doplacepublications}
+
+\def\doplacepublications[#1]%
+ {\begingroup
+ \setuplist[pubs][\c!criterium=\v!previous,#1]%
+ \dodoplacepublications}
+
+\def\dodoplacepublications
+ {\determinelistcharacteristics[pubs]%
+ \initializepubslist
+ \doifnot{\namedlistparameter{pubs}\c!option}\v!continue
+ {\global\bibtexcounter\zerocount}%
+ \inpublisttrue
+ \typesetpubslist
+ \inpublistfalse
+ \endgroup
+ \global\advance\bibtexblock\plusone}
+
+%D \subsubject{What's in a publication}
+
+\unexpanded\def\typesetapublication#1%
+ {\doifsomething{#1}
+ {\doifelse{\namedlistparameter{pubs}\c!criterium}\v!all
+ {\doplacepublicationindeed{#1}}%
+ {\ctxlua{bibtex.hacks.doifalreadyplaced("#1")}
+ {}
+ {\doplacepublicationindeed{#1}}}%
+ }}
+
+% for the moment we don't access the data directly but we will do that
+% later when we get away from storing the data and only deal with
+% references
+
+% we'll define proper handlers later
+
+\def\doplacepublicationindeed#1%
+ {\doifbibreferencefoundelse{#1}
+ {\global\advance\bibtexcounter\plusone
+ \def\currentpublicationkey{#1}%
+ \ctxlua{bibtex.hacks.registerplaced("#1")}%
+ \dodolistelement
+ {pubs}%
+ {}%
+ {\number\bibtexcounter}%
+ {\expanded{\reference[\bibrefprefix#1]{\number\bibtexcounter}}%
+ \strut\dotypesetapublication{#1}\strut}%
+ {}%
+ {}}
+ {}} % invalid
+
+\def\dotypesetapublication#1%
+ {\bgroup
+ \the\initializebibdefinitions % NEW
+ \def\@@currentalternative{:l:}%
+ \presetbibvariables
+ \let\biblanguage\empty
+ \ignorespaces
+ \bibgetvard{#1}%
+ \removeunwantedspaces
+ \ignorespaces
+ \bibalternative{\bibgetvart{#1}}%
+ \removeunwantedspaces
+ \egroup}
+
+%D An few afterthoughts:
+
+\let\maybeyear\gobbleoneargument
+\let\noopsort \gobbleoneargument
+
+%D This is the result of bibtex's `language' field.
+
+\def\setbiblanguage#1#2{\setvalue{\??pb\s!language#1}{#2}}
+
+\def\lang#1%
+ {\edef\biblanguage{#1}%
+ \ifcsname\??pb\s!language#1\endcsname
+ \language[\getvalue{\??pb\s!language#1}]%
+ \fi
+ \ignorespaces}
+
+%D \subject{Citations}
+
+%D \macros{cite,bibref}
+%D
+%D The indirection with \type{\dobibref} allows \LATEX\ style
+%D \type{\cite} commands with a braced argument (these might appear
+%D in included data from the \type{.bib} file).
+
+% \unexpanded\def\cite
+% {\doifnextoptionalelse\dodocite\dobibref}
+% \def\dobibref#1%
+% {\docite[#1][]}
+% \def\dodocite[#1]%
+% {\startstrictinspectnextcharacter
+% \dodoubleempty\dododocite[#1]}
+% \def\dododocite % [#1][#2]
+% {\stopstrictinspectnextcharacter
+% \docite}
+
+\unexpanded\def\cite
+ {\strictdoifnextoptionalelse\dodocite\dobibref}
+
+\def\dobibref#1%
+ {\docite[#1][]}
+
+\def\dodocite[#1]%
+ {\strictdoifnextoptionalelse{\docite[#1]}{\docite[#1][]}}
+
+\def\docite[#1][#2]%
+ {\begingroup
+ \doifelsenothing{#2}\secondargumentfalse\secondargumenttrue
+ \ifsecondargument
+ \dowhatevercite{#1}{#2}%
+ \else
+ \donumberedcite{#1}%
+ \fi
+ \endgroup}
+
+\def\dowhatevercite#1#2%
+ {\processcommalist[#2]\docitation
+ \setupinteraction[\c!style=]%
+ \doifassignmentelse
+ {#1}%
+ {\getparameters[LO][\c!alternative=,\c!extras=,#1]%
+ \edef\@@currentalternative{\LOalternative}%
+ \ifx\@@currentalternative\empty
+ \edef\@@currentalternative{\@@citedefault}%
+ \fi
+ \ifx\LOextras\empty
+ \setupcite[\@@currentalternative][#1]%
+ \else
+ \expandafter\ifx\csname LOright\endcsname \relax
+ \edef\LOextras{{\LOextras\bibalternative\c!right}}%
+ \else
+ \edef\LOextras{{\LOextras\LOright}}%
+ \fi
+ \expanded{\setupcite[\@@currentalternative][#1,\c!right=\LOextras]}%
+ \fi}%
+ {\def\@@currentalternative{#1}}%
+ \doifelsevalue{@@pv\@@currentalternative\c!compress}\v!no\bibcitecompressfalse\bibcitecompresstrue
+ \getvalue{bib\@@currentalternative ref}[#2]}
+
+\def\donumberedcite#1%
+ {\processcommalist[#1]\docitation
+ \setupinteraction[\c!style=]%
+ \edef\@@currentalternative{\@@citedefault}%
+ \doifelsevalue{@@pv\@@currentalternative\c!compress}\v!no\bibcitecompressfalse\bibcitecompresstrue
+ \getvalue{bib\@@citedefault ref}[#1]}
+
+%D \macros{nocite}
+
+\def\nocite[#1]%
+ {\processcommalist[#1]\docitation}
+
+%D \macros{setupcite}
+
+\unexpanded\def\setupcite{\dodoubleempty\dosetupcite}
+
+\def\dosetupcite[#1][#2]%
+ {\ifsecondargument
+ \def\dodosetupcite##1{\getparameters[\??pv##1][#2]}%
+ \processcommalist[#1]\dodosetupcite
+ \else % default case
+ \getparameters[\??pv\@@citedefault][#1]%
+ \fi}
+
+%D Low-level stuff
+
+\def\getcitedata#1[#2]#3[#4]#5to#6%
+ {\bgroup
+ \dofetchapublication{#4}%
+ \doifdefinedelse{\??pb @bib#2}%
+ {\xdef#6{\getvalue{\??pb @bib#2}}}%
+ {\xdef#6{\getvalue{\??pb @#2}}}%
+ \egroup}
+
+\def\dofetchapublication#1%
+ {\def\currentpublicationkey{#1}%
+ \presetbibvariables
+ \ignorespaces\bibgetvard{#1}}
+
+\def\docitation#1%
+ {\iftrialtypesetting \else
+ \expanded{\writedatatolist[pubs][bibref=#1]}%
+ \fi}
+
+\let\addthisref\gobbleoneargument % keep this for compatibility
+
+%D \macros{ixbibauthoryear,thebibauthors,thebibyears}
+%D
+%D If compression of \type{\cite}'s argument expansion is on,
+%D the macros that deal with authors and years call this internal
+%D command to do the actual typesetting.
+%D
+%D Two entries with same author but with different years may
+%D be condensed into ``Author (year1,year2)''. This is about the
+%D only optimization that makes sense for the (author,year)
+%D style of citations (years within one author have to be unique
+%D anyway so no need to test for that, and ``Author1, Author2 (year)''
+%D creates more confusion than it does good).
+%D
+%D In the code below,
+%D the macro \type{\thebibauthors} holds the names of the alternative
+%D author info fields for the current list. This is a commalist,
+%D and \type{\thebibyears} holds the (collection of) year(s) that go with
+%D this author (possibly as a nested commalist).
+%D
+%D There had better be an author for all cases, but there
+%D does not have to be year info always. \type{\thebibyears} is
+%D pre-initialized because this makes the insertion macros simpler.
+%D
+%D In `normal' \TeX, of course there are expansion problems again.
+
+\def\ixbibauthoryear#1#2#3#4%
+ {\bgroup
+ \gdef\ixlastcommand {#4}%
+ \gdef\ixsecondcommand{#3}%
+ \gdef\ixfirstcommand {#2}%
+ \glet\thebibauthors \empty
+ \glet\thebibyears \empty
+ \getcommalistsize[#1]%
+ \ifbibcitecompress
+ \dorecurse\commalistsize{\xdef\thebibyears{\thebibyears,}}%
+ \processcommalist[#1]\docompressbibauthoryear
+ \else
+ \processcommalist[#1]\donormalbibauthoryear
+ \fi
+ \egroup
+ \dobibauthoryear}
+
+%D \macros{dodobibauthoryear}
+%D
+%D This macro only has to make sure that the lists
+%D \type{\thebibauthors} and \type{\thebibyears} are printed.
+
+\def\dobibauthoryear
+ {\scratchcounter\zerocount
+ \getcommacommandsize[\thebibauthors]%
+ \edef\authorcount{\commalistsize}%
+ \@EA\processcommalist\@EA[\thebibauthors]\dodobibauthoryear}
+
+\def\dodobibauthoryear#1%
+ {\advance\scratchcounter\plusone
+ \edef\wantednumber{\the\scratchcounter}%
+ \getfromcommacommand[\thebibyears][\wantednumber]%
+ \@EA\def\@EA\currentbibyear\@EA{\commalistelement}%
+ \setcurrentbibauthor{#1}%
+ \ifnum\scratchcounter=\plusone
+ \ixfirstcommand
+ \else\ifnum \scratchcounter=\authorcount\relax
+ \ixlastcommand
+ \else
+ \ixsecondcommand
+ \fi\fi}
+
+\def\setcurrentbibauthor#1%
+ {\getcommacommandsize[#1]%
+ \ifcase\commalistsize
+ % anonymous?
+ \let\currentbibauthor\empty
+ \or
+ \def\currentbibauthor{#1}%
+ \or
+ \expanded{\docurrentbibauthor#1}%
+ \else
+ \handlemultiplebibauthors{\commalistsize}{#1}%
+ \fi}
+
+\newcount\citescratchcounter
+
+\def\handlemultiplebibauthors#1#2%
+ {\citescratchcounter\zerocount
+ \let\currentbibauthor\empty
+ \def\bibprocessauthoritem##1%
+ {\advance\citescratchcounter\plusone
+ \ifnum \citescratchcounter=#1\relax
+ \edef\currentbibauthor{\currentbibauthor##1}%
+ \else\ifnum\numexpr\citescratchcounter+\plusone\relax=#1\relax
+ \edef\currentbibauthor{\currentbibauthor##1\bibalternative{andtext}}%
+ \else
+ \edef\currentbibauthor{\currentbibauthor##1\bibalternative{namesep}}%
+ \fi\fi}%
+ \processcommalist[#2]\bibprocessauthoritem}
+
+\setupcite
+ [author,authoryear,authoryears]
+ [\c!namesep={, }]
+
+%D This discovery of authoretallimit is not the best one,
+%D but it will do for now.
+
+\def\docurrentbibauthor#1,#2%
+ {\doifemptyelse{#2}
+ {\def\currentbibauthor{#1\bibalternative{otherstext}}}
+ {\@EA\ifx\csname\??pv\@@currentalternative authoretallimit\endcsname\relax
+ \edef\currentbibauthor{#1\bibalternative{andtext}#2}%
+ \else
+ \edef\currentbibauthor{#1%
+ \ifcase0\bibalternative{authoretallimit}\relax\or
+ \bibalternative{otherstext}\else\bibalternative{andtext}#2\fi}%
+ \fi}}
+
+%D This is not the one Hans made for me, because I need a global
+%D edef, and the \type{\robustdoifinsetelse} doesn't listen to
+%D \type{\doglobal }
+
+\def\robustaddtocommalist#1#2% {item} \cs
+ {\robustdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\xdef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+%D \macros{donormalbibauthoryear}
+%D
+%D Now we get to the macros that fill the two lists.
+%D The `simple' one really is quite simple.
+
+\def\donormalbibauthoryear#1%
+ {\def\myauthor{Xxxxxxxxxx}%
+ \def\myyear{0000}%
+ \doifbibreferencefoundelse{#1}
+ {\def\myauthor{{\bibgetvara{#1}}}%
+ \def\myyear {\bibgetvary{#1}}}%
+ {}%
+ \@EA\doglobal\@EA\appendtocommalist\@EA{\myauthor}\thebibauthors
+ \@EA\doglobal\@EA\appendtocommalist\@EA{\myyear }\thebibyears}
+
+%D \macros{docompressbibauthoryear}
+%D
+%D So much for the easy parts. Nothing at all will be done if
+%D the reference is not found or the reference does not contain
+%D author data. No questions marks o.s.s. (to be fixed later)
+
+\def\docompressbibauthoryear#1%
+ {\def\myauthor{Xxxxxxxxxx}%
+ \def\myyear {0000}%
+ \doifbibreferencefoundelse{#1}
+ {\xdef\myauthor{\bibgetvara{#1}}%
+ \xdef\myyear {\bibgetvary{#1}}}
+ {}%
+ \ifx\myauthor\empty\else
+ \checkifmyauthoralreadyexists
+ \findmatchingyear
+ \fi}
+
+%D two temporary counters. One of these two can possibly be replaced
+%D by \type{\scratchcounter}.
+
+\newcount\bibitemcounter
+\newcount\bibitemwanted
+
+%D The first portion is simple enough: if this is the very first author
+%D it is quite straightforward to add it. \type{\bibitemcounter} and
+%D \type{\bibitemwanted} are needed later to insert the year
+%D information in the correct item of \type{\thebibyears}
+
+\def\checkifmyauthoralreadyexists
+ {\doifemptyelsevalue{thebibauthors}
+ {\global\bibitemwanted \plusone
+ \global\bibitemcounter\plusone
+ \xdef\thebibauthors{{\myauthor}}}
+ {% the next weirdness is because according to \getcommalistsize,
+ % the length of \type{[{{},{}}]} is 2.
+ \@EA\getcommalistsize\@EA[\thebibauthors,]%
+ \global\bibitemcounter\numexpr\commalistsize+\minusone\relax
+ \global\bibitemwanted \zerocount
+ \processcommacommand[\thebibauthors]\docomparemyauthor}}
+
+%D The outer \type{\ifnum} accomplishes the addition of
+%D a new author to \type{\thebibauthors}. The messing about with
+%D the two counters is again to make sure that \type{\thebibyears}
+%D will be updated correctly.If the author {\it was} found,
+%D the counters will stay at their present values and everything
+%D will be setup properly to insert the year info.
+
+\def\docomparemyauthor#1%
+ {\global\advance\bibitemwanted \plusone
+ \def\mytempc{#1}%
+ \ifx\mytempc\myauthor
+ \quitcommalist
+ \else\ifnum\bibitemwanted=\bibitemcounter\relax
+ \global\advance\bibitemwanted \plusone
+ \global\bibitemcounter\bibitemwanted\relax
+ \@EA\doglobal\@EA\robustaddtocommalist\@EA{{\myauthor}}\thebibauthors
+ \fi\fi}
+
+%D This macro should be clear now.
+
+\def\findmatchingyear
+ {\edef\wantednumber{\the\bibitemwanted}%
+ \getfromcommacommand[\thebibyears][\wantednumber]%
+ \ifx\commalistelement\empty
+ \edef\myyear{{\myyear}}%
+ \else
+ \edef\myyear{{\commalistelement,\myyear}}%
+ \fi
+ \edef\newcommalistelement{\myyear}%
+ \doglobal\replaceincommalist \thebibyears \wantednumber}
+
+%D \macros{gotobiblink,inbiblink,atbiblink}
+%D
+%D The final task is looping over that list until a match is found.
+
+\def\gotobiblink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{\unknownreference{#2}}}
+\def\atbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{\unknownreference{#1}}}
+\def\inbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{\unknownreference{#1}}}
+
+%D \macros{bibauthoryearref,bibauthoryearsref,bibauthorref,bibyearref}
+%D
+%D Now that all the hard work has been done, these are simple.
+%D \type{\ixbibauthoryearref} stores the data in the macros
+%D \type{\currentbibauthor} and \type{\currentbibyear}.
+
+\def\ifbibinteractionelse
+ {\iflocation
+ \edef\test{\bibalternative\c!interaction}%
+ \ifx\test\v!stop
+ \@EA\@EA\@EA\secondoftwoarguments
+ \else
+ \@EA\@EA\@EA\firstoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\ifbibinteractionelse
+ {\iflocation
+ \doifelse{\bibalternative\c!interaction}\v!stop
+ {\@EA\secondoftwoarguments}
+ {\@EA\firstoftwoarguments}%
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\bibmaybeinteractive#1#2%
+ {\ifbibcitecompress
+ #2%
+ \else
+ \ifbibinteractionelse{\gotobiblink{#2}[#1]}{#2}%
+ \fi}
+
+\def\bibauthoryearref[#1]%
+ {\ixbibauthoryear{#1}%
+ {\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
+ \bibalternative\v!left{\currentbibyear}\bibalternative\v!right}}
+ {\bibalternative\c!pubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
+ \bibalternative\v!left {\currentbibyear}\bibalternative\v!right}}
+ {\bibalternative\c!lastpubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween
+ \bibalternative\v!left {\currentbibyear}\bibalternative\v!right}}}
+
+\def\bibauthoryearsref[#1]%
+ {\bibalternative\v!left
+ \ixbibauthoryear{#1}
+ {\bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
+ {\bibalternative\c!pubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}
+ {\bibalternative\c!lastpubsep
+ \bibmaybeinteractive{#1}{{\currentbibauthor}\bibalternative\c!inbetween{\currentbibyear}}}%
+ \bibalternative\v!right}
+
+\def\bibauthorref[#1]%
+ {\bibalternative\v!left
+ \ixbibauthoryear{#1}%
+ {\bibmaybeinteractive{#1}{{\currentbibauthor}}}
+ {\bibalternative\c!pubsep \bibmaybeinteractive{#1}{{\currentbibauthor}}}
+ {\bibalternative\c!lastpubsep\bibmaybeinteractive{#1}{{\currentbibauthor}}}%
+ \bibalternative\v!right}
+
+\def\bibyearref[#1]%
+ {\bibalternative\v!left
+ \ixbibauthoryear{#1}%
+ {\bibmaybeinteractive{#1}{{\currentbibyear}}}
+ {\bibalternative\c!pubsep \bibmaybeinteractive{#1}{{\currentbibyear}}}
+ {\bibalternative\c!lastpubsep\bibmaybeinteractive{#1}{{\currentbibyear}}}%
+ \bibalternative\v!right}
+
+%D \macros{bibshortref,bibkeyref,bibpageref,bibtyperef,bibserialref}
+%D
+%D There is hardly any point in trying to compress these. The only
+%D thing that needs to be done is making sure that
+%D the separations are inserted correctly. And that is
+%D what \type{\bibinsertrefsep} does.
+
+\newconditional\firstbibrefsep
+
+\def\bibresetrefsep
+ {\settrue\firstbibrefsep}
+
+\def\bibinsertrefsep
+ {\ifconditional\firstbibrefsep
+ \setfalse\firstbibrefsep
+ \else
+ \bibalternative\c!pubsep
+ \fi}
+
+\def\bibshortref[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobibshortref
+ \bibalternative\v!right}
+
+\def\dobibshortref#1%
+ {\bibinsertrefsep
+ \doifbibreferencefoundelse{#1}
+ {\gotobiblink{\bibgetvars{#1}}[#1]}
+ {\unknownreference{#1}}}
+
+\def\bibserialref[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobibserialref
+ \bibalternative\v!right}
+
+\def\dobibserialref#1%
+ {\bibinsertrefsep
+ \doifbibreferencefoundelse{#1}
+ {\gotobiblink{\bibgetvarn{#1}}[#1]}
+ {\unknownreference{#1}}}
+
+\def\bibkeyref[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobibkeyref
+ \bibalternative\v!right}
+
+\def\dobibkeyref#1%
+ {\bibinsertrefsep
+ \gotobiblink{#1}[#1]}
+
+\def\bibgotoDOI#1#2%
+ {\ifbibinteractionelse
+ {\useURL[bibfooDoi#1][#2]%
+ \useURL[bibfoo#1][http://dx.doi.org/#2]%
+ \goto{\url[bibfooDoi#1]}[url(bibfoo#1)]}
+ {\hyphenatedurl{#2}}}
+
+\def\bibdoiref[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobibdoiref
+ \bibalternative\v!right}
+
+\def\dobibdoiref#1%
+ {\bibinsertrefsep
+ \doifbibreferencefoundelse{#1}
+ {\expanded{\bibgotoDOI{#1}{\bibgetvaro{#1}}}}
+ {\unknownreference{#1}}}
+
+\def\biburlref[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobiburlref
+ \bibalternative\v!right}
+
+\def\bibgotoURL#1#2%
+ {\ifbibinteractionelse
+ {\useURL[bibfoo#1][#2]\goto{\url[bibfoo#1]}[url(bibfoo#1)]}
+ {\hyphenatedurl{#2}}}
+
+\def\dobiburlref#1%
+ {\bibinsertrefsep
+ \doifbibreferencefoundelse{#1}
+ {\expanded{\bibgotoURL{#1}{\bibgetvaru{#1}}}}
+ {\unknownreference{#1}}}
+
+\def\bibtyperef[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobibtyperef
+ \bibalternative\v!right}
+
+\def\dobibtyperef#1%
+ {\bibinsertrefsep
+ \doifbibreferencefoundelse{#1}
+ {\gotobiblink{\bibgetvart{#1}}[#1]}
+ {\unknownreference{#1}}}
+
+\def\bibpageref[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobibpageref
+ \bibalternative\v!right}
+
+\def\dobibpageref#1%
+ {\bibinsertrefsep
+ \ifbibinteractionelse
+ {\atbiblink[#1]}
+ {{\referencingfalse\at[#1]}}}
+
+\def\bibdataref[#1]%
+ {\bibalternative\v!left
+ \bibresetrefsep\processcommalist[#1]\dobibdata
+ \bibalternative\v!right}
+
+\def\dobibdata#1%
+ {\bibinsertrefsep
+ \doifbibreferencefoundelse{#1}
+ {\dotypesetapublication{#1}}
+ {\unknownreference{#1}}}
+
+\let\bibnoneref\nocite
+
+%D \macros{bibnumref}
+
+\def\bibnumref[#1]%
+ {\begingroup
+ \bibalternative\v!left
+ \penalty\!!tenthousand
+ \ctxlua{bibtex.hacks.resolve("","\number\bibtexblock","#1")}%
+ \bibalternative\v!right
+ \endgroup}
+
+\def\dowithbibtexnumrefconnector#1#2%
+ {\ifnum#1>\plusone
+ \ifnum#2>\plusone
+ \ifnum#2=#1\relax
+ \bibalternative{lastpubsep}%
+ \else
+ \bibalternative{pubsep}%
+ \fi
+ \fi
+ \fi}
+
+\def\dowithbibtexnumref#1#2#3#4#5% n, i, prefix block ref
+ {\dowithbibtexnumrefconnector{#1}{#2}%
+ \def\bibrefprefix{#4:}%
+ \inbiblink[#5]}
+
+\def\dowithbibtexnumrefrange#1#2#3#4#5#6#7% n, i, prefix block ref
+ {\dowithbibtexnumrefconnector{#1}{#2}%
+ \def\bibrefprefix{#4:}%
+ \inbiblink[#5]%
+ \endash
+ \def\bibrefprefix{#6:}%
+ \inbiblink[#7]}
+
+%D By request from Sanjoy. This makes it easier to implement
+%D \type{\citeasnoun}.
+
+\def\bibauthornumref[#1]%
+ {\getcommalistsize[#1]%
+ \global\bibitemcounter\commalistsize
+ \bibresetrefsep
+ \processcommalist[#1]\dobibauthornumref }
+
+\def\dobibauthornumref#1%
+ {\bibinsertrefsep
+ \doifbibreferencefoundelse{#1}
+ {\begingroup
+ \bibgetvara{#1}%
+ \bibalternative\c!inbetween
+ \setuppublications[\c!refcommand=num]%
+ \cite[#1]%
+ \endgroup}
+ {\unknownreference{#1}}}
+
+%D And some defaults are loaded from bibl-apa:
+
+\def\c!monthconversion{monthconversion} % todo
+
+\setuppublications
+ [\c!monthconversion=,
+ \c!alternative=apa,
+ \c!method=\v!global,
+ \c!refcommand=num,
+ \c!numbercommand=\bibleftnumber]
+
+\def\preloadbiblist
+ {\globallet\preloadbiblist\relax
+ \dousepublications\jobname}
+
+% \appendtoks \preloadbiblist \to \everysetuppublications
+% \appendtoks \preloadbiblist \to \everystarttext
+
+\protect \endinput
diff --git a/tex/context/base/bibl-tst.lua b/tex/context/base/bibl-tst.lua
new file mode 100644
index 000000000..5ff8f4570
--- /dev/null
+++ b/tex/context/base/bibl-tst.lua
@@ -0,0 +1,21 @@
+dofile("bibl-bib.lua")
+
+local session = bibtex.new()
+
+bibtex.load(session,"gut.bib")
+bibtex.load(session,"komoedie.bib")
+bibtex.load(session,"texbook1.bib")
+bibtex.load(session,"texbook2.bib")
+bibtex.load(session,"texbook3.bib")
+bibtex.load(session,"texgraph.bib")
+bibtex.load(session,"texjourn.bib")
+bibtex.load(session,"texnique.bib")
+bibtex.load(session,"tugboat.bib")
+print(bibtex.size,statistics.elapsedtime(bibtex))
+bibtex.toxml(session)
+print(bibtex.size,statistics.elapsedtime(bibtex))
+
+--~ print(table.serialize(session.data))
+--~ print(table.serialize(session.shortcuts))
+--~ print(xml.serialize(session.xml))
+
diff --git a/tex/context/base/blob-ini.lua b/tex/context/base/blob-ini.lua
new file mode 100644
index 000000000..0f7ccee26
--- /dev/null
+++ b/tex/context/base/blob-ini.lua
@@ -0,0 +1,165 @@
+if not modules then modules = { } end modules ['blob-ini'] = {
+ version = 1.001,
+ comment = "companion to blob-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- later we will consider an OO variant.
+
+-- This module is just a playground. Occasionally we need to typeset
+-- at the lua and and this is one method. In principle we can construct
+-- pages this way too which sometimes makes sense in dumb cases. Actually,
+-- if one only needs this, one does not really need tex, okay maybe the
+-- parbuilder but that one can be simplified as well then.
+
+-- set fonts, attributes
+-- rest already done in packers etc
+-- add local par whatsit (or wait till cleaned up)
+-- collapse or new pars
+-- interline spacing etc
+
+-- DON'T USE THESE FUNCTIONS AS THEY WILL CHANGE!
+
+local type = type
+
+local utfvalues = string.utfvalues
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local fontdata = fonts.identifiers
+
+local new_glyph_node = nodes.glyph
+local new_glue_node = nodes.glyph
+
+local copy_node = node.copy
+local copy_node_list = node.copy_list
+local insert_node_after = node.insert_after
+local flush_node_list = node.flush_list
+local hpack_node_list = node.hpack
+local vpack_node_list = node.vpack
+local write_node = node.write
+
+local current_font = font.current
+
+blobs = blobs or { }
+
+local newline = lpegpatterns.newline
+local space = lpegpatterns.spacer
+local spacing = newline * space^0
+local content = (space^1)/" " + (1-spacing)
+
+local ctxtextcapture = lpeg.Ct ( (
+ space^0 * (
+ newline^2 * space^0 * lpeg.Cc("")
+ + newline * space^0 * lpeg.Cc(" ")
+ + lpeg.Cs(content^1)
+ )
+)^0)
+
+local function tonodes(str,fnt,attr) -- (str,template_glyph)
+ if not str or str == "" then
+ return
+ end
+ local head, tail, space, fnt, template = nil, nil, nil, nil, nil
+ if not fnt then
+ fnt = current_font()
+ elseif type(fnt) ~= "number" and fnt.id == "glyph" then
+ fnt, template = nil, fnt
+ -- else
+ -- already a number
+ end
+ for s in utfvalues(str) do
+ local n
+ if s == 32 then
+ if not space then
+ local parameters = fontdata[fnt].parameters
+ space = new_glue_node(parameters.space,parameters.space_stretch,parameters.space_shrink)
+ n = space
+ else
+ n = copy_node(space)
+ end
+ elseif template then
+ n = copy_node(template)
+ n.char = s
+ else
+ n = new_glyph_node(fnt,s)
+ end
+ if attr then -- normall false when template
+ n.attr = copy_node_list(attr)
+ end
+ if head then
+ insert_node_after(head,tail,n)
+ else
+ head = n
+ end
+ tail = n
+ end
+ return head, tail
+end
+
+blobs.tonodes = tonodes
+
+function blobs.new()
+ return {
+ list = { },
+ }
+end
+
+function blobs.append(t,str)
+ local kind = type(str)
+ local dummy = nil
+ if kind == "string" then
+ local pars = lpegmatch(ctxtextcapture,str)
+ local list = t.list
+ for p=1,#pars do
+ local str = pars[p]
+ if #str == 0 then
+ list[#list+1 ] = { head = nil, tail = nil }
+ else
+ local l = list[#list]
+ if not l then
+ l = { head = nil, tail = nil }
+ list[#list+1 ] = l
+ end
+ local head, tail = tonodes(str,nil,nil)
+ if head then
+ if l.head then
+ l.tail.next = head
+ head.prev = l.tail
+ l.tail = tail
+ else
+ l.head, l.tail = head, tail
+ end
+ end
+ end
+ end
+ end
+end
+
+function blobs.pack(t,how)
+ local list = t.list
+ for i=1,#list do
+ local pack = list[i].pack
+ if pack then
+ flush_node_list(node.pack)
+ end
+ if how == "vertical" then
+ -- we need to prepend a local par node
+ -- list[i].pack = node.vpack(list[i].head,"exactly")
+ logs.report("blobs","vpack not yet supported")
+ else
+ list[i].pack = hpack_node_list(list[i].head,"exactly")
+ end
+ end
+end
+
+function blobs.write(t)
+ local list = t.list
+ for i=1,#list do
+ local pack = list[i].pack
+ if pack then
+ write_node(pack)
+ end
+ end
+end
diff --git a/tex/context/base/blob-ini.mkiv b/tex/context/base/blob-ini.mkiv
new file mode 100644
index 000000000..7f63ec73d
--- /dev/null
+++ b/tex/context/base/blob-ini.mkiv
@@ -0,0 +1,34 @@
+%D \module
+%D [ file=blob-ini,
+%D version=2010.04.06,
+%D title=\CONTEXT\ \LUA\ Typesetting,
+%D subtitle=Initialization,
+%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}{ConTeXt Lua Typesetting / Initialization}
+
+%D This is a prelude to typesetting at the \LUA\ end. The code
+%D is already quite old but will only get nice when we are further
+%D down the road (close to version 1.00 of \LUATEX). Typesetting in
+%D pure \LUA\ sometimes makes sense.
+
+\registerctxluafile{blob-ini}{1.001}
+
+\endinput
+
+% \starttext
+%
+% \startluacode
+% local b = blobs.new()
+% blobs.append(b,"Hello world.\n Here we are.\n\n And Again!")
+% blobs.pack(b)
+% blobs.write(b)
+% \stopluacode
+%
+% \stoptext
diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua
new file mode 100644
index 000000000..6b1af8f96
--- /dev/null
+++ b/tex/context/base/buff-ini.lua
@@ -0,0 +1,838 @@
+if not modules then modules = { } end modules ['buff-ini'] = {
+ version = 1.001,
+ comment = "companion to core-buf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- ctx lua reference model / hooks and such
+-- to be optimized
+
+-- redefine buffers.get
+
+buffers = { }
+buffers.data = { }
+buffers.hooks = { }
+buffers.flags = { }
+buffers.commands = { }
+buffers.visualizers = { }
+
+-- if needed we can make 'm local
+
+local trace_run = false trackers.register("buffers.run", function(v) trace_run = v end)
+local trace_visualize = false trackers.register("buffers.visualize", function(v) trace_visualize = v end)
+
+local utf = unicode.utf8
+
+local concat, texsprint, texprint, texwrite = table.concat, tex.sprint, tex.print, tex.write
+local utfbyte, utffind, utfgsub = utf.byte, utf.find, utf.gsub
+local type, next = type, next
+local huge = math.huge
+local byte, sub, find, char, gsub, rep, lower, format, gmatch, match = string.byte, string.sub, string.find, string.char, string.gsub, string.rep, string.lower, string.format, string.gmatch, string.match
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local ctxcatcodes = tex.ctxcatcodes
+local variables = interfaces.variables
+local lpegmatch = lpeg.match
+
+local data, flags, hooks, visualizers = buffers.data, buffers.flags, buffers.hooks, buffers.visualizers
+
+visualizers.defaultname = variables.typing
+
+function buffers.raw(name)
+ return data[name] or { }
+end
+
+function buffers.erase(name)
+ data[name] = nil
+end
+
+function buffers.set(name, str)
+ data[name] = { str } -- CHECK THIS
+end
+
+function buffers.append(name, str)
+ data[name] = (data[name] or "") .. str
+end
+
+
+buffers.flags.store_as_table = true
+
+-- to be sorted out: crlf + \ ; slow now
+
+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 + bufferdata:count("\\"..begintag) - bufferdata:count("\\"..endtag)
+ local more = buffers.level > 0
+ if more then
+ dn = dn .. bufferdata .. endtag
+ buffers.level = buffers.level - 1
+ else
+ if dn == "" then
+ dn = sub(bufferdata,1,#bufferdata-1)
+ else
+ dn = dn .. "\n" .. sub(bufferdata,1,#bufferdata-1)
+ end
+ dn = gsub(dn,"[\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 data[name] ~= nil
+end
+
+function buffers.doifelsebuffer(name)
+ cs.testcase(data[name] ~= nil)
+end
+
+flags.optimize_verbatim = true
+flags.count_empty_lines = false
+
+local no_break_command = "\\doverbatimnobreak"
+local do_break_command = "\\doverbatimgoodbreak"
+local begin_of_line_command = "\\doverbatimbeginofline"
+local end_of_line_command = "\\doverbatimendofline"
+local empty_line_command = "\\doverbatimemptyline"
+
+local begin_of_display_command = "\\doverbatimbeginofdisplay"
+local end_of_display_command = "\\doverbatimendofdisplay"
+local begin_of_inline_command = "\\doverbatimbeginofinline"
+local end_of_inline_command = "\\doverbatimendofinline"
+
+function buffers.verbatimbreak(n,m)
+ if flags.optimize_verbatim then
+ if n == 2 or n == m then
+ texsprint(no_break_command)
+ elseif n > 1 then
+ texsprint(do_break_command)
+ end
+ end
+end
+
+function buffers.strip(lines,first,last)
+ local first, last = first or 1, last or #lines
+ for i=first,last do
+ local li = lines[i]
+ if #li == 0 or find(li,"^%s*$") then
+ first = first + 1
+ else
+ break
+ end
+ end
+ for i=last,first,-1 do
+ local li = lines[i]
+ if #li == 0 or find(li,"^%s*$") then
+ last = last - 1
+ else
+ break
+ end
+ end
+ return first, last, last - first + 1
+end
+
+function buffers.range(lines,first,last,range) -- 1,3 1,+3 fromhere,tothere
+ local first, last = first or 1, last or #lines
+ local what = aux.settings_to_array(range)
+ local r_first, r_last = what[1], what[2]
+ local f, l = tonumber(r_first), tonumber(r_last)
+ if r_first then
+ if f then
+ if f > first then
+ first = f
+ end
+ else
+ for i=first,last do
+ if find(lines[i],r_first) then
+ first, strip = i + 1
+ break
+ end
+ end
+ end
+ end
+ if r_last then
+ if l then
+ if find(r_last,"^[%+]") then -- 1,+3
+ l = first + l
+ end
+ if l < last then
+ last = l
+ end
+ else
+ for i=first,last do
+ if find(lines[i],r_last) then
+ last = i - 1
+ break
+ end
+ end
+ end
+ end
+ return first, last
+end
+
+function buffers.type(name,realign,range)
+ local lines = data[name]
+ local action = buffers.typeline
+ if lines then
+ if type(lines) == "string" then
+ lines = lines:splitlines()
+ data[name] = lines
+ end
+ if realign then
+ lines = buffers.realign(lines,realign)
+ end
+ local line, n = 0, 0
+ local first, last, m = buffers.strip(lines)
+ if range then
+ first, last = buffers.range(lines,first,last,range)
+ first, last = buffers.strip(lines,first,last)
+ end
+ hooks.begin_of_display()
+ for i=first,last do
+ n, line = action(lines[i], n, m, line)
+ end
+ hooks.end_of_display()
+ end
+end
+
+function buffers.loaddata(filename) -- this one might go away
+ -- this will be cleaned up when we have split supp-fil completely
+ -- instead of half-half
+ local ok, str, n = resolvers.loaders.tex(filename)
+ if not str then
+ ok, str, n = resolvers.loaders.tex(file.addsuffix(filename,'tex'))
+ end
+end
+
+function buffers.loaddata(filename) -- this one might go away
+ local foundname = resolvers.findtexfile(filename) or ""
+ if foundname == "" then
+ foundname = resolvers.findtexfile(file.addsuffix(filename,'tex')) or ""
+ end
+ if foundname == "" then
+ return ""
+ else
+ return resolvers.loadtexfile(foundname)
+ end
+end
+
+function buffers.typefile(name,realign,range) -- still somewhat messy, since name can be be suffixless
+ local str = buffers.loaddata(name)
+ if str and str~= "" then
+ local lines = str:splitlines()
+ if realign then
+ lines = buffers.realign(lines,realign)
+ end
+ local line, n, action = 0, 0, buffers.typeline
+ local first, last, m = buffers.strip(lines)
+ hooks.begin_of_display()
+ if range then
+ first, last = buffers.range(lines,first,last,range)
+ first, last = buffers.strip(lines,first,last)
+ end
+ for i=first,last do
+ n, line = action(lines[i], n, m, line)
+ end
+ hooks.end_of_display()
+ end
+end
+
+function buffers.typeline(str,n,m,line)
+ n = n + 1
+ buffers.verbatimbreak(n,m)
+ if find(str,"%S") then
+ line = line + 1
+ hooks.begin_of_line(line)
+ hooks.flush_line(hooks.line(str))
+ hooks.end_of_line()
+ else
+ if flags.count_empty_lines then
+ line = line + 1
+ end
+ hooks.empty_line(line)
+ end
+ return n, line
+end
+
+-- The optional prefix hack is there for the typesetbuffer feature and
+-- in mkii we needed that (this hidden feature is used in a manual).
+
+local function prepared(name,list) -- list is optional
+ if not list or list == "" then
+ list = name
+ end
+ if not name or name == "" then
+ name = tex.jobname .. "-" .. list .. ".tmp"
+ end
+ local content = buffers.collect(list,nil) or ""
+ if content == "" then
+ content = "empty buffer"
+ end
+ return name, content
+end
+
+local capsule = "\\starttext\n%s\n\\stoptext\n"
+local command = "context %s"
+
+function buffers.save(name,list,encapsulate) -- list is optional
+ local name, content = prepared(name,list)
+ io.savedata(name, (encapsulate and format(capsule,content)) or content)
+end
+
+function commands.savebuffer(list,name) -- name is optional
+ buffers.save(name,list)
+end
+
+function buffers.run(name,list,encapsulate)
+ local name, content = prepared(name,list)
+ local data = io.loaddata(name)
+ content = (encapsulate and format(capsule,content)) or content
+ if data ~= content then
+ if trace_run then
+ commands.writestatus("buffers","changes in '%s', processing forced",name)
+ end
+ io.savedata(name,content)
+ os.execute(format(command,name))
+ elseif trace_run then
+ commands.writestatus("buffers","no changes in '%s', not processed",name)
+ end
+end
+
+local printer = (lpeg.patterns.textline/texprint)^0
+
+function buffers.get(name)
+ local b = buffers.data[name]
+ if b then
+ if type(b) == "table" then
+ for i=1,#b do
+ texprint(b[i])
+ end
+ else
+ lpegmatch(printer,b)
+ end
+ end
+end
+
+local function content(name,separator) -- no print
+ local b = data[name]
+ if b then
+ if type(b) == "table" then
+ return concat(b,separator or "\n")
+ else
+ return b
+ end
+ else
+ return ""
+ end
+end
+
+buffers.content = content
+
+function buffers.collect(names,separator) -- no print
+ -- maybe we should always store a buffer as table so
+ -- that we can pass it directly
+ if type(names) == "string" then
+ names = aux.settings_to_array(names)
+ end
+ local t = { }
+ for i=1,#names do
+ local c = content(names[i],separator)
+ if c ~= "" then
+ t[#t+1] = c
+ end
+ end
+ return concat(t,separator or "\r") -- "\n" is safer due to comments and such
+end
+
+function buffers.feedback(names,separator)
+ -- don't change the texprint into texsprint as it fails on mp buffers
+ -- because (p<nl>enddef) becomes penddef then
+ texprint(ctxcatcodes,string.splitlines(buffers.collect(names,separator)))
+end
+
+local function tobyte(c)
+ return " [" .. utfbyte(c) .. "] "
+end
+
+function buffers.inspect(name)
+ local b = data[name]
+ if b then
+ if type(b) == "table" then
+ for k=1,#b do
+ local v = b[k]
+ if v == "" then
+ texsprint(ctxcatcodes,"[crlf]\\par ") -- space ?
+ else
+ texsprint(ctxcatcodes,(gsub(v,"(.)",tobyte)),"\\par")
+ end
+ end
+ else
+ texsprint(ctxcatcodes,(gsub(b,"(.)",tobyte)))
+ end
+ end
+end
+
+-- maybe just line(n,str) empty(n,str)
+
+visualizers.tablength = 7
+visualizers.enabletab = true -- false
+visualizers.obeyspace = true
+
+function buffers.settablength(tablength)
+ visualizers.tablength = tablength and tonumber(tablength) or 7
+end
+
+visualizers.handlers = visualizers.handlers or { }
+
+local handlers = visualizers.handlers
+
+function buffers.newvisualizer(name)
+ name = lower(name)
+ local handler = { }
+ handlers[name] = handler
+ return handler
+end
+
+function buffers.getvisualizer(name)
+ name = lower(name)
+ return handlers[name] or buffers.loadvisualizer(name)
+end
+
+function buffers.loadvisualizer(name)
+ name = lower(name)
+ local hn = handlers[name]
+ if hn then
+ return hn
+ else
+ environment.loadluafile("pret-" .. name)
+ local hn = handlers[name]
+ if not hn then
+ -- hn = buffers.newvisualizer(name)
+ hn = handlers[visualizers.defaultname]
+ handlers[name] = hn
+ if trace_visualize then
+ logs.report("buffers","mapping '%s' visualizer onto '%s'",name,visualizers.defaultname)
+ end
+ elseif trace_visualize then
+ logs.report("buffers","loading '%s' visualizer",name)
+ end
+ return hn
+ end
+end
+
+-- was "default", should be set at tex end (todo)
+
+local default = buffers.newvisualizer(visualizers.defaultname)
+
+--~ print(variables.typing) os.exit()
+
+-- will become cleaner
+
+local currentvisualizer, currenthandler
+
+function buffers.setvisualizer(str)
+ currentvisualizer = lower(str)
+ currenthandler = handlers[currentvisualizer]
+ if currenthandler then
+ -- if trace_visualize then
+ -- logs.report("buffers","enabling specific '%s' visualizer",currentvisualizer)
+ -- end
+ else
+ currentvisualizer = visualizers.defaultname
+ currenthandler = handlers.default
+ -- if trace_visualize then
+ -- logs.report("buffers","enabling default visualizer '%s'",currentvisualizer)
+ -- end
+ end
+ if currenthandler.reset then
+ currenthandler.reset()
+ end
+end
+
+function buffers.resetvisualizer()
+ currentvisualizer = visualizers.defaultname
+ currenthandler = handlers.default
+ if currenthandler.reset then
+ currenthandler.reset()
+ end
+end
+
+buffers.setvisualizer(visualizers.defaultname)
+
+function visualizers.reset()
+end
+
+function buffers.doifelsevisualizer(str)
+ cs.testcase((str ~= "") and (handlers[lower(str)] ~= nil))
+end
+
+-- calling routines, don't change
+
+function hooks.begin_of_display()
+ (currenthandler.begin_of_display or default.begin_of_display)(currentvisualizer)
+end
+
+function hooks.end_of_display()
+ (currenthandler.end_of_display or default.end_of_display)()
+end
+
+function hooks.begin_of_inline()
+ (currenthandler.begin_of_inline or default.begin_of_inline)(currentvisualizer)
+end
+
+function hooks.end_of_inline()
+ (currenthandler.end_of_inline or default.end_of_inline)()
+end
+
+function hooks.flush_line(str,nesting)
+ local fl = currenthandler.flush_line
+ if fl then
+ str = gsub(str," *[\n\r]+ *"," ") ; -- semi colon needed
+ fl(str,nesting)
+ else
+ -- gsub done later
+ default.flush_line(str,nesting)
+ end
+end
+
+function hooks.flush_inline(str,nesting)
+ hooks.begin_of_inline()
+ hooks.flush_line(str,nesting)
+ hooks.end_of_inline()
+end
+
+function hooks.begin_of_line(n)
+ (currenthandler.begin_of_line or default.begin_of_line)(n)
+end
+
+function hooks.end_of_line()
+ (currenthandler.end_of_line or default.end_of_line)()
+end
+
+function hooks.empty_line()
+ (currenthandler.empty_line or default.empty_line)()
+end
+
+function hooks.line(str)
+ if visualizers.enabletab then
+ str = string.tabtospace(str,visualizers.tablength)
+ else
+ str = gsub(str,"\t"," ")
+ end
+ return (currenthandler.line or default.line)(str)
+end
+
+-- defaults
+
+function default.begin_of_display(currentvisualizer)
+ texsprint(ctxcatcodes,begin_of_display_command,"{",currentvisualizer,"}")
+end
+
+function default.end_of_display()
+ texsprint(ctxcatcodes,end_of_display_command)
+end
+
+function default.begin_of_inline(currentvisualizer)
+ texsprint(ctxcatcodes,begin_of_inline_command,"{",currentvisualizer,"}")
+end
+
+function default.end_of_inline()
+ texsprint(ctxcatcodes,end_of_inline_command)
+end
+
+function default.begin_of_line(n)
+ texsprint(ctxcatcodes, begin_of_line_command,"{",n,"}")
+end
+
+function default.end_of_line()
+ texsprint(ctxcatcodes,end_of_line_command)
+end
+
+function default.empty_line()
+ texsprint(ctxcatcodes,empty_line_command)
+end
+
+function default.line(str)
+ return str
+end
+
+function default.flush_line(str)
+ str = gsub(str," *[\n\r]+ *"," ")
+ if visualizers.obeyspace then
+ for c in utfcharacters(str) do
+ if c == " " then
+ texsprint(ctxcatcodes,"\\obs")
+ else
+ texwrite(c)
+ end
+ end
+ else
+ texwrite(str)
+ end
+end
+
+-- not needed any more
+
+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)
+ -- use the utfcharacters loop
+ return (utfgsub(str,"(.)", escaped_token))
+end
+
+-- special one
+
+buffers.commands.nested = "\\switchslantedtype "
+
+-- todo : utf + faster, direct print and such. no \\char, vrb catcodes, see end
+
+function visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess
+ str = gsub(str," *[\n\r]+ *"," ")
+ local result, c, nested, i = "", "", 0, 1
+ local commands = buffers.commands -- otherwise wrong commands
+ while i < #str do -- slow
+ c = sub(str,i,i+1)
+ if c == "<<" then
+ nested = nested + 1
+ if enable then
+ result = result .. "{" .. commands.nested
+ else
+ result = result .. "{"
+ end
+ i = i + 2
+ elseif c == ">>" then
+ if nested > 0 then
+ nested = nested - 1
+ result = result .. "}"
+ end
+ i = i + 2
+ else
+ c = sub(str,i,i)
+ if c == " " then
+ result = result .. "\\obs "
+ elseif find(c,"%a") then
+ result = result .. c
+ else
+ result = result .. "\\char" .. byte(c) .. " "
+ end
+ i = i + 1
+ end
+ end
+ result = result .. "\\char" .. byte(sub(str,i,i)) .. " " .. rep("}",nested)
+ texsprint(ctxcatcodes,result)
+end
+
+-- handy helpers
+--
+-- \sop[color] switch_of_pretty
+-- \bop[color] begin_of_pretty
+-- \eop end_of_pretty
+-- \obs obeyedspace
+-- \char <n> special characters
+
+buffers.currentcolors = { }
+
+function buffers.change_state(n, state)
+ if n then
+ if state ~= n then
+ if state > 0 then
+ texsprint(ctxcatcodes,"\\sop[",buffers.currentcolors[n],"]")
+ else
+ texsprint(ctxcatcodes,"\\bop[",buffers.currentcolors[n],"]")
+ end
+ return n
+ end
+ elseif state > 0 then
+ texsprint(ctxcatcodes,"\\eop")
+ return 0
+ end
+ return state
+end
+
+function buffers.finish_state(state)
+ if state > 0 then
+ texsprint(ctxcatcodes,"\\eop")
+ return 0
+ else
+ return state
+ end
+end
+
+buffers.open_nested = rep("\\char"..byte('<').." ",2)
+buffers.close_nested = rep("\\char"..byte('>').." ",2)
+
+function buffers.replace_nested(result)
+ result = gsub(result,buffers.open_nested, "{")
+ result = gsub(result,buffers.close_nested,"}")
+ return result
+end
+
+function buffers.flush_result(result,nested)
+ if nested then
+ texsprint(ctxcatcodes,buffers.replace_nested(concat(result,"")))
+ else
+ texsprint(ctxcatcodes,concat(result,""))
+ end
+end
+
+-- new
+
+function buffers.realign(name,forced_n) -- no, auto, <number>
+ local n, d
+ if type(name) == "string" then
+ d = data[name]
+ if type(d) == "string" then
+ d = d:splitlines()
+ end
+ else
+ d = name -- already a buffer
+ end
+ forced_n = (forced_n == variables.auto and huge) or tonumber(forced_n)
+ if forced_n then
+ for i=1, #d do
+ local spaces = find(d[i],"%S")
+ if not spaces then
+ -- empty line
+ elseif not n then
+ n = spaces
+ elseif spaces == 0 then
+ n = 0
+ break
+ elseif n > spaces then
+ n = spaces
+ end
+ end
+ if n > 0 then
+ if n > forced_n then
+ n = forced_n
+ end
+ for i=1,#d do
+ d[i] = sub(d[i],n)
+ end
+ end
+ end
+ return d
+end
+
+-- escapes: buffers.set_escape("tex","/BTEX","/ETEX")
+
+local function flush_escaped_line(str,pattern,flushline)
+ while true do
+ local a, b, c = match(str,pattern)
+ if a and a ~= "" then
+ flushline(a)
+ end
+ if b and b ~= "" then
+ texsprint(ctxcatcodes,"{",b,"}")
+ end
+ if c then
+ if c == "" then
+ break
+ else
+ str = c
+ end
+ else
+ flushline(str)
+ break
+ end
+ end
+end
+
+function buffers.set_escape(name,pair)
+ if pair and pair ~= "" then
+ local visualizer = buffers.getvisualizer(name)
+ visualizer.normal_flush_line = visualizer.normal_flush_line or visualizer.flush_line
+ if pair == variables.no then
+ visualizer.flush_line = visualizer.normal_flush_line or visualizer.flush_line
+ if trace_visualize then
+ logs.report("buffers","resetting escape range for visualizer '%s'",name)
+ end
+ else
+ local start, stop
+ if pair == variables.yes then
+ start, stop = "/BTEX", "/ETEX"
+ else
+ pair = string.split(pair,",")
+ start, stop = string.esc(pair[1] or ""), string.esc(pair[2] or "")
+ end
+ if start ~= "" then
+ local pattern
+ if stop == "" then
+ pattern = "^(.-)" .. start .. "(.*)(.*)$"
+ else
+ pattern = "^(.-)" .. start .. "(.-)" .. stop .. "(.*)$"
+ end
+ function visualizer.flush_line(str)
+ flush_escaped_line(str,pattern,visualizer.normal_flush_line)
+ end
+ if trace_visualize then
+ logs.report("buffers","setting escape range for visualizer '%s' to %s -> %s",name,start,stop)
+ end
+ elseif trace_visualize then
+ logs.report("buffers","problematic escape specification '%s' for visualizer '%s'",pair,name)
+ end
+ end
+ end
+end
+
+-- THIS WILL BECOME A FRAMEWORK: the problem with prety printing is that
+-- we deal with snippets and therefore we need tolerant parsing
+
+--~ local type = type
+
+--~ visualizers = visualizers or { }
+
+--~ local function fallback(s) return s end
+
+--~ function visualizers.visualize(visualizer,kind,pattern)
+--~ if type(visualizer) == "table" and type(kind) == "string" then
+--~ kind = visualizer[kind] or visualizer.default or fallback
+--~ else
+--~ kind = fallback
+--~ end
+--~ return (lpeg.C(pattern))/kind
+--~ end
+
+--~ local flusher = texio.write
+--~ local format = string.format
+
+--~ local visualizer = {
+--~ word = function(s) return flusher(format("\\bold{%s}",s)) end,
+--~ number = function(s) return flusher(format("\\slanted{%s}",s)) end,
+--~ default = function(s) return flusher(s) end,
+--~ }
+
+--~ local word = lpeg.R("AZ","az")^1
+--~ local number = lpeg.R("09")^1
+--~ local any = lpeg.P(1)
+
+--~ local pattern = lpeg.P { "start",
+--~ start = (
+--~ visualizers.visualize(visualizer,"word",word) +
+--~ visualizers.visualize(visualizer,"number",number) +
+--~ visualizers.visualize(visualizer,"default",any)
+--~ )^1
+--~ }
+
+--~ str = [[test 123 test $oeps$]]
+
+--~ lpegmatch(pattern,str)
diff --git a/tex/context/base/buff-ini.mkii b/tex/context/base/buff-ini.mkii
new file mode 100644
index 000000000..fc147d090
--- /dev/null
+++ b/tex/context/base/buff-ini.mkii
@@ -0,0 +1,348 @@
+%D \module
+%D [ file=buff-ini, % was core-buf % blocks are moved to core-blk
+%D version=2000.01.05,
+%D title=\CONTEXT\ Buffer Macros,
+%D subtitle=Buffers,
+%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 Buffer Macros / Buffers}
+
+\unprotect
+
+% Helpers:
+
+\chardef\buffernestmode\plusone % 0: not nested, 1: startbuffer nested, 2: all buffers nested
+
+\edefconvertedargument\emptybufferline{ }
+
+\ifx\tmpblocks\undefined \newwrite\tmpblocks \fi
+
+\newif\iftmpblockstarted
+
+\long\def\flushbufferline#1%
+ {\iftmpblockstarted
+ \ifsegmentatebuffer
+ \ifemptybufferline
+ \immediate\write\tmpblocks{\string\stopbufferparagraph }%
+ \immediate\write\tmpblocks{\string\startbufferparagraph}%
+ \else
+ \immediate\write\tmpblocks{#1}%
+ \fi
+ \else
+ \immediate\write\tmpblocks{#1}%
+ \fi
+ \else
+ \doifsomething{#1}
+ {\tmpblockstartedtrue
+ \immediate\write\tmpblocks{\string#1}}%
+ \fi}
+
+\long\def\processnextbufferlineA#1%
+ {\relax % checken waarom eerdere macro dit nodig heeft / supp-mps run
+ \defconvertedargument\next{#1 }%
+ \doifinstringelse{\delcharacter\letterpercent}{\delcharacter\next}
+ {\secondoftwoarguments}
+ {\doifincsnameelse\endofblock\next
+ {\ifnum\nestedbufferlevel=\zerocount
+ \expandafter\firstoftwoarguments
+ \else
+ \decrement\nestedbufferlevel\relax
+ \expandafter\secondoftwoarguments
+ \fi}
+ {\doifincsnameelse\beginofblock\next
+ {\increment\nestedbufferlevel\relax
+ \secondoftwoarguments}
+ {\secondoftwoarguments}}}}
+
+\long\def\processnextbufferlineB#1% #2#3%
+ {\defconvertedargument\next{#1 }%
+ \ifx\next\emptybufferline
+ \ifsegmentatebuffer \emptybufferlinetrue \fi
+ \expandafter\secondoftwoarguments% #3%
+ \else
+ \emptybufferlinefalse
+ \doifinstringelse\endofblock\next
+ {\expandafter\firstoftwoarguments }% #2}
+ {\expandafter\secondoftwoarguments}% #3}%
+ \fi}
+
+\bgroup
+\obeylines
+\long\gdef\copybufferline#1
+ {\processnextbufferline{#1}\closebufferfile{\flushbufferline{#1}\copybufferline}}
+\egroup
+
+\newif\ifsegmentatebuffer
+\newif\ifemptybufferline
+
+\def\currentbuffer{\jobname}
+
+\def\setcurrentbuffer#1%
+ {\doifelsenothing{#1}{\edef\currentbuffer{\jobname}}{\edef\currentbuffer{#1}}}
+
+\def\resetbuffer
+ {\dosingleempty\doresetbuffer}
+
+\def\doresetbuffer[#1]%
+ {\begingroup
+ \setcurrentbuffer{#1}%
+ \unlinkfile{\TEXbufferfile\currentbuffer}%
+ \endgroup}
+
+\def\dostartbuffer
+ {\bgroup
+ \obeylines % nodig, anders gaat 't fout als direct \starttable (bv)
+ \doquadrupleempty\dodostartbuffer}
+
+\def\dodostartbuffer[#1][#2][#3][#4]% upward compatible
+ {\iffourthargument
+ \def\next{\dododostartbuffer{#1}{#2}{#3}{#4}}%
+ \else
+ \def\next{\dododostartbuffer {}{#1}{#2}{#3}}%
+ \fi
+ \next}
+
+\def\dododostartbuffer#1#2#3#4%
+ {%\showmessage\m!systems{15}{#2}%
+ \doifelsevalue{\??bu#1\c!paragraph}\v!yes
+ {\segmentatebuffertrue} % todo in mkiv
+ {\doifnumberelse{\getvalue{\??bu#1\c!paragraph}}\segmentatebuffertrue\segmentatebufferfalse}%
+ \doifvalue{\??bu#1\c!local}\v!yes
+ {\chardef\buffernestmode\plustwo}% permit nesting
+ \setcurrentbuffer{#2}%
+ \doifelsenothing{#4}
+ {\letbeundefined{\e!stop\v!buffer}% % \let\stopbuffer=\relax % \undefined
+ \edefconvertedargument\beginofblock{\e!start\v!buffer}%
+ \edefconvertedargument\endofblock {\e!stop \v!buffer}%
+ \ifcase\buffernestmode
+ \let\processnextbufferline\processnextbufferlineB
+ \else
+ \let\processnextbufferline\processnextbufferlineA
+ \fi}
+ {\letbeundefined{#4}% \letvalue{#4}=\relax % \undefined
+ \@EA\defconvertedargument\@EA\beginofblock\@EA{\csname#3\endcsname}% we could use defconvertedcommand here (no \@EA)
+ \@EA\defconvertedargument\@EA\endofblock \@EA{\csname#4\endcsname}% we could use defconvertedcommand here (no \@EA)
+ \ifcase\buffernestmode
+ \let\processnextbufferline\processnextbufferlineB
+ \or
+ \let\processnextbufferline\processnextbufferlineB
+ \else
+ \let\processnextbufferline\processnextbufferlineA
+ \fi}%
+ \def\closebufferfile
+ {\ifsegmentatebuffer
+ \immediate\write\tmpblocks{\string\stopbufferparagraph}%
+ \fi
+ \immediate\closeout\tmpblocks
+ \egroup
+ \getvalue{#4}}%
+ \doifelsenothing{#2}
+ {\edef\bufferfilename{\TEXbufferfile\jobname}}%
+ {\edef\bufferfilename{\TEXbufferfile{#2}}}%
+ \immediate\openout\tmpblocks\bufferfilename
+ \ifsegmentatebuffer
+ \immediate\write\tmpblocks{\string\startbufferparagraph}%
+ \fi
+ \newcounter\nestedbufferlevel
+ \recatcodeuppercharacterstrue
+ \setcatcodetable\vrbcatcodes
+ \obeylines
+ \copybufferline}
+
+\letvalue{\e!start\v!buffer}\dostartbuffer
+
+\let\endbuffer\undefined % to please the dep parser
+
+\def\setbuffer
+ {\dosingleempty\dosetbuffer}
+
+\long\def\dosetbuffer[#1]#2\endbuffer % seldom used so we just pass #2
+ {\begingroup
+ \setcurrentbuffer{#1}%
+ \edef\bufferfilename{\TEXbufferfile{\currentbuffer}}%
+ \immediate\openout\tmpblocks\bufferfilename
+ \defconvertedargument\ascii{#2}%
+ \immediate\write\tmpblocks{\ascii}%
+ \immediate\closeout\tmpblocks
+ \endgroup}
+
+\def\setupbuffer
+ {\dodoubleempty\dosetupbuffer}
+
+\def\dosetupbuffer[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??bu#1][#2]%
+ \else
+ \getparameters[\??bu][#1]%
+ \fi}
+
+\def\dodefinebuffer[#1][#2]%
+ {\iffirstargument % else problems
+ \doglobal\increment\nofdefinedbuffers
+ \letvalue{\??bu#1\c!number }\nofdefinedbuffers
+ \letvalue{\??bu#1\c!paragraph}\v!no
+ \setevalue{\e!start#1}{\noexpand\dostartbuffer[#1][def-\nofdefinedbuffers][\e!start#1][\e!stop#1]}%
+ \unexpanded\setevalue{\e!get #1}{\noexpand\dogetbuffer [#1][def-\nofdefinedbuffers]}%
+ \unexpanded\setevalue{\e!type #1}{\noexpand\dotypebuffer [#1][def-\nofdefinedbuffers]}%
+ \getparameters[\??bu#1][#2]%
+ \fi}
+
+\def\definebuffer
+ {\dodoubleempty\dodefinebuffer}
+
+\unexpanded\def\getbuffer
+ {\dodoubleempty\dogetbuffer}
+
+\def\dogetbuffer[#1][#2]%
+ {\ifsecondargument
+ \dodogetbuffer[#1][#2]%
+ \else
+ \dodogetbuffer[][#1]%
+ \fi}
+
+\def\dogetbufferasis{\readjobfile{\TEXbufferfile{\currentbuffer}}\donothing\donothing}%
+
+\def\dodogetbuffer[#1][#2]%
+ {\getvalue{\??bu#1\c!before}%
+ \dobuffer{16}{#2}\dogetbufferasis
+ \getvalue{\??bu#1\c!after}}
+
+\unexpanded\def\typebuffer
+ {\dodoubleempty\dotypebuffer}
+
+\def\dogetfilebuffer{\typefile{\TEXbufferfile{\currentbuffer}}}
+
+\def\dotypebuffer[#1][#2]%
+ {\iffirstargument
+ \dobuffer{17}{#1}\dogetfilebuffer
+ \else
+ \dobuffer{17}{#2}\dogetfilebuffer
+ \fi}
+
+\def\dobuffer#1#2#3%
+ {\doifelsenothing{#2}
+ {\dodobuffer#3\jobname}
+ {\processcommalist[#2]{\dodobuffer#3}}}
+
+\def\dodobuffer#1#2% command name
+ {\pushmacro\currentbuffer
+ \edef\currentbuffer{\ifcsname\??bu#2\c!number\endcsname def-\csname\??bu#2\c!number\endcsname\else#2\fi}%
+ \beginrestorecatcodes
+ #1%
+ \endrestorecatcodes
+ \popmacro\currentbuffer}
+
+\def\processTEXbuffer{\getbuffer} % handy
+
+% seldom used, only in a few projects that demanded more speed
+
+\def\dostartmemorybuffer
+ {\dosingleempty\dostartmemorybuffer}
+
+\long\def\dostartmemorybuffer[#1]#2\stopbuffer
+ {\setbuffer[#1]#2\endbuffer}
+
+\let\dostartfilebuffer\startbuffer
+
+\def\usememorybuffers{\let\startbuffer\dostartmemorybuffer}
+\def\usefilebuffers {\let\startbuffer\dostartfilebuffer}
+
+% this features is soldom used (complex examns where we need to fetch
+% special parts of a text
+%
+% this is not yet supported in mkiv (relatively easy to do but there
+% we don't have the par tags but need to grab 'm
+
+\def\skippedbufferparagraphs{0}
+
+\let\startbufferparagraph\relax
+\let\stopbufferparagraph \par % \relax
+
+\newcount\currentbufferparagraph
+
+\def\getbufferparagraphs
+ {\dodoubleempty\dogetbufferparagraphs}
+
+\def\dosetbufferoffset#1%
+ {\doifnumberelse{\getvalue{\??bu#1\c!paragraph}}
+ {\currentbufferparagraph-\getvalue{\??bu#1\c!paragraph}}
+ {\currentbufferparagraph \zerocount}%
+ \relax}
+
+\def\dogetbufferparagraphs[#1][#2]%
+ {\iffirstargument
+ \ifsecondargument
+ \dosetbufferoffset{#1}%
+ \doifelse{#2}\v!all
+ {\def\startbufferparagraph{\normalbufferparagraph{#1}}}
+ {\def\startbufferparagraph{\filterbufferparagraph{#1}{#2}}}%
+ \def\stopbufferparagraph{\dostopbufferparagraph{#1}}%
+ \def\next{\getparagraphedbuffer[#1]}%
+ \else
+ \dosetbufferoffset\empty
+ \def\startbufferparagraph{\filterbufferparagraph{}{#1}}%
+ \def\stopbufferparagraph{\dostopbufferparagraph{}}%
+ \def\next{\getparagraphedbuffer[]}%
+ \fi
+ \else
+ \dosetbufferoffset\empty
+ \def\startbufferparagraph{\normalbufferparagraph{}}%
+ \def\stopbufferparagraph{\dostopbufferparagraph{}}%
+ \def\next{\getparagraphedbuffer[]}%
+ \fi
+ \next}
+
+\def\dogetparagraphbuffer{\readjobfile{\TEXbufferfile{\currentbuffer}}\donothing\donothing}
+
+\def\getparagraphedbuffer[#1]%
+ {\dobuffer{16}{#1}\dogetparagraphbuffer}
+
+\def\dostopbufferparagraph#1%
+ {\getvalue{\??bu#1\c!after}\par}
+
+\def\dostartbufferparagraph#1%
+ {\par\getvalue{\??bu#1\c!before}}
+
+\def\normalbufferparagraph
+ {\advance\currentbufferparagraph \plusone
+ \ifnum\currentbufferparagraph>\zerocount
+ \expandafter\dostartbufferparagraph
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\filterbufferparagraph#1#2%
+ {\advance\currentbufferparagraph \plusone
+ \ifcase\currentbufferparagraph
+ \@EA\gobblebufferparagraph
+ \else
+ \doifinsetelse{\the\currentbufferparagraph}{#2}
+ {\@EA\dostartbufferparagraph}
+ {\@EA\fakebufferparagraph}%
+ \fi
+ {#1}}
+
+\long\def\gobblebufferparagraph#1#2\stopbufferparagraph
+ {}
+
+\def\fakebufferparagraph#1%
+ {\bgroup
+ \def\stopbufferparagraph{\dostopbufferparagraph{#1}\egroup\egroup}%
+ \setbox\scratchbox\vbox\bgroup\dostartbufferparagraph{#1}}
+
+% definitions
+
+\definebuffer[\v!hiding] \setupbuffer[\v!hiding][\c!local=\v!yes]
+
+\setupbuffer
+ [\c!paragraph=\v!no,
+ \c!before=,
+ \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/buff-ini.mkiv b/tex/context/base/buff-ini.mkiv
new file mode 100644
index 000000000..86b0fa3c5
--- /dev/null
+++ b/tex/context/base/buff-ini.mkiv
@@ -0,0 +1,355 @@
+%D \module
+%D [ file=buff-ini, % was core-buf, % blocks are moved to core-blk
+%D version=2000.01.05,
+%D title=\CONTEXT\ Buffer Macros,
+%D subtitle=Buffers,
+%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 Buffer Macros / Buffers}
+
+\registerctxluafile{buff-ini}{1.001}
+
+% todo:
+%
+% \startluacode
+% local locations = { }
+% function document.set_number(name)
+% locations[name] = {
+% line = status.linenumber,
+% file = status.filename
+% }
+% end
+% function document.add_number(name)
+% local b, l = buffers.raw(name), locations[name]
+% if b and l then
+% for i=1,#b do
+% b[i] = string.gsub(b[i],"# line: <number>","# line: " .. l.line + 2)
+% end
+% end
+% end
+% \stopluacode
+%
+% \starttext
+%
+% \ctxlua{document.set_number("oeps")}
+% \startbuffer[oeps]
+% # line: <number>
+%
+% test
+% test
+% \stopbuffer
+% \ctxlua{document.add_number("oeps")}
+%
+% \typebuffer[oeps]
+%
+% \stoptext
+
+\ifdefined\doinitializeverbatim \else% temp hack
+ \def\doinitializeverbatim{\tttf}
+\fi
+
+\unprotect
+
+\chardef\buffernestmode\plusone % 0: not nested, 1: startbuffer nested, 2: all buffers nested
+
+\newif\ifsegmentatebuffer
+\newif\ifemptybufferline
+
+\def\currentbuffer{\jobname}
+
+\def\setcurrentbuffer#1%
+ {\doifelsenothing{#1}{\edef\currentbuffer{\jobname}}{\edef\currentbuffer{#1}}}
+
+\def\resetbuffer
+ {\dosingleempty\doresetbuffer}
+
+\def\doresetbuffer[#1]%
+ {\begingroup
+ \setcurrentbuffer{#1}%
+ \ctxlua{buffers.erase("\currentbuffer")}%
+ \endgroup}
+
+\def\dostartbuffer
+ {\bgroup
+ \obeylines % nodig, anders gaat 't fout als direct \starttable (bv)
+ \doquadrupleempty\dodostartbuffer}
+
+\def\dodostartbuffer[#1][#2][#3][#4]% upward compatible
+ {\iffourthargument
+ \def\next{\dododostartbuffer{#1}{#2}{#3}{#4}}%
+ \else
+ \def\next{\dododostartbuffer {}{#1}{#2}{#3}}%
+ \fi
+ \next}
+
+\def\dododostartbuffer#1#2#3#4%
+ {%\showmessage\m!systems{15}{#2}%
+ \doifelsevalue{\??bu#1\c!paragraph}\v!yes
+ {\segmentatebuffertrue} % todo in mkiv
+ {\doifnumberelse{\getvalue{\??bu#1\c!paragraph}}\segmentatebuffertrue\segmentatebufferfalse}%
+ \doifvalue{\??bu#1\c!local}\v!yes
+ {\chardef\buffernestmode\plustwo}% permit nesting
+ \setcurrentbuffer{#2}%
+ \doifelsenothing{#4}
+ {\normalexpanded{\noexpand\setbuffercapsules{\e!start\v!buffer}{\e!stop\v!buffer}}%
+ \letvalue\bufferstop\relax}
+ %{\@EA\setbuffercapsules\@EA{\csname#3\@EA\endcsname\@EA}\@EA{\csname#4\endcsname}}% if we strip later
+ {\setbuffercapsules{#3}{#4}}%
+ \normalexpanded{\noexpand\dodowithbuffer
+ {\currentbuffer}
+ {\bufferstart}
+ {\bufferstop}
+ {\donothing}
+ {\egroup
+ \noexpand\getvalue{\bufferstop}}}}
+
+\letvalue{\e!start\v!buffer}\dostartbuffer
+
+\let\endbuffer\undefined % to please the dep parser
+
+\def\dowithbuffer#1#2#3% name, startsequence, stopsequence, before, after
+ {\setbuffercapsules{#2}{#3}%
+ \normalexpanded{\noexpand\dodowithbuffer{#1}{\bufferstart}{\bufferstop}}}
+
+\long\def\dodowithbuffer#1#2#3#4#5% name, startsequence, stopsequence, before, after
+ {#4%
+ \bgroup
+ \setcatcodetable \vrbcatcodes
+ \catcode`\\=12
+ \ctxlua{buffers.erase("#1")}%
+ \long\def\nododowithbuffer
+ {\egroup
+ #5}%
+ \long\def\dododowithbuffer##1#3% is detokenize needed? TEST
+ {\ctxlua
+ {buffers.grab("#1","#2","#3",\!!bs\detokenize{##1}\!!es)}
+ \dododowithbuffer
+ \nododowithbuffer}%
+ \dododowithbuffer}
+
+\def\setbuffercapsules#1#2% \scantextokens not needed (had a reason at some point)
+ {\edef\bufferstart{#1}\edef\bufferstart{\scantextokens\expandafter{\bufferstart}}%
+ \edef\bufferstop {#2}\edef\bufferstop {\scantextokens\expandafter{\bufferstop }}}
+
+\def\setbuffer
+ {\dosingleempty\dosetbuffer}
+
+\long\def\dosetbuffer[#1]#2\endbuffer % seldom used so we just pass #2
+ {\begingroup
+ \setcurrentbuffer{#1}%
+ \ctxlua{buffers.set("\currentbuffer", \!!bs\detokenize{#2}\!!es)}%
+ \endgroup}
+
+\unexpanded\def\setupbuffer
+ {\dodoubleempty\dosetupbuffer}
+
+\def\dosetupbuffer[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??bu#1][#2]%
+ \else
+ \getparameters[\??bu][#1]%
+ \fi}
+
+\def\dodefinebuffer[#1][#2]%
+ {\iffirstargument % else problems
+ \doglobal\increment\nofdefinedbuffers
+ \letvalue{\??bu#1\c!number }\nofdefinedbuffers
+ \letvalue{\??bu#1\c!paragraph}\v!no
+ \setuevalue{\e!start#1}{\noexpand\dostartbuffer[#1][def-\nofdefinedbuffers][\e!start#1][\e!stop#1]}% maybe also relax stop
+ \setuevalue{\e!get #1}{\noexpand\dogetbuffer [#1][def-\nofdefinedbuffers]}%
+ \setuevalue{\e!type #1}{\noexpand\dotypebuffer [#1][def-\nofdefinedbuffers]}%
+ \getparameters[\??bu#1][#2]%
+ \fi}
+
+\unexpanded\def\definebuffer
+ {\dodoubleempty\dodefinebuffer}
+
+\def\thebuffernumber#1%
+ {\csname\??bu#1\c!number\endcsname}
+
+\unexpanded\def\getbuffer
+ {\dodoubleempty\dogetbuffer}
+
+\def\dogetbuffer[#1][#2]%
+ {\ifsecondargument
+ \dodogetbuffer[#1][#2]%
+ \else
+ \dodogetbuffer[][#1]%
+ \fi}
+
+\def\dogetbufferasis{\ctxlua{buffers.get("\currentbuffer")}}
+
+\def\dodogetbuffer[#1][#2]%
+ {\getvalue{\??bu#1\c!before}%
+ \dobuffer{16}{#2}\dogetbufferasis
+ \getvalue{\??bu#1\c!after}}
+
+\unexpanded\def\typebuffer
+ {\dodoubleempty\dotypebuffer}
+
+\def\doprocessbufferverbatim
+ {\doinitializeverbatim
+ \ctxlua{buffers.type("\currentbuffer","\typingparameter\c!strip")}}
+
+\def\doprocessbufferlinesverbatim#1#2#3%
+ {#2%
+ % todo, set up numbers
+ \doinitializeverbatim
+ \ctxlua{buffers.type("\currentbuffer","\typingparameter\c!strip")}
+ #3}
+
+\def\doifelsebuffer#1%
+ {\ctxlua{buffers.doifelsebuffer("#1")}}
+
+\def\dodotypebuffer#1#2#3% see dodotypefile
+ {\doifelsebuffer{#3}
+ {\dosometyping{#1}{#2}{#3}\doprocessbufferverbatim\doprocessbufferlinesverbatim}
+ {\reporttypingerror{#3}}}
+
+\def\dotypefilebuffer{\dodotypebuffer{\v!file}{}{\currentbuffer}}%
+
+\def\dotypebuffer[#1][#2]%
+ {\iffirstargument
+ \dobuffer{17}{#1}\dotypefilebuffer
+ \else
+ \dobuffer{17}{#2}\dotypefilebuffer
+ \fi}
+
+\def\dobuffer#1#2#3%
+ {\doifelsenothing{#2}
+ {\dodobuffer#3\jobname}
+ {\processcommalist[#2]{\dodobuffer#3}}}
+
+\def\dodobuffer#1#2% command name
+ {\pushmacro\currentbuffer
+ \edef\currentbuffer{\ifcsname\??bu#2\c!number\endcsname def-\csname\??bu#2\c!number\endcsname\else#2\fi}%
+ #1%
+ \popmacro\currentbuffer}
+
+\def\processTEXbuffer{\getbuffer} % handy
+
+% extras:
+
+\def\inspectbuffer
+ {\dosingleempty\doinspectbuffer}
+
+\def\doinspectbuffer[#1]%
+ {\setcurrentbuffer{#1}%
+ \ctxlua{buffers.inspect("\currentbuffer")}}
+
+% seldom used, only in a few projects that demanded more speed
+
+\let\usememorybuffers\relax
+\let\usefilebuffers \relax
+
+% this features is soldom used (complex examns where we need to fetch
+% special parts of a text
+%
+% this is not yet supported in mkiv (relatively easy to do but there
+% we don't have the par tags but need to grab 'm
+
+\def\skippedbufferparagraphs{0}
+
+\let\startbufferparagraph\relax
+\let\stopbufferparagraph \par % \relax
+
+\newcount\currentbufferparagraph
+
+\def\getbufferparagraphs
+ {\dodoubleempty\dogetbufferparagraphs}
+
+\def\dosetbufferoffset#1%
+ {\doifnumberelse{\getvalue{\??bu#1\c!paragraph}}
+ {\currentbufferparagraph-\getvalue{\??bu#1\c!paragraph}}
+ {\currentbufferparagraph \zerocount}%
+ \relax}
+
+\def\dogetbufferparagraphs[#1][#2]%
+ {\iffirstargument
+ \ifsecondargument
+ \dosetbufferoffset{#1}%
+ \doifelse{#2}\v!all
+ {\unexpanded\def\startbufferparagraph{\normalbufferparagraph{#1}}}
+ {\unexpanded\def\startbufferparagraph{\filterbufferparagraph{#1}{#2}}}%
+ \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{#1}}%
+ \def\next{\getparagraphedbuffer[#1]}%
+ \else
+ \dosetbufferoffset\empty
+ \unexpanded\def\startbufferparagraph{\filterbufferparagraph{}{#1}}%
+ \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{}}%
+ \def\next{\getparagraphedbuffer[]}%
+ \fi
+ \else
+ \dosetbufferoffset\empty
+ \unexpanded\def\startbufferparagraph{\normalbufferparagraph{}}%
+ \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{}}%
+ \def\next{\getparagraphedbuffer[]}%
+ \fi
+ \next}
+
+\def\dotypeparagraphbuffer{\ctxlua{buffers.get("\currentbuffer")}}
+
+\def\getparagraphedbuffer[#1]%
+ {\dobuffer{16}{#1}\dotypeparagraphbuffer}
+
+\def\dostopbufferparagraph#1%
+ {\getvalue{\??bu#1\c!after}\par}
+
+\def\dostartbufferparagraph#1%
+ {\par\getvalue{\??bu#1\c!before}}
+
+\def\normalbufferparagraph
+ {\advance\currentbufferparagraph \plusone
+ \ifnum\currentbufferparagraph>\zerocount
+ \expandafter\dostartbufferparagraph
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\filterbufferparagraph#1#2%
+ {\advance\currentbufferparagraph \plusone
+ \ifcase\currentbufferparagraph
+ \@EA\gobblebufferparagraph
+ \else
+ \doifinsetelse{\the\currentbufferparagraph}{#2}
+ {\@EA\dostartbufferparagraph}
+ {\@EA\fakebufferparagraph}%
+ \fi
+ {#1}}
+
+\long\def\gobblebufferparagraph#1#2\stopbufferparagraph
+ {}
+
+\def\fakebufferparagraph#1%
+ {\bgroup
+ \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{#1}\egroup\egroup}%
+ \setbox\scratchbox\vbox\bgroup\dostartbufferparagraph{#1}}
+
+% definitions
+
+\definebuffer[\v!hiding] \setupbuffer[\v!hiding][\c!local=\v!yes]
+
+\setupbuffer
+ [\c!paragraph=\v!no,
+ \c!before=,
+ \c!after=]
+
+% only mkiv:
+%
+% \startbuffer[x]
+% x
+% \stopbuffer
+%
+% \savebuffer[x][temp.log]
+
+\unexpanded\def\savebuffer{\dodoubleempty\dosavebuffer}
+
+\def\dosavebuffer[#1][#2]{\ctxlua{commands.savebuffer("#1","#2")}}
+
+\protect \endinput
diff --git a/tex/context/base/buff-ver.mkii b/tex/context/base/buff-ver.mkii
new file mode 100644
index 000000000..e7ad5474f
--- /dev/null
+++ b/tex/context/base/buff-ver.mkii
@@ -0,0 +1,1340 @@
+%D \module
+%D [ file=buff-ver, % was core-ver
+%D version=2000.05.09,
+%D title=\CONTEXT\ Buffer Macros,
+%D subtitle=Verbatim,
+%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 Buffer Macros / Verbatim}
+
+\unprotect
+
+\ifx\startlinenumbering\undefined \let\startlinenumbering\relax \fi
+\ifx\stoplinenumbering \undefined \let\stoplinenumbering\relax \fi
+\ifx\setuplinenumbering\undefined \def\setuplinenumbering[#1]{} \fi
+
+% \type{ <crlf> char} geeft bagger
+
+%D We are going to embed the general verbatim support macros in
+%D a proper environment. First we show the common setup
+%D macro, so we know what features are supported. The options
+%D are hooked into the support macros via the \type{\obey}
+%D macros.
+
+\newif\ifslantedtypeactivated
+\newif\ifslantedtypepermitted
+
+\def\switchslantedtype
+ {\ifslantedtypepermitted
+ \ifslantedtypeactivated
+ \slantedtypeactivatedfalse\tttf
+ \else
+ \slantedtypeactivatedtrue\ttsl
+ \fi
+ \fi}
+
+\newprettytrue % movet to here from cont-sys.tex
+
+\def\prettyidentifier {TEX}
+\def\prettypalet {}
+
+\def\installprettytype
+ {\dodoubleargument\doinstallprettytype}
+
+\def\doinstallprettytype[#1][#2]% map #1 onto #2
+ {\uppercasestring#1\to\asciia
+ \uppercasestring#2\to\asciib
+ \setevalue{\??ty\??ty\asciia}{\asciib}}
+
+\def\setupprettiesintype#1%
+ {\uppercasestring#1\to\ascii
+ \edef\prettyidentifier{\executeifdefined{\??ty\??ty\ascii}{TEX}}%
+ \doifundefined{setuppretty\prettyidentifier type}%
+ {\startnointerference
+ \restorecatcodes % also needed when loading during \newpretty
+ \startreadingfile % restore < and > if needed
+ \lowercasestring verb-\prettyidentifier\to\filename
+ \readsysfile{\filename.mkii}\donothing\donothing
+ \stopreadingfile
+ \stopnointerference}%
+ \doifdefinedelse{setuppretty\prettyidentifier type}%
+ {\let\uncatcodecharacters\uncatcodeallcharacters % ugly, should be switch / todo
+ \def\dosetupprettytype{\getvalue{setuppretty\prettyidentifier type}}}
+ {\let\dosetupprettytype\relax}}
+
+\def\setupprettytype{\dosetupprettytype}
+
+% \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
+ %
+ \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 % not needed in mkiv
+ {\chardef\tabskipmode\plustwo % quit on >127
+ \def\obeytabs{\settabskips}}}%
+ %
+ \ignorehyphens % default
+ \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
+ %\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}
+
+% BEWARE: the noligatures will globally change the verbatim font's behaviour
+
+% test case:
+%
+% \definetype[typeTEX][option=tex]
+%
+% \typeTEX|\example---oeps|. this---ligates---again.
+% \typeTEX{\example---oeps}. this---ligates---again.
+% \type {\example---oeps}. this---ligates---again.
+
+\def\setupcommandsintype % can also be \string\
+ {\setupgroupedtype
+ \edef\\{\typingparameter\c!escape}%
+ \letvalue{\\}=\\% for instance \/=/
+ \@EA\catcode\@EA`\\=\@@escape
+ \def\BTEX##1\ETEX##2% ##2 gobbles active space
+ {\naturaltextext##1\unskip\relax}}
+
+\def\setupslantedtype
+ {\slantedtypepermittedtrue\setupgroupedtype}
+
+\ifx\setupprettytype \undefined \let\setupprettytype \relax \fi
+\ifx\setupslantedtype \undefined \let\setupslantedtype \relax \fi
+\ifx\setupgroupedtype \undefined \let\setupgroupedtype \relax \fi
+\ifx\normalnoligatures\undefined \let\normalnoligatures\gobbleoneargument \fi
+
+%D The verbatim commands have a rather long and turbulent
+%D history. Most users of \CONTEXT\ probably will never use
+%D some of the features, but I've kept in mind that when one is
+%D writing a users manual, about everything can and undoubtly
+%D will be subject to a verbatim treatment.
+%D
+%D Verbatim command are very sensitive to argument processing,
+%D which is a direct result of the \CATCODES\ being fixed at
+%D reading time. With our growing understanding of \TEX,
+%D especially of the mechanism that can be used for looking
+%D ahead and manipulating \CATCODES, the verbatim support
+%D became more and more advanced and natural.
+%D
+%D Typesetting inline verbatim can be accomplished by
+%D \type{\type}, which in this sentence was typeset by saying
+%D just \type{\type{\type}}, which in turn was typeset by
+%D \unknown. Using the normal grouping characters \type{{}} is
+%D the most natural way of using this command.
+%D
+%D A second, more or less redundant, alternative is delimiting
+%D the argument with an own character. This method was
+%D implemented in the context of a publication in the \MAPS,
+%D where this way of delimiting is recognized by \LATEX\ users.
+%D
+%D The third, more original alternative, is the one using
+%D \type{<<} and \type{>>} as delimiters. This alternative can
+%D be used in situations where slanted typeseting is needed.
+
+% todo: we can use \letter... here:
+
+\def\lesscharacter {<}
+\def\morecharacter {>}
+
+\chardef\texescape = `\\
+\chardef\leftargument = `\{
+\chardef\rightargument = `\}
+
+%D \macros
+%D {type}
+%D
+%D We define \type{\type} as a protected command. This command
+%D has several invocations: grouped, wirt boundary characters,
+%D and with font switches.
+
+% \starttyping
+% normal: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+% normal: \par \type{xx<..xx..<xx <slanted> >..>xx} \par \type{<....>} \par \type{<..<xx>..>}
+% \setuptype[option=slanted]
+% slanted: \par \type{xx<<..sl..<<xx <<sl>> xx>>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<<sl>>..>> \par
+% slanted: \par \type{xx<<..sl..<xx <sl> xx>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<sl>..>> \par
+% \setuptype[option=none]
+% none: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+% \stoptyping
+
+%D When writing the manual to \CONTEXT\ and documenting this
+%D source we needed to typeset \type{<<} and \type{>>}. Because
+%D we wanted to do this in the natural way, we've adapted the
+%D original definition a bit. This implementation went through
+%D several live cycles. The final implementation looks a bit
+%D further and treats the lone \type{<<} and \type{>>} a bit
+%D different. The \type {\null} prevents ligatures, which
+%D unfortunately turn up in Lucida fonts.
+
+%D The following lines show what happens when we set
+%D \type {option=commands}.
+%D
+%D \startbuffer
+%D \starttyping
+%D test//test test/BTEX \footnote{test test test}/ETEX test
+%D test//test test/BTEX \footnote{test test test}/ETEX test
+%D test test test/BTEX \bf(nota bene)/ETEX test
+%D test test test /BTEX \bf(nota bene)/ETEX test
+%D \stoptyping
+%D \stopbuffer
+%D
+%D % \bgroup\setuptyping[option=commands]\getbuffer\egroup
+%D
+%D this was keyed in as:
+%D
+%D \typebuffer
+
+\unexpanded\def\type{\dotype\empty}
+
+% not that fast but catches \type{\command} % nothing more after \command
+%
+% \setupcolors[state=start]
+% \setuptype[option=TEX]
+% \setupcolors[textcolor=red]
+%
+% The options \type{before=\startsolutionbackground } and
+% \type{after=\stopsolutionbackground} take care of putting a frame,
+% which can
+%
+% {\blue The options \type{before=\startsolutionbackground } and
+% \type{after=\stopsolutionbackground} take care of putting a frame,
+% which} can
+
+\def\resumecoloraftergroup
+ {\localstartcolor[\s!black]%
+ \localstartcolor[\maintextcolor]%
+ \aftergroup\localstopcolor
+ \aftergroup\localstopcolor}
+
+% the rather messy \type command
+
+\def\dotype#1% was \dotype
+ {\bgroup
+ \resumecoloraftergroup % a problem is that we can still be in color mode, tricky hack
+ \begstrut % new, enables leading space in \type { abc } at par start / begstrut else no hyphenation
+ \let\currenttypingclass\??ty
+ \edef\currenttyping{#1}%
+ \catcode`\<=\@@other
+ \catcode`\>=\@@other
+ \futurelet\next\dodotype}
+
+\def\dodotypeA
+ {\initializetype
+ \initializetypegrouping
+ \verbatimfont
+ \verbatimcolor
+ \afterassignment\protectfirsttype\let\next=}
+
+\def\dodotypeB
+ {\initializetype
+ \setupnotypegrouping
+ \verbatimfont
+ \verbatimcolor
+ \let\next=}
+
+\def\dodotypeC<#1%
+ {\initializetype
+ \verbatimfont
+ \verbatimcolor
+ \if#1<%
+ \@EA\setupalternativetypegrouping
+ \else
+ \@EA#1%
+ \fi}
+
+\def\dodotypeD#1%
+ {\initializetype
+ \verbatimfont
+ \verbatimcolor
+ \catcode`#1=\@@endgroup}
+
+\def\dodotype
+ {\ifx\next\bgroup
+ \@EA\dodotypeA
+ \else\if\next<%
+ \doifelse{\typingparameter\c!option}\v!none
+ {\@EAEAEA\dodotypeB}{\@EAEAEA\dodotypeC}%
+ \else
+ \@EAEAEA\dodotypeD
+ \fi\fi}
+
+% The next one is safe for: \def\xx#1{\type{#1}} \xx{\ifx}
+
+\let\protectedfirsttype\string % \relax for special cases
+
+\bgroup
+\catcode`\<=\active
+\catcode`\>=\active
+\gdef\doprotectfirsttype
+ {\normalifx\next<%
+ \endrobusttest \let\next\relax
+ \normalelse\normalifx\next\bgroup
+ \endrobusttest \let\next\relax
+ \normalelse\normalifx\next\egroup % takes care of \type{}
+ \endrobusttest \let\next\relax
+ \normalelse\normalifx\next\activeleftargument
+ \endrobusttest \let\next\relax
+ \normalelse
+ \endrobusttest \let\next\protectedfirsttype
+ \normalfi\normalfi\normalfi\normalfi
+ \next}
+\egroup
+
+\def\protectfirsttype
+ {\beginrobusttest
+ \futurelet\next\doprotectfirsttype}
+
+% Verbatim does not work when passed as an argument, so here is a
+% workaround. Beware, spaces are introduced after a \type {\csname}.
+
+\chardef\recodeverbatimmode\zerocount % 0=nothing 1=rescan 2=autorescan
+
+% \appendtoks \chardef\recodeverbatimmode\plustwo \to \everytabulate
+% \appendtoks \chardef\recodeverbatimmode\plustwo \to \everytable
+
+\def\dodotypeA
+ {\initializetype
+ \initializetypegrouping
+ \verbatimfont
+ \verbatimcolor
+ \ifcase\recodeverbatimmode
+ \@EA\dodotypeAA
+ \or
+ \@EA\dodotypeAB
+ \or
+ \ifnum\catcode`\{=\@@active
+ \@EAEAEA\dodotypeAB
+ \else
+ \@EAEAEA\dodotypeAA
+ \fi
+ \else
+ \@EA\dodotypeAA
+ \fi}
+
+\def\dodotypeAA
+ {\afterassignment\protectfirsttype\let\next=}
+
+\def\dodotypeAB
+ {\bgroup
+ \catcode`\}=\@@endgroup
+ \catcode`\{=\@@begingroup
+ \afterassignment\redotypeAB\global\globalscratchtoks}
+
+\def\redotypeAB
+ {\egroup
+ \expandafter\defconvertedargument\expandafter\ascii\expandafter{\the\globalscratchtoks}% == \edefconvertedargument\ascii{\the\globalscratchtoks}%
+ \ifx\scantokens\undefined\ascii\else\everyeof{\hskip-\spaceskip}\scantokens\expandafter{\ascii}\fi
+ \egroup}
+
+\bgroup
+\catcode`\[=\@@begingroup
+\catcode`\]=\@@endgroup
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\gdef\initializetypegrouping
+ [\ifnum\catcode`\{=\@@active
+ \let\normalactivebgroup{%
+ \let\normalactiveegroup}%
+ \else
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \let\normalactivebgroup\leftargument
+ \let\normalactiveegroup\rightargument
+ \fi
+ \def\activeleftargument
+ [\bgroup
+ \catcode`\}=\@@active
+ \let}\activerightargument
+ \normalactivebgroup]%
+ \def\activerightargument
+ [\normalactiveegroup
+ \egroup]%
+ \let{=\activeleftargument
+ % not \let}=\egroup, otherwise things go wrong in alignments (???)
+ \catcode`\}=\@@endgroup]
+\egroup
+
+\bgroup
+\catcode`\<=\@@active
+\catcode`\>=\@@active
+\gdef\setupalternativetypegrouping
+ {\catcode`\<=\@@active
+ \catcode`\>=\@@active
+ \def\doless
+ {\ifx<\next
+ \def\next
+ {\bgroup\switchslantedtype
+ \let\next=}%
+ \else
+ \let\next\lesscharacter
+ \fi
+ \next}%
+ \def\domore
+ {\ifx>\next
+ \def\next
+ {\egroup
+ \let\next=}%
+ \else
+ \let\next\morecharacter
+ \fi
+ \next}%
+ \def<{\futurelet\next\doless}%
+ \def>{\futurelet\next\domore}}
+\egroup
+
+\def\setupnotypegrouping
+ {\catcode`\<=\@@begingroup
+ \catcode`\>=\@@endgroup}
+
+\def\doenterdoublelesstype
+ {\ifx\next\egroup
+ \lesscharacter\null\lesscharacter
+ \else
+ \bgroup\switchslantedtype
+ \let\doenterdoublemoretype\egroup
+ \fi}
+
+\def\doenterdoublemoretype
+ {\def\doenterdoubletype
+ {\ifx\next\egroup
+ \morecharacter\null\morecharacter
+ \fi}}
+
+\bgroup
+\catcode`\<=\@@active
+\catcode`\>=\@@active
+\gdef\setupgroupedtype
+ {\catcode`\<=\@@active
+ \catcode`\>=\@@active
+ \def\doless
+ {\ifx<\next
+ \def\next
+ {\def\enterdoubletype{\futurelet\next\doenterdoublelesstype}%
+ \afterassignment\enterdoubletype
+ \let\next=}%
+ \else
+ \let\next\lesscharacter
+ \fi
+ \next}%
+ \def\domore
+ {\ifx>\next
+ \def\next
+ {\def\enterdoubletype{\futurelet\next\doenterdoublemoretype}%
+ \afterassignment\enterdoubletype
+ \let\next=}%
+ \else
+ \let\next\morecharacter
+ \fi
+ \next}%
+ \def<{\futurelet\next\doless}%
+ \def>{\futurelet\next\domore}}
+\egroup
+
+%D The neccessary initializations are done by calling
+%D \type{\initializetype} which in return calls for the support
+%D macro \type{\setupinlineverbatim}.
+
+\def\initializetype
+ {\let\obeylines\ignorelines
+ \setupcommonverbatim
+ \setupinlineverbatim}
+
+%D \macros
+%D {setuptype}
+%D
+%D Some characteristics of \type{\type} can be set up by:
+
+\def\setuptype
+ {\dodoubleempty\dosetuptype}
+
+\def\dosetuptype[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??ty#1][#2]%
+ \else
+ \getparameters[\??ty][#1]%
+ \fi}
+
+%D \macros
+%D {typ,obeyhyphens,obeybreakpoints}
+%D
+%D Although it's not clear from the macros, one character
+%D trait of this macros, which are build on top of the support
+%D module, is that they don't hyphenate. We therefore offer
+%D the alternative \type{\typ}. The current implementation
+%D works all right, but a decent hyphenation support of
+%D \type{\tt} text will be implemented soon.
+
+\def\obeyhyphens
+ {\def\obeyedspace {\hskip\interwordspace\relax}% better than spaceskip
+ \def\controlspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\relax}%
+ \spaceskip.25em\relax} % hm a bit of stretch !
+
+\def\obeybreakpoints
+ {\ignorehyphens
+ \veryraggedright}
+
+\def\ignorehyphens
+ {% \nohyphens % forgotten when no \par
+ \normallanguage\minusone % fails as the font redoes the language
+ \def\obeyedspace {\hskip\interwordspace\relax}% better than spaceskip
+ \def\controlspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\relax}%
+ \spaceskip.5em\relax}
+
+
+\unexpanded\def\typ
+ {\bgroup
+ \let\@@tylines\v!hyphenated
+ \futurelet\next\dodotype}
+
+%D \macros
+%D {tex,arg,mat,dis}
+%D
+%D Sometimes, for instance when we pass verbatim text as an
+%D argument, the fixed \CATCODES\ interfere with our wishes. An
+%D experimental implementation of character by character
+%D processing of verbatim text did overcome this limitation,
+%D but we've decided not to use that slow and sometimes
+%D troublesome solution. Instead we stick to some 'old'
+%D \CONTEXT\ macros for typesetting typical \TEX\ characters.
+%D
+%D The next implementation is more clear but less versatile,
+%D so we treated it for a beter one.
+%D
+%D \starttyping
+%D \def\dospecialtype#1#2%
+%D {\bgroup
+%D \initializetype
+%D \catcode`\{=\@@begingroup
+%D \catcode`\}=\@@endgroup
+%D \def\dospecialtype%
+%D {\def\dospecialtype{#2\egroup}%
+%D \bgroup
+%D \aftergroup\dospecialtype
+%D #1}%
+%D \afterassignment\dospecialtype
+%D \let\next=}
+%D
+%D \unexpanded\def\tex{\dospecialtype\texescape\relax}
+%D \unexpanded\def\arg{\dospecialtype\leftargument\rightargument}
+%D \unexpanded\def\mat{\dospecialtype\$\$}
+%D \unexpanded\def\dis{\dospecialtype{\$\$}{\$\$}}
+%D \stoptyping
+
+\def\setgroupedtype
+ {\let\currenttypingclass\??ty
+ \initializetype
+ \verbatimcolor
+ %\setcatcodetable \typcatcodesa
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup}
+
+\unexpanded\def\tex{\groupedcommand{\setgroupedtype\texescape}{\relax}}
+\unexpanded\def\arg{\groupedcommand{\setgroupedtype\leftargument}{\rightargument}}
+\unexpanded\def\mat{\groupedcommand{\setgroupedtype\$}{\$}}
+\unexpanded\def\dis{\groupedcommand{\setgroupedtype\$\$}{\$\$}}
+
+\let\normaltexttex\tex
+\let\normaltextarg\arg
+\let\normaltextmat\mat
+\let\normaltextdis\dis
+
+%D \macros
+%D {starttyping}
+%D
+%D Display verbatim is realized far more easy, which is mostly
+%D due to the fact that we use \type{\stop...} as delimiter.
+%D The implementation inherits some features, for instance the
+%D support of linenumbering, which can best be studied in the
+%D documented support module.
+
+\let\currenttyping \empty
+\let\currenttypingclass\??ty % saveguard
+
+% \def\typingparameter#1%
+% {\executeifdefined
+% {\currenttypingclass\currenttyping#1}%
+% {\executeifdefined{\currenttypingclass#1}\empty}}
+
+\def\typingparameter#1%
+ {\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]%
+ \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
+ \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
+ \else
+ \edef\verbatimbaselineskip{\the\baselineskip}%
+ \fi
+ \else
+ \edef\verbatimbaselineskip{\the\scratchskip}%
+ \fi
+ \setupcommonverbatim}
+
+%D The basic display verbatim commands are defined in an
+%D indirect way. As we will see, they are a specific case of a
+%D more general mechanism.
+
+% we need this hack because otherwise verbatim skips
+% the first line (everything after the initial command)
+
+\def\dostarttyping#1% tricky non standard lookahead
+ {\bgroup
+ \let\currenttypingclass\??tp
+ \edef\currenttyping{#1}%
+ \obeylines
+ \futurelet\nexttoken\dodostarttyping}
+
+\def\dodostarttyping
+ {\ifx\nexttoken[%
+ \expandafter\dododostarttyping
+ \else
+ \expandafter\nododostarttyping
+ \fi}
+
+\def\nododostarttyping
+ {\dododostarttyping[]}
+
+\def\dododostarttyping[#1]%
+ {\typingparameter\c!before
+ \startpacked % includes \bgroup
+ \dosetuptypelinenumbering{#1}%
+ \initializetyping
+ \startverbatimcolor
+ \expanded{\processdisplayverbatim{\s!stop\currenttyping}}}
+
+\def\dostoptyping#1% hm, currenttyping
+ {\stopverbatimcolor
+ \stoppacked % includes \egroup
+ \typingparameter\c!after
+ \egroup
+ \dochecknextindentation{\??tp#1}%
+ \dorechecknextindentation}
+
+%D Line numbering for files is combined with filtering, while
+%D display verbatim has the ability to continue.
+%D
+%D \starttyping
+%D \typefile[numbering=file,start=10,stop=12]{test.tex}
+%D
+%D \definetyping[code][numbering=line]
+%D
+%D \starttext
+%D \startcode
+%D ...
+%D ...
+%D \stopcode
+%D
+%D \startcode[continue]
+%D ...
+%D ...
+%D \stopcode
+%D
+%D \startcode[start=10]
+%D ...
+%D \stopcode
+%D \stoptyping
+
+%D \macros
+%D {setuptyping}
+%D
+%D The setup of typing accepts two arguments. The optional
+%D first one identifies the user defined ones. If only one
+%D argument is given, the values apply to both the standard
+%D command \type{\starttyping} and \type{\typefile}.
+
+\def\dosetuptyping[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??tp#1][#2]%
+ \else
+ \getparameters[\??tp][#1]%
+ \fi}
+
+\def\setuptyping
+ {\dodoubleempty\dosetuptyping}
+
+%D \macros
+%D {definetype}
+%D
+%D Specific inline verbatim commands can be defined with the
+%D following command.
+
+\def\definetype
+ {\dodoubleempty\dodefinetype}
+
+\def\dodefinetype[#1][#2]%
+ {\unexpanded\setvalue{#1}{\dotype{#1}}%
+ \getparameters[\??ty#1][#2]}
+
+%D \macros
+%D {definetyping}
+%D
+%D For most users the standard \type{\start}||\type{\stop}||pair
+%D will suffice, but for documentation purposes the next
+%D definition command can be of use:
+%D
+%D \starttyping
+%D \definetyping[extratyping][margin=3em]
+%D
+%D \startextratyping
+%D these extra ones are indented by 1 em
+%D \stopextratyping
+%D \stoptyping
+%D
+%D The definitions default to the standard typing values.
+
+\def\presettyping[#1][#2]%
+ {\copyparameters[\??tp#1][\??tp][\c!color,\c!style]%
+ \getparameters [\??tp#1][#2]}
+
+\def\dodefinetyping[#1][#2]%
+ {\setvalue{\e!start#1}{\dostarttyping{#1}}%
+ \setvalue{\e!stop #1}{\dostoptyping {#1}}%
+ \presettyping[#1][#2]}
+
+\def\definetyping
+ {\dodoubleempty\dodefinetyping}
+
+%D We can use some core color commands. These are faster than
+%D the standard color switching ones and work ok on a line by
+%D line basis.
+%D
+%D \starttyping
+%D \def\setupverbatimcolor%
+%D {\edef\prettypalet{\prettyidentifier\typingparameter\c!palet}%
+%D \def\beginofpretty[##1]{\startcolormode{\prettypalet:##1}}%
+%D \def\endofpretty {\stopcolormode}}
+%D \stoptyping
+%D
+%D Since we support a global color too, the folowing
+%D definition is better:
+
+% \def\setupverbatimcolor% fast and local versus slow and global
+% {\doifelsenothing{\typingparameter\c!color}
+% {\def\beginofpretty[##1]{\startcolormode{\prettypalet:##1}}%
+% \let\endofpretty \restorecolormode % \stopcolormode
+% \let\startverbatimcolor \relax
+% \let\stopverbatimcolor \relax
+% \let\verbatimcolor \relax}
+% {\def\beginofpretty[##1]{\startcolor[\prettypalet:##1]}%
+% \let\endofpretty \stopcolor
+% \def\startverbatimcolor{\startcolor[\typingparameter\c!color]}%
+% \let\stopverbatimcolor \stopcolor
+% \def\verbatimcolor {\getvalue{\typingparameter\c!color}}}% command !
+% \doifelsenothing{\typingparameter\c!palet}
+% {\let\prettypalet\empty
+% \let\endofpretty\relax
+% \def\beginofpretty[##1]{}}
+% {\edef\prettypalet{\prettyidentifier\typingparameter\c!palet}}}
+%
+% let's forget about this optimization not that we have mkiv
+
+\def\setupverbatimcolor
+ {\def\beginofpretty[##1]{\startcolor[\prettypalet:##1]}%
+ \let\endofpretty \stopcolor
+ \def\startverbatimcolor{\startcolor[\typingparameter\c!color]}%
+ \let\stopverbatimcolor \stopcolor
+ \def\verbatimcolor {\getvalue{\typingparameter\c!color}}% command !
+ \doifelsenothing{\typingparameter\c!palet}
+ {\let\prettypalet\empty
+ \let\endofpretty\relax
+ \def\beginofpretty[##1]{}}
+ {\edef\prettypalet{\prettyidentifier\typingparameter\c!palet}}}
+
+\let\prettypalet \empty
+\let\startverbatimcolor\relax
+\let\stopverbatimcolor \relax
+\let\verbatimcolor \relax
+
+%D In the verbatim module, there are some examples given of
+%D the more obscure features of the verbatim environments.
+%D
+%D \startbuffer
+%D \startTEX
+%D \def\mathematics#1% % usage: \type {\mathematics{x^2}}
+%D {\ifmmode#1\else$#1$\fi} % becomes: \mathematics{x^2}
+%D \stopTEX
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This gives, as can be expected:
+%D
+%D \getbuffer
+%D
+%D When we want to see some typeset \TEX\ too, we can say:
+%D
+%D \startbuffer
+%D \startTEX
+%D \def\mathematics#1% %%\ N usage: \type {\mathematics{x^2}}
+%D {\ifmmode#1\else$#1$\fi} %%\ N becomes: \mathematics{x^2}
+%D \stopTEX
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or:
+%D
+%D \getbuffer
+%D
+%D In a similar way:
+%D
+%D \startbuffer
+%D \startSQL
+%D select * -- indeed, here we {\em do} select
+%D from tableA
+%D where 1 = 2
+%D \stopSQL
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives:
+%D
+%D \getbuffer
+%D
+%D The next examples sow how we can directly call for natural
+%D \TEX\ comments:
+%D
+%D \startbuffer
+%D \setuptyping
+%D [TEX]
+%D [text=yes]
+%D
+%D \startTEX
+%D \def\mathematics#1% % usage: \type {\mathematics{x^2}}
+%D {\ifmmode#1\else$#1$\fi} % becomes: \mathematics{x^2}
+%D \stopTEX
+%D
+%D \setuptyping
+%D [SQL]
+%D [text=yes,palet=,icommand=\bf,vcommand=,ccommand=\it]
+%D
+%D \startSQL
+%D select * -- indeed, here we {\em do} select
+%D from tableA
+%D where 1 = 2
+%D \stopSQL
+%D
+%D \setuptyping
+%D [SQL]
+%D [ccommand=\tf\underbar]
+%D
+%D \startSQL
+%D select * -- indeed, here we {\em do} select
+%D from tableA
+%D where 1 = 2
+%D \stopSQL
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Now watch:
+%D
+%D \getbuffer
+%D
+%D The natural \TEX\ typesetting was introduced when Tobias
+%D and Berend started using verbatim \JAVASCRIPT\ and \SQL.
+
+%D \macros
+%D {EveryPar, EveryLine, iflinepar}
+%D
+%D One of the features of these commands is the support of
+%D \type{\EveryPar}, \type{\EveryLine} and \type{\iflinepar}.
+%D In the documentation of the verbatim support module we give
+%D some examples of line- and paragraph numbering using these
+%D macros.
+
+%D \macros
+%D {typefile}
+%D
+%D Typesetting files verbatim (for the moment) only supports
+%D colorization of \TEX\ sources as valid option. The other
+%D setup values are inherited from display verbatim.
+%D The implementation of \type{\typefile} is straightforward:
+
+% new feature (not yet 100\% ok)
+%
+% \setuptyping[file][numbering=file]
+%
+% \typefile[start=2,nlines=3]{zapf}
+% \typefile[start=continue,nlines=13]{zapf}
+% \typefile{zapf}
+%
+% \setuptyping[file][numbering=line]
+%
+% \typefile[start=4,step=3]{zapf}
+% \typefile{zapf}
+
+\def\typefile
+ {\dodoubleempty\dotypefile}
+
+\def\dotypefile[#1][#2]#3%
+ {\ifsecondargument
+ \dodotypefile[#1][#2]{#3}%
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\dodotypefile[\v!file][#1]{#3}}
+ {\dodotypefile[#1][]{#3}}%
+ \else
+ \dodotypefile[\v!file][]{#3}%
+ \fi\fi}
+
+\def\dosetuptypelinenumbering#1% fuzzy
+ {\doifundefined{\currenttypingclass\currenttyping\c!start}
+ {\setuptyping[\currenttyping][\c!start=1,\c!stop=,\c!step=1,\c!nlines=]}%
+ \setuptyping[\currenttyping][#1]%
+ \doifelse{\typingparameter\c!numbering}\v!file
+ {% kind of special: filters lines !
+ \setuplinenumbering[\c!method=\v!file]%
+ \donetrue}
+ {\doifelse{\typingparameter\c!numbering}\v!line
+ {% \setuplinenumbering defaults start/step to 1/1, so we need
+ \doifinsetelse\v!continue{#1,\typingparameter\c!start}
+ {\scratchcounter0\typingparameter\c!n
+ \setxtypingparameter\c!start{\ifnum\scratchcounter=0 1\else\number\scratchcounter\fi}}%
+ {\doifnothing{\typingparameter\c!start}{\settypingparameter\c!start{1}}}%
+ \doifnothing{\typingparameter\c!step}{\settypingparameter\c!step{1}}%
+ \setuplinenumbering
+ [\c!method=\v!type,
+ \c!start=\typingparameter\c!start,
+ \c!stop=\typingparameter\c!stop,
+ \c!step=\typingparameter\c!step]%
+ \donetrue}
+ {\donefalse}}%
+ \ifdone
+ \ifx\startlinenumbering\undefined \let\startlinenumbering\relax \fi
+ \ifx\stoplinenumbering \undefined \let\stoplinenumbering \relax \fi
+ \def\beginofverbatimlines{\startlinenumbering}%
+ \def\endofverbatimlines {\stoplinenumbering\setxtypingparameter\c!n{\number\linenumber}}%
+ \fi}
+
+\def\reporttypingerror#1% temp hack
+ {\blank
+ \dontleavehmode\hbox\bgroup
+ \expanded{\defconvertedargument\noexpand\ascii{#1}}%
+ \tttf[\makemessage\m!verbatims1\ascii]%
+ \showmessage\m!verbatims1\ascii
+ \egroup
+ \blank}
+
+\def\dosometyping#1#2#3#4#5%
+ {\bgroup
+ \let\currenttypingclass\??tp
+ \edef\currenttyping{#1}%
+ \typingparameter\c!before
+ \startpacked % includes \bgroup
+ \dosetuptypelinenumbering{#2}%
+ \doifinset{\typingparameter\c!option}{\v!commands,\v!slanted,\v!normal}
+ {\setuptyping[#1][\c!option=\v!none]}%
+ \doif{\typingparameter\c!option}\v!color
+ {\expandafter\aftersplitstring#3\at.\to\prettyidentifier
+ \settypingparameter\c!option{\prettyidentifier}}%
+ \initializetyping
+ \startverbatimcolor
+ \doifundefinedelse{\currenttypingclass#3\v!global\c!start}
+ {\scratchcounter\zerocount}
+ {\scratchcounter\getvalue{\currenttypingclass#3\v!global\c!start}}%
+ \advance\scratchcounter\plusone
+ \setxvalue{\currenttypingclass#3\v!global\c!start}{\the\scratchcounter}%
+ \doifelsenothing{\typingparameter\c!start}
+ {#4}
+ {\doif{\typingparameter\c!start}\v!continue
+ {\setevalue{\currenttypingclass#1\c!start}%
+ {\getvalue{\currenttypingclass#3\v!global\c!start}}}%
+ \doifelsenothing{\typingparameter\c!stop}
+ {\doifelsenothing{\typingparameter\c!nlines}
+ {#4}
+ {\setxvalue{\currenttypingclass#3\v!global\c!start}%
+ {\the\numexpr\typingparameter\c!start+\typingparameter\c!nlines+\minusone\relax}%
+ #5{\typingparameter\c!start}{\getvalue{\currenttypingclass#3\v!global\c!start}}}}%
+ {#5{\typingparameter\c!start}{\typingparameter\c!stop}}}%
+ \stopverbatimcolor
+ \stoppacked
+ \typingparameter\c!after
+ \egroup}
+
+\def\doifelsetypingfile#1% sets \readfilename (we will make this proper mkiv i.e. less messy)
+ {\doiflocfileelse{#1}
+ {\firstoftwoarguments}
+ {\doifinputfileelse{#1}
+ {\def\readfilename{\pathplusfile\filepath{#1}}\firstoftwoarguments} % messy, looks wrong too
+ {\secondoftwoarguments}}}
+
+\def\dodotypefile[#1][#2]#3%
+ {\doifelsetypingfile{#3}
+ {\dosometyping{#1}{#2}{#3}{\processfileverbatim\readfilename}{\processfilelinesverbatim\readfilename}}
+ {\reporttypingerror{#3}}}
+
+%D \macros
+%D {filename}
+%D
+%D Typesetting filenames in monospaced fonts is possible with
+%D
+%D \starttyping
+%D \filename{here/there/filename.suffix}
+%D \stoptyping
+%D
+%D The definition is not that spectacular.
+
+\unexpanded\def\filename#1{{\tttf\hyphenatedfilename{#1}}}
+
+%D This leaves some settings:
+
+\permitshiftedendofverbatim
+\optimizeverbatimtrue
+
+%D And a bonus macro:
+
+\def\verbatim#1{\defconvertedargument\ascii{#1}\ascii}
+
+%D The setups for display verbatim and file verbatim are
+%D shared. One can adapt the extra defined typing environments,
+%D but they also default to the values below. Watch the
+%D alternative escape character.
+
+\setuptyping
+ [ \c!before=\blank,
+ \c!after=\blank,
+ \c!bodyfont=,
+ \c!color=,
+ \c!space=\v!off,
+ \c!page=\v!no,
+ \c!tab=\s!ascii,
+ \c!option=\v!none,
+ \c!palet=colorpretty,
+ \c!text=\v!no,
+ \c!style=\tttf,
+ \c!icommand=\ttsl,
+ \c!vcommand=,
+ \c!ccommand=\tttf,
+ \c!indentnext=\v!yes,
+ \c!margin=\!!zeropoint,
+ \c!evenmargin=\!!zeropoint,
+ \c!oddmargin=\!!zeropoint,
+ \c!blank=\v!line,
+ \c!escape=/, % beware \string\ , should also be accepted
+ \c!numbering=\v!no,
+ \c!lines=,
+ \c!empty=,
+ \c!start=1,
+ \c!stop=,
+ \c!step=1,
+ \c!continue=,
+ \c!nlines=]
+
+\definetyping[\v!typing]
+
+\presettyping[\v!file][]
+
+% \setuptyping % not needed
+% [\v!file]
+% [\c!start=1,
+% \c!stop=,
+% \c!step=1,
+% \c!continue=,
+% \c!nlines=]
+
+%D The setups for inline verbatim default to:
+
+\setuptype
+ [ \c!space=\v!off,
+ \c!color=,
+ \c!style=\tt\tf, % \tttf gives problems with {\tx \type...}
+ \c!page=\v!no,
+ \c!tab=\v!yes,
+ \c!palet=colorpretty,
+ \c!option=\v!normal]
+
+\definetyping[RAW] [\c!option=RAW]
+\definetyping[MP] [\c!option=MP]
+\definetyping[PL] [\c!option=PL]
+\definetyping[PM] [\c!option=PL]
+\definetyping[JS] [\c!option=JS]
+\definetyping[JV] [\c!option=JV]
+\definetyping[SQL] [\c!option=SQL]
+\definetyping[TEX] [\c!option=TEX]
+\definetyping[PAS] [\c!option=PAS]
+\definetyping[PASCAL][\c!option=PAS]
+\definetyping[MOD] [\c!option=PAS]
+\definetyping[MODULA][\c!option=PAS]
+\definetyping[DELPHI][\c!option=PAS]
+\definetyping[EIFFEL][\c!option=EIF]
+\definetyping[XML] [\c!option=XML]
+\definetyping[LUA] [\c!option=LUA]
+
+\installprettytype [RAW] [RAW]
+
+\installprettytype [TEX] [TEX]
+
+\installprettytype [PERL] [PL]
+\installprettytype [PL] [PL]
+\installprettytype [PM] [PL]
+
+\installprettytype [METAPOST] [MP]
+\installprettytype [METAFONT] [MP]
+\installprettytype [MP] [MP]
+\installprettytype [MF] [MP]
+
+\installprettytype [JAVASCRIPT] [JS]
+\installprettytype [JAVA] [JV]
+\installprettytype [JS] [JS]
+\installprettytype [JV] [JV]
+
+\installprettytype [SQL] [SQL]
+
+\installprettytype [PASCAL] [PAS]
+\installprettytype [PAS] [PAS]
+\installprettytype [MODULA] [PAS]
+\installprettytype [MOD] [PAS]
+
+\installprettytype [EIFFEL] [EIF]
+\installprettytype [EIF] [EIF]
+\installprettytype [E] [EIF]
+
+\installprettytype [XML] [XML]
+
+\installprettytype [LUA] [LUA]
+
+\installnewpretty M {\setupprettiesintype {MP}\setupprettytype}
+\installnewpretty P {\setupprettiesintype {PL}\setupprettytype}
+\installnewpretty T {\setupprettiesintype{TEX}\setupprettytype}
+\installnewpretty J {\setupprettiesintype {JV}\setupprettytype}
+\installnewpretty S {\setupprettiesintype{SQL}\setupprettytype}
+\installnewpretty W {\setupprettiesintype{PAS}\setupprettytype} % Wirth
+\installnewpretty I {\setupprettiesintype{EIF}\setupprettytype} % E taken
+\installnewpretty X {\setupprettiesintype{XML}\setupprettytype}
+
+%D We use the \CONTEXT\ color system for switching to and from
+%D color mode. We can always redefine these colors afterwards.
+
+\definecolor [colorprettyone] [r=.9, g=.0, b=.0] % red
+\definecolor [colorprettytwo] [r=.0, g=.8, b=.0] % green
+\definecolor [colorprettythree] [r=.0, g=.0, b=.9] % blue
+\definecolor [colorprettyfour] [r=.8, g=.8, b=.6] % yellow
+
+\definecolor [grayprettyone] [s=.30]
+\definecolor [grayprettytwo] [s=.45]
+\definecolor [grayprettythree] [s=.60]
+\definecolor [grayprettyfour] [s=.75]
+
+\definepalet
+ [colorpretty]
+ [ prettyone=colorprettyone,
+ prettytwo=colorprettytwo,
+ prettythree=colorprettythree,
+ prettyfour=colorprettyfour]
+
+\definepalet
+ [graypretty]
+ [ prettyone=grayprettyone,
+ prettytwo=grayprettytwo,
+ prettythree=grayprettythree,
+ prettyfour=grayprettyfour]
+
+\definepalet [TEXcolorpretty] [colorpretty]
+\definepalet [TEXgraypretty] [graypretty]
+\definepalet [PLcolorpretty] [colorpretty]
+\definepalet [PLgraypretty] [graypretty]
+\definepalet [PMcolorpretty] [colorpretty]
+\definepalet [PMgraypretty] [graypretty]
+\definepalet [MPcolorpretty] [colorpretty]
+\definepalet [MPgraypretty] [graypretty]
+\definepalet [JVcolorpretty] [colorpretty]
+\definepalet [JVgraypretty] [graypretty]
+\definepalet [JScolorpretty] [colorpretty]
+\definepalet [JSgraypretty] [graypretty]
+\definepalet [SQLcolorpretty] [colorpretty]
+\definepalet [SQLgraypretty] [graypretty]
+\definepalet [PAScolorpretty] [colorpretty]
+\definepalet [PASgraypretty] [graypretty]
+\definepalet [EIFcolorpretty] [colorpretty]
+\definepalet [EIFgraypretty] [graypretty]
+\definepalet [XMLcolorpretty] [colorpretty]
+\definepalet [XMLgraypretty] [graypretty]
+\definepalet [LUAcolorpretty] [colorpretty]
+\definepalet [LUAgraypretty] [graypretty]
+
+\protect \endinput
diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv
new file mode 100644
index 000000000..dacbdb7ac
--- /dev/null
+++ b/tex/context/base/buff-ver.mkiv
@@ -0,0 +1,1193 @@
+%D \module
+%D [ file=buff-ver, % was core-ver
+%D version=2000.05.09,
+%D title=\CONTEXT\ Buffer Macros,
+%D subtitle=Verbatim,
+%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 Buffer Macros / Verbatim}
+
+%D We can optimize esp the initializations a bit.
+
+\unprotect
+
+\ifdefined\startlinenumbering\else \let\startlinenumbering \relax \fi
+\ifdefined\stoplinenumbering \else \let\stoplinenumbering \relax \fi
+\ifdefined\setuplinenumbering\else \unexpanded\def\setuplinenumbering[#1]{} \fi
+
+% D \macros
+% D {iflinepar}
+% D
+% D A careful reader will see that \type{\linepar} is reset.
+% D This boolean can be used to determine if the current line is
+% D the first line in a pseudo paragraph and this boolean is set
+% D after each empty line. The \type{\relax} can be used to
+% D determine the end of the line when one implements a scanner
+% D routine.
+%
+% will become obsolete
+
+\newif\iflinepar
+
+% \type{ <crlf> char} geeft bagger
+
+%D We are going to embed the general verbatim support macros in
+%D a proper environment. First we show the common setup
+%D macro, so we know what features are supported. The options
+%D are hooked into the support macros via the \type{\obey}
+%D macros.
+
+\newif\ifslantedtypeactivated
+\newif\ifslantedtypepermitted
+
+\def\switchslantedtype
+ {\ifslantedtypepermitted
+ \ifslantedtypeactivated
+ \slantedtypeactivatedfalse\tttf
+ \else
+ \slantedtypeactivatedtrue\ttsl
+ \fi
+ \fi}
+
+\def\prettyidentifier {TEX}
+\def\prettypalet {}
+
+\def\installprettytype
+ {\dodoubleargument\doinstallprettytype}
+
+\def\doinstallprettytype[#1][#2]% map #1 onto #2
+ {\uppercasestring#1\to\asciia
+ \uppercasestring#2\to\asciib
+ \setevalue{\??ty\??ty\asciia}{\asciib}}
+
+\unexpanded\def\setupprettiesintype#1%
+ {\uppercasestring#1\to\ascii
+ \edef\prettyidentifier{\executeifdefined{\??ty\??ty\ascii}{TEX}}%
+ \begingroup
+ % we can move this to lua
+ % \lowercasestring \f!prettyprefix\prettyidentifier\to\filename
+ % \doonlyonce\filename{\ctxloadluafile\filename\empty}%
+ \ctxlua{buffers.loadvisualizer("\ascii")}%
+ \endgroup}
+
+\unexpanded\def\setupprettytype
+ {\processingverbatimtrue % will move
+ \ctxlua{buffers.visualizers.reset()}}
+
+\def\setverbatimspaceskip
+ {\setbox\scratchbox\hbox{x}%
+ \spaceskip\wd\scratchbox
+ \xspaceskip\spaceskip}
+
+\let\obeycharacters\relax % tab mess can go
+
+\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:\empty }{\let\obeycharacters\relax}
+\setvalue{\??tp:\c!option:\v!color }{\setupprettiesintype{\typingparameter\c!option}%
+ \let\obeycharacters\setupprettytype}
+\setvalue{\??tp:\c!option:\v!normal }{\let\obeycharacters\setupgroupedtype}
+\setvalue{\??tp:\c!option:\v!slanted }{\let\obeycharacters\setupslantedtype}
+\setvalue{\??tp:\c!option:\s!unknown }{\setupprettiesintype{\typingparameter\c!option}%
+ \let\obeycharacters\setupprettytype}
+%setvalue{\??tp:\c!option:\v!commands }{\def\obeycharacters{\setupcommandsintype}}
+
+\def\dosetverbatimfont
+ {\redoconvertfont\dosetfontattribute{\currenttypingclass\currenttyping}\c!style
+ \normalnoligatures\font}
+
+\unexpanded\def\setupcommonverbatim
+ {\let\prettyidentifier\s!default
+ %
+ \def\prettyidentifierfont{\typingparameter\c!icommand}%
+ \def\prettyvariablefont {\typingparameter\c!vcommand}%
+ \def\prettynaturalfont {\typingparameter\c!ccommand}%
+ %
+ \ignorehyphens % default
+ \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}%
+ \setupverbatimcolor}
+
+\newtoks \everyinitializeverbatim
+
+\def\ignorebeginofpretty [#1]{}
+\def\ignoreendofpretty {}
+
+\def\doverbatimbop{\bgroup\beginofpretty}
+\def\doverbatimeop{\endofpretty\egroup}
+\def\doverbatimsop{\endofpretty\egroup\bgroup\beginofpretty}
+
+\let\noverbatimbop\ignorebeginofpretty
+\let\noverbatimeop\ignoreendofpretty
+\let\noverbatimsop\ignorebeginofpretty
+
+\def\doinitializeverbatim % todo: combine all in one call is faster
+ {\ctxlua{buffers.visualizers.reset()}%
+ \doifelse{\typingparameter\c!space}\v!on
+ {\let\obs\fastcontrolspace}%
+ {\let\obs\specialobeyedspace}%
+ \edef\askedverbatimtab{\typingparameter\c!tab}%
+ \doifelse\askedverbatimtab\v!no
+ {\ctxlua{buffers.settablength(1)}}
+ {\doifnumberelse{\askedverbatimtab}
+ {\ctxlua{buffers.settablength(\askedverbatimtab)}}
+ {\ctxlua{buffers.settablength()}}}%
+ \ctxlua{buffers.doifelsevisualizer("\prettyidentifier")}
+ {\ctxlua{buffers.setvisualizer("\prettyidentifier")}%
+ \let\bop\doverbatimbop
+ \let\eop\doverbatimeop
+ \let\sop\doverbatimsop}%
+ {\ctxlua{buffers.setvisualizer("\v!typing")}% or resetdefaultvisualizer
+ \let\bop\noverbatimbop
+ \let\eop\noverbatimeop
+ \let\sop\noverbatimsop}%
+ \relax\the\everyinitializeverbatim\relax}
+
+\appendtoks
+ \resetfontfeature
+ \resetcharacterspacing
+\to \everyinitializeverbatim
+
+% BEWARE: the noligatures will globally change the verbatim font's behaviour
+
+% test case:
+%
+% \definetype[typeTEX][option=tex]
+%
+% \typeTEX|\example---oeps|. this---ligates---again.
+% \typeTEX{\example---oeps}. this---ligates---again.
+% \type {\example---oeps}. this---ligates---again.
+
+%D \startbuffer
+%D \setuptyping[TEX][escape=yes]
+%D
+%D \startTEX
+%D /BTEX\em sometex/ETEX
+%D /BTEX\em sometex/ETEX \after
+%D \before /BTEX\em sometex/ETEX
+%D \before /BTEX\em sometex/ETEX \after
+%D \before /BTEX\em sometex/ETEX \inbetween /BTEX\em sometex/ETEX \after
+%D \before \after
+%D \stopTEX
+%D \stopbuffer
+%D
+%D \typebuffer \start \getbuffer \stop
+%D
+%D \startbuffer
+%D \setuptyping[TEX][escape={[[,]]}]
+%D
+%D \startTEX
+%D [[\em sometex]]
+%D [[\em sometex]] \after
+%D \before [[\em sometex]]
+%D \before [[\em sometex]] \after
+%D \before [[\em sometex]] \inbetween [[\em sometex]] \after
+%D \before \after
+%D \stopTEX
+%D \stopbuffer
+%D
+%D \typebuffer \start \getbuffer \stop
+%D
+%D \startbuffer
+%D \setuptyping[TEX][escape=//]
+%D
+%D \startTEX
+%D //\em sometex
+%D \before //\em sometex
+%D \stopTEX
+%D
+%D \typebuffer \start \getbuffer \stop
+
+\unexpanded\def\setupcommandsintype
+ {\ctxlua{buffers.set_escape("\currenttyping",\!!bs\typingparameter\c!escape\!!es)}}
+
+\appendtoks
+ \setupcommandsintype
+\to \everyinitializeverbatim
+
+\unexpanded\def\setupslantedtype
+ {\slantedtypepermittedtrue}
+
+\ifx\setupprettytype \undefined \let\setupprettytype \relax \fi
+\ifx\setupslantedtype \undefined \let\setupslantedtype \relax \fi
+\ifx\setupgroupedtype \undefined \let\setupgroupedtype \relax \fi
+\ifx\normalnoligatures\undefined \let\normalnoligatures\gobbleoneargument \fi
+
+%D The verbatim commands have a rather long and turbulent
+%D history. Most users of \CONTEXT\ probably will never use
+%D some of the features, but I've kept in mind that when one is
+%D writing a users manual, about everything can and undoubtly
+%D will be subject to a verbatim treatment.
+%D
+%D Verbatim command are very sensitive to argument processing,
+%D which is a direct result of the \CATCODES\ being fixed at
+%D reading time. With our growing understanding of \TEX,
+%D especially of the mechanism that can be used for looking
+%D ahead and manipulating \CATCODES, the verbatim support
+%D became more and more advanced and natural.
+%D
+%D Typesetting inline verbatim can be accomplished by
+%D \type{\type}, which in this sentence was typeset by saying
+%D just \type{\type{\type}}, which in turn was typeset by
+%D \unknown. Using the normal grouping characters \type{{}} is
+%D the most natural way of using this command.
+%D
+%D A second, more or less redundant, alternative is delimiting
+%D the argument with an own character. This method was
+%D implemented in the context of a publication in the \MAPS,
+%D where this way of delimiting is recognized by \LATEX\ users.
+%D
+%D The third, more original alternative, is the one using
+%D \type{<<} and \type{>>} as delimiters. This alternative can
+%D be used in situations where slanted typeseting is needed.
+
+% todo: we can use \letter... here:
+
+\def\lesscharacter {<}
+\def\morecharacter {>}
+
+\chardef\texescape = `\\
+\chardef\leftargument = `\{
+\chardef\rightargument = `\}
+
+%D \macros
+%D {type}
+%D
+%D We define \type{\type} as a protected command. This command
+%D has several invocations: grouped, wirt boundary characters,
+%D and with font switches.
+
+% \starttyping
+% normal: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+% normal: \par \type{xx<..xx..<xx <slanted> >..>xx} \par \type{<....>} \par \type{<..<xx>..>}
+% \setuptype[option=slanted]
+% slanted: \par \type{xx<<..sl..<<xx <<sl>> xx>>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<<sl>>..>> \par
+% slanted: \par \type{xx<<..sl..<xx <sl> xx>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<sl>..>> \par
+% \setuptype[option=none]
+% none: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+% \stoptyping
+
+%D When writing the manual to \CONTEXT\ and documenting this
+%D source we needed to typeset \type{<<} and \type{>>}. Because
+%D we wanted to do this in the natural way, we've adapted the
+%D original definition a bit. This implementation went through
+%D several live cycles. The final implementation looks a bit
+%D further and treats the lone \type{<<} and \type{>>} a bit
+%D different. The \type {\null} prevents ligatures, which
+%D unfortunately turn up in Lucida fonts.
+
+%D The following lines show what happens when we set
+%D \type {option=commands}.
+%D
+%D \startbuffer
+%D \starttyping
+%D test//test test/BTEX \footnote{test test test}/ETEX test
+%D test//test test/BTEX \footnote{test test test}/ETEX test
+%D test test test/BTEX \bf(nota bene)/ETEX test
+%D test test test /BTEX \bf(nota bene)/ETEX test
+%D \stoptyping
+%D \stopbuffer
+%D
+%D % \bgroup\setuptyping[option=commands]\getbuffer\egroup
+%D
+%D this was keyed in as:
+%D
+%D \typebuffer
+
+\unexpanded\def\type{\dotype\empty}
+
+\def\dotype#1% was \dotype
+ {\dontleavehmode \bgroup
+ % new, \strut enables leading space in \type { abc } at par start / begstrut
+ % else no hyphenation (replaced by \dontleavehmode which saves unboxing)
+ % \begstrut
+ \let\currenttypingclass\??ty
+ \edef\currenttyping{#1}%
+ \catcode`\<=\@@other
+ \catcode`\>=\@@other
+ \futurelet\next\dodotype}
+
+\def\dodotype
+ {\ifx\next\bgroup
+ \@EA\dodotypeA
+ \else
+ \@EA\dodotypeAD
+ \fi}
+
+\def\dodotypeAD
+ {\if\next<%
+ \doifelse{\typingparameter\c!option}\v!none{\@EA\dodotypeB}{\@EA\dodotypeC}%
+ \else
+ \@EA\dodotypeD
+ \fi}
+
+\def\dodotypeA
+ {\initializetype % probably too much
+ \verbatimcolor
+ \dosetverbatimfont
+ \setcatcodetable \typcatcodesa
+ \dodotypeAA}
+
+\def\dodotypeAA#1%
+ {\doinitializeverbatim
+ \def\obs{\obeyedspace}%
+ \ctxlua{buffers.hooks.flush_inline(\!!bs\detokenize{#1}\!!es)}%
+ \egroup}
+
+\def\dodotypeB#1%
+ {\initializetype
+ \verbatimcolor
+ \dosetverbatimfont
+ \setcatcodetable \typcatcodesb
+ \dodotypeBB}
+
+\def\dodotypeBB#1%
+ {\doinitializeverbatim
+ \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,false)}%
+ \egroup
+ \gobbleoneargument} % grab last >
+
+\def\dodotypeC#1%
+ {\initializetype
+ \verbatimcolor
+ \dosetverbatimfont
+ \setcatcodetable \typcatcodesb
+ \dodotypeCC}
+
+\def\dodotypeCC#1%
+ {\doinitializeverbatim
+ \ifx\obeycharacters\setupprettytype % temp hack, we need a proper signal
+ \ctxlua{buffers.hooks.flush_inline([\!!bs\detokenize{#1}\!!es,true)}%
+ \else
+ \def\obs{\obeyedspace}%
+ \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,true)}%
+ \fi
+ \egroup
+ \gobbleoneargument} % grab last >
+
+\def\dodotypeD#1%
+ {\initializetype
+ \verbatimcolor
+ \dosetverbatimfont
+ \setcatcodetable \typcatcodesa
+ \def\dodotypeDD##1#1{\dodotypeAA{##1}}%
+ \dodotypeDD}
+
+\def\dodotypeDD#1%
+ {\doinitializeverbatim
+ \ctxlua{buffers.hooks.flush_inline(\!!bs\detokenize{#1}\!!es,true)}%
+ \egroup
+ \gobbleoneargument} % grab last >
+
+%D The neccessary initializations are done by calling
+%D \type{\initializetype} which in return calls for the support
+%D macro \type{\setupinlineverbatim}.
+
+\def\initializetype
+ {\let\obeylines\ignorelines
+ \setupcommonverbatim
+ %\dosetverbatimfont
+ %\setverbatimspaceskip
+ %\setupcopyverbatim % not needed
+ \setcatcodetable\vrbcatcodes}
+
+%D \macros
+%D {setuptype}
+%D
+%D Some characteristics of \type{\type} can be set up by:
+
+\unexpanded\def\setuptype
+ {\dodoubleempty\dosetuptype}
+
+\def\dosetuptype[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??ty#1][#2]%
+ \else
+ \getparameters[\??ty][#1]%
+ \fi}
+
+%D \macros
+%D {typ,obeyhyphens,obeybreakpoints}
+%D
+%D Although it's not clear from the macros, one character
+%D trait of this macros, which are build on top of the support
+%D module, is that they don't hyphenate. We therefore offer
+%D the alternative \type{\typ}. The current implementation
+%D works all right, but a decent hyphenation support of
+%D \type{\tt} text will be implemented soon.
+
+\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip
+\def\specialcontrolspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\relax}
+
+\def\obeyhyphens
+ {\let\obeyedspace \specialobeyedspace
+ \let\controlspace\specialcontrolspace
+ \spaceskip.25em\relax} % hm a bit of stretch !
+
+\def\obeybreakpoints
+ {\ignorehyphens
+ \veryraggedright}
+
+\def\ignorehyphens
+ {\language\minusone % extra bonus, the \null should do the job too
+ \let\obeyedspace \specialobeyedspace
+ \let\controlspace\specialcontrolspace
+ \spaceskip.5em\relax}
+
+\unexpanded\def\typ
+ {\bgroup
+ \let\@@tylines\v!hyphenated
+ \futurelet\next\dodotype}
+
+%D \macros
+%D {tex,arg,mat,dis}
+%D
+%D Sometimes, for instance when we pass verbatim text as an
+%D argument, the fixed \CATCODES\ interfere with our wishes. An
+%D experimental implementation of character by character
+%D processing of verbatim text did overcome this limitation,
+%D but we've decided not to use that slow and sometimes
+%D troublesome solution. Instead we stick to some 'old'
+%D \CONTEXT\ macros for typesetting typical \TEX\ characters.
+%D
+%D The next implementation is more clear but less versatile,
+%D so we treated it for a beter one.
+%D
+%D \starttyping
+%D \def\dospecialtype#1#2%
+%D {\bgroup
+%D \initializetype
+%D \catcode`\{=\@@begingroup
+%D \catcode`\}=\@@endgroup
+%D \def\dospecialtype%
+%D {\def\dospecialtype{#2\egroup}%
+%D \bgroup
+%D \aftergroup\dospecialtype
+%D #1}%
+%D \afterassignment\dospecialtype
+%D \let\next=}
+%D
+%D \unexpanded\def\tex{\dospecialtype\texescape\relax}
+%D \unexpanded\def\arg{\dospecialtype\leftargument\rightargument}
+%D \unexpanded\def\mat{\dospecialtype\$\$}
+%D \unexpanded\def\dis{\dospecialtype{\$\$}{\$\$}}
+%D \stoptyping
+
+\def\setgroupedtype
+ {\let\currenttypingclass\??ty
+ \initializetype
+ \verbatimcolor
+ \dosetverbatimfont
+ %\setcatcodetable \typcatcodesa
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup}
+
+\unexpanded\def\tex{\groupedcommand{\setgroupedtype\texescape}{\relax}}
+\unexpanded\def\arg{\groupedcommand{\setgroupedtype\leftargument}{\rightargument}}
+\unexpanded\def\mat{\groupedcommand{\setgroupedtype\$}{\$}}
+\unexpanded\def\dis{\groupedcommand{\setgroupedtype\$\$}{\$\$}}
+
+\let\normaltexttex\tex
+\let\normaltextarg\arg
+\let\normaltextmat\mat
+\let\normaltextdis\dis
+
+\def\astype
+ {\groupedcommand\dorawtype\relax}
+
+\def\dorawtype
+ {\let\currenttypingclass\??ty
+ \normalverbatimcolor % \verbatimcolor
+ \dosetverbatimfont}
+
+%D \macros
+%D {starttyping}
+%D
+%D Display verbatim is realized far more easy, which is mostly
+%D due to the fact that we use \type{\stop...} as delimiter.
+%D The implementation inherits some features, for instance the
+%D support of linenumbering, which can best be studied in the
+%D documented support module.
+
+\let\currenttyping \empty
+\let\currenttypingclass\??ty % saveguard
+
+\def\typingparameter#1%
+ {\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}}
+
+\setvalue{\??tp:\c!blank:\v!standard}{\ctxparskip}
+\setvalue{\??tp:\c!blank:\v!small }{\smallskipamount}
+\setvalue{\??tp:\c!blank:\v!medium }{\medskipamount}
+\setvalue{\??tp:\c!blank:\v!big }{\bigskipamount}
+\setvalue{\??tp:\c!blank:\v!halfline}{.5\baselineskip}
+\setvalue{\??tp:\c!blank:\v!line }{\baselineskip}
+\setvalue{\??tp:\c!blank:\v!none }{\zeropoint}
+
+\def\doopenupverbatimlineindeed
+ {\getpagestatus
+ \ifrightpage
+ \hskip\typingparameter\c!oddmargin\relax
+ \else
+ \hskip\typingparameter\c!evenmargin\relax
+ \fi}
+
+\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
+ \let\doopenupverbatimline\doopenupverbatimlineindeed
+ \else
+ \doadaptleftskip{\typingparameter\c!margin}%
+ \fi
+ % no symbolic blanks !
+ \edef\!!stringa{\executeifdefined{\??bo\typingparameter\c!blank}{\typingparameter\c!blank}}%
+ \scratchskip\executeifdefined{\??tp:\c!blank:\!!stringa}\!!stringa\relax
+ \ifgridsnapping
+ % this will be adapted
+ \ifdim\scratchskip=.5\baselineskip\relax
+ \edef\verbatimbaselineskip{\the\scratchskip}% new
+ \else
+ \edef\verbatimbaselineskip{\the\baselineskip}%
+ \fi
+ \else
+ \edef\verbatimbaselineskip{\the\scratchskip}%
+ \fi
+\doifsomething{\typingparameter\c!align}{\setupalign[\typingparameter\c!align]}%
+ \setupcommonverbatim}
+
+%D The basic display verbatim commands are defined in an
+%D indirect way. As we will see, they are a specific case of a
+%D more general mechanism.
+
+\newif\ifoptimizeverbatim \optimizeverbatimtrue
+
+\let \beginofverbatimlines \relax
+\let \endofverbatimlines \relax
+
+\def\doverbatimnobreak
+ {\ifoptimizeverbatim\penalty500 \fi}
+
+\def\doverbatimgoodbreak
+ {\ifoptimizeverbatim\penalty\linepenalty\fi}
+
+% \def\doflushverbatimline
+% {\expandafter\dodoverbatimline\expandafter{\savedverbatimline}}
+% \def\doverbatimbeginofline#1% linenumber (optional provided by mkiv / todo)
+% {\dontleavehmode
+% \strut
+% \the\everyline}
+% \def\doverbatimendofline
+% {\par}
+% \def\doverbatimemptyline
+% {\strut
+% \par}
+% \let\handleverbatimline=\relax
+
+% we need this hack because otherwise verbatim skips
+% the first line (everything after the initial command)
+
+\def\dostarttyping#1% tricky non standard lookahead
+ {\bgroup
+ \let\currenttypingclass\??tp
+ \edef\currenttyping{#1}%
+ \obeylines
+ \futurelet\nexttoken\dodostarttyping}
+
+\def\dodostarttyping
+ {\ifx\nexttoken[%
+ \expandafter\dododostarttyping
+ \else
+ \expandafter\nododostarttyping
+ \fi}
+
+\def\nododostarttyping
+ {\dododostarttyping[]}
+
+\def\dotypefileverbatim
+ {\doinitializeverbatim
+ \beginofverbatimlines
+ \ctxlua{buffers.typefile("\readfilename","\typingparameter\c!strip","\typingparameter\c!range")}%
+ \endofverbatimlines}
+
+\def\dotypefilelinesverbatim#1#2%
+ {#1\dotypefileverbatim#2}
+
+\unexpanded\def\dotypeblockverbatim#1#2%
+ {\dowithbuffer{_typing_}{#1}{#2}
+ {}
+ {\doinitializeverbatim
+ \beginofverbatimlines
+ \ctxlua{buffers.type("_typing_","\typingparameter\c!strip","\typingparameter\c!range")}%
+ \endofverbatimlines
+ \csname#2\endcsname}}
+
+\def\dododostarttyping[#1]%
+ {\typingparameter\c!before
+ \startpacked % includes \bgroup
+ \dosetuptypelinenumbering{#1}%
+ \initializetyping
+ \dosetverbatimfont
+ \startverbatimcolor
+ \normalexpanded{\dotypeblockverbatim{\e!start\currenttyping}{\e!stop\currenttyping}}} % was s!start
+
+\def\dostoptyping#1% hm, currenttyping
+ {\stopverbatimcolor
+ \stoppacked % includes \egroup
+ \typingparameter\c!after
+ \normalexpanded{\egroup\checknextindentation[\typingparameter\c!indentnext]}%
+ \dorechecknextindentation}
+
+%D Line numbering for files is combined with filtering, while
+%D display verbatim has the ability to continue.
+%D
+%D \starttyping
+%D \typefile[numbering=file,start=10,stop=12]{test.tex}
+%D
+%D \definetyping[code][numbering=line]
+%D
+%D \starttext
+%D \startcode
+%D ...
+%D ...
+%D \stopcode
+%D
+%D \startcode[start=continue]
+%D ...
+%D ...
+%D \stopcode
+%D
+%D \startcode[start=10]
+%D ...
+%D \stopcode
+%D \stoptyping
+
+%D Ranges:
+%D
+%D \starttyping
+%D % label:start:one
+%D
+%D \def\MyMacro
+%D {just an example}
+%D
+%D % label:stop:one
+%D
+%D \starttext
+%D
+%D % \typefile[file][range={3,6}]{whatever.tex}
+%D
+%D % \typefile[file][range={3,+2}]{whatever.tex}
+%D
+%D \typefile[file][range={label:start:one,label:stop:one}]{whatever.tex}
+%D
+%D \stoptext
+%D \stoptyping
+
+%D \macros
+%D {setuptyping}
+%D
+%D The setup of typing accepts two arguments. The optional
+%D first one identifies the user defined ones. If only one
+%D argument is given, the values apply to both the standard
+%D command \type{\starttyping} and \type{\typefile}.
+
+\def\dosetuptyping[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??tp#1][#2]%
+ \else
+ \getparameters[\??tp][#1]%
+ \fi}
+
+\unexpanded\def\setuptyping
+ {\dodoubleempty\dosetuptyping}
+
+%D \macros
+%D {definetype}
+%D
+%D Specific inline verbatim commands can be defined with the
+%D following command.
+
+\unexpanded\def\definetype
+ {\dodoubleempty\dodefinetype}
+
+\def\dodefinetype[#1][#2]%
+ {\setuvalue{#1}{\dotype{#1}}%
+ \getparameters[\??ty#1][#2]}
+
+%D \macros
+%D {definetyping}
+%D
+%D For most users the standard \type{\start}||\type{\stop}||pair
+%D will suffice, but for documentation purposes the next
+%D definition command can be of use:
+%D
+%D \starttyping
+%D \definetyping[extratyping][margin=3em]
+%D
+%D \startextratyping
+%D these extra ones are indented by 1 em
+%D \stopextratyping
+%D \stoptyping
+%D
+%D The definitions default to the standard typing values.
+
+% TODO: parent etc !
+
+\def\presettyping[#1][#2]% brrr also use parent here
+ {\copyparameters[\??tp#1][\??tp][\c!color,\c!style]%
+ \getparameters [\??tp#1][#2]}
+
+\def\dodefinetyping[#1][#2]%
+ {\setvalue{\e!start#1}{\dostarttyping{#1}}%
+ \setvalue{\e!stop #1}{\dostoptyping {#1}}%
+ \presettyping[#1][#2]}
+
+\unexpanded\def\definetyping
+ {\dodoubleempty\dodefinetyping}
+
+%D We can use some core color commands. These are faster than
+%D the standard color switching ones and work ok on a line by
+%D line basis.
+%D
+%D \starttyping
+%D \unexpanded\def\setupverbatimcolor%
+%D {\edef\prettypalet{\prettyidentifier\typingparameter\c!palet}%
+%D \def\beginofpretty[##1]{\startcolormode{\prettypalet:##1}}%
+%D \def\endofpretty {\stopcolormode}}
+%D \stoptyping
+%D
+%D Since we support a global color too, the folowing
+%D definition is better:
+
+\def\normalbeginofpretty [#1]{\startcolor[\prettypalet:#1]}%
+\def\normalendofpretty {\stopcolor}
+\def\normalstartverbatimcolor{\startcolor[\typingparameter\c!color]}%
+\def\normalstopverbatimcolor {\stopcolor}
+\def\normalverbatimcolor {\getvalue{\typingparameter\c!color}}% command !
+
+\unexpanded\def\setupnormalprettyverbatim
+ {\edef\prettypalet{\prettyidentifier\prettypalet}%
+ \let\beginofpretty \normalbeginofpretty
+ \let\endofpretty \normalendofpretty
+ \let\startverbatimcolor\normalstartverbatimcolor
+ \let\stopverbatimcolor \normalstopverbatimcolor
+ \let\verbatimcolor \normalverbatimcolor}
+
+\unexpanded\def\setupignoreprettyverbatim
+ {\let\prettypalet \empty
+ \let\beginofpretty \ignorebeginofpretty
+ \let\endofpretty \ignoreendofpretty
+ \let\startverbatimcolor\normalstartverbatimcolor
+ \let\stopverbatimcolor \normalstopverbatimcolor
+ \let\verbatimcolor \normalverbatimcolor}
+
+\unexpanded\def\setupverbatimcolor
+ {\edef\prettypalet{\typingparameter\c!palet}%
+ \ifx\prettypalet\empty
+ \setupignoreprettyverbatim
+ \else
+ \setupnormalprettyverbatim
+ \fi}
+
+\let\beginofpretty \ignorebeginofpretty
+\let\endofpretty \ignoreendofpretty
+\let\prettypalet \empty
+\let\startverbatimcolor\relax
+\let\stopverbatimcolor \relax
+\let\verbatimcolor \relax
+
+%D \macros
+%D {EveryPar, EveryLine, iflinepar}
+%D
+%D One of the features of these commands is the support of
+%D \type{\EveryPar}, \type{\EveryLine} and \type{\iflinepar}.
+%D In the documentation of the verbatim support module we give
+%D some examples of line- and paragraph numbering using these
+%D macros.
+
+%D \macros
+%D {typefile}
+%D
+%D Typesetting files verbatim (for the moment) only supports
+%D colorization of \TEX\ sources as valid option. The other
+%D setup values are inherited from display verbatim.
+%D The implementation of \type{\typefile} is straightforward:
+
+% new feature (not yet 100\% ok)
+%
+% \setuptyping[file][numbering=file]
+%
+% \typefile[start=2,nlines=3]{zapf}
+% \typefile[start=continue,nlines=13]{zapf}
+% \typefile{zapf}
+%
+% \setuptyping[file][numbering=line]
+%
+% \typefile[start=4,step=3]{zapf}
+% \typefile{zapf}
+
+\def\typefile
+ {\dodoubleempty\dotypefile}
+
+\def\dotypefile[#1][#2]#3%
+ {\ifsecondargument
+ \dodotypefile[#1][#2]{#3}%
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\dodotypefile[\v!file][#1]{#3}}
+ {\dodotypefile[#1][]{#3}}%
+ \else
+ \dodotypefile[\v!file][]{#3}%
+ \fi\fi}
+
+\def\dosetuptypelinenumbering#1% fuzzy
+ {%\ifcsname\currenttypingclass\currenttyping\c!start\endcsname \else
+ % \setuptyping[\currenttyping][\c!start=1,\c!stop=,\c!step=1,\c!continue=\v!no,\c!nlines=]%
+ %\fi
+ \doifassignmentelse{#1}{\setuptyping[\currenttyping][#1]}\donothing
+ \doifelse{\typingparameter\c!numbering}\v!file
+ {% kind of special: filters lines !
+ \setuplinenumbering[\currenttyping][\c!method=\v!file]%
+ \donetrue}
+ {\doifelse{\typingparameter\c!numbering}\v!line
+ {\doifinset\v!continue{#1}{\setuptyping[\currenttyping][\c!continue=\v!yes]}% fails: \settypingparameter\c!continue{\v!yes}
+ \donetrue}
+ {\donefalse}}%
+ \ifdone
+ \edef\beginofverbatimlines{\noexpand\startlinenumbering
+ [\currenttyping]%
+ [\c!continue=\typingparameter\c!continue,
+ \c!method=\v!type,
+ \c!start=\typingparameter\c!start,
+ \c!stop=\typingparameter\c!stop, % ?
+ \c!step=\typingparameter\c!step]%
+ }%
+ \def\endofverbatimlines{\stoplinenumbering}%
+ \fi}
+
+\def\reporttypingerror#1% temp hack
+ {\blank
+ \dontleavehmode\hbox\bgroup
+ \expanded{\defconvertedargument\noexpand\ascii{#1}}%
+ \tttf[\makemessage\m!verbatims1\ascii]%
+ \showmessage\m!verbatims1\ascii
+ \egroup
+ \blank}
+
+\def\dosometyping#1#2#3#4#5%
+ {\bgroup
+ \let\currenttypingclass\??tp
+ \edef\currenttyping{#1}%
+ \typingparameter\c!before
+ \startpacked % includes \bgroup
+ \dosetuptypelinenumbering{#2}%
+ \doifinset{\typingparameter\c!option}{\v!commands,\v!slanted,\v!normal}
+ {\setuptyping[#1][\c!option=\v!none]}%
+ \doif{\typingparameter\c!option}\v!color
+ {\expandafter\aftersplitstring#3\at.\to\prettyidentifier
+ \settypingparameter\c!option{\prettyidentifier}}%
+ \initializetyping
+ \dosetverbatimfont
+ \startverbatimcolor
+ \scratchcounter
+ \ifcsname\currenttypingclass#3\v!global\c!start\endcsname
+ \numexpr\csname\currenttypingclass#3\v!global\c!start\endcsname+\plusone\relax
+ \else
+ \plusone
+ \fi
+ \setxvalue{\currenttypingclass#3\v!global\c!start}{\the\scratchcounter}% no direct setxvalue as it defines beforehand
+ \doifelsenothing{\typingparameter\c!start}
+ {#4}
+ {\doif{\typingparameter\c!start}\v!continue
+ {\setevalue{\currenttypingclass#1\c!start}%
+ {\getvalue{\currenttypingclass#3\v!global\c!start}}}%
+ \doifelsenothing{\typingparameter\c!stop}
+ {\doifelsenothing{\typingparameter\c!nlines}
+ {#4}
+ {\setxvalue{\currenttypingclass#3\v!global\c!start}%
+ {\the\numexpr\typingparameter\c!start+\typingparameter\c!nlines+\minusone\relax}%
+ #5{\typingparameter\c!start}{\getvalue{\currenttypingclass#3\v!global\c!start}}}}%
+ {#5{\typingparameter\c!start}{\typingparameter\c!stop}}}%
+ \stopverbatimcolor
+ \stoppacked
+ \typingparameter\c!after
+ \egroup}
+
+\def\doifelsetypingfile#1% sets \readfilename (we will make this proper mkiv i.e. less messy)
+ {\doiflocfileelse{#1}
+ {\firstoftwoarguments}
+ {\doifinputfileelse{#1}
+% {\def\readfilename{\pathplusfile\filepath{#1}}\firstoftwoarguments} % messy, looks wrong too
+ {\def\readfilename{#1}\firstoftwoarguments} % messy, looks wrong too
+ {\secondoftwoarguments}}}
+
+\def\dodotypefile[#1][#2]#3%
+ {\doifelsetypingfile{#3}
+ {\dosometyping{#1}{#2}{#3}\dotypefileverbatim\dotypefilelinesverbatim}
+ {\reporttypingerror{#3}}}
+
+%D \macros
+%D {filename}
+%D
+%D Typesetting filenames in monospaced fonts is possible with
+%D
+%D \starttyping
+%D \filename{here/there/filename.suffix}
+%D \stoptyping
+%D
+%D The definition is not that spectacular.
+
+\unexpanded\def\filename#1{{\tttf\hyphenatedfilename{#1}}}
+
+%D And a bonus macro:
+
+\def\verbatim#1{\defconvertedargument\ascii{#1}\ascii}
+
+%D The setups for display verbatim and file verbatim are
+%D shared. One can adapt the extra defined typing environments,
+%D but they also default to the values below. Watch the
+%D alternative escape character.
+
+\setuptyping
+ [ \c!before=\blank,
+ \c!after=\blank,
+ \c!bodyfont=,
+ \c!color=,
+ \c!space=\v!off,
+ \c!page=\v!no,
+ \c!tab=\s!ascii,
+ \c!option=\v!none,
+ \c!palet=colorpretty,
+ \c!text=\v!no,
+ \c!style=\tttf,
+ \c!icommand=\ttsl,
+ \c!vcommand=,
+ \c!ccommand=\tttf,
+ \c!indentnext=\v!yes,
+ \c!margin=\!!zeropoint,
+ \c!evenmargin=\!!zeropoint,
+ \c!oddmargin=\!!zeropoint,
+ \c!blank=\v!line,
+ \c!escape=, % yes | no | START,STOP BTEX,ETEX
+ \c!numbering=\v!no,
+ \c!lines=,
+ \c!range=,
+ \c!empty=,
+ \c!start=1,
+ \c!stop=,
+ \c!step=1,
+ \c!continue=,
+ \c!strip=\v!no, % auto or number
+ \c!nlines=]
+
+\definetyping[\v!typing]
+
+\presettyping[\v!file][]
+
+% \setuptyping % not needed
+% [\v!file]
+% [\c!start=1,
+% \c!stop=,
+% \c!step=1,
+% \c!continue=,
+% \c!nlines=]
+
+%D The setups for inline verbatim default to:
+
+\setuptype
+ [ \c!space=\v!off,
+ \c!color=,
+ \c!style=\tt\tf, % \tttf gives problems with {\tx \type...}
+ \c!page=\v!no,
+ \c!tab=\v!yes,
+ \c!palet=colorpretty,
+ \c!option=\v!normal]
+
+%D Beware: only a few are currently (re)implemented in \MKIV.
+
+\definetyping[RAW] [\c!option=RAW]
+\definetyping[MP] [\c!option=MP] % done
+\definetyping[PL] [\c!option=PL]
+\definetyping[PM] [\c!option=PL]
+\definetyping[JS] [\c!option=JS]
+\definetyping[JV] [\c!option=JV]
+\definetyping[SQL] [\c!option=SQL]
+\definetyping[TEX] [\c!option=TEX] % done
+\definetyping[PAS] [\c!option=PAS]
+\definetyping[PASCAL][\c!option=PAS]
+\definetyping[MOD] [\c!option=PAS]
+\definetyping[MODULA][\c!option=PAS]
+\definetyping[DELPHI][\c!option=PAS]
+\definetyping[EIFFEL][\c!option=EIF]
+\definetyping[XML] [\c!option=XML]
+\definetyping[LUA] [\c!option=LUA] % done
+
+\installprettytype [RAW] [RAW]
+
+\installprettytype [TEX] [TEX]
+
+\installprettytype [PERL] [PL]
+\installprettytype [PL] [PL]
+\installprettytype [PM] [PL]
+
+\installprettytype [METAPOST] [MP]
+\installprettytype [METAFONT] [MP]
+\installprettytype [MP] [MP]
+\installprettytype [MF] [MP]
+
+\installprettytype [JAVASCRIPT] [JS]
+\installprettytype [JAVA] [JV]
+\installprettytype [JS] [JS]
+\installprettytype [JV] [JV]
+
+\installprettytype [SQL] [SQL]
+
+\installprettytype [PASCAL] [PAS]
+\installprettytype [PAS] [PAS]
+\installprettytype [MODULA] [PAS]
+\installprettytype [MOD] [PAS]
+
+\installprettytype [EIFFEL] [EIF]
+\installprettytype [EIF] [EIF]
+\installprettytype [E] [EIF]
+
+\installprettytype [XML] [XML]
+
+\installprettytype [LUA] [LUA]
+
+%D We use the \CONTEXT\ color system for switching to and from
+%D color mode. We can always redefine these colors afterwards.
+
+\definecolor [colorprettyone] [r=.9, g=.0, b=.0] % red
+\definecolor [colorprettytwo] [r=.0, g=.8, b=.0] % green
+\definecolor [colorprettythree] [r=.0, g=.0, b=.9] % blue
+\definecolor [colorprettyfour] [r=.8, g=.8, b=.6] % yellow
+
+\definecolor [grayprettyone] [s=.30]
+\definecolor [grayprettytwo] [s=.45]
+\definecolor [grayprettythree] [s=.60]
+\definecolor [grayprettyfour] [s=.75]
+
+\definepalet
+ [colorpretty]
+ [ prettyone=colorprettyone,
+ prettytwo=colorprettytwo,
+ prettythree=colorprettythree,
+ prettyfour=colorprettyfour]
+
+\definepalet
+ [graypretty]
+ [ prettyone=grayprettyone,
+ prettytwo=grayprettytwo,
+ prettythree=grayprettythree,
+ prettyfour=grayprettyfour]
+
+\definepalet [TEXcolorpretty] [colorpretty]
+\definepalet [TEXgraypretty] [graypretty]
+\definepalet [PLcolorpretty] [colorpretty]
+\definepalet [PLgraypretty] [graypretty]
+\definepalet [PMcolorpretty] [colorpretty]
+\definepalet [PMgraypretty] [graypretty]
+\definepalet [MPcolorpretty] [colorpretty]
+\definepalet [MPgraypretty] [graypretty]
+\definepalet [JVcolorpretty] [colorpretty]
+\definepalet [JVgraypretty] [graypretty]
+\definepalet [JScolorpretty] [colorpretty]
+\definepalet [JSgraypretty] [graypretty]
+\definepalet [SQLcolorpretty] [colorpretty]
+\definepalet [SQLgraypretty] [graypretty]
+\definepalet [PAScolorpretty] [colorpretty]
+\definepalet [PASgraypretty] [graypretty]
+\definepalet [EIFcolorpretty] [colorpretty]
+\definepalet [EIFgraypretty] [graypretty]
+\definepalet [XMLcolorpretty] [colorpretty]
+\definepalet [XMLgraypretty] [graypretty]
+\definepalet [LUAcolorpretty] [colorpretty]
+\definepalet [LUAgraypretty] [graypretty]
+
+% patched from verb-ini (todo)
+
+% \let\beginverbatimline\relax
+% \let\endverbatimline \relax
+
+% \appendtoks whatever\par\to\everyverbatimbeginofdisplay
+% \appendtoks whatever\to\everyverbatimendofdisplay
+% \appendtoks [\to\everyverbatimbeginofinline
+% \appendtoks ]\to\everyverbatimendofinline
+
+\let\doopenupverbatimline\empty
+
+\newtoks\everyverbatimbeginofdisplay
+\newtoks\everyverbatimendofdisplay
+\newtoks\everyverbatimbeginofinline
+\newtoks\everyverbatimendofinline
+
+\let\currentverbatimpretty\empty
+
+\def\doverbatimbeginofdisplay#1%
+ {\edef\currentverbatimpretty{#1}%
+ \the\everyverbatimbeginofdisplay}
+
+\def\doverbatimendofdisplay
+ {\the\everyverbatimendofdisplay}
+
+\def\doverbatimbeginofinline#1%
+ {\edef\currentverbatimpretty{#1}%
+ \the\everyverbatimbeginofinline}
+
+\def\doverbatimendofinline
+ {\the\everyverbatimendofinline}
+
+\def\doverbatimbeginofline#1% linenumber
+ {\bgroup % due to pretty status
+ \iflinepar\else\EveryPar{}\fi
+ \noindent % was wrong: \dontleavehmode
+ \xdef\dokeepverbatimlinedata % hm, still needed?
+ {\parindent \the\parindent
+ \hangindent\the\hangindent
+ \hangafter \the\hangafter
+ \leftskip \the\leftskip
+ \rightskip \the\rightskip}%
+ \egroup
+ \dokeepverbatimlinedata
+ \doopenupverbatimline
+ \the\everyline\strut
+ }%\beginverbatimline}
+
+\def\doverbatimendofline
+ {%\endverbatimline
+ \global\lineparfalse
+ \obeyedline\par}
+
+\def\doverbatimemptyline
+ {\strut
+ \par
+ \global\linepartrue}
+
+\protect \endinput
diff --git a/tex/context/base/bxml-apa.mkiv b/tex/context/base/bxml-apa.mkiv
new file mode 100644
index 000000000..5fc87e5ef
--- /dev/null
+++ b/tex/context/base/bxml-apa.mkiv
@@ -0,0 +1,613 @@
+%D \module
+%D [ file=bxml-apa,
+%D version=2010.05.14, % based on bibl-apa.tex
+%D title=APA bibliography style,
+%D subtitle=Publications,
+%D author={Taco Hoekwater \& Hans Hagen},
+%D date=\currentdate,
+%D copyright={Hans Hagen \& Taco Hoekwater}]
+%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
+
+% helpers (todo)
+
+\let\maybeyear\firstofoneargument
+\let\etalchar \firstofoneargument
+
+\setupbibtexcitationvariants
+ [author,year]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupbibtexcitationvariants
+ [authoryear]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupbibtexcitationvariants
+ [authoryears]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupbibtexcitationvariants
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupbibtexcitationvariants
+ [num]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\setupbibtexpublications
+ [\c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=authoryears,
+ \c!numbering=\v!no,
+ \c!autohang=\v!no]
+
+\setupbibtexpublications
+ [\c!width=2em, % 24pt,
+ \c!artauthor=invertedshort,
+ \c!editor=invertedshort,
+ \c!author=invertedshort,
+ \c!namesep={, },
+ \c!lastnamesep={ and },
+ \c!finalnamesep={ and },
+ \c!firstnamesep={, },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={, },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.}]
+
+% common
+
+\startxmlsetups bibtex:apa:common:wherefrom
+ \bibxmldoifelse {address} {
+ \getvariable{bibtex:temp}{left}
+ \bibxmldoifelse {country} {
+ \bibxmldoifelse {\getvariable{bibtex:temp}{label}} {
+ \bibxmlflush{address}\bibtexcomma\bibxmlflush{country}: \bibxmlflush{\getvariable{bibtex:temp}{label}}
+ } {
+ \bibxmlflush{address}\bibtexcomma\bibxmlflush{country}
+ }
+ } {
+ \bibxmldoifelse {\getvariable{bibtex:temp}{label}} {
+ \bibxmlflush{address}\bibtexcomma\bibxmlflush{\getvariable{bibtex:temp}{label}}
+ } {
+ \bibxmlflush{address}
+ }
+ }
+ \getvariable{bibtex:temp}{right}
+ } {
+ \bibxmldoifelse {country} {
+ \getvariable{bibtex:temp}{left}
+ \bibxmldoifelse {\getvariable{bibtex:temp}{label}} {
+ \bibxmlflush{country}: \bibxmlflush{\getvariable{bibtex:temp}{label}}
+ } {
+ \bibxmlflush{country}
+ }
+ \getvariable{bibtex:temp}{right}
+ } {
+ \bibxmldoifelse {\getvariable{bibtex:temp}{label}} {
+ \getvariable{bibtex:temp}{left}
+ \bibxmlflush{\getvariable{bibtex:temp}{label}}
+ \getvariable{bibtex:temp}{right}
+ } {
+ \getvariable{bibtex:temp}{otherwise}
+ }
+ }
+ }
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:publisher
+ \setvariables[bibtex:temp][label=publisher,left=,right=,otherwise=]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+\startxmlsetups bibtex:apa:common:organization
+ \setvariables[bibtex:temp][label=organization,left=,right=,otherwise=]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+\startxmlsetups bibtex:apa:common:school
+ \setvariables[bibtex:temp][label=school,left=,right=,otherwise=]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+\startxmlsetups bibtex:apa:common:institution
+ \setvariables[bibtex:temp][label=institution,left=,right=,otherwise=]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:school:subsentence
+ \setvariables[bibtex:temp][label=school,left=\bibtexcomma,right=\bibtexperiod,otherwise=\bibtexperiod]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+\startxmlsetups bibtex:apa:common:institution:subsentence
+ \setvariables[bibtex:temp][label=institution,left=\bibtexcomma,right=\bibtexperiod,otherwise=\bibtexperiod]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+\startxmlsetups bibtex:apa:common:publisher:sentence
+ \setvariables[bibtex:temp][label=publisher,left=\bibtexspace,right=\bibtexperiod,otherwise=]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+\startxmlsetups bibtex:apa:common:organization:sentence
+ \setvariables[bibtex:temp][label=organization,left=\bibtexspace,right=\bibtexperiod,otherwise=]\relax
+ \bibxmlsetup{bibtex:apa:common:wherefrom}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:title-and-series
+ \bibxmldoif {title} {
+ \bibxmlflush{title}
+ \bibxmldoif {series} {
+ \bibtexlparent\bibxmlflush{series}\bibtexrparent
+ }
+ \bibtexperiod
+ }
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:title-it-and-series
+ \bibxmldoif {title} {
+ \bgroup\it\bibxmlflush{title}\/\egroup
+ \bibxmldoif {series} {
+ \bibtexlparent\bibxmlflush{series}\bibtexrparent
+ }
+ \bibtexperiod
+ }
+\stopxmlsetups
+
+\disablemode[bibtex:apa:edited-book]
+
+\startxmlsetups bibtex:apa:common:author-and-year
+ \bibxmldoif {author} {
+ \bibxmlsetup{bibtex:format:author}
+ }
+ \bibxmldoif {year} {
+ \bibtexlparent\bibxmlflush{year}\bibtexrparent
+ }
+ \bibtexperiod
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:author-or-key-and-year
+ \bibxmldoifelse {author} {
+ \bibxmlsetup{bibtex:format:author}
+ } {
+ \bibxmldoif {key} {
+ \bibtexlbracket\bibxmlsetup{bibtex:format:key}\bibtexrbracket
+ }
+ }
+ \bibxmldoif {year} {
+ \bibtexlparent\bibxmlflush{year}\bibtexrparent
+ }
+ \bibtexperiod
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:author-editors-crossref-year
+ \bibxmldoif {author} {
+ \bibxmlsetup{bibtex:format:author}
+ } {
+ \bibxmldoifelse {editor} {
+ \enablemode[bibtex:apa:edited-book]
+ \xmlsetup{#1}{bibtex:format:editor}
+ \bibtexcomma\bibtexsingularplural{editor}{editors}
+ } {
+ % weird period
+ \bibxmldoif {crossref} {
+ \bibtexlbracket\bibxmlsetup{bibtex:format:crossref}\bibtexrbracket\bibtexperiod
+ }
+ }
+ }
+ \bibxmldoif {year} {
+ \bibtexlparent\bibxmlflush{year}\bibtexrparent
+ }
+ \bibtexperiod
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:editor-or-key-and-year
+ \bibxmldoifelse {editor} {
+ \enablemode[bibtex:apa:edited-book]
+ \xmlsetup{#1}{bibtex:format:editor}
+ \bibtexcomma\bibtexsingularplural{editor}{editors}
+ } {
+ \bibxmldoif {key} {
+ \bibtexlbracket\bibxmlsetup{bibtex:format:key}\bibtexrbracket
+ }
+ }
+ \bibtexspace
+ \bibxmldoif {year} {
+ \bibtexlparent\bibxmlflush{year}\bibtexrparent
+ }
+ \bibtexperiod
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:note
+ \bibxmldoif {note} {
+ \bibtexspace\bibxmlflush{note}\bibtexperiod
+ }
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:comment
+ \bibxmldoif {comment} {
+ \bibtexspace\bibxmlflush{comment}\bibtexperiod
+ }
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:pages:p
+ \bibxmldoif {pages} {
+ \bibtexspace\bibxmlflush{pages}\bibtexspace p\bibtexperiod
+ }
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:pages:pp
+ \bibxmldoif {pages} {
+ \bibtexspace\bibxmlflush{pages}\bibtexspace pp\bibtexperiod
+ }
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:pages:pages
+ \bibxmldoif {pages} {
+ \bibtexcomma pages~\bibxmlflush{pages}
+ }
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:edition:sentense
+ \bibxmldoif {edition} {
+ \bibtexspace\bibxmlflush{edition}\bibtexspace edition\bibtexperiod
+ }
+\stopxmlsetups
+
+% check ewhen the next is used (no period)
+
+% \startxmlsetups bibtex:apa:common:edition
+% \bibxmldoif {edition} {
+% \bibtexspace\bibxmlflush{edition}\bibtexspace edition
+% }
+% \stopxmlsetups
+
+% we can share more, todo
+
+% specific
+
+\startxmlsetups bibtex:apa:article
+ \bibxmlsetup{bibtex:apa:common:author-or-key-and-year}
+ \bibxmldoif {title} {
+ \bibxmlflush{title}\bibtexperiod
+ }
+ \bibxmldoifelse {journal} {
+ \bgroup\it\bibxmlflush{journal}\/\egroup
+ } {
+ \bibxmldoif {crossref} {
+ In\bibtexspace\bibxmlflush{crossref}
+ }
+ }
+ \bibxmldoifelse {volume} {
+ \bibtexcomma\bgroup\it\bibxmlflush{volume}\/\egroup
+ \bibxmldoif {issue} {
+ \bibtexlparent\bibxmlflush{issue}\bibtexlparent
+ }
+ \bibxmldoif {pages} {
+ \bibtexcomma\bibxmlflush{pages}
+ }
+ \bibtexperiod
+ } {
+ \bibxmlsetup{bibtex:apa:common:pages:pp}
+ }
+ \bibxmlsetup{bibtex:apa:common:note}
+ \bibxmlsetup{bibtex:apa:common:comment}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:book
+ \bibxmlsetup{bibtex:apa:common:author-editors-crossref-year}
+ \bibxmldoif {title} {
+ \bgroup\it\bibxmlflush{title}\/\egroup
+ \doifmodeelse {bibtex:apa:edited-book} {
+ \bibxmldoifelse {volume} {
+ \bibtexspace Number\nonbreakablespace\bibxmlflush{volume}
+ \bibxmldoifelse {series} {
+ \bibtexspace in\nonbreakablespace\bibxmlflush{series}\bibtexperiod
+ } {
+ \bibxmldoifelse {crossref} {
+ \bibtexspace in\bibtexlbracket\bibxmlsetup{bibtex:format:crossref}\bibtexrbracket
+ } {
+ \bibtexperiod
+ }
+ }
+ } {
+ \bibxmldoif {series} {
+ \bibtexspace\bibxmlflush{series}
+ }
+ \bibtexperiod
+ }
+ } {
+ \bibxmldoifelse {crossref} {
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibtexperiod
+ \bibxmldoif {volume} {
+ Volume\nonbreakablespace\bibxmlflush{volume}\bibtexspace of\nonbreakablespace
+ }
+ } {
+ \bibxmldoif {volume} {
+ \bibtexcomma volume\nonbreakablespace\bibxmlflush{volume}
+ \bibxmldoif {series} {
+ \bibtexspace of\nonbreakablespace\bgroup\it\bibxmlflush{series}\/\egroup
+ }
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibtexperiod
+ }
+ }
+ }
+ }
+ \bibxmlsetup{bibtex:apa:common:edition:sentence}
+ \bibxmlsetup{bibtex:apa:common:publisher:sentence}
+ \bibxmlsetup{bibtex:apa:common:pages:p}% twice?
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:inbook
+ \bibxmlsetup{bibtex:apa:common:author-editors-crossref-year}
+ \bibxmldoifelse {title} {
+ \bgroup\it\bibxmlflush{title}\/\egroup
+ } {
+ \doifmodeelse {bibtex:apa:edited-book} {
+ \bibxmldoifelse {volume} {
+ \bibtexspace number\nonbreakablespace\bibxmlflush{volume}
+ \bibxmldoifelse {series} {
+ \bibtexspace in\nonbreakablespace\bibxmlflush{series}\bibtexperiod
+ } {
+ \bibxmldoifelse {crossref} {
+ \bibtexspace in\bibtexlbracket\bibxmlsetup{bibtex:format:crossref}\bibtexrbracket
+ } {
+ \bibtexperiod
+ }
+ }
+ } {
+ \bibxmldoif {series} {
+ \bibtexspace\bibxmlflush{series}\bibtexperiod
+ }
+ }
+ } {
+ \bibxmldoifelse {crossref} {
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibxmldoif {volume} {
+ Volume\nonbreakablespace\bibxmlflush{volume}\bibtexspace of\nonbreakablespace
+ }
+ \bibxmldoif {crossref} {
+ \bibtexlbracket\bibxmlsetup{bibtex:format:crossref}\bibtexrbracket
+ }
+ } {
+ \bibxmldoif {volume} {
+ \bibtexcomma volume\nonbreakablespace\bibxmlflush{volume}
+ \bibxmldoif {series} {
+ \bibtexspace of\nonbreakablespace\bgroup\it\bibxmlflush{series}\/\egroup
+ }
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibtexperiod
+ }
+ }
+ }
+ }
+ \bibtexspace
+ \bibxmlsetup{bibtex:apa:common:edition:sentence}
+ \bibxmlsetup{bibtex:apa:common:publisher}
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:booklet
+ \bibxmlsetup{bibtex:apa:common:author-or-key-and-year}
+ \bibxmlsetup{bibtex:apa:common:title-it-and-series}
+ \bibxmlsetup{bibtex:apa:common:edition:sentence}
+ \bibxmlsetup{bibtex:apa:common:publication:sentence}
+ \bibxmlsetup{bibtex:apa:common:pages:p}
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:manual
+ \bibxmlsetup{bibtex:apa:common:author-or-key-and-year}
+ \bibxmlsetup{bibtex:apa:common:title-it-and-series}
+ \bibxmlsetup{bibtex:apa:common:edition:sentence}
+ \bibxmlsetup{bibtex:apa:common:organization:sentence}
+ \bibxmlsetup{bibtex:apa:common:pages:p}
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:incollection
+ \bibxmlsetup{bibtex:apa:common:author-and-year}
+ \bibxmldoif {arttitle} {
+ \bibxmlflush{arttitle}\bibtexperiod
+ }
+ In\bibtexspace
+ \bibxmldoifelse {title} {
+ \bibxmlsetup{bibtex:format:editors}\bibtexcomma
+ \bgroup\it\bibxmlflush{title}\/\egroup
+ \bibxmldoif {series} {
+ \bibxmldoif {volume} {
+ \bibtexcomma number\bibtexspace\bibxmlflush{volume}\bibtexspace in
+ }
+ \bibtexspace\bibxmlflush{series}
+ }
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}\bibtexspace
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibxmldoif {edition} {
+ \bibtexspace\bibxmlflush{edition}\bibtexspace edition
+ }
+ \bibxmlsetup{bibtex:apa:common:publisher:sentence}
+ } {
+ \bibxmldoif {crossref} {
+ \bibtexlbracket\bibxmlsetup{bibtex:format:crossref}\bibtexrbracket
+ }
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}
+ }
+ \bibtexspace
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ }
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:inproceedings
+ \bibxmlsetup{bibtex:apa:common:author-and-year}
+ \bibxmldoif {arttitle} {
+ \bibxmlflush{arttitle}\bibtexperiod
+ }
+ In\bibtexspace
+ \bibxmldoifelse {title} {
+ \bibxmldoif {editors} {
+ \bibxmlflush{bibtex:apa:format:editors}
+ \bibtexcomma\bibtexsingularplural{editor}{editors}\bibtexcomma
+ }
+ \bgroup\it\bibxmlflush{title}\/\egroup
+ \bibxmldoif {series} {
+ \bibxmldoif {volume} {
+ \bibtexcomma number~\bibxmlflush{volume} in
+ }
+ \bibtexspace
+ \bibxmlflush{series}
+ }
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}\bibtexspace
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibtexperiod
+ \bibxmlsetup{bibtex:apa:common:organization:sentence}
+ } {
+ \bibxmldoif {crossref} {
+ \bibtexlbracket\bibxmlsetup{bibtex:format:crossref}\bibtexrbracket
+ }
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}\bibtexspace
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibtexperiod
+ }
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:proceedings
+ \bibxmlsetup{bibtex:apa:common:editor-or-key-and-year}
+ \bibxmldoif {title} {
+ \bgroup\it\bibxmlflush{title}\/\egroup
+ \bibxmldoif {volume} {
+ \bibtexcomma number\bibtexspace\bibxmlflush{volume}\bibtexspace in\bibtexspace
+ }
+ \bibxmldoif {chapter} {
+ \bibtexcomma\bibxmlflush{chapter}\bibtexspace
+ }
+ \bibxmlsetup{bibtex:apa:common:pages:pages}
+ \bibtexperiod
+ \bibxmlsetup{bibtex:apa:common:organization:sentence}
+ }
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:common:thesis
+ \bibxmlsetup{bibtex:apa:common:author-and-year}
+ \bibxmlsetup{bibtex:apa:common:title-it-and-series}
+ \bibxmldoifelse {type} {
+ \bibxmlflush{type}
+ } {
+ \getvariable{bibtex:temp}{label}
+ }
+ \bibxmlsetup{bibtex:apa:common:school:subsentence}
+ \bibxmlsetup{bibtex:apa:common:pages:p}
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:mastersthesis
+ \setvariables[bibtex:temp][label=Master's thesis]
+ \bibxmlsetup{bibtex:apa:common:thesis}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:phdthesis
+ \setvariables[bibtex:temp][label=PhD thesis]
+ \bibxmlsetup{bibtex:apa:common:thesis}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:techreport
+ \bibxmlsetup{bibtex:apa:common:author-and-year}
+ \bibxmlsetup{bibtex:apa:common:title-and-series}
+ \bibxmldoifelse {type} {
+ \bibxmlflush{type}
+ \bibxmldoif {volume} {
+ \bibtexspace\bibxmlflush{volume}
+ }
+ } {
+ \bibtexspace Technical Report
+ }
+ \bibxmlsetup{bibtex:apa:common:institution:subsentence}
+ \bibxmlsetup{bibtex:apa:common:pages:p}
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:misc
+ \bibxmlsetup{bibtex:apa:common:author-and-year}
+ \bibxmlsetup{bibtex:apa:common:title-and-series}
+ \bibxmlsetup{bibtex:apa:common:publisher:sentence}
+ \bibxmlsetup{bibtex:apa:common:pages:p}
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\startxmlsetups bibtex:apa:unpublished
+ \bibxmlsetup{bibtex:apa:common:author-and-year}
+ \bibxmlsetup{bibtex:apa:common:title-and-series}
+ \bibxmlsetup{bibtex:apa:common:pages:p}
+ \bibxmldoif {type} {
+ \bibtexlparent\bibxmlflush{type}\bibtexrparent
+ }
+ \bibxmlsetup{bibtex:apa:common:note}
+\stopxmlsetups
+
+\protect \endinput
diff --git a/tex/context/base/catc-act.tex b/tex/context/base/catc-act.tex
new file mode 100644
index 000000000..bc24562d7
--- /dev/null
+++ b/tex/context/base/catc-act.tex
@@ -0,0 +1,61 @@
+%D \module
+%D [ file=catc-act,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Default Catcode Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module deals with some active character handling. Use
+%D with care.
+
+%D \macros
+%D {installactivecharacter}
+
+\def\installactivecharacter#1 %
+ {\edef\temp{\detokenize{#1}}%
+ \cctcounterc\expandafter`\temp\relax % relax needed
+ \expandafter\startextendcatcodetable
+ \expandafter\ctxcatcodes\expandafter\catcode\the\cctcounterc\activecatcode
+ \stopextendcatcodetable
+ \letcatcodecommand \ctxcatcodes \cctcounterc \temp \relax
+ \ifnum\currentcatcodetable=\ctxcatcodes \setcatcodetable\ctxcatcodes \fi}
+
+%D \macros
+%D {defineactivecharacter}
+%D
+%D Use this one with care, esp in combination with catcode
+%D vectors. There are better ways now.
+
+\chardef\activehackcode=`~
+
+\def\defineactivecharacter #1#2 #3%
+ {\cctcounterc\uccode\activehackcode
+ \if#1"\uccode\activehackcode\expandafter\doifnumberelse\expandafter{\string#1#2}\empty #1#2\else
+ \uccode\activehackcode\expandafter\doifnumberelse\expandafter{\string#1#2}\empty`#1#2\fi
+ \catcode\uccode\activehackcode\activecatcode
+ \uppercase{\def\next{~}}%
+ \uccode\activehackcode\cctcounterc
+ \expandafter\expandafter\expandafter\def\expandafter\next\expandafter
+ {\expandafter\dohandleactivecharacter\next{#3}}}
+
+\chardef\activecharactermode\plusone % overloading still backward compatible
+
+\def\dodohandleactivecharacter#1#2{#2}
+\def\donthandleactivecharacter#1#2{\noexpand#1}
+
+\def\dohandleactivecharacter
+ {\ifcase\activecharactermode
+ \expandafter\donthandleactivecharacter
+ \else
+ \expandafter\dodohandleactivecharacter
+ \fi}
+
+\def\makecharacteractive #1 {\catcode`#1\active}
+
+\endinput
diff --git a/tex/context/base/catc-ctx.tex b/tex/context/base/catc-ctx.tex
new file mode 100644
index 000000000..21e7d0136
--- /dev/null
+++ b/tex/context/base/catc-ctx.tex
@@ -0,0 +1,250 @@
+%D \module
+%D [ file=catc-cys,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Extra Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We prefer to define relevant catcode tables in this file instead
+%D of everywhere around.
+
+\ifdefined \ctxcatcodes \else \newcatcodetable \ctxcatcodes \fi
+\ifdefined \mthcatcodes \else \newcatcodetable \mthcatcodes \fi % math, not used, too tricky
+\ifdefined \xmlcatcodesn \else \newcatcodetable \xmlcatcodesn \fi % normal
+\ifdefined \xmlcatcodese \else \newcatcodetable \xmlcatcodese \fi % entitle
+\ifdefined \xmlcatcodesr \else \newcatcodetable \xmlcatcodesr \fi % reduce
+\ifdefined \typcatcodesa \else \newcatcodetable \typcatcodesa \fi % { }
+\ifdefined \typcatcodesb \else \newcatcodetable \typcatcodesb \fi % < >
+
+\startcatcodetable \ctxcatcodes
+ \catcode`\^^I = 10
+ \catcode`\^^M = 5
+ % \catcode`\^^J = 10 % new
+ \catcode`\^^L = 5
+ \catcode`\ = 10
+ \catcode`\^^Z = 9
+ \catcode`\\ = 0
+ \catcode`\{ = 1
+ \catcode`\} = 2
+ \catcode`\$ = 3
+ \catcode`\& = 4
+ \catcode`\# = 6
+ \catcode`\^ = 7
+ \catcode`\_ = 8
+ \catcode`\% = 14
+ \catcode`\~ = 13
+ \catcode`\| = 13
+\stopcatcodetable
+
+\startcatcodetable \prtcatcodes
+ \catcode`\^^I = 10
+ \catcode`\^^M = 5
+ \catcode`\^^L = 5
+ \catcode`\ = 10
+ \catcode`\^^Z = 9
+ \catcode`\\ = 0
+ \catcode`\{ = 1
+ \catcode`\} = 2
+ \catcode`\$ = 3
+ \catcode`\& = 4
+ \catcode`\# = 6
+ \catcode`\^ = 7
+ \catcode`\_ = 8
+ \catcode`\% = 14
+ \catcode`\@ = 11
+ \catcode`\! = 11
+ \catcode`\? = 11
+ \catcode`\~ = 13
+ \catcode`\| = 13
+\stopcatcodetable
+
+\startcatcodetable \mthcatcodes
+ \catcode`\^^I = 10
+ \catcode`\^^M = 5
+ %\catcode`\^^J = 10 % new
+ \catcode`\^^L = 5
+ \catcode`\ = 10
+ \catcode`\^^Z = 9
+ \catcode`\\ = 0
+ \catcode`\{ = 1
+ \catcode`\} = 2
+ \catcode`\$ = 3
+ \catcode`\& = 4
+ \catcode`\# = 6
+ \catcode`\^ = 7
+ \catcode`\_ = 8
+ \catcode`\% = 14
+ %\catcode`\~ = 13
+ %\catcode`\| = 13
+\stopcatcodetable
+
+\startcatcodetable \xmlcatcodesn
+ \catcode`\^^I = 10 % ascii tab is a blank space
+ \catcode`\^^M = 5 % ascii return is end-line
+ \catcode`\^^L = 5 % ascii form-feed
+ \catcode`\ = 10 % ascii space is blank space
+ \catcode`\^^Z = 9 % ascii eof is ignored
+ \catcode`\& = 13 % entity
+ \catcode`\< = 13 % element
+ \catcode`\> = 12
+ \catcode`\" = 12 % probably not needed any more
+ \catcode`\/ = 12 % probably not needed any more
+ \catcode`\' = 12 % probably not needed any more
+ \catcode`\~ = 12 % probably not needed any more
+ \catcode`\# = 12 % probably not needed any more
+ \catcode`\\ = 12 % probably not needed any more
+\stopcatcodetable
+
+\startcatcodetable \xmlcatcodese
+ \catcode`\^^I = 10 % ascii tab is a blank space
+ \catcode`\^^M = 5 % ascii return is end-line
+ \catcode`\^^L = 5 % ascii form-feed
+ \catcode`\ = 10 % ascii space is blank space
+ \catcode`\^^Z = 9 % ascii eof is ignored
+ \catcode`\& = 13 % entity
+ \catcode`\< = 13 % element
+ \catcode`\> = 12
+ \catcode`\# = 13
+ \catcode`\$ = 13
+ \catcode`\% = 13
+ \catcode`\\ = 13
+ \catcode`\^ = 13
+ \catcode`\_ = 13
+ \catcode`\{ = 13
+ \catcode`\} = 13
+ \catcode`\| = 13
+ \catcode`\~ = 13
+\stopcatcodetable
+
+\startcatcodetable \xmlcatcodesr
+ \catcode`\^^I = 10 % ascii tab is a blank space
+ \catcode`\^^M = 5 % ascii return is end-line
+ \catcode`\^^L = 5 % ascii form-feed
+ \catcode`\ = 10 % ascii space is blank space
+ \catcode`\^^Z = 9 % ascii eof is ignored
+ \catcode`\& = 13 % entity
+ \catcode`\< = 13 % element
+ \catcode`\> = 12
+ \catcode`\# = 13
+ \catcode`\$ = 13
+ \catcode`\% = 13
+ \catcode`\\ = 13
+ \catcode`\^ = 13
+ \catcode`\_ = 13
+ \catcode`\{ = 13
+ \catcode`\} = 13
+ \catcode`\| = 13
+ \catcode`\~ = 13
+\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
+
+\letcatcodecommand \ctxcatcodes `\| \relax
+\letcatcodecommand \ctxcatcodes `\~ \relax
+
+%letcatcodecommand \prtcatcodes `\| \relax % falls back on ctx
+%letcatcodecommand \prtcatcodes `\~ \relax % falls back on ctx
+
+\letcatcodecommand \xmlcatcodesn `\& \relax
+\letcatcodecommand \xmlcatcodesn `\< \relax
+
+\letcatcodecommand \xmlcatcodese `\& \relax
+\letcatcodecommand \xmlcatcodese `\< \relax
+
+\letcatcodecommand \xmlcatcodesr `\& \relax
+\letcatcodecommand \xmlcatcodesr `\< \relax
+
+\letcatcodecommand \xmlcatcodese `\# \relax
+\letcatcodecommand \xmlcatcodese `\$ \relax
+\letcatcodecommand \xmlcatcodese `\% \relax
+\letcatcodecommand \xmlcatcodese `\\ \relax
+\letcatcodecommand \xmlcatcodese `\^ \relax
+\letcatcodecommand \xmlcatcodese `\_ \relax
+\letcatcodecommand \xmlcatcodese `\{ \relax
+\letcatcodecommand \xmlcatcodese `\} \relax
+\letcatcodecommand \xmlcatcodese `\| \relax
+\letcatcodecommand \xmlcatcodese `\~ \relax
+
+\letcatcodecommand \xmlcatcodesr `\# \relax
+\letcatcodecommand \xmlcatcodesr `\$ \relax
+\letcatcodecommand \xmlcatcodesr `\% \relax
+\letcatcodecommand \xmlcatcodesr `\\ \relax
+\letcatcodecommand \xmlcatcodesr `\^ \relax
+\letcatcodecommand \xmlcatcodesr `\_ \relax
+\letcatcodecommand \xmlcatcodesr `\{ \relax
+\letcatcodecommand \xmlcatcodesr `\} \relax
+\letcatcodecommand \xmlcatcodesr `\| \relax
+\letcatcodecommand \xmlcatcodesr `\~ \relax
+
+ \catcodetable \ctxcatcodes
+\let\defaultcatcodetable\ctxcatcodes
+\let\xmlcatcodes \xmlcatcodesn % beware, in mkiv we use \notcatcodes
+
+\endinput
+
+% under consideration:
+%
+% \newcatcodetable\txtcatcodes
+%
+% \startcatcodetable \txtcatcodes
+% \catcode`\^^I = 10
+% \catcode`\^^M = 5
+% \catcode`\^^L = 5
+% \catcode`\ = 10
+% \catcode`\\ = 0
+% \catcode`\{ = 1
+% \catcode`\} = 2
+% \stopcatcodetable
+%
+% \newcount\relaxedcatcodedepth
+%
+% \def\startrelaxedcatcodes
+% {\global\chardef\relaxedcatcodeparent\catcodetable
+% \global\advance\relaxedcatcodedepth\plusone
+% \nonknuthmode\setcatcodetable\txtcatcodes}
+%
+% \def\stoprelaxedcatcodes
+% {\ifcase\relaxedcatcodedepth
+% % error
+% \or
+% \setcatcodetable\relaxedcatcodeparent
+% \global\relaxedcatcodedepth\zerocount
+% \else
+% \global\advance\relaxedcatcodedepth\minusone
+% \setcatcodetable\txtcatcodes
+% \fi}
+%
+% \starttext
+%
+% \startrelaxedcatcodes
+% \startcomment test \stopcomment
+% test $ test 10% whatever|test \mathematics{x^2=1}
+% \stoprelaxedcatcodes
+%
+% $x^2=1$
+%
+% \stoptext
diff --git a/tex/context/base/catc-def.tex b/tex/context/base/catc-def.tex
new file mode 100644
index 000000000..e80cfe125
--- /dev/null
+++ b/tex/context/base/catc-def.tex
@@ -0,0 +1,142 @@
+%D \module
+%D [ file=catc-def,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Default Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The following catcode tables are rather \CONTEXT\ independent.
+
+\ifdefined\nilcatcodes \else \newcatcodetable \nilcatcodes \fi
+\ifdefined\texcatcodes \else \newcatcodetable \texcatcodes \fi
+\ifdefined\luacatcodes \else \newcatcodetable \luacatcodes \fi
+\ifdefined\notcatcodes \else \newcatcodetable \notcatcodes \fi
+\ifdefined\vrbcatcodes \else \newcatcodetable \vrbcatcodes \fi
+\ifdefined\prtcatcodes \else \newcatcodetable \prtcatcodes \fi
+
+\startcatcodetable \nilcatcodes
+ \catcode`\^^I = 10 % ascii tab is a blank space
+ \catcode`\^^M = 5 % ascii return is end-line
+ \catcode`\^^L = 5 % ascii form-feed
+ \catcode`\ = 10 % ascii space is blank space
+ \catcode`\^^Z = 9 % ascii eof is ignored
+\stopcatcodetable
+
+\startcatcodetable \texcatcodes
+ \catcode`\^^I = 10
+ \catcode`\^^M = 5
+ \catcode`\^^L = 5
+ \catcode`\ = 10
+ \catcode`\^^Z = 9
+ \catcode`\\ = 0
+ \catcode`\{ = 1
+ \catcode`\} = 2
+ \catcode`\$ = 3
+ \catcode`\& = 4
+ \catcode`\# = 6
+ \catcode`\^ = 7
+ \catcode`\_ = 8
+ \catcode`\% = 14
+\stopcatcodetable
+
+\startcatcodetable \luacatcodes
+ \catcode`\^^I = 12 % ascii tab is a blank space
+ \catcode`\^^M = 12 % ascii return is end-line
+ \catcode`\^^L = 12 % ascii form-feed
+ \catcode`\ = 12 % ascii space is blank space
+ \catcode`\^^Z = 9 % ascii eof is ignored
+ \catcode`\\ = 0
+ \catcode`\% = 12
+ \catcode`\# = 12
+ \catcode`\_ = 12
+ \catcode`\^ = 12
+ \catcode`\& = 12
+ \catcode`\| = 12
+ \catcode`\{ = 12
+ \catcode`\} = 12
+ \catcode`\~ = 12
+ \catcode`\$ = 12
+\stopcatcodetable
+
+\startcatcodetable \notcatcodes
+ \catcode`\^^I = 10 % ascii tab is a blank space
+ \catcode`\^^M = 5 % ascii return is end-line
+ \catcode`\^^L = 5 % ascii form-feed
+ \catcode`\ = 10 % ascii space is blank space
+ \catcode`\^^Z = 9 % ascii eof is ignored
+ \catcode`\~ = 12
+ \catcode`\# = 12 % probably too much, in principle
+ \catcode`\$ = 12 % nilcatcodes would be ok too
+ \catcode`\% = 12
+ \catcode`\^ = 12
+ \catcode`\& = 12
+ \catcode`\_ = 12
+ \catcode`\< = 12
+ \catcode`\> = 12
+ \catcode`\{ = 12
+ \catcode`\} = 12
+ \catcode`\" = 12
+ \catcode`\' = 12
+ \catcode`\/ = 12
+ \catcode`\\ = 12
+ \catcode`\| = 12
+\stopcatcodetable
+
+\startcatcodetable \vrbcatcodes % probably less needed
+ \catcode`\^^I = 12
+ \catcode`\^^M = 12
+ \catcode`\^^L = 12
+ \catcode`\ = 12
+ \catcode`\^^Z = 12
+\stopcatcodetable
+
+\startcatcodetable \prtcatcodes
+ \catcode`\^^I = 10
+ \catcode`\^^M = 5
+ \catcode`\^^L = 5
+ \catcode`\ = 10
+ \catcode`\^^Z = 9
+ \catcode`\\ = 0
+ \catcode`\{ = 1
+ \catcode`\} = 2
+ \catcode`\$ = 3
+ \catcode`\& = 4
+ \catcode`\# = 6
+ \catcode`\^ = 7
+ \catcode`\_ = 8
+ \catcode`\% = 14
+ \catcode`\@ = 11
+ \catcode`\! = 11
+ \catcode`\? = 11
+ \catcode`\~ = 13
+ \catcode`\| = 13
+\stopcatcodetable
+
+%D Because some characters have a special meaning, we provide
+%D shortcuts to their character representation.
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\{=`\{
+\chardef\}=`\}
+\chardef\\=`\\
+\chardef\^=`\^
+\chardef\_=`\_ % but way too wide in lm, so ... until that's fixed:
+
+%def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\_{\dontleavehmode \kern.06em \vbox{\hrule width.3em}}
+
+%D From now on we can use the protection mechanisms.
+
+\def\unprotect {\pushcatcodetable\setcatcodetable\prtcatcodes}
+\def\protect {\popcatcodetable}
+
+\endinput
diff --git a/tex/context/base/catc-ini.lua b/tex/context/base/catc-ini.lua
new file mode 100644
index 000000000..2749f403c
--- /dev/null
+++ b/tex/context/base/catc-ini.lua
@@ -0,0 +1,33 @@
+if not modules then modules = { } end modules ['catc-ini'] = {
+ version = 1.001,
+ comment = "companion to catc-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+catcodes = catcodes or { }
+catcodes.numbers = catcodes.numbers or { }
+catcodes.names = catcodes.names or { }
+
+storage.register("catcodes/numbers", catcodes.numbers, "catcodes.numbers")
+storage.register("catcodes/names", catcodes.names, "catcodes.names")
+
+-- this only happens at initime
+
+function catcodes.register(name,number)
+ catcodes.numbers[name] = number
+ local cnn = catcodes.names[number]
+ if cnn then
+ cnn[#cnn+1] = name
+ else
+ catcodes.names[number] = { name }
+ end
+ tex[name] = number
+end
+
+-- this only happens at runtime
+
+for k, v in next, catcodes.numbers do
+ tex[k] = v
+end
diff --git a/tex/context/base/catc-ini.mkii b/tex/context/base/catc-ini.mkii
new file mode 100644
index 000000000..dee15290a
--- /dev/null
+++ b/tex/context/base/catc-ini.mkii
@@ -0,0 +1,249 @@
+%D \module
+%D [ file=catc-ini,
+%D version=2006.09.18,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Catcode Handling,
+%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've split the functionality of syst-cat.* over more files
+%D now so that we can load more selectively.
+
+%D A long standing wish has been the availability of catcode
+%D arrays. Because traditional \TEX\ does ot provide this we
+%D implement a fake method in the Mark II file.
+
+\ifx\zerocount\undefined \chardef \zerocount= 0 \fi
+\ifx\plusone \undefined \chardef \plusone = 1 \fi
+\ifx\minusone \undefined \newcount\minusone \minusone =-1 \fi
+
+\chardef\escapecatcode = 0
+\chardef\begingroupcatcode = 1
+\chardef\endgroupcatcode = 2
+\chardef\mathshiftcatcode = 3
+\chardef\alignmentcatcode = 4
+\chardef\endoflinecatcode = 5
+\chardef\parametercatcode = 6
+\chardef\superscriptcatcode = 7
+\chardef\subscriptcatcode = 8
+\chardef\ignorecatcode = 9
+\chardef\spacecatcode = 10
+\chardef\lettercatcode = 11
+\chardef\othercatcode = 12 \chardef\other = 12
+\chardef\activecatcode = 13 \chardef\active = 13
+\chardef\commentcatcode = 14
+
+\newif \ifrecatcodeuppercharacters % only used in good old tex
+
+% \newcount\cctdefcounter \cctdefcounter\plusone % 0 = signal
+\newcount\cctdefcounter \cctdefcounter\zerocount % 0 = signal, so advance before allocate
+
+\newcount\cctcountera
+\newcount\cctcounterb
+\newcount\cctcounterc
+
+\def\newcatcodetable#1%
+ {\global\advance\cctdefcounter\plusone
+ \global\mathchardef#1\cctdefcounter
+ \expandafter\xdef\csname @@ccn:\number\cctdefcounter\endcsname{\string#1}% logging
+ \expandafter\newtoks\csname @@cct:\number\cctdefcounter\endcsname}
+
+\mathchardef\currentcatcodetable\zerocount
+
+\newtoks \setdefaultlowercatcodes
+\newtoks \setdefaultuppercatcodes
+
+\def\next#1% we don't have a proper loop defined yet
+ {\edef\nextnext{#1{\the#1\catcode\the\cctcountera\space
+ \ifnum\catcode\cctcountera=\lettercatcode \lettercatcode\else\othercatcode\fi}}%
+ \nextnext\ifnum\cctcountera<\cctcounterb \advance\cctcountera\plusone \expandafter\next\expandafter#1\fi}
+
+\cctcountera 0 \cctcounterb 127 \next\setdefaultlowercatcodes
+\cctcountera 128 \cctcounterb 255 \next\setdefaultuppercatcodes
+
+\recatcodeuppercharactersfalse
+
+\def\catcodetable#1%
+ {\mathchardef\currentcatcodetable#1%
+ \the\setdefaultlowercatcodes
+ \ifrecatcodeuppercharacters\the\setdefaultuppercatcodes\fi
+ \the\csname @@cct:\number#1\endcsname}
+
+\long\def\startcatcodetable#1#2\stopcatcodetable
+ {\global\csname @@cct:\number#1\endcsname{#2}}
+
+\long\def\startextendcatcodetable#1#2\stopextendcatcodetable
+ {\global\csname @@cct:\number#1\endcsname\expandafter{\the\csname @@cct:\number#1\endcsname#2}}
+
+%D The next command can be defined in a cleaner way in the
+%D Mk IV file but we want to have a fast one with a minimal
+%D chance for interference.
+
+\chardef\activehackcode=`\~
+
+%D Once a catcode is assigned, the next assignments will happen faster.
+
+% (expandable) let
+
+\def\letcatcodecommand {\afterassignment\letcatcodecommanda\cctcountera}
+\def\letcatcodecommanda{\afterassignment\letcatcodecommandb\cctcounterb}
+
+\def\letcatcodecommandb % each time
+ {\ifcsname CCL:\number\cctcountera:\number\cctcounterb\endcsname
+ \csname CCL:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \else
+ \expandafter\letcatcodecommandc
+ \fi}
+
+\def\letcatcodecommandc % only first time
+ {\expandafter\gdef\csname CCL:\number\cctcountera:\number\cctcounterb\expandafter\endcsname\expandafter
+ {\expandafter\let\csname CCC:\number\cctcountera:\number\cctcounterb\endcsname}%
+ \reinstatecatcodecommanda
+ \csname CCL:\number\cctcountera:\number\cctcounterb\endcsname}
+
+% expandable def
+
+\def\defcatcodecommand {\afterassignment\defcatcodecommanda\cctcountera}
+\def\defcatcodecommanda{\afterassignment\defcatcodecommandb\cctcounterb}
+
+\def\defcatcodecommandb % each time
+ {\ifcsname CCD:\number\cctcountera:\number\cctcounterb\endcsname
+ \csname CCD:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \else
+ \expandafter\defcatcodecommandc
+ \fi}
+
+\def\defcatcodecommandc % only first time
+ {\expandafter\gdef\csname CCD:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \expandafter##\expandafter1\expandafter
+ {\expandafter\def\csname CCC:\number\cctcountera:\number\cctcounterb\endcsname{##1}}%
+ \reinstatecatcodecommanda
+ \csname CCD:\number\cctcountera:\number\cctcounterb\endcsname}
+
+% un expandable def (e.g. used for discretionaries)
+
+\def\uedcatcodecommand {\afterassignment\uedcatcodecommanda\cctcountera}
+\def\uedcatcodecommanda{\afterassignment\uedcatcodecommandb\cctcounterb}
+
+\def\uedcatcodecommandb % each time
+ {\ifcsname CCU:\number\cctcountera:\number\cctcounterb\endcsname
+ \csname CCU:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \else
+ \expandafter\uedcatcodecommandc
+ \fi}
+
+\def\uedcatcodecommandc % only first time
+ {\expandafter\gdef\csname CCU:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \expandafter##\expandafter1\expandafter
+ {\expandafter\unexpanded\expandafter\def\csname CCC:\number\cctcountera:\number\cctcounterb\endcsname{##1}}%
+ \reinstatecatcodecommanda
+ \csname CCU:\number\cctcountera:\number\cctcounterb\endcsname}
+
+\def\reinstatecatcodecommand{\afterassignment\reinstatecatcodecommanda\cctcounterb}
+
+\def\reinstatecatcodecommanda % can be used when a direct definition has been done
+ {\bgroup % and the selector has been lost
+ \uccode\activehackcode\cctcounterb
+ \catcode\uccode\activehackcode\activecatcode
+ \uppercase{\xdef~{\noexpand\catcodecommand{\number\cctcounterb}}}%
+ \egroup}
+
+\chardef\defaultcatcodetable\zerocount
+
+\def\catcodecommand#1%
+ {\csname CCC:\number
+ \ifcsname CCC:\number\currentcatcodetable:\number#1\endcsname
+ \currentcatcodetable \else \defaultcatcodetable
+ \fi
+ :\number#1\endcsname}
+
+%D \macros
+%D {restorecatcodes,
+%D beginrestorecatcodes,endrestorecatcodes}
+%D
+%D We're not finished dealing \CATCODES\ yet. In \CONTEXT\ we
+%D use only one auxiliary file, which deals with tables of
+%D contents, registers, two pass tracking, references etc. This
+%D file, as well as files concerning graphics, is processed when
+%D needed, which can be in the mid of typesetting verbatim.
+%D However, when reading in data in verbatim mode, we should
+%D temporary restore the normal \CATCODES, and that's exactly
+%D what the next macros do. Saving the catcodes can be
+%D disabled by saying \type{\localcatcodestrue}.
+
+\let\savedcatcodetable\relax
+
+\newcount\catcoderestorelevel
+
+\def\pushcatcodetable
+ {\advance\catcoderestorelevel\plusone
+ \tracepushcatcodetable
+ \expandafter\mathchardef\csname scct:\number\catcoderestorelevel\endcsname\currentcatcodetable}
+
+\def\popcatcodetable
+ {\ifcase\catcoderestorelevel
+ \showcatcodenestingerror
+ \else
+ \expandafter\catcodetable\csname scct:\number\catcoderestorelevel\endcsname
+ \tracepopcatcodetable
+ \advance\catcoderestorelevel\minusone
+ \fi}
+
+\def\showcatcodenestingerror % can be overloaded
+ {\immediate\write16{}%
+ \immediate\write16{Fatal error: catcode push/pop mismatch. Fix this!}\wait\end
+ \immediate\write16{}}
+
+\def\restorecatcodes % takes previous level
+ {\ifnum\catcoderestorelevel>\plusone
+ \expandafter\catcodetable\csname scct:\number\numexpr\catcoderestorelevel-1\relax\endcsname
+ \fi}
+
+\newtoks\everycatcodetable
+
+\def\setcatcodetable#1%
+ {\catcodetable#1%
+ \the\everycatcodetable
+ \tracesetcatcodetable}
+
+\def\dotracecatcodetable#1{\immediate\write16{[#1]}}
+
+\def\tracecatcodetables
+ {\def\tracesetcatcodetable {\dotracecatcodetable{set \catcodetablename\space at \number\catcoderestorelevel}}%
+ \def\tracepushcatcodetable{\dotracecatcodetable{push \catcodetablename\space from \catcodetableprev\space at \number\catcoderestorelevel}}%
+ \def\tracepopcatcodetable {\dotracecatcodetable{pop \catcodetablename\space to \catcodetableprev\space at \number\catcoderestorelevel}}}
+
+\def\catcodetableprev
+ {\ifnum\numexpr\catcoderestorelevel-1\relax>\zerocount
+ \csname @@ccn:\number\csname scct:\number\numexpr\catcoderestorelevel-1\relax\endcsname\endcsname
+ \else
+ -%
+ \fi}
+
+\def\catcodetablename
+ {\ifnum\currentcatcodetable>\zerocount
+ \csname @@ccn:\number\currentcatcodetable\endcsname
+ \else
+ -%
+ \fi}
+
+\ifx\empty\undefined \def\empty{} \fi
+
+\let\tracesetcatcodetable \empty
+\let\tracepushcatcodetable\empty
+\let\tracepopcatcodetable \empty
+
+\def\beginrestorecatcodes{\pushcatcodetable}
+\def\endrestorecatcodes {\popcatcodetable}
+
+%D Handy for debugging:
+
+% \tracecatcodetables
+
+\endinput
+
diff --git a/tex/context/base/catc-ini.mkiv b/tex/context/base/catc-ini.mkiv
new file mode 100644
index 000000000..269330a1b
--- /dev/null
+++ b/tex/context/base/catc-ini.mkiv
@@ -0,0 +1,317 @@
+%D \module
+%D [ file=catc-ini,
+%D version=2006.09.18,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Catcode Handling,
+%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've split the functionality of syst-cat.* over more files
+%D now so that we can load more selectively.
+
+\registerctxluafile{catc-ini} {1.001}
+
+%D A long standing wish has been the availability of catcode
+%D arrays. Because traditional \TEX\ does not provide this we
+%D implement a fake method in the \MKII\ file. There is some
+%D overlap in code with \MKII\ but we take that for granted.
+
+\ifx\zerocount\undefined \chardef \zerocount= 0 \fi
+\ifx\plusone \undefined \chardef \plusone = 1 \fi
+\ifx\minusone \undefined \newcount\minusone \minusone =-1 \fi
+
+\chardef\escapecatcode = 0
+\chardef\begingroupcatcode = 1
+\chardef\endgroupcatcode = 2
+\chardef\mathshiftcatcode = 3
+\chardef\alignmentcatcode = 4
+\chardef\endoflinecatcode = 5
+\chardef\parametercatcode = 6
+\chardef\superscriptcatcode = 7
+\chardef\subscriptcatcode = 8
+\chardef\ignorecatcode = 9
+\chardef\spacecatcode = 10
+\chardef\lettercatcode = 11
+\chardef\othercatcode = 12 \chardef\other = 12
+\chardef\activecatcode = 13 \chardef\active = 13
+\chardef\commentcatcode = 14
+
+\ifx\gobbleoneargument\undefined \long\def\gobbleoneargument#1{} \fi
+
+\newif \ifrecatcodeuppercharacters % only used in good old tex
+
+\newcount\cctdefcounter \cctdefcounter\zerocount % 0 = signal, so advance before allocate
+
+\newcount\cctcountera
+\newcount\cctcounterb
+\newcount\cctcounterc
+
+\def\newcatcodetable#1%
+ {\global\advance\cctdefcounter\plusone
+ \expandafter\xdef\csname @@ccn:\number\cctdefcounter\endcsname{\string#1}% logging
+ \global\chardef#1\cctdefcounter
+ \ctxlua{catcodes.register("\expandafter\gobbleoneargument\string#1",\number#1)}%
+ % we have two ways to access catcodetable numbers
+ \startruntimectxluacode tex.\expandafter\gobbleoneargument\string#1 = \number#1 ;\stopruntimectxluacode}
+
+\newcatcodetable \scratchcatcodes \initcatcodetable\scratchcatcodes
+
+\newtoks \setdefaultcatcodes
+
+\setdefaultcatcodes
+ {\catcode`\\ \othercatcode
+ \catcode`\^^M \othercatcode
+ \catcode`\ \othercatcode
+ \catcode`\% \othercatcode
+ \catcode127 \othercatcode}
+
+\long\normalprotected\def\startcatcodetable#1#2\stopcatcodetable
+ {\bgroup
+ \catcodetable\scratchcatcodes
+ \the\setdefaultcatcodes
+ #2%
+ \savecatcodetable#1\relax
+ \egroup}
+
+\newcatcodetable\dummycatcodes
+
+\long\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable
+ {\bgroup
+ \catcodetable#1\relax
+ \globaldefs\plusone
+ #2%
+ \globaldefs\zerocount
+ \egroup}
+
+% ==
+%
+% \long\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable
+% {\bgroup
+% \scratchcounter\the\catcodetable
+% \catcodetable #1 #2
+% \catcodetable\scratchcounter
+% \egroup}
+
+\def\letcatcodecommand
+ {\afterassignment\letcatcodecommanda\cctcountera}
+
+\def\letcatcodecommanda
+ {\afterassignment\letcatcodecommandb\cctcounterb}
+
+\let\currentcatcodetable\catcodetable
+
+%D The next command can be defined in a cleaner way in the
+%D Mk IV file but we want to have a fast one with a minimal
+%D chance for interference. Do we still need this complex
+%D mechanism? Future versions of \MKIV\ might only use
+%D active characters for very special cases.
+
+\chardef\activehackcode=`\~
+
+%D Once a catcode is assigned, the next assignments will happen faster.
+
+% (expandable) let
+
+\def\letcatcodecommand {\afterassignment\letcatcodecommanda\cctcountera}
+\def\letcatcodecommanda{\afterassignment\letcatcodecommandb\cctcounterb}
+
+\def\letcatcodecommandb % each time
+ {\ifcsname CCL:\number\cctcountera:\number\cctcounterb\endcsname
+ \csname CCL:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \else
+ \expandafter\letcatcodecommandc
+ \fi}
+
+\def\letcatcodecommandc % only first time
+ {\expandafter\gdef\csname CCL:\number\cctcountera:\number\cctcounterb\expandafter\endcsname\expandafter
+ {\expandafter\let\csname CCC:\number\cctcountera:\number\cctcounterb\endcsname}%
+ \reinstatecatcodecommandua % unexpanded
+ \csname CCL:\number\cctcountera:\number\cctcounterb\endcsname}
+
+% expandable def
+
+\def\defcatcodecommand {\afterassignment\defcatcodecommanda\cctcountera}
+\def\defcatcodecommanda{\afterassignment\defcatcodecommandb\cctcounterb}
+
+\def\defcatcodecommandb % each time
+ {\ifcsname CCD:\number\cctcountera:\number\cctcounterb\endcsname
+ \csname CCD:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \else
+ \expandafter\defcatcodecommandc
+ \fi}
+
+\def\defcatcodecommandc % only first time (we could use \normalexpanded here)
+ {\expandafter\gdef\csname CCD:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \expandafter##\expandafter1\expandafter
+ {\expandafter\def\csname CCC:\number\cctcountera:\number\cctcounterb\endcsname{##1}}%
+ \reinstatecatcodecommanda
+ \csname CCD:\number\cctcountera:\number\cctcounterb\endcsname}
+
+% unexpandable def (e.g. used for discretionaries)
+
+\def\uedcatcodecommand {\afterassignment\uedcatcodecommanda\cctcountera}
+\def\uedcatcodecommanda{\afterassignment\uedcatcodecommandb\cctcounterb}
+
+\def\uedcatcodecommandb % each time
+ {\ifcsname CCU:\number\cctcountera:\number\cctcounterb\endcsname
+ \csname CCU:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \else
+ \expandafter\uedcatcodecommandc
+ \fi}
+
+\def\uedcatcodecommandc % only first time
+ {\expandafter\gdef\csname CCU:\number\cctcountera:\number\cctcounterb\expandafter\endcsname
+ \expandafter##\expandafter1\expandafter
+ {\expandafter\normalprotected\expandafter\def\csname CCC:\number\cctcountera:\number\cctcounterb\endcsname{##1}}%
+ \reinstatecatcodecommandua % unexpanded
+ \csname CCU:\number\cctcountera:\number\cctcounterb\endcsname}
+
+\def\reinstatecatcodecommand{\afterassignment\reinstatecatcodecommanda\cctcounterb}
+
+\def\reinstatecatcodecommanda % can be used when a direct definition has been done
+ {\bgroup % and the selector has been lost
+ \uccode\activehackcode\cctcounterb
+ \catcode\uccode\activehackcode\activecatcode
+ \uppercase{\xdef~{\noexpand\catcodecommand{\number\cctcounterb}}}%
+ \egroup}
+
+\def\reinstatecatcodecommandua % can be used when a direct definition has been done
+ {\bgroup % and the selector has been lost
+ \uccode\activehackcode\cctcounterb
+ \catcode\uccode\activehackcode\activecatcode
+ \uppercase{\normalprotected\xdef~{\noexpand\catcodecommand{\number\cctcounterb}}}%
+ \egroup}
+
+\chardef\defaultcatcodetable\zerocount
+
+\def\catcodecommand#1%
+ {\csname CCC:\number
+ \ifcsname CCC:\number\currentcatcodetable:\number#1\endcsname
+ \currentcatcodetable \else \defaultcatcodetable
+ \fi
+ :\number#1\endcsname}
+
+%D \macros
+%D {restorecatcodes,
+%D beginrestorecatcodes,endrestorecatcodes}
+%D
+%D We're not finished dealing \CATCODES\ yet. In \CONTEXT\ we
+%D use only one auxiliary file, which deals with tables of
+%D contents, registers, two pass tracking, references etc. This
+%D file, as well as files concerning graphics, is processed when
+%D needed, which can be in the mid of typesetting verbatim.
+%D However, when reading in data in verbatim mode, we should
+%D temporary restore the normal \CATCODES, and that's exactly
+%D what the next macros do. Saving the catcodes can be
+%D disabled by saying \type{\localcatcodestrue}.
+
+\let\savedcatcodetable\relax
+
+\newcount\catcoderestorelevel
+
+\def\pushcatcodetable
+ {\advance\catcoderestorelevel\plusone
+ \tracepushcatcodetable
+ \expandafter\chardef\csname scct:\number\catcoderestorelevel\endcsname\currentcatcodetable}
+
+\def\popcatcodetable
+ {\ifcase\catcoderestorelevel
+ \showcatcodenestingerror
+ \else
+ \expandafter\catcodetable\csname scct:\number\catcoderestorelevel\endcsname
+ \tracepopcatcodetable
+ \advance\catcoderestorelevel\minusone
+ \fi}
+
+\def\showcatcodenestingerror % can be overloaded
+ {\immediate\write16{}%
+ \immediate\write16{Fatal error: catcode push/pop mismatch. Fix this!}\wait\end
+ \immediate\write16{}}
+
+\def\restorecatcodes % takes previous level
+ {\ifnum\catcoderestorelevel>\plusone
+ \expandafter\catcodetable\csname scct:\number\numexpr\catcoderestorelevel-1\relax\endcsname
+ \fi}
+
+\newtoks\everycatcodetable
+
+\def\setcatcodetable#1%
+ {\catcodetable#1%
+ \the\everycatcodetable
+ \tracesetcatcodetable}
+
+\def\dotracecatcodetable#1{\immediate\write16{[#1]}}
+
+\def\tracecatcodetables
+ {\def\tracesetcatcodetable {\dotracecatcodetable{set \catcodetablename\space at \number\catcoderestorelevel}}%
+ \def\tracepushcatcodetable{\dotracecatcodetable{push \catcodetablename\space from \catcodetableprev\space at \number\catcoderestorelevel}}%
+ \def\tracepopcatcodetable {\dotracecatcodetable{pop \catcodetablename\space to \catcodetableprev\space at \number\catcoderestorelevel}}}
+
+\def\catcodetableprev
+ {\ifnum\numexpr\catcoderestorelevel-1\relax>\zerocount
+ \csname @@ccn:\number\csname scct:\number\numexpr\catcoderestorelevel-1\relax\endcsname\endcsname
+ \else
+ -%
+ \fi}
+
+\def\catcodetablename
+ {\ifnum\currentcatcodetable>\zerocount
+ \csname @@ccn:\number\currentcatcodetable\endcsname
+ \else
+ -%
+ \fi}
+
+\ifx\empty\undefined \def\empty{} \fi
+
+\let\tracesetcatcodetable \empty
+\let\tracepushcatcodetable\empty
+\let\tracepopcatcodetable \empty
+
+\def\beginrestorecatcodes{\pushcatcodetable}
+\def\endrestorecatcodes {\popcatcodetable}
+
+%D Handy for debugging:
+
+% \tracecatcodetables
+
+%D Only in \MKIV\ (to be used when crossing pages with changed catcodes
+%D in the current vector):
+%D
+%D \starttyping
+%D \normalprotected\def\startcrap
+%D {\bgroup
+%D \pushcatcodes
+%D \whitespace
+%D \obeylines
+%D \activatespacehandler\v!yes
+%D \strut}
+%D
+%D \normalprotected\def\stopcrap
+%D {\popcatcodes
+%D \egroup}
+%D \stoptyping
+
+\newcount\catcodetablelevel
+
+\def\pushcatcodes
+ {\bgroup
+ \global\advance\catcodetablelevel\plusone
+ \ifcsname @@ccf:\number\catcodetablelevel\endcsname \else
+ \global\advance\cctdefcounter\plusone
+ \expandafter\global\expandafter\chardef\csname @@ccf:\number\catcodetablelevel\endcsname\cctdefcounter
+ \fi
+ \catcodetable\ctxcatcodes
+ \expandafter\savecatcodetable\csname @@ccf:\number\catcodetablelevel\endcsname
+ \egroup
+ \expandafter\catcodetable\csname @@ccf:\number\catcodetablelevel\endcsname}
+
+\def\popcatcodes
+ {\global\advance\catcodetablelevel\minusone}
+
+\endinput
+
diff --git a/tex/context/base/catc-sym.tex b/tex/context/base/catc-sym.tex
new file mode 100644
index 000000000..067e192c8
--- /dev/null
+++ b/tex/context/base/catc-sym.tex
@@ -0,0 +1,187 @@
+%D \module
+%D [ file=catc-sym,
+%D version=1997.01.03, % moved code
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Some Handy Constants,
+%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.
+
+% we now have loaded syst-* so we have all @@catcode constants
+
+%D We want to have access to the raw alternatives of the
+%D special characters. We use a \type {\xdef} instead of
+%D \type {\let} because we need an expandable token in a
+%D \type {\write}.
+
+\bgroup
+
+\catcode`B=\begingroupcatcode
+\catcode`E=\endgroupcatcode
+\catcode`.=\escapecatcode
+
+.catcode `.{ 12 .xdef .letteropenbrace B.string{E
+.catcode `.} 12 .xdef .letterclosebrace B.string}E
+.catcode `.& 12 .xdef .letterampersand B.string&E
+.catcode `.< 12 .xdef .letterless B.string<E
+.catcode `.> 12 .xdef .lettermore B.string>E
+.catcode `.# 12 .xdef .letterhash B.string#E
+.catcode `." 12 .xdef .letterdoublequote B.string"E
+.catcode `.' 12 .xdef .lettersinglequote B.string'E
+.catcode `.$ 12 .xdef .letterdollar B.string$E
+.catcode `.% 12 .xdef .letterpercent B.string%E
+.catcode `.^ 12 .xdef .letterhat B.string^E
+.catcode `._ 12 .xdef .letterunderscore B.string_E
+.catcode `.| 12 .xdef .letterbar B.string|E
+.catcode `.~ 12 .xdef .lettertilde B.string~E
+.catcode `.\ 12 .xdef .letterbackslash B.string\E
+.catcode `./ 12 .xdef .letterslash B.string/E
+.catcode `.? 12 .xdef .letterquestionmark B.string?E
+.catcode `.! 12 .xdef .letterexclamationmark B.string!E
+.catcode `.@ 12 .xdef .letterat B.string@E
+.catcode `.: 12 .xdef .lettercolon B.string:E
+
+ .global .let .letterescape .letterbackslash
+ .global .let .letterbgroup .letteropenbrace
+ .global .let .letteregroup .letterclosebrace
+ .global .let .letterleftbrace .letteropenbrace
+ .global .let .letterrightbrace .letterclosebrace
+
+.egroup
+
+%D \macros
+%D {uncatcodespecials,setnaturalcatcodes,setnormalcatcodes,
+%D uncatcodecharacters,uncatcodeallcharacters,
+%D uncatcodespacetokens}
+%D
+%D The following macros are more or less replaced by switching
+%D to a catcode table (which we simulate in \MKII) but we keep
+%D them for convenience and compatibility. Some old engine code
+%D has been removed.
+
+\def\uncatcodespecials {\setcatcodetable\nilcatcodes \uncatcodespacetokens}
+\def\setnaturalcatcodes {\setcatcodetable\nilcatcodes}
+\def\setnormalcatcodes {\setcatcodetable\ctxcatcodes} % maybe \texcatcodes
+\def\uncatcodecharacters {\setcatcodetable\nilcatcodes} % was fast version, gone now
+\def\uncatcodeallcharacters{\setcatcodetable\nilcatcodes} % was slow one, with restore
+
+\def\uncatcodespacetokens
+ {\catcode`\ =\spacecatcode
+ \catcode`\^^L=\ignorecatcode
+ \catcode`\^^M=\endoflinecatcode
+ \catcode`\^^?=\ignorecatcode}
+
+%D \macros
+%D {setverbosecharacter,setverbosecscharacters}
+%D
+%D Next follows a definition that lets some shortcuts expand to
+%D themselves. This macro is meant for \POSTSCRIPT\ and \PDF\
+%D code passed on to the backend.
+
+\newtoks\everyverbosechacters
+
+\def\setverbosecscharacter#1%
+ {\edef#1{\string#1}}
+
+\def\setverbosecscharacters
+ {\the\everyverbosechacters}
+
+\bgroup
+
+ % if used often we can move the code inline
+
+ \catcode`\|=\activecatcode
+ \catcode`\~=\activecatcode
+
+ \global \everyverbosechacters =
+ {\setverbosecscharacter |\setverbosecscharacter ~% context specific
+ \setverbosecscharacter\|\setverbosecscharacter\~%
+ \setverbosecscharacter\:\setverbosecscharacter\;%
+ \setverbosecscharacter\+\setverbosecscharacter\-%
+ \setverbosecscharacter\[\setverbosecscharacter\]%
+ \setverbosecscharacter\.\setverbosecscharacter\\%
+ \setverbosecscharacter\)\setverbosecscharacter\(%
+ \setverbosecscharacter\0\setverbosecscharacter\1%
+ \setverbosecscharacter\2\setverbosecscharacter\3%
+ \setverbosecscharacter\4\setverbosecscharacter\5%
+ \setverbosecscharacter\6\setverbosecscharacter\7%
+ \setverbosecscharacter\8\setverbosecscharacter\9%
+ \setverbosecscharacter\n\setverbosecscharacter\s%
+ \setverbosecscharacter\/}
+
+\egroup
+
+%D (Inspired by a discussion on the \CONTEXT\ mailing list)
+%D
+%D In \TEX\ each character can have one of 16 catcodes. This way the
+%D backslash, dollar, ampersand, hash and some more characters get
+%D their special meaning. If you want to process tokens under a
+%D certain catcode regime, passing arguments can interfere badly.
+%D
+%D \startbuffer[a]
+%D \def\whatever#1{[#1]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \typebuffer[a]
+%D
+%D Here we pass an argument to \type {\whatever} but part of that
+%D argument is to be processed under a different catcode regime, i.e.\
+%D all characters that need to be typeset verbatim need to get
+%D the catcode that makes it a letter. This is what we get when we typeset
+%D the text verbatim:
+%D
+%D \starttyping
+%D whatever \type {\whatever{you want}} $or$ not!
+%D \stoptyping
+%D
+%D However, when passed to \type {\whatever} we get:
+%D
+%D \getbuffer[a]
+%D
+%D In \ETEX\ one can use \type {\scantokens} to circumvent this problem.
+%D
+%D \startbuffer[b]
+%D \def\rescan#1{\scantokens{#1}}
+%D \def\whatever#1{[\rescan{#1}]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \getbuffer[b] \typebuffer[b]
+%D
+%D This time the \type {\whatever} call gives:
+%D
+%D \getbuffer[b]
+%D
+%D In this example, two spaces have crept in. The first one, after the
+%D macro name, is inserted by \TEX\ and cannot be avoided. The last space
+%D is inserted by \type {\scantokens}, and is the consequence of the fact
+%D that this macro mimics reading from a file. You can avoid the last
+%D space by a slightly different definition:
+%D
+%D \startbuffer[c]
+%D \def\rescan#1{\scantokens{#1\ignorespaces}}
+%D \def\whatever#1{[\rescan{#1}]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \typebuffer[c]
+%D
+%D Unfortunately we still keep the first space, but at least it's better than
+%D a failure:
+%D
+%D \getbuffer[c]
+
+\long\def\rescan#1{\scantokens{#1\ignorespaces}}
+\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup}
+
+\ifx\scantextokens\undefined \else
+ \long\def\rescan#1{\scantextokens{#1}}
+ \long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup}
+\fi
+
+\endinput
diff --git a/tex/context/base/char-act.mkiv b/tex/context/base/char-act.mkiv
new file mode 100644
index 000000000..2dc7823f0
--- /dev/null
+++ b/tex/context/base/char-act.mkiv
@@ -0,0 +1,138 @@
+%D \module
+%D [ file=char-act,
+%D version=2006.12.05,
+%D title=\CONTEXT\ Character Support,
+%D subtitle=Active,
+%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}{ConTeXt Character Support / Active}
+
+\unprotect
+
+%D \macros
+%D {processingverbatim}
+%D
+%D Typesetting a file in most cases results in more than one
+%D page. Because we don't want problems with files that are
+%D read in during the construction of the page, we set \type
+%D {\ifprocessingverbatim}, so the output routine can adapt
+%D its behavior. Originally we used \type {\scratchread}, but
+%D because we want to support nesting, we decided to use a
+%D separate input file.
+
+\newif\ifprocessingverbatim
+
+%D \macros
+%D {obeyedspace, obeyedtab, obeyedline, obeyedpage}
+%D
+%D We have followed Knuth in naming macros that make \SPACE,
+%D \NEWLINE\ and \NEWPAGE\ active and assigning them
+%D \type{\obeysomething}, but first we set some default values.
+
+\def\obeyedspace {\ifprocessingverbatim\hbox{ }\else\space\fi}
+\def\obeyedtab {\obeyedspace}
+\def\obeyedline {\par}
+\def\obeyedpage {\vfill\eject}
+
+%D \macros
+%D {controlspace,setcontrolspaces}
+%D
+%D First we define \type{\obeyspaces}. When we want visible
+%D spaces (control spaces) we only have to adapt the definition
+%D of \type{\obeyedspace} to:
+
+\def\controlspace{\hbox{\char32}} % rather tex
+\def\normalspace { }
+\def\normalspaces{\catcode`\ =\@@space}
+
+\bgroup
+\catcode`\ =\@@active
+\gdef\obeyspaces{\catcode`\ =\@@active\def {\obeyedspace}}
+\gdef\setcontrolspaces{\catcode`\ =\@@active\def {\controlspace}}
+\egroup
+
+%D \macros
+%D {obeytabs, obeylines, obeypages,ignoretabs, ignorelines, ignorepages}
+%D
+%D Next we take care of \NEWLINE\ and \NEWPAGE\ and because we
+%D want to be able to typeset listings that contain \TAB, we
+%D have to handle those too. Because we have to redefine the
+%D \NEWPAGE\ character locally, we redefine the meaning of
+%D this (often already) active character.
+
+\catcode`\^^L=\@@active \def^^L{\par}
+
+%D The following indirect definitions enable us to implement
+%D all kind of \type{\obeyed} handlers.
+
+\bgroup
+
+\catcode`\^^I=\@@active
+\catcode`\^^M=\@@active
+\catcode`\^^L=\@@active
+
+\gdef\obeytabs {\catcode`\^^I=\@@active\def^^I{\obeyedtab}}
+\gdef\obeylines {\catcode`\^^M=\@@active\def^^M{\obeyedline}}
+\gdef\obeypages {\catcode`\^^L=\@@active\def^^L{\obeyedpage}}
+
+\gdef\ignoretabs {\catcode`\^^I=\@@active\def^^I{\obeyedspace}}
+\gdef\ignorelines {\catcode`\^^M=\@@active\def^^M{\obeyedspace}}
+\gdef\ignorepages {\catcode`\^^L=\@@ignore} % \@@active\def^^L{\obeyedline}}
+\gdef\ignoreeofs {\catcode`\^^Z=\@@ignore}
+
+\egroup
+
+%D \macros
+%D {naturaltextext}
+%D
+%D When one uses \ETEX, switching to normal \TEX\ is possible
+%D too. We also introduce a switch that can be used in the
+%D drivers and set in higher level shell macros.
+
+\def\naturaltextext#1\relax
+ {\bgroup
+ \def\ascii{#1}%
+ \setcatcodetable\ctxcatcodes
+ \prettynaturalfont{\scantextokens\expandafter{\ascii}\ifhmode\unskip\fi}%
+ \egroup}
+
+%D What-a-mess:
+
+% \def\normalspacecodes
+% {\catcode`\^^I = 10
+% \catcode`\^^M = 5
+% \catcode`\^^L = 5
+% \catcode`\ = 10
+% \catcode`\^^Z = 9 }
+
+% \appendtoks
+% \normalspacecodes
+% \to \everybeforeoutput
+
+\endinput \protect
+
+% obsolete (old hack for idris)
+
+%D This is a hack, and only meant for special situations. We don't
+%D support this in for instance verbatim. The active characters map
+%D onto the \CONTEXT\ names and font handling etc. is up to the user.
+
+%D This feature is obsolete.
+
+\registerctxluafile{char-act}{1.001}
+
+\def\enableactiveutf {\ctxlua{characters.active.enable()}}
+\def\disableactiveutf{\ctxlua{characters.active.disable()}}
+\def\testactiveutf #1{\ctxlua{characters.active.test("#1")}}
+
+%D Usage:
+%D
+%D \starttyping
+%D \enableactiveutf \testactiveutf{eacute}
+%D \stoptyping
diff --git a/tex/context/base/char-cmp.lua b/tex/context/base/char-cmp.lua
new file mode 100644
index 000000000..c7deb7901
--- /dev/null
+++ b/tex/context/base/char-cmp.lua
@@ -0,0 +1,268 @@
+if not modules then modules = { } end modules ['char-cmp'] = {
+ version = 1.001,
+ comment = "companion to char-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local unpack = unpack or table.unpack
+
+characters = characters or { }
+characters.uncomposed = characters.uncomposed or { }
+
+--[[ldx--
+<p>The code defined here may move to the big character table.</p>
+--ldx]]--
+
+characters.basedigits = {
+ ['zero'] = 48, ['one'] = 49,
+ ['two'] = 50, ['three'] = 51,
+ ['four'] = 52, ['five'] = 53,
+ ['six'] = 54, ['seven'] = 55,
+ ['eight'] = 56, ['nine'] = 57
+}
+
+--[[ldx--
+<p>The next three tables can for instance be be used to enhance
+kerning tables that lack kerning pairs for these special characters.
+Of course they may come in handy elsewhere too</p>
+--ldx]]--
+
+-- we can use shcodes, but then we also need slcode and srcode
+--
+-- AEligature
+-- => slcode == ub('A')
+-- => srcode == ub('E')
+-- or
+-- => shcode == { ub('A'), ub('E') }
+-- => reduction = "AE"
+--
+-- eacute
+-- => shcode == ub('A')
+-- or
+-- => shcode == { ub('a') }
+-- => reduction = "a"
+
+characters.uncomposed.left = {
+ AEligature = "A", aeligature = "a",
+ OEligature = "O", oeligature = "o",
+ IJligature = "I", ijligature = "i",
+ AE = "A", ae = "a",
+ OE = "O", oe = "o",
+ IJ = "I", ij = "i",
+ Ssharp = "S", ssharp = "s",
+}
+
+characters.uncomposed.right = {
+ AEligature = "E", aeligature = "e",
+ OEligature = "E", oeligature = "e",
+ IJligature = "J", ijligature = "j",
+ AE = "E", ae = "e",
+ OE = "E", oe = "e",
+ IJ = "J", ij = "j",
+ Ssharp = "S", ssharp = "s",
+}
+
+characters.uncomposed.both = {
+ Acircumflex = "A", acircumflex = "a",
+ Ccircumflex = "C", ccircumflex = "c",
+ Ecircumflex = "E", ecircumflex = "e",
+ Gcircumflex = "G", gcircumflex = "g",
+ Hcircumflex = "H", hcircumflex = "h",
+ Icircumflex = "I", icircumflex = "i",
+ Jcircumflex = "J", jcircumflex = "j",
+ Ocircumflex = "O", ocircumflex = "o",
+ Scircumflex = "S", scircumflex = "s",
+ Ucircumflex = "U", ucircumflex = "u",
+ Wcircumflex = "W", wcircumflex = "w",
+ Ycircumflex = "Y", ycircumflex = "y",
+
+ Agrave = "A", agrave = "a",
+ Egrave = "E", egrave = "e",
+ Igrave = "I", igrave = "i",
+ Ograve = "O", ograve = "o",
+ Ugrave = "U", ugrave = "u",
+ Ygrave = "Y", ygrave = "y",
+
+ Atilde = "A", atilde = "a",
+ Itilde = "I", itilde = "i",
+ Otilde = "O", otilde = "o",
+ Utilde = "U", utilde = "u",
+ Ntilde = "N", ntilde = "n",
+
+ Adiaeresis = "A", adiaeresis = "a", Adieresis = "A", adieresis = "a",
+ Ediaeresis = "E", ediaeresis = "e", Edieresis = "E", edieresis = "e",
+ Idiaeresis = "I", idiaeresis = "i", Idieresis = "I", idieresis = "i",
+ Odiaeresis = "O", odiaeresis = "o", Odieresis = "O", odieresis = "o",
+ Udiaeresis = "U", udiaeresis = "u", Udieresis = "U", udieresis = "u",
+ Ydiaeresis = "Y", ydiaeresis = "y", Ydieresis = "Y", ydieresis = "y",
+
+ Aacute = "A", aacute = "a",
+ Cacute = "C", cacute = "c",
+ Eacute = "E", eacute = "e",
+ Iacute = "I", iacute = "i",
+ Lacute = "L", lacute = "l",
+ Nacute = "N", nacute = "n",
+ Oacute = "O", oacute = "o",
+ Racute = "R", racute = "r",
+ Sacute = "S", sacute = "s",
+ Uacute = "U", uacute = "u",
+ Yacute = "Y", yacute = "y",
+ Zacute = "Z", zacute = "z",
+
+ Dstroke = "D", dstroke = "d",
+ Hstroke = "H", hstroke = "h",
+ Tstroke = "T", tstroke = "t",
+
+ Cdotaccent = "C", cdotaccent = "c",
+ Edotaccent = "E", edotaccent = "e",
+ Gdotaccent = "G", gdotaccent = "g",
+ Idotaccent = "I", idotaccent = "i",
+ Zdotaccent = "Z", zdotaccent = "z",
+
+ Amacron = "A", amacron = "a",
+ Emacron = "E", emacron = "e",
+ Imacron = "I", imacron = "i",
+ Omacron = "O", omacron = "o",
+ Umacron = "U", umacron = "u",
+
+ Ccedilla = "C", ccedilla = "c",
+ Kcedilla = "K", kcedilla = "k",
+ Lcedilla = "L", lcedilla = "l",
+ Ncedilla = "N", ncedilla = "n",
+ Rcedilla = "R", rcedilla = "r",
+ Scedilla = "S", scedilla = "s",
+ Tcedilla = "T", tcedilla = "t",
+
+ Ohungarumlaut = "O", ohungarumlaut = "o",
+ Uhungarumlaut = "U", uhungarumlaut = "u",
+
+ Aogonek = "A", aogonek = "a",
+ Eogonek = "E", eogonek = "e",
+ Iogonek = "I", iogonek = "i",
+ Uogonek = "U", uogonek = "u",
+
+ Aring = "A", aring = "a",
+ Uring = "U", uring = "u",
+
+ Abreve = "A", abreve = "a",
+ Ebreve = "E", ebreve = "e",
+ Gbreve = "G", gbreve = "g",
+ Ibreve = "I", ibreve = "i",
+ Obreve = "O", obreve = "o",
+ Ubreve = "U", ubreve = "u",
+
+ Ccaron = "C", ccaron = "c",
+ Dcaron = "D", dcaron = "d",
+ Ecaron = "E", ecaron = "e",
+ Lcaron = "L", lcaron = "l",
+ Ncaron = "N", ncaron = "n",
+ Rcaron = "R", rcaron = "r",
+ Scaron = "S", scaron = "s",
+ Tcaron = "T", tcaron = "t",
+ Zcaron = "Z", zcaron = "z",
+
+ dotlessI = "I", dotlessi = "i",
+ dotlessJ = "J", dotlessj = "j",
+
+ AEligature = "AE", aeligature = "ae", AE = "AE", ae = "ae",
+ OEligature = "OE", oeligature = "oe", OE = "OE", oe = "oe",
+ IJligature = "IJ", ijligature = "ij", IJ = "IJ", ij = "ij",
+
+ Lstroke = "L", lstroke = "l", Lslash = "L", lslash = "l",
+ Ostroke = "O", ostroke = "o", Oslash = "O", oslash = "o",
+
+ Ssharp = "SS", ssharp = "ss",
+
+ Aumlaut = "A", aumlaut = "a",
+ Eumlaut = "E", eumlaut = "e",
+ Iumlaut = "I", iumlaut = "i",
+ Oumlaut = "O", oumlaut = "o",
+ Uumlaut = "U", uumlaut = "u",
+
+}
+
+--[[ldx--
+<p>The following function is used in the indexing code, where
+we need some sort of default fallback mapping.</p>
+--ldx]]--
+
+function characters.uncompose(n) -- n == string|number, returns string
+ local cdn
+ if type(n) == "string" then
+ cdn = characters.data[utf.byte(n)]
+ else
+ cdn = characters.data[n]
+ end
+ -- return characters.shape(n)
+ if cdn then
+ local shcode = cdn.shcode
+ if not shcode then
+ return characters.uncomposed.both[cdn.contextname] or n
+ elseif type(shcode) == "table" then
+ return utf.char(unpack(cdn.shcode))
+ else
+ return utf.char(cdn.shcode)
+ end
+ end
+ return n
+end
+
+--[[ldx--
+<p>Only characters with a code smaller than 128 make sense,
+anything larger is encoding dependent. An interesting complication
+is that a character can be in an encoding twice but is hashed
+once.</p>
+--ldx]]--
+
+characters.ligatures = {
+ ['f'] = {
+ { 'f', 'ff' },
+ { 'i', 'fi' },
+ { 'l', 'fl' },
+ },
+ ['ff'] = {
+ { 'i', 'ffi' }
+ },
+ ['fi'] = {
+ { 'i', 'fii' }
+ },
+ ['fl'] = {
+ { 'i', 'fli' }
+ },
+ ['s'] = {
+ { 't', 'st' }
+ },
+ ['i'] = {
+ { 'j', 'ij' }
+ },
+}
+
+characters.texligatures = {
+ -- ['space'] = {
+ -- { 'L', 'Lslash' },
+ -- { 'l', 'lslash' }
+ -- },
+ -- ['question'] = {
+ -- { 'quoteleft', 'questiondown' }
+ -- },
+ -- ['exclam'] = {
+ -- { 'quoteleft', 'exclamdown' }
+ -- },
+ ['quoteleft'] = {
+ { 'quoteleft', 'quotedblleft' }
+ },
+ ['quoteright'] = {
+ { 'quoteright', 'quotedblright' }
+ },
+ ['hyphen'] = {
+ { 'hyphen', 'endash' }
+ },
+ ['endash'] = {
+ { 'hyphen', 'emdash' }
+ }
+}
+
+--~ U+2019: right single quotation mark / quoteright
diff --git a/tex/context/base/char-def.lua b/tex/context/base/char-def.lua
new file mode 100644
index 000000000..b7abee0fb
--- /dev/null
+++ b/tex/context/base/char-def.lua
@@ -0,0 +1,141127 @@
+if not modules then modules = { } end modules ['char-def'] = {
+ version = 1.001,
+ comment = "companion to char-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[
+The first version of this table was generated from unicode tables
+but after that was mostly updated manual using data present in
+ConTeXt and elsewhere. I did my best to make this table as complete
+as needed for proper use in ConTeXt MkIV. All errors are mine. If
+you find an error or ommision, just let me know.
+]]--
+
+characters = characters or { }
+
+characters.data={
+ [0x0000]={
+ category="cc",
+ description="NULL",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0000,
+ },
+ {
+ category="cc",
+ description="START OF HEADING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0001,
+ },
+ {
+ category="cc",
+ description="START OF TEXT",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0002,
+ },
+ {
+ category="cc",
+ description="END OF TEXT",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0003,
+ },
+ {
+ category="cc",
+ description="END OF TRANSMISSION",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0004,
+ },
+ {
+ category="cc",
+ description="ENQUIRY",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0005,
+ },
+ {
+ category="cc",
+ description="ACKNOWLEDGE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0006,
+ },
+ {
+ category="cc",
+ description="BELL",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0007,
+ },
+ {
+ category="cc",
+ description="BACKSPACE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0008,
+ },
+ {
+ category="cc",
+ description="CHARACTER TABULATION",
+ direction="s",
+ linebreak="ba",
+ unicodeslot=0x0009,
+ },
+ {
+ category="cc",
+ description="LINE FEED (LF)",
+ direction="b",
+ linebreak="lf",
+ unicodeslot=0x000A,
+ },
+ {
+ category="cc",
+ description="LINE TABULATION",
+ direction="s",
+ linebreak="bk",
+ unicodeslot=0x000B,
+ },
+ {
+ category="cc",
+ description="FORM FEED (FF)",
+ direction="ws",
+ linebreak="bk",
+ unicodeslot=0x000C,
+ },
+ {
+ category="cc",
+ description="CARRIAGE RETURN (CR)",
+ direction="b",
+ linebreak="cr",
+ unicodeslot=0x000D,
+ },
+ {
+ category="cc",
+ description="SHIFT OUT",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x000E,
+ },
+ {
+ category="cc",
+ description="SHIFT IN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x000F,
+ },
+ {
+ category="cc",
+ description="DATA LINK ESCAPE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0010,
+ },
+ {
+ category="cc",
+ description="DEVICE CONTROL ONE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0011,
+ },
+ {
+ category="cc",
+ description="DEVICE CONTROL TWO",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0012,
+ },
+ {
+ category="cc",
+ description="DEVICE CONTROL THREE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0013,
+ },
+ {
+ category="cc",
+ description="DEVICE CONTROL FOUR",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0014,
+ },
+ {
+ category="cc",
+ description="NEGATIVE ACKNOWLEDGE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0015,
+ },
+ {
+ category="cc",
+ description="SYNCHRONOUS IDLE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0016,
+ },
+ {
+ category="cc",
+ description="END OF TRANSMISSION BLOCK",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0017,
+ },
+ {
+ category="cc",
+ description="CANCEL",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0018,
+ },
+ {
+ category="cc",
+ description="END OF MEDIUM",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0019,
+ },
+ {
+ category="cc",
+ description="SUBSTITUTE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x001A,
+ },
+ {
+ category="cc",
+ description="ESCAPE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x001B,
+ },
+ {
+ category="cc",
+ description="INFORMATION SEPARATOR FOUR",
+ direction="b",
+ linebreak="cm",
+ unicodeslot=0x001C,
+ },
+ {
+ category="cc",
+ description="INFORMATION SEPARATOR THREE",
+ direction="b",
+ linebreak="cm",
+ unicodeslot=0x001D,
+ },
+ {
+ category="cc",
+ description="INFORMATION SEPARATOR TWO",
+ direction="b",
+ linebreak="cm",
+ unicodeslot=0x001E,
+ },
+ {
+ category="cc",
+ description="INFORMATION SEPARATOR ONE",
+ direction="s",
+ linebreak="cm",
+ unicodeslot=0x001F,
+ },
+ {
+ adobename="space",
+ category="zs",
+ cjkwd="na",
+ description="SPACE",
+ direction="ws",
+ linebreak="sp",
+ unicodeslot=0x0020,
+ },
+ {
+ adobename="exclam",
+ category="po",
+ cjkwd="na",
+ description="EXCLAMATION MARK",
+ direction="on",
+ linebreak="ex",
+ mathclass="close",
+ unicodeslot=0x0021,
+ },
+ {
+ adobename="quotedbl",
+ category="po",
+ cjkwd="na",
+ contextname="quotedbl",
+ description="QUOTATION MARK",
+ direction="on",
+ mathclass="default",
+ linebreak="qu",
+ unicodeslot=0x0022,
+ },
+ {
+ adobename="numbersign",
+ category="po",
+ cjkwd="na",
+ description="NUMBER SIGN",
+ direction="et",
+ linebreak="al",
+ unicodeslot=0x0023,
+ },
+ {
+ adobename="dollar",
+ category="sc",
+ cjkwd="na",
+ contextname="textdollar",
+ description="DOLLAR SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x0024,
+ },
+ {
+ adobename="percent",
+ category="po",
+ cjkwd="na",
+ contextname="percent",
+ description="PERCENT SIGN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x0025,
+ },
+ {
+ adobename="ampersand",
+ category="po",
+ cjkwd="na",
+ description="AMPERSAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0026,
+ },
+ {
+ adobename="quotesingle",
+ category="po",
+ cjkwd="na",
+ contextname="quotesingle",
+ description="APOSTROPHE",
+ direction="on",
+ linebreak="qu",
+ mathclass="default",
+ unicodeslot=0x0027,
+ },
+ {
+ adobename="parenleft",
+ category="ps",
+ cjkwd="na",
+ description="LEFT PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mathclass="open",
+ mathname="lparent",
+ mirror=0x0029,
+ unicodeslot=0x0028,
+ },
+ {
+ adobename="parenright",
+ category="pe",
+ cjkwd="na",
+ description="RIGHT PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mathclass="close",
+ mathname="rparent",
+ mirror=0x0028,
+ unicodeslot=0x0029,
+ },
+ {
+ adobename="asterisk",
+ category="po",
+ cjkwd="na",
+ description="ASTERISK",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="ast",
+ unicodeslot=0x002A,
+ },
+ {
+ adobename="plus",
+ category="sm",
+ cjkwd="na",
+ description="PLUS SIGN",
+ direction="es",
+ linebreak="pr",
+ mathclass="binary",
+ unicodeslot=0x002B,
+ },
+ {
+ adobename="comma",
+ category="po",
+ cjkwd="na",
+ description="COMMA",
+ direction="cs",
+ linebreak="is",
+ mathclass="punctuation",
+ mathspec={
+ { class="punctuation", name="textcomma" },
+ { class="ord", name="mathcomma" },
+ },
+ unicodeslot=0x002C,
+ },
+ {
+ adobename="hyphen",
+ category="pd",
+ cjkwd="na",
+ description="HYPHEN-MINUS",
+ direction="es",
+ linebreak="hy",
+ mathsymbol=0x2212,
+ unicodeslot=0x002D,
+ },
+ {
+ adobename="period",
+ category="po",
+ cjkwd="na",
+ description="FULL STOP",
+ direction="cs",
+ linebreak="is",
+ mathclass="ord",
+ mathspec={
+ { class="ord", name="mathperiod" },
+ { class="punctuation", name="textperiod" },
+ { class="punctuation", name="ldotp" },
+ },
+ unicodeslot=0x002E,
+ },
+ {
+ adobename="slash",
+ category="po",
+ cjkwd="na",
+ contextname="textslash",
+ description="SOLIDUS",
+ direction="cs",
+ linebreak="sy",
+ mathsymbol=0x2044,
+ unicodeslot=0x002F,
+ },
+ {
+ adobename="zero",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT ZERO",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0030,
+ },
+ {
+ adobename="one",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT ONE",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0031,
+ },
+ {
+ adobename="two",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT TWO",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0032,
+ },
+ {
+ adobename="three",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT THREE",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0033,
+ },
+ {
+ adobename="four",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT FOUR",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0034,
+ },
+ {
+ adobename="five",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT FIVE",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0035,
+ },
+ {
+ adobename="six",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT SIX",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0036,
+ },
+ {
+ adobename="seven",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT SEVEN",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0037,
+ },
+ {
+ adobename="eight",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT EIGHT",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0038,
+ },
+ {
+ adobename="nine",
+ category="nd",
+ cjkwd="na",
+ description="DIGIT NINE",
+ direction="en",
+ linebreak="nu",
+ mathclass="number",
+ unicodeslot=0x0039,
+ },
+ {
+ adobename="colon",
+ category="po",
+ cjkwd="na",
+ description="COLON",
+ direction="cs",
+ linebreak="is",
+--~ mathclass="punctuation",
+ mathclass="relation",
+-- mathname="colon",
+ unicodeslot=0x003A,
+ },
+ {
+ adobename="semicolon",
+ category="po",
+ cjkwd="na",
+ description="SEMICOLON",
+ direction="on",
+ linebreak="is",
+ mathclass="punctuation",
+ unicodeslot=0x003B,
+ },
+ {
+ adobename="less",
+ category="sm",
+ cjkwd="na",
+ description="LESS-THAN SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="lt",
+ mirror=0x003E,
+ unicodeslot=0x003C,
+ },
+ {
+ adobename="equal",
+ category="sm",
+ cjkwd="na",
+ description="EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+--~ mathclass="binary",
+ mathclass="relation",
+ mathname="eq",
+ unicodeslot=0x003D,
+ },
+ {
+ adobename="greater",
+ category="sm",
+ cjkwd="na",
+ description="GREATER-THAN SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="gt",
+ mirror=0x003C,
+ unicodeslot=0x003E,
+ },
+ {
+ adobename="question",
+ category="po",
+ cjkwd="na",
+ description="QUESTION MARK",
+ direction="on",
+ linebreak="ex",
+ mathclass="close",
+ unicodeslot=0x003F,
+ },
+ {
+ adobename="at",
+ category="po",
+ cjkwd="na",
+ contextname="textat",
+ description="COMMERCIAL AT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0040,
+ },
+ {
+ adobename="A",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER A",
+ direction="l",
+ lccode=0x0061,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0041,
+ },
+ {
+ adobename="B",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER B",
+ direction="l",
+ lccode=0x0062,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0042,
+ },
+ {
+ adobename="C",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER C",
+ direction="l",
+ lccode=0x0063,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0043,
+ },
+ {
+ adobename="D",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER D",
+ direction="l",
+ lccode=0x0064,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0044,
+ },
+ {
+ adobename="E",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER E",
+ direction="l",
+ lccode=0x0065,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0045,
+ },
+ {
+ adobename="F",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER F",
+ direction="l",
+ lccode=0x0066,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0046,
+ },
+ {
+ adobename="G",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER G",
+ direction="l",
+ lccode=0x0067,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0047,
+ },
+ {
+ adobename="H",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER H",
+ direction="l",
+ lccode=0x0068,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0048,
+ },
+ {
+ adobename="I",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER I",
+ direction="l",
+ lccode=0x0069,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0049,
+ },
+ {
+ adobename="J",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER J",
+ direction="l",
+ lccode=0x006A,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x004A,
+ },
+ {
+ adobename="K",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER K",
+ direction="l",
+ lccode=0x006B,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x004B,
+ },
+ {
+ adobename="L",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER L",
+ direction="l",
+ lccode=0x006C,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x004C,
+ },
+ {
+ adobename="M",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER M",
+ direction="l",
+ lccode=0x006D,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x004D,
+ },
+ {
+ adobename="N",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER N",
+ direction="l",
+ lccode=0x006E,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x004E,
+ },
+ {
+ adobename="O",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER O",
+ direction="l",
+ lccode=0x006F,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x004F,
+ },
+ {
+ adobename="P",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER P",
+ direction="l",
+ lccode=0x0070,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0050,
+ },
+ {
+ adobename="Q",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER Q",
+ direction="l",
+ lccode=0x0071,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0051,
+ },
+ {
+ adobename="R",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER R",
+ direction="l",
+ lccode=0x0072,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0052,
+ },
+ {
+ adobename="S",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER S",
+ direction="l",
+ lccode=0x0073,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0053,
+ },
+ {
+ adobename="T",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER T",
+ direction="l",
+ lccode=0x0074,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0054,
+ },
+ {
+ adobename="U",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER U",
+ direction="l",
+ lccode=0x0075,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0055,
+ },
+ {
+ adobename="V",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER V",
+ direction="l",
+ lccode=0x0076,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0056,
+ },
+ {
+ adobename="W",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER W",
+ direction="l",
+ lccode=0x0077,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0057,
+ },
+ {
+ adobename="X",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER X",
+ direction="l",
+ lccode=0x0078,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0058,
+ },
+ {
+ adobename="Y",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER Y",
+ direction="l",
+ lccode=0x0079,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x0059,
+ },
+ {
+ adobename="Z",
+ category="lu",
+ cjkwd="na",
+ description="LATIN CAPITAL LETTER Z",
+ direction="l",
+ lccode=0x007A,
+ linebreak="al",
+ mathclass="variable",
+ unicodeslot=0x005A,
+ },
+ {
+ adobename="bracketleft",
+ category="ps",
+ cjkwd="na",
+ description="LEFT SQUARE BRACKET",
+ direction="on",
+ linebreak="op",
+ mathclass="open",
+ mathname="lbrack",
+ mirror=0x005D,
+ unicodeslot=0x005B,
+ },
+ {
+ adobename="backslash",
+ category="po",
+ cjkwd="na",
+ contextname="textbackslash",
+ description="REVERSE SOLIDUS",
+ direction="on",
+ linebreak="pr",
+ mathclass="nothing",
+ mathname="backslash",
+ unicodeslot=0x005C,
+ },
+ {
+ adobename="bracketright",
+ category="pe",
+ cjkwd="na",
+ description="RIGHT SQUARE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mathclass="close",
+ mathname="rbrack",
+ mirror=0x005B,
+ unicodeslot=0x005D,
+ },
+ {
+ adobename="asciicircum",
+ category="sk",
+ cjkwd="na",
+ contextname="textasciicircum",
+ description="CIRCUMFLEX ACCENT",
+ direction="on",
+ linebreak="al",
+ mathclass="accent",
+ unicodeslot=0x005E,
+ },
+ {
+ adobename="underscore",
+ category="pc",
+ cjkwd="na",
+ contextname="textunderscore",
+ description="LOW LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x005F,
+ },
+ {
+ adobename="grave",
+ category="sk",
+ cjkwd="na",
+ contextname="textgrave",
+ description="GRAVE ACCENT",
+ mathclass="accent",
+ mathname="grave",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0060,
+ },
+ {
+ adobename="a",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER A",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0041,
+ unicodeslot=0x0061,
+ },
+ {
+ adobename="b",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER B",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0042,
+ unicodeslot=0x0062,
+ },
+ {
+ adobename="c",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER C",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0043,
+ unicodeslot=0x0063,
+ },
+ {
+ adobename="d",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER D",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0044,
+ unicodeslot=0x0064,
+ },
+ {
+ adobename="e",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER E",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0045,
+ unicodeslot=0x0065,
+ },
+ {
+ adobename="f",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER F",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0046,
+ unicodeslot=0x0066,
+ },
+ {
+ adobename="g",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER G",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0047,
+ unicodeslot=0x0067,
+ },
+ {
+ adobename="h",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER H",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0048,
+ unicodeslot=0x0068,
+ },
+ {
+ adobename="i",
+ category="ll",
+ cjkwd="na",
+ contextname="idotaccent",
+ description="LATIN SMALL LETTER I",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0049,
+ unicodeslot=0x0069,
+ },
+ {
+ adobename="j",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER J",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x004A,
+ unicodeslot=0x006A,
+ },
+ {
+ adobename="k",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER K",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x004B,
+ unicodeslot=0x006B,
+ },
+ {
+ adobename="l",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER L",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x004C,
+ unicodeslot=0x006C,
+ },
+ {
+ adobename="m",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER M",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x004D,
+ unicodeslot=0x006D,
+ },
+ {
+ adobename="n",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER N",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x004E,
+ unicodeslot=0x006E,
+ },
+ {
+ adobename="o",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER O",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x004F,
+ unicodeslot=0x006F,
+ },
+ {
+ adobename="p",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER P",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0050,
+ unicodeslot=0x0070,
+ },
+ {
+ adobename="q",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER Q",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0051,
+ unicodeslot=0x0071,
+ },
+ {
+ adobename="r",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER R",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0052,
+ unicodeslot=0x0072,
+ },
+ {
+ adobename="s",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER S",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0053,
+ unicodeslot=0x0073,
+ },
+ {
+ adobename="t",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER T",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0054,
+ unicodeslot=0x0074,
+ },
+ {
+ adobename="u",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER U",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0055,
+ unicodeslot=0x0075,
+ },
+ {
+ adobename="v",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER V",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0056,
+ unicodeslot=0x0076,
+ },
+ {
+ adobename="w",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER W",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0057,
+ unicodeslot=0x0077,
+ },
+ {
+ adobename="x",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER X",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0058,
+ unicodeslot=0x0078,
+ },
+ {
+ adobename="y",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER Y",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x0059,
+ unicodeslot=0x0079,
+ },
+ {
+ adobename="z",
+ category="ll",
+ cjkwd="na",
+ description="LATIN SMALL LETTER Z",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ uccode=0x005A,
+ unicodeslot=0x007A,
+ },
+ {
+ adobename="braceleft",
+ category="ps",
+ cjkwd="na",
+ contextname="textbraceleft",
+ description="LEFT CURLY BRACKET",
+ direction="on",
+ linebreak="op",
+ mathclass="open",
+ mathname="lbrace", -- was false
+ mirror=0x007D,
+ unicodeslot=0x007B,
+ },
+ {
+ adobename="bar",
+ category="sm",
+ cjkwd="na",
+ contextname="textbar",
+ description="VERTICAL LINE",
+ direction="on",
+ linebreak="ba",
+ mathspec={
+-- { class="binary", name="bar" },
+ { class="nothing", name="arrowvert" },
+ { class="delimiter", name="vert" },
+ { class="open", name="lvert" },
+ { class="close", name="rvert" },
+ { class="relation", name="mid" },
+ },
+ unicodeslot=0x007C,
+ },
+ {
+ adobename="braceright",
+ category="pe",
+ cjkwd="na",
+ contextname="textbraceright",
+ description="RIGHT CURLY BRACKET",
+ direction="on",
+ linebreak="cl",
+ mathclass="close",
+ mathname="rbrace", -- was false
+ mirror=0x007B,
+ unicodeslot=0x007D,
+ },
+ {
+ adobename="asciitilde",
+ category="sm",
+ cjkwd="na",
+ contextname="textasciitilde",
+ description="TILDE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x007E,
+ },
+ {
+ category="cc",
+ description="DELETE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x007F,
+ },
+ {
+ category="cc",
+ description="NONE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0080,
+ },
+ {
+ category="cc",
+ description="NONE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0081,
+ },
+ {
+ category="cc",
+ description="BREAK PERMITTED HERE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0082,
+ },
+ {
+ category="cc",
+ description="NO BREAK HERE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0083,
+ },
+ {
+ category="cc",
+ description="NONE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0084,
+ },
+ {
+ category="cc",
+ description="NEXT LINE (NEL)",
+ direction="b",
+ linebreak="nl",
+ unicodeslot=0x0085,
+ },
+ {
+ category="cc",
+ description="START OF SELECTED AREA",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0086,
+ },
+ {
+ category="cc",
+ description="END OF SELECTED AREA",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0087,
+ },
+ {
+ category="cc",
+ description="CHARACTER TABULATION SET",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0088,
+ },
+ {
+ category="cc",
+ description="CHARACTER TABULATION WITH JUSTIFICATION",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0089,
+ },
+ {
+ category="cc",
+ description="LINE TABULATION SET",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x008A,
+ },
+ {
+ category="cc",
+ description="PARTIAL LINE FORWARD",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x008B,
+ },
+ {
+ category="cc",
+ description="PARTIAL LINE BACKWARD",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x008C,
+ },
+ {
+ category="cc",
+ description="REVERSE LINE FEED",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x008D,
+ },
+ {
+ category="cc",
+ description="SINGLE SHIFT TWO",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x008E,
+ },
+ {
+ category="cc",
+ description="SINGLE SHIFT THREE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x008F,
+ },
+ {
+ category="cc",
+ description="DEVICE CONTROL STRING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0090,
+ },
+ {
+ category="cc",
+ description="PRIVATE USE ONE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0091,
+ },
+ {
+ category="cc",
+ description="PRIVATE USE TWO",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0092,
+ },
+ {
+ category="cc",
+ description="SET TRANSMIT STATE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0093,
+ },
+ {
+ category="cc",
+ description="CANCEL CHARACTER",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0094,
+ },
+ {
+ category="cc",
+ description="MESSAGE WAITING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0095,
+ },
+ {
+ category="cc",
+ description="START OF GUARDED AREA",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0096,
+ },
+ {
+ category="cc",
+ description="END OF GUARDED AREA",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0097,
+ },
+ {
+ category="cc",
+ description="START OF STRING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0098,
+ },
+ {
+ category="cc",
+ description="NONE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x0099,
+ },
+ {
+ category="cc",
+ description="SINGLE CHARACTER INTRODUCER",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x009A,
+ },
+ {
+ category="cc",
+ description="CONTROL SEQUENCE INTRODUCER",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x009B,
+ },
+ {
+ category="cc",
+ description="STRING TERMINATOR",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x009C,
+ },
+ {
+ category="cc",
+ description="OPERATING SYSTEM COMMAND",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x009D,
+ },
+ {
+ category="cc",
+ description="PRIVACY MESSAGE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x009E,
+ },
+ {
+ category="cc",
+ description="APPLICATION PROGRAM COMMAND",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x009F,
+ },
+ {
+ category="zs",
+ contextname="nobreakspace",
+ description="NO-BREAK SPACE",
+ direction="cs",
+ linebreak="gl",
+ specials={ "nobreak", 0x0020 },
+ unicodeslot=0x00A0,
+ },
+ {
+ adobename="exclamdown",
+ category="po",
+ cjkwd="a",
+ contextname="exclamdown",
+ description="INVERTED EXCLAMATION MARK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x00A1,
+ },
+ {
+ adobename="cent",
+ category="sc",
+ cjkwd="na",
+ contextname="textcent",
+ description="CENT SIGN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x00A2,
+ },
+ {
+ adobename="sterling",
+ category="sc",
+ cjkwd="na",
+ contextname="textsterling",
+ description="POUND SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x00A3,
+ },
+ {
+ adobename="currency",
+ category="sc",
+ cjkwd="a",
+ contextname="textcurrency",
+ description="CURRENCY SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x00A4,
+ },
+ {
+ adobename="yen",
+ category="sc",
+ cjkwd="na",
+ contextname="textyen",
+ description="YEN SIGN",
+ direction="et",
+ linebreak="pr",
+ mathclass="nothing",
+ mathname="yen",
+ unicodeslot=0x00A5,
+ },
+ {
+ adobename="brokenbar",
+ category="so",
+ cjkwd="na",
+ contextname="textbrokenbar",
+ description="BROKEN BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x00A6,
+ },
+ {
+ adobename="section",
+ category="so",
+ cjkwd="a",
+ contextname="sectionmark",
+ description="SECTION SIGN",
+ direction="on",
+ linebreak="ai",
+ mathclass="box",
+ mathname="S",
+ unicodeslot=0x00A7,
+ },
+ {
+ adobename="dieresis",
+ category="sk",
+ cjkwd="a",
+ contextname="textdiaeresis",
+ description="DIAERESIS",
+ direction="on",
+ linebreak="ai",
+ mathclass="accent",
+ mathname="ddot",
+ specials={ "compat", 0x0020, 0x0308 },
+ unicodeslot=0x00A8,
+ },
+ {
+ adobename="copyright",
+ category="so",
+ contextname="copyright",
+ description="COPYRIGHT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x00A9,
+ },
+ {
+ adobename="ordfeminine",
+ category="ll",
+ cjkwd="a",
+ contextname="ordfeminine",
+ description="FEMININE ORDINAL INDICATOR",
+ direction="l",
+ linebreak="ai",
+ specials={ "super", 0x0061 },
+ unicodeslot=0x00AA,
+ },
+ {
+ adobename="guillemotleft",
+ category="pi",
+ contextname="leftguillemot",
+ description="LEFT-POINTING DOUBLE ANGLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ mirror=0x00BB,
+ unicodeslot=0x00AB,
+ },
+ {
+ adobename="logicalnot",
+ category="sm",
+ cjkwd="na",
+ contextname="textlognot",
+ description="NOT SIGN",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="ord", name="lnot" },
+ { class="ord", name="neg" },
+ },
+ unicodeslot=0x00AC,
+ },
+ {
+ category="cf",
+ cjkwd="a",
+ contextname="softhyphen",
+ description="SOFT HYPHEN",
+ direction="bn",
+ linebreak="ba",
+ unicodeslot=0x00AD,
+ },
+ {
+ adobename="registered",
+ category="so",
+ cjkwd="a",
+ contextname="registered",
+ description="REGISTERED SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x00AE,
+ },
+ {
+ adobename="macron",
+ category="sk",
+ cjkwd="na",
+ contextname="textmacron",
+ description="MACRON",
+ direction="on",
+ linebreak="al",
+ mathclass="accent",
+ mathname="bar",
+ specials={ "compat", 0x0020, 0x0304 },
+ unicodeslot=0x00AF,
+ },
+ {
+ adobename="degree",
+ category="so",
+ cjkwd="a",
+ contextname="textdegree",
+ description="DEGREE SIGN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x00B0,
+ },
+ {
+ adobename="plusminus",
+ category="sm",
+ cjkwd="a",
+ contextname="textpm",
+ description="PLUS-MINUS SIGN",
+ direction="et",
+ linebreak="pr",
+ mathclass="binary",
+ mathname="pm",
+ unicodeslot=0x00B1,
+ },
+ {
+ category="no",
+ cjkwd="a",
+ contextname="twosuperior",
+ description="SUPERSCRIPT TWO",
+ direction="en",
+ linebreak="ai",
+ specials={ "super", 0x0032 },
+ unicodeslot=0x00B2,
+ },
+ {
+ category="no",
+ cjkwd="a",
+ contextname="threesuperior",
+ description="SUPERSCRIPT THREE",
+ direction="en",
+ linebreak="ai",
+ specials={ "super", 0x0033 },
+ unicodeslot=0x00B3,
+ },
+ {
+ adobename="acute",
+ category="sk",
+ cjkwd="a",
+ contextname="textacute",
+ description="ACUTE ACCENT",
+ direction="on",
+ linebreak="bb",
+ mathclass="accent",
+ mathname="acute",
+ specials={ "compat", 0x0020, 0x0301 },
+ unicodeslot=0x00B4,
+ },
+ {
+ adobename="mu",
+ category="ll",
+ contextname="textmu",
+ description="MICRO SIGN",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x03BC },
+ uccode=0x039C,
+ unicodeslot=0x00B5,
+ },
+ {
+ adobename="paragraph",
+ category="so",
+ cjkwd="a",
+ contextname="paragraphmark",
+ description="PILCROW SIGN",
+ direction="on",
+ linebreak="ai",
+ mathclass="box",
+ mathname="P",
+ unicodeslot=0x00B6,
+ },
+ {
+ adobename="periodcentered",
+ category="po",
+ cjkwd="a",
+ contextname="periodcentered",
+ description="MIDDLE DOT",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="centerdot",
+ unicodeslot=0x00B7,
+ },
+ {
+ adobename="cedilla",
+ category="sk",
+ cjkwd="a",
+ contextname="textcedilla",
+ description="CEDILLA",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0020, 0x0327 },
+ unicodeslot=0x00B8,
+ },
+ {
+ category="no",
+ cjkwd="a",
+ contextname="onesuperior",
+ description="SUPERSCRIPT ONE",
+ direction="en",
+ linebreak="ai",
+ specials={ "super", 0x0031 },
+ unicodeslot=0x00B9,
+ },
+ {
+ adobename="ordmasculine",
+ category="ll",
+ cjkwd="a",
+ contextname="ordmasculine",
+ description="MASCULINE ORDINAL INDICATOR",
+ direction="l",
+ linebreak="ai",
+ specials={ "super", 0x006F },
+ unicodeslot=0x00BA,
+ },
+ {
+ adobename="guillemotright",
+ category="pf",
+ contextname="rightguillemot",
+ description="RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ mirror=0x00AB,
+ unicodeslot=0x00BB,
+ },
+ {
+ adobename="onequarter",
+ category="no",
+ cjkwd="a",
+ contextname="onequarter",
+ description="VULGAR FRACTION ONE QUARTER",
+ direction="on",
+ linebreak="ai",
+ specials={ "fraction", 0x0031, 0x2044, 0x0034 },
+ unicodeslot=0x00BC,
+ },
+ {
+ adobename="onehalf",
+ category="no",
+ cjkwd="a",
+ contextname="onehalf",
+ description="VULGAR FRACTION ONE HALF",
+ direction="on",
+ linebreak="ai",
+ specials={ "fraction", 0x0031, 0x2044, 0x0032 },
+ unicodeslot=0x00BD,
+ },
+ {
+ adobename="threequarters",
+ category="no",
+ cjkwd="a",
+ contextname="threequarter",
+ description="VULGAR FRACTION THREE QUARTERS",
+ direction="on",
+ linebreak="ai",
+ specials={ "fraction", 0x0033, 0x2044, 0x0034 },
+ unicodeslot=0x00BE,
+ },
+ {
+ adobename="questiondown",
+ category="po",
+ cjkwd="a",
+ contextname="questiondown",
+ description="INVERTED QUESTION MARK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x00BF,
+ },
+ {
+ adobename="Agrave",
+ category="lu",
+ contextname="Agrave",
+ description="LATIN CAPITAL LETTER A WITH GRAVE",
+ direction="l",
+ lccode=0x00E0,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0300 },
+ unicodeslot=0x00C0,
+ },
+ {
+ adobename="Aacute",
+ category="lu",
+ contextname="Aacute",
+ description="LATIN CAPITAL LETTER A WITH ACUTE",
+ direction="l",
+ lccode=0x00E1,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0301 },
+ unicodeslot=0x00C1,
+ },
+ {
+ adobename="Acircumflex",
+ category="lu",
+ contextname="Acircumflex",
+ description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x00E2,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0302 },
+ unicodeslot=0x00C2,
+ },
+ {
+ adobename="Atilde",
+ category="lu",
+ contextname="Atilde",
+ description="LATIN CAPITAL LETTER A WITH TILDE",
+ direction="l",
+ lccode=0x00E3,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0303 },
+ unicodeslot=0x00C3,
+ },
+ {
+ adobename="Adieresis",
+ category="lu",
+ contextname="Adiaeresis",
+ description="LATIN CAPITAL LETTER A WITH DIAERESIS",
+ direction="l",
+ lccode=0x00E4,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0308 },
+ unicodeslot=0x00C4,
+ },
+ {
+ adobename="Aring",
+ category="lu",
+ contextname="Aring",
+ description="LATIN CAPITAL LETTER A WITH RING ABOVE",
+ direction="l",
+ lccode=0x00E5,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x030A },
+ unicodeslot=0x00C5,
+ },
+ {
+ adobename="AE",
+ category="lu",
+ cjkwd="a",
+ contextname="AEligature",
+ description="LATIN CAPITAL LETTER AE",
+ direction="l",
+ lccode=0x00E6,
+ linebreak="al",
+ shcode={ 0x0041, 0x0045 },
+ unicodeslot=0x00C6,
+ },
+ {
+ adobename="Ccedilla",
+ category="lu",
+ contextname="Ccedilla",
+ description="LATIN CAPITAL LETTER C WITH CEDILLA",
+ direction="l",
+ lccode=0x00E7,
+ linebreak="al",
+ shcode=0x0043,
+ specials={ "char", 0x0043, 0x0327 },
+ unicodeslot=0x00C7,
+ },
+ {
+ adobename="Egrave",
+ category="lu",
+ contextname="Egrave",
+ description="LATIN CAPITAL LETTER E WITH GRAVE",
+ direction="l",
+ lccode=0x00E8,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0300 },
+ unicodeslot=0x00C8,
+ },
+ {
+ adobename="Eacute",
+ category="lu",
+ contextname="Eacute",
+ description="LATIN CAPITAL LETTER E WITH ACUTE",
+ direction="l",
+ lccode=0x00E9,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0301 },
+ unicodeslot=0x00C9,
+ },
+ {
+ adobename="Ecircumflex",
+ category="lu",
+ contextname="Ecircumflex",
+ description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x00EA,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0302 },
+ unicodeslot=0x00CA,
+ },
+ {
+ adobename="Edieresis",
+ category="lu",
+ contextname="Ediaeresis",
+ description="LATIN CAPITAL LETTER E WITH DIAERESIS",
+ direction="l",
+ lccode=0x00EB,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0308 },
+ unicodeslot=0x00CB,
+ },
+ {
+ adobename="Igrave",
+ category="lu",
+ contextname="Igrave",
+ description="LATIN CAPITAL LETTER I WITH GRAVE",
+ direction="l",
+ lccode=0x00EC,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0300 },
+ unicodeslot=0x00CC,
+ },
+ {
+ adobename="Iacute",
+ category="lu",
+ contextname="Iacute",
+ description="LATIN CAPITAL LETTER I WITH ACUTE",
+ direction="l",
+ lccode=0x00ED,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0301 },
+ unicodeslot=0x00CD,
+ },
+ {
+ adobename="Icircumflex",
+ category="lu",
+ contextname="Icircumflex",
+ description="LATIN CAPITAL LETTER I WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x00EE,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0302 },
+ unicodeslot=0x00CE,
+ },
+ {
+ adobename="Idieresis",
+ category="lu",
+ contextname="Idiaeresis",
+ description="LATIN CAPITAL LETTER I WITH DIAERESIS",
+ direction="l",
+ lccode=0x00EF,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0308 },
+ unicodeslot=0x00CF,
+ },
+ {
+ adobename="Eth",
+ category="lu",
+ cjkwd="a",
+ contextname="Eth",
+ description="LATIN CAPITAL LETTER ETH",
+ direction="l",
+ lccode=0x00F0,
+ linebreak="al",
+ unicodeslot=0x00D0,
+ },
+ {
+ adobename="Ntilde",
+ category="lu",
+ contextname="Ntilde",
+ description="LATIN CAPITAL LETTER N WITH TILDE",
+ direction="l",
+ lccode=0x00F1,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x0303 },
+ unicodeslot=0x00D1,
+ },
+ {
+ adobename="Ograve",
+ category="lu",
+ contextname="Ograve",
+ description="LATIN CAPITAL LETTER O WITH GRAVE",
+ direction="l",
+ lccode=0x00F2,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0300 },
+ unicodeslot=0x00D2,
+ },
+ {
+ adobename="Oacute",
+ category="lu",
+ contextname="Oacute",
+ description="LATIN CAPITAL LETTER O WITH ACUTE",
+ direction="l",
+ lccode=0x00F3,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0301 },
+ unicodeslot=0x00D3,
+ },
+ {
+ adobename="Ocircumflex",
+ category="lu",
+ contextname="Ocircumflex",
+ description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x00F4,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0302 },
+ unicodeslot=0x00D4,
+ },
+ {
+ adobename="Otilde",
+ category="lu",
+ contextname="Otilde",
+ description="LATIN CAPITAL LETTER O WITH TILDE",
+ direction="l",
+ lccode=0x00F5,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0303 },
+ unicodeslot=0x00D5,
+ },
+ {
+ adobename="Odieresis",
+ category="lu",
+ contextname="Odiaeresis",
+ description="LATIN CAPITAL LETTER O WITH DIAERESIS",
+ direction="l",
+ lccode=0x00F6,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0308 },
+ unicodeslot=0x00D6,
+ },
+ {
+ adobename="multiply",
+ category="sm",
+ cjkwd="a",
+ contextname="textmultiply",
+ description="MULTIPLICATION SIGN",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="times",
+ unicodeslot=0x00D7,
+ },
+ {
+ adobename="Oslash",
+ category="lu",
+ cjkwd="a",
+ contextname="Ostroke",
+ description="LATIN CAPITAL LETTER O WITH STROKE",
+ direction="l",
+ lccode=0x00F8,
+ linebreak="al",
+ shcode=0x004F,
+ unicodeslot=0x00D8,
+ },
+ {
+ adobename="Ugrave",
+ category="lu",
+ contextname="Ugrave",
+ description="LATIN CAPITAL LETTER U WITH GRAVE",
+ direction="l",
+ lccode=0x00F9,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0300 },
+ unicodeslot=0x00D9,
+ },
+ {
+ adobename="Uacute",
+ category="lu",
+ contextname="Uacute",
+ description="LATIN CAPITAL LETTER U WITH ACUTE",
+ direction="l",
+ lccode=0x00FA,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0301 },
+ unicodeslot=0x00DA,
+ },
+ {
+ adobename="Ucircumflex",
+ category="lu",
+ contextname="Ucircumflex",
+ description="LATIN CAPITAL LETTER U WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x00FB,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0302 },
+ unicodeslot=0x00DB,
+ },
+ {
+ adobename="Udieresis",
+ category="lu",
+ contextname="Udiaeresis",
+ description="LATIN CAPITAL LETTER U WITH DIAERESIS",
+ direction="l",
+ lccode=0x00FC,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0308 },
+ unicodeslot=0x00DC,
+ },
+ {
+ adobename="Yacute",
+ category="lu",
+ contextname="Yacute",
+ description="LATIN CAPITAL LETTER Y WITH ACUTE",
+ direction="l",
+ lccode=0x00FD,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0301 },
+ unicodeslot=0x00DD,
+ },
+ {
+ adobename="Thorn",
+ category="lu",
+ cjkwd="a",
+ contextname="Thorn",
+ description="LATIN CAPITAL LETTER THORN",
+ direction="l",
+ lccode=0x00FE,
+ linebreak="al",
+ unicodeslot=0x00DE,
+ },
+ {
+ adobename="germandbls",
+ category="ll",
+ cjkwd="a",
+ contextname="ssharp",
+ description="LATIN SMALL LETTER SHARP S",
+ direction="l",
+ linebreak="al",
+ uccodes={ 0x0053, 0x0053 },
+ unicodeslot=0x00DF,
+ },
+ {
+ adobename="agrave",
+ category="ll",
+ cjkwd="a",
+ contextname="agrave",
+ description="LATIN SMALL LETTER A WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0300 },
+ uccode=0x00C0,
+ unicodeslot=0x00E0,
+ },
+ {
+ adobename="aacute",
+ category="ll",
+ cjkwd="a",
+ contextname="aacute",
+ description="LATIN SMALL LETTER A WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0301 },
+ uccode=0x00C1,
+ unicodeslot=0x00E1,
+ },
+ {
+ adobename="acircumflex",
+ category="ll",
+ contextname="acircumflex",
+ description="LATIN SMALL LETTER A WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0302 },
+ uccode=0x00C2,
+ unicodeslot=0x00E2,
+ },
+ {
+ adobename="atilde",
+ category="ll",
+ contextname="atilde",
+ description="LATIN SMALL LETTER A WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0303 },
+ uccode=0x00C3,
+ unicodeslot=0x00E3,
+ },
+ {
+ adobename="adieresis",
+ category="ll",
+ contextname="adiaeresis",
+ description="LATIN SMALL LETTER A WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0308 },
+ uccode=0x00C4,
+ unicodeslot=0x00E4,
+ },
+ {
+ adobename="aring",
+ category="ll",
+ contextname="aring",
+ description="LATIN SMALL LETTER A WITH RING ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x030A },
+ uccode=0x00C5,
+ unicodeslot=0x00E5,
+ },
+ {
+ adobename="ae",
+ category="ll",
+ cjkwd="a",
+ contextname="aeligature",
+ description="LATIN SMALL LETTER AE",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x00E6, 0x00EA },
+ uccode=0x00C6,
+ unicodeslot=0x00E6,
+ },
+ {
+ adobename="ccedilla",
+ category="ll",
+ contextname="ccedilla",
+ description="LATIN SMALL LETTER C WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ specials={ "char", 0x0063, 0x0327 },
+ uccode=0x00C7,
+ unicodeslot=0x00E7,
+ },
+ {
+ adobename="egrave",
+ category="ll",
+ cjkwd="a",
+ contextname="egrave",
+ description="LATIN SMALL LETTER E WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0300 },
+ uccode=0x00C8,
+ unicodeslot=0x00E8,
+ },
+ {
+ adobename="eacute",
+ category="ll",
+ cjkwd="a",
+ contextname="eacute",
+ description="LATIN SMALL LETTER E WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0301 },
+ uccode=0x00C9,
+ unicodeslot=0x00E9,
+ },
+ {
+ adobename="ecircumflex",
+ category="ll",
+ cjkwd="a",
+ contextname="ecircumflex",
+ description="LATIN SMALL LETTER E WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0302 },
+ uccode=0x00CA,
+ unicodeslot=0x00EA,
+ },
+ {
+ adobename="edieresis",
+ category="ll",
+ contextname="ediaeresis",
+ description="LATIN SMALL LETTER E WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0308 },
+ uccode=0x00CB,
+ unicodeslot=0x00EB,
+ },
+ {
+ adobename="igrave",
+ category="ll",
+ cjkwd="a",
+ contextname="igrave",
+ description="LATIN SMALL LETTER I WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0300 },
+ uccode=0x00CC,
+ unicodeslot=0x00EC,
+ },
+ {
+ adobename="iacute",
+ category="ll",
+ cjkwd="a",
+ contextname="iacute",
+ description="LATIN SMALL LETTER I WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0301 },
+ uccode=0x00CD,
+ unicodeslot=0x00ED,
+ },
+ {
+ adobename="icircumflex",
+ category="ll",
+ contextname="icircumflex",
+ description="LATIN SMALL LETTER I WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0302 },
+ uccode=0x00CE,
+ unicodeslot=0x00EE,
+ },
+ {
+ adobename="idieresis",
+ category="ll",
+ contextname="idiaeresis",
+ description="LATIN SMALL LETTER I WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0308 },
+ uccode=0x00CF,
+ unicodeslot=0x00EF,
+ },
+ {
+ adobename="eth",
+ category="ll",
+ cjkwd="a",
+ --~ contextname="eth", -- AM: Should this be defined in text mode?
+ description="LATIN SMALL LETTER ETH",
+ direction="l",
+ linebreak="al",
+ mathclass="ord",
+ mathname="eth",
+ uccode=0x00D0,
+ unicodeslot=0x00F0,
+ },
+ {
+ adobename="ntilde",
+ category="ll",
+ contextname="ntilde",
+ description="LATIN SMALL LETTER N WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x0303 },
+ uccode=0x00D1,
+ unicodeslot=0x00F1,
+ },
+ {
+ adobename="ograve",
+ category="ll",
+ cjkwd="a",
+ contextname="ograve",
+ description="LATIN SMALL LETTER O WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0300 },
+ uccode=0x00D2,
+ unicodeslot=0x00F2,
+ },
+ {
+ adobename="oacute",
+ category="ll",
+ cjkwd="a",
+ contextname="oacute",
+ description="LATIN SMALL LETTER O WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0301 },
+ uccode=0x00D3,
+ unicodeslot=0x00F3,
+ },
+ {
+ adobename="ocircumflex",
+ category="ll",
+ contextname="ocircumflex",
+ description="LATIN SMALL LETTER O WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0302 },
+ uccode=0x00D4,
+ unicodeslot=0x00F4,
+ },
+ {
+ adobename="otilde",
+ category="ll",
+ contextname="otilde",
+ description="LATIN SMALL LETTER O WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0303 },
+ uccode=0x00D5,
+ unicodeslot=0x00F5,
+ },
+ {
+ adobename="odieresis",
+ category="ll",
+ contextname="odiaeresis",
+ description="LATIN SMALL LETTER O WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0308 },
+ uccode=0x00D6,
+ unicodeslot=0x00F6,
+ },
+ {
+ adobename="divide",
+ category="sm",
+ cjkwd="a",
+ contextname="textdiv",
+ description="DIVISION SIGN",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="div",
+ unicodeslot=0x00F7,
+ },
+ {
+ adobename="oslash",
+ category="ll",
+ cjkwd="a",
+ contextname="ostroke",
+ description="LATIN SMALL LETTER O WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ uccode=0x00D8,
+ unicodeslot=0x00F8,
+ },
+ {
+ adobename="ugrave",
+ category="ll",
+ cjkwd="a",
+ contextname="ugrave",
+ description="LATIN SMALL LETTER U WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0300 },
+ uccode=0x00D9,
+ unicodeslot=0x00F9,
+ },
+ {
+ adobename="uacute",
+ category="ll",
+ cjkwd="a",
+ contextname="uacute",
+ description="LATIN SMALL LETTER U WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0301 },
+ uccode=0x00DA,
+ unicodeslot=0x00FA,
+ },
+ {
+ adobename="ucircumflex",
+ category="ll",
+ contextname="ucircumflex",
+ description="LATIN SMALL LETTER U WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0302 },
+ uccode=0x00DB,
+ unicodeslot=0x00FB,
+ },
+ {
+ adobename="udieresis",
+ category="ll",
+ cjkwd="a",
+ contextname="udiaeresis",
+ description="LATIN SMALL LETTER U WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0308 },
+ uccode=0x00DC,
+ unicodeslot=0x00FC,
+ },
+ {
+ adobename="yacute",
+ category="ll",
+ contextname="yacute",
+ description="LATIN SMALL LETTER Y WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0301 },
+ uccode=0x00DD,
+ unicodeslot=0x00FD,
+ },
+ {
+ adobename="thorn",
+ category="ll",
+ cjkwd="a",
+ contextname="thorn",
+ description="LATIN SMALL LETTER THORN",
+ direction="l",
+ linebreak="al",
+ uccode=0x00DE,
+ unicodeslot=0x00FE,
+ },
+ {
+ adobename="ydieresis",
+ category="ll",
+ contextname="ydiaeresis",
+ description="LATIN SMALL LETTER Y WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0308 },
+ uccode=0x0178,
+ unicodeslot=0x00FF,
+ },
+ {
+ adobename="Amacron",
+ category="lu",
+ contextname="Amacron",
+ description="LATIN CAPITAL LETTER A WITH MACRON",
+ direction="l",
+ lccode=0x0101,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0304 },
+ unicodeslot=0x0100,
+ },
+ {
+ adobename="amacron",
+ category="ll",
+ cjkwd="a",
+ contextname="amacron",
+ description="LATIN SMALL LETTER A WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0304 },
+ uccode=0x0100,
+ unicodeslot=0x0101,
+ },
+ {
+ adobename="Abreve",
+ category="lu",
+ contextname="Abreve",
+ description="LATIN CAPITAL LETTER A WITH BREVE",
+ direction="l",
+ lccode=0x0103,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0306 },
+ unicodeslot=0x0102,
+ },
+ {
+ adobename="abreve",
+ category="ll",
+ contextname="abreve",
+ description="LATIN SMALL LETTER A WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0306 },
+ uccode=0x0102,
+ unicodeslot=0x0103,
+ },
+ {
+ adobename="Aogonek",
+ category="lu",
+ contextname="Aogonek",
+ description="LATIN CAPITAL LETTER A WITH OGONEK",
+ direction="l",
+ lccode=0x0105,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0328 },
+ unicodeslot=0x0104,
+ },
+ {
+ adobename="aogonek",
+ category="ll",
+ contextname="aogonek",
+ description="LATIN SMALL LETTER A WITH OGONEK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0328 },
+ uccode=0x0104,
+ unicodeslot=0x0105,
+ },
+ {
+ adobename="Cacute",
+ category="lu",
+ contextname="Cacute",
+ description="LATIN CAPITAL LETTER C WITH ACUTE",
+ direction="l",
+ lccode=0x0107,
+ linebreak="al",
+ shcode=0x0043,
+ specials={ "char", 0x0043, 0x0301 },
+ unicodeslot=0x0106,
+ },
+ {
+ adobename="cacute",
+ category="ll",
+ contextname="cacute",
+ description="LATIN SMALL LETTER C WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ specials={ "char", 0x0063, 0x0301 },
+ uccode=0x0106,
+ unicodeslot=0x0107,
+ },
+ {
+ adobename="Ccircumflex",
+ category="lu",
+ contextname="Ccircumflex",
+ description="LATIN CAPITAL LETTER C WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x0109,
+ linebreak="al",
+ shcode=0x0043,
+ specials={ "char", 0x0043, 0x0302 },
+ unicodeslot=0x0108,
+ },
+ {
+ adobename="ccircumflex",
+ category="ll",
+ contextname="ccircumflex",
+ description="LATIN SMALL LETTER C WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ specials={ "char", 0x0063, 0x0302 },
+ uccode=0x0108,
+ unicodeslot=0x0109,
+ },
+ {
+ adobename="Cdotaccent",
+ category="lu",
+ contextname="Cdotaccent",
+ description="LATIN CAPITAL LETTER C WITH DOT ABOVE",
+ direction="l",
+ lccode=0x010B,
+ linebreak="al",
+ shcode=0x0043,
+ specials={ "char", 0x0043, 0x0307 },
+ unicodeslot=0x010A,
+ },
+ {
+ adobename="cdotaccent",
+ category="ll",
+ contextname="cdotaccent",
+ description="LATIN SMALL LETTER C WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ specials={ "char", 0x0063, 0x0307 },
+ uccode=0x010A,
+ unicodeslot=0x010B,
+ },
+ {
+ adobename="Ccaron",
+ category="lu",
+ contextname="Ccaron",
+ description="LATIN CAPITAL LETTER C WITH CARON",
+ direction="l",
+ lccode=0x010D,
+ linebreak="al",
+ shcode=0x0043,
+ specials={ "char", 0x0043, 0x030C },
+ unicodeslot=0x010C,
+ },
+ {
+ adobename="ccaron",
+ category="ll",
+ contextname="ccaron",
+ description="LATIN SMALL LETTER C WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ specials={ "char", 0x0063, 0x030C },
+ uccode=0x010C,
+ unicodeslot=0x010D,
+ },
+ {
+ adobename="Dcaron",
+ category="lu",
+ contextname="Dcaron",
+ description="LATIN CAPITAL LETTER D WITH CARON",
+ direction="l",
+ lccode=0x010F,
+ linebreak="al",
+ shcode=0x0044,
+ specials={ "char", 0x0044, 0x030C },
+ unicodeslot=0x010E,
+ },
+ {
+ adobename="dcaron",
+ category="ll",
+ contextname="dcaron",
+ description="LATIN SMALL LETTER D WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ specials={ "char", 0x0064, 0x030C },
+ uccode=0x010E,
+ unicodeslot=0x010F,
+ },
+ {
+ adobename="Dcroat",
+ category="lu",
+ contextname="Dstroke",
+ description="LATIN CAPITAL LETTER D WITH STROKE",
+ direction="l",
+ lccode=0x0111,
+ linebreak="al",
+ shcode=0x0044,
+ unicodeslot=0x0110,
+ },
+ {
+ adobename="dcroat",
+ category="ll",
+ cjkwd="a",
+ contextname="dstroke",
+ description="LATIN SMALL LETTER D WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ uccode=0x0110,
+ unicodeslot=0x0111,
+ },
+ {
+ adobename="Emacron",
+ category="lu",
+ contextname="Emacron",
+ description="LATIN CAPITAL LETTER E WITH MACRON",
+ direction="l",
+ lccode=0x0113,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0304 },
+ unicodeslot=0x0112,
+ },
+ {
+ adobename="emacron",
+ category="ll",
+ cjkwd="a",
+ contextname="emacron",
+ description="LATIN SMALL LETTER E WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0304 },
+ uccode=0x0112,
+ unicodeslot=0x0113,
+ },
+ {
+ adobename="Ebreve",
+ category="lu",
+ contextname="Ebreve",
+ description="LATIN CAPITAL LETTER E WITH BREVE",
+ direction="l",
+ lccode=0x0115,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0306 },
+ unicodeslot=0x0114,
+ },
+ {
+ adobename="ebreve",
+ category="ll",
+ contextname="ebreve",
+ description="LATIN SMALL LETTER E WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0306 },
+ uccode=0x0114,
+ unicodeslot=0x0115,
+ },
+ {
+ adobename="Edotaccent",
+ category="lu",
+ contextname="Edotaccent",
+ description="LATIN CAPITAL LETTER E WITH DOT ABOVE",
+ direction="l",
+ lccode=0x0117,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0307 },
+ unicodeslot=0x0116,
+ },
+ {
+ adobename="edotaccent",
+ category="ll",
+ contextname="edotaccent",
+ description="LATIN SMALL LETTER E WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0307 },
+ uccode=0x0116,
+ unicodeslot=0x0117,
+ },
+ {
+ adobename="Eogonek",
+ category="lu",
+ contextname="Eogonek",
+ description="LATIN CAPITAL LETTER E WITH OGONEK",
+ direction="l",
+ lccode=0x0119,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0328 },
+ unicodeslot=0x0118,
+ },
+ {
+ adobename="eogonek",
+ category="ll",
+ contextname="eogonek",
+ description="LATIN SMALL LETTER E WITH OGONEK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0328 },
+ uccode=0x0118,
+ unicodeslot=0x0119,
+ },
+ {
+ adobename="Ecaron",
+ category="lu",
+ contextname="Ecaron",
+ description="LATIN CAPITAL LETTER E WITH CARON",
+ direction="l",
+ lccode=0x011B,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x030C },
+ unicodeslot=0x011A,
+ },
+ {
+ adobename="ecaron",
+ category="ll",
+ cjkwd="a",
+ contextname="ecaron",
+ description="LATIN SMALL LETTER E WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x030C },
+ uccode=0x011A,
+ unicodeslot=0x011B,
+ },
+ {
+ adobename="Gcircumflex",
+ category="lu",
+ contextname="Gcircumflex",
+ description="LATIN CAPITAL LETTER G WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x011D,
+ linebreak="al",
+ shcode=0x0047,
+ specials={ "char", 0x0047, 0x0302 },
+ unicodeslot=0x011C,
+ },
+ {
+ adobename="gcircumflex",
+ category="ll",
+ contextname="gcircumflex",
+ description="LATIN SMALL LETTER G WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ specials={ "char", 0x0067, 0x0302 },
+ uccode=0x011C,
+ unicodeslot=0x011D,
+ },
+ {
+ adobename="Gbreve",
+ category="lu",
+ contextname="Gbreve",
+ description="LATIN CAPITAL LETTER G WITH BREVE",
+ direction="l",
+ lccode=0x011F,
+ linebreak="al",
+ shcode=0x0047,
+ specials={ "char", 0x0047, 0x0306 },
+ unicodeslot=0x011E,
+ },
+ {
+ adobename="gbreve",
+ category="ll",
+ contextname="gbreve",
+ description="LATIN SMALL LETTER G WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ specials={ "char", 0x0067, 0x0306 },
+ uccode=0x011E,
+ unicodeslot=0x011F,
+ },
+ {
+ adobename="Gdotaccent",
+ category="lu",
+ contextname="Gdotaccent",
+ description="LATIN CAPITAL LETTER G WITH DOT ABOVE",
+ direction="l",
+ lccode=0x0121,
+ linebreak="al",
+ shcode=0x0047,
+ specials={ "char", 0x0047, 0x0307 },
+ unicodeslot=0x0120,
+ },
+ {
+ adobename="gdotaccent",
+ category="ll",
+ contextname="gdotaccent",
+ description="LATIN SMALL LETTER G WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ specials={ "char", 0x0067, 0x0307 },
+ uccode=0x0120,
+ unicodeslot=0x0121,
+ },
+ {
+ adobename="Gcommaaccent",
+ category="lu",
+ contextname="Gcommaaccent",
+ description="LATIN CAPITAL LETTER G WITH CEDILLA",
+ direction="l",
+ lccode=0x0123,
+ linebreak="al",
+ shcode=0x0047,
+ specials={ "char", 0x0047, 0x0327 },
+ unicodeslot=0x0122,
+ },
+ {
+ adobename="gcommaaccent",
+ category="ll",
+ contextname="gcommaaccent",
+ description="LATIN SMALL LETTER G WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ specials={ "char", 0x0067, 0x0327 },
+ uccode=0x0122,
+ unicodeslot=0x0123,
+ },
+ {
+ adobename="Hcircumflex",
+ category="lu",
+ contextname="Hcircumflex",
+ description="LATIN CAPITAL LETTER H WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x0125,
+ linebreak="al",
+ shcode=0x0048,
+ specials={ "char", 0x0048, 0x0302 },
+ unicodeslot=0x0124,
+ },
+ {
+ adobename="hcircumflex",
+ category="ll",
+ contextname="hcircumflex",
+ description="LATIN SMALL LETTER H WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x0302 },
+ uccode=0x0124,
+ unicodeslot=0x0125,
+ },
+ {
+ adobename="Hbar",
+ category="lu",
+ cjkwd="a",
+ contextname="Hstroke",
+ description="LATIN CAPITAL LETTER H WITH STROKE",
+ direction="l",
+ lccode=0x0127,
+ linebreak="al",
+ shcode=0x0048,
+ unicodeslot=0x0126,
+ },
+ {
+ adobename="hbar",
+ category="ll",
+ cjkwd="a",
+ contextname="hstroke",
+ description="LATIN SMALL LETTER H WITH STROKE",
+ direction="l",
+ linebreak="al",
+ mathclass="ord",
+ mathname="hbar",
+ shcode=0x0068,
+ uccode=0x0126,
+ unicodeslot=0x0127,
+ },
+ {
+ adobename="Itilde",
+ category="lu",
+ contextname="Itilde",
+ description="LATIN CAPITAL LETTER I WITH TILDE",
+ direction="l",
+ lccode=0x0129,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0303 },
+ unicodeslot=0x0128,
+ },
+ {
+ adobename="itilde",
+ category="ll",
+ contextname="itilde",
+ description="LATIN SMALL LETTER I WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0303 },
+ uccode=0x0128,
+ unicodeslot=0x0129,
+ },
+ {
+ adobename="Imacron",
+ category="lu",
+ contextname="Imacron",
+ description="LATIN CAPITAL LETTER I WITH MACRON",
+ direction="l",
+ lccode=0x012B,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0304 },
+ unicodeslot=0x012A,
+ },
+ {
+ adobename="imacron",
+ category="ll",
+ cjkwd="a",
+ contextname="imacron",
+ description="LATIN SMALL LETTER I WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0304 },
+ uccode=0x012A,
+ unicodeslot=0x012B,
+ },
+ {
+ adobename="Ibreve",
+ category="lu",
+ contextname="Ibreve",
+ description="LATIN CAPITAL LETTER I WITH BREVE",
+ direction="l",
+ lccode=0x012D,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0306 },
+ unicodeslot=0x012C,
+ },
+ {
+ adobename="ibreve",
+ category="ll",
+ contextname="ibreve",
+ description="LATIN SMALL LETTER I WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0306 },
+ uccode=0x012C,
+ unicodeslot=0x012D,
+ },
+ {
+ adobename="Iogonek",
+ category="lu",
+ contextname="Iogonek",
+ description="LATIN CAPITAL LETTER I WITH OGONEK",
+ direction="l",
+ lccode=0x012F,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0328 },
+ unicodeslot=0x012E,
+ },
+ {
+ adobename="iogonek",
+ category="ll",
+ contextname="iogonek",
+ description="LATIN SMALL LETTER I WITH OGONEK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0328 },
+ uccode=0x012E,
+ unicodeslot=0x012F,
+ },
+ {
+ adobename="Idotaccent",
+ category="lu",
+ contextname="Idotaccent",
+ description="LATIN CAPITAL LETTER I WITH DOT ABOVE",
+ direction="l",
+ lccode=0x0069,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0307 },
+ unicodeslot=0x0130,
+ },
+ {
+ adobename="dotlessi",
+ category="ll",
+ cjkwd="a",
+ contextname="dotlessi",
+ description="LATIN SMALL LETTER DOTLESS I",
+ direction="l",
+ linebreak="al",
+ uccode=0x0049,
+ unicodeslot=0x0131,
+ },
+ {
+ adobename="IJ",
+ category="lu",
+ cjkwd="a",
+ contextname="IJligature",
+ description="LATIN CAPITAL LIGATURE IJ",
+ direction="l",
+ lccode=0x0133,
+ linebreak="al",
+ shcode={ 0x0049, 0x004A },
+ specials={ "compat", 0x0049, 0x004A },
+ unicodeslot=0x0132,
+ },
+ {
+ adobename="ij",
+ category="ll",
+ cjkwd="a",
+ contextname="ijligature",
+ description="LATIN SMALL LIGATURE IJ",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x0069, 0x006A },
+ specials={ "compat", 0x0069, 0x006A },
+ uccode=0x0132,
+ unicodeslot=0x0133,
+ },
+ {
+ adobename="Jcircumflex",
+ category="lu",
+ contextname="Jcircumflex",
+ description="LATIN CAPITAL LETTER J WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x0135,
+ linebreak="al",
+ shcode=0x004A,
+ specials={ "char", 0x004A, 0x0302 },
+ unicodeslot=0x0134,
+ },
+ {
+ adobename="jcircumflex",
+ category="ll",
+ contextname="jcircumflex",
+ description="LATIN SMALL LETTER J WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x006A,
+ specials={ "char", 0x006A, 0x0302 },
+ uccode=0x0134,
+ unicodeslot=0x0135,
+ },
+ {
+ adobename="Kcommaaccent",
+ category="lu",
+ contextname="Kcommaaccent",
+ description="LATIN CAPITAL LETTER K WITH CEDILLA",
+ direction="l",
+ lccode=0x0137,
+ linebreak="al",
+ shcode=0x004B,
+ specials={ "char", 0x004B, 0x0327 },
+ unicodeslot=0x0136,
+ },
+ {
+ adobename="kcommaaccent",
+ category="ll",
+ contextname="kcommaaccent",
+ description="LATIN SMALL LETTER K WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ specials={ "char", 0x006B, 0x0327 },
+ uccode=0x0136,
+ unicodeslot=0x0137,
+ },
+ {
+ adobename="kgreenlandic",
+ category="ll",
+ cjkwd="a",
+ contextname="kkra",
+ description="LATIN SMALL LETTER KRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0138,
+ },
+ {
+ adobename="Lacute",
+ category="lu",
+ contextname="Lacute",
+ description="LATIN CAPITAL LETTER L WITH ACUTE",
+ direction="l",
+ lccode=0x013A,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "char", 0x004C, 0x0301 },
+ unicodeslot=0x0139,
+ },
+ {
+ adobename="lacute",
+ category="ll",
+ contextname="lacute",
+ description="LATIN SMALL LETTER L WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "char", 0x006C, 0x0301 },
+ uccode=0x0139,
+ unicodeslot=0x013A,
+ },
+ {
+ adobename="Lcommaaccent",
+ category="lu",
+ contextname="Lcommaaccent",
+ description="LATIN CAPITAL LETTER L WITH CEDILLA",
+ direction="l",
+ lccode=0x013C,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "char", 0x004C, 0x0327 },
+ unicodeslot=0x013B,
+ },
+ {
+ adobename="lcommaaccent",
+ category="ll",
+ contextname="lcommaaccent",
+ description="LATIN SMALL LETTER L WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "char", 0x006C, 0x0327 },
+ uccode=0x013B,
+ unicodeslot=0x013C,
+ },
+ {
+ adobename="Lcaron",
+ category="lu",
+ contextname="Lcaron",
+ description="LATIN CAPITAL LETTER L WITH CARON",
+ direction="l",
+ lccode=0x013E,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "char", 0x004C, 0x030C },
+ unicodeslot=0x013D,
+ },
+ {
+ adobename="lcaron",
+ category="ll",
+ contextname="lcaron",
+ description="LATIN SMALL LETTER L WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "char", 0x006C, 0x030C },
+ uccode=0x013D,
+ unicodeslot=0x013E,
+ },
+ {
+ adobename="Ldot",
+ category="lu",
+ cjkwd="a",
+ contextname="Ldotmiddle",
+ description="LATIN CAPITAL LETTER L WITH MIDDLE DOT",
+ direction="l",
+ lccode=0x0140,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "compat", 0x004C, 0x00B7 },
+ unicodeslot=0x013F,
+ },
+ {
+ adobename="ldot",
+ category="ll",
+ cjkwd="a",
+ contextname="ldotmiddle",
+ description="LATIN SMALL LETTER L WITH MIDDLE DOT",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "compat", 0x006C, 0x00B7 },
+ uccode=0x013F,
+ unicodeslot=0x0140,
+ },
+ {
+ adobename="Lslash",
+ category="lu",
+ cjkwd="a",
+ contextname="Lstroke",
+ description="LATIN CAPITAL LETTER L WITH STROKE",
+ direction="l",
+ lccode=0x0142,
+ linebreak="al",
+ shcode=0x004C,
+ unicodeslot=0x0141,
+ },
+ {
+ adobename="lslash",
+ category="ll",
+ cjkwd="a",
+ contextname="lstroke",
+ description="LATIN SMALL LETTER L WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ uccode=0x0141,
+ unicodeslot=0x0142,
+ },
+ {
+ adobename="Nacute",
+ category="lu",
+ contextname="Nacute",
+ description="LATIN CAPITAL LETTER N WITH ACUTE",
+ direction="l",
+ lccode=0x0144,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x0301 },
+ unicodeslot=0x0143,
+ },
+ {
+ adobename="nacute",
+ category="ll",
+ cjkwd="a",
+ contextname="nacute",
+ description="LATIN SMALL LETTER N WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x0301 },
+ uccode=0x0143,
+ unicodeslot=0x0144,
+ },
+ {
+ adobename="Ncommaaccent",
+ category="lu",
+ contextname="Ncommaaccent",
+ description="LATIN CAPITAL LETTER N WITH CEDILLA",
+ direction="l",
+ lccode=0x0146,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x0327 },
+ unicodeslot=0x0145,
+ },
+ {
+ adobename="ncommaaccent",
+ category="ll",
+ contextname="ncommaaccent",
+ description="LATIN SMALL LETTER N WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x0327 },
+ uccode=0x0145,
+ unicodeslot=0x0146,
+ },
+ {
+ adobename="Ncaron",
+ category="lu",
+ contextname="Ncaron",
+ description="LATIN CAPITAL LETTER N WITH CARON",
+ direction="l",
+ lccode=0x0148,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x030C },
+ unicodeslot=0x0147,
+ },
+ {
+ adobename="ncaron",
+ category="ll",
+ cjkwd="a",
+ contextname="ncaron",
+ description="LATIN SMALL LETTER N WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x030C },
+ uccode=0x0147,
+ unicodeslot=0x0148,
+ },
+ {
+ adobename="napostrophe",
+ category="ll",
+ cjkwd="a",
+ contextname="napostrophe",
+ description="LATIN SMALL LETTER N PRECEDED BY APOSTROPHE",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x02BC, 0x006E },
+ unicodeslot=0x0149,
+ },
+ {
+ adobename="Eng",
+ category="lu",
+ cjkwd="a",
+ contextname="Neng",
+ description="LATIN CAPITAL LETTER ENG",
+ direction="l",
+ lccode=0x014B,
+ linebreak="al",
+ unicodeslot=0x014A,
+ },
+ {
+ adobename="eng",
+ category="ll",
+ cjkwd="a",
+ contextname="neng",
+ description="LATIN SMALL LETTER ENG",
+ direction="l",
+ linebreak="al",
+ uccode=0x014A,
+ unicodeslot=0x014B,
+ },
+ {
+ adobename="Omacron",
+ category="lu",
+ contextname="Omacron",
+ description="LATIN CAPITAL LETTER O WITH MACRON",
+ direction="l",
+ lccode=0x014D,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0304 },
+ unicodeslot=0x014C,
+ },
+ {
+ adobename="omacron",
+ category="ll",
+ cjkwd="a",
+ contextname="omacron",
+ description="LATIN SMALL LETTER O WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0304 },
+ uccode=0x014C,
+ unicodeslot=0x014D,
+ },
+ {
+ adobename="Obreve",
+ category="lu",
+ contextname="Obreve",
+ description="LATIN CAPITAL LETTER O WITH BREVE",
+ direction="l",
+ lccode=0x014F,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0306 },
+ unicodeslot=0x014E,
+ },
+ {
+ adobename="obreve",
+ category="ll",
+ contextname="obreve",
+ description="LATIN SMALL LETTER O WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0306 },
+ uccode=0x014E,
+ unicodeslot=0x014F,
+ },
+ {
+ adobename="Ohungarumlaut",
+ category="lu",
+ contextname="Ohungarumlaut",
+ description="LATIN CAPITAL LETTER O WITH DOUBLE ACUTE",
+ direction="l",
+ lccode=0x0151,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x030B },
+ unicodeslot=0x0150,
+ },
+ {
+ adobename="ohungarumlaut",
+ category="ll",
+ contextname="ohungarumlaut",
+ description="LATIN SMALL LETTER O WITH DOUBLE ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x030B },
+ uccode=0x0150,
+ unicodeslot=0x0151,
+ },
+ {
+ adobename="OE",
+ category="lu",
+ cjkwd="a",
+ contextname="OEligature",
+ description="LATIN CAPITAL LIGATURE OE",
+ direction="l",
+ lccode=0x0153,
+ linebreak="al",
+ shcode={ 0x004F, 0x0045 },
+ unicodeslot=0x0152,
+ },
+ {
+ adobename="oe",
+ category="ll",
+ cjkwd="a",
+ contextname="oeligature",
+ description="LATIN SMALL LIGATURE OE",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x006F, 0x0065 },
+ uccode=0x0152,
+ unicodeslot=0x0153,
+ },
+ {
+ adobename="Racute",
+ category="lu",
+ contextname="Racute",
+ description="LATIN CAPITAL LETTER R WITH ACUTE",
+ direction="l",
+ lccode=0x0155,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x0301 },
+ unicodeslot=0x0154,
+ },
+ {
+ adobename="racute",
+ category="ll",
+ contextname="racute",
+ description="LATIN SMALL LETTER R WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x0301 },
+ uccode=0x0154,
+ unicodeslot=0x0155,
+ },
+ {
+ adobename="Rcommaaccent",
+ category="lu",
+ contextname="Rcommaaccent",
+ description="LATIN CAPITAL LETTER R WITH CEDILLA",
+ direction="l",
+ lccode=0x0157,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x0327 },
+ unicodeslot=0x0156,
+ },
+ {
+ adobename="rcommaaccent",
+ category="ll",
+ contextname="rcommaaccent",
+ description="LATIN SMALL LETTER R WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x0327 },
+ uccode=0x0156,
+ unicodeslot=0x0157,
+ },
+ {
+ adobename="Rcaron",
+ category="lu",
+ contextname="Rcaron",
+ description="LATIN CAPITAL LETTER R WITH CARON",
+ direction="l",
+ lccode=0x0159,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x030C },
+ unicodeslot=0x0158,
+ },
+ {
+ adobename="rcaron",
+ category="ll",
+ contextname="rcaron",
+ description="LATIN SMALL LETTER R WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x030C },
+ uccode=0x0158,
+ unicodeslot=0x0159,
+ },
+ {
+ adobename="Sacute",
+ category="lu",
+ contextname="Sacute",
+ description="LATIN CAPITAL LETTER S WITH ACUTE",
+ direction="l",
+ lccode=0x015B,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0053, 0x0301 },
+ unicodeslot=0x015A,
+ },
+ {
+ adobename="sacute",
+ category="ll",
+ contextname="sacute",
+ description="LATIN SMALL LETTER S WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0073, 0x0301 },
+ uccode=0x015A,
+ unicodeslot=0x015B,
+ },
+ {
+ adobename="Scircumflex",
+ category="lu",
+ contextname="Scircumflex",
+ description="LATIN CAPITAL LETTER S WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x015D,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0053, 0x0302 },
+ unicodeslot=0x015C,
+ },
+ {
+ adobename="scircumflex",
+ category="ll",
+ contextname="scircumflex",
+ description="LATIN SMALL LETTER S WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0073, 0x0302 },
+ uccode=0x015C,
+ unicodeslot=0x015D,
+ },
+ {
+ adobename="Scedilla",
+ category="lu",
+ contextname="Scedilla",
+ description="LATIN CAPITAL LETTER S WITH CEDILLA",
+ direction="l",
+ lccode=0x015F,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0053, 0x0327 },
+ unicodeslot=0x015E,
+ },
+ {
+ adobename="scedilla",
+ category="ll",
+ contextname="scedilla",
+ description="LATIN SMALL LETTER S WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0073, 0x0327 },
+ uccode=0x015E,
+ unicodeslot=0x015F,
+ },
+ {
+ adobename="Scaron",
+ category="lu",
+ contextname="Scaron",
+ description="LATIN CAPITAL LETTER S WITH CARON",
+ direction="l",
+ lccode=0x0161,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0053, 0x030C },
+ unicodeslot=0x0160,
+ },
+ {
+ adobename="scaron",
+ category="ll",
+ contextname="scaron",
+ description="LATIN SMALL LETTER S WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0073, 0x030C },
+ uccode=0x0160,
+ unicodeslot=0x0161,
+ },
+ {
+ adobename="Tcommaaccent",
+ category="lu",
+ contextname="Tcedilla",
+ description="LATIN CAPITAL LETTER T WITH CEDILLA",
+ direction="l",
+ lccode=0x0163,
+ linebreak="al",
+ shcode=0x0054,
+ specials={ "char", 0x0054, 0x0327 },
+ unicodeslot=0x0162,
+ },
+ {
+ adobename="tcommaaccent",
+ category="ll",
+ contextname="tcedilla",
+ description="LATIN SMALL LETTER T WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x0327 },
+ uccode=0x0162,
+ unicodeslot=0x0163,
+ },
+ {
+ adobename="Tcaron",
+ category="lu",
+ contextname="Tcaron",
+ description="LATIN CAPITAL LETTER T WITH CARON",
+ direction="l",
+ lccode=0x0165,
+ linebreak="al",
+ shcode=0x0054,
+ specials={ "char", 0x0054, 0x030C },
+ unicodeslot=0x0164,
+ },
+ {
+ adobename="tcaron",
+ category="ll",
+ contextname="tcaron",
+ description="LATIN SMALL LETTER T WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x030C },
+ uccode=0x0164,
+ unicodeslot=0x0165,
+ },
+ {
+ adobename="Tbar",
+ category="lu",
+ cjkwd="a",
+ contextname="Tstroke",
+ description="LATIN CAPITAL LETTER T WITH STROKE",
+ direction="l",
+ lccode=0x0167,
+ linebreak="al",
+ shcode=0x0054,
+ unicodeslot=0x0166,
+ },
+ {
+ adobename="tbar",
+ category="ll",
+ cjkwd="a",
+ contextname="tstroke",
+ description="LATIN SMALL LETTER T WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ uccode=0x0166,
+ unicodeslot=0x0167,
+ },
+ {
+ adobename="Utilde",
+ category="lu",
+ contextname="Utilde",
+ description="LATIN CAPITAL LETTER U WITH TILDE",
+ direction="l",
+ lccode=0x0169,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0303 },
+ unicodeslot=0x0168,
+ },
+ {
+ adobename="utilde",
+ category="ll",
+ contextname="utilde",
+ description="LATIN SMALL LETTER U WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0303 },
+ uccode=0x0168,
+ unicodeslot=0x0169,
+ },
+ {
+ adobename="Umacron",
+ category="lu",
+ contextname="Umacron",
+ description="LATIN CAPITAL LETTER U WITH MACRON",
+ direction="l",
+ lccode=0x016B,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0304 },
+ unicodeslot=0x016A,
+ },
+ {
+ adobename="umacron",
+ category="ll",
+ cjkwd="a",
+ contextname="umacron",
+ description="LATIN SMALL LETTER U WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0304 },
+ uccode=0x016A,
+ unicodeslot=0x016B,
+ },
+ {
+ adobename="Ubreve",
+ category="lu",
+ contextname="Ubreve",
+ description="LATIN CAPITAL LETTER U WITH BREVE",
+ direction="l",
+ lccode=0x016D,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0306 },
+ unicodeslot=0x016C,
+ },
+ {
+ adobename="ubreve",
+ category="ll",
+ contextname="ubreve",
+ description="LATIN SMALL LETTER U WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0306 },
+ uccode=0x016C,
+ unicodeslot=0x016D,
+ },
+ {
+ adobename="Uring",
+ category="lu",
+ contextname="Uring",
+ description="LATIN CAPITAL LETTER U WITH RING ABOVE",
+ direction="l",
+ lccode=0x016F,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x030A },
+ unicodeslot=0x016E,
+ },
+ {
+ adobename="uring",
+ category="ll",
+ contextname="uring",
+ description="LATIN SMALL LETTER U WITH RING ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x030A },
+ uccode=0x016E,
+ unicodeslot=0x016F,
+ },
+ {
+ adobename="Uhungarumlaut",
+ category="lu",
+ contextname="Uhungarumlaut",
+ description="LATIN CAPITAL LETTER U WITH DOUBLE ACUTE",
+ direction="l",
+ lccode=0x0171,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x030B },
+ unicodeslot=0x0170,
+ },
+ {
+ adobename="uhungarumlaut",
+ category="ll",
+ contextname="uhungarumlaut",
+ description="LATIN SMALL LETTER U WITH DOUBLE ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x030B },
+ uccode=0x0170,
+ unicodeslot=0x0171,
+ },
+ {
+ adobename="Uogonek",
+ category="lu",
+ contextname="Uogonek",
+ description="LATIN CAPITAL LETTER U WITH OGONEK",
+ direction="l",
+ lccode=0x0173,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0328 },
+ unicodeslot=0x0172,
+ },
+ {
+ adobename="uogonek",
+ category="ll",
+ contextname="uogonek",
+ description="LATIN SMALL LETTER U WITH OGONEK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0328 },
+ uccode=0x0172,
+ unicodeslot=0x0173,
+ },
+ {
+ adobename="Wcircumflex",
+ category="lu",
+ contextname="Wcircumflex",
+ description="LATIN CAPITAL LETTER W WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x0175,
+ linebreak="al",
+ shcode=0x0057,
+ specials={ "char", 0x0057, 0x0302 },
+ unicodeslot=0x0174,
+ },
+ {
+ adobename="wcircumflex",
+ category="ll",
+ contextname="wcircumflex",
+ description="LATIN SMALL LETTER W WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0077,
+ specials={ "char", 0x0077, 0x0302 },
+ uccode=0x0174,
+ unicodeslot=0x0175,
+ },
+ {
+ adobename="Ycircumflex",
+ category="lu",
+ contextname="Ycircumflex",
+ description="LATIN CAPITAL LETTER Y WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x0177,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0302 },
+ unicodeslot=0x0176,
+ },
+ {
+ adobename="ycircumflex",
+ category="ll",
+ contextname="ycircumflex",
+ description="LATIN SMALL LETTER Y WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0302 },
+ uccode=0x0176,
+ unicodeslot=0x0177,
+ },
+ {
+ adobename="Ydieresis",
+ category="lu",
+ contextname="Ydiaeresis",
+ description="LATIN CAPITAL LETTER Y WITH DIAERESIS",
+ direction="l",
+ lccode=0x00FF,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0308 },
+ unicodeslot=0x0178,
+ },
+ {
+ adobename="Zacute",
+ category="lu",
+ contextname="Zacute",
+ description="LATIN CAPITAL LETTER Z WITH ACUTE",
+ direction="l",
+ lccode=0x017A,
+ linebreak="al",
+ shcode=0x005A,
+ specials={ "char", 0x005A, 0x0301 },
+ unicodeslot=0x0179,
+ },
+ {
+ adobename="zacute",
+ category="ll",
+ contextname="zacute",
+ description="LATIN SMALL LETTER Z WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ specials={ "char", 0x007A, 0x0301 },
+ uccode=0x0179,
+ unicodeslot=0x017A,
+ },
+ {
+ adobename="Zdotaccent",
+ category="lu",
+ contextname="Zdotaccent",
+ description="LATIN CAPITAL LETTER Z WITH DOT ABOVE",
+ direction="l",
+ lccode=0x017C,
+ linebreak="al",
+ shcode=0x005A,
+ specials={ "char", 0x005A, 0x0307 },
+ unicodeslot=0x017B,
+ },
+ {
+ adobename="zdotaccent",
+ category="ll",
+ contextname="zdotaccent",
+ description="LATIN SMALL LETTER Z WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ specials={ "char", 0x007A, 0x0307 },
+ uccode=0x017B,
+ unicodeslot=0x017C,
+ },
+ {
+ adobename="Zcaron",
+ category="lu",
+ contextname="Zcaron",
+ description="LATIN CAPITAL LETTER Z WITH CARON",
+ direction="l",
+ lccode=0x017E,
+ linebreak="al",
+ shcode=0x005A,
+ specials={ "char", 0x005A, 0x030C },
+ unicodeslot=0x017D,
+ },
+ {
+ adobename="zcaron",
+ category="ll",
+ contextname="zcaron",
+ description="LATIN SMALL LETTER Z WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ specials={ "char", 0x007A, 0x030C },
+ uccode=0x017D,
+ unicodeslot=0x017E,
+ },
+ {
+ adobename="longs",
+ category="ll",
+ contextname="slong",
+ description="LATIN SMALL LETTER LONG S",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0073 },
+ uccode=0x0053,
+ unicodeslot=0x017F,
+ },
+ {
+ category="ll",
+ contextname="bstroke",
+ description="LATIN SMALL LETTER B WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ uccode=0x0243,
+ unicodeslot=0x0180,
+ },
+ {
+ category="lu",
+ contextname="Bhook",
+ description="LATIN CAPITAL LETTER B WITH HOOK",
+ direction="l",
+ lccode=0x0253,
+ linebreak="al",
+ shcode=0x0042,
+ unicodeslot=0x0181,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER B WITH TOPBAR",
+ direction="l",
+ lccode=0x0183,
+ linebreak="al",
+ shcode=0x0042,
+ unicodeslot=0x0182,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER B WITH TOPBAR",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ uccode=0x0182,
+ unicodeslot=0x0183,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER TONE SIX",
+ direction="l",
+ lccode=0x0185,
+ linebreak="al",
+ unicodeslot=0x0184,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TONE SIX",
+ direction="l",
+ linebreak="al",
+ uccode=0x0184,
+ unicodeslot=0x0185,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER OPEN O",
+ direction="l",
+ lccode=0x0254,
+ linebreak="al",
+ unicodeslot=0x0186,
+ },
+ {
+ category="lu",
+ contextname="Chook",
+ description="LATIN CAPITAL LETTER C WITH HOOK",
+ direction="l",
+ lccode=0x0188,
+ linebreak="al",
+ shcode=0x0043,
+ unicodeslot=0x0187,
+ },
+ {
+ category="ll",
+ contextname="chook",
+ description="LATIN SMALL LETTER C WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ uccode=0x0187,
+ unicodeslot=0x0188,
+ },
+ {
+ category="lu",
+ contextname="Dafrican",
+ description="LATIN CAPITAL LETTER AFRICAN D",
+ direction="l",
+ lccode=0x0256,
+ linebreak="al",
+ unicodeslot=0x0189,
+ },
+ {
+ category="lu",
+ contextname="Dhook",
+ description="LATIN CAPITAL LETTER D WITH HOOK",
+ direction="l",
+ lccode=0x0257,
+ linebreak="al",
+ shcode=0x0044,
+ unicodeslot=0x018A,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER D WITH TOPBAR",
+ direction="l",
+ lccode=0x018C,
+ linebreak="al",
+ shcode=0x0044,
+ unicodeslot=0x018B,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER D WITH TOPBAR",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ uccode=0x018B,
+ unicodeslot=0x018C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED DELTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x018D,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER REVERSED E",
+ direction="l",
+ lccode=0x01DD,
+ linebreak="al",
+ unicodeslot=0x018E,
+ },
+ {
+ category="lu",
+ contextname="Schwa",
+ description="LATIN CAPITAL LETTER SCHWA",
+ direction="l",
+ lccode=0x0259,
+ linebreak="al",
+ unicodeslot=0x018F,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER OPEN E",
+ direction="l",
+ lccode=0x025B,
+ linebreak="al",
+ unicodeslot=0x0190,
+ },
+ {
+ category="lu",
+ contextname="Fhook",
+ description="LATIN CAPITAL LETTER F WITH HOOK",
+ direction="l",
+ lccode=0x0192,
+ linebreak="al",
+ shcode=0x0046,
+ unicodeslot=0x0191,
+ },
+ {
+ adobename="florin",
+ category="ll",
+ contextname="fhook",
+ description="LATIN SMALL LETTER F WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0066,
+ uccode=0x0191,
+ unicodeslot=0x0192,
+ },
+ {
+ category="lu",
+ contextname="Ghook",
+ description="LATIN CAPITAL LETTER G WITH HOOK",
+ direction="l",
+ lccode=0x0260,
+ linebreak="al",
+ shcode=0x0047,
+ unicodeslot=0x0193,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER GAMMA",
+ direction="l",
+ lccode=0x0263,
+ linebreak="al",
+ unicodeslot=0x0194,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER HV",
+ direction="l",
+ linebreak="al",
+ uccode=0x01F6,
+ unicodeslot=0x0195,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER IOTA",
+ direction="l",
+ lccode=0x0269,
+ linebreak="al",
+ unicodeslot=0x0196,
+ },
+ {
+ category="lu",
+ contextname="Istroke",
+ description="LATIN CAPITAL LETTER I WITH STROKE",
+ direction="l",
+ lccode=0x0268,
+ linebreak="al",
+ shcode=0x0049,
+ unicodeslot=0x0197,
+ },
+ {
+ category="lu",
+ contextname="Khook",
+ description="LATIN CAPITAL LETTER K WITH HOOK",
+ direction="l",
+ lccode=0x0199,
+ linebreak="al",
+ shcode=0x004B,
+ unicodeslot=0x0198,
+ },
+ {
+ category="ll",
+ contextname="khook",
+ description="LATIN SMALL LETTER K WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ uccode=0x0198,
+ unicodeslot=0x0199,
+ },
+ {
+ category="ll",
+ contextname="lbar",
+ description="LATIN SMALL LETTER L WITH BAR",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ uccode=0x023D,
+ unicodeslot=0x019A,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER LAMBDA WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x019B,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER TURNED M",
+ direction="l",
+ lccode=0x026F,
+ linebreak="al",
+ unicodeslot=0x019C,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER N WITH LEFT HOOK",
+ direction="l",
+ lccode=0x0272,
+ linebreak="al",
+ shcode=0x004E,
+ unicodeslot=0x019D,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER N WITH LONG RIGHT LEG",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ uccode=0x0220,
+ unicodeslot=0x019E,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER O WITH MIDDLE TILDE",
+ direction="l",
+ lccode=0x0275,
+ linebreak="al",
+ shcode=0x004F,
+ unicodeslot=0x019F,
+ },
+ {
+ adobename="Ohorn",
+ category="lu",
+ contextname="Ohorn",
+ description="LATIN CAPITAL LETTER O WITH HORN",
+ direction="l",
+ lccode=0x01A1,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x031B },
+ unicodeslot=0x01A0,
+ },
+ {
+ adobename="ohorn",
+ category="ll",
+ contextname="ohorn",
+ description="LATIN SMALL LETTER O WITH HORN",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x031B },
+ uccode=0x01A0,
+ unicodeslot=0x01A1,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER OI",
+ direction="l",
+ lccode=0x01A3,
+ linebreak="al",
+ unicodeslot=0x01A2,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER OI",
+ direction="l",
+ linebreak="al",
+ uccode=0x01A2,
+ unicodeslot=0x01A3,
+ },
+ {
+ category="lu",
+ contextname="Phook",
+ description="LATIN CAPITAL LETTER P WITH HOOK",
+ direction="l",
+ lccode=0x01A5,
+ linebreak="al",
+ shcode=0x0050,
+ unicodeslot=0x01A4,
+ },
+ {
+ category="ll",
+ contextname="phook",
+ description="LATIN SMALL LETTER P WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0070,
+ uccode=0x01A4,
+ unicodeslot=0x01A5,
+ },
+ {
+ category="lu",
+ description="LATIN LETTER YR",
+ direction="l",
+ lccode=0x0280,
+ linebreak="al",
+ unicodeslot=0x01A6,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER TONE TWO",
+ direction="l",
+ lccode=0x01A8,
+ linebreak="al",
+ unicodeslot=0x01A7,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TONE TWO",
+ direction="l",
+ linebreak="al",
+ uccode=0x01A7,
+ unicodeslot=0x01A8,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER ESH",
+ direction="l",
+ lccode=0x0283,
+ linebreak="al",
+ unicodeslot=0x01A9,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER REVERSED ESH LOOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x01AA,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER T WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ unicodeslot=0x01AB,
+ },
+ {
+ category="lu",
+ contextname="Thook",
+ description="LATIN CAPITAL LETTER T WITH HOOK",
+ direction="l",
+ lccode=0x01AD,
+ linebreak="al",
+ shcode=0x0054,
+ unicodeslot=0x01AC,
+ },
+ {
+ category="ll",
+ contextname="thook",
+ description="LATIN SMALL LETTER T WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ uccode=0x01AC,
+ unicodeslot=0x01AD,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER T WITH RETROFLEX HOOK",
+ direction="l",
+ lccode=0x0288,
+ linebreak="al",
+ shcode=0x0054,
+ unicodeslot=0x01AE,
+ },
+ {
+ adobename="Uhorn",
+ category="lu",
+ contextname="Uhorn",
+ description="LATIN CAPITAL LETTER U WITH HORN",
+ direction="l",
+ lccode=0x01B0,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x031B },
+ unicodeslot=0x01AF,
+ },
+ {
+ adobename="uhorn",
+ category="ll",
+ contextname="uhorn",
+ description="LATIN SMALL LETTER U WITH HORN",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x031B },
+ uccode=0x01AF,
+ unicodeslot=0x01B0,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER UPSILON",
+ direction="l",
+ lccode=0x028A,
+ linebreak="al",
+ unicodeslot=0x01B1,
+ },
+ {
+ category="lu",
+ contextname="Uhook",
+ description="LATIN CAPITAL LETTER V WITH HOOK",
+ direction="l",
+ lccode=0x028B,
+ linebreak="al",
+ shcode=0x0056,
+ unicodeslot=0x01B2,
+ },
+ {
+ category="lu",
+ contextname="Yhook",
+ description="LATIN CAPITAL LETTER Y WITH HOOK",
+ direction="l",
+ lccode=0x01B4,
+ linebreak="al",
+ shcode=0x0059,
+ unicodeslot=0x01B3,
+ },
+ {
+ category="ll",
+ contextname="yhook",
+ description="LATIN SMALL LETTER Y WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ uccode=0x01B3,
+ unicodeslot=0x01B4,
+ },
+ {
+ category="lu",
+ contextname="Zstroke",
+ description="LATIN CAPITAL LETTER Z WITH STROKE",
+ direction="l",
+ lccode=0x01B6,
+ linebreak="al",
+ shcode=0x005A,
+ unicodeslot=0x01B5,
+ },
+ {
+ category="ll",
+ contextname="zstroke",
+ description="LATIN SMALL LETTER Z WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ uccode=0x01B5,
+ unicodeslot=0x01B6,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER EZH",
+ direction="l",
+ lccode=0x0292,
+ linebreak="al",
+ unicodeslot=0x01B7,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER EZH REVERSED",
+ direction="l",
+ lccode=0x01B9,
+ linebreak="al",
+ unicodeslot=0x01B8,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER EZH REVERSED",
+ direction="l",
+ linebreak="al",
+ uccode=0x01B8,
+ unicodeslot=0x01B9,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER EZH WITH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0292,
+ unicodeslot=0x01BA,
+ },
+ {
+ category="lo",
+ description="LATIN LETTER TWO WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x01BB,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER TONE FIVE",
+ direction="l",
+ lccode=0x01BD,
+ linebreak="al",
+ unicodeslot=0x01BC,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TONE FIVE",
+ direction="l",
+ linebreak="al",
+ uccode=0x01BC,
+ unicodeslot=0x01BD,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x01BE,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER WYNN",
+ direction="l",
+ linebreak="al",
+ uccode=0x01F7,
+ unicodeslot=0x01BF,
+ },
+ {
+ category="lo",
+ description="LATIN LETTER DENTAL CLICK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x01C0,
+ },
+ {
+ category="lo",
+ description="LATIN LETTER LATERAL CLICK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x01C1,
+ },
+ {
+ category="lo",
+ description="LATIN LETTER ALVEOLAR CLICK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x01C2,
+ },
+ {
+ category="lo",
+ description="LATIN LETTER RETROFLEX CLICK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x01C3,
+ },
+ {
+ category="lu",
+ contextname="DZcaronligature",
+ description="LATIN CAPITAL LETTER DZ WITH CARON",
+ direction="l",
+ lccode=0x01C6,
+ linebreak="al",
+ shcode=0x01F1,
+ specials={ "compat", 0x0044, 0x017D },
+ uccode=0x01C5,
+ unicodeslot=0x01C4,
+ },
+ {
+ category="lt",
+ contextname="Dzcaronligature",
+ description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON",
+ direction="l",
+ lccode=0x01C6,
+ linebreak="al",
+ shcode=0x01F2,
+ specials={ "compat", 0x0044, 0x017E },
+ uccode=0x01C4,
+ unicodeslot=0x01C5,
+ },
+ {
+ category="ll",
+ contextname="dzcaronligature",
+ description="LATIN SMALL LETTER DZ WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x01F3,
+ specials={ "compat", 0x0064, 0x017E },
+ uccode=0x01C4,
+ unicodeslot=0x01C6,
+ },
+ {
+ category="lu",
+ contextname="LJligature",
+ description="LATIN CAPITAL LETTER LJ",
+ direction="l",
+ lccode=0x01C9,
+ linebreak="al",
+ shcode={ 0x004C, 0x004A },
+ specials={ "compat", 0x004C, 0x004A },
+ uccode=0x01C8,
+ unicodeslot=0x01C7,
+ },
+ {
+ category="lt",
+ contextname="Ljligature",
+ description="LATIN CAPITAL LETTER L WITH SMALL LETTER J",
+ direction="l",
+ lccode=0x01C9,
+ linebreak="al",
+ shcode={ 0x004C, 0x006A },
+ specials={ "compat", 0x004C, 0x006A },
+ uccode=0x01C7,
+ unicodeslot=0x01C8,
+ },
+ {
+ category="ll",
+ contextname="ljligature",
+ description="LATIN SMALL LETTER LJ",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x006C, 0x006A },
+ specials={ "compat", 0x006C, 0x006A },
+ uccode=0x01C7,
+ unicodeslot=0x01C9,
+ },
+ {
+ category="lu",
+ contextname="NJligature",
+ description="LATIN CAPITAL LETTER NJ",
+ direction="l",
+ lccode=0x01CC,
+ linebreak="al",
+ shcode={ 0x004E, 0x004A },
+ specials={ "compat", 0x004E, 0x004A },
+ uccode=0x01CB,
+ unicodeslot=0x01CA,
+ },
+ {
+ category="lt",
+ contextname="Njligature",
+ description="LATIN CAPITAL LETTER N WITH SMALL LETTER J",
+ direction="l",
+ lccode=0x01CC,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "compat", 0x004E, 0x006A },
+ uccode=0x01CA,
+ unicodeslot=0x01CB,
+ },
+ {
+ category="ll",
+ contextname="njligature",
+ description="LATIN SMALL LETTER NJ",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x006E, 0x006A },
+ specials={ "compat", 0x006E, 0x006A },
+ uccode=0x01CA,
+ unicodeslot=0x01CC,
+ },
+ {
+ category="lu",
+ contextname="Acaron",
+ description="LATIN CAPITAL LETTER A WITH CARON",
+ direction="l",
+ lccode=0x01CE,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x030C },
+ unicodeslot=0x01CD,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="acaron",
+ description="LATIN SMALL LETTER A WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x030C },
+ uccode=0x01CD,
+ unicodeslot=0x01CE,
+ },
+ {
+ category="lu",
+ contextname="Icaron",
+ description="LATIN CAPITAL LETTER I WITH CARON",
+ direction="l",
+ lccode=0x01D0,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x030C },
+ unicodeslot=0x01CF,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="icaron",
+ description="LATIN SMALL LETTER I WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x030C },
+ uccode=0x01CF,
+ unicodeslot=0x01D0,
+ },
+ {
+ category="lu",
+ contextname="Ocaron",
+ description="LATIN CAPITAL LETTER O WITH CARON",
+ direction="l",
+ lccode=0x01D2,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x030C },
+ unicodeslot=0x01D1,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="ocaron",
+ description="LATIN SMALL LETTER O WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x030C },
+ uccode=0x01D1,
+ unicodeslot=0x01D2,
+ },
+ {
+ category="lu",
+ contextname="Ucaron",
+ description="LATIN CAPITAL LETTER U WITH CARON",
+ direction="l",
+ lccode=0x01D4,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x030C },
+ unicodeslot=0x01D3,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="ucaron",
+ description="LATIN SMALL LETTER U WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x030C },
+ uccode=0x01D3,
+ unicodeslot=0x01D4,
+ },
+ {
+ category="lu",
+ contextname="Udiaeresismacron",
+ description="LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON",
+ direction="l",
+ lccode=0x01D6,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x00DC, 0x0304 },
+ unicodeslot=0x01D5,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="udiaeresismacron",
+ description="LATIN SMALL LETTER U WITH DIAERESIS AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x00FC, 0x0304 },
+ uccode=0x01D5,
+ unicodeslot=0x01D6,
+ },
+ {
+ category="lu",
+ contextname="Udiaeresisacute",
+ description="LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE",
+ direction="l",
+ lccode=0x01D8,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x00DC, 0x0301 },
+ unicodeslot=0x01D7,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="udiaeresisacute",
+ description="LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x00FC, 0x0301 },
+ uccode=0x01D7,
+ unicodeslot=0x01D8,
+ },
+ {
+ category="lu",
+ contextname="Udiaeresiscaron",
+ description="LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON",
+ direction="l",
+ lccode=0x01DA,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x00DC, 0x030C },
+ unicodeslot=0x01D9,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="udiaeresiscaron",
+ description="LATIN SMALL LETTER U WITH DIAERESIS AND CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x00FC, 0x030C },
+ uccode=0x01D9,
+ unicodeslot=0x01DA,
+ },
+ {
+ category="lu",
+ contextname="Udiaeresisgrave",
+ description="LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE",
+ direction="l",
+ lccode=0x01DC,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x00DC, 0x0300 },
+ unicodeslot=0x01DB,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ contextname="udiaeresisgrave",
+ description="LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x00FC, 0x0300 },
+ uccode=0x01DB,
+ unicodeslot=0x01DC,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED E",
+ direction="l",
+ linebreak="al",
+ uccode=0x018E,
+ unicodeslot=0x01DD,
+ },
+ {
+ category="lu",
+ contextname="Adiaeresismacron",
+ description="LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON",
+ direction="l",
+ lccode=0x01DF,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x00C4, 0x0304 },
+ unicodeslot=0x01DE,
+ },
+ {
+ category="ll",
+ contextname="adiaeresismacron",
+ description="LATIN SMALL LETTER A WITH DIAERESIS AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x00E4, 0x0304 },
+ uccode=0x01DE,
+ unicodeslot=0x01DF,
+ },
+ {
+ category="lu",
+ contextname="Adotaccentmacron",
+ description="LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON",
+ direction="l",
+ lccode=0x01E1,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0226, 0x0304 },
+ unicodeslot=0x01E0,
+ },
+ {
+ category="ll",
+ contextname="adotaccentmacron",
+ description="LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0227, 0x0304 },
+ uccode=0x01E0,
+ unicodeslot=0x01E1,
+ },
+ {
+ category="lu",
+ contextname="AEmacron",
+ description="LATIN CAPITAL LETTER AE WITH MACRON",
+ direction="l",
+ lccode=0x01E3,
+ linebreak="al",
+ shcode=0x00C6,
+ specials={ "char", 0x00C6, 0x0304 },
+ unicodeslot=0x01E2,
+ },
+ {
+ category="ll",
+ contextname="aemacron",
+ description="LATIN SMALL LETTER AE WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x00E6,
+ specials={ "char", 0x00E6, 0x0304 },
+ uccode=0x01E2,
+ unicodeslot=0x01E3,
+ },
+ {
+ category="lu",
+ contextname="Gstroke",
+ description="LATIN CAPITAL LETTER G WITH STROKE",
+ direction="l",
+ lccode=0x01E5,
+ linebreak="al",
+ shcode=0x0047,
+ unicodeslot=0x01E4,
+ },
+ {
+ category="ll",
+ contextname="gstroke",
+ description="LATIN SMALL LETTER G WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ uccode=0x01E4,
+ unicodeslot=0x01E5,
+ },
+ {
+ adobename="Gcaron",
+ category="lu",
+ contextname="Gcaron",
+ description="LATIN CAPITAL LETTER G WITH CARON",
+ direction="l",
+ lccode=0x01E7,
+ linebreak="al",
+ shcode=0x0047,
+ specials={ "char", 0x0047, 0x030C },
+ unicodeslot=0x01E6,
+ },
+ {
+ adobename="gcaron",
+ category="ll",
+ contextname="gcaron",
+ description="LATIN SMALL LETTER G WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ specials={ "char", 0x0067, 0x030C },
+ uccode=0x01E6,
+ unicodeslot=0x01E7,
+ },
+ {
+ category="lu",
+ contextname="Kcaron",
+ description="LATIN CAPITAL LETTER K WITH CARON",
+ direction="l",
+ lccode=0x01E9,
+ linebreak="al",
+ shcode=0x004B,
+ specials={ "char", 0x004B, 0x030C },
+ unicodeslot=0x01E8,
+ },
+ {
+ category="ll",
+ contextname="kcaron",
+ description="LATIN SMALL LETTER K WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ specials={ "char", 0x006B, 0x030C },
+ uccode=0x01E8,
+ unicodeslot=0x01E9,
+ },
+ {
+ category="lu",
+ contextname="Oogonek",
+ description="LATIN CAPITAL LETTER O WITH OGONEK",
+ direction="l",
+ lccode=0x01EB,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0328 },
+ unicodeslot=0x01EA,
+ },
+ {
+ category="ll",
+ contextname="oogonek",
+ description="LATIN SMALL LETTER O WITH OGONEK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0328 },
+ uccode=0x01EA,
+ unicodeslot=0x01EB,
+ },
+ {
+ category="lu",
+ contextname="Oogonekmacron",
+ description="LATIN CAPITAL LETTER O WITH OGONEK AND MACRON",
+ direction="l",
+ lccode=0x01ED,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x01EA, 0x0304 },
+ unicodeslot=0x01EC,
+ },
+ {
+ category="ll",
+ contextname="oogonekmacron",
+ description="LATIN SMALL LETTER O WITH OGONEK AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x01EB, 0x0304 },
+ uccode=0x01EC,
+ unicodeslot=0x01ED,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER EZH WITH CARON",
+ direction="l",
+ lccode=0x01EF,
+ linebreak="al",
+ shcode=0x01B7,
+ specials={ "char", 0x01B7, 0x030C },
+ unicodeslot=0x01EE,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER EZH WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0292,
+ specials={ "char", 0x0292, 0x030C },
+ uccode=0x01EE,
+ unicodeslot=0x01EF,
+ },
+ {
+ category="ll",
+ contextname="jcaron",
+ description="LATIN SMALL LETTER J WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006A,
+ specials={ "char", 0x006A, 0x030C },
+ unicodeslot=0x01F0,
+ },
+ {
+ category="lu",
+ contextname="DZligature",
+ description="LATIN CAPITAL LETTER DZ",
+ direction="l",
+ lccode=0x01F3,
+ linebreak="al",
+ specials={ "compat", 0x0044, 0x005A },
+ uccode=0x01F2,
+ unicodeslot=0x01F1,
+ },
+ {
+ category="lt",
+ contextname="Dzligature",
+ description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z",
+ direction="l",
+ lccode=0x01F3,
+ linebreak="al",
+ shcode=0x0044,
+ specials={ "compat", 0x0044, 0x007A },
+ uccode=0x01F1,
+ unicodeslot=0x01F2,
+ },
+ {
+ category="ll",
+ contextname="dzligature",
+ description="LATIN SMALL LETTER DZ",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0064, 0x007A },
+ uccode=0x01F1,
+ unicodeslot=0x01F3,
+ },
+ {
+ category="lu",
+ contextname="Gacute",
+ description="LATIN CAPITAL LETTER G WITH ACUTE",
+ direction="l",
+ lccode=0x01F5,
+ linebreak="al",
+ shcode=0x0047,
+ specials={ "char", 0x0047, 0x0301 },
+ unicodeslot=0x01F4,
+ },
+ {
+ category="ll",
+ contextname="gacute",
+ description="LATIN SMALL LETTER G WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ specials={ "char", 0x0067, 0x0301 },
+ uccode=0x01F4,
+ unicodeslot=0x01F5,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER HWAIR",
+ direction="l",
+ lccode=0x0195,
+ linebreak="al",
+ unicodeslot=0x01F6,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER WYNN",
+ direction="l",
+ lccode=0x01BF,
+ linebreak="al",
+ unicodeslot=0x01F7,
+ },
+ {
+ category="lu",
+ contextname="Ngrave",
+ description="LATIN CAPITAL LETTER N WITH GRAVE",
+ direction="l",
+ lccode=0x01F9,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x0300 },
+ unicodeslot=0x01F8,
+ },
+ {
+ category="ll",
+ contextname="ngrave",
+ description="LATIN SMALL LETTER N WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x0300 },
+ uccode=0x01F8,
+ unicodeslot=0x01F9,
+ },
+ {
+ adobename="Aringacute",
+ category="lu",
+ contextname="Aringacute",
+ description="LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE",
+ direction="l",
+ lccode=0x01FB,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x00C5, 0x0301 },
+ unicodeslot=0x01FA,
+ },
+ {
+ adobename="aringacute",
+ category="ll",
+ contextname="aringacute",
+ description="LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x00E5, 0x0301 },
+ uccode=0x01FA,
+ unicodeslot=0x01FB,
+ },
+ {
+ adobename="AEacute",
+ category="lu",
+ contextname="AEacute",
+ description="LATIN CAPITAL LETTER AE WITH ACUTE",
+ direction="l",
+ lccode=0x01FD,
+ linebreak="al",
+ shcode=0x00C6,
+ specials={ "char", 0x00C6, 0x0301 },
+ unicodeslot=0x01FC,
+ },
+ {
+ adobename="aeacute",
+ category="ll",
+ contextname="aeacute",
+ description="LATIN SMALL LETTER AE WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x00E6,
+ specials={ "char", 0x00E6, 0x0301 },
+ uccode=0x01FC,
+ unicodeslot=0x01FD,
+ },
+ {
+ adobename="Oslashacute",
+ category="lu",
+ contextname="Ostrokeacute",
+ description="LATIN CAPITAL LETTER O WITH STROKE AND ACUTE",
+ direction="l",
+ lccode=0x01FF,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D8, 0x0301 },
+ unicodeslot=0x01FE,
+ },
+ {
+ adobename="oslashacute",
+ category="ll",
+ contextname="ostrokeacute",
+ description="LATIN SMALL LETTER O WITH STROKE AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F8, 0x0301 },
+ uccode=0x01FE,
+ unicodeslot=0x01FF,
+ },
+ {
+ category="lu",
+ contextname="Adoublegrave",
+ description="LATIN CAPITAL LETTER A WITH DOUBLE GRAVE",
+ direction="l",
+ lccode=0x0201,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x030F },
+ unicodeslot=0x0200,
+ },
+ {
+ category="ll",
+ contextname="adoublegrave",
+ description="LATIN SMALL LETTER A WITH DOUBLE GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x030F },
+ uccode=0x0200,
+ unicodeslot=0x0201,
+ },
+ {
+ category="lu",
+ contextname="Ainvertedbreve",
+ description="LATIN CAPITAL LETTER A WITH INVERTED BREVE",
+ direction="l",
+ lccode=0x0203,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0311 },
+ unicodeslot=0x0202,
+ },
+ {
+ category="ll",
+ contextname="ainvertedbreve",
+ description="LATIN SMALL LETTER A WITH INVERTED BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0311 },
+ uccode=0x0202,
+ unicodeslot=0x0203,
+ },
+ {
+ category="lu",
+ contextname="Edoublegrave",
+ description="LATIN CAPITAL LETTER E WITH DOUBLE GRAVE",
+ direction="l",
+ lccode=0x0205,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x030F },
+ unicodeslot=0x0204,
+ },
+ {
+ category="ll",
+ contextname="edoublegrave",
+ description="LATIN SMALL LETTER E WITH DOUBLE GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x030F },
+ uccode=0x0204,
+ unicodeslot=0x0205,
+ },
+ {
+ category="lu",
+ contextname="Einvertedbreve",
+ description="LATIN CAPITAL LETTER E WITH INVERTED BREVE",
+ direction="l",
+ lccode=0x0207,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0311 },
+ unicodeslot=0x0206,
+ },
+ {
+ category="ll",
+ contextname="einvertedbreve",
+ description="LATIN SMALL LETTER E WITH INVERTED BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0311 },
+ uccode=0x0206,
+ unicodeslot=0x0207,
+ },
+ {
+ category="lu",
+ contextname="Idoublegrave",
+ description="LATIN CAPITAL LETTER I WITH DOUBLE GRAVE",
+ direction="l",
+ lccode=0x0209,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x030F },
+ unicodeslot=0x0208,
+ },
+ {
+ category="ll",
+ contextname="idoublegrave",
+ description="LATIN SMALL LETTER I WITH DOUBLE GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x030F },
+ uccode=0x0208,
+ unicodeslot=0x0209,
+ },
+ {
+ category="lu",
+ contextname="Iinvertedbreve",
+ description="LATIN CAPITAL LETTER I WITH INVERTED BREVE",
+ direction="l",
+ lccode=0x020B,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0311 },
+ unicodeslot=0x020A,
+ },
+ {
+ category="ll",
+ contextname="iinvertedbreve",
+ description="LATIN SMALL LETTER I WITH INVERTED BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0311 },
+ uccode=0x020A,
+ unicodeslot=0x020B,
+ },
+ {
+ category="lu",
+ contextname="Odoublegrave",
+ description="LATIN CAPITAL LETTER O WITH DOUBLE GRAVE",
+ direction="l",
+ lccode=0x020D,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x030F },
+ unicodeslot=0x020C,
+ },
+ {
+ category="ll",
+ contextname="odoublegrave",
+ description="LATIN SMALL LETTER O WITH DOUBLE GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x030F },
+ uccode=0x020C,
+ unicodeslot=0x020D,
+ },
+ {
+ category="lu",
+ contextname="Oinvertedbreve",
+ description="LATIN CAPITAL LETTER O WITH INVERTED BREVE",
+ direction="l",
+ lccode=0x020F,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0311 },
+ unicodeslot=0x020E,
+ },
+ {
+ category="ll",
+ contextname="oinvertedbreve",
+ description="LATIN SMALL LETTER O WITH INVERTED BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0311 },
+ uccode=0x020E,
+ unicodeslot=0x020F,
+ },
+ {
+ category="lu",
+ contextname="Rdoublegrave",
+ description="LATIN CAPITAL LETTER R WITH DOUBLE GRAVE",
+ direction="l",
+ lccode=0x0211,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x030F },
+ unicodeslot=0x0210,
+ },
+ {
+ category="ll",
+ contextname="rdoublegrave",
+ description="LATIN SMALL LETTER R WITH DOUBLE GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x030F },
+ uccode=0x0210,
+ unicodeslot=0x0211,
+ },
+ {
+ category="lu",
+ contextname="Rinvertedbreve",
+ description="LATIN CAPITAL LETTER R WITH INVERTED BREVE",
+ direction="l",
+ lccode=0x0213,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x0311 },
+ unicodeslot=0x0212,
+ },
+ {
+ category="ll",
+ contextname="rinvertedbreve",
+ description="LATIN SMALL LETTER R WITH INVERTED BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x0311 },
+ uccode=0x0212,
+ unicodeslot=0x0213,
+ },
+ {
+ category="lu",
+ contextname="Udoublegrave",
+ description="LATIN CAPITAL LETTER U WITH DOUBLE GRAVE",
+ direction="l",
+ lccode=0x0215,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x030F },
+ unicodeslot=0x0214,
+ },
+ {
+ category="ll",
+ contextname="udoublegrave",
+ description="LATIN SMALL LETTER U WITH DOUBLE GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x030F },
+ uccode=0x0214,
+ unicodeslot=0x0215,
+ },
+ {
+ category="lu",
+ contextname="Uinvertedbreve",
+ description="LATIN CAPITAL LETTER U WITH INVERTED BREVE",
+ direction="l",
+ lccode=0x0217,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0311 },
+ unicodeslot=0x0216,
+ },
+ {
+ category="ll",
+ contextname="uinvertedbreve",
+ description="LATIN SMALL LETTER U WITH INVERTED BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0311 },
+ uccode=0x0216,
+ unicodeslot=0x0217,
+ },
+ {
+ adobename="Scommaaccent",
+ category="lu",
+ contextname="Scommaaccent",
+ description="LATIN CAPITAL LETTER S WITH COMMA BELOW",
+ direction="l",
+ lccode=0x0219,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0053, 0x0326 },
+ unicodeslot=0x0218,
+ },
+ {
+ adobename="scommaaccent",
+ category="ll",
+ contextname="scommaaccent",
+ description="LATIN SMALL LETTER S WITH COMMA BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0073, 0x0326 },
+ uccode=0x0218,
+ unicodeslot=0x0219,
+ },
+ {
+ category="lu",
+ contextname="Tcommaaccent",
+ description="LATIN CAPITAL LETTER T WITH COMMA BELOW",
+ direction="l",
+ lccode=0x021B,
+ linebreak="al",
+ shcode=0x0054,
+ specials={ "char", 0x0054, 0x0326 },
+ unicodeslot=0x021A,
+ },
+ {
+ category="ll",
+ contextname="tcommaaccent",
+ description="LATIN SMALL LETTER T WITH COMMA BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x0326 },
+ uccode=0x021A,
+ unicodeslot=0x021B,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER YOGH",
+ direction="l",
+ lccode=0x021D,
+ linebreak="al",
+ unicodeslot=0x021C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER YOGH",
+ direction="l",
+ linebreak="al",
+ uccode=0x021C,
+ unicodeslot=0x021D,
+ },
+ {
+ category="lu",
+ contextname="Hcaron",
+ description="LATIN CAPITAL LETTER H WITH CARON",
+ direction="l",
+ lccode=0x021F,
+ linebreak="al",
+ shcode=0x0048,
+ specials={ "char", 0x0048, 0x030C },
+ unicodeslot=0x021E,
+ },
+ {
+ category="ll",
+ contextname="hcaron",
+ description="LATIN SMALL LETTER H WITH CARON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x030C },
+ uccode=0x021E,
+ unicodeslot=0x021F,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER N WITH LONG RIGHT LEG",
+ direction="l",
+ lccode=0x019E,
+ linebreak="al",
+ shcode=0x004E,
+ unicodeslot=0x0220,
+ },
+ {
+ category="ll",
+ contextname="dcurl",
+ description="LATIN SMALL LETTER D WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ unicodeslot=0x0221,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER OU",
+ direction="l",
+ lccode=0x0223,
+ linebreak="al",
+ unicodeslot=0x0222,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER OU",
+ direction="l",
+ linebreak="al",
+ uccode=0x0222,
+ unicodeslot=0x0223,
+ },
+ {
+ category="lu",
+ contextname="Zhook",
+ description="LATIN CAPITAL LETTER Z WITH HOOK",
+ direction="l",
+ lccode=0x0225,
+ linebreak="al",
+ shcode=0x005A,
+ unicodeslot=0x0224,
+ },
+ {
+ category="ll",
+ contextname="zhook",
+ description="LATIN SMALL LETTER Z WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ uccode=0x0224,
+ unicodeslot=0x0225,
+ },
+ {
+ category="lu",
+ contextname="Adotaccent",
+ description="LATIN CAPITAL LETTER A WITH DOT ABOVE",
+ direction="l",
+ lccode=0x0227,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0307 },
+ unicodeslot=0x0226,
+ },
+ {
+ category="ll",
+ contextname="adotaccent",
+ description="LATIN SMALL LETTER A WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0307 },
+ uccode=0x0226,
+ unicodeslot=0x0227,
+ },
+ {
+ category="lu",
+ contextname="Ecedilla",
+ description="LATIN CAPITAL LETTER E WITH CEDILLA",
+ direction="l",
+ lccode=0x0229,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0327 },
+ unicodeslot=0x0228,
+ },
+ {
+ category="ll",
+ contextname="ecedilla",
+ description="LATIN SMALL LETTER E WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0327 },
+ uccode=0x0228,
+ unicodeslot=0x0229,
+ },
+ {
+ category="lu",
+ contextname="Odiaeresismacron",
+ description="LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON",
+ direction="l",
+ lccode=0x022B,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D6, 0x0304 },
+ unicodeslot=0x022A,
+ },
+ {
+ category="ll",
+ contextname="odiaeresismacron",
+ description="LATIN SMALL LETTER O WITH DIAERESIS AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F6, 0x0304 },
+ uccode=0x022A,
+ unicodeslot=0x022B,
+ },
+ {
+ category="lu",
+ contextname="Otildemacron",
+ description="LATIN CAPITAL LETTER O WITH TILDE AND MACRON",
+ direction="l",
+ lccode=0x022D,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D5, 0x0304 },
+ unicodeslot=0x022C,
+ },
+ {
+ category="ll",
+ contextname="otildemacron",
+ description="LATIN SMALL LETTER O WITH TILDE AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F5, 0x0304 },
+ uccode=0x022C,
+ unicodeslot=0x022D,
+ },
+ {
+ category="lu",
+ contextname="Odotaccent",
+ description="LATIN CAPITAL LETTER O WITH DOT ABOVE",
+ direction="l",
+ lccode=0x022F,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0307 },
+ unicodeslot=0x022E,
+ },
+ {
+ category="ll",
+ contextname="odotaccent",
+ description="LATIN SMALL LETTER O WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0307 },
+ uccode=0x022E,
+ unicodeslot=0x022F,
+ },
+ {
+ category="lu",
+ contextname="Odotaccentmacron",
+ description="LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON",
+ direction="l",
+ lccode=0x0231,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x022E, 0x0304 },
+ unicodeslot=0x0230,
+ },
+ {
+ category="ll",
+ contextname="odotaccentmacron",
+ description="LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x022F, 0x0304 },
+ uccode=0x0230,
+ unicodeslot=0x0231,
+ },
+ {
+ category="lu",
+ contextname="Ymacron",
+ description="LATIN CAPITAL LETTER Y WITH MACRON",
+ direction="l",
+ lccode=0x0233,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0304 },
+ unicodeslot=0x0232,
+ },
+ {
+ category="ll",
+ contextname="ymacron",
+ description="LATIN SMALL LETTER Y WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0304 },
+ uccode=0x0232,
+ unicodeslot=0x0233,
+ },
+ {
+ category="ll",
+ contextname="lcurl",
+ description="LATIN SMALL LETTER L WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ unicodeslot=0x0234,
+ },
+ {
+ category="ll",
+ contextname="ncurl",
+ description="LATIN SMALL LETTER N WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ unicodeslot=0x0235,
+ },
+ {
+ category="ll",
+ contextname="tcurl",
+ description="LATIN SMALL LETTER T WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ unicodeslot=0x0236,
+ },
+ {
+ category="ll",
+ contextname="dotlessj",
+ description="LATIN SMALL LETTER DOTLESS J",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0237,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER DB DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0238,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER QP DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0239,
+ },
+ {
+ category="lu",
+ contextname="Astroke",
+ description="LATIN CAPITAL LETTER A WITH STROKE",
+ direction="l",
+ lccode=0x2C65,
+ linebreak="al",
+ shcode=0x0041,
+ unicodeslot=0x023A,
+ },
+ {
+ category="lu",
+ contextname="Cstroke",
+ description="LATIN CAPITAL LETTER C WITH STROKE",
+ direction="l",
+ lccode=0x023C,
+ linebreak="al",
+ shcode=0x0043,
+ unicodeslot=0x023B,
+ },
+ {
+ category="ll",
+ contextname="cstroke",
+ description="LATIN SMALL LETTER C WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ uccode=0x023B,
+ unicodeslot=0x023C,
+ },
+ {
+ category="lu",
+ contextname="Lbar",
+ description="LATIN CAPITAL LETTER L WITH BAR",
+ direction="l",
+ lccode=0x019A,
+ linebreak="al",
+ shcode=0x004C,
+ unicodeslot=0x023D,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER T WITH DIAGONAL STROKE",
+ direction="l",
+ lccode=0x2C66,
+ linebreak="al",
+ shcode=0x0054,
+ unicodeslot=0x023E,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER S WITH SWASH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ unicodeslot=0x023F,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH SWASH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ unicodeslot=0x0240,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER GLOTTAL STOP",
+ direction="l",
+ lccode=0x0242,
+ linebreak="al",
+ unicodeslot=0x0241,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ uccode=0x0241,
+ unicodeslot=0x0242,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER B WITH STROKE",
+ direction="l",
+ lccode=0x0180,
+ linebreak="al",
+ shcode=0x0042,
+ unicodeslot=0x0243,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER U BAR",
+ direction="l",
+ lccode=0x0289,
+ linebreak="al",
+ unicodeslot=0x0244,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER TURNED V",
+ direction="l",
+ lccode=0x028C,
+ linebreak="al",
+ unicodeslot=0x0245,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER E WITH STROKE",
+ direction="l",
+ lccode=0x0247,
+ linebreak="al",
+ shcode=0x0045,
+ unicodeslot=0x0246,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER E WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ uccode=0x0246,
+ unicodeslot=0x0247,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER J WITH STROKE",
+ direction="l",
+ lccode=0x0249,
+ linebreak="al",
+ shcode=0x004A,
+ unicodeslot=0x0248,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER J WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006A,
+ uccode=0x0248,
+ unicodeslot=0x0249,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL",
+ direction="l",
+ lccode=0x024B,
+ linebreak="al",
+ unicodeslot=0x024A,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER Q WITH HOOK TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0071,
+ uccode=0x024A,
+ unicodeslot=0x024B,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER R WITH STROKE",
+ direction="l",
+ lccode=0x024D,
+ linebreak="al",
+ shcode=0x0052,
+ unicodeslot=0x024C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER R WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ uccode=0x024C,
+ unicodeslot=0x024D,
+ },
+ {
+ category="lu",
+ description="LATIN CAPITAL LETTER Y WITH STROKE",
+ direction="l",
+ lccode=0x024F,
+ linebreak="al",
+ shcode=0x0059,
+ unicodeslot=0x024E,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER Y WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ uccode=0x024E,
+ unicodeslot=0x024F,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0250,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ description="LATIN SMALL LETTER ALPHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0251,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED ALPHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0252,
+ },
+ {
+ category="ll",
+ contextname="bhook",
+ description="LATIN SMALL LETTER B WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ uccode=0x0181,
+ unicodeslot=0x0253,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER OPEN O",
+ direction="l",
+ linebreak="al",
+ uccode=0x0186,
+ unicodeslot=0x0254,
+ },
+ {
+ category="ll",
+ contextname="ccurl",
+ description="LATIN SMALL LETTER C WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ unicodeslot=0x0255,
+ },
+ {
+ category="ll",
+ contextname="dtail",
+ description="LATIN SMALL LETTER D WITH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ uccode=0x0189,
+ unicodeslot=0x0256,
+ },
+ {
+ category="ll",
+ contextname="dhook",
+ description="LATIN SMALL LETTER D WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ uccode=0x018A,
+ unicodeslot=0x0257,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER REVERSED E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0258,
+ },
+ {
+ category="ll",
+ contextname="schwa",
+ description="LATIN SMALL LETTER SCHWA",
+ direction="l",
+ linebreak="al",
+ uccode=0x018F,
+ unicodeslot=0x0259,
+ },
+ {
+ category="ll",
+ contextname="schwahook",
+ description="LATIN SMALL LETTER SCHWA WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0259,
+ unicodeslot=0x025A,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER OPEN E",
+ direction="l",
+ linebreak="al",
+ uccode=0x0190,
+ unicodeslot=0x025B,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER REVERSED OPEN E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x025C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER REVERSED OPEN E WITH HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x025D,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER CLOSED REVERSED OPEN E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x025E,
+ },
+ {
+ category="ll",
+ contextname="dotlessjstroke",
+ description="LATIN SMALL LETTER DOTLESS J WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x025F,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER G WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ uccode=0x0193,
+ unicodeslot=0x0260,
+ },
+ {
+ category="ll",
+ cjkwd="a",
+ description="LATIN SMALL LETTER SCRIPT G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0261,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0262,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER GAMMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0194,
+ unicodeslot=0x0263,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER RAMS HORN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0264,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0265,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER H WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ unicodeslot=0x0266,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER HENG WITH HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0267,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER I WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ uccode=0x0197,
+ unicodeslot=0x0268,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER IOTA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0196,
+ unicodeslot=0x0269,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x026A,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER L WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ uccode=0x2C62,
+ unicodeslot=0x026B,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER L WITH BELT",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ unicodeslot=0x026C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER L WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ unicodeslot=0x026D,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER LEZH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x026E,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED M",
+ direction="l",
+ linebreak="al",
+ uccode=0x019C,
+ unicodeslot=0x026F,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED M WITH LONG LEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0270,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER M WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006D,
+ unicodeslot=0x0271,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER N WITH LEFT HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ uccode=0x019D,
+ unicodeslot=0x0272,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER N WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ unicodeslot=0x0273,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0274,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER BARRED O",
+ direction="l",
+ linebreak="al",
+ uccode=0x019F,
+ unicodeslot=0x0275,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0276,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER CLOSED OMEGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0277,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER PHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0278,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0279,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED R WITH LONG LEG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x027A,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED R WITH HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x027B,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER R WITH LONG LEG",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ unicodeslot=0x027C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER R WITH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ uccode=0x2C64,
+ unicodeslot=0x027D,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER R WITH FISHHOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ unicodeslot=0x027E,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER REVERSED R WITH FISHHOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x027F,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL R",
+ direction="l",
+ linebreak="al",
+ uccode=0x01A6,
+ unicodeslot=0x0280,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL INVERTED R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0281,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER S WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ unicodeslot=0x0282,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER ESH",
+ direction="l",
+ linebreak="al",
+ uccode=0x01A9,
+ unicodeslot=0x0283,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0284,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER SQUAT REVERSED ESH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0285,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER ESH WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0283,
+ unicodeslot=0x0286,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0287,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER T WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ uccode=0x01AE,
+ unicodeslot=0x0288,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER U BAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x0244,
+ unicodeslot=0x0289,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER UPSILON",
+ direction="l",
+ linebreak="al",
+ uccode=0x01B1,
+ unicodeslot=0x028A,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER V WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0076,
+ uccode=0x01B2,
+ unicodeslot=0x028B,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED V",
+ direction="l",
+ linebreak="al",
+ uccode=0x0245,
+ unicodeslot=0x028C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x028D,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x028E,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x028F,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ unicodeslot=0x0290,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ unicodeslot=0x0291,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER EZH",
+ direction="l",
+ linebreak="al",
+ uccode=0x01B7,
+ unicodeslot=0x0292,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER EZH WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0292,
+ unicodeslot=0x0293,
+ },
+ {
+ category="lo",
+ description="LATIN LETTER GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0294,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER PHARYNGEAL VOICED FRICATIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0295,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER INVERTED GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0296,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER STRETCHED C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0297,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER BILABIAL CLICK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0298,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0299,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER CLOSED OPEN E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x029A,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL G WITH HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x029B,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x029C,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER J WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x006A,
+ unicodeslot=0x029D,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x029E,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x029F,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER Q WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0071,
+ unicodeslot=0x02A0,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER GLOTTAL STOP WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A1,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A2,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER DZ DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A3,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER DEZH DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A4,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER DZ DIGRAPH WITH CURL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A5,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TS DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A6,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TESH DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A7,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TC DIGRAPH WITH CURL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A8,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER FENG DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02A9,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER LS DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02AA,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER LZ DIGRAPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02AB,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER BILABIAL PERCUSSIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02AC,
+ },
+ {
+ category="ll",
+ description="LATIN LETTER BIDENTAL PERCUSSIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02AD,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED H WITH FISHHOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02AE,
+ },
+ {
+ category="ll",
+ description="LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02AF,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0068 },
+ unicodeslot=0x02B0,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL H WITH HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0266 },
+ unicodeslot=0x02B1,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x006A },
+ unicodeslot=0x02B2,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0072 },
+ unicodeslot=0x02B3,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED R",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0279 },
+ unicodeslot=0x02B4,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED R WITH HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x027B },
+ unicodeslot=0x02B5,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL CAPITAL INVERTED R",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0281 },
+ unicodeslot=0x02B6,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0077 },
+ unicodeslot=0x02B7,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0079 },
+ unicodeslot=0x02B8,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER PRIME",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02B9,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER DOUBLE PRIME",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02BA,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER TURNED COMMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02BB,
+ },
+ {
+ adobename="afii57929",
+ category="lm",
+ description="MODIFIER LETTER APOSTROPHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02BC,
+ },
+ {
+ adobename="afii64937",
+ category="lm",
+ description="MODIFIER LETTER REVERSED COMMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02BD,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER RIGHT HALF RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02BE,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER LEFT HALF RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02BF,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02C0,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER REVERSED GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02C1,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LEFT ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02C2,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER RIGHT ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02C3,
+ },
+ {
+ category="sk",
+ cjkwd="a",
+ description="MODIFIER LETTER UP ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02C4,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER DOWN ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02C5,
+ },
+ {
+ adobename="circumflex",
+ category="lm",
+ contextname="textcircumflex",
+ description="MODIFIER LETTER CIRCUMFLEX ACCENT",
+ direction="on",
+ linebreak="al",
+ mathclass="accent",
+ mathname="hat",
+ specials={ "compat", 0x0020, 0x0302 },
+ unicodeslot=0x02C6,
+ },
+ {
+ adobename="caron",
+ category="lm",
+ cjkwd="a",
+ contextname="textcaron",
+ description="CARON",
+ direction="on",
+ linebreak="ai",
+ mathclass="accent",
+ mathname="check",
+ specials={ "compat", 0x0020, 0x030C },
+ unicodeslot=0x02C7,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER VERTICAL LINE",
+ direction="on",
+ linebreak="bb",
+ unicodeslot=0x02C8,
+ },
+ {
+ category="lm",
+ cjkwd="a",
+ description="MODIFIER LETTER MACRON",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x02C9,
+ },
+ {
+ category="lm",
+ cjkwd="a",
+ description="MODIFIER LETTER ACUTE ACCENT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x02CA,
+ },
+ {
+ category="lm",
+ cjkwd="a",
+ description="MODIFIER LETTER GRAVE ACCENT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x02CB,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER LOW VERTICAL LINE",
+ direction="on",
+ linebreak="bb",
+ unicodeslot=0x02CC,
+ },
+ {
+ category="lm",
+ cjkwd="a",
+ description="MODIFIER LETTER LOW MACRON",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x02CD,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER LOW GRAVE ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02CE,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER LOW ACUTE ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02CF,
+ },
+ {
+ category="lm",
+ cjkwd="a",
+ description="MODIFIER LETTER TRIANGULAR COLON",
+ direction="l",
+ linebreak="ai",
+ unicodeslot=0x02D0,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER HALF TRIANGULAR COLON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02D1,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER CENTRED RIGHT HALF RING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02D2,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER CENTRED LEFT HALF RING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02D3,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER UP TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02D4,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER DOWN TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02D5,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER PLUS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02D6,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER MINUS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02D7,
+ },
+ {
+ adobename="breve",
+ category="sk",
+ cjkwd="a",
+ contextname="textbreve",
+ description="BREVE",
+ direction="on",
+ linebreak="ai",
+ mathclass="accent",
+ mathname="breve",
+ specials={ "compat", 0x0020, 0x0306 },
+ unicodeslot=0x02D8,
+ },
+ {
+ adobename="dotaccent",
+ category="sk",
+ cjkwd="a",
+ contextname="textdotaccent",
+ description="DOT ABOVE",
+ direction="on",
+ linebreak="ai",
+ mathclass="accent",
+ mathname="dot",
+ specials={ "compat", 0x0020, 0x0307 },
+ unicodeslot=0x02D9,
+ },
+ {
+ adobename="ring",
+ category="sk",
+ cjkwd="a",
+ contextname="textring",
+ description="RING ABOVE",
+ direction="on",
+ linebreak="ai",
+ mathclass="accent",
+ mathname="mathring",
+ specials={ "compat", 0x0020, 0x030A },
+ unicodeslot=0x02DA,
+ },
+ {
+ adobename="ogonek",
+ category="sk",
+ cjkwd="a",
+ contextname="textogonek",
+ description="OGONEK",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0020, 0x0328 },
+ unicodeslot=0x02DB,
+ },
+ {
+ adobename="tilde",
+ category="sk",
+ contextname="texttilde",
+ description="SMALL TILDE",
+ direction="on",
+ linebreak="al",
+ mathclass="accent",
+ mathname="tilde",
+ specials={ "compat", 0x0020, 0x0303 },
+ unicodeslot=0x02DC,
+ },
+ {
+ adobename="hungarumlaut",
+ category="sk",
+ cjkwd="a",
+ contextname="texthungarumlaut",
+ description="DOUBLE ACUTE ACCENT",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0020, 0x030B },
+ unicodeslot=0x02DD,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER RHOTIC HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02DE,
+ },
+ {
+ category="sk",
+ cjkwd="a",
+ description="MODIFIER LETTER CROSS ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02DF,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0263 },
+ unicodeslot=0x02E0,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x006C },
+ unicodeslot=0x02E1,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0073 },
+ unicodeslot=0x02E2,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0078 },
+ unicodeslot=0x02E3,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER SMALL REVERSED GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0295 },
+ unicodeslot=0x02E4,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER EXTRA-HIGH TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02E5,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER HIGH TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02E6,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER MID TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02E7,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02E8,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER EXTRA-LOW TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02E9,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER YIN DEPARTING TONE MARK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02EA,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER YANG DEPARTING TONE MARK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02EB,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER VOICING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02EC,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER UNASPIRATED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02ED,
+ },
+ {
+ category="lm",
+ description="MODIFIER LETTER DOUBLE APOSTROPHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x02EE,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW DOWN ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02EF,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW UP ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F0,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW LEFT ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F1,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW RIGHT ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F2,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW RING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F3,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER MIDDLE GRAVE ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F4,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F5,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F6,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW TILDE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F7,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER RAISED COLON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F8,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER BEGIN HIGH TONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02F9,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER END HIGH TONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02FA,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER BEGIN LOW TONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02FB,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER END LOW TONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02FC,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER SHELF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02FD,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER OPEN SHELF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02FE,
+ },
+ {
+ category="sk",
+ description="MODIFIER LETTER LOW LEFT ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x02FF,
+ },
+ {
+ adobename="gravecomb",
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GRAVE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0300,
+ },
+ {
+ adobename="acutecomb",
+ category="mn",
+ cjkwd="a",
+ description="COMBINING ACUTE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0301,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING CIRCUMFLEX ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ mathstretch="h",
+ unicodeslot=0x0302,
+ },
+ {
+ adobename="tildecomb",
+ category="mn",
+ cjkwd="a",
+ description="COMBINING TILDE",
+ direction="nsm",
+ linebreak="cm",
+ mathstretch="h",
+ unicodeslot=0x0303,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING MACRON",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0304,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING OVERLINE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0305,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING BREVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0306,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOT ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0307,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DIAERESIS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0308,
+ },
+ {
+ adobename="hookabovecomb",
+ category="mn",
+ cjkwd="a",
+ description="COMBINING HOOK ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0309,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RING ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x030A,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE ACUTE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x030B,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING CARON",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x030C,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING VERTICAL LINE ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x030D,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE VERTICAL LINE ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x030E,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE GRAVE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x030F,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0310,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING INVERTED BREVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0311,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING TURNED COMMA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0312,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING COMMA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0313,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING REVERSED COMMA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0314,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING COMMA ABOVE RIGHT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0315,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GRAVE ACCENT BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0316,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING ACUTE ACCENT BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0317,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LEFT TACK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0318,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RIGHT TACK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0319,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LEFT ANGLE ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x031A,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING HORN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x031B,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LEFT HALF RING BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x031C,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING UP TACK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x031D,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOWN TACK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x031E,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING PLUS SIGN BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x031F,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING MINUS SIGN BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0320,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING PALATALIZED HOOK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0321,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RETROFLEX HOOK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0322,
+ },
+ {
+ adobename="dotbelowcomb",
+ category="mn",
+ cjkwd="a",
+ contextname="textbottomdot",
+ description="COMBINING DOT BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0323,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DIAERESIS BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0324,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RING BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0325,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ contextname="textbottomcomma",
+ description="COMBINING COMMA BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0326,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING CEDILLA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0327,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING OGONEK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0328,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING VERTICAL LINE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0329,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING BRIDGE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x032A,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING INVERTED DOUBLE ARCH BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x032B,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING CARON BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x032C,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING CIRCUMFLEX ACCENT BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x032D,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING BREVE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x032E,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING INVERTED BREVE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x032F,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING TILDE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0330,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING MACRON BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0331,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LOW LINE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0332,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE LOW LINE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0333,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING TILDE OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0334,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING SHORT STROKE OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0335,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LONG STROKE OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0336,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING SHORT SOLIDUS OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0337,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LONG SOLIDUS OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="relation",
+ mathname="not",
+ unicodeslot=0x0338,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RIGHT HALF RING BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0339,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING INVERTED BRIDGE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x033A,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING SQUARE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x033B,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING SEAGULL BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x033C,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING X ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x033D,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING VERTICAL TILDE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x033E,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE OVERLINE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x033F,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GRAVE TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0300 },
+ unicodeslot=0x0340,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING ACUTE TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0301 },
+ unicodeslot=0x0341,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GREEK PERISPOMENI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0342,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GREEK KORONIS",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0313 },
+ unicodeslot=0x0343,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GREEK DIALYTIKA TONOS",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0308, 0x0301 },
+ unicodeslot=0x0344,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GREEK YPOGEGRAMMENI",
+ direction="nsm",
+ linebreak="cm",
+ uccode=0x0399,
+ unicodeslot=0x0345,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING BRIDGE ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0346,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING EQUALS SIGN BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0347,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE VERTICAL LINE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0348,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LEFT ANGLE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0349,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING NOT TILDE ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x034A,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING HOMOTHETIC ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x034B,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING ALMOST EQUAL TO ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x034C,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LEFT RIGHT ARROW BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x034D,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING UPWARDS ARROW BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x034E,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING GRAPHEME JOINER",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x034F,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RIGHT ARROWHEAD ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0350,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LEFT HALF RING ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0351,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING FERMATA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0352,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING X BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0353,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LEFT ARROWHEAD BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0354,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RIGHT ARROWHEAD BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0355,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0356,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING RIGHT HALF RING ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0357,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOT ABOVE RIGHT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0358,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING ASTERISK BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0359,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE RING BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x035A,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING ZIGZAG ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x035B,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE BREVE BELOW",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x035C,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE BREVE",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x035D,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE MACRON",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x035E,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE MACRON BELOW",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x035F,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE TILDE",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x0360,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE INVERTED BREVE",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x0361,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING DOUBLE RIGHTWARDS ARROW BELOW",
+ direction="nsm",
+ linebreak="gl",
+ unicodeslot=0x0362,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0363,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0364,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0365,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER O",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0366,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0367,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0368,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0369,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER H",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x036A,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER M",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x036B,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x036C,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER T",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x036D,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER V",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x036E,
+ },
+ {
+ category="mn",
+ cjkwd="a",
+ description="COMBINING LATIN SMALL LETTER X",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x036F,
+ },
+ [0x0374]={
+ category="sk",
+ description="GREEK NUMERAL SIGN",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x02B9 },
+ unicodeslot=0x0374,
+ },
+ [0x0375]={
+ category="sk",
+ description="GREEK LOWER NUMERAL SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0375,
+ },
+ [0x037A]={
+ category="lm",
+ description="GREEK YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0345 },
+ unicodeslot=0x037A,
+ },
+ [0x037B]={
+ category="ll",
+ description="GREEK SMALL REVERSED LUNATE SIGMA SYMBOL",
+ direction="l",
+ linebreak="al",
+ uccode=0x03FD,
+ unicodeslot=0x037B,
+ },
+ [0x037C]={
+ category="ll",
+ description="GREEK SMALL DOTTED LUNATE SIGMA SYMBOL",
+ direction="l",
+ linebreak="al",
+ uccode=0x03FE,
+ unicodeslot=0x037C,
+ },
+ [0x037D]={
+ category="ll",
+ description="GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL",
+ direction="l",
+ linebreak="al",
+ uccode=0x03FF,
+ unicodeslot=0x037D,
+ },
+ [0x037E]={
+ category="po",
+ description="GREEK QUESTION MARK",
+ direction="on",
+ linebreak="is",
+ specials={ "char", 0x003B },
+ unicodeslot=0x037E,
+ },
+ [0x0384]={
+ adobename="tonos",
+ category="sk",
+ contextname="greektonos",
+ description="GREEK TONOS",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0301 },
+ unicodeslot=0x0384,
+ },
+ [0x0385]={
+ adobename="dieresistonos",
+ category="sk",
+ contextname="greekdialytikatonos",
+ description="GREEK DIALYTIKA TONOS",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x00A8, 0x0301 },
+ unicodeslot=0x0385,
+ },
+ [0x0386]={
+ adobename="Alphatonos",
+ category="lu",
+ contextname="greekAlphatonos",
+ description="GREEK CAPITAL LETTER ALPHA WITH TONOS",
+ direction="l",
+ lccode=0x03AC,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0391, 0x0301 },
+ unicodeslot=0x0386,
+ },
+ [0x0387]={
+ adobename="anoteleia",
+ category="po",
+ description="GREEK ANO TELEIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x00B7 },
+ unicodeslot=0x0387,
+ },
+ [0x0388]={
+ adobename="Epsilontonos",
+ category="lu",
+ contextname="greekEpsilontonos",
+ description="GREEK CAPITAL LETTER EPSILON WITH TONOS",
+ direction="l",
+ lccode=0x03AD,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x0395, 0x0301 },
+ unicodeslot=0x0388,
+ },
+ [0x0389]={
+ adobename="Etatonos",
+ category="lu",
+ contextname="greekEtatonos",
+ description="GREEK CAPITAL LETTER ETA WITH TONOS",
+ direction="l",
+ lccode=0x03AE,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x0397, 0x0301 },
+ unicodeslot=0x0389,
+ },
+ [0x038A]={
+ adobename="Iotatonos",
+ category="lu",
+ contextname="greekIotatonos",
+ description="GREEK CAPITAL LETTER IOTA WITH TONOS",
+ direction="l",
+ lccode=0x03AF,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x0399, 0x0301 },
+ unicodeslot=0x038A,
+ },
+ [0x038C]={
+ adobename="Omicrontonos",
+ category="lu",
+ contextname="greekOmicrontonos",
+ description="GREEK CAPITAL LETTER OMICRON WITH TONOS",
+ direction="l",
+ lccode=0x03CC,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x039F, 0x0301 },
+ unicodeslot=0x038C,
+ },
+ [0x038E]={
+ adobename="Upsilontonos",
+ category="lu",
+ contextname="greekUpsilontonos",
+ description="GREEK CAPITAL LETTER UPSILON WITH TONOS",
+ direction="l",
+ lccode=0x03CD,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x03A5, 0x0301 },
+ unicodeslot=0x038E,
+ },
+ [0x038F]={
+ adobename="Omegatonos",
+ category="lu",
+ contextname="greekOmegatonos",
+ description="GREEK CAPITAL LETTER OMEGA WITH TONOS",
+ direction="l",
+ lccode=0x03CE,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x03A9, 0x0301 },
+ unicodeslot=0x038F,
+ },
+ [0x0390]={
+ adobename="iotadieresistonos",
+ category="ll",
+ contextname="greekiotadialytikatonos",
+ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03CA, 0x0301 },
+ unicodeslot=0x0390,
+ },
+ [0x0391]={
+ adobename="Alpha",
+ category="lu",
+ cjkwd="a",
+ contextname="greekAlpha",
+ description="GREEK CAPITAL LETTER ALPHA",
+ direction="l",
+ lccode=0x03B1,
+ mathclass="variable",
+ mathname="Alpha",
+ linebreak="al",
+ unicodeslot=0x0391,
+ },
+ [0x0392]={
+ adobename="Beta",
+ category="lu",
+ cjkwd="a",
+ contextname="greekBeta",
+ description="GREEK CAPITAL LETTER BETA",
+ direction="l",
+ lccode=0x03B2,
+ mathclass="variable",
+ mathname="Beta",
+ linebreak="al",
+ unicodeslot=0x0392,
+ },
+ [0x0393]={
+ adobename="Gamma",
+ category="lu",
+ cjkwd="a",
+ contextname="greekGamma",
+ description="GREEK CAPITAL LETTER GAMMA",
+ direction="l",
+ mathclass="variable",
+ mathname="Gamma",
+ lccode=0x03B3,
+ linebreak="al",
+ unicodeslot=0x0393,
+ },
+ [0x0394]={
+ category="lu",
+ cjkwd="a",
+ contextname="greekDelta",
+ description="GREEK CAPITAL LETTER DELTA",
+ direction="l",
+ mathclass="variable",
+ mathname="Delta",
+ lccode=0x03B4,
+ linebreak="al",
+ unicodeslot=0x0394,
+ },
+ [0x0395]={
+ adobename="Epsilon",
+ category="lu",
+ cjkwd="a",
+ contextname="greekEpsilon",
+ description="GREEK CAPITAL LETTER EPSILON",
+ direction="l",
+ mathclass="variable",
+ mathname="Epsilon",
+ lccode=0x03B5,
+ linebreak="al",
+ unicodeslot=0x0395,
+ },
+ [0x0396]={
+ adobename="Zeta",
+ category="lu",
+ cjkwd="a",
+ contextname="greekZeta",
+ description="GREEK CAPITAL LETTER ZETA",
+ direction="l",
+ mathclass="variable",
+ mathname="Zeta",
+ lccode=0x03B6,
+ linebreak="al",
+ unicodeslot=0x0396,
+ },
+ [0x0397]={
+ adobename="Eta",
+ category="lu",
+ cjkwd="a",
+ contextname="greekEta",
+ description="GREEK CAPITAL LETTER ETA",
+ direction="l",
+ mathclass="variable",
+ mathname="Eta",
+ lccode=0x03B7,
+ linebreak="al",
+ unicodeslot=0x0397,
+ },
+ [0x0398]={
+ adobename="Theta",
+ category="lu",
+ cjkwd="a",
+ contextname="greekTheta",
+ description="GREEK CAPITAL LETTER THETA",
+ direction="l",
+ mathclass="variable",
+ mathname="Theta",
+ lccode=0x03B8,
+ linebreak="al",
+ unicodeslot=0x0398,
+ },
+ [0x0399]={
+ adobename="Iota",
+ category="lu",
+ cjkwd="a",
+ contextname="greekIota",
+ description="GREEK CAPITAL LETTER IOTA",
+ direction="l",
+ mathclass="variable",
+ mathname="Iota",
+ lccode=0x03B9,
+ linebreak="al",
+ unicodeslot=0x0399,
+ },
+ [0x039A]={
+ adobename="Kappa",
+ category="lu",
+ cjkwd="a",
+ contextname="greekKappa",
+ description="GREEK CAPITAL LETTER KAPPA",
+ direction="l",
+ mathclass="variable",
+ mathname="Kappa",
+ lccode=0x03BA,
+ linebreak="al",
+ unicodeslot=0x039A,
+ },
+ [0x039B]={
+ adobename="Lambda",
+ category="lu",
+ cjkwd="a",
+ contextname="greekLambda",
+ description="GREEK CAPITAL LETTER LAMDA",
+ direction="l",
+ mathclass="variable",
+ mathname="Lambda",
+ lccode=0x03BB,
+ linebreak="al",
+ unicodeslot=0x039B,
+ },
+ [0x039C]={
+ adobename="Mu",
+ category="lu",
+ cjkwd="a",
+ contextname="greekMu",
+ description="GREEK CAPITAL LETTER MU",
+ direction="l",
+ mathclass="variable",
+ mathname="Mu",
+ lccode=0x03BC,
+ linebreak="al",
+ unicodeslot=0x039C,
+ },
+ [0x039D]={
+ adobename="Nu",
+ category="lu",
+ cjkwd="a",
+ contextname="greekNu",
+ description="GREEK CAPITAL LETTER NU",
+ direction="l",
+ mathclass="variable",
+ mathname="Nu",
+ lccode=0x03BD,
+ linebreak="al",
+ unicodeslot=0x039D,
+ },
+ [0x039E]={
+ adobename="Xi",
+ category="lu",
+ cjkwd="a",
+ contextname="greekXi",
+ description="GREEK CAPITAL LETTER XI",
+ direction="l",
+ mathclass="variable",
+ mathname="Xi",
+ lccode=0x03BE,
+ linebreak="al",
+ unicodeslot=0x039E,
+ },
+ [0x039F]={
+ adobename="Omicron",
+ category="lu",
+ cjkwd="a",
+ contextname="greekOmicron",
+ description="GREEK CAPITAL LETTER OMICRON",
+ direction="l",
+ mathclass="variable",
+ mathname="Omicron",
+ lccode=0x03BF,
+ linebreak="al",
+ unicodeslot=0x039F,
+ },
+ [0x03A0]={
+ adobename="Pi",
+ category="lu",
+ cjkwd="a",
+ contextname="greekPi",
+ description="GREEK CAPITAL LETTER PI",
+ direction="l",
+ mathclass="variable",
+ mathname="Pi",
+ lccode=0x03C0,
+ linebreak="al",
+ unicodeslot=0x03A0,
+ },
+ [0x03A1]={
+ adobename="Rho",
+ category="lu",
+ cjkwd="a",
+ contextname="greekRho",
+ description="GREEK CAPITAL LETTER RHO",
+ direction="l",
+ mathclass="variable",
+ mathname="Rho",
+ lccode=0x03C1,
+ linebreak="al",
+ unicodeslot=0x03A1,
+ },
+ [0x03A3]={
+ adobename="Sigma",
+ category="lu",
+ cjkwd="a",
+ contextname="greekSigma",
+ description="GREEK CAPITAL LETTER SIGMA",
+ direction="l",
+ mathclass="variable",
+ mathname="Sigma",
+ lccode=0x03C3,
+ linebreak="al",
+ unicodeslot=0x03A3,
+ },
+ [0x03A4]={
+ adobename="Tau",
+ category="lu",
+ cjkwd="a",
+ contextname="greekTau",
+ description="GREEK CAPITAL LETTER TAU",
+ direction="l",
+ mathclass="variable",
+ mathname="Tau",
+ lccode=0x03C4,
+ linebreak="al",
+ unicodeslot=0x03A4,
+ },
+ [0x03A5]={
+ adobename="Upsilon",
+ category="lu",
+ cjkwd="a",
+ contextname="greekUpsilon",
+ description="GREEK CAPITAL LETTER UPSILON",
+ direction="l",
+ mathclass="variable",
+ mathname="Upsilon",
+ lccode=0x03C5,
+ linebreak="al",
+ unicodeslot=0x03A5,
+ },
+ [0x03A6]={
+ adobename="Phi",
+ category="lu",
+ cjkwd="a",
+ contextname="greekPhi",
+ description="GREEK CAPITAL LETTER PHI",
+ direction="l",
+ mathclass="variable",
+ mathname="Phi",
+ lccode=0x03C6,
+ linebreak="al",
+ unicodeslot=0x03A6,
+ },
+ [0x03A7]={
+ adobename="Chi",
+ category="lu",
+ cjkwd="a",
+ contextname="greekChi",
+ description="GREEK CAPITAL LETTER CHI",
+ direction="l",
+ mathclass="variable",
+ mathname="Chi",
+ lccode=0x03C7,
+ linebreak="al",
+ unicodeslot=0x03A7,
+ },
+ [0x03A8]={
+ adobename="Psi",
+ category="lu",
+ cjkwd="a",
+ contextname="greekPsi",
+ description="GREEK CAPITAL LETTER PSI",
+ direction="l",
+ mathclass="variable",
+ mathname="Psi",
+ lccode=0x03C8,
+ linebreak="al",
+ unicodeslot=0x03A8,
+ },
+ [0x03A9]={
+ category="lu",
+ cjkwd="a",
+ contextname="greekOmega",
+ description="GREEK CAPITAL LETTER OMEGA",
+ direction="l",
+ mathclass="variable",
+ mathname="Omega",
+ lccode=0x03C9,
+ linebreak="al",
+ unicodeslot=0x03A9,
+ },
+ [0x03AA]={
+ adobename="Iotadieresis",
+ category="lu",
+ contextname="greekIotadialytika",
+ description="GREEK CAPITAL LETTER IOTA WITH DIALYTIKA",
+ direction="l",
+ lccode=0x03CA,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x0399, 0x0308 },
+ unicodeslot=0x03AA,
+ },
+ [0x03AB]={
+ adobename="Upsilondieresis",
+ category="lu",
+ contextname="greekUpsilondialytika",
+ description="GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA",
+ direction="l",
+ lccode=0x03CB,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x03A5, 0x0308 },
+ unicodeslot=0x03AB,
+ },
+ [0x03AC]={
+ adobename="alphatonos",
+ category="ll",
+ contextname="greekalphatonos",
+ description="GREEK SMALL LETTER ALPHA WITH TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0301 },
+ uccode=0x0386,
+ unicodeslot=0x03AC,
+ },
+ [0x03AD]={
+ adobename="epsilontonos",
+ category="ll",
+ contextname="greekepsilontonos",
+ description="GREEK SMALL LETTER EPSILON WITH TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x03B5, 0x0301 },
+ uccode=0x0388,
+ unicodeslot=0x03AD,
+ },
+ [0x03AE]={
+ adobename="etatonos",
+ category="ll",
+ contextname="greeketatonos",
+ description="GREEK SMALL LETTER ETA WITH TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03B7, 0x0301 },
+ uccode=0x0389,
+ unicodeslot=0x03AE,
+ },
+ [0x03AF]={
+ adobename="iotatonos",
+ category="ll",
+ contextname="greekiotatonos",
+ description="GREEK SMALL LETTER IOTA WITH TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0301 },
+ uccode=0x038A,
+ unicodeslot=0x03AF,
+ },
+ [0x03B0]={
+ adobename="upsilondieresistonos",
+ category="ll",
+ contextname="greekupsilondialytikatonos",
+ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03CB, 0x0301 },
+ unicodeslot=0x03B0,
+ },
+ [0x03B1]={
+ adobename="alpha",
+ category="ll",
+ cjkwd="a",
+ contextname="greekalpha",
+ description="GREEK SMALL LETTER ALPHA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="alpha",
+ uccode=0x0391,
+ unicodeslot=0x03B1,
+ },
+ [0x03B2]={
+ adobename="beta",
+ category="ll",
+ cjkwd="a",
+ contextname="greekbeta",
+ description="GREEK SMALL LETTER BETA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="beta",
+ uccode=0x0392,
+ unicodeslot=0x03B2,
+ },
+ [0x03B3]={
+ adobename="gamma",
+ category="ll",
+ cjkwd="a",
+ contextname="greekgamma",
+ description="GREEK SMALL LETTER GAMMA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="gamma",
+ uccode=0x0393,
+ unicodeslot=0x03B3,
+ },
+ [0x03B4]={
+ adobename="delta",
+ category="ll",
+ cjkwd="a",
+ contextname="greekdelta",
+ description="GREEK SMALL LETTER DELTA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="delta",
+ uccode=0x0394,
+ unicodeslot=0x03B4,
+ },
+ [0x03B5]={
+ adobename="epsilon",
+ category="ll",
+ cjkwd="a",
+ contextname="greekepsilon",
+ description="GREEK SMALL LETTER EPSILON",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="varepsilon",
+ uccode=0x0395,
+ unicodeslot=0x03B5,
+ },
+ [0x03B6]={
+ adobename="zeta",
+ category="ll",
+ cjkwd="a",
+ contextname="greekzeta",
+ description="GREEK SMALL LETTER ZETA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="zeta",
+ uccode=0x0396,
+ unicodeslot=0x03B6,
+ },
+ [0x03B7]={
+ adobename="eta",
+ category="ll",
+ cjkwd="a",
+ contextname="greeketa",
+ description="GREEK SMALL LETTER ETA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="eta",
+ uccode=0x0397,
+ unicodeslot=0x03B7,
+ },
+ [0x03B8]={
+ adobename="theta",
+ category="ll",
+ cjkwd="a",
+ contextname="greektheta",
+ description="GREEK SMALL LETTER THETA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="theta",
+ uccode=0x0398,
+ unicodeslot=0x03B8,
+ },
+ [0x03B9]={
+ adobename="iota",
+ category="ll",
+ cjkwd="a",
+ contextname="greekiota",
+ description="GREEK SMALL LETTER IOTA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="iota",
+ uccode=0x0399,
+ unicodeslot=0x03B9,
+ },
+ [0x03BA]={
+ adobename="kappa",
+ category="ll",
+ cjkwd="a",
+ contextname="greekkappa",
+ description="GREEK SMALL LETTER KAPPA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="kappa",
+ uccode=0x039A,
+ unicodeslot=0x03BA,
+ },
+ [0x03BB]={
+ adobename="lambda",
+ category="ll",
+ cjkwd="a",
+ contextname="greeklambda",
+ description="GREEK SMALL LETTER LAMDA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="lambda",
+ uccode=0x039B,
+ unicodeslot=0x03BB,
+ },
+ [0x03BC]={
+ category="ll",
+ cjkwd="a",
+ contextname="greekmu",
+ description="GREEK SMALL LETTER MU",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="mu",
+ uccode=0x039C,
+ unicodeslot=0x03BC,
+ },
+ [0x03BD]={
+ adobename="nu",
+ category="ll",
+ cjkwd="a",
+ contextname="greeknu",
+ description="GREEK SMALL LETTER NU",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="nu",
+ uccode=0x039D,
+ unicodeslot=0x03BD,
+ },
+ [0x03BE]={
+ adobename="xi",
+ category="ll",
+ cjkwd="a",
+ contextname="greekxi",
+ description="GREEK SMALL LETTER XI",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="xi",
+ uccode=0x039E,
+ unicodeslot=0x03BE,
+ },
+ [0x03BF]={
+ adobename="omicron",
+ category="ll",
+ cjkwd="a",
+ contextname="greekomicron",
+ description="GREEK SMALL LETTER OMICRON",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="omicron",
+ uccode=0x039F,
+ unicodeslot=0x03BF,
+ },
+ [0x03C0]={
+ adobename="pi",
+ category="ll",
+ cjkwd="a",
+ contextname="greekpi",
+ description="GREEK SMALL LETTER PI",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="pi",
+ uccode=0x03A0,
+ unicodeslot=0x03C0,
+ },
+ [0x03C1]={
+ adobename="rho",
+ category="ll",
+ cjkwd="a",
+ contextname="greekrho",
+ description="GREEK SMALL LETTER RHO",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="rho",
+ uccode=0x03A1,
+ unicodeslot=0x03C1,
+ },
+ [0x03C2]={
+ adobename="sigma1",
+ category="ll",
+ contextname="greekfinalsigma",
+ description="GREEK SMALL LETTER FINAL SIGMA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="varsigma",
+ uccode=0x03A3,
+ unicodeslot=0x03C2,
+ },
+ [0x03C3]={
+ adobename="sigma",
+ category="ll",
+ cjkwd="a",
+ contextname="greeksigma",
+ description="GREEK SMALL LETTER SIGMA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="sigma",
+ uccode=0x03A3,
+ unicodeslot=0x03C3,
+ },
+ [0x03C4]={
+ adobename="tau",
+ category="ll",
+ cjkwd="a",
+ contextname="greektau",
+ description="GREEK SMALL LETTER TAU",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="tau",
+ uccode=0x03A4,
+ unicodeslot=0x03C4,
+ },
+ [0x03C5]={
+ adobename="upsilon",
+ category="ll",
+ cjkwd="a",
+ contextname="greekupsilon",
+ description="GREEK SMALL LETTER UPSILON",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="upsilon",
+ uccode=0x03A5,
+ unicodeslot=0x03C5,
+ },
+ [0x03C6]={
+ adobename="phi",
+ category="ll",
+ cjkwd="a",
+ contextname="greekphi",
+ description="GREEK SMALL LETTER PHI",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="varphi",
+ uccode=0x03A6,
+ unicodeslot=0x03C6,
+ },
+ [0x03C7]={
+ adobename="chi",
+ category="ll",
+ cjkwd="a",
+ contextname="greekchi",
+ description="GREEK SMALL LETTER CHI",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="chi",
+ uccode=0x03A7,
+ unicodeslot=0x03C7,
+ },
+ [0x03C8]={
+ adobename="psi",
+ category="ll",
+ cjkwd="a",
+ contextname="greekpsi",
+ description="GREEK SMALL LETTER PSI",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="psi",
+ uccode=0x03A8,
+ unicodeslot=0x03C8,
+ },
+ [0x03C9]={
+ adobename="omega",
+ category="ll",
+ cjkwd="a",
+ contextname="greekomega",
+ description="GREEK SMALL LETTER OMEGA",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="omega",
+ uccode=0x03A9,
+ unicodeslot=0x03C9,
+ },
+ [0x03CA]={
+ adobename="iotadieresis",
+ category="ll",
+ contextname="greekiotadialytika",
+ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0308 },
+ uccode=0x03AA,
+ unicodeslot=0x03CA,
+ },
+ [0x03CB]={
+ adobename="upsilondieresis",
+ category="ll",
+ contextname="greekupsilondiaeresis",
+ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0308 },
+ uccode=0x03AB,
+ unicodeslot=0x03CB,
+ },
+ [0x03CC]={
+ adobename="omicrontonos",
+ category="ll",
+ contextname="greekomicrontonos",
+ description="GREEK SMALL LETTER OMICRON WITH TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x03BF, 0x0301 },
+ uccode=0x038C,
+ unicodeslot=0x03CC,
+ },
+ [0x03CD]={
+ adobename="upsilontonos",
+ category="ll",
+ contextname="greekupsilontonos",
+ description="GREEK SMALL LETTER UPSILON WITH TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0301 },
+ uccode=0x038E,
+ unicodeslot=0x03CD,
+ },
+ [0x03CE]={
+ adobename="omegatonos",
+ category="ll",
+ contextname="greekomegatonos",
+ description="GREEK SMALL LETTER OMEGA WITH TONOS",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03C9, 0x0301 },
+ uccode=0x038F,
+ unicodeslot=0x03CE,
+ },
+ [0x03D0]={
+ category="ll",
+ description="GREEK BETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x03B2 },
+ uccode=0x0392,
+ unicodeslot=0x03D0,
+ },
+ [0x03D1]={
+ adobename="theta1",
+ category="ll",
+ contextname="greekthetaalt",
+ description="GREEK THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="varTheta",
+ specials={ "compat", 0x03B8 },
+ uccode=0x0398,
+ unicodeslot=0x03D1,
+ },
+ [0x03D2]={
+ adobename="Upsilon1",
+ category="lu",
+ description="GREEK UPSILON WITH HOOK SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x03A5 },
+ unicodeslot=0x03D2,
+ },
+ [0x03D3]={
+ category="lu",
+ description="GREEK UPSILON WITH ACUTE AND HOOK SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x03D2, 0x0301 },
+ unicodeslot=0x03D3,
+ },
+ [0x03D4]={
+ category="lu",
+ description="GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x03D2, 0x0308 },
+ unicodeslot=0x03D4,
+ },
+ [0x03D5]={
+ adobename="phi1",
+ category="ll",
+ contextname="greekphialt",
+ description="GREEK PHI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x03C6 },
+ mathclass="variable",
+ mathname="phi",
+ uccode=0x03A6,
+ unicodeslot=0x03D5,
+ },
+ [0x03D6]={
+ adobename="omega1",
+ category="ll",
+ contextname="greekpialt",
+ description="GREEK PI SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="varpi",
+ specials={ "compat", 0x03C0 },
+ uccode=0x03A0,
+ unicodeslot=0x03D6,
+ },
+ [0x03D7]={
+ category="ll",
+ description="GREEK KAI SYMBOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x03D7,
+ },
+ [0x03D8]={
+ category="lu",
+ description="GREEK LETTER ARCHAIC KOPPA",
+ direction="l",
+ lccode=0x03D9,
+ linebreak="al",
+ unicodeslot=0x03D8,
+ },
+ [0x03D9]={
+ category="ll",
+ contextname="greekkoppa",
+ description="GREEK SMALL LETTER ARCHAIC KOPPA",
+ direction="l",
+ linebreak="al",
+ uccode=0x03D8,
+ unicodeslot=0x03D9,
+ },
+ [0x03DA]={
+ category="lu",
+ description="GREEK LETTER STIGMA",
+ direction="l",
+ lccode=0x03DB,
+ linebreak="al",
+ unicodeslot=0x03DA,
+ },
+ [0x03DB]={
+ category="ll",
+ contextname="greekstigma",
+ description="GREEK SMALL LETTER STIGMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x03DA,
+ unicodeslot=0x03DB,
+ },
+ [0x03DC]={
+ category="lu",
+ description="GREEK LETTER DIGAMMA",
+ direction="l",
+ lccode=0x03DD,
+ linebreak="al",
+ mathclass="variable",
+ mathname="digamma",
+ unicodeslot=0x03DC,
+ },
+ [0x03DD]={
+ category="ll",
+ contextname="greekdigamma",
+ description="GREEK SMALL LETTER DIGAMMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x03DC,
+ unicodeslot=0x03DD,
+ },
+ [0x03DE]={
+ category="lu",
+ description="GREEK LETTER KOPPA",
+ direction="l",
+ lccode=0x03DF,
+ linebreak="al",
+ unicodeslot=0x03DE,
+ },
+ [0x03DF]={
+ category="ll",
+ contextname="greeknumkoppa",
+ description="GREEK SMALL LETTER KOPPA",
+ direction="l",
+ linebreak="al",
+ uccode=0x03DE,
+ unicodeslot=0x03DF,
+ },
+ [0x03E0]={
+ category="lu",
+ description="GREEK LETTER SAMPI",
+ direction="l",
+ lccode=0x03E1,
+ linebreak="al",
+ unicodeslot=0x03E0,
+ },
+ [0x03E1]={
+ category="ll",
+ contextname="greeksampi",
+ description="GREEK SMALL LETTER SAMPI",
+ direction="l",
+ linebreak="al",
+ uccode=0x03E0,
+ unicodeslot=0x03E1,
+ },
+ [0x03E2]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER SHEI",
+ direction="l",
+ lccode=0x03E3,
+ linebreak="al",
+ unicodeslot=0x03E2,
+ },
+ [0x03E3]={
+ category="ll",
+ description="COPTIC SMALL LETTER SHEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x03E2,
+ unicodeslot=0x03E3,
+ },
+ [0x03E4]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER FEI",
+ direction="l",
+ lccode=0x03E5,
+ linebreak="al",
+ unicodeslot=0x03E4,
+ },
+ [0x03E5]={
+ category="ll",
+ description="COPTIC SMALL LETTER FEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x03E4,
+ unicodeslot=0x03E5,
+ },
+ [0x03E6]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER KHEI",
+ direction="l",
+ lccode=0x03E7,
+ linebreak="al",
+ unicodeslot=0x03E6,
+ },
+ [0x03E7]={
+ category="ll",
+ description="COPTIC SMALL LETTER KHEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x03E6,
+ unicodeslot=0x03E7,
+ },
+ [0x03E8]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER HORI",
+ direction="l",
+ lccode=0x03E9,
+ linebreak="al",
+ unicodeslot=0x03E8,
+ },
+ [0x03E9]={
+ category="ll",
+ description="COPTIC SMALL LETTER HORI",
+ direction="l",
+ linebreak="al",
+ uccode=0x03E8,
+ unicodeslot=0x03E9,
+ },
+ [0x03EA]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER GANGIA",
+ direction="l",
+ lccode=0x03EB,
+ linebreak="al",
+ unicodeslot=0x03EA,
+ },
+ [0x03EB]={
+ category="ll",
+ description="COPTIC SMALL LETTER GANGIA",
+ direction="l",
+ linebreak="al",
+ uccode=0x03EA,
+ unicodeslot=0x03EB,
+ },
+ [0x03EC]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER SHIMA",
+ direction="l",
+ lccode=0x03ED,
+ linebreak="al",
+ unicodeslot=0x03EC,
+ },
+ [0x03ED]={
+ category="ll",
+ description="COPTIC SMALL LETTER SHIMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x03EC,
+ unicodeslot=0x03ED,
+ },
+ [0x03EE]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER DEI",
+ direction="l",
+ lccode=0x03EF,
+ linebreak="al",
+ unicodeslot=0x03EE,
+ },
+ [0x03EF]={
+ category="ll",
+ description="COPTIC SMALL LETTER DEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x03EE,
+ unicodeslot=0x03EF,
+ },
+ [0x03F0]={
+ category="ll",
+ description="GREEK KAPPA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x03BA },
+ mathclass="ord",
+ mathname="varkappa",
+ uccode=0x039A,
+ unicodeslot=0x03F0,
+ },
+ [0x03F1]={
+ category="ll",
+ contextname="greekrhoalt",
+ description="GREEK RHO SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x03C1 },
+ uccode=0x03A1,
+ unicodeslot=0x03F1,
+ },
+ [0x03F2]={
+ category="ll",
+ contextname="greeksigmalunate",
+ description="GREEK LUNATE SIGMA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x03C2 },
+ uccode=0x03F9,
+ unicodeslot=0x03F2,
+ },
+ [0x03F3]={
+ category="ll",
+ description="GREEK LETTER YOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x03F3,
+ },
+ [0x03F4]={
+ category="lu",
+ description="GREEK CAPITAL THETA SYMBOL",
+ direction="l",
+ lccode=0x03B8,
+ linebreak="al",
+ specials={ "compat", 0x0398 },
+ unicodeslot=0x03F4,
+ },
+ [0x03F5]={
+ category="ll",
+ contextname="greekepsilonalt",
+ description="GREEK LUNATE EPSILON SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="epsilon",
+ specials={ "compat", 0x03B5 },
+ uccode=0x0395,
+ unicodeslot=0x03F5,
+ },
+ [0x03F6]={
+ category="sm",
+ description="GREEK REVERSED LUNATE EPSILON SYMBOL",
+ direction="on",
+ linebreak="al",
+ mathclass="variable",
+ mathname="backepsilon",
+ unicodeslot=0x03F6,
+ },
+ [0x03F7]={
+ category="lu",
+ description="GREEK CAPITAL LETTER SHO",
+ direction="l",
+ lccode=0x03F8,
+ linebreak="al",
+ unicodeslot=0x03F7,
+ },
+ [0x03F8]={
+ category="ll",
+ description="GREEK SMALL LETTER SHO",
+ direction="l",
+ linebreak="al",
+ uccode=0x03F7,
+ unicodeslot=0x03F8,
+ },
+ [0x03F9]={
+ category="lu",
+ contextname="greekSigmalunate",
+ description="GREEK CAPITAL LUNATE SIGMA SYMBOL",
+ direction="l",
+ lccode=0x03F2,
+ linebreak="al",
+ specials={ "compat", 0x03A3 },
+ unicodeslot=0x03F9,
+ },
+ [0x03FA]={
+ category="lu",
+ description="GREEK CAPITAL LETTER SAN",
+ direction="l",
+ lccode=0x03FB,
+ linebreak="al",
+ unicodeslot=0x03FA,
+ },
+ [0x03FB]={
+ category="ll",
+ description="GREEK SMALL LETTER SAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x03FA,
+ unicodeslot=0x03FB,
+ },
+ [0x03FC]={
+ category="ll",
+ description="GREEK RHO WITH STROKE SYMBOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x03FC,
+ },
+ [0x03FD]={
+ category="lu",
+ description="GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL",
+ direction="l",
+ lccode=0x037B,
+ linebreak="al",
+ unicodeslot=0x03FD,
+ },
+ [0x03FE]={
+ category="lu",
+ description="GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL",
+ direction="l",
+ lccode=0x037C,
+ linebreak="al",
+ unicodeslot=0x03FE,
+ },
+ [0x03FF]={
+ category="lu",
+ description="GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL",
+ direction="l",
+ lccode=0x037D,
+ linebreak="al",
+ unicodeslot=0x03FF,
+ },
+ [0x0400]={
+ category="lu",
+ contextname="cyrillicEgrave",
+ description="CYRILLIC CAPITAL LETTER IE WITH GRAVE",
+ direction="l",
+ lccode=0x0450,
+ linebreak="al",
+ shcode=0x0415,
+ specials={ "char", 0x0415, 0x0300 },
+ unicodeslot=0x0400,
+ },
+ [0x0401]={
+ adobename="afii10023",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicYO",
+ description="CYRILLIC CAPITAL LETTER IO",
+ direction="l",
+ lccode=0x0451,
+ linebreak="al",
+ specials={ "char", 0x0415, 0x0308 },
+ unicodeslot=0x0401,
+ },
+ [0x0402]={
+ adobename="afii10051",
+ category="lu",
+ contextname="cyrillicDJE",
+ description="CYRILLIC CAPITAL LETTER DJE",
+ direction="l",
+ lccode=0x0452,
+ linebreak="al",
+ unicodeslot=0x0402,
+ },
+ [0x0403]={
+ adobename="afii10052",
+ category="lu",
+ contextname="cyrillicGJE",
+ description="CYRILLIC CAPITAL LETTER GJE",
+ direction="l",
+ lccode=0x0453,
+ linebreak="al",
+ specials={ "char", 0x0413, 0x0301 },
+ unicodeslot=0x0403,
+ },
+ [0x0404]={
+ adobename="afii10053",
+ category="lu",
+ contextname="cyrillicIE",
+ description="CYRILLIC CAPITAL LETTER UKRAINIAN IE",
+ direction="l",
+ lccode=0x0454,
+ linebreak="al",
+ unicodeslot=0x0404,
+ },
+ [0x0405]={
+ adobename="afii10054",
+ category="lu",
+ contextname="cyrillicDZE",
+ description="CYRILLIC CAPITAL LETTER DZE",
+ direction="l",
+ lccode=0x0455,
+ linebreak="al",
+ unicodeslot=0x0405,
+ },
+ [0x0406]={
+ adobename="afii10055",
+ category="lu",
+ contextname="cyrillicII",
+ description="CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I",
+ direction="l",
+ lccode=0x0456,
+ linebreak="al",
+ unicodeslot=0x0406,
+ },
+ [0x0407]={
+ adobename="afii10056",
+ category="lu",
+ contextname="cyrillicYI",
+ description="CYRILLIC CAPITAL LETTER YI",
+ direction="l",
+ lccode=0x0457,
+ linebreak="al",
+ specials={ "char", 0x0406, 0x0308 },
+ unicodeslot=0x0407,
+ },
+ [0x0408]={
+ adobename="afii10057",
+ category="lu",
+ contextname="cyrillicJE",
+ description="CYRILLIC CAPITAL LETTER JE",
+ direction="l",
+ lccode=0x0458,
+ linebreak="al",
+ unicodeslot=0x0408,
+ },
+ [0x0409]={
+ adobename="afii10058",
+ category="lu",
+ contextname="cyrillicLJE",
+ description="CYRILLIC CAPITAL LETTER LJE",
+ direction="l",
+ lccode=0x0459,
+ linebreak="al",
+ unicodeslot=0x0409,
+ },
+ [0x040A]={
+ adobename="afii10059",
+ category="lu",
+ contextname="cyrillicNJE",
+ description="CYRILLIC CAPITAL LETTER NJE",
+ direction="l",
+ lccode=0x045A,
+ linebreak="al",
+ unicodeslot=0x040A,
+ },
+ [0x040B]={
+ adobename="afii10060",
+ category="lu",
+ contextname="cyrillicTSHE",
+ description="CYRILLIC CAPITAL LETTER TSHE",
+ direction="l",
+ lccode=0x045B,
+ linebreak="al",
+ unicodeslot=0x040B,
+ },
+ [0x040C]={
+ adobename="afii10061",
+ category="lu",
+ contextname="cyrillicKJE",
+ description="CYRILLIC CAPITAL LETTER KJE",
+ direction="l",
+ lccode=0x045C,
+ linebreak="al",
+ specials={ "char", 0x041A, 0x0301 },
+ unicodeslot=0x040C,
+ },
+ [0x040D]={
+ category="lu",
+ contextname="cyrillicIgrave",
+ description="CYRILLIC CAPITAL LETTER I WITH GRAVE",
+ direction="l",
+ lccode=0x045D,
+ linebreak="al",
+ shcode=0x0418,
+ specials={ "char", 0x0418, 0x0300 },
+ unicodeslot=0x040D,
+ },
+ [0x040E]={
+ adobename="afii10062",
+ category="lu",
+ contextname="cyrillicUSHRT",
+ description="CYRILLIC CAPITAL LETTER SHORT U",
+ direction="l",
+ lccode=0x045E,
+ linebreak="al",
+ specials={ "char", 0x0423, 0x0306 },
+ unicodeslot=0x040E,
+ },
+ [0x040F]={
+ adobename="afii10145",
+ category="lu",
+ contextname="cyrillicDZHE",
+ description="CYRILLIC CAPITAL LETTER DZHE",
+ direction="l",
+ lccode=0x045F,
+ linebreak="al",
+ unicodeslot=0x040F,
+ },
+ [0x0410]={
+ adobename="afii10017",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicA",
+ description="CYRILLIC CAPITAL LETTER A",
+ direction="l",
+ lccode=0x0430,
+ linebreak="al",
+ unicodeslot=0x0410,
+ },
+ [0x0411]={
+ adobename="afii10018",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicB",
+ description="CYRILLIC CAPITAL LETTER BE",
+ direction="l",
+ lccode=0x0431,
+ linebreak="al",
+ unicodeslot=0x0411,
+ },
+ [0x0412]={
+ adobename="afii10019",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicV",
+ description="CYRILLIC CAPITAL LETTER VE",
+ direction="l",
+ lccode=0x0432,
+ linebreak="al",
+ unicodeslot=0x0412,
+ },
+ [0x0413]={
+ adobename="afii10020",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicG",
+ description="CYRILLIC CAPITAL LETTER GHE",
+ direction="l",
+ lccode=0x0433,
+ linebreak="al",
+ unicodeslot=0x0413,
+ },
+ [0x0414]={
+ adobename="afii10021",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicD",
+ description="CYRILLIC CAPITAL LETTER DE",
+ direction="l",
+ lccode=0x0434,
+ linebreak="al",
+ unicodeslot=0x0414,
+ },
+ [0x0415]={
+ adobename="afii10022",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicE",
+ description="CYRILLIC CAPITAL LETTER IE",
+ direction="l",
+ lccode=0x0435,
+ linebreak="al",
+ unicodeslot=0x0415,
+ },
+ [0x0416]={
+ adobename="afii10024",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicZH",
+ description="CYRILLIC CAPITAL LETTER ZHE",
+ direction="l",
+ lccode=0x0436,
+ linebreak="al",
+ unicodeslot=0x0416,
+ },
+ [0x0417]={
+ adobename="afii10025",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicZ",
+ description="CYRILLIC CAPITAL LETTER ZE",
+ direction="l",
+ lccode=0x0437,
+ linebreak="al",
+ unicodeslot=0x0417,
+ },
+ [0x0418]={
+ adobename="afii10026",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicI",
+ description="CYRILLIC CAPITAL LETTER I",
+ direction="l",
+ lccode=0x0438,
+ linebreak="al",
+ unicodeslot=0x0418,
+ },
+ [0x0419]={
+ adobename="afii10027",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicISHRT",
+ description="CYRILLIC CAPITAL LETTER SHORT I",
+ direction="l",
+ lccode=0x0439,
+ linebreak="al",
+ specials={ "char", 0x0418, 0x0306 },
+ unicodeslot=0x0419,
+ },
+ [0x041A]={
+ adobename="afii10028",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicK",
+ description="CYRILLIC CAPITAL LETTER KA",
+ direction="l",
+ lccode=0x043A,
+ linebreak="al",
+ unicodeslot=0x041A,
+ },
+ [0x041B]={
+ adobename="afii10029",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicL",
+ description="CYRILLIC CAPITAL LETTER EL",
+ direction="l",
+ lccode=0x043B,
+ linebreak="al",
+ unicodeslot=0x041B,
+ },
+ [0x041C]={
+ adobename="afii10030",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicM",
+ description="CYRILLIC CAPITAL LETTER EM",
+ direction="l",
+ lccode=0x043C,
+ linebreak="al",
+ unicodeslot=0x041C,
+ },
+ [0x041D]={
+ adobename="afii10031",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicN",
+ description="CYRILLIC CAPITAL LETTER EN",
+ direction="l",
+ lccode=0x043D,
+ linebreak="al",
+ unicodeslot=0x041D,
+ },
+ [0x041E]={
+ adobename="afii10032",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicO",
+ description="CYRILLIC CAPITAL LETTER O",
+ direction="l",
+ lccode=0x043E,
+ linebreak="al",
+ unicodeslot=0x041E,
+ },
+ [0x041F]={
+ adobename="afii10033",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicP",
+ description="CYRILLIC CAPITAL LETTER PE",
+ direction="l",
+ lccode=0x043F,
+ linebreak="al",
+ unicodeslot=0x041F,
+ },
+ [0x0420]={
+ adobename="afii10034",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicR",
+ description="CYRILLIC CAPITAL LETTER ER",
+ direction="l",
+ lccode=0x0440,
+ linebreak="al",
+ unicodeslot=0x0420,
+ },
+ [0x0421]={
+ adobename="afii10035",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicS",
+ description="CYRILLIC CAPITAL LETTER ES",
+ direction="l",
+ lccode=0x0441,
+ linebreak="al",
+ unicodeslot=0x0421,
+ },
+ [0x0422]={
+ adobename="afii10036",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicT",
+ description="CYRILLIC CAPITAL LETTER TE",
+ direction="l",
+ lccode=0x0442,
+ linebreak="al",
+ unicodeslot=0x0422,
+ },
+ [0x0423]={
+ adobename="afii10037",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicU",
+ description="CYRILLIC CAPITAL LETTER U",
+ direction="l",
+ lccode=0x0443,
+ linebreak="al",
+ unicodeslot=0x0423,
+ },
+ [0x0424]={
+ adobename="afii10038",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicF",
+ description="CYRILLIC CAPITAL LETTER EF",
+ direction="l",
+ lccode=0x0444,
+ linebreak="al",
+ unicodeslot=0x0424,
+ },
+ [0x0425]={
+ adobename="afii10039",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicH",
+ description="CYRILLIC CAPITAL LETTER HA",
+ direction="l",
+ lccode=0x0445,
+ linebreak="al",
+ unicodeslot=0x0425,
+ },
+ [0x0426]={
+ adobename="afii10040",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicC",
+ description="CYRILLIC CAPITAL LETTER TSE",
+ direction="l",
+ lccode=0x0446,
+ linebreak="al",
+ unicodeslot=0x0426,
+ },
+ [0x0427]={
+ adobename="afii10041",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicCH",
+ description="CYRILLIC CAPITAL LETTER CHE",
+ direction="l",
+ lccode=0x0447,
+ linebreak="al",
+ unicodeslot=0x0427,
+ },
+ [0x0428]={
+ adobename="afii10042",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicSH",
+ description="CYRILLIC CAPITAL LETTER SHA",
+ direction="l",
+ lccode=0x0448,
+ linebreak="al",
+ unicodeslot=0x0428,
+ },
+ [0x0429]={
+ adobename="afii10043",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicSHCH",
+ description="CYRILLIC CAPITAL LETTER SHCHA",
+ direction="l",
+ lccode=0x0449,
+ linebreak="al",
+ unicodeslot=0x0429,
+ },
+ [0x042A]={
+ adobename="afii10044",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicHRDSN",
+ description="CYRILLIC CAPITAL LETTER HARD SIGN",
+ direction="l",
+ lccode=0x044A,
+ linebreak="al",
+ unicodeslot=0x042A,
+ },
+ [0x042B]={
+ adobename="afii10045",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicERY",
+ description="CYRILLIC CAPITAL LETTER YERU",
+ direction="l",
+ lccode=0x044B,
+ linebreak="al",
+ unicodeslot=0x042B,
+ },
+ [0x042C]={
+ adobename="afii10046",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicSFTSN",
+ description="CYRILLIC CAPITAL LETTER SOFT SIGN",
+ direction="l",
+ lccode=0x044C,
+ linebreak="al",
+ unicodeslot=0x042C,
+ },
+ [0x042D]={
+ adobename="afii10047",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicEREV",
+ description="CYRILLIC CAPITAL LETTER E",
+ direction="l",
+ lccode=0x044D,
+ linebreak="al",
+ unicodeslot=0x042D,
+ },
+ [0x042E]={
+ adobename="afii10048",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicYU",
+ description="CYRILLIC CAPITAL LETTER YU",
+ direction="l",
+ lccode=0x044E,
+ linebreak="al",
+ unicodeslot=0x042E,
+ },
+ [0x042F]={
+ adobename="afii10049",
+ category="lu",
+ cjkwd="a",
+ contextname="cyrillicYA",
+ description="CYRILLIC CAPITAL LETTER YA",
+ direction="l",
+ lccode=0x044F,
+ linebreak="al",
+ unicodeslot=0x042F,
+ },
+ [0x0430]={
+ adobename="afii10065",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillica",
+ description="CYRILLIC SMALL LETTER A",
+ direction="l",
+ linebreak="al",
+ uccode=0x0410,
+ unicodeslot=0x0430,
+ },
+ [0x0431]={
+ adobename="afii10066",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicb",
+ description="CYRILLIC SMALL LETTER BE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0411,
+ unicodeslot=0x0431,
+ },
+ [0x0432]={
+ adobename="afii10067",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicv",
+ description="CYRILLIC SMALL LETTER VE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0412,
+ unicodeslot=0x0432,
+ },
+ [0x0433]={
+ adobename="afii10068",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicg",
+ description="CYRILLIC SMALL LETTER GHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0413,
+ unicodeslot=0x0433,
+ },
+ [0x0434]={
+ adobename="afii10069",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicd",
+ description="CYRILLIC SMALL LETTER DE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0414,
+ unicodeslot=0x0434,
+ },
+ [0x0435]={
+ adobename="afii10070",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillice",
+ description="CYRILLIC SMALL LETTER IE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0415,
+ unicodeslot=0x0435,
+ },
+ [0x0436]={
+ adobename="afii10072",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrilliczh",
+ description="CYRILLIC SMALL LETTER ZHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0416,
+ unicodeslot=0x0436,
+ },
+ [0x0437]={
+ adobename="afii10073",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicz",
+ description="CYRILLIC SMALL LETTER ZE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0417,
+ unicodeslot=0x0437,
+ },
+ [0x0438]={
+ adobename="afii10074",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillici",
+ description="CYRILLIC SMALL LETTER I",
+ direction="l",
+ linebreak="al",
+ uccode=0x0418,
+ unicodeslot=0x0438,
+ },
+ [0x0439]={
+ adobename="afii10075",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicishrt",
+ description="CYRILLIC SMALL LETTER SHORT I",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0438, 0x0306 },
+ uccode=0x0419,
+ unicodeslot=0x0439,
+ },
+ [0x043A]={
+ adobename="afii10076",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillick",
+ description="CYRILLIC SMALL LETTER KA",
+ direction="l",
+ linebreak="al",
+ uccode=0x041A,
+ unicodeslot=0x043A,
+ },
+ [0x043B]={
+ adobename="afii10077",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicl",
+ description="CYRILLIC SMALL LETTER EL",
+ direction="l",
+ linebreak="al",
+ uccode=0x041B,
+ unicodeslot=0x043B,
+ },
+ [0x043C]={
+ adobename="afii10078",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicm",
+ description="CYRILLIC SMALL LETTER EM",
+ direction="l",
+ linebreak="al",
+ uccode=0x041C,
+ unicodeslot=0x043C,
+ },
+ [0x043D]={
+ adobename="afii10079",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicn",
+ description="CYRILLIC SMALL LETTER EN",
+ direction="l",
+ linebreak="al",
+ uccode=0x041D,
+ unicodeslot=0x043D,
+ },
+ [0x043E]={
+ adobename="afii10080",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillico",
+ description="CYRILLIC SMALL LETTER O",
+ direction="l",
+ linebreak="al",
+ uccode=0x041E,
+ unicodeslot=0x043E,
+ },
+ [0x043F]={
+ adobename="afii10081",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicp",
+ description="CYRILLIC SMALL LETTER PE",
+ direction="l",
+ linebreak="al",
+ uccode=0x041F,
+ unicodeslot=0x043F,
+ },
+ [0x0440]={
+ adobename="afii10082",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicr",
+ description="CYRILLIC SMALL LETTER ER",
+ direction="l",
+ linebreak="al",
+ uccode=0x0420,
+ unicodeslot=0x0440,
+ },
+ [0x0441]={
+ adobename="afii10083",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillics",
+ description="CYRILLIC SMALL LETTER ES",
+ direction="l",
+ linebreak="al",
+ uccode=0x0421,
+ unicodeslot=0x0441,
+ },
+ [0x0442]={
+ adobename="afii10084",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillict",
+ description="CYRILLIC SMALL LETTER TE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0422,
+ unicodeslot=0x0442,
+ },
+ [0x0443]={
+ adobename="afii10085",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicu",
+ description="CYRILLIC SMALL LETTER U",
+ direction="l",
+ linebreak="al",
+ uccode=0x0423,
+ unicodeslot=0x0443,
+ },
+ [0x0444]={
+ adobename="afii10086",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicf",
+ description="CYRILLIC SMALL LETTER EF",
+ direction="l",
+ linebreak="al",
+ uccode=0x0424,
+ unicodeslot=0x0444,
+ },
+ [0x0445]={
+ adobename="afii10087",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillich",
+ description="CYRILLIC SMALL LETTER HA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0425,
+ unicodeslot=0x0445,
+ },
+ [0x0446]={
+ adobename="afii10088",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicc",
+ description="CYRILLIC SMALL LETTER TSE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0426,
+ unicodeslot=0x0446,
+ },
+ [0x0447]={
+ adobename="afii10089",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicch",
+ description="CYRILLIC SMALL LETTER CHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0427,
+ unicodeslot=0x0447,
+ },
+ [0x0448]={
+ adobename="afii10090",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicsh",
+ description="CYRILLIC SMALL LETTER SHA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0428,
+ unicodeslot=0x0448,
+ },
+ [0x0449]={
+ adobename="afii10091",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicshch",
+ description="CYRILLIC SMALL LETTER SHCHA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0429,
+ unicodeslot=0x0449,
+ },
+ [0x044A]={
+ adobename="afii10092",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillichrdsn",
+ description="CYRILLIC SMALL LETTER HARD SIGN",
+ direction="l",
+ linebreak="al",
+ uccode=0x042A,
+ unicodeslot=0x044A,
+ },
+ [0x044B]={
+ adobename="afii10093",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicery",
+ description="CYRILLIC SMALL LETTER YERU",
+ direction="l",
+ linebreak="al",
+ uccode=0x042B,
+ unicodeslot=0x044B,
+ },
+ [0x044C]={
+ adobename="afii10094",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicsftsn",
+ description="CYRILLIC SMALL LETTER SOFT SIGN",
+ direction="l",
+ linebreak="al",
+ uccode=0x042C,
+ unicodeslot=0x044C,
+ },
+ [0x044D]={
+ adobename="afii10095",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicerev",
+ description="CYRILLIC SMALL LETTER E",
+ direction="l",
+ linebreak="al",
+ uccode=0x042D,
+ unicodeslot=0x044D,
+ },
+ [0x044E]={
+ adobename="afii10096",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicyu",
+ description="CYRILLIC SMALL LETTER YU",
+ direction="l",
+ linebreak="al",
+ uccode=0x042E,
+ unicodeslot=0x044E,
+ },
+ [0x044F]={
+ adobename="afii10097",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicya",
+ description="CYRILLIC SMALL LETTER YA",
+ direction="l",
+ linebreak="al",
+ uccode=0x042F,
+ unicodeslot=0x044F,
+ },
+ [0x0450]={
+ category="ll",
+ contextname="cyrillicegrave",
+ description="CYRILLIC SMALL LETTER IE WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0435,
+ specials={ "char", 0x0435, 0x0300 },
+ uccode=0x0400,
+ unicodeslot=0x0450,
+ },
+ [0x0451]={
+ adobename="afii10071",
+ category="ll",
+ cjkwd="a",
+ contextname="cyrillicyo",
+ description="CYRILLIC SMALL LETTER IO",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0435, 0x0308 },
+ uccode=0x0401,
+ unicodeslot=0x0451,
+ },
+ [0x0452]={
+ adobename="afii10099",
+ category="ll",
+ contextname="cyrillicdje",
+ description="CYRILLIC SMALL LETTER DJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0402,
+ unicodeslot=0x0452,
+ },
+ [0x0453]={
+ adobename="afii10100",
+ category="ll",
+ contextname="cyrillicgje",
+ description="CYRILLIC SMALL LETTER GJE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0433, 0x0301 },
+ uccode=0x0403,
+ unicodeslot=0x0453,
+ },
+ [0x0454]={
+ adobename="afii10101",
+ category="ll",
+ contextname="cyrillicie",
+ description="CYRILLIC SMALL LETTER UKRAINIAN IE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0404,
+ unicodeslot=0x0454,
+ },
+ [0x0455]={
+ adobename="afii10102",
+ category="ll",
+ contextname="cyrillicdze",
+ description="CYRILLIC SMALL LETTER DZE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0405,
+ unicodeslot=0x0455,
+ },
+ [0x0456]={
+ adobename="afii10103",
+ category="ll",
+ contextname="cyrillicii",
+ description="CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I",
+ direction="l",
+ linebreak="al",
+ uccode=0x0406,
+ unicodeslot=0x0456,
+ },
+ [0x0457]={
+ adobename="afii10104",
+ category="ll",
+ contextname="cyrillicyi",
+ description="CYRILLIC SMALL LETTER YI",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0456, 0x0308 },
+ uccode=0x0407,
+ unicodeslot=0x0457,
+ },
+ [0x0458]={
+ adobename="afii10105",
+ category="ll",
+ contextname="cyrillicje",
+ description="CYRILLIC SMALL LETTER JE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0408,
+ unicodeslot=0x0458,
+ },
+ [0x0459]={
+ adobename="afii10106",
+ category="ll",
+ contextname="cyrilliclje",
+ description="CYRILLIC SMALL LETTER LJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0409,
+ unicodeslot=0x0459,
+ },
+ [0x045A]={
+ adobename="afii10107",
+ category="ll",
+ contextname="cyrillicnje",
+ description="CYRILLIC SMALL LETTER NJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x040A,
+ unicodeslot=0x045A,
+ },
+ [0x045B]={
+ adobename="afii10108",
+ category="ll",
+ contextname="cyrillictshe",
+ description="CYRILLIC SMALL LETTER TSHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x040B,
+ unicodeslot=0x045B,
+ },
+ [0x045C]={
+ adobename="afii10109",
+ category="ll",
+ contextname="cyrillickje",
+ description="CYRILLIC SMALL LETTER KJE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x043A, 0x0301 },
+ uccode=0x040C,
+ unicodeslot=0x045C,
+ },
+ [0x045D]={
+ category="ll",
+ contextname="cyrillicigrave",
+ description="CYRILLIC SMALL LETTER I WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0438,
+ specials={ "char", 0x0438, 0x0300 },
+ uccode=0x040D,
+ unicodeslot=0x045D,
+ },
+ [0x045E]={
+ adobename="afii10110",
+ category="ll",
+ contextname="cyrillicushrt",
+ description="CYRILLIC SMALL LETTER SHORT U",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0443, 0x0306 },
+ uccode=0x040E,
+ unicodeslot=0x045E,
+ },
+ [0x045F]={
+ adobename="afii10193",
+ category="ll",
+ contextname="cyrillicdzhe",
+ description="CYRILLIC SMALL LETTER DZHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x040F,
+ unicodeslot=0x045F,
+ },
+ [0x0460]={
+ category="lu",
+ contextname="cyrillicOMEGA",
+ description="CYRILLIC CAPITAL LETTER OMEGA",
+ direction="l",
+ lccode=0x0461,
+ linebreak="al",
+ unicodeslot=0x0460,
+ },
+ [0x0461]={
+ category="ll",
+ contextname="cyrillicomega",
+ description="CYRILLIC SMALL LETTER OMEGA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0460,
+ unicodeslot=0x0461,
+ },
+ [0x0462]={
+ adobename="afii10146",
+ category="lu",
+ contextname="cyrillicYAT",
+ description="CYRILLIC CAPITAL LETTER YAT",
+ direction="l",
+ lccode=0x0463,
+ linebreak="al",
+ unicodeslot=0x0462,
+ },
+ [0x0463]={
+ adobename="afii10194",
+ category="ll",
+ contextname="cyrillicyat",
+ description="CYRILLIC SMALL LETTER YAT",
+ direction="l",
+ linebreak="al",
+ uccode=0x0462,
+ unicodeslot=0x0463,
+ },
+ [0x0464]={
+ category="lu",
+ contextname="cyrillicEiotified",
+ description="CYRILLIC CAPITAL LETTER IOTIFIED E",
+ direction="l",
+ lccode=0x0465,
+ linebreak="al",
+ unicodeslot=0x0464,
+ },
+ [0x0465]={
+ category="ll",
+ contextname="cyrilliceiotified",
+ description="CYRILLIC SMALL LETTER IOTIFIED E",
+ direction="l",
+ linebreak="al",
+ uccode=0x0464,
+ unicodeslot=0x0465,
+ },
+ [0x0466]={
+ category="lu",
+ contextname="cyrillicLITTLEYUS",
+ description="CYRILLIC CAPITAL LETTER LITTLE YUS",
+ direction="l",
+ lccode=0x0467,
+ linebreak="al",
+ unicodeslot=0x0466,
+ },
+ [0x0467]={
+ category="ll",
+ contextname="cyrilliclittleyus",
+ description="CYRILLIC SMALL LETTER LITTLE YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x0466,
+ unicodeslot=0x0467,
+ },
+ [0x0468]={
+ category="lu",
+ contextname="cyrillicLITTLEYUSiotified",
+ description="CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS",
+ direction="l",
+ lccode=0x0469,
+ linebreak="al",
+ unicodeslot=0x0468,
+ },
+ [0x0469]={
+ category="ll",
+ contextname="cyrilliclittleyusiotified",
+ description="CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x0468,
+ unicodeslot=0x0469,
+ },
+ [0x046A]={
+ category="lu",
+ contextname="cyrillicBIGYUS",
+ description="CYRILLIC CAPITAL LETTER BIG YUS",
+ direction="l",
+ lccode=0x046B,
+ linebreak="al",
+ unicodeslot=0x046A,
+ },
+ [0x046B]={
+ category="ll",
+ contextname="cyrillicbigyus",
+ description="CYRILLIC SMALL LETTER BIG YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x046A,
+ unicodeslot=0x046B,
+ },
+ [0x046C]={
+ category="lu",
+ contextname="cyrillicBIGYUSiotified",
+ description="CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS",
+ direction="l",
+ lccode=0x046D,
+ linebreak="al",
+ unicodeslot=0x046C,
+ },
+ [0x046D]={
+ category="ll",
+ contextname="cyrillicbigyusiotified",
+ description="CYRILLIC SMALL LETTER IOTIFIED BIG YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x046C,
+ unicodeslot=0x046D,
+ },
+ [0x046E]={
+ category="lu",
+ contextname="cyrillicKSI",
+ description="CYRILLIC CAPITAL LETTER KSI",
+ direction="l",
+ lccode=0x046F,
+ linebreak="al",
+ unicodeslot=0x046E,
+ },
+ [0x046F]={
+ category="ll",
+ contextname="cyrillicksi",
+ description="CYRILLIC SMALL LETTER KSI",
+ direction="l",
+ linebreak="al",
+ uccode=0x046E,
+ unicodeslot=0x046F,
+ },
+ [0x0470]={
+ category="lu",
+ contextname="cyrillicPSI",
+ description="CYRILLIC CAPITAL LETTER PSI",
+ direction="l",
+ lccode=0x0471,
+ linebreak="al",
+ unicodeslot=0x0470,
+ },
+ [0x0471]={
+ category="ll",
+ contextname="cyrillicpsi",
+ description="CYRILLIC SMALL LETTER PSI",
+ direction="l",
+ linebreak="al",
+ uccode=0x0470,
+ unicodeslot=0x0471,
+ },
+ [0x0472]={
+ adobename="afii10147",
+ category="lu",
+ contextname="cyrillicFITA",
+ description="CYRILLIC CAPITAL LETTER FITA",
+ direction="l",
+ lccode=0x0473,
+ linebreak="al",
+ unicodeslot=0x0472,
+ },
+ [0x0473]={
+ adobename="afii10195",
+ category="ll",
+ contextname="cyrillicfita",
+ description="CYRILLIC SMALL LETTER FITA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0472,
+ unicodeslot=0x0473,
+ },
+ [0x0474]={
+ adobename="afii10148",
+ category="lu",
+ contextname="cyrillicIZHITSA",
+ description="CYRILLIC CAPITAL LETTER IZHITSA",
+ direction="l",
+ lccode=0x0475,
+ linebreak="al",
+ unicodeslot=0x0474,
+ },
+ [0x0475]={
+ adobename="afii10196",
+ category="ll",
+ contextname="cyrillicizhitsa",
+ description="CYRILLIC SMALL LETTER IZHITSA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0474,
+ unicodeslot=0x0475,
+ },
+ [0x0476]={
+ category="lu",
+ contextname="cyrillicIZHITSAdoublegrave",
+ description="CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT",
+ direction="l",
+ lccode=0x0477,
+ linebreak="al",
+ shcode=0x0474,
+ specials={ "char", 0x0474, 0x030F },
+ unicodeslot=0x0476,
+ },
+ [0x0477]={
+ category="ll",
+ contextname="cyrillicizhitsadoublegrave",
+ description="CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT",
+ direction="l",
+ linebreak="al",
+ shcode=0x0475,
+ specials={ "char", 0x0475, 0x030F },
+ uccode=0x0476,
+ unicodeslot=0x0477,
+ },
+ [0x0478]={
+ category="lu",
+ contextname="cyrillicUK",
+ description="CYRILLIC CAPITAL LETTER UK",
+ direction="l",
+ lccode=0x0479,
+ linebreak="al",
+ unicodeslot=0x0478,
+ },
+ [0x0479]={
+ category="ll",
+ contextname="cyrillicuk",
+ description="CYRILLIC SMALL LETTER UK",
+ direction="l",
+ linebreak="al",
+ uccode=0x0478,
+ unicodeslot=0x0479,
+ },
+ [0x047A]={
+ category="lu",
+ contextname="cyrillicOMEGAround",
+ description="CYRILLIC CAPITAL LETTER ROUND OMEGA",
+ direction="l",
+ lccode=0x047B,
+ linebreak="al",
+ unicodeslot=0x047A,
+ },
+ [0x047B]={
+ category="ll",
+ contextname="cyrillicomegaround",
+ description="CYRILLIC SMALL LETTER ROUND OMEGA",
+ direction="l",
+ linebreak="al",
+ uccode=0x047A,
+ unicodeslot=0x047B,
+ },
+ [0x047C]={
+ category="lu",
+ contextname="cyrillicOMEGAtitlo",
+ description="CYRILLIC CAPITAL LETTER OMEGA WITH TITLO",
+ direction="l",
+ lccode=0x047D,
+ linebreak="al",
+ shcode=0x0460,
+ unicodeslot=0x047C,
+ },
+ [0x047D]={
+ category="ll",
+ contextname="cyrillicomegatitlo",
+ description="CYRILLIC SMALL LETTER OMEGA WITH TITLO",
+ direction="l",
+ linebreak="al",
+ shcode=0x0461,
+ uccode=0x047C,
+ unicodeslot=0x047D,
+ },
+ [0x047E]={
+ category="lu",
+ contextname="cyrillicOT",
+ description="CYRILLIC CAPITAL LETTER OT",
+ direction="l",
+ lccode=0x047F,
+ linebreak="al",
+ unicodeslot=0x047E,
+ },
+ [0x047F]={
+ category="ll",
+ contextname="cyrillicot",
+ description="CYRILLIC SMALL LETTER OT",
+ direction="l",
+ linebreak="al",
+ uccode=0x047E,
+ unicodeslot=0x047F,
+ },
+ [0x0480]={
+ category="lu",
+ contextname="cyrillicKOPPA",
+ description="CYRILLIC CAPITAL LETTER KOPPA",
+ direction="l",
+ lccode=0x0481,
+ linebreak="al",
+ unicodeslot=0x0480,
+ },
+ [0x0481]={
+ category="ll",
+ contextname="cyrillickoppa",
+ description="CYRILLIC SMALL LETTER KOPPA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0480,
+ unicodeslot=0x0481,
+ },
+ [0x0482]={
+ category="so",
+ description="CYRILLIC THOUSANDS SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0482,
+ },
+ [0x0483]={
+ category="mn",
+ contextname="cyrillicTITLO",
+ description="COMBINING CYRILLIC TITLO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0483,
+ },
+ [0x0484]={
+ category="mn",
+ contextname="cyrillicPALATALIZATION",
+ description="COMBINING CYRILLIC PALATALIZATION",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0484,
+ },
+ [0x0485]={
+ category="mn",
+ contextname="cyrillicDASIAPNEUMATA",
+ description="COMBINING CYRILLIC DASIA PNEUMATA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0485,
+ },
+ [0x0486]={
+ category="mn",
+ contextname="cyrillicPSILIPNEUMATA",
+ description="COMBINING CYRILLIC PSILI PNEUMATA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0486,
+ },
+ [0x0488]={
+ category="me",
+ description="COMBINING CYRILLIC HUNDRED THOUSANDS SIGN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0488,
+ },
+ [0x0489]={
+ category="me",
+ description="COMBINING CYRILLIC MILLIONS SIGN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0489,
+ },
+ [0x048A]={
+ category="lu",
+ contextname="cyrillicISHRTtail",
+ description="CYRILLIC CAPITAL LETTER SHORT I WITH TAIL",
+ direction="l",
+ lccode=0x048B,
+ linebreak="al",
+ unicodeslot=0x048A,
+ },
+ [0x048B]={
+ category="ll",
+ contextname="cyrillicishrttail",
+ description="CYRILLIC SMALL LETTER SHORT I WITH TAIL",
+ direction="l",
+ linebreak="al",
+ uccode=0x048A,
+ unicodeslot=0x048B,
+ },
+ [0x048C]={
+ category="lu",
+ contextname="cyrillicSEMISOFT",
+ description="CYRILLIC CAPITAL LETTER SEMISOFT SIGN",
+ direction="l",
+ lccode=0x048D,
+ linebreak="al",
+ unicodeslot=0x048C,
+ },
+ [0x048D]={
+ category="ll",
+ contextname="cyrillicsemisoft",
+ description="CYRILLIC SMALL LETTER SEMISOFT SIGN",
+ direction="l",
+ linebreak="al",
+ uccode=0x048C,
+ unicodeslot=0x048D,
+ },
+ [0x048E]={
+ category="lu",
+ contextname="cyrillicERtick",
+ description="CYRILLIC CAPITAL LETTER ER WITH TICK",
+ direction="l",
+ lccode=0x048F,
+ linebreak="al",
+ shcode=0x0420,
+ unicodeslot=0x048E,
+ },
+ [0x048F]={
+ category="ll",
+ contextname="cyrillicertick",
+ description="CYRILLIC SMALL LETTER ER WITH TICK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0440,
+ uccode=0x048E,
+ unicodeslot=0x048F,
+ },
+ [0x0490]={
+ adobename="afii10050",
+ category="lu",
+ contextname="cyrillicGHEupturn",
+ description="CYRILLIC CAPITAL LETTER GHE WITH UPTURN",
+ direction="l",
+ lccode=0x0491,
+ linebreak="al",
+ shcode=0x0413,
+ unicodeslot=0x0490,
+ },
+ [0x0491]={
+ adobename="afii10098",
+ category="ll",
+ contextname="cyrillicgheupturn",
+ description="CYRILLIC SMALL LETTER GHE WITH UPTURN",
+ direction="l",
+ linebreak="al",
+ shcode=0x0433,
+ uccode=0x0490,
+ unicodeslot=0x0491,
+ },
+ [0x0492]={
+ category="lu",
+ contextname="cyrillicGHEstroke",
+ description="CYRILLIC CAPITAL LETTER GHE WITH STROKE",
+ direction="l",
+ lccode=0x0493,
+ linebreak="al",
+ shcode=0x0413,
+ unicodeslot=0x0492,
+ },
+ [0x0493]={
+ category="ll",
+ contextname="cyrillicghestroke",
+ description="CYRILLIC SMALL LETTER GHE WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0433,
+ uccode=0x0492,
+ unicodeslot=0x0493,
+ },
+ [0x0494]={
+ category="lu",
+ contextname="cyrillicGHEmidhook",
+ description="CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK",
+ direction="l",
+ lccode=0x0495,
+ linebreak="al",
+ shcode=0x0413,
+ unicodeslot=0x0494,
+ },
+ [0x0495]={
+ category="ll",
+ contextname="cyrillicghemidhook",
+ description="CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0433,
+ uccode=0x0494,
+ unicodeslot=0x0495,
+ },
+ [0x0496]={
+ category="lu",
+ contextname="cyrillicZHEdescender",
+ description="CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER",
+ direction="l",
+ lccode=0x0497,
+ linebreak="al",
+ shcode=0x0416,
+ unicodeslot=0x0496,
+ },
+ [0x0497]={
+ category="ll",
+ contextname="cyrilliczhedescender",
+ description="CYRILLIC SMALL LETTER ZHE WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0436,
+ uccode=0x0496,
+ unicodeslot=0x0497,
+ },
+ [0x0498]={
+ category="lu",
+ contextname="cyrillicZDSC",
+ description="CYRILLIC CAPITAL LETTER ZE WITH DESCENDER",
+ direction="l",
+ lccode=0x0499,
+ linebreak="al",
+ shcode=0x0417,
+ unicodeslot=0x0498,
+ },
+ [0x0499]={
+ category="ll",
+ contextname="cyrilliczdsc",
+ description="CYRILLIC SMALL LETTER ZE WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0437,
+ uccode=0x0498,
+ unicodeslot=0x0499,
+ },
+ [0x049A]={
+ category="lu",
+ contextname="cyrillicKADC",
+ description="CYRILLIC CAPITAL LETTER KA WITH DESCENDER",
+ direction="l",
+ lccode=0x049B,
+ linebreak="al",
+ shcode=0x041A,
+ unicodeslot=0x049A,
+ },
+ [0x049B]={
+ category="ll",
+ contextname="cyrillickadc",
+ description="CYRILLIC SMALL LETTER KA WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x043A,
+ uccode=0x049A,
+ unicodeslot=0x049B,
+ },
+ [0x049C]={
+ category="lu",
+ contextname="cyrillicKAvertstroke",
+ description="CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE",
+ direction="l",
+ lccode=0x049D,
+ linebreak="al",
+ shcode=0x041A,
+ unicodeslot=0x049C,
+ },
+ [0x049D]={
+ category="ll",
+ contextname="cyrillickavertstroke",
+ description="CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x043A,
+ uccode=0x049C,
+ unicodeslot=0x049D,
+ },
+ [0x049E]={
+ category="lu",
+ contextname="cyrillicKAstroke",
+ description="CYRILLIC CAPITAL LETTER KA WITH STROKE",
+ direction="l",
+ lccode=0x049F,
+ linebreak="al",
+ shcode=0x041A,
+ unicodeslot=0x049E,
+ },
+ [0x049F]={
+ category="ll",
+ contextname="cyrillickastroke",
+ description="CYRILLIC SMALL LETTER KA WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x043A,
+ uccode=0x049E,
+ unicodeslot=0x049F,
+ },
+ [0x04A0]={
+ category="lu",
+ contextname="cyrillicKAbashkir",
+ description="CYRILLIC CAPITAL LETTER BASHKIR KA",
+ direction="l",
+ lccode=0x04A1,
+ linebreak="al",
+ unicodeslot=0x04A0,
+ },
+ [0x04A1]={
+ category="ll",
+ contextname="cyrillickabashkir",
+ description="CYRILLIC SMALL LETTER BASHKIR KA",
+ direction="l",
+ linebreak="al",
+ uccode=0x04A0,
+ unicodeslot=0x04A1,
+ },
+ [0x04A2]={
+ category="lu",
+ contextname="cyrillicENDC",
+ description="CYRILLIC CAPITAL LETTER EN WITH DESCENDER",
+ direction="l",
+ lccode=0x04A3,
+ linebreak="al",
+ shcode=0x041D,
+ unicodeslot=0x04A2,
+ },
+ [0x04A3]={
+ category="ll",
+ contextname="cyrillicendc",
+ description="CYRILLIC SMALL LETTER EN WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x043D,
+ uccode=0x04A2,
+ unicodeslot=0x04A3,
+ },
+ [0x04A4]={
+ category="lu",
+ contextname="cyrillicENGHE",
+ description="CYRILLIC CAPITAL LIGATURE EN GHE",
+ direction="l",
+ lccode=0x04A5,
+ linebreak="al",
+ unicodeslot=0x04A4,
+ },
+ [0x04A5]={
+ category="ll",
+ contextname="cyrillicenghe",
+ description="CYRILLIC SMALL LIGATURE EN GHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x04A4,
+ unicodeslot=0x04A5,
+ },
+ [0x04A6]={
+ category="lu",
+ contextname="cyrillicPEmidhook",
+ description="CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK",
+ direction="l",
+ lccode=0x04A7,
+ linebreak="al",
+ shcode=0x041F,
+ unicodeslot=0x04A6,
+ },
+ [0x04A7]={
+ category="ll",
+ contextname="cyrillicpemidhook",
+ description="CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x043F,
+ uccode=0x04A6,
+ unicodeslot=0x04A7,
+ },
+ [0x04A8]={
+ category="lu",
+ contextname="cyrillicHA",
+ description="CYRILLIC CAPITAL LETTER ABKHASIAN HA",
+ direction="l",
+ lccode=0x04A9,
+ linebreak="al",
+ unicodeslot=0x04A8,
+ },
+ [0x04A9]={
+ category="ll",
+ contextname="cyrillicha",
+ description="CYRILLIC SMALL LETTER ABKHASIAN HA",
+ direction="l",
+ linebreak="al",
+ uccode=0x04A8,
+ unicodeslot=0x04A9,
+ },
+ [0x04AA]={
+ category="lu",
+ contextname="cyrillicSDSC",
+ description="CYRILLIC CAPITAL LETTER ES WITH DESCENDER",
+ direction="l",
+ lccode=0x04AB,
+ linebreak="al",
+ shcode=0x0421,
+ unicodeslot=0x04AA,
+ },
+ [0x04AB]={
+ category="ll",
+ contextname="cyrillicsdsc",
+ description="CYRILLIC SMALL LETTER ES WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0441,
+ uccode=0x04AA,
+ unicodeslot=0x04AB,
+ },
+ [0x04AC]={
+ category="lu",
+ contextname="cyrillicTEDC",
+ description="CYRILLIC CAPITAL LETTER TE WITH DESCENDER",
+ direction="l",
+ lccode=0x04AD,
+ linebreak="al",
+ shcode=0x0422,
+ unicodeslot=0x04AC,
+ },
+ [0x04AD]={
+ category="ll",
+ contextname="cyrillictedc",
+ description="CYRILLIC SMALL LETTER TE WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0442,
+ uccode=0x04AC,
+ unicodeslot=0x04AD,
+ },
+ [0x04AE]={
+ category="lu",
+ contextname="cyrillicYstr",
+ description="CYRILLIC CAPITAL LETTER STRAIGHT U",
+ direction="l",
+ lccode=0x04AF,
+ linebreak="al",
+ unicodeslot=0x04AE,
+ },
+ [0x04AF]={
+ category="ll",
+ contextname="cyrillicystr",
+ description="CYRILLIC SMALL LETTER STRAIGHT U",
+ direction="l",
+ linebreak="al",
+ uccode=0x04AE,
+ unicodeslot=0x04AF,
+ },
+ [0x04B0]={
+ category="lu",
+ contextname="cyrillicYstrstroke",
+ description="CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE",
+ direction="l",
+ lccode=0x04B1,
+ linebreak="al",
+ unicodeslot=0x04B0,
+ },
+ [0x04B1]={
+ category="ll",
+ contextname="cyrillicystrstroke",
+ description="CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE",
+ direction="l",
+ linebreak="al",
+ uccode=0x04B0,
+ unicodeslot=0x04B1,
+ },
+ [0x04B2]={
+ category="lu",
+ contextname="cyrillicHADC",
+ description="CYRILLIC CAPITAL LETTER HA WITH DESCENDER",
+ direction="l",
+ lccode=0x04B3,
+ linebreak="al",
+ shcode=0x0425,
+ unicodeslot=0x04B2,
+ },
+ [0x04B3]={
+ category="ll",
+ contextname="cyrillichadc",
+ description="CYRILLIC SMALL LETTER HA WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0445,
+ uccode=0x04B2,
+ unicodeslot=0x04B3,
+ },
+ [0x04B4]={
+ category="lu",
+ contextname="cyrillicTETSE",
+ description="CYRILLIC CAPITAL LIGATURE TE TSE",
+ direction="l",
+ lccode=0x04B5,
+ linebreak="al",
+ unicodeslot=0x04B4,
+ },
+ [0x04B5]={
+ category="ll",
+ contextname="cyrillictetse",
+ description="CYRILLIC SMALL LIGATURE TE TSE",
+ direction="l",
+ linebreak="al",
+ uccode=0x04B4,
+ unicodeslot=0x04B5,
+ },
+ [0x04B6]={
+ category="lu",
+ contextname="cyrillicCHEDC",
+ description="CYRILLIC CAPITAL LETTER CHE WITH DESCENDER",
+ direction="l",
+ lccode=0x04B7,
+ linebreak="al",
+ shcode=0x0427,
+ unicodeslot=0x04B6,
+ },
+ [0x04B7]={
+ category="ll",
+ contextname="cyrillicchedc",
+ description="CYRILLIC SMALL LETTER CHE WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0447,
+ uccode=0x04B6,
+ unicodeslot=0x04B7,
+ },
+ [0x04B8]={
+ category="lu",
+ contextname="cyrillicCHEvertstroke",
+ description="CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE",
+ direction="l",
+ lccode=0x04B9,
+ linebreak="al",
+ shcode=0x0427,
+ unicodeslot=0x04B8,
+ },
+ [0x04B9]={
+ category="ll",
+ contextname="cyrillicchevertstroke",
+ description="CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0447,
+ uccode=0x04B8,
+ unicodeslot=0x04B9,
+ },
+ [0x04BA]={
+ category="lu",
+ contextname="cyrillicSHHA",
+ description="CYRILLIC CAPITAL LETTER SHHA",
+ direction="l",
+ lccode=0x04BB,
+ linebreak="al",
+ unicodeslot=0x04BA,
+ },
+ [0x04BB]={
+ category="ll",
+ contextname="cyrillicshha",
+ description="CYRILLIC SMALL LETTER SHHA",
+ direction="l",
+ linebreak="al",
+ uccode=0x04BA,
+ unicodeslot=0x04BB,
+ },
+ [0x04BC]={
+ category="lu",
+ contextname="cyrillicCHEabkhasian",
+ description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE",
+ direction="l",
+ lccode=0x04BD,
+ linebreak="al",
+ unicodeslot=0x04BC,
+ },
+ [0x04BD]={
+ category="ll",
+ contextname="cyrilliccheabkhasian",
+ description="CYRILLIC SMALL LETTER ABKHASIAN CHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x04BC,
+ unicodeslot=0x04BD,
+ },
+ [0x04BE]={
+ category="lu",
+ contextname="cyrillicCHEDCabkhasian",
+ description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER",
+ direction="l",
+ lccode=0x04BF,
+ linebreak="al",
+ unicodeslot=0x04BE,
+ },
+ [0x04BF]={
+ category="ll",
+ contextname="cyrillicchedcabkhasian",
+ description="CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ uccode=0x04BE,
+ unicodeslot=0x04BF,
+ },
+ [0x04C0]={
+ category="lu",
+ contextname="cyrillicPALOCHKA",
+ description="CYRILLIC LETTER PALOCHKA",
+ direction="l",
+ lccode=0x04CF,
+ linebreak="al",
+ unicodeslot=0x04C0,
+ },
+ [0x04C1]={
+ category="lu",
+ contextname="cyrillicZHEbreve",
+ description="CYRILLIC CAPITAL LETTER ZHE WITH BREVE",
+ direction="l",
+ lccode=0x04C2,
+ linebreak="al",
+ shcode=0x0416,
+ specials={ "char", 0x0416, 0x0306 },
+ unicodeslot=0x04C1,
+ },
+ [0x04C2]={
+ category="ll",
+ contextname="cyrilliczhebreve",
+ description="CYRILLIC SMALL LETTER ZHE WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0436,
+ specials={ "char", 0x0436, 0x0306 },
+ uccode=0x04C1,
+ unicodeslot=0x04C2,
+ },
+ [0x04C3]={
+ category="lu",
+ contextname="cyrillicKAhook",
+ description="CYRILLIC CAPITAL LETTER KA WITH HOOK",
+ direction="l",
+ lccode=0x04C4,
+ linebreak="al",
+ shcode=0x041A,
+ unicodeslot=0x04C3,
+ },
+ [0x04C4]={
+ category="ll",
+ contextname="cyrillickahook",
+ description="CYRILLIC SMALL LETTER KA WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x043A,
+ uccode=0x04C3,
+ unicodeslot=0x04C4,
+ },
+ [0x04C5]={
+ category="lu",
+ contextname="cyrillicELtail",
+ description="CYRILLIC CAPITAL LETTER EL WITH TAIL",
+ direction="l",
+ lccode=0x04C6,
+ linebreak="al",
+ shcode=0x041B,
+ unicodeslot=0x04C5,
+ },
+ [0x04C6]={
+ category="ll",
+ contextname="cyrilliceltail",
+ description="CYRILLIC SMALL LETTER EL WITH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x043B,
+ uccode=0x04C5,
+ unicodeslot=0x04C6,
+ },
+ [0x04C7]={
+ category="lu",
+ contextname="cyrillicENhook",
+ description="CYRILLIC CAPITAL LETTER EN WITH HOOK",
+ direction="l",
+ lccode=0x04C8,
+ linebreak="al",
+ shcode=0x041D,
+ unicodeslot=0x04C7,
+ },
+ [0x04C8]={
+ category="ll",
+ contextname="cyrillicenhook",
+ description="CYRILLIC SMALL LETTER EN WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x043D,
+ uccode=0x04C7,
+ unicodeslot=0x04C8,
+ },
+ [0x04C9]={
+ category="lu",
+ contextname="cyrillicENtail",
+ description="CYRILLIC CAPITAL LETTER EN WITH TAIL",
+ direction="l",
+ lccode=0x04CA,
+ linebreak="al",
+ shcode=0x041D,
+ unicodeslot=0x04C9,
+ },
+ [0x04CA]={
+ category="ll",
+ contextname="cyrillicentail",
+ description="CYRILLIC SMALL LETTER EN WITH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x043D,
+ uccode=0x04C9,
+ unicodeslot=0x04CA,
+ },
+ [0x04CB]={
+ category="lu",
+ contextname="cyrillicCHEkhakassian",
+ description="CYRILLIC CAPITAL LETTER KHAKASSIAN CHE",
+ direction="l",
+ lccode=0x04CC,
+ linebreak="al",
+ unicodeslot=0x04CB,
+ },
+ [0x04CC]={
+ category="ll",
+ contextname="cyrillicchekhakassian",
+ description="CYRILLIC SMALL LETTER KHAKASSIAN CHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x04CB,
+ unicodeslot=0x04CC,
+ },
+ [0x04CD]={
+ category="lu",
+ contextname="cyrillicEMtail",
+ description="CYRILLIC CAPITAL LETTER EM WITH TAIL",
+ direction="l",
+ lccode=0x04CE,
+ linebreak="al",
+ shcode=0x041C,
+ unicodeslot=0x04CD,
+ },
+ [0x04CE]={
+ category="ll",
+ contextname="cyrillicemtail",
+ description="CYRILLIC SMALL LETTER EM WITH TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x043C,
+ uccode=0x04CD,
+ unicodeslot=0x04CE,
+ },
+ [0x04CF]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER PALOCHKA",
+ direction="l",
+ linebreak="al",
+ uccode=0x04C0,
+ unicodeslot=0x04CF,
+ },
+ [0x04D0]={
+ category="lu",
+ contextname="cyrillicAbreve",
+ description="CYRILLIC CAPITAL LETTER A WITH BREVE",
+ direction="l",
+ lccode=0x04D1,
+ linebreak="al",
+ shcode=0x0410,
+ specials={ "char", 0x0410, 0x0306 },
+ unicodeslot=0x04D0,
+ },
+ [0x04D1]={
+ category="ll",
+ contextname="cyrillicabreve",
+ description="CYRILLIC SMALL LETTER A WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0430,
+ specials={ "char", 0x0430, 0x0306 },
+ uccode=0x04D0,
+ unicodeslot=0x04D1,
+ },
+ [0x04D2]={
+ category="lu",
+ contextname="cyrillicAdiaeresis",
+ description="CYRILLIC CAPITAL LETTER A WITH DIAERESIS",
+ direction="l",
+ lccode=0x04D3,
+ linebreak="al",
+ shcode=0x0410,
+ specials={ "char", 0x0410, 0x0308 },
+ unicodeslot=0x04D2,
+ },
+ [0x04D3]={
+ category="ll",
+ contextname="cyrillicadiaeresis",
+ description="CYRILLIC SMALL LETTER A WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0430,
+ specials={ "char", 0x0430, 0x0308 },
+ uccode=0x04D2,
+ unicodeslot=0x04D3,
+ },
+ [0x04D4]={
+ category="lu",
+ contextname="cyrillicAE",
+ description="CYRILLIC CAPITAL LIGATURE A IE",
+ direction="l",
+ lccode=0x04D5,
+ linebreak="al",
+ unicodeslot=0x04D4,
+ },
+ [0x04D5]={
+ category="ll",
+ contextname="cyrillicae",
+ description="CYRILLIC SMALL LIGATURE A IE",
+ direction="l",
+ linebreak="al",
+ uccode=0x04D4,
+ unicodeslot=0x04D5,
+ },
+ [0x04D6]={
+ category="lu",
+ contextname="cyrillicEbreve",
+ description="CYRILLIC CAPITAL LETTER IE WITH BREVE",
+ direction="l",
+ lccode=0x04D7,
+ linebreak="al",
+ shcode=0x0415,
+ specials={ "char", 0x0415, 0x0306 },
+ unicodeslot=0x04D6,
+ },
+ [0x04D7]={
+ category="ll",
+ contextname="cyrillicebreve",
+ description="CYRILLIC SMALL LETTER IE WITH BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0435,
+ specials={ "char", 0x0435, 0x0306 },
+ uccode=0x04D6,
+ unicodeslot=0x04D7,
+ },
+ [0x04D8]={
+ category="lu",
+ contextname="cyrillicSCHWA",
+ description="CYRILLIC CAPITAL LETTER SCHWA",
+ direction="l",
+ lccode=0x04D9,
+ linebreak="al",
+ unicodeslot=0x04D8,
+ },
+ [0x04D9]={
+ adobename="afii10846",
+ category="ll",
+ contextname="cyrillicschwa",
+ description="CYRILLIC SMALL LETTER SCHWA",
+ direction="l",
+ linebreak="al",
+ uccode=0x04D8,
+ unicodeslot=0x04D9,
+ },
+ [0x04DA]={
+ category="lu",
+ contextname="cyrillicSCHWAdiaeresis",
+ description="CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS",
+ direction="l",
+ lccode=0x04DB,
+ linebreak="al",
+ shcode=0x04D8,
+ specials={ "char", 0x04D8, 0x0308 },
+ unicodeslot=0x04DA,
+ },
+ [0x04DB]={
+ category="ll",
+ contextname="cyrillicschwadiaeresis",
+ description="CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x04D9,
+ specials={ "char", 0x04D9, 0x0308 },
+ uccode=0x04DA,
+ unicodeslot=0x04DB,
+ },
+ [0x04DC]={
+ category="lu",
+ contextname="cyrillicZHEdiaeresis",
+ description="CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS",
+ direction="l",
+ lccode=0x04DD,
+ linebreak="al",
+ shcode=0x0416,
+ specials={ "char", 0x0416, 0x0308 },
+ unicodeslot=0x04DC,
+ },
+ [0x04DD]={
+ category="ll",
+ contextname="cyrilliczhediaeresis",
+ description="CYRILLIC SMALL LETTER ZHE WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0436,
+ specials={ "char", 0x0436, 0x0308 },
+ uccode=0x04DC,
+ unicodeslot=0x04DD,
+ },
+ [0x04DE]={
+ category="lu",
+ contextname="cyrillicZEdiaeresis",
+ description="CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS",
+ direction="l",
+ lccode=0x04DF,
+ linebreak="al",
+ shcode=0x0417,
+ specials={ "char", 0x0417, 0x0308 },
+ unicodeslot=0x04DE,
+ },
+ [0x04DF]={
+ category="ll",
+ contextname="cyrilliczediaeresis",
+ description="CYRILLIC SMALL LETTER ZE WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0437,
+ specials={ "char", 0x0437, 0x0308 },
+ uccode=0x04DE,
+ unicodeslot=0x04DF,
+ },
+ [0x04E0]={
+ category="lu",
+ contextname="cyrillicDZEabkhasian",
+ description="CYRILLIC CAPITAL LETTER ABKHASIAN DZE",
+ direction="l",
+ lccode=0x04E1,
+ linebreak="al",
+ unicodeslot=0x04E0,
+ },
+ [0x04E1]={
+ category="ll",
+ contextname="cyrillicdzeabkhasian",
+ description="CYRILLIC SMALL LETTER ABKHASIAN DZE",
+ direction="l",
+ linebreak="al",
+ uccode=0x04E0,
+ unicodeslot=0x04E1,
+ },
+ [0x04E2]={
+ category="lu",
+ contextname="cyrillicImacron",
+ description="CYRILLIC CAPITAL LETTER I WITH MACRON",
+ direction="l",
+ lccode=0x04E3,
+ linebreak="al",
+ shcode=0x0418,
+ specials={ "char", 0x0418, 0x0304 },
+ unicodeslot=0x04E2,
+ },
+ [0x04E3]={
+ category="ll",
+ contextname="cyrillicimacron",
+ description="CYRILLIC SMALL LETTER I WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0438,
+ specials={ "char", 0x0438, 0x0304 },
+ uccode=0x04E2,
+ unicodeslot=0x04E3,
+ },
+ [0x04E4]={
+ category="lu",
+ contextname="cyrillicIdiaeresis",
+ description="CYRILLIC CAPITAL LETTER I WITH DIAERESIS",
+ direction="l",
+ lccode=0x04E5,
+ linebreak="al",
+ shcode=0x0418,
+ specials={ "char", 0x0418, 0x0308 },
+ unicodeslot=0x04E4,
+ },
+ [0x04E5]={
+ category="ll",
+ contextname="cyrillicidiaeresis",
+ description="CYRILLIC SMALL LETTER I WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0438,
+ specials={ "char", 0x0438, 0x0308 },
+ uccode=0x04E4,
+ unicodeslot=0x04E5,
+ },
+ [0x04E6]={
+ category="lu",
+ contextname="cyrillicOdiaeresis",
+ description="CYRILLIC CAPITAL LETTER O WITH DIAERESIS",
+ direction="l",
+ lccode=0x04E7,
+ linebreak="al",
+ shcode=0x041E,
+ specials={ "char", 0x041E, 0x0308 },
+ unicodeslot=0x04E6,
+ },
+ [0x04E7]={
+ category="ll",
+ contextname="cyrillicodiaeresis",
+ description="CYRILLIC SMALL LETTER O WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x043E,
+ specials={ "char", 0x043E, 0x0308 },
+ uccode=0x04E6,
+ unicodeslot=0x04E7,
+ },
+ [0x04E8]={
+ category="lu",
+ contextname="cyrillicObarred",
+ description="CYRILLIC CAPITAL LETTER BARRED O",
+ direction="l",
+ lccode=0x04E9,
+ linebreak="al",
+ unicodeslot=0x04E8,
+ },
+ [0x04E9]={
+ category="ll",
+ contextname="cyrillicobarred",
+ description="CYRILLIC SMALL LETTER BARRED O",
+ direction="l",
+ linebreak="al",
+ uccode=0x04E8,
+ unicodeslot=0x04E9,
+ },
+ [0x04EA]={
+ category="lu",
+ contextname="cyrillicObarreddiaeresis",
+ description="CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS",
+ direction="l",
+ lccode=0x04EB,
+ linebreak="al",
+ specials={ "char", 0x04E8, 0x0308 },
+ unicodeslot=0x04EA,
+ },
+ [0x04EB]={
+ category="ll",
+ contextname="cyrillicobarreddiaeresis",
+ description="CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x04E9, 0x0308 },
+ uccode=0x04EA,
+ unicodeslot=0x04EB,
+ },
+ [0x04EC]={
+ category="lu",
+ contextname="cyrillicEdiaeresis",
+ description="CYRILLIC CAPITAL LETTER E WITH DIAERESIS",
+ direction="l",
+ lccode=0x04ED,
+ linebreak="al",
+ shcode=0x042D,
+ specials={ "char", 0x042D, 0x0308 },
+ unicodeslot=0x04EC,
+ },
+ [0x04ED]={
+ category="ll",
+ contextname="cyrillicediaeresis",
+ description="CYRILLIC SMALL LETTER E WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x044D,
+ specials={ "char", 0x044D, 0x0308 },
+ uccode=0x04EC,
+ unicodeslot=0x04ED,
+ },
+ [0x04EE]={
+ category="lu",
+ contextname="cyrillicUmacron",
+ description="CYRILLIC CAPITAL LETTER U WITH MACRON",
+ direction="l",
+ lccode=0x04EF,
+ linebreak="al",
+ shcode=0x0423,
+ specials={ "char", 0x0423, 0x0304 },
+ unicodeslot=0x04EE,
+ },
+ [0x04EF]={
+ category="ll",
+ contextname="cyrillicumacron",
+ description="CYRILLIC SMALL LETTER U WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0443,
+ specials={ "char", 0x0443, 0x0304 },
+ uccode=0x04EE,
+ unicodeslot=0x04EF,
+ },
+ [0x04F0]={
+ category="lu",
+ contextname="cyrillicUdiaeresis",
+ description="CYRILLIC CAPITAL LETTER U WITH DIAERESIS",
+ direction="l",
+ lccode=0x04F1,
+ linebreak="al",
+ shcode=0x0423,
+ specials={ "char", 0x0423, 0x0308 },
+ unicodeslot=0x04F0,
+ },
+ [0x04F1]={
+ category="ll",
+ contextname="cyrillicudiaeresis",
+ description="CYRILLIC SMALL LETTER U WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0443,
+ specials={ "char", 0x0443, 0x0308 },
+ uccode=0x04F0,
+ unicodeslot=0x04F1,
+ },
+ [0x04F2]={
+ category="lu",
+ contextname="cyrillicUdoubleacute",
+ description="CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE",
+ direction="l",
+ lccode=0x04F3,
+ linebreak="al",
+ shcode=0x0423,
+ specials={ "char", 0x0423, 0x030B },
+ unicodeslot=0x04F2,
+ },
+ [0x04F3]={
+ category="ll",
+ contextname="cyrillicudoubleacute",
+ description="CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0443,
+ specials={ "char", 0x0443, 0x030B },
+ uccode=0x04F2,
+ unicodeslot=0x04F3,
+ },
+ [0x04F4]={
+ category="lu",
+ contextname="cyrillicCHEdiaeresis",
+ description="CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS",
+ direction="l",
+ lccode=0x04F5,
+ linebreak="al",
+ shcode=0x0427,
+ specials={ "char", 0x0427, 0x0308 },
+ unicodeslot=0x04F4,
+ },
+ [0x04F5]={
+ category="ll",
+ contextname="cyrillicchediaeresis",
+ description="CYRILLIC SMALL LETTER CHE WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0447,
+ specials={ "char", 0x0447, 0x0308 },
+ uccode=0x04F4,
+ unicodeslot=0x04F5,
+ },
+ [0x04F6]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER GHE WITH DESCENDER",
+ direction="l",
+ lccode=0x04F7,
+ linebreak="al",
+ shcode=0x0413,
+ unicodeslot=0x04F6,
+ },
+ [0x04F7]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER GHE WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0433,
+ uccode=0x04F6,
+ unicodeslot=0x04F7,
+ },
+ [0x04F8]={
+ category="lu",
+ contextname="cyrillicYERUdiaeresis",
+ description="CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS",
+ direction="l",
+ lccode=0x04F9,
+ linebreak="al",
+ shcode=0x042B,
+ specials={ "char", 0x042B, 0x0308 },
+ unicodeslot=0x04F8,
+ },
+ [0x04F9]={
+ category="ll",
+ contextname="cyrillicyerudiaeresis",
+ description="CYRILLIC SMALL LETTER YERU WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x044B,
+ specials={ "char", 0x044B, 0x0308 },
+ uccode=0x04F8,
+ unicodeslot=0x04F9,
+ },
+ [0x04FA]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK",
+ direction="l",
+ lccode=0x04FB,
+ linebreak="al",
+ shcode=0x0413,
+ unicodeslot=0x04FA,
+ },
+ [0x04FB]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0433,
+ uccode=0x04FA,
+ unicodeslot=0x04FB,
+ },
+ [0x04FC]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER HA WITH HOOK",
+ direction="l",
+ lccode=0x04FD,
+ linebreak="al",
+ shcode=0x0425,
+ unicodeslot=0x04FC,
+ },
+ [0x04FD]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER HA WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0445,
+ uccode=0x04FC,
+ unicodeslot=0x04FD,
+ },
+ [0x04FE]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER HA WITH STROKE",
+ direction="l",
+ lccode=0x04FF,
+ linebreak="al",
+ shcode=0x0425,
+ unicodeslot=0x04FE,
+ },
+ [0x04FF]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER HA WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0445,
+ uccode=0x04FE,
+ unicodeslot=0x04FF,
+ },
+ [0x0500]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI DE",
+ direction="l",
+ lccode=0x0501,
+ linebreak="al",
+ unicodeslot=0x0500,
+ },
+ [0x0501]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI DE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0500,
+ unicodeslot=0x0501,
+ },
+ [0x0502]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI DJE",
+ direction="l",
+ lccode=0x0503,
+ linebreak="al",
+ unicodeslot=0x0502,
+ },
+ [0x0503]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI DJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0502,
+ unicodeslot=0x0503,
+ },
+ [0x0504]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI ZJE",
+ direction="l",
+ lccode=0x0505,
+ linebreak="al",
+ unicodeslot=0x0504,
+ },
+ [0x0505]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI ZJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0504,
+ unicodeslot=0x0505,
+ },
+ [0x0506]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI DZJE",
+ direction="l",
+ lccode=0x0507,
+ linebreak="al",
+ unicodeslot=0x0506,
+ },
+ [0x0507]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI DZJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0506,
+ unicodeslot=0x0507,
+ },
+ [0x0508]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI LJE",
+ direction="l",
+ lccode=0x0509,
+ linebreak="al",
+ unicodeslot=0x0508,
+ },
+ [0x0509]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI LJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0508,
+ unicodeslot=0x0509,
+ },
+ [0x050A]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI NJE",
+ direction="l",
+ lccode=0x050B,
+ linebreak="al",
+ unicodeslot=0x050A,
+ },
+ [0x050B]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI NJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x050A,
+ unicodeslot=0x050B,
+ },
+ [0x050C]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI SJE",
+ direction="l",
+ lccode=0x050D,
+ linebreak="al",
+ unicodeslot=0x050C,
+ },
+ [0x050D]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI SJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x050C,
+ unicodeslot=0x050D,
+ },
+ [0x050E]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER KOMI TJE",
+ direction="l",
+ lccode=0x050F,
+ linebreak="al",
+ unicodeslot=0x050E,
+ },
+ [0x050F]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER KOMI TJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x050E,
+ unicodeslot=0x050F,
+ },
+ [0x0510]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER REVERSED ZE",
+ direction="l",
+ lccode=0x0511,
+ linebreak="al",
+ unicodeslot=0x0510,
+ },
+ [0x0511]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER REVERSED ZE",
+ direction="l",
+ linebreak="al",
+ uccode=0x0510,
+ unicodeslot=0x0511,
+ },
+ [0x0512]={
+ category="lu",
+ description="CYRILLIC CAPITAL LETTER EL WITH HOOK",
+ direction="l",
+ lccode=0x0513,
+ linebreak="al",
+ shcode=0x041B,
+ unicodeslot=0x0512,
+ },
+ [0x0513]={
+ category="ll",
+ description="CYRILLIC SMALL LETTER EL WITH HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x043B,
+ uccode=0x0512,
+ unicodeslot=0x0513,
+ },
+ [0x0531]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER AYB",
+ direction="l",
+ lccode=0x0561,
+ linebreak="al",
+ unicodeslot=0x0531,
+ },
+ [0x0532]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER BEN",
+ direction="l",
+ lccode=0x0562,
+ linebreak="al",
+ unicodeslot=0x0532,
+ },
+ [0x0533]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER GIM",
+ direction="l",
+ lccode=0x0563,
+ linebreak="al",
+ unicodeslot=0x0533,
+ },
+ [0x0534]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER DA",
+ direction="l",
+ lccode=0x0564,
+ linebreak="al",
+ unicodeslot=0x0534,
+ },
+ [0x0535]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER ECH",
+ direction="l",
+ lccode=0x0565,
+ linebreak="al",
+ unicodeslot=0x0535,
+ },
+ [0x0536]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER ZA",
+ direction="l",
+ lccode=0x0566,
+ linebreak="al",
+ unicodeslot=0x0536,
+ },
+ [0x0537]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER EH",
+ direction="l",
+ lccode=0x0567,
+ linebreak="al",
+ unicodeslot=0x0537,
+ },
+ [0x0538]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER ET",
+ direction="l",
+ lccode=0x0568,
+ linebreak="al",
+ unicodeslot=0x0538,
+ },
+ [0x0539]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER TO",
+ direction="l",
+ lccode=0x0569,
+ linebreak="al",
+ unicodeslot=0x0539,
+ },
+ [0x053A]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER ZHE",
+ direction="l",
+ lccode=0x056A,
+ linebreak="al",
+ unicodeslot=0x053A,
+ },
+ [0x053B]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER INI",
+ direction="l",
+ lccode=0x056B,
+ linebreak="al",
+ unicodeslot=0x053B,
+ },
+ [0x053C]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER LIWN",
+ direction="l",
+ lccode=0x056C,
+ linebreak="al",
+ unicodeslot=0x053C,
+ },
+ [0x053D]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER XEH",
+ direction="l",
+ lccode=0x056D,
+ linebreak="al",
+ unicodeslot=0x053D,
+ },
+ [0x053E]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER CA",
+ direction="l",
+ lccode=0x056E,
+ linebreak="al",
+ unicodeslot=0x053E,
+ },
+ [0x053F]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER KEN",
+ direction="l",
+ lccode=0x056F,
+ linebreak="al",
+ unicodeslot=0x053F,
+ },
+ [0x0540]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER HO",
+ direction="l",
+ lccode=0x0570,
+ linebreak="al",
+ unicodeslot=0x0540,
+ },
+ [0x0541]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER JA",
+ direction="l",
+ lccode=0x0571,
+ linebreak="al",
+ unicodeslot=0x0541,
+ },
+ [0x0542]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER GHAD",
+ direction="l",
+ lccode=0x0572,
+ linebreak="al",
+ unicodeslot=0x0542,
+ },
+ [0x0543]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER CHEH",
+ direction="l",
+ lccode=0x0573,
+ linebreak="al",
+ unicodeslot=0x0543,
+ },
+ [0x0544]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER MEN",
+ direction="l",
+ lccode=0x0574,
+ linebreak="al",
+ unicodeslot=0x0544,
+ },
+ [0x0545]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER YI",
+ direction="l",
+ lccode=0x0575,
+ linebreak="al",
+ unicodeslot=0x0545,
+ },
+ [0x0546]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER NOW",
+ direction="l",
+ lccode=0x0576,
+ linebreak="al",
+ unicodeslot=0x0546,
+ },
+ [0x0547]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER SHA",
+ direction="l",
+ lccode=0x0577,
+ linebreak="al",
+ unicodeslot=0x0547,
+ },
+ [0x0548]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER VO",
+ direction="l",
+ lccode=0x0578,
+ linebreak="al",
+ unicodeslot=0x0548,
+ },
+ [0x0549]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER CHA",
+ direction="l",
+ lccode=0x0579,
+ linebreak="al",
+ unicodeslot=0x0549,
+ },
+ [0x054A]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER PEH",
+ direction="l",
+ lccode=0x057A,
+ linebreak="al",
+ unicodeslot=0x054A,
+ },
+ [0x054B]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER JHEH",
+ direction="l",
+ lccode=0x057B,
+ linebreak="al",
+ unicodeslot=0x054B,
+ },
+ [0x054C]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER RA",
+ direction="l",
+ lccode=0x057C,
+ linebreak="al",
+ unicodeslot=0x054C,
+ },
+ [0x054D]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER SEH",
+ direction="l",
+ lccode=0x057D,
+ linebreak="al",
+ unicodeslot=0x054D,
+ },
+ [0x054E]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER VEW",
+ direction="l",
+ lccode=0x057E,
+ linebreak="al",
+ unicodeslot=0x054E,
+ },
+ [0x054F]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER TIWN",
+ direction="l",
+ lccode=0x057F,
+ linebreak="al",
+ unicodeslot=0x054F,
+ },
+ [0x0550]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER REH",
+ direction="l",
+ lccode=0x0580,
+ linebreak="al",
+ unicodeslot=0x0550,
+ },
+ [0x0551]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER CO",
+ direction="l",
+ lccode=0x0581,
+ linebreak="al",
+ unicodeslot=0x0551,
+ },
+ [0x0552]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER YIWN",
+ direction="l",
+ lccode=0x0582,
+ linebreak="al",
+ unicodeslot=0x0552,
+ },
+ [0x0553]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER PIWR",
+ direction="l",
+ lccode=0x0583,
+ linebreak="al",
+ unicodeslot=0x0553,
+ },
+ [0x0554]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER KEH",
+ direction="l",
+ lccode=0x0584,
+ linebreak="al",
+ unicodeslot=0x0554,
+ },
+ [0x0555]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER OH",
+ direction="l",
+ lccode=0x0585,
+ linebreak="al",
+ unicodeslot=0x0555,
+ },
+ [0x0556]={
+ category="lu",
+ description="ARMENIAN CAPITAL LETTER FEH",
+ direction="l",
+ lccode=0x0586,
+ linebreak="al",
+ unicodeslot=0x0556,
+ },
+ [0x0559]={
+ category="lm",
+ description="ARMENIAN MODIFIER LETTER LEFT HALF RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0559,
+ },
+ [0x055A]={
+ category="po",
+ description="ARMENIAN APOSTROPHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x055A,
+ },
+ [0x055B]={
+ category="po",
+ description="ARMENIAN EMPHASIS MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x055B,
+ },
+ [0x055C]={
+ category="po",
+ description="ARMENIAN EXCLAMATION MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x055C,
+ },
+ [0x055D]={
+ category="po",
+ description="ARMENIAN COMMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x055D,
+ },
+ [0x055E]={
+ category="po",
+ description="ARMENIAN QUESTION MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x055E,
+ },
+ [0x055F]={
+ category="po",
+ description="ARMENIAN ABBREVIATION MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x055F,
+ },
+ [0x0561]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER AYB",
+ direction="l",
+ linebreak="al",
+ uccode=0x0531,
+ unicodeslot=0x0561,
+ },
+ [0x0562]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER BEN",
+ direction="l",
+ linebreak="al",
+ uccode=0x0532,
+ unicodeslot=0x0562,
+ },
+ [0x0563]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER GIM",
+ direction="l",
+ linebreak="al",
+ uccode=0x0533,
+ unicodeslot=0x0563,
+ },
+ [0x0564]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER DA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0534,
+ unicodeslot=0x0564,
+ },
+ [0x0565]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER ECH",
+ direction="l",
+ linebreak="al",
+ uccode=0x0535,
+ unicodeslot=0x0565,
+ },
+ [0x0566]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER ZA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0536,
+ unicodeslot=0x0566,
+ },
+ [0x0567]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER EH",
+ direction="l",
+ linebreak="al",
+ uccode=0x0537,
+ unicodeslot=0x0567,
+ },
+ [0x0568]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER ET",
+ direction="l",
+ linebreak="al",
+ uccode=0x0538,
+ unicodeslot=0x0568,
+ },
+ [0x0569]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER TO",
+ direction="l",
+ linebreak="al",
+ uccode=0x0539,
+ unicodeslot=0x0569,
+ },
+ [0x056A]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER ZHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x053A,
+ unicodeslot=0x056A,
+ },
+ [0x056B]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER INI",
+ direction="l",
+ linebreak="al",
+ uccode=0x053B,
+ unicodeslot=0x056B,
+ },
+ [0x056C]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER LIWN",
+ direction="l",
+ linebreak="al",
+ uccode=0x053C,
+ unicodeslot=0x056C,
+ },
+ [0x056D]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER XEH",
+ direction="l",
+ linebreak="al",
+ uccode=0x053D,
+ unicodeslot=0x056D,
+ },
+ [0x056E]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER CA",
+ direction="l",
+ linebreak="al",
+ uccode=0x053E,
+ unicodeslot=0x056E,
+ },
+ [0x056F]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER KEN",
+ direction="l",
+ linebreak="al",
+ uccode=0x053F,
+ unicodeslot=0x056F,
+ },
+ [0x0570]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER HO",
+ direction="l",
+ linebreak="al",
+ uccode=0x0540,
+ unicodeslot=0x0570,
+ },
+ [0x0571]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER JA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0541,
+ unicodeslot=0x0571,
+ },
+ [0x0572]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER GHAD",
+ direction="l",
+ linebreak="al",
+ uccode=0x0542,
+ unicodeslot=0x0572,
+ },
+ [0x0573]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER CHEH",
+ direction="l",
+ linebreak="al",
+ uccode=0x0543,
+ unicodeslot=0x0573,
+ },
+ [0x0574]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER MEN",
+ direction="l",
+ linebreak="al",
+ uccode=0x0544,
+ unicodeslot=0x0574,
+ },
+ [0x0575]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER YI",
+ direction="l",
+ linebreak="al",
+ uccode=0x0545,
+ unicodeslot=0x0575,
+ },
+ [0x0576]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER NOW",
+ direction="l",
+ linebreak="al",
+ uccode=0x0546,
+ unicodeslot=0x0576,
+ },
+ [0x0577]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER SHA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0547,
+ unicodeslot=0x0577,
+ },
+ [0x0578]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER VO",
+ direction="l",
+ linebreak="al",
+ uccode=0x0548,
+ unicodeslot=0x0578,
+ },
+ [0x0579]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER CHA",
+ direction="l",
+ linebreak="al",
+ uccode=0x0549,
+ unicodeslot=0x0579,
+ },
+ [0x057A]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER PEH",
+ direction="l",
+ linebreak="al",
+ uccode=0x054A,
+ unicodeslot=0x057A,
+ },
+ [0x057B]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER JHEH",
+ direction="l",
+ linebreak="al",
+ uccode=0x054B,
+ unicodeslot=0x057B,
+ },
+ [0x057C]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER RA",
+ direction="l",
+ linebreak="al",
+ uccode=0x054C,
+ unicodeslot=0x057C,
+ },
+ [0x057D]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER SEH",
+ direction="l",
+ linebreak="al",
+ uccode=0x054D,
+ unicodeslot=0x057D,
+ },
+ [0x057E]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER VEW",
+ direction="l",
+ linebreak="al",
+ uccode=0x054E,
+ unicodeslot=0x057E,
+ },
+ [0x057F]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER TIWN",
+ direction="l",
+ linebreak="al",
+ uccode=0x054F,
+ unicodeslot=0x057F,
+ },
+ [0x0580]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER REH",
+ direction="l",
+ linebreak="al",
+ uccode=0x0550,
+ unicodeslot=0x0580,
+ },
+ [0x0581]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER CO",
+ direction="l",
+ linebreak="al",
+ uccode=0x0551,
+ unicodeslot=0x0581,
+ },
+ [0x0582]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER YIWN",
+ direction="l",
+ linebreak="al",
+ uccode=0x0552,
+ unicodeslot=0x0582,
+ },
+ [0x0583]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER PIWR",
+ direction="l",
+ linebreak="al",
+ uccode=0x0553,
+ unicodeslot=0x0583,
+ },
+ [0x0584]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER KEH",
+ direction="l",
+ linebreak="al",
+ uccode=0x0554,
+ unicodeslot=0x0584,
+ },
+ [0x0585]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER OH",
+ direction="l",
+ linebreak="al",
+ uccode=0x0555,
+ unicodeslot=0x0585,
+ },
+ [0x0586]={
+ category="ll",
+ description="ARMENIAN SMALL LETTER FEH",
+ direction="l",
+ linebreak="al",
+ uccode=0x0556,
+ unicodeslot=0x0586,
+ },
+ [0x0587]={
+ category="ll",
+ description="ARMENIAN SMALL LIGATURE ECH YIWN",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0565, 0x0582 },
+ unicodeslot=0x0587,
+ },
+ [0x0589]={
+ category="po",
+ description="ARMENIAN FULL STOP",
+ direction="l",
+ linebreak="is",
+ unicodeslot=0x0589,
+ },
+ [0x058A]={
+ category="pd",
+ description="ARMENIAN HYPHEN",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x058A,
+ },
+ [0x0591]={
+ category="mn",
+ description="HEBREW ACCENT ETNAHTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0591,
+ },
+ [0x0592]={
+ category="mn",
+ description="HEBREW ACCENT SEGOL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0592,
+ },
+ [0x0593]={
+ category="mn",
+ description="HEBREW ACCENT SHALSHELET",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0593,
+ },
+ [0x0594]={
+ category="mn",
+ description="HEBREW ACCENT ZAQEF QATAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0594,
+ },
+ [0x0595]={
+ category="mn",
+ description="HEBREW ACCENT ZAQEF GADOL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0595,
+ },
+ [0x0596]={
+ category="mn",
+ description="HEBREW ACCENT TIPEHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0596,
+ },
+ [0x0597]={
+ category="mn",
+ description="HEBREW ACCENT REVIA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0597,
+ },
+ [0x0598]={
+ category="mn",
+ description="HEBREW ACCENT ZARQA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0598,
+ },
+ [0x0599]={
+ category="mn",
+ description="HEBREW ACCENT PASHTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0599,
+ },
+ [0x059A]={
+ category="mn",
+ description="HEBREW ACCENT YETIV",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x059A,
+ },
+ [0x059B]={
+ category="mn",
+ description="HEBREW ACCENT TEVIR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x059B,
+ },
+ [0x059C]={
+ category="mn",
+ description="HEBREW ACCENT GERESH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x059C,
+ },
+ [0x059D]={
+ category="mn",
+ description="HEBREW ACCENT GERESH MUQDAM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x059D,
+ },
+ [0x059E]={
+ category="mn",
+ description="HEBREW ACCENT GERSHAYIM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x059E,
+ },
+ [0x059F]={
+ category="mn",
+ description="HEBREW ACCENT QARNEY PARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x059F,
+ },
+ [0x05A0]={
+ category="mn",
+ description="HEBREW ACCENT TELISHA GEDOLA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A0,
+ },
+ [0x05A1]={
+ category="mn",
+ description="HEBREW ACCENT PAZER",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A1,
+ },
+ [0x05A2]={
+ category="mn",
+ description="HEBREW ACCENT ATNAH HAFUKH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A2,
+ },
+ [0x05A3]={
+ category="mn",
+ description="HEBREW ACCENT MUNAH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A3,
+ },
+ [0x05A4]={
+ category="mn",
+ description="HEBREW ACCENT MAHAPAKH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A4,
+ },
+ [0x05A5]={
+ category="mn",
+ description="HEBREW ACCENT MERKHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A5,
+ },
+ [0x05A6]={
+ category="mn",
+ description="HEBREW ACCENT MERKHA KEFULA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A6,
+ },
+ [0x05A7]={
+ category="mn",
+ description="HEBREW ACCENT DARGA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A7,
+ },
+ [0x05A8]={
+ category="mn",
+ description="HEBREW ACCENT QADMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A8,
+ },
+ [0x05A9]={
+ category="mn",
+ description="HEBREW ACCENT TELISHA QETANA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05A9,
+ },
+ [0x05AA]={
+ category="mn",
+ description="HEBREW ACCENT YERAH BEN YOMO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05AA,
+ },
+ [0x05AB]={
+ category="mn",
+ description="HEBREW ACCENT OLE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05AB,
+ },
+ [0x05AC]={
+ category="mn",
+ description="HEBREW ACCENT ILUY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05AC,
+ },
+ [0x05AD]={
+ category="mn",
+ description="HEBREW ACCENT DEHI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05AD,
+ },
+ [0x05AE]={
+ category="mn",
+ description="HEBREW ACCENT ZINOR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05AE,
+ },
+ [0x05AF]={
+ category="mn",
+ description="HEBREW MARK MASORA CIRCLE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05AF,
+ },
+ [0x05B0]={
+ adobename="afii57799",
+ category="mn",
+ description="HEBREW POINT SHEVA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B0,
+ },
+ [0x05B1]={
+ adobename="afii57801",
+ category="mn",
+ description="HEBREW POINT HATAF SEGOL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B1,
+ },
+ [0x05B2]={
+ adobename="afii57800",
+ category="mn",
+ description="HEBREW POINT HATAF PATAH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B2,
+ },
+ [0x05B3]={
+ adobename="afii57802",
+ category="mn",
+ description="HEBREW POINT HATAF QAMATS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B3,
+ },
+ [0x05B4]={
+ adobename="afii57793",
+ category="mn",
+ description="HEBREW POINT HIRIQ",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B4,
+ },
+ [0x05B5]={
+ adobename="afii57794",
+ category="mn",
+ description="HEBREW POINT TSERE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B5,
+ },
+ [0x05B6]={
+ adobename="afii57795",
+ category="mn",
+ description="HEBREW POINT SEGOL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B6,
+ },
+ [0x05B7]={
+ adobename="afii57798",
+ category="mn",
+ description="HEBREW POINT PATAH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B7,
+ },
+ [0x05B8]={
+ adobename="afii57797",
+ category="mn",
+ description="HEBREW POINT QAMATS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B8,
+ },
+ [0x05B9]={
+ adobename="afii57806",
+ category="mn",
+ description="HEBREW POINT HOLAM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05B9,
+ },
+ [0x05BA]={
+ category="mn",
+ description="HEBREW POINT HOLAM HASER FOR VAV",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05BA,
+ },
+ [0x05BB]={
+ adobename="afii57796",
+ category="mn",
+ description="HEBREW POINT QUBUTS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05BB,
+ },
+ [0x05BC]={
+ adobename="afii57807",
+ category="mn",
+ description="HEBREW POINT DAGESH OR MAPIQ",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05BC,
+ },
+ [0x05BD]={
+ adobename="afii57839",
+ category="mn",
+ description="HEBREW POINT METEG",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05BD,
+ },
+ [0x05BE]={
+ adobename="afii57645",
+ category="po",
+ description="HEBREW PUNCTUATION MAQAF",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x05BE,
+ },
+ [0x05BF]={
+ adobename="afii57841",
+ category="mn",
+ description="HEBREW POINT RAFE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05BF,
+ },
+ [0x05C0]={
+ adobename="afii57842",
+ category="po",
+ description="HEBREW PUNCTUATION PASEQ",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05C0,
+ },
+ [0x05C1]={
+ adobename="afii57804",
+ category="mn",
+ description="HEBREW POINT SHIN DOT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05C1,
+ },
+ [0x05C2]={
+ adobename="afii57803",
+ category="mn",
+ description="HEBREW POINT SIN DOT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05C2,
+ },
+ [0x05C3]={
+ adobename="afii57658",
+ category="po",
+ description="HEBREW PUNCTUATION SOF PASUQ",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05C3,
+ },
+ [0x05C4]={
+ category="mn",
+ description="HEBREW MARK UPPER DOT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05C4,
+ },
+ [0x05C5]={
+ category="mn",
+ description="HEBREW MARK LOWER DOT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05C5,
+ },
+ [0x05C6]={
+ category="po",
+ description="HEBREW PUNCTUATION NUN HAFUKHA",
+ direction="r",
+ linebreak="ex",
+ unicodeslot=0x05C6,
+ },
+ [0x05C7]={
+ category="mn",
+ description="HEBREW POINT QAMATS QATAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x05C7,
+ },
+ [0x05D0]={
+ adobename="afii57664",
+ category="lo",
+ contextname="hebrewAlef",
+ description="HEBREW LETTER ALEF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D0,
+ },
+ [0x05D1]={
+ adobename="afii57665",
+ category="lo",
+ contextname="hebrewBet",
+ description="HEBREW LETTER BET",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D1,
+ },
+ [0x05D2]={
+ adobename="afii57666",
+ category="lo",
+ contextname="hebrewGimel",
+ description="HEBREW LETTER GIMEL",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D2,
+ },
+ [0x05D3]={
+ adobename="afii57667",
+ category="lo",
+ contextname="hebrewDalet",
+ description="HEBREW LETTER DALET",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D3,
+ },
+ [0x05D4]={
+ adobename="afii57668",
+ category="lo",
+ contextname="hebrewHe",
+ description="HEBREW LETTER HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D4,
+ },
+ [0x05D5]={
+ adobename="afii57669",
+ category="lo",
+ contextname="hebrewVav",
+ description="HEBREW LETTER VAV",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D5,
+ },
+ [0x05D6]={
+ adobename="afii57670",
+ category="lo",
+ contextname="hebrewZayin",
+ description="HEBREW LETTER ZAYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D6,
+ },
+ [0x05D7]={
+ adobename="afii57671",
+ category="lo",
+ contextname="hebrewHet",
+ description="HEBREW LETTER HET",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D7,
+ },
+ [0x05D8]={
+ adobename="afii57672",
+ category="lo",
+ contextname="hebrewTet",
+ description="HEBREW LETTER TET",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D8,
+ },
+ [0x05D9]={
+ adobename="afii57673",
+ category="lo",
+ contextname="hebrewYod",
+ description="HEBREW LETTER YOD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05D9,
+ },
+ [0x05DA]={
+ adobename="afii57674",
+ category="lo",
+ contextname="hebrewKaffinal",
+ description="HEBREW LETTER FINAL KAF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05DA,
+ },
+ [0x05DB]={
+ adobename="afii57675",
+ category="lo",
+ contextname="hebrewKaf",
+ description="HEBREW LETTER KAF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05DB,
+ },
+ [0x05DC]={
+ adobename="afii57676",
+ category="lo",
+ contextname="hebrewLamed",
+ description="HEBREW LETTER LAMED",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05DC,
+ },
+ [0x05DD]={
+ adobename="afii57677",
+ category="lo",
+ contextname="hebrewMemfinal",
+ description="HEBREW LETTER FINAL MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05DD,
+ },
+ [0x05DE]={
+ adobename="afii57678",
+ category="lo",
+ contextname="hebrewMem",
+ description="HEBREW LETTER MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05DE,
+ },
+ [0x05DF]={
+ adobename="afii57679",
+ category="lo",
+ contextname="hebrewNunfinal",
+ description="HEBREW LETTER FINAL NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05DF,
+ },
+ [0x05E0]={
+ adobename="afii57680",
+ category="lo",
+ contextname="hebrewNun",
+ description="HEBREW LETTER NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E0,
+ },
+ [0x05E1]={
+ adobename="afii57681",
+ category="lo",
+ contextname="hebrewSamekh",
+ description="HEBREW LETTER SAMEKH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E1,
+ },
+ [0x05E2]={
+ adobename="afii57682",
+ category="lo",
+ contextname="hebrewAyin",
+ description="HEBREW LETTER AYIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E2,
+ },
+ [0x05E3]={
+ adobename="afii57683",
+ category="lo",
+ contextname="hebrewPefinal",
+ description="HEBREW LETTER FINAL PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E3,
+ },
+ [0x05E4]={
+ adobename="afii57684",
+ category="lo",
+ contextname="hebrewPe",
+ description="HEBREW LETTER PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E4,
+ },
+ [0x05E5]={
+ adobename="afii57685",
+ category="lo",
+ contextname="hebrewTsadifinal",
+ description="HEBREW LETTER FINAL TSADI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E5,
+ },
+ [0x05E6]={
+ adobename="afii57686",
+ category="lo",
+ contextname="hebrewTsadi",
+ description="HEBREW LETTER TSADI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E6,
+ },
+ [0x05E7]={
+ adobename="afii57687",
+ category="lo",
+ contextname="hebrewQof",
+ description="HEBREW LETTER QOF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E7,
+ },
+ [0x05E8]={
+ adobename="afii57688",
+ category="lo",
+ contextname="hebrewResh",
+ description="HEBREW LETTER RESH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E8,
+ },
+ [0x05E9]={
+ adobename="afii57689",
+ category="lo",
+ contextname="hebrewShin",
+ description="HEBREW LETTER SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05E9,
+ },
+ [0x05EA]={
+ adobename="afii57690",
+ category="lo",
+ contextname="hebrewTav",
+ description="HEBREW LETTER TAV",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05EA,
+ },
+ [0x05F0]={
+ adobename="afii57716",
+ category="lo",
+ description="HEBREW LIGATURE YIDDISH DOUBLE VAV",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05F0,
+ },
+ [0x05F1]={
+ adobename="afii57717",
+ category="lo",
+ description="HEBREW LIGATURE YIDDISH VAV YOD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05F1,
+ },
+ [0x05F2]={
+ adobename="afii57718",
+ category="lo",
+ description="HEBREW LIGATURE YIDDISH DOUBLE YOD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05F2,
+ },
+ [0x05F3]={
+ category="po",
+ description="HEBREW PUNCTUATION GERESH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05F3,
+ },
+ [0x05F4]={
+ category="po",
+ description="HEBREW PUNCTUATION GERSHAYIM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x05F4,
+ },
+ [0x0600]={
+ category="cf",
+ description="ARABIC NUMBER SIGN",
+ direction="an",
+ visible="yes",
+ linebreak="al",
+ unicodeslot=0x0600,
+ },
+ [0x0601]={
+ category="cf",
+ description="ARABIC SIGN SANAH",
+ direction="an",
+ visible="yes",
+ linebreak="al",
+ unicodeslot=0x0601,
+ },
+ [0x0602]={
+ category="cf",
+ description="ARABIC FOOTNOTE MARKER",
+ direction="an",
+ visible="yes",
+ linebreak="al",
+ unicodeslot=0x0602,
+ },
+ [0x0603]={
+ category="cf",
+ description="ARABIC SIGN SAFHA",
+ direction="an",
+ visible="yes",
+ linebreak="al",
+ unicodeslot=0x0603,
+ },
+ [0x060B]={
+ category="sc",
+ description="AFGHANI SIGN",
+ direction="al",
+ linebreak="po",
+ unicodeslot=0x060B,
+ },
+ [0x060C]={
+ adobename="afii57388",
+ category="po",
+ description="ARABIC COMMA",
+ direction="cs",
+ linebreak="ex",
+ unicodeslot=0x060C,
+ },
+ [0x060D]={
+ category="po",
+ description="ARABIC DATE SEPARATOR",
+ direction="al",
+ linebreak="is",
+ unicodeslot=0x060D,
+ },
+ [0x060E]={
+ category="so",
+ description="ARABIC POETIC VERSE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x060E,
+ },
+ [0x060F]={
+ category="so",
+ description="ARABIC SIGN MISRA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x060F,
+ },
+ [0x0610]={
+ category="mn",
+ description="ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0610,
+ },
+ [0x0611]={
+ category="mn",
+ description="ARABIC SIGN ALAYHE ASSALLAM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0611,
+ },
+ [0x0612]={
+ category="mn",
+ description="ARABIC SIGN RAHMATULLAH ALAYHE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0612,
+ },
+ [0x0613]={
+ category="mn",
+ description="ARABIC SIGN RADI ALLAHOU ANHU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0613,
+ },
+ [0x0614]={
+ category="mn",
+ description="ARABIC SIGN TAKHALLUS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0614,
+ },
+ [0x0615]={
+ category="mn",
+ description="ARABIC SMALL HIGH TAH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0615,
+ },
+ [0x061B]={
+ adobename="afii57403",
+ category="po",
+ description="ARABIC SEMICOLON",
+ direction="al",
+ linebreak="ex",
+ unicodeslot=0x061B,
+ },
+ [0x061E]={
+ category="po",
+ description="ARABIC TRIPLE DOT PUNCTUATION MARK",
+ direction="al",
+ linebreak="ex",
+ unicodeslot=0x061E,
+ },
+ [0x061F]={
+ adobename="afii57407",
+ category="po",
+ description="ARABIC QUESTION MARK",
+ direction="al",
+ linebreak="ex",
+ unicodeslot=0x061F,
+ },
+ [0x0621]={
+ adobename="afii57409",
+ category="lo",
+ description="ARABIC LETTER HAMZA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0621,
+ },
+ [0x0622]={
+ adobename="afii57410",
+ category="lo",
+ description="ARABIC LETTER ALEF WITH MADDA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "char", 0x0627, 0x0653 },
+ unicodeslot=0x0622,
+ },
+ [0x0623]={
+ adobename="afii57411",
+ category="lo",
+ description="ARABIC LETTER ALEF WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "char", 0x0627, 0x0654 },
+ unicodeslot=0x0623,
+ },
+ [0x0624]={
+ adobename="afii57412",
+ category="lo",
+ description="ARABIC LETTER WAW WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0648,
+ specials={ "char", 0x0648, 0x0654 },
+ unicodeslot=0x0624,
+ },
+ [0x0625]={
+ adobename="afii57413",
+ category="lo",
+ description="ARABIC LETTER ALEF WITH HAMZA BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "char", 0x0627, 0x0655 },
+ unicodeslot=0x0625,
+ },
+ [0x0626]={
+ adobename="afii57414",
+ category="lo",
+ description="ARABIC LETTER YEH WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ specials={ "char", 0x064A, 0x0654 },
+ unicodeslot=0x0626,
+ },
+ [0x0627]={
+ adobename="afii57415",
+ category="lo",
+ description="ARABIC LETTER ALEF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0627,
+ },
+ [0x0628]={
+ adobename="afii57416",
+ category="lo",
+ description="ARABIC LETTER BEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0628,
+ },
+ [0x0629]={
+ adobename="afii57417",
+ category="lo",
+ description="ARABIC LETTER TEH MARBUTA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0629,
+ },
+ [0x062A]={
+ adobename="afii57418",
+ category="lo",
+ description="ARABIC LETTER TEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x062A,
+ },
+ [0x062B]={
+ adobename="afii57419",
+ category="lo",
+ description="ARABIC LETTER THEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x062B,
+ },
+ [0x062C]={
+ adobename="afii57420",
+ category="lo",
+ description="ARABIC LETTER JEEM",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x062C,
+ },
+ [0x062D]={
+ adobename="afii57421",
+ category="lo",
+ description="ARABIC LETTER HAH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x062D,
+ },
+ [0x062E]={
+ adobename="afii57422",
+ category="lo",
+ description="ARABIC LETTER KHAH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x062E,
+ },
+ [0x062F]={
+ adobename="afii57423",
+ category="lo",
+ description="ARABIC LETTER DAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x062F,
+ },
+ [0x0630]={
+ adobename="afii57424",
+ category="lo",
+ description="ARABIC LETTER THAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0630,
+ },
+ [0x0631]={
+ adobename="afii57425",
+ category="lo",
+ description="ARABIC LETTER REH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0631,
+ },
+ [0x0632]={
+ adobename="afii57426",
+ category="lo",
+ description="ARABIC LETTER ZAIN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0632,
+ },
+ [0x0633]={
+ adobename="afii57427",
+ category="lo",
+ description="ARABIC LETTER SEEN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0633,
+ },
+ [0x0634]={
+ adobename="afii57428",
+ category="lo",
+ description="ARABIC LETTER SHEEN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0634,
+ },
+ [0x0635]={
+ adobename="afii57429",
+ category="lo",
+ description="ARABIC LETTER SAD",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0635,
+ },
+ [0x0636]={
+ adobename="afii57430",
+ category="lo",
+ description="ARABIC LETTER DAD",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0636,
+ },
+ [0x0637]={
+ adobename="afii57431",
+ category="lo",
+ description="ARABIC LETTER TAH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0637,
+ },
+ [0x0638]={
+ adobename="afii57432",
+ category="lo",
+ description="ARABIC LETTER ZAH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0638,
+ },
+ [0x0639]={
+ adobename="afii57433",
+ category="lo",
+ description="ARABIC LETTER AIN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0639,
+ },
+ [0x063A]={
+ adobename="afii57434",
+ category="lo",
+ description="ARABIC LETTER GHAIN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x063A,
+ },
+ [0x0640]={
+ adobename="afii57440",
+ category="lm",
+ description="ARABIC TATWEEL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0640,
+ },
+ [0x0641]={
+ adobename="afii57441",
+ category="lo",
+ description="ARABIC LETTER FEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0641,
+ },
+ [0x0642]={
+ adobename="afii57442",
+ category="lo",
+ description="ARABIC LETTER QAF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0642,
+ },
+ [0x0643]={
+ adobename="afii57443",
+ category="lo",
+ description="ARABIC LETTER KAF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0643,
+ },
+ [0x0644]={
+ adobename="afii57444",
+ category="lo",
+ description="ARABIC LETTER LAM",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0644,
+ },
+ [0x0645]={
+ adobename="afii57445",
+ category="lo",
+ description="ARABIC LETTER MEEM",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0645,
+ },
+ [0x0646]={
+ adobename="afii57446",
+ category="lo",
+ description="ARABIC LETTER NOON",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0646,
+ },
+ [0x0647]={
+ adobename="afii57470",
+ category="lo",
+ description="ARABIC LETTER HEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0647,
+ },
+ [0x0648]={
+ adobename="afii57448",
+ category="lo",
+ description="ARABIC LETTER WAW",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0648,
+ },
+ [0x0649]={
+ adobename="afii57449",
+ category="lo",
+ description="ARABIC LETTER ALEF MAKSURA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0649,
+ },
+ [0x064A]={
+ adobename="afii57450",
+ category="lo",
+ description="ARABIC LETTER YEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x064A,
+ },
+ [0x064B]={
+ adobename="afii57451",
+ category="mn",
+ description="ARABIC FATHATAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x064B,
+ },
+ [0x064C]={
+ adobename="afii57452",
+ category="mn",
+ description="ARABIC DAMMATAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x064C,
+ },
+ [0x064D]={
+ adobename="afii57453",
+ category="mn",
+ description="ARABIC KASRATAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x064D,
+ },
+ [0x064E]={
+ adobename="afii57454",
+ category="mn",
+ description="ARABIC FATHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x064E,
+ },
+ [0x064F]={
+ adobename="afii57455",
+ category="mn",
+ description="ARABIC DAMMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x064F,
+ },
+ [0x0650]={
+ adobename="afii57456",
+ category="mn",
+ description="ARABIC KASRA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0650,
+ },
+ [0x0651]={
+ adobename="afii57457",
+ category="mn",
+ description="ARABIC SHADDA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0651,
+ },
+ [0x0652]={
+ adobename="afii57458",
+ category="mn",
+ description="ARABIC SUKUN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0652,
+ },
+ [0x0653]={
+ category="mn",
+ description="ARABIC MADDAH ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0653,
+ },
+ [0x0654]={
+ category="mn",
+ description="ARABIC HAMZA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0654,
+ },
+ [0x0655]={
+ category="mn",
+ description="ARABIC HAMZA BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0655,
+ },
+ [0x0656]={
+ category="mn",
+ description="ARABIC SUBSCRIPT ALEF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0656,
+ },
+ [0x0657]={
+ category="mn",
+ description="ARABIC INVERTED DAMMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0657,
+ },
+ [0x0658]={
+ category="mn",
+ description="ARABIC MARK NOON GHUNNA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0658,
+ },
+ [0x0659]={
+ category="mn",
+ description="ARABIC ZWARAKAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0659,
+ },
+ [0x065A]={
+ category="mn",
+ description="ARABIC VOWEL SIGN SMALL V ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x065A,
+ },
+ [0x065B]={
+ category="mn",
+ description="ARABIC VOWEL SIGN INVERTED SMALL V ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x065B,
+ },
+ [0x065C]={
+ category="mn",
+ description="ARABIC VOWEL SIGN DOT BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x065C,
+ },
+ [0x065D]={
+ category="mn",
+ description="ARABIC REVERSED DAMMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x065D,
+ },
+ [0x065E]={
+ category="mn",
+ description="ARABIC FATHA WITH TWO DOTS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x065E,
+ },
+ [0x0660]={
+ adobename="afii57392",
+ category="nd",
+ description="ARABIC-INDIC DIGIT ZERO",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0660,
+ },
+ [0x0661]={
+ adobename="afii57393",
+ category="nd",
+ description="ARABIC-INDIC DIGIT ONE",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0661,
+ },
+ [0x0662]={
+ adobename="afii57394",
+ category="nd",
+ description="ARABIC-INDIC DIGIT TWO",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0662,
+ },
+ [0x0663]={
+ adobename="afii57395",
+ category="nd",
+ description="ARABIC-INDIC DIGIT THREE",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0663,
+ },
+ [0x0664]={
+ adobename="afii57396",
+ category="nd",
+ description="ARABIC-INDIC DIGIT FOUR",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0664,
+ },
+ [0x0665]={
+ adobename="afii57397",
+ category="nd",
+ description="ARABIC-INDIC DIGIT FIVE",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0665,
+ },
+ [0x0666]={
+ adobename="afii57398",
+ category="nd",
+ description="ARABIC-INDIC DIGIT SIX",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0666,
+ },
+ [0x0667]={
+ adobename="afii57399",
+ category="nd",
+ description="ARABIC-INDIC DIGIT SEVEN",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0667,
+ },
+ [0x0668]={
+ adobename="afii57400",
+ category="nd",
+ description="ARABIC-INDIC DIGIT EIGHT",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0668,
+ },
+ [0x0669]={
+ adobename="afii57401",
+ category="nd",
+ description="ARABIC-INDIC DIGIT NINE",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x0669,
+ },
+ [0x066A]={
+ adobename="afii57381",
+ category="po",
+ description="ARABIC PERCENT SIGN",
+ direction="et",
+ linebreak="ex",
+ unicodeslot=0x066A,
+ },
+ [0x066B]={
+ category="po",
+ description="ARABIC DECIMAL SEPARATOR",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x066B,
+ },
+ [0x066C]={
+ category="po",
+ description="ARABIC THOUSANDS SEPARATOR",
+ direction="an",
+ linebreak="nu",
+ unicodeslot=0x066C,
+ },
+ [0x066D]={
+ adobename="afii63167",
+ category="po",
+ description="ARABIC FIVE POINTED STAR",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x066D,
+ },
+ [0x066E]={
+ category="lo",
+ description="ARABIC LETTER DOTLESS BEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x066E,
+ },
+ [0x066F]={
+ category="lo",
+ description="ARABIC LETTER DOTLESS QAF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x066F,
+ },
+ [0x0670]={
+ category="mn",
+ description="ARABIC LETTER SUPERSCRIPT ALEF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0670,
+ },
+ [0x0671]={
+ category="lo",
+ description="ARABIC LETTER ALEF WASLA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0671,
+ },
+ [0x0672]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ unicodeslot=0x0672,
+ },
+ [0x0673]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH WAVY HAMZA BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ unicodeslot=0x0673,
+ },
+ [0x0674]={
+ category="lo",
+ description="ARABIC LETTER HIGH HAMZA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0674,
+ },
+ [0x0675]={
+ category="lo",
+ description="ARABIC LETTER HIGH HAMZA ALEF",
+ direction="al",
+ linebreak="al",
+ specials={ "compat", 0x0627, 0x0674 },
+ unicodeslot=0x0675,
+ },
+ [0x0676]={
+ category="lo",
+ description="ARABIC LETTER HIGH HAMZA WAW",
+ direction="al",
+ linebreak="al",
+ specials={ "compat", 0x0648, 0x0674 },
+ unicodeslot=0x0676,
+ },
+ [0x0677]={
+ category="lo",
+ description="ARABIC LETTER U WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x06C7,
+ specials={ "compat", 0x06C7, 0x0674 },
+ unicodeslot=0x0677,
+ },
+ [0x0678]={
+ category="lo",
+ description="ARABIC LETTER HIGH HAMZA YEH",
+ direction="al",
+ linebreak="al",
+ specials={ "compat", 0x064A, 0x0674 },
+ unicodeslot=0x0678,
+ },
+ [0x0679]={
+ adobename="afii57511",
+ category="lo",
+ description="ARABIC LETTER TTEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0679,
+ },
+ [0x067A]={
+ category="lo",
+ description="ARABIC LETTER TTEHEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x067A,
+ },
+ [0x067B]={
+ category="lo",
+ description="ARABIC LETTER BEEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x067B,
+ },
+ [0x067C]={
+ category="lo",
+ description="ARABIC LETTER TEH WITH RING",
+ direction="al",
+ linebreak="al",
+ shcode=0x062A,
+ unicodeslot=0x067C,
+ },
+ [0x067D]={
+ category="lo",
+ description="ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS",
+ direction="al",
+ linebreak="al",
+ shcode=0x062A,
+ unicodeslot=0x067D,
+ },
+ [0x067E]={
+ adobename="afii57506",
+ category="lo",
+ description="ARABIC LETTER PEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x067E,
+ },
+ [0x067F]={
+ category="lo",
+ description="ARABIC LETTER TEHEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x067F,
+ },
+ [0x0680]={
+ category="lo",
+ description="ARABIC LETTER BEHEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0680,
+ },
+ [0x0681]={
+ category="lo",
+ description="ARABIC LETTER HAH WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x062D,
+ unicodeslot=0x0681,
+ },
+ [0x0682]={
+ category="lo",
+ description="ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x062D,
+ unicodeslot=0x0682,
+ },
+ [0x0683]={
+ category="lo",
+ description="ARABIC LETTER NYEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0683,
+ },
+ [0x0684]={
+ category="lo",
+ description="ARABIC LETTER DYEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0684,
+ },
+ [0x0685]={
+ category="lo",
+ description="ARABIC LETTER HAH WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x062D,
+ unicodeslot=0x0685,
+ },
+ [0x0686]={
+ adobename="afii57507",
+ category="lo",
+ description="ARABIC LETTER TCHEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0686,
+ },
+ [0x0687]={
+ category="lo",
+ description="ARABIC LETTER TCHEHEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0687,
+ },
+ [0x0688]={
+ adobename="afii57512",
+ category="lo",
+ description="ARABIC LETTER DDAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0688,
+ },
+ [0x0689]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH RING",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x0689,
+ },
+ [0x068A]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x068A,
+ },
+ [0x068B]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x068B,
+ },
+ [0x068C]={
+ category="lo",
+ description="ARABIC LETTER DAHAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x068C,
+ },
+ [0x068D]={
+ category="lo",
+ description="ARABIC LETTER DDAHAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x068D,
+ },
+ [0x068E]={
+ category="lo",
+ description="ARABIC LETTER DUL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x068E,
+ },
+ [0x068F]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x068F,
+ },
+ [0x0690]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH FOUR DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x0690,
+ },
+ [0x0691]={
+ adobename="afii57513",
+ category="lo",
+ description="ARABIC LETTER RREH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0691,
+ },
+ [0x0692]={
+ category="lo",
+ description="ARABIC LETTER REH WITH SMALL V",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x0692,
+ },
+ [0x0693]={
+ category="lo",
+ description="ARABIC LETTER REH WITH RING",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x0693,
+ },
+ [0x0694]={
+ category="lo",
+ description="ARABIC LETTER REH WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x0694,
+ },
+ [0x0695]={
+ category="lo",
+ description="ARABIC LETTER REH WITH SMALL V BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x0695,
+ },
+ [0x0696]={
+ category="lo",
+ description="ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x0696,
+ },
+ [0x0697]={
+ category="lo",
+ description="ARABIC LETTER REH WITH TWO DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x0697,
+ },
+ [0x0698]={
+ adobename="afii57508",
+ category="lo",
+ description="ARABIC LETTER JEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0698,
+ },
+ [0x0699]={
+ category="lo",
+ description="ARABIC LETTER REH WITH FOUR DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x0699,
+ },
+ [0x069A]={
+ category="lo",
+ description="ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0633,
+ unicodeslot=0x069A,
+ },
+ [0x069B]={
+ category="lo",
+ description="ARABIC LETTER SEEN WITH THREE DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0633,
+ unicodeslot=0x069B,
+ },
+ [0x069C]={
+ category="lo",
+ description="ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0633,
+ unicodeslot=0x069C,
+ },
+ [0x069D]={
+ category="lo",
+ description="ARABIC LETTER SAD WITH TWO DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0635,
+ unicodeslot=0x069D,
+ },
+ [0x069E]={
+ category="lo",
+ description="ARABIC LETTER SAD WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0635,
+ unicodeslot=0x069E,
+ },
+ [0x069F]={
+ category="lo",
+ description="ARABIC LETTER TAH WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0637,
+ unicodeslot=0x069F,
+ },
+ [0x06A0]={
+ category="lo",
+ description="ARABIC LETTER AIN WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0639,
+ unicodeslot=0x06A0,
+ },
+ [0x06A1]={
+ category="lo",
+ description="ARABIC LETTER DOTLESS FEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06A1,
+ },
+ [0x06A2]={
+ category="lo",
+ description="ARABIC LETTER FEH WITH DOT MOVED BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0641,
+ unicodeslot=0x06A2,
+ },
+ [0x06A3]={
+ category="lo",
+ description="ARABIC LETTER FEH WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0641,
+ unicodeslot=0x06A3,
+ },
+ [0x06A4]={
+ adobename="afii57505",
+ category="lo",
+ description="ARABIC LETTER VEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06A4,
+ },
+ [0x06A5]={
+ category="lo",
+ description="ARABIC LETTER FEH WITH THREE DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0641,
+ unicodeslot=0x06A5,
+ },
+ [0x06A6]={
+ category="lo",
+ description="ARABIC LETTER PEHEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06A6,
+ },
+ [0x06A7]={
+ category="lo",
+ description="ARABIC LETTER QAF WITH DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0642,
+ unicodeslot=0x06A7,
+ },
+ [0x06A8]={
+ category="lo",
+ description="ARABIC LETTER QAF WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0642,
+ unicodeslot=0x06A8,
+ },
+ [0x06A9]={
+ category="lo",
+ description="ARABIC LETTER KEHEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06A9,
+ },
+ [0x06AA]={
+ category="lo",
+ description="ARABIC LETTER SWASH KAF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06AA,
+ },
+ [0x06AB]={
+ category="lo",
+ description="ARABIC LETTER KAF WITH RING",
+ direction="al",
+ linebreak="al",
+ shcode=0x0643,
+ unicodeslot=0x06AB,
+ },
+ [0x06AC]={
+ category="lo",
+ description="ARABIC LETTER KAF WITH DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0643,
+ unicodeslot=0x06AC,
+ },
+ [0x06AD]={
+ category="lo",
+ description="ARABIC LETTER NG",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06AD,
+ },
+ [0x06AE]={
+ category="lo",
+ description="ARABIC LETTER KAF WITH THREE DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0643,
+ unicodeslot=0x06AE,
+ },
+ [0x06AF]={
+ adobename="afii57509",
+ category="lo",
+ description="ARABIC LETTER GAF",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06AF,
+ },
+ [0x06B0]={
+ category="lo",
+ description="ARABIC LETTER GAF WITH RING",
+ direction="al",
+ linebreak="al",
+ shcode=0x06AF,
+ unicodeslot=0x06B0,
+ },
+ [0x06B1]={
+ category="lo",
+ description="ARABIC LETTER NGOEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06B1,
+ },
+ [0x06B2]={
+ category="lo",
+ description="ARABIC LETTER GAF WITH TWO DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x06AF,
+ unicodeslot=0x06B2,
+ },
+ [0x06B3]={
+ category="lo",
+ description="ARABIC LETTER GUEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06B3,
+ },
+ [0x06B4]={
+ category="lo",
+ description="ARABIC LETTER GAF WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x06AF,
+ unicodeslot=0x06B4,
+ },
+ [0x06B5]={
+ category="lo",
+ description="ARABIC LETTER LAM WITH SMALL V",
+ direction="al",
+ linebreak="al",
+ shcode=0x0644,
+ unicodeslot=0x06B5,
+ },
+ [0x06B6]={
+ category="lo",
+ description="ARABIC LETTER LAM WITH DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0644,
+ unicodeslot=0x06B6,
+ },
+ [0x06B7]={
+ category="lo",
+ description="ARABIC LETTER LAM WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0644,
+ unicodeslot=0x06B7,
+ },
+ [0x06B8]={
+ category="lo",
+ description="ARABIC LETTER LAM WITH THREE DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0644,
+ unicodeslot=0x06B8,
+ },
+ [0x06B9]={
+ category="lo",
+ description="ARABIC LETTER NOON WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0646,
+ unicodeslot=0x06B9,
+ },
+ [0x06BA]={
+ adobename="afii57514",
+ category="lo",
+ description="ARABIC LETTER NOON GHUNNA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06BA,
+ },
+ [0x06BB]={
+ category="lo",
+ description="ARABIC LETTER RNOON",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06BB,
+ },
+ [0x06BC]={
+ category="lo",
+ description="ARABIC LETTER NOON WITH RING",
+ direction="al",
+ linebreak="al",
+ shcode=0x0646,
+ unicodeslot=0x06BC,
+ },
+ [0x06BD]={
+ category="lo",
+ description="ARABIC LETTER NOON WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0646,
+ unicodeslot=0x06BD,
+ },
+ [0x06BE]={
+ category="lo",
+ description="ARABIC LETTER HEH DOACHASHMEE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06BE,
+ },
+ [0x06BF]={
+ category="lo",
+ description="ARABIC LETTER TCHEH WITH DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0686,
+ unicodeslot=0x06BF,
+ },
+ [0x06C0]={
+ category="lo",
+ description="ARABIC LETTER HEH WITH YEH ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0647,
+ specials={ "char", 0x06D5, 0x0654 },
+ unicodeslot=0x06C0,
+ },
+ [0x06C1]={
+ category="lo",
+ description="ARABIC LETTER HEH GOAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06C1,
+ },
+ [0x06C2]={
+ category="lo",
+ description="ARABIC LETTER HEH GOAL WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ specials={ "char", 0x06C1, 0x0654 },
+ unicodeslot=0x06C2,
+ },
+ [0x06C3]={
+ category="lo",
+ description="ARABIC LETTER TEH MARBUTA GOAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06C3,
+ },
+ [0x06C4]={
+ category="lo",
+ description="ARABIC LETTER WAW WITH RING",
+ direction="al",
+ linebreak="al",
+ shcode=0x0648,
+ unicodeslot=0x06C4,
+ },
+ [0x06C5]={
+ category="lo",
+ description="ARABIC LETTER KIRGHIZ OE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06C5,
+ },
+ [0x06C6]={
+ category="lo",
+ description="ARABIC LETTER OE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06C6,
+ },
+ [0x06C7]={
+ category="lo",
+ description="ARABIC LETTER U",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06C7,
+ },
+ [0x06C8]={
+ category="lo",
+ description="ARABIC LETTER YU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06C8,
+ },
+ [0x06C9]={
+ category="lo",
+ description="ARABIC LETTER KIRGHIZ YU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06C9,
+ },
+ [0x06CA]={
+ category="lo",
+ description="ARABIC LETTER WAW WITH TWO DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0648,
+ unicodeslot=0x06CA,
+ },
+ [0x06CB]={
+ category="lo",
+ description="ARABIC LETTER VE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06CB,
+ },
+ [0x06CC]={
+ category="lo",
+ description="ARABIC LETTER FARSI YEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06CC,
+ },
+ [0x06CD]={
+ category="lo",
+ description="ARABIC LETTER YEH WITH TAIL",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ unicodeslot=0x06CD,
+ },
+ [0x06CE]={
+ category="lo",
+ description="ARABIC LETTER YEH WITH SMALL V",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ unicodeslot=0x06CE,
+ },
+ [0x06CF]={
+ category="lo",
+ description="ARABIC LETTER WAW WITH DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0648,
+ unicodeslot=0x06CF,
+ },
+ [0x06D0]={
+ category="lo",
+ description="ARABIC LETTER E",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06D0,
+ },
+ [0x06D1]={
+ category="lo",
+ description="ARABIC LETTER YEH WITH THREE DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ unicodeslot=0x06D1,
+ },
+ [0x06D2]={
+ adobename="afii57519",
+ category="lo",
+ description="ARABIC LETTER YEH BARREE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06D2,
+ },
+ [0x06D3]={
+ category="lo",
+ description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ specials={ "char", 0x06D2, 0x0654 },
+ unicodeslot=0x06D3,
+ },
+ [0x06D4]={
+ category="po",
+ description="ARABIC FULL STOP",
+ direction="al",
+ linebreak="ex",
+ unicodeslot=0x06D4,
+ },
+ [0x06D5]={
+ adobename="afii57534",
+ category="lo",
+ description="ARABIC LETTER AE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06D5,
+ },
+ [0x06D6]={
+ category="mn",
+ description="ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06D6,
+ },
+ [0x06D7]={
+ category="mn",
+ description="ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06D7,
+ },
+ [0x06D8]={
+ category="mn",
+ description="ARABIC SMALL HIGH MEEM INITIAL FORM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06D8,
+ },
+ [0x06D9]={
+ category="mn",
+ description="ARABIC SMALL HIGH LAM ALEF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06D9,
+ },
+ [0x06DA]={
+ category="mn",
+ description="ARABIC SMALL HIGH JEEM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06DA,
+ },
+ [0x06DB]={
+ category="mn",
+ description="ARABIC SMALL HIGH THREE DOTS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06DB,
+ },
+ [0x06DC]={
+ category="mn",
+ description="ARABIC SMALL HIGH SEEN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06DC,
+ },
+ [0x06DD]={
+ category="cf",
+ description="ARABIC END OF AYAH",
+ direction="an",
+ visible="yes",
+ linebreak="al",
+ unicodeslot=0x06DD,
+ },
+ [0x06DE]={
+ category="me",
+ description="ARABIC START OF RUB EL HIZB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06DE,
+ },
+ [0x06DF]={
+ category="mn",
+ description="ARABIC SMALL HIGH ROUNDED ZERO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06DF,
+ },
+ [0x06E0]={
+ category="mn",
+ description="ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06E0,
+ },
+ [0x06E1]={
+ category="mn",
+ description="ARABIC SMALL HIGH DOTLESS HEAD OF KHAH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06E1,
+ },
+ [0x06E2]={
+ category="mn",
+ description="ARABIC SMALL HIGH MEEM ISOLATED FORM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06E2,
+ },
+ [0x06E3]={
+ category="mn",
+ description="ARABIC SMALL LOW SEEN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06E3,
+ },
+ [0x06E4]={
+ category="mn",
+ description="ARABIC SMALL HIGH MADDA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06E4,
+ },
+ [0x06E5]={
+ category="lm",
+ description="ARABIC SMALL WAW",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06E5,
+ },
+ [0x06E6]={
+ category="lm",
+ description="ARABIC SMALL YEH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06E6,
+ },
+ [0x06E7]={
+ category="mn",
+ description="ARABIC SMALL HIGH YEH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06E7,
+ },
+ [0x06E8]={
+ category="mn",
+ description="ARABIC SMALL HIGH NOON",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06E8,
+ },
+ [0x06E9]={
+ category="so",
+ description="ARABIC PLACE OF SAJDAH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x06E9,
+ },
+ [0x06EA]={
+ category="mn",
+ description="ARABIC EMPTY CENTRE LOW STOP",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06EA,
+ },
+ [0x06EB]={
+ category="mn",
+ description="ARABIC EMPTY CENTRE HIGH STOP",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06EB,
+ },
+ [0x06EC]={
+ category="mn",
+ description="ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06EC,
+ },
+ [0x06ED]={
+ category="mn",
+ description="ARABIC SMALL LOW MEEM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x06ED,
+ },
+ [0x06EE]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH INVERTED V",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x06EE,
+ },
+ [0x06EF]={
+ category="lo",
+ description="ARABIC LETTER REH WITH INVERTED V",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x06EF,
+ },
+ [0x06F0]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT ZERO",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F0,
+ },
+ [0x06F1]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT ONE",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F1,
+ },
+ [0x06F2]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT TWO",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F2,
+ },
+ [0x06F3]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT THREE",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F3,
+ },
+ [0x06F4]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT FOUR",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F4,
+ },
+ [0x06F5]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT FIVE",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F5,
+ },
+ [0x06F6]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT SIX",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F6,
+ },
+ [0x06F7]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT SEVEN",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F7,
+ },
+ [0x06F8]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT EIGHT",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F8,
+ },
+ [0x06F9]={
+ category="nd",
+ description="EXTENDED ARABIC-INDIC DIGIT NINE",
+ direction="en",
+ linebreak="nu",
+ unicodeslot=0x06F9,
+ },
+ [0x06FA]={
+ category="lo",
+ description="ARABIC LETTER SHEEN WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0634,
+ unicodeslot=0x06FA,
+ },
+ [0x06FB]={
+ category="lo",
+ description="ARABIC LETTER DAD WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0636,
+ unicodeslot=0x06FB,
+ },
+ [0x06FC]={
+ category="lo",
+ description="ARABIC LETTER GHAIN WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x063A,
+ unicodeslot=0x06FC,
+ },
+ [0x06FD]={
+ category="so",
+ description="ARABIC SIGN SINDHI AMPERSAND",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06FD,
+ },
+ [0x06FE]={
+ category="so",
+ description="ARABIC SIGN SINDHI POSTPOSITION MEN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x06FE,
+ },
+ [0x06FF]={
+ category="lo",
+ description="ARABIC LETTER HEH WITH INVERTED V",
+ direction="al",
+ linebreak="al",
+ shcode=0x0647,
+ unicodeslot=0x06FF,
+ },
+ [0x0700]={
+ category="po",
+ description="SYRIAC END OF PARAGRAPH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0700,
+ },
+ [0x0701]={
+ category="po",
+ description="SYRIAC SUPRALINEAR FULL STOP",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0701,
+ },
+ [0x0702]={
+ category="po",
+ description="SYRIAC SUBLINEAR FULL STOP",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0702,
+ },
+ [0x0703]={
+ category="po",
+ description="SYRIAC SUPRALINEAR COLON",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0703,
+ },
+ [0x0704]={
+ category="po",
+ description="SYRIAC SUBLINEAR COLON",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0704,
+ },
+ [0x0705]={
+ category="po",
+ description="SYRIAC HORIZONTAL COLON",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0705,
+ },
+ [0x0706]={
+ category="po",
+ description="SYRIAC COLON SKEWED LEFT",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0706,
+ },
+ [0x0707]={
+ category="po",
+ description="SYRIAC COLON SKEWED RIGHT",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0707,
+ },
+ [0x0708]={
+ category="po",
+ description="SYRIAC SUPRALINEAR COLON SKEWED LEFT",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0708,
+ },
+ [0x0709]={
+ category="po",
+ description="SYRIAC SUBLINEAR COLON SKEWED RIGHT",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0709,
+ },
+ [0x070A]={
+ category="po",
+ description="SYRIAC CONTRACTION",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x070A,
+ },
+ [0x070B]={
+ category="po",
+ description="SYRIAC HARKLEAN OBELUS",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x070B,
+ },
+ [0x070C]={
+ category="po",
+ description="SYRIAC HARKLEAN METOBELUS",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x070C,
+ },
+ [0x070D]={
+ category="po",
+ description="SYRIAC HARKLEAN ASTERISCUS",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x070D,
+ },
+ [0x070F]={
+ category="cf",
+ description="SYRIAC ABBREVIATION MARK",
+ direction="bn",
+ visible="yes",
+ linebreak="al",
+ unicodeslot=0x070F,
+ },
+ [0x0710]={
+ category="lo",
+ description="SYRIAC LETTER ALAPH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0710,
+ },
+ [0x0711]={
+ category="mn",
+ description="SYRIAC LETTER SUPERSCRIPT ALAPH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0711,
+ },
+ [0x0712]={
+ category="lo",
+ description="SYRIAC LETTER BETH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0712,
+ },
+ [0x0713]={
+ category="lo",
+ description="SYRIAC LETTER GAMAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0713,
+ },
+ [0x0714]={
+ category="lo",
+ description="SYRIAC LETTER GAMAL GARSHUNI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0714,
+ },
+ [0x0715]={
+ category="lo",
+ description="SYRIAC LETTER DALATH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0715,
+ },
+ [0x0716]={
+ category="lo",
+ description="SYRIAC LETTER DOTLESS DALATH RISH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0716,
+ },
+ [0x0717]={
+ category="lo",
+ description="SYRIAC LETTER HE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0717,
+ },
+ [0x0718]={
+ category="lo",
+ description="SYRIAC LETTER WAW",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0718,
+ },
+ [0x0719]={
+ category="lo",
+ description="SYRIAC LETTER ZAIN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0719,
+ },
+ [0x071A]={
+ category="lo",
+ description="SYRIAC LETTER HETH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x071A,
+ },
+ [0x071B]={
+ category="lo",
+ description="SYRIAC LETTER TETH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x071B,
+ },
+ [0x071C]={
+ category="lo",
+ description="SYRIAC LETTER TETH GARSHUNI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x071C,
+ },
+ [0x071D]={
+ category="lo",
+ description="SYRIAC LETTER YUDH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x071D,
+ },
+ [0x071E]={
+ category="lo",
+ description="SYRIAC LETTER YUDH HE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x071E,
+ },
+ [0x071F]={
+ category="lo",
+ description="SYRIAC LETTER KAPH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x071F,
+ },
+ [0x0720]={
+ category="lo",
+ description="SYRIAC LETTER LAMADH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0720,
+ },
+ [0x0721]={
+ category="lo",
+ description="SYRIAC LETTER MIM",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0721,
+ },
+ [0x0722]={
+ category="lo",
+ description="SYRIAC LETTER NUN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0722,
+ },
+ [0x0723]={
+ category="lo",
+ description="SYRIAC LETTER SEMKATH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0723,
+ },
+ [0x0724]={
+ category="lo",
+ description="SYRIAC LETTER FINAL SEMKATH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0724,
+ },
+ [0x0725]={
+ category="lo",
+ description="SYRIAC LETTER E",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0725,
+ },
+ [0x0726]={
+ category="lo",
+ description="SYRIAC LETTER PE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0726,
+ },
+ [0x0727]={
+ category="lo",
+ description="SYRIAC LETTER REVERSED PE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0727,
+ },
+ [0x0728]={
+ category="lo",
+ description="SYRIAC LETTER SADHE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0728,
+ },
+ [0x0729]={
+ category="lo",
+ description="SYRIAC LETTER QAPH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0729,
+ },
+ [0x072A]={
+ category="lo",
+ description="SYRIAC LETTER RISH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x072A,
+ },
+ [0x072B]={
+ category="lo",
+ description="SYRIAC LETTER SHIN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x072B,
+ },
+ [0x072C]={
+ category="lo",
+ description="SYRIAC LETTER TAW",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x072C,
+ },
+ [0x072D]={
+ category="lo",
+ description="SYRIAC LETTER PERSIAN BHETH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x072D,
+ },
+ [0x072E]={
+ category="lo",
+ description="SYRIAC LETTER PERSIAN GHAMAL",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x072E,
+ },
+ [0x072F]={
+ category="lo",
+ description="SYRIAC LETTER PERSIAN DHALATH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x072F,
+ },
+ [0x0730]={
+ category="mn",
+ description="SYRIAC PTHAHA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0730,
+ },
+ [0x0731]={
+ category="mn",
+ description="SYRIAC PTHAHA BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0731,
+ },
+ [0x0732]={
+ category="mn",
+ description="SYRIAC PTHAHA DOTTED",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0732,
+ },
+ [0x0733]={
+ category="mn",
+ description="SYRIAC ZQAPHA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0733,
+ },
+ [0x0734]={
+ category="mn",
+ description="SYRIAC ZQAPHA BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0734,
+ },
+ [0x0735]={
+ category="mn",
+ description="SYRIAC ZQAPHA DOTTED",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0735,
+ },
+ [0x0736]={
+ category="mn",
+ description="SYRIAC RBASA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0736,
+ },
+ [0x0737]={
+ category="mn",
+ description="SYRIAC RBASA BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0737,
+ },
+ [0x0738]={
+ category="mn",
+ description="SYRIAC DOTTED ZLAMA HORIZONTAL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0738,
+ },
+ [0x0739]={
+ category="mn",
+ description="SYRIAC DOTTED ZLAMA ANGULAR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0739,
+ },
+ [0x073A]={
+ category="mn",
+ description="SYRIAC HBASA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x073A,
+ },
+ [0x073B]={
+ category="mn",
+ description="SYRIAC HBASA BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x073B,
+ },
+ [0x073C]={
+ category="mn",
+ description="SYRIAC HBASA-ESASA DOTTED",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x073C,
+ },
+ [0x073D]={
+ category="mn",
+ description="SYRIAC ESASA ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x073D,
+ },
+ [0x073E]={
+ category="mn",
+ description="SYRIAC ESASA BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x073E,
+ },
+ [0x073F]={
+ category="mn",
+ description="SYRIAC RWAHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x073F,
+ },
+ [0x0740]={
+ category="mn",
+ description="SYRIAC FEMININE DOT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0740,
+ },
+ [0x0741]={
+ category="mn",
+ description="SYRIAC QUSHSHAYA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0741,
+ },
+ [0x0742]={
+ category="mn",
+ description="SYRIAC RUKKAKHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0742,
+ },
+ [0x0743]={
+ category="mn",
+ description="SYRIAC TWO VERTICAL DOTS ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0743,
+ },
+ [0x0744]={
+ category="mn",
+ description="SYRIAC TWO VERTICAL DOTS BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0744,
+ },
+ [0x0745]={
+ category="mn",
+ description="SYRIAC THREE DOTS ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0745,
+ },
+ [0x0746]={
+ category="mn",
+ description="SYRIAC THREE DOTS BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0746,
+ },
+ [0x0747]={
+ category="mn",
+ description="SYRIAC OBLIQUE LINE ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0747,
+ },
+ [0x0748]={
+ category="mn",
+ description="SYRIAC OBLIQUE LINE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0748,
+ },
+ [0x0749]={
+ category="mn",
+ description="SYRIAC MUSIC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0749,
+ },
+ [0x074A]={
+ category="mn",
+ description="SYRIAC BARREKH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x074A,
+ },
+ [0x074D]={
+ category="lo",
+ description="SYRIAC LETTER SOGDIAN ZHAIN",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x074D,
+ },
+ [0x074E]={
+ category="lo",
+ description="SYRIAC LETTER SOGDIAN KHAPH",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x074E,
+ },
+ [0x074F]={
+ category="lo",
+ description="SYRIAC LETTER SOGDIAN FE",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x074F,
+ },
+ [0x0750]={
+ category="lo",
+ description="ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0628,
+ unicodeslot=0x0750,
+ },
+ [0x0751]={
+ category="lo",
+ description="ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0628,
+ unicodeslot=0x0751,
+ },
+ [0x0752]={
+ category="lo",
+ description="ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0628,
+ unicodeslot=0x0752,
+ },
+ [0x0753]={
+ category="lo",
+ description="ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0628,
+ unicodeslot=0x0753,
+ },
+ [0x0754]={
+ category="lo",
+ description="ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0628,
+ unicodeslot=0x0754,
+ },
+ [0x0755]={
+ category="lo",
+ description="ARABIC LETTER BEH WITH INVERTED SMALL V BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0628,
+ unicodeslot=0x0755,
+ },
+ [0x0756]={
+ category="lo",
+ description="ARABIC LETTER BEH WITH SMALL V",
+ direction="al",
+ linebreak="al",
+ shcode=0x0628,
+ unicodeslot=0x0756,
+ },
+ [0x0757]={
+ category="lo",
+ description="ARABIC LETTER HAH WITH TWO DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x062D,
+ unicodeslot=0x0757,
+ },
+ [0x0758]={
+ category="lo",
+ description="ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x062D,
+ unicodeslot=0x0758,
+ },
+ [0x0759]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x0759,
+ },
+ [0x075A]={
+ category="lo",
+ description="ARABIC LETTER DAL WITH INVERTED SMALL V BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x062F,
+ unicodeslot=0x075A,
+ },
+ [0x075B]={
+ category="lo",
+ description="ARABIC LETTER REH WITH STROKE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x075B,
+ },
+ [0x075C]={
+ category="lo",
+ description="ARABIC LETTER SEEN WITH FOUR DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0633,
+ unicodeslot=0x075C,
+ },
+ [0x075D]={
+ category="lo",
+ description="ARABIC LETTER AIN WITH TWO DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0639,
+ unicodeslot=0x075D,
+ },
+ [0x075E]={
+ category="lo",
+ description="ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0639,
+ unicodeslot=0x075E,
+ },
+ [0x075F]={
+ category="lo",
+ description="ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0639,
+ unicodeslot=0x075F,
+ },
+ [0x0760]={
+ category="lo",
+ description="ARABIC LETTER FEH WITH TWO DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0641,
+ unicodeslot=0x0760,
+ },
+ [0x0761]={
+ category="lo",
+ description="ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0641,
+ unicodeslot=0x0761,
+ },
+ [0x0762]={
+ category="lo",
+ description="ARABIC LETTER KEHEH WITH DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x06A9,
+ unicodeslot=0x0762,
+ },
+ [0x0763]={
+ category="lo",
+ description="ARABIC LETTER KEHEH WITH THREE DOTS ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x06A9,
+ unicodeslot=0x0763,
+ },
+ [0x0764]={
+ category="lo",
+ description="ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x06A9,
+ unicodeslot=0x0764,
+ },
+ [0x0765]={
+ category="lo",
+ description="ARABIC LETTER MEEM WITH DOT ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0645,
+ unicodeslot=0x0765,
+ },
+ [0x0766]={
+ category="lo",
+ description="ARABIC LETTER MEEM WITH DOT BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0645,
+ unicodeslot=0x0766,
+ },
+ [0x0767]={
+ category="lo",
+ description="ARABIC LETTER NOON WITH TWO DOTS BELOW",
+ direction="al",
+ linebreak="al",
+ shcode=0x0646,
+ unicodeslot=0x0767,
+ },
+ [0x0768]={
+ category="lo",
+ description="ARABIC LETTER NOON WITH SMALL TAH",
+ direction="al",
+ linebreak="al",
+ shcode=0x0646,
+ unicodeslot=0x0768,
+ },
+ [0x0769]={
+ category="lo",
+ description="ARABIC LETTER NOON WITH SMALL V",
+ direction="al",
+ linebreak="al",
+ shcode=0x0646,
+ unicodeslot=0x0769,
+ },
+ [0x076A]={
+ category="lo",
+ description="ARABIC LETTER LAM WITH BAR",
+ direction="al",
+ linebreak="al",
+ shcode=0x0644,
+ unicodeslot=0x076A,
+ },
+ [0x076B]={
+ category="lo",
+ description="ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x076B,
+ },
+ [0x076C]={
+ category="lo",
+ description="ARABIC LETTER REH WITH HAMZA ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0631,
+ unicodeslot=0x076C,
+ },
+ [0x076D]={
+ category="lo",
+ description="ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE",
+ direction="al",
+ linebreak="al",
+ shcode=0x0633,
+ unicodeslot=0x076D,
+ },
+ [0x0780]={
+ category="lo",
+ description="THAANA LETTER HAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0780,
+ },
+ [0x0781]={
+ category="lo",
+ description="THAANA LETTER SHAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0781,
+ },
+ [0x0782]={
+ category="lo",
+ description="THAANA LETTER NOONU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0782,
+ },
+ [0x0783]={
+ category="lo",
+ description="THAANA LETTER RAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0783,
+ },
+ [0x0784]={
+ category="lo",
+ description="THAANA LETTER BAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0784,
+ },
+ [0x0785]={
+ category="lo",
+ description="THAANA LETTER LHAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0785,
+ },
+ [0x0786]={
+ category="lo",
+ description="THAANA LETTER KAAFU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0786,
+ },
+ [0x0787]={
+ category="lo",
+ description="THAANA LETTER ALIFU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0787,
+ },
+ [0x0788]={
+ category="lo",
+ description="THAANA LETTER VAAVU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0788,
+ },
+ [0x0789]={
+ category="lo",
+ description="THAANA LETTER MEEMU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0789,
+ },
+ [0x078A]={
+ category="lo",
+ description="THAANA LETTER FAAFU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x078A,
+ },
+ [0x078B]={
+ category="lo",
+ description="THAANA LETTER DHAALU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x078B,
+ },
+ [0x078C]={
+ category="lo",
+ description="THAANA LETTER THAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x078C,
+ },
+ [0x078D]={
+ category="lo",
+ description="THAANA LETTER LAAMU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x078D,
+ },
+ [0x078E]={
+ category="lo",
+ description="THAANA LETTER GAAFU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x078E,
+ },
+ [0x078F]={
+ category="lo",
+ description="THAANA LETTER GNAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x078F,
+ },
+ [0x0790]={
+ category="lo",
+ description="THAANA LETTER SEENU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0790,
+ },
+ [0x0791]={
+ category="lo",
+ description="THAANA LETTER DAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0791,
+ },
+ [0x0792]={
+ category="lo",
+ description="THAANA LETTER ZAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0792,
+ },
+ [0x0793]={
+ category="lo",
+ description="THAANA LETTER TAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0793,
+ },
+ [0x0794]={
+ category="lo",
+ description="THAANA LETTER YAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0794,
+ },
+ [0x0795]={
+ category="lo",
+ description="THAANA LETTER PAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0795,
+ },
+ [0x0796]={
+ category="lo",
+ description="THAANA LETTER JAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0796,
+ },
+ [0x0797]={
+ category="lo",
+ description="THAANA LETTER CHAVIYANI",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0797,
+ },
+ [0x0798]={
+ category="lo",
+ description="THAANA LETTER TTAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0798,
+ },
+ [0x0799]={
+ category="lo",
+ description="THAANA LETTER HHAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x0799,
+ },
+ [0x079A]={
+ category="lo",
+ description="THAANA LETTER KHAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x079A,
+ },
+ [0x079B]={
+ category="lo",
+ description="THAANA LETTER THAALU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x079B,
+ },
+ [0x079C]={
+ category="lo",
+ description="THAANA LETTER ZAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x079C,
+ },
+ [0x079D]={
+ category="lo",
+ description="THAANA LETTER SHEENU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x079D,
+ },
+ [0x079E]={
+ category="lo",
+ description="THAANA LETTER SAADHU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x079E,
+ },
+ [0x079F]={
+ category="lo",
+ description="THAANA LETTER DAADHU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x079F,
+ },
+ [0x07A0]={
+ category="lo",
+ description="THAANA LETTER TO",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x07A0,
+ },
+ [0x07A1]={
+ category="lo",
+ description="THAANA LETTER ZO",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x07A1,
+ },
+ [0x07A2]={
+ category="lo",
+ description="THAANA LETTER AINU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x07A2,
+ },
+ [0x07A3]={
+ category="lo",
+ description="THAANA LETTER GHAINU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x07A3,
+ },
+ [0x07A4]={
+ category="lo",
+ description="THAANA LETTER QAAFU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x07A4,
+ },
+ [0x07A5]={
+ category="lo",
+ description="THAANA LETTER WAAVU",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x07A5,
+ },
+ [0x07A6]={
+ category="mn",
+ description="THAANA ABAFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07A6,
+ },
+ [0x07A7]={
+ category="mn",
+ description="THAANA AABAAFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07A7,
+ },
+ [0x07A8]={
+ category="mn",
+ description="THAANA IBIFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07A8,
+ },
+ [0x07A9]={
+ category="mn",
+ description="THAANA EEBEEFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07A9,
+ },
+ [0x07AA]={
+ category="mn",
+ description="THAANA UBUFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07AA,
+ },
+ [0x07AB]={
+ category="mn",
+ description="THAANA OOBOOFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07AB,
+ },
+ [0x07AC]={
+ category="mn",
+ description="THAANA EBEFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07AC,
+ },
+ [0x07AD]={
+ category="mn",
+ description="THAANA EYBEYFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07AD,
+ },
+ [0x07AE]={
+ category="mn",
+ description="THAANA OBOFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07AE,
+ },
+ [0x07AF]={
+ category="mn",
+ description="THAANA OABOAFILI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07AF,
+ },
+ [0x07B0]={
+ category="mn",
+ description="THAANA SUKUN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07B0,
+ },
+ [0x07B1]={
+ category="lo",
+ description="THAANA LETTER NAA",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0x07B1,
+ },
+ [0x07C0]={
+ category="nd",
+ description="NKO DIGIT ZERO",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C0,
+ },
+ [0x07C1]={
+ category="nd",
+ description="NKO DIGIT ONE",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C1,
+ },
+ [0x07C2]={
+ category="nd",
+ description="NKO DIGIT TWO",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C2,
+ },
+ [0x07C3]={
+ category="nd",
+ description="NKO DIGIT THREE",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C3,
+ },
+ [0x07C4]={
+ category="nd",
+ description="NKO DIGIT FOUR",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C4,
+ },
+ [0x07C5]={
+ category="nd",
+ description="NKO DIGIT FIVE",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C5,
+ },
+ [0x07C6]={
+ category="nd",
+ description="NKO DIGIT SIX",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C6,
+ },
+ [0x07C7]={
+ category="nd",
+ description="NKO DIGIT SEVEN",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C7,
+ },
+ [0x07C8]={
+ category="nd",
+ description="NKO DIGIT EIGHT",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C8,
+ },
+ [0x07C9]={
+ category="nd",
+ description="NKO DIGIT NINE",
+ direction="r",
+ linebreak="nu",
+ unicodeslot=0x07C9,
+ },
+ [0x07CA]={
+ category="lo",
+ description="NKO LETTER A",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07CA,
+ },
+ [0x07CB]={
+ category="lo",
+ description="NKO LETTER EE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07CB,
+ },
+ [0x07CC]={
+ category="lo",
+ description="NKO LETTER I",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07CC,
+ },
+ [0x07CD]={
+ category="lo",
+ description="NKO LETTER E",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07CD,
+ },
+ [0x07CE]={
+ category="lo",
+ description="NKO LETTER U",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07CE,
+ },
+ [0x07CF]={
+ category="lo",
+ description="NKO LETTER OO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07CF,
+ },
+ [0x07D0]={
+ category="lo",
+ description="NKO LETTER O",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D0,
+ },
+ [0x07D1]={
+ category="lo",
+ description="NKO LETTER DAGBASINNA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D1,
+ },
+ [0x07D2]={
+ category="lo",
+ description="NKO LETTER N",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D2,
+ },
+ [0x07D3]={
+ category="lo",
+ description="NKO LETTER BA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D3,
+ },
+ [0x07D4]={
+ category="lo",
+ description="NKO LETTER PA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D4,
+ },
+ [0x07D5]={
+ category="lo",
+ description="NKO LETTER TA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D5,
+ },
+ [0x07D6]={
+ category="lo",
+ description="NKO LETTER JA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D6,
+ },
+ [0x07D7]={
+ category="lo",
+ description="NKO LETTER CHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D7,
+ },
+ [0x07D8]={
+ category="lo",
+ description="NKO LETTER DA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D8,
+ },
+ [0x07D9]={
+ category="lo",
+ description="NKO LETTER RA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07D9,
+ },
+ [0x07DA]={
+ category="lo",
+ description="NKO LETTER RRA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07DA,
+ },
+ [0x07DB]={
+ category="lo",
+ description="NKO LETTER SA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07DB,
+ },
+ [0x07DC]={
+ category="lo",
+ description="NKO LETTER GBA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07DC,
+ },
+ [0x07DD]={
+ category="lo",
+ description="NKO LETTER FA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07DD,
+ },
+ [0x07DE]={
+ category="lo",
+ description="NKO LETTER KA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07DE,
+ },
+ [0x07DF]={
+ category="lo",
+ description="NKO LETTER LA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07DF,
+ },
+ [0x07E0]={
+ category="lo",
+ description="NKO LETTER NA WOLOSO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E0,
+ },
+ [0x07E1]={
+ category="lo",
+ description="NKO LETTER MA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E1,
+ },
+ [0x07E2]={
+ category="lo",
+ description="NKO LETTER NYA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E2,
+ },
+ [0x07E3]={
+ category="lo",
+ description="NKO LETTER NA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E3,
+ },
+ [0x07E4]={
+ category="lo",
+ description="NKO LETTER HA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E4,
+ },
+ [0x07E5]={
+ category="lo",
+ description="NKO LETTER WA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E5,
+ },
+ [0x07E6]={
+ category="lo",
+ description="NKO LETTER YA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E6,
+ },
+ [0x07E7]={
+ category="lo",
+ description="NKO LETTER NYA WOLOSO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E7,
+ },
+ [0x07E8]={
+ category="lo",
+ description="NKO LETTER JONA JA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E8,
+ },
+ [0x07E9]={
+ category="lo",
+ description="NKO LETTER JONA CHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07E9,
+ },
+ [0x07EA]={
+ category="lo",
+ description="NKO LETTER JONA RA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07EA,
+ },
+ [0x07EB]={
+ category="mn",
+ description="NKO COMBINING SHORT HIGH TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07EB,
+ },
+ [0x07EC]={
+ category="mn",
+ description="NKO COMBINING SHORT LOW TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07EC,
+ },
+ [0x07ED]={
+ category="mn",
+ description="NKO COMBINING SHORT RISING TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07ED,
+ },
+ [0x07EE]={
+ category="mn",
+ description="NKO COMBINING LONG DESCENDING TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07EE,
+ },
+ [0x07EF]={
+ category="mn",
+ description="NKO COMBINING LONG HIGH TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07EF,
+ },
+ [0x07F0]={
+ category="mn",
+ description="NKO COMBINING LONG LOW TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07F0,
+ },
+ [0x07F1]={
+ category="mn",
+ description="NKO COMBINING LONG RISING TONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07F1,
+ },
+ [0x07F2]={
+ category="mn",
+ description="NKO COMBINING NASALIZATION MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07F2,
+ },
+ [0x07F3]={
+ category="mn",
+ description="NKO COMBINING DOUBLE DOT ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x07F3,
+ },
+ [0x07F4]={
+ category="lm",
+ description="NKO HIGH TONE APOSTROPHE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07F4,
+ },
+ [0x07F5]={
+ category="lm",
+ description="NKO LOW TONE APOSTROPHE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07F5,
+ },
+ [0x07F6]={
+ category="so",
+ description="NKO SYMBOL OO DENNEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x07F6,
+ },
+ [0x07F7]={
+ category="po",
+ description="NKO SYMBOL GBAKURUNEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x07F7,
+ },
+ [0x07F8]={
+ category="po",
+ description="NKO COMMA",
+ direction="on",
+ linebreak="is",
+ unicodeslot=0x07F8,
+ },
+ [0x07F9]={
+ category="po",
+ description="NKO EXCLAMATION MARK",
+ direction="on",
+ linebreak="ex",
+ unicodeslot=0x07F9,
+ },
+ [0x07FA]={
+ category="lm",
+ description="NKO LAJANYALAN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x07FA,
+ },
+ [0x0901]={
+ category="mn",
+ description="DEVANAGARI SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0901,
+ },
+ [0x0902]={
+ category="mn",
+ description="DEVANAGARI SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0902,
+ },
+ [0x0903]={
+ category="mc",
+ description="DEVANAGARI SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0903,
+ },
+ [0x0904]={
+ category="lo",
+ description="DEVANAGARI LETTER SHORT A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0904,
+ },
+ [0x0905]={
+ category="lo",
+ description="DEVANAGARI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0905,
+ },
+ [0x0906]={
+ category="lo",
+ description="DEVANAGARI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0906,
+ },
+ [0x0907]={
+ category="lo",
+ description="DEVANAGARI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0907,
+ },
+ [0x0908]={
+ category="lo",
+ description="DEVANAGARI LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0908,
+ },
+ [0x0909]={
+ category="lo",
+ description="DEVANAGARI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0909,
+ },
+ [0x090A]={
+ category="lo",
+ description="DEVANAGARI LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x090A,
+ },
+ [0x090B]={
+ category="lo",
+ description="DEVANAGARI LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x090B,
+ },
+ [0x090C]={
+ category="lo",
+ description="DEVANAGARI LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x090C,
+ },
+ [0x090D]={
+ category="lo",
+ description="DEVANAGARI LETTER CANDRA E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x090D,
+ },
+ [0x090E]={
+ category="lo",
+ description="DEVANAGARI LETTER SHORT E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x090E,
+ },
+ [0x090F]={
+ category="lo",
+ description="DEVANAGARI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x090F,
+ },
+ [0x0910]={
+ category="lo",
+ description="DEVANAGARI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0910,
+ },
+ [0x0911]={
+ category="lo",
+ description="DEVANAGARI LETTER CANDRA O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0911,
+ },
+ [0x0912]={
+ category="lo",
+ description="DEVANAGARI LETTER SHORT O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0912,
+ },
+ [0x0913]={
+ category="lo",
+ description="DEVANAGARI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0913,
+ },
+ [0x0914]={
+ category="lo",
+ description="DEVANAGARI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0914,
+ },
+ [0x0915]={
+ category="lo",
+ description="DEVANAGARI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0915,
+ },
+ [0x0916]={
+ category="lo",
+ description="DEVANAGARI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0916,
+ },
+ [0x0917]={
+ category="lo",
+ description="DEVANAGARI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0917,
+ },
+ [0x0918]={
+ category="lo",
+ description="DEVANAGARI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0918,
+ },
+ [0x0919]={
+ category="lo",
+ description="DEVANAGARI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0919,
+ },
+ [0x091A]={
+ category="lo",
+ description="DEVANAGARI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x091A,
+ },
+ [0x091B]={
+ category="lo",
+ description="DEVANAGARI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x091B,
+ },
+ [0x091C]={
+ category="lo",
+ description="DEVANAGARI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x091C,
+ },
+ [0x091D]={
+ category="lo",
+ description="DEVANAGARI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x091D,
+ },
+ [0x091E]={
+ category="lo",
+ description="DEVANAGARI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x091E,
+ },
+ [0x091F]={
+ category="lo",
+ description="DEVANAGARI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x091F,
+ },
+ [0x0920]={
+ category="lo",
+ description="DEVANAGARI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0920,
+ },
+ [0x0921]={
+ category="lo",
+ description="DEVANAGARI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0921,
+ },
+ [0x0922]={
+ category="lo",
+ description="DEVANAGARI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0922,
+ },
+ [0x0923]={
+ category="lo",
+ description="DEVANAGARI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0923,
+ },
+ [0x0924]={
+ category="lo",
+ description="DEVANAGARI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0924,
+ },
+ [0x0925]={
+ category="lo",
+ description="DEVANAGARI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0925,
+ },
+ [0x0926]={
+ category="lo",
+ description="DEVANAGARI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0926,
+ },
+ [0x0927]={
+ category="lo",
+ description="DEVANAGARI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0927,
+ },
+ [0x0928]={
+ category="lo",
+ description="DEVANAGARI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0928,
+ },
+ [0x0929]={
+ category="lo",
+ description="DEVANAGARI LETTER NNNA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0928, 0x093C },
+ unicodeslot=0x0929,
+ },
+ [0x092A]={
+ category="lo",
+ description="DEVANAGARI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x092A,
+ },
+ [0x092B]={
+ category="lo",
+ description="DEVANAGARI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x092B,
+ },
+ [0x092C]={
+ category="lo",
+ description="DEVANAGARI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x092C,
+ },
+ [0x092D]={
+ category="lo",
+ description="DEVANAGARI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x092D,
+ },
+ [0x092E]={
+ category="lo",
+ description="DEVANAGARI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x092E,
+ },
+ [0x092F]={
+ category="lo",
+ description="DEVANAGARI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x092F,
+ },
+ [0x0930]={
+ category="lo",
+ description="DEVANAGARI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0930,
+ },
+ [0x0931]={
+ category="lo",
+ description="DEVANAGARI LETTER RRA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0930, 0x093C },
+ unicodeslot=0x0931,
+ },
+ [0x0932]={
+ category="lo",
+ description="DEVANAGARI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0932,
+ },
+ [0x0933]={
+ category="lo",
+ description="DEVANAGARI LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0933,
+ },
+ [0x0934]={
+ category="lo",
+ description="DEVANAGARI LETTER LLLA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0933, 0x093C },
+ unicodeslot=0x0934,
+ },
+ [0x0935]={
+ category="lo",
+ description="DEVANAGARI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0935,
+ },
+ [0x0936]={
+ category="lo",
+ description="DEVANAGARI LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0936,
+ },
+ [0x0937]={
+ category="lo",
+ description="DEVANAGARI LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0937,
+ },
+ [0x0938]={
+ category="lo",
+ description="DEVANAGARI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0938,
+ },
+ [0x0939]={
+ category="lo",
+ description="DEVANAGARI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0939,
+ },
+ [0x093C]={
+ category="mn",
+ description="DEVANAGARI SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x093C,
+ },
+ [0x093D]={
+ category="lo",
+ description="DEVANAGARI SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x093D,
+ },
+ [0x093E]={
+ category="mc",
+ description="DEVANAGARI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x093E,
+ },
+ [0x093F]={
+ category="mc",
+ description="DEVANAGARI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x093F,
+ },
+ [0x0940]={
+ category="mc",
+ description="DEVANAGARI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0940,
+ },
+ [0x0941]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0941,
+ },
+ [0x0942]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0942,
+ },
+ [0x0943]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0943,
+ },
+ [0x0944]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0944,
+ },
+ [0x0945]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN CANDRA E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0945,
+ },
+ [0x0946]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN SHORT E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0946,
+ },
+ [0x0947]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0947,
+ },
+ [0x0948]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0948,
+ },
+ [0x0949]={
+ category="mc",
+ description="DEVANAGARI VOWEL SIGN CANDRA O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0949,
+ },
+ [0x094A]={
+ category="mc",
+ description="DEVANAGARI VOWEL SIGN SHORT O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x094A,
+ },
+ [0x094B]={
+ category="mc",
+ description="DEVANAGARI VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x094B,
+ },
+ [0x094C]={
+ category="mc",
+ description="DEVANAGARI VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x094C,
+ },
+ [0x094D]={
+ category="mn",
+ description="DEVANAGARI SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x094D,
+ },
+ [0x0950]={
+ category="lo",
+ description="DEVANAGARI OM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0950,
+ },
+ [0x0951]={
+ category="mn",
+ description="DEVANAGARI STRESS SIGN UDATTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0951,
+ },
+ [0x0952]={
+ category="mn",
+ description="DEVANAGARI STRESS SIGN ANUDATTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0952,
+ },
+ [0x0953]={
+ category="mn",
+ description="DEVANAGARI GRAVE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0953,
+ },
+ [0x0954]={
+ category="mn",
+ description="DEVANAGARI ACUTE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0954,
+ },
+ [0x0958]={
+ category="lo",
+ description="DEVANAGARI LETTER QA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0915, 0x093C },
+ unicodeslot=0x0958,
+ },
+ [0x0959]={
+ category="lo",
+ description="DEVANAGARI LETTER KHHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0916, 0x093C },
+ unicodeslot=0x0959,
+ },
+ [0x095A]={
+ category="lo",
+ description="DEVANAGARI LETTER GHHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0917, 0x093C },
+ unicodeslot=0x095A,
+ },
+ [0x095B]={
+ category="lo",
+ description="DEVANAGARI LETTER ZA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x091C, 0x093C },
+ unicodeslot=0x095B,
+ },
+ [0x095C]={
+ category="lo",
+ description="DEVANAGARI LETTER DDDHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0921, 0x093C },
+ unicodeslot=0x095C,
+ },
+ [0x095D]={
+ category="lo",
+ description="DEVANAGARI LETTER RHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0922, 0x093C },
+ unicodeslot=0x095D,
+ },
+ [0x095E]={
+ category="lo",
+ description="DEVANAGARI LETTER FA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x092B, 0x093C },
+ unicodeslot=0x095E,
+ },
+ [0x095F]={
+ category="lo",
+ description="DEVANAGARI LETTER YYA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x092F, 0x093C },
+ unicodeslot=0x095F,
+ },
+ [0x0960]={
+ category="lo",
+ description="DEVANAGARI LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0960,
+ },
+ [0x0961]={
+ category="lo",
+ description="DEVANAGARI LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0961,
+ },
+ [0x0962]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0962,
+ },
+ [0x0963]={
+ category="mn",
+ description="DEVANAGARI VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0963,
+ },
+ [0x0964]={
+ category="po",
+ description="DEVANAGARI DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0964,
+ },
+ [0x0965]={
+ category="po",
+ description="DEVANAGARI DOUBLE DANDA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0965,
+ },
+ [0x0966]={
+ category="nd",
+ description="DEVANAGARI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0966,
+ },
+ [0x0967]={
+ category="nd",
+ description="DEVANAGARI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0967,
+ },
+ [0x0968]={
+ category="nd",
+ description="DEVANAGARI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0968,
+ },
+ [0x0969]={
+ category="nd",
+ description="DEVANAGARI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0969,
+ },
+ [0x096A]={
+ category="nd",
+ description="DEVANAGARI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x096A,
+ },
+ [0x096B]={
+ category="nd",
+ description="DEVANAGARI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x096B,
+ },
+ [0x096C]={
+ category="nd",
+ description="DEVANAGARI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x096C,
+ },
+ [0x096D]={
+ category="nd",
+ description="DEVANAGARI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x096D,
+ },
+ [0x096E]={
+ category="nd",
+ description="DEVANAGARI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x096E,
+ },
+ [0x096F]={
+ category="nd",
+ description="DEVANAGARI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x096F,
+ },
+ [0x0970]={
+ category="po",
+ description="DEVANAGARI ABBREVIATION SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0970,
+ },
+ [0x097B]={
+ category="lo",
+ description="DEVANAGARI LETTER GGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x097B,
+ },
+ [0x097C]={
+ category="lo",
+ description="DEVANAGARI LETTER JJA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x097C,
+ },
+ [0x097D]={
+ category="lo",
+ description="DEVANAGARI LETTER GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x097D,
+ },
+ [0x097E]={
+ category="lo",
+ description="DEVANAGARI LETTER DDDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x097E,
+ },
+ [0x097F]={
+ category="lo",
+ description="DEVANAGARI LETTER BBA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x097F,
+ },
+ [0x0981]={
+ category="mn",
+ description="BENGALI SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0981,
+ },
+ [0x0982]={
+ category="mc",
+ description="BENGALI SIGN ANUSVARA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0982,
+ },
+ [0x0983]={
+ category="mc",
+ description="BENGALI SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0983,
+ },
+ [0x0985]={
+ category="lo",
+ description="BENGALI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0985,
+ },
+ [0x0986]={
+ category="lo",
+ description="BENGALI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0986,
+ },
+ [0x0987]={
+ category="lo",
+ description="BENGALI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0987,
+ },
+ [0x0988]={
+ category="lo",
+ description="BENGALI LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0988,
+ },
+ [0x0989]={
+ category="lo",
+ description="BENGALI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0989,
+ },
+ [0x098A]={
+ category="lo",
+ description="BENGALI LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x098A,
+ },
+ [0x098B]={
+ category="lo",
+ description="BENGALI LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x098B,
+ },
+ [0x098C]={
+ category="lo",
+ description="BENGALI LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x098C,
+ },
+ [0x098F]={
+ category="lo",
+ description="BENGALI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x098F,
+ },
+ [0x0990]={
+ category="lo",
+ description="BENGALI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0990,
+ },
+ [0x0993]={
+ category="lo",
+ description="BENGALI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0993,
+ },
+ [0x0994]={
+ category="lo",
+ description="BENGALI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0994,
+ },
+ [0x0995]={
+ category="lo",
+ description="BENGALI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0995,
+ },
+ [0x0996]={
+ category="lo",
+ description="BENGALI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0996,
+ },
+ [0x0997]={
+ category="lo",
+ description="BENGALI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0997,
+ },
+ [0x0998]={
+ category="lo",
+ description="BENGALI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0998,
+ },
+ [0x0999]={
+ category="lo",
+ description="BENGALI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0999,
+ },
+ [0x099A]={
+ category="lo",
+ description="BENGALI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x099A,
+ },
+ [0x099B]={
+ category="lo",
+ description="BENGALI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x099B,
+ },
+ [0x099C]={
+ category="lo",
+ description="BENGALI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x099C,
+ },
+ [0x099D]={
+ category="lo",
+ description="BENGALI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x099D,
+ },
+ [0x099E]={
+ category="lo",
+ description="BENGALI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x099E,
+ },
+ [0x099F]={
+ category="lo",
+ description="BENGALI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x099F,
+ },
+ [0x09A0]={
+ category="lo",
+ description="BENGALI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A0,
+ },
+ [0x09A1]={
+ category="lo",
+ description="BENGALI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A1,
+ },
+ [0x09A2]={
+ category="lo",
+ description="BENGALI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A2,
+ },
+ [0x09A3]={
+ category="lo",
+ description="BENGALI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A3,
+ },
+ [0x09A4]={
+ category="lo",
+ description="BENGALI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A4,
+ },
+ [0x09A5]={
+ category="lo",
+ description="BENGALI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A5,
+ },
+ [0x09A6]={
+ category="lo",
+ description="BENGALI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A6,
+ },
+ [0x09A7]={
+ category="lo",
+ description="BENGALI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A7,
+ },
+ [0x09A8]={
+ category="lo",
+ description="BENGALI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09A8,
+ },
+ [0x09AA]={
+ category="lo",
+ description="BENGALI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09AA,
+ },
+ [0x09AB]={
+ category="lo",
+ description="BENGALI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09AB,
+ },
+ [0x09AC]={
+ category="lo",
+ description="BENGALI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09AC,
+ },
+ [0x09AD]={
+ category="lo",
+ description="BENGALI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09AD,
+ },
+ [0x09AE]={
+ category="lo",
+ description="BENGALI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09AE,
+ },
+ [0x09AF]={
+ category="lo",
+ description="BENGALI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09AF,
+ },
+ [0x09B0]={
+ category="lo",
+ description="BENGALI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09B0,
+ },
+ [0x09B2]={
+ category="lo",
+ description="BENGALI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09B2,
+ },
+ [0x09B6]={
+ category="lo",
+ description="BENGALI LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09B6,
+ },
+ [0x09B7]={
+ category="lo",
+ description="BENGALI LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09B7,
+ },
+ [0x09B8]={
+ category="lo",
+ description="BENGALI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09B8,
+ },
+ [0x09B9]={
+ category="lo",
+ description="BENGALI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09B9,
+ },
+ [0x09BC]={
+ category="mn",
+ description="BENGALI SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09BC,
+ },
+ [0x09BD]={
+ category="lo",
+ description="BENGALI SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09BD,
+ },
+ [0x09BE]={
+ category="mc",
+ description="BENGALI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x09BE,
+ },
+ [0x09BF]={
+ category="mc",
+ description="BENGALI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x09BF,
+ },
+ [0x09C0]={
+ category="mc",
+ description="BENGALI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x09C0,
+ },
+ [0x09C1]={
+ category="mn",
+ description="BENGALI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09C1,
+ },
+ [0x09C2]={
+ category="mn",
+ description="BENGALI VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09C2,
+ },
+ [0x09C3]={
+ category="mn",
+ description="BENGALI VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09C3,
+ },
+ [0x09C4]={
+ category="mn",
+ description="BENGALI VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09C4,
+ },
+ [0x09C7]={
+ category="mc",
+ description="BENGALI VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x09C7,
+ },
+ [0x09C8]={
+ category="mc",
+ description="BENGALI VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x09C8,
+ },
+ [0x09CB]={
+ category="mc",
+ description="BENGALI VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x09C7, 0x09BE },
+ unicodeslot=0x09CB,
+ },
+ [0x09CC]={
+ category="mc",
+ description="BENGALI VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x09C7, 0x09D7 },
+ unicodeslot=0x09CC,
+ },
+ [0x09CD]={
+ category="mn",
+ description="BENGALI SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09CD,
+ },
+ [0x09CE]={
+ category="lo",
+ description="BENGALI LETTER KHANDA TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09CE,
+ },
+ [0x09D7]={
+ category="mc",
+ description="BENGALI AU LENGTH MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x09D7,
+ },
+ [0x09DC]={
+ category="lo",
+ description="BENGALI LETTER RRA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x09A1, 0x09BC },
+ unicodeslot=0x09DC,
+ },
+ [0x09DD]={
+ category="lo",
+ description="BENGALI LETTER RHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x09A2, 0x09BC },
+ unicodeslot=0x09DD,
+ },
+ [0x09DF]={
+ category="lo",
+ description="BENGALI LETTER YYA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x09AF, 0x09BC },
+ unicodeslot=0x09DF,
+ },
+ [0x09E0]={
+ category="lo",
+ description="BENGALI LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09E0,
+ },
+ [0x09E1]={
+ category="lo",
+ description="BENGALI LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09E1,
+ },
+ [0x09E2]={
+ category="mn",
+ description="BENGALI VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09E2,
+ },
+ [0x09E3]={
+ category="mn",
+ description="BENGALI VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x09E3,
+ },
+ [0x09E6]={
+ category="nd",
+ description="BENGALI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09E6,
+ },
+ [0x09E7]={
+ category="nd",
+ description="BENGALI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09E7,
+ },
+ [0x09E8]={
+ category="nd",
+ description="BENGALI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09E8,
+ },
+ [0x09E9]={
+ category="nd",
+ description="BENGALI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09E9,
+ },
+ [0x09EA]={
+ category="nd",
+ description="BENGALI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09EA,
+ },
+ [0x09EB]={
+ category="nd",
+ description="BENGALI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09EB,
+ },
+ [0x09EC]={
+ category="nd",
+ description="BENGALI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09EC,
+ },
+ [0x09ED]={
+ category="nd",
+ description="BENGALI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09ED,
+ },
+ [0x09EE]={
+ category="nd",
+ description="BENGALI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09EE,
+ },
+ [0x09EF]={
+ category="nd",
+ description="BENGALI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x09EF,
+ },
+ [0x09F0]={
+ category="lo",
+ description="BENGALI LETTER RA WITH MIDDLE DIAGONAL",
+ direction="l",
+ linebreak="al",
+ shcode=0x09B0,
+ unicodeslot=0x09F0,
+ },
+ [0x09F1]={
+ category="lo",
+ description="BENGALI LETTER RA WITH LOWER DIAGONAL",
+ direction="l",
+ linebreak="al",
+ shcode=0x09B0,
+ unicodeslot=0x09F1,
+ },
+ [0x09F2]={
+ category="sc",
+ description="BENGALI RUPEE MARK",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x09F2,
+ },
+ [0x09F3]={
+ category="sc",
+ description="BENGALI RUPEE SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x09F3,
+ },
+ [0x09F4]={
+ category="no",
+ description="BENGALI CURRENCY NUMERATOR ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09F4,
+ },
+ [0x09F5]={
+ category="no",
+ description="BENGALI CURRENCY NUMERATOR TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09F5,
+ },
+ [0x09F6]={
+ category="no",
+ description="BENGALI CURRENCY NUMERATOR THREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09F6,
+ },
+ [0x09F7]={
+ category="no",
+ description="BENGALI CURRENCY NUMERATOR FOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09F7,
+ },
+ [0x09F8]={
+ category="no",
+ description="BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09F8,
+ },
+ [0x09F9]={
+ category="no",
+ description="BENGALI CURRENCY DENOMINATOR SIXTEEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09F9,
+ },
+ [0x09FA]={
+ category="so",
+ description="BENGALI ISSHAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x09FA,
+ },
+ [0x0A01]={
+ category="mn",
+ description="GURMUKHI SIGN ADAK BINDI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A01,
+ },
+ [0x0A02]={
+ category="mn",
+ description="GURMUKHI SIGN BINDI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A02,
+ },
+ [0x0A03]={
+ category="mc",
+ description="GURMUKHI SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0A03,
+ },
+ [0x0A05]={
+ category="lo",
+ description="GURMUKHI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A05,
+ },
+ [0x0A06]={
+ category="lo",
+ description="GURMUKHI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A06,
+ },
+ [0x0A07]={
+ category="lo",
+ description="GURMUKHI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A07,
+ },
+ [0x0A08]={
+ category="lo",
+ description="GURMUKHI LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A08,
+ },
+ [0x0A09]={
+ category="lo",
+ description="GURMUKHI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A09,
+ },
+ [0x0A0A]={
+ category="lo",
+ description="GURMUKHI LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A0A,
+ },
+ [0x0A0F]={
+ category="lo",
+ description="GURMUKHI LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A0F,
+ },
+ [0x0A10]={
+ category="lo",
+ description="GURMUKHI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A10,
+ },
+ [0x0A13]={
+ category="lo",
+ description="GURMUKHI LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A13,
+ },
+ [0x0A14]={
+ category="lo",
+ description="GURMUKHI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A14,
+ },
+ [0x0A15]={
+ category="lo",
+ description="GURMUKHI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A15,
+ },
+ [0x0A16]={
+ category="lo",
+ description="GURMUKHI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A16,
+ },
+ [0x0A17]={
+ category="lo",
+ description="GURMUKHI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A17,
+ },
+ [0x0A18]={
+ category="lo",
+ description="GURMUKHI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A18,
+ },
+ [0x0A19]={
+ category="lo",
+ description="GURMUKHI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A19,
+ },
+ [0x0A1A]={
+ category="lo",
+ description="GURMUKHI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A1A,
+ },
+ [0x0A1B]={
+ category="lo",
+ description="GURMUKHI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A1B,
+ },
+ [0x0A1C]={
+ category="lo",
+ description="GURMUKHI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A1C,
+ },
+ [0x0A1D]={
+ category="lo",
+ description="GURMUKHI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A1D,
+ },
+ [0x0A1E]={
+ category="lo",
+ description="GURMUKHI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A1E,
+ },
+ [0x0A1F]={
+ category="lo",
+ description="GURMUKHI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A1F,
+ },
+ [0x0A20]={
+ category="lo",
+ description="GURMUKHI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A20,
+ },
+ [0x0A21]={
+ category="lo",
+ description="GURMUKHI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A21,
+ },
+ [0x0A22]={
+ category="lo",
+ description="GURMUKHI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A22,
+ },
+ [0x0A23]={
+ category="lo",
+ description="GURMUKHI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A23,
+ },
+ [0x0A24]={
+ category="lo",
+ description="GURMUKHI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A24,
+ },
+ [0x0A25]={
+ category="lo",
+ description="GURMUKHI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A25,
+ },
+ [0x0A26]={
+ category="lo",
+ description="GURMUKHI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A26,
+ },
+ [0x0A27]={
+ category="lo",
+ description="GURMUKHI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A27,
+ },
+ [0x0A28]={
+ category="lo",
+ description="GURMUKHI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A28,
+ },
+ [0x0A2A]={
+ category="lo",
+ description="GURMUKHI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A2A,
+ },
+ [0x0A2B]={
+ category="lo",
+ description="GURMUKHI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A2B,
+ },
+ [0x0A2C]={
+ category="lo",
+ description="GURMUKHI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A2C,
+ },
+ [0x0A2D]={
+ category="lo",
+ description="GURMUKHI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A2D,
+ },
+ [0x0A2E]={
+ category="lo",
+ description="GURMUKHI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A2E,
+ },
+ [0x0A2F]={
+ category="lo",
+ description="GURMUKHI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A2F,
+ },
+ [0x0A30]={
+ category="lo",
+ description="GURMUKHI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A30,
+ },
+ [0x0A32]={
+ category="lo",
+ description="GURMUKHI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A32,
+ },
+ [0x0A33]={
+ category="lo",
+ description="GURMUKHI LETTER LLA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0A32, 0x0A3C },
+ unicodeslot=0x0A33,
+ },
+ [0x0A35]={
+ category="lo",
+ description="GURMUKHI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A35,
+ },
+ [0x0A36]={
+ category="lo",
+ description="GURMUKHI LETTER SHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0A38, 0x0A3C },
+ unicodeslot=0x0A36,
+ },
+ [0x0A38]={
+ category="lo",
+ description="GURMUKHI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A38,
+ },
+ [0x0A39]={
+ category="lo",
+ description="GURMUKHI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A39,
+ },
+ [0x0A3C]={
+ category="mn",
+ description="GURMUKHI SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A3C,
+ },
+ [0x0A3E]={
+ category="mc",
+ description="GURMUKHI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0A3E,
+ },
+ [0x0A3F]={
+ category="mc",
+ description="GURMUKHI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0A3F,
+ },
+ [0x0A40]={
+ category="mc",
+ description="GURMUKHI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0A40,
+ },
+ [0x0A41]={
+ category="mn",
+ description="GURMUKHI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A41,
+ },
+ [0x0A42]={
+ category="mn",
+ description="GURMUKHI VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A42,
+ },
+ [0x0A47]={
+ category="mn",
+ description="GURMUKHI VOWEL SIGN EE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A47,
+ },
+ [0x0A48]={
+ category="mn",
+ description="GURMUKHI VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A48,
+ },
+ [0x0A4B]={
+ category="mn",
+ description="GURMUKHI VOWEL SIGN OO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A4B,
+ },
+ [0x0A4C]={
+ category="mn",
+ description="GURMUKHI VOWEL SIGN AU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A4C,
+ },
+ [0x0A4D]={
+ category="mn",
+ description="GURMUKHI SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A4D,
+ },
+ [0x0A59]={
+ category="lo",
+ description="GURMUKHI LETTER KHHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0A16, 0x0A3C },
+ unicodeslot=0x0A59,
+ },
+ [0x0A5A]={
+ category="lo",
+ description="GURMUKHI LETTER GHHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0A17, 0x0A3C },
+ unicodeslot=0x0A5A,
+ },
+ [0x0A5B]={
+ category="lo",
+ description="GURMUKHI LETTER ZA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0A1C, 0x0A3C },
+ unicodeslot=0x0A5B,
+ },
+ [0x0A5C]={
+ category="lo",
+ description="GURMUKHI LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A5C,
+ },
+ [0x0A5E]={
+ category="lo",
+ description="GURMUKHI LETTER FA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0A2B, 0x0A3C },
+ unicodeslot=0x0A5E,
+ },
+ [0x0A66]={
+ category="nd",
+ description="GURMUKHI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A66,
+ },
+ [0x0A67]={
+ category="nd",
+ description="GURMUKHI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A67,
+ },
+ [0x0A68]={
+ category="nd",
+ description="GURMUKHI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A68,
+ },
+ [0x0A69]={
+ category="nd",
+ description="GURMUKHI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A69,
+ },
+ [0x0A6A]={
+ category="nd",
+ description="GURMUKHI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A6A,
+ },
+ [0x0A6B]={
+ category="nd",
+ description="GURMUKHI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A6B,
+ },
+ [0x0A6C]={
+ category="nd",
+ description="GURMUKHI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A6C,
+ },
+ [0x0A6D]={
+ category="nd",
+ description="GURMUKHI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A6D,
+ },
+ [0x0A6E]={
+ category="nd",
+ description="GURMUKHI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A6E,
+ },
+ [0x0A6F]={
+ category="nd",
+ description="GURMUKHI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0A6F,
+ },
+ [0x0A70]={
+ category="mn",
+ description="GURMUKHI TIPPI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A70,
+ },
+ [0x0A71]={
+ category="mn",
+ description="GURMUKHI ADDAK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A71,
+ },
+ [0x0A72]={
+ category="lo",
+ description="GURMUKHI IRI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A72,
+ },
+ [0x0A73]={
+ category="lo",
+ description="GURMUKHI URA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A73,
+ },
+ [0x0A74]={
+ category="lo",
+ description="GURMUKHI EK ONKAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A74,
+ },
+ [0x0A81]={
+ category="mn",
+ description="GUJARATI SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A81,
+ },
+ [0x0A82]={
+ category="mn",
+ description="GUJARATI SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0A82,
+ },
+ [0x0A83]={
+ category="mc",
+ description="GUJARATI SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0A83,
+ },
+ [0x0A85]={
+ category="lo",
+ description="GUJARATI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A85,
+ },
+ [0x0A86]={
+ category="lo",
+ description="GUJARATI LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A86,
+ },
+ [0x0A87]={
+ category="lo",
+ description="GUJARATI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A87,
+ },
+ [0x0A88]={
+ category="lo",
+ description="GUJARATI LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A88,
+ },
+ [0x0A89]={
+ category="lo",
+ description="GUJARATI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A89,
+ },
+ [0x0A8A]={
+ category="lo",
+ description="GUJARATI LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A8A,
+ },
+ [0x0A8B]={
+ category="lo",
+ description="GUJARATI LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A8B,
+ },
+ [0x0A8C]={
+ category="lo",
+ description="GUJARATI LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A8C,
+ },
+ [0x0A8D]={
+ category="lo",
+ description="GUJARATI VOWEL CANDRA E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A8D,
+ },
+ [0x0A8F]={
+ category="lo",
+ description="GUJARATI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A8F,
+ },
+ [0x0A90]={
+ category="lo",
+ description="GUJARATI LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A90,
+ },
+ [0x0A91]={
+ category="lo",
+ description="GUJARATI VOWEL CANDRA O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A91,
+ },
+ [0x0A93]={
+ category="lo",
+ description="GUJARATI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A93,
+ },
+ [0x0A94]={
+ category="lo",
+ description="GUJARATI LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A94,
+ },
+ [0x0A95]={
+ category="lo",
+ description="GUJARATI LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A95,
+ },
+ [0x0A96]={
+ category="lo",
+ description="GUJARATI LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A96,
+ },
+ [0x0A97]={
+ category="lo",
+ description="GUJARATI LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A97,
+ },
+ [0x0A98]={
+ category="lo",
+ description="GUJARATI LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A98,
+ },
+ [0x0A99]={
+ category="lo",
+ description="GUJARATI LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A99,
+ },
+ [0x0A9A]={
+ category="lo",
+ description="GUJARATI LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A9A,
+ },
+ [0x0A9B]={
+ category="lo",
+ description="GUJARATI LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A9B,
+ },
+ [0x0A9C]={
+ category="lo",
+ description="GUJARATI LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A9C,
+ },
+ [0x0A9D]={
+ category="lo",
+ description="GUJARATI LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A9D,
+ },
+ [0x0A9E]={
+ category="lo",
+ description="GUJARATI LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A9E,
+ },
+ [0x0A9F]={
+ category="lo",
+ description="GUJARATI LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0A9F,
+ },
+ [0x0AA0]={
+ category="lo",
+ description="GUJARATI LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA0,
+ },
+ [0x0AA1]={
+ category="lo",
+ description="GUJARATI LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA1,
+ },
+ [0x0AA2]={
+ category="lo",
+ description="GUJARATI LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA2,
+ },
+ [0x0AA3]={
+ category="lo",
+ description="GUJARATI LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA3,
+ },
+ [0x0AA4]={
+ category="lo",
+ description="GUJARATI LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA4,
+ },
+ [0x0AA5]={
+ category="lo",
+ description="GUJARATI LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA5,
+ },
+ [0x0AA6]={
+ category="lo",
+ description="GUJARATI LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA6,
+ },
+ [0x0AA7]={
+ category="lo",
+ description="GUJARATI LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA7,
+ },
+ [0x0AA8]={
+ category="lo",
+ description="GUJARATI LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AA8,
+ },
+ [0x0AAA]={
+ category="lo",
+ description="GUJARATI LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AAA,
+ },
+ [0x0AAB]={
+ category="lo",
+ description="GUJARATI LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AAB,
+ },
+ [0x0AAC]={
+ category="lo",
+ description="GUJARATI LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AAC,
+ },
+ [0x0AAD]={
+ category="lo",
+ description="GUJARATI LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AAD,
+ },
+ [0x0AAE]={
+ category="lo",
+ description="GUJARATI LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AAE,
+ },
+ [0x0AAF]={
+ category="lo",
+ description="GUJARATI LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AAF,
+ },
+ [0x0AB0]={
+ category="lo",
+ description="GUJARATI LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB0,
+ },
+ [0x0AB2]={
+ category="lo",
+ description="GUJARATI LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB2,
+ },
+ [0x0AB3]={
+ category="lo",
+ description="GUJARATI LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB3,
+ },
+ [0x0AB5]={
+ category="lo",
+ description="GUJARATI LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB5,
+ },
+ [0x0AB6]={
+ category="lo",
+ description="GUJARATI LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB6,
+ },
+ [0x0AB7]={
+ category="lo",
+ description="GUJARATI LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB7,
+ },
+ [0x0AB8]={
+ category="lo",
+ description="GUJARATI LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB8,
+ },
+ [0x0AB9]={
+ category="lo",
+ description="GUJARATI LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AB9,
+ },
+ [0x0ABC]={
+ category="mn",
+ description="GUJARATI SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0ABC,
+ },
+ [0x0ABD]={
+ category="lo",
+ description="GUJARATI SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0ABD,
+ },
+ [0x0ABE]={
+ category="mc",
+ description="GUJARATI VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0ABE,
+ },
+ [0x0ABF]={
+ category="mc",
+ description="GUJARATI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0ABF,
+ },
+ [0x0AC0]={
+ category="mc",
+ description="GUJARATI VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0AC0,
+ },
+ [0x0AC1]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AC1,
+ },
+ [0x0AC2]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AC2,
+ },
+ [0x0AC3]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AC3,
+ },
+ [0x0AC4]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AC4,
+ },
+ [0x0AC5]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN CANDRA E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AC5,
+ },
+ [0x0AC7]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AC7,
+ },
+ [0x0AC8]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AC8,
+ },
+ [0x0AC9]={
+ category="mc",
+ description="GUJARATI VOWEL SIGN CANDRA O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0AC9,
+ },
+ [0x0ACB]={
+ category="mc",
+ description="GUJARATI VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0ACB,
+ },
+ [0x0ACC]={
+ category="mc",
+ description="GUJARATI VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0ACC,
+ },
+ [0x0ACD]={
+ category="mn",
+ description="GUJARATI SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0ACD,
+ },
+ [0x0AD0]={
+ category="lo",
+ description="GUJARATI OM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AD0,
+ },
+ [0x0AE0]={
+ category="lo",
+ description="GUJARATI LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AE0,
+ },
+ [0x0AE1]={
+ category="lo",
+ description="GUJARATI LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0AE1,
+ },
+ [0x0AE2]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AE2,
+ },
+ [0x0AE3]={
+ category="mn",
+ description="GUJARATI VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0AE3,
+ },
+ [0x0AE6]={
+ category="nd",
+ description="GUJARATI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AE6,
+ },
+ [0x0AE7]={
+ category="nd",
+ description="GUJARATI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AE7,
+ },
+ [0x0AE8]={
+ category="nd",
+ description="GUJARATI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AE8,
+ },
+ [0x0AE9]={
+ category="nd",
+ description="GUJARATI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AE9,
+ },
+ [0x0AEA]={
+ category="nd",
+ description="GUJARATI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AEA,
+ },
+ [0x0AEB]={
+ category="nd",
+ description="GUJARATI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AEB,
+ },
+ [0x0AEC]={
+ category="nd",
+ description="GUJARATI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AEC,
+ },
+ [0x0AED]={
+ category="nd",
+ description="GUJARATI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AED,
+ },
+ [0x0AEE]={
+ category="nd",
+ description="GUJARATI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AEE,
+ },
+ [0x0AEF]={
+ category="nd",
+ description="GUJARATI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0AEF,
+ },
+ [0x0AF1]={
+ category="sc",
+ description="GUJARATI RUPEE SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x0AF1,
+ },
+ [0x0B01]={
+ category="mn",
+ description="ORIYA SIGN CANDRABINDU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B01,
+ },
+ [0x0B02]={
+ category="mc",
+ description="ORIYA SIGN ANUSVARA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0B02,
+ },
+ [0x0B03]={
+ category="mc",
+ description="ORIYA SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0B03,
+ },
+ [0x0B05]={
+ category="lo",
+ description="ORIYA LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B05,
+ },
+ [0x0B06]={
+ category="lo",
+ description="ORIYA LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B06,
+ },
+ [0x0B07]={
+ category="lo",
+ description="ORIYA LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B07,
+ },
+ [0x0B08]={
+ category="lo",
+ description="ORIYA LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B08,
+ },
+ [0x0B09]={
+ category="lo",
+ description="ORIYA LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B09,
+ },
+ [0x0B0A]={
+ category="lo",
+ description="ORIYA LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B0A,
+ },
+ [0x0B0B]={
+ category="lo",
+ description="ORIYA LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B0B,
+ },
+ [0x0B0C]={
+ category="lo",
+ description="ORIYA LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B0C,
+ },
+ [0x0B0F]={
+ category="lo",
+ description="ORIYA LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B0F,
+ },
+ [0x0B10]={
+ category="lo",
+ description="ORIYA LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B10,
+ },
+ [0x0B13]={
+ category="lo",
+ description="ORIYA LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B13,
+ },
+ [0x0B14]={
+ category="lo",
+ description="ORIYA LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B14,
+ },
+ [0x0B15]={
+ category="lo",
+ description="ORIYA LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B15,
+ },
+ [0x0B16]={
+ category="lo",
+ description="ORIYA LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B16,
+ },
+ [0x0B17]={
+ category="lo",
+ description="ORIYA LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B17,
+ },
+ [0x0B18]={
+ category="lo",
+ description="ORIYA LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B18,
+ },
+ [0x0B19]={
+ category="lo",
+ description="ORIYA LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B19,
+ },
+ [0x0B1A]={
+ category="lo",
+ description="ORIYA LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B1A,
+ },
+ [0x0B1B]={
+ category="lo",
+ description="ORIYA LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B1B,
+ },
+ [0x0B1C]={
+ category="lo",
+ description="ORIYA LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B1C,
+ },
+ [0x0B1D]={
+ category="lo",
+ description="ORIYA LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B1D,
+ },
+ [0x0B1E]={
+ category="lo",
+ description="ORIYA LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B1E,
+ },
+ [0x0B1F]={
+ category="lo",
+ description="ORIYA LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B1F,
+ },
+ [0x0B20]={
+ category="lo",
+ description="ORIYA LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B20,
+ },
+ [0x0B21]={
+ category="lo",
+ description="ORIYA LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B21,
+ },
+ [0x0B22]={
+ category="lo",
+ description="ORIYA LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B22,
+ },
+ [0x0B23]={
+ category="lo",
+ description="ORIYA LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B23,
+ },
+ [0x0B24]={
+ category="lo",
+ description="ORIYA LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B24,
+ },
+ [0x0B25]={
+ category="lo",
+ description="ORIYA LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B25,
+ },
+ [0x0B26]={
+ category="lo",
+ description="ORIYA LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B26,
+ },
+ [0x0B27]={
+ category="lo",
+ description="ORIYA LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B27,
+ },
+ [0x0B28]={
+ category="lo",
+ description="ORIYA LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B28,
+ },
+ [0x0B2A]={
+ category="lo",
+ description="ORIYA LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B2A,
+ },
+ [0x0B2B]={
+ category="lo",
+ description="ORIYA LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B2B,
+ },
+ [0x0B2C]={
+ category="lo",
+ description="ORIYA LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B2C,
+ },
+ [0x0B2D]={
+ category="lo",
+ description="ORIYA LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B2D,
+ },
+ [0x0B2E]={
+ category="lo",
+ description="ORIYA LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B2E,
+ },
+ [0x0B2F]={
+ category="lo",
+ description="ORIYA LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B2F,
+ },
+ [0x0B30]={
+ category="lo",
+ description="ORIYA LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B30,
+ },
+ [0x0B32]={
+ category="lo",
+ description="ORIYA LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B32,
+ },
+ [0x0B33]={
+ category="lo",
+ description="ORIYA LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B33,
+ },
+ [0x0B35]={
+ category="lo",
+ description="ORIYA LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B35,
+ },
+ [0x0B36]={
+ category="lo",
+ description="ORIYA LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B36,
+ },
+ [0x0B37]={
+ category="lo",
+ description="ORIYA LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B37,
+ },
+ [0x0B38]={
+ category="lo",
+ description="ORIYA LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B38,
+ },
+ [0x0B39]={
+ category="lo",
+ description="ORIYA LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B39,
+ },
+ [0x0B3C]={
+ category="mn",
+ description="ORIYA SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B3C,
+ },
+ [0x0B3D]={
+ category="lo",
+ description="ORIYA SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B3D,
+ },
+ [0x0B3E]={
+ category="mc",
+ description="ORIYA VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0B3E,
+ },
+ [0x0B3F]={
+ category="mn",
+ description="ORIYA VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B3F,
+ },
+ [0x0B40]={
+ category="mc",
+ description="ORIYA VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0B40,
+ },
+ [0x0B41]={
+ category="mn",
+ description="ORIYA VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B41,
+ },
+ [0x0B42]={
+ category="mn",
+ description="ORIYA VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B42,
+ },
+ [0x0B43]={
+ category="mn",
+ description="ORIYA VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B43,
+ },
+ [0x0B47]={
+ category="mc",
+ description="ORIYA VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0B47,
+ },
+ [0x0B48]={
+ category="mc",
+ description="ORIYA VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0B47, 0x0B56 },
+ unicodeslot=0x0B48,
+ },
+ [0x0B4B]={
+ category="mc",
+ description="ORIYA VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0B47, 0x0B3E },
+ unicodeslot=0x0B4B,
+ },
+ [0x0B4C]={
+ category="mc",
+ description="ORIYA VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0B47, 0x0B57 },
+ unicodeslot=0x0B4C,
+ },
+ [0x0B4D]={
+ category="mn",
+ description="ORIYA SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B4D,
+ },
+ [0x0B56]={
+ category="mn",
+ description="ORIYA AI LENGTH MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B56,
+ },
+ [0x0B57]={
+ category="mc",
+ description="ORIYA AU LENGTH MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0B57,
+ },
+ [0x0B5C]={
+ category="lo",
+ description="ORIYA LETTER RRA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0B21, 0x0B3C },
+ unicodeslot=0x0B5C,
+ },
+ [0x0B5D]={
+ category="lo",
+ description="ORIYA LETTER RHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0B22, 0x0B3C },
+ unicodeslot=0x0B5D,
+ },
+ [0x0B5F]={
+ category="lo",
+ description="ORIYA LETTER YYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B5F,
+ },
+ [0x0B60]={
+ category="lo",
+ description="ORIYA LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B60,
+ },
+ [0x0B61]={
+ category="lo",
+ description="ORIYA LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B61,
+ },
+ [0x0B66]={
+ category="nd",
+ description="ORIYA DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B66,
+ },
+ [0x0B67]={
+ category="nd",
+ description="ORIYA DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B67,
+ },
+ [0x0B68]={
+ category="nd",
+ description="ORIYA DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B68,
+ },
+ [0x0B69]={
+ category="nd",
+ description="ORIYA DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B69,
+ },
+ [0x0B6A]={
+ category="nd",
+ description="ORIYA DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B6A,
+ },
+ [0x0B6B]={
+ category="nd",
+ description="ORIYA DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B6B,
+ },
+ [0x0B6C]={
+ category="nd",
+ description="ORIYA DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B6C,
+ },
+ [0x0B6D]={
+ category="nd",
+ description="ORIYA DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B6D,
+ },
+ [0x0B6E]={
+ category="nd",
+ description="ORIYA DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B6E,
+ },
+ [0x0B6F]={
+ category="nd",
+ description="ORIYA DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0B6F,
+ },
+ [0x0B70]={
+ category="so",
+ description="ORIYA ISSHAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B70,
+ },
+ [0x0B71]={
+ category="lo",
+ description="ORIYA LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B71,
+ },
+ [0x0B82]={
+ category="mn",
+ description="TAMIL SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0B82,
+ },
+ [0x0B83]={
+ category="lo",
+ description="TAMIL SIGN VISARGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B83,
+ },
+ [0x0B85]={
+ category="lo",
+ description="TAMIL LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B85,
+ },
+ [0x0B86]={
+ category="lo",
+ description="TAMIL LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B86,
+ },
+ [0x0B87]={
+ category="lo",
+ description="TAMIL LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B87,
+ },
+ [0x0B88]={
+ category="lo",
+ description="TAMIL LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B88,
+ },
+ [0x0B89]={
+ category="lo",
+ description="TAMIL LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B89,
+ },
+ [0x0B8A]={
+ category="lo",
+ description="TAMIL LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B8A,
+ },
+ [0x0B8E]={
+ category="lo",
+ description="TAMIL LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B8E,
+ },
+ [0x0B8F]={
+ category="lo",
+ description="TAMIL LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B8F,
+ },
+ [0x0B90]={
+ category="lo",
+ description="TAMIL LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B90,
+ },
+ [0x0B92]={
+ category="lo",
+ description="TAMIL LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B92,
+ },
+ [0x0B93]={
+ category="lo",
+ description="TAMIL LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B93,
+ },
+ [0x0B94]={
+ category="lo",
+ description="TAMIL LETTER AU",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0B92, 0x0BD7 },
+ unicodeslot=0x0B94,
+ },
+ [0x0B95]={
+ category="lo",
+ description="TAMIL LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B95,
+ },
+ [0x0B99]={
+ category="lo",
+ description="TAMIL LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B99,
+ },
+ [0x0B9A]={
+ category="lo",
+ description="TAMIL LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B9A,
+ },
+ [0x0B9C]={
+ category="lo",
+ description="TAMIL LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B9C,
+ },
+ [0x0B9E]={
+ category="lo",
+ description="TAMIL LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B9E,
+ },
+ [0x0B9F]={
+ category="lo",
+ description="TAMIL LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0B9F,
+ },
+ [0x0BA3]={
+ category="lo",
+ description="TAMIL LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BA3,
+ },
+ [0x0BA4]={
+ category="lo",
+ description="TAMIL LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BA4,
+ },
+ [0x0BA8]={
+ category="lo",
+ description="TAMIL LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BA8,
+ },
+ [0x0BA9]={
+ category="lo",
+ description="TAMIL LETTER NNNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BA9,
+ },
+ [0x0BAA]={
+ category="lo",
+ description="TAMIL LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BAA,
+ },
+ [0x0BAE]={
+ category="lo",
+ description="TAMIL LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BAE,
+ },
+ [0x0BAF]={
+ category="lo",
+ description="TAMIL LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BAF,
+ },
+ [0x0BB0]={
+ category="lo",
+ description="TAMIL LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB0,
+ },
+ [0x0BB1]={
+ category="lo",
+ description="TAMIL LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB1,
+ },
+ [0x0BB2]={
+ category="lo",
+ description="TAMIL LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB2,
+ },
+ [0x0BB3]={
+ category="lo",
+ description="TAMIL LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB3,
+ },
+ [0x0BB4]={
+ category="lo",
+ description="TAMIL LETTER LLLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB4,
+ },
+ [0x0BB5]={
+ category="lo",
+ description="TAMIL LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB5,
+ },
+ [0x0BB6]={
+ category="lo",
+ description="TAMIL LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB6,
+ },
+ [0x0BB7]={
+ category="lo",
+ description="TAMIL LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB7,
+ },
+ [0x0BB8]={
+ category="lo",
+ description="TAMIL LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB8,
+ },
+ [0x0BB9]={
+ category="lo",
+ description="TAMIL LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BB9,
+ },
+ [0x0BBE]={
+ category="mc",
+ description="TAMIL VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BBE,
+ },
+ [0x0BBF]={
+ category="mc",
+ description="TAMIL VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BBF,
+ },
+ [0x0BC0]={
+ category="mn",
+ description="TAMIL VOWEL SIGN II",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0BC0,
+ },
+ [0x0BC1]={
+ category="mc",
+ description="TAMIL VOWEL SIGN U",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BC1,
+ },
+ [0x0BC2]={
+ category="mc",
+ description="TAMIL VOWEL SIGN UU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BC2,
+ },
+ [0x0BC6]={
+ category="mc",
+ description="TAMIL VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BC6,
+ },
+ [0x0BC7]={
+ category="mc",
+ description="TAMIL VOWEL SIGN EE",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BC7,
+ },
+ [0x0BC8]={
+ category="mc",
+ description="TAMIL VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BC8,
+ },
+ [0x0BCA]={
+ category="mc",
+ description="TAMIL VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0BC6, 0x0BBE },
+ unicodeslot=0x0BCA,
+ },
+ [0x0BCB]={
+ category="mc",
+ description="TAMIL VOWEL SIGN OO",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0BC7, 0x0BBE },
+ unicodeslot=0x0BCB,
+ },
+ [0x0BCC]={
+ category="mc",
+ description="TAMIL VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0BC6, 0x0BD7 },
+ unicodeslot=0x0BCC,
+ },
+ [0x0BCD]={
+ category="mn",
+ description="TAMIL SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0BCD,
+ },
+ [0x0BD7]={
+ category="mc",
+ description="TAMIL AU LENGTH MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0BD7,
+ },
+ [0x0BE6]={
+ category="nd",
+ description="TAMIL DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BE6,
+ },
+ [0x0BE7]={
+ category="nd",
+ description="TAMIL DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BE7,
+ },
+ [0x0BE8]={
+ category="nd",
+ description="TAMIL DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BE8,
+ },
+ [0x0BE9]={
+ category="nd",
+ description="TAMIL DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BE9,
+ },
+ [0x0BEA]={
+ category="nd",
+ description="TAMIL DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BEA,
+ },
+ [0x0BEB]={
+ category="nd",
+ description="TAMIL DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BEB,
+ },
+ [0x0BEC]={
+ category="nd",
+ description="TAMIL DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BEC,
+ },
+ [0x0BED]={
+ category="nd",
+ description="TAMIL DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BED,
+ },
+ [0x0BEE]={
+ category="nd",
+ description="TAMIL DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BEE,
+ },
+ [0x0BEF]={
+ category="nd",
+ description="TAMIL DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0BEF,
+ },
+ [0x0BF0]={
+ category="no",
+ description="TAMIL NUMBER TEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BF0,
+ },
+ [0x0BF1]={
+ category="no",
+ description="TAMIL NUMBER ONE HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BF1,
+ },
+ [0x0BF2]={
+ category="no",
+ description="TAMIL NUMBER ONE THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0BF2,
+ },
+ [0x0BF3]={
+ category="so",
+ description="TAMIL DAY SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0BF3,
+ },
+ [0x0BF4]={
+ category="so",
+ description="TAMIL MONTH SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0BF4,
+ },
+ [0x0BF5]={
+ category="so",
+ description="TAMIL YEAR SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0BF5,
+ },
+ [0x0BF6]={
+ category="so",
+ description="TAMIL DEBIT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0BF6,
+ },
+ [0x0BF7]={
+ category="so",
+ description="TAMIL CREDIT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0BF7,
+ },
+ [0x0BF8]={
+ category="so",
+ description="TAMIL AS ABOVE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0BF8,
+ },
+ [0x0BF9]={
+ category="sc",
+ description="TAMIL RUPEE SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x0BF9,
+ },
+ [0x0BFA]={
+ category="so",
+ description="TAMIL NUMBER SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0BFA,
+ },
+ [0x0C01]={
+ category="mc",
+ description="TELUGU SIGN CANDRABINDU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C01,
+ },
+ [0x0C02]={
+ category="mc",
+ description="TELUGU SIGN ANUSVARA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C02,
+ },
+ [0x0C03]={
+ category="mc",
+ description="TELUGU SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C03,
+ },
+ [0x0C05]={
+ category="lo",
+ description="TELUGU LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C05,
+ },
+ [0x0C06]={
+ category="lo",
+ description="TELUGU LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C06,
+ },
+ [0x0C07]={
+ category="lo",
+ description="TELUGU LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C07,
+ },
+ [0x0C08]={
+ category="lo",
+ description="TELUGU LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C08,
+ },
+ [0x0C09]={
+ category="lo",
+ description="TELUGU LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C09,
+ },
+ [0x0C0A]={
+ category="lo",
+ description="TELUGU LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C0A,
+ },
+ [0x0C0B]={
+ category="lo",
+ description="TELUGU LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C0B,
+ },
+ [0x0C0C]={
+ category="lo",
+ description="TELUGU LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C0C,
+ },
+ [0x0C0E]={
+ category="lo",
+ description="TELUGU LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C0E,
+ },
+ [0x0C0F]={
+ category="lo",
+ description="TELUGU LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C0F,
+ },
+ [0x0C10]={
+ category="lo",
+ description="TELUGU LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C10,
+ },
+ [0x0C12]={
+ category="lo",
+ description="TELUGU LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C12,
+ },
+ [0x0C13]={
+ category="lo",
+ description="TELUGU LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C13,
+ },
+ [0x0C14]={
+ category="lo",
+ description="TELUGU LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C14,
+ },
+ [0x0C15]={
+ category="lo",
+ description="TELUGU LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C15,
+ },
+ [0x0C16]={
+ category="lo",
+ description="TELUGU LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C16,
+ },
+ [0x0C17]={
+ category="lo",
+ description="TELUGU LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C17,
+ },
+ [0x0C18]={
+ category="lo",
+ description="TELUGU LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C18,
+ },
+ [0x0C19]={
+ category="lo",
+ description="TELUGU LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C19,
+ },
+ [0x0C1A]={
+ category="lo",
+ description="TELUGU LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C1A,
+ },
+ [0x0C1B]={
+ category="lo",
+ description="TELUGU LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C1B,
+ },
+ [0x0C1C]={
+ category="lo",
+ description="TELUGU LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C1C,
+ },
+ [0x0C1D]={
+ category="lo",
+ description="TELUGU LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C1D,
+ },
+ [0x0C1E]={
+ category="lo",
+ description="TELUGU LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C1E,
+ },
+ [0x0C1F]={
+ category="lo",
+ description="TELUGU LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C1F,
+ },
+ [0x0C20]={
+ category="lo",
+ description="TELUGU LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C20,
+ },
+ [0x0C21]={
+ category="lo",
+ description="TELUGU LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C21,
+ },
+ [0x0C22]={
+ category="lo",
+ description="TELUGU LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C22,
+ },
+ [0x0C23]={
+ category="lo",
+ description="TELUGU LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C23,
+ },
+ [0x0C24]={
+ category="lo",
+ description="TELUGU LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C24,
+ },
+ [0x0C25]={
+ category="lo",
+ description="TELUGU LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C25,
+ },
+ [0x0C26]={
+ category="lo",
+ description="TELUGU LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C26,
+ },
+ [0x0C27]={
+ category="lo",
+ description="TELUGU LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C27,
+ },
+ [0x0C28]={
+ category="lo",
+ description="TELUGU LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C28,
+ },
+ [0x0C2A]={
+ category="lo",
+ description="TELUGU LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C2A,
+ },
+ [0x0C2B]={
+ category="lo",
+ description="TELUGU LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C2B,
+ },
+ [0x0C2C]={
+ category="lo",
+ description="TELUGU LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C2C,
+ },
+ [0x0C2D]={
+ category="lo",
+ description="TELUGU LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C2D,
+ },
+ [0x0C2E]={
+ category="lo",
+ description="TELUGU LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C2E,
+ },
+ [0x0C2F]={
+ category="lo",
+ description="TELUGU LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C2F,
+ },
+ [0x0C30]={
+ category="lo",
+ description="TELUGU LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C30,
+ },
+ [0x0C31]={
+ category="lo",
+ description="TELUGU LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C31,
+ },
+ [0x0C32]={
+ category="lo",
+ description="TELUGU LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C32,
+ },
+ [0x0C33]={
+ category="lo",
+ description="TELUGU LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C33,
+ },
+ [0x0C35]={
+ category="lo",
+ description="TELUGU LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C35,
+ },
+ [0x0C36]={
+ category="lo",
+ description="TELUGU LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C36,
+ },
+ [0x0C37]={
+ category="lo",
+ description="TELUGU LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C37,
+ },
+ [0x0C38]={
+ category="lo",
+ description="TELUGU LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C38,
+ },
+ [0x0C39]={
+ category="lo",
+ description="TELUGU LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C39,
+ },
+ [0x0C3E]={
+ category="mn",
+ description="TELUGU VOWEL SIGN AA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C3E,
+ },
+ [0x0C3F]={
+ category="mn",
+ description="TELUGU VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C3F,
+ },
+ [0x0C40]={
+ category="mn",
+ description="TELUGU VOWEL SIGN II",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C40,
+ },
+ [0x0C41]={
+ category="mc",
+ description="TELUGU VOWEL SIGN U",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C41,
+ },
+ [0x0C42]={
+ category="mc",
+ description="TELUGU VOWEL SIGN UU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C42,
+ },
+ [0x0C43]={
+ category="mc",
+ description="TELUGU VOWEL SIGN VOCALIC R",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C43,
+ },
+ [0x0C44]={
+ category="mc",
+ description="TELUGU VOWEL SIGN VOCALIC RR",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C44,
+ },
+ [0x0C46]={
+ category="mn",
+ description="TELUGU VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C46,
+ },
+ [0x0C47]={
+ category="mn",
+ description="TELUGU VOWEL SIGN EE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C47,
+ },
+ [0x0C48]={
+ category="mn",
+ description="TELUGU VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0C46, 0x0C56 },
+ unicodeslot=0x0C48,
+ },
+ [0x0C4A]={
+ category="mn",
+ description="TELUGU VOWEL SIGN O",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C4A,
+ },
+ [0x0C4B]={
+ category="mn",
+ description="TELUGU VOWEL SIGN OO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C4B,
+ },
+ [0x0C4C]={
+ category="mn",
+ description="TELUGU VOWEL SIGN AU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C4C,
+ },
+ [0x0C4D]={
+ category="mn",
+ description="TELUGU SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C4D,
+ },
+ [0x0C55]={
+ category="mn",
+ description="TELUGU LENGTH MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C55,
+ },
+ [0x0C56]={
+ category="mn",
+ description="TELUGU AI LENGTH MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0C56,
+ },
+ [0x0C60]={
+ category="lo",
+ description="TELUGU LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C60,
+ },
+ [0x0C61]={
+ category="lo",
+ description="TELUGU LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C61,
+ },
+ [0x0C66]={
+ category="nd",
+ description="TELUGU DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C66,
+ },
+ [0x0C67]={
+ category="nd",
+ description="TELUGU DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C67,
+ },
+ [0x0C68]={
+ category="nd",
+ description="TELUGU DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C68,
+ },
+ [0x0C69]={
+ category="nd",
+ description="TELUGU DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C69,
+ },
+ [0x0C6A]={
+ category="nd",
+ description="TELUGU DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C6A,
+ },
+ [0x0C6B]={
+ category="nd",
+ description="TELUGU DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C6B,
+ },
+ [0x0C6C]={
+ category="nd",
+ description="TELUGU DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C6C,
+ },
+ [0x0C6D]={
+ category="nd",
+ description="TELUGU DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C6D,
+ },
+ [0x0C6E]={
+ category="nd",
+ description="TELUGU DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C6E,
+ },
+ [0x0C6F]={
+ category="nd",
+ description="TELUGU DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0C6F,
+ },
+ [0x0C82]={
+ category="mc",
+ description="KANNADA SIGN ANUSVARA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C82,
+ },
+ [0x0C83]={
+ category="mc",
+ description="KANNADA SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0C83,
+ },
+ [0x0C85]={
+ category="lo",
+ description="KANNADA LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C85,
+ },
+ [0x0C86]={
+ category="lo",
+ description="KANNADA LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C86,
+ },
+ [0x0C87]={
+ category="lo",
+ description="KANNADA LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C87,
+ },
+ [0x0C88]={
+ category="lo",
+ description="KANNADA LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C88,
+ },
+ [0x0C89]={
+ category="lo",
+ description="KANNADA LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C89,
+ },
+ [0x0C8A]={
+ category="lo",
+ description="KANNADA LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C8A,
+ },
+ [0x0C8B]={
+ category="lo",
+ description="KANNADA LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C8B,
+ },
+ [0x0C8C]={
+ category="lo",
+ description="KANNADA LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C8C,
+ },
+ [0x0C8E]={
+ category="lo",
+ description="KANNADA LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C8E,
+ },
+ [0x0C8F]={
+ category="lo",
+ description="KANNADA LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C8F,
+ },
+ [0x0C90]={
+ category="lo",
+ description="KANNADA LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C90,
+ },
+ [0x0C92]={
+ category="lo",
+ description="KANNADA LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C92,
+ },
+ [0x0C93]={
+ category="lo",
+ description="KANNADA LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C93,
+ },
+ [0x0C94]={
+ category="lo",
+ description="KANNADA LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C94,
+ },
+ [0x0C95]={
+ category="lo",
+ description="KANNADA LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C95,
+ },
+ [0x0C96]={
+ category="lo",
+ description="KANNADA LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C96,
+ },
+ [0x0C97]={
+ category="lo",
+ description="KANNADA LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C97,
+ },
+ [0x0C98]={
+ category="lo",
+ description="KANNADA LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C98,
+ },
+ [0x0C99]={
+ category="lo",
+ description="KANNADA LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C99,
+ },
+ [0x0C9A]={
+ category="lo",
+ description="KANNADA LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C9A,
+ },
+ [0x0C9B]={
+ category="lo",
+ description="KANNADA LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C9B,
+ },
+ [0x0C9C]={
+ category="lo",
+ description="KANNADA LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C9C,
+ },
+ [0x0C9D]={
+ category="lo",
+ description="KANNADA LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C9D,
+ },
+ [0x0C9E]={
+ category="lo",
+ description="KANNADA LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C9E,
+ },
+ [0x0C9F]={
+ category="lo",
+ description="KANNADA LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0C9F,
+ },
+ [0x0CA0]={
+ category="lo",
+ description="KANNADA LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA0,
+ },
+ [0x0CA1]={
+ category="lo",
+ description="KANNADA LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA1,
+ },
+ [0x0CA2]={
+ category="lo",
+ description="KANNADA LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA2,
+ },
+ [0x0CA3]={
+ category="lo",
+ description="KANNADA LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA3,
+ },
+ [0x0CA4]={
+ category="lo",
+ description="KANNADA LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA4,
+ },
+ [0x0CA5]={
+ category="lo",
+ description="KANNADA LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA5,
+ },
+ [0x0CA6]={
+ category="lo",
+ description="KANNADA LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA6,
+ },
+ [0x0CA7]={
+ category="lo",
+ description="KANNADA LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA7,
+ },
+ [0x0CA8]={
+ category="lo",
+ description="KANNADA LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CA8,
+ },
+ [0x0CAA]={
+ category="lo",
+ description="KANNADA LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CAA,
+ },
+ [0x0CAB]={
+ category="lo",
+ description="KANNADA LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CAB,
+ },
+ [0x0CAC]={
+ category="lo",
+ description="KANNADA LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CAC,
+ },
+ [0x0CAD]={
+ category="lo",
+ description="KANNADA LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CAD,
+ },
+ [0x0CAE]={
+ category="lo",
+ description="KANNADA LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CAE,
+ },
+ [0x0CAF]={
+ category="lo",
+ description="KANNADA LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CAF,
+ },
+ [0x0CB0]={
+ category="lo",
+ description="KANNADA LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB0,
+ },
+ [0x0CB1]={
+ category="lo",
+ description="KANNADA LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB1,
+ },
+ [0x0CB2]={
+ category="lo",
+ description="KANNADA LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB2,
+ },
+ [0x0CB3]={
+ category="lo",
+ description="KANNADA LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB3,
+ },
+ [0x0CB5]={
+ category="lo",
+ description="KANNADA LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB5,
+ },
+ [0x0CB6]={
+ category="lo",
+ description="KANNADA LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB6,
+ },
+ [0x0CB7]={
+ category="lo",
+ description="KANNADA LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB7,
+ },
+ [0x0CB8]={
+ category="lo",
+ description="KANNADA LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB8,
+ },
+ [0x0CB9]={
+ category="lo",
+ description="KANNADA LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CB9,
+ },
+ [0x0CBC]={
+ category="mn",
+ description="KANNADA SIGN NUKTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0CBC,
+ },
+ [0x0CBD]={
+ category="lo",
+ description="KANNADA SIGN AVAGRAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CBD,
+ },
+ [0x0CBE]={
+ category="mc",
+ description="KANNADA VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CBE,
+ },
+ [0x0CBF]={
+ category="mn",
+ description="KANNADA VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CBF,
+ },
+ [0x0CC0]={
+ category="mc",
+ description="KANNADA VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0CBF, 0x0CD5 },
+ unicodeslot=0x0CC0,
+ },
+ [0x0CC1]={
+ category="mc",
+ description="KANNADA VOWEL SIGN U",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CC1,
+ },
+ [0x0CC2]={
+ category="mc",
+ description="KANNADA VOWEL SIGN UU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CC2,
+ },
+ [0x0CC3]={
+ category="mc",
+ description="KANNADA VOWEL SIGN VOCALIC R",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CC3,
+ },
+ [0x0CC4]={
+ category="mc",
+ description="KANNADA VOWEL SIGN VOCALIC RR",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CC4,
+ },
+ [0x0CC6]={
+ category="mn",
+ description="KANNADA VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CC6,
+ },
+ [0x0CC7]={
+ category="mc",
+ description="KANNADA VOWEL SIGN EE",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0CC6, 0x0CD5 },
+ unicodeslot=0x0CC7,
+ },
+ [0x0CC8]={
+ category="mc",
+ description="KANNADA VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0CC6, 0x0CD6 },
+ unicodeslot=0x0CC8,
+ },
+ [0x0CCA]={
+ category="mc",
+ description="KANNADA VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0CC6, 0x0CC2 },
+ unicodeslot=0x0CCA,
+ },
+ [0x0CCB]={
+ category="mc",
+ description="KANNADA VOWEL SIGN OO",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0CCA, 0x0CD5 },
+ unicodeslot=0x0CCB,
+ },
+ [0x0CCC]={
+ category="mn",
+ description="KANNADA VOWEL SIGN AU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0CCC,
+ },
+ [0x0CCD]={
+ category="mn",
+ description="KANNADA SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0CCD,
+ },
+ [0x0CD5]={
+ category="mc",
+ description="KANNADA LENGTH MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CD5,
+ },
+ [0x0CD6]={
+ category="mc",
+ description="KANNADA AI LENGTH MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0CD6,
+ },
+ [0x0CDE]={
+ category="lo",
+ description="KANNADA LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CDE,
+ },
+ [0x0CE0]={
+ category="lo",
+ description="KANNADA LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CE0,
+ },
+ [0x0CE1]={
+ category="lo",
+ description="KANNADA LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0CE1,
+ },
+ [0x0CE2]={
+ category="mn",
+ description="KANNADA VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0CE2,
+ },
+ [0x0CE3]={
+ category="mn",
+ description="KANNADA VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0CE3,
+ },
+ [0x0CE6]={
+ category="nd",
+ description="KANNADA DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CE6,
+ },
+ [0x0CE7]={
+ category="nd",
+ description="KANNADA DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CE7,
+ },
+ [0x0CE8]={
+ category="nd",
+ description="KANNADA DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CE8,
+ },
+ [0x0CE9]={
+ category="nd",
+ description="KANNADA DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CE9,
+ },
+ [0x0CEA]={
+ category="nd",
+ description="KANNADA DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CEA,
+ },
+ [0x0CEB]={
+ category="nd",
+ description="KANNADA DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CEB,
+ },
+ [0x0CEC]={
+ category="nd",
+ description="KANNADA DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CEC,
+ },
+ [0x0CED]={
+ category="nd",
+ description="KANNADA DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CED,
+ },
+ [0x0CEE]={
+ category="nd",
+ description="KANNADA DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CEE,
+ },
+ [0x0CEF]={
+ category="nd",
+ description="KANNADA DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0CEF,
+ },
+ [0x0CF1]={
+ category="so",
+ description="KANNADA SIGN JIHVAMULIYA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0CF1,
+ },
+ [0x0CF2]={
+ category="so",
+ description="KANNADA SIGN UPADHMANIYA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x0CF2,
+ },
+ [0x0D02]={
+ category="mc",
+ description="MALAYALAM SIGN ANUSVARA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D02,
+ },
+ [0x0D03]={
+ category="mc",
+ description="MALAYALAM SIGN VISARGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D03,
+ },
+ [0x0D05]={
+ category="lo",
+ description="MALAYALAM LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D05,
+ },
+ [0x0D06]={
+ category="lo",
+ description="MALAYALAM LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D06,
+ },
+ [0x0D07]={
+ category="lo",
+ description="MALAYALAM LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D07,
+ },
+ [0x0D08]={
+ category="lo",
+ description="MALAYALAM LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D08,
+ },
+ [0x0D09]={
+ category="lo",
+ description="MALAYALAM LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D09,
+ },
+ [0x0D0A]={
+ category="lo",
+ description="MALAYALAM LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D0A,
+ },
+ [0x0D0B]={
+ category="lo",
+ description="MALAYALAM LETTER VOCALIC R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D0B,
+ },
+ [0x0D0C]={
+ category="lo",
+ description="MALAYALAM LETTER VOCALIC L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D0C,
+ },
+ [0x0D0E]={
+ category="lo",
+ description="MALAYALAM LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D0E,
+ },
+ [0x0D0F]={
+ category="lo",
+ description="MALAYALAM LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D0F,
+ },
+ [0x0D10]={
+ category="lo",
+ description="MALAYALAM LETTER AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D10,
+ },
+ [0x0D12]={
+ category="lo",
+ description="MALAYALAM LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D12,
+ },
+ [0x0D13]={
+ category="lo",
+ description="MALAYALAM LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D13,
+ },
+ [0x0D14]={
+ category="lo",
+ description="MALAYALAM LETTER AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D14,
+ },
+ [0x0D15]={
+ category="lo",
+ description="MALAYALAM LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D15,
+ },
+ [0x0D16]={
+ category="lo",
+ description="MALAYALAM LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D16,
+ },
+ [0x0D17]={
+ category="lo",
+ description="MALAYALAM LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D17,
+ },
+ [0x0D18]={
+ category="lo",
+ description="MALAYALAM LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D18,
+ },
+ [0x0D19]={
+ category="lo",
+ description="MALAYALAM LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D19,
+ },
+ [0x0D1A]={
+ category="lo",
+ description="MALAYALAM LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D1A,
+ },
+ [0x0D1B]={
+ category="lo",
+ description="MALAYALAM LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D1B,
+ },
+ [0x0D1C]={
+ category="lo",
+ description="MALAYALAM LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D1C,
+ },
+ [0x0D1D]={
+ category="lo",
+ description="MALAYALAM LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D1D,
+ },
+ [0x0D1E]={
+ category="lo",
+ description="MALAYALAM LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D1E,
+ },
+ [0x0D1F]={
+ category="lo",
+ description="MALAYALAM LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D1F,
+ },
+ [0x0D20]={
+ category="lo",
+ description="MALAYALAM LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D20,
+ },
+ [0x0D21]={
+ category="lo",
+ description="MALAYALAM LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D21,
+ },
+ [0x0D22]={
+ category="lo",
+ description="MALAYALAM LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D22,
+ },
+ [0x0D23]={
+ category="lo",
+ description="MALAYALAM LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D23,
+ },
+ [0x0D24]={
+ category="lo",
+ description="MALAYALAM LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D24,
+ },
+ [0x0D25]={
+ category="lo",
+ description="MALAYALAM LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D25,
+ },
+ [0x0D26]={
+ category="lo",
+ description="MALAYALAM LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D26,
+ },
+ [0x0D27]={
+ category="lo",
+ description="MALAYALAM LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D27,
+ },
+ [0x0D28]={
+ category="lo",
+ description="MALAYALAM LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D28,
+ },
+ [0x0D2A]={
+ category="lo",
+ description="MALAYALAM LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D2A,
+ },
+ [0x0D2B]={
+ category="lo",
+ description="MALAYALAM LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D2B,
+ },
+ [0x0D2C]={
+ category="lo",
+ description="MALAYALAM LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D2C,
+ },
+ [0x0D2D]={
+ category="lo",
+ description="MALAYALAM LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D2D,
+ },
+ [0x0D2E]={
+ category="lo",
+ description="MALAYALAM LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D2E,
+ },
+ [0x0D2F]={
+ category="lo",
+ description="MALAYALAM LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D2F,
+ },
+ [0x0D30]={
+ category="lo",
+ description="MALAYALAM LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D30,
+ },
+ [0x0D31]={
+ category="lo",
+ description="MALAYALAM LETTER RRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D31,
+ },
+ [0x0D32]={
+ category="lo",
+ description="MALAYALAM LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D32,
+ },
+ [0x0D33]={
+ category="lo",
+ description="MALAYALAM LETTER LLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D33,
+ },
+ [0x0D34]={
+ category="lo",
+ description="MALAYALAM LETTER LLLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D34,
+ },
+ [0x0D35]={
+ category="lo",
+ description="MALAYALAM LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D35,
+ },
+ [0x0D36]={
+ category="lo",
+ description="MALAYALAM LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D36,
+ },
+ [0x0D37]={
+ category="lo",
+ description="MALAYALAM LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D37,
+ },
+ [0x0D38]={
+ category="lo",
+ description="MALAYALAM LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D38,
+ },
+ [0x0D39]={
+ category="lo",
+ description="MALAYALAM LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D39,
+ },
+ [0x0D3E]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN AA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D3E,
+ },
+ [0x0D3F]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D3F,
+ },
+ [0x0D40]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN II",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D40,
+ },
+ [0x0D41]={
+ category="mn",
+ description="MALAYALAM VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0D41,
+ },
+ [0x0D42]={
+ category="mn",
+ description="MALAYALAM VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0D42,
+ },
+ [0x0D43]={
+ category="mn",
+ description="MALAYALAM VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0D43,
+ },
+ [0x0D46]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D46,
+ },
+ [0x0D47]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN EE",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D47,
+ },
+ [0x0D48]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D48,
+ },
+ [0x0D4A]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0D46, 0x0D3E },
+ unicodeslot=0x0D4A,
+ },
+ [0x0D4B]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN OO",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0D47, 0x0D3E },
+ unicodeslot=0x0D4B,
+ },
+ [0x0D4C]={
+ category="mc",
+ description="MALAYALAM VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0D46, 0x0D57 },
+ unicodeslot=0x0D4C,
+ },
+ [0x0D4D]={
+ category="mn",
+ description="MALAYALAM SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0D4D,
+ },
+ [0x0D57]={
+ category="mc",
+ description="MALAYALAM AU LENGTH MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D57,
+ },
+ [0x0D60]={
+ category="lo",
+ description="MALAYALAM LETTER VOCALIC RR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D60,
+ },
+ [0x0D61]={
+ category="lo",
+ description="MALAYALAM LETTER VOCALIC LL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D61,
+ },
+ [0x0D66]={
+ category="nd",
+ description="MALAYALAM DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D66,
+ },
+ [0x0D67]={
+ category="nd",
+ description="MALAYALAM DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D67,
+ },
+ [0x0D68]={
+ category="nd",
+ description="MALAYALAM DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D68,
+ },
+ [0x0D69]={
+ category="nd",
+ description="MALAYALAM DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D69,
+ },
+ [0x0D6A]={
+ category="nd",
+ description="MALAYALAM DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D6A,
+ },
+ [0x0D6B]={
+ category="nd",
+ description="MALAYALAM DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D6B,
+ },
+ [0x0D6C]={
+ category="nd",
+ description="MALAYALAM DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D6C,
+ },
+ [0x0D6D]={
+ category="nd",
+ description="MALAYALAM DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D6D,
+ },
+ [0x0D6E]={
+ category="nd",
+ description="MALAYALAM DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D6E,
+ },
+ [0x0D6F]={
+ category="nd",
+ description="MALAYALAM DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0D6F,
+ },
+ [0x0D82]={
+ category="mc",
+ description="SINHALA SIGN ANUSVARAYA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D82,
+ },
+ [0x0D83]={
+ category="mc",
+ description="SINHALA SIGN VISARGAYA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0D83,
+ },
+ [0x0D85]={
+ category="lo",
+ description="SINHALA LETTER AYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D85,
+ },
+ [0x0D86]={
+ category="lo",
+ description="SINHALA LETTER AAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D86,
+ },
+ [0x0D87]={
+ category="lo",
+ description="SINHALA LETTER AEYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D87,
+ },
+ [0x0D88]={
+ category="lo",
+ description="SINHALA LETTER AEEYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D88,
+ },
+ [0x0D89]={
+ category="lo",
+ description="SINHALA LETTER IYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D89,
+ },
+ [0x0D8A]={
+ category="lo",
+ description="SINHALA LETTER IIYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D8A,
+ },
+ [0x0D8B]={
+ category="lo",
+ description="SINHALA LETTER UYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D8B,
+ },
+ [0x0D8C]={
+ category="lo",
+ description="SINHALA LETTER UUYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D8C,
+ },
+ [0x0D8D]={
+ category="lo",
+ description="SINHALA LETTER IRUYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D8D,
+ },
+ [0x0D8E]={
+ category="lo",
+ description="SINHALA LETTER IRUUYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D8E,
+ },
+ [0x0D8F]={
+ category="lo",
+ description="SINHALA LETTER ILUYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D8F,
+ },
+ [0x0D90]={
+ category="lo",
+ description="SINHALA LETTER ILUUYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D90,
+ },
+ [0x0D91]={
+ category="lo",
+ description="SINHALA LETTER EYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D91,
+ },
+ [0x0D92]={
+ category="lo",
+ description="SINHALA LETTER EEYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D92,
+ },
+ [0x0D93]={
+ category="lo",
+ description="SINHALA LETTER AIYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D93,
+ },
+ [0x0D94]={
+ category="lo",
+ description="SINHALA LETTER OYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D94,
+ },
+ [0x0D95]={
+ category="lo",
+ description="SINHALA LETTER OOYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D95,
+ },
+ [0x0D96]={
+ category="lo",
+ description="SINHALA LETTER AUYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D96,
+ },
+ [0x0D9A]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA KAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D9A,
+ },
+ [0x0D9B]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA KAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D9B,
+ },
+ [0x0D9C]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA GAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D9C,
+ },
+ [0x0D9D]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA GAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D9D,
+ },
+ [0x0D9E]={
+ category="lo",
+ description="SINHALA LETTER KANTAJA NAASIKYAYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D9E,
+ },
+ [0x0D9F]={
+ category="lo",
+ description="SINHALA LETTER SANYAKA GAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0D9F,
+ },
+ [0x0DA0]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA CAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA0,
+ },
+ [0x0DA1]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA CAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA1,
+ },
+ [0x0DA2]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA JAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA2,
+ },
+ [0x0DA3]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA JAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA3,
+ },
+ [0x0DA4]={
+ category="lo",
+ description="SINHALA LETTER TAALUJA NAASIKYAYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA4,
+ },
+ [0x0DA5]={
+ category="lo",
+ description="SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA5,
+ },
+ [0x0DA6]={
+ category="lo",
+ description="SINHALA LETTER SANYAKA JAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA6,
+ },
+ [0x0DA7]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA TTAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA7,
+ },
+ [0x0DA8]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA TTAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA8,
+ },
+ [0x0DA9]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA DDAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DA9,
+ },
+ [0x0DAA]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA DDAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DAA,
+ },
+ [0x0DAB]={
+ category="lo",
+ description="SINHALA LETTER MUURDHAJA NAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DAB,
+ },
+ [0x0DAC]={
+ category="lo",
+ description="SINHALA LETTER SANYAKA DDAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DAC,
+ },
+ [0x0DAD]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA TAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DAD,
+ },
+ [0x0DAE]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA TAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DAE,
+ },
+ [0x0DAF]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA DAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DAF,
+ },
+ [0x0DB0]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA DAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB0,
+ },
+ [0x0DB1]={
+ category="lo",
+ description="SINHALA LETTER DANTAJA NAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB1,
+ },
+ [0x0DB3]={
+ category="lo",
+ description="SINHALA LETTER SANYAKA DAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB3,
+ },
+ [0x0DB4]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA PAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB4,
+ },
+ [0x0DB5]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA PAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB5,
+ },
+ [0x0DB6]={
+ category="lo",
+ description="SINHALA LETTER ALPAPRAANA BAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB6,
+ },
+ [0x0DB7]={
+ category="lo",
+ description="SINHALA LETTER MAHAAPRAANA BAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB7,
+ },
+ [0x0DB8]={
+ category="lo",
+ description="SINHALA LETTER MAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB8,
+ },
+ [0x0DB9]={
+ category="lo",
+ description="SINHALA LETTER AMBA BAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DB9,
+ },
+ [0x0DBA]={
+ category="lo",
+ description="SINHALA LETTER YAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DBA,
+ },
+ [0x0DBB]={
+ category="lo",
+ description="SINHALA LETTER RAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DBB,
+ },
+ [0x0DBD]={
+ category="lo",
+ description="SINHALA LETTER DANTAJA LAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DBD,
+ },
+ [0x0DC0]={
+ category="lo",
+ description="SINHALA LETTER VAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DC0,
+ },
+ [0x0DC1]={
+ category="lo",
+ description="SINHALA LETTER TAALUJA SAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DC1,
+ },
+ [0x0DC2]={
+ category="lo",
+ description="SINHALA LETTER MUURDHAJA SAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DC2,
+ },
+ [0x0DC3]={
+ category="lo",
+ description="SINHALA LETTER DANTAJA SAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DC3,
+ },
+ [0x0DC4]={
+ category="lo",
+ description="SINHALA LETTER HAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DC4,
+ },
+ [0x0DC5]={
+ category="lo",
+ description="SINHALA LETTER MUURDHAJA LAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DC5,
+ },
+ [0x0DC6]={
+ category="lo",
+ description="SINHALA LETTER FAYANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DC6,
+ },
+ [0x0DCA]={
+ category="mn",
+ description="SINHALA SIGN AL-LAKUNA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0DCA,
+ },
+ [0x0DCF]={
+ category="mc",
+ description="SINHALA VOWEL SIGN AELA-PILLA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DCF,
+ },
+ [0x0DD0]={
+ category="mc",
+ description="SINHALA VOWEL SIGN KETTI AEDA-PILLA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DD0,
+ },
+ [0x0DD1]={
+ category="mc",
+ description="SINHALA VOWEL SIGN DIGA AEDA-PILLA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DD1,
+ },
+ [0x0DD2]={
+ category="mn",
+ description="SINHALA VOWEL SIGN KETTI IS-PILLA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0DD2,
+ },
+ [0x0DD3]={
+ category="mn",
+ description="SINHALA VOWEL SIGN DIGA IS-PILLA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0DD3,
+ },
+ [0x0DD4]={
+ category="mn",
+ description="SINHALA VOWEL SIGN KETTI PAA-PILLA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0DD4,
+ },
+ [0x0DD6]={
+ category="mn",
+ description="SINHALA VOWEL SIGN DIGA PAA-PILLA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0DD6,
+ },
+ [0x0DD8]={
+ category="mc",
+ description="SINHALA VOWEL SIGN GAETTA-PILLA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DD8,
+ },
+ [0x0DD9]={
+ category="mc",
+ description="SINHALA VOWEL SIGN KOMBUVA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DD9,
+ },
+ [0x0DDA]={
+ category="mc",
+ description="SINHALA VOWEL SIGN DIGA KOMBUVA",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0DD9, 0x0DCA },
+ unicodeslot=0x0DDA,
+ },
+ [0x0DDB]={
+ category="mc",
+ description="SINHALA VOWEL SIGN KOMBU DEKA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DDB,
+ },
+ [0x0DDC]={
+ category="mc",
+ description="SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0DD9, 0x0DCF },
+ unicodeslot=0x0DDC,
+ },
+ [0x0DDD]={
+ category="mc",
+ description="SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0DDC, 0x0DCA },
+ unicodeslot=0x0DDD,
+ },
+ [0x0DDE]={
+ category="mc",
+ description="SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x0DD9, 0x0DDF },
+ unicodeslot=0x0DDE,
+ },
+ [0x0DDF]={
+ category="mc",
+ description="SINHALA VOWEL SIGN GAYANUKITTA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DDF,
+ },
+ [0x0DF2]={
+ category="mc",
+ description="SINHALA VOWEL SIGN DIGA GAETTA-PILLA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DF2,
+ },
+ [0x0DF3]={
+ category="mc",
+ description="SINHALA VOWEL SIGN DIGA GAYANUKITTA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0DF3,
+ },
+ [0x0DF4]={
+ category="po",
+ description="SINHALA PUNCTUATION KUNDDALIYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0DF4,
+ },
+ [0x0E01]={
+ category="lo",
+ description="THAI CHARACTER KO KAI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E01,
+ },
+ [0x0E02]={
+ category="lo",
+ description="THAI CHARACTER KHO KHAI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E02,
+ },
+ [0x0E03]={
+ category="lo",
+ description="THAI CHARACTER KHO KHUAT",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E03,
+ },
+ [0x0E04]={
+ category="lo",
+ description="THAI CHARACTER KHO KHWAI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E04,
+ },
+ [0x0E05]={
+ category="lo",
+ description="THAI CHARACTER KHO KHON",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E05,
+ },
+ [0x0E06]={
+ category="lo",
+ description="THAI CHARACTER KHO RAKHANG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E06,
+ },
+ [0x0E07]={
+ category="lo",
+ description="THAI CHARACTER NGO NGU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E07,
+ },
+ [0x0E08]={
+ category="lo",
+ description="THAI CHARACTER CHO CHAN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E08,
+ },
+ [0x0E09]={
+ category="lo",
+ description="THAI CHARACTER CHO CHING",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E09,
+ },
+ [0x0E0A]={
+ category="lo",
+ description="THAI CHARACTER CHO CHANG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E0A,
+ },
+ [0x0E0B]={
+ category="lo",
+ description="THAI CHARACTER SO SO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E0B,
+ },
+ [0x0E0C]={
+ category="lo",
+ description="THAI CHARACTER CHO CHOE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E0C,
+ },
+ [0x0E0D]={
+ category="lo",
+ description="THAI CHARACTER YO YING",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E0D,
+ },
+ [0x0E0E]={
+ category="lo",
+ description="THAI CHARACTER DO CHADA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E0E,
+ },
+ [0x0E0F]={
+ category="lo",
+ description="THAI CHARACTER TO PATAK",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E0F,
+ },
+ [0x0E10]={
+ category="lo",
+ description="THAI CHARACTER THO THAN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E10,
+ },
+ [0x0E11]={
+ category="lo",
+ description="THAI CHARACTER THO NANGMONTHO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E11,
+ },
+ [0x0E12]={
+ category="lo",
+ description="THAI CHARACTER THO PHUTHAO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E12,
+ },
+ [0x0E13]={
+ category="lo",
+ description="THAI CHARACTER NO NEN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E13,
+ },
+ [0x0E14]={
+ category="lo",
+ description="THAI CHARACTER DO DEK",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E14,
+ },
+ [0x0E15]={
+ category="lo",
+ description="THAI CHARACTER TO TAO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E15,
+ },
+ [0x0E16]={
+ category="lo",
+ description="THAI CHARACTER THO THUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E16,
+ },
+ [0x0E17]={
+ category="lo",
+ description="THAI CHARACTER THO THAHAN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E17,
+ },
+ [0x0E18]={
+ category="lo",
+ description="THAI CHARACTER THO THONG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E18,
+ },
+ [0x0E19]={
+ category="lo",
+ description="THAI CHARACTER NO NU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E19,
+ },
+ [0x0E1A]={
+ category="lo",
+ description="THAI CHARACTER BO BAIMAI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E1A,
+ },
+ [0x0E1B]={
+ category="lo",
+ description="THAI CHARACTER PO PLA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E1B,
+ },
+ [0x0E1C]={
+ category="lo",
+ description="THAI CHARACTER PHO PHUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E1C,
+ },
+ [0x0E1D]={
+ category="lo",
+ description="THAI CHARACTER FO FA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E1D,
+ },
+ [0x0E1E]={
+ category="lo",
+ description="THAI CHARACTER PHO PHAN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E1E,
+ },
+ [0x0E1F]={
+ category="lo",
+ description="THAI CHARACTER FO FAN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E1F,
+ },
+ [0x0E20]={
+ category="lo",
+ description="THAI CHARACTER PHO SAMPHAO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E20,
+ },
+ [0x0E21]={
+ category="lo",
+ description="THAI CHARACTER MO MA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E21,
+ },
+ [0x0E22]={
+ category="lo",
+ description="THAI CHARACTER YO YAK",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E22,
+ },
+ [0x0E23]={
+ category="lo",
+ description="THAI CHARACTER RO RUA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E23,
+ },
+ [0x0E24]={
+ category="lo",
+ description="THAI CHARACTER RU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E24,
+ },
+ [0x0E25]={
+ category="lo",
+ description="THAI CHARACTER LO LING",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E25,
+ },
+ [0x0E26]={
+ category="lo",
+ description="THAI CHARACTER LU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E26,
+ },
+ [0x0E27]={
+ category="lo",
+ description="THAI CHARACTER WO WAEN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E27,
+ },
+ [0x0E28]={
+ category="lo",
+ description="THAI CHARACTER SO SALA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E28,
+ },
+ [0x0E29]={
+ category="lo",
+ description="THAI CHARACTER SO RUSI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E29,
+ },
+ [0x0E2A]={
+ category="lo",
+ description="THAI CHARACTER SO SUA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E2A,
+ },
+ [0x0E2B]={
+ category="lo",
+ description="THAI CHARACTER HO HIP",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E2B,
+ },
+ [0x0E2C]={
+ category="lo",
+ description="THAI CHARACTER LO CHULA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E2C,
+ },
+ [0x0E2D]={
+ category="lo",
+ description="THAI CHARACTER O ANG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E2D,
+ },
+ [0x0E2E]={
+ category="lo",
+ description="THAI CHARACTER HO NOKHUK",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E2E,
+ },
+ [0x0E2F]={
+ category="lo",
+ description="THAI CHARACTER PAIYANNOI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E2F,
+ },
+ [0x0E30]={
+ category="lo",
+ description="THAI CHARACTER SARA A",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E30,
+ },
+ [0x0E31]={
+ category="mn",
+ description="THAI CHARACTER MAI HAN-AKAT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E31,
+ },
+ [0x0E32]={
+ category="lo",
+ description="THAI CHARACTER SARA AA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E32,
+ },
+ [0x0E33]={
+ category="lo",
+ description="THAI CHARACTER SARA AM",
+ direction="l",
+ linebreak="sa",
+ specials={ "compat", 0x0E4D, 0x0E32 },
+ unicodeslot=0x0E33,
+ },
+ [0x0E34]={
+ category="mn",
+ description="THAI CHARACTER SARA I",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E34,
+ },
+ [0x0E35]={
+ category="mn",
+ description="THAI CHARACTER SARA II",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E35,
+ },
+ [0x0E36]={
+ category="mn",
+ description="THAI CHARACTER SARA UE",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E36,
+ },
+ [0x0E37]={
+ category="mn",
+ description="THAI CHARACTER SARA UEE",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E37,
+ },
+ [0x0E38]={
+ category="mn",
+ description="THAI CHARACTER SARA U",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E38,
+ },
+ [0x0E39]={
+ category="mn",
+ description="THAI CHARACTER SARA UU",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E39,
+ },
+ [0x0E3A]={
+ category="mn",
+ description="THAI CHARACTER PHINTHU",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E3A,
+ },
+ [0x0E3F]={
+ category="sc",
+ description="THAI CURRENCY SYMBOL BAHT",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x0E3F,
+ },
+ [0x0E40]={
+ category="lo",
+ description="THAI CHARACTER SARA E",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E40,
+ },
+ [0x0E41]={
+ category="lo",
+ description="THAI CHARACTER SARA AE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E41,
+ },
+ [0x0E42]={
+ category="lo",
+ description="THAI CHARACTER SARA O",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E42,
+ },
+ [0x0E43]={
+ category="lo",
+ description="THAI CHARACTER SARA AI MAIMUAN",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E43,
+ },
+ [0x0E44]={
+ category="lo",
+ description="THAI CHARACTER SARA AI MAIMALAI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E44,
+ },
+ [0x0E45]={
+ category="lo",
+ description="THAI CHARACTER LAKKHANGYAO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E45,
+ },
+ [0x0E46]={
+ category="lm",
+ description="THAI CHARACTER MAIYAMOK",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E46,
+ },
+ [0x0E47]={
+ category="mn",
+ description="THAI CHARACTER MAITAIKHU",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E47,
+ },
+ [0x0E48]={
+ category="mn",
+ description="THAI CHARACTER MAI EK",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E48,
+ },
+ [0x0E49]={
+ category="mn",
+ description="THAI CHARACTER MAI THO",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E49,
+ },
+ [0x0E4A]={
+ category="mn",
+ description="THAI CHARACTER MAI TRI",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E4A,
+ },
+ [0x0E4B]={
+ category="mn",
+ description="THAI CHARACTER MAI CHATTAWA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E4B,
+ },
+ [0x0E4C]={
+ category="mn",
+ description="THAI CHARACTER THANTHAKHAT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E4C,
+ },
+ [0x0E4D]={
+ category="mn",
+ description="THAI CHARACTER NIKHAHIT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E4D,
+ },
+ [0x0E4E]={
+ category="mn",
+ description="THAI CHARACTER YAMAKKAN",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0E4E,
+ },
+ [0x0E4F]={
+ category="po",
+ description="THAI CHARACTER FONGMAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0E4F,
+ },
+ [0x0E50]={
+ category="nd",
+ description="THAI DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E50,
+ },
+ [0x0E51]={
+ category="nd",
+ description="THAI DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E51,
+ },
+ [0x0E52]={
+ category="nd",
+ description="THAI DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E52,
+ },
+ [0x0E53]={
+ category="nd",
+ description="THAI DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E53,
+ },
+ [0x0E54]={
+ category="nd",
+ description="THAI DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E54,
+ },
+ [0x0E55]={
+ category="nd",
+ description="THAI DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E55,
+ },
+ [0x0E56]={
+ category="nd",
+ description="THAI DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E56,
+ },
+ [0x0E57]={
+ category="nd",
+ description="THAI DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E57,
+ },
+ [0x0E58]={
+ category="nd",
+ description="THAI DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E58,
+ },
+ [0x0E59]={
+ category="nd",
+ description="THAI DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0E59,
+ },
+ [0x0E5A]={
+ category="po",
+ description="THAI CHARACTER ANGKHANKHU",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0E5A,
+ },
+ [0x0E5B]={
+ category="po",
+ description="THAI CHARACTER KHOMUT",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0E5B,
+ },
+ [0x0E81]={
+ category="lo",
+ description="LAO LETTER KO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E81,
+ },
+ [0x0E82]={
+ category="lo",
+ description="LAO LETTER KHO SUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E82,
+ },
+ [0x0E84]={
+ category="lo",
+ description="LAO LETTER KHO TAM",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E84,
+ },
+ [0x0E87]={
+ category="lo",
+ description="LAO LETTER NGO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E87,
+ },
+ [0x0E88]={
+ category="lo",
+ description="LAO LETTER CO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E88,
+ },
+ [0x0E8A]={
+ category="lo",
+ description="LAO LETTER SO TAM",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E8A,
+ },
+ [0x0E8D]={
+ category="lo",
+ description="LAO LETTER NYO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E8D,
+ },
+ [0x0E94]={
+ category="lo",
+ description="LAO LETTER DO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E94,
+ },
+ [0x0E95]={
+ category="lo",
+ description="LAO LETTER TO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E95,
+ },
+ [0x0E96]={
+ category="lo",
+ description="LAO LETTER THO SUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E96,
+ },
+ [0x0E97]={
+ category="lo",
+ description="LAO LETTER THO TAM",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E97,
+ },
+ [0x0E99]={
+ category="lo",
+ description="LAO LETTER NO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E99,
+ },
+ [0x0E9A]={
+ category="lo",
+ description="LAO LETTER BO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E9A,
+ },
+ [0x0E9B]={
+ category="lo",
+ description="LAO LETTER PO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E9B,
+ },
+ [0x0E9C]={
+ category="lo",
+ description="LAO LETTER PHO SUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E9C,
+ },
+ [0x0E9D]={
+ category="lo",
+ description="LAO LETTER FO TAM",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E9D,
+ },
+ [0x0E9E]={
+ category="lo",
+ description="LAO LETTER PHO TAM",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E9E,
+ },
+ [0x0E9F]={
+ category="lo",
+ description="LAO LETTER FO SUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0E9F,
+ },
+ [0x0EA1]={
+ category="lo",
+ description="LAO LETTER MO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EA1,
+ },
+ [0x0EA2]={
+ category="lo",
+ description="LAO LETTER YO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EA2,
+ },
+ [0x0EA3]={
+ category="lo",
+ description="LAO LETTER LO LING",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EA3,
+ },
+ [0x0EA5]={
+ category="lo",
+ description="LAO LETTER LO LOOT",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EA5,
+ },
+ [0x0EA7]={
+ category="lo",
+ description="LAO LETTER WO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EA7,
+ },
+ [0x0EAA]={
+ category="lo",
+ description="LAO LETTER SO SUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EAA,
+ },
+ [0x0EAB]={
+ category="lo",
+ description="LAO LETTER HO SUNG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EAB,
+ },
+ [0x0EAD]={
+ category="lo",
+ description="LAO LETTER O",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EAD,
+ },
+ [0x0EAE]={
+ category="lo",
+ description="LAO LETTER HO TAM",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EAE,
+ },
+ [0x0EAF]={
+ category="lo",
+ description="LAO ELLIPSIS",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EAF,
+ },
+ [0x0EB0]={
+ category="lo",
+ description="LAO VOWEL SIGN A",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EB0,
+ },
+ [0x0EB1]={
+ category="mn",
+ description="LAO VOWEL SIGN MAI KAN",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EB1,
+ },
+ [0x0EB2]={
+ category="lo",
+ description="LAO VOWEL SIGN AA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EB2,
+ },
+ [0x0EB3]={
+ category="lo",
+ description="LAO VOWEL SIGN AM",
+ direction="l",
+ linebreak="sa",
+ specials={ "compat", 0x0ECD, 0x0EB2 },
+ unicodeslot=0x0EB3,
+ },
+ [0x0EB4]={
+ category="mn",
+ description="LAO VOWEL SIGN I",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EB4,
+ },
+ [0x0EB5]={
+ category="mn",
+ description="LAO VOWEL SIGN II",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EB5,
+ },
+ [0x0EB6]={
+ category="mn",
+ description="LAO VOWEL SIGN Y",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EB6,
+ },
+ [0x0EB7]={
+ category="mn",
+ description="LAO VOWEL SIGN YY",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EB7,
+ },
+ [0x0EB8]={
+ category="mn",
+ description="LAO VOWEL SIGN U",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EB8,
+ },
+ [0x0EB9]={
+ category="mn",
+ description="LAO VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EB9,
+ },
+ [0x0EBB]={
+ category="mn",
+ description="LAO VOWEL SIGN MAI KON",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EBB,
+ },
+ [0x0EBC]={
+ category="mn",
+ description="LAO SEMIVOWEL SIGN LO",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EBC,
+ },
+ [0x0EBD]={
+ category="lo",
+ description="LAO SEMIVOWEL SIGN NYO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EBD,
+ },
+ [0x0EC0]={
+ category="lo",
+ description="LAO VOWEL SIGN E",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EC0,
+ },
+ [0x0EC1]={
+ category="lo",
+ description="LAO VOWEL SIGN EI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EC1,
+ },
+ [0x0EC2]={
+ category="lo",
+ description="LAO VOWEL SIGN O",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EC2,
+ },
+ [0x0EC3]={
+ category="lo",
+ description="LAO VOWEL SIGN AY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EC3,
+ },
+ [0x0EC4]={
+ category="lo",
+ description="LAO VOWEL SIGN AI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EC4,
+ },
+ [0x0EC6]={
+ category="lm",
+ description="LAO KO LA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x0EC6,
+ },
+ [0x0EC8]={
+ category="mn",
+ description="LAO TONE MAI EK",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EC8,
+ },
+ [0x0EC9]={
+ category="mn",
+ description="LAO TONE MAI THO",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0EC9,
+ },
+ [0x0ECA]={
+ category="mn",
+ description="LAO TONE MAI TI",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0ECA,
+ },
+ [0x0ECB]={
+ category="mn",
+ description="LAO TONE MAI CATAWA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0ECB,
+ },
+ [0x0ECC]={
+ category="mn",
+ description="LAO CANCELLATION MARK",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0ECC,
+ },
+ [0x0ECD]={
+ category="mn",
+ description="LAO NIGGAHITA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x0ECD,
+ },
+ [0x0ED0]={
+ category="nd",
+ description="LAO DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED0,
+ },
+ [0x0ED1]={
+ category="nd",
+ description="LAO DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED1,
+ },
+ [0x0ED2]={
+ category="nd",
+ description="LAO DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED2,
+ },
+ [0x0ED3]={
+ category="nd",
+ description="LAO DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED3,
+ },
+ [0x0ED4]={
+ category="nd",
+ description="LAO DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED4,
+ },
+ [0x0ED5]={
+ category="nd",
+ description="LAO DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED5,
+ },
+ [0x0ED6]={
+ category="nd",
+ description="LAO DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED6,
+ },
+ [0x0ED7]={
+ category="nd",
+ description="LAO DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED7,
+ },
+ [0x0ED8]={
+ category="nd",
+ description="LAO DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED8,
+ },
+ [0x0ED9]={
+ category="nd",
+ description="LAO DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0ED9,
+ },
+ [0x0EDC]={
+ category="lo",
+ description="LAO HO NO",
+ direction="l",
+ linebreak="sa",
+ specials={ "compat", 0x0EAB, 0x0E99 },
+ unicodeslot=0x0EDC,
+ },
+ [0x0EDD]={
+ category="lo",
+ description="LAO HO MO",
+ direction="l",
+ linebreak="sa",
+ specials={ "compat", 0x0EAB, 0x0EA1 },
+ unicodeslot=0x0EDD,
+ },
+ [0x0F00]={
+ category="lo",
+ description="TIBETAN SYLLABLE OM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F00,
+ },
+ [0x0F01]={
+ category="so",
+ description="TIBETAN MARK GTER YIG MGO TRUNCATED A",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F01,
+ },
+ [0x0F02]={
+ category="so",
+ description="TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F02,
+ },
+ [0x0F03]={
+ category="so",
+ description="TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F03,
+ },
+ [0x0F04]={
+ category="po",
+ description="TIBETAN MARK INITIAL YIG MGO MDUN MA",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F04,
+ },
+ [0x0F05]={
+ category="po",
+ description="TIBETAN MARK CLOSING YIG MGO SGAB MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F05,
+ },
+ [0x0F06]={
+ category="po",
+ description="TIBETAN MARK CARET YIG MGO PHUR SHAD MA",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F06,
+ },
+ [0x0F07]={
+ category="po",
+ description="TIBETAN MARK YIG MGO TSHEG SHAD MA",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F07,
+ },
+ [0x0F08]={
+ category="po",
+ description="TIBETAN MARK SBRUL SHAD",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x0F08,
+ },
+ [0x0F09]={
+ category="po",
+ description="TIBETAN MARK BSKUR YIG MGO",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F09,
+ },
+ [0x0F0A]={
+ category="po",
+ description="TIBETAN MARK BKA- SHOG YIG MGO",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0F0A,
+ },
+ [0x0F0B]={
+ category="po",
+ description="TIBETAN MARK INTERSYLLABIC TSHEG",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0F0B,
+ },
+ [0x0F0C]={
+ category="po",
+ description="TIBETAN MARK DELIMITER TSHEG BSTAR",
+ direction="l",
+ linebreak="gl",
+ specials={ "nobreak", 0x0F0B },
+ unicodeslot=0x0F0C,
+ },
+ [0x0F0D]={
+ category="po",
+ description="TIBETAN MARK SHAD",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x0F0D,
+ },
+ [0x0F0E]={
+ category="po",
+ description="TIBETAN MARK NYIS SHAD",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x0F0E,
+ },
+ [0x0F0F]={
+ category="po",
+ description="TIBETAN MARK TSHEG SHAD",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x0F0F,
+ },
+ [0x0F10]={
+ category="po",
+ description="TIBETAN MARK NYIS TSHEG SHAD",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x0F10,
+ },
+ [0x0F11]={
+ category="po",
+ description="TIBETAN MARK RIN CHEN SPUNGS SHAD",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x0F11,
+ },
+ [0x0F12]={
+ category="po",
+ description="TIBETAN MARK RGYA GRAM SHAD",
+ direction="l",
+ linebreak="gl",
+ unicodeslot=0x0F12,
+ },
+ [0x0F13]={
+ category="so",
+ description="TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F13,
+ },
+ [0x0F14]={
+ category="so",
+ description="TIBETAN MARK GTER TSHEG",
+ direction="l",
+ linebreak="ex",
+ unicodeslot=0x0F14,
+ },
+ [0x0F15]={
+ category="so",
+ description="TIBETAN LOGOTYPE SIGN CHAD RTAGS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F15,
+ },
+ [0x0F16]={
+ category="so",
+ description="TIBETAN LOGOTYPE SIGN LHAG RTAGS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F16,
+ },
+ [0x0F17]={
+ category="so",
+ description="TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F17,
+ },
+ [0x0F18]={
+ category="mn",
+ description="TIBETAN ASTROLOGICAL SIGN -KHYUD PA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F18,
+ },
+ [0x0F19]={
+ category="mn",
+ description="TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F19,
+ },
+ [0x0F1A]={
+ category="so",
+ description="TIBETAN SIGN RDEL DKAR GCIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F1A,
+ },
+ [0x0F1B]={
+ category="so",
+ description="TIBETAN SIGN RDEL DKAR GNYIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F1B,
+ },
+ [0x0F1C]={
+ category="so",
+ description="TIBETAN SIGN RDEL DKAR GSUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F1C,
+ },
+ [0x0F1D]={
+ category="so",
+ description="TIBETAN SIGN RDEL NAG GCIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F1D,
+ },
+ [0x0F1E]={
+ category="so",
+ description="TIBETAN SIGN RDEL NAG GNYIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F1E,
+ },
+ [0x0F1F]={
+ category="so",
+ description="TIBETAN SIGN RDEL DKAR RDEL NAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F1F,
+ },
+ [0x0F20]={
+ category="nd",
+ description="TIBETAN DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F20,
+ },
+ [0x0F21]={
+ category="nd",
+ description="TIBETAN DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F21,
+ },
+ [0x0F22]={
+ category="nd",
+ description="TIBETAN DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F22,
+ },
+ [0x0F23]={
+ category="nd",
+ description="TIBETAN DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F23,
+ },
+ [0x0F24]={
+ category="nd",
+ description="TIBETAN DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F24,
+ },
+ [0x0F25]={
+ category="nd",
+ description="TIBETAN DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F25,
+ },
+ [0x0F26]={
+ category="nd",
+ description="TIBETAN DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F26,
+ },
+ [0x0F27]={
+ category="nd",
+ description="TIBETAN DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F27,
+ },
+ [0x0F28]={
+ category="nd",
+ description="TIBETAN DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F28,
+ },
+ [0x0F29]={
+ category="nd",
+ description="TIBETAN DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x0F29,
+ },
+ [0x0F2A]={
+ category="no",
+ description="TIBETAN DIGIT HALF ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F2A,
+ },
+ [0x0F2B]={
+ category="no",
+ description="TIBETAN DIGIT HALF TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F2B,
+ },
+ [0x0F2C]={
+ category="no",
+ description="TIBETAN DIGIT HALF THREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F2C,
+ },
+ [0x0F2D]={
+ category="no",
+ description="TIBETAN DIGIT HALF FOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F2D,
+ },
+ [0x0F2E]={
+ category="no",
+ description="TIBETAN DIGIT HALF FIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F2E,
+ },
+ [0x0F2F]={
+ category="no",
+ description="TIBETAN DIGIT HALF SIX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F2F,
+ },
+ [0x0F30]={
+ category="no",
+ description="TIBETAN DIGIT HALF SEVEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F30,
+ },
+ [0x0F31]={
+ category="no",
+ description="TIBETAN DIGIT HALF EIGHT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F31,
+ },
+ [0x0F32]={
+ category="no",
+ description="TIBETAN DIGIT HALF NINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F32,
+ },
+ [0x0F33]={
+ category="no",
+ description="TIBETAN DIGIT HALF ZERO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F33,
+ },
+ [0x0F34]={
+ category="so",
+ description="TIBETAN MARK BSDUS RTAGS",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0F34,
+ },
+ [0x0F35]={
+ category="mn",
+ description="TIBETAN MARK NGAS BZUNG NYI ZLA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F35,
+ },
+ [0x0F36]={
+ category="so",
+ description="TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F36,
+ },
+ [0x0F37]={
+ category="mn",
+ description="TIBETAN MARK NGAS BZUNG SGOR RTAGS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F37,
+ },
+ [0x0F38]={
+ category="so",
+ description="TIBETAN MARK CHE MGO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F38,
+ },
+ [0x0F39]={
+ category="mn",
+ description="TIBETAN MARK TSA -PHRU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F39,
+ },
+ [0x0F3A]={
+ category="ps",
+ description="TIBETAN MARK GUG RTAGS GYON",
+ direction="on",
+ linebreak="op",
+ mirror=0x0F3B,
+ unicodeslot=0x0F3A,
+ },
+ [0x0F3B]={
+ category="pe",
+ description="TIBETAN MARK GUG RTAGS GYAS",
+ direction="on",
+ linebreak="cl",
+ mirror=0x0F3A,
+ unicodeslot=0x0F3B,
+ },
+ [0x0F3C]={
+ category="ps",
+ description="TIBETAN MARK ANG KHANG GYON",
+ direction="on",
+ linebreak="op",
+ mirror=0x0F3D,
+ unicodeslot=0x0F3C,
+ },
+ [0x0F3D]={
+ category="pe",
+ description="TIBETAN MARK ANG KHANG GYAS",
+ direction="on",
+ linebreak="cl",
+ mirror=0x0F3C,
+ unicodeslot=0x0F3D,
+ },
+ [0x0F3E]={
+ category="mc",
+ description="TIBETAN SIGN YAR TSHES",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0F3E,
+ },
+ [0x0F3F]={
+ category="mc",
+ description="TIBETAN SIGN MAR TSHES",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x0F3F,
+ },
+ [0x0F40]={
+ category="lo",
+ description="TIBETAN LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F40,
+ },
+ [0x0F41]={
+ category="lo",
+ description="TIBETAN LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F41,
+ },
+ [0x0F42]={
+ category="lo",
+ description="TIBETAN LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F42,
+ },
+ [0x0F43]={
+ category="lo",
+ description="TIBETAN LETTER GHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0F42, 0x0FB7 },
+ unicodeslot=0x0F43,
+ },
+ [0x0F44]={
+ category="lo",
+ description="TIBETAN LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F44,
+ },
+ [0x0F45]={
+ category="lo",
+ description="TIBETAN LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F45,
+ },
+ [0x0F46]={
+ category="lo",
+ description="TIBETAN LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F46,
+ },
+ [0x0F47]={
+ category="lo",
+ description="TIBETAN LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F47,
+ },
+ [0x0F49]={
+ category="lo",
+ description="TIBETAN LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F49,
+ },
+ [0x0F4A]={
+ category="lo",
+ description="TIBETAN LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F4A,
+ },
+ [0x0F4B]={
+ category="lo",
+ description="TIBETAN LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F4B,
+ },
+ [0x0F4C]={
+ category="lo",
+ description="TIBETAN LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F4C,
+ },
+ [0x0F4D]={
+ category="lo",
+ description="TIBETAN LETTER DDHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0F4C, 0x0FB7 },
+ unicodeslot=0x0F4D,
+ },
+ [0x0F4E]={
+ category="lo",
+ description="TIBETAN LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F4E,
+ },
+ [0x0F4F]={
+ category="lo",
+ description="TIBETAN LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F4F,
+ },
+ [0x0F50]={
+ category="lo",
+ description="TIBETAN LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F50,
+ },
+ [0x0F51]={
+ category="lo",
+ description="TIBETAN LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F51,
+ },
+ [0x0F52]={
+ category="lo",
+ description="TIBETAN LETTER DHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0F51, 0x0FB7 },
+ unicodeslot=0x0F52,
+ },
+ [0x0F53]={
+ category="lo",
+ description="TIBETAN LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F53,
+ },
+ [0x0F54]={
+ category="lo",
+ description="TIBETAN LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F54,
+ },
+ [0x0F55]={
+ category="lo",
+ description="TIBETAN LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F55,
+ },
+ [0x0F56]={
+ category="lo",
+ description="TIBETAN LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F56,
+ },
+ [0x0F57]={
+ category="lo",
+ description="TIBETAN LETTER BHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0F56, 0x0FB7 },
+ unicodeslot=0x0F57,
+ },
+ [0x0F58]={
+ category="lo",
+ description="TIBETAN LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F58,
+ },
+ [0x0F59]={
+ category="lo",
+ description="TIBETAN LETTER TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F59,
+ },
+ [0x0F5A]={
+ category="lo",
+ description="TIBETAN LETTER TSHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F5A,
+ },
+ [0x0F5B]={
+ category="lo",
+ description="TIBETAN LETTER DZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F5B,
+ },
+ [0x0F5C]={
+ category="lo",
+ description="TIBETAN LETTER DZHA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0F5B, 0x0FB7 },
+ unicodeslot=0x0F5C,
+ },
+ [0x0F5D]={
+ category="lo",
+ description="TIBETAN LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F5D,
+ },
+ [0x0F5E]={
+ category="lo",
+ description="TIBETAN LETTER ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F5E,
+ },
+ [0x0F5F]={
+ category="lo",
+ description="TIBETAN LETTER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F5F,
+ },
+ [0x0F60]={
+ category="lo",
+ description="TIBETAN LETTER -A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F60,
+ },
+ [0x0F61]={
+ category="lo",
+ description="TIBETAN LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F61,
+ },
+ [0x0F62]={
+ category="lo",
+ description="TIBETAN LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F62,
+ },
+ [0x0F63]={
+ category="lo",
+ description="TIBETAN LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F63,
+ },
+ [0x0F64]={
+ category="lo",
+ description="TIBETAN LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F64,
+ },
+ [0x0F65]={
+ category="lo",
+ description="TIBETAN LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F65,
+ },
+ [0x0F66]={
+ category="lo",
+ description="TIBETAN LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F66,
+ },
+ [0x0F67]={
+ category="lo",
+ description="TIBETAN LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F67,
+ },
+ [0x0F68]={
+ category="lo",
+ description="TIBETAN LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F68,
+ },
+ [0x0F69]={
+ category="lo",
+ description="TIBETAN LETTER KSSA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x0F40, 0x0FB5 },
+ unicodeslot=0x0F69,
+ },
+ [0x0F6A]={
+ category="lo",
+ description="TIBETAN LETTER FIXED-FORM RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F6A,
+ },
+ [0x0F71]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN AA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F71,
+ },
+ [0x0F72]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F72,
+ },
+ [0x0F73]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN II",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0F71, 0x0F72 },
+ unicodeslot=0x0F73,
+ },
+ [0x0F74]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F74,
+ },
+ [0x0F75]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0F71, 0x0F74 },
+ unicodeslot=0x0F75,
+ },
+ [0x0F76]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0FB2, 0x0F80 },
+ unicodeslot=0x0F76,
+ },
+ [0x0F77]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN VOCALIC RR",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "compat", 0x0FB2, 0x0F81 },
+ unicodeslot=0x0F77,
+ },
+ [0x0F78]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0FB3, 0x0F80 },
+ unicodeslot=0x0F78,
+ },
+ [0x0F79]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "compat", 0x0FB3, 0x0F81 },
+ unicodeslot=0x0F79,
+ },
+ [0x0F7A]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F7A,
+ },
+ [0x0F7B]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN EE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F7B,
+ },
+ [0x0F7C]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN O",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F7C,
+ },
+ [0x0F7D]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN OO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F7D,
+ },
+ [0x0F7E]={
+ category="mn",
+ description="TIBETAN SIGN RJES SU NGA RO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F7E,
+ },
+ [0x0F7F]={
+ category="mc",
+ description="TIBETAN SIGN RNAM BCAD",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0F7F,
+ },
+ [0x0F80]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN REVERSED I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F80,
+ },
+ [0x0F81]={
+ category="mn",
+ description="TIBETAN VOWEL SIGN REVERSED II",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0F71, 0x0F80 },
+ unicodeslot=0x0F81,
+ },
+ [0x0F82]={
+ category="mn",
+ description="TIBETAN SIGN NYI ZLA NAA DA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F82,
+ },
+ [0x0F83]={
+ category="mn",
+ description="TIBETAN SIGN SNA LDAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F83,
+ },
+ [0x0F84]={
+ category="mn",
+ description="TIBETAN MARK HALANTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F84,
+ },
+ [0x0F85]={
+ category="po",
+ description="TIBETAN MARK PALUTA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0F85,
+ },
+ [0x0F86]={
+ category="mn",
+ description="TIBETAN SIGN LCI RTAGS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F86,
+ },
+ [0x0F87]={
+ category="mn",
+ description="TIBETAN SIGN YANG RTAGS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F87,
+ },
+ [0x0F88]={
+ category="lo",
+ description="TIBETAN SIGN LCE TSA CAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F88,
+ },
+ [0x0F89]={
+ category="lo",
+ description="TIBETAN SIGN MCHU CAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F89,
+ },
+ [0x0F8A]={
+ category="lo",
+ description="TIBETAN SIGN GRU CAN RGYINGS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F8A,
+ },
+ [0x0F8B]={
+ category="lo",
+ description="TIBETAN SIGN GRU MED RGYINGS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0F8B,
+ },
+ [0x0F90]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER KA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F90,
+ },
+ [0x0F91]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER KHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F91,
+ },
+ [0x0F92]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER GA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F92,
+ },
+ [0x0F93]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER GHA",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0F92, 0x0FB7 },
+ unicodeslot=0x0F93,
+ },
+ [0x0F94]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER NGA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F94,
+ },
+ [0x0F95]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER CA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F95,
+ },
+ [0x0F96]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER CHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F96,
+ },
+ [0x0F97]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER JA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F97,
+ },
+ [0x0F99]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER NYA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F99,
+ },
+ [0x0F9A]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER TTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F9A,
+ },
+ [0x0F9B]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER TTHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F9B,
+ },
+ [0x0F9C]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER DDA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F9C,
+ },
+ [0x0F9D]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER DDHA",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0F9C, 0x0FB7 },
+ unicodeslot=0x0F9D,
+ },
+ [0x0F9E]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER NNA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F9E,
+ },
+ [0x0F9F]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER TA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0F9F,
+ },
+ [0x0FA0]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER THA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA0,
+ },
+ [0x0FA1]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER DA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA1,
+ },
+ [0x0FA2]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER DHA",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0FA1, 0x0FB7 },
+ unicodeslot=0x0FA2,
+ },
+ [0x0FA3]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER NA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA3,
+ },
+ [0x0FA4]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER PA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA4,
+ },
+ [0x0FA5]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER PHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA5,
+ },
+ [0x0FA6]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER BA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA6,
+ },
+ [0x0FA7]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER BHA",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0FA6, 0x0FB7 },
+ unicodeslot=0x0FA7,
+ },
+ [0x0FA8]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER MA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA8,
+ },
+ [0x0FA9]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER TSA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FA9,
+ },
+ [0x0FAA]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER TSHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FAA,
+ },
+ [0x0FAB]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER DZA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FAB,
+ },
+ [0x0FAC]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER DZHA",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0FAB, 0x0FB7 },
+ unicodeslot=0x0FAC,
+ },
+ [0x0FAD]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER WA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FAD,
+ },
+ [0x0FAE]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER ZHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FAE,
+ },
+ [0x0FAF]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER ZA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FAF,
+ },
+ [0x0FB0]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER -A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB0,
+ },
+ [0x0FB1]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER YA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB1,
+ },
+ [0x0FB2]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER RA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB2,
+ },
+ [0x0FB3]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER LA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB3,
+ },
+ [0x0FB4]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER SHA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB4,
+ },
+ [0x0FB5]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER SSA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB5,
+ },
+ [0x0FB6]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER SA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB6,
+ },
+ [0x0FB7]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER HA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB7,
+ },
+ [0x0FB8]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FB8,
+ },
+ [0x0FB9]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER KSSA",
+ direction="nsm",
+ linebreak="cm",
+ specials={ "char", 0x0F90, 0x0FB5 },
+ unicodeslot=0x0FB9,
+ },
+ [0x0FBA]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER FIXED-FORM WA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FBA,
+ },
+ [0x0FBB]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER FIXED-FORM YA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FBB,
+ },
+ [0x0FBC]={
+ category="mn",
+ description="TIBETAN SUBJOINED LETTER FIXED-FORM RA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FBC,
+ },
+ [0x0FBE]={
+ category="so",
+ description="TIBETAN KU RU KHA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0FBE,
+ },
+ [0x0FBF]={
+ category="so",
+ description="TIBETAN KU RU KHA BZHI MIG CAN",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x0FBF,
+ },
+ [0x0FC0]={
+ category="so",
+ description="TIBETAN CANTILLATION SIGN HEAVY BEAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC0,
+ },
+ [0x0FC1]={
+ category="so",
+ description="TIBETAN CANTILLATION SIGN LIGHT BEAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC1,
+ },
+ [0x0FC2]={
+ category="so",
+ description="TIBETAN CANTILLATION SIGN CANG TE-U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC2,
+ },
+ [0x0FC3]={
+ category="so",
+ description="TIBETAN CANTILLATION SIGN SBUB -CHAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC3,
+ },
+ [0x0FC4]={
+ category="so",
+ description="TIBETAN SYMBOL DRIL BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC4,
+ },
+ [0x0FC5]={
+ category="so",
+ description="TIBETAN SYMBOL RDO RJE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC5,
+ },
+ [0x0FC6]={
+ category="mn",
+ description="TIBETAN SYMBOL PADMA GDAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x0FC6,
+ },
+ [0x0FC7]={
+ category="so",
+ description="TIBETAN SYMBOL RDO RJE RGYA GRAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC7,
+ },
+ [0x0FC8]={
+ category="so",
+ description="TIBETAN SYMBOL PHUR PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC8,
+ },
+ [0x0FC9]={
+ category="so",
+ description="TIBETAN SYMBOL NOR BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FC9,
+ },
+ [0x0FCA]={
+ category="so",
+ description="TIBETAN SYMBOL NOR BU NYIS -KHYIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FCA,
+ },
+ [0x0FCB]={
+ category="so",
+ description="TIBETAN SYMBOL NOR BU GSUM -KHYIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FCB,
+ },
+ [0x0FCC]={
+ category="so",
+ description="TIBETAN SYMBOL NOR BU BZHI -KHYIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FCC,
+ },
+ [0x0FCF]={
+ category="so",
+ description="TIBETAN SIGN RDEL NAG GSUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x0FCF,
+ },
+ [0x0FD0]={
+ category="po",
+ description="TIBETAN MARK BSKA- SHOG GI MGO RGYAN",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0FD0,
+ },
+ [0x0FD1]={
+ category="po",
+ description="TIBETAN MARK MNYAM YIG GI MGO RGYAN",
+ direction="l",
+ linebreak="bb",
+ unicodeslot=0x0FD1,
+ },
+ [0x1000]={
+ category="lo",
+ description="MYANMAR LETTER KA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1000,
+ },
+ [0x1001]={
+ category="lo",
+ description="MYANMAR LETTER KHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1001,
+ },
+ [0x1002]={
+ category="lo",
+ description="MYANMAR LETTER GA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1002,
+ },
+ [0x1003]={
+ category="lo",
+ description="MYANMAR LETTER GHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1003,
+ },
+ [0x1004]={
+ category="lo",
+ description="MYANMAR LETTER NGA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1004,
+ },
+ [0x1005]={
+ category="lo",
+ description="MYANMAR LETTER CA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1005,
+ },
+ [0x1006]={
+ category="lo",
+ description="MYANMAR LETTER CHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1006,
+ },
+ [0x1007]={
+ category="lo",
+ description="MYANMAR LETTER JA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1007,
+ },
+ [0x1008]={
+ category="lo",
+ description="MYANMAR LETTER JHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1008,
+ },
+ [0x1009]={
+ category="lo",
+ description="MYANMAR LETTER NYA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1009,
+ },
+ [0x100A]={
+ category="lo",
+ description="MYANMAR LETTER NNYA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x100A,
+ },
+ [0x100B]={
+ category="lo",
+ description="MYANMAR LETTER TTA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x100B,
+ },
+ [0x100C]={
+ category="lo",
+ description="MYANMAR LETTER TTHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x100C,
+ },
+ [0x100D]={
+ category="lo",
+ description="MYANMAR LETTER DDA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x100D,
+ },
+ [0x100E]={
+ category="lo",
+ description="MYANMAR LETTER DDHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x100E,
+ },
+ [0x100F]={
+ category="lo",
+ description="MYANMAR LETTER NNA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x100F,
+ },
+ [0x1010]={
+ category="lo",
+ description="MYANMAR LETTER TA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1010,
+ },
+ [0x1011]={
+ category="lo",
+ description="MYANMAR LETTER THA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1011,
+ },
+ [0x1012]={
+ category="lo",
+ description="MYANMAR LETTER DA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1012,
+ },
+ [0x1013]={
+ category="lo",
+ description="MYANMAR LETTER DHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1013,
+ },
+ [0x1014]={
+ category="lo",
+ description="MYANMAR LETTER NA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1014,
+ },
+ [0x1015]={
+ category="lo",
+ description="MYANMAR LETTER PA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1015,
+ },
+ [0x1016]={
+ category="lo",
+ description="MYANMAR LETTER PHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1016,
+ },
+ [0x1017]={
+ category="lo",
+ description="MYANMAR LETTER BA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1017,
+ },
+ [0x1018]={
+ category="lo",
+ description="MYANMAR LETTER BHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1018,
+ },
+ [0x1019]={
+ category="lo",
+ description="MYANMAR LETTER MA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1019,
+ },
+ [0x101A]={
+ category="lo",
+ description="MYANMAR LETTER YA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x101A,
+ },
+ [0x101B]={
+ category="lo",
+ description="MYANMAR LETTER RA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x101B,
+ },
+ [0x101C]={
+ category="lo",
+ description="MYANMAR LETTER LA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x101C,
+ },
+ [0x101D]={
+ category="lo",
+ description="MYANMAR LETTER WA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x101D,
+ },
+ [0x101E]={
+ category="lo",
+ description="MYANMAR LETTER SA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x101E,
+ },
+ [0x101F]={
+ category="lo",
+ description="MYANMAR LETTER HA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x101F,
+ },
+ [0x1020]={
+ category="lo",
+ description="MYANMAR LETTER LLA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1020,
+ },
+ [0x1021]={
+ category="lo",
+ description="MYANMAR LETTER A",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1021,
+ },
+ [0x1023]={
+ category="lo",
+ description="MYANMAR LETTER I",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1023,
+ },
+ [0x1024]={
+ category="lo",
+ description="MYANMAR LETTER II",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1024,
+ },
+ [0x1025]={
+ category="lo",
+ description="MYANMAR LETTER U",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1025,
+ },
+ [0x1026]={
+ category="lo",
+ description="MYANMAR LETTER UU",
+ direction="l",
+ linebreak="sa",
+ specials={ "char", 0x1025, 0x102E },
+ unicodeslot=0x1026,
+ },
+ [0x1027]={
+ category="lo",
+ description="MYANMAR LETTER E",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1027,
+ },
+ [0x1029]={
+ category="lo",
+ description="MYANMAR LETTER O",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1029,
+ },
+ [0x102A]={
+ category="lo",
+ description="MYANMAR LETTER AU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x102A,
+ },
+ [0x102C]={
+ category="mc",
+ description="MYANMAR VOWEL SIGN AA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x102C,
+ },
+ [0x102D]={
+ category="mn",
+ description="MYANMAR VOWEL SIGN I",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x102D,
+ },
+ [0x102E]={
+ category="mn",
+ description="MYANMAR VOWEL SIGN II",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x102E,
+ },
+ [0x102F]={
+ category="mn",
+ description="MYANMAR VOWEL SIGN U",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x102F,
+ },
+ [0x1030]={
+ category="mn",
+ description="MYANMAR VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x1030,
+ },
+ [0x1031]={
+ category="mc",
+ description="MYANMAR VOWEL SIGN E",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1031,
+ },
+ [0x1032]={
+ category="mn",
+ description="MYANMAR VOWEL SIGN AI",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x1032,
+ },
+ [0x1036]={
+ category="mn",
+ description="MYANMAR SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x1036,
+ },
+ [0x1037]={
+ category="mn",
+ description="MYANMAR SIGN DOT BELOW",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x1037,
+ },
+ [0x1038]={
+ category="mc",
+ description="MYANMAR SIGN VISARGA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1038,
+ },
+ [0x1039]={
+ category="mn",
+ description="MYANMAR SIGN VIRAMA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x1039,
+ },
+ [0x1040]={
+ category="nd",
+ description="MYANMAR DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1040,
+ },
+ [0x1041]={
+ category="nd",
+ description="MYANMAR DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1041,
+ },
+ [0x1042]={
+ category="nd",
+ description="MYANMAR DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1042,
+ },
+ [0x1043]={
+ category="nd",
+ description="MYANMAR DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1043,
+ },
+ [0x1044]={
+ category="nd",
+ description="MYANMAR DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1044,
+ },
+ [0x1045]={
+ category="nd",
+ description="MYANMAR DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1045,
+ },
+ [0x1046]={
+ category="nd",
+ description="MYANMAR DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1046,
+ },
+ [0x1047]={
+ category="nd",
+ description="MYANMAR DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1047,
+ },
+ [0x1048]={
+ category="nd",
+ description="MYANMAR DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1048,
+ },
+ [0x1049]={
+ category="nd",
+ description="MYANMAR DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1049,
+ },
+ [0x104A]={
+ category="po",
+ description="MYANMAR SIGN LITTLE SECTION",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x104A,
+ },
+ [0x104B]={
+ category="po",
+ description="MYANMAR SIGN SECTION",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x104B,
+ },
+ [0x104C]={
+ category="po",
+ description="MYANMAR SYMBOL LOCATIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x104C,
+ },
+ [0x104D]={
+ category="po",
+ description="MYANMAR SYMBOL COMPLETED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x104D,
+ },
+ [0x104E]={
+ category="po",
+ description="MYANMAR SYMBOL AFOREMENTIONED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x104E,
+ },
+ [0x104F]={
+ category="po",
+ description="MYANMAR SYMBOL GENITIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x104F,
+ },
+ [0x1050]={
+ category="lo",
+ description="MYANMAR LETTER SHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1050,
+ },
+ [0x1051]={
+ category="lo",
+ description="MYANMAR LETTER SSA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1051,
+ },
+ [0x1052]={
+ category="lo",
+ description="MYANMAR LETTER VOCALIC R",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1052,
+ },
+ [0x1053]={
+ category="lo",
+ description="MYANMAR LETTER VOCALIC RR",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1053,
+ },
+ [0x1054]={
+ category="lo",
+ description="MYANMAR LETTER VOCALIC L",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1054,
+ },
+ [0x1055]={
+ category="lo",
+ description="MYANMAR LETTER VOCALIC LL",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1055,
+ },
+ [0x1056]={
+ category="mc",
+ description="MYANMAR VOWEL SIGN VOCALIC R",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1056,
+ },
+ [0x1057]={
+ category="mc",
+ description="MYANMAR VOWEL SIGN VOCALIC RR",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1057,
+ },
+ [0x1058]={
+ category="mn",
+ description="MYANMAR VOWEL SIGN VOCALIC L",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x1058,
+ },
+ [0x1059]={
+ category="mn",
+ description="MYANMAR VOWEL SIGN VOCALIC LL",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x1059,
+ },
+ [0x10A0]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER AN",
+ direction="l",
+ lccode=0x2D00,
+ linebreak="al",
+ unicodeslot=0x10A0,
+ },
+ [0x10A1]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER BAN",
+ direction="l",
+ lccode=0x2D01,
+ linebreak="al",
+ unicodeslot=0x10A1,
+ },
+ [0x10A2]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER GAN",
+ direction="l",
+ lccode=0x2D02,
+ linebreak="al",
+ unicodeslot=0x10A2,
+ },
+ [0x10A3]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER DON",
+ direction="l",
+ lccode=0x2D03,
+ linebreak="al",
+ unicodeslot=0x10A3,
+ },
+ [0x10A4]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER EN",
+ direction="l",
+ lccode=0x2D04,
+ linebreak="al",
+ unicodeslot=0x10A4,
+ },
+ [0x10A5]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER VIN",
+ direction="l",
+ lccode=0x2D05,
+ linebreak="al",
+ unicodeslot=0x10A5,
+ },
+ [0x10A6]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER ZEN",
+ direction="l",
+ lccode=0x2D06,
+ linebreak="al",
+ unicodeslot=0x10A6,
+ },
+ [0x10A7]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER TAN",
+ direction="l",
+ lccode=0x2D07,
+ linebreak="al",
+ unicodeslot=0x10A7,
+ },
+ [0x10A8]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER IN",
+ direction="l",
+ lccode=0x2D08,
+ linebreak="al",
+ unicodeslot=0x10A8,
+ },
+ [0x10A9]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER KAN",
+ direction="l",
+ lccode=0x2D09,
+ linebreak="al",
+ unicodeslot=0x10A9,
+ },
+ [0x10AA]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER LAS",
+ direction="l",
+ lccode=0x2D0A,
+ linebreak="al",
+ unicodeslot=0x10AA,
+ },
+ [0x10AB]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER MAN",
+ direction="l",
+ lccode=0x2D0B,
+ linebreak="al",
+ unicodeslot=0x10AB,
+ },
+ [0x10AC]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER NAR",
+ direction="l",
+ lccode=0x2D0C,
+ linebreak="al",
+ unicodeslot=0x10AC,
+ },
+ [0x10AD]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER ON",
+ direction="l",
+ lccode=0x2D0D,
+ linebreak="al",
+ unicodeslot=0x10AD,
+ },
+ [0x10AE]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER PAR",
+ direction="l",
+ lccode=0x2D0E,
+ linebreak="al",
+ unicodeslot=0x10AE,
+ },
+ [0x10AF]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER ZHAR",
+ direction="l",
+ lccode=0x2D0F,
+ linebreak="al",
+ unicodeslot=0x10AF,
+ },
+ [0x10B0]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER RAE",
+ direction="l",
+ lccode=0x2D10,
+ linebreak="al",
+ unicodeslot=0x10B0,
+ },
+ [0x10B1]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER SAN",
+ direction="l",
+ lccode=0x2D11,
+ linebreak="al",
+ unicodeslot=0x10B1,
+ },
+ [0x10B2]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER TAR",
+ direction="l",
+ lccode=0x2D12,
+ linebreak="al",
+ unicodeslot=0x10B2,
+ },
+ [0x10B3]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER UN",
+ direction="l",
+ lccode=0x2D13,
+ linebreak="al",
+ unicodeslot=0x10B3,
+ },
+ [0x10B4]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER PHAR",
+ direction="l",
+ lccode=0x2D14,
+ linebreak="al",
+ unicodeslot=0x10B4,
+ },
+ [0x10B5]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER KHAR",
+ direction="l",
+ lccode=0x2D15,
+ linebreak="al",
+ unicodeslot=0x10B5,
+ },
+ [0x10B6]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER GHAN",
+ direction="l",
+ lccode=0x2D16,
+ linebreak="al",
+ unicodeslot=0x10B6,
+ },
+ [0x10B7]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER QAR",
+ direction="l",
+ lccode=0x2D17,
+ linebreak="al",
+ unicodeslot=0x10B7,
+ },
+ [0x10B8]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER SHIN",
+ direction="l",
+ lccode=0x2D18,
+ linebreak="al",
+ unicodeslot=0x10B8,
+ },
+ [0x10B9]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER CHIN",
+ direction="l",
+ lccode=0x2D19,
+ linebreak="al",
+ unicodeslot=0x10B9,
+ },
+ [0x10BA]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER CAN",
+ direction="l",
+ lccode=0x2D1A,
+ linebreak="al",
+ unicodeslot=0x10BA,
+ },
+ [0x10BB]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER JIL",
+ direction="l",
+ lccode=0x2D1B,
+ linebreak="al",
+ unicodeslot=0x10BB,
+ },
+ [0x10BC]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER CIL",
+ direction="l",
+ lccode=0x2D1C,
+ linebreak="al",
+ unicodeslot=0x10BC,
+ },
+ [0x10BD]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER CHAR",
+ direction="l",
+ lccode=0x2D1D,
+ linebreak="al",
+ unicodeslot=0x10BD,
+ },
+ [0x10BE]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER XAN",
+ direction="l",
+ lccode=0x2D1E,
+ linebreak="al",
+ unicodeslot=0x10BE,
+ },
+ [0x10BF]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER JHAN",
+ direction="l",
+ lccode=0x2D1F,
+ linebreak="al",
+ unicodeslot=0x10BF,
+ },
+ [0x10C0]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER HAE",
+ direction="l",
+ lccode=0x2D20,
+ linebreak="al",
+ unicodeslot=0x10C0,
+ },
+ [0x10C1]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER HE",
+ direction="l",
+ lccode=0x2D21,
+ linebreak="al",
+ unicodeslot=0x10C1,
+ },
+ [0x10C2]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER HIE",
+ direction="l",
+ lccode=0x2D22,
+ linebreak="al",
+ unicodeslot=0x10C2,
+ },
+ [0x10C3]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER WE",
+ direction="l",
+ lccode=0x2D23,
+ linebreak="al",
+ unicodeslot=0x10C3,
+ },
+ [0x10C4]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER HAR",
+ direction="l",
+ lccode=0x2D24,
+ linebreak="al",
+ unicodeslot=0x10C4,
+ },
+ [0x10C5]={
+ category="lu",
+ description="GEORGIAN CAPITAL LETTER HOE",
+ direction="l",
+ lccode=0x2D25,
+ linebreak="al",
+ unicodeslot=0x10C5,
+ },
+ [0x10D0]={
+ category="lo",
+ description="GEORGIAN LETTER AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D0,
+ },
+ [0x10D1]={
+ category="lo",
+ description="GEORGIAN LETTER BAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D1,
+ },
+ [0x10D2]={
+ category="lo",
+ description="GEORGIAN LETTER GAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D2,
+ },
+ [0x10D3]={
+ category="lo",
+ description="GEORGIAN LETTER DON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D3,
+ },
+ [0x10D4]={
+ category="lo",
+ description="GEORGIAN LETTER EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D4,
+ },
+ [0x10D5]={
+ category="lo",
+ description="GEORGIAN LETTER VIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D5,
+ },
+ [0x10D6]={
+ category="lo",
+ description="GEORGIAN LETTER ZEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D6,
+ },
+ [0x10D7]={
+ category="lo",
+ description="GEORGIAN LETTER TAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D7,
+ },
+ [0x10D8]={
+ category="lo",
+ description="GEORGIAN LETTER IN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D8,
+ },
+ [0x10D9]={
+ category="lo",
+ description="GEORGIAN LETTER KAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10D9,
+ },
+ [0x10DA]={
+ category="lo",
+ description="GEORGIAN LETTER LAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10DA,
+ },
+ [0x10DB]={
+ category="lo",
+ description="GEORGIAN LETTER MAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10DB,
+ },
+ [0x10DC]={
+ category="lo",
+ description="GEORGIAN LETTER NAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10DC,
+ },
+ [0x10DD]={
+ category="lo",
+ description="GEORGIAN LETTER ON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10DD,
+ },
+ [0x10DE]={
+ category="lo",
+ description="GEORGIAN LETTER PAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10DE,
+ },
+ [0x10DF]={
+ category="lo",
+ description="GEORGIAN LETTER ZHAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10DF,
+ },
+ [0x10E0]={
+ category="lo",
+ description="GEORGIAN LETTER RAE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E0,
+ },
+ [0x10E1]={
+ category="lo",
+ description="GEORGIAN LETTER SAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E1,
+ },
+ [0x10E2]={
+ category="lo",
+ description="GEORGIAN LETTER TAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E2,
+ },
+ [0x10E3]={
+ category="lo",
+ description="GEORGIAN LETTER UN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E3,
+ },
+ [0x10E4]={
+ category="lo",
+ description="GEORGIAN LETTER PHAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E4,
+ },
+ [0x10E5]={
+ category="lo",
+ description="GEORGIAN LETTER KHAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E5,
+ },
+ [0x10E6]={
+ category="lo",
+ description="GEORGIAN LETTER GHAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E6,
+ },
+ [0x10E7]={
+ category="lo",
+ description="GEORGIAN LETTER QAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E7,
+ },
+ [0x10E8]={
+ category="lo",
+ description="GEORGIAN LETTER SHIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E8,
+ },
+ [0x10E9]={
+ category="lo",
+ description="GEORGIAN LETTER CHIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10E9,
+ },
+ [0x10EA]={
+ category="lo",
+ description="GEORGIAN LETTER CAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10EA,
+ },
+ [0x10EB]={
+ category="lo",
+ description="GEORGIAN LETTER JIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10EB,
+ },
+ [0x10EC]={
+ category="lo",
+ description="GEORGIAN LETTER CIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10EC,
+ },
+ [0x10ED]={
+ category="lo",
+ description="GEORGIAN LETTER CHAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10ED,
+ },
+ [0x10EE]={
+ category="lo",
+ description="GEORGIAN LETTER XAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10EE,
+ },
+ [0x10EF]={
+ category="lo",
+ description="GEORGIAN LETTER JHAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10EF,
+ },
+ [0x10F0]={
+ category="lo",
+ description="GEORGIAN LETTER HAE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F0,
+ },
+ [0x10F1]={
+ category="lo",
+ description="GEORGIAN LETTER HE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F1,
+ },
+ [0x10F2]={
+ category="lo",
+ description="GEORGIAN LETTER HIE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F2,
+ },
+ [0x10F3]={
+ category="lo",
+ description="GEORGIAN LETTER WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F3,
+ },
+ [0x10F4]={
+ category="lo",
+ description="GEORGIAN LETTER HAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F4,
+ },
+ [0x10F5]={
+ category="lo",
+ description="GEORGIAN LETTER HOE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F5,
+ },
+ [0x10F6]={
+ category="lo",
+ description="GEORGIAN LETTER FI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F6,
+ },
+ [0x10F7]={
+ category="lo",
+ description="GEORGIAN LETTER YN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F7,
+ },
+ [0x10F8]={
+ category="lo",
+ description="GEORGIAN LETTER ELIFI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F8,
+ },
+ [0x10F9]={
+ category="lo",
+ description="GEORGIAN LETTER TURNED GAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10F9,
+ },
+ [0x10FA]={
+ category="lo",
+ description="GEORGIAN LETTER AIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10FA,
+ },
+ [0x10FB]={
+ category="po",
+ description="GEORGIAN PARAGRAPH SEPARATOR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10FB,
+ },
+ [0x10FC]={
+ category="lm",
+ description="MODIFIER LETTER GEORGIAN NAR",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x10DC },
+ unicodeslot=0x10FC,
+ },
+ [0x1100]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1100,
+ },
+ [0x1101]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGKIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1101,
+ },
+ [0x1102]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG NIEUN",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1102,
+ },
+ [0x1103]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG TIKEUT",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1103,
+ },
+ [0x1104]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGTIKEUT",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1104,
+ },
+ [0x1105]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG RIEUL",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1105,
+ },
+ [0x1106]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG MIEUM",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1106,
+ },
+ [0x1107]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1107,
+ },
+ [0x1108]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGPIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1108,
+ },
+ [0x1109]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1109,
+ },
+ [0x110A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x110A,
+ },
+ [0x110B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x110B,
+ },
+ [0x110C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x110C,
+ },
+ [0x110D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGCIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x110D,
+ },
+ [0x110E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHIEUCH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x110E,
+ },
+ [0x110F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG KHIEUKH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x110F,
+ },
+ [0x1110]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG THIEUTH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1110,
+ },
+ [0x1111]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PHIEUPH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1111,
+ },
+ [0x1112]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG HIEUH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1112,
+ },
+ [0x1113]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG NIEUN-KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1113,
+ },
+ [0x1114]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGNIEUN",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1114,
+ },
+ [0x1115]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG NIEUN-TIKEUT",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1115,
+ },
+ [0x1116]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG NIEUN-PIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1116,
+ },
+ [0x1117]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG TIKEUT-KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1117,
+ },
+ [0x1118]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG RIEUL-NIEUN",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1118,
+ },
+ [0x1119]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGRIEUL",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1119,
+ },
+ [0x111A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG RIEUL-HIEUH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x111A,
+ },
+ [0x111B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG KAPYEOUNRIEUL",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x111B,
+ },
+ [0x111C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG MIEUM-PIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x111C,
+ },
+ [0x111D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG KAPYEOUNMIEUM",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x111D,
+ },
+ [0x111E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x111E,
+ },
+ [0x111F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-NIEUN",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x111F,
+ },
+ [0x1120]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-TIKEUT",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1120,
+ },
+ [0x1121]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-SIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1121,
+ },
+ [0x1122]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-SIOS-KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1122,
+ },
+ [0x1123]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-SIOS-TIKEUT",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1123,
+ },
+ [0x1124]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-SIOS-PIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1124,
+ },
+ [0x1125]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-SSANGSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1125,
+ },
+ [0x1126]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-SIOS-CIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1126,
+ },
+ [0x1127]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-CIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1127,
+ },
+ [0x1128]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-CHIEUCH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1128,
+ },
+ [0x1129]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-THIEUTH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1129,
+ },
+ [0x112A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PIEUP-PHIEUPH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x112A,
+ },
+ [0x112B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG KAPYEOUNPIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x112B,
+ },
+ [0x112C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG KAPYEOUNSSANGPIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x112C,
+ },
+ [0x112D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x112D,
+ },
+ [0x112E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-NIEUN",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x112E,
+ },
+ [0x112F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-TIKEUT",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x112F,
+ },
+ [0x1130]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-RIEUL",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1130,
+ },
+ [0x1131]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-MIEUM",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1131,
+ },
+ [0x1132]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-PIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1132,
+ },
+ [0x1133]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-PIEUP-KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1133,
+ },
+ [0x1134]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-SSANGSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1134,
+ },
+ [0x1135]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-IEUNG",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1135,
+ },
+ [0x1136]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-CIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1136,
+ },
+ [0x1137]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-CHIEUCH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1137,
+ },
+ [0x1138]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-KHIEUKH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1138,
+ },
+ [0x1139]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-THIEUTH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1139,
+ },
+ [0x113A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-PHIEUPH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x113A,
+ },
+ [0x113B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SIOS-HIEUH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x113B,
+ },
+ [0x113C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHITUEUMSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x113C,
+ },
+ [0x113D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHITUEUMSSANGSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x113D,
+ },
+ [0x113E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CEONGCHIEUMSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x113E,
+ },
+ [0x113F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x113F,
+ },
+ [0x1140]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PANSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1140,
+ },
+ [0x1141]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-KIYEOK",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1141,
+ },
+ [0x1142]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-TIKEUT",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1142,
+ },
+ [0x1143]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-MIEUM",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1143,
+ },
+ [0x1144]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-PIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1144,
+ },
+ [0x1145]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-SIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1145,
+ },
+ [0x1146]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-PANSIOS",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1146,
+ },
+ [0x1147]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGIEUNG",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1147,
+ },
+ [0x1148]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-CIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1148,
+ },
+ [0x1149]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-CHIEUCH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1149,
+ },
+ [0x114A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-THIEUTH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x114A,
+ },
+ [0x114B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG IEUNG-PHIEUPH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x114B,
+ },
+ [0x114C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG YESIEUNG",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x114C,
+ },
+ [0x114D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CIEUC-IEUNG",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x114D,
+ },
+ [0x114E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHITUEUMCIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x114E,
+ },
+ [0x114F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHITUEUMSSANGCIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x114F,
+ },
+ [0x1150]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CEONGCHIEUMCIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1150,
+ },
+ [0x1151]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1151,
+ },
+ [0x1152]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHIEUCH-KHIEUKH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1152,
+ },
+ [0x1153]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHIEUCH-HIEUH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1153,
+ },
+ [0x1154]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CHITUEUMCHIEUCH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1154,
+ },
+ [0x1155]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG CEONGCHIEUMCHIEUCH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1155,
+ },
+ [0x1156]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG PHIEUPH-PIEUP",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1156,
+ },
+ [0x1157]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG KAPYEOUNPHIEUPH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1157,
+ },
+ [0x1158]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG SSANGHIEUH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1158,
+ },
+ [0x1159]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG YEORINHIEUH",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x1159,
+ },
+ [0x115F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL CHOSEONG FILLER",
+ direction="l",
+ linebreak="jl",
+ unicodeslot=0x115F,
+ },
+ [0x1160]={
+ category="lo",
+ description="HANGUL JUNGSEONG FILLER",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1160,
+ },
+ [0x1161]={
+ category="lo",
+ description="HANGUL JUNGSEONG A",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1161,
+ },
+ [0x1162]={
+ category="lo",
+ description="HANGUL JUNGSEONG AE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1162,
+ },
+ [0x1163]={
+ category="lo",
+ description="HANGUL JUNGSEONG YA",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1163,
+ },
+ [0x1164]={
+ category="lo",
+ description="HANGUL JUNGSEONG YAE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1164,
+ },
+ [0x1165]={
+ category="lo",
+ description="HANGUL JUNGSEONG EO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1165,
+ },
+ [0x1166]={
+ category="lo",
+ description="HANGUL JUNGSEONG E",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1166,
+ },
+ [0x1167]={
+ category="lo",
+ description="HANGUL JUNGSEONG YEO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1167,
+ },
+ [0x1168]={
+ category="lo",
+ description="HANGUL JUNGSEONG YE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1168,
+ },
+ [0x1169]={
+ category="lo",
+ description="HANGUL JUNGSEONG O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1169,
+ },
+ [0x116A]={
+ category="lo",
+ description="HANGUL JUNGSEONG WA",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x116A,
+ },
+ [0x116B]={
+ category="lo",
+ description="HANGUL JUNGSEONG WAE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x116B,
+ },
+ [0x116C]={
+ category="lo",
+ description="HANGUL JUNGSEONG OE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x116C,
+ },
+ [0x116D]={
+ category="lo",
+ description="HANGUL JUNGSEONG YO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x116D,
+ },
+ [0x116E]={
+ category="lo",
+ description="HANGUL JUNGSEONG U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x116E,
+ },
+ [0x116F]={
+ category="lo",
+ description="HANGUL JUNGSEONG WEO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x116F,
+ },
+ [0x1170]={
+ category="lo",
+ description="HANGUL JUNGSEONG WE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1170,
+ },
+ [0x1171]={
+ category="lo",
+ description="HANGUL JUNGSEONG WI",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1171,
+ },
+ [0x1172]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1172,
+ },
+ [0x1173]={
+ category="lo",
+ description="HANGUL JUNGSEONG EU",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1173,
+ },
+ [0x1174]={
+ category="lo",
+ description="HANGUL JUNGSEONG YI",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1174,
+ },
+ [0x1175]={
+ category="lo",
+ description="HANGUL JUNGSEONG I",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1175,
+ },
+ [0x1176]={
+ category="lo",
+ description="HANGUL JUNGSEONG A-O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1176,
+ },
+ [0x1177]={
+ category="lo",
+ description="HANGUL JUNGSEONG A-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1177,
+ },
+ [0x1178]={
+ category="lo",
+ description="HANGUL JUNGSEONG YA-O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1178,
+ },
+ [0x1179]={
+ category="lo",
+ description="HANGUL JUNGSEONG YA-YO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1179,
+ },
+ [0x117A]={
+ category="lo",
+ description="HANGUL JUNGSEONG EO-O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x117A,
+ },
+ [0x117B]={
+ category="lo",
+ description="HANGUL JUNGSEONG EO-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x117B,
+ },
+ [0x117C]={
+ category="lo",
+ description="HANGUL JUNGSEONG EO-EU",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x117C,
+ },
+ [0x117D]={
+ category="lo",
+ description="HANGUL JUNGSEONG YEO-O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x117D,
+ },
+ [0x117E]={
+ category="lo",
+ description="HANGUL JUNGSEONG YEO-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x117E,
+ },
+ [0x117F]={
+ category="lo",
+ description="HANGUL JUNGSEONG O-EO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x117F,
+ },
+ [0x1180]={
+ category="lo",
+ description="HANGUL JUNGSEONG O-E",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1180,
+ },
+ [0x1181]={
+ category="lo",
+ description="HANGUL JUNGSEONG O-YE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1181,
+ },
+ [0x1182]={
+ category="lo",
+ description="HANGUL JUNGSEONG O-O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1182,
+ },
+ [0x1183]={
+ category="lo",
+ description="HANGUL JUNGSEONG O-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1183,
+ },
+ [0x1184]={
+ category="lo",
+ description="HANGUL JUNGSEONG YO-YA",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1184,
+ },
+ [0x1185]={
+ category="lo",
+ description="HANGUL JUNGSEONG YO-YAE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1185,
+ },
+ [0x1186]={
+ category="lo",
+ description="HANGUL JUNGSEONG YO-YEO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1186,
+ },
+ [0x1187]={
+ category="lo",
+ description="HANGUL JUNGSEONG YO-O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1187,
+ },
+ [0x1188]={
+ category="lo",
+ description="HANGUL JUNGSEONG YO-I",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1188,
+ },
+ [0x1189]={
+ category="lo",
+ description="HANGUL JUNGSEONG U-A",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1189,
+ },
+ [0x118A]={
+ category="lo",
+ description="HANGUL JUNGSEONG U-AE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x118A,
+ },
+ [0x118B]={
+ category="lo",
+ description="HANGUL JUNGSEONG U-EO-EU",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x118B,
+ },
+ [0x118C]={
+ category="lo",
+ description="HANGUL JUNGSEONG U-YE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x118C,
+ },
+ [0x118D]={
+ category="lo",
+ description="HANGUL JUNGSEONG U-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x118D,
+ },
+ [0x118E]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU-A",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x118E,
+ },
+ [0x118F]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU-EO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x118F,
+ },
+ [0x1190]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU-E",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1190,
+ },
+ [0x1191]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU-YEO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1191,
+ },
+ [0x1192]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU-YE",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1192,
+ },
+ [0x1193]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1193,
+ },
+ [0x1194]={
+ category="lo",
+ description="HANGUL JUNGSEONG YU-I",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1194,
+ },
+ [0x1195]={
+ category="lo",
+ description="HANGUL JUNGSEONG EU-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1195,
+ },
+ [0x1196]={
+ category="lo",
+ description="HANGUL JUNGSEONG EU-EU",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1196,
+ },
+ [0x1197]={
+ category="lo",
+ description="HANGUL JUNGSEONG YI-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1197,
+ },
+ [0x1198]={
+ category="lo",
+ description="HANGUL JUNGSEONG I-A",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1198,
+ },
+ [0x1199]={
+ category="lo",
+ description="HANGUL JUNGSEONG I-YA",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x1199,
+ },
+ [0x119A]={
+ category="lo",
+ description="HANGUL JUNGSEONG I-O",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x119A,
+ },
+ [0x119B]={
+ category="lo",
+ description="HANGUL JUNGSEONG I-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x119B,
+ },
+ [0x119C]={
+ category="lo",
+ description="HANGUL JUNGSEONG I-EU",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x119C,
+ },
+ [0x119D]={
+ category="lo",
+ description="HANGUL JUNGSEONG I-ARAEA",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x119D,
+ },
+ [0x119E]={
+ category="lo",
+ description="HANGUL JUNGSEONG ARAEA",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x119E,
+ },
+ [0x119F]={
+ category="lo",
+ description="HANGUL JUNGSEONG ARAEA-EO",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x119F,
+ },
+ [0x11A0]={
+ category="lo",
+ description="HANGUL JUNGSEONG ARAEA-U",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x11A0,
+ },
+ [0x11A1]={
+ category="lo",
+ description="HANGUL JUNGSEONG ARAEA-I",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x11A1,
+ },
+ [0x11A2]={
+ category="lo",
+ description="HANGUL JUNGSEONG SSANGARAEA",
+ direction="l",
+ linebreak="jv",
+ unicodeslot=0x11A2,
+ },
+ [0x11A8]={
+ category="lo",
+ description="HANGUL JONGSEONG KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11A8,
+ },
+ [0x11A9]={
+ category="lo",
+ description="HANGUL JONGSEONG SSANGKIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11A9,
+ },
+ [0x11AA]={
+ category="lo",
+ description="HANGUL JONGSEONG KIYEOK-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11AA,
+ },
+ [0x11AB]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11AB,
+ },
+ [0x11AC]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN-CIEUC",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11AC,
+ },
+ [0x11AD]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN-HIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11AD,
+ },
+ [0x11AE]={
+ category="lo",
+ description="HANGUL JONGSEONG TIKEUT",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11AE,
+ },
+ [0x11AF]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11AF,
+ },
+ [0x11B0]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B0,
+ },
+ [0x11B1]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-MIEUM",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B1,
+ },
+ [0x11B2]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-PIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B2,
+ },
+ [0x11B3]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B3,
+ },
+ [0x11B4]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-THIEUTH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B4,
+ },
+ [0x11B5]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-PHIEUPH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B5,
+ },
+ [0x11B6]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-HIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B6,
+ },
+ [0x11B7]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B7,
+ },
+ [0x11B8]={
+ category="lo",
+ description="HANGUL JONGSEONG PIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B8,
+ },
+ [0x11B9]={
+ category="lo",
+ description="HANGUL JONGSEONG PIEUP-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11B9,
+ },
+ [0x11BA]={
+ category="lo",
+ description="HANGUL JONGSEONG SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11BA,
+ },
+ [0x11BB]={
+ category="lo",
+ description="HANGUL JONGSEONG SSANGSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11BB,
+ },
+ [0x11BC]={
+ category="lo",
+ description="HANGUL JONGSEONG IEUNG",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11BC,
+ },
+ [0x11BD]={
+ category="lo",
+ description="HANGUL JONGSEONG CIEUC",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11BD,
+ },
+ [0x11BE]={
+ category="lo",
+ description="HANGUL JONGSEONG CHIEUCH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11BE,
+ },
+ [0x11BF]={
+ category="lo",
+ description="HANGUL JONGSEONG KHIEUKH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11BF,
+ },
+ [0x11C0]={
+ category="lo",
+ description="HANGUL JONGSEONG THIEUTH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C0,
+ },
+ [0x11C1]={
+ category="lo",
+ description="HANGUL JONGSEONG PHIEUPH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C1,
+ },
+ [0x11C2]={
+ category="lo",
+ description="HANGUL JONGSEONG HIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C2,
+ },
+ [0x11C3]={
+ category="lo",
+ description="HANGUL JONGSEONG KIYEOK-RIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C3,
+ },
+ [0x11C4]={
+ category="lo",
+ description="HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C4,
+ },
+ [0x11C5]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C5,
+ },
+ [0x11C6]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN-TIKEUT",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C6,
+ },
+ [0x11C7]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C7,
+ },
+ [0x11C8]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN-PANSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C8,
+ },
+ [0x11C9]={
+ category="lo",
+ description="HANGUL JONGSEONG NIEUN-THIEUTH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11C9,
+ },
+ [0x11CA]={
+ category="lo",
+ description="HANGUL JONGSEONG TIKEUT-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11CA,
+ },
+ [0x11CB]={
+ category="lo",
+ description="HANGUL JONGSEONG TIKEUT-RIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11CB,
+ },
+ [0x11CC]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-KIYEOK-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11CC,
+ },
+ [0x11CD]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-NIEUN",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11CD,
+ },
+ [0x11CE]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-TIKEUT",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11CE,
+ },
+ [0x11CF]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11CF,
+ },
+ [0x11D0]={
+ category="lo",
+ description="HANGUL JONGSEONG SSANGRIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D0,
+ },
+ [0x11D1]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D1,
+ },
+ [0x11D2]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-MIEUM-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D2,
+ },
+ [0x11D3]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-PIEUP-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D3,
+ },
+ [0x11D4]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-PIEUP-HIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D4,
+ },
+ [0x11D5]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D5,
+ },
+ [0x11D6]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-SSANGSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D6,
+ },
+ [0x11D7]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-PANSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D7,
+ },
+ [0x11D8]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-KHIEUKH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D8,
+ },
+ [0x11D9]={
+ category="lo",
+ description="HANGUL JONGSEONG RIEUL-YEORINHIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11D9,
+ },
+ [0x11DA]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11DA,
+ },
+ [0x11DB]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-RIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11DB,
+ },
+ [0x11DC]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-PIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11DC,
+ },
+ [0x11DD]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11DD,
+ },
+ [0x11DE]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-SSANGSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11DE,
+ },
+ [0x11DF]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-PANSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11DF,
+ },
+ [0x11E0]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-CHIEUCH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E0,
+ },
+ [0x11E1]={
+ category="lo",
+ description="HANGUL JONGSEONG MIEUM-HIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E1,
+ },
+ [0x11E2]={
+ category="lo",
+ description="HANGUL JONGSEONG KAPYEOUNMIEUM",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E2,
+ },
+ [0x11E3]={
+ category="lo",
+ description="HANGUL JONGSEONG PIEUP-RIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E3,
+ },
+ [0x11E4]={
+ category="lo",
+ description="HANGUL JONGSEONG PIEUP-PHIEUPH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E4,
+ },
+ [0x11E5]={
+ category="lo",
+ description="HANGUL JONGSEONG PIEUP-HIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E5,
+ },
+ [0x11E6]={
+ category="lo",
+ description="HANGUL JONGSEONG KAPYEOUNPIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E6,
+ },
+ [0x11E7]={
+ category="lo",
+ description="HANGUL JONGSEONG SIOS-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E7,
+ },
+ [0x11E8]={
+ category="lo",
+ description="HANGUL JONGSEONG SIOS-TIKEUT",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E8,
+ },
+ [0x11E9]={
+ category="lo",
+ description="HANGUL JONGSEONG SIOS-RIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11E9,
+ },
+ [0x11EA]={
+ category="lo",
+ description="HANGUL JONGSEONG SIOS-PIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11EA,
+ },
+ [0x11EB]={
+ category="lo",
+ description="HANGUL JONGSEONG PANSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11EB,
+ },
+ [0x11EC]={
+ category="lo",
+ description="HANGUL JONGSEONG IEUNG-KIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11EC,
+ },
+ [0x11ED]={
+ category="lo",
+ description="HANGUL JONGSEONG IEUNG-SSANGKIYEOK",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11ED,
+ },
+ [0x11EE]={
+ category="lo",
+ description="HANGUL JONGSEONG SSANGIEUNG",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11EE,
+ },
+ [0x11EF]={
+ category="lo",
+ description="HANGUL JONGSEONG IEUNG-KHIEUKH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11EF,
+ },
+ [0x11F0]={
+ category="lo",
+ description="HANGUL JONGSEONG YESIEUNG",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F0,
+ },
+ [0x11F1]={
+ category="lo",
+ description="HANGUL JONGSEONG YESIEUNG-SIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F1,
+ },
+ [0x11F2]={
+ category="lo",
+ description="HANGUL JONGSEONG YESIEUNG-PANSIOS",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F2,
+ },
+ [0x11F3]={
+ category="lo",
+ description="HANGUL JONGSEONG PHIEUPH-PIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F3,
+ },
+ [0x11F4]={
+ category="lo",
+ description="HANGUL JONGSEONG KAPYEOUNPHIEUPH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F4,
+ },
+ [0x11F5]={
+ category="lo",
+ description="HANGUL JONGSEONG HIEUH-NIEUN",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F5,
+ },
+ [0x11F6]={
+ category="lo",
+ description="HANGUL JONGSEONG HIEUH-RIEUL",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F6,
+ },
+ [0x11F7]={
+ category="lo",
+ description="HANGUL JONGSEONG HIEUH-MIEUM",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F7,
+ },
+ [0x11F8]={
+ category="lo",
+ description="HANGUL JONGSEONG HIEUH-PIEUP",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F8,
+ },
+ [0x11F9]={
+ category="lo",
+ description="HANGUL JONGSEONG YEORINHIEUH",
+ direction="l",
+ linebreak="jt",
+ unicodeslot=0x11F9,
+ },
+ [0x1200]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1200,
+ },
+ [0x1201]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1201,
+ },
+ [0x1202]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1202,
+ },
+ [0x1203]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1203,
+ },
+ [0x1204]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1204,
+ },
+ [0x1205]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1205,
+ },
+ [0x1206]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1206,
+ },
+ [0x1207]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1207,
+ },
+ [0x1208]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1208,
+ },
+ [0x1209]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1209,
+ },
+ [0x120A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A,
+ },
+ [0x120B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B,
+ },
+ [0x120C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C,
+ },
+ [0x120D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D,
+ },
+ [0x120E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E,
+ },
+ [0x120F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F,
+ },
+ [0x1210]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1210,
+ },
+ [0x1211]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1211,
+ },
+ [0x1212]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1212,
+ },
+ [0x1213]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1213,
+ },
+ [0x1214]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1214,
+ },
+ [0x1215]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1215,
+ },
+ [0x1216]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1216,
+ },
+ [0x1217]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE HHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1217,
+ },
+ [0x1218]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1218,
+ },
+ [0x1219]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1219,
+ },
+ [0x121A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A,
+ },
+ [0x121B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B,
+ },
+ [0x121C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C,
+ },
+ [0x121D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D,
+ },
+ [0x121E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E,
+ },
+ [0x121F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F,
+ },
+ [0x1220]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1220,
+ },
+ [0x1221]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1221,
+ },
+ [0x1222]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1222,
+ },
+ [0x1223]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1223,
+ },
+ [0x1224]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1224,
+ },
+ [0x1225]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1225,
+ },
+ [0x1226]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1226,
+ },
+ [0x1227]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SZWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1227,
+ },
+ [0x1228]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1228,
+ },
+ [0x1229]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1229,
+ },
+ [0x122A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A,
+ },
+ [0x122B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B,
+ },
+ [0x122C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE REE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C,
+ },
+ [0x122D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D,
+ },
+ [0x122E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E,
+ },
+ [0x122F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F,
+ },
+ [0x1230]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1230,
+ },
+ [0x1231]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1231,
+ },
+ [0x1232]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1232,
+ },
+ [0x1233]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1233,
+ },
+ [0x1234]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1234,
+ },
+ [0x1235]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1235,
+ },
+ [0x1236]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1236,
+ },
+ [0x1237]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1237,
+ },
+ [0x1238]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1238,
+ },
+ [0x1239]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1239,
+ },
+ [0x123A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x123A,
+ },
+ [0x123B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x123B,
+ },
+ [0x123C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x123C,
+ },
+ [0x123D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x123D,
+ },
+ [0x123E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x123E,
+ },
+ [0x123F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x123F,
+ },
+ [0x1240]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1240,
+ },
+ [0x1241]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1241,
+ },
+ [0x1242]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1242,
+ },
+ [0x1243]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1243,
+ },
+ [0x1244]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1244,
+ },
+ [0x1245]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1245,
+ },
+ [0x1246]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1246,
+ },
+ [0x1247]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1247,
+ },
+ [0x1248]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1248,
+ },
+ [0x124A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x124A,
+ },
+ [0x124B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x124B,
+ },
+ [0x124C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x124C,
+ },
+ [0x124D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x124D,
+ },
+ [0x1250]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1250,
+ },
+ [0x1251]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1251,
+ },
+ [0x1252]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1252,
+ },
+ [0x1253]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1253,
+ },
+ [0x1254]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1254,
+ },
+ [0x1255]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1255,
+ },
+ [0x1256]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1256,
+ },
+ [0x1258]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1258,
+ },
+ [0x125A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x125A,
+ },
+ [0x125B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x125B,
+ },
+ [0x125C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x125C,
+ },
+ [0x125D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QHWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x125D,
+ },
+ [0x1260]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1260,
+ },
+ [0x1261]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1261,
+ },
+ [0x1262]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1262,
+ },
+ [0x1263]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1263,
+ },
+ [0x1264]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1264,
+ },
+ [0x1265]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1265,
+ },
+ [0x1266]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1266,
+ },
+ [0x1267]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1267,
+ },
+ [0x1268]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1268,
+ },
+ [0x1269]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1269,
+ },
+ [0x126A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x126A,
+ },
+ [0x126B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x126B,
+ },
+ [0x126C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x126C,
+ },
+ [0x126D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x126D,
+ },
+ [0x126E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x126E,
+ },
+ [0x126F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE VWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x126F,
+ },
+ [0x1270]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1270,
+ },
+ [0x1271]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1271,
+ },
+ [0x1272]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1272,
+ },
+ [0x1273]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1273,
+ },
+ [0x1274]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1274,
+ },
+ [0x1275]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1275,
+ },
+ [0x1276]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1276,
+ },
+ [0x1277]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1277,
+ },
+ [0x1278]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1278,
+ },
+ [0x1279]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1279,
+ },
+ [0x127A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x127A,
+ },
+ [0x127B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x127B,
+ },
+ [0x127C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x127C,
+ },
+ [0x127D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x127D,
+ },
+ [0x127E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x127E,
+ },
+ [0x127F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x127F,
+ },
+ [0x1280]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1280,
+ },
+ [0x1281]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1281,
+ },
+ [0x1282]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1282,
+ },
+ [0x1283]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1283,
+ },
+ [0x1284]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1284,
+ },
+ [0x1285]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1285,
+ },
+ [0x1286]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1286,
+ },
+ [0x1287]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1287,
+ },
+ [0x1288]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1288,
+ },
+ [0x128A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x128A,
+ },
+ [0x128B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x128B,
+ },
+ [0x128C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x128C,
+ },
+ [0x128D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x128D,
+ },
+ [0x1290]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1290,
+ },
+ [0x1291]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1291,
+ },
+ [0x1292]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1292,
+ },
+ [0x1293]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1293,
+ },
+ [0x1294]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1294,
+ },
+ [0x1295]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1295,
+ },
+ [0x1296]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1296,
+ },
+ [0x1297]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1297,
+ },
+ [0x1298]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1298,
+ },
+ [0x1299]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1299,
+ },
+ [0x129A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x129A,
+ },
+ [0x129B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x129B,
+ },
+ [0x129C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x129C,
+ },
+ [0x129D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x129D,
+ },
+ [0x129E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x129E,
+ },
+ [0x129F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x129F,
+ },
+ [0x12A0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A0,
+ },
+ [0x12A1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A1,
+ },
+ [0x12A2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A2,
+ },
+ [0x12A3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A3,
+ },
+ [0x12A4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A4,
+ },
+ [0x12A5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A5,
+ },
+ [0x12A6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A6,
+ },
+ [0x12A7]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A7,
+ },
+ [0x12A8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A8,
+ },
+ [0x12A9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12A9,
+ },
+ [0x12AA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12AA,
+ },
+ [0x12AB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12AB,
+ },
+ [0x12AC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12AC,
+ },
+ [0x12AD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12AD,
+ },
+ [0x12AE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12AE,
+ },
+ [0x12AF]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12AF,
+ },
+ [0x12B0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12B0,
+ },
+ [0x12B2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12B2,
+ },
+ [0x12B3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12B3,
+ },
+ [0x12B4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12B4,
+ },
+ [0x12B5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12B5,
+ },
+ [0x12B8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12B8,
+ },
+ [0x12B9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12B9,
+ },
+ [0x12BA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12BA,
+ },
+ [0x12BB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12BB,
+ },
+ [0x12BC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12BC,
+ },
+ [0x12BD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12BD,
+ },
+ [0x12BE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12BE,
+ },
+ [0x12C0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12C0,
+ },
+ [0x12C2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12C2,
+ },
+ [0x12C3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12C3,
+ },
+ [0x12C4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12C4,
+ },
+ [0x12C5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KXWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12C5,
+ },
+ [0x12C8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12C8,
+ },
+ [0x12C9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12C9,
+ },
+ [0x12CA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12CA,
+ },
+ [0x12CB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12CB,
+ },
+ [0x12CC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12CC,
+ },
+ [0x12CD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12CD,
+ },
+ [0x12CE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12CE,
+ },
+ [0x12CF]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE WOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12CF,
+ },
+ [0x12D0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHARYNGEAL A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D0,
+ },
+ [0x12D1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHARYNGEAL U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D1,
+ },
+ [0x12D2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHARYNGEAL I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D2,
+ },
+ [0x12D3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHARYNGEAL AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D3,
+ },
+ [0x12D4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHARYNGEAL EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D4,
+ },
+ [0x12D5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHARYNGEAL E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D5,
+ },
+ [0x12D6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHARYNGEAL O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D6,
+ },
+ [0x12D8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D8,
+ },
+ [0x12D9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12D9,
+ },
+ [0x12DA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12DA,
+ },
+ [0x12DB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12DB,
+ },
+ [0x12DC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12DC,
+ },
+ [0x12DD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12DD,
+ },
+ [0x12DE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12DE,
+ },
+ [0x12DF]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12DF,
+ },
+ [0x12E0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E0,
+ },
+ [0x12E1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E1,
+ },
+ [0x12E2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E2,
+ },
+ [0x12E3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E3,
+ },
+ [0x12E4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E4,
+ },
+ [0x12E5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E5,
+ },
+ [0x12E6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E6,
+ },
+ [0x12E7]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E7,
+ },
+ [0x12E8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E8,
+ },
+ [0x12E9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12E9,
+ },
+ [0x12EA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12EA,
+ },
+ [0x12EB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12EB,
+ },
+ [0x12EC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12EC,
+ },
+ [0x12ED]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12ED,
+ },
+ [0x12EE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12EE,
+ },
+ [0x12EF]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE YOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12EF,
+ },
+ [0x12F0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F0,
+ },
+ [0x12F1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F1,
+ },
+ [0x12F2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F2,
+ },
+ [0x12F3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F3,
+ },
+ [0x12F4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F4,
+ },
+ [0x12F5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F5,
+ },
+ [0x12F6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F6,
+ },
+ [0x12F7]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F7,
+ },
+ [0x12F8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F8,
+ },
+ [0x12F9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12F9,
+ },
+ [0x12FA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12FA,
+ },
+ [0x12FB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12FB,
+ },
+ [0x12FC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12FC,
+ },
+ [0x12FD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12FD,
+ },
+ [0x12FE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12FE,
+ },
+ [0x12FF]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12FF,
+ },
+ [0x1300]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1300,
+ },
+ [0x1301]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1301,
+ },
+ [0x1302]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1302,
+ },
+ [0x1303]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1303,
+ },
+ [0x1304]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1304,
+ },
+ [0x1305]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1305,
+ },
+ [0x1306]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1306,
+ },
+ [0x1307]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1307,
+ },
+ [0x1308]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1308,
+ },
+ [0x1309]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1309,
+ },
+ [0x130A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x130A,
+ },
+ [0x130B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x130B,
+ },
+ [0x130C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x130C,
+ },
+ [0x130D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x130D,
+ },
+ [0x130E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x130E,
+ },
+ [0x130F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x130F,
+ },
+ [0x1310]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1310,
+ },
+ [0x1312]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1312,
+ },
+ [0x1313]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1313,
+ },
+ [0x1314]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1314,
+ },
+ [0x1315]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1315,
+ },
+ [0x1318]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1318,
+ },
+ [0x1319]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1319,
+ },
+ [0x131A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x131A,
+ },
+ [0x131B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x131B,
+ },
+ [0x131C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x131C,
+ },
+ [0x131D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x131D,
+ },
+ [0x131E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x131E,
+ },
+ [0x131F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x131F,
+ },
+ [0x1320]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1320,
+ },
+ [0x1321]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1321,
+ },
+ [0x1322]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1322,
+ },
+ [0x1323]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1323,
+ },
+ [0x1324]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1324,
+ },
+ [0x1325]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1325,
+ },
+ [0x1326]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1326,
+ },
+ [0x1327]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1327,
+ },
+ [0x1328]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1328,
+ },
+ [0x1329]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1329,
+ },
+ [0x132A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x132A,
+ },
+ [0x132B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x132B,
+ },
+ [0x132C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x132C,
+ },
+ [0x132D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x132D,
+ },
+ [0x132E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x132E,
+ },
+ [0x132F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x132F,
+ },
+ [0x1330]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1330,
+ },
+ [0x1331]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1331,
+ },
+ [0x1332]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1332,
+ },
+ [0x1333]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1333,
+ },
+ [0x1334]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1334,
+ },
+ [0x1335]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1335,
+ },
+ [0x1336]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1336,
+ },
+ [0x1337]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1337,
+ },
+ [0x1338]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1338,
+ },
+ [0x1339]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1339,
+ },
+ [0x133A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x133A,
+ },
+ [0x133B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x133B,
+ },
+ [0x133C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x133C,
+ },
+ [0x133D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x133D,
+ },
+ [0x133E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x133E,
+ },
+ [0x133F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TSWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x133F,
+ },
+ [0x1340]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1340,
+ },
+ [0x1341]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1341,
+ },
+ [0x1342]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1342,
+ },
+ [0x1343]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1343,
+ },
+ [0x1344]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1344,
+ },
+ [0x1345]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1345,
+ },
+ [0x1346]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1346,
+ },
+ [0x1347]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TZOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1347,
+ },
+ [0x1348]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1348,
+ },
+ [0x1349]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1349,
+ },
+ [0x134A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x134A,
+ },
+ [0x134B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x134B,
+ },
+ [0x134C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x134C,
+ },
+ [0x134D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x134D,
+ },
+ [0x134E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x134E,
+ },
+ [0x134F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x134F,
+ },
+ [0x1350]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1350,
+ },
+ [0x1351]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1351,
+ },
+ [0x1352]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1352,
+ },
+ [0x1353]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1353,
+ },
+ [0x1354]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1354,
+ },
+ [0x1355]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1355,
+ },
+ [0x1356]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1356,
+ },
+ [0x1357]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1357,
+ },
+ [0x1358]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE RYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1358,
+ },
+ [0x1359]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1359,
+ },
+ [0x135A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x135A,
+ },
+ [0x135F]={
+ category="mn",
+ description="ETHIOPIC COMBINING GEMINATION MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x135F,
+ },
+ [0x1360]={
+ category="so",
+ description="ETHIOPIC SECTION MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1360,
+ },
+ [0x1361]={
+ category="po",
+ description="ETHIOPIC WORDSPACE",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1361,
+ },
+ [0x1362]={
+ category="po",
+ description="ETHIOPIC FULL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1362,
+ },
+ [0x1363]={
+ category="po",
+ description="ETHIOPIC COMMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1363,
+ },
+ [0x1364]={
+ category="po",
+ description="ETHIOPIC SEMICOLON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1364,
+ },
+ [0x1365]={
+ category="po",
+ description="ETHIOPIC COLON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1365,
+ },
+ [0x1366]={
+ category="po",
+ description="ETHIOPIC PREFACE COLON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1366,
+ },
+ [0x1367]={
+ category="po",
+ description="ETHIOPIC QUESTION MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1367,
+ },
+ [0x1368]={
+ category="po",
+ description="ETHIOPIC PARAGRAPH SEPARATOR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1368,
+ },
+ [0x1369]={
+ category="no",
+ description="ETHIOPIC DIGIT ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1369,
+ },
+ [0x136A]={
+ category="no",
+ description="ETHIOPIC DIGIT TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x136A,
+ },
+ [0x136B]={
+ category="no",
+ description="ETHIOPIC DIGIT THREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x136B,
+ },
+ [0x136C]={
+ category="no",
+ description="ETHIOPIC DIGIT FOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x136C,
+ },
+ [0x136D]={
+ category="no",
+ description="ETHIOPIC DIGIT FIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x136D,
+ },
+ [0x136E]={
+ category="no",
+ description="ETHIOPIC DIGIT SIX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x136E,
+ },
+ [0x136F]={
+ category="no",
+ description="ETHIOPIC DIGIT SEVEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x136F,
+ },
+ [0x1370]={
+ category="no",
+ description="ETHIOPIC DIGIT EIGHT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1370,
+ },
+ [0x1371]={
+ category="no",
+ description="ETHIOPIC DIGIT NINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1371,
+ },
+ [0x1372]={
+ category="no",
+ description="ETHIOPIC NUMBER TEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1372,
+ },
+ [0x1373]={
+ category="no",
+ description="ETHIOPIC NUMBER TWENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1373,
+ },
+ [0x1374]={
+ category="no",
+ description="ETHIOPIC NUMBER THIRTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1374,
+ },
+ [0x1375]={
+ category="no",
+ description="ETHIOPIC NUMBER FORTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1375,
+ },
+ [0x1376]={
+ category="no",
+ description="ETHIOPIC NUMBER FIFTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1376,
+ },
+ [0x1377]={
+ category="no",
+ description="ETHIOPIC NUMBER SIXTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1377,
+ },
+ [0x1378]={
+ category="no",
+ description="ETHIOPIC NUMBER SEVENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1378,
+ },
+ [0x1379]={
+ category="no",
+ description="ETHIOPIC NUMBER EIGHTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1379,
+ },
+ [0x137A]={
+ category="no",
+ description="ETHIOPIC NUMBER NINETY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x137A,
+ },
+ [0x137B]={
+ category="no",
+ description="ETHIOPIC NUMBER HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x137B,
+ },
+ [0x137C]={
+ category="no",
+ description="ETHIOPIC NUMBER TEN THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x137C,
+ },
+ [0x1380]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SEBATBEIT MWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1380,
+ },
+ [0x1381]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1381,
+ },
+ [0x1382]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1382,
+ },
+ [0x1383]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1383,
+ },
+ [0x1384]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SEBATBEIT BWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1384,
+ },
+ [0x1385]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1385,
+ },
+ [0x1386]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1386,
+ },
+ [0x1387]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1387,
+ },
+ [0x1388]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SEBATBEIT FWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1388,
+ },
+ [0x1389]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1389,
+ },
+ [0x138A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x138A,
+ },
+ [0x138B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE FWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x138B,
+ },
+ [0x138C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SEBATBEIT PWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x138C,
+ },
+ [0x138D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x138D,
+ },
+ [0x138E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x138E,
+ },
+ [0x138F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x138F,
+ },
+ [0x1390]={
+ category="so",
+ description="ETHIOPIC TONAL MARK YIZET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1390,
+ },
+ [0x1391]={
+ category="so",
+ description="ETHIOPIC TONAL MARK DERET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1391,
+ },
+ [0x1392]={
+ category="so",
+ description="ETHIOPIC TONAL MARK RIKRIK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1392,
+ },
+ [0x1393]={
+ category="so",
+ description="ETHIOPIC TONAL MARK SHORT RIKRIK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1393,
+ },
+ [0x1394]={
+ category="so",
+ description="ETHIOPIC TONAL MARK DIFAT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1394,
+ },
+ [0x1395]={
+ category="so",
+ description="ETHIOPIC TONAL MARK KENAT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1395,
+ },
+ [0x1396]={
+ category="so",
+ description="ETHIOPIC TONAL MARK CHIRET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1396,
+ },
+ [0x1397]={
+ category="so",
+ description="ETHIOPIC TONAL MARK HIDET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1397,
+ },
+ [0x1398]={
+ category="so",
+ description="ETHIOPIC TONAL MARK DERET-HIDET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1398,
+ },
+ [0x1399]={
+ category="so",
+ description="ETHIOPIC TONAL MARK KURT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1399,
+ },
+ [0x13A0]={
+ category="lo",
+ description="CHEROKEE LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A0,
+ },
+ [0x13A1]={
+ category="lo",
+ description="CHEROKEE LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A1,
+ },
+ [0x13A2]={
+ category="lo",
+ description="CHEROKEE LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A2,
+ },
+ [0x13A3]={
+ category="lo",
+ description="CHEROKEE LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A3,
+ },
+ [0x13A4]={
+ category="lo",
+ description="CHEROKEE LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A4,
+ },
+ [0x13A5]={
+ category="lo",
+ description="CHEROKEE LETTER V",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A5,
+ },
+ [0x13A6]={
+ category="lo",
+ description="CHEROKEE LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A6,
+ },
+ [0x13A7]={
+ category="lo",
+ description="CHEROKEE LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A7,
+ },
+ [0x13A8]={
+ category="lo",
+ description="CHEROKEE LETTER GE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A8,
+ },
+ [0x13A9]={
+ category="lo",
+ description="CHEROKEE LETTER GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13A9,
+ },
+ [0x13AA]={
+ category="lo",
+ description="CHEROKEE LETTER GO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13AA,
+ },
+ [0x13AB]={
+ category="lo",
+ description="CHEROKEE LETTER GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13AB,
+ },
+ [0x13AC]={
+ category="lo",
+ description="CHEROKEE LETTER GV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13AC,
+ },
+ [0x13AD]={
+ category="lo",
+ description="CHEROKEE LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13AD,
+ },
+ [0x13AE]={
+ category="lo",
+ description="CHEROKEE LETTER HE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13AE,
+ },
+ [0x13AF]={
+ category="lo",
+ description="CHEROKEE LETTER HI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13AF,
+ },
+ [0x13B0]={
+ category="lo",
+ description="CHEROKEE LETTER HO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B0,
+ },
+ [0x13B1]={
+ category="lo",
+ description="CHEROKEE LETTER HU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B1,
+ },
+ [0x13B2]={
+ category="lo",
+ description="CHEROKEE LETTER HV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B2,
+ },
+ [0x13B3]={
+ category="lo",
+ description="CHEROKEE LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B3,
+ },
+ [0x13B4]={
+ category="lo",
+ description="CHEROKEE LETTER LE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B4,
+ },
+ [0x13B5]={
+ category="lo",
+ description="CHEROKEE LETTER LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B5,
+ },
+ [0x13B6]={
+ category="lo",
+ description="CHEROKEE LETTER LO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B6,
+ },
+ [0x13B7]={
+ category="lo",
+ description="CHEROKEE LETTER LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B7,
+ },
+ [0x13B8]={
+ category="lo",
+ description="CHEROKEE LETTER LV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B8,
+ },
+ [0x13B9]={
+ category="lo",
+ description="CHEROKEE LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13B9,
+ },
+ [0x13BA]={
+ category="lo",
+ description="CHEROKEE LETTER ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13BA,
+ },
+ [0x13BB]={
+ category="lo",
+ description="CHEROKEE LETTER MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13BB,
+ },
+ [0x13BC]={
+ category="lo",
+ description="CHEROKEE LETTER MO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13BC,
+ },
+ [0x13BD]={
+ category="lo",
+ description="CHEROKEE LETTER MU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13BD,
+ },
+ [0x13BE]={
+ category="lo",
+ description="CHEROKEE LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13BE,
+ },
+ [0x13BF]={
+ category="lo",
+ description="CHEROKEE LETTER HNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13BF,
+ },
+ [0x13C0]={
+ category="lo",
+ description="CHEROKEE LETTER NAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C0,
+ },
+ [0x13C1]={
+ category="lo",
+ description="CHEROKEE LETTER NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C1,
+ },
+ [0x13C2]={
+ category="lo",
+ description="CHEROKEE LETTER NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C2,
+ },
+ [0x13C3]={
+ category="lo",
+ description="CHEROKEE LETTER NO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C3,
+ },
+ [0x13C4]={
+ category="lo",
+ description="CHEROKEE LETTER NU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C4,
+ },
+ [0x13C5]={
+ category="lo",
+ description="CHEROKEE LETTER NV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C5,
+ },
+ [0x13C6]={
+ category="lo",
+ description="CHEROKEE LETTER QUA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C6,
+ },
+ [0x13C7]={
+ category="lo",
+ description="CHEROKEE LETTER QUE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C7,
+ },
+ [0x13C8]={
+ category="lo",
+ description="CHEROKEE LETTER QUI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C8,
+ },
+ [0x13C9]={
+ category="lo",
+ description="CHEROKEE LETTER QUO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13C9,
+ },
+ [0x13CA]={
+ category="lo",
+ description="CHEROKEE LETTER QUU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13CA,
+ },
+ [0x13CB]={
+ category="lo",
+ description="CHEROKEE LETTER QUV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13CB,
+ },
+ [0x13CC]={
+ category="lo",
+ description="CHEROKEE LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13CC,
+ },
+ [0x13CD]={
+ category="lo",
+ description="CHEROKEE LETTER S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13CD,
+ },
+ [0x13CE]={
+ category="lo",
+ description="CHEROKEE LETTER SE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13CE,
+ },
+ [0x13CF]={
+ category="lo",
+ description="CHEROKEE LETTER SI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13CF,
+ },
+ [0x13D0]={
+ category="lo",
+ description="CHEROKEE LETTER SO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D0,
+ },
+ [0x13D1]={
+ category="lo",
+ description="CHEROKEE LETTER SU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D1,
+ },
+ [0x13D2]={
+ category="lo",
+ description="CHEROKEE LETTER SV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D2,
+ },
+ [0x13D3]={
+ category="lo",
+ description="CHEROKEE LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D3,
+ },
+ [0x13D4]={
+ category="lo",
+ description="CHEROKEE LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D4,
+ },
+ [0x13D5]={
+ category="lo",
+ description="CHEROKEE LETTER DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D5,
+ },
+ [0x13D6]={
+ category="lo",
+ description="CHEROKEE LETTER TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D6,
+ },
+ [0x13D7]={
+ category="lo",
+ description="CHEROKEE LETTER DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D7,
+ },
+ [0x13D8]={
+ category="lo",
+ description="CHEROKEE LETTER TI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D8,
+ },
+ [0x13D9]={
+ category="lo",
+ description="CHEROKEE LETTER DO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13D9,
+ },
+ [0x13DA]={
+ category="lo",
+ description="CHEROKEE LETTER DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13DA,
+ },
+ [0x13DB]={
+ category="lo",
+ description="CHEROKEE LETTER DV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13DB,
+ },
+ [0x13DC]={
+ category="lo",
+ description="CHEROKEE LETTER DLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13DC,
+ },
+ [0x13DD]={
+ category="lo",
+ description="CHEROKEE LETTER TLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13DD,
+ },
+ [0x13DE]={
+ category="lo",
+ description="CHEROKEE LETTER TLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13DE,
+ },
+ [0x13DF]={
+ category="lo",
+ description="CHEROKEE LETTER TLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13DF,
+ },
+ [0x13E0]={
+ category="lo",
+ description="CHEROKEE LETTER TLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E0,
+ },
+ [0x13E1]={
+ category="lo",
+ description="CHEROKEE LETTER TLU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E1,
+ },
+ [0x13E2]={
+ category="lo",
+ description="CHEROKEE LETTER TLV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E2,
+ },
+ [0x13E3]={
+ category="lo",
+ description="CHEROKEE LETTER TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E3,
+ },
+ [0x13E4]={
+ category="lo",
+ description="CHEROKEE LETTER TSE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E4,
+ },
+ [0x13E5]={
+ category="lo",
+ description="CHEROKEE LETTER TSI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E5,
+ },
+ [0x13E6]={
+ category="lo",
+ description="CHEROKEE LETTER TSO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E6,
+ },
+ [0x13E7]={
+ category="lo",
+ description="CHEROKEE LETTER TSU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E7,
+ },
+ [0x13E8]={
+ category="lo",
+ description="CHEROKEE LETTER TSV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E8,
+ },
+ [0x13E9]={
+ category="lo",
+ description="CHEROKEE LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13E9,
+ },
+ [0x13EA]={
+ category="lo",
+ description="CHEROKEE LETTER WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13EA,
+ },
+ [0x13EB]={
+ category="lo",
+ description="CHEROKEE LETTER WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13EB,
+ },
+ [0x13EC]={
+ category="lo",
+ description="CHEROKEE LETTER WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13EC,
+ },
+ [0x13ED]={
+ category="lo",
+ description="CHEROKEE LETTER WU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13ED,
+ },
+ [0x13EE]={
+ category="lo",
+ description="CHEROKEE LETTER WV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13EE,
+ },
+ [0x13EF]={
+ category="lo",
+ description="CHEROKEE LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13EF,
+ },
+ [0x13F0]={
+ category="lo",
+ description="CHEROKEE LETTER YE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13F0,
+ },
+ [0x13F1]={
+ category="lo",
+ description="CHEROKEE LETTER YI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13F1,
+ },
+ [0x13F2]={
+ category="lo",
+ description="CHEROKEE LETTER YO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13F2,
+ },
+ [0x13F3]={
+ category="lo",
+ description="CHEROKEE LETTER YU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13F3,
+ },
+ [0x13F4]={
+ category="lo",
+ description="CHEROKEE LETTER YV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x13F4,
+ },
+ [0x1401]={
+ category="lo",
+ description="CANADIAN SYLLABICS E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1401,
+ },
+ [0x1402]={
+ category="lo",
+ description="CANADIAN SYLLABICS AAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1402,
+ },
+ [0x1403]={
+ category="lo",
+ description="CANADIAN SYLLABICS I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1403,
+ },
+ [0x1404]={
+ category="lo",
+ description="CANADIAN SYLLABICS II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1404,
+ },
+ [0x1405]={
+ category="lo",
+ description="CANADIAN SYLLABICS O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1405,
+ },
+ [0x1406]={
+ category="lo",
+ description="CANADIAN SYLLABICS OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1406,
+ },
+ [0x1407]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1407,
+ },
+ [0x1408]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1408,
+ },
+ [0x1409]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1409,
+ },
+ [0x140A]={
+ category="lo",
+ description="CANADIAN SYLLABICS A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x140A,
+ },
+ [0x140B]={
+ category="lo",
+ description="CANADIAN SYLLABICS AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x140B,
+ },
+ [0x140C]={
+ category="lo",
+ description="CANADIAN SYLLABICS WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x140C,
+ },
+ [0x140D]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x140D,
+ },
+ [0x140E]={
+ category="lo",
+ description="CANADIAN SYLLABICS WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x140E,
+ },
+ [0x140F]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x140F,
+ },
+ [0x1410]={
+ category="lo",
+ description="CANADIAN SYLLABICS WII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1410,
+ },
+ [0x1411]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE WII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1411,
+ },
+ [0x1412]={
+ category="lo",
+ description="CANADIAN SYLLABICS WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1412,
+ },
+ [0x1413]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1413,
+ },
+ [0x1414]={
+ category="lo",
+ description="CANADIAN SYLLABICS WOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1414,
+ },
+ [0x1415]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE WOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1415,
+ },
+ [0x1416]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI WOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1416,
+ },
+ [0x1417]={
+ category="lo",
+ description="CANADIAN SYLLABICS WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1417,
+ },
+ [0x1418]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1418,
+ },
+ [0x1419]={
+ category="lo",
+ description="CANADIAN SYLLABICS WAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1419,
+ },
+ [0x141A]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE WAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x141A,
+ },
+ [0x141B]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI WAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x141B,
+ },
+ [0x141C]={
+ category="lo",
+ description="CANADIAN SYLLABICS AI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x141C,
+ },
+ [0x141D]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x141D,
+ },
+ [0x141E]={
+ category="lo",
+ description="CANADIAN SYLLABICS GLOTTAL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x141E,
+ },
+ [0x141F]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL ACUTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x141F,
+ },
+ [0x1420]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL GRAVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1420,
+ },
+ [0x1421]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL BOTTOM HALF RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1421,
+ },
+ [0x1422]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL TOP HALF RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1422,
+ },
+ [0x1423]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL RIGHT HALF RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1423,
+ },
+ [0x1424]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL RING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1424,
+ },
+ [0x1425]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL DOUBLE ACUTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1425,
+ },
+ [0x1426]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1426,
+ },
+ [0x1427]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL MIDDLE DOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1427,
+ },
+ [0x1428]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1428,
+ },
+ [0x1429]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL PLUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1429,
+ },
+ [0x142A]={
+ category="lo",
+ description="CANADIAN SYLLABICS FINAL DOWN TACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x142A,
+ },
+ [0x142B]={
+ category="lo",
+ description="CANADIAN SYLLABICS EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x142B,
+ },
+ [0x142C]={
+ category="lo",
+ description="CANADIAN SYLLABICS IN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x142C,
+ },
+ [0x142D]={
+ category="lo",
+ description="CANADIAN SYLLABICS ON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x142D,
+ },
+ [0x142E]={
+ category="lo",
+ description="CANADIAN SYLLABICS AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x142E,
+ },
+ [0x142F]={
+ category="lo",
+ description="CANADIAN SYLLABICS PE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x142F,
+ },
+ [0x1430]={
+ category="lo",
+ description="CANADIAN SYLLABICS PAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1430,
+ },
+ [0x1431]={
+ category="lo",
+ description="CANADIAN SYLLABICS PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1431,
+ },
+ [0x1432]={
+ category="lo",
+ description="CANADIAN SYLLABICS PII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1432,
+ },
+ [0x1433]={
+ category="lo",
+ description="CANADIAN SYLLABICS PO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1433,
+ },
+ [0x1434]={
+ category="lo",
+ description="CANADIAN SYLLABICS POO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1434,
+ },
+ [0x1435]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE POO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1435,
+ },
+ [0x1436]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1436,
+ },
+ [0x1437]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1437,
+ },
+ [0x1438]={
+ category="lo",
+ description="CANADIAN SYLLABICS PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1438,
+ },
+ [0x1439]={
+ category="lo",
+ description="CANADIAN SYLLABICS PAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1439,
+ },
+ [0x143A]={
+ category="lo",
+ description="CANADIAN SYLLABICS PWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x143A,
+ },
+ [0x143B]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE PWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x143B,
+ },
+ [0x143C]={
+ category="lo",
+ description="CANADIAN SYLLABICS PWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x143C,
+ },
+ [0x143D]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE PWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x143D,
+ },
+ [0x143E]={
+ category="lo",
+ description="CANADIAN SYLLABICS PWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x143E,
+ },
+ [0x143F]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE PWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x143F,
+ },
+ [0x1440]={
+ category="lo",
+ description="CANADIAN SYLLABICS PWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1440,
+ },
+ [0x1441]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE PWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1441,
+ },
+ [0x1442]={
+ category="lo",
+ description="CANADIAN SYLLABICS PWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1442,
+ },
+ [0x1443]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE PWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1443,
+ },
+ [0x1444]={
+ category="lo",
+ description="CANADIAN SYLLABICS PWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1444,
+ },
+ [0x1445]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE PWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1445,
+ },
+ [0x1446]={
+ category="lo",
+ description="CANADIAN SYLLABICS PWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1446,
+ },
+ [0x1447]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE PWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1447,
+ },
+ [0x1448]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE PWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1448,
+ },
+ [0x1449]={
+ category="lo",
+ description="CANADIAN SYLLABICS P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1449,
+ },
+ [0x144A]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x144A,
+ },
+ [0x144B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x144B,
+ },
+ [0x144C]={
+ category="lo",
+ description="CANADIAN SYLLABICS TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x144C,
+ },
+ [0x144D]={
+ category="lo",
+ description="CANADIAN SYLLABICS TAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x144D,
+ },
+ [0x144E]={
+ category="lo",
+ description="CANADIAN SYLLABICS TI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x144E,
+ },
+ [0x144F]={
+ category="lo",
+ description="CANADIAN SYLLABICS TII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x144F,
+ },
+ [0x1450]={
+ category="lo",
+ description="CANADIAN SYLLABICS TO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1450,
+ },
+ [0x1451]={
+ category="lo",
+ description="CANADIAN SYLLABICS TOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1451,
+ },
+ [0x1452]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE TOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1452,
+ },
+ [0x1453]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1453,
+ },
+ [0x1454]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1454,
+ },
+ [0x1455]={
+ category="lo",
+ description="CANADIAN SYLLABICS TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1455,
+ },
+ [0x1456]={
+ category="lo",
+ description="CANADIAN SYLLABICS TAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1456,
+ },
+ [0x1457]={
+ category="lo",
+ description="CANADIAN SYLLABICS TWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1457,
+ },
+ [0x1458]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE TWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1458,
+ },
+ [0x1459]={
+ category="lo",
+ description="CANADIAN SYLLABICS TWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1459,
+ },
+ [0x145A]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE TWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x145A,
+ },
+ [0x145B]={
+ category="lo",
+ description="CANADIAN SYLLABICS TWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x145B,
+ },
+ [0x145C]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE TWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x145C,
+ },
+ [0x145D]={
+ category="lo",
+ description="CANADIAN SYLLABICS TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x145D,
+ },
+ [0x145E]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x145E,
+ },
+ [0x145F]={
+ category="lo",
+ description="CANADIAN SYLLABICS TWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x145F,
+ },
+ [0x1460]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE TWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1460,
+ },
+ [0x1461]={
+ category="lo",
+ description="CANADIAN SYLLABICS TWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1461,
+ },
+ [0x1462]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE TWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1462,
+ },
+ [0x1463]={
+ category="lo",
+ description="CANADIAN SYLLABICS TWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1463,
+ },
+ [0x1464]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE TWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1464,
+ },
+ [0x1465]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI TWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1465,
+ },
+ [0x1466]={
+ category="lo",
+ description="CANADIAN SYLLABICS T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1466,
+ },
+ [0x1467]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1467,
+ },
+ [0x1468]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1468,
+ },
+ [0x1469]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1469,
+ },
+ [0x146A]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x146A,
+ },
+ [0x146B]={
+ category="lo",
+ description="CANADIAN SYLLABICS KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x146B,
+ },
+ [0x146C]={
+ category="lo",
+ description="CANADIAN SYLLABICS KAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x146C,
+ },
+ [0x146D]={
+ category="lo",
+ description="CANADIAN SYLLABICS KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x146D,
+ },
+ [0x146E]={
+ category="lo",
+ description="CANADIAN SYLLABICS KII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x146E,
+ },
+ [0x146F]={
+ category="lo",
+ description="CANADIAN SYLLABICS KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x146F,
+ },
+ [0x1470]={
+ category="lo",
+ description="CANADIAN SYLLABICS KOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1470,
+ },
+ [0x1471]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE KOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1471,
+ },
+ [0x1472]={
+ category="lo",
+ description="CANADIAN SYLLABICS KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1472,
+ },
+ [0x1473]={
+ category="lo",
+ description="CANADIAN SYLLABICS KAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1473,
+ },
+ [0x1474]={
+ category="lo",
+ description="CANADIAN SYLLABICS KWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1474,
+ },
+ [0x1475]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE KWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1475,
+ },
+ [0x1476]={
+ category="lo",
+ description="CANADIAN SYLLABICS KWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1476,
+ },
+ [0x1477]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE KWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1477,
+ },
+ [0x1478]={
+ category="lo",
+ description="CANADIAN SYLLABICS KWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1478,
+ },
+ [0x1479]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE KWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1479,
+ },
+ [0x147A]={
+ category="lo",
+ description="CANADIAN SYLLABICS KWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x147A,
+ },
+ [0x147B]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE KWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x147B,
+ },
+ [0x147C]={
+ category="lo",
+ description="CANADIAN SYLLABICS KWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x147C,
+ },
+ [0x147D]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE KWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x147D,
+ },
+ [0x147E]={
+ category="lo",
+ description="CANADIAN SYLLABICS KWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x147E,
+ },
+ [0x147F]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE KWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x147F,
+ },
+ [0x1480]={
+ category="lo",
+ description="CANADIAN SYLLABICS KWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1480,
+ },
+ [0x1481]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE KWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1481,
+ },
+ [0x1482]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI KWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1482,
+ },
+ [0x1483]={
+ category="lo",
+ description="CANADIAN SYLLABICS K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1483,
+ },
+ [0x1484]={
+ category="lo",
+ description="CANADIAN SYLLABICS KW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1484,
+ },
+ [0x1485]={
+ category="lo",
+ description="CANADIAN SYLLABICS SOUTH-SLAVEY KEH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1485,
+ },
+ [0x1486]={
+ category="lo",
+ description="CANADIAN SYLLABICS SOUTH-SLAVEY KIH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1486,
+ },
+ [0x1487]={
+ category="lo",
+ description="CANADIAN SYLLABICS SOUTH-SLAVEY KOH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1487,
+ },
+ [0x1488]={
+ category="lo",
+ description="CANADIAN SYLLABICS SOUTH-SLAVEY KAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1488,
+ },
+ [0x1489]={
+ category="lo",
+ description="CANADIAN SYLLABICS CE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1489,
+ },
+ [0x148A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x148A,
+ },
+ [0x148B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x148B,
+ },
+ [0x148C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x148C,
+ },
+ [0x148D]={
+ category="lo",
+ description="CANADIAN SYLLABICS CO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x148D,
+ },
+ [0x148E]={
+ category="lo",
+ description="CANADIAN SYLLABICS COO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x148E,
+ },
+ [0x148F]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE COO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x148F,
+ },
+ [0x1490]={
+ category="lo",
+ description="CANADIAN SYLLABICS CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1490,
+ },
+ [0x1491]={
+ category="lo",
+ description="CANADIAN SYLLABICS CAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1491,
+ },
+ [0x1492]={
+ category="lo",
+ description="CANADIAN SYLLABICS CWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1492,
+ },
+ [0x1493]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE CWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1493,
+ },
+ [0x1494]={
+ category="lo",
+ description="CANADIAN SYLLABICS CWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1494,
+ },
+ [0x1495]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE CWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1495,
+ },
+ [0x1496]={
+ category="lo",
+ description="CANADIAN SYLLABICS CWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1496,
+ },
+ [0x1497]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE CWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1497,
+ },
+ [0x1498]={
+ category="lo",
+ description="CANADIAN SYLLABICS CWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1498,
+ },
+ [0x1499]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE CWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1499,
+ },
+ [0x149A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x149A,
+ },
+ [0x149B]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE CWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x149B,
+ },
+ [0x149C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x149C,
+ },
+ [0x149D]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE CWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x149D,
+ },
+ [0x149E]={
+ category="lo",
+ description="CANADIAN SYLLABICS CWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x149E,
+ },
+ [0x149F]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE CWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x149F,
+ },
+ [0x14A0]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI CWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A0,
+ },
+ [0x14A1]={
+ category="lo",
+ description="CANADIAN SYLLABICS C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A1,
+ },
+ [0x14A2]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI TH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A2,
+ },
+ [0x14A3]={
+ category="lo",
+ description="CANADIAN SYLLABICS ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A3,
+ },
+ [0x14A4]={
+ category="lo",
+ description="CANADIAN SYLLABICS MAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A4,
+ },
+ [0x14A5]={
+ category="lo",
+ description="CANADIAN SYLLABICS MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A5,
+ },
+ [0x14A6]={
+ category="lo",
+ description="CANADIAN SYLLABICS MII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A6,
+ },
+ [0x14A7]={
+ category="lo",
+ description="CANADIAN SYLLABICS MO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A7,
+ },
+ [0x14A8]={
+ category="lo",
+ description="CANADIAN SYLLABICS MOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A8,
+ },
+ [0x14A9]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE MOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14A9,
+ },
+ [0x14AA]={
+ category="lo",
+ description="CANADIAN SYLLABICS MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14AA,
+ },
+ [0x14AB]={
+ category="lo",
+ description="CANADIAN SYLLABICS MAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14AB,
+ },
+ [0x14AC]={
+ category="lo",
+ description="CANADIAN SYLLABICS MWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14AC,
+ },
+ [0x14AD]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE MWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14AD,
+ },
+ [0x14AE]={
+ category="lo",
+ description="CANADIAN SYLLABICS MWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14AE,
+ },
+ [0x14AF]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE MWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14AF,
+ },
+ [0x14B0]={
+ category="lo",
+ description="CANADIAN SYLLABICS MWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B0,
+ },
+ [0x14B1]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE MWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B1,
+ },
+ [0x14B2]={
+ category="lo",
+ description="CANADIAN SYLLABICS MWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B2,
+ },
+ [0x14B3]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE MWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B3,
+ },
+ [0x14B4]={
+ category="lo",
+ description="CANADIAN SYLLABICS MWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B4,
+ },
+ [0x14B5]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE MWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B5,
+ },
+ [0x14B6]={
+ category="lo",
+ description="CANADIAN SYLLABICS MWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B6,
+ },
+ [0x14B7]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE MWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B7,
+ },
+ [0x14B8]={
+ category="lo",
+ description="CANADIAN SYLLABICS MWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B8,
+ },
+ [0x14B9]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE MWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14B9,
+ },
+ [0x14BA]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI MWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14BA,
+ },
+ [0x14BB]={
+ category="lo",
+ description="CANADIAN SYLLABICS M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14BB,
+ },
+ [0x14BC]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14BC,
+ },
+ [0x14BD]={
+ category="lo",
+ description="CANADIAN SYLLABICS MH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14BD,
+ },
+ [0x14BE]={
+ category="lo",
+ description="CANADIAN SYLLABICS ATHAPASCAN M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14BE,
+ },
+ [0x14BF]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14BF,
+ },
+ [0x14C0]={
+ category="lo",
+ description="CANADIAN SYLLABICS NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C0,
+ },
+ [0x14C1]={
+ category="lo",
+ description="CANADIAN SYLLABICS NAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C1,
+ },
+ [0x14C2]={
+ category="lo",
+ description="CANADIAN SYLLABICS NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C2,
+ },
+ [0x14C3]={
+ category="lo",
+ description="CANADIAN SYLLABICS NII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C3,
+ },
+ [0x14C4]={
+ category="lo",
+ description="CANADIAN SYLLABICS NO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C4,
+ },
+ [0x14C5]={
+ category="lo",
+ description="CANADIAN SYLLABICS NOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C5,
+ },
+ [0x14C6]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE NOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C6,
+ },
+ [0x14C7]={
+ category="lo",
+ description="CANADIAN SYLLABICS NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C7,
+ },
+ [0x14C8]={
+ category="lo",
+ description="CANADIAN SYLLABICS NAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C8,
+ },
+ [0x14C9]={
+ category="lo",
+ description="CANADIAN SYLLABICS NWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14C9,
+ },
+ [0x14CA]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE NWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14CA,
+ },
+ [0x14CB]={
+ category="lo",
+ description="CANADIAN SYLLABICS NWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14CB,
+ },
+ [0x14CC]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE NWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14CC,
+ },
+ [0x14CD]={
+ category="lo",
+ description="CANADIAN SYLLABICS NWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14CD,
+ },
+ [0x14CE]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE NWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14CE,
+ },
+ [0x14CF]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI NWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14CF,
+ },
+ [0x14D0]={
+ category="lo",
+ description="CANADIAN SYLLABICS N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D0,
+ },
+ [0x14D1]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER NG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D1,
+ },
+ [0x14D2]={
+ category="lo",
+ description="CANADIAN SYLLABICS NH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D2,
+ },
+ [0x14D3]={
+ category="lo",
+ description="CANADIAN SYLLABICS LE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D3,
+ },
+ [0x14D4]={
+ category="lo",
+ description="CANADIAN SYLLABICS LAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D4,
+ },
+ [0x14D5]={
+ category="lo",
+ description="CANADIAN SYLLABICS LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D5,
+ },
+ [0x14D6]={
+ category="lo",
+ description="CANADIAN SYLLABICS LII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D6,
+ },
+ [0x14D7]={
+ category="lo",
+ description="CANADIAN SYLLABICS LO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D7,
+ },
+ [0x14D8]={
+ category="lo",
+ description="CANADIAN SYLLABICS LOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D8,
+ },
+ [0x14D9]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE LOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14D9,
+ },
+ [0x14DA]={
+ category="lo",
+ description="CANADIAN SYLLABICS LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14DA,
+ },
+ [0x14DB]={
+ category="lo",
+ description="CANADIAN SYLLABICS LAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14DB,
+ },
+ [0x14DC]={
+ category="lo",
+ description="CANADIAN SYLLABICS LWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14DC,
+ },
+ [0x14DD]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14DD,
+ },
+ [0x14DE]={
+ category="lo",
+ description="CANADIAN SYLLABICS LWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14DE,
+ },
+ [0x14DF]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14DF,
+ },
+ [0x14E0]={
+ category="lo",
+ description="CANADIAN SYLLABICS LWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E0,
+ },
+ [0x14E1]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E1,
+ },
+ [0x14E2]={
+ category="lo",
+ description="CANADIAN SYLLABICS LWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E2,
+ },
+ [0x14E3]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E3,
+ },
+ [0x14E4]={
+ category="lo",
+ description="CANADIAN SYLLABICS LWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E4,
+ },
+ [0x14E5]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E5,
+ },
+ [0x14E6]={
+ category="lo",
+ description="CANADIAN SYLLABICS LWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E6,
+ },
+ [0x14E7]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E7,
+ },
+ [0x14E8]={
+ category="lo",
+ description="CANADIAN SYLLABICS LWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E8,
+ },
+ [0x14E9]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14E9,
+ },
+ [0x14EA]={
+ category="lo",
+ description="CANADIAN SYLLABICS L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14EA,
+ },
+ [0x14EB]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14EB,
+ },
+ [0x14EC]={
+ category="lo",
+ description="CANADIAN SYLLABICS MEDIAL L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14EC,
+ },
+ [0x14ED]={
+ category="lo",
+ description="CANADIAN SYLLABICS SE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14ED,
+ },
+ [0x14EE]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14EE,
+ },
+ [0x14EF]={
+ category="lo",
+ description="CANADIAN SYLLABICS SI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14EF,
+ },
+ [0x14F0]={
+ category="lo",
+ description="CANADIAN SYLLABICS SII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F0,
+ },
+ [0x14F1]={
+ category="lo",
+ description="CANADIAN SYLLABICS SO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F1,
+ },
+ [0x14F2]={
+ category="lo",
+ description="CANADIAN SYLLABICS SOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F2,
+ },
+ [0x14F3]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE SOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F3,
+ },
+ [0x14F4]={
+ category="lo",
+ description="CANADIAN SYLLABICS SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F4,
+ },
+ [0x14F5]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F5,
+ },
+ [0x14F6]={
+ category="lo",
+ description="CANADIAN SYLLABICS SWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F6,
+ },
+ [0x14F7]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F7,
+ },
+ [0x14F8]={
+ category="lo",
+ description="CANADIAN SYLLABICS SWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F8,
+ },
+ [0x14F9]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14F9,
+ },
+ [0x14FA]={
+ category="lo",
+ description="CANADIAN SYLLABICS SWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14FA,
+ },
+ [0x14FB]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14FB,
+ },
+ [0x14FC]={
+ category="lo",
+ description="CANADIAN SYLLABICS SWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14FC,
+ },
+ [0x14FD]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14FD,
+ },
+ [0x14FE]={
+ category="lo",
+ description="CANADIAN SYLLABICS SWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14FE,
+ },
+ [0x14FF]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x14FF,
+ },
+ [0x1500]={
+ category="lo",
+ description="CANADIAN SYLLABICS SWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1500,
+ },
+ [0x1501]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1501,
+ },
+ [0x1502]={
+ category="lo",
+ description="CANADIAN SYLLABICS SWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1502,
+ },
+ [0x1503]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1503,
+ },
+ [0x1504]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI SWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1504,
+ },
+ [0x1505]={
+ category="lo",
+ description="CANADIAN SYLLABICS S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1505,
+ },
+ [0x1506]={
+ category="lo",
+ description="CANADIAN SYLLABICS ATHAPASCAN S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1506,
+ },
+ [0x1507]={
+ category="lo",
+ description="CANADIAN SYLLABICS SW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1507,
+ },
+ [0x1508]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1508,
+ },
+ [0x1509]={
+ category="lo",
+ description="CANADIAN SYLLABICS MOOSE-CREE SK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1509,
+ },
+ [0x150A]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI SKW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x150A,
+ },
+ [0x150B]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI S-W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x150B,
+ },
+ [0x150C]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI SPWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x150C,
+ },
+ [0x150D]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI STWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x150D,
+ },
+ [0x150E]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI SKWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x150E,
+ },
+ [0x150F]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI SCWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x150F,
+ },
+ [0x1510]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1510,
+ },
+ [0x1511]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1511,
+ },
+ [0x1512]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1512,
+ },
+ [0x1513]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1513,
+ },
+ [0x1514]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1514,
+ },
+ [0x1515]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1515,
+ },
+ [0x1516]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1516,
+ },
+ [0x1517]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1517,
+ },
+ [0x1518]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SHWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1518,
+ },
+ [0x1519]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1519,
+ },
+ [0x151A]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SHWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x151A,
+ },
+ [0x151B]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x151B,
+ },
+ [0x151C]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SHWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x151C,
+ },
+ [0x151D]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x151D,
+ },
+ [0x151E]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SHWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x151E,
+ },
+ [0x151F]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x151F,
+ },
+ [0x1520]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SHWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1520,
+ },
+ [0x1521]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1521,
+ },
+ [0x1522]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SHWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1522,
+ },
+ [0x1523]={
+ category="lo",
+ description="CANADIAN SYLLABICS SHWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1523,
+ },
+ [0x1524]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE SHWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1524,
+ },
+ [0x1525]={
+ category="lo",
+ description="CANADIAN SYLLABICS SH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1525,
+ },
+ [0x1526]={
+ category="lo",
+ description="CANADIAN SYLLABICS YE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1526,
+ },
+ [0x1527]={
+ category="lo",
+ description="CANADIAN SYLLABICS YAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1527,
+ },
+ [0x1528]={
+ category="lo",
+ description="CANADIAN SYLLABICS YI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1528,
+ },
+ [0x1529]={
+ category="lo",
+ description="CANADIAN SYLLABICS YII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1529,
+ },
+ [0x152A]={
+ category="lo",
+ description="CANADIAN SYLLABICS YO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x152A,
+ },
+ [0x152B]={
+ category="lo",
+ description="CANADIAN SYLLABICS YOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x152B,
+ },
+ [0x152C]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y-CREE YOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x152C,
+ },
+ [0x152D]={
+ category="lo",
+ description="CANADIAN SYLLABICS YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x152D,
+ },
+ [0x152E]={
+ category="lo",
+ description="CANADIAN SYLLABICS YAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x152E,
+ },
+ [0x152F]={
+ category="lo",
+ description="CANADIAN SYLLABICS YWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x152F,
+ },
+ [0x1530]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE YWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1530,
+ },
+ [0x1531]={
+ category="lo",
+ description="CANADIAN SYLLABICS YWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1531,
+ },
+ [0x1532]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE YWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1532,
+ },
+ [0x1533]={
+ category="lo",
+ description="CANADIAN SYLLABICS YWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1533,
+ },
+ [0x1534]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE YWII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1534,
+ },
+ [0x1535]={
+ category="lo",
+ description="CANADIAN SYLLABICS YWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1535,
+ },
+ [0x1536]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE YWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1536,
+ },
+ [0x1537]={
+ category="lo",
+ description="CANADIAN SYLLABICS YWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1537,
+ },
+ [0x1538]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE YWOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1538,
+ },
+ [0x1539]={
+ category="lo",
+ description="CANADIAN SYLLABICS YWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1539,
+ },
+ [0x153A]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE YWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x153A,
+ },
+ [0x153B]={
+ category="lo",
+ description="CANADIAN SYLLABICS YWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x153B,
+ },
+ [0x153C]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE YWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x153C,
+ },
+ [0x153D]={
+ category="lo",
+ description="CANADIAN SYLLABICS NASKAPI YWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x153D,
+ },
+ [0x153E]={
+ category="lo",
+ description="CANADIAN SYLLABICS Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x153E,
+ },
+ [0x153F]={
+ category="lo",
+ description="CANADIAN SYLLABICS BIBLE-CREE Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x153F,
+ },
+ [0x1540]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1540,
+ },
+ [0x1541]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI YI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1541,
+ },
+ [0x1542]={
+ category="lo",
+ description="CANADIAN SYLLABICS RE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1542,
+ },
+ [0x1543]={
+ category="lo",
+ description="CANADIAN SYLLABICS R-CREE RE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1543,
+ },
+ [0x1544]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1544,
+ },
+ [0x1545]={
+ category="lo",
+ description="CANADIAN SYLLABICS RAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1545,
+ },
+ [0x1546]={
+ category="lo",
+ description="CANADIAN SYLLABICS RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1546,
+ },
+ [0x1547]={
+ category="lo",
+ description="CANADIAN SYLLABICS RII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1547,
+ },
+ [0x1548]={
+ category="lo",
+ description="CANADIAN SYLLABICS RO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1548,
+ },
+ [0x1549]={
+ category="lo",
+ description="CANADIAN SYLLABICS ROO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1549,
+ },
+ [0x154A]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x154A,
+ },
+ [0x154B]={
+ category="lo",
+ description="CANADIAN SYLLABICS RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x154B,
+ },
+ [0x154C]={
+ category="lo",
+ description="CANADIAN SYLLABICS RAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x154C,
+ },
+ [0x154D]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x154D,
+ },
+ [0x154E]={
+ category="lo",
+ description="CANADIAN SYLLABICS RWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x154E,
+ },
+ [0x154F]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE RWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x154F,
+ },
+ [0x1550]={
+ category="lo",
+ description="CANADIAN SYLLABICS R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1550,
+ },
+ [0x1551]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1551,
+ },
+ [0x1552]={
+ category="lo",
+ description="CANADIAN SYLLABICS MEDIAL R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1552,
+ },
+ [0x1553]={
+ category="lo",
+ description="CANADIAN SYLLABICS FE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1553,
+ },
+ [0x1554]={
+ category="lo",
+ description="CANADIAN SYLLABICS FAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1554,
+ },
+ [0x1555]={
+ category="lo",
+ description="CANADIAN SYLLABICS FI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1555,
+ },
+ [0x1556]={
+ category="lo",
+ description="CANADIAN SYLLABICS FII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1556,
+ },
+ [0x1557]={
+ category="lo",
+ description="CANADIAN SYLLABICS FO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1557,
+ },
+ [0x1558]={
+ category="lo",
+ description="CANADIAN SYLLABICS FOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1558,
+ },
+ [0x1559]={
+ category="lo",
+ description="CANADIAN SYLLABICS FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1559,
+ },
+ [0x155A]={
+ category="lo",
+ description="CANADIAN SYLLABICS FAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x155A,
+ },
+ [0x155B]={
+ category="lo",
+ description="CANADIAN SYLLABICS FWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x155B,
+ },
+ [0x155C]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE FWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x155C,
+ },
+ [0x155D]={
+ category="lo",
+ description="CANADIAN SYLLABICS F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x155D,
+ },
+ [0x155E]={
+ category="lo",
+ description="CANADIAN SYLLABICS THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x155E,
+ },
+ [0x155F]={
+ category="lo",
+ description="CANADIAN SYLLABICS N-CREE THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x155F,
+ },
+ [0x1560]={
+ category="lo",
+ description="CANADIAN SYLLABICS THI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1560,
+ },
+ [0x1561]={
+ category="lo",
+ description="CANADIAN SYLLABICS N-CREE THI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1561,
+ },
+ [0x1562]={
+ category="lo",
+ description="CANADIAN SYLLABICS THII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1562,
+ },
+ [0x1563]={
+ category="lo",
+ description="CANADIAN SYLLABICS N-CREE THII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1563,
+ },
+ [0x1564]={
+ category="lo",
+ description="CANADIAN SYLLABICS THO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1564,
+ },
+ [0x1565]={
+ category="lo",
+ description="CANADIAN SYLLABICS THOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1565,
+ },
+ [0x1566]={
+ category="lo",
+ description="CANADIAN SYLLABICS THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1566,
+ },
+ [0x1567]={
+ category="lo",
+ description="CANADIAN SYLLABICS THAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1567,
+ },
+ [0x1568]={
+ category="lo",
+ description="CANADIAN SYLLABICS THWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1568,
+ },
+ [0x1569]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE THWAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1569,
+ },
+ [0x156A]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x156A,
+ },
+ [0x156B]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x156B,
+ },
+ [0x156C]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x156C,
+ },
+ [0x156D]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x156D,
+ },
+ [0x156E]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x156E,
+ },
+ [0x156F]={
+ category="lo",
+ description="CANADIAN SYLLABICS TTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x156F,
+ },
+ [0x1570]={
+ category="lo",
+ description="CANADIAN SYLLABICS TYE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1570,
+ },
+ [0x1571]={
+ category="lo",
+ description="CANADIAN SYLLABICS TYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1571,
+ },
+ [0x1572]={
+ category="lo",
+ description="CANADIAN SYLLABICS TYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1572,
+ },
+ [0x1573]={
+ category="lo",
+ description="CANADIAN SYLLABICS TYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1573,
+ },
+ [0x1574]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK HE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1574,
+ },
+ [0x1575]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK HI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1575,
+ },
+ [0x1576]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK HII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1576,
+ },
+ [0x1577]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK HO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1577,
+ },
+ [0x1578]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK HOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1578,
+ },
+ [0x1579]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1579,
+ },
+ [0x157A]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK HAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x157A,
+ },
+ [0x157B]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVIK H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x157B,
+ },
+ [0x157C]={
+ category="lo",
+ description="CANADIAN SYLLABICS NUNAVUT H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x157C,
+ },
+ [0x157D]={
+ category="lo",
+ description="CANADIAN SYLLABICS HK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x157D,
+ },
+ [0x157E]={
+ category="lo",
+ description="CANADIAN SYLLABICS QAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x157E,
+ },
+ [0x157F]={
+ category="lo",
+ description="CANADIAN SYLLABICS QI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x157F,
+ },
+ [0x1580]={
+ category="lo",
+ description="CANADIAN SYLLABICS QII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1580,
+ },
+ [0x1581]={
+ category="lo",
+ description="CANADIAN SYLLABICS QO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1581,
+ },
+ [0x1582]={
+ category="lo",
+ description="CANADIAN SYLLABICS QOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1582,
+ },
+ [0x1583]={
+ category="lo",
+ description="CANADIAN SYLLABICS QA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1583,
+ },
+ [0x1584]={
+ category="lo",
+ description="CANADIAN SYLLABICS QAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1584,
+ },
+ [0x1585]={
+ category="lo",
+ description="CANADIAN SYLLABICS Q",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1585,
+ },
+ [0x1586]={
+ category="lo",
+ description="CANADIAN SYLLABICS TLHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1586,
+ },
+ [0x1587]={
+ category="lo",
+ description="CANADIAN SYLLABICS TLHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1587,
+ },
+ [0x1588]={
+ category="lo",
+ description="CANADIAN SYLLABICS TLHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1588,
+ },
+ [0x1589]={
+ category="lo",
+ description="CANADIAN SYLLABICS TLHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1589,
+ },
+ [0x158A]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE RE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x158A,
+ },
+ [0x158B]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x158B,
+ },
+ [0x158C]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE RO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x158C,
+ },
+ [0x158D]={
+ category="lo",
+ description="CANADIAN SYLLABICS WEST-CREE RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x158D,
+ },
+ [0x158E]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGAAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x158E,
+ },
+ [0x158F]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x158F,
+ },
+ [0x1590]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1590,
+ },
+ [0x1591]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1591,
+ },
+ [0x1592]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1592,
+ },
+ [0x1593]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1593,
+ },
+ [0x1594]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1594,
+ },
+ [0x1595]={
+ category="lo",
+ description="CANADIAN SYLLABICS NG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1595,
+ },
+ [0x1596]={
+ category="lo",
+ description="CANADIAN SYLLABICS NNG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1596,
+ },
+ [0x1597]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1597,
+ },
+ [0x1598]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI SHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1598,
+ },
+ [0x1599]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI SHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1599,
+ },
+ [0x159A]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x159A,
+ },
+ [0x159B]={
+ category="lo",
+ description="CANADIAN SYLLABICS WOODS-CREE THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x159B,
+ },
+ [0x159C]={
+ category="lo",
+ description="CANADIAN SYLLABICS WOODS-CREE THI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x159C,
+ },
+ [0x159D]={
+ category="lo",
+ description="CANADIAN SYLLABICS WOODS-CREE THO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x159D,
+ },
+ [0x159E]={
+ category="lo",
+ description="CANADIAN SYLLABICS WOODS-CREE THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x159E,
+ },
+ [0x159F]={
+ category="lo",
+ description="CANADIAN SYLLABICS WOODS-CREE TH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x159F,
+ },
+ [0x15A0]={
+ category="lo",
+ description="CANADIAN SYLLABICS LHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A0,
+ },
+ [0x15A1]={
+ category="lo",
+ description="CANADIAN SYLLABICS LHII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A1,
+ },
+ [0x15A2]={
+ category="lo",
+ description="CANADIAN SYLLABICS LHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A2,
+ },
+ [0x15A3]={
+ category="lo",
+ description="CANADIAN SYLLABICS LHOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A3,
+ },
+ [0x15A4]={
+ category="lo",
+ description="CANADIAN SYLLABICS LHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A4,
+ },
+ [0x15A5]={
+ category="lo",
+ description="CANADIAN SYLLABICS LHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A5,
+ },
+ [0x15A6]={
+ category="lo",
+ description="CANADIAN SYLLABICS LH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A6,
+ },
+ [0x15A7]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A7,
+ },
+ [0x15A8]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE THI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A8,
+ },
+ [0x15A9]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE THII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15A9,
+ },
+ [0x15AA]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE THO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15AA,
+ },
+ [0x15AB]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE THOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15AB,
+ },
+ [0x15AC]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15AC,
+ },
+ [0x15AD]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE THAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15AD,
+ },
+ [0x15AE]={
+ category="lo",
+ description="CANADIAN SYLLABICS TH-CREE TH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15AE,
+ },
+ [0x15AF]={
+ category="lo",
+ description="CANADIAN SYLLABICS AIVILIK B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15AF,
+ },
+ [0x15B0]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B0,
+ },
+ [0x15B1]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B1,
+ },
+ [0x15B2]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B2,
+ },
+ [0x15B3]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B3,
+ },
+ [0x15B4]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B4,
+ },
+ [0x15B5]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B5,
+ },
+ [0x15B6]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B6,
+ },
+ [0x15B7]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B7,
+ },
+ [0x15B8]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B8,
+ },
+ [0x15B9]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15B9,
+ },
+ [0x15BA]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT NO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15BA,
+ },
+ [0x15BB]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15BB,
+ },
+ [0x15BC]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15BC,
+ },
+ [0x15BD]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15BD,
+ },
+ [0x15BE]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15BE,
+ },
+ [0x15BF]={
+ category="lo",
+ description="CANADIAN SYLLABICS BLACKFOOT KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15BF,
+ },
+ [0x15C0]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI HE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C0,
+ },
+ [0x15C1]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI HI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C1,
+ },
+ [0x15C2]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI HO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C2,
+ },
+ [0x15C3]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C3,
+ },
+ [0x15C4]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C4,
+ },
+ [0x15C5]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C5,
+ },
+ [0x15C6]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C6,
+ },
+ [0x15C7]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C7,
+ },
+ [0x15C8]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C8,
+ },
+ [0x15C9]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15C9,
+ },
+ [0x15CA]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER RU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15CA,
+ },
+ [0x15CB]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER RO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15CB,
+ },
+ [0x15CC]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER RE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15CC,
+ },
+ [0x15CD]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER REE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15CD,
+ },
+ [0x15CE]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15CE,
+ },
+ [0x15CF]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15CF,
+ },
+ [0x15D0]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER WU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D0,
+ },
+ [0x15D1]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D1,
+ },
+ [0x15D2]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D2,
+ },
+ [0x15D3]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER WEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D3,
+ },
+ [0x15D4]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D4,
+ },
+ [0x15D5]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D5,
+ },
+ [0x15D6]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HWU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D6,
+ },
+ [0x15D7]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D7,
+ },
+ [0x15D8]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D8,
+ },
+ [0x15D9]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15D9,
+ },
+ [0x15DA]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15DA,
+ },
+ [0x15DB]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER HWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15DB,
+ },
+ [0x15DC]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER THU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15DC,
+ },
+ [0x15DD]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER THO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15DD,
+ },
+ [0x15DE]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15DE,
+ },
+ [0x15DF]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER THEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15DF,
+ },
+ [0x15E0]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER THI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E0,
+ },
+ [0x15E1]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E1,
+ },
+ [0x15E2]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E2,
+ },
+ [0x15E3]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E3,
+ },
+ [0x15E4]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E4,
+ },
+ [0x15E5]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E5,
+ },
+ [0x15E6]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E6,
+ },
+ [0x15E7]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E7,
+ },
+ [0x15E8]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER PU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E8,
+ },
+ [0x15E9]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER PO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15E9,
+ },
+ [0x15EA]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER PE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15EA,
+ },
+ [0x15EB]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER PEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15EB,
+ },
+ [0x15EC]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15EC,
+ },
+ [0x15ED]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15ED,
+ },
+ [0x15EE]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15EE,
+ },
+ [0x15EF]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15EF,
+ },
+ [0x15F0]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F0,
+ },
+ [0x15F1]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F1,
+ },
+ [0x15F2]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F2,
+ },
+ [0x15F3]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F3,
+ },
+ [0x15F4]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F4,
+ },
+ [0x15F5]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F5,
+ },
+ [0x15F6]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F6,
+ },
+ [0x15F7]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F7,
+ },
+ [0x15F8]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F8,
+ },
+ [0x15F9]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15F9,
+ },
+ [0x15FA]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15FA,
+ },
+ [0x15FB]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KKU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15FB,
+ },
+ [0x15FC]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KKO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15FC,
+ },
+ [0x15FD]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15FD,
+ },
+ [0x15FE]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KKEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15FE,
+ },
+ [0x15FF]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KKI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x15FF,
+ },
+ [0x1600]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KKA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1600,
+ },
+ [0x1601]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER KK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1601,
+ },
+ [0x1602]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER NU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1602,
+ },
+ [0x1603]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER NO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1603,
+ },
+ [0x1604]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1604,
+ },
+ [0x1605]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER NEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1605,
+ },
+ [0x1606]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1606,
+ },
+ [0x1607]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1607,
+ },
+ [0x1608]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER MU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1608,
+ },
+ [0x1609]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER MO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1609,
+ },
+ [0x160A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x160A,
+ },
+ [0x160B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER MEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x160B,
+ },
+ [0x160C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x160C,
+ },
+ [0x160D]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x160D,
+ },
+ [0x160E]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER YU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x160E,
+ },
+ [0x160F]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER YO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x160F,
+ },
+ [0x1610]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER YE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1610,
+ },
+ [0x1611]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER YEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1611,
+ },
+ [0x1612]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER YI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1612,
+ },
+ [0x1613]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1613,
+ },
+ [0x1614]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1614,
+ },
+ [0x1615]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI JU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1615,
+ },
+ [0x1616]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1616,
+ },
+ [0x1617]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1617,
+ },
+ [0x1618]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1618,
+ },
+ [0x1619]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1619,
+ },
+ [0x161A]={
+ category="lo",
+ description="CANADIAN SYLLABICS SAYISI JI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x161A,
+ },
+ [0x161B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x161B,
+ },
+ [0x161C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JJU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x161C,
+ },
+ [0x161D]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JJO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x161D,
+ },
+ [0x161E]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JJE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x161E,
+ },
+ [0x161F]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JJEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x161F,
+ },
+ [0x1620]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JJI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1620,
+ },
+ [0x1621]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER JJA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1621,
+ },
+ [0x1622]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1622,
+ },
+ [0x1623]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1623,
+ },
+ [0x1624]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1624,
+ },
+ [0x1625]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1625,
+ },
+ [0x1626]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1626,
+ },
+ [0x1627]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1627,
+ },
+ [0x1628]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DLU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1628,
+ },
+ [0x1629]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1629,
+ },
+ [0x162A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x162A,
+ },
+ [0x162B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DLEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x162B,
+ },
+ [0x162C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x162C,
+ },
+ [0x162D]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x162D,
+ },
+ [0x162E]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x162E,
+ },
+ [0x162F]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x162F,
+ },
+ [0x1630]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1630,
+ },
+ [0x1631]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1631,
+ },
+ [0x1632]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1632,
+ },
+ [0x1633]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER LHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1633,
+ },
+ [0x1634]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1634,
+ },
+ [0x1635]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1635,
+ },
+ [0x1636]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1636,
+ },
+ [0x1637]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1637,
+ },
+ [0x1638]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1638,
+ },
+ [0x1639]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1639,
+ },
+ [0x163A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x163A,
+ },
+ [0x163B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x163B,
+ },
+ [0x163C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x163C,
+ },
+ [0x163D]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x163D,
+ },
+ [0x163E]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x163E,
+ },
+ [0x163F]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x163F,
+ },
+ [0x1640]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER ZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1640,
+ },
+ [0x1641]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER ZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1641,
+ },
+ [0x1642]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER ZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1642,
+ },
+ [0x1643]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER ZEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1643,
+ },
+ [0x1644]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER ZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1644,
+ },
+ [0x1645]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1645,
+ },
+ [0x1646]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER Z",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1646,
+ },
+ [0x1647]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER INITIAL Z",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1647,
+ },
+ [0x1648]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1648,
+ },
+ [0x1649]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1649,
+ },
+ [0x164A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x164A,
+ },
+ [0x164B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DZEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x164B,
+ },
+ [0x164C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x164C,
+ },
+ [0x164D]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER DZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x164D,
+ },
+ [0x164E]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x164E,
+ },
+ [0x164F]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x164F,
+ },
+ [0x1650]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1650,
+ },
+ [0x1651]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1651,
+ },
+ [0x1652]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1652,
+ },
+ [0x1653]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1653,
+ },
+ [0x1654]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1654,
+ },
+ [0x1655]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1655,
+ },
+ [0x1656]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1656,
+ },
+ [0x1657]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1657,
+ },
+ [0x1658]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1658,
+ },
+ [0x1659]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1659,
+ },
+ [0x165A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER SH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x165A,
+ },
+ [0x165B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TSU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x165B,
+ },
+ [0x165C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TSO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x165C,
+ },
+ [0x165D]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TSE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x165D,
+ },
+ [0x165E]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TSEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x165E,
+ },
+ [0x165F]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TSI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x165F,
+ },
+ [0x1660]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1660,
+ },
+ [0x1661]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER CHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1661,
+ },
+ [0x1662]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER CHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1662,
+ },
+ [0x1663]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER CHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1663,
+ },
+ [0x1664]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER CHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1664,
+ },
+ [0x1665]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER CHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1665,
+ },
+ [0x1666]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1666,
+ },
+ [0x1667]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTSU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1667,
+ },
+ [0x1668]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTSO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1668,
+ },
+ [0x1669]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTSE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1669,
+ },
+ [0x166A]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTSEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x166A,
+ },
+ [0x166B]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTSI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x166B,
+ },
+ [0x166C]={
+ category="lo",
+ description="CANADIAN SYLLABICS CARRIER TTSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x166C,
+ },
+ [0x166D]={
+ category="po",
+ description="CANADIAN SYLLABICS CHI SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x166D,
+ },
+ [0x166E]={
+ category="po",
+ description="CANADIAN SYLLABICS FULL STOP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x166E,
+ },
+ [0x166F]={
+ category="lo",
+ description="CANADIAN SYLLABICS QAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x166F,
+ },
+ [0x1670]={
+ category="lo",
+ description="CANADIAN SYLLABICS NGAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1670,
+ },
+ [0x1671]={
+ category="lo",
+ description="CANADIAN SYLLABICS NNGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1671,
+ },
+ [0x1672]={
+ category="lo",
+ description="CANADIAN SYLLABICS NNGII",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1672,
+ },
+ [0x1673]={
+ category="lo",
+ description="CANADIAN SYLLABICS NNGO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1673,
+ },
+ [0x1674]={
+ category="lo",
+ description="CANADIAN SYLLABICS NNGOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1674,
+ },
+ [0x1675]={
+ category="lo",
+ description="CANADIAN SYLLABICS NNGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1675,
+ },
+ [0x1676]={
+ category="lo",
+ description="CANADIAN SYLLABICS NNGAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1676,
+ },
+ [0x1680]={
+ category="zs",
+ description="OGHAM SPACE MARK",
+ direction="ws",
+ linebreak="ba",
+ unicodeslot=0x1680,
+ },
+ [0x1681]={
+ category="lo",
+ description="OGHAM LETTER BEITH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1681,
+ },
+ [0x1682]={
+ category="lo",
+ description="OGHAM LETTER LUIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1682,
+ },
+ [0x1683]={
+ category="lo",
+ description="OGHAM LETTER FEARN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1683,
+ },
+ [0x1684]={
+ category="lo",
+ description="OGHAM LETTER SAIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1684,
+ },
+ [0x1685]={
+ category="lo",
+ description="OGHAM LETTER NION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1685,
+ },
+ [0x1686]={
+ category="lo",
+ description="OGHAM LETTER UATH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1686,
+ },
+ [0x1687]={
+ category="lo",
+ description="OGHAM LETTER DAIR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1687,
+ },
+ [0x1688]={
+ category="lo",
+ description="OGHAM LETTER TINNE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1688,
+ },
+ [0x1689]={
+ category="lo",
+ description="OGHAM LETTER COLL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1689,
+ },
+ [0x168A]={
+ category="lo",
+ description="OGHAM LETTER CEIRT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x168A,
+ },
+ [0x168B]={
+ category="lo",
+ description="OGHAM LETTER MUIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x168B,
+ },
+ [0x168C]={
+ category="lo",
+ description="OGHAM LETTER GORT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x168C,
+ },
+ [0x168D]={
+ category="lo",
+ description="OGHAM LETTER NGEADAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x168D,
+ },
+ [0x168E]={
+ category="lo",
+ description="OGHAM LETTER STRAIF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x168E,
+ },
+ [0x168F]={
+ category="lo",
+ description="OGHAM LETTER RUIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x168F,
+ },
+ [0x1690]={
+ category="lo",
+ description="OGHAM LETTER AILM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1690,
+ },
+ [0x1691]={
+ category="lo",
+ description="OGHAM LETTER ONN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1691,
+ },
+ [0x1692]={
+ category="lo",
+ description="OGHAM LETTER UR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1692,
+ },
+ [0x1693]={
+ category="lo",
+ description="OGHAM LETTER EADHADH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1693,
+ },
+ [0x1694]={
+ category="lo",
+ description="OGHAM LETTER IODHADH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1694,
+ },
+ [0x1695]={
+ category="lo",
+ description="OGHAM LETTER EABHADH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1695,
+ },
+ [0x1696]={
+ category="lo",
+ description="OGHAM LETTER OR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1696,
+ },
+ [0x1697]={
+ category="lo",
+ description="OGHAM LETTER UILLEANN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1697,
+ },
+ [0x1698]={
+ category="lo",
+ description="OGHAM LETTER IFIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1698,
+ },
+ [0x1699]={
+ category="lo",
+ description="OGHAM LETTER EAMHANCHOLL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1699,
+ },
+ [0x169A]={
+ category="lo",
+ description="OGHAM LETTER PEITH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x169A,
+ },
+ [0x169B]={
+ category="ps",
+ description="OGHAM FEATHER MARK",
+ direction="on",
+ linebreak="op",
+ mirror=0x169C,
+ unicodeslot=0x169B,
+ },
+ [0x169C]={
+ category="pe",
+ description="OGHAM REVERSED FEATHER MARK",
+ direction="on",
+ linebreak="cl",
+ mirror=0x169B,
+ unicodeslot=0x169C,
+ },
+ [0x16A0]={
+ category="lo",
+ description="RUNIC LETTER FEHU FEOH FE F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A0,
+ },
+ [0x16A1]={
+ category="lo",
+ description="RUNIC LETTER V",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A1,
+ },
+ [0x16A2]={
+ category="lo",
+ description="RUNIC LETTER URUZ UR U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A2,
+ },
+ [0x16A3]={
+ category="lo",
+ description="RUNIC LETTER YR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A3,
+ },
+ [0x16A4]={
+ category="lo",
+ description="RUNIC LETTER Y",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A4,
+ },
+ [0x16A5]={
+ category="lo",
+ description="RUNIC LETTER W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A5,
+ },
+ [0x16A6]={
+ category="lo",
+ description="RUNIC LETTER THURISAZ THURS THORN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A6,
+ },
+ [0x16A7]={
+ category="lo",
+ description="RUNIC LETTER ETH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A7,
+ },
+ [0x16A8]={
+ category="lo",
+ description="RUNIC LETTER ANSUZ A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A8,
+ },
+ [0x16A9]={
+ category="lo",
+ description="RUNIC LETTER OS O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16A9,
+ },
+ [0x16AA]={
+ category="lo",
+ description="RUNIC LETTER AC A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AA,
+ },
+ [0x16AB]={
+ category="lo",
+ description="RUNIC LETTER AESC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AB,
+ },
+ [0x16AC]={
+ category="lo",
+ description="RUNIC LETTER LONG-BRANCH-OSS O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AC,
+ },
+ [0x16AD]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-OSS O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AD,
+ },
+ [0x16AE]={
+ category="lo",
+ description="RUNIC LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AE,
+ },
+ [0x16AF]={
+ category="lo",
+ description="RUNIC LETTER OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16AF,
+ },
+ [0x16B0]={
+ category="lo",
+ description="RUNIC LETTER ON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B0,
+ },
+ [0x16B1]={
+ category="lo",
+ description="RUNIC LETTER RAIDO RAD REID R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B1,
+ },
+ [0x16B2]={
+ category="lo",
+ description="RUNIC LETTER KAUNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B2,
+ },
+ [0x16B3]={
+ category="lo",
+ description="RUNIC LETTER CEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B3,
+ },
+ [0x16B4]={
+ category="lo",
+ description="RUNIC LETTER KAUN K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B4,
+ },
+ [0x16B5]={
+ category="lo",
+ description="RUNIC LETTER G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B5,
+ },
+ [0x16B6]={
+ category="lo",
+ description="RUNIC LETTER ENG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B6,
+ },
+ [0x16B7]={
+ category="lo",
+ description="RUNIC LETTER GEBO GYFU G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B7,
+ },
+ [0x16B8]={
+ category="lo",
+ description="RUNIC LETTER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B8,
+ },
+ [0x16B9]={
+ category="lo",
+ description="RUNIC LETTER WUNJO WYNN W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16B9,
+ },
+ [0x16BA]={
+ category="lo",
+ description="RUNIC LETTER HAGLAZ H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16BA,
+ },
+ [0x16BB]={
+ category="lo",
+ description="RUNIC LETTER HAEGL H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16BB,
+ },
+ [0x16BC]={
+ category="lo",
+ description="RUNIC LETTER LONG-BRANCH-HAGALL H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16BC,
+ },
+ [0x16BD]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-HAGALL H",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16BD,
+ },
+ [0x16BE]={
+ category="lo",
+ description="RUNIC LETTER NAUDIZ NYD NAUD N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16BE,
+ },
+ [0x16BF]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-NAUD N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16BF,
+ },
+ [0x16C0]={
+ category="lo",
+ description="RUNIC LETTER DOTTED-N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C0,
+ },
+ [0x16C1]={
+ category="lo",
+ description="RUNIC LETTER ISAZ IS ISS I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C1,
+ },
+ [0x16C2]={
+ category="lo",
+ description="RUNIC LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C2,
+ },
+ [0x16C3]={
+ category="lo",
+ description="RUNIC LETTER JERAN J",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C3,
+ },
+ [0x16C4]={
+ category="lo",
+ description="RUNIC LETTER GER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C4,
+ },
+ [0x16C5]={
+ category="lo",
+ description="RUNIC LETTER LONG-BRANCH-AR AE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C5,
+ },
+ [0x16C6]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-AR A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C6,
+ },
+ [0x16C7]={
+ category="lo",
+ description="RUNIC LETTER IWAZ EOH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C7,
+ },
+ [0x16C8]={
+ category="lo",
+ description="RUNIC LETTER PERTHO PEORTH P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C8,
+ },
+ [0x16C9]={
+ category="lo",
+ description="RUNIC LETTER ALGIZ EOLHX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16C9,
+ },
+ [0x16CA]={
+ category="lo",
+ description="RUNIC LETTER SOWILO S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16CA,
+ },
+ [0x16CB]={
+ category="lo",
+ description="RUNIC LETTER SIGEL LONG-BRANCH-SOL S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16CB,
+ },
+ [0x16CC]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-SOL S",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16CC,
+ },
+ [0x16CD]={
+ category="lo",
+ description="RUNIC LETTER C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16CD,
+ },
+ [0x16CE]={
+ category="lo",
+ description="RUNIC LETTER Z",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16CE,
+ },
+ [0x16CF]={
+ category="lo",
+ description="RUNIC LETTER TIWAZ TIR TYR T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16CF,
+ },
+ [0x16D0]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-TYR T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D0,
+ },
+ [0x16D1]={
+ category="lo",
+ description="RUNIC LETTER D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D1,
+ },
+ [0x16D2]={
+ category="lo",
+ description="RUNIC LETTER BERKANAN BEORC BJARKAN B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D2,
+ },
+ [0x16D3]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-BJARKAN B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D3,
+ },
+ [0x16D4]={
+ category="lo",
+ description="RUNIC LETTER DOTTED-P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D4,
+ },
+ [0x16D5]={
+ category="lo",
+ description="RUNIC LETTER OPEN-P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D5,
+ },
+ [0x16D6]={
+ category="lo",
+ description="RUNIC LETTER EHWAZ EH E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D6,
+ },
+ [0x16D7]={
+ category="lo",
+ description="RUNIC LETTER MANNAZ MAN M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D7,
+ },
+ [0x16D8]={
+ category="lo",
+ description="RUNIC LETTER LONG-BRANCH-MADR M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D8,
+ },
+ [0x16D9]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-MADR M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16D9,
+ },
+ [0x16DA]={
+ category="lo",
+ description="RUNIC LETTER LAUKAZ LAGU LOGR L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16DA,
+ },
+ [0x16DB]={
+ category="lo",
+ description="RUNIC LETTER DOTTED-L",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16DB,
+ },
+ [0x16DC]={
+ category="lo",
+ description="RUNIC LETTER INGWAZ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16DC,
+ },
+ [0x16DD]={
+ category="lo",
+ description="RUNIC LETTER ING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16DD,
+ },
+ [0x16DE]={
+ category="lo",
+ description="RUNIC LETTER DAGAZ DAEG D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16DE,
+ },
+ [0x16DF]={
+ category="lo",
+ description="RUNIC LETTER OTHALAN ETHEL O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16DF,
+ },
+ [0x16E0]={
+ category="lo",
+ description="RUNIC LETTER EAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E0,
+ },
+ [0x16E1]={
+ category="lo",
+ description="RUNIC LETTER IOR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E1,
+ },
+ [0x16E2]={
+ category="lo",
+ description="RUNIC LETTER CWEORTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E2,
+ },
+ [0x16E3]={
+ category="lo",
+ description="RUNIC LETTER CALC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E3,
+ },
+ [0x16E4]={
+ category="lo",
+ description="RUNIC LETTER CEALC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E4,
+ },
+ [0x16E5]={
+ category="lo",
+ description="RUNIC LETTER STAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E5,
+ },
+ [0x16E6]={
+ category="lo",
+ description="RUNIC LETTER LONG-BRANCH-YR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E6,
+ },
+ [0x16E7]={
+ category="lo",
+ description="RUNIC LETTER SHORT-TWIG-YR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E7,
+ },
+ [0x16E8]={
+ category="lo",
+ description="RUNIC LETTER ICELANDIC-YR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E8,
+ },
+ [0x16E9]={
+ category="lo",
+ description="RUNIC LETTER Q",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16E9,
+ },
+ [0x16EA]={
+ category="lo",
+ description="RUNIC LETTER X",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16EA,
+ },
+ [0x16EB]={
+ category="po",
+ description="RUNIC SINGLE PUNCTUATION",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16EB,
+ },
+ [0x16EC]={
+ category="po",
+ description="RUNIC MULTIPLE PUNCTUATION",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16EC,
+ },
+ [0x16ED]={
+ category="po",
+ description="RUNIC CROSS PUNCTUATION",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x16ED,
+ },
+ [0x16EE]={
+ category="nl",
+ description="RUNIC ARLAUG SYMBOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16EE,
+ },
+ [0x16EF]={
+ category="nl",
+ description="RUNIC TVIMADUR SYMBOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16EF,
+ },
+ [0x16F0]={
+ category="nl",
+ description="RUNIC BELGTHOR SYMBOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x16F0,
+ },
+ [0x1700]={
+ category="lo",
+ description="TAGALOG LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1700,
+ },
+ [0x1701]={
+ category="lo",
+ description="TAGALOG LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1701,
+ },
+ [0x1702]={
+ category="lo",
+ description="TAGALOG LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1702,
+ },
+ [0x1703]={
+ category="lo",
+ description="TAGALOG LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1703,
+ },
+ [0x1704]={
+ category="lo",
+ description="TAGALOG LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1704,
+ },
+ [0x1705]={
+ category="lo",
+ description="TAGALOG LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1705,
+ },
+ [0x1706]={
+ category="lo",
+ description="TAGALOG LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1706,
+ },
+ [0x1707]={
+ category="lo",
+ description="TAGALOG LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1707,
+ },
+ [0x1708]={
+ category="lo",
+ description="TAGALOG LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1708,
+ },
+ [0x1709]={
+ category="lo",
+ description="TAGALOG LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1709,
+ },
+ [0x170A]={
+ category="lo",
+ description="TAGALOG LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x170A,
+ },
+ [0x170B]={
+ category="lo",
+ description="TAGALOG LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x170B,
+ },
+ [0x170C]={
+ category="lo",
+ description="TAGALOG LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x170C,
+ },
+ [0x170E]={
+ category="lo",
+ description="TAGALOG LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x170E,
+ },
+ [0x170F]={
+ category="lo",
+ description="TAGALOG LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x170F,
+ },
+ [0x1710]={
+ category="lo",
+ description="TAGALOG LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1710,
+ },
+ [0x1711]={
+ category="lo",
+ description="TAGALOG LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1711,
+ },
+ [0x1712]={
+ category="mn",
+ description="TAGALOG VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1712,
+ },
+ [0x1713]={
+ category="mn",
+ description="TAGALOG VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1713,
+ },
+ [0x1714]={
+ category="mn",
+ description="TAGALOG SIGN VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1714,
+ },
+ [0x1720]={
+ category="lo",
+ description="HANUNOO LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1720,
+ },
+ [0x1721]={
+ category="lo",
+ description="HANUNOO LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1721,
+ },
+ [0x1722]={
+ category="lo",
+ description="HANUNOO LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1722,
+ },
+ [0x1723]={
+ category="lo",
+ description="HANUNOO LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1723,
+ },
+ [0x1724]={
+ category="lo",
+ description="HANUNOO LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1724,
+ },
+ [0x1725]={
+ category="lo",
+ description="HANUNOO LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1725,
+ },
+ [0x1726]={
+ category="lo",
+ description="HANUNOO LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1726,
+ },
+ [0x1727]={
+ category="lo",
+ description="HANUNOO LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1727,
+ },
+ [0x1728]={
+ category="lo",
+ description="HANUNOO LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1728,
+ },
+ [0x1729]={
+ category="lo",
+ description="HANUNOO LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1729,
+ },
+ [0x172A]={
+ category="lo",
+ description="HANUNOO LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x172A,
+ },
+ [0x172B]={
+ category="lo",
+ description="HANUNOO LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x172B,
+ },
+ [0x172C]={
+ category="lo",
+ description="HANUNOO LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x172C,
+ },
+ [0x172D]={
+ category="lo",
+ description="HANUNOO LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x172D,
+ },
+ [0x172E]={
+ category="lo",
+ description="HANUNOO LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x172E,
+ },
+ [0x172F]={
+ category="lo",
+ description="HANUNOO LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x172F,
+ },
+ [0x1730]={
+ category="lo",
+ description="HANUNOO LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1730,
+ },
+ [0x1731]={
+ category="lo",
+ description="HANUNOO LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1731,
+ },
+ [0x1732]={
+ category="mn",
+ description="HANUNOO VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1732,
+ },
+ [0x1733]={
+ category="mn",
+ description="HANUNOO VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1733,
+ },
+ [0x1734]={
+ category="mn",
+ description="HANUNOO SIGN PAMUDPOD",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1734,
+ },
+ [0x1735]={
+ category="po",
+ description="PHILIPPINE SINGLE PUNCTUATION",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1735,
+ },
+ [0x1736]={
+ category="po",
+ description="PHILIPPINE DOUBLE PUNCTUATION",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1736,
+ },
+ [0x1740]={
+ category="lo",
+ description="BUHID LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1740,
+ },
+ [0x1741]={
+ category="lo",
+ description="BUHID LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1741,
+ },
+ [0x1742]={
+ category="lo",
+ description="BUHID LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1742,
+ },
+ [0x1743]={
+ category="lo",
+ description="BUHID LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1743,
+ },
+ [0x1744]={
+ category="lo",
+ description="BUHID LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1744,
+ },
+ [0x1745]={
+ category="lo",
+ description="BUHID LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1745,
+ },
+ [0x1746]={
+ category="lo",
+ description="BUHID LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1746,
+ },
+ [0x1747]={
+ category="lo",
+ description="BUHID LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1747,
+ },
+ [0x1748]={
+ category="lo",
+ description="BUHID LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1748,
+ },
+ [0x1749]={
+ category="lo",
+ description="BUHID LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1749,
+ },
+ [0x174A]={
+ category="lo",
+ description="BUHID LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x174A,
+ },
+ [0x174B]={
+ category="lo",
+ description="BUHID LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x174B,
+ },
+ [0x174C]={
+ category="lo",
+ description="BUHID LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x174C,
+ },
+ [0x174D]={
+ category="lo",
+ description="BUHID LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x174D,
+ },
+ [0x174E]={
+ category="lo",
+ description="BUHID LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x174E,
+ },
+ [0x174F]={
+ category="lo",
+ description="BUHID LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x174F,
+ },
+ [0x1750]={
+ category="lo",
+ description="BUHID LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1750,
+ },
+ [0x1751]={
+ category="lo",
+ description="BUHID LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1751,
+ },
+ [0x1752]={
+ category="mn",
+ description="BUHID VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1752,
+ },
+ [0x1753]={
+ category="mn",
+ description="BUHID VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1753,
+ },
+ [0x1760]={
+ category="lo",
+ description="TAGBANWA LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1760,
+ },
+ [0x1761]={
+ category="lo",
+ description="TAGBANWA LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1761,
+ },
+ [0x1762]={
+ category="lo",
+ description="TAGBANWA LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1762,
+ },
+ [0x1763]={
+ category="lo",
+ description="TAGBANWA LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1763,
+ },
+ [0x1764]={
+ category="lo",
+ description="TAGBANWA LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1764,
+ },
+ [0x1765]={
+ category="lo",
+ description="TAGBANWA LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1765,
+ },
+ [0x1766]={
+ category="lo",
+ description="TAGBANWA LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1766,
+ },
+ [0x1767]={
+ category="lo",
+ description="TAGBANWA LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1767,
+ },
+ [0x1768]={
+ category="lo",
+ description="TAGBANWA LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1768,
+ },
+ [0x1769]={
+ category="lo",
+ description="TAGBANWA LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1769,
+ },
+ [0x176A]={
+ category="lo",
+ description="TAGBANWA LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x176A,
+ },
+ [0x176B]={
+ category="lo",
+ description="TAGBANWA LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x176B,
+ },
+ [0x176C]={
+ category="lo",
+ description="TAGBANWA LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x176C,
+ },
+ [0x176E]={
+ category="lo",
+ description="TAGBANWA LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x176E,
+ },
+ [0x176F]={
+ category="lo",
+ description="TAGBANWA LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x176F,
+ },
+ [0x1770]={
+ category="lo",
+ description="TAGBANWA LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1770,
+ },
+ [0x1772]={
+ category="mn",
+ description="TAGBANWA VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1772,
+ },
+ [0x1773]={
+ category="mn",
+ description="TAGBANWA VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1773,
+ },
+ [0x1780]={
+ category="lo",
+ description="KHMER LETTER KA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1780,
+ },
+ [0x1781]={
+ category="lo",
+ description="KHMER LETTER KHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1781,
+ },
+ [0x1782]={
+ category="lo",
+ description="KHMER LETTER KO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1782,
+ },
+ [0x1783]={
+ category="lo",
+ description="KHMER LETTER KHO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1783,
+ },
+ [0x1784]={
+ category="lo",
+ description="KHMER LETTER NGO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1784,
+ },
+ [0x1785]={
+ category="lo",
+ description="KHMER LETTER CA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1785,
+ },
+ [0x1786]={
+ category="lo",
+ description="KHMER LETTER CHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1786,
+ },
+ [0x1787]={
+ category="lo",
+ description="KHMER LETTER CO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1787,
+ },
+ [0x1788]={
+ category="lo",
+ description="KHMER LETTER CHO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1788,
+ },
+ [0x1789]={
+ category="lo",
+ description="KHMER LETTER NYO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1789,
+ },
+ [0x178A]={
+ category="lo",
+ description="KHMER LETTER DA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x178A,
+ },
+ [0x178B]={
+ category="lo",
+ description="KHMER LETTER TTHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x178B,
+ },
+ [0x178C]={
+ category="lo",
+ description="KHMER LETTER DO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x178C,
+ },
+ [0x178D]={
+ category="lo",
+ description="KHMER LETTER TTHO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x178D,
+ },
+ [0x178E]={
+ category="lo",
+ description="KHMER LETTER NNO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x178E,
+ },
+ [0x178F]={
+ category="lo",
+ description="KHMER LETTER TA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x178F,
+ },
+ [0x1790]={
+ category="lo",
+ description="KHMER LETTER THA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1790,
+ },
+ [0x1791]={
+ category="lo",
+ description="KHMER LETTER TO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1791,
+ },
+ [0x1792]={
+ category="lo",
+ description="KHMER LETTER THO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1792,
+ },
+ [0x1793]={
+ category="lo",
+ description="KHMER LETTER NO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1793,
+ },
+ [0x1794]={
+ category="lo",
+ description="KHMER LETTER BA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1794,
+ },
+ [0x1795]={
+ category="lo",
+ description="KHMER LETTER PHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1795,
+ },
+ [0x1796]={
+ category="lo",
+ description="KHMER LETTER PO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1796,
+ },
+ [0x1797]={
+ category="lo",
+ description="KHMER LETTER PHO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1797,
+ },
+ [0x1798]={
+ category="lo",
+ description="KHMER LETTER MO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1798,
+ },
+ [0x1799]={
+ category="lo",
+ description="KHMER LETTER YO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1799,
+ },
+ [0x179A]={
+ category="lo",
+ description="KHMER LETTER RO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x179A,
+ },
+ [0x179B]={
+ category="lo",
+ description="KHMER LETTER LO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x179B,
+ },
+ [0x179C]={
+ category="lo",
+ description="KHMER LETTER VO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x179C,
+ },
+ [0x179D]={
+ category="lo",
+ description="KHMER LETTER SHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x179D,
+ },
+ [0x179E]={
+ category="lo",
+ description="KHMER LETTER SSO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x179E,
+ },
+ [0x179F]={
+ category="lo",
+ description="KHMER LETTER SA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x179F,
+ },
+ [0x17A0]={
+ category="lo",
+ description="KHMER LETTER HA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A0,
+ },
+ [0x17A1]={
+ category="lo",
+ description="KHMER LETTER LA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A1,
+ },
+ [0x17A2]={
+ category="lo",
+ description="KHMER LETTER QA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A2,
+ },
+ [0x17A3]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QAQ",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A3,
+ },
+ [0x17A4]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QAA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A4,
+ },
+ [0x17A5]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A5,
+ },
+ [0x17A6]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QII",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A6,
+ },
+ [0x17A7]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A7,
+ },
+ [0x17A8]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QUK",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A8,
+ },
+ [0x17A9]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QUU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17A9,
+ },
+ [0x17AA]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QUUV",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17AA,
+ },
+ [0x17AB]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL RY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17AB,
+ },
+ [0x17AC]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL RYY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17AC,
+ },
+ [0x17AD]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL LY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17AD,
+ },
+ [0x17AE]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL LYY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17AE,
+ },
+ [0x17AF]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17AF,
+ },
+ [0x17B0]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QAI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17B0,
+ },
+ [0x17B1]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QOO TYPE ONE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17B1,
+ },
+ [0x17B2]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QOO TYPE TWO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17B2,
+ },
+ [0x17B3]={
+ category="lo",
+ description="KHMER INDEPENDENT VOWEL QAU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17B3,
+ },
+ [0x17B4]={
+ category="cf",
+ description="KHMER VOWEL INHERENT AQ",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17B4,
+ },
+ [0x17B5]={
+ category="cf",
+ description="KHMER VOWEL INHERENT AA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17B5,
+ },
+ [0x17B6]={
+ category="mc",
+ description="KHMER VOWEL SIGN AA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17B6,
+ },
+ [0x17B7]={
+ category="mn",
+ description="KHMER VOWEL SIGN I",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17B7,
+ },
+ [0x17B8]={
+ category="mn",
+ description="KHMER VOWEL SIGN II",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17B8,
+ },
+ [0x17B9]={
+ category="mn",
+ description="KHMER VOWEL SIGN Y",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17B9,
+ },
+ [0x17BA]={
+ category="mn",
+ description="KHMER VOWEL SIGN YY",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17BA,
+ },
+ [0x17BB]={
+ category="mn",
+ description="KHMER VOWEL SIGN U",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17BB,
+ },
+ [0x17BC]={
+ category="mn",
+ description="KHMER VOWEL SIGN UU",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17BC,
+ },
+ [0x17BD]={
+ category="mn",
+ description="KHMER VOWEL SIGN UA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17BD,
+ },
+ [0x17BE]={
+ category="mc",
+ description="KHMER VOWEL SIGN OE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17BE,
+ },
+ [0x17BF]={
+ category="mc",
+ description="KHMER VOWEL SIGN YA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17BF,
+ },
+ [0x17C0]={
+ category="mc",
+ description="KHMER VOWEL SIGN IE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C0,
+ },
+ [0x17C1]={
+ category="mc",
+ description="KHMER VOWEL SIGN E",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C1,
+ },
+ [0x17C2]={
+ category="mc",
+ description="KHMER VOWEL SIGN AE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C2,
+ },
+ [0x17C3]={
+ category="mc",
+ description="KHMER VOWEL SIGN AI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C3,
+ },
+ [0x17C4]={
+ category="mc",
+ description="KHMER VOWEL SIGN OO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C4,
+ },
+ [0x17C5]={
+ category="mc",
+ description="KHMER VOWEL SIGN AU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C5,
+ },
+ [0x17C6]={
+ category="mn",
+ description="KHMER SIGN NIKAHIT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17C6,
+ },
+ [0x17C7]={
+ category="mc",
+ description="KHMER SIGN REAHMUK",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C7,
+ },
+ [0x17C8]={
+ category="mc",
+ description="KHMER SIGN YUUKALEAPINTU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17C8,
+ },
+ [0x17C9]={
+ category="mn",
+ description="KHMER SIGN MUUSIKATOAN",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17C9,
+ },
+ [0x17CA]={
+ category="mn",
+ description="KHMER SIGN TRIISAP",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17CA,
+ },
+ [0x17CB]={
+ category="mn",
+ description="KHMER SIGN BANTOC",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17CB,
+ },
+ [0x17CC]={
+ category="mn",
+ description="KHMER SIGN ROBAT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17CC,
+ },
+ [0x17CD]={
+ category="mn",
+ description="KHMER SIGN TOANDAKHIAT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17CD,
+ },
+ [0x17CE]={
+ category="mn",
+ description="KHMER SIGN KAKABAT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17CE,
+ },
+ [0x17CF]={
+ category="mn",
+ description="KHMER SIGN AHSDA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17CF,
+ },
+ [0x17D0]={
+ category="mn",
+ description="KHMER SIGN SAMYOK SANNYA",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17D0,
+ },
+ [0x17D1]={
+ category="mn",
+ description="KHMER SIGN VIRIAM",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17D1,
+ },
+ [0x17D2]={
+ category="mn",
+ description="KHMER SIGN COENG",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17D2,
+ },
+ [0x17D3]={
+ category="mn",
+ description="KHMER SIGN BATHAMASAT",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17D3,
+ },
+ [0x17D4]={
+ category="po",
+ description="KHMER SIGN KHAN",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x17D4,
+ },
+ [0x17D5]={
+ category="po",
+ description="KHMER SIGN BARIYOOSAN",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x17D5,
+ },
+ [0x17D6]={
+ category="po",
+ description="KHMER SIGN CAMNUC PII KUUH",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x17D6,
+ },
+ [0x17D7]={
+ category="lm",
+ description="KHMER SIGN LEK TOO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17D7,
+ },
+ [0x17D8]={
+ category="po",
+ description="KHMER SIGN BEYYAL",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x17D8,
+ },
+ [0x17D9]={
+ category="po",
+ description="KHMER SIGN PHNAEK MUAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x17D9,
+ },
+ [0x17DA]={
+ category="po",
+ description="KHMER SIGN KOOMUUT",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x17DA,
+ },
+ [0x17DB]={
+ category="sc",
+ description="KHMER CURRENCY SYMBOL RIEL",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x17DB,
+ },
+ [0x17DC]={
+ category="lo",
+ description="KHMER SIGN AVAKRAHASANYA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x17DC,
+ },
+ [0x17DD]={
+ category="mn",
+ description="KHMER SIGN ATTHACAN",
+ direction="nsm",
+ linebreak="sa",
+ unicodeslot=0x17DD,
+ },
+ [0x17E0]={
+ category="nd",
+ description="KHMER DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E0,
+ },
+ [0x17E1]={
+ category="nd",
+ description="KHMER DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E1,
+ },
+ [0x17E2]={
+ category="nd",
+ description="KHMER DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E2,
+ },
+ [0x17E3]={
+ category="nd",
+ description="KHMER DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E3,
+ },
+ [0x17E4]={
+ category="nd",
+ description="KHMER DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E4,
+ },
+ [0x17E5]={
+ category="nd",
+ description="KHMER DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E5,
+ },
+ [0x17E6]={
+ category="nd",
+ description="KHMER DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E6,
+ },
+ [0x17E7]={
+ category="nd",
+ description="KHMER DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E7,
+ },
+ [0x17E8]={
+ category="nd",
+ description="KHMER DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E8,
+ },
+ [0x17E9]={
+ category="nd",
+ description="KHMER DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x17E9,
+ },
+ [0x17F0]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK SON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F0,
+ },
+ [0x17F1]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK MUOY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F1,
+ },
+ [0x17F2]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK PII",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F2,
+ },
+ [0x17F3]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK BEI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F3,
+ },
+ [0x17F4]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK BUON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F4,
+ },
+ [0x17F5]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK PRAM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F5,
+ },
+ [0x17F6]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK PRAM-MUOY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F6,
+ },
+ [0x17F7]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK PRAM-PII",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F7,
+ },
+ [0x17F8]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK PRAM-BEI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F8,
+ },
+ [0x17F9]={
+ category="no",
+ description="KHMER SYMBOL LEK ATTAK PRAM-BUON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x17F9,
+ },
+ [0x1800]={
+ category="po",
+ description="MONGOLIAN BIRGA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1800,
+ },
+ [0x1801]={
+ category="po",
+ description="MONGOLIAN ELLIPSIS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1801,
+ },
+ [0x1802]={
+ category="po",
+ description="MONGOLIAN COMMA",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x1802,
+ },
+ [0x1803]={
+ category="po",
+ description="MONGOLIAN FULL STOP",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x1803,
+ },
+ [0x1804]={
+ category="po",
+ description="MONGOLIAN COLON",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x1804,
+ },
+ [0x1805]={
+ category="po",
+ description="MONGOLIAN FOUR DOTS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x1805,
+ },
+ [0x1806]={
+ category="pd",
+ description="MONGOLIAN TODO SOFT HYPHEN",
+ direction="on",
+ linebreak="bb",
+ unicodeslot=0x1806,
+ },
+ [0x1807]={
+ category="po",
+ description="MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1807,
+ },
+ [0x1808]={
+ category="po",
+ description="MONGOLIAN MANCHU COMMA",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x1808,
+ },
+ [0x1809]={
+ category="po",
+ description="MONGOLIAN MANCHU FULL STOP",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x1809,
+ },
+ [0x180A]={
+ category="po",
+ description="MONGOLIAN NIRUGU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x180A,
+ },
+ [0x180B]={
+ category="mn",
+ description="MONGOLIAN FREE VARIATION SELECTOR ONE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x180B,
+ },
+ [0x180C]={
+ category="mn",
+ description="MONGOLIAN FREE VARIATION SELECTOR TWO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x180C,
+ },
+ [0x180D]={
+ category="mn",
+ description="MONGOLIAN FREE VARIATION SELECTOR THREE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x180D,
+ },
+ [0x180E]={
+ category="zs",
+ description="MONGOLIAN VOWEL SEPARATOR",
+ direction="ws",
+ linebreak="gl",
+ unicodeslot=0x180E,
+ },
+ [0x1810]={
+ category="nd",
+ description="MONGOLIAN DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1810,
+ },
+ [0x1811]={
+ category="nd",
+ description="MONGOLIAN DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1811,
+ },
+ [0x1812]={
+ category="nd",
+ description="MONGOLIAN DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1812,
+ },
+ [0x1813]={
+ category="nd",
+ description="MONGOLIAN DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1813,
+ },
+ [0x1814]={
+ category="nd",
+ description="MONGOLIAN DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1814,
+ },
+ [0x1815]={
+ category="nd",
+ description="MONGOLIAN DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1815,
+ },
+ [0x1816]={
+ category="nd",
+ description="MONGOLIAN DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1816,
+ },
+ [0x1817]={
+ category="nd",
+ description="MONGOLIAN DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1817,
+ },
+ [0x1818]={
+ category="nd",
+ description="MONGOLIAN DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1818,
+ },
+ [0x1819]={
+ category="nd",
+ description="MONGOLIAN DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1819,
+ },
+ [0x1820]={
+ category="lo",
+ description="MONGOLIAN LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1820,
+ },
+ [0x1821]={
+ category="lo",
+ description="MONGOLIAN LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1821,
+ },
+ [0x1822]={
+ category="lo",
+ description="MONGOLIAN LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1822,
+ },
+ [0x1823]={
+ category="lo",
+ description="MONGOLIAN LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1823,
+ },
+ [0x1824]={
+ category="lo",
+ description="MONGOLIAN LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1824,
+ },
+ [0x1825]={
+ category="lo",
+ description="MONGOLIAN LETTER OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1825,
+ },
+ [0x1826]={
+ category="lo",
+ description="MONGOLIAN LETTER UE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1826,
+ },
+ [0x1827]={
+ category="lo",
+ description="MONGOLIAN LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1827,
+ },
+ [0x1828]={
+ category="lo",
+ description="MONGOLIAN LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1828,
+ },
+ [0x1829]={
+ category="lo",
+ description="MONGOLIAN LETTER ANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1829,
+ },
+ [0x182A]={
+ category="lo",
+ description="MONGOLIAN LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x182A,
+ },
+ [0x182B]={
+ category="lo",
+ description="MONGOLIAN LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x182B,
+ },
+ [0x182C]={
+ category="lo",
+ description="MONGOLIAN LETTER QA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x182C,
+ },
+ [0x182D]={
+ category="lo",
+ description="MONGOLIAN LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x182D,
+ },
+ [0x182E]={
+ category="lo",
+ description="MONGOLIAN LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x182E,
+ },
+ [0x182F]={
+ category="lo",
+ description="MONGOLIAN LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x182F,
+ },
+ [0x1830]={
+ category="lo",
+ description="MONGOLIAN LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1830,
+ },
+ [0x1831]={
+ category="lo",
+ description="MONGOLIAN LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1831,
+ },
+ [0x1832]={
+ category="lo",
+ description="MONGOLIAN LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1832,
+ },
+ [0x1833]={
+ category="lo",
+ description="MONGOLIAN LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1833,
+ },
+ [0x1834]={
+ category="lo",
+ description="MONGOLIAN LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1834,
+ },
+ [0x1835]={
+ category="lo",
+ description="MONGOLIAN LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1835,
+ },
+ [0x1836]={
+ category="lo",
+ description="MONGOLIAN LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1836,
+ },
+ [0x1837]={
+ category="lo",
+ description="MONGOLIAN LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1837,
+ },
+ [0x1838]={
+ category="lo",
+ description="MONGOLIAN LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1838,
+ },
+ [0x1839]={
+ category="lo",
+ description="MONGOLIAN LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1839,
+ },
+ [0x183A]={
+ category="lo",
+ description="MONGOLIAN LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x183A,
+ },
+ [0x183B]={
+ category="lo",
+ description="MONGOLIAN LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x183B,
+ },
+ [0x183C]={
+ category="lo",
+ description="MONGOLIAN LETTER TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x183C,
+ },
+ [0x183D]={
+ category="lo",
+ description="MONGOLIAN LETTER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x183D,
+ },
+ [0x183E]={
+ category="lo",
+ description="MONGOLIAN LETTER HAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x183E,
+ },
+ [0x183F]={
+ category="lo",
+ description="MONGOLIAN LETTER ZRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x183F,
+ },
+ [0x1840]={
+ category="lo",
+ description="MONGOLIAN LETTER LHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1840,
+ },
+ [0x1841]={
+ category="lo",
+ description="MONGOLIAN LETTER ZHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1841,
+ },
+ [0x1842]={
+ category="lo",
+ description="MONGOLIAN LETTER CHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1842,
+ },
+ [0x1843]={
+ category="lm",
+ description="MONGOLIAN LETTER TODO LONG VOWEL SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1843,
+ },
+ [0x1844]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1844,
+ },
+ [0x1845]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1845,
+ },
+ [0x1846]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1846,
+ },
+ [0x1847]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1847,
+ },
+ [0x1848]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1848,
+ },
+ [0x1849]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO UE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1849,
+ },
+ [0x184A]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO ANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x184A,
+ },
+ [0x184B]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x184B,
+ },
+ [0x184C]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x184C,
+ },
+ [0x184D]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO QA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x184D,
+ },
+ [0x184E]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x184E,
+ },
+ [0x184F]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x184F,
+ },
+ [0x1850]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1850,
+ },
+ [0x1851]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1851,
+ },
+ [0x1852]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1852,
+ },
+ [0x1853]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1853,
+ },
+ [0x1854]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1854,
+ },
+ [0x1855]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1855,
+ },
+ [0x1856]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1856,
+ },
+ [0x1857]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1857,
+ },
+ [0x1858]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO GAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1858,
+ },
+ [0x1859]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO HAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1859,
+ },
+ [0x185A]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO JIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x185A,
+ },
+ [0x185B]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO NIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x185B,
+ },
+ [0x185C]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO DZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x185C,
+ },
+ [0x185D]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x185D,
+ },
+ [0x185E]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x185E,
+ },
+ [0x185F]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE IY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x185F,
+ },
+ [0x1860]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE UE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1860,
+ },
+ [0x1861]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1861,
+ },
+ [0x1862]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE ANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1862,
+ },
+ [0x1863]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1863,
+ },
+ [0x1864]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1864,
+ },
+ [0x1865]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1865,
+ },
+ [0x1866]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1866,
+ },
+ [0x1867]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1867,
+ },
+ [0x1868]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1868,
+ },
+ [0x1869]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1869,
+ },
+ [0x186A]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x186A,
+ },
+ [0x186B]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x186B,
+ },
+ [0x186C]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE GAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x186C,
+ },
+ [0x186D]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE HAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x186D,
+ },
+ [0x186E]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x186E,
+ },
+ [0x186F]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x186F,
+ },
+ [0x1870]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE RAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1870,
+ },
+ [0x1871]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1871,
+ },
+ [0x1872]={
+ category="lo",
+ description="MONGOLIAN LETTER SIBE ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1872,
+ },
+ [0x1873]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1873,
+ },
+ [0x1874]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1874,
+ },
+ [0x1875]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1875,
+ },
+ [0x1876]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1876,
+ },
+ [0x1877]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1877,
+ },
+ [0x1880]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI ANUSVARA ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1880,
+ },
+ [0x1881]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI VISARGA ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1881,
+ },
+ [0x1882]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI DAMARU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1882,
+ },
+ [0x1883]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI UBADAMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1883,
+ },
+ [0x1884]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI INVERTED UBADAMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1884,
+ },
+ [0x1885]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI BALUDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1885,
+ },
+ [0x1886]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI THREE BALUDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1886,
+ },
+ [0x1887]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1887,
+ },
+ [0x1888]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1888,
+ },
+ [0x1889]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1889,
+ },
+ [0x188A]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x188A,
+ },
+ [0x188B]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x188B,
+ },
+ [0x188C]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x188C,
+ },
+ [0x188D]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x188D,
+ },
+ [0x188E]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x188E,
+ },
+ [0x188F]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x188F,
+ },
+ [0x1890]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1890,
+ },
+ [0x1891]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1891,
+ },
+ [0x1892]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1892,
+ },
+ [0x1893]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1893,
+ },
+ [0x1894]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1894,
+ },
+ [0x1895]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1895,
+ },
+ [0x1896]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1896,
+ },
+ [0x1897]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI AH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1897,
+ },
+ [0x1898]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO ALI GALI TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1898,
+ },
+ [0x1899]={
+ category="lo",
+ description="MONGOLIAN LETTER TODO ALI GALI ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1899,
+ },
+ [0x189A]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x189A,
+ },
+ [0x189B]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x189B,
+ },
+ [0x189C]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x189C,
+ },
+ [0x189D]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x189D,
+ },
+ [0x189E]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x189E,
+ },
+ [0x189F]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI DDHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x189F,
+ },
+ [0x18A0]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A0,
+ },
+ [0x18A1]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A1,
+ },
+ [0x18A2]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A2,
+ },
+ [0x18A3]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI CYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A3,
+ },
+ [0x18A4]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A4,
+ },
+ [0x18A5]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A5,
+ },
+ [0x18A6]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI HALF U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A6,
+ },
+ [0x18A7]={
+ category="lo",
+ description="MONGOLIAN LETTER ALI GALI HALF YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A7,
+ },
+ [0x18A8]={
+ category="lo",
+ description="MONGOLIAN LETTER MANCHU ALI GALI BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x18A8,
+ },
+ [0x18A9]={
+ category="mn",
+ description="MONGOLIAN LETTER ALI GALI DAGALGA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x18A9,
+ },
+ [0x1900]={
+ category="lo",
+ description="LIMBU VOWEL-CARRIER LETTER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1900,
+ },
+ [0x1901]={
+ category="lo",
+ description="LIMBU LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1901,
+ },
+ [0x1902]={
+ category="lo",
+ description="LIMBU LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1902,
+ },
+ [0x1903]={
+ category="lo",
+ description="LIMBU LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1903,
+ },
+ [0x1904]={
+ category="lo",
+ description="LIMBU LETTER GHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1904,
+ },
+ [0x1905]={
+ category="lo",
+ description="LIMBU LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1905,
+ },
+ [0x1906]={
+ category="lo",
+ description="LIMBU LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1906,
+ },
+ [0x1907]={
+ category="lo",
+ description="LIMBU LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1907,
+ },
+ [0x1908]={
+ category="lo",
+ description="LIMBU LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1908,
+ },
+ [0x1909]={
+ category="lo",
+ description="LIMBU LETTER JHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1909,
+ },
+ [0x190A]={
+ category="lo",
+ description="LIMBU LETTER YAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x190A,
+ },
+ [0x190B]={
+ category="lo",
+ description="LIMBU LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x190B,
+ },
+ [0x190C]={
+ category="lo",
+ description="LIMBU LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x190C,
+ },
+ [0x190D]={
+ category="lo",
+ description="LIMBU LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x190D,
+ },
+ [0x190E]={
+ category="lo",
+ description="LIMBU LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x190E,
+ },
+ [0x190F]={
+ category="lo",
+ description="LIMBU LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x190F,
+ },
+ [0x1910]={
+ category="lo",
+ description="LIMBU LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1910,
+ },
+ [0x1911]={
+ category="lo",
+ description="LIMBU LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1911,
+ },
+ [0x1912]={
+ category="lo",
+ description="LIMBU LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1912,
+ },
+ [0x1913]={
+ category="lo",
+ description="LIMBU LETTER BHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1913,
+ },
+ [0x1914]={
+ category="lo",
+ description="LIMBU LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1914,
+ },
+ [0x1915]={
+ category="lo",
+ description="LIMBU LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1915,
+ },
+ [0x1916]={
+ category="lo",
+ description="LIMBU LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1916,
+ },
+ [0x1917]={
+ category="lo",
+ description="LIMBU LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1917,
+ },
+ [0x1918]={
+ category="lo",
+ description="LIMBU LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1918,
+ },
+ [0x1919]={
+ category="lo",
+ description="LIMBU LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1919,
+ },
+ [0x191A]={
+ category="lo",
+ description="LIMBU LETTER SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x191A,
+ },
+ [0x191B]={
+ category="lo",
+ description="LIMBU LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x191B,
+ },
+ [0x191C]={
+ category="lo",
+ description="LIMBU LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x191C,
+ },
+ [0x1920]={
+ category="mn",
+ description="LIMBU VOWEL SIGN A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1920,
+ },
+ [0x1921]={
+ category="mn",
+ description="LIMBU VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1921,
+ },
+ [0x1922]={
+ category="mn",
+ description="LIMBU VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1922,
+ },
+ [0x1923]={
+ category="mc",
+ description="LIMBU VOWEL SIGN EE",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1923,
+ },
+ [0x1924]={
+ category="mc",
+ description="LIMBU VOWEL SIGN AI",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1924,
+ },
+ [0x1925]={
+ category="mc",
+ description="LIMBU VOWEL SIGN OO",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1925,
+ },
+ [0x1926]={
+ category="mc",
+ description="LIMBU VOWEL SIGN AU",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1926,
+ },
+ [0x1927]={
+ category="mn",
+ description="LIMBU VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1927,
+ },
+ [0x1928]={
+ category="mn",
+ description="LIMBU VOWEL SIGN O",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1928,
+ },
+ [0x1929]={
+ category="mc",
+ description="LIMBU SUBJOINED LETTER YA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1929,
+ },
+ [0x192A]={
+ category="mc",
+ description="LIMBU SUBJOINED LETTER RA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x192A,
+ },
+ [0x192B]={
+ category="mc",
+ description="LIMBU SUBJOINED LETTER WA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x192B,
+ },
+ [0x1930]={
+ category="mc",
+ description="LIMBU SMALL LETTER KA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1930,
+ },
+ [0x1931]={
+ category="mc",
+ description="LIMBU SMALL LETTER NGA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1931,
+ },
+ [0x1932]={
+ category="mn",
+ description="LIMBU SMALL LETTER ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1932,
+ },
+ [0x1933]={
+ category="mc",
+ description="LIMBU SMALL LETTER TA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1933,
+ },
+ [0x1934]={
+ category="mc",
+ description="LIMBU SMALL LETTER NA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1934,
+ },
+ [0x1935]={
+ category="mc",
+ description="LIMBU SMALL LETTER PA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1935,
+ },
+ [0x1936]={
+ category="mc",
+ description="LIMBU SMALL LETTER MA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1936,
+ },
+ [0x1937]={
+ category="mc",
+ description="LIMBU SMALL LETTER RA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1937,
+ },
+ [0x1938]={
+ category="mc",
+ description="LIMBU SMALL LETTER LA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1938,
+ },
+ [0x1939]={
+ category="mn",
+ description="LIMBU SIGN MUKPHRENG",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1939,
+ },
+ [0x193A]={
+ category="mn",
+ description="LIMBU SIGN KEMPHRENG",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x193A,
+ },
+ [0x193B]={
+ category="mn",
+ description="LIMBU SIGN SA-I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x193B,
+ },
+ [0x1940]={
+ category="so",
+ description="LIMBU SIGN LOO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1940,
+ },
+ [0x1944]={
+ category="po",
+ description="LIMBU EXCLAMATION MARK",
+ direction="on",
+ linebreak="ex",
+ unicodeslot=0x1944,
+ },
+ [0x1945]={
+ category="po",
+ description="LIMBU QUESTION MARK",
+ direction="on",
+ linebreak="ex",
+ unicodeslot=0x1945,
+ },
+ [0x1946]={
+ category="nd",
+ description="LIMBU DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1946,
+ },
+ [0x1947]={
+ category="nd",
+ description="LIMBU DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1947,
+ },
+ [0x1948]={
+ category="nd",
+ description="LIMBU DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1948,
+ },
+ [0x1949]={
+ category="nd",
+ description="LIMBU DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1949,
+ },
+ [0x194A]={
+ category="nd",
+ description="LIMBU DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x194A,
+ },
+ [0x194B]={
+ category="nd",
+ description="LIMBU DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x194B,
+ },
+ [0x194C]={
+ category="nd",
+ description="LIMBU DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x194C,
+ },
+ [0x194D]={
+ category="nd",
+ description="LIMBU DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x194D,
+ },
+ [0x194E]={
+ category="nd",
+ description="LIMBU DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x194E,
+ },
+ [0x194F]={
+ category="nd",
+ description="LIMBU DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x194F,
+ },
+ [0x1950]={
+ category="lo",
+ description="TAI LE LETTER KA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1950,
+ },
+ [0x1951]={
+ category="lo",
+ description="TAI LE LETTER XA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1951,
+ },
+ [0x1952]={
+ category="lo",
+ description="TAI LE LETTER NGA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1952,
+ },
+ [0x1953]={
+ category="lo",
+ description="TAI LE LETTER TSA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1953,
+ },
+ [0x1954]={
+ category="lo",
+ description="TAI LE LETTER SA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1954,
+ },
+ [0x1955]={
+ category="lo",
+ description="TAI LE LETTER YA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1955,
+ },
+ [0x1956]={
+ category="lo",
+ description="TAI LE LETTER TA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1956,
+ },
+ [0x1957]={
+ category="lo",
+ description="TAI LE LETTER THA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1957,
+ },
+ [0x1958]={
+ category="lo",
+ description="TAI LE LETTER LA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1958,
+ },
+ [0x1959]={
+ category="lo",
+ description="TAI LE LETTER PA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1959,
+ },
+ [0x195A]={
+ category="lo",
+ description="TAI LE LETTER PHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x195A,
+ },
+ [0x195B]={
+ category="lo",
+ description="TAI LE LETTER MA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x195B,
+ },
+ [0x195C]={
+ category="lo",
+ description="TAI LE LETTER FA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x195C,
+ },
+ [0x195D]={
+ category="lo",
+ description="TAI LE LETTER VA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x195D,
+ },
+ [0x195E]={
+ category="lo",
+ description="TAI LE LETTER HA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x195E,
+ },
+ [0x195F]={
+ category="lo",
+ description="TAI LE LETTER QA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x195F,
+ },
+ [0x1960]={
+ category="lo",
+ description="TAI LE LETTER KHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1960,
+ },
+ [0x1961]={
+ category="lo",
+ description="TAI LE LETTER TSHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1961,
+ },
+ [0x1962]={
+ category="lo",
+ description="TAI LE LETTER NA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1962,
+ },
+ [0x1963]={
+ category="lo",
+ description="TAI LE LETTER A",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1963,
+ },
+ [0x1964]={
+ category="lo",
+ description="TAI LE LETTER I",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1964,
+ },
+ [0x1965]={
+ category="lo",
+ description="TAI LE LETTER EE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1965,
+ },
+ [0x1966]={
+ category="lo",
+ description="TAI LE LETTER EH",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1966,
+ },
+ [0x1967]={
+ category="lo",
+ description="TAI LE LETTER U",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1967,
+ },
+ [0x1968]={
+ category="lo",
+ description="TAI LE LETTER OO",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1968,
+ },
+ [0x1969]={
+ category="lo",
+ description="TAI LE LETTER O",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1969,
+ },
+ [0x196A]={
+ category="lo",
+ description="TAI LE LETTER UE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x196A,
+ },
+ [0x196B]={
+ category="lo",
+ description="TAI LE LETTER E",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x196B,
+ },
+ [0x196C]={
+ category="lo",
+ description="TAI LE LETTER AUE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x196C,
+ },
+ [0x196D]={
+ category="lo",
+ description="TAI LE LETTER AI",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x196D,
+ },
+ [0x1970]={
+ category="lo",
+ description="TAI LE LETTER TONE-0x0002",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1970,
+ },
+ [0x1971]={
+ category="lo",
+ description="TAI LE LETTER TONE-0x0003",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1971,
+ },
+ [0x1972]={
+ category="lo",
+ description="TAI LE LETTER TONE-0x0004",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1972,
+ },
+ [0x1973]={
+ category="lo",
+ description="TAI LE LETTER TONE-0x0005",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1973,
+ },
+ [0x1974]={
+ category="lo",
+ description="TAI LE LETTER TONE-0x0006",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1974,
+ },
+ [0x1980]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH QA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1980,
+ },
+ [0x1981]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW QA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1981,
+ },
+ [0x1982]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH KA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1982,
+ },
+ [0x1983]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH XA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1983,
+ },
+ [0x1984]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH NGA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1984,
+ },
+ [0x1985]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW KA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1985,
+ },
+ [0x1986]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW XA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1986,
+ },
+ [0x1987]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW NGA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1987,
+ },
+ [0x1988]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH TSA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1988,
+ },
+ [0x1989]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH SA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1989,
+ },
+ [0x198A]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH YA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x198A,
+ },
+ [0x198B]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW TSA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x198B,
+ },
+ [0x198C]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW SA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x198C,
+ },
+ [0x198D]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW YA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x198D,
+ },
+ [0x198E]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH TA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x198E,
+ },
+ [0x198F]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH THA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x198F,
+ },
+ [0x1990]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH NA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1990,
+ },
+ [0x1991]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW TA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1991,
+ },
+ [0x1992]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW THA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1992,
+ },
+ [0x1993]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW NA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1993,
+ },
+ [0x1994]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH PA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1994,
+ },
+ [0x1995]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH PHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1995,
+ },
+ [0x1996]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH MA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1996,
+ },
+ [0x1997]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW PA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1997,
+ },
+ [0x1998]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW PHA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1998,
+ },
+ [0x1999]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW MA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x1999,
+ },
+ [0x199A]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH FA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x199A,
+ },
+ [0x199B]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH VA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x199B,
+ },
+ [0x199C]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH LA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x199C,
+ },
+ [0x199D]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW FA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x199D,
+ },
+ [0x199E]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW VA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x199E,
+ },
+ [0x199F]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW LA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x199F,
+ },
+ [0x19A0]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH HA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A0,
+ },
+ [0x19A1]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH DA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A1,
+ },
+ [0x19A2]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH BA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A2,
+ },
+ [0x19A3]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW HA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A3,
+ },
+ [0x19A4]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW DA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A4,
+ },
+ [0x19A5]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW BA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A5,
+ },
+ [0x19A6]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH KVA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A6,
+ },
+ [0x19A7]={
+ category="lo",
+ description="NEW TAI LUE LETTER HIGH XVA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A7,
+ },
+ [0x19A8]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW KVA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A8,
+ },
+ [0x19A9]={
+ category="lo",
+ description="NEW TAI LUE LETTER LOW XVA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19A9,
+ },
+ [0x19B0]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN VOWEL SHORTENER",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B0,
+ },
+ [0x19B1]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN AA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B1,
+ },
+ [0x19B2]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN II",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B2,
+ },
+ [0x19B3]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN U",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B3,
+ },
+ [0x19B4]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN UU",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B4,
+ },
+ [0x19B5]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN E",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B5,
+ },
+ [0x19B6]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN AE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B6,
+ },
+ [0x19B7]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN O",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B7,
+ },
+ [0x19B8]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN OA",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B8,
+ },
+ [0x19B9]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN UE",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19B9,
+ },
+ [0x19BA]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN AY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19BA,
+ },
+ [0x19BB]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN AAY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19BB,
+ },
+ [0x19BC]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN UY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19BC,
+ },
+ [0x19BD]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN OY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19BD,
+ },
+ [0x19BE]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN OAY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19BE,
+ },
+ [0x19BF]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN UEY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19BF,
+ },
+ [0x19C0]={
+ category="mc",
+ description="NEW TAI LUE VOWEL SIGN IY",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C0,
+ },
+ [0x19C1]={
+ category="lo",
+ description="NEW TAI LUE LETTER FINAL V",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C1,
+ },
+ [0x19C2]={
+ category="lo",
+ description="NEW TAI LUE LETTER FINAL NG",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C2,
+ },
+ [0x19C3]={
+ category="lo",
+ description="NEW TAI LUE LETTER FINAL N",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C3,
+ },
+ [0x19C4]={
+ category="lo",
+ description="NEW TAI LUE LETTER FINAL M",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C4,
+ },
+ [0x19C5]={
+ category="lo",
+ description="NEW TAI LUE LETTER FINAL K",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C5,
+ },
+ [0x19C6]={
+ category="lo",
+ description="NEW TAI LUE LETTER FINAL D",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C6,
+ },
+ [0x19C7]={
+ category="lo",
+ description="NEW TAI LUE LETTER FINAL B",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C7,
+ },
+ [0x19C8]={
+ category="mc",
+ description="NEW TAI LUE TONE MARK-0x0001",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C8,
+ },
+ [0x19C9]={
+ category="mc",
+ description="NEW TAI LUE TONE MARK-0x0002",
+ direction="l",
+ linebreak="sa",
+ unicodeslot=0x19C9,
+ },
+ [0x19D0]={
+ category="nd",
+ description="NEW TAI LUE DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D0,
+ },
+ [0x19D1]={
+ category="nd",
+ description="NEW TAI LUE DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D1,
+ },
+ [0x19D2]={
+ category="nd",
+ description="NEW TAI LUE DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D2,
+ },
+ [0x19D3]={
+ category="nd",
+ description="NEW TAI LUE DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D3,
+ },
+ [0x19D4]={
+ category="nd",
+ description="NEW TAI LUE DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D4,
+ },
+ [0x19D5]={
+ category="nd",
+ description="NEW TAI LUE DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D5,
+ },
+ [0x19D6]={
+ category="nd",
+ description="NEW TAI LUE DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D6,
+ },
+ [0x19D7]={
+ category="nd",
+ description="NEW TAI LUE DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D7,
+ },
+ [0x19D8]={
+ category="nd",
+ description="NEW TAI LUE DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D8,
+ },
+ [0x19D9]={
+ category="nd",
+ description="NEW TAI LUE DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x19D9,
+ },
+ [0x19DE]={
+ category="po",
+ description="NEW TAI LUE SIGN LAE",
+ direction="on",
+ linebreak="sa",
+ unicodeslot=0x19DE,
+ },
+ [0x19DF]={
+ category="po",
+ description="NEW TAI LUE SIGN LAEV",
+ direction="on",
+ linebreak="sa",
+ unicodeslot=0x19DF,
+ },
+ [0x19E0]={
+ category="so",
+ description="KHMER SYMBOL PATHAMASAT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E0,
+ },
+ [0x19E1]={
+ category="so",
+ description="KHMER SYMBOL MUOY KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E1,
+ },
+ [0x19E2]={
+ category="so",
+ description="KHMER SYMBOL PII KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E2,
+ },
+ [0x19E3]={
+ category="so",
+ description="KHMER SYMBOL BEI KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E3,
+ },
+ [0x19E4]={
+ category="so",
+ description="KHMER SYMBOL BUON KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E4,
+ },
+ [0x19E5]={
+ category="so",
+ description="KHMER SYMBOL PRAM KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E5,
+ },
+ [0x19E6]={
+ category="so",
+ description="KHMER SYMBOL PRAM-MUOY KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E6,
+ },
+ [0x19E7]={
+ category="so",
+ description="KHMER SYMBOL PRAM-PII KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E7,
+ },
+ [0x19E8]={
+ category="so",
+ description="KHMER SYMBOL PRAM-BEI KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E8,
+ },
+ [0x19E9]={
+ category="so",
+ description="KHMER SYMBOL PRAM-BUON KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19E9,
+ },
+ [0x19EA]={
+ category="so",
+ description="KHMER SYMBOL DAP KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19EA,
+ },
+ [0x19EB]={
+ category="so",
+ description="KHMER SYMBOL DAP-MUOY KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19EB,
+ },
+ [0x19EC]={
+ category="so",
+ description="KHMER SYMBOL DAP-PII KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19EC,
+ },
+ [0x19ED]={
+ category="so",
+ description="KHMER SYMBOL DAP-BEI KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19ED,
+ },
+ [0x19EE]={
+ category="so",
+ description="KHMER SYMBOL DAP-BUON KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19EE,
+ },
+ [0x19EF]={
+ category="so",
+ description="KHMER SYMBOL DAP-PRAM KOET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19EF,
+ },
+ [0x19F0]={
+ category="so",
+ description="KHMER SYMBOL TUTEYASAT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F0,
+ },
+ [0x19F1]={
+ category="so",
+ description="KHMER SYMBOL MUOY ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F1,
+ },
+ [0x19F2]={
+ category="so",
+ description="KHMER SYMBOL PII ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F2,
+ },
+ [0x19F3]={
+ category="so",
+ description="KHMER SYMBOL BEI ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F3,
+ },
+ [0x19F4]={
+ category="so",
+ description="KHMER SYMBOL BUON ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F4,
+ },
+ [0x19F5]={
+ category="so",
+ description="KHMER SYMBOL PRAM ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F5,
+ },
+ [0x19F6]={
+ category="so",
+ description="KHMER SYMBOL PRAM-MUOY ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F6,
+ },
+ [0x19F7]={
+ category="so",
+ description="KHMER SYMBOL PRAM-PII ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F7,
+ },
+ [0x19F8]={
+ category="so",
+ description="KHMER SYMBOL PRAM-BEI ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F8,
+ },
+ [0x19F9]={
+ category="so",
+ description="KHMER SYMBOL PRAM-BUON ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19F9,
+ },
+ [0x19FA]={
+ category="so",
+ description="KHMER SYMBOL DAP ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19FA,
+ },
+ [0x19FB]={
+ category="so",
+ description="KHMER SYMBOL DAP-MUOY ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19FB,
+ },
+ [0x19FC]={
+ category="so",
+ description="KHMER SYMBOL DAP-PII ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19FC,
+ },
+ [0x19FD]={
+ category="so",
+ description="KHMER SYMBOL DAP-BEI ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19FD,
+ },
+ [0x19FE]={
+ category="so",
+ description="KHMER SYMBOL DAP-BUON ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19FE,
+ },
+ [0x19FF]={
+ category="so",
+ description="KHMER SYMBOL DAP-PRAM ROC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x19FF,
+ },
+ [0x1A00]={
+ category="lo",
+ description="BUGINESE LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A00,
+ },
+ [0x1A01]={
+ category="lo",
+ description="BUGINESE LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A01,
+ },
+ [0x1A02]={
+ category="lo",
+ description="BUGINESE LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A02,
+ },
+ [0x1A03]={
+ category="lo",
+ description="BUGINESE LETTER NGKA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A03,
+ },
+ [0x1A04]={
+ category="lo",
+ description="BUGINESE LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A04,
+ },
+ [0x1A05]={
+ category="lo",
+ description="BUGINESE LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A05,
+ },
+ [0x1A06]={
+ category="lo",
+ description="BUGINESE LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A06,
+ },
+ [0x1A07]={
+ category="lo",
+ description="BUGINESE LETTER MPA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A07,
+ },
+ [0x1A08]={
+ category="lo",
+ description="BUGINESE LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A08,
+ },
+ [0x1A09]={
+ category="lo",
+ description="BUGINESE LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A09,
+ },
+ [0x1A0A]={
+ category="lo",
+ description="BUGINESE LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A0A,
+ },
+ [0x1A0B]={
+ category="lo",
+ description="BUGINESE LETTER NRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A0B,
+ },
+ [0x1A0C]={
+ category="lo",
+ description="BUGINESE LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A0C,
+ },
+ [0x1A0D]={
+ category="lo",
+ description="BUGINESE LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A0D,
+ },
+ [0x1A0E]={
+ category="lo",
+ description="BUGINESE LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A0E,
+ },
+ [0x1A0F]={
+ category="lo",
+ description="BUGINESE LETTER NYCA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A0F,
+ },
+ [0x1A10]={
+ category="lo",
+ description="BUGINESE LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A10,
+ },
+ [0x1A11]={
+ category="lo",
+ description="BUGINESE LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A11,
+ },
+ [0x1A12]={
+ category="lo",
+ description="BUGINESE LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A12,
+ },
+ [0x1A13]={
+ category="lo",
+ description="BUGINESE LETTER VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A13,
+ },
+ [0x1A14]={
+ category="lo",
+ description="BUGINESE LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A14,
+ },
+ [0x1A15]={
+ category="lo",
+ description="BUGINESE LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A15,
+ },
+ [0x1A16]={
+ category="lo",
+ description="BUGINESE LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A16,
+ },
+ [0x1A17]={
+ category="mn",
+ description="BUGINESE VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1A17,
+ },
+ [0x1A18]={
+ category="mn",
+ description="BUGINESE VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1A18,
+ },
+ [0x1A19]={
+ category="mc",
+ description="BUGINESE VOWEL SIGN E",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1A19,
+ },
+ [0x1A1A]={
+ category="mc",
+ description="BUGINESE VOWEL SIGN O",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1A1A,
+ },
+ [0x1A1B]={
+ category="mc",
+ description="BUGINESE VOWEL SIGN AE",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1A1B,
+ },
+ [0x1A1E]={
+ category="po",
+ description="BUGINESE PALLAWA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1A1E,
+ },
+ [0x1A1F]={
+ category="po",
+ description="BUGINESE END OF SECTION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1A1F,
+ },
+ [0x1B00]={
+ category="mn",
+ description="BALINESE SIGN ULU RICEM",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B00,
+ },
+ [0x1B01]={
+ category="mn",
+ description="BALINESE SIGN ULU CANDRA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B01,
+ },
+ [0x1B02]={
+ category="mn",
+ description="BALINESE SIGN CECEK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B02,
+ },
+ [0x1B03]={
+ category="mn",
+ description="BALINESE SIGN SURANG",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B03,
+ },
+ [0x1B04]={
+ category="mc",
+ description="BALINESE SIGN BISAH",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1B04,
+ },
+ [0x1B05]={
+ category="lo",
+ description="BALINESE LETTER AKARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B05,
+ },
+ [0x1B06]={
+ category="lo",
+ description="BALINESE LETTER AKARA TEDUNG",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1B05, 0x1B35 },
+ unicodeslot=0x1B06,
+ },
+ [0x1B07]={
+ category="lo",
+ description="BALINESE LETTER IKARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B07,
+ },
+ [0x1B08]={
+ category="lo",
+ description="BALINESE LETTER IKARA TEDUNG",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1B07, 0x1B35 },
+ unicodeslot=0x1B08,
+ },
+ [0x1B09]={
+ category="lo",
+ description="BALINESE LETTER UKARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B09,
+ },
+ [0x1B0A]={
+ category="lo",
+ description="BALINESE LETTER UKARA TEDUNG",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1B09, 0x1B35 },
+ unicodeslot=0x1B0A,
+ },
+ [0x1B0B]={
+ category="lo",
+ description="BALINESE LETTER RA REPA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B0B,
+ },
+ [0x1B0C]={
+ category="lo",
+ description="BALINESE LETTER RA REPA TEDUNG",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1B0B, 0x1B35 },
+ unicodeslot=0x1B0C,
+ },
+ [0x1B0D]={
+ category="lo",
+ description="BALINESE LETTER LA LENGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B0D,
+ },
+ [0x1B0E]={
+ category="lo",
+ description="BALINESE LETTER LA LENGA TEDUNG",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1B0D, 0x1B35 },
+ unicodeslot=0x1B0E,
+ },
+ [0x1B0F]={
+ category="lo",
+ description="BALINESE LETTER EKARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B0F,
+ },
+ [0x1B10]={
+ category="lo",
+ description="BALINESE LETTER AIKARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B10,
+ },
+ [0x1B11]={
+ category="lo",
+ description="BALINESE LETTER OKARA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B11,
+ },
+ [0x1B12]={
+ category="lo",
+ description="BALINESE LETTER OKARA TEDUNG",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1B11, 0x1B35 },
+ unicodeslot=0x1B12,
+ },
+ [0x1B13]={
+ category="lo",
+ description="BALINESE LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B13,
+ },
+ [0x1B14]={
+ category="lo",
+ description="BALINESE LETTER KA MAHAPRANA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B14,
+ },
+ [0x1B15]={
+ category="lo",
+ description="BALINESE LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B15,
+ },
+ [0x1B16]={
+ category="lo",
+ description="BALINESE LETTER GA GORA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B16,
+ },
+ [0x1B17]={
+ category="lo",
+ description="BALINESE LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B17,
+ },
+ [0x1B18]={
+ category="lo",
+ description="BALINESE LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B18,
+ },
+ [0x1B19]={
+ category="lo",
+ description="BALINESE LETTER CA LACA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B19,
+ },
+ [0x1B1A]={
+ category="lo",
+ description="BALINESE LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B1A,
+ },
+ [0x1B1B]={
+ category="lo",
+ description="BALINESE LETTER JA JERA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B1B,
+ },
+ [0x1B1C]={
+ category="lo",
+ description="BALINESE LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B1C,
+ },
+ [0x1B1D]={
+ category="lo",
+ description="BALINESE LETTER TA LATIK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B1D,
+ },
+ [0x1B1E]={
+ category="lo",
+ description="BALINESE LETTER TA MURDA MAHAPRANA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B1E,
+ },
+ [0x1B1F]={
+ category="lo",
+ description="BALINESE LETTER DA MURDA ALPAPRANA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B1F,
+ },
+ [0x1B20]={
+ category="lo",
+ description="BALINESE LETTER DA MURDA MAHAPRANA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B20,
+ },
+ [0x1B21]={
+ category="lo",
+ description="BALINESE LETTER NA RAMBAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B21,
+ },
+ [0x1B22]={
+ category="lo",
+ description="BALINESE LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B22,
+ },
+ [0x1B23]={
+ category="lo",
+ description="BALINESE LETTER TA TAWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B23,
+ },
+ [0x1B24]={
+ category="lo",
+ description="BALINESE LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B24,
+ },
+ [0x1B25]={
+ category="lo",
+ description="BALINESE LETTER DA MADU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B25,
+ },
+ [0x1B26]={
+ category="lo",
+ description="BALINESE LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B26,
+ },
+ [0x1B27]={
+ category="lo",
+ description="BALINESE LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B27,
+ },
+ [0x1B28]={
+ category="lo",
+ description="BALINESE LETTER PA KAPAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B28,
+ },
+ [0x1B29]={
+ category="lo",
+ description="BALINESE LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B29,
+ },
+ [0x1B2A]={
+ category="lo",
+ description="BALINESE LETTER BA KEMBANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B2A,
+ },
+ [0x1B2B]={
+ category="lo",
+ description="BALINESE LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B2B,
+ },
+ [0x1B2C]={
+ category="lo",
+ description="BALINESE LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B2C,
+ },
+ [0x1B2D]={
+ category="lo",
+ description="BALINESE LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B2D,
+ },
+ [0x1B2E]={
+ category="lo",
+ description="BALINESE LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B2E,
+ },
+ [0x1B2F]={
+ category="lo",
+ description="BALINESE LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B2F,
+ },
+ [0x1B30]={
+ category="lo",
+ description="BALINESE LETTER SA SAGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B30,
+ },
+ [0x1B31]={
+ category="lo",
+ description="BALINESE LETTER SA SAPA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B31,
+ },
+ [0x1B32]={
+ category="lo",
+ description="BALINESE LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B32,
+ },
+ [0x1B33]={
+ category="lo",
+ description="BALINESE LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B33,
+ },
+ [0x1B34]={
+ category="mn",
+ description="BALINESE SIGN REREKAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B34,
+ },
+ [0x1B35]={
+ category="mc",
+ description="BALINESE VOWEL SIGN TEDUNG",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1B35,
+ },
+ [0x1B36]={
+ category="mn",
+ description="BALINESE VOWEL SIGN ULU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B36,
+ },
+ [0x1B37]={
+ category="mn",
+ description="BALINESE VOWEL SIGN ULU SARI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B37,
+ },
+ [0x1B38]={
+ category="mn",
+ description="BALINESE VOWEL SIGN SUKU",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B38,
+ },
+ [0x1B39]={
+ category="mn",
+ description="BALINESE VOWEL SIGN SUKU ILUT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B39,
+ },
+ [0x1B3A]={
+ category="mn",
+ description="BALINESE VOWEL SIGN RA REPA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B3A,
+ },
+ [0x1B3B]={
+ category="mc",
+ description="BALINESE VOWEL SIGN RA REPA TEDUNG",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x1B3A, 0x1B35 },
+ unicodeslot=0x1B3B,
+ },
+ [0x1B3C]={
+ category="mn",
+ description="BALINESE VOWEL SIGN LA LENGA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B3C,
+ },
+ [0x1B3D]={
+ category="mc",
+ description="BALINESE VOWEL SIGN LA LENGA TEDUNG",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x1B3C, 0x1B35 },
+ unicodeslot=0x1B3D,
+ },
+ [0x1B3E]={
+ category="mc",
+ description="BALINESE VOWEL SIGN TALING",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1B3E,
+ },
+ [0x1B3F]={
+ category="mc",
+ description="BALINESE VOWEL SIGN TALING REPA",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1B3F,
+ },
+ [0x1B40]={
+ category="mc",
+ description="BALINESE VOWEL SIGN TALING TEDUNG",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x1B3E, 0x1B35 },
+ unicodeslot=0x1B40,
+ },
+ [0x1B41]={
+ category="mc",
+ description="BALINESE VOWEL SIGN TALING REPA TEDUNG",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x1B3F, 0x1B35 },
+ unicodeslot=0x1B41,
+ },
+ [0x1B42]={
+ category="mn",
+ description="BALINESE VOWEL SIGN PEPET",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B42,
+ },
+ [0x1B43]={
+ category="mc",
+ description="BALINESE VOWEL SIGN PEPET TEDUNG",
+ direction="l",
+ linebreak="cm",
+ specials={ "char", 0x1B42, 0x1B35 },
+ unicodeslot=0x1B43,
+ },
+ [0x1B44]={
+ category="mc",
+ description="BALINESE ADEG ADEG",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1B44,
+ },
+ [0x1B45]={
+ category="lo",
+ description="BALINESE LETTER KAF SASAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B45,
+ },
+ [0x1B46]={
+ category="lo",
+ description="BALINESE LETTER KHOT SASAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B46,
+ },
+ [0x1B47]={
+ category="lo",
+ description="BALINESE LETTER TZIR SASAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B47,
+ },
+ [0x1B48]={
+ category="lo",
+ description="BALINESE LETTER EF SASAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B48,
+ },
+ [0x1B49]={
+ category="lo",
+ description="BALINESE LETTER VE SASAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B49,
+ },
+ [0x1B4A]={
+ category="lo",
+ description="BALINESE LETTER ZAL SASAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B4A,
+ },
+ [0x1B4B]={
+ category="lo",
+ description="BALINESE LETTER ASYURA SASAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B4B,
+ },
+ [0x1B50]={
+ category="nd",
+ description="BALINESE DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B50,
+ },
+ [0x1B51]={
+ category="nd",
+ description="BALINESE DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B51,
+ },
+ [0x1B52]={
+ category="nd",
+ description="BALINESE DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B52,
+ },
+ [0x1B53]={
+ category="nd",
+ description="BALINESE DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B53,
+ },
+ [0x1B54]={
+ category="nd",
+ description="BALINESE DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B54,
+ },
+ [0x1B55]={
+ category="nd",
+ description="BALINESE DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B55,
+ },
+ [0x1B56]={
+ category="nd",
+ description="BALINESE DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B56,
+ },
+ [0x1B57]={
+ category="nd",
+ description="BALINESE DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B57,
+ },
+ [0x1B58]={
+ category="nd",
+ description="BALINESE DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B58,
+ },
+ [0x1B59]={
+ category="nd",
+ description="BALINESE DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x1B59,
+ },
+ [0x1B5A]={
+ category="po",
+ description="BALINESE PANTI",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1B5A,
+ },
+ [0x1B5B]={
+ category="po",
+ description="BALINESE PAMADA",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1B5B,
+ },
+ [0x1B5C]={
+ category="po",
+ description="BALINESE WINDU",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1B5C,
+ },
+ [0x1B5D]={
+ category="po",
+ description="BALINESE CARIK PAMUNGKAH",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1B5D,
+ },
+ [0x1B5E]={
+ category="po",
+ description="BALINESE CARIK SIKI",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1B5E,
+ },
+ [0x1B5F]={
+ category="po",
+ description="BALINESE CARIK PAREREN",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1B5F,
+ },
+ [0x1B60]={
+ category="po",
+ description="BALINESE PAMENENG",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1B60,
+ },
+ [0x1B61]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DONG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B61,
+ },
+ [0x1B62]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DENG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B62,
+ },
+ [0x1B63]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DUNG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B63,
+ },
+ [0x1B64]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B64,
+ },
+ [0x1B65]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DANG SURANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B65,
+ },
+ [0x1B66]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B66,
+ },
+ [0x1B67]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DAENG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B67,
+ },
+ [0x1B68]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DEUNG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B68,
+ },
+ [0x1B69]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DAING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B69,
+ },
+ [0x1B6A]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL DANG GEDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B6A,
+ },
+ [0x1B6B]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING TEGEH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B6B,
+ },
+ [0x1B6C]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING ENDEP",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B6C,
+ },
+ [0x1B6D]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING KEMPUL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B6D,
+ },
+ [0x1B6E]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING KEMPLI",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B6E,
+ },
+ [0x1B6F]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING JEGOGAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B6F,
+ },
+ [0x1B70]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B70,
+ },
+ [0x1B71]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B71,
+ },
+ [0x1B72]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING BENDE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B72,
+ },
+ [0x1B73]={
+ category="mn",
+ description="BALINESE MUSICAL SYMBOL COMBINING GONG",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1B73,
+ },
+ [0x1B74]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B74,
+ },
+ [0x1B75]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B75,
+ },
+ [0x1B76]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B76,
+ },
+ [0x1B77]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B77,
+ },
+ [0x1B78]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B78,
+ },
+ [0x1B79]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B79,
+ },
+ [0x1B7A]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B7A,
+ },
+ [0x1B7B]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B7B,
+ },
+ [0x1B7C]={
+ category="so",
+ description="BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1B7C,
+ },
+ [0x1D00]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D00,
+ },
+ [0x1D01]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL AE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D01,
+ },
+ [0x1D02]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED AE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D02,
+ },
+ [0x1D03]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL BARRED B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D03,
+ },
+ [0x1D04]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D04,
+ },
+ [0x1D05]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D05,
+ },
+ [0x1D06]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL ETH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D06,
+ },
+ [0x1D07]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D07,
+ },
+ [0x1D08]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED OPEN E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D08,
+ },
+ [0x1D09]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D09,
+ },
+ [0x1D0A]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL J",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A,
+ },
+ [0x1D0B]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL K",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B,
+ },
+ [0x1D0C]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL L WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C,
+ },
+ [0x1D0D]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D,
+ },
+ [0x1D0E]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL REVERSED N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E,
+ },
+ [0x1D0F]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0F,
+ },
+ [0x1D10]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL OPEN O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D10,
+ },
+ [0x1D11]={
+ category="ll",
+ description="LATIN SMALL LETTER SIDEWAYS O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D11,
+ },
+ [0x1D12]={
+ category="ll",
+ description="LATIN SMALL LETTER SIDEWAYS OPEN O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D12,
+ },
+ [0x1D13]={
+ category="ll",
+ description="LATIN SMALL LETTER SIDEWAYS O WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D13,
+ },
+ [0x1D14]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED OE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D14,
+ },
+ [0x1D15]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL OU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D15,
+ },
+ [0x1D16]={
+ category="ll",
+ description="LATIN SMALL LETTER TOP HALF O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D16,
+ },
+ [0x1D17]={
+ category="ll",
+ description="LATIN SMALL LETTER BOTTOM HALF O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D17,
+ },
+ [0x1D18]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL P",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D18,
+ },
+ [0x1D19]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL REVERSED R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D19,
+ },
+ [0x1D1A]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL TURNED R",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A,
+ },
+ [0x1D1B]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL T",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B,
+ },
+ [0x1D1C]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C,
+ },
+ [0x1D1D]={
+ category="ll",
+ description="LATIN SMALL LETTER SIDEWAYS U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D,
+ },
+ [0x1D1E]={
+ category="ll",
+ description="LATIN SMALL LETTER SIDEWAYS DIAERESIZED U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1E,
+ },
+ [0x1D1F]={
+ category="ll",
+ description="LATIN SMALL LETTER SIDEWAYS TURNED M",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1F,
+ },
+ [0x1D20]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL V",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D20,
+ },
+ [0x1D21]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL W",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D21,
+ },
+ [0x1D22]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D22,
+ },
+ [0x1D23]={
+ category="ll",
+ description="LATIN LETTER SMALL CAPITAL EZH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D23,
+ },
+ [0x1D24]={
+ category="ll",
+ description="LATIN LETTER VOICED LARYNGEAL SPIRANT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D24,
+ },
+ [0x1D25]={
+ category="ll",
+ description="LATIN LETTER AIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D25,
+ },
+ [0x1D26]={
+ category="ll",
+ description="GREEK LETTER SMALL CAPITAL GAMMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D26,
+ },
+ [0x1D27]={
+ category="ll",
+ description="GREEK LETTER SMALL CAPITAL LAMDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D27,
+ },
+ [0x1D28]={
+ category="ll",
+ description="GREEK LETTER SMALL CAPITAL PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D28,
+ },
+ [0x1D29]={
+ category="ll",
+ description="GREEK LETTER SMALL CAPITAL RHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D29,
+ },
+ [0x1D2A]={
+ category="ll",
+ description="GREEK LETTER SMALL CAPITAL PSI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D2A,
+ },
+ [0x1D2B]={
+ category="ll",
+ description="CYRILLIC LETTER SMALL CAPITAL EL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D2B,
+ },
+ [0x1D2C]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0041 },
+ unicodeslot=0x1D2C,
+ },
+ [0x1D2D]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL AE",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x00C6 },
+ unicodeslot=0x1D2D,
+ },
+ [0x1D2E]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0042 },
+ unicodeslot=0x1D2E,
+ },
+ [0x1D2F]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL BARRED B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D2F,
+ },
+ [0x1D30]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0044 },
+ unicodeslot=0x1D30,
+ },
+ [0x1D31]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0045 },
+ unicodeslot=0x1D31,
+ },
+ [0x1D32]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL REVERSED E",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x018E },
+ unicodeslot=0x1D32,
+ },
+ [0x1D33]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0047 },
+ unicodeslot=0x1D33,
+ },
+ [0x1D34]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0048 },
+ unicodeslot=0x1D34,
+ },
+ [0x1D35]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0049 },
+ unicodeslot=0x1D35,
+ },
+ [0x1D36]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x004A },
+ unicodeslot=0x1D36,
+ },
+ [0x1D37]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x004B },
+ unicodeslot=0x1D37,
+ },
+ [0x1D38]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x004C },
+ unicodeslot=0x1D38,
+ },
+ [0x1D39]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x004D },
+ unicodeslot=0x1D39,
+ },
+ [0x1D3A]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x004E },
+ unicodeslot=0x1D3A,
+ },
+ [0x1D3B]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL REVERSED N",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D3B,
+ },
+ [0x1D3C]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x004F },
+ unicodeslot=0x1D3C,
+ },
+ [0x1D3D]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL OU",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0222 },
+ unicodeslot=0x1D3D,
+ },
+ [0x1D3E]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0050 },
+ unicodeslot=0x1D3E,
+ },
+ [0x1D3F]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0052 },
+ unicodeslot=0x1D3F,
+ },
+ [0x1D40]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0054 },
+ unicodeslot=0x1D40,
+ },
+ [0x1D41]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0055 },
+ unicodeslot=0x1D41,
+ },
+ [0x1D42]={
+ category="lm",
+ description="MODIFIER LETTER CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0057 },
+ unicodeslot=0x1D42,
+ },
+ [0x1D43]={
+ category="lm",
+ description="MODIFIER LETTER SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0061 },
+ unicodeslot=0x1D43,
+ },
+ [0x1D44]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED A",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0250 },
+ unicodeslot=0x1D44,
+ },
+ [0x1D45]={
+ category="lm",
+ description="MODIFIER LETTER SMALL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0251 },
+ unicodeslot=0x1D45,
+ },
+ [0x1D46]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED AE",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D02 },
+ unicodeslot=0x1D46,
+ },
+ [0x1D47]={
+ category="lm",
+ description="MODIFIER LETTER SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0062 },
+ unicodeslot=0x1D47,
+ },
+ [0x1D48]={
+ category="lm",
+ description="MODIFIER LETTER SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0064 },
+ unicodeslot=0x1D48,
+ },
+ [0x1D49]={
+ category="lm",
+ description="MODIFIER LETTER SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0065 },
+ unicodeslot=0x1D49,
+ },
+ [0x1D4A]={
+ category="lm",
+ description="MODIFIER LETTER SMALL SCHWA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0259 },
+ unicodeslot=0x1D4A,
+ },
+ [0x1D4B]={
+ category="lm",
+ description="MODIFIER LETTER SMALL OPEN E",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x025B },
+ unicodeslot=0x1D4B,
+ },
+ [0x1D4C]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED OPEN E",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x025C },
+ unicodeslot=0x1D4C,
+ },
+ [0x1D4D]={
+ category="lm",
+ description="MODIFIER LETTER SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0067 },
+ unicodeslot=0x1D4D,
+ },
+ [0x1D4E]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D4E,
+ },
+ [0x1D4F]={
+ category="lm",
+ description="MODIFIER LETTER SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x006B },
+ unicodeslot=0x1D4F,
+ },
+ [0x1D50]={
+ category="lm",
+ description="MODIFIER LETTER SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x006D },
+ unicodeslot=0x1D50,
+ },
+ [0x1D51]={
+ category="lm",
+ description="MODIFIER LETTER SMALL ENG",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x014B },
+ unicodeslot=0x1D51,
+ },
+ [0x1D52]={
+ category="lm",
+ description="MODIFIER LETTER SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x006F },
+ unicodeslot=0x1D52,
+ },
+ [0x1D53]={
+ category="lm",
+ description="MODIFIER LETTER SMALL OPEN O",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0254 },
+ unicodeslot=0x1D53,
+ },
+ [0x1D54]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TOP HALF O",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D16 },
+ unicodeslot=0x1D54,
+ },
+ [0x1D55]={
+ category="lm",
+ description="MODIFIER LETTER SMALL BOTTOM HALF O",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D17 },
+ unicodeslot=0x1D55,
+ },
+ [0x1D56]={
+ category="lm",
+ description="MODIFIER LETTER SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0070 },
+ unicodeslot=0x1D56,
+ },
+ [0x1D57]={
+ category="lm",
+ description="MODIFIER LETTER SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0074 },
+ unicodeslot=0x1D57,
+ },
+ [0x1D58]={
+ category="lm",
+ description="MODIFIER LETTER SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0075 },
+ unicodeslot=0x1D58,
+ },
+ [0x1D59]={
+ category="lm",
+ description="MODIFIER LETTER SMALL SIDEWAYS U",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D1D },
+ unicodeslot=0x1D59,
+ },
+ [0x1D5A]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED M",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x026F },
+ unicodeslot=0x1D5A,
+ },
+ [0x1D5B]={
+ category="lm",
+ description="MODIFIER LETTER SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0076 },
+ unicodeslot=0x1D5B,
+ },
+ [0x1D5C]={
+ category="lm",
+ description="MODIFIER LETTER SMALL AIN",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D25 },
+ unicodeslot=0x1D5C,
+ },
+ [0x1D5D]={
+ category="lm",
+ description="MODIFIER LETTER SMALL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x03B2 },
+ unicodeslot=0x1D5D,
+ },
+ [0x1D5E]={
+ category="lm",
+ description="MODIFIER LETTER SMALL GREEK GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x03B3 },
+ unicodeslot=0x1D5E,
+ },
+ [0x1D5F]={
+ category="lm",
+ description="MODIFIER LETTER SMALL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x03B4 },
+ unicodeslot=0x1D5F,
+ },
+ [0x1D60]={
+ category="lm",
+ description="MODIFIER LETTER SMALL GREEK PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x03C6 },
+ unicodeslot=0x1D60,
+ },
+ [0x1D61]={
+ category="lm",
+ description="MODIFIER LETTER SMALL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x03C7 },
+ unicodeslot=0x1D61,
+ },
+ [0x1D62]={
+ category="ll",
+ description="LATIN SUBSCRIPT SMALL LETTER I",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0069 },
+ unicodeslot=0x1D62,
+ },
+ [0x1D63]={
+ category="ll",
+ description="LATIN SUBSCRIPT SMALL LETTER R",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0072 },
+ unicodeslot=0x1D63,
+ },
+ [0x1D64]={
+ category="ll",
+ description="LATIN SUBSCRIPT SMALL LETTER U",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0075 },
+ unicodeslot=0x1D64,
+ },
+ [0x1D65]={
+ category="ll",
+ description="LATIN SUBSCRIPT SMALL LETTER V",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0076 },
+ unicodeslot=0x1D65,
+ },
+ [0x1D66]={
+ category="ll",
+ description="GREEK SUBSCRIPT SMALL LETTER BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x03B2 },
+ unicodeslot=0x1D66,
+ },
+ [0x1D67]={
+ category="ll",
+ description="GREEK SUBSCRIPT SMALL LETTER GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x03B3 },
+ unicodeslot=0x1D67,
+ },
+ [0x1D68]={
+ category="ll",
+ description="GREEK SUBSCRIPT SMALL LETTER RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x03C1 },
+ unicodeslot=0x1D68,
+ },
+ [0x1D69]={
+ category="ll",
+ description="GREEK SUBSCRIPT SMALL LETTER PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x03C6 },
+ unicodeslot=0x1D69,
+ },
+ [0x1D6A]={
+ category="ll",
+ description="GREEK SUBSCRIPT SMALL LETTER CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x03C7 },
+ unicodeslot=0x1D6A,
+ },
+ [0x1D6B]={
+ category="ll",
+ description="LATIN SMALL LETTER UE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D6B,
+ },
+ [0x1D6C]={
+ category="ll",
+ description="LATIN SMALL LETTER B WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ unicodeslot=0x1D6C,
+ },
+ [0x1D6D]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ unicodeslot=0x1D6D,
+ },
+ [0x1D6E]={
+ category="ll",
+ description="LATIN SMALL LETTER F WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0066,
+ unicodeslot=0x1D6E,
+ },
+ [0x1D6F]={
+ category="ll",
+ description="LATIN SMALL LETTER M WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006D,
+ unicodeslot=0x1D6F,
+ },
+ [0x1D70]={
+ category="ll",
+ description="LATIN SMALL LETTER N WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ unicodeslot=0x1D70,
+ },
+ [0x1D71]={
+ category="ll",
+ description="LATIN SMALL LETTER P WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0070,
+ unicodeslot=0x1D71,
+ },
+ [0x1D72]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ unicodeslot=0x1D72,
+ },
+ [0x1D73]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ unicodeslot=0x1D73,
+ },
+ [0x1D74]={
+ category="ll",
+ description="LATIN SMALL LETTER S WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ unicodeslot=0x1D74,
+ },
+ [0x1D75]={
+ category="ll",
+ description="LATIN SMALL LETTER T WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ unicodeslot=0x1D75,
+ },
+ [0x1D76]={
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH MIDDLE TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ unicodeslot=0x1D76,
+ },
+ [0x1D77]={
+ category="ll",
+ description="LATIN SMALL LETTER TURNED G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D77,
+ },
+ [0x1D78]={
+ category="lm",
+ description="MODIFIER LETTER CYRILLIC EN",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x043D },
+ unicodeslot=0x1D78,
+ },
+ [0x1D79]={
+ category="ll",
+ description="LATIN SMALL LETTER INSULAR G",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D79,
+ },
+ [0x1D7A]={
+ category="ll",
+ description="LATIN SMALL LETTER TH WITH STRIKETHROUGH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D7A,
+ },
+ [0x1D7B]={
+ category="ll",
+ description="LATIN SMALL CAPITAL LETTER I WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D7B,
+ },
+ [0x1D7C]={
+ category="ll",
+ description="LATIN SMALL LETTER IOTA WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0269,
+ unicodeslot=0x1D7C,
+ },
+ [0x1D7D]={
+ category="ll",
+ description="LATIN SMALL LETTER P WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0070,
+ uccode=0x2C63,
+ unicodeslot=0x1D7D,
+ },
+ [0x1D7E]={
+ category="ll",
+ description="LATIN SMALL CAPITAL LETTER U WITH STROKE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D7E,
+ },
+ [0x1D7F]={
+ category="ll",
+ description="LATIN SMALL LETTER UPSILON WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x028A,
+ unicodeslot=0x1D7F,
+ },
+ [0x1D80]={
+ category="ll",
+ description="LATIN SMALL LETTER B WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ unicodeslot=0x1D80,
+ },
+ [0x1D81]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ unicodeslot=0x1D81,
+ },
+ [0x1D82]={
+ category="ll",
+ description="LATIN SMALL LETTER F WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0066,
+ unicodeslot=0x1D82,
+ },
+ [0x1D83]={
+ category="ll",
+ description="LATIN SMALL LETTER G WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ unicodeslot=0x1D83,
+ },
+ [0x1D84]={
+ category="ll",
+ description="LATIN SMALL LETTER K WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ unicodeslot=0x1D84,
+ },
+ [0x1D85]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ unicodeslot=0x1D85,
+ },
+ [0x1D86]={
+ category="ll",
+ description="LATIN SMALL LETTER M WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006D,
+ unicodeslot=0x1D86,
+ },
+ [0x1D87]={
+ category="ll",
+ description="LATIN SMALL LETTER N WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ unicodeslot=0x1D87,
+ },
+ [0x1D88]={
+ category="ll",
+ description="LATIN SMALL LETTER P WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0070,
+ unicodeslot=0x1D88,
+ },
+ [0x1D89]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ unicodeslot=0x1D89,
+ },
+ [0x1D8A]={
+ category="ll",
+ description="LATIN SMALL LETTER S WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ unicodeslot=0x1D8A,
+ },
+ [0x1D8B]={
+ category="ll",
+ description="LATIN SMALL LETTER ESH WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0283,
+ unicodeslot=0x1D8B,
+ },
+ [0x1D8C]={
+ category="ll",
+ description="LATIN SMALL LETTER V WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0076,
+ unicodeslot=0x1D8C,
+ },
+ [0x1D8D]={
+ category="ll",
+ description="LATIN SMALL LETTER X WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0078,
+ unicodeslot=0x1D8D,
+ },
+ [0x1D8E]={
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ unicodeslot=0x1D8E,
+ },
+ [0x1D8F]={
+ category="ll",
+ description="LATIN SMALL LETTER A WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ unicodeslot=0x1D8F,
+ },
+ [0x1D90]={
+ category="ll",
+ description="LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0251,
+ unicodeslot=0x1D90,
+ },
+ [0x1D91]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH HOOK AND TAIL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ unicodeslot=0x1D91,
+ },
+ [0x1D92]={
+ category="ll",
+ description="LATIN SMALL LETTER E WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ unicodeslot=0x1D92,
+ },
+ [0x1D93]={
+ category="ll",
+ description="LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D93,
+ },
+ [0x1D94]={
+ category="ll",
+ description="LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D94,
+ },
+ [0x1D95]={
+ category="ll",
+ description="LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0259,
+ unicodeslot=0x1D95,
+ },
+ [0x1D96]={
+ category="ll",
+ description="LATIN SMALL LETTER I WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ unicodeslot=0x1D96,
+ },
+ [0x1D97]={
+ category="ll",
+ description="LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D97,
+ },
+ [0x1D98]={
+ category="ll",
+ description="LATIN SMALL LETTER ESH WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0283,
+ unicodeslot=0x1D98,
+ },
+ [0x1D99]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ unicodeslot=0x1D99,
+ },
+ [0x1D9A]={
+ category="ll",
+ description="LATIN SMALL LETTER EZH WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ shcode=0x0292,
+ unicodeslot=0x1D9A,
+ },
+ [0x1D9B]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0252 },
+ unicodeslot=0x1D9B,
+ },
+ [0x1D9C]={
+ category="lm",
+ description="MODIFIER LETTER SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0063 },
+ unicodeslot=0x1D9C,
+ },
+ [0x1D9D]={
+ category="lm",
+ description="MODIFIER LETTER SMALL C WITH CURL",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0255 },
+ unicodeslot=0x1D9D,
+ },
+ [0x1D9E]={
+ category="lm",
+ description="MODIFIER LETTER SMALL ETH",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x00F0 },
+ unicodeslot=0x1D9E,
+ },
+ [0x1D9F]={
+ category="lm",
+ description="MODIFIER LETTER SMALL REVERSED OPEN E",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x025C },
+ unicodeslot=0x1D9F,
+ },
+ [0x1DA0]={
+ category="lm",
+ description="MODIFIER LETTER SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0066 },
+ unicodeslot=0x1DA0,
+ },
+ [0x1DA1]={
+ category="lm",
+ description="MODIFIER LETTER SMALL DOTLESS J WITH STROKE",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x025F },
+ unicodeslot=0x1DA1,
+ },
+ [0x1DA2]={
+ category="lm",
+ description="MODIFIER LETTER SMALL SCRIPT G",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0261 },
+ unicodeslot=0x1DA2,
+ },
+ [0x1DA3]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED H",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0265 },
+ unicodeslot=0x1DA3,
+ },
+ [0x1DA4]={
+ category="lm",
+ description="MODIFIER LETTER SMALL I WITH STROKE",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0268 },
+ unicodeslot=0x1DA4,
+ },
+ [0x1DA5]={
+ category="lm",
+ description="MODIFIER LETTER SMALL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0269 },
+ unicodeslot=0x1DA5,
+ },
+ [0x1DA6]={
+ category="lm",
+ description="MODIFIER LETTER SMALL CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x026A },
+ unicodeslot=0x1DA6,
+ },
+ [0x1DA7]={
+ category="lm",
+ description="MODIFIER LETTER SMALL CAPITAL I WITH STROKE",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D7B },
+ unicodeslot=0x1DA7,
+ },
+ [0x1DA8]={
+ category="lm",
+ description="MODIFIER LETTER SMALL J WITH CROSSED-TAIL",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x029D },
+ unicodeslot=0x1DA8,
+ },
+ [0x1DA9]={
+ category="lm",
+ description="MODIFIER LETTER SMALL L WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x026D },
+ unicodeslot=0x1DA9,
+ },
+ [0x1DAA]={
+ category="lm",
+ description="MODIFIER LETTER SMALL L WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D85 },
+ unicodeslot=0x1DAA,
+ },
+ [0x1DAB]={
+ category="lm",
+ description="MODIFIER LETTER SMALL CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x029F },
+ unicodeslot=0x1DAB,
+ },
+ [0x1DAC]={
+ category="lm",
+ description="MODIFIER LETTER SMALL M WITH HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0271 },
+ unicodeslot=0x1DAC,
+ },
+ [0x1DAD]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED M WITH LONG LEG",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0270 },
+ unicodeslot=0x1DAD,
+ },
+ [0x1DAE]={
+ category="lm",
+ description="MODIFIER LETTER SMALL N WITH LEFT HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0272 },
+ unicodeslot=0x1DAE,
+ },
+ [0x1DAF]={
+ category="lm",
+ description="MODIFIER LETTER SMALL N WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0273 },
+ unicodeslot=0x1DAF,
+ },
+ [0x1DB0]={
+ category="lm",
+ description="MODIFIER LETTER SMALL CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0274 },
+ unicodeslot=0x1DB0,
+ },
+ [0x1DB1]={
+ category="lm",
+ description="MODIFIER LETTER SMALL BARRED O",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0275 },
+ unicodeslot=0x1DB1,
+ },
+ [0x1DB2]={
+ category="lm",
+ description="MODIFIER LETTER SMALL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0278 },
+ unicodeslot=0x1DB2,
+ },
+ [0x1DB3]={
+ category="lm",
+ description="MODIFIER LETTER SMALL S WITH HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0282 },
+ unicodeslot=0x1DB3,
+ },
+ [0x1DB4]={
+ category="lm",
+ description="MODIFIER LETTER SMALL ESH",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0283 },
+ unicodeslot=0x1DB4,
+ },
+ [0x1DB5]={
+ category="lm",
+ description="MODIFIER LETTER SMALL T WITH PALATAL HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x01AB },
+ unicodeslot=0x1DB5,
+ },
+ [0x1DB6]={
+ category="lm",
+ description="MODIFIER LETTER SMALL U BAR",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0289 },
+ unicodeslot=0x1DB6,
+ },
+ [0x1DB7]={
+ category="lm",
+ description="MODIFIER LETTER SMALL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x028A },
+ unicodeslot=0x1DB7,
+ },
+ [0x1DB8]={
+ category="lm",
+ description="MODIFIER LETTER SMALL CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x1D1C },
+ unicodeslot=0x1DB8,
+ },
+ [0x1DB9]={
+ category="lm",
+ description="MODIFIER LETTER SMALL V WITH HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x028B },
+ unicodeslot=0x1DB9,
+ },
+ [0x1DBA]={
+ category="lm",
+ description="MODIFIER LETTER SMALL TURNED V",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x028C },
+ unicodeslot=0x1DBA,
+ },
+ [0x1DBB]={
+ category="lm",
+ description="MODIFIER LETTER SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x007A },
+ unicodeslot=0x1DBB,
+ },
+ [0x1DBC]={
+ category="lm",
+ description="MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0290 },
+ unicodeslot=0x1DBC,
+ },
+ [0x1DBD]={
+ category="lm",
+ description="MODIFIER LETTER SMALL Z WITH CURL",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0291 },
+ unicodeslot=0x1DBD,
+ },
+ [0x1DBE]={
+ category="lm",
+ description="MODIFIER LETTER SMALL EZH",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0292 },
+ unicodeslot=0x1DBE,
+ },
+ [0x1DBF]={
+ category="lm",
+ description="MODIFIER LETTER SMALL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x03B8 },
+ unicodeslot=0x1DBF,
+ },
+ [0x1DC0]={
+ category="mn",
+ description="COMBINING DOTTED GRAVE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC0,
+ },
+ [0x1DC1]={
+ category="mn",
+ description="COMBINING DOTTED ACUTE ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC1,
+ },
+ [0x1DC2]={
+ category="mn",
+ description="COMBINING SNAKE BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC2,
+ },
+ [0x1DC3]={
+ category="mn",
+ description="COMBINING SUSPENSION MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC3,
+ },
+ [0x1DC4]={
+ category="mn",
+ description="COMBINING MACRON-ACUTE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC4,
+ },
+ [0x1DC5]={
+ category="mn",
+ description="COMBINING GRAVE-MACRON",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC5,
+ },
+ [0x1DC6]={
+ category="mn",
+ description="COMBINING MACRON-GRAVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC6,
+ },
+ [0x1DC7]={
+ category="mn",
+ description="COMBINING ACUTE-MACRON",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC7,
+ },
+ [0x1DC8]={
+ category="mn",
+ description="COMBINING GRAVE-ACUTE-GRAVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC8,
+ },
+ [0x1DC9]={
+ category="mn",
+ description="COMBINING ACUTE-GRAVE-ACUTE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DC9,
+ },
+ [0x1DCA]={
+ category="mn",
+ description="COMBINING LATIN SMALL LETTER R BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DCA,
+ },
+ [0x1DFE]={
+ category="mn",
+ description="COMBINING LEFT ARROWHEAD ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DFE,
+ },
+ [0x1DFF]={
+ category="mn",
+ description="COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1DFF,
+ },
+ [0x1E00]={
+ category="lu",
+ description="LATIN CAPITAL LETTER A WITH RING BELOW",
+ direction="l",
+ lccode=0x1E01,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0325 },
+ unicodeslot=0x1E00,
+ },
+ [0x1E01]={
+ category="ll",
+ description="LATIN SMALL LETTER A WITH RING BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0325 },
+ uccode=0x1E00,
+ unicodeslot=0x1E01,
+ },
+ [0x1E02]={
+ category="lu",
+ description="LATIN CAPITAL LETTER B WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E03,
+ linebreak="al",
+ shcode=0x0042,
+ specials={ "char", 0x0042, 0x0307 },
+ unicodeslot=0x1E02,
+ },
+ [0x1E03]={
+ category="ll",
+ description="LATIN SMALL LETTER B WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ specials={ "char", 0x0062, 0x0307 },
+ uccode=0x1E02,
+ unicodeslot=0x1E03,
+ },
+ [0x1E04]={
+ category="lu",
+ description="LATIN CAPITAL LETTER B WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E05,
+ linebreak="al",
+ shcode=0x0042,
+ specials={ "char", 0x0042, 0x0323 },
+ unicodeslot=0x1E04,
+ },
+ [0x1E05]={
+ category="ll",
+ description="LATIN SMALL LETTER B WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ specials={ "char", 0x0062, 0x0323 },
+ uccode=0x1E04,
+ unicodeslot=0x1E05,
+ },
+ [0x1E06]={
+ category="lu",
+ description="LATIN CAPITAL LETTER B WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E07,
+ linebreak="al",
+ shcode=0x0042,
+ specials={ "char", 0x0042, 0x0331 },
+ unicodeslot=0x1E06,
+ },
+ [0x1E07]={
+ category="ll",
+ description="LATIN SMALL LETTER B WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0062,
+ specials={ "char", 0x0062, 0x0331 },
+ uccode=0x1E06,
+ unicodeslot=0x1E07,
+ },
+ [0x1E08]={
+ category="lu",
+ description="LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE",
+ direction="l",
+ lccode=0x1E09,
+ linebreak="al",
+ shcode=0x0043,
+ specials={ "char", 0x00C7, 0x0301 },
+ unicodeslot=0x1E08,
+ },
+ [0x1E09]={
+ category="ll",
+ description="LATIN SMALL LETTER C WITH CEDILLA AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0063,
+ specials={ "char", 0x00E7, 0x0301 },
+ uccode=0x1E08,
+ unicodeslot=0x1E09,
+ },
+ [0x1E0A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER D WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E0B,
+ linebreak="al",
+ shcode=0x0044,
+ specials={ "char", 0x0044, 0x0307 },
+ unicodeslot=0x1E0A,
+ },
+ [0x1E0B]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ specials={ "char", 0x0064, 0x0307 },
+ uccode=0x1E0A,
+ unicodeslot=0x1E0B,
+ },
+ [0x1E0C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER D WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E0D,
+ linebreak="al",
+ shcode=0x0044,
+ specials={ "char", 0x0044, 0x0323 },
+ unicodeslot=0x1E0C,
+ },
+ [0x1E0D]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ specials={ "char", 0x0064, 0x0323 },
+ uccode=0x1E0C,
+ unicodeslot=0x1E0D,
+ },
+ [0x1E0E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER D WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E0F,
+ linebreak="al",
+ shcode=0x0044,
+ specials={ "char", 0x0044, 0x0331 },
+ unicodeslot=0x1E0E,
+ },
+ [0x1E0F]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ specials={ "char", 0x0064, 0x0331 },
+ uccode=0x1E0E,
+ unicodeslot=0x1E0F,
+ },
+ [0x1E10]={
+ category="lu",
+ description="LATIN CAPITAL LETTER D WITH CEDILLA",
+ direction="l",
+ lccode=0x1E11,
+ linebreak="al",
+ shcode=0x0044,
+ specials={ "char", 0x0044, 0x0327 },
+ unicodeslot=0x1E10,
+ },
+ [0x1E11]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ specials={ "char", 0x0064, 0x0327 },
+ uccode=0x1E10,
+ unicodeslot=0x1E11,
+ },
+ [0x1E12]={
+ category="lu",
+ description="LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW",
+ direction="l",
+ lccode=0x1E13,
+ linebreak="al",
+ shcode=0x0044,
+ specials={ "char", 0x0044, 0x032D },
+ unicodeslot=0x1E12,
+ },
+ [0x1E13]={
+ category="ll",
+ description="LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0064,
+ specials={ "char", 0x0064, 0x032D },
+ uccode=0x1E12,
+ unicodeslot=0x1E13,
+ },
+ [0x1E14]={
+ category="lu",
+ description="LATIN CAPITAL LETTER E WITH MACRON AND GRAVE",
+ direction="l",
+ lccode=0x1E15,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0112, 0x0300 },
+ unicodeslot=0x1E14,
+ },
+ [0x1E15]={
+ category="ll",
+ description="LATIN SMALL LETTER E WITH MACRON AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0113, 0x0300 },
+ uccode=0x1E14,
+ unicodeslot=0x1E15,
+ },
+ [0x1E16]={
+ category="lu",
+ description="LATIN CAPITAL LETTER E WITH MACRON AND ACUTE",
+ direction="l",
+ lccode=0x1E17,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0112, 0x0301 },
+ unicodeslot=0x1E16,
+ },
+ [0x1E17]={
+ category="ll",
+ description="LATIN SMALL LETTER E WITH MACRON AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0113, 0x0301 },
+ uccode=0x1E16,
+ unicodeslot=0x1E17,
+ },
+ [0x1E18]={
+ category="lu",
+ description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW",
+ direction="l",
+ lccode=0x1E19,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x032D },
+ unicodeslot=0x1E18,
+ },
+ [0x1E19]={
+ category="ll",
+ description="LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x032D },
+ uccode=0x1E18,
+ unicodeslot=0x1E19,
+ },
+ [0x1E1A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER E WITH TILDE BELOW",
+ direction="l",
+ lccode=0x1E1B,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0330 },
+ unicodeslot=0x1E1A,
+ },
+ [0x1E1B]={
+ category="ll",
+ description="LATIN SMALL LETTER E WITH TILDE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0330 },
+ uccode=0x1E1A,
+ unicodeslot=0x1E1B,
+ },
+ [0x1E1C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE",
+ direction="l",
+ lccode=0x1E1D,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0228, 0x0306 },
+ unicodeslot=0x1E1C,
+ },
+ [0x1E1D]={
+ category="ll",
+ description="LATIN SMALL LETTER E WITH CEDILLA AND BREVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0229, 0x0306 },
+ uccode=0x1E1C,
+ unicodeslot=0x1E1D,
+ },
+ [0x1E1E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER F WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E1F,
+ linebreak="al",
+ shcode=0x0046,
+ specials={ "char", 0x0046, 0x0307 },
+ unicodeslot=0x1E1E,
+ },
+ [0x1E1F]={
+ category="ll",
+ description="LATIN SMALL LETTER F WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0066,
+ specials={ "char", 0x0066, 0x0307 },
+ uccode=0x1E1E,
+ unicodeslot=0x1E1F,
+ },
+ [0x1E20]={
+ category="lu",
+ description="LATIN CAPITAL LETTER G WITH MACRON",
+ direction="l",
+ lccode=0x1E21,
+ linebreak="al",
+ shcode=0x0047,
+ specials={ "char", 0x0047, 0x0304 },
+ unicodeslot=0x1E20,
+ },
+ [0x1E21]={
+ category="ll",
+ description="LATIN SMALL LETTER G WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0067,
+ specials={ "char", 0x0067, 0x0304 },
+ uccode=0x1E20,
+ unicodeslot=0x1E21,
+ },
+ [0x1E22]={
+ category="lu",
+ description="LATIN CAPITAL LETTER H WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E23,
+ linebreak="al",
+ shcode=0x0048,
+ specials={ "char", 0x0048, 0x0307 },
+ unicodeslot=0x1E22,
+ },
+ [0x1E23]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x0307 },
+ uccode=0x1E22,
+ unicodeslot=0x1E23,
+ },
+ [0x1E24]={
+ category="lu",
+ description="LATIN CAPITAL LETTER H WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E25,
+ linebreak="al",
+ shcode=0x0048,
+ specials={ "char", 0x0048, 0x0323 },
+ unicodeslot=0x1E24,
+ },
+ [0x1E25]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x0323 },
+ uccode=0x1E24,
+ unicodeslot=0x1E25,
+ },
+ [0x1E26]={
+ category="lu",
+ description="LATIN CAPITAL LETTER H WITH DIAERESIS",
+ direction="l",
+ lccode=0x1E27,
+ linebreak="al",
+ shcode=0x0048,
+ specials={ "char", 0x0048, 0x0308 },
+ unicodeslot=0x1E26,
+ },
+ [0x1E27]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x0308 },
+ uccode=0x1E26,
+ unicodeslot=0x1E27,
+ },
+ [0x1E28]={
+ category="lu",
+ description="LATIN CAPITAL LETTER H WITH CEDILLA",
+ direction="l",
+ lccode=0x1E29,
+ linebreak="al",
+ shcode=0x0048,
+ specials={ "char", 0x0048, 0x0327 },
+ unicodeslot=0x1E28,
+ },
+ [0x1E29]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH CEDILLA",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x0327 },
+ uccode=0x1E28,
+ unicodeslot=0x1E29,
+ },
+ [0x1E2A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER H WITH BREVE BELOW",
+ direction="l",
+ lccode=0x1E2B,
+ linebreak="al",
+ shcode=0x0048,
+ specials={ "char", 0x0048, 0x032E },
+ unicodeslot=0x1E2A,
+ },
+ [0x1E2B]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH BREVE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x032E },
+ uccode=0x1E2A,
+ unicodeslot=0x1E2B,
+ },
+ [0x1E2C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER I WITH TILDE BELOW",
+ direction="l",
+ lccode=0x1E2D,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0330 },
+ unicodeslot=0x1E2C,
+ },
+ [0x1E2D]={
+ category="ll",
+ description="LATIN SMALL LETTER I WITH TILDE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0330 },
+ uccode=0x1E2C,
+ unicodeslot=0x1E2D,
+ },
+ [0x1E2E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE",
+ direction="l",
+ lccode=0x1E2F,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x00CF, 0x0301 },
+ unicodeslot=0x1E2E,
+ },
+ [0x1E2F]={
+ category="ll",
+ description="LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x00EF, 0x0301 },
+ uccode=0x1E2E,
+ unicodeslot=0x1E2F,
+ },
+ [0x1E30]={
+ category="lu",
+ description="LATIN CAPITAL LETTER K WITH ACUTE",
+ direction="l",
+ lccode=0x1E31,
+ linebreak="al",
+ shcode=0x004B,
+ specials={ "char", 0x004B, 0x0301 },
+ unicodeslot=0x1E30,
+ },
+ [0x1E31]={
+ category="ll",
+ description="LATIN SMALL LETTER K WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ specials={ "char", 0x006B, 0x0301 },
+ uccode=0x1E30,
+ unicodeslot=0x1E31,
+ },
+ [0x1E32]={
+ category="lu",
+ description="LATIN CAPITAL LETTER K WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E33,
+ linebreak="al",
+ shcode=0x004B,
+ specials={ "char", 0x004B, 0x0323 },
+ unicodeslot=0x1E32,
+ },
+ [0x1E33]={
+ category="ll",
+ description="LATIN SMALL LETTER K WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ specials={ "char", 0x006B, 0x0323 },
+ uccode=0x1E32,
+ unicodeslot=0x1E33,
+ },
+ [0x1E34]={
+ category="lu",
+ description="LATIN CAPITAL LETTER K WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E35,
+ linebreak="al",
+ shcode=0x004B,
+ specials={ "char", 0x004B, 0x0331 },
+ unicodeslot=0x1E34,
+ },
+ [0x1E35]={
+ category="ll",
+ description="LATIN SMALL LETTER K WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ specials={ "char", 0x006B, 0x0331 },
+ uccode=0x1E34,
+ unicodeslot=0x1E35,
+ },
+ [0x1E36]={
+ category="lu",
+ description="LATIN CAPITAL LETTER L WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E37,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "char", 0x004C, 0x0323 },
+ unicodeslot=0x1E36,
+ },
+ [0x1E37]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "char", 0x006C, 0x0323 },
+ uccode=0x1E36,
+ unicodeslot=0x1E37,
+ },
+ [0x1E38]={
+ category="lu",
+ description="LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON",
+ direction="l",
+ lccode=0x1E39,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "char", 0x1E36, 0x0304 },
+ unicodeslot=0x1E38,
+ },
+ [0x1E39]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH DOT BELOW AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "char", 0x1E37, 0x0304 },
+ uccode=0x1E38,
+ unicodeslot=0x1E39,
+ },
+ [0x1E3A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER L WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E3B,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "char", 0x004C, 0x0331 },
+ unicodeslot=0x1E3A,
+ },
+ [0x1E3B]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "char", 0x006C, 0x0331 },
+ uccode=0x1E3A,
+ unicodeslot=0x1E3B,
+ },
+ [0x1E3C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW",
+ direction="l",
+ lccode=0x1E3D,
+ linebreak="al",
+ shcode=0x004C,
+ specials={ "char", 0x004C, 0x032D },
+ unicodeslot=0x1E3C,
+ },
+ [0x1E3D]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ specials={ "char", 0x006C, 0x032D },
+ uccode=0x1E3C,
+ unicodeslot=0x1E3D,
+ },
+ [0x1E3E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER M WITH ACUTE",
+ direction="l",
+ lccode=0x1E3F,
+ linebreak="al",
+ shcode=0x004D,
+ specials={ "char", 0x004D, 0x0301 },
+ unicodeslot=0x1E3E,
+ },
+ [0x1E3F]={
+ category="ll",
+ description="LATIN SMALL LETTER M WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006D,
+ specials={ "char", 0x006D, 0x0301 },
+ uccode=0x1E3E,
+ unicodeslot=0x1E3F,
+ },
+ [0x1E40]={
+ category="lu",
+ description="LATIN CAPITAL LETTER M WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E41,
+ linebreak="al",
+ shcode=0x004D,
+ specials={ "char", 0x004D, 0x0307 },
+ unicodeslot=0x1E40,
+ },
+ [0x1E41]={
+ category="ll",
+ description="LATIN SMALL LETTER M WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006D,
+ specials={ "char", 0x006D, 0x0307 },
+ uccode=0x1E40,
+ unicodeslot=0x1E41,
+ },
+ [0x1E42]={
+ category="lu",
+ description="LATIN CAPITAL LETTER M WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E43,
+ linebreak="al",
+ shcode=0x004D,
+ specials={ "char", 0x004D, 0x0323 },
+ unicodeslot=0x1E42,
+ },
+ [0x1E43]={
+ category="ll",
+ description="LATIN SMALL LETTER M WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006D,
+ specials={ "char", 0x006D, 0x0323 },
+ uccode=0x1E42,
+ unicodeslot=0x1E43,
+ },
+ [0x1E44]={
+ category="lu",
+ description="LATIN CAPITAL LETTER N WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E45,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x0307 },
+ unicodeslot=0x1E44,
+ },
+ [0x1E45]={
+ category="ll",
+ description="LATIN SMALL LETTER N WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x0307 },
+ uccode=0x1E44,
+ unicodeslot=0x1E45,
+ },
+ [0x1E46]={
+ category="lu",
+ description="LATIN CAPITAL LETTER N WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E47,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x0323 },
+ unicodeslot=0x1E46,
+ },
+ [0x1E47]={
+ category="ll",
+ description="LATIN SMALL LETTER N WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x0323 },
+ uccode=0x1E46,
+ unicodeslot=0x1E47,
+ },
+ [0x1E48]={
+ category="lu",
+ description="LATIN CAPITAL LETTER N WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E49,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x0331 },
+ unicodeslot=0x1E48,
+ },
+ [0x1E49]={
+ category="ll",
+ description="LATIN SMALL LETTER N WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x0331 },
+ uccode=0x1E48,
+ unicodeslot=0x1E49,
+ },
+ [0x1E4A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW",
+ direction="l",
+ lccode=0x1E4B,
+ linebreak="al",
+ shcode=0x004E,
+ specials={ "char", 0x004E, 0x032D },
+ unicodeslot=0x1E4A,
+ },
+ [0x1E4B]={
+ category="ll",
+ description="LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006E,
+ specials={ "char", 0x006E, 0x032D },
+ uccode=0x1E4A,
+ unicodeslot=0x1E4B,
+ },
+ [0x1E4C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER O WITH TILDE AND ACUTE",
+ direction="l",
+ lccode=0x1E4D,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D5, 0x0301 },
+ unicodeslot=0x1E4C,
+ },
+ [0x1E4D]={
+ category="ll",
+ description="LATIN SMALL LETTER O WITH TILDE AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F5, 0x0301 },
+ uccode=0x1E4C,
+ unicodeslot=0x1E4D,
+ },
+ [0x1E4E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS",
+ direction="l",
+ lccode=0x1E4F,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D5, 0x0308 },
+ unicodeslot=0x1E4E,
+ },
+ [0x1E4F]={
+ category="ll",
+ description="LATIN SMALL LETTER O WITH TILDE AND DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F5, 0x0308 },
+ uccode=0x1E4E,
+ unicodeslot=0x1E4F,
+ },
+ [0x1E50]={
+ category="lu",
+ description="LATIN CAPITAL LETTER O WITH MACRON AND GRAVE",
+ direction="l",
+ lccode=0x1E51,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x014C, 0x0300 },
+ unicodeslot=0x1E50,
+ },
+ [0x1E51]={
+ category="ll",
+ description="LATIN SMALL LETTER O WITH MACRON AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x014D, 0x0300 },
+ uccode=0x1E50,
+ unicodeslot=0x1E51,
+ },
+ [0x1E52]={
+ category="lu",
+ description="LATIN CAPITAL LETTER O WITH MACRON AND ACUTE",
+ direction="l",
+ lccode=0x1E53,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x014C, 0x0301 },
+ unicodeslot=0x1E52,
+ },
+ [0x1E53]={
+ category="ll",
+ description="LATIN SMALL LETTER O WITH MACRON AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x014D, 0x0301 },
+ uccode=0x1E52,
+ unicodeslot=0x1E53,
+ },
+ [0x1E54]={
+ category="lu",
+ description="LATIN CAPITAL LETTER P WITH ACUTE",
+ direction="l",
+ lccode=0x1E55,
+ linebreak="al",
+ shcode=0x0050,
+ specials={ "char", 0x0050, 0x0301 },
+ unicodeslot=0x1E54,
+ },
+ [0x1E55]={
+ category="ll",
+ description="LATIN SMALL LETTER P WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0070,
+ specials={ "char", 0x0070, 0x0301 },
+ uccode=0x1E54,
+ unicodeslot=0x1E55,
+ },
+ [0x1E56]={
+ category="lu",
+ description="LATIN CAPITAL LETTER P WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E57,
+ linebreak="al",
+ shcode=0x0050,
+ specials={ "char", 0x0050, 0x0307 },
+ unicodeslot=0x1E56,
+ },
+ [0x1E57]={
+ category="ll",
+ description="LATIN SMALL LETTER P WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0070,
+ specials={ "char", 0x0070, 0x0307 },
+ uccode=0x1E56,
+ unicodeslot=0x1E57,
+ },
+ [0x1E58]={
+ category="lu",
+ description="LATIN CAPITAL LETTER R WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E59,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x0307 },
+ unicodeslot=0x1E58,
+ },
+ [0x1E59]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x0307 },
+ uccode=0x1E58,
+ unicodeslot=0x1E59,
+ },
+ [0x1E5A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER R WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E5B,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x0323 },
+ unicodeslot=0x1E5A,
+ },
+ [0x1E5B]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x0323 },
+ uccode=0x1E5A,
+ unicodeslot=0x1E5B,
+ },
+ [0x1E5C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON",
+ direction="l",
+ lccode=0x1E5D,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x1E5A, 0x0304 },
+ unicodeslot=0x1E5C,
+ },
+ [0x1E5D]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH DOT BELOW AND MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x1E5B, 0x0304 },
+ uccode=0x1E5C,
+ unicodeslot=0x1E5D,
+ },
+ [0x1E5E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER R WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E5F,
+ linebreak="al",
+ shcode=0x0052,
+ specials={ "char", 0x0052, 0x0331 },
+ unicodeslot=0x1E5E,
+ },
+ [0x1E5F]={
+ category="ll",
+ description="LATIN SMALL LETTER R WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0072,
+ specials={ "char", 0x0072, 0x0331 },
+ uccode=0x1E5E,
+ unicodeslot=0x1E5F,
+ },
+ [0x1E60]={
+ category="lu",
+ description="LATIN CAPITAL LETTER S WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E61,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0053, 0x0307 },
+ unicodeslot=0x1E60,
+ },
+ [0x1E61]={
+ category="ll",
+ description="LATIN SMALL LETTER S WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0073, 0x0307 },
+ uccode=0x1E60,
+ unicodeslot=0x1E61,
+ },
+ [0x1E62]={
+ category="lu",
+ description="LATIN CAPITAL LETTER S WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E63,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0053, 0x0323 },
+ unicodeslot=0x1E62,
+ },
+ [0x1E63]={
+ category="ll",
+ description="LATIN SMALL LETTER S WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0073, 0x0323 },
+ uccode=0x1E62,
+ unicodeslot=0x1E63,
+ },
+ [0x1E64]={
+ category="lu",
+ description="LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE",
+ direction="l",
+ lccode=0x1E65,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x015A, 0x0307 },
+ unicodeslot=0x1E64,
+ },
+ [0x1E65]={
+ category="ll",
+ description="LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x015B, 0x0307 },
+ uccode=0x1E64,
+ unicodeslot=0x1E65,
+ },
+ [0x1E66]={
+ category="lu",
+ description="LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE",
+ direction="l",
+ lccode=0x1E67,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x0160, 0x0307 },
+ unicodeslot=0x1E66,
+ },
+ [0x1E67]={
+ category="ll",
+ description="LATIN SMALL LETTER S WITH CARON AND DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x0161, 0x0307 },
+ uccode=0x1E66,
+ unicodeslot=0x1E67,
+ },
+ [0x1E68]={
+ category="lu",
+ description="LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE",
+ direction="l",
+ lccode=0x1E69,
+ linebreak="al",
+ shcode=0x0053,
+ specials={ "char", 0x1E62, 0x0307 },
+ unicodeslot=0x1E68,
+ },
+ [0x1E69]={
+ category="ll",
+ description="LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0073,
+ specials={ "char", 0x1E63, 0x0307 },
+ uccode=0x1E68,
+ unicodeslot=0x1E69,
+ },
+ [0x1E6A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER T WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E6B,
+ linebreak="al",
+ shcode=0x0054,
+ specials={ "char", 0x0054, 0x0307 },
+ unicodeslot=0x1E6A,
+ },
+ [0x1E6B]={
+ category="ll",
+ description="LATIN SMALL LETTER T WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x0307 },
+ uccode=0x1E6A,
+ unicodeslot=0x1E6B,
+ },
+ [0x1E6C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER T WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E6D,
+ linebreak="al",
+ shcode=0x0054,
+ specials={ "char", 0x0054, 0x0323 },
+ unicodeslot=0x1E6C,
+ },
+ [0x1E6D]={
+ category="ll",
+ description="LATIN SMALL LETTER T WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x0323 },
+ uccode=0x1E6C,
+ unicodeslot=0x1E6D,
+ },
+ [0x1E6E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER T WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E6F,
+ linebreak="al",
+ shcode=0x0054,
+ specials={ "char", 0x0054, 0x0331 },
+ unicodeslot=0x1E6E,
+ },
+ [0x1E6F]={
+ category="ll",
+ description="LATIN SMALL LETTER T WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x0331 },
+ uccode=0x1E6E,
+ unicodeslot=0x1E6F,
+ },
+ [0x1E70]={
+ category="lu",
+ description="LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW",
+ direction="l",
+ lccode=0x1E71,
+ linebreak="al",
+ shcode=0x0054,
+ specials={ "char", 0x0054, 0x032D },
+ unicodeslot=0x1E70,
+ },
+ [0x1E71]={
+ category="ll",
+ description="LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x032D },
+ uccode=0x1E70,
+ unicodeslot=0x1E71,
+ },
+ [0x1E72]={
+ category="lu",
+ description="LATIN CAPITAL LETTER U WITH DIAERESIS BELOW",
+ direction="l",
+ lccode=0x1E73,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0324 },
+ unicodeslot=0x1E72,
+ },
+ [0x1E73]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH DIAERESIS BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0324 },
+ uccode=0x1E72,
+ unicodeslot=0x1E73,
+ },
+ [0x1E74]={
+ category="lu",
+ description="LATIN CAPITAL LETTER U WITH TILDE BELOW",
+ direction="l",
+ lccode=0x1E75,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0330 },
+ unicodeslot=0x1E74,
+ },
+ [0x1E75]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH TILDE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0330 },
+ uccode=0x1E74,
+ unicodeslot=0x1E75,
+ },
+ [0x1E76]={
+ category="lu",
+ description="LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW",
+ direction="l",
+ lccode=0x1E77,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x032D },
+ unicodeslot=0x1E76,
+ },
+ [0x1E77]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x032D },
+ uccode=0x1E76,
+ unicodeslot=0x1E77,
+ },
+ [0x1E78]={
+ category="lu",
+ description="LATIN CAPITAL LETTER U WITH TILDE AND ACUTE",
+ direction="l",
+ lccode=0x1E79,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0168, 0x0301 },
+ unicodeslot=0x1E78,
+ },
+ [0x1E79]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH TILDE AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0169, 0x0301 },
+ uccode=0x1E78,
+ unicodeslot=0x1E79,
+ },
+ [0x1E7A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS",
+ direction="l",
+ lccode=0x1E7B,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x016A, 0x0308 },
+ unicodeslot=0x1E7A,
+ },
+ [0x1E7B]={
+ category="ll",
+ description="LATIN SMALL LETTER U WITH MACRON AND DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x016B, 0x0308 },
+ uccode=0x1E7A,
+ unicodeslot=0x1E7B,
+ },
+ [0x1E7C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER V WITH TILDE",
+ direction="l",
+ lccode=0x1E7D,
+ linebreak="al",
+ shcode=0x0056,
+ specials={ "char", 0x0056, 0x0303 },
+ unicodeslot=0x1E7C,
+ },
+ [0x1E7D]={
+ category="ll",
+ description="LATIN SMALL LETTER V WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0076,
+ specials={ "char", 0x0076, 0x0303 },
+ uccode=0x1E7C,
+ unicodeslot=0x1E7D,
+ },
+ [0x1E7E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER V WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E7F,
+ linebreak="al",
+ shcode=0x0056,
+ specials={ "char", 0x0056, 0x0323 },
+ unicodeslot=0x1E7E,
+ },
+ [0x1E7F]={
+ category="ll",
+ description="LATIN SMALL LETTER V WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0076,
+ specials={ "char", 0x0076, 0x0323 },
+ uccode=0x1E7E,
+ unicodeslot=0x1E7F,
+ },
+ [0x1E80]={
+ adobename="Wgrave",
+ category="lu",
+ description="LATIN CAPITAL LETTER W WITH GRAVE",
+ direction="l",
+ lccode=0x1E81,
+ linebreak="al",
+ shcode=0x0057,
+ specials={ "char", 0x0057, 0x0300 },
+ unicodeslot=0x1E80,
+ },
+ [0x1E81]={
+ adobename="wgrave",
+ category="ll",
+ description="LATIN SMALL LETTER W WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0077,
+ specials={ "char", 0x0077, 0x0300 },
+ uccode=0x1E80,
+ unicodeslot=0x1E81,
+ },
+ [0x1E82]={
+ adobename="Wacute",
+ category="lu",
+ description="LATIN CAPITAL LETTER W WITH ACUTE",
+ direction="l",
+ lccode=0x1E83,
+ linebreak="al",
+ shcode=0x0057,
+ specials={ "char", 0x0057, 0x0301 },
+ unicodeslot=0x1E82,
+ },
+ [0x1E83]={
+ adobename="wacute",
+ category="ll",
+ description="LATIN SMALL LETTER W WITH ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0077,
+ specials={ "char", 0x0077, 0x0301 },
+ uccode=0x1E82,
+ unicodeslot=0x1E83,
+ },
+ [0x1E84]={
+ adobename="Wdieresis",
+ category="lu",
+ description="LATIN CAPITAL LETTER W WITH DIAERESIS",
+ direction="l",
+ lccode=0x1E85,
+ linebreak="al",
+ shcode=0x0057,
+ specials={ "char", 0x0057, 0x0308 },
+ unicodeslot=0x1E84,
+ },
+ [0x1E85]={
+ adobename="wdieresis",
+ category="ll",
+ description="LATIN SMALL LETTER W WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0077,
+ specials={ "char", 0x0077, 0x0308 },
+ uccode=0x1E84,
+ unicodeslot=0x1E85,
+ },
+ [0x1E86]={
+ category="lu",
+ description="LATIN CAPITAL LETTER W WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E87,
+ linebreak="al",
+ shcode=0x0057,
+ specials={ "char", 0x0057, 0x0307 },
+ unicodeslot=0x1E86,
+ },
+ [0x1E87]={
+ category="ll",
+ description="LATIN SMALL LETTER W WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0077,
+ specials={ "char", 0x0077, 0x0307 },
+ uccode=0x1E86,
+ unicodeslot=0x1E87,
+ },
+ [0x1E88]={
+ category="lu",
+ description="LATIN CAPITAL LETTER W WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E89,
+ linebreak="al",
+ shcode=0x0057,
+ specials={ "char", 0x0057, 0x0323 },
+ unicodeslot=0x1E88,
+ },
+ [0x1E89]={
+ category="ll",
+ description="LATIN SMALL LETTER W WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0077,
+ specials={ "char", 0x0077, 0x0323 },
+ uccode=0x1E88,
+ unicodeslot=0x1E89,
+ },
+ [0x1E8A]={
+ category="lu",
+ description="LATIN CAPITAL LETTER X WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E8B,
+ linebreak="al",
+ shcode=0x0058,
+ specials={ "char", 0x0058, 0x0307 },
+ unicodeslot=0x1E8A,
+ },
+ [0x1E8B]={
+ category="ll",
+ description="LATIN SMALL LETTER X WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0078,
+ specials={ "char", 0x0078, 0x0307 },
+ uccode=0x1E8A,
+ unicodeslot=0x1E8B,
+ },
+ [0x1E8C]={
+ category="lu",
+ description="LATIN CAPITAL LETTER X WITH DIAERESIS",
+ direction="l",
+ lccode=0x1E8D,
+ linebreak="al",
+ shcode=0x0058,
+ specials={ "char", 0x0058, 0x0308 },
+ unicodeslot=0x1E8C,
+ },
+ [0x1E8D]={
+ category="ll",
+ description="LATIN SMALL LETTER X WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0078,
+ specials={ "char", 0x0078, 0x0308 },
+ uccode=0x1E8C,
+ unicodeslot=0x1E8D,
+ },
+ [0x1E8E]={
+ category="lu",
+ description="LATIN CAPITAL LETTER Y WITH DOT ABOVE",
+ direction="l",
+ lccode=0x1E8F,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0307 },
+ unicodeslot=0x1E8E,
+ },
+ [0x1E8F]={
+ category="ll",
+ description="LATIN SMALL LETTER Y WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0307 },
+ uccode=0x1E8E,
+ unicodeslot=0x1E8F,
+ },
+ [0x1E90]={
+ category="lu",
+ description="LATIN CAPITAL LETTER Z WITH CIRCUMFLEX",
+ direction="l",
+ lccode=0x1E91,
+ linebreak="al",
+ shcode=0x005A,
+ specials={ "char", 0x005A, 0x0302 },
+ unicodeslot=0x1E90,
+ },
+ [0x1E91]={
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH CIRCUMFLEX",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ specials={ "char", 0x007A, 0x0302 },
+ uccode=0x1E90,
+ unicodeslot=0x1E91,
+ },
+ [0x1E92]={
+ category="lu",
+ description="LATIN CAPITAL LETTER Z WITH DOT BELOW",
+ direction="l",
+ lccode=0x1E93,
+ linebreak="al",
+ shcode=0x005A,
+ specials={ "char", 0x005A, 0x0323 },
+ unicodeslot=0x1E92,
+ },
+ [0x1E93]={
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ specials={ "char", 0x007A, 0x0323 },
+ uccode=0x1E92,
+ unicodeslot=0x1E93,
+ },
+ [0x1E94]={
+ category="lu",
+ description="LATIN CAPITAL LETTER Z WITH LINE BELOW",
+ direction="l",
+ lccode=0x1E95,
+ linebreak="al",
+ shcode=0x005A,
+ specials={ "char", 0x005A, 0x0331 },
+ unicodeslot=0x1E94,
+ },
+ [0x1E95]={
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ specials={ "char", 0x007A, 0x0331 },
+ uccode=0x1E94,
+ unicodeslot=0x1E95,
+ },
+ [0x1E96]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH LINE BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ specials={ "char", 0x0068, 0x0331 },
+ unicodeslot=0x1E96,
+ },
+ [0x1E97]={
+ category="ll",
+ description="LATIN SMALL LETTER T WITH DIAERESIS",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ specials={ "char", 0x0074, 0x0308 },
+ unicodeslot=0x1E97,
+ },
+ [0x1E98]={
+ category="ll",
+ description="LATIN SMALL LETTER W WITH RING ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0077,
+ specials={ "char", 0x0077, 0x030A },
+ unicodeslot=0x1E98,
+ },
+ [0x1E99]={
+ category="ll",
+ description="LATIN SMALL LETTER Y WITH RING ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x030A },
+ unicodeslot=0x1E99,
+ },
+ [0x1E9A]={
+ category="ll",
+ description="LATIN SMALL LETTER A WITH RIGHT HALF RING",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "compat", 0x0061, 0x02BE },
+ unicodeslot=0x1E9A,
+ },
+ [0x1E9B]={
+ category="ll",
+ description="LATIN SMALL LETTER LONG S WITH DOT ABOVE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x017F, 0x0307 },
+ uccode=0x1E60,
+ unicodeslot=0x1E9B,
+ },
+ [0x1EA0]={
+ category="lu",
+ contextname="Adotbelow",
+ description="LATIN CAPITAL LETTER A WITH DOT BELOW",
+ direction="l",
+ lccode=0x1EA1,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0323 },
+ unicodeslot=0x1EA0,
+ },
+ [0x1EA1]={
+ category="ll",
+ contextname="adotbelow",
+ description="LATIN SMALL LETTER A WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0323 },
+ uccode=0x1EA0,
+ unicodeslot=0x1EA1,
+ },
+ [0x1EA2]={
+ category="lu",
+ contextname="Ahook",
+ description="LATIN CAPITAL LETTER A WITH HOOK ABOVE",
+ direction="l",
+ lccode=0x1EA3,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0041, 0x0309 },
+ unicodeslot=0x1EA2,
+ },
+ [0x1EA3]={
+ category="ll",
+ contextname="ahook",
+ description="LATIN SMALL LETTER A WITH HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0061, 0x0309 },
+ uccode=0x1EA2,
+ unicodeslot=0x1EA3,
+ },
+ [0x1EA4]={
+ category="lu",
+ contextname="Acircumflexacute",
+ description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE",
+ direction="l",
+ lccode=0x1EA5,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x00C2, 0x0301 },
+ unicodeslot=0x1EA4,
+ },
+ [0x1EA5]={
+ category="ll",
+ contextname="acircumflexacute",
+ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x00E2, 0x0301 },
+ uccode=0x1EA4,
+ unicodeslot=0x1EA5,
+ },
+ [0x1EA6]={
+ category="lu",
+ contextname="Acircumflexgrave",
+ description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE",
+ direction="l",
+ lccode=0x1EA7,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x00C2, 0x0300 },
+ unicodeslot=0x1EA6,
+ },
+ [0x1EA7]={
+ category="ll",
+ contextname="acircumflexgrave",
+ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x00E2, 0x0300 },
+ uccode=0x1EA6,
+ unicodeslot=0x1EA7,
+ },
+ [0x1EA8]={
+ category="lu",
+ contextname="Acircumflexhook",
+ description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE",
+ direction="l",
+ lccode=0x1EA9,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x00C2, 0x0309 },
+ unicodeslot=0x1EA8,
+ },
+ [0x1EA9]={
+ category="ll",
+ contextname="acircumflexhook",
+ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x00E2, 0x0309 },
+ uccode=0x1EA8,
+ unicodeslot=0x1EA9,
+ },
+ [0x1EAA]={
+ category="lu",
+ contextname="Acircumflextilde",
+ description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE",
+ direction="l",
+ lccode=0x1EAB,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x00C2, 0x0303 },
+ unicodeslot=0x1EAA,
+ },
+ [0x1EAB]={
+ category="ll",
+ contextname="acircumflextilde",
+ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x00E2, 0x0303 },
+ uccode=0x1EAA,
+ unicodeslot=0x1EAB,
+ },
+ [0x1EAC]={
+ category="lu",
+ contextname="Acircumflexdotbelow",
+ description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW",
+ direction="l",
+ lccode=0x1EAD,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x1EA0, 0x0302 },
+ unicodeslot=0x1EAC,
+ },
+ [0x1EAD]={
+ category="ll",
+ contextname="acircumflexdotbelow",
+ description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x1EA1, 0x0302 },
+ uccode=0x1EAC,
+ unicodeslot=0x1EAD,
+ },
+ [0x1EAE]={
+ category="lu",
+ contextname="Abreveacute",
+ description="LATIN CAPITAL LETTER A WITH BREVE AND ACUTE",
+ direction="l",
+ lccode=0x1EAF,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0102, 0x0301 },
+ unicodeslot=0x1EAE,
+ },
+ [0x1EAF]={
+ category="ll",
+ contextname="abreveacute",
+ description="LATIN SMALL LETTER A WITH BREVE AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0103, 0x0301 },
+ uccode=0x1EAE,
+ unicodeslot=0x1EAF,
+ },
+ [0x1EB0]={
+ category="lu",
+ contextname="Abrevegrave",
+ description="LATIN CAPITAL LETTER A WITH BREVE AND GRAVE",
+ direction="l",
+ lccode=0x1EB1,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0102, 0x0300 },
+ unicodeslot=0x1EB0,
+ },
+ [0x1EB1]={
+ category="ll",
+ contextname="abrevegrave",
+ description="LATIN SMALL LETTER A WITH BREVE AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0103, 0x0300 },
+ uccode=0x1EB0,
+ unicodeslot=0x1EB1,
+ },
+ [0x1EB2]={
+ category="lu",
+ contextname="Abrevehook",
+ description="LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE",
+ direction="l",
+ lccode=0x1EB3,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0102, 0x0309 },
+ unicodeslot=0x1EB2,
+ },
+ [0x1EB3]={
+ category="ll",
+ contextname="abrevehook",
+ description="LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0103, 0x0309 },
+ uccode=0x1EB2,
+ unicodeslot=0x1EB3,
+ },
+ [0x1EB4]={
+ category="lu",
+ contextname="Abrevetilde",
+ description="LATIN CAPITAL LETTER A WITH BREVE AND TILDE",
+ direction="l",
+ lccode=0x1EB5,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x0102, 0x0303 },
+ unicodeslot=0x1EB4,
+ },
+ [0x1EB5]={
+ category="ll",
+ contextname="abrevetilde",
+ description="LATIN SMALL LETTER A WITH BREVE AND TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x0103, 0x0303 },
+ uccode=0x1EB4,
+ unicodeslot=0x1EB5,
+ },
+ [0x1EB6]={
+ category="lu",
+ contextname="Abrevedotbelow",
+ description="LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW",
+ direction="l",
+ lccode=0x1EB7,
+ linebreak="al",
+ shcode=0x0041,
+ specials={ "char", 0x1EA0, 0x0306 },
+ unicodeslot=0x1EB6,
+ },
+ [0x1EB7]={
+ category="ll",
+ contextname="abrevedotbelow",
+ description="LATIN SMALL LETTER A WITH BREVE AND DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ specials={ "char", 0x1EA1, 0x0306 },
+ uccode=0x1EB6,
+ unicodeslot=0x1EB7,
+ },
+ [0x1EB8]={
+ category="lu",
+ contextname="Edotbelow",
+ description="LATIN CAPITAL LETTER E WITH DOT BELOW",
+ direction="l",
+ lccode=0x1EB9,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0323 },
+ unicodeslot=0x1EB8,
+ },
+ [0x1EB9]={
+ category="ll",
+ contextname="edotbelow",
+ description="LATIN SMALL LETTER E WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0323 },
+ uccode=0x1EB8,
+ unicodeslot=0x1EB9,
+ },
+ [0x1EBA]={
+ category="lu",
+ contextname="Ehook",
+ description="LATIN CAPITAL LETTER E WITH HOOK ABOVE",
+ direction="l",
+ lccode=0x1EBB,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0309 },
+ unicodeslot=0x1EBA,
+ },
+ [0x1EBB]={
+ category="ll",
+ contextname="ehook",
+ description="LATIN SMALL LETTER E WITH HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0309 },
+ uccode=0x1EBA,
+ unicodeslot=0x1EBB,
+ },
+ [0x1EBC]={
+ category="lu",
+ contextname="Etilde",
+ description="LATIN CAPITAL LETTER E WITH TILDE",
+ direction="l",
+ lccode=0x1EBD,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x0045, 0x0303 },
+ unicodeslot=0x1EBC,
+ },
+ [0x1EBD]={
+ category="ll",
+ contextname="etilde",
+ description="LATIN SMALL LETTER E WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x0065, 0x0303 },
+ uccode=0x1EBC,
+ unicodeslot=0x1EBD,
+ },
+ [0x1EBE]={
+ category="lu",
+ contextname="Ecircumflexacute",
+ description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE",
+ direction="l",
+ lccode=0x1EBF,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x00CA, 0x0301 },
+ unicodeslot=0x1EBE,
+ },
+ [0x1EBF]={
+ category="ll",
+ contextname="ecircumflexacute",
+ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x00EA, 0x0301 },
+ uccode=0x1EBE,
+ unicodeslot=0x1EBF,
+ },
+ [0x1EC0]={
+ category="lu",
+ contextname="Ecircumflexgrave",
+ description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE",
+ direction="l",
+ lccode=0x1EC1,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x00CA, 0x0300 },
+ unicodeslot=0x1EC0,
+ },
+ [0x1EC1]={
+ category="ll",
+ contextname="ecircumflexgrave",
+ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x00EA, 0x0300 },
+ uccode=0x1EC0,
+ unicodeslot=0x1EC1,
+ },
+ [0x1EC2]={
+ category="lu",
+ contextname="Ecircumflexhook",
+ description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE",
+ direction="l",
+ lccode=0x1EC3,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x00CA, 0x0309 },
+ unicodeslot=0x1EC2,
+ },
+ [0x1EC3]={
+ category="ll",
+ contextname="ecircumflexhook",
+ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x00EA, 0x0309 },
+ uccode=0x1EC2,
+ unicodeslot=0x1EC3,
+ },
+ [0x1EC4]={
+ category="lu",
+ contextname="Ecircumflextilde",
+ description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE",
+ direction="l",
+ lccode=0x1EC5,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x00CA, 0x0303 },
+ unicodeslot=0x1EC4,
+ },
+ [0x1EC5]={
+ category="ll",
+ contextname="ecircumflextilde",
+ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x00EA, 0x0303 },
+ uccode=0x1EC4,
+ unicodeslot=0x1EC5,
+ },
+ [0x1EC6]={
+ category="lu",
+ contextname="Ecircumflexdotbelow",
+ description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW",
+ direction="l",
+ lccode=0x1EC7,
+ linebreak="al",
+ shcode=0x0045,
+ specials={ "char", 0x1EB8, 0x0302 },
+ unicodeslot=0x1EC6,
+ },
+ [0x1EC7]={
+ category="ll",
+ contextname="ecircumflexdotbelow",
+ description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0065,
+ specials={ "char", 0x1EB9, 0x0302 },
+ uccode=0x1EC6,
+ unicodeslot=0x1EC7,
+ },
+ [0x1EC8]={
+ category="lu",
+ contextname="Ihook",
+ description="LATIN CAPITAL LETTER I WITH HOOK ABOVE",
+ direction="l",
+ lccode=0x1EC9,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0309 },
+ unicodeslot=0x1EC8,
+ },
+ [0x1EC9]={
+ category="ll",
+ contextname="ihook",
+ description="LATIN SMALL LETTER I WITH HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0309 },
+ uccode=0x1EC8,
+ unicodeslot=0x1EC9,
+ },
+ [0x1ECA]={
+ category="lu",
+ contextname="Idotbelow",
+ description="LATIN CAPITAL LETTER I WITH DOT BELOW",
+ direction="l",
+ lccode=0x1ECB,
+ linebreak="al",
+ shcode=0x0049,
+ specials={ "char", 0x0049, 0x0323 },
+ unicodeslot=0x1ECA,
+ },
+ [0x1ECB]={
+ category="ll",
+ contextname="idotbelow",
+ description="LATIN SMALL LETTER I WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0069,
+ specials={ "char", 0x0069, 0x0323 },
+ uccode=0x1ECA,
+ unicodeslot=0x1ECB,
+ },
+ [0x1ECC]={
+ category="lu",
+ contextname="Odotbelow",
+ description="LATIN CAPITAL LETTER O WITH DOT BELOW",
+ direction="l",
+ lccode=0x1ECD,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0323 },
+ unicodeslot=0x1ECC,
+ },
+ [0x1ECD]={
+ category="ll",
+ contextname="odotbelow",
+ description="LATIN SMALL LETTER O WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0323 },
+ uccode=0x1ECC,
+ unicodeslot=0x1ECD,
+ },
+ [0x1ECE]={
+ category="lu",
+ contextname="Ohook",
+ description="LATIN CAPITAL LETTER O WITH HOOK ABOVE",
+ direction="l",
+ lccode=0x1ECF,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x004F, 0x0309 },
+ unicodeslot=0x1ECE,
+ },
+ [0x1ECF]={
+ category="ll",
+ contextname="ohook",
+ description="LATIN SMALL LETTER O WITH HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x006F, 0x0309 },
+ uccode=0x1ECE,
+ unicodeslot=0x1ECF,
+ },
+ [0x1ED0]={
+ category="lu",
+ contextname="Ocircumflexacute",
+ description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE",
+ direction="l",
+ lccode=0x1ED1,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D4, 0x0301 },
+ unicodeslot=0x1ED0,
+ },
+ [0x1ED1]={
+ category="ll",
+ contextname="ocircumflexacute",
+ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F4, 0x0301 },
+ uccode=0x1ED0,
+ unicodeslot=0x1ED1,
+ },
+ [0x1ED2]={
+ category="lu",
+ contextname="Ocircumflexgrave",
+ description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE",
+ direction="l",
+ lccode=0x1ED3,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D4, 0x0300 },
+ unicodeslot=0x1ED2,
+ },
+ [0x1ED3]={
+ category="ll",
+ contextname="ocircumflexgrave",
+ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F4, 0x0300 },
+ uccode=0x1ED2,
+ unicodeslot=0x1ED3,
+ },
+ [0x1ED4]={
+ category="lu",
+ contextname="Ocircumflexhook",
+ description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE",
+ direction="l",
+ lccode=0x1ED5,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D4, 0x0309 },
+ unicodeslot=0x1ED4,
+ },
+ [0x1ED5]={
+ category="ll",
+ contextname="ocircumflexhook",
+ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F4, 0x0309 },
+ uccode=0x1ED4,
+ unicodeslot=0x1ED5,
+ },
+ [0x1ED6]={
+ category="lu",
+ contextname="Ocircumflextilde",
+ description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE",
+ direction="l",
+ lccode=0x1ED7,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x00D4, 0x0303 },
+ unicodeslot=0x1ED6,
+ },
+ [0x1ED7]={
+ category="ll",
+ contextname="ocircumflextilde",
+ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x00F4, 0x0303 },
+ uccode=0x1ED6,
+ unicodeslot=0x1ED7,
+ },
+ [0x1ED8]={
+ category="lu",
+ contextname="Ocircumflexdotbelow",
+ description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW",
+ direction="l",
+ lccode=0x1ED9,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x1ECC, 0x0302 },
+ unicodeslot=0x1ED8,
+ },
+ [0x1ED9]={
+ category="ll",
+ contextname="ocircumflexdotbelow",
+ description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x1ECD, 0x0302 },
+ uccode=0x1ED8,
+ unicodeslot=0x1ED9,
+ },
+ [0x1EDA]={
+ category="lu",
+ contextname="Ohornacute",
+ description="LATIN CAPITAL LETTER O WITH HORN AND ACUTE",
+ direction="l",
+ lccode=0x1EDB,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x01A0, 0x0301 },
+ unicodeslot=0x1EDA,
+ },
+ [0x1EDB]={
+ category="ll",
+ contextname="ohornacute",
+ description="LATIN SMALL LETTER O WITH HORN AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x01A1, 0x0301 },
+ uccode=0x1EDA,
+ unicodeslot=0x1EDB,
+ },
+ [0x1EDC]={
+ category="lu",
+ contextname="Ohorngrave",
+ description="LATIN CAPITAL LETTER O WITH HORN AND GRAVE",
+ direction="l",
+ lccode=0x1EDD,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x01A0, 0x0300 },
+ unicodeslot=0x1EDC,
+ },
+ [0x1EDD]={
+ category="ll",
+ contextname="ohorngrave",
+ description="LATIN SMALL LETTER O WITH HORN AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x01A1, 0x0300 },
+ uccode=0x1EDC,
+ unicodeslot=0x1EDD,
+ },
+ [0x1EDE]={
+ category="lu",
+ contextname="Ohornhook",
+ description="LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE",
+ direction="l",
+ lccode=0x1EDF,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x01A0, 0x0309 },
+ unicodeslot=0x1EDE,
+ },
+ [0x1EDF]={
+ category="ll",
+ contextname="ohornhook",
+ description="LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x01A1, 0x0309 },
+ uccode=0x1EDE,
+ unicodeslot=0x1EDF,
+ },
+ [0x1EE0]={
+ category="lu",
+ contextname="Ohorntilde",
+ description="LATIN CAPITAL LETTER O WITH HORN AND TILDE",
+ direction="l",
+ lccode=0x1EE1,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x01A0, 0x0303 },
+ unicodeslot=0x1EE0,
+ },
+ [0x1EE1]={
+ category="ll",
+ contextname="ohorntilde",
+ description="LATIN SMALL LETTER O WITH HORN AND TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x01A1, 0x0303 },
+ uccode=0x1EE0,
+ unicodeslot=0x1EE1,
+ },
+ [0x1EE2]={
+ category="lu",
+ contextname="Ohorndotbelow",
+ description="LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW",
+ direction="l",
+ lccode=0x1EE3,
+ linebreak="al",
+ shcode=0x004F,
+ specials={ "char", 0x01A0, 0x0323 },
+ unicodeslot=0x1EE2,
+ },
+ [0x1EE3]={
+ category="ll",
+ contextname="ohorndotbelow",
+ description="LATIN SMALL LETTER O WITH HORN AND DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x006F,
+ specials={ "char", 0x01A1, 0x0323 },
+ uccode=0x1EE2,
+ unicodeslot=0x1EE3,
+ },
+ [0x1EE4]={
+ category="lu",
+ contextname="Udotbelow",
+ description="LATIN CAPITAL LETTER U WITH DOT BELOW",
+ direction="l",
+ lccode=0x1EE5,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0323 },
+ unicodeslot=0x1EE4,
+ },
+ [0x1EE5]={
+ category="ll",
+ contextname="udotbelow",
+ description="LATIN SMALL LETTER U WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0323 },
+ uccode=0x1EE4,
+ unicodeslot=0x1EE5,
+ },
+ [0x1EE6]={
+ category="lu",
+ contextname="Uhook",
+ description="LATIN CAPITAL LETTER U WITH HOOK ABOVE",
+ direction="l",
+ lccode=0x1EE7,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x0055, 0x0309 },
+ unicodeslot=0x1EE6,
+ },
+ [0x1EE7]={
+ category="ll",
+ contextname="uhook",
+ description="LATIN SMALL LETTER U WITH HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x0075, 0x0309 },
+ uccode=0x1EE6,
+ unicodeslot=0x1EE7,
+ },
+ [0x1EE8]={
+ category="lu",
+ contextname="Uhornacute",
+ description="LATIN CAPITAL LETTER U WITH HORN AND ACUTE",
+ direction="l",
+ lccode=0x1EE9,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x01AF, 0x0301 },
+ unicodeslot=0x1EE8,
+ },
+ [0x1EE9]={
+ category="ll",
+ contextname="uhornacute",
+ description="LATIN SMALL LETTER U WITH HORN AND ACUTE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x01B0, 0x0301 },
+ uccode=0x1EE8,
+ unicodeslot=0x1EE9,
+ },
+ [0x1EEA]={
+ category="lu",
+ contextname="Uhorngrave",
+ description="LATIN CAPITAL LETTER U WITH HORN AND GRAVE",
+ direction="l",
+ lccode=0x1EEB,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x01AF, 0x0300 },
+ unicodeslot=0x1EEA,
+ },
+ [0x1EEB]={
+ category="ll",
+ contextname="uhorngrave",
+ description="LATIN SMALL LETTER U WITH HORN AND GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x01B0, 0x0300 },
+ uccode=0x1EEA,
+ unicodeslot=0x1EEB,
+ },
+ [0x1EEC]={
+ category="lu",
+ contextname="Uhornhook",
+ description="LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE",
+ direction="l",
+ lccode=0x1EED,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x01AF, 0x0309 },
+ unicodeslot=0x1EEC,
+ },
+ [0x1EED]={
+ category="ll",
+ contextname="uhornhook",
+ description="LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x01B0, 0x0309 },
+ uccode=0x1EEC,
+ unicodeslot=0x1EED,
+ },
+ [0x1EEE]={
+ category="lu",
+ contextname="Uhorntilde",
+ description="LATIN CAPITAL LETTER U WITH HORN AND TILDE",
+ direction="l",
+ lccode=0x1EEF,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x01AF, 0x0303 },
+ unicodeslot=0x1EEE,
+ },
+ [0x1EEF]={
+ category="ll",
+ contextname="uhorntilde",
+ description="LATIN SMALL LETTER U WITH HORN AND TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x01B0, 0x0303 },
+ uccode=0x1EEE,
+ unicodeslot=0x1EEF,
+ },
+ [0x1EF0]={
+ category="lu",
+ contextname="Uhorndotbelow",
+ description="LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW",
+ direction="l",
+ lccode=0x1EF1,
+ linebreak="al",
+ shcode=0x0055,
+ specials={ "char", 0x01AF, 0x0323 },
+ unicodeslot=0x1EF0,
+ },
+ [0x1EF1]={
+ category="ll",
+ contextname="uhorndotbelow",
+ description="LATIN SMALL LETTER U WITH HORN AND DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0075,
+ specials={ "char", 0x01B0, 0x0323 },
+ uccode=0x1EF0,
+ unicodeslot=0x1EF1,
+ },
+ [0x1EF2]={
+ adobename="Ygrave",
+ category="lu",
+ contextname="Ygrave",
+ description="LATIN CAPITAL LETTER Y WITH GRAVE",
+ direction="l",
+ lccode=0x1EF3,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0300 },
+ unicodeslot=0x1EF2,
+ },
+ [0x1EF3]={
+ adobename="ygrave",
+ category="ll",
+ contextname="ygrave",
+ description="LATIN SMALL LETTER Y WITH GRAVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0300 },
+ uccode=0x1EF2,
+ unicodeslot=0x1EF3,
+ },
+ [0x1EF4]={
+ category="lu",
+ contextname="Ydotbelow",
+ description="LATIN CAPITAL LETTER Y WITH DOT BELOW",
+ direction="l",
+ lccode=0x1EF5,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0323 },
+ unicodeslot=0x1EF4,
+ },
+ [0x1EF5]={
+ category="ll",
+ contextname="ydotbelow",
+ description="LATIN SMALL LETTER Y WITH DOT BELOW",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0323 },
+ uccode=0x1EF4,
+ unicodeslot=0x1EF5,
+ },
+ [0x1EF6]={
+ category="lu",
+ contextname="Yhook",
+ description="LATIN CAPITAL LETTER Y WITH HOOK ABOVE",
+ direction="l",
+ lccode=0x1EF7,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0309 },
+ unicodeslot=0x1EF6,
+ },
+ [0x1EF7]={
+ category="ll",
+ contextname="yhook",
+ description="LATIN SMALL LETTER Y WITH HOOK ABOVE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0309 },
+ uccode=0x1EF6,
+ unicodeslot=0x1EF7,
+ },
+ [0x1EF8]={
+ category="lu",
+ contextname="Ytilde",
+ description="LATIN CAPITAL LETTER Y WITH TILDE",
+ direction="l",
+ lccode=0x1EF9,
+ linebreak="al",
+ shcode=0x0059,
+ specials={ "char", 0x0059, 0x0303 },
+ unicodeslot=0x1EF8,
+ },
+ [0x1EF9]={
+ category="ll",
+ contextname="ytilde",
+ description="LATIN SMALL LETTER Y WITH TILDE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0079,
+ specials={ "char", 0x0079, 0x0303 },
+ uccode=0x1EF8,
+ unicodeslot=0x1EF9,
+ },
+ [0x1F00]={
+ category="ll",
+ contextname="greekalphapsili",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0313 },
+ uccode=0x1F08,
+ unicodeslot=0x1F00,
+ },
+ [0x1F01]={
+ category="ll",
+ contextname="greekalphadasia",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0314 },
+ uccode=0x1F09,
+ unicodeslot=0x1F01,
+ },
+ [0x1F02]={
+ category="ll",
+ contextname="greekalphapsilivaria",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F00, 0x0300 },
+ uccode=0x1F0A,
+ unicodeslot=0x1F02,
+ },
+ [0x1F03]={
+ category="ll",
+ contextname="greekalphadasiavaria",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F01, 0x0300 },
+ uccode=0x1F0B,
+ unicodeslot=0x1F03,
+ },
+ [0x1F04]={
+ category="ll",
+ contextname="greekalphapsilitonos",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F00, 0x0301 },
+ uccode=0x1F0C,
+ unicodeslot=0x1F04,
+ },
+ [0x1F05]={
+ category="ll",
+ contextname="greekalphadasiatonos",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F01, 0x0301 },
+ uccode=0x1F0D,
+ unicodeslot=0x1F05,
+ },
+ [0x1F06]={
+ category="ll",
+ contextname="greekalphapsiliperispomeni",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F00, 0x0342 },
+ uccode=0x1F0E,
+ unicodeslot=0x1F06,
+ },
+ [0x1F07]={
+ category="ll",
+ contextname="greekalphadasiaperispomeni",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F01, 0x0342 },
+ uccode=0x1F0F,
+ unicodeslot=0x1F07,
+ },
+ [0x1F08]={
+ category="lu",
+ contextname="greekAlphapsili",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI",
+ direction="l",
+ lccode=0x1F00,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0391, 0x0313 },
+ unicodeslot=0x1F08,
+ },
+ [0x1F09]={
+ category="lu",
+ contextname="greekAlphadasia",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA",
+ direction="l",
+ lccode=0x1F01,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0391, 0x0314 },
+ unicodeslot=0x1F09,
+ },
+ [0x1F0A]={
+ category="lu",
+ contextname="greekAlphapsilivaria",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA",
+ direction="l",
+ lccode=0x1F02,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F08, 0x0300 },
+ unicodeslot=0x1F0A,
+ },
+ [0x1F0B]={
+ category="lu",
+ contextname="greekAlphadasiavaria",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA",
+ direction="l",
+ lccode=0x1F03,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F09, 0x0300 },
+ unicodeslot=0x1F0B,
+ },
+ [0x1F0C]={
+ category="lu",
+ contextname="greekAlphapsilitonos",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA",
+ direction="l",
+ lccode=0x1F04,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F08, 0x0301 },
+ unicodeslot=0x1F0C,
+ },
+ [0x1F0D]={
+ category="lu",
+ contextname="greekAlphadasiatonos",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA",
+ direction="l",
+ lccode=0x1F05,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F09, 0x0301 },
+ unicodeslot=0x1F0D,
+ },
+ [0x1F0E]={
+ category="lu",
+ contextname="greekAlphapsiliperispomeni",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F06,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F08, 0x0342 },
+ unicodeslot=0x1F0E,
+ },
+ [0x1F0F]={
+ category="lu",
+ contextname="greekAlphadasiaperispomeni",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F07,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F09, 0x0342 },
+ unicodeslot=0x1F0F,
+ },
+ [0x1F10]={
+ category="ll",
+ contextname="greekepsilonpsili",
+ description="GREEK SMALL LETTER EPSILON WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x03B5, 0x0313 },
+ uccode=0x1F18,
+ unicodeslot=0x1F10,
+ },
+ [0x1F11]={
+ category="ll",
+ contextname="greekepsilondasia",
+ description="GREEK SMALL LETTER EPSILON WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x03B5, 0x0314 },
+ uccode=0x1F19,
+ unicodeslot=0x1F11,
+ },
+ [0x1F12]={
+ category="ll",
+ contextname="greekepsilonpsilivaria",
+ description="GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x1F10, 0x0300 },
+ uccode=0x1F1A,
+ unicodeslot=0x1F12,
+ },
+ [0x1F13]={
+ category="ll",
+ contextname="greekepsilondasiavaria",
+ description="GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x1F11, 0x0300 },
+ uccode=0x1F1B,
+ unicodeslot=0x1F13,
+ },
+ [0x1F14]={
+ category="ll",
+ contextname="greekepsilonpsilitonos",
+ description="GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x1F10, 0x0301 },
+ uccode=0x1F1C,
+ unicodeslot=0x1F14,
+ },
+ [0x1F15]={
+ category="ll",
+ contextname="greekepsilondasiatonos",
+ description="GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x1F11, 0x0301 },
+ uccode=0x1F1D,
+ unicodeslot=0x1F15,
+ },
+ [0x1F18]={
+ category="lu",
+ contextname="greekEpsilonpsili",
+ description="GREEK CAPITAL LETTER EPSILON WITH PSILI",
+ direction="l",
+ lccode=0x1F10,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x0395, 0x0313 },
+ unicodeslot=0x1F18,
+ },
+ [0x1F19]={
+ category="lu",
+ contextname="greekEpsilondasia",
+ description="GREEK CAPITAL LETTER EPSILON WITH DASIA",
+ direction="l",
+ lccode=0x1F11,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x0395, 0x0314 },
+ unicodeslot=0x1F19,
+ },
+ [0x1F1A]={
+ category="lu",
+ contextname="greekEpsilonpsilivaria",
+ description="GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA",
+ direction="l",
+ lccode=0x1F12,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x1F18, 0x0300 },
+ unicodeslot=0x1F1A,
+ },
+ [0x1F1B]={
+ category="lu",
+ contextname="greekEpsilondasiavaria",
+ description="GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA",
+ direction="l",
+ lccode=0x1F13,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x1F19, 0x0300 },
+ unicodeslot=0x1F1B,
+ },
+ [0x1F1C]={
+ category="lu",
+ contextname="greekEpsilonpsilitonos",
+ description="GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA",
+ direction="l",
+ lccode=0x1F14,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x1F18, 0x0301 },
+ unicodeslot=0x1F1C,
+ },
+ [0x1F1D]={
+ category="lu",
+ contextname="greekEpsilondasiatonos",
+ description="GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA",
+ direction="l",
+ lccode=0x1F15,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x1F19, 0x0301 },
+ unicodeslot=0x1F1D,
+ },
+ [0x1F20]={
+ category="ll",
+ contextname="greeketapsili",
+ description="GREEK SMALL LETTER ETA WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03B7, 0x0313 },
+ uccode=0x1F28,
+ unicodeslot=0x1F20,
+ },
+ [0x1F21]={
+ category="ll",
+ contextname="greeketadasia",
+ description="GREEK SMALL LETTER ETA WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03B7, 0x0314 },
+ uccode=0x1F29,
+ unicodeslot=0x1F21,
+ },
+ [0x1F22]={
+ category="ll",
+ contextname="greeketapsilivaria",
+ description="GREEK SMALL LETTER ETA WITH PSILI AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F20, 0x0300 },
+ uccode=0x1F2A,
+ unicodeslot=0x1F22,
+ },
+ [0x1F23]={
+ category="ll",
+ contextname="greeketadasiavaria",
+ description="GREEK SMALL LETTER ETA WITH DASIA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F21, 0x0300 },
+ uccode=0x1F2B,
+ unicodeslot=0x1F23,
+ },
+ [0x1F24]={
+ category="ll",
+ contextname="greeketapsilitonos",
+ description="GREEK SMALL LETTER ETA WITH PSILI AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F20, 0x0301 },
+ uccode=0x1F2C,
+ unicodeslot=0x1F24,
+ },
+ [0x1F25]={
+ category="ll",
+ contextname="greeketadasiatonos",
+ description="GREEK SMALL LETTER ETA WITH DASIA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F21, 0x0301 },
+ uccode=0x1F2D,
+ unicodeslot=0x1F25,
+ },
+ [0x1F26]={
+ category="ll",
+ contextname="greeketapsiliperispomeni",
+ description="GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F20, 0x0342 },
+ uccode=0x1F2E,
+ unicodeslot=0x1F26,
+ },
+ [0x1F27]={
+ category="ll",
+ contextname="greeketadasiaperispomeni",
+ description="GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F21, 0x0342 },
+ uccode=0x1F2F,
+ unicodeslot=0x1F27,
+ },
+ [0x1F28]={
+ category="lu",
+ contextname="greekEtapsili",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI",
+ direction="l",
+ lccode=0x1F20,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x0397, 0x0313 },
+ unicodeslot=0x1F28,
+ },
+ [0x1F29]={
+ category="lu",
+ contextname="greekEtadasia",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA",
+ direction="l",
+ lccode=0x1F21,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x0397, 0x0314 },
+ unicodeslot=0x1F29,
+ },
+ [0x1F2A]={
+ category="lu",
+ contextname="greekEtapsilivaria",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA",
+ direction="l",
+ lccode=0x1F22,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F28, 0x0300 },
+ unicodeslot=0x1F2A,
+ },
+ [0x1F2B]={
+ category="lu",
+ contextname="greekEtadasiavaria",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA",
+ direction="l",
+ lccode=0x1F23,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F29, 0x0300 },
+ unicodeslot=0x1F2B,
+ },
+ [0x1F2C]={
+ category="lu",
+ contextname="greekEtapsilitonos",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA",
+ direction="l",
+ lccode=0x1F24,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F28, 0x0301 },
+ unicodeslot=0x1F2C,
+ },
+ [0x1F2D]={
+ category="lu",
+ contextname="greekEtadasiatonos",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA",
+ direction="l",
+ lccode=0x1F25,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F29, 0x0301 },
+ unicodeslot=0x1F2D,
+ },
+ [0x1F2E]={
+ category="lu",
+ contextname="greekEtapsiliperispomeni",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F26,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F28, 0x0342 },
+ unicodeslot=0x1F2E,
+ },
+ [0x1F2F]={
+ category="lu",
+ contextname="greekEtadasiaperispomeni",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F27,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F29, 0x0342 },
+ unicodeslot=0x1F2F,
+ },
+ [0x1F30]={
+ category="ll",
+ contextname="greekiotapsili",
+ description="GREEK SMALL LETTER IOTA WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0313 },
+ uccode=0x1F38,
+ unicodeslot=0x1F30,
+ },
+ [0x1F31]={
+ category="ll",
+ contextname="greekiotadasia",
+ description="GREEK SMALL LETTER IOTA WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0314 },
+ uccode=0x1F39,
+ unicodeslot=0x1F31,
+ },
+ [0x1F32]={
+ category="ll",
+ contextname="greekiotapsilivaria",
+ description="GREEK SMALL LETTER IOTA WITH PSILI AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x1F30, 0x0300 },
+ uccode=0x1F3A,
+ unicodeslot=0x1F32,
+ },
+ [0x1F33]={
+ category="ll",
+ contextname="greekiotadasiavaria",
+ description="GREEK SMALL LETTER IOTA WITH DASIA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x1F31, 0x0300 },
+ uccode=0x1F3B,
+ unicodeslot=0x1F33,
+ },
+ [0x1F34]={
+ category="ll",
+ contextname="greekiotapsilitonos",
+ description="GREEK SMALL LETTER IOTA WITH PSILI AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x1F30, 0x0301 },
+ uccode=0x1F3C,
+ unicodeslot=0x1F34,
+ },
+ [0x1F35]={
+ category="ll",
+ contextname="greekiotadasiatonos",
+ description="GREEK SMALL LETTER IOTA WITH DASIA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x1F31, 0x0301 },
+ uccode=0x1F3D,
+ unicodeslot=0x1F35,
+ },
+ [0x1F36]={
+ category="ll",
+ contextname="greekiotapsiliperispomeni",
+ description="GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x1F30, 0x0342 },
+ uccode=0x1F3E,
+ unicodeslot=0x1F36,
+ },
+ [0x1F37]={
+ category="ll",
+ contextname="greekiotadasiaperispomeni",
+ description="GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x1F31, 0x0342 },
+ uccode=0x1F3F,
+ unicodeslot=0x1F37,
+ },
+ [0x1F38]={
+ category="lu",
+ contextname="greekIotapsili",
+ description="GREEK CAPITAL LETTER IOTA WITH PSILI",
+ direction="l",
+ lccode=0x1F30,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x0399, 0x0313 },
+ unicodeslot=0x1F38,
+ },
+ [0x1F39]={
+ category="lu",
+ contextname="greekIotadasia",
+ description="GREEK CAPITAL LETTER IOTA WITH DASIA",
+ direction="l",
+ lccode=0x1F31,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x0399, 0x0314 },
+ unicodeslot=0x1F39,
+ },
+ [0x1F3A]={
+ category="lu",
+ contextname="greekIotapsilivaria",
+ description="GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA",
+ direction="l",
+ lccode=0x1F32,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x1F38, 0x0300 },
+ unicodeslot=0x1F3A,
+ },
+ [0x1F3B]={
+ category="lu",
+ contextname="greekIotadasiavaria",
+ description="GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA",
+ direction="l",
+ lccode=0x1F33,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x1F39, 0x0300 },
+ unicodeslot=0x1F3B,
+ },
+ [0x1F3C]={
+ category="lu",
+ contextname="greekIotapsilitonos",
+ description="GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA",
+ direction="l",
+ lccode=0x1F34,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x1F38, 0x0301 },
+ unicodeslot=0x1F3C,
+ },
+ [0x1F3D]={
+ category="lu",
+ contextname="greekIotadasiatonos",
+ description="GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA",
+ direction="l",
+ lccode=0x1F35,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x1F39, 0x0301 },
+ unicodeslot=0x1F3D,
+ },
+ [0x1F3E]={
+ category="lu",
+ contextname="greekIotapsiliperispomeni",
+ description="GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F36,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x1F38, 0x0342 },
+ unicodeslot=0x1F3E,
+ },
+ [0x1F3F]={
+ category="lu",
+ contextname="greekIotadasiaperispomeni",
+ description="GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F37,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x1F39, 0x0342 },
+ unicodeslot=0x1F3F,
+ },
+ [0x1F40]={
+ category="ll",
+ contextname="greekomicronpsili",
+ description="GREEK SMALL LETTER OMICRON WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x03BF, 0x0313 },
+ uccode=0x1F48,
+ unicodeslot=0x1F40,
+ },
+ [0x1F41]={
+ category="ll",
+ contextname="greekomicrondasia",
+ description="GREEK SMALL LETTER OMICRON WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x03BF, 0x0314 },
+ uccode=0x1F49,
+ unicodeslot=0x1F41,
+ },
+ [0x1F42]={
+ category="ll",
+ contextname="greekomicronpsilivaria",
+ description="GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x1F40, 0x0300 },
+ uccode=0x1F4A,
+ unicodeslot=0x1F42,
+ },
+ [0x1F43]={
+ category="ll",
+ contextname="greekomicrondasiavaria",
+ description="GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x1F41, 0x0300 },
+ uccode=0x1F4B,
+ unicodeslot=0x1F43,
+ },
+ [0x1F44]={
+ category="ll",
+ contextname="greekomicronpsilitonos",
+ description="GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x1F40, 0x0301 },
+ uccode=0x1F4C,
+ unicodeslot=0x1F44,
+ },
+ [0x1F45]={
+ category="ll",
+ contextname="greekomicrondasiatonos",
+ description="GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x1F41, 0x0301 },
+ uccode=0x1F4D,
+ unicodeslot=0x1F45,
+ },
+ [0x1F48]={
+ category="lu",
+ contextname="greekOmicronpsili",
+ description="GREEK CAPITAL LETTER OMICRON WITH PSILI",
+ direction="l",
+ lccode=0x1F40,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x039F, 0x0313 },
+ unicodeslot=0x1F48,
+ },
+ [0x1F49]={
+ category="lu",
+ contextname="greekOmicrondasia",
+ description="GREEK CAPITAL LETTER OMICRON WITH DASIA",
+ direction="l",
+ lccode=0x1F41,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x039F, 0x0314 },
+ unicodeslot=0x1F49,
+ },
+ [0x1F4A]={
+ category="lu",
+ contextname="greekOmicronpsilivaria",
+ description="GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA",
+ direction="l",
+ lccode=0x1F42,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x1F48, 0x0300 },
+ unicodeslot=0x1F4A,
+ },
+ [0x1F4B]={
+ category="lu",
+ contextname="greekOmicrondasiavaria",
+ description="GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA",
+ direction="l",
+ lccode=0x1F43,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x1F49, 0x0300 },
+ unicodeslot=0x1F4B,
+ },
+ [0x1F4C]={
+ category="lu",
+ contextname="greekOmicronpsilitonos",
+ description="GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA",
+ direction="l",
+ lccode=0x1F44,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x1F48, 0x0301 },
+ unicodeslot=0x1F4C,
+ },
+ [0x1F4D]={
+ category="lu",
+ contextname="greekOmicrondasiatonos",
+ description="GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA",
+ direction="l",
+ lccode=0x1F45,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x1F49, 0x0301 },
+ unicodeslot=0x1F4D,
+ },
+ [0x1F50]={
+ category="ll",
+ contextname="greekupsilonpsili",
+ description="GREEK SMALL LETTER UPSILON WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0313 },
+ unicodeslot=0x1F50,
+ },
+ [0x1F51]={
+ category="ll",
+ contextname="greekupsilondasia",
+ description="GREEK SMALL LETTER UPSILON WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0314 },
+ uccode=0x1F59,
+ unicodeslot=0x1F51,
+ },
+ [0x1F52]={
+ category="ll",
+ contextname="greekupsilonpsilivaria",
+ description="GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x1F50, 0x0300 },
+ unicodeslot=0x1F52,
+ },
+ [0x1F53]={
+ category="ll",
+ contextname="greekupsilondasiavaria",
+ description="GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x1F51, 0x0300 },
+ uccode=0x1F5B,
+ unicodeslot=0x1F53,
+ },
+ [0x1F54]={
+ category="ll",
+ contextname="greekupsilonpsilitonos",
+ description="GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x1F50, 0x0301 },
+ unicodeslot=0x1F54,
+ },
+ [0x1F55]={
+ category="ll",
+ contextname="greekupsilondasiatonos",
+ description="GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x1F51, 0x0301 },
+ uccode=0x1F5D,
+ unicodeslot=0x1F55,
+ },
+ [0x1F56]={
+ category="ll",
+ contextname="greekupsilonpsiliperispomeni",
+ description="GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x1F50, 0x0342 },
+ unicodeslot=0x1F56,
+ },
+ [0x1F57]={
+ category="ll",
+ contextname="greekupsilondasiaperispomeni",
+ description="GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x1F51, 0x0342 },
+ uccode=0x1F5F,
+ unicodeslot=0x1F57,
+ },
+ [0x1F59]={
+ category="lu",
+ contextname="greekUpsilondasia",
+ description="GREEK CAPITAL LETTER UPSILON WITH DASIA",
+ direction="l",
+ lccode=0x1F51,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x03A5, 0x0314 },
+ unicodeslot=0x1F59,
+ },
+ [0x1F5B]={
+ category="lu",
+ contextname="greekUpsilondasiavaria",
+ description="GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA",
+ direction="l",
+ lccode=0x1F53,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x1F59, 0x0300 },
+ unicodeslot=0x1F5B,
+ },
+ [0x1F5D]={
+ category="lu",
+ contextname="greekUpsilondasiatonos",
+ description="GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA",
+ direction="l",
+ lccode=0x1F55,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x1F59, 0x0301 },
+ unicodeslot=0x1F5D,
+ },
+ [0x1F5F]={
+ category="lu",
+ contextname="greekUpsilondasiaperispomeni",
+ description="GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F57,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x1F59, 0x0342 },
+ unicodeslot=0x1F5F,
+ },
+ [0x1F60]={
+ category="ll",
+ contextname="greekomegapsili",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03C9, 0x0313 },
+ uccode=0x1F68,
+ unicodeslot=0x1F60,
+ },
+ [0x1F61]={
+ category="ll",
+ contextname="greekomegadasia",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03C9, 0x0314 },
+ uccode=0x1F69,
+ unicodeslot=0x1F61,
+ },
+ [0x1F62]={
+ category="ll",
+ contextname="greekomegapsilivaria",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F60, 0x0300 },
+ uccode=0x1F6A,
+ unicodeslot=0x1F62,
+ },
+ [0x1F63]={
+ category="ll",
+ contextname="greekomegadasiavaria",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F61, 0x0300 },
+ uccode=0x1F6B,
+ unicodeslot=0x1F63,
+ },
+ [0x1F64]={
+ category="ll",
+ contextname="greekomegapsilitonos",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F60, 0x0301 },
+ uccode=0x1F6C,
+ unicodeslot=0x1F64,
+ },
+ [0x1F65]={
+ category="ll",
+ contextname="greekomegadasiatonos",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F61, 0x0301 },
+ uccode=0x1F6D,
+ unicodeslot=0x1F65,
+ },
+ [0x1F66]={
+ category="ll",
+ contextname="greekomegapsiliperispomeni",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F60, 0x0342 },
+ uccode=0x1F6E,
+ unicodeslot=0x1F66,
+ },
+ [0x1F67]={
+ category="ll",
+ contextname="greekomegadasiaperispomeni",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F61, 0x0342 },
+ uccode=0x1F6F,
+ unicodeslot=0x1F67,
+ },
+ [0x1F68]={
+ category="lu",
+ contextname="greekOmegapsili",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI",
+ direction="l",
+ lccode=0x1F60,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x03A9, 0x0313 },
+ unicodeslot=0x1F68,
+ },
+ [0x1F69]={
+ category="lu",
+ contextname="greekOmegadasia",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA",
+ direction="l",
+ lccode=0x1F61,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x03A9, 0x0314 },
+ unicodeslot=0x1F69,
+ },
+ [0x1F6A]={
+ category="lu",
+ contextname="greekOmegapsilivaria",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA",
+ direction="l",
+ lccode=0x1F62,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F68, 0x0300 },
+ unicodeslot=0x1F6A,
+ },
+ [0x1F6B]={
+ category="lu",
+ contextname="greekOmegadasiavaria",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA",
+ direction="l",
+ lccode=0x1F63,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F69, 0x0300 },
+ unicodeslot=0x1F6B,
+ },
+ [0x1F6C]={
+ category="lu",
+ contextname="greekOmegapsilitonos",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA",
+ direction="l",
+ lccode=0x1F64,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F68, 0x0301 },
+ unicodeslot=0x1F6C,
+ },
+ [0x1F6D]={
+ category="lu",
+ contextname="greekOmegadasiatonos",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA",
+ direction="l",
+ lccode=0x1F65,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F69, 0x0301 },
+ unicodeslot=0x1F6D,
+ },
+ [0x1F6E]={
+ category="lu",
+ contextname="greekOmegapsiliperispomeni",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F66,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F68, 0x0342 },
+ unicodeslot=0x1F6E,
+ },
+ [0x1F6F]={
+ category="lu",
+ contextname="greekOmegadasiaperispomeni",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI",
+ direction="l",
+ lccode=0x1F67,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F69, 0x0342 },
+ unicodeslot=0x1F6F,
+ },
+ [0x1F70]={
+ category="ll",
+ contextname="greekalphavaria",
+ description="GREEK SMALL LETTER ALPHA WITH VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0300 },
+ uccode=0x1FBA,
+ unicodeslot=0x1F70,
+ },
+ [0x1F71]={
+ category="ll",
+ contextname="greekalphaoxia",
+ description="GREEK SMALL LETTER ALPHA WITH OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03AC },
+ uccode=0x1FBB,
+ unicodeslot=0x1F71,
+ },
+ [0x1F72]={
+ category="ll",
+ contextname="greekepsilonvaria",
+ description="GREEK SMALL LETTER EPSILON WITH VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x03B5, 0x0300 },
+ uccode=0x1FC8,
+ unicodeslot=0x1F72,
+ },
+ [0x1F73]={
+ category="ll",
+ contextname="greekepsilonoxia",
+ description="GREEK SMALL LETTER EPSILON WITH OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B5,
+ specials={ "char", 0x03AD },
+ uccode=0x1FC9,
+ unicodeslot=0x1F73,
+ },
+ [0x1F74]={
+ category="ll",
+ contextname="greeketavaria",
+ description="GREEK SMALL LETTER ETA WITH VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03B7, 0x0300 },
+ uccode=0x1FCA,
+ unicodeslot=0x1F74,
+ },
+ [0x1F75]={
+ category="ll",
+ contextname="greeketaoxia",
+ description="GREEK SMALL LETTER ETA WITH OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03AE },
+ uccode=0x1FCB,
+ unicodeslot=0x1F75,
+ },
+ [0x1F76]={
+ category="ll",
+ contextname="greekiotavaria",
+ description="GREEK SMALL LETTER IOTA WITH VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0300 },
+ uccode=0x1FDA,
+ unicodeslot=0x1F76,
+ },
+ [0x1F77]={
+ category="ll",
+ contextname="greekiotaoxia",
+ description="GREEK SMALL LETTER IOTA WITH OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03AF },
+ uccode=0x1FDB,
+ unicodeslot=0x1F77,
+ },
+ [0x1F78]={
+ category="ll",
+ contextname="greekomicronvaria",
+ description="GREEK SMALL LETTER OMICRON WITH VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x03BF, 0x0300 },
+ uccode=0x1FF8,
+ unicodeslot=0x1F78,
+ },
+ [0x1F79]={
+ category="ll",
+ contextname="greekomicronoxia",
+ description="GREEK SMALL LETTER OMICRON WITH OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03BF,
+ specials={ "char", 0x03CC },
+ uccode=0x1FF9,
+ unicodeslot=0x1F79,
+ },
+ [0x1F7A]={
+ category="ll",
+ contextname="greekupsilonvaria",
+ description="GREEK SMALL LETTER UPSILON WITH VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0300 },
+ uccode=0x1FEA,
+ unicodeslot=0x1F7A,
+ },
+ [0x1F7B]={
+ category="ll",
+ contextname="greekupsilonoxia",
+ description="GREEK SMALL LETTER UPSILON WITH OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03CD },
+ uccode=0x1FEB,
+ unicodeslot=0x1F7B,
+ },
+ [0x1F7C]={
+ category="ll",
+ contextname="greekomegavaria",
+ description="GREEK SMALL LETTER OMEGA WITH VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03C9, 0x0300 },
+ uccode=0x1FFA,
+ unicodeslot=0x1F7C,
+ },
+ [0x1F7D]={
+ category="ll",
+ contextname="greekomegaoxia",
+ description="GREEK SMALL LETTER OMEGA WITH OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03CE },
+ uccode=0x1FFB,
+ unicodeslot=0x1F7D,
+ },
+ [0x1F80]={
+ category="ll",
+ contextname="greekalphaiotasubpsili",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F00, 0x0345 },
+ uccode=0x1F88,
+ unicodeslot=0x1F80,
+ },
+ [0x1F81]={
+ category="ll",
+ contextname="greekalphaiotasubdasia",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F01, 0x0345 },
+ uccode=0x1F89,
+ unicodeslot=0x1F81,
+ },
+ [0x1F82]={
+ category="ll",
+ contextname="greekalphaiotasubpsilivaria",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F02, 0x0345 },
+ uccode=0x1F8A,
+ unicodeslot=0x1F82,
+ },
+ [0x1F83]={
+ category="ll",
+ contextname="greekalphaiotasubdasiavaria",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F03, 0x0345 },
+ uccode=0x1F8B,
+ unicodeslot=0x1F83,
+ },
+ [0x1F84]={
+ category="ll",
+ contextname="greekalphaiotasubpsilitonos",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F04, 0x0345 },
+ uccode=0x1F8C,
+ unicodeslot=0x1F84,
+ },
+ [0x1F85]={
+ category="ll",
+ contextname="greekalphaiotasubdasiatonos",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F05, 0x0345 },
+ uccode=0x1F8D,
+ unicodeslot=0x1F85,
+ },
+ [0x1F86]={
+ category="ll",
+ contextname="greekalphaiotasubpsiliperispomeni",
+ description="GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F06, 0x0345 },
+ uccode=0x1F8E,
+ unicodeslot=0x1F86,
+ },
+ [0x1F87]={
+ category="ll",
+ contextname="greekalphaiotasubdasiaperispomeni",
+ description="GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F07, 0x0345 },
+ uccode=0x1F8F,
+ unicodeslot=0x1F87,
+ },
+ [0x1F88]={
+ category="lt",
+ contextname="greekAlphaiotasubpsili",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F80,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F08, 0x0345 },
+ unicodeslot=0x1F88,
+ },
+ [0x1F89]={
+ category="lt",
+ contextname="greekAlphaiotasubdasia",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F81,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F09, 0x0345 },
+ unicodeslot=0x1F89,
+ },
+ [0x1F8A]={
+ category="lt",
+ contextname="greekAlphaiotasubpsilivaria",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F82,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F0A, 0x0345 },
+ unicodeslot=0x1F8A,
+ },
+ [0x1F8B]={
+ category="lt",
+ contextname="greekAlphaiotasubdasiavaria",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F83,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F0B, 0x0345 },
+ unicodeslot=0x1F8B,
+ },
+ [0x1F8C]={
+ category="lt",
+ contextname="greekAlphaiotasubpsilitonos",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F84,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F0C, 0x0345 },
+ unicodeslot=0x1F8C,
+ },
+ [0x1F8D]={
+ category="lt",
+ contextname="greekAlphaiotasubdasiatonos",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F85,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F0D, 0x0345 },
+ unicodeslot=0x1F8D,
+ },
+ [0x1F8E]={
+ category="lt",
+ contextname="greekAlphaiotasubpsiliperispomeni",
+ description="GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F86,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F0E, 0x0345 },
+ unicodeslot=0x1F8E,
+ },
+ [0x1F8F]={
+ category="lt",
+ contextname="greekAlphaiotasubdasiaperispomeni",
+ description="GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F87,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x1F0F, 0x0345 },
+ unicodeslot=0x1F8F,
+ },
+ [0x1F90]={
+ category="ll",
+ contextname="greeketaiotasubpsili",
+ description="GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F20, 0x0345 },
+ uccode=0x1F98,
+ unicodeslot=0x1F90,
+ },
+ [0x1F91]={
+ category="ll",
+ contextname="greeketaiotasubdasia",
+ description="GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F21, 0x0345 },
+ uccode=0x1F99,
+ unicodeslot=0x1F91,
+ },
+ [0x1F92]={
+ category="ll",
+ contextname="greeketaiotasubpsilivaria",
+ description="GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F22, 0x0345 },
+ uccode=0x1F9A,
+ unicodeslot=0x1F92,
+ },
+ [0x1F93]={
+ category="ll",
+ contextname="greeketaiotasubdasiavaria",
+ description="GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F23, 0x0345 },
+ uccode=0x1F9B,
+ unicodeslot=0x1F93,
+ },
+ [0x1F94]={
+ category="ll",
+ contextname="greeketaiotasubpsilitonos",
+ description="GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F24, 0x0345 },
+ uccode=0x1F9C,
+ unicodeslot=0x1F94,
+ },
+ [0x1F95]={
+ category="ll",
+ contextname="greeketaiotasubdasiatonos",
+ description="GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F25, 0x0345 },
+ uccode=0x1F9D,
+ unicodeslot=0x1F95,
+ },
+ [0x1F96]={
+ category="ll",
+ contextname="greeketaiotasubpsiliperispomeni",
+ description="GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F26, 0x0345 },
+ uccode=0x1F9E,
+ unicodeslot=0x1F96,
+ },
+ [0x1F97]={
+ category="ll",
+ contextname="greeketaiotasubdasiaperispomeni",
+ description="GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F27, 0x0345 },
+ uccode=0x1F9F,
+ unicodeslot=0x1F97,
+ },
+ [0x1F98]={
+ category="lt",
+ contextname="greekEtaiotasubpsili",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F90,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F28, 0x0345 },
+ unicodeslot=0x1F98,
+ },
+ [0x1F99]={
+ category="lt",
+ contextname="greekEtaiotasubdasia",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F91,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F29, 0x0345 },
+ unicodeslot=0x1F99,
+ },
+ [0x1F9A]={
+ category="lt",
+ contextname="greekEtaiotasubpsilivaria",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F92,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F2A, 0x0345 },
+ unicodeslot=0x1F9A,
+ },
+ [0x1F9B]={
+ category="lt",
+ contextname="greekEtaiotasubdasiavaria",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F93,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F2B, 0x0345 },
+ unicodeslot=0x1F9B,
+ },
+ [0x1F9C]={
+ category="lt",
+ contextname="greekEtaiotasubpsilitonos",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F94,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F2C, 0x0345 },
+ unicodeslot=0x1F9C,
+ },
+ [0x1F9D]={
+ category="lt",
+ contextname="greekEtaiotasubdasiatonos",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F95,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F2D, 0x0345 },
+ unicodeslot=0x1F9D,
+ },
+ [0x1F9E]={
+ category="lt",
+ contextname="greekEtaiotasubpsiliperispomeni",
+ description="GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F96,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F2E, 0x0345 },
+ unicodeslot=0x1F9E,
+ },
+ [0x1F9F]={
+ category="lt",
+ contextname="greekEtaiotasubdasiaperispomeni",
+ description="GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1F97,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x1F2F, 0x0345 },
+ unicodeslot=0x1F9F,
+ },
+ [0x1FA0]={
+ category="ll",
+ contextname="greekomegaiotasubpsili",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F60, 0x0345 },
+ uccode=0x1FA8,
+ unicodeslot=0x1FA0,
+ },
+ [0x1FA1]={
+ category="ll",
+ contextname="greekomegaiotasubdasia",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F61, 0x0345 },
+ uccode=0x1FA9,
+ unicodeslot=0x1FA1,
+ },
+ [0x1FA2]={
+ category="ll",
+ contextname="greekomegaiotasubpsilivaria",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F62, 0x0345 },
+ uccode=0x1FAA,
+ unicodeslot=0x1FA2,
+ },
+ [0x1FA3]={
+ category="ll",
+ contextname="greekomegaiotasubdasiavaria",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F63, 0x0345 },
+ uccode=0x1FAB,
+ unicodeslot=0x1FA3,
+ },
+ [0x1FA4]={
+ category="ll",
+ contextname="greekomegaiotasubpsilitonos",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F64, 0x0345 },
+ uccode=0x1FAC,
+ unicodeslot=0x1FA4,
+ },
+ [0x1FA5]={
+ category="ll",
+ contextname="greekomegaiotasubdasiatonos",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F65, 0x0345 },
+ uccode=0x1FAD,
+ unicodeslot=0x1FA5,
+ },
+ [0x1FA6]={
+ category="ll",
+ contextname="greekomegaiotasubpsiliperispomeni",
+ description="GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F66, 0x0345 },
+ uccode=0x1FAE,
+ unicodeslot=0x1FA6,
+ },
+ [0x1FA7]={
+ category="ll",
+ contextname="greekomegaiotasubdasiaperispomeni",
+ description="GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F67, 0x0345 },
+ uccode=0x1FAF,
+ unicodeslot=0x1FA7,
+ },
+ [0x1FA8]={
+ category="lt",
+ contextname="greekOmegaiotasubpsili",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA0,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F68, 0x0345 },
+ unicodeslot=0x1FA8,
+ },
+ [0x1FA9]={
+ category="lt",
+ contextname="greekOmegaiotasubdasia",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA1,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F69, 0x0345 },
+ unicodeslot=0x1FA9,
+ },
+ [0x1FAA]={
+ category="lt",
+ contextname="greekOmegaiotasubpsilivaria",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA2,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F6A, 0x0345 },
+ unicodeslot=0x1FAA,
+ },
+ [0x1FAB]={
+ category="lt",
+ contextname="greekOmegaiotasubdasiavaria",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA3,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F6B, 0x0345 },
+ unicodeslot=0x1FAB,
+ },
+ [0x1FAC]={
+ category="lt",
+ contextname="greekOmegaiotasubpsilitonos",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA4,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F6C, 0x0345 },
+ unicodeslot=0x1FAC,
+ },
+ [0x1FAD]={
+ category="lt",
+ contextname="greekOmegaiotasubdasiatonos",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA5,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F6D, 0x0345 },
+ unicodeslot=0x1FAD,
+ },
+ [0x1FAE]={
+ category="lt",
+ contextname="greekOmegaiotasubpsiliperispomeni",
+ description="GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA6,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F6E, 0x0345 },
+ unicodeslot=0x1FAE,
+ },
+ [0x1FAF]={
+ category="lt",
+ contextname="greekOmegaiotasubdasiaperispomeni",
+ description="GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FA7,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x1F6F, 0x0345 },
+ unicodeslot=0x1FAF,
+ },
+ [0x1FB0]={
+ category="ll",
+ contextname="greekalphavrachy",
+ description="GREEK SMALL LETTER ALPHA WITH VRACHY",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0306 },
+ uccode=0x1FB8,
+ unicodeslot=0x1FB0,
+ },
+ [0x1FB1]={
+ category="ll",
+ contextname="greekalphamacron",
+ description="GREEK SMALL LETTER ALPHA WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0304 },
+ uccode=0x1FB9,
+ unicodeslot=0x1FB1,
+ },
+ [0x1FB2]={
+ category="ll",
+ contextname="greekalphaiotasubvaria",
+ description="GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1F70, 0x0345 },
+ unicodeslot=0x1FB2,
+ },
+ [0x1FB3]={
+ category="ll",
+ contextname="greekalphaiotasub",
+ description="GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0345 },
+ uccode=0x1FBC,
+ unicodeslot=0x1FB3,
+ },
+ [0x1FB4]={
+ category="ll",
+ contextname="greekalphaiotasubtonos",
+ description="GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03AC, 0x0345 },
+ unicodeslot=0x1FB4,
+ },
+ [0x1FB6]={
+ category="ll",
+ contextname="greekalphaperispomeni",
+ description="GREEK SMALL LETTER ALPHA WITH PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x03B1, 0x0342 },
+ unicodeslot=0x1FB6,
+ },
+ [0x1FB7]={
+ category="ll",
+ contextname="greekalphaiotasubperispomeni",
+ description="GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B1,
+ specials={ "char", 0x1FB6, 0x0345 },
+ unicodeslot=0x1FB7,
+ },
+ [0x1FB8]={
+ category="lu",
+ contextname="greekAlphavrachy",
+ description="GREEK CAPITAL LETTER ALPHA WITH VRACHY",
+ direction="l",
+ lccode=0x1FB0,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0391, 0x0306 },
+ unicodeslot=0x1FB8,
+ },
+ [0x1FB9]={
+ category="lu",
+ contextname="greekAlphamacron",
+ description="GREEK CAPITAL LETTER ALPHA WITH MACRON",
+ direction="l",
+ lccode=0x1FB1,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0391, 0x0304 },
+ unicodeslot=0x1FB9,
+ },
+ [0x1FBA]={
+ category="lu",
+ contextname="greekAlphavaria",
+ description="GREEK CAPITAL LETTER ALPHA WITH VARIA",
+ direction="l",
+ lccode=0x1F70,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0391, 0x0300 },
+ unicodeslot=0x1FBA,
+ },
+ [0x1FBB]={
+ category="lu",
+ contextname="greekAlphatonos",
+ description="GREEK CAPITAL LETTER ALPHA WITH OXIA",
+ direction="l",
+ lccode=0x1F71,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0386 },
+ unicodeslot=0x1FBB,
+ },
+ [0x1FBC]={
+ category="lt",
+ contextname="greekAlphaiotasub",
+ description="GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FB3,
+ linebreak="al",
+ shcode=0x0391,
+ specials={ "char", 0x0391, 0x0345 },
+ unicodeslot=0x1FBC,
+ },
+ [0x1FBD]={
+ category="sk",
+ contextname="greekCoronis",
+ description="GREEK KORONIS",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0313 },
+ unicodeslot=0x1FBD,
+ },
+ [0x1FBE]={
+ category="ll",
+ contextname="greekprosgegrammeni",
+ description="GREEK PROSGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x03B9 },
+ uccode=0x0399,
+ unicodeslot=0x1FBE,
+ },
+ [0x1FBF]={
+ category="sk",
+ contextname="greekpsili",
+ description="GREEK PSILI",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0313 },
+ unicodeslot=0x1FBF,
+ },
+ [0x1FC0]={
+ category="sk",
+ contextname="greekperispomeni",
+ description="GREEK PERISPOMENI",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0342 },
+ unicodeslot=0x1FC0,
+ },
+ [0x1FC1]={
+ category="sk",
+ contextname="greekdialytikaperispomeni",
+ description="GREEK DIALYTIKA AND PERISPOMENI",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x00A8, 0x0342 },
+ unicodeslot=0x1FC1,
+ },
+ [0x1FC2]={
+ category="ll",
+ contextname="greeketaiotasubvaria",
+ description="GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1F74, 0x0345 },
+ unicodeslot=0x1FC2,
+ },
+ [0x1FC3]={
+ category="ll",
+ contextname="greeketaiotasub",
+ description="GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03B7, 0x0345 },
+ uccode=0x1FCC,
+ unicodeslot=0x1FC3,
+ },
+ [0x1FC4]={
+ category="ll",
+ contextname="greeketaiotasubtonos",
+ description="GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03AE, 0x0345 },
+ unicodeslot=0x1FC4,
+ },
+ [0x1FC6]={
+ category="ll",
+ contextname="greeketaperispomeni",
+ description="GREEK SMALL LETTER ETA WITH PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x03B7, 0x0342 },
+ unicodeslot=0x1FC6,
+ },
+ [0x1FC7]={
+ category="ll",
+ contextname="greeketaiotasubperispomeni",
+ description="GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B7,
+ specials={ "char", 0x1FC6, 0x0345 },
+ unicodeslot=0x1FC7,
+ },
+ [0x1FC8]={
+ category="lu",
+ contextname="greekEpsilonvaria",
+ description="GREEK CAPITAL LETTER EPSILON WITH VARIA",
+ direction="l",
+ lccode=0x1F72,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x0395, 0x0300 },
+ unicodeslot=0x1FC8,
+ },
+ [0x1FC9]={
+ category="lu",
+ contextname="greekEpsilontonos",
+ description="GREEK CAPITAL LETTER EPSILON WITH OXIA",
+ direction="l",
+ lccode=0x1F73,
+ linebreak="al",
+ shcode=0x0395,
+ specials={ "char", 0x0388 },
+ unicodeslot=0x1FC9,
+ },
+ [0x1FCA]={
+ category="lu",
+ contextname="greekEtavaria",
+ description="GREEK CAPITAL LETTER ETA WITH VARIA",
+ direction="l",
+ lccode=0x1F74,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x0397, 0x0300 },
+ unicodeslot=0x1FCA,
+ },
+ [0x1FCB]={
+ category="lu",
+ contextname="greekEtatonos",
+ description="GREEK CAPITAL LETTER ETA WITH OXIA",
+ direction="l",
+ lccode=0x1F75,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x0389 },
+ unicodeslot=0x1FCB,
+ },
+ [0x1FCC]={
+ category="lt",
+ contextname="greekEtaiotasub",
+ description="GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FC3,
+ linebreak="al",
+ shcode=0x0397,
+ specials={ "char", 0x0397, 0x0345 },
+ unicodeslot=0x1FCC,
+ },
+ [0x1FCD]={
+ category="sk",
+ contextname="greekpsilivaria",
+ description="GREEK PSILI AND VARIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x1FBF, 0x0300 },
+ unicodeslot=0x1FCD,
+ },
+ [0x1FCE]={
+ category="sk",
+ contextname="greekpsilitonos",
+ description="GREEK PSILI AND OXIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x1FBF, 0x0301 },
+ unicodeslot=0x1FCE,
+ },
+ [0x1FCF]={
+ category="sk",
+ contextname="greekpsiliperispomeni",
+ description="GREEK PSILI AND PERISPOMENI",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x1FBF, 0x0342 },
+ unicodeslot=0x1FCF,
+ },
+ [0x1FD0]={
+ category="ll",
+ contextname="greekiotavrachy",
+ description="GREEK SMALL LETTER IOTA WITH VRACHY",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0306 },
+ uccode=0x1FD8,
+ unicodeslot=0x1FD0,
+ },
+ [0x1FD1]={
+ category="ll",
+ contextname="greekiotamacron",
+ description="GREEK SMALL LETTER IOTA WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0304 },
+ uccode=0x1FD9,
+ unicodeslot=0x1FD1,
+ },
+ [0x1FD2]={
+ category="ll",
+ contextname="greekiotadialytikavaria",
+ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03CA, 0x0300 },
+ unicodeslot=0x1FD2,
+ },
+ [0x1FD3]={
+ category="ll",
+ contextname="greekiotadialytikatonos",
+ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x0390 },
+ unicodeslot=0x1FD3,
+ },
+ [0x1FD6]={
+ category="ll",
+ contextname="greekiotaperispomeni",
+ description="GREEK SMALL LETTER IOTA WITH PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03B9, 0x0342 },
+ unicodeslot=0x1FD6,
+ },
+ [0x1FD7]={
+ category="ll",
+ contextname="greekiotadialytikaperispomeni",
+ description="GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03B9,
+ specials={ "char", 0x03CA, 0x0342 },
+ unicodeslot=0x1FD7,
+ },
+ [0x1FD8]={
+ category="lu",
+ contextname="greekIotavrachy",
+ description="GREEK CAPITAL LETTER IOTA WITH VRACHY",
+ direction="l",
+ lccode=0x1FD0,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x0399, 0x0306 },
+ unicodeslot=0x1FD8,
+ },
+ [0x1FD9]={
+ category="lu",
+ contextname="greekIotamacron",
+ description="GREEK CAPITAL LETTER IOTA WITH MACRON",
+ direction="l",
+ lccode=0x1FD1,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x0399, 0x0304 },
+ unicodeslot=0x1FD9,
+ },
+ [0x1FDA]={
+ category="lu",
+ contextname="greekIotavaria",
+ description="GREEK CAPITAL LETTER IOTA WITH VARIA",
+ direction="l",
+ lccode=0x1F76,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x0399, 0x0300 },
+ unicodeslot=0x1FDA,
+ },
+ [0x1FDB]={
+ category="lu",
+ contextname="greekIotatonos",
+ description="GREEK CAPITAL LETTER IOTA WITH OXIA",
+ direction="l",
+ lccode=0x1F77,
+ linebreak="al",
+ shcode=0x0399,
+ specials={ "char", 0x038A },
+ unicodeslot=0x1FDB,
+ },
+ [0x1FDD]={
+ category="sk",
+ contextname="greekdasiavaria",
+ description="GREEK DASIA AND VARIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x1FFE, 0x0300 },
+ unicodeslot=0x1FDD,
+ },
+ [0x1FDE]={
+ category="sk",
+ contextname="greekdasiatonos",
+ description="GREEK DASIA AND OXIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x1FFE, 0x0301 },
+ unicodeslot=0x1FDE,
+ },
+ [0x1FDF]={
+ category="sk",
+ contextname="greekdasiaperispomeni",
+ description="GREEK DASIA AND PERISPOMENI",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x1FFE, 0x0342 },
+ unicodeslot=0x1FDF,
+ },
+ [0x1FE0]={
+ category="ll",
+ contextname="greekupsilonvrachy",
+ description="GREEK SMALL LETTER UPSILON WITH VRACHY",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0306 },
+ uccode=0x1FE8,
+ unicodeslot=0x1FE0,
+ },
+ [0x1FE1]={
+ category="ll",
+ contextname="greekupsilonmacron",
+ description="GREEK SMALL LETTER UPSILON WITH MACRON",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0304 },
+ uccode=0x1FE9,
+ unicodeslot=0x1FE1,
+ },
+ [0x1FE2]={
+ category="ll",
+ contextname="greekupsilondialytikavaria",
+ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03CB, 0x0300 },
+ unicodeslot=0x1FE2,
+ },
+ [0x1FE3]={
+ category="ll",
+ contextname="greekupsilondialytikatonos",
+ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03B0 },
+ unicodeslot=0x1FE3,
+ },
+ [0x1FE4]={
+ category="ll",
+ contextname="greekrhopsili",
+ description="GREEK SMALL LETTER RHO WITH PSILI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C1,
+ specials={ "char", 0x03C1, 0x0313 },
+ unicodeslot=0x1FE4,
+ },
+ [0x1FE5]={
+ category="ll",
+ contextname="greekrhodasia",
+ description="GREEK SMALL LETTER RHO WITH DASIA",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C1,
+ specials={ "char", 0x03C1, 0x0314 },
+ uccode=0x1FEC,
+ unicodeslot=0x1FE5,
+ },
+ [0x1FE6]={
+ category="ll",
+ contextname="greekupsilonperispomeni",
+ description="GREEK SMALL LETTER UPSILON WITH PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03C5, 0x0342 },
+ unicodeslot=0x1FE6,
+ },
+ [0x1FE7]={
+ category="ll",
+ contextname="greekupsilondialytikaperispomeni",
+ description="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C5,
+ specials={ "char", 0x03CB, 0x0342 },
+ unicodeslot=0x1FE7,
+ },
+ [0x1FE8]={
+ category="lu",
+ contextname="greekUpsilonvrachy",
+ description="GREEK CAPITAL LETTER UPSILON WITH VRACHY",
+ direction="l",
+ lccode=0x1FE0,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x03A5, 0x0306 },
+ unicodeslot=0x1FE8,
+ },
+ [0x1FE9]={
+ category="lu",
+ contextname="greekUpsilonmacron",
+ description="GREEK CAPITAL LETTER UPSILON WITH MACRON",
+ direction="l",
+ lccode=0x1FE1,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x03A5, 0x0304 },
+ unicodeslot=0x1FE9,
+ },
+ [0x1FEA]={
+ category="lu",
+ contextname="greekUpsilonvaria",
+ description="GREEK CAPITAL LETTER UPSILON WITH VARIA",
+ direction="l",
+ lccode=0x1F7A,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x03A5, 0x0300 },
+ unicodeslot=0x1FEA,
+ },
+ [0x1FEB]={
+ category="lu",
+ contextname="greekUpsilontonos",
+ description="GREEK CAPITAL LETTER UPSILON WITH OXIA",
+ direction="l",
+ lccode=0x1F7B,
+ linebreak="al",
+ shcode=0x03A5,
+ specials={ "char", 0x038E },
+ unicodeslot=0x1FEB,
+ },
+ [0x1FEC]={
+ category="lu",
+ contextname="greekRhodasia",
+ description="GREEK CAPITAL LETTER RHO WITH DASIA",
+ direction="l",
+ lccode=0x1FE5,
+ linebreak="al",
+ shcode=0x03A1,
+ specials={ "char", 0x03A1, 0x0314 },
+ unicodeslot=0x1FEC,
+ },
+ [0x1FED]={
+ category="sk",
+ contextname="greekdialytikavaria",
+ description="GREEK DIALYTIKA AND VARIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x00A8, 0x0300 },
+ unicodeslot=0x1FED,
+ },
+ [0x1FEE]={
+ category="sk",
+ contextname="greekdialytikatonos",
+ description="GREEK DIALYTIKA AND OXIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x0385 },
+ unicodeslot=0x1FEE,
+ },
+ [0x1FEF]={
+ category="sk",
+ contextname="greekvaria",
+ description="GREEK VARIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x0060 },
+ unicodeslot=0x1FEF,
+ },
+ [0x1FF2]={
+ category="ll",
+ contextname="greekomegaiotasubvaria",
+ description="GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1F7C, 0x0345 },
+ unicodeslot=0x1FF2,
+ },
+ [0x1FF3]={
+ category="ll",
+ contextname="greekomegaiotasub",
+ description="GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03C9, 0x0345 },
+ uccode=0x1FFC,
+ unicodeslot=0x1FF3,
+ },
+ [0x1FF4]={
+ category="ll",
+ contextname="greekomegaiotasubtonos",
+ description="GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03CE, 0x0345 },
+ unicodeslot=0x1FF4,
+ },
+ [0x1FF6]={
+ category="ll",
+ contextname="greekomegaperispomeni",
+ description="GREEK SMALL LETTER OMEGA WITH PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x03C9, 0x0342 },
+ unicodeslot=0x1FF6,
+ },
+ [0x1FF7]={
+ category="ll",
+ contextname="greekomegaiotasubperispomeni",
+ description="GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI",
+ direction="l",
+ linebreak="al",
+ shcode=0x03C9,
+ specials={ "char", 0x1FF6, 0x0345 },
+ unicodeslot=0x1FF7,
+ },
+ [0x1FF8]={
+ category="lu",
+ contextname="greekOmicronvaria",
+ description="GREEK CAPITAL LETTER OMICRON WITH VARIA",
+ direction="l",
+ lccode=0x1F78,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x039F, 0x0300 },
+ unicodeslot=0x1FF8,
+ },
+ [0x1FF9]={
+ category="lu",
+ contextname="greekOmicrontonos",
+ description="GREEK CAPITAL LETTER OMICRON WITH OXIA",
+ direction="l",
+ lccode=0x1F79,
+ linebreak="al",
+ shcode=0x039F,
+ specials={ "char", 0x038C },
+ unicodeslot=0x1FF9,
+ },
+ [0x1FFA]={
+ category="lu",
+ contextname="greekOmegavaria",
+ description="GREEK CAPITAL LETTER OMEGA WITH VARIA",
+ direction="l",
+ lccode=0x1F7C,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x03A9, 0x0300 },
+ unicodeslot=0x1FFA,
+ },
+ [0x1FFB]={
+ category="lu",
+ contextname="greekOmegatonos",
+ description="GREEK CAPITAL LETTER OMEGA WITH OXIA",
+ direction="l",
+ lccode=0x1F7D,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x038F },
+ unicodeslot=0x1FFB,
+ },
+ [0x1FFC]={
+ category="lt",
+ contextname="greekOmegaiotasub",
+ description="GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI",
+ direction="l",
+ lccode=0x1FF3,
+ linebreak="al",
+ shcode=0x03A9,
+ specials={ "char", 0x03A9, 0x0345 },
+ unicodeslot=0x1FFC,
+ },
+ [0x1FFD]={
+ category="sk",
+ contextname="greekoxia",
+ description="GREEK OXIA",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x00B4 },
+ unicodeslot=0x1FFD,
+ },
+ [0x1FFE]={
+ category="sk",
+ contextname="greekdasia",
+ description="GREEK DASIA",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0314 },
+ unicodeslot=0x1FFE,
+ },
+ [0x2000]={
+ category="zs",
+ description="EN QUAD",
+ direction="ws",
+ linebreak="ba",
+ specials={ "char", 0x2002 },
+ unicodeslot=0x2000,
+ },
+ [0x2001]={
+ category="zs",
+ description="EM QUAD",
+ direction="ws",
+ linebreak="ba",
+ specials={ "char", 0x2003 },
+ unicodeslot=0x2001,
+ },
+ [0x2002]={
+ category="zs",
+ contextname="enspace",
+ description="EN SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x2002,
+ },
+ [0x2003]={
+ category="zs",
+ contextname="emspace",
+ description="EM SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x2003,
+ },
+ [0x2004]={
+ category="zs",
+ contextname="threeperemspace",
+ description="THREE-PER-EM SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x2004,
+ },
+ [0x2005]={
+ category="zs",
+ contextname="fourperemspace",
+ description="FOUR-PER-EM SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x2005,
+ },
+ [0x2006]={
+ category="zs",
+ contextname="sixperemspace",
+ description="SIX-PER-EM SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x2006,
+ },
+ [0x2007]={
+ category="zs",
+ contextname="figurespace",
+ description="FIGURE SPACE",
+ direction="ws",
+ linebreak="gl",
+ specials={ "nobreak", 0x0020 },
+ unicodeslot=0x2007,
+ },
+ [0x2008]={
+ category="zs",
+ contextname="punctuationspace",
+ description="PUNCTUATION SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x2008,
+ },
+ [0x2009]={
+ category="zs",
+ contextname="breakablethinspace",
+ description="THIN SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x2009,
+ },
+ [0x200A]={
+ category="zs",
+ contextname="figurespace",
+ description="HAIR SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x200A,
+ },
+ [0x200B]={
+ category="cf",
+ contextname="zerowidthspace",
+ description="ZERO WIDTH SPACE",
+ direction="bn",
+ linebreak="zw",
+ unicodeslot=0x200B,
+ },
+ [0x200C]={
+ adobename="afii61664",
+ category="cf",
+ contextname="zwnj",
+ description="ZERO WIDTH NON-JOINER",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x200C,
+ },
+ [0x200D]={
+ adobename="afii301",
+ category="cf",
+ contextname="zwj",
+ description="ZERO WIDTH JOINER",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x200D,
+ },
+ [0x200E]={
+ adobename="afii299",
+ category="cf",
+ description="LEFT-TO-RIGHT MARK",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x200E,
+ },
+ [0x200F]={
+ adobename="afii300",
+ category="cf",
+ description="RIGHT-TO-LEFT MARK",
+ direction="r",
+ linebreak="cm",
+ unicodeslot=0x200F,
+ },
+ [0x2010]={
+ category="pd",
+ cjkwd="a",
+ description="HYPHEN",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2010,
+ },
+ [0x2011]={
+ category="pd",
+ description="NON-BREAKING HYPHEN",
+ direction="on",
+ linebreak="gl",
+ specials={ "nobreak", 0x2010 },
+ unicodeslot=0x2011,
+ },
+ [0x2012]={
+ adobename="figuredash",
+ category="pd",
+ contextname="textminus",
+ description="FIGURE DASH",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2012,
+ },
+ [0x2013]={
+ adobename="endash",
+ category="pd",
+ cjkwd="a",
+ contextname="endash",
+ description="EN DASH",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2013,
+ },
+ [0x2014]={
+ adobename="emdash",
+ category="pd",
+ cjkwd="a",
+ contextname="emdash",
+ description="EM DASH",
+ direction="on",
+ linebreak="b2",
+ unicodeslot=0x2014,
+ },
+ [0x2015]={
+ adobename="afii208",
+ category="pd",
+ cjkwd="a",
+ contextname="texthorizontalbar",
+ description="HORIZONTAL BAR",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2015,
+ },
+ [0x2016]={
+ category="po",
+ cjkwd="a",
+ description="DOUBLE VERTICAL LINE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2016,
+ },
+ [0x2017]={
+ adobename="underscoredbl",
+ category="po",
+ description="DOUBLE LOW LINE",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0333 },
+ unicodeslot=0x2017,
+ },
+ [0x2018]={
+ adobename="quoteleft",
+ category="pi",
+ cjkwd="a",
+ contextname="quoteleft",
+ description="LEFT SINGLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2018,
+ },
+ [0x2019]={
+ adobename="quoteright",
+ category="pf",
+ cjkwd="a",
+ contextname="quoteright",
+ description="RIGHT SINGLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2019,
+ },
+ [0x201A]={
+ adobename="quotesinglbase",
+ category="ps",
+ contextname="quotesinglebase",
+ description="SINGLE LOW-0x0009 QUOTATION MARK",
+ direction="on",
+ linebreak="op",
+ unicodeslot=0x201A,
+ },
+ [0x201B]={
+ adobename="quotereversed",
+ category="pi",
+ description="SINGLE HIGH-REVERSED-0x0009 QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x201B,
+ },
+ [0x201C]={
+ adobename="quotedblleft",
+ category="pi",
+ cjkwd="a",
+ contextname="quotedblleft",
+ description="LEFT DOUBLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x201C,
+ },
+ [0x201D]={
+ adobename="quotedblright",
+ category="pf",
+ cjkwd="a",
+ contextname="quotedblright",
+ description="RIGHT DOUBLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x201D,
+ },
+ [0x201E]={
+ adobename="quotedblbase",
+ category="ps",
+ contextname="quotedblbase",
+ description="DOUBLE LOW-0x0009 QUOTATION MARK",
+ direction="on",
+ linebreak="op",
+ unicodeslot=0x201E,
+ },
+ [0x201F]={
+ category="pi",
+ description="DOUBLE HIGH-REVERSED-0x0009 QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x201F,
+ },
+ [0x2020]={
+ adobename="dagger",
+ category="po",
+ cjkwd="a",
+ contextname="textdag",
+ description="DAGGER",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="binary", name="dagger" },
+ { class="box", name="dag" },
+ },
+ unicodeslot=0x2020,
+ },
+ [0x2021]={
+ adobename="daggerdbl",
+ category="po",
+ cjkwd="a",
+ contextname="textddag",
+ description="DOUBLE DAGGER",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="binary", name="ddagger" },
+ { class="box", name="ddag" },
+ },
+ unicodeslot=0x2021,
+ },
+ [0x2022]={
+ adobename="bullet",
+ category="po",
+ cjkwd="a",
+ contextname="textbullet",
+ description="BULLET",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="bullet",
+ unicodeslot=0x2022,
+ },
+ [0x2023]={
+ category="po",
+ description="TRIANGULAR BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2023,
+ },
+ [0x2024]={
+ adobename="onedotenleader",
+ category="po",
+ cjkwd="a",
+ description="ONE DOT LEADER",
+ direction="on",
+ linebreak="in",
+ specials={ "compat", 0x002E },
+ unicodeslot=0x2024,
+ },
+ [0x2025]={
+ adobename="twodotenleader",
+ category="po",
+ cjkwd="a",
+ description="TWO DOT LEADER",
+ direction="on",
+ linebreak="in",
+ specials={ "compat", 0x002E, 0x002E },
+ unicodeslot=0x2025,
+ },
+ [0x2026]={
+ adobename="ellipsis",
+ category="po",
+ cjkwd="a",
+ contextname="textellipsis",
+ description="HORIZONTAL ELLIPSIS",
+ direction="on",
+ linebreak="in",
+ mathclass="inner",
+ mathname="ldots",
+ specials={ "compat", 0x002E, 0x002E, 0x002E },
+ unicodeslot=0x2026,
+ },
+ [0x2027]={
+ category="po",
+ cjkwd="a",
+ description="HYPHENATION POINT",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2027,
+ },
+ [0x2028]={
+ category="zl",
+ description="LINE SEPARATOR",
+ direction="ws",
+ linebreak="bk",
+ unicodeslot=0x2028,
+ },
+ [0x2029]={
+ category="zp",
+ description="PARAGRAPH SEPARATOR",
+ direction="b",
+ linebreak="bk",
+ unicodeslot=0x2029,
+ },
+ [0x202A]={
+ category="cf",
+ description="LEFT-TO-RIGHT EMBEDDING",
+ direction="lre",
+ linebreak="cm",
+ unicodeslot=0x202A,
+ },
+ [0x202B]={
+ category="cf",
+ description="RIGHT-TO-LEFT EMBEDDING",
+ direction="rle",
+ linebreak="cm",
+ unicodeslot=0x202B,
+ },
+ [0x202C]={
+ adobename="afii61573",
+ category="cf",
+ description="POP DIRECTIONAL FORMATTING",
+ direction="pdf",
+ linebreak="cm",
+ unicodeslot=0x202C,
+ },
+ [0x202D]={
+ adobename="afii61574",
+ category="cf",
+ description="LEFT-TO-RIGHT OVERRIDE",
+ direction="lro",
+ linebreak="cm",
+ unicodeslot=0x202D,
+ },
+ [0x202E]={
+ adobename="afii61575",
+ category="cf",
+ description="RIGHT-TO-LEFT OVERRIDE",
+ direction="rlo",
+ linebreak="cm",
+ unicodeslot=0x202E,
+ },
+ [0x202F]={
+ category="zs",
+ contextname="narrownobreakspace",
+ description="NARROW NO-BREAK SPACE",
+ direction="cs",
+ linebreak="gl",
+ specials={ "nobreak", 0x0020 },
+ unicodeslot=0x202F,
+ },
+ [0x2030]={
+ adobename="perthousand",
+ category="po",
+ cjkwd="a",
+ contextname="perthousand",
+ description="PER MILLE SIGN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x2030,
+ },
+ [0x2031]={
+ category="po",
+ description="PER TEN THOUSAND SIGN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x2031,
+ },
+ [0x2032]={
+ adobename="minute",
+ category="po",
+ cjkwd="a",
+ description="PRIME",
+ direction="et",
+ linebreak="po",
+ mathclass="nothing",
+ mathname="prime",
+ unicodeslot=0x2032,
+ },
+ [0x2033]={
+ adobename="second",
+ category="po",
+ cjkwd="a",
+ description="DOUBLE PRIME",
+ direction="et",
+ linebreak="po",
+ specials={ "compat", 0x2032, 0x2032 },
+ unicodeslot=0x2033,
+ },
+ [0x2034]={
+ category="po",
+ description="TRIPLE PRIME",
+ direction="et",
+ linebreak="po",
+ specials={ "compat", 0x2032, 0x2032, 0x2032 },
+ unicodeslot=0x2034,
+ },
+ [0x2035]={
+ category="po",
+ cjkwd="a",
+ description="REVERSED PRIME",
+ direction="on",
+ linebreak="po",
+ unicodeslot=0x2035,
+ },
+ [0x2036]={
+ category="po",
+ description="REVERSED DOUBLE PRIME",
+ direction="on",
+ linebreak="po",
+ specials={ "compat", 0x2035, 0x2035 },
+ unicodeslot=0x2036,
+ },
+ [0x2037]={
+ category="po",
+ description="REVERSED TRIPLE PRIME",
+ direction="on",
+ linebreak="po",
+ specials={ "compat", 0x2035, 0x2035, 0x2035 },
+ unicodeslot=0x2037,
+ },
+ [0x2038]={
+ category="po",
+ description="CARET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2038,
+ },
+ [0x2039]={
+ adobename="guilsinglleft",
+ category="pi",
+ contextname="guilsingleleft",
+ description="SINGLE LEFT-POINTING ANGLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ mirror=0x203A,
+ unicodeslot=0x2039,
+ },
+ [0x203A]={
+ adobename="guilsinglright",
+ category="pf",
+ contextname="guilsingleright",
+ description="SINGLE RIGHT-POINTING ANGLE QUOTATION MARK",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2039,
+ unicodeslot=0x203A,
+ },
+ [0x203B]={
+ category="po",
+ cjkwd="a",
+ description="REFERENCE MARK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x203B,
+ },
+ [0x203C]={
+ adobename="exclamdbl",
+ category="po",
+ description="DOUBLE EXCLAMATION MARK",
+ direction="on",
+ linebreak="ns",
+ specials={ "compat", 0x0021, 0x0021 },
+ unicodeslot=0x203C,
+ },
+ [0x203D]={
+ category="po",
+ description="INTERROBANG",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x203D,
+ },
+ [0x203E]={
+ category="po",
+ cjkwd="a",
+ description="OVERLINE",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0020, 0x0305 },
+ unicodeslot=0x203E,
+ },
+ [0x203F]={
+ category="pc",
+ description="UNDERTIE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x203F,
+ },
+ [0x2040]={
+ category="pc",
+ description="CHARACTER TIE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2040,
+ },
+ [0x2041]={
+ category="po",
+ description="CARET INSERTION POINT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2041,
+ },
+ [0x2042]={
+ category="po",
+ description="ASTERISM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2042,
+ },
+ [0x2043]={
+ category="po",
+ description="HYPHEN BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2043,
+ },
+ [0x2044]={
+ adobename="fraction",
+ category="sm",
+ contextname="textfraction",
+ description="FRACTION SLASH",
+ direction="cs",
+ linebreak="is",
+ mathspec={
+ { class="binary", name="slash" },
+ { class="close", name="solidus" },
+ },
+ unicodeslot=0x2044,
+ },
+ [0x2045]={
+ category="ps",
+ description="LEFT SQUARE BRACKET WITH QUILL",
+ direction="on",
+ linebreak="op",
+ mirror=0x2046,
+ unicodeslot=0x2045,
+ },
+ [0x2046]={
+ category="pe",
+ description="RIGHT SQUARE BRACKET WITH QUILL",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2045,
+ unicodeslot=0x2046,
+ },
+ [0x2047]={
+ category="po",
+ description="DOUBLE QUESTION MARK",
+ direction="on",
+ linebreak="ns",
+ specials={ "compat", 0x003F, 0x003F },
+ unicodeslot=0x2047,
+ },
+ [0x2048]={
+ category="po",
+ description="QUESTION EXCLAMATION MARK",
+ direction="on",
+ linebreak="ns",
+ specials={ "compat", 0x003F, 0x0021 },
+ unicodeslot=0x2048,
+ },
+ [0x2049]={
+ category="po",
+ description="EXCLAMATION QUESTION MARK",
+ direction="on",
+ linebreak="ns",
+ specials={ "compat", 0x0021, 0x003F },
+ unicodeslot=0x2049,
+ },
+ [0x204A]={
+ category="po",
+ description="TIRONIAN SIGN ET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x204A,
+ },
+ [0x204B]={
+ category="po",
+ description="REVERSED PILCROW SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x204B,
+ },
+ [0x204C]={
+ category="po",
+ description="BLACK LEFTWARDS BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x204C,
+ },
+ [0x204D]={
+ category="po",
+ description="BLACK RIGHTWARDS BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x204D,
+ },
+ [0x204E]={
+ category="po",
+ description="LOW ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x204E,
+ },
+ [0x204F]={
+ category="po",
+ description="REVERSED SEMICOLON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x204F,
+ },
+ [0x2050]={
+ category="po",
+ description="CLOSE UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2050,
+ },
+ [0x2051]={
+ category="po",
+ description="TWO ASTERISKS ALIGNED VERTICALLY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2051,
+ },
+ [0x2052]={
+ category="sm",
+ description="COMMERCIAL MINUS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2052,
+ },
+ [0x2053]={
+ category="po",
+ description="SWUNG DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2053,
+ },
+ [0x2054]={
+ category="pc",
+ description="INVERTED UNDERTIE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2054,
+ },
+ [0x2055]={
+ category="po",
+ description="FLOWER PUNCTUATION MARK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2055,
+ },
+ [0x2056]={
+ category="po",
+ description="THREE DOT PUNCTUATION",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2056,
+ },
+ [0x2057]={
+ category="po",
+ description="QUADRUPLE PRIME",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x2032, 0x2032, 0x2032, 0x2032 },
+ unicodeslot=0x2057,
+ },
+ [0x2058]={
+ category="po",
+ description="FOUR DOT PUNCTUATION",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2058,
+ },
+ [0x2059]={
+ category="po",
+ description="FIVE DOT PUNCTUATION",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2059,
+ },
+ [0x205A]={
+ category="po",
+ description="TWO DOT PUNCTUATION",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x205A,
+ },
+ [0x205B]={
+ category="po",
+ description="FOUR DOT MARK",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x205B,
+ },
+ [0x205C]={
+ category="po",
+ description="DOTTED CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x205C,
+ },
+ [0x205D]={
+ category="po",
+ description="TRICOLON",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x205D,
+ },
+ [0x205E]={
+ category="po",
+ description="VERTICAL FOUR DOTS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x205E,
+ },
+ [0x205F]={
+ category="zs",
+ contextname="medspace",
+ description="MEDIUM MATHEMATICAL SPACE",
+ direction="ws",
+ linebreak="ba",
+ specials={ "compat", 0x0020 },
+ unicodeslot=0x205F,
+ },
+ [0x2060]={
+ category="cf",
+ description="WORD JOINER",
+ direction="bn",
+ linebreak="wj",
+ unicodeslot=0x2060,
+ },
+ [0x2061]={
+ category="cf",
+ comment="maybe: nulloperator",
+ contextname="relax",
+ description="FUNCTION APPLICATION",
+ direction="bn",
+ linebreak="al",
+ unicodeslot=0x2061,
+ },
+ [0x2062]={
+ category="cf",
+ description="INVISIBLE TIMES",
+ direction="bn",
+ linebreak="al",
+ unicodeslot=0x2062,
+ },
+ [0x2063]={
+ category="cf",
+ description="INVISIBLE SEPARATOR",
+ direction="bn",
+ linebreak="al",
+ unicodeslot=0x2063,
+ },
+ [0x206A]={
+ category="cf",
+ description="INHIBIT SYMMETRIC SWAPPING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x206A,
+ },
+ [0x206B]={
+ category="cf",
+ description="ACTIVATE SYMMETRIC SWAPPING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x206B,
+ },
+ [0x206C]={
+ category="cf",
+ description="INHIBIT ARABIC FORM SHAPING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x206C,
+ },
+ [0x206D]={
+ category="cf",
+ description="ACTIVATE ARABIC FORM SHAPING",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x206D,
+ },
+ [0x206E]={
+ category="cf",
+ description="NATIONAL DIGIT SHAPES",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x206E,
+ },
+ [0x206F]={
+ category="cf",
+ description="NOMINAL DIGIT SHAPES",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x206F,
+ },
+ [0x2070]={
+ category="no",
+ description="SUPERSCRIPT ZERO",
+ direction="en",
+ linebreak="al",
+ specials={ "super", 0x0030 },
+ unicodeslot=0x2070,
+ },
+ [0x2071]={
+ category="ll",
+ description="SUPERSCRIPT LATIN SMALL LETTER I",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x0069 },
+ unicodeslot=0x2071,
+ },
+ [0x2074]={
+ category="no",
+ cjkwd="a",
+ description="SUPERSCRIPT FOUR",
+ direction="en",
+ linebreak="ai",
+ specials={ "super", 0x0034 },
+ unicodeslot=0x2074,
+ },
+ [0x2075]={
+ category="no",
+ description="SUPERSCRIPT FIVE",
+ direction="en",
+ linebreak="al",
+ specials={ "super", 0x0035 },
+ unicodeslot=0x2075,
+ },
+ [0x2076]={
+ category="no",
+ description="SUPERSCRIPT SIX",
+ direction="en",
+ linebreak="al",
+ specials={ "super", 0x0036 },
+ unicodeslot=0x2076,
+ },
+ [0x2077]={
+ category="no",
+ description="SUPERSCRIPT SEVEN",
+ direction="en",
+ linebreak="al",
+ specials={ "super", 0x0037 },
+ unicodeslot=0x2077,
+ },
+ [0x2078]={
+ category="no",
+ description="SUPERSCRIPT EIGHT",
+ direction="en",
+ linebreak="al",
+ specials={ "super", 0x0038 },
+ unicodeslot=0x2078,
+ },
+ [0x2079]={
+ category="no",
+ description="SUPERSCRIPT NINE",
+ direction="en",
+ linebreak="al",
+ specials={ "super", 0x0039 },
+ unicodeslot=0x2079,
+ },
+ [0x207A]={
+ category="sm",
+ description="SUPERSCRIPT PLUS SIGN",
+ direction="es",
+ linebreak="al",
+ specials={ "super", 0x002B },
+ unicodeslot=0x207A,
+ },
+ [0x207B]={
+ category="sm",
+ description="SUPERSCRIPT MINUS",
+ direction="es",
+ linebreak="al",
+ specials={ "super", 0x2212 },
+ unicodeslot=0x207B,
+ },
+ [0x207C]={
+ category="sm",
+ description="SUPERSCRIPT EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ specials={ "super", 0x003D },
+ unicodeslot=0x207C,
+ },
+ [0x207D]={
+ category="ps",
+ description="SUPERSCRIPT LEFT PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mirror=0x207E,
+ specials={ "super", 0x0028 },
+ unicodeslot=0x207D,
+ },
+ [0x207E]={
+ category="pe",
+ description="SUPERSCRIPT RIGHT PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mirror=0x207D,
+ specials={ "super", 0x0029 },
+ unicodeslot=0x207E,
+ },
+ [0x207F]={
+ category="ll",
+ cjkwd="a",
+ description="SUPERSCRIPT LATIN SMALL LETTER N",
+ direction="l",
+ linebreak="ai",
+ specials={ "super", 0x006E },
+ unicodeslot=0x207F,
+ },
+ [0x2080]={
+ category="no",
+ description="SUBSCRIPT ZERO",
+ direction="en",
+ linebreak="al",
+ specials={ "sub", 0x0030 },
+ unicodeslot=0x2080,
+ },
+ [0x2081]={
+ category="no",
+ cjkwd="a",
+ description="SUBSCRIPT ONE",
+ direction="en",
+ linebreak="ai",
+ specials={ "sub", 0x0031 },
+ unicodeslot=0x2081,
+ },
+ [0x2082]={
+ category="no",
+ cjkwd="a",
+ description="SUBSCRIPT TWO",
+ direction="en",
+ linebreak="ai",
+ specials={ "sub", 0x0032 },
+ unicodeslot=0x2082,
+ },
+ [0x2083]={
+ category="no",
+ cjkwd="a",
+ description="SUBSCRIPT THREE",
+ direction="en",
+ linebreak="ai",
+ specials={ "sub", 0x0033 },
+ unicodeslot=0x2083,
+ },
+ [0x2084]={
+ category="no",
+ cjkwd="a",
+ description="SUBSCRIPT FOUR",
+ direction="en",
+ linebreak="ai",
+ specials={ "sub", 0x0034 },
+ unicodeslot=0x2084,
+ },
+ [0x2085]={
+ category="no",
+ description="SUBSCRIPT FIVE",
+ direction="en",
+ linebreak="al",
+ specials={ "sub", 0x0035 },
+ unicodeslot=0x2085,
+ },
+ [0x2086]={
+ category="no",
+ description="SUBSCRIPT SIX",
+ direction="en",
+ linebreak="al",
+ specials={ "sub", 0x0036 },
+ unicodeslot=0x2086,
+ },
+ [0x2087]={
+ category="no",
+ description="SUBSCRIPT SEVEN",
+ direction="en",
+ linebreak="al",
+ specials={ "sub", 0x0037 },
+ unicodeslot=0x2087,
+ },
+ [0x2088]={
+ category="no",
+ description="SUBSCRIPT EIGHT",
+ direction="en",
+ linebreak="al",
+ specials={ "sub", 0x0038 },
+ unicodeslot=0x2088,
+ },
+ [0x2089]={
+ category="no",
+ description="SUBSCRIPT NINE",
+ direction="en",
+ linebreak="al",
+ specials={ "sub", 0x0039 },
+ unicodeslot=0x2089,
+ },
+ [0x208A]={
+ category="sm",
+ description="SUBSCRIPT PLUS SIGN",
+ direction="es",
+ linebreak="al",
+ specials={ "sub", 0x002B },
+ unicodeslot=0x208A,
+ },
+ [0x208B]={
+ category="sm",
+ description="SUBSCRIPT MINUS",
+ direction="es",
+ linebreak="al",
+ specials={ "sub", 0x2212 },
+ unicodeslot=0x208B,
+ },
+ [0x208C]={
+ category="sm",
+ description="SUBSCRIPT EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ specials={ "sub", 0x003D },
+ unicodeslot=0x208C,
+ },
+ [0x208D]={
+ category="ps",
+ description="SUBSCRIPT LEFT PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mirror=0x208E,
+ specials={ "sub", 0x0028 },
+ unicodeslot=0x208D,
+ },
+ [0x208E]={
+ category="pe",
+ description="SUBSCRIPT RIGHT PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mirror=0x208D,
+ specials={ "sub", 0x0029 },
+ unicodeslot=0x208E,
+ },
+ [0x2090]={
+ category="lm",
+ description="LATIN SUBSCRIPT SMALL LETTER A",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0061 },
+ unicodeslot=0x2090,
+ },
+ [0x2091]={
+ category="lm",
+ description="LATIN SUBSCRIPT SMALL LETTER E",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0065 },
+ unicodeslot=0x2091,
+ },
+ [0x2092]={
+ category="lm",
+ description="LATIN SUBSCRIPT SMALL LETTER O",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x006F },
+ unicodeslot=0x2092,
+ },
+ [0x2093]={
+ category="lm",
+ description="LATIN SUBSCRIPT SMALL LETTER X",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0078 },
+ unicodeslot=0x2093,
+ },
+ [0x2094]={
+ category="lm",
+ description="LATIN SUBSCRIPT SMALL LETTER SCHWA",
+ direction="l",
+ linebreak="al",
+ specials={ "sub", 0x0259 },
+ unicodeslot=0x2094,
+ },
+ [0x20A0]={
+ category="sc",
+ description="EURO-CURRENCY SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A0,
+ },
+ [0x20A1]={
+ adobename="colonmonetary",
+ category="sc",
+ description="COLON SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A1,
+ },
+ [0x20A2]={
+ category="sc",
+ description="CRUZEIRO SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A2,
+ },
+ [0x20A3]={
+ adobename="franc",
+ category="sc",
+ description="FRENCH FRANC SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A3,
+ },
+ [0x20A4]={
+ adobename="lira",
+ category="sc",
+ description="LIRA SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A4,
+ },
+ [0x20A5]={
+ category="sc",
+ description="MILL SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A5,
+ },
+ [0x20A6]={
+ category="sc",
+ description="NAIRA SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A6,
+ },
+ [0x20A7]={
+ adobename="peseta",
+ category="sc",
+ description="PESETA SIGN",
+ direction="et",
+ linebreak="po",
+ unicodeslot=0x20A7,
+ },
+ [0x20A8]={
+ category="sc",
+ description="RUPEE SIGN",
+ direction="et",
+ linebreak="pr",
+ specials={ "compat", 0x0052, 0x0073 },
+ unicodeslot=0x20A8,
+ },
+ [0x20A9]={
+ category="sc",
+ cjkwd="h",
+ description="WON SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20A9,
+ },
+ [0x20AA]={
+ adobename="afii57636",
+ category="sc",
+ description="NEW SHEQEL SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20AA,
+ },
+ [0x20AB]={
+ adobename="dong",
+ category="sc",
+ contextname="textdong",
+ description="DONG SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20AB,
+ },
+ [0x20AC]={
+ adobename="Euro",
+ category="sc",
+ cjkwd="a",
+ contextname="texteuro",
+ description="EURO SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20AC,
+ },
+ [0x20AD]={
+ category="sc",
+ description="KIP SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20AD,
+ },
+ [0x20AE]={
+ category="sc",
+ description="TUGRIK SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20AE,
+ },
+ [0x20AF]={
+ category="sc",
+ description="DRACHMA SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20AF,
+ },
+ [0x20B0]={
+ category="sc",
+ description="GERMAN PENNY SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20B0,
+ },
+ [0x20B1]={
+ category="sc",
+ description="PESO SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20B1,
+ },
+ [0x20B2]={
+ category="sc",
+ description="GUARANI SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20B2,
+ },
+ [0x20B3]={
+ category="sc",
+ description="AUSTRAL SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20B3,
+ },
+ [0x20B4]={
+ category="sc",
+ description="HRYVNIA SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20B4,
+ },
+ [0x20B5]={
+ category="sc",
+ description="CEDI SIGN",
+ direction="et",
+ linebreak="pr",
+ unicodeslot=0x20B5,
+ },
+ [0x20D0]={
+ category="mn",
+ description="COMBINING LEFT HARPOON ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D0,
+ },
+ [0x20D1]={
+ category="mn",
+ description="COMBINING RIGHT HARPOON ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D1,
+ },
+ [0x20D2]={
+ category="mn",
+ description="COMBINING LONG VERTICAL LINE OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D2,
+ },
+ [0x20D3]={
+ category="mn",
+ description="COMBINING SHORT VERTICAL LINE OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D3,
+ },
+ [0x20D4]={
+ category="mn",
+ description="COMBINING ANTICLOCKWISE ARROW ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D4,
+ },
+ [0x20D5]={
+ category="mn",
+ description="COMBINING CLOCKWISE ARROW ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D5,
+ },
+ [0x20D6]={
+ category="mn",
+ description="COMBINING LEFT ARROW ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D6,
+ },
+ [0x20D7]={
+ category="mn",
+ description="COMBINING RIGHT ARROW ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="accent",
+ mathname="vec",
+ unicodeslot=0x20D7,
+ },
+ [0x20D8]={
+ category="mn",
+ description="COMBINING RING OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D8,
+ },
+ [0x20D9]={
+ category="mn",
+ description="COMBINING CLOCKWISE RING OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20D9,
+ },
+ [0x20DA]={
+ category="mn",
+ description="COMBINING ANTICLOCKWISE RING OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20DA,
+ },
+ [0x20DB]={
+ category="mn",
+ description="COMBINING THREE DOTS ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="accent",
+ mathname="dddot",
+ unicodeslot=0x20DB,
+ },
+ [0x20DC]={
+ category="mn",
+ description="COMBINING FOUR DOTS ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20DC,
+ },
+ [0x20DD]={
+ category="me",
+ description="COMBINING ENCLOSING CIRCLE",
+ direction="nsm",
+ linebreak="cm",
+ mathspec={
+ { class="default",name="bigcircle" },
+ { class="binary",name="bigcircle" },
+ },
+ unicodeslot=0x20DD,
+ },
+ [0x20DE]={
+ category="me",
+ description="COMBINING ENCLOSING SQUARE",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="default",
+ mathname="bigsquare",
+ unicodeslot=0x20DE,
+ },
+ [0x20DF]={
+ category="me",
+ description="COMBINING ENCLOSING DIAMOND",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="default",
+ mathname="bigdiamond",
+ unicodeslot=0x20DF,
+ },
+ [0x20E0]={
+ category="me",
+ description="COMBINING ENCLOSING CIRCLE BACKSLASH",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E0,
+ },
+ [0x20E1]={
+ category="mn",
+ description="COMBINING LEFT RIGHT ARROW ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E1,
+ },
+ [0x20E2]={
+ category="me",
+ description="COMBINING ENCLOSING SCREEN",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E2,
+ },
+ [0x20E3]={
+ category="me",
+ description="COMBINING ENCLOSING KEYCAP",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E3,
+ },
+ [0x20E4]={
+ category="me",
+ description="COMBINING ENCLOSING UPWARD POINTING TRIANGLE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E4,
+ },
+ [0x20E5]={
+ category="mn",
+ description="COMBINING REVERSE SOLIDUS OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E5,
+ },
+ [0x20E6]={
+ category="mn",
+ description="COMBINING DOUBLE VERTICAL STROKE OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E6,
+ },
+ [0x20E7]={
+ category="mn",
+ description="COMBINING ANNUITY SYMBOL",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E7,
+ },
+ [0x20E8]={
+ category="mn",
+ description="COMBINING TRIPLE UNDERDOT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20E8,
+ },
+ [0x20E9]={
+ category="mn",
+ description="COMBINING WIDE BRIDGE ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="accent",
+ unicodeslot=0x20E9,
+ },
+ [0x20EA]={
+ category="mn",
+ description="COMBINING LEFTWARDS ARROW OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20EA,
+ },
+ [0x20EB]={
+ category="mn",
+ description="COMBINING LONG DOUBLE SOLIDUS OVERLAY",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20EB,
+ },
+ [0x20EC]={
+ category="mn",
+ description="COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20EC,
+ },
+ [0x20ED]={
+ category="mn",
+ description="COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20ED,
+ },
+ [0x20EE]={
+ category="mn",
+ description="COMBINING LEFT ARROW BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20EE,
+ },
+ [0x20EF]={
+ category="mn",
+ description="COMBINING RIGHT ARROW BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x20EF,
+ },
+ [0x2100]={
+ category="so",
+ description="ACCOUNT OF",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0061, 0x002F, 0x0063 },
+ unicodeslot=0x2100,
+ },
+ [0x2101]={
+ category="so",
+ description="ADDRESSED TO THE SUBJECT",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0061, 0x002F, 0x0073 },
+ unicodeslot=0x2101,
+ },
+ [0x2102]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL C",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="complexes",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x2102,
+ },
+ [0x2103]={
+ category="so",
+ cjkwd="a",
+ description="DEGREE CELSIUS",
+ contextname="textcelsius",
+ direction="on",
+ linebreak="po",
+ specials={ "compat", 0x00B0, 0x0043 },
+ unicodeslot=0x2103,
+ },
+ [0x2104]={
+ category="so",
+ description="CENTRE LINE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2104,
+ },
+ [0x2105]={
+ adobename="afii61248",
+ category="so",
+ cjkwd="a",
+ description="CARE OF",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0063, 0x002F, 0x006F },
+ unicodeslot=0x2105,
+ },
+ [0x2106]={
+ category="so",
+ description="CADA UNA",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0063, 0x002F, 0x0075 },
+ unicodeslot=0x2106,
+ },
+ [0x2107]={
+ category="lu",
+ description="EULER CONSTANT",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0190 },
+ unicodeslot=0x2107,
+ },
+ [0x2108]={
+ category="so",
+ description="SCRUPLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2108,
+ },
+ [0x2109]={
+ category="so",
+ cjkwd="a",
+ description="DEGREE FAHRENHEIT",
+ direction="on",
+ linebreak="po",
+ specials={ "compat", 0x00B0, 0x0046 },
+ unicodeslot=0x2109,
+ },
+ [0x210A]={
+ category="ll",
+ description="SCRIPT SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x210A,
+ },
+ [0x210B]={
+ category="lu",
+ description="SCRIPT CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x210B,
+ },
+ [0x210C]={
+ category="lu",
+ description="BLACK-LETTER CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x210C,
+ },
+ [0x210D]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x210D,
+ },
+ [0x210E]={
+ category="ll",
+ description="PLANCK CONSTANT",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x210E,
+ },
+ [0x210F]={
+ category="ll",
+ description="PLANCK CONSTANT OVER TWO PI",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="hslash",
+ specials={ "font", 0x0127 },
+ unicodeslot=0x210F,
+ },
+ [0x2110]={
+ category="lu",
+ description="SCRIPT CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x2110,
+ },
+ [0x2111]={
+ adobename="Ifraktur",
+ category="lu",
+ description="BLACK-LETTER CAPITAL I",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="Im",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x2111,
+ },
+ [0x2112]={
+ category="lu",
+ description="SCRIPT CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x2112,
+ },
+ [0x2113]={
+ adobename="afii61289",
+ category="ll",
+ cjkwd="a",
+ description="SCRIPT SMALL L",
+ direction="l",
+ linebreak="ai",
+ mathclass="default",
+ mathname="ell",
+ specials={ "font", 0x006C },
+ unicodeslot=0x2113,
+ },
+ [0x2114]={
+ category="so",
+ description="L B BAR SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2114,
+ },
+ [0x2115]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL N",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="naturalnumbers",
+ specials={ "font", 0x004E },
+ unicodeslot=0x2115,
+ },
+ [0x2116]={
+ adobename="afii61352",
+ category="so",
+ cjkwd="a",
+ contextname="textnumero",
+ description="NUMERO SIGN",
+ direction="on",
+ linebreak="pr",
+ specials={ "compat", 0x004E, 0x006F },
+ unicodeslot=0x2116,
+ },
+ [0x2117]={
+ category="so",
+ contextname="textcircledP",
+ description="SOUND RECORDING COPYRIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2117,
+ },
+ [0x2118]={
+ adobename="weierstrass",
+ category="so",
+ description="SCRIPT CAPITAL P",
+ direction="on",
+ linebreak="al",
+ mathclass="default",
+ mathname="wp",
+ unicodeslot=0x2118,
+ },
+ [0x2119]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL P",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="primes",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x2119,
+ },
+ [0x211A]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="rationals",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x211A,
+ },
+ [0x211B]={
+ category="lu",
+ description="SCRIPT CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x211B,
+ },
+ [0x211C]={
+ adobename="Rfraktur",
+ category="lu",
+ description="BLACK-LETTER CAPITAL R",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="Re",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x211C,
+ },
+ [0x211D]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL R",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="reals",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x211D,
+ },
+ [0x211E]={
+ adobename="prescription",
+ category="so",
+ description="PRESCRIPTION TAKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x211E,
+ },
+ [0x211F]={
+ category="so",
+ description="RESPONSE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x211F,
+ },
+ [0x2120]={
+ category="so",
+ description="SERVICE MARK",
+ direction="on",
+ linebreak="al",
+ specials={ "super", 0x0053, 0x004D },
+ unicodeslot=0x2120,
+ },
+ [0x2121]={
+ category="so",
+ cjkwd="a",
+ description="TELEPHONE SIGN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0054, 0x0045, 0x004C },
+ unicodeslot=0x2121,
+ },
+ [0x2122]={
+ adobename="trademark",
+ category="so",
+ cjkwd="a",
+ contextname="trademark",
+ description="TRADE MARK SIGN",
+ direction="on",
+ linebreak="ai",
+ specials={ "super", 0x0054, 0x004D },
+ unicodeslot=0x2122,
+ },
+ [0x2123]={
+ category="so",
+ description="VERSICLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2123,
+ },
+ [0x2124]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="integers",
+ specials={ "font", 0x005A },
+ unicodeslot=0x2124,
+ },
+ [0x2125]={
+ category="so",
+ contextname="textounce",
+ description="OUNCE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2125,
+ },
+ [0x2126]={
+ adobename="Omega",
+ category="lu",
+ cjkwd="a",
+ description="OHM SIGN",
+ contextname="textohm",
+ direction="l",
+ lccode=0x03C9, --AM: Not sure?
+ linebreak="al",
+ mathclass="variable",
+ mathname="ohm", --AM: Should we do this or does specials take care of it
+ specials={ "char", 0x03A9 },
+ unicodeslot=0x2126,
+ },
+ [0x2127]={
+ category="so",
+ description="INVERTED OHM SIGN",
+ contextname="textmho",
+ direction="on",
+ linebreak="al",
+ mathclass="variable",
+ mathname="mho",
+ unicodeslot=0x2127,
+ },
+ [0x2128]={
+ category="lu",
+ description="BLACK-LETTER CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x2128,
+ },
+ [0x2129]={
+ category="so",
+ description="TURNED GREEK SMALL LETTER IOTA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2129,
+ },
+ [0x212A]={
+ category="lu",
+ description="KELVIN SIGN",
+ direction="l",
+ contextname="textkelvin",
+ lccode=0x006B,
+ linebreak="al",
+ specials={ "char", 0x004B },
+ unicodeslot=0x212A,
+ },
+ [0x212B]={
+ category="lu",
+ cjkwd="a",
+ description="ANGSTROM SIGN",
+ direction="l",
+ contextname="textAngstrom",
+ lccode=0x00E5,
+ linebreak="ai",
+ mathclass="variable",
+ mathname="Angstrom",
+ specials={ "char", 0x00C5 },
+ unicodeslot=0x212B,
+ },
+ [0x212C]={
+ category="lu",
+ description="SCRIPT CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x212C,
+ },
+ [0x212D]={
+ category="lu",
+ description="BLACK-LETTER CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x212D,
+ },
+ [0x212E]={
+ adobename="estimated",
+ category="so",
+ description="ESTIMATED SYMBOL",
+ direction="et",
+ linebreak="al",
+ unicodeslot=0x212E,
+ },
+ [0x212F]={
+ category="ll",
+ description="SCRIPT SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x212F,
+ },
+ [0x2130]={
+ category="lu",
+ description="SCRIPT CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x2130,
+ },
+ [0x2131]={
+ category="lu",
+ description="SCRIPT CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x2131,
+ },
+ [0x2132]={
+ category="lu",
+ description="TURNED CAPITAL F",
+ direction="l",
+ lccode=0x214E,
+ linebreak="al",
+ mathclass="ord",
+ mathname="Finv",
+ unicodeslot=0x2132,
+ },
+ [0x2133]={
+ category="lu",
+ description="SCRIPT CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x2133,
+ },
+ [0x2134]={
+ category="ll",
+ description="SCRIPT SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x2134,
+ },
+ [0x2135]={
+ adobename="aleph",
+ category="lo",
+ description="ALEF SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="aleph",
+ specials={ "compat", 0x05D0 },
+ unicodeslot=0x2135,
+ },
+ [0x2136]={
+ category="lo",
+ description="BET SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="ord",
+ mathname="beth",
+ specials={ "compat", 0x05D1 },
+ unicodeslot=0x2136,
+ },
+ [0x2137]={
+ category="lo",
+ description="GIMEL SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="ord",
+ mathname="gimel",
+ specials={ "compat", 0x05D2 },
+ unicodeslot=0x2137,
+ },
+ [0x2138]={
+ category="lo",
+ description="DALET SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="ord",
+ mathname="daleth",
+ specials={ "compat", 0x05D3 },
+ unicodeslot=0x2138,
+ },
+ [0x2139]={
+ category="ll",
+ description="INFORMATION SOURCE",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x2139,
+ },
+ [0x213A]={
+ category="so",
+ description="ROTATED CAPITAL Q",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x213A,
+ },
+ [0x213B]={
+ category="so",
+ description="FACSIMILE SIGN",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x0046, 0x0041, 0x0058 },
+ unicodeslot=0x213B,
+ },
+ [0x213C]={
+ category="ll",
+ description="DOUBLE-STRUCK SMALL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C0 },
+ unicodeslot=0x213C,
+ },
+ [0x213D]={
+ category="ll",
+ description="DOUBLE-STRUCK SMALL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B3 },
+ unicodeslot=0x213D,
+ },
+ [0x213E]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0393 },
+ unicodeslot=0x213E,
+ },
+ [0x213F]={
+ category="lu",
+ description="DOUBLE-STRUCK CAPITAL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A0 },
+ unicodeslot=0x213F,
+ },
+ [0x2140]={
+ category="sm",
+ description="DOUBLE-STRUCK N-ARY SUMMATION",
+ direction="on",
+ linebreak="al",
+ specials={ "font", 0x2211 },
+ unicodeslot=0x2140,
+ },
+ [0x2141]={
+ category="sm",
+ description="TURNED SANS-SERIF CAPITAL G",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="Game",
+ unicodeslot=0x2141,
+ },
+ [0x2142]={
+ category="sm",
+ description="TURNED SANS-SERIF CAPITAL L",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2142,
+ },
+ [0x2143]={
+ category="sm",
+ description="REVERSED SANS-SERIF CAPITAL L",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2143,
+ },
+ [0x2144]={
+ category="sm",
+ description="TURNED SANS-SERIF CAPITAL Y",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2144,
+ },
+ [0x2145]={
+ category="lu",
+ description="DOUBLE-STRUCK ITALIC CAPITAL D",
+ direction="l",
+ linebreak="al",
+ mathclass="nothing",
+ mathname="differentialD",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x2145,
+ },
+ [0x2146]={
+ category="ll",
+ description="DOUBLE-STRUCK ITALIC SMALL D",
+ direction="l",
+ linebreak="al",
+ mathclass="nothing",
+ mathname="differentiald",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x2146,
+ },
+ [0x2147]={
+ category="ll",
+ description="DOUBLE-STRUCK ITALIC SMALL E",
+ direction="l",
+ linebreak="al",
+ mathclass="nothing",
+ mathname="exponentiale",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x2147,
+ },
+ [0x2148]={
+ category="ll",
+ description="DOUBLE-STRUCK ITALIC SMALL I",
+ direction="l",
+ linebreak="al",
+ mathclass="nothing",
+ mathname="imaginaryi",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x2148,
+ },
+ [0x2149]={
+ category="ll",
+ description="DOUBLE-STRUCK ITALIC SMALL J",
+ direction="l",
+ linebreak="al",
+ mathclass="nothing",
+ mathname="imaginaryj",
+ specials={ "font", 0x006A },
+ unicodeslot=0x2149,
+ },
+ [0x214A]={
+ category="so",
+ description="PROPERTY LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x214A,
+ },
+ [0x214B]={
+ category="sm",
+ description="TURNED AMPERSAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x214B,
+ },
+ [0x214C]={
+ category="so",
+ description="PER SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x214C,
+ },
+ [0x214D]={
+ category="so",
+ description="AKTIESELSKAB",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x214D,
+ },
+ [0x214E]={
+ category="ll",
+ description="TURNED SMALL F",
+ direction="l",
+ linebreak="al",
+ uccode=0x2132,
+ unicodeslot=0x214E,
+ },
+ [0x2153]={
+ adobename="onethird",
+ category="no",
+ cjkwd="a",
+ contextname="onethird",
+ description="VULGAR FRACTION ONE THIRD",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0031, 0x2044, 0x0033 },
+ unicodeslot=0x2153,
+ },
+ [0x2154]={
+ adobename="twothirds",
+ category="no",
+ cjkwd="a",
+ contextname="twothirds",
+ description="VULGAR FRACTION TWO THIRDS",
+ direction="on",
+ linebreak="ai",
+ specials={ "fraction", 0x0032, 0x2044, 0x0033 },
+ unicodeslot=0x2154,
+ },
+ [0x2155]={
+ category="no",
+ contextname="onefifth",
+ description="VULGAR FRACTION ONE FIFTH",
+ direction="on",
+ linebreak="ai",
+ specials={ "fraction", 0x0031, 0x2044, 0x0035 },
+ unicodeslot=0x2155,
+ },
+ [0x2156]={
+ category="no",
+ contextname="twofifths",
+ description="VULGAR FRACTION TWO FIFTHS",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0032, 0x2044, 0x0035 },
+ unicodeslot=0x2156,
+ },
+ [0x2157]={
+ category="no",
+ contextname="threefifths",
+ description="VULGAR FRACTION THREE FIFTHS",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0033, 0x2044, 0x0035 },
+ unicodeslot=0x2157,
+ },
+ [0x2158]={
+ category="no",
+ contextname="fourfifths",
+ description="VULGAR FRACTION FOUR FIFTHS",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0034, 0x2044, 0x0035 },
+ unicodeslot=0x2158,
+ },
+ [0x2159]={
+ category="no",
+ contextname="onesixth",
+ description="VULGAR FRACTION ONE SIXTH",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0031, 0x2044, 0x0036 },
+ unicodeslot=0x2159,
+ },
+ [0x215A]={
+ category="no",
+ contextname="fivesixths",
+ description="VULGAR FRACTION FIVE SIXTHS",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0035, 0x2044, 0x0036 },
+ unicodeslot=0x215A,
+ },
+ [0x215B]={
+ adobename="oneeighth",
+ category="no",
+ cjkwd="a",
+ contextname="oneeighth",
+ description="VULGAR FRACTION ONE EIGHTH",
+ direction="on",
+ linebreak="ai",
+ specials={ "fraction", 0x0031, 0x2044, 0x0038 },
+ unicodeslot=0x215B,
+ },
+ [0x215C]={
+ adobename="threeeighths",
+ category="no",
+ cjkwd="a",
+ contextname="threeeighths",
+ description="VULGAR FRACTION THREE EIGHTHS",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0033, 0x2044, 0x0038 },
+ unicodeslot=0x215C,
+ },
+ [0x215D]={
+ adobename="fiveeighths",
+ category="no",
+ cjkwd="a",
+ contextname="fiveeighths",
+ description="VULGAR FRACTION FIVE EIGHTHS",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0035, 0x2044, 0x0038 },
+ unicodeslot=0x215D,
+ },
+ [0x215E]={
+ adobename="seveneighths",
+ category="no",
+ cjkwd="a",
+ contextname="seveneighths",
+ description="VULGAR FRACTION SEVEN EIGHTHS",
+ direction="on",
+ linebreak="ai",
+ specials={ "fraction", 0x0037, 0x2044, 0x0038 },
+ unicodeslot=0x215E,
+ },
+ [0x215F]={
+ category="no",
+ description="FRACTION NUMERATOR ONE",
+ direction="on",
+ linebreak="al",
+ specials={ "fraction", 0x0031, 0x2044 },
+ unicodeslot=0x215F,
+ },
+ [0x2160]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanI",
+ description="ROMAN NUMERAL ONE",
+ direction="l",
+ lccode=0x2170,
+ linebreak="ai",
+ specials={ "compat", 0x0049 },
+ unicodeslot=0x2160,
+ },
+ [0x2161]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanII",
+ description="ROMAN NUMERAL TWO",
+ direction="l",
+ lccode=0x2171,
+ linebreak="ai",
+ specials={ "compat", 0x0049, 0x0049 },
+ unicodeslot=0x2161,
+ },
+ [0x2162]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanIII",
+ description="ROMAN NUMERAL THREE",
+ direction="l",
+ lccode=0x2172,
+ linebreak="ai",
+ specials={ "compat", 0x0049, 0x0049, 0x0049 },
+ unicodeslot=0x2162,
+ },
+ [0x2163]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanIV",
+ description="ROMAN NUMERAL FOUR",
+ direction="l",
+ lccode=0x2173,
+ linebreak="ai",
+ specials={ "compat", 0x0049, 0x0056 },
+ unicodeslot=0x2163,
+ },
+ [0x2164]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanV",
+ description="ROMAN NUMERAL FIVE",
+ direction="l",
+ lccode=0x2174,
+ linebreak="ai",
+ specials={ "compat", 0x0056 },
+ unicodeslot=0x2164,
+ },
+ [0x2165]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanVI",
+ description="ROMAN NUMERAL SIX",
+ direction="l",
+ lccode=0x2175,
+ linebreak="ai",
+ specials={ "compat", 0x0056, 0x0049 },
+ unicodeslot=0x2165,
+ },
+ [0x2166]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanVII",
+ description="ROMAN NUMERAL SEVEN",
+ direction="l",
+ lccode=0x2176,
+ linebreak="ai",
+ specials={ "compat", 0x0056, 0x0049, 0x0049 },
+ unicodeslot=0x2166,
+ },
+ [0x2167]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanVIII",
+ description="ROMAN NUMERAL EIGHT",
+ direction="l",
+ lccode=0x2177,
+ linebreak="ai",
+ specials={ "compat", 0x0056, 0x0049, 0x0049, 0x0049 },
+ unicodeslot=0x2167,
+ },
+ [0x2168]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanIX",
+ description="ROMAN NUMERAL NINE",
+ direction="l",
+ lccode=0x2178,
+ linebreak="ai",
+ specials={ "compat", 0x0049, 0x0058 },
+ unicodeslot=0x2168,
+ },
+ [0x2169]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanX",
+ description="ROMAN NUMERAL TEN",
+ direction="l",
+ lccode=0x2179,
+ linebreak="ai",
+ specials={ "compat", 0x0058 },
+ unicodeslot=0x2169,
+ },
+ [0x216A]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanXI",
+ description="ROMAN NUMERAL ELEVEN",
+ direction="l",
+ lccode=0x217A,
+ linebreak="ai",
+ specials={ "compat", 0x0058, 0x0049 },
+ unicodeslot=0x216A,
+ },
+ [0x216B]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanXII",
+ description="ROMAN NUMERAL TWELVE",
+ direction="l",
+ lccode=0x217B,
+ linebreak="ai",
+ specials={ "compat", 0x0058, 0x0049, 0x0049 },
+ unicodeslot=0x216B,
+ },
+ [0x216C]={
+ category="nl",
+ contextname="romanL",
+ description="ROMAN NUMERAL FIFTY",
+ direction="l",
+ lccode=0x217C,
+ linebreak="al",
+ specials={ "compat", 0x004C },
+ unicodeslot=0x216C,
+ },
+ [0x216D]={
+ category="nl",
+ contextname="romanC",
+ description="ROMAN NUMERAL ONE HUNDRED",
+ direction="l",
+ lccode=0x217D,
+ linebreak="al",
+ specials={ "compat", 0x0043 },
+ unicodeslot=0x216D,
+ },
+ [0x216E]={
+ category="nl",
+ contextname="romanD",
+ description="ROMAN NUMERAL FIVE HUNDRED",
+ direction="l",
+ lccode=0x217E,
+ linebreak="al",
+ specials={ "compat", 0x0044 },
+ unicodeslot=0x216E,
+ },
+ [0x216F]={
+ category="nl",
+ contextname="romanM",
+ description="ROMAN NUMERAL ONE THOUSAND",
+ direction="l",
+ lccode=0x217F,
+ linebreak="al",
+ specials={ "compat", 0x004D },
+ unicodeslot=0x216F,
+ },
+ [0x2170]={
+ category="nl",
+ cjkwd="a",
+ contextname="romani",
+ description="SMALL ROMAN NUMERAL ONE",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0069 },
+ uccode=0x2160,
+ unicodeslot=0x2170,
+ },
+ [0x2171]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanii",
+ description="SMALL ROMAN NUMERAL TWO",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0069, 0x0069 },
+ uccode=0x2161,
+ unicodeslot=0x2171,
+ },
+ [0x2172]={
+ category="nl",
+ cjkwd="a",
+ contextname="romaniii",
+ description="SMALL ROMAN NUMERAL THREE",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0069, 0x0069, 0x0069 },
+ uccode=0x2162,
+ unicodeslot=0x2172,
+ },
+ [0x2173]={
+ category="nl",
+ cjkwd="a",
+ contextname="romaniv",
+ description="SMALL ROMAN NUMERAL FOUR",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0069, 0x0076 },
+ uccode=0x2163,
+ unicodeslot=0x2173,
+ },
+ [0x2174]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanv",
+ description="SMALL ROMAN NUMERAL FIVE",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0076 },
+ uccode=0x2164,
+ unicodeslot=0x2174,
+ },
+ [0x2175]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanvi",
+ description="SMALL ROMAN NUMERAL SIX",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0076, 0x0069 },
+ uccode=0x2165,
+ unicodeslot=0x2175,
+ },
+ [0x2176]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanvii",
+ description="SMALL ROMAN NUMERAL SEVEN",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0076, 0x0069, 0x0069 },
+ uccode=0x2166,
+ unicodeslot=0x2176,
+ },
+ [0x2177]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanviii",
+ description="SMALL ROMAN NUMERAL EIGHT",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0076, 0x0069, 0x0069, 0x0069 },
+ uccode=0x2167,
+ unicodeslot=0x2177,
+ },
+ [0x2178]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanix",
+ description="SMALL ROMAN NUMERAL NINE",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0069, 0x0078 },
+ uccode=0x2168,
+ unicodeslot=0x2178,
+ },
+ [0x2179]={
+ category="nl",
+ cjkwd="a",
+ contextname="romanx",
+ description="SMALL ROMAN NUMERAL TEN",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0078 },
+ uccode=0x2169,
+ unicodeslot=0x2179,
+ },
+ [0x217A]={
+ category="nl",
+ contextname="romanxi",
+ description="SMALL ROMAN NUMERAL ELEVEN",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0078, 0x0069 },
+ uccode=0x216A,
+ unicodeslot=0x217A,
+ },
+ [0x217B]={
+ category="nl",
+ contextname="romanxii",
+ description="SMALL ROMAN NUMERAL TWELVE",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0078, 0x0069, 0x0069 },
+ uccode=0x216B,
+ unicodeslot=0x217B,
+ },
+ [0x217C]={
+ category="nl",
+ contextname="romanl",
+ description="SMALL ROMAN NUMERAL FIFTY",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x006C },
+ uccode=0x216C,
+ unicodeslot=0x217C,
+ },
+ [0x217D]={
+ category="nl",
+ contextname="romanc",
+ description="SMALL ROMAN NUMERAL ONE HUNDRED",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0063 },
+ uccode=0x216D,
+ unicodeslot=0x217D,
+ },
+ [0x217E]={
+ category="nl",
+ contextname="romand",
+ description="SMALL ROMAN NUMERAL FIVE HUNDRED",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0064 },
+ uccode=0x216E,
+ unicodeslot=0x217E,
+ },
+ [0x217F]={
+ category="nl",
+ contextname="romanm",
+ description="SMALL ROMAN NUMERAL ONE THOUSAND",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x006D },
+ uccode=0x216F,
+ unicodeslot=0x217F,
+ },
+ [0x2180]={
+ category="nl",
+ description="ROMAN NUMERAL ONE THOUSAND C D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2180,
+ },
+ [0x2181]={
+ category="nl",
+ description="ROMAN NUMERAL FIVE THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2181,
+ },
+ [0x2182]={
+ category="nl",
+ description="ROMAN NUMERAL TEN THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2182,
+ },
+ [0x2183]={
+ category="lu",
+ description="ROMAN NUMERAL REVERSED ONE HUNDRED",
+ direction="l",
+ lccode=0x2184,
+ linebreak="al",
+ unicodeslot=0x2183,
+ },
+ [0x2184]={
+ category="ll",
+ description="LATIN SMALL LETTER REVERSED C",
+ direction="l",
+ linebreak="al",
+ uccode=0x2183,
+ unicodeslot=0x2184,
+ },
+ [0x2190]={
+ adobename="arrowleft",
+ category="sm",
+ cjkwd="a",
+ description="LEFTWARDS ARROW",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="relation", name="leftarrow" },
+ { class="relation", name="gets" },
+ { class="under", name="underleftarrow" },
+ { class="over", name="overleftarrow" },
+ },
+ mathstretch="h",
+ unicodeslot=0x2190,
+ },
+ [0x2191]={
+ adobename="arrowup",
+ category="sm",
+ cjkwd="a",
+ description="UPWARDS ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="uparrow",
+ unicodeslot=0x2191,
+ },
+ [0x2192]={
+ adobename="arrowright",
+ category="sm",
+ cjkwd="a",
+ description="RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="relation",name="rightarrow" },
+ { class="relation",name="to" },
+ { class="under", name="underrightarrow" },
+ { class="over", name="overrightarrow" },
+ },
+ mathstretch="h",
+ unicodeslot=0x2192,
+ },
+ [0x2193]={
+ adobename="arrowdown",
+ category="sm",
+ cjkwd="a",
+ description="DOWNWARDS ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="downarrow",
+ unicodeslot=0x2193,
+ },
+ [0x2194]={
+ adobename="arrowboth",
+ category="sm",
+ cjkwd="a",
+ description="LEFT RIGHT ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="leftrightarrow",
+ unicodeslot=0x2194,
+ },
+ [0x2195]={
+ adobename="arrowupdn",
+ category="so",
+ cjkwd="a",
+ description="UP DOWN ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="updownarrow",
+ unicodeslot=0x2195,
+ },
+ [0x2196]={
+ category="so",
+ cjkwd="a",
+ description="NORTH WEST ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="nwarrow",
+ unicodeslot=0x2196,
+ },
+ [0x2197]={
+ category="so",
+ cjkwd="a",
+ description="NORTH EAST ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="nearrow",
+ unicodeslot=0x2197,
+ },
+ [0x2198]={
+ category="so",
+ cjkwd="a",
+ description="SOUTH EAST ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="searrow",
+ unicodeslot=0x2198,
+ },
+ [0x2199]={
+ category="so",
+ cjkwd="a",
+ description="SOUTH WEST ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="swarrow",
+ unicodeslot=0x2199,
+ },
+ [0x219A]={
+ category="sm",
+ description="LEFTWARDS ARROW WITH STROKE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nleftarrow",
+ specials={ "char", 0x2190, 0x0338 },
+ unicodeslot=0x219A,
+ },
+ [0x219B]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH STROKE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nrightarrow",
+ specials={ "char", 0x2192, 0x0338 },
+ unicodeslot=0x219B,
+ },
+ [0x219C]={
+ category="so",
+ description="LEFTWARDS WAVE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x219C,
+ },
+ [0x219D]={
+ category="so",
+ description="RIGHTWARDS WAVE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x219D,
+ },
+ [0x219E]={
+ category="so",
+ description="LEFTWARDS TWO HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="twoheadleftarrow",
+ unicodeslot=0x219E,
+ },
+ [0x219F]={
+ category="so",
+ description="UPWARDS TWO HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="twoheadupleftarrow",
+ unicodeslot=0x219F,
+ },
+ [0x21A0]={
+ category="sm",
+ description="RIGHTWARDS TWO HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="twoheadrightarrow",
+ unicodeslot=0x21A0,
+ },
+ [0x21A1]={
+ category="so",
+ description="DOWNWARDS TWO HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="twoheaddownleftarrow",
+ unicodeslot=0x21A1,
+ },
+ [0x21A2]={
+ category="so",
+ description="LEFTWARDS ARROW WITH TAIL",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftarrowtail",
+ unicodeslot=0x21A2,
+ },
+ [0x21A3]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH TAIL",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rightarrowtail",
+ unicodeslot=0x21A3,
+ },
+ [0x21A4]={
+ category="so",
+ description="LEFTWARDS ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21A4,
+ },
+ [0x21A5]={
+ category="so",
+ description="UPWARDS ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21A5,
+ },
+ [0x21A6]={
+ category="sm",
+ description="RIGHTWARDS ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ fallback=[[\mapstochar\rightarrow]],
+ mathclass="relation",
+ mathname="mapsto",
+ unicodeslot=0x21A6,
+ },
+ [0x21A7]={
+ category="so",
+ description="DOWNWARDS ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21A7,
+ },
+ [0x21A8]={
+ adobename="arrowupdnbse",
+ category="so",
+ description="UP DOWN ARROW WITH BASE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21A8,
+ },
+ [0x21A9]={
+ category="so",
+ description="LEFTWARDS ARROW WITH HOOK",
+ direction="on",
+ linebreak="al",
+ fallback=[[\leftarrow\joinrel\rhook]],
+ mathclass="relation",
+ mathname="hookleftarrow",
+ unicodeslot=0x21A9,
+ },
+ [0x21AA]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH HOOK",
+ direction="on",
+ linebreak="al",
+ fallback=[[\lhook\joinrel\rightarrow]],
+ mathclass="relation",
+ mathname="hookrightarrow",
+ unicodeslot=0x21AA,
+ },
+ [0x21AB]={
+ category="so",
+ description="LEFTWARDS ARROW WITH LOOP",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="looparrowleft",
+ unicodeslot=0x21AB,
+ },
+ [0x21AC]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH LOOP",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="looparrowright",
+ unicodeslot=0x21AC,
+ },
+ [0x21AD]={
+ category="so",
+ description="LEFT RIGHT WAVE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftrightsquigarrow",
+ unicodeslot=0x21AD,
+ },
+ [0x21AE]={
+ category="sm",
+ description="LEFT RIGHT ARROW WITH STROKE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nleftrightarrow",
+ specials={ "char", 0x2194, 0x0338 },
+ unicodeslot=0x21AE,
+ },
+ [0x21AF]={
+ category="so",
+ description="DOWNWARDS ZIGZAG ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21AF,
+ },
+ [0x21B0]={
+ category="so",
+ description="UPWARDS ARROW WITH TIP LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Lsh",
+ unicodeslot=0x21B0,
+ },
+ [0x21B1]={
+ category="so",
+ description="UPWARDS ARROW WITH TIP RIGHTWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Rsh",
+ unicodeslot=0x21B1,
+ },
+ [0x21B2]={
+ category="so",
+ description="DOWNWARDS ARROW WITH TIP LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dlsh", -- from mathabx
+ unicodeslot=0x21B2,
+ },
+ [0x21B3]={
+ category="so",
+ description="DOWNWARDS ARROW WITH TIP RIGHTWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="drsh", -- from mathabx
+ unicodeslot=0x21B3,
+ },
+ [0x21B4]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH CORNER DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21B4,
+ },
+ [0x21B5]={
+ adobename="carriagereturn",
+ contextname="carriagereturn",
+ category="so",
+ description="DOWNWARDS ARROW WITH CORNER LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21B5,
+ },
+ [0x21B6]={
+ category="so",
+ description="ANTICLOCKWISE TOP SEMICIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="curvearrowleft",
+ unicodeslot=0x21B6,
+ },
+ [0x21B7]={
+ category="so",
+ description="CLOCKWISE TOP SEMICIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="curvearrowright",
+ unicodeslot=0x21B7,
+ },
+ [0x21B8]={
+ category="so",
+ cjkwd="a",
+ description="NORTH WEST ARROW TO LONG BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21B8,
+ },
+ [0x21B9]={
+ category="so",
+ cjkwd="a",
+ description="LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21B9,
+ },
+ [0x21BA]={
+ category="so",
+ description="ANTICLOCKWISE OPEN CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="circlearrowright",
+ unicodeslot=0x21BA,
+ },
+ [0x21BB]={
+ category="so",
+ description="CLOCKWISE OPEN CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="circlearrowleft",
+ unicodeslot=0x21BB,
+ },
+ [0x21BC]={
+ category="so",
+ description="LEFTWARDS HARPOON WITH BARB UPWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftharpoonup",
+ unicodeslot=0x21BC,
+ },
+ [0x21BD]={
+ category="so",
+ description="LEFTWARDS HARPOON WITH BARB DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftharpoondown",
+ unicodeslot=0x21BD,
+ },
+ [0x21BE]={
+ category="so",
+ description="UPWARDS HARPOON WITH BARB RIGHTWARDS",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation", name="upharpoonright" },
+ { class="relation", name="restriction" },
+ },
+ unicodeslot=0x21BE,
+ },
+ [0x21BF]={
+ category="so",
+ description="UPWARDS HARPOON WITH BARB LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="upharpoonleft",
+ unicodeslot=0x21BF,
+ },
+ [0x21C0]={
+ category="so",
+ description="RIGHTWARDS HARPOON WITH BARB UPWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rightharpoonup",
+ unicodeslot=0x21C0,
+ },
+ [0x21C1]={
+ category="so",
+ description="RIGHTWARDS HARPOON WITH BARB DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rightharpoondown",
+ unicodeslot=0x21C1,
+ },
+ [0x21C2]={
+ category="so",
+ description="DOWNWARDS HARPOON WITH BARB RIGHTWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="downharpoonright",
+ unicodeslot=0x21C2,
+ },
+ [0x21C3]={
+ category="so",
+ description="DOWNWARDS HARPOON WITH BARB LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="downharpoonleft",
+ unicodeslot=0x21C3,
+ },
+ [0x21C4]={
+ category="so",
+ description="RIGHTWARDS ARROW OVER LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rightleftarrows",
+ unicodeslot=0x21C4,
+ },
+ [0x21C5]={
+ category="so",
+ description="UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="updownarrows",
+ unicodeslot=0x21C5,
+ },
+ [0x21C6]={
+ category="so",
+ description="LEFTWARDS ARROW OVER RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftrightarrows",
+ unicodeslot=0x21C6,
+ },
+ [0x21C7]={
+ category="so",
+ description="LEFTWARDS PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftleftarrows",
+ unicodeslot=0x21C7,
+ },
+ [0x21C8]={
+ category="so",
+ description="UPWARDS PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="upuparrows",
+ unicodeslot=0x21C8,
+ },
+ [0x21C9]={
+ category="so",
+ description="RIGHTWARDS PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rightrightarrows",
+ unicodeslot=0x21C9,
+ },
+ [0x21CA]={
+ category="so",
+ description="DOWNWARDS PAIRED ARROWS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="downdownarrows",
+ unicodeslot=0x21CA,
+ },
+ [0x21CB]={
+ category="so",
+ description="LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftrightharpoons",
+ unicodeslot=0x21CB,
+ },
+ [0x21CC]={
+ category="so",
+ description="RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rightleftharpoons",
+ unicodeslot=0x21CC,
+ },
+ [0x21CD]={
+ category="so",
+ description="LEFTWARDS DOUBLE ARROW WITH STROKE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nLeftarrow",
+ specials={ "char", 0x21D0, 0x0338 },
+ unicodeslot=0x21CD,
+ },
+ [0x21CE]={
+ category="sm",
+ description="LEFT RIGHT DOUBLE ARROW WITH STROKE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nLeftrightarrow",
+ specials={ "char", 0x21D4, 0x0338 },
+ unicodeslot=0x21CE,
+ },
+ [0x21CF]={
+ category="sm",
+ description="RIGHTWARDS DOUBLE ARROW WITH STROKE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nRightarrow",
+ specials={ "char", 0x21D2, 0x0338 },
+ unicodeslot=0x21CF,
+ },
+ [0x21D0]={
+ adobename="arrowdblleft",
+ category="so",
+ description="LEFTWARDS DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Leftarrow",
+ unicodeslot=0x21D0,
+ },
+ [0x21D1]={
+ adobename="arrowdblup",
+ category="so",
+ description="UPWARDS DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Uparrow",
+ unicodeslot=0x21D1,
+ },
+ [0x21D2]={
+ adobename="arrowdblright",
+ category="sm",
+ cjkwd="a",
+ description="RIGHTWARDS DOUBLE ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="Rightarrow",
+ unicodeslot=0x21D2,
+ },
+ [0x21D3]={
+ adobename="arrowdbldown",
+ category="so",
+ description="DOWNWARDS DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Downarrow",
+ unicodeslot=0x21D3,
+ },
+ [0x21D4]={
+ adobename="arrowdblboth",
+ category="sm",
+ cjkwd="a",
+ description="LEFT RIGHT DOUBLE ARROW",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="Leftrightarrow",
+ unicodeslot=0x21D4,
+ },
+ [0x21D5]={
+ category="so",
+ description="UP DOWN DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Updownarrow",
+ unicodeslot=0x21D5,
+ },
+ [0x21D6]={
+ category="so",
+ description="NORTH WEST DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Nwarrow",
+ unicodeslot=0x21D6,
+ },
+ [0x21D7]={
+ category="so",
+ description="NORTH EAST DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Nearrow",
+ unicodeslot=0x21D7,
+ },
+ [0x21D8]={
+ category="so",
+ description="SOUTH EAST DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Searrow",
+ unicodeslot=0x21D8,
+ },
+ [0x21D9]={
+ category="so",
+ description="SOUTH WEST DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Swarrow",
+ unicodeslot=0x21D9,
+ },
+ [0x21DA]={
+ category="so",
+ description="LEFTWARDS TRIPLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Lleftarrow",
+ unicodeslot=0x21DA,
+ },
+ [0x21DB]={
+ category="so",
+ description="RIGHTWARDS TRIPLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Rrightarrow",
+ unicodeslot=0x21DB,
+ },
+ [0x21DC]={
+ category="so",
+ description="LEFTWARDS SQUIGGLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftsquigarrow",
+ unicodeslot=0x21DC,
+ },
+ [0x21DD]={
+ category="so",
+ description="RIGHTWARDS SQUIGGLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation",name="rightsquigarrow" },
+ { class="relation",name="leadsto" },
+ },
+ unicodeslot=0x21DD,
+ },
+ [0x21DE]={
+ category="so",
+ description="UPWARDS ARROW WITH DOUBLE STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21DE,
+ },
+ [0x21DF]={
+ category="so",
+ description="DOWNWARDS ARROW WITH DOUBLE STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21DF,
+ },
+ [0x21E0]={
+ category="so",
+ description="LEFTWARDS DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dashleftarrow",
+ unicodeslot=0x21E0,
+ },
+ [0x21E1]={
+ category="so",
+ description="UPWARDS DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dashuparrow",
+ unicodeslot=0x21E1,
+ },
+ [0x21E2]={
+ category="so",
+ description="RIGHTWARDS DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation", name="dashrightarrow" } ,
+ { class="relation", name="dasharrow" } ,
+ },
+ unicodeslot=0x21E2,
+ },
+ [0x21E3]={
+ category="so",
+ description="DOWNWARDS DASHED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dashdownarrow",
+ unicodeslot=0x21E3,
+ },
+ [0x21E4]={
+ category="so",
+ description="LEFTWARDS ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21E4,
+ },
+ [0x21E5]={
+ category="so",
+ description="RIGHTWARDS ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21E5,
+ },
+ [0x21E6]={
+ category="so",
+ description="LEFTWARDS WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21E6,
+ },
+ [0x21E7]={
+ category="so",
+ cjkwd="a",
+ description="UPWARDS WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21E7,
+ },
+ [0x21E8]={
+ category="so",
+ description="RIGHTWARDS WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21E8,
+ },
+ [0x21E9]={
+ category="so",
+ description="DOWNWARDS WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21E9,
+ },
+ [0x21EA]={
+ category="so",
+ description="UPWARDS WHITE ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21EA,
+ },
+ [0x21EB]={
+ category="so",
+ description="UPWARDS WHITE ARROW ON PEDESTAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21EB,
+ },
+ [0x21EC]={
+ category="so",
+ description="UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21EC,
+ },
+ [0x21ED]={
+ category="so",
+ description="UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21ED,
+ },
+ [0x21EE]={
+ category="so",
+ description="UPWARDS WHITE DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21EE,
+ },
+ [0x21EF]={
+ category="so",
+ description="UPWARDS WHITE DOUBLE ARROW ON PEDESTAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21EF,
+ },
+ [0x21F0]={
+ category="so",
+ description="RIGHTWARDS WHITE ARROW FROM WALL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F0,
+ },
+ [0x21F1]={
+ category="so",
+ description="NORTH WEST ARROW TO CORNER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F1,
+ },
+ [0x21F2]={
+ category="so",
+ description="SOUTH EAST ARROW TO CORNER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F2,
+ },
+ [0x21F3]={
+ category="so",
+ description="UP DOWN WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F3,
+ },
+ [0x21F4]={
+ category="sm",
+ description="RIGHT ARROW WITH SMALL CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F4,
+ },
+ [0x21F5]={
+ category="sm",
+ description="DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F5,
+ },
+ [0x21F6]={
+ category="sm",
+ description="THREE RIGHTWARDS ARROWS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F6,
+ },
+ [0x21F7]={
+ category="sm",
+ description="LEFTWARDS ARROW WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F7,
+ },
+ [0x21F8]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F8,
+ },
+ [0x21F9]={
+ category="sm",
+ description="LEFT RIGHT ARROW WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21F9,
+ },
+ [0x21FA]={
+ category="sm",
+ description="LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21FA,
+ },
+ [0x21FB]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21FB,
+ },
+ [0x21FC]={
+ category="sm",
+ description="LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x21FC,
+ },
+ [0x21FD]={
+ category="sm",
+ description="LEFTWARDS OPEN-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftarrowtriangle",
+ unicodeslot=0x21FD,
+ },
+ [0x21FE]={
+ category="sm",
+ description="RIGHTWARDS OPEN-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rightarrowtriangle",
+ unicodeslot=0x21FE,
+ },
+ [0x21FF]={
+ category="sm",
+ description="LEFT RIGHT OPEN-HEADED ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leftrightarrowtriangle",
+ unicodeslot=0x21FF,
+ },
+ [0x2200]={
+ adobename="universal",
+ category="sm",
+ cjkwd="a",
+ description="FOR ALL",
+ direction="on",
+ linebreak="ai",
+ mathclass="ord",
+ mathname="forall",
+ unicodeslot=0x2200,
+ },
+ [0x2201]={
+ category="sm",
+ description="COMPLEMENT",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="complement",
+ unicodeslot=0x2201,
+ },
+ [0x2202]={
+ adobename="partialdiff",
+ category="sm",
+ cjkwd="a",
+ description="PARTIAL DIFFERENTIAL",
+ direction="on",
+ linebreak="ai",
+ mathclass="default",
+ mathname="partial",
+ unicodeslot=0x2202,
+ },
+ [0x2203]={
+ adobename="existential",
+ category="sm",
+ cjkwd="a",
+ description="THERE EXISTS",
+ direction="on",
+ linebreak="ai",
+ mathclass="ord",
+ mathname="exists",
+ unicodeslot=0x2203,
+ },
+ [0x2204]={
+ category="sm",
+ description="THERE DOES NOT EXIST",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="nexists",
+ specials={ "char", 0x2203, 0x0338 },
+ unicodeslot=0x2204,
+ },
+ [0x2205]={
+ adobename="emptyset",
+ category="sm",
+ description="EMPTY SET",
+ direction="on",
+ linebreak="al",
+ mathclass="default",
+ mathname="emptyset",
+ unicodeslot=0x2205,
+ },
+ [0x2206]={
+ adobename="Delta",
+ category="sm",
+ description="INCREMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2206,
+ },
+ [0x2207]={
+ adobename="gradient",
+ category="sm",
+ cjkwd="a",
+ description="NABLA",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2207,
+ },
+ [0x2208]={
+ adobename="element",
+ category="sm",
+ cjkwd="a",
+ description="ELEMENT OF",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="in",
+ mirror=0x220B,
+ unicodeslot=0x2208,
+ },
+ [0x2209]={
+ adobename="notelement",
+ category="sm",
+ description="NOT AN ELEMENT OF",
+ direction="on",
+ linebreak="al",
+ mirror=0x220C,
+ mathclass="relation",
+ mathname="nin",
+ specials={ "char", 0x2208, 0x0338 },
+ unicodeslot=0x2209,
+ },
+ [0x220A]={
+ category="sm",
+ description="SMALL ELEMENT OF",
+ direction="on",
+ linebreak="al",
+ mirror=0x220D,
+ unicodeslot=0x220A,
+ },
+ [0x220B]={
+ adobename="suchthat",
+ category="sm",
+ cjkwd="a",
+ description="CONTAINS AS MEMBER",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="relation", name="ni" },
+ { class="relation", name="owns" },
+ },
+ mirror=0x2208,
+ unicodeslot=0x220B,
+ },
+ [0x220C]={
+ category="sm",
+ description="DOES NOT CONTAIN AS MEMBER",
+ direction="on",
+ linebreak="al",
+ mirror=0x2209,
+ specials={ "char", 0x220B, 0x0338 },
+ mathspec={
+ { class="relation", name="nni" },
+ { class="relation", name="nowns" },
+ },
+ unicodeslot=0x220C,
+ },
+ [0x220D]={
+ category="sm",
+ description="SMALL CONTAINS AS MEMBER",
+ direction="on",
+ linebreak="al",
+ mirror=0x220A,
+ unicodeslot=0x220D,
+ },
+ [0x220E]={
+ category="sm",
+ description="END OF PROOF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x220E,
+ },
+ [0x220F]={
+ adobename="product",
+ category="sm",
+ cjkwd="a",
+ description="N-ARY PRODUCT",
+ direction="on",
+ linebreak="ai",
+ mathclass="limop",
+ mathname="prod",
+ unicodeslot=0x220F,
+ },
+[0x2210]={
+ category="sm",
+ description="N-ARY COPRODUCT",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="coprod",
+ unicodeslot=0x2210,
+ },
+ [0x2211]={
+ adobename="summation",
+ category="sm",
+ cjkwd="a",
+ description="N-ARY SUMMATION",
+ direction="on",
+ linebreak="ai",
+ mathclass="limop",
+ mathname="sum",
+ unicodeslot=0x2211,
+ },
+ [0x2212]={
+ adobename="minus",
+ category="sm",
+ description="MINUS SIGN",
+ direction="es",
+ linebreak="pr",
+ mathclass="binary",
+ unicodeslot=0x2212,
+ },
+ [0x2213]={
+ category="sm",
+ description="MINUS-OR-PLUS SIGN",
+ direction="et",
+ linebreak="pr",
+ mathclass="binary",
+ mathname="mp",
+ unicodeslot=0x2213,
+ },
+ [0x2214]={
+ category="sm",
+ description="DOT PLUS",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="dotplus",
+ unicodeslot=0x2214,
+ },
+ [0x2215]={
+ category="sm",
+ cjkwd="a",
+ description="DIVISION SLASH",
+ direction="on",
+ linebreak="ai",
+ --~ mathclass="ord",
+ --~ mathname="diagup",
+ mirror=0x29F5,
+ unicodeslot=0x2215,
+ },
+ -- AM: diagup and diagdown are mapped to 2215 and 2216 by Tralics,
+ -- but ams uses different symbols for setminus and diagdown.
+ [0x2216]={
+ category="sm",
+ description="SET MINUS",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="binary", name="setminus" },
+ --~ { class="ord", name="diagdown" },
+ },
+ unicodeslot=0x2216,
+ },
+ [0x2217]={
+ adobename="asteriskmath",
+ category="sm",
+ description="ASTERISK OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="ast",
+ unicodeslot=0x2217,
+ },
+ [0x2218]={
+ category="sm",
+ description="RING OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="circ",
+ unicodeslot=0x2218,
+ },
+ [0x2219]={
+ category="sm",
+ description="BULLET OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="bullet",
+ unicodeslot=0x2219,
+ },
+ [0x221A]={
+ adobename="radical",
+ category="sm",
+ cjkwd="a",
+ description="SQUARE ROOT",
+ direction="on",
+ linebreak="ai",
+ mathclass="radical",
+ mathname="surd",
+ unicodeslot=0x221A,
+ },
+ [0x221B]={
+ category="sm",
+ description="CUBE ROOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x221B,
+ },
+ [0x221C]={
+ category="sm",
+ description="FOURTH ROOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x221C,
+ },
+ [0x221D]={
+ adobename="proportional",
+ category="sm",
+ cjkwd="a",
+ description="PROPORTIONAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="propto",
+ unicodeslot=0x221D,
+ },
+ [0x221E]={
+ adobename="infinity",
+ category="sm",
+ cjkwd="a",
+ description="INFINITY",
+ direction="on",
+ linebreak="ai",
+ mathclass="default",
+ mathname="infty",
+ unicodeslot=0x221E,
+ },
+ [0x221F]={
+ adobename="orthogonal",
+ category="sm",
+ cjkwd="a",
+ description="RIGHT ANGLE",
+ direction="on",
+ mathclass="ord",
+ mathname="rightangle",
+ linebreak="ai",
+ unicodeslot=0x221F,
+ },
+ [0x2220]={
+ adobename="angle",
+ category="sm",
+ cjkwd="a",
+ description="ANGLE",
+ direction="on",
+ linebreak="ai",
+ mathclass="ord",
+ mathname="angle",
+ unicodeslot=0x2220,
+ },
+ [0x2221]={
+ category="sm",
+ description="MEASURED ANGLE",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="measuredangle",
+ unicodeslot=0x2221,
+ },
+ [0x2222]={
+ category="sm",
+ description="SPHERICAL ANGLE",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="sphericalangle",
+ unicodeslot=0x2222,
+ },
+ [0x2223]={
+ category="sm",
+ cjkwd="a",
+ description="DIVIDES",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="divides",
+ unicodeslot=0x2223,
+ },
+ [0x2224]={
+ category="sm",
+ description="DOES NOT DIVIDE",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x2223, 0x0338 },
+ mathspec={
+ { class="binary", name="ndivides", },
+ { class="relation", name="nmid", },
+ },
+ unicodeslot=0x2224,
+ },
+ [0x2225]={
+ category="sm",
+ cjkwd="a",
+ description="PARALLEL TO",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="relation", name="parallel" },
+ { class="delimiter", name="Vert" },
+ { class="nothing", name="Arrowvert" },
+ { class="open", name="lVert" },
+ { class="close", name="rVert" },
+ },
+ unicodeslot=0x2225,
+ },
+ [0x2226]={
+ category="sm",
+ description="NOT PARALLEL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nparallel",
+ specials={ "char", 0x2225, 0x0338 },
+ unicodeslot=0x2226,
+ },
+ [0x2227]={
+ adobename="logicaland",
+ category="sm",
+ cjkwd="a",
+ description="LOGICAL AND",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="binary", name="wedge" },
+ { class="binary", name="land" },
+ },
+ unicodeslot=0x2227,
+ },
+ [0x2228]={
+ adobename="logicalor",
+ category="sm",
+ cjkwd="a",
+ description="LOGICAL OR",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="bin",name="vee" },
+ { class="bin",name="lor" },
+ },
+ unicodeslot=0x2228,
+ },
+ [0x2229]={
+ adobename="intersection",
+ category="sm",
+ cjkwd="a",
+ description="INTERSECTION",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="cap",
+ unicodeslot=0x2229,
+ },
+ [0x222A]={
+ adobename="union",
+ category="sm",
+ cjkwd="a",
+ description="UNION",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="cup",
+ unicodeslot=0x222A,
+ },
+ [0x222B]={
+ adobename="integral",
+ category="sm",
+ cjkwd="a",
+ description="INTEGRAL",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="nothing", name="intop" },
+ { class="limop" , name="int" },
+ },
+ unicodeslot=0x222B,
+ },
+ [0x222C]={
+ category="sm",
+ cjkwd="a",
+ description="DOUBLE INTEGRAL",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x222B, 0x222B },
+ mathspec={
+ { class="nothing", name="iintop" },
+ { class="limop" , name="iint" },
+ },
+ unicodeslot=0x222C,
+ },
+ [0x222D]={
+ category="sm",
+ description="TRIPLE INTEGRAL",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x222B, 0x222B, 0x222B },
+ mathspec={
+ { class="nothing", name="iiintop" },
+ { class="limop" , name="iiint" },
+ },
+ unicodeslot=0x222D,
+ },
+ [0x222E]={
+ category="sm",
+ cjkwd="a",
+ description="CONTOUR INTEGRAL",
+ direction="on",
+ linebreak="ai",
+ mathclass="limop",
+ mathname="oint",
+ unicodeslot=0x222E,
+ },
+ [0x222F]={
+ category="sm",
+ description="SURFACE INTEGRAL",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="oiint",
+ specials={ "compat", 0x222E, 0x222E },
+ unicodeslot=0x222F,
+ },
+ [0x2230]={
+ category="sm",
+ description="VOLUME INTEGRAL",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="oiiint",
+ specials={ "compat", 0x222E, 0x222E, 0x222E },
+ unicodeslot=0x2230,
+ },
+ [0x2231]={
+ category="sm",
+ description="CLOCKWISE INTEGRAL",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="intclockwise",
+ unicodeslot=0x2231,
+ },
+ [0x2232]={
+ category="sm",
+ description="CLOCKWISE CONTOUR INTEGRAL",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="ointclockwise",
+ unicodeslot=0x2232,
+ },
+ [0x2233]={
+ category="sm",
+ description="ANTICLOCKWISE CONTOUR INTEGRAL",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="ointctrclockwise",
+ unicodeslot=0x2233,
+ },
+ [0x2234]={
+ adobename="therefore",
+ category="sm",
+ cjkwd="a",
+ description="THEREFORE",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="therefore",
+ unicodeslot=0x2234,
+ },
+ [0x2235]={
+ category="sm",
+ cjkwd="a",
+ description="BECAUSE",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="because",
+ unicodeslot=0x2235,
+ },
+ [0x2236]={
+ category="sm",
+ cjkwd="a",
+ description="RATIO",
+ direction="on",
+ linebreak="ai",
+ mathclass="punctuation",
+ mathname="colon",
+ unicodeslot=0x2236,
+ },
+ [0x2237]={
+ category="sm",
+ cjkwd="a",
+ description="PROPORTION",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="squaredots",
+ unicodeslot=0x2237,
+ },
+ [0x2238]={
+ category="sm",
+ description="DOT MINUS",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="dotminus",
+ unicodeslot=0x2238,
+ },
+ [0x2239]={
+ category="sm",
+ description="EXCESS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="minuscolon",
+ unicodeslot=0x2239,
+ },
+ [0x223A]={
+ category="sm",
+ description="GEOMETRIC PROPORTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x223A,
+ },
+ [0x223B]={
+ category="sm",
+ description="HOMOTHETIC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x223B,
+ },
+ [0x223C]={
+ adobename="similar",
+ category="sm",
+ cjkwd="a",
+ description="TILDE OPERATOR",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="sim",
+ mirror=0x223D,
+ unicodeslot=0x223C,
+ },
+ [0x223D]={
+ category="sm",
+ cjkwd="a",
+ description="REVERSED TILDE",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="backsim",
+ mirror=0x223C,
+ unicodeslot=0x223D,
+ },
+ [0x223E]={
+ category="sm",
+ description="INVERTED LAZY S",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x223E,
+ },
+ [0x223F]={
+ category="sm",
+ description="SINE WAVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x223F,
+ },
+ [0x2240]={
+ category="sm",
+ description="WREATH PRODUCT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="wr",
+ unicodeslot=0x2240,
+ },
+ [0x2241]={
+ category="sm",
+ description="NOT TILDE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nsim",
+ specials={ "char", 0x223C, 0x0338 },
+ unicodeslot=0x2241,
+ },
+ [0x2242]={
+ category="sm",
+ description="MINUS TILDE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="eqsim",
+ unicodeslot=0x2242,
+ },
+ [0x2243]={
+ category="sm",
+ description="ASYMPTOTICALLY EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="simeq",
+ mirror=0x22CD,
+ unicodeslot=0x2243,
+ },
+ [0x2244]={
+ category="sm",
+ description="NOT ASYMPTOTICALLY EQUAL TO",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x2243, 0x0338 },
+ mathclass="relation",
+ mathname="nsimeq",
+ unicodeslot=0x2244,
+ },
+ [0x2245]={
+ adobename="congruent",
+ category="sm",
+ description="APPROXIMATELY EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation", name="approxEq"},
+ { class="relation", name="cong"},
+ },
+ unicodeslot=0x2245,
+ },
+ [0x2246]={
+ category="sm",
+ description="APPROXIMATELY BUT NOT ACTUALLY EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation", name="napproxEq"},
+ { class="relation", name="ncong"},
+ },
+ unicodeslot=0x2246,
+ },
+ [0x2247]={
+ category="sm",
+ description="NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="approxnEq",
+ specials={ "char", 0x2245, 0x0338 },
+ unicodeslot=0x2247,
+ },
+ [0x2248]={
+ adobename="approxequal",
+ category="sm",
+ cjkwd="a",
+ description="ALMOST EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="approx",
+ unicodeslot=0x2248,
+ },
+ [0x2249]={
+ category="sm",
+ description="NOT ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="napprox",
+ specials={ "char", 0x2248, 0x0338 },
+ unicodeslot=0x2249,
+ },
+ [0x224A]={
+ category="sm",
+ description="ALMOST EQUAL OR EQUAL TO",
+ direction="on",
+ mathclass="relation",
+ mathname="approxeq",
+ linebreak="al",
+ unicodeslot=0x224A,
+ },
+ [0x224B]={
+ category="sm",
+ description="TRIPLE TILDE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x224B,
+ },
+ [0x224C]={
+ category="sm",
+ cjkwd="a",
+ description="ALL EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ unicodeslot=0x224C,
+ },
+ [0x224D]={
+ category="sm",
+ description="EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="asymp",
+ unicodeslot=0x224D,
+ },
+ [0x224E]={
+ category="sm",
+ description="GEOMETRICALLY EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Bumpeq",
+ unicodeslot=0x224E,
+ },
+ [0x224F]={
+ category="sm",
+ description="DIFFERENCE BETWEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x224F,
+ },
+ [0x2250]={
+ category="sm",
+ description="APPROACHES THE LIMIT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2250,
+ },
+ [0x2251]={
+ category="sm",
+ description="GEOMETRICALLY EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation", name="doteqdot" },
+ { class="relation", name="Doteq" },
+ },
+ unicodeslot=0x2251,
+ },
+ [0x2252]={
+ category="sm",
+ cjkwd="a",
+ description="APPROXIMATELY EQUAL TO OR THE IMAGE OF",
+ direction="on",
+ linebreak="ai",
+ mirror=0x2253,
+ mathclass="relation",
+ mathname="fallingdotseq",
+ unicodeslot=0x2252,
+ },
+ [0x2253]={
+ category="sm",
+ description="IMAGE OF OR APPROXIMATELY EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x2252,
+ mathclass="relation",
+ mathname="risingdotseq",
+ unicodeslot=0x2253,
+ },
+ [0x2254]={
+ category="sm",
+ description="COLON EQUALS",
+ direction="on",
+ linebreak="al",
+ mirror=0x2255,
+ mathclass="relation",
+ mathname="colonequals",
+ unicodeslot=0x2254,
+ },
+ [0x2255]={
+ category="sm",
+ description="EQUALS COLON",
+ direction="on",
+ linebreak="al",
+ mirror=0x2254,
+ mathclass="relation",
+ mathname="equalscolon",
+ unicodeslot=0x2255,
+ },
+ [0x2256]={
+ category="sm",
+ description="RING IN EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="eqcirc",
+ unicodeslot=0x2256,
+ },
+ [0x2257]={
+ category="sm",
+ description="RING EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="circeq",
+ unicodeslot=0x2257,
+ },
+ [0x2258]={
+ category="sm",
+ description="CORRESPONDS TO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2258,
+ },
+ [0x2259]={
+ category="sm",
+ description="ESTIMATES",
+ direction="on",
+ fallback=[[\buildrel\wedge\over=]],
+ linebreak="al",
+ unicodeslot=0x2259,
+ mathclass="relation",
+ mathname="wedgeeq",
+ },
+ [0x225A]={
+ category="sm",
+ description="EQUIANGULAR TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="veeeq",
+ unicodeslot=0x225A,
+ },
+ [0x225B]={
+ category="sm",
+ description="STAR EQUALS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="stareq",
+ unicodeslot=0x225B,
+ },
+ [0x225C]={
+ category="sm",
+ description="DELTA EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="triangleq",
+ unicodeslot=0x225C,
+ },
+ [0x225D]={
+ category="sm",
+ description="EQUAL TO BY DEFINITION",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="definedeq",
+ unicodeslot=0x225D,
+ },
+ [0x225E]={
+ category="sm",
+ description="MEASURED BY",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="measuredeq",
+ unicodeslot=0x225E,
+ },
+ [0x225F]={
+ category="sm",
+ description="QUESTIONED EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="questionedeq",
+ unicodeslot=0x225F,
+ },
+ [0x2260]={
+ adobename="notequal",
+ category="sm",
+ cjkwd="a",
+ description="NOT EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="relation", name="neq" },
+ { class="relation", name="ne" },
+ },
+ specials={ "char", 0x003D, 0x0338 },
+ unicodeslot=0x2260,
+ },
+ [0x2261]={
+ adobename="equivalence",
+ category="sm",
+ cjkwd="a",
+ description="IDENTICAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="equiv",
+ unicodeslot=0x2261,
+ },
+ [0x2262]={
+ category="sm",
+ description="NOT IDENTICAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nequiv",
+ specials={ "char", 0x2261, 0x0338 },
+ unicodeslot=0x2262,
+ },
+ [0x2263]={
+ category="sm",
+ description="STRICTLY EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2263,
+ },
+ [0x2264]={
+ adobename="lessequal",
+ category="sm",
+ cjkwd="a",
+ description="LESS-THAN OR EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="relation", name="leq" },
+ { class="relation", name="le" },
+ },
+ mirror=0x2265,
+ unicodeslot=0x2264,
+ },
+ [0x2265]={
+ adobename="greaterequal",
+ category="sm",
+ cjkwd="a",
+ description="GREATER-THAN OR EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="relation", name="geq" },
+ { class="relation", name="ge" },
+ },
+ mirror=0x2264,
+ unicodeslot=0x2265,
+ },
+ [0x2266]={
+ category="sm",
+ cjkwd="a",
+ description="LESS-THAN OVER EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="leqq",
+ mirror=0x2267,
+ unicodeslot=0x2266,
+ },
+ [0x2267]={
+ category="sm",
+ cjkwd="a",
+ description="GREATER-THAN OVER EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="geqq",
+ mirror=0x2266,
+ unicodeslot=0x2267,
+ },
+ [0x2268]={
+ category="sm",
+ description="LESS-THAN BUT NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lneqq",
+ mirror=0x2269,
+ unicodeslot=0x2268,
+ },
+ [0x2269]={
+ category="sm",
+ description="GREATER-THAN BUT NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="gneqq",
+ mirror=0x2268,
+ unicodeslot=0x2269,
+ },
+ [0x226A]={
+ category="sm",
+ cjkwd="a",
+ description="MUCH LESS-THAN",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="ll",
+ mirror=0x226B,
+ unicodeslot=0x226A,
+ },
+ [0x226B]={
+ category="sm",
+ cjkwd="a",
+ description="MUCH GREATER-THAN",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="gg",
+ mirror=0x226A,
+ unicodeslot=0x226B,
+ },
+ [0x226C]={
+ category="sm",
+ description="BETWEEN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="between",
+ unicodeslot=0x226C,
+ },
+ [0x226D]={
+ category="sm",
+ description="NOT EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nasymp",
+ specials={ "char", 0x224D, 0x0338 },
+ unicodeslot=0x226D,
+ },
+ [0x226E]={
+ category="sm",
+ cjkwd="a",
+ description="NOT LESS-THAN",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="nless",
+ mirror=0x226F,
+ specials={ "char", 0x003C, 0x0338 },
+ unicodeslot=0x226E,
+ },
+ [0x226F]={
+ category="sm",
+ cjkwd="a",
+ description="NOT GREATER-THAN",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="ngtr",
+ mirror=0x226E,
+ specials={ "char", 0x003E, 0x0338 },
+ unicodeslot=0x226F,
+ },
+ [0x2270]={
+ category="sm",
+ description="NEITHER LESS-THAN NOR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nleq",
+ mirror=0x2271,
+ specials={ "char", 0x2264, 0x0338 },
+ unicodeslot=0x2270,
+ },
+ [0x2271]={
+ category="sm",
+ description="NEITHER GREATER-THAN NOR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="ngeq",
+ mirror=0x2270,
+ specials={ "char", 0x2265, 0x0338 },
+ unicodeslot=0x2271,
+ },
+ [0x2272]={
+ category="sm",
+ description="LESS-THAN OR EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lesssim",
+ mirror=0x2273,
+ unicodeslot=0x2272,
+ },
+ [0x2273]={
+ category="sm",
+ description="GREATER-THAN OR EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="gtrsim",
+ mirror=0x2272,
+ unicodeslot=0x2273,
+ },
+ [0x2274]={
+ category="sm",
+ description="NEITHER LESS-THAN NOR EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nlesssim",
+ mirror=0x2275,
+ specials={ "char", 0x2272, 0x0338 },
+ unicodeslot=0x2274,
+ },
+ [0x2275]={
+ category="sm",
+ description="NEITHER GREATER-THAN NOR EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="ngtrsim",
+ mirror=0x2274,
+ specials={ "char", 0x2273, 0x0338 },
+ unicodeslot=0x2275,
+ },
+ [0x2276]={
+ category="sm",
+ description="LESS-THAN OR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lessgtr",
+ mirror=0x2277,
+ unicodeslot=0x2276,
+ },
+ [0x2277]={
+ category="sm",
+ description="GREATER-THAN OR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="gtrless",
+ mirror=0x2276,
+ unicodeslot=0x2277,
+ },
+ [0x2278]={
+ category="sm",
+ description="NEITHER LESS-THAN NOR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nlessgtr",
+ mirror=0x2279,
+ specials={ "char", 0x2276, 0x0338 },
+ unicodeslot=0x2278,
+ },
+ [0x2279]={
+ category="sm",
+ description="NEITHER GREATER-THAN NOR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="ngtrless",
+ mirror=0x2278,
+ specials={ "char", 0x2277, 0x0338 },
+ unicodeslot=0x2279,
+ },
+ [0x227A]={
+ category="sm",
+ description="PRECEDES",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="prec",
+ mirror=0x227B,
+ unicodeslot=0x227A,
+ },
+ [0x227B]={
+ category="sm",
+ description="SUCCEEDS",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succ",
+ mirror=0x227A,
+ unicodeslot=0x227B,
+ },
+ [0x227C]={
+ category="sm",
+ description="PRECEDES OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="preccurlyeq",
+ mirror=0x227D,
+ unicodeslot=0x227C,
+ },
+ [0x227D]={
+ category="sm",
+ description="SUCCEEDS OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succcurlyeq",
+ mirror=0x227C,
+ unicodeslot=0x227D,
+ },
+ [0x227E]={
+ category="sm",
+ description="PRECEDES OR EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="precsim",
+ mirror=0x227F,
+ unicodeslot=0x227E,
+ },
+ [0x227F]={
+ category="sm",
+ description="SUCCEEDS OR EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succsim",
+ mirror=0x227E,
+ unicodeslot=0x227F,
+ },
+ [0x2280]={
+ category="sm",
+ description="DOES NOT PRECEDE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nprec",
+ mirror=0x2281,
+ specials={ "char", 0x227A, 0x0338 },
+ unicodeslot=0x2280,
+ },
+ [0x2281]={
+ category="sm",
+ description="DOES NOT SUCCEED",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nsucc",
+ mirror=0x2280,
+ specials={ "char", 0x227B, 0x0338 },
+ unicodeslot=0x2281,
+ },
+ [0x2282]={
+ adobename="propersubset",
+ category="sm",
+ cjkwd="a",
+ description="SUBSET OF",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="subset", -- Subset
+ mirror=0x2283,
+ unicodeslot=0x2282,
+ },
+ [0x2283]={
+ adobename="propersuperset",
+ category="sm",
+ cjkwd="a",
+ description="SUPERSET OF",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="supset",
+ mirror=0x2282,
+ unicodeslot=0x2283,
+ },
+ [0x2284]={
+ adobename="notsubset",
+ category="sm",
+ description="NOT A SUBSET OF",
+ direction="on",
+ fallback=[[\not\subset]],
+ mathclass="relation",
+ mathname="nsubset",
+ linebreak="al",
+ mirror=0x2285,
+ specials={ "char", 0x2282, 0x0338 },
+ unicodeslot=0x2284,
+ },
+ [0x2285]={
+ category="sm",
+ description="NOT A SUPERSET OF",
+ direction="on",
+ fallback=[[\not\supset]],
+ linebreak="al",
+ mathclass="relation",
+ mathname="nsupset",
+ mirror=0x2284,
+ specials={ "char", 0x2283, 0x0338 },
+ unicodeslot=0x2285,
+ },
+ [0x2286]={
+ adobename="reflexsubset",
+ category="sm",
+ cjkwd="a",
+ description="SUBSET OF OR EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="subseteq",
+ mirror=0x2287,
+ unicodeslot=0x2286,
+ },
+ [0x2287]={
+ adobename="reflexsuperset",
+ category="sm",
+ cjkwd="a",
+ description="SUPERSET OF OR EQUAL TO",
+ direction="on",
+ linebreak="ai",
+ mathclass="relation",
+ mathname="supseteq",
+ mirror=0x2286,
+ unicodeslot=0x2287,
+ },
+ [0x2288]={
+ category="sm",
+ description="NEITHER A SUBSET OF NOR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nsubseteq",
+ mirror=0x2289,
+ specials={ "char", 0x2286, 0x0338 },
+ unicodeslot=0x2288,
+ },
+ [0x2289]={
+ category="sm",
+ description="NEITHER A SUPERSET OF NOR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nsupseteq",
+ mirror=0x2288,
+ specials={ "char", 0x2287, 0x0338 },
+ unicodeslot=0x2289,
+ },
+ [0x228A]={
+ category="sm",
+ description="SUBSET OF WITH NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="subsetneq",
+ mirror=0x228B,
+ unicodeslot=0x228A,
+ },
+ [0x228B]={
+ category="sm",
+ description="SUPERSET OF WITH NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="supsetneq",
+ mirror=0x228A,
+ unicodeslot=0x228B,
+ },
+ [0x228C]={
+ category="sm",
+ description="MULTISET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x228C,
+ },
+ [0x228D]={
+ category="sm",
+ description="MULTISET MULTIPLICATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x228D,
+ },
+ [0x228E]={
+ category="sm",
+ description="MULTISET UNION",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="uplus",
+ unicodeslot=0x228E,
+ },
+ [0x228F]={
+ category="sm",
+ description="SQUARE IMAGE OF",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="sqsubset",
+ mirror=0x2290,
+ unicodeslot=0x228F,
+ },
+ [0x2290]={
+ category="sm",
+ description="SQUARE ORIGINAL OF",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="sqsupset",
+ mirror=0x228F,
+ unicodeslot=0x2290,
+ },
+ [0x2291]={
+ category="sm",
+ description="SQUARE IMAGE OF OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="sqsubseteq",
+ mirror=0x2292,
+ unicodeslot=0x2291,
+ },
+ [0x2292]={
+ category="sm",
+ description="SQUARE ORIGINAL OF OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="sqsupseteq",
+ mirror=0x2291,
+ unicodeslot=0x2292,
+ },
+ [0x2293]={
+ category="sm",
+ description="SQUARE CAP",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="sqcap",
+ unicodeslot=0x2293,
+ },
+ [0x2294]={
+ category="sm",
+ description="SQUARE CUP",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="sqcup",
+ unicodeslot=0x2294,
+ },
+ [0x2295]={
+ adobename="circleplus",
+ category="sm",
+ cjkwd="a",
+ description="CIRCLED PLUS",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="oplus",
+ unicodeslot=0x2295,
+ },
+ [0x2296]={
+ category="sm",
+ description="CIRCLED MINUS",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="ominus",
+ unicodeslot=0x2296,
+ },
+ [0x2297]={
+ adobename="circlemultiply",
+ category="sm",
+ description="CIRCLED TIMES",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="otimes",
+ unicodeslot=0x2297,
+ },
+ [0x2298]={
+ category="sm",
+ description="CIRCLED DIVISION SLASH",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="oslash",
+ mirror=0x29B8,
+ unicodeslot=0x2298,
+ },
+ [0x2299]={
+ category="sm",
+ cjkwd="a",
+ description="CIRCLED DOT OPERATOR",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="odot",
+ unicodeslot=0x2299,
+ },
+ [0x229A]={
+ category="sm",
+ description="CIRCLED RING OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="circledcirc",
+ unicodeslot=0x229A,
+ },
+ [0x229B]={
+ category="sm",
+ description="CIRCLED ASTERISK OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="circledast",
+ unicodeslot=0x229B,
+ },
+ [0x229C]={
+ category="sm",
+ description="CIRCLED EQUALS",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="circledequals",
+ unicodeslot=0x229C,
+ },
+ [0x229D]={
+ category="sm",
+ description="CIRCLED DASH",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="circleddash",
+ unicodeslot=0x229D,
+ },
+ [0x229E]={
+ category="sm",
+ description="SQUARED PLUS",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="boxplus",
+ unicodeslot=0x229E,
+ },
+ [0x229F]={
+ category="sm",
+ description="SQUARED MINUS",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="boxminus",
+ unicodeslot=0x229F,
+ },
+ [0x22A0]={
+ category="sm",
+ description="SQUARED TIMES",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="boxtimes",
+ unicodeslot=0x22A0,
+ },
+ [0x22A1]={
+ category="sm",
+ description="SQUARED DOT OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="boxdot",
+ unicodeslot=0x22A1,
+ },
+ [0x22A2]={
+ category="sm",
+ description="RIGHT TACK",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="vdash",
+ mirror=0x22A3,
+ unicodeslot=0x22A2,
+ },
+ [0x22A3]={
+ category="sm",
+ description="LEFT TACK",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dashv",
+ mirror=0x22A2,
+ unicodeslot=0x22A3,
+ },
+ [0x22A4]={
+ category="sm",
+ description="DOWN TACK",
+ direction="on",
+ linebreak="al",
+ mathclass="default",
+ mathname="top",
+ unicodeslot=0x22A4,
+ },
+ [0x22A5]={
+ adobename="perpendicular",
+ category="sm",
+ cjkwd="a",
+ description="UP TACK",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="default", name="bot" },
+ { class="relation", name="perp" },
+ },
+ unicodeslot=0x22A5,
+ },
+ [0x22A6]={
+ category="sm",
+ description="ASSERTION",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ADE,
+ unicodeslot=0x22A6,
+ },
+ [0x22A7]={
+ category="sm",
+ description="MODELS",
+ direction="on",
+ linebreak="al",
+ fallback=[[\mathrel|\joinrel=]],
+ mathclass="relation",
+ mathname="models",
+ unicodeslot=0x22A7,
+ },
+ [0x22A8]={
+ category="sm",
+ description="TRUE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AE4,
+ mathclass="relation",
+ mathname="vDash",
+ unicodeslot=0x22A8,
+ },
+ [0x22A9]={
+ category="sm",
+ description="FORCES",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AE3,
+ mathclass="relation",
+ mathname="Vdash",
+ unicodeslot=0x22A9,
+ },
+ [0x22AA]={
+ category="sm",
+ description="TRIPLE VERTICAL BAR RIGHT TURNSTILE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Vvdash",
+ unicodeslot=0x22AA,
+ },
+ [0x22AB]={
+ category="sm",
+ description="DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AE5,
+ mathclass="relation",
+ mathname="VDash",
+ unicodeslot=0x22AB,
+ },
+ [0x22AC]={
+ category="sm",
+ description="DOES NOT PROVE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nvdash",
+ specials={ "char", 0x22A2, 0x0338 },
+ unicodeslot=0x22AC,
+ },
+ [0x22AD]={
+ category="sm",
+ description="NOT TRUE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nvDash",
+ specials={ "char", 0x22A8, 0x0338 },
+ unicodeslot=0x22AD,
+ },
+ [0x22AE]={
+ category="sm",
+ description="DOES NOT FORCE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nVdash",
+ specials={ "char", 0x22A9, 0x0338 },
+ unicodeslot=0x22AE,
+ },
+ [0x22AF]={
+ category="sm",
+ description="NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nVDash",
+ specials={ "char", 0x22AB, 0x0338 },
+ unicodeslot=0x22AF,
+ },
+ [0x22B0]={
+ category="sm",
+ description="PRECEDES UNDER RELATION",
+ direction="on",
+ linebreak="al",
+ mirror=0x22B1,
+ unicodeslot=0x22B0,
+ },
+ [0x22B1]={
+ category="sm",
+ description="SUCCEEDS UNDER RELATION",
+ direction="on",
+ linebreak="al",
+ mirror=0x22B0,
+ unicodeslot=0x22B1,
+ },
+ [0x22B2]={
+ category="sm",
+ description="NORMAL SUBGROUP OF",
+ direction="on",
+ linebreak="al",
+ mathclass="bin",
+ mathname="triangleleft",
+ mirror=0x22B3,
+ unicodeslot=0x22B2,
+ },
+ [0x22B3]={
+ category="sm",
+ description="CONTAINS AS NORMAL SUBGROUP",
+ direction="on",
+ linebreak="al",
+ mathclass="bin",
+ mathname="triangleright",
+ mirror=0x22B2,
+ unicodeslot=0x22B3,
+ },
+ [0x22B4]={
+ category="sm",
+ description="NORMAL SUBGROUP OF OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x22B5,
+ unicodeslot=0x22B4,
+ },
+ [0x22B5]={
+ category="sm",
+ description="CONTAINS AS NORMAL SUBGROUP OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x22B4,
+ unicodeslot=0x22B5,
+ },
+ [0x22B6]={
+ category="sm",
+ description="ORIGINAL OF",
+ direction="on",
+ linebreak="al",
+ mirror=0x22B7,
+ unicodeslot=0x22B6,
+ },
+ [0x22B7]={
+ category="sm",
+ description="IMAGE OF",
+ direction="on",
+ linebreak="al",
+ mirror=0x22B6,
+ unicodeslot=0x22B7,
+ },
+ [0x22B8]={
+ category="sm",
+ description="MULTIMAP",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="multimap",
+ unicodeslot=0x22B8,
+ },
+ [0x22B9]={
+ category="sm",
+ description="HERMITIAN CONJUGATE MATRIX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22B9,
+ },
+ [0x22BA]={
+ category="sm",
+ description="INTERCALATE",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="intercal",
+ unicodeslot=0x22BA,
+ },
+ [0x22BB]={
+ category="sm",
+ description="XOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="veebar",
+ unicodeslot=0x22BB,
+ },
+ [0x22BC]={
+ category="sm",
+ description="NAND",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="barwedge",
+ unicodeslot=0x22BC,
+ },
+ [0x22BD]={
+ category="sm",
+ description="NOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22BD,
+ },
+ [0x22BE]={
+ category="sm",
+ description="RIGHT ANGLE WITH ARC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22BE,
+ },
+ [0x22BF]={
+ category="sm",
+ cjkwd="a",
+ description="RIGHT TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x22BF,
+ },
+ [0x22C0]={
+ category="sm",
+ description="N-ARY LOGICAL AND",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigwedge",
+ unicodeslot=0x22C0,
+ },
+ [0x22C1]={
+ category="sm",
+ description="N-ARY LOGICAL OR",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigvee",
+ unicodeslot=0x22C1,
+ },
+ [0x22C2]={
+ category="sm",
+ description="N-ARY INTERSECTION",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigcap",
+ unicodeslot=0x22C2,
+ },
+ [0x22C3]={
+ category="sm",
+ description="N-ARY UNION",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigcup",
+ unicodeslot=0x22C3,
+ },
+ [0x22C4]={
+ category="sm",
+ description="DIAMOND OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="diamond",
+ unicodeslot=0x22C4,
+ },
+ [0x22C5]={
+ adobename="dotmath",
+ category="sm",
+ description="DOT OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="binary", name="cdot" },
+ { class="punctuation", name="cdotp" },
+ },
+ unicodeslot=0x22C5,
+ },
+ [0x22C6]={
+ category="sm",
+ description="STAR OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="star",
+ unicodeslot=0x22C6,
+ },
+ [0x22C7]={
+ category="sm",
+ description="DIVISION TIMES",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="divideontimes",
+ unicodeslot=0x22C7,
+ },
+ [0x22C8]={
+ category="sm",
+ description="BOWTIE",
+ direction="on",
+ linebreak="al",
+ fallback=[[\mathrel\triangleright\joinrel\mathrel\triangleleft]],
+ mathspec={
+ { class="relation", name="bowtie" },
+ { class="relation", name="Join" }, -- AM: Maybe wrong
+ },
+ unicodeslot=0x22C8,
+ },
+ [0x22C9]={
+ category="sm",
+ description="LEFT NORMAL FACTOR SEMIDIRECT PRODUCT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="ltimes",
+ mirror=0x22CA,
+ unicodeslot=0x22C9,
+ },
+ [0x22CA]={
+ category="sm",
+ description="RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="rtimes",
+ mirror=0x22C9,
+ unicodeslot=0x22CA,
+ },
+ [0x22CB]={
+ category="sm",
+ description="LEFT SEMIDIRECT PRODUCT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="leftthreetimes",
+ mirror=0x22CC,
+ unicodeslot=0x22CB,
+ },
+ [0x22CC]={
+ category="sm",
+ description="RIGHT SEMIDIRECT PRODUCT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="rightthreetimes",
+ mirror=0x22CB,
+ unicodeslot=0x22CC,
+ },
+ [0x22CD]={
+ category="sm",
+ description="REVERSED TILDE EQUALS",
+ direction="on",
+ linebreak="al",
+ mirror=0x2243,
+ unicodeslot=0x22CD,
+ },
+ [0x22CE]={
+ category="sm",
+ description="CURLY LOGICAL OR",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="curlyvee",
+ unicodeslot=0x22CE,
+ },
+ [0x22CF]={
+ category="sm",
+ description="CURLY LOGICAL AND",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="curlywedge",
+ unicodeslot=0x22CF,
+ },
+ [0x22D0]={
+ category="sm",
+ description="DOUBLE SUBSET",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Subset",
+ mirror=0x22D1,
+ unicodeslot=0x22D0,
+ },
+ [0x22D1]={
+ category="sm",
+ description="DOUBLE SUPERSET",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Supset",
+ mirror=0x22D0,
+ unicodeslot=0x22D1,
+ },
+ [0x22D2]={
+ category="sm",
+ description="DOUBLE INTERSECTION",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="binary", name="Cap" },
+ { class="binary", name="doublecap"},
+ },
+ unicodeslot=0x22D2,
+ },
+ [0x22D3]={
+ category="sm",
+ description="DOUBLE UNION",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="binary", name="Cup" },
+ { class="binary", name="doublecup"},
+ },
+ unicodeslot=0x22D3,
+ },
+ [0x22D4]={
+ category="sm",
+ description="PITCHFORK",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="pitchfork",
+ unicodeslot=0x22D4,
+ },
+ [0x22D5]={
+ category="sm",
+ description="EQUAL AND PARALLEL TO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22D5,
+ },
+ [0x22D6]={
+ category="sm",
+ description="LESS-THAN WITH DOT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="lessdot",
+ mirror=0x22D7,
+ unicodeslot=0x22D6,
+ },
+ [0x22D7]={
+ category="sm",
+ description="GREATER-THAN WITH DOT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="gtrdot",
+ mirror=0x22D6,
+ unicodeslot=0x22D7,
+ },
+ [0x22D8]={
+ category="sm",
+ description="VERY MUCH LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation", name="lll"},
+ { class="relation", name="llless"},
+ },
+ mirror=0x22D9,
+ unicodeslot=0x22D8,
+ },
+ [0x22D9]={
+ category="sm",
+ description="VERY MUCH GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mathspec={
+ { class="relation", name="ggg"},
+ { class="relation", name="gggtr"},
+ },
+ mirror=0x22D8,
+ unicodeslot=0x22D9,
+ },
+ [0x22DA]={
+ category="sm",
+ description="LESS-THAN EQUAL TO OR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x22DB,
+ mathclass="relation",
+ mathname="lesseqgtr",
+ unicodeslot=0x22DA,
+ },
+ [0x22DB]={
+ category="sm",
+ description="GREATER-THAN EQUAL TO OR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x22DA,
+ mathclass="relation",
+ mathname="gtreqless",
+ unicodeslot=0x22DB,
+ },
+ [0x22DC]={
+ category="sm",
+ description="EQUAL TO OR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="eqless",
+ mirror=0x22DD,
+ unicodeslot=0x22DC,
+ },
+ [0x22DD]={
+ category="sm",
+ description="EQUAL TO OR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="eqgtr",
+ mirror=0x22DC,
+ unicodeslot=0x22DD,
+ },
+ [0x22DE]={
+ category="sm",
+ description="EQUAL TO OR PRECEDES",
+ direction="on",
+ linebreak="al",
+ mirror=0x22DF,
+ mathclass="relation",
+ mathname="curlyeqprec",
+ unicodeslot=0x22DE,
+ },
+ [0x22DF]={
+ category="sm",
+ description="EQUAL TO OR SUCCEEDS",
+ direction="on",
+ linebreak="al",
+ mirror=0x22DE,
+ mathclass="relation",
+ mathname="curlyeqsucc",
+ unicodeslot=0x22DF,
+ },
+ [0x22E0]={
+ category="sm",
+ description="DOES NOT PRECEDE OR EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x22E1,
+ mathclass="relation",
+ mathname="npreccurlyeq",
+ specials={ "char", 0x227C, 0x0338 },
+ unicodeslot=0x22E0,
+ },
+ [0x22E1]={
+ category="sm",
+ description="DOES NOT SUCCEED OR EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x22E0,
+ mathclass="relation",
+ mathname="nsucccurlyeq",
+ specials={ "char", 0x227D, 0x0338 },
+ unicodeslot=0x22E1,
+ },
+ [0x22E2]={
+ category="sm",
+ description="NOT SQUARE IMAGE OF OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nsqsubseteq",
+ mirror=0x22E3,
+ specials={ "char", 0x2291, 0x0338 },
+ unicodeslot=0x22E2,
+ },
+ [0x22E3]={
+ category="sm",
+ description="NOT SQUARE ORIGINAL OF OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nsqsupseteq",
+ mirror=0x22E2,
+ specials={ "char", 0x2292, 0x0338 },
+ unicodeslot=0x22E3,
+ },
+ [0x22E4]={
+ category="sm",
+ description="SQUARE IMAGE OF OR NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="sqsubsetneq",
+ mirror=0x22E5,
+ unicodeslot=0x22E4,
+ },
+ [0x22E5]={
+ category="sm",
+ description="SQUARE ORIGINAL OF OR NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="sqsupsetneq",
+ mirror=0x22E4,
+ unicodeslot=0x22E5,
+ },
+ [0x22E6]={
+ category="sm",
+ description="LESS-THAN BUT NOT EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lnsim",
+ mirror=0x22E7,
+ unicodeslot=0x22E6,
+ },
+ [0x22E7]={
+ category="sm",
+ description="GREATER-THAN BUT NOT EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="gnsim",
+ mirror=0x22E6,
+ unicodeslot=0x22E7,
+ },
+ [0x22E8]={
+ category="sm",
+ description="PRECEDES BUT NOT EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="precnsim",
+ mirror=0x22E9,
+ unicodeslot=0x22E8,
+ },
+ [0x22E9]={
+ category="sm",
+ description="SUCCEEDS BUT NOT EQUIVALENT TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succnsim",
+ mirror=0x22E8,
+ unicodeslot=0x22E9,
+ },
+ [0x22EA]={
+ category="sm",
+ description="NOT NORMAL SUBGROUP OF",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="ntriangleright",
+ mirror=0x22EB,
+ specials={ "char", 0x22B2, 0x0338 },
+ unicodeslot=0x22EA,
+ },
+ [0x22EB]={
+ category="sm",
+ description="DOES NOT CONTAIN AS NORMAL SUBGROUP",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="ntriangleleft",
+ mirror=0x22EA,
+ specials={ "char", 0x22B3, 0x0338 },
+ unicodeslot=0x22EB,
+ },
+ [0x22EC]={
+ category="sm",
+ description="NOT NORMAL SUBGROUP OF OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="ntrianglelefteq",
+ mirror=0x22ED,
+ specials={ "char", 0x22B4, 0x0338 },
+ unicodeslot=0x22EC,
+ },
+ [0x22ED]={
+ category="sm",
+ description="DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="ntrianglerighteq",
+ mirror=0x22EC,
+ specials={ "char", 0x22B5, 0x0338 },
+ unicodeslot=0x22ED,
+ },
+ [0x22EE]={
+ category="sm",
+ description="VERTICAL ELLIPSIS",
+ direction="on",
+ linebreak="al",
+ mathclass="inner",
+ mathname="vdots",
+ unicodeslot=0x22EE,
+ },
+ [0x22EF]={
+ category="sm",
+ description="MIDLINE HORIZONTAL ELLIPSIS",
+ direction="on",
+ linebreak="al",
+ mathclass="inner",
+ mathname="cdots",
+ unicodeslot=0x22EF,
+ },
+ [0x22F0]={
+ category="sm",
+ description="UP RIGHT DIAGONAL ELLIPSIS",
+ direction="on",
+ linebreak="al",
+ mathclass="inner",
+ mathname="udots",
+ mirror=0x22F1,
+ unicodeslot=0x22F0,
+ },
+ [0x22F1]={
+ category="sm",
+ description="DOWN RIGHT DIAGONAL ELLIPSIS",
+ direction="on",
+ linebreak="al",
+ mathclass="inner",
+ mathname="ddots",
+ mirror=0x22F0,
+ unicodeslot=0x22F1,
+ },
+ [0x22F2]={
+ category="sm",
+ description="ELEMENT OF WITH LONG HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22FA,
+ unicodeslot=0x22F2,
+ },
+ [0x22F3]={
+ category="sm",
+ description="ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22FB,
+ unicodeslot=0x22F3,
+ },
+ [0x22F4]={
+ category="sm",
+ description="SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22FC,
+ unicodeslot=0x22F4,
+ },
+ [0x22F5]={
+ category="sm",
+ description="ELEMENT OF WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22F5,
+ },
+ [0x22F6]={
+ category="sm",
+ description="ELEMENT OF WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ mirror=0x22FD,
+ unicodeslot=0x22F6,
+ },
+ [0x22F7]={
+ category="sm",
+ description="SMALL ELEMENT OF WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ mirror=0x22FE,
+ unicodeslot=0x22F7,
+ },
+ [0x22F8]={
+ category="sm",
+ description="ELEMENT OF WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22F8,
+ },
+ [0x22F9]={
+ category="sm",
+ description="ELEMENT OF WITH TWO HORIZONTAL STROKES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22F9,
+ },
+ [0x22FA]={
+ category="sm",
+ description="CONTAINS WITH LONG HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22F2,
+ unicodeslot=0x22FA,
+ },
+ [0x22FB]={
+ category="sm",
+ description="CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22F3,
+ unicodeslot=0x22FB,
+ },
+ [0x22FC]={
+ category="sm",
+ description="SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22F4,
+ unicodeslot=0x22FC,
+ },
+ [0x22FD]={
+ category="sm",
+ description="CONTAINS WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ mirror=0x22F6,
+ unicodeslot=0x22FD,
+ },
+ [0x22FE]={
+ category="sm",
+ description="SMALL CONTAINS WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ mirror=0x22F7,
+ unicodeslot=0x22FE,
+ },
+ [0x22FF]={
+ category="sm",
+ description="Z NOTATION BAG MEMBERSHIP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x22FF,
+ },
+ [0x2300]={
+ category="so",
+ description="DIAMETER SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="varnothing",
+ unicodeslot=0x2300,
+ },
+ [0x2301]={
+ category="so",
+ description="ELECTRIC ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2301,
+ },
+ [0x2302]={
+ adobename="house",
+ category="so",
+ description="HOUSE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2302,
+ },
+ [0x2303]={
+ category="so",
+ description="UP ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2303,
+ },
+ [0x2304]={
+ category="so",
+ description="DOWN ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2304,
+ },
+ [0x2305]={
+ category="so",
+ description="PROJECTIVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2305,
+ },
+ [0x2306]={
+ category="so",
+ description="PERSPECTIVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2306,
+ },
+ [0x2307]={
+ category="so",
+ description="WAVY LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2307,
+ },
+ [0x2308]={
+ category="sm",
+ description="LEFT CEILING",
+ direction="on",
+ linebreak="al",
+ mathclass="open",
+ mathname="lceil",
+ mirror=0x2309,
+ unicodeslot=0x2308,
+ },
+ [0x2309]={
+ category="sm",
+ description="RIGHT CEILING",
+ direction="on",
+ linebreak="al",
+ mathclass="close",
+ mathname="rceil",
+ mirror=0x2308,
+ unicodeslot=0x2309,
+ },
+ [0x230A]={
+ category="sm",
+ description="LEFT FLOOR",
+ direction="on",
+ linebreak="al",
+ mathclass="open",
+ mathname="lfloor",
+ mirror=0x230B,
+ unicodeslot=0x230A,
+ },
+ [0x230B]={
+ category="sm",
+ description="RIGHT FLOOR",
+ direction="on",
+ linebreak="al",
+ mathclass="close",
+ mathname="rfloor",
+ mirror=0x230A,
+ unicodeslot=0x230B,
+ },
+ [0x230C]={
+ category="so",
+ description="BOTTOM RIGHT CROP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x230C,
+ },
+ [0x230D]={
+ category="so",
+ description="BOTTOM LEFT CROP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x230D,
+ },
+ [0x230E]={
+ category="so",
+ description="TOP RIGHT CROP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x230E,
+ },
+ [0x230F]={
+ category="so",
+ description="TOP LEFT CROP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x230F,
+ },
+ [0x2310]={
+ adobename="revlogicalnot",
+ category="so",
+ description="REVERSED NOT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2310,
+ },
+ [0x2311]={
+ category="so",
+ description="SQUARE LOZENGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2311,
+ },
+ [0x2312]={
+ category="so",
+ cjkwd="a",
+ description="ARC",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2312,
+ },
+ [0x2313]={
+ category="so",
+ description="SEGMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2313,
+ },
+ [0x2314]={
+ category="so",
+ description="SECTOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2314,
+ },
+ [0x2315]={
+ category="so",
+ description="TELEPHONE RECORDER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2315,
+ },
+ [0x2316]={
+ category="so",
+ description="POSITION INDICATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2316,
+ },
+ [0x2317]={
+ category="so",
+ description="VIEWDATA SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2317,
+ },
+ [0x2318]={
+ category="so",
+ description="PLACE OF INTEREST SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2318,
+ },
+ [0x2319]={
+ category="so",
+ description="TURNED NOT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2319,
+ },
+ [0x231A]={
+ category="so",
+ description="WATCH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x231A,
+ },
+ [0x231B]={
+ category="so",
+ description="HOURGLASS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x231B,
+ },
+ [0x231C]={
+ category="so",
+ description="TOP LEFT CORNER",
+ direction="on",
+ linebreak="al",
+ mathclass="open",
+ mathname="ulcorner",
+ unicodeslot=0x231C,
+ },
+ [0x231D]={
+ category="so",
+ description="TOP RIGHT CORNER",
+ direction="on",
+ linebreak="al",
+ mathclass="close",
+ mathname="urcorner",
+ unicodeslot=0x231D,
+ },
+ [0x231E]={
+ category="so",
+ description="BOTTOM LEFT CORNER",
+ direction="on",
+ linebreak="al",
+ mathclass="open",
+ mathname="llcorner",
+ unicodeslot=0x231E,
+ },
+ [0x231F]={
+ category="so",
+ description="BOTTOM RIGHT CORNER",
+ direction="on",
+ linebreak="al",
+ mathclass="close",
+ mathname="lrcorner",
+ unicodeslot=0x231F,
+ },
+ [0x2320]={
+ adobename="integraltp",
+ category="sm",
+ description="TOP HALF INTEGRAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2320,
+ },
+ [0x2321]={
+ adobename="integralbt",
+ category="sm",
+ description="BOTTOM HALF INTEGRAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2321,
+ },
+ [0x2322]={
+ category="so",
+ description="FROWN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="frown",
+ unicodeslot=0x2322,
+ },
+ [0x2323]={
+ category="so",
+ description="SMILE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="smile",
+ unicodeslot=0x2323,
+ },
+ [0x2324]={
+ category="so",
+ description="UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2324,
+ },
+ [0x2325]={
+ category="so",
+ description="OPTION KEY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2325,
+ },
+ [0x2326]={
+ category="so",
+ description="ERASE TO THE RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2326,
+ },
+ [0x2327]={
+ category="so",
+ description="X IN A RECTANGLE BOX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2327,
+ },
+ [0x2328]={
+ category="so",
+ description="KEYBOARD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2328,
+ },
+ [0x2329]={
+ adobename="angleleft",
+ category="ps",
+ cjkwd="w",
+ description="LEFT-POINTING ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x232A,
+ specials={ "char", 0x3008 },
+ unicodeslot=0x2329,
+ },
+ [0x232A]={
+ adobename="angleright",
+ category="pe",
+ cjkwd="w",
+ description="RIGHT-POINTING ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2329,
+ specials={ "char", 0x3009 },
+ unicodeslot=0x232A,
+ },
+ [0x232B]={
+ category="so",
+ description="ERASE TO THE LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x232B,
+ },
+ [0x232C]={
+ category="so",
+ description="BENZENE RING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x232C,
+ },
+ [0x232D]={
+ category="so",
+ description="CYLINDRICITY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x232D,
+ },
+ [0x232E]={
+ category="so",
+ description="ALL AROUND-PROFILE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x232E,
+ },
+ [0x232F]={
+ category="so",
+ description="SYMMETRY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x232F,
+ },
+ [0x2330]={
+ category="so",
+ description="TOTAL RUNOUT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2330,
+ },
+ [0x2331]={
+ category="so",
+ description="DIMENSION ORIGIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2331,
+ },
+ [0x2332]={
+ category="so",
+ description="CONICAL TAPER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2332,
+ },
+ [0x2333]={
+ category="so",
+ description="SLOPE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2333,
+ },
+ [0x2334]={
+ category="so",
+ description="COUNTERBORE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2334,
+ },
+ [0x2335]={
+ category="so",
+ description="COUNTERSINK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2335,
+ },
+ [0x2336]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL I-BEAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2336,
+ },
+ [0x2337]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL SQUISH QUAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2337,
+ },
+ [0x2338]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD EQUAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2338,
+ },
+ [0x2339]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD DIVIDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2339,
+ },
+ [0x233A]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD DIAMOND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x233A,
+ },
+ [0x233B]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD JOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x233B,
+ },
+ [0x233C]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD CIRCLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x233C,
+ },
+ [0x233D]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL CIRCLE STILE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x233D,
+ },
+ [0x233E]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL CIRCLE JOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x233E,
+ },
+ [0x233F]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL SLASH BAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x233F,
+ },
+ [0x2340]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL BACKSLASH BAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2340,
+ },
+ [0x2341]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD SLASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2341,
+ },
+ [0x2342]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD BACKSLASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2342,
+ },
+ [0x2343]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD LESS-THAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2343,
+ },
+ [0x2344]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD GREATER-THAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2344,
+ },
+ [0x2345]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL LEFTWARDS VANE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2345,
+ },
+ [0x2346]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL RIGHTWARDS VANE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2346,
+ },
+ [0x2347]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2347,
+ },
+ [0x2348]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2348,
+ },
+ [0x2349]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2349,
+ },
+ [0x234A]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x234A,
+ },
+ [0x234B]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DELTA STILE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x234B,
+ },
+ [0x234C]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD DOWN CARET",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x234C,
+ },
+ [0x234D]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD DELTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x234D,
+ },
+ [0x234E]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DOWN TACK JOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x234E,
+ },
+ [0x234F]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL UPWARDS VANE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x234F,
+ },
+ [0x2350]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2350,
+ },
+ [0x2351]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL UP TACK OVERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2351,
+ },
+ [0x2352]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DEL STILE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2352,
+ },
+ [0x2353]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD UP CARET",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2353,
+ },
+ [0x2354]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD DEL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2354,
+ },
+ [0x2355]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL UP TACK JOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2355,
+ },
+ [0x2356]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DOWNWARDS VANE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2356,
+ },
+ [0x2357]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2357,
+ },
+ [0x2358]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUOTE UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2358,
+ },
+ [0x2359]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DELTA UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2359,
+ },
+ [0x235A]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x235A,
+ },
+ [0x235B]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL JOT UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x235B,
+ },
+ [0x235C]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x235C,
+ },
+ [0x235D]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL UP SHOE JOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x235D,
+ },
+ [0x235E]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUOTE QUAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x235E,
+ },
+ [0x235F]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL CIRCLE STAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x235F,
+ },
+ [0x2360]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD COLON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2360,
+ },
+ [0x2361]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL UP TACK DIAERESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2361,
+ },
+ [0x2362]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DEL DIAERESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2362,
+ },
+ [0x2363]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL STAR DIAERESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2363,
+ },
+ [0x2364]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL JOT DIAERESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2364,
+ },
+ [0x2365]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2365,
+ },
+ [0x2366]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DOWN SHOE STILE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2366,
+ },
+ [0x2367]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL LEFT SHOE STILE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2367,
+ },
+ [0x2368]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL TILDE DIAERESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2368,
+ },
+ [0x2369]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2369,
+ },
+ [0x236A]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL COMMA BAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x236A,
+ },
+ [0x236B]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DEL TILDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x236B,
+ },
+ [0x236C]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL ZILDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x236C,
+ },
+ [0x236D]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL STILE TILDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x236D,
+ },
+ [0x236E]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x236E,
+ },
+ [0x236F]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD NOT EQUAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x236F,
+ },
+ [0x2370]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD QUESTION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2370,
+ },
+ [0x2371]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL DOWN CARET TILDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2371,
+ },
+ [0x2372]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL UP CARET TILDE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2372,
+ },
+ [0x2373]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL IOTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2373,
+ },
+ [0x2374]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL RHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2374,
+ },
+ [0x2375]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL OMEGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2375,
+ },
+ [0x2376]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL ALPHA UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2376,
+ },
+ [0x2377]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL EPSILON UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2377,
+ },
+ [0x2378]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL IOTA UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2378,
+ },
+ [0x2379]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL OMEGA UNDERBAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2379,
+ },
+ [0x237A]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL ALPHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x237A,
+ },
+ [0x237B]={
+ category="so",
+ description="NOT CHECK MARK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x237B,
+ },
+ [0x237C]={
+ category="sm",
+ description="RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x237C,
+ },
+ [0x237D]={
+ category="so",
+ description="SHOULDERED OPEN BOX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x237D,
+ },
+ [0x237E]={
+ category="so",
+ description="BELL SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x237E,
+ },
+ [0x237F]={
+ category="so",
+ description="VERTICAL LINE WITH MIDDLE DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x237F,
+ },
+ [0x2380]={
+ category="so",
+ description="INSERTION SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2380,
+ },
+ [0x2381]={
+ category="so",
+ description="CONTINUOUS UNDERLINE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2381,
+ },
+ [0x2382]={
+ category="so",
+ description="DISCONTINUOUS UNDERLINE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2382,
+ },
+ [0x2383]={
+ category="so",
+ description="EMPHASIS SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2383,
+ },
+ [0x2384]={
+ category="so",
+ description="COMPOSITION SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2384,
+ },
+ [0x2385]={
+ category="so",
+ description="WHITE SQUARE WITH CENTRE VERTICAL LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2385,
+ },
+ [0x2386]={
+ category="so",
+ description="ENTER SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2386,
+ },
+ [0x2387]={
+ category="so",
+ description="ALTERNATIVE KEY SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2387,
+ },
+ [0x2388]={
+ category="so",
+ description="HELM SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2388,
+ },
+ [0x2389]={
+ category="so",
+ description="CIRCLED HORIZONTAL BAR WITH NOTCH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2389,
+ },
+ [0x238A]={
+ category="so",
+ description="CIRCLED TRIANGLE DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x238A,
+ },
+ [0x238B]={
+ category="so",
+ description="BROKEN CIRCLE WITH NORTHWEST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x238B,
+ },
+ [0x238C]={
+ category="so",
+ description="UNDO SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x238C,
+ },
+ [0x238D]={
+ category="so",
+ description="MONOSTABLE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x238D,
+ },
+ [0x238E]={
+ category="so",
+ description="HYSTERESIS SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x238E,
+ },
+ [0x238F]={
+ category="so",
+ description="OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x238F,
+ },
+ [0x2390]={
+ category="so",
+ description="OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2390,
+ },
+ [0x2391]={
+ category="so",
+ description="PASSIVE-PULL-DOWN-OUTPUT SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2391,
+ },
+ [0x2392]={
+ category="so",
+ description="PASSIVE-PULL-UP-OUTPUT SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2392,
+ },
+ [0x2393]={
+ category="so",
+ description="DIRECT CURRENT SYMBOL FORM TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2393,
+ },
+ [0x2394]={
+ category="so",
+ description="SOFTWARE-FUNCTION SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2394,
+ },
+ [0x2395]={
+ category="so",
+ description="APL FUNCTIONAL SYMBOL QUAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2395,
+ },
+ [0x2396]={
+ category="so",
+ description="DECIMAL SEPARATOR KEY SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2396,
+ },
+ [0x2397]={
+ category="so",
+ description="PREVIOUS PAGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2397,
+ },
+ [0x2398]={
+ category="so",
+ description="NEXT PAGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2398,
+ },
+ [0x2399]={
+ category="so",
+ description="PRINT SCREEN SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2399,
+ },
+ [0x239A]={
+ category="so",
+ description="CLEAR SCREEN SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x239A,
+ },
+ [0x239B]={
+ category="sm",
+ description="LEFT PARENTHESIS UPPER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x239B,
+ },
+ [0x239C]={
+ category="sm",
+ description="LEFT PARENTHESIS EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x239C,
+ },
+ [0x239D]={
+ category="sm",
+ description="LEFT PARENTHESIS LOWER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x239D,
+ },
+ [0x239E]={
+ category="sm",
+ description="RIGHT PARENTHESIS UPPER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x239E,
+ },
+ [0x239F]={
+ category="sm",
+ description="RIGHT PARENTHESIS EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x239F,
+ },
+ [0x23A0]={
+ category="sm",
+ description="RIGHT PARENTHESIS LOWER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A0,
+ },
+ [0x23A1]={
+ category="sm",
+ description="LEFT SQUARE BRACKET UPPER CORNER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A1,
+ },
+ [0x23A2]={
+ category="sm",
+ description="LEFT SQUARE BRACKET EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A2,
+ },
+ [0x23A3]={
+ category="sm",
+ description="LEFT SQUARE BRACKET LOWER CORNER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A3,
+ },
+ [0x23A4]={
+ category="sm",
+ description="RIGHT SQUARE BRACKET UPPER CORNER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A4,
+ },
+ [0x23A5]={
+ category="sm",
+ description="RIGHT SQUARE BRACKET EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A5,
+ },
+ [0x23A6]={
+ category="sm",
+ description="RIGHT SQUARE BRACKET LOWER CORNER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A6,
+ },
+ [0x23A7]={
+ category="sm",
+ description="LEFT CURLY BRACKET UPPER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A7,
+ },
+ [0x23A8]={
+ category="sm",
+ description="LEFT CURLY BRACKET MIDDLE PIECE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A8,
+ },
+ [0x23A9]={
+ category="sm",
+ description="LEFT CURLY BRACKET LOWER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23A9,
+ },
+ [0x23AA]={
+ category="sm",
+ description="CURLY BRACKET EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23AA,
+ },
+ [0x23AB]={
+ category="sm",
+ description="RIGHT CURLY BRACKET UPPER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23AB,
+ },
+ [0x23AC]={
+ category="sm",
+ description="RIGHT CURLY BRACKET MIDDLE PIECE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23AC,
+ },
+ [0x23AD]={
+ category="sm",
+ description="RIGHT CURLY BRACKET LOWER HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23AD,
+ },
+ [0x23AE]={
+ category="sm",
+ description="INTEGRAL EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23AE,
+ },
+ [0x23AF]={
+ category="sm",
+ description="HORIZONTAL LINE EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23AF,
+ },
+ [0x23B0]={
+ category="sm",
+ description="UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION",
+ direction="on",
+ linebreak="al",
+ mathclass="open",
+ mathname="lmoustache",
+ unicodeslot=0x23B0,
+ },
+ [0x23B1]={
+ category="sm",
+ description="UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION",
+ direction="on",
+ linebreak="al",
+ mathclass="close",
+ mathname="rmoustache",
+ unicodeslot=0x23B1,
+ },
+ [0x23B2]={
+ category="sm",
+ description="SUMMATION TOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B2,
+ },
+ [0x23B3]={
+ category="sm",
+ description="SUMMATION BOTTOM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B3,
+ },
+ [0x23B4]={
+ category="so",
+ description="TOP SQUARE BRACKET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B4,
+ },
+ [0x23B5]={
+ category="so",
+ description="BOTTOM SQUARE BRACKET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B5,
+ },
+ [0x23B6]={
+ category="so",
+ description="BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B6,
+ },
+ [0x23B7]={
+ category="so",
+ description="RADICAL SYMBOL BOTTOM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B7,
+ },
+ [0x23B8]={
+ category="so",
+ description="LEFT VERTICAL BOX LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B8,
+ },
+ [0x23B9]={
+ category="so",
+ description="RIGHT VERTICAL BOX LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23B9,
+ },
+ [0x23BA]={
+ category="so",
+ description="HORIZONTAL SCAN LINE-0x0001",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23BA,
+ },
+ [0x23BB]={
+ category="so",
+ description="HORIZONTAL SCAN LINE-0x0003",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23BB,
+ },
+ [0x23BC]={
+ category="so",
+ description="HORIZONTAL SCAN LINE-0x0007",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23BC,
+ },
+ [0x23BD]={
+ category="so",
+ description="HORIZONTAL SCAN LINE-0x0009",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23BD,
+ },
+ [0x23BE]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23BE,
+ },
+ [0x23BF]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23BF,
+ },
+ [0x23C0]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C0,
+ },
+ [0x23C1]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C1,
+ },
+ [0x23C2]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C2,
+ },
+ [0x23C3]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C3,
+ },
+ [0x23C4]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C4,
+ },
+ [0x23C5]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C5,
+ },
+ [0x23C6]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C6,
+ },
+ [0x23C7]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C7,
+ },
+ [0x23C8]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C8,
+ },
+ [0x23C9]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23C9,
+ },
+ [0x23CA]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23CA,
+ },
+ [0x23CB]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23CB,
+ },
+ [0x23CC]={
+ category="so",
+ description="DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23CC,
+ },
+ [0x23CD]={
+ category="so",
+ description="SQUARE FOOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23CD,
+ },
+ [0x23CE]={
+ category="so",
+ description="RETURN SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23CE,
+ },
+ [0x23CF]={
+ category="so",
+ description="EJECT SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23CF,
+ },
+ [0x23D0]={
+ category="so",
+ description="VERTICAL LINE EXTENSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D0,
+ },
+ [0x23D1]={
+ category="so",
+ description="METRICAL BREVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D1,
+ },
+ [0x23D2]={
+ category="so",
+ description="METRICAL LONG OVER SHORT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D2,
+ },
+ [0x23D3]={
+ category="so",
+ description="METRICAL SHORT OVER LONG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D3,
+ },
+ [0x23D4]={
+ category="so",
+ description="METRICAL LONG OVER TWO SHORTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D4,
+ },
+ [0x23D5]={
+ category="so",
+ description="METRICAL TWO SHORTS OVER LONG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D5,
+ },
+ [0x23D6]={
+ category="so",
+ description="METRICAL TWO SHORTS JOINED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D6,
+ },
+ [0x23D7]={
+ category="so",
+ description="METRICAL TRISEME",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D7,
+ },
+ [0x23D8]={
+ category="so",
+ description="METRICAL TETRASEME",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D8,
+ },
+ [0x23D9]={
+ category="so",
+ description="METRICAL PENTASEME",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23D9,
+ },
+ [0x23DA]={
+ category="so",
+ description="EARTH GROUND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23DA,
+ },
+ [0x23DB]={
+ category="so",
+ description="FUSE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23DB,
+ },
+ [0x23DC]={
+ category="sm",
+ description="TOP PARENTHESIS",
+ direction="on",
+ linebreak="al",
+ mathclass="topaccent",
+ mathname="overparent",
+ unicodeslot=0x23DC,
+ },
+ [0x23DD]={
+ category="sm",
+ description="BOTTOM PARENTHESIS",
+ direction="on",
+ linebreak="al",
+ mathclass="botaccent",
+ mathname="underparent",
+ unicodeslot=0x23DD,
+ },
+ [0x23DE]={
+ category="sm",
+ description="TOP CURLY BRACKET",
+ direction="on",
+ linebreak="al",
+ mathclass="topaccent",
+ mathname="overbrace",
+ unicodeslot=0x23DE,
+ },
+ [0x23DF]={
+ category="sm",
+ description="BOTTOM CURLY BRACKET",
+ direction="on",
+ linebreak="al",
+ mathclass="botaccent",
+ mathname="underbrace",
+ unicodeslot=0x23DF,
+ },
+ [0x23E0]={
+ category="sm",
+ description="TOP TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="al",
+ mathclass="accent",
+ unicodeslot=0x23E0,
+ },
+ [0x23E1]={
+ category="sm",
+ description="BOTTOM TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="al",
+ mathclass="accent",
+ unicodeslot=0x23E1,
+ },
+ [0x23E2]={
+ category="so",
+ description="WHITE TRAPEZIUM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23E2,
+ },
+ [0x23E3]={
+ category="so",
+ description="BENZENE RING WITH CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23E3,
+ },
+ [0x23E4]={
+ category="so",
+ description="STRAIGHTNESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23E4,
+ },
+ [0x23E5]={
+ category="so",
+ description="FLATNESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23E5,
+ },
+ [0x23E6]={
+ category="so",
+ description="AC CURRENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23E6,
+ },
+ [0x23E7]={
+ category="so",
+ description="ELECTRICAL INTERSECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x23E7,
+ },
+ [0x2400]={
+ category="so",
+ description="SYMBOL FOR NULL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2400,
+ },
+ [0x2401]={
+ category="so",
+ description="SYMBOL FOR START OF HEADING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2401,
+ },
+ [0x2402]={
+ category="so",
+ description="SYMBOL FOR START OF TEXT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2402,
+ },
+ [0x2403]={
+ category="so",
+ description="SYMBOL FOR END OF TEXT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2403,
+ },
+ [0x2404]={
+ category="so",
+ description="SYMBOL FOR END OF TRANSMISSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2404,
+ },
+ [0x2405]={
+ category="so",
+ description="SYMBOL FOR ENQUIRY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2405,
+ },
+ [0x2406]={
+ category="so",
+ description="SYMBOL FOR ACKNOWLEDGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2406,
+ },
+ [0x2407]={
+ category="so",
+ description="SYMBOL FOR BELL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2407,
+ },
+ [0x2408]={
+ category="so",
+ description="SYMBOL FOR BACKSPACE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2408,
+ },
+ [0x2409]={
+ category="so",
+ description="SYMBOL FOR HORIZONTAL TABULATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2409,
+ },
+ [0x240A]={
+ category="so",
+ description="SYMBOL FOR LINE FEED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x240A,
+ },
+ [0x240B]={
+ category="so",
+ description="SYMBOL FOR VERTICAL TABULATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x240B,
+ },
+ [0x240C]={
+ category="so",
+ description="SYMBOL FOR FORM FEED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x240C,
+ },
+ [0x240D]={
+ category="so",
+ description="SYMBOL FOR CARRIAGE RETURN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x240D,
+ },
+ [0x240E]={
+ category="so",
+ description="SYMBOL FOR SHIFT OUT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x240E,
+ },
+ [0x240F]={
+ category="so",
+ description="SYMBOL FOR SHIFT IN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x240F,
+ },
+ [0x2410]={
+ category="so",
+ description="SYMBOL FOR DATA LINK ESCAPE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2410,
+ },
+ [0x2411]={
+ category="so",
+ description="SYMBOL FOR DEVICE CONTROL ONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2411,
+ },
+ [0x2412]={
+ category="so",
+ description="SYMBOL FOR DEVICE CONTROL TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2412,
+ },
+ [0x2413]={
+ category="so",
+ description="SYMBOL FOR DEVICE CONTROL THREE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2413,
+ },
+ [0x2414]={
+ category="so",
+ description="SYMBOL FOR DEVICE CONTROL FOUR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2414,
+ },
+ [0x2415]={
+ category="so",
+ description="SYMBOL FOR NEGATIVE ACKNOWLEDGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2415,
+ },
+ [0x2416]={
+ category="so",
+ description="SYMBOL FOR SYNCHRONOUS IDLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2416,
+ },
+ [0x2417]={
+ category="so",
+ description="SYMBOL FOR END OF TRANSMISSION BLOCK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2417,
+ },
+ [0x2418]={
+ category="so",
+ description="SYMBOL FOR CANCEL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2418,
+ },
+ [0x2419]={
+ category="so",
+ description="SYMBOL FOR END OF MEDIUM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2419,
+ },
+ [0x241A]={
+ category="so",
+ description="SYMBOL FOR SUBSTITUTE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x241A,
+ },
+ [0x241B]={
+ category="so",
+ description="SYMBOL FOR ESCAPE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x241B,
+ },
+ [0x241C]={
+ category="so",
+ description="SYMBOL FOR FILE SEPARATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x241C,
+ },
+ [0x241D]={
+ category="so",
+ description="SYMBOL FOR GROUP SEPARATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x241D,
+ },
+ [0x241E]={
+ category="so",
+ description="SYMBOL FOR RECORD SEPARATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x241E,
+ },
+ [0x241F]={
+ category="so",
+ description="SYMBOL FOR UNIT SEPARATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x241F,
+ },
+ [0x2420]={
+ category="so",
+ description="SYMBOL FOR SPACE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2420,
+ },
+ [0x2421]={
+ category="so",
+ description="SYMBOL FOR DELETE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2421,
+ },
+ [0x2422]={
+ category="so",
+ description="BLANK SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2422,
+ },
+ [0x2423]={
+ category="so",
+ description="OPEN BOX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2423,
+ },
+ [0x2424]={
+ category="so",
+ description="SYMBOL FOR NEWLINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2424,
+ },
+ [0x2425]={
+ category="so",
+ description="SYMBOL FOR DELETE FORM TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2425,
+ },
+ [0x2426]={
+ category="so",
+ description="SYMBOL FOR SUBSTITUTE FORM TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2426,
+ },
+ [0x2440]={
+ category="so",
+ description="OCR HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2440,
+ },
+ [0x2441]={
+ category="so",
+ description="OCR CHAIR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2441,
+ },
+ [0x2442]={
+ category="so",
+ description="OCR FORK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2442,
+ },
+ [0x2443]={
+ category="so",
+ description="OCR INVERTED FORK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2443,
+ },
+ [0x2444]={
+ category="so",
+ description="OCR BELT BUCKLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2444,
+ },
+ [0x2445]={
+ category="so",
+ description="OCR BOW TIE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2445,
+ },
+ [0x2446]={
+ category="so",
+ description="OCR BRANCH BANK IDENTIFICATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2446,
+ },
+ [0x2447]={
+ category="so",
+ description="OCR AMOUNT OF CHECK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2447,
+ },
+ [0x2448]={
+ category="so",
+ description="OCR DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2448,
+ },
+ [0x2449]={
+ category="so",
+ description="OCR CUSTOMER ACCOUNT NUMBER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2449,
+ },
+ [0x244A]={
+ category="so",
+ description="OCR DOUBLE BACKSLASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x244A,
+ },
+ [0x2460]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT ONE",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031 },
+ unicodeslot=0x2460,
+ },
+ [0x2461]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT TWO",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0032 },
+ unicodeslot=0x2461,
+ },
+ [0x2462]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT THREE",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0033 },
+ unicodeslot=0x2462,
+ },
+ [0x2463]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT FOUR",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0034 },
+ unicodeslot=0x2463,
+ },
+ [0x2464]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT FIVE",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0035 },
+ unicodeslot=0x2464,
+ },
+ [0x2465]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT SIX",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0036 },
+ unicodeslot=0x2465,
+ },
+ [0x2466]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT SEVEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0037 },
+ unicodeslot=0x2466,
+ },
+ [0x2467]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT EIGHT",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0038 },
+ unicodeslot=0x2467,
+ },
+ [0x2468]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED DIGIT NINE",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0039 },
+ unicodeslot=0x2468,
+ },
+ [0x2469]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER TEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0030 },
+ unicodeslot=0x2469,
+ },
+ [0x246A]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER ELEVEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0031 },
+ unicodeslot=0x246A,
+ },
+ [0x246B]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER TWELVE",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0032 },
+ unicodeslot=0x246B,
+ },
+ [0x246C]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER THIRTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0033 },
+ unicodeslot=0x246C,
+ },
+ [0x246D]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER FOURTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0034 },
+ unicodeslot=0x246D,
+ },
+ [0x246E]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER FIFTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0035 },
+ unicodeslot=0x246E,
+ },
+ [0x246F]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER SIXTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0036 },
+ unicodeslot=0x246F,
+ },
+ [0x2470]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER SEVENTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0037 },
+ unicodeslot=0x2470,
+ },
+ [0x2471]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER EIGHTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0038 },
+ unicodeslot=0x2471,
+ },
+ [0x2472]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER NINETEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0031, 0x0039 },
+ unicodeslot=0x2472,
+ },
+ [0x2473]={
+ category="no",
+ cjkwd="a",
+ description="CIRCLED NUMBER TWENTY",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0032, 0x0030 },
+ unicodeslot=0x2473,
+ },
+ [0x2474]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT ONE",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0029 },
+ unicodeslot=0x2474,
+ },
+ [0x2475]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT TWO",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0032, 0x0029 },
+ unicodeslot=0x2475,
+ },
+ [0x2476]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT THREE",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0033, 0x0029 },
+ unicodeslot=0x2476,
+ },
+ [0x2477]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT FOUR",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0034, 0x0029 },
+ unicodeslot=0x2477,
+ },
+ [0x2478]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT FIVE",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0035, 0x0029 },
+ unicodeslot=0x2478,
+ },
+ [0x2479]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT SIX",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0036, 0x0029 },
+ unicodeslot=0x2479,
+ },
+ [0x247A]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT SEVEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0037, 0x0029 },
+ unicodeslot=0x247A,
+ },
+ [0x247B]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT EIGHT",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0038, 0x0029 },
+ unicodeslot=0x247B,
+ },
+ [0x247C]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED DIGIT NINE",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0039, 0x0029 },
+ unicodeslot=0x247C,
+ },
+ [0x247D]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER TEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0030, 0x0029 },
+ unicodeslot=0x247D,
+ },
+ [0x247E]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER ELEVEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0031, 0x0029 },
+ unicodeslot=0x247E,
+ },
+ [0x247F]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER TWELVE",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0032, 0x0029 },
+ unicodeslot=0x247F,
+ },
+ [0x2480]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER THIRTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0033, 0x0029 },
+ unicodeslot=0x2480,
+ },
+ [0x2481]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER FOURTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0034, 0x0029 },
+ unicodeslot=0x2481,
+ },
+ [0x2482]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER FIFTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0035, 0x0029 },
+ unicodeslot=0x2482,
+ },
+ [0x2483]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER SIXTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0036, 0x0029 },
+ unicodeslot=0x2483,
+ },
+ [0x2484]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER SEVENTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0037, 0x0029 },
+ unicodeslot=0x2484,
+ },
+ [0x2485]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER EIGHTEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0038, 0x0029 },
+ unicodeslot=0x2485,
+ },
+ [0x2486]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER NINETEEN",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0031, 0x0039, 0x0029 },
+ unicodeslot=0x2486,
+ },
+ [0x2487]={
+ category="no",
+ cjkwd="a",
+ description="PARENTHESIZED NUMBER TWENTY",
+ direction="on",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0032, 0x0030, 0x0029 },
+ unicodeslot=0x2487,
+ },
+ [0x2488]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT ONE FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x002E },
+ unicodeslot=0x2488,
+ },
+ [0x2489]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT TWO FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0032, 0x002E },
+ unicodeslot=0x2489,
+ },
+ [0x248A]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT THREE FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0033, 0x002E },
+ unicodeslot=0x248A,
+ },
+ [0x248B]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT FOUR FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0034, 0x002E },
+ unicodeslot=0x248B,
+ },
+ [0x248C]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT FIVE FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0035, 0x002E },
+ unicodeslot=0x248C,
+ },
+ [0x248D]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT SIX FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0036, 0x002E },
+ unicodeslot=0x248D,
+ },
+ [0x248E]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT SEVEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0037, 0x002E },
+ unicodeslot=0x248E,
+ },
+ [0x248F]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT EIGHT FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0038, 0x002E },
+ unicodeslot=0x248F,
+ },
+ [0x2490]={
+ category="no",
+ cjkwd="a",
+ description="DIGIT NINE FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0039, 0x002E },
+ unicodeslot=0x2490,
+ },
+ [0x2491]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER TEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0030, 0x002E },
+ unicodeslot=0x2491,
+ },
+ [0x2492]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER ELEVEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0031, 0x002E },
+ unicodeslot=0x2492,
+ },
+ [0x2493]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER TWELVE FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0032, 0x002E },
+ unicodeslot=0x2493,
+ },
+ [0x2494]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER THIRTEEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0033, 0x002E },
+ unicodeslot=0x2494,
+ },
+ [0x2495]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER FOURTEEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0034, 0x002E },
+ unicodeslot=0x2495,
+ },
+ [0x2496]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER FIFTEEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0035, 0x002E },
+ unicodeslot=0x2496,
+ },
+ [0x2497]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER SIXTEEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0036, 0x002E },
+ unicodeslot=0x2497,
+ },
+ [0x2498]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER SEVENTEEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0037, 0x002E },
+ unicodeslot=0x2498,
+ },
+ [0x2499]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER EIGHTEEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0038, 0x002E },
+ unicodeslot=0x2499,
+ },
+ [0x249A]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER NINETEEN FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0031, 0x0039, 0x002E },
+ unicodeslot=0x249A,
+ },
+ [0x249B]={
+ category="no",
+ cjkwd="a",
+ description="NUMBER TWENTY FULL STOP",
+ direction="en",
+ linebreak="ai",
+ specials={ "compat", 0x0032, 0x0030, 0x002E },
+ unicodeslot=0x249B,
+ },
+ [0x249C]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER A",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0061, 0x0029 },
+ unicodeslot=0x249C,
+ },
+ [0x249D]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER B",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0062, 0x0029 },
+ unicodeslot=0x249D,
+ },
+ [0x249E]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER C",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0063, 0x0029 },
+ unicodeslot=0x249E,
+ },
+ [0x249F]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER D",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0064, 0x0029 },
+ unicodeslot=0x249F,
+ },
+ [0x24A0]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER E",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0065, 0x0029 },
+ unicodeslot=0x24A0,
+ },
+ [0x24A1]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER F",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0066, 0x0029 },
+ unicodeslot=0x24A1,
+ },
+ [0x24A2]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER G",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0067, 0x0029 },
+ unicodeslot=0x24A2,
+ },
+ [0x24A3]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER H",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0068, 0x0029 },
+ unicodeslot=0x24A3,
+ },
+ [0x24A4]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER I",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0069, 0x0029 },
+ unicodeslot=0x24A4,
+ },
+ [0x24A5]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER J",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x006A, 0x0029 },
+ unicodeslot=0x24A5,
+ },
+ [0x24A6]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER K",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x006B, 0x0029 },
+ unicodeslot=0x24A6,
+ },
+ [0x24A7]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER L",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x006C, 0x0029 },
+ unicodeslot=0x24A7,
+ },
+ [0x24A8]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER M",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x006D, 0x0029 },
+ unicodeslot=0x24A8,
+ },
+ [0x24A9]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER N",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x006E, 0x0029 },
+ unicodeslot=0x24A9,
+ },
+ [0x24AA]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER O",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x006F, 0x0029 },
+ unicodeslot=0x24AA,
+ },
+ [0x24AB]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER P",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0070, 0x0029 },
+ unicodeslot=0x24AB,
+ },
+ [0x24AC]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER Q",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0071, 0x0029 },
+ unicodeslot=0x24AC,
+ },
+ [0x24AD]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER R",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0072, 0x0029 },
+ unicodeslot=0x24AD,
+ },
+ [0x24AE]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER S",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0073, 0x0029 },
+ unicodeslot=0x24AE,
+ },
+ [0x24AF]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER T",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0074, 0x0029 },
+ unicodeslot=0x24AF,
+ },
+ [0x24B0]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER U",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0075, 0x0029 },
+ unicodeslot=0x24B0,
+ },
+ [0x24B1]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER V",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0076, 0x0029 },
+ unicodeslot=0x24B1,
+ },
+ [0x24B2]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER W",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0077, 0x0029 },
+ unicodeslot=0x24B2,
+ },
+ [0x24B3]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER X",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0078, 0x0029 },
+ unicodeslot=0x24B3,
+ },
+ [0x24B4]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER Y",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x0079, 0x0029 },
+ unicodeslot=0x24B4,
+ },
+ [0x24B5]={
+ category="so",
+ cjkwd="a",
+ description="PARENTHESIZED LATIN SMALL LETTER Z",
+ direction="l",
+ linebreak="ai",
+ specials={ "compat", 0x0028, 0x007A, 0x0029 },
+ unicodeslot=0x24B5,
+ },
+ [0x24B6]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER A",
+ direction="l",
+ lccode=0x24D0,
+ linebreak="ai",
+ specials={ "circle", 0x0041 },
+ unicodeslot=0x24B6,
+ },
+ [0x24B7]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER B",
+ direction="l",
+ lccode=0x24D1,
+ linebreak="ai",
+ specials={ "circle", 0x0042 },
+ unicodeslot=0x24B7,
+ },
+ [0x24B8]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER C",
+ direction="l",
+ lccode=0x24D2,
+ linebreak="ai",
+ specials={ "circle", 0x0043 },
+ unicodeslot=0x24B8,
+ },
+ [0x24B9]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER D",
+ direction="l",
+ lccode=0x24D3,
+ linebreak="ai",
+ specials={ "circle", 0x0044 },
+ unicodeslot=0x24B9,
+ },
+ [0x24BA]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER E",
+ direction="l",
+ lccode=0x24D4,
+ linebreak="ai",
+ specials={ "circle", 0x0045 },
+ unicodeslot=0x24BA,
+ },
+ [0x24BB]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER F",
+ direction="l",
+ lccode=0x24D5,
+ linebreak="ai",
+ specials={ "circle", 0x0046 },
+ unicodeslot=0x24BB,
+ },
+ [0x24BC]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER G",
+ direction="l",
+ lccode=0x24D6,
+ linebreak="ai",
+ specials={ "circle", 0x0047 },
+ unicodeslot=0x24BC,
+ },
+ [0x24BD]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER H",
+ direction="l",
+ lccode=0x24D7,
+ linebreak="ai",
+ specials={ "circle", 0x0048 },
+ unicodeslot=0x24BD,
+ },
+ [0x24BE]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER I",
+ direction="l",
+ lccode=0x24D8,
+ linebreak="ai",
+ specials={ "circle", 0x0049 },
+ unicodeslot=0x24BE,
+ },
+ [0x24BF]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER J",
+ direction="l",
+ lccode=0x24D9,
+ linebreak="ai",
+ specials={ "circle", 0x004A },
+ unicodeslot=0x24BF,
+ },
+ [0x24C0]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER K",
+ direction="l",
+ lccode=0x24DA,
+ linebreak="ai",
+ specials={ "circle", 0x004B },
+ unicodeslot=0x24C0,
+ },
+ [0x24C1]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER L",
+ direction="l",
+ lccode=0x24DB,
+ linebreak="ai",
+ specials={ "circle", 0x004C },
+ unicodeslot=0x24C1,
+ },
+ [0x24C2]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER M",
+ direction="l",
+ lccode=0x24DC,
+ linebreak="ai",
+ specials={ "circle", 0x004D },
+ unicodeslot=0x24C2,
+ },
+ [0x24C3]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER N",
+ direction="l",
+ lccode=0x24DD,
+ linebreak="ai",
+ specials={ "circle", 0x004E },
+ unicodeslot=0x24C3,
+ },
+ [0x24C4]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER O",
+ direction="l",
+ lccode=0x24DE,
+ linebreak="ai",
+ specials={ "circle", 0x004F },
+ unicodeslot=0x24C4,
+ },
+ [0x24C5]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER P",
+ direction="l",
+ lccode=0x24DF,
+ linebreak="ai",
+ specials={ "circle", 0x0050 },
+ unicodeslot=0x24C5,
+ },
+ [0x24C6]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER Q",
+ direction="l",
+ lccode=0x24E0,
+ linebreak="ai",
+ specials={ "circle", 0x0051 },
+ unicodeslot=0x24C6,
+ },
+ [0x24C7]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER R",
+ direction="l",
+ lccode=0x24E1,
+ linebreak="ai",
+ mathclass="ord",
+ mathname="circledR",
+ specials={ "circle", 0x0052 },
+ unicodeslot=0x24C7,
+ },
+ [0x24C8]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER S",
+ direction="l",
+ lccode=0x24E2,
+ linebreak="ai",
+ mathclass="ord",
+ mathname="circledS",
+ specials={ "circle", 0x0053 },
+ unicodeslot=0x24C8,
+ },
+ [0x24C9]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER T",
+ direction="l",
+ lccode=0x24E3,
+ linebreak="ai",
+ specials={ "circle", 0x0054 },
+ unicodeslot=0x24C9,
+ },
+ [0x24CA]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER U",
+ direction="l",
+ lccode=0x24E4,
+ linebreak="ai",
+ specials={ "circle", 0x0055 },
+ unicodeslot=0x24CA,
+ },
+ [0x24CB]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER V",
+ direction="l",
+ lccode=0x24E5,
+ linebreak="ai",
+ specials={ "circle", 0x0056 },
+ unicodeslot=0x24CB,
+ },
+ [0x24CC]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER W",
+ direction="l",
+ lccode=0x24E6,
+ linebreak="ai",
+ specials={ "circle", 0x0057 },
+ unicodeslot=0x24CC,
+ },
+ [0x24CD]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER X",
+ direction="l",
+ lccode=0x24E7,
+ linebreak="ai",
+ specials={ "circle", 0x0058 },
+ unicodeslot=0x24CD,
+ },
+ [0x24CE]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER Y",
+ direction="l",
+ lccode=0x24E8,
+ linebreak="ai",
+ specials={ "circle", 0x0059 },
+ unicodeslot=0x24CE,
+ },
+ [0x24CF]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN CAPITAL LETTER Z",
+ direction="l",
+ lccode=0x24E9,
+ linebreak="ai",
+ specials={ "circle", 0x005A },
+ unicodeslot=0x24CF,
+ },
+ [0x24D0]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER A",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0061 },
+ uccode=0x24B6,
+ unicodeslot=0x24D0,
+ },
+ [0x24D1]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER B",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0062 },
+ uccode=0x24B7,
+ unicodeslot=0x24D1,
+ },
+ [0x24D2]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER C",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0063 },
+ uccode=0x24B8,
+ unicodeslot=0x24D2,
+ },
+ [0x24D3]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER D",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0064 },
+ uccode=0x24B9,
+ unicodeslot=0x24D3,
+ },
+ [0x24D4]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER E",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0065 },
+ uccode=0x24BA,
+ unicodeslot=0x24D4,
+ },
+ [0x24D5]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER F",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0066 },
+ uccode=0x24BB,
+ unicodeslot=0x24D5,
+ },
+ [0x24D6]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER G",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0067 },
+ uccode=0x24BC,
+ unicodeslot=0x24D6,
+ },
+ [0x24D7]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER H",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0068 },
+ uccode=0x24BD,
+ unicodeslot=0x24D7,
+ },
+ [0x24D8]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER I",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0069 },
+ uccode=0x24BE,
+ unicodeslot=0x24D8,
+ },
+ [0x24D9]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER J",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x006A },
+ uccode=0x24BF,
+ unicodeslot=0x24D9,
+ },
+ [0x24DA]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER K",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x006B },
+ uccode=0x24C0,
+ unicodeslot=0x24DA,
+ },
+ [0x24DB]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER L",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x006C },
+ uccode=0x24C1,
+ unicodeslot=0x24DB,
+ },
+ [0x24DC]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER M",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x006D },
+ uccode=0x24C2,
+ unicodeslot=0x24DC,
+ },
+ [0x24DD]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER N",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x006E },
+ uccode=0x24C3,
+ unicodeslot=0x24DD,
+ },
+ [0x24DE]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER O",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x006F },
+ uccode=0x24C4,
+ unicodeslot=0x24DE,
+ },
+ [0x24DF]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER P",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0070 },
+ uccode=0x24C5,
+ unicodeslot=0x24DF,
+ },
+ [0x24E0]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER Q",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0071 },
+ uccode=0x24C6,
+ unicodeslot=0x24E0,
+ },
+ [0x24E1]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER R",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0072 },
+ uccode=0x24C7,
+ unicodeslot=0x24E1,
+ },
+ [0x24E2]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER S",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0073 },
+ uccode=0x24C8,
+ unicodeslot=0x24E2,
+ },
+ [0x24E3]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER T",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0074 },
+ uccode=0x24C9,
+ unicodeslot=0x24E3,
+ },
+ [0x24E4]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER U",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0075 },
+ uccode=0x24CA,
+ unicodeslot=0x24E4,
+ },
+ [0x24E5]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER V",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0076 },
+ uccode=0x24CB,
+ unicodeslot=0x24E5,
+ },
+ [0x24E6]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER W",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0077 },
+ uccode=0x24CC,
+ unicodeslot=0x24E6,
+ },
+ [0x24E7]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER X",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0078 },
+ uccode=0x24CD,
+ unicodeslot=0x24E7,
+ },
+ [0x24E8]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER Y",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x0079 },
+ uccode=0x24CE,
+ unicodeslot=0x24E8,
+ },
+ [0x24E9]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLED LATIN SMALL LETTER Z",
+ direction="l",
+ linebreak="ai",
+ specials={ "circle", 0x007A },
+ uccode=0x24CF,
+ unicodeslot=0x24E9,
+ },
+ [0x24EA]={
+ category="no",
+ description="CIRCLED DIGIT ZERO",
+ direction="on",
+ linebreak="ai",
+ specials={ "circle", 0x0030 },
+ unicodeslot=0x24EA,
+ },
+ [0x24EB]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER ELEVEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24EB,
+ },
+ [0x24EC]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER TWELVE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24EC,
+ },
+ [0x24ED]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER THIRTEEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24ED,
+ },
+ [0x24EE]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER FOURTEEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24EE,
+ },
+ [0x24EF]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER FIFTEEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24EF,
+ },
+ [0x24F0]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER SIXTEEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F0,
+ },
+ [0x24F1]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER SEVENTEEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F1,
+ },
+ [0x24F2]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER EIGHTEEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F2,
+ },
+ [0x24F3]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER NINETEEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F3,
+ },
+ [0x24F4]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED NUMBER TWENTY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F4,
+ },
+ [0x24F5]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT ONE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F5,
+ },
+ [0x24F6]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT TWO",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F6,
+ },
+ [0x24F7]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT THREE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F7,
+ },
+ [0x24F8]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT FOUR",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F8,
+ },
+ [0x24F9]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT FIVE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24F9,
+ },
+ [0x24FA]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT SIX",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24FA,
+ },
+ [0x24FB]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT SEVEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24FB,
+ },
+ [0x24FC]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT EIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24FC,
+ },
+ [0x24FD]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED DIGIT NINE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24FD,
+ },
+ [0x24FE]={
+ category="no",
+ cjkwd="a",
+ description="DOUBLE CIRCLED NUMBER TEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x24FE,
+ },
+ [0x24FF]={
+ category="no",
+ cjkwd="a",
+ description="NEGATIVE CIRCLED DIGIT ZERO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x24FF,
+ },
+ [0x2500]={
+ adobename="SF100000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2500,
+ },
+ [0x2501]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2501,
+ },
+ [0x2502]={
+ adobename="SF110000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT VERTICAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2502,
+ },
+ [0x2503]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY VERTICAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2503,
+ },
+ [0x2504]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2504,
+ },
+ [0x2505]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2505,
+ },
+ [0x2506]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2506,
+ },
+ [0x2507]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2507,
+ },
+ [0x2508]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2508,
+ },
+ [0x2509]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2509,
+ },
+ [0x250A]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x250A,
+ },
+ [0x250B]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x250B,
+ },
+ [0x250C]={
+ adobename="SF10000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT DOWN AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x250C,
+ },
+ [0x250D]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x250D,
+ },
+ [0x250E]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x250E,
+ },
+ [0x250F]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY DOWN AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x250F,
+ },
+ [0x2510]={
+ adobename="SF30000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT DOWN AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2510,
+ },
+ [0x2511]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2511,
+ },
+ [0x2512]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2512,
+ },
+ [0x2513]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY DOWN AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2513,
+ },
+ [0x2514]={
+ adobename="SF20000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT UP AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2514,
+ },
+ [0x2515]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP LIGHT AND RIGHT HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2515,
+ },
+ [0x2516]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP HEAVY AND RIGHT LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2516,
+ },
+ [0x2517]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY UP AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2517,
+ },
+ [0x2518]={
+ adobename="SF40000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT UP AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2518,
+ },
+ [0x2519]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP LIGHT AND LEFT HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2519,
+ },
+ [0x251A]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP HEAVY AND LEFT LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x251A,
+ },
+ [0x251B]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY UP AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x251B,
+ },
+ [0x251C]={
+ adobename="SF80000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT VERTICAL AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x251C,
+ },
+ [0x251D]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x251D,
+ },
+ [0x251E]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x251E,
+ },
+ [0x251F]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x251F,
+ },
+ [0x2520]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2520,
+ },
+ [0x2521]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2521,
+ },
+ [0x2522]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2522,
+ },
+ [0x2523]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY VERTICAL AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2523,
+ },
+ [0x2524]={
+ adobename="SF90000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT VERTICAL AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2524,
+ },
+ [0x2525]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2525,
+ },
+ [0x2526]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2526,
+ },
+ [0x2527]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2527,
+ },
+ [0x2528]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2528,
+ },
+ [0x2529]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2529,
+ },
+ [0x252A]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x252A,
+ },
+ [0x252B]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY VERTICAL AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x252B,
+ },
+ [0x252C]={
+ adobename="SF60000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT DOWN AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x252C,
+ },
+ [0x252D]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x252D,
+ },
+ [0x252E]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x252E,
+ },
+ [0x252F]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x252F,
+ },
+ [0x2530]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2530,
+ },
+ [0x2531]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2531,
+ },
+ [0x2532]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2532,
+ },
+ [0x2533]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY DOWN AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2533,
+ },
+ [0x2534]={
+ adobename="SF70000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT UP AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2534,
+ },
+ [0x2535]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2535,
+ },
+ [0x2536]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2536,
+ },
+ [0x2537]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2537,
+ },
+ [0x2538]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2538,
+ },
+ [0x2539]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2539,
+ },
+ [0x253A]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x253A,
+ },
+ [0x253B]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY UP AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x253B,
+ },
+ [0x253C]={
+ adobename="SF50000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x253C,
+ },
+ [0x253D]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x253D,
+ },
+ [0x253E]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x253E,
+ },
+ [0x253F]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x253F,
+ },
+ [0x2540]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2540,
+ },
+ [0x2541]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2541,
+ },
+ [0x2542]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2542,
+ },
+ [0x2543]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2543,
+ },
+ [0x2544]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2544,
+ },
+ [0x2545]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2545,
+ },
+ [0x2546]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2546,
+ },
+ [0x2547]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2547,
+ },
+ [0x2548]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2548,
+ },
+ [0x2549]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2549,
+ },
+ [0x254A]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x254A,
+ },
+ [0x254B]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x254B,
+ },
+ [0x254C]={
+ category="so",
+ description="BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x254C,
+ },
+ [0x254D]={
+ category="so",
+ description="BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x254D,
+ },
+ [0x254E]={
+ category="so",
+ description="BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x254E,
+ },
+ [0x254F]={
+ category="so",
+ description="BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x254F,
+ },
+ [0x2550]={
+ adobename="SF430000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2550,
+ },
+ [0x2551]={
+ adobename="SF240000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE VERTICAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2551,
+ },
+ [0x2552]={
+ adobename="SF510000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2552,
+ },
+ [0x2553]={
+ adobename="SF520000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2553,
+ },
+ [0x2554]={
+ adobename="SF390000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE DOWN AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2554,
+ },
+ [0x2555]={
+ adobename="SF220000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2555,
+ },
+ [0x2556]={
+ adobename="SF210000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2556,
+ },
+ [0x2557]={
+ adobename="SF250000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE DOWN AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2557,
+ },
+ [0x2558]={
+ adobename="SF500000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2558,
+ },
+ [0x2559]={
+ adobename="SF490000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2559,
+ },
+ [0x255A]={
+ adobename="SF380000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE UP AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x255A,
+ },
+ [0x255B]={
+ adobename="SF280000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP SINGLE AND LEFT DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x255B,
+ },
+ [0x255C]={
+ adobename="SF270000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP DOUBLE AND LEFT SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x255C,
+ },
+ [0x255D]={
+ adobename="SF260000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE UP AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x255D,
+ },
+ [0x255E]={
+ adobename="SF360000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x255E,
+ },
+ [0x255F]={
+ adobename="SF370000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x255F,
+ },
+ [0x2560]={
+ adobename="SF420000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE VERTICAL AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2560,
+ },
+ [0x2561]={
+ adobename="SF190000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2561,
+ },
+ [0x2562]={
+ adobename="SF200000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2562,
+ },
+ [0x2563]={
+ adobename="SF230000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE VERTICAL AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2563,
+ },
+ [0x2564]={
+ adobename="SF470000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2564,
+ },
+ [0x2565]={
+ adobename="SF480000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2565,
+ },
+ [0x2566]={
+ adobename="SF410000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2566,
+ },
+ [0x2567]={
+ adobename="SF450000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2567,
+ },
+ [0x2568]={
+ adobename="SF460000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2568,
+ },
+ [0x2569]={
+ adobename="SF400000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE UP AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2569,
+ },
+ [0x256A]={
+ adobename="SF540000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x256A,
+ },
+ [0x256B]={
+ adobename="SF530000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x256B,
+ },
+ [0x256C]={
+ adobename="SF440000",
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x256C,
+ },
+ [0x256D]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT ARC DOWN AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x256D,
+ },
+ [0x256E]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT ARC DOWN AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x256E,
+ },
+ [0x256F]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT ARC UP AND LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x256F,
+ },
+ [0x2570]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT ARC UP AND RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2570,
+ },
+ [0x2571]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2571,
+ },
+ [0x2572]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2572,
+ },
+ [0x2573]={
+ category="so",
+ cjkwd="a",
+ description="BOX DRAWINGS LIGHT DIAGONAL CROSS",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2573,
+ },
+ [0x2574]={
+ category="so",
+ description="BOX DRAWINGS LIGHT LEFT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2574,
+ },
+ [0x2575]={
+ category="so",
+ description="BOX DRAWINGS LIGHT UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2575,
+ },
+ [0x2576]={
+ category="so",
+ description="BOX DRAWINGS LIGHT RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2576,
+ },
+ [0x2577]={
+ category="so",
+ description="BOX DRAWINGS LIGHT DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2577,
+ },
+ [0x2578]={
+ category="so",
+ description="BOX DRAWINGS HEAVY LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2578,
+ },
+ [0x2579]={
+ category="so",
+ description="BOX DRAWINGS HEAVY UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2579,
+ },
+ [0x257A]={
+ category="so",
+ description="BOX DRAWINGS HEAVY RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x257A,
+ },
+ [0x257B]={
+ category="so",
+ description="BOX DRAWINGS HEAVY DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x257B,
+ },
+ [0x257C]={
+ category="so",
+ description="BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x257C,
+ },
+ [0x257D]={
+ category="so",
+ description="BOX DRAWINGS LIGHT UP AND HEAVY DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x257D,
+ },
+ [0x257E]={
+ category="so",
+ description="BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x257E,
+ },
+ [0x257F]={
+ category="so",
+ description="BOX DRAWINGS HEAVY UP AND LIGHT DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x257F,
+ },
+ [0x2580]={
+ adobename="upblock",
+ category="so",
+ cjkwd="a",
+ description="UPPER HALF BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2580,
+ },
+ [0x2581]={
+ category="so",
+ cjkwd="a",
+ description="LOWER ONE EIGHTH BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2581,
+ },
+ [0x2582]={
+ category="so",
+ cjkwd="a",
+ description="LOWER ONE QUARTER BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2582,
+ },
+ [0x2583]={
+ category="so",
+ cjkwd="a",
+ description="LOWER THREE EIGHTHS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2583,
+ },
+ [0x2584]={
+ adobename="dnblock",
+ category="so",
+ cjkwd="a",
+ description="LOWER HALF BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2584,
+ },
+ [0x2585]={
+ category="so",
+ cjkwd="a",
+ description="LOWER FIVE EIGHTHS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2585,
+ },
+ [0x2586]={
+ category="so",
+ cjkwd="a",
+ description="LOWER THREE QUARTERS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2586,
+ },
+ [0x2587]={
+ category="so",
+ cjkwd="a",
+ description="LOWER SEVEN EIGHTHS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2587,
+ },
+ [0x2588]={
+ adobename="block",
+ category="so",
+ cjkwd="a",
+ description="FULL BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2588,
+ },
+ [0x2589]={
+ category="so",
+ cjkwd="a",
+ description="LEFT SEVEN EIGHTHS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2589,
+ },
+ [0x258A]={
+ category="so",
+ cjkwd="a",
+ description="LEFT THREE QUARTERS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x258A,
+ },
+ [0x258B]={
+ category="so",
+ cjkwd="a",
+ description="LEFT FIVE EIGHTHS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x258B,
+ },
+ [0x258C]={
+ adobename="lfblock",
+ category="so",
+ cjkwd="a",
+ description="LEFT HALF BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x258C,
+ },
+ [0x258D]={
+ category="so",
+ cjkwd="a",
+ description="LEFT THREE EIGHTHS BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x258D,
+ },
+ [0x258E]={
+ category="so",
+ cjkwd="a",
+ description="LEFT ONE QUARTER BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x258E,
+ },
+ [0x258F]={
+ category="so",
+ cjkwd="a",
+ description="LEFT ONE EIGHTH BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x258F,
+ },
+ [0x2590]={
+ adobename="rtblock",
+ category="so",
+ description="RIGHT HALF BLOCK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2590,
+ },
+ [0x2591]={
+ adobename="ltshade",
+ category="so",
+ description="LIGHT SHADE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2591,
+ },
+ [0x2592]={
+ adobename="shade",
+ category="so",
+ cjkwd="a",
+ description="MEDIUM SHADE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2592,
+ },
+ [0x2593]={
+ adobename="dkshade",
+ category="so",
+ cjkwd="a",
+ description="DARK SHADE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2593,
+ },
+ [0x2594]={
+ category="so",
+ cjkwd="a",
+ description="UPPER ONE EIGHTH BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2594,
+ },
+ [0x2595]={
+ category="so",
+ cjkwd="a",
+ description="RIGHT ONE EIGHTH BLOCK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2595,
+ },
+ [0x2596]={
+ category="so",
+ description="QUADRANT LOWER LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2596,
+ },
+ [0x2597]={
+ category="so",
+ description="QUADRANT LOWER RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2597,
+ },
+ [0x2598]={
+ category="so",
+ description="QUADRANT UPPER LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2598,
+ },
+ [0x2599]={
+ category="so",
+ description="QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2599,
+ },
+ [0x259A]={
+ category="so",
+ description="QUADRANT UPPER LEFT AND LOWER RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x259A,
+ },
+ [0x259B]={
+ category="so",
+ description="QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x259B,
+ },
+ [0x259C]={
+ category="so",
+ description="QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x259C,
+ },
+ [0x259D]={
+ category="so",
+ description="QUADRANT UPPER RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x259D,
+ },
+ [0x259E]={
+ category="so",
+ description="QUADRANT UPPER RIGHT AND LOWER LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x259E,
+ },
+ [0x259F]={
+ category="so",
+ description="QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x259F,
+ },
+ [0x25A0]={
+ adobename="filledbox",
+ category="so",
+ cjkwd="a",
+ description="BLACK SQUARE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A0,
+ },
+ [0x25A1]={
+ adobename="H22073",
+ category="so",
+ cjkwd="a",
+ description="WHITE SQUARE",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="ord", name="square" },
+ { class="ord", name="Box" },
+ },
+ unicodeslot=0x25A1,
+ },
+ [0x25A2]={
+ category="so",
+ description="WHITE SQUARE WITH ROUNDED CORNERS",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="blacksquare",
+ unicodeslot=0x25A2,
+ },
+ [0x25A3]={
+ category="so",
+ cjkwd="a",
+ description="WHITE SQUARE CONTAINING BLACK SMALL SQUARE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A3,
+ },
+ [0x25A4]={
+ category="so",
+ cjkwd="a",
+ description="SQUARE WITH HORIZONTAL FILL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A4,
+ },
+ [0x25A5]={
+ category="so",
+ cjkwd="a",
+ description="SQUARE WITH VERTICAL FILL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A5,
+ },
+ [0x25A6]={
+ category="so",
+ cjkwd="a",
+ description="SQUARE WITH ORTHOGONAL CROSSHATCH FILL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A6,
+ },
+ [0x25A7]={
+ category="so",
+ cjkwd="a",
+ description="SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A7,
+ },
+ [0x25A8]={
+ category="so",
+ cjkwd="a",
+ description="SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A8,
+ },
+ [0x25A9]={
+ category="so",
+ cjkwd="a",
+ description="SQUARE WITH DIAGONAL CROSSHATCH FILL",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25A9,
+ },
+ [0x25AA]={
+ adobename="H18543",
+ category="so",
+ description="BLACK SMALL SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25AA,
+ },
+ [0x25AB]={
+ adobename="H18551",
+ category="so",
+ description="WHITE SMALL SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25AB,
+ },
+ [0x25AC]={
+ adobename="filledrect",
+ category="so",
+ description="BLACK RECTANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25AC,
+ },
+ [0x25AD]={
+ category="so",
+ description="WHITE RECTANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25AD,
+ },
+ [0x25AE]={
+ category="so",
+ description="BLACK VERTICAL RECTANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25AE,
+ },
+ [0x25AF]={
+ category="so",
+ description="WHITE VERTICAL RECTANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25AF,
+ },
+ [0x25B0]={
+ category="so",
+ description="BLACK PARALLELOGRAM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25B0,
+ },
+ [0x25B1]={
+ category="so",
+ description="WHITE PARALLELOGRAM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25B1,
+ },
+ [0x25B2]={
+ adobename="triagup",
+ category="so",
+ cjkwd="a",
+ description="BLACK UP-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25B2,
+ },
+ [0x25B3]={
+ category="so",
+ cjkwd="a",
+ description="WHITE UP-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ mathspec={
+ { class="ord", name="triangle" },
+ { class="binary", name="bigtriangleup" },
+ },
+ unicodeslot=0x25B3,
+ },
+ [0x25B4]={
+ category="so",
+ description="BLACK UP-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25B4,
+ },
+ [0x25B5]={
+ category="so",
+ description="WHITE UP-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25B5,
+ },
+ [0x25B6]={
+ category="so",
+ cjkwd="a",
+ description="BLACK RIGHT-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ mathclass="bin",
+ mathname="blacktriangleright",
+ unicodeslot=0x25B6,
+ },
+ [0x25B7]={
+ category="sm",
+ cjkwd="a",
+ description="WHITE RIGHT-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25B7,
+ },
+ [0x25B8]={
+ category="so",
+ description="BLACK RIGHT-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ mathclass="bin",
+ mathname="blacktriangleleft",
+ unicodeslot=0x25B8,
+ },
+ [0x25B9]={
+ category="so",
+ description="WHITE RIGHT-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25B9,
+ },
+ [0x25BA]={
+ adobename="triagrt",
+ category="so",
+ description="BLACK RIGHT-POINTING POINTER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25BA,
+ },
+ [0x25BB]={
+ category="so",
+ description="WHITE RIGHT-POINTING POINTER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25BB,
+ },
+ [0x25BC]={
+ adobename="triagdn",
+ category="so",
+ cjkwd="a",
+ description="BLACK DOWN-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25BC,
+ },
+ [0x25BD]={
+ category="so",
+ cjkwd="a",
+ description="WHITE DOWN-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="bigtriangledown",
+ unicodeslot=0x25BD,
+ },
+ [0x25BE]={
+ category="so",
+ description="BLACK DOWN-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25BE,
+ },
+ [0x25BF]={
+ category="so",
+ description="WHITE DOWN-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25BF,
+ },
+ [0x25C0]={
+ category="so",
+ cjkwd="a",
+ description="BLACK LEFT-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25C0,
+ },
+ [0x25C1]={
+ category="sm",
+ cjkwd="a",
+ description="WHITE LEFT-POINTING TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25C1,
+ },
+ [0x25C2]={
+ category="so",
+ description="BLACK LEFT-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25C2,
+ },
+ [0x25C3]={
+ category="so",
+ description="WHITE LEFT-POINTING SMALL TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25C3,
+ },
+ [0x25C4]={
+ adobename="triaglf",
+ category="so",
+ description="BLACK LEFT-POINTING POINTER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25C4,
+ },
+ [0x25C5]={
+ category="so",
+ description="WHITE LEFT-POINTING POINTER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25C5,
+ },
+ [0x25C6]={
+ category="so",
+ cjkwd="a",
+ description="BLACK DIAMOND",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25C6,
+ },
+ [0x25C7]={
+ category="so",
+ cjkwd="a",
+ description="WHITE DIAMOND",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25C7,
+ },
+ [0x25C8]={
+ category="so",
+ cjkwd="a",
+ description="WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25C8,
+ },
+ [0x25C9]={
+ category="so",
+ description="FISHEYE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25C9,
+ },
+ [0x25CA]={
+ adobename="lozenge",
+ category="so",
+ description="LOZENGE",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="lozenge",
+ unicodeslot=0x25CA,
+ },
+ [0x25CB]={
+ adobename="circle",
+ category="so",
+ cjkwd="a",
+ description="WHITE CIRCLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25CB,
+ },
+ [0x25CC]={
+ category="so",
+ description="DOTTED CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25CC,
+ },
+ [0x25CD]={
+ category="so",
+ description="CIRCLE WITH VERTICAL FILL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25CD,
+ },
+ [0x25CE]={
+ category="so",
+ cjkwd="a",
+ description="BULLSEYE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25CE,
+ },
+ [0x25CF]={
+ adobename="H18533",
+ category="so",
+ cjkwd="a",
+ description="BLACK CIRCLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25CF,
+ },
+ [0x25D0]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLE WITH LEFT HALF BLACK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25D0,
+ },
+ [0x25D1]={
+ category="so",
+ cjkwd="a",
+ description="CIRCLE WITH RIGHT HALF BLACK",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25D1,
+ },
+ [0x25D2]={
+ category="so",
+ description="CIRCLE WITH LOWER HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D2,
+ },
+ [0x25D3]={
+ category="so",
+ description="CIRCLE WITH UPPER HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D3,
+ },
+ [0x25D4]={
+ category="so",
+ description="CIRCLE WITH UPPER RIGHT QUADRANT BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D4,
+ },
+ [0x25D5]={
+ category="so",
+ description="CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D5,
+ },
+ [0x25D6]={
+ category="so",
+ description="LEFT HALF BLACK CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D6,
+ },
+ [0x25D7]={
+ category="so",
+ description="RIGHT HALF BLACK CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D7,
+ },
+ [0x25D8]={
+ adobename="invbullet",
+ category="so",
+ description="INVERSE BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D8,
+ },
+ [0x25D9]={
+ adobename="invcircle",
+ category="so",
+ description="INVERSE WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25D9,
+ },
+ [0x25DA]={
+ category="so",
+ description="UPPER HALF INVERSE WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25DA,
+ },
+ [0x25DB]={
+ category="so",
+ description="LOWER HALF INVERSE WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25DB,
+ },
+ [0x25DC]={
+ category="so",
+ description="UPPER LEFT QUADRANT CIRCULAR ARC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25DC,
+ },
+ [0x25DD]={
+ category="so",
+ description="UPPER RIGHT QUADRANT CIRCULAR ARC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25DD,
+ },
+ [0x25DE]={
+ category="so",
+ description="LOWER RIGHT QUADRANT CIRCULAR ARC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25DE,
+ },
+ [0x25DF]={
+ category="so",
+ description="LOWER LEFT QUADRANT CIRCULAR ARC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25DF,
+ },
+ [0x25E0]={
+ category="so",
+ description="UPPER HALF CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25E0,
+ },
+ [0x25E1]={
+ category="so",
+ description="LOWER HALF CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25E1,
+ },
+ [0x25E2]={
+ category="so",
+ cjkwd="a",
+ description="BLACK LOWER RIGHT TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25E2,
+ },
+ [0x25E3]={
+ category="so",
+ cjkwd="a",
+ description="BLACK LOWER LEFT TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25E3,
+ },
+ [0x25E4]={
+ category="so",
+ cjkwd="a",
+ description="BLACK UPPER LEFT TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25E4,
+ },
+ [0x25E5]={
+ category="so",
+ cjkwd="a",
+ description="BLACK UPPER RIGHT TRIANGLE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x25E5,
+ },
+ [0x25E6]={
+ adobename="openbullet",
+ category="so",
+ description="WHITE BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25E6,
+ },
+ [0x25E7]={
+ category="so",
+ description="SQUARE WITH LEFT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25E7,
+ },
+ [0x25E8]={
+ category="so",
+ description="SQUARE WITH RIGHT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25E8,
+ },
+ [0x25E9]={
+ category="so",
+ description="SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25E9,
+ },
+ [0x25EA]={
+ category="so",
+ description="SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25EA,
+ },
+ [0x25EB]={
+ category="so",
+ description="WHITE SQUARE WITH VERTICAL BISECTING LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25EB,
+ },
+ [0x25EC]={
+ category="so",
+ description="WHITE UP-POINTING TRIANGLE WITH DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25EC,
+ },
+ [0x25ED]={
+ category="so",
+ description="UP-POINTING TRIANGLE WITH LEFT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25ED,
+ },
+ [0x25EE]={
+ category="so",
+ description="UP-POINTING TRIANGLE WITH RIGHT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25EE,
+ },
+ [0x25EF]={
+ category="so",
+ cjkwd="a",
+ description="LARGE CIRCLE",
+ direction="on",
+ linebreak="ai",
+ mathclass="binary",
+ mathname="bigcirc",
+ unicodeslot=0x25EF,
+ },
+ [0x25F0]={
+ category="so",
+ description="WHITE SQUARE WITH UPPER LEFT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F0,
+ },
+ [0x25F1]={
+ category="so",
+ description="WHITE SQUARE WITH LOWER LEFT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F1,
+ },
+ [0x25F2]={
+ category="so",
+ description="WHITE SQUARE WITH LOWER RIGHT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F2,
+ },
+ [0x25F3]={
+ category="so",
+ description="WHITE SQUARE WITH UPPER RIGHT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F3,
+ },
+ [0x25F4]={
+ category="so",
+ description="WHITE CIRCLE WITH UPPER LEFT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F4,
+ },
+ [0x25F5]={
+ category="so",
+ description="WHITE CIRCLE WITH LOWER LEFT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F5,
+ },
+ [0x25F6]={
+ category="so",
+ description="WHITE CIRCLE WITH LOWER RIGHT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F6,
+ },
+ [0x25F7]={
+ category="so",
+ description="WHITE CIRCLE WITH UPPER RIGHT QUADRANT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F7,
+ },
+ [0x25F8]={
+ category="sm",
+ description="UPPER LEFT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F8,
+ },
+ [0x25F9]={
+ category="sm",
+ description="UPPER RIGHT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25F9,
+ },
+ [0x25FA]={
+ category="sm",
+ description="LOWER LEFT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25FA,
+ },
+ [0x25FB]={
+ category="sm",
+ description="WHITE MEDIUM SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25FB,
+ },
+ [0x25FC]={
+ category="sm",
+ description="BLACK MEDIUM SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25FC,
+ },
+ [0x25FD]={
+ category="sm",
+ description="WHITE MEDIUM SMALL SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25FD,
+ },
+ [0x25FE]={
+ category="sm",
+ description="BLACK MEDIUM SMALL SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25FE,
+ },
+ [0x25FF]={
+ category="sm",
+ description="LOWER RIGHT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x25FF,
+ },
+ [0x2600]={
+ category="so",
+ description="BLACK SUN WITH RAYS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2600,
+ },
+ [0x2601]={
+ category="so",
+ description="CLOUD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2601,
+ },
+ [0x2602]={
+ category="so",
+ description="UMBRELLA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2602,
+ },
+ [0x2603]={
+ category="so",
+ description="SNOWMAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2603,
+ },
+ [0x2604]={
+ category="so",
+ description="COMET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2604,
+ },
+ [0x2605]={
+ category="so",
+ cjkwd="a",
+ description="BLACK STAR",
+ direction="on",
+ linebreak="ai",
+ mathclass="ord",
+ mathname="bigstar",
+ unicodeslot=0x2605,
+ },
+ [0x2606]={
+ category="so",
+ cjkwd="a",
+ description="WHITE STAR",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2606,
+ },
+ [0x2607]={
+ category="so",
+ description="LIGHTNING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2607,
+ },
+ [0x2608]={
+ category="so",
+ description="THUNDERSTORM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2608,
+ },
+ [0x2609]={
+ category="so",
+ cjkwd="a",
+ description="SUN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2609,
+ },
+ [0x260A]={
+ category="so",
+ description="ASCENDING NODE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x260A,
+ },
+ [0x260B]={
+ category="so",
+ description="DESCENDING NODE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x260B,
+ },
+ [0x260C]={
+ category="so",
+ description="CONJUNCTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x260C,
+ },
+ [0x260D]={
+ category="so",
+ description="OPPOSITION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x260D,
+ },
+ [0x260E]={
+ category="so",
+ cjkwd="a",
+ description="BLACK TELEPHONE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x260E,
+ },
+ [0x260F]={
+ category="so",
+ cjkwd="a",
+ description="WHITE TELEPHONE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x260F,
+ },
+ [0x2610]={
+ category="so",
+ description="BALLOT BOX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2610,
+ },
+ [0x2611]={
+ category="so",
+ description="BALLOT BOX WITH CHECK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2611,
+ },
+ [0x2612]={
+ category="so",
+ description="BALLOT BOX WITH X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2612,
+ },
+ [0x2613]={
+ category="so",
+ description="SALTIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2613,
+ },
+ [0x2614]={
+ category="so",
+ cjkwd="a",
+ description="UMBRELLA WITH RAIN DROPS",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2614,
+ },
+ [0x2615]={
+ category="so",
+ cjkwd="a",
+ description="HOT BEVERAGE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2615,
+ },
+ [0x2616]={
+ category="so",
+ description="WHITE SHOGI PIECE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2616,
+ },
+ [0x2617]={
+ category="so",
+ description="BLACK SHOGI PIECE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2617,
+ },
+ [0x2618]={
+ category="so",
+ description="SHAMROCK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2618,
+ },
+ [0x2619]={
+ category="so",
+ description="REVERSED ROTATED FLORAL HEART BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2619,
+ },
+ [0x261A]={
+ category="so",
+ description="BLACK LEFT POINTING INDEX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x261A,
+ },
+ [0x261B]={
+ category="so",
+ description="BLACK RIGHT POINTING INDEX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x261B,
+ },
+ [0x261C]={
+ category="so",
+ cjkwd="a",
+ description="WHITE LEFT POINTING INDEX",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x261C,
+ },
+ [0x261D]={
+ category="so",
+ description="WHITE UP POINTING INDEX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x261D,
+ },
+ [0x261E]={
+ category="so",
+ cjkwd="a",
+ description="WHITE RIGHT POINTING INDEX",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x261E,
+ },
+ [0x261F]={
+ category="so",
+ description="WHITE DOWN POINTING INDEX",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x261F,
+ },
+ [0x2620]={
+ category="so",
+ description="SKULL AND CROSSBONES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2620,
+ },
+ [0x2621]={
+ category="so",
+ description="CAUTION SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2621,
+ },
+ [0x2622]={
+ category="so",
+ description="RADIOACTIVE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2622,
+ },
+ [0x2623]={
+ category="so",
+ description="BIOHAZARD SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2623,
+ },
+ [0x2624]={
+ category="so",
+ description="CADUCEUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2624,
+ },
+ [0x2625]={
+ category="so",
+ description="ANKH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2625,
+ },
+ [0x2626]={
+ category="so",
+ description="ORTHODOX CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2626,
+ },
+ [0x2627]={
+ category="so",
+ description="CHI RHO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2627,
+ },
+ [0x2628]={
+ category="so",
+ description="CROSS OF LORRAINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2628,
+ },
+ [0x2629]={
+ category="so",
+ description="CROSS OF JERUSALEM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2629,
+ },
+ [0x262A]={
+ category="so",
+ description="STAR AND CRESCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x262A,
+ },
+ [0x262B]={
+ category="so",
+ description="FARSI SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x262B,
+ },
+ [0x262C]={
+ category="so",
+ description="ADI SHAKTI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x262C,
+ },
+ [0x262D]={
+ category="so",
+ description="HAMMER AND SICKLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x262D,
+ },
+ [0x262E]={
+ category="so",
+ description="PEACE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x262E,
+ },
+ [0x262F]={
+ category="so",
+ description="YIN YANG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x262F,
+ },
+ [0x2630]={
+ category="so",
+ description="TRIGRAM FOR HEAVEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2630,
+ },
+ [0x2631]={
+ category="so",
+ description="TRIGRAM FOR LAKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2631,
+ },
+ [0x2632]={
+ category="so",
+ description="TRIGRAM FOR FIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2632,
+ },
+ [0x2633]={
+ category="so",
+ description="TRIGRAM FOR THUNDER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2633,
+ },
+ [0x2634]={
+ category="so",
+ description="TRIGRAM FOR WIND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2634,
+ },
+ [0x2635]={
+ category="so",
+ description="TRIGRAM FOR WATER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2635,
+ },
+ [0x2636]={
+ category="so",
+ description="TRIGRAM FOR MOUNTAIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2636,
+ },
+ [0x2637]={
+ category="so",
+ description="TRIGRAM FOR EARTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2637,
+ },
+ [0x2638]={
+ category="so",
+ description="WHEEL OF DHARMA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2638,
+ },
+ [0x2639]={
+ category="so",
+ description="WHITE FROWNING FACE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2639,
+ },
+ [0x263A]={
+ adobename="smileface",
+ category="so",
+ description="WHITE SMILING FACE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x263A,
+ },
+ [0x263B]={
+ adobename="invsmileface",
+ category="so",
+ description="BLACK SMILING FACE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x263B,
+ },
+ [0x263C]={
+ adobename="sun",
+ category="so",
+ description="WHITE SUN WITH RAYS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x263C,
+ },
+ [0x263D]={
+ category="so",
+ description="FIRST QUARTER MOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x263D,
+ },
+ [0x263E]={
+ category="so",
+ description="LAST QUARTER MOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x263E,
+ },
+ [0x263F]={
+ category="so",
+ description="MERCURY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x263F,
+ },
+ [0x2640]={
+ adobename="female",
+ category="so",
+ cjkwd="a",
+ description="FEMALE SIGN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2640,
+ },
+ [0x2641]={
+ category="so",
+ description="EARTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2641,
+ },
+ [0x2642]={
+ adobename="male",
+ category="so",
+ cjkwd="a",
+ description="MALE SIGN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2642,
+ },
+ [0x2643]={
+ category="so",
+ description="JUPITER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2643,
+ },
+ [0x2644]={
+ category="so",
+ description="SATURN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2644,
+ },
+ [0x2645]={
+ category="so",
+ description="URANUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2645,
+ },
+ [0x2646]={
+ category="so",
+ description="NEPTUNE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2646,
+ },
+ [0x2647]={
+ category="so",
+ description="PLUTO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2647,
+ },
+ [0x2648]={
+ category="so",
+ description="ARIES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2648,
+ },
+ [0x2649]={
+ category="so",
+ description="TAURUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2649,
+ },
+ [0x264A]={
+ category="so",
+ description="GEMINI",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x264A,
+ },
+ [0x264B]={
+ category="so",
+ description="CANCER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x264B,
+ },
+ [0x264C]={
+ category="so",
+ description="LEO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x264C,
+ },
+ [0x264D]={
+ category="so",
+ description="VIRGO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x264D,
+ },
+ [0x264E]={
+ category="so",
+ description="LIBRA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x264E,
+ },
+ [0x264F]={
+ category="so",
+ description="SCORPIUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x264F,
+ },
+ [0x2650]={
+ category="so",
+ description="SAGITTARIUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2650,
+ },
+ [0x2651]={
+ category="so",
+ description="CAPRICORN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2651,
+ },
+ [0x2652]={
+ category="so",
+ description="AQUARIUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2652,
+ },
+ [0x2653]={
+ category="so",
+ description="PISCES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2653,
+ },
+ [0x2654]={
+ category="so",
+ description="WHITE CHESS KING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2654,
+ },
+ [0x2655]={
+ category="so",
+ description="WHITE CHESS QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2655,
+ },
+ [0x2656]={
+ category="so",
+ description="WHITE CHESS ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2656,
+ },
+ [0x2657]={
+ category="so",
+ description="WHITE CHESS BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2657,
+ },
+ [0x2658]={
+ category="so",
+ description="WHITE CHESS KNIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2658,
+ },
+ [0x2659]={
+ category="so",
+ description="WHITE CHESS PAWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2659,
+ },
+ [0x265A]={
+ category="so",
+ description="BLACK CHESS KING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x265A,
+ },
+ [0x265B]={
+ category="so",
+ description="BLACK CHESS QUEEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x265B,
+ },
+ [0x265C]={
+ category="so",
+ description="BLACK CHESS ROOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x265C,
+ },
+ [0x265D]={
+ category="so",
+ description="BLACK CHESS BISHOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x265D,
+ },
+ [0x265E]={
+ category="so",
+ description="BLACK CHESS KNIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x265E,
+ },
+ [0x265F]={
+ category="so",
+ description="BLACK CHESS PAWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x265F,
+ },
+ [0x2660]={
+ adobename="spade",
+ category="so",
+ cjkwd="a",
+ description="BLACK SPADE SUIT",
+ direction="on",
+ linebreak="ai",
+ mathclass="default",
+ mathname="spadesuit",
+ unicodeslot=0x2660,
+ },
+ [0x2661]={
+ category="so",
+ cjkwd="a",
+ description="WHITE HEART SUIT",
+ direction="on",
+ linebreak="ai",
+ mathclass="default",
+ mathname="heartsuit",
+ unicodeslot=0x2661,
+ },
+ [0x2662]={
+ category="so",
+ description="WHITE DIAMOND SUIT",
+ direction="on",
+ linebreak="al",
+ mathclass="default",
+ mathname="diamondsuit",
+ unicodeslot=0x2662,
+ },
+ [0x2663]={
+ adobename="club",
+ category="so",
+ cjkwd="a",
+ description="BLACK CLUB SUIT",
+ direction="on",
+ linebreak="ai",
+ mathclass="default",
+ mathname="clubsuit",
+ unicodeslot=0x2663,
+ },
+ [0x2664]={
+ category="so",
+ cjkwd="a",
+ description="WHITE SPADE SUIT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2664,
+ },
+ [0x2665]={
+ adobename="heart",
+ category="so",
+ cjkwd="a",
+ description="BLACK HEART SUIT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2665,
+ },
+ [0x2666]={
+ adobename="diamond",
+ category="so",
+ description="BLACK DIAMOND SUIT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2666,
+ },
+ [0x2667]={
+ category="so",
+ cjkwd="a",
+ description="WHITE CLUB SUIT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2667,
+ },
+ [0x2668]={
+ category="so",
+ cjkwd="a",
+ description="HOT SPRINGS",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2668,
+ },
+ [0x2669]={
+ category="so",
+ cjkwd="a",
+ description="QUARTER NOTE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2669,
+ },
+ [0x266A]={
+ adobename="musicalnote",
+ category="so",
+ cjkwd="a",
+ description="EIGHTH NOTE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x266A,
+ },
+ [0x266B]={
+ adobename="musicalnotedbl",
+ category="so",
+ description="BEAMED EIGHTH NOTES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x266B,
+ },
+ [0x266C]={
+ category="so",
+ cjkwd="a",
+ description="BEAMED SIXTEENTH NOTES",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x266C,
+ },
+ [0x266D]={
+ category="so",
+ cjkwd="a",
+ description="MUSIC FLAT SIGN",
+ direction="on",
+ linebreak="ai",
+ mathclass="default",
+ mathname="flat",
+ unicodeslot=0x266D,
+ },
+ [0x266E]={
+ category="so",
+ description="MUSIC NATURAL SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="default",
+ mathname="natural",
+ unicodeslot=0x266E,
+ },
+ [0x266F]={
+ category="sm",
+ cjkwd="a",
+ description="MUSIC SHARP SIGN",
+ direction="on",
+ linebreak="ai",
+ mathclass="default",
+ mathname="sharp",
+ unicodeslot=0x266F,
+ },
+ [0x2670]={
+ category="so",
+ description="WEST SYRIAC CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2670,
+ },
+ [0x2671]={
+ category="so",
+ description="EAST SYRIAC CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2671,
+ },
+ [0x2672]={
+ category="so",
+ description="UNIVERSAL RECYCLING SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2672,
+ },
+ [0x2673]={
+ category="so",
+ description="RECYCLING SYMBOL FOR TYPE-0x0001 PLASTICS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2673,
+ },
+ [0x2674]={
+ category="so",
+ description="RECYCLING SYMBOL FOR TYPE-0x0002 PLASTICS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2674,
+ },
+ [0x2675]={
+ category="so",
+ description="RECYCLING SYMBOL FOR TYPE-0x0003 PLASTICS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2675,
+ },
+ [0x2676]={
+ category="so",
+ description="RECYCLING SYMBOL FOR TYPE-0x0004 PLASTICS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2676,
+ },
+ [0x2677]={
+ category="so",
+ description="RECYCLING SYMBOL FOR TYPE-0x0005 PLASTICS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2677,
+ },
+ [0x2678]={
+ category="so",
+ description="RECYCLING SYMBOL FOR TYPE-0x0006 PLASTICS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2678,
+ },
+ [0x2679]={
+ category="so",
+ description="RECYCLING SYMBOL FOR TYPE-0x0007 PLASTICS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2679,
+ },
+ [0x267A]={
+ category="so",
+ description="RECYCLING SYMBOL FOR GENERIC MATERIALS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x267A,
+ },
+ [0x267B]={
+ category="so",
+ description="BLACK UNIVERSAL RECYCLING SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x267B,
+ },
+ [0x267C]={
+ category="so",
+ description="RECYCLED PAPER SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x267C,
+ },
+ [0x267D]={
+ category="so",
+ description="PARTIALLY-RECYCLED PAPER SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x267D,
+ },
+ [0x267E]={
+ category="so",
+ description="PERMANENT PAPER SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x267E,
+ },
+ [0x267F]={
+ category="so",
+ description="WHEELCHAIR SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x267F,
+ },
+ [0x2680]={
+ category="so",
+ description="DIE FACE-0x0001",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2680,
+ },
+ [0x2681]={
+ category="so",
+ description="DIE FACE-0x0002",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2681,
+ },
+ [0x2682]={
+ category="so",
+ description="DIE FACE-0x0003",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2682,
+ },
+ [0x2683]={
+ category="so",
+ description="DIE FACE-0x0004",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2683,
+ },
+ [0x2684]={
+ category="so",
+ description="DIE FACE-0x0005",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2684,
+ },
+ [0x2685]={
+ category="so",
+ description="DIE FACE-0x0006",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2685,
+ },
+ [0x2686]={
+ category="so",
+ description="WHITE CIRCLE WITH DOT RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2686,
+ },
+ [0x2687]={
+ category="so",
+ description="WHITE CIRCLE WITH TWO DOTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2687,
+ },
+ [0x2688]={
+ category="so",
+ description="BLACK CIRCLE WITH WHITE DOT RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2688,
+ },
+ [0x2689]={
+ category="so",
+ description="BLACK CIRCLE WITH TWO WHITE DOTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2689,
+ },
+ [0x268A]={
+ category="so",
+ description="MONOGRAM FOR YANG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x268A,
+ },
+ [0x268B]={
+ category="so",
+ description="MONOGRAM FOR YIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x268B,
+ },
+ [0x268C]={
+ category="so",
+ description="DIGRAM FOR GREATER YANG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x268C,
+ },
+ [0x268D]={
+ category="so",
+ description="DIGRAM FOR LESSER YIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x268D,
+ },
+ [0x268E]={
+ category="so",
+ description="DIGRAM FOR LESSER YANG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x268E,
+ },
+ [0x268F]={
+ category="so",
+ description="DIGRAM FOR GREATER YIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x268F,
+ },
+ [0x2690]={
+ category="so",
+ description="WHITE FLAG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2690,
+ },
+ [0x2691]={
+ category="so",
+ description="BLACK FLAG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2691,
+ },
+ [0x2692]={
+ category="so",
+ description="HAMMER AND PICK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2692,
+ },
+ [0x2693]={
+ category="so",
+ description="ANCHOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2693,
+ },
+ [0x2694]={
+ category="so",
+ description="CROSSED SWORDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2694,
+ },
+ [0x2695]={
+ category="so",
+ description="STAFF OF AESCULAPIUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2695,
+ },
+ [0x2696]={
+ category="so",
+ description="SCALES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2696,
+ },
+ [0x2697]={
+ category="so",
+ description="ALEMBIC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2697,
+ },
+ [0x2698]={
+ category="so",
+ description="FLOWER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2698,
+ },
+ [0x2699]={
+ category="so",
+ description="GEAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2699,
+ },
+ [0x269A]={
+ category="so",
+ description="STAFF OF HERMES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x269A,
+ },
+ [0x269B]={
+ category="so",
+ description="ATOM SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x269B,
+ },
+ [0x269C]={
+ category="so",
+ description="FLEUR-DE-LIS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x269C,
+ },
+ [0x26A0]={
+ category="so",
+ description="WARNING SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A0,
+ },
+ [0x26A1]={
+ category="so",
+ description="HIGH VOLTAGE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A1,
+ },
+ [0x26A2]={
+ category="so",
+ description="DOUBLED FEMALE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A2,
+ },
+ [0x26A3]={
+ category="so",
+ description="DOUBLED MALE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A3,
+ },
+ [0x26A4]={
+ category="so",
+ description="INTERLOCKED FEMALE AND MALE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A4,
+ },
+ [0x26A5]={
+ category="so",
+ description="MALE AND FEMALE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A5,
+ },
+ [0x26A6]={
+ category="so",
+ description="MALE WITH STROKE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A6,
+ },
+ [0x26A7]={
+ category="so",
+ description="MALE WITH STROKE AND MALE AND FEMALE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A7,
+ },
+ [0x26A8]={
+ category="so",
+ description="VERTICAL MALE WITH STROKE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A8,
+ },
+ [0x26A9]={
+ category="so",
+ description="HORIZONTAL MALE WITH STROKE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26A9,
+ },
+ [0x26AA]={
+ category="so",
+ description="MEDIUM WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26AA,
+ },
+ [0x26AB]={
+ category="so",
+ description="MEDIUM BLACK CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26AB,
+ },
+ [0x26AC]={
+ category="so",
+ description="MEDIUM SMALL WHITE CIRCLE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x26AC,
+ },
+ [0x26AD]={
+ category="so",
+ description="MARRIAGE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26AD,
+ },
+ [0x26AE]={
+ category="so",
+ description="DIVORCE SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26AE,
+ },
+ [0x26AF]={
+ category="so",
+ description="UNMARRIED PARTNERSHIP SYMBOL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26AF,
+ },
+ [0x26B0]={
+ category="so",
+ description="COFFIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26B0,
+ },
+ [0x26B1]={
+ category="so",
+ description="FUNERAL URN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26B1,
+ },
+ [0x26B2]={
+ category="so",
+ description="NEUTER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x26B2,
+ },
+ [0x2701]={
+ category="so",
+ description="UPPER BLADE SCISSORS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2701,
+ },
+ [0x2702]={
+ category="so",
+ description="BLACK SCISSORS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2702,
+ },
+ [0x2703]={
+ category="so",
+ description="LOWER BLADE SCISSORS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2703,
+ },
+ [0x2704]={
+ category="so",
+ description="WHITE SCISSORS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2704,
+ },
+ [0x2706]={
+ category="so",
+ description="TELEPHONE LOCATION SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2706,
+ },
+ [0x2707]={
+ category="so",
+ description="TAPE DRIVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2707,
+ },
+ [0x2708]={
+ category="so",
+ description="AIRPLANE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2708,
+ },
+ [0x2709]={
+ category="so",
+ description="ENVELOPE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2709,
+ },
+ [0x270C]={
+ category="so",
+ description="VICTORY HAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x270C,
+ },
+ [0x270D]={
+ category="so",
+ description="WRITING HAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x270D,
+ },
+ [0x270E]={
+ category="so",
+ description="LOWER RIGHT PENCIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x270E,
+ },
+ [0x270F]={
+ category="so",
+ description="PENCIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x270F,
+ },
+ [0x2710]={
+ category="so",
+ description="UPPER RIGHT PENCIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2710,
+ },
+ [0x2711]={
+ category="so",
+ description="WHITE NIB",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2711,
+ },
+ [0x2712]={
+ category="so",
+ description="BLACK NIB",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2712,
+ },
+ [0x2713]={
+ category="so",
+ description="CHECK MARK",
+ direction="on",
+ linebreak="al",
+ mathclass="nothing",
+ mathname="checkmark",
+ unicodeslot=0x2713,
+ },
+ [0x2714]={
+ category="so",
+ description="HEAVY CHECK MARK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2714,
+ },
+ [0x2715]={
+ category="so",
+ description="MULTIPLICATION X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2715,
+ },
+ [0x2716]={
+ category="so",
+ description="HEAVY MULTIPLICATION X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2716,
+ },
+ [0x2717]={
+ category="so",
+ description="BALLOT X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2717,
+ },
+ [0x2718]={
+ category="so",
+ description="HEAVY BALLOT X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2718,
+ },
+ [0x2719]={
+ category="so",
+ description="OUTLINED GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2719,
+ },
+ [0x271A]={
+ category="so",
+ description="HEAVY GREEK CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x271A,
+ },
+ [0x271B]={
+ category="so",
+ description="OPEN CENTRE CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x271B,
+ },
+ [0x271C]={
+ category="so",
+ description="HEAVY OPEN CENTRE CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x271C,
+ },
+ [0x271D]={
+ category="so",
+ description="LATIN CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x271D,
+ },
+ [0x271E]={
+ category="so",
+ description="SHADOWED WHITE LATIN CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x271E,
+ },
+ [0x271F]={
+ category="so",
+ description="OUTLINED LATIN CROSS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x271F,
+ },
+ [0x2720]={
+ category="so",
+ description="MALTESE CROSS",
+ direction="on",
+ linebreak="al",
+ mathclass="nothing",
+ mathname="maltese",
+ unicodeslot=0x2720,
+ },
+ [0x2721]={
+ category="so",
+ description="STAR OF DAVID",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2721,
+ },
+ [0x2722]={
+ category="so",
+ description="FOUR TEARDROP-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2722,
+ },
+ [0x2723]={
+ category="so",
+ description="FOUR BALLOON-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2723,
+ },
+ [0x2724]={
+ category="so",
+ description="HEAVY FOUR BALLOON-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2724,
+ },
+ [0x2725]={
+ category="so",
+ description="FOUR CLUB-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2725,
+ },
+ [0x2726]={
+ category="so",
+ description="BLACK FOUR POINTED STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2726,
+ },
+ [0x2727]={
+ category="so",
+ description="WHITE FOUR POINTED STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2727,
+ },
+ [0x2729]={
+ category="so",
+ description="STRESS OUTLINED WHITE STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2729,
+ },
+ [0x272A]={
+ category="so",
+ description="CIRCLED WHITE STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x272A,
+ },
+ [0x272B]={
+ category="so",
+ description="OPEN CENTRE BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x272B,
+ },
+ [0x272C]={
+ category="so",
+ description="BLACK CENTRE WHITE STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x272C,
+ },
+ [0x272D]={
+ category="so",
+ description="OUTLINED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x272D,
+ },
+ [0x272E]={
+ category="so",
+ description="HEAVY OUTLINED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x272E,
+ },
+ [0x272F]={
+ category="so",
+ description="PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x272F,
+ },
+ [0x2730]={
+ category="so",
+ description="SHADOWED WHITE STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2730,
+ },
+ [0x2731]={
+ category="so",
+ description="HEAVY ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2731,
+ },
+ [0x2732]={
+ category="so",
+ description="OPEN CENTRE ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2732,
+ },
+ [0x2733]={
+ category="so",
+ description="EIGHT SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2733,
+ },
+ [0x2734]={
+ category="so",
+ description="EIGHT POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2734,
+ },
+ [0x2735]={
+ category="so",
+ description="EIGHT POINTED PINWHEEL STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2735,
+ },
+ [0x2736]={
+ category="so",
+ description="SIX POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2736,
+ },
+ [0x2737]={
+ category="so",
+ description="EIGHT POINTED RECTILINEAR BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2737,
+ },
+ [0x2738]={
+ category="so",
+ description="HEAVY EIGHT POINTED RECTILINEAR BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2738,
+ },
+ [0x2739]={
+ category="so",
+ description="TWELVE POINTED BLACK STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2739,
+ },
+ [0x273A]={
+ category="so",
+ description="SIXTEEN POINTED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x273A,
+ },
+ [0x273B]={
+ category="so",
+ description="TEARDROP-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x273B,
+ },
+ [0x273C]={
+ category="so",
+ description="OPEN CENTRE TEARDROP-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x273C,
+ },
+ [0x273D]={
+ category="so",
+ cjkwd="a",
+ description="HEAVY TEARDROP-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x273D,
+ },
+ [0x273E]={
+ category="so",
+ description="SIX PETALLED BLACK AND WHITE FLORETTE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x273E,
+ },
+ [0x273F]={
+ category="so",
+ description="BLACK FLORETTE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x273F,
+ },
+ [0x2740]={
+ category="so",
+ description="WHITE FLORETTE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2740,
+ },
+ [0x2741]={
+ category="so",
+ description="EIGHT PETALLED OUTLINED BLACK FLORETTE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2741,
+ },
+ [0x2742]={
+ category="so",
+ description="CIRCLED OPEN CENTRE EIGHT POINTED STAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2742,
+ },
+ [0x2743]={
+ category="so",
+ description="HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2743,
+ },
+ [0x2744]={
+ category="so",
+ description="SNOWFLAKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2744,
+ },
+ [0x2745]={
+ category="so",
+ description="TIGHT TRIFOLIATE SNOWFLAKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2745,
+ },
+ [0x2746]={
+ category="so",
+ description="HEAVY CHEVRON SNOWFLAKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2746,
+ },
+ [0x2747]={
+ category="so",
+ description="SPARKLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2747,
+ },
+ [0x2748]={
+ category="so",
+ description="HEAVY SPARKLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2748,
+ },
+ [0x2749]={
+ category="so",
+ description="BALLOON-SPOKED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2749,
+ },
+ [0x274A]={
+ category="so",
+ description="EIGHT TEARDROP-SPOKED PROPELLER ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x274A,
+ },
+ [0x274B]={
+ category="so",
+ description="HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x274B,
+ },
+ [0x274D]={
+ category="so",
+ description="SHADOWED WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x274D,
+ },
+ [0x274F]={
+ category="so",
+ description="LOWER RIGHT DROP-SHADOWED WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x274F,
+ },
+ [0x2750]={
+ category="so",
+ description="UPPER RIGHT DROP-SHADOWED WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2750,
+ },
+ [0x2751]={
+ category="so",
+ description="LOWER RIGHT SHADOWED WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2751,
+ },
+ [0x2752]={
+ category="so",
+ description="UPPER RIGHT SHADOWED WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2752,
+ },
+ [0x2756]={
+ category="so",
+ description="BLACK DIAMOND MINUS WHITE X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2756,
+ },
+ [0x2758]={
+ category="so",
+ description="LIGHT VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2758,
+ },
+ [0x2759]={
+ category="so",
+ description="MEDIUM VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2759,
+ },
+ [0x275A]={
+ category="so",
+ description="HEAVY VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x275A,
+ },
+ [0x275B]={
+ category="so",
+ description="HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x275B,
+ },
+ [0x275C]={
+ category="so",
+ description="HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x275C,
+ },
+ [0x275D]={
+ category="so",
+ description="HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x275D,
+ },
+ [0x275E]={
+ category="so",
+ description="HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x275E,
+ },
+ [0x2761]={
+ category="so",
+ description="CURVED STEM PARAGRAPH SIGN ORNAMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2761,
+ },
+ [0x2762]={
+ category="so",
+ description="HEAVY EXCLAMATION MARK ORNAMENT",
+ direction="on",
+ linebreak="ex",
+ unicodeslot=0x2762,
+ },
+ [0x2763]={
+ category="so",
+ description="HEAVY HEART EXCLAMATION MARK ORNAMENT",
+ direction="on",
+ linebreak="ex",
+ unicodeslot=0x2763,
+ },
+ [0x2764]={
+ category="so",
+ description="HEAVY BLACK HEART",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2764,
+ },
+ [0x2765]={
+ category="so",
+ description="ROTATED HEAVY BLACK HEART BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2765,
+ },
+ [0x2766]={
+ category="so",
+ description="FLORAL HEART",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2766,
+ },
+ [0x2767]={
+ category="so",
+ description="ROTATED FLORAL HEART BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2767,
+ },
+ [0x2768]={
+ category="ps",
+ description="MEDIUM LEFT PARENTHESIS ORNAMENT",
+ direction="on",
+ linebreak="op",
+ mirror=0x2769,
+ unicodeslot=0x2768,
+ },
+ [0x2769]={
+ category="pe",
+ description="MEDIUM RIGHT PARENTHESIS ORNAMENT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2768,
+ unicodeslot=0x2769,
+ },
+ [0x276A]={
+ category="ps",
+ description="MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT",
+ direction="on",
+ linebreak="op",
+ mirror=0x276B,
+ unicodeslot=0x276A,
+ },
+ [0x276B]={
+ category="pe",
+ description="MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x276A,
+ unicodeslot=0x276B,
+ },
+ [0x276C]={
+ category="ps",
+ description="MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT",
+ direction="on",
+ linebreak="op",
+ mirror=0x276D,
+ unicodeslot=0x276C,
+ },
+ [0x276D]={
+ category="pe",
+ description="MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x276C,
+ unicodeslot=0x276D,
+ },
+ [0x276E]={
+ category="ps",
+ description="HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="op",
+ mirror=0x276F,
+ unicodeslot=0x276E,
+ },
+ [0x276F]={
+ category="pe",
+ description="HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x276E,
+ unicodeslot=0x276F,
+ },
+ [0x2770]={
+ category="ps",
+ description="HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT",
+ direction="on",
+ linebreak="op",
+ mirror=0x2771,
+ unicodeslot=0x2770,
+ },
+ [0x2771]={
+ category="pe",
+ description="HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2770,
+ unicodeslot=0x2771,
+ },
+ [0x2772]={
+ category="ps",
+ description="LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT",
+ direction="on",
+ linebreak="op",
+ mirror=0x2773,
+ unicodeslot=0x2772,
+ },
+ [0x2773]={
+ category="pe",
+ description="LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2772,
+ unicodeslot=0x2773,
+ },
+ [0x2774]={
+ category="ps",
+ description="MEDIUM LEFT CURLY BRACKET ORNAMENT",
+ direction="on",
+ linebreak="op",
+ mirror=0x2775,
+ unicodeslot=0x2774,
+ },
+ [0x2775]={
+ category="pe",
+ description="MEDIUM RIGHT CURLY BRACKET ORNAMENT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2774,
+ unicodeslot=0x2775,
+ },
+ [0x2776]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT ONE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2776,
+ },
+ [0x2777]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT TWO",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2777,
+ },
+ [0x2778]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT THREE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2778,
+ },
+ [0x2779]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT FOUR",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2779,
+ },
+ [0x277A]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT FIVE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x277A,
+ },
+ [0x277B]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT SIX",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x277B,
+ },
+ [0x277C]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT SEVEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x277C,
+ },
+ [0x277D]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT EIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x277D,
+ },
+ [0x277E]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED DIGIT NINE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x277E,
+ },
+ [0x277F]={
+ category="no",
+ cjkwd="a",
+ description="DINGBAT NEGATIVE CIRCLED NUMBER TEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x277F,
+ },
+ [0x2780]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT ONE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2780,
+ },
+ [0x2781]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT TWO",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2781,
+ },
+ [0x2782]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT THREE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2782,
+ },
+ [0x2783]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT FOUR",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2783,
+ },
+ [0x2784]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT FIVE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2784,
+ },
+ [0x2785]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT SIX",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2785,
+ },
+ [0x2786]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2786,
+ },
+ [0x2787]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2787,
+ },
+ [0x2788]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF DIGIT NINE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2788,
+ },
+ [0x2789]={
+ category="no",
+ description="DINGBAT CIRCLED SANS-SERIF NUMBER TEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2789,
+ },
+ [0x278A]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x278A,
+ },
+ [0x278B]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x278B,
+ },
+ [0x278C]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x278C,
+ },
+ [0x278D]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x278D,
+ },
+ [0x278E]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x278E,
+ },
+ [0x278F]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x278F,
+ },
+ [0x2790]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2790,
+ },
+ [0x2791]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2791,
+ },
+ [0x2792]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2792,
+ },
+ [0x2793]={
+ category="no",
+ description="DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0x2793,
+ },
+ [0x2794]={
+ category="so",
+ description="HEAVY WIDE-HEADED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2794,
+ },
+ [0x2798]={
+ category="so",
+ description="HEAVY SOUTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2798,
+ },
+ [0x2799]={
+ category="so",
+ description="HEAVY RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2799,
+ },
+ [0x279A]={
+ category="so",
+ description="HEAVY NORTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x279A,
+ },
+ [0x279B]={
+ category="so",
+ description="DRAFTING POINT RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x279B,
+ },
+ [0x279C]={
+ category="so",
+ description="HEAVY ROUND-TIPPED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x279C,
+ },
+ [0x279D]={
+ category="so",
+ description="TRIANGLE-HEADED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x279D,
+ },
+ [0x279E]={
+ category="so",
+ description="HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x279E,
+ },
+ [0x279F]={
+ category="so",
+ description="DASHED TRIANGLE-HEADED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x279F,
+ },
+ [0x27A0]={
+ category="so",
+ description="HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A0,
+ },
+ [0x27A1]={
+ category="so",
+ description="BLACK RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A1,
+ },
+ [0x27A2]={
+ category="so",
+ description="THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A2,
+ },
+ [0x27A3]={
+ category="so",
+ description="THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A3,
+ },
+ [0x27A4]={
+ category="so",
+ description="BLACK RIGHTWARDS ARROWHEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A4,
+ },
+ [0x27A5]={
+ category="so",
+ description="HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A5,
+ },
+ [0x27A6]={
+ category="so",
+ description="HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A6,
+ },
+ [0x27A7]={
+ category="so",
+ description="SQUAT BLACK RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A7,
+ },
+ [0x27A8]={
+ category="so",
+ description="HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A8,
+ },
+ [0x27A9]={
+ category="so",
+ description="RIGHT-SHADED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27A9,
+ },
+ [0x27AA]={
+ category="so",
+ description="LEFT-SHADED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27AA,
+ },
+ [0x27AB]={
+ category="so",
+ description="BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27AB,
+ },
+ [0x27AC]={
+ category="so",
+ description="FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27AC,
+ },
+ [0x27AD]={
+ category="so",
+ description="HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27AD,
+ },
+ [0x27AE]={
+ category="so",
+ description="HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27AE,
+ },
+ [0x27AF]={
+ category="so",
+ description="NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27AF,
+ },
+ [0x27B1]={
+ category="so",
+ description="NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B1,
+ },
+ [0x27B2]={
+ category="so",
+ description="CIRCLED HEAVY WHITE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B2,
+ },
+ [0x27B3]={
+ category="so",
+ description="WHITE-FEATHERED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B3,
+ },
+ [0x27B4]={
+ category="so",
+ description="BLACK-FEATHERED SOUTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B4,
+ },
+ [0x27B5]={
+ category="so",
+ description="BLACK-FEATHERED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B5,
+ },
+ [0x27B6]={
+ category="so",
+ description="BLACK-FEATHERED NORTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B6,
+ },
+ [0x27B7]={
+ category="so",
+ description="HEAVY BLACK-FEATHERED SOUTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B7,
+ },
+ [0x27B8]={
+ category="so",
+ description="HEAVY BLACK-FEATHERED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B8,
+ },
+ [0x27B9]={
+ category="so",
+ description="HEAVY BLACK-FEATHERED NORTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27B9,
+ },
+ [0x27BA]={
+ category="so",
+ description="TEARDROP-BARBED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27BA,
+ },
+ [0x27BB]={
+ category="so",
+ description="HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27BB,
+ },
+ [0x27BC]={
+ category="so",
+ description="WEDGE-TAILED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27BC,
+ },
+ [0x27BD]={
+ category="so",
+ description="HEAVY WEDGE-TAILED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27BD,
+ },
+ [0x27BE]={
+ category="so",
+ description="OPEN-OUTLINED RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27BE,
+ },
+ [0x27C0]={
+ category="sm",
+ description="THREE DIMENSIONAL ANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27C0,
+ },
+ [0x27C1]={
+ category="sm",
+ description="WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27C1,
+ },
+ [0x27C2]={
+ category="sm",
+ description="PERPENDICULAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27C2,
+ },
+ [0x27C3]={
+ category="sm",
+ description="OPEN SUBSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x27C4,
+ unicodeslot=0x27C3,
+ },
+ [0x27C4]={
+ category="sm",
+ description="OPEN SUPERSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x27C3,
+ unicodeslot=0x27C4,
+ },
+ [0x27C5]={
+ category="ps",
+ description="LEFT S-SHAPED BAG DELIMITER",
+ direction="on",
+ linebreak="op",
+ mirror=0x27C6,
+ unicodeslot=0x27C5,
+ },
+ [0x27C6]={
+ category="pe",
+ description="RIGHT S-SHAPED BAG DELIMITER",
+ direction="on",
+ linebreak="cl",
+ mirror=0x27C5,
+ unicodeslot=0x27C6,
+ },
+ [0x27C7]={
+ category="sm",
+ description="OR WITH DOT INSIDE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27C7,
+ },
+ [0x27C8]={
+ category="sm",
+ description="REVERSE SOLIDUS PRECEDING SUBSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x27C9,
+ unicodeslot=0x27C8,
+ },
+ [0x27C9]={
+ category="sm",
+ description="SUPERSET PRECEDING SOLIDUS",
+ direction="on",
+ linebreak="al",
+ mirror=0x27C8,
+ unicodeslot=0x27C9,
+ },
+ [0x27CA]={
+ category="sm",
+ description="VERTICAL BAR WITH HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27CA,
+ },
+ [0x27D0]={
+ category="sm",
+ description="WHITE DIAMOND WITH CENTRED DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D0,
+ },
+ [0x27D1]={
+ category="sm",
+ description="AND WITH DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D1,
+ },
+ [0x27D2]={
+ category="sm",
+ description="ELEMENT OF OPENING UPWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D2,
+ },
+ [0x27D3]={
+ category="sm",
+ description="LOWER RIGHT CORNER WITH DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D3,
+ },
+ [0x27D4]={
+ category="sm",
+ description="UPPER LEFT CORNER WITH DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D4,
+ },
+ [0x27D5]={
+ category="sm",
+ description="LEFT OUTER JOIN",
+ direction="on",
+ linebreak="al",
+ mirror=0x27D6,
+ unicodeslot=0x27D5,
+ },
+ [0x27D6]={
+ category="sm",
+ description="RIGHT OUTER JOIN",
+ direction="on",
+ linebreak="al",
+ mirror=0x27D5,
+ unicodeslot=0x27D6,
+ },
+ [0x27D7]={
+ category="sm",
+ description="FULL OUTER JOIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D7,
+ },
+ [0x27D8]={
+ category="sm",
+ description="LARGE UP TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D8,
+ },
+ [0x27D9]={
+ category="sm",
+ description="LARGE DOWN TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27D9,
+ },
+ [0x27DA]={
+ category="sm",
+ description="LEFT AND RIGHT DOUBLE TURNSTILE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27DA,
+ },
+ [0x27DB]={
+ category="sm",
+ description="LEFT AND RIGHT TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27DB,
+ },
+ [0x27DC]={
+ category="sm",
+ description="LEFT MULTIMAP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27DC,
+ },
+ [0x27DD]={
+ category="sm",
+ description="LONG RIGHT TACK",
+ direction="on",
+ linebreak="al",
+ mirror=0x27DE,
+ unicodeslot=0x27DD,
+ },
+ [0x27DE]={
+ category="sm",
+ description="LONG LEFT TACK",
+ direction="on",
+ linebreak="al",
+ mirror=0x27DD,
+ unicodeslot=0x27DE,
+ },
+ [0x27DF]={
+ category="sm",
+ description="UP TACK WITH CIRCLE ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27DF,
+ },
+ [0x27E0]={
+ category="sm",
+ description="LOZENGE DIVIDED BY HORIZONTAL RULE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27E0,
+ },
+ [0x27E1]={
+ category="sm",
+ description="WHITE CONCAVE-SIDED DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27E1,
+ },
+ [0x27E2]={
+ category="sm",
+ description="WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK",
+ direction="on",
+ linebreak="al",
+ mirror=0x27E3,
+ unicodeslot=0x27E2,
+ },
+ [0x27E3]={
+ category="sm",
+ description="WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK",
+ direction="on",
+ linebreak="al",
+ mirror=0x27E2,
+ unicodeslot=0x27E3,
+ },
+ [0x27E4]={
+ category="sm",
+ description="WHITE SQUARE WITH LEFTWARDS TICK",
+ direction="on",
+ linebreak="al",
+ mirror=0x27E5,
+ unicodeslot=0x27E4,
+ },
+ [0x27E5]={
+ category="sm",
+ description="WHITE SQUARE WITH RIGHTWARDS TICK",
+ direction="on",
+ linebreak="al",
+ mirror=0x27E4,
+ unicodeslot=0x27E5,
+ },
+ [0x27E6]={
+ category="ps",
+ cjkwd="na",
+ description="MATHEMATICAL LEFT WHITE SQUARE BRACKET",
+ direction="on",
+ linebreak="op",
+ mathclass="open",
+ mathname="llbracket",
+ mirror=0x27E7,
+ unicodeslot=0x27E6,
+ },
+ [0x27E7]={
+ category="pe",
+ cjkwd="na",
+ description="MATHEMATICAL RIGHT WHITE SQUARE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mathclass="close",
+ mathname="rrbracket",
+ mirror=0x27E6,
+ unicodeslot=0x27E7,
+ },
+ [0x27E8]={
+ category="ps",
+ cjkwd="na",
+ description="MATHEMATICAL LEFT ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ mathclass="open",
+ mathname="langle",
+ mirror=0x27E9,
+ unicodeslot=0x27E8,
+ },
+ [0x27E9]={
+ category="pe",
+ cjkwd="na",
+ description="MATHEMATICAL RIGHT ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mathclass="close",
+ mathname="rangle",
+ mirror=0x27E8,
+ unicodeslot=0x27E9,
+ },
+ [0x27EA]={
+ category="ps",
+ cjkwd="na",
+ description="MATHEMATICAL LEFT DOUBLE ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ mathclass="open",
+ mathname="llangle",
+ mirror=0x27EB,
+ unicodeslot=0x27EA,
+ },
+ [0x27EB]={
+ category="pe",
+ cjkwd="na",
+ description="MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mathclass="close",
+ mathname="rrangle",
+ mirror=0x27EA,
+ unicodeslot=0x27EB,
+ },
+ [0x27F0]={
+ category="sm",
+ description="UPWARDS QUADRUPLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27F0,
+ },
+ [0x27F1]={
+ category="sm",
+ description="DOWNWARDS QUADRUPLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27F1,
+ },
+ [0x27F2]={
+ category="sm",
+ description="ANTICLOCKWISE GAPPED CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27F2,
+ },
+ [0x27F3]={
+ category="sm",
+ description="CLOCKWISE GAPPED CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27F3,
+ },
+ [0x27F4]={
+ category="sm",
+ description="RIGHT ARROW WITH CIRCLED PLUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x27F4,
+ },
+ [0x27F5]={
+ category="sm",
+ description="LONG LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ fallback=[[\leftarrow\joinrel\relbar]],
+ mathclass="relation",
+ mathname="longleftarrow",
+ unicodeslot=0x27F5,
+ },
+ [0x27F6]={
+ category="sm",
+ description="LONG RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ fallback=[[\relbar\joinrel\rightarrow]],
+ mathclass="relation",
+ mathname="longrightarrow",
+ unicodeslot=0x27F6,
+ },
+ [0x27F7]={
+ category="sm",
+ description="LONG LEFT RIGHT ARROW",
+ direction="on",
+ linebreak="al",
+ fallback=[[\leftarrow\joinrel\rightarrow]],
+ mathclass="relation",
+ mathname="longleftrightarrow",
+ unicodeslot=0x27F7,
+ },
+ [0x27F8]={
+ category="sm",
+ description="LONG LEFTWARDS DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ fallback=[[\Leftarrow\joinrel\Relbar]],
+ mathclass="relation",
+ mathname="Longleftarrow",
+ unicodeslot=0x27F8,
+ },
+ [0x27F9]={
+ category="sm",
+ description="LONG RIGHTWARDS DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ fallback=[[\Relbar\joinrel\Rightarrow]],
+ mathclass="relation",
+ mathname="Longrightarrow",
+ unicodeslot=0x27F9,
+ },
+ [0x27FA]={
+ category="sm",
+ description="LONG LEFT RIGHT DOUBLE ARROW",
+ direction="on",
+ linebreak="al",
+ fallback=[[\Leftarrow\joinrel\Rightarrow]],
+ mathclass="relation",
+ mathname="Longleftrightarrow",
+ unicodeslot=0x27FA,
+ },
+ [0x27FB]={
+ category="sm",
+ description="LONG LEFTWARDS ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ fallback=[[\longleftarrow\mapstochar]], -- untested
+ mathclass="relation",
+ mathname="longmapsfrom",
+ unicodeslot=0x27FB,
+ },
+ [0x27FC]={
+ category="sm",
+ description="LONG RIGHTWARDS ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ fallback=[[\mapstochar\longrightarrow]],
+ mathclass="relation",
+ mathname="longmapsto",
+ unicodeslot=0x27FC,
+ },
+ [0x27FD]={
+ category="sm",
+ description="LONG LEFTWARDS DOUBLE ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Longmapsfrom",
+ unicodeslot=0x27FD,
+ },
+ [0x27FE]={
+ category="sm",
+ description="LONG RIGHTWARDS DOUBLE ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Longmapsto",
+ unicodeslot=0x27FE,
+ },
+ [0x27FF]={
+ category="sm",
+ description="LONG RIGHTWARDS SQUIGGLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="longrightsquigarrow",
+ unicodeslot=0x27FF,
+ },
+ [0x2800]={
+ category="so",
+ description="BRAILLE PATTERN BLANK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2800,
+ },
+ [0x2801]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2801,
+ },
+ [0x2802]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2802,
+ },
+ [0x2803]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x000C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2803,
+ },
+ [0x2804]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2804,
+ },
+ [0x2805]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x000D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2805,
+ },
+ [0x2806]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0017",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2806,
+ },
+ [0x2807]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x007B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2807,
+ },
+ [0x2808]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2808,
+ },
+ [0x2809]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x000E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2809,
+ },
+ [0x280A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0018",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x280A,
+ },
+ [0x280B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x007C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x280B,
+ },
+ [0x280C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0022",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x280C,
+ },
+ [0x280D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0086",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x280D,
+ },
+ [0x280E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00EA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x280E,
+ },
+ [0x280F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04D2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x280F,
+ },
+ [0x2810]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2810,
+ },
+ [0x2811]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x000F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2811,
+ },
+ [0x2812]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0019",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2812,
+ },
+ [0x2813]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x007D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2813,
+ },
+ [0x2814]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0023",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2814,
+ },
+ [0x2815]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0087",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2815,
+ },
+ [0x2816]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00EB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2816,
+ },
+ [0x2817]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04D3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2817,
+ },
+ [0x2818]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x002D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2818,
+ },
+ [0x2819]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0091",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2819,
+ },
+ [0x281A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00F5",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x281A,
+ },
+ [0x281B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04DD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x281B,
+ },
+ [0x281C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0159",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x281C,
+ },
+ [0x281D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0541",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x281D,
+ },
+ [0x281E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0929",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x281E,
+ },
+ [0x281F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3039",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x281F,
+ },
+ [0x2820]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0006",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2820,
+ },
+ [0x2821]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0010",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2821,
+ },
+ [0x2822]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x001A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2822,
+ },
+ [0x2823]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x007E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2823,
+ },
+ [0x2824]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0024",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2824,
+ },
+ [0x2825]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0088",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2825,
+ },
+ [0x2826]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00EC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2826,
+ },
+ [0x2827]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04D4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2827,
+ },
+ [0x2828]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x002E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2828,
+ },
+ [0x2829]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0092",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2829,
+ },
+ [0x282A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00F6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x282A,
+ },
+ [0x282B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x282B,
+ },
+ [0x282C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x015A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x282C,
+ },
+ [0x282D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0542",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x282D,
+ },
+ [0x282E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x092A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x282E,
+ },
+ [0x282F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x303A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x282F,
+ },
+ [0x2830]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0038",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2830,
+ },
+ [0x2831]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x009C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2831,
+ },
+ [0x2832]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0100",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2832,
+ },
+ [0x2833]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04E8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2833,
+ },
+ [0x2834]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0164",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2834,
+ },
+ [0x2835]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x054C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2835,
+ },
+ [0x2836]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0934",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2836,
+ },
+ [0x2837]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3044",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2837,
+ },
+ [0x2838]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x01C8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2838,
+ },
+ [0x2839]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x05B0",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2839,
+ },
+ [0x283A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0998",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x283A,
+ },
+ [0x283B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x30A8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x283B,
+ },
+ [0x283C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0D80",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x283C,
+ },
+ [0x283D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3490",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x283D,
+ },
+ [0x283E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5BA0",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x283E,
+ },
+ [0x283F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E240",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x283F,
+ },
+ [0x2840]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0007",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2840,
+ },
+ [0x2841]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0011",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2841,
+ },
+ [0x2842]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x001B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2842,
+ },
+ [0x2843]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x007F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2843,
+ },
+ [0x2844]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0025",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2844,
+ },
+ [0x2845]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0089",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2845,
+ },
+ [0x2846]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00ED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2846,
+ },
+ [0x2847]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04D5",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2847,
+ },
+ [0x2848]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x002F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2848,
+ },
+ [0x2849]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0093",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2849,
+ },
+ [0x284A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00F7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x284A,
+ },
+ [0x284B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04DF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x284B,
+ },
+ [0x284C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x015B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x284C,
+ },
+ [0x284D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0543",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x284D,
+ },
+ [0x284E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x092B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x284E,
+ },
+ [0x284F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x303B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x284F,
+ },
+ [0x2850]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0039",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2850,
+ },
+ [0x2851]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x009D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2851,
+ },
+ [0x2852]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0101",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2852,
+ },
+ [0x2853]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04E9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2853,
+ },
+ [0x2854]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0165",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2854,
+ },
+ [0x2855]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x054D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2855,
+ },
+ [0x2856]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0935",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2856,
+ },
+ [0x2857]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3045",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2857,
+ },
+ [0x2858]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x01C9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2858,
+ },
+ [0x2859]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x05B1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2859,
+ },
+ [0x285A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0999",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x285A,
+ },
+ [0x285B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x30A9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x285B,
+ },
+ [0x285C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0D81",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x285C,
+ },
+ [0x285D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3491",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x285D,
+ },
+ [0x285E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5BA1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x285E,
+ },
+ [0x285F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E241",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x285F,
+ },
+ [0x2860]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0043",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2860,
+ },
+ [0x2861]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00A7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2861,
+ },
+ [0x2862]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x010B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2862,
+ },
+ [0x2863]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04F3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2863,
+ },
+ [0x2864]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x016F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2864,
+ },
+ [0x2865]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0557",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2865,
+ },
+ [0x2866]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x093F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2866,
+ },
+ [0x2867]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x304F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2867,
+ },
+ [0x2868]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x01D3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2868,
+ },
+ [0x2869]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x05BB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2869,
+ },
+ [0x286A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x09A3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x286A,
+ },
+ [0x286B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x30B3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x286B,
+ },
+ [0x286C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0D8B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x286C,
+ },
+ [0x286D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x349B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x286D,
+ },
+ [0x286E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5BAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x286E,
+ },
+ [0x286F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E24B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x286F,
+ },
+ [0x2870]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0237",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2870,
+ },
+ [0x2871]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x061F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2871,
+ },
+ [0x2872]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0A07",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2872,
+ },
+ [0x2873]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3117",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2873,
+ },
+ [0x2874]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0DEF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2874,
+ },
+ [0x2875]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x34FF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2875,
+ },
+ [0x2876]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5C0F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2876,
+ },
+ [0x2877]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E2AF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2877,
+ },
+ [0x2878]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x11D7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2878,
+ },
+ [0x2879]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x38E7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2879,
+ },
+ [0x287A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5FF7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x287A,
+ },
+ [0x287B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E697",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x287B,
+ },
+ [0x287C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x8707",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x287C,
+ },
+ [0x287D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x20DA7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x287D,
+ },
+ [0x287E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x39447",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x287E,
+ },
+ [0x287F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x12D687",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x287F,
+ },
+ [0x2880]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0008",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2880,
+ },
+ [0x2881]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0012",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2881,
+ },
+ [0x2882]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x001C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2882,
+ },
+ [0x2883]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0080",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2883,
+ },
+ [0x2884]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0026",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2884,
+ },
+ [0x2885]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x008A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2885,
+ },
+ [0x2886]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2886,
+ },
+ [0x2887]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04D6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2887,
+ },
+ [0x2888]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0030",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2888,
+ },
+ [0x2889]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0094",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2889,
+ },
+ [0x288A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00F8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x288A,
+ },
+ [0x288B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04E0",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x288B,
+ },
+ [0x288C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x015C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x288C,
+ },
+ [0x288D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0544",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x288D,
+ },
+ [0x288E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x092C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x288E,
+ },
+ [0x288F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x303C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x288F,
+ },
+ [0x2890]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x003A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2890,
+ },
+ [0x2891]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x009E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2891,
+ },
+ [0x2892]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0102",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2892,
+ },
+ [0x2893]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04EA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2893,
+ },
+ [0x2894]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0166",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2894,
+ },
+ [0x2895]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x054E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2895,
+ },
+ [0x2896]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0936",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2896,
+ },
+ [0x2897]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3046",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2897,
+ },
+ [0x2898]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x01CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2898,
+ },
+ [0x2899]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x05B2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2899,
+ },
+ [0x289A]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x099A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x289A,
+ },
+ [0x289B]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x30AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x289B,
+ },
+ [0x289C]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0D82",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x289C,
+ },
+ [0x289D]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3492",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x289D,
+ },
+ [0x289E]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5BA2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x289E,
+ },
+ [0x289F]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E242",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x289F,
+ },
+ [0x28A0]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0044",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A0,
+ },
+ [0x28A1]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00A8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A1,
+ },
+ [0x28A2]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x010C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A2,
+ },
+ [0x28A3]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04F4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A3,
+ },
+ [0x28A4]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0170",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A4,
+ },
+ [0x28A5]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0558",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A5,
+ },
+ [0x28A6]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0940",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A6,
+ },
+ [0x28A7]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3050",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A7,
+ },
+ [0x28A8]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x01D4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A8,
+ },
+ [0x28A9]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x05BC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28A9,
+ },
+ [0x28AA]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x09A4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28AA,
+ },
+ [0x28AB]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x30B4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28AB,
+ },
+ [0x28AC]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0D8C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28AC,
+ },
+ [0x28AD]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x349C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28AD,
+ },
+ [0x28AE]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5BAC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28AE,
+ },
+ [0x28AF]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E24C",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28AF,
+ },
+ [0x28B0]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0238",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B0,
+ },
+ [0x28B1]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0620",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B1,
+ },
+ [0x28B2]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0A08",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B2,
+ },
+ [0x28B3]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3118",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B3,
+ },
+ [0x28B4]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0DF0",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B4,
+ },
+ [0x28B5]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3500",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B5,
+ },
+ [0x28B6]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5C10",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B6,
+ },
+ [0x28B7]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E2B0",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B7,
+ },
+ [0x28B8]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x11D8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B8,
+ },
+ [0x28B9]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x38E8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28B9,
+ },
+ [0x28BA]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5FF8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28BA,
+ },
+ [0x28BB]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E698",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28BB,
+ },
+ [0x28BC]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x8708",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28BC,
+ },
+ [0x28BD]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x20DA8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28BD,
+ },
+ [0x28BE]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x39448",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28BE,
+ },
+ [0x28BF]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x12D688",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28BF,
+ },
+ [0x28C0]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x004E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C0,
+ },
+ [0x28C1]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x00B2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C1,
+ },
+ [0x28C2]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0116",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C2,
+ },
+ [0x28C3]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x04FE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C3,
+ },
+ [0x28C4]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x017A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C4,
+ },
+ [0x28C5]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0562",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C5,
+ },
+ [0x28C6]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x094A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C6,
+ },
+ [0x28C7]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x305A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C7,
+ },
+ [0x28C8]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x01DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C8,
+ },
+ [0x28C9]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x05C6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28C9,
+ },
+ [0x28CA]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x09AE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28CA,
+ },
+ [0x28CB]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x30BE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28CB,
+ },
+ [0x28CC]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0D96",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28CC,
+ },
+ [0x28CD]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x34A6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28CD,
+ },
+ [0x28CE]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5BB6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28CE,
+ },
+ [0x28CF]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E256",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28CF,
+ },
+ [0x28D0]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0242",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D0,
+ },
+ [0x28D1]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x062A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D1,
+ },
+ [0x28D2]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0A12",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D2,
+ },
+ [0x28D3]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3122",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D3,
+ },
+ [0x28D4]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0DFA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D4,
+ },
+ [0x28D5]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x350A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D5,
+ },
+ [0x28D6]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5C1A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D6,
+ },
+ [0x28D7]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E2BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D7,
+ },
+ [0x28D8]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x11E2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D8,
+ },
+ [0x28D9]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x38F2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28D9,
+ },
+ [0x28DA]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x6002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28DA,
+ },
+ [0x28DB]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E6A2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28DB,
+ },
+ [0x28DC]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x8712",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28DC,
+ },
+ [0x28DD]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x20DB2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28DD,
+ },
+ [0x28DE]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x39452",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28DE,
+ },
+ [0x28DF]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x12D692",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28DF,
+ },
+ [0x28E0]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x02A6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E0,
+ },
+ [0x28E1]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x068E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E1,
+ },
+ [0x28E2]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0A76",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E2,
+ },
+ [0x28E3]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3186",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E3,
+ },
+ [0x28E4]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x0E5E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E4,
+ },
+ [0x28E5]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x356E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E5,
+ },
+ [0x28E6]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5C7E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E6,
+ },
+ [0x28E7]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E31E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E7,
+ },
+ [0x28E8]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1246",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E8,
+ },
+ [0x28E9]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3956",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28E9,
+ },
+ [0x28EA]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x6066",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28EA,
+ },
+ [0x28EB]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1E706",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28EB,
+ },
+ [0x28EC]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x8776",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28EC,
+ },
+ [0x28ED]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x20E16",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28ED,
+ },
+ [0x28EE]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x394B6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28EE,
+ },
+ [0x28EF]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x12D6F6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28EF,
+ },
+ [0x28F0]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x162E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F0,
+ },
+ [0x28F1]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3D3E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F1,
+ },
+ [0x28F2]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x644E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F2,
+ },
+ [0x28F3]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1EAEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F3,
+ },
+ [0x28F4]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x8B5E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F4,
+ },
+ [0x28F5]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x211FE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F5,
+ },
+ [0x28F6]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3989E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F6,
+ },
+ [0x28F7]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x12DADE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F7,
+ },
+ [0x28F8]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0xB26E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F8,
+ },
+ [0x28F9]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x2390E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28F9,
+ },
+ [0x28FA]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x3BFAE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28FA,
+ },
+ [0x28FB]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x1301EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28FB,
+ },
+ [0x28FC]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x5464E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28FC,
+ },
+ [0x28FD]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x14888E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28FD,
+ },
+ [0x28FE]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0x23CACE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28FE,
+ },
+ [0x28FF]={
+ category="so",
+ description="BRAILLE PATTERN DOTS-0xBC614E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x28FF,
+ },
+ [0x2900]={
+ category="sm",
+ description="RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2900,
+ },
+ [0x2901]={
+ category="sm",
+ description="RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2901,
+ },
+ [0x2902]={
+ category="sm",
+ description="LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2902,
+ },
+ [0x2903]={
+ category="sm",
+ description="RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2903,
+ },
+ [0x2904]={
+ category="sm",
+ description="LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2904,
+ },
+ [0x2905]={
+ category="sm",
+ description="RIGHTWARDS TWO-HEADED ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2905,
+ },
+ [0x2906]={
+ category="sm",
+ description="LEFTWARDS DOUBLE ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Mapsfrom",
+ unicodeslot=0x2906,
+ },
+ [0x2907]={
+ category="sm",
+ description="RIGHTWARDS DOUBLE ARROW FROM BAR",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Mapsto",
+ unicodeslot=0x2907,
+ },
+ [0x2908]={
+ category="sm",
+ description="DOWNWARDS ARROW WITH HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2908,
+ },
+ [0x2909]={
+ category="sm",
+ description="UPWARDS ARROW WITH HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2909,
+ },
+ [0x290A]={
+ category="sm",
+ description="UPWARDS TRIPLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Uuparrow",
+ unicodeslot=0x290A,
+ },
+ [0x290B]={
+ category="sm",
+ description="DOWNWARDS TRIPLE ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="Ddownarrow",
+ unicodeslot=0x290B,
+ },
+ [0x290C]={
+ category="sm",
+ description="LEFTWARDS DOUBLE DASH ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dashedleftarrow",
+ unicodeslot=0x290C,
+ },
+ [0x290D]={
+ category="sm",
+ description="RIGHTWARDS DOUBLE DASH ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dashedrightarrow",
+ unicodeslot=0x290D,
+ },
+ [0x290E]={
+ category="sm",
+ description="LEFTWARDS TRIPLE DASH ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x290E,
+ },
+ [0x290F]={
+ category="sm",
+ description="RIGHTWARDS TRIPLE DASH ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x290F,
+ },
+ [0x2910]={
+ category="sm",
+ description="RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2910,
+ },
+ [0x2911]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH DOTTED STEM",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="dottedrightarrow",
+ unicodeslot=0x2911,
+ },
+ [0x2912]={
+ category="sm",
+ description="UPWARDS ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2912,
+ },
+ [0x2913]={
+ category="sm",
+ description="DOWNWARDS ARROW TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2913,
+ },
+ [0x2914]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2914,
+ },
+ [0x2915]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2915,
+ },
+ [0x2916]={
+ category="sm",
+ description="RIGHTWARDS TWO-HEADED ARROW WITH TAIL",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="twoheadrightarrowtail",
+ unicodeslot=0x2916,
+ },
+ [0x2917]={
+ category="sm",
+ description="RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ unicodeslot=0x2917,
+ },
+ [0x2918]={
+ category="sm",
+ description="RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2918,
+ },
+ [0x2919]={
+ category="sm",
+ description="LEFTWARDS ARROW-TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2919,
+ },
+ [0x291A]={
+ category="sm",
+ description="RIGHTWARDS ARROW-TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x291A,
+ },
+ [0x291B]={
+ category="sm",
+ description="LEFTWARDS DOUBLE ARROW-TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x291B,
+ },
+ [0x291C]={
+ category="sm",
+ description="RIGHTWARDS DOUBLE ARROW-TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x291C,
+ },
+ [0x291D]={
+ category="sm",
+ description="LEFTWARDS ARROW TO BLACK DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x291D,
+ },
+ [0x291E]={
+ category="sm",
+ description="RIGHTWARDS ARROW TO BLACK DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x291E,
+ },
+ [0x291F]={
+ category="sm",
+ description="LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x291F,
+ },
+ [0x2920]={
+ category="sm",
+ description="RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2920,
+ },
+ [0x2921]={
+ category="sm",
+ description="NORTH WEST AND SOUTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="nwsearrow",
+ unicodeslot=0x2921,
+ },
+ [0x2922]={
+ category="sm",
+ description="NORTH EAST AND SOUTH WEST ARROW",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="neswarrow",
+ unicodeslot=0x2922,
+ },
+ [0x2923]={
+ category="sm",
+ description="NORTH WEST ARROW WITH HOOK",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lhooknwarrow",
+ unicodeslot=0x2923,
+ },
+ [0x2924]={
+ category="sm",
+ description="NORTH EAST ARROW WITH HOOK",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rhooknearrow",
+ unicodeslot=0x2924,
+ },
+ [0x2925]={
+ category="sm",
+ description="SOUTH EAST ARROW WITH HOOK",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lhooksearrow",
+ unicodeslot=0x2925,
+ },
+ [0x2926]={
+ category="sm",
+ description="SOUTH WEST ARROW WITH HOOK",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rhookswarrow",
+ unicodeslot=0x2926,
+ },
+ [0x2927]={
+ category="sm",
+ description="NORTH WEST ARROW AND NORTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2927,
+ },
+ [0x2928]={
+ category="sm",
+ description="NORTH EAST ARROW AND SOUTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2928,
+ },
+ [0x2929]={
+ category="sm",
+ description="SOUTH EAST ARROW AND SOUTH WEST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2929,
+ },
+ [0x292A]={
+ category="sm",
+ description="SOUTH WEST ARROW AND NORTH WEST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x292A,
+ },
+ [0x292B]={
+ category="sm",
+ description="RISING DIAGONAL CROSSING FALLING DIAGONAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x292B,
+ },
+ [0x292C]={
+ category="sm",
+ description="FALLING DIAGONAL CROSSING RISING DIAGONAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x292C,
+ },
+ [0x292D]={
+ category="sm",
+ description="SOUTH EAST ARROW CROSSING NORTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x292D,
+ },
+ [0x292E]={
+ category="sm",
+ description="NORTH EAST ARROW CROSSING SOUTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x292E,
+ },
+ [0x292F]={
+ category="sm",
+ description="FALLING DIAGONAL CROSSING NORTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x292F,
+ },
+ [0x2930]={
+ category="sm",
+ description="RISING DIAGONAL CROSSING SOUTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2930,
+ },
+ [0x2931]={
+ category="sm",
+ description="NORTH EAST ARROW CROSSING NORTH WEST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2931,
+ },
+ [0x2932]={
+ category="sm",
+ description="NORTH WEST ARROW CROSSING NORTH EAST ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2932,
+ },
+ [0x2933]={
+ category="sm",
+ description="WAVE ARROW POINTING DIRECTLY RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2933,
+ },
+ [0x2934]={
+ category="sm",
+ description="ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2934,
+ },
+ [0x2935]={
+ category="sm",
+ description="ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2935,
+ },
+ [0x2936]={
+ category="sm",
+ description="ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2936,
+ },
+ [0x2937]={
+ category="sm",
+ description="ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2937,
+ },
+ [0x2938]={
+ category="sm",
+ description="RIGHT-SIDE ARC CLOCKWISE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2938,
+ },
+ [0x2939]={
+ category="sm",
+ description="LEFT-SIDE ARC ANTICLOCKWISE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2939,
+ },
+ [0x293A]={
+ category="sm",
+ description="TOP ARC ANTICLOCKWISE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x293A,
+ },
+ [0x293B]={
+ category="sm",
+ description="BOTTOM ARC ANTICLOCKWISE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x293B,
+ },
+ [0x293C]={
+ category="sm",
+ description="TOP ARC CLOCKWISE ARROW WITH MINUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x293C,
+ },
+ [0x293D]={
+ category="sm",
+ description="TOP ARC ANTICLOCKWISE ARROW WITH PLUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x293D,
+ },
+ [0x293E]={
+ category="sm",
+ description="LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x293E,
+ },
+ [0x293F]={
+ category="sm",
+ description="LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x293F,
+ },
+ [0x2940]={
+ category="sm",
+ description="ANTICLOCKWISE CLOSED CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2940,
+ },
+ [0x2941]={
+ category="sm",
+ description="CLOCKWISE CLOSED CIRCLE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2941,
+ },
+ [0x2942]={
+ category="sm",
+ description="RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2942,
+ },
+ [0x2943]={
+ category="sm",
+ description="LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2943,
+ },
+ [0x2944]={
+ category="sm",
+ description="SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2944,
+ },
+ [0x2945]={
+ category="sm",
+ description="RIGHTWARDS ARROW WITH PLUS BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2945,
+ },
+ [0x2946]={
+ category="sm",
+ description="LEFTWARDS ARROW WITH PLUS BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2946,
+ },
+ [0x2947]={
+ category="sm",
+ description="RIGHTWARDS ARROW THROUGH X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2947,
+ },
+ [0x2948]={
+ category="sm",
+ description="LEFT RIGHT ARROW THROUGH SMALL CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2948,
+ },
+ [0x2949]={
+ category="sm",
+ description="UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2949,
+ },
+ [0x294A]={
+ category="sm",
+ description="LEFT BARB UP RIGHT BARB DOWN HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x294A,
+ },
+ [0x294B]={
+ category="sm",
+ description="LEFT BARB DOWN RIGHT BARB UP HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x294B,
+ },
+ [0x294C]={
+ category="sm",
+ description="UP BARB RIGHT DOWN BARB LEFT HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x294C,
+ },
+ [0x294D]={
+ category="sm",
+ description="UP BARB LEFT DOWN BARB RIGHT HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x294D,
+ },
+ [0x294E]={
+ category="sm",
+ description="LEFT BARB UP RIGHT BARB UP HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x294E,
+ },
+ [0x294F]={
+ category="sm",
+ description="UP BARB RIGHT DOWN BARB RIGHT HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x294F,
+ },
+ [0x2950]={
+ category="sm",
+ description="LEFT BARB DOWN RIGHT BARB DOWN HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2950,
+ },
+ [0x2951]={
+ category="sm",
+ description="UP BARB LEFT DOWN BARB LEFT HARPOON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2951,
+ },
+ [0x2952]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB UP TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2952,
+ },
+ [0x2953]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB UP TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2953,
+ },
+ [0x2954]={
+ category="sm",
+ description="UPWARDS HARPOON WITH BARB RIGHT TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2954,
+ },
+ [0x2955]={
+ category="sm",
+ description="DOWNWARDS HARPOON WITH BARB RIGHT TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2955,
+ },
+ [0x2956]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB DOWN TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2956,
+ },
+ [0x2957]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB DOWN TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2957,
+ },
+ [0x2958]={
+ category="sm",
+ description="UPWARDS HARPOON WITH BARB LEFT TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2958,
+ },
+ [0x2959]={
+ category="sm",
+ description="DOWNWARDS HARPOON WITH BARB LEFT TO BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2959,
+ },
+ [0x295A]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB UP FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x295A,
+ },
+ [0x295B]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB UP FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x295B,
+ },
+ [0x295C]={
+ category="sm",
+ description="UPWARDS HARPOON WITH BARB RIGHT FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x295C,
+ },
+ [0x295D]={
+ category="sm",
+ description="DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x295D,
+ },
+ [0x295E]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB DOWN FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x295E,
+ },
+ [0x295F]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x295F,
+ },
+ [0x2960]={
+ category="sm",
+ description="UPWARDS HARPOON WITH BARB LEFT FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2960,
+ },
+ [0x2961]={
+ category="sm",
+ description="DOWNWARDS HARPOON WITH BARB LEFT FROM BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2961,
+ },
+ [0x2962]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2962,
+ },
+ [0x2963]={
+ category="sm",
+ description="UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2963,
+ },
+ [0x2964]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2964,
+ },
+ [0x2965]={
+ category="sm",
+ description="DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2965,
+ },
+ [0x2966]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2966,
+ },
+ [0x2967]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2967,
+ },
+ [0x2968]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2968,
+ },
+ [0x2969]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2969,
+ },
+ [0x296A]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x296A,
+ },
+ [0x296B]={
+ category="sm",
+ description="LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x296B,
+ },
+ [0x296C]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x296C,
+ },
+ [0x296D]={
+ category="sm",
+ description="RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x296D,
+ },
+ [0x296E]={
+ category="sm",
+ description="UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x296E,
+ },
+ [0x296F]={
+ category="sm",
+ description="DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x296F,
+ },
+ [0x2970]={
+ category="sm",
+ description="RIGHT DOUBLE ARROW WITH ROUNDED HEAD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2970,
+ },
+ [0x2971]={
+ category="sm",
+ description="EQUALS SIGN ABOVE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2971,
+ },
+ [0x2972]={
+ category="sm",
+ description="TILDE OPERATOR ABOVE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2972,
+ },
+ [0x2973]={
+ category="sm",
+ description="LEFTWARDS ARROW ABOVE TILDE OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2973,
+ },
+ [0x2974]={
+ category="sm",
+ description="RIGHTWARDS ARROW ABOVE TILDE OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2974,
+ },
+ [0x2975]={
+ category="sm",
+ description="RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2975,
+ },
+ [0x2976]={
+ category="sm",
+ description="LESS-THAN ABOVE LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2976,
+ },
+ [0x2977]={
+ category="sm",
+ description="LEFTWARDS ARROW THROUGH LESS-THAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2977,
+ },
+ [0x2978]={
+ category="sm",
+ description="GREATER-THAN ABOVE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2978,
+ },
+ [0x2979]={
+ category="sm",
+ description="SUBSET ABOVE RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2979,
+ },
+ [0x297A]={
+ category="sm",
+ description="LEFTWARDS ARROW THROUGH SUBSET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x297A,
+ },
+ [0x297B]={
+ category="sm",
+ description="SUPERSET ABOVE LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x297B,
+ },
+ [0x297C]={
+ category="sm",
+ description="LEFT FISH TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x297C,
+ },
+ [0x297D]={
+ category="sm",
+ description="RIGHT FISH TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x297D,
+ },
+ [0x297E]={
+ category="sm",
+ description="UP FISH TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x297E,
+ },
+ [0x297F]={
+ category="sm",
+ description="DOWN FISH TAIL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x297F,
+ },
+ [0x2980]={
+ category="sm",
+ description="TRIPLE VERTICAL BAR DELIMITER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2980,
+ },
+ [0x2981]={
+ category="sm",
+ description="Z NOTATION SPOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2981,
+ },
+ [0x2982]={
+ category="sm",
+ description="Z NOTATION TYPE COLON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2982,
+ },
+ [0x2983]={
+ category="ps",
+ description="LEFT WHITE CURLY BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x2984,
+ unicodeslot=0x2983,
+ },
+ [0x2984]={
+ category="pe",
+ description="RIGHT WHITE CURLY BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2983,
+ unicodeslot=0x2984,
+ },
+ [0x2985]={
+ category="ps",
+ cjkwd="na",
+ description="LEFT WHITE PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mirror=0x2986,
+ unicodeslot=0x2985,
+ },
+ [0x2986]={
+ category="pe",
+ cjkwd="na",
+ description="RIGHT WHITE PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2985,
+ unicodeslot=0x2986,
+ },
+ [0x2987]={
+ category="ps",
+ description="Z NOTATION LEFT IMAGE BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x2988,
+ unicodeslot=0x2987,
+ },
+ [0x2988]={
+ category="pe",
+ description="Z NOTATION RIGHT IMAGE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2987,
+ unicodeslot=0x2988,
+ },
+ [0x2989]={
+ category="ps",
+ description="Z NOTATION LEFT BINDING BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x298A,
+ unicodeslot=0x2989,
+ },
+ [0x298A]={
+ category="pe",
+ description="Z NOTATION RIGHT BINDING BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2989,
+ unicodeslot=0x298A,
+ },
+ [0x298B]={
+ category="ps",
+ description="LEFT SQUARE BRACKET WITH UNDERBAR",
+ direction="on",
+ linebreak="op",
+ mirror=0x298C,
+ unicodeslot=0x298B,
+ },
+ [0x298C]={
+ category="pe",
+ description="RIGHT SQUARE BRACKET WITH UNDERBAR",
+ direction="on",
+ linebreak="cl",
+ mirror=0x298B,
+ unicodeslot=0x298C,
+ },
+ [0x298D]={
+ category="ps",
+ description="LEFT SQUARE BRACKET WITH TICK IN TOP CORNER",
+ direction="on",
+ linebreak="op",
+ mirror=0x2990,
+ unicodeslot=0x298D,
+ },
+ [0x298E]={
+ category="pe",
+ description="RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER",
+ direction="on",
+ linebreak="cl",
+ mirror=0x298F,
+ unicodeslot=0x298E,
+ },
+ [0x298F]={
+ category="ps",
+ description="LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER",
+ direction="on",
+ linebreak="op",
+ mirror=0x298E,
+ unicodeslot=0x298F,
+ },
+ [0x2990]={
+ category="pe",
+ description="RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER",
+ direction="on",
+ linebreak="cl",
+ mirror=0x298D,
+ unicodeslot=0x2990,
+ },
+ [0x2991]={
+ category="ps",
+ description="LEFT ANGLE BRACKET WITH DOT",
+ direction="on",
+ linebreak="op",
+ mirror=0x2992,
+ unicodeslot=0x2991,
+ },
+ [0x2992]={
+ category="pe",
+ description="RIGHT ANGLE BRACKET WITH DOT",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2991,
+ unicodeslot=0x2992,
+ },
+ [0x2993]={
+ category="ps",
+ description="LEFT ARC LESS-THAN BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x2994,
+ unicodeslot=0x2993,
+ },
+ [0x2994]={
+ category="pe",
+ description="RIGHT ARC GREATER-THAN BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2993,
+ unicodeslot=0x2994,
+ },
+ [0x2995]={
+ category="ps",
+ description="DOUBLE LEFT ARC GREATER-THAN BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x2996,
+ unicodeslot=0x2995,
+ },
+ [0x2996]={
+ category="pe",
+ description="DOUBLE RIGHT ARC LESS-THAN BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2995,
+ unicodeslot=0x2996,
+ },
+ [0x2997]={
+ category="ps",
+ description="LEFT BLACK TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x2998,
+ unicodeslot=0x2997,
+ },
+ [0x2998]={
+ category="pe",
+ description="RIGHT BLACK TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x2997,
+ unicodeslot=0x2998,
+ },
+ [0x2999]={
+ category="sm",
+ description="DOTTED FENCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2999,
+ },
+ [0x299A]={
+ category="sm",
+ description="VERTICAL ZIGZAG LINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x299A,
+ },
+ [0x299B]={
+ category="sm",
+ description="MEASURED ANGLE OPENING LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x299B,
+ },
+ [0x299C]={
+ category="sm",
+ description="RIGHT ANGLE VARIANT WITH SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x299C,
+ },
+ [0x299D]={
+ category="sm",
+ description="MEASURED RIGHT ANGLE WITH DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x299D,
+ },
+ [0x299E]={
+ category="sm",
+ description="ANGLE WITH S INSIDE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x299E,
+ },
+ [0x299F]={
+ category="sm",
+ description="ACUTE ANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x299F,
+ },
+ [0x29A0]={
+ category="sm",
+ description="SPHERICAL ANGLE OPENING LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A0,
+ },
+ [0x29A1]={
+ category="sm",
+ description="SPHERICAL ANGLE OPENING UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A1,
+ },
+ [0x29A2]={
+ category="sm",
+ description="TURNED ANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A2,
+ },
+ [0x29A3]={
+ category="sm",
+ description="REVERSED ANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A3,
+ },
+ [0x29A4]={
+ category="sm",
+ description="ANGLE WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A4,
+ },
+ [0x29A5]={
+ category="sm",
+ description="REVERSED ANGLE WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A5,
+ },
+ [0x29A6]={
+ category="sm",
+ description="OBLIQUE ANGLE OPENING UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A6,
+ },
+ [0x29A7]={
+ category="sm",
+ description="OBLIQUE ANGLE OPENING DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A7,
+ },
+ [0x29A8]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A8,
+ },
+ [0x29A9]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29A9,
+ },
+ [0x29AA]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29AA,
+ },
+ [0x29AB]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29AB,
+ },
+ [0x29AC]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29AC,
+ },
+ [0x29AD]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29AD,
+ },
+ [0x29AE]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29AE,
+ },
+ [0x29AF]={
+ category="sm",
+ description="MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29AF,
+ },
+ [0x29B0]={
+ category="sm",
+ description="REVERSED EMPTY SET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B0,
+ },
+ [0x29B1]={
+ category="sm",
+ description="EMPTY SET WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B1,
+ },
+ [0x29B2]={
+ category="sm",
+ description="EMPTY SET WITH SMALL CIRCLE ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B2,
+ },
+ [0x29B3]={
+ category="sm",
+ description="EMPTY SET WITH RIGHT ARROW ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B3,
+ },
+ [0x29B4]={
+ category="sm",
+ description="EMPTY SET WITH LEFT ARROW ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B4,
+ },
+ [0x29B5]={
+ category="sm",
+ description="CIRCLE WITH HORIZONTAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B5,
+ },
+ [0x29B6]={
+ category="sm",
+ description="CIRCLED VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B6,
+ },
+ [0x29B7]={
+ category="sm",
+ description="CIRCLED PARALLEL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B7,
+ },
+ [0x29B8]={
+ category="sm",
+ description="CIRCLED REVERSE SOLIDUS",
+ direction="on",
+ linebreak="al",
+ mirror=0x2298,
+ unicodeslot=0x29B8,
+ },
+ [0x29B9]={
+ category="sm",
+ description="CIRCLED PERPENDICULAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29B9,
+ },
+ [0x29BA]={
+ category="sm",
+ description="CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29BA,
+ },
+ [0x29BB]={
+ category="sm",
+ description="CIRCLE WITH SUPERIMPOSED X",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29BB,
+ },
+ [0x29BC]={
+ category="sm",
+ description="CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29BC,
+ },
+ [0x29BD]={
+ category="sm",
+ description="UP ARROW THROUGH CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29BD,
+ },
+ [0x29BE]={
+ category="sm",
+ description="CIRCLED WHITE BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29BE,
+ },
+ [0x29BF]={
+ category="sm",
+ description="CIRCLED BULLET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29BF,
+ },
+ [0x29C0]={
+ category="sm",
+ description="CIRCLED LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x29C1,
+ unicodeslot=0x29C0,
+ },
+ [0x29C1]={
+ category="sm",
+ description="CIRCLED GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x29C0,
+ unicodeslot=0x29C1,
+ },
+ [0x29C2]={
+ category="sm",
+ description="CIRCLE WITH SMALL CIRCLE TO THE RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29C2,
+ },
+ [0x29C3]={
+ category="sm",
+ description="CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29C3,
+ },
+ [0x29C4]={
+ category="sm",
+ description="SQUARED RISING DIAGONAL SLASH",
+ direction="on",
+ linebreak="al",
+ mirror=0x29C5,
+ unicodeslot=0x29C4,
+ },
+ [0x29C5]={
+ category="sm",
+ description="SQUARED FALLING DIAGONAL SLASH",
+ direction="on",
+ linebreak="al",
+ mirror=0x29C4,
+ unicodeslot=0x29C5,
+ },
+ [0x29C6]={
+ category="sm",
+ description="SQUARED ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29C6,
+ },
+ [0x29C7]={
+ category="sm",
+ description="SQUARED SMALL CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29C7,
+ },
+ [0x29C8]={
+ category="sm",
+ description="SQUARED SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29C8,
+ },
+ [0x29C9]={
+ category="sm",
+ description="TWO JOINED SQUARES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29C9,
+ },
+ [0x29CA]={
+ category="sm",
+ description="TRIANGLE WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29CA,
+ },
+ [0x29CB]={
+ category="sm",
+ description="TRIANGLE WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29CB,
+ },
+ [0x29CC]={
+ category="sm",
+ description="S IN TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29CC,
+ },
+ [0x29CD]={
+ category="sm",
+ description="TRIANGLE WITH SERIFS AT BOTTOM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29CD,
+ },
+ [0x29CE]={
+ category="sm",
+ description="RIGHT TRIANGLE ABOVE LEFT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29CE,
+ },
+ [0x29CF]={
+ category="sm",
+ description="LEFT TRIANGLE BESIDE VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ mirror=0x29D0,
+ unicodeslot=0x29CF,
+ },
+ [0x29D0]={
+ category="sm",
+ description="VERTICAL BAR BESIDE RIGHT TRIANGLE",
+ direction="on",
+ linebreak="al",
+ mirror=0x29CF,
+ unicodeslot=0x29D0,
+ },
+ [0x29D1]={
+ category="sm",
+ description="BOWTIE WITH LEFT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ mirror=0x29D2,
+ unicodeslot=0x29D1,
+ },
+ [0x29D2]={
+ category="sm",
+ description="BOWTIE WITH RIGHT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ mirror=0x29D1,
+ unicodeslot=0x29D2,
+ },
+ [0x29D3]={
+ category="sm",
+ description="BLACK BOWTIE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29D3,
+ },
+ [0x29D4]={
+ category="sm",
+ description="TIMES WITH LEFT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ mirror=0x29D5,
+ unicodeslot=0x29D4,
+ },
+ [0x29D5]={
+ category="sm",
+ description="TIMES WITH RIGHT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ mirror=0x29D4,
+ unicodeslot=0x29D5,
+ },
+ [0x29D6]={
+ category="sm",
+ description="WHITE HOURGLASS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29D6,
+ },
+ [0x29D7]={
+ category="sm",
+ description="BLACK HOURGLASS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29D7,
+ },
+ [0x29D8]={
+ category="ps",
+ description="LEFT WIGGLY FENCE",
+ direction="on",
+ linebreak="op",
+ mirror=0x29D9,
+ unicodeslot=0x29D8,
+ },
+ [0x29D9]={
+ category="pe",
+ description="RIGHT WIGGLY FENCE",
+ direction="on",
+ linebreak="cl",
+ mirror=0x29D8,
+ unicodeslot=0x29D9,
+ },
+ [0x29DA]={
+ category="ps",
+ description="LEFT DOUBLE WIGGLY FENCE",
+ direction="on",
+ linebreak="op",
+ mirror=0x29DB,
+ unicodeslot=0x29DA,
+ },
+ [0x29DB]={
+ category="pe",
+ description="RIGHT DOUBLE WIGGLY FENCE",
+ direction="on",
+ linebreak="cl",
+ mirror=0x29DA,
+ unicodeslot=0x29DB,
+ },
+ [0x29DC]={
+ category="sm",
+ description="INCOMPLETE INFINITY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29DC,
+ },
+ [0x29DD]={
+ category="sm",
+ description="TIE OVER INFINITY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29DD,
+ },
+ [0x29DE]={
+ category="sm",
+ description="INFINITY NEGATED WITH VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29DE,
+ },
+ [0x29DF]={
+ category="sm",
+ description="DOUBLE-ENDED MULTIMAP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29DF,
+ },
+ [0x29E0]={
+ category="sm",
+ description="SQUARE WITH CONTOURED OUTLINE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E0,
+ },
+ [0x29E1]={
+ category="sm",
+ description="INCREASES AS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E1,
+ },
+ [0x29E2]={
+ category="sm",
+ description="SHUFFLE PRODUCT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E2,
+ },
+ [0x29E3]={
+ category="sm",
+ description="EQUALS SIGN AND SLANTED PARALLEL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E3,
+ },
+ [0x29E4]={
+ category="sm",
+ description="EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E4,
+ },
+ [0x29E5]={
+ category="sm",
+ description="IDENTICAL TO AND SLANTED PARALLEL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E5,
+ },
+ [0x29E6]={
+ category="sm",
+ description="GLEICH STARK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E6,
+ },
+ [0x29E7]={
+ category="sm",
+ description="THERMODYNAMIC",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E7,
+ },
+ [0x29E8]={
+ category="sm",
+ description="DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E8,
+ },
+ [0x29E9]={
+ category="sm",
+ description="DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29E9,
+ },
+ [0x29EA]={
+ category="sm",
+ description="BLACK DIAMOND WITH DOWN ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29EA,
+ },
+ [0x29EB]={
+ category="sm",
+ description="BLACK LOZENGE",
+ direction="on",
+ linebreak="al",
+ mathclass="ord",
+ mathname="blacklozenge",
+ unicodeslot=0x29EB,
+ },
+ [0x29EC]={
+ category="sm",
+ description="WHITE CIRCLE WITH DOWN ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29EC,
+ },
+ [0x29ED]={
+ category="sm",
+ description="BLACK CIRCLE WITH DOWN ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29ED,
+ },
+ [0x29EE]={
+ category="sm",
+ description="ERROR-BARRED WHITE SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29EE,
+ },
+ [0x29EF]={
+ category="sm",
+ description="ERROR-BARRED BLACK SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29EF,
+ },
+ [0x29F0]={
+ category="sm",
+ description="ERROR-BARRED WHITE DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29F0,
+ },
+ [0x29F1]={
+ category="sm",
+ description="ERROR-BARRED BLACK DIAMOND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29F1,
+ },
+ [0x29F2]={
+ category="sm",
+ description="ERROR-BARRED WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29F2,
+ },
+ [0x29F3]={
+ category="sm",
+ description="ERROR-BARRED BLACK CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29F3,
+ },
+ [0x29F4]={
+ category="sm",
+ description="RULE-DELAYED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29F4,
+ },
+ [0x29F5]={
+ category="sm",
+ description="REVERSE SOLIDUS OPERATOR",
+ direction="on",
+ linebreak="al",
+ mirror=0x2215,
+ unicodeslot=0x29F5,
+ },
+ [0x29F6]={
+ category="sm",
+ description="SOLIDUS WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29F6,
+ },
+ [0x29F7]={
+ category="sm",
+ description="REVERSE SOLIDUS WITH HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29F7,
+ },
+ [0x29F8]={
+ category="sm",
+ description="BIG SOLIDUS",
+ direction="on",
+ linebreak="al",
+ mirror=0x29F9,
+ unicodeslot=0x29F8,
+ },
+ [0x29F9]={
+ category="sm",
+ description="BIG REVERSE SOLIDUS",
+ direction="on",
+ linebreak="al",
+ mirror=0x29F8,
+ unicodeslot=0x29F9,
+ },
+ [0x29FA]={
+ category="sm",
+ description="DOUBLE PLUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29FA,
+ },
+ [0x29FB]={
+ category="sm",
+ description="TRIPLE PLUS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29FB,
+ },
+ [0x29FC]={
+ category="ps",
+ description="LEFT-POINTING CURVED ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x29FD,
+ unicodeslot=0x29FC,
+ },
+ [0x29FD]={
+ category="pe",
+ description="RIGHT-POINTING CURVED ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x29FC,
+ unicodeslot=0x29FD,
+ },
+ [0x29FE]={
+ category="sm",
+ description="TINY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29FE,
+ },
+ [0x29FF]={
+ category="sm",
+ description="MINY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x29FF,
+ },
+ [0x2A00]={
+ category="sm",
+ description="N-ARY CIRCLED DOT OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A00,
+ },
+ [0x2A01]={
+ category="sm",
+ description="N-ARY CIRCLED PLUS OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigoplus",
+ unicodeslot=0x2A01,
+ },
+ [0x2A02]={
+ category="sm",
+ description="N-ARY CIRCLED TIMES OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigotimes",
+ unicodeslot=0x2A02,
+ },
+ [0x2A03]={
+ category="sm",
+ description="N-ARY UNION OPERATOR WITH DOT",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigodot",
+ unicodeslot=0x2A03,
+ },
+ [0x2A04]={
+ category="sm",
+ description="N-ARY UNION OPERATOR WITH PLUS",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="biguplus",
+ unicodeslot=0x2A04,
+ },
+ [0x2A05]={
+ category="sm",
+ description="N-ARY SQUARE INTERSECTION OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigsqcap",
+ unicodeslot=0x2A05,
+ },
+ [0x2A06]={
+ category="sm",
+ description="N-ARY SQUARE UNION OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigsqcup",
+ unicodeslot=0x2A06,
+ },
+ [0x2A07]={
+ category="sm",
+ description="TWO LOGICAL AND OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A07,
+ },
+ [0x2A08]={
+ category="sm",
+ description="TWO LOGICAL OR OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A08,
+ },
+ [0x2A09]={
+ category="sm",
+ description="N-ARY TIMES OPERATOR",
+ direction="on",
+ linebreak="al",
+ mathclass="limop",
+ mathname="bigtimes",
+ unicodeslot=0x2A09,
+ },
+ [0x2A0A]={
+ category="sm",
+ description="MODULO TWO SUM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A0A,
+ },
+ [0x2A0B]={
+ category="sm",
+ description="SUMMATION WITH INTEGRAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A0B,
+ },
+ [0x2A0C]={
+ category="sm",
+ description="QUADRUPLE INTEGRAL OPERATOR",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x222B, 0x222B, 0x222B, 0x222B },
+ unicodeslot=0x2A0C,
+ },
+ [0x2A0D]={
+ category="sm",
+ description="FINITE PART INTEGRAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A0D,
+ },
+ [0x2A0E]={
+ category="sm",
+ description="INTEGRAL WITH DOUBLE STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A0E,
+ },
+ [0x2A0F]={
+ category="sm",
+ description="INTEGRAL AVERAGE WITH SLASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A0F,
+ },
+ [0x2A10]={
+ category="sm",
+ description="CIRCULATION FUNCTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A10,
+ },
+ [0x2A11]={
+ category="sm",
+ description="ANTICLOCKWISE INTEGRATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A11,
+ },
+ [0x2A12]={
+ category="sm",
+ description="LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A12,
+ },
+ [0x2A13]={
+ category="sm",
+ description="LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A13,
+ },
+ [0x2A14]={
+ category="sm",
+ description="LINE INTEGRATION NOT INCLUDING THE POLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A14,
+ },
+ [0x2A15]={
+ category="sm",
+ description="INTEGRAL AROUND A POINT OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A15,
+ },
+ [0x2A16]={
+ category="sm",
+ description="QUATERNION INTEGRAL OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A16,
+ },
+ [0x2A17]={
+ category="sm",
+ description="INTEGRAL WITH LEFTWARDS ARROW WITH HOOK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A17,
+ },
+ [0x2A18]={
+ category="sm",
+ description="INTEGRAL WITH TIMES SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A18,
+ },
+ [0x2A19]={
+ category="sm",
+ description="INTEGRAL WITH INTERSECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A19,
+ },
+ [0x2A1A]={
+ category="sm",
+ description="INTEGRAL WITH UNION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A1A,
+ },
+ [0x2A1B]={
+ category="sm",
+ description="INTEGRAL WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A1B,
+ },
+ [0x2A1C]={
+ category="sm",
+ description="INTEGRAL WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A1C,
+ },
+ [0x2A1D]={
+ category="sm",
+ description="JOIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A1D,
+ },
+ [0x2A1E]={
+ category="sm",
+ description="LARGE LEFT TRIANGLE OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A1E,
+ },
+ [0x2A1F]={
+ category="sm",
+ description="Z NOTATION SCHEMA COMPOSITION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A1F,
+ },
+ [0x2A20]={
+ category="sm",
+ description="Z NOTATION SCHEMA PIPING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A20,
+ },
+ [0x2A21]={
+ category="sm",
+ description="Z NOTATION SCHEMA PROJECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A21,
+ },
+ [0x2A22]={
+ category="sm",
+ description="PLUS SIGN WITH SMALL CIRCLE ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A22,
+ },
+ [0x2A23]={
+ category="sm",
+ description="PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A23,
+ },
+ [0x2A24]={
+ category="sm",
+ description="PLUS SIGN WITH TILDE ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A24,
+ },
+ [0x2A25]={
+ category="sm",
+ description="PLUS SIGN WITH DOT BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A25,
+ },
+ [0x2A26]={
+ category="sm",
+ description="PLUS SIGN WITH TILDE BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A26,
+ },
+ [0x2A27]={
+ category="sm",
+ description="PLUS SIGN WITH SUBSCRIPT TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A27,
+ },
+ [0x2A28]={
+ category="sm",
+ description="PLUS SIGN WITH BLACK TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A28,
+ },
+ [0x2A29]={
+ category="sm",
+ description="MINUS SIGN WITH COMMA ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A29,
+ },
+ [0x2A2A]={
+ category="sm",
+ description="MINUS SIGN WITH DOT BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A2A,
+ },
+ [0x2A2B]={
+ category="sm",
+ description="MINUS SIGN WITH FALLING DOTS",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A2C,
+ unicodeslot=0x2A2B,
+ },
+ [0x2A2C]={
+ category="sm",
+ description="MINUS SIGN WITH RISING DOTS",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A2B,
+ unicodeslot=0x2A2C,
+ },
+ [0x2A2D]={
+ category="sm",
+ description="PLUS SIGN IN LEFT HALF CIRCLE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A2E,
+ unicodeslot=0x2A2D,
+ },
+ [0x2A2E]={
+ category="sm",
+ description="PLUS SIGN IN RIGHT HALF CIRCLE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A2D,
+ unicodeslot=0x2A2E,
+ },
+ [0x2A2F]={
+ category="sm",
+ description="VECTOR OR CROSS PRODUCT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A2F,
+ },
+ [0x2A30]={
+ category="sm",
+ description="MULTIPLICATION SIGN WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A30,
+ },
+ [0x2A31]={
+ category="sm",
+ description="MULTIPLICATION SIGN WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A31,
+ },
+ [0x2A32]={
+ category="sm",
+ description="SEMIDIRECT PRODUCT WITH BOTTOM CLOSED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A32,
+ },
+ [0x2A33]={
+ category="sm",
+ description="SMASH PRODUCT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A33,
+ },
+ [0x2A34]={
+ category="sm",
+ description="MULTIPLICATION SIGN IN LEFT HALF CIRCLE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A35,
+ unicodeslot=0x2A34,
+ },
+ [0x2A35]={
+ category="sm",
+ description="MULTIPLICATION SIGN IN RIGHT HALF CIRCLE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A34,
+ unicodeslot=0x2A35,
+ },
+ [0x2A36]={
+ category="sm",
+ description="CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A36,
+ },
+ [0x2A37]={
+ category="sm",
+ description="MULTIPLICATION SIGN IN DOUBLE CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A37,
+ },
+ [0x2A38]={
+ category="sm",
+ description="CIRCLED DIVISION SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A38,
+ },
+ [0x2A39]={
+ category="sm",
+ description="PLUS SIGN IN TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A39,
+ },
+ [0x2A3A]={
+ category="sm",
+ description="MINUS SIGN IN TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A3A,
+ },
+ [0x2A3B]={
+ category="sm",
+ description="MULTIPLICATION SIGN IN TRIANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A3B,
+ },
+ [0x2A3C]={
+ category="sm",
+ description="INTERIOR PRODUCT",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A3D,
+ unicodeslot=0x2A3C,
+ },
+ [0x2A3D]={
+ category="sm",
+ description="RIGHTHAND INTERIOR PRODUCT",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A3C,
+ unicodeslot=0x2A3D,
+ },
+ [0x2A3E]={
+ category="sm",
+ description="Z NOTATION RELATIONAL COMPOSITION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A3E,
+ },
+ [0x2A3F]={
+ category="sm",
+ description="AMALGAMATION OR COPRODUCT",
+ direction="on",
+ linebreak="al",
+ mathclass="binary",
+ mathname="amalg",
+ unicodeslot=0x2A3F,
+ },
+ [0x2A40]={
+ category="sm",
+ description="INTERSECTION WITH DOT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A40,
+ },
+ [0x2A41]={
+ category="sm",
+ description="UNION WITH MINUS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A41,
+ },
+ [0x2A42]={
+ category="sm",
+ description="UNION WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A42,
+ },
+ [0x2A43]={
+ category="sm",
+ description="INTERSECTION WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A43,
+ },
+ [0x2A44]={
+ category="sm",
+ description="INTERSECTION WITH LOGICAL AND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A44,
+ },
+ [0x2A45]={
+ category="sm",
+ description="UNION WITH LOGICAL OR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A45,
+ },
+ [0x2A46]={
+ category="sm",
+ description="UNION ABOVE INTERSECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A46,
+ },
+ [0x2A47]={
+ category="sm",
+ description="INTERSECTION ABOVE UNION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A47,
+ },
+ [0x2A48]={
+ category="sm",
+ description="UNION ABOVE BAR ABOVE INTERSECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A48,
+ },
+ [0x2A49]={
+ category="sm",
+ description="INTERSECTION ABOVE BAR ABOVE UNION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A49,
+ },
+ [0x2A4A]={
+ category="sm",
+ description="UNION BESIDE AND JOINED WITH UNION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A4A,
+ },
+ [0x2A4B]={
+ category="sm",
+ description="INTERSECTION BESIDE AND JOINED WITH INTERSECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A4B,
+ },
+ [0x2A4C]={
+ category="sm",
+ description="CLOSED UNION WITH SERIFS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A4C,
+ },
+ [0x2A4D]={
+ category="sm",
+ description="CLOSED INTERSECTION WITH SERIFS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A4D,
+ },
+ [0x2A4E]={
+ category="sm",
+ description="DOUBLE SQUARE INTERSECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A4E,
+ },
+ [0x2A4F]={
+ category="sm",
+ description="DOUBLE SQUARE UNION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A4F,
+ },
+ [0x2A50]={
+ category="sm",
+ description="CLOSED UNION WITH SERIFS AND SMASH PRODUCT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A50,
+ },
+ [0x2A51]={
+ category="sm",
+ description="LOGICAL AND WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A51,
+ },
+ [0x2A52]={
+ category="sm",
+ description="LOGICAL OR WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A52,
+ },
+ [0x2A53]={
+ category="sm",
+ description="DOUBLE LOGICAL AND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A53,
+ },
+ [0x2A54]={
+ category="sm",
+ description="DOUBLE LOGICAL OR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A54,
+ },
+ [0x2A55]={
+ category="sm",
+ description="TWO INTERSECTING LOGICAL AND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A55,
+ },
+ [0x2A56]={
+ category="sm",
+ description="TWO INTERSECTING LOGICAL OR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A56,
+ },
+ [0x2A57]={
+ category="sm",
+ description="SLOPING LARGE OR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A57,
+ },
+ [0x2A58]={
+ category="sm",
+ description="SLOPING LARGE AND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A58,
+ },
+ [0x2A59]={
+ category="sm",
+ description="LOGICAL OR OVERLAPPING LOGICAL AND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A59,
+ },
+ [0x2A5A]={
+ category="sm",
+ description="LOGICAL AND WITH MIDDLE STEM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A5A,
+ },
+ [0x2A5B]={
+ category="sm",
+ description="LOGICAL OR WITH MIDDLE STEM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A5B,
+ },
+ [0x2A5C]={
+ category="sm",
+ description="LOGICAL AND WITH HORIZONTAL DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A5C,
+ },
+ [0x2A5D]={
+ category="sm",
+ description="LOGICAL OR WITH HORIZONTAL DASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A5D,
+ },
+ [0x2A5E]={
+ category="sm",
+ description="LOGICAL AND WITH DOUBLE OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A5E,
+ },
+ [0x2A5F]={
+ category="sm",
+ description="LOGICAL AND WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A5F,
+ },
+ [0x2A60]={
+ category="sm",
+ description="LOGICAL AND WITH DOUBLE UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A60,
+ },
+ [0x2A61]={
+ category="sm",
+ description="SMALL VEE WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A61,
+ },
+ [0x2A62]={
+ category="sm",
+ description="LOGICAL OR WITH DOUBLE OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A62,
+ },
+ [0x2A63]={
+ category="sm",
+ description="LOGICAL OR WITH DOUBLE UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A63,
+ },
+ [0x2A64]={
+ category="sm",
+ description="Z NOTATION DOMAIN ANTIRESTRICTION",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A65,
+ unicodeslot=0x2A64,
+ },
+ [0x2A65]={
+ category="sm",
+ description="Z NOTATION RANGE ANTIRESTRICTION",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A64,
+ unicodeslot=0x2A65,
+ },
+ [0x2A66]={
+ category="sm",
+ description="EQUALS SIGN WITH DOT BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A66,
+ },
+ [0x2A67]={
+ category="sm",
+ description="IDENTICAL WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A67,
+ },
+ [0x2A68]={
+ category="sm",
+ description="TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A68,
+ },
+ [0x2A69]={
+ category="sm",
+ description="TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A69,
+ },
+ [0x2A6A]={
+ category="sm",
+ description="TILDE OPERATOR WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A6A,
+ },
+ [0x2A6B]={
+ category="sm",
+ description="TILDE OPERATOR WITH RISING DOTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A6B,
+ },
+ [0x2A6C]={
+ category="sm",
+ description="SIMILAR MINUS SIMILAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A6C,
+ },
+ [0x2A6D]={
+ category="sm",
+ description="CONGRUENT WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A6D,
+ },
+ [0x2A6E]={
+ category="sm",
+ description="EQUALS WITH ASTERISK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A6E,
+ },
+ [0x2A6F]={
+ category="sm",
+ description="ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A6F,
+ },
+ [0x2A70]={
+ category="sm",
+ description="APPROXIMATELY EQUAL OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A70,
+ },
+ [0x2A71]={
+ category="sm",
+ description="EQUALS SIGN ABOVE PLUS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A71,
+ },
+ [0x2A72]={
+ category="sm",
+ description="PLUS SIGN ABOVE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A72,
+ },
+ [0x2A73]={
+ category="sm",
+ description="EQUALS SIGN ABOVE TILDE OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A73,
+ },
+ [0x2A74]={
+ category="sm",
+ description="DOUBLE COLON EQUAL",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x003A, 0x003A, 0x003D },
+ unicodeslot=0x2A74,
+ },
+ [0x2A75]={
+ category="sm",
+ description="TWO CONSECUTIVE EQUALS SIGNS",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x003D, 0x003D },
+ unicodeslot=0x2A75,
+ },
+ [0x2A76]={
+ category="sm",
+ description="THREE CONSECUTIVE EQUALS SIGNS",
+ direction="on",
+ linebreak="al",
+ specials={ "compat", 0x003D, 0x003D, 0x003D },
+ unicodeslot=0x2A76,
+ },
+ [0x2A77]={
+ category="sm",
+ description="EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A77,
+ },
+ [0x2A78]={
+ category="sm",
+ description="EQUIVALENT WITH FOUR DOTS ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A78,
+ },
+ [0x2A79]={
+ category="sm",
+ description="LESS-THAN WITH CIRCLE INSIDE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A7A,
+ unicodeslot=0x2A79,
+ },
+ [0x2A7A]={
+ category="sm",
+ description="GREATER-THAN WITH CIRCLE INSIDE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A79,
+ unicodeslot=0x2A7A,
+ },
+ [0x2A7B]={
+ category="sm",
+ description="LESS-THAN WITH QUESTION MARK ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A7B,
+ },
+ [0x2A7C]={
+ category="sm",
+ description="GREATER-THAN WITH QUESTION MARK ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A7C,
+ },
+ [0x2A7D]={
+ category="sm",
+ description="LESS-THAN OR SLANTED EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="leqslant",
+ mirror=0x2A7E,
+ unicodeslot=0x2A7D,
+ },
+ [0x2A7E]={
+ category="sm",
+ description="GREATER-THAN OR SLANTED EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="geqslant",
+ mirror=0x2A7D,
+ unicodeslot=0x2A7E,
+ },
+ [0x2A7F]={
+ category="sm",
+ description="LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A80,
+ unicodeslot=0x2A7F,
+ },
+ [0x2A80]={
+ category="sm",
+ description="GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A7F,
+ unicodeslot=0x2A80,
+ },
+ [0x2A81]={
+ category="sm",
+ description="LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A82,
+ unicodeslot=0x2A81,
+ },
+ [0x2A82]={
+ category="sm",
+ description="GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A81,
+ unicodeslot=0x2A82,
+ },
+ [0x2A83]={
+ category="sm",
+ description="LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A84,
+ unicodeslot=0x2A83,
+ },
+ [0x2A84]={
+ category="sm",
+ description="GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A83,
+ unicodeslot=0x2A84,
+ },
+ [0x2A85]={
+ category="sm",
+ description="LESS-THAN OR APPROXIMATE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lessapprox",
+ unicodeslot=0x2A85,
+ },
+ [0x2A86]={
+ category="sm",
+ description="GREATER-THAN OR APPROXIMATE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="gtrapprox",
+ unicodeslot=0x2A86,
+ },
+ [0x2A87]={
+ category="sm",
+ description="LESS-THAN AND SINGLE-LINE NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lneq",
+ unicodeslot=0x2A87,
+ },
+ [0x2A88]={
+ category="sm",
+ description="GREATER-THAN AND SINGLE-LINE NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="rneq",
+ unicodeslot=0x2A88,
+ },
+ [0x2A89]={
+ category="sm",
+ description="LESS-THAN AND NOT APPROXIMATE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lnapprox",
+ unicodeslot=0x2A89,
+ },
+ [0x2A8A]={
+ category="sm",
+ description="GREATER-THAN AND NOT APPROXIMATE",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="gnapprox",
+ unicodeslot=0x2A8A,
+ },
+ [0x2A8B]={
+ category="sm",
+ description="LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="lesseqqgtr",
+ mirror=0x2A8C,
+ unicodeslot=0x2A8B,
+ },
+ [0x2A8C]={
+ category="sm",
+ description="GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="gtreqqless",
+ mirror=0x2A8B,
+ unicodeslot=0x2A8C,
+ },
+ [0x2A8D]={
+ category="sm",
+ description="LESS-THAN ABOVE SIMILAR OR EQUAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A8D,
+ },
+ [0x2A8E]={
+ category="sm",
+ description="GREATER-THAN ABOVE SIMILAR OR EQUAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A8E,
+ },
+ [0x2A8F]={
+ category="sm",
+ description="LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A8F,
+ },
+ [0x2A90]={
+ category="sm",
+ description="GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A90,
+ },
+ [0x2A91]={
+ category="sm",
+ description="LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A92,
+ unicodeslot=0x2A91,
+ },
+ [0x2A92]={
+ category="sm",
+ description="GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A91,
+ unicodeslot=0x2A92,
+ },
+ [0x2A93]={
+ category="sm",
+ description="LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A94,
+ unicodeslot=0x2A93,
+ },
+ [0x2A94]={
+ category="sm",
+ description="GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A93,
+ unicodeslot=0x2A94,
+ },
+ [0x2A95]={
+ category="sm",
+ description="SLANTED EQUAL TO OR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="eqslantless",
+ mirror=0x2A96,
+ unicodeslot=0x2A95,
+ },
+ [0x2A96]={
+ category="sm",
+ description="SLANTED EQUAL TO OR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="eqslantgtr",
+ mirror=0x2A95,
+ unicodeslot=0x2A96,
+ },
+ [0x2A97]={
+ category="sm",
+ description="SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A98,
+ unicodeslot=0x2A97,
+ },
+ [0x2A98]={
+ category="sm",
+ description="SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A97,
+ unicodeslot=0x2A98,
+ },
+ [0x2A99]={
+ category="sm",
+ description="DOUBLE-LINE EQUAL TO OR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A9A,
+ unicodeslot=0x2A99,
+ },
+ [0x2A9A]={
+ category="sm",
+ description="DOUBLE-LINE EQUAL TO OR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A99,
+ unicodeslot=0x2A9A,
+ },
+ [0x2A9B]={
+ category="sm",
+ description="DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A9C,
+ unicodeslot=0x2A9B,
+ },
+ [0x2A9C]={
+ category="sm",
+ description="DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2A9B,
+ unicodeslot=0x2A9C,
+ },
+ [0x2A9D]={
+ category="sm",
+ description="SIMILAR OR LESS-THAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A9D,
+ },
+ [0x2A9E]={
+ category="sm",
+ description="SIMILAR OR GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A9E,
+ },
+ [0x2A9F]={
+ category="sm",
+ description="SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2A9F,
+ },
+ [0x2AA0]={
+ category="sm",
+ description="SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AA0,
+ },
+ [0x2AA1]={
+ category="sm",
+ description="DOUBLE NESTED LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AA2,
+ unicodeslot=0x2AA1,
+ },
+ [0x2AA2]={
+ category="sm",
+ description="DOUBLE NESTED GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AA1,
+ unicodeslot=0x2AA2,
+ },
+ [0x2AA3]={
+ category="sm",
+ description="DOUBLE NESTED LESS-THAN WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AA3,
+ },
+ [0x2AA4]={
+ category="sm",
+ description="GREATER-THAN OVERLAPPING LESS-THAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AA4,
+ },
+ [0x2AA5]={
+ category="sm",
+ description="GREATER-THAN BESIDE LESS-THAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AA5,
+ },
+ [0x2AA6]={
+ category="sm",
+ description="LESS-THAN CLOSED BY CURVE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AA7,
+ unicodeslot=0x2AA6,
+ },
+ [0x2AA7]={
+ category="sm",
+ description="GREATER-THAN CLOSED BY CURVE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AA6,
+ unicodeslot=0x2AA7,
+ },
+ [0x2AA8]={
+ category="sm",
+ description="LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AA9,
+ unicodeslot=0x2AA8,
+ },
+ [0x2AA9]={
+ category="sm",
+ description="GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AA8,
+ unicodeslot=0x2AA9,
+ },
+ [0x2AAA]={
+ category="sm",
+ description="SMALLER THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AAB,
+ unicodeslot=0x2AAA,
+ },
+ [0x2AAB]={
+ category="sm",
+ description="LARGER THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AAA,
+ unicodeslot=0x2AAB,
+ },
+ [0x2AAC]={
+ category="sm",
+ description="SMALLER THAN OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AAD,
+ unicodeslot=0x2AAC,
+ },
+ [0x2AAD]={
+ category="sm",
+ description="LARGER THAN OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AAC,
+ unicodeslot=0x2AAD,
+ },
+ [0x2AAE]={
+ category="sm",
+ description="EQUALS SIGN WITH BUMPY ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AAE,
+ },
+ [0x2AAF]={
+ category="sm",
+ description="PRECEDES ABOVE SINGLE-LINE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="preceq",
+ mirror=0x2AB0,
+ unicodeslot=0x2AAF,
+ },
+ [0x2AB0]={
+ category="sm",
+ description="SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succeq",
+ mirror=0x2AAF,
+ unicodeslot=0x2AB0,
+ },
+ [0x2AB1]={
+ category="sm",
+ description="PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="precneq",
+ unicodeslot=0x2AB1,
+ },
+ [0x2AB2]={
+ category="sm",
+ description="SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succneq",
+ unicodeslot=0x2AB2,
+ },
+ [0x2AB3]={
+ category="sm",
+ description="PRECEDES ABOVE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="preceqq",
+ mirror=0x2AB4,
+ unicodeslot=0x2AB3,
+ },
+ [0x2AB4]={
+ category="sm",
+ description="SUCCEEDS ABOVE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succeqq",
+ mirror=0x2AB3,
+ unicodeslot=0x2AB4,
+ },
+ [0x2AB5]={
+ category="sm",
+ description="PRECEDES ABOVE NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="precneqq",
+ unicodeslot=0x2AB5,
+ },
+ [0x2AB6]={
+ category="sm",
+ description="SUCCEEDS ABOVE NOT EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succneqq",
+ unicodeslot=0x2AB6,
+ },
+ [0x2AB7]={
+ category="sm",
+ description="PRECEDES ABOVE ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="precapprox",
+ unicodeslot=0x2AB7,
+ },
+ [0x2AB8]={
+ category="sm",
+ description="SUCCEEDS ABOVE ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succapprox",
+ unicodeslot=0x2AB8,
+ },
+ [0x2AB9]={
+ category="sm",
+ description="PRECEDES ABOVE NOT ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="precnapprox",
+ unicodeslot=0x2AB9,
+ },
+ [0x2ABA]={
+ category="sm",
+ description="SUCCEEDS ABOVE NOT ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="succnapprox",
+ unicodeslot=0x2ABA,
+ },
+ [0x2ABB]={
+ category="sm",
+ description="DOUBLE PRECEDES",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ABC,
+ unicodeslot=0x2ABB,
+ },
+ [0x2ABC]={
+ category="sm",
+ description="DOUBLE SUCCEEDS",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ABB,
+ unicodeslot=0x2ABC,
+ },
+ [0x2ABD]={
+ category="sm",
+ description="SUBSET WITH DOT",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ABE,
+ unicodeslot=0x2ABD,
+ },
+ [0x2ABE]={
+ category="sm",
+ description="SUPERSET WITH DOT",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ABD,
+ unicodeslot=0x2ABE,
+ },
+ [0x2ABF]={
+ category="sm",
+ description="SUBSET WITH PLUS SIGN BELOW",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AC0,
+ unicodeslot=0x2ABF,
+ },
+ [0x2AC0]={
+ category="sm",
+ description="SUPERSET WITH PLUS SIGN BELOW",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ABF,
+ unicodeslot=0x2AC0,
+ },
+ [0x2AC1]={
+ category="sm",
+ description="SUBSET WITH MULTIPLICATION SIGN BELOW",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AC2,
+ unicodeslot=0x2AC1,
+ },
+ [0x2AC2]={
+ category="sm",
+ description="SUPERSET WITH MULTIPLICATION SIGN BELOW",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AC1,
+ unicodeslot=0x2AC2,
+ },
+ [0x2AC3]={
+ category="sm",
+ description="SUBSET OF OR EQUAL TO WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AC4,
+ unicodeslot=0x2AC3,
+ },
+ [0x2AC4]={
+ category="sm",
+ description="SUPERSET OF OR EQUAL TO WITH DOT ABOVE",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AC3,
+ unicodeslot=0x2AC4,
+ },
+ [0x2AC5]={
+ category="sm",
+ description="SUBSET OF ABOVE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="subseteqq",
+ mirror=0x2AC6,
+ unicodeslot=0x2AC5,
+ },
+ [0x2AC6]={
+ category="sm",
+ description="SUPERSET OF ABOVE EQUALS SIGN",
+ direction="on",
+ linebreak="al",
+ mathclass="relation",
+ mathname="supseteqq",
+ mirror=0x2AC5,
+ unicodeslot=0x2AC6,
+ },
+ [0x2AC7]={
+ category="sm",
+ description="SUBSET OF ABOVE TILDE OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AC7,
+ },
+ [0x2AC8]={
+ category="sm",
+ description="SUPERSET OF ABOVE TILDE OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AC8,
+ },
+ [0x2AC9]={
+ category="sm",
+ description="SUBSET OF ABOVE ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AC9,
+ },
+ [0x2ACA]={
+ category="sm",
+ description="SUPERSET OF ABOVE ALMOST EQUAL TO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2ACA,
+ },
+ [0x2ACB]={
+ category="sm",
+ description="SUBSET OF ABOVE NOT EQUAL TO",
+ direction="on",
+ mathclass="relation",
+ mathname="subsetneqq",
+ linebreak="al",
+ unicodeslot=0x2ACB,
+ },
+ [0x2ACC]={
+ category="sm",
+ description="SUPERSET OF ABOVE NOT EQUAL TO",
+ direction="on",
+ mathclass="relation",
+ mathname="supsetneqq",
+ linebreak="al",
+ unicodeslot=0x2ACC,
+ },
+ [0x2ACD]={
+ category="sm",
+ description="SQUARE LEFT OPEN BOX OPERATOR",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ACE,
+ unicodeslot=0x2ACD,
+ },
+ [0x2ACE]={
+ category="sm",
+ description="SQUARE RIGHT OPEN BOX OPERATOR",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ACD,
+ unicodeslot=0x2ACE,
+ },
+ [0x2ACF]={
+ category="sm",
+ description="CLOSED SUBSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AD0,
+ unicodeslot=0x2ACF,
+ },
+ [0x2AD0]={
+ category="sm",
+ description="CLOSED SUPERSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x2ACF,
+ unicodeslot=0x2AD0,
+ },
+ [0x2AD1]={
+ category="sm",
+ description="CLOSED SUBSET OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AD2,
+ unicodeslot=0x2AD1,
+ },
+ [0x2AD2]={
+ category="sm",
+ description="CLOSED SUPERSET OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AD1,
+ unicodeslot=0x2AD2,
+ },
+ [0x2AD3]={
+ category="sm",
+ description="SUBSET ABOVE SUPERSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AD4,
+ unicodeslot=0x2AD3,
+ },
+ [0x2AD4]={
+ category="sm",
+ description="SUPERSET ABOVE SUBSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AD3,
+ unicodeslot=0x2AD4,
+ },
+ [0x2AD5]={
+ category="sm",
+ description="SUBSET ABOVE SUBSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AD6,
+ unicodeslot=0x2AD5,
+ },
+ [0x2AD6]={
+ category="sm",
+ description="SUPERSET ABOVE SUPERSET",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AD5,
+ unicodeslot=0x2AD6,
+ },
+ [0x2AD7]={
+ category="sm",
+ description="SUPERSET BESIDE SUBSET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AD7,
+ },
+ [0x2AD8]={
+ category="sm",
+ description="SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AD8,
+ },
+ [0x2AD9]={
+ category="sm",
+ description="ELEMENT OF OPENING DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AD9,
+ },
+ [0x2ADA]={
+ category="sm",
+ description="PITCHFORK WITH TEE TOP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2ADA,
+ },
+ [0x2ADB]={
+ category="sm",
+ description="TRANSVERSAL INTERSECTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2ADB,
+ },
+ [0x2ADC]={
+ category="sm",
+ description="FORKING",
+ direction="on",
+ linebreak="al",
+ specials={ "char", 0x2ADD, 0x0338 },
+ unicodeslot=0x2ADC,
+ },
+ [0x2ADD]={
+ category="sm",
+ description="NONFORKING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2ADD,
+ },
+ [0x2ADE]={
+ category="sm",
+ description="SHORT LEFT TACK",
+ direction="on",
+ linebreak="al",
+ mirror=0x22A6,
+ unicodeslot=0x2ADE,
+ },
+ [0x2ADF]={
+ category="sm",
+ description="SHORT DOWN TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2ADF,
+ },
+ [0x2AE0]={
+ category="sm",
+ description="SHORT UP TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AE0,
+ },
+ [0x2AE1]={
+ category="sm",
+ description="PERPENDICULAR WITH S",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AE1,
+ },
+ [0x2AE2]={
+ category="sm",
+ description="VERTICAL BAR TRIPLE RIGHT TURNSTILE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AE2,
+ },
+ [0x2AE3]={
+ category="sm",
+ description="DOUBLE VERTICAL BAR LEFT TURNSTILE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22A9,
+ unicodeslot=0x2AE3,
+ },
+ [0x2AE4]={
+ category="sm",
+ description="VERTICAL BAR DOUBLE LEFT TURNSTILE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22A8,
+ unicodeslot=0x2AE4,
+ },
+ [0x2AE5]={
+ category="sm",
+ description="DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE",
+ direction="on",
+ linebreak="al",
+ mirror=0x22AB,
+ unicodeslot=0x2AE5,
+ },
+ [0x2AE6]={
+ category="sm",
+ description="LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AE6,
+ },
+ [0x2AE7]={
+ category="sm",
+ description="SHORT DOWN TACK WITH OVERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AE7,
+ },
+ [0x2AE8]={
+ category="sm",
+ description="SHORT UP TACK WITH UNDERBAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AE8,
+ },
+ [0x2AE9]={
+ category="sm",
+ description="SHORT UP TACK ABOVE SHORT DOWN TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AE9,
+ },
+ [0x2AEA]={
+ category="sm",
+ description="DOUBLE DOWN TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AEA,
+ },
+ [0x2AEB]={
+ category="sm",
+ description="DOUBLE UP TACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AEB,
+ },
+ [0x2AEC]={
+ category="sm",
+ description="DOUBLE STROKE NOT SIGN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AED,
+ unicodeslot=0x2AEC,
+ },
+ [0x2AED]={
+ category="sm",
+ description="REVERSED DOUBLE STROKE NOT SIGN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AEC,
+ unicodeslot=0x2AED,
+ },
+ [0x2AEE]={
+ category="sm",
+ description="DOES NOT DIVIDE WITH REVERSED NEGATION SLASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AEE,
+ },
+ [0x2AEF]={
+ category="sm",
+ description="VERTICAL LINE WITH CIRCLE ABOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AEF,
+ },
+ [0x2AF0]={
+ category="sm",
+ description="VERTICAL LINE WITH CIRCLE BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AF0,
+ },
+ [0x2AF1]={
+ category="sm",
+ description="DOWN TACK WITH CIRCLE BELOW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AF1,
+ },
+ [0x2AF2]={
+ category="sm",
+ description="PARALLEL WITH HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AF2,
+ },
+ [0x2AF3]={
+ category="sm",
+ description="PARALLEL WITH TILDE OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AF3,
+ },
+ [0x2AF4]={
+ category="sm",
+ description="TRIPLE VERTICAL BAR BINARY RELATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AF4,
+ },
+ [0x2AF5]={
+ category="sm",
+ description="TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AF5,
+ },
+ [0x2AF6]={
+ category="sm",
+ description="TRIPLE COLON OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AF6,
+ },
+ [0x2AF7]={
+ category="sm",
+ description="TRIPLE NESTED LESS-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AF8,
+ unicodeslot=0x2AF7,
+ },
+ [0x2AF8]={
+ category="sm",
+ description="TRIPLE NESTED GREATER-THAN",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AF7,
+ unicodeslot=0x2AF8,
+ },
+ [0x2AF9]={
+ category="sm",
+ description="DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AFA,
+ unicodeslot=0x2AF9,
+ },
+ [0x2AFA]={
+ category="sm",
+ description="DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO",
+ direction="on",
+ linebreak="al",
+ mirror=0x2AF9,
+ unicodeslot=0x2AFA,
+ },
+ [0x2AFB]={
+ category="sm",
+ description="TRIPLE SOLIDUS BINARY RELATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AFB,
+ },
+ [0x2AFC]={
+ category="sm",
+ description="LARGE TRIPLE VERTICAL BAR OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AFC,
+ },
+ [0x2AFD]={
+ category="sm",
+ description="DOUBLE SOLIDUS OPERATOR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AFD,
+ },
+ [0x2AFE]={
+ category="sm",
+ description="WHITE VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AFE,
+ },
+ [0x2AFF]={
+ category="sm",
+ description="N-ARY WHITE VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2AFF,
+ },
+ [0x2B00]={
+ category="so",
+ description="NORTH EAST WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B00,
+ },
+ [0x2B01]={
+ category="so",
+ description="NORTH WEST WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B01,
+ },
+ [0x2B02]={
+ category="so",
+ description="SOUTH EAST WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B02,
+ },
+ [0x2B03]={
+ category="so",
+ description="SOUTH WEST WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B03,
+ },
+ [0x2B04]={
+ category="so",
+ description="LEFT RIGHT WHITE ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B04,
+ },
+ [0x2B05]={
+ category="so",
+ description="LEFTWARDS BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B05,
+ },
+ [0x2B06]={
+ category="so",
+ description="UPWARDS BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B06,
+ },
+ [0x2B07]={
+ category="so",
+ description="DOWNWARDS BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B07,
+ },
+ [0x2B08]={
+ category="so",
+ description="NORTH EAST BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B08,
+ },
+ [0x2B09]={
+ category="so",
+ description="NORTH WEST BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B09,
+ },
+ [0x2B0A]={
+ category="so",
+ description="SOUTH EAST BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B0A,
+ },
+ [0x2B0B]={
+ category="so",
+ description="SOUTH WEST BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B0B,
+ },
+ [0x2B0C]={
+ category="so",
+ description="LEFT RIGHT BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B0C,
+ },
+ [0x2B0D]={
+ category="so",
+ description="UP DOWN BLACK ARROW",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B0D,
+ },
+ [0x2B0E]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH TIP DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B0E,
+ },
+ [0x2B0F]={
+ category="so",
+ description="RIGHTWARDS ARROW WITH TIP UPWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B0F,
+ },
+ [0x2B10]={
+ category="so",
+ description="LEFTWARDS ARROW WITH TIP DOWNWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B10,
+ },
+ [0x2B11]={
+ category="so",
+ description="LEFTWARDS ARROW WITH TIP UPWARDS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B11,
+ },
+ [0x2B12]={
+ category="so",
+ description="SQUARE WITH TOP HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B12,
+ },
+ [0x2B13]={
+ category="so",
+ description="SQUARE WITH BOTTOM HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B13,
+ },
+ [0x2B14]={
+ category="so",
+ description="SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B14,
+ },
+ [0x2B15]={
+ category="so",
+ description="SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B15,
+ },
+ [0x2B16]={
+ category="so",
+ description="DIAMOND WITH LEFT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B16,
+ },
+ [0x2B17]={
+ category="so",
+ description="DIAMOND WITH RIGHT HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B17,
+ },
+ [0x2B18]={
+ category="so",
+ description="DIAMOND WITH TOP HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B18,
+ },
+ [0x2B19]={
+ category="so",
+ description="DIAMOND WITH BOTTOM HALF BLACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B19,
+ },
+ [0x2B1A]={
+ category="so",
+ description="DOTTED SQUARE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B1A,
+ },
+ [0x2B20]={
+ category="so",
+ description="WHITE PENTAGON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B20,
+ },
+ [0x2B21]={
+ category="so",
+ description="WHITE HEXAGON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B21,
+ },
+ [0x2B22]={
+ category="so",
+ description="BLACK HEXAGON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B22,
+ },
+ [0x2B23]={
+ category="so",
+ description="HORIZONTAL BLACK HEXAGON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2B23,
+ },
+ [0x2C00]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER AZU",
+ direction="l",
+ lccode=0x2C30,
+ linebreak="al",
+ unicodeslot=0x2C00,
+ },
+ [0x2C01]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER BUKY",
+ direction="l",
+ lccode=0x2C31,
+ linebreak="al",
+ unicodeslot=0x2C01,
+ },
+ [0x2C02]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER VEDE",
+ direction="l",
+ lccode=0x2C32,
+ linebreak="al",
+ unicodeslot=0x2C02,
+ },
+ [0x2C03]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER GLAGOLI",
+ direction="l",
+ lccode=0x2C33,
+ linebreak="al",
+ unicodeslot=0x2C03,
+ },
+ [0x2C04]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER DOBRO",
+ direction="l",
+ lccode=0x2C34,
+ linebreak="al",
+ unicodeslot=0x2C04,
+ },
+ [0x2C05]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER YESTU",
+ direction="l",
+ lccode=0x2C35,
+ linebreak="al",
+ unicodeslot=0x2C05,
+ },
+ [0x2C06]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER ZHIVETE",
+ direction="l",
+ lccode=0x2C36,
+ linebreak="al",
+ unicodeslot=0x2C06,
+ },
+ [0x2C07]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER DZELO",
+ direction="l",
+ lccode=0x2C37,
+ linebreak="al",
+ unicodeslot=0x2C07,
+ },
+ [0x2C08]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER ZEMLJA",
+ direction="l",
+ lccode=0x2C38,
+ linebreak="al",
+ unicodeslot=0x2C08,
+ },
+ [0x2C09]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER IZHE",
+ direction="l",
+ lccode=0x2C39,
+ linebreak="al",
+ unicodeslot=0x2C09,
+ },
+ [0x2C0A]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER INITIAL IZHE",
+ direction="l",
+ lccode=0x2C3A,
+ linebreak="al",
+ unicodeslot=0x2C0A,
+ },
+ [0x2C0B]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER I",
+ direction="l",
+ lccode=0x2C3B,
+ linebreak="al",
+ unicodeslot=0x2C0B,
+ },
+ [0x2C0C]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER DJERVI",
+ direction="l",
+ lccode=0x2C3C,
+ linebreak="al",
+ unicodeslot=0x2C0C,
+ },
+ [0x2C0D]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER KAKO",
+ direction="l",
+ lccode=0x2C3D,
+ linebreak="al",
+ unicodeslot=0x2C0D,
+ },
+ [0x2C0E]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER LJUDIJE",
+ direction="l",
+ lccode=0x2C3E,
+ linebreak="al",
+ unicodeslot=0x2C0E,
+ },
+ [0x2C0F]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER MYSLITE",
+ direction="l",
+ lccode=0x2C3F,
+ linebreak="al",
+ unicodeslot=0x2C0F,
+ },
+ [0x2C10]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER NASHI",
+ direction="l",
+ lccode=0x2C40,
+ linebreak="al",
+ unicodeslot=0x2C10,
+ },
+ [0x2C11]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER ONU",
+ direction="l",
+ lccode=0x2C41,
+ linebreak="al",
+ unicodeslot=0x2C11,
+ },
+ [0x2C12]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER POKOJI",
+ direction="l",
+ lccode=0x2C42,
+ linebreak="al",
+ unicodeslot=0x2C12,
+ },
+ [0x2C13]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER RITSI",
+ direction="l",
+ lccode=0x2C43,
+ linebreak="al",
+ unicodeslot=0x2C13,
+ },
+ [0x2C14]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER SLOVO",
+ direction="l",
+ lccode=0x2C44,
+ linebreak="al",
+ unicodeslot=0x2C14,
+ },
+ [0x2C15]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER TVRIDO",
+ direction="l",
+ lccode=0x2C45,
+ linebreak="al",
+ unicodeslot=0x2C15,
+ },
+ [0x2C16]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER UKU",
+ direction="l",
+ lccode=0x2C46,
+ linebreak="al",
+ unicodeslot=0x2C16,
+ },
+ [0x2C17]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER FRITU",
+ direction="l",
+ lccode=0x2C47,
+ linebreak="al",
+ unicodeslot=0x2C17,
+ },
+ [0x2C18]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER HERU",
+ direction="l",
+ lccode=0x2C48,
+ linebreak="al",
+ unicodeslot=0x2C18,
+ },
+ [0x2C19]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER OTU",
+ direction="l",
+ lccode=0x2C49,
+ linebreak="al",
+ unicodeslot=0x2C19,
+ },
+ [0x2C1A]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER PE",
+ direction="l",
+ lccode=0x2C4A,
+ linebreak="al",
+ unicodeslot=0x2C1A,
+ },
+ [0x2C1B]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER SHTA",
+ direction="l",
+ lccode=0x2C4B,
+ linebreak="al",
+ unicodeslot=0x2C1B,
+ },
+ [0x2C1C]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER TSI",
+ direction="l",
+ lccode=0x2C4C,
+ linebreak="al",
+ unicodeslot=0x2C1C,
+ },
+ [0x2C1D]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER CHRIVI",
+ direction="l",
+ lccode=0x2C4D,
+ linebreak="al",
+ unicodeslot=0x2C1D,
+ },
+ [0x2C1E]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER SHA",
+ direction="l",
+ lccode=0x2C4E,
+ linebreak="al",
+ unicodeslot=0x2C1E,
+ },
+ [0x2C1F]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER YERU",
+ direction="l",
+ lccode=0x2C4F,
+ linebreak="al",
+ unicodeslot=0x2C1F,
+ },
+ [0x2C20]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER YERI",
+ direction="l",
+ lccode=0x2C50,
+ linebreak="al",
+ unicodeslot=0x2C20,
+ },
+ [0x2C21]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER YATI",
+ direction="l",
+ lccode=0x2C51,
+ linebreak="al",
+ unicodeslot=0x2C21,
+ },
+ [0x2C22]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER SPIDERY HA",
+ direction="l",
+ lccode=0x2C52,
+ linebreak="al",
+ unicodeslot=0x2C22,
+ },
+ [0x2C23]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER YU",
+ direction="l",
+ lccode=0x2C53,
+ linebreak="al",
+ unicodeslot=0x2C23,
+ },
+ [0x2C24]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER SMALL YUS",
+ direction="l",
+ lccode=0x2C54,
+ linebreak="al",
+ unicodeslot=0x2C24,
+ },
+ [0x2C25]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL",
+ direction="l",
+ lccode=0x2C55,
+ linebreak="al",
+ unicodeslot=0x2C25,
+ },
+ [0x2C26]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER YO",
+ direction="l",
+ lccode=0x2C56,
+ linebreak="al",
+ unicodeslot=0x2C26,
+ },
+ [0x2C27]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS",
+ direction="l",
+ lccode=0x2C57,
+ linebreak="al",
+ unicodeslot=0x2C27,
+ },
+ [0x2C28]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER BIG YUS",
+ direction="l",
+ lccode=0x2C58,
+ linebreak="al",
+ unicodeslot=0x2C28,
+ },
+ [0x2C29]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS",
+ direction="l",
+ lccode=0x2C59,
+ linebreak="al",
+ unicodeslot=0x2C29,
+ },
+ [0x2C2A]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER FITA",
+ direction="l",
+ lccode=0x2C5A,
+ linebreak="al",
+ unicodeslot=0x2C2A,
+ },
+ [0x2C2B]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER IZHITSA",
+ direction="l",
+ lccode=0x2C5B,
+ linebreak="al",
+ unicodeslot=0x2C2B,
+ },
+ [0x2C2C]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER SHTAPIC",
+ direction="l",
+ lccode=0x2C5C,
+ linebreak="al",
+ unicodeslot=0x2C2C,
+ },
+ [0x2C2D]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER TROKUTASTI A",
+ direction="l",
+ lccode=0x2C5D,
+ linebreak="al",
+ unicodeslot=0x2C2D,
+ },
+ [0x2C2E]={
+ category="lu",
+ description="GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE",
+ direction="l",
+ lccode=0x2C5E,
+ linebreak="al",
+ unicodeslot=0x2C2E,
+ },
+ [0x2C30]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER AZU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C00,
+ unicodeslot=0x2C30,
+ },
+ [0x2C31]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER BUKY",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C01,
+ unicodeslot=0x2C31,
+ },
+ [0x2C32]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER VEDE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C02,
+ unicodeslot=0x2C32,
+ },
+ [0x2C33]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER GLAGOLI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C03,
+ unicodeslot=0x2C33,
+ },
+ [0x2C34]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER DOBRO",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C04,
+ unicodeslot=0x2C34,
+ },
+ [0x2C35]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER YESTU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C05,
+ unicodeslot=0x2C35,
+ },
+ [0x2C36]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER ZHIVETE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C06,
+ unicodeslot=0x2C36,
+ },
+ [0x2C37]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER DZELO",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C07,
+ unicodeslot=0x2C37,
+ },
+ [0x2C38]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER ZEMLJA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C08,
+ unicodeslot=0x2C38,
+ },
+ [0x2C39]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER IZHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C09,
+ unicodeslot=0x2C39,
+ },
+ [0x2C3A]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER INITIAL IZHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C0A,
+ unicodeslot=0x2C3A,
+ },
+ [0x2C3B]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER I",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C0B,
+ unicodeslot=0x2C3B,
+ },
+ [0x2C3C]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER DJERVI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C0C,
+ unicodeslot=0x2C3C,
+ },
+ [0x2C3D]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER KAKO",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C0D,
+ unicodeslot=0x2C3D,
+ },
+ [0x2C3E]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER LJUDIJE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C0E,
+ unicodeslot=0x2C3E,
+ },
+ [0x2C3F]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER MYSLITE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C0F,
+ unicodeslot=0x2C3F,
+ },
+ [0x2C40]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER NASHI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C10,
+ unicodeslot=0x2C40,
+ },
+ [0x2C41]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER ONU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C11,
+ unicodeslot=0x2C41,
+ },
+ [0x2C42]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER POKOJI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C12,
+ unicodeslot=0x2C42,
+ },
+ [0x2C43]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER RITSI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C13,
+ unicodeslot=0x2C43,
+ },
+ [0x2C44]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER SLOVO",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C14,
+ unicodeslot=0x2C44,
+ },
+ [0x2C45]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER TVRIDO",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C15,
+ unicodeslot=0x2C45,
+ },
+ [0x2C46]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER UKU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C16,
+ unicodeslot=0x2C46,
+ },
+ [0x2C47]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER FRITU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C17,
+ unicodeslot=0x2C47,
+ },
+ [0x2C48]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER HERU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C18,
+ unicodeslot=0x2C48,
+ },
+ [0x2C49]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER OTU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C19,
+ unicodeslot=0x2C49,
+ },
+ [0x2C4A]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER PE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C1A,
+ unicodeslot=0x2C4A,
+ },
+ [0x2C4B]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER SHTA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C1B,
+ unicodeslot=0x2C4B,
+ },
+ [0x2C4C]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER TSI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C1C,
+ unicodeslot=0x2C4C,
+ },
+ [0x2C4D]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER CHRIVI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C1D,
+ unicodeslot=0x2C4D,
+ },
+ [0x2C4E]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER SHA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C1E,
+ unicodeslot=0x2C4E,
+ },
+ [0x2C4F]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER YERU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C1F,
+ unicodeslot=0x2C4F,
+ },
+ [0x2C50]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER YERI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C20,
+ unicodeslot=0x2C50,
+ },
+ [0x2C51]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER YATI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C21,
+ unicodeslot=0x2C51,
+ },
+ [0x2C52]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER SPIDERY HA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C22,
+ unicodeslot=0x2C52,
+ },
+ [0x2C53]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER YU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C23,
+ unicodeslot=0x2C53,
+ },
+ [0x2C54]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER SMALL YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C24,
+ unicodeslot=0x2C54,
+ },
+ [0x2C55]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C25,
+ unicodeslot=0x2C55,
+ },
+ [0x2C56]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER YO",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C26,
+ unicodeslot=0x2C56,
+ },
+ [0x2C57]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER IOTATED SMALL YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C27,
+ unicodeslot=0x2C57,
+ },
+ [0x2C58]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER BIG YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C28,
+ unicodeslot=0x2C58,
+ },
+ [0x2C59]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER IOTATED BIG YUS",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C29,
+ unicodeslot=0x2C59,
+ },
+ [0x2C5A]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER FITA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C2A,
+ unicodeslot=0x2C5A,
+ },
+ [0x2C5B]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER IZHITSA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C2B,
+ unicodeslot=0x2C5B,
+ },
+ [0x2C5C]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER SHTAPIC",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C2C,
+ unicodeslot=0x2C5C,
+ },
+ [0x2C5D]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER TROKUTASTI A",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C2D,
+ unicodeslot=0x2C5D,
+ },
+ [0x2C5E]={
+ category="ll",
+ description="GLAGOLITIC SMALL LETTER LATINATE MYSLITE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C2E,
+ unicodeslot=0x2C5E,
+ },
+ [0x2C60]={
+ category="lu",
+ description="LATIN CAPITAL LETTER L WITH DOUBLE BAR",
+ direction="l",
+ lccode=0x2C61,
+ linebreak="al",
+ shcode=0x004C,
+ unicodeslot=0x2C60,
+ },
+ [0x2C61]={
+ category="ll",
+ description="LATIN SMALL LETTER L WITH DOUBLE BAR",
+ direction="l",
+ linebreak="al",
+ shcode=0x006C,
+ uccode=0x2C60,
+ unicodeslot=0x2C61,
+ },
+ [0x2C62]={
+ category="lu",
+ description="LATIN CAPITAL LETTER L WITH MIDDLE TILDE",
+ direction="l",
+ lccode=0x026B,
+ linebreak="al",
+ shcode=0x004C,
+ unicodeslot=0x2C62,
+ },
+ [0x2C63]={
+ category="lu",
+ description="LATIN CAPITAL LETTER P WITH STROKE",
+ direction="l",
+ lccode=0x1D7D,
+ linebreak="al",
+ shcode=0x0050,
+ unicodeslot=0x2C63,
+ },
+ [0x2C64]={
+ category="lu",
+ description="LATIN CAPITAL LETTER R WITH TAIL",
+ direction="l",
+ lccode=0x027D,
+ linebreak="al",
+ shcode=0x0052,
+ unicodeslot=0x2C64,
+ },
+ [0x2C65]={
+ category="ll",
+ description="LATIN SMALL LETTER A WITH STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0061,
+ uccode=0x023A,
+ unicodeslot=0x2C65,
+ },
+ [0x2C66]={
+ category="ll",
+ description="LATIN SMALL LETTER T WITH DIAGONAL STROKE",
+ direction="l",
+ linebreak="al",
+ shcode=0x0074,
+ uccode=0x023E,
+ unicodeslot=0x2C66,
+ },
+ [0x2C67]={
+ category="lu",
+ description="LATIN CAPITAL LETTER H WITH DESCENDER",
+ direction="l",
+ lccode=0x2C68,
+ linebreak="al",
+ shcode=0x0048,
+ unicodeslot=0x2C67,
+ },
+ [0x2C68]={
+ category="ll",
+ description="LATIN SMALL LETTER H WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x0068,
+ uccode=0x2C67,
+ unicodeslot=0x2C68,
+ },
+ [0x2C69]={
+ category="lu",
+ description="LATIN CAPITAL LETTER K WITH DESCENDER",
+ direction="l",
+ lccode=0x2C6A,
+ linebreak="al",
+ shcode=0x004B,
+ unicodeslot=0x2C69,
+ },
+ [0x2C6A]={
+ category="ll",
+ description="LATIN SMALL LETTER K WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x006B,
+ uccode=0x2C69,
+ unicodeslot=0x2C6A,
+ },
+ [0x2C6B]={
+ category="lu",
+ description="LATIN CAPITAL LETTER Z WITH DESCENDER",
+ direction="l",
+ lccode=0x2C6C,
+ linebreak="al",
+ shcode=0x005A,
+ unicodeslot=0x2C6B,
+ },
+ [0x2C6C]={
+ category="ll",
+ description="LATIN SMALL LETTER Z WITH DESCENDER",
+ direction="l",
+ linebreak="al",
+ shcode=0x007A,
+ uccode=0x2C6B,
+ unicodeslot=0x2C6C,
+ },
+ [0x2C74]={
+ category="ll",
+ description="LATIN SMALL LETTER V WITH CURL",
+ direction="l",
+ linebreak="al",
+ shcode=0x0076,
+ unicodeslot=0x2C74,
+ },
+ [0x2C75]={
+ category="lu",
+ description="LATIN CAPITAL LETTER HALF H",
+ direction="l",
+ lccode=0x2C76,
+ linebreak="al",
+ unicodeslot=0x2C75,
+ },
+ [0x2C76]={
+ category="ll",
+ description="LATIN SMALL LETTER HALF H",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C75,
+ unicodeslot=0x2C76,
+ },
+ [0x2C77]={
+ category="ll",
+ description="LATIN SMALL LETTER TAILLESS PHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2C77,
+ },
+ [0x2C80]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER ALFA",
+ direction="l",
+ lccode=0x2C81,
+ linebreak="al",
+ unicodeslot=0x2C80,
+ },
+ [0x2C81]={
+ category="ll",
+ description="COPTIC SMALL LETTER ALFA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C80,
+ unicodeslot=0x2C81,
+ },
+ [0x2C82]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER VIDA",
+ direction="l",
+ lccode=0x2C83,
+ linebreak="al",
+ unicodeslot=0x2C82,
+ },
+ [0x2C83]={
+ category="ll",
+ description="COPTIC SMALL LETTER VIDA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C82,
+ unicodeslot=0x2C83,
+ },
+ [0x2C84]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER GAMMA",
+ direction="l",
+ lccode=0x2C85,
+ linebreak="al",
+ unicodeslot=0x2C84,
+ },
+ [0x2C85]={
+ category="ll",
+ description="COPTIC SMALL LETTER GAMMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C84,
+ unicodeslot=0x2C85,
+ },
+ [0x2C86]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER DALDA",
+ direction="l",
+ lccode=0x2C87,
+ linebreak="al",
+ unicodeslot=0x2C86,
+ },
+ [0x2C87]={
+ category="ll",
+ description="COPTIC SMALL LETTER DALDA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C86,
+ unicodeslot=0x2C87,
+ },
+ [0x2C88]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER EIE",
+ direction="l",
+ lccode=0x2C89,
+ linebreak="al",
+ unicodeslot=0x2C88,
+ },
+ [0x2C89]={
+ category="ll",
+ description="COPTIC SMALL LETTER EIE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C88,
+ unicodeslot=0x2C89,
+ },
+ [0x2C8A]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER SOU",
+ direction="l",
+ lccode=0x2C8B,
+ linebreak="al",
+ unicodeslot=0x2C8A,
+ },
+ [0x2C8B]={
+ category="ll",
+ description="COPTIC SMALL LETTER SOU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C8A,
+ unicodeslot=0x2C8B,
+ },
+ [0x2C8C]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER ZATA",
+ direction="l",
+ lccode=0x2C8D,
+ linebreak="al",
+ unicodeslot=0x2C8C,
+ },
+ [0x2C8D]={
+ category="ll",
+ description="COPTIC SMALL LETTER ZATA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C8C,
+ unicodeslot=0x2C8D,
+ },
+ [0x2C8E]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER HATE",
+ direction="l",
+ lccode=0x2C8F,
+ linebreak="al",
+ unicodeslot=0x2C8E,
+ },
+ [0x2C8F]={
+ category="ll",
+ description="COPTIC SMALL LETTER HATE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C8E,
+ unicodeslot=0x2C8F,
+ },
+ [0x2C90]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER THETHE",
+ direction="l",
+ lccode=0x2C91,
+ linebreak="al",
+ unicodeslot=0x2C90,
+ },
+ [0x2C91]={
+ category="ll",
+ description="COPTIC SMALL LETTER THETHE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C90,
+ unicodeslot=0x2C91,
+ },
+ [0x2C92]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER IAUDA",
+ direction="l",
+ lccode=0x2C93,
+ linebreak="al",
+ unicodeslot=0x2C92,
+ },
+ [0x2C93]={
+ category="ll",
+ description="COPTIC SMALL LETTER IAUDA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C92,
+ unicodeslot=0x2C93,
+ },
+ [0x2C94]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER KAPA",
+ direction="l",
+ lccode=0x2C95,
+ linebreak="al",
+ unicodeslot=0x2C94,
+ },
+ [0x2C95]={
+ category="ll",
+ description="COPTIC SMALL LETTER KAPA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C94,
+ unicodeslot=0x2C95,
+ },
+ [0x2C96]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER LAULA",
+ direction="l",
+ lccode=0x2C97,
+ linebreak="al",
+ unicodeslot=0x2C96,
+ },
+ [0x2C97]={
+ category="ll",
+ description="COPTIC SMALL LETTER LAULA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C96,
+ unicodeslot=0x2C97,
+ },
+ [0x2C98]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER MI",
+ direction="l",
+ lccode=0x2C99,
+ linebreak="al",
+ unicodeslot=0x2C98,
+ },
+ [0x2C99]={
+ category="ll",
+ description="COPTIC SMALL LETTER MI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C98,
+ unicodeslot=0x2C99,
+ },
+ [0x2C9A]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER NI",
+ direction="l",
+ lccode=0x2C9B,
+ linebreak="al",
+ unicodeslot=0x2C9A,
+ },
+ [0x2C9B]={
+ category="ll",
+ description="COPTIC SMALL LETTER NI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C9A,
+ unicodeslot=0x2C9B,
+ },
+ [0x2C9C]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER KSI",
+ direction="l",
+ lccode=0x2C9D,
+ linebreak="al",
+ unicodeslot=0x2C9C,
+ },
+ [0x2C9D]={
+ category="ll",
+ description="COPTIC SMALL LETTER KSI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C9C,
+ unicodeslot=0x2C9D,
+ },
+ [0x2C9E]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER O",
+ direction="l",
+ lccode=0x2C9F,
+ linebreak="al",
+ unicodeslot=0x2C9E,
+ },
+ [0x2C9F]={
+ category="ll",
+ description="COPTIC SMALL LETTER O",
+ direction="l",
+ linebreak="al",
+ uccode=0x2C9E,
+ unicodeslot=0x2C9F,
+ },
+ [0x2CA0]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER PI",
+ direction="l",
+ lccode=0x2CA1,
+ linebreak="al",
+ unicodeslot=0x2CA0,
+ },
+ [0x2CA1]={
+ category="ll",
+ description="COPTIC SMALL LETTER PI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CA0,
+ unicodeslot=0x2CA1,
+ },
+ [0x2CA2]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER RO",
+ direction="l",
+ lccode=0x2CA3,
+ linebreak="al",
+ unicodeslot=0x2CA2,
+ },
+ [0x2CA3]={
+ category="ll",
+ description="COPTIC SMALL LETTER RO",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CA2,
+ unicodeslot=0x2CA3,
+ },
+ [0x2CA4]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER SIMA",
+ direction="l",
+ lccode=0x2CA5,
+ linebreak="al",
+ unicodeslot=0x2CA4,
+ },
+ [0x2CA5]={
+ category="ll",
+ description="COPTIC SMALL LETTER SIMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CA4,
+ unicodeslot=0x2CA5,
+ },
+ [0x2CA6]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER TAU",
+ direction="l",
+ lccode=0x2CA7,
+ linebreak="al",
+ unicodeslot=0x2CA6,
+ },
+ [0x2CA7]={
+ category="ll",
+ description="COPTIC SMALL LETTER TAU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CA6,
+ unicodeslot=0x2CA7,
+ },
+ [0x2CA8]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER UA",
+ direction="l",
+ lccode=0x2CA9,
+ linebreak="al",
+ unicodeslot=0x2CA8,
+ },
+ [0x2CA9]={
+ category="ll",
+ description="COPTIC SMALL LETTER UA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CA8,
+ unicodeslot=0x2CA9,
+ },
+ [0x2CAA]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER FI",
+ direction="l",
+ lccode=0x2CAB,
+ linebreak="al",
+ unicodeslot=0x2CAA,
+ },
+ [0x2CAB]={
+ category="ll",
+ description="COPTIC SMALL LETTER FI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CAA,
+ unicodeslot=0x2CAB,
+ },
+ [0x2CAC]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER KHI",
+ direction="l",
+ lccode=0x2CAD,
+ linebreak="al",
+ unicodeslot=0x2CAC,
+ },
+ [0x2CAD]={
+ category="ll",
+ description="COPTIC SMALL LETTER KHI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CAC,
+ unicodeslot=0x2CAD,
+ },
+ [0x2CAE]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER PSI",
+ direction="l",
+ lccode=0x2CAF,
+ linebreak="al",
+ unicodeslot=0x2CAE,
+ },
+ [0x2CAF]={
+ category="ll",
+ description="COPTIC SMALL LETTER PSI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CAE,
+ unicodeslot=0x2CAF,
+ },
+ [0x2CB0]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OOU",
+ direction="l",
+ lccode=0x2CB1,
+ linebreak="al",
+ unicodeslot=0x2CB0,
+ },
+ [0x2CB1]={
+ category="ll",
+ description="COPTIC SMALL LETTER OOU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CB0,
+ unicodeslot=0x2CB1,
+ },
+ [0x2CB2]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER DIALECT-P ALEF",
+ direction="l",
+ lccode=0x2CB3,
+ linebreak="al",
+ unicodeslot=0x2CB2,
+ },
+ [0x2CB3]={
+ category="ll",
+ description="COPTIC SMALL LETTER DIALECT-P ALEF",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CB2,
+ unicodeslot=0x2CB3,
+ },
+ [0x2CB4]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC AIN",
+ direction="l",
+ lccode=0x2CB5,
+ linebreak="al",
+ unicodeslot=0x2CB4,
+ },
+ [0x2CB5]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC AIN",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CB4,
+ unicodeslot=0x2CB5,
+ },
+ [0x2CB6]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE",
+ direction="l",
+ lccode=0x2CB7,
+ linebreak="al",
+ unicodeslot=0x2CB6,
+ },
+ [0x2CB7]={
+ category="ll",
+ description="COPTIC SMALL LETTER CRYPTOGRAMMIC EIE",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CB6,
+ unicodeslot=0x2CB7,
+ },
+ [0x2CB8]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER DIALECT-P KAPA",
+ direction="l",
+ lccode=0x2CB9,
+ linebreak="al",
+ unicodeslot=0x2CB8,
+ },
+ [0x2CB9]={
+ category="ll",
+ description="COPTIC SMALL LETTER DIALECT-P KAPA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CB8,
+ unicodeslot=0x2CB9,
+ },
+ [0x2CBA]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER DIALECT-P NI",
+ direction="l",
+ lccode=0x2CBB,
+ linebreak="al",
+ unicodeslot=0x2CBA,
+ },
+ [0x2CBB]={
+ category="ll",
+ description="COPTIC SMALL LETTER DIALECT-P NI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CBA,
+ unicodeslot=0x2CBB,
+ },
+ [0x2CBC]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI",
+ direction="l",
+ lccode=0x2CBD,
+ linebreak="al",
+ unicodeslot=0x2CBC,
+ },
+ [0x2CBD]={
+ category="ll",
+ description="COPTIC SMALL LETTER CRYPTOGRAMMIC NI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CBC,
+ unicodeslot=0x2CBD,
+ },
+ [0x2CBE]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC OOU",
+ direction="l",
+ lccode=0x2CBF,
+ linebreak="al",
+ unicodeslot=0x2CBE,
+ },
+ [0x2CBF]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC OOU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CBE,
+ unicodeslot=0x2CBF,
+ },
+ [0x2CC0]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER SAMPI",
+ direction="l",
+ lccode=0x2CC1,
+ linebreak="al",
+ unicodeslot=0x2CC0,
+ },
+ [0x2CC1]={
+ category="ll",
+ description="COPTIC SMALL LETTER SAMPI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CC0,
+ unicodeslot=0x2CC1,
+ },
+ [0x2CC2]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER CROSSED SHEI",
+ direction="l",
+ lccode=0x2CC3,
+ linebreak="al",
+ unicodeslot=0x2CC2,
+ },
+ [0x2CC3]={
+ category="ll",
+ description="COPTIC SMALL LETTER CROSSED SHEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CC2,
+ unicodeslot=0x2CC3,
+ },
+ [0x2CC4]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC SHEI",
+ direction="l",
+ lccode=0x2CC5,
+ linebreak="al",
+ unicodeslot=0x2CC4,
+ },
+ [0x2CC5]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC SHEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CC4,
+ unicodeslot=0x2CC5,
+ },
+ [0x2CC6]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC ESH",
+ direction="l",
+ lccode=0x2CC7,
+ linebreak="al",
+ unicodeslot=0x2CC6,
+ },
+ [0x2CC7]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC ESH",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CC6,
+ unicodeslot=0x2CC7,
+ },
+ [0x2CC8]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER AKHMIMIC KHEI",
+ direction="l",
+ lccode=0x2CC9,
+ linebreak="al",
+ unicodeslot=0x2CC8,
+ },
+ [0x2CC9]={
+ category="ll",
+ description="COPTIC SMALL LETTER AKHMIMIC KHEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CC8,
+ unicodeslot=0x2CC9,
+ },
+ [0x2CCA]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER DIALECT-P HORI",
+ direction="l",
+ lccode=0x2CCB,
+ linebreak="al",
+ unicodeslot=0x2CCA,
+ },
+ [0x2CCB]={
+ category="ll",
+ description="COPTIC SMALL LETTER DIALECT-P HORI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CCA,
+ unicodeslot=0x2CCB,
+ },
+ [0x2CCC]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC HORI",
+ direction="l",
+ lccode=0x2CCD,
+ linebreak="al",
+ unicodeslot=0x2CCC,
+ },
+ [0x2CCD]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC HORI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CCC,
+ unicodeslot=0x2CCD,
+ },
+ [0x2CCE]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC HA",
+ direction="l",
+ lccode=0x2CCF,
+ linebreak="al",
+ unicodeslot=0x2CCE,
+ },
+ [0x2CCF]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC HA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CCE,
+ unicodeslot=0x2CCF,
+ },
+ [0x2CD0]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER L-SHAPED HA",
+ direction="l",
+ lccode=0x2CD1,
+ linebreak="al",
+ unicodeslot=0x2CD0,
+ },
+ [0x2CD1]={
+ category="ll",
+ description="COPTIC SMALL LETTER L-SHAPED HA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CD0,
+ unicodeslot=0x2CD1,
+ },
+ [0x2CD2]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC HEI",
+ direction="l",
+ lccode=0x2CD3,
+ linebreak="al",
+ unicodeslot=0x2CD2,
+ },
+ [0x2CD3]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC HEI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CD2,
+ unicodeslot=0x2CD3,
+ },
+ [0x2CD4]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC HAT",
+ direction="l",
+ lccode=0x2CD5,
+ linebreak="al",
+ unicodeslot=0x2CD4,
+ },
+ [0x2CD5]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC HAT",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CD4,
+ unicodeslot=0x2CD5,
+ },
+ [0x2CD6]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC GANGIA",
+ direction="l",
+ lccode=0x2CD7,
+ linebreak="al",
+ unicodeslot=0x2CD6,
+ },
+ [0x2CD7]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC GANGIA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CD6,
+ unicodeslot=0x2CD7,
+ },
+ [0x2CD8]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC DJA",
+ direction="l",
+ lccode=0x2CD9,
+ linebreak="al",
+ unicodeslot=0x2CD8,
+ },
+ [0x2CD9]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC DJA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CD8,
+ unicodeslot=0x2CD9,
+ },
+ [0x2CDA]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD COPTIC SHIMA",
+ direction="l",
+ lccode=0x2CDB,
+ linebreak="al",
+ unicodeslot=0x2CDA,
+ },
+ [0x2CDB]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD COPTIC SHIMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CDA,
+ unicodeslot=0x2CDB,
+ },
+ [0x2CDC]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD NUBIAN SHIMA",
+ direction="l",
+ lccode=0x2CDD,
+ linebreak="al",
+ unicodeslot=0x2CDC,
+ },
+ [0x2CDD]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD NUBIAN SHIMA",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CDC,
+ unicodeslot=0x2CDD,
+ },
+ [0x2CDE]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD NUBIAN NGI",
+ direction="l",
+ lccode=0x2CDF,
+ linebreak="al",
+ unicodeslot=0x2CDE,
+ },
+ [0x2CDF]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD NUBIAN NGI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CDE,
+ unicodeslot=0x2CDF,
+ },
+ [0x2CE0]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD NUBIAN NYI",
+ direction="l",
+ lccode=0x2CE1,
+ linebreak="al",
+ unicodeslot=0x2CE0,
+ },
+ [0x2CE1]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD NUBIAN NYI",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CE0,
+ unicodeslot=0x2CE1,
+ },
+ [0x2CE2]={
+ category="lu",
+ description="COPTIC CAPITAL LETTER OLD NUBIAN WAU",
+ direction="l",
+ lccode=0x2CE3,
+ linebreak="al",
+ unicodeslot=0x2CE2,
+ },
+ [0x2CE3]={
+ category="ll",
+ description="COPTIC SMALL LETTER OLD NUBIAN WAU",
+ direction="l",
+ linebreak="al",
+ uccode=0x2CE2,
+ unicodeslot=0x2CE3,
+ },
+ [0x2CE4]={
+ category="ll",
+ description="COPTIC SYMBOL KAI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2CE4,
+ },
+ [0x2CE5]={
+ category="so",
+ description="COPTIC SYMBOL MI RO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2CE5,
+ },
+ [0x2CE6]={
+ category="so",
+ description="COPTIC SYMBOL PI RO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2CE6,
+ },
+ [0x2CE7]={
+ category="so",
+ description="COPTIC SYMBOL STAUROS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2CE7,
+ },
+ [0x2CE8]={
+ category="so",
+ description="COPTIC SYMBOL TAU RO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2CE8,
+ },
+ [0x2CE9]={
+ category="so",
+ description="COPTIC SYMBOL KHI RO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2CE9,
+ },
+ [0x2CEA]={
+ category="so",
+ description="COPTIC SYMBOL SHIMA SIMA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2CEA,
+ },
+ [0x2CF9]={
+ category="po",
+ description="COPTIC OLD NUBIAN FULL STOP",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2CF9,
+ },
+ [0x2CFA]={
+ category="po",
+ description="COPTIC OLD NUBIAN DIRECT QUESTION MARK",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2CFA,
+ },
+ [0x2CFB]={
+ category="po",
+ description="COPTIC OLD NUBIAN INDIRECT QUESTION MARK",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2CFB,
+ },
+ [0x2CFC]={
+ category="po",
+ description="COPTIC OLD NUBIAN VERSE DIVIDER",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2CFC,
+ },
+ [0x2CFD]={
+ category="no",
+ description="COPTIC FRACTION ONE HALF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2CFD,
+ },
+ [0x2CFE]={
+ category="po",
+ description="COPTIC FULL STOP",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2CFE,
+ },
+ [0x2CFF]={
+ category="po",
+ description="COPTIC MORPHOLOGICAL DIVIDER",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2CFF,
+ },
+ [0x2D00]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER AN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A0,
+ unicodeslot=0x2D00,
+ },
+ [0x2D01]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER BAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A1,
+ unicodeslot=0x2D01,
+ },
+ [0x2D02]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER GAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A2,
+ unicodeslot=0x2D02,
+ },
+ [0x2D03]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER DON",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A3,
+ unicodeslot=0x2D03,
+ },
+ [0x2D04]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER EN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A4,
+ unicodeslot=0x2D04,
+ },
+ [0x2D05]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER VIN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A5,
+ unicodeslot=0x2D05,
+ },
+ [0x2D06]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER ZEN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A6,
+ unicodeslot=0x2D06,
+ },
+ [0x2D07]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER TAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A7,
+ unicodeslot=0x2D07,
+ },
+ [0x2D08]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER IN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A8,
+ unicodeslot=0x2D08,
+ },
+ [0x2D09]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER KAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10A9,
+ unicodeslot=0x2D09,
+ },
+ [0x2D0A]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER LAS",
+ direction="l",
+ linebreak="al",
+ uccode=0x10AA,
+ unicodeslot=0x2D0A,
+ },
+ [0x2D0B]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER MAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10AB,
+ unicodeslot=0x2D0B,
+ },
+ [0x2D0C]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER NAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10AC,
+ unicodeslot=0x2D0C,
+ },
+ [0x2D0D]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER ON",
+ direction="l",
+ linebreak="al",
+ uccode=0x10AD,
+ unicodeslot=0x2D0D,
+ },
+ [0x2D0E]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER PAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10AE,
+ unicodeslot=0x2D0E,
+ },
+ [0x2D0F]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER ZHAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10AF,
+ unicodeslot=0x2D0F,
+ },
+ [0x2D10]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER RAE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B0,
+ unicodeslot=0x2D10,
+ },
+ [0x2D11]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER SAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B1,
+ unicodeslot=0x2D11,
+ },
+ [0x2D12]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER TAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B2,
+ unicodeslot=0x2D12,
+ },
+ [0x2D13]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER UN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B3,
+ unicodeslot=0x2D13,
+ },
+ [0x2D14]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER PHAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B4,
+ unicodeslot=0x2D14,
+ },
+ [0x2D15]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER KHAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B5,
+ unicodeslot=0x2D15,
+ },
+ [0x2D16]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER GHAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B6,
+ unicodeslot=0x2D16,
+ },
+ [0x2D17]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER QAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B7,
+ unicodeslot=0x2D17,
+ },
+ [0x2D18]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER SHIN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B8,
+ unicodeslot=0x2D18,
+ },
+ [0x2D19]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER CHIN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10B9,
+ unicodeslot=0x2D19,
+ },
+ [0x2D1A]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER CAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10BA,
+ unicodeslot=0x2D1A,
+ },
+ [0x2D1B]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER JIL",
+ direction="l",
+ linebreak="al",
+ uccode=0x10BB,
+ unicodeslot=0x2D1B,
+ },
+ [0x2D1C]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER CIL",
+ direction="l",
+ linebreak="al",
+ uccode=0x10BC,
+ unicodeslot=0x2D1C,
+ },
+ [0x2D1D]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER CHAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10BD,
+ unicodeslot=0x2D1D,
+ },
+ [0x2D1E]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER XAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10BE,
+ unicodeslot=0x2D1E,
+ },
+ [0x2D1F]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER JHAN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10BF,
+ unicodeslot=0x2D1F,
+ },
+ [0x2D20]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER HAE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10C0,
+ unicodeslot=0x2D20,
+ },
+ [0x2D21]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER HE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10C1,
+ unicodeslot=0x2D21,
+ },
+ [0x2D22]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER HIE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10C2,
+ unicodeslot=0x2D22,
+ },
+ [0x2D23]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER WE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10C3,
+ unicodeslot=0x2D23,
+ },
+ [0x2D24]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER HAR",
+ direction="l",
+ linebreak="al",
+ uccode=0x10C4,
+ unicodeslot=0x2D24,
+ },
+ [0x2D25]={
+ category="ll",
+ description="GEORGIAN SMALL LETTER HOE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10C5,
+ unicodeslot=0x2D25,
+ },
+ [0x2D30]={
+ category="lo",
+ description="TIFINAGH LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D30,
+ },
+ [0x2D31]={
+ category="lo",
+ description="TIFINAGH LETTER YAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D31,
+ },
+ [0x2D32]={
+ category="lo",
+ description="TIFINAGH LETTER YABH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D32,
+ },
+ [0x2D33]={
+ category="lo",
+ description="TIFINAGH LETTER YAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D33,
+ },
+ [0x2D34]={
+ category="lo",
+ description="TIFINAGH LETTER YAGHH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D34,
+ },
+ [0x2D35]={
+ category="lo",
+ description="TIFINAGH LETTER BERBER ACADEMY YAJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D35,
+ },
+ [0x2D36]={
+ category="lo",
+ description="TIFINAGH LETTER YAJ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D36,
+ },
+ [0x2D37]={
+ category="lo",
+ description="TIFINAGH LETTER YAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D37,
+ },
+ [0x2D38]={
+ category="lo",
+ description="TIFINAGH LETTER YADH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D38,
+ },
+ [0x2D39]={
+ category="lo",
+ description="TIFINAGH LETTER YADD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D39,
+ },
+ [0x2D3A]={
+ category="lo",
+ description="TIFINAGH LETTER YADDH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D3A,
+ },
+ [0x2D3B]={
+ category="lo",
+ description="TIFINAGH LETTER YEY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D3B,
+ },
+ [0x2D3C]={
+ category="lo",
+ description="TIFINAGH LETTER YAF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D3C,
+ },
+ [0x2D3D]={
+ category="lo",
+ description="TIFINAGH LETTER YAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D3D,
+ },
+ [0x2D3E]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D3E,
+ },
+ [0x2D3F]={
+ category="lo",
+ description="TIFINAGH LETTER YAKHH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D3F,
+ },
+ [0x2D40]={
+ category="lo",
+ description="TIFINAGH LETTER YAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D40,
+ },
+ [0x2D41]={
+ category="lo",
+ description="TIFINAGH LETTER BERBER ACADEMY YAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D41,
+ },
+ [0x2D42]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D42,
+ },
+ [0x2D43]={
+ category="lo",
+ description="TIFINAGH LETTER YAHH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D43,
+ },
+ [0x2D44]={
+ category="lo",
+ description="TIFINAGH LETTER YAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D44,
+ },
+ [0x2D45]={
+ category="lo",
+ description="TIFINAGH LETTER YAKH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D45,
+ },
+ [0x2D46]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YAKH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D46,
+ },
+ [0x2D47]={
+ category="lo",
+ description="TIFINAGH LETTER YAQ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D47,
+ },
+ [0x2D48]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YAQ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D48,
+ },
+ [0x2D49]={
+ category="lo",
+ description="TIFINAGH LETTER YI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D49,
+ },
+ [0x2D4A]={
+ category="lo",
+ description="TIFINAGH LETTER YAZH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D4A,
+ },
+ [0x2D4B]={
+ category="lo",
+ description="TIFINAGH LETTER AHAGGAR YAZH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D4B,
+ },
+ [0x2D4C]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YAZH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D4C,
+ },
+ [0x2D4D]={
+ category="lo",
+ description="TIFINAGH LETTER YAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D4D,
+ },
+ [0x2D4E]={
+ category="lo",
+ description="TIFINAGH LETTER YAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D4E,
+ },
+ [0x2D4F]={
+ category="lo",
+ description="TIFINAGH LETTER YAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D4F,
+ },
+ [0x2D50]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YAGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D50,
+ },
+ [0x2D51]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YANG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D51,
+ },
+ [0x2D52]={
+ category="lo",
+ description="TIFINAGH LETTER YAP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D52,
+ },
+ [0x2D53]={
+ category="lo",
+ description="TIFINAGH LETTER YU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D53,
+ },
+ [0x2D54]={
+ category="lo",
+ description="TIFINAGH LETTER YAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D54,
+ },
+ [0x2D55]={
+ category="lo",
+ description="TIFINAGH LETTER YARR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D55,
+ },
+ [0x2D56]={
+ category="lo",
+ description="TIFINAGH LETTER YAGH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D56,
+ },
+ [0x2D57]={
+ category="lo",
+ description="TIFINAGH LETTER TUAREG YAGH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D57,
+ },
+ [0x2D58]={
+ category="lo",
+ description="TIFINAGH LETTER AYER YAGH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D58,
+ },
+ [0x2D59]={
+ category="lo",
+ description="TIFINAGH LETTER YAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D59,
+ },
+ [0x2D5A]={
+ category="lo",
+ description="TIFINAGH LETTER YASS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D5A,
+ },
+ [0x2D5B]={
+ category="lo",
+ description="TIFINAGH LETTER YASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D5B,
+ },
+ [0x2D5C]={
+ category="lo",
+ description="TIFINAGH LETTER YAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D5C,
+ },
+ [0x2D5D]={
+ category="lo",
+ description="TIFINAGH LETTER YATH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D5D,
+ },
+ [0x2D5E]={
+ category="lo",
+ description="TIFINAGH LETTER YACH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D5E,
+ },
+ [0x2D5F]={
+ category="lo",
+ description="TIFINAGH LETTER YATT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D5F,
+ },
+ [0x2D60]={
+ category="lo",
+ description="TIFINAGH LETTER YAV",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D60,
+ },
+ [0x2D61]={
+ category="lo",
+ description="TIFINAGH LETTER YAW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D61,
+ },
+ [0x2D62]={
+ category="lo",
+ description="TIFINAGH LETTER YAY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D62,
+ },
+ [0x2D63]={
+ category="lo",
+ description="TIFINAGH LETTER YAZ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D63,
+ },
+ [0x2D64]={
+ category="lo",
+ description="TIFINAGH LETTER TAWELLEMET YAZ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D64,
+ },
+ [0x2D65]={
+ category="lo",
+ description="TIFINAGH LETTER YAZZ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D65,
+ },
+ [0x2D6F]={
+ category="lm",
+ description="TIFINAGH MODIFIER LETTER LABIALIZATION MARK",
+ direction="l",
+ linebreak="al",
+ specials={ "super", 0x2D61 },
+ unicodeslot=0x2D6F,
+ },
+ [0x2D80]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE LOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D80,
+ },
+ [0x2D81]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE MOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D81,
+ },
+ [0x2D82]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ROA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D82,
+ },
+ [0x2D83]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D83,
+ },
+ [0x2D84]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SHOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D84,
+ },
+ [0x2D85]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE BOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D85,
+ },
+ [0x2D86]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE TOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D86,
+ },
+ [0x2D87]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE COA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D87,
+ },
+ [0x2D88]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D88,
+ },
+ [0x2D89]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE NYOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D89,
+ },
+ [0x2D8A]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GLOTTAL OA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D8A,
+ },
+ [0x2D8B]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D8B,
+ },
+ [0x2D8C]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D8C,
+ },
+ [0x2D8D]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE DDOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D8D,
+ },
+ [0x2D8E]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE JOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D8E,
+ },
+ [0x2D8F]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE THOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D8F,
+ },
+ [0x2D90]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CHOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D90,
+ },
+ [0x2D91]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE PHOA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D91,
+ },
+ [0x2D92]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE POA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D92,
+ },
+ [0x2D93]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D93,
+ },
+ [0x2D94]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGWI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D94,
+ },
+ [0x2D95]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGWEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D95,
+ },
+ [0x2D96]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GGWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2D96,
+ },
+ [0x2DA0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA0,
+ },
+ [0x2DA1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SSU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA1,
+ },
+ [0x2DA2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SSI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA2,
+ },
+ [0x2DA3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SSAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA3,
+ },
+ [0x2DA4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SSEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA4,
+ },
+ [0x2DA5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SSE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA5,
+ },
+ [0x2DA6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE SSO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA6,
+ },
+ [0x2DA8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA8,
+ },
+ [0x2DA9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DA9,
+ },
+ [0x2DAA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DAA,
+ },
+ [0x2DAB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DAB,
+ },
+ [0x2DAC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DAC,
+ },
+ [0x2DAD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DAD,
+ },
+ [0x2DAE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DAE,
+ },
+ [0x2DB0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB0,
+ },
+ [0x2DB1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB1,
+ },
+ [0x2DB2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB2,
+ },
+ [0x2DB3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZZAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB3,
+ },
+ [0x2DB4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZZEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB4,
+ },
+ [0x2DB5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB5,
+ },
+ [0x2DB6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE ZZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB6,
+ },
+ [0x2DB8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB8,
+ },
+ [0x2DB9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DB9,
+ },
+ [0x2DBA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DBA,
+ },
+ [0x2DBB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCHAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DBB,
+ },
+ [0x2DBC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCHEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DBC,
+ },
+ [0x2DBD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DBD,
+ },
+ [0x2DBE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE CCHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DBE,
+ },
+ [0x2DC0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC0,
+ },
+ [0x2DC1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QYU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC1,
+ },
+ [0x2DC2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC2,
+ },
+ [0x2DC3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QYAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC3,
+ },
+ [0x2DC4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QYEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC4,
+ },
+ [0x2DC5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QYE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC5,
+ },
+ [0x2DC6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE QYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC6,
+ },
+ [0x2DC8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC8,
+ },
+ [0x2DC9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KYU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DC9,
+ },
+ [0x2DCA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DCA,
+ },
+ [0x2DCB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KYAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DCB,
+ },
+ [0x2DCC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KYEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DCC,
+ },
+ [0x2DCD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KYE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DCD,
+ },
+ [0x2DCE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE KYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DCE,
+ },
+ [0x2DD0]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD0,
+ },
+ [0x2DD1]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XYU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD1,
+ },
+ [0x2DD2]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD2,
+ },
+ [0x2DD3]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XYAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD3,
+ },
+ [0x2DD4]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XYEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD4,
+ },
+ [0x2DD5]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XYE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD5,
+ },
+ [0x2DD6]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE XYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD6,
+ },
+ [0x2DD8]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD8,
+ },
+ [0x2DD9]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GYU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DD9,
+ },
+ [0x2DDA]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GYI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DDA,
+ },
+ [0x2DDB]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GYAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DDB,
+ },
+ [0x2DDC]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GYEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DDC,
+ },
+ [0x2DDD]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GYE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DDD,
+ },
+ [0x2DDE]={
+ category="lo",
+ description="ETHIOPIC SYLLABLE GYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x2DDE,
+ },
+ [0x2E00]={
+ category="po",
+ description="RIGHT ANGLE SUBSTITUTION MARKER",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2E00,
+ },
+ [0x2E01]={
+ category="po",
+ description="RIGHT ANGLE DOTTED SUBSTITUTION MARKER",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2E01,
+ },
+ [0x2E02]={
+ category="pi",
+ description="LEFT SUBSTITUTION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E03,
+ unicodeslot=0x2E02,
+ },
+ [0x2E03]={
+ category="pf",
+ description="RIGHT SUBSTITUTION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E02,
+ unicodeslot=0x2E03,
+ },
+ [0x2E04]={
+ category="pi",
+ description="LEFT DOTTED SUBSTITUTION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E05,
+ unicodeslot=0x2E04,
+ },
+ [0x2E05]={
+ category="pf",
+ description="RIGHT DOTTED SUBSTITUTION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E04,
+ unicodeslot=0x2E05,
+ },
+ [0x2E06]={
+ category="po",
+ description="RAISED INTERPOLATION MARKER",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2E06,
+ },
+ [0x2E07]={
+ category="po",
+ description="RAISED DOTTED INTERPOLATION MARKER",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2E07,
+ },
+ [0x2E08]={
+ category="po",
+ description="DOTTED TRANSPOSITION MARKER",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2E08,
+ },
+ [0x2E09]={
+ category="pi",
+ description="LEFT TRANSPOSITION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E0A,
+ unicodeslot=0x2E09,
+ },
+ [0x2E0A]={
+ category="pf",
+ description="RIGHT TRANSPOSITION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E09,
+ unicodeslot=0x2E0A,
+ },
+ [0x2E0B]={
+ category="po",
+ description="RAISED SQUARE",
+ direction="on",
+ linebreak="qu",
+ unicodeslot=0x2E0B,
+ },
+ [0x2E0C]={
+ category="pi",
+ description="LEFT RAISED OMISSION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E0D,
+ unicodeslot=0x2E0C,
+ },
+ [0x2E0D]={
+ category="pf",
+ description="RIGHT RAISED OMISSION BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E0C,
+ unicodeslot=0x2E0D,
+ },
+ [0x2E0E]={
+ category="po",
+ description="EDITORIAL CORONIS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E0E,
+ },
+ [0x2E0F]={
+ category="po",
+ description="PARAGRAPHOS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E0F,
+ },
+ [0x2E10]={
+ category="po",
+ description="FORKED PARAGRAPHOS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E10,
+ },
+ [0x2E11]={
+ category="po",
+ description="REVERSED FORKED PARAGRAPHOS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E11,
+ },
+ [0x2E12]={
+ category="po",
+ description="HYPODIASTOLE",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E12,
+ },
+ [0x2E13]={
+ category="po",
+ description="DOTTED OBELOS",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E13,
+ },
+ [0x2E14]={
+ category="po",
+ description="DOWNWARDS ANCORA",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E14,
+ },
+ [0x2E15]={
+ category="po",
+ description="UPWARDS ANCORA",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E15,
+ },
+ [0x2E16]={
+ category="po",
+ description="DOTTED RIGHT-POINTING ANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x2E16,
+ },
+ [0x2E17]={
+ category="pd",
+ description="DOUBLE OBLIQUE HYPHEN",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x2E17,
+ },
+ [0x2E1C]={
+ category="pi",
+ description="LEFT LOW PARAPHRASE BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E1D,
+ unicodeslot=0x2E1C,
+ },
+ [0x2E1D]={
+ category="pf",
+ description="RIGHT LOW PARAPHRASE BRACKET",
+ direction="on",
+ linebreak="qu",
+ mirror=0x2E1C,
+ unicodeslot=0x2E1D,
+ },
+ [0x2E80]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL REPEAT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E80,
+ },
+ [0x2E81]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL CLIFF",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E81,
+ },
+ [0x2E82]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SECOND ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E82,
+ },
+ [0x2E83]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SECOND TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E83,
+ },
+ [0x2E84]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SECOND THREE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E84,
+ },
+ [0x2E85]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL PERSON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E85,
+ },
+ [0x2E86]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL BOX",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E86,
+ },
+ [0x2E87]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL TABLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E87,
+ },
+ [0x2E88]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL KNIFE ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E88,
+ },
+ [0x2E89]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL KNIFE TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E89,
+ },
+ [0x2E8A]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL DIVINATION",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E8A,
+ },
+ [0x2E8B]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SEAL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E8B,
+ },
+ [0x2E8C]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SMALL ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E8C,
+ },
+ [0x2E8D]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SMALL TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E8D,
+ },
+ [0x2E8E]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL LAME ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E8E,
+ },
+ [0x2E8F]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL LAME TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E8F,
+ },
+ [0x2E90]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL LAME THREE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E90,
+ },
+ [0x2E91]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL LAME FOUR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E91,
+ },
+ [0x2E92]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SNAKE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E92,
+ },
+ [0x2E93]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL THREAD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E93,
+ },
+ [0x2E94]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SNOUT ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E94,
+ },
+ [0x2E95]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SNOUT TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E95,
+ },
+ [0x2E96]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL HEART ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E96,
+ },
+ [0x2E97]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL HEART TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E97,
+ },
+ [0x2E98]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL HAND",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E98,
+ },
+ [0x2E99]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL RAP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E99,
+ },
+ [0x2E9B]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL CHOKE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E9B,
+ },
+ [0x2E9C]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SUN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E9C,
+ },
+ [0x2E9D]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL MOON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E9D,
+ },
+ [0x2E9E]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL DEATH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2E9E,
+ },
+ [0x2E9F]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL MOTHER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6BCD },
+ unicodeslot=0x2E9F,
+ },
+ [0x2EA0]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL CIVILIAN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA0,
+ },
+ [0x2EA1]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL WATER ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA1,
+ },
+ [0x2EA2]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL WATER TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA2,
+ },
+ [0x2EA3]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL FIRE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA3,
+ },
+ [0x2EA4]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL PAW ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA4,
+ },
+ [0x2EA5]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL PAW TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA5,
+ },
+ [0x2EA6]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SIMPLIFIED HALF TREE TRUNK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA6,
+ },
+ [0x2EA7]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL COW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA7,
+ },
+ [0x2EA8]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL DOG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA8,
+ },
+ [0x2EA9]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL JADE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EA9,
+ },
+ [0x2EAA]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL BOLT OF CLOTH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EAA,
+ },
+ [0x2EAB]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL EYE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EAB,
+ },
+ [0x2EAC]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SPIRIT ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EAC,
+ },
+ [0x2EAD]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SPIRIT TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EAD,
+ },
+ [0x2EAE]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL BAMBOO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EAE,
+ },
+ [0x2EAF]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SILK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EAF,
+ },
+ [0x2EB0]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED SILK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB0,
+ },
+ [0x2EB1]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL NET ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB1,
+ },
+ [0x2EB2]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL NET TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB2,
+ },
+ [0x2EB3]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL NET THREE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB3,
+ },
+ [0x2EB4]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL NET FOUR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB4,
+ },
+ [0x2EB5]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL MESH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB5,
+ },
+ [0x2EB6]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SHEEP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB6,
+ },
+ [0x2EB7]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL RAM",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB7,
+ },
+ [0x2EB8]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL EWE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB8,
+ },
+ [0x2EB9]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL OLD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EB9,
+ },
+ [0x2EBA]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL BRUSH ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EBA,
+ },
+ [0x2EBB]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL BRUSH TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EBB,
+ },
+ [0x2EBC]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL MEAT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EBC,
+ },
+ [0x2EBD]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL MORTAR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EBD,
+ },
+ [0x2EBE]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL GRASS ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EBE,
+ },
+ [0x2EBF]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL GRASS TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EBF,
+ },
+ [0x2EC0]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL GRASS THREE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC0,
+ },
+ [0x2EC1]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL TIGER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC1,
+ },
+ [0x2EC2]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL CLOTHES",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC2,
+ },
+ [0x2EC3]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL WEST ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC3,
+ },
+ [0x2EC4]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL WEST TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC4,
+ },
+ [0x2EC5]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED SEE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC5,
+ },
+ [0x2EC6]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SIMPLIFIED HORN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC6,
+ },
+ [0x2EC7]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL HORN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC7,
+ },
+ [0x2EC8]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED SPEECH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC8,
+ },
+ [0x2EC9]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED SHELL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EC9,
+ },
+ [0x2ECA]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL FOOT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ECA,
+ },
+ [0x2ECB]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED CART",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ECB,
+ },
+ [0x2ECC]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SIMPLIFIED WALK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ECC,
+ },
+ [0x2ECD]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL WALK ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ECD,
+ },
+ [0x2ECE]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL WALK TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ECE,
+ },
+ [0x2ECF]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL CITY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ECF,
+ },
+ [0x2ED0]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED GOLD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED0,
+ },
+ [0x2ED1]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL LONG ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED1,
+ },
+ [0x2ED2]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL LONG TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED2,
+ },
+ [0x2ED3]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED LONG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED3,
+ },
+ [0x2ED4]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED GATE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED4,
+ },
+ [0x2ED5]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL MOUND ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED5,
+ },
+ [0x2ED6]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL MOUND TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED6,
+ },
+ [0x2ED7]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL RAIN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED7,
+ },
+ [0x2ED8]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL BLUE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED8,
+ },
+ [0x2ED9]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED TANNED LEATHER",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2ED9,
+ },
+ [0x2EDA]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED LEAF",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EDA,
+ },
+ [0x2EDB]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED WIND",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EDB,
+ },
+ [0x2EDC]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED FLY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EDC,
+ },
+ [0x2EDD]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL EAT ONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EDD,
+ },
+ [0x2EDE]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL EAT TWO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EDE,
+ },
+ [0x2EDF]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL EAT THREE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EDF,
+ },
+ [0x2EE0]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED EAT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE0,
+ },
+ [0x2EE1]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL HEAD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE1,
+ },
+ [0x2EE2]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED HORSE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE2,
+ },
+ [0x2EE3]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL BONE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE3,
+ },
+ [0x2EE4]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL GHOST",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE4,
+ },
+ [0x2EE5]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED FISH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE5,
+ },
+ [0x2EE6]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED BIRD",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE6,
+ },
+ [0x2EE7]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED SALT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE7,
+ },
+ [0x2EE8]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SIMPLIFIED WHEAT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE8,
+ },
+ [0x2EE9]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL SIMPLIFIED YELLOW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EE9,
+ },
+ [0x2EEA]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED FROG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EEA,
+ },
+ [0x2EEB]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL J-SIMPLIFIED EVEN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EEB,
+ },
+ [0x2EEC]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED EVEN",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EEC,
+ },
+ [0x2EED]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL J-SIMPLIFIED TOOTH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EED,
+ },
+ [0x2EEE]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED TOOTH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EEE,
+ },
+ [0x2EEF]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL J-SIMPLIFIED DRAGON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EEF,
+ },
+ [0x2EF0]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED DRAGON",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EF0,
+ },
+ [0x2EF1]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL TURTLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EF1,
+ },
+ [0x2EF2]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL J-SIMPLIFIED TURTLE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2EF2,
+ },
+ [0x2EF3]={
+ category="so",
+ cjkwd="w",
+ description="CJK RADICAL C-SIMPLIFIED TURTLE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F9F },
+ unicodeslot=0x2EF3,
+ },
+ [0x2F00]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ONE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4E00 },
+ unicodeslot=0x2F00,
+ },
+ [0x2F01]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4E28 },
+ unicodeslot=0x2F01,
+ },
+ [0x2F02]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DOT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4E36 },
+ unicodeslot=0x2F02,
+ },
+ [0x2F03]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SLASH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4E3F },
+ unicodeslot=0x2F03,
+ },
+ [0x2F04]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SECOND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4E59 },
+ unicodeslot=0x2F04,
+ },
+ [0x2F05]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HOOK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4E85 },
+ unicodeslot=0x2F05,
+ },
+ [0x2F06]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TWO",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4E8C },
+ unicodeslot=0x2F06,
+ },
+ [0x2F07]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LID",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4EA0 },
+ unicodeslot=0x2F07,
+ },
+ [0x2F08]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MAN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x4EBA },
+ unicodeslot=0x2F08,
+ },
+ [0x2F09]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LEGS",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x513F },
+ unicodeslot=0x2F09,
+ },
+ [0x2F0A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ENTER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5165 },
+ unicodeslot=0x2F0A,
+ },
+ [0x2F0B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EIGHT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x516B },
+ unicodeslot=0x2F0B,
+ },
+ [0x2F0C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DOWN BOX",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5182 },
+ unicodeslot=0x2F0C,
+ },
+ [0x2F0D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL COVER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5196 },
+ unicodeslot=0x2F0D,
+ },
+ [0x2F0E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ICE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x51AB },
+ unicodeslot=0x2F0E,
+ },
+ [0x2F0F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TABLE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x51E0 },
+ unicodeslot=0x2F0F,
+ },
+ [0x2F10]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL OPEN BOX",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x51F5 },
+ unicodeslot=0x2F10,
+ },
+ [0x2F11]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL KNIFE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5200 },
+ unicodeslot=0x2F11,
+ },
+ [0x2F12]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL POWER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x529B },
+ unicodeslot=0x2F12,
+ },
+ [0x2F13]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WRAP",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x52F9 },
+ unicodeslot=0x2F13,
+ },
+ [0x2F14]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SPOON",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5315 },
+ unicodeslot=0x2F14,
+ },
+ [0x2F15]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RIGHT OPEN BOX",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x531A },
+ unicodeslot=0x2F15,
+ },
+ [0x2F16]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HIDING ENCLOSURE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5338 },
+ unicodeslot=0x2F16,
+ },
+ [0x2F17]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TEN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5341 },
+ unicodeslot=0x2F17,
+ },
+ [0x2F18]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DIVINATION",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x535C },
+ unicodeslot=0x2F18,
+ },
+ [0x2F19]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SEAL",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5369 },
+ unicodeslot=0x2F19,
+ },
+ [0x2F1A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CLIFF",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5382 },
+ unicodeslot=0x2F1A,
+ },
+ [0x2F1B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL PRIVATE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x53B6 },
+ unicodeslot=0x2F1B,
+ },
+ [0x2F1C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL AGAIN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x53C8 },
+ unicodeslot=0x2F1C,
+ },
+ [0x2F1D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MOUTH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x53E3 },
+ unicodeslot=0x2F1D,
+ },
+ [0x2F1E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ENCLOSURE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x56D7 },
+ unicodeslot=0x2F1E,
+ },
+ [0x2F1F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EARTH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x571F },
+ unicodeslot=0x2F1F,
+ },
+ [0x2F20]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SCHOLAR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x58EB },
+ unicodeslot=0x2F20,
+ },
+ [0x2F21]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL GO",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5902 },
+ unicodeslot=0x2F21,
+ },
+ [0x2F22]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL GO SLOWLY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x590A },
+ unicodeslot=0x2F22,
+ },
+ [0x2F23]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EVENING",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5915 },
+ unicodeslot=0x2F23,
+ },
+ [0x2F24]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BIG",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5927 },
+ unicodeslot=0x2F24,
+ },
+ [0x2F25]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WOMAN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5973 },
+ unicodeslot=0x2F25,
+ },
+ [0x2F26]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CHILD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5B50 },
+ unicodeslot=0x2F26,
+ },
+ [0x2F27]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ROOF",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5B80 },
+ unicodeslot=0x2F27,
+ },
+ [0x2F28]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL INCH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5BF8 },
+ unicodeslot=0x2F28,
+ },
+ [0x2F29]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SMALL",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5C0F },
+ unicodeslot=0x2F29,
+ },
+ [0x2F2A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LAME",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5C22 },
+ unicodeslot=0x2F2A,
+ },
+ [0x2F2B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CORPSE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5C38 },
+ unicodeslot=0x2F2B,
+ },
+ [0x2F2C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SPROUT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5C6E },
+ unicodeslot=0x2F2C,
+ },
+ [0x2F2D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MOUNTAIN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5C71 },
+ unicodeslot=0x2F2D,
+ },
+ [0x2F2E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RIVER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5DDB },
+ unicodeslot=0x2F2E,
+ },
+ [0x2F2F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WORK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5DE5 },
+ unicodeslot=0x2F2F,
+ },
+ [0x2F30]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ONESELF",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5DF1 },
+ unicodeslot=0x2F30,
+ },
+ [0x2F31]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TURBAN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5DFE },
+ unicodeslot=0x2F31,
+ },
+ [0x2F32]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DRY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5E72 },
+ unicodeslot=0x2F32,
+ },
+ [0x2F33]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SHORT THREAD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5E7A },
+ unicodeslot=0x2F33,
+ },
+ [0x2F34]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DOTTED CLIFF",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5E7F },
+ unicodeslot=0x2F34,
+ },
+ [0x2F35]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LONG STRIDE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5EF4 },
+ unicodeslot=0x2F35,
+ },
+ [0x2F36]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TWO HANDS",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5EFE },
+ unicodeslot=0x2F36,
+ },
+ [0x2F37]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SHOOT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5F0B },
+ unicodeslot=0x2F37,
+ },
+ [0x2F38]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BOW",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5F13 },
+ unicodeslot=0x2F38,
+ },
+ [0x2F39]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SNOUT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5F50 },
+ unicodeslot=0x2F39,
+ },
+ [0x2F3A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BRISTLE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5F61 },
+ unicodeslot=0x2F3A,
+ },
+ [0x2F3B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL STEP",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5F73 },
+ unicodeslot=0x2F3B,
+ },
+ [0x2F3C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HEART",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x5FC3 },
+ unicodeslot=0x2F3C,
+ },
+ [0x2F3D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HALBERD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6208 },
+ unicodeslot=0x2F3D,
+ },
+ [0x2F3E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DOOR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6236 },
+ unicodeslot=0x2F3E,
+ },
+ [0x2F3F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HAND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x624B },
+ unicodeslot=0x2F3F,
+ },
+ [0x2F40]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BRANCH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x652F },
+ unicodeslot=0x2F40,
+ },
+ [0x2F41]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RAP",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6534 },
+ unicodeslot=0x2F41,
+ },
+ [0x2F42]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SCRIPT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6587 },
+ unicodeslot=0x2F42,
+ },
+ [0x2F43]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DIPPER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6597 },
+ unicodeslot=0x2F43,
+ },
+ [0x2F44]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL AXE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x65A4 },
+ unicodeslot=0x2F44,
+ },
+ [0x2F45]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SQUARE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x65B9 },
+ unicodeslot=0x2F45,
+ },
+ [0x2F46]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL NOT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x65E0 },
+ unicodeslot=0x2F46,
+ },
+ [0x2F47]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SUN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x65E5 },
+ unicodeslot=0x2F47,
+ },
+ [0x2F48]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SAY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x66F0 },
+ unicodeslot=0x2F48,
+ },
+ [0x2F49]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MOON",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6708 },
+ unicodeslot=0x2F49,
+ },
+ [0x2F4A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TREE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6728 },
+ unicodeslot=0x2F4A,
+ },
+ [0x2F4B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LACK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6B20 },
+ unicodeslot=0x2F4B,
+ },
+ [0x2F4C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL STOP",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6B62 },
+ unicodeslot=0x2F4C,
+ },
+ [0x2F4D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DEATH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6B79 },
+ unicodeslot=0x2F4D,
+ },
+ [0x2F4E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WEAPON",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6BB3 },
+ unicodeslot=0x2F4E,
+ },
+ [0x2F4F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DO NOT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6BCB },
+ unicodeslot=0x2F4F,
+ },
+ [0x2F50]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL COMPARE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6BD4 },
+ unicodeslot=0x2F50,
+ },
+ [0x2F51]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FUR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6BDB },
+ unicodeslot=0x2F51,
+ },
+ [0x2F52]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CLAN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6C0F },
+ unicodeslot=0x2F52,
+ },
+ [0x2F53]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL STEAM",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6C14 },
+ unicodeslot=0x2F53,
+ },
+ [0x2F54]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WATER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x6C34 },
+ unicodeslot=0x2F54,
+ },
+ [0x2F55]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FIRE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x706B },
+ unicodeslot=0x2F55,
+ },
+ [0x2F56]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CLAW",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x722A },
+ unicodeslot=0x2F56,
+ },
+ [0x2F57]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FATHER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7236 },
+ unicodeslot=0x2F57,
+ },
+ [0x2F58]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DOUBLE X",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x723B },
+ unicodeslot=0x2F58,
+ },
+ [0x2F59]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HALF TREE TRUNK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x723F },
+ unicodeslot=0x2F59,
+ },
+ [0x2F5A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SLICE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7247 },
+ unicodeslot=0x2F5A,
+ },
+ [0x2F5B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FANG",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7259 },
+ unicodeslot=0x2F5B,
+ },
+ [0x2F5C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL COW",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x725B },
+ unicodeslot=0x2F5C,
+ },
+ [0x2F5D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DOG",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x72AC },
+ unicodeslot=0x2F5D,
+ },
+ [0x2F5E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL PROFOUND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7384 },
+ unicodeslot=0x2F5E,
+ },
+ [0x2F5F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL JADE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7389 },
+ unicodeslot=0x2F5F,
+ },
+ [0x2F60]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MELON",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x74DC },
+ unicodeslot=0x2F60,
+ },
+ [0x2F61]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TILE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x74E6 },
+ unicodeslot=0x2F61,
+ },
+ [0x2F62]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SWEET",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7518 },
+ unicodeslot=0x2F62,
+ },
+ [0x2F63]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LIFE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x751F },
+ unicodeslot=0x2F63,
+ },
+ [0x2F64]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL USE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7528 },
+ unicodeslot=0x2F64,
+ },
+ [0x2F65]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FIELD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7530 },
+ unicodeslot=0x2F65,
+ },
+ [0x2F66]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BOLT OF CLOTH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x758B },
+ unicodeslot=0x2F66,
+ },
+ [0x2F67]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SICKNESS",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7592 },
+ unicodeslot=0x2F67,
+ },
+ [0x2F68]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DOTTED TENT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7676 },
+ unicodeslot=0x2F68,
+ },
+ [0x2F69]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WHITE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x767D },
+ unicodeslot=0x2F69,
+ },
+ [0x2F6A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SKIN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x76AE },
+ unicodeslot=0x2F6A,
+ },
+ [0x2F6B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DISH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x76BF },
+ unicodeslot=0x2F6B,
+ },
+ [0x2F6C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EYE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x76EE },
+ unicodeslot=0x2F6C,
+ },
+ [0x2F6D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SPEAR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x77DB },
+ unicodeslot=0x2F6D,
+ },
+ [0x2F6E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ARROW",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x77E2 },
+ unicodeslot=0x2F6E,
+ },
+ [0x2F6F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL STONE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x77F3 },
+ unicodeslot=0x2F6F,
+ },
+ [0x2F70]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SPIRIT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x793A },
+ unicodeslot=0x2F70,
+ },
+ [0x2F71]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TRACK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x79B8 },
+ unicodeslot=0x2F71,
+ },
+ [0x2F72]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL GRAIN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x79BE },
+ unicodeslot=0x2F72,
+ },
+ [0x2F73]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CAVE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7A74 },
+ unicodeslot=0x2F73,
+ },
+ [0x2F74]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL STAND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7ACB },
+ unicodeslot=0x2F74,
+ },
+ [0x2F75]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BAMBOO",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7AF9 },
+ unicodeslot=0x2F75,
+ },
+ [0x2F76]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RICE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7C73 },
+ unicodeslot=0x2F76,
+ },
+ [0x2F77]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SILK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7CF8 },
+ unicodeslot=0x2F77,
+ },
+ [0x2F78]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL JAR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7F36 },
+ unicodeslot=0x2F78,
+ },
+ [0x2F79]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL NET",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7F51 },
+ unicodeslot=0x2F79,
+ },
+ [0x2F7A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SHEEP",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7F8A },
+ unicodeslot=0x2F7A,
+ },
+ [0x2F7B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FEATHER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x7FBD },
+ unicodeslot=0x2F7B,
+ },
+ [0x2F7C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL OLD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8001 },
+ unicodeslot=0x2F7C,
+ },
+ [0x2F7D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL AND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x800C },
+ unicodeslot=0x2F7D,
+ },
+ [0x2F7E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL PLOW",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8012 },
+ unicodeslot=0x2F7E,
+ },
+ [0x2F7F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EAR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8033 },
+ unicodeslot=0x2F7F,
+ },
+ [0x2F80]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BRUSH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x807F },
+ unicodeslot=0x2F80,
+ },
+ [0x2F81]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MEAT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8089 },
+ unicodeslot=0x2F81,
+ },
+ [0x2F82]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MINISTER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x81E3 },
+ unicodeslot=0x2F82,
+ },
+ [0x2F83]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SELF",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x81EA },
+ unicodeslot=0x2F83,
+ },
+ [0x2F84]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL ARRIVE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x81F3 },
+ unicodeslot=0x2F84,
+ },
+ [0x2F85]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MORTAR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x81FC },
+ unicodeslot=0x2F85,
+ },
+ [0x2F86]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TONGUE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x820C },
+ unicodeslot=0x2F86,
+ },
+ [0x2F87]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL OPPOSE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x821B },
+ unicodeslot=0x2F87,
+ },
+ [0x2F88]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BOAT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x821F },
+ unicodeslot=0x2F88,
+ },
+ [0x2F89]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL STOPPING",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x826E },
+ unicodeslot=0x2F89,
+ },
+ [0x2F8A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL COLOR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8272 },
+ unicodeslot=0x2F8A,
+ },
+ [0x2F8B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL GRASS",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8278 },
+ unicodeslot=0x2F8B,
+ },
+ [0x2F8C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TIGER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x864D },
+ unicodeslot=0x2F8C,
+ },
+ [0x2F8D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL INSECT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x866B },
+ unicodeslot=0x2F8D,
+ },
+ [0x2F8E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BLOOD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8840 },
+ unicodeslot=0x2F8E,
+ },
+ [0x2F8F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WALK ENCLOSURE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x884C },
+ unicodeslot=0x2F8F,
+ },
+ [0x2F90]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CLOTHES",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8863 },
+ unicodeslot=0x2F90,
+ },
+ [0x2F91]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WEST",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x897E },
+ unicodeslot=0x2F91,
+ },
+ [0x2F92]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SEE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x898B },
+ unicodeslot=0x2F92,
+ },
+ [0x2F93]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HORN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x89D2 },
+ unicodeslot=0x2F93,
+ },
+ [0x2F94]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SPEECH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8A00 },
+ unicodeslot=0x2F94,
+ },
+ [0x2F95]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL VALLEY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8C37 },
+ unicodeslot=0x2F95,
+ },
+ [0x2F96]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BEAN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8C46 },
+ unicodeslot=0x2F96,
+ },
+ [0x2F97]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL PIG",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8C55 },
+ unicodeslot=0x2F97,
+ },
+ [0x2F98]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BADGER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8C78 },
+ unicodeslot=0x2F98,
+ },
+ [0x2F99]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SHELL",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8C9D },
+ unicodeslot=0x2F99,
+ },
+ [0x2F9A]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RED",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8D64 },
+ unicodeslot=0x2F9A,
+ },
+ [0x2F9B]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RUN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8D70 },
+ unicodeslot=0x2F9B,
+ },
+ [0x2F9C]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FOOT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8DB3 },
+ unicodeslot=0x2F9C,
+ },
+ [0x2F9D]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BODY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8EAB },
+ unicodeslot=0x2F9D,
+ },
+ [0x2F9E]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CART",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8ECA },
+ unicodeslot=0x2F9E,
+ },
+ [0x2F9F]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BITTER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8F9B },
+ unicodeslot=0x2F9F,
+ },
+ [0x2FA0]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MORNING",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8FB0 },
+ unicodeslot=0x2FA0,
+ },
+ [0x2FA1]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WALK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x8FB5 },
+ unicodeslot=0x2FA1,
+ },
+ [0x2FA2]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CITY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9091 },
+ unicodeslot=0x2FA2,
+ },
+ [0x2FA3]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9149 },
+ unicodeslot=0x2FA3,
+ },
+ [0x2FA4]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DISTINGUISH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x91C6 },
+ unicodeslot=0x2FA4,
+ },
+ [0x2FA5]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL VILLAGE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x91CC },
+ unicodeslot=0x2FA5,
+ },
+ [0x2FA6]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL GOLD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x91D1 },
+ unicodeslot=0x2FA6,
+ },
+ [0x2FA7]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LONG",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9577 },
+ unicodeslot=0x2FA7,
+ },
+ [0x2FA8]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL GATE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9580 },
+ unicodeslot=0x2FA8,
+ },
+ [0x2FA9]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MOUND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x961C },
+ unicodeslot=0x2FA9,
+ },
+ [0x2FAA]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SLAVE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x96B6 },
+ unicodeslot=0x2FAA,
+ },
+ [0x2FAB]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SHORT TAILED BIRD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x96B9 },
+ unicodeslot=0x2FAB,
+ },
+ [0x2FAC]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RAIN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x96E8 },
+ unicodeslot=0x2FAC,
+ },
+ [0x2FAD]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BLUE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9751 },
+ unicodeslot=0x2FAD,
+ },
+ [0x2FAE]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WRONG",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x975E },
+ unicodeslot=0x2FAE,
+ },
+ [0x2FAF]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FACE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9762 },
+ unicodeslot=0x2FAF,
+ },
+ [0x2FB0]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LEATHER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9769 },
+ unicodeslot=0x2FB0,
+ },
+ [0x2FB1]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TANNED LEATHER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x97CB },
+ unicodeslot=0x2FB1,
+ },
+ [0x2FB2]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LEEK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x97ED },
+ unicodeslot=0x2FB2,
+ },
+ [0x2FB3]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SOUND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x97F3 },
+ unicodeslot=0x2FB3,
+ },
+ [0x2FB4]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL LEAF",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9801 },
+ unicodeslot=0x2FB4,
+ },
+ [0x2FB5]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WIND",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x98A8 },
+ unicodeslot=0x2FB5,
+ },
+ [0x2FB6]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FLY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x98DB },
+ unicodeslot=0x2FB6,
+ },
+ [0x2FB7]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EAT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x98DF },
+ unicodeslot=0x2FB7,
+ },
+ [0x2FB8]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HEAD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9996 },
+ unicodeslot=0x2FB8,
+ },
+ [0x2FB9]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FRAGRANT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9999 },
+ unicodeslot=0x2FB9,
+ },
+ [0x2FBA]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HORSE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x99AC },
+ unicodeslot=0x2FBA,
+ },
+ [0x2FBB]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BONE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9AA8 },
+ unicodeslot=0x2FBB,
+ },
+ [0x2FBC]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TALL",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9AD8 },
+ unicodeslot=0x2FBC,
+ },
+ [0x2FBD]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HAIR",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9ADF },
+ unicodeslot=0x2FBD,
+ },
+ [0x2FBE]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FIGHT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9B25 },
+ unicodeslot=0x2FBE,
+ },
+ [0x2FBF]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SACRIFICIAL WINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9B2F },
+ unicodeslot=0x2FBF,
+ },
+ [0x2FC0]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL CAULDRON",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9B32 },
+ unicodeslot=0x2FC0,
+ },
+ [0x2FC1]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL GHOST",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9B3C },
+ unicodeslot=0x2FC1,
+ },
+ [0x2FC2]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FISH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9B5A },
+ unicodeslot=0x2FC2,
+ },
+ [0x2FC3]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BIRD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9CE5 },
+ unicodeslot=0x2FC3,
+ },
+ [0x2FC4]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL SALT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9E75 },
+ unicodeslot=0x2FC4,
+ },
+ [0x2FC5]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DEER",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9E7F },
+ unicodeslot=0x2FC5,
+ },
+ [0x2FC6]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL WHEAT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9EA5 },
+ unicodeslot=0x2FC6,
+ },
+ [0x2FC7]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL HEMP",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9EBB },
+ unicodeslot=0x2FC7,
+ },
+ [0x2FC8]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL YELLOW",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9EC3 },
+ unicodeslot=0x2FC8,
+ },
+ [0x2FC9]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL MILLET",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9ECD },
+ unicodeslot=0x2FC9,
+ },
+ [0x2FCA]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL BLACK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9ED1 },
+ unicodeslot=0x2FCA,
+ },
+ [0x2FCB]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EMBROIDERY",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9EF9 },
+ unicodeslot=0x2FCB,
+ },
+ [0x2FCC]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FROG",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9EFD },
+ unicodeslot=0x2FCC,
+ },
+ [0x2FCD]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TRIPOD",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F0E },
+ unicodeslot=0x2FCD,
+ },
+ [0x2FCE]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DRUM",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F13 },
+ unicodeslot=0x2FCE,
+ },
+ [0x2FCF]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL RAT",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F20 },
+ unicodeslot=0x2FCF,
+ },
+ [0x2FD0]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL NOSE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F3B },
+ unicodeslot=0x2FD0,
+ },
+ [0x2FD1]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL EVEN",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F4A },
+ unicodeslot=0x2FD1,
+ },
+ [0x2FD2]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TOOTH",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F52 },
+ unicodeslot=0x2FD2,
+ },
+ [0x2FD3]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL DRAGON",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F8D },
+ unicodeslot=0x2FD3,
+ },
+ [0x2FD4]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL TURTLE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9F9C },
+ unicodeslot=0x2FD4,
+ },
+ [0x2FD5]={
+ category="so",
+ cjkwd="w",
+ description="KANGXI RADICAL FLUTE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x9FA0 },
+ unicodeslot=0x2FD5,
+ },
+ [0x2FF0]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF0,
+ },
+ [0x2FF1]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF1,
+ },
+ [0x2FF2]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF2,
+ },
+ [0x2FF3]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF3,
+ },
+ [0x2FF4]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF4,
+ },
+ [0x2FF5]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF5,
+ },
+ [0x2FF6]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF6,
+ },
+ [0x2FF7]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF7,
+ },
+ [0x2FF8]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF8,
+ },
+ [0x2FF9]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FF9,
+ },
+ [0x2FFA]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FFA,
+ },
+ [0x2FFB]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x2FFB,
+ },
+ [0x3000]={
+ category="zs",
+ cjkwd="f",
+ contextname="ideographicspace",
+ description="IDEOGRAPHIC SPACE",
+ direction="ws",
+ linebreak="id",
+ specials={ "wide", 0x0020 },
+ unicodeslot=0x3000,
+ },
+ [0x3001]={
+ category="po",
+ cjkwd="w",
+ description="IDEOGRAPHIC COMMA",
+ direction="on",
+ linebreak="cl",
+ unicodeslot=0x3001,
+ },
+ [0x3002]={
+ category="po",
+ cjkwd="w",
+ description="IDEOGRAPHIC FULL STOP",
+ direction="on",
+ linebreak="cl",
+ unicodeslot=0x3002,
+ },
+ [0x3003]={
+ category="po",
+ cjkwd="w",
+ description="DITTO MARK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x3003,
+ },
+ [0x3004]={
+ category="so",
+ cjkwd="w",
+ description="JAPANESE INDUSTRIAL STANDARD SYMBOL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x3004,
+ },
+ [0x3005]={
+ category="lm",
+ cjkwd="w",
+ description="IDEOGRAPHIC ITERATION MARK",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3005,
+ },
+ [0x3006]={
+ category="lo",
+ cjkwd="w",
+ description="IDEOGRAPHIC CLOSING MARK",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3006,
+ },
+ [0x3007]={
+ category="nl",
+ cjkwd="w",
+ description="IDEOGRAPHIC NUMBER ZERO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3007,
+ },
+ [0x3008]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x3009,
+ unicodeslot=0x3008,
+ },
+ [0x3009]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x3008,
+ unicodeslot=0x3009,
+ },
+ [0x300A]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT DOUBLE ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x300B,
+ unicodeslot=0x300A,
+ },
+ [0x300B]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT DOUBLE ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x300A,
+ unicodeslot=0x300B,
+ },
+ [0x300C]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT CORNER BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x300D,
+ unicodeslot=0x300C,
+ },
+ [0x300D]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT CORNER BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x300C,
+ unicodeslot=0x300D,
+ },
+ [0x300E]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT WHITE CORNER BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x300F,
+ unicodeslot=0x300E,
+ },
+ [0x300F]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT WHITE CORNER BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x300E,
+ unicodeslot=0x300F,
+ },
+ [0x3010]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT BLACK LENTICULAR BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x3011,
+ unicodeslot=0x3010,
+ },
+ [0x3011]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT BLACK LENTICULAR BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x3010,
+ unicodeslot=0x3011,
+ },
+ [0x3012]={
+ category="so",
+ cjkwd="w",
+ description="POSTAL MARK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x3012,
+ },
+ [0x3013]={
+ category="so",
+ cjkwd="w",
+ description="GETA MARK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x3013,
+ },
+ [0x3014]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x3015,
+ mathclass="open",
+ mathname="lgroup",
+ unicodeslot=0x3014,
+ },
+ [0x3015]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x3014,
+ mathclass="close",
+ mathname="rgroup",
+ unicodeslot=0x3015,
+ },
+ [0x3016]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT WHITE LENTICULAR BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x3017,
+ unicodeslot=0x3016,
+ },
+ [0x3017]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT WHITE LENTICULAR BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x3016,
+ unicodeslot=0x3017,
+ },
+ [0x3018]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT WHITE TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x3019,
+ unicodeslot=0x3018,
+ },
+ [0x3019]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT WHITE TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x3018,
+ unicodeslot=0x3019,
+ },
+ [0x301A]={
+ category="ps",
+ cjkwd="w",
+ description="LEFT WHITE SQUARE BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x301B,
+ unicodeslot=0x301A,
+ },
+ [0x301B]={
+ category="pe",
+ cjkwd="w",
+ description="RIGHT WHITE SQUARE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x301A,
+ unicodeslot=0x301B,
+ },
+ [0x301C]={
+ category="pd",
+ cjkwd="w",
+ description="WAVE DASH",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x301C,
+ },
+ [0x301D]={
+ category="ps",
+ cjkwd="w",
+ description="REVERSED DOUBLE PRIME QUOTATION MARK",
+ direction="on",
+ linebreak="op",
+ unicodeslot=0x301D,
+ },
+ [0x301E]={
+ category="pe",
+ cjkwd="w",
+ description="DOUBLE PRIME QUOTATION MARK",
+ direction="on",
+ linebreak="cl",
+ unicodeslot=0x301E,
+ },
+ [0x301F]={
+ category="pe",
+ cjkwd="w",
+ description="LOW DOUBLE PRIME QUOTATION MARK",
+ direction="on",
+ linebreak="cl",
+ unicodeslot=0x301F,
+ },
+ [0x3020]={
+ category="so",
+ cjkwd="w",
+ description="POSTAL MARK FACE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x3020,
+ },
+ [0x3021]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL ONE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3021,
+ },
+ [0x3022]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL TWO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3022,
+ },
+ [0x3023]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL THREE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3023,
+ },
+ [0x3024]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL FOUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3024,
+ },
+ [0x3025]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL FIVE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3025,
+ },
+ [0x3026]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL SIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3026,
+ },
+ [0x3027]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL SEVEN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3027,
+ },
+ [0x3028]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL EIGHT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3028,
+ },
+ [0x3029]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL NINE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3029,
+ },
+ [0x302A]={
+ category="mn",
+ cjkwd="w",
+ description="IDEOGRAPHIC LEVEL TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x302A,
+ },
+ [0x302B]={
+ category="mn",
+ cjkwd="w",
+ description="IDEOGRAPHIC RISING TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x302B,
+ },
+ [0x302C]={
+ category="mn",
+ cjkwd="w",
+ description="IDEOGRAPHIC DEPARTING TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x302C,
+ },
+ [0x302D]={
+ category="mn",
+ cjkwd="w",
+ description="IDEOGRAPHIC ENTERING TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x302D,
+ },
+ [0x302E]={
+ category="mn",
+ cjkwd="w",
+ description="HANGUL SINGLE DOT TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x302E,
+ },
+ [0x302F]={
+ category="mn",
+ cjkwd="w",
+ description="HANGUL DOUBLE DOT TONE MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x302F,
+ },
+ [0x3030]={
+ category="pd",
+ cjkwd="w",
+ description="WAVY DASH",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x3030,
+ },
+ [0x3031]={
+ category="lm",
+ cjkwd="w",
+ description="VERTICAL KANA REPEAT MARK",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3031,
+ },
+ [0x3032]={
+ category="lm",
+ cjkwd="w",
+ description="VERTICAL KANA REPEAT WITH VOICED SOUND MARK",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3032,
+ },
+ [0x3033]={
+ category="lm",
+ cjkwd="w",
+ description="VERTICAL KANA REPEAT MARK UPPER HALF",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3033,
+ },
+ [0x3034]={
+ category="lm",
+ cjkwd="w",
+ description="VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3034,
+ },
+ [0x3035]={
+ category="lm",
+ cjkwd="w",
+ description="VERTICAL KANA REPEAT MARK LOWER HALF",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3035,
+ },
+ [0x3036]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED POSTAL MARK",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x3012 },
+ unicodeslot=0x3036,
+ },
+ [0x3037]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x3037,
+ },
+ [0x3038]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL TEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x5341 },
+ unicodeslot=0x3038,
+ },
+ [0x3039]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL TWENTY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x5344 },
+ unicodeslot=0x3039,
+ },
+ [0x303A]={
+ category="nl",
+ cjkwd="w",
+ description="HANGZHOU NUMERAL THIRTY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x5345 },
+ unicodeslot=0x303A,
+ },
+ [0x303B]={
+ category="lm",
+ cjkwd="w",
+ description="VERTICAL IDEOGRAPHIC ITERATION MARK",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x303B,
+ },
+ [0x303C]={
+ category="lo",
+ cjkwd="w",
+ description="MASU MARK",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x303C,
+ },
+ [0x303D]={
+ category="po",
+ cjkwd="w",
+ description="PART ALTERNATION MARK",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x303D,
+ },
+ [0x303E]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC VARIATION INDICATOR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x303E,
+ },
+ [0x303F]={
+ category="so",
+ contextname="ideographichalffillspace",
+ description="IDEOGRAPHIC HALF FILL SPACE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x303F,
+ },
+ [0x3041]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL A",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3041,
+ },
+ [0x3042]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER A",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3042,
+ },
+ [0x3043]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL I",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3043,
+ },
+ [0x3044]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER I",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3044,
+ },
+ [0x3045]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL U",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3045,
+ },
+ [0x3046]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER U",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3046,
+ },
+ [0x3047]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL E",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3047,
+ },
+ [0x3048]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER E",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3048,
+ },
+ [0x3049]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL O",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3049,
+ },
+ [0x304A]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER O",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x304A,
+ },
+ [0x304B]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER KA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x304B,
+ },
+ [0x304C]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER GA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x304B, 0x3099 },
+ unicodeslot=0x304C,
+ },
+ [0x304D]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER KI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x304D,
+ },
+ [0x304E]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER GI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x304D, 0x3099 },
+ unicodeslot=0x304E,
+ },
+ [0x304F]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER KU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x304F,
+ },
+ [0x3050]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER GU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x304F, 0x3099 },
+ unicodeslot=0x3050,
+ },
+ [0x3051]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER KE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3051,
+ },
+ [0x3052]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER GE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3051, 0x3099 },
+ unicodeslot=0x3052,
+ },
+ [0x3053]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER KO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3053,
+ },
+ [0x3054]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER GO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3053, 0x3099 },
+ unicodeslot=0x3054,
+ },
+ [0x3055]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3055,
+ },
+ [0x3056]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER ZA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3055, 0x3099 },
+ unicodeslot=0x3056,
+ },
+ [0x3057]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3057,
+ },
+ [0x3058]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER ZI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3057, 0x3099 },
+ unicodeslot=0x3058,
+ },
+ [0x3059]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3059,
+ },
+ [0x305A]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER ZU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3059, 0x3099 },
+ unicodeslot=0x305A,
+ },
+ [0x305B]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x305B,
+ },
+ [0x305C]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER ZE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x305B, 0x3099 },
+ unicodeslot=0x305C,
+ },
+ [0x305D]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x305D,
+ },
+ [0x305E]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER ZO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x305D, 0x3099 },
+ unicodeslot=0x305E,
+ },
+ [0x305F]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER TA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x305F,
+ },
+ [0x3060]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x305F, 0x3099 },
+ unicodeslot=0x3060,
+ },
+ [0x3061]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER TI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3061,
+ },
+ [0x3062]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER DI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3061, 0x3099 },
+ unicodeslot=0x3062,
+ },
+ [0x3063]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL TU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3063,
+ },
+ [0x3064]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER TU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3064,
+ },
+ [0x3065]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER DU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3064, 0x3099 },
+ unicodeslot=0x3065,
+ },
+ [0x3066]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER TE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3066,
+ },
+ [0x3067]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3066, 0x3099 },
+ unicodeslot=0x3067,
+ },
+ [0x3068]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER TO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3068,
+ },
+ [0x3069]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER DO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3068, 0x3099 },
+ unicodeslot=0x3069,
+ },
+ [0x306A]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER NA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x306A,
+ },
+ [0x306B]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER NI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x306B,
+ },
+ [0x306C]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER NU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x306C,
+ },
+ [0x306D]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER NE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x306D,
+ },
+ [0x306E]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER NO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x306E,
+ },
+ [0x306F]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER HA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x306F,
+ },
+ [0x3070]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x306F, 0x3099 },
+ unicodeslot=0x3070,
+ },
+ [0x3071]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER PA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x306F, 0x309A },
+ unicodeslot=0x3071,
+ },
+ [0x3072]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER HI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3072,
+ },
+ [0x3073]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER BI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3072, 0x3099 },
+ unicodeslot=0x3073,
+ },
+ [0x3074]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER PI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3072, 0x309A },
+ unicodeslot=0x3074,
+ },
+ [0x3075]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER HU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3075,
+ },
+ [0x3076]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER BU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3075, 0x3099 },
+ unicodeslot=0x3076,
+ },
+ [0x3077]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER PU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3075, 0x309A },
+ unicodeslot=0x3077,
+ },
+ [0x3078]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER HE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3078,
+ },
+ [0x3079]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3078, 0x3099 },
+ unicodeslot=0x3079,
+ },
+ [0x307A]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER PE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3078, 0x309A },
+ unicodeslot=0x307A,
+ },
+ [0x307B]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER HO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x307B,
+ },
+ [0x307C]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER BO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x307B, 0x3099 },
+ unicodeslot=0x307C,
+ },
+ [0x307D]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER PO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x307B, 0x309A },
+ unicodeslot=0x307D,
+ },
+ [0x307E]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER MA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x307E,
+ },
+ [0x307F]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER MI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x307F,
+ },
+ [0x3080]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER MU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3080,
+ },
+ [0x3081]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER ME",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3081,
+ },
+ [0x3082]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER MO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3082,
+ },
+ [0x3083]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL YA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3083,
+ },
+ [0x3084]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER YA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3084,
+ },
+ [0x3085]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL YU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3085,
+ },
+ [0x3086]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER YU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3086,
+ },
+ [0x3087]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL YO",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3087,
+ },
+ [0x3088]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER YO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3088,
+ },
+ [0x3089]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER RA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3089,
+ },
+ [0x308A]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER RI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x308A,
+ },
+ [0x308B]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER RU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x308B,
+ },
+ [0x308C]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER RE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x308C,
+ },
+ [0x308D]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER RO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x308D,
+ },
+ [0x308E]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL WA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x308E,
+ },
+ [0x308F]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER WA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x308F,
+ },
+ [0x3090]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER WI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3090,
+ },
+ [0x3091]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER WE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3091,
+ },
+ [0x3092]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER WO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3092,
+ },
+ [0x3093]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER N",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3093,
+ },
+ [0x3094]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER VU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3046, 0x3099 },
+ unicodeslot=0x3094,
+ },
+ [0x3095]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL KA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3095,
+ },
+ [0x3096]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA LETTER SMALL KE",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x3096,
+ },
+ [0x3099]={
+ category="mn",
+ cjkwd="w",
+ description="COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x3099,
+ },
+ [0x309A]={
+ category="mn",
+ cjkwd="w",
+ description="COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x309A,
+ },
+ [0x309B]={
+ category="sk",
+ cjkwd="w",
+ description="KATAKANA-HIRAGANA VOICED SOUND MARK",
+ direction="on",
+ linebreak="ns",
+ specials={ "compat", 0x0020, 0x3099 },
+ unicodeslot=0x309B,
+ },
+ [0x309C]={
+ category="sk",
+ cjkwd="w",
+ description="KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK",
+ direction="on",
+ linebreak="ns",
+ specials={ "compat", 0x0020, 0x309A },
+ unicodeslot=0x309C,
+ },
+ [0x309D]={
+ category="lm",
+ cjkwd="w",
+ description="HIRAGANA ITERATION MARK",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x309D,
+ },
+ [0x309E]={
+ category="lm",
+ cjkwd="w",
+ description="HIRAGANA VOICED ITERATION MARK",
+ direction="l",
+ linebreak="ns",
+ specials={ "char", 0x309D, 0x3099 },
+ unicodeslot=0x309E,
+ },
+ [0x309F]={
+ category="lo",
+ cjkwd="w",
+ description="HIRAGANA DIGRAPH YORI",
+ direction="l",
+ linebreak="id",
+ specials={ "vertical", 0x3088, 0x308A },
+ unicodeslot=0x309F,
+ },
+ [0x30A0]={
+ category="pd",
+ cjkwd="w",
+ description="KATAKANA-HIRAGANA DOUBLE HYPHEN",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x30A0,
+ },
+ [0x30A1]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL A",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30A1,
+ },
+ [0x30A2]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER A",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30A2,
+ },
+ [0x30A3]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL I",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30A3,
+ },
+ [0x30A4]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER I",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30A4,
+ },
+ [0x30A5]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL U",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30A5,
+ },
+ [0x30A6]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER U",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30A6,
+ },
+ [0x30A7]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL E",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30A7,
+ },
+ [0x30A8]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER E",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30A8,
+ },
+ [0x30A9]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL O",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30A9,
+ },
+ [0x30AA]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER O",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30AA,
+ },
+ [0x30AB]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER KA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30AB,
+ },
+ [0x30AC]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER GA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30AB, 0x3099 },
+ unicodeslot=0x30AC,
+ },
+ [0x30AD]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER KI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30AD,
+ },
+ [0x30AE]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER GI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30AD, 0x3099 },
+ unicodeslot=0x30AE,
+ },
+ [0x30AF]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER KU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30AF,
+ },
+ [0x30B0]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER GU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30AF, 0x3099 },
+ unicodeslot=0x30B0,
+ },
+ [0x30B1]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER KE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30B1,
+ },
+ [0x30B2]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER GE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30B1, 0x3099 },
+ unicodeslot=0x30B2,
+ },
+ [0x30B3]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER KO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30B3,
+ },
+ [0x30B4]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER GO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30B3, 0x3099 },
+ unicodeslot=0x30B4,
+ },
+ [0x30B5]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30B5,
+ },
+ [0x30B6]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER ZA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30B5, 0x3099 },
+ unicodeslot=0x30B6,
+ },
+ [0x30B7]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30B7,
+ },
+ [0x30B8]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER ZI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30B7, 0x3099 },
+ unicodeslot=0x30B8,
+ },
+ [0x30B9]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30B9,
+ },
+ [0x30BA]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER ZU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30B9, 0x3099 },
+ unicodeslot=0x30BA,
+ },
+ [0x30BB]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30BB,
+ },
+ [0x30BC]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER ZE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30BB, 0x3099 },
+ unicodeslot=0x30BC,
+ },
+ [0x30BD]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30BD,
+ },
+ [0x30BE]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER ZO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30BD, 0x3099 },
+ unicodeslot=0x30BE,
+ },
+ [0x30BF]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER TA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30BF,
+ },
+ [0x30C0]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30BF, 0x3099 },
+ unicodeslot=0x30C0,
+ },
+ [0x30C1]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER TI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30C1,
+ },
+ [0x30C2]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER DI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30C1, 0x3099 },
+ unicodeslot=0x30C2,
+ },
+ [0x30C3]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL TU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30C3,
+ },
+ [0x30C4]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER TU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30C4,
+ },
+ [0x30C5]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER DU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30C4, 0x3099 },
+ unicodeslot=0x30C5,
+ },
+ [0x30C6]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER TE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30C6,
+ },
+ [0x30C7]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30C6, 0x3099 },
+ unicodeslot=0x30C7,
+ },
+ [0x30C8]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER TO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30C8,
+ },
+ [0x30C9]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER DO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30C8, 0x3099 },
+ unicodeslot=0x30C9,
+ },
+ [0x30CA]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER NA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30CA,
+ },
+ [0x30CB]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER NI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30CB,
+ },
+ [0x30CC]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER NU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30CC,
+ },
+ [0x30CD]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER NE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30CD,
+ },
+ [0x30CE]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER NO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30CE,
+ },
+ [0x30CF]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER HA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30CF,
+ },
+ [0x30D0]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30CF, 0x3099 },
+ unicodeslot=0x30D0,
+ },
+ [0x30D1]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER PA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30CF, 0x309A },
+ unicodeslot=0x30D1,
+ },
+ [0x30D2]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER HI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30D2,
+ },
+ [0x30D3]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER BI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30D2, 0x3099 },
+ unicodeslot=0x30D3,
+ },
+ [0x30D4]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER PI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30D2, 0x309A },
+ unicodeslot=0x30D4,
+ },
+ [0x30D5]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER HU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30D5,
+ },
+ [0x30D6]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER BU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30D5, 0x3099 },
+ unicodeslot=0x30D6,
+ },
+ [0x30D7]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER PU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30D5, 0x309A },
+ unicodeslot=0x30D7,
+ },
+ [0x30D8]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER HE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30D8,
+ },
+ [0x30D9]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30D8, 0x3099 },
+ unicodeslot=0x30D9,
+ },
+ [0x30DA]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER PE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30D8, 0x309A },
+ unicodeslot=0x30DA,
+ },
+ [0x30DB]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER HO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30DB,
+ },
+ [0x30DC]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER BO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30DB, 0x3099 },
+ unicodeslot=0x30DC,
+ },
+ [0x30DD]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER PO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30DB, 0x309A },
+ unicodeslot=0x30DD,
+ },
+ [0x30DE]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER MA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30DE,
+ },
+ [0x30DF]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER MI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30DF,
+ },
+ [0x30E0]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER MU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30E0,
+ },
+ [0x30E1]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER ME",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30E1,
+ },
+ [0x30E2]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER MO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30E2,
+ },
+ [0x30E3]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL YA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30E3,
+ },
+ [0x30E4]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER YA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30E4,
+ },
+ [0x30E5]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL YU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30E5,
+ },
+ [0x30E6]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER YU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30E6,
+ },
+ [0x30E7]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL YO",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30E7,
+ },
+ [0x30E8]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER YO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30E8,
+ },
+ [0x30E9]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER RA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30E9,
+ },
+ [0x30EA]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER RI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30EA,
+ },
+ [0x30EB]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER RU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30EB,
+ },
+ [0x30EC]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER RE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30EC,
+ },
+ [0x30ED]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER RO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30ED,
+ },
+ [0x30EE]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL WA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30EE,
+ },
+ [0x30EF]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER WA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30EF,
+ },
+ [0x30F0]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER WI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30F0,
+ },
+ [0x30F1]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER WE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30F1,
+ },
+ [0x30F2]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER WO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30F2,
+ },
+ [0x30F3]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER N",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x30F3,
+ },
+ [0x30F4]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER VU",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30A6, 0x3099 },
+ unicodeslot=0x30F4,
+ },
+ [0x30F5]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL KA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30F5,
+ },
+ [0x30F6]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL KE",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30F6,
+ },
+ [0x30F7]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER VA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30EF, 0x3099 },
+ unicodeslot=0x30F7,
+ },
+ [0x30F8]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER VI",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30F0, 0x3099 },
+ unicodeslot=0x30F8,
+ },
+ [0x30F9]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER VE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30F1, 0x3099 },
+ unicodeslot=0x30F9,
+ },
+ [0x30FA]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER VO",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x30F2, 0x3099 },
+ unicodeslot=0x30FA,
+ },
+ [0x30FB]={
+ category="po",
+ cjkwd="w",
+ description="KATAKANA MIDDLE DOT",
+ direction="on",
+ linebreak="ns",
+ unicodeslot=0x30FB,
+ },
+ [0x30FC]={
+ category="lm",
+ cjkwd="w",
+ description="KATAKANA-HIRAGANA PROLONGED SOUND MARK",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30FC,
+ },
+ [0x30FD]={
+ category="lm",
+ cjkwd="w",
+ description="KATAKANA ITERATION MARK",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x30FD,
+ },
+ [0x30FE]={
+ category="lm",
+ cjkwd="w",
+ description="KATAKANA VOICED ITERATION MARK",
+ direction="l",
+ linebreak="ns",
+ specials={ "char", 0x30FD, 0x3099 },
+ unicodeslot=0x30FE,
+ },
+ [0x30FF]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA DIGRAPH KOTO",
+ direction="l",
+ linebreak="id",
+ specials={ "vertical", 0x30B3, 0x30C8 },
+ unicodeslot=0x30FF,
+ },
+ [0x3105]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER B",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3105,
+ },
+ [0x3106]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER P",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3106,
+ },
+ [0x3107]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER M",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3107,
+ },
+ [0x3108]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER F",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3108,
+ },
+ [0x3109]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER D",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3109,
+ },
+ [0x310A]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER T",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x310A,
+ },
+ [0x310B]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER N",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x310B,
+ },
+ [0x310C]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER L",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x310C,
+ },
+ [0x310D]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER G",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x310D,
+ },
+ [0x310E]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER K",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x310E,
+ },
+ [0x310F]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER H",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x310F,
+ },
+ [0x3110]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER J",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3110,
+ },
+ [0x3111]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER Q",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3111,
+ },
+ [0x3112]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER X",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3112,
+ },
+ [0x3113]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ZH",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3113,
+ },
+ [0x3114]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER CH",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3114,
+ },
+ [0x3115]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER SH",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3115,
+ },
+ [0x3116]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER R",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3116,
+ },
+ [0x3117]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER Z",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3117,
+ },
+ [0x3118]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER C",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3118,
+ },
+ [0x3119]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER S",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3119,
+ },
+ [0x311A]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER A",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x311A,
+ },
+ [0x311B]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER O",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x311B,
+ },
+ [0x311C]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER E",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x311C,
+ },
+ [0x311D]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER EH",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x311D,
+ },
+ [0x311E]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER AI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x311E,
+ },
+ [0x311F]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER EI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x311F,
+ },
+ [0x3120]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER AU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3120,
+ },
+ [0x3121]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER OU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3121,
+ },
+ [0x3122]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER AN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3122,
+ },
+ [0x3123]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER EN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3123,
+ },
+ [0x3124]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ANG",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3124,
+ },
+ [0x3125]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ENG",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3125,
+ },
+ [0x3126]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ER",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3126,
+ },
+ [0x3127]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER I",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3127,
+ },
+ [0x3128]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER U",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3128,
+ },
+ [0x3129]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER IU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3129,
+ },
+ [0x312A]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER V",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x312A,
+ },
+ [0x312B]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER NG",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x312B,
+ },
+ [0x312C]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER GN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x312C,
+ },
+ [0x3131]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER KIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1100 },
+ unicodeslot=0x3131,
+ },
+ [0x3132]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGKIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1101 },
+ unicodeslot=0x3132,
+ },
+ [0x3133]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER KIYEOK-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11AA },
+ unicodeslot=0x3133,
+ },
+ [0x3134]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER NIEUN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1102 },
+ unicodeslot=0x3134,
+ },
+ [0x3135]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER NIEUN-CIEUC",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11AC },
+ unicodeslot=0x3135,
+ },
+ [0x3136]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER NIEUN-HIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11AD },
+ unicodeslot=0x3136,
+ },
+ [0x3137]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1103 },
+ unicodeslot=0x3137,
+ },
+ [0x3138]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGTIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1104 },
+ unicodeslot=0x3138,
+ },
+ [0x3139]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1105 },
+ unicodeslot=0x3139,
+ },
+ [0x313A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-KIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11B0 },
+ unicodeslot=0x313A,
+ },
+ [0x313B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-MIEUM",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11B1 },
+ unicodeslot=0x313B,
+ },
+ [0x313C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-PIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11B2 },
+ unicodeslot=0x313C,
+ },
+ [0x313D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11B3 },
+ unicodeslot=0x313D,
+ },
+ [0x313E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-THIEUTH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11B4 },
+ unicodeslot=0x313E,
+ },
+ [0x313F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-PHIEUPH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11B5 },
+ unicodeslot=0x313F,
+ },
+ [0x3140]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-HIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x111A },
+ unicodeslot=0x3140,
+ },
+ [0x3141]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER MIEUM",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1106 },
+ unicodeslot=0x3141,
+ },
+ [0x3142]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1107 },
+ unicodeslot=0x3142,
+ },
+ [0x3143]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGPIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1108 },
+ unicodeslot=0x3143,
+ },
+ [0x3144]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1121 },
+ unicodeslot=0x3144,
+ },
+ [0x3145]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1109 },
+ unicodeslot=0x3145,
+ },
+ [0x3146]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGSIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x110A },
+ unicodeslot=0x3146,
+ },
+ [0x3147]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER IEUNG",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x110B },
+ unicodeslot=0x3147,
+ },
+ [0x3148]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER CIEUC",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x110C },
+ unicodeslot=0x3148,
+ },
+ [0x3149]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGCIEUC",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x110D },
+ unicodeslot=0x3149,
+ },
+ [0x314A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER CHIEUCH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x110E },
+ unicodeslot=0x314A,
+ },
+ [0x314B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER KHIEUKH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x110F },
+ unicodeslot=0x314B,
+ },
+ [0x314C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER THIEUTH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1110 },
+ unicodeslot=0x314C,
+ },
+ [0x314D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PHIEUPH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1111 },
+ unicodeslot=0x314D,
+ },
+ [0x314E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER HIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1112 },
+ unicodeslot=0x314E,
+ },
+ [0x314F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1161 },
+ unicodeslot=0x314F,
+ },
+ [0x3150]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER AE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1162 },
+ unicodeslot=0x3150,
+ },
+ [0x3151]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YA",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1163 },
+ unicodeslot=0x3151,
+ },
+ [0x3152]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YAE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1164 },
+ unicodeslot=0x3152,
+ },
+ [0x3153]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER EO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1165 },
+ unicodeslot=0x3153,
+ },
+ [0x3154]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER E",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1166 },
+ unicodeslot=0x3154,
+ },
+ [0x3155]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YEO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1167 },
+ unicodeslot=0x3155,
+ },
+ [0x3156]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1168 },
+ unicodeslot=0x3156,
+ },
+ [0x3157]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER O",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1169 },
+ unicodeslot=0x3157,
+ },
+ [0x3158]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER WA",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x116A },
+ unicodeslot=0x3158,
+ },
+ [0x3159]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER WAE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x116B },
+ unicodeslot=0x3159,
+ },
+ [0x315A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER OE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x116C },
+ unicodeslot=0x315A,
+ },
+ [0x315B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x116D },
+ unicodeslot=0x315B,
+ },
+ [0x315C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER U",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x116E },
+ unicodeslot=0x315C,
+ },
+ [0x315D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER WEO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x116F },
+ unicodeslot=0x315D,
+ },
+ [0x315E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER WE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1170 },
+ unicodeslot=0x315E,
+ },
+ [0x315F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER WI",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1171 },
+ unicodeslot=0x315F,
+ },
+ [0x3160]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YU",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1172 },
+ unicodeslot=0x3160,
+ },
+ [0x3161]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER EU",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1173 },
+ unicodeslot=0x3161,
+ },
+ [0x3162]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YI",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1174 },
+ unicodeslot=0x3162,
+ },
+ [0x3163]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER I",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1175 },
+ unicodeslot=0x3163,
+ },
+ [0x3164]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL FILLER",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1160 },
+ unicodeslot=0x3164,
+ },
+ [0x3165]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGNIEUN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1114 },
+ unicodeslot=0x3165,
+ },
+ [0x3166]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER NIEUN-TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1115 },
+ unicodeslot=0x3166,
+ },
+ [0x3167]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER NIEUN-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11C7 },
+ unicodeslot=0x3167,
+ },
+ [0x3168]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER NIEUN-PANSIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11C8 },
+ unicodeslot=0x3168,
+ },
+ [0x3169]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-KIYEOK-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11CC },
+ unicodeslot=0x3169,
+ },
+ [0x316A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11CE },
+ unicodeslot=0x316A,
+ },
+ [0x316B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-PIEUP-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11D3 },
+ unicodeslot=0x316B,
+ },
+ [0x316C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-PANSIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11D7 },
+ unicodeslot=0x316C,
+ },
+ [0x316D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER RIEUL-YEORINHIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11D9 },
+ unicodeslot=0x316D,
+ },
+ [0x316E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER MIEUM-PIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x111C },
+ unicodeslot=0x316E,
+ },
+ [0x316F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER MIEUM-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11DD },
+ unicodeslot=0x316F,
+ },
+ [0x3170]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER MIEUM-PANSIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11DF },
+ unicodeslot=0x3170,
+ },
+ [0x3171]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER KAPYEOUNMIEUM",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x111D },
+ unicodeslot=0x3171,
+ },
+ [0x3172]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP-KIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x111E },
+ unicodeslot=0x3172,
+ },
+ [0x3173]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP-TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1120 },
+ unicodeslot=0x3173,
+ },
+ [0x3174]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP-SIOS-KIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1122 },
+ unicodeslot=0x3174,
+ },
+ [0x3175]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP-SIOS-TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1123 },
+ unicodeslot=0x3175,
+ },
+ [0x3176]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP-CIEUC",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1127 },
+ unicodeslot=0x3176,
+ },
+ [0x3177]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PIEUP-THIEUTH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1129 },
+ unicodeslot=0x3177,
+ },
+ [0x3178]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER KAPYEOUNPIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x112B },
+ unicodeslot=0x3178,
+ },
+ [0x3179]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER KAPYEOUNSSANGPIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x112C },
+ unicodeslot=0x3179,
+ },
+ [0x317A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SIOS-KIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x112D },
+ unicodeslot=0x317A,
+ },
+ [0x317B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SIOS-NIEUN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x112E },
+ unicodeslot=0x317B,
+ },
+ [0x317C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SIOS-TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x112F },
+ unicodeslot=0x317C,
+ },
+ [0x317D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SIOS-PIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1132 },
+ unicodeslot=0x317D,
+ },
+ [0x317E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SIOS-CIEUC",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1136 },
+ unicodeslot=0x317E,
+ },
+ [0x317F]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER PANSIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1140 },
+ unicodeslot=0x317F,
+ },
+ [0x3180]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGIEUNG",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1147 },
+ unicodeslot=0x3180,
+ },
+ [0x3181]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YESIEUNG",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x114C },
+ unicodeslot=0x3181,
+ },
+ [0x3182]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YESIEUNG-SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11F1 },
+ unicodeslot=0x3182,
+ },
+ [0x3183]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YESIEUNG-PANSIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11F2 },
+ unicodeslot=0x3183,
+ },
+ [0x3184]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER KAPYEOUNPHIEUPH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1157 },
+ unicodeslot=0x3184,
+ },
+ [0x3185]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER SSANGHIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1158 },
+ unicodeslot=0x3185,
+ },
+ [0x3186]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YEORINHIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1159 },
+ unicodeslot=0x3186,
+ },
+ [0x3187]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YO-YA",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1184 },
+ unicodeslot=0x3187,
+ },
+ [0x3188]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YO-YAE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1185 },
+ unicodeslot=0x3188,
+ },
+ [0x3189]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YO-I",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1188 },
+ unicodeslot=0x3189,
+ },
+ [0x318A]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YU-YEO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1191 },
+ unicodeslot=0x318A,
+ },
+ [0x318B]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YU-YE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1192 },
+ unicodeslot=0x318B,
+ },
+ [0x318C]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER YU-I",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x1194 },
+ unicodeslot=0x318C,
+ },
+ [0x318D]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER ARAEA",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x119E },
+ unicodeslot=0x318D,
+ },
+ [0x318E]={
+ category="lo",
+ cjkwd="w",
+ description="HANGUL LETTER ARAEAE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x11A1 },
+ unicodeslot=0x318E,
+ },
+ [0x3190]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION LINKING MARK",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3190,
+ },
+ [0x3191]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION REVERSE MARK",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3191,
+ },
+ [0x3192]={
+ category="no",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION ONE MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E00 },
+ unicodeslot=0x3192,
+ },
+ [0x3193]={
+ category="no",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION TWO MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E8C },
+ unicodeslot=0x3193,
+ },
+ [0x3194]={
+ category="no",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION THREE MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E09 },
+ unicodeslot=0x3194,
+ },
+ [0x3195]={
+ category="no",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION FOUR MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x56DB },
+ unicodeslot=0x3195,
+ },
+ [0x3196]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION TOP MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E0A },
+ unicodeslot=0x3196,
+ },
+ [0x3197]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION MIDDLE MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E2D },
+ unicodeslot=0x3197,
+ },
+ [0x3198]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION BOTTOM MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E0B },
+ unicodeslot=0x3198,
+ },
+ [0x3199]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION FIRST MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x7532 },
+ unicodeslot=0x3199,
+ },
+ [0x319A]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION SECOND MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E59 },
+ unicodeslot=0x319A,
+ },
+ [0x319B]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION THIRD MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E19 },
+ unicodeslot=0x319B,
+ },
+ [0x319C]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION FOURTH MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4E01 },
+ unicodeslot=0x319C,
+ },
+ [0x319D]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION HEAVEN MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x5929 },
+ unicodeslot=0x319D,
+ },
+ [0x319E]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION EARTH MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x5730 },
+ unicodeslot=0x319E,
+ },
+ [0x319F]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC ANNOTATION MAN MARK",
+ direction="l",
+ linebreak="id",
+ specials={ "super", 0x4EBA },
+ unicodeslot=0x319F,
+ },
+ [0x31A0]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER BU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A0,
+ },
+ [0x31A1]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ZI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A1,
+ },
+ [0x31A2]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER JI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A2,
+ },
+ [0x31A3]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER GU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A3,
+ },
+ [0x31A4]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER EE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A4,
+ },
+ [0x31A5]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ENN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A5,
+ },
+ [0x31A6]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER OO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A6,
+ },
+ [0x31A7]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ONN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A7,
+ },
+ [0x31A8]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER IR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A8,
+ },
+ [0x31A9]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ANN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31A9,
+ },
+ [0x31AA]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER INN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31AA,
+ },
+ [0x31AB]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER UNN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31AB,
+ },
+ [0x31AC]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER IM",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31AC,
+ },
+ [0x31AD]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER NGG",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31AD,
+ },
+ [0x31AE]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER AINN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31AE,
+ },
+ [0x31AF]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER AUNN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31AF,
+ },
+ [0x31B0]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER AM",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B0,
+ },
+ [0x31B1]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER OM",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B1,
+ },
+ [0x31B2]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER ONG",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B2,
+ },
+ [0x31B3]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO LETTER INNN",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B3,
+ },
+ [0x31B4]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO FINAL LETTER P",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B4,
+ },
+ [0x31B5]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO FINAL LETTER T",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B5,
+ },
+ [0x31B6]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO FINAL LETTER K",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B6,
+ },
+ [0x31B7]={
+ category="lo",
+ cjkwd="w",
+ description="BOPOMOFO FINAL LETTER H",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x31B7,
+ },
+ [0x31C0]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE T",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C0,
+ },
+ [0x31C1]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE WG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C1,
+ },
+ [0x31C2]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE XG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C2,
+ },
+ [0x31C3]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE BXG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C3,
+ },
+ [0x31C4]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE SW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C4,
+ },
+ [0x31C5]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HZZ",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C5,
+ },
+ [0x31C6]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HZG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C6,
+ },
+ [0x31C7]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C7,
+ },
+ [0x31C8]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HZWG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C8,
+ },
+ [0x31C9]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE SZWG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31C9,
+ },
+ [0x31CA]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HZT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31CA,
+ },
+ [0x31CB]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HZZP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31CB,
+ },
+ [0x31CC]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HPWG",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31CC,
+ },
+ [0x31CD]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HZW",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31CD,
+ },
+ [0x31CE]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE HZZZ",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31CE,
+ },
+ [0x31CF]={
+ category="so",
+ cjkwd="w",
+ description="CJK STROKE N",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0x31CF,
+ },
+ [0x31F0]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL KU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F0,
+ },
+ [0x31F1]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL SI",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F1,
+ },
+ [0x31F2]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL SU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F2,
+ },
+ [0x31F3]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL TO",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F3,
+ },
+ [0x31F4]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL NU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F4,
+ },
+ [0x31F5]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL HA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F5,
+ },
+ [0x31F6]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL HI",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F6,
+ },
+ [0x31F7]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL HU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F7,
+ },
+ [0x31F8]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL HE",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F8,
+ },
+ [0x31F9]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL HO",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31F9,
+ },
+ [0x31FA]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL MU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31FA,
+ },
+ [0x31FB]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL RA",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31FB,
+ },
+ [0x31FC]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL RI",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31FC,
+ },
+ [0x31FD]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL RU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31FD,
+ },
+ [0x31FE]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL RE",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31FE,
+ },
+ [0x31FF]={
+ category="lo",
+ cjkwd="w",
+ description="KATAKANA LETTER SMALL RO",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0x31FF,
+ },
+ [0x3200]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL KIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1100, 0x0029 },
+ unicodeslot=0x3200,
+ },
+ [0x3201]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL NIEUN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1102, 0x0029 },
+ unicodeslot=0x3201,
+ },
+ [0x3202]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1103, 0x0029 },
+ unicodeslot=0x3202,
+ },
+ [0x3203]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL RIEUL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1105, 0x0029 },
+ unicodeslot=0x3203,
+ },
+ [0x3204]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL MIEUM",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1106, 0x0029 },
+ unicodeslot=0x3204,
+ },
+ [0x3205]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL PIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1107, 0x0029 },
+ unicodeslot=0x3205,
+ },
+ [0x3206]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1109, 0x0029 },
+ unicodeslot=0x3206,
+ },
+ [0x3207]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL IEUNG",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110B, 0x0029 },
+ unicodeslot=0x3207,
+ },
+ [0x3208]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL CIEUC",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110C, 0x0029 },
+ unicodeslot=0x3208,
+ },
+ [0x3209]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL CHIEUCH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110E, 0x0029 },
+ unicodeslot=0x3209,
+ },
+ [0x320A]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL KHIEUKH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110F, 0x0029 },
+ unicodeslot=0x320A,
+ },
+ [0x320B]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL THIEUTH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1110, 0x0029 },
+ unicodeslot=0x320B,
+ },
+ [0x320C]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL PHIEUPH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1111, 0x0029 },
+ unicodeslot=0x320C,
+ },
+ [0x320D]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL HIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1112, 0x0029 },
+ unicodeslot=0x320D,
+ },
+ [0x320E]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL KIYEOK A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1100, 0x1161, 0x0029 },
+ unicodeslot=0x320E,
+ },
+ [0x320F]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL NIEUN A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1102, 0x1161, 0x0029 },
+ unicodeslot=0x320F,
+ },
+ [0x3210]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL TIKEUT A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1103, 0x1161, 0x0029 },
+ unicodeslot=0x3210,
+ },
+ [0x3211]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL RIEUL A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1105, 0x1161, 0x0029 },
+ unicodeslot=0x3211,
+ },
+ [0x3212]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL MIEUM A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1106, 0x1161, 0x0029 },
+ unicodeslot=0x3212,
+ },
+ [0x3213]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL PIEUP A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1107, 0x1161, 0x0029 },
+ unicodeslot=0x3213,
+ },
+ [0x3214]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL SIOS A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1109, 0x1161, 0x0029 },
+ unicodeslot=0x3214,
+ },
+ [0x3215]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL IEUNG A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110B, 0x1161, 0x0029 },
+ unicodeslot=0x3215,
+ },
+ [0x3216]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL CIEUC A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110C, 0x1161, 0x0029 },
+ unicodeslot=0x3216,
+ },
+ [0x3217]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL CHIEUCH A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110E, 0x1161, 0x0029 },
+ unicodeslot=0x3217,
+ },
+ [0x3218]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL KHIEUKH A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110F, 0x1161, 0x0029 },
+ unicodeslot=0x3218,
+ },
+ [0x3219]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL THIEUTH A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1110, 0x1161, 0x0029 },
+ unicodeslot=0x3219,
+ },
+ [0x321A]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL PHIEUPH A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1111, 0x1161, 0x0029 },
+ unicodeslot=0x321A,
+ },
+ [0x321B]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL HIEUH A",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x1112, 0x1161, 0x0029 },
+ unicodeslot=0x321B,
+ },
+ [0x321C]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED HANGUL CIEUC U",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110C, 0x116E, 0x0029 },
+ unicodeslot=0x321C,
+ },
+ [0x321D]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED KOREAN CHARACTER OJEON",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, 0x0029 },
+ unicodeslot=0x321D,
+ },
+ [0x321E]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED KOREAN CHARACTER O HU",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029 },
+ unicodeslot=0x321E,
+ },
+ [0x3220]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH ONE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4E00, 0x0029 },
+ unicodeslot=0x3220,
+ },
+ [0x3221]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH TWO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4E8C, 0x0029 },
+ unicodeslot=0x3221,
+ },
+ [0x3222]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH THREE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4E09, 0x0029 },
+ unicodeslot=0x3222,
+ },
+ [0x3223]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH FOUR",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x56DB, 0x0029 },
+ unicodeslot=0x3223,
+ },
+ [0x3224]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH FIVE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4E94, 0x0029 },
+ unicodeslot=0x3224,
+ },
+ [0x3225]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH SIX",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x516D, 0x0029 },
+ unicodeslot=0x3225,
+ },
+ [0x3226]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH SEVEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4E03, 0x0029 },
+ unicodeslot=0x3226,
+ },
+ [0x3227]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH EIGHT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x516B, 0x0029 },
+ unicodeslot=0x3227,
+ },
+ [0x3228]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH NINE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4E5D, 0x0029 },
+ unicodeslot=0x3228,
+ },
+ [0x3229]={
+ category="no",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH TEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x5341, 0x0029 },
+ unicodeslot=0x3229,
+ },
+ [0x322A]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH MOON",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x6708, 0x0029 },
+ unicodeslot=0x322A,
+ },
+ [0x322B]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH FIRE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x706B, 0x0029 },
+ unicodeslot=0x322B,
+ },
+ [0x322C]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH WATER",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x6C34, 0x0029 },
+ unicodeslot=0x322C,
+ },
+ [0x322D]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH WOOD",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x6728, 0x0029 },
+ unicodeslot=0x322D,
+ },
+ [0x322E]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH METAL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x91D1, 0x0029 },
+ unicodeslot=0x322E,
+ },
+ [0x322F]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH EARTH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x571F, 0x0029 },
+ unicodeslot=0x322F,
+ },
+ [0x3230]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH SUN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x65E5, 0x0029 },
+ unicodeslot=0x3230,
+ },
+ [0x3231]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH STOCK",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x682A, 0x0029 },
+ unicodeslot=0x3231,
+ },
+ [0x3232]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH HAVE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x6709, 0x0029 },
+ unicodeslot=0x3232,
+ },
+ [0x3233]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH SOCIETY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x793E, 0x0029 },
+ unicodeslot=0x3233,
+ },
+ [0x3234]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH NAME",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x540D, 0x0029 },
+ unicodeslot=0x3234,
+ },
+ [0x3235]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH SPECIAL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x7279, 0x0029 },
+ unicodeslot=0x3235,
+ },
+ [0x3236]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH FINANCIAL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x8CA1, 0x0029 },
+ unicodeslot=0x3236,
+ },
+ [0x3237]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH CONGRATULATION",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x795D, 0x0029 },
+ unicodeslot=0x3237,
+ },
+ [0x3238]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH LABOR",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x52B4, 0x0029 },
+ unicodeslot=0x3238,
+ },
+ [0x3239]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH REPRESENT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4EE3, 0x0029 },
+ unicodeslot=0x3239,
+ },
+ [0x323A]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH CALL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x547C, 0x0029 },
+ unicodeslot=0x323A,
+ },
+ [0x323B]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH STUDY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x5B66, 0x0029 },
+ unicodeslot=0x323B,
+ },
+ [0x323C]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH SUPERVISE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x76E3, 0x0029 },
+ unicodeslot=0x323C,
+ },
+ [0x323D]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH ENTERPRISE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4F01, 0x0029 },
+ unicodeslot=0x323D,
+ },
+ [0x323E]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH RESOURCE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x8CC7, 0x0029 },
+ unicodeslot=0x323E,
+ },
+ [0x323F]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH ALLIANCE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x5354, 0x0029 },
+ unicodeslot=0x323F,
+ },
+ [0x3240]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH FESTIVAL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x796D, 0x0029 },
+ unicodeslot=0x3240,
+ },
+ [0x3241]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH REST",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x4F11, 0x0029 },
+ unicodeslot=0x3241,
+ },
+ [0x3242]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH SELF",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x81EA, 0x0029 },
+ unicodeslot=0x3242,
+ },
+ [0x3243]={
+ category="so",
+ cjkwd="w",
+ description="PARENTHESIZED IDEOGRAPH REACH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0028, 0x81F3, 0x0029 },
+ unicodeslot=0x3243,
+ },
+ [0x3250]={
+ category="so",
+ cjkwd="w",
+ description="PARTNERSHIP SIGN",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0050, 0x0054, 0x0045 },
+ unicodeslot=0x3250,
+ },
+ [0x3251]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY ONE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0031 },
+ unicodeslot=0x3251,
+ },
+ [0x3252]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY TWO",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0032 },
+ unicodeslot=0x3252,
+ },
+ [0x3253]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY THREE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0033 },
+ unicodeslot=0x3253,
+ },
+ [0x3254]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY FOUR",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0034 },
+ unicodeslot=0x3254,
+ },
+ [0x3255]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY FIVE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0035 },
+ unicodeslot=0x3255,
+ },
+ [0x3256]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY SIX",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0036 },
+ unicodeslot=0x3256,
+ },
+ [0x3257]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY SEVEN",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0037 },
+ unicodeslot=0x3257,
+ },
+ [0x3258]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY EIGHT",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0038 },
+ unicodeslot=0x3258,
+ },
+ [0x3259]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER TWENTY NINE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0032, 0x0039 },
+ unicodeslot=0x3259,
+ },
+ [0x325A]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0030 },
+ unicodeslot=0x325A,
+ },
+ [0x325B]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY ONE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0031 },
+ unicodeslot=0x325B,
+ },
+ [0x325C]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY TWO",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0032 },
+ unicodeslot=0x325C,
+ },
+ [0x325D]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY THREE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0033 },
+ unicodeslot=0x325D,
+ },
+ [0x325E]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY FOUR",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0034 },
+ unicodeslot=0x325E,
+ },
+ [0x325F]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY FIVE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0035 },
+ unicodeslot=0x325F,
+ },
+ [0x3260]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL KIYEOK",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1100 },
+ unicodeslot=0x3260,
+ },
+ [0x3261]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL NIEUN",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1102 },
+ unicodeslot=0x3261,
+ },
+ [0x3262]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL TIKEUT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1103 },
+ unicodeslot=0x3262,
+ },
+ [0x3263]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL RIEUL",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1105 },
+ unicodeslot=0x3263,
+ },
+ [0x3264]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL MIEUM",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1106 },
+ unicodeslot=0x3264,
+ },
+ [0x3265]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL PIEUP",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1107 },
+ unicodeslot=0x3265,
+ },
+ [0x3266]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL SIOS",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1109 },
+ unicodeslot=0x3266,
+ },
+ [0x3267]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL IEUNG",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110B },
+ unicodeslot=0x3267,
+ },
+ [0x3268]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL CIEUC",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110C },
+ unicodeslot=0x3268,
+ },
+ [0x3269]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL CHIEUCH",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110E },
+ unicodeslot=0x3269,
+ },
+ [0x326A]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL KHIEUKH",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110F },
+ unicodeslot=0x326A,
+ },
+ [0x326B]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL THIEUTH",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1110 },
+ unicodeslot=0x326B,
+ },
+ [0x326C]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL PHIEUPH",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1111 },
+ unicodeslot=0x326C,
+ },
+ [0x326D]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL HIEUH",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1112 },
+ unicodeslot=0x326D,
+ },
+ [0x326E]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL KIYEOK A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1100, 0x1161 },
+ unicodeslot=0x326E,
+ },
+ [0x326F]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL NIEUN A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1102, 0x1161 },
+ unicodeslot=0x326F,
+ },
+ [0x3270]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL TIKEUT A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1103, 0x1161 },
+ unicodeslot=0x3270,
+ },
+ [0x3271]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL RIEUL A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1105, 0x1161 },
+ unicodeslot=0x3271,
+ },
+ [0x3272]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL MIEUM A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1106, 0x1161 },
+ unicodeslot=0x3272,
+ },
+ [0x3273]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL PIEUP A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1107, 0x1161 },
+ unicodeslot=0x3273,
+ },
+ [0x3274]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL SIOS A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1109, 0x1161 },
+ unicodeslot=0x3274,
+ },
+ [0x3275]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL IEUNG A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110B, 0x1161 },
+ unicodeslot=0x3275,
+ },
+ [0x3276]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL CIEUC A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110C, 0x1161 },
+ unicodeslot=0x3276,
+ },
+ [0x3277]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL CHIEUCH A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110E, 0x1161 },
+ unicodeslot=0x3277,
+ },
+ [0x3278]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL KHIEUKH A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x110F, 0x1161 },
+ unicodeslot=0x3278,
+ },
+ [0x3279]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL THIEUTH A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1110, 0x1161 },
+ unicodeslot=0x3279,
+ },
+ [0x327A]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL PHIEUPH A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1111, 0x1161 },
+ unicodeslot=0x327A,
+ },
+ [0x327B]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL HIEUH A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x1112, 0x1161 },
+ unicodeslot=0x327B,
+ },
+ [0x327C]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KOREAN CHARACTER CHAMKO",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169 },
+ unicodeslot=0x327C,
+ },
+ [0x327D]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KOREAN CHARACTER JUEUI",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x110C, 0x116E, 0x110B, 0x1174 },
+ unicodeslot=0x327D,
+ },
+ [0x327E]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED HANGUL IEUNG U",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x110B, 0x116E },
+ unicodeslot=0x327E,
+ },
+ [0x327F]={
+ category="so",
+ cjkwd="w",
+ description="KOREAN STANDARD SYMBOL",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x327F,
+ },
+ [0x3280]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH ONE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E00 },
+ unicodeslot=0x3280,
+ },
+ [0x3281]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH TWO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E8C },
+ unicodeslot=0x3281,
+ },
+ [0x3282]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH THREE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E09 },
+ unicodeslot=0x3282,
+ },
+ [0x3283]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH FOUR",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x56DB },
+ unicodeslot=0x3283,
+ },
+ [0x3284]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH FIVE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E94 },
+ unicodeslot=0x3284,
+ },
+ [0x3285]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SIX",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x516D },
+ unicodeslot=0x3285,
+ },
+ [0x3286]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SEVEN",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E03 },
+ unicodeslot=0x3286,
+ },
+ [0x3287]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH EIGHT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x516B },
+ unicodeslot=0x3287,
+ },
+ [0x3288]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH NINE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E5D },
+ unicodeslot=0x3288,
+ },
+ [0x3289]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH TEN",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5341 },
+ unicodeslot=0x3289,
+ },
+ [0x328A]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH MOON",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x6708 },
+ unicodeslot=0x328A,
+ },
+ [0x328B]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH FIRE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x706B },
+ unicodeslot=0x328B,
+ },
+ [0x328C]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH WATER",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x6C34 },
+ unicodeslot=0x328C,
+ },
+ [0x328D]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH WOOD",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x6728 },
+ unicodeslot=0x328D,
+ },
+ [0x328E]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH METAL",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x91D1 },
+ unicodeslot=0x328E,
+ },
+ [0x328F]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH EARTH",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x571F },
+ unicodeslot=0x328F,
+ },
+ [0x3290]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SUN",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x65E5 },
+ unicodeslot=0x3290,
+ },
+ [0x3291]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH STOCK",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x682A },
+ unicodeslot=0x3291,
+ },
+ [0x3292]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH HAVE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x6709 },
+ unicodeslot=0x3292,
+ },
+ [0x3293]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SOCIETY",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x793E },
+ unicodeslot=0x3293,
+ },
+ [0x3294]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH NAME",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x540D },
+ unicodeslot=0x3294,
+ },
+ [0x3295]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SPECIAL",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x7279 },
+ unicodeslot=0x3295,
+ },
+ [0x3296]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH FINANCIAL",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x8CA1 },
+ unicodeslot=0x3296,
+ },
+ [0x3297]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH CONGRATULATION",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x795D },
+ unicodeslot=0x3297,
+ },
+ [0x3298]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH LABOR",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x52B4 },
+ unicodeslot=0x3298,
+ },
+ [0x3299]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SECRET",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x79D8 },
+ unicodeslot=0x3299,
+ },
+ [0x329A]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH MALE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x7537 },
+ unicodeslot=0x329A,
+ },
+ [0x329B]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH FEMALE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5973 },
+ unicodeslot=0x329B,
+ },
+ [0x329C]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SUITABLE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x9069 },
+ unicodeslot=0x329C,
+ },
+ [0x329D]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH EXCELLENT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x512A },
+ unicodeslot=0x329D,
+ },
+ [0x329E]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH PRINT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5370 },
+ unicodeslot=0x329E,
+ },
+ [0x329F]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH ATTENTION",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x6CE8 },
+ unicodeslot=0x329F,
+ },
+ [0x32A0]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH ITEM",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x9805 },
+ unicodeslot=0x32A0,
+ },
+ [0x32A1]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH REST",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4F11 },
+ unicodeslot=0x32A1,
+ },
+ [0x32A2]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH COPY",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5199 },
+ unicodeslot=0x32A2,
+ },
+ [0x32A3]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH CORRECT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x6B63 },
+ unicodeslot=0x32A3,
+ },
+ [0x32A4]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH HIGH",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E0A },
+ unicodeslot=0x32A4,
+ },
+ [0x32A5]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH CENTRE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E2D },
+ unicodeslot=0x32A5,
+ },
+ [0x32A6]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH LOW",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4E0B },
+ unicodeslot=0x32A6,
+ },
+ [0x32A7]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH LEFT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5DE6 },
+ unicodeslot=0x32A7,
+ },
+ [0x32A8]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH RIGHT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x53F3 },
+ unicodeslot=0x32A8,
+ },
+ [0x32A9]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH MEDICINE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x533B },
+ unicodeslot=0x32A9,
+ },
+ [0x32AA]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH RELIGION",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5B97 },
+ unicodeslot=0x32AA,
+ },
+ [0x32AB]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH STUDY",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5B66 },
+ unicodeslot=0x32AB,
+ },
+ [0x32AC]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH SUPERVISE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x76E3 },
+ unicodeslot=0x32AC,
+ },
+ [0x32AD]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH ENTERPRISE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x4F01 },
+ unicodeslot=0x32AD,
+ },
+ [0x32AE]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH RESOURCE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x8CC7 },
+ unicodeslot=0x32AE,
+ },
+ [0x32AF]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH ALLIANCE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x5354 },
+ unicodeslot=0x32AF,
+ },
+ [0x32B0]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED IDEOGRAPH NIGHT",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x591C },
+ unicodeslot=0x32B0,
+ },
+ [0x32B1]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY SIX",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0036 },
+ unicodeslot=0x32B1,
+ },
+ [0x32B2]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY SEVEN",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0037 },
+ unicodeslot=0x32B2,
+ },
+ [0x32B3]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY EIGHT",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0038 },
+ unicodeslot=0x32B3,
+ },
+ [0x32B4]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER THIRTY NINE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0033, 0x0039 },
+ unicodeslot=0x32B4,
+ },
+ [0x32B5]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0030 },
+ unicodeslot=0x32B5,
+ },
+ [0x32B6]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY ONE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0031 },
+ unicodeslot=0x32B6,
+ },
+ [0x32B7]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY TWO",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0032 },
+ unicodeslot=0x32B7,
+ },
+ [0x32B8]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY THREE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0033 },
+ unicodeslot=0x32B8,
+ },
+ [0x32B9]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY FOUR",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0034 },
+ unicodeslot=0x32B9,
+ },
+ [0x32BA]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY FIVE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0035 },
+ unicodeslot=0x32BA,
+ },
+ [0x32BB]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY SIX",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0036 },
+ unicodeslot=0x32BB,
+ },
+ [0x32BC]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY SEVEN",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0037 },
+ unicodeslot=0x32BC,
+ },
+ [0x32BD]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY EIGHT",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0038 },
+ unicodeslot=0x32BD,
+ },
+ [0x32BE]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FORTY NINE",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0034, 0x0039 },
+ unicodeslot=0x32BE,
+ },
+ [0x32BF]={
+ category="no",
+ cjkwd="w",
+ description="CIRCLED NUMBER FIFTY",
+ direction="on",
+ linebreak="id",
+ specials={ "circle", 0x0035, 0x0030 },
+ unicodeslot=0x32BF,
+ },
+ [0x32C0]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x6708 },
+ unicodeslot=0x32C0,
+ },
+ [0x32C1]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x6708 },
+ unicodeslot=0x32C1,
+ },
+ [0x32C2]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0033, 0x6708 },
+ unicodeslot=0x32C2,
+ },
+ [0x32C3]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0034, 0x6708 },
+ unicodeslot=0x32C3,
+ },
+ [0x32C4]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0035, 0x6708 },
+ unicodeslot=0x32C4,
+ },
+ [0x32C5]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0036, 0x6708 },
+ unicodeslot=0x32C5,
+ },
+ [0x32C6]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0037, 0x6708 },
+ unicodeslot=0x32C6,
+ },
+ [0x32C7]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0038, 0x6708 },
+ unicodeslot=0x32C7,
+ },
+ [0x32C8]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0039, 0x6708 },
+ unicodeslot=0x32C8,
+ },
+ [0x32C9]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0030, 0x6708 },
+ unicodeslot=0x32C9,
+ },
+ [0x32CA]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0031, 0x6708 },
+ unicodeslot=0x32CA,
+ },
+ [0x32CB]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0032, 0x6708 },
+ unicodeslot=0x32CB,
+ },
+ [0x32CC]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HG",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0048, 0x0067 },
+ unicodeslot=0x32CC,
+ },
+ [0x32CD]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ERG",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0065, 0x0072, 0x0067 },
+ unicodeslot=0x32CD,
+ },
+ [0x32CE]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE EV",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0065, 0x0056 },
+ unicodeslot=0x32CE,
+ },
+ [0x32CF]={
+ category="so",
+ cjkwd="w",
+ description="LIMITED LIABILITY SIGN",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x004C, 0x0054, 0x0044 },
+ unicodeslot=0x32CF,
+ },
+ [0x32D0]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA A",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30A2 },
+ unicodeslot=0x32D0,
+ },
+ [0x32D1]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA I",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30A4 },
+ unicodeslot=0x32D1,
+ },
+ [0x32D2]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA U",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30A6 },
+ unicodeslot=0x32D2,
+ },
+ [0x32D3]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA E",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30A8 },
+ unicodeslot=0x32D3,
+ },
+ [0x32D4]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA O",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30AA },
+ unicodeslot=0x32D4,
+ },
+ [0x32D5]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA KA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30AB },
+ unicodeslot=0x32D5,
+ },
+ [0x32D6]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA KI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30AD },
+ unicodeslot=0x32D6,
+ },
+ [0x32D7]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA KU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30AF },
+ unicodeslot=0x32D7,
+ },
+ [0x32D8]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA KE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30B1 },
+ unicodeslot=0x32D8,
+ },
+ [0x32D9]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA KO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30B3 },
+ unicodeslot=0x32D9,
+ },
+ [0x32DA]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA SA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30B5 },
+ unicodeslot=0x32DA,
+ },
+ [0x32DB]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA SI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30B7 },
+ unicodeslot=0x32DB,
+ },
+ [0x32DC]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA SU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30B9 },
+ unicodeslot=0x32DC,
+ },
+ [0x32DD]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA SE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30BB },
+ unicodeslot=0x32DD,
+ },
+ [0x32DE]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA SO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30BD },
+ unicodeslot=0x32DE,
+ },
+ [0x32DF]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA TA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30BF },
+ unicodeslot=0x32DF,
+ },
+ [0x32E0]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA TI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30C1 },
+ unicodeslot=0x32E0,
+ },
+ [0x32E1]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA TU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30C4 },
+ unicodeslot=0x32E1,
+ },
+ [0x32E2]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA TE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30C6 },
+ unicodeslot=0x32E2,
+ },
+ [0x32E3]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA TO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30C8 },
+ unicodeslot=0x32E3,
+ },
+ [0x32E4]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA NA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30CA },
+ unicodeslot=0x32E4,
+ },
+ [0x32E5]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA NI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30CB },
+ unicodeslot=0x32E5,
+ },
+ [0x32E6]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA NU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30CC },
+ unicodeslot=0x32E6,
+ },
+ [0x32E7]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA NE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30CD },
+ unicodeslot=0x32E7,
+ },
+ [0x32E8]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA NO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30CE },
+ unicodeslot=0x32E8,
+ },
+ [0x32E9]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA HA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30CF },
+ unicodeslot=0x32E9,
+ },
+ [0x32EA]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA HI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30D2 },
+ unicodeslot=0x32EA,
+ },
+ [0x32EB]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA HU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30D5 },
+ unicodeslot=0x32EB,
+ },
+ [0x32EC]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA HE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30D8 },
+ unicodeslot=0x32EC,
+ },
+ [0x32ED]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA HO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30DB },
+ unicodeslot=0x32ED,
+ },
+ [0x32EE]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA MA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30DE },
+ unicodeslot=0x32EE,
+ },
+ [0x32EF]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA MI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30DF },
+ unicodeslot=0x32EF,
+ },
+ [0x32F0]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA MU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30E0 },
+ unicodeslot=0x32F0,
+ },
+ [0x32F1]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA ME",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30E1 },
+ unicodeslot=0x32F1,
+ },
+ [0x32F2]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA MO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30E2 },
+ unicodeslot=0x32F2,
+ },
+ [0x32F3]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA YA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30E4 },
+ unicodeslot=0x32F3,
+ },
+ [0x32F4]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA YU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30E6 },
+ unicodeslot=0x32F4,
+ },
+ [0x32F5]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA YO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30E8 },
+ unicodeslot=0x32F5,
+ },
+ [0x32F6]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA RA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30E9 },
+ unicodeslot=0x32F6,
+ },
+ [0x32F7]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA RI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30EA },
+ unicodeslot=0x32F7,
+ },
+ [0x32F8]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA RU",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30EB },
+ unicodeslot=0x32F8,
+ },
+ [0x32F9]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA RE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30EC },
+ unicodeslot=0x32F9,
+ },
+ [0x32FA]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA RO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30ED },
+ unicodeslot=0x32FA,
+ },
+ [0x32FB]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA WA",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30EF },
+ unicodeslot=0x32FB,
+ },
+ [0x32FC]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA WI",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30F0 },
+ unicodeslot=0x32FC,
+ },
+ [0x32FD]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA WE",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30F1 },
+ unicodeslot=0x32FD,
+ },
+ [0x32FE]={
+ category="so",
+ cjkwd="w",
+ description="CIRCLED KATAKANA WO",
+ direction="l",
+ linebreak="id",
+ specials={ "circle", 0x30F2 },
+ unicodeslot=0x32FE,
+ },
+ [0x3300]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE APAATO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A2, 0x30D1, 0x30FC, 0x30C8 },
+ unicodeslot=0x3300,
+ },
+ [0x3301]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ARUHUA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A2, 0x30EB, 0x30D5, 0x30A1 },
+ unicodeslot=0x3301,
+ },
+ [0x3302]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ANPEA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A2, 0x30F3, 0x30DA, 0x30A2 },
+ unicodeslot=0x3302,
+ },
+ [0x3303]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE AARU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A2, 0x30FC, 0x30EB },
+ unicodeslot=0x3303,
+ },
+ [0x3304]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ININGU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A4, 0x30CB, 0x30F3, 0x30B0 },
+ unicodeslot=0x3304,
+ },
+ [0x3305]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE INTI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A4, 0x30F3, 0x30C1 },
+ unicodeslot=0x3305,
+ },
+ [0x3306]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE UON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A6, 0x30A9, 0x30F3 },
+ unicodeslot=0x3306,
+ },
+ [0x3307]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ESUKUUDO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9 },
+ unicodeslot=0x3307,
+ },
+ [0x3308]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE EEKAA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30A8, 0x30FC, 0x30AB, 0x30FC },
+ unicodeslot=0x3308,
+ },
+ [0x3309]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ONSU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AA, 0x30F3, 0x30B9 },
+ unicodeslot=0x3309,
+ },
+ [0x330A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE OOMU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AA, 0x30FC, 0x30E0 },
+ unicodeslot=0x330A,
+ },
+ [0x330B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KAIRI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AB, 0x30A4, 0x30EA },
+ unicodeslot=0x330B,
+ },
+ [0x330C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KARATTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AB, 0x30E9, 0x30C3, 0x30C8 },
+ unicodeslot=0x330C,
+ },
+ [0x330D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KARORII",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AB, 0x30ED, 0x30EA, 0x30FC },
+ unicodeslot=0x330D,
+ },
+ [0x330E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GARON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AC, 0x30ED, 0x30F3 },
+ unicodeslot=0x330E,
+ },
+ [0x330F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GANMA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AC, 0x30F3, 0x30DE },
+ unicodeslot=0x330F,
+ },
+ [0x3310]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GIGA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AE, 0x30AC },
+ unicodeslot=0x3310,
+ },
+ [0x3311]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GINII",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AE, 0x30CB, 0x30FC },
+ unicodeslot=0x3311,
+ },
+ [0x3312]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KYURII",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AD, 0x30E5, 0x30EA, 0x30FC },
+ unicodeslot=0x3312,
+ },
+ [0x3313]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GIRUDAA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AE, 0x30EB, 0x30C0, 0x30FC },
+ unicodeslot=0x3313,
+ },
+ [0x3314]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KIRO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AD, 0x30ED },
+ unicodeslot=0x3314,
+ },
+ [0x3315]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KIROGURAMU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0 },
+ unicodeslot=0x3315,
+ },
+ [0x3316]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KIROMEETORU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB },
+ unicodeslot=0x3316,
+ },
+ [0x3317]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KIROWATTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8 },
+ unicodeslot=0x3317,
+ },
+ [0x3318]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GURAMU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B0, 0x30E9, 0x30E0 },
+ unicodeslot=0x3318,
+ },
+ [0x3319]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GURAMUTON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3 },
+ unicodeslot=0x3319,
+ },
+ [0x331A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KURUZEIRO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED },
+ unicodeslot=0x331A,
+ },
+ [0x331B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KUROONE",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30AF, 0x30ED, 0x30FC, 0x30CD },
+ unicodeslot=0x331B,
+ },
+ [0x331C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KEESU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B1, 0x30FC, 0x30B9 },
+ unicodeslot=0x331C,
+ },
+ [0x331D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KORUNA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B3, 0x30EB, 0x30CA },
+ unicodeslot=0x331D,
+ },
+ [0x331E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KOOPO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B3, 0x30FC, 0x30DD },
+ unicodeslot=0x331E,
+ },
+ [0x331F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE SAIKURU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B5, 0x30A4, 0x30AF, 0x30EB },
+ unicodeslot=0x331F,
+ },
+ [0x3320]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE SANTIIMU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0 },
+ unicodeslot=0x3320,
+ },
+ [0x3321]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE SIRINGU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30B7, 0x30EA, 0x30F3, 0x30B0 },
+ unicodeslot=0x3321,
+ },
+ [0x3322]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE SENTI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30BB, 0x30F3, 0x30C1 },
+ unicodeslot=0x3322,
+ },
+ [0x3323]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE SENTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30BB, 0x30F3, 0x30C8 },
+ unicodeslot=0x3323,
+ },
+ [0x3324]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DAASU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30C0, 0x30FC, 0x30B9 },
+ unicodeslot=0x3324,
+ },
+ [0x3325]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DESI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30C7, 0x30B7 },
+ unicodeslot=0x3325,
+ },
+ [0x3326]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DORU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30C9, 0x30EB },
+ unicodeslot=0x3326,
+ },
+ [0x3327]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE TON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30C8, 0x30F3 },
+ unicodeslot=0x3327,
+ },
+ [0x3328]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NANO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30CA, 0x30CE },
+ unicodeslot=0x3328,
+ },
+ [0x3329]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NOTTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30CE, 0x30C3, 0x30C8 },
+ unicodeslot=0x3329,
+ },
+ [0x332A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HAITU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30CF, 0x30A4, 0x30C4 },
+ unicodeslot=0x332A,
+ },
+ [0x332B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PAASENTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8 },
+ unicodeslot=0x332B,
+ },
+ [0x332C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PAATU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D1, 0x30FC, 0x30C4 },
+ unicodeslot=0x332C,
+ },
+ [0x332D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE BAARERU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D0, 0x30FC, 0x30EC, 0x30EB },
+ unicodeslot=0x332D,
+ },
+ [0x332E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PIASUTORU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB },
+ unicodeslot=0x332E,
+ },
+ [0x332F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PIKURU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D4, 0x30AF, 0x30EB },
+ unicodeslot=0x332F,
+ },
+ [0x3330]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PIKO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D4, 0x30B3 },
+ unicodeslot=0x3330,
+ },
+ [0x3331]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE BIRU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D3, 0x30EB },
+ unicodeslot=0x3331,
+ },
+ [0x3332]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HUARADDO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9 },
+ unicodeslot=0x3332,
+ },
+ [0x3333]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HUIITO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D5, 0x30A3, 0x30FC, 0x30C8 },
+ unicodeslot=0x3333,
+ },
+ [0x3334]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE BUSSYERU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB },
+ unicodeslot=0x3334,
+ },
+ [0x3335]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HURAN",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D5, 0x30E9, 0x30F3 },
+ unicodeslot=0x3335,
+ },
+ [0x3336]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HEKUTAARU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB },
+ unicodeslot=0x3336,
+ },
+ [0x3337]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PESO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DA, 0x30BD },
+ unicodeslot=0x3337,
+ },
+ [0x3338]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PENIHI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DA, 0x30CB, 0x30D2 },
+ unicodeslot=0x3338,
+ },
+ [0x3339]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HERUTU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D8, 0x30EB, 0x30C4 },
+ unicodeslot=0x3339,
+ },
+ [0x333A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PENSU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DA, 0x30F3, 0x30B9 },
+ unicodeslot=0x333A,
+ },
+ [0x333B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PEEZI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DA, 0x30FC, 0x30B8 },
+ unicodeslot=0x333B,
+ },
+ [0x333C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE BEETA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30D9, 0x30FC, 0x30BF },
+ unicodeslot=0x333C,
+ },
+ [0x333D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE POINTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DD, 0x30A4, 0x30F3, 0x30C8 },
+ unicodeslot=0x333D,
+ },
+ [0x333E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE BORUTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DC, 0x30EB, 0x30C8 },
+ unicodeslot=0x333E,
+ },
+ [0x333F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DB, 0x30F3 },
+ unicodeslot=0x333F,
+ },
+ [0x3340]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PONDO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DD, 0x30F3, 0x30C9 },
+ unicodeslot=0x3340,
+ },
+ [0x3341]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HOORU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DB, 0x30FC, 0x30EB },
+ unicodeslot=0x3341,
+ },
+ [0x3342]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HOON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DB, 0x30FC, 0x30F3 },
+ unicodeslot=0x3342,
+ },
+ [0x3343]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MAIKURO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DE, 0x30A4, 0x30AF, 0x30ED },
+ unicodeslot=0x3343,
+ },
+ [0x3344]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MAIRU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DE, 0x30A4, 0x30EB },
+ unicodeslot=0x3344,
+ },
+ [0x3345]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MAHHA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DE, 0x30C3, 0x30CF },
+ unicodeslot=0x3345,
+ },
+ [0x3346]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MARUKU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DE, 0x30EB, 0x30AF },
+ unicodeslot=0x3346,
+ },
+ [0x3347]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MANSYON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3 },
+ unicodeslot=0x3347,
+ },
+ [0x3348]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MIKURON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DF, 0x30AF, 0x30ED, 0x30F3 },
+ unicodeslot=0x3348,
+ },
+ [0x3349]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MIRI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DF, 0x30EA },
+ unicodeslot=0x3349,
+ },
+ [0x334A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MIRIBAARU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB },
+ unicodeslot=0x334A,
+ },
+ [0x334B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MEGA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30E1, 0x30AC },
+ unicodeslot=0x334B,
+ },
+ [0x334C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MEGATON",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30E1, 0x30AC, 0x30C8, 0x30F3 },
+ unicodeslot=0x334C,
+ },
+ [0x334D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MEETORU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30E1, 0x30FC, 0x30C8, 0x30EB },
+ unicodeslot=0x334D,
+ },
+ [0x334E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE YAADO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30E4, 0x30FC, 0x30C9 },
+ unicodeslot=0x334E,
+ },
+ [0x334F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE YAARU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30E4, 0x30FC, 0x30EB },
+ unicodeslot=0x334F,
+ },
+ [0x3350]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE YUAN",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30E6, 0x30A2, 0x30F3 },
+ unicodeslot=0x3350,
+ },
+ [0x3351]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RITTORU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30EA, 0x30C3, 0x30C8, 0x30EB },
+ unicodeslot=0x3351,
+ },
+ [0x3352]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RIRA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30EA, 0x30E9 },
+ unicodeslot=0x3352,
+ },
+ [0x3353]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RUPII",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30EB, 0x30D4, 0x30FC },
+ unicodeslot=0x3353,
+ },
+ [0x3354]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RUUBURU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30EB, 0x30FC, 0x30D6, 0x30EB },
+ unicodeslot=0x3354,
+ },
+ [0x3355]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE REMU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30EC, 0x30E0 },
+ unicodeslot=0x3355,
+ },
+ [0x3356]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RENTOGEN",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3 },
+ unicodeslot=0x3356,
+ },
+ [0x3357]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE WATTO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x30EF, 0x30C3, 0x30C8 },
+ unicodeslot=0x3357,
+ },
+ [0x3358]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0030, 0x70B9 },
+ unicodeslot=0x3358,
+ },
+ [0x3359]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x70B9 },
+ unicodeslot=0x3359,
+ },
+ [0x335A]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x70B9 },
+ unicodeslot=0x335A,
+ },
+ [0x335B]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0033, 0x70B9 },
+ unicodeslot=0x335B,
+ },
+ [0x335C]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0034, 0x70B9 },
+ unicodeslot=0x335C,
+ },
+ [0x335D]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0035, 0x70B9 },
+ unicodeslot=0x335D,
+ },
+ [0x335E]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0036, 0x70B9 },
+ unicodeslot=0x335E,
+ },
+ [0x335F]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0037, 0x70B9 },
+ unicodeslot=0x335F,
+ },
+ [0x3360]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0038, 0x70B9 },
+ unicodeslot=0x3360,
+ },
+ [0x3361]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0039, 0x70B9 },
+ unicodeslot=0x3361,
+ },
+ [0x3362]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0030, 0x70B9 },
+ unicodeslot=0x3362,
+ },
+ [0x3363]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0031, 0x70B9 },
+ unicodeslot=0x3363,
+ },
+ [0x3364]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0032, 0x70B9 },
+ unicodeslot=0x3364,
+ },
+ [0x3365]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0033, 0x70B9 },
+ unicodeslot=0x3365,
+ },
+ [0x3366]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0034, 0x70B9 },
+ unicodeslot=0x3366,
+ },
+ [0x3367]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0035, 0x70B9 },
+ unicodeslot=0x3367,
+ },
+ [0x3368]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0036, 0x70B9 },
+ unicodeslot=0x3368,
+ },
+ [0x3369]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0037, 0x70B9 },
+ unicodeslot=0x3369,
+ },
+ [0x336A]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0038, 0x70B9 },
+ unicodeslot=0x336A,
+ },
+ [0x336B]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0039, 0x70B9 },
+ unicodeslot=0x336B,
+ },
+ [0x336C]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0030, 0x70B9 },
+ unicodeslot=0x336C,
+ },
+ [0x336D]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0031, 0x70B9 },
+ unicodeslot=0x336D,
+ },
+ [0x336E]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0032, 0x70B9 },
+ unicodeslot=0x336E,
+ },
+ [0x336F]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0033, 0x70B9 },
+ unicodeslot=0x336F,
+ },
+ [0x3370]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0034, 0x70B9 },
+ unicodeslot=0x3370,
+ },
+ [0x3371]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HPA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0068, 0x0050, 0x0061 },
+ unicodeslot=0x3371,
+ },
+ [0x3372]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0064, 0x0061 },
+ unicodeslot=0x3372,
+ },
+ [0x3373]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE AU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0041, 0x0055 },
+ unicodeslot=0x3373,
+ },
+ [0x3374]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE BAR",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0062, 0x0061, 0x0072 },
+ unicodeslot=0x3374,
+ },
+ [0x3375]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE OV",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006F, 0x0056 },
+ unicodeslot=0x3375,
+ },
+ [0x3376]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PC",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0070, 0x0063 },
+ unicodeslot=0x3376,
+ },
+ [0x3377]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DM",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0064, 0x006D },
+ unicodeslot=0x3377,
+ },
+ [0x3378]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DM SQUARED",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0064, 0x006D, 0x00B2 },
+ unicodeslot=0x3378,
+ },
+ [0x3379]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DM CUBED",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0064, 0x006D, 0x00B3 },
+ unicodeslot=0x3379,
+ },
+ [0x337A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE IU",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0049, 0x0055 },
+ unicodeslot=0x337A,
+ },
+ [0x337B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ERA NAME HEISEI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x5E73, 0x6210 },
+ unicodeslot=0x337B,
+ },
+ [0x337C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ERA NAME SYOUWA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x662D, 0x548C },
+ unicodeslot=0x337C,
+ },
+ [0x337D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ERA NAME TAISYOU",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x5927, 0x6B63 },
+ unicodeslot=0x337D,
+ },
+ [0x337E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ERA NAME MEIZI",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x660E, 0x6CBB },
+ unicodeslot=0x337E,
+ },
+ [0x337F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CORPORATION",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x682A, 0x5F0F, 0x4F1A, 0x793E },
+ unicodeslot=0x337F,
+ },
+ [0x3380]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PA AMPS",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0070, 0x0041 },
+ unicodeslot=0x3380,
+ },
+ [0x3381]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006E, 0x0041 },
+ unicodeslot=0x3381,
+ },
+ [0x3382]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU A",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x0041 },
+ unicodeslot=0x3382,
+ },
+ [0x3383]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x0041 },
+ unicodeslot=0x3383,
+ },
+ [0x3384]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0041 },
+ unicodeslot=0x3384,
+ },
+ [0x3385]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KB",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004B, 0x0042 },
+ unicodeslot=0x3385,
+ },
+ [0x3386]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MB",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004D, 0x0042 },
+ unicodeslot=0x3386,
+ },
+ [0x3387]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GB",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0047, 0x0042 },
+ unicodeslot=0x3387,
+ },
+ [0x3388]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CAL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0063, 0x0061, 0x006C },
+ unicodeslot=0x3388,
+ },
+ [0x3389]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KCAL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0063, 0x0061, 0x006C },
+ unicodeslot=0x3389,
+ },
+ [0x338A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PF",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0070, 0x0046 },
+ unicodeslot=0x338A,
+ },
+ [0x338B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NF",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006E, 0x0046 },
+ unicodeslot=0x338B,
+ },
+ [0x338C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU F",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x0046 },
+ unicodeslot=0x338C,
+ },
+ [0x338D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU G",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x0067 },
+ unicodeslot=0x338D,
+ },
+ [0x338E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MG",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x0067 },
+ unicodeslot=0x338E,
+ },
+ [0x338F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KG",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0067 },
+ unicodeslot=0x338F,
+ },
+ [0x3390]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HZ",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0048, 0x007A },
+ unicodeslot=0x3390,
+ },
+ [0x3391]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KHZ",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0048, 0x007A },
+ unicodeslot=0x3391,
+ },
+ [0x3392]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MHZ",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004D, 0x0048, 0x007A },
+ unicodeslot=0x3392,
+ },
+ [0x3393]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GHZ",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0047, 0x0048, 0x007A },
+ unicodeslot=0x3393,
+ },
+ [0x3394]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE THZ",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0054, 0x0048, 0x007A },
+ unicodeslot=0x3394,
+ },
+ [0x3395]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU L",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x2113 },
+ unicodeslot=0x3395,
+ },
+ [0x3396]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE ML",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x2113 },
+ unicodeslot=0x3396,
+ },
+ [0x3397]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0064, 0x2113 },
+ unicodeslot=0x3397,
+ },
+ [0x3398]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x2113 },
+ unicodeslot=0x3398,
+ },
+ [0x3399]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE FM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0066, 0x006D },
+ unicodeslot=0x3399,
+ },
+ [0x339A]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006E, 0x006D },
+ unicodeslot=0x339A,
+ },
+ [0x339B]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU M",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x006D },
+ unicodeslot=0x339B,
+ },
+ [0x339C]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x006D },
+ unicodeslot=0x339C,
+ },
+ [0x339D]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0063, 0x006D },
+ unicodeslot=0x339D,
+ },
+ [0x339E]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x006D },
+ unicodeslot=0x339E,
+ },
+ [0x339F]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MM SQUARED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x006D, 0x00B2 },
+ unicodeslot=0x339F,
+ },
+ [0x33A0]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CM SQUARED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0063, 0x006D, 0x00B2 },
+ unicodeslot=0x33A0,
+ },
+ [0x33A1]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE M SQUARED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x00B2 },
+ unicodeslot=0x33A1,
+ },
+ [0x33A2]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KM SQUARED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x006D, 0x00B2 },
+ unicodeslot=0x33A2,
+ },
+ [0x33A3]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MM CUBED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x006D, 0x00B3 },
+ unicodeslot=0x33A3,
+ },
+ [0x33A4]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CM CUBED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0063, 0x006D, 0x00B3 },
+ unicodeslot=0x33A4,
+ },
+ [0x33A5]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE M CUBED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x00B3 },
+ unicodeslot=0x33A5,
+ },
+ [0x33A6]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KM CUBED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x006D, 0x00B3 },
+ unicodeslot=0x33A6,
+ },
+ [0x33A7]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE M OVER S",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x2215, 0x0073 },
+ unicodeslot=0x33A7,
+ },
+ [0x33A8]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE M OVER S SQUARED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x2215, 0x0073, 0x00B2 },
+ unicodeslot=0x33A8,
+ },
+ [0x33A9]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0050, 0x0061 },
+ unicodeslot=0x33A9,
+ },
+ [0x33AA]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KPA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0050, 0x0061 },
+ unicodeslot=0x33AA,
+ },
+ [0x33AB]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MPA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004D, 0x0050, 0x0061 },
+ unicodeslot=0x33AB,
+ },
+ [0x33AC]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GPA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0047, 0x0050, 0x0061 },
+ unicodeslot=0x33AC,
+ },
+ [0x33AD]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RAD",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0072, 0x0061, 0x0064 },
+ unicodeslot=0x33AD,
+ },
+ [0x33AE]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RAD OVER S",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0072, 0x0061, 0x0064, 0x2215, 0x0073 },
+ unicodeslot=0x33AE,
+ },
+ [0x33AF]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE RAD OVER S SQUARED",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2 },
+ unicodeslot=0x33AF,
+ },
+ [0x33B0]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PS",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0070, 0x0073 },
+ unicodeslot=0x33B0,
+ },
+ [0x33B1]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NS",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006E, 0x0073 },
+ unicodeslot=0x33B1,
+ },
+ [0x33B2]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU S",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x0073 },
+ unicodeslot=0x33B2,
+ },
+ [0x33B3]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MS",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x0073 },
+ unicodeslot=0x33B3,
+ },
+ [0x33B4]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PV",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0070, 0x0056 },
+ unicodeslot=0x33B4,
+ },
+ [0x33B5]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NV",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006E, 0x0056 },
+ unicodeslot=0x33B5,
+ },
+ [0x33B6]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU V",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x0056 },
+ unicodeslot=0x33B6,
+ },
+ [0x33B7]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MV",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x0056 },
+ unicodeslot=0x33B7,
+ },
+ [0x33B8]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KV",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0056 },
+ unicodeslot=0x33B8,
+ },
+ [0x33B9]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MV MEGA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004D, 0x0056 },
+ unicodeslot=0x33B9,
+ },
+ [0x33BA]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PW",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0070, 0x0057 },
+ unicodeslot=0x33BA,
+ },
+ [0x33BB]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE NW",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006E, 0x0057 },
+ unicodeslot=0x33BB,
+ },
+ [0x33BC]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MU W",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x03BC, 0x0057 },
+ unicodeslot=0x33BC,
+ },
+ [0x33BD]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MW",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x0057 },
+ unicodeslot=0x33BD,
+ },
+ [0x33BE]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KW",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0057 },
+ unicodeslot=0x33BE,
+ },
+ [0x33BF]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MW MEGA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004D, 0x0057 },
+ unicodeslot=0x33BF,
+ },
+ [0x33C0]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE K OHM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x03A9 },
+ unicodeslot=0x33C0,
+ },
+ [0x33C1]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE M OHM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004D, 0x03A9 },
+ unicodeslot=0x33C1,
+ },
+ [0x33C2]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE AM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0061, 0x002E, 0x006D, 0x002E },
+ unicodeslot=0x33C2,
+ },
+ [0x33C3]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE BQ",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0042, 0x0071 },
+ unicodeslot=0x33C3,
+ },
+ [0x33C4]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CC",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0063, 0x0063 },
+ unicodeslot=0x33C4,
+ },
+ [0x33C5]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CD",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0063, 0x0064 },
+ unicodeslot=0x33C5,
+ },
+ [0x33C6]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE C OVER KG",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0043, 0x2215, 0x006B, 0x0067 },
+ unicodeslot=0x33C6,
+ },
+ [0x33C7]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE CO",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0043, 0x006F, 0x002E },
+ unicodeslot=0x33C7,
+ },
+ [0x33C8]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE DB",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0064, 0x0042 },
+ unicodeslot=0x33C8,
+ },
+ [0x33C9]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GY",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0047, 0x0079 },
+ unicodeslot=0x33C9,
+ },
+ [0x33CA]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HA",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0068, 0x0061 },
+ unicodeslot=0x33CA,
+ },
+ [0x33CB]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE HP",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0048, 0x0050 },
+ unicodeslot=0x33CB,
+ },
+ [0x33CC]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE IN",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0069, 0x006E },
+ unicodeslot=0x33CC,
+ },
+ [0x33CD]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KK",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004B, 0x004B },
+ unicodeslot=0x33CD,
+ },
+ [0x33CE]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KM CAPITAL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x004B, 0x004D },
+ unicodeslot=0x33CE,
+ },
+ [0x33CF]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE KT",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006B, 0x0074 },
+ unicodeslot=0x33CF,
+ },
+ [0x33D0]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE LM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006C, 0x006D },
+ unicodeslot=0x33D0,
+ },
+ [0x33D1]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE LN",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006C, 0x006E },
+ unicodeslot=0x33D1,
+ },
+ [0x33D2]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE LOG",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006C, 0x006F, 0x0067 },
+ unicodeslot=0x33D2,
+ },
+ [0x33D3]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE LX",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006C, 0x0078 },
+ unicodeslot=0x33D3,
+ },
+ [0x33D4]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MB SMALL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x0062 },
+ unicodeslot=0x33D4,
+ },
+ [0x33D5]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MIL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x0069, 0x006C },
+ unicodeslot=0x33D5,
+ },
+ [0x33D6]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE MOL",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x006D, 0x006F, 0x006C },
+ unicodeslot=0x33D6,
+ },
+ [0x33D7]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PH",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0050, 0x0048 },
+ unicodeslot=0x33D7,
+ },
+ [0x33D8]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0070, 0x002E, 0x006D, 0x002E },
+ unicodeslot=0x33D8,
+ },
+ [0x33D9]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PPM",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0050, 0x0050, 0x004D },
+ unicodeslot=0x33D9,
+ },
+ [0x33DA]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE PR",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0050, 0x0052 },
+ unicodeslot=0x33DA,
+ },
+ [0x33DB]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE SR",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0073, 0x0072 },
+ unicodeslot=0x33DB,
+ },
+ [0x33DC]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE SV",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0053, 0x0076 },
+ unicodeslot=0x33DC,
+ },
+ [0x33DD]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE WB",
+ direction="l",
+ linebreak="id",
+ specials={ "square", 0x0057, 0x0062 },
+ unicodeslot=0x33DD,
+ },
+ [0x33DE]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE V OVER M",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0056, 0x2215, 0x006D },
+ unicodeslot=0x33DE,
+ },
+ [0x33DF]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE A OVER M",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0041, 0x2215, 0x006D },
+ unicodeslot=0x33DF,
+ },
+ [0x33E0]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x65E5 },
+ unicodeslot=0x33E0,
+ },
+ [0x33E1]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x65E5 },
+ unicodeslot=0x33E1,
+ },
+ [0x33E2]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0033, 0x65E5 },
+ unicodeslot=0x33E2,
+ },
+ [0x33E3]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0034, 0x65E5 },
+ unicodeslot=0x33E3,
+ },
+ [0x33E4]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0035, 0x65E5 },
+ unicodeslot=0x33E4,
+ },
+ [0x33E5]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0036, 0x65E5 },
+ unicodeslot=0x33E5,
+ },
+ [0x33E6]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0037, 0x65E5 },
+ unicodeslot=0x33E6,
+ },
+ [0x33E7]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0038, 0x65E5 },
+ unicodeslot=0x33E7,
+ },
+ [0x33E8]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0039, 0x65E5 },
+ unicodeslot=0x33E8,
+ },
+ [0x33E9]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0030, 0x65E5 },
+ unicodeslot=0x33E9,
+ },
+ [0x33EA]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0031, 0x65E5 },
+ unicodeslot=0x33EA,
+ },
+ [0x33EB]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0032, 0x65E5 },
+ unicodeslot=0x33EB,
+ },
+ [0x33EC]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0033, 0x65E5 },
+ unicodeslot=0x33EC,
+ },
+ [0x33ED]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0034, 0x65E5 },
+ unicodeslot=0x33ED,
+ },
+ [0x33EE]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0035, 0x65E5 },
+ unicodeslot=0x33EE,
+ },
+ [0x33EF]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0036, 0x65E5 },
+ unicodeslot=0x33EF,
+ },
+ [0x33F0]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0037, 0x65E5 },
+ unicodeslot=0x33F0,
+ },
+ [0x33F1]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0038, 0x65E5 },
+ unicodeslot=0x33F1,
+ },
+ [0x33F2]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0031, 0x0039, 0x65E5 },
+ unicodeslot=0x33F2,
+ },
+ [0x33F3]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0030, 0x65E5 },
+ unicodeslot=0x33F3,
+ },
+ [0x33F4]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0031, 0x65E5 },
+ unicodeslot=0x33F4,
+ },
+ [0x33F5]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0032, 0x65E5 },
+ unicodeslot=0x33F5,
+ },
+ [0x33F6]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0033, 0x65E5 },
+ unicodeslot=0x33F6,
+ },
+ [0x33F7]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0034, 0x65E5 },
+ unicodeslot=0x33F7,
+ },
+ [0x33F8]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0035, 0x65E5 },
+ unicodeslot=0x33F8,
+ },
+ [0x33F9]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0036, 0x65E5 },
+ unicodeslot=0x33F9,
+ },
+ [0x33FA]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0037, 0x65E5 },
+ unicodeslot=0x33FA,
+ },
+ [0x33FB]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0038, 0x65E5 },
+ unicodeslot=0x33FB,
+ },
+ [0x33FC]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0032, 0x0039, 0x65E5 },
+ unicodeslot=0x33FC,
+ },
+ [0x33FD]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0033, 0x0030, 0x65E5 },
+ unicodeslot=0x33FD,
+ },
+ [0x33FE]={
+ category="so",
+ cjkwd="w",
+ description="IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE",
+ direction="l",
+ linebreak="id",
+ specials={ "compat", 0x0033, 0x0031, 0x65E5 },
+ unicodeslot=0x33FE,
+ },
+ [0x33FF]={
+ category="so",
+ cjkwd="w",
+ description="SQUARE GAL",
+ direction="on",
+ linebreak="id",
+ specials={ "square", 0x0067, 0x0061, 0x006C },
+ unicodeslot=0x33FF,
+ },
+ [0x3400]={
+ category="lo",
+ cjkwd="w",
+ description="<CJK Ideograph Extension A>",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x3400,
+ range= 0x4DB5,
+ },
+ [0x4DC0]={
+ category="so",
+ description="HEXAGRAM FOR THE CREATIVE HEAVEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC0,
+ },
+ [0x4DC1]={
+ category="so",
+ description="HEXAGRAM FOR THE RECEPTIVE EARTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC1,
+ },
+ [0x4DC2]={
+ category="so",
+ description="HEXAGRAM FOR DIFFICULTY AT THE BEGINNING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC2,
+ },
+ [0x4DC3]={
+ category="so",
+ description="HEXAGRAM FOR YOUTHFUL FOLLY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC3,
+ },
+ [0x4DC4]={
+ category="so",
+ description="HEXAGRAM FOR WAITING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC4,
+ },
+ [0x4DC5]={
+ category="so",
+ description="HEXAGRAM FOR CONFLICT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC5,
+ },
+ [0x4DC6]={
+ category="so",
+ description="HEXAGRAM FOR THE ARMY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC6,
+ },
+ [0x4DC7]={
+ category="so",
+ description="HEXAGRAM FOR HOLDING TOGETHER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC7,
+ },
+ [0x4DC8]={
+ category="so",
+ description="HEXAGRAM FOR SMALL TAMING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC8,
+ },
+ [0x4DC9]={
+ category="so",
+ description="HEXAGRAM FOR TREADING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DC9,
+ },
+ [0x4DCA]={
+ category="so",
+ description="HEXAGRAM FOR PEACE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DCA,
+ },
+ [0x4DCB]={
+ category="so",
+ description="HEXAGRAM FOR STANDSTILL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DCB,
+ },
+ [0x4DCC]={
+ category="so",
+ description="HEXAGRAM FOR FELLOWSHIP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DCC,
+ },
+ [0x4DCD]={
+ category="so",
+ description="HEXAGRAM FOR GREAT POSSESSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DCD,
+ },
+ [0x4DCE]={
+ category="so",
+ description="HEXAGRAM FOR MODESTY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DCE,
+ },
+ [0x4DCF]={
+ category="so",
+ description="HEXAGRAM FOR ENTHUSIASM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DCF,
+ },
+ [0x4DD0]={
+ category="so",
+ description="HEXAGRAM FOR FOLLOWING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD0,
+ },
+ [0x4DD1]={
+ category="so",
+ description="HEXAGRAM FOR WORK ON THE DECAYED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD1,
+ },
+ [0x4DD2]={
+ category="so",
+ description="HEXAGRAM FOR APPROACH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD2,
+ },
+ [0x4DD3]={
+ category="so",
+ description="HEXAGRAM FOR CONTEMPLATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD3,
+ },
+ [0x4DD4]={
+ category="so",
+ description="HEXAGRAM FOR BITING THROUGH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD4,
+ },
+ [0x4DD5]={
+ category="so",
+ description="HEXAGRAM FOR GRACE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD5,
+ },
+ [0x4DD6]={
+ category="so",
+ description="HEXAGRAM FOR SPLITTING APART",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD6,
+ },
+ [0x4DD7]={
+ category="so",
+ description="HEXAGRAM FOR RETURN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD7,
+ },
+ [0x4DD8]={
+ category="so",
+ description="HEXAGRAM FOR INNOCENCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD8,
+ },
+ [0x4DD9]={
+ category="so",
+ description="HEXAGRAM FOR GREAT TAMING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DD9,
+ },
+ [0x4DDA]={
+ category="so",
+ description="HEXAGRAM FOR MOUTH CORNERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DDA,
+ },
+ [0x4DDB]={
+ category="so",
+ description="HEXAGRAM FOR GREAT PREPONDERANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DDB,
+ },
+ [0x4DDC]={
+ category="so",
+ description="HEXAGRAM FOR THE ABYSMAL WATER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DDC,
+ },
+ [0x4DDD]={
+ category="so",
+ description="HEXAGRAM FOR THE CLINGING FIRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DDD,
+ },
+ [0x4DDE]={
+ category="so",
+ description="HEXAGRAM FOR INFLUENCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DDE,
+ },
+ [0x4DDF]={
+ category="so",
+ description="HEXAGRAM FOR DURATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DDF,
+ },
+ [0x4DE0]={
+ category="so",
+ description="HEXAGRAM FOR RETREAT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE0,
+ },
+ [0x4DE1]={
+ category="so",
+ description="HEXAGRAM FOR GREAT POWER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE1,
+ },
+ [0x4DE2]={
+ category="so",
+ description="HEXAGRAM FOR PROGRESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE2,
+ },
+ [0x4DE3]={
+ category="so",
+ description="HEXAGRAM FOR DARKENING OF THE LIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE3,
+ },
+ [0x4DE4]={
+ category="so",
+ description="HEXAGRAM FOR THE FAMILY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE4,
+ },
+ [0x4DE5]={
+ category="so",
+ description="HEXAGRAM FOR OPPOSITION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE5,
+ },
+ [0x4DE6]={
+ category="so",
+ description="HEXAGRAM FOR OBSTRUCTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE6,
+ },
+ [0x4DE7]={
+ category="so",
+ description="HEXAGRAM FOR DELIVERANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE7,
+ },
+ [0x4DE8]={
+ category="so",
+ description="HEXAGRAM FOR DECREASE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE8,
+ },
+ [0x4DE9]={
+ category="so",
+ description="HEXAGRAM FOR INCREASE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DE9,
+ },
+ [0x4DEA]={
+ category="so",
+ description="HEXAGRAM FOR BREAKTHROUGH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DEA,
+ },
+ [0x4DEB]={
+ category="so",
+ description="HEXAGRAM FOR COMING TO MEET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DEB,
+ },
+ [0x4DEC]={
+ category="so",
+ description="HEXAGRAM FOR GATHERING TOGETHER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DEC,
+ },
+ [0x4DED]={
+ category="so",
+ description="HEXAGRAM FOR PUSHING UPWARD",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DED,
+ },
+ [0x4DEE]={
+ category="so",
+ description="HEXAGRAM FOR OPPRESSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DEE,
+ },
+ [0x4DEF]={
+ category="so",
+ description="HEXAGRAM FOR THE WELL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DEF,
+ },
+ [0x4DF0]={
+ category="so",
+ description="HEXAGRAM FOR REVOLUTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF0,
+ },
+ [0x4DF1]={
+ category="so",
+ description="HEXAGRAM FOR THE CAULDRON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF1,
+ },
+ [0x4DF2]={
+ category="so",
+ description="HEXAGRAM FOR THE AROUSING THUNDER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF2,
+ },
+ [0x4DF3]={
+ category="so",
+ description="HEXAGRAM FOR THE KEEPING STILL MOUNTAIN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF3,
+ },
+ [0x4DF4]={
+ category="so",
+ description="HEXAGRAM FOR DEVELOPMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF4,
+ },
+ [0x4DF5]={
+ category="so",
+ description="HEXAGRAM FOR THE MARRYING MAIDEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF5,
+ },
+ [0x4DF6]={
+ category="so",
+ description="HEXAGRAM FOR ABUNDANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF6,
+ },
+ [0x4DF7]={
+ category="so",
+ description="HEXAGRAM FOR THE WANDERER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF7,
+ },
+ [0x4DF8]={
+ category="so",
+ description="HEXAGRAM FOR THE GENTLE WIND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF8,
+ },
+ [0x4DF9]={
+ category="so",
+ description="HEXAGRAM FOR THE JOYOUS LAKE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DF9,
+ },
+ [0x4DFA]={
+ category="so",
+ description="HEXAGRAM FOR DISPERSION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DFA,
+ },
+ [0x4DFB]={
+ category="so",
+ description="HEXAGRAM FOR LIMITATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DFB,
+ },
+ [0x4DFC]={
+ category="so",
+ description="HEXAGRAM FOR INNER TRUTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DFC,
+ },
+ [0x4DFD]={
+ category="so",
+ description="HEXAGRAM FOR SMALL PREPONDERANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DFD,
+ },
+ [0x4DFE]={
+ category="so",
+ description="HEXAGRAM FOR AFTER COMPLETION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DFE,
+ },
+ [0x4DFF]={
+ category="so",
+ description="HEXAGRAM FOR BEFORE COMPLETION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x4DFF,
+ },
+ [0x4E00]={
+ category="lo",
+ cjkwd="w",
+ description="<CJK Ideograph>",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x4E00,
+ range=0x9FBB,
+ },
+ [0xA000]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE IT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA000,
+ },
+ [0xA001]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE IX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA001,
+ },
+ [0xA002]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE I",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA002,
+ },
+ [0xA003]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE IP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA003,
+ },
+ [0xA004]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE IET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA004,
+ },
+ [0xA005]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE IEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA005,
+ },
+ [0xA006]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE IE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA006,
+ },
+ [0xA007]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE IEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA007,
+ },
+ [0xA008]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE AT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA008,
+ },
+ [0xA009]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE AX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA009,
+ },
+ [0xA00A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE A",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA00A,
+ },
+ [0xA00B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE AP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA00B,
+ },
+ [0xA00C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE UOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA00C,
+ },
+ [0xA00D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE UO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA00D,
+ },
+ [0xA00E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE UOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA00E,
+ },
+ [0xA00F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE OT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA00F,
+ },
+ [0xA010]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE OX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA010,
+ },
+ [0xA011]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE O",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA011,
+ },
+ [0xA012]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE OP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA012,
+ },
+ [0xA013]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE EX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA013,
+ },
+ [0xA014]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE E",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA014,
+ },
+ [0xA015]={
+ category="lm",
+ cjkwd="w",
+ description="YI SYLLABLE WU",
+ direction="l",
+ linebreak="ns",
+ unicodeslot=0xA015,
+ },
+ [0xA016]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA016,
+ },
+ [0xA017]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA017,
+ },
+ [0xA018]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA018,
+ },
+ [0xA019]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA019,
+ },
+ [0xA01A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA01A,
+ },
+ [0xA01B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA01B,
+ },
+ [0xA01C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA01C,
+ },
+ [0xA01D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA01D,
+ },
+ [0xA01E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA01E,
+ },
+ [0xA01F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA01F,
+ },
+ [0xA020]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA020,
+ },
+ [0xA021]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA021,
+ },
+ [0xA022]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA022,
+ },
+ [0xA023]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA023,
+ },
+ [0xA024]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA024,
+ },
+ [0xA025]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA025,
+ },
+ [0xA026]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA026,
+ },
+ [0xA027]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA027,
+ },
+ [0xA028]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA028,
+ },
+ [0xA029]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA029,
+ },
+ [0xA02A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA02A,
+ },
+ [0xA02B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA02B,
+ },
+ [0xA02C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA02C,
+ },
+ [0xA02D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA02D,
+ },
+ [0xA02E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA02E,
+ },
+ [0xA02F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA02F,
+ },
+ [0xA030]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA030,
+ },
+ [0xA031]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA031,
+ },
+ [0xA032]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA032,
+ },
+ [0xA033]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA033,
+ },
+ [0xA034]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA034,
+ },
+ [0xA035]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA035,
+ },
+ [0xA036]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA036,
+ },
+ [0xA037]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA037,
+ },
+ [0xA038]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA038,
+ },
+ [0xA039]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA039,
+ },
+ [0xA03A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA03A,
+ },
+ [0xA03B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA03B,
+ },
+ [0xA03C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA03C,
+ },
+ [0xA03D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA03D,
+ },
+ [0xA03E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA03E,
+ },
+ [0xA03F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA03F,
+ },
+ [0xA040]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA040,
+ },
+ [0xA041]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA041,
+ },
+ [0xA042]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA042,
+ },
+ [0xA043]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA043,
+ },
+ [0xA044]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA044,
+ },
+ [0xA045]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA045,
+ },
+ [0xA046]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE POT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA046,
+ },
+ [0xA047]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE POX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA047,
+ },
+ [0xA048]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA048,
+ },
+ [0xA049]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE POP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA049,
+ },
+ [0xA04A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA04A,
+ },
+ [0xA04B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA04B,
+ },
+ [0xA04C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA04C,
+ },
+ [0xA04D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA04D,
+ },
+ [0xA04E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA04E,
+ },
+ [0xA04F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA04F,
+ },
+ [0xA050]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA050,
+ },
+ [0xA051]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA051,
+ },
+ [0xA052]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA052,
+ },
+ [0xA053]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA053,
+ },
+ [0xA054]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA054,
+ },
+ [0xA055]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE PYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA055,
+ },
+ [0xA056]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA056,
+ },
+ [0xA057]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA057,
+ },
+ [0xA058]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA058,
+ },
+ [0xA059]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA059,
+ },
+ [0xA05A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA05A,
+ },
+ [0xA05B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA05B,
+ },
+ [0xA05C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA05C,
+ },
+ [0xA05D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA05D,
+ },
+ [0xA05E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA05E,
+ },
+ [0xA05F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA05F,
+ },
+ [0xA060]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA060,
+ },
+ [0xA061]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA061,
+ },
+ [0xA062]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA062,
+ },
+ [0xA063]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA063,
+ },
+ [0xA064]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA064,
+ },
+ [0xA065]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA065,
+ },
+ [0xA066]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA066,
+ },
+ [0xA067]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA067,
+ },
+ [0xA068]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA068,
+ },
+ [0xA069]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA069,
+ },
+ [0xA06A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA06A,
+ },
+ [0xA06B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA06B,
+ },
+ [0xA06C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA06C,
+ },
+ [0xA06D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA06D,
+ },
+ [0xA06E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA06E,
+ },
+ [0xA06F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA06F,
+ },
+ [0xA070]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA070,
+ },
+ [0xA071]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA071,
+ },
+ [0xA072]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA072,
+ },
+ [0xA073]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA073,
+ },
+ [0xA074]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA074,
+ },
+ [0xA075]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE BBYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA075,
+ },
+ [0xA076]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA076,
+ },
+ [0xA077]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA077,
+ },
+ [0xA078]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA078,
+ },
+ [0xA079]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA079,
+ },
+ [0xA07A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA07A,
+ },
+ [0xA07B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA07B,
+ },
+ [0xA07C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA07C,
+ },
+ [0xA07D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA07D,
+ },
+ [0xA07E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA07E,
+ },
+ [0xA07F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA07F,
+ },
+ [0xA080]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA080,
+ },
+ [0xA081]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA081,
+ },
+ [0xA082]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA082,
+ },
+ [0xA083]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA083,
+ },
+ [0xA084]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA084,
+ },
+ [0xA085]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA085,
+ },
+ [0xA086]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA086,
+ },
+ [0xA087]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA087,
+ },
+ [0xA088]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA088,
+ },
+ [0xA089]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA089,
+ },
+ [0xA08A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA08A,
+ },
+ [0xA08B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA08B,
+ },
+ [0xA08C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA08C,
+ },
+ [0xA08D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA08D,
+ },
+ [0xA08E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA08E,
+ },
+ [0xA08F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA08F,
+ },
+ [0xA090]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NBYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA090,
+ },
+ [0xA091]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA091,
+ },
+ [0xA092]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA092,
+ },
+ [0xA093]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA093,
+ },
+ [0xA094]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA094,
+ },
+ [0xA095]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA095,
+ },
+ [0xA096]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA096,
+ },
+ [0xA097]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA097,
+ },
+ [0xA098]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA098,
+ },
+ [0xA099]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA099,
+ },
+ [0xA09A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA09A,
+ },
+ [0xA09B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA09B,
+ },
+ [0xA09C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA09C,
+ },
+ [0xA09D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA09D,
+ },
+ [0xA09E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA09E,
+ },
+ [0xA09F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA09F,
+ },
+ [0xA0A0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A0,
+ },
+ [0xA0A1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A1,
+ },
+ [0xA0A2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A2,
+ },
+ [0xA0A3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A3,
+ },
+ [0xA0A4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A4,
+ },
+ [0xA0A5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A5,
+ },
+ [0xA0A6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A6,
+ },
+ [0xA0A7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A7,
+ },
+ [0xA0A8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A8,
+ },
+ [0xA0A9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0A9,
+ },
+ [0xA0AA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0AA,
+ },
+ [0xA0AB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0AB,
+ },
+ [0xA0AC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0AC,
+ },
+ [0xA0AD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HMYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0AD,
+ },
+ [0xA0AE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0AE,
+ },
+ [0xA0AF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0AF,
+ },
+ [0xA0B0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B0,
+ },
+ [0xA0B1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B1,
+ },
+ [0xA0B2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B2,
+ },
+ [0xA0B3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B3,
+ },
+ [0xA0B4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B4,
+ },
+ [0xA0B5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B5,
+ },
+ [0xA0B6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B6,
+ },
+ [0xA0B7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B7,
+ },
+ [0xA0B8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B8,
+ },
+ [0xA0B9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0B9,
+ },
+ [0xA0BA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0BA,
+ },
+ [0xA0BB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0BB,
+ },
+ [0xA0BC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0BC,
+ },
+ [0xA0BD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0BD,
+ },
+ [0xA0BE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0BE,
+ },
+ [0xA0BF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0BF,
+ },
+ [0xA0C0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C0,
+ },
+ [0xA0C1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C1,
+ },
+ [0xA0C2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ME",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C2,
+ },
+ [0xA0C3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C3,
+ },
+ [0xA0C4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C4,
+ },
+ [0xA0C5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C5,
+ },
+ [0xA0C6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C6,
+ },
+ [0xA0C7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C7,
+ },
+ [0xA0C8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C8,
+ },
+ [0xA0C9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0C9,
+ },
+ [0xA0CA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0CA,
+ },
+ [0xA0CB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0CB,
+ },
+ [0xA0CC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0CC,
+ },
+ [0xA0CD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0CD,
+ },
+ [0xA0CE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0CE,
+ },
+ [0xA0CF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0CF,
+ },
+ [0xA0D0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D0,
+ },
+ [0xA0D1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D1,
+ },
+ [0xA0D2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D2,
+ },
+ [0xA0D3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D3,
+ },
+ [0xA0D4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D4,
+ },
+ [0xA0D5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D5,
+ },
+ [0xA0D6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D6,
+ },
+ [0xA0D7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D7,
+ },
+ [0xA0D8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D8,
+ },
+ [0xA0D9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0D9,
+ },
+ [0xA0DA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0DA,
+ },
+ [0xA0DB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0DB,
+ },
+ [0xA0DC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0DC,
+ },
+ [0xA0DD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0DD,
+ },
+ [0xA0DE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0DE,
+ },
+ [0xA0DF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0DF,
+ },
+ [0xA0E0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E0,
+ },
+ [0xA0E1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE FYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E1,
+ },
+ [0xA0E2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E2,
+ },
+ [0xA0E3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E3,
+ },
+ [0xA0E4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E4,
+ },
+ [0xA0E5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E5,
+ },
+ [0xA0E6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E6,
+ },
+ [0xA0E7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E7,
+ },
+ [0xA0E8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E8,
+ },
+ [0xA0E9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0E9,
+ },
+ [0xA0EA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0EA,
+ },
+ [0xA0EB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0EB,
+ },
+ [0xA0EC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0EC,
+ },
+ [0xA0ED]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0ED,
+ },
+ [0xA0EE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0EE,
+ },
+ [0xA0EF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0EF,
+ },
+ [0xA0F0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F0,
+ },
+ [0xA0F1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F1,
+ },
+ [0xA0F2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F2,
+ },
+ [0xA0F3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F3,
+ },
+ [0xA0F4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F4,
+ },
+ [0xA0F5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F5,
+ },
+ [0xA0F6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F6,
+ },
+ [0xA0F7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F7,
+ },
+ [0xA0F8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F8,
+ },
+ [0xA0F9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0F9,
+ },
+ [0xA0FA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0FA,
+ },
+ [0xA0FB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0FB,
+ },
+ [0xA0FC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0FC,
+ },
+ [0xA0FD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0FD,
+ },
+ [0xA0FE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0FE,
+ },
+ [0xA0FF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE VYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA0FF,
+ },
+ [0xA100]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA100,
+ },
+ [0xA101]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA101,
+ },
+ [0xA102]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA102,
+ },
+ [0xA103]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA103,
+ },
+ [0xA104]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA104,
+ },
+ [0xA105]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA105,
+ },
+ [0xA106]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA106,
+ },
+ [0xA107]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA107,
+ },
+ [0xA108]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA108,
+ },
+ [0xA109]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA109,
+ },
+ [0xA10A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA10A,
+ },
+ [0xA10B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA10B,
+ },
+ [0xA10C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA10C,
+ },
+ [0xA10D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA10D,
+ },
+ [0xA10E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA10E,
+ },
+ [0xA10F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA10F,
+ },
+ [0xA110]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA110,
+ },
+ [0xA111]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA111,
+ },
+ [0xA112]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA112,
+ },
+ [0xA113]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA113,
+ },
+ [0xA114]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA114,
+ },
+ [0xA115]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA115,
+ },
+ [0xA116]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA116,
+ },
+ [0xA117]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA117,
+ },
+ [0xA118]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA118,
+ },
+ [0xA119]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA119,
+ },
+ [0xA11A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA11A,
+ },
+ [0xA11B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA11B,
+ },
+ [0xA11C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA11C,
+ },
+ [0xA11D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA11D,
+ },
+ [0xA11E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA11E,
+ },
+ [0xA11F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA11F,
+ },
+ [0xA120]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA120,
+ },
+ [0xA121]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA121,
+ },
+ [0xA122]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA122,
+ },
+ [0xA123]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA123,
+ },
+ [0xA124]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA124,
+ },
+ [0xA125]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA125,
+ },
+ [0xA126]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA126,
+ },
+ [0xA127]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA127,
+ },
+ [0xA128]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA128,
+ },
+ [0xA129]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA129,
+ },
+ [0xA12A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA12A,
+ },
+ [0xA12B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA12B,
+ },
+ [0xA12C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA12C,
+ },
+ [0xA12D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA12D,
+ },
+ [0xA12E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA12E,
+ },
+ [0xA12F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA12F,
+ },
+ [0xA130]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA130,
+ },
+ [0xA131]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA131,
+ },
+ [0xA132]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA132,
+ },
+ [0xA133]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA133,
+ },
+ [0xA134]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA134,
+ },
+ [0xA135]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE TUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA135,
+ },
+ [0xA136]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA136,
+ },
+ [0xA137]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA137,
+ },
+ [0xA138]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA138,
+ },
+ [0xA139]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA139,
+ },
+ [0xA13A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA13A,
+ },
+ [0xA13B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA13B,
+ },
+ [0xA13C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA13C,
+ },
+ [0xA13D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA13D,
+ },
+ [0xA13E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA13E,
+ },
+ [0xA13F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA13F,
+ },
+ [0xA140]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA140,
+ },
+ [0xA141]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA141,
+ },
+ [0xA142]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA142,
+ },
+ [0xA143]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA143,
+ },
+ [0xA144]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA144,
+ },
+ [0xA145]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA145,
+ },
+ [0xA146]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA146,
+ },
+ [0xA147]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA147,
+ },
+ [0xA148]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA148,
+ },
+ [0xA149]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA149,
+ },
+ [0xA14A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA14A,
+ },
+ [0xA14B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA14B,
+ },
+ [0xA14C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA14C,
+ },
+ [0xA14D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA14D,
+ },
+ [0xA14E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA14E,
+ },
+ [0xA14F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA14F,
+ },
+ [0xA150]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE DDUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA150,
+ },
+ [0xA151]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA151,
+ },
+ [0xA152]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA152,
+ },
+ [0xA153]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA153,
+ },
+ [0xA154]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA154,
+ },
+ [0xA155]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA155,
+ },
+ [0xA156]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA156,
+ },
+ [0xA157]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA157,
+ },
+ [0xA158]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA158,
+ },
+ [0xA159]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA159,
+ },
+ [0xA15A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA15A,
+ },
+ [0xA15B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA15B,
+ },
+ [0xA15C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA15C,
+ },
+ [0xA15D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA15D,
+ },
+ [0xA15E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA15E,
+ },
+ [0xA15F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA15F,
+ },
+ [0xA160]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA160,
+ },
+ [0xA161]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA161,
+ },
+ [0xA162]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA162,
+ },
+ [0xA163]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA163,
+ },
+ [0xA164]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA164,
+ },
+ [0xA165]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA165,
+ },
+ [0xA166]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA166,
+ },
+ [0xA167]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NDUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA167,
+ },
+ [0xA168]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA168,
+ },
+ [0xA169]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA169,
+ },
+ [0xA16A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA16A,
+ },
+ [0xA16B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA16B,
+ },
+ [0xA16C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA16C,
+ },
+ [0xA16D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA16D,
+ },
+ [0xA16E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA16E,
+ },
+ [0xA16F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA16F,
+ },
+ [0xA170]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA170,
+ },
+ [0xA171]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA171,
+ },
+ [0xA172]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA172,
+ },
+ [0xA173]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA173,
+ },
+ [0xA174]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA174,
+ },
+ [0xA175]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA175,
+ },
+ [0xA176]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA176,
+ },
+ [0xA177]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA177,
+ },
+ [0xA178]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA178,
+ },
+ [0xA179]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA179,
+ },
+ [0xA17A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA17A,
+ },
+ [0xA17B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA17B,
+ },
+ [0xA17C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HNUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA17C,
+ },
+ [0xA17D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA17D,
+ },
+ [0xA17E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA17E,
+ },
+ [0xA17F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA17F,
+ },
+ [0xA180]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA180,
+ },
+ [0xA181]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA181,
+ },
+ [0xA182]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA182,
+ },
+ [0xA183]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA183,
+ },
+ [0xA184]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA184,
+ },
+ [0xA185]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA185,
+ },
+ [0xA186]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA186,
+ },
+ [0xA187]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA187,
+ },
+ [0xA188]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA188,
+ },
+ [0xA189]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA189,
+ },
+ [0xA18A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA18A,
+ },
+ [0xA18B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA18B,
+ },
+ [0xA18C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA18C,
+ },
+ [0xA18D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA18D,
+ },
+ [0xA18E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA18E,
+ },
+ [0xA18F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA18F,
+ },
+ [0xA190]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA190,
+ },
+ [0xA191]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA191,
+ },
+ [0xA192]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA192,
+ },
+ [0xA193]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA193,
+ },
+ [0xA194]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA194,
+ },
+ [0xA195]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA195,
+ },
+ [0xA196]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA196,
+ },
+ [0xA197]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA197,
+ },
+ [0xA198]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA198,
+ },
+ [0xA199]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA199,
+ },
+ [0xA19A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA19A,
+ },
+ [0xA19B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA19B,
+ },
+ [0xA19C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA19C,
+ },
+ [0xA19D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA19D,
+ },
+ [0xA19E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA19E,
+ },
+ [0xA19F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA19F,
+ },
+ [0xA1A0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A0,
+ },
+ [0xA1A1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A1,
+ },
+ [0xA1A2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A2,
+ },
+ [0xA1A3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A3,
+ },
+ [0xA1A4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A4,
+ },
+ [0xA1A5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A5,
+ },
+ [0xA1A6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A6,
+ },
+ [0xA1A7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A7,
+ },
+ [0xA1A8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A8,
+ },
+ [0xA1A9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1A9,
+ },
+ [0xA1AA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1AA,
+ },
+ [0xA1AB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1AB,
+ },
+ [0xA1AC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1AC,
+ },
+ [0xA1AD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1AD,
+ },
+ [0xA1AE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1AE,
+ },
+ [0xA1AF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1AF,
+ },
+ [0xA1B0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B0,
+ },
+ [0xA1B1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B1,
+ },
+ [0xA1B2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B2,
+ },
+ [0xA1B3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B3,
+ },
+ [0xA1B4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B4,
+ },
+ [0xA1B5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B5,
+ },
+ [0xA1B6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HLYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B6,
+ },
+ [0xA1B7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B7,
+ },
+ [0xA1B8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B8,
+ },
+ [0xA1B9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1B9,
+ },
+ [0xA1BA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1BA,
+ },
+ [0xA1BB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1BB,
+ },
+ [0xA1BC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1BC,
+ },
+ [0xA1BD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1BD,
+ },
+ [0xA1BE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1BE,
+ },
+ [0xA1BF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1BF,
+ },
+ [0xA1C0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C0,
+ },
+ [0xA1C1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C1,
+ },
+ [0xA1C2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C2,
+ },
+ [0xA1C3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C3,
+ },
+ [0xA1C4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C4,
+ },
+ [0xA1C5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C5,
+ },
+ [0xA1C6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C6,
+ },
+ [0xA1C7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C7,
+ },
+ [0xA1C8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C8,
+ },
+ [0xA1C9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1C9,
+ },
+ [0xA1CA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1CA,
+ },
+ [0xA1CB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1CB,
+ },
+ [0xA1CC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1CC,
+ },
+ [0xA1CD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1CD,
+ },
+ [0xA1CE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1CE,
+ },
+ [0xA1CF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1CF,
+ },
+ [0xA1D0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D0,
+ },
+ [0xA1D1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D1,
+ },
+ [0xA1D2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D2,
+ },
+ [0xA1D3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D3,
+ },
+ [0xA1D4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D4,
+ },
+ [0xA1D5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D5,
+ },
+ [0xA1D6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D6,
+ },
+ [0xA1D7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D7,
+ },
+ [0xA1D8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D8,
+ },
+ [0xA1D9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE LYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1D9,
+ },
+ [0xA1DA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1DA,
+ },
+ [0xA1DB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1DB,
+ },
+ [0xA1DC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1DC,
+ },
+ [0xA1DD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1DD,
+ },
+ [0xA1DE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1DE,
+ },
+ [0xA1DF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1DF,
+ },
+ [0xA1E0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E0,
+ },
+ [0xA1E1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E1,
+ },
+ [0xA1E2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E2,
+ },
+ [0xA1E3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E3,
+ },
+ [0xA1E4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E4,
+ },
+ [0xA1E5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E5,
+ },
+ [0xA1E6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E6,
+ },
+ [0xA1E7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E7,
+ },
+ [0xA1E8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E8,
+ },
+ [0xA1E9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1E9,
+ },
+ [0xA1EA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1EA,
+ },
+ [0xA1EB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1EB,
+ },
+ [0xA1EC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1EC,
+ },
+ [0xA1ED]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1ED,
+ },
+ [0xA1EE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1EE,
+ },
+ [0xA1EF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1EF,
+ },
+ [0xA1F0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F0,
+ },
+ [0xA1F1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F1,
+ },
+ [0xA1F2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F2,
+ },
+ [0xA1F3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F3,
+ },
+ [0xA1F4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F4,
+ },
+ [0xA1F5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F5,
+ },
+ [0xA1F6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F6,
+ },
+ [0xA1F7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F7,
+ },
+ [0xA1F8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F8,
+ },
+ [0xA1F9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1F9,
+ },
+ [0xA1FA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1FA,
+ },
+ [0xA1FB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1FB,
+ },
+ [0xA1FC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1FC,
+ },
+ [0xA1FD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1FD,
+ },
+ [0xA1FE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1FE,
+ },
+ [0xA1FF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA1FF,
+ },
+ [0xA200]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA200,
+ },
+ [0xA201]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA201,
+ },
+ [0xA202]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA202,
+ },
+ [0xA203]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA203,
+ },
+ [0xA204]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA204,
+ },
+ [0xA205]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA205,
+ },
+ [0xA206]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA206,
+ },
+ [0xA207]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA207,
+ },
+ [0xA208]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA208,
+ },
+ [0xA209]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA209,
+ },
+ [0xA20A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA20A,
+ },
+ [0xA20B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA20B,
+ },
+ [0xA20C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA20C,
+ },
+ [0xA20D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA20D,
+ },
+ [0xA20E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA20E,
+ },
+ [0xA20F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA20F,
+ },
+ [0xA210]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA210,
+ },
+ [0xA211]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA211,
+ },
+ [0xA212]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA212,
+ },
+ [0xA213]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE KUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA213,
+ },
+ [0xA214]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA214,
+ },
+ [0xA215]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA215,
+ },
+ [0xA216]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA216,
+ },
+ [0xA217]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA217,
+ },
+ [0xA218]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA218,
+ },
+ [0xA219]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA219,
+ },
+ [0xA21A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA21A,
+ },
+ [0xA21B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA21B,
+ },
+ [0xA21C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA21C,
+ },
+ [0xA21D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA21D,
+ },
+ [0xA21E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA21E,
+ },
+ [0xA21F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA21F,
+ },
+ [0xA220]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA220,
+ },
+ [0xA221]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA221,
+ },
+ [0xA222]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA222,
+ },
+ [0xA223]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA223,
+ },
+ [0xA224]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA224,
+ },
+ [0xA225]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA225,
+ },
+ [0xA226]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA226,
+ },
+ [0xA227]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA227,
+ },
+ [0xA228]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA228,
+ },
+ [0xA229]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA229,
+ },
+ [0xA22A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA22A,
+ },
+ [0xA22B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA22B,
+ },
+ [0xA22C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA22C,
+ },
+ [0xA22D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA22D,
+ },
+ [0xA22E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA22E,
+ },
+ [0xA22F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE GGUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA22F,
+ },
+ [0xA230]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA230,
+ },
+ [0xA231]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA231,
+ },
+ [0xA232]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA232,
+ },
+ [0xA233]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA233,
+ },
+ [0xA234]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA234,
+ },
+ [0xA235]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA235,
+ },
+ [0xA236]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA236,
+ },
+ [0xA237]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA237,
+ },
+ [0xA238]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA238,
+ },
+ [0xA239]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA239,
+ },
+ [0xA23A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA23A,
+ },
+ [0xA23B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA23B,
+ },
+ [0xA23C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA23C,
+ },
+ [0xA23D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA23D,
+ },
+ [0xA23E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA23E,
+ },
+ [0xA23F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA23F,
+ },
+ [0xA240]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA240,
+ },
+ [0xA241]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA241,
+ },
+ [0xA242]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA242,
+ },
+ [0xA243]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA243,
+ },
+ [0xA244]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA244,
+ },
+ [0xA245]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE MGUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA245,
+ },
+ [0xA246]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA246,
+ },
+ [0xA247]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA247,
+ },
+ [0xA248]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA248,
+ },
+ [0xA249]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA249,
+ },
+ [0xA24A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA24A,
+ },
+ [0xA24B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA24B,
+ },
+ [0xA24C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA24C,
+ },
+ [0xA24D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA24D,
+ },
+ [0xA24E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA24E,
+ },
+ [0xA24F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA24F,
+ },
+ [0xA250]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA250,
+ },
+ [0xA251]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA251,
+ },
+ [0xA252]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA252,
+ },
+ [0xA253]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA253,
+ },
+ [0xA254]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA254,
+ },
+ [0xA255]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA255,
+ },
+ [0xA256]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA256,
+ },
+ [0xA257]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA257,
+ },
+ [0xA258]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA258,
+ },
+ [0xA259]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA259,
+ },
+ [0xA25A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA25A,
+ },
+ [0xA25B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA25B,
+ },
+ [0xA25C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HXEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA25C,
+ },
+ [0xA25D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA25D,
+ },
+ [0xA25E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA25E,
+ },
+ [0xA25F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA25F,
+ },
+ [0xA260]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA260,
+ },
+ [0xA261]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA261,
+ },
+ [0xA262]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA262,
+ },
+ [0xA263]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA263,
+ },
+ [0xA264]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA264,
+ },
+ [0xA265]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA265,
+ },
+ [0xA266]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA266,
+ },
+ [0xA267]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA267,
+ },
+ [0xA268]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA268,
+ },
+ [0xA269]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA269,
+ },
+ [0xA26A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA26A,
+ },
+ [0xA26B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA26B,
+ },
+ [0xA26C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA26C,
+ },
+ [0xA26D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NGEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA26D,
+ },
+ [0xA26E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA26E,
+ },
+ [0xA26F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA26F,
+ },
+ [0xA270]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA270,
+ },
+ [0xA271]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA271,
+ },
+ [0xA272]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA272,
+ },
+ [0xA273]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA273,
+ },
+ [0xA274]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA274,
+ },
+ [0xA275]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA275,
+ },
+ [0xA276]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA276,
+ },
+ [0xA277]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA277,
+ },
+ [0xA278]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA278,
+ },
+ [0xA279]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA279,
+ },
+ [0xA27A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA27A,
+ },
+ [0xA27B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA27B,
+ },
+ [0xA27C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA27C,
+ },
+ [0xA27D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA27D,
+ },
+ [0xA27E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA27E,
+ },
+ [0xA27F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE HEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA27F,
+ },
+ [0xA280]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA280,
+ },
+ [0xA281]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA281,
+ },
+ [0xA282]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA282,
+ },
+ [0xA283]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA283,
+ },
+ [0xA284]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA284,
+ },
+ [0xA285]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA285,
+ },
+ [0xA286]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA286,
+ },
+ [0xA287]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA287,
+ },
+ [0xA288]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA288,
+ },
+ [0xA289]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA289,
+ },
+ [0xA28A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA28A,
+ },
+ [0xA28B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA28B,
+ },
+ [0xA28C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE WEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA28C,
+ },
+ [0xA28D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA28D,
+ },
+ [0xA28E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA28E,
+ },
+ [0xA28F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA28F,
+ },
+ [0xA290]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA290,
+ },
+ [0xA291]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA291,
+ },
+ [0xA292]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA292,
+ },
+ [0xA293]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA293,
+ },
+ [0xA294]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA294,
+ },
+ [0xA295]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA295,
+ },
+ [0xA296]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA296,
+ },
+ [0xA297]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA297,
+ },
+ [0xA298]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA298,
+ },
+ [0xA299]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA299,
+ },
+ [0xA29A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA29A,
+ },
+ [0xA29B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA29B,
+ },
+ [0xA29C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA29C,
+ },
+ [0xA29D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA29D,
+ },
+ [0xA29E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA29E,
+ },
+ [0xA29F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA29F,
+ },
+ [0xA2A0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A0,
+ },
+ [0xA2A1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A1,
+ },
+ [0xA2A2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A2,
+ },
+ [0xA2A3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A3,
+ },
+ [0xA2A4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A4,
+ },
+ [0xA2A5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A5,
+ },
+ [0xA2A6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A6,
+ },
+ [0xA2A7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A7,
+ },
+ [0xA2A8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A8,
+ },
+ [0xA2A9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2A9,
+ },
+ [0xA2AA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2AA,
+ },
+ [0xA2AB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2AB,
+ },
+ [0xA2AC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2AC,
+ },
+ [0xA2AD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2AD,
+ },
+ [0xA2AE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2AE,
+ },
+ [0xA2AF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2AF,
+ },
+ [0xA2B0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B0,
+ },
+ [0xA2B1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B1,
+ },
+ [0xA2B2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B2,
+ },
+ [0xA2B3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B3,
+ },
+ [0xA2B4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B4,
+ },
+ [0xA2B5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B5,
+ },
+ [0xA2B6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B6,
+ },
+ [0xA2B7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B7,
+ },
+ [0xA2B8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B8,
+ },
+ [0xA2B9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2B9,
+ },
+ [0xA2BA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2BA,
+ },
+ [0xA2BB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2BB,
+ },
+ [0xA2BC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2BC,
+ },
+ [0xA2BD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE COT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2BD,
+ },
+ [0xA2BE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE COX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2BE,
+ },
+ [0xA2BF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2BF,
+ },
+ [0xA2C0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE COP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C0,
+ },
+ [0xA2C1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C1,
+ },
+ [0xA2C2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C2,
+ },
+ [0xA2C3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C3,
+ },
+ [0xA2C4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C4,
+ },
+ [0xA2C5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C5,
+ },
+ [0xA2C6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C6,
+ },
+ [0xA2C7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C7,
+ },
+ [0xA2C8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C8,
+ },
+ [0xA2C9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2C9,
+ },
+ [0xA2CA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2CA,
+ },
+ [0xA2CB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2CB,
+ },
+ [0xA2CC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2CC,
+ },
+ [0xA2CD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2CD,
+ },
+ [0xA2CE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2CE,
+ },
+ [0xA2CF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2CF,
+ },
+ [0xA2D0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D0,
+ },
+ [0xA2D1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D1,
+ },
+ [0xA2D2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D2,
+ },
+ [0xA2D3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D3,
+ },
+ [0xA2D4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D4,
+ },
+ [0xA2D5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D5,
+ },
+ [0xA2D6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D6,
+ },
+ [0xA2D7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D7,
+ },
+ [0xA2D8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D8,
+ },
+ [0xA2D9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2D9,
+ },
+ [0xA2DA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2DA,
+ },
+ [0xA2DB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2DB,
+ },
+ [0xA2DC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2DC,
+ },
+ [0xA2DD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2DD,
+ },
+ [0xA2DE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2DE,
+ },
+ [0xA2DF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2DF,
+ },
+ [0xA2E0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E0,
+ },
+ [0xA2E1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E1,
+ },
+ [0xA2E2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E2,
+ },
+ [0xA2E3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E3,
+ },
+ [0xA2E4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E4,
+ },
+ [0xA2E5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E5,
+ },
+ [0xA2E6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E6,
+ },
+ [0xA2E7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E7,
+ },
+ [0xA2E8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E8,
+ },
+ [0xA2E9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2E9,
+ },
+ [0xA2EA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2EA,
+ },
+ [0xA2EB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2EB,
+ },
+ [0xA2EC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZZYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2EC,
+ },
+ [0xA2ED]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2ED,
+ },
+ [0xA2EE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2EE,
+ },
+ [0xA2EF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2EF,
+ },
+ [0xA2F0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F0,
+ },
+ [0xA2F1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F1,
+ },
+ [0xA2F2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F2,
+ },
+ [0xA2F3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F3,
+ },
+ [0xA2F4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F4,
+ },
+ [0xA2F5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F5,
+ },
+ [0xA2F6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F6,
+ },
+ [0xA2F7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F7,
+ },
+ [0xA2F8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F8,
+ },
+ [0xA2F9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2F9,
+ },
+ [0xA2FA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2FA,
+ },
+ [0xA2FB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2FB,
+ },
+ [0xA2FC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2FC,
+ },
+ [0xA2FD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2FD,
+ },
+ [0xA2FE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2FE,
+ },
+ [0xA2FF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA2FF,
+ },
+ [0xA300]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA300,
+ },
+ [0xA301]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA301,
+ },
+ [0xA302]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA302,
+ },
+ [0xA303]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA303,
+ },
+ [0xA304]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA304,
+ },
+ [0xA305]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA305,
+ },
+ [0xA306]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA306,
+ },
+ [0xA307]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA307,
+ },
+ [0xA308]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NZYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA308,
+ },
+ [0xA309]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA309,
+ },
+ [0xA30A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA30A,
+ },
+ [0xA30B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA30B,
+ },
+ [0xA30C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA30C,
+ },
+ [0xA30D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA30D,
+ },
+ [0xA30E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA30E,
+ },
+ [0xA30F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA30F,
+ },
+ [0xA310]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA310,
+ },
+ [0xA311]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA311,
+ },
+ [0xA312]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA312,
+ },
+ [0xA313]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA313,
+ },
+ [0xA314]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA314,
+ },
+ [0xA315]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA315,
+ },
+ [0xA316]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA316,
+ },
+ [0xA317]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA317,
+ },
+ [0xA318]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA318,
+ },
+ [0xA319]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA319,
+ },
+ [0xA31A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA31A,
+ },
+ [0xA31B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA31B,
+ },
+ [0xA31C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA31C,
+ },
+ [0xA31D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA31D,
+ },
+ [0xA31E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA31E,
+ },
+ [0xA31F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA31F,
+ },
+ [0xA320]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA320,
+ },
+ [0xA321]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA321,
+ },
+ [0xA322]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA322,
+ },
+ [0xA323]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA323,
+ },
+ [0xA324]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA324,
+ },
+ [0xA325]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA325,
+ },
+ [0xA326]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA326,
+ },
+ [0xA327]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA327,
+ },
+ [0xA328]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA328,
+ },
+ [0xA329]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA329,
+ },
+ [0xA32A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA32A,
+ },
+ [0xA32B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA32B,
+ },
+ [0xA32C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA32C,
+ },
+ [0xA32D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA32D,
+ },
+ [0xA32E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA32E,
+ },
+ [0xA32F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA32F,
+ },
+ [0xA330]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA330,
+ },
+ [0xA331]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA331,
+ },
+ [0xA332]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA332,
+ },
+ [0xA333]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA333,
+ },
+ [0xA334]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA334,
+ },
+ [0xA335]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA335,
+ },
+ [0xA336]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA336,
+ },
+ [0xA337]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA337,
+ },
+ [0xA338]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA338,
+ },
+ [0xA339]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA339,
+ },
+ [0xA33A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA33A,
+ },
+ [0xA33B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA33B,
+ },
+ [0xA33C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA33C,
+ },
+ [0xA33D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA33D,
+ },
+ [0xA33E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA33E,
+ },
+ [0xA33F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA33F,
+ },
+ [0xA340]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA340,
+ },
+ [0xA341]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA341,
+ },
+ [0xA342]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA342,
+ },
+ [0xA343]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA343,
+ },
+ [0xA344]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA344,
+ },
+ [0xA345]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SSYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA345,
+ },
+ [0xA346]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA346,
+ },
+ [0xA347]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA347,
+ },
+ [0xA348]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA348,
+ },
+ [0xA349]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA349,
+ },
+ [0xA34A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA34A,
+ },
+ [0xA34B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA34B,
+ },
+ [0xA34C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA34C,
+ },
+ [0xA34D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA34D,
+ },
+ [0xA34E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA34E,
+ },
+ [0xA34F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA34F,
+ },
+ [0xA350]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA350,
+ },
+ [0xA351]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA351,
+ },
+ [0xA352]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA352,
+ },
+ [0xA353]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA353,
+ },
+ [0xA354]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA354,
+ },
+ [0xA355]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA355,
+ },
+ [0xA356]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA356,
+ },
+ [0xA357]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA357,
+ },
+ [0xA358]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA358,
+ },
+ [0xA359]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA359,
+ },
+ [0xA35A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA35A,
+ },
+ [0xA35B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA35B,
+ },
+ [0xA35C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA35C,
+ },
+ [0xA35D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA35D,
+ },
+ [0xA35E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA35E,
+ },
+ [0xA35F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA35F,
+ },
+ [0xA360]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ZHYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA360,
+ },
+ [0xA361]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA361,
+ },
+ [0xA362]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA362,
+ },
+ [0xA363]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA363,
+ },
+ [0xA364]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA364,
+ },
+ [0xA365]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA365,
+ },
+ [0xA366]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA366,
+ },
+ [0xA367]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA367,
+ },
+ [0xA368]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA368,
+ },
+ [0xA369]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA369,
+ },
+ [0xA36A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA36A,
+ },
+ [0xA36B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA36B,
+ },
+ [0xA36C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA36C,
+ },
+ [0xA36D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA36D,
+ },
+ [0xA36E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA36E,
+ },
+ [0xA36F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA36F,
+ },
+ [0xA370]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA370,
+ },
+ [0xA371]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA371,
+ },
+ [0xA372]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA372,
+ },
+ [0xA373]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA373,
+ },
+ [0xA374]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA374,
+ },
+ [0xA375]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA375,
+ },
+ [0xA376]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA376,
+ },
+ [0xA377]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA377,
+ },
+ [0xA378]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA378,
+ },
+ [0xA379]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA379,
+ },
+ [0xA37A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA37A,
+ },
+ [0xA37B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE CHYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA37B,
+ },
+ [0xA37C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA37C,
+ },
+ [0xA37D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA37D,
+ },
+ [0xA37E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA37E,
+ },
+ [0xA37F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA37F,
+ },
+ [0xA380]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RROT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA380,
+ },
+ [0xA381]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RROX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA381,
+ },
+ [0xA382]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA382,
+ },
+ [0xA383]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RROP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA383,
+ },
+ [0xA384]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA384,
+ },
+ [0xA385]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RREX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA385,
+ },
+ [0xA386]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA386,
+ },
+ [0xA387]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RREP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA387,
+ },
+ [0xA388]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA388,
+ },
+ [0xA389]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA389,
+ },
+ [0xA38A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA38A,
+ },
+ [0xA38B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA38B,
+ },
+ [0xA38C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA38C,
+ },
+ [0xA38D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA38D,
+ },
+ [0xA38E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA38E,
+ },
+ [0xA38F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA38F,
+ },
+ [0xA390]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA390,
+ },
+ [0xA391]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA391,
+ },
+ [0xA392]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA392,
+ },
+ [0xA393]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RRYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA393,
+ },
+ [0xA394]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA394,
+ },
+ [0xA395]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA395,
+ },
+ [0xA396]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA396,
+ },
+ [0xA397]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA397,
+ },
+ [0xA398]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NROX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA398,
+ },
+ [0xA399]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA399,
+ },
+ [0xA39A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NROP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA39A,
+ },
+ [0xA39B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA39B,
+ },
+ [0xA39C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NREX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA39C,
+ },
+ [0xA39D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA39D,
+ },
+ [0xA39E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NREP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA39E,
+ },
+ [0xA39F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA39F,
+ },
+ [0xA3A0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A0,
+ },
+ [0xA3A1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A1,
+ },
+ [0xA3A2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A2,
+ },
+ [0xA3A3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A3,
+ },
+ [0xA3A4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A4,
+ },
+ [0xA3A5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A5,
+ },
+ [0xA3A6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A6,
+ },
+ [0xA3A7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A7,
+ },
+ [0xA3A8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A8,
+ },
+ [0xA3A9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3A9,
+ },
+ [0xA3AA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NRYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3AA,
+ },
+ [0xA3AB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3AB,
+ },
+ [0xA3AC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3AC,
+ },
+ [0xA3AD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3AD,
+ },
+ [0xA3AE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3AE,
+ },
+ [0xA3AF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3AF,
+ },
+ [0xA3B0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B0,
+ },
+ [0xA3B1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B1,
+ },
+ [0xA3B2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B2,
+ },
+ [0xA3B3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B3,
+ },
+ [0xA3B4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B4,
+ },
+ [0xA3B5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B5,
+ },
+ [0xA3B6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B6,
+ },
+ [0xA3B7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B7,
+ },
+ [0xA3B8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B8,
+ },
+ [0xA3B9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3B9,
+ },
+ [0xA3BA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3BA,
+ },
+ [0xA3BB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3BB,
+ },
+ [0xA3BC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3BC,
+ },
+ [0xA3BD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3BD,
+ },
+ [0xA3BE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3BE,
+ },
+ [0xA3BF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3BF,
+ },
+ [0xA3C0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C0,
+ },
+ [0xA3C1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C1,
+ },
+ [0xA3C2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C2,
+ },
+ [0xA3C3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C3,
+ },
+ [0xA3C4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C4,
+ },
+ [0xA3C5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE SHYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C5,
+ },
+ [0xA3C6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RAT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C6,
+ },
+ [0xA3C7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RAX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C7,
+ },
+ [0xA3C8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RA",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C8,
+ },
+ [0xA3C9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RAP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3C9,
+ },
+ [0xA3CA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3CA,
+ },
+ [0xA3CB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3CB,
+ },
+ [0xA3CC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3CC,
+ },
+ [0xA3CD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ROT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3CD,
+ },
+ [0xA3CE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ROX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3CE,
+ },
+ [0xA3CF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3CF,
+ },
+ [0xA3D0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE ROP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D0,
+ },
+ [0xA3D1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE REX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D1,
+ },
+ [0xA3D2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D2,
+ },
+ [0xA3D3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE REP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D3,
+ },
+ [0xA3D4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D4,
+ },
+ [0xA3D5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D5,
+ },
+ [0xA3D6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D6,
+ },
+ [0xA3D7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D7,
+ },
+ [0xA3D8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D8,
+ },
+ [0xA3D9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3D9,
+ },
+ [0xA3DA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3DA,
+ },
+ [0xA3DB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3DB,
+ },
+ [0xA3DC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3DC,
+ },
+ [0xA3DD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3DD,
+ },
+ [0xA3DE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3DE,
+ },
+ [0xA3DF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE RYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3DF,
+ },
+ [0xA3E0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E0,
+ },
+ [0xA3E1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E1,
+ },
+ [0xA3E2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E2,
+ },
+ [0xA3E3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E3,
+ },
+ [0xA3E4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E4,
+ },
+ [0xA3E5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E5,
+ },
+ [0xA3E6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E6,
+ },
+ [0xA3E7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E7,
+ },
+ [0xA3E8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E8,
+ },
+ [0xA3E9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3E9,
+ },
+ [0xA3EA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3EA,
+ },
+ [0xA3EB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3EB,
+ },
+ [0xA3EC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3EC,
+ },
+ [0xA3ED]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3ED,
+ },
+ [0xA3EE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3EE,
+ },
+ [0xA3EF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3EF,
+ },
+ [0xA3F0]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F0,
+ },
+ [0xA3F1]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F1,
+ },
+ [0xA3F2]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F2,
+ },
+ [0xA3F3]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F3,
+ },
+ [0xA3F4]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F4,
+ },
+ [0xA3F5]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F5,
+ },
+ [0xA3F6]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F6,
+ },
+ [0xA3F7]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F7,
+ },
+ [0xA3F8]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F8,
+ },
+ [0xA3F9]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3F9,
+ },
+ [0xA3FA]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3FA,
+ },
+ [0xA3FB]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3FB,
+ },
+ [0xA3FC]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3FC,
+ },
+ [0xA3FD]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3FD,
+ },
+ [0xA3FE]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3FE,
+ },
+ [0xA3FF]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA3FF,
+ },
+ [0xA400]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA400,
+ },
+ [0xA401]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA401,
+ },
+ [0xA402]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA402,
+ },
+ [0xA403]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA403,
+ },
+ [0xA404]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA404,
+ },
+ [0xA405]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA405,
+ },
+ [0xA406]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA406,
+ },
+ [0xA407]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA407,
+ },
+ [0xA408]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA408,
+ },
+ [0xA409]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA409,
+ },
+ [0xA40A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA40A,
+ },
+ [0xA40B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA40B,
+ },
+ [0xA40C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA40C,
+ },
+ [0xA40D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA40D,
+ },
+ [0xA40E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA40E,
+ },
+ [0xA40F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA40F,
+ },
+ [0xA410]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA410,
+ },
+ [0xA411]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA411,
+ },
+ [0xA412]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA412,
+ },
+ [0xA413]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA413,
+ },
+ [0xA414]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA414,
+ },
+ [0xA415]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA415,
+ },
+ [0xA416]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA416,
+ },
+ [0xA417]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE QYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA417,
+ },
+ [0xA418]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA418,
+ },
+ [0xA419]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA419,
+ },
+ [0xA41A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA41A,
+ },
+ [0xA41B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA41B,
+ },
+ [0xA41C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA41C,
+ },
+ [0xA41D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA41D,
+ },
+ [0xA41E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA41E,
+ },
+ [0xA41F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA41F,
+ },
+ [0xA420]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA420,
+ },
+ [0xA421]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA421,
+ },
+ [0xA422]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA422,
+ },
+ [0xA423]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA423,
+ },
+ [0xA424]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA424,
+ },
+ [0xA425]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA425,
+ },
+ [0xA426]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA426,
+ },
+ [0xA427]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA427,
+ },
+ [0xA428]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA428,
+ },
+ [0xA429]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA429,
+ },
+ [0xA42A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA42A,
+ },
+ [0xA42B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA42B,
+ },
+ [0xA42C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA42C,
+ },
+ [0xA42D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA42D,
+ },
+ [0xA42E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA42E,
+ },
+ [0xA42F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA42F,
+ },
+ [0xA430]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE JJYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA430,
+ },
+ [0xA431]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA431,
+ },
+ [0xA432]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA432,
+ },
+ [0xA433]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA433,
+ },
+ [0xA434]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA434,
+ },
+ [0xA435]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA435,
+ },
+ [0xA436]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA436,
+ },
+ [0xA437]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA437,
+ },
+ [0xA438]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA438,
+ },
+ [0xA439]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA439,
+ },
+ [0xA43A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA43A,
+ },
+ [0xA43B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA43B,
+ },
+ [0xA43C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA43C,
+ },
+ [0xA43D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA43D,
+ },
+ [0xA43E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA43E,
+ },
+ [0xA43F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA43F,
+ },
+ [0xA440]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA440,
+ },
+ [0xA441]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA441,
+ },
+ [0xA442]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA442,
+ },
+ [0xA443]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA443,
+ },
+ [0xA444]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA444,
+ },
+ [0xA445]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA445,
+ },
+ [0xA446]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA446,
+ },
+ [0xA447]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA447,
+ },
+ [0xA448]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA448,
+ },
+ [0xA449]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NJYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA449,
+ },
+ [0xA44A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA44A,
+ },
+ [0xA44B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA44B,
+ },
+ [0xA44C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA44C,
+ },
+ [0xA44D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA44D,
+ },
+ [0xA44E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA44E,
+ },
+ [0xA44F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA44F,
+ },
+ [0xA450]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA450,
+ },
+ [0xA451]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA451,
+ },
+ [0xA452]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA452,
+ },
+ [0xA453]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA453,
+ },
+ [0xA454]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA454,
+ },
+ [0xA455]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA455,
+ },
+ [0xA456]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA456,
+ },
+ [0xA457]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA457,
+ },
+ [0xA458]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA458,
+ },
+ [0xA459]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA459,
+ },
+ [0xA45A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA45A,
+ },
+ [0xA45B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA45B,
+ },
+ [0xA45C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE NYUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA45C,
+ },
+ [0xA45D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA45D,
+ },
+ [0xA45E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA45E,
+ },
+ [0xA45F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA45F,
+ },
+ [0xA460]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA460,
+ },
+ [0xA461]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA461,
+ },
+ [0xA462]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA462,
+ },
+ [0xA463]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA463,
+ },
+ [0xA464]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA464,
+ },
+ [0xA465]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA465,
+ },
+ [0xA466]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA466,
+ },
+ [0xA467]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA467,
+ },
+ [0xA468]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA468,
+ },
+ [0xA469]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA469,
+ },
+ [0xA46A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA46A,
+ },
+ [0xA46B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA46B,
+ },
+ [0xA46C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA46C,
+ },
+ [0xA46D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA46D,
+ },
+ [0xA46E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA46E,
+ },
+ [0xA46F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA46F,
+ },
+ [0xA470]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE XYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA470,
+ },
+ [0xA471]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YIT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA471,
+ },
+ [0xA472]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YIX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA472,
+ },
+ [0xA473]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YI",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA473,
+ },
+ [0xA474]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YIP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA474,
+ },
+ [0xA475]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YIET",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA475,
+ },
+ [0xA476]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YIEX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA476,
+ },
+ [0xA477]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YIE",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA477,
+ },
+ [0xA478]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YIEP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA478,
+ },
+ [0xA479]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA479,
+ },
+ [0xA47A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA47A,
+ },
+ [0xA47B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA47B,
+ },
+ [0xA47C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA47C,
+ },
+ [0xA47D]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YOT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA47D,
+ },
+ [0xA47E]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YOX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA47E,
+ },
+ [0xA47F]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YO",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA47F,
+ },
+ [0xA480]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YOP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA480,
+ },
+ [0xA481]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA481,
+ },
+ [0xA482]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA482,
+ },
+ [0xA483]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YU",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA483,
+ },
+ [0xA484]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA484,
+ },
+ [0xA485]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YURX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA485,
+ },
+ [0xA486]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YUR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA486,
+ },
+ [0xA487]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YYT",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA487,
+ },
+ [0xA488]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YYX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA488,
+ },
+ [0xA489]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YY",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA489,
+ },
+ [0xA48A]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YYP",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA48A,
+ },
+ [0xA48B]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YYRX",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA48B,
+ },
+ [0xA48C]={
+ category="lo",
+ cjkwd="w",
+ description="YI SYLLABLE YYR",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xA48C,
+ },
+ [0xA490]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL QOT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA490,
+ },
+ [0xA491]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL LI",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA491,
+ },
+ [0xA492]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL KIT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA492,
+ },
+ [0xA493]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL NYIP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA493,
+ },
+ [0xA494]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL CYP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA494,
+ },
+ [0xA495]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL SSI",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA495,
+ },
+ [0xA496]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL GGOP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA496,
+ },
+ [0xA497]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL GEP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA497,
+ },
+ [0xA498]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL MI",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA498,
+ },
+ [0xA499]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL HXIT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA499,
+ },
+ [0xA49A]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL LYR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA49A,
+ },
+ [0xA49B]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL BBUT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA49B,
+ },
+ [0xA49C]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL MOP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA49C,
+ },
+ [0xA49D]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL YO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA49D,
+ },
+ [0xA49E]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL PUT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA49E,
+ },
+ [0xA49F]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL HXUO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA49F,
+ },
+ [0xA4A0]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL TAT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A0,
+ },
+ [0xA4A1]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL GA",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A1,
+ },
+ [0xA4A2]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL ZUP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A2,
+ },
+ [0xA4A3]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL CYT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A3,
+ },
+ [0xA4A4]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL DDUR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A4,
+ },
+ [0xA4A5]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL BUR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A5,
+ },
+ [0xA4A6]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL GGUO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A6,
+ },
+ [0xA4A7]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL NYOP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A7,
+ },
+ [0xA4A8]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL TU",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A8,
+ },
+ [0xA4A9]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL OP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4A9,
+ },
+ [0xA4AA]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL JJUT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4AA,
+ },
+ [0xA4AB]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL ZOT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4AB,
+ },
+ [0xA4AC]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL PYT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4AC,
+ },
+ [0xA4AD]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL HMO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4AD,
+ },
+ [0xA4AE]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL YIT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4AE,
+ },
+ [0xA4AF]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL VUR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4AF,
+ },
+ [0xA4B0]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL SHY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B0,
+ },
+ [0xA4B1]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL VEP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B1,
+ },
+ [0xA4B2]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL ZA",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B2,
+ },
+ [0xA4B3]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL JO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B3,
+ },
+ [0xA4B4]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL NZUP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B4,
+ },
+ [0xA4B5]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL JJY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B5,
+ },
+ [0xA4B6]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL GOT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B6,
+ },
+ [0xA4B7]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL JJIE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B7,
+ },
+ [0xA4B8]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL WO",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B8,
+ },
+ [0xA4B9]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL DU",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4B9,
+ },
+ [0xA4BA]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL SHUR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4BA,
+ },
+ [0xA4BB]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL LIE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4BB,
+ },
+ [0xA4BC]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL CY",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4BC,
+ },
+ [0xA4BD]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL CUOP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4BD,
+ },
+ [0xA4BE]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL CIP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4BE,
+ },
+ [0xA4BF]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL HXOP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4BF,
+ },
+ [0xA4C0]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL SHAT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4C0,
+ },
+ [0xA4C1]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL ZUR",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4C1,
+ },
+ [0xA4C2]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL SHOP",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4C2,
+ },
+ [0xA4C3]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL CHE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4C3,
+ },
+ [0xA4C4]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL ZZIET",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4C4,
+ },
+ [0xA4C5]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL NBIE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4C5,
+ },
+ [0xA4C6]={
+ category="so",
+ cjkwd="w",
+ description="YI RADICAL KE",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xA4C6,
+ },
+ [0xA700]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YIN PING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA700,
+ },
+ [0xA701]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YANG PING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA701,
+ },
+ [0xA702]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YIN SHANG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA702,
+ },
+ [0xA703]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YANG SHANG",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA703,
+ },
+ [0xA704]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YIN QU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA704,
+ },
+ [0xA705]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YANG QU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA705,
+ },
+ [0xA706]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YIN RU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA706,
+ },
+ [0xA707]={
+ category="sk",
+ description="MODIFIER LETTER CHINESE TONE YANG RU",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA707,
+ },
+ [0xA708]={
+ category="sk",
+ description="MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA708,
+ },
+ [0xA709]={
+ category="sk",
+ description="MODIFIER LETTER HIGH DOTTED TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA709,
+ },
+ [0xA70A]={
+ category="sk",
+ description="MODIFIER LETTER MID DOTTED TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA70A,
+ },
+ [0xA70B]={
+ category="sk",
+ description="MODIFIER LETTER LOW DOTTED TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA70B,
+ },
+ [0xA70C]={
+ category="sk",
+ description="MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA70C,
+ },
+ [0xA70D]={
+ category="sk",
+ description="MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA70D,
+ },
+ [0xA70E]={
+ category="sk",
+ description="MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA70E,
+ },
+ [0xA70F]={
+ category="sk",
+ description="MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA70F,
+ },
+ [0xA710]={
+ category="sk",
+ description="MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA710,
+ },
+ [0xA711]={
+ category="sk",
+ description="MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA711,
+ },
+ [0xA712]={
+ category="sk",
+ description="MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA712,
+ },
+ [0xA713]={
+ category="sk",
+ description="MODIFIER LETTER HIGH LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA713,
+ },
+ [0xA714]={
+ category="sk",
+ description="MODIFIER LETTER MID LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA714,
+ },
+ [0xA715]={
+ category="sk",
+ description="MODIFIER LETTER LOW LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA715,
+ },
+ [0xA716]={
+ category="sk",
+ description="MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA716,
+ },
+ [0xA717]={
+ category="lm",
+ description="MODIFIER LETTER DOT VERTICAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA717,
+ },
+ [0xA718]={
+ category="lm",
+ description="MODIFIER LETTER DOT SLASH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA718,
+ },
+ [0xA719]={
+ category="lm",
+ description="MODIFIER LETTER DOT HORIZONTAL BAR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA719,
+ },
+ [0xA71A]={
+ category="lm",
+ description="MODIFIER LETTER LOWER RIGHT CORNER ANGLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA71A,
+ },
+ [0xA720]={
+ category="sk",
+ description="MODIFIER LETTER STRESS AND HIGH TONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA720,
+ },
+ [0xA721]={
+ category="sk",
+ description="MODIFIER LETTER STRESS AND LOW TONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA721,
+ },
+ [0xA800]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA800,
+ },
+ [0xA801]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA801,
+ },
+ [0xA802]={
+ category="mc",
+ description="SYLOTI NAGRI SIGN DVISVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xA802,
+ },
+ [0xA803]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA803,
+ },
+ [0xA804]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA804,
+ },
+ [0xA805]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA805,
+ },
+ [0xA806]={
+ category="mn",
+ description="SYLOTI NAGRI SIGN HASANTA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xA806,
+ },
+ [0xA807]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA807,
+ },
+ [0xA808]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER KHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA808,
+ },
+ [0xA809]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER GO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA809,
+ },
+ [0xA80A]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER GHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA80A,
+ },
+ [0xA80B]={
+ category="mn",
+ description="SYLOTI NAGRI SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xA80B,
+ },
+ [0xA80C]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER CO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA80C,
+ },
+ [0xA80D]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER CHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA80D,
+ },
+ [0xA80E]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER JO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA80E,
+ },
+ [0xA80F]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER JHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA80F,
+ },
+ [0xA810]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER TTO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA810,
+ },
+ [0xA811]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER TTHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA811,
+ },
+ [0xA812]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER DDO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA812,
+ },
+ [0xA813]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER DDHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA813,
+ },
+ [0xA814]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER TO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA814,
+ },
+ [0xA815]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER THO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA815,
+ },
+ [0xA816]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER DO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA816,
+ },
+ [0xA817]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER DHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA817,
+ },
+ [0xA818]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER NO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA818,
+ },
+ [0xA819]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER PO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA819,
+ },
+ [0xA81A]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER PHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA81A,
+ },
+ [0xA81B]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER BO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA81B,
+ },
+ [0xA81C]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER BHO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA81C,
+ },
+ [0xA81D]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER MO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA81D,
+ },
+ [0xA81E]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER RO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA81E,
+ },
+ [0xA81F]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER LO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA81F,
+ },
+ [0xA820]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER RRO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA820,
+ },
+ [0xA821]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER SO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA821,
+ },
+ [0xA822]={
+ category="lo",
+ description="SYLOTI NAGRI LETTER HO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA822,
+ },
+ [0xA823]={
+ category="mc",
+ description="SYLOTI NAGRI VOWEL SIGN A",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0xA823,
+ },
+ [0xA824]={
+ category="mc",
+ description="SYLOTI NAGRI VOWEL SIGN I",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0xA824,
+ },
+ [0xA825]={
+ category="mn",
+ description="SYLOTI NAGRI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xA825,
+ },
+ [0xA826]={
+ category="mn",
+ description="SYLOTI NAGRI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xA826,
+ },
+ [0xA827]={
+ category="mc",
+ description="SYLOTI NAGRI VOWEL SIGN OO",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0xA827,
+ },
+ [0xA828]={
+ category="so",
+ description="SYLOTI NAGRI POETRY MARK-0x0001",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA828,
+ },
+ [0xA829]={
+ category="so",
+ description="SYLOTI NAGRI POETRY MARK-0x0002",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA829,
+ },
+ [0xA82A]={
+ category="so",
+ description="SYLOTI NAGRI POETRY MARK-0x0003",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA82A,
+ },
+ [0xA82B]={
+ category="so",
+ description="SYLOTI NAGRI POETRY MARK-0x0004",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xA82B,
+ },
+ [0xA840]={
+ category="lo",
+ description="PHAGS-PA LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA840,
+ },
+ [0xA841]={
+ category="lo",
+ description="PHAGS-PA LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA841,
+ },
+ [0xA842]={
+ category="lo",
+ description="PHAGS-PA LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA842,
+ },
+ [0xA843]={
+ category="lo",
+ description="PHAGS-PA LETTER NGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA843,
+ },
+ [0xA844]={
+ category="lo",
+ description="PHAGS-PA LETTER CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA844,
+ },
+ [0xA845]={
+ category="lo",
+ description="PHAGS-PA LETTER CHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA845,
+ },
+ [0xA846]={
+ category="lo",
+ description="PHAGS-PA LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA846,
+ },
+ [0xA847]={
+ category="lo",
+ description="PHAGS-PA LETTER NYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA847,
+ },
+ [0xA848]={
+ category="lo",
+ description="PHAGS-PA LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA848,
+ },
+ [0xA849]={
+ category="lo",
+ description="PHAGS-PA LETTER THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA849,
+ },
+ [0xA84A]={
+ category="lo",
+ description="PHAGS-PA LETTER DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA84A,
+ },
+ [0xA84B]={
+ category="lo",
+ description="PHAGS-PA LETTER NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA84B,
+ },
+ [0xA84C]={
+ category="lo",
+ description="PHAGS-PA LETTER PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA84C,
+ },
+ [0xA84D]={
+ category="lo",
+ description="PHAGS-PA LETTER PHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA84D,
+ },
+ [0xA84E]={
+ category="lo",
+ description="PHAGS-PA LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA84E,
+ },
+ [0xA84F]={
+ category="lo",
+ description="PHAGS-PA LETTER MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA84F,
+ },
+ [0xA850]={
+ category="lo",
+ description="PHAGS-PA LETTER TSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA850,
+ },
+ [0xA851]={
+ category="lo",
+ description="PHAGS-PA LETTER TSHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA851,
+ },
+ [0xA852]={
+ category="lo",
+ description="PHAGS-PA LETTER DZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA852,
+ },
+ [0xA853]={
+ category="lo",
+ description="PHAGS-PA LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA853,
+ },
+ [0xA854]={
+ category="lo",
+ description="PHAGS-PA LETTER ZHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA854,
+ },
+ [0xA855]={
+ category="lo",
+ description="PHAGS-PA LETTER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA855,
+ },
+ [0xA856]={
+ category="lo",
+ description="PHAGS-PA LETTER SMALL A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA856,
+ },
+ [0xA857]={
+ category="lo",
+ description="PHAGS-PA LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA857,
+ },
+ [0xA858]={
+ category="lo",
+ description="PHAGS-PA LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA858,
+ },
+ [0xA859]={
+ category="lo",
+ description="PHAGS-PA LETTER LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA859,
+ },
+ [0xA85A]={
+ category="lo",
+ description="PHAGS-PA LETTER SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA85A,
+ },
+ [0xA85B]={
+ category="lo",
+ description="PHAGS-PA LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA85B,
+ },
+ [0xA85C]={
+ category="lo",
+ description="PHAGS-PA LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA85C,
+ },
+ [0xA85D]={
+ category="lo",
+ description="PHAGS-PA LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA85D,
+ },
+ [0xA85E]={
+ category="lo",
+ description="PHAGS-PA LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA85E,
+ },
+ [0xA85F]={
+ category="lo",
+ description="PHAGS-PA LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA85F,
+ },
+ [0xA860]={
+ category="lo",
+ description="PHAGS-PA LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA860,
+ },
+ [0xA861]={
+ category="lo",
+ description="PHAGS-PA LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA861,
+ },
+ [0xA862]={
+ category="lo",
+ description="PHAGS-PA LETTER QA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA862,
+ },
+ [0xA863]={
+ category="lo",
+ description="PHAGS-PA LETTER XA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA863,
+ },
+ [0xA864]={
+ category="lo",
+ description="PHAGS-PA LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA864,
+ },
+ [0xA865]={
+ category="lo",
+ description="PHAGS-PA LETTER GGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA865,
+ },
+ [0xA866]={
+ category="lo",
+ description="PHAGS-PA LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA866,
+ },
+ [0xA867]={
+ category="lo",
+ description="PHAGS-PA SUBJOINED LETTER WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA867,
+ },
+ [0xA868]={
+ category="lo",
+ description="PHAGS-PA SUBJOINED LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA868,
+ },
+ [0xA869]={
+ category="lo",
+ description="PHAGS-PA LETTER TTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA869,
+ },
+ [0xA86A]={
+ category="lo",
+ description="PHAGS-PA LETTER TTHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA86A,
+ },
+ [0xA86B]={
+ category="lo",
+ description="PHAGS-PA LETTER DDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA86B,
+ },
+ [0xA86C]={
+ category="lo",
+ description="PHAGS-PA LETTER NNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA86C,
+ },
+ [0xA86D]={
+ category="lo",
+ description="PHAGS-PA LETTER ALTERNATE YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA86D,
+ },
+ [0xA86E]={
+ category="lo",
+ description="PHAGS-PA LETTER VOICELESS SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA86E,
+ },
+ [0xA86F]={
+ category="lo",
+ description="PHAGS-PA LETTER VOICED HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA86F,
+ },
+ [0xA870]={
+ category="lo",
+ description="PHAGS-PA LETTER ASPIRATED FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA870,
+ },
+ [0xA871]={
+ category="lo",
+ description="PHAGS-PA SUBJOINED LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA871,
+ },
+ [0xA872]={
+ category="lo",
+ description="PHAGS-PA SUPERFIXED LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA872,
+ },
+ [0xA873]={
+ category="lo",
+ description="PHAGS-PA LETTER CANDRABINDU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0xA873,
+ },
+ [0xA874]={
+ category="po",
+ description="PHAGS-PA SINGLE HEAD MARK",
+ direction="on",
+ linebreak="bb",
+ unicodeslot=0xA874,
+ },
+ [0xA875]={
+ category="po",
+ description="PHAGS-PA DOUBLE HEAD MARK",
+ direction="on",
+ linebreak="bb",
+ unicodeslot=0xA875,
+ },
+ [0xA876]={
+ category="po",
+ description="PHAGS-PA MARK SHAD",
+ direction="on",
+ linebreak="ex",
+ unicodeslot=0xA876,
+ },
+ [0xA877]={
+ category="po",
+ description="PHAGS-PA MARK DOUBLE SHAD",
+ direction="on",
+ linebreak="ex",
+ unicodeslot=0xA877,
+ },
+ [0xAC00]={
+ category="lo",
+ cjkwd="w",
+ description="<Hangul Syllable>",
+ direction="l",
+ linebreak="h2",
+ unicodeslot=0xAC00,
+ range=0xD7A3,
+ },
+ [0xD800]={
+ category="cs",
+ description="<Non Private Use High Surrogate, First>",
+ direction="l",
+ linebreak="sg",
+ unicodeslot=0xD800,
+ },
+ [0xDB7F]={
+ category="cs",
+ description="<Non Private Use High Surrogate, Last>",
+ direction="l",
+ linebreak="sg",
+ unicodeslot=0xDB7F,
+ },
+ [0xDB80]={
+ category="cs",
+ description="<Private Use High Surrogate, First>",
+ direction="l",
+ linebreak="sg",
+ unicodeslot=0xDB80,
+ },
+ [0xDBFF]={
+ category="cs",
+ description="<Private Use High Surrogate, Last>",
+ direction="l",
+ linebreak="sg",
+ unicodeslot=0xDBFF,
+ },
+ [0xDC00]={
+ category="cs",
+ description="<Low Surrogate, First>",
+ direction="l",
+ linebreak="sg",
+ unicodeslot=0xDC00,
+ },
+ [0xDFFF]={
+ category="cs",
+ description="<Low Surrogate, Last>",
+ direction="l",
+ linebreak="sg",
+ unicodeslot=0xDFFF,
+ },
+ [0xE000]={
+ category="co",
+ cjkwd="a",
+ description="<Private Use, First>",
+ direction="l",
+ unicodeslot=0xE000,
+ },
+ [0xF8FF]={
+ category="co",
+ cjkwd="a",
+ description="<Private Use, Last>",
+ direction="l",
+ unicodeslot=0xF8FF,
+ },
+ [0xF900]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0384",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8C48 },
+ unicodeslot=0xF900,
+ },
+ [0xF901]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0385",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x66F4 },
+ unicodeslot=0xF901,
+ },
+ [0xF902]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0386",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8ECA },
+ unicodeslot=0xF902,
+ },
+ [0xF903]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0387",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8CC8 },
+ unicodeslot=0xF903,
+ },
+ [0xF904]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0388",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6ED1 },
+ unicodeslot=0xF904,
+ },
+ [0xF905]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0389",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E32 },
+ unicodeslot=0xF905,
+ },
+ [0xF906]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x038A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x53E5 },
+ unicodeslot=0xF906,
+ },
+ [0xF907]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x038B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F9C },
+ unicodeslot=0xF907,
+ },
+ [0xF908]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x038C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F9C },
+ unicodeslot=0xF908,
+ },
+ [0xF909]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x038D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5951 },
+ unicodeslot=0xF909,
+ },
+ [0xF90A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005AA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x91D1 },
+ unicodeslot=0xF90A,
+ },
+ [0xF90B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005AB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5587 },
+ unicodeslot=0xF90B,
+ },
+ [0xF90C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005AC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5948 },
+ unicodeslot=0xF90C,
+ },
+ [0xF90D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005AD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61F6 },
+ unicodeslot=0xF90D,
+ },
+ [0xF90E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005AE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7669 },
+ unicodeslot=0xF90E,
+ },
+ [0xF90F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005AF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7F85 },
+ unicodeslot=0xF90F,
+ },
+ [0xF910]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x038E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x863F },
+ unicodeslot=0xF910,
+ },
+ [0xF911]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x038F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x87BA },
+ unicodeslot=0xF911,
+ },
+ [0xF912]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0390",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x88F8 },
+ unicodeslot=0xF912,
+ },
+ [0xF913]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0391",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x908F },
+ unicodeslot=0xF913,
+ },
+ [0xF914]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0392",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6A02 },
+ unicodeslot=0xF914,
+ },
+ [0xF915]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0393",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D1B },
+ unicodeslot=0xF915,
+ },
+ [0xF916]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0394",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x70D9 },
+ unicodeslot=0xF916,
+ },
+ [0xF917]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0395",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x73DE },
+ unicodeslot=0xF917,
+ },
+ [0xF918]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0396",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x843D },
+ unicodeslot=0xF918,
+ },
+ [0xF919]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0397",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x916A },
+ unicodeslot=0xF919,
+ },
+ [0xF91A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x99F1 },
+ unicodeslot=0xF91A,
+ },
+ [0xF91B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005BB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E82 },
+ unicodeslot=0xF91B,
+ },
+ [0xF91C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005BC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5375 },
+ unicodeslot=0xF91C,
+ },
+ [0xF91D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005BD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6B04 },
+ unicodeslot=0xF91D,
+ },
+ [0xF91E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x721B },
+ unicodeslot=0xF91E,
+ },
+ [0xF91F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005BF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x862D },
+ unicodeslot=0xF91F,
+ },
+ [0xF920]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0398",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9E1E },
+ unicodeslot=0xF920,
+ },
+ [0xF921]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0399",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5D50 },
+ unicodeslot=0xF921,
+ },
+ [0xF922]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x039A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6FEB },
+ unicodeslot=0xF922,
+ },
+ [0xF923]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x039B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x85CD },
+ unicodeslot=0xF923,
+ },
+ [0xF924]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x039C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8964 },
+ unicodeslot=0xF924,
+ },
+ [0xF925]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x039D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x62C9 },
+ unicodeslot=0xF925,
+ },
+ [0xF926]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x039E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x81D8 },
+ unicodeslot=0xF926,
+ },
+ [0xF927]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x039F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x881F },
+ unicodeslot=0xF927,
+ },
+ [0xF928]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5ECA },
+ unicodeslot=0xF928,
+ },
+ [0xF929]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6717 },
+ unicodeslot=0xF929,
+ },
+ [0xF92A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005CA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D6A },
+ unicodeslot=0xF92A,
+ },
+ [0xF92B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005CB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x72FC },
+ unicodeslot=0xF92B,
+ },
+ [0xF92C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005CC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x90CE },
+ unicodeslot=0xF92C,
+ },
+ [0xF92D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005CD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4F86 },
+ unicodeslot=0xF92D,
+ },
+ [0xF92E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005CE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51B7 },
+ unicodeslot=0xF92E,
+ },
+ [0xF92F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005CF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52DE },
+ unicodeslot=0xF92F,
+ },
+ [0xF930]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x64C4 },
+ unicodeslot=0xF930,
+ },
+ [0xF931]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6AD3 },
+ unicodeslot=0xF931,
+ },
+ [0xF932]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7210 },
+ unicodeslot=0xF932,
+ },
+ [0xF933]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x76E7 },
+ unicodeslot=0xF933,
+ },
+ [0xF934]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8001 },
+ unicodeslot=0xF934,
+ },
+ [0xF935]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8606 },
+ unicodeslot=0xF935,
+ },
+ [0xF936]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x865C },
+ unicodeslot=0xF936,
+ },
+ [0xF937]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03A9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8DEF },
+ unicodeslot=0xF937,
+ },
+ [0xF938]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03AA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9732 },
+ unicodeslot=0xF938,
+ },
+ [0xF939]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03AB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9B6F },
+ unicodeslot=0xF939,
+ },
+ [0xF93A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9DFA },
+ unicodeslot=0xF93A,
+ },
+ [0xF93B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005DB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x788C },
+ unicodeslot=0xF93B,
+ },
+ [0xF93C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005DC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x797F },
+ unicodeslot=0xF93C,
+ },
+ [0xF93D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005DD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7DA0 },
+ unicodeslot=0xF93D,
+ },
+ [0xF93E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83C9 },
+ unicodeslot=0xF93E,
+ },
+ [0xF93F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005DF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9304 },
+ unicodeslot=0xF93F,
+ },
+ [0xF940]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03AC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9E7F },
+ unicodeslot=0xF940,
+ },
+ [0xF941]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03AD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AD6 },
+ unicodeslot=0xF941,
+ },
+ [0xF942]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03AE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58DF },
+ unicodeslot=0xF942,
+ },
+ [0xF943]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03AF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F04 },
+ unicodeslot=0xF943,
+ },
+ [0xF944]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7C60 },
+ unicodeslot=0xF944,
+ },
+ [0xF945]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x807E },
+ unicodeslot=0xF945,
+ },
+ [0xF946]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7262 },
+ unicodeslot=0xF946,
+ },
+ [0xF947]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x78CA },
+ unicodeslot=0xF947,
+ },
+ [0xF948]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8CC2 },
+ unicodeslot=0xF948,
+ },
+ [0xF949]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96F7 },
+ unicodeslot=0xF949,
+ },
+ [0xF94A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005EA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58D8 },
+ unicodeslot=0xF94A,
+ },
+ [0xF94B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005EB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C62 },
+ unicodeslot=0xF94B,
+ },
+ [0xF94C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005EC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6A13 },
+ unicodeslot=0xF94C,
+ },
+ [0xF94D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005ED",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6DDA },
+ unicodeslot=0xF94D,
+ },
+ [0xF94E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005EE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6F0F },
+ unicodeslot=0xF94E,
+ },
+ [0xF94F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005EF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7D2F },
+ unicodeslot=0xF94F,
+ },
+ [0xF950]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7E37 },
+ unicodeslot=0xF950,
+ },
+ [0xF951]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x964B },
+ unicodeslot=0xF951,
+ },
+ [0xF952]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52D2 },
+ unicodeslot=0xF952,
+ },
+ [0xF953]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03B9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x808B },
+ unicodeslot=0xF953,
+ },
+ [0xF954]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51DC },
+ unicodeslot=0xF954,
+ },
+ [0xF955]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03BB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51CC },
+ unicodeslot=0xF955,
+ },
+ [0xF956]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03BC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7A1C },
+ unicodeslot=0xF956,
+ },
+ [0xF957]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03BD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7DBE },
+ unicodeslot=0xF957,
+ },
+ [0xF958]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83F1 },
+ unicodeslot=0xF958,
+ },
+ [0xF959]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03BF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9675 },
+ unicodeslot=0xF959,
+ },
+ [0xF95A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005FA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B80 },
+ unicodeslot=0xF95A,
+ },
+ [0xF95B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005FB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x62CF },
+ unicodeslot=0xF95B,
+ },
+ [0xF95C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005FC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6A02 },
+ unicodeslot=0xF95C,
+ },
+ [0xF95D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005FD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AFE },
+ unicodeslot=0xF95D,
+ },
+ [0xF95E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005FE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E39 },
+ unicodeslot=0xF95E,
+ },
+ [0xF95F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x005FF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BE7 },
+ unicodeslot=0xF95F,
+ },
+ [0xF960]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6012 },
+ unicodeslot=0xF960,
+ },
+ [0xF961]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7387 },
+ unicodeslot=0xF961,
+ },
+ [0xF962]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7570 },
+ unicodeslot=0xF962,
+ },
+ [0xF963]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5317 },
+ unicodeslot=0xF963,
+ },
+ [0xF964]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x78FB },
+ unicodeslot=0xF964,
+ },
+ [0xF965]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4FBF },
+ unicodeslot=0xF965,
+ },
+ [0xF966]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5FA9 },
+ unicodeslot=0xF966,
+ },
+ [0xF967]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E0D },
+ unicodeslot=0xF967,
+ },
+ [0xF968]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6CCC },
+ unicodeslot=0xF968,
+ },
+ [0xF969]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03C9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6578 },
+ unicodeslot=0xF969,
+ },
+ [0xF96A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0060A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7D22 },
+ unicodeslot=0xF96A,
+ },
+ [0xF96B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0060B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x53C3 },
+ unicodeslot=0xF96B,
+ },
+ [0xF96C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0060C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x585E },
+ unicodeslot=0xF96C,
+ },
+ [0xF96D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0060D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7701 },
+ unicodeslot=0xF96D,
+ },
+ [0xF96E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0060E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8449 },
+ unicodeslot=0xF96E,
+ },
+ [0xF96F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0060F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AAA },
+ unicodeslot=0xF96F,
+ },
+ [0xF970]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03CA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6BBA },
+ unicodeslot=0xF970,
+ },
+ [0xF971]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03CB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8FB0 },
+ unicodeslot=0xF971,
+ },
+ [0xF972]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03CC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6C88 },
+ unicodeslot=0xF972,
+ },
+ [0xF973]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03CD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x62FE },
+ unicodeslot=0xF973,
+ },
+ [0xF974]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03CE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x82E5 },
+ unicodeslot=0xF974,
+ },
+ [0xF975]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03CF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x63A0 },
+ unicodeslot=0xF975,
+ },
+ [0xF976]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7565 },
+ unicodeslot=0xF976,
+ },
+ [0xF977]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4EAE },
+ unicodeslot=0xF977,
+ },
+ [0xF978]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5169 },
+ unicodeslot=0xF978,
+ },
+ [0xF979]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51C9 },
+ unicodeslot=0xF979,
+ },
+ [0xF97A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0061A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6881 },
+ unicodeslot=0xF97A,
+ },
+ [0xF97B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0061B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7CE7 },
+ unicodeslot=0xF97B,
+ },
+ [0xF97C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0061C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x826F },
+ unicodeslot=0xF97C,
+ },
+ [0xF97D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0061D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AD2 },
+ unicodeslot=0xF97D,
+ },
+ [0xF97E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0061E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x91CF },
+ unicodeslot=0xF97E,
+ },
+ [0xF97F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0061F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52F5 },
+ unicodeslot=0xF97F,
+ },
+ [0xF980]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5442 },
+ unicodeslot=0xF980,
+ },
+ [0xF981]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5973 },
+ unicodeslot=0xF981,
+ },
+ [0xF982]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5EEC },
+ unicodeslot=0xF982,
+ },
+ [0xF983]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x65C5 },
+ unicodeslot=0xF983,
+ },
+ [0xF984]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6FFE },
+ unicodeslot=0xF984,
+ },
+ [0xF985]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03D9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x792A },
+ unicodeslot=0xF985,
+ },
+ [0xF986]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x95AD },
+ unicodeslot=0xF986,
+ },
+ [0xF987]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03DB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9A6A },
+ unicodeslot=0xF987,
+ },
+ [0xF988]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03DC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9E97 },
+ unicodeslot=0xF988,
+ },
+ [0xF989]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03DD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9ECE },
+ unicodeslot=0xF989,
+ },
+ [0xF98A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0062A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x529B },
+ unicodeslot=0xF98A,
+ },
+ [0xF98B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0062B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x66C6 },
+ unicodeslot=0xF98B,
+ },
+ [0xF98C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0062C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6B77 },
+ unicodeslot=0xF98C,
+ },
+ [0xF98D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0062D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8F62 },
+ unicodeslot=0xF98D,
+ },
+ [0xF98E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0062E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5E74 },
+ unicodeslot=0xF98E,
+ },
+ [0xF98F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0062F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6190 },
+ unicodeslot=0xF98F,
+ },
+ [0xF990]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6200 },
+ unicodeslot=0xF990,
+ },
+ [0xF991]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03DF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x649A },
+ unicodeslot=0xF991,
+ },
+ [0xF992]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6F23 },
+ unicodeslot=0xF992,
+ },
+ [0xF993]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7149 },
+ unicodeslot=0xF993,
+ },
+ [0xF994]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7489 },
+ unicodeslot=0xF994,
+ },
+ [0xF995]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x79CA },
+ unicodeslot=0xF995,
+ },
+ [0xF996]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7DF4 },
+ unicodeslot=0xF996,
+ },
+ [0xF997]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x806F },
+ unicodeslot=0xF997,
+ },
+ [0xF998]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8F26 },
+ unicodeslot=0xF998,
+ },
+ [0xF999]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x03E7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x84EE },
+ unicodeslot=0xF999,
+ },
+ [0xF99A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0063A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9023 },
+ unicodeslot=0xF99A,
+ },
+ [0xF99B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0063B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x934A },
+ unicodeslot=0xF99B,
+ },
+ [0xF99C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0063C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5217 },
+ unicodeslot=0xF99C,
+ },
+ [0xF99D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0063D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52A3 },
+ unicodeslot=0xF99D,
+ },
+ [0xF99E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0063E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x54BD },
+ unicodeslot=0xF99E,
+ },
+ [0xF99F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0063F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x70C8 },
+ unicodeslot=0xF99F,
+ },
+ [0xF9A0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x88C2 },
+ unicodeslot=0xF9A0,
+ },
+ [0xF9A1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AAA },
+ unicodeslot=0xF9A1,
+ },
+ [0xF9A2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5EC9 },
+ unicodeslot=0xF9A2,
+ },
+ [0xF9A3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5FF5 },
+ unicodeslot=0xF9A3,
+ },
+ [0xF9A4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x637B },
+ unicodeslot=0xF9A4,
+ },
+ [0xF9A5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6BAE },
+ unicodeslot=0xF9A5,
+ },
+ [0xF9A6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7C3E },
+ unicodeslot=0xF9A6,
+ },
+ [0xF9A7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7375 },
+ unicodeslot=0xF9A7,
+ },
+ [0xF9A8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4EE4 },
+ unicodeslot=0xF9A8,
+ },
+ [0xF9A9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009A0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x56F9 },
+ unicodeslot=0xF9A9,
+ },
+ [0xF9AA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009AA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BE7 },
+ unicodeslot=0xF9AA,
+ },
+ [0xF9AB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009AB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5DBA },
+ unicodeslot=0xF9AB,
+ },
+ [0xF9AC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009AC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x601C },
+ unicodeslot=0xF9AC,
+ },
+ [0xF9AD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009AD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x73B2 },
+ unicodeslot=0xF9AD,
+ },
+ [0xF9AE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009AE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7469 },
+ unicodeslot=0xF9AE,
+ },
+ [0xF9AF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009AF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7F9A },
+ unicodeslot=0xF9AF,
+ },
+ [0xF9B0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8046 },
+ unicodeslot=0xF9B0,
+ },
+ [0xF9B1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9234 },
+ unicodeslot=0xF9B1,
+ },
+ [0xF9B2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96F6 },
+ unicodeslot=0xF9B2,
+ },
+ [0xF9B3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9748 },
+ unicodeslot=0xF9B3,
+ },
+ [0xF9B4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9818 },
+ unicodeslot=0xF9B4,
+ },
+ [0xF9B5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4F8B },
+ unicodeslot=0xF9B5,
+ },
+ [0xF9B6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x79AE },
+ unicodeslot=0xF9B6,
+ },
+ [0xF9B7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x91B4 },
+ unicodeslot=0xF9B7,
+ },
+ [0xF9B8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96B8 },
+ unicodeslot=0xF9B8,
+ },
+ [0xF9B9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009B0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x60E1 },
+ unicodeslot=0xF9B9,
+ },
+ [0xF9BA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E86 },
+ unicodeslot=0xF9BA,
+ },
+ [0xF9BB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009BB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x50DA },
+ unicodeslot=0xF9BB,
+ },
+ [0xF9BC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009BC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BEE },
+ unicodeslot=0xF9BC,
+ },
+ [0xF9BD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009BD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C3F },
+ unicodeslot=0xF9BD,
+ },
+ [0xF9BE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6599 },
+ unicodeslot=0xF9BE,
+ },
+ [0xF9BF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009BF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6A02 },
+ unicodeslot=0xF9BF,
+ },
+ [0xF9C0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x71CE },
+ unicodeslot=0xF9C0,
+ },
+ [0xF9C1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7642 },
+ unicodeslot=0xF9C1,
+ },
+ [0xF9C2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x84FC },
+ unicodeslot=0xF9C2,
+ },
+ [0xF9C3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x907C },
+ unicodeslot=0xF9C3,
+ },
+ [0xF9C4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F8D },
+ unicodeslot=0xF9C4,
+ },
+ [0xF9C5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6688 },
+ unicodeslot=0xF9C5,
+ },
+ [0xF9C6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x962E },
+ unicodeslot=0xF9C6,
+ },
+ [0xF9C7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5289 },
+ unicodeslot=0xF9C7,
+ },
+ [0xF9C8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x677B },
+ unicodeslot=0xF9C8,
+ },
+ [0xF9C9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009C0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x67F3 },
+ unicodeslot=0xF9C9,
+ },
+ [0xF9CA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009CA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D41 },
+ unicodeslot=0xF9CA,
+ },
+ [0xF9CB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009CB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6E9C },
+ unicodeslot=0xF9CB,
+ },
+ [0xF9CC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009CC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7409 },
+ unicodeslot=0xF9CC,
+ },
+ [0xF9CD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009CD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7559 },
+ unicodeslot=0xF9CD,
+ },
+ [0xF9CE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009CE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x786B },
+ unicodeslot=0xF9CE,
+ },
+ [0xF9CF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009CF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7D10 },
+ unicodeslot=0xF9CF,
+ },
+ [0xF9D0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x985E },
+ unicodeslot=0xF9D0,
+ },
+ [0xF9D1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x516D },
+ unicodeslot=0xF9D1,
+ },
+ [0xF9D2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x622E },
+ unicodeslot=0xF9D2,
+ },
+ [0xF9D3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9678 },
+ unicodeslot=0xF9D3,
+ },
+ [0xF9D4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x502B },
+ unicodeslot=0xF9D4,
+ },
+ [0xF9D5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5D19 },
+ unicodeslot=0xF9D5,
+ },
+ [0xF9D6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6DEA },
+ unicodeslot=0xF9D6,
+ },
+ [0xF9D7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8F2A },
+ unicodeslot=0xF9D7,
+ },
+ [0xF9D8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F8B },
+ unicodeslot=0xF9D8,
+ },
+ [0xF9D9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009D0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6144 },
+ unicodeslot=0xF9D9,
+ },
+ [0xF9DA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6817 },
+ unicodeslot=0xF9DA,
+ },
+ [0xF9DB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009DB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7387 },
+ unicodeslot=0xF9DB,
+ },
+ [0xF9DC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009DC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9686 },
+ unicodeslot=0xF9DC,
+ },
+ [0xF9DD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009DD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5229 },
+ unicodeslot=0xF9DD,
+ },
+ [0xF9DE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x540F },
+ unicodeslot=0xF9DE,
+ },
+ [0xF9DF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009DF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C65 },
+ unicodeslot=0xF9DF,
+ },
+ [0xF9E0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6613 },
+ unicodeslot=0xF9E0,
+ },
+ [0xF9E1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x674E },
+ unicodeslot=0xF9E1,
+ },
+ [0xF9E2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x68A8 },
+ unicodeslot=0xF9E2,
+ },
+ [0xF9E3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6CE5 },
+ unicodeslot=0xF9E3,
+ },
+ [0xF9E4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7406 },
+ unicodeslot=0xF9E4,
+ },
+ [0xF9E5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x75E2 },
+ unicodeslot=0xF9E5,
+ },
+ [0xF9E6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7F79 },
+ unicodeslot=0xF9E6,
+ },
+ [0xF9E7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x88CF },
+ unicodeslot=0xF9E7,
+ },
+ [0xF9E8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x88E1 },
+ unicodeslot=0xF9E8,
+ },
+ [0xF9E9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009E0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x91CC },
+ unicodeslot=0xF9E9,
+ },
+ [0xF9EA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009EA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96E2 },
+ unicodeslot=0xF9EA,
+ },
+ [0xF9EB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009EB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x533F },
+ unicodeslot=0xF9EB,
+ },
+ [0xF9EC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009EC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6EBA },
+ unicodeslot=0xF9EC,
+ },
+ [0xF9ED]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009ED",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x541D },
+ unicodeslot=0xF9ED,
+ },
+ [0xF9EE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009EE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x71D0 },
+ unicodeslot=0xF9EE,
+ },
+ [0xF9EF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009EF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7498 },
+ unicodeslot=0xF9EF,
+ },
+ [0xF9F0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x85FA },
+ unicodeslot=0xF9F0,
+ },
+ [0xF9F1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96A3 },
+ unicodeslot=0xF9F1,
+ },
+ [0xF9F2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9C57 },
+ unicodeslot=0xF9F2,
+ },
+ [0xF9F3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9E9F },
+ unicodeslot=0xF9F3,
+ },
+ [0xF9F4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6797 },
+ unicodeslot=0xF9F4,
+ },
+ [0xF9F5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6DCB },
+ unicodeslot=0xF9F5,
+ },
+ [0xF9F6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x81E8 },
+ unicodeslot=0xF9F6,
+ },
+ [0xF9F7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7ACB },
+ unicodeslot=0xF9F7,
+ },
+ [0xF9F8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7B20 },
+ unicodeslot=0xF9F8,
+ },
+ [0xF9F9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009F0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7C92 },
+ unicodeslot=0xF9F9,
+ },
+ [0xF9FA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009FA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x72C0 },
+ unicodeslot=0xF9FA,
+ },
+ [0xF9FB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009FB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7099 },
+ unicodeslot=0xF9FB,
+ },
+ [0xF9FC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009FC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B58 },
+ unicodeslot=0xF9FC,
+ },
+ [0xF9FD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009FD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4EC0 },
+ unicodeslot=0xF9FD,
+ },
+ [0xF9FE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009FE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8336 },
+ unicodeslot=0xF9FE,
+ },
+ [0xF9FF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-F0x0009FF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x523A },
+ unicodeslot=0xF9FF,
+ },
+ [0xFA00]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5207 },
+ unicodeslot=0xFA00,
+ },
+ [0xFA01]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5EA6 },
+ unicodeslot=0xFA01,
+ },
+ [0xFA02]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x62D3 },
+ unicodeslot=0xFA02,
+ },
+ [0xFA03]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7CD6 },
+ unicodeslot=0xFA03,
+ },
+ [0xFA04]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5B85 },
+ unicodeslot=0xFA04,
+ },
+ [0xFA05]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D1E },
+ unicodeslot=0xFA05,
+ },
+ [0xFA06]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x66B4 },
+ unicodeslot=0xFA06,
+ },
+ [0xFA07]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8F3B },
+ unicodeslot=0xFA07,
+ },
+ [0xFA08]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x884C },
+ unicodeslot=0xFA08,
+ },
+ [0xFA09]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x964D },
+ unicodeslot=0xFA09,
+ },
+ [0xFA0A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0000A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x898B },
+ unicodeslot=0xFA0A,
+ },
+ [0xFA0B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0000B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5ED3 },
+ unicodeslot=0xFA0B,
+ },
+ [0xFA0C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0000C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5140 },
+ unicodeslot=0xFA0C,
+ },
+ [0xFA0D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0000D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x55C0 },
+ unicodeslot=0xFA0D,
+ },
+ [0xFA0E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0000E",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA0E,
+ },
+ [0xFA0F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0000F",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA0F,
+ },
+ [0xFA10]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x000A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x585A },
+ unicodeslot=0xFA10,
+ },
+ [0xFA11]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x000B",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA11,
+ },
+ [0xFA12]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x000C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6674 },
+ unicodeslot=0xFA12,
+ },
+ [0xFA13]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x000D",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA13,
+ },
+ [0xFA14]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x000E",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA14,
+ },
+ [0xFA15]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x000F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51DE },
+ unicodeslot=0xFA15,
+ },
+ [0xFA16]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0010",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x732A },
+ unicodeslot=0xFA16,
+ },
+ [0xFA17]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0011",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x76CA },
+ unicodeslot=0xFA17,
+ },
+ [0xFA18]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0012",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x793C },
+ unicodeslot=0xFA18,
+ },
+ [0xFA19]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0013",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x795E },
+ unicodeslot=0xFA19,
+ },
+ [0xFA1A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0001A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7965 },
+ unicodeslot=0xFA1A,
+ },
+ [0xFA1B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0001B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x798F },
+ unicodeslot=0xFA1B,
+ },
+ [0xFA1C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0001C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9756 },
+ unicodeslot=0xFA1C,
+ },
+ [0xFA1D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0001D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7CBE },
+ unicodeslot=0xFA1D,
+ },
+ [0xFA1E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0001E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7FBD },
+ unicodeslot=0xFA1E,
+ },
+ [0xFA1F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0001F",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA1F,
+ },
+ [0xFA20]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0014",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8612 },
+ unicodeslot=0xFA20,
+ },
+ [0xFA21]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0015",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA21,
+ },
+ [0xFA22]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0016",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AF8 },
+ unicodeslot=0xFA22,
+ },
+ [0xFA23]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0017",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA23,
+ },
+ [0xFA24]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0018",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA24,
+ },
+ [0xFA25]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0019",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9038 },
+ unicodeslot=0xFA25,
+ },
+ [0xFA26]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x001A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x90FD },
+ unicodeslot=0xFA26,
+ },
+ [0xFA27]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x001B",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA27,
+ },
+ [0xFA28]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x001C",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA28,
+ },
+ [0xFA29]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x001D",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0xFA29,
+ },
+ [0xFA2A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0002A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x98EF },
+ unicodeslot=0xFA2A,
+ },
+ [0xFA2B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0002B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x98FC },
+ unicodeslot=0xFA2B,
+ },
+ [0xFA2C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0002C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9928 },
+ unicodeslot=0xFA2C,
+ },
+ [0xFA2D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0002D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9DB4 },
+ unicodeslot=0xFA2D,
+ },
+ [0xFA30]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x001E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4FAE },
+ unicodeslot=0xFA30,
+ },
+ [0xFA31]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x001F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x50E7 },
+ unicodeslot=0xFA31,
+ },
+ [0xFA32]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0020",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x514D },
+ unicodeslot=0xFA32,
+ },
+ [0xFA33]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0021",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52C9 },
+ unicodeslot=0xFA33,
+ },
+ [0xFA34]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0022",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52E4 },
+ unicodeslot=0xFA34,
+ },
+ [0xFA35]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0023",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5351 },
+ unicodeslot=0xFA35,
+ },
+ [0xFA36]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0024",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x559D },
+ unicodeslot=0xFA36,
+ },
+ [0xFA37]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0025",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5606 },
+ unicodeslot=0xFA37,
+ },
+ [0xFA38]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0026",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5668 },
+ unicodeslot=0xFA38,
+ },
+ [0xFA39]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0027",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5840 },
+ unicodeslot=0xFA39,
+ },
+ [0xFA3A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0003A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58A8 },
+ unicodeslot=0xFA3A,
+ },
+ [0xFA3B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0003B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C64 },
+ unicodeslot=0xFA3B,
+ },
+ [0xFA3C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0003C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C6E },
+ unicodeslot=0xFA3C,
+ },
+ [0xFA3D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0003D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6094 },
+ unicodeslot=0xFA3D,
+ },
+ [0xFA3E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0003E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6168 },
+ unicodeslot=0xFA3E,
+ },
+ [0xFA3F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0003F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x618E },
+ unicodeslot=0xFA3F,
+ },
+ [0xFA40]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0028",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61F2 },
+ unicodeslot=0xFA40,
+ },
+ [0xFA41]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0029",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x654F },
+ unicodeslot=0xFA41,
+ },
+ [0xFA42]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x002A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x65E2 },
+ unicodeslot=0xFA42,
+ },
+ [0xFA43]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x002B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6691 },
+ unicodeslot=0xFA43,
+ },
+ [0xFA44]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x002C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6885 },
+ unicodeslot=0xFA44,
+ },
+ [0xFA45]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x002D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D77 },
+ unicodeslot=0xFA45,
+ },
+ [0xFA46]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x002E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6E1A },
+ unicodeslot=0xFA46,
+ },
+ [0xFA47]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x002F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6F22 },
+ unicodeslot=0xFA47,
+ },
+ [0xFA48]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0030",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x716E },
+ unicodeslot=0xFA48,
+ },
+ [0xFA49]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0031",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x722B },
+ unicodeslot=0xFA49,
+ },
+ [0xFA4A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0004A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7422 },
+ unicodeslot=0xFA4A,
+ },
+ [0xFA4B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0004B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7891 },
+ unicodeslot=0xFA4B,
+ },
+ [0xFA4C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0004C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x793E },
+ unicodeslot=0xFA4C,
+ },
+ [0xFA4D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0004D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7949 },
+ unicodeslot=0xFA4D,
+ },
+ [0xFA4E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0004E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7948 },
+ unicodeslot=0xFA4E,
+ },
+ [0xFA4F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0004F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7950 },
+ unicodeslot=0xFA4F,
+ },
+ [0xFA50]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0032",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7956 },
+ unicodeslot=0xFA50,
+ },
+ [0xFA51]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0033",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x795D },
+ unicodeslot=0xFA51,
+ },
+ [0xFA52]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0034",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x798D },
+ unicodeslot=0xFA52,
+ },
+ [0xFA53]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0035",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x798E },
+ unicodeslot=0xFA53,
+ },
+ [0xFA54]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0036",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7A40 },
+ unicodeslot=0xFA54,
+ },
+ [0xFA55]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0037",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7A81 },
+ unicodeslot=0xFA55,
+ },
+ [0xFA56]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0038",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7BC0 },
+ unicodeslot=0xFA56,
+ },
+ [0xFA57]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0039",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7DF4 },
+ unicodeslot=0xFA57,
+ },
+ [0xFA58]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x003A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7E09 },
+ unicodeslot=0xFA58,
+ },
+ [0xFA59]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x003B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7E41 },
+ unicodeslot=0xFA59,
+ },
+ [0xFA5A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0005A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7F72 },
+ unicodeslot=0xFA5A,
+ },
+ [0xFA5B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0005B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8005 },
+ unicodeslot=0xFA5B,
+ },
+ [0xFA5C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0005C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x81ED },
+ unicodeslot=0xFA5C,
+ },
+ [0xFA5D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0005D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8279 },
+ unicodeslot=0xFA5D,
+ },
+ [0xFA5E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0005E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8279 },
+ unicodeslot=0xFA5E,
+ },
+ [0xFA5F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0005F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8457 },
+ unicodeslot=0xFA5F,
+ },
+ [0xFA60]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x003C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8910 },
+ unicodeslot=0xFA60,
+ },
+ [0xFA61]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x003D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8996 },
+ unicodeslot=0xFA61,
+ },
+ [0xFA62]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x003E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B01 },
+ unicodeslot=0xFA62,
+ },
+ [0xFA63]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x003F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B39 },
+ unicodeslot=0xFA63,
+ },
+ [0xFA64]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0040",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8CD3 },
+ unicodeslot=0xFA64,
+ },
+ [0xFA65]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0041",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8D08 },
+ unicodeslot=0xFA65,
+ },
+ [0xFA66]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0042",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8FB6 },
+ unicodeslot=0xFA66,
+ },
+ [0xFA67]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0043",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9038 },
+ unicodeslot=0xFA67,
+ },
+ [0xFA68]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0044",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96E3 },
+ unicodeslot=0xFA68,
+ },
+ [0xFA69]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0045",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x97FF },
+ unicodeslot=0xFA69,
+ },
+ [0xFA6A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0006A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x983B },
+ unicodeslot=0xFA6A,
+ },
+ [0xFA70]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0046",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E26 },
+ unicodeslot=0xFA70,
+ },
+ [0xFA71]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0047",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51B5 },
+ unicodeslot=0xFA71,
+ },
+ [0xFA72]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0048",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5168 },
+ unicodeslot=0xFA72,
+ },
+ [0xFA73]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0049",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4F80 },
+ unicodeslot=0xFA73,
+ },
+ [0xFA74]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x004A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5145 },
+ unicodeslot=0xFA74,
+ },
+ [0xFA75]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x004B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5180 },
+ unicodeslot=0xFA75,
+ },
+ [0xFA76]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x004C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52C7 },
+ unicodeslot=0xFA76,
+ },
+ [0xFA77]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x004D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52FA },
+ unicodeslot=0xFA77,
+ },
+ [0xFA78]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x004E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x559D },
+ unicodeslot=0xFA78,
+ },
+ [0xFA79]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x004F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5555 },
+ unicodeslot=0xFA79,
+ },
+ [0xFA7A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0007A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5599 },
+ unicodeslot=0xFA7A,
+ },
+ [0xFA7B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0007B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x55E2 },
+ unicodeslot=0xFA7B,
+ },
+ [0xFA7C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0007C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x585A },
+ unicodeslot=0xFA7C,
+ },
+ [0xFA7D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0007D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58B3 },
+ unicodeslot=0xFA7D,
+ },
+ [0xFA7E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0007E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5944 },
+ unicodeslot=0xFA7E,
+ },
+ [0xFA7F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0007F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5954 },
+ unicodeslot=0xFA7F,
+ },
+ [0xFA80]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0050",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5A62 },
+ unicodeslot=0xFA80,
+ },
+ [0xFA81]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0051",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5B28 },
+ unicodeslot=0xFA81,
+ },
+ [0xFA82]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0052",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5ED2 },
+ unicodeslot=0xFA82,
+ },
+ [0xFA83]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0053",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5ED9 },
+ unicodeslot=0xFA83,
+ },
+ [0xFA84]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0054",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F69 },
+ unicodeslot=0xFA84,
+ },
+ [0xFA85]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0055",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5FAD },
+ unicodeslot=0xFA85,
+ },
+ [0xFA86]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0056",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x60D8 },
+ unicodeslot=0xFA86,
+ },
+ [0xFA87]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0057",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x614E },
+ unicodeslot=0xFA87,
+ },
+ [0xFA88]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0058",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6108 },
+ unicodeslot=0xFA88,
+ },
+ [0xFA89]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0059",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x618E },
+ unicodeslot=0xFA89,
+ },
+ [0xFA8A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0008A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6160 },
+ unicodeslot=0xFA8A,
+ },
+ [0xFA8B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0008B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61F2 },
+ unicodeslot=0xFA8B,
+ },
+ [0xFA8C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0008C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6234 },
+ unicodeslot=0xFA8C,
+ },
+ [0xFA8D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0008D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x63C4 },
+ unicodeslot=0xFA8D,
+ },
+ [0xFA8E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0008E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x641C },
+ unicodeslot=0xFA8E,
+ },
+ [0xFA8F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0008F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6452 },
+ unicodeslot=0xFA8F,
+ },
+ [0xFA90]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x005A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6556 },
+ unicodeslot=0xFA90,
+ },
+ [0xFA91]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x005B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6674 },
+ unicodeslot=0xFA91,
+ },
+ [0xFA92]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x005C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6717 },
+ unicodeslot=0xFA92,
+ },
+ [0xFA93]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x005D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x671B },
+ unicodeslot=0xFA93,
+ },
+ [0xFA94]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x005E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6756 },
+ unicodeslot=0xFA94,
+ },
+ [0xFA95]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x005F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6B79 },
+ unicodeslot=0xFA95,
+ },
+ [0xFA96]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0060",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6BBA },
+ unicodeslot=0xFA96,
+ },
+ [0xFA97]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0061",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D41 },
+ unicodeslot=0xFA97,
+ },
+ [0xFA98]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0062",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6EDB },
+ unicodeslot=0xFA98,
+ },
+ [0xFA99]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0063",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6ECB },
+ unicodeslot=0xFA99,
+ },
+ [0xFA9A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0009A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6F22 },
+ unicodeslot=0xFA9A,
+ },
+ [0xFA9B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0009B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x701E },
+ unicodeslot=0xFA9B,
+ },
+ [0xFA9C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0009C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x716E },
+ unicodeslot=0xFA9C,
+ },
+ [0xFA9D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0009D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x77A7 },
+ unicodeslot=0xFA9D,
+ },
+ [0xFA9E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0009E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7235 },
+ unicodeslot=0xFA9E,
+ },
+ [0xFA9F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FA0x0009F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x72AF },
+ unicodeslot=0xFA9F,
+ },
+ [0xFAA0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x732A },
+ unicodeslot=0xFAA0,
+ },
+ [0xFAA1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7471 },
+ unicodeslot=0xFAA1,
+ },
+ [0xFAA2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7506 },
+ unicodeslot=0xFAA2,
+ },
+ [0xFAA3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x753B },
+ unicodeslot=0xFAA3,
+ },
+ [0xFAA4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x761D },
+ unicodeslot=0xFAA4,
+ },
+ [0xFAA5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x761F },
+ unicodeslot=0xFAA5,
+ },
+ [0xFAA6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x76CA },
+ unicodeslot=0xFAA6,
+ },
+ [0xFAA7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x76DB },
+ unicodeslot=0xFAA7,
+ },
+ [0xFAA8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x76F4 },
+ unicodeslot=0xFAA8,
+ },
+ [0xFAA9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAA0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x774A },
+ unicodeslot=0xFAA9,
+ },
+ [0xFAAA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAAA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7740 },
+ unicodeslot=0xFAAA,
+ },
+ [0xFAAB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAAB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x78CC },
+ unicodeslot=0xFAAB,
+ },
+ [0xFAAC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAAC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7AB1 },
+ unicodeslot=0xFAAC,
+ },
+ [0xFAAD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAAD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7BC0 },
+ unicodeslot=0xFAAD,
+ },
+ [0xFAAE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAAE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7C7B },
+ unicodeslot=0xFAAE,
+ },
+ [0xFAAF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAAF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7D5B },
+ unicodeslot=0xFAAF,
+ },
+ [0xFAB0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7DF4 },
+ unicodeslot=0xFAB0,
+ },
+ [0xFAB1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7F3E },
+ unicodeslot=0xFAB1,
+ },
+ [0xFAB2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8005 },
+ unicodeslot=0xFAB2,
+ },
+ [0xFAB3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8352 },
+ unicodeslot=0xFAB3,
+ },
+ [0xFAB4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83EF },
+ unicodeslot=0xFAB4,
+ },
+ [0xFAB5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8779 },
+ unicodeslot=0xFAB5,
+ },
+ [0xFAB6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8941 },
+ unicodeslot=0xFAB6,
+ },
+ [0xFAB7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8986 },
+ unicodeslot=0xFAB7,
+ },
+ [0xFAB8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8996 },
+ unicodeslot=0xFAB8,
+ },
+ [0xFAB9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAB0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8ABF },
+ unicodeslot=0xFAB9,
+ },
+ [0xFABA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FABA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AF8 },
+ unicodeslot=0xFABA,
+ },
+ [0xFABB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FABB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8ACB },
+ unicodeslot=0xFABB,
+ },
+ [0xFABC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FABC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B01 },
+ unicodeslot=0xFABC,
+ },
+ [0xFABD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FABD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AFE },
+ unicodeslot=0xFABD,
+ },
+ [0xFABE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FABE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AED },
+ unicodeslot=0xFABE,
+ },
+ [0xFABF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FABF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B39 },
+ unicodeslot=0xFABF,
+ },
+ [0xFAC0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B8A },
+ unicodeslot=0xFAC0,
+ },
+ [0xFAC1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8D08 },
+ unicodeslot=0xFAC1,
+ },
+ [0xFAC2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8F38 },
+ unicodeslot=0xFAC2,
+ },
+ [0xFAC3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9072 },
+ unicodeslot=0xFAC3,
+ },
+ [0xFAC4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9199 },
+ unicodeslot=0xFAC4,
+ },
+ [0xFAC5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9276 },
+ unicodeslot=0xFAC5,
+ },
+ [0xFAC6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x967C },
+ unicodeslot=0xFAC6,
+ },
+ [0xFAC7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96E3 },
+ unicodeslot=0xFAC7,
+ },
+ [0xFAC8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9756 },
+ unicodeslot=0xFAC8,
+ },
+ [0xFAC9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAC0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x97DB },
+ unicodeslot=0xFAC9,
+ },
+ [0xFACA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FACA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x97FF },
+ unicodeslot=0xFACA,
+ },
+ [0xFACB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FACB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x980B },
+ unicodeslot=0xFACB,
+ },
+ [0xFACC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FACC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x983B },
+ unicodeslot=0xFACC,
+ },
+ [0xFACD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FACD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9B12 },
+ unicodeslot=0xFACD,
+ },
+ [0xFACE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FACE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F9C },
+ unicodeslot=0xFACE,
+ },
+ [0xFACF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FACF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2284A },
+ unicodeslot=0xFACF,
+ },
+ [0xFAD0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x22844 },
+ unicodeslot=0xFAD0,
+ },
+ [0xFAD1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x233D5 },
+ unicodeslot=0xFAD1,
+ },
+ [0xFAD2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3B9D },
+ unicodeslot=0xFAD2,
+ },
+ [0xFAD3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4018 },
+ unicodeslot=0xFAD3,
+ },
+ [0xFAD4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4039 },
+ unicodeslot=0xFAD4,
+ },
+ [0xFAD5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25249 },
+ unicodeslot=0xFAD5,
+ },
+ [0xFAD6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25CD0 },
+ unicodeslot=0xFAD6,
+ },
+ [0xFAD7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x27ED3 },
+ unicodeslot=0xFAD7,
+ },
+ [0xFAD8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F43 },
+ unicodeslot=0xFAD8,
+ },
+ [0xFAD9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-FAD0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F8E },
+ unicodeslot=0xFAD9,
+ },
+ [0xFB00]={
+ category="ll",
+ contextname="ffligature",
+ description="LATIN SMALL LIGATURE FF",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0066, 0x0066 },
+ unicodeslot=0xFB00,
+ },
+ [0xFB01]={
+ category="ll",
+ contextname="filigature",
+ description="LATIN SMALL LIGATURE FI",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x0066, 0x0069 },
+ specials={ "compat", 0x0066, 0x0069 },
+ unicodeslot=0xFB01,
+ },
+ [0xFB02]={
+ category="ll",
+ contextname="flligature",
+ description="LATIN SMALL LIGATURE FL",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x0066, 0x006C },
+ specials={ "compat", 0x0066, 0x006C },
+ unicodeslot=0xFB02,
+ },
+ [0xFB03]={
+ category="ll",
+ contextname="ffiligature",
+ description="LATIN SMALL LIGATURE FFI",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x0066, 0x0069 },
+ specials={ "compat", 0x0066, 0x0066, 0x0069 },
+ unicodeslot=0xFB03,
+ },
+ [0xFB04]={
+ category="ll",
+ contextname="fflligature",
+ description="LATIN SMALL LIGATURE FFL",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x0066, 0x006C },
+ specials={ "compat", 0x0066, 0x0066, 0x006C },
+ unicodeslot=0xFB04,
+ },
+ [0xFB05]={
+ category="ll",
+ description="LATIN SMALL LIGATURE LONG S T",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x017F, 0x0074 },
+ unicodeslot=0xFB05,
+ },
+ [0xFB06]={
+ category="ll",
+ contextname="stligature",
+ description="LATIN SMALL LIGATURE ST",
+ direction="l",
+ linebreak="al",
+ shcode={ 0x0073, 0x0074 },
+ specials={ "compat", 0x0073, 0x0074 },
+ unicodeslot=0xFB06,
+ },
+ [0xFB13]={
+ category="ll",
+ description="ARMENIAN SMALL LIGATURE MEN NOW",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0574, 0x0576 },
+ unicodeslot=0xFB13,
+ },
+ [0xFB14]={
+ category="ll",
+ description="ARMENIAN SMALL LIGATURE MEN ECH",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0574, 0x0565 },
+ unicodeslot=0xFB14,
+ },
+ [0xFB15]={
+ category="ll",
+ description="ARMENIAN SMALL LIGATURE MEN INI",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0574, 0x056B },
+ unicodeslot=0xFB15,
+ },
+ [0xFB16]={
+ category="ll",
+ description="ARMENIAN SMALL LIGATURE VEW NOW",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x057E, 0x0576 },
+ unicodeslot=0xFB16,
+ },
+ [0xFB17]={
+ category="ll",
+ description="ARMENIAN SMALL LIGATURE MEN XEH",
+ direction="l",
+ linebreak="al",
+ specials={ "compat", 0x0574, 0x056D },
+ unicodeslot=0xFB17,
+ },
+ [0xFB1D]={
+ category="lo",
+ description="HEBREW LETTER YOD WITH HIRIQ",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D9,
+ specials={ "char", 0x05D9, 0x05B4 },
+ unicodeslot=0xFB1D,
+ },
+ [0xFB1E]={
+ category="mn",
+ description="HEBREW POINT JUDEO-SPANISH VARIKA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFB1E,
+ },
+ [0xFB1F]={
+ category="lo",
+ description="HEBREW LIGATURE YIDDISH YOD YOD PATAH",
+ direction="r",
+ linebreak="al",
+ specials={ "char", 0x05F2, 0x05B7 },
+ unicodeslot=0xFB1F,
+ },
+ [0xFB20]={
+ category="lo",
+ description="HEBREW LETTER ALTERNATIVE AYIN",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05E2 },
+ unicodeslot=0xFB20,
+ },
+ [0xFB21]={
+ category="lo",
+ description="HEBREW LETTER WIDE ALEF",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05D0 },
+ unicodeslot=0xFB21,
+ },
+ [0xFB22]={
+ category="lo",
+ description="HEBREW LETTER WIDE DALET",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05D3 },
+ unicodeslot=0xFB22,
+ },
+ [0xFB23]={
+ category="lo",
+ description="HEBREW LETTER WIDE HE",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05D4 },
+ unicodeslot=0xFB23,
+ },
+ [0xFB24]={
+ category="lo",
+ description="HEBREW LETTER WIDE KAF",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05DB },
+ unicodeslot=0xFB24,
+ },
+ [0xFB25]={
+ category="lo",
+ description="HEBREW LETTER WIDE LAMED",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05DC },
+ unicodeslot=0xFB25,
+ },
+ [0xFB26]={
+ category="lo",
+ description="HEBREW LETTER WIDE FINAL MEM",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05DD },
+ unicodeslot=0xFB26,
+ },
+ [0xFB27]={
+ category="lo",
+ description="HEBREW LETTER WIDE RESH",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05E8 },
+ unicodeslot=0xFB27,
+ },
+ [0xFB28]={
+ category="lo",
+ description="HEBREW LETTER WIDE TAV",
+ direction="r",
+ linebreak="al",
+ specials={ "font", 0x05EA },
+ unicodeslot=0xFB28,
+ },
+ [0xFB29]={
+ category="sm",
+ description="HEBREW LETTER ALTERNATIVE PLUS SIGN",
+ direction="es",
+ linebreak="al",
+ specials={ "font", 0x002B },
+ unicodeslot=0xFB29,
+ },
+ [0xFB2A]={
+ category="lo",
+ description="HEBREW LETTER SHIN WITH SHIN DOT",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E9,
+ specials={ "char", 0x05E9, 0x05C1 },
+ unicodeslot=0xFB2A,
+ },
+ [0xFB2B]={
+ category="lo",
+ description="HEBREW LETTER SHIN WITH SIN DOT",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E9,
+ specials={ "char", 0x05E9, 0x05C2 },
+ unicodeslot=0xFB2B,
+ },
+ [0xFB2C]={
+ category="lo",
+ description="HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E9,
+ specials={ "char", 0xFB49, 0x05C1 },
+ unicodeslot=0xFB2C,
+ },
+ [0xFB2D]={
+ category="lo",
+ description="HEBREW LETTER SHIN WITH DAGESH AND SIN DOT",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E9,
+ specials={ "char", 0xFB49, 0x05C2 },
+ unicodeslot=0xFB2D,
+ },
+ [0xFB2E]={
+ category="lo",
+ description="HEBREW LETTER ALEF WITH PATAH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D0,
+ specials={ "char", 0x05D0, 0x05B7 },
+ unicodeslot=0xFB2E,
+ },
+ [0xFB2F]={
+ category="lo",
+ description="HEBREW LETTER ALEF WITH QAMATS",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D0,
+ specials={ "char", 0x05D0, 0x05B8 },
+ unicodeslot=0xFB2F,
+ },
+ [0xFB30]={
+ category="lo",
+ description="HEBREW LETTER ALEF WITH MAPIQ",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D0,
+ specials={ "char", 0x05D0, 0x05BC },
+ unicodeslot=0xFB30,
+ },
+ [0xFB31]={
+ category="lo",
+ description="HEBREW LETTER BET WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D1,
+ specials={ "char", 0x05D1, 0x05BC },
+ unicodeslot=0xFB31,
+ },
+ [0xFB32]={
+ category="lo",
+ description="HEBREW LETTER GIMEL WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D2,
+ specials={ "char", 0x05D2, 0x05BC },
+ unicodeslot=0xFB32,
+ },
+ [0xFB33]={
+ category="lo",
+ description="HEBREW LETTER DALET WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D3,
+ specials={ "char", 0x05D3, 0x05BC },
+ unicodeslot=0xFB33,
+ },
+ [0xFB34]={
+ category="lo",
+ description="HEBREW LETTER HE WITH MAPIQ",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D4,
+ specials={ "char", 0x05D4, 0x05BC },
+ unicodeslot=0xFB34,
+ },
+ [0xFB35]={
+ category="lo",
+ description="HEBREW LETTER VAV WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D5,
+ specials={ "char", 0x05D5, 0x05BC },
+ unicodeslot=0xFB35,
+ },
+ [0xFB36]={
+ category="lo",
+ description="HEBREW LETTER ZAYIN WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D6,
+ specials={ "char", 0x05D6, 0x05BC },
+ unicodeslot=0xFB36,
+ },
+ [0xFB38]={
+ category="lo",
+ description="HEBREW LETTER TET WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D8,
+ specials={ "char", 0x05D8, 0x05BC },
+ unicodeslot=0xFB38,
+ },
+ [0xFB39]={
+ category="lo",
+ description="HEBREW LETTER YOD WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D9,
+ specials={ "char", 0x05D9, 0x05BC },
+ unicodeslot=0xFB39,
+ },
+ [0xFB3A]={
+ category="lo",
+ description="HEBREW LETTER FINAL KAF WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ specials={ "char", 0x05DA, 0x05BC },
+ unicodeslot=0xFB3A,
+ },
+ [0xFB3B]={
+ category="lo",
+ description="HEBREW LETTER KAF WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05DB,
+ specials={ "char", 0x05DB, 0x05BC },
+ unicodeslot=0xFB3B,
+ },
+ [0xFB3C]={
+ category="lo",
+ description="HEBREW LETTER LAMED WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05DC,
+ specials={ "char", 0x05DC, 0x05BC },
+ unicodeslot=0xFB3C,
+ },
+ [0xFB3E]={
+ category="lo",
+ description="HEBREW LETTER MEM WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05DE,
+ specials={ "char", 0x05DE, 0x05BC },
+ unicodeslot=0xFB3E,
+ },
+ [0xFB40]={
+ category="lo",
+ description="HEBREW LETTER NUN WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E0,
+ specials={ "char", 0x05E0, 0x05BC },
+ unicodeslot=0xFB40,
+ },
+ [0xFB41]={
+ category="lo",
+ description="HEBREW LETTER SAMEKH WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E1,
+ specials={ "char", 0x05E1, 0x05BC },
+ unicodeslot=0xFB41,
+ },
+ [0xFB43]={
+ category="lo",
+ description="HEBREW LETTER FINAL PE WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ specials={ "char", 0x05E3, 0x05BC },
+ unicodeslot=0xFB43,
+ },
+ [0xFB44]={
+ category="lo",
+ description="HEBREW LETTER PE WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E4,
+ specials={ "char", 0x05E4, 0x05BC },
+ unicodeslot=0xFB44,
+ },
+ [0xFB46]={
+ category="lo",
+ description="HEBREW LETTER TSADI WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E6,
+ specials={ "char", 0x05E6, 0x05BC },
+ unicodeslot=0xFB46,
+ },
+ [0xFB47]={
+ category="lo",
+ description="HEBREW LETTER QOF WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E7,
+ specials={ "char", 0x05E7, 0x05BC },
+ unicodeslot=0xFB47,
+ },
+ [0xFB48]={
+ category="lo",
+ description="HEBREW LETTER RESH WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E8,
+ specials={ "char", 0x05E8, 0x05BC },
+ unicodeslot=0xFB48,
+ },
+ [0xFB49]={
+ category="lo",
+ description="HEBREW LETTER SHIN WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E9,
+ specials={ "char", 0x05E9, 0x05BC },
+ unicodeslot=0xFB49,
+ },
+ [0xFB4A]={
+ category="lo",
+ description="HEBREW LETTER TAV WITH DAGESH",
+ direction="r",
+ linebreak="al",
+ shcode=0x05EA,
+ specials={ "char", 0x05EA, 0x05BC },
+ unicodeslot=0xFB4A,
+ },
+ [0xFB4B]={
+ category="lo",
+ description="HEBREW LETTER VAV WITH HOLAM",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D5,
+ specials={ "char", 0x05D5, 0x05B9 },
+ unicodeslot=0xFB4B,
+ },
+ [0xFB4C]={
+ category="lo",
+ description="HEBREW LETTER BET WITH RAFE",
+ direction="r",
+ linebreak="al",
+ shcode=0x05D1,
+ specials={ "char", 0x05D1, 0x05BF },
+ unicodeslot=0xFB4C,
+ },
+ [0xFB4D]={
+ category="lo",
+ description="HEBREW LETTER KAF WITH RAFE",
+ direction="r",
+ linebreak="al",
+ shcode=0x05DB,
+ specials={ "char", 0x05DB, 0x05BF },
+ unicodeslot=0xFB4D,
+ },
+ [0xFB4E]={
+ category="lo",
+ description="HEBREW LETTER PE WITH RAFE",
+ direction="r",
+ linebreak="al",
+ shcode=0x05E4,
+ specials={ "char", 0x05E4, 0x05BF },
+ unicodeslot=0xFB4E,
+ },
+ [0xFB4F]={
+ category="lo",
+ description="HEBREW LIGATURE ALEF LAMED",
+ direction="r",
+ linebreak="al",
+ specials={ "compat", 0x05D0, 0x05DC },
+ unicodeslot=0xFB4F,
+ },
+ [0xFB50]={
+ category="lo",
+ description="ARABIC LETTER ALEF WASLA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0671 },
+ unicodeslot=0xFB50,
+ },
+ [0xFB51]={
+ category="lo",
+ description="ARABIC LETTER ALEF WASLA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0671 },
+ unicodeslot=0xFB51,
+ },
+ [0xFB52]={
+ category="lo",
+ description="ARABIC LETTER BEEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x067B },
+ unicodeslot=0xFB52,
+ },
+ [0xFB53]={
+ category="lo",
+ description="ARABIC LETTER BEEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x067B },
+ unicodeslot=0xFB53,
+ },
+ [0xFB54]={
+ category="lo",
+ description="ARABIC LETTER BEEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x067B },
+ unicodeslot=0xFB54,
+ },
+ [0xFB55]={
+ category="lo",
+ description="ARABIC LETTER BEEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x067B },
+ unicodeslot=0xFB55,
+ },
+ [0xFB56]={
+ category="lo",
+ description="ARABIC LETTER PEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x067E },
+ unicodeslot=0xFB56,
+ },
+ [0xFB57]={
+ category="lo",
+ description="ARABIC LETTER PEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x067E },
+ unicodeslot=0xFB57,
+ },
+ [0xFB58]={
+ category="lo",
+ description="ARABIC LETTER PEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x067E },
+ unicodeslot=0xFB58,
+ },
+ [0xFB59]={
+ category="lo",
+ description="ARABIC LETTER PEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x067E },
+ unicodeslot=0xFB59,
+ },
+ [0xFB5A]={
+ category="lo",
+ description="ARABIC LETTER BEHEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0680 },
+ unicodeslot=0xFB5A,
+ },
+ [0xFB5B]={
+ category="lo",
+ description="ARABIC LETTER BEHEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0680 },
+ unicodeslot=0xFB5B,
+ },
+ [0xFB5C]={
+ category="lo",
+ description="ARABIC LETTER BEHEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0680 },
+ unicodeslot=0xFB5C,
+ },
+ [0xFB5D]={
+ category="lo",
+ description="ARABIC LETTER BEHEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0680 },
+ unicodeslot=0xFB5D,
+ },
+ [0xFB5E]={
+ category="lo",
+ description="ARABIC LETTER TTEHEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x067A },
+ unicodeslot=0xFB5E,
+ },
+ [0xFB5F]={
+ category="lo",
+ description="ARABIC LETTER TTEHEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x067A },
+ unicodeslot=0xFB5F,
+ },
+ [0xFB60]={
+ category="lo",
+ description="ARABIC LETTER TTEHEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x067A },
+ unicodeslot=0xFB60,
+ },
+ [0xFB61]={
+ category="lo",
+ description="ARABIC LETTER TTEHEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x067A },
+ unicodeslot=0xFB61,
+ },
+ [0xFB62]={
+ category="lo",
+ description="ARABIC LETTER TEHEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x067F },
+ unicodeslot=0xFB62,
+ },
+ [0xFB63]={
+ category="lo",
+ description="ARABIC LETTER TEHEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x067F },
+ unicodeslot=0xFB63,
+ },
+ [0xFB64]={
+ category="lo",
+ description="ARABIC LETTER TEHEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x067F },
+ unicodeslot=0xFB64,
+ },
+ [0xFB65]={
+ category="lo",
+ description="ARABIC LETTER TEHEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x067F },
+ unicodeslot=0xFB65,
+ },
+ [0xFB66]={
+ category="lo",
+ description="ARABIC LETTER TTEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0679 },
+ unicodeslot=0xFB66,
+ },
+ [0xFB67]={
+ category="lo",
+ description="ARABIC LETTER TTEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0679 },
+ unicodeslot=0xFB67,
+ },
+ [0xFB68]={
+ category="lo",
+ description="ARABIC LETTER TTEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0679 },
+ unicodeslot=0xFB68,
+ },
+ [0xFB69]={
+ category="lo",
+ description="ARABIC LETTER TTEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0679 },
+ unicodeslot=0xFB69,
+ },
+ [0xFB6A]={
+ category="lo",
+ description="ARABIC LETTER VEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06A4 },
+ unicodeslot=0xFB6A,
+ },
+ [0xFB6B]={
+ category="lo",
+ description="ARABIC LETTER VEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06A4 },
+ unicodeslot=0xFB6B,
+ },
+ [0xFB6C]={
+ category="lo",
+ description="ARABIC LETTER VEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06A4 },
+ unicodeslot=0xFB6C,
+ },
+ [0xFB6D]={
+ category="lo",
+ description="ARABIC LETTER VEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06A4 },
+ unicodeslot=0xFB6D,
+ },
+ [0xFB6E]={
+ category="lo",
+ description="ARABIC LETTER PEHEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06A6 },
+ unicodeslot=0xFB6E,
+ },
+ [0xFB6F]={
+ category="lo",
+ description="ARABIC LETTER PEHEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06A6 },
+ unicodeslot=0xFB6F,
+ },
+ [0xFB70]={
+ category="lo",
+ description="ARABIC LETTER PEHEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06A6 },
+ unicodeslot=0xFB70,
+ },
+ [0xFB71]={
+ category="lo",
+ description="ARABIC LETTER PEHEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06A6 },
+ unicodeslot=0xFB71,
+ },
+ [0xFB72]={
+ category="lo",
+ description="ARABIC LETTER DYEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0684 },
+ unicodeslot=0xFB72,
+ },
+ [0xFB73]={
+ category="lo",
+ description="ARABIC LETTER DYEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0684 },
+ unicodeslot=0xFB73,
+ },
+ [0xFB74]={
+ category="lo",
+ description="ARABIC LETTER DYEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0684 },
+ unicodeslot=0xFB74,
+ },
+ [0xFB75]={
+ category="lo",
+ description="ARABIC LETTER DYEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0684 },
+ unicodeslot=0xFB75,
+ },
+ [0xFB76]={
+ category="lo",
+ description="ARABIC LETTER NYEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0683 },
+ unicodeslot=0xFB76,
+ },
+ [0xFB77]={
+ category="lo",
+ description="ARABIC LETTER NYEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0683 },
+ unicodeslot=0xFB77,
+ },
+ [0xFB78]={
+ category="lo",
+ description="ARABIC LETTER NYEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0683 },
+ unicodeslot=0xFB78,
+ },
+ [0xFB79]={
+ category="lo",
+ description="ARABIC LETTER NYEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0683 },
+ unicodeslot=0xFB79,
+ },
+ [0xFB7A]={
+ category="lo",
+ description="ARABIC LETTER TCHEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0686 },
+ unicodeslot=0xFB7A,
+ },
+ [0xFB7B]={
+ category="lo",
+ description="ARABIC LETTER TCHEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0686 },
+ unicodeslot=0xFB7B,
+ },
+ [0xFB7C]={
+ category="lo",
+ description="ARABIC LETTER TCHEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0686 },
+ unicodeslot=0xFB7C,
+ },
+ [0xFB7D]={
+ category="lo",
+ description="ARABIC LETTER TCHEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0686 },
+ unicodeslot=0xFB7D,
+ },
+ [0xFB7E]={
+ category="lo",
+ description="ARABIC LETTER TCHEHEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0687 },
+ unicodeslot=0xFB7E,
+ },
+ [0xFB7F]={
+ category="lo",
+ description="ARABIC LETTER TCHEHEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0687 },
+ unicodeslot=0xFB7F,
+ },
+ [0xFB80]={
+ category="lo",
+ description="ARABIC LETTER TCHEHEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0687 },
+ unicodeslot=0xFB80,
+ },
+ [0xFB81]={
+ category="lo",
+ description="ARABIC LETTER TCHEHEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0687 },
+ unicodeslot=0xFB81,
+ },
+ [0xFB82]={
+ category="lo",
+ description="ARABIC LETTER DDAHAL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x068D },
+ unicodeslot=0xFB82,
+ },
+ [0xFB83]={
+ category="lo",
+ description="ARABIC LETTER DDAHAL FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x068D },
+ unicodeslot=0xFB83,
+ },
+ [0xFB84]={
+ category="lo",
+ description="ARABIC LETTER DAHAL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x068C },
+ unicodeslot=0xFB84,
+ },
+ [0xFB85]={
+ category="lo",
+ description="ARABIC LETTER DAHAL FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x068C },
+ unicodeslot=0xFB85,
+ },
+ [0xFB86]={
+ category="lo",
+ description="ARABIC LETTER DUL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x068E },
+ unicodeslot=0xFB86,
+ },
+ [0xFB87]={
+ category="lo",
+ description="ARABIC LETTER DUL FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x068E },
+ unicodeslot=0xFB87,
+ },
+ [0xFB88]={
+ category="lo",
+ description="ARABIC LETTER DDAL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0688 },
+ unicodeslot=0xFB88,
+ },
+ [0xFB89]={
+ category="lo",
+ description="ARABIC LETTER DDAL FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0688 },
+ unicodeslot=0xFB89,
+ },
+ [0xFB8A]={
+ category="lo",
+ description="ARABIC LETTER JEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0698 },
+ unicodeslot=0xFB8A,
+ },
+ [0xFB8B]={
+ category="lo",
+ description="ARABIC LETTER JEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0698 },
+ unicodeslot=0xFB8B,
+ },
+ [0xFB8C]={
+ category="lo",
+ description="ARABIC LETTER RREH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0691 },
+ unicodeslot=0xFB8C,
+ },
+ [0xFB8D]={
+ category="lo",
+ description="ARABIC LETTER RREH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0691 },
+ unicodeslot=0xFB8D,
+ },
+ [0xFB8E]={
+ category="lo",
+ description="ARABIC LETTER KEHEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06A9 },
+ unicodeslot=0xFB8E,
+ },
+ [0xFB8F]={
+ category="lo",
+ description="ARABIC LETTER KEHEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06A9 },
+ unicodeslot=0xFB8F,
+ },
+ [0xFB90]={
+ category="lo",
+ description="ARABIC LETTER KEHEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06A9 },
+ unicodeslot=0xFB90,
+ },
+ [0xFB91]={
+ category="lo",
+ description="ARABIC LETTER KEHEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06A9 },
+ unicodeslot=0xFB91,
+ },
+ [0xFB92]={
+ category="lo",
+ description="ARABIC LETTER GAF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06AF },
+ unicodeslot=0xFB92,
+ },
+ [0xFB93]={
+ category="lo",
+ description="ARABIC LETTER GAF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06AF },
+ unicodeslot=0xFB93,
+ },
+ [0xFB94]={
+ category="lo",
+ description="ARABIC LETTER GAF INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06AF },
+ unicodeslot=0xFB94,
+ },
+ [0xFB95]={
+ category="lo",
+ description="ARABIC LETTER GAF MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06AF },
+ unicodeslot=0xFB95,
+ },
+ [0xFB96]={
+ category="lo",
+ description="ARABIC LETTER GUEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06B3 },
+ unicodeslot=0xFB96,
+ },
+ [0xFB97]={
+ category="lo",
+ description="ARABIC LETTER GUEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06B3 },
+ unicodeslot=0xFB97,
+ },
+ [0xFB98]={
+ category="lo",
+ description="ARABIC LETTER GUEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06B3 },
+ unicodeslot=0xFB98,
+ },
+ [0xFB99]={
+ category="lo",
+ description="ARABIC LETTER GUEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06B3 },
+ unicodeslot=0xFB99,
+ },
+ [0xFB9A]={
+ category="lo",
+ description="ARABIC LETTER NGOEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06B1 },
+ unicodeslot=0xFB9A,
+ },
+ [0xFB9B]={
+ category="lo",
+ description="ARABIC LETTER NGOEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06B1 },
+ unicodeslot=0xFB9B,
+ },
+ [0xFB9C]={
+ category="lo",
+ description="ARABIC LETTER NGOEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06B1 },
+ unicodeslot=0xFB9C,
+ },
+ [0xFB9D]={
+ category="lo",
+ description="ARABIC LETTER NGOEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06B1 },
+ unicodeslot=0xFB9D,
+ },
+ [0xFB9E]={
+ category="lo",
+ description="ARABIC LETTER NOON GHUNNA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06BA },
+ unicodeslot=0xFB9E,
+ },
+ [0xFB9F]={
+ category="lo",
+ description="ARABIC LETTER NOON GHUNNA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06BA },
+ unicodeslot=0xFB9F,
+ },
+ [0xFBA0]={
+ category="lo",
+ description="ARABIC LETTER RNOON ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06BB },
+ unicodeslot=0xFBA0,
+ },
+ [0xFBA1]={
+ category="lo",
+ description="ARABIC LETTER RNOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06BB },
+ unicodeslot=0xFBA1,
+ },
+ [0xFBA2]={
+ category="lo",
+ description="ARABIC LETTER RNOON INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06BB },
+ unicodeslot=0xFBA2,
+ },
+ [0xFBA3]={
+ category="lo",
+ description="ARABIC LETTER RNOON MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06BB },
+ unicodeslot=0xFBA3,
+ },
+ [0xFBA4]={
+ category="lo",
+ description="ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0647,
+ specials={ "isolated", 0x06C0 },
+ unicodeslot=0xFBA4,
+ },
+ [0xFBA5]={
+ category="lo",
+ description="ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0647,
+ specials={ "final", 0x06C0 },
+ unicodeslot=0xFBA5,
+ },
+ [0xFBA6]={
+ category="lo",
+ description="ARABIC LETTER HEH GOAL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06C1 },
+ unicodeslot=0xFBA6,
+ },
+ [0xFBA7]={
+ category="lo",
+ description="ARABIC LETTER HEH GOAL FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06C1 },
+ unicodeslot=0xFBA7,
+ },
+ [0xFBA8]={
+ category="lo",
+ description="ARABIC LETTER HEH GOAL INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06C1 },
+ unicodeslot=0xFBA8,
+ },
+ [0xFBA9]={
+ category="lo",
+ description="ARABIC LETTER HEH GOAL MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06C1 },
+ unicodeslot=0xFBA9,
+ },
+ [0xFBAA]={
+ category="lo",
+ description="ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06BE },
+ unicodeslot=0xFBAA,
+ },
+ [0xFBAB]={
+ category="lo",
+ description="ARABIC LETTER HEH DOACHASHMEE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06BE },
+ unicodeslot=0xFBAB,
+ },
+ [0xFBAC]={
+ category="lo",
+ description="ARABIC LETTER HEH DOACHASHMEE INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06BE },
+ unicodeslot=0xFBAC,
+ },
+ [0xFBAD]={
+ category="lo",
+ description="ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06BE },
+ unicodeslot=0xFBAD,
+ },
+ [0xFBAE]={
+ category="lo",
+ description="ARABIC LETTER YEH BARREE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06D2 },
+ unicodeslot=0xFBAE,
+ },
+ [0xFBAF]={
+ category="lo",
+ description="ARABIC LETTER YEH BARREE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06D2 },
+ unicodeslot=0xFBAF,
+ },
+ [0xFBB0]={
+ category="lo",
+ description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06D3 },
+ unicodeslot=0xFBB0,
+ },
+ [0xFBB1]={
+ category="lo",
+ description="ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06D3 },
+ unicodeslot=0xFBB1,
+ },
+ [0xFBD3]={
+ category="lo",
+ description="ARABIC LETTER NG ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06AD },
+ unicodeslot=0xFBD3,
+ },
+ [0xFBD4]={
+ category="lo",
+ description="ARABIC LETTER NG FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06AD },
+ unicodeslot=0xFBD4,
+ },
+ [0xFBD5]={
+ category="lo",
+ description="ARABIC LETTER NG INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06AD },
+ unicodeslot=0xFBD5,
+ },
+ [0xFBD6]={
+ category="lo",
+ description="ARABIC LETTER NG MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06AD },
+ unicodeslot=0xFBD6,
+ },
+ [0xFBD7]={
+ category="lo",
+ description="ARABIC LETTER U ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06C7 },
+ unicodeslot=0xFBD7,
+ },
+ [0xFBD8]={
+ category="lo",
+ description="ARABIC LETTER U FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06C7 },
+ unicodeslot=0xFBD8,
+ },
+ [0xFBD9]={
+ category="lo",
+ description="ARABIC LETTER OE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06C6 },
+ unicodeslot=0xFBD9,
+ },
+ [0xFBDA]={
+ category="lo",
+ description="ARABIC LETTER OE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06C6 },
+ unicodeslot=0xFBDA,
+ },
+ [0xFBDB]={
+ category="lo",
+ description="ARABIC LETTER YU ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06C8 },
+ unicodeslot=0xFBDB,
+ },
+ [0xFBDC]={
+ category="lo",
+ description="ARABIC LETTER YU FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06C8 },
+ unicodeslot=0xFBDC,
+ },
+ [0xFBDD]={
+ category="lo",
+ description="ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x06C7,
+ specials={ "isolated", 0x0677 },
+ unicodeslot=0xFBDD,
+ },
+ [0xFBDE]={
+ category="lo",
+ description="ARABIC LETTER VE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06CB },
+ unicodeslot=0xFBDE,
+ },
+ [0xFBDF]={
+ category="lo",
+ description="ARABIC LETTER VE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06CB },
+ unicodeslot=0xFBDF,
+ },
+ [0xFBE0]={
+ category="lo",
+ description="ARABIC LETTER KIRGHIZ OE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06C5 },
+ unicodeslot=0xFBE0,
+ },
+ [0xFBE1]={
+ category="lo",
+ description="ARABIC LETTER KIRGHIZ OE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06C5 },
+ unicodeslot=0xFBE1,
+ },
+ [0xFBE2]={
+ category="lo",
+ description="ARABIC LETTER KIRGHIZ YU ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06C9 },
+ unicodeslot=0xFBE2,
+ },
+ [0xFBE3]={
+ category="lo",
+ description="ARABIC LETTER KIRGHIZ YU FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06C9 },
+ unicodeslot=0xFBE3,
+ },
+ [0xFBE4]={
+ category="lo",
+ description="ARABIC LETTER E ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06D0 },
+ unicodeslot=0xFBE4,
+ },
+ [0xFBE5]={
+ category="lo",
+ description="ARABIC LETTER E FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06D0 },
+ unicodeslot=0xFBE5,
+ },
+ [0xFBE6]={
+ category="lo",
+ description="ARABIC LETTER E INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06D0 },
+ unicodeslot=0xFBE6,
+ },
+ [0xFBE7]={
+ category="lo",
+ description="ARABIC LETTER E MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06D0 },
+ unicodeslot=0xFBE7,
+ },
+ [0xFBE8]={
+ category="lo",
+ description="ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0649 },
+ unicodeslot=0xFBE8,
+ },
+ [0xFBE9]={
+ category="lo",
+ description="ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0649 },
+ unicodeslot=0xFBE9,
+ },
+ [0xFBEA]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x0627 },
+ unicodeslot=0xFBEA,
+ },
+ [0xFBEB]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0627 },
+ unicodeslot=0xFBEB,
+ },
+ [0xFBEC]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x06D5 },
+ unicodeslot=0xFBEC,
+ },
+ [0xFBED]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x06D5 },
+ unicodeslot=0xFBED,
+ },
+ [0xFBEE]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x0648 },
+ unicodeslot=0xFBEE,
+ },
+ [0xFBEF]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0648 },
+ unicodeslot=0xFBEF,
+ },
+ [0xFBF0]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x06C7 },
+ unicodeslot=0xFBF0,
+ },
+ [0xFBF1]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x06C7 },
+ unicodeslot=0xFBF1,
+ },
+ [0xFBF2]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x06C6 },
+ unicodeslot=0xFBF2,
+ },
+ [0xFBF3]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x06C6 },
+ unicodeslot=0xFBF3,
+ },
+ [0xFBF4]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x06C8 },
+ unicodeslot=0xFBF4,
+ },
+ [0xFBF5]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x06C8 },
+ unicodeslot=0xFBF5,
+ },
+ [0xFBF6]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x06D0 },
+ unicodeslot=0xFBF6,
+ },
+ [0xFBF7]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x06D0 },
+ unicodeslot=0xFBF7,
+ },
+ [0xFBF8]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0626, 0x06D0 },
+ unicodeslot=0xFBF8,
+ },
+ [0xFBF9]={
+ category="lo",
+ description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x0649 },
+ unicodeslot=0xFBF9,
+ },
+ [0xFBFA]={
+ category="lo",
+ description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0649 },
+ unicodeslot=0xFBFA,
+ },
+ [0xFBFB]={
+ category="lo",
+ description="ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0626, 0x0649 },
+ unicodeslot=0xFBFB,
+ },
+ [0xFBFC]={
+ category="lo",
+ description="ARABIC LETTER FARSI YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x06CC },
+ unicodeslot=0xFBFC,
+ },
+ [0xFBFD]={
+ category="lo",
+ description="ARABIC LETTER FARSI YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x06CC },
+ unicodeslot=0xFBFD,
+ },
+ [0xFBFE]={
+ category="lo",
+ description="ARABIC LETTER FARSI YEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x06CC },
+ unicodeslot=0xFBFE,
+ },
+ [0xFBFF]={
+ category="lo",
+ description="ARABIC LETTER FARSI YEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x06CC },
+ unicodeslot=0xFBFF,
+ },
+ [0xFC00]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x062C },
+ unicodeslot=0xFC00,
+ },
+ [0xFC01]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x062D },
+ unicodeslot=0xFC01,
+ },
+ [0xFC02]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x0645 },
+ unicodeslot=0xFC02,
+ },
+ [0xFC03]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x0649 },
+ unicodeslot=0xFC03,
+ },
+ [0xFC04]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0626, 0x064A },
+ unicodeslot=0xFC04,
+ },
+ [0xFC05]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0628, 0x062C },
+ unicodeslot=0xFC05,
+ },
+ [0xFC06]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0628, 0x062D },
+ unicodeslot=0xFC06,
+ },
+ [0xFC07]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0628, 0x062E },
+ unicodeslot=0xFC07,
+ },
+ [0xFC08]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0628, 0x0645 },
+ unicodeslot=0xFC08,
+ },
+ [0xFC09]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0628, 0x0649 },
+ unicodeslot=0xFC09,
+ },
+ [0xFC0A]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0628, 0x064A },
+ unicodeslot=0xFC0A,
+ },
+ [0xFC0B]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062A, 0x062C },
+ unicodeslot=0xFC0B,
+ },
+ [0xFC0C]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062A, 0x062D },
+ unicodeslot=0xFC0C,
+ },
+ [0xFC0D]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062A, 0x062E },
+ unicodeslot=0xFC0D,
+ },
+ [0xFC0E]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062A, 0x0645 },
+ unicodeslot=0xFC0E,
+ },
+ [0xFC0F]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062A, 0x0649 },
+ unicodeslot=0xFC0F,
+ },
+ [0xFC10]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062A, 0x064A },
+ unicodeslot=0xFC10,
+ },
+ [0xFC11]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062B, 0x062C },
+ unicodeslot=0xFC11,
+ },
+ [0xFC12]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062B, 0x0645 },
+ unicodeslot=0xFC12,
+ },
+ [0xFC13]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062B, 0x0649 },
+ unicodeslot=0xFC13,
+ },
+ [0xFC14]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062B, 0x064A },
+ unicodeslot=0xFC14,
+ },
+ [0xFC15]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062C, 0x062D },
+ unicodeslot=0xFC15,
+ },
+ [0xFC16]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062C, 0x0645 },
+ unicodeslot=0xFC16,
+ },
+ [0xFC17]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062D, 0x062C },
+ unicodeslot=0xFC17,
+ },
+ [0xFC18]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062D, 0x0645 },
+ unicodeslot=0xFC18,
+ },
+ [0xFC19]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062E, 0x062C },
+ unicodeslot=0xFC19,
+ },
+ [0xFC1A]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062E, 0x062D },
+ unicodeslot=0xFC1A,
+ },
+ [0xFC1B]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062E, 0x0645 },
+ unicodeslot=0xFC1B,
+ },
+ [0xFC1C]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633, 0x062C },
+ unicodeslot=0xFC1C,
+ },
+ [0xFC1D]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633, 0x062D },
+ unicodeslot=0xFC1D,
+ },
+ [0xFC1E]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633, 0x062E },
+ unicodeslot=0xFC1E,
+ },
+ [0xFC1F]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633, 0x0645 },
+ unicodeslot=0xFC1F,
+ },
+ [0xFC20]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x062D },
+ unicodeslot=0xFC20,
+ },
+ [0xFC21]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x0645 },
+ unicodeslot=0xFC21,
+ },
+ [0xFC22]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636, 0x062C },
+ unicodeslot=0xFC22,
+ },
+ [0xFC23]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636, 0x062D },
+ unicodeslot=0xFC23,
+ },
+ [0xFC24]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636, 0x062E },
+ unicodeslot=0xFC24,
+ },
+ [0xFC25]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636, 0x0645 },
+ unicodeslot=0xFC25,
+ },
+ [0xFC26]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0637, 0x062D },
+ unicodeslot=0xFC26,
+ },
+ [0xFC27]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0637, 0x0645 },
+ unicodeslot=0xFC27,
+ },
+ [0xFC28]={
+ category="lo",
+ description="ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0638, 0x0645 },
+ unicodeslot=0xFC28,
+ },
+ [0xFC29]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0639, 0x062C },
+ unicodeslot=0xFC29,
+ },
+ [0xFC2A]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0639, 0x0645 },
+ unicodeslot=0xFC2A,
+ },
+ [0xFC2B]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x063A, 0x062C },
+ unicodeslot=0xFC2B,
+ },
+ [0xFC2C]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x063A, 0x0645 },
+ unicodeslot=0xFC2C,
+ },
+ [0xFC2D]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0641, 0x062C },
+ unicodeslot=0xFC2D,
+ },
+ [0xFC2E]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0641, 0x062D },
+ unicodeslot=0xFC2E,
+ },
+ [0xFC2F]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0641, 0x062E },
+ unicodeslot=0xFC2F,
+ },
+ [0xFC30]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0641, 0x0645 },
+ unicodeslot=0xFC30,
+ },
+ [0xFC31]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0641, 0x0649 },
+ unicodeslot=0xFC31,
+ },
+ [0xFC32]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0641, 0x064A },
+ unicodeslot=0xFC32,
+ },
+ [0xFC33]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0642, 0x062D },
+ unicodeslot=0xFC33,
+ },
+ [0xFC34]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0642, 0x0645 },
+ unicodeslot=0xFC34,
+ },
+ [0xFC35]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0642, 0x0649 },
+ unicodeslot=0xFC35,
+ },
+ [0xFC36]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0642, 0x064A },
+ unicodeslot=0xFC36,
+ },
+ [0xFC37]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x0627 },
+ unicodeslot=0xFC37,
+ },
+ [0xFC38]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x062C },
+ unicodeslot=0xFC38,
+ },
+ [0xFC39]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x062D },
+ unicodeslot=0xFC39,
+ },
+ [0xFC3A]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x062E },
+ unicodeslot=0xFC3A,
+ },
+ [0xFC3B]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH LAM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x0644 },
+ unicodeslot=0xFC3B,
+ },
+ [0xFC3C]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x0645 },
+ unicodeslot=0xFC3C,
+ },
+ [0xFC3D]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x0649 },
+ unicodeslot=0xFC3D,
+ },
+ [0xFC3E]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643, 0x064A },
+ unicodeslot=0xFC3E,
+ },
+ [0xFC3F]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x062C },
+ unicodeslot=0xFC3F,
+ },
+ [0xFC40]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x062D },
+ unicodeslot=0xFC40,
+ },
+ [0xFC41]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x062E },
+ unicodeslot=0xFC41,
+ },
+ [0xFC42]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x0645 },
+ unicodeslot=0xFC42,
+ },
+ [0xFC43]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x0649 },
+ unicodeslot=0xFC43,
+ },
+ [0xFC44]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x064A },
+ unicodeslot=0xFC44,
+ },
+ [0xFC45]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645, 0x062C },
+ unicodeslot=0xFC45,
+ },
+ [0xFC46]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645, 0x062D },
+ unicodeslot=0xFC46,
+ },
+ [0xFC47]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645, 0x062E },
+ unicodeslot=0xFC47,
+ },
+ [0xFC48]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645, 0x0645 },
+ unicodeslot=0xFC48,
+ },
+ [0xFC49]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645, 0x0649 },
+ unicodeslot=0xFC49,
+ },
+ [0xFC4A]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645, 0x064A },
+ unicodeslot=0xFC4A,
+ },
+ [0xFC4B]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0646, 0x062C },
+ unicodeslot=0xFC4B,
+ },
+ [0xFC4C]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0646, 0x062D },
+ unicodeslot=0xFC4C,
+ },
+ [0xFC4D]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0646, 0x062E },
+ unicodeslot=0xFC4D,
+ },
+ [0xFC4E]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0646, 0x0645 },
+ unicodeslot=0xFC4E,
+ },
+ [0xFC4F]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0646, 0x0649 },
+ unicodeslot=0xFC4F,
+ },
+ [0xFC50]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0646, 0x064A },
+ unicodeslot=0xFC50,
+ },
+ [0xFC51]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0647, 0x062C },
+ unicodeslot=0xFC51,
+ },
+ [0xFC52]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0647, 0x0645 },
+ unicodeslot=0xFC52,
+ },
+ [0xFC53]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0647, 0x0649 },
+ unicodeslot=0xFC53,
+ },
+ [0xFC54]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0647, 0x064A },
+ unicodeslot=0xFC54,
+ },
+ [0xFC55]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x064A, 0x062C },
+ unicodeslot=0xFC55,
+ },
+ [0xFC56]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x064A, 0x062D },
+ unicodeslot=0xFC56,
+ },
+ [0xFC57]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x064A, 0x062E },
+ unicodeslot=0xFC57,
+ },
+ [0xFC58]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x064A, 0x0645 },
+ unicodeslot=0xFC58,
+ },
+ [0xFC59]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x064A, 0x0649 },
+ unicodeslot=0xFC59,
+ },
+ [0xFC5A]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x064A, 0x064A },
+ unicodeslot=0xFC5A,
+ },
+ [0xFC5B]={
+ category="lo",
+ description="ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0630, 0x0670 },
+ unicodeslot=0xFC5B,
+ },
+ [0xFC5C]={
+ category="lo",
+ description="ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0631, 0x0670 },
+ unicodeslot=0xFC5C,
+ },
+ [0xFC5D]={
+ category="lo",
+ description="ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0649, 0x0670 },
+ unicodeslot=0xFC5D,
+ },
+ [0xFC5E]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064C, 0x0651 },
+ unicodeslot=0xFC5E,
+ },
+ [0xFC5F]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064D, 0x0651 },
+ unicodeslot=0xFC5F,
+ },
+ [0xFC60]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064E, 0x0651 },
+ unicodeslot=0xFC60,
+ },
+ [0xFC61]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064F, 0x0651 },
+ unicodeslot=0xFC61,
+ },
+ [0xFC62]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x0650, 0x0651 },
+ unicodeslot=0xFC62,
+ },
+ [0xFC63]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x0651, 0x0670 },
+ unicodeslot=0xFC63,
+ },
+ [0xFC64]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0631 },
+ unicodeslot=0xFC64,
+ },
+ [0xFC65]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0632 },
+ unicodeslot=0xFC65,
+ },
+ [0xFC66]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0645 },
+ unicodeslot=0xFC66,
+ },
+ [0xFC67]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0646 },
+ unicodeslot=0xFC67,
+ },
+ [0xFC68]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x0649 },
+ unicodeslot=0xFC68,
+ },
+ [0xFC69]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0626, 0x064A },
+ unicodeslot=0xFC69,
+ },
+ [0xFC6A]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x0631 },
+ unicodeslot=0xFC6A,
+ },
+ [0xFC6B]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH ZAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x0632 },
+ unicodeslot=0xFC6B,
+ },
+ [0xFC6C]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x0645 },
+ unicodeslot=0xFC6C,
+ },
+ [0xFC6D]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH NOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x0646 },
+ unicodeslot=0xFC6D,
+ },
+ [0xFC6E]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x0649 },
+ unicodeslot=0xFC6E,
+ },
+ [0xFC6F]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x064A },
+ unicodeslot=0xFC6F,
+ },
+ [0xFC70]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x0631 },
+ unicodeslot=0xFC70,
+ },
+ [0xFC71]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH ZAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x0632 },
+ unicodeslot=0xFC71,
+ },
+ [0xFC72]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x0645 },
+ unicodeslot=0xFC72,
+ },
+ [0xFC73]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH NOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x0646 },
+ unicodeslot=0xFC73,
+ },
+ [0xFC74]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x0649 },
+ unicodeslot=0xFC74,
+ },
+ [0xFC75]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x064A },
+ unicodeslot=0xFC75,
+ },
+ [0xFC76]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062B, 0x0631 },
+ unicodeslot=0xFC76,
+ },
+ [0xFC77]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH ZAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062B, 0x0632 },
+ unicodeslot=0xFC77,
+ },
+ [0xFC78]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062B, 0x0645 },
+ unicodeslot=0xFC78,
+ },
+ [0xFC79]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH NOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062B, 0x0646 },
+ unicodeslot=0xFC79,
+ },
+ [0xFC7A]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062B, 0x0649 },
+ unicodeslot=0xFC7A,
+ },
+ [0xFC7B]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062B, 0x064A },
+ unicodeslot=0xFC7B,
+ },
+ [0xFC7C]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0641, 0x0649 },
+ unicodeslot=0xFC7C,
+ },
+ [0xFC7D]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0641, 0x064A },
+ unicodeslot=0xFC7D,
+ },
+ [0xFC7E]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0642, 0x0649 },
+ unicodeslot=0xFC7E,
+ },
+ [0xFC7F]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0642, 0x064A },
+ unicodeslot=0xFC7F,
+ },
+ [0xFC80]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH ALEF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643, 0x0627 },
+ unicodeslot=0xFC80,
+ },
+ [0xFC81]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH LAM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643, 0x0644 },
+ unicodeslot=0xFC81,
+ },
+ [0xFC82]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643, 0x0645 },
+ unicodeslot=0xFC82,
+ },
+ [0xFC83]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643, 0x0649 },
+ unicodeslot=0xFC83,
+ },
+ [0xFC84]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643, 0x064A },
+ unicodeslot=0xFC84,
+ },
+ [0xFC85]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0645 },
+ unicodeslot=0xFC85,
+ },
+ [0xFC86]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0649 },
+ unicodeslot=0xFC86,
+ },
+ [0xFC87]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x064A },
+ unicodeslot=0xFC87,
+ },
+ [0xFC88]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH ALEF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0645, 0x0627 },
+ unicodeslot=0xFC88,
+ },
+ [0xFC89]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0645, 0x0645 },
+ unicodeslot=0xFC89,
+ },
+ [0xFC8A]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x0631 },
+ unicodeslot=0xFC8A,
+ },
+ [0xFC8B]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH ZAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x0632 },
+ unicodeslot=0xFC8B,
+ },
+ [0xFC8C]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x0645 },
+ unicodeslot=0xFC8C,
+ },
+ [0xFC8D]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH NOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x0646 },
+ unicodeslot=0xFC8D,
+ },
+ [0xFC8E]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x0649 },
+ unicodeslot=0xFC8E,
+ },
+ [0xFC8F]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x064A },
+ unicodeslot=0xFC8F,
+ },
+ [0xFC90]={
+ category="lo",
+ description="ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0649, 0x0670 },
+ unicodeslot=0xFC90,
+ },
+ [0xFC91]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x0631 },
+ unicodeslot=0xFC91,
+ },
+ [0xFC92]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH ZAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x0632 },
+ unicodeslot=0xFC92,
+ },
+ [0xFC93]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x0645 },
+ unicodeslot=0xFC93,
+ },
+ [0xFC94]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH NOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x0646 },
+ unicodeslot=0xFC94,
+ },
+ [0xFC95]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x0649 },
+ unicodeslot=0xFC95,
+ },
+ [0xFC96]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x064A },
+ unicodeslot=0xFC96,
+ },
+ [0xFC97]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0626, 0x062C },
+ unicodeslot=0xFC97,
+ },
+ [0xFC98]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0626, 0x062D },
+ unicodeslot=0xFC98,
+ },
+ [0xFC99]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0626, 0x062E },
+ unicodeslot=0xFC99,
+ },
+ [0xFC9A]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0626, 0x0645 },
+ unicodeslot=0xFC9A,
+ },
+ [0xFC9B]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0626, 0x0647 },
+ unicodeslot=0xFC9B,
+ },
+ [0xFC9C]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0628, 0x062C },
+ unicodeslot=0xFC9C,
+ },
+ [0xFC9D]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0628, 0x062D },
+ unicodeslot=0xFC9D,
+ },
+ [0xFC9E]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0628, 0x062E },
+ unicodeslot=0xFC9E,
+ },
+ [0xFC9F]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0628, 0x0645 },
+ unicodeslot=0xFC9F,
+ },
+ [0xFCA0]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0628, 0x0647 },
+ unicodeslot=0xFCA0,
+ },
+ [0xFCA1]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x062C },
+ unicodeslot=0xFCA1,
+ },
+ [0xFCA2]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x062D },
+ unicodeslot=0xFCA2,
+ },
+ [0xFCA3]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x062E },
+ unicodeslot=0xFCA3,
+ },
+ [0xFCA4]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x0645 },
+ unicodeslot=0xFCA4,
+ },
+ [0xFCA5]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x0647 },
+ unicodeslot=0xFCA5,
+ },
+ [0xFCA6]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062B, 0x0645 },
+ unicodeslot=0xFCA6,
+ },
+ [0xFCA7]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062C, 0x062D },
+ unicodeslot=0xFCA7,
+ },
+ [0xFCA8]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062C, 0x0645 },
+ unicodeslot=0xFCA8,
+ },
+ [0xFCA9]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062D, 0x062C },
+ unicodeslot=0xFCA9,
+ },
+ [0xFCAA]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062D, 0x0645 },
+ unicodeslot=0xFCAA,
+ },
+ [0xFCAB]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062E, 0x062C },
+ unicodeslot=0xFCAB,
+ },
+ [0xFCAC]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062E, 0x0645 },
+ unicodeslot=0xFCAC,
+ },
+ [0xFCAD]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x062C },
+ unicodeslot=0xFCAD,
+ },
+ [0xFCAE]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x062D },
+ unicodeslot=0xFCAE,
+ },
+ [0xFCAF]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x062E },
+ unicodeslot=0xFCAF,
+ },
+ [0xFCB0]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x0645 },
+ unicodeslot=0xFCB0,
+ },
+ [0xFCB1]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0635, 0x062D },
+ unicodeslot=0xFCB1,
+ },
+ [0xFCB2]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0635, 0x062E },
+ unicodeslot=0xFCB2,
+ },
+ [0xFCB3]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0635, 0x0645 },
+ unicodeslot=0xFCB3,
+ },
+ [0xFCB4]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0636, 0x062C },
+ unicodeslot=0xFCB4,
+ },
+ [0xFCB5]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0636, 0x062D },
+ unicodeslot=0xFCB5,
+ },
+ [0xFCB6]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0636, 0x062E },
+ unicodeslot=0xFCB6,
+ },
+ [0xFCB7]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0636, 0x0645 },
+ unicodeslot=0xFCB7,
+ },
+ [0xFCB8]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0637, 0x062D },
+ unicodeslot=0xFCB8,
+ },
+ [0xFCB9]={
+ category="lo",
+ description="ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0638, 0x0645 },
+ unicodeslot=0xFCB9,
+ },
+ [0xFCBA]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0639, 0x062C },
+ unicodeslot=0xFCBA,
+ },
+ [0xFCBB]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0639, 0x0645 },
+ unicodeslot=0xFCBB,
+ },
+ [0xFCBC]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x063A, 0x062C },
+ unicodeslot=0xFCBC,
+ },
+ [0xFCBD]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x063A, 0x0645 },
+ unicodeslot=0xFCBD,
+ },
+ [0xFCBE]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0641, 0x062C },
+ unicodeslot=0xFCBE,
+ },
+ [0xFCBF]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0641, 0x062D },
+ unicodeslot=0xFCBF,
+ },
+ [0xFCC0]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0641, 0x062E },
+ unicodeslot=0xFCC0,
+ },
+ [0xFCC1]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0641, 0x0645 },
+ unicodeslot=0xFCC1,
+ },
+ [0xFCC2]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0642, 0x062D },
+ unicodeslot=0xFCC2,
+ },
+ [0xFCC3]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0642, 0x0645 },
+ unicodeslot=0xFCC3,
+ },
+ [0xFCC4]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0643, 0x062C },
+ unicodeslot=0xFCC4,
+ },
+ [0xFCC5]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0643, 0x062D },
+ unicodeslot=0xFCC5,
+ },
+ [0xFCC6]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0643, 0x062E },
+ unicodeslot=0xFCC6,
+ },
+ [0xFCC7]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH LAM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0643, 0x0644 },
+ unicodeslot=0xFCC7,
+ },
+ [0xFCC8]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0643, 0x0645 },
+ unicodeslot=0xFCC8,
+ },
+ [0xFCC9]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x062C },
+ unicodeslot=0xFCC9,
+ },
+ [0xFCCA]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x062D },
+ unicodeslot=0xFCCA,
+ },
+ [0xFCCB]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x062E },
+ unicodeslot=0xFCCB,
+ },
+ [0xFCCC]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x0645 },
+ unicodeslot=0xFCCC,
+ },
+ [0xFCCD]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x0647 },
+ unicodeslot=0xFCCD,
+ },
+ [0xFCCE]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062C },
+ unicodeslot=0xFCCE,
+ },
+ [0xFCCF]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062D },
+ unicodeslot=0xFCCF,
+ },
+ [0xFCD0]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062E },
+ unicodeslot=0xFCD0,
+ },
+ [0xFCD1]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x0645 },
+ unicodeslot=0xFCD1,
+ },
+ [0xFCD2]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x062C },
+ unicodeslot=0xFCD2,
+ },
+ [0xFCD3]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x062D },
+ unicodeslot=0xFCD3,
+ },
+ [0xFCD4]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x062E },
+ unicodeslot=0xFCD4,
+ },
+ [0xFCD5]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x0645 },
+ unicodeslot=0xFCD5,
+ },
+ [0xFCD6]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x0647 },
+ unicodeslot=0xFCD6,
+ },
+ [0xFCD7]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0647, 0x062C },
+ unicodeslot=0xFCD7,
+ },
+ [0xFCD8]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0647, 0x0645 },
+ unicodeslot=0xFCD8,
+ },
+ [0xFCD9]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0647, 0x0670 },
+ unicodeslot=0xFCD9,
+ },
+ [0xFCDA]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x064A, 0x062C },
+ unicodeslot=0xFCDA,
+ },
+ [0xFCDB]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x064A, 0x062D },
+ unicodeslot=0xFCDB,
+ },
+ [0xFCDC]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x064A, 0x062E },
+ unicodeslot=0xFCDC,
+ },
+ [0xFCDD]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x064A, 0x0645 },
+ unicodeslot=0xFCDD,
+ },
+ [0xFCDE]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x064A, 0x0647 },
+ unicodeslot=0xFCDE,
+ },
+ [0xFCDF]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0626, 0x0645 },
+ unicodeslot=0xFCDF,
+ },
+ [0xFCE0]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0626, 0x0647 },
+ unicodeslot=0xFCE0,
+ },
+ [0xFCE1]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0628, 0x0645 },
+ unicodeslot=0xFCE1,
+ },
+ [0xFCE2]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0628, 0x0647 },
+ unicodeslot=0xFCE2,
+ },
+ [0xFCE3]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062A, 0x0645 },
+ unicodeslot=0xFCE3,
+ },
+ [0xFCE4]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062A, 0x0647 },
+ unicodeslot=0xFCE4,
+ },
+ [0xFCE5]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062B, 0x0645 },
+ unicodeslot=0xFCE5,
+ },
+ [0xFCE6]={
+ category="lo",
+ description="ARABIC LIGATURE THEH WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062B, 0x0647 },
+ unicodeslot=0xFCE6,
+ },
+ [0xFCE7]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0633, 0x0645 },
+ unicodeslot=0xFCE7,
+ },
+ [0xFCE8]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0633, 0x0647 },
+ unicodeslot=0xFCE8,
+ },
+ [0xFCE9]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0634, 0x0645 },
+ unicodeslot=0xFCE9,
+ },
+ [0xFCEA]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0634, 0x0647 },
+ unicodeslot=0xFCEA,
+ },
+ [0xFCEB]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH LAM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0643, 0x0644 },
+ unicodeslot=0xFCEB,
+ },
+ [0xFCEC]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0643, 0x0645 },
+ unicodeslot=0xFCEC,
+ },
+ [0xFCED]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0644, 0x0645 },
+ unicodeslot=0xFCED,
+ },
+ [0xFCEE]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0646, 0x0645 },
+ unicodeslot=0xFCEE,
+ },
+ [0xFCEF]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0646, 0x0647 },
+ unicodeslot=0xFCEF,
+ },
+ [0xFCF0]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x064A, 0x0645 },
+ unicodeslot=0xFCF0,
+ },
+ [0xFCF1]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x064A, 0x0647 },
+ unicodeslot=0xFCF1,
+ },
+ [0xFCF2]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x064E, 0x0651 },
+ unicodeslot=0xFCF2,
+ },
+ [0xFCF3]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x064F, 0x0651 },
+ unicodeslot=0xFCF3,
+ },
+ [0xFCF4]={
+ category="lo",
+ description="ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x0650, 0x0651 },
+ unicodeslot=0xFCF4,
+ },
+ [0xFCF5]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0637, 0x0649 },
+ unicodeslot=0xFCF5,
+ },
+ [0xFCF6]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0637, 0x064A },
+ unicodeslot=0xFCF6,
+ },
+ [0xFCF7]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0639, 0x0649 },
+ unicodeslot=0xFCF7,
+ },
+ [0xFCF8]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0639, 0x064A },
+ unicodeslot=0xFCF8,
+ },
+ [0xFCF9]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x063A, 0x0649 },
+ unicodeslot=0xFCF9,
+ },
+ [0xFCFA]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x063A, 0x064A },
+ unicodeslot=0xFCFA,
+ },
+ [0xFCFB]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633, 0x0649 },
+ unicodeslot=0xFCFB,
+ },
+ [0xFCFC]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633, 0x064A },
+ unicodeslot=0xFCFC,
+ },
+ [0xFCFD]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634, 0x0649 },
+ unicodeslot=0xFCFD,
+ },
+ [0xFCFE]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634, 0x064A },
+ unicodeslot=0xFCFE,
+ },
+ [0xFCFF]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062D, 0x0649 },
+ unicodeslot=0xFCFF,
+ },
+ [0xFD00]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062D, 0x064A },
+ unicodeslot=0xFD00,
+ },
+ [0xFD01]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062C, 0x0649 },
+ unicodeslot=0xFD01,
+ },
+ [0xFD02]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062C, 0x064A },
+ unicodeslot=0xFD02,
+ },
+ [0xFD03]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062E, 0x0649 },
+ unicodeslot=0xFD03,
+ },
+ [0xFD04]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062E, 0x064A },
+ unicodeslot=0xFD04,
+ },
+ [0xFD05]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x0649 },
+ unicodeslot=0xFD05,
+ },
+ [0xFD06]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x064A },
+ unicodeslot=0xFD06,
+ },
+ [0xFD07]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636, 0x0649 },
+ unicodeslot=0xFD07,
+ },
+ [0xFD08]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636, 0x064A },
+ unicodeslot=0xFD08,
+ },
+ [0xFD09]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634, 0x062C },
+ unicodeslot=0xFD09,
+ },
+ [0xFD0A]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634, 0x062D },
+ unicodeslot=0xFD0A,
+ },
+ [0xFD0B]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634, 0x062E },
+ unicodeslot=0xFD0B,
+ },
+ [0xFD0C]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634, 0x0645 },
+ unicodeslot=0xFD0C,
+ },
+ [0xFD0D]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634, 0x0631 },
+ unicodeslot=0xFD0D,
+ },
+ [0xFD0E]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH REH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633, 0x0631 },
+ unicodeslot=0xFD0E,
+ },
+ [0xFD0F]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH REH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x0631 },
+ unicodeslot=0xFD0F,
+ },
+ [0xFD10]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH REH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636, 0x0631 },
+ unicodeslot=0xFD10,
+ },
+ [0xFD11]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0637, 0x0649 },
+ unicodeslot=0xFD11,
+ },
+ [0xFD12]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0637, 0x064A },
+ unicodeslot=0xFD12,
+ },
+ [0xFD13]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0639, 0x0649 },
+ unicodeslot=0xFD13,
+ },
+ [0xFD14]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0639, 0x064A },
+ unicodeslot=0xFD14,
+ },
+ [0xFD15]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x063A, 0x0649 },
+ unicodeslot=0xFD15,
+ },
+ [0xFD16]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x063A, 0x064A },
+ unicodeslot=0xFD16,
+ },
+ [0xFD17]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x0649 },
+ unicodeslot=0xFD17,
+ },
+ [0xFD18]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x064A },
+ unicodeslot=0xFD18,
+ },
+ [0xFD19]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x0649 },
+ unicodeslot=0xFD19,
+ },
+ [0xFD1A]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x064A },
+ unicodeslot=0xFD1A,
+ },
+ [0xFD1B]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062D, 0x0649 },
+ unicodeslot=0xFD1B,
+ },
+ [0xFD1C]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062D, 0x064A },
+ unicodeslot=0xFD1C,
+ },
+ [0xFD1D]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C, 0x0649 },
+ unicodeslot=0xFD1D,
+ },
+ [0xFD1E]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C, 0x064A },
+ unicodeslot=0xFD1E,
+ },
+ [0xFD1F]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062E, 0x0649 },
+ unicodeslot=0xFD1F,
+ },
+ [0xFD20]={
+ category="lo",
+ description="ARABIC LIGATURE KHAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062E, 0x064A },
+ unicodeslot=0xFD20,
+ },
+ [0xFD21]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0635, 0x0649 },
+ unicodeslot=0xFD21,
+ },
+ [0xFD22]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0635, 0x064A },
+ unicodeslot=0xFD22,
+ },
+ [0xFD23]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0636, 0x0649 },
+ unicodeslot=0xFD23,
+ },
+ [0xFD24]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0636, 0x064A },
+ unicodeslot=0xFD24,
+ },
+ [0xFD25]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x062C },
+ unicodeslot=0xFD25,
+ },
+ [0xFD26]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x062D },
+ unicodeslot=0xFD26,
+ },
+ [0xFD27]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x062E },
+ unicodeslot=0xFD27,
+ },
+ [0xFD28]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x0645 },
+ unicodeslot=0xFD28,
+ },
+ [0xFD29]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x0631 },
+ unicodeslot=0xFD29,
+ },
+ [0xFD2A]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x0631 },
+ unicodeslot=0xFD2A,
+ },
+ [0xFD2B]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0635, 0x0631 },
+ unicodeslot=0xFD2B,
+ },
+ [0xFD2C]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0636, 0x0631 },
+ unicodeslot=0xFD2C,
+ },
+ [0xFD2D]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x062C },
+ unicodeslot=0xFD2D,
+ },
+ [0xFD2E]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x062D },
+ unicodeslot=0xFD2E,
+ },
+ [0xFD2F]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x062E },
+ unicodeslot=0xFD2F,
+ },
+ [0xFD30]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x0645 },
+ unicodeslot=0xFD30,
+ },
+ [0xFD31]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x0647 },
+ unicodeslot=0xFD31,
+ },
+ [0xFD32]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x0647 },
+ unicodeslot=0xFD32,
+ },
+ [0xFD33]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0637, 0x0645 },
+ unicodeslot=0xFD33,
+ },
+ [0xFD34]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0633, 0x062C },
+ unicodeslot=0xFD34,
+ },
+ [0xFD35]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0633, 0x062D },
+ unicodeslot=0xFD35,
+ },
+ [0xFD36]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0633, 0x062E },
+ unicodeslot=0xFD36,
+ },
+ [0xFD37]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0634, 0x062C },
+ unicodeslot=0xFD37,
+ },
+ [0xFD38]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0634, 0x062D },
+ unicodeslot=0xFD38,
+ },
+ [0xFD39]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0634, 0x062E },
+ unicodeslot=0xFD39,
+ },
+ [0xFD3A]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0637, 0x0645 },
+ unicodeslot=0xFD3A,
+ },
+ [0xFD3B]={
+ category="lo",
+ description="ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0638, 0x0645 },
+ unicodeslot=0xFD3B,
+ },
+ [0xFD3C]={
+ category="lo",
+ description="ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0627, 0x064B },
+ unicodeslot=0xFD3C,
+ },
+ [0xFD3D]={
+ category="lo",
+ description="ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0627, 0x064B },
+ unicodeslot=0xFD3D,
+ },
+ [0xFD3E]={
+ category="ps",
+ description="ORNATE LEFT PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ unicodeslot=0xFD3E,
+ },
+ [0xFD3F]={
+ category="pe",
+ description="ORNATE RIGHT PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ unicodeslot=0xFD3F,
+ },
+ [0xFD50]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x062C, 0x0645 },
+ unicodeslot=0xFD50,
+ },
+ [0xFD51]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x062D, 0x062C },
+ unicodeslot=0xFD51,
+ },
+ [0xFD52]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x062D, 0x062C },
+ unicodeslot=0xFD52,
+ },
+ [0xFD53]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x062D, 0x0645 },
+ unicodeslot=0xFD53,
+ },
+ [0xFD54]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x062E, 0x0645 },
+ unicodeslot=0xFD54,
+ },
+ [0xFD55]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x0645, 0x062C },
+ unicodeslot=0xFD55,
+ },
+ [0xFD56]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x0645, 0x062D },
+ unicodeslot=0xFD56,
+ },
+ [0xFD57]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A, 0x0645, 0x062E },
+ unicodeslot=0xFD57,
+ },
+ [0xFD58]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C, 0x0645, 0x062D },
+ unicodeslot=0xFD58,
+ },
+ [0xFD59]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062C, 0x0645, 0x062D },
+ unicodeslot=0xFD59,
+ },
+ [0xFD5A]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062D, 0x0645, 0x064A },
+ unicodeslot=0xFD5A,
+ },
+ [0xFD5B]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062D, 0x0645, 0x0649 },
+ unicodeslot=0xFD5B,
+ },
+ [0xFD5C]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x062D, 0x062C },
+ unicodeslot=0xFD5C,
+ },
+ [0xFD5D]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x062C, 0x062D },
+ unicodeslot=0xFD5D,
+ },
+ [0xFD5E]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x062C, 0x0649 },
+ unicodeslot=0xFD5E,
+ },
+ [0xFD5F]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x0645, 0x062D },
+ unicodeslot=0xFD5F,
+ },
+ [0xFD60]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x0645, 0x062D },
+ unicodeslot=0xFD60,
+ },
+ [0xFD61]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x0645, 0x062C },
+ unicodeslot=0xFD61,
+ },
+ [0xFD62]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x0645, 0x0645 },
+ unicodeslot=0xFD62,
+ },
+ [0xFD63]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633, 0x0645, 0x0645 },
+ unicodeslot=0xFD63,
+ },
+ [0xFD64]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0635, 0x062D, 0x062D },
+ unicodeslot=0xFD64,
+ },
+ [0xFD65]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0635, 0x062D, 0x062D },
+ unicodeslot=0xFD65,
+ },
+ [0xFD66]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0635, 0x0645, 0x0645 },
+ unicodeslot=0xFD66,
+ },
+ [0xFD67]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x062D, 0x0645 },
+ unicodeslot=0xFD67,
+ },
+ [0xFD68]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x062D, 0x0645 },
+ unicodeslot=0xFD68,
+ },
+ [0xFD69]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x062C, 0x064A },
+ unicodeslot=0xFD69,
+ },
+ [0xFD6A]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x0645, 0x062E },
+ unicodeslot=0xFD6A,
+ },
+ [0xFD6B]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x0645, 0x062E },
+ unicodeslot=0xFD6B,
+ },
+ [0xFD6C]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x0645, 0x0645 },
+ unicodeslot=0xFD6C,
+ },
+ [0xFD6D]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634, 0x0645, 0x0645 },
+ unicodeslot=0xFD6D,
+ },
+ [0xFD6E]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0636, 0x062D, 0x0649 },
+ unicodeslot=0xFD6E,
+ },
+ [0xFD6F]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0636, 0x062E, 0x0645 },
+ unicodeslot=0xFD6F,
+ },
+ [0xFD70]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0636, 0x062E, 0x0645 },
+ unicodeslot=0xFD70,
+ },
+ [0xFD71]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0637, 0x0645, 0x062D },
+ unicodeslot=0xFD71,
+ },
+ [0xFD72]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0637, 0x0645, 0x062D },
+ unicodeslot=0xFD72,
+ },
+ [0xFD73]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0637, 0x0645, 0x0645 },
+ unicodeslot=0xFD73,
+ },
+ [0xFD74]={
+ category="lo",
+ description="ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0637, 0x0645, 0x064A },
+ unicodeslot=0xFD74,
+ },
+ [0xFD75]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0639, 0x062C, 0x0645 },
+ unicodeslot=0xFD75,
+ },
+ [0xFD76]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0639, 0x0645, 0x0645 },
+ unicodeslot=0xFD76,
+ },
+ [0xFD77]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0639, 0x0645, 0x0645 },
+ unicodeslot=0xFD77,
+ },
+ [0xFD78]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0639, 0x0645, 0x0649 },
+ unicodeslot=0xFD78,
+ },
+ [0xFD79]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x063A, 0x0645, 0x0645 },
+ unicodeslot=0xFD79,
+ },
+ [0xFD7A]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x063A, 0x0645, 0x064A },
+ unicodeslot=0xFD7A,
+ },
+ [0xFD7B]={
+ category="lo",
+ description="ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x063A, 0x0645, 0x0649 },
+ unicodeslot=0xFD7B,
+ },
+ [0xFD7C]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0641, 0x062E, 0x0645 },
+ unicodeslot=0xFD7C,
+ },
+ [0xFD7D]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0641, 0x062E, 0x0645 },
+ unicodeslot=0xFD7D,
+ },
+ [0xFD7E]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0642, 0x0645, 0x062D },
+ unicodeslot=0xFD7E,
+ },
+ [0xFD7F]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0642, 0x0645, 0x0645 },
+ unicodeslot=0xFD7F,
+ },
+ [0xFD80]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x062D, 0x0645 },
+ unicodeslot=0xFD80,
+ },
+ [0xFD81]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x062D, 0x064A },
+ unicodeslot=0xFD81,
+ },
+ [0xFD82]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x062D, 0x0649 },
+ unicodeslot=0xFD82,
+ },
+ [0xFD83]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x062C, 0x062C },
+ unicodeslot=0xFD83,
+ },
+ [0xFD84]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x062C, 0x062C },
+ unicodeslot=0xFD84,
+ },
+ [0xFD85]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x062E, 0x0645 },
+ unicodeslot=0xFD85,
+ },
+ [0xFD86]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x062E, 0x0645 },
+ unicodeslot=0xFD86,
+ },
+ [0xFD87]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0645, 0x062D },
+ unicodeslot=0xFD87,
+ },
+ [0xFD88]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x0645, 0x062D },
+ unicodeslot=0xFD88,
+ },
+ [0xFD89]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062D, 0x062C },
+ unicodeslot=0xFD89,
+ },
+ [0xFD8A]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062D, 0x0645 },
+ unicodeslot=0xFD8A,
+ },
+ [0xFD8B]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0645, 0x062D, 0x064A },
+ unicodeslot=0xFD8B,
+ },
+ [0xFD8C]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062C, 0x062D },
+ unicodeslot=0xFD8C,
+ },
+ [0xFD8D]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062C, 0x0645 },
+ unicodeslot=0xFD8D,
+ },
+ [0xFD8E]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062E, 0x062C },
+ unicodeslot=0xFD8E,
+ },
+ [0xFD8F]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062E, 0x0645 },
+ unicodeslot=0xFD8F,
+ },
+ [0xFD92]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645, 0x062C, 0x062E },
+ unicodeslot=0xFD92,
+ },
+ [0xFD93]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0647, 0x0645, 0x062C },
+ unicodeslot=0xFD93,
+ },
+ [0xFD94]={
+ category="lo",
+ description="ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0647, 0x0645, 0x0645 },
+ unicodeslot=0xFD94,
+ },
+ [0xFD95]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x062D, 0x0645 },
+ unicodeslot=0xFD95,
+ },
+ [0xFD96]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x062D, 0x0649 },
+ unicodeslot=0xFD96,
+ },
+ [0xFD97]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x062C, 0x0645 },
+ unicodeslot=0xFD97,
+ },
+ [0xFD98]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x062C, 0x0645 },
+ unicodeslot=0xFD98,
+ },
+ [0xFD99]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x062C, 0x0649 },
+ unicodeslot=0xFD99,
+ },
+ [0xFD9A]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x0645, 0x064A },
+ unicodeslot=0xFD9A,
+ },
+ [0xFD9B]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x0645, 0x0649 },
+ unicodeslot=0xFD9B,
+ },
+ [0xFD9C]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x0645, 0x0645 },
+ unicodeslot=0xFD9C,
+ },
+ [0xFD9D]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x064A, 0x0645, 0x0645 },
+ unicodeslot=0xFD9D,
+ },
+ [0xFD9E]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x062E, 0x064A },
+ unicodeslot=0xFD9E,
+ },
+ [0xFD9F]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x062C, 0x064A },
+ unicodeslot=0xFD9F,
+ },
+ [0xFDA0]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x062C, 0x0649 },
+ unicodeslot=0xFDA0,
+ },
+ [0xFDA1]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x062E, 0x064A },
+ unicodeslot=0xFDA1,
+ },
+ [0xFDA2]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x062E, 0x0649 },
+ unicodeslot=0xFDA2,
+ },
+ [0xFDA3]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x0645, 0x064A },
+ unicodeslot=0xFDA3,
+ },
+ [0xFDA4]={
+ category="lo",
+ description="ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A, 0x0645, 0x0649 },
+ unicodeslot=0xFDA4,
+ },
+ [0xFDA5]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C, 0x0645, 0x064A },
+ unicodeslot=0xFDA5,
+ },
+ [0xFDA6]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C, 0x062D, 0x0649 },
+ unicodeslot=0xFDA6,
+ },
+ [0xFDA7]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C, 0x0645, 0x0649 },
+ unicodeslot=0xFDA7,
+ },
+ [0xFDA8]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x062E, 0x0649 },
+ unicodeslot=0xFDA8,
+ },
+ [0xFDA9]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0635, 0x062D, 0x064A },
+ unicodeslot=0xFDA9,
+ },
+ [0xFDAA]={
+ category="lo",
+ description="ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634, 0x062D, 0x064A },
+ unicodeslot=0xFDAA,
+ },
+ [0xFDAB]={
+ category="lo",
+ description="ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0636, 0x062D, 0x064A },
+ unicodeslot=0xFDAB,
+ },
+ [0xFDAC]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x062C, 0x064A },
+ unicodeslot=0xFDAC,
+ },
+ [0xFDAD]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0645, 0x064A },
+ unicodeslot=0xFDAD,
+ },
+ [0xFDAE]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x062D, 0x064A },
+ unicodeslot=0xFDAE,
+ },
+ [0xFDAF]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x062C, 0x064A },
+ unicodeslot=0xFDAF,
+ },
+ [0xFDB0]={
+ category="lo",
+ description="ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A, 0x0645, 0x064A },
+ unicodeslot=0xFDB0,
+ },
+ [0xFDB1]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0645, 0x0645, 0x064A },
+ unicodeslot=0xFDB1,
+ },
+ [0xFDB2]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0642, 0x0645, 0x064A },
+ unicodeslot=0xFDB2,
+ },
+ [0xFDB3]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x062D, 0x064A },
+ unicodeslot=0xFDB3,
+ },
+ [0xFDB4]={
+ category="lo",
+ description="ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0642, 0x0645, 0x062D },
+ unicodeslot=0xFDB4,
+ },
+ [0xFDB5]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x062D, 0x0645 },
+ unicodeslot=0xFDB5,
+ },
+ [0xFDB6]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0639, 0x0645, 0x064A },
+ unicodeslot=0xFDB6,
+ },
+ [0xFDB7]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643, 0x0645, 0x064A },
+ unicodeslot=0xFDB7,
+ },
+ [0xFDB8]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646, 0x062C, 0x062D },
+ unicodeslot=0xFDB8,
+ },
+ [0xFDB9]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0645, 0x062E, 0x064A },
+ unicodeslot=0xFDB9,
+ },
+ [0xFDBA]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644, 0x062C, 0x0645 },
+ unicodeslot=0xFDBA,
+ },
+ [0xFDBB]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643, 0x0645, 0x0645 },
+ unicodeslot=0xFDBB,
+ },
+ [0xFDBC]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x062C, 0x0645 },
+ unicodeslot=0xFDBC,
+ },
+ [0xFDBD]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x062C, 0x062D },
+ unicodeslot=0xFDBD,
+ },
+ [0xFDBE]={
+ category="lo",
+ description="ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C, 0x062D, 0x064A },
+ unicodeslot=0xFDBE,
+ },
+ [0xFDBF]={
+ category="lo",
+ description="ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062D, 0x062C, 0x064A },
+ unicodeslot=0xFDBF,
+ },
+ [0xFDC0]={
+ category="lo",
+ description="ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0645, 0x062C, 0x064A },
+ unicodeslot=0xFDC0,
+ },
+ [0xFDC1]={
+ category="lo",
+ description="ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0641, 0x0645, 0x064A },
+ unicodeslot=0xFDC1,
+ },
+ [0xFDC2]={
+ category="lo",
+ description="ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628, 0x062D, 0x064A },
+ unicodeslot=0xFDC2,
+ },
+ [0xFDC3]={
+ category="lo",
+ description="ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0643, 0x0645, 0x0645 },
+ unicodeslot=0xFDC3,
+ },
+ [0xFDC4]={
+ category="lo",
+ description="ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0639, 0x062C, 0x0645 },
+ unicodeslot=0xFDC4,
+ },
+ [0xFDC5]={
+ category="lo",
+ description="ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0635, 0x0645, 0x0645 },
+ unicodeslot=0xFDC5,
+ },
+ [0xFDC6]={
+ category="lo",
+ description="ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633, 0x062E, 0x064A },
+ unicodeslot=0xFDC6,
+ },
+ [0xFDC7]={
+ category="lo",
+ description="ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646, 0x062C, 0x064A },
+ unicodeslot=0xFDC7,
+ },
+ [0xFDF0]={
+ category="lo",
+ description="ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x0644, 0x06D2 },
+ unicodeslot=0xFDF0,
+ },
+ [0xFDF1]={
+ category="lo",
+ description="ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0642, 0x0644, 0x06D2 },
+ unicodeslot=0xFDF1,
+ },
+ [0xFDF2]={
+ category="lo",
+ description="ARABIC LIGATURE ALLAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0627, 0x0644, 0x0644, 0x0647 },
+ unicodeslot=0xFDF2,
+ },
+ [0xFDF3]={
+ category="lo",
+ description="ARABIC LIGATURE AKBAR ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0627, 0x0643, 0x0628, 0x0631 },
+ unicodeslot=0xFDF3,
+ },
+ [0xFDF4]={
+ category="lo",
+ description="ARABIC LIGATURE MOHAMMAD ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645, 0x062D, 0x0645, 0x062F },
+ unicodeslot=0xFDF4,
+ },
+ [0xFDF5]={
+ category="lo",
+ description="ARABIC LIGATURE SALAM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x0644, 0x0639, 0x0645 },
+ unicodeslot=0xFDF5,
+ },
+ [0xFDF6]={
+ category="lo",
+ description="ARABIC LIGATURE RASOUL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0631, 0x0633, 0x0648, 0x0644 },
+ unicodeslot=0xFDF6,
+ },
+ [0xFDF7]={
+ category="lo",
+ description="ARABIC LIGATURE ALAYHE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0639, 0x0644, 0x064A, 0x0647 },
+ unicodeslot=0xFDF7,
+ },
+ [0xFDF8]={
+ category="lo",
+ description="ARABIC LIGATURE WASALLAM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0648, 0x0633, 0x0644, 0x0645 },
+ unicodeslot=0xFDF8,
+ },
+ [0xFDF9]={
+ category="lo",
+ description="ARABIC LIGATURE SALLA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x0644, 0x0649 },
+ unicodeslot=0xFDF9,
+ },
+ [0xFDFA]={
+ category="lo",
+ description="ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645 },
+ unicodeslot=0xFDFA,
+ },
+ [0xFDFB]={
+ category="lo",
+ description="ARABIC LIGATURE JALLAJALALOUHOU",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647 },
+ unicodeslot=0xFDFB,
+ },
+ [0xFDFC]={
+ category="sc",
+ description="RIAL SIGN",
+ direction="al",
+ linebreak="po",
+ specials={ "isolated", 0x0631, 0x06CC, 0x0627, 0x0644 },
+ unicodeslot=0xFDFC,
+ },
+ [0xFDFD]={
+ category="so",
+ description="ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0xFDFD,
+ },
+ [0xFE00]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0001",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE00,
+ },
+ [0xFE01]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0002",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE01,
+ },
+ [0xFE02]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0003",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE02,
+ },
+ [0xFE03]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0004",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE03,
+ },
+ [0xFE04]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0005",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE04,
+ },
+ [0xFE05]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0006",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE05,
+ },
+ [0xFE06]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0007",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE06,
+ },
+ [0xFE07]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0008",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE07,
+ },
+ [0xFE08]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0009",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE08,
+ },
+ [0xFE09]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x000A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE09,
+ },
+ [0xFE0A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x000B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE0A,
+ },
+ [0xFE0B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x000C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE0B,
+ },
+ [0xFE0C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x000D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE0C,
+ },
+ [0xFE0D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x000E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE0D,
+ },
+ [0xFE0E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x000F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE0E,
+ },
+ [0xFE0F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0010",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE0F,
+ },
+ [0xFE10]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL COMMA",
+ direction="on",
+ linebreak="is",
+ specials={ "vertical", 0x002C },
+ unicodeslot=0xFE10,
+ },
+ [0xFE11]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x3001 },
+ unicodeslot=0xFE11,
+ },
+ [0xFE12]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x3002 },
+ unicodeslot=0xFE12,
+ },
+ [0xFE13]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL COLON",
+ direction="on",
+ linebreak="is",
+ specials={ "vertical", 0x003A },
+ unicodeslot=0xFE13,
+ },
+ [0xFE14]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL SEMICOLON",
+ direction="on",
+ linebreak="is",
+ specials={ "vertical", 0x003B },
+ unicodeslot=0xFE14,
+ },
+ [0xFE15]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK",
+ direction="on",
+ linebreak="ex",
+ specials={ "vertical", 0x0021 },
+ unicodeslot=0xFE15,
+ },
+ [0xFE16]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL QUESTION MARK",
+ direction="on",
+ linebreak="ex",
+ specials={ "vertical", 0x003F },
+ unicodeslot=0xFE16,
+ },
+ [0xFE17]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x3016 },
+ unicodeslot=0xFE17,
+ },
+ [0xFE18]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x3017 },
+ unicodeslot=0xFE18,
+ },
+ [0xFE19]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS",
+ direction="on",
+ linebreak="in",
+ specials={ "vertical", 0x2026 },
+ unicodeslot=0xFE19,
+ },
+ [0xFE20]={
+ category="mn",
+ description="COMBINING LIGATURE LEFT HALF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE20,
+ },
+ [0xFE21]={
+ category="mn",
+ description="COMBINING LIGATURE RIGHT HALF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE21,
+ },
+ [0xFE22]={
+ category="mn",
+ description="COMBINING DOUBLE TILDE LEFT HALF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE22,
+ },
+ [0xFE23]={
+ category="mn",
+ description="COMBINING DOUBLE TILDE RIGHT HALF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xFE23,
+ },
+ [0xFE30]={
+ category="po",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL TWO DOT LEADER",
+ direction="on",
+ linebreak="id",
+ specials={ "vertical", 0x2025 },
+ unicodeslot=0xFE30,
+ },
+ [0xFE31]={
+ category="pd",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL EM DASH",
+ direction="on",
+ linebreak="id",
+ specials={ "vertical", 0x2014 },
+ unicodeslot=0xFE31,
+ },
+ [0xFE32]={
+ category="pd",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL EN DASH",
+ direction="on",
+ linebreak="id",
+ specials={ "vertical", 0x2013 },
+ unicodeslot=0xFE32,
+ },
+ [0xFE33]={
+ category="pc",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LOW LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "vertical", 0x005F },
+ unicodeslot=0xFE33,
+ },
+ [0xFE34]={
+ category="pc",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL WAVY LOW LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "vertical", 0x005F },
+ unicodeslot=0xFE34,
+ },
+ [0xFE35]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x0028 },
+ unicodeslot=0xFE35,
+ },
+ [0xFE36]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x0029 },
+ unicodeslot=0xFE36,
+ },
+ [0xFE37]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET",
+ direction="on",
+ linebreak="op",
+ mathfiller="downbracefill", -- funny, chinese, no math, wrong but for the moment we need it for buggy mathml
+ specials={ "vertical", 0x007B },
+ unicodeslot=0xFE37,
+ },
+ [0xFE38]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET",
+ direction="on",
+ linebreak="cl",
+ mathfiller="upbracefill", -- funny, chinese, no math, wrong but for the moment we need it for buggy mathml
+ specials={ "vertical", 0x007D },
+ unicodeslot=0xFE38,
+ },
+ [0xFE39]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x3014 },
+ unicodeslot=0xFE39,
+ },
+ [0xFE3A]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x3015 },
+ unicodeslot=0xFE3A,
+ },
+ [0xFE3B]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x3010 },
+ unicodeslot=0xFE3B,
+ },
+ [0xFE3C]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x3011 },
+ unicodeslot=0xFE3C,
+ },
+ [0xFE3D]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x300A },
+ unicodeslot=0xFE3D,
+ },
+ [0xFE3E]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x300B },
+ unicodeslot=0xFE3E,
+ },
+ [0xFE3F]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x3008 },
+ unicodeslot=0xFE3F,
+ },
+ [0xFE40]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x3009 },
+ unicodeslot=0xFE40,
+ },
+ [0xFE41]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x300C },
+ unicodeslot=0xFE41,
+ },
+ [0xFE42]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x300D },
+ unicodeslot=0xFE42,
+ },
+ [0xFE43]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x300E },
+ unicodeslot=0xFE43,
+ },
+ [0xFE44]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x300F },
+ unicodeslot=0xFE44,
+ },
+ [0xFE45]={
+ category="po",
+ cjkwd="w",
+ description="SESAME DOT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xFE45,
+ },
+ [0xFE46]={
+ category="po",
+ cjkwd="w",
+ description="WHITE SESAME DOT",
+ direction="on",
+ linebreak="id",
+ unicodeslot=0xFE46,
+ },
+ [0xFE47]={
+ category="ps",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET",
+ direction="on",
+ linebreak="op",
+ specials={ "vertical", 0x005B },
+ unicodeslot=0xFE47,
+ },
+ [0xFE48]={
+ category="pe",
+ cjkwd="w",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET",
+ direction="on",
+ linebreak="cl",
+ specials={ "vertical", 0x005D },
+ unicodeslot=0xFE48,
+ },
+ [0xFE49]={
+ category="po",
+ cjkwd="w",
+ description="DASHED OVERLINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x203E },
+ unicodeslot=0xFE49,
+ },
+ [0xFE4A]={
+ category="po",
+ cjkwd="w",
+ description="CENTRELINE OVERLINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x203E },
+ unicodeslot=0xFE4A,
+ },
+ [0xFE4B]={
+ category="po",
+ cjkwd="w",
+ description="WAVY OVERLINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x203E },
+ unicodeslot=0xFE4B,
+ },
+ [0xFE4C]={
+ category="po",
+ cjkwd="w",
+ description="DOUBLE WAVY OVERLINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x203E },
+ unicodeslot=0xFE4C,
+ },
+ [0xFE4D]={
+ category="pc",
+ cjkwd="w",
+ description="DASHED LOW LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x005F },
+ unicodeslot=0xFE4D,
+ },
+ [0xFE4E]={
+ category="pc",
+ cjkwd="w",
+ description="CENTRELINE LOW LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x005F },
+ unicodeslot=0xFE4E,
+ },
+ [0xFE4F]={
+ category="pc",
+ cjkwd="w",
+ description="WAVY LOW LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "compat", 0x005F },
+ unicodeslot=0xFE4F,
+ },
+ [0xFE50]={
+ category="po",
+ cjkwd="w",
+ description="SMALL COMMA",
+ direction="cs",
+ linebreak="cl",
+ specials={ "small", 0x002C },
+ unicodeslot=0xFE50,
+ },
+ [0xFE51]={
+ category="po",
+ cjkwd="w",
+ description="SMALL IDEOGRAPHIC COMMA",
+ direction="on",
+ linebreak="id",
+ specials={ "small", 0x3001 },
+ unicodeslot=0xFE51,
+ },
+ [0xFE52]={
+ category="po",
+ cjkwd="w",
+ description="SMALL FULL STOP",
+ direction="cs",
+ linebreak="cl",
+ specials={ "small", 0x002E },
+ unicodeslot=0xFE52,
+ },
+ [0xFE54]={
+ category="po",
+ cjkwd="w",
+ description="SMALL SEMICOLON",
+ direction="on",
+ linebreak="ns",
+ specials={ "small", 0x003B },
+ unicodeslot=0xFE54,
+ },
+ [0xFE55]={
+ category="po",
+ cjkwd="w",
+ description="SMALL COLON",
+ direction="cs",
+ linebreak="ns",
+ specials={ "small", 0x003A },
+ unicodeslot=0xFE55,
+ },
+ [0xFE56]={
+ category="po",
+ cjkwd="w",
+ description="SMALL QUESTION MARK",
+ direction="on",
+ linebreak="ex",
+ specials={ "small", 0x003F },
+ unicodeslot=0xFE56,
+ },
+ [0xFE57]={
+ category="po",
+ cjkwd="w",
+ description="SMALL EXCLAMATION MARK",
+ direction="on",
+ linebreak="ex",
+ specials={ "small", 0x0021 },
+ unicodeslot=0xFE57,
+ },
+ [0xFE58]={
+ category="pd",
+ cjkwd="w",
+ description="SMALL EM DASH",
+ direction="on",
+ linebreak="id",
+ specials={ "small", 0x2014 },
+ unicodeslot=0xFE58,
+ },
+ [0xFE59]={
+ category="ps",
+ cjkwd="w",
+ description="SMALL LEFT PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mirror=0xFE5A,
+ specials={ "small", 0x0028 },
+ unicodeslot=0xFE59,
+ },
+ [0xFE5A]={
+ category="pe",
+ cjkwd="w",
+ description="SMALL RIGHT PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFE59,
+ specials={ "small", 0x0029 },
+ unicodeslot=0xFE5A,
+ },
+ [0xFE5B]={
+ category="ps",
+ cjkwd="w",
+ description="SMALL LEFT CURLY BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0xFE5C,
+ specials={ "small", 0x007B },
+ unicodeslot=0xFE5B,
+ },
+ [0xFE5C]={
+ category="pe",
+ cjkwd="w",
+ description="SMALL RIGHT CURLY BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFE5B,
+ specials={ "small", 0x007D },
+ unicodeslot=0xFE5C,
+ },
+ [0xFE5D]={
+ category="ps",
+ cjkwd="w",
+ description="SMALL LEFT TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0xFE5E,
+ specials={ "small", 0x3014 },
+ unicodeslot=0xFE5D,
+ },
+ [0xFE5E]={
+ category="pe",
+ cjkwd="w",
+ description="SMALL RIGHT TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFE5D,
+ specials={ "small", 0x3015 },
+ unicodeslot=0xFE5E,
+ },
+ [0xFE5F]={
+ category="po",
+ cjkwd="w",
+ description="SMALL NUMBER SIGN",
+ direction="et",
+ linebreak="id",
+ specials={ "small", 0x0023 },
+ unicodeslot=0xFE5F,
+ },
+ [0xFE60]={
+ category="po",
+ cjkwd="w",
+ description="SMALL AMPERSAND",
+ direction="on",
+ linebreak="id",
+ specials={ "small", 0x0026 },
+ unicodeslot=0xFE60,
+ },
+ [0xFE61]={
+ category="po",
+ cjkwd="w",
+ description="SMALL ASTERISK",
+ direction="on",
+ linebreak="id",
+ specials={ "small", 0x002A },
+ unicodeslot=0xFE61,
+ },
+ [0xFE62]={
+ category="sm",
+ cjkwd="w",
+ description="SMALL PLUS SIGN",
+ direction="es",
+ linebreak="id",
+ specials={ "small", 0x002B },
+ unicodeslot=0xFE62,
+ },
+ [0xFE63]={
+ category="pd",
+ cjkwd="w",
+ description="SMALL HYPHEN-MINUS",
+ direction="es",
+ linebreak="id",
+ specials={ "small", 0x002D },
+ unicodeslot=0xFE63,
+ },
+ [0xFE64]={
+ category="sm",
+ cjkwd="w",
+ description="SMALL LESS-THAN SIGN",
+ direction="on",
+ linebreak="id",
+ mirror=0xFE65,
+ specials={ "small", 0x003C },
+ unicodeslot=0xFE64,
+ },
+ [0xFE65]={
+ category="sm",
+ cjkwd="w",
+ description="SMALL GREATER-THAN SIGN",
+ direction="on",
+ linebreak="id",
+ mirror=0xFE64,
+ specials={ "small", 0x003E },
+ unicodeslot=0xFE65,
+ },
+ [0xFE66]={
+ category="sm",
+ cjkwd="w",
+ description="SMALL EQUALS SIGN",
+ direction="on",
+ linebreak="id",
+ specials={ "small", 0x003D },
+ unicodeslot=0xFE66,
+ },
+ [0xFE68]={
+ category="po",
+ cjkwd="w",
+ description="SMALL REVERSE SOLIDUS",
+ direction="on",
+ linebreak="id",
+ specials={ "small", 0x005C },
+ unicodeslot=0xFE68,
+ },
+ [0xFE69]={
+ category="sc",
+ cjkwd="w",
+ description="SMALL DOLLAR SIGN",
+ direction="et",
+ linebreak="pr",
+ specials={ "small", 0x0024 },
+ unicodeslot=0xFE69,
+ },
+ [0xFE6A]={
+ category="po",
+ cjkwd="w",
+ description="SMALL PERCENT SIGN",
+ direction="et",
+ linebreak="po",
+ specials={ "small", 0x0025 },
+ unicodeslot=0xFE6A,
+ },
+ [0xFE6B]={
+ category="po",
+ cjkwd="w",
+ description="SMALL COMMERCIAL AT",
+ direction="on",
+ linebreak="id",
+ specials={ "small", 0x0040 },
+ unicodeslot=0xFE6B,
+ },
+ [0xFE70]={
+ category="lo",
+ description="ARABIC FATHATAN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064B },
+ unicodeslot=0xFE70,
+ },
+ [0xFE71]={
+ category="lo",
+ description="ARABIC TATWEEL WITH FATHATAN ABOVE",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x064B },
+ unicodeslot=0xFE71,
+ },
+ [0xFE72]={
+ category="lo",
+ description="ARABIC DAMMATAN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064C },
+ unicodeslot=0xFE72,
+ },
+ [0xFE73]={
+ category="lo",
+ description="ARABIC TAIL FRAGMENT",
+ direction="al",
+ linebreak="al",
+ unicodeslot=0xFE73,
+ },
+ [0xFE74]={
+ category="lo",
+ description="ARABIC KASRATAN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064D },
+ unicodeslot=0xFE74,
+ },
+ [0xFE76]={
+ category="lo",
+ description="ARABIC FATHA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064E },
+ unicodeslot=0xFE76,
+ },
+ [0xFE77]={
+ category="lo",
+ description="ARABIC FATHA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x064E },
+ unicodeslot=0xFE77,
+ },
+ [0xFE78]={
+ category="lo",
+ description="ARABIC DAMMA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x064F },
+ unicodeslot=0xFE78,
+ },
+ [0xFE79]={
+ category="lo",
+ description="ARABIC DAMMA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x064F },
+ unicodeslot=0xFE79,
+ },
+ [0xFE7A]={
+ category="lo",
+ description="ARABIC KASRA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x0650 },
+ unicodeslot=0xFE7A,
+ },
+ [0xFE7B]={
+ category="lo",
+ description="ARABIC KASRA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x0650 },
+ unicodeslot=0xFE7B,
+ },
+ [0xFE7C]={
+ category="lo",
+ description="ARABIC SHADDA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x0651 },
+ unicodeslot=0xFE7C,
+ },
+ [0xFE7D]={
+ category="lo",
+ description="ARABIC SHADDA MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x0651 },
+ unicodeslot=0xFE7D,
+ },
+ [0xFE7E]={
+ category="lo",
+ description="ARABIC SUKUN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0020, 0x0652 },
+ unicodeslot=0xFE7E,
+ },
+ [0xFE7F]={
+ category="lo",
+ description="ARABIC SUKUN MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0640, 0x0652 },
+ unicodeslot=0xFE7F,
+ },
+ [0xFE80]={
+ category="lo",
+ description="ARABIC LETTER HAMZA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0621 },
+ unicodeslot=0xFE80,
+ },
+ [0xFE81]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "isolated", 0x0622 },
+ unicodeslot=0xFE81,
+ },
+ [0xFE82]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "final", 0x0622 },
+ unicodeslot=0xFE82,
+ },
+ [0xFE83]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "isolated", 0x0623 },
+ unicodeslot=0xFE83,
+ },
+ [0xFE84]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "final", 0x0623 },
+ unicodeslot=0xFE84,
+ },
+ [0xFE85]={
+ category="lo",
+ description="ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0648,
+ specials={ "isolated", 0x0624 },
+ unicodeslot=0xFE85,
+ },
+ [0xFE86]={
+ category="lo",
+ description="ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0648,
+ specials={ "final", 0x0624 },
+ unicodeslot=0xFE86,
+ },
+ [0xFE87]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "isolated", 0x0625 },
+ unicodeslot=0xFE87,
+ },
+ [0xFE88]={
+ category="lo",
+ description="ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x0627,
+ specials={ "final", 0x0625 },
+ unicodeslot=0xFE88,
+ },
+ [0xFE89]={
+ category="lo",
+ description="ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ specials={ "isolated", 0x0626 },
+ unicodeslot=0xFE89,
+ },
+ [0xFE8A]={
+ category="lo",
+ description="ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ specials={ "final", 0x0626 },
+ unicodeslot=0xFE8A,
+ },
+ [0xFE8B]={
+ category="lo",
+ description="ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ specials={ "initial", 0x0626 },
+ unicodeslot=0xFE8B,
+ },
+ [0xFE8C]={
+ category="lo",
+ description="ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ shcode=0x064A,
+ specials={ "medial", 0x0626 },
+ unicodeslot=0xFE8C,
+ },
+ [0xFE8D]={
+ category="lo",
+ description="ARABIC LETTER ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0627 },
+ unicodeslot=0xFE8D,
+ },
+ [0xFE8E]={
+ category="lo",
+ description="ARABIC LETTER ALEF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0627 },
+ unicodeslot=0xFE8E,
+ },
+ [0xFE8F]={
+ category="lo",
+ description="ARABIC LETTER BEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0628 },
+ unicodeslot=0xFE8F,
+ },
+ [0xFE90]={
+ category="lo",
+ description="ARABIC LETTER BEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0628 },
+ unicodeslot=0xFE90,
+ },
+ [0xFE91]={
+ category="lo",
+ description="ARABIC LETTER BEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0628 },
+ unicodeslot=0xFE91,
+ },
+ [0xFE92]={
+ category="lo",
+ description="ARABIC LETTER BEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0628 },
+ unicodeslot=0xFE92,
+ },
+ [0xFE93]={
+ category="lo",
+ description="ARABIC LETTER TEH MARBUTA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0629 },
+ unicodeslot=0xFE93,
+ },
+ [0xFE94]={
+ category="lo",
+ description="ARABIC LETTER TEH MARBUTA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0629 },
+ unicodeslot=0xFE94,
+ },
+ [0xFE95]={
+ category="lo",
+ description="ARABIC LETTER TEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062A },
+ unicodeslot=0xFE95,
+ },
+ [0xFE96]={
+ category="lo",
+ description="ARABIC LETTER TEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062A },
+ unicodeslot=0xFE96,
+ },
+ [0xFE97]={
+ category="lo",
+ description="ARABIC LETTER TEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062A },
+ unicodeslot=0xFE97,
+ },
+ [0xFE98]={
+ category="lo",
+ description="ARABIC LETTER TEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062A },
+ unicodeslot=0xFE98,
+ },
+ [0xFE99]={
+ category="lo",
+ description="ARABIC LETTER THEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062B },
+ unicodeslot=0xFE99,
+ },
+ [0xFE9A]={
+ category="lo",
+ description="ARABIC LETTER THEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062B },
+ unicodeslot=0xFE9A,
+ },
+ [0xFE9B]={
+ category="lo",
+ description="ARABIC LETTER THEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062B },
+ unicodeslot=0xFE9B,
+ },
+ [0xFE9C]={
+ category="lo",
+ description="ARABIC LETTER THEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062B },
+ unicodeslot=0xFE9C,
+ },
+ [0xFE9D]={
+ category="lo",
+ description="ARABIC LETTER JEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062C },
+ unicodeslot=0xFE9D,
+ },
+ [0xFE9E]={
+ category="lo",
+ description="ARABIC LETTER JEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062C },
+ unicodeslot=0xFE9E,
+ },
+ [0xFE9F]={
+ category="lo",
+ description="ARABIC LETTER JEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062C },
+ unicodeslot=0xFE9F,
+ },
+ [0xFEA0]={
+ category="lo",
+ description="ARABIC LETTER JEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062C },
+ unicodeslot=0xFEA0,
+ },
+ [0xFEA1]={
+ category="lo",
+ description="ARABIC LETTER HAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062D },
+ unicodeslot=0xFEA1,
+ },
+ [0xFEA2]={
+ category="lo",
+ description="ARABIC LETTER HAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062D },
+ unicodeslot=0xFEA2,
+ },
+ [0xFEA3]={
+ category="lo",
+ description="ARABIC LETTER HAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062D },
+ unicodeslot=0xFEA3,
+ },
+ [0xFEA4]={
+ category="lo",
+ description="ARABIC LETTER HAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062D },
+ unicodeslot=0xFEA4,
+ },
+ [0xFEA5]={
+ category="lo",
+ description="ARABIC LETTER KHAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062E },
+ unicodeslot=0xFEA5,
+ },
+ [0xFEA6]={
+ category="lo",
+ description="ARABIC LETTER KHAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062E },
+ unicodeslot=0xFEA6,
+ },
+ [0xFEA7]={
+ category="lo",
+ description="ARABIC LETTER KHAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x062E },
+ unicodeslot=0xFEA7,
+ },
+ [0xFEA8]={
+ category="lo",
+ description="ARABIC LETTER KHAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x062E },
+ unicodeslot=0xFEA8,
+ },
+ [0xFEA9]={
+ category="lo",
+ description="ARABIC LETTER DAL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x062F },
+ unicodeslot=0xFEA9,
+ },
+ [0xFEAA]={
+ category="lo",
+ description="ARABIC LETTER DAL FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x062F },
+ unicodeslot=0xFEAA,
+ },
+ [0xFEAB]={
+ category="lo",
+ description="ARABIC LETTER THAL ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0630 },
+ unicodeslot=0xFEAB,
+ },
+ [0xFEAC]={
+ category="lo",
+ description="ARABIC LETTER THAL FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0630 },
+ unicodeslot=0xFEAC,
+ },
+ [0xFEAD]={
+ category="lo",
+ description="ARABIC LETTER REH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0631 },
+ unicodeslot=0xFEAD,
+ },
+ [0xFEAE]={
+ category="lo",
+ description="ARABIC LETTER REH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0631 },
+ unicodeslot=0xFEAE,
+ },
+ [0xFEAF]={
+ category="lo",
+ description="ARABIC LETTER ZAIN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0632 },
+ unicodeslot=0xFEAF,
+ },
+ [0xFEB0]={
+ category="lo",
+ description="ARABIC LETTER ZAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0632 },
+ unicodeslot=0xFEB0,
+ },
+ [0xFEB1]={
+ category="lo",
+ description="ARABIC LETTER SEEN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0633 },
+ unicodeslot=0xFEB1,
+ },
+ [0xFEB2]={
+ category="lo",
+ description="ARABIC LETTER SEEN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0633 },
+ unicodeslot=0xFEB2,
+ },
+ [0xFEB3]={
+ category="lo",
+ description="ARABIC LETTER SEEN INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0633 },
+ unicodeslot=0xFEB3,
+ },
+ [0xFEB4]={
+ category="lo",
+ description="ARABIC LETTER SEEN MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0633 },
+ unicodeslot=0xFEB4,
+ },
+ [0xFEB5]={
+ category="lo",
+ description="ARABIC LETTER SHEEN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0634 },
+ unicodeslot=0xFEB5,
+ },
+ [0xFEB6]={
+ category="lo",
+ description="ARABIC LETTER SHEEN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0634 },
+ unicodeslot=0xFEB6,
+ },
+ [0xFEB7]={
+ category="lo",
+ description="ARABIC LETTER SHEEN INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0634 },
+ unicodeslot=0xFEB7,
+ },
+ [0xFEB8]={
+ category="lo",
+ description="ARABIC LETTER SHEEN MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0634 },
+ unicodeslot=0xFEB8,
+ },
+ [0xFEB9]={
+ category="lo",
+ description="ARABIC LETTER SAD ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0635 },
+ unicodeslot=0xFEB9,
+ },
+ [0xFEBA]={
+ category="lo",
+ description="ARABIC LETTER SAD FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0635 },
+ unicodeslot=0xFEBA,
+ },
+ [0xFEBB]={
+ category="lo",
+ description="ARABIC LETTER SAD INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0635 },
+ unicodeslot=0xFEBB,
+ },
+ [0xFEBC]={
+ category="lo",
+ description="ARABIC LETTER SAD MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0635 },
+ unicodeslot=0xFEBC,
+ },
+ [0xFEBD]={
+ category="lo",
+ description="ARABIC LETTER DAD ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0636 },
+ unicodeslot=0xFEBD,
+ },
+ [0xFEBE]={
+ category="lo",
+ description="ARABIC LETTER DAD FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0636 },
+ unicodeslot=0xFEBE,
+ },
+ [0xFEBF]={
+ category="lo",
+ description="ARABIC LETTER DAD INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0636 },
+ unicodeslot=0xFEBF,
+ },
+ [0xFEC0]={
+ category="lo",
+ description="ARABIC LETTER DAD MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0636 },
+ unicodeslot=0xFEC0,
+ },
+ [0xFEC1]={
+ category="lo",
+ description="ARABIC LETTER TAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0637 },
+ unicodeslot=0xFEC1,
+ },
+ [0xFEC2]={
+ category="lo",
+ description="ARABIC LETTER TAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0637 },
+ unicodeslot=0xFEC2,
+ },
+ [0xFEC3]={
+ category="lo",
+ description="ARABIC LETTER TAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0637 },
+ unicodeslot=0xFEC3,
+ },
+ [0xFEC4]={
+ category="lo",
+ description="ARABIC LETTER TAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0637 },
+ unicodeslot=0xFEC4,
+ },
+ [0xFEC5]={
+ category="lo",
+ description="ARABIC LETTER ZAH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0638 },
+ unicodeslot=0xFEC5,
+ },
+ [0xFEC6]={
+ category="lo",
+ description="ARABIC LETTER ZAH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0638 },
+ unicodeslot=0xFEC6,
+ },
+ [0xFEC7]={
+ category="lo",
+ description="ARABIC LETTER ZAH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0638 },
+ unicodeslot=0xFEC7,
+ },
+ [0xFEC8]={
+ category="lo",
+ description="ARABIC LETTER ZAH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0638 },
+ unicodeslot=0xFEC8,
+ },
+ [0xFEC9]={
+ category="lo",
+ description="ARABIC LETTER AIN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0639 },
+ unicodeslot=0xFEC9,
+ },
+ [0xFECA]={
+ category="lo",
+ description="ARABIC LETTER AIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0639 },
+ unicodeslot=0xFECA,
+ },
+ [0xFECB]={
+ category="lo",
+ description="ARABIC LETTER AIN INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0639 },
+ unicodeslot=0xFECB,
+ },
+ [0xFECC]={
+ category="lo",
+ description="ARABIC LETTER AIN MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0639 },
+ unicodeslot=0xFECC,
+ },
+ [0xFECD]={
+ category="lo",
+ description="ARABIC LETTER GHAIN ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x063A },
+ unicodeslot=0xFECD,
+ },
+ [0xFECE]={
+ category="lo",
+ description="ARABIC LETTER GHAIN FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x063A },
+ unicodeslot=0xFECE,
+ },
+ [0xFECF]={
+ category="lo",
+ description="ARABIC LETTER GHAIN INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x063A },
+ unicodeslot=0xFECF,
+ },
+ [0xFED0]={
+ category="lo",
+ description="ARABIC LETTER GHAIN MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x063A },
+ unicodeslot=0xFED0,
+ },
+ [0xFED1]={
+ category="lo",
+ description="ARABIC LETTER FEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0641 },
+ unicodeslot=0xFED1,
+ },
+ [0xFED2]={
+ category="lo",
+ description="ARABIC LETTER FEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0641 },
+ unicodeslot=0xFED2,
+ },
+ [0xFED3]={
+ category="lo",
+ description="ARABIC LETTER FEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0641 },
+ unicodeslot=0xFED3,
+ },
+ [0xFED4]={
+ category="lo",
+ description="ARABIC LETTER FEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0641 },
+ unicodeslot=0xFED4,
+ },
+ [0xFED5]={
+ category="lo",
+ description="ARABIC LETTER QAF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0642 },
+ unicodeslot=0xFED5,
+ },
+ [0xFED6]={
+ category="lo",
+ description="ARABIC LETTER QAF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0642 },
+ unicodeslot=0xFED6,
+ },
+ [0xFED7]={
+ category="lo",
+ description="ARABIC LETTER QAF INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0642 },
+ unicodeslot=0xFED7,
+ },
+ [0xFED8]={
+ category="lo",
+ description="ARABIC LETTER QAF MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0642 },
+ unicodeslot=0xFED8,
+ },
+ [0xFED9]={
+ category="lo",
+ description="ARABIC LETTER KAF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0643 },
+ unicodeslot=0xFED9,
+ },
+ [0xFEDA]={
+ category="lo",
+ description="ARABIC LETTER KAF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0643 },
+ unicodeslot=0xFEDA,
+ },
+ [0xFEDB]={
+ category="lo",
+ description="ARABIC LETTER KAF INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0643 },
+ unicodeslot=0xFEDB,
+ },
+ [0xFEDC]={
+ category="lo",
+ description="ARABIC LETTER KAF MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0643 },
+ unicodeslot=0xFEDC,
+ },
+ [0xFEDD]={
+ category="lo",
+ description="ARABIC LETTER LAM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644 },
+ unicodeslot=0xFEDD,
+ },
+ [0xFEDE]={
+ category="lo",
+ description="ARABIC LETTER LAM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644 },
+ unicodeslot=0xFEDE,
+ },
+ [0xFEDF]={
+ category="lo",
+ description="ARABIC LETTER LAM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0644 },
+ unicodeslot=0xFEDF,
+ },
+ [0xFEE0]={
+ category="lo",
+ description="ARABIC LETTER LAM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0644 },
+ unicodeslot=0xFEE0,
+ },
+ [0xFEE1]={
+ category="lo",
+ description="ARABIC LETTER MEEM ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0645 },
+ unicodeslot=0xFEE1,
+ },
+ [0xFEE2]={
+ category="lo",
+ description="ARABIC LETTER MEEM FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0645 },
+ unicodeslot=0xFEE2,
+ },
+ [0xFEE3]={
+ category="lo",
+ description="ARABIC LETTER MEEM INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0645 },
+ unicodeslot=0xFEE3,
+ },
+ [0xFEE4]={
+ category="lo",
+ description="ARABIC LETTER MEEM MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0645 },
+ unicodeslot=0xFEE4,
+ },
+ [0xFEE5]={
+ category="lo",
+ description="ARABIC LETTER NOON ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0646 },
+ unicodeslot=0xFEE5,
+ },
+ [0xFEE6]={
+ category="lo",
+ description="ARABIC LETTER NOON FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0646 },
+ unicodeslot=0xFEE6,
+ },
+ [0xFEE7]={
+ category="lo",
+ description="ARABIC LETTER NOON INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0646 },
+ unicodeslot=0xFEE7,
+ },
+ [0xFEE8]={
+ category="lo",
+ description="ARABIC LETTER NOON MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0646 },
+ unicodeslot=0xFEE8,
+ },
+ [0xFEE9]={
+ category="lo",
+ description="ARABIC LETTER HEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0647 },
+ unicodeslot=0xFEE9,
+ },
+ [0xFEEA]={
+ category="lo",
+ description="ARABIC LETTER HEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0647 },
+ unicodeslot=0xFEEA,
+ },
+ [0xFEEB]={
+ category="lo",
+ description="ARABIC LETTER HEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x0647 },
+ unicodeslot=0xFEEB,
+ },
+ [0xFEEC]={
+ category="lo",
+ description="ARABIC LETTER HEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x0647 },
+ unicodeslot=0xFEEC,
+ },
+ [0xFEED]={
+ category="lo",
+ description="ARABIC LETTER WAW ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0648 },
+ unicodeslot=0xFEED,
+ },
+ [0xFEEE]={
+ category="lo",
+ description="ARABIC LETTER WAW FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0648 },
+ unicodeslot=0xFEEE,
+ },
+ [0xFEEF]={
+ category="lo",
+ description="ARABIC LETTER ALEF MAKSURA ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0649 },
+ unicodeslot=0xFEEF,
+ },
+ [0xFEF0]={
+ category="lo",
+ description="ARABIC LETTER ALEF MAKSURA FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0649 },
+ unicodeslot=0xFEF0,
+ },
+ [0xFEF1]={
+ category="lo",
+ description="ARABIC LETTER YEH ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x064A },
+ unicodeslot=0xFEF1,
+ },
+ [0xFEF2]={
+ category="lo",
+ description="ARABIC LETTER YEH FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x064A },
+ unicodeslot=0xFEF2,
+ },
+ [0xFEF3]={
+ category="lo",
+ description="ARABIC LETTER YEH INITIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "initial", 0x064A },
+ unicodeslot=0xFEF3,
+ },
+ [0xFEF4]={
+ category="lo",
+ description="ARABIC LETTER YEH MEDIAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "medial", 0x064A },
+ unicodeslot=0xFEF4,
+ },
+ [0xFEF5]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x0622 },
+ unicodeslot=0xFEF5,
+ },
+ [0xFEF6]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0622 },
+ unicodeslot=0xFEF6,
+ },
+ [0xFEF7]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x0623 },
+ unicodeslot=0xFEF7,
+ },
+ [0xFEF8]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0623 },
+ unicodeslot=0xFEF8,
+ },
+ [0xFEF9]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x0625 },
+ unicodeslot=0xFEF9,
+ },
+ [0xFEFA]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0625 },
+ unicodeslot=0xFEFA,
+ },
+ [0xFEFB]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "isolated", 0x0644, 0x0627 },
+ unicodeslot=0xFEFB,
+ },
+ [0xFEFC]={
+ category="lo",
+ description="ARABIC LIGATURE LAM WITH ALEF FINAL FORM",
+ direction="al",
+ linebreak="al",
+ specials={ "final", 0x0644, 0x0627 },
+ unicodeslot=0xFEFC,
+ },
+ [0xFEFF]={
+ category="cf",
+ contextname="zerowidthnobreakspace",
+ description="ZERO WIDTH NO-BREAK SPACE",
+ direction="bn",
+ linebreak="wj",
+ unicodeslot=0xFEFF,
+ },
+ [0xFF01]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH EXCLAMATION MARK",
+ direction="on",
+ linebreak="ex",
+ specials={ "wide", 0x0021 },
+ unicodeslot=0xFF01,
+ },
+ [0xFF02]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH QUOTATION MARK",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x0022 },
+ unicodeslot=0xFF02,
+ },
+ [0xFF03]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH NUMBER SIGN",
+ direction="et",
+ linebreak="id",
+ specials={ "wide", 0x0023 },
+ unicodeslot=0xFF03,
+ },
+ [0xFF04]={
+ category="sc",
+ cjkwd="f",
+ description="FULLWIDTH DOLLAR SIGN",
+ direction="et",
+ linebreak="pr",
+ specials={ "wide", 0x0024 },
+ unicodeslot=0xFF04,
+ },
+ [0xFF05]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH PERCENT SIGN",
+ direction="et",
+ linebreak="po",
+ specials={ "wide", 0x0025 },
+ unicodeslot=0xFF05,
+ },
+ [0xFF06]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH AMPERSAND",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x0026 },
+ unicodeslot=0xFF06,
+ },
+ [0xFF07]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH APOSTROPHE",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x0027 },
+ unicodeslot=0xFF07,
+ },
+ [0xFF08]={
+ category="ps",
+ cjkwd="f",
+ description="FULLWIDTH LEFT PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mirror=0xFF09,
+ specials={ "wide", 0x0028 },
+ unicodeslot=0xFF08,
+ },
+ [0xFF09]={
+ category="pe",
+ cjkwd="f",
+ description="FULLWIDTH RIGHT PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFF08,
+ specials={ "wide", 0x0029 },
+ unicodeslot=0xFF09,
+ },
+ [0xFF0A]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH ASTERISK",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x002A },
+ unicodeslot=0xFF0A,
+ },
+ [0xFF0B]={
+ category="sm",
+ cjkwd="f",
+ description="FULLWIDTH PLUS SIGN",
+ direction="es",
+ linebreak="id",
+ specials={ "wide", 0x002B },
+ unicodeslot=0xFF0B,
+ },
+ [0xFF0C]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH COMMA",
+ direction="cs",
+ linebreak="cl",
+ specials={ "wide", 0x002C },
+ unicodeslot=0xFF0C,
+ },
+ [0xFF0D]={
+ category="pd",
+ cjkwd="f",
+ description="FULLWIDTH HYPHEN-MINUS",
+ direction="es",
+ linebreak="id",
+ specials={ "wide", 0x002D },
+ unicodeslot=0xFF0D,
+ },
+ [0xFF0E]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH FULL STOP",
+ direction="cs",
+ linebreak="cl",
+ specials={ "wide", 0x002E },
+ unicodeslot=0xFF0E,
+ },
+ [0xFF0F]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH SOLIDUS",
+ direction="cs",
+ linebreak="id",
+ specials={ "wide", 0x002F },
+ unicodeslot=0xFF0F,
+ },
+ [0xFF10]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT ZERO",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0030 },
+ unicodeslot=0xFF10,
+ },
+ [0xFF11]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT ONE",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0031 },
+ unicodeslot=0xFF11,
+ },
+ [0xFF12]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT TWO",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0032 },
+ unicodeslot=0xFF12,
+ },
+ [0xFF13]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT THREE",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0033 },
+ unicodeslot=0xFF13,
+ },
+ [0xFF14]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT FOUR",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0034 },
+ unicodeslot=0xFF14,
+ },
+ [0xFF15]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT FIVE",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0035 },
+ unicodeslot=0xFF15,
+ },
+ [0xFF16]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT SIX",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0036 },
+ unicodeslot=0xFF16,
+ },
+ [0xFF17]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT SEVEN",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0037 },
+ unicodeslot=0xFF17,
+ },
+ [0xFF18]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT EIGHT",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0038 },
+ unicodeslot=0xFF18,
+ },
+ [0xFF19]={
+ category="nd",
+ cjkwd="f",
+ description="FULLWIDTH DIGIT NINE",
+ direction="en",
+ linebreak="id",
+ specials={ "wide", 0x0039 },
+ unicodeslot=0xFF19,
+ },
+ [0xFF1A]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH COLON",
+ direction="cs",
+ linebreak="ns",
+ specials={ "wide", 0x003A },
+ unicodeslot=0xFF1A,
+ },
+ [0xFF1B]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH SEMICOLON",
+ direction="on",
+ linebreak="ns",
+ specials={ "wide", 0x003B },
+ unicodeslot=0xFF1B,
+ },
+ [0xFF1C]={
+ category="sm",
+ cjkwd="f",
+ description="FULLWIDTH LESS-THAN SIGN",
+ direction="on",
+ linebreak="id",
+ mirror=0xFF1E,
+ specials={ "wide", 0x003C },
+ unicodeslot=0xFF1C,
+ },
+ [0xFF1D]={
+ category="sm",
+ cjkwd="f",
+ description="FULLWIDTH EQUALS SIGN",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x003D },
+ unicodeslot=0xFF1D,
+ },
+ [0xFF1E]={
+ category="sm",
+ cjkwd="f",
+ description="FULLWIDTH GREATER-THAN SIGN",
+ direction="on",
+ linebreak="id",
+ mirror=0xFF1C,
+ specials={ "wide", 0x003E },
+ unicodeslot=0xFF1E,
+ },
+ [0xFF1F]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH QUESTION MARK",
+ direction="on",
+ linebreak="ex",
+ specials={ "wide", 0x003F },
+ unicodeslot=0xFF1F,
+ },
+ [0xFF20]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH COMMERCIAL AT",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x0040 },
+ unicodeslot=0xFF20,
+ },
+ [0xFF21]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER A",
+ direction="l",
+ lccode=0xFF41,
+ linebreak="id",
+ specials={ "wide", 0x0041 },
+ unicodeslot=0xFF21,
+ },
+ [0xFF22]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER B",
+ direction="l",
+ lccode=0xFF42,
+ linebreak="id",
+ specials={ "wide", 0x0042 },
+ unicodeslot=0xFF22,
+ },
+ [0xFF23]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER C",
+ direction="l",
+ lccode=0xFF43,
+ linebreak="id",
+ specials={ "wide", 0x0043 },
+ unicodeslot=0xFF23,
+ },
+ [0xFF24]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER D",
+ direction="l",
+ lccode=0xFF44,
+ linebreak="id",
+ specials={ "wide", 0x0044 },
+ unicodeslot=0xFF24,
+ },
+ [0xFF25]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER E",
+ direction="l",
+ lccode=0xFF45,
+ linebreak="id",
+ specials={ "wide", 0x0045 },
+ unicodeslot=0xFF25,
+ },
+ [0xFF26]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER F",
+ direction="l",
+ lccode=0xFF46,
+ linebreak="id",
+ specials={ "wide", 0x0046 },
+ unicodeslot=0xFF26,
+ },
+ [0xFF27]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER G",
+ direction="l",
+ lccode=0xFF47,
+ linebreak="id",
+ specials={ "wide", 0x0047 },
+ unicodeslot=0xFF27,
+ },
+ [0xFF28]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER H",
+ direction="l",
+ lccode=0xFF48,
+ linebreak="id",
+ specials={ "wide", 0x0048 },
+ unicodeslot=0xFF28,
+ },
+ [0xFF29]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER I",
+ direction="l",
+ lccode=0xFF49,
+ linebreak="id",
+ specials={ "wide", 0x0049 },
+ unicodeslot=0xFF29,
+ },
+ [0xFF2A]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER J",
+ direction="l",
+ lccode=0xFF4A,
+ linebreak="id",
+ specials={ "wide", 0x004A },
+ unicodeslot=0xFF2A,
+ },
+ [0xFF2B]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER K",
+ direction="l",
+ lccode=0xFF4B,
+ linebreak="id",
+ specials={ "wide", 0x004B },
+ unicodeslot=0xFF2B,
+ },
+ [0xFF2C]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER L",
+ direction="l",
+ lccode=0xFF4C,
+ linebreak="id",
+ specials={ "wide", 0x004C },
+ unicodeslot=0xFF2C,
+ },
+ [0xFF2D]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER M",
+ direction="l",
+ lccode=0xFF4D,
+ linebreak="id",
+ specials={ "wide", 0x004D },
+ unicodeslot=0xFF2D,
+ },
+ [0xFF2E]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER N",
+ direction="l",
+ lccode=0xFF4E,
+ linebreak="id",
+ specials={ "wide", 0x004E },
+ unicodeslot=0xFF2E,
+ },
+ [0xFF2F]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER O",
+ direction="l",
+ lccode=0xFF4F,
+ linebreak="id",
+ specials={ "wide", 0x004F },
+ unicodeslot=0xFF2F,
+ },
+ [0xFF30]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER P",
+ direction="l",
+ lccode=0xFF50,
+ linebreak="id",
+ specials={ "wide", 0x0050 },
+ unicodeslot=0xFF30,
+ },
+ [0xFF31]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER Q",
+ direction="l",
+ lccode=0xFF51,
+ linebreak="id",
+ specials={ "wide", 0x0051 },
+ unicodeslot=0xFF31,
+ },
+ [0xFF32]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER R",
+ direction="l",
+ lccode=0xFF52,
+ linebreak="id",
+ specials={ "wide", 0x0052 },
+ unicodeslot=0xFF32,
+ },
+ [0xFF33]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER S",
+ direction="l",
+ lccode=0xFF53,
+ linebreak="id",
+ specials={ "wide", 0x0053 },
+ unicodeslot=0xFF33,
+ },
+ [0xFF34]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER T",
+ direction="l",
+ lccode=0xFF54,
+ linebreak="id",
+ specials={ "wide", 0x0054 },
+ unicodeslot=0xFF34,
+ },
+ [0xFF35]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER U",
+ direction="l",
+ lccode=0xFF55,
+ linebreak="id",
+ specials={ "wide", 0x0055 },
+ unicodeslot=0xFF35,
+ },
+ [0xFF36]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER V",
+ direction="l",
+ lccode=0xFF56,
+ linebreak="id",
+ specials={ "wide", 0x0056 },
+ unicodeslot=0xFF36,
+ },
+ [0xFF37]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER W",
+ direction="l",
+ lccode=0xFF57,
+ linebreak="id",
+ specials={ "wide", 0x0057 },
+ unicodeslot=0xFF37,
+ },
+ [0xFF38]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER X",
+ direction="l",
+ lccode=0xFF58,
+ linebreak="id",
+ specials={ "wide", 0x0058 },
+ unicodeslot=0xFF38,
+ },
+ [0xFF39]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER Y",
+ direction="l",
+ lccode=0xFF59,
+ linebreak="id",
+ specials={ "wide", 0x0059 },
+ unicodeslot=0xFF39,
+ },
+ [0xFF3A]={
+ category="lu",
+ cjkwd="f",
+ description="FULLWIDTH LATIN CAPITAL LETTER Z",
+ direction="l",
+ lccode=0xFF5A,
+ linebreak="id",
+ specials={ "wide", 0x005A },
+ unicodeslot=0xFF3A,
+ },
+ [0xFF3B]={
+ category="ps",
+ cjkwd="f",
+ description="FULLWIDTH LEFT SQUARE BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0xFF3D,
+ specials={ "wide", 0x005B },
+ unicodeslot=0xFF3B,
+ },
+ [0xFF3C]={
+ category="po",
+ cjkwd="f",
+ description="FULLWIDTH REVERSE SOLIDUS",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x005C },
+ unicodeslot=0xFF3C,
+ },
+ [0xFF3D]={
+ category="pe",
+ cjkwd="f",
+ description="FULLWIDTH RIGHT SQUARE BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFF3B,
+ specials={ "wide", 0x005D },
+ unicodeslot=0xFF3D,
+ },
+ [0xFF3E]={
+ category="sk",
+ cjkwd="f",
+ description="FULLWIDTH CIRCUMFLEX ACCENT",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x005E },
+ unicodeslot=0xFF3E,
+ },
+ [0xFF3F]={
+ category="pc",
+ cjkwd="f",
+ description="FULLWIDTH LOW LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x005F },
+ unicodeslot=0xFF3F,
+ },
+ [0xFF40]={
+ category="sk",
+ cjkwd="f",
+ description="FULLWIDTH GRAVE ACCENT",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x0060 },
+ unicodeslot=0xFF40,
+ },
+ [0xFF41]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER A",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0061 },
+ uccode=0xFF21,
+ unicodeslot=0xFF41,
+ },
+ [0xFF42]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER B",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0062 },
+ uccode=0xFF22,
+ unicodeslot=0xFF42,
+ },
+ [0xFF43]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER C",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0063 },
+ uccode=0xFF23,
+ unicodeslot=0xFF43,
+ },
+ [0xFF44]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER D",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0064 },
+ uccode=0xFF24,
+ unicodeslot=0xFF44,
+ },
+ [0xFF45]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER E",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0065 },
+ uccode=0xFF25,
+ unicodeslot=0xFF45,
+ },
+ [0xFF46]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER F",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0066 },
+ uccode=0xFF26,
+ unicodeslot=0xFF46,
+ },
+ [0xFF47]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER G",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0067 },
+ uccode=0xFF27,
+ unicodeslot=0xFF47,
+ },
+ [0xFF48]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER H",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0068 },
+ uccode=0xFF28,
+ unicodeslot=0xFF48,
+ },
+ [0xFF49]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER I",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0069 },
+ uccode=0xFF29,
+ unicodeslot=0xFF49,
+ },
+ [0xFF4A]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER J",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x006A },
+ uccode=0xFF2A,
+ unicodeslot=0xFF4A,
+ },
+ [0xFF4B]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER K",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x006B },
+ uccode=0xFF2B,
+ unicodeslot=0xFF4B,
+ },
+ [0xFF4C]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER L",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x006C },
+ uccode=0xFF2C,
+ unicodeslot=0xFF4C,
+ },
+ [0xFF4D]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER M",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x006D },
+ uccode=0xFF2D,
+ unicodeslot=0xFF4D,
+ },
+ [0xFF4E]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER N",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x006E },
+ uccode=0xFF2E,
+ unicodeslot=0xFF4E,
+ },
+ [0xFF4F]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER O",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x006F },
+ uccode=0xFF2F,
+ unicodeslot=0xFF4F,
+ },
+ [0xFF50]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER P",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0070 },
+ uccode=0xFF30,
+ unicodeslot=0xFF50,
+ },
+ [0xFF51]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER Q",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0071 },
+ uccode=0xFF31,
+ unicodeslot=0xFF51,
+ },
+ [0xFF52]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER R",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0072 },
+ uccode=0xFF32,
+ unicodeslot=0xFF52,
+ },
+ [0xFF53]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER S",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0073 },
+ uccode=0xFF33,
+ unicodeslot=0xFF53,
+ },
+ [0xFF54]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER T",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0074 },
+ uccode=0xFF34,
+ unicodeslot=0xFF54,
+ },
+ [0xFF55]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER U",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0075 },
+ uccode=0xFF35,
+ unicodeslot=0xFF55,
+ },
+ [0xFF56]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER V",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0076 },
+ uccode=0xFF36,
+ unicodeslot=0xFF56,
+ },
+ [0xFF57]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER W",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0077 },
+ uccode=0xFF37,
+ unicodeslot=0xFF57,
+ },
+ [0xFF58]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER X",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0078 },
+ uccode=0xFF38,
+ unicodeslot=0xFF58,
+ },
+ [0xFF59]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER Y",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x0079 },
+ uccode=0xFF39,
+ unicodeslot=0xFF59,
+ },
+ [0xFF5A]={
+ category="ll",
+ cjkwd="f",
+ description="FULLWIDTH LATIN SMALL LETTER Z",
+ direction="l",
+ linebreak="id",
+ specials={ "wide", 0x007A },
+ uccode=0xFF3A,
+ unicodeslot=0xFF5A,
+ },
+ [0xFF5B]={
+ category="ps",
+ cjkwd="f",
+ description="FULLWIDTH LEFT CURLY BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0xFF5D,
+ specials={ "wide", 0x007B },
+ unicodeslot=0xFF5B,
+ },
+ [0xFF5C]={
+ category="sm",
+ cjkwd="f",
+ description="FULLWIDTH VERTICAL LINE",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x007C },
+ unicodeslot=0xFF5C,
+ },
+ [0xFF5D]={
+ category="pe",
+ cjkwd="f",
+ description="FULLWIDTH RIGHT CURLY BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFF5B,
+ specials={ "wide", 0x007D },
+ unicodeslot=0xFF5D,
+ },
+ [0xFF5E]={
+ category="sm",
+ cjkwd="f",
+ description="FULLWIDTH TILDE",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x007E },
+ unicodeslot=0xFF5E,
+ },
+ [0xFF5F]={
+ category="ps",
+ cjkwd="f",
+ description="FULLWIDTH LEFT WHITE PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mirror=0xFF60,
+ specials={ "wide", 0x2985 },
+ unicodeslot=0xFF5F,
+ },
+ [0xFF60]={
+ category="pe",
+ cjkwd="f",
+ description="FULLWIDTH RIGHT WHITE PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFF5F,
+ specials={ "wide", 0x2986 },
+ unicodeslot=0xFF60,
+ },
+ [0xFF61]={
+ category="po",
+ cjkwd="h",
+ description="HALFWIDTH IDEOGRAPHIC FULL STOP",
+ direction="on",
+ linebreak="cl",
+ specials={ "narrow", 0x3002 },
+ unicodeslot=0xFF61,
+ },
+ [0xFF62]={
+ category="ps",
+ cjkwd="h",
+ description="HALFWIDTH LEFT CORNER BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0xFF63,
+ specials={ "narrow", 0x300C },
+ unicodeslot=0xFF62,
+ },
+ [0xFF63]={
+ category="pe",
+ cjkwd="h",
+ description="HALFWIDTH RIGHT CORNER BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0xFF62,
+ specials={ "narrow", 0x300D },
+ unicodeslot=0xFF63,
+ },
+ [0xFF64]={
+ category="po",
+ cjkwd="h",
+ description="HALFWIDTH IDEOGRAPHIC COMMA",
+ direction="on",
+ linebreak="cl",
+ specials={ "narrow", 0x3001 },
+ unicodeslot=0xFF64,
+ },
+ [0xFF65]={
+ category="po",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA MIDDLE DOT",
+ direction="on",
+ linebreak="ns",
+ specials={ "narrow", 0x30FB },
+ unicodeslot=0xFF65,
+ },
+ [0xFF66]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER WO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30F2 },
+ unicodeslot=0xFF66,
+ },
+ [0xFF67]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL A",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30A1 },
+ unicodeslot=0xFF67,
+ },
+ [0xFF68]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL I",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30A3 },
+ unicodeslot=0xFF68,
+ },
+ [0xFF69]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL U",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30A5 },
+ unicodeslot=0xFF69,
+ },
+ [0xFF6A]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL E",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30A7 },
+ unicodeslot=0xFF6A,
+ },
+ [0xFF6B]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL O",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30A9 },
+ unicodeslot=0xFF6B,
+ },
+ [0xFF6C]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL YA",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30E3 },
+ unicodeslot=0xFF6C,
+ },
+ [0xFF6D]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL YU",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30E5 },
+ unicodeslot=0xFF6D,
+ },
+ [0xFF6E]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL YO",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30E7 },
+ unicodeslot=0xFF6E,
+ },
+ [0xFF6F]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SMALL TU",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30C3 },
+ unicodeslot=0xFF6F,
+ },
+ [0xFF70]={
+ category="lm",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x30FC },
+ unicodeslot=0xFF70,
+ },
+ [0xFF71]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER A",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30A2 },
+ unicodeslot=0xFF71,
+ },
+ [0xFF72]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER I",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30A4 },
+ unicodeslot=0xFF72,
+ },
+ [0xFF73]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER U",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30A6 },
+ unicodeslot=0xFF73,
+ },
+ [0xFF74]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER E",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30A8 },
+ unicodeslot=0xFF74,
+ },
+ [0xFF75]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER O",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30AA },
+ unicodeslot=0xFF75,
+ },
+ [0xFF76]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER KA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30AB },
+ unicodeslot=0xFF76,
+ },
+ [0xFF77]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER KI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30AD },
+ unicodeslot=0xFF77,
+ },
+ [0xFF78]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER KU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30AF },
+ unicodeslot=0xFF78,
+ },
+ [0xFF79]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER KE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30B1 },
+ unicodeslot=0xFF79,
+ },
+ [0xFF7A]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER KO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30B3 },
+ unicodeslot=0xFF7A,
+ },
+ [0xFF7B]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30B5 },
+ unicodeslot=0xFF7B,
+ },
+ [0xFF7C]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30B7 },
+ unicodeslot=0xFF7C,
+ },
+ [0xFF7D]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30B9 },
+ unicodeslot=0xFF7D,
+ },
+ [0xFF7E]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30BB },
+ unicodeslot=0xFF7E,
+ },
+ [0xFF7F]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER SO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30BD },
+ unicodeslot=0xFF7F,
+ },
+ [0xFF80]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER TA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30BF },
+ unicodeslot=0xFF80,
+ },
+ [0xFF81]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER TI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30C1 },
+ unicodeslot=0xFF81,
+ },
+ [0xFF82]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER TU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30C4 },
+ unicodeslot=0xFF82,
+ },
+ [0xFF83]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER TE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30C6 },
+ unicodeslot=0xFF83,
+ },
+ [0xFF84]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER TO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30C8 },
+ unicodeslot=0xFF84,
+ },
+ [0xFF85]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER NA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30CA },
+ unicodeslot=0xFF85,
+ },
+ [0xFF86]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER NI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30CB },
+ unicodeslot=0xFF86,
+ },
+ [0xFF87]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER NU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30CC },
+ unicodeslot=0xFF87,
+ },
+ [0xFF88]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER NE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30CD },
+ unicodeslot=0xFF88,
+ },
+ [0xFF89]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER NO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30CE },
+ unicodeslot=0xFF89,
+ },
+ [0xFF8A]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER HA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30CF },
+ unicodeslot=0xFF8A,
+ },
+ [0xFF8B]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER HI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30D2 },
+ unicodeslot=0xFF8B,
+ },
+ [0xFF8C]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER HU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30D5 },
+ unicodeslot=0xFF8C,
+ },
+ [0xFF8D]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER HE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30D8 },
+ unicodeslot=0xFF8D,
+ },
+ [0xFF8E]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER HO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30DB },
+ unicodeslot=0xFF8E,
+ },
+ [0xFF8F]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER MA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30DE },
+ unicodeslot=0xFF8F,
+ },
+ [0xFF90]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER MI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30DF },
+ unicodeslot=0xFF90,
+ },
+ [0xFF91]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER MU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30E0 },
+ unicodeslot=0xFF91,
+ },
+ [0xFF92]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER ME",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30E1 },
+ unicodeslot=0xFF92,
+ },
+ [0xFF93]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER MO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30E2 },
+ unicodeslot=0xFF93,
+ },
+ [0xFF94]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER YA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30E4 },
+ unicodeslot=0xFF94,
+ },
+ [0xFF95]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER YU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30E6 },
+ unicodeslot=0xFF95,
+ },
+ [0xFF96]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER YO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30E8 },
+ unicodeslot=0xFF96,
+ },
+ [0xFF97]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER RA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30E9 },
+ unicodeslot=0xFF97,
+ },
+ [0xFF98]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER RI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30EA },
+ unicodeslot=0xFF98,
+ },
+ [0xFF99]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER RU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30EB },
+ unicodeslot=0xFF99,
+ },
+ [0xFF9A]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER RE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30EC },
+ unicodeslot=0xFF9A,
+ },
+ [0xFF9B]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER RO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30ED },
+ unicodeslot=0xFF9B,
+ },
+ [0xFF9C]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER WA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30EF },
+ unicodeslot=0xFF9C,
+ },
+ [0xFF9D]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA LETTER N",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x30F3 },
+ unicodeslot=0xFF9D,
+ },
+ [0xFF9E]={
+ category="lm",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA VOICED SOUND MARK",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x3099 },
+ unicodeslot=0xFF9E,
+ },
+ [0xFF9F]={
+ category="lm",
+ cjkwd="h",
+ description="HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK",
+ direction="l",
+ linebreak="ns",
+ specials={ "narrow", 0x309A },
+ unicodeslot=0xFF9F,
+ },
+ [0xFFA0]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL FILLER",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3164 },
+ unicodeslot=0xFFA0,
+ },
+ [0xFFA1]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER KIYEOK",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3131 },
+ unicodeslot=0xFFA1,
+ },
+ [0xFFA2]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER SSANGKIYEOK",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3132 },
+ unicodeslot=0xFFA2,
+ },
+ [0xFFA3]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER KIYEOK-SIOS",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3133 },
+ unicodeslot=0xFFA3,
+ },
+ [0xFFA4]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER NIEUN",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3134 },
+ unicodeslot=0xFFA4,
+ },
+ [0xFFA5]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER NIEUN-CIEUC",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3135 },
+ unicodeslot=0xFFA5,
+ },
+ [0xFFA6]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER NIEUN-HIEUH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3136 },
+ unicodeslot=0xFFA6,
+ },
+ [0xFFA7]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER TIKEUT",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3137 },
+ unicodeslot=0xFFA7,
+ },
+ [0xFFA8]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER SSANGTIKEUT",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3138 },
+ unicodeslot=0xFFA8,
+ },
+ [0xFFA9]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3139 },
+ unicodeslot=0xFFA9,
+ },
+ [0xFFAA]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL-KIYEOK",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x313A },
+ unicodeslot=0xFFAA,
+ },
+ [0xFFAB]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL-MIEUM",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x313B },
+ unicodeslot=0xFFAB,
+ },
+ [0xFFAC]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL-PIEUP",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x313C },
+ unicodeslot=0xFFAC,
+ },
+ [0xFFAD]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL-SIOS",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x313D },
+ unicodeslot=0xFFAD,
+ },
+ [0xFFAE]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL-THIEUTH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x313E },
+ unicodeslot=0xFFAE,
+ },
+ [0xFFAF]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x313F },
+ unicodeslot=0xFFAF,
+ },
+ [0xFFB0]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER RIEUL-HIEUH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3140 },
+ unicodeslot=0xFFB0,
+ },
+ [0xFFB1]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER MIEUM",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3141 },
+ unicodeslot=0xFFB1,
+ },
+ [0xFFB2]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER PIEUP",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3142 },
+ unicodeslot=0xFFB2,
+ },
+ [0xFFB3]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER SSANGPIEUP",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3143 },
+ unicodeslot=0xFFB3,
+ },
+ [0xFFB4]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER PIEUP-SIOS",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3144 },
+ unicodeslot=0xFFB4,
+ },
+ [0xFFB5]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER SIOS",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3145 },
+ unicodeslot=0xFFB5,
+ },
+ [0xFFB6]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER SSANGSIOS",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3146 },
+ unicodeslot=0xFFB6,
+ },
+ [0xFFB7]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER IEUNG",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3147 },
+ unicodeslot=0xFFB7,
+ },
+ [0xFFB8]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER CIEUC",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3148 },
+ unicodeslot=0xFFB8,
+ },
+ [0xFFB9]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER SSANGCIEUC",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3149 },
+ unicodeslot=0xFFB9,
+ },
+ [0xFFBA]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER CHIEUCH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x314A },
+ unicodeslot=0xFFBA,
+ },
+ [0xFFBB]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER KHIEUKH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x314B },
+ unicodeslot=0xFFBB,
+ },
+ [0xFFBC]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER THIEUTH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x314C },
+ unicodeslot=0xFFBC,
+ },
+ [0xFFBD]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER PHIEUPH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x314D },
+ unicodeslot=0xFFBD,
+ },
+ [0xFFBE]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER HIEUH",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x314E },
+ unicodeslot=0xFFBE,
+ },
+ [0xFFC2]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER A",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x314F },
+ unicodeslot=0xFFC2,
+ },
+ [0xFFC3]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER AE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3150 },
+ unicodeslot=0xFFC3,
+ },
+ [0xFFC4]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER YA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3151 },
+ unicodeslot=0xFFC4,
+ },
+ [0xFFC5]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER YAE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3152 },
+ unicodeslot=0xFFC5,
+ },
+ [0xFFC6]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER EO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3153 },
+ unicodeslot=0xFFC6,
+ },
+ [0xFFC7]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER E",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3154 },
+ unicodeslot=0xFFC7,
+ },
+ [0xFFCA]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER YEO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3155 },
+ unicodeslot=0xFFCA,
+ },
+ [0xFFCB]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER YE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3156 },
+ unicodeslot=0xFFCB,
+ },
+ [0xFFCC]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER O",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3157 },
+ unicodeslot=0xFFCC,
+ },
+ [0xFFCD]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER WA",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3158 },
+ unicodeslot=0xFFCD,
+ },
+ [0xFFCE]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER WAE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3159 },
+ unicodeslot=0xFFCE,
+ },
+ [0xFFCF]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER OE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x315A },
+ unicodeslot=0xFFCF,
+ },
+ [0xFFD2]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER YO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x315B },
+ unicodeslot=0xFFD2,
+ },
+ [0xFFD3]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER U",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x315C },
+ unicodeslot=0xFFD3,
+ },
+ [0xFFD4]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER WEO",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x315D },
+ unicodeslot=0xFFD4,
+ },
+ [0xFFD5]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER WE",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x315E },
+ unicodeslot=0xFFD5,
+ },
+ [0xFFD6]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER WI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x315F },
+ unicodeslot=0xFFD6,
+ },
+ [0xFFD7]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER YU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3160 },
+ unicodeslot=0xFFD7,
+ },
+ [0xFFDA]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER EU",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3161 },
+ unicodeslot=0xFFDA,
+ },
+ [0xFFDB]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER YI",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3162 },
+ unicodeslot=0xFFDB,
+ },
+ [0xFFDC]={
+ category="lo",
+ cjkwd="h",
+ description="HALFWIDTH HANGUL LETTER I",
+ direction="l",
+ linebreak="al",
+ specials={ "narrow", 0x3163 },
+ unicodeslot=0xFFDC,
+ },
+ [0xFFE0]={
+ category="sc",
+ cjkwd="f",
+ description="FULLWIDTH CENT SIGN",
+ direction="et",
+ linebreak="po",
+ specials={ "wide", 0x00A2 },
+ unicodeslot=0xFFE0,
+ },
+ [0xFFE1]={
+ category="sc",
+ cjkwd="f",
+ description="FULLWIDTH POUND SIGN",
+ direction="et",
+ linebreak="pr",
+ specials={ "wide", 0x00A3 },
+ unicodeslot=0xFFE1,
+ },
+ [0xFFE2]={
+ category="sm",
+ cjkwd="f",
+ description="FULLWIDTH NOT SIGN",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x00AC },
+ unicodeslot=0xFFE2,
+ },
+ [0xFFE3]={
+ category="sk",
+ cjkwd="f",
+ description="FULLWIDTH MACRON",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x00AF },
+ unicodeslot=0xFFE3,
+ },
+ [0xFFE4]={
+ category="so",
+ cjkwd="f",
+ description="FULLWIDTH BROKEN BAR",
+ direction="on",
+ linebreak="id",
+ specials={ "wide", 0x00A6 },
+ unicodeslot=0xFFE4,
+ },
+ [0xFFE5]={
+ category="sc",
+ cjkwd="f",
+ description="FULLWIDTH YEN SIGN",
+ direction="et",
+ linebreak="pr",
+ specials={ "wide", 0x00A5 },
+ unicodeslot=0xFFE5,
+ },
+ [0xFFE6]={
+ category="sc",
+ cjkwd="f",
+ description="FULLWIDTH WON SIGN",
+ direction="et",
+ linebreak="pr",
+ specials={ "wide", 0x20A9 },
+ unicodeslot=0xFFE6,
+ },
+ [0xFFE8]={
+ category="so",
+ cjkwd="h",
+ description="HALFWIDTH FORMS LIGHT VERTICAL",
+ direction="on",
+ linebreak="al",
+ specials={ "narrow", 0x2502 },
+ unicodeslot=0xFFE8,
+ },
+ [0xFFE9]={
+ category="sm",
+ cjkwd="h",
+ description="HALFWIDTH LEFTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ specials={ "narrow", 0x2190 },
+ unicodeslot=0xFFE9,
+ },
+ [0xFFEA]={
+ category="sm",
+ cjkwd="h",
+ description="HALFWIDTH UPWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ specials={ "narrow", 0x2191 },
+ unicodeslot=0xFFEA,
+ },
+ [0xFFEB]={
+ category="sm",
+ cjkwd="h",
+ description="HALFWIDTH RIGHTWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ specials={ "narrow", 0x2192 },
+ unicodeslot=0xFFEB,
+ },
+ [0xFFEC]={
+ category="sm",
+ cjkwd="h",
+ description="HALFWIDTH DOWNWARDS ARROW",
+ direction="on",
+ linebreak="al",
+ specials={ "narrow", 0x2193 },
+ unicodeslot=0xFFEC,
+ },
+ [0xFFED]={
+ category="so",
+ cjkwd="h",
+ description="HALFWIDTH BLACK SQUARE",
+ direction="on",
+ linebreak="al",
+ specials={ "narrow", 0x25A0 },
+ unicodeslot=0xFFED,
+ },
+ [0xFFEE]={
+ category="so",
+ cjkwd="h",
+ description="HALFWIDTH WHITE CIRCLE",
+ direction="on",
+ linebreak="al",
+ specials={ "narrow", 0x25CB },
+ unicodeslot=0xFFEE,
+ },
+ [0xFFF9]={
+ category="cf",
+ description="INTERLINEAR ANNOTATION ANCHOR",
+ direction="on",
+ visible="yes",
+ linebreak="cm",
+ unicodeslot=0xFFF9,
+ },
+ [0xFFFA]={
+ category="cf",
+ description="INTERLINEAR ANNOTATION SEPARATOR",
+ direction="on",
+ visible="yes",
+ linebreak="cm",
+ unicodeslot=0xFFFA,
+ },
+ [0xFFFB]={
+ category="cf",
+ description="INTERLINEAR ANNOTATION TERMINATOR",
+ direction="on",
+ visible="yes",
+ linebreak="cm",
+ unicodeslot=0xFFFB,
+ },
+ [0xFFFC]={
+ category="so",
+ description="OBJECT REPLACEMENT CHARACTER",
+ direction="on",
+ linebreak="cb",
+ unicodeslot=0xFFFC,
+ },
+ [0xFFFD]={
+ category="so",
+ cjkwd="a",
+ description="REPLACEMENT CHARACTER",
+ direction="on",
+ linebreak="ai",
+ unicodeslot=0xFFFD,
+ },
+ [0x10000]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0008 A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10000,
+ },
+ [0x10001]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0026 E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10001,
+ },
+ [0x10002]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x001C I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10002,
+ },
+ [0x10003]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x003D O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10003,
+ },
+ [0x10004]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x000A U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10004,
+ },
+ [0x10005]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0001 DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10005,
+ },
+ [0x10006]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x002D DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10006,
+ },
+ [0x10007]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0007 DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10007,
+ },
+ [0x10008]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x000E DO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10008,
+ },
+ [0x10009]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0033 DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10009,
+ },
+ [0x1000A]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0039 JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1000A,
+ },
+ [0x1000B]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x002E JE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1000B,
+ },
+ [0x1000D]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0024 JO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1000D,
+ },
+ [0x1000E]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0041 JU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1000E,
+ },
+ [0x1000F]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x004D KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1000F,
+ },
+ [0x10010]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x002C KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10010,
+ },
+ [0x10011]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0043 KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10011,
+ },
+ [0x10012]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0046 KO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10012,
+ },
+ [0x10013]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0051 KU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10013,
+ },
+ [0x10014]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0050 MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10014,
+ },
+ [0x10015]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x000D ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10015,
+ },
+ [0x10016]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0049 MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10016,
+ },
+ [0x10017]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x000F MO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10017,
+ },
+ [0x10018]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0017 MU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10018,
+ },
+ [0x10019]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0006 NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10019,
+ },
+ [0x1001A]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0018 NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1001A,
+ },
+ [0x1001B]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x001E NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1001B,
+ },
+ [0x1001C]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0034 NO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1001C,
+ },
+ [0x1001D]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0037 NU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1001D,
+ },
+ [0x1001E]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0003 PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1001E,
+ },
+ [0x1001F]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0048 PE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1001F,
+ },
+ [0x10020]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0027 PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10020,
+ },
+ [0x10021]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x000B PO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10021,
+ },
+ [0x10022]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0032 PU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10022,
+ },
+ [0x10023]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0010 QA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10023,
+ },
+ [0x10024]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x004E QE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10024,
+ },
+ [0x10025]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0015 QI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10025,
+ },
+ [0x10026]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0020 QO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10026,
+ },
+ [0x10028]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x003C RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10028,
+ },
+ [0x10029]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x001B RE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10029,
+ },
+ [0x1002A]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0035 RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1002A,
+ },
+ [0x1002B]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0002 RO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1002B,
+ },
+ [0x1002C]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x001A RU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1002C,
+ },
+ [0x1002D]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x001F SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1002D,
+ },
+ [0x1002E]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0009 SE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1002E,
+ },
+ [0x1002F]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0029 SI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1002F,
+ },
+ [0x10030]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x000C SO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10030,
+ },
+ [0x10031]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x003A SU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10031,
+ },
+ [0x10032]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x003B TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10032,
+ },
+ [0x10033]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0004 TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10033,
+ },
+ [0x10034]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0025 TI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10034,
+ },
+ [0x10035]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0005 TO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10035,
+ },
+ [0x10036]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0045 TU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10036,
+ },
+ [0x10037]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0036 WA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10037,
+ },
+ [0x10038]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x004B WE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10038,
+ },
+ [0x10039]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0028 WI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10039,
+ },
+ [0x1003A]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x002A WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1003A,
+ },
+ [0x1003C]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0011 ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1003C,
+ },
+ [0x1003D]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x004A ZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1003D,
+ },
+ [0x1003F]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0014 ZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1003F,
+ },
+ [0x10040]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0019 A0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10040,
+ },
+ [0x10041]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x002B A0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10041,
+ },
+ [0x10042]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0055 AU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10042,
+ },
+ [0x10043]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0047 DWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10043,
+ },
+ [0x10044]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x005A DWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10044,
+ },
+ [0x10045]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0030 NWA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10045,
+ },
+ [0x10046]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x001D PU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10046,
+ },
+ [0x10047]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x003E PTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10047,
+ },
+ [0x10048]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x004C RA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10048,
+ },
+ [0x10049]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0021 RA0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10049,
+ },
+ [0x1004A]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0044 RO0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1004A,
+ },
+ [0x1004B]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0042 TA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1004B,
+ },
+ [0x1004C]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x0057 TWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1004C,
+ },
+ [0x1004D]={
+ category="lo",
+ description="LINEAR B SYLLABLE B0x005B TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1004D,
+ },
+ [0x10050]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0012",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10050,
+ },
+ [0x10051]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0013",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10051,
+ },
+ [0x10052]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0016",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10052,
+ },
+ [0x10053]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0022",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10053,
+ },
+ [0x10054]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x002F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10054,
+ },
+ [0x10055]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0031",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10055,
+ },
+ [0x10056]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0038",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10056,
+ },
+ [0x10057]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x003F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10057,
+ },
+ [0x10058]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0040",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10058,
+ },
+ [0x10059]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x004F",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10059,
+ },
+ [0x1005A]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0052",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1005A,
+ },
+ [0x1005B]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0053",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1005B,
+ },
+ [0x1005C]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0056",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1005C,
+ },
+ [0x1005D]={
+ category="lo",
+ description="LINEAR B SYMBOL B0x0059",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1005D,
+ },
+ [0x10080]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0064 MAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10080,
+ },
+ [0x10081]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0066 WOMAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10081,
+ },
+ [0x10082]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0068 DEER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10082,
+ },
+ [0x10083]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0069 EQUID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10083,
+ },
+ [0x10084]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0069F MARE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10084,
+ },
+ [0x10085]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0069M STALLION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10085,
+ },
+ [0x10086]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006AF EWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10086,
+ },
+ [0x10087]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006AM RAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10087,
+ },
+ [0x10088]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006BF SHE-GOAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10088,
+ },
+ [0x10089]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006BM HE-GOAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10089,
+ },
+ [0x1008A]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006CF SOW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1008A,
+ },
+ [0x1008B]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006CM BOAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1008B,
+ },
+ [0x1008C]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006DF COW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1008C,
+ },
+ [0x1008D]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x006DM BULL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1008D,
+ },
+ [0x1008E]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0078 WHEAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1008E,
+ },
+ [0x1008F]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0079 BARLEY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1008F,
+ },
+ [0x10090]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x007A OLIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10090,
+ },
+ [0x10091]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x007B SPICE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10091,
+ },
+ [0x10092]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x007D CYPERUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10092,
+ },
+ [0x10093]={
+ category="lo",
+ description="LINEAR B MONOGRAM B0x007F KAPO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10093,
+ },
+ [0x10094]={
+ category="lo",
+ description="LINEAR B MONOGRAM B0x0080 KANAKO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10094,
+ },
+ [0x10095]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0082 OIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10095,
+ },
+ [0x10096]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0083 WINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10096,
+ },
+ [0x10097]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0084",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10097,
+ },
+ [0x10098]={
+ category="lo",
+ description="LINEAR B MONOGRAM B0x0085 AREPA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10098,
+ },
+ [0x10099]={
+ category="lo",
+ description="LINEAR B MONOGRAM B0x0087 MERI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10099,
+ },
+ [0x1009A]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x008C BRONZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1009A,
+ },
+ [0x1009B]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x008D GOLD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1009B,
+ },
+ [0x1009C]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x008E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1009C,
+ },
+ [0x1009D]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0091 WOOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1009D,
+ },
+ [0x1009E]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0092",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1009E,
+ },
+ [0x1009F]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0096",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1009F,
+ },
+ [0x100A0]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0097 HORN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A0,
+ },
+ [0x100A1]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0098",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A1,
+ },
+ [0x100A2]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0099",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A2,
+ },
+ [0x100A3]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x009A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A3,
+ },
+ [0x100A4]={
+ category="lo",
+ description="LINEAR B MONOGRAM B0x009C TURO0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A4,
+ },
+ [0x100A5]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x009D",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A5,
+ },
+ [0x100A6]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x009E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A6,
+ },
+ [0x100A7]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x009F CLOTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A7,
+ },
+ [0x100A8]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A0",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A8,
+ },
+ [0x100A9]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100A9,
+ },
+ [0x100AA]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A2 GARMENT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100AA,
+ },
+ [0x100AB]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A3 ARMOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100AB,
+ },
+ [0x100AC]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100AC,
+ },
+ [0x100AD]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A5",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100AD,
+ },
+ [0x100AE]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100AE,
+ },
+ [0x100AF]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100AF,
+ },
+ [0x100B0]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B0,
+ },
+ [0x100B1]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00A9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B1,
+ },
+ [0x100B2]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B2,
+ },
+ [0x100B3]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00AB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B3,
+ },
+ [0x100B4]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00AC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B4,
+ },
+ [0x100B5]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00AD MONTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B5,
+ },
+ [0x100B6]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00AE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B6,
+ },
+ [0x100B7]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B0 TREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B7,
+ },
+ [0x100B8]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B8,
+ },
+ [0x100B9]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100B9,
+ },
+ [0x100BA]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100BA,
+ },
+ [0x100BB]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100BB,
+ },
+ [0x100BC]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B5",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100BC,
+ },
+ [0x100BD]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100BD,
+ },
+ [0x100BE]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100BE,
+ },
+ [0x100BF]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100BF,
+ },
+ [0x100C0]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00B9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C0,
+ },
+ [0x100C1]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00BD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C1,
+ },
+ [0x100C2]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00BE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C2,
+ },
+ [0x100C3]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00BF HELMET",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C3,
+ },
+ [0x100C4]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00DC FOOTSTOOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C4,
+ },
+ [0x100C5]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00E1 BATHTUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C5,
+ },
+ [0x100C6]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00E6 SPEAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C6,
+ },
+ [0x100C7]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00E7 ARROW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C7,
+ },
+ [0x100C8]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00E8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C8,
+ },
+ [0x100C9]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00E9 SWORD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100C9,
+ },
+ [0x100CA]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00EA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100CA,
+ },
+ [0x100CB]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00EC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100CB,
+ },
+ [0x100CC]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F0 WHEELED CHARIOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100CC,
+ },
+ [0x100CD]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F1 CHARIOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100CD,
+ },
+ [0x100CE]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F2 CHARIOT FRAME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100CE,
+ },
+ [0x100CF]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F3 WHEEL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100CF,
+ },
+ [0x100D0]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F5",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D0,
+ },
+ [0x100D1]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D1,
+ },
+ [0x100D2]={
+ category="lo",
+ description="LINEAR B MONOGRAM B0x00F7 DIPTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D2,
+ },
+ [0x100D3]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D3,
+ },
+ [0x100D4]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00F9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D4,
+ },
+ [0x100D5]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00FB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D5,
+ },
+ [0x100D6]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00FC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D6,
+ },
+ [0x100D7]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00FD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D7,
+ },
+ [0x100D8]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00FE DART",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D8,
+ },
+ [0x100D9]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x00FF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100D9,
+ },
+ [0x100DA]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0100",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100DA,
+ },
+ [0x100DB]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0101",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100DB,
+ },
+ [0x100DC]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0102",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100DC,
+ },
+ [0x100DD]={
+ category="lo",
+ description="LINEAR B IDEOGRAM B0x0103",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100DD,
+ },
+ [0x100DE]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x009B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100DE,
+ },
+ [0x100DF]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00C8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100DF,
+ },
+ [0x100E0]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00C9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E0,
+ },
+ [0x100E1]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E1,
+ },
+ [0x100E2]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00CB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E2,
+ },
+ [0x100E3]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00CC",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E3,
+ },
+ [0x100E4]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00CD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E4,
+ },
+ [0x100E5]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00CE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E5,
+ },
+ [0x100E6]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00CF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E6,
+ },
+ [0x100E7]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D0",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E7,
+ },
+ [0x100E8]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D1",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E8,
+ },
+ [0x100E9]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100E9,
+ },
+ [0x100EA]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100EA,
+ },
+ [0x100EB]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100EB,
+ },
+ [0x100EC]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D5",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100EC,
+ },
+ [0x100ED]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D6",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100ED,
+ },
+ [0x100EE]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D7",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100EE,
+ },
+ [0x100EF]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D8",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100EF,
+ },
+ [0x100F0]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00D9",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F0,
+ },
+ [0x100F1]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F1,
+ },
+ [0x100F2]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00DB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F2,
+ },
+ [0x100F3]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00DD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F3,
+ },
+ [0x100F4]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F4,
+ },
+ [0x100F5]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00E2",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F5,
+ },
+ [0x100F6]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00E3",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F6,
+ },
+ [0x100F7]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00E4",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F7,
+ },
+ [0x100F8]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00E5",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F8,
+ },
+ [0x100F9]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x00FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100F9,
+ },
+ [0x100FA]={
+ category="lo",
+ description="LINEAR B IDEOGRAM VESSEL B0x0131",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x100FA,
+ },
+ [0x10100]={
+ category="po",
+ description="AEGEAN WORD SEPARATOR LINE",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x10100,
+ },
+ [0x10101]={
+ category="po",
+ description="AEGEAN WORD SEPARATOR DOT",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x10101,
+ },
+ [0x10102]={
+ category="so",
+ description="AEGEAN CHECK MARK",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x10102,
+ },
+ [0x10107]={
+ category="no",
+ description="AEGEAN NUMBER ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10107,
+ },
+ [0x10108]={
+ category="no",
+ description="AEGEAN NUMBER TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10108,
+ },
+ [0x10109]={
+ category="no",
+ description="AEGEAN NUMBER THREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10109,
+ },
+ [0x1010A]={
+ category="no",
+ description="AEGEAN NUMBER FOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1010A,
+ },
+ [0x1010B]={
+ category="no",
+ description="AEGEAN NUMBER FIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1010B,
+ },
+ [0x1010C]={
+ category="no",
+ description="AEGEAN NUMBER SIX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1010C,
+ },
+ [0x1010D]={
+ category="no",
+ description="AEGEAN NUMBER SEVEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1010D,
+ },
+ [0x1010E]={
+ category="no",
+ description="AEGEAN NUMBER EIGHT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1010E,
+ },
+ [0x1010F]={
+ category="no",
+ description="AEGEAN NUMBER NINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1010F,
+ },
+ [0x10110]={
+ category="no",
+ description="AEGEAN NUMBER TEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10110,
+ },
+ [0x10111]={
+ category="no",
+ description="AEGEAN NUMBER TWENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10111,
+ },
+ [0x10112]={
+ category="no",
+ description="AEGEAN NUMBER THIRTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10112,
+ },
+ [0x10113]={
+ category="no",
+ description="AEGEAN NUMBER FORTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10113,
+ },
+ [0x10114]={
+ category="no",
+ description="AEGEAN NUMBER FIFTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10114,
+ },
+ [0x10115]={
+ category="no",
+ description="AEGEAN NUMBER SIXTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10115,
+ },
+ [0x10116]={
+ category="no",
+ description="AEGEAN NUMBER SEVENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10116,
+ },
+ [0x10117]={
+ category="no",
+ description="AEGEAN NUMBER EIGHTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10117,
+ },
+ [0x10118]={
+ category="no",
+ description="AEGEAN NUMBER NINETY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10118,
+ },
+ [0x10119]={
+ category="no",
+ description="AEGEAN NUMBER ONE HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10119,
+ },
+ [0x1011A]={
+ category="no",
+ description="AEGEAN NUMBER TWO HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1011A,
+ },
+ [0x1011B]={
+ category="no",
+ description="AEGEAN NUMBER THREE HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1011B,
+ },
+ [0x1011C]={
+ category="no",
+ description="AEGEAN NUMBER FOUR HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1011C,
+ },
+ [0x1011D]={
+ category="no",
+ description="AEGEAN NUMBER FIVE HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1011D,
+ },
+ [0x1011E]={
+ category="no",
+ description="AEGEAN NUMBER SIX HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1011E,
+ },
+ [0x1011F]={
+ category="no",
+ description="AEGEAN NUMBER SEVEN HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1011F,
+ },
+ [0x10120]={
+ category="no",
+ description="AEGEAN NUMBER EIGHT HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10120,
+ },
+ [0x10121]={
+ category="no",
+ description="AEGEAN NUMBER NINE HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10121,
+ },
+ [0x10122]={
+ category="no",
+ description="AEGEAN NUMBER ONE THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10122,
+ },
+ [0x10123]={
+ category="no",
+ description="AEGEAN NUMBER TWO THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10123,
+ },
+ [0x10124]={
+ category="no",
+ description="AEGEAN NUMBER THREE THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10124,
+ },
+ [0x10125]={
+ category="no",
+ description="AEGEAN NUMBER FOUR THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10125,
+ },
+ [0x10126]={
+ category="no",
+ description="AEGEAN NUMBER FIVE THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10126,
+ },
+ [0x10127]={
+ category="no",
+ description="AEGEAN NUMBER SIX THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10127,
+ },
+ [0x10128]={
+ category="no",
+ description="AEGEAN NUMBER SEVEN THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10128,
+ },
+ [0x10129]={
+ category="no",
+ description="AEGEAN NUMBER EIGHT THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10129,
+ },
+ [0x1012A]={
+ category="no",
+ description="AEGEAN NUMBER NINE THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1012A,
+ },
+ [0x1012B]={
+ category="no",
+ description="AEGEAN NUMBER TEN THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1012B,
+ },
+ [0x1012C]={
+ category="no",
+ description="AEGEAN NUMBER TWENTY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1012C,
+ },
+ [0x1012D]={
+ category="no",
+ description="AEGEAN NUMBER THIRTY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1012D,
+ },
+ [0x1012E]={
+ category="no",
+ description="AEGEAN NUMBER FORTY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1012E,
+ },
+ [0x1012F]={
+ category="no",
+ description="AEGEAN NUMBER FIFTY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1012F,
+ },
+ [0x10130]={
+ category="no",
+ description="AEGEAN NUMBER SIXTY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10130,
+ },
+ [0x10131]={
+ category="no",
+ description="AEGEAN NUMBER SEVENTY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10131,
+ },
+ [0x10132]={
+ category="no",
+ description="AEGEAN NUMBER EIGHTY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10132,
+ },
+ [0x10133]={
+ category="no",
+ description="AEGEAN NUMBER NINETY THOUSAND",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10133,
+ },
+ [0x10137]={
+ category="so",
+ description="AEGEAN WEIGHT BASE UNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10137,
+ },
+ [0x10138]={
+ category="so",
+ description="AEGEAN WEIGHT FIRST SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10138,
+ },
+ [0x10139]={
+ category="so",
+ description="AEGEAN WEIGHT SECOND SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10139,
+ },
+ [0x1013A]={
+ category="so",
+ description="AEGEAN WEIGHT THIRD SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1013A,
+ },
+ [0x1013B]={
+ category="so",
+ description="AEGEAN WEIGHT FOURTH SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1013B,
+ },
+ [0x1013C]={
+ category="so",
+ description="AEGEAN DRY MEASURE FIRST SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1013C,
+ },
+ [0x1013D]={
+ category="so",
+ description="AEGEAN LIQUID MEASURE FIRST SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1013D,
+ },
+ [0x1013E]={
+ category="so",
+ description="AEGEAN MEASURE SECOND SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1013E,
+ },
+ [0x1013F]={
+ category="so",
+ description="AEGEAN MEASURE THIRD SUBUNIT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1013F,
+ },
+ [0x10140]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC ONE QUARTER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10140,
+ },
+ [0x10141]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC ONE HALF",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10141,
+ },
+ [0x10142]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC ONE DRACHMA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10142,
+ },
+ [0x10143]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10143,
+ },
+ [0x10144]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIFTY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10144,
+ },
+ [0x10145]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10145,
+ },
+ [0x10146]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE THOUSAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10146,
+ },
+ [0x10147]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIFTY THOUSAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10147,
+ },
+ [0x10148]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE TALENTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10148,
+ },
+ [0x10149]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC TEN TALENTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10149,
+ },
+ [0x1014A]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIFTY TALENTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1014A,
+ },
+ [0x1014B]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1014B,
+ },
+ [0x1014C]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1014C,
+ },
+ [0x1014D]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1014D,
+ },
+ [0x1014E]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1014E,
+ },
+ [0x1014F]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1014F,
+ },
+ [0x10150]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC TEN STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10150,
+ },
+ [0x10151]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIFTY STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10151,
+ },
+ [0x10152]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10152,
+ },
+ [0x10153]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10153,
+ },
+ [0x10154]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10154,
+ },
+ [0x10155]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10155,
+ },
+ [0x10156]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10156,
+ },
+ [0x10157]={
+ category="nl",
+ description="GREEK ACROPHONIC ATTIC TEN MNAS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10157,
+ },
+ [0x10158]={
+ category="nl",
+ description="GREEK ACROPHONIC HERAEUM ONE PLETHRON",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10158,
+ },
+ [0x10159]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN ONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10159,
+ },
+ [0x1015A]={
+ category="nl",
+ description="GREEK ACROPHONIC HERMIONIAN ONE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1015A,
+ },
+ [0x1015B]={
+ category="nl",
+ description="GREEK ACROPHONIC EPIDAUREAN TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1015B,
+ },
+ [0x1015C]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN TWO",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1015C,
+ },
+ [0x1015D]={
+ category="nl",
+ description="GREEK ACROPHONIC CYRENAIC TWO DRACHMAS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1015D,
+ },
+ [0x1015E]={
+ category="nl",
+ description="GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1015E,
+ },
+ [0x1015F]={
+ category="nl",
+ description="GREEK ACROPHONIC TROEZENIAN FIVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1015F,
+ },
+ [0x10160]={
+ category="nl",
+ description="GREEK ACROPHONIC TROEZENIAN TEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10160,
+ },
+ [0x10161]={
+ category="nl",
+ description="GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10161,
+ },
+ [0x10162]={
+ category="nl",
+ description="GREEK ACROPHONIC HERMIONIAN TEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10162,
+ },
+ [0x10163]={
+ category="nl",
+ description="GREEK ACROPHONIC MESSENIAN TEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10163,
+ },
+ [0x10164]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN TEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10164,
+ },
+ [0x10165]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN THIRTY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10165,
+ },
+ [0x10166]={
+ category="nl",
+ description="GREEK ACROPHONIC TROEZENIAN FIFTY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10166,
+ },
+ [0x10167]={
+ category="nl",
+ description="GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10167,
+ },
+ [0x10168]={
+ category="nl",
+ description="GREEK ACROPHONIC HERMIONIAN FIFTY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10168,
+ },
+ [0x10169]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN FIFTY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10169,
+ },
+ [0x1016A]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN ONE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1016A,
+ },
+ [0x1016B]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN THREE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1016B,
+ },
+ [0x1016C]={
+ category="nl",
+ description="GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1016C,
+ },
+ [0x1016D]={
+ category="nl",
+ description="GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1016D,
+ },
+ [0x1016E]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN FIVE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1016E,
+ },
+ [0x1016F]={
+ category="nl",
+ description="GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1016F,
+ },
+ [0x10170]={
+ category="nl",
+ description="GREEK ACROPHONIC NAXIAN FIVE HUNDRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10170,
+ },
+ [0x10171]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN ONE THOUSAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10171,
+ },
+ [0x10172]={
+ category="nl",
+ description="GREEK ACROPHONIC THESPIAN FIVE THOUSAND",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10172,
+ },
+ [0x10173]={
+ category="nl",
+ description="GREEK ACROPHONIC DELPHIC FIVE MNAS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10173,
+ },
+ [0x10174]={
+ category="nl",
+ description="GREEK ACROPHONIC STRATIAN FIFTY MNAS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10174,
+ },
+ [0x10175]={
+ category="no",
+ description="GREEK ONE HALF SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10175,
+ },
+ [0x10176]={
+ category="no",
+ description="GREEK ONE HALF SIGN ALTERNATE FORM",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10176,
+ },
+ [0x10177]={
+ category="no",
+ description="GREEK TWO THIRDS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10177,
+ },
+ [0x10178]={
+ category="no",
+ description="GREEK THREE QUARTERS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10178,
+ },
+ [0x10179]={
+ category="so",
+ description="GREEK YEAR SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10179,
+ },
+ [0x1017A]={
+ category="so",
+ description="GREEK TALENT SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1017A,
+ },
+ [0x1017B]={
+ category="so",
+ description="GREEK DRACHMA SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1017B,
+ },
+ [0x1017C]={
+ category="so",
+ description="GREEK OBOL SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1017C,
+ },
+ [0x1017D]={
+ category="so",
+ description="GREEK TWO OBOLS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1017D,
+ },
+ [0x1017E]={
+ category="so",
+ description="GREEK THREE OBOLS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1017E,
+ },
+ [0x1017F]={
+ category="so",
+ description="GREEK FOUR OBOLS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1017F,
+ },
+ [0x10180]={
+ category="so",
+ description="GREEK FIVE OBOLS SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10180,
+ },
+ [0x10181]={
+ category="so",
+ description="GREEK METRETES SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10181,
+ },
+ [0x10182]={
+ category="so",
+ description="GREEK KYATHOS BASE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10182,
+ },
+ [0x10183]={
+ category="so",
+ description="GREEK LITRA SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10183,
+ },
+ [0x10184]={
+ category="so",
+ description="GREEK OUNKIA SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10184,
+ },
+ [0x10185]={
+ category="so",
+ description="GREEK XESTES SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10185,
+ },
+ [0x10186]={
+ category="so",
+ description="GREEK ARTABE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10186,
+ },
+ [0x10187]={
+ category="so",
+ description="GREEK AROURA SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10187,
+ },
+ [0x10188]={
+ category="so",
+ description="GREEK GRAMMA SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10188,
+ },
+ [0x10189]={
+ category="so",
+ description="GREEK TRYBLION BASE SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x10189,
+ },
+ [0x1018A]={
+ category="no",
+ description="GREEK ZERO SIGN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1018A,
+ },
+ [0x10300]={
+ category="lo",
+ description="OLD ITALIC LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10300,
+ },
+ [0x10301]={
+ category="lo",
+ description="OLD ITALIC LETTER BE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10301,
+ },
+ [0x10302]={
+ category="lo",
+ description="OLD ITALIC LETTER KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10302,
+ },
+ [0x10303]={
+ category="lo",
+ description="OLD ITALIC LETTER DE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10303,
+ },
+ [0x10304]={
+ category="lo",
+ description="OLD ITALIC LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10304,
+ },
+ [0x10305]={
+ category="lo",
+ description="OLD ITALIC LETTER VE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10305,
+ },
+ [0x10306]={
+ category="lo",
+ description="OLD ITALIC LETTER ZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10306,
+ },
+ [0x10307]={
+ category="lo",
+ description="OLD ITALIC LETTER HE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10307,
+ },
+ [0x10308]={
+ category="lo",
+ description="OLD ITALIC LETTER THE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10308,
+ },
+ [0x10309]={
+ category="lo",
+ description="OLD ITALIC LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10309,
+ },
+ [0x1030A]={
+ category="lo",
+ description="OLD ITALIC LETTER KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1030A,
+ },
+ [0x1030B]={
+ category="lo",
+ description="OLD ITALIC LETTER EL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1030B,
+ },
+ [0x1030C]={
+ category="lo",
+ description="OLD ITALIC LETTER EM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1030C,
+ },
+ [0x1030D]={
+ category="lo",
+ description="OLD ITALIC LETTER EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1030D,
+ },
+ [0x1030E]={
+ category="lo",
+ description="OLD ITALIC LETTER ESH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1030E,
+ },
+ [0x1030F]={
+ category="lo",
+ description="OLD ITALIC LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1030F,
+ },
+ [0x10310]={
+ category="lo",
+ description="OLD ITALIC LETTER PE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10310,
+ },
+ [0x10311]={
+ category="lo",
+ description="OLD ITALIC LETTER SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10311,
+ },
+ [0x10312]={
+ category="lo",
+ description="OLD ITALIC LETTER KU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10312,
+ },
+ [0x10313]={
+ category="lo",
+ description="OLD ITALIC LETTER ER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10313,
+ },
+ [0x10314]={
+ category="lo",
+ description="OLD ITALIC LETTER ES",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10314,
+ },
+ [0x10315]={
+ category="lo",
+ description="OLD ITALIC LETTER TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10315,
+ },
+ [0x10316]={
+ category="lo",
+ description="OLD ITALIC LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10316,
+ },
+ [0x10317]={
+ category="lo",
+ description="OLD ITALIC LETTER EKS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10317,
+ },
+ [0x10318]={
+ category="lo",
+ description="OLD ITALIC LETTER PHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10318,
+ },
+ [0x10319]={
+ category="lo",
+ description="OLD ITALIC LETTER KHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10319,
+ },
+ [0x1031A]={
+ category="lo",
+ description="OLD ITALIC LETTER EF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1031A,
+ },
+ [0x1031B]={
+ category="lo",
+ description="OLD ITALIC LETTER ERS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1031B,
+ },
+ [0x1031C]={
+ category="lo",
+ description="OLD ITALIC LETTER CHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1031C,
+ },
+ [0x1031D]={
+ category="lo",
+ description="OLD ITALIC LETTER II",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1031D,
+ },
+ [0x1031E]={
+ category="lo",
+ description="OLD ITALIC LETTER UU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1031E,
+ },
+ [0x10320]={
+ category="no",
+ description="OLD ITALIC NUMERAL ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10320,
+ },
+ [0x10321]={
+ category="no",
+ description="OLD ITALIC NUMERAL FIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10321,
+ },
+ [0x10322]={
+ category="no",
+ description="OLD ITALIC NUMERAL TEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10322,
+ },
+ [0x10323]={
+ category="no",
+ description="OLD ITALIC NUMERAL FIFTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10323,
+ },
+ [0x10330]={
+ category="lo",
+ description="GOTHIC LETTER AHSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10330,
+ },
+ [0x10331]={
+ category="lo",
+ description="GOTHIC LETTER BAIRKAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10331,
+ },
+ [0x10332]={
+ category="lo",
+ description="GOTHIC LETTER GIBA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10332,
+ },
+ [0x10333]={
+ category="lo",
+ description="GOTHIC LETTER DAGS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10333,
+ },
+ [0x10334]={
+ category="lo",
+ description="GOTHIC LETTER AIHVUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10334,
+ },
+ [0x10335]={
+ category="lo",
+ description="GOTHIC LETTER QAIRTHRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10335,
+ },
+ [0x10336]={
+ category="lo",
+ description="GOTHIC LETTER IUJA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10336,
+ },
+ [0x10337]={
+ category="lo",
+ description="GOTHIC LETTER HAGL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10337,
+ },
+ [0x10338]={
+ category="lo",
+ description="GOTHIC LETTER THIUTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10338,
+ },
+ [0x10339]={
+ category="lo",
+ description="GOTHIC LETTER EIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10339,
+ },
+ [0x1033A]={
+ category="lo",
+ description="GOTHIC LETTER KUSMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1033A,
+ },
+ [0x1033B]={
+ category="lo",
+ description="GOTHIC LETTER LAGUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1033B,
+ },
+ [0x1033C]={
+ category="lo",
+ description="GOTHIC LETTER MANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1033C,
+ },
+ [0x1033D]={
+ category="lo",
+ description="GOTHIC LETTER NAUTHS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1033D,
+ },
+ [0x1033E]={
+ category="lo",
+ description="GOTHIC LETTER JER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1033E,
+ },
+ [0x1033F]={
+ category="lo",
+ description="GOTHIC LETTER URUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1033F,
+ },
+ [0x10340]={
+ category="lo",
+ description="GOTHIC LETTER PAIRTHRA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10340,
+ },
+ [0x10341]={
+ category="nl",
+ description="GOTHIC LETTER NINETY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10341,
+ },
+ [0x10342]={
+ category="lo",
+ description="GOTHIC LETTER RAIDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10342,
+ },
+ [0x10343]={
+ category="lo",
+ description="GOTHIC LETTER SAUIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10343,
+ },
+ [0x10344]={
+ category="lo",
+ description="GOTHIC LETTER TEIWS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10344,
+ },
+ [0x10345]={
+ category="lo",
+ description="GOTHIC LETTER WINJA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10345,
+ },
+ [0x10346]={
+ category="lo",
+ description="GOTHIC LETTER FAIHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10346,
+ },
+ [0x10347]={
+ category="lo",
+ description="GOTHIC LETTER IGGWS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10347,
+ },
+ [0x10348]={
+ category="lo",
+ description="GOTHIC LETTER HWAIR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10348,
+ },
+ [0x10349]={
+ category="lo",
+ description="GOTHIC LETTER OTHAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10349,
+ },
+ [0x1034A]={
+ category="nl",
+ description="GOTHIC LETTER NINE HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1034A,
+ },
+ [0x10380]={
+ category="lo",
+ description="UGARITIC LETTER ALPA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10380,
+ },
+ [0x10381]={
+ category="lo",
+ description="UGARITIC LETTER BETA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10381,
+ },
+ [0x10382]={
+ category="lo",
+ description="UGARITIC LETTER GAMLA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10382,
+ },
+ [0x10383]={
+ category="lo",
+ description="UGARITIC LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10383,
+ },
+ [0x10384]={
+ category="lo",
+ description="UGARITIC LETTER DELTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10384,
+ },
+ [0x10385]={
+ category="lo",
+ description="UGARITIC LETTER HO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10385,
+ },
+ [0x10386]={
+ category="lo",
+ description="UGARITIC LETTER WO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10386,
+ },
+ [0x10387]={
+ category="lo",
+ description="UGARITIC LETTER ZETA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10387,
+ },
+ [0x10388]={
+ category="lo",
+ description="UGARITIC LETTER HOTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10388,
+ },
+ [0x10389]={
+ category="lo",
+ description="UGARITIC LETTER TET",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10389,
+ },
+ [0x1038A]={
+ category="lo",
+ description="UGARITIC LETTER YOD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1038A,
+ },
+ [0x1038B]={
+ category="lo",
+ description="UGARITIC LETTER KAF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1038B,
+ },
+ [0x1038C]={
+ category="lo",
+ description="UGARITIC LETTER SHIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1038C,
+ },
+ [0x1038D]={
+ category="lo",
+ description="UGARITIC LETTER LAMDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1038D,
+ },
+ [0x1038E]={
+ category="lo",
+ description="UGARITIC LETTER MEM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1038E,
+ },
+ [0x1038F]={
+ category="lo",
+ description="UGARITIC LETTER DHAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1038F,
+ },
+ [0x10390]={
+ category="lo",
+ description="UGARITIC LETTER NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10390,
+ },
+ [0x10391]={
+ category="lo",
+ description="UGARITIC LETTER ZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10391,
+ },
+ [0x10392]={
+ category="lo",
+ description="UGARITIC LETTER SAMKA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10392,
+ },
+ [0x10393]={
+ category="lo",
+ description="UGARITIC LETTER AIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10393,
+ },
+ [0x10394]={
+ category="lo",
+ description="UGARITIC LETTER PU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10394,
+ },
+ [0x10395]={
+ category="lo",
+ description="UGARITIC LETTER SADE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10395,
+ },
+ [0x10396]={
+ category="lo",
+ description="UGARITIC LETTER QOPA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10396,
+ },
+ [0x10397]={
+ category="lo",
+ description="UGARITIC LETTER RASHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10397,
+ },
+ [0x10398]={
+ category="lo",
+ description="UGARITIC LETTER THANNA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10398,
+ },
+ [0x10399]={
+ category="lo",
+ description="UGARITIC LETTER GHAIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10399,
+ },
+ [0x1039A]={
+ category="lo",
+ description="UGARITIC LETTER TO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1039A,
+ },
+ [0x1039B]={
+ category="lo",
+ description="UGARITIC LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1039B,
+ },
+ [0x1039C]={
+ category="lo",
+ description="UGARITIC LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1039C,
+ },
+ [0x1039D]={
+ category="lo",
+ description="UGARITIC LETTER SSU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1039D,
+ },
+ [0x1039F]={
+ category="po",
+ description="UGARITIC WORD DIVIDER",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x1039F,
+ },
+ [0x103A0]={
+ category="lo",
+ description="OLD PERSIAN SIGN A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A0,
+ },
+ [0x103A1]={
+ category="lo",
+ description="OLD PERSIAN SIGN I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A1,
+ },
+ [0x103A2]={
+ category="lo",
+ description="OLD PERSIAN SIGN U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A2,
+ },
+ [0x103A3]={
+ category="lo",
+ description="OLD PERSIAN SIGN KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A3,
+ },
+ [0x103A4]={
+ category="lo",
+ description="OLD PERSIAN SIGN KU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A4,
+ },
+ [0x103A5]={
+ category="lo",
+ description="OLD PERSIAN SIGN GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A5,
+ },
+ [0x103A6]={
+ category="lo",
+ description="OLD PERSIAN SIGN GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A6,
+ },
+ [0x103A7]={
+ category="lo",
+ description="OLD PERSIAN SIGN XA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A7,
+ },
+ [0x103A8]={
+ category="lo",
+ description="OLD PERSIAN SIGN CA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A8,
+ },
+ [0x103A9]={
+ category="lo",
+ description="OLD PERSIAN SIGN JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103A9,
+ },
+ [0x103AA]={
+ category="lo",
+ description="OLD PERSIAN SIGN JI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103AA,
+ },
+ [0x103AB]={
+ category="lo",
+ description="OLD PERSIAN SIGN TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103AB,
+ },
+ [0x103AC]={
+ category="lo",
+ description="OLD PERSIAN SIGN TU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103AC,
+ },
+ [0x103AD]={
+ category="lo",
+ description="OLD PERSIAN SIGN DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103AD,
+ },
+ [0x103AE]={
+ category="lo",
+ description="OLD PERSIAN SIGN DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103AE,
+ },
+ [0x103AF]={
+ category="lo",
+ description="OLD PERSIAN SIGN DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103AF,
+ },
+ [0x103B0]={
+ category="lo",
+ description="OLD PERSIAN SIGN THA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B0,
+ },
+ [0x103B1]={
+ category="lo",
+ description="OLD PERSIAN SIGN PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B1,
+ },
+ [0x103B2]={
+ category="lo",
+ description="OLD PERSIAN SIGN BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B2,
+ },
+ [0x103B3]={
+ category="lo",
+ description="OLD PERSIAN SIGN FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B3,
+ },
+ [0x103B4]={
+ category="lo",
+ description="OLD PERSIAN SIGN NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B4,
+ },
+ [0x103B5]={
+ category="lo",
+ description="OLD PERSIAN SIGN NU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B5,
+ },
+ [0x103B6]={
+ category="lo",
+ description="OLD PERSIAN SIGN MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B6,
+ },
+ [0x103B7]={
+ category="lo",
+ description="OLD PERSIAN SIGN MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B7,
+ },
+ [0x103B8]={
+ category="lo",
+ description="OLD PERSIAN SIGN MU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B8,
+ },
+ [0x103B9]={
+ category="lo",
+ description="OLD PERSIAN SIGN YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103B9,
+ },
+ [0x103BA]={
+ category="lo",
+ description="OLD PERSIAN SIGN VA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103BA,
+ },
+ [0x103BB]={
+ category="lo",
+ description="OLD PERSIAN SIGN VI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103BB,
+ },
+ [0x103BC]={
+ category="lo",
+ description="OLD PERSIAN SIGN RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103BC,
+ },
+ [0x103BD]={
+ category="lo",
+ description="OLD PERSIAN SIGN RU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103BD,
+ },
+ [0x103BE]={
+ category="lo",
+ description="OLD PERSIAN SIGN LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103BE,
+ },
+ [0x103BF]={
+ category="lo",
+ description="OLD PERSIAN SIGN SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103BF,
+ },
+ [0x103C0]={
+ category="lo",
+ description="OLD PERSIAN SIGN ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103C0,
+ },
+ [0x103C1]={
+ category="lo",
+ description="OLD PERSIAN SIGN SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103C1,
+ },
+ [0x103C2]={
+ category="lo",
+ description="OLD PERSIAN SIGN SSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103C2,
+ },
+ [0x103C3]={
+ category="lo",
+ description="OLD PERSIAN SIGN HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103C3,
+ },
+ [0x103C8]={
+ category="lo",
+ description="OLD PERSIAN SIGN AURAMAZDAA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103C8,
+ },
+ [0x103C9]={
+ category="lo",
+ description="OLD PERSIAN SIGN AURAMAZDAA-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103C9,
+ },
+ [0x103CA]={
+ category="lo",
+ description="OLD PERSIAN SIGN AURAMAZDAAHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103CA,
+ },
+ [0x103CB]={
+ category="lo",
+ description="OLD PERSIAN SIGN XSHAAYATHIYA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103CB,
+ },
+ [0x103CC]={
+ category="lo",
+ description="OLD PERSIAN SIGN DAHYAAUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103CC,
+ },
+ [0x103CD]={
+ category="lo",
+ description="OLD PERSIAN SIGN DAHYAAUSH-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103CD,
+ },
+ [0x103CE]={
+ category="lo",
+ description="OLD PERSIAN SIGN BAGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103CE,
+ },
+ [0x103CF]={
+ category="lo",
+ description="OLD PERSIAN SIGN BUUMISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103CF,
+ },
+ [0x103D0]={
+ category="po",
+ description="OLD PERSIAN WORD DIVIDER",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x103D0,
+ },
+ [0x103D1]={
+ category="nl",
+ description="OLD PERSIAN NUMBER ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103D1,
+ },
+ [0x103D2]={
+ category="nl",
+ description="OLD PERSIAN NUMBER TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103D2,
+ },
+ [0x103D3]={
+ category="nl",
+ description="OLD PERSIAN NUMBER TEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103D3,
+ },
+ [0x103D4]={
+ category="nl",
+ description="OLD PERSIAN NUMBER TWENTY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103D4,
+ },
+ [0x103D5]={
+ category="nl",
+ description="OLD PERSIAN NUMBER HUNDRED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x103D5,
+ },
+ [0x10400]={
+ category="lu",
+ description="DESERET CAPITAL LETTER LONG I",
+ direction="l",
+ lccode=0x10428,
+ linebreak="al",
+ unicodeslot=0x10400,
+ },
+ [0x10401]={
+ category="lu",
+ description="DESERET CAPITAL LETTER LONG E",
+ direction="l",
+ lccode=0x10429,
+ linebreak="al",
+ unicodeslot=0x10401,
+ },
+ [0x10402]={
+ category="lu",
+ description="DESERET CAPITAL LETTER LONG A",
+ direction="l",
+ lccode=0x1042A,
+ linebreak="al",
+ unicodeslot=0x10402,
+ },
+ [0x10403]={
+ category="lu",
+ description="DESERET CAPITAL LETTER LONG AH",
+ direction="l",
+ lccode=0x1042B,
+ linebreak="al",
+ unicodeslot=0x10403,
+ },
+ [0x10404]={
+ category="lu",
+ description="DESERET CAPITAL LETTER LONG O",
+ direction="l",
+ lccode=0x1042C,
+ linebreak="al",
+ unicodeslot=0x10404,
+ },
+ [0x10405]={
+ category="lu",
+ description="DESERET CAPITAL LETTER LONG OO",
+ direction="l",
+ lccode=0x1042D,
+ linebreak="al",
+ unicodeslot=0x10405,
+ },
+ [0x10406]={
+ category="lu",
+ description="DESERET CAPITAL LETTER SHORT I",
+ direction="l",
+ lccode=0x1042E,
+ linebreak="al",
+ unicodeslot=0x10406,
+ },
+ [0x10407]={
+ category="lu",
+ description="DESERET CAPITAL LETTER SHORT E",
+ direction="l",
+ lccode=0x1042F,
+ linebreak="al",
+ unicodeslot=0x10407,
+ },
+ [0x10408]={
+ category="lu",
+ description="DESERET CAPITAL LETTER SHORT A",
+ direction="l",
+ lccode=0x10430,
+ linebreak="al",
+ unicodeslot=0x10408,
+ },
+ [0x10409]={
+ category="lu",
+ description="DESERET CAPITAL LETTER SHORT AH",
+ direction="l",
+ lccode=0x10431,
+ linebreak="al",
+ unicodeslot=0x10409,
+ },
+ [0x1040A]={
+ category="lu",
+ description="DESERET CAPITAL LETTER SHORT O",
+ direction="l",
+ lccode=0x10432,
+ linebreak="al",
+ unicodeslot=0x1040A,
+ },
+ [0x1040B]={
+ category="lu",
+ description="DESERET CAPITAL LETTER SHORT OO",
+ direction="l",
+ lccode=0x10433,
+ linebreak="al",
+ unicodeslot=0x1040B,
+ },
+ [0x1040C]={
+ category="lu",
+ description="DESERET CAPITAL LETTER AY",
+ direction="l",
+ lccode=0x10434,
+ linebreak="al",
+ unicodeslot=0x1040C,
+ },
+ [0x1040D]={
+ category="lu",
+ description="DESERET CAPITAL LETTER OW",
+ direction="l",
+ lccode=0x10435,
+ linebreak="al",
+ unicodeslot=0x1040D,
+ },
+ [0x1040E]={
+ category="lu",
+ description="DESERET CAPITAL LETTER WU",
+ direction="l",
+ lccode=0x10436,
+ linebreak="al",
+ unicodeslot=0x1040E,
+ },
+ [0x1040F]={
+ category="lu",
+ description="DESERET CAPITAL LETTER YEE",
+ direction="l",
+ lccode=0x10437,
+ linebreak="al",
+ unicodeslot=0x1040F,
+ },
+ [0x10410]={
+ category="lu",
+ description="DESERET CAPITAL LETTER H",
+ direction="l",
+ lccode=0x10438,
+ linebreak="al",
+ unicodeslot=0x10410,
+ },
+ [0x10411]={
+ category="lu",
+ description="DESERET CAPITAL LETTER PEE",
+ direction="l",
+ lccode=0x10439,
+ linebreak="al",
+ unicodeslot=0x10411,
+ },
+ [0x10412]={
+ category="lu",
+ description="DESERET CAPITAL LETTER BEE",
+ direction="l",
+ lccode=0x1043A,
+ linebreak="al",
+ unicodeslot=0x10412,
+ },
+ [0x10413]={
+ category="lu",
+ description="DESERET CAPITAL LETTER TEE",
+ direction="l",
+ lccode=0x1043B,
+ linebreak="al",
+ unicodeslot=0x10413,
+ },
+ [0x10414]={
+ category="lu",
+ description="DESERET CAPITAL LETTER DEE",
+ direction="l",
+ lccode=0x1043C,
+ linebreak="al",
+ unicodeslot=0x10414,
+ },
+ [0x10415]={
+ category="lu",
+ description="DESERET CAPITAL LETTER CHEE",
+ direction="l",
+ lccode=0x1043D,
+ linebreak="al",
+ unicodeslot=0x10415,
+ },
+ [0x10416]={
+ category="lu",
+ description="DESERET CAPITAL LETTER JEE",
+ direction="l",
+ lccode=0x1043E,
+ linebreak="al",
+ unicodeslot=0x10416,
+ },
+ [0x10417]={
+ category="lu",
+ description="DESERET CAPITAL LETTER KAY",
+ direction="l",
+ lccode=0x1043F,
+ linebreak="al",
+ unicodeslot=0x10417,
+ },
+ [0x10418]={
+ category="lu",
+ description="DESERET CAPITAL LETTER GAY",
+ direction="l",
+ lccode=0x10440,
+ linebreak="al",
+ unicodeslot=0x10418,
+ },
+ [0x10419]={
+ category="lu",
+ description="DESERET CAPITAL LETTER EF",
+ direction="l",
+ lccode=0x10441,
+ linebreak="al",
+ unicodeslot=0x10419,
+ },
+ [0x1041A]={
+ category="lu",
+ description="DESERET CAPITAL LETTER VEE",
+ direction="l",
+ lccode=0x10442,
+ linebreak="al",
+ unicodeslot=0x1041A,
+ },
+ [0x1041B]={
+ category="lu",
+ description="DESERET CAPITAL LETTER ETH",
+ direction="l",
+ lccode=0x10443,
+ linebreak="al",
+ unicodeslot=0x1041B,
+ },
+ [0x1041C]={
+ category="lu",
+ description="DESERET CAPITAL LETTER THEE",
+ direction="l",
+ lccode=0x10444,
+ linebreak="al",
+ unicodeslot=0x1041C,
+ },
+ [0x1041D]={
+ category="lu",
+ description="DESERET CAPITAL LETTER ES",
+ direction="l",
+ lccode=0x10445,
+ linebreak="al",
+ unicodeslot=0x1041D,
+ },
+ [0x1041E]={
+ category="lu",
+ description="DESERET CAPITAL LETTER ZEE",
+ direction="l",
+ lccode=0x10446,
+ linebreak="al",
+ unicodeslot=0x1041E,
+ },
+ [0x1041F]={
+ category="lu",
+ description="DESERET CAPITAL LETTER ESH",
+ direction="l",
+ lccode=0x10447,
+ linebreak="al",
+ unicodeslot=0x1041F,
+ },
+ [0x10420]={
+ category="lu",
+ description="DESERET CAPITAL LETTER ZHEE",
+ direction="l",
+ lccode=0x10448,
+ linebreak="al",
+ unicodeslot=0x10420,
+ },
+ [0x10421]={
+ category="lu",
+ description="DESERET CAPITAL LETTER ER",
+ direction="l",
+ lccode=0x10449,
+ linebreak="al",
+ unicodeslot=0x10421,
+ },
+ [0x10422]={
+ category="lu",
+ description="DESERET CAPITAL LETTER EL",
+ direction="l",
+ lccode=0x1044A,
+ linebreak="al",
+ unicodeslot=0x10422,
+ },
+ [0x10423]={
+ category="lu",
+ description="DESERET CAPITAL LETTER EM",
+ direction="l",
+ lccode=0x1044B,
+ linebreak="al",
+ unicodeslot=0x10423,
+ },
+ [0x10424]={
+ category="lu",
+ description="DESERET CAPITAL LETTER EN",
+ direction="l",
+ lccode=0x1044C,
+ linebreak="al",
+ unicodeslot=0x10424,
+ },
+ [0x10425]={
+ category="lu",
+ description="DESERET CAPITAL LETTER ENG",
+ direction="l",
+ lccode=0x1044D,
+ linebreak="al",
+ unicodeslot=0x10425,
+ },
+ [0x10426]={
+ category="lu",
+ description="DESERET CAPITAL LETTER OI",
+ direction="l",
+ lccode=0x1044E,
+ linebreak="al",
+ unicodeslot=0x10426,
+ },
+ [0x10427]={
+ category="lu",
+ description="DESERET CAPITAL LETTER EW",
+ direction="l",
+ lccode=0x1044F,
+ linebreak="al",
+ unicodeslot=0x10427,
+ },
+ [0x10428]={
+ category="ll",
+ description="DESERET SMALL LETTER LONG I",
+ direction="l",
+ linebreak="al",
+ uccode=0x10400,
+ unicodeslot=0x10428,
+ },
+ [0x10429]={
+ category="ll",
+ description="DESERET SMALL LETTER LONG E",
+ direction="l",
+ linebreak="al",
+ uccode=0x10401,
+ unicodeslot=0x10429,
+ },
+ [0x1042A]={
+ category="ll",
+ description="DESERET SMALL LETTER LONG A",
+ direction="l",
+ linebreak="al",
+ uccode=0x10402,
+ unicodeslot=0x1042A,
+ },
+ [0x1042B]={
+ category="ll",
+ description="DESERET SMALL LETTER LONG AH",
+ direction="l",
+ linebreak="al",
+ uccode=0x10403,
+ unicodeslot=0x1042B,
+ },
+ [0x1042C]={
+ category="ll",
+ description="DESERET SMALL LETTER LONG O",
+ direction="l",
+ linebreak="al",
+ uccode=0x10404,
+ unicodeslot=0x1042C,
+ },
+ [0x1042D]={
+ category="ll",
+ description="DESERET SMALL LETTER LONG OO",
+ direction="l",
+ linebreak="al",
+ uccode=0x10405,
+ unicodeslot=0x1042D,
+ },
+ [0x1042E]={
+ category="ll",
+ description="DESERET SMALL LETTER SHORT I",
+ direction="l",
+ linebreak="al",
+ uccode=0x10406,
+ unicodeslot=0x1042E,
+ },
+ [0x1042F]={
+ category="ll",
+ description="DESERET SMALL LETTER SHORT E",
+ direction="l",
+ linebreak="al",
+ uccode=0x10407,
+ unicodeslot=0x1042F,
+ },
+ [0x10430]={
+ category="ll",
+ description="DESERET SMALL LETTER SHORT A",
+ direction="l",
+ linebreak="al",
+ uccode=0x10408,
+ unicodeslot=0x10430,
+ },
+ [0x10431]={
+ category="ll",
+ description="DESERET SMALL LETTER SHORT AH",
+ direction="l",
+ linebreak="al",
+ uccode=0x10409,
+ unicodeslot=0x10431,
+ },
+ [0x10432]={
+ category="ll",
+ description="DESERET SMALL LETTER SHORT O",
+ direction="l",
+ linebreak="al",
+ uccode=0x1040A,
+ unicodeslot=0x10432,
+ },
+ [0x10433]={
+ category="ll",
+ description="DESERET SMALL LETTER SHORT OO",
+ direction="l",
+ linebreak="al",
+ uccode=0x1040B,
+ unicodeslot=0x10433,
+ },
+ [0x10434]={
+ category="ll",
+ description="DESERET SMALL LETTER AY",
+ direction="l",
+ linebreak="al",
+ uccode=0x1040C,
+ unicodeslot=0x10434,
+ },
+ [0x10435]={
+ category="ll",
+ description="DESERET SMALL LETTER OW",
+ direction="l",
+ linebreak="al",
+ uccode=0x1040D,
+ unicodeslot=0x10435,
+ },
+ [0x10436]={
+ category="ll",
+ description="DESERET SMALL LETTER WU",
+ direction="l",
+ linebreak="al",
+ uccode=0x1040E,
+ unicodeslot=0x10436,
+ },
+ [0x10437]={
+ category="ll",
+ description="DESERET SMALL LETTER YEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x1040F,
+ unicodeslot=0x10437,
+ },
+ [0x10438]={
+ category="ll",
+ description="DESERET SMALL LETTER H",
+ direction="l",
+ linebreak="al",
+ uccode=0x10410,
+ unicodeslot=0x10438,
+ },
+ [0x10439]={
+ category="ll",
+ description="DESERET SMALL LETTER PEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10411,
+ unicodeslot=0x10439,
+ },
+ [0x1043A]={
+ category="ll",
+ description="DESERET SMALL LETTER BEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10412,
+ unicodeslot=0x1043A,
+ },
+ [0x1043B]={
+ category="ll",
+ description="DESERET SMALL LETTER TEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10413,
+ unicodeslot=0x1043B,
+ },
+ [0x1043C]={
+ category="ll",
+ description="DESERET SMALL LETTER DEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10414,
+ unicodeslot=0x1043C,
+ },
+ [0x1043D]={
+ category="ll",
+ description="DESERET SMALL LETTER CHEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10415,
+ unicodeslot=0x1043D,
+ },
+ [0x1043E]={
+ category="ll",
+ description="DESERET SMALL LETTER JEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10416,
+ unicodeslot=0x1043E,
+ },
+ [0x1043F]={
+ category="ll",
+ description="DESERET SMALL LETTER KAY",
+ direction="l",
+ linebreak="al",
+ uccode=0x10417,
+ unicodeslot=0x1043F,
+ },
+ [0x10440]={
+ category="ll",
+ description="DESERET SMALL LETTER GAY",
+ direction="l",
+ linebreak="al",
+ uccode=0x10418,
+ unicodeslot=0x10440,
+ },
+ [0x10441]={
+ category="ll",
+ description="DESERET SMALL LETTER EF",
+ direction="l",
+ linebreak="al",
+ uccode=0x10419,
+ unicodeslot=0x10441,
+ },
+ [0x10442]={
+ category="ll",
+ description="DESERET SMALL LETTER VEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x1041A,
+ unicodeslot=0x10442,
+ },
+ [0x10443]={
+ category="ll",
+ description="DESERET SMALL LETTER ETH",
+ direction="l",
+ linebreak="al",
+ uccode=0x1041B,
+ unicodeslot=0x10443,
+ },
+ [0x10444]={
+ category="ll",
+ description="DESERET SMALL LETTER THEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x1041C,
+ unicodeslot=0x10444,
+ },
+ [0x10445]={
+ category="ll",
+ description="DESERET SMALL LETTER ES",
+ direction="l",
+ linebreak="al",
+ uccode=0x1041D,
+ unicodeslot=0x10445,
+ },
+ [0x10446]={
+ category="ll",
+ description="DESERET SMALL LETTER ZEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x1041E,
+ unicodeslot=0x10446,
+ },
+ [0x10447]={
+ category="ll",
+ description="DESERET SMALL LETTER ESH",
+ direction="l",
+ linebreak="al",
+ uccode=0x1041F,
+ unicodeslot=0x10447,
+ },
+ [0x10448]={
+ category="ll",
+ description="DESERET SMALL LETTER ZHEE",
+ direction="l",
+ linebreak="al",
+ uccode=0x10420,
+ unicodeslot=0x10448,
+ },
+ [0x10449]={
+ category="ll",
+ description="DESERET SMALL LETTER ER",
+ direction="l",
+ linebreak="al",
+ uccode=0x10421,
+ unicodeslot=0x10449,
+ },
+ [0x1044A]={
+ category="ll",
+ description="DESERET SMALL LETTER EL",
+ direction="l",
+ linebreak="al",
+ uccode=0x10422,
+ unicodeslot=0x1044A,
+ },
+ [0x1044B]={
+ category="ll",
+ description="DESERET SMALL LETTER EM",
+ direction="l",
+ linebreak="al",
+ uccode=0x10423,
+ unicodeslot=0x1044B,
+ },
+ [0x1044C]={
+ category="ll",
+ description="DESERET SMALL LETTER EN",
+ direction="l",
+ linebreak="al",
+ uccode=0x10424,
+ unicodeslot=0x1044C,
+ },
+ [0x1044D]={
+ category="ll",
+ description="DESERET SMALL LETTER ENG",
+ direction="l",
+ linebreak="al",
+ uccode=0x10425,
+ unicodeslot=0x1044D,
+ },
+ [0x1044E]={
+ category="ll",
+ description="DESERET SMALL LETTER OI",
+ direction="l",
+ linebreak="al",
+ uccode=0x10426,
+ unicodeslot=0x1044E,
+ },
+ [0x1044F]={
+ category="ll",
+ description="DESERET SMALL LETTER EW",
+ direction="l",
+ linebreak="al",
+ uccode=0x10427,
+ unicodeslot=0x1044F,
+ },
+ [0x10450]={
+ category="lo",
+ description="SHAVIAN LETTER PEEP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10450,
+ },
+ [0x10451]={
+ category="lo",
+ description="SHAVIAN LETTER TOT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10451,
+ },
+ [0x10452]={
+ category="lo",
+ description="SHAVIAN LETTER KICK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10452,
+ },
+ [0x10453]={
+ category="lo",
+ description="SHAVIAN LETTER FEE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10453,
+ },
+ [0x10454]={
+ category="lo",
+ description="SHAVIAN LETTER THIGH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10454,
+ },
+ [0x10455]={
+ category="lo",
+ description="SHAVIAN LETTER SO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10455,
+ },
+ [0x10456]={
+ category="lo",
+ description="SHAVIAN LETTER SURE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10456,
+ },
+ [0x10457]={
+ category="lo",
+ description="SHAVIAN LETTER CHURCH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10457,
+ },
+ [0x10458]={
+ category="lo",
+ description="SHAVIAN LETTER YEA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10458,
+ },
+ [0x10459]={
+ category="lo",
+ description="SHAVIAN LETTER HUNG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10459,
+ },
+ [0x1045A]={
+ category="lo",
+ description="SHAVIAN LETTER BIB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1045A,
+ },
+ [0x1045B]={
+ category="lo",
+ description="SHAVIAN LETTER DEAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1045B,
+ },
+ [0x1045C]={
+ category="lo",
+ description="SHAVIAN LETTER GAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1045C,
+ },
+ [0x1045D]={
+ category="lo",
+ description="SHAVIAN LETTER VOW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1045D,
+ },
+ [0x1045E]={
+ category="lo",
+ description="SHAVIAN LETTER THEY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1045E,
+ },
+ [0x1045F]={
+ category="lo",
+ description="SHAVIAN LETTER ZOO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1045F,
+ },
+ [0x10460]={
+ category="lo",
+ description="SHAVIAN LETTER MEASURE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10460,
+ },
+ [0x10461]={
+ category="lo",
+ description="SHAVIAN LETTER JUDGE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10461,
+ },
+ [0x10462]={
+ category="lo",
+ description="SHAVIAN LETTER WOE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10462,
+ },
+ [0x10463]={
+ category="lo",
+ description="SHAVIAN LETTER HA-HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10463,
+ },
+ [0x10464]={
+ category="lo",
+ description="SHAVIAN LETTER LOLL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10464,
+ },
+ [0x10465]={
+ category="lo",
+ description="SHAVIAN LETTER MIME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10465,
+ },
+ [0x10466]={
+ category="lo",
+ description="SHAVIAN LETTER IF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10466,
+ },
+ [0x10467]={
+ category="lo",
+ description="SHAVIAN LETTER EGG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10467,
+ },
+ [0x10468]={
+ category="lo",
+ description="SHAVIAN LETTER ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10468,
+ },
+ [0x10469]={
+ category="lo",
+ description="SHAVIAN LETTER ADO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10469,
+ },
+ [0x1046A]={
+ category="lo",
+ description="SHAVIAN LETTER ON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1046A,
+ },
+ [0x1046B]={
+ category="lo",
+ description="SHAVIAN LETTER WOOL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1046B,
+ },
+ [0x1046C]={
+ category="lo",
+ description="SHAVIAN LETTER OUT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1046C,
+ },
+ [0x1046D]={
+ category="lo",
+ description="SHAVIAN LETTER AH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1046D,
+ },
+ [0x1046E]={
+ category="lo",
+ description="SHAVIAN LETTER ROAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1046E,
+ },
+ [0x1046F]={
+ category="lo",
+ description="SHAVIAN LETTER NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1046F,
+ },
+ [0x10470]={
+ category="lo",
+ description="SHAVIAN LETTER EAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10470,
+ },
+ [0x10471]={
+ category="lo",
+ description="SHAVIAN LETTER AGE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10471,
+ },
+ [0x10472]={
+ category="lo",
+ description="SHAVIAN LETTER ICE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10472,
+ },
+ [0x10473]={
+ category="lo",
+ description="SHAVIAN LETTER UP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10473,
+ },
+ [0x10474]={
+ category="lo",
+ description="SHAVIAN LETTER OAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10474,
+ },
+ [0x10475]={
+ category="lo",
+ description="SHAVIAN LETTER OOZE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10475,
+ },
+ [0x10476]={
+ category="lo",
+ description="SHAVIAN LETTER OIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10476,
+ },
+ [0x10477]={
+ category="lo",
+ description="SHAVIAN LETTER AWE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10477,
+ },
+ [0x10478]={
+ category="lo",
+ description="SHAVIAN LETTER ARE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10478,
+ },
+ [0x10479]={
+ category="lo",
+ description="SHAVIAN LETTER OR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10479,
+ },
+ [0x1047A]={
+ category="lo",
+ description="SHAVIAN LETTER AIR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1047A,
+ },
+ [0x1047B]={
+ category="lo",
+ description="SHAVIAN LETTER ERR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1047B,
+ },
+ [0x1047C]={
+ category="lo",
+ description="SHAVIAN LETTER ARRAY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1047C,
+ },
+ [0x1047D]={
+ category="lo",
+ description="SHAVIAN LETTER EAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1047D,
+ },
+ [0x1047E]={
+ category="lo",
+ description="SHAVIAN LETTER IAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1047E,
+ },
+ [0x1047F]={
+ category="lo",
+ description="SHAVIAN LETTER YEW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1047F,
+ },
+ [0x10480]={
+ category="lo",
+ description="OSMANYA LETTER ALEF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10480,
+ },
+ [0x10481]={
+ category="lo",
+ description="OSMANYA LETTER BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10481,
+ },
+ [0x10482]={
+ category="lo",
+ description="OSMANYA LETTER TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10482,
+ },
+ [0x10483]={
+ category="lo",
+ description="OSMANYA LETTER JA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10483,
+ },
+ [0x10484]={
+ category="lo",
+ description="OSMANYA LETTER XA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10484,
+ },
+ [0x10485]={
+ category="lo",
+ description="OSMANYA LETTER KHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10485,
+ },
+ [0x10486]={
+ category="lo",
+ description="OSMANYA LETTER DEEL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10486,
+ },
+ [0x10487]={
+ category="lo",
+ description="OSMANYA LETTER RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10487,
+ },
+ [0x10488]={
+ category="lo",
+ description="OSMANYA LETTER SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10488,
+ },
+ [0x10489]={
+ category="lo",
+ description="OSMANYA LETTER SHIIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10489,
+ },
+ [0x1048A]={
+ category="lo",
+ description="OSMANYA LETTER DHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1048A,
+ },
+ [0x1048B]={
+ category="lo",
+ description="OSMANYA LETTER CAYN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1048B,
+ },
+ [0x1048C]={
+ category="lo",
+ description="OSMANYA LETTER GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1048C,
+ },
+ [0x1048D]={
+ category="lo",
+ description="OSMANYA LETTER FA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1048D,
+ },
+ [0x1048E]={
+ category="lo",
+ description="OSMANYA LETTER QAAF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1048E,
+ },
+ [0x1048F]={
+ category="lo",
+ description="OSMANYA LETTER KAAF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1048F,
+ },
+ [0x10490]={
+ category="lo",
+ description="OSMANYA LETTER LAAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10490,
+ },
+ [0x10491]={
+ category="lo",
+ description="OSMANYA LETTER MIIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10491,
+ },
+ [0x10492]={
+ category="lo",
+ description="OSMANYA LETTER NUUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10492,
+ },
+ [0x10493]={
+ category="lo",
+ description="OSMANYA LETTER WAW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10493,
+ },
+ [0x10494]={
+ category="lo",
+ description="OSMANYA LETTER HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10494,
+ },
+ [0x10495]={
+ category="lo",
+ description="OSMANYA LETTER YA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10495,
+ },
+ [0x10496]={
+ category="lo",
+ description="OSMANYA LETTER A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10496,
+ },
+ [0x10497]={
+ category="lo",
+ description="OSMANYA LETTER E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10497,
+ },
+ [0x10498]={
+ category="lo",
+ description="OSMANYA LETTER I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10498,
+ },
+ [0x10499]={
+ category="lo",
+ description="OSMANYA LETTER O",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x10499,
+ },
+ [0x1049A]={
+ category="lo",
+ description="OSMANYA LETTER U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1049A,
+ },
+ [0x1049B]={
+ category="lo",
+ description="OSMANYA LETTER AA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1049B,
+ },
+ [0x1049C]={
+ category="lo",
+ description="OSMANYA LETTER EE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1049C,
+ },
+ [0x1049D]={
+ category="lo",
+ description="OSMANYA LETTER OO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1049D,
+ },
+ [0x104A0]={
+ category="nd",
+ description="OSMANYA DIGIT ZERO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A0,
+ },
+ [0x104A1]={
+ category="nd",
+ description="OSMANYA DIGIT ONE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A1,
+ },
+ [0x104A2]={
+ category="nd",
+ description="OSMANYA DIGIT TWO",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A2,
+ },
+ [0x104A3]={
+ category="nd",
+ description="OSMANYA DIGIT THREE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A3,
+ },
+ [0x104A4]={
+ category="nd",
+ description="OSMANYA DIGIT FOUR",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A4,
+ },
+ [0x104A5]={
+ category="nd",
+ description="OSMANYA DIGIT FIVE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A5,
+ },
+ [0x104A6]={
+ category="nd",
+ description="OSMANYA DIGIT SIX",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A6,
+ },
+ [0x104A7]={
+ category="nd",
+ description="OSMANYA DIGIT SEVEN",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A7,
+ },
+ [0x104A8]={
+ category="nd",
+ description="OSMANYA DIGIT EIGHT",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A8,
+ },
+ [0x104A9]={
+ category="nd",
+ description="OSMANYA DIGIT NINE",
+ direction="l",
+ linebreak="nu",
+ unicodeslot=0x104A9,
+ },
+ [0x10800]={
+ category="lo",
+ description="CYPRIOT SYLLABLE A",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10800,
+ },
+ [0x10801]={
+ category="lo",
+ description="CYPRIOT SYLLABLE E",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10801,
+ },
+ [0x10802]={
+ category="lo",
+ description="CYPRIOT SYLLABLE I",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10802,
+ },
+ [0x10803]={
+ category="lo",
+ description="CYPRIOT SYLLABLE O",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10803,
+ },
+ [0x10804]={
+ category="lo",
+ description="CYPRIOT SYLLABLE U",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10804,
+ },
+ [0x10805]={
+ category="lo",
+ description="CYPRIOT SYLLABLE JA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10805,
+ },
+ [0x10808]={
+ category="lo",
+ description="CYPRIOT SYLLABLE JO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10808,
+ },
+ [0x1080A]={
+ category="lo",
+ description="CYPRIOT SYLLABLE KA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1080A,
+ },
+ [0x1080B]={
+ category="lo",
+ description="CYPRIOT SYLLABLE KE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1080B,
+ },
+ [0x1080C]={
+ category="lo",
+ description="CYPRIOT SYLLABLE KI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1080C,
+ },
+ [0x1080D]={
+ category="lo",
+ description="CYPRIOT SYLLABLE KO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1080D,
+ },
+ [0x1080E]={
+ category="lo",
+ description="CYPRIOT SYLLABLE KU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1080E,
+ },
+ [0x1080F]={
+ category="lo",
+ description="CYPRIOT SYLLABLE LA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1080F,
+ },
+ [0x10810]={
+ category="lo",
+ description="CYPRIOT SYLLABLE LE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10810,
+ },
+ [0x10811]={
+ category="lo",
+ description="CYPRIOT SYLLABLE LI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10811,
+ },
+ [0x10812]={
+ category="lo",
+ description="CYPRIOT SYLLABLE LO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10812,
+ },
+ [0x10813]={
+ category="lo",
+ description="CYPRIOT SYLLABLE LU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10813,
+ },
+ [0x10814]={
+ category="lo",
+ description="CYPRIOT SYLLABLE MA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10814,
+ },
+ [0x10815]={
+ category="lo",
+ description="CYPRIOT SYLLABLE ME",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10815,
+ },
+ [0x10816]={
+ category="lo",
+ description="CYPRIOT SYLLABLE MI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10816,
+ },
+ [0x10817]={
+ category="lo",
+ description="CYPRIOT SYLLABLE MO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10817,
+ },
+ [0x10818]={
+ category="lo",
+ description="CYPRIOT SYLLABLE MU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10818,
+ },
+ [0x10819]={
+ category="lo",
+ description="CYPRIOT SYLLABLE NA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10819,
+ },
+ [0x1081A]={
+ category="lo",
+ description="CYPRIOT SYLLABLE NE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1081A,
+ },
+ [0x1081B]={
+ category="lo",
+ description="CYPRIOT SYLLABLE NI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1081B,
+ },
+ [0x1081C]={
+ category="lo",
+ description="CYPRIOT SYLLABLE NO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1081C,
+ },
+ [0x1081D]={
+ category="lo",
+ description="CYPRIOT SYLLABLE NU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1081D,
+ },
+ [0x1081E]={
+ category="lo",
+ description="CYPRIOT SYLLABLE PA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1081E,
+ },
+ [0x1081F]={
+ category="lo",
+ description="CYPRIOT SYLLABLE PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1081F,
+ },
+ [0x10820]={
+ category="lo",
+ description="CYPRIOT SYLLABLE PI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10820,
+ },
+ [0x10821]={
+ category="lo",
+ description="CYPRIOT SYLLABLE PO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10821,
+ },
+ [0x10822]={
+ category="lo",
+ description="CYPRIOT SYLLABLE PU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10822,
+ },
+ [0x10823]={
+ category="lo",
+ description="CYPRIOT SYLLABLE RA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10823,
+ },
+ [0x10824]={
+ category="lo",
+ description="CYPRIOT SYLLABLE RE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10824,
+ },
+ [0x10825]={
+ category="lo",
+ description="CYPRIOT SYLLABLE RI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10825,
+ },
+ [0x10826]={
+ category="lo",
+ description="CYPRIOT SYLLABLE RO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10826,
+ },
+ [0x10827]={
+ category="lo",
+ description="CYPRIOT SYLLABLE RU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10827,
+ },
+ [0x10828]={
+ category="lo",
+ description="CYPRIOT SYLLABLE SA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10828,
+ },
+ [0x10829]={
+ category="lo",
+ description="CYPRIOT SYLLABLE SE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10829,
+ },
+ [0x1082A]={
+ category="lo",
+ description="CYPRIOT SYLLABLE SI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1082A,
+ },
+ [0x1082B]={
+ category="lo",
+ description="CYPRIOT SYLLABLE SO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1082B,
+ },
+ [0x1082C]={
+ category="lo",
+ description="CYPRIOT SYLLABLE SU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1082C,
+ },
+ [0x1082D]={
+ category="lo",
+ description="CYPRIOT SYLLABLE TA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1082D,
+ },
+ [0x1082E]={
+ category="lo",
+ description="CYPRIOT SYLLABLE TE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1082E,
+ },
+ [0x1082F]={
+ category="lo",
+ description="CYPRIOT SYLLABLE TI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1082F,
+ },
+ [0x10830]={
+ category="lo",
+ description="CYPRIOT SYLLABLE TO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10830,
+ },
+ [0x10831]={
+ category="lo",
+ description="CYPRIOT SYLLABLE TU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10831,
+ },
+ [0x10832]={
+ category="lo",
+ description="CYPRIOT SYLLABLE WA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10832,
+ },
+ [0x10833]={
+ category="lo",
+ description="CYPRIOT SYLLABLE WE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10833,
+ },
+ [0x10834]={
+ category="lo",
+ description="CYPRIOT SYLLABLE WI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10834,
+ },
+ [0x10835]={
+ category="lo",
+ description="CYPRIOT SYLLABLE WO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10835,
+ },
+ [0x10837]={
+ category="lo",
+ description="CYPRIOT SYLLABLE XA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10837,
+ },
+ [0x10838]={
+ category="lo",
+ description="CYPRIOT SYLLABLE XE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10838,
+ },
+ [0x1083C]={
+ category="lo",
+ description="CYPRIOT SYLLABLE ZA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1083C,
+ },
+ [0x1083F]={
+ category="lo",
+ description="CYPRIOT SYLLABLE ZO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1083F,
+ },
+ [0x10900]={
+ category="lo",
+ description="PHOENICIAN LETTER ALF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10900,
+ },
+ [0x10901]={
+ category="lo",
+ description="PHOENICIAN LETTER BET",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10901,
+ },
+ [0x10902]={
+ category="lo",
+ description="PHOENICIAN LETTER GAML",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10902,
+ },
+ [0x10903]={
+ category="lo",
+ description="PHOENICIAN LETTER DELT",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10903,
+ },
+ [0x10904]={
+ category="lo",
+ description="PHOENICIAN LETTER HE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10904,
+ },
+ [0x10905]={
+ category="lo",
+ description="PHOENICIAN LETTER WAU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10905,
+ },
+ [0x10906]={
+ category="lo",
+ description="PHOENICIAN LETTER ZAI",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10906,
+ },
+ [0x10907]={
+ category="lo",
+ description="PHOENICIAN LETTER HET",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10907,
+ },
+ [0x10908]={
+ category="lo",
+ description="PHOENICIAN LETTER TET",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10908,
+ },
+ [0x10909]={
+ category="lo",
+ description="PHOENICIAN LETTER YOD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10909,
+ },
+ [0x1090A]={
+ category="lo",
+ description="PHOENICIAN LETTER KAF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1090A,
+ },
+ [0x1090B]={
+ category="lo",
+ description="PHOENICIAN LETTER LAMD",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1090B,
+ },
+ [0x1090C]={
+ category="lo",
+ description="PHOENICIAN LETTER MEM",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1090C,
+ },
+ [0x1090D]={
+ category="lo",
+ description="PHOENICIAN LETTER NUN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1090D,
+ },
+ [0x1090E]={
+ category="lo",
+ description="PHOENICIAN LETTER SEMK",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1090E,
+ },
+ [0x1090F]={
+ category="lo",
+ description="PHOENICIAN LETTER AIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x1090F,
+ },
+ [0x10910]={
+ category="lo",
+ description="PHOENICIAN LETTER PE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10910,
+ },
+ [0x10911]={
+ category="lo",
+ description="PHOENICIAN LETTER SADE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10911,
+ },
+ [0x10912]={
+ category="lo",
+ description="PHOENICIAN LETTER QOF",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10912,
+ },
+ [0x10913]={
+ category="lo",
+ description="PHOENICIAN LETTER ROSH",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10913,
+ },
+ [0x10914]={
+ category="lo",
+ description="PHOENICIAN LETTER SHIN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10914,
+ },
+ [0x10915]={
+ category="lo",
+ description="PHOENICIAN LETTER TAU",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10915,
+ },
+ [0x10916]={
+ category="no",
+ description="PHOENICIAN NUMBER ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10916,
+ },
+ [0x10917]={
+ category="no",
+ description="PHOENICIAN NUMBER TEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10917,
+ },
+ [0x10918]={
+ category="no",
+ description="PHOENICIAN NUMBER TWENTY",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10918,
+ },
+ [0x10919]={
+ category="no",
+ description="PHOENICIAN NUMBER ONE HUNDRED",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10919,
+ },
+ [0x1091F]={
+ category="po",
+ description="PHOENICIAN WORD SEPARATOR",
+ direction="on",
+ linebreak="ba",
+ unicodeslot=0x1091F,
+ },
+ [0x10A00]={
+ category="lo",
+ description="KHAROSHTHI LETTER A",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A00,
+ },
+ [0x10A01]={
+ category="mn",
+ description="KHAROSHTHI VOWEL SIGN I",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A01,
+ },
+ [0x10A02]={
+ category="mn",
+ description="KHAROSHTHI VOWEL SIGN U",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A02,
+ },
+ [0x10A03]={
+ category="mn",
+ description="KHAROSHTHI VOWEL SIGN VOCALIC R",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A03,
+ },
+ [0x10A05]={
+ category="mn",
+ description="KHAROSHTHI VOWEL SIGN E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A05,
+ },
+ [0x10A06]={
+ category="mn",
+ description="KHAROSHTHI VOWEL SIGN O",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A06,
+ },
+ [0x10A0C]={
+ category="mn",
+ description="KHAROSHTHI VOWEL LENGTH MARK",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A0C,
+ },
+ [0x10A0D]={
+ category="mn",
+ description="KHAROSHTHI SIGN DOUBLE RING BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A0D,
+ },
+ [0x10A0E]={
+ category="mn",
+ description="KHAROSHTHI SIGN ANUSVARA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A0E,
+ },
+ [0x10A0F]={
+ category="mn",
+ description="KHAROSHTHI SIGN VISARGA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A0F,
+ },
+ [0x10A10]={
+ category="lo",
+ description="KHAROSHTHI LETTER KA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A10,
+ },
+ [0x10A11]={
+ category="lo",
+ description="KHAROSHTHI LETTER KHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A11,
+ },
+ [0x10A12]={
+ category="lo",
+ description="KHAROSHTHI LETTER GA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A12,
+ },
+ [0x10A13]={
+ category="lo",
+ description="KHAROSHTHI LETTER GHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A13,
+ },
+ [0x10A15]={
+ category="lo",
+ description="KHAROSHTHI LETTER CA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A15,
+ },
+ [0x10A16]={
+ category="lo",
+ description="KHAROSHTHI LETTER CHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A16,
+ },
+ [0x10A17]={
+ category="lo",
+ description="KHAROSHTHI LETTER JA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A17,
+ },
+ [0x10A19]={
+ category="lo",
+ description="KHAROSHTHI LETTER NYA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A19,
+ },
+ [0x10A1A]={
+ category="lo",
+ description="KHAROSHTHI LETTER TTA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A1A,
+ },
+ [0x10A1B]={
+ category="lo",
+ description="KHAROSHTHI LETTER TTHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A1B,
+ },
+ [0x10A1C]={
+ category="lo",
+ description="KHAROSHTHI LETTER DDA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A1C,
+ },
+ [0x10A1D]={
+ category="lo",
+ description="KHAROSHTHI LETTER DDHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A1D,
+ },
+ [0x10A1E]={
+ category="lo",
+ description="KHAROSHTHI LETTER NNA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A1E,
+ },
+ [0x10A1F]={
+ category="lo",
+ description="KHAROSHTHI LETTER TA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A1F,
+ },
+ [0x10A20]={
+ category="lo",
+ description="KHAROSHTHI LETTER THA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A20,
+ },
+ [0x10A21]={
+ category="lo",
+ description="KHAROSHTHI LETTER DA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A21,
+ },
+ [0x10A22]={
+ category="lo",
+ description="KHAROSHTHI LETTER DHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A22,
+ },
+ [0x10A23]={
+ category="lo",
+ description="KHAROSHTHI LETTER NA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A23,
+ },
+ [0x10A24]={
+ category="lo",
+ description="KHAROSHTHI LETTER PA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A24,
+ },
+ [0x10A25]={
+ category="lo",
+ description="KHAROSHTHI LETTER PHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A25,
+ },
+ [0x10A26]={
+ category="lo",
+ description="KHAROSHTHI LETTER BA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A26,
+ },
+ [0x10A27]={
+ category="lo",
+ description="KHAROSHTHI LETTER BHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A27,
+ },
+ [0x10A28]={
+ category="lo",
+ description="KHAROSHTHI LETTER MA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A28,
+ },
+ [0x10A29]={
+ category="lo",
+ description="KHAROSHTHI LETTER YA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A29,
+ },
+ [0x10A2A]={
+ category="lo",
+ description="KHAROSHTHI LETTER RA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A2A,
+ },
+ [0x10A2B]={
+ category="lo",
+ description="KHAROSHTHI LETTER LA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A2B,
+ },
+ [0x10A2C]={
+ category="lo",
+ description="KHAROSHTHI LETTER VA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A2C,
+ },
+ [0x10A2D]={
+ category="lo",
+ description="KHAROSHTHI LETTER SHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A2D,
+ },
+ [0x10A2E]={
+ category="lo",
+ description="KHAROSHTHI LETTER SSA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A2E,
+ },
+ [0x10A2F]={
+ category="lo",
+ description="KHAROSHTHI LETTER SA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A2F,
+ },
+ [0x10A30]={
+ category="lo",
+ description="KHAROSHTHI LETTER ZA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A30,
+ },
+ [0x10A31]={
+ category="lo",
+ description="KHAROSHTHI LETTER HA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A31,
+ },
+ [0x10A32]={
+ category="lo",
+ description="KHAROSHTHI LETTER KKA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A32,
+ },
+ [0x10A33]={
+ category="lo",
+ description="KHAROSHTHI LETTER TTTHA",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A33,
+ },
+ [0x10A38]={
+ category="mn",
+ description="KHAROSHTHI SIGN BAR ABOVE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A38,
+ },
+ [0x10A39]={
+ category="mn",
+ description="KHAROSHTHI SIGN CAUDA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A39,
+ },
+ [0x10A3A]={
+ category="mn",
+ description="KHAROSHTHI SIGN DOT BELOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A3A,
+ },
+ [0x10A3F]={
+ category="mn",
+ description="KHAROSHTHI VIRAMA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x10A3F,
+ },
+ [0x10A40]={
+ category="no",
+ description="KHAROSHTHI DIGIT ONE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A40,
+ },
+ [0x10A41]={
+ category="no",
+ description="KHAROSHTHI DIGIT TWO",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A41,
+ },
+ [0x10A42]={
+ category="no",
+ description="KHAROSHTHI DIGIT THREE",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A42,
+ },
+ [0x10A43]={
+ category="no",
+ description="KHAROSHTHI DIGIT FOUR",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A43,
+ },
+ [0x10A44]={
+ category="no",
+ description="KHAROSHTHI NUMBER TEN",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A44,
+ },
+ [0x10A45]={
+ category="no",
+ description="KHAROSHTHI NUMBER TWENTY",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A45,
+ },
+ [0x10A46]={
+ category="no",
+ description="KHAROSHTHI NUMBER ONE HUNDRED",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A46,
+ },
+ [0x10A47]={
+ category="no",
+ description="KHAROSHTHI NUMBER ONE THOUSAND",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A47,
+ },
+ [0x10A50]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION DOT",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A50,
+ },
+ [0x10A51]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION SMALL CIRCLE",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A51,
+ },
+ [0x10A52]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION CIRCLE",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A52,
+ },
+ [0x10A53]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION CRESCENT BAR",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A53,
+ },
+ [0x10A54]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION MANGALAM",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A54,
+ },
+ [0x10A55]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION LOTUS",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A55,
+ },
+ [0x10A56]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION DANDA",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A56,
+ },
+ [0x10A57]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION DOUBLE DANDA",
+ direction="r",
+ linebreak="ba",
+ unicodeslot=0x10A57,
+ },
+ [0x10A58]={
+ category="po",
+ description="KHAROSHTHI PUNCTUATION LINES",
+ direction="r",
+ linebreak="al",
+ unicodeslot=0x10A58,
+ },
+ [0x12000]={
+ category="lo",
+ description="CUNEIFORM SIGN A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12000,
+ },
+ [0x12001]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12001,
+ },
+ [0x12002]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12002,
+ },
+ [0x12003]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12003,
+ },
+ [0x12004]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12004,
+ },
+ [0x12005]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12005,
+ },
+ [0x12006]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES LAGAR GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12006,
+ },
+ [0x12007]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES MUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12007,
+ },
+ [0x12008]={
+ category="lo",
+ description="CUNEIFORM SIGN A TIMES SAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12008,
+ },
+ [0x12009]={
+ category="lo",
+ description="CUNEIFORM SIGN A0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12009,
+ },
+ [0x1200A]={
+ category="lo",
+ description="CUNEIFORM SIGN AB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1200A,
+ },
+ [0x1200B]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES ASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1200B,
+ },
+ [0x1200C]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES DUN0x0003 GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1200C,
+ },
+ [0x1200D]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES GAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1200D,
+ },
+ [0x1200E]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1200E,
+ },
+ [0x1200F]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1200F,
+ },
+ [0x12010]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12010,
+ },
+ [0x12011]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES IMIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12011,
+ },
+ [0x12012]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES LAGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12012,
+ },
+ [0x12013]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES SHESH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12013,
+ },
+ [0x12014]={
+ category="lo",
+ description="CUNEIFORM SIGN AB TIMES U PLUS U PLUS U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12014,
+ },
+ [0x12015]={
+ category="lo",
+ description="CUNEIFORM SIGN AB GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12015,
+ },
+ [0x12016]={
+ category="lo",
+ description="CUNEIFORM SIGN AB0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12016,
+ },
+ [0x12017]={
+ category="lo",
+ description="CUNEIFORM SIGN AB0x0002 TIMES BALAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12017,
+ },
+ [0x12018]={
+ category="lo",
+ description="CUNEIFORM SIGN AB0x0002 TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12018,
+ },
+ [0x12019]={
+ category="lo",
+ description="CUNEIFORM SIGN AB0x0002 TIMES ME PLUS EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12019,
+ },
+ [0x1201A]={
+ category="lo",
+ description="CUNEIFORM SIGN AB0x0002 TIMES SHA0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1201A,
+ },
+ [0x1201B]={
+ category="lo",
+ description="CUNEIFORM SIGN AB0x0002 TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1201B,
+ },
+ [0x1201C]={
+ category="lo",
+ description="CUNEIFORM SIGN AD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1201C,
+ },
+ [0x1201D]={
+ category="lo",
+ description="CUNEIFORM SIGN AK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1201D,
+ },
+ [0x1201E]={
+ category="lo",
+ description="CUNEIFORM SIGN AK TIMES ERIN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1201E,
+ },
+ [0x1201F]={
+ category="lo",
+ description="CUNEIFORM SIGN AK TIMES SHITA PLUS GISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1201F,
+ },
+ [0x12020]={
+ category="lo",
+ description="CUNEIFORM SIGN AL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12020,
+ },
+ [0x12021]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES AL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12021,
+ },
+ [0x12022]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES DIM0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12022,
+ },
+ [0x12023]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES GISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12023,
+ },
+ [0x12024]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12024,
+ },
+ [0x12025]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES KAD0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12025,
+ },
+ [0x12026]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12026,
+ },
+ [0x12027]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12027,
+ },
+ [0x12028]={
+ category="lo",
+ description="CUNEIFORM SIGN AL TIMES USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12028,
+ },
+ [0x12029]={
+ category="lo",
+ description="CUNEIFORM SIGN ALAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12029,
+ },
+ [0x1202A]={
+ category="lo",
+ description="CUNEIFORM SIGN ALEPH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1202A,
+ },
+ [0x1202B]={
+ category="lo",
+ description="CUNEIFORM SIGN AMAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1202B,
+ },
+ [0x1202C]={
+ category="lo",
+ description="CUNEIFORM SIGN AMAR TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1202C,
+ },
+ [0x1202D]={
+ category="lo",
+ description="CUNEIFORM SIGN AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1202D,
+ },
+ [0x1202E]={
+ category="lo",
+ description="CUNEIFORM SIGN AN OVER AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1202E,
+ },
+ [0x1202F]={
+ category="lo",
+ description="CUNEIFORM SIGN AN THREE TIMES",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1202F,
+ },
+ [0x12030]={
+ category="lo",
+ description="CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12030,
+ },
+ [0x12031]={
+ category="lo",
+ description="CUNEIFORM SIGN AN PLUS NAGA SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12031,
+ },
+ [0x12032]={
+ category="lo",
+ description="CUNEIFORM SIGN ANSHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12032,
+ },
+ [0x12033]={
+ category="lo",
+ description="CUNEIFORM SIGN APIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12033,
+ },
+ [0x12034]={
+ category="lo",
+ description="CUNEIFORM SIGN ARAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12034,
+ },
+ [0x12035]={
+ category="lo",
+ description="CUNEIFORM SIGN ARAD TIMES KUR",
+ direction="l",
+ linebreak="al",
+ mathclass="ord",
+ mathname="backprime",
+ unicodeslot=0x12035,
+ },
+ [0x12036]={
+ category="lo",
+ description="CUNEIFORM SIGN ARKAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12036,
+ },
+ [0x12037]={
+ category="lo",
+ description="CUNEIFORM SIGN ASAL0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12037,
+ },
+ [0x12038]={
+ category="lo",
+ description="CUNEIFORM SIGN ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12038,
+ },
+ [0x12039]={
+ category="lo",
+ description="CUNEIFORM SIGN ASH ZIDA TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12039,
+ },
+ [0x1203A]={
+ category="lo",
+ description="CUNEIFORM SIGN ASH KABA TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1203A,
+ },
+ [0x1203B]={
+ category="lo",
+ description="CUNEIFORM SIGN ASH OVER ASH TUG0x0002 OVER TUG0x0002 TUG0x0002 OVER TUG0x0002 PAP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1203B,
+ },
+ [0x1203C]={
+ category="lo",
+ description="CUNEIFORM SIGN ASH OVER ASH OVER ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1203C,
+ },
+ [0x1203D]={
+ category="lo",
+ description="CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1203D,
+ },
+ [0x1203E]={
+ category="lo",
+ description="CUNEIFORM SIGN ASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1203E,
+ },
+ [0x1203F]={
+ category="lo",
+ description="CUNEIFORM SIGN ASHGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1203F,
+ },
+ [0x12040]={
+ category="lo",
+ description="CUNEIFORM SIGN BA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12040,
+ },
+ [0x12041]={
+ category="lo",
+ description="CUNEIFORM SIGN BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12041,
+ },
+ [0x12042]={
+ category="lo",
+ description="CUNEIFORM SIGN BAG0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12042,
+ },
+ [0x12043]={
+ category="lo",
+ description="CUNEIFORM SIGN BAHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12043,
+ },
+ [0x12044]={
+ category="lo",
+ description="CUNEIFORM SIGN BAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12044,
+ },
+ [0x12045]={
+ category="lo",
+ description="CUNEIFORM SIGN BAL OVER BAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12045,
+ },
+ [0x12046]={
+ category="lo",
+ description="CUNEIFORM SIGN BALAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12046,
+ },
+ [0x12047]={
+ category="lo",
+ description="CUNEIFORM SIGN BAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12047,
+ },
+ [0x12048]={
+ category="lo",
+ description="CUNEIFORM SIGN BARA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12048,
+ },
+ [0x12049]={
+ category="lo",
+ description="CUNEIFORM SIGN BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12049,
+ },
+ [0x1204A]={
+ category="lo",
+ description="CUNEIFORM SIGN BI TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1204A,
+ },
+ [0x1204B]={
+ category="lo",
+ description="CUNEIFORM SIGN BI TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1204B,
+ },
+ [0x1204C]={
+ category="lo",
+ description="CUNEIFORM SIGN BI TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1204C,
+ },
+ [0x1204D]={
+ category="lo",
+ description="CUNEIFORM SIGN BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1204D,
+ },
+ [0x1204E]={
+ category="lo",
+ description="CUNEIFORM SIGN BU OVER BU AB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1204E,
+ },
+ [0x1204F]={
+ category="lo",
+ description="CUNEIFORM SIGN BU OVER BU UN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1204F,
+ },
+ [0x12050]={
+ category="lo",
+ description="CUNEIFORM SIGN BU CROSSING BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12050,
+ },
+ [0x12051]={
+ category="lo",
+ description="CUNEIFORM SIGN BULUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12051,
+ },
+ [0x12052]={
+ category="lo",
+ description="CUNEIFORM SIGN BULUG OVER BULUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12052,
+ },
+ [0x12053]={
+ category="lo",
+ description="CUNEIFORM SIGN BUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12053,
+ },
+ [0x12054]={
+ category="lo",
+ description="CUNEIFORM SIGN BUR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12054,
+ },
+ [0x12055]={
+ category="lo",
+ description="CUNEIFORM SIGN DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12055,
+ },
+ [0x12056]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12056,
+ },
+ [0x12057]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES A PLUS MASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12057,
+ },
+ [0x12058]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES AMAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12058,
+ },
+ [0x12059]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES BALAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12059,
+ },
+ [0x1205A]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1205A,
+ },
+ [0x1205B]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1205B,
+ },
+ [0x1205C]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GA PLUS MASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1205C,
+ },
+ [0x1205D]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1205D,
+ },
+ [0x1205E]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GIR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1205E,
+ },
+ [0x1205F]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1205F,
+ },
+ [0x12060]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12060,
+ },
+ [0x12061]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES IR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12061,
+ },
+ [0x12062]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES IR PLUS LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12062,
+ },
+ [0x12063]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES KAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12063,
+ },
+ [0x12064]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12064,
+ },
+ [0x12065]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12065,
+ },
+ [0x12066]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LU PLUS MASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12066,
+ },
+ [0x12067]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES LUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12067,
+ },
+ [0x12068]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12068,
+ },
+ [0x12069]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES PAP PLUS PAP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12069,
+ },
+ [0x1206A]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES SI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1206A,
+ },
+ [0x1206B]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1206B,
+ },
+ [0x1206C]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES U0x0002 PLUS GIR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1206C,
+ },
+ [0x1206D]={
+ category="lo",
+ description="CUNEIFORM SIGN DAG KISIM0x0005 TIMES USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1206D,
+ },
+ [0x1206E]={
+ category="lo",
+ description="CUNEIFORM SIGN DAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1206E,
+ },
+ [0x1206F]={
+ category="lo",
+ description="CUNEIFORM SIGN DAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1206F,
+ },
+ [0x12070]={
+ category="lo",
+ description="CUNEIFORM SIGN DARA0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12070,
+ },
+ [0x12071]={
+ category="lo",
+ description="CUNEIFORM SIGN DARA0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12071,
+ },
+ [0x12072]={
+ category="lo",
+ description="CUNEIFORM SIGN DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12072,
+ },
+ [0x12073]={
+ category="lo",
+ description="CUNEIFORM SIGN DIB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12073,
+ },
+ [0x12074]={
+ category="lo",
+ description="CUNEIFORM SIGN DIM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12074,
+ },
+ [0x12075]={
+ category="lo",
+ description="CUNEIFORM SIGN DIM TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12075,
+ },
+ [0x12076]={
+ category="lo",
+ description="CUNEIFORM SIGN DIM0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12076,
+ },
+ [0x12077]={
+ category="lo",
+ description="CUNEIFORM SIGN DIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12077,
+ },
+ [0x12078]={
+ category="lo",
+ description="CUNEIFORM SIGN DIN KASKAL U GUNU DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12078,
+ },
+ [0x12079]={
+ category="lo",
+ description="CUNEIFORM SIGN DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12079,
+ },
+ [0x1207A]={
+ category="lo",
+ description="CUNEIFORM SIGN DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1207A,
+ },
+ [0x1207B]={
+ category="lo",
+ description="CUNEIFORM SIGN DU OVER DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1207B,
+ },
+ [0x1207C]={
+ category="lo",
+ description="CUNEIFORM SIGN DU GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1207C,
+ },
+ [0x1207D]={
+ category="lo",
+ description="CUNEIFORM SIGN DU SHESHIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1207D,
+ },
+ [0x1207E]={
+ category="lo",
+ description="CUNEIFORM SIGN DUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1207E,
+ },
+ [0x1207F]={
+ category="lo",
+ description="CUNEIFORM SIGN DUB TIMES ESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1207F,
+ },
+ [0x12080]={
+ category="lo",
+ description="CUNEIFORM SIGN DUB0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12080,
+ },
+ [0x12081]={
+ category="lo",
+ description="CUNEIFORM SIGN DUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12081,
+ },
+ [0x12082]={
+ category="lo",
+ description="CUNEIFORM SIGN DUGUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12082,
+ },
+ [0x12083]={
+ category="lo",
+ description="CUNEIFORM SIGN DUH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12083,
+ },
+ [0x12084]={
+ category="lo",
+ description="CUNEIFORM SIGN DUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12084,
+ },
+ [0x12085]={
+ category="lo",
+ description="CUNEIFORM SIGN DUN0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12085,
+ },
+ [0x12086]={
+ category="lo",
+ description="CUNEIFORM SIGN DUN0x0003 GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12086,
+ },
+ [0x12087]={
+ category="lo",
+ description="CUNEIFORM SIGN DUN0x0003 GUNU GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12087,
+ },
+ [0x12088]={
+ category="lo",
+ description="CUNEIFORM SIGN DUN0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12088,
+ },
+ [0x12089]={
+ category="lo",
+ description="CUNEIFORM SIGN DUR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12089,
+ },
+ [0x1208A]={
+ category="lo",
+ description="CUNEIFORM SIGN E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1208A,
+ },
+ [0x1208B]={
+ category="lo",
+ description="CUNEIFORM SIGN E TIMES PAP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1208B,
+ },
+ [0x1208C]={
+ category="lo",
+ description="CUNEIFORM SIGN E OVER E NUN OVER NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1208C,
+ },
+ [0x1208D]={
+ category="lo",
+ description="CUNEIFORM SIGN E0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1208D,
+ },
+ [0x1208E]={
+ category="lo",
+ description="CUNEIFORM SIGN E0x0002 TIMES A PLUS HA PLUS DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1208E,
+ },
+ [0x1208F]={
+ category="lo",
+ description="CUNEIFORM SIGN E0x0002 TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1208F,
+ },
+ [0x12090]={
+ category="lo",
+ description="CUNEIFORM SIGN E0x0002 TIMES MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12090,
+ },
+ [0x12091]={
+ category="lo",
+ description="CUNEIFORM SIGN E0x0002 TIMES SAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12091,
+ },
+ [0x12092]={
+ category="lo",
+ description="CUNEIFORM SIGN E0x0002 TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12092,
+ },
+ [0x12093]={
+ category="lo",
+ description="CUNEIFORM SIGN E0x0002 TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12093,
+ },
+ [0x12094]={
+ category="lo",
+ description="CUNEIFORM SIGN EDIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12094,
+ },
+ [0x12095]={
+ category="lo",
+ description="CUNEIFORM SIGN EGIR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12095,
+ },
+ [0x12096]={
+ category="lo",
+ description="CUNEIFORM SIGN EL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12096,
+ },
+ [0x12097]={
+ category="lo",
+ description="CUNEIFORM SIGN EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12097,
+ },
+ [0x12098]={
+ category="lo",
+ description="CUNEIFORM SIGN EN TIMES GAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12098,
+ },
+ [0x12099]={
+ category="lo",
+ description="CUNEIFORM SIGN EN TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12099,
+ },
+ [0x1209A]={
+ category="lo",
+ description="CUNEIFORM SIGN EN TIMES ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1209A,
+ },
+ [0x1209B]={
+ category="lo",
+ description="CUNEIFORM SIGN EN CROSSING EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1209B,
+ },
+ [0x1209C]={
+ category="lo",
+ description="CUNEIFORM SIGN EN OPPOSING EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1209C,
+ },
+ [0x1209D]={
+ category="lo",
+ description="CUNEIFORM SIGN EN SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1209D,
+ },
+ [0x1209E]={
+ category="lo",
+ description="CUNEIFORM SIGN EREN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1209E,
+ },
+ [0x1209F]={
+ category="lo",
+ description="CUNEIFORM SIGN ERIN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1209F,
+ },
+ [0x120A0]={
+ category="lo",
+ description="CUNEIFORM SIGN ESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A0,
+ },
+ [0x120A1]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A1,
+ },
+ [0x120A2]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A2,
+ },
+ [0x120A3]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES A PLUS LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A3,
+ },
+ [0x120A4]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A4,
+ },
+ [0x120A5]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A5,
+ },
+ [0x120A6]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A6,
+ },
+ [0x120A7]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES DUN0x0003 GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A7,
+ },
+ [0x120A8]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES DUN0x0003 GUNU GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A8,
+ },
+ [0x120A9]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120A9,
+ },
+ [0x120AA]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES HA GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120AA,
+ },
+ [0x120AB]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120AB,
+ },
+ [0x120AC]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES KASKAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120AC,
+ },
+ [0x120AD]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120AD,
+ },
+ [0x120AE]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES KU0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120AE,
+ },
+ [0x120AF]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120AF,
+ },
+ [0x120B0]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B0,
+ },
+ [0x120B1]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B1,
+ },
+ [0x120B2]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B2,
+ },
+ [0x120B3]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES U0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B3,
+ },
+ [0x120B4]={
+ category="lo",
+ description="CUNEIFORM SIGN EZEN TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B4,
+ },
+ [0x120B5]={
+ category="lo",
+ description="CUNEIFORM SIGN GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B5,
+ },
+ [0x120B6]={
+ category="lo",
+ description="CUNEIFORM SIGN GA GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B6,
+ },
+ [0x120B7]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B7,
+ },
+ [0x120B8]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS DA PLUS HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B8,
+ },
+ [0x120B9]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120B9,
+ },
+ [0x120BA]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES A PLUS IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120BA,
+ },
+ [0x120BB]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES AB0x0002 TENU PLUS TAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120BB,
+ },
+ [0x120BC]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120BC,
+ },
+ [0x120BD]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120BD,
+ },
+ [0x120BE]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES ASH0x0002 PLUS GAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120BE,
+ },
+ [0x120BF]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120BF,
+ },
+ [0x120C0]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES BAR PLUS RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C0,
+ },
+ [0x120C1]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES BUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C1,
+ },
+ [0x120C2]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES BUR PLUS RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C2,
+ },
+ [0x120C3]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C3,
+ },
+ [0x120C4]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C4,
+ },
+ [0x120C5]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES DIM TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C5,
+ },
+ [0x120C6]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES DUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C6,
+ },
+ [0x120C7]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES EL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C7,
+ },
+ [0x120C8]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES EL PLUS LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C8,
+ },
+ [0x120C9]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120C9,
+ },
+ [0x120CA]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES EN TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120CA,
+ },
+ [0x120CB]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120CB,
+ },
+ [0x120CC]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120CC,
+ },
+ [0x120CD]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120CD,
+ },
+ [0x120CE]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES GI0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120CE,
+ },
+ [0x120CF]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES GI0x0004 PLUS A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120CF,
+ },
+ [0x120D0]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES GIR0x0002 PLUS SU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D0,
+ },
+ [0x120D1]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES HA PLUS LU PLUS ESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D1,
+ },
+ [0x120D2]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES HAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D2,
+ },
+ [0x120D3]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES HAL PLUS LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D3,
+ },
+ [0x120D4]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES HI PLUS LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D4,
+ },
+ [0x120D5]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES HUB0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D5,
+ },
+ [0x120D6]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D6,
+ },
+ [0x120D7]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES ISH PLUS HU PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D7,
+ },
+ [0x120D8]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES KAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D8,
+ },
+ [0x120D9]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES KASKAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120D9,
+ },
+ [0x120DA]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES KID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120DA,
+ },
+ [0x120DB]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES KID PLUS LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120DB,
+ },
+ [0x120DC]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES KU0x0003 PLUS AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120DC,
+ },
+ [0x120DD]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120DD,
+ },
+ [0x120DE]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES ME PLUS EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120DE,
+ },
+ [0x120DF]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120DF,
+ },
+ [0x120E0]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E0,
+ },
+ [0x120E1]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES NUN OVER NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E1,
+ },
+ [0x120E2]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E2,
+ },
+ [0x120E3]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES SAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E3,
+ },
+ [0x120E4]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES SAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E4,
+ },
+ [0x120E5]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E5,
+ },
+ [0x120E6]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES SHE PLUS TUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E6,
+ },
+ [0x120E7]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES SHID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E7,
+ },
+ [0x120E8]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES SUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E8,
+ },
+ [0x120E9]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120E9,
+ },
+ [0x120EA]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120EA,
+ },
+ [0x120EB]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120EB,
+ },
+ [0x120EC]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 TIMES UD PLUS DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120EC,
+ },
+ [0x120ED]={
+ category="lo",
+ description="CUNEIFORM SIGN GA0x0002 OVER GA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120ED,
+ },
+ [0x120EE]={
+ category="lo",
+ description="CUNEIFORM SIGN GABA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120EE,
+ },
+ [0x120EF]={
+ category="lo",
+ description="CUNEIFORM SIGN GABA CROSSING GABA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120EF,
+ },
+ [0x120F0]={
+ category="lo",
+ description="CUNEIFORM SIGN GAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F0,
+ },
+ [0x120F1]={
+ category="lo",
+ description="CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F1,
+ },
+ [0x120F2]={
+ category="lo",
+ description="CUNEIFORM SIGN GAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F2,
+ },
+ [0x120F3]={
+ category="lo",
+ description="CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F3,
+ },
+ [0x120F4]={
+ category="lo",
+ description="CUNEIFORM SIGN GALAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F4,
+ },
+ [0x120F5]={
+ category="lo",
+ description="CUNEIFORM SIGN GAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F5,
+ },
+ [0x120F6]={
+ category="lo",
+ description="CUNEIFORM SIGN GAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F6,
+ },
+ [0x120F7]={
+ category="lo",
+ description="CUNEIFORM SIGN GAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F7,
+ },
+ [0x120F8]={
+ category="lo",
+ description="CUNEIFORM SIGN GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F8,
+ },
+ [0x120F9]={
+ category="lo",
+ description="CUNEIFORM SIGN GAN0x0002 OVER GAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120F9,
+ },
+ [0x120FA]={
+ category="lo",
+ description="CUNEIFORM SIGN GAN0x0002 CROSSING GAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120FA,
+ },
+ [0x120FB]={
+ category="lo",
+ description="CUNEIFORM SIGN GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120FB,
+ },
+ [0x120FC]={
+ category="lo",
+ description="CUNEIFORM SIGN GAR0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120FC,
+ },
+ [0x120FD]={
+ category="lo",
+ description="CUNEIFORM SIGN GASHAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120FD,
+ },
+ [0x120FE]={
+ category="lo",
+ description="CUNEIFORM SIGN GESHTIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120FE,
+ },
+ [0x120FF]={
+ category="lo",
+ description="CUNEIFORM SIGN GESHTIN TIMES KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x120FF,
+ },
+ [0x12100]={
+ category="lo",
+ description="CUNEIFORM SIGN GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12100,
+ },
+ [0x12101]={
+ category="lo",
+ description="CUNEIFORM SIGN GI TIMES E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12101,
+ },
+ [0x12102]={
+ category="lo",
+ description="CUNEIFORM SIGN GI TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12102,
+ },
+ [0x12103]={
+ category="lo",
+ description="CUNEIFORM SIGN GI CROSSING GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12103,
+ },
+ [0x12104]={
+ category="lo",
+ description="CUNEIFORM SIGN GI0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12104,
+ },
+ [0x12105]={
+ category="lo",
+ description="CUNEIFORM SIGN GI0x0004 OVER GI0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12105,
+ },
+ [0x12106]={
+ category="lo",
+ description="CUNEIFORM SIGN GI0x0004 CROSSING GI0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12106,
+ },
+ [0x12107]={
+ category="lo",
+ description="CUNEIFORM SIGN GIDIM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12107,
+ },
+ [0x12108]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12108,
+ },
+ [0x12109]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0002 GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12109,
+ },
+ [0x1210A]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1210A,
+ },
+ [0x1210B]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0003 TIMES A PLUS IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1210B,
+ },
+ [0x1210C]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0003 TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1210C,
+ },
+ [0x1210D]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0003 TIMES IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1210D,
+ },
+ [0x1210E]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0003 TIMES LU PLUS IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1210E,
+ },
+ [0x1210F]={
+ category="lo",
+ description="CUNEIFORM SIGN GIR0x0003 TIMES PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1210F,
+ },
+ [0x12110]={
+ category="lo",
+ description="CUNEIFORM SIGN GISAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12110,
+ },
+ [0x12111]={
+ category="lo",
+ description="CUNEIFORM SIGN GISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12111,
+ },
+ [0x12112]={
+ category="lo",
+ description="CUNEIFORM SIGN GISH CROSSING GISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12112,
+ },
+ [0x12113]={
+ category="lo",
+ description="CUNEIFORM SIGN GISH TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12113,
+ },
+ [0x12114]={
+ category="lo",
+ description="CUNEIFORM SIGN GISH TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12114,
+ },
+ [0x12115]={
+ category="lo",
+ description="CUNEIFORM SIGN GISH TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12115,
+ },
+ [0x12116]={
+ category="lo",
+ description="CUNEIFORM SIGN GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12116,
+ },
+ [0x12117]={
+ category="lo",
+ description="CUNEIFORM SIGN GU CROSSING GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12117,
+ },
+ [0x12118]={
+ category="lo",
+ description="CUNEIFORM SIGN GU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12118,
+ },
+ [0x12119]={
+ category="lo",
+ description="CUNEIFORM SIGN GU0x0002 TIMES KAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12119,
+ },
+ [0x1211A]={
+ category="lo",
+ description="CUNEIFORM SIGN GU0x0002 TIMES KAK TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1211A,
+ },
+ [0x1211B]={
+ category="lo",
+ description="CUNEIFORM SIGN GU0x0002 TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1211B,
+ },
+ [0x1211C]={
+ category="lo",
+ description="CUNEIFORM SIGN GU0x0002 TIMES SAL PLUS TUG0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1211C,
+ },
+ [0x1211D]={
+ category="lo",
+ description="CUNEIFORM SIGN GU0x0002 GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1211D,
+ },
+ [0x1211E]={
+ category="lo",
+ description="CUNEIFORM SIGN GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1211E,
+ },
+ [0x1211F]={
+ category="lo",
+ description="CUNEIFORM SIGN GUD TIMES A PLUS KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1211F,
+ },
+ [0x12120]={
+ category="lo",
+ description="CUNEIFORM SIGN GUD TIMES KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12120,
+ },
+ [0x12121]={
+ category="lo",
+ description="CUNEIFORM SIGN GUD OVER GUD LUGAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12121,
+ },
+ [0x12122]={
+ category="lo",
+ description="CUNEIFORM SIGN GUL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12122,
+ },
+ [0x12123]={
+ category="lo",
+ description="CUNEIFORM SIGN GUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12123,
+ },
+ [0x12124]={
+ category="lo",
+ description="CUNEIFORM SIGN GUM TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12124,
+ },
+ [0x12125]={
+ category="lo",
+ description="CUNEIFORM SIGN GUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12125,
+ },
+ [0x12126]={
+ category="lo",
+ description="CUNEIFORM SIGN GUR0x0007",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12126,
+ },
+ [0x12127]={
+ category="lo",
+ description="CUNEIFORM SIGN GURUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12127,
+ },
+ [0x12128]={
+ category="lo",
+ description="CUNEIFORM SIGN GURUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12128,
+ },
+ [0x12129]={
+ category="lo",
+ description="CUNEIFORM SIGN HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12129,
+ },
+ [0x1212A]={
+ category="lo",
+ description="CUNEIFORM SIGN HA TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1212A,
+ },
+ [0x1212B]={
+ category="lo",
+ description="CUNEIFORM SIGN HA GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1212B,
+ },
+ [0x1212C]={
+ category="lo",
+ description="CUNEIFORM SIGN HAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1212C,
+ },
+ [0x1212D]={
+ category="lo",
+ description="CUNEIFORM SIGN HI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1212D,
+ },
+ [0x1212E]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1212E,
+ },
+ [0x1212F]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES ASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1212F,
+ },
+ [0x12130]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12130,
+ },
+ [0x12131]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12131,
+ },
+ [0x12132]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES GAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12132,
+ },
+ [0x12133]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES KIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12133,
+ },
+ [0x12134]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12134,
+ },
+ [0x12135]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12135,
+ },
+ [0x12136]={
+ category="lo",
+ description="CUNEIFORM SIGN HI TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12136,
+ },
+ [0x12137]={
+ category="lo",
+ description="CUNEIFORM SIGN HU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12137,
+ },
+ [0x12138]={
+ category="lo",
+ description="CUNEIFORM SIGN HUB0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12138,
+ },
+ [0x12139]={
+ category="lo",
+ description="CUNEIFORM SIGN HUB0x0002 TIMES AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12139,
+ },
+ [0x1213A]={
+ category="lo",
+ description="CUNEIFORM SIGN HUB0x0002 TIMES HAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1213A,
+ },
+ [0x1213B]={
+ category="lo",
+ description="CUNEIFORM SIGN HUB0x0002 TIMES KASKAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1213B,
+ },
+ [0x1213C]={
+ category="lo",
+ description="CUNEIFORM SIGN HUB0x0002 TIMES LISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1213C,
+ },
+ [0x1213D]={
+ category="lo",
+ description="CUNEIFORM SIGN HUB0x0002 TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1213D,
+ },
+ [0x1213E]={
+ category="lo",
+ description="CUNEIFORM SIGN HUL0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1213E,
+ },
+ [0x1213F]={
+ category="lo",
+ description="CUNEIFORM SIGN I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1213F,
+ },
+ [0x12140]={
+ category="lo",
+ description="CUNEIFORM SIGN I A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12140,
+ },
+ [0x12141]={
+ category="lo",
+ description="CUNEIFORM SIGN IB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12141,
+ },
+ [0x12142]={
+ category="lo",
+ description="CUNEIFORM SIGN IDIM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12142,
+ },
+ [0x12143]={
+ category="lo",
+ description="CUNEIFORM SIGN IDIM OVER IDIM BUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12143,
+ },
+ [0x12144]={
+ category="lo",
+ description="CUNEIFORM SIGN IDIM OVER IDIM SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12144,
+ },
+ [0x12145]={
+ category="lo",
+ description="CUNEIFORM SIGN IG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12145,
+ },
+ [0x12146]={
+ category="lo",
+ description="CUNEIFORM SIGN IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12146,
+ },
+ [0x12147]={
+ category="lo",
+ description="CUNEIFORM SIGN IGI DIB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12147,
+ },
+ [0x12148]={
+ category="lo",
+ description="CUNEIFORM SIGN IGI RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12148,
+ },
+ [0x12149]={
+ category="lo",
+ description="CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12149,
+ },
+ [0x1214A]={
+ category="lo",
+ description="CUNEIFORM SIGN IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1214A,
+ },
+ [0x1214B]={
+ category="lo",
+ description="CUNEIFORM SIGN IL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1214B,
+ },
+ [0x1214C]={
+ category="lo",
+ description="CUNEIFORM SIGN IL TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1214C,
+ },
+ [0x1214D]={
+ category="lo",
+ description="CUNEIFORM SIGN IL0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1214D,
+ },
+ [0x1214E]={
+ category="lo",
+ description="CUNEIFORM SIGN IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1214E,
+ },
+ [0x1214F]={
+ category="lo",
+ description="CUNEIFORM SIGN IM TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1214F,
+ },
+ [0x12150]={
+ category="lo",
+ description="CUNEIFORM SIGN IM CROSSING IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12150,
+ },
+ [0x12151]={
+ category="lo",
+ description="CUNEIFORM SIGN IM OPPOSING IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12151,
+ },
+ [0x12152]={
+ category="lo",
+ description="CUNEIFORM SIGN IM SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12152,
+ },
+ [0x12153]={
+ category="lo",
+ description="CUNEIFORM SIGN IMIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12153,
+ },
+ [0x12154]={
+ category="lo",
+ description="CUNEIFORM SIGN IN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12154,
+ },
+ [0x12155]={
+ category="lo",
+ description="CUNEIFORM SIGN IR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12155,
+ },
+ [0x12156]={
+ category="lo",
+ description="CUNEIFORM SIGN ISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12156,
+ },
+ [0x12157]={
+ category="lo",
+ description="CUNEIFORM SIGN KA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12157,
+ },
+ [0x12158]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12158,
+ },
+ [0x12159]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES AD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12159,
+ },
+ [0x1215A]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES AD PLUS KU0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1215A,
+ },
+ [0x1215B]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1215B,
+ },
+ [0x1215C]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1215C,
+ },
+ [0x1215D]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES BALAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1215D,
+ },
+ [0x1215E]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES BAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1215E,
+ },
+ [0x1215F]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1215F,
+ },
+ [0x12160]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ERIN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12160,
+ },
+ [0x12161]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12161,
+ },
+ [0x12162]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12162,
+ },
+ [0x12163]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12163,
+ },
+ [0x12164]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12164,
+ },
+ [0x12165]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12165,
+ },
+ [0x12166]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GAR PLUS SHA0x0003 PLUS A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12166,
+ },
+ [0x12167]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12167,
+ },
+ [0x12168]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GIR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12168,
+ },
+ [0x12169]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GISH PLUS SAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12169,
+ },
+ [0x1216A]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GISH CROSSING GISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1216A,
+ },
+ [0x1216B]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1216B,
+ },
+ [0x1216C]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES GUR0x0007",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1216C,
+ },
+ [0x1216D]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1216D,
+ },
+ [0x1216E]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1216E,
+ },
+ [0x1216F]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES KAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1216F,
+ },
+ [0x12170]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12170,
+ },
+ [0x12171]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES KID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12171,
+ },
+ [0x12172]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12172,
+ },
+ [0x12173]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12173,
+ },
+ [0x12174]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12174,
+ },
+ [0x12175]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ME PLUS DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12175,
+ },
+ [0x12176]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ME PLUS GI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12176,
+ },
+ [0x12177]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ME PLUS TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12177,
+ },
+ [0x12178]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12178,
+ },
+ [0x12179]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12179,
+ },
+ [0x1217A]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1217A,
+ },
+ [0x1217B]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1217B,
+ },
+ [0x1217C]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1217C,
+ },
+ [0x1217D]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES RU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1217D,
+ },
+ [0x1217E]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1217E,
+ },
+ [0x1217F]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1217F,
+ },
+ [0x12180]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12180,
+ },
+ [0x12181]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12181,
+ },
+ [0x12182]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SHID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12182,
+ },
+ [0x12183]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12183,
+ },
+ [0x12184]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12184,
+ },
+ [0x12185]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES SUHUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12185,
+ },
+ [0x12186]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES TAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12186,
+ },
+ [0x12187]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12187,
+ },
+ [0x12188]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES U0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12188,
+ },
+ [0x12189]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12189,
+ },
+ [0x1218A]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES UMUM TIMES PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1218A,
+ },
+ [0x1218B]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1218B,
+ },
+ [0x1218C]={
+ category="lo",
+ description="CUNEIFORM SIGN KA TIMES ZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1218C,
+ },
+ [0x1218D]={
+ category="lo",
+ description="CUNEIFORM SIGN KA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1218D,
+ },
+ [0x1218E]={
+ category="lo",
+ description="CUNEIFORM SIGN KA0x0002 CROSSING KA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1218E,
+ },
+ [0x1218F]={
+ category="lo",
+ description="CUNEIFORM SIGN KAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1218F,
+ },
+ [0x12190]={
+ category="lo",
+ description="CUNEIFORM SIGN KAD0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12190,
+ },
+ [0x12191]={
+ category="lo",
+ description="CUNEIFORM SIGN KAD0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12191,
+ },
+ [0x12192]={
+ category="lo",
+ description="CUNEIFORM SIGN KAD0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12192,
+ },
+ [0x12193]={
+ category="lo",
+ description="CUNEIFORM SIGN KAD0x0005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12193,
+ },
+ [0x12194]={
+ category="lo",
+ description="CUNEIFORM SIGN KAD0x0005 OVER KAD0x0005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12194,
+ },
+ [0x12195]={
+ category="lo",
+ description="CUNEIFORM SIGN KAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12195,
+ },
+ [0x12196]={
+ category="lo",
+ description="CUNEIFORM SIGN KAK TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12196,
+ },
+ [0x12197]={
+ category="lo",
+ description="CUNEIFORM SIGN KAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12197,
+ },
+ [0x12198]={
+ category="lo",
+ description="CUNEIFORM SIGN KAL TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12198,
+ },
+ [0x12199]={
+ category="lo",
+ description="CUNEIFORM SIGN KAL CROSSING KAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12199,
+ },
+ [0x1219A]={
+ category="lo",
+ description="CUNEIFORM SIGN KAM0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1219A,
+ },
+ [0x1219B]={
+ category="lo",
+ description="CUNEIFORM SIGN KAM0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1219B,
+ },
+ [0x1219C]={
+ category="lo",
+ description="CUNEIFORM SIGN KASKAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1219C,
+ },
+ [0x1219D]={
+ category="lo",
+ description="CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1219D,
+ },
+ [0x1219E]={
+ category="lo",
+ description="CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1219E,
+ },
+ [0x1219F]={
+ category="lo",
+ description="CUNEIFORM SIGN KESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1219F,
+ },
+ [0x121A0]={
+ category="lo",
+ description="CUNEIFORM SIGN KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A0,
+ },
+ [0x121A1]={
+ category="lo",
+ description="CUNEIFORM SIGN KI TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A1,
+ },
+ [0x121A2]={
+ category="lo",
+ description="CUNEIFORM SIGN KI TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A2,
+ },
+ [0x121A3]={
+ category="lo",
+ description="CUNEIFORM SIGN KI TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A3,
+ },
+ [0x121A4]={
+ category="lo",
+ description="CUNEIFORM SIGN KID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A4,
+ },
+ [0x121A5]={
+ category="lo",
+ description="CUNEIFORM SIGN KIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A5,
+ },
+ [0x121A6]={
+ category="lo",
+ description="CUNEIFORM SIGN KISAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A6,
+ },
+ [0x121A7]={
+ category="lo",
+ description="CUNEIFORM SIGN KISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A7,
+ },
+ [0x121A8]={
+ category="lo",
+ description="CUNEIFORM SIGN KISIM0x0005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A8,
+ },
+ [0x121A9]={
+ category="lo",
+ description="CUNEIFORM SIGN KISIM0x0005 OVER KISIM0x0005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121A9,
+ },
+ [0x121AA]={
+ category="lo",
+ description="CUNEIFORM SIGN KU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121AA,
+ },
+ [0x121AB]={
+ category="lo",
+ description="CUNEIFORM SIGN KU OVER HI TIMES ASH0x0002 KU OVER HI TIMES ASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121AB,
+ },
+ [0x121AC]={
+ category="lo",
+ description="CUNEIFORM SIGN KU0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121AC,
+ },
+ [0x121AD]={
+ category="lo",
+ description="CUNEIFORM SIGN KU0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121AD,
+ },
+ [0x121AE]={
+ category="lo",
+ description="CUNEIFORM SIGN KU0x0004 VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121AE,
+ },
+ [0x121AF]={
+ category="lo",
+ description="CUNEIFORM SIGN KU0x0007",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121AF,
+ },
+ [0x121B0]={
+ category="lo",
+ description="CUNEIFORM SIGN KUL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B0,
+ },
+ [0x121B1]={
+ category="lo",
+ description="CUNEIFORM SIGN KUL GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B1,
+ },
+ [0x121B2]={
+ category="lo",
+ description="CUNEIFORM SIGN KUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B2,
+ },
+ [0x121B3]={
+ category="lo",
+ description="CUNEIFORM SIGN KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B3,
+ },
+ [0x121B4]={
+ category="lo",
+ description="CUNEIFORM SIGN KUR OPPOSING KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B4,
+ },
+ [0x121B5]={
+ category="lo",
+ description="CUNEIFORM SIGN KUSHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B5,
+ },
+ [0x121B6]={
+ category="lo",
+ description="CUNEIFORM SIGN KWU0x013E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B6,
+ },
+ [0x121B7]={
+ category="lo",
+ description="CUNEIFORM SIGN LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B7,
+ },
+ [0x121B8]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B8,
+ },
+ [0x121B9]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121B9,
+ },
+ [0x121BA]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121BA,
+ },
+ [0x121BB]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES A PLUS GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121BB,
+ },
+ [0x121BC]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES A PLUS LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121BC,
+ },
+ [0x121BD]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES AL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121BD,
+ },
+ [0x121BE]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121BE,
+ },
+ [0x121BF]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121BF,
+ },
+ [0x121C0]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C0,
+ },
+ [0x121C1]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C1,
+ },
+ [0x121C2]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES DAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C2,
+ },
+ [0x121C3]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C3,
+ },
+ [0x121C4]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C4,
+ },
+ [0x121C5]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C5,
+ },
+ [0x121C6]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C6,
+ },
+ [0x121C7]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C7,
+ },
+ [0x121C8]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C8,
+ },
+ [0x121C9]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES HAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121C9,
+ },
+ [0x121CA]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121CA,
+ },
+ [0x121CB]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121CB,
+ },
+ [0x121CC]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121CC,
+ },
+ [0x121CD]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES IM PLUS HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121CD,
+ },
+ [0x121CE]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES IM PLUS LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121CE,
+ },
+ [0x121CF]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121CF,
+ },
+ [0x121D0]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES KIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D0,
+ },
+ [0x121D1]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES KU0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D1,
+ },
+ [0x121D2]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES KUL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D2,
+ },
+ [0x121D3]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D3,
+ },
+ [0x121D4]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES LAGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D4,
+ },
+ [0x121D5]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES LISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D5,
+ },
+ [0x121D6]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D6,
+ },
+ [0x121D7]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES LUL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D7,
+ },
+ [0x121D8]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D8,
+ },
+ [0x121D9]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES ME PLUS EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121D9,
+ },
+ [0x121DA]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES MUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121DA,
+ },
+ [0x121DB]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121DB,
+ },
+ [0x121DC]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121DC,
+ },
+ [0x121DD]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121DD,
+ },
+ [0x121DE]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121DE,
+ },
+ [0x121DF]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES SHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121DF,
+ },
+ [0x121E0]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES SHU0x0002 PLUS SHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E0,
+ },
+ [0x121E1]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES SUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E1,
+ },
+ [0x121E2]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES TAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E2,
+ },
+ [0x121E3]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E3,
+ },
+ [0x121E4]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E4,
+ },
+ [0x121E5]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E5,
+ },
+ [0x121E6]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES U PLUS A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E6,
+ },
+ [0x121E7]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E7,
+ },
+ [0x121E8]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES U0x0002 PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E8,
+ },
+ [0x121E9]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121E9,
+ },
+ [0x121EA]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB TIMES USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121EA,
+ },
+ [0x121EB]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAB SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121EB,
+ },
+ [0x121EC]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121EC,
+ },
+ [0x121ED]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAR TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121ED,
+ },
+ [0x121EE]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121EE,
+ },
+ [0x121EF]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAR GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121EF,
+ },
+ [0x121F0]={
+ category="lo",
+ description="CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F0,
+ },
+ [0x121F1]={
+ category="lo",
+ description="CUNEIFORM SIGN LAHSHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F1,
+ },
+ [0x121F2]={
+ category="lo",
+ description="CUNEIFORM SIGN LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F2,
+ },
+ [0x121F3]={
+ category="lo",
+ description="CUNEIFORM SIGN LAL TIMES LAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F3,
+ },
+ [0x121F4]={
+ category="lo",
+ description="CUNEIFORM SIGN LAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F4,
+ },
+ [0x121F5]={
+ category="lo",
+ description="CUNEIFORM SIGN LAM TIMES KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F5,
+ },
+ [0x121F6]={
+ category="lo",
+ description="CUNEIFORM SIGN LAM TIMES KUR PLUS RU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F6,
+ },
+ [0x121F7]={
+ category="lo",
+ description="CUNEIFORM SIGN LI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F7,
+ },
+ [0x121F8]={
+ category="lo",
+ description="CUNEIFORM SIGN LIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F8,
+ },
+ [0x121F9]={
+ category="lo",
+ description="CUNEIFORM SIGN LIMMU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121F9,
+ },
+ [0x121FA]={
+ category="lo",
+ description="CUNEIFORM SIGN LISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121FA,
+ },
+ [0x121FB]={
+ category="lo",
+ description="CUNEIFORM SIGN LU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121FB,
+ },
+ [0x121FC]={
+ category="lo",
+ description="CUNEIFORM SIGN LU TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121FC,
+ },
+ [0x121FD]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121FD,
+ },
+ [0x121FE]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES AL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121FE,
+ },
+ [0x121FF]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x121FF,
+ },
+ [0x12200]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES ESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12200,
+ },
+ [0x12201]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES ESH0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12201,
+ },
+ [0x12202]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12202,
+ },
+ [0x12203]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES HI TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12203,
+ },
+ [0x12204]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12204,
+ },
+ [0x12205]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12205,
+ },
+ [0x12206]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12206,
+ },
+ [0x12207]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES KAD0x0003 PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12207,
+ },
+ [0x12208]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12208,
+ },
+ [0x12209]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES LA PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12209,
+ },
+ [0x1220A]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES LAGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1220A,
+ },
+ [0x1220B]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES ME PLUS EN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1220B,
+ },
+ [0x1220C]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1220C,
+ },
+ [0x1220D]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES NU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1220D,
+ },
+ [0x1220E]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES SI PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1220E,
+ },
+ [0x1220F]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES SIK0x0002 PLUS BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1220F,
+ },
+ [0x12210]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TIMES TUG0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12210,
+ },
+ [0x12211]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12211,
+ },
+ [0x12212]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 CROSSING LU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12212,
+ },
+ [0x12213]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 OPPOSING LU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12213,
+ },
+ [0x12214]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12214,
+ },
+ [0x12215]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0002 SHESHIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12215,
+ },
+ [0x12216]={
+ category="lo",
+ description="CUNEIFORM SIGN LU0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12216,
+ },
+ [0x12217]={
+ category="lo",
+ description="CUNEIFORM SIGN LUGAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12217,
+ },
+ [0x12218]={
+ category="lo",
+ description="CUNEIFORM SIGN LUGAL OVER LUGAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12218,
+ },
+ [0x12219]={
+ category="lo",
+ description="CUNEIFORM SIGN LUGAL OPPOSING LUGAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12219,
+ },
+ [0x1221A]={
+ category="lo",
+ description="CUNEIFORM SIGN LUGAL SHESHIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1221A,
+ },
+ [0x1221B]={
+ category="lo",
+ description="CUNEIFORM SIGN LUH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1221B,
+ },
+ [0x1221C]={
+ category="lo",
+ description="CUNEIFORM SIGN LUL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1221C,
+ },
+ [0x1221D]={
+ category="lo",
+ description="CUNEIFORM SIGN LUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1221D,
+ },
+ [0x1221E]={
+ category="lo",
+ description="CUNEIFORM SIGN LUM OVER LUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1221E,
+ },
+ [0x1221F]={
+ category="lo",
+ description="CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1221F,
+ },
+ [0x12220]={
+ category="lo",
+ description="CUNEIFORM SIGN MA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12220,
+ },
+ [0x12221]={
+ category="lo",
+ description="CUNEIFORM SIGN MA TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12221,
+ },
+ [0x12222]={
+ category="lo",
+ description="CUNEIFORM SIGN MA GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12222,
+ },
+ [0x12223]={
+ category="lo",
+ description="CUNEIFORM SIGN MA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12223,
+ },
+ [0x12224]={
+ category="lo",
+ description="CUNEIFORM SIGN MAH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12224,
+ },
+ [0x12225]={
+ category="lo",
+ description="CUNEIFORM SIGN MAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12225,
+ },
+ [0x12226]={
+ category="lo",
+ description="CUNEIFORM SIGN MASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12226,
+ },
+ [0x12227]={
+ category="lo",
+ description="CUNEIFORM SIGN MASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12227,
+ },
+ [0x12228]={
+ category="lo",
+ description="CUNEIFORM SIGN ME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12228,
+ },
+ [0x12229]={
+ category="lo",
+ description="CUNEIFORM SIGN MES",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12229,
+ },
+ [0x1222A]={
+ category="lo",
+ description="CUNEIFORM SIGN MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1222A,
+ },
+ [0x1222B]={
+ category="lo",
+ description="CUNEIFORM SIGN MIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1222B,
+ },
+ [0x1222C]={
+ category="lo",
+ description="CUNEIFORM SIGN MU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1222C,
+ },
+ [0x1222D]={
+ category="lo",
+ description="CUNEIFORM SIGN MU OVER MU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1222D,
+ },
+ [0x1222E]={
+ category="lo",
+ description="CUNEIFORM SIGN MUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1222E,
+ },
+ [0x1222F]={
+ category="lo",
+ description="CUNEIFORM SIGN MUG GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1222F,
+ },
+ [0x12230]={
+ category="lo",
+ description="CUNEIFORM SIGN MUNSUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12230,
+ },
+ [0x12231]={
+ category="lo",
+ description="CUNEIFORM SIGN MURGU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12231,
+ },
+ [0x12232]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12232,
+ },
+ [0x12233]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12233,
+ },
+ [0x12234]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH TIMES KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12234,
+ },
+ [0x12235]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH TIMES ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12235,
+ },
+ [0x12236]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH OVER MUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12236,
+ },
+ [0x12237]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12237,
+ },
+ [0x12238]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH CROSSING MUSH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12238,
+ },
+ [0x12239]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12239,
+ },
+ [0x1223A]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH0x0003 TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1223A,
+ },
+ [0x1223B]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH0x0003 TIMES A PLUS DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1223B,
+ },
+ [0x1223C]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH0x0003 TIMES DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1223C,
+ },
+ [0x1223D]={
+ category="lo",
+ description="CUNEIFORM SIGN MUSH0x0003 GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1223D,
+ },
+ [0x1223E]={
+ category="lo",
+ description="CUNEIFORM SIGN NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1223E,
+ },
+ [0x1223F]={
+ category="lo",
+ description="CUNEIFORM SIGN NA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1223F,
+ },
+ [0x12240]={
+ category="lo",
+ description="CUNEIFORM SIGN NAGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12240,
+ },
+ [0x12241]={
+ category="lo",
+ description="CUNEIFORM SIGN NAGA INVERTED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12241,
+ },
+ [0x12242]={
+ category="lo",
+ description="CUNEIFORM SIGN NAGA TIMES SHU TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12242,
+ },
+ [0x12243]={
+ category="lo",
+ description="CUNEIFORM SIGN NAGA OPPOSING NAGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12243,
+ },
+ [0x12244]={
+ category="lo",
+ description="CUNEIFORM SIGN NAGAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12244,
+ },
+ [0x12245]={
+ category="lo",
+ description="CUNEIFORM SIGN NAM NUTILLU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12245,
+ },
+ [0x12246]={
+ category="lo",
+ description="CUNEIFORM SIGN NAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12246,
+ },
+ [0x12247]={
+ category="lo",
+ description="CUNEIFORM SIGN NAM0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12247,
+ },
+ [0x12248]={
+ category="lo",
+ description="CUNEIFORM SIGN NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12248,
+ },
+ [0x12249]={
+ category="lo",
+ description="CUNEIFORM SIGN NE TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12249,
+ },
+ [0x1224A]={
+ category="lo",
+ description="CUNEIFORM SIGN NE TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1224A,
+ },
+ [0x1224B]={
+ category="lo",
+ description="CUNEIFORM SIGN NE SHESHIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1224B,
+ },
+ [0x1224C]={
+ category="lo",
+ description="CUNEIFORM SIGN NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1224C,
+ },
+ [0x1224D]={
+ category="lo",
+ description="CUNEIFORM SIGN NI TIMES E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1224D,
+ },
+ [0x1224E]={
+ category="lo",
+ description="CUNEIFORM SIGN NI0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1224E,
+ },
+ [0x1224F]={
+ category="lo",
+ description="CUNEIFORM SIGN NIM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1224F,
+ },
+ [0x12250]={
+ category="lo",
+ description="CUNEIFORM SIGN NIM TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12250,
+ },
+ [0x12251]={
+ category="lo",
+ description="CUNEIFORM SIGN NIM TIMES GAR PLUS GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12251,
+ },
+ [0x12252]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12252,
+ },
+ [0x12253]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12253,
+ },
+ [0x12254]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12254,
+ },
+ [0x12255]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES ASH PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12255,
+ },
+ [0x12256]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12256,
+ },
+ [0x12257]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES ME PLUS GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12257,
+ },
+ [0x12258]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12258,
+ },
+ [0x12259]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12259,
+ },
+ [0x1225A]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1225A,
+ },
+ [0x1225B]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS A AN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1225B,
+ },
+ [0x1225C]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1225C,
+ },
+ [0x1225D]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES SHE PLUS ASH PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1225D,
+ },
+ [0x1225E]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES U0x0002 PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1225E,
+ },
+ [0x1225F]={
+ category="lo",
+ description="CUNEIFORM SIGN NINDA0x0002 TIMES USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1225F,
+ },
+ [0x12260]={
+ category="lo",
+ description="CUNEIFORM SIGN NISAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12260,
+ },
+ [0x12261]={
+ category="lo",
+ description="CUNEIFORM SIGN NU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12261,
+ },
+ [0x12262]={
+ category="lo",
+ description="CUNEIFORM SIGN NU0x000B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12262,
+ },
+ [0x12263]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12263,
+ },
+ [0x12264]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN LAGAR TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12264,
+ },
+ [0x12265]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN LAGAR TIMES MASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12265,
+ },
+ [0x12266]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN LAGAR TIMES SAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12266,
+ },
+ [0x12267]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12267,
+ },
+ [0x12268]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN LAGAR TIMES USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12268,
+ },
+ [0x12269]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12269,
+ },
+ [0x1226A]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN OVER NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1226A,
+ },
+ [0x1226B]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN CROSSING NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1226B,
+ },
+ [0x1226C]={
+ category="lo",
+ description="CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1226C,
+ },
+ [0x1226D]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1226D,
+ },
+ [0x1226E]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES ASHGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1226E,
+ },
+ [0x1226F]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1226F,
+ },
+ [0x12270]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES DUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12270,
+ },
+ [0x12271]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12271,
+ },
+ [0x12272]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12272,
+ },
+ [0x12273]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES KAD0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12273,
+ },
+ [0x12274]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES LA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12274,
+ },
+ [0x12275]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12275,
+ },
+ [0x12276]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES SILA0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12276,
+ },
+ [0x12277]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ AB0x0002 TIMES U0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12277,
+ },
+ [0x12278]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ KISIM0x0005 TIMES BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12278,
+ },
+ [0x12279]={
+ category="lo",
+ description="CUNEIFORM SIGN NUNUZ KISIM0x0005 TIMES BI U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12279,
+ },
+ [0x1227A]={
+ category="lo",
+ description="CUNEIFORM SIGN PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1227A,
+ },
+ [0x1227B]={
+ category="lo",
+ description="CUNEIFORM SIGN PAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1227B,
+ },
+ [0x1227C]={
+ category="lo",
+ description="CUNEIFORM SIGN PAN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1227C,
+ },
+ [0x1227D]={
+ category="lo",
+ description="CUNEIFORM SIGN PAP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1227D,
+ },
+ [0x1227E]={
+ category="lo",
+ description="CUNEIFORM SIGN PESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1227E,
+ },
+ [0x1227F]={
+ category="lo",
+ description="CUNEIFORM SIGN PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1227F,
+ },
+ [0x12280]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12280,
+ },
+ [0x12281]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES AB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12281,
+ },
+ [0x12282]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12282,
+ },
+ [0x12283]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES BU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12283,
+ },
+ [0x12284]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES E",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12284,
+ },
+ [0x12285]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES I",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12285,
+ },
+ [0x12286]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES IB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12286,
+ },
+ [0x12287]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12287,
+ },
+ [0x12288]={
+ category="lo",
+ description="CUNEIFORM SIGN PI TIMES U0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12288,
+ },
+ [0x12289]={
+ category="lo",
+ description="CUNEIFORM SIGN PI CROSSING PI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12289,
+ },
+ [0x1228A]={
+ category="lo",
+ description="CUNEIFORM SIGN PIRIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1228A,
+ },
+ [0x1228B]={
+ category="lo",
+ description="CUNEIFORM SIGN PIRIG TIMES KAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1228B,
+ },
+ [0x1228C]={
+ category="lo",
+ description="CUNEIFORM SIGN PIRIG TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1228C,
+ },
+ [0x1228D]={
+ category="lo",
+ description="CUNEIFORM SIGN PIRIG TIMES ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1228D,
+ },
+ [0x1228E]={
+ category="lo",
+ description="CUNEIFORM SIGN PIRIG OPPOSING PIRIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1228E,
+ },
+ [0x1228F]={
+ category="lo",
+ description="CUNEIFORM SIGN RA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1228F,
+ },
+ [0x12290]={
+ category="lo",
+ description="CUNEIFORM SIGN RAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12290,
+ },
+ [0x12291]={
+ category="lo",
+ description="CUNEIFORM SIGN RI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12291,
+ },
+ [0x12292]={
+ category="lo",
+ description="CUNEIFORM SIGN RU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12292,
+ },
+ [0x12293]={
+ category="lo",
+ description="CUNEIFORM SIGN SA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12293,
+ },
+ [0x12294]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG NUTILLU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12294,
+ },
+ [0x12295]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12295,
+ },
+ [0x12296]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12296,
+ },
+ [0x12297]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES DU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12297,
+ },
+ [0x12298]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES DUB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12298,
+ },
+ [0x12299]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12299,
+ },
+ [0x1229A]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES KAK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1229A,
+ },
+ [0x1229B]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1229B,
+ },
+ [0x1229C]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES LUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1229C,
+ },
+ [0x1229D]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1229D,
+ },
+ [0x1229E]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1229E,
+ },
+ [0x1229F]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES SAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1229F,
+ },
+ [0x122A0]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES SHID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A0,
+ },
+ [0x122A1]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES TAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A1,
+ },
+ [0x122A2]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES U0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A2,
+ },
+ [0x122A3]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES UB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A3,
+ },
+ [0x122A4]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES UM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A4,
+ },
+ [0x122A5]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES UR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A5,
+ },
+ [0x122A6]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG TIMES USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A6,
+ },
+ [0x122A7]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG OVER SAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A7,
+ },
+ [0x122A8]={
+ category="lo",
+ description="CUNEIFORM SIGN SAG GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A8,
+ },
+ [0x122A9]={
+ category="lo",
+ description="CUNEIFORM SIGN SAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122A9,
+ },
+ [0x122AA]={
+ category="lo",
+ description="CUNEIFORM SIGN SAL LAGAB TIMES ASH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122AA,
+ },
+ [0x122AB]={
+ category="lo",
+ description="CUNEIFORM SIGN SANGA0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122AB,
+ },
+ [0x122AC]={
+ category="lo",
+ description="CUNEIFORM SIGN SAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122AC,
+ },
+ [0x122AD]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122AD,
+ },
+ [0x122AE]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122AE,
+ },
+ [0x122AF]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122AF,
+ },
+ [0x122B0]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B0,
+ },
+ [0x122B1]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES GISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B1,
+ },
+ [0x122B2]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES NE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B2,
+ },
+ [0x122B3]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES SHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B3,
+ },
+ [0x122B4]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES TUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B4,
+ },
+ [0x122B5]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B5,
+ },
+ [0x122B6]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0003 TIMES U PLUS A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B6,
+ },
+ [0x122B7]={
+ category="lo",
+ description="CUNEIFORM SIGN SHA0x0006",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B7,
+ },
+ [0x122B8]={
+ category="lo",
+ description="CUNEIFORM SIGN SHAB0x0006",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B8,
+ },
+ [0x122B9]={
+ category="lo",
+ description="CUNEIFORM SIGN SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122B9,
+ },
+ [0x122BA]={
+ category="lo",
+ description="CUNEIFORM SIGN SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122BA,
+ },
+ [0x122BB]={
+ category="lo",
+ description="CUNEIFORM SIGN SHE HU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122BB,
+ },
+ [0x122BC]={
+ category="lo",
+ description="CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122BC,
+ },
+ [0x122BD]={
+ category="lo",
+ description="CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122BD,
+ },
+ [0x122BE]={
+ category="lo",
+ description="CUNEIFORM SIGN SHEG0x0009",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122BE,
+ },
+ [0x122BF]={
+ category="lo",
+ description="CUNEIFORM SIGN SHEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122BF,
+ },
+ [0x122C0]={
+ category="lo",
+ description="CUNEIFORM SIGN SHESH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C0,
+ },
+ [0x122C1]={
+ category="lo",
+ description="CUNEIFORM SIGN SHESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C1,
+ },
+ [0x122C2]={
+ category="lo",
+ description="CUNEIFORM SIGN SHESHLAM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C2,
+ },
+ [0x122C3]={
+ category="lo",
+ description="CUNEIFORM SIGN SHID",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C3,
+ },
+ [0x122C4]={
+ category="lo",
+ description="CUNEIFORM SIGN SHID TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C4,
+ },
+ [0x122C5]={
+ category="lo",
+ description="CUNEIFORM SIGN SHID TIMES IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C5,
+ },
+ [0x122C6]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C6,
+ },
+ [0x122C7]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C7,
+ },
+ [0x122C8]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES BAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C8,
+ },
+ [0x122C9]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES BULUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122C9,
+ },
+ [0x122CA]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES DIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122CA,
+ },
+ [0x122CB]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122CB,
+ },
+ [0x122CC]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122CC,
+ },
+ [0x122CD]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES IGI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122CD,
+ },
+ [0x122CE]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES KUSHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122CE,
+ },
+ [0x122CF]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES LUL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122CF,
+ },
+ [0x122D0]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES MUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D0,
+ },
+ [0x122D1]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIM TIMES SAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D1,
+ },
+ [0x122D2]={
+ category="lo",
+ description="CUNEIFORM SIGN SHINIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D2,
+ },
+ [0x122D3]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D3,
+ },
+ [0x122D4]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIR TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D4,
+ },
+ [0x122D5]={
+ category="lo",
+ description="CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D5,
+ },
+ [0x122D6]={
+ category="lo",
+ description="CUNEIFORM SIGN SHITA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D6,
+ },
+ [0x122D7]={
+ category="lo",
+ description="CUNEIFORM SIGN SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D7,
+ },
+ [0x122D8]={
+ category="lo",
+ description="CUNEIFORM SIGN SHU OVER INVERTED SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D8,
+ },
+ [0x122D9]={
+ category="lo",
+ description="CUNEIFORM SIGN SHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122D9,
+ },
+ [0x122DA]={
+ category="lo",
+ description="CUNEIFORM SIGN SHUBUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122DA,
+ },
+ [0x122DB]={
+ category="lo",
+ description="CUNEIFORM SIGN SI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122DB,
+ },
+ [0x122DC]={
+ category="lo",
+ description="CUNEIFORM SIGN SI GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122DC,
+ },
+ [0x122DD]={
+ category="lo",
+ description="CUNEIFORM SIGN SIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122DD,
+ },
+ [0x122DE]={
+ category="lo",
+ description="CUNEIFORM SIGN SIG0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122DE,
+ },
+ [0x122DF]={
+ category="lo",
+ description="CUNEIFORM SIGN SIG0x0004 OVER SIG0x0004 SHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122DF,
+ },
+ [0x122E0]={
+ category="lo",
+ description="CUNEIFORM SIGN SIK0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E0,
+ },
+ [0x122E1]={
+ category="lo",
+ description="CUNEIFORM SIGN SILA0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E1,
+ },
+ [0x122E2]={
+ category="lo",
+ description="CUNEIFORM SIGN SU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E2,
+ },
+ [0x122E3]={
+ category="lo",
+ description="CUNEIFORM SIGN SU OVER SU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E3,
+ },
+ [0x122E4]={
+ category="lo",
+ description="CUNEIFORM SIGN SUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E4,
+ },
+ [0x122E5]={
+ category="lo",
+ description="CUNEIFORM SIGN SUD0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E5,
+ },
+ [0x122E6]={
+ category="lo",
+ description="CUNEIFORM SIGN SUHUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E6,
+ },
+ [0x122E7]={
+ category="lo",
+ description="CUNEIFORM SIGN SUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E7,
+ },
+ [0x122E8]={
+ category="lo",
+ description="CUNEIFORM SIGN SUMASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E8,
+ },
+ [0x122E9]={
+ category="lo",
+ description="CUNEIFORM SIGN SUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122E9,
+ },
+ [0x122EA]={
+ category="lo",
+ description="CUNEIFORM SIGN SUR0x0009",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122EA,
+ },
+ [0x122EB]={
+ category="lo",
+ description="CUNEIFORM SIGN TA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122EB,
+ },
+ [0x122EC]={
+ category="lo",
+ description="CUNEIFORM SIGN TA ASTERISK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122EC,
+ },
+ [0x122ED]={
+ category="lo",
+ description="CUNEIFORM SIGN TA TIMES HI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122ED,
+ },
+ [0x122EE]={
+ category="lo",
+ description="CUNEIFORM SIGN TA TIMES MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122EE,
+ },
+ [0x122EF]={
+ category="lo",
+ description="CUNEIFORM SIGN TA GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122EF,
+ },
+ [0x122F0]={
+ category="lo",
+ description="CUNEIFORM SIGN TAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F0,
+ },
+ [0x122F1]={
+ category="lo",
+ description="CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F1,
+ },
+ [0x122F2]={
+ category="lo",
+ description="CUNEIFORM SIGN TAB SQUARED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F2,
+ },
+ [0x122F3]={
+ category="lo",
+ description="CUNEIFORM SIGN TAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F3,
+ },
+ [0x122F4]={
+ category="lo",
+ description="CUNEIFORM SIGN TAG TIMES BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F4,
+ },
+ [0x122F5]={
+ category="lo",
+ description="CUNEIFORM SIGN TAG TIMES GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F5,
+ },
+ [0x122F6]={
+ category="lo",
+ description="CUNEIFORM SIGN TAG TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F6,
+ },
+ [0x122F7]={
+ category="lo",
+ description="CUNEIFORM SIGN TAG TIMES SHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F7,
+ },
+ [0x122F8]={
+ category="lo",
+ description="CUNEIFORM SIGN TAG TIMES TUG0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F8,
+ },
+ [0x122F9]={
+ category="lo",
+ description="CUNEIFORM SIGN TAG TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122F9,
+ },
+ [0x122FA]={
+ category="lo",
+ description="CUNEIFORM SIGN TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122FA,
+ },
+ [0x122FB]={
+ category="lo",
+ description="CUNEIFORM SIGN TAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122FB,
+ },
+ [0x122FC]={
+ category="lo",
+ description="CUNEIFORM SIGN TE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122FC,
+ },
+ [0x122FD]={
+ category="lo",
+ description="CUNEIFORM SIGN TE GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122FD,
+ },
+ [0x122FE]={
+ category="lo",
+ description="CUNEIFORM SIGN TI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122FE,
+ },
+ [0x122FF]={
+ category="lo",
+ description="CUNEIFORM SIGN TI TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x122FF,
+ },
+ [0x12300]={
+ category="lo",
+ description="CUNEIFORM SIGN TIL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12300,
+ },
+ [0x12301]={
+ category="lo",
+ description="CUNEIFORM SIGN TIR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12301,
+ },
+ [0x12302]={
+ category="lo",
+ description="CUNEIFORM SIGN TIR TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12302,
+ },
+ [0x12303]={
+ category="lo",
+ description="CUNEIFORM SIGN TIR OVER TIR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12303,
+ },
+ [0x12304]={
+ category="lo",
+ description="CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12304,
+ },
+ [0x12305]={
+ category="lo",
+ description="CUNEIFORM SIGN TU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12305,
+ },
+ [0x12306]={
+ category="lo",
+ description="CUNEIFORM SIGN TUG0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12306,
+ },
+ [0x12307]={
+ category="lo",
+ description="CUNEIFORM SIGN TUK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12307,
+ },
+ [0x12308]={
+ category="lo",
+ description="CUNEIFORM SIGN TUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12308,
+ },
+ [0x12309]={
+ category="lo",
+ description="CUNEIFORM SIGN TUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12309,
+ },
+ [0x1230A]={
+ category="lo",
+ description="CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1230A,
+ },
+ [0x1230B]={
+ category="lo",
+ description="CUNEIFORM SIGN U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1230B,
+ },
+ [0x1230C]={
+ category="lo",
+ description="CUNEIFORM SIGN U GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1230C,
+ },
+ [0x1230D]={
+ category="lo",
+ description="CUNEIFORM SIGN U U U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1230D,
+ },
+ [0x1230E]={
+ category="lo",
+ description="CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1230E,
+ },
+ [0x1230F]={
+ category="lo",
+ description="CUNEIFORM SIGN U OVER U SUR OVER SUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1230F,
+ },
+ [0x12310]={
+ category="lo",
+ description="CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12310,
+ },
+ [0x12311]={
+ category="lo",
+ description="CUNEIFORM SIGN U0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12311,
+ },
+ [0x12312]={
+ category="lo",
+ description="CUNEIFORM SIGN UB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12312,
+ },
+ [0x12313]={
+ category="lo",
+ description="CUNEIFORM SIGN UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12313,
+ },
+ [0x12314]={
+ category="lo",
+ description="CUNEIFORM SIGN UD KUSHU0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12314,
+ },
+ [0x12315]={
+ category="lo",
+ description="CUNEIFORM SIGN UD TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12315,
+ },
+ [0x12316]={
+ category="lo",
+ description="CUNEIFORM SIGN UD TIMES MI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12316,
+ },
+ [0x12317]={
+ category="lo",
+ description="CUNEIFORM SIGN UD TIMES U PLUS U PLUS U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12317,
+ },
+ [0x12318]={
+ category="lo",
+ description="CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12318,
+ },
+ [0x12319]={
+ category="lo",
+ description="CUNEIFORM SIGN UD GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12319,
+ },
+ [0x1231A]={
+ category="lo",
+ description="CUNEIFORM SIGN UD SHESHIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1231A,
+ },
+ [0x1231B]={
+ category="lo",
+ description="CUNEIFORM SIGN UD SHESHIG TIMES BAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1231B,
+ },
+ [0x1231C]={
+ category="lo",
+ description="CUNEIFORM SIGN UDUG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1231C,
+ },
+ [0x1231D]={
+ category="lo",
+ description="CUNEIFORM SIGN UM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1231D,
+ },
+ [0x1231E]={
+ category="lo",
+ description="CUNEIFORM SIGN UM TIMES LAGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1231E,
+ },
+ [0x1231F]={
+ category="lo",
+ description="CUNEIFORM SIGN UM TIMES ME PLUS DA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1231F,
+ },
+ [0x12320]={
+ category="lo",
+ description="CUNEIFORM SIGN UM TIMES SHA0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12320,
+ },
+ [0x12321]={
+ category="lo",
+ description="CUNEIFORM SIGN UM TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12321,
+ },
+ [0x12322]={
+ category="lo",
+ description="CUNEIFORM SIGN UMBIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12322,
+ },
+ [0x12323]={
+ category="lo",
+ description="CUNEIFORM SIGN UMUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12323,
+ },
+ [0x12324]={
+ category="lo",
+ description="CUNEIFORM SIGN UMUM TIMES KASKAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12324,
+ },
+ [0x12325]={
+ category="lo",
+ description="CUNEIFORM SIGN UMUM TIMES PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12325,
+ },
+ [0x12326]={
+ category="lo",
+ description="CUNEIFORM SIGN UN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12326,
+ },
+ [0x12327]={
+ category="lo",
+ description="CUNEIFORM SIGN UN GUNU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12327,
+ },
+ [0x12328]={
+ category="lo",
+ description="CUNEIFORM SIGN UR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12328,
+ },
+ [0x12329]={
+ category="lo",
+ description="CUNEIFORM SIGN UR CROSSING UR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12329,
+ },
+ [0x1232A]={
+ category="lo",
+ description="CUNEIFORM SIGN UR SHESHIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1232A,
+ },
+ [0x1232B]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1232B,
+ },
+ [0x1232C]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES A PLUS HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1232C,
+ },
+ [0x1232D]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES A PLUS NA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1232D,
+ },
+ [0x1232E]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES AL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1232E,
+ },
+ [0x1232F]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1232F,
+ },
+ [0x12330]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES NUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12330,
+ },
+ [0x12331]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12331,
+ },
+ [0x12332]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002 PLUS ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12332,
+ },
+ [0x12333]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0002 TIMES U0x0002 PLUS BI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12333,
+ },
+ [0x12334]={
+ category="lo",
+ description="CUNEIFORM SIGN UR0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12334,
+ },
+ [0x12335]={
+ category="lo",
+ description="CUNEIFORM SIGN URI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12335,
+ },
+ [0x12336]={
+ category="lo",
+ description="CUNEIFORM SIGN URI0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12336,
+ },
+ [0x12337]={
+ category="lo",
+ description="CUNEIFORM SIGN URU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12337,
+ },
+ [0x12338]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12338,
+ },
+ [0x12339]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES ASHGAB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12339,
+ },
+ [0x1233A]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES BAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1233A,
+ },
+ [0x1233B]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES DUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1233B,
+ },
+ [0x1233C]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1233C,
+ },
+ [0x1233D]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES GAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1233D,
+ },
+ [0x1233E]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES GAN0x0002 TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1233E,
+ },
+ [0x1233F]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES GAR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1233F,
+ },
+ [0x12340]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES GU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12340,
+ },
+ [0x12341]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES HA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12341,
+ },
+ [0x12342]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES IGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12342,
+ },
+ [0x12343]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES IM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12343,
+ },
+ [0x12344]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES ISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12344,
+ },
+ [0x12345]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES KI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12345,
+ },
+ [0x12346]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES LUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12346,
+ },
+ [0x12347]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES MIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12347,
+ },
+ [0x12348]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12348,
+ },
+ [0x12349]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES SHE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12349,
+ },
+ [0x1234A]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES SIG0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1234A,
+ },
+ [0x1234B]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES TU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1234B,
+ },
+ [0x1234C]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES U PLUS GUD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1234C,
+ },
+ [0x1234D]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES UD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1234D,
+ },
+ [0x1234E]={
+ category="lo",
+ description="CUNEIFORM SIGN URU TIMES URUDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1234E,
+ },
+ [0x1234F]={
+ category="lo",
+ description="CUNEIFORM SIGN URUDA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1234F,
+ },
+ [0x12350]={
+ category="lo",
+ description="CUNEIFORM SIGN URUDA TIMES U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12350,
+ },
+ [0x12351]={
+ category="lo",
+ description="CUNEIFORM SIGN USH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12351,
+ },
+ [0x12352]={
+ category="lo",
+ description="CUNEIFORM SIGN USH TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12352,
+ },
+ [0x12353]={
+ category="lo",
+ description="CUNEIFORM SIGN USH TIMES KU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12353,
+ },
+ [0x12354]={
+ category="lo",
+ description="CUNEIFORM SIGN USH TIMES KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12354,
+ },
+ [0x12355]={
+ category="lo",
+ description="CUNEIFORM SIGN USH TIMES TAK0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12355,
+ },
+ [0x12356]={
+ category="lo",
+ description="CUNEIFORM SIGN USHX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12356,
+ },
+ [0x12357]={
+ category="lo",
+ description="CUNEIFORM SIGN USH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12357,
+ },
+ [0x12358]={
+ category="lo",
+ description="CUNEIFORM SIGN USHUMX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12358,
+ },
+ [0x12359]={
+ category="lo",
+ description="CUNEIFORM SIGN UTUKI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12359,
+ },
+ [0x1235A]={
+ category="lo",
+ description="CUNEIFORM SIGN UZ0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1235A,
+ },
+ [0x1235B]={
+ category="lo",
+ description="CUNEIFORM SIGN UZ0x0003 TIMES KASKAL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1235B,
+ },
+ [0x1235C]={
+ category="lo",
+ description="CUNEIFORM SIGN UZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1235C,
+ },
+ [0x1235D]={
+ category="lo",
+ description="CUNEIFORM SIGN ZA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1235D,
+ },
+ [0x1235E]={
+ category="lo",
+ description="CUNEIFORM SIGN ZA TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1235E,
+ },
+ [0x1235F]={
+ category="lo",
+ description="CUNEIFORM SIGN ZA SQUARED TIMES KUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1235F,
+ },
+ [0x12360]={
+ category="lo",
+ description="CUNEIFORM SIGN ZAG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12360,
+ },
+ [0x12361]={
+ category="lo",
+ description="CUNEIFORM SIGN ZAMX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12361,
+ },
+ [0x12362]={
+ category="lo",
+ description="CUNEIFORM SIGN ZE0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12362,
+ },
+ [0x12363]={
+ category="lo",
+ description="CUNEIFORM SIGN ZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12363,
+ },
+ [0x12364]={
+ category="lo",
+ description="CUNEIFORM SIGN ZI OVER ZI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12364,
+ },
+ [0x12365]={
+ category="lo",
+ description="CUNEIFORM SIGN ZI0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12365,
+ },
+ [0x12366]={
+ category="lo",
+ description="CUNEIFORM SIGN ZIB",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12366,
+ },
+ [0x12367]={
+ category="lo",
+ description="CUNEIFORM SIGN ZIB KABA TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12367,
+ },
+ [0x12368]={
+ category="lo",
+ description="CUNEIFORM SIGN ZIG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12368,
+ },
+ [0x12369]={
+ category="lo",
+ description="CUNEIFORM SIGN ZIZ0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12369,
+ },
+ [0x1236A]={
+ category="lo",
+ description="CUNEIFORM SIGN ZU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1236A,
+ },
+ [0x1236B]={
+ category="lo",
+ description="CUNEIFORM SIGN ZU0x0005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1236B,
+ },
+ [0x1236C]={
+ category="lo",
+ description="CUNEIFORM SIGN ZU0x0005 TIMES A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1236C,
+ },
+ [0x1236D]={
+ category="lo",
+ description="CUNEIFORM SIGN ZUBUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1236D,
+ },
+ [0x1236E]={
+ category="lo",
+ description="CUNEIFORM SIGN ZUM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1236E,
+ },
+ [0x12400]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12400,
+ },
+ [0x12401]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12401,
+ },
+ [0x12402]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12402,
+ },
+ [0x12403]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12403,
+ },
+ [0x12404]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12404,
+ },
+ [0x12405]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12405,
+ },
+ [0x12406]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12406,
+ },
+ [0x12407]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12407,
+ },
+ [0x12408]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12408,
+ },
+ [0x12409]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12409,
+ },
+ [0x1240A]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1240A,
+ },
+ [0x1240B]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1240B,
+ },
+ [0x1240C]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1240C,
+ },
+ [0x1240D]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1240D,
+ },
+ [0x1240E]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1240E,
+ },
+ [0x1240F]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1240F,
+ },
+ [0x12410]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12410,
+ },
+ [0x12411]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12411,
+ },
+ [0x12412]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12412,
+ },
+ [0x12413]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12413,
+ },
+ [0x12414]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE U",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12414,
+ },
+ [0x12415]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12415,
+ },
+ [0x12416]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12416,
+ },
+ [0x12417]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12417,
+ },
+ [0x12418]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12418,
+ },
+ [0x12419]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12419,
+ },
+ [0x1241A]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1241A,
+ },
+ [0x1241B]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1241B,
+ },
+ [0x1241C]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1241C,
+ },
+ [0x1241D]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE GESH0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1241D,
+ },
+ [0x1241E]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE GESHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1241E,
+ },
+ [0x1241F]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO GESHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1241F,
+ },
+ [0x12420]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE GESHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12420,
+ },
+ [0x12421]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR GESHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12421,
+ },
+ [0x12422]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE GESHU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12422,
+ },
+ [0x12423]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12423,
+ },
+ [0x12424]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12424,
+ },
+ [0x12425]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE SHAR0x0002 VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12425,
+ },
+ [0x12426]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12426,
+ },
+ [0x12427]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12427,
+ },
+ [0x12428]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12428,
+ },
+ [0x12429]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12429,
+ },
+ [0x1242A]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1242A,
+ },
+ [0x1242B]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE SHAR0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1242B,
+ },
+ [0x1242C]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE SHARU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1242C,
+ },
+ [0x1242D]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO SHARU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1242D,
+ },
+ [0x1242E]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE SHARU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1242E,
+ },
+ [0x1242F]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1242F,
+ },
+ [0x12430]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR SHARU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12430,
+ },
+ [0x12431]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE SHARU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12431,
+ },
+ [0x12432]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SHAR0x0002 TIMES GAL PLUS DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12432,
+ },
+ [0x12433]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SHAR0x0002 TIMES GAL PLUS MIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12433,
+ },
+ [0x12434]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE BURU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12434,
+ },
+ [0x12435]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO BURU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12435,
+ },
+ [0x12436]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE BURU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12436,
+ },
+ [0x12437]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12437,
+ },
+ [0x12438]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR BURU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12438,
+ },
+ [0x12439]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE BURU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12439,
+ },
+ [0x1243A]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH0x0010",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1243A,
+ },
+ [0x1243B]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH0x0015",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1243B,
+ },
+ [0x1243C]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1243C,
+ },
+ [0x1243D]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1243D,
+ },
+ [0x1243E]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1243E,
+ },
+ [0x1243F]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1243F,
+ },
+ [0x12440]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH0x0009",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12440,
+ },
+ [0x12441]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12441,
+ },
+ [0x12442]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12442,
+ },
+ [0x12443]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12443,
+ },
+ [0x12444]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12444,
+ },
+ [0x12445]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12445,
+ },
+ [0x12446]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12446,
+ },
+ [0x12447]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12447,
+ },
+ [0x12448]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12448,
+ },
+ [0x12449]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12449,
+ },
+ [0x1244A]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO ASH TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1244A,
+ },
+ [0x1244B]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE ASH TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1244B,
+ },
+ [0x1244C]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR ASH TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1244C,
+ },
+ [0x1244D]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE ASH TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1244D,
+ },
+ [0x1244E]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN SIX ASH TENU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1244E,
+ },
+ [0x1244F]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE BAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1244F,
+ },
+ [0x12450]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO BAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12450,
+ },
+ [0x12451]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN THREE BAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12451,
+ },
+ [0x12452]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR BAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12452,
+ },
+ [0x12453]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FOUR BAN0x0002 VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12453,
+ },
+ [0x12454]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE BAN0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12454,
+ },
+ [0x12455]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE BAN0x0002 VARIANT FORM",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12455,
+ },
+ [0x12456]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NIGIDAMIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12456,
+ },
+ [0x12457]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN NIGIDAESH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12457,
+ },
+ [0x12458]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE ESHE0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12458,
+ },
+ [0x12459]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO ESHE0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12459,
+ },
+ [0x1245A]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE THIRD DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1245A,
+ },
+ [0x1245B]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO THIRDS DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1245B,
+ },
+ [0x1245C]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1245C,
+ },
+ [0x1245D]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1245D,
+ },
+ [0x1245E]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1245E,
+ },
+ [0x1245F]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1245F,
+ },
+ [0x12460]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN ONE QUARTER ASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12460,
+ },
+ [0x12461]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12461,
+ },
+ [0x12462]={
+ category="nl",
+ description="CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x12462,
+ },
+ [0x12470]={
+ category="po",
+ description="CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x12470,
+ },
+ [0x12471]={
+ category="po",
+ description="CUNEIFORM PUNCTUATION SIGN VERTICAL COLON",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x12471,
+ },
+ [0x12472]={
+ category="po",
+ description="CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x12472,
+ },
+ [0x12473]={
+ category="po",
+ description="CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON",
+ direction="l",
+ linebreak="ba",
+ unicodeslot=0x12473,
+ },
+ [0x1D000]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PSILI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D000,
+ },
+ [0x1D001]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DASEIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D001,
+ },
+ [0x1D002]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PERISPOMENI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D002,
+ },
+ [0x1D003]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D003,
+ },
+ [0x1D004]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OXEIA DIPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D004,
+ },
+ [0x1D005]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D005,
+ },
+ [0x1D006]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL VAREIA DIPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D006,
+ },
+ [0x1D007]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KATHISTI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D007,
+ },
+ [0x1D008]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SYRMATIKI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D008,
+ },
+ [0x1D009]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PARAKLITIKI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D009,
+ },
+ [0x1D00A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YPOKRISIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D00A,
+ },
+ [0x1D00B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D00B,
+ },
+ [0x1D00C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KREMASTI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D00C,
+ },
+ [0x1D00D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D00D,
+ },
+ [0x1D00E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D00E,
+ },
+ [0x1D00F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TELEIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D00F,
+ },
+ [0x1D010]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D010,
+ },
+ [0x1D011]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APOSTROFOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D011,
+ },
+ [0x1D012]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D012,
+ },
+ [0x1D013]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SYNEVMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D013,
+ },
+ [0x1D014]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL THITA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D014,
+ },
+ [0x1D015]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D015,
+ },
+ [0x1D016]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORGON ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D016,
+ },
+ [0x1D017]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PSILON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D017,
+ },
+ [0x1D018]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL CHAMILON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D018,
+ },
+ [0x1D019]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL VATHY",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D019,
+ },
+ [0x1D01A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ISON ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D01A,
+ },
+ [0x1D01B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D01B,
+ },
+ [0x1D01C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D01C,
+ },
+ [0x1D01D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SAXIMATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D01D,
+ },
+ [0x1D01E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PARICHON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D01E,
+ },
+ [0x1D01F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D01F,
+ },
+ [0x1D020]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D020,
+ },
+ [0x1D021]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D021,
+ },
+ [0x1D022]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D022,
+ },
+ [0x1D023]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APOTHEMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D023,
+ },
+ [0x1D024]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KLASMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D024,
+ },
+ [0x1D025]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL REVMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D025,
+ },
+ [0x1D026]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D026,
+ },
+ [0x1D027]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TINAGMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D027,
+ },
+ [0x1D028]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ANATRICHISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D028,
+ },
+ [0x1D029]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SEISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D029,
+ },
+ [0x1D02A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D02A,
+ },
+ [0x1D02B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D02B,
+ },
+ [0x1D02C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D02C,
+ },
+ [0x1D02D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL THEMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D02D,
+ },
+ [0x1D02E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL LEMOI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D02E,
+ },
+ [0x1D02F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DYO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D02F,
+ },
+ [0x1D030]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TRIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D030,
+ },
+ [0x1D031]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TESSERA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D031,
+ },
+ [0x1D032]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KRATIMATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D032,
+ },
+ [0x1D033]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APESO EXO NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D033,
+ },
+ [0x1D034]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D034,
+ },
+ [0x1D035]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL IMIFTHORA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D035,
+ },
+ [0x1D036]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D036,
+ },
+ [0x1D037]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D037,
+ },
+ [0x1D038]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PELASTON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D038,
+ },
+ [0x1D039]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PSIFISTON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D039,
+ },
+ [0x1D03A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KONTEVMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D03A,
+ },
+ [0x1D03B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D03B,
+ },
+ [0x1D03C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL RAPISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D03C,
+ },
+ [0x1D03D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D03D,
+ },
+ [0x1D03E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D03E,
+ },
+ [0x1D03F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ICHADIN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D03F,
+ },
+ [0x1D040]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL NANA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D040,
+ },
+ [0x1D041]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PETASMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D041,
+ },
+ [0x1D042]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D042,
+ },
+ [0x1D043]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TROMIKON ALLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D043,
+ },
+ [0x1D044]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL STRAGGISMATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D044,
+ },
+ [0x1D045]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GRONTHISMATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D045,
+ },
+ [0x1D046]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ISON NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D046,
+ },
+ [0x1D047]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OLIGON NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D047,
+ },
+ [0x1D048]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OXEIA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D048,
+ },
+ [0x1D049]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PETASTI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D049,
+ },
+ [0x1D04A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KOUFISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D04A,
+ },
+ [0x1D04B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D04B,
+ },
+ [0x1D04C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D04C,
+ },
+ [0x1D04D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PELASTON NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D04D,
+ },
+ [0x1D04E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D04E,
+ },
+ [0x1D04F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D04F,
+ },
+ [0x1D050]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YPSILI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D050,
+ },
+ [0x1D051]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D051,
+ },
+ [0x1D052]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D052,
+ },
+ [0x1D053]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YPORROI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D053,
+ },
+ [0x1D054]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D054,
+ },
+ [0x1D055]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ELAFRON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D055,
+ },
+ [0x1D056]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL CHAMILI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D056,
+ },
+ [0x1D057]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MIKRON ISON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D057,
+ },
+ [0x1D058]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL VAREIA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D058,
+ },
+ [0x1D059]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PIASMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D059,
+ },
+ [0x1D05A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PSIFISTON NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D05A,
+ },
+ [0x1D05B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OMALON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D05B,
+ },
+ [0x1D05C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ANTIKENOMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D05C,
+ },
+ [0x1D05D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL LYGISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D05D,
+ },
+ [0x1D05E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D05E,
+ },
+ [0x1D05F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D05F,
+ },
+ [0x1D060]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D060,
+ },
+ [0x1D061]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KYLISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D061,
+ },
+ [0x1D062]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D062,
+ },
+ [0x1D063]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TROMIKON NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D063,
+ },
+ [0x1D064]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL EKSTREPTON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D064,
+ },
+ [0x1D065]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SYNAGMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D065,
+ },
+ [0x1D066]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SYRMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D066,
+ },
+ [0x1D067]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL CHOREVMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D067,
+ },
+ [0x1D068]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL EPEGERMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D068,
+ },
+ [0x1D069]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SEISMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D069,
+ },
+ [0x1D06A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL XIRON KLASMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D06A,
+ },
+ [0x1D06B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D06B,
+ },
+ [0x1D06C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D06C,
+ },
+ [0x1D06D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D06D,
+ },
+ [0x1D06E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D06E,
+ },
+ [0x1D06F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D06F,
+ },
+ [0x1D070]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D070,
+ },
+ [0x1D071]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D071,
+ },
+ [0x1D072]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D072,
+ },
+ [0x1D073]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D073,
+ },
+ [0x1D074]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D074,
+ },
+ [0x1D075]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL OYRANISMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D075,
+ },
+ [0x1D076]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D076,
+ },
+ [0x1D077]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D077,
+ },
+ [0x1D078]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL THEMA APLOUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D078,
+ },
+ [0x1D079]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL THES KAI APOTHES",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D079,
+ },
+ [0x1D07A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KATAVASMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D07A,
+ },
+ [0x1D07B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ENDOFONON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D07B,
+ },
+ [0x1D07C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YFEN KATO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D07C,
+ },
+ [0x1D07D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YFEN ANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D07D,
+ },
+ [0x1D07E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL STAVROS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D07E,
+ },
+ [0x1D07F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KLASMA ANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D07F,
+ },
+ [0x1D080]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D080,
+ },
+ [0x1D081]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D081,
+ },
+ [0x1D082]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KRATIMA ALLO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D082,
+ },
+ [0x1D083]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KRATIMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D083,
+ },
+ [0x1D084]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APODERMA NEO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D084,
+ },
+ [0x1D085]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D085,
+ },
+ [0x1D086]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D086,
+ },
+ [0x1D087]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TRIPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D087,
+ },
+ [0x1D088]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TETRAPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D088,
+ },
+ [0x1D089]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KORONIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D089,
+ },
+ [0x1D08A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D08A,
+ },
+ [0x1D08B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D08B,
+ },
+ [0x1D08C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D08C,
+ },
+ [0x1D08D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D08D,
+ },
+ [0x1D08E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D08E,
+ },
+ [0x1D08F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORGON NEO ANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D08F,
+ },
+ [0x1D090]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D090,
+ },
+ [0x1D091]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D091,
+ },
+ [0x1D092]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIGORGON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D092,
+ },
+ [0x1D093]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D093,
+ },
+ [0x1D094]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D094,
+ },
+ [0x1D095]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D095,
+ },
+ [0x1D096]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL TRIGORGON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D096,
+ },
+ [0x1D097]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARGON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D097,
+ },
+ [0x1D098]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL IMIDIARGON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D098,
+ },
+ [0x1D099]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIARGON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D099,
+ },
+ [0x1D09A]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D09A,
+ },
+ [0x1D09B]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D09B,
+ },
+ [0x1D09C]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI ARGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D09C,
+ },
+ [0x1D09D]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI METRIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D09D,
+ },
+ [0x1D09E]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI MESI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D09E,
+ },
+ [0x1D09F]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI GORGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D09F,
+ },
+ [0x1D0A0]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A0,
+ },
+ [0x1D0A1]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A1,
+ },
+ [0x1D0A2]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A2,
+ },
+ [0x1D0A3]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A3,
+ },
+ [0x1D0A4]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A4,
+ },
+ [0x1D0A5]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A5,
+ },
+ [0x1D0A6]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A6,
+ },
+ [0x1D0A7]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A7,
+ },
+ [0x1D0A8]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A8,
+ },
+ [0x1D0A9]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0A9,
+ },
+ [0x1D0AA]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0AA,
+ },
+ [0x1D0AB]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0AB,
+ },
+ [0x1D0AC]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0AC,
+ },
+ [0x1D0AD]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0AD,
+ },
+ [0x1D0AE]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0AE,
+ },
+ [0x1D0AF]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0AF,
+ },
+ [0x1D0B0]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B0,
+ },
+ [0x1D0B1]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B1,
+ },
+ [0x1D0B2]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B2,
+ },
+ [0x1D0B3]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B3,
+ },
+ [0x1D0B4]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B4,
+ },
+ [0x1D0B5]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B5,
+ },
+ [0x1D0B6]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B6,
+ },
+ [0x1D0B7]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL IMIFONON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B7,
+ },
+ [0x1D0B8]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL IMIFTHORON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B8,
+ },
+ [0x1D0B9]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0B9,
+ },
+ [0x1D0BA]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0BA,
+ },
+ [0x1D0BB]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0BB,
+ },
+ [0x1D0BC]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0BC,
+ },
+ [0x1D0BD]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0BD,
+ },
+ [0x1D0BE]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0BE,
+ },
+ [0x1D0BF]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0BF,
+ },
+ [0x1D0C0]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C0,
+ },
+ [0x1D0C1]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C1,
+ },
+ [0x1D0C2]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C2,
+ },
+ [0x1D0C3]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C3,
+ },
+ [0x1D0C4]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C4,
+ },
+ [0x1D0C5]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C5,
+ },
+ [0x1D0C6]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C6,
+ },
+ [0x1D0C7]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA NENANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C7,
+ },
+ [0x1D0C8]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL CHROA ZYGOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C8,
+ },
+ [0x1D0C9]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL CHROA KLITON",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0C9,
+ },
+ [0x1D0CA]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL CHROA SPATHI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0CA,
+ },
+ [0x1D0CB]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0CB,
+ },
+ [0x1D0CC]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0CC,
+ },
+ [0x1D0CD]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0CD,
+ },
+ [0x1D0CE]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0CE,
+ },
+ [0x1D0CF]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0CF,
+ },
+ [0x1D0D0]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D0,
+ },
+ [0x1D0D1]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D1,
+ },
+ [0x1D0D2]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D2,
+ },
+ [0x1D0D3]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D3,
+ },
+ [0x1D0D4]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D4,
+ },
+ [0x1D0D5]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D5,
+ },
+ [0x1D0D6]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D6,
+ },
+ [0x1D0D7]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D7,
+ },
+ [0x1D0D8]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GENIKI DIESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D8,
+ },
+ [0x1D0D9]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GENIKI YFESIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0D9,
+ },
+ [0x1D0DA]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0DA,
+ },
+ [0x1D0DB]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0DB,
+ },
+ [0x1D0DC]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0DC,
+ },
+ [0x1D0DD]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0DD,
+ },
+ [0x1D0DE]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0DE,
+ },
+ [0x1D0DF]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0DF,
+ },
+ [0x1D0E0]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E0,
+ },
+ [0x1D0E1]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E1,
+ },
+ [0x1D0E2]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E2,
+ },
+ [0x1D0E3]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E3,
+ },
+ [0x1D0E4]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E4,
+ },
+ [0x1D0E5]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E5,
+ },
+ [0x1D0E6]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIGRAMMA GG",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E6,
+ },
+ [0x1D0E7]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E7,
+ },
+ [0x1D0E8]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL STIGMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E8,
+ },
+ [0x1D0E9]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARKTIKO PA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0E9,
+ },
+ [0x1D0EA]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARKTIKO VOU",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0EA,
+ },
+ [0x1D0EB]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARKTIKO GA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0EB,
+ },
+ [0x1D0EC]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARKTIKO DI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0EC,
+ },
+ [0x1D0ED]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARKTIKO KE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0ED,
+ },
+ [0x1D0EE]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARKTIKO ZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0EE,
+ },
+ [0x1D0EF]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL ARKTIKO NI",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0EF,
+ },
+ [0x1D0F0]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0F0,
+ },
+ [0x1D0F1]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0F1,
+ },
+ [0x1D0F2]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0F2,
+ },
+ [0x1D0F3]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0F3,
+ },
+ [0x1D0F4]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL KLASMA KATO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0F4,
+ },
+ [0x1D0F5]={
+ category="so",
+ description="BYZANTINE MUSICAL SYMBOL GORGON NEO KATO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D0F5,
+ },
+ [0x1D100]={
+ category="so",
+ description="MUSICAL SYMBOL SINGLE BARLINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D100,
+ },
+ [0x1D101]={
+ category="so",
+ description="MUSICAL SYMBOL DOUBLE BARLINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D101,
+ },
+ [0x1D102]={
+ category="so",
+ description="MUSICAL SYMBOL FINAL BARLINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D102,
+ },
+ [0x1D103]={
+ category="so",
+ description="MUSICAL SYMBOL REVERSE FINAL BARLINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D103,
+ },
+ [0x1D104]={
+ category="so",
+ description="MUSICAL SYMBOL DASHED BARLINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D104,
+ },
+ [0x1D105]={
+ category="so",
+ description="MUSICAL SYMBOL SHORT BARLINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D105,
+ },
+ [0x1D106]={
+ category="so",
+ description="MUSICAL SYMBOL LEFT REPEAT SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D106,
+ },
+ [0x1D107]={
+ category="so",
+ description="MUSICAL SYMBOL RIGHT REPEAT SIGN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D107,
+ },
+ [0x1D108]={
+ category="so",
+ description="MUSICAL SYMBOL REPEAT DOTS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D108,
+ },
+ [0x1D109]={
+ category="so",
+ description="MUSICAL SYMBOL DAL SEGNO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D109,
+ },
+ [0x1D10A]={
+ category="so",
+ description="MUSICAL SYMBOL DA CAPO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D10A,
+ },
+ [0x1D10B]={
+ category="so",
+ description="MUSICAL SYMBOL SEGNO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D10B,
+ },
+ [0x1D10C]={
+ category="so",
+ description="MUSICAL SYMBOL CODA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D10C,
+ },
+ [0x1D10D]={
+ category="so",
+ description="MUSICAL SYMBOL REPEATED FIGURE-0x0001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D10D,
+ },
+ [0x1D10E]={
+ category="so",
+ description="MUSICAL SYMBOL REPEATED FIGURE-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D10E,
+ },
+ [0x1D10F]={
+ category="so",
+ description="MUSICAL SYMBOL REPEATED FIGURE-0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D10F,
+ },
+ [0x1D110]={
+ category="so",
+ description="MUSICAL SYMBOL FERMATA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D110,
+ },
+ [0x1D111]={
+ category="so",
+ description="MUSICAL SYMBOL FERMATA BELOW",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D111,
+ },
+ [0x1D112]={
+ category="so",
+ description="MUSICAL SYMBOL BREATH MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D112,
+ },
+ [0x1D113]={
+ category="so",
+ description="MUSICAL SYMBOL CAESURA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D113,
+ },
+ [0x1D114]={
+ category="so",
+ description="MUSICAL SYMBOL BRACE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D114,
+ },
+ [0x1D115]={
+ category="so",
+ description="MUSICAL SYMBOL BRACKET",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D115,
+ },
+ [0x1D116]={
+ category="so",
+ description="MUSICAL SYMBOL ONE-LINE STAFF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D116,
+ },
+ [0x1D117]={
+ category="so",
+ description="MUSICAL SYMBOL TWO-LINE STAFF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D117,
+ },
+ [0x1D118]={
+ category="so",
+ description="MUSICAL SYMBOL THREE-LINE STAFF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D118,
+ },
+ [0x1D119]={
+ category="so",
+ description="MUSICAL SYMBOL FOUR-LINE STAFF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D119,
+ },
+ [0x1D11A]={
+ category="so",
+ description="MUSICAL SYMBOL FIVE-LINE STAFF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D11A,
+ },
+ [0x1D11B]={
+ category="so",
+ description="MUSICAL SYMBOL SIX-LINE STAFF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D11B,
+ },
+ [0x1D11C]={
+ category="so",
+ description="MUSICAL SYMBOL SIX-STRING FRETBOARD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D11C,
+ },
+ [0x1D11D]={
+ category="so",
+ description="MUSICAL SYMBOL FOUR-STRING FRETBOARD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D11D,
+ },
+ [0x1D11E]={
+ category="so",
+ description="MUSICAL SYMBOL G CLEF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D11E,
+ },
+ [0x1D11F]={
+ category="so",
+ description="MUSICAL SYMBOL G CLEF OTTAVA ALTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D11F,
+ },
+ [0x1D120]={
+ category="so",
+ description="MUSICAL SYMBOL G CLEF OTTAVA BASSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D120,
+ },
+ [0x1D121]={
+ category="so",
+ description="MUSICAL SYMBOL C CLEF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D121,
+ },
+ [0x1D122]={
+ category="so",
+ description="MUSICAL SYMBOL F CLEF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D122,
+ },
+ [0x1D123]={
+ category="so",
+ description="MUSICAL SYMBOL F CLEF OTTAVA ALTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D123,
+ },
+ [0x1D124]={
+ category="so",
+ description="MUSICAL SYMBOL F CLEF OTTAVA BASSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D124,
+ },
+ [0x1D125]={
+ category="so",
+ description="MUSICAL SYMBOL DRUM CLEF-0x0001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D125,
+ },
+ [0x1D126]={
+ category="so",
+ description="MUSICAL SYMBOL DRUM CLEF-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D126,
+ },
+ [0x1D12A]={
+ category="so",
+ description="MUSICAL SYMBOL DOUBLE SHARP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D12A,
+ },
+ [0x1D12B]={
+ category="so",
+ description="MUSICAL SYMBOL DOUBLE FLAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D12B,
+ },
+ [0x1D12C]={
+ category="so",
+ description="MUSICAL SYMBOL FLAT UP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D12C,
+ },
+ [0x1D12D]={
+ category="so",
+ description="MUSICAL SYMBOL FLAT DOWN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D12D,
+ },
+ [0x1D12E]={
+ category="so",
+ description="MUSICAL SYMBOL NATURAL UP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D12E,
+ },
+ [0x1D12F]={
+ category="so",
+ description="MUSICAL SYMBOL NATURAL DOWN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D12F,
+ },
+ [0x1D130]={
+ category="so",
+ description="MUSICAL SYMBOL SHARP UP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D130,
+ },
+ [0x1D131]={
+ category="so",
+ description="MUSICAL SYMBOL SHARP DOWN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D131,
+ },
+ [0x1D132]={
+ category="so",
+ description="MUSICAL SYMBOL QUARTER TONE SHARP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D132,
+ },
+ [0x1D133]={
+ category="so",
+ description="MUSICAL SYMBOL QUARTER TONE FLAT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D133,
+ },
+ [0x1D134]={
+ category="so",
+ description="MUSICAL SYMBOL COMMON TIME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D134,
+ },
+ [0x1D135]={
+ category="so",
+ description="MUSICAL SYMBOL CUT TIME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D135,
+ },
+ [0x1D136]={
+ category="so",
+ description="MUSICAL SYMBOL OTTAVA ALTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D136,
+ },
+ [0x1D137]={
+ category="so",
+ description="MUSICAL SYMBOL OTTAVA BASSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D137,
+ },
+ [0x1D138]={
+ category="so",
+ description="MUSICAL SYMBOL QUINDICESIMA ALTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D138,
+ },
+ [0x1D139]={
+ category="so",
+ description="MUSICAL SYMBOL QUINDICESIMA BASSA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D139,
+ },
+ [0x1D13A]={
+ category="so",
+ description="MUSICAL SYMBOL MULTI REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D13A,
+ },
+ [0x1D13B]={
+ category="so",
+ description="MUSICAL SYMBOL WHOLE REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D13B,
+ },
+ [0x1D13C]={
+ category="so",
+ description="MUSICAL SYMBOL HALF REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D13C,
+ },
+ [0x1D13D]={
+ category="so",
+ description="MUSICAL SYMBOL QUARTER REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D13D,
+ },
+ [0x1D13E]={
+ category="so",
+ description="MUSICAL SYMBOL EIGHTH REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D13E,
+ },
+ [0x1D13F]={
+ category="so",
+ description="MUSICAL SYMBOL SIXTEENTH REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D13F,
+ },
+ [0x1D140]={
+ category="so",
+ description="MUSICAL SYMBOL THIRTY-SECOND REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D140,
+ },
+ [0x1D141]={
+ category="so",
+ description="MUSICAL SYMBOL SIXTY-FOURTH REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D141,
+ },
+ [0x1D142]={
+ category="so",
+ description="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D142,
+ },
+ [0x1D143]={
+ category="so",
+ description="MUSICAL SYMBOL X NOTEHEAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D143,
+ },
+ [0x1D144]={
+ category="so",
+ description="MUSICAL SYMBOL PLUS NOTEHEAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D144,
+ },
+ [0x1D145]={
+ category="so",
+ description="MUSICAL SYMBOL CIRCLE X NOTEHEAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D145,
+ },
+ [0x1D146]={
+ category="so",
+ description="MUSICAL SYMBOL SQUARE NOTEHEAD WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D146,
+ },
+ [0x1D147]={
+ category="so",
+ description="MUSICAL SYMBOL SQUARE NOTEHEAD BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D147,
+ },
+ [0x1D148]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D148,
+ },
+ [0x1D149]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D149,
+ },
+ [0x1D14A]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D14A,
+ },
+ [0x1D14B]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D14B,
+ },
+ [0x1D14C]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D14C,
+ },
+ [0x1D14D]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D14D,
+ },
+ [0x1D14E]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D14E,
+ },
+ [0x1D14F]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D14F,
+ },
+ [0x1D150]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D150,
+ },
+ [0x1D151]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D151,
+ },
+ [0x1D152]={
+ category="so",
+ description="MUSICAL SYMBOL MOON NOTEHEAD WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D152,
+ },
+ [0x1D153]={
+ category="so",
+ description="MUSICAL SYMBOL MOON NOTEHEAD BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D153,
+ },
+ [0x1D154]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D154,
+ },
+ [0x1D155]={
+ category="so",
+ description="MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D155,
+ },
+ [0x1D156]={
+ category="so",
+ description="MUSICAL SYMBOL PARENTHESIS NOTEHEAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D156,
+ },
+ [0x1D157]={
+ category="so",
+ description="MUSICAL SYMBOL VOID NOTEHEAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D157,
+ },
+ [0x1D158]={
+ category="so",
+ description="MUSICAL SYMBOL NOTEHEAD BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D158,
+ },
+ [0x1D159]={
+ category="so",
+ description="MUSICAL SYMBOL NULL NOTEHEAD",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D159,
+ },
+ [0x1D15A]={
+ category="so",
+ description="MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D15A,
+ },
+ [0x1D15B]={
+ category="so",
+ description="MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D15B,
+ },
+ [0x1D15C]={
+ category="so",
+ description="MUSICAL SYMBOL BREVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D15C,
+ },
+ [0x1D15D]={
+ category="so",
+ description="MUSICAL SYMBOL WHOLE NOTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D15D,
+ },
+ [0x1D15E]={
+ category="so",
+ description="MUSICAL SYMBOL HALF NOTE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D157, 0x1D165 },
+ unicodeslot=0x1D15E,
+ },
+ [0x1D15F]={
+ category="so",
+ description="MUSICAL SYMBOL QUARTER NOTE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D158, 0x1D165 },
+ unicodeslot=0x1D15F,
+ },
+ [0x1D160]={
+ category="so",
+ description="MUSICAL SYMBOL EIGHTH NOTE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D15F, 0x1D16E },
+ unicodeslot=0x1D160,
+ },
+ [0x1D161]={
+ category="so",
+ description="MUSICAL SYMBOL SIXTEENTH NOTE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D15F, 0x1D16F },
+ unicodeslot=0x1D161,
+ },
+ [0x1D162]={
+ category="so",
+ description="MUSICAL SYMBOL THIRTY-SECOND NOTE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D15F, 0x1D170 },
+ unicodeslot=0x1D162,
+ },
+ [0x1D163]={
+ category="so",
+ description="MUSICAL SYMBOL SIXTY-FOURTH NOTE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D15F, 0x1D171 },
+ unicodeslot=0x1D163,
+ },
+ [0x1D164]={
+ category="so",
+ description="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D15F, 0x1D172 },
+ unicodeslot=0x1D164,
+ },
+ [0x1D165]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING STEM",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D165,
+ },
+ [0x1D166]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING SPRECHGESANG STEM",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D166,
+ },
+ [0x1D167]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING TREMOLO-0x0001",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D167,
+ },
+ [0x1D168]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING TREMOLO-0x0002",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D168,
+ },
+ [0x1D169]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING TREMOLO-0x0003",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D169,
+ },
+ [0x1D16A]={
+ category="so",
+ description="MUSICAL SYMBOL FINGERED TREMOLO-0x0001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D16A,
+ },
+ [0x1D16B]={
+ category="so",
+ description="MUSICAL SYMBOL FINGERED TREMOLO-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D16B,
+ },
+ [0x1D16C]={
+ category="so",
+ description="MUSICAL SYMBOL FINGERED TREMOLO-0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D16C,
+ },
+ [0x1D16D]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING AUGMENTATION DOT",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D16D,
+ },
+ [0x1D16E]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING FLAG-0x0001",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D16E,
+ },
+ [0x1D16F]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING FLAG-0x0002",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D16F,
+ },
+ [0x1D170]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING FLAG-0x0003",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D170,
+ },
+ [0x1D171]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING FLAG-0x0004",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D171,
+ },
+ [0x1D172]={
+ category="mc",
+ description="MUSICAL SYMBOL COMBINING FLAG-0x0005",
+ direction="l",
+ linebreak="cm",
+ unicodeslot=0x1D172,
+ },
+ [0x1D173]={
+ category="cf",
+ description="MUSICAL SYMBOL BEGIN BEAM",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D173,
+ },
+ [0x1D174]={
+ category="cf",
+ description="MUSICAL SYMBOL END BEAM",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D174,
+ },
+ [0x1D175]={
+ category="cf",
+ description="MUSICAL SYMBOL BEGIN TIE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D175,
+ },
+ [0x1D176]={
+ category="cf",
+ description="MUSICAL SYMBOL END TIE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D176,
+ },
+ [0x1D177]={
+ category="cf",
+ description="MUSICAL SYMBOL BEGIN SLUR",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D177,
+ },
+ [0x1D178]={
+ category="cf",
+ description="MUSICAL SYMBOL END SLUR",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D178,
+ },
+ [0x1D179]={
+ category="cf",
+ description="MUSICAL SYMBOL BEGIN PHRASE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D179,
+ },
+ [0x1D17A]={
+ category="cf",
+ description="MUSICAL SYMBOL END PHRASE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0x1D17A,
+ },
+ [0x1D17B]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING ACCENT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17B,
+ },
+ [0x1D17C]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING STACCATO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17C,
+ },
+ [0x1D17D]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING TENUTO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17D,
+ },
+ [0x1D17E]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING STACCATISSIMO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17E,
+ },
+ [0x1D17F]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING MARCATO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D17F,
+ },
+ [0x1D180]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING MARCATO-STACCATO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D180,
+ },
+ [0x1D181]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING ACCENT-STACCATO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D181,
+ },
+ [0x1D182]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING LOURE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D182,
+ },
+ [0x1D183]={
+ category="so",
+ description="MUSICAL SYMBOL ARPEGGIATO UP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D183,
+ },
+ [0x1D184]={
+ category="so",
+ description="MUSICAL SYMBOL ARPEGGIATO DOWN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D184,
+ },
+ [0x1D185]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING DOIT",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D185,
+ },
+ [0x1D186]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING RIP",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D186,
+ },
+ [0x1D187]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING FLIP",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D187,
+ },
+ [0x1D188]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING SMEAR",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D188,
+ },
+ [0x1D189]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING BEND",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D189,
+ },
+ [0x1D18A]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING DOUBLE TONGUE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D18A,
+ },
+ [0x1D18B]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING TRIPLE TONGUE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D18B,
+ },
+ [0x1D18C]={
+ category="so",
+ description="MUSICAL SYMBOL RINFORZANDO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D18C,
+ },
+ [0x1D18D]={
+ category="so",
+ description="MUSICAL SYMBOL SUBITO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D18D,
+ },
+ [0x1D18E]={
+ category="so",
+ description="MUSICAL SYMBOL Z",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D18E,
+ },
+ [0x1D18F]={
+ category="so",
+ description="MUSICAL SYMBOL PIANO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D18F,
+ },
+ [0x1D190]={
+ category="so",
+ description="MUSICAL SYMBOL MEZZO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D190,
+ },
+ [0x1D191]={
+ category="so",
+ description="MUSICAL SYMBOL FORTE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D191,
+ },
+ [0x1D192]={
+ category="so",
+ description="MUSICAL SYMBOL CRESCENDO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D192,
+ },
+ [0x1D193]={
+ category="so",
+ description="MUSICAL SYMBOL DECRESCENDO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D193,
+ },
+ [0x1D194]={
+ category="so",
+ description="MUSICAL SYMBOL GRACE NOTE SLASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D194,
+ },
+ [0x1D195]={
+ category="so",
+ description="MUSICAL SYMBOL GRACE NOTE NO SLASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D195,
+ },
+ [0x1D196]={
+ category="so",
+ description="MUSICAL SYMBOL TR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D196,
+ },
+ [0x1D197]={
+ category="so",
+ description="MUSICAL SYMBOL TURN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D197,
+ },
+ [0x1D198]={
+ category="so",
+ description="MUSICAL SYMBOL INVERTED TURN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D198,
+ },
+ [0x1D199]={
+ category="so",
+ description="MUSICAL SYMBOL TURN SLASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D199,
+ },
+ [0x1D19A]={
+ category="so",
+ description="MUSICAL SYMBOL TURN UP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D19A,
+ },
+ [0x1D19B]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D19B,
+ },
+ [0x1D19C]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D19C,
+ },
+ [0x1D19D]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D19D,
+ },
+ [0x1D19E]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0004",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D19E,
+ },
+ [0x1D19F]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0005",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D19F,
+ },
+ [0x1D1A0]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0006",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A0,
+ },
+ [0x1D1A1]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0007",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A1,
+ },
+ [0x1D1A2]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0008",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A2,
+ },
+ [0x1D1A3]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x0009",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A3,
+ },
+ [0x1D1A4]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x000A",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A4,
+ },
+ [0x1D1A5]={
+ category="so",
+ description="MUSICAL SYMBOL ORNAMENT STROKE-0x000B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A5,
+ },
+ [0x1D1A6]={
+ category="so",
+ description="MUSICAL SYMBOL HAUPTSTIMME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A6,
+ },
+ [0x1D1A7]={
+ category="so",
+ description="MUSICAL SYMBOL NEBENSTIMME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A7,
+ },
+ [0x1D1A8]={
+ category="so",
+ description="MUSICAL SYMBOL END OF STIMME",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A8,
+ },
+ [0x1D1A9]={
+ category="so",
+ description="MUSICAL SYMBOL DEGREE SLASH",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1A9,
+ },
+ [0x1D1AA]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING DOWN BOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AA,
+ },
+ [0x1D1AB]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING UP BOW",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AB,
+ },
+ [0x1D1AC]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING HARMONIC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AC,
+ },
+ [0x1D1AD]={
+ category="mn",
+ description="MUSICAL SYMBOL COMBINING SNAP PIZZICATO",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D1AD,
+ },
+ [0x1D1AE]={
+ category="so",
+ description="MUSICAL SYMBOL PEDAL MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1AE,
+ },
+ [0x1D1AF]={
+ category="so",
+ description="MUSICAL SYMBOL PEDAL UP MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1AF,
+ },
+ [0x1D1B0]={
+ category="so",
+ description="MUSICAL SYMBOL HALF PEDAL MARK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B0,
+ },
+ [0x1D1B1]={
+ category="so",
+ description="MUSICAL SYMBOL GLISSANDO UP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B1,
+ },
+ [0x1D1B2]={
+ category="so",
+ description="MUSICAL SYMBOL GLISSANDO DOWN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B2,
+ },
+ [0x1D1B3]={
+ category="so",
+ description="MUSICAL SYMBOL WITH FINGERNAILS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B3,
+ },
+ [0x1D1B4]={
+ category="so",
+ description="MUSICAL SYMBOL DAMP",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B4,
+ },
+ [0x1D1B5]={
+ category="so",
+ description="MUSICAL SYMBOL DAMP ALL",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B5,
+ },
+ [0x1D1B6]={
+ category="so",
+ description="MUSICAL SYMBOL MAXIMA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B6,
+ },
+ [0x1D1B7]={
+ category="so",
+ description="MUSICAL SYMBOL LONGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B7,
+ },
+ [0x1D1B8]={
+ category="so",
+ description="MUSICAL SYMBOL BREVIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B8,
+ },
+ [0x1D1B9]={
+ category="so",
+ description="MUSICAL SYMBOL SEMIBREVIS WHITE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1B9,
+ },
+ [0x1D1BA]={
+ category="so",
+ description="MUSICAL SYMBOL SEMIBREVIS BLACK",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1BA,
+ },
+ [0x1D1BB]={
+ category="so",
+ description="MUSICAL SYMBOL MINIMA",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D1B9, 0x1D165 },
+ unicodeslot=0x1D1BB,
+ },
+ [0x1D1BC]={
+ category="so",
+ description="MUSICAL SYMBOL MINIMA BLACK",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D1BA, 0x1D165 },
+ unicodeslot=0x1D1BC,
+ },
+ [0x1D1BD]={
+ category="so",
+ description="MUSICAL SYMBOL SEMIMINIMA WHITE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D1BB, 0x1D16E },
+ unicodeslot=0x1D1BD,
+ },
+ [0x1D1BE]={
+ category="so",
+ description="MUSICAL SYMBOL SEMIMINIMA BLACK",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D1BC, 0x1D16E },
+ unicodeslot=0x1D1BE,
+ },
+ [0x1D1BF]={
+ category="so",
+ description="MUSICAL SYMBOL FUSA WHITE",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D1BB, 0x1D16F },
+ unicodeslot=0x1D1BF,
+ },
+ [0x1D1C0]={
+ category="so",
+ description="MUSICAL SYMBOL FUSA BLACK",
+ direction="l",
+ linebreak="al",
+ specials={ "char", 0x1D1BC, 0x1D16F },
+ unicodeslot=0x1D1C0,
+ },
+ [0x1D1C1]={
+ category="so",
+ description="MUSICAL SYMBOL LONGA PERFECTA REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C1,
+ },
+ [0x1D1C2]={
+ category="so",
+ description="MUSICAL SYMBOL LONGA IMPERFECTA REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C2,
+ },
+ [0x1D1C3]={
+ category="so",
+ description="MUSICAL SYMBOL BREVIS REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C3,
+ },
+ [0x1D1C4]={
+ category="so",
+ description="MUSICAL SYMBOL SEMIBREVIS REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C4,
+ },
+ [0x1D1C5]={
+ category="so",
+ description="MUSICAL SYMBOL MINIMA REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C5,
+ },
+ [0x1D1C6]={
+ category="so",
+ description="MUSICAL SYMBOL SEMIMINIMA REST",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C6,
+ },
+ [0x1D1C7]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C7,
+ },
+ [0x1D1C8]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C8,
+ },
+ [0x1D1C9]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-0x0001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1C9,
+ },
+ [0x1D1CA]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1CA,
+ },
+ [0x1D1CB]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1CB,
+ },
+ [0x1D1CC]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-0x0001",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1CC,
+ },
+ [0x1D1CD]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-0x0002",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1CD,
+ },
+ [0x1D1CE]={
+ category="so",
+ description="MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-0x0003",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1CE,
+ },
+ [0x1D1CF]={
+ category="so",
+ description="MUSICAL SYMBOL CROIX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1CF,
+ },
+ [0x1D1D0]={
+ category="so",
+ description="MUSICAL SYMBOL GREGORIAN C CLEF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D0,
+ },
+ [0x1D1D1]={
+ category="so",
+ description="MUSICAL SYMBOL GREGORIAN F CLEF",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D1,
+ },
+ [0x1D1D2]={
+ category="so",
+ description="MUSICAL SYMBOL SQUARE B",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D2,
+ },
+ [0x1D1D3]={
+ category="so",
+ description="MUSICAL SYMBOL VIRGA",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D3,
+ },
+ [0x1D1D4]={
+ category="so",
+ description="MUSICAL SYMBOL PODATUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D4,
+ },
+ [0x1D1D5]={
+ category="so",
+ description="MUSICAL SYMBOL CLIVIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D5,
+ },
+ [0x1D1D6]={
+ category="so",
+ description="MUSICAL SYMBOL SCANDICUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D6,
+ },
+ [0x1D1D7]={
+ category="so",
+ description="MUSICAL SYMBOL CLIMACUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D7,
+ },
+ [0x1D1D8]={
+ category="so",
+ description="MUSICAL SYMBOL TORCULUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D8,
+ },
+ [0x1D1D9]={
+ category="so",
+ description="MUSICAL SYMBOL PORRECTUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1D9,
+ },
+ [0x1D1DA]={
+ category="so",
+ description="MUSICAL SYMBOL PORRECTUS FLEXUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1DA,
+ },
+ [0x1D1DB]={
+ category="so",
+ description="MUSICAL SYMBOL SCANDICUS FLEXUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1DB,
+ },
+ [0x1D1DC]={
+ category="so",
+ description="MUSICAL SYMBOL TORCULUS RESUPINUS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1DC,
+ },
+ [0x1D1DD]={
+ category="so",
+ description="MUSICAL SYMBOL PES SUBPUNCTIS",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D1DD,
+ },
+ [0x1D200]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0001",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D200,
+ },
+ [0x1D201]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0002",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D201,
+ },
+ [0x1D202]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0003",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D202,
+ },
+ [0x1D203]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0004",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D203,
+ },
+ [0x1D204]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0005",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D204,
+ },
+ [0x1D205]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0006",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D205,
+ },
+ [0x1D206]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0007",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D206,
+ },
+ [0x1D207]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0008",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D207,
+ },
+ [0x1D208]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0009",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D208,
+ },
+ [0x1D209]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x000A",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D209,
+ },
+ [0x1D20A]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x000B",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D20A,
+ },
+ [0x1D20B]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x000C",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D20B,
+ },
+ [0x1D20C]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x000D",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D20C,
+ },
+ [0x1D20D]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x000E",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D20D,
+ },
+ [0x1D20E]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x000F",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D20E,
+ },
+ [0x1D20F]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0010",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D20F,
+ },
+ [0x1D210]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0011",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D210,
+ },
+ [0x1D211]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0012",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D211,
+ },
+ [0x1D212]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0013",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D212,
+ },
+ [0x1D213]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0014",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D213,
+ },
+ [0x1D214]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0015",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D214,
+ },
+ [0x1D215]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0016",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D215,
+ },
+ [0x1D216]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0017",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D216,
+ },
+ [0x1D217]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0018",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D217,
+ },
+ [0x1D218]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0032",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D218,
+ },
+ [0x1D219]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0033",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D219,
+ },
+ [0x1D21A]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0034",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D21A,
+ },
+ [0x1D21B]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0035",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D21B,
+ },
+ [0x1D21C]={
+ category="so",
+ description="GREEK VOCAL NOTATION SYMBOL-0x0036",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D21C,
+ },
+ [0x1D21D]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0001",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D21D,
+ },
+ [0x1D21E]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0002",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D21E,
+ },
+ [0x1D21F]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0004",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D21F,
+ },
+ [0x1D220]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0005",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D220,
+ },
+ [0x1D221]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0007",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D221,
+ },
+ [0x1D222]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0008",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D222,
+ },
+ [0x1D223]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x000B",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D223,
+ },
+ [0x1D224]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x000C",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D224,
+ },
+ [0x1D225]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x000D",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D225,
+ },
+ [0x1D226]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x000E",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D226,
+ },
+ [0x1D227]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0011",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D227,
+ },
+ [0x1D228]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0012",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D228,
+ },
+ [0x1D229]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0013",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D229,
+ },
+ [0x1D22A]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0017",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D22A,
+ },
+ [0x1D22B]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0018",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D22B,
+ },
+ [0x1D22C]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0019",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D22C,
+ },
+ [0x1D22D]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x001A",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D22D,
+ },
+ [0x1D22E]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x001B",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D22E,
+ },
+ [0x1D22F]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x001D",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D22F,
+ },
+ [0x1D230]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x001E",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D230,
+ },
+ [0x1D231]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0020",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D231,
+ },
+ [0x1D232]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0024",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D232,
+ },
+ [0x1D233]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0025",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D233,
+ },
+ [0x1D234]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0026",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D234,
+ },
+ [0x1D235]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0027",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D235,
+ },
+ [0x1D236]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0028",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D236,
+ },
+ [0x1D237]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x002A",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D237,
+ },
+ [0x1D238]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x002B",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D238,
+ },
+ [0x1D239]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x002D",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D239,
+ },
+ [0x1D23A]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x002F",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23A,
+ },
+ [0x1D23B]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0030",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23B,
+ },
+ [0x1D23C]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0031",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23C,
+ },
+ [0x1D23D]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0032",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23D,
+ },
+ [0x1D23E]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0033",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23E,
+ },
+ [0x1D23F]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0034",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D23F,
+ },
+ [0x1D240]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0035",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D240,
+ },
+ [0x1D241]={
+ category="so",
+ description="GREEK INSTRUMENTAL NOTATION SYMBOL-0x0036",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D241,
+ },
+ [0x1D242]={
+ category="mn",
+ description="COMBINING GREEK MUSICAL TRISEME",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D242,
+ },
+ [0x1D243]={
+ category="mn",
+ description="COMBINING GREEK MUSICAL TETRASEME",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D243,
+ },
+ [0x1D244]={
+ category="mn",
+ description="COMBINING GREEK MUSICAL PENTASEME",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0x1D244,
+ },
+ [0x1D245]={
+ category="so",
+ description="GREEK MUSICAL LEIMMA",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D245,
+ },
+ [0x1D300]={
+ category="so",
+ description="MONOGRAM FOR EARTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D300,
+ },
+ [0x1D301]={
+ category="so",
+ description="DIGRAM FOR HEAVENLY EARTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D301,
+ },
+ [0x1D302]={
+ category="so",
+ description="DIGRAM FOR HUMAN EARTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D302,
+ },
+ [0x1D303]={
+ category="so",
+ description="DIGRAM FOR EARTHLY HEAVEN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D303,
+ },
+ [0x1D304]={
+ category="so",
+ description="DIGRAM FOR EARTHLY HUMAN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D304,
+ },
+ [0x1D305]={
+ category="so",
+ description="DIGRAM FOR EARTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D305,
+ },
+ [0x1D306]={
+ category="so",
+ description="TETRAGRAM FOR CENTRE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D306,
+ },
+ [0x1D307]={
+ category="so",
+ description="TETRAGRAM FOR FULL CIRCLE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D307,
+ },
+ [0x1D308]={
+ category="so",
+ description="TETRAGRAM FOR MIRED",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D308,
+ },
+ [0x1D309]={
+ category="so",
+ description="TETRAGRAM FOR BARRIER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D309,
+ },
+ [0x1D30A]={
+ category="so",
+ description="TETRAGRAM FOR KEEPING SMALL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30A,
+ },
+ [0x1D30B]={
+ category="so",
+ description="TETRAGRAM FOR CONTRARIETY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30B,
+ },
+ [0x1D30C]={
+ category="so",
+ description="TETRAGRAM FOR ASCENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30C,
+ },
+ [0x1D30D]={
+ category="so",
+ description="TETRAGRAM FOR OPPOSITION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30D,
+ },
+ [0x1D30E]={
+ category="so",
+ description="TETRAGRAM FOR BRANCHING OUT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30E,
+ },
+ [0x1D30F]={
+ category="so",
+ description="TETRAGRAM FOR DEFECTIVENESS OR DISTORTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D30F,
+ },
+ [0x1D310]={
+ category="so",
+ description="TETRAGRAM FOR DIVERGENCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D310,
+ },
+ [0x1D311]={
+ category="so",
+ description="TETRAGRAM FOR YOUTHFULNESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D311,
+ },
+ [0x1D312]={
+ category="so",
+ description="TETRAGRAM FOR INCREASE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D312,
+ },
+ [0x1D313]={
+ category="so",
+ description="TETRAGRAM FOR PENETRATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D313,
+ },
+ [0x1D314]={
+ category="so",
+ description="TETRAGRAM FOR REACH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D314,
+ },
+ [0x1D315]={
+ category="so",
+ description="TETRAGRAM FOR CONTACT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D315,
+ },
+ [0x1D316]={
+ category="so",
+ description="TETRAGRAM FOR HOLDING BACK",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D316,
+ },
+ [0x1D317]={
+ category="so",
+ description="TETRAGRAM FOR WAITING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D317,
+ },
+ [0x1D318]={
+ category="so",
+ description="TETRAGRAM FOR FOLLOWING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D318,
+ },
+ [0x1D319]={
+ category="so",
+ description="TETRAGRAM FOR ADVANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D319,
+ },
+ [0x1D31A]={
+ category="so",
+ description="TETRAGRAM FOR RELEASE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31A,
+ },
+ [0x1D31B]={
+ category="so",
+ description="TETRAGRAM FOR RESISTANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31B,
+ },
+ [0x1D31C]={
+ category="so",
+ description="TETRAGRAM FOR EASE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31C,
+ },
+ [0x1D31D]={
+ category="so",
+ description="TETRAGRAM FOR JOY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31D,
+ },
+ [0x1D31E]={
+ category="so",
+ description="TETRAGRAM FOR CONTENTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31E,
+ },
+ [0x1D31F]={
+ category="so",
+ description="TETRAGRAM FOR ENDEAVOUR",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D31F,
+ },
+ [0x1D320]={
+ category="so",
+ description="TETRAGRAM FOR DUTIES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D320,
+ },
+ [0x1D321]={
+ category="so",
+ description="TETRAGRAM FOR CHANGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D321,
+ },
+ [0x1D322]={
+ category="so",
+ description="TETRAGRAM FOR DECISIVENESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D322,
+ },
+ [0x1D323]={
+ category="so",
+ description="TETRAGRAM FOR BOLD RESOLUTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D323,
+ },
+ [0x1D324]={
+ category="so",
+ description="TETRAGRAM FOR PACKING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D324,
+ },
+ [0x1D325]={
+ category="so",
+ description="TETRAGRAM FOR LEGION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D325,
+ },
+ [0x1D326]={
+ category="so",
+ description="TETRAGRAM FOR CLOSENESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D326,
+ },
+ [0x1D327]={
+ category="so",
+ description="TETRAGRAM FOR KINSHIP",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D327,
+ },
+ [0x1D328]={
+ category="so",
+ description="TETRAGRAM FOR GATHERING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D328,
+ },
+ [0x1D329]={
+ category="so",
+ description="TETRAGRAM FOR STRENGTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D329,
+ },
+ [0x1D32A]={
+ category="so",
+ description="TETRAGRAM FOR PURITY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32A,
+ },
+ [0x1D32B]={
+ category="so",
+ description="TETRAGRAM FOR FULLNESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32B,
+ },
+ [0x1D32C]={
+ category="so",
+ description="TETRAGRAM FOR RESIDENCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32C,
+ },
+ [0x1D32D]={
+ category="so",
+ description="TETRAGRAM FOR LAW OR MODEL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32D,
+ },
+ [0x1D32E]={
+ category="so",
+ description="TETRAGRAM FOR RESPONSE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32E,
+ },
+ [0x1D32F]={
+ category="so",
+ description="TETRAGRAM FOR GOING TO MEET",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D32F,
+ },
+ [0x1D330]={
+ category="so",
+ description="TETRAGRAM FOR ENCOUNTERS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D330,
+ },
+ [0x1D331]={
+ category="so",
+ description="TETRAGRAM FOR STOVE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D331,
+ },
+ [0x1D332]={
+ category="so",
+ description="TETRAGRAM FOR GREATNESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D332,
+ },
+ [0x1D333]={
+ category="so",
+ description="TETRAGRAM FOR ENLARGEMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D333,
+ },
+ [0x1D334]={
+ category="so",
+ description="TETRAGRAM FOR PATTERN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D334,
+ },
+ [0x1D335]={
+ category="so",
+ description="TETRAGRAM FOR RITUAL",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D335,
+ },
+ [0x1D336]={
+ category="so",
+ description="TETRAGRAM FOR FLIGHT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D336,
+ },
+ [0x1D337]={
+ category="so",
+ description="TETRAGRAM FOR VASTNESS OR WASTING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D337,
+ },
+ [0x1D338]={
+ category="so",
+ description="TETRAGRAM FOR CONSTANCY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D338,
+ },
+ [0x1D339]={
+ category="so",
+ description="TETRAGRAM FOR MEASURE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D339,
+ },
+ [0x1D33A]={
+ category="so",
+ description="TETRAGRAM FOR ETERNITY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33A,
+ },
+ [0x1D33B]={
+ category="so",
+ description="TETRAGRAM FOR UNITY",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33B,
+ },
+ [0x1D33C]={
+ category="so",
+ description="TETRAGRAM FOR DIMINISHMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33C,
+ },
+ [0x1D33D]={
+ category="so",
+ description="TETRAGRAM FOR CLOSED MOUTH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33D,
+ },
+ [0x1D33E]={
+ category="so",
+ description="TETRAGRAM FOR GUARDEDNESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33E,
+ },
+ [0x1D33F]={
+ category="so",
+ description="TETRAGRAM FOR GATHERING IN",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D33F,
+ },
+ [0x1D340]={
+ category="so",
+ description="TETRAGRAM FOR MASSING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D340,
+ },
+ [0x1D341]={
+ category="so",
+ description="TETRAGRAM FOR ACCUMULATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D341,
+ },
+ [0x1D342]={
+ category="so",
+ description="TETRAGRAM FOR EMBELLISHMENT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D342,
+ },
+ [0x1D343]={
+ category="so",
+ description="TETRAGRAM FOR DOUBT",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D343,
+ },
+ [0x1D344]={
+ category="so",
+ description="TETRAGRAM FOR WATCH",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D344,
+ },
+ [0x1D345]={
+ category="so",
+ description="TETRAGRAM FOR SINKING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D345,
+ },
+ [0x1D346]={
+ category="so",
+ description="TETRAGRAM FOR INNER",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D346,
+ },
+ [0x1D347]={
+ category="so",
+ description="TETRAGRAM FOR DEPARTURE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D347,
+ },
+ [0x1D348]={
+ category="so",
+ description="TETRAGRAM FOR DARKENING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D348,
+ },
+ [0x1D349]={
+ category="so",
+ description="TETRAGRAM FOR DIMMING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D349,
+ },
+ [0x1D34A]={
+ category="so",
+ description="TETRAGRAM FOR EXHAUSTION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34A,
+ },
+ [0x1D34B]={
+ category="so",
+ description="TETRAGRAM FOR SEVERANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34B,
+ },
+ [0x1D34C]={
+ category="so",
+ description="TETRAGRAM FOR STOPPAGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34C,
+ },
+ [0x1D34D]={
+ category="so",
+ description="TETRAGRAM FOR HARDNESS",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34D,
+ },
+ [0x1D34E]={
+ category="so",
+ description="TETRAGRAM FOR COMPLETION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34E,
+ },
+ [0x1D34F]={
+ category="so",
+ description="TETRAGRAM FOR CLOSURE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D34F,
+ },
+ [0x1D350]={
+ category="so",
+ description="TETRAGRAM FOR FAILURE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D350,
+ },
+ [0x1D351]={
+ category="so",
+ description="TETRAGRAM FOR AGGRAVATION",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D351,
+ },
+ [0x1D352]={
+ category="so",
+ description="TETRAGRAM FOR COMPLIANCE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D352,
+ },
+ [0x1D353]={
+ category="so",
+ description="TETRAGRAM FOR ON THE VERGE",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D353,
+ },
+ [0x1D354]={
+ category="so",
+ description="TETRAGRAM FOR DIFFICULTIES",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D354,
+ },
+ [0x1D355]={
+ category="so",
+ description="TETRAGRAM FOR LABOURING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D355,
+ },
+ [0x1D356]={
+ category="so",
+ description="TETRAGRAM FOR FOSTERING",
+ direction="on",
+ linebreak="al",
+ unicodeslot=0x1D356,
+ },
+ [0x1D360]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D360,
+ },
+ [0x1D361]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D361,
+ },
+ [0x1D362]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT THREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D362,
+ },
+ [0x1D363]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT FOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D363,
+ },
+ [0x1D364]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT FIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D364,
+ },
+ [0x1D365]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT SIX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D365,
+ },
+ [0x1D366]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT SEVEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D366,
+ },
+ [0x1D367]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT EIGHT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D367,
+ },
+ [0x1D368]={
+ category="no",
+ description="COUNTING ROD UNIT DIGIT NINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D368,
+ },
+ [0x1D369]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT ONE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D369,
+ },
+ [0x1D36A]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT TWO",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D36A,
+ },
+ [0x1D36B]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT THREE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D36B,
+ },
+ [0x1D36C]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT FOUR",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D36C,
+ },
+ [0x1D36D]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT FIVE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D36D,
+ },
+ [0x1D36E]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT SIX",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D36E,
+ },
+ [0x1D36F]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT SEVEN",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D36F,
+ },
+ [0x1D370]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT EIGHT",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D370,
+ },
+ [0x1D371]={
+ category="no",
+ description="COUNTING ROD TENS DIGIT NINE",
+ direction="l",
+ linebreak="al",
+ unicodeslot=0x1D371,
+ },
+ [0x1D400]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D400,
+ },
+ [0x1D401]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D401,
+ },
+ [0x1D402]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D402,
+ },
+ [0x1D403]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D403,
+ },
+ [0x1D404]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D404,
+ },
+ [0x1D405]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D405,
+ },
+ [0x1D406]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D406,
+ },
+ [0x1D407]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D407,
+ },
+ [0x1D408]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D408,
+ },
+ [0x1D409]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D409,
+ },
+ [0x1D40A]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D40A,
+ },
+ [0x1D40B]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D40B,
+ },
+ [0x1D40C]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D40C,
+ },
+ [0x1D40D]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D40D,
+ },
+ [0x1D40E]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D40E,
+ },
+ [0x1D40F]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D40F,
+ },
+ [0x1D410]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D410,
+ },
+ [0x1D411]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D411,
+ },
+ [0x1D412]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D412,
+ },
+ [0x1D413]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D413,
+ },
+ [0x1D414]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D414,
+ },
+ [0x1D415]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D415,
+ },
+ [0x1D416]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D416,
+ },
+ [0x1D417]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D417,
+ },
+ [0x1D418]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D418,
+ },
+ [0x1D419]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D419,
+ },
+ [0x1D41A]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D41A,
+ },
+ [0x1D41B]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D41B,
+ },
+ [0x1D41C]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D41C,
+ },
+ [0x1D41D]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D41D,
+ },
+ [0x1D41E]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D41E,
+ },
+ [0x1D41F]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D41F,
+ },
+ [0x1D420]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D420,
+ },
+ [0x1D421]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D421,
+ },
+ [0x1D422]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D422,
+ },
+ [0x1D423]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D423,
+ },
+ [0x1D424]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D424,
+ },
+ [0x1D425]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D425,
+ },
+ [0x1D426]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D426,
+ },
+ [0x1D427]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D427,
+ },
+ [0x1D428]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D428,
+ },
+ [0x1D429]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D429,
+ },
+ [0x1D42A]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D42A,
+ },
+ [0x1D42B]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D42B,
+ },
+ [0x1D42C]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D42C,
+ },
+ [0x1D42D]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D42D,
+ },
+ [0x1D42E]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D42E,
+ },
+ [0x1D42F]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D42F,
+ },
+ [0x1D430]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D430,
+ },
+ [0x1D431]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D431,
+ },
+ [0x1D432]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D432,
+ },
+ [0x1D433]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D433,
+ },
+ [0x1D434]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D434,
+ },
+ [0x1D435]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D435,
+ },
+ [0x1D436]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D436,
+ },
+ [0x1D437]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D437,
+ },
+ [0x1D438]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D438,
+ },
+ [0x1D439]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D439,
+ },
+ [0x1D43A]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D43A,
+ },
+ [0x1D43B]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D43B,
+ },
+ [0x1D43C]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D43C,
+ },
+ [0x1D43D]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D43D,
+ },
+ [0x1D43E]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D43E,
+ },
+ [0x1D43F]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D43F,
+ },
+ [0x1D440]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D440,
+ },
+ [0x1D441]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D441,
+ },
+ [0x1D442]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D442,
+ },
+ [0x1D443]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D443,
+ },
+ [0x1D444]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D444,
+ },
+ [0x1D445]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D445,
+ },
+ [0x1D446]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D446,
+ },
+ [0x1D447]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D447,
+ },
+ [0x1D448]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D448,
+ },
+ [0x1D449]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL V",
+ direction="l",
+ linebreak="al",
+--mathclass="variable",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D449,
+ },
+ [0x1D44A]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D44A,
+ },
+ [0x1D44B]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D44B,
+ },
+ [0x1D44C]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D44C,
+ },
+ [0x1D44D]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D44D,
+ },
+ [0x1D44E]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D44E,
+ },
+ [0x1D44F]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D44F,
+ },
+ [0x1D450]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D450,
+ },
+ [0x1D451]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D451,
+ },
+ [0x1D452]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D452,
+ },
+ [0x1D453]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D453,
+ },
+ [0x1D454]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D454,
+ },
+ [0x1D456]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D456,
+ },
+ [0x1D457]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D457,
+ },
+ [0x1D458]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D458,
+ },
+ [0x1D459]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D459,
+ },
+ [0x1D45A]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D45A,
+ },
+ [0x1D45B]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D45B,
+ },
+ [0x1D45C]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D45C,
+ },
+ [0x1D45D]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D45D,
+ },
+ [0x1D45E]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D45E,
+ },
+ [0x1D45F]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D45F,
+ },
+ [0x1D460]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D460,
+ },
+ [0x1D461]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D461,
+ },
+ [0x1D462]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D462,
+ },
+ [0x1D463]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D463,
+ },
+ [0x1D464]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D464,
+ },
+ [0x1D465]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D465,
+ },
+ [0x1D466]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D466,
+ },
+ [0x1D467]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D467,
+ },
+ [0x1D468]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D468,
+ },
+ [0x1D469]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D469,
+ },
+ [0x1D46A]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D46A,
+ },
+ [0x1D46B]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D46B,
+ },
+ [0x1D46C]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D46C,
+ },
+ [0x1D46D]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D46D,
+ },
+ [0x1D46E]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D46E,
+ },
+ [0x1D46F]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D46F,
+ },
+ [0x1D470]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D470,
+ },
+ [0x1D471]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D471,
+ },
+ [0x1D472]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D472,
+ },
+ [0x1D473]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D473,
+ },
+ [0x1D474]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D474,
+ },
+ [0x1D475]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D475,
+ },
+ [0x1D476]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D476,
+ },
+ [0x1D477]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D477,
+ },
+ [0x1D478]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D478,
+ },
+ [0x1D479]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D479,
+ },
+ [0x1D47A]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D47A,
+ },
+ [0x1D47B]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D47B,
+ },
+ [0x1D47C]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D47C,
+ },
+ [0x1D47D]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D47D,
+ },
+ [0x1D47E]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D47E,
+ },
+ [0x1D47F]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D47F,
+ },
+ [0x1D480]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D480,
+ },
+ [0x1D481]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D481,
+ },
+ [0x1D482]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D482,
+ },
+ [0x1D483]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D483,
+ },
+ [0x1D484]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D484,
+ },
+ [0x1D485]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D485,
+ },
+ [0x1D486]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D486,
+ },
+ [0x1D487]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D487,
+ },
+ [0x1D488]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D488,
+ },
+ [0x1D489]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D489,
+ },
+ [0x1D48A]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D48A,
+ },
+ [0x1D48B]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D48B,
+ },
+ [0x1D48C]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D48C,
+ },
+ [0x1D48D]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D48D,
+ },
+ [0x1D48E]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D48E,
+ },
+ [0x1D48F]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D48F,
+ },
+ [0x1D490]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D490,
+ },
+ [0x1D491]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D491,
+ },
+ [0x1D492]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D492,
+ },
+ [0x1D493]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D493,
+ },
+ [0x1D494]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D494,
+ },
+ [0x1D495]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D495,
+ },
+ [0x1D496]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D496,
+ },
+ [0x1D497]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D497,
+ },
+ [0x1D498]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D498,
+ },
+ [0x1D499]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D499,
+ },
+ [0x1D49A]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D49A,
+ },
+ [0x1D49B]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D49B,
+ },
+ [0x1D49C]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D49C,
+ },
+ [0x1D49E]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D49E,
+ },
+ [0x1D49F]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D49F,
+ },
+ [0x1D4A2]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D4A2,
+ },
+ [0x1D4A5]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D4A5,
+ },
+ [0x1D4A6]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D4A6,
+ },
+ [0x1D4A9]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D4A9,
+ },
+ [0x1D4AA]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D4AA,
+ },
+ [0x1D4AB]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D4AB,
+ },
+ [0x1D4AC]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D4AC,
+ },
+ [0x1D4AE]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D4AE,
+ },
+ [0x1D4AF]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D4AF,
+ },
+ [0x1D4B0]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D4B0,
+ },
+ [0x1D4B1]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D4B1,
+ },
+ [0x1D4B2]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D4B2,
+ },
+ [0x1D4B3]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D4B3,
+ },
+ [0x1D4B4]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D4B4,
+ },
+ [0x1D4B5]={
+ category="lu",
+ description="MATHEMATICAL SCRIPT CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D4B5,
+ },
+ [0x1D4B6]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D4B6,
+ },
+ [0x1D4B7]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D4B7,
+ },
+ [0x1D4B8]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D4B8,
+ },
+ [0x1D4B9]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D4B9,
+ },
+ [0x1D4BB]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D4BB,
+ },
+ [0x1D4BD]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D4BD,
+ },
+ [0x1D4BE]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D4BE,
+ },
+ [0x1D4BF]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D4BF,
+ },
+ [0x1D4C0]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D4C0,
+ },
+ [0x1D4C1]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D4C1,
+ },
+ [0x1D4C2]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D4C2,
+ },
+ [0x1D4C3]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D4C3,
+ },
+ [0x1D4C5]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D4C5,
+ },
+ [0x1D4C6]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D4C6,
+ },
+ [0x1D4C7]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D4C7,
+ },
+ [0x1D4C8]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D4C8,
+ },
+ [0x1D4C9]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D4C9,
+ },
+ [0x1D4CA]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D4CA,
+ },
+ [0x1D4CB]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D4CB,
+ },
+ [0x1D4CC]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D4CC,
+ },
+ [0x1D4CD]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D4CD,
+ },
+ [0x1D4CE]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D4CE,
+ },
+ [0x1D4CF]={
+ category="ll",
+ description="MATHEMATICAL SCRIPT SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D4CF,
+ },
+ [0x1D4D0]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D4D0,
+ },
+ [0x1D4D1]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D4D1,
+ },
+ [0x1D4D2]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D4D2,
+ },
+ [0x1D4D3]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D4D3,
+ },
+ [0x1D4D4]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D4D4,
+ },
+ [0x1D4D5]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D4D5,
+ },
+ [0x1D4D6]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D4D6,
+ },
+ [0x1D4D7]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D4D7,
+ },
+ [0x1D4D8]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D4D8,
+ },
+ [0x1D4D9]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D4D9,
+ },
+ [0x1D4DA]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D4DA,
+ },
+ [0x1D4DB]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D4DB,
+ },
+ [0x1D4DC]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D4DC,
+ },
+ [0x1D4DD]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D4DD,
+ },
+ [0x1D4DE]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D4DE,
+ },
+ [0x1D4DF]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D4DF,
+ },
+ [0x1D4E0]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D4E0,
+ },
+ [0x1D4E1]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D4E1,
+ },
+ [0x1D4E2]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D4E2,
+ },
+ [0x1D4E3]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D4E3,
+ },
+ [0x1D4E4]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D4E4,
+ },
+ [0x1D4E5]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D4E5,
+ },
+ [0x1D4E6]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D4E6,
+ },
+ [0x1D4E7]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D4E7,
+ },
+ [0x1D4E8]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D4E8,
+ },
+ [0x1D4E9]={
+ category="lu",
+ description="MATHEMATICAL BOLD SCRIPT CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D4E9,
+ },
+ [0x1D4EA]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D4EA,
+ },
+ [0x1D4EB]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D4EB,
+ },
+ [0x1D4EC]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D4EC,
+ },
+ [0x1D4ED]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D4ED,
+ },
+ [0x1D4EE]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D4EE,
+ },
+ [0x1D4EF]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D4EF,
+ },
+ [0x1D4F0]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D4F0,
+ },
+ [0x1D4F1]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D4F1,
+ },
+ [0x1D4F2]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D4F2,
+ },
+ [0x1D4F3]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D4F3,
+ },
+ [0x1D4F4]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D4F4,
+ },
+ [0x1D4F5]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D4F5,
+ },
+ [0x1D4F6]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D4F6,
+ },
+ [0x1D4F7]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D4F7,
+ },
+ [0x1D4F8]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D4F8,
+ },
+ [0x1D4F9]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D4F9,
+ },
+ [0x1D4FA]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D4FA,
+ },
+ [0x1D4FB]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D4FB,
+ },
+ [0x1D4FC]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D4FC,
+ },
+ [0x1D4FD]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D4FD,
+ },
+ [0x1D4FE]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D4FE,
+ },
+ [0x1D4FF]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D4FF,
+ },
+ [0x1D500]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D500,
+ },
+ [0x1D501]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D501,
+ },
+ [0x1D502]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D502,
+ },
+ [0x1D503]={
+ category="ll",
+ description="MATHEMATICAL BOLD SCRIPT SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D503,
+ },
+ [0x1D504]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D504,
+ },
+ [0x1D505]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D505,
+ },
+ [0x1D507]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D507,
+ },
+ [0x1D508]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D508,
+ },
+ [0x1D509]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D509,
+ },
+ [0x1D50A]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D50A,
+ },
+ [0x1D50D]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D50D,
+ },
+ [0x1D50E]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D50E,
+ },
+ [0x1D50F]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D50F,
+ },
+ [0x1D510]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D510,
+ },
+ [0x1D511]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D511,
+ },
+ [0x1D512]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D512,
+ },
+ [0x1D513]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D513,
+ },
+ [0x1D514]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D514,
+ },
+ [0x1D516]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D516,
+ },
+ [0x1D517]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D517,
+ },
+ [0x1D518]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D518,
+ },
+ [0x1D519]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D519,
+ },
+ [0x1D51A]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D51A,
+ },
+ [0x1D51B]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D51B,
+ },
+ [0x1D51C]={
+ category="lu",
+ description="MATHEMATICAL FRAKTUR CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D51C,
+ },
+ [0x1D51E]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D51E,
+ },
+ [0x1D51F]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D51F,
+ },
+ [0x1D520]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D520,
+ },
+ [0x1D521]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D521,
+ },
+ [0x1D522]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D522,
+ },
+ [0x1D523]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D523,
+ },
+ [0x1D524]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D524,
+ },
+ [0x1D525]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D525,
+ },
+ [0x1D526]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D526,
+ },
+ [0x1D527]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D527,
+ },
+ [0x1D528]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D528,
+ },
+ [0x1D529]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D529,
+ },
+ [0x1D52A]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D52A,
+ },
+ [0x1D52B]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D52B,
+ },
+ [0x1D52C]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D52C,
+ },
+ [0x1D52D]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D52D,
+ },
+ [0x1D52E]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D52E,
+ },
+ [0x1D52F]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D52F,
+ },
+ [0x1D530]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D530,
+ },
+ [0x1D531]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D531,
+ },
+ [0x1D532]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D532,
+ },
+ [0x1D533]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D533,
+ },
+ [0x1D534]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D534,
+ },
+ [0x1D535]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D535,
+ },
+ [0x1D536]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D536,
+ },
+ [0x1D537]={
+ category="ll",
+ description="MATHEMATICAL FRAKTUR SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D537,
+ },
+ [0x1D538]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D538,
+ },
+ [0x1D539]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D539,
+ },
+ [0x1D53B]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D53B,
+ },
+ [0x1D53C]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D53C,
+ },
+ [0x1D53D]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D53D,
+ },
+ [0x1D53E]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D53E,
+ },
+ [0x1D540]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D540,
+ },
+ [0x1D541]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D541,
+ },
+ [0x1D542]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D542,
+ },
+ [0x1D543]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D543,
+ },
+ [0x1D544]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D544,
+ },
+ [0x1D546]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D546,
+ },
+ [0x1D54A]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D54A,
+ },
+ [0x1D54B]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D54B,
+ },
+ [0x1D54C]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D54C,
+ },
+ [0x1D54D]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D54D,
+ },
+ [0x1D54E]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D54E,
+ },
+ [0x1D54F]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D54F,
+ },
+ [0x1D550]={
+ category="lu",
+ description="MATHEMATICAL DOUBLE-STRUCK CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D550,
+ },
+ [0x1D552]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D552,
+ },
+ [0x1D553]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D553,
+ },
+ [0x1D554]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D554,
+ },
+ [0x1D555]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D555,
+ },
+ [0x1D556]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D556,
+ },
+ [0x1D557]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D557,
+ },
+ [0x1D558]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D558,
+ },
+ [0x1D559]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D559,
+ },
+ [0x1D55A]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D55A,
+ },
+ [0x1D55B]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D55B,
+ },
+ [0x1D55C]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D55C,
+ },
+ [0x1D55D]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D55D,
+ },
+ [0x1D55E]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D55E,
+ },
+ [0x1D55F]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D55F,
+ },
+ [0x1D560]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D560,
+ },
+ [0x1D561]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D561,
+ },
+ [0x1D562]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D562,
+ },
+ [0x1D563]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D563,
+ },
+ [0x1D564]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D564,
+ },
+ [0x1D565]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D565,
+ },
+ [0x1D566]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D566,
+ },
+ [0x1D567]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D567,
+ },
+ [0x1D568]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D568,
+ },
+ [0x1D569]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D569,
+ },
+ [0x1D56A]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D56A,
+ },
+ [0x1D56B]={
+ category="ll",
+ description="MATHEMATICAL DOUBLE-STRUCK SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D56B,
+ },
+ [0x1D56C]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D56C,
+ },
+ [0x1D56D]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D56D,
+ },
+ [0x1D56E]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D56E,
+ },
+ [0x1D56F]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D56F,
+ },
+ [0x1D570]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D570,
+ },
+ [0x1D571]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D571,
+ },
+ [0x1D572]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D572,
+ },
+ [0x1D573]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D573,
+ },
+ [0x1D574]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D574,
+ },
+ [0x1D575]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D575,
+ },
+ [0x1D576]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D576,
+ },
+ [0x1D577]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D577,
+ },
+ [0x1D578]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D578,
+ },
+ [0x1D579]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D579,
+ },
+ [0x1D57A]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D57A,
+ },
+ [0x1D57B]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D57B,
+ },
+ [0x1D57C]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D57C,
+ },
+ [0x1D57D]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D57D,
+ },
+ [0x1D57E]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D57E,
+ },
+ [0x1D57F]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D57F,
+ },
+ [0x1D580]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D580,
+ },
+ [0x1D581]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D581,
+ },
+ [0x1D582]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D582,
+ },
+ [0x1D583]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D583,
+ },
+ [0x1D584]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D584,
+ },
+ [0x1D585]={
+ category="lu",
+ description="MATHEMATICAL BOLD FRAKTUR CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D585,
+ },
+ [0x1D586]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D586,
+ },
+ [0x1D587]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D587,
+ },
+ [0x1D588]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D588,
+ },
+ [0x1D589]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D589,
+ },
+ [0x1D58A]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D58A,
+ },
+ [0x1D58B]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D58B,
+ },
+ [0x1D58C]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D58C,
+ },
+ [0x1D58D]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D58D,
+ },
+ [0x1D58E]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D58E,
+ },
+ [0x1D58F]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D58F,
+ },
+ [0x1D590]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D590,
+ },
+ [0x1D591]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D591,
+ },
+ [0x1D592]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D592,
+ },
+ [0x1D593]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D593,
+ },
+ [0x1D594]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D594,
+ },
+ [0x1D595]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D595,
+ },
+ [0x1D596]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D596,
+ },
+ [0x1D597]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D597,
+ },
+ [0x1D598]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D598,
+ },
+ [0x1D599]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D599,
+ },
+ [0x1D59A]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D59A,
+ },
+ [0x1D59B]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D59B,
+ },
+ [0x1D59C]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D59C,
+ },
+ [0x1D59D]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D59D,
+ },
+ [0x1D59E]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D59E,
+ },
+ [0x1D59F]={
+ category="ll",
+ description="MATHEMATICAL BOLD FRAKTUR SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D59F,
+ },
+ [0x1D5A0]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D5A0,
+ },
+ [0x1D5A1]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D5A1,
+ },
+ [0x1D5A2]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D5A2,
+ },
+ [0x1D5A3]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D5A3,
+ },
+ [0x1D5A4]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D5A4,
+ },
+ [0x1D5A5]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D5A5,
+ },
+ [0x1D5A6]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D5A6,
+ },
+ [0x1D5A7]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D5A7,
+ },
+ [0x1D5A8]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D5A8,
+ },
+ [0x1D5A9]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D5A9,
+ },
+ [0x1D5AA]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D5AA,
+ },
+ [0x1D5AB]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D5AB,
+ },
+ [0x1D5AC]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D5AC,
+ },
+ [0x1D5AD]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D5AD,
+ },
+ [0x1D5AE]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D5AE,
+ },
+ [0x1D5AF]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D5AF,
+ },
+ [0x1D5B0]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D5B0,
+ },
+ [0x1D5B1]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D5B1,
+ },
+ [0x1D5B2]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D5B2,
+ },
+ [0x1D5B3]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D5B3,
+ },
+ [0x1D5B4]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D5B4,
+ },
+ [0x1D5B5]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D5B5,
+ },
+ [0x1D5B6]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D5B6,
+ },
+ [0x1D5B7]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D5B7,
+ },
+ [0x1D5B8]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D5B8,
+ },
+ [0x1D5B9]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D5B9,
+ },
+ [0x1D5BA]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D5BA,
+ },
+ [0x1D5BB]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D5BB,
+ },
+ [0x1D5BC]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D5BC,
+ },
+ [0x1D5BD]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D5BD,
+ },
+ [0x1D5BE]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D5BE,
+ },
+ [0x1D5BF]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D5BF,
+ },
+ [0x1D5C0]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D5C0,
+ },
+ [0x1D5C1]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D5C1,
+ },
+ [0x1D5C2]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D5C2,
+ },
+ [0x1D5C3]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D5C3,
+ },
+ [0x1D5C4]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D5C4,
+ },
+ [0x1D5C5]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D5C5,
+ },
+ [0x1D5C6]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D5C6,
+ },
+ [0x1D5C7]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D5C7,
+ },
+ [0x1D5C8]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D5C8,
+ },
+ [0x1D5C9]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D5C9,
+ },
+ [0x1D5CA]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D5CA,
+ },
+ [0x1D5CB]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D5CB,
+ },
+ [0x1D5CC]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D5CC,
+ },
+ [0x1D5CD]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D5CD,
+ },
+ [0x1D5CE]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D5CE,
+ },
+ [0x1D5CF]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D5CF,
+ },
+ [0x1D5D0]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D5D0,
+ },
+ [0x1D5D1]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D5D1,
+ },
+ [0x1D5D2]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D5D2,
+ },
+ [0x1D5D3]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D5D3,
+ },
+ [0x1D5D4]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D5D4,
+ },
+ [0x1D5D5]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D5D5,
+ },
+ [0x1D5D6]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D5D6,
+ },
+ [0x1D5D7]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D5D7,
+ },
+ [0x1D5D8]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D5D8,
+ },
+ [0x1D5D9]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D5D9,
+ },
+ [0x1D5DA]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D5DA,
+ },
+ [0x1D5DB]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D5DB,
+ },
+ [0x1D5DC]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D5DC,
+ },
+ [0x1D5DD]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D5DD,
+ },
+ [0x1D5DE]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D5DE,
+ },
+ [0x1D5DF]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D5DF,
+ },
+ [0x1D5E0]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D5E0,
+ },
+ [0x1D5E1]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D5E1,
+ },
+ [0x1D5E2]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D5E2,
+ },
+ [0x1D5E3]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D5E3,
+ },
+ [0x1D5E4]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D5E4,
+ },
+ [0x1D5E5]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D5E5,
+ },
+ [0x1D5E6]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D5E6,
+ },
+ [0x1D5E7]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D5E7,
+ },
+ [0x1D5E8]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D5E8,
+ },
+ [0x1D5E9]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D5E9,
+ },
+ [0x1D5EA]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D5EA,
+ },
+ [0x1D5EB]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D5EB,
+ },
+ [0x1D5EC]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D5EC,
+ },
+ [0x1D5ED]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D5ED,
+ },
+ [0x1D5EE]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D5EE,
+ },
+ [0x1D5EF]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D5EF,
+ },
+ [0x1D5F0]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D5F0,
+ },
+ [0x1D5F1]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D5F1,
+ },
+ [0x1D5F2]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D5F2,
+ },
+ [0x1D5F3]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D5F3,
+ },
+ [0x1D5F4]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D5F4,
+ },
+ [0x1D5F5]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D5F5,
+ },
+ [0x1D5F6]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D5F6,
+ },
+ [0x1D5F7]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D5F7,
+ },
+ [0x1D5F8]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D5F8,
+ },
+ [0x1D5F9]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D5F9,
+ },
+ [0x1D5FA]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D5FA,
+ },
+ [0x1D5FB]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D5FB,
+ },
+ [0x1D5FC]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D5FC,
+ },
+ [0x1D5FD]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D5FD,
+ },
+ [0x1D5FE]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D5FE,
+ },
+ [0x1D5FF]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D5FF,
+ },
+ [0x1D600]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D600,
+ },
+ [0x1D601]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D601,
+ },
+ [0x1D602]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D602,
+ },
+ [0x1D603]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D603,
+ },
+ [0x1D604]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D604,
+ },
+ [0x1D605]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D605,
+ },
+ [0x1D606]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D606,
+ },
+ [0x1D607]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D607,
+ },
+ [0x1D608]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D608,
+ },
+ [0x1D609]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D609,
+ },
+ [0x1D60A]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D60A,
+ },
+ [0x1D60B]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D60B,
+ },
+ [0x1D60C]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D60C,
+ },
+ [0x1D60D]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D60D,
+ },
+ [0x1D60E]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D60E,
+ },
+ [0x1D60F]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D60F,
+ },
+ [0x1D610]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D610,
+ },
+ [0x1D611]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D611,
+ },
+ [0x1D612]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D612,
+ },
+ [0x1D613]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D613,
+ },
+ [0x1D614]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D614,
+ },
+ [0x1D615]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D615,
+ },
+ [0x1D616]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D616,
+ },
+ [0x1D617]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D617,
+ },
+ [0x1D618]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D618,
+ },
+ [0x1D619]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D619,
+ },
+ [0x1D61A]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D61A,
+ },
+ [0x1D61B]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D61B,
+ },
+ [0x1D61C]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D61C,
+ },
+ [0x1D61D]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D61D,
+ },
+ [0x1D61E]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D61E,
+ },
+ [0x1D61F]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D61F,
+ },
+ [0x1D620]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D620,
+ },
+ [0x1D621]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D621,
+ },
+ [0x1D622]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D622,
+ },
+ [0x1D623]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D623,
+ },
+ [0x1D624]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D624,
+ },
+ [0x1D625]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D625,
+ },
+ [0x1D626]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D626,
+ },
+ [0x1D627]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D627,
+ },
+ [0x1D628]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D628,
+ },
+ [0x1D629]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D629,
+ },
+ [0x1D62A]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D62A,
+ },
+ [0x1D62B]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D62B,
+ },
+ [0x1D62C]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D62C,
+ },
+ [0x1D62D]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D62D,
+ },
+ [0x1D62E]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D62E,
+ },
+ [0x1D62F]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D62F,
+ },
+ [0x1D630]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D630,
+ },
+ [0x1D631]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D631,
+ },
+ [0x1D632]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D632,
+ },
+ [0x1D633]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D633,
+ },
+ [0x1D634]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D634,
+ },
+ [0x1D635]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D635,
+ },
+ [0x1D636]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D636,
+ },
+ [0x1D637]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D637,
+ },
+ [0x1D638]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D638,
+ },
+ [0x1D639]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D639,
+ },
+ [0x1D63A]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D63A,
+ },
+ [0x1D63B]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF ITALIC SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D63B,
+ },
+ [0x1D63C]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D63C,
+ },
+ [0x1D63D]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D63D,
+ },
+ [0x1D63E]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D63E,
+ },
+ [0x1D63F]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D63F,
+ },
+ [0x1D640]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D640,
+ },
+ [0x1D641]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D641,
+ },
+ [0x1D642]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D642,
+ },
+ [0x1D643]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D643,
+ },
+ [0x1D644]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D644,
+ },
+ [0x1D645]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D645,
+ },
+ [0x1D646]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D646,
+ },
+ [0x1D647]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D647,
+ },
+ [0x1D648]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D648,
+ },
+ [0x1D649]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D649,
+ },
+ [0x1D64A]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D64A,
+ },
+ [0x1D64B]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D64B,
+ },
+ [0x1D64C]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D64C,
+ },
+ [0x1D64D]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D64D,
+ },
+ [0x1D64E]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D64E,
+ },
+ [0x1D64F]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D64F,
+ },
+ [0x1D650]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D650,
+ },
+ [0x1D651]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D651,
+ },
+ [0x1D652]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D652,
+ },
+ [0x1D653]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D653,
+ },
+ [0x1D654]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D654,
+ },
+ [0x1D655]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D655,
+ },
+ [0x1D656]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D656,
+ },
+ [0x1D657]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D657,
+ },
+ [0x1D658]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D658,
+ },
+ [0x1D659]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D659,
+ },
+ [0x1D65A]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D65A,
+ },
+ [0x1D65B]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D65B,
+ },
+ [0x1D65C]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D65C,
+ },
+ [0x1D65D]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D65D,
+ },
+ [0x1D65E]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D65E,
+ },
+ [0x1D65F]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D65F,
+ },
+ [0x1D660]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D660,
+ },
+ [0x1D661]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D661,
+ },
+ [0x1D662]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D662,
+ },
+ [0x1D663]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D663,
+ },
+ [0x1D664]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D664,
+ },
+ [0x1D665]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D665,
+ },
+ [0x1D666]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D666,
+ },
+ [0x1D667]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D667,
+ },
+ [0x1D668]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D668,
+ },
+ [0x1D669]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D669,
+ },
+ [0x1D66A]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D66A,
+ },
+ [0x1D66B]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D66B,
+ },
+ [0x1D66C]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D66C,
+ },
+ [0x1D66D]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D66D,
+ },
+ [0x1D66E]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D66E,
+ },
+ [0x1D66F]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D66F,
+ },
+ [0x1D670]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0041 },
+ unicodeslot=0x1D670,
+ },
+ [0x1D671]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0042 },
+ unicodeslot=0x1D671,
+ },
+ [0x1D672]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0043 },
+ unicodeslot=0x1D672,
+ },
+ [0x1D673]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0044 },
+ unicodeslot=0x1D673,
+ },
+ [0x1D674]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0045 },
+ unicodeslot=0x1D674,
+ },
+ [0x1D675]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0046 },
+ unicodeslot=0x1D675,
+ },
+ [0x1D676]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0047 },
+ unicodeslot=0x1D676,
+ },
+ [0x1D677]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0048 },
+ unicodeslot=0x1D677,
+ },
+ [0x1D678]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0049 },
+ unicodeslot=0x1D678,
+ },
+ [0x1D679]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004A },
+ unicodeslot=0x1D679,
+ },
+ [0x1D67A]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004B },
+ unicodeslot=0x1D67A,
+ },
+ [0x1D67B]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004C },
+ unicodeslot=0x1D67B,
+ },
+ [0x1D67C]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004D },
+ unicodeslot=0x1D67C,
+ },
+ [0x1D67D]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004E },
+ unicodeslot=0x1D67D,
+ },
+ [0x1D67E]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x004F },
+ unicodeslot=0x1D67E,
+ },
+ [0x1D67F]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0050 },
+ unicodeslot=0x1D67F,
+ },
+ [0x1D680]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0051 },
+ unicodeslot=0x1D680,
+ },
+ [0x1D681]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0052 },
+ unicodeslot=0x1D681,
+ },
+ [0x1D682]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0053 },
+ unicodeslot=0x1D682,
+ },
+ [0x1D683]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0054 },
+ unicodeslot=0x1D683,
+ },
+ [0x1D684]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0055 },
+ unicodeslot=0x1D684,
+ },
+ [0x1D685]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0056 },
+ unicodeslot=0x1D685,
+ },
+ [0x1D686]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0057 },
+ unicodeslot=0x1D686,
+ },
+ [0x1D687]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0058 },
+ unicodeslot=0x1D687,
+ },
+ [0x1D688]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0059 },
+ unicodeslot=0x1D688,
+ },
+ [0x1D689]={
+ category="lu",
+ description="MATHEMATICAL MONOSPACE CAPITAL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x005A },
+ unicodeslot=0x1D689,
+ },
+ [0x1D68A]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL A",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0061 },
+ unicodeslot=0x1D68A,
+ },
+ [0x1D68B]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL B",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0062 },
+ unicodeslot=0x1D68B,
+ },
+ [0x1D68C]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL C",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0063 },
+ unicodeslot=0x1D68C,
+ },
+ [0x1D68D]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL D",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0064 },
+ unicodeslot=0x1D68D,
+ },
+ [0x1D68E]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL E",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0065 },
+ unicodeslot=0x1D68E,
+ },
+ [0x1D68F]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL F",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0066 },
+ unicodeslot=0x1D68F,
+ },
+ [0x1D690]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL G",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0067 },
+ unicodeslot=0x1D690,
+ },
+ [0x1D691]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL H",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0068 },
+ unicodeslot=0x1D691,
+ },
+ [0x1D692]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL I",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0069 },
+ unicodeslot=0x1D692,
+ },
+ [0x1D693]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL J",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006A },
+ unicodeslot=0x1D693,
+ },
+ [0x1D694]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL K",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006B },
+ unicodeslot=0x1D694,
+ },
+ [0x1D695]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL L",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006C },
+ unicodeslot=0x1D695,
+ },
+ [0x1D696]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL M",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006D },
+ unicodeslot=0x1D696,
+ },
+ [0x1D697]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL N",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006E },
+ unicodeslot=0x1D697,
+ },
+ [0x1D698]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL O",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x006F },
+ unicodeslot=0x1D698,
+ },
+ [0x1D699]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL P",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0070 },
+ unicodeslot=0x1D699,
+ },
+ [0x1D69A]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL Q",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0071 },
+ unicodeslot=0x1D69A,
+ },
+ [0x1D69B]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL R",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0072 },
+ unicodeslot=0x1D69B,
+ },
+ [0x1D69C]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL S",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0073 },
+ unicodeslot=0x1D69C,
+ },
+ [0x1D69D]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL T",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0074 },
+ unicodeslot=0x1D69D,
+ },
+ [0x1D69E]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL U",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0075 },
+ unicodeslot=0x1D69E,
+ },
+ [0x1D69F]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL V",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0076 },
+ unicodeslot=0x1D69F,
+ },
+ [0x1D6A0]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL W",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0077 },
+ unicodeslot=0x1D6A0,
+ },
+ [0x1D6A1]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL X",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0078 },
+ unicodeslot=0x1D6A1,
+ },
+ [0x1D6A2]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL Y",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0079 },
+ unicodeslot=0x1D6A2,
+ },
+ [0x1D6A3]={
+ category="ll",
+ description="MATHEMATICAL MONOSPACE SMALL Z",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x007A },
+ unicodeslot=0x1D6A3,
+ },
+ [0x1D6A4]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL DOTLESS I",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="imath",
+ specials={ "font", 0x0131 },
+ unicodeslot=0x1D6A4,
+ },
+ [0x1D6A5]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL DOTLESS J",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="jmath",
+ specials={ "font", 0x0237 },
+ unicodeslot=0x1D6A5,
+ },
+ [0x1D6A8]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0391 },
+ unicodeslot=0x1D6A8,
+ },
+ [0x1D6A9]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0392 },
+ unicodeslot=0x1D6A9,
+ },
+ [0x1D6AA]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0393 },
+ unicodeslot=0x1D6AA,
+ },
+ [0x1D6AB]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0394 },
+ unicodeslot=0x1D6AB,
+ },
+ [0x1D6AC]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0395 },
+ unicodeslot=0x1D6AC,
+ },
+ [0x1D6AD]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0396 },
+ unicodeslot=0x1D6AD,
+ },
+ [0x1D6AE]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0397 },
+ unicodeslot=0x1D6AE,
+ },
+ [0x1D6AF]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0398 },
+ unicodeslot=0x1D6AF,
+ },
+ [0x1D6B0]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0399 },
+ unicodeslot=0x1D6B0,
+ },
+ [0x1D6B1]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039A },
+ unicodeslot=0x1D6B1,
+ },
+ [0x1D6B2]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039B },
+ unicodeslot=0x1D6B2,
+ },
+ [0x1D6B3]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039C },
+ unicodeslot=0x1D6B3,
+ },
+ [0x1D6B4]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039D },
+ unicodeslot=0x1D6B4,
+ },
+ [0x1D6B5]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039E },
+ unicodeslot=0x1D6B5,
+ },
+ [0x1D6B6]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039F },
+ unicodeslot=0x1D6B6,
+ },
+ [0x1D6B7]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A0 },
+ unicodeslot=0x1D6B7,
+ },
+ [0x1D6B8]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A1 },
+ unicodeslot=0x1D6B8,
+ },
+ [0x1D6B9]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F4 },
+ unicodeslot=0x1D6B9,
+ },
+ [0x1D6BA]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A3 },
+ unicodeslot=0x1D6BA,
+ },
+ [0x1D6BB]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A4 },
+ unicodeslot=0x1D6BB,
+ },
+ [0x1D6BC]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A5 },
+ unicodeslot=0x1D6BC,
+ },
+ [0x1D6BD]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A6 },
+ unicodeslot=0x1D6BD,
+ },
+ [0x1D6BE]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A7 },
+ unicodeslot=0x1D6BE,
+ },
+ [0x1D6BF]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A8 },
+ unicodeslot=0x1D6BF,
+ },
+ [0x1D6C0]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A9 },
+ unicodeslot=0x1D6C0,
+ },
+ [0x1D6C1]={
+ category="sm",
+ description="MATHEMATICAL BOLD NABLA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D6C1,
+ },
+ [0x1D6C2]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B1 },
+ unicodeslot=0x1D6C2,
+ },
+ [0x1D6C3]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B2 },
+ unicodeslot=0x1D6C3,
+ },
+ [0x1D6C4]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B3 },
+ unicodeslot=0x1D6C4,
+ },
+ [0x1D6C5]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B4 },
+ unicodeslot=0x1D6C5,
+ },
+ [0x1D6C6]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B5 },
+ unicodeslot=0x1D6C6,
+ },
+ [0x1D6C7]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B6 },
+ unicodeslot=0x1D6C7,
+ },
+ [0x1D6C8]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B7 },
+ unicodeslot=0x1D6C8,
+ },
+ [0x1D6C9]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B8 },
+ unicodeslot=0x1D6C9,
+ },
+ [0x1D6CA]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B9 },
+ unicodeslot=0x1D6CA,
+ },
+ [0x1D6CB]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BA },
+ unicodeslot=0x1D6CB,
+ },
+ [0x1D6CC]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BB },
+ unicodeslot=0x1D6CC,
+ },
+ [0x1D6CD]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BC },
+ unicodeslot=0x1D6CD,
+ },
+ [0x1D6CE]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BD },
+ unicodeslot=0x1D6CE,
+ },
+ [0x1D6CF]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BE },
+ unicodeslot=0x1D6CF,
+ },
+ [0x1D6D0]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BF },
+ unicodeslot=0x1D6D0,
+ },
+ [0x1D6D1]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C0 },
+ unicodeslot=0x1D6D1,
+ },
+ [0x1D6D2]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C1 },
+ unicodeslot=0x1D6D2,
+ },
+ [0x1D6D3]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL FINAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C2 },
+ unicodeslot=0x1D6D3,
+ },
+ [0x1D6D4]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C3 },
+ unicodeslot=0x1D6D4,
+ },
+ [0x1D6D5]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C4 },
+ unicodeslot=0x1D6D5,
+ },
+ [0x1D6D6]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C5 },
+ unicodeslot=0x1D6D6,
+ },
+ [0x1D6D7]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C6 },
+ unicodeslot=0x1D6D7,
+ },
+ [0x1D6D8]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C7 },
+ unicodeslot=0x1D6D8,
+ },
+ [0x1D6D9]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C8 },
+ unicodeslot=0x1D6D9,
+ },
+ [0x1D6DA]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C9 },
+ unicodeslot=0x1D6DA,
+ },
+ [0x1D6DB]={
+ category="sm",
+ description="MATHEMATICAL BOLD PARTIAL DIFFERENTIAL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D6DB,
+ },
+ [0x1D6DC]={
+ category="ll",
+ description="MATHEMATICAL BOLD EPSILON SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F5 },
+ unicodeslot=0x1D6DC,
+ },
+ [0x1D6DD]={
+ category="ll",
+ description="MATHEMATICAL BOLD THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D1 },
+ unicodeslot=0x1D6DD,
+ },
+ [0x1D6DE]={
+ category="ll",
+ description="MATHEMATICAL BOLD KAPPA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F0 },
+ unicodeslot=0x1D6DE,
+ },
+ [0x1D6DF]={
+ category="ll",
+ description="MATHEMATICAL BOLD PHI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D5 },
+ unicodeslot=0x1D6DF,
+ },
+ [0x1D6E0]={
+ category="ll",
+ description="MATHEMATICAL BOLD RHO SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F1 },
+ unicodeslot=0x1D6E0,
+ },
+ [0x1D6E1]={
+ category="ll",
+ description="MATHEMATICAL BOLD PI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D6 },
+ unicodeslot=0x1D6E1,
+ },
+ [0x1D6E2]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0391 },
+ unicodeslot=0x1D6E2,
+ },
+ [0x1D6E3]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0392 },
+ unicodeslot=0x1D6E3,
+ },
+ [0x1D6E4]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0393 },
+ unicodeslot=0x1D6E4,
+ },
+ [0x1D6E5]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0394 },
+ unicodeslot=0x1D6E5,
+ },
+ [0x1D6E6]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0395 },
+ unicodeslot=0x1D6E6,
+ },
+ [0x1D6E7]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0396 },
+ unicodeslot=0x1D6E7,
+ },
+ [0x1D6E8]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0397 },
+ unicodeslot=0x1D6E8,
+ },
+ [0x1D6E9]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0398 },
+ unicodeslot=0x1D6E9,
+ },
+ [0x1D6EA]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0399 },
+ unicodeslot=0x1D6EA,
+ },
+ [0x1D6EB]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039A },
+ unicodeslot=0x1D6EB,
+ },
+ [0x1D6EC]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039B },
+ unicodeslot=0x1D6EC,
+ },
+ [0x1D6ED]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039C },
+ unicodeslot=0x1D6ED,
+ },
+ [0x1D6EE]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039D },
+ unicodeslot=0x1D6EE,
+ },
+ [0x1D6EF]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039E },
+ unicodeslot=0x1D6EF,
+ },
+ [0x1D6F0]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039F },
+ unicodeslot=0x1D6F0,
+ },
+ [0x1D6F1]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A0 },
+ unicodeslot=0x1D6F1,
+ },
+ [0x1D6F2]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A1 },
+ unicodeslot=0x1D6F2,
+ },
+ [0x1D6F3]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F4 },
+ unicodeslot=0x1D6F3,
+ },
+ [0x1D6F4]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A3 },
+ unicodeslot=0x1D6F4,
+ },
+ [0x1D6F5]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A4 },
+ unicodeslot=0x1D6F5,
+ },
+ [0x1D6F6]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A5 },
+ unicodeslot=0x1D6F6,
+ },
+ [0x1D6F7]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A6 },
+ unicodeslot=0x1D6F7,
+ },
+ [0x1D6F8]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A7 },
+ unicodeslot=0x1D6F8,
+ },
+ [0x1D6F9]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A8 },
+ unicodeslot=0x1D6F9,
+ },
+ [0x1D6FA]={
+ category="lu",
+ description="MATHEMATICAL ITALIC CAPITAL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A9 },
+ unicodeslot=0x1D6FA,
+ },
+ [0x1D6FB]={
+ category="sm",
+ description="MATHEMATICAL ITALIC NABLA",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="nabla",
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D6FB,
+ },
+ [0x1D6FC]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B1 },
+ unicodeslot=0x1D6FC,
+ },
+ [0x1D6FD]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B2 },
+ unicodeslot=0x1D6FD,
+ },
+ [0x1D6FE]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B3 },
+ unicodeslot=0x1D6FE,
+ },
+ [0x1D6FF]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B4 },
+ unicodeslot=0x1D6FF,
+ },
+ [0x1D700]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B5 },
+ unicodeslot=0x1D700,
+ },
+ [0x1D701]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B6 },
+ unicodeslot=0x1D701,
+ },
+ [0x1D702]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B7 },
+ unicodeslot=0x1D702,
+ },
+ [0x1D703]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B8 },
+ unicodeslot=0x1D703,
+ },
+ [0x1D704]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B9 },
+ unicodeslot=0x1D704,
+ },
+ [0x1D705]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BA },
+ unicodeslot=0x1D705,
+ },
+ [0x1D706]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BB },
+ unicodeslot=0x1D706,
+ },
+ [0x1D707]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BC },
+ unicodeslot=0x1D707,
+ },
+ [0x1D708]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BD },
+ unicodeslot=0x1D708,
+ },
+ [0x1D709]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BE },
+ unicodeslot=0x1D709,
+ },
+ [0x1D70A]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BF },
+ unicodeslot=0x1D70A,
+ },
+ [0x1D70B]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C0 },
+ unicodeslot=0x1D70B,
+ },
+ [0x1D70C]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C1 },
+ unicodeslot=0x1D70C,
+ },
+ [0x1D70D]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL FINAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C2 },
+ unicodeslot=0x1D70D,
+ },
+ [0x1D70E]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C3 },
+ unicodeslot=0x1D70E,
+ },
+ [0x1D70F]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C4 },
+ unicodeslot=0x1D70F,
+ },
+ [0x1D710]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C5 },
+ unicodeslot=0x1D710,
+ },
+ [0x1D711]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C6 },
+ unicodeslot=0x1D711,
+ },
+ [0x1D712]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C7 },
+ unicodeslot=0x1D712,
+ },
+ [0x1D713]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C8 },
+ unicodeslot=0x1D713,
+ },
+ [0x1D714]={
+ category="ll",
+ description="MATHEMATICAL ITALIC SMALL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C9 },
+ unicodeslot=0x1D714,
+ },
+ [0x1D715]={
+ category="sm",
+ description="MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D715,
+ },
+ [0x1D716]={
+ category="ll",
+ description="MATHEMATICAL ITALIC EPSILON SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F5 },
+ unicodeslot=0x1D716,
+ },
+ [0x1D717]={
+ category="ll",
+ description="MATHEMATICAL ITALIC THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="vartheta",
+ specials={ "font", 0x03D1 },
+ unicodeslot=0x1D717,
+ },
+ [0x1D718]={
+ category="ll",
+ description="MATHEMATICAL ITALIC KAPPA SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="default",
+ mathname="varkappa",
+ specials={ "font", 0x03F0 },
+ unicodeslot=0x1D718,
+ },
+ [0x1D719]={
+ category="ll",
+ description="MATHEMATICAL ITALIC PHI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D5 },
+ unicodeslot=0x1D719,
+ },
+ [0x1D71A]={
+ category="ll",
+ description="MATHEMATICAL ITALIC RHO SYMBOL",
+ direction="l",
+ linebreak="al",
+ mathclass="variable",
+ mathname="varrho",
+ specials={ "font", 0x03F1 },
+ unicodeslot=0x1D71A,
+ },
+ [0x1D71B]={
+ category="ll",
+ description="MATHEMATICAL ITALIC PI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D6 },
+ unicodeslot=0x1D71B,
+ },
+ [0x1D71C]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0391 },
+ unicodeslot=0x1D71C,
+ },
+ [0x1D71D]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0392 },
+ unicodeslot=0x1D71D,
+ },
+ [0x1D71E]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0393 },
+ unicodeslot=0x1D71E,
+ },
+ [0x1D71F]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0394 },
+ unicodeslot=0x1D71F,
+ },
+ [0x1D720]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0395 },
+ unicodeslot=0x1D720,
+ },
+ [0x1D721]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0396 },
+ unicodeslot=0x1D721,
+ },
+ [0x1D722]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0397 },
+ unicodeslot=0x1D722,
+ },
+ [0x1D723]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0398 },
+ unicodeslot=0x1D723,
+ },
+ [0x1D724]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0399 },
+ unicodeslot=0x1D724,
+ },
+ [0x1D725]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039A },
+ unicodeslot=0x1D725,
+ },
+ [0x1D726]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039B },
+ unicodeslot=0x1D726,
+ },
+ [0x1D727]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039C },
+ unicodeslot=0x1D727,
+ },
+ [0x1D728]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039D },
+ unicodeslot=0x1D728,
+ },
+ [0x1D729]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039E },
+ unicodeslot=0x1D729,
+ },
+ [0x1D72A]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039F },
+ unicodeslot=0x1D72A,
+ },
+ [0x1D72B]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A0 },
+ unicodeslot=0x1D72B,
+ },
+ [0x1D72C]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A1 },
+ unicodeslot=0x1D72C,
+ },
+ [0x1D72D]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F4 },
+ unicodeslot=0x1D72D,
+ },
+ [0x1D72E]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A3 },
+ unicodeslot=0x1D72E,
+ },
+ [0x1D72F]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A4 },
+ unicodeslot=0x1D72F,
+ },
+ [0x1D730]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A5 },
+ unicodeslot=0x1D730,
+ },
+ [0x1D731]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A6 },
+ unicodeslot=0x1D731,
+ },
+ [0x1D732]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A7 },
+ unicodeslot=0x1D732,
+ },
+ [0x1D733]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A8 },
+ unicodeslot=0x1D733,
+ },
+ [0x1D734]={
+ category="lu",
+ description="MATHEMATICAL BOLD ITALIC CAPITAL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A9 },
+ unicodeslot=0x1D734,
+ },
+ [0x1D735]={
+ category="sm",
+ description="MATHEMATICAL BOLD ITALIC NABLA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D735,
+ },
+ [0x1D736]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B1 },
+ unicodeslot=0x1D736,
+ },
+ [0x1D737]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B2 },
+ unicodeslot=0x1D737,
+ },
+ [0x1D738]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B3 },
+ unicodeslot=0x1D738,
+ },
+ [0x1D739]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B4 },
+ unicodeslot=0x1D739,
+ },
+ [0x1D73A]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B5 },
+ unicodeslot=0x1D73A,
+ },
+ [0x1D73B]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B6 },
+ unicodeslot=0x1D73B,
+ },
+ [0x1D73C]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B7 },
+ unicodeslot=0x1D73C,
+ },
+ [0x1D73D]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B8 },
+ unicodeslot=0x1D73D,
+ },
+ [0x1D73E]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B9 },
+ unicodeslot=0x1D73E,
+ },
+ [0x1D73F]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BA },
+ unicodeslot=0x1D73F,
+ },
+ [0x1D740]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BB },
+ unicodeslot=0x1D740,
+ },
+ [0x1D741]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BC },
+ unicodeslot=0x1D741,
+ },
+ [0x1D742]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BD },
+ unicodeslot=0x1D742,
+ },
+ [0x1D743]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BE },
+ unicodeslot=0x1D743,
+ },
+ [0x1D744]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BF },
+ unicodeslot=0x1D744,
+ },
+ [0x1D745]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C0 },
+ unicodeslot=0x1D745,
+ },
+ [0x1D746]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C1 },
+ unicodeslot=0x1D746,
+ },
+ [0x1D747]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C2 },
+ unicodeslot=0x1D747,
+ },
+ [0x1D748]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C3 },
+ unicodeslot=0x1D748,
+ },
+ [0x1D749]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C4 },
+ unicodeslot=0x1D749,
+ },
+ [0x1D74A]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C5 },
+ unicodeslot=0x1D74A,
+ },
+ [0x1D74B]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C6 },
+ unicodeslot=0x1D74B,
+ },
+ [0x1D74C]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C7 },
+ unicodeslot=0x1D74C,
+ },
+ [0x1D74D]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C8 },
+ unicodeslot=0x1D74D,
+ },
+ [0x1D74E]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC SMALL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C9 },
+ unicodeslot=0x1D74E,
+ },
+ [0x1D74F]={
+ category="sm",
+ description="MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D74F,
+ },
+ [0x1D750]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC EPSILON SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F5 },
+ unicodeslot=0x1D750,
+ },
+ [0x1D751]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D1 },
+ unicodeslot=0x1D751,
+ },
+ [0x1D752]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC KAPPA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F0 },
+ unicodeslot=0x1D752,
+ },
+ [0x1D753]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC PHI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D5 },
+ unicodeslot=0x1D753,
+ },
+ [0x1D754]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC RHO SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F1 },
+ unicodeslot=0x1D754,
+ },
+ [0x1D755]={
+ category="ll",
+ description="MATHEMATICAL BOLD ITALIC PI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D6 },
+ unicodeslot=0x1D755,
+ },
+ [0x1D756]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0391 },
+ unicodeslot=0x1D756,
+ },
+ [0x1D757]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0392 },
+ unicodeslot=0x1D757,
+ },
+ [0x1D758]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0393 },
+ unicodeslot=0x1D758,
+ },
+ [0x1D759]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0394 },
+ unicodeslot=0x1D759,
+ },
+ [0x1D75A]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0395 },
+ unicodeslot=0x1D75A,
+ },
+ [0x1D75B]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0396 },
+ unicodeslot=0x1D75B,
+ },
+ [0x1D75C]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0397 },
+ unicodeslot=0x1D75C,
+ },
+ [0x1D75D]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0398 },
+ unicodeslot=0x1D75D,
+ },
+ [0x1D75E]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0399 },
+ unicodeslot=0x1D75E,
+ },
+ [0x1D75F]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039A },
+ unicodeslot=0x1D75F,
+ },
+ [0x1D760]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039B },
+ unicodeslot=0x1D760,
+ },
+ [0x1D761]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039C },
+ unicodeslot=0x1D761,
+ },
+ [0x1D762]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039D },
+ unicodeslot=0x1D762,
+ },
+ [0x1D763]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039E },
+ unicodeslot=0x1D763,
+ },
+ [0x1D764]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039F },
+ unicodeslot=0x1D764,
+ },
+ [0x1D765]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A0 },
+ unicodeslot=0x1D765,
+ },
+ [0x1D766]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A1 },
+ unicodeslot=0x1D766,
+ },
+ [0x1D767]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F4 },
+ unicodeslot=0x1D767,
+ },
+ [0x1D768]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A3 },
+ unicodeslot=0x1D768,
+ },
+ [0x1D769]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A4 },
+ unicodeslot=0x1D769,
+ },
+ [0x1D76A]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A5 },
+ unicodeslot=0x1D76A,
+ },
+ [0x1D76B]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A6 },
+ unicodeslot=0x1D76B,
+ },
+ [0x1D76C]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A7 },
+ unicodeslot=0x1D76C,
+ },
+ [0x1D76D]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A8 },
+ unicodeslot=0x1D76D,
+ },
+ [0x1D76E]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A9 },
+ unicodeslot=0x1D76E,
+ },
+ [0x1D76F]={
+ category="sm",
+ description="MATHEMATICAL SANS-SERIF BOLD NABLA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D76F,
+ },
+ [0x1D770]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B1 },
+ unicodeslot=0x1D770,
+ },
+ [0x1D771]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B2 },
+ unicodeslot=0x1D771,
+ },
+ [0x1D772]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B3 },
+ unicodeslot=0x1D772,
+ },
+ [0x1D773]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B4 },
+ unicodeslot=0x1D773,
+ },
+ [0x1D774]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B5 },
+ unicodeslot=0x1D774,
+ },
+ [0x1D775]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B6 },
+ unicodeslot=0x1D775,
+ },
+ [0x1D776]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B7 },
+ unicodeslot=0x1D776,
+ },
+ [0x1D777]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B8 },
+ unicodeslot=0x1D777,
+ },
+ [0x1D778]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B9 },
+ unicodeslot=0x1D778,
+ },
+ [0x1D779]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BA },
+ unicodeslot=0x1D779,
+ },
+ [0x1D77A]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BB },
+ unicodeslot=0x1D77A,
+ },
+ [0x1D77B]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BC },
+ unicodeslot=0x1D77B,
+ },
+ [0x1D77C]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BD },
+ unicodeslot=0x1D77C,
+ },
+ [0x1D77D]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BE },
+ unicodeslot=0x1D77D,
+ },
+ [0x1D77E]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BF },
+ unicodeslot=0x1D77E,
+ },
+ [0x1D77F]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C0 },
+ unicodeslot=0x1D77F,
+ },
+ [0x1D780]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C1 },
+ unicodeslot=0x1D780,
+ },
+ [0x1D781]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C2 },
+ unicodeslot=0x1D781,
+ },
+ [0x1D782]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C3 },
+ unicodeslot=0x1D782,
+ },
+ [0x1D783]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C4 },
+ unicodeslot=0x1D783,
+ },
+ [0x1D784]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C5 },
+ unicodeslot=0x1D784,
+ },
+ [0x1D785]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C6 },
+ unicodeslot=0x1D785,
+ },
+ [0x1D786]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C7 },
+ unicodeslot=0x1D786,
+ },
+ [0x1D787]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C8 },
+ unicodeslot=0x1D787,
+ },
+ [0x1D788]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C9 },
+ unicodeslot=0x1D788,
+ },
+ [0x1D789]={
+ category="sm",
+ description="MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D789,
+ },
+ [0x1D78A]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F5 },
+ unicodeslot=0x1D78A,
+ },
+ [0x1D78B]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D1 },
+ unicodeslot=0x1D78B,
+ },
+ [0x1D78C]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F0 },
+ unicodeslot=0x1D78C,
+ },
+ [0x1D78D]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D5 },
+ unicodeslot=0x1D78D,
+ },
+ [0x1D78E]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F1 },
+ unicodeslot=0x1D78E,
+ },
+ [0x1D78F]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD PI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D6 },
+ unicodeslot=0x1D78F,
+ },
+ [0x1D790]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0391 },
+ unicodeslot=0x1D790,
+ },
+ [0x1D791]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0392 },
+ unicodeslot=0x1D791,
+ },
+ [0x1D792]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0393 },
+ unicodeslot=0x1D792,
+ },
+ [0x1D793]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0394 },
+ unicodeslot=0x1D793,
+ },
+ [0x1D794]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0395 },
+ unicodeslot=0x1D794,
+ },
+ [0x1D795]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0396 },
+ unicodeslot=0x1D795,
+ },
+ [0x1D796]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0397 },
+ unicodeslot=0x1D796,
+ },
+ [0x1D797]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0398 },
+ unicodeslot=0x1D797,
+ },
+ [0x1D798]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x0399 },
+ unicodeslot=0x1D798,
+ },
+ [0x1D799]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039A },
+ unicodeslot=0x1D799,
+ },
+ [0x1D79A]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039B },
+ unicodeslot=0x1D79A,
+ },
+ [0x1D79B]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039C },
+ unicodeslot=0x1D79B,
+ },
+ [0x1D79C]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039D },
+ unicodeslot=0x1D79C,
+ },
+ [0x1D79D]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039E },
+ unicodeslot=0x1D79D,
+ },
+ [0x1D79E]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x039F },
+ unicodeslot=0x1D79E,
+ },
+ [0x1D79F]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A0 },
+ unicodeslot=0x1D79F,
+ },
+ [0x1D7A0]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A1 },
+ unicodeslot=0x1D7A0,
+ },
+ [0x1D7A1]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F4 },
+ unicodeslot=0x1D7A1,
+ },
+ [0x1D7A2]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A3 },
+ unicodeslot=0x1D7A2,
+ },
+ [0x1D7A3]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A4 },
+ unicodeslot=0x1D7A3,
+ },
+ [0x1D7A4]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A5 },
+ unicodeslot=0x1D7A4,
+ },
+ [0x1D7A5]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A6 },
+ unicodeslot=0x1D7A5,
+ },
+ [0x1D7A6]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A7 },
+ unicodeslot=0x1D7A6,
+ },
+ [0x1D7A7]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A8 },
+ unicodeslot=0x1D7A7,
+ },
+ [0x1D7A8]={
+ category="lu",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03A9 },
+ unicodeslot=0x1D7A8,
+ },
+ [0x1D7A9]={
+ category="sm",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2207 },
+ unicodeslot=0x1D7A9,
+ },
+ [0x1D7AA]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B1 },
+ unicodeslot=0x1D7AA,
+ },
+ [0x1D7AB]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B2 },
+ unicodeslot=0x1D7AB,
+ },
+ [0x1D7AC]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B3 },
+ unicodeslot=0x1D7AC,
+ },
+ [0x1D7AD]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B4 },
+ unicodeslot=0x1D7AD,
+ },
+ [0x1D7AE]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B5 },
+ unicodeslot=0x1D7AE,
+ },
+ [0x1D7AF]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B6 },
+ unicodeslot=0x1D7AF,
+ },
+ [0x1D7B0]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B7 },
+ unicodeslot=0x1D7B0,
+ },
+ [0x1D7B1]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B8 },
+ unicodeslot=0x1D7B1,
+ },
+ [0x1D7B2]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03B9 },
+ unicodeslot=0x1D7B2,
+ },
+ [0x1D7B3]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BA },
+ unicodeslot=0x1D7B3,
+ },
+ [0x1D7B4]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BB },
+ unicodeslot=0x1D7B4,
+ },
+ [0x1D7B5]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BC },
+ unicodeslot=0x1D7B5,
+ },
+ [0x1D7B6]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BD },
+ unicodeslot=0x1D7B6,
+ },
+ [0x1D7B7]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BE },
+ unicodeslot=0x1D7B7,
+ },
+ [0x1D7B8]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03BF },
+ unicodeslot=0x1D7B8,
+ },
+ [0x1D7B9]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C0 },
+ unicodeslot=0x1D7B9,
+ },
+ [0x1D7BA]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C1 },
+ unicodeslot=0x1D7BA,
+ },
+ [0x1D7BB]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C2 },
+ unicodeslot=0x1D7BB,
+ },
+ [0x1D7BC]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C3 },
+ unicodeslot=0x1D7BC,
+ },
+ [0x1D7BD]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C4 },
+ unicodeslot=0x1D7BD,
+ },
+ [0x1D7BE]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C5 },
+ unicodeslot=0x1D7BE,
+ },
+ [0x1D7BF]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C6 },
+ unicodeslot=0x1D7BF,
+ },
+ [0x1D7C0]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C7 },
+ unicodeslot=0x1D7C0,
+ },
+ [0x1D7C1]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C8 },
+ unicodeslot=0x1D7C1,
+ },
+ [0x1D7C2]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03C9 },
+ unicodeslot=0x1D7C2,
+ },
+ [0x1D7C3]={
+ category="sm",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x2202 },
+ unicodeslot=0x1D7C3,
+ },
+ [0x1D7C4]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F5 },
+ unicodeslot=0x1D7C4,
+ },
+ [0x1D7C5]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D1 },
+ unicodeslot=0x1D7C5,
+ },
+ [0x1D7C6]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F0 },
+ unicodeslot=0x1D7C6,
+ },
+ [0x1D7C7]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D5 },
+ unicodeslot=0x1D7C7,
+ },
+ [0x1D7C8]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03F1 },
+ unicodeslot=0x1D7C8,
+ },
+ [0x1D7C9]={
+ category="ll",
+ description="MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03D6 },
+ unicodeslot=0x1D7C9,
+ },
+ [0x1D7CA]={
+ category="lu",
+ description="MATHEMATICAL BOLD CAPITAL DIGAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03DC },
+ unicodeslot=0x1D7CA,
+ },
+ [0x1D7CB]={
+ category="ll",
+ description="MATHEMATICAL BOLD SMALL DIGAMMA",
+ direction="l",
+ linebreak="al",
+ specials={ "font", 0x03DD },
+ unicodeslot=0x1D7CB,
+ },
+ [0x1D7CE]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT ZERO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0030 },
+ unicodeslot=0x1D7CE,
+ },
+ [0x1D7CF]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT ONE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0031 },
+ unicodeslot=0x1D7CF,
+ },
+ [0x1D7D0]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT TWO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0032 },
+ unicodeslot=0x1D7D0,
+ },
+ [0x1D7D1]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT THREE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0033 },
+ unicodeslot=0x1D7D1,
+ },
+ [0x1D7D2]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT FOUR",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0034 },
+ unicodeslot=0x1D7D2,
+ },
+ [0x1D7D3]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT FIVE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0035 },
+ unicodeslot=0x1D7D3,
+ },
+ [0x1D7D4]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT SIX",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0036 },
+ unicodeslot=0x1D7D4,
+ },
+ [0x1D7D5]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT SEVEN",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0037 },
+ unicodeslot=0x1D7D5,
+ },
+ [0x1D7D6]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT EIGHT",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0038 },
+ unicodeslot=0x1D7D6,
+ },
+ [0x1D7D7]={
+ category="nd",
+ description="MATHEMATICAL BOLD DIGIT NINE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0039 },
+ unicodeslot=0x1D7D7,
+ },
+ [0x1D7D8]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0030 },
+ unicodeslot=0x1D7D8,
+ },
+ [0x1D7D9]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT ONE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0031 },
+ unicodeslot=0x1D7D9,
+ },
+ [0x1D7DA]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT TWO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0032 },
+ unicodeslot=0x1D7DA,
+ },
+ [0x1D7DB]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT THREE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0033 },
+ unicodeslot=0x1D7DB,
+ },
+ [0x1D7DC]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0034 },
+ unicodeslot=0x1D7DC,
+ },
+ [0x1D7DD]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0035 },
+ unicodeslot=0x1D7DD,
+ },
+ [0x1D7DE]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT SIX",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0036 },
+ unicodeslot=0x1D7DE,
+ },
+ [0x1D7DF]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0037 },
+ unicodeslot=0x1D7DF,
+ },
+ [0x1D7E0]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0038 },
+ unicodeslot=0x1D7E0,
+ },
+ [0x1D7E1]={
+ category="nd",
+ description="MATHEMATICAL DOUBLE-STRUCK DIGIT NINE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0039 },
+ unicodeslot=0x1D7E1,
+ },
+ [0x1D7E2]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT ZERO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0030 },
+ unicodeslot=0x1D7E2,
+ },
+ [0x1D7E3]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT ONE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0031 },
+ unicodeslot=0x1D7E3,
+ },
+ [0x1D7E4]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT TWO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0032 },
+ unicodeslot=0x1D7E4,
+ },
+ [0x1D7E5]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT THREE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0033 },
+ unicodeslot=0x1D7E5,
+ },
+ [0x1D7E6]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT FOUR",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0034 },
+ unicodeslot=0x1D7E6,
+ },
+ [0x1D7E7]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT FIVE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0035 },
+ unicodeslot=0x1D7E7,
+ },
+ [0x1D7E8]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT SIX",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0036 },
+ unicodeslot=0x1D7E8,
+ },
+ [0x1D7E9]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT SEVEN",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0037 },
+ unicodeslot=0x1D7E9,
+ },
+ [0x1D7EA]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT EIGHT",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0038 },
+ unicodeslot=0x1D7EA,
+ },
+ [0x1D7EB]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF DIGIT NINE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0039 },
+ unicodeslot=0x1D7EB,
+ },
+ [0x1D7EC]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0030 },
+ unicodeslot=0x1D7EC,
+ },
+ [0x1D7ED]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT ONE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0031 },
+ unicodeslot=0x1D7ED,
+ },
+ [0x1D7EE]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT TWO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0032 },
+ unicodeslot=0x1D7EE,
+ },
+ [0x1D7EF]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT THREE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0033 },
+ unicodeslot=0x1D7EF,
+ },
+ [0x1D7F0]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0034 },
+ unicodeslot=0x1D7F0,
+ },
+ [0x1D7F1]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0035 },
+ unicodeslot=0x1D7F1,
+ },
+ [0x1D7F2]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT SIX",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0036 },
+ unicodeslot=0x1D7F2,
+ },
+ [0x1D7F3]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0037 },
+ unicodeslot=0x1D7F3,
+ },
+ [0x1D7F4]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0038 },
+ unicodeslot=0x1D7F4,
+ },
+ [0x1D7F5]={
+ category="nd",
+ description="MATHEMATICAL SANS-SERIF BOLD DIGIT NINE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0039 },
+ unicodeslot=0x1D7F5,
+ },
+ [0x1D7F6]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT ZERO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0030 },
+ unicodeslot=0x1D7F6,
+ },
+ [0x1D7F7]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT ONE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0031 },
+ unicodeslot=0x1D7F7,
+ },
+ [0x1D7F8]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT TWO",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0032 },
+ unicodeslot=0x1D7F8,
+ },
+ [0x1D7F9]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT THREE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0033 },
+ unicodeslot=0x1D7F9,
+ },
+ [0x1D7FA]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT FOUR",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0034 },
+ unicodeslot=0x1D7FA,
+ },
+ [0x1D7FB]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT FIVE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0035 },
+ unicodeslot=0x1D7FB,
+ },
+ [0x1D7FC]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT SIX",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0036 },
+ unicodeslot=0x1D7FC,
+ },
+ [0x1D7FD]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT SEVEN",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0037 },
+ unicodeslot=0x1D7FD,
+ },
+ [0x1D7FE]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT EIGHT",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0038 },
+ unicodeslot=0x1D7FE,
+ },
+ [0x1D7FF]={
+ category="nd",
+ description="MATHEMATICAL MONOSPACE DIGIT NINE",
+ direction="en",
+ linebreak="nu",
+ specials={ "font", 0x0039 },
+ unicodeslot=0x1D7FF,
+ },
+ [0x20000]={
+ category="lo",
+ cjkwd="w",
+ description="<CJK Ideograph Extension B>",
+ direction="l",
+ linebreak="id",
+ unicodeslot=0x20000,
+ range=0x2A6D6,
+ },
+ [0x2F800]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0320",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E3D },
+ unicodeslot=0x2F800,
+ },
+ [0x2F801]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0321",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E38 },
+ unicodeslot=0x2F801,
+ },
+ [0x2F802]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0322",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4E41 },
+ unicodeslot=0x2F802,
+ },
+ [0x2F803]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0323",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x20122 },
+ unicodeslot=0x2F803,
+ },
+ [0x2F804]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0324",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4F60 },
+ unicodeslot=0x2F804,
+ },
+ [0x2F805]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0325",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4FAE },
+ unicodeslot=0x2F805,
+ },
+ [0x2F806]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0326",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4FBB },
+ unicodeslot=0x2F806,
+ },
+ [0x2F807]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0327",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5002 },
+ unicodeslot=0x2F807,
+ },
+ [0x2F808]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0328",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x507A },
+ unicodeslot=0x2F808,
+ },
+ [0x2F809]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0329",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5099 },
+ unicodeslot=0x2F809,
+ },
+ [0x2F80A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0050A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x50E7 },
+ unicodeslot=0x2F80A,
+ },
+ [0x2F80B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0050B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x50CF },
+ unicodeslot=0x2F80B,
+ },
+ [0x2F80C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0050C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x349E },
+ unicodeslot=0x2F80C,
+ },
+ [0x2F80D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0050D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2063A },
+ unicodeslot=0x2F80D,
+ },
+ [0x2F80E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0050E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x514D },
+ unicodeslot=0x2F80E,
+ },
+ [0x2F80F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0050F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5154 },
+ unicodeslot=0x2F80F,
+ },
+ [0x2F810]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x032A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5164 },
+ unicodeslot=0x2F810,
+ },
+ [0x2F811]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x032B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5177 },
+ unicodeslot=0x2F811,
+ },
+ [0x2F812]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x032C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2051C },
+ unicodeslot=0x2F812,
+ },
+ [0x2F813]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x032D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x34B9 },
+ unicodeslot=0x2F813,
+ },
+ [0x2F814]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x032E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5167 },
+ unicodeslot=0x2F814,
+ },
+ [0x2F815]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x032F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x518D },
+ unicodeslot=0x2F815,
+ },
+ [0x2F816]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0330",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2054B },
+ unicodeslot=0x2F816,
+ },
+ [0x2F817]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0331",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5197 },
+ unicodeslot=0x2F817,
+ },
+ [0x2F818]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0332",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51A4 },
+ unicodeslot=0x2F818,
+ },
+ [0x2F819]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0333",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4ECC },
+ unicodeslot=0x2F819,
+ },
+ [0x2F81A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0051A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51AC },
+ unicodeslot=0x2F81A,
+ },
+ [0x2F81B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0051B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51B5 },
+ unicodeslot=0x2F81B,
+ },
+ [0x2F81C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0051C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x291DF },
+ unicodeslot=0x2F81C,
+ },
+ [0x2F81D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0051D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x51F5 },
+ unicodeslot=0x2F81D,
+ },
+ [0x2F81E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0051E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5203 },
+ unicodeslot=0x2F81E,
+ },
+ [0x2F81F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0051F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x34DF },
+ unicodeslot=0x2F81F,
+ },
+ [0x2F820]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0334",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x523B },
+ unicodeslot=0x2F820,
+ },
+ [0x2F821]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0335",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5246 },
+ unicodeslot=0x2F821,
+ },
+ [0x2F822]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0336",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5272 },
+ unicodeslot=0x2F822,
+ },
+ [0x2F823]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0337",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5277 },
+ unicodeslot=0x2F823,
+ },
+ [0x2F824]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0338",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3515 },
+ unicodeslot=0x2F824,
+ },
+ [0x2F825]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0339",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52C7 },
+ unicodeslot=0x2F825,
+ },
+ [0x2F826]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x033A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52C9 },
+ unicodeslot=0x2F826,
+ },
+ [0x2F827]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x033B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52E4 },
+ unicodeslot=0x2F827,
+ },
+ [0x2F828]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x033C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52FA },
+ unicodeslot=0x2F828,
+ },
+ [0x2F829]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x033D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5305 },
+ unicodeslot=0x2F829,
+ },
+ [0x2F82A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0052A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5306 },
+ unicodeslot=0x2F82A,
+ },
+ [0x2F82B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0052B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5317 },
+ unicodeslot=0x2F82B,
+ },
+ [0x2F82C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0052C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5349 },
+ unicodeslot=0x2F82C,
+ },
+ [0x2F82D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0052D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5351 },
+ unicodeslot=0x2F82D,
+ },
+ [0x2F82E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0052E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x535A },
+ unicodeslot=0x2F82E,
+ },
+ [0x2F82F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0052F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5373 },
+ unicodeslot=0x2F82F,
+ },
+ [0x2F830]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x033E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x537D },
+ unicodeslot=0x2F830,
+ },
+ [0x2F831]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x033F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x537F },
+ unicodeslot=0x2F831,
+ },
+ [0x2F832]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0340",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x537F },
+ unicodeslot=0x2F832,
+ },
+ [0x2F833]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0341",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x537F },
+ unicodeslot=0x2F833,
+ },
+ [0x2F834]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0342",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x20A2C },
+ unicodeslot=0x2F834,
+ },
+ [0x2F835]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0343",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7070 },
+ unicodeslot=0x2F835,
+ },
+ [0x2F836]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0344",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x53CA },
+ unicodeslot=0x2F836,
+ },
+ [0x2F837]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0345",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x53DF },
+ unicodeslot=0x2F837,
+ },
+ [0x2F838]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0346",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x20B63 },
+ unicodeslot=0x2F838,
+ },
+ [0x2F839]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0347",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x53EB },
+ unicodeslot=0x2F839,
+ },
+ [0x2F83A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0053A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x53F1 },
+ unicodeslot=0x2F83A,
+ },
+ [0x2F83B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0053B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5406 },
+ unicodeslot=0x2F83B,
+ },
+ [0x2F83C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0053C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x549E },
+ unicodeslot=0x2F83C,
+ },
+ [0x2F83D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0053D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5438 },
+ unicodeslot=0x2F83D,
+ },
+ [0x2F83E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0053E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5448 },
+ unicodeslot=0x2F83E,
+ },
+ [0x2F83F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0053F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5468 },
+ unicodeslot=0x2F83F,
+ },
+ [0x2F840]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0348",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x54A2 },
+ unicodeslot=0x2F840,
+ },
+ [0x2F841]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0349",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x54F6 },
+ unicodeslot=0x2F841,
+ },
+ [0x2F842]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x034A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5510 },
+ unicodeslot=0x2F842,
+ },
+ [0x2F843]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x034B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5553 },
+ unicodeslot=0x2F843,
+ },
+ [0x2F844]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x034C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5563 },
+ unicodeslot=0x2F844,
+ },
+ [0x2F845]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x034D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5584 },
+ unicodeslot=0x2F845,
+ },
+ [0x2F846]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x034E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5584 },
+ unicodeslot=0x2F846,
+ },
+ [0x2F847]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x034F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5599 },
+ unicodeslot=0x2F847,
+ },
+ [0x2F848]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0350",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x55AB },
+ unicodeslot=0x2F848,
+ },
+ [0x2F849]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0351",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x55B3 },
+ unicodeslot=0x2F849,
+ },
+ [0x2F84A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0054A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x55C2 },
+ unicodeslot=0x2F84A,
+ },
+ [0x2F84B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0054B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5716 },
+ unicodeslot=0x2F84B,
+ },
+ [0x2F84C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0054C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5606 },
+ unicodeslot=0x2F84C,
+ },
+ [0x2F84D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0054D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5717 },
+ unicodeslot=0x2F84D,
+ },
+ [0x2F84E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0054E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5651 },
+ unicodeslot=0x2F84E,
+ },
+ [0x2F84F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0054F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5674 },
+ unicodeslot=0x2F84F,
+ },
+ [0x2F850]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0352",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5207 },
+ unicodeslot=0x2F850,
+ },
+ [0x2F851]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0353",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58EE },
+ unicodeslot=0x2F851,
+ },
+ [0x2F852]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0354",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x57CE },
+ unicodeslot=0x2F852,
+ },
+ [0x2F853]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0355",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x57F4 },
+ unicodeslot=0x2F853,
+ },
+ [0x2F854]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0356",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x580D },
+ unicodeslot=0x2F854,
+ },
+ [0x2F855]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0357",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x578B },
+ unicodeslot=0x2F855,
+ },
+ [0x2F856]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0358",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5832 },
+ unicodeslot=0x2F856,
+ },
+ [0x2F857]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0359",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5831 },
+ unicodeslot=0x2F857,
+ },
+ [0x2F858]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x035A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58AC },
+ unicodeslot=0x2F858,
+ },
+ [0x2F859]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x035B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x214E4 },
+ unicodeslot=0x2F859,
+ },
+ [0x2F85A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0055A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58F2 },
+ unicodeslot=0x2F85A,
+ },
+ [0x2F85B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0055B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x58F7 },
+ unicodeslot=0x2F85B,
+ },
+ [0x2F85C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0055C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5906 },
+ unicodeslot=0x2F85C,
+ },
+ [0x2F85D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0055D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x591A },
+ unicodeslot=0x2F85D,
+ },
+ [0x2F85E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0055E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5922 },
+ unicodeslot=0x2F85E,
+ },
+ [0x2F85F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0055F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5962 },
+ unicodeslot=0x2F85F,
+ },
+ [0x2F860]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x035C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x216A8 },
+ unicodeslot=0x2F860,
+ },
+ [0x2F861]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x035D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x216EA },
+ unicodeslot=0x2F861,
+ },
+ [0x2F862]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x035E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x59EC },
+ unicodeslot=0x2F862,
+ },
+ [0x2F863]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x035F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5A1B },
+ unicodeslot=0x2F863,
+ },
+ [0x2F864]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0360",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5A27 },
+ unicodeslot=0x2F864,
+ },
+ [0x2F865]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0361",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x59D8 },
+ unicodeslot=0x2F865,
+ },
+ [0x2F866]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0362",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5A66 },
+ unicodeslot=0x2F866,
+ },
+ [0x2F867]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0363",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x36EE },
+ unicodeslot=0x2F867,
+ },
+ [0x2F868]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0364",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x36FC },
+ unicodeslot=0x2F868,
+ },
+ [0x2F869]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0365",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5B08 },
+ unicodeslot=0x2F869,
+ },
+ [0x2F86A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0056A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5B3E },
+ unicodeslot=0x2F86A,
+ },
+ [0x2F86B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0056B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5B3E },
+ unicodeslot=0x2F86B,
+ },
+ [0x2F86C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0056C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x219C8 },
+ unicodeslot=0x2F86C,
+ },
+ [0x2F86D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0056D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BC3 },
+ unicodeslot=0x2F86D,
+ },
+ [0x2F86E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0056E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BD8 },
+ unicodeslot=0x2F86E,
+ },
+ [0x2F86F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0056F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BE7 },
+ unicodeslot=0x2F86F,
+ },
+ [0x2F870]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0366",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BF3 },
+ unicodeslot=0x2F870,
+ },
+ [0x2F871]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0367",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x21B18 },
+ unicodeslot=0x2F871,
+ },
+ [0x2F872]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0368",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5BFF },
+ unicodeslot=0x2F872,
+ },
+ [0x2F873]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0369",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C06 },
+ unicodeslot=0x2F873,
+ },
+ [0x2F874]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x036A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F53 },
+ unicodeslot=0x2F874,
+ },
+ [0x2F875]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x036B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C22 },
+ unicodeslot=0x2F875,
+ },
+ [0x2F876]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x036C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3781 },
+ unicodeslot=0x2F876,
+ },
+ [0x2F877]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x036D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C60 },
+ unicodeslot=0x2F877,
+ },
+ [0x2F878]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x036E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C6E },
+ unicodeslot=0x2F878,
+ },
+ [0x2F879]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x036F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5CC0 },
+ unicodeslot=0x2F879,
+ },
+ [0x2F87A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0057A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5C8D },
+ unicodeslot=0x2F87A,
+ },
+ [0x2F87B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0057B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x21DE4 },
+ unicodeslot=0x2F87B,
+ },
+ [0x2F87C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0057C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5D43 },
+ unicodeslot=0x2F87C,
+ },
+ [0x2F87D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0057D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x21DE6 },
+ unicodeslot=0x2F87D,
+ },
+ [0x2F87E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0057E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5D6E },
+ unicodeslot=0x2F87E,
+ },
+ [0x2F87F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0057F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5D6B },
+ unicodeslot=0x2F87F,
+ },
+ [0x2F880]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0370",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5D7C },
+ unicodeslot=0x2F880,
+ },
+ [0x2F881]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0371",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5DE1 },
+ unicodeslot=0x2F881,
+ },
+ [0x2F882]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0372",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5DE2 },
+ unicodeslot=0x2F882,
+ },
+ [0x2F883]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0373",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x382F },
+ unicodeslot=0x2F883,
+ },
+ [0x2F884]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0374",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5DFD },
+ unicodeslot=0x2F884,
+ },
+ [0x2F885]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0375",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5E28 },
+ unicodeslot=0x2F885,
+ },
+ [0x2F886]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0376",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5E3D },
+ unicodeslot=0x2F886,
+ },
+ [0x2F887]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0377",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5E69 },
+ unicodeslot=0x2F887,
+ },
+ [0x2F888]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0378",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3862 },
+ unicodeslot=0x2F888,
+ },
+ [0x2F889]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0379",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x22183 },
+ unicodeslot=0x2F889,
+ },
+ [0x2F88A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0058A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x387C },
+ unicodeslot=0x2F88A,
+ },
+ [0x2F88B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0058B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5EB0 },
+ unicodeslot=0x2F88B,
+ },
+ [0x2F88C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0058C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5EB3 },
+ unicodeslot=0x2F88C,
+ },
+ [0x2F88D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0058D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5EB6 },
+ unicodeslot=0x2F88D,
+ },
+ [0x2F88E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0058E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5ECA },
+ unicodeslot=0x2F88E,
+ },
+ [0x2F88F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0058F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2A392 },
+ unicodeslot=0x2F88F,
+ },
+ [0x2F890]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x037A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5EFE },
+ unicodeslot=0x2F890,
+ },
+ [0x2F891]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x037B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x22331 },
+ unicodeslot=0x2F891,
+ },
+ [0x2F892]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x037C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x22331 },
+ unicodeslot=0x2F892,
+ },
+ [0x2F893]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x037D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8201 },
+ unicodeslot=0x2F893,
+ },
+ [0x2F894]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x037E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F22 },
+ unicodeslot=0x2F894,
+ },
+ [0x2F895]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x037F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F22 },
+ unicodeslot=0x2F895,
+ },
+ [0x2F896]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0380",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x38C7 },
+ unicodeslot=0x2F896,
+ },
+ [0x2F897]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0381",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x232B8 },
+ unicodeslot=0x2F897,
+ },
+ [0x2F898]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0382",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x261DA },
+ unicodeslot=0x2F898,
+ },
+ [0x2F899]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0383",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F62 },
+ unicodeslot=0x2F899,
+ },
+ [0x2F89A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0059A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F6B },
+ unicodeslot=0x2F89A,
+ },
+ [0x2F89B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0059B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x38E3 },
+ unicodeslot=0x2F89B,
+ },
+ [0x2F89C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0059C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5F9A },
+ unicodeslot=0x2F89C,
+ },
+ [0x2F89D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0059D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5FCD },
+ unicodeslot=0x2F89D,
+ },
+ [0x2F89E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0059E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5FD7 },
+ unicodeslot=0x2F89E,
+ },
+ [0x2F89F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0059F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5FF9 },
+ unicodeslot=0x2F89F,
+ },
+ [0x2F8A0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6081 },
+ unicodeslot=0x2F8A0,
+ },
+ [0x2F8A1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x393A },
+ unicodeslot=0x2F8A1,
+ },
+ [0x2F8A2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x391C },
+ unicodeslot=0x2F8A2,
+ },
+ [0x2F8A3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6094 },
+ unicodeslot=0x2F8A3,
+ },
+ [0x2F8A4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x226D4 },
+ unicodeslot=0x2F8A4,
+ },
+ [0x2F8A5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x60C7 },
+ unicodeslot=0x2F8A5,
+ },
+ [0x2F8A6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6148 },
+ unicodeslot=0x2F8A6,
+ },
+ [0x2F8A7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x614C },
+ unicodeslot=0x2F8A7,
+ },
+ [0x2F8A8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x614E },
+ unicodeslot=0x2F8A8,
+ },
+ [0x2F8A9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008A0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x614C },
+ unicodeslot=0x2F8A9,
+ },
+ [0x2F8AA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008AA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x617A },
+ unicodeslot=0x2F8AA,
+ },
+ [0x2F8AB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008AB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x618E },
+ unicodeslot=0x2F8AB,
+ },
+ [0x2F8AC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008AC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61B2 },
+ unicodeslot=0x2F8AC,
+ },
+ [0x2F8AD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008AD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61A4 },
+ unicodeslot=0x2F8AD,
+ },
+ [0x2F8AE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008AE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61AF },
+ unicodeslot=0x2F8AE,
+ },
+ [0x2F8AF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008AF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61DE },
+ unicodeslot=0x2F8AF,
+ },
+ [0x2F8B0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61F2 },
+ unicodeslot=0x2F8B0,
+ },
+ [0x2F8B1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x61F6 },
+ unicodeslot=0x2F8B1,
+ },
+ [0x2F8B2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6210 },
+ unicodeslot=0x2F8B2,
+ },
+ [0x2F8B3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x621B },
+ unicodeslot=0x2F8B3,
+ },
+ [0x2F8B4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x625D },
+ unicodeslot=0x2F8B4,
+ },
+ [0x2F8B5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x62B1 },
+ unicodeslot=0x2F8B5,
+ },
+ [0x2F8B6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x62D4 },
+ unicodeslot=0x2F8B6,
+ },
+ [0x2F8B7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6350 },
+ unicodeslot=0x2F8B7,
+ },
+ [0x2F8B8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x22B0C },
+ unicodeslot=0x2F8B8,
+ },
+ [0x2F8B9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008B0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x633D },
+ unicodeslot=0x2F8B9,
+ },
+ [0x2F8BA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x62FC },
+ unicodeslot=0x2F8BA,
+ },
+ [0x2F8BB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008BB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6368 },
+ unicodeslot=0x2F8BB,
+ },
+ [0x2F8BC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008BC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6383 },
+ unicodeslot=0x2F8BC,
+ },
+ [0x2F8BD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008BD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x63E4 },
+ unicodeslot=0x2F8BD,
+ },
+ [0x2F8BE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x22BF1 },
+ unicodeslot=0x2F8BE,
+ },
+ [0x2F8BF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008BF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6422 },
+ unicodeslot=0x2F8BF,
+ },
+ [0x2F8C0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x63C5 },
+ unicodeslot=0x2F8C0,
+ },
+ [0x2F8C1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x63A9 },
+ unicodeslot=0x2F8C1,
+ },
+ [0x2F8C2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3A2E },
+ unicodeslot=0x2F8C2,
+ },
+ [0x2F8C3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6469 },
+ unicodeslot=0x2F8C3,
+ },
+ [0x2F8C4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x647E },
+ unicodeslot=0x2F8C4,
+ },
+ [0x2F8C5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x649D },
+ unicodeslot=0x2F8C5,
+ },
+ [0x2F8C6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6477 },
+ unicodeslot=0x2F8C6,
+ },
+ [0x2F8C7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3A6C },
+ unicodeslot=0x2F8C7,
+ },
+ [0x2F8C8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x654F },
+ unicodeslot=0x2F8C8,
+ },
+ [0x2F8C9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008C0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x656C },
+ unicodeslot=0x2F8C9,
+ },
+ [0x2F8CA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008CA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2300A },
+ unicodeslot=0x2F8CA,
+ },
+ [0x2F8CB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008CB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x65E3 },
+ unicodeslot=0x2F8CB,
+ },
+ [0x2F8CC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008CC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x66F8 },
+ unicodeslot=0x2F8CC,
+ },
+ [0x2F8CD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008CD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6649 },
+ unicodeslot=0x2F8CD,
+ },
+ [0x2F8CE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008CE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3B19 },
+ unicodeslot=0x2F8CE,
+ },
+ [0x2F8CF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008CF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6691 },
+ unicodeslot=0x2F8CF,
+ },
+ [0x2F8D0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3B08 },
+ unicodeslot=0x2F8D0,
+ },
+ [0x2F8D1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3AE4 },
+ unicodeslot=0x2F8D1,
+ },
+ [0x2F8D2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5192 },
+ unicodeslot=0x2F8D2,
+ },
+ [0x2F8D3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5195 },
+ unicodeslot=0x2F8D3,
+ },
+ [0x2F8D4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6700 },
+ unicodeslot=0x2F8D4,
+ },
+ [0x2F8D5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x669C },
+ unicodeslot=0x2F8D5,
+ },
+ [0x2F8D6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x80AD },
+ unicodeslot=0x2F8D6,
+ },
+ [0x2F8D7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x43D9 },
+ unicodeslot=0x2F8D7,
+ },
+ [0x2F8D8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6717 },
+ unicodeslot=0x2F8D8,
+ },
+ [0x2F8D9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008D0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x671B },
+ unicodeslot=0x2F8D9,
+ },
+ [0x2F8DA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6721 },
+ unicodeslot=0x2F8DA,
+ },
+ [0x2F8DB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008DB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x675E },
+ unicodeslot=0x2F8DB,
+ },
+ [0x2F8DC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008DC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6753 },
+ unicodeslot=0x2F8DC,
+ },
+ [0x2F8DD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008DD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x233C3 },
+ unicodeslot=0x2F8DD,
+ },
+ [0x2F8DE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3B49 },
+ unicodeslot=0x2F8DE,
+ },
+ [0x2F8DF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008DF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x67FA },
+ unicodeslot=0x2F8DF,
+ },
+ [0x2F8E0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6785 },
+ unicodeslot=0x2F8E0,
+ },
+ [0x2F8E1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6852 },
+ unicodeslot=0x2F8E1,
+ },
+ [0x2F8E2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6885 },
+ unicodeslot=0x2F8E2,
+ },
+ [0x2F8E3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2346D },
+ unicodeslot=0x2F8E3,
+ },
+ [0x2F8E4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x688E },
+ unicodeslot=0x2F8E4,
+ },
+ [0x2F8E5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x681F },
+ unicodeslot=0x2F8E5,
+ },
+ [0x2F8E6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6914 },
+ unicodeslot=0x2F8E6,
+ },
+ [0x2F8E7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3B9D },
+ unicodeslot=0x2F8E7,
+ },
+ [0x2F8E8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6942 },
+ unicodeslot=0x2F8E8,
+ },
+ [0x2F8E9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008E0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x69A3 },
+ unicodeslot=0x2F8E9,
+ },
+ [0x2F8EA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008EA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x69EA },
+ unicodeslot=0x2F8EA,
+ },
+ [0x2F8EB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008EB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6AA8 },
+ unicodeslot=0x2F8EB,
+ },
+ [0x2F8EC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008EC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x236A3 },
+ unicodeslot=0x2F8EC,
+ },
+ [0x2F8ED]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008ED",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6ADB },
+ unicodeslot=0x2F8ED,
+ },
+ [0x2F8EE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008EE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3C18 },
+ unicodeslot=0x2F8EE,
+ },
+ [0x2F8EF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008EF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6B21 },
+ unicodeslot=0x2F8EF,
+ },
+ [0x2F8F0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x238A7 },
+ unicodeslot=0x2F8F0,
+ },
+ [0x2F8F1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6B54 },
+ unicodeslot=0x2F8F1,
+ },
+ [0x2F8F2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3C4E },
+ unicodeslot=0x2F8F2,
+ },
+ [0x2F8F3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6B72 },
+ unicodeslot=0x2F8F3,
+ },
+ [0x2F8F4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6B9F },
+ unicodeslot=0x2F8F4,
+ },
+ [0x2F8F5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6BBA },
+ unicodeslot=0x2F8F5,
+ },
+ [0x2F8F6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6BBB },
+ unicodeslot=0x2F8F6,
+ },
+ [0x2F8F7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23A8D },
+ unicodeslot=0x2F8F7,
+ },
+ [0x2F8F8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x21D0B },
+ unicodeslot=0x2F8F8,
+ },
+ [0x2F8F9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008F0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23AFA },
+ unicodeslot=0x2F8F9,
+ },
+ [0x2F8FA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008FA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6C4E },
+ unicodeslot=0x2F8FA,
+ },
+ [0x2F8FB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008FB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23CBC },
+ unicodeslot=0x2F8FB,
+ },
+ [0x2F8FC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008FC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6CBF },
+ unicodeslot=0x2F8FC,
+ },
+ [0x2F8FD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008FD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6CCD },
+ unicodeslot=0x2F8FD,
+ },
+ [0x2F8FE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008FE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6C67 },
+ unicodeslot=0x2F8FE,
+ },
+ [0x2F8FF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0008FF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D16 },
+ unicodeslot=0x2F8FF,
+ },
+ [0x2F900]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0384",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D3E },
+ unicodeslot=0x2F900,
+ },
+ [0x2F901]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0385",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D77 },
+ unicodeslot=0x2F901,
+ },
+ [0x2F902]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0386",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D41 },
+ unicodeslot=0x2F902,
+ },
+ [0x2F903]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0387",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D69 },
+ unicodeslot=0x2F903,
+ },
+ [0x2F904]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0388",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D78 },
+ unicodeslot=0x2F904,
+ },
+ [0x2F905]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0389",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D85 },
+ unicodeslot=0x2F905,
+ },
+ [0x2F906]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x038A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23D1E },
+ unicodeslot=0x2F906,
+ },
+ [0x2F907]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x038B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6D34 },
+ unicodeslot=0x2F907,
+ },
+ [0x2F908]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x038C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6E2F },
+ unicodeslot=0x2F908,
+ },
+ [0x2F909]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x038D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6E6E },
+ unicodeslot=0x2F909,
+ },
+ [0x2F90A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005AA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3D33 },
+ unicodeslot=0x2F90A,
+ },
+ [0x2F90B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005AB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6ECB },
+ unicodeslot=0x2F90B,
+ },
+ [0x2F90C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005AC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6EC7 },
+ unicodeslot=0x2F90C,
+ },
+ [0x2F90D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005AD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23ED1 },
+ unicodeslot=0x2F90D,
+ },
+ [0x2F90E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005AE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6DF9 },
+ unicodeslot=0x2F90E,
+ },
+ [0x2F90F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005AF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6F6E },
+ unicodeslot=0x2F90F,
+ },
+ [0x2F910]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x038E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23F5E },
+ unicodeslot=0x2F910,
+ },
+ [0x2F911]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x038F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23F8E },
+ unicodeslot=0x2F911,
+ },
+ [0x2F912]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0390",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x6FC6 },
+ unicodeslot=0x2F912,
+ },
+ [0x2F913]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0391",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7039 },
+ unicodeslot=0x2F913,
+ },
+ [0x2F914]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0392",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x701E },
+ unicodeslot=0x2F914,
+ },
+ [0x2F915]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0393",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x701B },
+ unicodeslot=0x2F915,
+ },
+ [0x2F916]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0394",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3D96 },
+ unicodeslot=0x2F916,
+ },
+ [0x2F917]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0395",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x704A },
+ unicodeslot=0x2F917,
+ },
+ [0x2F918]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0396",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x707D },
+ unicodeslot=0x2F918,
+ },
+ [0x2F919]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0397",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7077 },
+ unicodeslot=0x2F919,
+ },
+ [0x2F91A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x70AD },
+ unicodeslot=0x2F91A,
+ },
+ [0x2F91B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005BB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x20525 },
+ unicodeslot=0x2F91B,
+ },
+ [0x2F91C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005BC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7145 },
+ unicodeslot=0x2F91C,
+ },
+ [0x2F91D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005BD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24263 },
+ unicodeslot=0x2F91D,
+ },
+ [0x2F91E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x719C },
+ unicodeslot=0x2F91E,
+ },
+ [0x2F91F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005BF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x243AB },
+ unicodeslot=0x2F91F,
+ },
+ [0x2F920]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0398",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7228 },
+ unicodeslot=0x2F920,
+ },
+ [0x2F921]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0399",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7235 },
+ unicodeslot=0x2F921,
+ },
+ [0x2F922]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x039A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7250 },
+ unicodeslot=0x2F922,
+ },
+ [0x2F923]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x039B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24608 },
+ unicodeslot=0x2F923,
+ },
+ [0x2F924]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x039C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7280 },
+ unicodeslot=0x2F924,
+ },
+ [0x2F925]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x039D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7295 },
+ unicodeslot=0x2F925,
+ },
+ [0x2F926]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x039E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24735 },
+ unicodeslot=0x2F926,
+ },
+ [0x2F927]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x039F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24814 },
+ unicodeslot=0x2F927,
+ },
+ [0x2F928]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x737A },
+ unicodeslot=0x2F928,
+ },
+ [0x2F929]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x738B },
+ unicodeslot=0x2F929,
+ },
+ [0x2F92A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005CA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3EAC },
+ unicodeslot=0x2F92A,
+ },
+ [0x2F92B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005CB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x73A5 },
+ unicodeslot=0x2F92B,
+ },
+ [0x2F92C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005CC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3EB8 },
+ unicodeslot=0x2F92C,
+ },
+ [0x2F92D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005CD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3EB8 },
+ unicodeslot=0x2F92D,
+ },
+ [0x2F92E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005CE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7447 },
+ unicodeslot=0x2F92E,
+ },
+ [0x2F92F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005CF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x745C },
+ unicodeslot=0x2F92F,
+ },
+ [0x2F930]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7471 },
+ unicodeslot=0x2F930,
+ },
+ [0x2F931]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7485 },
+ unicodeslot=0x2F931,
+ },
+ [0x2F932]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x74CA },
+ unicodeslot=0x2F932,
+ },
+ [0x2F933]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3F1B },
+ unicodeslot=0x2F933,
+ },
+ [0x2F934]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7524 },
+ unicodeslot=0x2F934,
+ },
+ [0x2F935]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24C36 },
+ unicodeslot=0x2F935,
+ },
+ [0x2F936]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x753E },
+ unicodeslot=0x2F936,
+ },
+ [0x2F937]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03A9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24C92 },
+ unicodeslot=0x2F937,
+ },
+ [0x2F938]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03AA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7570 },
+ unicodeslot=0x2F938,
+ },
+ [0x2F939]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03AB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2219F },
+ unicodeslot=0x2F939,
+ },
+ [0x2F93A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7610 },
+ unicodeslot=0x2F93A,
+ },
+ [0x2F93B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005DB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24FA1 },
+ unicodeslot=0x2F93B,
+ },
+ [0x2F93C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005DC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x24FB8 },
+ unicodeslot=0x2F93C,
+ },
+ [0x2F93D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005DD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25044 },
+ unicodeslot=0x2F93D,
+ },
+ [0x2F93E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x3FFC },
+ unicodeslot=0x2F93E,
+ },
+ [0x2F93F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005DF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4008 },
+ unicodeslot=0x2F93F,
+ },
+ [0x2F940]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03AC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x76F4 },
+ unicodeslot=0x2F940,
+ },
+ [0x2F941]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03AD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x250F3 },
+ unicodeslot=0x2F941,
+ },
+ [0x2F942]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03AE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x250F2 },
+ unicodeslot=0x2F942,
+ },
+ [0x2F943]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03AF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25119 },
+ unicodeslot=0x2F943,
+ },
+ [0x2F944]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25133 },
+ unicodeslot=0x2F944,
+ },
+ [0x2F945]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x771E },
+ unicodeslot=0x2F945,
+ },
+ [0x2F946]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x771F },
+ unicodeslot=0x2F946,
+ },
+ [0x2F947]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x771F },
+ unicodeslot=0x2F947,
+ },
+ [0x2F948]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x774A },
+ unicodeslot=0x2F948,
+ },
+ [0x2F949]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4039 },
+ unicodeslot=0x2F949,
+ },
+ [0x2F94A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005EA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x778B },
+ unicodeslot=0x2F94A,
+ },
+ [0x2F94B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005EB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4046 },
+ unicodeslot=0x2F94B,
+ },
+ [0x2F94C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005EC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4096 },
+ unicodeslot=0x2F94C,
+ },
+ [0x2F94D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005ED",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2541D },
+ unicodeslot=0x2F94D,
+ },
+ [0x2F94E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005EE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x784E },
+ unicodeslot=0x2F94E,
+ },
+ [0x2F94F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005EF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x788C },
+ unicodeslot=0x2F94F,
+ },
+ [0x2F950]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x78CC },
+ unicodeslot=0x2F950,
+ },
+ [0x2F951]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x40E3 },
+ unicodeslot=0x2F951,
+ },
+ [0x2F952]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25626 },
+ unicodeslot=0x2F952,
+ },
+ [0x2F953]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03B9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7956 },
+ unicodeslot=0x2F953,
+ },
+ [0x2F954]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2569A },
+ unicodeslot=0x2F954,
+ },
+ [0x2F955]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03BB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x256C5 },
+ unicodeslot=0x2F955,
+ },
+ [0x2F956]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03BC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x798F },
+ unicodeslot=0x2F956,
+ },
+ [0x2F957]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03BD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x79EB },
+ unicodeslot=0x2F957,
+ },
+ [0x2F958]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x412F },
+ unicodeslot=0x2F958,
+ },
+ [0x2F959]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03BF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7A40 },
+ unicodeslot=0x2F959,
+ },
+ [0x2F95A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005FA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7A4A },
+ unicodeslot=0x2F95A,
+ },
+ [0x2F95B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005FB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7A4F },
+ unicodeslot=0x2F95B,
+ },
+ [0x2F95C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005FC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2597C },
+ unicodeslot=0x2F95C,
+ },
+ [0x2F95D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005FD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25AA7 },
+ unicodeslot=0x2F95D,
+ },
+ [0x2F95E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005FE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25AA7 },
+ unicodeslot=0x2F95E,
+ },
+ [0x2F95F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x005FF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7AEE },
+ unicodeslot=0x2F95F,
+ },
+ [0x2F960]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4202 },
+ unicodeslot=0x2F960,
+ },
+ [0x2F961]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25BAB },
+ unicodeslot=0x2F961,
+ },
+ [0x2F962]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7BC6 },
+ unicodeslot=0x2F962,
+ },
+ [0x2F963]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7BC9 },
+ unicodeslot=0x2F963,
+ },
+ [0x2F964]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4227 },
+ unicodeslot=0x2F964,
+ },
+ [0x2F965]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25C80 },
+ unicodeslot=0x2F965,
+ },
+ [0x2F966]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7CD2 },
+ unicodeslot=0x2F966,
+ },
+ [0x2F967]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x42A0 },
+ unicodeslot=0x2F967,
+ },
+ [0x2F968]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7CE8 },
+ unicodeslot=0x2F968,
+ },
+ [0x2F969]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03C9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7CE3 },
+ unicodeslot=0x2F969,
+ },
+ [0x2F96A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0060A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7D00 },
+ unicodeslot=0x2F96A,
+ },
+ [0x2F96B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0060B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x25F86 },
+ unicodeslot=0x2F96B,
+ },
+ [0x2F96C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0060C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7D63 },
+ unicodeslot=0x2F96C,
+ },
+ [0x2F96D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0060D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4301 },
+ unicodeslot=0x2F96D,
+ },
+ [0x2F96E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0060E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7DC7 },
+ unicodeslot=0x2F96E,
+ },
+ [0x2F96F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0060F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7E02 },
+ unicodeslot=0x2F96F,
+ },
+ [0x2F970]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03CA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7E45 },
+ unicodeslot=0x2F970,
+ },
+ [0x2F971]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03CB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4334 },
+ unicodeslot=0x2F971,
+ },
+ [0x2F972]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03CC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26228 },
+ unicodeslot=0x2F972,
+ },
+ [0x2F973]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03CD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26247 },
+ unicodeslot=0x2F973,
+ },
+ [0x2F974]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03CE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4359 },
+ unicodeslot=0x2F974,
+ },
+ [0x2F975]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03CF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x262D9 },
+ unicodeslot=0x2F975,
+ },
+ [0x2F976]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7F7A },
+ unicodeslot=0x2F976,
+ },
+ [0x2F977]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2633E },
+ unicodeslot=0x2F977,
+ },
+ [0x2F978]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7F95 },
+ unicodeslot=0x2F978,
+ },
+ [0x2F979]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x7FFA },
+ unicodeslot=0x2F979,
+ },
+ [0x2F97A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0061A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8005 },
+ unicodeslot=0x2F97A,
+ },
+ [0x2F97B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0061B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x264DA },
+ unicodeslot=0x2F97B,
+ },
+ [0x2F97C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0061C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26523 },
+ unicodeslot=0x2F97C,
+ },
+ [0x2F97D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0061D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8060 },
+ unicodeslot=0x2F97D,
+ },
+ [0x2F97E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0061E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x265A8 },
+ unicodeslot=0x2F97E,
+ },
+ [0x2F97F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0061F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8070 },
+ unicodeslot=0x2F97F,
+ },
+ [0x2F980]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2335F },
+ unicodeslot=0x2F980,
+ },
+ [0x2F981]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x43D5 },
+ unicodeslot=0x2F981,
+ },
+ [0x2F982]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x80B2 },
+ unicodeslot=0x2F982,
+ },
+ [0x2F983]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8103 },
+ unicodeslot=0x2F983,
+ },
+ [0x2F984]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D8",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x440B },
+ unicodeslot=0x2F984,
+ },
+ [0x2F985]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03D9",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x813E },
+ unicodeslot=0x2F985,
+ },
+ [0x2F986]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5AB5 },
+ unicodeslot=0x2F986,
+ },
+ [0x2F987]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03DB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x267A7 },
+ unicodeslot=0x2F987,
+ },
+ [0x2F988]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03DC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x267B5 },
+ unicodeslot=0x2F988,
+ },
+ [0x2F989]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03DD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x23393 },
+ unicodeslot=0x2F989,
+ },
+ [0x2F98A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0062A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2339C },
+ unicodeslot=0x2F98A,
+ },
+ [0x2F98B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0062B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8201 },
+ unicodeslot=0x2F98B,
+ },
+ [0x2F98C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0062C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8204 },
+ unicodeslot=0x2F98C,
+ },
+ [0x2F98D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0062D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8F9E },
+ unicodeslot=0x2F98D,
+ },
+ [0x2F98E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0062E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x446B },
+ unicodeslot=0x2F98E,
+ },
+ [0x2F98F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0062F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8291 },
+ unicodeslot=0x2F98F,
+ },
+ [0x2F990]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x828B },
+ unicodeslot=0x2F990,
+ },
+ [0x2F991]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03DF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x829D },
+ unicodeslot=0x2F991,
+ },
+ [0x2F992]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E0",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x52B3 },
+ unicodeslot=0x2F992,
+ },
+ [0x2F993]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E1",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x82B1 },
+ unicodeslot=0x2F993,
+ },
+ [0x2F994]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E2",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x82B3 },
+ unicodeslot=0x2F994,
+ },
+ [0x2F995]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E3",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x82BD },
+ unicodeslot=0x2F995,
+ },
+ [0x2F996]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E4",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x82E6 },
+ unicodeslot=0x2F996,
+ },
+ [0x2F997]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E5",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26B3C },
+ unicodeslot=0x2F997,
+ },
+ [0x2F998]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E6",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x82E5 },
+ unicodeslot=0x2F998,
+ },
+ [0x2F999]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x03E7",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x831D },
+ unicodeslot=0x2F999,
+ },
+ [0x2F99A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0063A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8363 },
+ unicodeslot=0x2F99A,
+ },
+ [0x2F99B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0063B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83AD },
+ unicodeslot=0x2F99B,
+ },
+ [0x2F99C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0063C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8323 },
+ unicodeslot=0x2F99C,
+ },
+ [0x2F99D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0063D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83BD },
+ unicodeslot=0x2F99D,
+ },
+ [0x2F99E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0063E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83E7 },
+ unicodeslot=0x2F99E,
+ },
+ [0x2F99F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0063F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8457 },
+ unicodeslot=0x2F99F,
+ },
+ [0x2F9A0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8353 },
+ unicodeslot=0x2F9A0,
+ },
+ [0x2F9A1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83CA },
+ unicodeslot=0x2F9A1,
+ },
+ [0x2F9A2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83CC },
+ unicodeslot=0x2F9A2,
+ },
+ [0x2F9A3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x83DC },
+ unicodeslot=0x2F9A3,
+ },
+ [0x2F9A4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26C36 },
+ unicodeslot=0x2F9A4,
+ },
+ [0x2F9A5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26D6B },
+ unicodeslot=0x2F9A5,
+ },
+ [0x2F9A6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26CD5 },
+ unicodeslot=0x2F9A6,
+ },
+ [0x2F9A7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x452B },
+ unicodeslot=0x2F9A7,
+ },
+ [0x2F9A8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x84F1 },
+ unicodeslot=0x2F9A8,
+ },
+ [0x2F9A9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009A0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x84F3 },
+ unicodeslot=0x2F9A9,
+ },
+ [0x2F9AA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009AA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8516 },
+ unicodeslot=0x2F9AA,
+ },
+ [0x2F9AB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009AB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x273CA },
+ unicodeslot=0x2F9AB,
+ },
+ [0x2F9AC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009AC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8564 },
+ unicodeslot=0x2F9AC,
+ },
+ [0x2F9AD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009AD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26F2C },
+ unicodeslot=0x2F9AD,
+ },
+ [0x2F9AE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009AE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x455D },
+ unicodeslot=0x2F9AE,
+ },
+ [0x2F9AF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009AF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4561 },
+ unicodeslot=0x2F9AF,
+ },
+ [0x2F9B0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x26FB1 },
+ unicodeslot=0x2F9B0,
+ },
+ [0x2F9B1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x270D2 },
+ unicodeslot=0x2F9B1,
+ },
+ [0x2F9B2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x456B },
+ unicodeslot=0x2F9B2,
+ },
+ [0x2F9B3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8650 },
+ unicodeslot=0x2F9B3,
+ },
+ [0x2F9B4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x865C },
+ unicodeslot=0x2F9B4,
+ },
+ [0x2F9B5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8667 },
+ unicodeslot=0x2F9B5,
+ },
+ [0x2F9B6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8669 },
+ unicodeslot=0x2F9B6,
+ },
+ [0x2F9B7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x86A9 },
+ unicodeslot=0x2F9B7,
+ },
+ [0x2F9B8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8688 },
+ unicodeslot=0x2F9B8,
+ },
+ [0x2F9B9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009B0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x870E },
+ unicodeslot=0x2F9B9,
+ },
+ [0x2F9BA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009BA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x86E2 },
+ unicodeslot=0x2F9BA,
+ },
+ [0x2F9BB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009BB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8779 },
+ unicodeslot=0x2F9BB,
+ },
+ [0x2F9BC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009BC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8728 },
+ unicodeslot=0x2F9BC,
+ },
+ [0x2F9BD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009BD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x876B },
+ unicodeslot=0x2F9BD,
+ },
+ [0x2F9BE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009BE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8786 },
+ unicodeslot=0x2F9BE,
+ },
+ [0x2F9BF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009BF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x45D7 },
+ unicodeslot=0x2F9BF,
+ },
+ [0x2F9C0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x87E1 },
+ unicodeslot=0x2F9C0,
+ },
+ [0x2F9C1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8801 },
+ unicodeslot=0x2F9C1,
+ },
+ [0x2F9C2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x45F9 },
+ unicodeslot=0x2F9C2,
+ },
+ [0x2F9C3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8860 },
+ unicodeslot=0x2F9C3,
+ },
+ [0x2F9C4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8863 },
+ unicodeslot=0x2F9C4,
+ },
+ [0x2F9C5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x27667 },
+ unicodeslot=0x2F9C5,
+ },
+ [0x2F9C6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x88D7 },
+ unicodeslot=0x2F9C6,
+ },
+ [0x2F9C7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x88DE },
+ unicodeslot=0x2F9C7,
+ },
+ [0x2F9C8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4635 },
+ unicodeslot=0x2F9C8,
+ },
+ [0x2F9C9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009C0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x88FA },
+ unicodeslot=0x2F9C9,
+ },
+ [0x2F9CA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009CA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x34BB },
+ unicodeslot=0x2F9CA,
+ },
+ [0x2F9CB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009CB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x278AE },
+ unicodeslot=0x2F9CB,
+ },
+ [0x2F9CC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009CC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x27966 },
+ unicodeslot=0x2F9CC,
+ },
+ [0x2F9CD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009CD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x46BE },
+ unicodeslot=0x2F9CD,
+ },
+ [0x2F9CE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009CE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x46C7 },
+ unicodeslot=0x2F9CE,
+ },
+ [0x2F9CF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009CF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AA0 },
+ unicodeslot=0x2F9CF,
+ },
+ [0x2F9D0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8AED },
+ unicodeslot=0x2F9D0,
+ },
+ [0x2F9D1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8B8A },
+ unicodeslot=0x2F9D1,
+ },
+ [0x2F9D2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8C55 },
+ unicodeslot=0x2F9D2,
+ },
+ [0x2F9D3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x27CA8 },
+ unicodeslot=0x2F9D3,
+ },
+ [0x2F9D4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8CAB },
+ unicodeslot=0x2F9D4,
+ },
+ [0x2F9D5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8CC1 },
+ unicodeslot=0x2F9D5,
+ },
+ [0x2F9D6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8D1B },
+ unicodeslot=0x2F9D6,
+ },
+ [0x2F9D7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8D77 },
+ unicodeslot=0x2F9D7,
+ },
+ [0x2F9D8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x27F2F },
+ unicodeslot=0x2F9D8,
+ },
+ [0x2F9D9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009D0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x20804 },
+ unicodeslot=0x2F9D9,
+ },
+ [0x2F9DA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009DA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8DCB },
+ unicodeslot=0x2F9DA,
+ },
+ [0x2F9DB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009DB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8DBC },
+ unicodeslot=0x2F9DB,
+ },
+ [0x2F9DC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009DC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8DF0 },
+ unicodeslot=0x2F9DC,
+ },
+ [0x2F9DD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009DD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x208DE },
+ unicodeslot=0x2F9DD,
+ },
+ [0x2F9DE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009DE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8ED4 },
+ unicodeslot=0x2F9DE,
+ },
+ [0x2F9DF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009DF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x8F38 },
+ unicodeslot=0x2F9DF,
+ },
+ [0x2F9E0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x285D2 },
+ unicodeslot=0x2F9E0,
+ },
+ [0x2F9E1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x285ED },
+ unicodeslot=0x2F9E1,
+ },
+ [0x2F9E2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9094 },
+ unicodeslot=0x2F9E2,
+ },
+ [0x2F9E3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x90F1 },
+ unicodeslot=0x2F9E3,
+ },
+ [0x2F9E4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9111 },
+ unicodeslot=0x2F9E4,
+ },
+ [0x2F9E5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2872E },
+ unicodeslot=0x2F9E5,
+ },
+ [0x2F9E6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x911B },
+ unicodeslot=0x2F9E6,
+ },
+ [0x2F9E7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9238 },
+ unicodeslot=0x2F9E7,
+ },
+ [0x2F9E8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x92D7 },
+ unicodeslot=0x2F9E8,
+ },
+ [0x2F9E9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009E0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x92D8 },
+ unicodeslot=0x2F9E9,
+ },
+ [0x2F9EA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009EA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x927C },
+ unicodeslot=0x2F9EA,
+ },
+ [0x2F9EB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009EB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x93F9 },
+ unicodeslot=0x2F9EB,
+ },
+ [0x2F9EC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009EC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9415 },
+ unicodeslot=0x2F9EC,
+ },
+ [0x2F9ED]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009ED",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x28BFA },
+ unicodeslot=0x2F9ED,
+ },
+ [0x2F9EE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009EE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x958B },
+ unicodeslot=0x2F9EE,
+ },
+ [0x2F9EF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009EF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4995 },
+ unicodeslot=0x2F9EF,
+ },
+ [0x2F9F0]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x95B7 },
+ unicodeslot=0x2F9F0,
+ },
+ [0x2F9F1]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x28D77 },
+ unicodeslot=0x2F9F1,
+ },
+ [0x2F9F2]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x49E6 },
+ unicodeslot=0x2F9F2,
+ },
+ [0x2F9F3]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x96C3 },
+ unicodeslot=0x2F9F3,
+ },
+ [0x2F9F4]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x5DB2 },
+ unicodeslot=0x2F9F4,
+ },
+ [0x2F9F5]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9723 },
+ unicodeslot=0x2F9F5,
+ },
+ [0x2F9F6]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x29145 },
+ unicodeslot=0x2F9F6,
+ },
+ [0x2F9F7]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2921A },
+ unicodeslot=0x2F9F7,
+ },
+ [0x2F9F8]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4A6E },
+ unicodeslot=0x2F9F8,
+ },
+ [0x2F9F9]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009F0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4A76 },
+ unicodeslot=0x2F9F9,
+ },
+ [0x2F9FA]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009FA",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x97E0 },
+ unicodeslot=0x2F9FA,
+ },
+ [0x2F9FB]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009FB",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2940A },
+ unicodeslot=0x2F9FB,
+ },
+ [0x2F9FC]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009FC",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4AB2 },
+ unicodeslot=0x2F9FC,
+ },
+ [0x2F9FD]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009FD",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x29496 },
+ unicodeslot=0x2F9FD,
+ },
+ [0x2F9FE]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009FE",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x980B },
+ unicodeslot=0x2F9FE,
+ },
+ [0x2F9FF]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002F0x0009FF",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x980B },
+ unicodeslot=0x2F9FF,
+ },
+ [0x2FA00]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0000",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9829 },
+ unicodeslot=0x2FA00,
+ },
+ [0x2FA01]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0001",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x295B6 },
+ unicodeslot=0x2FA01,
+ },
+ [0x2FA02]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0002",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x98E2 },
+ unicodeslot=0x2FA02,
+ },
+ [0x2FA03]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0003",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4B33 },
+ unicodeslot=0x2FA03,
+ },
+ [0x2FA04]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0004",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9929 },
+ unicodeslot=0x2FA04,
+ },
+ [0x2FA05]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0005",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x99A7 },
+ unicodeslot=0x2FA05,
+ },
+ [0x2FA06]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0006",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x99C2 },
+ unicodeslot=0x2FA06,
+ },
+ [0x2FA07]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0007",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x99FE },
+ unicodeslot=0x2FA07,
+ },
+ [0x2FA08]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0008",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4BCE },
+ unicodeslot=0x2FA08,
+ },
+ [0x2FA09]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0009",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x29B30 },
+ unicodeslot=0x2FA09,
+ },
+ [0x2FA0A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0000A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9B12 },
+ unicodeslot=0x2FA0A,
+ },
+ [0x2FA0B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0000B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9C40 },
+ unicodeslot=0x2FA0B,
+ },
+ [0x2FA0C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0000C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9CFD },
+ unicodeslot=0x2FA0C,
+ },
+ [0x2FA0D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0000D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4CCE },
+ unicodeslot=0x2FA0D,
+ },
+ [0x2FA0E]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0000E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4CED },
+ unicodeslot=0x2FA0E,
+ },
+ [0x2FA0F]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0000F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9D67 },
+ unicodeslot=0x2FA0F,
+ },
+ [0x2FA10]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x000A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2A0CE },
+ unicodeslot=0x2FA10,
+ },
+ [0x2FA11]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x000B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4CF8 },
+ unicodeslot=0x2FA11,
+ },
+ [0x2FA12]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x000C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2A105 },
+ unicodeslot=0x2FA12,
+ },
+ [0x2FA13]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x000D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2A20E },
+ unicodeslot=0x2FA13,
+ },
+ [0x2FA14]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x000E",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2A291 },
+ unicodeslot=0x2FA14,
+ },
+ [0x2FA15]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x000F",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9EBB },
+ unicodeslot=0x2FA15,
+ },
+ [0x2FA16]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0010",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x4D56 },
+ unicodeslot=0x2FA16,
+ },
+ [0x2FA17]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0011",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9EF9 },
+ unicodeslot=0x2FA17,
+ },
+ [0x2FA18]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0012",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9EFE },
+ unicodeslot=0x2FA18,
+ },
+ [0x2FA19]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0013",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F05 },
+ unicodeslot=0x2FA19,
+ },
+ [0x2FA1A]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0001A",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F0F },
+ unicodeslot=0x2FA1A,
+ },
+ [0x2FA1B]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0001B",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F16 },
+ unicodeslot=0x2FA1B,
+ },
+ [0x2FA1C]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0001C",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x9F3B },
+ unicodeslot=0x2FA1C,
+ },
+ [0x2FA1D]={
+ category="lo",
+ cjkwd="w",
+ description="CJK COMPATIBILITY IDEOGRAPH-0x0002FA0x0001D",
+ direction="l",
+ linebreak="id",
+ specials={ "char", 0x2A600 },
+ unicodeslot=0x2FA1D,
+ },
+ [0xE0001]={
+ category="cf",
+ description="LANGUAGE TAG",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0001,
+ },
+ [0xE0020]={
+ category="cf",
+ description="TAG SPACE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0020,
+ },
+ [0xE0021]={
+ category="cf",
+ description="TAG EXCLAMATION MARK",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0021,
+ },
+ [0xE0022]={
+ category="cf",
+ description="TAG QUOTATION MARK",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0022,
+ },
+ [0xE0023]={
+ category="cf",
+ description="TAG NUMBER SIGN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0023,
+ },
+ [0xE0024]={
+ category="cf",
+ description="TAG DOLLAR SIGN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0024,
+ },
+ [0xE0025]={
+ category="cf",
+ description="TAG PERCENT SIGN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0025,
+ },
+ [0xE0026]={
+ category="cf",
+ description="TAG AMPERSAND",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0026,
+ },
+ [0xE0027]={
+ category="cf",
+ description="TAG APOSTROPHE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0027,
+ },
+ [0xE0028]={
+ category="cf",
+ description="TAG LEFT PARENTHESIS",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0028,
+ },
+ [0xE0029]={
+ category="cf",
+ description="TAG RIGHT PARENTHESIS",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0029,
+ },
+ [0xE002A]={
+ category="cf",
+ description="TAG ASTERISK",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE002A,
+ },
+ [0xE002B]={
+ category="cf",
+ description="TAG PLUS SIGN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE002B,
+ },
+ [0xE002C]={
+ category="cf",
+ description="TAG COMMA",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE002C,
+ },
+ [0xE002D]={
+ category="cf",
+ description="TAG HYPHEN-MINUS",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE002D,
+ },
+ [0xE002E]={
+ category="cf",
+ description="TAG FULL STOP",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE002E,
+ },
+ [0xE002F]={
+ category="cf",
+ description="TAG SOLIDUS",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE002F,
+ },
+ [0xE0030]={
+ category="cf",
+ description="TAG DIGIT ZERO",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0030,
+ },
+ [0xE0031]={
+ category="cf",
+ description="TAG DIGIT ONE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0031,
+ },
+ [0xE0032]={
+ category="cf",
+ description="TAG DIGIT TWO",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0032,
+ },
+ [0xE0033]={
+ category="cf",
+ description="TAG DIGIT THREE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0033,
+ },
+ [0xE0034]={
+ category="cf",
+ description="TAG DIGIT FOUR",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0034,
+ },
+ [0xE0035]={
+ category="cf",
+ description="TAG DIGIT FIVE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0035,
+ },
+ [0xE0036]={
+ category="cf",
+ description="TAG DIGIT SIX",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0036,
+ },
+ [0xE0037]={
+ category="cf",
+ description="TAG DIGIT SEVEN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0037,
+ },
+ [0xE0038]={
+ category="cf",
+ description="TAG DIGIT EIGHT",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0038,
+ },
+ [0xE0039]={
+ category="cf",
+ description="TAG DIGIT NINE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0039,
+ },
+ [0xE003A]={
+ category="cf",
+ description="TAG COLON",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE003A,
+ },
+ [0xE003B]={
+ category="cf",
+ description="TAG SEMICOLON",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE003B,
+ },
+ [0xE003C]={
+ category="cf",
+ description="TAG LESS-THAN SIGN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE003C,
+ },
+ [0xE003D]={
+ category="cf",
+ description="TAG EQUALS SIGN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE003D,
+ },
+ [0xE003E]={
+ category="cf",
+ description="TAG GREATER-THAN SIGN",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE003E,
+ },
+ [0xE003F]={
+ category="cf",
+ description="TAG QUESTION MARK",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE003F,
+ },
+ [0xE0040]={
+ category="cf",
+ description="TAG COMMERCIAL AT",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0040,
+ },
+ [0xE0041]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER A",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0041,
+ },
+ [0xE0042]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER B",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0042,
+ },
+ [0xE0043]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER C",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0043,
+ },
+ [0xE0044]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER D",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0044,
+ },
+ [0xE0045]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER E",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0045,
+ },
+ [0xE0046]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER F",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0046,
+ },
+ [0xE0047]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER G",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0047,
+ },
+ [0xE0048]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER H",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0048,
+ },
+ [0xE0049]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER I",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0049,
+ },
+ [0xE004A]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER J",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE004A,
+ },
+ [0xE004B]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER K",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE004B,
+ },
+ [0xE004C]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER L",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE004C,
+ },
+ [0xE004D]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER M",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE004D,
+ },
+ [0xE004E]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER N",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE004E,
+ },
+ [0xE004F]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER O",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE004F,
+ },
+ [0xE0050]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER P",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0050,
+ },
+ [0xE0051]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER Q",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0051,
+ },
+ [0xE0052]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER R",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0052,
+ },
+ [0xE0053]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER S",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0053,
+ },
+ [0xE0054]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER T",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0054,
+ },
+ [0xE0055]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER U",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0055,
+ },
+ [0xE0056]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER V",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0056,
+ },
+ [0xE0057]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER W",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0057,
+ },
+ [0xE0058]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER X",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0058,
+ },
+ [0xE0059]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER Y",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0059,
+ },
+ [0xE005A]={
+ category="cf",
+ description="TAG LATIN CAPITAL LETTER Z",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE005A,
+ },
+ [0xE005B]={
+ category="cf",
+ description="TAG LEFT SQUARE BRACKET",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE005B,
+ },
+ [0xE005C]={
+ category="cf",
+ description="TAG REVERSE SOLIDUS",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE005C,
+ },
+ [0xE005D]={
+ category="cf",
+ description="TAG RIGHT SQUARE BRACKET",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE005D,
+ },
+ [0xE005E]={
+ category="cf",
+ description="TAG CIRCUMFLEX ACCENT",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE005E,
+ },
+ [0xE005F]={
+ category="cf",
+ description="TAG LOW LINE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE005F,
+ },
+ [0xE0060]={
+ category="cf",
+ description="TAG GRAVE ACCENT",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0060,
+ },
+ [0xE0061]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER A",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0061,
+ },
+ [0xE0062]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER B",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0062,
+ },
+ [0xE0063]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER C",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0063,
+ },
+ [0xE0064]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER D",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0064,
+ },
+ [0xE0065]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER E",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0065,
+ },
+ [0xE0066]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER F",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0066,
+ },
+ [0xE0067]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER G",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0067,
+ },
+ [0xE0068]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER H",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0068,
+ },
+ [0xE0069]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER I",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0069,
+ },
+ [0xE006A]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER J",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE006A,
+ },
+ [0xE006B]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER K",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE006B,
+ },
+ [0xE006C]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER L",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE006C,
+ },
+ [0xE006D]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER M",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE006D,
+ },
+ [0xE006E]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER N",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE006E,
+ },
+ [0xE006F]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER O",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE006F,
+ },
+ [0xE0070]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER P",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0070,
+ },
+ [0xE0071]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER Q",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0071,
+ },
+ [0xE0072]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER R",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0072,
+ },
+ [0xE0073]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER S",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0073,
+ },
+ [0xE0074]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER T",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0074,
+ },
+ [0xE0075]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER U",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0075,
+ },
+ [0xE0076]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER V",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0076,
+ },
+ [0xE0077]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER W",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0077,
+ },
+ [0xE0078]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER X",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0078,
+ },
+ [0xE0079]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER Y",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE0079,
+ },
+ [0xE007A]={
+ category="cf",
+ description="TAG LATIN SMALL LETTER Z",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE007A,
+ },
+ [0xE007B]={
+ category="cf",
+ description="TAG LEFT CURLY BRACKET",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE007B,
+ },
+ [0xE007C]={
+ category="cf",
+ description="TAG VERTICAL LINE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE007C,
+ },
+ [0xE007D]={
+ category="cf",
+ description="TAG RIGHT CURLY BRACKET",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE007D,
+ },
+ [0xE007E]={
+ category="cf",
+ description="TAG TILDE",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE007E,
+ },
+ [0xE007F]={
+ category="cf",
+ description="CANCEL TAG",
+ direction="bn",
+ linebreak="cm",
+ unicodeslot=0xE007F,
+ },
+ [0xE0100]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0011",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0100,
+ },
+ [0xE0101]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0012",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0101,
+ },
+ [0xE0102]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0013",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0102,
+ },
+ [0xE0103]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0014",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0103,
+ },
+ [0xE0104]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0015",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0104,
+ },
+ [0xE0105]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0016",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0105,
+ },
+ [0xE0106]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0017",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0106,
+ },
+ [0xE0107]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0018",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0107,
+ },
+ [0xE0108]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0019",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0108,
+ },
+ [0xE0109]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x001A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0109,
+ },
+ [0xE010A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x001B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE010A,
+ },
+ [0xE010B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x001C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE010B,
+ },
+ [0xE010C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x001D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE010C,
+ },
+ [0xE010D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x001E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE010D,
+ },
+ [0xE010E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x001F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE010E,
+ },
+ [0xE010F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0020",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE010F,
+ },
+ [0xE0110]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0021",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0110,
+ },
+ [0xE0111]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0022",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0111,
+ },
+ [0xE0112]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0023",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0112,
+ },
+ [0xE0113]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0024",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0113,
+ },
+ [0xE0114]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0025",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0114,
+ },
+ [0xE0115]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0026",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0115,
+ },
+ [0xE0116]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0027",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0116,
+ },
+ [0xE0117]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0028",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0117,
+ },
+ [0xE0118]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0029",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0118,
+ },
+ [0xE0119]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x002A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0119,
+ },
+ [0xE011A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x002B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE011A,
+ },
+ [0xE011B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x002C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE011B,
+ },
+ [0xE011C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x002D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE011C,
+ },
+ [0xE011D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x002E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE011D,
+ },
+ [0xE011E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x002F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE011E,
+ },
+ [0xE011F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0030",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE011F,
+ },
+ [0xE0120]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0031",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0120,
+ },
+ [0xE0121]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0032",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0121,
+ },
+ [0xE0122]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0033",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0122,
+ },
+ [0xE0123]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0034",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0123,
+ },
+ [0xE0124]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0035",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0124,
+ },
+ [0xE0125]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0036",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0125,
+ },
+ [0xE0126]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0037",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0126,
+ },
+ [0xE0127]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0038",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0127,
+ },
+ [0xE0128]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0039",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0128,
+ },
+ [0xE0129]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x003A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0129,
+ },
+ [0xE012A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x003B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE012A,
+ },
+ [0xE012B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x003C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE012B,
+ },
+ [0xE012C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x003D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE012C,
+ },
+ [0xE012D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x003E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE012D,
+ },
+ [0xE012E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x003F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE012E,
+ },
+ [0xE012F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0040",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE012F,
+ },
+ [0xE0130]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0041",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0130,
+ },
+ [0xE0131]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0042",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0131,
+ },
+ [0xE0132]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0043",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0132,
+ },
+ [0xE0133]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0044",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0133,
+ },
+ [0xE0134]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0045",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0134,
+ },
+ [0xE0135]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0046",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0135,
+ },
+ [0xE0136]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0047",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0136,
+ },
+ [0xE0137]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0048",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0137,
+ },
+ [0xE0138]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0049",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0138,
+ },
+ [0xE0139]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x004A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0139,
+ },
+ [0xE013A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x004B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE013A,
+ },
+ [0xE013B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x004C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE013B,
+ },
+ [0xE013C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x004D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE013C,
+ },
+ [0xE013D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x004E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE013D,
+ },
+ [0xE013E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x004F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE013E,
+ },
+ [0xE013F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0050",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE013F,
+ },
+ [0xE0140]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0051",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0140,
+ },
+ [0xE0141]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0052",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0141,
+ },
+ [0xE0142]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0053",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0142,
+ },
+ [0xE0143]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0054",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0143,
+ },
+ [0xE0144]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0055",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0144,
+ },
+ [0xE0145]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0056",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0145,
+ },
+ [0xE0146]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0057",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0146,
+ },
+ [0xE0147]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0058",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0147,
+ },
+ [0xE0148]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0059",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0148,
+ },
+ [0xE0149]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x005A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0149,
+ },
+ [0xE014A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x005B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE014A,
+ },
+ [0xE014B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x005C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE014B,
+ },
+ [0xE014C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x005D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE014C,
+ },
+ [0xE014D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x005E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE014D,
+ },
+ [0xE014E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x005F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE014E,
+ },
+ [0xE014F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0060",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE014F,
+ },
+ [0xE0150]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0061",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0150,
+ },
+ [0xE0151]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0062",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0151,
+ },
+ [0xE0152]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0063",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0152,
+ },
+ [0xE0153]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0064",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0153,
+ },
+ [0xE0154]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0065",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0154,
+ },
+ [0xE0155]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0066",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0155,
+ },
+ [0xE0156]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0067",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0156,
+ },
+ [0xE0157]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0068",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0157,
+ },
+ [0xE0158]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0069",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0158,
+ },
+ [0xE0159]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x006A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0159,
+ },
+ [0xE015A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x006B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE015A,
+ },
+ [0xE015B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x006C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE015B,
+ },
+ [0xE015C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x006D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE015C,
+ },
+ [0xE015D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x006E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE015D,
+ },
+ [0xE015E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x006F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE015E,
+ },
+ [0xE015F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0070",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE015F,
+ },
+ [0xE0160]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0071",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0160,
+ },
+ [0xE0161]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0072",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0161,
+ },
+ [0xE0162]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0073",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0162,
+ },
+ [0xE0163]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0074",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0163,
+ },
+ [0xE0164]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0075",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0164,
+ },
+ [0xE0165]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0076",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0165,
+ },
+ [0xE0166]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0077",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0166,
+ },
+ [0xE0167]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0078",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0167,
+ },
+ [0xE0168]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0079",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0168,
+ },
+ [0xE0169]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x007A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0169,
+ },
+ [0xE016A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x007B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE016A,
+ },
+ [0xE016B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x007C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE016B,
+ },
+ [0xE016C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x007D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE016C,
+ },
+ [0xE016D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x007E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE016D,
+ },
+ [0xE016E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x007F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE016E,
+ },
+ [0xE016F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0080",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE016F,
+ },
+ [0xE0170]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0081",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0170,
+ },
+ [0xE0171]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0082",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0171,
+ },
+ [0xE0172]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0083",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0172,
+ },
+ [0xE0173]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0084",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0173,
+ },
+ [0xE0174]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0085",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0174,
+ },
+ [0xE0175]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0086",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0175,
+ },
+ [0xE0176]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0087",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0176,
+ },
+ [0xE0177]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0088",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0177,
+ },
+ [0xE0178]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0089",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0178,
+ },
+ [0xE0179]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x008A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0179,
+ },
+ [0xE017A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x008B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE017A,
+ },
+ [0xE017B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x008C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE017B,
+ },
+ [0xE017C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x008D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE017C,
+ },
+ [0xE017D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x008E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE017D,
+ },
+ [0xE017E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x008F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE017E,
+ },
+ [0xE017F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0090",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE017F,
+ },
+ [0xE0180]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0091",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0180,
+ },
+ [0xE0181]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0092",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0181,
+ },
+ [0xE0182]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0093",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0182,
+ },
+ [0xE0183]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0094",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0183,
+ },
+ [0xE0184]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0095",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0184,
+ },
+ [0xE0185]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0096",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0185,
+ },
+ [0xE0186]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0097",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0186,
+ },
+ [0xE0187]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0098",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0187,
+ },
+ [0xE0188]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0099",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0188,
+ },
+ [0xE0189]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x009A",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0189,
+ },
+ [0xE018A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x009B",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE018A,
+ },
+ [0xE018B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x009C",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE018B,
+ },
+ [0xE018C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x009D",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE018C,
+ },
+ [0xE018D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x009E",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE018D,
+ },
+ [0xE018E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x009F",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE018E,
+ },
+ [0xE018F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A0",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE018F,
+ },
+ [0xE0190]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A1",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0190,
+ },
+ [0xE0191]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A2",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0191,
+ },
+ [0xE0192]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A3",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0192,
+ },
+ [0xE0193]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A4",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0193,
+ },
+ [0xE0194]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A5",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0194,
+ },
+ [0xE0195]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A6",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0195,
+ },
+ [0xE0196]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A7",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0196,
+ },
+ [0xE0197]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A8",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0197,
+ },
+ [0xE0198]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00A9",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0198,
+ },
+ [0xE0199]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00AA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE0199,
+ },
+ [0xE019A]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00AB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE019A,
+ },
+ [0xE019B]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00AC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE019B,
+ },
+ [0xE019C]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00AD",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE019C,
+ },
+ [0xE019D]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00AE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE019D,
+ },
+ [0xE019E]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00AF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE019E,
+ },
+ [0xE019F]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B0",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE019F,
+ },
+ [0xE01A0]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B1",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A0,
+ },
+ [0xE01A1]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B2",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A1,
+ },
+ [0xE01A2]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B3",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A2,
+ },
+ [0xE01A3]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B4",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A3,
+ },
+ [0xE01A4]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B5",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A4,
+ },
+ [0xE01A5]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B6",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A5,
+ },
+ [0xE01A6]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B7",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A6,
+ },
+ [0xE01A7]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B8",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A7,
+ },
+ [0xE01A8]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00B9",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A8,
+ },
+ [0xE01A9]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00BA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01A9,
+ },
+ [0xE01AA]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00BB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01AA,
+ },
+ [0xE01AB]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00BC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01AB,
+ },
+ [0xE01AC]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00BD",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01AC,
+ },
+ [0xE01AD]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00BE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01AD,
+ },
+ [0xE01AE]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00BF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01AE,
+ },
+ [0xE01AF]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C0",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01AF,
+ },
+ [0xE01B0]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C1",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B0,
+ },
+ [0xE01B1]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C2",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B1,
+ },
+ [0xE01B2]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C3",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B2,
+ },
+ [0xE01B3]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C4",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B3,
+ },
+ [0xE01B4]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C5",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B4,
+ },
+ [0xE01B5]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C6",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B5,
+ },
+ [0xE01B6]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C7",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B6,
+ },
+ [0xE01B7]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C8",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B7,
+ },
+ [0xE01B8]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00C9",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B8,
+ },
+ [0xE01B9]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00CA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01B9,
+ },
+ [0xE01BA]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00CB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01BA,
+ },
+ [0xE01BB]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00CC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01BB,
+ },
+ [0xE01BC]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00CD",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01BC,
+ },
+ [0xE01BD]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00CE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01BD,
+ },
+ [0xE01BE]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00CF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01BE,
+ },
+ [0xE01BF]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D0",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01BF,
+ },
+ [0xE01C0]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D1",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C0,
+ },
+ [0xE01C1]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D2",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C1,
+ },
+ [0xE01C2]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D3",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C2,
+ },
+ [0xE01C3]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D4",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C3,
+ },
+ [0xE01C4]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D5",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C4,
+ },
+ [0xE01C5]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D6",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C5,
+ },
+ [0xE01C6]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D7",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C6,
+ },
+ [0xE01C7]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D8",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C7,
+ },
+ [0xE01C8]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00D9",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C8,
+ },
+ [0xE01C9]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00DA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01C9,
+ },
+ [0xE01CA]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00DB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01CA,
+ },
+ [0xE01CB]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00DC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01CB,
+ },
+ [0xE01CC]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00DD",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01CC,
+ },
+ [0xE01CD]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00DE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01CD,
+ },
+ [0xE01CE]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00DF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01CE,
+ },
+ [0xE01CF]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E0",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01CF,
+ },
+ [0xE01D0]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E1",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D0,
+ },
+ [0xE01D1]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E2",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D1,
+ },
+ [0xE01D2]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E3",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D2,
+ },
+ [0xE01D3]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E4",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D3,
+ },
+ [0xE01D4]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E5",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D4,
+ },
+ [0xE01D5]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E6",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D5,
+ },
+ [0xE01D6]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E7",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D6,
+ },
+ [0xE01D7]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E8",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D7,
+ },
+ [0xE01D8]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00E9",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D8,
+ },
+ [0xE01D9]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00EA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01D9,
+ },
+ [0xE01DA]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00EB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01DA,
+ },
+ [0xE01DB]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00EC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01DB,
+ },
+ [0xE01DC]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00ED",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01DC,
+ },
+ [0xE01DD]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00EE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01DD,
+ },
+ [0xE01DE]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00EF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01DE,
+ },
+ [0xE01DF]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F0",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01DF,
+ },
+ [0xE01E0]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F1",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E0,
+ },
+ [0xE01E1]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F2",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E1,
+ },
+ [0xE01E2]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F3",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E2,
+ },
+ [0xE01E3]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F4",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E3,
+ },
+ [0xE01E4]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F5",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E4,
+ },
+ [0xE01E5]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F6",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E5,
+ },
+ [0xE01E6]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F7",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E6,
+ },
+ [0xE01E7]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F8",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E7,
+ },
+ [0xE01E8]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00F9",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E8,
+ },
+ [0xE01E9]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00FA",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01E9,
+ },
+ [0xE01EA]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00FB",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01EA,
+ },
+ [0xE01EB]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00FC",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01EB,
+ },
+ [0xE01EC]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00FD",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01EC,
+ },
+ [0xE01ED]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00FE",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01ED,
+ },
+ [0xE01EE]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x00FF",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01EE,
+ },
+ [0xE01EF]={
+ category="mn",
+ cjkwd="a",
+ description="VARIATION SELECTOR-0x0100",
+ direction="nsm",
+ linebreak="cm",
+ unicodeslot=0xE01EF,
+ },
+--~ [0xF0000]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x000F Private Use, First>",
+--~ direction="l",
+--~ unicodeslot=0xF0000,
+--~ },
+--~ [0xFFFFD]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x000F Private Use, Last>",
+--~ direction="l",
+--~ unicodeslot=0xFFFFD,
+--~ },
+--~ [0x100000]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x0010 Private Use, First>",
+--~ direction="l",
+--~ unicodeslot=0x100000,
+--~ },
+--~ [0x10FFFD]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x0010 Private Use, Last>",
+--~ direction="l",
+--~ unicodeslot=0x10FFFD,
+--~ },
+}
diff --git a/tex/context/base/char-enc.lua b/tex/context/base/char-enc.lua
new file mode 100644
index 000000000..45f404ee9
--- /dev/null
+++ b/tex/context/base/char-enc.lua
@@ -0,0 +1,163 @@
+if not modules then modules = { } end modules ['char-syn'] = {
+ version = 1.001,
+ comment = "companion to char-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- thanks to tex4ht for these mappings
+
+characters = characters or { }
+
+characters.synonyms = {
+ angle = 0x2220,
+ anticlockwise = 0x21BA,
+ arrowaxisleft = 0x2190,
+ arrowaxisright = 0x2192,
+ arrowparrleftright = 0x21C6,
+ arrowparrrightleft = 0x21C4,
+ arrowtailleft = 0x21A2,
+ arrowtailright = 0x21A3,
+ arrowtripleleft = 0x21DA,
+ arrowtripleright = 0x21DB,
+ axisshort = 0x2212,
+ because = 0x2235,
+ between = 0x226C,
+ check = 0x2713,
+ circleasteris = 0x229B,
+ circleequal = 0x2257,
+ circleminus = 0x229D,
+ circleR = 0x24C7,
+ circlering = 0x229A,
+ circleS = 0x24C8,
+ clockwise = 0x21BB,
+ complement = 0x2201,
+ curlyleft = 0x21AB,
+ curlyright = 0x21AC,
+ dblarrowdwn = 0x21CA,
+ dblarrowheadleft = 0x219E,
+ dblarrowheadright = 0x21A0,
+ dblarrowleft = 0x21C7,
+ dblarrowright = 0x21C9,
+ dblarrowup = 0x21C8,
+ defines = 0x225C,
+ diamond = 0x2662,
+ diamondsolid = 0x2666,
+ difference = 0x224F,
+ dotplus = 0x2214,
+ downfall = 0x22CE,
+ equaldotleftright = 0x2252,
+ equaldotrightleft = 0x2253,
+ equalorfollows = 0x22DF,
+ equalorgreater = 0x22DD,
+ equalorless = 0x22DC,
+ equalorprecedes = 0x22DE,
+ equalsdots = 0x2251,
+ followsorcurly = 0x227D,
+ followsorequal = 0x227F,
+ forces = 0x22A9,
+ forcesbar = 0x22AA,
+ fork = 0x22D4,
+ frown = 0x2322,
+ geomequivalent = 0x224E,
+ greaterdbleqlless = 0x22Da,
+ greaterdblequal = 0x2267,
+ greaterlessequal = 0x22DA,
+ greaterorapproxeql = 0x227F,
+ greaterorequalslant= 0x2265,
+ greaterorless = 0x2277,
+ greaterorsimilar = 0x2273,
+ harpoondownleft = 0x21C3,
+ harpoondownright = 0x21C2,
+ harpoonleftright = 0x21CC,
+ harpoonrightleft = 0x21CB,
+ harpoonupleft = 0x21BF,
+ harpoonupright = 0x21BE,
+ intercal = 0x22BA,
+ intersectiondbl = 0x22D2,
+ lessdbleqlgreater = 0x22DB,
+ lessdblequal = 0x2266,
+ lessequalgreater = 0x22DB,
+ lessorapproxeql = 0x227E,
+ lessorequalslant = 0x2264,
+ lessorgreater = 0x2276,
+ lessorsimilar = 0x2272,
+ maltesecross = 0xFFFD,
+ measuredangle = 0x2221,
+ muchgreater = 0x22D9,
+ muchless = 0x22D8,
+ multimap = 0x22B8,
+ multiopenleft = 0x22CB,
+ multiopenright = 0x22CC,
+ nand = 0x22BC,
+ orunderscore = 0x22BB,
+ perpcorrespond = 0x2259,
+ precedesorcurly = 0x227C,
+ precedesorequal = 0x227E,
+ primereverse = 0x2035,
+ proportional = 0x221D,
+ revasymptequal = 0x2243,
+ revsimilar = 0x223D,
+ rightanglene = 0x231D,
+ rightanglenw = 0x231C,
+ rightanglese = 0x231F,
+ rightanglesw = 0x231E,
+ ringinequal = 0x2256,
+ satisfies = 0x22A8,
+ shiftleft = 0x21B0,
+ shiftright = 0x21B1,
+ smile = 0x2323,
+ sphericalangle = 0x2222,
+ square = 0x25A1,
+ squaredot = 0x22A1,
+ squareimage = 0x228F,
+ squareminus = 0x229F,
+ squaremultiply = 0x22A0,
+ squareoriginal = 0x2290,
+ squareplus = 0x229E,
+ squaresmallsolid = 0x25AA,
+ squaresolid = 0x25A0,
+ squiggleleftright = 0x21AD,
+ squiggleright = 0x21DD,
+ star = 0x22C6,
+ subsetdbl = 0x22D0,
+ subsetdblequal = 0x2286,
+ supersetdbl = 0x22D1,
+ supersetdblequa = 0x2287,
+ therefore = 0x2234,
+ triangle = 0x25B5,
+ triangledownsld = 0x25BE,
+ triangleinv = 0x25BF,
+ triangleleft = 0x25C3,
+ triangleleftequal = 0x22B4,
+ triangleleftsld = 0x25C2,
+ triangleright = 0x25B9,
+ trianglerightequal = 0x22B5,
+ trianglerightsld = 0x25B8,
+ trianglesolid = 0x25B4,
+ uniondbl = 0x22D3,
+ uprise = 0x22CF,
+ Yen = 0x00A5,
+}
+
+if not characters.enccodes then
+
+ local enccodes = { }
+
+ for unicode, data in next, characters.data do
+ local encname = data.adobename or data.contextname
+ if encname then
+ enccodes[encname] = unicode
+ end
+ end
+
+ for name, unicode in next, characters.synonyms do
+ if not enccodes[name] then enccodes[name] = unicode end
+ end
+
+ characters.enccodes = enccodes
+
+end
+
+storage.register("characters.enccodes", characters.enccodes, "characters.enccodes")
diff --git a/tex/context/base/char-enc.mkiv b/tex/context/base/char-enc.mkiv
new file mode 100644
index 000000000..9fe9a363b
--- /dev/null
+++ b/tex/context/base/char-enc.mkiv
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=char-enc,
+%D version=2006.08.20,
+%D title=\CONTEXT\ Character Support,
+%D subtitle=Encodings,
+%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}{ConTeXt Character Support / Encodings}
+
+\registerctxluafile{char-enc}{1.001}
+
+\endinput
diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua
new file mode 100644
index 000000000..5c4a40bad
--- /dev/null
+++ b/tex/context/base/char-ini.lua
@@ -0,0 +1,698 @@
+if not modules then modules = { } end modules ['char-ini'] = {
+ version = 1.001,
+ comment = "companion to char-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+tex = tex or { }
+xml = xml or { }
+
+local utf = unicode.utf8
+
+local utfchar, utfbyte, utfvalues = utf.char, utf.byte, string.utfvalues
+local concat = table.concat
+local next, tonumber = next, tonumber
+local texsprint, texprint = tex.sprint, tex.print
+local format, lower, gsub, match, gmatch = string.format, string.lower, string.gsub, string.match, string.match, string.gmatch
+
+local ctxcatcodes = tex.ctxcatcodes
+local texcatcodes = tex.texcatcodes
+
+--[[ldx--
+<p>This module implements some methods and creates additional datastructured
+from the big character table that we use for all kind of purposes:
+<type>char-def.lua</type>.</p>
+
+<p>We assume that at this point <type>characters.data</type> is already
+loaded!</p>
+--ldx]]--
+
+characters = characters or { }
+characters.data = characters.data or { }
+
+local data = characters.data
+
+if not characters.ranges then
+ characters.ranges = { }
+ for k, v in next, data do
+ characters.ranges[#characters.ranges+1] = k
+ end
+end
+
+storage.register("characters/ranges",characters.ranges,"characters.ranges")
+
+local ranges = characters.ranges
+
+setmetatable(data, {
+ __index = function(t,k)
+ for r=1,#ranges do
+ local rr = ranges[r] -- first in range
+ if k > rr and k <= data[rr].range then
+ t[k] = t[rr]
+ return t[k]
+ end
+ end
+ return nil
+ end
+})
+
+characters.blocks = {
+ ["aegeannumbers"] = { 0x10100, 0x1013F, "Aegean Numbers" },
+ ["alphabeticpresentationforms"] = { 0x0FB00, 0x0FB4F, "Alphabetic Presentation Forms" },
+ ["ancientgreekmusicalnotation"] = { 0x1D200, 0x1D24F, "Ancient Greek Musical Notation" },
+ ["ancientgreeknumbers"] = { 0x10140, 0x1018F, "Ancient Greek Numbers" },
+ ["ancientsymbols"] = { 0x10190, 0x101CF, "Ancient Symbols" },
+ ["arabic"] = { 0x00600, 0x006FF, "Arabic" },
+ ["arabicpresentationformsa"] = { 0x0FB50, 0x0FDFF, "Arabic Presentation Forms-A" },
+ ["arabicpresentationformsb"] = { 0x0FE70, 0x0FEFF, "Arabic Presentation Forms-B" },
+ ["arabicsupplement"] = { 0x00750, 0x0077F, "Arabic Supplement" },
+ ["armenian"] = { 0x00530, 0x0058F, "Armenian" },
+ ["arrows"] = { 0x02190, 0x021FF, "Arrows" },
+ ["balinese"] = { 0x01B00, 0x01B7F, "Balinese" },
+ ["basiclatin"] = { 0x00000, 0x0007F, "Basic Latin" },
+ ["bengali"] = { 0x00980, 0x009FF, "Bengali" },
+ ["blockelements"] = { 0x02580, 0x0259F, "Block Elements" },
+ ["bopomofo"] = { 0x03100, 0x0312F, "Bopomofo" },
+ ["bopomofoextended"] = { 0x031A0, 0x031BF, "Bopomofo Extended" },
+ ["boxdrawing"] = { 0x02500, 0x0257F, "Box Drawing" },
+ ["braillepatterns"] = { 0x02800, 0x028FF, "Braille Patterns" },
+ ["buginese"] = { 0x01A00, 0x01A1F, "Buginese" },
+ ["buhid"] = { 0x01740, 0x0175F, "Buhid" },
+ ["byzantinemusicalsymbols"] = { 0x1D000, 0x1D0FF, "Byzantine Musical Symbols" },
+ ["carian"] = { 0x102A0, 0x102DF, "Carian" },
+ ["cham"] = { 0x0AA00, 0x0AA5F, "Cham" },
+ ["cherokee"] = { 0x013A0, 0x013FF, "Cherokee" },
+ ["cjkcompatibility"] = { 0x03300, 0x033FF, "CJK Compatibility" },
+ ["cjkcompatibilityforms"] = { 0x0FE30, 0x0FE4F, "CJK Compatibility Forms" },
+ ["cjkcompatibilityideographs"] = { 0x0F900, 0x0FAFF, "CJK Compatibility Ideographs" },
+ ["cjkcompatibilityideographssupplement"] = { 0x2F800, 0x2FA1F, "CJK Compatibility Ideographs Supplement" },
+ ["cjkradicalssupplement"] = { 0x02E80, 0x02EFF, "CJK Radicals Supplement" },
+ ["cjkstrokes"] = { 0x031C0, 0x031EF, "CJK Strokes" },
+ ["cjksymbolsandpunctuation"] = { 0x03000, 0x0303F, "CJK Symbols and Punctuation" },
+ ["cjkunifiedideographs"] = { 0x04E00, 0x09FFF, "CJK Unified Ideographs" },
+ ["cjkunifiedideographsextensiona"] = { 0x03400, 0x04DBF, "CJK Unified Ideographs Extension A" },
+ ["cjkunifiedideographsextensionb"] = { 0x20000, 0x2A6DF, "CJK Unified Ideographs Extension B" },
+ ["combiningdiacriticalmarks"] = { 0x00300, 0x0036F, "Combining Diacritical Marks" },
+ ["combiningdiacriticalmarksforsymbols"] = { 0x020D0, 0x020FF, "Combining Diacritical Marks for Symbols" },
+ ["combiningdiacriticalmarkssupplement"] = { 0x01DC0, 0x01DFF, "Combining Diacritical Marks Supplement" },
+ ["combininghalfmarks"] = { 0x0FE20, 0x0FE2F, "Combining Half Marks" },
+ ["controlpictures"] = { 0x02400, 0x0243F, "Control Pictures" },
+ ["coptic"] = { 0x02C80, 0x02CFF, "Coptic" },
+ ["countingrodnumerals"] = { 0x1D360, 0x1D37F, "Counting Rod Numerals" },
+ ["cuneiform"] = { 0x12000, 0x123FF, "Cuneiform" },
+ ["cuneiformnumbersandpunctuation"] = { 0x12400, 0x1247F, "Cuneiform Numbers and Punctuation" },
+ ["currencysymbols"] = { 0x020A0, 0x020CF, "Currency Symbols" },
+ ["cypriotsyllabary"] = { 0x10800, 0x1083F, "Cypriot Syllabary" },
+ ["cyrillic"] = { 0x00400, 0x004FF, "Cyrillic" },
+ ["cyrillicextendeda"] = { 0x02DE0, 0x02DFF, "Cyrillic Extended-A" },
+ ["cyrillicextendedb"] = { 0x0A640, 0x0A69F, "Cyrillic Extended-B" },
+ ["cyrillicsupplement"] = { 0x00500, 0x0052F, "Cyrillic Supplement" },
+ ["deseret"] = { 0x10400, 0x1044F, "Deseret" },
+ ["devanagari"] = { 0x00900, 0x0097F, "Devanagari" },
+ ["dingbats"] = { 0x02700, 0x027BF, "Dingbats" },
+ ["dominotiles"] = { 0x1F030, 0x1F09F, "Domino Tiles" },
+ ["enclosedalphanumerics"] = { 0x02460, 0x024FF, "Enclosed Alphanumerics" },
+ ["enclosedcjklettersandmonths"] = { 0x03200, 0x032FF, "Enclosed CJK Letters and Months" },
+ ["ethiopic"] = { 0x01200, 0x0137F, "Ethiopic" },
+ ["ethiopicextended"] = { 0x02D80, 0x02DDF, "Ethiopic Extended" },
+ ["ethiopicsupplement"] = { 0x01380, 0x0139F, "Ethiopic Supplement" },
+ ["generalpunctuation"] = { 0x02000, 0x0206F, "General Punctuation" },
+ ["geometricshapes"] = { 0x025A0, 0x025FF, "Geometric Shapes" },
+ ["georgian"] = { 0x010A0, 0x010FF, "Georgian" },
+ ["georgiansupplement"] = { 0x02D00, 0x02D2F, "Georgian Supplement" },
+ ["glagolitic"] = { 0x02C00, 0x02C5F, "Glagolitic" },
+ ["gothic"] = { 0x10330, 0x1034F, "Gothic" },
+ ["greekandcoptic"] = { 0x00370, 0x003FF, "Greek and Coptic" },
+ ["greekextended"] = { 0x01F00, 0x01FFF, "Greek Extended" },
+ ["gujarati"] = { 0x00A80, 0x00AFF, "Gujarati" },
+ ["gurmukhi"] = { 0x00A00, 0x00A7F, "Gurmukhi" },
+ ["halfwidthandfullwidthforms"] = { 0x0FF00, 0x0FFEF, "Halfwidth and Fullwidth Forms" },
+ ["hangulcompatibilityjamo"] = { 0x03130, 0x0318F, "Hangul Compatibility Jamo" },
+ ["hanguljamo"] = { 0x01100, 0x011FF, "Hangul Jamo" },
+ ["hangulsyllables"] = { 0x0AC00, 0x0D7AF, "Hangul Syllables" },
+ ["hanunoo"] = { 0x01720, 0x0173F, "Hanunoo" },
+ ["hebrew"] = { 0x00590, 0x005FF, "Hebrew" },
+ ["highprivateusesurrogates"] = { 0x0DB80, 0x0DBFF, "High Private Use Surrogates" },
+ ["highsurrogates"] = { 0x0D800, 0x0DB7F, "High Surrogates" },
+ ["hiragana"] = { 0x03040, 0x0309F, "Hiragana" },
+ ["ideographicdescriptioncharacters"] = { 0x02FF0, 0x02FFF, "Ideographic Description Characters" },
+ ["ipaextensions"] = { 0x00250, 0x02AF, "IPA Extensions" },
+ ["kanbun"] = { 0x03190, 0x0319F, "Kanbun" },
+ ["kangxiradicals"] = { 0x02F00, 0x02FDF, "Kangxi Radicals" },
+ ["kannada"] = { 0x00C80, 0x00CFF, "Kannada" },
+ ["katakana"] = { 0x030A0, 0x030FF, "Katakana" },
+ ["katakanaphoneticextensions"] = { 0x031F0, 0x031FF, "Katakana Phonetic Extensions" },
+ ["kayahli"] = { 0x0A900, 0x0A92F, "Kayah Li" },
+ ["kharoshthi"] = { 0x10A00, 0x10A5F, "Kharoshthi" },
+ ["khmer"] = { 0x01780, 0x017FF, "Khmer" },
+ ["khmersymbols"] = { 0x019E0, 0x019FF, "Khmer Symbols" },
+ ["lao"] = { 0x00E80, 0x00EFF, "Lao" },
+ ["latinextendeda"] = { 0x00100, 0x0017F, "Latin Extended-A" },
+ ["latinextendedadditional"] = { 0x01E00, 0x01EFF, "Latin Extended Additional" },
+ ["latinextendedb"] = { 0x00180, 0x0024F, "Latin Extended-B" },
+ ["latinextendedc"] = { 0x02C60, 0x02C7F, "Latin Extended-C" },
+ ["latinextendedd"] = { 0x0A720, 0x0A7FF, "Latin Extended-D" },
+ ["latinsupplement"] = { 0x00080, 0x000FF, "Latin-1 Supplement" },
+ ["lepcha"] = { 0x01C00, 0x01C4F, "Lepcha" },
+ ["letterlikesymbols"] = { 0x02100, 0x0214F, "Letterlike Symbols" },
+ ["limbu"] = { 0x01900, 0x0194F, "Limbu" },
+ ["linearbideograms"] = { 0x10080, 0x100FF, "Linear B Ideograms" },
+ ["linearbsyllabary"] = { 0x10000, 0x1007F, "Linear B Syllabary" },
+ ["lowsurrogates"] = { 0x0DC00, 0x0DFFF, "Low Surrogates" },
+ ["lycian"] = { 0x10280, 0x1029F, "Lycian" },
+ ["lydian"] = { 0x10920, 0x1093F, "Lydian" },
+ ["mahjongtiles"] = { 0x1F000, 0x1F02F, "Mahjong Tiles" },
+ ["malayalam"] = { 0x00D00, 0x00D7F, "Malayalam" },
+ ["mathematicalalphanumericsymbols"] = { 0x1D400, 0x1D7FF, "Mathematical Alphanumeric Symbols" },
+ ["mathematicaloperators"] = { 0x02200, 0x022FF, "Mathematical Operators" },
+ ["miscellaneousmathematicalsymbolsa"] = { 0x027C0, 0x027EF, "Miscellaneous Mathematical Symbols-A" },
+ ["miscellaneousmathematicalsymbolsb"] = { 0x02980, 0x029FF, "Miscellaneous Mathematical Symbols-B" },
+ ["miscellaneoussymbols"] = { 0x02600, 0x026FF, "Miscellaneous Symbols" },
+ ["miscellaneoussymbolsandarrows"] = { 0x02B00, 0x02BFF, "Miscellaneous Symbols and Arrows" },
+ ["miscellaneoustechnical"] = { 0x02300, 0x023FF, "Miscellaneous Technical" },
+ ["modifiertoneletters"] = { 0x0A700, 0x0A71F, "Modifier Tone Letters" },
+ ["mongolian"] = { 0x01800, 0x018AF, "Mongolian" },
+ ["musicalsymbols"] = { 0x1D100, 0x1D1FF, "Musical Symbols" },
+ ["myanmar"] = { 0x01000, 0x0109F, "Myanmar" },
+ ["newtailue"] = { 0x01980, 0x019DF, "New Tai Lue" },
+ ["nko"] = { 0x007C0, 0x007FF, "NKo" },
+ ["numberforms"] = { 0x02150, 0x0218F, "Number Forms" },
+ ["ogham"] = { 0x01680, 0x0169F, "Ogham" },
+ ["olchiki"] = { 0x01C50, 0x01C7F, "Ol Chiki" },
+ ["olditalic"] = { 0x10300, 0x1032F, "Old Italic" },
+ ["oldpersian"] = { 0x103A0, 0x103DF, "Old Persian" },
+ ["opticalcharacterrecognition"] = { 0x02440, 0x0245F, "Optical Character Recognition" },
+ ["oriya"] = { 0x00B00, 0x00B7F, "Oriya" },
+ ["osmanya"] = { 0x10480, 0x104AF, "Osmanya" },
+ ["phagspa"] = { 0x0A840, 0x0A87F, "Phags-pa" },
+ ["phaistosdisc"] = { 0x101D0, 0x101FF, "Phaistos Disc" },
+ ["phoenician"] = { 0x10900, 0x1091F, "Phoenician" },
+ ["phoneticextensions"] = { 0x01D00, 0x01D7F, "Phonetic Extensions" },
+ ["phoneticextensionssupplement"] = { 0x01D80, 0x01DBF, "Phonetic Extensions Supplement" },
+ ["privateusearea"] = { 0x0E000, 0x0F8FF, "Private Use Area" },
+ ["rejang"] = { 0x0A930, 0x0A95F, "Rejang" },
+ ["runic"] = { 0x016A0, 0x016FF, "Runic" },
+ ["saurashtra"] = { 0x0A880, 0x0A8DF, "Saurashtra" },
+ ["shavian"] = { 0x10450, 0x1047F, "Shavian" },
+ ["sinhala"] = { 0x00D80, 0x00DFF, "Sinhala" },
+ ["smallformvariants"] = { 0x0FE50, 0x0FE6F, "Small Form Variants" },
+ ["spacingmodifierletters"] = { 0x002B0, 0x002FF, "Spacing Modifier Letters" },
+ ["specials"] = { 0x0FFF0, 0x0FFFF, "Specials" },
+ ["sundanese"] = { 0x01B80, 0x01BBF, "Sundanese" },
+ ["superscriptsandsubscripts"] = { 0x02070, 0x0209F, "Superscripts and Subscripts" },
+ ["supplementalarrowsa"] = { 0x027F0, 0x027FF, "Supplemental Arrows-A" },
+ ["supplementalarrowsb"] = { 0x02900, 0x0297F, "Supplemental Arrows-B" },
+ ["supplementalmathematicaloperators"] = { 0x02A00, 0x02AFF, "Supplemental Mathematical Operators" },
+ ["supplementalpunctuation"] = { 0x02E00, 0x02E7F, "Supplemental Punctuation" },
+ ["supplementaryprivateuseareaa"] = { 0xF0000, 0xFFFFF, "Supplementary Private Use Area-A" },
+ ["supplementaryprivateuseareab"] = { 0x100000,0x10FFFF,"Supplementary Private Use Area-B" },
+ ["sylotinagri"] = { 0x0A800, 0x0A82F, "Syloti Nagri" },
+ ["syriac"] = { 0x00700, 0x0074F, "Syriac" },
+ ["tagalog"] = { 0x01700, 0x0171F, "Tagalog" },
+ ["tagbanwa"] = { 0x01760, 0x0177F, "Tagbanwa" },
+ ["tags"] = { 0xE0000, 0xE007F, "Tags" },
+ ["taile"] = { 0x01950, 0x0197F, "Tai Le" },
+ ["taixuanjingsymbols"] = { 0x1D300, 0x1D35F, "Tai Xuan Jing Symbols" },
+ ["tamil"] = { 0x00B80, 0x00BFF, "Tamil" },
+ ["telugu"] = { 0x00C00, 0x00C7F, "Telugu" },
+ ["thaana"] = { 0x00780, 0x007BF, "Thaana" },
+ ["thai"] = { 0x00E00, 0x00E7F, "Thai" },
+ ["tibetan"] = { 0x00F00, 0x00FFF, "Tibetan" },
+ ["tifinagh"] = { 0x02D30, 0x02D7F, "Tifinagh" },
+ ["ugaritic"] = { 0x10380, 0x1039F, "Ugaritic" },
+ ["unifiedcanadianaboriginalsyllabics"] = { 0x01400, 0x0167F, "Unified Canadian Aboriginal Syllabics" },
+ ["vai"] = { 0x0A500, 0x0A63F, "Vai" },
+ ["variationselectors"] = { 0x0FE00, 0x0FE0F, "Variation Selectors" },
+ ["variationselectorssupplement"] = { 0xE0100, 0xE01EF, "Variation Selectors Supplement" },
+ ["verticalforms"] = { 0x0FE10, 0x0FE1F, "Vertical Forms" },
+ ["yijinghexagramsymbols"] = { 0x04DC0, 0x04DFF, "Yijing Hexagram Symbols" },
+ ["yiradicals"] = { 0x0A490, 0x0A4CF, "Yi Radicals" },
+ ["yisyllables"] = { 0x0A000, 0x0A48F, "Yi Syllables" },
+}
+
+function characters.getrange(name)
+ local tag = lower(name)
+ tag = gsub(name,"[^a-z]", "")
+ local range = characters.blocks[tag]
+ if range then
+ return range[1], range[2], range[3]
+ end
+ name = gsub(name,'"',"0x") -- goodie: tex hex notation
+ local start, stop = match(name,"^(.-)[%-%:](.-)$")
+ 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, nil
+ end
+ end
+ local slot = tonumber(name,16) or tonumber(name)
+ return slot, slot, nil
+end
+
+characters.categories = {
+ lu = "Letter Uppercase",
+ ll = "Letter Lowercase",
+ lt = "Letter Titlecase",
+ lm = "Letter Modifier",
+ lo = "Letter Other",
+ mn = "Mark Nonspacing",
+ mc = "Mark Spacing Combining",
+ me = "Mark Enclosing",
+ nd = "Number Decimal Digit",
+ nl = "Number Letter",
+ no = "Number Other",
+ pc = "Punctuation Connector",
+ pd = "Punctuation Dash",
+ ps = "Punctuation Open",
+ pe = "Punctuation Close",
+ pi = "Punctuation Initial Quote",
+ pf = "Punctuation Final Quote",
+ po = "Punctuation Other",
+ sm = "Symbol Math",
+ sc = "Symbol Currency",
+ sk = "Symbol Modifier",
+ so = "Symbol Other",
+ zs = "Separator Space",
+ zl = "Separator Line",
+ zp = "Separator Paragraph",
+ cc = "Other Control",
+ cf = "Other Format",
+ cs = "Other Surrogate",
+ co = "Other Private Use",
+ cn = "Other Not Assigned",
+}
+
+--~ special : cf (softhyphen) zs (emspace)
+--~ characters: ll lm lo lt lu mn nl no pc pd pe pf pi po ps sc sk sm so
+
+characters.is_character = table.tohash {
+ "lu","ll","lt","lm","lo",
+ "nd","nl","no",
+ "mn",
+ "nl","no",
+ "pc","pd","ps","pe","pi","pf","po",
+ "sm","sc","sk","so"
+}
+
+characters.is_letter = table.tohash {
+ "ll","lm","lo","lt","lu"
+}
+
+characters.is_command = table.tohash {
+ "cf","zs"
+}
+
+-- linebreak: todo: hash
+--
+-- normative : BK CR LF CM SG GL CB SP ZW NL WJ JL JV JT H2 H3
+-- informative : XX OP CL QU NS EX SY IS PR PO NU AL ID IN HY BB BA SA AI B2
+
+-- east asian width:
+--
+-- N A H W F Na
+
+characters.bidi = {
+ l = "Left-to-Right",
+ lre = "Left-to-Right Embedding",
+ lro = "Left-to-Right Override",
+ r = "Right-to-Left",
+ al = "Right-to-Left Arabic",
+ rle = "Right-to-Left Embedding",
+ rlo = "Right-to-Left Override",
+ pdf = "Pop Directional Format",
+ en = "European Number",
+ es = "European Number Separator",
+ et = "European Number Terminator",
+ an = "Arabic Number",
+ cs = "Common Number Separator",
+ nsm = "Non-Spacing Mark",
+ bn = "Boundary Neutral",
+ b = "Paragraph Separator",
+ s = "Segment Separator",
+ ws = "Whitespace",
+ on = "Other Neutrals",
+}
+
+local _empty_table_ = { __index = function(t,k) return "" end }
+
+function table.set_empty_metatable(t)
+ setmetatable(t,_empty_table_)
+end
+
+table.set_empty_metatable(data)
+
+--[[ldx--
+<p>At this point we assume that the big data table is loaded. From this
+table we derive a few more.</p>
+--ldx]]--
+
+if not characters.fallbacks then
+
+ characters.fallbacks = { }
+ characters.directions = { }
+
+ local fallbacks = characters.fallbacks
+ local directions = characters.directions
+
+ for k,v in next, data do
+ local specials = v.specials
+ if specials and specials[1] == "compat" and specials[2] == 0x0020 and specials[3] then
+ local s = specials[3]
+ fallbacks[k] = s
+ fallbacks[s] = k
+ end
+ directions[k] = v.direction
+ end
+
+end
+
+storage.register("characters.fallbacks", characters.fallbacks, "characters.fallbacks")
+storage.register("characters.directions", characters.directions, "characters.directions")
+
+--[[ldx--
+<p>The <type>context</type> namespace is used to store methods and data
+which is rather specific to <l n='context'/>.</p>
+--ldx]]--
+
+--[[ldx--
+<p>Instead of using a <l n='tex'/> file to define the named glyphs, we
+use the table. After all, we have this information available anyway.</p>
+--ldx]]--
+
+function characters.makeactive(n,name) -- let ?
+ texsprint(ctxcatcodes,format("\\catcode%s=13\\unexpanded\\def %s{\\%s}",n,utfchar(n),name))
+end
+
+function tex.uprint(n)
+ texsprint(ctxcatcodes,utfchar(n))
+end
+
+local template_a = "\\startextendcatcodetable{%s}\\chardef\\l=11\\chardef\\a=13\\let\\c\\catcode%s\\let\\a\\undefined\\let\\l\\undefined\\let\\c\\undefined\\stopextendcatcodetable"
+local template_b = "\\chardef\\l=11\\chardef\\a=13\\let\\c\\catcode%s\\let\\a\\undefined\\let\\l\\undefined\\let\\c\\undefined"
+
+-- we need a function for setting the codes ....
+
+function characters.define(tobelettered, tobeactivated) -- catcodetables
+ local is_character, is_command, is_letter = characters.is_character, characters.is_command, characters.is_letter
+ local lettered, activated = { }, { }
+ for u, chr in next, data do
+ -- we can use a macro instead of direct settings
+ local fallback = chr.fallback
+ if fallback then
+ -- texprint(format("{\\catcode %s=13\\unexpanded\\gdef %s{\\checkedchar{%s}{%s}}}",u,utfchar(u),u,fallback))
+ texsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}") -- no texprint
+ activated[#activated+1] = "\\c"..u.."\\a"
+ else
+ local contextname = chr.contextname
+ local category = chr.category
+ if contextname then
+ if is_character[category] then
+ -- by this time, we're still in normal catcode mode
+ -- subtle: not "\\",contextname but "\\"..contextname
+ if chr.unicodeslot < 128 then
+ -- texprint(ctxcatcodes, "\\chardef\\"..contextname,"=",u)
+ texprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u))
+ else
+ -- texprint(ctxcatcodes, "\\let\\"..contextname,"=",utfchar(u))
+ texprint(ctxcatcodes,format("\\let\\%s=%s",contextname,utfchar(u)))
+ if is_letter[category] then
+ lettered[#lettered+1] = "\\c"..u.."\\l"
+ end
+ end
+ elseif is_command[category] then
+ -- this might change: contextcommand ipv contextname
+ -- texprint(format("{\\catcode %s=13\\unexpanded\\gdef %s{\\%s}}",u,utfchar(u),contextname))
+ texsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}") -- no texprint
+ activated[#activated+1] = "\\c"..u.."\\a"
+ end
+ elseif is_letter[category] then
+ if u >= 128 and u <= 65536 then -- catch private mess
+ lettered[#lettered+1] = "\\c"..u.."\\l"
+ end
+ end
+ end
+ if chr.range then
+ lettered[#lettered+1] = format('\\dofastrecurse{"%05X}{"%05X}{1}{\\c\\fastrecursecounter\\l}',u,chr.range)
+ end
+ end
+ -- if false then
+ lettered[#lettered+1] = "\\c"..0x200C.."\\l" -- non-joiner
+ lettered[#lettered+1] = "\\c"..0x200D.."\\l" -- joiner
+ -- fi
+ if tobelettered then
+ lettered = concat(lettered)
+ if true then
+ texsprint(ctxcatcodes,format(template_b,lettered))
+ else
+ for l=1,#tobelettered do
+ texsprint(ctxcatcodes,format(template_a,tobelettered[l],lettered))
+ end
+ end
+ end
+ if tobeactivated then
+ activated = concat(activated)
+ for a=1,#tobeactivated do
+ texsprint(ctxcatcodes,format(template_a,tobeactivated[a],activated))
+ end
+ end
+end
+
+function characters.charcode(box)
+ local b = tex.box[box]
+ local l = b.list
+ texsprint((l and l.id == node.id('glyph') and l.char) or 0)
+end
+
+--[[ldx--
+<p>Setting the lccodes is also done in a loop over the data table.</p>
+--ldx]]--
+
+-- we need a function ...
+
+function characters.setcodes()
+ for code, chr in next, data do
+ local cc = chr.category
+ if cc == 'll' or cc == 'lu' or cc == 'lt' then
+ local lc, uc = chr.lccode, chr.uccode
+ if not lc then chr.lccode, lc = code, code end
+ if not uc then chr.uccode, uc = code, code end
+ texsprint(ctxcatcodes,format("\\setcclcuc{%i}{%i}{%i}",code,lc,uc))
+ end
+ if cc == "lu" then
+ texprint(ctxcatcodes,"\\sfcode ",code,"999 ")
+ end
+ if cc == "lo" and chr.range then
+ texsprint(ctxcatcodes,format('\\dofastrecurse{"%05X}{"%05X}{1}{\\setcclcucself\\fastrecursecounter}',code,chr.range))
+ end
+ end
+end
+
+--[[ldx--
+<p>Next comes a whole series of helper methods. These are (will be) part
+of the official <l n='api'/>.</p>
+--ldx]]--
+
+--[[ldx--
+<p>This converts a string (if given) into a number.</p>
+--ldx]]--
+
+function characters.number(n)
+ if type(n) == "string" then return tonumber(n,16) else return n end
+end
+
+--[[ldx--
+<p>Checking for valid characters.</p>
+--ldx]]--
+
+function characters.is_valid(s)
+ return s or ""
+end
+
+function characters.checked(s, default)
+ return s or default
+end
+
+characters.valid = characters.is_valid
+
+--[[ldx--
+<p></p>
+--ldx]]--
+-- set a table entry; index is number (can be different from unicodeslot)
+
+function characters.set(n, c)
+ data[characters.number(n)] = c
+end
+
+--[[ldx--
+<p>Get a table entry happens by number. Keep in mind that the unicodeslot
+can be different (not likely).</p>
+--ldx]]--
+
+function characters.get(n)
+ return data[characters.number(n)]
+end
+
+--[[ldx--
+<p>A couple of convenience methods. Beware, these are not that fast due
+to the checking.</p>
+--ldx]]--
+
+function characters.hexindex(n)
+ return format("%04X", characters.valid(data[characters.number(n)].unicodeslot))
+end
+
+function characters.contextname(n)
+ return characters.valid(data[characters.number(n)].contextname)
+end
+
+function characters.adobename(n)
+ return characters.valid(data[characters.number(n)].adobename)
+end
+
+function characters.description(n)
+ return characters.valid(data[characters.number(n)].description)
+end
+
+function characters.category(n)
+ return characters.valid(data[characters.number(n)].category)
+end
+
+--[[ldx--
+<p>Requesting lower and uppercase codes:</p>
+--ldx]]--
+
+function characters.uccode(n) return data[n].uccode or n end
+function characters.lccode(n) return data[n].lccode or n end
+
+function characters.flush(n)
+ local c = data[n]
+ if c and c.contextname then
+ texsprint(texcatcodes, "\\"..c.contextname)
+ else
+ texsprint(utfchar(n))
+ end
+end
+
+function characters.shape(n)
+ local shcode = data[n].shcode
+ if not shcode then
+ return n, nil
+ elseif type(shcode) == "table" then
+ return shcode[1], shcode[#shcode]
+ else
+ return shcode, nil
+ end
+end
+
+--[[ldx--
+<p>Categories play an important role, so here are some checkers.</p>
+--ldx]]--
+
+function characters.is_of_category(token,category)
+ if type(token) == "string" then
+ return data[utfbyte(token)].category == category
+ else
+ return data[token].category == category
+ end
+end
+
+function characters.i_is_of_category(i,category) -- by index (number)
+ local cd = data[i]
+ return cd and cd.category == category
+end
+
+function characters.n_is_of_category(n,category) -- by name (string)
+ local cd = data[utfbyte(n)]
+ return cd and cd.category == category
+end
+
+-- xml support (moved)
+
+function characters.remapentity(chr,slot)
+ texsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr))
+end
+
+characters.active_offset = 0x10000 -- there will be remapped in that byte range
+
+-- xml.entities = xml.entities or { }
+--
+-- storage.register("xml/entities",xml.entities,"xml.entities") -- this will move to lxml
+--
+-- function characters.setmkiventities()
+-- local entities = xml.entities
+-- entities.lt = "<"
+-- entities.amp = "&"
+-- entities.gt = ">"
+-- end
+--
+-- function characters.setmkiientities()
+-- local entities = xml.entities
+-- entities.lt = utfchar(characters.active_offset + utfbyte("<"))
+-- entities.amp = utfchar(characters.active_offset + utfbyte("&"))
+-- entities.gt = utfchar(characters.active_offset + utfbyte(">"))
+-- end
+
+-- some day we will make a table
+
+function characters.lower(str)
+ local new = { }
+ for u in utfvalues(str) do
+ new[#new+1] = utfchar(data[u].lccode or u)
+ end
+ return concat(new)
+end
+
+function characters.upper(str)
+ local new = { }
+ for u in utfvalues(str) do
+ new[#new+1] = utfchar(data[u].uccode or u)
+ end
+ return concat(new)
+end
+
+-- -- some day we might go this route, but it does not really save that much
+-- -- so not now (we can generate a lot using mtx-unicode that operates on the
+-- -- database)
+--
+-- -- category cjkwd direction linebreak
+--
+-- -- adobename comment contextcommand contextname description fallback lccode
+-- -- mathclass mathfiller mathname mathspec mathstretch mathsymbol mirror
+-- -- range shcode specials uccode uccodes unicodeslot
+--
+-- local data = {
+-- ['one']={
+-- common = {
+-- category="cc",
+-- direction="bn",
+-- linebreak="cm",
+-- },
+-- vector = {
+-- [0x0000] = {
+-- description="NULL",
+-- group='one',
+-- unicodeslot=0x0000,
+-- },
+-- {
+-- description="START OF HEADING",
+-- group='one',
+-- unicodeslot=0x0001,
+-- },
+-- }
+-- }
+-- }
+--
+-- local chardata, groupdata = { }, { }
+--
+-- for group, gdata in next, data do
+-- local common, vector = { __index = gdata.common }, gdata.vector
+-- for character, cdata in next, vector do
+-- chardata[character] = cdata
+-- setmetatable(cdata,common)
+-- end
+-- groupdata[group] = gdata
+-- end
+
+--~ characters.data, characters.groups = chardata, groupdata
diff --git a/tex/context/base/char-ini.mkiv b/tex/context/base/char-ini.mkiv
new file mode 100644
index 000000000..0d5e16bb0
--- /dev/null
+++ b/tex/context/base/char-ini.mkiv
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=char-ini,
+%D version=2006.08.20,
+%D title=\CONTEXT\ Character Support,
+%D subtitle=Initialization,
+%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}{ConTeXt 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-map}{1.001} % maybe we will load this someplace else
+\registerctxluafile{char-tex}{1.001}
+
+\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}}
+
+%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). It is on the agenda
+%D to do this with \type {tex.lccode} cum suis once they're available.
+
+\def\setcclcuc#1#2#3{\global\catcode#1=\@@letter\global\lccode#1=#2\global\uccode#1=#3\relax}
+\def\setcclcucself#1{\global\catcode#1=\@@letter\global\lccode#1=#1\global\uccode#1=#1\relax }
+
+\ctxlua{characters.setcodes()}
+
+%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
+
+\ctxlua {
+ characters.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,
+ }
+ )
+ catcodes.register("xmlcatcodes",\number\xmlcatcodes)
+}
+
+\protect \endinput
diff --git a/tex/context/base/char-map.lua b/tex/context/base/char-map.lua
new file mode 100644
index 000000000..3f8cc3b3d
--- /dev/null
+++ b/tex/context/base/char-map.lua
@@ -0,0 +1,1069 @@
+if not modules then modules = { } end modules ['char-map'] = {
+ version = 1.001,
+ comment = "companion to char-ini.mkiv",
+ author = "Hans Hagen & Arthur Reutenauer",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+characters = characters or { }
+
+characters.casemap={
+ [0x0049]={
+ ["az"]={
+ ["not_before_dot"]={
+ ["lower"]={ 0x0131 },
+ ["title"]={ 0x0049 },
+ ["upper"]={ 0x0049 },
+ },
+ },
+ ["lt"]={
+ ["more_above"]={
+ ["lower"]={ 0x0069, 0x0307 },
+ ["title"]={ 0x0049 },
+ ["upper"]={ 0x0049 },
+ },
+ },
+ ["tr"]={
+ ["not_before_dot"]={
+ ["lower"]={ 0x0131 },
+ ["title"]={ 0x0049 },
+ ["upper"]={ 0x0049 },
+ },
+ },
+ },
+ [0x004A]={
+ ["lt"]={
+ ["more_above"]={
+ ["lower"]={ 0x006A, 0x0307 },
+ ["title"]={ 0x004A },
+ ["upper"]={ 0x004A },
+ },
+ },
+ },
+ [0x0069]={
+ ["az"]={
+ ["all"]={
+ ["lower"]={ 0x0069 },
+ ["title"]={ 0x0130 },
+ ["upper"]={ 0x0130 },
+ },
+ },
+ ["tr"]={
+ ["all"]={
+ ["lower"]={ 0x0069 },
+ ["title"]={ 0x0130 },
+ ["upper"]={ 0x0130 },
+ },
+ },
+ },
+ [0x00CC]={
+ ["lt"]={
+ ["all"]={
+ ["lower"]={ 0x0069, 0x0307, 0x0300 },
+ ["title"]={ 0x00CC },
+ ["upper"]={ 0x00CC },
+ },
+ },
+ },
+ [0x00CD]={
+ ["lt"]={
+ ["all"]={
+ ["lower"]={ 0x0069, 0x0307, 0x0301 },
+ ["title"]={ 0x00CD },
+ ["upper"]={ 0x00CD },
+ },
+ },
+ },
+ [0x00DF]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x00DF },
+ ["title"]={ 0x0053, 0x0073 },
+ ["upper"]={ 0x0053, 0x0053 },
+ },
+ },
+ },
+ [0x0128]={
+ ["lt"]={
+ ["all"]={
+ ["lower"]={ 0x0069, 0x0307, 0x0303 },
+ ["title"]={ 0x0128 },
+ ["upper"]={ 0x0128 },
+ },
+ },
+ },
+ [0x012E]={
+ ["lt"]={
+ ["more_above"]={
+ ["lower"]={ 0x012F, 0x0307 },
+ ["title"]={ 0x012E },
+ ["upper"]={ 0x012E },
+ },
+ },
+ },
+ [0x0130]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x0069, 0x0307 },
+ ["title"]={ 0x0130 },
+ ["upper"]={ 0x0130 },
+ },
+ },
+ ["az"]={
+ ["all"]={
+ ["lower"]={ 0x0069 },
+ ["title"]={ 0x0130 },
+ ["upper"]={ 0x0130 },
+ },
+ },
+ ["tr"]={
+ ["all"]={
+ ["lower"]={ 0x0069 },
+ ["title"]={ 0x0130 },
+ ["upper"]={ 0x0130 },
+ },
+ },
+ },
+ [0x0149]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x0149 },
+ ["title"]={ 0x02BC, 0x004E },
+ ["upper"]={ 0x02BC, 0x004E },
+ },
+ },
+ },
+ [0x01F0]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x01F0 },
+ ["title"]={ 0x004A, 0x030C },
+ ["upper"]={ 0x004A, 0x030C },
+ },
+ },
+ },
+ [0x0307]={
+ ["az"]={
+ ["after_i"]={
+ ["lower"]={},
+ ["title"]={ 0x0307 },
+ ["upper"]={ 0x0307 },
+ },
+ },
+ ["lt"]={
+ ["after_soft_dotted"]={
+ ["lower"]={ 0x0307 },
+ ["title"]={},
+ ["upper"]={},
+ },
+ },
+ ["tr"]={
+ ["after_i"]={
+ ["lower"]={},
+ ["title"]={ 0x0307 },
+ ["upper"]={ 0x0307 },
+ },
+ },
+ },
+ [0x0390]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x0390 },
+ ["title"]={ 0x0399, 0x0308, 0x0301 },
+ ["upper"]={ 0x0399, 0x0308, 0x0301 },
+ },
+ },
+ },
+ [0x03A3]={
+ ["final_sigma"]={
+ ["all"]={
+ ["lower"]={ 0x03C2 },
+ ["title"]={ 0x03A3 },
+ ["upper"]={ 0x03A3 },
+ },
+ },
+ },
+ [0x03B0]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x03B0 },
+ ["title"]={ 0x03A5, 0x0308, 0x0301 },
+ ["upper"]={ 0x03A5, 0x0308, 0x0301 },
+ },
+ },
+ },
+ [0x0587]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x0587 },
+ ["title"]={ 0x0535, 0x0582 },
+ ["upper"]={ 0x0535, 0x0552 },
+ },
+ },
+ },
+ [0x1E96]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1E96 },
+ ["title"]={ 0x0048, 0x0331 },
+ ["upper"]={ 0x0048, 0x0331 },
+ },
+ },
+ },
+ [0x1E97]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1E97 },
+ ["title"]={ 0x0054, 0x0308 },
+ ["upper"]={ 0x0054, 0x0308 },
+ },
+ },
+ },
+ [0x1E98]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1E98 },
+ ["title"]={ 0x0057, 0x030A },
+ ["upper"]={ 0x0057, 0x030A },
+ },
+ },
+ },
+ [0x1E99]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1E99 },
+ ["title"]={ 0x0059, 0x030A },
+ ["upper"]={ 0x0059, 0x030A },
+ },
+ },
+ },
+ [0x1E9A]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1E9A },
+ ["title"]={ 0x0041, 0x02BE },
+ ["upper"]={ 0x0041, 0x02BE },
+ },
+ },
+ },
+ [0x1F50]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F50 },
+ ["title"]={ 0x03A5, 0x0313 },
+ ["upper"]={ 0x03A5, 0x0313 },
+ },
+ },
+ },
+ [0x1F52]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F52 },
+ ["title"]={ 0x03A5, 0x0313, 0x0300 },
+ ["upper"]={ 0x03A5, 0x0313, 0x0300 },
+ },
+ },
+ },
+ [0x1F54]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F54 },
+ ["title"]={ 0x03A5, 0x0313, 0x0301 },
+ ["upper"]={ 0x03A5, 0x0313, 0x0301 },
+ },
+ },
+ },
+ [0x1F56]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F56 },
+ ["title"]={ 0x03A5, 0x0313, 0x0342 },
+ ["upper"]={ 0x03A5, 0x0313, 0x0342 },
+ },
+ },
+ },
+ [0x1F80]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F80 },
+ ["title"]={ 0x1F88 },
+ ["upper"]={ 0x1F08, 0x0399 },
+ },
+ },
+ },
+ [0x1F81]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F81 },
+ ["title"]={ 0x1F89 },
+ ["upper"]={ 0x1F09, 0x0399 },
+ },
+ },
+ },
+ [0x1F82]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F82 },
+ ["title"]={ 0x1F8A },
+ ["upper"]={ 0x1F0A, 0x0399 },
+ },
+ },
+ },
+ [0x1F83]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F83 },
+ ["title"]={ 0x1F8B },
+ ["upper"]={ 0x1F0B, 0x0399 },
+ },
+ },
+ },
+ [0x1F84]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F84 },
+ ["title"]={ 0x1F8C },
+ ["upper"]={ 0x1F0C, 0x0399 },
+ },
+ },
+ },
+ [0x1F85]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F85 },
+ ["title"]={ 0x1F8D },
+ ["upper"]={ 0x1F0D, 0x0399 },
+ },
+ },
+ },
+ [0x1F86]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F86 },
+ ["title"]={ 0x1F8E },
+ ["upper"]={ 0x1F0E, 0x0399 },
+ },
+ },
+ },
+ [0x1F87]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F87 },
+ ["title"]={ 0x1F8F },
+ ["upper"]={ 0x1F0F, 0x0399 },
+ },
+ },
+ },
+ [0x1F88]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F80 },
+ ["title"]={ 0x1F88 },
+ ["upper"]={ 0x1F08, 0x0399 },
+ },
+ },
+ },
+ [0x1F89]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F81 },
+ ["title"]={ 0x1F89 },
+ ["upper"]={ 0x1F09, 0x0399 },
+ },
+ },
+ },
+ [0x1F8A]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F82 },
+ ["title"]={ 0x1F8A },
+ ["upper"]={ 0x1F0A, 0x0399 },
+ },
+ },
+ },
+ [0x1F8B]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F83 },
+ ["title"]={ 0x1F8B },
+ ["upper"]={ 0x1F0B, 0x0399 },
+ },
+ },
+ },
+ [0x1F8C]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F84 },
+ ["title"]={ 0x1F8C },
+ ["upper"]={ 0x1F0C, 0x0399 },
+ },
+ },
+ },
+ [0x1F8D]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F85 },
+ ["title"]={ 0x1F8D },
+ ["upper"]={ 0x1F0D, 0x0399 },
+ },
+ },
+ },
+ [0x1F8E]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F86 },
+ ["title"]={ 0x1F8E },
+ ["upper"]={ 0x1F0E, 0x0399 },
+ },
+ },
+ },
+ [0x1F8F]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F87 },
+ ["title"]={ 0x1F8F },
+ ["upper"]={ 0x1F0F, 0x0399 },
+ },
+ },
+ },
+ [0x1F90]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F90 },
+ ["title"]={ 0x1F98 },
+ ["upper"]={ 0x1F28, 0x0399 },
+ },
+ },
+ },
+ [0x1F91]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F91 },
+ ["title"]={ 0x1F99 },
+ ["upper"]={ 0x1F29, 0x0399 },
+ },
+ },
+ },
+ [0x1F92]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F92 },
+ ["title"]={ 0x1F9A },
+ ["upper"]={ 0x1F2A, 0x0399 },
+ },
+ },
+ },
+ [0x1F93]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F93 },
+ ["title"]={ 0x1F9B },
+ ["upper"]={ 0x1F2B, 0x0399 },
+ },
+ },
+ },
+ [0x1F94]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F94 },
+ ["title"]={ 0x1F9C },
+ ["upper"]={ 0x1F2C, 0x0399 },
+ },
+ },
+ },
+ [0x1F95]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F95 },
+ ["title"]={ 0x1F9D },
+ ["upper"]={ 0x1F2D, 0x0399 },
+ },
+ },
+ },
+ [0x1F96]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F96 },
+ ["title"]={ 0x1F9E },
+ ["upper"]={ 0x1F2E, 0x0399 },
+ },
+ },
+ },
+ [0x1F97]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F97 },
+ ["title"]={ 0x1F9F },
+ ["upper"]={ 0x1F2F, 0x0399 },
+ },
+ },
+ },
+ [0x1F98]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F90 },
+ ["title"]={ 0x1F98 },
+ ["upper"]={ 0x1F28, 0x0399 },
+ },
+ },
+ },
+ [0x1F99]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F91 },
+ ["title"]={ 0x1F99 },
+ ["upper"]={ 0x1F29, 0x0399 },
+ },
+ },
+ },
+ [0x1F9A]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F92 },
+ ["title"]={ 0x1F9A },
+ ["upper"]={ 0x1F2A, 0x0399 },
+ },
+ },
+ },
+ [0x1F9B]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F93 },
+ ["title"]={ 0x1F9B },
+ ["upper"]={ 0x1F2B, 0x0399 },
+ },
+ },
+ },
+ [0x1F9C]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F94 },
+ ["title"]={ 0x1F9C },
+ ["upper"]={ 0x1F2C, 0x0399 },
+ },
+ },
+ },
+ [0x1F9D]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F95 },
+ ["title"]={ 0x1F9D },
+ ["upper"]={ 0x1F2D, 0x0399 },
+ },
+ },
+ },
+ [0x1F9E]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F96 },
+ ["title"]={ 0x1F9E },
+ ["upper"]={ 0x1F2E, 0x0399 },
+ },
+ },
+ },
+ [0x1F9F]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1F97 },
+ ["title"]={ 0x1F9F },
+ ["upper"]={ 0x1F2F, 0x0399 },
+ },
+ },
+ },
+ [0x1FA0]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA0 },
+ ["title"]={ 0x1FA8 },
+ ["upper"]={ 0x1F68, 0x0399 },
+ },
+ },
+ },
+ [0x1FA1]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA1 },
+ ["title"]={ 0x1FA9 },
+ ["upper"]={ 0x1F69, 0x0399 },
+ },
+ },
+ },
+ [0x1FA2]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA2 },
+ ["title"]={ 0x1FAA },
+ ["upper"]={ 0x1F6A, 0x0399 },
+ },
+ },
+ },
+ [0x1FA3]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA3 },
+ ["title"]={ 0x1FAB },
+ ["upper"]={ 0x1F6B, 0x0399 },
+ },
+ },
+ },
+ [0x1FA4]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA4 },
+ ["title"]={ 0x1FAC },
+ ["upper"]={ 0x1F6C, 0x0399 },
+ },
+ },
+ },
+ [0x1FA5]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA5 },
+ ["title"]={ 0x1FAD },
+ ["upper"]={ 0x1F6D, 0x0399 },
+ },
+ },
+ },
+ [0x1FA6]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA6 },
+ ["title"]={ 0x1FAE },
+ ["upper"]={ 0x1F6E, 0x0399 },
+ },
+ },
+ },
+ [0x1FA7]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA7 },
+ ["title"]={ 0x1FAF },
+ ["upper"]={ 0x1F6F, 0x0399 },
+ },
+ },
+ },
+ [0x1FA8]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA0 },
+ ["title"]={ 0x1FA8 },
+ ["upper"]={ 0x1F68, 0x0399 },
+ },
+ },
+ },
+ [0x1FA9]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA1 },
+ ["title"]={ 0x1FA9 },
+ ["upper"]={ 0x1F69, 0x0399 },
+ },
+ },
+ },
+ [0x1FAA]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA2 },
+ ["title"]={ 0x1FAA },
+ ["upper"]={ 0x1F6A, 0x0399 },
+ },
+ },
+ },
+ [0x1FAB]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA3 },
+ ["title"]={ 0x1FAB },
+ ["upper"]={ 0x1F6B, 0x0399 },
+ },
+ },
+ },
+ [0x1FAC]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA4 },
+ ["title"]={ 0x1FAC },
+ ["upper"]={ 0x1F6C, 0x0399 },
+ },
+ },
+ },
+ [0x1FAD]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA5 },
+ ["title"]={ 0x1FAD },
+ ["upper"]={ 0x1F6D, 0x0399 },
+ },
+ },
+ },
+ [0x1FAE]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA6 },
+ ["title"]={ 0x1FAE },
+ ["upper"]={ 0x1F6E, 0x0399 },
+ },
+ },
+ },
+ [0x1FAF]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FA7 },
+ ["title"]={ 0x1FAF },
+ ["upper"]={ 0x1F6F, 0x0399 },
+ },
+ },
+ },
+ [0x1FB2]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FB2 },
+ ["title"]={ 0x1FBA, 0x0345 },
+ ["upper"]={ 0x1FBA, 0x0399 },
+ },
+ },
+ },
+ [0x1FB3]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FB3 },
+ ["title"]={ 0x1FBC },
+ ["upper"]={ 0x0391, 0x0399 },
+ },
+ },
+ },
+ [0x1FB4]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FB4 },
+ ["title"]={ 0x0386, 0x0345 },
+ ["upper"]={ 0x0386, 0x0399 },
+ },
+ },
+ },
+ [0x1FB6]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FB6 },
+ ["title"]={ 0x0391, 0x0342 },
+ ["upper"]={ 0x0391, 0x0342 },
+ },
+ },
+ },
+ [0x1FB7]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FB7 },
+ ["title"]={ 0x0391, 0x0342, 0x0345 },
+ ["upper"]={ 0x0391, 0x0342, 0x0399 },
+ },
+ },
+ },
+ [0x1FBC]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FB3 },
+ ["title"]={ 0x1FBC },
+ ["upper"]={ 0x0391, 0x0399 },
+ },
+ },
+ },
+ [0x1FC2]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FC2 },
+ ["title"]={ 0x1FCA, 0x0345 },
+ ["upper"]={ 0x1FCA, 0x0399 },
+ },
+ },
+ },
+ [0x1FC3]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FC3 },
+ ["title"]={ 0x1FCC },
+ ["upper"]={ 0x0397, 0x0399 },
+ },
+ },
+ },
+ [0x1FC4]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FC4 },
+ ["title"]={ 0x0389, 0x0345 },
+ ["upper"]={ 0x0389, 0x0399 },
+ },
+ },
+ },
+ [0x1FC6]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FC6 },
+ ["title"]={ 0x0397, 0x0342 },
+ ["upper"]={ 0x0397, 0x0342 },
+ },
+ },
+ },
+ [0x1FC7]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FC7 },
+ ["title"]={ 0x0397, 0x0342, 0x0345 },
+ ["upper"]={ 0x0397, 0x0342, 0x0399 },
+ },
+ },
+ },
+ [0x1FCC]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FC3 },
+ ["title"]={ 0x1FCC },
+ ["upper"]={ 0x0397, 0x0399 },
+ },
+ },
+ },
+ [0x1FD2]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FD2 },
+ ["title"]={ 0x0399, 0x0308, 0x0300 },
+ ["upper"]={ 0x0399, 0x0308, 0x0300 },
+ },
+ },
+ },
+ [0x1FD3]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FD3 },
+ ["title"]={ 0x0399, 0x0308, 0x0301 },
+ ["upper"]={ 0x0399, 0x0308, 0x0301 },
+ },
+ },
+ },
+ [0x1FD6]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FD6 },
+ ["title"]={ 0x0399, 0x0342 },
+ ["upper"]={ 0x0399, 0x0342 },
+ },
+ },
+ },
+ [0x1FD7]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FD7 },
+ ["title"]={ 0x0399, 0x0308, 0x0342 },
+ ["upper"]={ 0x0399, 0x0308, 0x0342 },
+ },
+ },
+ },
+ [0x1FE2]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FE2 },
+ ["title"]={ 0x03A5, 0x0308, 0x0300 },
+ ["upper"]={ 0x03A5, 0x0308, 0x0300 },
+ },
+ },
+ },
+ [0x1FE3]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FE3 },
+ ["title"]={ 0x03A5, 0x0308, 0x0301 },
+ ["upper"]={ 0x03A5, 0x0308, 0x0301 },
+ },
+ },
+ },
+ [0x1FE4]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FE4 },
+ ["title"]={ 0x03A1, 0x0313 },
+ ["upper"]={ 0x03A1, 0x0313 },
+ },
+ },
+ },
+ [0x1FE6]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FE6 },
+ ["title"]={ 0x03A5, 0x0342 },
+ ["upper"]={ 0x03A5, 0x0342 },
+ },
+ },
+ },
+ [0x1FE7]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FE7 },
+ ["title"]={ 0x03A5, 0x0308, 0x0342 },
+ ["upper"]={ 0x03A5, 0x0308, 0x0342 },
+ },
+ },
+ },
+ [0x1FF2]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FF2 },
+ ["title"]={ 0x1FFA, 0x0345 },
+ ["upper"]={ 0x1FFA, 0x0399 },
+ },
+ },
+ },
+ [0x1FF3]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FF3 },
+ ["title"]={ 0x1FFC },
+ ["upper"]={ 0x03A9, 0x0399 },
+ },
+ },
+ },
+ [0x1FF4]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FF4 },
+ ["title"]={ 0x038F, 0x0345 },
+ ["upper"]={ 0x038F, 0x0399 },
+ },
+ },
+ },
+ [0x1FF6]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FF6 },
+ ["title"]={ 0x03A9, 0x0342 },
+ ["upper"]={ 0x03A9, 0x0342 },
+ },
+ },
+ },
+ [0x1FF7]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FF7 },
+ ["title"]={ 0x03A9, 0x0342, 0x0345 },
+ ["upper"]={ 0x03A9, 0x0342, 0x0399 },
+ },
+ },
+ },
+ [0x1FFC]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0x1FF3 },
+ ["title"]={ 0x1FFC },
+ ["upper"]={ 0x03A9, 0x0399 },
+ },
+ },
+ },
+ [0xFB00]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB00 },
+ ["title"]={ 0x0046, 0x0066 },
+ ["upper"]={ 0x0046, 0x0046 },
+ },
+ },
+ },
+ [0xFB01]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB01 },
+ ["title"]={ 0x0046, 0x0069 },
+ ["upper"]={ 0x0046, 0x0049 },
+ },
+ },
+ },
+ [0xFB02]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB02 },
+ ["title"]={ 0x0046, 0x006C },
+ ["upper"]={ 0x0046, 0x004C },
+ },
+ },
+ },
+ [0xFB03]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB03 },
+ ["title"]={ 0x0046, 0x0066, 0x0069 },
+ ["upper"]={ 0x0046, 0x0046, 0x0049 },
+ },
+ },
+ },
+ [0xFB04]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB04 },
+ ["title"]={ 0x0046, 0x0066, 0x006C },
+ ["upper"]={ 0x0046, 0x0046, 0x004C },
+ },
+ },
+ },
+ [0xFB05]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB05 },
+ ["title"]={ 0x0053, 0x0074 },
+ ["upper"]={ 0x0053, 0x0054 },
+ },
+ },
+ },
+ [0xFB06]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB06 },
+ ["title"]={ 0x0053, 0x0074 },
+ ["upper"]={ 0x0053, 0x0054 },
+ },
+ },
+ },
+ [0xFB13]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB13 },
+ ["title"]={ 0x0544, 0x0576 },
+ ["upper"]={ 0x0544, 0x0546 },
+ },
+ },
+ },
+ [0xFB14]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB14 },
+ ["title"]={ 0x0544, 0x0565 },
+ ["upper"]={ 0x0544, 0x0535 },
+ },
+ },
+ },
+ [0xFB15]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB15 },
+ ["title"]={ 0x0544, 0x056B },
+ ["upper"]={ 0x0544, 0x053B },
+ },
+ },
+ },
+ [0xFB16]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB16 },
+ ["title"]={ 0x054E, 0x0576 },
+ ["upper"]={ 0x054E, 0x0546 },
+ },
+ },
+ },
+ [0xFB17]={
+ [""]={
+ ["all"]={
+ ["lower"]={ 0xFB17 },
+ ["title"]={ 0x0544, 0x056D },
+ ["upper"]={ 0x0544, 0x053D },
+ },
+ },
+ },
+}
diff --git a/tex/context/base/char-tex.lua b/tex/context/base/char-tex.lua
new file mode 100644
index 000000000..ed9a244d7
--- /dev/null
+++ b/tex/context/base/char-tex.lua
@@ -0,0 +1,89 @@
+if not modules then modules = { } end modules ['char-tex'] = {
+ version = 1.001,
+ comment = "companion to char-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+characters = characters or { }
+characters.tex = characters.tex or { }
+
+local find = string.find
+
+local accent_map = {
+ ['~'] = "̃" , -- ̃ Ẽ
+ ['"'] = "̈" , -- ̈ Ë
+ ["`"] = "̀" , -- ̀ È
+ ["'"] = "́" , -- ́ É
+ ["^"] = "̂" , -- ̂ Ê
+ -- ̄ Ē
+ -- ̆ Ĕ
+ -- ̇ Ė
+ -- ̉ Ẻ
+ -- ̌ Ě
+ -- ̏ Ȅ
+ -- ̑ Ȇ
+ -- ̣ Ẹ
+ -- ̧ Ȩ
+ -- ̨ Ę
+ -- ̭ Ḙ
+ -- ̰ Ḛ
+}
+
+local accents = table.concat(table.keys(accent_map))
+
+local function remap_accents(a,c,braced)
+ local m = accent_map[a]
+ if m then
+ return c .. m
+ elseif braced then
+ return "\\" .. a .. "{" .. c .. "}"
+ else
+ return "\\" .. a .. c
+ end
+end
+
+local command_map = {
+ ["i"] = "ı"
+}
+
+local function remap_commands(c)
+ local m = command_map[c]
+ if m then
+ return m
+ else
+ return "\\" .. c
+ end
+end
+
+local P, C, R, S, Cs, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc
+local U, lpegmatch = lpeg.patterns.utf8, lpeg.match
+
+local accents = (P('\\') * C(S(accents)) * (P("{") * C(U) * P("}" * Cc(true)) + C(U) * Cc(false))) / remap_accents
+local commands = (P('\\') * C(R("az","AZ")^1)) / remap_commands
+
+local convert_accents = Cs((accents + P(1))^0)
+local convert_commands = Cs((commands + P(1))^0)
+
+local no_l = P("{") / ""
+local no_r = P("}") / ""
+
+local convert_accents_strip = Cs((no_l * accents * no_r + accents + P(1))^0)
+local convert_commands_strip = Cs((no_l * commands * no_r + commands + P(1))^0)
+
+function characters.tex.toutf(str,strip)
+ if find(str,"\\") then -- we can start at teh found position
+ if strip then
+ str = lpegmatch(convert_commands_strip,str)
+ str = lpegmatch(convert_accents_strip,str)
+ else
+ str = lpegmatch(convert_commands,str)
+ str = lpegmatch(convert_accents,str)
+ end
+ end
+ return str
+end
+
+--~ print(characters.tex.toutf([[\"{e}]]),true)
+--~ print(characters.tex.toutf([[{\"{e}}]],true))
diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua
new file mode 100644
index 000000000..6dd85fdc8
--- /dev/null
+++ b/tex/context/base/char-utf.lua
@@ -0,0 +1,273 @@
+if not modules then modules = { } end modules ['char-utf'] = {
+ version = 1.001,
+ comment = "companion to char-utf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>When a sequence of <l n='utf'/> characters enters the application, it may
+be neccessary to collapse subsequences into their composed variant.</p>
+
+<p>This module implements methods for collapsing and expanding <l n='utf'/>
+sequences. We also provide means to deal with characters that are
+special to <l n='tex'/> as well as 8-bit characters that need to end up
+in special kinds of output (for instance <l n='pdf'/>).</p>
+
+<p>We implement these manipulations as filters. One can run multiple filters
+over a string.</p>
+--ldx]]--
+
+local utf = unicode.utf8
+local concat, gmatch = table.concat, string.gmatch
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+
+local ctxcatcodes = tex.ctxcatcodes
+
+characters = characters or { }
+characters.graphemes = characters.graphemes or { }
+characters.filters = characters.filters or { }
+characters.filters.utf = characters.filters.utf or { }
+
+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--
+<p>It only makes sense to collapse at runtime, since we don't expect
+source code to depend on collapsing.</p>
+--ldx]]--
+
+function utffilters.initialize()
+ if utffilters.collapsing and not utffilters.initialized then
+ for k,v in next, 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 = utfchar(vs[2]), utfchar(vs[3])
+ local cgf = graphemes[first]
+ if not cgf then
+ cgf = { }
+ graphemes[first] = cgf
+ end
+ cgf[second] = utfchar(k)
+ end
+ end
+ utffilters.initialized = true
+ end
+end
+
+-- 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 = 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
+ graphemes[first][second] = result
+ end
+end
+
+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
+ for second in utfcharacters(str) do
+ local cgf = graphemes[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 concat(tokens)
+ end
+ end
+ return str
+end
+
+--[[ldx--
+<p>In order to deal with 8-bit output, we need to find a way to
+go from <l n='utf'/> to 8-bit. This is handled in the
+<l n='luatex'/> engine itself.</p>
+
+<p>This leaves us problems with characters that are specific to
+<l n='tex'/> like <type>{}</type>, <type>$</type> and alike.</p>
+
+<p>We can remap some chars that tex input files are sensitive for to
+a private area (while writing to a utility file) and revert then
+to their original slot when we read in such a file. Instead of
+reverting, we can (when we resolve characters to glyphs) map them
+to their right glyph there.</p>
+
+<p>For this purpose we can use the private planes 0x0F0000 and
+0x100000.</p>
+--ldx]]--
+
+utffilters.private = {
+ high = { },
+ low = { },
+ escapes = { },
+}
+
+local low = utffilters.private.low
+local high = utffilters.private.high
+local escapes = utffilters.private.escapes
+local special = "~#$%^&_{}\\|"
+
+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 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
+
+local set = utffilters.private.set
+
+for ch in gmatch(special,".") do set(ch) end
+
+--[[ldx--
+<p>We get a more efficient variant of this when we integrate
+replacements in collapser. This more or less renders the previous
+private code redundant. The following code is equivalent but the
+first snippet uses the relocated dollars.</p>
+
+<typing>
+[󰀤x󰀤] [$x$]
+</typing>
+--ldx]]--
+
+local cr = utffilters.private.high -- kan via een lpeg
+local cf = utffilters
+
+--[[ldx--
+<p>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.
+</p>
+--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 utfcharacters(str) 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
+ first = second
+ end
+ end
+ else
+ local crs = cr[second]
+ if crs then
+ for s in utfcharacters(str) do
+ if n == 1 then
+ break
+ else
+ tokens[#tokens+1], n = s, n - 1
+ end
+ end
+ if first then
+ tokens[#tokens+1] = first
+ end
+ first, done = crs, true
+ else
+ local cgf = graphemes[first]
+ if cgf and cgf[second] then
+ for s in utfcharacters(str) 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
+ 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--
+<p>Next we implement some commands that are used in the user interface.</p>
+--ldx]]--
+
+commands = commands or { }
+
+function commands.uchar(first,second)
+ tex.sprint(ctxcatcodes,utfchar(first*256+second))
+end
+
+--[[ldx--
+<p>A few helpers (used to be <t>luat-uni<t/>).</p>
+--ldx]]--
+
+function utf.split(str)
+ local t = { }
+ for snippet in utfcharacters(str) do
+ t[#t+1] = snippet
+ end
+ return t
+end
+
+function utf.each(str,fnc)
+ for snippet in utfcharacters(str) do
+ fnc(snippet)
+ end
+end
diff --git a/tex/context/base/char-utf.mkiv b/tex/context/base/char-utf.mkiv
new file mode 100644
index 000000000..16b4029d8
--- /dev/null
+++ b/tex/context/base/char-utf.mkiv
@@ -0,0 +1,47 @@
+%D \module
+%D [ file=char-utf,
+%D version=2006.12.05,
+%D title=\CONTEXT\ Character Support,
+%D subtitle=Unicode UTF,
+%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}{ConTeXt Character Support / Unicode UTF}
+
+%D After a bit of experimenting we reached a clean state where \UTF\
+%D 8, 16 and 32 were supported as well as collapsing (combining
+%D sequences). Writing the code was a relaxed experience, not in the
+%D last place because it was accompanied by listening to those nice
+%D Vienna Teng cd's (who decided that making music was more fun than
+%D programming, but then, she may not know \TEX\ and \LUA).
+
+\unprotect
+
+\registerctxluafile{char-utf}{1.001}
+
+%D We enable collapsing (combining characters) by default, but
+%D since the source files are rather simple, we postpone the
+%D initialization till runtime.
+
+\appendtoks
+ \ctxlua {
+ characters.filters.utf.collapsing = true
+ resolvers.install_text_filter('utf',characters.filters.utf.collapse)
+ }%
+\to \everyjob
+
+%D The next one influences input parsing.
+%D
+%D \starttyping
+%D \definecomposedutf 318 108 126 % lcaron
+%D \stoptyping
+
+\unexpanded\def\definecomposedutf#1 #2 #3 %
+ {\ctxlua{characters.filters.utf.add_grapheme("#1","#2","#3")}}
+
+\protect
diff --git a/tex/context/base/chem-ini.lua b/tex/context/base/chem-ini.lua
new file mode 100644
index 000000000..908749092
--- /dev/null
+++ b/tex/context/base/chem-ini.lua
@@ -0,0 +1,75 @@
+if not modules then modules = { } end modules ['chem-ini'] = {
+ version = 1.001,
+ comment = "companion to chem-ini.mkiv",
+ 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
+local lpegmatch = lpeg.match
+
+local trace_molecules = false trackers.register("chemistry.molecules", function(v) trace_molecules = v end)
+
+local ctxcatcodes = tex.ctxcatcodes
+
+chemicals = chemicals or { }
+
+--[[
+<p>The next code is an adaptation of code from Wolfgang Schuster
+as posted on the mailing list. This version supports nested
+braces and unbraced integers as scripts. We could consider
+spaces as terminals for them but first let collect a bunch
+of input then.</p>
+]]--
+
+-- some lpeg, maybe i'll make an syst-lpg module
+
+local lowercase = lpeg.R("az")
+local uppercase = lpeg.R("AZ")
+local backslash = lpeg.P("\\")
+local csname = backslash * lpeg.P(1) * (1-backslash)^0
+local plus = lpeg.P("+") / "\\textplus "
+local minus = lpeg.P("-") / "\\textminus "
+local digit = lpeg.R("09")
+local sign = plus + minus
+local cardinal = digit^1
+local integer = sign^0 * cardinal
+
+local leftbrace = lpeg.P("{")
+local rightbrace = lpeg.P("}")
+local nobrace = 1 - (leftbrace + rightbrace)
+local nested = lpeg.P { leftbrace * (csname + sign + nobrace + lpeg.V(1))^0 * rightbrace }
+local any = lpeg.P(1)
+
+local subscript = lpeg.P("_")
+local superscript = lpeg.P("^")
+local somescript = subscript + superscript
+
+--~ local content = lpeg.Cs(nested + integer + sign + any)
+local content = lpeg.Cs(csname + nested + sign + any)
+
+-- could be made more efficient
+
+local lowhigh = lpeg.Cc("\\lohi{%s}{%s}") * subscript * content * superscript * content / format
+local highlow = lpeg.Cc("\\hilo{%s}{%s}") * superscript * content * subscript * content / format
+local low = lpeg.Cc("\\low{%s}") * subscript * content / format
+local high = lpeg.Cc("\\high{%s}") * superscript * content / format
+local justtext = (1 - somescript)^1
+local parser = lpeg.Cs((csname + lowhigh + highlow + low + high + sign + any)^0)
+
+chemicals.moleculeparser = parser -- can be used to avoid functioncall
+
+function chemicals.molecule(str)
+ return lpegmatch(parser,str)
+end
+
+function commands.molecule(str)
+ if trace_molecules then
+ local rep = lpegmatch(parser,str)
+ logs.report("chemistry", "molecule %s => %s",str,rep)
+ texsprint(ctxcatcodes,rep)
+ else
+ texsprint(ctxcatcodes,lpegmatch(parser,str))
+ end
+end
diff --git a/tex/context/base/chem-ini.mkiv b/tex/context/base/chem-ini.mkiv
new file mode 100644
index 000000000..5184fe1a7
--- /dev/null
+++ b/tex/context/base/chem-ini.mkiv
@@ -0,0 +1,47 @@
+%D \module
+%D [ file=chem-ini,
+%D version=2008.03.06,
+%D subtitle=Chemistry,
+%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}{ConTeXt Chemistry Macros / Initialization} % might become Inline
+
+\registerctxluafile{chem-ini}{1.001}
+
+\unprotect
+
+%D \macros
+%D {molecule}
+%D
+%D Quick and dirty:
+%D
+%D \starttyping
+%D \def\molecule#1{$\enablesupersub\tf#1$}
+%D \stoptyping
+%D
+%D Using \LUA:
+%D
+%D \startbuffer
+%D \molecule{H_2SO_4^-2}
+%D \molecule{H_2SO_4^{-2}}
+%D \molecule{H_2SO_4^{-2{x}}}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\molecule#1{\ctxlua{commands.molecule(\!!bs#1\!!es)}}
+
+%D For old times sake:
+
+\def\chem#1#2#3%
+ {\dontleavehmode\begingroup#1\lohi{#2}{#3}\endgroup}
+
+\protect \endinput
+
+
diff --git a/tex/context/base/chem-str.lua b/tex/context/base/chem-str.lua
new file mode 100644
index 000000000..ad4cc6c1b
--- /dev/null
+++ b/tex/context/base/chem-str.lua
@@ -0,0 +1,490 @@
+if not modules then modules = { } end modules ['chem-str'] = {
+ version = 1.001,
+ comment = "companion to chem-str.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This module in incomplete and experimental.
+
+-- We can push snippets into an mp instance.
+
+local trace_structure = false trackers.register("chemistry.structure", function(v) trace_structure = v end)
+local trace_textstack = false trackers.register("chemistry.textstack", function(v) trace_textstack = v end)
+
+local format, gmatch, match, lower, gsub = string.format, string.gmatch, string.match, string.lower, string.gsub
+local concat, insert, remove = table.concat, table.insert, table.remove
+local apply = structure.processors.apply
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local lpegmatch = lpeg.match
+
+local variables = interfaces.variables
+
+chemicals = chemicals or { }
+
+chemicals.instance = "metafun" -- "ppchtex"
+chemicals.format = "metafun"
+chemicals.structures = 0
+
+local remapper = {
+ ["+"] = "p",
+ ["-"] = "m",
+}
+
+local common_keys = {
+ b = "line", eb = "line", db = "line", er = "line", dr = "line", br = "line",
+ sb = "line", msb = "line", psb = "line",
+ r = "line", pr = "line", mr = "line",
+ au = "line", ad = "line",
+ rb = "line", mrb = "line", prb = "line",
+ rd = "line", mrd = "line", prd = "line",
+ sr = "line", msr = "line", psr = "line",
+ c = "line", cc = "line", cd = "line", ccd = "line",
+ rn = "number", rtn = "number", rbn = "number",
+ s = "line", ss = "line", pss = "line", mss = "line",
+ mid = "fixed", mids = "fixed", midz = "text",
+ z = "text", rz = "text", mrz = "text", prz = "text", crz = "text",
+ rt = "text", rtt = "text", rbt = "text", zt = "text", zn = "number",
+ mov = "transform", rot = "transform", adj = "transform", dir = "transform", sub = "transform",
+}
+
+local front_keys = {
+ b = "line", bb= "line",
+ sb = "line", msb = "line", psb = "line",
+ r = "line", pr = "line", mr = "line",
+ z = "text", mrz = "text", prz = "text",
+}
+
+local one_keys = {
+ sb = "line", db = "line", tb = "line",
+ ep = "line", es = "line", ed = "line", et = "line",
+ sd = "line", ldd = "line", rdd = "line",
+ hb = "line", bb = "line", oe = "line", bd = "line", bw = "line",
+ z = "text", cz = "text", zt = "text", zn = "number",
+ zbt = "text", zbn = "number", ztt = "text", ztn = "number",
+ mov = "transform", sub = "transform", dir = "transform", off = "transform",
+}
+
+local front_align = {
+ mrz = { { "b","b","b","b","b","b" } },
+ prz = { { "t","t","t","t","t","t" } },
+}
+
+local syntax = {
+ one = {
+ n = 1, max = 8, keys = one_keys,
+ align = {
+ z = { { "r", "r_b", "b", "l_b", "l", "l_t", "t", "r_t" } },
+--~ z = { { "r", "r", "b", "l", "l", "l", "t", "r" } },
+ }
+ },
+ three = {
+ n = 3, max = 3, keys = common_keys,
+ align = {
+ mrz = { { "r","b","l" }, { "b","l","t" }, { "l","t","r" }, { "t","r","b" } },
+ rz = { { "r","l_b","l_t" }, { "b","l_t","r_t" }, { "l","r_t","r_b" }, { "t","r_b","l_b" } },
+ prz = { { "r","l","t" }, { "b","t","r" }, { "l","r","b" }, { "t","b","l" } },
+ }
+ },
+ four = {
+ n = 4, max = 4, keys = common_keys,
+ align = {
+ mrz = { { "t","r","b","l" }, { "r","b","l","t" }, { "b","l","t","r" }, { "l","t","r","b" } },
+ rz = { { "r_t","r_b","l_b","l_t" }, { "r_b","l_b","l_t","r_t" }, { "l_b","l_t","r_t","r_b" }, { "l_t","r_t","r_b","l_b" } },
+ prz = { { "r","b","l","t" }, { "b","l","t","r" }, { "l","t","r","b" }, { "t","r","b","l" } },
+ }
+ },
+ five = {
+ n = 5, max = 5, keys = common_keys,
+ align = {
+ mrz = { { "t","r","b","b","l" }, { "r","b","l","l","t" }, { "b","l","t","r","r" }, { "l","t","r","r","b" } },
+ rz = { { "r","r","b","l","t" }, { "b","b","l","t","r" }, { "l","l","t","r","b" }, { "t","t","r","b","l" } },
+ prz = { { "r","b","l","t","t" }, { "b","l","t","r","r" }, { "l","t","r","b","b" }, { "t","r","b","l","l" } },
+ }
+ },
+ six = {
+ n = 6, max = 6, keys = common_keys,
+ align = {
+ mrz = { { "t","t","r","b","b","l" }, { "r","b","b","l","t","t" }, { "b","b","l","t","t","r" }, { "l","t","t","r","b","b" } },
+ rz = { { "r","r","b","l","l","t" }, { "b","b","l","t","t","r" }, { "l","l","t","r","r","b" }, { "t","t","r","b","b","l" } },
+ prz = { { "r","b","l","l","t","r" }, { "b","l","t","t","r","b" }, { "l","t","r","r","b","l" }, { "t","r","b","b","l","t" } },
+ }
+ },
+ eight = {
+ n = 8, max = 8, keys = common_keys,
+ align = { -- todo
+ mrz = { { "t","r","r","b","b","l","l","t" }, { "r","b","b","l","l","t","t","r" }, { "b","l","l","t","t","r","r","b" }, { "l","t","t","r","r","b","b","l" } },
+ rz = { { "r","r","b","b","l","l","t","t" }, { "b","b","l","l","t","t","r","r" }, { "l","l","t","t","r","r","b","b" }, { "t","t","r","r","b","b","l","l" } },
+ prz = { { "r","b","b","l","l","t","t","r" }, { "b","l","l","t","t","r","r","b" }, { "l","t","t","r","r","b","b","l" }, { "t","r","r","b","b","l","l","t" } },
+ }
+ },
+ five_front = {
+ n = -5, max = 5, keys = front_keys, align = front_align,
+ },
+ six_front = {
+ n = -6, max = 6, keys = front_keys, align = front_align,
+ },
+ pb = { direct = 'chem_pb ;' },
+ pe = { direct = 'chem_pe ;' },
+ save = { direct = 'chem_save ;' },
+ restore = { direct = 'chem_restore ;' },
+ space = { direct = 'chem_symbol("\\chemicalsymbol[space]") ;' },
+ plus = { direct = 'chem_symbol("\\chemicalsymbol[plus]") ;' },
+ minus = { direct = 'chem_symbol("\\chemicalsymbol[minus]") ;' },
+ gives = { direct = 'chem_symbol("\\chemicalsymbol[gives]{%s}{%s}") ;', arguments = 2 },
+ equilibrium = { direct = 'chem_symbol("\\chemicalsymbol[equilibrium]{%s}{%s}") ;', arguments = 2 },
+ mesomeric = { direct = 'chem_symbol("\\chemicalsymbol[mesomeric]{%s}{%s}") ;', arguments = 2 },
+ opencomplex = { direct = 'chem_symbol("\\chemicalsymbol[opencomplex]") ;' },
+ closecomplex = { direct = 'chem_symbol("\\chemicalsymbol[closecomplex]") ;' },
+}
+
+local definitions = { }
+
+function chemicals.undefine(name)
+ definitions[lower(name)] = nil
+end
+
+function chemicals.define(name,spec,text)
+ name = lower(name)
+ local dn = definitions[name]
+ if not dn then dn = { } definitions[name] = dn end
+ dn[#dn+1] = {
+ spec = aux.settings_to_array(lower(spec)),
+ text = aux.settings_to_array(text),
+ }
+end
+
+local metacode, kind, keys, bonds, max, txt, textsize, rot, pstack
+local molecule = chemicals.molecule -- or use lpegmatch(chemicals.moleculeparser,...)
+
+local function fetch(txt)
+ local st = stack[txt]
+ local t = st.text[st.n]
+--~ st.n = st.n + 1
+ while not t and txt > 1 do
+ txt = txt - 1
+ st = stack[txt]
+ t = st.text[st.n]
+--~ st.n = st.n + 1
+ end
+ if t then
+ if trace_textstack then
+ logs.report("chemical", "fetching from stack %s slot %s: %s",txt,st.n,t)
+ end
+st.n = st.n + 1
+ end
+ return txt, t
+end
+
+local digit = lpeg.R("09")/tonumber
+local colon = lpeg.P(":")
+local equal = lpeg.P("=")
+local other = 1 - digit - colon - equal
+local remapped = lpeg.S("+-") / remapper
+local operation = lpeg.Cs((remapped^0 * other)^1)
+local amount = digit
+local single = digit
+local special = (colon * lpeg.C(other^1)) + lpeg.Cc("")
+local range = digit * lpeg.P("..") * digit
+local set = lpeg.Ct(digit^2)
+local text = (equal * lpeg.C(lpeg.P(1)^0)) + lpeg.Cc(false)
+local pattern =
+ (amount + lpeg.Cc(1)) *
+ operation *
+ special * (
+ range * lpeg.Cc(false) * text +
+ lpeg.Cc(false) * lpeg.Cc(false) * set * text +
+ single * lpeg.Cc(false) * lpeg.Cc(false) * text +
+ lpeg.Cc(false) * lpeg.Cc(false) * lpeg.Cc(false) * text
+ )
+
+--~ local n, operation, index, upto, set, text = lpegmatch(pattern,"RZ1357")
+
+--~ print(lpegmatch(pattern,"RZ=x")) 1 RZ false false false x
+--~ print(lpegmatch(pattern,"RZ1=x")) 1 RZ 1 false false x
+--~ print(lpegmatch(pattern,"RZ1..3=x")) 1 RZ 1 3 false x
+--~ print(lpegmatch(pattern,"RZ13=x")) 1 RZ false false table x
+
+local function process(spec,text,n,rulethickness,rulecolor,offset)
+ insert(stack,{ spec=spec, text=text, n=n })
+ local txt = #stack
+ for i=1,#spec do
+ local s = spec[i]
+ local d = definitions[s]
+ if d then
+ for i=1,#d do
+ local di = d[i]
+ process(di.spec,di.text,1,rulethickness,rulecolor)
+ end
+ else
+ local rep, operation, special, index, upto, set, text = lpegmatch(pattern,s)
+ if operation == "pb" then
+ insert(pstack,kind)
+ metacode[#metacode+1] = syntax.pb.direct
+ if keys[special] == "text" and index then
+ if keys["c"..special] == "text" then -- can be option: auto ...
+ metacode[#metacode+1] = format('chem_c%s(%s,%s,"");',special,bonds,index)
+ else
+ metacode[#metacode+1] = format('chem_%s(%s,%s,"");',special,bonds,index)
+ end
+ end
+ elseif operation == "save" then
+ insert(pstack,kind)
+ metacode[#metacode+1] = syntax.save.direct
+ elseif operation == "pe" or operation == "restore" then
+ kind = remove(pstack)
+ local ss = syntax[kind]
+ local prev = bonds or 6
+ keys, bonds, max, rot = ss.keys, ss.n, ss.max, 1
+ metacode[#metacode+1] = syntax[operation].direct
+ metacode[#metacode+1] = format("chem_set(%s,%s) ;",prev,bonds)
+ elseif operation == "front" then
+ if syntax[kind .. "_front"] then
+ kind = kind .. "_front"
+ local ss = syntax[kind]
+ local prev = bonds or 6
+ keys, bonds, max, rot = ss.keys, ss.n, ss.max, 1
+ metacode[#metacode+1] = format("chem_set(%s,%s) ;",prev,bonds)
+ end
+ elseif operation then
+ local ss = syntax[operation]
+ if ss then
+ local ds = ss.direct
+ if ds then
+ local sa = ss.arguments
+ if sa == 1 then
+ local one ; txt, one = fetch(txt)
+ metacode[#metacode+1] = format(ds,one or "")
+ elseif sa ==2 then
+ local one ; txt, one = fetch(txt)
+ local two ; txt, two = fetch(txt)
+ metacode[#metacode+1] = format(ds,one or "",two or "")
+ else
+ metacode[#metacode+1] = ds
+ end
+ elseif ss.keys then
+ local prev = bonds or 6
+ kind, keys, bonds, max, rot = s, ss.keys, ss.n, ss.max, 1
+ metacode[#metacode+1] = format("chem_set(%s,%s) ;",prev,bonds)
+ end
+ else
+ local what = keys[operation]
+ if what == "line" then
+ if set then
+ for i=1,#set do
+ local si = set[i]
+ metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,si,si,rulethickness,rulecolor)
+ end
+ elseif upto then
+ metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,index,upto,rulethickness,rulecolor)
+ elseif index then
+ metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,index,index,rulethickness,rulecolor)
+ else
+ metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,1,max,rulethickness,rulecolor)
+ end
+ elseif what == "number" then
+ if set then
+ for i=1,#set do
+ local si = set[i]
+ metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,si,si)
+ end
+ elseif upto then
+ for i=index,upto do
+ local si = set[i]
+ metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,si,si)
+ end
+ elseif index then
+ metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,index,index)
+ else
+ for i=1,max do
+ metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,i,i)
+ end
+ end
+ elseif what == "text" then
+ local align = syntax[kind].align
+ align = align and align[operation]
+ align = align and align[rot]
+ if set then
+ for i=1,#set do
+ local si = set[i]
+ local t = text
+ if not t then txt, t = fetch(txt) end
+ if t then
+ local a = align and align[si]
+ if a then a = "." .. a else a = "" end
+ metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,a,bonds,si,molecule(apply(t)))
+ end
+ end
+ elseif upto then
+ for i=index,upto do
+ local t = text
+ if not t then txt, t = fetch(txt) end
+ if t then
+ local s = align and align[i]
+ if s then s = "." .. s else s = "" end
+ metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,i,molecule(apply(t)))
+ end
+ end
+ elseif index == 0 then
+ local t = text
+ if not t then txt, t = fetch(txt) end
+ if t then
+ metacode[#metacode+1] = format('chem_%s_zero("\\dochemicaltext{%s}");',operation,molecule(apply(t)))
+ end
+ elseif index then
+ local t = text
+ if not t then txt, t = fetch(txt) end
+ if t then
+ local s = align and align[index]
+ if s then s = "." .. s else s = "" end
+ metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,index,molecule(apply(t)))
+ end
+ else
+ for i=1,max do
+ local t = text
+ if not t then txt, t = fetch(txt) end
+ if t then
+ local s = align and align[i]
+ if s then s = "." .. s else s = "" end
+ metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,i,molecule(apply(t)))
+ end
+ end
+ end
+ elseif what == "transform" then
+ if index then
+ for r=1,rep do
+ metacode[#metacode+1] = format('chem_%s(%s,%s);',operation,bonds,index)
+ end
+ if operation == "rot" then
+ rot = index
+ end
+ end
+ elseif what == "fixed" then
+ metacode[#metacode+1] = format("chem_%s(%s,%s,%s);",operation,bonds,rulethickness,rulecolor)
+ end
+ end
+ end
+ end
+ end
+ remove(stack)
+end
+
+-- the size related values are somewhat special but we want to be
+-- compatible
+--
+-- maybe we should default to fit
+--
+-- rulethickness in points
+
+function chemicals.start(settings)
+ chemicals.structures = chemicals.structures + 1
+ local textsize, rulethickness, rulecolor = settings.size, settings.rulethickness, settings.rulecolor
+ local width, height, scale, offset = settings.width or 0, settings.height or 0, settings.scale or "medium", settings.offset or 0
+ local l, r, t, b = settings.left or 0, settings.right or 0, settings.top or 0, settings.bottom or 0
+ if scale == variables.small then
+ scale = 500
+ elseif scale == variables.medium or scale == 0 then
+ scale = 625
+ elseif scale == variables.big then
+ scale = 750
+ else
+ scale = tonumber(scale)
+ if not scale or scale == 0 then
+ scale = 750
+ elseif scale < 500 then
+ scale = 500
+ end
+ end
+ if width == variables.fit then
+ width = true
+ else
+ width = tonumber(width) or 0
+ if l == 0 then
+ if r == 0 then
+ l = (width == 0 and 2000) or width/2
+ r = l
+ elseif width ~= 0 then
+ l = width - r
+ end
+ elseif r == 0 and width ~= 0 then
+ r = width - l
+ end
+ width = false
+ end
+ if height == variables.fit then
+ height = true
+ else
+ height = tonumber(height) or 0
+ if t == 0 then
+ if b == 0 then
+ t = (height == 0 and 2000) or height/2
+ b = t
+ elseif height ~= 0 then
+ t = height - b
+ end
+ elseif b == 0 and height ~= 0 then
+ b = height - t
+ end
+ height = false
+ end
+ scale = 0.75 * scale/625
+ metacode = { format("chem_start_structure(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) ;",
+ chemicals.structures,
+ l/25, r/25, t/25, b/25, scale,
+ tostring(settings.axis == variables.on), tostring(width), tostring(height), tostring(offset)
+ ) }
+ kind, keys, bonds, stack, rot, pstack = "six", { }, 6, { }, 1, { }
+end
+
+function chemicals.stop()
+ metacode[#metacode+1] = "chem_stop_structure ;"
+ local mpcode = concat(metacode,"\n")
+ if trace_structure then
+ logs.report("chemical", "metapost code:\n%s", mpcode)
+ end
+ metapost.graphic(chemicals.instance,chemicals.format,mpcode)
+ metacode = nil
+end
+
+function chemicals.component(spec,text,settings)
+ rulethickness, rulecolor, offset = settings.rulethickness, settings.rulecolor
+ local spec = aux.settings_to_array(lower(spec))
+ local text = aux.settings_to_array(text)
+ metacode[#metacode+1] = "chem_start_component ;"
+ process(spec,text,1,rulethickness,rulecolor)
+ metacode[#metacode+1] = "chem_stop_component ;"
+end
+
+local inline = {
+ ["single"] = "\\chemicalsinglebond", ["-"] = "\\chemicalsinglebond",
+ ["double"] = "\\chemicaldoublebond", ["--"] = "\\chemicaldoublebond",
+ ["triple"] = "\\chemicaltriplebond", ["---"] = "\\chemicaltriplebond",
+ ["gives"] = "\\chemicalgives", ["->"] = "\\chemicalgives",
+ ["equilibrium"] = "\\chemicalequilibrium", ["<->"] = "\\chemicalequilibrium",
+ ["mesomeric"] = "\\chemicalmesomeric", ["<>"] = "\\chemicalmesomeric",
+ ["plus"] = "\\chemicalsplus", ["+"] = "\\chemicalsplus",
+ ["minus"] = "\\chemicalsminus",
+ ["space"] = "\\chemicalsspace",
+}
+
+-- todo: top / bottom
+
+function chemicals.inline(spec)
+ local spec = aux.settings_to_array(spec)
+ for i=1,#spec do
+ local s = spec[i]
+ local inl = inline[lower(s)]
+ if inl then
+ texsprint(ctxcatcodes,inl)
+ else
+ texsprint(ctxcatcodes,format("\\chemicalinline{%s}",molecule(s)))
+ end
+ end
+end
+
+statistics.register("chemical formulas", function()
+ if chemicals.structures > 0 then
+ return format("%s chemical structure formulas",chemicals.structures) -- no timing needed, part of metapost
+ end
+end)
diff --git a/tex/context/base/chem-str.mkiv b/tex/context/base/chem-str.mkiv
new file mode 100644
index 000000000..1e17218c8
--- /dev/null
+++ b/tex/context/base/chem-str.mkiv
@@ -0,0 +1,529 @@
+%D \module
+%D [ file=chem-ini,
+%D version=2009.05.13,
+%D subtitle=Chemistry,
+%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.
+
+%D This module in incomplete and experimental. Eventually this code
+%D will replace \PPCHTEX.
+
+\writestatus{loading}{ConTeXt Chemistry Macros / Structure}
+
+\registerctxluafile{chem-str}{1.001}
+
+% We have a slightly different interface. This is unchanged:
+%
+% \startchemical[axis=on]
+% \chemical[SIX,ROT2,B,R6,SUB1,FIVE,ROT1,B][1]
+% \stopchemical
+%
+% Here we use chemicalformula instead, so no longer a mix:
+%
+% \startchemicalformula
+% \chemical{H_2}{top}{bottom}
+% \chemical{PLUS}{top}{bottom}
+% \chemical{O}{top}{bottom}
+% \chemical{GIVES}{top}{bottom}
+% \chemical{H_2O}{top}{bottom}
+% \stopchemicalformula
+%
+% \startchemicalformula
+% \chemical{H_2}
+% \chemical{PLUS}
+% \chemical{O}
+% \chemical{GIVES}
+% \chemical{H_2O}
+% \stopchemicalformula
+%
+% The inline variant has only one argument:
+%
+% \chemical{H_2,PLUS,O,GIVES,H_2O}
+
+% todo: seven | eight | frontsix | fontfive | carbon | newmans | chair
+
+\unprotect
+
+\unexpanded\def\setupchemical
+ {\dosingleempty\dosetupchemical}
+
+\def\dosetupchemical
+ {\getparameters[\??cm]}
+
+\let\setupchemicals\setupchemical
+
+\unexpanded\def\setupchemicalframed
+ {\dosingleempty\dosetupchemicalframed}
+
+\def\dosetupchemicalframed
+ {\getparameters[\??cm:\c!frame]}
+
+\def\chemicalparameter#1{\csname\??cm#1\endcsname}
+
+\unexpanded\def\definechemical
+ {\dosingleargument\dodefinechemical} % global
+
+\def\dodefinechemical[#1]#2%
+ {\startnointerference
+ \ctxlua{chemicals.undefine("#1")}%
+ \def\chemical{\dodoubleempty\dostructurechemical}%
+ \def\dostructurechemical[##1][##2]{\ctxlua{chemicals.define("#1",\!!bs##1\!!es,\!!bs\detokenize{##2}\!!es)}}%
+ #2% flush
+ \stopnointerference}
+
+\unexpanded\def\definechemicalsymbol
+ {\dodoubleempty\dodefinechemicalsymbol}
+
+\def\dodefinechemicalsymbol[#1][#2]%
+ {\setvalue{\??cm::#1}{#2}}
+
+\def\chemicalsymbol[#1]%
+ {\getvalue{\??cm::#1}}
+
+% size (small medium big)
+
+\def\dosetchemicaltext
+ {\dosetfontattribute \??cm\c!style
+ \dosetcolorattribute\??cm\c!color}
+
+\def\dochemicaltext#1%
+ {\dosetchemicaltext\strut#1} % maybe also \setstrut
+
+\edef\chemicaltoplocation{t}
+\edef\chemicalbotlocation{b}
+
+\def\dochemicaltext#1% in ppchtex we had a more clever alignment
+ {\dosetchemicaltext\strut#1} % maybe also \setstrut
+
+\def\dochemicaltext#1%
+ {\mathematics{\dosetchemicaltext\strut\ifcase\currentxfontsize\or\scriptstyle\or\scriptscriptstyle\fi#1}}
+
+\newconditional\indisplaychemical
+
+\unexpanded\def\startchemical
+ {\dosingleempty\dostartchemical}
+
+\setvalue{\??cm:\c!size:\v!small }{\txx}
+\setvalue{\??cm:\c!size:\v!medium}{\tx}
+\setvalue{\??cm:\c!size:\v!big }{}
+
+\newtoks \everychemical
+\newtoks \everystructurechemical
+\newtoks \withchemicalbox
+\newbox \chemicalbox
+\newconditional\somechemicaltext
+\newdimen \chemicalwidth
+\newdimen \chemicalheight
+\newdimen \chemicaldepth
+
+\def\dostartchemical[#1]%
+ {\ifmmode\vcenter\else\vbox\fi
+ \bgroup
+ \dontcomplain
+ \settrue\indisplaychemical
+ \forgetall
+ \getparameters[\??cm][#1]%
+ \the\everystructurechemical
+ \setbox\chemicalbox\hbox\bgroup
+ \ctxlua{chemicals.start {
+ width = "\chemicalparameter\c!width",
+ height = "\chemicalparameter\c!height",
+ left = \chemicalparameter\c!left,
+ right = \chemicalparameter\c!right,
+ top = \chemicalparameter\c!top,
+ bottom = \chemicalparameter\c!bottom,
+ scale = "\chemicalparameter\c!scale",
+ axis = "\chemicalparameter\c!axis",
+ offset = "\the\dimexpr.25em\relax",
+ } }%
+ \startnointerference}
+
+\unexpanded\def\stopchemical
+ {\stopnointerference
+ \ctxlua{chemicals.stop()}%
+ \egroup
+ \chemicalwidth \wd\chemicalbox
+ \chemicalheight\ht\chemicalbox
+ \chemicaldepth \dp\chemicalbox
+ \the\withchemicalbox
+ \doifelsenothing{\chemicalparameter\c!frame}\handlechemicalframednop\handlechemicalframedyes
+ \egroup}
+
+\def\handlechemicalframedyes
+ {\localframed%
+ [\??cm:\c!frame]%
+ [\c!frame=\chemicalparameter\c!frame,\c!align=\v!normal,\c!strut=\v!no]{\vbox{\box\chemicalbox\vss}}} % remove depth
+
+\def\handlechemicalframednop
+ {\localframed%
+ [\??cm:\c!frame]%
+ [\c!align=\v!normal,\c!strut=\v!no]{\vbox{\box\chemicalbox\vss}}} % remove depth
+
+\let\startstructurechemical\startchemical
+\let\stopstructurechemical \stopchemical
+
+\unexpanded\def\structurechemical
+ {\dotripleempty\dostructurechemical}
+
+\appendtoks
+ \let\chemical\structurechemical
+\to\everystructurechemical
+
+\def\dostructurechemical
+ {\ifthirdargument
+ \expandafter\dostructurechemicalthree
+ \else
+ \expandafter\dostructurechemicaltwo
+ \fi}
+
+\def\dostructurechemicalthree[#1][#2][#3]%
+ {\writestatus\m!chemicals{hyperlinked chemicals not yet supported}% todo reference, for the moment ignored
+ \ctxlua{chemicals.component(\!!bs#2\!!es, \!!bs\detokenize{#3}\!!es, { % maybe also pass first two args this way
+ rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points
+ rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup
+ } ) }%
+ \ignorespaces}
+
+\def\dostructurechemicaltwo[#1][#2]%
+ {\ctxlua{chemicals.component(\!!bs#1\!!es,\!!bs\detokenize{#2}\!!es, { % maybe also pass first two args this way
+ rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points
+ rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup
+ } ) }%
+ \ignorespaces}
+
+\appendtoks
+ \setbox\chemicalbox\hbox{\raise\MPlly\onebasepoint\box\chemicalbox}%
+ \chemicalwidth \wd\chemicalbox
+ \chemicalheight\ht\chemicalbox
+ \chemicaldepth \dp\chemicalbox
+\to \withchemicalbox
+
+% kind of compatible, but text sizes instead of math sizes (i.e. tx is larger than scriptsize)
+
+\appendtoks
+ \edef\chemicalbodyfont{\chemicalparameter\c!bodyfont}%
+ \doifnot\chemicalbodyfont\fontbody{\switchtobodyfont[\chemicalbodyfont]}% \fontbody is not expanded (yet)
+ \getvalue{\??cm:\c!size:\chemicalparameter\c!size}%
+% \to \everystructurechemical
+\to \everychemical
+
+\def\chemicaltoptext#1{\global\settrue\somechemicaltext\gdef\thetoptext{#1}\ignorespaces}
+\def\chemicalbottext#1{\global\settrue\somechemicaltext\gdef\thebottext{#1}\ignorespaces}
+\def\chemicalmidtext#1{\global\settrue\somechemicaltext\gdef\themidtext{#1}\ignorespaces}
+
+\appendtoks
+ \let\toptext\chemicaltoptext \glet\thetoptext\empty
+ \let\bottext\chemicalbottext \glet\thebottext\empty
+ \let\midtext\chemicalmidtext \glet\themidtext\empty
+ \global\setfalse\somechemicaltext
+\to \everystructurechemical
+
+\def\doaddchemicaltexts
+ {\setbox2\hbox to \chemicalwidth{\strut\hss\hbox{\strut\themidtext}\hss}%
+ \setbox4\hbox to \chemicalwidth{\strut\hss\hbox{\strut\thetoptext}\hss}%
+ \setbox6\hbox to \chemicalwidth{\strut\hss\hbox{\strut\thebottext}\hss}%
+ \setbox\chemicalbox\hbox \bgroup
+ \box\chemicalbox
+ \hskip-\chemicalwidth
+ \raise\chemicalheight\hbox{\lower\ht4\box4}%
+ \hskip-\chemicalwidth
+ \lower.5\dimexpr\ht2-\dp2\relax\box2%
+ \hskip-\chemicalwidth
+ \lower\chemicaldepth \hbox{\raise\dp6\box6}%
+ \hss
+ \egroup} % text on top of chemicals
+
+\appendtoks
+ \ifconditional\somechemicaltext
+ \doaddchemicaltexts
+ \chemicalwidth \wd\chemicalbox
+ \chemicalheight\ht\chemicalbox
+ \chemicaldepth \dp\chemicalbox
+ \fi
+\to \withchemicalbox
+
+% todo: enspace or emspace
+
+\definechemicalsymbol[space] [\enspace\quad\enspace]
+\definechemicalsymbol[plus] [\enspace+\enspace]
+\definechemicalsymbol[minus] [\enspace-\enspace]
+\definechemicalsymbol[gives] [\dochemicalarrow\xrightarrow]
+\definechemicalsymbol[equilibrium] [\dochemicalarrow\xrightoverleftarrow]
+\definechemicalsymbol[mesomeric] [\dochemicalarrow\xleftrightarrow]
+\definechemicalsymbol[opencomplex] [\mathematics{\Bigg[}] % not yet ok
+\definechemicalsymbol[closecomplex][\mathematics{\Bigg]}] % not yet ok
+
+\definechemicalsymbol[SPACE] [{\chemicalsymbol[space]}]
+\definechemicalsymbol[PLUS] [{\chemicalsymbol[plus]}]
+\definechemicalsymbol[MINUS] [{\chemicalsymbol[minus]}]
+\definechemicalsymbol[GIVES] [{\chemicalsymbol[gives]}]
+\definechemicalsymbol[EQUILIBRIUM] [{\chemicalsymbol[equilibrium]}]
+\definechemicalsymbol[MESOMERIC] [{\chemicalsymbol[mesomeric]}]
+\definechemicalsymbol[OPENCOMPLEX] [{\chemicalsymbol[opencomplex]}]
+\definechemicalsymbol[CLOSECOMPLEX][{\chemicalsymbol[closecomplex]}]
+
+\def\dochemicalarrow#1#2#3%
+ {\enspace
+ \mathematics{#1%
+ {\strut\hbox \!!spread 2em{\hss\ctxlua{chemicals.inline(\!!bs#2\!!es)}\hss}}%
+ {\strut\hbox \!!spread 2em{\hss\ctxlua{chemicals.inline(\!!bs#3\!!es)}\hss}}}%
+ \enspace}
+
+% special macros (probably needs some more work)
+
+\def\dochemicaltop#1#2#3#4%
+ {\begingroup
+ \setbox0\hbox{\tx\setstrut\strut#3}%
+ \setbox2\hbox{\setstrut\strut\molecule{#4}}%
+ \setbox0\hbox{\raise\dimexpr\dp0+\ht2\relax\hbox to \wd2{#1\box0#2}}%
+ \smashbox0
+ \hbox{\box0\box2}%
+ \endgroup}%
+
+\def\dochemicalbottom#1#2#3#4%
+ {\begingroup
+ \setbox0\hbox{\tx\setstrut\strut#3}%
+ \setbox2\hbox{\setstrut\strut#4}%
+ \setbox0\hbox{\lower\dimexpr\dp2+\ht0\relax\hbox to \wd2{#1\box0#2}}%
+ \smashbox0
+ \hbox{\box0\box2}%
+ \endgroup}%
+
+\unexpanded\def\chemicalleft#1#2%
+ {\begingroup
+ \hbox{\llap{\tx\setstrut\strut#1}\setstrut\strut#2}%
+ \endgroup}%
+
+\unexpanded\def\chemicalright#1#2%
+ {\begingroup
+ \hbox{\setstrut\strut#2\rlap{\tx\setstrut\strut#1}}%
+ \endgroup}%
+
+\unexpanded\def\chemicaltop {\dochemicaltop \hss \hss }
+\unexpanded\def\chemicallefttop {\dochemicaltop \relax \hss }
+\unexpanded\def\chemicalrighttop {\dochemicaltop \hss \relax}
+\unexpanded\def\chemicalbottom {\dochemicalbottom \hss \hss }
+\unexpanded\def\chemicalleftbottom {\dochemicalbottom \relax \hss }
+\unexpanded\def\chemicalrightbottom {\dochemicalbottom \hss \relax}
+
+\unexpanded\def\chemicaltopleft #1{\chemicalleft {\chemicalrighttop {#1}{}}}
+\unexpanded\def\chemicalbottomleft #1{\chemicalleft {\chemicalrightbottom{#1}{}}}
+\unexpanded\def\chemicaltopright #1{\chemicalright{\chemicallefttop {#1}{}}}
+\unexpanded\def\chemicalbottomright #1{\chemicalright{\chemicalleftbottom {#1}{}}}
+
+\unexpanded\def\chemicalcentered #1{\setbox\scratchbox\hbox{C}\hbox to \wd\scratchbox{\setstrut\strut\hss#1\hss}}
+\unexpanded\def\chemicalleftcentered #1{\setbox\scratchbox\hbox{C}\hbox to \wd\scratchbox{\setstrut\strut #1\hss}}
+\unexpanded\def\chemicalrightcentered#1{\setbox\scratchbox\hbox{C}\hbox to \wd\scratchbox{\setstrut\strut\hss#1}}
+
+\let\chemicalsmashedmiddle\chemicalcentered
+\let\chemicalsmashedleft \chemicalleftcentered
+\let\chemicalsmashedright \chemicalrightcentered
+
+\unexpanded\def\chemicaloxidation#1#2#3%
+ {\chemicaltop{\txx\ifcase#2\relax0\else#1\uppercase\expandafter{\romannumeral#2}\fi}{#3}}
+
+\unexpanded\def\chemicaloxidationplus {\dotriplegroupempty\chemicaloxidation{\textplus }} % {} needed!
+\unexpanded\def\chemicaloxidationminus{\dotriplegroupempty\chemicaloxidation{\textminus}} % {} needed!
+\unexpanded\def\chemicalforeveropen {\dotriplegroupempty\chemicalleft {$\big[$}} % {} needed!
+\unexpanded\def\chemicalforeverclose {\dotriplegroupempty\chemicalright {$\big]$}} % {} needed!
+\unexpanded\def\chemicaloxidationone {\chemicaloxidation\relax1}
+\unexpanded\def\chemicaloxidationtwo {\chemicaloxidation\relax2}
+\unexpanded\def\chemicaloxidationthree{\chemicaloxidation\relax3}
+\unexpanded\def\chemicaloxidationfour {\chemicaloxidation\relax4}
+\unexpanded\def\chemicaloxidationfive {\chemicaloxidation\relax5}
+\unexpanded\def\chemicaloxidationsix {\chemicaloxidation\relax6}
+\unexpanded\def\chemicaloxidationseven{\chemicaloxidation\relax7}
+
+\appendtoks
+ \let \+\chemicaloxidationplus
+ \let \-\chemicaloxidationminus
+ \let \[\chemicalforeveropen
+ \let \]\chemicalforeverclose
+ \let \1\chemicaloxidationone
+ \let \2\chemicaloxidationtwo
+ \let \3\chemicaloxidationthree
+ \let \4\chemicaloxidationfour
+ \let \5\chemicaloxidationfive
+ \let \6\chemicaloxidationsix
+ \let \7\chemicaloxidationseven
+ \let \X\chemicaltighttext
+ \let \T\chemicaltop
+ \let \B\chemicalbottom
+ \let \L\chemicalleft
+ \let\LC\chemicalleftcentered
+ \let \R\chemicalright
+ \let\RC\chemicalrightcentered
+ \let\TL\chemicaltopleft
+ \let\BL\chemicalbottomleft
+ \let\TR\chemicaltopright
+ \let\BR\chemicalbottomright
+ \let\LT\chemicallefttop
+ \let\LB\chemicalleftbottom
+ \let\RT\chemicalrighttop
+ \let\RB\chemicalrightbottom
+ \let\SL\chemicalsmashedleft
+ \let\SM\chemicalsmashedmiddle
+ \let\SR\chemicalsmashedright
+\to \everychemical
+
+\appendtoks
+ \the\everychemical
+\to \everystructurechemical
+
+% inline
+
+\unexpanded\def\chemical
+ {\ifinformula
+ \expandafter\displaychemical
+ \else
+ \expandafter\inlinechemical
+ \fi}
+
+\def\displaychemical
+ {\dotriplegroupempty\dodisplaychemical}
+
+\def\dodisplaychemical#1#2#3% todo:
+ {\the\everychemical \everychemical\emptytoks
+ \quad
+ \vcenter\bgroup
+ \ifthirdargument
+ \ifsecondargument
+ \halign{&\hss##\hss\cr#2\cr\molecule{#1}\cr#3\cr}%
+ \else
+ \halign{&\hss##\hss\cr\molecule{#1}\cr#2\cr}%
+ \fi
+ \else
+ \hbox{\molecule{#1}}%
+ \fi
+ \egroup
+ \quad}
+
+\def\inlinechemical#1%
+ {\dontleavehmode\hbox{\ctxlua{chemicals.inline(\!!bs#1\!!es)}}}
+
+\def\chemicalbondrule{\hbox{\vrule\!!height.75ex\!!depth-\dimexpr.75ex-\linewidth\relax\!!width1em\relax}}
+
+\definechemicalsymbol[i:space] [\enspace\quad\enspace]
+\definechemicalsymbol[i:plus] [\enspace\mathematics{+}\enspace]
+\definechemicalsymbol[i:minus] [\enspace\mathematics{-}\enspace]
+\definechemicalsymbol[i:gives] [\enspace\mathematics{\xrightarrow{}{}}\enspace]
+\definechemicalsymbol[i:equilibrium] [\enspace\mathematics{\xrightpverleftarrow{}{}}\enspace]
+\definechemicalsymbol[i:mesomeric] [\enspace\mathematics{\xleftrightarrow{}{}}\enspace]
+\definechemicalsymbol[i:single] [\chemicalbondrule]
+\definechemicalsymbol[i:tripple] [\hbox{\lower.5ex\chemicalbondrule\hskip-1em\raise.5ex\chemicalbondrule}]
+\definechemicalsymbol[i:double] [\hbox{\chemicalbondrule\hskip-1em\lower.5ex\chemicalbondrule\hskip-1em\raise.5ex\chemicalbondrule}]
+
+\def\chemicalsinglebond {\chemicalsymbol[i:single]}
+\def\chemicaldoublebond {\chemicalsymbol[i:tripple]}
+\def\chemicaltriplebond {\chemicalsymbol[i:double]}
+\def\chemicalgives {\chemicalsymbol[i:gives]}
+\def\chemicalmesomeric {\chemicalsymbol[i:mesomeric]}
+\def\chemicalequilibrium{\chemicalsymbol[i:equilibrium]}
+\def\chemicalsplus {\chemicalsymbol[i:plus]}
+\def\chemicalsminus {\chemicalsymbol[i:minus]}
+\def\chemicalsspace {\chemicalsymbol[i:space]}
+\def\chemicalinline #1{#1}
+
+% display
+
+\newconditional\formulachemicalhastop
+\newconditional\formulachemicalhasbot
+
+\newtoks\formulachemicaltop
+\newtoks\formulachemicalmid
+\newtoks\formulachemicalbot
+
+\newif\ifinchemicalformula
+
+\unexpanded\def\startchemicalformula
+ {\mathortext\vcenter\vbox\bgroup
+ \forgetall
+ \inchemicalformulatrue
+ \the\everychemical
+ \everychemical\emptytoks
+ \formulachemicaltop\emptytoks % not needed
+ \formulachemicalmid\emptytoks % not needed
+ \formulachemicalbot\emptytoks % not needed
+ \let\chemical\formulachemical
+ \setfalse\formulachemicalhastop
+ \setfalse\formulachemicalhasbot }
+
+\unexpanded\def\stopchemicalformula
+ {\tabskip1em\relax
+ \nointerlineskip
+ \ifconditional\formulachemicalhastop
+ \ifconditional\formulachemicalhasbot
+ \halign{&\hss##\hss\cr\the\formulachemicaltop\cr\the\formulachemicalmid\cr\the\formulachemicalbot\cr}%
+ \else
+ \halign{&\hss##\hss\cr\the\formulachemicaltop\cr\the\formulachemicalmid\cr}%
+ \fi
+ \else
+ \ifconditional\formulachemicalhasbot
+ \halign{&\hss##\hss\cr\the\formulachemicalmid\cr\the\formulachemicalbot\cr}%
+ \else
+ \halign{&\hss##\hss\cr\the\formulachemicalmid\cr}%
+ \fi
+ \fi
+ \egroup}
+
+\unexpanded\def\formulachemical
+ {\relax\dotriplegroupempty\doformulachemical}
+
+\def\doformulachemical#1#2#3%
+ {\ifthirdargument
+ \doifelsenothing{#2}\noformulachemicaltop{\doformulachemicaltop{#2}}%
+ \doifelsenothing{#3}\noformulachemicalbot{\doformulachemicalbot{#3}}%
+ \else\ifsecondargument
+ \noformulachemicaltop
+ \doifelsenothing{#2}\noformulachemicalbot{\doformulachemicalbot{#2}}%
+ \else
+ \noformulachemicaltop
+ \noformulachemicalbot
+ \fi\fi
+ \formulachemicalmid\expandafter{\the\formulachemicalmid\dodochemicalformulamid{#1}&}}
+
+\def\noformulachemicaltop {\formulachemicaltop\expandafter{\the\formulachemicaltop&}}
+\def\noformulachemicalbot {\formulachemicalbot\expandafter{\the\formulachemicalbot&}}
+\def\doformulachemicaltop#1{\formulachemicaltop\expandafter{\the\formulachemicaltop\dodochemicalformulatop{#1}&}\settrue\formulachemicalhastop}
+\def\doformulachemicalbot#1{\formulachemicalbot\expandafter{\the\formulachemicalbot\dodochemicalformulabot{#1}&}\settrue\formulachemicalhasbot}
+
+\def\dodochemicalformulamid#1%
+ {\ifcsname\??cm::\detokenize{#1}\endcsname\csname\??cm::\detokenize{#1}\expandafter\endcsname\else\molecule{#1}\fi{}{}}
+
+\def\dodochemicalformulatop#1{\strut#1}
+\def\dodochemicalformulabot#1{\strut#1}
+
+% gone: state option resolution offset (now frame offset) alternative
+
+\setupchemicalframed
+ [\c!align=\v!normal,
+ \c!strut=\v!no,
+ \c!offset=\v!overlay,
+ \c!frame=off]
+
+\setupchemical
+ [\c!frame=,
+ \c!width=0,
+ \c!height=0,
+ \c!left=0,
+ \c!right=0,
+ \c!top=0,
+ \c!bottom=0,
+ \c!bodyfont=\the\bodyfontsize,
+ \c!scale=\v!medium,
+ \c!size=\v!medium,
+ \c!textsize=\v!big,
+ \c!axis=\v!off,
+ \c!style=\rm,
+ \c!location=,
+ \c!color=,
+ \c!rulethickness=\linewidth,
+ \c!rulecolor=,
+ \c!factor=1]
+
+\protect \endinput
diff --git a/tex/context/base/colo-ema.tex b/tex/context/base/colo-ema.tex
new file mode 100644
index 000000000..e5e90b235
--- /dev/null
+++ b/tex/context/base/colo-ema.tex
@@ -0,0 +1,590 @@
+%D \module
+%D [ file=colo-ema,
+%D version=2003.03.20,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Emacs Colors,
+%D author=Peter Rolf,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% author : Peter Rolf <peter.rolf@arcor.de>
+% last change : 17 march 2003
+% origin : /emacs/etc/rgb.txt
+%
+% USAGE:
+%
+% - select emacs menu: Edit -> Text Properties -> Display
+% Colors, if you don't know what I'm talking about
+% - copy this file to your /texmf/tex/context/user directory
+% and add "\input colo-emacs" to your tex-file
+%
+% IMPORTANT NOTES:
+%
+% - all color names are written as ONE word in lowercase
+% letters (no redundancy as in rgb.txt) so if you want to
+% use the color "Light Sky Blue"/"light sky blue" it's new
+% name is lightskyblue
+% - the grayX values [X=0..100] can only be used with \color
+% [grayX]
+% - use it at your own risk :)
+%
+% HINT:
+%
+% I only include this file (\showcolor [ema]) until I've
+% found the colors I want. Copy and paste the color
+% definitions to a seperate file, to decrease compilation
+% time (540 color definitions).
+
+\definecolor [snow] [r=1,g=.980392,b=.980392]
+\definecolor [ghostwhite] [r=.972549,g=.972549,b=1]
+\definecolor [whitesmoke] [s=.960784]
+\definecolor [gainsboro] [s=.862745]
+\definecolor [floralwhite] [r=1,g=.980392,b=.941176]
+\definecolor [oldlace] [r=.992157,g=.960784,b=.901961]
+\definecolor [linen] [r=.980392,g=.941176,b=.901961]
+\definecolor [antiquewhite] [r=.980392,g=.921569,b=.843137]
+\definecolor [papayawhip] [r=1,g=.937255,b=.835294]
+\definecolor [blanchedalmond] [r=1,g=.921569,b=.803922]
+\definecolor [bisque] [r=1,g=.894118,b=.768627]
+\definecolor [peachpuff] [r=1,g=.854902,b=.72549]
+\definecolor [navajowhite] [r=1,g=.870588,b=.678431]
+\definecolor [moccasin] [r=1,g=.894118,b=.709804]
+\definecolor [cornsilk] [r=1,g=.972549,b=.862745]
+\definecolor [ivory] [r=1,g=1,b=.941176]
+\definecolor [lemonchiffon] [r=1,g=.980392,b=.803922]
+\definecolor [seashell] [r=1,g=.960784,b=.933333]
+\definecolor [honeydew] [r=.941176,g=1,b=.941176]
+\definecolor [mintcream] [r=.960784,g=1,b=.980392]
+\definecolor [azure] [r=.941176,g=1,b=1]
+\definecolor [aliceblue] [r=.941176,g=.972549,b=1]
+\definecolor [lavender] [r=.901961,g=.901961,b=.980392]
+\definecolor [lavenderblush] [r=1,g=.941176,b=.960784]
+\definecolor [mistyrose] [r=1,g=.894118,b=.882353]
+%definecolor[white] [s=1]
+%definecolor[black] [s=0]
+\definecolor [darkslategray] [r=.184314,g=.309804,b=.309804]
+\definecolor [dimgray] [s=.411765]
+\definecolor [slategray] [r=.439216,g=.501961,b=.564706]
+\definecolor [lightslategray] [r=.466667,g=.533333,b=.6]
+\definecolor [gray] [s=.745098]
+\definecolor [lightgray] [s=.827451]
+\definecolor [midnightblue] [r=.098039,g=.098039,b=.439216]
+\definecolor [navy] [b=.501961]
+\definecolor [navyblue] [navy]
+\definecolor [cornflowerblue] [r=.392157,g=.584314,b=.929412]
+\definecolor [darkslateblue] [r=.282353,g=.239216,b=.545098]
+\definecolor [slateblue] [r=.415686,g=.352941,b=.803922]
+\definecolor [mediumslateblue] [r=.482353,g=.407843,b=.933333]
+\definecolor [lightslateblue] [r=.517647,g=.439216,b=1]
+\definecolor [mediumblue] [b=.803922]
+\definecolor [royalblue] [r=.254902,g=.411765,b=.882353]
+%definecolor[blue] [b=1]
+\definecolor [dodgerblue] [r=.117647,g=.564706,b=1]
+\definecolor [deepskyblue] [g=.74902,b=1]
+\definecolor [skyblue] [r=.529412,g=.807843,b=.921569]
+\definecolor [lightskyblue] [r=.529412,g=.807843,b=.980392]
+\definecolor [steelblue] [r=.27451,g=.509804,b=.705882]
+\definecolor [lightsteelblue] [r=.690196,g=.768627,b=.870588]
+\definecolor [lightblue] [r=.678431,g=.847059,b=.901961]
+\definecolor [powderblue] [r=.690196,g=.878431,b=.901961]
+\definecolor [paleturquoise] [r=.686275,g=.933333,b=.933333]
+\definecolor [darkturquoise] [g=.807843,b=.819608]
+\definecolor [mediumturquoise] [r=.282353,g=.819608,b=.8]
+\definecolor [turquoise] [r=.25098,g=.878431,b=.815686]
+%definecolor[cyan] [g=1,b=1]
+\definecolor [lightcyan] [r=.878431,g=1,b=1]
+\definecolor [cadetblue] [r=.372549,g=.619608,b=.627451]
+\definecolor [mediumaquamarine] [r=.4,g=.803922,b=.666667]
+\definecolor [aquamarine] [r=.498039,g=1,b=.831373]
+\definecolor [darkgreen] [g=.392157]
+\definecolor [darkolivegreen] [r=.333333,g=.419608,b=.184314]
+\definecolor [darkseagreen] [r=.560784,g=.737255,b=.560784]
+\definecolor [seagreen] [r=.180392,g=.545098,b=.341176]
+\definecolor [mediumseagreen] [r=.235294,g=.701961,b=.443137]
+\definecolor [lightseagreen] [r=.12549,g=.698039,b=.666667]
+\definecolor [palegreen] [r=.596078,g=.984314,b=.596078]
+\definecolor [springgreen] [g=1,b=.498039]
+\definecolor [lawngreen] [r=.486275,g=.988235]
+%definecolor[green] [g=1]
+\definecolor [chartreuse] [r=.498039,g=1]
+\definecolor [mediumspringgreen] [g=.980392,b=.603922]
+\definecolor [greenyellow] [r=.678431,g=1,b=.184314]
+\definecolor [limegreen] [r=.196078,g=.803922,b=.196078]
+\definecolor [yellowgreen] [r=.603922,g=.803922,b=.196078]
+\definecolor [forestgreen] [r=.133333,g=.545098,b=.133333]
+\definecolor [olivedrab] [r=.419608,g=.556863,b=.137255]
+\definecolor [darkkhaki] [r=.741176,g=.717647,b=.419608]
+\definecolor [khaki] [r=.941176,g=.901961,b=.54902]
+\definecolor [palegoldenrod] [r=.933333,g=.909804,b=.666667]
+\definecolor [lightgoldenrodyellow] [r=.980392,g=.980392,b=.823529]
+\definecolor [lightyellow] [r=1,g=1,b=.878431]
+%definecolor[yellow] [r=1,g=1]
+\definecolor [gold] [r=1,g=.843137]
+\definecolor [lightgoldenrod] [r=.933333,g=.866667,b=.509804]
+\definecolor [goldenrod] [r=.854902,g=.647059,b=.12549]
+\definecolor [darkgoldenrod] [r=.721569,g=.52549,b=.043137]
+\definecolor [rosybrown] [r=.737255,g=.560784,b=.560784]
+\definecolor [indianred] [r=.803922,g=.360784,b=.360784]
+\definecolor [saddlebrown] [r=.545098,g=.270588,b=.07451]
+\definecolor [sienna] [r=.627451,g=.321569,b=.176471]
+\definecolor [peru] [r=.803922,g=.521569,b=.247059]
+\definecolor [burlywood] [r=.870588,g=.721569,b=.529412]
+\definecolor [beige] [r=.960784,g=.960784,b=.862745]
+\definecolor [wheat] [r=.960784,g=.870588,b=.701961]
+\definecolor [sandybrown] [r=.956863,g=.643137,b=.376471]
+\definecolor [tan] [r=.823529,g=.705882,b=.54902]
+\definecolor [chocolate] [r=.823529,g=.411765,b=.117647]
+\definecolor [firebrick] [r=.698039,g=.133333,b=.133333]
+\definecolor [brown] [r=.647059,g=.164706,b=.164706]
+\definecolor [darksalmon] [r=.913725,g=.588235,b=.478431]
+\definecolor [salmon] [r=.980392,g=.501961,b=.447059]
+\definecolor [lightsalmon] [r=1,g=.627451,b=.478431]
+\definecolor [orange] [r=1,g=.647059]
+\definecolor [darkorange] [r=1,g=.54902]
+\definecolor [coral] [r=1,g=.498039,b=.313725]
+\definecolor [lightcoral] [r=.941176,g=.501961,b=.501961]
+\definecolor [tomato] [r=1,g=.388235,b=.278431]
+\definecolor [orangered] [r=1,g=.270588]
+%definecolor[red] [r=1]
+\definecolor [hotpink] [r=1,g=.411765,b=.705882]
+\definecolor [deeppink] [r=1,g=.078431,b=.576471]
+\definecolor [pink] [r=1,g=.752941,b=.796078]
+\definecolor [lightpink] [r=1,g=.713725,b=.756863]
+\definecolor [palevioletred] [r=.858824,g=.439216,b=.576471]
+\definecolor [maroon] [r=.690196,g=.188235,b=.376471]
+\definecolor [mediumvioletred] [r=.780392,g=.082353,b=.521569]
+\definecolor [violetred] [r=.815686,g=.12549,b=.564706]
+%definecolor[magenta] [r=1,b=1]
+\definecolor [violet] [r=.933333,g=.509804,b=.933333]
+\definecolor [plum] [r=.866667,g=.627451,b=.866667]
+\definecolor [orchid] [r=.854902,g=.439216,b=.839216]
+\definecolor [mediumorchid] [r=.729412,g=.333333,b=.827451]
+\definecolor [darkorchid] [r=.6,g=.196078,b=.8]
+\definecolor [darkviolet] [r=.580392,b=.827451]
+\definecolor [blueviolet] [r=.541176,g=.168627,b=.886275]
+\definecolor [purple] [r=.627451,g=.12549,b=.941176]
+\definecolor [mediumpurple] [r=.576471,g=.439216,b=.858824]
+\definecolor [thistle] [r=.847059,g=.74902,b=.847059]
+\definecolor [snow1] [r=1,g=.980392,b=.980392]
+\definecolor [snow2] [r=.933333,g=.913725,b=.913725]
+\definecolor [snow3] [r=.803922,g=.788235,b=.788235]
+\definecolor [snow4] [r=.545098,g=.537255,b=.537255]
+\definecolor [seashell1] [r=1,g=.960784,b=.933333]
+\definecolor [seashell2] [r=.933333,g=.898039,b=.870588]
+\definecolor [seashell3] [r=.803922,g=.772549,b=.74902]
+\definecolor [seashell4] [r=.545098,g=.52549,b=.509804]
+\definecolor [antiquewhite1] [r=1,g=.937255,b=.858824]
+\definecolor [antiquewhite2] [r=.933333,g=.87451,b=.8]
+\definecolor [antiquewhite3] [r=.803922,g=.752941,b=.690196]
+\definecolor [antiquewhite4] [r=.545098,g=.513725,b=.470588]
+\definecolor [bisque1] [r=1,g=.894118,b=.768627]
+\definecolor [bisque2] [r=.933333,g=.835294,b=.717647]
+\definecolor [bisque3] [r=.803922,g=.717647,b=.619608]
+\definecolor [bisque4] [r=.545098,g=.490196,b=.419608]
+\definecolor [peachpuff1] [r=1,g=.854902,b=.72549]
+\definecolor [peachpuff2] [r=.933333,g=.796078,b=.678431]
+\definecolor [peachpuff3] [r=.803922,g=.686275,b=.584314]
+\definecolor [peachpuff4] [r=.545098,g=.466667,b=.396078]
+\definecolor [navajowhite1] [r=1,g=.870588,b=.678431]
+\definecolor [navajowhite2] [r=.933333,g=.811765,b=.631373]
+\definecolor [navajowhite3] [r=.803922,g=.701961,b=.545098]
+\definecolor [navajowhite4] [r=.545098,g=.47451,b=.368627]
+\definecolor [lemonchiffon1] [r=1,g=.980392,b=.803922]
+\definecolor [lemonchiffon2] [r=.933333,g=.913725,b=.74902]
+\definecolor [lemonchiffon3] [r=.803922,g=.788235,b=.647059]
+\definecolor [lemonchiffon4] [r=.545098,g=.537255,b=.439216]
+\definecolor [cornsilk1] [r=1,g=.972549,b=.862745]
+\definecolor [cornsilk2] [r=.933333,g=.909804,b=.803922]
+\definecolor [cornsilk3] [r=.803922,g=.784314,b=.694118]
+\definecolor [cornsilk4] [r=.545098,g=.533333,b=.470588]
+\definecolor [ivory1] [r=1,g=1,b=.941176]
+\definecolor [ivory2] [r=.933333,g=.933333,b=.878431]
+\definecolor [ivory3] [r=.803922,g=.803922,b=.756863]
+\definecolor [ivory4] [r=.545098,g=.545098,b=.513725]
+\definecolor [honeydew1] [r=.941176,g=1,b=.941176]
+\definecolor [honeydew2] [r=.878431,g=.933333,b=.878431]
+\definecolor [honeydew3] [r=.756863,g=.803922,b=.756863]
+\definecolor [honeydew4] [r=.513725,g=.545098,b=.513725]
+\definecolor [lavenderblush1] [r=1,g=.941176,b=.960784]
+\definecolor [lavenderblush2] [r=.933333,g=.878431,b=.898039]
+\definecolor [lavenderblush3] [r=.803922,g=.756863,b=.772549]
+\definecolor [lavenderblush4] [r=.545098,g=.513725,b=.52549]
+\definecolor [mistyrose1] [r=1,g=.894118,b=.882353]
+\definecolor [mistyrose2] [r=.933333,g=.835294,b=.823529]
+\definecolor [mistyrose3] [r=.803922,g=.717647,b=.709804]
+\definecolor [mistyrose4] [r=.545098,g=.490196,b=.482353]
+\definecolor [azure1] [r=.941176,g=1,b=1]
+\definecolor [azure2] [r=.878431,g=.933333,b=.933333]
+\definecolor [azure3] [r=.756863,g=.803922,b=.803922]
+\definecolor [azure4] [r=.513725,g=.545098,b=.545098]
+\definecolor [slateblue1] [r=.513725,g=.435294,b=1]
+\definecolor [slateblue2] [r=.478431,g=.403922,b=.933333]
+\definecolor [slateblue3] [r=.411765,g=.34902,b=.803922]
+\definecolor [slateblue4] [r=.278431,g=.235294,b=.545098]
+\definecolor [royalblue1] [r=.282353,g=.462745,b=1]
+\definecolor [royalblue2] [r=.262745,g=.431373,b=.933333]
+\definecolor [royalblue3] [r=.227451,g=.372549,b=.803922]
+\definecolor [royalblue4] [r=.152941,g=.25098,b=.545098]
+\definecolor [blue1] [blue]
+\definecolor [blue2] [b=.933333]
+\definecolor [blue3] [b=.803922]
+\definecolor [blue4] [b=.545098]
+\definecolor [dodgerblue1] [r=.117647,g=.564706,b=1]
+\definecolor [dodgerblue2] [r=.109804,g=.52549,b=.933333]
+\definecolor [dodgerblue3] [r=.094118,g=.454902,b=.803922]
+\definecolor [dodgerblue4] [r=.062745,g=.305882,b=.545098]
+\definecolor [steelblue1] [r=.388235,g=.721569,b=1]
+\definecolor [steelblue2] [r=.360784,g=.67451,b=.933333]
+\definecolor [steelblue3] [r=.309804,g=.580392,b=.803922]
+\definecolor [steelblue4] [r=.211765,g=.392157,b=.545098]
+\definecolor [deepskyblue1] [g=.74902,b=1]
+\definecolor [deepskyblue2] [g=.698039,b=.933333]
+\definecolor [deepskyblue3] [g=.603922,b=.803922]
+\definecolor [deepskyblue4] [g=.407843,b=.545098]
+\definecolor [skyblue1] [r=.529412,g=.807843,b=1]
+\definecolor [skyblue2] [r=.494118,g=.752941,b=.933333]
+\definecolor [skyblue3] [r=.423529,g=.65098,b=.803922]
+\definecolor [skyblue4] [r=.290196,g=.439216,b=.545098]
+\definecolor [lightskyblue1] [r=.690196,g=.886275,b=1]
+\definecolor [lightskyblue2] [r=.643137,g=.827451,b=.933333]
+\definecolor [lightskyblue3] [r=.552941,g=.713725,b=.803922]
+\definecolor [lightskyblue4] [r=.376471,g=.482353,b=.545098]
+\definecolor [slategray1] [r=.776471,g=.886275,b=1]
+\definecolor [slategray2] [r=.72549,g=.827451,b=.933333]
+\definecolor [slategray3] [r=.623529,g=.713725,b=.803922]
+\definecolor [slategray4] [r=.423529,g=.482353,b=.545098]
+\definecolor [lightsteelblue1] [r=.792157,g=.882353,b=1]
+\definecolor [lightsteelblue2] [r=.737255,g=.823529,b=.933333]
+\definecolor [lightsteelblue3] [r=.635294,g=.709804,b=.803922]
+\definecolor [lightsteelblue4] [r=.431373,g=.482353,b=.545098]
+\definecolor [lightblue1] [r=.74902,g=.937255,b=1]
+\definecolor [lightblue2] [r=.698039,g=.87451,b=.933333]
+\definecolor [lightblue3] [r=.603922,g=.752941,b=.803922]
+\definecolor [lightblue4] [r=.407843,g=.513725,b=.545098]
+\definecolor [lightcyan1] [r=.878431,g=1,b=1]
+\definecolor [lightcyan2] [r=.819608,g=.933333,b=.933333]
+\definecolor [lightcyan3] [r=.705882,g=.803922,b=.803922]
+\definecolor [lightcyan4] [r=.478431,g=.545098,b=.545098]
+\definecolor [paleturquoise1] [r=.733333,g=1,b=1]
+\definecolor [paleturquoise2] [r=.682353,g=.933333,b=.933333]
+\definecolor [paleturquoise3] [r=.588235,g=.803922,b=.803922]
+\definecolor [paleturquoise4] [r=.4,g=.545098,b=.545098]
+\definecolor [cadetblue1] [r=.596078,g=.960784,b=1]
+\definecolor [cadetblue2] [r=.556863,g=.898039,b=.933333]
+\definecolor [cadetblue3] [r=.478431,g=.772549,b=.803922]
+\definecolor [cadetblue4] [r=.32549,g=.52549,b=.545098]
+\definecolor [turquoise1] [g=.960784,b=1]
+\definecolor [turquoise2] [g=.898039,b=.933333]
+\definecolor [turquoise3] [g=.772549,b=.803922]
+\definecolor [turquoise4] [g=.52549,b=.545098]
+\definecolor [cyan1] [cyan]
+\definecolor [cyan2] [g=.933333,b=.933333]
+\definecolor [cyan3] [g=.803922,b=.803922]
+\definecolor [cyan4] [g=.545098,b=.545098]
+\definecolor [darkslategray1] [r=.592157,g=1,b=1]
+\definecolor [darkslategray2] [r=.552941,g=.933333,b=.933333]
+\definecolor [darkslategray3] [r=.47451,g=.803922,b=.803922]
+\definecolor [darkslategray4] [r=.321569,g=.545098,b=.545098]
+\definecolor [aquamarine1] [r=.498039,g=1,b=.831373]
+\definecolor [aquamarine2] [r=.462745,g=.933333,b=.776471]
+\definecolor [aquamarine3] [r=.4,g=.803922,b=.666667]
+\definecolor [aquamarine4] [r=.270588,g=.545098,b=.454902]
+\definecolor [darkseagreen1] [r=.756863,g=1,b=.756863]
+\definecolor [darkseagreen2] [r=.705882,g=.933333,b=.705882]
+\definecolor [darkseagreen3] [r=.607843,g=.803922,b=.607843]
+\definecolor [darkseagreen4] [r=.411765,g=.545098,b=.411765]
+\definecolor [seagreen1] [r=.329412,g=1,b=.623529]
+\definecolor [seagreen2] [r=.305882,g=.933333,b=.580392]
+\definecolor [seagreen3] [r=.262745,g=.803922,b=.501961]
+\definecolor [seagreen4] [r=.180392,g=.545098,b=.341176]
+\definecolor [palegreen1] [r=.603922,g=1,b=.603922]
+\definecolor [palegreen2] [r=.564706,g=.933333,b=.564706]
+\definecolor [palegreen3] [r=.486275,g=.803922,b=.486275]
+\definecolor [palegreen4] [r=.329412,g=.545098,b=.329412]
+\definecolor [springgreen1] [g=1,b=.498039]
+\definecolor [springgreen2] [g=.933333,b=.462745]
+\definecolor [springgreen3] [g=.803922,b=.4]
+\definecolor [springgreen4] [g=.545098,b=.270588]
+\definecolor [green1] [green]
+\definecolor [green2] [g=.933333]
+\definecolor [green3] [g=.803922]
+\definecolor [green4] [g=.545098]
+\definecolor [chartreuse1] [r=.498039,g=1]
+\definecolor [chartreuse2] [r=.462745,g=.933333]
+\definecolor [chartreuse3] [r=.4,g=.803922]
+\definecolor [chartreuse4] [r=.270588,g=.545098]
+\definecolor [olivedrab1] [r=.752941,g=1,b=.243137]
+\definecolor [olivedrab2] [r=.701961,g=.933333,b=.227451]
+\definecolor [olivedrab3] [r=.603922,g=.803922,b=.196078]
+\definecolor [olivedrab4] [r=.411765,g=.545098,b=.133333]
+\definecolor [darkolivegreen1] [r=.792157,g=1,b=.439216]
+\definecolor [darkolivegreen2] [r=.737255,g=.933333,b=.407843]
+\definecolor [darkolivegreen3] [r=.635294,g=.803922,b=.352941]
+\definecolor [darkolivegreen4] [r=.431373,g=.545098,b=.239216]
+\definecolor [khaki1] [r=1,g=.964706,b=.560784]
+\definecolor [khaki2] [r=.933333,g=.901961,b=.521569]
+\definecolor [khaki3] [r=.803922,g=.776471,b=.45098]
+\definecolor [khaki4] [r=.545098,g=.52549,b=.305882]
+\definecolor [lightgoldenrod1] [r=1,g=.92549,b=.545098]
+\definecolor [lightgoldenrod2] [r=.933333,g=.862745,b=.509804]
+\definecolor [lightgoldenrod3] [r=.803922,g=.745098,b=.439216]
+\definecolor [lightgoldenrod4] [r=.545098,g=.505882,b=.298039]
+\definecolor [lightyellow1] [r=1,g=1,b=.878431]
+\definecolor [lightyellow2] [r=.933333,g=.933333,b=.819608]
+\definecolor [lightyellow3] [r=.803922,g=.803922,b=.705882]
+\definecolor [lightyellow4] [r=.545098,g=.545098,b=.478431]
+\definecolor [yellow1] [yellow]
+\definecolor [yellow2] [r=.933333,g=.933333]
+\definecolor [yellow3] [r=.803922,g=.803922]
+\definecolor [yellow4] [r=.545098,g=.545098]
+\definecolor [gold1] [r=1,g=.843137]
+\definecolor [gold2] [r=.933333,g=.788235]
+\definecolor [gold3] [r=.803922,g=.678431]
+\definecolor [gold4] [r=.545098,g=.458824]
+\definecolor [goldenrod1] [r=1,g=.756863,b=.145098]
+\definecolor [goldenrod2] [r=.933333,g=.705882,b=.133333]
+\definecolor [goldenrod3] [r=.803922,g=.607843,b=.113725]
+\definecolor [goldenrod4] [r=.545098,g=.411765,b=.078431]
+\definecolor [darkgoldenrod1] [r=1,g=.72549,b=.058824]
+\definecolor [darkgoldenrod2] [r=.933333,g=.678431,b=.054902]
+\definecolor [darkgoldenrod3] [r=.803922,g=.584314,b=.047059]
+\definecolor [darkgoldenrod4] [r=.545098,g=.396078,b=.031373]
+\definecolor [rosybrown1] [r=1,g=.756863,b=.756863]
+\definecolor [rosybrown2] [r=.933333,g=.705882,b=.705882]
+\definecolor [rosybrown3] [r=.803922,g=.607843,b=.607843]
+\definecolor [rosybrown4] [r=.545098,g=.411765,b=.411765]
+\definecolor [indianred1] [r=1,g=.415686,b=.415686]
+\definecolor [indianred2] [r=.933333,g=.388235,b=.388235]
+\definecolor [indianred3] [r=.803922,g=.333333,b=.333333]
+\definecolor [indianred4] [r=.545098,g=.227451,b=.227451]
+\definecolor [sienna1] [r=1,g=.509804,b=.278431]
+\definecolor [sienna2] [r=.933333,g=.47451,b=.258824]
+\definecolor [sienna3] [r=.803922,g=.407843,b=.223529]
+\definecolor [sienna4] [r=.545098,g=.278431,b=.14902]
+\definecolor [burlywood1] [r=1,g=.827451,b=.607843]
+\definecolor [burlywood2] [r=.933333,g=.772549,b=.568627]
+\definecolor [burlywood3] [r=.803922,g=.666667,b=.490196]
+\definecolor [burlywood4] [r=.545098,g=.45098,b=.333333]
+\definecolor [wheat1] [r=1,g=.905882,b=.729412]
+\definecolor [wheat2] [r=.933333,g=.847059,b=.682353]
+\definecolor [wheat3] [r=.803922,g=.729412,b=.588235]
+\definecolor [wheat4] [r=.545098,g=.494118,b=.4]
+\definecolor [tan1] [r=1,g=.647059,b=.309804]
+\definecolor [tan2] [r=.933333,g=.603922,b=.286275]
+\definecolor [tan3] [r=.803922,g=.521569,b=.247059]
+\definecolor [tan4] [r=.545098,g=.352941,b=.168627]
+\definecolor [chocolate1] [r=1,g=.498039,b=.141176]
+\definecolor [chocolate2] [r=.933333,g=.462745,b=.129412]
+\definecolor [chocolate3] [r=.803922,g=.4,b=.113725]
+\definecolor [chocolate4] [r=.545098,g=.270588,b=.07451]
+\definecolor [firebrick1] [r=1,g=.188235,b=.188235]
+\definecolor [firebrick2] [r=.933333,g=.172549,b=.172549]
+\definecolor [firebrick3] [r=.803922,g=.14902,b=.14902]
+\definecolor [firebrick4] [r=.545098,g=.101961,b=.101961]
+\definecolor [brown1] [r=1,g=.25098,b=.25098]
+\definecolor [brown2] [r=.933333,g=.231373,b=.231373]
+\definecolor [brown3] [r=.803922,g=.2,b=.2]
+\definecolor [brown4] [r=.545098,g=.137255,b=.137255]
+\definecolor [salmon1] [r=1,g=.54902,b=.411765]
+\definecolor [salmon2] [r=.933333,g=.509804,b=.384314]
+\definecolor [salmon3] [r=.803922,g=.439216,b=.329412]
+\definecolor [salmon4] [r=.545098,g=.298039,b=.223529]
+\definecolor [lightsalmon1] [r=1,g=.627451,b=.478431]
+\definecolor [lightsalmon2] [r=.933333,g=.584314,b=.447059]
+\definecolor [lightsalmon3] [r=.803922,g=.505882,b=.384314]
+\definecolor [lightsalmon4] [r=.545098,g=.341176,b=.258824]
+\definecolor [orange1] [r=1,g=.647059]
+\definecolor [orange2] [r=.933333,g=.603922]
+\definecolor [orange3] [r=.803922,g=.521569]
+\definecolor [orange4] [r=.545098,g=.352941]
+\definecolor [darkorange1] [r=1,g=.498039]
+\definecolor [darkorange2] [r=.933333,g=.462745]
+\definecolor [darkorange3] [r=.803922,g=.4]
+\definecolor [darkorange4] [r=.545098,g=.270588]
+\definecolor [coral1] [r=1,g=.447059,b=.337255]
+\definecolor [coral2] [r=.933333,g=.415686,b=.313725]
+\definecolor [coral3] [r=.803922,g=.356863,b=.270588]
+\definecolor [coral4] [r=.545098,g=.243137,b=.184314]
+\definecolor [tomato1] [r=1,g=.388235,b=.278431]
+\definecolor [tomato2] [r=.933333,g=.360784,b=.258824]
+\definecolor [tomato3] [r=.803922,g=.309804,b=.223529]
+\definecolor [tomato4] [r=.545098,g=.211765,b=.14902]
+\definecolor [orangered1] [r=1,g=.270588]
+\definecolor [orangered2] [r=.933333,g=.25098]
+\definecolor [orangered3] [r=.803922,g=.215686]
+\definecolor [orangered4] [r=.545098,g=.145098]
+\definecolor [red1] [red]
+\definecolor [red2] [r=.933333]
+\definecolor [red3] [r=.803922]
+\definecolor [red4] [r=.545098]
+\definecolor [deeppink1] [r=1,g=.078431,b=.576471]
+\definecolor [deeppink2] [r=.933333,g=.070588,b=.537255]
+\definecolor [deeppink3] [r=.803922,g=.062745,b=.462745]
+\definecolor [deeppink4] [r=.545098,g=.039216,b=.313725]
+\definecolor [hotpink1] [r=1,g=.431373,b=.705882]
+\definecolor [hotpink2] [r=.933333,g=.415686,b=.654902]
+\definecolor [hotpink3] [r=.803922,g=.376471,b=.564706]
+\definecolor [hotpink4] [r=.545098,g=.227451,b=.384314]
+\definecolor [pink1] [r=1,g=.709804,b=.772549]
+\definecolor [pink2] [r=.933333,g=.662745,b=.721569]
+\definecolor [pink3] [r=.803922,g=.568627,b=.619608]
+\definecolor [pink4] [r=.545098,g=.388235,b=.423529]
+\definecolor [lightpink1] [r=1,g=.682353,b=.72549]
+\definecolor [lightpink2] [r=.933333,g=.635294,b=.678431]
+\definecolor [lightpink3] [r=.803922,g=.54902,b=.584314]
+\definecolor [lightpink4] [r=.545098,g=.372549,b=.396078]
+\definecolor [palevioletred1] [r=1,g=.509804,b=.670588]
+\definecolor [palevioletred2] [r=.933333,g=.47451,b=.623529]
+\definecolor [palevioletred3] [r=.803922,g=.407843,b=.537255]
+\definecolor [palevioletred4] [r=.545098,g=.278431,b=.364706]
+\definecolor [maroon1] [r=1,g=.203922,b=.701961]
+\definecolor [maroon2] [r=.933333,g=.188235,b=.654902]
+\definecolor [maroon3] [r=.803922,g=.160784,b=.564706]
+\definecolor [maroon4] [r=.545098,g=.109804,b=.384314]
+\definecolor [violetred1] [r=1,g=.243137,b=.588235]
+\definecolor [violetred2] [r=.933333,g=.227451,b=.54902]
+\definecolor [violetred3] [r=.803922,g=.196078,b=.470588]
+\definecolor [violetred4] [r=.545098,g=.133333,b=.321569]
+\definecolor [magenta1] [magenta]
+\definecolor [magenta2] [r=.933333,b=.933333]
+\definecolor [magenta3] [r=.803922,b=.803922]
+\definecolor [magenta4] [r=.545098,b=.545098]
+\definecolor [orchid1] [r=1,g=.513725,b=.980392]
+\definecolor [orchid2] [r=.933333,g=.478431,b=.913725]
+\definecolor [orchid3] [r=.803922,g=.411765,b=.788235]
+\definecolor [orchid4] [r=.545098,g=.278431,b=.537255]
+\definecolor [plum1] [r=1,g=.733333,b=1]
+\definecolor [plum2] [r=.933333,g=.682353,b=.933333]
+\definecolor [plum3] [r=.803922,g=.588235,b=.803922]
+\definecolor [plum4] [r=.545098,g=.4,b=.545098]
+\definecolor [mediumorchid1] [r=.878431,g=.4,b=1]
+\definecolor [mediumorchid2] [r=.819608,g=.372549,b=.933333]
+\definecolor [mediumorchid3] [r=.705882,g=.321569,b=.803922]
+\definecolor [mediumorchid4] [r=.478431,g=.215686,b=.545098]
+\definecolor [darkorchid1] [r=.74902,g=.243137,b=1]
+\definecolor [darkorchid2] [r=.698039,g=.227451,b=.933333]
+\definecolor [darkorchid3] [r=.603922,g=.196078,b=.803922]
+\definecolor [darkorchid4] [r=.407843,g=.133333,b=.545098]
+\definecolor [purple1] [r=.607843,g=.188235,b=1]
+\definecolor [purple2] [r=.568627,g=.172549,b=.933333]
+\definecolor [purple3] [r=.490196,g=.14902,b=.803922]
+\definecolor [purple4] [r=.333333,g=.101961,b=.545098]
+\definecolor [mediumpurple1] [r=.670588,g=.509804,b=1]
+\definecolor [mediumpurple2] [r=.623529,g=.47451,b=.933333]
+\definecolor [mediumpurple3] [r=.537255,g=.407843,b=.803922]
+\definecolor [mediumpurple4] [r=.364706,g=.278431,b=.545098]
+\definecolor [thistle1] [r=1,g=.882353,b=1]
+\definecolor [thistle2] [r=.933333,g=.823529,b=.933333]
+\definecolor [thistle3] [r=.803922,g=.709804,b=.803922]
+\definecolor [thistle4] [r=.545098,g=.482353,b=.545098]
+\definecolor [gray0] [black]
+\definecolor [gray1] [s=.01]
+\definecolor [gray2] [s=.02]
+\definecolor [gray3] [s=.03]
+\definecolor [gray4] [s=.04]
+\definecolor [gray5] [s=.05]
+\definecolor [gray6] [s=.06]
+\definecolor [gray7] [s=.07]
+\definecolor [gray8] [s=.08]
+\definecolor [gray9] [s=.09]
+\definecolor [gray10] [s=.1]
+\definecolor [gray11] [s=.11]
+\definecolor [gray12] [s=.12]
+\definecolor [gray13] [s=.13]
+\definecolor [gray14] [s=.14]
+\definecolor [gray15] [s=.15]
+\definecolor [gray16] [s=.16]
+\definecolor [gray17] [s=.17]
+\definecolor [gray18] [s=.18]
+\definecolor [gray19] [s=.19]
+\definecolor [gray20] [s=.2]
+\definecolor [gray21] [s=.21]
+\definecolor [gray22] [s=.22]
+\definecolor [gray23] [s=.23]
+\definecolor [gray24] [s=.24]
+\definecolor [gray25] [s=.25]
+\definecolor [gray26] [s=.26]
+\definecolor [gray27] [s=.27]
+\definecolor [gray28] [s=.28]
+\definecolor [gray29] [s=.29]
+\definecolor [gray30] [s=.3]
+\definecolor [gray31] [s=.31]
+\definecolor [gray32] [s=.32]
+\definecolor [gray33] [s=.33]
+\definecolor [gray34] [s=.34]
+\definecolor [gray35] [s=.35]
+\definecolor [gray36] [s=.36]
+\definecolor [gray37] [s=.37]
+\definecolor [gray38] [s=.38]
+\definecolor [gray39] [s=.39]
+\definecolor [gray40] [s=.4]
+\definecolor [gray41] [s=.41]
+\definecolor [gray42] [s=.42]
+\definecolor [gray43] [s=.43]
+\definecolor [gray44] [s=.44]
+\definecolor [gray45] [s=.45]
+\definecolor [gray46] [s=.46]
+\definecolor [gray47] [s=.47]
+\definecolor [gray48] [s=.48]
+\definecolor [gray49] [s=.49]
+\definecolor [gray50] [s=.5]
+\definecolor [gray51] [s=.51]
+\definecolor [gray52] [s=.52]
+\definecolor [gray53] [s=.53]
+\definecolor [gray54] [s=.54]
+\definecolor [gray55] [s=.55]
+\definecolor [gray56] [s=.56]
+\definecolor [gray57] [s=.57]
+\definecolor [gray58] [s=.58]
+\definecolor [gray59] [s=.59]
+\definecolor [gray60] [s=.6]
+\definecolor [gray61] [s=.61]
+\definecolor [gray62] [s=.62]
+\definecolor [gray63] [s=.63]
+\definecolor [gray64] [s=.64]
+\definecolor [gray65] [s=.65]
+\definecolor [gray66] [s=.66]
+\definecolor [gray67] [s=.67]
+\definecolor [gray68] [s=.68]
+\definecolor [gray69] [s=.69]
+\definecolor [gray70] [s=.7]
+\definecolor [gray71] [s=.71]
+\definecolor [gray72] [s=.72]
+\definecolor [gray73] [s=.73]
+\definecolor [gray74] [s=.74]
+\definecolor [gray75] [s=.75]
+\definecolor [gray76] [s=.76]
+\definecolor [gray77] [s=.77]
+\definecolor [gray78] [s=.78]
+\definecolor [gray79] [s=.79]
+\definecolor [gray80] [s=.8]
+\definecolor [gray81] [s=.81]
+\definecolor [gray82] [s=.82]
+\definecolor [gray83] [s=.83]
+\definecolor [gray84] [s=.84]
+\definecolor [gray85] [s=.85]
+\definecolor [gray86] [s=.86]
+\definecolor [gray87] [s=.87]
+\definecolor [gray88] [s=.88]
+\definecolor [gray89] [s=.89]
+\definecolor [gray90] [s=.9]
+\definecolor [gray91] [s=.91]
+\definecolor [gray92] [s=.92]
+\definecolor [gray93] [s=.93]
+\definecolor [gray94] [s=.94]
+\definecolor [gray95] [s=.95]
+\definecolor [gray96] [s=.96]
+\definecolor [gray97] [s=.97]
+\definecolor [gray98] [s=.98]
+\definecolor [gray99] [s=.99]
+\definecolor [gray100] [white]
+\definecolor [darkgray] [s=.662745]
+\definecolor [darkblue] [b=.545098]
+\definecolor [darkcyan] [g=.545098,b=.545098]
+\definecolor [darkmagenta] [r=.545098,b=.545098]
+\definecolor [darkred] [r=.545098]
+\definecolor [lightgreen] [r=.564706,g=.933333,b=.564706]
diff --git a/tex/context/base/colo-ext.mkii b/tex/context/base/colo-ext.mkii
new file mode 100644
index 000000000..473c010e0
--- /dev/null
+++ b/tex/context/base/colo-ext.mkii
@@ -0,0 +1,59 @@
+%D \module
+%D [ file=colo-ext, % mostof thsi code used to be in colo-ini.tex
+%D version=1997.04.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Extras,
+%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 Color Macros / Extras}
+
+\unprotect
+
+%D \macros
+%D {negatecolorcomponent, negativecolorbox}
+%D
+%D Sometimes, especially when we deal with typesetting
+%D devices, we want to reverse the color scheme. Instead of
+%D recalculating all those colors, we use a quick and dirty
+%D approach:
+%D
+%D \starttyping
+%D \negativecolorbox0
+%D \stoptyping
+%D
+%D will negate the colors in box zero.
+
+\def\negatecolorbox#1%
+ {\setbox#1\hbox
+ {\dostartnegative
+ \localstartcolor[white]\vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1\localstopcolor
+ \hskip-\wd#1%
+ \box#1%
+ \dostopnegative}}
+
+%D There are in principle two ways to handle overprint: bound to colors
+%D or independent. For the moment we only support independent overprint
+%D handling. Here we deal with a per-document setting.
+
+\setupcolors
+ [\c!intent=\v!none]
+
+\def\starttextoverprint
+ {\doifelse\@@clintent\v!overprint
+ {\glet\stoptextoverprint \dostopoverprint
+ \glet\starttextoverprint\dostartoverprint
+ \dostartoverprint}
+ {\glet\stoptextoverprint\donothing}}
+
+\let\stoptextoverprint\donothing
+
+\appendtoks \starttextoverprint \to \everystarttextproperties
+\appendtoks \stoptextoverprint \to \everystoptextproperties
+
+\protect \endinput
diff --git a/tex/context/base/colo-ext.mkiv b/tex/context/base/colo-ext.mkiv
new file mode 100644
index 000000000..b17608f59
--- /dev/null
+++ b/tex/context/base/colo-ext.mkiv
@@ -0,0 +1,103 @@
+%D \module
+%D [ file=colo-ext, % mostof thsi code used to be in colo-ini.tex
+%D version=1997.04.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Extras,
+%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 Color Macros / Extras}
+
+\unprotect
+
+%D \macros
+%D {negatecolorcomponent, negativecolorbox}
+%D
+%D Sometimes, especially when we deal with typesetting
+%D devices, we want to reverse the color scheme. Instead of
+%D recalculating all those colors, we use a quick and dirty
+%D approach:
+%D
+%D \starttyping
+%D \negativecolorbox0
+%D \stoptyping
+%D
+%D will negate the colors in box zero.
+
+\def\negatecolorbox#1%
+ {\setbox#1\hbox
+ {\startnegativeproperty % might change
+ \startcolor[white]\vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1\stopcolor
+ \hskip-\wd#1%
+ \box#1%
+ \stopnegativeproperty}}
+
+%D There are in principle two ways to handle overprint: bound to colors
+%D or independent. For the moment we only support independent overprint
+%D handling. Here we deal with a per-document setting.
+
+\unexpanded\def\startcolorintent[#1]%
+ {\pushattribute\colorintentattribute
+ \dotriggercolorintent{#1}}
+
+\unexpanded\def\stopcolorintent
+ {\popattribute\colorintentattribute}
+
+\unexpanded\def\startoverprint{\startcolorintent[\v!overprint]}
+\unexpanded\def\stopoverprint {\stopcolorintent}
+
+\unexpanded\def\startknockout {\startcolorintent[\v!knockout ]}
+\unexpanded\def\stopknockout {\stopcolorintent}
+
+\let\starttextcolorintent\relax
+\let\stoptextcolorintent \relax
+
+\setupcolors
+ [\c!overprint=\v!no]
+
+\appendtoks
+ \dosettextcolorintent
+\to \everysetupcolors
+
+\def\dosettextcolorintent
+ {\doifnot\@@clintent\v!none
+ {\xdef\starttextcolorintent{\noexpand\dotriggercolorintent{\@@clintent}}%
+ \glet\dosettextcolorintent\relax
+ \dotriggercolorintent\@@clintent}}
+
+\appendtoks \starttextcolorintent \to \everystarttextproperties
+\appendtoks \stoptextcolorintent \to \everystoptextproperties
+
+\setupcolors[\c!intent=\v!none]
+
+% A goodie that replaces the startMPcolor hackery
+%
+% \definecolor[red-t] [r=1,t=0.5,a=1]
+% \definecolor[green-t][g=1,t=0.5,a=1]
+% \defineintermediatecolor[mycolora][0.5,red,green]
+% \defineintermediatecolor[mycolorb][0.5,red-t,green-t]
+% \starttext
+% test {\mycolora OEPS} test
+% test {\mycolorb OEPS} test
+% \stoptext
+
+\unexpanded\def\defineintermediatecolor
+ {\dotripleempty\dodefineintermediatecolor}
+
+\def\dodefineintermediatecolor[#1][#2][#3]% \dotripleempty adds {} inside []
+ {\dododefineintermediatecolor[#1][#2][#3]}
+
+\def\dododefineintermediatecolor[#1][#2,#3,#4][#5]%
+ {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
+ \ctxlua{colors.defineintermediatecolor("#1","#2",
+ \thecolorattribute{#3},\thecolorattribute{#4},
+ \thetransparencyattribute{#3},\thetransparencyattribute{#4},
+ "#5",false,\iffreezecolors true\else false\fi)}% not global
+ \dodefinecolorcommand\setvalue{#1}}
+
+\protect \endinput
diff --git a/tex/context/base/colo-hex.mkii b/tex/context/base/colo-hex.mkii
new file mode 100644
index 000000000..db67f1841
--- /dev/null
+++ b/tex/context/base/colo-hex.mkii
@@ -0,0 +1,125 @@
+%D \module
+%D [ file=colo-hex,
+%D version=2004.06.23,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Hex Colors,
+%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.
+
+\ifdefined \hexcolorprefix
+ \expandafter \endinput
+\fi
+
+\writestatus{loading}{ConTeXt Color Macros / Hexadecimal}
+
+% \edef\testcolor{\string#FFC0C0}
+% \edef\testcolor{\string#55}
+%
+% \setupcolors[state=start]
+%
+% \expanded{\definecolor[thehexcolor][\hexcolorspec\testcolor]}
+%
+% \checkhexcolor[\testcolor]
+%
+% \definecolor[thehexcolor][\testcolor]
+%
+% \starttext
+%
+% test \color[thehexcolor]{rood}
+% test \color[red]{rood}
+% test \color[\testcolor]{rood}
+%
+% \stoptext
+
+\unprotect
+
+% \definecolor[rgbtestcolor] [r=0.87843,g=0.87451,b=0.89020] % RGB(224,223,227)
+% \definecolor[hextestcolor] [h=E0DFE3]
+%
+% \startMPpage
+% path p ; % example by Peter Rolf
+% p := unitsquare xyscaled(5cm,5cm) ;
+% fill (point 0 of p -- point 1 of p -- point 2 of p --cycle) withcolor \MPcolor{rgbtestcolor} ; % bottom right part of the square
+% fill (point 0 of p -- point 3 of p -- point 2 of p --cycle) withcolor \MPcolor{hextestcolor} ; % top left part
+% \stopMPpage
+
+\newdimen\hexcolorfraction \hexcolorfraction=\dimexpr1pt/255\relax
+
+\chardef\hexcolorprefix=`#
+
+\def\hexcolorspec #1{\expandafter\dohexcolorspec #1\empty\empty\empty\empty\relax}
+\def\hexcolorpattern#1{\expandafter\dohexcolorpattern#1\empty\empty\empty\empty\relax}
+
+\ifx\dohexstringtonumber\undefined \def\dohexstringtonumber{"} \fi
+
+\def\hexcolorcomponent#1#2%
+ {\ifnum\dohexstringtonumber#1#2=\zerocount0\else\ifnum\dohexstringtonumber#1#2=\plusone1\else
+ \expandafter\withoutpt\the\dimexpr\dohexstringtonumber#1#2\hexcolorfraction\relax
+ \fi\fi}
+
+\def\dohexcolorspec#1#2#3#4#5#6#7#8\relax
+ {\ifx#4\empty
+ s=\hexcolorcomponent#2#3%
+ \else
+ r=\hexcolorcomponent#2#3,g=\hexcolorcomponent#4#5,b=\hexcolorcomponent#6#7%
+ \fi}
+
+\def\dohexcolorpattern#1#2#3#4#5#6#7#8\relax
+ {0\ifx#4\empty
+ S:\hexcolorcomponent#2#3%
+ \else
+ R:\hexcolorcomponent#2#3:\hexcolorcomponent#4#5:\hexcolorcomponent#6#7%
+ \fi:0:0}
+
+\def\doifhexcolorelse#1%
+ {\expandafter\dodoifhexcolorelse#10\od} % 0 is a dirty trick to catch an empty #1
+
+\def\dodoifhexcolorelse#1#2\od
+ {\ifnum`#1=\hexcolorprefix
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\docheckhexcolor#1%
+ {\doifhexcolorelse{#1}{\doifundefined{#1}{\setxvalue{\??cr#1}{\hexcolorpattern{#1}}}}\donothing}
+
+\def\checkhexcolor[#1]%
+ {\expanded{\docheckhexcolor{#1}}}
+
+\def\colorHpattern{\@EA\hexcolorpattern\@EA{\@EA*\@@cl@@h}} % * == dummy placeholder
+
+\let\dodododefinecolor\dododefinecolor % we will overload this one
+
+\def\dododefinecolor#1#2#3#4[#5][#6]%
+ {\doifhexcolorelse{#6}
+ {\setxvalue{\??cr#5}{\hexcolorpattern{#6}}}
+ {\dodododefinecolor#1#2#3#4[#5][#6]}}
+
+%D For Adam Lindsay and his XeTeX special driver:
+
+% because we intercept the zero condition, the .23pt in 1.23pt will disappear in the
+% ifcase zero part branch
+
+\def\colorhexcomponent#1%
+ {\ifdim#1\points<.005\points
+ 00\else\lchexnumbers{\the\dimexpr255\dimexpr#1\points\relax+.5\points\relax}%
+ \fi}
+
+% the faster one
+
+\newdimen\hex@color@a \hex@color@a=.005pt
+\newdimen\hex@color@b \hex@color@b=.5pt
+\chardef \hex@color@c =255
+
+\def\colorhexcomponent#1%
+ {\ifdim#1\points<\hex@color@a
+ 00\else\lchexnumbers{\the\dimexpr#1\points*\hex@color@c+\hex@color@b\relax}%
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/colo-hex.mkiv b/tex/context/base/colo-hex.mkiv
new file mode 100644
index 000000000..f661b2445
--- /dev/null
+++ b/tex/context/base/colo-hex.mkiv
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=colo-hex,
+%D version=2004.06.23,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Hex Colors,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is built in.
+
+% \definecolor[rgbtestcolor] [r=0.87843,g=0.87451,b=0.89020] % RGB(224,223,227)
+% \definecolor[hextestcolor] [\letterhash E0DFE3] % or [h=E0DFE3]
+%
+% \startMPpage
+% path p ; % example by Peter Rolf
+% p := unitsquare xyscaled(5cm,5cm) ;
+% fill (point 0 of p -- point 1 of p -- point 2 of p --cycle) withcolor \MPcolor{rgbtestcolor} ; % bottom right part of the square
+% fill (point 0 of p -- point 3 of p -- point 2 of p --cycle) withcolor \MPcolor{hextestcolor} ; % top left part
+% \stopMPpage
+
+\def\checkhexcolor[#1]{\doifcolorelse{#1}\donothing{\definecolor[#1][x=#1]}} % is this ok?
+
+\endinput
diff --git a/tex/context/base/colo-hex.tex b/tex/context/base/colo-hex.tex
new file mode 100644
index 000000000..7d223c131
--- /dev/null
+++ b/tex/context/base/colo-hex.tex
@@ -0,0 +1,3 @@
+% this is just a stub
+
+\loadmarkfile{colo-hex}
diff --git a/tex/context/base/colo-ini.lua b/tex/context/base/colo-ini.lua
new file mode 100644
index 000000000..342d6110d
--- /dev/null
+++ b/tex/context/base/colo-ini.lua
@@ -0,0 +1,480 @@
+if not modules then modules = { } end modules ['colo-ini'] = {
+ version = 1.000,
+ comment = "companion to colo-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type = type
+local concat = table.concat
+local format, gmatch, gsub, lower, match, find = string.format, string.gmatch, string.gsub, string.lower, string.match, string.find
+local texsprint = tex.sprint
+local ctxcatcodes = tex.ctxcatcodes
+
+local trace_define = false trackers.register("colors.define",function(v) trace_define = v end)
+
+local settings_to_hash_strict = aux.settings_to_hash_strict
+
+colors = colors or { }
+transparencies = transparencies or { }
+
+local registrations = backends.registrations
+
+local a_color = attributes.private('color')
+local a_transparency = attributes.private('transparency')
+local a_colorspace = attributes.private('colormodel')
+local a_background = attributes.private('background')
+
+local register_color = colors.register
+local attributes_list = attributes.list
+
+local function definecolor(name, ca, global)
+ if ca and ca > 0 then
+ if global then
+ if trace_define then
+ commands.writestatus("color","define global color '%s' with attribute: %s",name,ca)
+ end
+ context.colordefagc(name,ca)
+ else
+ if trace_define then
+ commands.writestatus("color","define local color '%s' with attribute: %s",name,ca)
+ end
+ context.colordefalc(name,ca)
+ end
+ else
+ if global then
+ context.colordefrgc(name)
+ else
+ context.colordefrlc(name)
+ end
+ end
+end
+
+local function inheritcolor(name, ca, global)
+ if ca and ca ~= "" then
+ if global then
+ if trace_define then
+ commands.writestatus("color","inherit global color '%s' with attribute: %s",name,ca)
+ end
+ context.colordeffgc(name,ca)
+ else
+ if trace_define then
+ commands.writestatus("color","inherit local color '%s' with attribute: %s",name,ca)
+ end
+ context.colordefflc(name,ca)
+ end
+ else
+ if global then
+ context.colordefrgc(name)
+ else
+ context.colordefrlc(name)
+ end
+ end
+end
+
+local function definetransparent(name, ta, global)
+ if ta and ta > 0 then
+ if global then
+ if trace_define then
+ commands.writestatus("color","define global transparency '%s' with attribute: %s",name,ta)
+ end
+ context.colordefagt(name,ta)
+ else
+ if trace_define then
+ commands.writestatus("color","define local transparency '%s' with attribute: %s",name,ta)
+ end
+ context.colordefalt(name,ta)
+ end
+ else
+ if global then
+ context.colordefrgt(name)
+ else
+ context.colordefrlt(name)
+ end
+ end
+end
+
+local function inherittransparent(name, ta, global)
+ if ta and ta ~= "" then
+ if global then
+ if trace_define then
+ commands.writestatus("color","inherit global transparency '%s' with attribute: %s",name,ta)
+ end
+ context.colordeffgt(name,ta)
+ else
+ if trace_define then
+ commands.writestatus("color","inherit local transparency '%s' with attribute: %s",name,ta)
+ end
+ context.colordefflt(name,ta)
+ end
+ else
+ if global then
+ context.colordefrgt(name)
+ else
+ context.colordefrlt(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.)
+
+colors.couple = true
+
+function colors.definetransparency(name,n)
+ transparent[name] = n
+end
+
+local registered = { }
+
+local function do_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 e and e ~= "" then
+ registrations.spotcolorname(parent,e) -- before registration of the color
+ end
+ if kind == 2 then -- name noffractions names p's r g b
+ registrations.grayspotcolor(parent,f,d,p,v[2])
+ elseif kind == 3 then
+ registrations.rgbspotcolor (parent,f,d,p,v[3],v[4],v[5])
+ elseif kind == 4 then
+ registrations.cmykspotcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
+ end
+ end
+ registered[parentnumber] = true
+ end
+end
+
+local function do_registermultitonecolor(parent,name,parentnumber,e,f,d,p) -- same as spot but different template
+ if not registered[parentnumber] then
+ local v = colors.values[parentnumber]
+ if v then
+ local kind = colors.default -- else problems with shading etc
+ if kind == 1 then kind = v[1] end
+ if kind == 2 then
+ registrations.grayindexcolor(parent,f,d,p,v[2])
+ elseif kind == 3 then
+ registrations.rgbindexcolor (parent,f,d,p,v[3],v[4],v[5])
+ elseif kind == 4 then
+ registrations.cmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
+ end
+ end
+ registered[parentnumber] = true
+ end
+end
+
+function colors.definesimplegray(name,s)
+ return register_color(name,'gray',s) -- we still need to get rid of 'color'
+end
+
+function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent
+ local x = match(str,"^#(.+)$") -- for old times sake (if we need to feed from xml or so)
+ if x then
+ local r, g, b = match(x .. "000000","(..)(..)(..)") -- watch the 255
+ definecolor(name, register_color(name,'rgb',(tonumber(r,16) or 0)/255,(tonumber(g,16) or 0)/255,(tonumber(b,16) or 0)/255), global)
+ else
+ local settings = settings_to_hash_strict(str)
+ if settings then
+ local r, g, b = settings.r, settings.g, settings.b
+ if r or g or b then
+ definecolor(name, register_color(name,'rgb', tonumber(r) or 0, tonumber(g) or 0, tonumber(b) or 0), global)
+ else
+ local c, m, y, k = settings.c, settings.m, settings.y, settings.k
+ if c or m or y or b then
+ definecolor(name, register_color(name,'cmyk',tonumber(c) or 0, tonumber(m) or 0, tonumber(y) or 0, tonumber(k) or 0), global)
+ else
+ local h, s, v = settings.h, settings.s, settings.v
+ if v then
+ r, g, b = colors.hsvtorgb(tonumber(h) or 0, tonumber(s) or 1, tonumber(v) or 1) -- maybe later native
+ definecolor(name, register_color(name,'rgb',r,g,b), global)
+ else
+ local x = settings.x or h
+ if x then
+ r, g, b = match(x .. "000000","(..)(..)(..)") -- watch the 255
+ definecolor(name, register_color(name,'rgb',(tonumber(r,16) or 0)/255,(tonumber(g,16) or 0)/255,(tonumber(b,16) or 0)/255), global)
+ else
+ definecolor(name, register_color(name,'gray',tonumber(s) or 0), global)
+ end
+ end
+ end
+ end
+ local a, t = settings.a, settings.t
+ if a and t then
+ definetransparent(name, transparencies.register(name,transparent[a] or tonumber(a) or 1,tonumber(t) or 1), global)
+ elseif colors.couple then
+ -- definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
+ definetransparent(name, 0, global) -- can be sped up
+ end
+ elseif freeze then
+ local ca = attributes_list[a_color] [str]
+ local ta = attributes_list[a_transparency][str]
+ if ca then
+ definecolor(name, ca, global)
+ end
+ if ta then
+ definetransparent(name, ta, global)
+ end
+ else
+ inheritcolor(name, str, global)
+ inherittransparent(name, str, global)
+ -- if global and str ~= "" then -- For Peter Rolf who wants access to the numbers in Lua. (Currently only global is supported.)
+ -- attributes_list[a_color] [name] = attributes_list[a_color] [str] or attributes.unsetvalue -- reset
+ -- attributes_list[a_transparency][name] = attributes_list[a_transparency][str] or attributes.unsetvalue
+ -- end
+ end
+ end
+end
+
+function colors.isblack(ca) -- maybe commands
+ local cv = ca > 0 and colors.value(ca)
+ return (cv and cv[2] == 0) or false
+end
+
+function colors.definespotcolor(name,parent,str,global)
+ if parent == "" or find(parent,"=") then
+ colors.registerspotcolor(name, parent)
+ elseif name ~= parent then
+ local cp = attributes_list[a_color][parent]
+ if cp then
+ local t = settings_to_hash_strict(str)
+ if t then
+ local tp = tonumber(t.p) or 1
+ do_registerspotcolor(parent, name, cp, t.e, 1, "", tp) -- p not really needed, only diagnostics
+ if name and name ~= "" then
+ definecolor(name, register_color(name,'spot', parent, 1, "", tp), true)
+ local ta, tt = t.a, t.t
+ if ta and tt then
+ definetransparent(name, transparencies.register(name,transparent[ta] or tonumber(ta) or 1,tonumber(tt) or 1), global)
+ elseif colors.couple then
+ --~ definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
+ definetransparent(name, 0, global) -- can be sped up
+ end
+ end
+ end
+ end
+ end
+end
+
+function colors.registerspotcolor(parent, str)
+ local cp = attributes_list[a_color][parent]
+ if cp then
+ local e = ""
+ if str then
+ local t = settings_to_hash_strict(str)
+ e = (t and t.e) or ""
+ end
+ do_registerspotcolor(parent, "dummy", cp, e, 1, "", 1) -- p not really needed, only diagnostics
+ end
+end
+
+function colors.definemultitonecolor(name,multispec,colorspec,selfspec)
+ local dd, pp, nn = { }, { }, { }
+ for k,v in gmatch(multispec,"(%a+)=([^%,]*)") do
+ dd[#dd+1] = k
+ pp[#pp+1] = v
+ nn[#nn+1] = k
+ nn[#nn+1] = format("%1.3g",tonumber(v) or 0) -- 0 can't happen
+ end
+--~ v = tonumber(v) * p
+ local nof = #dd
+ if nof > 0 then
+ dd, pp, nn = concat(dd,','), concat(pp,','), concat(nn,'_')
+ local parent = gsub(lower(nn),"[^%d%a%.]+","_")
+ colors.defineprocesscolor(parent,colorspec..","..selfspec,true,true)
+ local cp = attributes_list[a_color][parent]
+ if cp then
+ do_registerspotcolor(parent, name, cp, "", nof, dd, pp)
+ do_registermultitonecolor(parent, name, cp, "", nof, dd, pp)
+ definecolor(name, register_color(name, 'spot', parent, nof, dd, pp), true)
+ local t = settings_to_hash_strict(selfspec)
+ if t and t.a and t.t then
+ definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
+ elseif colors.couple then
+ -- definetransparent(name, transparencies.register(nil, 1, 1), global) -- can be sped up
+ definetransparent(name, 0, global) -- can be sped up
+ end
+ end
+ end
+end
+
+function colors.mp(model,ca,ta,default)
+ local cv = colors.value(ca) -- faster when direct colors.values[ca]
+ if cv then
+ local tv = transparencies.value(ta)
+ 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 colors.formatcolor(ca,separator)
+ local cv = colors.value(ca)
+ if cv then
+ local c, f, t, model = { }, 13, 13, cv[1]
+ if model == 2 then
+ f, t = 2, 2
+ elseif model == 3 then
+ f, t = 3, 5
+ elseif model == 4 then
+ f, t = 6, 9
+ end
+ for i=f,t do
+ c[#c+1] = format("%0.3f",cv[i])
+ end
+ return concat(c,separator)
+ else
+ return format("%0.3f",0)
+ end
+end
+
+function colors.formatgray(ca,separator)
+ local cv = colors.value(ca)
+ return format("%0.3f",(cv and cv[2]) or 0)
+end
+
+function colors.colorcomponents(ca) -- return list
+ 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 colors.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 colors.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 colors.spotcolorparent(ca,default)
+ local cv, v = colors.value(ca), "unknown"
+ if cv and cv[1] == 5 then
+ v = cv[12]
+ if v == "" then
+ v = cv[10]
+ end
+ end
+ return tostring(v)
+end
+
+function colors.spotcolorvalue(ca,default)
+ local cv, v = colors.value(ca), 0
+ if cv and cv[1] == 5 then
+ v = cv[13]
+ end
+ return tostring(v)
+end
+
+-- experiment (a bit of a hack, as we need to get the attribute number)
+
+local min = math.min
+
+-- a[b,c] -> b+a*(c-b)
+
+local function f(one,two,i,fraction)
+ local o, t = one[i], two[i]
+ local otf = o + fraction * (t - o)
+ if otf > 1 then
+ otf = 1
+ end
+ return otf
+end
+
+function colors.defineintermediatecolor(name,fraction,c_one,c_two,a_one,a_two,specs,global,freeze)
+ fraction = tonumber(fraction) or 1
+ local one, two = colors.value(c_one), colors.value(c_two)
+ if one and two then
+ local csone, cstwo = one[1], two[1]
+ if csone == cstwo then
+ -- actually we can set all 8 values at once here but this is cleaner as we avoid
+ -- problems with weighted gray conversions and work with original values
+ local ca
+ if csone == 2 then
+ ca = register_color(name,'gray',f(one,two,2,fraction))
+ elseif csone == 3 then
+ ca = register_color(name,'rgb',f(one,two,3,fraction),f(one,two,4,fraction),f(one,two,5,fraction))
+ elseif csone == 4 then
+ ca = register_color(name,'cmyk',f(one,two,6,fraction),f(one,two,7,fraction),f(one,two,8,fraction),f(one,two,9,fraction))
+ else
+ ca = register_color(name,'gray',f(one,two,2,fraction))
+ end
+ definecolor(name,ca,global,freeze)
+ end
+ end
+ local one, two = transparencies.value(a_one), transparencies.value(a_two)
+ local t = settings_to_hash_strict(specs)
+ local ta = tonumber((t and t.a) or (one and one[1]) or (two and two[1]))
+ local tt = tonumber((t and t.t) or (one and two and f(one,two,2,fraction)))
+ if ta and tt then
+--~ print(ta,tt)
+ definetransparent(name,transparencies.register(name,ta,tt),global)
+ end
+end
diff --git a/tex/context/base/colo-ini.mkii b/tex/context/base/colo-ini.mkii
new file mode 100644
index 000000000..2d2a7bdaa
--- /dev/null
+++ b/tex/context/base/colo-ini.mkii
@@ -0,0 +1,2776 @@
+%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.
+
+\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 \ifproductionrun\showmessage\m!colors {9}\v!rgb \fi\RGBsupportedfalse \fi}
+ {\ifRGBsupported \else\ifproductionrun\showmessage\m!colors{10}\v!rgb \fi\RGBsupportedtrue \fi}%
+ \doifelse\@@clcmyk\v!no
+ {\ifCMYKsupported \ifproductionrun\showmessage\m!colors {9}\v!cmyk \fi\CMYKsupportedfalse\fi}
+ {\ifCMYKsupported\else\ifproductionrun\showmessage\m!colors{10}\v!cmyk \fi\CMYKsupportedtrue \fi}%
+ \doifelse\@@clmpcmyk\v!no
+ {\ifMPcmykcolors \ifproductionrun\showmessage\m!colors {9}{\v!mp\v!cmyk}\fi\MPcmykcolorsfalse \fi}
+ {\ifMPcmykcolors \else\ifproductionrun\showmessage\m!colors{10}{\v!mp\v!cmyk}\fi\MPcmykcolorstrue \fi}%
+ \doifelse\@@clmpspot\v!no
+ {\ifMPspotcolors \ifproductionrun\showmessage\m!colors {9}{\v!mp\v!spot}\fi\MPspotcolorsfalse \fi}
+ {\ifMPspotcolors \else\ifproductionrun\showmessage\m!colors{10}{\v!mp\v!spot}\fi\MPspotcolorstrue \fi}%
+ \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]{\definespotcolor[#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!
+
+\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 define the low level macros:
+
+\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}
+
+\let\colorlist\empty % not really used, only for colo-run
+\setfalse\collectcolorsinlist
+\def\collectcolorinlist#1{\doglobal\addtocommalist{#1}\colorlist}
+
+\def\dododefinecolor#1#2#3#4[#5][#6]% #2==set(g)value #3==set[e|x]value
+ {\ifconditional\collectcolorsinlist\collectcolorinlist{#5}\fi
+ \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
+ \ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
+ \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
+ \ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
+ \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
+
+%D \macros
+%D {forcecolorhack}
+%D
+%D Awful \unknown
+
+\let\forcecolorhack\relax
+
+%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-ini.mkiv b/tex/context/base/colo-ini.mkiv
new file mode 100644
index 000000000..1bceb5aa7
--- /dev/null
+++ b/tex/context/base/colo-ini.mkiv
@@ -0,0 +1,1091 @@
+%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.
+
+\registerctxluafile{colo-ini}{1.000}
+\registerctxluafile{lpdf-col}{1.000}
+
+\unprotect
+
+%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).
+
+\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\ifconvertGRAY \convertGRAYtrue
+\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
+
+\let\colorlist \empty
+\let\currentspotcolor \empty
+\let\allspotcolors \empty
+\let\usedspotcolors \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
+
+\unexpanded\def\definecolor {\dodoubleargument\dodefinecolor}
+\unexpanded\def\defineglobalcolor {\dodoubleargument\dodefineglobalcolor}
+\unexpanded\def\definenamedcolor {\dodoubleargument\dodefinenamedcolor}
+\unexpanded\def\definespotcolor {\dotripleargument\dodefinespotcolor}
+\unexpanded\def\definemultitonecolor{\doquadrupleempty\dodefinemultitonecolor}
+
+%D \macros
+%D {startcolor,stopcolor,
+%D faststartcolor,faststopcolor,
+%D startraster,stopraster,raster,
+%D color,graycolor}
+%D
+%D The local and global and raster commands are here just
+%D for compatibility with \MKII.
+%D
+%D \showsetup{startcolor}
+%D
+%D \macros
+%D {color,graycolor}
+%D
+%D This leaves the simple color command:
+%D
+%D \showsetup{color}
+%D \showsetup{graycolor}
+%D
+%D This leaves the simple color command:
+%D
+%D \showsetup{color}
+%D \showsetup{graycolor}
+
+ \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{\dosetcolormodel{gray}\getvalue{#1}}{}}
+\unexpanded\def\colored [#1]{\groupedcommand{\definecolor[@colored@][#1]\doactivatecolor{@colored@}}{}}
+\unexpanded\def\fastcolored [#1]#2{\begingroup\dodefinefastcolor[@colored@][#1]\doactivatecolor{@colored@}#2\endgroup}
+ \def\predefinecolor [#1]{\flushatshipout{\hbox{\color[#1]{}}}}
+ \def\predefineindexcolor[#1]{\flushatshipout{\hbox{\color[#1]{}}}}
+ \unexpanded\def\startcolorpage {\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}
+ \unexpanded\def\stopcolorpage {\stopcolor}
+ \unexpanded\def\startraster [#1]{\dosetrastercolor{#1}}
+ \unexpanded\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}
+
+\let\grey\graycolor
+
+%D Stacking:
+
+% \colormodelattribute \colorattribute \transparencyattribute
+
+\newcount\currentcolornesting
+
+\unexpanded\def\pushcolor[#1]%
+ {\global\advance\currentcolornesting\plusone
+ \expandafter\edef\csname\??cl:s:\number\currentcolornesting\endcsname
+ {\attribute\colormodelattribute \the\attribute\colormodelattribute
+ \attribute\colorattribute \the\attribute\colorattribute
+ \attribute\transparencyattribute\the\attribute\transparencyattribute
+ \space}% stack
+ \doactivatecolor{#1}}
+
+\unexpanded\def\popcolor
+ {\csname\??cl:s:\number\currentcolornesting\endcsname
+ \global\advance\currentcolornesting\minusone}
+
+%D \macros
+%D {startcurrentcolor,stopcurrentcolor}
+
+\unexpanded\def\startcurrentcolor{\startcolor[\outercolorname]}
+\unexpanded\def\stopcurrentcolor {\stopcolor}
+
+%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
+
+\unexpanded\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
+ {\showcolormessage\m!colors4\colorstyle}
+ {\showcolormessage\m!colors5\colorstyle}%
+ \stopreadingfile}
+
+\let\usecolors\setupcolor
+
+% check: \startcolormode
+
+%D \macros
+%D {definetransparency}
+%D
+%D This command numbers to names:
+
+\unexpanded\def\definetransparency
+ {\dodoubleargument\dodefinetransparency}
+
+\unexpanded\def\setupcolors
+ {\dosingleargument\dosetupcolors}
+
+\let\showcolormessage\gobblethreearguments
+
+\newtoks\everysetupcolors
+
+\def\dosetupcolors[#1]% some no longer make sense in MkIV
+ {\getparameters[\??cl][#1]%
+ \doifelse\@@clspot\v!yes
+ \SPOTsupportedtrue
+ \SPOTsupportedfalse
+ \doifelse\@@clreduction\v!yes
+ \reduceCMYKtrue
+ \reduceCMYKfalse
+ \doifelse\@@clexpansion\v!yes
+ \freezecolorstrue
+ \freezecolorsfalse
+ \doifelse\@@clfactor\v!no
+ \weightGRAYfalse
+ \weightGRAYtrue
+ \doifelse\@@clrgb\v!no
+ {\ifRGBsupported \showcolormessage\m!colors {9}\v!rgb \RGBsupportedfalse \fi}
+ {\ifRGBsupported \else\showcolormessage\m!colors{10}\v!rgb \RGBsupportedtrue \fi}%
+ \doifelse\@@clcmyk\v!no
+ {\ifCMYKsupported \showcolormessage\m!colors {9}\v!cmyk \CMYKsupportedfalse\fi}
+ {\ifCMYKsupported\else\showcolormessage\m!colors{10}\v!cmyk \CMYKsupportedtrue \fi}%
+ \doifelse\@@clmpcmyk\v!no
+ {\ifMPcmykcolors \showcolormessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykcolorsfalse \fi}
+ {\ifMPcmykcolors \else\showcolormessage\m!colors{10}{\v!mp\v!cmyk}\MPcmykcolorstrue \fi}%
+ \doifelse\@@clmpspot\v!no
+ {\ifMPspotcolors \showcolormessage\m!colors {9}{\v!mp\v!spot}\MPspotcolorsfalse \fi}
+ {\ifMPspotcolors \else\showcolormessage\m!colors{10}{\v!mp\v!spot}\MPspotcolorstrue \fi}%
+ \preferGRAYfalse
+ \convertGRAYtrue
+ \processaction
+ [\@@clconversion]
+ [ \v!yes=>\preferGRAYtrue,
+ \v!no=>\convertGRAYfalse,
+ \v!never=>\convertGRAYfalse,
+ \v!always=>\preferGRAYtrue\RGBsupportedfalse\CMYKsupportedfalse]%
+ \ifRGBsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \else\ifCMYKsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \convertMPcolorstrue
+ \ifreduceCMYK
+ \reduceMPcolorstrue
+ \fi
+ \else
+ \ifconverttoGRAY\else\showcolormessage\m!colors{11}\empty\fi
+ \converttoGRAYtrue
+ \forcegrayMPcolorstrue
+ \convertMPcolorsfalse
+ \reduceMPcolorsfalse
+ \fi\fi
+ \doifelse\@@clstate\v!stop
+ {\incolorfalse\forcegrayMPcolorstrue}%
+ {\ifincolor\else\showcolormessage\m!colors1\colorstyle\fi\incolortrue\let\@@clstate\v!start}%
+ \dosetupcolormodel
+ \the\everysetupcolors}
+
+%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.
+
+\unexpanded\def\definepalet
+ {\dodoubleargument\dodefinepalet}
+
+\def\dodefinepalet[#1][#2]%
+ {\doifassignmentelse{#2}
+ {%\showcolormessage\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]}}}}
+
+\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
+
+\unexpanded\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
+ \showcolormessage\m!colors7\currentpalet
+ \let\currentpalet\empty
+ \fi\fi
+ \initializemaintextcolor}
+
+%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.
+
+\unexpanded\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]{\definespotcolor[#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
+ {\ifcsname\??cr#2:\recurselevel\endcsname
+ \setevalue{\??cr#1:\recurselevel}{\csname\??cr#2:\recurselevel\endcsname}%
+ \else
+ \exitloop
+ \fi}}%
+ \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 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 In \MKIV\ we don't support color separation as we might now assume
+%D that printing houses have the right programs to do it themselves.
+%D The \MKII\ color separator was implemented as part of a project
+%D that needed. If it's ever needed in \MKIV\ i'll do it in the
+%D backend.
+
+\let\doifseparatingcolorselse\secondoftwoarguments
+\let\doifcolorchannelelse \secondofthreearguments
+\let\resetcolorseparation \relax
+\let\colorchannelprefix \empty
+\let\colorchannelsuffix \empty
+
+%D We now define the low level macros:
+
+% todo: palets in definecolor
+% todo: {\red xx} vs \red{xx}
+
+% check: registerusedspotcolors
+% check: \currentcolorname
+% check: \outercolorname
+% check: \startcolormode
+
+% \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
+
+\ifx\currentcolormodel\undefined \newcount\currentcolormodel \fi
+
+% \def\setcolormodel#1%
+% {\showcolormessage\m!colors1{#1}%
+% \dosetcolormodel{#1}}
+
+\def\dosetcolormodel#1% no message
+ {\currentcolormodel\ctxlua{tex.print(colors.setmodel('#1',\ifweightGRAY true\else false\fi))}%
+ \attribute\colormodelattribute\currentcolormodel}
+
+\dosetcolormodel{all}
+
+
+\def\dosetupcolormodel
+ {\ifincolor
+ \ifRGBsupported
+ \ifCMYKsupported
+ \dosetcolormodel{all}%
+ \else
+ \dosetcolormodel{rgb}%
+ \fi
+ \else
+ \ifCMYKsupported
+ \dosetcolormodel{cmyk}%
+ \else
+ \ifconvertGRAY
+ \dosetcolormodel{gray}%
+ \else
+ \dosetcolormodel{none}%
+ \fi
+ \fi
+ \fi
+ \else
+ \ifconvertGRAY
+ \dosetcolormodel{gray}%
+ \else
+ \dosetcolormodel{none}%
+ \fi
+ \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.
+
+\letvalue{(cs:-}\empty
+\letvalue{(ts:-}\empty
+
+\def\doactivatecolor#1% : in currentpalet, maybe not, ugly
+ {\def\currentcolorname{#1}%
+ \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.enable() transparencies.enable()}% not that efficient but at least robust
+ \let\doactivatecolor\normaldoactivatecolor
+ \expandafter\doactivatecolor
+ \else
+ \expandafter\normaldoactivatecolor
+ \fi}
+
+\def\deactivatecolor
+ {\let\currentcolorname\s!black
+ \attribute\colorattribute\attributeunsetvalue
+ \attribute\transparencyattribute\attributeunsetvalue}
+
+\def\dodefinecolorcommand#1#2%
+ {\unexpanded#1{#2}{\doactivatecolor{#2}}}
+
+\let\colorlist\empty % not really used, only for colo-run
+\setfalse\collectcolorsinlist
+\def\collectcolorinlist#1{\doglobal\addtocommalist{#1}\colorlist}
+
+\def\doregistercolor#1#2{\ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}}
+
+\def\dodefinecolor[#1][#2]%
+ {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
+ \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ \dodefinecolorcommand\setvalue{#1}}
+
+\def\dodefineglobalcolor[#1][#2]%
+ {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
+ \ctxlua{colors.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}%
+ \dodefinecolorcommand\setgvalue{#1}}
+
+\def\dodefinenamedcolor[#1][#2]%
+ {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
+ \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ \dodefinecolorcommand\setvalue{#1}}
+
+\def\dodefinespotcolor[#1][#2][#3]%
+ {\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
+ \ctxlua{colors.definespotcolor("#1","#2","#3",true)}%
+ \dodefinecolorcommand\setxvalue{#1}}
+
+\def\dodefinemultitonecolor[#1][#2][#3][#4]%
+ {\ctxlua{colors.definemultitonecolor("#1","#2","#3","#4",true)}%
+ \dodefinecolorcommand\setxvalue{#1}}
+
+\def\dodefinetransparency[#1][#2]%
+ {\ctxlua{colors.definetransparency("#1",#2)}}
+
+\def\dosetrastercolor#1% slow, we need a fast one
+ {\edef\@@rastervalue{#1}%
+ \ifx\@@rastervalue\empty
+ \let\@@rastervalue\@@rsscreen
+ \fi
+ \attribute\colorattribute\ctxlua{tex.sprint(colors.definesimplegray("_raster_",\@@rastervalue))}\relax}
+
+\def\dodefinefastcolor[#1][#2]% still not fast but ok
+ {\ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ \dodefinecolorcommand\setvalue{#1}}
+
+%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\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}
+
+%D \macros
+%D {colored}
+%D
+%D A bit like \type {\definedfont}:
+
+\unexpanded\def\colored[#1]%
+ {\ctxlua{colors.defineprocesscolor("@colored@","#1",false,false)}%
+ \groupedcommand{\doactivatecolor{@colored@}}{}}
+
+%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.
+%D
+%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
+
+% can be cleaned up
+
+\let\maintextcolor \empty
+\def\defaulttextcolor {black}
+\def\@@themaintextcolor{themaintextcolor}
+
+\appendtoks
+ \deactivatecolor
+ \ifx\maintextcolor\empty\else\doactivatecolor\maintextcolor\fi
+\to \everybeforeoutput
+
+\def\registermaintextcolor{\ctxlua{colors.main = \thecolorattribute\maintextcolor}}
+
+\unexpanded\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
+\appendtoks \initializemaintextcolor \to \everysetupcolors
+
+\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}}
+ {\ifcsname(cs:#3)\endcsname % \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}%
+ \else
+ % not entered when making format
+ \localundefine{(cs:#1:#2)}% \letvalue{(cs:#1:#2)}\undefined
+ \localundefine{(ca:#1:#2)}% \letvalue{(ca:#1:#2)}\undefined
+ \fi}}
+
+\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}
+
+%D Low level defs:
+
+\def\colordefalc#1#2{\setevalue{(ca:#1)}{#2}\setvalue {(cs:#1)}{\attribute\colorattribute #2 }}
+\def\colordefagc#1#2{\setxvalue{(ca:#1)}{#2}\setvalue {(cs:#1)}{\attribute\colorattribute #2 }}
+\def\colordefalt#1#2{\setevalue{(ta:#1)}{#2}\setvalue {(ts:#1)}{\attribute\transparencyattribute#2 }}
+\def\colordefagt#1#2{\setxvalue{(ta:#1)}{#2}\setgvalue{(ts:#1)}{\attribute\transparencyattribute#2 }}
+
+\def\colordefflc#1#2{\setvalue {(ca:#1)}{\doinheritca{#2}}\setvalue {(cs:#1)}{\doinheritcs{#2}}}
+\def\colordeffgc#1#2{\setgvalue{(ca:#1)}{\doinheritca{#2}}\setvalue {(cs:#1)}{\doinheritcs{#2}}}
+\def\colordefflt#1#2{\setvalue {(ta:#1)}{\doinheritta{#2}}\setvalue {(ts:#1)}{\doinheritts{#2}}}
+\def\colordeffgt#1#2{\setgvalue{(ta:#1)}{\doinheritta{#2}}\setgvalue{(ts:#1)}{\doinheritts{#2}}}
+
+\def\colordefrlc #1{\localundefine {(ca:#1)}\localundefine {(cs:#1)}}
+\def\colordefrgc #1{\globalundefine{(ca:#1)}\globalundefine{(cs:#1)}}
+\def\colordefrlt #1{\localundefine {(ta:#1)}\localundefine {(ts:#1)}}
+\def\colordefrgt #1{\globalundefine{(ta:#1)}\globalundefine{(ts:#1)}}
+
+%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{ }
+
+\def\MPcolor#1{\ctxlua{tex.sprint(colors.mp(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}}
+
+\let\currentcolorname\s!black % todo
+\let\outercolorname \s!black % todo
+
+\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\internalspotcolorname #1{\ctxlua{tex.sprint(colors.spotcolorname (\thecolorattribute{#1}))}}
+\def\internalspotcolorparent#1{\ctxlua{tex.sprint(colors.spotcolorparent(\thecolorattribute{#1}))}}
+\def\internalspotcolorsize #1{\ctxlua{tex.sprint(colors.spotcolorvalue (\thecolorattribute{#1}))}}
+
+\def\colorcomponents #1{\ctxlua{tex.sprint(colors.colorcomponents (\thecolorattribute {#1}))}}
+\def\transparencycomponents#1{\ctxlua{tex.sprint(colors.transparencycomponents(\thetransparencyattribute{#1}))}}
+
+\def\colorvalue#1{\ctxlua{tex.sprint(colors.formatcolor(\thecolorattribute{#1},"\colorformatseparator"))}}
+\def\grayvalue #1{\ctxlua{tex.sprint(colors.formatgray (\thecolorattribute{#1},"\colorformatseparator"))}}
+
+\def\doifblackelse #1{\ctxlua{commands.doifelse(colors.isblack(\thecolorattribute{#1}))}}
+\def\doifdrawingblackelse {\ctxlua{commands.doifelse(colors.isblack(tex.attribute[attributes.numbers['color']]))}}
+
+%D \macros
+%D {forcecolorhack}
+%D
+%D We can out this in front of (for instance) a special and so force color
+%D to be applied (only glyphs, rules and leaders are handled).
+%D
+%D \startbuffer
+%D \framed
+%D [background=color,backgroundcolor=yellow,framecolor=red,corner=round]
+%D {test}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% ignores in attribute handler
+%
+% \def\forcecolorhack{\vrule\!!width\zeropoint\!!height\zeropoint\!!depth\zeropoint}
+
+% \normal added else fails in metafun manual (leaders do a hard scan)
+
+\unexpanded\def\forcecolorhack{\leaders\hrule\normalhskip\zeropoint}
+
+%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, % will be enabled later on
+ \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, % obsolete
+ \c!factor=\v!yes,
+ \c!criterium=\v!all] % obsolete
+
+\appendtoks
+ \setupcolors[\c!state=\v!start]% later direct
+\to \everyjob
+
+\appendtoks
+ \let\showcolormessage\showmessage
+\to \everyjob
+
+\setupcolor
+ [\v!rgb]
+
+\protect \endinput
diff --git a/tex/context/base/colo-rgb.tex b/tex/context/base/colo-rgb.tex
new file mode 100644
index 000000000..038e0ab0b
--- /dev/null
+++ b/tex/context/base/colo-rgb.tex
@@ -0,0 +1,530 @@
+%D \module
+%D [ file=colo-rgb,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=RGB,
+%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 Just to give users a start we define some colors. While
+%D switching fonts is as international as can be, thanks to the
+%D mnemonics, naming colors is very interface dependant. To
+%D support international setups, we define both english and
+%D interface dependant colors. We use the color inheritance
+%D mechanisms to implement the interface dependant ones.
+
+%D First we define some simple primary \cap{RGB} and \cap{CMYK}
+%D colors. All colors are defined in \cap{RGB} color space.
+
+\definecolor [red] [r=1, g=0, b=0]
+\definecolor [green] [r=0, g=1, b=0]
+\definecolor [blue] [r=0, g=0, b=1]
+
+\definecolor [cyan] [r=0, g=1, b=1]
+\definecolor [magenta] [r=1, g=0, b=1]
+\definecolor [yellow] [r=1, g=1, b=0]
+
+\definecolor [white] [s=1] % [r=1, g=1, b=1]
+\definecolor [black] [s=0]
+\definecolor [gray] [s=.9]
+
+\definecolor [darkred] [r=.8, g=0, b=0]
+\definecolor [middlered] [r=.9, g=0, b=0]
+\definecolor [lightred] [r=1, g=0, b=0]
+
+\definecolor [darkgreen] [r=0, g=.6, b=0]
+\definecolor [middlegreen] [r=0, g=.8, b=0]
+\definecolor [lightgreen] [r=0, g=1, b=0]
+
+\definecolor [darkblue] [r=0, g=0, b=.8]
+\definecolor [middleblue] [r=0, g=0, b=.9]
+\definecolor [lightblue] [r=0, g=0, b=1]
+
+\definecolor [darkcyan] [r=.6, g=.8, b=.8]
+\definecolor [middlecyan] [r=0, g=.8, b=.8]
+
+\definecolor [darkmagenta] [r=.8, g=.6, b=.8]
+\definecolor [middlemagenta] [r=1, g=0, b=.6]
+
+\definecolor [darkyellow] [r=.8, g=.8, b=.6]
+\definecolor [middleyellow] [r=1, g=1, b=.2]
+
+\definecolor [darkgray] [s=.5]
+\definecolor [middlegray] [s=.7]
+\definecolor [lightgray] [s=.9]
+
+%D These colors are mapped to interface dependant colornames.
+
+\startinterface dutch
+
+ \definecolor [rood] [red]
+ \definecolor [groen] [green]
+ \definecolor [blauw] [blue]
+
+ \definecolor [cyaan] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [geel] [yellow]
+
+ \definecolor [wit] [white]
+ \definecolor [grijs] [gray]
+ \definecolor [zwart] [black]
+
+ \definecolor [donkerrood] [darkred]
+ \definecolor [middelrood] [middlered]
+ \definecolor [lichtrood] [lightred]
+
+ \definecolor [donkergroen] [darkgreen]
+ \definecolor [middelgroen] [middlegreen]
+ \definecolor [lichtgroen] [lightgreen]
+
+ \definecolor [donkerblauw] [darkblue]
+ \definecolor [middelblauw] [middleblue]
+ \definecolor [lichtblauw] [lightblue]
+
+ \definecolor [donkercyaan] [darkcyan]
+ \definecolor [middelcyaan] [middlecyan]
+
+ \definecolor [donkermagenta] [darkmagenta]
+ \definecolor [middelmagenta] [middlemagenta]
+
+ \definecolor [donkergeel] [darkyellow]
+ \definecolor [middelgeel] [middleyellow]
+
+ \definecolor [donkergrijs] [darkgray]
+ \definecolor [middengrijs] [middlegray]
+ \definecolor [lichtgrijs] [lightgray]
+
+\stopinterface
+
+\startinterface german
+
+ \definecolor [rot] [red]
+ \definecolor [gruen] [green]
+ \definecolor [blau] [blue]
+
+ \definecolor [cyan] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [gelb] [yellow]
+
+ \definecolor [weiss] [white]
+ \definecolor [grau] [gray]
+ \definecolor [schwarz] [black]
+
+ \definecolor [dunkelrot] [darkred]
+ \definecolor [mittelrot] [middlered]
+ \definecolor [hellrot] [lightred]
+
+ \definecolor [dunkelgruen] [darkgreen]
+ \definecolor [mittelgruen] [middlegreen]
+ \definecolor [hellgruen] [lightgreen]
+
+ \definecolor [dunkelblau] [darkblue]
+ \definecolor [mittelblau] [middleblue]
+ \definecolor [hellblau] [lightblue]
+
+ \definecolor [dunkelcyan] [darkcyan]
+ \definecolor [mittelcyan] [middlecyan]
+
+ \definecolor [dunkelmagenta] [darkmagenta]
+ \definecolor [mittelmagenta] [middlemagenta]
+
+ \definecolor [dunkelgelb] [darkyellow]
+ \definecolor [mittelgelb] [middleyellow]
+
+ \definecolor [dunkelgrau] [darkgray]
+ \definecolor [mittelgrau] [middlegray]
+ \definecolor [hellgrau] [lightgray]
+
+\stopinterface
+
+\startinterface czech
+
+ \definecolor [cervena] [red]
+ \definecolor [zelena] [green]
+ \definecolor [modra] [blue]
+
+ \definecolor [azurova] [cyan]
+ \definecolor [fialova] [magenta]
+ \definecolor [zluta] [yellow]
+
+ \definecolor [bila] [white]
+ \definecolor [cerna] [black]
+
+ \definecolor [tmavecervena] [darkred]
+ \definecolor [strednecervena] [middlered]
+ \definecolor [svetlecervena] [lightred]
+
+ \definecolor [tmavezelena] [darkgreen]
+ \definecolor [strednezelena] [middlegreen]
+ \definecolor [svetlezelena] [lightgreen]
+
+ \definecolor [tmavemodra] [darkblue]
+ \definecolor [strednemodra] [middleblue]
+ \definecolor [svetlemodra] [lightblue]
+
+ \definecolor [tmaveazurova] [darkcyan]
+ \definecolor [stredneazurova] [middlecyan]
+
+ \definecolor [tmavefialova] [darkmagenta]
+ \definecolor [strednefialova] [middlemagenta]
+
+ \definecolor [tmavezluta] [darkyellow]
+ \definecolor [strednezluta] [middleyellow]
+
+ \definecolor [tmaveseda] [darkgray]
+ \definecolor [stredneseda] [middlegray]
+ \definecolor [svetleseda] [lightgray]
+
+\stopinterface
+
+\startinterface italian
+
+ \definecolor [rosso] [red]
+ \definecolor [verde] [green]
+ \definecolor [blu] [blue]
+
+ \definecolor [azzurro] [cyan]
+ \definecolor [turchino] [cyan]
+ \definecolor [ciano] [cyan]
+ \definecolor [cremisi] [magenta]
+ \definecolor [giallo] [yellow]
+
+ \definecolor [bianco] [white]
+ \definecolor [grigio] [gray]
+ \definecolor [nero] [black]
+
+ \definecolor [rossoscuro] [darkred]
+ \definecolor [rossomedio] [middlered]
+ \definecolor [rossochiaro] [lightred]
+
+ \definecolor [verdescuro] [darkgreen]
+ \definecolor [verdemedio] [middlegreen]
+ \definecolor [verdechiaro] [lightgreen]
+
+ \definecolor [bluscuro] [darkblue]
+ \definecolor [blumedio] [middleblue]
+ \definecolor [bluchiaro] [lightblue]
+
+ \definecolor [azzurroscuro] [darkcyan]
+ \definecolor [azzurrochiaro] [middlecyan]
+
+ \definecolor [cremisiscuro] [darkmagenta]
+ \definecolor [cremisichiaro] [middlemagenta]
+
+
+ \definecolor [gialloscuro] [darkyellow]
+ \definecolor [giallomedio] [middleyellow]
+
+ \definecolor [grigioscuro] [darkgray]
+ \definecolor [grigiomedio] [middlegray]
+ \definecolor [grigiochiaro] [lightgray]
+
+\stopinterface
+
+\startinterface romanian
+
+ \definecolor [rosu] [red]
+ \definecolor [verde] [green]
+ \definecolor [albastru] [blue]
+
+ \definecolor [cian] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [galben] [yellow]
+
+ \definecolor [alb] [white]
+ \definecolor [gri] [gray]
+ \definecolor [negru] [black]
+
+ \definecolor [rosuinchis] [darkred]
+ \definecolor [rosumediu] [middlered]
+ \definecolor [rosudeschis] [lightred]
+
+ \definecolor [verdeinchis] [darkgreen]
+ \definecolor [verdemediu] [middlegreen]
+ \definecolor [verdedeschis] [lightgreen]
+
+ \definecolor [albastruinchis] [darkblue]
+ \definecolor [albastrumediu] [middleblue]
+ \definecolor [albastrudeschis] [lightblue]
+
+ \definecolor [cianinchis] [darkcyan]
+ \definecolor [cianmediu] [middlecyan]
+
+ \definecolor [magentainchis] [darkmagenta]
+ \definecolor [magentamediu] [middlemagenta]
+
+ \definecolor [galbeninchis] [darkyellow]
+ \definecolor [galbenmediu] [middleyellow]
+
+ \definecolor [griinchis] [darkgray]
+ \definecolor [grimediu] [middlegray]
+ \definecolor [grideschis] [lightgray]
+
+\stopinterface
+
+%D Like colors, we first define the english colorgroups. These
+%D colorgroups are tuned for distinctive gray scale printing.
+
+% todo : more efficient and real gray
+
+\definecolorgroup
+ [gray]
+ [0.95:0.95:0.95,
+ 0.90:0.90:0.90,
+ 0.80:0.80:0.80,
+ 0.70:0.70:0.70,
+ 0.60:0.60:0.60,
+ 0.50:0.50:0.50,
+ 0.40:0.40:0.40,
+ 0.30:0.30:0.30,
+ 0.20:0.20:0.20,
+ 0.10:0.10:0.10,
+ 0.00:0.00:0.00]
+
+\definecolorgroup
+ [red]
+ [1.00:0.90:0.90,
+ 1.00:0.80:0.80,
+ 1.00:0.70:0.70,
+ 1.00:0.55:0.55,
+ 1.00:0.40:0.40,
+ 1.00:0.25:0.25,
+ 1.00:0.15:0.15,
+ 0.90:0.00:0.00]
+
+\definecolorgroup
+ [green]
+ [0.90:1.00:0.90,
+ 0.70:1.00:0.70,
+ 0.50:1.00:0.50,
+ 0.30:1.00:0.30,
+ 0.15:0.90:0.15,
+ 0.00:0.80:0.00,
+ 0.00:0.65:0.00,
+ 0.00:0.50:0.00]
+
+\definecolorgroup
+ [blue]
+ [0.90:0.95:1.00,
+ 0.80:0.90:1.00,
+ 0.55:0.85:1.00,
+ 0.30:0.80:1.00,
+ 0.15:0.75:1.00,
+ 0.00:0.70:1.00,
+ 0.00:0.55:1.00,
+ 0.00:0.40:1.00]
+
+\definecolorgroup
+ [cyan]
+ [0.80:1.00:1.00,
+ 0.60:1.00:1.00,
+ 0.30:1.00:1.00,
+ 0.00:0.95:0.95,
+ 0.00:0.85:0.85,
+ 0.00:0.75:0.75,
+ 0.00:0.60:0.60,
+ 0.00:0.50:0.50]
+
+\definecolorgroup
+ [magenta]
+ [1.00:0.90:1.00,
+ 1.00:0.80:1.00,
+ 1.00:0.65:1.00,
+ 1.00:0.50:1.00,
+ 1.00:0.35:1.00,
+ 1.00:0.15:1.00,
+ 0.90:0.05:0.90,
+ 0.80:0.00:0.80]
+
+\definecolorgroup
+ [yellow]
+ [1.00:1.00:0.70,
+ 1.00:1.00:0.00,
+ 1.00:0.85:0.05,
+ 1.00:0.70:0.00,
+ 1.00:0.55:0.00,
+ 0.95:0.40:0.00,
+ 0.80:0.30:0.00,
+ 0.60:0.30:0.00]
+
+\definecolorgroup
+ [red*]
+ [1.00:0.95:0.95,
+ 1.00:0.90:0.90,
+ 1.00:0.80:0.80,
+ 1.00:0.70:0.70,
+ 1.00:0.60:0.60,
+ 1.00:0.50:0.50,
+ 1.00:0.40:0.40,
+ 1.00:0.30:0.30]
+
+\definecolorgroup
+ [green*]
+ [0.95:1.00:0.95,
+ 0.90:1.00:0.90,
+ 0.80:1.00:0.80,
+ 0.70:1.00:0.70,
+ 0.60:1.00:0.60,
+ 0.50:1.00:0.50,
+ 0.40:1.00:0.40,
+ 0.30:1.00:0.30]
+
+\definecolorgroup
+ [blue*]
+ [0.95:0.95:1.00,
+ 0.90:0.90:1.00,
+ 0.80:0.80:1.00,
+ 0.70:0.70:1.00,
+ 0.60:0.60:1.00,
+ 0.50:0.50:1.00,
+ 0.40:0.40:1.00,
+ 0.30:0.30:1.00]
+
+\definecolorgroup
+ [yellow*]
+ [1.00:1.00:0.10,
+ 1.00:1.00:0.00,
+ 0.90:0.90:0.00,
+ 0.80:0.80:0.00,
+ 0.70:0.70:0.00,
+ 0.60:0.60:0.00,
+ 0.50:0.50:0.00,
+ 0.40:0.40:0.00]
+
+%D For the sake of implementing interface dependant color
+%D groups we support colorgroup duplication.
+
+\startinterface dutch
+ \definecolorgroup [grijs] [gray]
+ \definecolorgroup [rood] [red]
+ \definecolorgroup [groen] [green]
+ \definecolorgroup [blauw] [blue]
+ \definecolorgroup [cyaan] [cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [geel] [yellow]
+ \definecolorgroup [rood*] [red*]
+ \definecolorgroup [groen*] [green*]
+ \definecolorgroup [blauw*] [blue*]
+ \definecolorgroup [geel*] [yellow*]
+\stopinterface
+
+\startinterface german
+ \definecolorgroup [grau] [gray]
+ \definecolorgroup [rot] [red]
+ \definecolorgroup [gruen] [green]
+ \definecolorgroup [blau] [blue]
+ \definecolorgroup [cyan] [cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [gelb] [yellow]
+ \definecolorgroup [rot*] [red*]
+ \definecolorgroup [gruen*] [green*]
+ \definecolorgroup [blau*] [blue*]
+ \definecolorgroup [gelb*] [yellow*]
+\stopinterface
+
+\startinterface czech
+ \definecolorgroup [seda] [gray]
+ \definecolorgroup [cervena] [red]
+ \definecolorgroup [zelena] [green]
+ \definecolorgroup [modra] [blue]
+ \definecolorgroup [azurova] [cyan]
+ \definecolorgroup [fialova] [magenta]
+ \definecolorgroup [zluta] [yellow]
+ \definecolorgroup [cervena*] [red*]
+ \definecolorgroup [zelena*] [green*]
+ \definecolorgroup [modra*] [blue*]
+ \definecolorgroup [zluta*] [yellow*]
+\stopinterface
+
+\startinterface italian
+ \definecolorgroup [grigio] [gray]
+ \definecolorgroup [rosso] [red]
+ \definecolorgroup [verde] [green]
+ \definecolorgroup [blu] [blue]
+ \definecolorgroup [ciano] [cyan]
+ \definecolorgroup [azzurro] [cyan]
+ \definecolorgroup [turchino][cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [cremisi] [magenta]
+ \definecolorgroup [giallo] [yellow]
+ \definecolorgroup [rosso*] [red*]
+ \definecolorgroup [verde*] [green*]
+ \definecolorgroup [blu*] [blue*]
+ \definecolorgroup [giallo*] [yellow*]
+\stopinterface
+
+%D The next set of color palets is quite language independant.
+%D These palets are meant as examples.
+
+\definepalet
+ [alfa]
+ [ top=red:7,
+ bottom=green:6,
+ up=blue:5,
+ down=cyan:4,
+ strange=magenta:3,
+ charm=yellow:2]
+
+\definepalet
+ [beta]
+ [ top=red:7,
+ bottom=green:5,
+ up=blue:3,
+ down=cyan:6,
+ strange=magenta:2,
+ charm=yellow:1]
+
+\definepalet
+ [gamma]
+ [ top=red:2,
+ bottom=green:5,
+ up=blue:3,
+ down=cyan:6,
+ strange=magenta:7,
+ charm=yellow:4]
+
+\definepalet
+ [delta]
+ [ top=yellow*:5,
+ bottom=yellow*:3,
+ up=yellow*:2,
+ down=magenta:6,
+ strange=blue:4,
+ charm=blue:1]
+
+\definepalet
+ [epsilon]
+ [ top=cyan:7,
+ bottom=cyan:5,
+ up=blue:3,
+ down=yellow:6,
+ strange=yellow:4,
+ charm=yellow:2]
+
+\definepalet
+ [zeta]
+ [ top=red:6,
+ bottom=green:5,
+ up=blue:7,
+ down=cyan:4,
+ strange=magenta:3,
+ charm=yellow:2]
+
+%D The next four colors are used for typesetting verbatim \TEX\
+%D in color.
+
+\definecolor [texcolorone] [middlered]
+\definecolor [texcolortwo] [middlegreen]
+\definecolor [texcolorthree] [middleblue]
+\definecolor [texcolorfour] [darkyellow]
+
+%D Bonus (needed for FO test):
+
+\definecolor [orange] [r=1,g=.5]
+
+\endinput
diff --git a/tex/context/base/colo-run.tex b/tex/context/base/colo-run.tex
new file mode 100644
index 000000000..d94ea9801
--- /dev/null
+++ b/tex/context/base/colo-run.tex
@@ -0,0 +1,257 @@
+%D \module
+%D [ file=colo-run,
+%D version=1997.04.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Runtime loaded commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+% temp hack (not do be documented)
+
+% \gdef\doformatcolorP#1:#2:#3:#4:#5:#6\od % was undefined in colo-ini
+% {#1\colorformatseparator
+% \dodoformatcolor{#2}\colorformatseparator
+% \dodoformatcolor{#3}\colorformatseparator
+% \dodoformatcolor{#4}\colorformatseparator}
+
+% \gdef\doformatgrayP#1:#2:#3:#4:#5:#6\od
+% {todo}
+
+% so far
+
+\gdef\showpalet
+ {\dodoubleargument\doshowpalet}
+
+\gdef\doshowpalet[#1][#2]%
+ {\doifdefined{\??pa#1}
+ {\doifinsetelse\v!vertical{#2}
+ {\showverticalpalet[#1][#2]}
+ {\showhorizontalpalet[#1][#2]}}}
+
+\gdef\showverticalpalet[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#1]
+ \def\rule
+ {\vrule\!!width3em\!!height\strutht\!!depth\strutdp}
+ \tabskip\zeropoint
+ \def\doshowpalet##1%
+ {\doifinsetelse\v!number{#2}{##1\hskip.5em}{}&
+ \color[##1]{\rule}\graycolor[##1]{\rule}&
+ \doifinset\v!value{#2}{\hskip.5em\colorvalue{##1}}\crcr}
+ \halign
+ {\hss##&\hss##\hss&##\cr
+ &\doifinset{\v!name}{#2}{\strut#1}&\cr%
+ \processpalet[#1]\doshowpalet\crcr}}}
+
+\gdef\showhorizontalpalet[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#1]
+ \tabskip\zeropoint
+ \!!widtha\zeropoint
+ \doifinset\v!number{#2}
+ {\def\doshowpalet##1%
+ {\setbox0\hbox{##1}%
+ \ifdim\!!widtha<\wd0\!!widtha\wd0\fi}%
+ \processpalet[#1]\doshowpalet}%
+ \advance\!!widtha 1em
+ \ifdim\!!widtha<5em
+ \!!widtha5em
+ \fi
+ \halign
+ {##&&\hbox to \!!widtha{\hss##\hss}\cr
+ \doifinset\v!number{#2}
+ {\def\doshowpalet##1{&\strut##1}%
+ \processpalet[#1]\doshowpalet}\cr
+ \doifinset\v!name{#2}{#1\hskip.5em}%
+ \def\doshowpalet##1%
+ {&\strut\color[##1]{\vrule\!!width\!!widtha\!!height\strutht\!!depth\zeropoint}}%
+ \processpalet[#1]\doshowpalet\crcr
+ \noalign{\vskip-\strutdepth}%
+ \def\doshowpalet##1%
+ {&\graycolor[##1]{\vrule\!!width\!!widtha\!!height\zeropoint\!!depth\strutdp}}%
+ \processpalet[#1]\doshowpalet\crcr
+ \doifinset\v!value{#2}
+ {\def\doshowpalet##1%
+ {&\vbox
+ {\hsize\!!widtha
+ \vskip.25ex
+ \everypar{\strut}
+ \veryraggedcenter
+ \let\colorformatseparator=\endgraf
+ \colorvalue{##1}}}%
+ \processpalet[#1]\doshowpalet}%
+ \crcr}}}
+
+\gdef\processpalet[#1]%
+ {\expanded{\globalprocesscommalist[\getvalue{\??pa#1}]}}
+
+\gdef\showcolorgroup
+ {\dodoubleargument\doshowcolorgroup}
+
+\gdef\doshowcolorgroup[#1][#2]%
+ {\doifcolor{#1:1}
+ {\doifinsetelse\v!vertical{#2}
+ {\showverticalcolorgroup[#1][#2]}
+ {\showhorizontalcolorgroup[#1][#2]}}}
+
+\gdef\showhorizontalcolorgroup[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet
+ \tabskip\zeropoint
+ \def\rule
+ {\vrule\!!width4em\!!height\strutht\!!depth\strutdp}
+ \def\colorformatseparator{\strut\cr}
+ \def\dodoshowgroup##1%
+ {\halign
+ {\hss####\hss\cr
+ \doifinset\v!number{#2}{\strut##1}\cr
+ \color[#1:##1]{\vrule\!!width4em\!!height\strutht\!!depth\zeropoint}\cr
+ \graycolor[#1:##1]{\vrule\!!width4em\!!height\zeropoint\!!depth\strutdp}\cr
+ \doifinset\v!value{#2}{\colorvalue{#1:##1}\strut}\crcr}}
+ \def\doshowgroup##1%
+ {\doifcolor{#1:##1}
+ {\vbox{\dodoshowgroup{##1}}}}%
+ \hbox
+ {\doifinset\v!name{#2}
+ {\strut
+ \doifinsetelse\v!value{#2}
+ {\raise3\lineheight\hbox{#1\hskip.5em}}
+ {#1}%
+ \hskip.5em}%
+ \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
+ \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
+
+\gdef\showverticalcolorgroup[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet
+ \tabskip\zeropoint
+ \def\rule
+ {\vrule\!!width2.5em\!!height\strutht\!!depth\strutdp}%
+ \def\doshowgroup##1%
+ {\doifcolor{#1:##1}
+ {\doifinset\v!number{#2}{##1\hskip.5em}&
+ \color[#1:##1]{\rule}\graycolor[#1:##1]{\rule}&
+ \doifinset\v!value{#2}{\hskip.5em\colorvalue{#1:##1}}\crcr}}%
+ \halign
+ {\hss##&\hss##\hss&##\hss\cr
+ &\doifinset\v!name{#2}{\strut#1}&\crcr
+ \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
+ \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
+
+\gdef\showcolor
+ {\dosingleempty\doshowcolor}
+
+\gdef\doshowcolor[#1]%
+ {\bgroup
+ \iffirstargument
+ \let\colorlist\empty % not really used, only for colo-run
+ \let\colorstyle\empty
+ \settrue\collectcolorsinlist
+ \setupcolor[#1]%
+ \fi
+ \def\rule
+ {\vrule\!!width4em\!!height\strutht\!!depth\strutdp}%
+ \def\docommand##1%
+ {\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
+ {\dosingleargument\docomparepalet}
+
+\gdef\docomparepalet[#1]%
+ {\doifdefined{\??pa#1}
+ {\hbox
+ {\dodocomparepalet\color[#1]%
+ \quad
+ \dodocomparepalet\graycolor[#1]}}}
+
+\gdef\dodocomparepalet#1[#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#2]
+ \getcommacommandsize[\getvalue{\??pa#2}]
+ \!!widtha2em\relax
+ \hsize\commalistsize\!!widtha
+ \def\rule%
+ {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
+ \def\dododocomparepalet##1%
+ {\hbox
+ {\setbox0\hbox
+ {#1[##1]{\vrule\!!width\hsize\!!height3ex}}%
+ \wd0\zeropoint
+ \box0
+ \hbox to \hsize
+ {\def\dododocomparepalet####1%
+ {\hbox to \!!widtha
+ {\hss#1[####1]{\rule}\hss}}%
+ \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
+ \endgraf}
+ \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
+
+\gdef\comparecolorgroup
+ {\dosingleargument\docomparecolorgroup}
+
+\gdef\docomparecolorgroup[#1]%
+ {\doifcolor{#1:1}
+ {\hbox
+ {\dodocomparecolorgroup\color[#1]%
+ \quad
+ \dodocomparecolorgroup\graycolor[#1]}}}
+
+\gdef\dodocomparecolorgroup#1[#2]%
+ {\localvbox
+ {\!!counta\zerocount
+ \dorecurse{15}
+ {\doifcolor{#2:\recurselevel}{\advance\!!counta\plusone}}
+ \!!widtha2em\relax
+ \hsize\!!counta\!!widtha
+ \def\rule
+ {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
+ \def\dododocomparecolorgroup##1%
+ {\hbox to \hsize
+ {\setbox0\hbox
+ {#1[#2:##1]{\vrule\!!width\hsize\!!height3ex}}%
+ \wd0\zeropoint
+ \box0
+ \hbox to \hsize
+ {\hss\dorecurse\!!counta{#1[#2:\recurselevel]{\rule}\hss}}}
+ \endgraf}
+ \dorecurse\!!counta{\dododocomparecolorgroup\recurselevel}}}
+
+\gdef\dogetcolorcomponents#1%
+ {\doifelsenothing{#1}
+ {\appendtoks
+ \TB
+ \to \scratchtoks}
+ {\appendtoks
+ \NC\showcolorbar[#1]\NC#1\NC\transparencycomponents{#1}\NC\colorcomponents{#1}\NC \NR
+ \to \scratchtoks}}
+
+\gdef\showcolorbar[#1]%
+ {\backgroundline[#1]{\strut\enspace\color[white]{white}\enspace\color[black]{black}\enspace}}
+
+\gdef\showcolorcomponents[#1]%
+ {\begingroup
+ \scratchtoks{\TB}%
+ \processcommacommand[#1]\dogetcolorcomponents
+ \starttabulate[|lT|lT|lT|lT|]
+ \NC color \NC name \NC transparency \NC specification \NC\NR
+ \the\scratchtoks
+ \stoptabulate
+ \endgroup}
+
+\protect \endinput
diff --git a/tex/context/base/colo-x11.tex b/tex/context/base/colo-x11.tex
new file mode 100644
index 000000000..45d3aac62
--- /dev/null
+++ b/tex/context/base/colo-x11.tex
@@ -0,0 +1,677 @@
+%D \module
+%D [ file=colo-x11,
+%D version=2009.11.13,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=X11,
+%D author=Alan Braslau]
+%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 Standard X11 rgb colors (from \type {/usr/share/X11/rgb.txt}):
+
+\doifnotmode{mkiv} {
+ \input colo-hex.mkii
+}
+
+\definecolor [snow] [h=fffafa]
+\definecolor [ghostwhite] [h=f8f8ff]
+\definecolor [whitesmoke] [s=0.96]
+\definecolor [gainsboro] [s=0.86]
+\definecolor [floralwhite] [h=fffaf0]
+\definecolor [oldlace] [h=fdf5e6]
+\definecolor [linen] [h=faf0e6]
+\definecolor [antiquewhite] [h=faebd7]
+\definecolor [papayawhip] [h=ffefd5]
+\definecolor [blanchedalmond] [h=ffebcd]
+\definecolor [bisque] [h=ffe4c4]
+\definecolor [peachpuff] [h=ffdab9]
+\definecolor [navajowhite] [h=ffdead]
+\definecolor [moccasin] [h=ffe4b5]
+\definecolor [cornsilk] [h=fff8dc]
+\definecolor [ivory] [h=fffff0]
+\definecolor [lemonchiffon] [h=fffacd]
+\definecolor [seashell] [h=fff5ee]
+\definecolor [honeydew] [h=f0fff0]
+\definecolor [mintcream] [h=f5fffa]
+\definecolor [azure] [h=f0ffff]
+\definecolor [aliceblue] [h=f0f8ff]
+\definecolor [lavender] [h=e6e6fa]
+\definecolor [lavenderblush] [h=fff0f5]
+\definecolor [mistyrose] [h=ffe4e1]
+\definecolor [white] [s=1]
+\definecolor [black] [s=0]
+\definecolor [darkslategray] [h=2f4f4f]
+\definecolor [darkslategrey] [darkslategray]
+\definecolor [dimgray] [s=0.41]
+\definecolor [dimgrey] [dimgray]
+\definecolor [slategray] [h=708090]
+\definecolor [slategrey] [slategray]
+\definecolor [lightslategray] [h=778899]
+\definecolor [lightslategrey] [lightslategray]
+\definecolor [gray] [s=0.75]
+\definecolor [grey] [gray]
+\definecolor [lightgrey] [s=0.83]
+\definecolor [lightgray] [lightgrey]
+\definecolor [midnightblue] [h=191970]
+\definecolor [navy] [h=000080]
+\definecolor [navyblue] [navy]
+\definecolor [cornflowerblue] [h=6495ed]
+\definecolor [darkslateblue] [h=483d8b]
+\definecolor [slateblue] [h=6a5acd]
+\definecolor [mediumslateblue] [h=7b68ee]
+\definecolor [lightslateblue] [h=8470ff]
+\definecolor [mediumblue] [h=0000cd]
+\definecolor [royalblue] [h=4169e1]
+\definecolor [blue] [h=0000ff]
+\definecolor [dodgerblue] [h=1e90ff]
+\definecolor [deepskyblue] [h=00bfff]
+\definecolor [skyblue] [h=87ceeb]
+\definecolor [lightskyblue] [h=87cefa]
+\definecolor [steelblue] [h=4682b4]
+\definecolor [lightsteelblue] [h=b0c4de]
+\definecolor [lightblue] [h=add8e6]
+\definecolor [powderblue] [h=b0e0e6]
+\definecolor [paleturquoise] [h=afeeee]
+\definecolor [darkturquoise] [h=00ced1]
+\definecolor [mediumturquoise] [h=48d1cc]
+\definecolor [turquoise] [h=40e0d0]
+\definecolor [cyan] [h=00ffff]
+\definecolor [lightcyan] [h=e0ffff]
+\definecolor [cadetblue] [h=5f9ea0]
+\definecolor [mediumaquamarine] [h=66cdaa]
+\definecolor [aquamarine] [h=7fffd4]
+\definecolor [darkgreen] [h=006400]
+\definecolor [darkolivegreen] [h=556b2f]
+\definecolor [darkseagreen] [h=8fbc8f]
+\definecolor [seagreen] [h=2e8b57]
+\definecolor [mediumseagreen] [h=3cb371]
+\definecolor [lightseagreen] [h=20b2aa]
+\definecolor [palegreen] [h=98fb98]
+\definecolor [springgreen] [h=00ff7f]
+\definecolor [lawngreen] [h=7cfc00]
+\definecolor [green] [h=00ff00]
+\definecolor [chartreuse] [h=7fff00]
+\definecolor [mediumspringgreen] [h=00fa9a]
+\definecolor [greenyellow] [h=adff2f]
+\definecolor [limegreen] [h=32cd32]
+\definecolor [yellowgreen] [h=9acd32]
+\definecolor [forestgreen] [h=228b22]
+\definecolor [olivedrab] [h=6b8e23]
+\definecolor [darkkhaki] [h=bdb76b]
+\definecolor [khaki] [h=f0e68c]
+\definecolor [palegoldenrod] [h=eee8aa]
+\definecolor [lightgoldenrodyellow] [h=fafad2]
+\definecolor [lightyellow] [h=ffffe0]
+\definecolor [yellow] [h=ffff00]
+\definecolor [gold] [h=ffd700]
+\definecolor [lightgoldenrod] [h=eedd82]
+\definecolor [goldenrod] [h=daa520]
+\definecolor [darkgoldenrod] [h=b8860b]
+\definecolor [rosybrown] [h=bc8f8f]
+\definecolor [indianred] [h=cd5c5c]
+\definecolor [saddlebrown] [h=8b4513]
+\definecolor [sienna] [h=a0522d]
+\definecolor [peru] [h=cd853f]
+\definecolor [burlywood] [h=deb887]
+\definecolor [beige] [h=f5f5dc]
+\definecolor [wheat] [h=f5deb3]
+\definecolor [sandybrown] [h=f4a460]
+\definecolor [tan] [h=d2b48c]
+\definecolor [chocolate] [h=d2691e]
+\definecolor [firebrick] [h=b22222]
+\definecolor [brown] [h=a52a2a]
+\definecolor [darksalmon] [h=e9967a]
+\definecolor [salmon] [h=fa8072]
+\definecolor [lightsalmon] [h=ffa07a]
+\definecolor [orange] [h=ffa500]
+\definecolor [darkorange] [h=ff8c00]
+\definecolor [coral] [h=ff7f50]
+\definecolor [lightcoral] [h=f08080]
+\definecolor [tomato] [h=ff6347]
+\definecolor [orangered] [h=ff4500]
+\definecolor [red] [h=ff0000]
+\definecolor [hotpink] [h=ff69b4]
+\definecolor [deeppink] [h=ff1493]
+\definecolor [pink] [h=ffc0cb]
+\definecolor [lightpink] [h=ffb6c1]
+\definecolor [palevioletred] [h=db7093]
+\definecolor [maroon] [h=b03060]
+\definecolor [mediumvioletred] [h=c71585]
+\definecolor [violetred] [h=d02090]
+\definecolor [magenta] [h=ff00ff]
+\definecolor [violet] [h=ee82ee]
+\definecolor [plum] [h=dda0dd]
+\definecolor [orchid] [h=da70d6]
+\definecolor [mediumorchid] [h=ba55d3]
+\definecolor [darkorchid] [h=9932cc]
+\definecolor [darkviolet] [h=9400d3]
+\definecolor [blueviolet] [h=8a2be2]
+\definecolor [purple] [h=a020f0]
+\definecolor [mediumpurple] [h=9370db]
+\definecolor [thistle] [h=d8bfd8]
+\definecolor [snow1] [h=fffafa]
+\definecolor [snow2] [h=eee9e9]
+\definecolor [snow3] [h=cdc9c9]
+\definecolor [snow4] [h=8b8989]
+\definecolor [seashell1] [h=fff5ee]
+\definecolor [seashell2] [h=eee5de]
+\definecolor [seashell3] [h=cdc5bf]
+\definecolor [seashell4] [h=8b8682]
+\definecolor [antiquewhite1] [h=ffefdb]
+\definecolor [antiquewhite2] [h=eedfcc]
+\definecolor [antiquewhite3] [h=cdc0b0]
+\definecolor [antiquewhite4] [h=8b8378]
+\definecolor [bisque1] [h=ffe4c4]
+\definecolor [bisque2] [h=eed5b7]
+\definecolor [bisque3] [h=cdb79e]
+\definecolor [bisque4] [h=8b7d6b]
+\definecolor [peachpuff1] [h=ffdab9]
+\definecolor [peachpuff2] [h=eecbad]
+\definecolor [peachpuff3] [h=cdaf95]
+\definecolor [peachpuff4] [h=8b7765]
+\definecolor [navajowhite1] [h=ffdead]
+\definecolor [navajowhite2] [h=eecfa1]
+\definecolor [navajowhite3] [h=cdb38b]
+\definecolor [navajowhite4] [h=8b795e]
+\definecolor [lemonchiffon1] [h=fffacd]
+\definecolor [lemonchiffon2] [h=eee9bf]
+\definecolor [lemonchiffon3] [h=cdc9a5]
+\definecolor [lemonchiffon4] [h=8b8970]
+\definecolor [cornsilk1] [h=fff8dc]
+\definecolor [cornsilk2] [h=eee8cd]
+\definecolor [cornsilk3] [h=cdc8b1]
+\definecolor [cornsilk4] [h=8b8878]
+\definecolor [ivory1] [h=fffff0]
+\definecolor [ivory2] [h=eeeee0]
+\definecolor [ivory3] [h=cdcdc1]
+\definecolor [ivory4] [h=8b8b83]
+\definecolor [honeydew1] [h=f0fff0]
+\definecolor [honeydew2] [h=e0eee0]
+\definecolor [honeydew3] [h=c1cdc1]
+\definecolor [honeydew4] [h=838b83]
+\definecolor [lavenderblush1] [h=fff0f5]
+\definecolor [lavenderblush2] [h=eee0e5]
+\definecolor [lavenderblush3] [h=cdc1c5]
+\definecolor [lavenderblush4] [h=8b8386]
+\definecolor [mistyrose1] [h=ffe4e1]
+\definecolor [mistyrose2] [h=eed5d2]
+\definecolor [mistyrose3] [h=cdb7b5]
+\definecolor [mistyrose4] [h=8b7d7b]
+\definecolor [azure1] [h=f0ffff]
+\definecolor [azure2] [h=e0eeee]
+\definecolor [azure3] [h=c1cdcd]
+\definecolor [azure4] [h=838b8b]
+\definecolor [slateblue1] [h=836fff]
+\definecolor [slateblue2] [h=7a67ee]
+\definecolor [slateblue3] [h=6959cd]
+\definecolor [slateblue4] [h=473c8b]
+\definecolor [royalblue1] [h=4876ff]
+\definecolor [royalblue2] [h=436eee]
+\definecolor [royalblue3] [h=3a5fcd]
+\definecolor [royalblue4] [h=27408b]
+\definecolor [blue1] [h=0000ff]
+\definecolor [blue2] [h=0000ee]
+\definecolor [blue3] [h=0000cd]
+\definecolor [blue4] [h=00008b]
+\definecolor [dodgerblue1] [h=1e90ff]
+\definecolor [dodgerblue2] [h=1c86ee]
+\definecolor [dodgerblue3] [h=1874cd]
+\definecolor [dodgerblue4] [h=104e8b]
+\definecolor [steelblue1] [h=63b8ff]
+\definecolor [steelblue2] [h=5cacee]
+\definecolor [steelblue3] [h=4f94cd]
+\definecolor [steelblue4] [h=36648b]
+\definecolor [deepskyblue1] [h=00bfff]
+\definecolor [deepskyblue2] [h=00b2ee]
+\definecolor [deepskyblue3] [h=009acd]
+\definecolor [deepskyblue4] [h=00688b]
+\definecolor [skyblue1] [h=87ceff]
+\definecolor [skyblue2] [h=7ec0ee]
+\definecolor [skyblue3] [h=6ca6cd]
+\definecolor [skyblue4] [h=4a708b]
+\definecolor [lightskyblue1] [h=b0e2ff]
+\definecolor [lightskyblue2] [h=a4d3ee]
+\definecolor [lightskyblue3] [h=8db6cd]
+\definecolor [lightskyblue4] [h=607b8b]
+\definecolor [slategray1] [h=c6e2ff]
+\definecolor [slategray2] [h=b9d3ee]
+\definecolor [slategray3] [h=9fb6cd]
+\definecolor [slategray4] [h=6c7b8b]
+\definecolor [lightsteelblue1] [h=cae1ff]
+\definecolor [lightsteelblue2] [h=bcd2ee]
+\definecolor [lightsteelblue3] [h=a2b5cd]
+\definecolor [lightsteelblue4] [h=6e7b8b]
+\definecolor [lightblue1] [h=bfefff]
+\definecolor [lightblue2] [h=b2dfee]
+\definecolor [lightblue3] [h=9ac0cd]
+\definecolor [lightblue4] [h=68838b]
+\definecolor [lightcyan1] [h=e0ffff]
+\definecolor [lightcyan2] [h=d1eeee]
+\definecolor [lightcyan3] [h=b4cdcd]
+\definecolor [lightcyan4] [h=7a8b8b]
+\definecolor [paleturquoise1] [h=bbffff]
+\definecolor [paleturquoise2] [h=aeeeee]
+\definecolor [paleturquoise3] [h=96cdcd]
+\definecolor [paleturquoise4] [h=668b8b]
+\definecolor [cadetblue1] [h=98f5ff]
+\definecolor [cadetblue2] [h=8ee5ee]
+\definecolor [cadetblue3] [h=7ac5cd]
+\definecolor [cadetblue4] [h=53868b]
+\definecolor [turquoise1] [h=00f5ff]
+\definecolor [turquoise2] [h=00e5ee]
+\definecolor [turquoise3] [h=00c5cd]
+\definecolor [turquoise4] [h=00868b]
+\definecolor [cyan1] [h=00ffff]
+\definecolor [cyan2] [h=00eeee]
+\definecolor [cyan3] [h=00cdcd]
+\definecolor [cyan4] [h=008b8b]
+\definecolor [darkslategray1] [h=97ffff]
+\definecolor [darkslategray2] [h=8deeee]
+\definecolor [darkslategray3] [h=79cdcd]
+\definecolor [darkslategray4] [h=528b8b]
+\definecolor [aquamarine1] [h=7fffd4]
+\definecolor [aquamarine2] [h=76eec6]
+\definecolor [aquamarine3] [h=66cdaa]
+\definecolor [aquamarine4] [h=458b74]
+\definecolor [darkseagreen1] [h=c1ffc1]
+\definecolor [darkseagreen2] [h=b4eeb4]
+\definecolor [darkseagreen3] [h=9bcd9b]
+\definecolor [darkseagreen4] [h=698b69]
+\definecolor [seagreen1] [h=54ff9f]
+\definecolor [seagreen2] [h=4eee94]
+\definecolor [seagreen3] [h=43cd80]
+\definecolor [seagreen4] [h=2e8b57]
+\definecolor [palegreen1] [h=9aff9a]
+\definecolor [palegreen2] [h=90ee90]
+\definecolor [palegreen3] [h=7ccd7c]
+\definecolor [palegreen4] [h=548b54]
+\definecolor [springgreen1] [h=00ff7f]
+\definecolor [springgreen2] [h=00ee76]
+\definecolor [springgreen3] [h=00cd66]
+\definecolor [springgreen4] [h=008b45]
+\definecolor [green1] [h=00ff00]
+\definecolor [green2] [h=00ee00]
+\definecolor [green3] [h=00cd00]
+\definecolor [green4] [h=008b00]
+\definecolor [chartreuse1] [h=7fff00]
+\definecolor [chartreuse2] [h=76ee00]
+\definecolor [chartreuse3] [h=66cd00]
+\definecolor [chartreuse4] [h=458b00]
+\definecolor [olivedrab1] [h=c0ff3e]
+\definecolor [olivedrab2] [h=b3ee3a]
+\definecolor [olivedrab3] [h=9acd32]
+\definecolor [olivedrab4] [h=698b22]
+\definecolor [darkolivegreen1] [h=caff70]
+\definecolor [darkolivegreen2] [h=bcee68]
+\definecolor [darkolivegreen3] [h=a2cd5a]
+\definecolor [darkolivegreen4] [h=6e8b3d]
+\definecolor [khaki1] [h=fff68f]
+\definecolor [khaki2] [h=eee685]
+\definecolor [khaki3] [h=cdc673]
+\definecolor [khaki4] [h=8b864e]
+\definecolor [lightgoldenrod1] [h=ffec8b]
+\definecolor [lightgoldenrod2] [h=eedc82]
+\definecolor [lightgoldenrod3] [h=cdbe70]
+\definecolor [lightgoldenrod4] [h=8b814c]
+\definecolor [lightyellow1] [h=ffffe0]
+\definecolor [lightyellow2] [h=eeeed1]
+\definecolor [lightyellow3] [h=cdcdb4]
+\definecolor [lightyellow4] [h=8b8b7a]
+\definecolor [yellow1] [h=ffff00]
+\definecolor [yellow2] [h=eeee00]
+\definecolor [yellow3] [h=cdcd00]
+\definecolor [yellow4] [h=8b8b00]
+\definecolor [gold1] [h=ffd700]
+\definecolor [gold2] [h=eec900]
+\definecolor [gold3] [h=cdad00]
+\definecolor [gold4] [h=8b7500]
+\definecolor [goldenrod1] [h=ffc125]
+\definecolor [goldenrod2] [h=eeb422]
+\definecolor [goldenrod3] [h=cd9b1d]
+\definecolor [goldenrod4] [h=8b6914]
+\definecolor [darkgoldenrod1] [h=ffb90f]
+\definecolor [darkgoldenrod2] [h=eead0e]
+\definecolor [darkgoldenrod3] [h=cd950c]
+\definecolor [darkgoldenrod4] [h=8b6508]
+\definecolor [rosybrown1] [h=ffc1c1]
+\definecolor [rosybrown2] [h=eeb4b4]
+\definecolor [rosybrown3] [h=cd9b9b]
+\definecolor [rosybrown4] [h=8b6969]
+\definecolor [indianred1] [h=ff6a6a]
+\definecolor [indianred2] [h=ee6363]
+\definecolor [indianred3] [h=cd5555]
+\definecolor [indianred4] [h=8b3a3a]
+\definecolor [sienna1] [h=ff8247]
+\definecolor [sienna2] [h=ee7942]
+\definecolor [sienna3] [h=cd6839]
+\definecolor [sienna4] [h=8b4726]
+\definecolor [burlywood1] [h=ffd39b]
+\definecolor [burlywood2] [h=eec591]
+\definecolor [burlywood3] [h=cdaa7d]
+\definecolor [burlywood4] [h=8b7355]
+\definecolor [wheat1] [h=ffe7ba]
+\definecolor [wheat2] [h=eed8ae]
+\definecolor [wheat3] [h=cdba96]
+\definecolor [wheat4] [h=8b7e66]
+\definecolor [tan1] [h=ffa54f]
+\definecolor [tan2] [h=ee9a49]
+\definecolor [tan3] [h=cd853f]
+\definecolor [tan4] [h=8b5a2b]
+\definecolor [chocolate1] [h=ff7f24]
+\definecolor [chocolate2] [h=ee7621]
+\definecolor [chocolate3] [h=cd661d]
+\definecolor [chocolate4] [h=8b4513]
+\definecolor [firebrick1] [h=ff3030]
+\definecolor [firebrick2] [h=ee2c2c]
+\definecolor [firebrick3] [h=cd2626]
+\definecolor [firebrick4] [h=8b1a1a]
+\definecolor [brown1] [h=ff4040]
+\definecolor [brown2] [h=ee3b3b]
+\definecolor [brown3] [h=cd3333]
+\definecolor [brown4] [h=8b2323]
+\definecolor [salmon1] [h=ff8c69]
+\definecolor [salmon2] [h=ee8262]
+\definecolor [salmon3] [h=cd7054]
+\definecolor [salmon4] [h=8b4c39]
+\definecolor [lightsalmon1] [h=ffa07a]
+\definecolor [lightsalmon2] [h=ee9572]
+\definecolor [lightsalmon3] [h=cd8162]
+\definecolor [lightsalmon4] [h=8b5742]
+\definecolor [orange1] [h=ffa500]
+\definecolor [orange2] [h=ee9a00]
+\definecolor [orange3] [h=cd8500]
+\definecolor [orange4] [h=8b5a00]
+\definecolor [darkorange1] [h=ff7f00]
+\definecolor [darkorange2] [h=ee7600]
+\definecolor [darkorange3] [h=cd6600]
+\definecolor [darkorange4] [h=8b4500]
+\definecolor [coral1] [h=ff7256]
+\definecolor [coral2] [h=ee6a50]
+\definecolor [coral3] [h=cd5b45]
+\definecolor [coral4] [h=8b3e2f]
+\definecolor [tomato1] [h=ff6347]
+\definecolor [tomato2] [h=ee5c42]
+\definecolor [tomato3] [h=cd4f39]
+\definecolor [tomato4] [h=8b3626]
+\definecolor [orangered1] [h=ff4500]
+\definecolor [orangered2] [h=ee4000]
+\definecolor [orangered3] [h=cd3700]
+\definecolor [orangered4] [h=8b2500]
+\definecolor [red1] [h=ff0000]
+\definecolor [red2] [h=ee0000]
+\definecolor [red3] [h=cd0000]
+\definecolor [red4] [h=8b0000]
+\definecolor [debianred] [h=d70751]
+\definecolor [deeppink1] [h=ff1493]
+\definecolor [deeppink2] [h=ee1289]
+\definecolor [deeppink3] [h=cd1076]
+\definecolor [deeppink4] [h=8b0a50]
+\definecolor [hotpink1] [h=ff6eb4]
+\definecolor [hotpink2] [h=ee6aa7]
+\definecolor [hotpink3] [h=cd6090]
+\definecolor [hotpink4] [h=8b3a62]
+\definecolor [pink1] [h=ffb5c5]
+\definecolor [pink2] [h=eea9b8]
+\definecolor [pink3] [h=cd919e]
+\definecolor [pink4] [h=8b636c]
+\definecolor [lightpink1] [h=ffaeb9]
+\definecolor [lightpink2] [h=eea2ad]
+\definecolor [lightpink3] [h=cd8c95]
+\definecolor [lightpink4] [h=8b5f65]
+\definecolor [palevioletred1] [h=ff82ab]
+\definecolor [palevioletred2] [h=ee799f]
+\definecolor [palevioletred3] [h=cd6889]
+\definecolor [palevioletred4] [h=8b475d]
+\definecolor [maroon1] [h=ff34b3]
+\definecolor [maroon2] [h=ee30a7]
+\definecolor [maroon3] [h=cd2990]
+\definecolor [maroon4] [h=8b1c62]
+\definecolor [violetred1] [h=ff3e96]
+\definecolor [violetred2] [h=ee3a8c]
+\definecolor [violetred3] [h=cd3278]
+\definecolor [violetred4] [h=8b2252]
+\definecolor [magenta1] [h=ff00ff]
+\definecolor [magenta2] [h=ee00ee]
+\definecolor [magenta3] [h=cd00cd]
+\definecolor [magenta4] [h=8b008b]
+\definecolor [orchid1] [h=ff83fa]
+\definecolor [orchid2] [h=ee7ae9]
+\definecolor [orchid3] [h=cd69c9]
+\definecolor [orchid4] [h=8b4789]
+\definecolor [plum1] [h=ffbbff]
+\definecolor [plum2] [h=eeaeee]
+\definecolor [plum3] [h=cd96cd]
+\definecolor [plum4] [h=8b668b]
+\definecolor [mediumorchid1] [h=e066ff]
+\definecolor [mediumorchid2] [h=d15fee]
+\definecolor [mediumorchid3] [h=b452cd]
+\definecolor [mediumorchid4] [h=7a378b]
+\definecolor [darkorchid1] [h=bf3eff]
+\definecolor [darkorchid2] [h=b23aee]
+\definecolor [darkorchid3] [h=9a32cd]
+\definecolor [darkorchid4] [h=68228b]
+\definecolor [purple1] [h=9b30ff]
+\definecolor [purple2] [h=912cee]
+\definecolor [purple3] [h=7d26cd]
+\definecolor [purple4] [h=551a8b]
+\definecolor [mediumpurple1] [h=ab82ff]
+\definecolor [mediumpurple2] [h=9f79ee]
+\definecolor [mediumpurple3] [h=8968cd]
+\definecolor [mediumpurple4] [h=5d478b]
+\definecolor [thistle1] [h=ffe1ff]
+\definecolor [thistle2] [h=eed2ee]
+\definecolor [thistle3] [h=cdb5cd]
+\definecolor [thistle4] [h=8b7b8b]
+\definecolor [gray0] [s=0.00]
+\definecolor [grey0] [gray0]
+\definecolor [gray1] [s=0.01]
+\definecolor [grey1] [gray1]
+\definecolor [gray2] [s=0.02]
+\definecolor [grey2] [gray2]
+\definecolor [gray3] [s=0.03]
+\definecolor [grey3] [gray3]
+\definecolor [gray4] [s=0.04]
+\definecolor [grey4] [gray4]
+\definecolor [gray5] [s=0.05]
+\definecolor [grey5] [gray5]
+\definecolor [gray6] [s=0.06]
+\definecolor [grey6] [gray6]
+\definecolor [gray7] [s=0.07]
+\definecolor [grey7] [gray7]
+\definecolor [gray8] [s=0.08]
+\definecolor [grey8] [gray8]
+\definecolor [gray9] [s=0.09]
+\definecolor [grey9] [gray9]
+\definecolor [gray10] [s=0.10]
+\definecolor [grey10] [gray10]
+\definecolor [gray11] [s=0.11]
+\definecolor [grey11] [gray11]
+\definecolor [gray12] [s=0.12]
+\definecolor [grey12] [gray12]
+\definecolor [gray13] [s=0.13]
+\definecolor [grey13] [gray13]
+\definecolor [gray14] [s=0.14]
+\definecolor [grey14] [gray14]
+\definecolor [gray15] [s=0.15]
+\definecolor [grey15] [gray15]
+\definecolor [gray16] [s=0.16]
+\definecolor [grey16] [gray16]
+\definecolor [gray17] [s=0.17]
+\definecolor [grey17] [gray17]
+\definecolor [gray18] [s=0.18]
+\definecolor [grey18] [gray18]
+\definecolor [gray19] [s=0.19]
+\definecolor [grey19] [gray19]
+\definecolor [gray20] [s=0.20]
+\definecolor [grey20] [gray20]
+\definecolor [gray21] [s=0.21]
+\definecolor [grey21] [gray21]
+\definecolor [gray22] [s=0.22]
+\definecolor [grey22] [gray22]
+\definecolor [gray23] [s=0.23]
+\definecolor [grey23] [gray23]
+\definecolor [gray24] [s=0.24]
+\definecolor [grey24] [gray24]
+\definecolor [gray25] [s=0.25]
+\definecolor [grey25] [gray25]
+\definecolor [gray26] [s=0.26]
+\definecolor [grey26] [gray26]
+\definecolor [gray27] [s=0.27]
+\definecolor [grey27] [gray27]
+\definecolor [gray28] [s=0.28]
+\definecolor [grey28] [gray28]
+\definecolor [gray29] [s=0.29]
+\definecolor [grey29] [gray29]
+\definecolor [gray30] [s=0.30]
+\definecolor [grey30] [gray30]
+\definecolor [gray31] [s=0.31]
+\definecolor [grey31] [gray31]
+\definecolor [gray32] [s=0.32]
+\definecolor [grey32] [gray32]
+\definecolor [gray33] [s=0.33]
+\definecolor [grey33] [gray33]
+\definecolor [gray34] [s=0.34]
+\definecolor [grey34] [gray34]
+\definecolor [gray35] [s=0.35]
+\definecolor [grey35] [gray35]
+\definecolor [gray36] [s=0.36]
+\definecolor [grey36] [gray36]
+\definecolor [gray37] [s=0.37]
+\definecolor [grey37] [gray37]
+\definecolor [gray38] [s=0.38]
+\definecolor [grey38] [gray38]
+\definecolor [gray39] [s=0.39]
+\definecolor [grey39] [gray39]
+\definecolor [gray40] [s=0.40]
+\definecolor [grey40] [gray40]
+\definecolor [gray41] [s=0.41]
+\definecolor [grey41] [gray41]
+\definecolor [gray42] [s=0.42]
+\definecolor [grey42] [gray42]
+\definecolor [gray43] [s=0.43]
+\definecolor [grey43] [gray43]
+\definecolor [gray44] [s=0.44]
+\definecolor [grey44] [gray44]
+\definecolor [gray45] [s=0.45]
+\definecolor [grey45] [gray45]
+\definecolor [gray46] [s=0.46]
+\definecolor [grey46] [gray46]
+\definecolor [gray47] [s=0.47]
+\definecolor [grey47] [gray47]
+\definecolor [gray48] [s=0.48]
+\definecolor [grey48] [gray48]
+\definecolor [gray49] [s=0.49]
+\definecolor [grey49] [gray49]
+\definecolor [gray50] [s=0.50]
+\definecolor [grey50] [gray50]
+\definecolor [gray51] [s=0.51]
+\definecolor [grey51] [gray51]
+\definecolor [gray52] [s=0.52]
+\definecolor [grey52] [gray52]
+\definecolor [gray53] [s=0.53]
+\definecolor [grey53] [gray53]
+\definecolor [gray54] [s=0.54]
+\definecolor [grey54] [gray54]
+\definecolor [gray55] [s=0.55]
+\definecolor [grey55] [gray55]
+\definecolor [gray56] [s=0.56]
+\definecolor [grey56] [gray56]
+\definecolor [gray57] [s=0.57]
+\definecolor [grey57] [gray57]
+\definecolor [gray58] [s=0.58]
+\definecolor [grey58] [gray58]
+\definecolor [gray59] [s=0.59]
+\definecolor [grey59] [gray59]
+\definecolor [gray60] [s=0.60]
+\definecolor [grey60] [gray60]
+\definecolor [gray61] [s=0.61]
+\definecolor [grey61] [gray61]
+\definecolor [gray62] [s=0.62]
+\definecolor [grey62] [gray62]
+\definecolor [gray63] [s=0.63]
+\definecolor [grey63] [gray63]
+\definecolor [gray64] [s=0.64]
+\definecolor [grey64] [gray64]
+\definecolor [gray65] [s=0.65]
+\definecolor [grey65] [gray65]
+\definecolor [gray66] [s=0.66]
+\definecolor [grey66] [gray66]
+\definecolor [gray67] [s=0.67]
+\definecolor [grey67] [gray67]
+\definecolor [gray68] [s=0.68]
+\definecolor [grey68] [gray68]
+\definecolor [gray69] [s=0.69]
+\definecolor [grey69] [gray69]
+\definecolor [gray70] [s=0.70]
+\definecolor [grey70] [gray70]
+\definecolor [gray71] [s=0.71]
+\definecolor [grey71] [gray71]
+\definecolor [gray72] [s=0.72]
+\definecolor [grey72] [gray72]
+\definecolor [gray73] [s=0.73]
+\definecolor [grey73] [gray73]
+\definecolor [gray74] [s=0.74]
+\definecolor [grey74] [gray74]
+\definecolor [gray75] [s=0.75]
+\definecolor [grey75] [gray75]
+\definecolor [gray76] [s=0.76]
+\definecolor [grey76] [gray76]
+\definecolor [gray77] [s=0.77]
+\definecolor [grey77] [gray77]
+\definecolor [gray78] [s=0.78]
+\definecolor [grey78] [gray78]
+\definecolor [gray79] [s=0.79]
+\definecolor [grey79] [gray79]
+\definecolor [gray80] [s=0.80]
+\definecolor [grey80] [gray80]
+\definecolor [gray81] [s=0.81]
+\definecolor [grey81] [gray81]
+\definecolor [gray82] [s=0.82]
+\definecolor [grey82] [gray82]
+\definecolor [gray83] [s=0.83]
+\definecolor [grey83] [gray83]
+\definecolor [gray84] [s=0.84]
+\definecolor [grey84] [gray84]
+\definecolor [gray85] [s=0.85]
+\definecolor [grey85] [gray85]
+\definecolor [gray86] [s=0.86]
+\definecolor [grey86] [gray86]
+\definecolor [gray87] [s=0.87]
+\definecolor [grey87] [gray87]
+\definecolor [gray88] [s=0.88]
+\definecolor [grey88] [gray88]
+\definecolor [gray89] [s=0.89]
+\definecolor [grey89] [gray89]
+\definecolor [gray90] [s=0.90]
+\definecolor [grey90] [gray90]
+\definecolor [gray91] [s=0.91]
+\definecolor [grey91] [gray91]
+\definecolor [gray92] [s=0.92]
+\definecolor [grey92] [gray92]
+\definecolor [gray93] [s=0.93]
+\definecolor [grey93] [gray93]
+\definecolor [gray94] [s=0.94]
+\definecolor [grey94] [gray94]
+\definecolor [gray95] [s=0.95]
+\definecolor [grey95] [gray95]
+\definecolor [gray96] [s=0.96]
+\definecolor [grey96] [gray96]
+\definecolor [gray97] [s=0.97]
+\definecolor [grey97] [gray97]
+\definecolor [gray98] [s=0.98]
+\definecolor [grey98] [gray98]
+\definecolor [gray99] [s=0.99]
+\definecolor [grey99] [gray99]
+\definecolor [gray100] [s=1.00]
+\definecolor [grey100] [gray100]
+\definecolor [darkgrey] [s=0.66]
+\definecolor [darkgray] [darkgrey]
+\definecolor [darkblue] [h=00008b]
+\definecolor [darkcyan] [h=008b8b]
+\definecolor [darkmagenta] [h=8b008b]
+\definecolor [darkred] [h=8b0000]
+\definecolor [lightgreen] [h=90ee90]
+
+\endinput
diff --git a/tex/context/base/colo-xwi.tex b/tex/context/base/colo-xwi.tex
new file mode 100644
index 000000000..81e09d871
--- /dev/null
+++ b/tex/context/base/colo-xwi.tex
@@ -0,0 +1,142 @@
+%D \module
+%D [ file=colo-xwi,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=X Windows,
+%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've forgotten where I got these definitions from, but maybe
+%D they can be of use.
+
+\definecolor [aliceblue] [r=0.94,g=0.97,b=1.00]
+\definecolor [antiquewhite] [r=0.98,g=0.92,b=0.84]
+\definecolor [aquamarine] [r=0.50,g=1.00,b=0.83]
+\definecolor [azure] [r=0.94,g=1.00,b=1.00]
+\definecolor [beige] [r=0.96,g=0.96,b=0.86]
+\definecolor [bisque] [r=1.00,g=0.89,b=0.77]
+\definecolor [black] [s=0] % [r=0.00,g=0.00,b=0.00]
+\definecolor [blanchedalmond] [r=1.00,g=0.92,b=0.80]
+\definecolor [blue] [r=0.00,g=0.00,b=1.00]
+\definecolor [blueviolet] [r=0.54,g=0.17,b=0.89]
+\definecolor [brown] [r=0.65,g=0.16,b=0.16]
+\definecolor [burlywood] [r=0.87,g=0.72,b=0.53]
+\definecolor [cadetblue] [r=0.37,g=0.62,b=0.63]
+\definecolor [chartreuse] [r=0.50,g=1.00,b=0.00]
+\definecolor [chocolate] [r=0.82,g=0.41,b=0.12]
+\definecolor [coral] [r=1.00,g=0.50,b=0.31]
+\definecolor [cornflowerblue] [r=0.39,g=0.58,b=0.93]
+\definecolor [cornsilk] [r=1.00,g=0.97,b=0.86]
+\definecolor [cyan] [r=0.00,g=1.00,b=1.00]
+\definecolor [darkgoldenrod] [r=0.72,g=0.53,b=0.04]
+\definecolor [darkgreen] [r=0.00,g=0.39,b=0.00]
+\definecolor [darkkhaki] [r=0.74,g=0.72,b=0.42]
+\definecolor [darkolivegreen] [r=0.33,g=0.42,b=0.18]
+\definecolor [darkorange] [r=1.00,g=0.55,b=0.00]
+\definecolor [darkorchid] [r=0.60,g=0.20,b=0.80]
+\definecolor [darksalmon] [r=0.91,g=0.59,b=0.48]
+\definecolor [darkseagreen] [r=0.56,g=0.74,b=0.56]
+\definecolor [darkslateblue] [r=0.28,g=0.24,b=0.55]
+\definecolor [darkturquoise] [r=0.00,g=0.81,b=0.82]
+\definecolor [darkviolet] [r=0.58,g=0.00,b=0.83]
+\definecolor [deeppink] [r=1.00,g=0.08,b=0.58]
+\definecolor [deepskyblue] [r=0.00,g=0.75,b=1.00]
+\definecolor [dodgerblue] [r=0.12,g=0.56,b=1.00]
+\definecolor [firebrick] [r=0.70,g=0.13,b=0.13]
+\definecolor [floralwhite] [r=1.00,g=0.98,b=0.94]
+\definecolor [forestgreen] [r=0.13,g=0.55,b=0.13]
+\definecolor [gainsboro] [r=0.86,g=0.86,b=0.86]
+\definecolor [ghostwhite] [r=0.97,g=0.97,b=1.00]
+\definecolor [gold] [r=1.00,g=0.84,b=0.00]
+\definecolor [goldenrod] [r=0.85,g=0.65,b=0.13]
+\definecolor [green] [r=0.00,g=1.00,b=0.00]
+\definecolor [greenyellow] [r=0.68,g=1.00,b=0.18]
+\definecolor [honeydew] [r=0.94,g=1.00,b=0.94]
+\definecolor [hotpink] [r=1.00,g=0.41,b=0.71]
+\definecolor [indianred] [r=0.80,g=0.36,b=0.36]
+\definecolor [ivory] [r=1.00,g=1.00,b=0.94]
+\definecolor [khaki] [r=0.94,g=0.90,b=0.55]
+\definecolor [lavender] [r=0.90,g=0.90,b=0.98]
+\definecolor [lavenderblush] [r=1.00,g=0.94,b=0.96]
+\definecolor [lawngreen] [r=0.49,g=0.99,b=0.00]
+\definecolor [lemonchiffon] [r=1.00,g=0.98,b=0.80]
+\definecolor [lightblue] [r=0.68,g=0.85,b=0.90]
+\definecolor [lightcoral] [r=0.94,g=0.50,b=0.50]
+\definecolor [lightcyan] [r=0.88,g=1.00,b=1.00]
+\definecolor [lightgoldenrod] [r=0.93,g=0.87,b=0.51]
+\definecolor [lightgoldenrodyellow] [r=0.98,g=0.98,b=0.82]
+\definecolor [lightpink] [r=1.00,g=0.71,b=0.76]
+\definecolor [lightsalmon] [r=1.00,g=0.63,b=0.48]
+\definecolor [lightseagreen] [r=0.13,g=0.70,b=0.67]
+\definecolor [lightskyblue] [r=0.53,g=0.81,b=0.98]
+\definecolor [lightslateblue] [r=0.52,g=0.44,b=1.00]
+\definecolor [lightsteelblue] [r=0.69,g=0.77,b=0.87]
+\definecolor [lightyellow] [r=1.00,g=1.00,b=0.88]
+\definecolor [limegreen] [r=0.20,g=0.80,b=0.20]
+\definecolor [linen] [r=0.98,g=0.94,b=0.90]
+\definecolor [magenta] [r=1.00,g=0.00,b=1.00]
+\definecolor [maroon] [r=0.69,g=0.19,b=0.38]
+\definecolor [mediumaquamarine] [r=0.40,g=0.80,b=0.67]
+\definecolor [mediumblue] [r=0.00,g=0.00,b=0.80]
+\definecolor [mediumorchid] [r=0.73,g=0.33,b=0.83]
+\definecolor [mediumpurple] [r=0.58,g=0.44,b=0.86]
+\definecolor [mediumseagreen] [r=0.24,g=0.70,b=0.44]
+\definecolor [mediumslateblue] [r=0.48,g=0.41,b=0.93]
+\definecolor [mediumspringgreen] [r=0.00,g=0.98,b=0.60]
+\definecolor [mediumturquoise] [r=0.28,g=0.82,b=0.80]
+\definecolor [mediumvioletred] [r=0.78,g=0.08,b=0.52]
+\definecolor [midnightblue] [r=0.10,g=0.10,b=0.44]
+\definecolor [mintcream] [r=0.96,g=1.00,b=0.98]
+\definecolor [mistyrose] [r=1.00,g=0.89,b=0.88]
+\definecolor [moccasin] [r=1.00,g=0.89,b=0.71]
+\definecolor [navajowhite] [r=1.00,g=0.87,b=0.68]
+\definecolor [navy] [r=0.00,g=0.00,b=0.50]
+\definecolor [navyblue] [r=0.00,g=0.00,b=0.50]
+\definecolor [oldlace] [r=0.99,g=0.96,b=0.90]
+\definecolor [olivedrab] [r=0.42,g=0.56,b=0.14]
+\definecolor [orange] [r=1.00,g=0.65,b=0.00]
+\definecolor [orangered] [r=1.00,g=0.27,b=0.00]
+\definecolor [orchid] [r=0.85,g=0.44,b=0.84]
+\definecolor [palegoldenrod] [r=0.93,g=0.91,b=0.67]
+\definecolor [palegreen] [r=0.60,g=0.98,b=0.60]
+\definecolor [paleturquoise] [r=0.69,g=0.93,b=0.93]
+\definecolor [palevioletred] [r=0.86,g=0.44,b=0.58]
+\definecolor [papayawhip] [r=1.00,g=0.94,b=0.84]
+\definecolor [peachpuff] [r=1.00,g=0.85,b=0.73]
+\definecolor [peru] [r=0.80,g=0.52,b=0.25]
+\definecolor [pink] [r=1.00,g=0.75,b=0.80]
+\definecolor [plum] [r=0.87,g=0.63,b=0.87]
+\definecolor [powderblue] [r=0.69,g=0.88,b=0.90]
+\definecolor [purple] [r=0.63,g=0.13,b=0.94]
+\definecolor [red ] [r=1.00,g=0.00,b=0.00]
+\definecolor [rosybrown] [r=0.74,g=0.56,b=0.56]
+\definecolor [royalblue] [r=0.25,g=0.41,b=0.88]
+\definecolor [saddlebrown] [r=0.55,g=0.27,b=0.07]
+\definecolor [salmon] [r=0.98,g=0.50,b=0.45]
+\definecolor [sandybrown] [r=0.96,g=0.64,b=0.38]
+\definecolor [seagreen] [r=0.18,g=0.55,b=0.34]
+\definecolor [seashell] [r=1.00,g=0.96,b=0.93]
+\definecolor [sienna] [r=0.63,g=0.32,b=0.18]
+\definecolor [skyblue] [r=0.53,g=0.81,b=0.92]
+\definecolor [slateblue] [r=0.42,g=0.35,b=0.80]
+\definecolor [snow] [r=1.00,g=0.98,b=0.98]
+\definecolor [springgreen] [r=0.00,g=1.00,b=0.50]
+\definecolor [steelblue] [r=0.27,g=0.51,b=0.71]
+\definecolor [tan ] [r=0.82,g=0.71,b=0.55]
+\definecolor [thistle] [r=0.85,g=0.75,b=0.85]
+\definecolor [tomato] [r=1.00,g=0.39,b=0.28]
+\definecolor [turquoise] [r=0.25,g=0.88,b=0.82]
+\definecolor [violet] [r=0.93,g=0.51,b=0.93]
+\definecolor [violetred] [r=0.82,g=0.13,b=0.56]
+\definecolor [wheat] [r=0.96,g=0.87,b=0.70]
+\definecolor [white] [r=1.00,g=1.00,b=1.00]
+\definecolor [whitesmoke] [s=0.96] % [r=0.96,g=0.96,b=0.96]
+\definecolor [yellow] [r=1.00,g=1.00,b=0.00]
+\definecolor [yellowgreen] [r=0.60,g=0.80,b=0.20]
+
+\endinput
diff --git a/tex/context/base/cont-cs.tex b/tex/context/base/cont-cs.tex
new file mode 100644
index 000000000..f878920aa
--- /dev/null
+++ b/tex/context/base/cont-cs.tex
@@ -0,0 +1,39 @@
+%D \module
+%D [ file=cont-cs,
+%D version=1998.12.02,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Czech 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{czech}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!cs]
+
+\loaduserspecifications
+
+\installlanguage [\s!en] [\c!state=\v!start]
+\installlanguage [\s!de] [\c!state=\v!start]
+\installlanguage [\s!sk] [\c!state=\v!start]
+\installlanguage [\s!cs] [\c!state=\v!start]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-de.tex b/tex/context/base/cont-de.tex
new file mode 100644
index 000000000..460ca7eca
--- /dev/null
+++ b/tex/context/base/cont-de.tex
@@ -0,0 +1,44 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ German 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{german}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!de]
+
+\loaduserspecifications
+
+\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!nl] [\c!state=\v!start]
+\installlanguage [\s!it] [\c!state=\v!start]
+
+\installlanguage [deo] [\c!state=\v!start]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-en.tex b/tex/context/base/cont-en.tex
new file mode 100644
index 000000000..e2b09ecbe
--- /dev/null
+++ b/tex/context/base/cont-en.tex
@@ -0,0 +1,46 @@
+%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{english}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!en]
+
+\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!pt] [\c!state=\v!start]
+\installlanguage [\s!it] [\c!state=\v!start]
+\installlanguage [\s!nl] [\c!state=\v!start]
+\installlanguage [\s!cs] [\c!state=\v!start]
+\installlanguage [\s!sk] [\c!state=\v!start]
+\installlanguage [\s!pl] [\c!state=\v!start]
+
+\ifnum\texengine=\luatexengine
+% \prependtoks
+% \the \everysetupdocument
+% \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-err.tex b/tex/context/base/cont-err.tex
new file mode 100644
index 000000000..f01ce87aa
--- /dev/null
+++ b/tex/context/base/cont-err.tex
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=cont-err,
+%D version=2003.08.12,
+%D title=\CONTEXT\ System Files,
+%D subtitle=Just A warning,
+%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
+
+\writestatus\m!systems{no file 'cont-sys.tex', using 'cont-sys.rme' instead}
+
+\protect \endinput
diff --git a/tex/context/base/cont-fil.tex b/tex/context/base/cont-fil.tex
new file mode 100644
index 000000000..b295872ca
--- /dev/null
+++ b/tex/context/base/cont-fil.tex
@@ -0,0 +1,124 @@
+%D \module
+%D [ file=cont-fil,
+%D version=1997.11.15,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=File Synonyms,
+%D author=J. 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 File Synonyms}
+
+\definefilesynonym [chemie] [chemic]
+\definefilesynonym [chemics] [chemic]
+
+\definefilesynonym [unit] [units]
+\definefilesynonym [eenheid] [units]
+\definefilesynonym [einheit] [units]
+
+\definefilesynonym [pstric] [pstricks]
+\definefilesynonym [pstrick] [pstricks]
+
+\definefilesynonym [finance] [financ]
+
+\definefilesynonym [con-01] [contml] % will go away
+
+%definefilesynonym [sch-base] [sch-00]
+%definefilesynonym [sch-make] [sch-01]
+
+\definefilesynonym [dir-make] [dir-01]
+\definefilesynonym [dir-identify] [dir-05]
+
+\definefilesynonym [xml-format] [xml-01]
+\definefilesynonym [xml-pretty] [xml-02]
+\definefilesynonym [xml-analyze] [xml-11]
+
+\definefilesynonym [int-load] [set-11]
+\definefilesynonym [int-make] [set-12]
+
+\definefilesynonym [fig-base] [fig-00]
+\definefilesynonym [fig-make] [fig-01]
+\definefilesynonym [fig-fake] [fig-02]
+\definefilesynonym [fig-missing] [fig-06]
+
+\definefilesynonym [exi-interface] [exi-21]
+
+\definefilesynonym [res-make] [res-01]
+\definefilesynonym [res-base] [res-04]
+\definefilesynonym [res-crop] [res-07]
+\definefilesynonym [res-trace] [res-08]
+\definefilesynonym [res-log] [res-09]
+\definefilesynonym [res-identify] [res-12]
+
+\definefilesynonym [med-show] [res-50]
+
+\definefilesynonym [pre-general] [pre-00]
+
+\definefilesynonym [pre-original] [pre-01]
+\definefilesynonym [pre-green] [pre-02]
+\definefilesynonym [pre-funny] [pre-03]
+\definefilesynonym [pre-colorful] [pre-04]
+\definefilesynonym [pre-fuzzy] [pre-05]
+\definefilesynonym [pre-polish] [pre-06]
+\definefilesynonym [pre-spider] [pre-07]
+\definefilesynonym [pre-wonder] [pre-08]
+\definefilesynonym [pre-windows] [pre-09]
+\definefilesynonym [pre-grow] [pre-10]
+\definefilesynonym [pre-stack] [pre-11]
+\definefilesynonym [pre-arrows] [pre-12]
+\definefilesynonym [pre-writing] [pre-13]
+\definefilesynonym [pre-split] [pre-14]
+\definefilesynonym [pre-balls] [pre-15]
+\definefilesynonym [pre-knot] [pre-16]
+\definefilesynonym [pre-weird] [pre-17]
+\definefilesynonym [pre-shade] [pre-18]
+\definefilesynonym [pre-organic] [pre-19]
+\definefilesynonym [pre-speckle] [pre-20]
+\definefilesynonym [pre-zoom] [pre-21]
+\definefilesynonym [pre-cycle] [pre-22]
+\definefilesynonym [pre-super] [pre-23]
+
+%definefilesynonym [pre-more] [pre-24]
+%definefilesynonym [pre-more] [pre-25]
+
+\definefilesynonym [pre-more] [pre-26]
+
+%definefilesynonym [pre-more] [pre-27]
+%definefilesynonym [pre-more] [pre-28]
+%definefilesynonym [pre-more] [pre-29]
+%definefilesynonym [pre-more] [pre-30]
+
+\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]
+
+\definefilesynonym [chinese] [chi-00]
+\definefilesynonym [japanese] [jap-00]
+
+%definefilesynonym [chi-simplified] [chi-01]
+%definefilesynonym [chi-traditional] [chi-02]
+
+\definefilesynonym [greek] [grk-00]
+
+\definefilesynonym [unic-chi] [unic-cjk]
+\definefilesynonym [unic-jap] [unic-cjk]
+
+%definefilesynonym [practexjournal] [ptj-01]
+\definefilesynonym [pracjourn] [ptj-01]
+
+\definefilesynonym [maps] [map-10]
+\definefilesynonym [map-se] [map-10] % for some time
+
+\definefilesynonym [mml] [mathml]
+\definefilesynonym [cml] [chemml]
+
+\endinput
diff --git a/tex/context/base/cont-fr.tex b/tex/context/base/cont-fr.tex
new file mode 100644
index 000000000..d812b28f9
--- /dev/null
+++ b/tex/context/base/cont-fr.tex
@@ -0,0 +1,42 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ French 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{french}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!fr]
+
+\loaduserspecifications
+
+\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!nl] [\c!state=\v!start]
+\installlanguage [\s!it] [\c!state=\v!start]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-gb.tex b/tex/context/base/cont-gb.tex
new file mode 100644
index 000000000..99d297425
--- /dev/null
+++ b/tex/context/base/cont-gb.tex
@@ -0,0 +1,42 @@
+%D \module
+%D [ file=cont-uk,
+%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{english}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!gb]
+
+\loaduserspecifications
+
+\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!nl] [\c!state=\v!start]
+\installlanguage [\s!it] [\c!state=\v!start]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-it.tex b/tex/context/base/cont-it.tex
new file mode 100644
index 000000000..2141e3bc9
--- /dev/null
+++ b/tex/context/base/cont-it.tex
@@ -0,0 +1,41 @@
+%D \module
+%D [ file=cont-it,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Italian 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{italian}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!it]
+
+\loaduserspecifications
+
+\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]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-log.tex b/tex/context/base/cont-log.tex
new file mode 100644
index 000000000..9bfec2999
--- /dev/null
+++ b/tex/context/base/cont-log.tex
@@ -0,0 +1,359 @@
+%D \module
+%D [ file=cont-log,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=\TEX\ Logos,
+%D author=J. 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 TeX Logos}
+
+%D The system that is used to typeset this text is called \TEX,
+%D typeset with an lowered~E. From te beginning of \TEX,
+%D authors of macro packages adapted this raising and lowering
+%D style. In this module we define some of those logos.
+%D Watch the \type{cmr} detection hack.
+
+\unprotect
+
+\defconvertedargument\someCMRfont{cmr} % hm, we now have lm
+
+% \def\doifCMRfontelse#1#2%
+% {\doifinstringelse{\someCMRfont}{\fontname\font}
+% {\def\next{#1}}
+% {\def\next{#2}}%
+% \next}
+
+\def\doifCMRfontelse
+ {\doifinstringelse\someCMRfont{\fontname\font}}
+
+\unexpanded\def\CMRkern
+ {\doifCMRfontelse\kern{\scratchdimen=}}
+
+% \def\TeX
+% {T%
+% \kern-.1667em\lower.5ex\hbox{E}%
+% \kern-.125emX}
+
+\def\Mkern#1%
+ {{\setbox\scratchbox\hbox{M}\kern#1\wd\scratchbox}}
+
+\unexpanded\def\TeX
+ {T%
+ \Mkern{-.1667}\lower.5ex\hbox{E}%
+ \Mkern{-.125}X}
+
+\unexpanded\def\ConTeXt
+ {C%
+ \CMRkern-.0333emo%
+ \CMRkern-.0333emn%
+% \CMRkern-.1667em\TeX%
+ \CMRkern-.0667em\TeX%
+ \CMRkern-.0333emt}
+
+\unexpanded\def\PPCHTeX
+ {ppch\TeX}
+
+\unexpanded\def\PRAGMA
+ {Pragma ADE}
+
+%\def\LaTeX
+% {L%
+% \kern-.30em\raise.3ex\hbox{\txx A}%
+% \kern-.18em\TeX}
+
+\unexpanded\def\LaTeX % requested by erik frambach
+ {{\setbox\scratchbox\hbox{L}%
+ \scratchdimen\ht\scratchbox
+ \setbox\scratchbox\hbox{\txx A}%
+ L\kern-.55\wd\scratchbox
+ \raise\scratchdimen\hbox{\lower\ht\scratchbox\copy\scratchbox}%
+ \kern-.2\wd\scratchbox\TeX}}
+
+\unexpanded\def\TaBlE
+ {T%
+ \kern-.27em\lower.5ex\hbox{A}%
+ \kern-.18emB%
+ \kern-.1em\lower.5ex\hbox{L}%
+ \kern-.075emE}
+
+\unexpanded\def\PiCTeX
+ {P%
+ \kern-.12em\lower.5ex\hbox{I}%
+ \kern-.075em C%
+ \kern-.11em\TeX}
+
+\def\AMSswitch#1%
+ {$\cal\ifdim\bodyfontsize>1.1em\scriptstyle\fi#1$}
+
+\unexpanded\def\AmSTeX
+ {\AMSswitch A%
+ \kern-.1667em\lower.5ex\hbox{\AMSswitch M}%
+ \kern-.125em\AMSswitch S%
+ -\TeX}
+
+\unexpanded\def\LamSTeX
+ {L%
+ \kern-.4em\raise.3ex\hbox{\AMSswitch A}%
+ \kern-.25em\lower.4ex\hbox{\AMSswitch M}%
+ \kern-.1em{\AMSswitch S}%
+ -\TeX}
+
+\unexpanded\def\AmSLaTeX
+ {\AMSswitch A%
+ \kern-.1667em\lower.5ex\hbox{\AMSswitch M}%
+ \kern-.125em\AMSswitch S%
+ -\LaTeX}
+
+%D Alternative \CONTEXT\ logo, first Idris S.~Hamid's version:
+%D
+%D \def\Context
+%D {{\sc C\kern -.0667emo\kern -.0667emn\kern -.0549emt\kern
+%D -.1667em\lower.5ex\hbox {e}\kern -.125emx\kern -.0549emt}}
+%D
+%D I changed this into one that adapts itself:
+
+\unexpanded\def\Context
+ {{C\kern -.0667em\getscaledglyph{.8}\empty{O\kern -.0667emN\kern
+ -.0549emT\doifitalicelse{\kern-.1em}{\kern-.1667em}\lower.5ex\hbox
+ {E}\doifitalicelse\empty{\kern-.11em}X\kern-.055emT}}}
+
+%D The \METAFONT\ and \METAPOST\ logos adapt themselves to the
+%D current fontsize, an ugly but usefull hack.
+
+% rather hard coded
+%
+% \loadmapfile[original-base.map] % \loadmapfile[original-vogel-symbol]
+%
+% \unexpanded\def\setMFPfont
+% {\font\logofont=logo%
+% \ifnum\fam=\bffam\c!bf\else
+% \ifnum\fam=\slfam\c!sl\else
+% \ifnum\fam=\itfam\c!sl\else
+% \ifnum\fam=\bsfam\c!bf\else
+% \ifnum\fam=\bifam\c!bf\else
+% \fi\fi\fi\fi\fi
+% 10 at \currentfontscale\bodyfontsize
+% \logofont}
+%
+% or:
+%
+% \definefontsynonym [MetaLogo] [logo10]
+% \definefontsynonym [MetaLogoBold] [logobf10]
+% \definefontsynonym [MetaLogoSlanted] [logosl10]
+% \definefontsynonym [MetaLogoItalic] [logosl10]
+% \definefontsynonym [MetaLogoBoldSlanted] [logobf10]
+% \definefontsynonym [MetaLogoBoldtalic] [logobf10]
+%
+% \loadmapfile[original-base.map] % \loadmapfile[original-vogel-symbol]
+%
+% \def\setMFPfont{\symbolicfont{MetaLogo}}
+
+\let\logofont\nullfont
+
+\loadmapfile[original-base.map]
+
+\unexpanded\def\setMFPfont% more sensitive for low level changes
+ {\font\logofont=logo%
+ \ifx\fontalternative\c!bf\else
+ \ifx\fontalternative\c!it\else
+ \ifx\fontalternative\c!sl\else
+ \ifx\fontalternative\c!bi\else
+ \ifx\fontalternative\c!bs\else
+ \fi\fi\fi\fi\fi
+ 10 at \currentfontscale\bodyfontsize
+ \logofont}
+
+%\unexpanded\def\MetaFont%
+% {\hbox{\setMFPfont METAFONT}}
+%
+%\unexpanded\def\MetaPost%
+% {\hbox{\setMFPfont METAPOST}}
+
+\def\MetaHyphen% there is no hyphenchar in this font
+ {\discretionary{\vrule\!!height.33em\!!depth-.27em\!!width.33em}{}{}}
+
+\unexpanded\def\MetaFont
+ {{\setMFPfont META\MetaHyphen FONT}}
+
+\unexpanded\def\MetaPost
+ {{\setMFPfont META\MetaHyphen POST}}
+
+\unexpanded\def\MetaFun
+ {MetaFun}
+
+%D \macros
+%D {TEX, METAFONT, METAPOST, METAFUN,
+%D PICTEX, TABLE,
+%D CONTEXT, PPCHTEX,
+%D AMSTEX, LATEX, LAMSTEX}
+%D
+%D We define the funny written ones as well as th eless
+%D error prone upper case names (in \CONTEXT\ we tend to
+%D write all user defined commands, like abbreviations, in
+%D uppercase.)
+
+\unexpanded\def\METAFONT {\MetaFont}
+\unexpanded\def\METAPOST {\MetaPost}
+\unexpanded\def\PPCHTEX {\PPCHTeX}
+\unexpanded\def\CONTEXT {\ConTeXt}
+\unexpanded\def\METAFUN {\MetaFun}
+
+\unexpanded\def\TEX {\TeX}
+\unexpanded\def\LATEX {\LaTeX}
+\unexpanded\def\PICTEX {\PiCTeX}
+\unexpanded\def\TABLE {\TaBlE}
+\unexpanded\def\AMSTEX {\AmSTeX}
+\unexpanded\def\LAMSTEX {\LamSTeX}
+\unexpanded\def\INRSTEX {inrs\TeX}
+
+%D And this is how they show up: \TeX, \MetaFont, \MetaPost,
+%D \PiCTeX, \TaBlE, \ConTeXt, \PPCHTeX, \AmSTeX, \LaTeX,
+%D \LamSTeX.
+
+% \def\TEXEDIT {\TeX edit}
+% \def\TEXFORM {\TeX form}
+% \def\TEXADRES {\TeX adres}
+% \def\TEXSPELL {\TeX spell}
+% \def\TEXUTIL {\TeX util}
+% \def\TEXEXEC {\TeX exec}
+
+%D Some placeholders:
+
+\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX}
+\unexpanded\def\pdfTeX {pdf\TeX}
+\unexpanded\def\pdfeTeX{pdfe-\TeX}
+\unexpanded\def\luaTeX {lua\TeX}
+\unexpanded\def\metaTeX{meta\TeX}
+\unexpanded\def\XeTeX {X\lower.5ex\hbox{\kern-.15em\mirror{E}}\kern-.1667em\TeX}
+
+% Better, since lm has a mirrored E (don't ask me why)
+
+% \unexpanded\def\XeTeX
+% {X\lower.5ex
+% \hbox
+% {\kern-.15em
+% \ifx\XeTeXcharglyph\undefined
+% \mirror{E}%
+% \else\ifcase\XeTeXcharglyph"018E\relax
+% \mirror{E}%
+% \else
+% \char"018E%
+% \fi}%
+% \kern-.1667em \TeX}
+
+% Adapted from a patch by Mojca:
+
+\def\@XeTeX@
+ {\setbox\scratchbox\hbox{E}%
+ \raise\dimexpr\ht\scratchbox+\dp\scratchbox\relax\hbox{\rotate[\c!rotation=180]{\box\scratchbox}}}
+
+\ifnum\texengine=\pdftexengine
+
+ \unexpanded\def\XeTeX
+ {X\lower.5ex
+ \hbox
+ {\kern-.15em
+ \ifx\fontalternative\c!bf\mirror{E}\else
+ \ifx\fontalternative\c!it \@XeTeX@\else
+ \ifx\fontalternative\c!sl \@XeTeX@\else
+ \ifx\fontalternative\c!bi \@XeTeX@\else
+ \ifx\fontalternative\c!bs \@XeTeX@\else
+ \mirror{E}\fi\fi\fi\fi\fi}%
+ \kern-.1667em \TeX}
+
+\else
+
+ \unexpanded\def\XeTeX
+ {X\lower.5ex
+ \hbox
+ {\kern-.15em
+ \iffontchar\font"018E\relax
+ \char"018E%
+ \else
+ \ifx\fontalternative\c!bf\mirror{E}\else
+ \ifx\fontalternative\c!it \@XeTeX@\else
+ \ifx\fontalternative\c!sl \@XeTeX@\else
+ \ifx\fontalternative\c!bi \@XeTeX@\else
+ \ifx\fontalternative\c!bs \@XeTeX@\else
+ \mirror{E}\fi\fi\fi\fi\fi
+ \fi}%
+ \kern-.1667em \TeX}
+
+\fi
+
+\let\ETEX \eTeX
+\let\PDFTEX \pdfTeX
+\let\PDFETEX\pdfeTeX
+\let\LUATEX \luaTeX
+\let\LuaTeX \luaTeX
+\let\XETEX \XeTeX
+
+\unexpanded\def\MkApproved
+ {\dontleavehmode\rotate
+ [\c!rotation={\ifnum\texengine=\luatexengine\ctxlua{tex.write(45-45*\the\luatexversion/100)}\else0\fi},
+ \c!align=\v!middle,
+ \c!foregroundstyle=\v!type,
+ \c!foregroundcolor=darkred,
+ \c!frame=\v!on,
+ \c!offset=1ex,
+ \c!background=\v!color,
+ \c!backgroundcolor=lightgray,
+ \c!framecolor=darkred,
+ \c!rulethickness=2pt]
+ {Mk\ifnum\texengine=\luatexengine IV\else II\fi\\approved}}
+
+
+% \unexpanded\def\luaTeX
+% {\dontleavehmode\begingroup
+% Lua%
+% \setbox0\hbox{oT}%
+% \setbox2\hbox{o\kern0ptT}%
+% \ifdim\wd0=\wd2
+% \setbox0\hbox dir TRT{To}%
+% \setbox2\hbox{T\kern0pto}%
+% \hskip\dimexpr\wd0-\wd2\relax
+% \fi
+% \TeX
+% \endgroup}
+%
+% a further iteration from the list, patched again
+
+% \ifx\fontalternative\c!it -\else
+% \ifx\fontalternative\c!sl -\else
+% \ifx\fontalternative\c!bi -\else
+% \ifx\fontalternative\c!bs -\fi\fi\fi\fi
+
+\def\LuaTeX
+ {\dontleavehmode
+ \begingroup
+ Lua%
+ % hope for kerning, try aT
+ \setbox0\hbox{aT}%
+ \setbox2\hbox{a\kern\zeropoint T}%
+ \ifdim\wd0=\wd2 % kerns can go two ways
+ % no aT kerning, try oT as a is not symmetrical
+ \setbox0\hbox{oT}%
+ \setbox2\hbox{o\kern\zeropoint T}%
+ \ifdim\wd0=\wd2 % kerns can go two ways
+ % no aT and oT kerning, try To
+ \setbox0\hbox{To}%
+ \setbox2\hbox{T\kern\zeropoint o}%
+ % maybe we need to compensate for the angle (sl/it/bs/bi)
+ \fi
+ \ifdim\wd0=\wd2\else
+ \kern\dimexpr\wd0-\wd2\relax
+ \fi
+ \fi
+ \TeX
+ \endgroup}
+
+\let\luaTeX \LuaTeX
+\let\LUATEX \LuaTeX
+
+\protect \endinput
diff --git a/tex/context/base/cont-mtx.tex b/tex/context/base/cont-mtx.tex
new file mode 100644
index 000000000..833785a7f
--- /dev/null
+++ b/tex/context/base/cont-mtx.tex
@@ -0,0 +1,25 @@
+%D \module
+%D [ file=cont-mtx,
+%D version=2006.01.01, % no date -)
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=Experimental MetaTeX Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% format generation : texexec --make --all --luatex
+%
+% pdftex compatible run : texexec --luatex filename
+% aleph compatible run : texexec --luatex --output=dvipdfmx filename
+%
+% or, at top of tex file : % engine=luatex
+
+% \loadcorefile{meta-xxx.tex}
+
+%D Here we load files that are not yet part of the core.
+
+\endinput
diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
new file mode 100644
index 000000000..2defba6d7
--- /dev/null
+++ b/tex/context/base/cont-new.mkii
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=cont-new,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=New Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\enablemode[mkii]
+
+\long\def\startluacode#1\stopluacode{}
+\long\def\ctxlua #1{}
+
+\def\enabletrackers [#1]{}
+\def\disabletrackers[#1]{}
+
+\endinput
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
new file mode 100644
index 000000000..6269e5a61
--- /dev/null
+++ b/tex/context/base/cont-new.mkiv
@@ -0,0 +1,40 @@
+%D \module
+%D [ file=cont-new,
+%D version=2006.10.04,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=New Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% potential new defaults:
+%
+% \setbreakpoints[compound]
+
+\unprotect
+
+\ctxlua{logs.report = commands.report} % this will become default
+
+\def\immediatemessage#1{\ctxlua{commands.writestatus("message","#1")}}
+
+% we need to figure this out (to be discussed)
+
+\unexpanded\def\textminus
+ {\char \iffontchar\font"2012 "2012 % figuredash
+ \else\iffontchar\font"2013 "2013 % endash
+ \else\iffontchar\font"2212 "2212 % math minus
+ "002D % hyphen
+ \fi\fi\fi}
+
+\unexpanded\def\textplus
+ {\char"002B } % plus
+
+% till we fixed all styles
+
+\let\\=\crlf
+
+\protect \endinput
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
new file mode 100644
index 000000000..9c4fdba18
--- /dev/null
+++ b/tex/context/base/cont-new.tex
@@ -0,0 +1,992 @@
+%D \module
+%D [ file=cont-new,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=New Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\newcontextversion{2010.05.24 13:05}
+
+%D This file is loaded at runtime, thereby providing an
+%D excellent place for hacks, patches, extensions and new
+%D features.
+
+\unprotect
+
+% it's about time to clean up this file ...
+
+\writestatus\m!systems{beware: some patches loaded from cont-new.tex}
+
+% \ifx\pdfmapfile \undefined \else \pdfmapfile{ } \fi
+
+% \font\f=dummyfont \rpcode\f0=500 \hbox{..}\char0
+% todo: mp-new
+% caption: grid=top|bottom in xml defs
+
+\def\fastscale#1%
+ {\begingroup
+ \ifnum#1=1000\relax
+ \setfalse\scaleboxdone
+ \else
+ \settrue\scaleboxdone
+ \edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1pt/1000\relax}%
+ \let\finalscaleboxyscale\finalscaleboxxscale
+ \fi
+ \dowithnextbox{\doscaleboxindeed\flushnextbox\endgroup}\hbox}
+
+% \setupcaption [figure] [align=flushleft]
+% \setupcaption [figure-1] [align=flushleft,leftmargin=10mm]
+% \setupcaption [figure-2] [align=flushleft,leftmargin=10mm,rightmargin=-10mm,width=\textwidth]
+%
+% \startsetups somefigure
+% \ifdim\floatsetupwidth>\textwidth
+% \placesetupfloat[figure-2]
+% \else
+% \placesetupfloat[figure-1]
+% \fi
+% \stopsetups
+%
+% \placefloatwithsetups[somefigure]{}{\externalfigure[dummy][width=5cm,height=2cm]}
+
+\def\placefloatwithsetups
+ {\dotripleempty\doplacefloatwithsetups}
+
+\long\def\doplacefloatwithsetups[#1][#2][#3]#4%
+ {\def\floatsetupcaption {#4}%
+ \def\floatsetupcontent {\copy\nextbox}%
+ \def\floatsetupwidth {\wd\nextbox}%
+ \def\floatsetupheight {\ht\nextbox}%
+ \def\placesetupfloat[##1]{\placefloat[##1][#2][#3]{#4}{\floatsetupcontent}}% #4 and not \floatsetupcaption (unexpanded)
+ \dowithnextbox{\setups[#1]}\vbox}
+
+\def\dividedsize#1#2#3% size gap n
+ {\dimexpr
+ \ifnum\dimexpr#1\relax>\plusone
+ (\dimexpr#1\relax-\numexpr#3-1\relax\dimexpr#2\relax)/#3\else#1%
+ \fi
+ \relax}
+
+% \setuplabeltext[\s!itemcount1={{I(},{)}}]
+% \def\labeledcountervalue#1{\labeltexts{#1}{\countervalue{#1}}}
+
+\def\singlewidened #1{\hbox spread 1em{\hss#1\hss}}
+\def\complexwidened[#1]#2{\hbox spread #1{\hss#2\hss}}
+
+\definecomplexorsimple\widened
+
+% todo
+%
+% \def\definelocation{\dodoubleargument\dodefinelocation}
+% \def\dodefinelocation[#1][#2]{\setvalue{loc:#1}{#2}}
+%
+% \definelocation[lt] [\v!left\v!top]
+% \definelocation[tl] [\v!left\v!top]
+% \definelocation[\v!top\v!left][\v!left\v!top]
+%
+% \def\getlocation#1{\executeifdefined{loc:#1}{#1}}
+
+% just in case we load something from a file (pdfr-ec for instance)
+
+\prependtoks \restoreendofline \to \everybeforeshipout
+
+\let\cs\getvalue
+
+% experimental so this may change
+
+\def\startdescriptions
+ {\dosingleempty\dostartdescriptions}
+
+\def\dostartdescriptions[#1]%
+ {\begingroup
+ \def\item{\getvalue{#1}}%
+ \let\dostoppairdescription \donothing
+ \let\@@description \dostartpairdescription
+ \let\@@startsomedescription\dostartsomedescription}
+
+\def\stopdescriptions
+ {\dostoppairdescription
+ \endgroup}
+
+\def\dostartpairdescription[#1][#2]%
+ {\dostoppairdescription
+ \def\dostoppairdescription{\@@stopdescription{#1}}%
+ \bgroup
+ \def\currentdescription{#1}%
+ \doifelse{\descriptionparameter{\s!do\c!state}}\v!start
+ {\@@makedescription{#1}[#2]{}}
+ {\@@makedescription{#1}[#2]}}
+
+\def\dostartsomedescription% #1[#2]#3%
+ {\bgroup
+ \@@makedescription} % {#1}[#2]{#3}}
+
+% \starttext
+%
+% \definedescription[test]
+%
+% \startdescriptions
+% \test{Foo} Bar bar bar
+% \test{Foo} Bar bar bar
+% \test{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \startdescriptions[test]
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \startdescriptions
+% \starttest{Foo} Bar bar bar \stoptest
+% \starttest{Foo} Bar bar bar \stoptest
+% \starttest{Foo} Bar bar bar \stoptest
+% \stopdescriptions
+%
+% \startdescriptions[test]
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \stoptext
+
+% to do:
+%
+% \def\defineshapesynonym
+% {\dodoubleargument\dodefineshapesynonym}
+%
+% \def\dodefineshapesynonym[#1][#2]%
+% {\setvalue{shsy:#1}{#2}}
+%
+% \def\shapesynonym#1%
+% {\ifcsname shsy:#1\endcsname
+% \expandafter\shapesynonym\csname shsy:#1\endcsname\else#1%
+% \fi}
+%
+%\defineshapesynonym[eacute] [e]
+%\defineshapesynonym[egrave] [e]
+%\defineshapesynonym[eumlaut [e]
+%\defineshapesynonym[eogonek][e]
+%
+% more reduction
+%
+%\defineshapesynonym[e][o]
+%\defineshapesynonym[w][v]
+%\defineshapesynonym[m][n]
+%
+% \shapesynonym{eacute}
+
+% this will be activated when
+
+% \newinsert\thispageinsert % <- installinsertion
+
+% \def\flushatthispage
+% {\bgroup
+% \dowithnextbox{\insert\thispageinsert{\box\nextbox}\egroup}%
+% \hbox}
+
+% \appendtoks
+% \ifvoid\thispageinsert\else\hbox{\smashedbox\thispageinsert}\fi
+% \to \everyshipout
+
+% \definemarkedpage[nobackgrounds]
+% \markpage[nobackgrounds]
+% \doifmarkedpageelse{nobackgrounds}
+
+\newcounter\nofmarkedpages
+
+\def\definemarkedpage[#1]%
+ {\definetwopasslist{\v!page:#1}}
+
+\def\markpage[#1]% looks very much like domarginreference
+ {\iftrialtypesetting\else
+ \doglobal\increment\nofmarkedpages\relax
+ \lazysavetwopassdata{\v!page:#1}{\nofmarkedpages}{\noexpand\realfolio}%
+ \fi}
+
+\def\doifmarkedpageelse#1%
+ {\gettwopassdatalist{\v!page:#1}%
+ \expanded{\doifinsetelse{\realfolio}{\twopassdatalist}}}
+
+% Just a simple and fast hanger, for usage in macros.
+
+\def\setuphanging
+ {\dodoubleempty\getparameters[\??ha]}
+
+\setuphanging
+ [\c!distance=.5em]
+
+\def\starthanging
+ {\noindent\bgroup
+ \dowithnextbox
+ {\setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
+ \hangindent\nextboxwd
+ \hangafter\plusone
+ \flushnextbox\ignorespaces}
+ \hbox}
+
+\def\stophanging
+ {\endgraf
+ \egroup}
+
+% experimental
+
+\def\stophangaround
+ {\endgraf
+ \egroup}
+
+\def\starthangaround
+ {\noindent\bgroup
+ \dowithnextbox
+ {\ifdim\nextboxht>\strutht\setbox\nextbox\tbox{\flushnextbox}\fi
+ \setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
+ \getboxheight\scratchdimen\of\box\nextbox
+ \getnoflines\scratchdimen
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \hangindent\nextboxwd
+ \hangafter-\noflines
+ \llap{\flushnextbox}\ignorespaces}
+ \hbox}
+
+\def\modevalue#1#2#3%
+ {\@EA\ifx\csname\@mode@\systemmodeprefix#1\endcsname\endcsname\enabledmode#2\else#2\fi}
+
+\def\systemmodevalue#1%
+ {\modevalue{\systemmodeprefix#1}}
+
+% \getmulticolumnlines -> now in cont-loc, to be tested and really needed
+
+% \tracefonthandlingtrue
+
+% new, still to be improved
+%
+% \dorecurse{10}
+% {\input thuan
+% \placefigure{}{\framed[height=1.5cm]{test}}
+% \placefloatplaceholder}
+
+\def\placefloatplaceholder
+ {\ifroomforfloat \else
+ \scratchdimen\pagegoal
+ \advance\scratchdimen-\pagetotal
+ \advance\scratchdimen-3\lineheight
+ \ifdim\scratchdimen>\zeropoint
+ \startlinecorrection[blank]
+ \mhbox{\inframed{\labeltexts{placeholder}{\lastcaptiontag}}}%
+ \stoplinecorrection
+ \else
+ \allowbreak
+ \fi
+ \fi}
+
+\setuplabeltext
+ [placeholder={, moved}]
+
+% etex only, of course we could just parse (scan for \% in string)
+
+\newif\ifpercentdimendone
+
+\bgroup % usage: \setpercentdimen\somedimen{% or dimen} todo: pct
+\catcode124=\@@comment
+\catcode 37=\@@active
+\gdef\setpercentdimen#1#2|
+ {\xdef\@@expanded{#2}|
+ \ifx\@@expanded\empty\else
+ \bgroup
+ \global\percentdimendonefalse
+ \def\%{\dimexpr#1/100\relax\global\percentdimendonetrue\ignorespaces}| scantokens add's a space
+ \catcode`%=\@@active
+ \catcode`\\=\@@escape
+ \let%\%|
+ \scratchdimen#1|
+ \xdef\@@expanded{\@@expanded\scratchdimen\!!zeropoint}| trick: when 1.2 => .2\scratchdimen and 0pt typeset
+ \startnointerference
+ \global\globalscratchdimen\scantokens\@EA{\@@expanded}| i'm lazy and use etex
+ \stopnointerference
+ \egroup
+ #1\globalscratchdimen
+ \fi}
+\egroup
+
+% TEX alternative, in principle accurate enough and also a bit faster
+
+% \bgroup
+%
+% \catcode`\%=\@@other
+% \catcode`\|=\@@comment
+%
+% \gdef\setpercentdimen#1#2|
+% {\beforesplitstring#2\at%\to\ascii
+% \doifelse\ascii{#2}
+% {#1=#2}
+% {\divide#1by100\relax#1=\ascii#1\relax}} | or: {#1=\ascii#1\divide#1by100\relax}}
+%
+% \egroup
+%
+% \dimen0=1000pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 100pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 95pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 10pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 1pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+
+\bgroup
+
+\obeylines % don't remove %'s !
+
+\gdef\collapsedspace#1%
+ {\ifx#1^^M%
+ \expandafter\collapsedspace
+ \else
+ \space
+ \expandafter#1%
+ \fi}
+
+\gdef\collapsespaces
+ {\prependtoksonce\relax\to\everyeof%
+ \ignorelines%
+ \ignoretabs%
+ \let\obeyedspace\collapsedspace%
+ \obeyspaces}
+
+\egroup
+
+\def\inlinedbox
+ {\bgroup
+ \dowithnextbox
+ {\scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \advance\scratchdimen-\lineheight
+ \divide\scratchdimen\plustwo
+ \advance\scratchdimen\strutdepth
+ \setbox\nextbox\hbox{\lower\scratchdimen\flushnextbox}%
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \flushnextbox
+ \egroup}%
+ \hbox}
+
+% \readfile{cont-exp}\donothing\donothing % speed up (5-20%)
+
+\def\dimenratio#1#2% etex only
+ {\withoutpt\the\dimexpr2\dimexpr(#1)/\dimexpr(#2)/32768\relax\relax}
+
+\def\doxprecurse#1#2%
+ {\ifnum#1=\zerocount % no \ifcase
+ \expandafter\gobblethreearguments
+ \else
+ #2\expandafter\expandafter\expandafter\doxprecurse\expandafter
+ \fi\expandafter{\the\numexpr#1-1\relax}{#2}}
+
+\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
+
+\unexpanded\def\asciistr#1{\dontleavehmode{\defconvertedargument\ascii{#1}\verbatimfont\ascii}}
+
+\def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
+
+\let\normaltype\type
+
+\ifx\scantextokens\undefined
+ \ifx\scantokens\undefined
+ \unexpanded\def\retype#1{\dontleavehmode{\defconvertedargument\ascii{#1}\@EA\normaltype\@EA{\ascii}}}
+ \else
+ \unexpanded\def\retype#1{\dontleavehmode\scantokens{\normaltype{#1}\ignorespaces}\relax}
+ \fi
+\else
+ \unexpanded\def\retype#1{\dontleavehmode\scantextokens{\normaltype{#1}}}
+\fi
+
+\def\simplifytype{\let\type\retype}
+
+% \ruledhbox
+% {\startignorespaces
+% \def\oeps{a}
+% \startignorespaces
+% \def\oeps{a}
+% \stopignorespaces
+% \def\oeps{a}
+% \stopignorespaces
+% \oeps}
+
+\newsignal\boissignal
+\newcount \boislevel
+
+\long\def\startignorespaces
+ {\advance\boislevel\plusone
+ \ifcase\boislevel\or \ifhmode
+ \hskip\boissignal
+ \fi \fi
+ \ignorespaces}
+
+\long\def\stopignorespaces
+ {\ifcase\boislevel\or \ifhmode
+ \doloop
+ {\ifdim\lastskip=\zeropoint
+ \exitloop
+ \else\ifdim\lastskip=\boissignal
+ \unskip
+ \exitloop
+ \else
+ \unskip
+ \fi\fi}%
+ \fi \fi
+ \advance\boislevel\minusone}
+
+\def\minimalhbox#1#%
+ {\dowithnextbox
+ {\bgroup
+ \setbox\scratchbox\hbox#1{\hss}%
+ \ifdim\nextboxwd<\wd\scratchbox\nextboxwd\wd\scratchbox\fi
+ \flushnextbox
+ \egroup}
+ \hbox}
+
+% \def\dodimchoice#1#2#3%
+% {\ifx#3\relax
+% #1\@EA\gobbleuntilrelax
+% \else\ifdim#1#2%
+% #3\@EAEAEA\gobbleuntilrelax
+% \else
+% \@EAEAEA\dodimchoice
+% \fi\fi{#1}}
+
+% \def\donumchoice#1#2#3%
+% {\ifx#3\relax
+% #1\@EA\gobbleuntilrelax
+% \else\ifnum#1#2%
+% #3\@EAEAEA\gobbleuntilrelax
+% \else
+% \@EAEAEA\dodimchoice
+% \fi\fi{#1}}
+
+% \def\dimchoice#1#2{\dodimchoice{#1}#2\empty\relax}
+% \def\numchoice#1#2{\donumchoice{#1}#2\empty\relax}
+
+\def\gobbleuntilempty#1\empty{}
+
+\def\dodimchoice#1#2#3%
+ {\ifdim#1#2%
+ #3\@EA\gobbleuntilempty
+ \else
+ \@EA\dodimchoice
+ \fi{#1}}
+
+\def\donumchoice#1#2#3%
+ {\ifnum#1#2%
+ #3\@EA\gobbleuntilempty
+ \else
+ \@EA\dodimchoice
+ \fi{#1}}
+
+\def\dimchoice#1#2{\dodimchoice{#1}#2{=#1}{#1}\empty}
+\def\numchoice#1#2{\donumchoice{#1}#2{=#1}{#1}\empty}
+
+% \the\dimexpr(\dimchoice {7pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+% \the\dimexpr(\dimchoice{11pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+% \the\dimexpr(\dimchoice{14pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+
+\def\showsetupsdefinition[#1]{\showvalue{\??su:#1}} % temp hack for debugging
+
+% documentation : \setupregister[alternative=a|b|A|B]
+\unprotected \def\traceposstring#1#2#3%
+ {\iftracepositions
+ \smashedhbox%
+ {#1{\infofont#2#3}%
+ \scratchdimen.5\points
+ \kern-2\scratchdimen
+ \vrule\!!width4\scratchdimen\!!height\scratchdimen\!!depth\scratchdimen}%
+ \fi}
+
+% will be a MyWay
+%
+% \setuplayout[grid=yes] \setupcaption[figure][inbetween=] \useMPlibrary[dum] \setupcolors[state=start]
+%
+% \starttext \showgrid \showstruts
+%
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
+% \input ward
+%
+% \stoptext
+
+% funny, as field action with e.g. dissolve ... only the field dissolves, bug?
+
+\setglobalsystemreference\rt!exec{Transition}{transition}
+
+%def\PDFexecutetransition {/Trans /Trans <</Type /Trans \executeifdefined{PDFpage\argumentA}\PDFpagereplace>>}
+\def\PDFexecutetransition {/Trans /Trans <<\executeifdefined{PDFpage\argumentA}\PDFpagereplace>>}
+
+% new, continuous blocks, \som \par \startdoorlopendblok ...
+
+% \startitemize
+% \item bagger
+% \item bagger
+% \item \startdoorlopendblok bagger \stopdoorlopendblok
+% \item \endgraf \startdoorlopendblok bagger \stopdoorlopendblok
+% \item \endgraf \startdoorlopendblok \strut bagger \stopdoorlopendblok
+% \item \startdoorlopendblok
+% \starttabulate
+% \NC test \NC test \NC \NR
+% \NC test \NC test \NC \NR
+% \NC test \NC test \NC \NR
+% \stoptabulate
+% \stopdoorlopendblok
+% \item test
+% \stopitemize
+
+\def\startdoorlopendblok % for special cases, don't change it too much and don't rely on it
+ {\ifhmode\endgraf\nobreak\fi % don't remove the \nobreak
+ \dowithnextboxcontent
+ {\setlocalhsize \hsize\localhsize \forgetall}
+ {\bgroup
+ \forgeteverypar
+ \forgetparskip
+ \scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \getnoflines\scratchdimen
+ \advance\scratchdimen-\strutheight
+ \setbox\nextbox\hbox{\lower\scratchdimen\box\nextbox}%
+ \ht\nextbox\strutheight
+ \dp\nextbox\strutdepth
+ \setbox\nextbox\vbox
+ {\indent\box\nextbox
+ \endgraf
+ \nobreak
+ \advance\noflines\minusone
+ \dorecurse\noflines{\crlf\nobreak}}%
+ \verticalstrut
+ \endgraf
+ \nobreak
+ \offinterlineskip
+ \kern-2\lineheight % 2\lineheight when no vertical struts in main \vbox
+ \nobreak
+ \unvbox\nextbox
+ \prevdepth\strutdepth
+ % evt (eerst testen) een signal zodat een direct volgend blok goed gaat)
+ \egroup}
+ \vbox\bgroup
+ \vskip-\lineheight \verticalstrut\endgraf
+ \insidefloattrue
+ \doinhibitblank} % beware, no \inhibitblank ! ! ! ! ! !
+
+\def\stopdoorlopendblok
+ {\endgraf\verticalstrut\endgraf\kern-2\lineheight
+ \egroup}
+
+\def\tabulaterule % to be redone, not correct
+ {\dotabulaterule
+ {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
+ \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
+ {\kern-\scratchdimen}}} % experimental tm-prikkels
+
+% experimental: \synchronizegrid bla bla bla
+
+\newcounter\currentgridsync
+
+\def\gridsynctag{grs:\currentgridsync}
+
+\def\synchronizegrid
+ {\doglobal\increment\currentgridsync
+ \par\prevdepth\zeropoint
+ \nointerlineskip
+ \hpos\gridsynctag{\strut}\par
+ \vskip-\lineheight
+ \nointerlineskip
+ % top of text
+ \scratchdimen\MPy{\v!text:\MPp\gridsynctag}%
+ \advance\scratchdimen\MPh{\v!text:\MPp\gridsynctag}%
+ % move to first baseline
+ \advance\scratchdimen-\topskip
+ % subtract wrong baseline
+ \advance\scratchdimen-\MPy\gridsynctag
+ % get minimal number of lines
+ \advance\scratchdimen\lineheight
+ \getnoflines\scratchdimen
+ % calculate difference
+ \advance\scratchdimen-\noflines\lineheight\relax
+ \scratchdimen-\scratchdimen\relax
+ \ifdim\scratchdimen>\zeropoint
+ \nointerlineskip
+ \advance\scratchdimen-\lineheight
+ \vskip\scratchdimen \dontleavehmode \quad \strut
+ \par
+ %\else
+ % \message{no grid correction: \the\scratchdimen}\wait
+ \fi}
+
+% needed for extreme (will go away)
+
+\definesystemvariable{ie}
+
+\def\definetest
+ {\dodoubleempty\dodefinetest}
+
+\def\dodefinetest[#1][#2]#3%
+ {\setgvalue{\??ie#1}{#3}%
+ \ifsecondargument
+ \processaction
+ [#2]
+ [% first test true, rest depends
+ \v!next=>\setgvalue{\??ie#1}{\setgvalue{\??ie#1}{#3}\firstoftwoarguments},
+ % rest true if first true
+ % \v!first=>\setgvalue{\??ie#1}{#3{\letgvalue{\??ie#1}%
+ % \firstoftwoarguments\firstoftwoarguments}%
+ % \secondoftwoarguments},
+ % always true
+ \v!yes=>\letgvalue{\??ie#1}\firstoftwoarguments,
+ % always false
+ \v!no=>\letgvalue{\??ie#1}\secondoftwoarguments]%
+ \fi}
+
+\def\doperformtest#1%
+ {\executeifdefined{\??ie#1}\secondoftwoarguments}
+
+\def\definecolumnsethsize#1#2#3#4% will be improved/speed up
+ {\bgroup
+ \def\OTRSETidentifier{#1}%
+ \ifcase\columnsetlevel\relax
+ \mofcolumns\plusone
+ \OTRSETinitializecolumns
+ \OTRSETassignwidths
+ \OTRSETsethsize
+ \fi
+ \!!counta#2\!!countb#3\docalculatecolumnsetspan
+ \expandafter\egroup\expandafter\edef\expandafter
+ #4\expandafter{\the\!!widtha}}
+
+% so far
+
+% between alignment lines certain rules apply, and even a
+% simple test can mess up a table, which is why we have a
+% special test facility
+%
+% \ruledvbox
+% {\starttabulate[|l|p|]
+% \NC 1test \NC test \NC \NR
+% \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}%
+% \stoptabulate}
+
+\long\def\tableifelse#1%
+ {\TABLEnoalign{#1%
+ {\aftergroup \firstoftwoarguments}%
+ {\aftergroup\secondoftwoarguments}}}
+
+\long \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}}
+
+% experiment, not yet to be used
+
+\def\displaybreak
+ {\ifhmode
+ \removeunwantedspaces
+ \ifcase\raggedstatus\hfill\fi
+ \strut\penalty-9999 % \break fails on case (3)
+ \fi}
+
+\def\startdisplay{\displaybreak\ignorespaces\startpacked}
+\def\stopdisplay {\stoppacked\displaybreak\ignorespaces}
+
+\def\tightvbox{\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\vbox}
+\def\tightvtop{\dowithnextbox{\nextboxht\zeropoint\flushnextbox}\vtop}
+
+% what is this stupid macro meant for:
+
+\def\hyphenationpoint
+ {\hskip\zeropoint}
+
+\def\hyphenated#1%
+ {\bgroup
+ \!!counta\zerocount
+ \def\hyphenated##1{\advance\!!counta\plusone}%
+ \handletokens#1\with\hyphenated
+ \!!countb\plusone
+ \def\hyphenated##1%
+ {##1%
+ \advance\!!countb\plusone\relax
+ \ifnum\!!countb>2 \ifnum\!!countb<\!!counta
+ \hyphenationpoint
+ \fi\fi}%
+ \handletokens#1\with\hyphenated
+ \egroup}
+
+\def\obeysupersubletters
+ {\let\super\normalsuper
+ \let\suber\normalsuber
+ \let\normalsuper\letterhat
+ \let\normalsuber\letterunderscore
+ \enablesupersub}
+
+\def\obeysupersubmath
+ {\let\normalsuper\letterhat
+ \let\normalsuber\letterunderscore
+ \enablesupersub}
+
+%\let\normaltype\type
+%
+%\def\type#1%
+% {\expanded{\normaltype{\detokenize{#1}}}}
+
+% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
+% \definefontsynonym[OldStyle][Serif]
+% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
+
+% testen :
+%
+% \appendtoks
+% \let\registerparoptions\relax
+% \to \everyforgetall
+
+\def\startgridcorrection
+ {\dosingleempty\dostartgridcorrection}
+
+\def\dostartgridcorrection[#1]%
+ {\ifgridsnapping
+ \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
+ \snaptogrid\vbox\bgroup
+ \else
+ \startbaselinecorrection
+ \fi}
+
+\def\stopgridcorrection
+ {\ifgridsnapping
+ \egroup
+ \else
+ \stopbaselinecorrection
+ \fi}
+
+\def\checkgridsnapping
+ {\lineskip\ifgridsnapping\zeropoint\else\normallineskip\fi}
+
+\def\startplaatsen
+ {\dosingleempty\dostartplaatsen}
+
+\def\dostartplaatsen[#1]% tzt n*links etc
+ {\endgraf
+ \noindent\bgroup
+ \setlocalhsize
+ \hbox to \localhsize\bgroup
+ \doifnot{#1}\v!left\hss
+ \def\stopplaatsen
+ {\unskip\unskip\unskip
+ \doifnot{#1}\v!right\hss
+ \egroup
+ \egroup
+ \endgraf}%
+ \gobblespacetokens}
+
+% \startplaatsen[links] bla \stopplaatsen
+
+% we don't register the paragraph characteristics, only the
+% width
+
+\appendtoks
+ \setinnerparpositions % see "techniek" for application
+\to \everytabulate
+
+\def\fontclassname#1#2%
+ {\ifcsname\??ff#1#2\endcsname
+ \fontclassname{#1}{\csname\??ff#1#2\endcsname}%
+ \else\ifcsname\??ff#2\endcsname
+ \fontclassname{#1}{\csname\??ff#2\endcsname}%
+ \else
+ #2%
+ \fi\fi}
+
+\def\defineclassfontsynonym
+ {\dotripleargument\dodefineclassfontsynonym}
+
+\def\dodefineclassfontsynonym[#1][#2][#3]%
+ {\definefontsynonym[#1][\fontclassname{#2}{#3}]}
+
+%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
+%
+%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
+
+\def\startcolumnmakeup % don't change
+ {\bgroup
+ \getrawnoflines\textheight % teksthoogte kan topskip hebben, dus raw
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen-\lineheight
+ \advance\scratchdimen\topskip
+ \setbox\scratchbox
+ \ifcase\showgridstate\vbox\else\ruledvbox\fi to \scratchdimen\bgroup
+ \forgetall} % ! don't change
+
+\def\stopcolumnmakeup
+ {\egroup
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\textwidth
+ \box\scratchbox
+ \egroup
+ \synchronizehsize}
+
+\long\def\startexternalfigure
+ {\dotripleempty\dostartexternalfigure}
+
+\long\def\dostartexternalfigure[#1][#2][#3]#4\stopexternalfigure
+ {\gdef\figuredescription{#4}%
+ \externalfigure[#1][#2][#3]%
+ \globallet\figuredescription\empty}
+
+\let\figuredescription\empty
+
+%% where does this come from, old code probably
+%%
+%%
+%% \newif\ifpagechanged \let\lastchangedpage\empty
+%%
+%% \def\checkpagechange#1%
+%% {\gettwopassdata\s!paragraph
+%% \pagechangedfalse
+%% \iftwopassdatafound
+%% \ifnum\twopassdata>0\getvalue{\s!paragraph:p:#1}\relax
+%% \pagechangedtrue
+%% \fi
+%% \fi
+%% \ifpagechanged
+%% \letgvalue{\s!paragraph:p:#1}\twopassdata
+%% \globallet\lastchangedpage\twopassdata
+%% \else
+%% \globallet\lastchangedpage\realfolio
+%% \fi
+%% \doparagraphreference}
+%%
+%% \def\changedpage#1%
+%% {\getvalue{\s!paragraph:p:#1}}
+
+\newcount\nofprofiled
+
+\def\profilemacro#1%
+ {\nofprofiled\zerocount
+ \letvalue{\string#1\string#1}#1%
+ \appendtoks
+ \normalwritestatus\m!systems{profile \string#1: \number\nofprofiled}%
+ \to \everystoptext
+ \unexpanded\def#1%
+ {\global\advance\nofprofiled\plusone
+ \csname\string#1\string#1\endcsname}}
+
+% incomplete, will be a special case of float placement
+
+\def\startfixed{\dosingleempty\dostartfixed}
+
+\def\dostartfixed[#1]%
+ {\expanded{\dowithnextbox{\noexpand\dodofixed{\ifhmode0\else1\fi}{#1}}}%
+ \vbox\bgroup
+ \setlocalhsize}
+
+\def\stopfixed
+ {\egroup}
+
+\def\dodofixed#1#2%
+ {\ifcase#1\relax
+ \processaction
+ [#2]
+ [ \v!high=>\bbox {\flushnextbox},
+ \v!low=>\tbox {\flushnextbox},
+ \v!middle=>\vcenter{\flushnextbox},
+ \v!lohi=>\vcenter{\flushnextbox},
+ \s!unknown=>\tbox {\flushnextbox},
+ \s!default=>\tbox {\flushnextbox}]%
+ \else
+ \startbaselinecorrection
+ \noindent\flushnextbox
+ \stopbaselinecorrection
+ \fi}
+
+% \startitemize
+%
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+%
+% \page
+%
+% \item \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \page
+%
+% \item test \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \page
+%
+% \item test \par \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \stopitemize
+
+\def\obeyfollowingtoken{{}} % end \cs scanning
+
+% \def\comparedimension#1#2%
+% {\chardef\compresult
+% \ifdim#1<#2%
+% \zerocount
+% \else\ifdim#1<#2%
+% \plusone
+% \else
+% \plustwo
+% \fi\fi}
+% \newdimen\roundingeps \roundingeps=10sp
+% \def\comparedimensioneps#1#2%
+% {\chardef\compresult
+% \ifdim\dimexpr(#1-#2)<\roudingeps
+% \zerocount
+% \else\ifdim\dimexpr(#2-#1)<\roudingeps
+% \zerocount
+% \else\ifdim#1<#2%
+% \plusone
+% \else
+% \plustwo
+% \fi\fi\fi}
+
+%D Next we load a few local optimizations and new features. They
+%D live on on my machine and are not distributed, but they may end
+%D up in the distributed files.
+
+\loadmarkfile{cont-new}
+
+\readsysfile {cont-loc} {} {} % local improvements, patches, new features
+\readsysfile {cont-exp} {} {} % experimental features (e.g. local speed-ups)
+%readsysfile {cont-mtx} {} {} % experimental metatex features
+
+\protect \endinput
diff --git a/tex/context/base/cont-nl.tex b/tex/context/base/cont-nl.tex
new file mode 100644
index 000000000..32b82b01a
--- /dev/null
+++ b/tex/context/base/cont-nl.tex
@@ -0,0 +1,42 @@
+%D \module
+%D [ file=cont-nl,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Dutch 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{dutch}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!nl]
+
+\loaduserspecifications
+
+\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!nl] [\c!state=\v!start]
+\installlanguage [\s!it] [\c!state=\v!start]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-old.tex b/tex/context/base/cont-old.tex
new file mode 100644
index 000000000..360b5f2e6
--- /dev/null
+++ b/tex/context/base/cont-old.tex
@@ -0,0 +1,48 @@
+%D \module
+%D [ file=cont-old,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=Old Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Old Macros}
+
+\unprotect
+
+\def\middleraggedness {6\bodyfontsize}
+
+\def\dosubstitutecommand#1#2%
+ {\writestatus\m!systems{\string#1\normalspace -> \string#2}%
+ \gdef#1{#2}%
+ #2}
+
+\def\substitutecommand#1#2%
+ {\gdef#1{\dosubstitutecommand{#1}{#2}}}
+
+\substitutecommand \volgendehoofdstuk {\setupheadnumber[hoofdstuk][+1]}
+\substitutecommand \volgendeparagraaf {\setupheadnumber[paragraaf][+1]}
+\substitutecommand \volgendesubparagraaf {\setupheadnumber[subparagraaf][+1]}
+\substitutecommand \volgendesubsubparagraaf {\setupheadnumber[subsubparagraaf][+1]}
+
+\substitutecommand \volledigeinhoudsopgave \volledigeinhoud
+\substitutecommand \plaatsinhoudsopgave \plaatsinhoud
+\substitutecommand \stelinhoudsopgavein \stelinhoudin
+
+\substitutecommand \streep \onderstreep
+\substitutecommand \strepen \onderstrepen
+
+\substitutecommand \pragmakenmerk \referral
+
+\substitutecommand \definieersynoniem \definesynonyms
+
+\substitutecommand \setupintermezzos \setupintermezzi
+
+\let \Everybodyfont \EveryBodyFont
+
+\protect \endinput
diff --git a/tex/context/base/cont-pe.tex b/tex/context/base/cont-pe.tex
new file mode 100644
index 000000000..fdf47d680
--- /dev/null
+++ b/tex/context/base/cont-pe.tex
@@ -0,0 +1,45 @@
+%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]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-ro.tex b/tex/context/base/cont-ro.tex
new file mode 100644
index 000000000..9be9b1162
--- /dev/null
+++ b/tex/context/base/cont-ro.tex
@@ -0,0 +1,38 @@
+%D \module
+%D [ file=cont-ro,
+%D version=2000.01.09,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Romanian 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{romanian}
+
+\input context.tex
+
+\unprotect
+
+\setupcurrentlanguage[\s!ro]
+
+\loaduserspecifications
+
+\installlanguage [\s!en] [\c!state=\v!start]
+\installlanguage [\s!de] [\c!state=\v!start]
+\installlanguage [\s!ro] [\c!state=\v!start]
+
+\ifnum\texengine=\luatexengine
+ % will be runtime option: typeface
+ \appendtoks
+ \usetypescript[modern]
+ \setuptypeface[modern]
+ \to \everyjob
+\else
+ \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
+\fi
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/cont-sys.ori b/tex/context/base/cont-sys.ori
new file mode 100644
index 000000000..11c0141e7
--- /dev/null
+++ b/tex/context/base/cont-sys.ori
@@ -0,0 +1,182 @@
+%D \module
+%D [ file=cont-sys,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=System Specific Setups,
+%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
+
+% Speed up typescript loading, but at the cost of much memory:
+
+\preloadtypescripts
+
+% If you want another default font:
+%
+% \let\preloadfonts\relax
+% \usetypescript[palatino][\defaultencoding]
+% \setupbodyfont[palatino,rm,12pt]
+%
+% Please make sure that this defines rm, ss, tt and mm.
+
+% Occasionally we will support both A4 and letter in
+% styles. If you want letter size paper to be the default,
+% uncomment:
+%
+% \enablemode[\systemmodeprefix letter]
+%
+% If you always want to default to letter, you may uncomment
+% the following line, but beware: it makes your documents less
+% portable:
+%
+% \setuppapersize[letter][letter]
+
+% If you want some extras, just uncomment the following
+% line:
+%
+% \usemodule[plus] % experimental code
+%
+% Here you can take care of overloading some (style)
+% defaults. What goes here, depends on your local system.
+
+% The following commands sets the default font encoding:
+%
+% \setupencoding [\s!default=texnansi]
+%
+% or:
+
+\setupencoding [\s!default=ec]
+
+% If you want the default berry names:
+%
+% \usetypescript [berry] [\defaultencoding]
+%
+% or, if you also want other encodings:
+
+\usetypescript [berry] [ec,t5,8r] % texnansi is never present
+
+% If you run into missing font metrics kind of problems,
+% you may want to uncomment:
+%
+% \usetypescript[adobekb] [\defaultencoding]
+
+% You can let \CONTEXT\ load the map files for \PDFTEX.
+
+\autoloadmapfilestrue
+
+% (1) you can prevent loading with:
+%
+% \preloadmapfile[<...somename...>.map]
+%
+% (2) otherwise, use this if you have a fast machine
+%
+% \resetmapfiles \usetypescript [map] [base] [all]
+%
+% (3) or this if it's a slow one:
+
+\resetmapfiles
+
+% more recent versions of pdftex support map loading on each page
+
+\donefalse \ifx\pdftexversion\undefined \else \ifnum\number\pdftexversion>119
+ \donetrue
+\fi \fi \ifdone
+
+ \loadmapfile[original-base.map]
+ \loadmapfile[original-ams-base.map]
+ \loadmapfile[original-ams-euler.map]
+ \loadmapfile[original-public-lm.map]
+
+\else
+
+ \loadmapfile[original-base.map]
+ \loadmapfile[texnansi-base.map]
+ \loadmapfile[ec-base.map]
+ \loadmapfile[qx-base.map]
+ \loadmapfile[t5-base.map]
+ %loadmapfile[il2-base.map]
+ %loadmapfile[pl0-base.map]
+ \loadmapfile[8r-base.map]
+
+ \loadmapfile[original-ams-base.map]
+ \loadmapfile[original-ams-euler.map]
+
+ \loadmapfile[original-public-lm.map]
+
+ %loadmapfile[texnansi-public-lm.map]
+ %loadmapfile[ec-public-lm.map]
+ %loadmapfile[qx-public-lm.map]
+ %loadmapfile[t5-public-lm.map]
+ %loadmapfile[pl0-public-lm.map]
+ %loadmapfile[il2-public-lm.map]
+
+\fi
+
+% When you have your own fonts installed, you may want to predefine:
+%
+% \usetypescriptfile[type-buy]
+
+% Some styles default to Lucida Bright. You can overload
+% Lucida by Times cum suis. Watch out, the pos collection
+% is not scaled relatively.
+%
+% \definetypescriptsynonym [lbr] [pos]
+
+% Compensate for missing files:
+%
+% \definefontsynonym [gbhei] [gbsong]
+% \definefontsynonym [gbheisl] [gbsong]
+% \definefontsynonym [gbheisl] [gbsong]
+
+% Setting up a global figure path
+%
+% \setupexternalfigures [\c!directory={e:/fig/eps,t:/mine/figs}]
+%
+% Loading a specific special driver:
+%
+% \setupoutput [dviwindo]
+
+% Changing language defaults
+%
+% \setuplanguage
+% [nl]
+% [\c!leftquote=\upperleftsinglesixquote,
+% \c!leftquotation=\upperleftdoublesixquote]
+
+% Loading local preferences, for example
+%
+% \input prag-gen % company styles
+% \input prag-log % more company styles
+%
+% Enabling run time \METAPOST\ (also enable \write18 in
+% texmf.cnf):
+
+\runMPgraphicstrue
+\runMPTEXgraphicstrue
+
+% This saves some runtime, but needs a format, which you can
+% make with 'texexec --make --alone metafun'. Make sure that
+% the mem files are moved to the used web2c path (locate with
+% 'kpsewhich plain.mem').
+
+\useMETAFUNformattrue
+
+% This can be a way to get things working on system with
+% name clashes. (Some \TeX's tend do search system wide.)
+
+\protectbufferstrue
+
+% You can enable a more extensive figure searching, but
+% normally this is not really needed and even annoying.
+%
+% \runutilityfiletrue
+
+% So far.
+
+\protect \endinput
diff --git a/tex/context/base/cont-usr.ori b/tex/context/base/cont-usr.ori
new file mode 100644
index 000000000..5a3070362
--- /dev/null
+++ b/tex/context/base/cont-usr.ori
@@ -0,0 +1,109 @@
+%D \module
+%D [ file=cont-usr,
+%D version=1997.10.05,
+%D title=\CONTEXT\ User Format Specifications,
+%D subtitle=System Specific Setups,
+%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 User Settings}
+
+\unprotect
+
+%D Additional languages can be defined here. Beware of
+%D encoding incompatibilities. Please take a look at the
+%D \type {cont-en.tex}, \type {cont-nl.tex}, enz.\ files
+%D first. Normally you don't have to change a byte. If you
+%D want to play safe, use \typ {texexec --make --alone
+%D --all}.
+
+% \preloadallpatterns % will load them all
+
+% \installlanguage [\s!af] [\c!state=\v!start] % afrikaans
+% \installlanguage [\s!ca] [\c!state=\v!start] % catalan
+% \installlanguage [\s!cs] [\c!state=\v!start] % czech
+% \installlanguage [\s!da] [\c!state=\v!start] % danish
+% \installlanguage [\s!de] [\c!state=\v!start] % german
+% \installlanguage [\s!en] [\c!state=\v!start] % english us
+% \installlanguage [\s!es] [\c!state=\v!start] % spanish
+% \installlanguage [\s!fi] [\c!state=\v!start] % finnish
+% \installlanguage [\s!fr] [\c!state=\v!start] % french
+% \installlanguage [\s!hr] [\c!state=\v!start] % croatian
+% \installlanguage [\s!hu] [\c!state=\v!start] % hungarian
+% \installlanguage [\s!it] [\c!state=\v!start] % italian
+% \installlanguage [\s!la] [\c!state=\v!start] % latin
+% \installlanguage [\s!nl] [\c!state=\v!start] % dutch
+% \installlanguage [\s!nb] [\c!state=\v!start] % bokmal
+% \installlanguage [\s!nn] [\c!state=\v!start] % nynorsk
+% \installlanguage [\s!pl] [\c!state=\v!start] % polish
+% \installlanguage [\s!pt] [\c!state=\v!start] % portuguese
+% \installlanguage [\s!ro] [\c!state=\v!start] % romanian
+% \installlanguage [\s!ru] [\c!state=\v!start] % russian
+% \installlanguage [\s!sk] [\c!state=\v!start] % slovak
+% \installlanguage [\s!sl] [\c!state=\v!start] % slovenian
+% \installlanguage [\s!sv] [\c!state=\v!start] % swedish
+% \installlanguage [\s!tr] [\c!state=\v!start] % turkish
+% \installlanguage [\s!ua] [\c!state=\v!start] % ukrainian
+% \installlanguage [\s!gb] [\c!state=\v!start] % english uk
+% \installlanguage [\s!vn] [\c!state=\v!start] % vietnamese
+
+% \installlanguage [deo] [\c!state=\v!start] % old german
+
+%D The next lines can be used for setting the language to be
+%D used at startup time.
+
+% \setupcurrentlanguage[\s!af]
+% \setupcurrentlanguage[\s!ca]
+% \setupcurrentlanguage[\s!cs]
+% \setupcurrentlanguage[\s!da]
+% \setupcurrentlanguage[\s!de]
+% \setupcurrentlanguage[\s!en]
+% \setupcurrentlanguage[\s!es]
+% \setupcurrentlanguage[\s!fi]
+% \setupcurrentlanguage[\s!fr]
+% \setupcurrentlanguage[\s!hr]
+% \setupcurrentlanguage[\s!hu]
+% \setupcurrentlanguage[\s!it]
+% \setupcurrentlanguage[\s!la]
+% \setupcurrentlanguage[\s!nl]
+% \setupcurrentlanguage[\s!nb]
+% \setupcurrentlanguage[\s!nn]
+% \setupcurrentlanguage[\s!pl]
+% \setupcurrentlanguage[\s!pt]
+% \setupcurrentlanguage[\s!ro]
+% \setupcurrentlanguage[\s!ru]
+% \setupcurrentlanguage[\s!sk]
+% \setupcurrentlanguage[\s!sl]
+% \setupcurrentlanguage[\s!sv]
+% \setupcurrentlanguage[\s!tr]
+% \setupcurrentlanguage[\s!ua]
+
+%D Local font settings can go here. Normally suitable
+%D defaults are already preloaded, almost certainly the
+%D Computer Modern Roman typefaces or some derivate. So, the
+%D next line is only meant as sample, take a look at the
+%D format related files first.
+
+% This is obsolete due to latin modern:
+%
+% \definefilesynonym [font-cmr] [font-csr] % czech & slovak
+% \definefilesynonym [font-cmr] [font-plr] % polish
+
+%D In some languages, compound characters, like \type {"e}
+%D are used to get accented and non latin characters.
+
+% Per 21/9/2006 one needs to explicitly enable this.
+
+% \useencoding[fde] % german
+% \useencoding[ffr] % french
+% \useencoding[fro] % romanian
+% \useencoding[fpl] % polish
+
+%D Don't remove the next few lines.
+
+\protect \endinput
diff --git a/tex/context/base/context-base.lmx b/tex/context/base/context-base.lmx
new file mode 100644
index 000000000..fd27927bf
--- /dev/null
+++ b/tex/context/base/context-base.lmx
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!--
+ filename : context-base.xml
+ comment : companion to mtx-server-ctx-startup.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <title><?lua pv('title') ?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <?lua if (v('refreshtime') and (tonumber(v('refreshtime')) or 0) > 0) and v('refreshurl') then ?>
+ <meta http-equiv='refresh' content="<?lua pv('refreshtime') ?>; <?lua pv('refreshurl') ?>"/>
+ <?lua end ?>
+ <style type="text/css">
+ <?lmx-include context.css ?>
+ </style>
+ <?lua if v('styles') then for k, v in ipairs(v('styles')) do ?>
+ <link rel="StyleSheet" href="<?lua p(v) ?>" type="text/css" />
+ <?lua end end ?>
+ </head>
+ <?lua if v('action') then ?>
+ <form action="<?lua pv(action) ?>" enctype="multi-part/form-data" method="post">
+ <?lua end ?>
+ <body>
+ <div id="top">
+ <div id="top-one">
+ <div id="top-two">
+ <?lua pv('title') ?>
+ </div>
+ </div>
+ </div>
+ <div id="bottom">
+ <div id="bottom-one">
+ <div id="bottom-two">
+ <?lua pv('bottomtext') ?>
+ </div>
+ </div>
+ </div>
+ <div id="left">
+ <div id="left-one">
+ <div id="left-two">
+ <?lua pv('lefttext') ?>
+ </div>
+ </div>
+ </div>
+ <div id="right">
+ <div id="right-safari">
+ <div id="right-one">
+ <div id="right-two">
+ <div id="right-three">
+ <div id="right-four">
+ <div id="right-five">
+ <?lua pv('righttext') ?>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="main">
+ <div id='main-settings'>
+ <?lua pv('maintext') ?>
+ </div>
+ </div>
+ </body>
+ <?lua if v('action') then ?>
+ </form>
+ <?lua end ?>
+</html>
diff --git a/tex/context/base/context-characters.lmx b/tex/context/base/context-characters.lmx
new file mode 100644
index 000000000..f018e412b
--- /dev/null
+++ b/tex/context/base/context-characters.lmx
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!--
+ filename : context-characters.lmx
+ comment : companion to context.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <script type='text/javascript'>
+ <!--
+ window.focus();
+ -->
+ </script>
+ <title><?lua pv('title') ?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ <!--
+ <?lmx-include context.css ?>
+ #type {
+ text-align: center ;
+ }
+ #variable {
+ width: 10em ;
+ text-align: right ;
+ margin-right: 1em ;
+ }
+ #value {
+ text-align: left ;
+ }
+ -->
+ </style>
+ </head>
+ <body> <!-- onclick="location.reload()" -->
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title') ?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <!-- empty -->
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <!-- empty -->
+ </div></div></div></div></div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five"></div></div></div></div></div></div></div>
+ <div id="main"><div id='main-settings'>
+ <?lmx-define-begin chr-head ?>
+ <tr>
+ <th><div id="value">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th colspan='2'><div id="value">characters&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th colspan='2'><div id="value">unicodes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th colspan='2'><div id="value">indices&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th colspan='1'><div id="value">fonts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ </tr>
+ <tr>
+ <th><div id="value">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th><div id="value">before utf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th><div id="value">after utf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th><div id="value">before hex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th><div id="value">after hex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th><div id="value">after hex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th><div id="value">after dec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ <th><div id="value">filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></th>
+ </tr>
+ <?lmx-define-end ?>
+ <?lmx-define-begin chr-body ?>
+ <tr>
+ <td valign="top"><div id="value"><?lua t((nodes.tracers.characters.equal(v.before,v.after) and "=") or "!") ?></div></td>
+ <td valign="top"><div id="value"><?lua t(nodes.tracers.characters.string(v.before)) ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></td>
+ <td valign="top"><div id="value"><?lua t(nodes.tracers.characters.string(v.after)) ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></td>
+ <td valign="top"><div id="value"><?lua t(nodes.tracers.characters.unicodes(v.before)) ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></td>
+ <td valign="top"><div id="value"><?lua t(nodes.tracers.characters.unicodes(v.after)) ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></td>
+ <td valign="top"><div id="value"><?lua t(nodes.tracers.characters.indices(v.after)) ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></td>
+ <td valign="top"><div id="value"><?lua t(nodes.tracers.characters.indices(v.after,true)) ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></td>
+ <td valign="top"><div id="value"><?lua t(nodes.tracers.characters.fonts(v.after)) ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div></td>
+ </tr>
+ <?lmx-define-end ?>
+ <?lmx-define-begin chr-none ?>
+ <tr>
+ <td><br/></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <?lmx-define-end ?>
+ <?lua if tracers.knownlist('characters') then ?>
+ <h1>Processed Words</h1>
+ <table>
+ <?lmx-resolve chr-head ?>
+ <?lua for k,v in pairs(tracers.list['characters']) do if v.before and v.after then ?>
+ <?lmx-resolve chr-body ?>
+ <?lua else ?>
+ <?lmx-resolve chr-none ?>
+ <?lua end end ?>
+ </table>
+ <br/>
+ <?lua end ?>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ Job Name: <?lua p(environment.jobname) ?> &nbsp;&nbsp;&nbsp;
+ ConTeXt Version: <?lua p(environment.version) ?> &nbsp;&nbsp;&nbsp;
+ </div></div></div>
+ </body>
+</html>
diff --git a/tex/context/base/context-debug.lmx b/tex/context/base/context-debug.lmx
new file mode 100644
index 000000000..51b18c837
--- /dev/null
+++ b/tex/context/base/context-debug.lmx
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!--
+ filename : context-debug.lmx
+ comment : companion to context.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <script type='text/javascript'>
+ <!--
+ window.focus();
+ -->
+ </script>
+ <title><?lua pv('title') ?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ <!--
+ <?lmx-include context.css ?>
+ #type {
+ text-align: center ;
+ }
+ #variable {
+ width: 10em ;
+ text-align: right ;
+ margin-right: 1em ;
+ }
+ #value {
+ text-align: left ;
+ }
+ -->
+ </style>
+ </head>
+ <body>
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title') ?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <!-- empty -->
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <!-- empty -->
+ </div></div></div></div></div></div></div>
+ <div id="main"><div id='main-settings'>
+ <?lua if tracers.knownlist('scratch') then ?>
+ <h1>Scratch Variables</h1>
+ <table>
+ <tr>
+ <th align='middle'>index</th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;dimen</th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;count</th>
+ <th align='left' >&nbsp;&nbsp;&nbsp;toks</th>
+ </tr>
+ <?lua for k,v in pairs(tracers.list['scratch']) do ?>
+ <tr>
+ <th align='middle'><?lua t(v) ?></th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;<?lua t(tracers.dimen(v)) ?></th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;<?lua t(tracers.count(v)) ?></th>
+ <th align='left' >&nbsp;&nbsp;&nbsp;<?lua t(tracers.toks (v)) ?></th>
+ </tr>
+ <?lua end ?>
+ </table>
+ <br/>
+ <?lua end ?>
+ <?lmx-define-begin tvv-head ?>
+ <tr>
+ <th><div id="type" >type </div></th>
+ <th><div id="variable">variable</div></th>
+ <th><div id="value" >value </div></th>
+ </tr>
+ <?lmx-define-end ?>
+ <?lmx-define-begin tvv-body ?>
+ <tr>
+ <th><div id="type" ><?lua t(tracers.type(v)) ?></div></th>
+ <th><div id="variable"><?lua t(tracers.name(v)) ?></div></th>
+ <th><div id="value" ><?lua t(tracers.cs(v)) ?></div></th>
+ </tr>
+ <?lmx-define-end ?>
+ <?lua if tracers.knownlist('internals') then ?>
+ <h1>Internal Variables</h1>
+ <table>
+ <?lmx-resolve tvv-head ?>
+ <?lua for k,v in pairs(tracers.list['internals']) do ?>
+ <?lmx-resolve tvv-body ?>
+ <?lua end ?>
+ </table>
+ <br/>
+ <?lua end ?>
+ <?lua if tracers.knownlist('context') then ?>
+ <h1>ConTeXt Variables</h1>
+ <table>
+ <?lmx-resolve tvv-head ?>
+ <?lua for k,v in pairs(tracers.list['context']) do ?>
+ <?lmx-resolve tvv-body ?>
+ <?lua end ?>
+ </table>
+ <br/>
+ <?lua end ?>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ Job Name: <?lua p(environment.jobname) ?> &nbsp;&nbsp;&nbsp;
+ ConTeXt Version: <?lua p(environment.version) ?> &nbsp;&nbsp;&nbsp;
+ Real Page: <?lua p(tracers.cs('c:realpageno')) ?> &nbsp;&nbsp;&nbsp;
+ Page: <?lua p(tracers.cs('c:pageno')) ?> &nbsp;&nbsp;&nbsp;
+ </div></div></div>
+ </body>
+</html>
diff --git a/tex/context/base/context-error.lmx b/tex/context/base/context-error.lmx
new file mode 100644
index 000000000..b82b552f8
--- /dev/null
+++ b/tex/context/base/context-error.lmx
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!--
+ filename : context-error.lmx
+ comment : companion to context.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <script type='text/javascript'>
+ <!--
+ window.focus();
+ -->
+ </script>
+ <title><?lua pv('title')?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ <!--
+ <?lmx-include context.css ?>
+ -->
+ </style>
+ </head>
+ <body>
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title')?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <!-- empty -->
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <!-- empty -->
+ <br/>
+ <a href="<?lua pv('filename')?>">edit</a>
+ <br/>
+ </div></div></div></div></div></div></div>
+ <div id="main"><div id="main-settings">
+ <table>
+ <tr><td>Error</td><td>&nbsp;&nbsp;&nbsp;<?lua tv('errormessage')?></td></tr>
+ <tr><td>File </td><td>&nbsp;&nbsp;&nbsp;<?lua tv('filename') ?></td></tr>
+ <tr><td>Line </td><td>&nbsp;&nbsp;&nbsp;<?lua tv('linenumber') ?></td></tr>
+ </table>
+ <br/>
+ <pre>
+ <?lua pv('errorcontext')?>
+ </pre>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ Job Name: <?lua p(environment.jobname) ?> &nbsp;&nbsp;&nbsp;
+ ConTeXt Version: <?lua p(environment.version) ?> &nbsp;&nbsp;&nbsp;
+ Real Page: <?lua p(tracers.cs('c:realpageno')) ?> &nbsp;&nbsp;&nbsp;
+ Page: <?lua p(tracers.cs('c:pageno')) ?> &nbsp;&nbsp;&nbsp;
+ </div></div></div>
+ </body>
+</html>
diff --git a/tex/context/base/context-fonttest.lmx b/tex/context/base/context-fonttest.lmx
new file mode 100644
index 000000000..fddb8196b
--- /dev/null
+++ b/tex/context/base/context-fonttest.lmx
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!--
+ filename : context-fonttest.lmx
+ comment : companion to mtx-server-ctx-fonttest.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <script type='text/javascript'>
+ <!--
+ window.focus() ;
+ <?lua pv('javascripts')?> ;
+ <?lua pv('javascriptdata')?> ;
+ -->
+ </script>
+ <title><?lua pv('title')?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ <?lmx-include context.css ?>
+ </style>
+ </head>
+ <body onLoad="<?lua pv('javascriptinit')?>">
+ <form action="<?lua pv('formaction')?>" name="main-form">
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title')?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <?lua pv('status')?>
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <!-- empty -->
+ </div></div></div></div></div></div></div>
+ <div id="main"><div id="main-settings">
+ <?lua pv('maintext')?>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ <?lua pv('menu')?>
+ </div></div></div>
+ </form>
+ </body>
+</html>
diff --git a/tex/context/base/context-help.lmx b/tex/context/base/context-help.lmx
new file mode 100644
index 000000000..5401fb65d
--- /dev/null
+++ b/tex/context/base/context-help.lmx
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!--
+ filename : comm-deb.xml
+ comment : companion to comm-xml.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<html>
+ <head>
+ <script type='text/javascript'>
+ <!--
+ window.focus();
+ -->
+ </script>
+ <title><?lua pv('title') ?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ <!--
+<?lmx-include context.css ?>
+
+#main-left {
+ position: absolute;
+ left: 0% ;
+ top: 0% ;
+ right: 0% ;
+ bottom: 0% ;
+ z-index: 2 ;
+ width: 75% ;
+ height: 100% ;
+ padding: 0% ;
+ margin: 0% ;
+ overflow: auto ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-main-left')?> ;
+}
+#main-right {
+ position: absolute;
+ left: 75% ;
+ top: 0% ;
+ right: 0% ;
+ bottom: 0% ;
+ z-index: 2 ;
+ width: 25% ;
+ height: 100% ;
+ padding: 0% ;
+ margin: 0% ;
+ overflow: auto ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-main-right')?> ;
+}
+#main-common-settings {
+ padding: 1em ;
+}
+
+ -->
+ </style>
+ </head>
+ <body>
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title') ?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <!-- empty -->
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <?lua pv('interfaces') ?>
+ </div></div></div></div></div></div></div>
+ <div id="main"><div id='main-settings'>
+ <div id="main-right"><div id="main-common-settings">
+ <?lua pv('names') ?>
+ </div></div>
+ <div id="main-left"><div id="main-common-settings">
+ <h1><?lua pv('maintitle') ?></h1>
+ <?lua pv('maintext') ?>
+ </div></div>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ <?lua pv('extra') ?>
+ </div></div></div>
+ </body>
+</html>
diff --git a/tex/context/base/context-timing.lmx b/tex/context/base/context-timing.lmx
new file mode 100644
index 000000000..57b5879ba
--- /dev/null
+++ b/tex/context/base/context-timing.lmx
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<!--
+ filename : context-timing.xml
+ comment : companion to mtx-timing.tex
+ author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ copyright: PRAGMA ADE / ConTeXt Development Team
+ license : see context related readme files
+-->
+
+<!--
+ beware: xhtml, so no comment around css
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <script type='text/javascript'>
+ <!--
+ window.focus();
+ -->
+ </script>
+ <title><?lua pv('title')?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ <?lmx-include context.css ?>
+ </style>
+ </head>
+ <body>
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title')?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <!-- empty -->
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <!-- empty -->
+ </div></div></div></div></div></div></div>
+ <div id="main"><div id="main-settings">
+ <?lua pv('graphics')?>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ <small>
+ <br/> <br/>
+ <?lua pv('parametersmenu')?>
+ <br/>
+ <?lua pv('nodesmenu')?>
+ </small>
+ </div></div></div>
+ </body>
+</html>
diff --git a/tex/context/base/context.css b/tex/context/base/context.css
new file mode 100644
index 000000000..f332ae242
--- /dev/null
+++ b/tex/context/base/context.css
@@ -0,0 +1,241 @@
+body {
+ color: #FFFFFF ;
+ background-color: <?lua pv('color-background-body')?> ;
+ font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans ;
+ font-size: 12px ;
+ line-height: 18px ;
+}
+a:link, a:active, a:visited {
+ color: #FFFFFF ;
+}
+a.dir-view:link, a.dir-view:active, a.dir-view:visited {
+ color: #FFFFFF ;
+ text-decoration: underline ;
+}
+.valid {
+ color: #00FF00 ;
+}
+.invalid {
+ color: #FF0000 ;
+}
+h1, .title {
+ font-style: normal ;
+ font-weight: normal ;
+ font-size: 18px ;
+ line-height: 18px ;
+ margin-bottom: 20px ;
+}
+h2, .subtitle {
+ font-style: normal ;
+ font-weight: normal ;
+ font-size: 12px ;
+ margin-top: 18px ;
+ margin-bottom: 18px ;
+}
+table {
+ line-height: 18px ;
+ font-size: 12px ;
+ margin: 0 ;
+}
+th {
+ font-weight: bold ;
+ text-align: left ;
+ padding-bottom: 6px ;
+}
+.tc {
+ font-weight: bold ;
+ text-align: left ;
+}
+p, li {
+ max-width: 60em ;
+}
+.empty-line {
+ margin-top: 4px ;
+}
+.more-room {
+ margin-right: 1.5em ;
+}
+.much-more-room {
+ margin-right: 3em ;
+}
+#main {
+ position: absolute;
+ left: 10% ;
+ top: 10% ;
+ right: 10% ;
+ bottom: 10% ;
+ z-index: 2 ;
+ width: 80% ;
+ height: 80% ;
+ padding: 0% ;
+ margin: 0% ;
+ overflow: auto ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-main')?> ;
+}
+#main-settings {
+ margin: 12px ;
+ x_max-width: 60em ;
+ line-height: 18px ;
+ font-size: 12px ;
+}
+#left {
+ position: absolute;
+ top : 10% ;
+ left: 0% ;
+ bottom: 0%;
+ right: 90% ;
+ z-index: 1 ;
+ width: 10% ;
+ height: 90% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-one')?> ;
+}
+#right {
+ position: absolute;
+ top : 0% ;
+ left: 90% ;
+ bottom: 10% ;
+ right: 0% ;
+ z-index: 1 ;
+ width: 10% ;
+ height: 90% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-one')?> ;
+ _margin-left: -15px ;
+}
+#bottom {
+ position: absolute ;
+ left: 10% ;
+ right: 0% ;
+ top: 90% ;
+ bottom: 0% ;
+ z-index: 1 ;
+ width: 90% ;
+ height: 10% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-two')?> ;
+}
+#top {
+ position: absolute ;
+ left: 0% ;
+ right: 10% ;
+ top: 0% ;
+ bottom: 90% ;
+ z-index: 1 ;
+ width: 90% ;
+ height: 10% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-two')?> ;
+}
+#top-one {
+ position: absolute ;
+ bottom: 50% ;
+ width: 100% ;
+ buggedheight: 100% ;
+}
+#top-two {
+ position: relative ;
+ margin-bottom: -9px ;
+ margin-left: 12px ;
+ margin-right: 12px ;
+ line-height: 18px ;
+ text-align: right ;
+ vertical-align: middle ;
+}
+#bottom-one {
+ position: absolute ;
+ bottom: 50% ;
+ width: 100% ;
+ buggedheight: 100% ;
+}
+#bottom-two {
+ position: relative ;
+ margin-bottom: -9px ;
+ margin-left: 12px ;
+ margin-right: 12px ;
+ line-height: 18px ;
+ text-align: left ;
+ vertical-align: middle ;
+}
+#left-one {
+ position: absolute ;
+ width: 100% ;
+ buggedheight: 100% ;
+}
+#left-two {
+ position: relative ;
+ margin-top: 12px ;
+ line-height: 18px ;
+ text-align: center ;
+ vertical-align: top ;
+}
+#right-one {
+ display: table ;
+ height: 100% ;
+ width: 100% ;
+}
+#right-two {
+ display: table-row ;
+ height: 100% ;
+ width: 100% ;
+}
+#right-three {
+ display: table-cell ;
+ width: 100% ;
+ vertical-align: bottom ;
+ _position: absolute ;
+ _top: 100% ;
+}
+#right-four {
+ text-align: center ;
+ margin-bottom: 2ex ;
+ _position: relative ;
+ _top: -100% ;
+}
+#more-top {
+ position: absolute;
+ top: 0% ;
+ left: 90% ;
+ bottom: 90%;
+ right: 0% ;
+ z-index: 3 ;
+ width: 10% ;
+ height: 10% ;
+ padding: 0% ;
+ margin: 0% ;
+ border-style: none ;
+ border-width: 0 ;
+}
+#more-top-settings {
+ text-align: center ;
+}
+#more-right-settings {
+ margin-right: 12px ;
+ margin-left: 12px ;
+ line-height: 18px ;
+ font-size: 10px ;
+ text-align: center ;
+}
+#right-safari {
+ display: table ;
+ width: 100% ;
+ height: 100% ;
+}
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
new file mode 100644
index 000000000..4be60cbfc
--- /dev/null
+++ b/tex/context/base/context.mkii
@@ -0,0 +1,391 @@
+%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-ini}
+\loadcorefile{syst-pln}
+
+\loadcorefile{norm-tex}
+\loadcorefile{norm-etx}
+\loadcorefile{norm-ptx}
+\loadcorefile{norm-xtx}
+\loadcorefile{norm-ctx}
+
+\loadmarkfile{catc-ini}
+\loadcorefile{catc-act}
+\loadcorefile{catc-def}
+\loadcorefile{catc-ctx}
+\loadcorefile{catc-sym}
+
+\loadmarkfile{syst-gen}
+\loadmarkfile{syst-ext}
+\loadmarkfile{syst-new}
+\loadmarkfile{syst-con}
+\loadcorefile{syst-ltx}
+\loadmarkfile{thrd-trg} % based on: David Carlisle
+
+\loadmarkfile{syst-fnt}
+\loadmarkfile{syst-str}
+\loadmarkfile{syst-rtp}
+
+\ifnum\texengine=\xetexengine
+ \loadmarkfile{xetx-ini}
+ \loadmarkfile{xetx-utf}
+ \loadmarkfile{xetx-chr}
+ \loadmarkfile{xetx-cls}
+\fi
+
+%D To enable selective loading, we say:
+
+\newif\ifCONTEXT \CONTEXTtrue % will disappear
+
+%D In order to conveniently load files, we need a few
+%D support modules.
+
+\loadmarkfile{supp-fil}
+\loadmarkfile{supp-dir}
+
+%D After this we're ready for the multi||lingual interface
+%D modules.
+
+\loadmarkfile{mult-ini}
+\loadcorefile{mult-fst}
+\loadcorefile{mult-sys}
+\loadcorefile{mult-def}
+\loadmarkfile{mult-chk}
+
+%D Now we're ready for some general support modules. These
+%D modules implement some basic typesetting functionality.
+
+\loadmarkfile{core-var}
+\loadmarkfile{core-env}
+
+\loadcorefile{supp-box}
+\loadmarkfile{supp-mrk}
+\loadcorefile{supp-vis}
+\loadcorefile{supp-fun}
+%loadmarkfile{supp-eps}
+\loadmarkfile{supp-spe}
+\loadmarkfile{supp-ran}
+\loadmarkfile{supp-mps}
+\loadmarkfile{supp-tpi}
+\loadmarkfile{supp-mat}
+\loadcorefile{supp-ali}
+\loadcorefile{supp-num}
+
+%D Verbatim typesetting is implemented in a separate class of
+%D modules. The pretty typesetting modules are loaded at run
+%D time.
+
+\loadmarkfile{verb-ini}
+
+%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:
+
+\loadmarkfile{page-ins}
+\loadmarkfile{core-fil}
+\loadmarkfile{core-con}
+
+%D We already need some synonyms (patterns). At runtime this
+%D file will be reloaded.
+
+\loadcorefile{cont-fil}
+
+%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} % based on: Michael Wichura / will be reimplemented
+
+%D Here comes the last support modules. They take care of
+%D some language specific things.
+
+\loadmarkfile{supp-pat}
+
+%D The next few modules do what their names state. They
+%D load additional definition modules when needed.
+
+\loadmarkfile{regi-ini}
+\loadcorefile{regi-syn}
+\loadmarkfile{enco-ini}
+%loadmarkfile{filt-ini}
+\loadmarkfile{hand-ini}
+
+\loadmarkfile{lang-ini}
+\loadmarkfile{lang-spe}
+\loadmarkfile{lang-lab}
+
+\loadmarkfile{unic-ini}
+
+\loadmarkfile{core-gen}
+\loadmarkfile{core-uti}
+\loadmarkfile{core-two}
+\loadmarkfile{core-stg}
+
+\loadmarkfile{spec-ini}
+\loadmarkfile{spec-mis}
+\loadmarkfile{spec-def}
+\loadmarkfile{spec-var}
+
+\loadmarkfile{colo-ini}
+\loadmarkfile{colo-ext}
+
+%D For the moment we load a lot of languages. In the future
+%D we'll have to be more space conservative.
+
+\loadmarkfile{lang-mis}
+\loadmarkfile{lang-url}
+
+\loadcorefile{lang-ger}
+\loadcorefile{lang-ita}
+\loadcorefile{lang-sla}
+\loadcorefile{lang-alt}
+\loadcorefile{lang-ana}
+\loadcorefile{lang-art}
+\loadcorefile{lang-bal}
+\loadcorefile{lang-cel}
+\loadcorefile{lang-grk}
+\loadcorefile{lang-ind}
+\loadcorefile{lang-ura}
+\loadcorefile{lang-vn}
+\loadcorefile{lang-cyr}
+
+\loadmarkfile{typo-ini}
+
+%D All kind of symbols are handled in:
+
+\loadmarkfile{symb-ini}
+
+%D Sorting:
+
+\loadmarkfile{sort-ini}
+
+%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.
+
+\loadmarkfile{spac-gen}
+\loadmarkfile{spac-grd}
+
+\loadmarkfile{strc-mar}
+\loadmarkfile{anch-pos}
+
+\loadmarkfile{buff-ver}
+\loadmarkfile{buff-ini}
+
+\loadmarkfile{pack-rul}
+\loadmarkfile{trac-vis}
+\loadmarkfile{strc-num}
+\loadmarkfile{tabl-com}
+\loadmarkfile{tabl-pln}
+\loadmarkfile{tabl-tab}
+\loadmarkfile{tabl-tsp}
+\loadmarkfile{scrn-nav}
+\loadmarkfile{strc-ref}
+\loadmarkfile{pack-obj}
+\loadmarkfile{strc-lst}
+\loadmarkfile{strc-itm}
+\loadmarkfile{strc-des}
+\loadmarkfile{strc-mat} % should come after math-pln etc
+\loadmarkfile{strc-syn}
+\loadmarkfile{core-sys}
+
+\loadmarkfile{page-ini}
+\loadmarkfile{page-bck}
+\loadmarkfile{page-not}
+\loadmarkfile{page-one}
+\loadmarkfile{page-lay}
+\loadmarkfile{page-log}
+\loadmarkfile{page-txt}
+\loadmarkfile{page-sid}
+\loadmarkfile{strc-flt}
+\loadmarkfile{page-mis}
+\loadmarkfile{page-mul}
+\loadmarkfile{page-set}
+\loadmarkfile{pack-lyr}
+\loadmarkfile{page-mak}
+\loadmarkfile{strc-pag}
+\loadmarkfile{page-lin}
+\loadmarkfile{page-par}
+\loadmarkfile{page-mar}
+
+\loadmarkfile{core-job} % why so late?
+
+% so far
+
+\loadmarkfile{strc-sec}
+\loadmarkfile{strc-swd}
+\loadmarkfile{strc-blk}
+
+\loadmarkfile{page-imp}
+\loadmarkfile{tabl-tbl}
+\loadmarkfile{scrn-int}
+\loadmarkfile{tabl-ntb}
+\loadmarkfile{tabl-nte}
+\loadmarkfile{tabl-ltb}
+
+%D A few more languages, that have specifics using core
+%D functionality:
+
+%loadmarkfile{lang-ara} % undefined
+\loadmarkfile{lang-chi}
+\loadmarkfile{lang-jap}
+
+%D How about fill||in fields and related stuff?
+
+\loadmarkfile{java-ini}
+\loadmarkfile{scrn-fld}
+\loadmarkfile{scrn-hlp}
+
+%D Registers can depend on fields, so we load that now.
+
+\loadmarkfile{strc-reg}
+
+%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}
+
+\ifnum\texengine=\xetexengine
+ \loadmarkfile{font-xtx}
+\fi
+
+\loadmarkfile{font-unk}
+\loadmarkfile{font-uni}
+\loadmarkfile{font-bfm}
+
+\loadmarkfile{enco-pfr}
+
+\loadmarkfile{type-ini}
+\loadmarkfile{type-set}
+
+%D Properties. Don't ask.
+
+\loadmarkfile{prop-ini}
+\loadmarkfile{prop-lay}
+\loadmarkfile{prop-mis}
+
+%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}
+\loadmarkfile{meta-pdf}
+
+\loadmarkfile{meta-pag}
+
+%D Special page handling (maybe even later)
+
+\loadmarkfile{page-flw}
+\loadmarkfile{page-spr}
+\loadmarkfile{page-plg}
+\loadmarkfile{page-str}
+
+%D Anchoring graphics:
+
+\loadmarkfile{anch-pgr}
+\loadmarkfile{anch-bar}
+\loadmarkfile{anch-snc}
+
+%D Math.
+
+\loadmarkfile{math-pln}
+\loadmarkfile{math-ini}
+\loadmarkfile{math-arr}
+\loadmarkfile{math-frc}
+
+%D Now we're ready for more core modules.
+
+\loadmarkfile{core-fnt}
+\loadmarkfile{strc-not}
+\loadmarkfile{strc-lnt}
+
+\loadmarkfile{core-mis}
+
+\loadmarkfile{grph-trf}
+\loadmarkfile{grph-inc}
+\loadmarkfile{grph-fig}
+
+\loadmarkfile{core-par}
+
+\loadmarkfile{pack-box}
+\loadmarkfile{page-app}
+\loadmarkfile{meta-fig}
+
+%D Language specific spacing.
+
+\loadcorefile{lang-spa}
+
+%D Bibliographies:
+
+\loadmarkfile{bibl-tra}
+
+%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}
+\loadcorefile{xtag-ext}
+\loadcorefile{xtag-exp}
+\loadcorefile{xtag-pre}
+\loadcorefile{xtag-xsd}
+\loadcorefile{xtag-rng}
+
+%D How about this:
+
+\loadcorefile{meta-xml}
+
+%D \TEX\ related logo's are always typeset in a special way.
+%D Here they come:
+
+\loadcorefile{cont-log}
+
+%D This one overloads af few things:
+
+\loadmarkfile{core-ctx}
+
+%D Defaults go here (more will be moved to this module
+%D later):
+
+\loadmarkfile{core-ini}
+\loadmarkfile{core-def}
+
+%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 Except from english, no hyphenation patterns are loaded
+% %D yet. Users can specify their needs in the next module:
+%
+% \input cont-usr
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
new file mode 100644
index 000000000..33fa3a901
--- /dev/null
+++ b/tex/context/base/context.mkiv
@@ -0,0 +1,380 @@
+%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.
+
+% syst-cat -> catc-ini + vectors
+% spec-* -> special backends for luatex
+
+%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-ini}
+
+\ifnum\luatexversion<60 % also change message
+ \writestatus{!!!!}{Your luatex binary is too old, you need at least version 0.60!}
+ \expandafter\end
+\fi
+
+\newtoks\contextversiontoks \contextversiontoks\expandafter{\contextversion} % at the lua end
+
+\loadcorefile{norm-ctx}
+\loadcorefile{syst-pln}
+
+\newif\ifCONTEXT \CONTEXTtrue % will disappear
+
+\loadmarkfile{luat-cod}
+\loadmarkfile{luat-bas}
+\loadmarkfile{luat-lib}
+
+\loadmarkfile{catc-ini}
+\loadcorefile{catc-act}
+\loadcorefile{catc-def}
+\loadcorefile{catc-ctx}
+\loadcorefile{catc-sym}
+
+% From here on we have \unexpanded being \normalprotected, as we
+% already had \unexpanded long before etex came around.
+
+\loadmarkfile{syst-aux}
+\loadmarkfile{syst-lua}
+\loadmarkfile{syst-con}
+\loadcorefile{syst-ltx}
+
+\loadmarkfile{syst-fnt}
+\loadmarkfile{syst-str}
+\loadmarkfile{syst-rtp}
+
+\loadmarkfile{supp-fil}
+\loadmarkfile{supp-dir}
+
+\loadmarkfile{char-ini}
+\loadmarkfile{char-utf}
+\loadmarkfile{char-act}
+
+\loadmarkfile{mult-ini}
+\loadcorefile{mult-fst}
+\loadcorefile{mult-sys}
+\loadcorefile{mult-def}
+\loadmarkfile{mult-chk}
+\loadmarkfile{mult-cld}
+
+\loadmarkfile{luat-ini}
+
+\loadmarkfile{toks-ini}
+
+\loadmarkfile{node-ini}
+\loadmarkfile{node-fin}
+\loadmarkfile{node-mig}
+\loadmarkfile{node-par}
+%loadmarkfile{node-pag}
+
+\loadmarkfile{core-var}
+
+\loadmarkfile{back-ini}
+\loadmarkfile{lpdf-ini} % some day back-ini will load this
+\loadmarkfile{lpdf-pdx} % might be merged into lpdf-ini
+\loadmarkfile{back-pdf} % some day back-ini will load this
+
+\loadmarkfile{attr-ini}
+
+\loadmarkfile{core-env}
+
+\loadmarkfile{trac-tex}
+\loadmarkfile{trac-lmx}
+\loadmarkfile{trac-deb}
+
+\loadmarkfile{blob-ini} % not to be used, we only use a helper
+
+\loadcorefile{supp-box}
+
+\loadcorefile{supp-vis}
+\loadcorefile{supp-fun}
+
+\loadmarkfile{supp-ran}
+\loadmarkfile{supp-mat}
+\loadcorefile{supp-ali}
+\loadcorefile{supp-num}
+
+\loadmarkfile{typo-ini}
+
+\loadmarkfile{page-ins}
+\loadmarkfile{core-fil}
+\loadmarkfile{core-con}
+
+\loadcorefile{cont-fil}
+
+\loadmarkfile{regi-ini}
+\loadcorefile{regi-syn}
+\loadmarkfile{enco-ini}
+\loadmarkfile{hand-ini}
+
+\loadmarkfile{lang-ini}
+\loadmarkfile{lang-lab}
+\loadmarkfile{lang-wrd}
+
+\loadmarkfile{unic-ini}
+
+\loadmarkfile{core-gen}
+\loadmarkfile{core-uti}
+\loadmarkfile{core-two}
+
+\loadmarkfile{colo-ini}
+\loadmarkfile{colo-ext}
+
+\loadmarkfile{trac-vis}
+
+\loadmarkfile{lang-mis}
+\loadmarkfile{lang-url}
+
+\loadcorefile{lang-ger}
+\loadcorefile{lang-ita}
+\loadcorefile{lang-sla}
+\loadcorefile{lang-alt}
+\loadcorefile{lang-ana}
+\loadcorefile{lang-art}
+\loadcorefile{lang-bal}
+\loadcorefile{lang-cel}
+\loadcorefile{lang-grk}
+\loadcorefile{lang-ind}
+\loadcorefile{lang-ura}
+\loadcorefile{lang-vn}
+\loadcorefile{lang-cyr}
+
+\loadmarkfile{lang-ara}
+\loadmarkfile{lang-cjk}
+
+\loadmarkfile{symb-ini}
+
+\loadmarkfile{sort-ini}
+
+\loadmarkfile{pack-rul}
+
+\loadmarkfile{lxml-ini}
+\loadmarkfile{lxml-sor}
+
+\loadmarkfile{strc-ini}
+\loadmarkfile{strc-doc}
+\loadmarkfile{strc-mar}
+\loadmarkfile{strc-prc}
+\loadmarkfile{strc-sbe}
+\loadmarkfile{strc-lst}
+\loadmarkfile{strc-sec}
+\loadmarkfile{strc-num}
+\loadmarkfile{strc-ren}
+\loadmarkfile{strc-xml}
+\loadmarkfile{strc-pag} % hm, depends on core-num
+\loadmarkfile{strc-def} % might happen later
+\loadmarkfile{strc-ref}
+\loadmarkfile{strc-reg}
+
+\loadmarkfile{spac-hor}
+\loadmarkfile{spac-ver}
+\loadmarkfile{spac-ali}
+\loadmarkfile{spac-pag}
+\loadmarkfile{spac-fnt}
+\loadmarkfile{spac-par}
+\loadmarkfile{spac-def}
+\loadmarkfile{spac-grd}
+
+\loadmarkfile{anch-pos}
+
+\loadmarkfile{scrn-nav}
+\loadmarkfile{pack-obj}
+
+\loadmarkfile{strc-itm}
+\loadmarkfile{strc-des}
+\loadmarkfile{strc-syn}
+
+\loadmarkfile{core-sys}
+
+\loadmarkfile{page-ini}
+\loadmarkfile{page-flt}
+\loadmarkfile{page-bck}
+\loadmarkfile{page-not}
+\loadmarkfile{page-one}
+\loadmarkfile{page-lay}
+\loadmarkfile{page-txt}
+\loadmarkfile{page-sid}
+
+\loadmarkfile{strc-flt}
+
+\loadmarkfile{page-mis}
+\loadmarkfile{page-mul}
+\loadmarkfile{page-set}
+\loadmarkfile{pack-lyr}
+\loadmarkfile{page-mak}
+
+\loadmarkfile{page-lin}
+\loadmarkfile{page-par}
+\loadmarkfile{page-mar}
+
+\loadmarkfile{core-job} % why so late?
+
+\loadmarkfile{buff-ini}
+\loadmarkfile{buff-ver}
+
+\loadmarkfile{strc-blk}
+
+\loadmarkfile{page-imp}
+
+\loadmarkfile{scrn-int}
+\loadmarkfile{scrn-men}
+\loadmarkfile{scrn-but}
+\loadmarkfile{scrn-bar}
+\loadmarkfile{strc-bkm} % bookmarks
+
+\loadmarkfile{tabl-com}
+\loadmarkfile{tabl-pln}
+\loadcorefile{thrd-tab}
+\loadmarkfile{tabl-tab}
+\loadmarkfile{tabl-tbl}
+\loadmarkfile{tabl-ntb}
+\loadmarkfile{tabl-nte}
+\loadmarkfile{tabl-ltb}
+\loadmarkfile{tabl-tsp}
+
+\loadmarkfile{java-ini}
+
+\loadmarkfile{scrn-fld}
+\loadmarkfile{scrn-hlp}
+
+\loadmarkfile{char-enc}
+\loadmarkfile{font-ini}
+\loadmarkfile{font-unk}
+\loadmarkfile{font-tra}
+\loadmarkfile{font-uni}
+\loadmarkfile{font-col}
+\loadmarkfile{font-gds}
+
+\loadmarkfile{typo-spa}
+\loadmarkfile{typo-krn}
+\loadmarkfile{typo-mir}
+\loadmarkfile{typo-brk}
+\loadmarkfile{typo-cap}
+\loadmarkfile{typo-dig}
+\loadmarkfile{typo-rep}
+
+\loadmarkfile{type-ini}
+\loadmarkfile{type-set}
+
+\loadmarkfile{scrp-ini}
+
+\loadmarkfile{prop-ini}
+\loadmarkfile{prop-lay}
+\loadmarkfile{prop-mis}
+
+\loadmarkfile{mlib-ctx}
+\loadmarkfile{mlib-pdf}
+\loadmarkfile{mlib-pps}
+
+\loadmarkfile{meta-ini}
+\loadmarkfile{meta-tex}
+\loadmarkfile{meta-pdf}
+\loadmarkfile{meta-fun}
+
+\loadmarkfile{meta-pag}
+
+\loadmarkfile{page-flw}
+\loadmarkfile{page-spr}
+\loadmarkfile{page-plg}
+\loadmarkfile{page-str}
+
+\loadmarkfile{anch-pgr} % overloads tabl-tbl
+\loadmarkfile{anch-bar}
+\loadmarkfile{anch-snc}
+
+\loadmarkfile{math-ini}
+\loadmarkfile{math-pln}
+\loadmarkfile{math-for}
+\loadmarkfile{math-def}
+\loadmarkfile{math-ali}
+\loadmarkfile{math-arr}
+\loadmarkfile{math-frc}
+\loadmarkfile{math-scr}
+\loadmarkfile{math-int}
+\loadmarkfile{math-del}
+\loadmarkfile{math-inl}
+\loadmarkfile{math-dis}
+\loadmarkfile{math-lan}
+
+\loadmarkfile{strc-mat}
+
+\loadmarkfile{chem-ini}
+\loadmarkfile{chem-str}
+
+\loadmarkfile{core-fnt}
+\loadmarkfile{node-rul}
+
+\loadmarkfile{strc-not}
+\loadmarkfile{strc-lnt}
+
+\loadmarkfile{core-mis}
+
+\loadmarkfile{grph-trf}
+\loadmarkfile{grph-inc}
+\loadmarkfile{grph-fig}
+
+\loadmarkfile{pack-box}
+\loadmarkfile{pack-bar}
+\loadmarkfile{page-app}
+\loadmarkfile{meta-fig}
+
+\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented)
+
+\loadcorefile{lang-spa}
+
+\loadmarkfile{bibl-bib}
+\loadmarkfile{bibl-tra}
+
+\loadmarkfile{x-xtag} % at some point this will not be preloaded
+
+\loadcorefile{meta-xml}
+
+\loadcorefile{cont-log}
+
+\loadmarkfile{task-ini}
+
+\loadmarkfile{core-ctx}
+
+\loadmarkfile{core-ini}
+\loadmarkfile{core-def}
+
+%usemodule[x][res-04] % xml resource libraries
+%usemodule[x][res-08] % rlx runtime conversion
+%usemodule[x][res-12] % rli external indentification
+
+\unprotect
+
+\setupcurrentlanguage[\s!en]
+
+\prependtoks
+ \ctxlua{statistics.starttiming(ctx)}%
+\to \everyjob
+
+\appendtoks
+ \ctxlua{statistics.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
+
+\appendtoks
+ \ctxlua {
+ statistics.report_storage("log")
+ statistics.save_fmt_status("\jobname","\contextversion","context.tex")
+ }%
+\to \everydump
+
+\protect \errorstopmode \dump \endinput
diff --git a/tex/context/base/context.rme b/tex/context/base/context.rme
new file mode 100644
index 000000000..1b1e48902
--- /dev/null
+++ b/tex/context/base/context.rme
@@ -0,0 +1,85 @@
+Some Basic information
+----------------------
+
+There are currently three interfaces available:
+
+ cont-en the english version
+ cont-de the german version
+ cont-nl the dutch version
+ cont-cz the czech version
+ cont-ro the romanian version
+ cont-it the italian version
+
+One should compile one of these (or all) into a fmt file.
+When one uses the main file,
+
+ context the undefined version
+
+TeX ask for an interface language as well as a message
+language. Here one has to specify the full name (english,
+german, dutch, etc.) or use the default (enter). The \
+savest way to update the TeX and MetaPost format files
+is to use TeXExec:
+
+texexec --make --alone en nl metafun
+
+In the TeXExec manual you can read how to generate a format
+with specific fonts and patterns.
+
+By default only the english hyphenation patterns are loaded,
+unless more are enabled in:
+
+ cont-usr the typesetting language specifications
+
+Furthermore, users can preset commands etc in the file
+
+ cont-sys a system file loaded at runtime
+
+For questions and remarks on ConTeXt, one can subscribe to
+the list:
+
+ ntg-context@ntg.nl
+
+by sending the message
+
+ subscribe ntg-context
+
+to the list server:
+
+ majordomo@ntg.nl
+
+One can find more info at:
+
+ www.pragma-ade.com
+
+or at the mirror sites mentioned there.
+
+Don't hesitate to ask questions. ConTeXt can do a lot, and
+the manuals are always a bit behind and incomplete. Also take
+a look at the files
+
+ mreadme.pdf
+ minstall.pdf
+ mtexexec.pdf
+ mtexutil.pdf
+
+The teTeX, fpTeX, and 4TeX distributions demonstrate how
+ConTeXt can be integrated in a TeX directory structure.
+
+-------------------------
+
+functionality removed from mkiv:
+
+page-log : layers can do teh same and are more flexible
+core-dat : just use lua for database purposes
+core-swd : this was a temporary solution
+
+functionality changed in mkii and mkiv:
+
+xtag-map : no longer preloaded
+xtag-stk : no longer preloaded
+xtag-prs : no longer preloaded
+
+-------------------------
+
+Hans Hagen, pragma@wxs.nl
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
new file mode 100644
index 000000000..47489658e
--- /dev/null
+++ b/tex/context/base/context.tex
@@ -0,0 +1,225 @@
+%D \module
+%D [ file=context,
+%D version=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.
+
+\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
+
+%D From the next string (which is set by the script that assembles the
+%D distribution) later on we will calculate a number that can be used
+%D by use modules to identify the feature level. Starting with version
+%D 2004.8.30 the low level interface is english. Watch out and adapt
+%D your styles an modules.
+
+\edef\contextformat {\jobname}
+\edef\contextversion{2010.05.24 13:05}
+
+%D For those who want to use this:
+
+\let\fmtname \contextformat
+\let\fmtversion\contextversion
+
+\let\showcontextbanner\relax
+
+%D Here we will test for what branch of source files we will take. The
+%D file suffix depends on the maintream engine: either lua enhanced,
+%D or traditional:
+%D
+%D \starttyping
+%D mki : low level dutch
+%D mkii : low level english
+%D mkiv : lua enhanced
+%D \stoptyping
+%D
+%D There is no \type {mkiii} unless you want to tag the transition
+%D version that way (going completely etex, code cleanup and such).
+
+\ifx\normalinput\undefined \let\normalinput\input \fi
+
+%D We have two versions, one for \PDFTEX\ and \XETEX, and one for
+%D \LUATEX.
+
+\chardef\contextmarkmode = \ifx\directlua\undefined 2 \else 4 \fi
+
+\def\loadcorefile#1{\normalinput#1\relax}
+\def\loadmarkfile#1{\normalinput#1.\mksuffix\relax}
+
+\ifnum\contextmarkmode=4
+ \def\loadmarkiifile#1{} \let\loadmarkivfile\loadcorefile \edef\mksuffix {mkiv} \edef\contextmark{MKIV}
+\else
+ \def\loadmarkivfile#1{} \let\loadmarkiifile\loadcorefile \edef\mksuffix {mkii} \edef\contextmark{MKII}
+\fi
+
+\let\loadmkiifile\loadmarkiifile
+\let\loadmkivfile\loadmarkivfile
+\let\loadmkfile \loadmarkfile
+
+%D Welcome to the main module. When this module is ran through
+%D \type{initex} or \type {tex -i} or \type {whatevertex} using
+%D \type{whatever switch}, the \CONTEXT\ format file is
+%D generated. During this process the user is asked for an
+%D interface language. Supplying \type{dutch} will generate a
+%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\ (for \MKII):
+%D
+%D \starttyping
+%D texexec --make [--alone] [--engine] [--all]
+%D texexec --make [--alone] [--engine] en nl ... metafun mptopdf
+%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
+%D coming from another macro package, don't assume that macros
+%D with the same name are doing the same! \CONTEXT\ was written
+%D from scratch and therefore similarities are often a coincidence
+%D (to some extent one always ends up with the same names for
+%D similar concepts). The underlying models for elementary subsystems
+%D that deal with encodings, languages and fonts probably differ.
+%D
+%D Time has learned that users coming from \LATEX\ should not fall
+%D into thinking that macros like \type {\protect} represent the
+%D same functionality in both systems; actually, due to the way
+%D \CONTEXT\ is set up, some of those macros do complete different
+%D things. Macro packages evolve independent of each other, which
+%D means that code written for one system will not work in another
+%D system, unless it's real generic code.
+%D
+%D An API will become available soon (keep an eye on the ConTeXt
+%D Wiki www.contextgarden.org) and or listen in to the context
+%D mailing list (ntg-context@ntg.nl). Much additional information
+%D can be found at the PRAGMA website (www.pragma-ade.com).
+
+%D We now go either the \MKII\ or \MKIV\ route:
+
+\loadmarkfile{context}
+
+%D Let's quit this file when doing a \type {cont-..} generation.
+
+\doifparentfileelse{context}{\donothing}{\endinput}
+
+%D Unless we're generating a \type {cont-..} format, we also
+%D do the following.
+
+%D Except from english, no hyphenation patterns are loaded
+%D yet. Users can specify their needs in the next module:
+
+\loaduserspecifications
+
+%D Next we default to the same language as the interface.
+
+\unprotect
+
+\installlanguage [\s!us] [\c!state=\v!start]
+
+\startinterface english
+ \installlanguage [\s!gb] [\c!state=\v!start]
+\stopinterface
+
+\appendtoks \language [\s!us] \to \everyjob
+\appendtoks \mainlanguage [\s!us] \to \everyjob
+
+\startinterface german
+
+ \installlanguage [\s!de] [\c!state=\v!start]
+
+ \appendtoks \language [\s!de] \to \everyjob
+ \appendtoks \mainlanguage [\s!de] \to \everyjob
+
+\stopinterface
+
+\startinterface dutch
+
+ \installlanguage [\s!nl] [\c!state=\v!start]
+
+ \appendtoks \language [\s!nl] \to \everyjob
+ \appendtoks \mainlanguage [\s!nl] \to \everyjob
+
+\stopinterface
+
+\startinterface czech
+
+ \installlanguage [\s!cs] [\c!state=\v!start]
+
+ \appendtoks \language [\s!cs] \to \everyjob
+ \appendtoks \mainlanguage [\s!cs] \to \everyjob
+
+\stopinterface
+
+\startinterface italian
+
+ \installlanguage [\s!it] [\c!state=\v!start]
+
+ \appendtoks \language [\s!it] \to \everyjob
+ \appendtoks \mainlanguage [\s!it] \to \everyjob
+
+\stopinterface
+
+\startinterface romanian
+
+ \installlanguage [\s!ro] [\c!state=\v!start]
+
+ \appendtoks \language [\s!ro] \to \everyjob
+ \appendtoks \mainlanguage [\s!ro] \to \everyjob
+
+\stopinterface
+
+\startinterface french
+
+ \installlanguage [\s!fr] [\c!state=\v!start]
+
+ \appendtoks \language [\s!fr] \to \everyjob
+ \appendtoks \mainlanguage [\s!fr] \to \everyjob
+
+\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.
+
+\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
+%D path.
+
+% \readlocfile{cont-def.tex}
+% {\writestatus{loading}{adding extensions from cont-def}}
+% {}
+
+%D Now dumping the format is all that's left to be done.
+
+\errorstopmode \dump
+
+\endinput
diff --git a/tex/context/base/core-con.lua b/tex/context/base/core-con.lua
new file mode 100644
index 000000000..dca1c7d10
--- /dev/null
+++ b/tex/context/base/core-con.lua
@@ -0,0 +1,605 @@
+if not modules then modules = { } end modules ['core-con'] = {
+ version = 1.001,
+ comment = "companion to core-con.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module implements a bunch of conversions. Some are more
+efficient than their <l n='tex'/> counterpart, some are even
+slower but look nicer this way.</p>
+
+<p>Some code may move to a module in the language namespace.</p>
+--ldx]]--
+
+local utf = unicode.utf8
+
+local floor, date, time, concat = math.floor, os.date, os.time, table.concat
+local lower, format, rep = string.lower, string.format, string.rep
+local texsprint, utfchar = tex.sprint, utf.char
+local tonumber, tostring = tonumber, tostring
+
+local ctxcatcodes = tex.ctxcatcodes
+
+converters = converters or { }
+languages = languages or { }
+
+--~ ['arabic-digits'] = {
+--~ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664,
+--~ 0x0665, 0x0666, 0x0667, 0x0668, 0x0669
+--~ },
+--~ ['persian-digits'] = {
+--~ 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4,
+--~ 0x06F5, 0x06F6, 0x06F7, 0x06F8, 0x06F9
+--~ },
+
+languages.counters = {
+ ['**'] = {
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+ 0x0066, 0x0067, 0x0068, 0x0069, 0x006A,
+ 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
+ 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A
+ },
+ ['slovenian'] = {
+ 0x0061, 0x0062, 0x0063, 0x010D, 0x0064,
+ 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0072, 0x0073, 0x0161,
+ 0x0074, 0x0075, 0x0076, 0x007A, 0x017E
+ },
+ ['greek'] = { -- this should be the lowercase table
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,
+ 0x0396, 0x0397, 0x0398, 0x0399, 0x039A,
+ 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5,
+ 0x03A6, 0x03A7, 0x03A8, 0x03A9
+ },
+ ['arabic'] = {
+ 0x0627, 0x0628, 0x062C, 0x062F, 0x0647,
+ 0x0648, 0x0632, 0x062D, 0x0637, 0x0649,
+ 0x0643, 0x0644, 0x0645, 0x0646, 0x0633,
+ 0x0639, 0x0641, 0x0635, 0x0642, 0x0631,
+ 0x0634, 0x062A, 0x062B, 0x062E, 0x0630,
+ 0x0636, 0x0638, 0x063A,
+ },
+ ['persian'] = {
+ 0x0627, 0x0628, 0x062C, 0x062F, 0x0647,
+ 0x0648, 0x0632, 0x062D, 0x0637, 0x0649,
+ 0x06A9, 0x0644, 0x0645, 0x0646, 0x0633,
+ 0x0639, 0x0641, 0x0635, 0x0642, 0x0631,
+ 0x0634, 0x062A, 0x062B, 0x062E, 0x0630,
+ 0x0636, 0x0638, 0x063A,
+ },
+ ['thai'] = {
+ 0xE050, 0xE051, 0xE052, 0xE053, 0xE054,
+ 0xE055, 0xE056, 0xE057, 0xE058, 0xE059
+ },
+ ['devangari'] = {
+ 0x0966, 0x0967, 0x0968, 0x0969, 0x096A,
+ 0x096B, 0x096C, 0x096D, 0x096E, 0x096F
+ },
+ ['gurmurkhi'] = {
+ 0x0A66, 0x0A67, 0x0A68, 0x0A69, 0x0A6A,
+ 0x0A6B, 0x0A6C, 0x0A6D, 0x0A6E, 0x0A6F
+ },
+ ['gujarati'] = {
+ 0x0AE6, 0x0AE7, 0x0AE8, 0x0AE9, 0x0AEA,
+ 0x0AEB, 0x0AEC, 0x0AED, 0x0AEE, 0x0AEF
+ },
+ ['tibetan'] = {
+ 0x0F20, 0x0F21, 0x0F22, 0x0F23, 0x0F24,
+ 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29
+ },
+ ['korean'] = {
+ 0x3131, 0x3134, 0x3137, 0x3139, 0x3141,
+ 0x3142, 0x3145, 0x3147, 0x3148, 0x314A,
+ 0x314B, 0x314C, 0x314D, 0x314E
+ },
+ ['korean-parent'] = { -- parenthesed
+ 0x3200, 0x3201, 0x3202, 0x3203, 0x3204,
+ 0x3205, 0x3206, 0x3207, 0x3208, 0x3209,
+ 0x320A, 0x320B, 0x320C, 0x320D
+ },
+ ['korean-circle'] = { -- circled
+ 0x3260, 0x3261, 0x3262, 0x3263, 0x3264,
+ 0x3265, 0x3266, 0x3267, 0x3268, 0x3269,
+ 0x326A, 0x326B, 0x326C, 0x326D
+ },
+}
+
+local counters = languages.counters
+
+counters['ar'] = counters['arabic']
+counters['gr'] = counters['greek']
+counters['g'] = counters['greek']
+counters['sl'] = counters['slovenian']
+counters['kr'] = counters['korean']
+counters['kr-p'] = counters['korean-parent']
+counters['kr-c'] = counters['korean-circle']
+
+local fallback = utf.byte('0')
+
+local function chr(n,m)
+ if n > 0 and n < 27 then
+ texsprint(utfchar(n+m))
+ end
+end
+local function chrs(n,m)
+ if n > 26 then
+ chrs(floor((n-1)/26),m)
+ n = (n-1)%26 + 1
+ end
+ texsprint(utfchar(n+m))
+end
+local function maxchrs(n,m,cmd)
+ if n > m then
+ maxchrs(floor((n-1)/m),m,cmd)
+ n = (n-1)%m + 1
+ end
+ texsprint(ctxcatcodes, format("%s{%s}",cmd,n))
+end
+
+converters.chr = chr
+converters.chrs = chrs
+converters.maxchrs = maxchrs
+
+--~ more efficient but needs testing
+--~
+--~ local escapes = utffilters.private.escapes
+--~
+--~ local function do_alphabetic(n,mapping,chr)
+--~ local max = #mapping
+--~ if n > max then
+--~ do_alphabetic(floor((n-1)/max),max,chr)
+--~ n = (n-1)%max+1
+--~ end
+--~ n = chr(n,mapping)
+--~ texsprint(ctxcatcodes,escapes[n] or utfchar(n))
+--~ end
+
+--~ local lccodes, uccodes = characters.lccode, characters.uccode
+
+--~ local function do_alphabetic(n,mapping,chr)
+--~ local max = #mapping
+--~ if n > max then
+--~ do_alphabetic(floor((n-1)/max),mapping,chr)
+--~ n = (n-1)%max+1
+--~ end
+--~ characters.flush(chr(n,mapping))
+--~ end
+--~
+--~ local function lowercased(n,mapping) return characters.lccode(mapping[n] or fallback) end
+--~ local function uppercased(n,mapping) return characters.uccode(mapping[n] or fallback) end
+--~
+--~ function converters.alphabetic(n,code)
+--~ do_alphabetic(n,counters[code] or counters['**'],lowercased) -- lccode catches wrong tables
+--~ end
+--~
+--~ function converters.Alphabetic(n,code)
+--~ do_alphabetic(n,counters[code] or counters['**'],uppercased)
+--~ end
+
+--
+
+local function do_alphabetic(n,mapping,mapper)
+ local chr = mapper(mapping[n] or fallback)
+ local max = #mapping
+ if n > max then
+ do_alphabetic(floor((n-1)/max),mapping,mapper)
+ n = (n-1)%max+1
+ end
+ characters.flush(chr)
+end
+
+function converters.alphabetic(n,code)
+ do_alphabetic(n,counters[code] or counters['**'],characters.lccode)
+end
+
+function converters.Alphabetic(n,code)
+ do_alphabetic(n,counters[code] or counters['**'],characters.uccode)
+end
+
+--
+
+function converters.character (n) chr (n,96) end
+function converters.Character (n) chr (n,64) end
+function converters.characters(n) chrs(n,96) end
+function converters.Characters(n) chrs(n,64) end
+
+function converters.weekday(day,month,year)
+ texsprint(date("%w",time{year=year,month=month,day=day})+1)
+end
+
+function converters.isleapyear(year)
+ return (year % 400 == 0) or ((year % 100 ~= 0) and (year % 4 == 0))
+end
+
+function converters.leapyear(year)
+ if converters.isleapyear(year) then texsprint(1) else texsprint(0) end
+end
+
+local days = {
+ [false] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ [true] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+}
+
+function converters.nofdays(year,month)
+ texsprint(days[converters.isleapyear(year)][month])
+end
+
+function converters.year () texsprint(date("%Y")) end
+function converters.month () texsprint(date("%m")) end
+function converters.hour () texsprint(date("%H")) end
+function converters.minute () texsprint(date("%M")) end
+function converters.second () texsprint(date("%S")) end
+function converters.textime() texsprint(tonumber(date("%H"))*60+tonumber(date("%M"))) end
+
+local roman = {
+ { [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' },
+ { [0] = '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC' },
+ { [0] = '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM' },
+}
+
+local function toroman(n)
+ if n >= 4000 then
+ return toroman(floor(n/1000)) .. " " .. toroman(n%1000)
+ else
+ return rep("M",floor(n/1000)) .. roman[3][floor((n%1000)/100)] ..
+ roman[2][floor((n%100)/10)] .. roman[1][floor((n% 10)/1)]
+ end
+end
+
+function converters.romannumerals(n) return texsprint(lower(toroman(n))) end
+function converters.Romannumerals(n) return texsprint( toroman(n) ) end
+
+converters.toroman = toroman
+
+--~ local small = {
+--~ 0x0627, 0x066E, 0x062D, 0x062F, 0x0647, 0x0648, 0x0631
+--~ }
+
+--~ local large = {
+--~ { 0x0627, 0x0628, 0x062C, 0x062F, 0x0647, 0x0648, 0x0632, 0x062D, 0x0637, },
+--~ { 0x064A, 0x0643, 0x0644, 0x0645, 0x0646, 0x0633, 0x0639, 0x0641, 0x0635, },
+--~ { 0x0642, 0x0631, 0x0634, 0x062A, 0x062B, 0x062E, 0x0630, 0x0636, 0x0638, },
+--~ { 0x063A },
+--~ }
+
+local small = {
+ "ا", "ٮ", "ح", "د", "ه", "و", "ر",
+}
+
+local medium = {
+ "ا", "ب", "ج", "د", "ه", "و","ز", "ح", "ط" ,
+ "ي", "ك", "ل", "م", "ن", "س", "ع", "ف", "ص" ,
+ "ق", "ر", "ش", "ت", "ث", "خ", "ذ", "ض", "ظ" ,
+ "غ" ,
+}
+
+local large = {
+ { "ا", "ب", "ج", "د", "ه", "و","ز", "ح", "ط" },
+ { "ي", "ك", "ل", "م", "ن", "س", "ع", "ف", "ص" },
+ { "ق", "ر", "ش", "ت", "ث", "خ", "ذ", "ض", "ظ" },
+ { "غ" },
+}
+
+function converters.toabjad(n,what)
+ if n <= 0 or n >= 2000 then
+ return tostring(n)
+ elseif what == 2 and n <= 7 then
+ return small[n]
+ elseif what == 3 and n <= 28 then
+ return medium[n]
+ else
+ local a, b, c, d
+ a, n = floor(n/1000), n % 1000 -- mod(n,1000)
+ b, n = floor(n/ 100), n % 100 -- mod(n, 100)
+ c, n = floor(n/ 10), n % 10 -- mod(n, 10)
+ d, n = floor(n/ 1), n % 1 -- mod(n, 1)
+ return (large[4][a] or "") .. (large[3][b] or "") .. (large[2][c] or "") .. (large[1][d] or "")
+ end
+end
+
+function converters.abjadnumerals (n) return texsprint(converters.toabjad(n,false)) end
+function converters.abjadnodotnumerals(n) return texsprint(converters.toabjad(n,true)) end
+
+local vector = {
+ normal = {
+ [0] = "〇",
+ [1] = "一",
+ [2] = "二",
+ [3] = "三",
+ [4] = "四",
+ [5] = "五",
+ [6] = "六",
+ [7] = "七",
+ [8] = "八",
+ [9] = "九",
+ [10] = "十",
+ [100] = "百",
+ [1000] = "千",
+ [10000] = "万",
+ [100000000] = "亿",
+ },
+ cap = {
+ [0] = "零",
+ [1] = "壹",
+ [2] = "贰",
+ [3] = "叁",
+ [4] = "肆",
+ [5] = "伍",
+ [6] = "陆",
+ [7] = "柒",
+ [8] = "捌",
+ [9] = "玖",
+ [10] = "拾",
+ [100] = "佰",
+ [1000] = "仟",
+ [10000] = "萬",
+ [100000000] = "亿",
+ },
+ all = {
+ [0] = "〇",
+ [1] = "一",
+ [2] = "二",
+ [3] = "三",
+ [4] = "四",
+ [5] = "五",
+ [6] = "六",
+ [7] = "七",
+ [8] = "八",
+ [9] = "九",
+ [10] = "十",
+ [20] = "廿",
+ [30] = "卅",
+ [100] = "百",
+ [1000] = "千",
+ [10000] = "万",
+ [100000000] = "亿",
+ }
+}
+
+--~ function tochinese(n,name) -- normal, caps, all
+--~ local result = { }
+--~ local vector = vector[name] or vector.normal
+--~ while true do
+--~ if n == 0 then
+--~ break
+--~ elseif n >= 100000000 then
+--~ local m = floor(n/100000000)
+--~ if m > 1 then result[#result+1] = tochinese(m) end
+--~ result[#result+1] = vector[100000000]
+--~ n = n % 100000000
+--~ elseif n >= 10000000 then
+--~ result[#result+1] = tochinese(floor(n/10000))
+--~ result[#result+1] = vector[10000]
+--~ n = n % 10000
+--~ elseif n >= 1000000 then
+--~ result[#result+1] = tochinese(floor(n/10000))
+--~ result[#result+1] = vector[10000]
+--~ n = n % 10000
+--~ elseif n >= 100000 then
+--~ result[#result+1] = tochinese(floor(n/10000))
+--~ result[#result+1] = vector[10000]
+--~ n = n % 10000
+--~ elseif n >= 10000 then
+--~ local m = floor(n/10000)
+--~ if m > 1 then result[#result+1] = vector[m] end
+--~ result[#result+1] = vector[10000]
+--~ n = n % 10000
+--~ elseif n >= 1000 then
+--~ local m = floor(n/1000)
+--~ if m > 1 then result[#result+1] = vector[m] end
+--~ result[#result+1] = vector[1000]
+--~ n = n % 1000
+--~ elseif n >= 100 then
+--~ local m = floor(n/100)
+--~ if m > 1 then result[#result+1] = vector[m] end
+--~ result[#result+1] = vector[100]
+--~ n = n % 100
+--~ elseif n >= 10 then
+--~ local m = floor(n/10)
+--~ if vector[m*10] then
+--~ result[#result+1] = vector[m*10]
+--~ else
+--~ result[#result+1] = vector[m]
+--~ result[#result+1] = vector[10]
+--~ end
+--~ n = n % 10
+--~ else
+--~ result[#result+1] = vector[n]
+--~ break
+--~ end
+--~ end
+--~ return concat(result)
+--~ end
+
+function tochinese(n,name) -- normal, caps, all
+ -- improved version by Li Yanrui
+ local result = { }
+ local vector = vector[name] or vector.normal
+ while true do
+ if n == 0 then
+ break
+ elseif n >= 100000000 then
+ local m = floor(n/100000000)
+ result[#result+1] = tochinese(m,name)
+ result[#result+1] = vector[100000000]
+ local z = n - m * 100000000
+ if z > 0 and z < 10000000 then result[#result+1] = vector[0] end
+ n = n % 100000000
+ elseif n >= 10000000 then
+ local m = floor(n/10000)
+ result[#result+1] = tochinese(m,name)
+ result[#result+1] = vector[10000]
+ local z = n - m * 10000
+ if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ n = n % 10000
+ elseif n >= 1000000 then
+ local m = floor(n/10000)
+ result[#result+1] = tochinese(m,name)
+ result[#result+1] = vector[10000]
+ local z = n - m * 10000
+ if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ n = n % 10000
+ elseif n >= 100000 then
+ local m = floor(n/10000)
+ result[#result+1] = tochinese(m,name)
+ result[#result+1] = vector[10000]
+ local z = n - m * 10000
+ if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ n = n % 10000
+ elseif n >= 10000 then
+ local m = floor(n/10000)
+ result[#result+1] = vector[m]
+ result[#result+1] = vector[10000]
+ local z = n - m * 10000
+ if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ n = n % 10000
+ elseif n >= 1000 then
+ local m = floor(n/1000)
+ result[#result+1] = vector[m]
+ result[#result+1] = vector[1000]
+ local z = n - m * 1000
+ if z > 0 and z < 100 then result[#result+1] = vector[0] end
+ n = n % 1000
+ elseif n >= 100 then
+ local m = floor(n/100)
+ result[#result+1] = vector[m]
+ result[#result+1] = vector[100]
+ local z = n - m * 100
+ if z > 0 and z < 10 then result[#result+1] = vector[0] end
+ n = n % 100
+ elseif n >= 10 then
+ local m = floor(n/10)
+ if m > 1 and vector[m*10] then
+ result[#result+1] = vector[m*10]
+ else
+ result[#result+1] = vector[m]
+ result[#result+1] = vector[10]
+ end
+ n = n % 10
+ else
+ result[#result+1] = vector[n]
+ break
+ end
+ end
+ if (result[1] == vector[1] and result[2] == vector[10]) then
+ result[1] = ""
+ end
+ return concat(result)
+end
+
+--~ local t = { 1,10,15,25,35,45,11,100,111,1111,10000,11111,100000,111111,1111111,11111111,111111111,100000000,1111111111,11111111111,111111111111,1111111111111 }
+--~ for k=1,#t do
+--~ local v = t[k]
+--~ print(v,tochinese(v),tochinese(v,"all"),tochinese(v,"cap"))
+--~ end
+
+function converters.chinesenumerals (n) return texsprint(tochinese(n,"normal")) end
+function converters.chinesecapnumerals(n) return texsprint(tochinese(n,"cap" )) end
+function converters.chineseallnumerals(n) return texsprint(tochinese(n,"all" )) end
+
+--~ Well, since the one asking for this didn't test it the following code is not
+--~ enabled.
+--~
+--~ -- This Lua version is based on a Javascript by Behdad Esfahbod which in turn
+--~ -- is based on GPL'd code by Roozbeh Pournader of the The FarsiWeb Project
+--~ -- Group: http://www.farsiweb.info/jalali/jalali.js.
+--~ --
+--~ -- We start tables at one, I kept it zero based in order to stay close to
+--~ -- the original.
+--~ --
+--~ -- Conversion by Hans Hagen
+--~
+--~ local g_days_in_month = { [0]=31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+--~ local j_days_in_month = { [0]=31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29 }
+--~
+--~ local function div(a,b)
+--~ return math.floor(a/b)
+--~ end
+--~
+--~ local function remainder(a,b)
+--~ return a - div(a,b)*b
+--~ end
+--~
+--~ function gregorian_to_jalali(gy,gm,gd)
+--~ local jy, jm, jd, g_day_no, j_day_no, j_np, i
+--~ gy, gm, gd = gy - 1600, gm - 1, gd - 1
+--~ g_day_no = 365*gy + div((gy+3),4) - div((gy+99),100) + div((gy+399),400)
+--~ i = 0
+--~ while i < gm do
+--~ g_day_no = g_day_no + g_days_in_month[i]
+--~ i = i + 1
+--~ end
+--~ if (gm>1 and ((gy%4==0 and gy%100~=0) or (gy%400==0))) then
+--~ g_day_no = g_day_no + 1
+--~ end
+--~ g_day_no = g_day_no + gd
+--~ j_day_no = g_day_no - 79
+--~ j_np = div(j_day_no,12053)
+--~ j_day_no = remainder(j_day_no,12053)
+--~ jy = 979 + 33*j_np + 4*div(j_day_no,1461)
+--~ j_day_no = remainder(j_day_no,1461)
+--~ if j_day_no >= 366 then
+--~ jy = jy + div((j_day_no-1),365)
+--~ j_day_no = remainder((j_day_no-1),365)
+--~ end
+--~ i = 0
+--~ while i < 11 and j_day_no >= j_days_in_month[i] do
+--~ j_day_no = j_day_no - j_days_in_month[i]
+--~ i = i + 1
+--~ end
+--~ jm = i + 1
+--~ jd = j_day_no + 1
+--~ return jy, jm, jd
+--~ end
+--~
+--~ function jalali_to_gregorian(jy,jm,jd)
+--~ local gy, gm, gd, g_day_no, j_day_no, leap, i
+--~ jy, jm, jd = jy - 979, jm - 1, jd - 1
+--~ j_day_no = 365*jy + div(jy,33)*8 + div((remainder(jy,33)+3),4)
+--~ i = 0
+--~ while i < jm do
+--~ j_day_no = j_day_no + j_days_in_month[i]
+--~ i = i + 1
+--~ end
+--~ j_day_no = j_day_no + jd
+--~ g_day_no = j_day_no + 79
+--~ gy = 1600 + 400*div(g_day_no,146097)
+--~ g_day_no = remainder (g_day_no, 146097)
+--~ leap = 1
+--~ if g_day_no >= 36525 then
+--~ g_day_no = g_day_no - 1
+--~ gy = gy + 100*div(g_day_no,36524)
+--~ g_day_no = remainder (g_day_no, 36524)
+--~ if g_day_no >= 365 then
+--~ g_day_no = g_day_no + 1
+--~ else
+--~ leap = 0
+--~ end
+--~ end
+--~ gy = gy + 4*div(g_day_no,1461)
+--~ g_day_no = remainder (g_day_no, 1461)
+--~ if g_day_no >= 366 then
+--~ leap = 0
+--~ g_day_no = g_day_no - 1
+--~ gy = gy + div(g_day_no, 365)
+--~ g_day_no = remainder(g_day_no, 365)
+--~ end
+--~ i = 0
+--~ while g_day_no >= g_days_in_month[i] + ((i == 1 and leap) or 0) do
+--~ g_day_no = g_day_no - g_days_in_month[i] + ((i == 1 and leap) or 0)
+--~ i = i + 1
+--~ end
+--~ gm = i + 1
+--~ gd = g_day_no + 1
+--~ return gy, gm, gd
+--~ end
+--~
+--~ print(gregorian_to_jalali(2009,02,24))
+--~ print(jalali_to_gregorian(1387,12,06))
diff --git a/tex/context/base/core-con.mkii b/tex/context/base/core-con.mkii
new file mode 100644
index 000000000..c39bdd9d4
--- /dev/null
+++ b/tex/context/base/core-con.mkii
@@ -0,0 +1,969 @@
+%D \module
+%D [ file=core-con,
+%D version=1997.26.08,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Conversion,
+%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 / Conversion}
+
+\unprotect
+
+\ifx\currentlanguage\undefined \let\currentlanguage\empty \fi
+\ifx\labeltext \undefined \let\labeltext\firstofoneargument \fi
+
+%D This module deals with all kind of conversions from numbers
+%D and dates. I considered splitting this module in a support
+%D one and a core one, but to keep things simple as well as
+%D preserve the overview, I decided against splitting.
+
+\let\spr\firstofoneargument % separator
+\let\stp\firstofoneargument % stopper
+
+% cleaner, some day:
+%
+% \def\isolateseparators % etex only, even works with list separator overloading
+% {\unexpanded\def\spr##1{{##1}}%
+% \unexpanded\def\stp##1{{##1}}}
+
+% needed for arab :
+
+\def\isolateseparators % even works with list separator overloading
+ {\def\spr##1{{##1}}%
+ \def\stp##1{{##1}}}
+
+%D \macros
+%D {numbers}
+%D
+%D First we deal with the dummy conversion of numbers using the
+%D \TEX\ primitive \type{\number}. The uppercase alternative is
+%D only there for compatibility with the other conversion
+%D macros. We could do without \type{#1} but this way we get
+%D rid of unwanted braces. For the savety we also define a
+%D non||sence uppercase alternative.
+%D
+%D \showsetup{numbers}
+%D
+%D \starttyping
+%D \def\numbers#1{\number#1}
+%D \def\Numbers#1{\number#1}
+%D \stoptyping
+%D
+%D Due to read ahead, as in \type{[\pagenumber\space]} the space will
+%D disappear, unless we use:
+
+\def\numbers#1{\purenumber{#1}}
+\def\Numbers#1{\purenumber{#1}}
+
+%D \macros
+%D {romannumerals,Romannumerals}
+%D
+%D \TEX\ the program uses a rather tricky conversion from
+%D numbers to their roman counterparts. This conversion could
+%D of course be programmed in \TEX\ itself, but I guess Knuth
+%D found the programming trick worth presenting.
+%D
+%D \showsetup{romannumerals}
+%D \showsetup{Romannumerals}
+
+%D When upcasing the result, we just follow the text book rules
+%D of expansion. Later on we'll see some more uppercase tricks.
+
+\def\romannumerals#1%
+ {\romannumeral#1}
+
+%D For some years we had \unknown
+%D
+%D \starttyping
+%D \def\Romannumerals#1%
+%D {\uppercase\expandafter{\romannumeral#1}}
+%D \stoptyping
+%D
+%D \unknown but we need to be fully expandable in order to get
+%D the utility output file right, so now we have the following
+%D solution. It was Patrick Gundlach who first noticed this
+%D ommision.
+
+\def\Romannumerals#1%
+ {\expandafter\doRomannumerals\number#1\relax}
+
+\def\doRomannumerals#1#2\relax % spaces after ifcase prevent \relax
+ {\ifnum#1#2<10
+ \ifcase0#1#2 \or I\or II\or III\or IV\or V\or VI\or VII\or VIII\or IX\fi
+ \else\ifnum#1#2<100
+ \ifcase0#1 \or X\or XX\or XXX\or XL\or L\or LX\or LXX\or LXXX\or XC\fi
+ \doRomannumerals#2\relax
+ \else\ifnum#1#2<1000
+ \ifcase0#1 \or C\or CC\or CCC\or CD\or D\or DC\or DCC\or DCCC\or CM\fi
+ \doRomannumerals#2\relax
+ \else\ifnum#1#2<4000
+ \ifcase0#1 \or M\or MM\or MMM\fi
+ \doRomannumerals#2\relax
+ \else
+ \uppercase\expandafter{\romannumeral#1#2}%
+ \fi\fi\fi\fi}
+
+%D \macros
+%D {character,Character}
+%D
+%D Converting a number into a character can of course only
+%D be done with numbers less or equal to~26. At the cost of
+%D much more macros a faster conversion is possible, using:
+%D
+%D \starttyping
+%D \setvalue{char1}{a} \def\character#1{\getvalue{char#1}}
+%D \stoptyping
+%D
+%D But we prefer a simpel \type{\case}.
+%D
+%D \showsetup{character}
+%D \showsetup{Character}
+
+\def\unknowncharacter{-} % else in lists \relax
+
+%D Big case statements but pretty fast:
+
+\def\character#1%
+ {\ifcase#1\unknowncharacter
+ \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m%
+ \or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z%
+ \else
+ \unknowncharacter
+ \fi}
+
+\def\Character#1%
+ {\ifcase#1\unknowncharacter
+ \or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M%
+ \or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z%
+ \else
+ \unknowncharacter
+ \fi}
+
+%D \macros
+%D {characters,Characters}
+%D
+%D Converting large numbers is supported by the next two
+%D macros. This time we just count on: $\cdots$~x, y, z, aa,
+%D ab, ac~$\cdots$.
+%D
+%D \showsetup{characters}
+%D \showsetup{Characters}
+
+%D The fully expandable alternative:
+
+\def\dodoconvertcharacters#1#2#3%
+ {\ifcase#3\else
+ \ifnum#3>#1
+ \expandafter\doconvertcharacters\expandafter#2\expandafter{\the\numexpr(#3+12)/#1-1\relax}%
+ \expandafter#2\expandafter{\the\numexpr#3-((#3+12)/#1-1)*#1\relax}%
+ \else
+ \expandafter#2\expandafter{\number#3}%
+ \fi
+ \fi}
+
+\def\doconvertcharacters{\dodoconvertcharacters{26}}
+
+\def\characters{\doconvertcharacters\character}
+\def\Characters{\doconvertcharacters\Character}
+
+%D \macros
+%D {greeknumerals,Greeknumerals}
+%D
+%D Why should we only honour the romans, and not the greek?
+
+\def\greeknumerals#1%
+ {% no longer needed: \mathematics
+ {\ifcase#1\unknowncharacter\or
+ \alpha \or \beta \or \gamma \or \delta \or
+ \varepsilon \or \zeta \or \eta \or \theta \or
+ \iota \or \kappa \or \lambda \or \mu \or
+ \nu \or \xi \or \omicron \or \pi \or
+ \varrho \or \sigma \or \tau \or \upsilon \or
+ \phi \or \chi \or \psi \or \omega
+ \else
+ \unknowncharacter
+ \fi}}
+
+\def\Greeknumerals#1%
+ {% no longer needed: \mathematics
+ {\ifcase#1\unknowncharacter \or
+ \Alpha \or \Beta \or \Gamma \or \Delta \or
+ \Epsilon \or \Zeta \or \Eta \or \Theta \or
+ \Iota \or \Kappa \or \Lambda \or \Mu \or
+ \Nu \or \Xi \or \Omicron \or \Pi \or
+ \Rho \or \Sigma \or \Tau \or \Upsilon \or
+ \Phi \or \Xi \or \Psi \or \Omega
+ \else
+ \unknowncharacter
+ \fi}}
+
+%D \macros
+%D {oldstylenumerals,oldstyleromannumerals}
+%D
+%D These conversions are dedicated to Frans Goddijn.
+
+\unexpanded\def\oldstylenumerals#1%
+ {{\os\number#1}}
+
+\unexpanded\def\oldstyleromannumerals#1%
+ {{\leftrulefalse\rightrulefalse\ss\txx\boxrulewidth.15ex
+ \ruledhbox spread .15em{\hss\uppercased{\romannumerals{#1}}\hss}}}
+
+%D \macros
+%D {protectconversion}
+%D
+%D The previous two commands are not robust enough to be
+%D passed to \type{\write} en \type{\message}. That's why we
+%D introduce:
+
+\def\protectconversion
+ {\def\doconvertcharacters##1{##1}} % was \relax
+ %{\def\doconvertcharacters##1{\ifcase0##1 0\else##1\fi}} more save
+
+%D \macros
+%D {normaltime,normalyear,normalmonth,normalday}
+%D
+%D The last part of this module is dedicated to converting
+%D dates. Because we want to use as meaningful commands as
+%D possible, and because \TEX\ already uses up some of those,
+%D we save the original meanings.
+
+\savenormalmeaning\time
+\savenormalmeaning\year
+\savenormalmeaning\month
+\savenormalmeaning\day
+
+%D \macros
+%D {month,MONTH}
+%D
+%D Converting the month number into a month name is done
+%D using a case statement, abstact values and the label
+%D mechanism. This way users can easily redefine a label from
+%D for instance german into austrian.
+%D
+%D \starttyping
+%D \setuplabeltext [de] [january=J\"anner]
+%D \stoptyping
+%D
+%D Anyhow, the conversion looks like:
+
+\def\domonthtag#1%
+ {\ifcase#1%
+ \or \v!january \or \v!february \or \v!march \or \v!april
+ \or \v!may \or \v!june \or \v!july \or \v!august
+ \or \v!september \or \v!october \or \v!november \or \v!december
+ \else
+ \v!unknown
+ \fi}
+
+\def\doconvertmonthlong #1{\labeltext{\domonthtag{#1}}}
+\def\doconvertmonthshort#1{\labeltext{\domonthtag{#1}:\s!mnem}}
+
+\let\doconvertmonth\doconvertmonthlong
+
+%D We redefine the \TEX\ primitive \type{\month} as:
+%D
+%D \showsetup{month}
+%D \showsetup{MONTH}
+
+\def\monthlong {\doconvertmonthlong}
+\def\monthshort{\doconvertmonthshort}
+\def\month {\doconvertmonth}
+
+\def\MONTH #1{{\let\labeltext\LABELTEXT\month {#1}}}
+\def\MONTHLONG #1{{\let\labeltext\LABELTEXT\monthlong {#1}}}
+\def\MONTHSHORT#1{{\let\labeltext\LABELTEXT\monthshort{#1}}}
+
+%D We never explicitly needed this, but Tobias Burnus pointed
+%D out that it would be handy to convert to the day of the
+%D week. In doing so, we have to calculate the total number of
+%D days, taking leapyears into account. For those who are
+%D curious:
+%D
+%D \startitemize[packed]
+%D \item years that can be divided by 4 are leapyears
+%D \item exept years that can be divided by 100
+%D \item unless years can be divided by 400
+%D \stopitemize
+%D
+%D This makes the year 1900 into a normal year and 1996 and
+%D 2000 into leap years, right? Well, converting to string
+%D looks familiar:
+
+\def\doconvertday#1%
+ {\labeltext
+ {\ifcase#1
+ \or \v!sunday \or \v!monday \or \v!tuesday \or \v!wednesday
+ \or \v!thursday \or \v!friday \or \v!saturday \fi}}
+
+%D \macros
+%D {getdayoftheweek, dayoftheweek}
+%D
+%D The conversion algoritm is an old one and a translation from
+%D a procedure written in MODULA~2 back in the 80's. I finaly
+%D found the 4--100-400 rules in some enclopedia. Look at this
+%D messy low level routine that takes the day, month and year
+%D as arguments:
+
+\newcount\normalweekday
+
+\def\getdayoftheweek#1#2#3%
+ {\bgroup
+ \!!counta#3\relax
+ \advance\!!counta \minusone
+ \!!countb\!!counta
+ \multiply\!!countb 365
+ \advance\!!countb \ifcase#2\relax
+ 0 \or 0 \or 31 \or 59 \or 90 \or120 \or151 \or
+ 181 \or212 \or243 \or273 \or304 \or334 \or365 \fi
+ \advance\!!countb #1\relax
+ \ifnum#2>2
+ \doifleapyearelse{#3}{\advance\!!countb 1}{}\relax
+ \fi
+ \!!countc\!!counta
+ \dosetdivision\!!countc4\!!countc
+ \advance\!!countb \!!countc
+ \!!countc\!!counta
+ \dosetdivision\!!countc{100}\!!countc
+ \advance\!!countb -\!!countc
+ \!!countc\!!counta
+ \dosetdivision\!!countc{400}\!!countc
+ \advance\!!countb \!!countc
+ \dosetmodulo\!!countb7\!!countb
+ \advance\!!countb \plusone
+ \@EA\egroup\@EA\normalweekday\the\!!countb\relax}
+
+\def\dayoftheweek#1#2#3%
+ {\getdayoftheweek{#1}{#2}{#3}\doconvertday{\normalweekday}}
+
+%D Using this macro in
+%D
+%D \startbuffer
+%D monday: \dayoftheweek {4} {5} {1992}
+%D friday: \dayoftheweek {16} {6} {1995}
+%D monday: \dayoftheweek {25} {8} {1997}
+%D saturday: \dayoftheweek {30} {8} {1997}
+%D tuesday: \dayoftheweek {2} {1} {1996}
+%D tuesday: \dayoftheweek {7} {1} {1997}
+%D tuesday: \dayoftheweek {13} {1} {1998}
+%D friday: \dayoftheweek {1} {1} {2000}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D The macro \type {\getdayoftheweek} can be used to calculate
+%D the number \type {\normalweekday}.
+
+%D \macros
+%D {weekday,WEEKDAY}
+%D
+%D The first one is sort of redundant. It takes the day
+%D number argument.
+%D
+%D \showsetup{weekday}
+%D \showsetup{WEEKDAY}
+
+\def\weekday
+ {\doconvertday}
+
+\def\WEEKDAY#1%
+ {{\let\labeltext\LABELTEXT\doconvertday{#1}}}
+
+%D \macros
+%D {weekoftheday}
+%D
+%D {\em not yet implemented:}
+%D
+%D \starttyping
+%D \def\weekoftheday#1#2#3%
+%D {}
+%D \stoptyping
+
+%D \macros
+%D {doifleapyearelse,
+%D getdayspermonth}
+%D
+%D Sometimes we need to know if we're dealing with a
+%D leapyear, so here is a testmacro:
+%D
+%D \starttyping
+%D \doifleapyearelse{year}{yes}{no}
+%D \stoptyping
+%D
+%D An example of its use can be seen in the macro
+%D
+%D \starttyping
+%D \getdayspermonth{year}{month}
+%D \stoptyping
+%D
+%D The number of days is available in the macro \type
+%D {\numberofdays}.
+
+\def\doifleapyearelse#1% #2#3%
+ {\bgroup
+ \!!doneafalse
+ \!!counta#1%
+ \dosetmodulo\!!counta4\!!countb
+ \ifcase\!!countb
+ \dosetmodulo\!!counta{100}\!!countb
+ \ifcase\!!countb \else \!!doneatrue \fi
+ \dosetmodulo\!!counta{400}\!!countb
+ \ifcase\!!countb \!!doneatrue \fi
+ \fi
+ \if!!donea
+ \egroup\@EA\firstoftwoarguments % \def\next{#2}%
+ \else
+ \egroup\@EA\secondoftwoarguments % \def\next{#3}%
+ \fi} % \next}
+
+% untested but cleaner:
+%
+% \def\doifleapyearelse#1% #2#3%
+% {\bgroup
+% \dosetmodulo{#1}{400}\scratchcounter
+% \ifcase\scratchcounter
+% \else
+% \dosetmodulo{#1}{100}\scratchcounter
+% \ifcase\scratchcounter
+% \scratchcounter\plusone
+% \else
+% \dosetmodulo{#1}4\scratchcounter
+% \fi
+% \fi
+% \ifcase\scratchcounter
+% \egroup\@EA\firstoftwoarguments
+% \else
+% \egroup\@EA\secondoftwoarguments
+% \fi}
+
+\def\getdayspermonth#1#2%
+ {\doifleapyearelse{#1}
+ {\def\numberofdays{29}}
+ {\def\numberofdays{28}}%
+ \edef\numberofdays
+ {\ifcase#2 \or31\or\numberofdays\or31\or30\or
+ 31\or30\or31\or31\or30\or31\or30\or31\fi}}
+
+%D \macros
+%D {currentdate, date}
+%D
+%D We use these conversion macros in the date formatting
+%D macro:
+%D
+%D \showsetup{currentdate}
+%D
+%D This macro takes care of proper spacing and delivers for
+%D instance:
+%D
+%D \startbuffer
+%D \currentdate[weekday,day,month,year] % still dutch example
+%D \currentdate[WEEKDAY,day,MONTH,year] % still dutch example
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D depending of course on the keywords. Here we gave:
+%D
+%D \typebuffer
+%D
+%D If needed one can also add non||keywords, like in
+%D
+%D \startbuffer
+%D \currentdate[dd,--,mm,--,yy]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or typeset: \getbuffer.
+%D
+%D When no argument is passed, the current date is given as
+%D specified per language (using \type{\installlanguage}).
+%D
+%D \showsetup{currentdate}
+%D
+%D \startbuffer
+%D \date
+%D \date[d=12,m=12,y=1998][weekday]
+%D \date[d=12,m=12,y=1998]
+%D \stopbuffer
+%D
+%D We can also typeset arbitrary dates, using the previous
+%D command.
+%D
+%D \typebuffer
+%D
+%D The date is specified by one character keys. When no date
+%D is given, we get the current date.
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+\def\kenmerkdatumpatroon{j,mm,dd} % jj,mm,dd changed at januari 1-1-2000
+
+\newsignal\datesignal
+
+\def\dobetweendates
+ {\ifdim\lastskip=\datesignal\relax\else
+ \unskip\space
+ \hskip\datesignal\relax
+ \fi}
+
+\newtoks \everycurrentdate
+
+\def\complexcurrentdate[#1]%
+ {\bgroup
+ \the\everycurrentdate
+ \def\betweendates{\let\betweendates\dobetweendates}%
+ % was \processcommacommandp[#1]\docomplexcurrentdate
+ \safeedef\ascii{\empty#1}% keep encoded chars
+ \@EA\processcommalist\@EA[\ascii]\docomplexcurrentdate
+ \ifdim\lastskip=\datesignal\relax
+ \unskip
+ \fi
+ \egroup}
+
+\def\docomplexcurrentdate#1%
+ {\lowercase{\edef\!!stringa{#1}}% permits usage in \smallcapped
+ \expanded{\processaction[\!!stringa]}% [#1]
+ [ \v!day=>\betweendates\the\normalday,
+ %\v!day+=>\betweendates\ordinaldaynumber\normalday,
+ \v!day+=>\betweendates\convertnumber{\v!day+}\normalday,
+ \v!month=>\betweendates\month\normalmonth,
+ \v!year=>\betweendates\the\normalyear,
+ \v!space=>\unskip\ \hskip\datesignal,% optimization -)
+ \ =>\unskip\ \hskip\datesignal,% optimization -)
+ d=>\convertnumber\v!day\normalday,
+ %d+=>\ordinaldaynumber\normalday,
+ d+=>\convertnumber{\v!day+}\normalday,
+ m=>\convertnumber\v!month\normalmonth,
+ j=>\convertnumber\v!year\normalyear,
+ y=>\convertnumber\v!year\normalyear,
+ w=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
+ dd=>\ifnum\normalday >9 \else0\fi\the\normalday,
+ %dd+=>\ordinaldaynumber{\ifnum\normalday >9 \else0\fi\the\normalday},
+ dd+=>\convertnumber{\v!day+}{\ifnum\normalday >9 \else0\fi\the\normalday},
+ mm=>\ifnum\normalmonth>9 \else0\fi\the\normalmonth,
+ jj=>\expandafter\gobbletwoarguments\the\normalyear,
+ yy=>\expandafter\gobbletwoarguments\the\normalyear,
+ \v!weekday=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
+ \v!referral=>\expanded{\complexcurrentdate[\kenmerkdatumpatroon]},
+ \s!unknown=>\unskip
+ % #1 and not the lowercased \commalistelement, vietnamese has text
+ % {} because #1 can have comma, like: {\ ,}
+ {#1}%
+ \hskip\datesignal
+ \def\betweendates{\let\betweendates\dobetweendates}]}
+
+\def\simplecurrentdate
+ {\expanded{\complexcurrentdate[\currentdatespecification]}}
+
+\definecomplexorsimple\currentdate
+
+\def\dodate[#1][#2]%
+ {\bgroup
+ \iffirstargument
+ \getparameters[\??da][d=\normalday,m=\normalmonth,y=\normalyear,#1]%
+ \normalday \@@dad\relax
+ \normalmonth\@@dam\relax
+ \normalyear \@@day\relax
+ \ifsecondargument
+ \currentdate[#2]%
+ \else
+ \currentdate
+ \fi
+ \else
+ \currentdate
+ \fi
+ \egroup}
+
+\def\date
+ {\dodoubleempty\dodate}
+
+%D \macros
+%D {currenttime}
+%D
+%D The currenttime is actually the jobtime. You can specify
+%D a pattern similar to the previous date macro using the
+%D keys \type {h}, \type {m} and a separator.
+
+\def\calculatecurrenttime
+ {\dosetdivision\time{60}\scratchcounter
+ \edef\currenthour {\ifnum\scratchcounter<10 0\fi \the\scratchcounter}%
+ \dosetmodulo \time{60}\scratchcounter
+ \edef\currentminute{\ifnum\scratchcounter<10 0\fi \the\scratchcounter}}
+
+\let\currenthour \!!plusone
+\let\currentminute\!!plusone
+
+\def\currenttimespecification{h,:,m}
+
+\def\complexcurrenttime[#1]%
+ {\calculatecurrenttime
+ \processallactionsinset[#1]
+ [h=>\currenthour,m=>\currentminute,\s!unknown=>\commalistelement]}
+
+\def\simplecurrenttime
+ {\expanded{\complexcurrenttime[\currenttimespecification]}}
+
+\definecomplexorsimple\currenttime
+
+%D Because we're dealing with dates, we also introduce a few
+%D day loops:
+%D
+%D \starttyping
+%D \processmonth{year}{month}{command}
+%D \processyear{year}{command}{before}{after}
+%D \stoptyping
+%D
+%D The counters \type {\normalyear}, \type {\normalmonth} and
+%D \type{\normalday} can be used for for date manipulations.
+
+\long\def\processmonth#1#2#3% year month command
+ {\bgroup
+ \getdayspermonth{#1}{#2}%
+ \dostepwiserecurse1\numberofdays1%
+ {\normalyear #1\relax
+ \normalmonth#2\relax
+ \normalday \recurselevel\relax
+ #3}%
+ \egroup}
+
+\def\lastmonth{12} % can be set to e.g. 1 when testing
+
+\long\def\processyear#1#2#3#4% year command before after
+ {\bgroup
+ \dorecurse\lastmonth
+ {\normalyear #1\relax
+ \normalmonth\recurselevel\relax
+ #3\processmonth\normalyear\normalmonth{#2}#4}%
+ \egroup}
+
+%D \macros
+%D {defineconversion, convertnumber}
+%D
+%D Conversion involves the macros that we implemented earlier
+%D in this module.
+%D
+%D \showsetup{defineconversion}
+%D \showsetup{convertnumber}
+%D
+%D We can feed this command with conversion macros as well as
+%D a set of conversion symbols. Both need a bit different
+%D treatment.
+%D
+%D \starttyping
+%D \defineconversion [roman] [\romannumerals]
+%D \defineconversion [set 1] [$\star$,$\bullet$,$\ast$]
+%D \stoptyping
+%D
+%D You can define a language dependent conversion with:
+%D
+%D \starttyping
+%D \defineconversion [en] [whatever] [\something]
+%D \stoptyping
+
+% \def\dodefineconversion[#1][#2]%
+% {\ConvertConstantAfter\doifinstringelse{,}{#2}
+% {\scratchcounter=0
+% \def\docommand##1%
+% {\advance\scratchcounter 1
+% \setvalue{\??cv#1\the\scratchcounter}{##1}}%
+% \processcommalist[#2]\docommand
+% \setvalue{\??cv#1}##1{\csname\??cv#1##1\endcsname}}
+% {\setvalue{\??cv#1}{#2}}}
+%
+% \def\defineconversion%
+% {\dodoubleargument\dodefineconversion}
+
+\def\defineconversion
+ {\dotripleempty\dodefineconversion}
+
+\def\dodefineconversion[#1][#2][#3]%
+ {\ifthirdargument
+ \dododefineconversion[#1][#2][#3]%
+ \else
+ \dododefineconversion[][#1][#2]%
+ \fi}
+
+%D \starttyping
+%D \def\dododefineconversion[#1][#2][#3]%
+%D {\ConvertConstantAfter\doifinstringelse{,}{#3}
+%D {\scratchcounter\zerocount
+%D \def\docommand##1%
+%D {\advance\scratchcounter \plusone
+%D \setvalue{\??cv#1#2\the\scratchcounter}{##1}}%
+%D \processcommalist[#3]\docommand
+%D \setvalue{\??cv#1#2}##1{\executeifdefined{\??cv#1#2##1}\unknown}} % catch out-of-range numbers
+%D {\setvalue{\??cv#1#2}{#3}}}
+%D \stoptyping
+
+%D This approach has the disadvantage that when you run out of
+%D symbols you get unknown results. The following implementation
+%D permits overloading of the converter:
+
+\def\dododefineconversion[#1][#2][#3]%
+ {\ConvertConstantAfter\doifinstringelse{,}{#3}
+ {\scratchcounter\zerocount
+ \def\docommand##1%
+ {\advance\scratchcounter \plusone
+ \setvalue{\??cv#1#2\the\scratchcounter}{##1}}%
+ \processcommalist[#3]\docommand
+ \setevalue{\??cv#1#2}##1%
+ {\noexpand\docheckedconversion{#1#2}{\the\scratchcounter}{##1}}}
+ {\setvalue{\??cv#1#2}{#3}}}
+
+\def\docheckedconversion#1#2#3% class maxnumber number
+ {\executeifdefined{\??cv#1#3}\unknown}
+
+%D When Gerben reported problems with footnote numbering per page,
+%D Taco came with the following wrap around solution. So, let's
+%D overload the checked conversion macro:
+
+\def\docheckedconversion#1#2#3% class maxnumber number
+ {\executeifdefined{\??cv#1\modulatednumber{#2}{#3}}\unknown}
+
+%D Taco's modulo code is implemented in the system module
+%D \type {syst-con}.
+
+%D If a conversion is just a font switch then we need to make sure
+%D that the number is indeed end up as number in the input, so we
+%D need to handle the second argument.
+
+\def\convertnumber#1#2%
+ {\csname\??cv
+ \ifcsname\??cv\currentlanguage#1\endcsname
+ \currentlanguage#1%
+ \else\ifcsname\??cv#1\endcsname
+ #1%
+ \else
+ \s!default
+ \fi\fi
+ \endcsname{\number#2}}
+
+\def\doifconversiondefinedelse#1%
+ {\ifcsname\??cv\currentlanguage#1\endcsname
+ \@EA\firstoftwoarguments
+ \else\ifcsname\??cv#1\endcsname
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi\fi}
+
+\def\doifelseconversionnumber#1#2% slow but seldom used
+ {\doifdefinedelse{\??cv#1#2}}
+
+%D Handy.
+
+\setvalue{\??cv:\c!n:\v!one }{1}
+\setvalue{\??cv:\c!n:\v!two }{2}
+\setvalue{\??cv:\c!n:\v!three}{3}
+\setvalue{\??cv:\c!n:\v!four }{4}
+\setvalue{\??cv:\c!n:\v!five }{5}
+
+\def\wordtonumber#1#2{\ifcsname\??cv:\c!n:#1\endcsname\csname\??cv:\c!n:#1\endcsname\else#2\fi}
+
+% \defineconversion[ctx][c,o,n,t,e,x,t]
+%
+% \doloop{\doifelseconversionnumber{ctx}{\recurselevel}{[\recurselevel]}{\exitloop}}
+
+\defineconversion [\s!default] [\numbers]
+
+%D As longs as symbols are linked to levels or numbers, we can
+%D also use the conversion mechanism, but in for instance the
+%D itemization macros, we prefer symbols because they can more
+%D easier be (partially) redefined. Symbols are implemented
+%D in another module.
+
+\defineconversion [] [\numbers] % the default conversion
+
+\defineconversion [a] [\characters]
+\defineconversion [A] [\Characters]
+\defineconversion [AK] [\smallcapped\characters]
+\defineconversion [KA] [\smallcapped\characters]
+
+\defineconversion [n] [\numbers]
+\defineconversion [N] [\Numbers]
+\defineconversion [m] [\mediaeval]
+
+\defineconversion [i] [\romannumerals]
+\defineconversion [I] [\Romannumerals]
+\defineconversion [r] [\romannumerals]
+\defineconversion [R] [\Romannumerals]
+\defineconversion [KR] [\smallcapped\romannumerals]
+\defineconversion [RK] [\smallcapped\romannumerals]
+
+\defineconversion [g] [\greeknumerals]
+\defineconversion [G] [\Greeknumerals]
+
+\defineconversion [o] [\oldstylenumerals]
+\defineconversion [O] [\oldstylenumerals]
+\defineconversion [or] [\oldstyleromannumerals]
+
+\defineconversion [\v!character] [\character]
+\defineconversion [\v!Character] [\Character]
+
+\defineconversion [\v!characters] [\characters]
+\defineconversion [\v!Characters] [\Characters]
+
+\defineconversion [\v!numbers] [\numbers]
+\defineconversion [\v!Numbers] [\Numbers]
+\defineconversion [\v!mediaeval] [\mediaeval]
+
+\defineconversion [\v!romannumerals] [\romannumerals]
+\defineconversion [\v!Romannumerals] [\Romannumerals]
+
+\defineconversion [\v!greek] [\greeknumerals]
+\defineconversion [\v!Greek] [\Greeknumerals]
+
+\defineconversion [arabicnumerals] [\arabicnumerals]
+\defineconversion [persiannumerals] [\arabicnumerals]
+
+\defineconversion [month] [\doconvertmonthlong]
+\defineconversion [month:mnem] [\doconvertmonthshort]
+
+% Some bonus ones:
+
+\defineconversion [\v!empty] [\gobbleoneargument]
+\defineconversion [\v!none] [\numbers]
+
+\ifx\symbol\undefined \def\symbol[#1]{#1} \fi % todo
+
+\defineconversion
+ [set 0]
+ [{\symbol[bullet]},
+ {\symbol[dash]},
+ {\symbol[star]},
+ {\symbol[triangle]},
+ {\symbol[circle]},
+ {\symbol[medcircle]},
+ {\symbol[bigcircle]},
+ {\symbol[square]}]
+
+\defineconversion
+ [set 1]
+ [\mathematics{\star},
+ \mathematics{\star\star},
+ \mathematics{\star\star\star},
+ \mathematics{\ddagger},
+ \mathematics{\ddagger\ddagger},
+ \mathematics{\ddagger\ddagger\ddagger},
+ \mathematics{\ast},
+ \mathematics{\ast\ast},
+ \mathematics{\ast\ast\ast}]
+
+\defineconversion
+ [set 2]
+ [\mathematics{*},
+ \mathematics{\dag},
+ \mathematics{\ddag},
+ \mathematics{**},
+ \mathematics{\dag\dag},
+ \mathematics{\ddag\ddag},
+ \mathematics{***},
+ \mathematics{\dag\dag\dag},
+ \mathematics{\ddag\ddag\ddag},
+ \mathematics{****},
+ \mathematics{\dag\dag\dag\dag},
+ \mathematics{\ddag\ddag\ddag\ddag}]
+
+\defineconversion
+ [set 3]
+ [\mathematics{\star},
+ \mathematics{\star\star},
+ \mathematics{\star\star\star},
+ \mathematics{\ddagger},
+ \mathematics{\ddagger\ddagger},
+ \mathematics{\ddagger\ddagger\ddagger},
+ \mathematics{\P},
+ \mathematics{\P\P},
+ \mathematics{\P\P\P},
+ \mathematics{\S},
+ \mathematics{\S\S},
+ \mathematics{\S\S\S},
+ \mathematics{\ast},
+ \mathematics{\ast\ast},
+ \mathematics{\ast\ast\ast}]
+
+%D \macros
+%D {defineconversionvector,conversionnumber} % bad names so no danger for clash
+%D
+%D For Adam and friends \unknown
+%D
+%D \startitemize[persiannummerals]
+%D \item test \item test \item test \item test
+%D \stopitemize
+
+\def\defineconversionvector#1#2% name base
+ {\bgroup
+ % dirty trick
+ \uccode`\*=`\1
+ % plain:
+ % \uccode`\0=\numexpr#2+0\relax \uccode`\1=\numexpr#2+1\relax
+ % \uccode`\2=\numexpr#2+2\relax \uccode`\3=\numexpr#2+3\relax
+ % \uccode`\4=\numexpr#2+4\relax \uccode`\5=\numexpr#2+5\relax
+ % \uccode`\6=\numexpr#2+6\relax \uccode`\7=\numexpr#2+7\relax
+ % \uccode`\8=\numexpr#2+8\relax \uccode`\9=\numexpr#2+9\relax
+ % context:
+ \dostepwiserecurse091{\expandafter\uccode\expandafter`\recurselevel=\numexpr#2+\recurselevel}%
+ % prepared macro
+ \uppercase\expandafter{\expandafter\gdef\csname::cvn::#1::\endcsname##*%
+ {\ifcase##* 0\or1\or2\or3\or4\or5\or6\or7\or8\or9\fi}}%
+ \egroup}
+
+\def\conversionnumber#1#2%
+ {\ifcsname::cvn::#1::\endcsname
+ \expandafter\doconversionnumber\csname::cvn::#1::\expandafter\endcsname\number#2\relax
+ \else
+ \number#2%
+ \fi}
+
+\def\doconversionnumber#1#2%
+ {\ifx#2\relax
+ \expandafter\gobbleoneargument
+ \else
+ #1{#2}%
+ \expandafter\doconversionnumber
+ \fi#1}
+
+% actually mkiii code
+
+\ifnum\texengine=\xetexengine
+
+ \defineconversionvector{arabicnumerals} {"0660}
+ \defineconversionvector{persiannumerals} {"06F0}
+ \defineconversionvector{thainumerals} {"0E50}
+ \defineconversionvector{devanagarinumerals}{"0966}
+ \defineconversionvector{gurmurkhinumerals} {"0A66}
+ \defineconversionvector{gujaratinumerals} {"0AE6}
+ \defineconversionvector{tibetannumerals} {"0F20} % also "half numerals?"
+
+ \defineconversion[arabicnumerals] [\conversionnumber{arabicnumerals}]
+ \defineconversion[persiannumerals] [\conversionnumber{persiannumerals}]
+ \defineconversion[thainumerals] [\conversionnumber{thainumerals}]
+ \defineconversion[devanagarinumerals][\conversionnumber{devanagarinumerals}]
+ \defineconversion[gurmurkhinumerals] [\conversionnumber{gurmurkhinumerals}]
+ \defineconversion[gujaratinumerals] [\conversionnumber{gujaratinumerals}]
+ \defineconversion[tibetannumerals] [\conversionnumber{tibetannumerals}]
+
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/core-con.mkiv b/tex/context/base/core-con.mkiv
new file mode 100644
index 000000000..2d2e5d5d7
--- /dev/null
+++ b/tex/context/base/core-con.mkiv
@@ -0,0 +1,860 @@
+%D \module
+%D [ file=core-con,
+%D version=1997.26.08,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Conversion,
+%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 / Conversion}
+
+\registerctxluafile{core-con}{1.001}
+
+\unprotect
+
+\ifx\currentlanguage\undefined \let\currentlanguage\empty \fi
+\ifx\labeltext \undefined \let\labeltext\firstofoneargument \fi
+
+%D This module deals with all kind of conversions from numbers
+%D and dates. I considered splitting this module in a support
+%D one and a core one, but to keep things simple as well as
+%D preserve the overview, I decided against splitting.
+
+\let\spr\firstofoneargument % separator
+\let\stp\firstofoneargument % stopper
+
+% cleaner, some day:
+%
+% \def\isolateseparators % etex only, even works with list separator overloading
+% {\unexpanded\def\spr##1{{##1}}%
+% \unexpanded\def\stp##1{{##1}}}
+
+% needed for arab :
+
+\def\isolateseparators % even works with list separator overloading
+ {\def\spr##1{{##1}}%
+ \def\stp##1{{##1}}}
+
+%D \macros
+%D {numbers}
+%D
+%D First we deal with the dummy conversion of numbers using the
+%D \TEX\ primitive \type{\number}. The uppercase alternative is
+%D only there for compatibility with the other conversion
+%D macros. We could do without \type{#1} but this way we get
+%D rid of unwanted braces. For the savety we also define a
+%D non||sence uppercase alternative.
+%D
+%D \showsetup{numbers}
+%D
+%D \starttyping
+%D \def\numbers#1{\number#1}
+%D \def\Numbers#1{\number#1}
+%D \stoptyping
+%D
+%D Due to read ahead, as in \type{[\pagenumber\space]} the space will
+%D disappear, unless we use:
+
+\def\numbers#1{\purenumber{#1}}
+\def\Numbers#1{\purenumber{#1}}
+
+%D \macros
+%D {romannumerals,Romannumerals}
+%D
+%D \TEX\ the program uses a rather tricky conversion from
+%D numbers to their roman counterparts. This conversion could
+%D of course be programmed in \TEX\ itself, but I guess Knuth
+%D found the programming trick worth presenting.
+%D
+%D \showsetup{romannumerals}
+%D \showsetup{Romannumerals}
+
+\def\romannumerals#1{\ctxlua{converters.romannumerals(\number#1)}}
+\def\Romannumerals#1{\ctxlua{converters.Romannumerals(\number#1)}}
+
+%D Arabic etc:
+
+\def\abjadnumerals #1{\ctxlua{converters.abjadnumerals (\number#1)}}
+\def\abjadnodotnumerals#1{\ctxlua{converters.abjadnodotnumerals(\number#1)}}
+\def\abjadnaivenumerals#1{\ctxlua{converters.arabicnumerals (\number#1)}}
+
+\def\languagecharacters#1{\ctxlua{converters.alphabetic(\number#1,"\currentlanguage")}} % new
+\def\languageCharacters#1{\ctxlua{converters.Alphabetic(\number#1,"\currentlanguage")}} % new
+
+% we could use an auxiliary macro to save some bytes in the format
+%
+% \def\dolanguagecharacters#1#2{\ctxlua{converters.alphabetic(\number#2,"#1")}}
+
+\def\thainumerals #1{\ctxlua{converters.alphabetic(\number#1,"thai")}}
+\def\devanagarinumerals#1{\ctxlua{converters.alphabetic(\number#1,"devanagari")}}
+\def\gurmurkhinumerals #1{\ctxlua{converters.alphabetic(\number#1,"gurmurkhi")}}
+\def\gujaratinumerals #1{\ctxlua{converters.alphabetic(\number#1,"gujarati")}}
+\def\tibetannumerals #1{\ctxlua{converters.alphabetic(\number#1,"tibetan")}}
+\def\greeknumerals #1{\ctxlua{converters.alphabetic(\number#1,"greek")}}
+\def\Greeknumerals #1{\ctxlua{converters.Alphabetic(\number#1,"greek")}}
+\def\arabicnumerals #1{\ctxlua{converters.alphabetic(\number#1,"arabic")}}
+\def\persiannumerals #1{\ctxlua{converters.alphabetic(\number#1,"persian")}}
+
+\let\arabicexnumerals \persiannumerals
+
+\def\koreannumerals #1{\ctxlua{converters.alphabetic(\number#1,"korean")}}
+\def\koreannumeralsp#1{\ctxlua{converters.alphabetic(\number#1,"korean-parent")}}
+\def\koreannumeralsc#1{\ctxlua{converters.alphabetic(\number#1,"korean-circle")}}
+
+\def\chinesenumerals #1{\ctxlua{converters.chinesenumerals (\number#1)}}
+\def\chinesecapnumerals#1{\ctxlua{converters.chinesecapnumerals(\number#1,"cap")}}
+\def\chineseallnumerals#1{\ctxlua{converters.chineseallnumerals(\number#1,"all")}}
+
+%D \macros
+%D {character,Character}
+%D
+%D Converting a number into a character can of course only
+%D be done with numbers less or equal to~26. At the cost of
+%D much more macros a faster conversion is possible, using:
+%D
+%D \starttyping
+%D \setvalue{char1}{a} \def\character#1{\getvalue{char#1}}
+%D \stoptyping
+%D
+%D But we prefer a simpel \type{\case}.
+%D
+%D \showsetup{character}
+%D \showsetup{Character}
+
+\def\unknowncharacter{-} % else in lists \relax
+
+\def\character#1{\ctxlua{converters.character (\number#1)}}
+\def\Character#1{\ctxlua{converters.Character (\number#1)}}
+
+%D \macros
+%D {characters,Characters}
+%D
+%D Converting large numbers is supported by the next two
+%D macros. This time we just count on: $\cdots$~x, y, z, aa,
+%D ab, ac~$\cdots$.
+%D
+%D \showsetup{characters}
+%D \showsetup{Characters}
+
+\def\characters#1{\ctxlua{converters.characters(\number#1)}}
+\def\Characters#1{\ctxlua{converters.Characters(\number#1)}}
+
+%D \macros
+%D {greeknumerals,Greeknumerals}
+%D
+%D Why should we only honour the romans, and not the greek?
+
+\let\greeknumerals\gobbleoneargument
+\let\Greeknumerals\gobbleoneargument
+
+%D \macros
+%D {oldstylenumerals,oldstyleromannumerals}
+%D
+%D These conversions are dedicated to Frans Goddijn.
+
+\unexpanded\def\oldstylenumerals#1%
+ {{\os\number#1}}
+
+\unexpanded\def\oldstyleromannumerals#1%
+ {{\leftrulefalse\rightrulefalse\ss\txx\boxrulewidth.15ex
+ \ruledhbox spread .15em{\hss\uppercased{\romannumerals{#1}}\hss}}}
+
+%D \macros
+%D {protectconversion}
+%D
+%D The previous two commands are not robust enough to be
+%D passed to \type{\write} en \type{\message}. That's why we
+%D introduce:
+
+\def\protectconversion
+ {\def\doconvertcharacters##1{##1}} % was \relax
+ %{\def\doconvertcharacters##1{\ifcase0##1 0\else##1\fi}} more save
+
+%D \macros
+%D {normaltime,normalyear,normalmonth,normalday}
+%D
+%D The last part of this module is dedicated to converting
+%D dates. Because we want to use as meaningful commands as
+%D possible, and because \TEX\ already uses up some of those,
+%D we save the original meanings.
+
+\savenormalmeaning\time
+\savenormalmeaning\year
+\savenormalmeaning\month
+\savenormalmeaning\day
+
+%D \macros
+%D {month,MONTH}
+%D
+%D Converting the month number into a month name is done
+%D using a case statement, abstact values and the label
+%D mechanism. This way users can easily redefine a label from
+%D for instance german into austrian.
+%D
+%D \starttyping
+%D \setuplabeltext [de] [january=J\"anner]
+%D \stoptyping
+%D
+%D Anyhow, the conversion looks like:
+
+\def\domonthtag#1%
+ {\ifcase#1%
+ \or \v!january \or \v!february \or \v!march \or \v!april
+ \or \v!may \or \v!june \or \v!july \or \v!august
+ \or \v!september \or \v!october \or \v!november \or \v!december
+ \else
+ \v!unknown
+ \fi}
+
+\def\doconvertmonthlong #1{\labeltext{\domonthtag{#1}}}
+\def\doconvertmonthshort#1{\labeltext{\domonthtag{#1}:\s!mnem}}
+
+\let\doconvertmonth\doconvertmonthlong
+
+%D We redefine the \TEX\ primitive \type{\month} as:
+%D
+%D \showsetup{month}
+%D \showsetup{MONTH}
+
+\def\monthlong {\doconvertmonthlong}
+\def\monthshort{\doconvertmonthshort}
+\def\month {\doconvertmonth}
+
+\def\MONTH #1{{\let\labeltext\LABELTEXT\month {#1}}}
+\def\MONTHLONG #1{{\let\labeltext\LABELTEXT\monthlong {#1}}}
+\def\MONTHSHORT#1{{\let\labeltext\LABELTEXT\monthshort{#1}}}
+
+%D We never explicitly needed this, but Tobias Burnus pointed
+%D out that it would be handy to convert to the day of the
+%D week. In doing so, we have to calculate the total number of
+%D days, taking leapyears into account. For those who are
+%D curious:
+%D
+%D \startitemize[packed]
+%D \item years that can be divided by 4 are leapyears
+%D \item exept years that can be divided by 100
+%D \item unless years can be divided by 400
+%D \stopitemize
+%D
+%D This makes the year 1900 into a normal year and 1996 and
+%D 2000 into leap years, right? Well, converting to string
+%D looks familiar:
+
+\def\doconvertday#1%
+ {\labeltext
+ {\ifcase#1
+ \or \v!sunday \or \v!monday \or \v!tuesday \or \v!wednesday
+ \or \v!thursday \or \v!friday \or \v!saturday \fi}}
+
+%D \macros
+%D {getdayoftheweek, dayoftheweek}
+%D
+%D The conversion algoritm is an old one and a translation from
+%D a procedure written in MODULA~2 back in the 80's. I finaly
+%D found the 4--100-400 rules in some enclopedia. Look at this
+%D messy low level routine that takes the day, month and year
+%D as arguments:
+
+\newcount\normalweekday
+
+\def\getdayoftheweek#1#2#3{\normalweekday\ctxlua{converters.weekday(\number#1,\number#2,\number#3)}}
+\def\dayoftheweek #1#2#3{\doconvertday{\ctxlua{converters.weekday(\number#1,\number#2,\number#3)}}}
+
+%D Using this macro in
+%D
+%D \startbuffer
+%D monday: \dayoftheweek {4} {5} {1992}
+%D friday: \dayoftheweek {16} {6} {1995}
+%D monday: \dayoftheweek {25} {8} {1997}
+%D saturday: \dayoftheweek {30} {8} {1997}
+%D tuesday: \dayoftheweek {2} {1} {1996}
+%D tuesday: \dayoftheweek {7} {1} {1997}
+%D tuesday: \dayoftheweek {13} {1} {1998}
+%D friday: \dayoftheweek {1} {1} {2000}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D The macro \type {\getdayoftheweek} can be used to calculate
+%D the number \type {\normalweekday}.
+
+%D \macros
+%D {weekday,WEEKDAY}
+%D
+%D The first one is sort of redundant. It takes the day
+%D number argument.
+%D
+%D \showsetup{weekday}
+%D \showsetup{WEEKDAY}
+
+\def\weekday
+ {\doconvertday}
+
+\def\WEEKDAY#1%
+ {{\let\labeltext\LABELTEXT\doconvertday{#1}}}
+
+%D \macros
+%D {weekoftheday}
+%D
+%D {\em not yet implemented:}
+%D
+%D \starttyping
+%D \def\weekoftheday#1#2#3%
+%D {}
+%D \stoptyping
+
+%D \macros
+%D {doifleapyearelse,
+%D getdayspermonth}
+%D
+%D Sometimes we need to know if we're dealing with a
+%D leapyear, so here is a testmacro:
+%D
+%D \starttyping
+%D \doifleapyearelse{year}{yes}{no}
+%D \stoptyping
+%D
+%D An example of its use can be seen in the macro
+%D
+%D \starttyping
+%D \getdayspermonth{year}{month}
+%D \stoptyping
+%D
+%D The number of days is available in the macro \type
+%D {\numberofdays}.
+
+\def\doifleapyearelse#1%
+ {\ifcase\ctxlua{converters.leapyear(\number#1)}
+ \@EA\secondoftwoarguments
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
+
+\def\getdayspermonth#1#2%
+ {\edef\numberofdays{\ctxlua{converters.nofdays(\number#1,\number#2)}}}
+
+\def\dayspermonth#1#2%
+ {\ctxlua{converters.nofdays(\number#1,\number#2)}}
+
+% problem is that we calculate with those numbers
+%
+% \def\time {\numexpr\ctxlua{converters.textime()}\relax}
+% \def\year {\numexpr\ctxlua{converters.year ()}\relax}
+% \def\month{\numexpr\ctxlua{converters.month ()}\relax}
+% \def\day {\numexpr\ctxlua{converters.day ()}\relax}
+
+% \dayoftheweek{2006}{9}{15}
+% \doifleapyearelse{2000}{OK}{NOT OK}
+% \doifleapyearelse{2100}{NOT OK}{OK}
+% \doifleapyearelse{2004}{OK}{NOT OK}
+% \doifleapyearelse{2003}{NOT OK}{OK}
+% \dayspermonth{2000}{2}
+% [\the\normaltime=\the\time]
+
+%D \macros
+%D {currentdate, date}
+%D
+%D We use these conversion macros in the date formatting
+%D macro:
+%D
+%D \showsetup{currentdate}
+%D
+%D This macro takes care of proper spacing and delivers for
+%D instance:
+%D
+%D \startbuffer
+%D \currentdate[weekday,day,month,year] % still dutch example
+%D \currentdate[WEEKDAY,day,MONTH,year] % still dutch example
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D depending of course on the keywords. Here we gave:
+%D
+%D \typebuffer
+%D
+%D If needed one can also add non||keywords, like in
+%D
+%D \startbuffer
+%D \currentdate[dd,--,mm,--,yy]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or typeset: \getbuffer.
+%D
+%D When no argument is passed, the current date is given as
+%D specified per language (using \type{\installlanguage}).
+%D
+%D \showsetup{currentdate}
+%D
+%D \startbuffer
+%D \date
+%D \date[d=12,m=12,y=1998][weekday]
+%D \date[d=12,m=12,y=1998]
+%D \stopbuffer
+%D
+%D We can also typeset arbitrary dates, using the previous
+%D command.
+%D
+%D \typebuffer
+%D
+%D The date is specified by one character keys. When no date
+%D is given, we get the current date.
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+\def\kenmerkdatumpatroon{j,mm,dd} % jj,mm,dd changed at januari 1-1-2000
+
+\newsignal\datesignal
+
+\def\dobetweendates
+ {\ifdim\lastskip=\datesignal\relax\else
+ \unskip\space
+ \hskip\datesignal\relax
+ \fi}
+
+\newtoks \everycurrentdate
+
+\def\complexcurrentdate[#1]%
+ {\bgroup
+ \the\everycurrentdate
+ \def\betweendates{\let\betweendates\dobetweendates}%
+ % was \processcommacommandp[#1]\docomplexcurrentdate
+ \safeedef\ascii{\empty#1}% keep encoded chars
+ \@EA\processcommalist\@EA[\ascii]\docomplexcurrentdate
+ \ifdim\lastskip=\datesignal\relax
+ \unskip
+ \fi
+ \egroup}
+
+\def\docomplexcurrentdate#1%
+ {\lowercase{\edef\!!stringa{#1}}% permits usage in \smallcapped
+ \expanded{\processaction[\!!stringa]}% [#1]
+ [ \v!day=>\betweendates\the\normalday,
+ %\v!day+=>\betweendates\ordinaldaynumber\normalday,
+ \v!day+=>\betweendates\convertnumber{\v!day+}\normalday,
+ \v!month=>\betweendates\month\normalmonth,
+ \v!year=>\betweendates\the\normalyear,
+ \v!space=>\unskip\ \hskip\datesignal,% optimization -)
+ \ =>\unskip\ \hskip\datesignal,% optimization -)
+ d=>\convertnumber\v!day\normalday,
+ %d+=>\ordinaldaynumber\normalday,
+ d+=>\convertnumber{\v!day+}\normalday,
+ m=>\convertnumber\v!month\normalmonth,
+ j=>\convertnumber\v!year\normalyear,
+ y=>\convertnumber\v!year\normalyear,
+ w=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
+ dd=>\ifnum\normalday >9 \else0\fi\the\normalday,
+ %dd+=>\ordinaldaynumber{\ifnum\normalday >9 \else0\fi\the\normalday},
+ dd+=>\convertnumber{\v!day+}{\ifnum\normalday >9 \else0\fi\the\normalday},
+ mm=>\ifnum\normalmonth>9 \else0\fi\the\normalmonth,
+ jj=>\expandafter\gobbletwoarguments\the\normalyear,
+ yy=>\expandafter\gobbletwoarguments\the\normalyear,
+ \v!weekday=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
+ \v!referral=>\expanded{\complexcurrentdate[\kenmerkdatumpatroon]},
+ \s!unknown=>\unskip
+ % #1 and not the lowercased \commalistelement, vietnamese has text
+ % {} because #1 can have comma, like: {\ ,}
+ {#1}%
+ \hskip\datesignal
+ \def\betweendates{\let\betweendates\dobetweendates}]}
+
+\def\simplecurrentdate
+ {\expanded{\complexcurrentdate[\currentdatespecification]}}
+
+\definecomplexorsimple\currentdate
+
+\def\dodate[#1][#2]%
+ {\bgroup
+ \iffirstargument
+ \getparameters[\??da][d=\normalday,m=\normalmonth,y=\normalyear,#1]%
+ \normalday \@@dad\relax
+ \normalmonth\@@dam\relax
+ \normalyear \@@day\relax
+ \ifsecondargument
+ \currentdate[#2]%
+ \else
+ \currentdate
+ \fi
+ \else
+ \currentdate
+ \fi
+ \egroup}
+
+\def\date
+ {\dodoubleempty\dodate}
+
+%D \macros
+%D {currenttime}
+%D
+%D The currenttime is actually the jobtime. You can specify
+%D a pattern similar to the previous date macro using the
+%D keys \type {h}, \type {m} and a separator.
+
+\def\calculatecurrenttime
+ {\edef\currenthour {\ctxlua{converters.hour ()}}%
+ \edef\currentminute{\ctxlua{converters.minute()}}%
+ \edef\currentsecond{\ctxlua{converters.second()}}}
+
+\let\currenthour \!!plusone
+\let\currentminute\!!plusone
+
+\def\currenttimespecification{h,:,m}
+
+\def\complexcurrenttime[#1]%
+ {\calculatecurrenttime
+ \processallactionsinset[#1]
+ [h=>\currenthour,m=>\currentminute,\s!unknown=>\commalistelement]}
+
+\def\simplecurrenttime
+ {\expanded{\complexcurrenttime[\currenttimespecification]}}
+
+\definecomplexorsimple\currenttime
+
+%D Because we're dealing with dates, we also introduce a few
+%D day loops:
+%D
+%D \starttyping
+%D \processmonth{year}{month}{command}
+%D \processyear{year}{command}{before}{after}
+%D \stoptyping
+%D
+%D The counters \type {\normalyear}, \type {\normalmonth} and
+%D \type{\normalday} can be used for for date manipulations.
+
+\long\def\processmonth#1#2#3% year month command
+ {\bgroup
+ \getdayspermonth{#1}{#2}%
+ \dostepwiserecurse1\numberofdays1%
+ {\normalyear #1\relax
+ \normalmonth#2\relax
+ \normalday \recurselevel\relax
+ #3}%
+ \egroup}
+
+\def\lastmonth{12} % can be set to e.g. 1 when testing
+
+\long\def\processyear#1#2#3#4% year command before after
+ {\bgroup
+ \dorecurse\lastmonth
+ {\normalyear #1\relax
+ \normalmonth\recurselevel\relax
+ #3\processmonth\normalyear\normalmonth{#2}#4}%
+ \egroup}
+
+%D \macros
+%D {defineconversion, convertnumber}
+%D
+%D Conversion involves the macros that we implemented earlier
+%D in this module.
+%D
+%D \showsetup{defineconversion}
+%D \showsetup{convertnumber}
+%D
+%D We can feed this command with conversion macros as well as
+%D a set of conversion symbols. Both need a bit different
+%D treatment.
+%D
+%D \starttyping
+%D \defineconversion [roman] [\romannumerals]
+%D \defineconversion [set 1] [$\star$,$\bullet$,$\ast$]
+%D \stoptyping
+%D
+%D You can define a language dependent conversion with:
+%D
+%D \starttyping
+%D \defineconversion [en] [whatever] [\something]
+%D \stoptyping
+
+% \def\dodefineconversion[#1][#2]%
+% {\ConvertConstantAfter\doifinstringelse{,}{#2}
+% {\scratchcounter=0
+% \def\docommand##1%
+% {\advance\scratchcounter 1
+% \setvalue{\??cv#1\the\scratchcounter}{##1}}%
+% \processcommalist[#2]\docommand
+% \setvalue{\??cv#1}##1{\csname\??cv#1##1\endcsname}}
+% {\setvalue{\??cv#1}{#2}}}
+%
+% \unexpanded\def\defineconversion%
+% {\dodoubleargument\dodefineconversion}
+
+\unexpanded\def\defineconversion
+ {\dotripleempty\dodefineconversion}
+
+\def\dodefineconversion[#1][#2][#3]%
+ {\ifthirdargument
+ \dododefineconversion[#1][#2][#3]%
+ \else
+ \dododefineconversion[][#1][#2]%
+ \fi}
+
+%D \starttyping
+%D \def\dododefineconversion[#1][#2][#3]%
+%D {\ConvertConstantAfter\doifinstringelse{,}{#3}
+%D {\scratchcounter\zerocount
+%D \def\docommand##1%
+%D {\advance\scratchcounter \plusone
+%D \setvalue{\??cv#1#2\the\scratchcounter}{##1}}%
+%D \processcommalist[#3]\docommand
+%D \setvalue{\??cv#1#2}##1{\executeifdefined{\??cv#1#2##1}\unknown}} % catch out-of-range numbers
+%D {\setvalue{\??cv#1#2}{#3}}}
+%D \stoptyping
+
+%D This approach has the disadvantage that when you run out of
+%D symbols you get unknown results. The following implementation
+%D permits overloading of the converter:
+
+\def\dododefineconversion[#1][#2][#3]%
+ {\ConvertConstantAfter\doifinstringelse{,}{#3}
+ {\scratchcounter\zerocount
+ \def\docommand##1%
+ {\advance\scratchcounter \plusone
+ \setvalue{\??cv#1#2\the\scratchcounter}{##1}}%
+ \processcommalist[#3]\docommand
+ \setevalue{\??cv#1#2}##1%
+ {\noexpand\docheckedconversion{#1#2}{\the\scratchcounter}{##1}}}
+ {\setvalue{\??cv#1#2}{#3}}}
+
+\def\docheckedconversion#1#2#3% class maxnumber number
+ {\executeifdefined{\??cv#1#3}\unknown}
+
+%D When Gerben reported problems with footnote numbering per page,
+%D Taco came with the following wrap around solution. So, let's
+%D overload the checked conversion macro:
+
+\def\docheckedconversion#1#2#3% class maxnumber number
+ {\executeifdefined{\??cv#1\modulatednumber{#2}{#3}}\unknown}
+
+%D Taco's modulo code is implemented in the system module
+%D \type {syst-con}.
+
+%D If a conversion is just a font switch then we need to make sure
+%D that the number is indeed end up as number in the input, so we
+%D need to handle the second argument.
+
+\def\convertnumber#1#2%
+ {\csname\??cv
+ \ifcsname\??cv\currentlanguage#1\endcsname
+ \currentlanguage#1%
+ \else\ifcsname\??cv#1\endcsname
+ #1%
+ \else
+ \s!default
+ \fi\fi
+ \endcsname{\number#2}}
+
+\def\doifconversiondefinedelse#1%
+ {\ifcsname\??cv\currentlanguage#1\endcsname
+ \@EA\firstoftwoarguments
+ \else\ifcsname\??cv#1\endcsname
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi\fi}
+
+\def\doifelseconversionnumber#1#2% slow but seldom used
+ {\doifdefinedelse{\??cv#1#2}}
+
+%D Handy.
+
+\setvalue{\??cv:\c!n:\v!one }{1}
+\setvalue{\??cv:\c!n:\v!two }{2}
+\setvalue{\??cv:\c!n:\v!three}{3}
+\setvalue{\??cv:\c!n:\v!four }{4}
+\setvalue{\??cv:\c!n:\v!five }{5}
+
+\def\wordtonumber#1#2{\ifcsname\??cv:\c!n:#1\endcsname\csname\??cv:\c!n:#1\endcsname\else#2\fi}
+
+% \defineconversion[ctx][c,o,n,t,e,x,t]
+%
+% \doloop{\doifelseconversionnumber{ctx}{\recurselevel}{[\recurselevel]}{\exitloop}}
+
+%D \macros
+%D {ordinaldaynumber, highordinalstr, ordinalstr}
+%D
+%D Efficient general ordinal number converters are sometimes
+%D difficult to implement. Fortunately dates never exceed the
+%D number~31.
+
+\ifx\high \undefined \let\high \firstofoneargument \fi
+\ifx\notsmallcapped\undefined \let\notsmallcapped\firstofoneargument \fi
+
+\def\highordinalstr#1{\high{\notsmallcapped{#1}}}
+\def\ordinalstr #1{\notsmallcapped{#1}}
+
+\def\ordinaldaynumber#1% \strippedcsname\ordinaldaynumber
+ {\expanded{\executeifdefined{\currentlanguage ordinaldaynumber}\noexpand\firstofoneargument{\number#1}}}
+
+%D As longs as symbols are linked to levels or numbers, we can
+%D also use the conversion mechanism, but in for instance the
+%D itemization macros, we prefer symbols because they can more
+%D easier be (partially) redefined. Symbols are implemented
+%D in another module.
+
+\def\smallcappedromannumerals#1{\smallcapped{\romannumerals{#1}}}
+\def\smallcappedcharacters #1{\smallcapped{\characters {#1}}}
+
+\defineconversion [] [\numbers] % the default conversion
+\defineconversion [\v!empty] [\gobbleoneargument]
+\defineconversion [\v!none] [\numbers]
+\defineconversion [\s!default] [\numbers]
+
+\defineconversion [month] [\doconvertmonthlong]
+\defineconversion [month:mnem] [\doconvertmonthshort]
+
+\defineconversion [\v!character] [\character]
+\defineconversion [\v!Character] [\Character]
+
+\defineconversion [\v!characters] [\characters]
+\defineconversion [\v!Characters] [\Characters]
+
+\defineconversion [a] [\characters]
+\defineconversion [A] [\Characters]
+\defineconversion [AK] [\smallcappedcharacters]
+\defineconversion [KA] [\smallcappedcharacters]
+
+\defineconversion [\v!numbers] [\numbers]
+\defineconversion [\v!Numbers] [\Numbers]
+\defineconversion [\v!mediaeval] [\mediaeval]
+
+\defineconversion [n] [\numbers]
+\defineconversion [N] [\Numbers]
+\defineconversion [m] [\mediaeval]
+\defineconversion [o] [\oldstylenumerals]
+\defineconversion [O] [\oldstylenumerals]
+\defineconversion [or] [\oldstyleromannumerals]
+
+\defineconversion [\v!romannumerals] [\romannumerals]
+\defineconversion [\v!Romannumerals] [\Romannumerals]
+
+\defineconversion [i] [\romannumerals]
+\defineconversion [I] [\Romannumerals]
+\defineconversion [r] [\romannumerals]
+\defineconversion [R] [\Romannumerals]
+
+\defineconversion [KR] [\smallcappedromannumerals]
+\defineconversion [RK] [\smallcappedromannumerals]
+
+\defineconversion [\v!greek] [\greeknumerals]
+\defineconversion [\v!Greek] [\Greeknumerals]
+
+\defineconversion [g] [\greeknumerals]
+\defineconversion [G] [\Greeknumerals]
+
+\defineconversion [arabicnumerals] [\arabicnumerals]
+\defineconversion [persiannumerals] [\persiannumerals]
+
+\defineconversion [abjadnumerals] [\abjadnumerals]
+\defineconversion [abjadnodotnumerals] [\adjadnodotnumerals]
+\defineconversion [abjadnaivenumerals] [\adjadnaivenumerals]
+
+\defineconversion [thainumerals] [\thainumerals]
+\defineconversion [devanagarinumerals] [\devanagarinumerals]
+\defineconversion [gurmurkhinumerals] [\gurmurkhinumerals]
+\defineconversion [gujaratinumerals] [\gujaratinumerals]
+\defineconversion [tibetannumerals] [\tibetannumerals]
+\defineconversion [greeknumerals] [\greeknumerals]
+\defineconversion [Greeknumerals] [\Greeknumerals]
+\defineconversion [arabicnumerals] [\arabicnumerals]
+\defineconversion [persiannumerals] [\persiannumerals]
+\defineconversion [arabicexnumerals] [\arabicexnumerals]
+
+
+\defineconversion [koreannumerals] [\koreannumerals]
+\defineconversion [koreanparentnumerals] [\koreanparentnumerals]
+\defineconversion [koreancirclenumerals] [\koreancirclenumerals]
+
+\defineconversion [kr] [\koreannumerals]
+\defineconversion [kr-p] [\koreanparentnumerals]
+\defineconversion [kr-c] [\koreancirclenumerals]
+
+\defineconversion [chinesenumerals] [\chinesenumerals]
+\defineconversion [chinesecapnumeralscn] [\chinesecapnumerals]
+\defineconversion [chineseallnumeralscn] [\chineseallnumerals]
+
+\defineconversion [cn] [\chinesenumerals]
+\defineconversion [cn-c] [\chinesecapnumerals]
+\defineconversion [cn-a] [\chineseallnumerals]
+
+%D Symbol sets:
+
+\ifx\symbol\undefined \def\symbol[#1]{#1} \fi % todo
+
+\defineconversion
+ [set 0]
+ [{\symbol[bullet]},
+ {\symbol[dash]},
+ {\symbol[star]},
+ {\symbol[triangle]},
+ {\symbol[circle]},
+ {\symbol[medcircle]},
+ {\symbol[bigcircle]},
+ {\symbol[square]}]
+
+\defineconversion
+ [set 1]
+ [\mathematics{\star},
+ \mathematics{\star\star},
+ \mathematics{\star\star\star},
+ \mathematics{\ddagger},
+ \mathematics{\ddagger\ddagger},
+ \mathematics{\ddagger\ddagger\ddagger},
+ \mathematics{\ast},
+ \mathematics{\ast\ast},
+ \mathematics{\ast\ast\ast}]
+
+\defineconversion
+ [set 2]
+ [\mathematics{*},
+ \mathematics{\dag},
+ \mathematics{\ddag},
+ \mathematics{**},
+ \mathematics{\dag\dag},
+ \mathematics{\ddag\ddag},
+ \mathematics{***},
+ \mathematics{\dag\dag\dag},
+ \mathematics{\ddag\ddag\ddag},
+ \mathematics{****},
+ \mathematics{\dag\dag\dag\dag},
+ \mathematics{\ddag\ddag\ddag\ddag}]
+
+\defineconversion
+ [set 3]
+ [\mathematics{\star},
+ \mathematics{\star\star},
+ \mathematics{\star\star\star},
+ \mathematics{\ddagger},
+ \mathematics{\ddagger\ddagger},
+ \mathematics{\ddagger\ddagger\ddagger},
+ \mathematics{\P},
+ \mathematics{\P\P},
+ \mathematics{\P\P\P},
+ \mathematics{\S},
+ \mathematics{\S\S},
+ \mathematics{\S\S\S},
+ \mathematics{\ast},
+ \mathematics{\ast\ast},
+ \mathematics{\ast\ast\ast}]
+
+\protect \endinput
diff --git a/tex/context/base/core-ctx.lua b/tex/context/base/core-ctx.lua
new file mode 100644
index 000000000..1dad7c2d7
--- /dev/null
+++ b/tex/context/base/core-ctx.lua
@@ -0,0 +1,93 @@
+if not modules then modules = { } end modules ['core-ctx'] = {
+ version = 1.001,
+ comment = "companion to core-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_prepfiles = false trackers.register("resolvers.prepfiles", function(v) trace_prepfiles = v end)
+
+commands = commands or { }
+
+local list, suffix, islocal, found = { }, "prep", false, false
+
+function commands.loadctxpreplist()
+ local ctlname = file.replacesuffix(tex.jobname,"ctl")
+ if lfs.isfile(ctlname) then
+ local x = xml.load(ctlname)
+ if x then
+ islocal = xml.found(x,"ctx:preplist[@local=='yes']")
+--~ if trace_prepfiles then
+ if islocal then
+ commands.writestatus("systems","loading ctx log file (local)") -- todo: m!systems
+ else
+ commands.writestatus("systems","loading ctx log file (specified)") -- todo: m!systems
+ end
+--~ end
+ for e in xml.collected(x,"ctx:prepfile") do
+ local name = xml.text(e)
+ if islocal then
+ name = file.basename(name)
+ end
+ local done = e.at['done'] or 'no'
+ if trace_prepfiles then
+ commands.writestatus("systems","registering %s -> %s",done)
+ end
+ found = true
+ list[name] = done -- 'yes' or 'no'
+ end
+ end
+ end
+end
+
+-- -- --
+
+local function found(name) -- used in resolve
+ local prepname = name .. "." .. suffix
+ if list[name] and lfs.isfile(prepname) then
+ if trace_prepfiles then
+ commands.writestatus("systems", "preprocessing: using %s",prepname)
+ end
+ return prepname
+ end
+ return false
+end
+
+local function resolve(name) -- used a few times later on
+ local filename = file.collapse_path(name)
+ local prepname = islocal and found(file.basename(name))
+ if prepname then
+ return prepname
+ end
+ prepname = found(filename)
+ if prepname then
+ return prepname
+ end
+ return false
+end
+
+--~ support.doiffileexistelse(name)
+
+local processfile = commands.processfile
+local doifinputfileelse = commands.doifinputfileelse
+
+function commands.processfile(name,maxreadlevel) -- overloaded
+ local prepname = resolve(name)
+ if prepname then
+ return processfile(prepname,0)
+ end
+ return processfile(name,maxreadlevel)
+end
+
+function commands.doifinputfileelse(name,depth)
+ local prepname = resolve(name)
+ if prepname then
+ return doifinputfileelse(prepname,0)
+ end
+ return doifinputfileelse(name,depth)
+end
+
+function commands.preparedfile(name)
+ return resolve(name) or name
+end
diff --git a/tex/context/base/core-ctx.mkii b/tex/context/base/core-ctx.mkii
new file mode 100644
index 000000000..93cf8b4be
--- /dev/null
+++ b/tex/context/base/core-ctx.mkii
@@ -0,0 +1,203 @@
+%D \module
+%D [ file=core-ctx,
+%D version=2006.08.16, % old stuff
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Job Control,
+%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 / Job Control}
+
+\unprotect
+
+\chardef\preprocessmethod 2 % 0=no check 1=present_check 2=log_check
+\chardef\preprocessstate 0 % 1=found 2=not_present (skip)
+\chardef\preprocesslocal 0 % 0=no 1=yes
+\def \preprocesssuffix {.prep}
+
+\def\loadctxpreplist
+ {\begingroup
+ \chardef\XMLtokensreduction\plusone
+ \ifcase\preprocessmethod
+ % no checking
+ \or
+ % simple checking
+ \or
+ \doiffileexistselse{./\jobname.ctl}
+ {\bgroup
+ \defineXMLenvironment[ctx:preplist][local=no]
+ {\doifelse{\XMLop{local}}{yes}
+ {\global\chardef\preprocesslocal\plusone
+ \writestatus\m!systems{loading ctx log file (local)}}%
+ {\writestatus\m!systems{loading ctx log file (specified)}}}
+ \donothing
+ \defineXMLenvironmentsave[ctx:prepfile][done=no]
+ \donothing
+ {\edef\readfilename{\XMLflush{ctx:prepfile}}%
+ \ifcase\preprocesslocal\else
+ \splitfilename\readfilename
+ \let\readfilename\splitoffbase
+ \fi
+ \writestatus\m!systems{registering \readfilename\space -> \XMLop{done}}%
+ \setxvalue{fp..\readfilename}{\XMLop{done}}}%
+ \processXMLfile{./\jobname.ctl}%
+ \egroup}%
+ {\global\chardef\preprocessmode\plusone}%
+ \fi
+ \global\let\loadctxpreplist\relax
+ \endgroup}
+
+\appendtoks\loadctxpreplist\to\everystarttext % will become: \prependtoks\loadctxpreplist\to\everyjob
+
+\def\docheckprepfile
+ {\ifcase\preprocessmethod
+ \iftracefiles\writestatus\m!systems{preprocessing - not needed}\fi
+ % no preprocessing
+ \or
+ % only check for existence
+ \iftracefiles\writestatus\m!systems{preprocessing - check existence of \readfilename\preprocesssuffix}\fi
+ \doiffileexistselse{\readfilename\preprocesssuffix}
+ {\chardef\preprocessstate\plusone}
+ \donothing
+ \or
+ % check when in list, otherwise assume normal file
+ \bgroup
+ \splitfilename\readfilename
+ \ifx\splitofftype\empty
+ % saveguard and speed up
+ \iftracefiles\writestatus\m!systems{preprocessing - no suffix}\fi
+ \egroup
+ \else\ifcase\preprocesslocal
+ % also ./ strippen
+ \iftracefiles\writestatus\m!systems{preprocessing - check presence of \readfilename\preprocesssuffix}\fi
+ \doifdefinedelse{fp..\readfilename}
+ {\egroup
+ \doiffileexistselse{\readfilename\preprocesssuffix}
+ {\chardef\preprocessstate\plusone}
+ {\chardef\preprocessstate\plustwo}}%
+ {\doifdefinedelse{fp.../\readfilename}
+ {\egroup
+ \edef\readfilename{./\readfilename}%
+ \doiffileexistselse{\readfilename\preprocesssuffix}
+ {\chardef\preprocessstate\plusone}
+ {\chardef\preprocessstate\plustwo}}%
+ {\doifdefinedelse{fp..\splitoffbase}%
+ {\egroup
+ \doiffileexistselse{\readfilename\preprocesssuffix}
+ {\chardef\preprocessstate\plusone}
+ {\chardef\preprocessstate\plustwo}}%
+ {\egroup}}}%
+ \else
+ % maybe just filecheck, why ctl
+ \iftracefiles\writestatus\m!systems{preprocessing - check local presence of \readfilename\preprocesssuffix}\fi
+ \doifdefinedelse{fp..\readfilename}
+ {\egroup
+ \doiffileexistselse{\readfilename\preprocesssuffix}
+ {\chardef\preprocessstate\plusone}
+ {\chardef\preprocessstate\plustwo}}%
+ {\egroup}%
+ \fi
+ \fi\fi}
+
+% beware, \readfilename keeps the original one, but we load and store the
+% suffixed with .prep file (if present)
+
+\def\doreadfile#1#2#3#4% beware, this one already works at format generation time!
+ {\sanitizefilename#2\to\readfilename
+ \ifx\readfilename\empty
+ % silently ignore
+ \else
+ \let\trackedfilename\readfilename
+ \chardef\preprocessstate\zerocount
+ \ifconditional\trackfilenames
+ \doifundefinedelse{fn..\trackedfilename}\donetrue\donefalse
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \checkfilename\readfilename
+ \ifcase\kindoffile
+ % not a full path or url, check for existence
+ \doifelsenothing{#1}
+ {\iftracefiles\writestatus\m!systems{searching for \readfilename\space on tex path}\fi
+ \def\next{\redoreadfile\readfilename{#3}{#4}}}%
+ {\iftracefiles\writestatus\m!systems{searching for \readfilename\space on #1}\fi
+ \def\next{\redoreadfile{\pathplusfile{#1}{\readfilename}}{#3}{#4}}}%
+ \else
+ % a full path or url, no further checking done
+ \docheckprepfile
+ \ifcase\preprocessstate
+ \doiffileexistselse\readfilename
+ {\iftracefiles\writestatus\m!systems{located \readfilename}\fi
+ \def\next{#3\dodoreadfile}}%
+ {\iftracefiles\writestatus\m!systems{not found \readfilename}\fi
+ \def\next{#4}}%
+ \or
+ \iftracefiles\writestatus\m!systems{located \readfilename\preprocesssuffix}\fi
+ \def\next{#3\dodoreadfile}%
+ \or
+ \iftracefiles\writestatus\m!systems{not found \readfilename\preprocesssuffix}\fi
+ \def\next{#4}%
+ \fi
+ \fi
+ \else
+ \edef\readfilename{\getvalue{fn..\readfilename}}% ??? is done !
+ \iftracefiles\writestatus\m!systems{already located \readfilename}\fi
+ \def\next{#3\dodoreadfile}%
+ \fi
+ \expandafter\next
+ \fi}
+
+\def\redoreadfile#1#2#3%
+ {\docheckprepfile
+ \ifcase\preprocessstate
+ \doiffileexistselse{#1}%
+ {\edef\readfilename{#1}%
+ \iftracefiles\writestatus\m!systems{#1 located}\fi
+ \def\next{#2\dodoreadfile}}%
+ {\iftracefiles\writestatus\m!systems{cannot locate #1}\fi
+ \advance\readlevel\minusone
+ \ifnum\readlevel>\zerocount
+ \edef\readfilename{\pathplusfile{\f!parentpath}{\readfilename}}%
+ \def\next{\redoreadfile\readfilename{#2}{#3}}%
+ \else
+ \def\next{#3}%
+ \fi}%
+ \or
+ \ifcase\preprocesslocal
+ \edef\readfilename{#1}% nor found
+ \else
+ % no path prepending
+ \fi
+ \iftracefiles\writestatus\m!systems{#1\preprocesssuffix\space located}\fi
+ \def\next{#2\dodoreadfile}%
+ \or
+ \def\next{#3}%
+ \fi
+ \next}
+
+\def\dodoreadfile % we provide hooks, for instance for \enableXML
+ {\ifconditional\trackfilenames
+ \setxvalue{fn..\trackedfilename}{\readfilename\ifcase\preprocessstate\or\preprocesssuffix\fi}%
+ \fi
+ \the\everybeforereadfile
+ \ifcase\preprocessstate
+ % no checking or not found when using method 1
+ \def\dodoreadfileindeed{\inputgivenfile\readfilename}%
+ \or
+ % found when using method 1 or 2
+ \def\dodoreadfileindeed{\inputgivenfile{\readfilename\preprocesssuffix}}%
+ \or
+ % not found when using method 2
+ \let\dodoreadfileindeed\relax
+ \fi
+ \dodoreadfileindeed
+ \relax
+ \the\everyafterreadfile}
+
+\protect \endinput
diff --git a/tex/context/base/core-ctx.mkiv b/tex/context/base/core-ctx.mkiv
new file mode 100644
index 000000000..9bf456952
--- /dev/null
+++ b/tex/context/base/core-ctx.mkiv
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=core-ctx,
+%D version=2006.08.16, % old stuff
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Job Control,
+%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 / Job Control}
+
+\unprotect
+
+\chardef\preprocessmethod \plustwo % always check in mkiv
+
+\registerctxluafile{core-ctx}{1.000}
+
+\def\loadctxpreplist{\ctxlua{commands.loadctxpreplist()}\global\let\loadctxpreplist\relax}
+
+% \prependtoks\loadctxpreplist\to\everyjob
+
+\appendtoks\loadctxpreplist\to\everystarttext
+
+\protect \endinput
diff --git a/tex/context/base/core-def.mkii b/tex/context/base/core-def.mkii
new file mode 100644
index 000000000..840f853a7
--- /dev/null
+++ b/tex/context/base/core-def.mkii
@@ -0,0 +1,105 @@
+%D \module
+%D [ file=core-def,
+%D version=2002.05.07,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Defaults,
+%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 / Defaults}
+
+%D Here we collect settings that cannot be done earlier due to
+%D depedencies. More code will moved to this module later.
+
+\unprotect
+
+\usesymbols[mis,mvs] % 'glm' no longer needed due to lm
+
+\usesymbols[nav] \setupsymbolset[navigation 1]
+
+\setupinteraction[\c!symbolset=navigation 1]
+
+% initialization order:
+
+%appendtoks \initializeluainstances \to \everyjob
+\appendtoks \showcontextbanner \to \everyjob
+\appendtoks \initializenewlinechar \to \everyjob
+\appendtoks \checksystemcommandmode \to \everyjob
+\appendtoks \calculatecurrenttime \to \everyjob
+\appendtoks \loadsystemfiles \to \everyjob
+
+\appendtoks \loadoptionfile \to \everyjob % can load files !
+
+\appendtoks \preloadfonts \to \everyjob
+\appendtoks \settopskip \to \everyjob
+\appendtoks \preloadlanguages \to \everyjob
+\appendtoks \preloadspecials \to \everyjob
+\appendtoks \openspecialfile \to \everyjob
+\appendtoks \openutilities \to \everyjob
+\appendtoks \splitjobfilename \to \everyjob
+\appendtoks \checknotes \to \everyjob % depends on bodyfont
+\appendtoks \initializeMPgraphics \to \everyjob % after loading system files
+\appendtoks \reportsystemcommandmode \to \everyjob
+\appendtoks \initializemainlanguage \to \everyjob
+\appendtoks \settrue\trackfilenames \to \everyjob
+\appendtoks \newbackgroundfalse \to \everyjob % global
+
+\ifdefined\initializepagecounters
+ \appendtoks \initializepagecounters \to \everyjob
+\fi
+
+\appendtoks \directsetup{*runtime:options} \to \everyjob % we could erase them afterwards % order can change
+\appendtoks \directsetup{*runtime:modules} \to \everyjob % we could erase them afterwards % order can change
+
+\appendtoks \checkpreprocessor \to \everyjob
+
+%appendtoks \page[\v!last] \page \to \everybye % moved to core-job, we need to do this cleaner
+\appendtoks \ifarrangingpages\poparrangedpages\fi \to \everybye
+\appendtoks \registerfileinfo[end]\jobname \to \everybye
+\appendtoks \savenofpages \to \everybye
+\appendtoks \savenofsubpages \to \everybye
+
+\appendtoks \closeutilities \to \everygoodbye
+\appendtoks \stopcopyingblocks \to \everygoodbye
+\appendtoks \closespecialfile \to \everygoodbye
+
+\prependtoks \resetutilities \to \everystarttext % moved 28-02-2002
+\prependtoks \loadtwopassdata \to \everystarttext % moved 28-02-2002
+\appendtoks \checkreferences \to \everystarttext % new 04-12-1999
+
+% \appendtoks\everyjob\expandafter{\the\everyjob\checkpreprocessor}\to\everydump
+
+% temporary here:
+
+% \in \at \about \from \over
+
+\unexpanded\def\arg{\mathortext\normalmatharg\normaltextarg}
+
+% brrr
+% normally one does not want this to happen nested, maybe there
+% is more; non public vars btw, will become conditionals
+
+\ifx\writetoregisterfalse\undefined \else \appendtoks \writetoregisterfalse \to \everybeforeutilityread \fi
+\ifx\writetolistfalse \undefined \else \appendtoks \writetolistfalse \to \everybeforeutilityread \fi
+\ifx\notesenabledfalse \undefined \else \appendtoks \notesenabledfalse \to \everybeforeutilityread \fi
+
+\def\synctexwarning
+ {\ifdefined\synctex \ifnum\synctex=\zerocount \else
+ \writeline
+ \writestatus\m!systems{BEWARE: syntex functionality is enabled!}%
+ \writeline
+ \globallet\synctexwarning\relax
+ \fi \fi}
+
+\prependtoks \synctexwarning \to \everyjob
+\prependtoks \synctexwarning \to \everystarttext
+\appendtoks \synctexwarning \to \everystoptext
+
+% last minute hacks
+
+\protect \endinput
diff --git a/tex/context/base/core-def.mkiv b/tex/context/base/core-def.mkiv
new file mode 100644
index 000000000..59451a914
--- /dev/null
+++ b/tex/context/base/core-def.mkiv
@@ -0,0 +1,94 @@
+%D \module
+%D [ file=core-def,
+%D version=2002.05.07,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Defaults,
+%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 / Defaults}
+
+%D Here we collect settings that cannot be done earlier due to
+%D depedencies. More code will moved to this module later.
+
+\unprotect
+
+\usesymbols[mis,mvs,nav]
+
+\setupsymbolset[navigation 1]
+
+\setupinteraction[\c!symbolset=navigation 1]
+
+% initialization order:
+
+\appendtoks \showcontextbanner \to \everyjob
+\appendtoks \initializenewlinechar \to \everyjob
+\appendtoks \calculatecurrenttime \to \everyjob
+\appendtoks \loadsystemfiles \to \everyjob
+\appendtoks \loadoptionfile \to \everyjob % can load files !
+\appendtoks \preloadfonts \to \everyjob
+\appendtoks \settopskip \to \everyjob
+\appendtoks \preloadlanguages \to \everyjob
+\appendtoks \preloadspecials \to \everyjob
+\appendtoks \initializeMPgraphics \to \everyjob % after loading system files
+\appendtoks \initializemainlanguage \to \everyjob
+%appendtoks \MPLIBregister \to \everyjob
+\appendtoks \xmlinitialize \to \everyjob
+\appendtoks \newbackgroundfalse \to \everyjob % global
+\appendtoks \initializepagecounters \to \everyjob
+\appendtoks \directsetup{*runtime:options} \to \everyjob % we could erase them afterwards % order can change
+\appendtoks \directsetup{*runtime:modules} \to \everyjob % we could erase them afterwards % order can change
+\appendtoks \checkpreprocessor \to \everyjob
+
+%appendtoks \page[\v!last] \page \to \everybye % moved to core-job, we need to do this cleaner
+\appendtoks \ifarrangingpages\poparrangedpages\fi \to \everybye
+%appendtoks \registerfileinfo[end]\jobfilename \to \everybye
+
+%appendtoks \MPLIBallocate{1000} \to \everydump
+
+\prependtoks \resetallattributes \to \everybeforeoutput
+
+\appendtoks \the\everybackendshipout \to \everyshipout
+\prependtoks \the\everylastbackendshipout \to \everylastshipout
+
+\prependtoks \lefttoright \to \everybeforeoutput
+
+% temporary here:
+
+\ifdefined\in \let\normalmathin \in \unexpanded\def\in {\mathortext\normalmathin \dospecialin } \else \let\in \dospecialin \fi
+\ifdefined\at \let\normalmathat \at \unexpanded\def\at {\mathortext\normalmathat \dospecialat } \else \let\at \dospecialat \fi
+\ifdefined\about \let\normalmathabout\about \unexpanded\def\about{\mathortext\normalmathabout\dospecialabout} \else \let\about\dospecialabout \fi
+\ifdefined\from \let\normalmathfrom \from \unexpanded\def\from {\mathortext\normalmathfrom \dospecialfrom } \else \let\from \dospecialfrom \fi
+\ifdefined\over \let\normalmathover \over \unexpanded\def\over {\mathortext\normalmathover \dospecialabout} \else \let\over \dospecialabout \fi
+
+\unexpanded\def\arg{\mathortext\normalmatharg\normaltextarg}
+
+% brrr
+
+\appendtoks
+ \synchronizegloballinespecs
+ \synchronizelocallinespecs
+\to \everysetupbodyfont
+
+\appendtoks
+ \synchronizelocallinespecs
+\to \everyswitchtobodyfont
+
+\def\synctexwarning
+ {\ifdefined\synctex \ifnum\synctex=\zerocount \else
+ \writeline
+ \writestatus\m!systems{BEWARE: synctex functionality is enabled!}%
+ \writeline
+ \globallet\synctexwarning\relax
+ \fi \fi}
+
+\prependtoks \synctexwarning \to \everyjob
+\prependtoks \synctexwarning \to \everystarttext
+\appendtoks \synctexwarning \to \everystoptext
+
+\protect \endinput
diff --git a/tex/context/base/core-env.mkii b/tex/context/base/core-env.mkii
new file mode 100644
index 000000000..a22594b27
--- /dev/null
+++ b/tex/context/base/core-env.mkii
@@ -0,0 +1,543 @@
+%D \module
+%D [ file=core-env, % was core-new
+%D version=1995.01.01, % wrong
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=New ones,
+%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 / Environments}
+
+\unprotect
+
+% Clean labels:
+
+\bgroup % some day this will go away / we could use detokenize as well
+
+% actually we should handle all discretionaries here
+
+\catcode`:=\@@active
+
+\gdef\cleanuplabel#1%
+ {\begingroup
+ \let:\lettercolon
+ \xdef\cleanlabel{#1}%
+ \endgroup}
+
+\gdef\cleanupprefixedlabel#1#2%
+ {\begingroup
+ \let:\lettercolon
+ \xdef\cleanprefix{#1}%
+ \xdef\cleanlabel {#2}%
+ \endgroup}
+
+\gdef\protectlabels
+ {\let:\lettercolon}
+
+\global\def\blabelgroup {\begingroup \let:\lettercolon}
+\global\let\elabelgroup \endgroup
+
+\gdef\labelcsname
+ {\begingroup\let:\lettercolon
+ \expandafter\endgroup\csname}
+
+\gdef\labelvalue#1%
+ {\labelcsname#1\endcsname}
+
+\egroup
+
+%D Modes:
+%D
+%D \starttyping
+%D \enablemode[screen,paper,bound]
+%D
+%D \doifmodeelse {paper} {this} {that}
+%D \doifmode {paper,screen} {this}
+%D \doifnotmode {paper,bound} {that}
+%D
+%D \startmode [list]
+%D \stopmode
+%D
+%D \startnotmode [list]
+%D \stopnotmode
+%D \stoptyping
+%D
+%D system modes have a * as prefix
+%D
+%D Sometimes, we want to prevent a mode for being set. Think
+%D of situations where a style enables a mode, but an outer
+%D level style does not want that. Preventing can be
+%D considered a permanent disabling on forehand.
+
+\def\@mode@{@md@}
+
+\def\systemmodeprefix{*}
+
+\def\disabledmode {0}
+\def\enabledmode {1}
+\def\preventedmode {2}
+
+% fast internal ones
+
+\def\setmode #1{\@EA\let\csname\@mode@#1\endcsname\enabledmode }
+\def\resetmode#1{\@EA\let\csname\@mode@#1\endcsname\disabledmode}
+
+\def\setsystemmode #1{\@EA\let\csname\@mode@\systemmodeprefix#1\endcsname\enabledmode }
+\def\resetsystemmode#1{\@EA\let\csname\@mode@\systemmodeprefix#1\endcsname\disabledmode}
+
+% user ones
+
+\def\preventmode{\unprotect\dopreventmode}
+\def\enablemode {\unprotect\doenablemode }
+\def\disablemode{\unprotect\dodisablemode}
+
+\def\dopreventmode[#1]{\protect\cleanuplabel{#1}\rawprocesscommalist[\cleanlabel]\dodopreventmode}
+\def\doenablemode [#1]{\protect\cleanuplabel{#1}\rawprocesscommalist[\cleanlabel]\dodoenablemode }
+\def\dodisablemode[#1]{\protect\cleanuplabel{#1}\rawprocesscommalist[\cleanlabel]\dododisablemode}
+
+\def\dodopreventmode#1%
+ {\@EA\let\csname\@mode@#1\endcsname\preventedmode}
+
+\def\dodoenablemode#1% mode can be relax
+ {\ifcase0\csname\@mode@#1\endcsname\relax
+ \@EA\let\csname\@mode@#1\endcsname\enabledmode
+ \fi}
+
+\def\dododisablemode#1%
+ {\ifcase0\csname\@mode@#1\endcsname\or
+ \@EA\let\csname\@mode@#1\endcsname\disabledmode
+ \fi}
+
+% handy for mp
+
+\def\booleanmodevalue#1% can be \relax
+ {\expandafter\ifx\csname\@mode@#1\endcsname\relax
+ fals%
+ \else\ifnum0\csname\@mode@#1\endcsname=0
+ fals%
+ \else
+ tru%
+ \fi\fi e}
+
+% check macros
+
+\newif\ifcheckedmode
+
+\def\dodocheckformode#1%
+ {\ifcase0\csname\@mode@#1\endcsname\or\checkedmodetrue\fi}
+
+\def\docheckformode#1#2#3% will be sped up with a quit
+ {\cleanuplabel{#3}%
+ \protect\checkedmodefalse\rawprocesscommacommand[\cleanlabel]\dodocheckformode
+ \ifcheckedmode\@EA#1\else\@EA#2\fi}
+
+\def\dodocheckforallmodes#1%
+ {\ifcase0\csname\@mode@#1\endcsname\relax\checkedmodefalse\or\or\checkedmodefalse\fi}
+
+\def\docheckforallmodes#1#2#3% will be sped up with a quit
+ {\cleanuplabel{#3}%
+ \protect\checkedmodetrue\rawprocesscommacommand[\cleanlabel]\dodocheckforallmodes
+ \ifcheckedmode\@EA#1\else\@EA#2\fi}
+
+% simple ones
+
+\def\doifmodeelse{\unprotect\dodoifmodeelse}
+\def\doifmode {\unprotect\dodoifmode}
+\def\doifnotmode {\unprotect\dodoifnotmode}
+\def\startmode {\unprotect\dostartmode}
+\def\startnotmode{\unprotect\dostartnotmode}
+
+\def\dodoifmodeelse
+ {\docheckformode\firstoftwoarguments\secondoftwoarguments}
+
+\def\dodoifmode
+ {\docheckformode\firstofoneargument\gobbleoneargument}
+
+\def\dodoifnotmode
+ {\docheckformode\gobbleoneargument\firstofoneargument}
+
+\long\def\dostartmode[#1]%
+ {\docheckformode\donothing\dostopmode{#1}}
+
+\long\def\dostartnotmode[#1]%
+ {\docheckformode\dostopnotmode\donothing{#1}}
+
+\let\stopmode \donothing
+\let\stopnotmode\donothing
+
+\long\def\dostopmode #1\stopmode {}
+\long\def\dostopnotmode#1\stopnotmode{}
+
+\def\doifallmodeselse{\unprotect\dodoifallmodeselse}
+\def\doifallmodes {\unprotect\dodoifallmodes}
+\def\doifnotallmodes {\unprotect\dodoifnotallmodes}
+\def\startallmodes {\unprotect\dostartallmodes}
+\def\startnotallmodes{\unprotect\dostartnotallmodes}
+
+\def\dodoifallmodeselse
+ {\docheckforallmodes\firstoftwoarguments\secondoftwoarguments}
+
+\def\dodoifallmodes
+ {\docheckforallmodes\firstofoneargument\gobbleoneargument}
+
+\def\dodoifnotallmodes
+ {\docheckforallmodes\gobbleoneargument\firstofoneargument}
+
+\long\def\dostartallmodes[#1]%
+ {\docheckforallmodes\donothing\dostopallmodes{#1}}
+
+\long\def\dostartnotallmodes[#1]%
+ {\docheckforallmodes\dostopnotallmodes\donothing{#1}}
+
+\let\stopallmodes \donothing
+\let\stopnotallmodes\donothing
+
+\long\def\dostopallmodes #1\stopallmodes {}
+\long\def\dostopnotallmodes#1\stopnotallmodes{}
+
+% Setups
+
+\let\startsetups\relax % to please dep checker
+\let\stopsetups \relax % to please dep checker
+
+\expanded
+ {\long\def\@EA\noexpand\csname\e!start\v!setups\endcsname
+ {\begingroup\noexpand\doifnextoptionalelse
+ {\noexpand\startsetupsA\@EA\noexpand\csname\e!stop\v!setups\endcsname}
+ {\noexpand\startsetupsB\@EA\noexpand\csname\e!stop\v!setups\endcsname}}}
+
+\letvalue{\e!stop\v!setups}\relax
+
+\unexpanded \def\setups{\doifnextbgroupelse\dosetupsA\dosetupsB} % {..} or [..]
+\unexpanded \def\setup {\doifnextbgroupelse\dosetups \dosetupsC} % {..} or [..]
+
+\def\dosetupsA #1{\cleanuplabel{#1}\processcommacommand[\cleanlabel]\dosetups} % {..}
+\def\dosetupsB[#1]{\cleanuplabel{#1}\processcommacommand[\cleanlabel]\dosetups} % [..]
+\def\dosetupsC[#1]{\cleanuplabel{#1}\dosetups\cleanlabel} % [..]
+
+% \def\dosetups#1% the grid option will be extended to other main modes
+% {\executeifdefined{\??su\ifgridsnapping\v!grid\fi:#1}
+% {\executeifdefined{\??su :#1}\gobbleoneargument}\empty} % takes one argument
+%
+% \def\setupwithargument#1% the grid option will be extended to other main modes
+% {\executeifdefined{\??su:#1}\gobbleoneargument}
+
+% better:
+
+% \def\dosetups#1% the grid option will be extended to other main modes
+% {\executeifdefined{\??su\ifgridsnapping\v!grid\fi:#1}
+% {\executeifdefined{\??su :#1}\gobbleoneargument}\empty} % takes one argument
+%
+% \def\setupwithargument#1% the grid option will be extended to other main modes
+% {\executeifdefined{\??su:#1}\gobbleoneargument}
+
+% faster:
+
+\letvalue{\??su:\letterpercent}\gobbleoneargument
+
+\def\dosetups#1% the grid option will be extended to other main modes
+ {\csname\??su
+ \ifgridsnapping
+ \ifcsname\??su\v!grid:#1\endcsname\v!grid:#1\else\ifcsname\??su:#1\endcsname:#1\else:\letterpercent\fi\fi
+ \else
+ \ifcsname\??su:#1\endcsname:#1\else:\letterpercent\fi
+ \fi
+ \endcsname\empty} % takes one argument
+
+\def\setupwithargument#1% the grid option will be extended to other main modes
+ {\csname\??su:\ifcsname\??su:#1\endcsname#1\else\letterpercent\fi\endcsname}
+
+\let\directsetup\dosetups
+
+% somehow fails ...
+%
+% \letvalue{\??su:..}\gobbleoneargument
+%
+% \def\dosetups#1% the grid option will be extended to other main modes
+% {\csname \??su
+% \ifcsname\??su\ifgridsnapping\v!grid\fi:#1\endcsname\v!grid:#1\else
+% \ifcsname\??su :#1\endcsname :#1\else
+% :..\fi\fi
+% \endcsname\empty} % takes one argument
+%
+% \def\setupwithargument#1% the grid option will be extended to other main modes
+% {\csname\??su:\ifcsname\??su:#1\endcsname#1\else..\fi\endcsname}
+
+\let\directsetup\dosetups
+
+\def\doifsetupselse#1% to be done: grid
+ {\doifdefinedelse{\??su:#1}}
+
+\chardef\setupseolmode\plusone
+
+\def\startsetups {\xxstartsetups\plusone \stopsetups } \let\stopsetups \relax
+\def\startlocalsetups{\xxstartsetups\plusone \stoplocalsetups} \let\stoplocalsetups\relax
+\def\startrawsetups {\xxstartsetups\zerocount\stoprawsetups } \let\stoprawsetups \relax
+\def\startxmlsetups {\xxstartsetups\plustwo \stopxmlsetups } \let\stopxmlsetups \relax
+
+\def\xxstartsetups#1#2%
+ {\begingroup\chardef\setupseolmode#1\doifnextoptionalelse{\startsetupsA#2}{\startsetupsB#2}}
+
+\def\startsetupsA#1% [ ] delimited
+ {\ifcase\setupseolmode\or\catcode`\^^M\@@ignore\or\catcode`\^^M\@@ignore\catcode`\|\@@other\fi
+ \dotripleempty\dostartsetups[#1]}
+
+\def\startsetupsB#1#2 % space delimited
+ {\ifcase\setupseolmode\or\catcode`\^^M\@@ignore\or\catcode`\^^M\@@ignore\catcode`\|\@@other\fi
+ \dodostartsetups#1\empty{#2}}
+
+\def\startsetupsC[#1][#2][#3]{\dodostartsetups#1{#2}{#3}} % [..] [..]
+\def\startsetupsD[#1][#2][#3]{\dodostartsetups#1\empty{#2}} % [..]
+
+\def\dostartsetups
+ {\ifthirdargument\@EA\startsetupsC\else\@EA\startsetupsD\fi}
+
+% \long\def\dodostartsetups#1#2#3% watch out: not \grabuntil
+% {\dograbuntil#1{\endgroup\dodoglobal\long\setvalue{\??su#2:#3}}} % \doglobal
+%
+% better:
+
+% \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 % 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{*}
+
+\def\systemsetups#1{\dosetups{\systemsetupsprefix#1}}
+
+\def\resetsetups[#1]% see x-fo for usage
+ {\ifundefined{\??su\ifgridsnapping\v!grid\fi:#1}%
+ \dodoglobal\letbeundefined{\??su:#1}%
+ \else
+ \dodoglobal\letbeundefined{\??su\ifgridsnapping\v!grid\fi:#1}%
+ \fi}
+
+% or
+%
+% \def\resetsetups[#1]%
+% {\letbeundefined
+% {\??su:%
+% \ifundefined{\??su\ifgridsnapping\v!grid\fi:#1}#1\else\ifgridsnapping\v!grid\fi%
+% #1}}
+
+%D new and beta and will become a module instead
+
+\def\defineshortcut
+ {\dotripleargument\dodefineshortcut}
+
+\def\dodefineshortcut[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelsenothing{#1}
+ {\dododefineshortcut[<>][#2][#3]}
+ {\dododefineshortcut[#1][#2][#3]}%
+ \else\ifsecondargument
+ \dododefineshortcut[<>][#1][#2]%
+ \else
+ \dododefineshortcut[<>][][#1]%
+ \fi\fi}
+
+\def\dododefineshortcut[#1#2][#3][#4]% #1 is the trigger, #2 the delimiter/tag
+ {\doifundefined{\??te\??te\string#2}{\letvalue{\??te\??te\string#2}=#1}%
+ \defineactivecharacter #1 {\@EA\doshortcut\string#2} %
+ \getparameters
+ [\??te\string#2#3]
+ [\c!commands=,\c!command=,\c!style=,\c!color=,#4]}
+
+\def\doshortcut#1%
+ {\ifmmode
+ \getvalue{\??te\??te#1}%
+ \else
+ \bgroup
+ \catcode`#1=\@@other
+ \def\dodoshortcut##1#1%
+ {\def\shorttag{\??te#1}%
+ \def\shortcut{##1}%
+ \dododoshortcut##1:\end}%
+ \@EA\dodoshortcut
+ \fi}
+
+\def\dododoshortcut#1:#2\end
+ {\doifelsenothing{#2}
+ {\doifundefinedelse{\shorttag\c!commands}
+ {\shortcut}
+ {\@EA\dodododoshortcut\@EA\shorttag\@EA:\shortcut:\end}}
+ {\doifundefinedelse{\shorttag#1\c!commands}
+ {\shortcut}
+ {\dodododoshortcut\shorttag#1:#2\end}}%
+ \egroup}
+
+\def\dodododoshortcut#1:#2:\end
+ {\getvalue{#1\c!commands}%
+ \doattributes{#1}\c!style\c!color{\getvalue{#1\c!command}{#2}}}
+
+%D \defineshortcut [style=type]
+%D \defineshortcut [b] [style=bold]
+%D \defineshortcut [e] [style=\em]
+%D \defineshortcut [t] [style=type]
+%D \defineshortcut [c] [style=cap]
+%D \defineshortcut [k] [style=cap]
+%D \defineshortcut [u] [style=type,command=\hyphenatedurl]
+%D
+%D \startlines
+%D test <ziezo> test
+%D test test <t:ziezo>
+%D test test <b:ziezo>
+%D test test <w:ziezo>
+%D zus<>zo zus<:>zo zus<::>zo
+%D test test <t:ziezo> dat (ziezo)
+%D test test <t::ziezo> dat (:ziezo)
+%D test test <t:ziezo:> dat (ziezo:)
+%D test test <t:zi:ezo:> dat (zi:ezo:)
+%D well, <u:http://www.pragma-ade.nl> looks fuzzy
+%D $10<20$
+%D \stoplines
+%D
+%D \defineshortcut [<>] [i] [style=\it]
+%D \defineshortcut [()] [b] [style=\bf]
+%D \defineshortcut [++] [s] [style=\sl]
+%D \defineshortcut [//] [u] [style=\underbars]
+%D \defineshortcut [--] [a] [style=\overstrike]
+%D
+%D \startlines
+%D it seems <i:to work> well
+%D it seems (b:to work) well
+%D it seems +s:to work+ well
+%D it seems /u:to work/ well
+%D it seems -a:to work- well
+%D \stoplines
+
+%D \macros
+%D {setvariables,getvariable,getvariabledefault}
+%D
+%D \starttyping
+%D \setvariables[xx][title=]
+%D \setvariables[xx][title=test test]
+%D \setvariables[xx][title=test $x=1$ test] % fatal error reported
+%D \setvariables[xx][title=test {$x=1$} test]
+%D \setvariables[xx][title] % fatal error reported
+%D \setvariables[xx][titletitel=e]
+%D \stoptyping
+
+\def\??vars{@@vars}
+
+\def\setvariables {\dotripleargument\dosetvariables[\getrawparameters ]}
+\def\setevariables{\dotripleargument\dosetvariables[\getraweparameters]}
+\def\setgvariables{\dotripleargument\dosetvariables[\getrawgparameters]}
+\def\setxvariables{\dotripleargument\dosetvariables[\getrawxparameters]}
+
+\def\globalsetvariables % obsolete
+ {\dotripleargument\dosetvariables[\globalgetrawparameters]}
+
+\long\def\dosetvariables[#1][#2][#3]% tricky, test on s-pre-60
+ {\errorisfataltrue
+ \doifelse{#2}\currentvariableclass
+ {#1[\??vars:#2:][#3]}%
+ {\pushmacro\currentvariableclass
+ \def\currentvariableclass{#2}%
+ \getvariable{#2}\s!reset
+ #1[\??vars:#2:][#3]%
+ \getvariable{#2}\s!set
+ \popmacro\currentvariableclass}%
+ \errorisfatalfalse}
+
+\long\def\setvariable #1#2#3{\long\setvalue {\??vars:#1:#2}{#3}}
+\long\def\setevariable#1#2#3{\long\setevalue{\??vars:#1:#2}{#3}}
+\long\def\setgvariable#1#2#3{\long\setgvalue{\??vars:#1:#2}{#3}}
+\long\def\setxvariable#1#2#3{\long\setxvalue{\??vars:#1:#2}{#3}}
+
+\def\getvariable#1#2% to be sped up
+ {\csname
+ \ifcsname\??vars:#1:#2\endcsname\??vars:#1:#2\else\s!empty\fi
+ \endcsname}
+
+\def\showvariable#1#2%
+ {\showvalue{\ifcsname\??vars:#1:#2\endcsname\??vars:#1:#2\else\s!empty\fi}}
+
+\let\currentvariableclass\empty
+
+%D \macros
+%D {doifelsevariable,doifvariable,doifnotvariable}
+%D
+%D A few trivial macros:
+
+\def\doifelsevariable#1#2%
+ {\ifcsname\??vars:#1:#2\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifvariable#1#2%
+ {\ifcsname\??vars:#1:#2\endcsname
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotvariable#1#2%
+ {\ifcsname\??vars:#1:#2\endcsname
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\getvariabledefault#1#2% #3% can be command, so no ifcsname here
+ {\executeifdefined{\??vars:#1:#2}}% {#3}
+
+%D \macros
+%D {checkvariables}
+%D
+%D I'll probably forget that this on exists.
+
+\def\checkvariables
+ {\dodoubleargument\docheckvariables}
+
+\def\docheckvariables
+ {\dogetparameters\docheckrawvalue}
+
+\def\docheckrawvalue#1#2#3%
+ {\doifundefined {\??vars:#1:#2}{\setvalue{\??vars:#1:#2}{#3}}
+ {\doifvaluenothing{\??vars:#1:#2}{\setvalue{\??vars:#1:#2}{#3}}}}
+
+% \def\setupenv{\dodoubleargument\rawgetparameters[\??en]}
+%
+% \def\doifenvelse#1{\doifdefinedelse{\??en#1}} % speed up
+% \def\doifenv #1{\doifdefined {\??en#1}} % speed up
+% \def\doifnotenv #1{\doifundefined {\??en#1}} % speed up
+%
+% \def\env#1{\csname\??en#1\endcsname}
+%
+% \def\envvar#1#2%
+% {\ifcsname\??en#1\endcsname
+% \csname\??en#1\endcsname\else#2%
+% \fi}
+
+% low level change, now also accessible as \getvariable{environment}{...}; the
+% next macros will become obsolete some day in favor of normal variables
+
+\def\s!environment{environment}
+
+\def\setupenv {\dotripleargument\dosetvariables[\getrawparameters][\s!environment]}
+\def\doifenvelse{\doifelsevariable \s!environment}
+\def\doifenv {\doifvariable \s!environment}
+\def\doifnotenv {\doifnotvariable \s!environment}
+\def\env {\getvariable \s!environment}
+\def\envvar {\getvariabledefault\s!environment}
+
+\protect \endinput
diff --git a/tex/context/base/core-env.mkiv b/tex/context/base/core-env.mkiv
new file mode 100644
index 000000000..d927ff3ad
--- /dev/null
+++ b/tex/context/base/core-env.mkiv
@@ -0,0 +1,388 @@
+%D \module
+%D [ file=core-env, % was core-new
+%D version=1995.01.01, % wrong
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=New ones,
+%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 / Environments}
+
+\unprotect
+
+%D Modes:
+%D
+%D \starttyping
+%D \enablemode[screen,paper,bound]
+%D
+%D \doifmodeelse {paper} {this} {that}
+%D \doifmode {paper,screen} {this}
+%D \doifnotmode {paper,bound} {that}
+%D
+%D \startmode [list]
+%D \stopmode
+%D
+%D \startnotmode [list]
+%D \stopnotmode
+%D \stoptyping
+%D
+%D system modes have a * as prefix
+%D
+%D Sometimes, we want to prevent a mode for being set. Think
+%D of situations where a style enables a mode, but an outer
+%D level style does not want that. Preventing can be
+%D considered a permanent disabling on forehand.
+
+\def\@mode@{@md@}
+
+\def\systemmodeprefix{*}
+
+\def\disabledmode {0} % no chardefs
+\def\enabledmode {1}
+\def\preventedmode{2}
+
+% fast internal ones
+
+\def\setmode #1{\@EA\let\csname\@mode@#1\endcsname\enabledmode }
+\def\resetmode#1{\@EA\let\csname\@mode@#1\endcsname\disabledmode}
+
+\def\setsystemmode #1{\@EA\let\csname\@mode@\systemmodeprefix#1\endcsname\enabledmode }
+\def\resetsystemmode#1{\@EA\let\csname\@mode@\systemmodeprefix#1\endcsname\disabledmode}
+
+% user ones
+
+\def\preventmode{\unprotect\dopreventmode}
+\def\enablemode {\unprotect\doenablemode }
+\def\disablemode{\unprotect\dodisablemode}
+
+\def\dopreventmode[#1]{\protect\rawprocesscommacommand[#1]\dodopreventmode}
+\def\doenablemode [#1]{\protect\rawprocesscommacommand[#1]\dodoenablemode }
+\def\dodisablemode[#1]{\protect\rawprocesscommacommand[#1]\dododisablemode}
+
+\def\dodopreventmode#1%
+ {\@EA\let\csname\@mode@#1\endcsname\preventedmode}
+
+\def\dodoenablemode#1% mode can be relax
+ {\ifcase0\csname\@mode@#1\endcsname\relax
+ \@EA\let\csname\@mode@#1\endcsname\enabledmode
+ \fi}
+
+\def\dododisablemode#1%
+ {\ifcase0\csname\@mode@#1\endcsname\or
+ \@EA\let\csname\@mode@#1\endcsname\disabledmode
+ \fi}
+
+% handy for mp
+
+\def\booleanmodevalue#1% can be \relax
+ {\expandafter\ifx\csname\@mode@#1\endcsname\relax
+ fals%
+ \else\ifnum0\csname\@mode@#1\endcsname=0
+ fals%
+ \else
+ tru%
+ \fi\fi e}
+
+% check macros
+
+\newif\ifcheckedmode
+
+\def\dodocheckformode#1%
+ {\ifcase0\csname\@mode@#1\endcsname\or\checkedmodetrue\fi}
+
+\def\docheckformode#1#2#3% will be sped up with a quit
+ {\protect\checkedmodefalse\rawprocesscommacommand[#3]\dodocheckformode
+ \ifcheckedmode\@EA#1\else\@EA#2\fi}
+
+\def\dodocheckforallmodes#1%
+ {\ifcase0\csname\@mode@#1\endcsname\relax\checkedmodefalse\or\or\checkedmodefalse\fi}
+
+\def\docheckforallmodes#1#2#3% will be sped up with a quit
+ {\protect\checkedmodetrue\rawprocesscommacommand[#3]\dodocheckforallmodes
+ \ifcheckedmode\@EA#1\else\@EA#2\fi}
+
+% simple ones
+
+\unexpanded\def\doifmodeelse{\unprotect\dodoifmodeelse}
+\unexpanded\def\doifmode {\unprotect\dodoifmode}
+\unexpanded\def\doifnotmode {\unprotect\dodoifnotmode}
+\unexpanded\def\startmode {\unprotect\dostartmode}
+\unexpanded\def\startnotmode{\unprotect\dostartnotmode}
+
+\def\dodoifmodeelse
+ {\docheckformode\firstoftwoarguments\secondoftwoarguments}
+
+\def\dodoifmode
+ {\docheckformode\firstofoneargument\gobbleoneargument}
+
+\def\dodoifnotmode
+ {\docheckformode\gobbleoneargument\firstofoneargument}
+
+\long\unexpanded\def\dostartmode[#1]%
+ {\docheckformode\donothing\dostopmode{#1}}
+
+\long\def\dostartnotmode[#1]%
+ {\docheckformode\dostopnotmode\donothing{#1}}
+
+\unexpanded\def\stopmode {} % no relax
+\unexpanded\def\stopnotmode{} % no relax
+
+\long\def\dostopmode #1\stopmode {}
+\long\def\dostopnotmode#1\stopnotmode{}
+
+\unexpanded\def\doifallmodeselse{\unprotect\dodoifallmodeselse}
+\unexpanded\def\doifallmodes {\unprotect\dodoifallmodes}
+\unexpanded\def\doifnotallmodes {\unprotect\dodoifnotallmodes}
+\unexpanded\def\startallmodes {\unprotect\dostartallmodes}
+\unexpanded\def\startnotallmodes{\unprotect\dostartnotallmodes}
+
+\def\dodoifallmodeselse
+ {\docheckforallmodes\firstoftwoarguments\secondoftwoarguments}
+
+\def\dodoifallmodes
+ {\docheckforallmodes\firstofoneargument\gobbleoneargument}
+
+\def\dodoifnotallmodes
+ {\docheckforallmodes\gobbleoneargument\firstofoneargument}
+
+\long\def\dostartallmodes[#1]%
+ {\docheckforallmodes\donothing\dostopallmodes{#1}}
+
+\long\def\dostartnotallmodes[#1]%
+ {\docheckforallmodes\dostopnotallmodes\donothing{#1}}
+
+\unexpanded\def\stopallmodes {} % no relax
+\unexpanded\def\stopnotallmodes{} % no relax
+
+\long\def\dostopallmodes #1\stopallmodes {}
+\long\def\dostopnotallmodes#1\stopnotallmodes{}
+
+%D Lets now set a mode:
+
+\enablemode[mkiv] \setsystemmode{mkiv}
+
+%D Setups:
+
+\unexpanded\def\startsetups{} % to please dep checker
+\unexpanded\def\stopsetups {} % to please dep checker
+
+\expanded
+ {\long\def\@EA\noexpand\csname\e!start\v!setups\endcsname
+ {\begingroup\noexpand\doifnextoptionalelse
+ {\noexpand\dostartsetupsA\@EA\noexpand\csname\e!stop\v!setups\endcsname}
+ {\noexpand\dostartsetupsB\@EA\noexpand\csname\e!stop\v!setups\endcsname}}}
+
+\letvalue{\e!stop\v!setups}\relax
+
+\unexpanded\def\setups{\doifnextbgroupelse\dosetupsA\dosetupsB} % {..} or [..]
+\unexpanded\def\setup {\doifnextbgroupelse\dosetups \dosetupsC} % {..} or [..]
+
+\def\dosetupsA #1{\processcommacommand[#1]\dosetups} % {..}
+\def\dosetupsB[#1]{\processcommacommand[#1]\dosetups} % [..]
+\def\dosetupsC[#1]{\dosetups{#1}} % [..]
+
+\letvalue{\??su:\letterpercent}\gobbleoneargument
+
+\def\dosetups#1% the grid option will be extended to other main modes
+ {\csname\??su
+ \ifgridsnapping
+ \ifcsname\??su\v!grid:#1\endcsname\v!grid:#1\else\ifcsname\??su:#1\endcsname:#1\else:\letterpercent\fi\fi
+ \else
+ \ifcsname\??su:#1\endcsname:#1\else:\letterpercent\fi
+ \fi
+ \endcsname\empty} % takes one argument
+
+% the next one is meant for \c!setups situations, hence the check for
+% a shortcut
+
+\def\doprocesslocalsetups#1%
+ {\edef\tobeprocessedsetups{#1}%
+ \ifx\tobeprocessedsetups\empty\else
+ \dodoprocesslocalsetups
+ \fi}
+
+\def\dodoprocesslocalsetups
+ {\@EA\processcommalist\@EA[\tobeprocessedsetups]\dosetups}
+
+\edef\setupwithargument#1% saves a few expansions
+ {\noexpand\csname\??su:\noexpand\ifcsname\??su:#1\endcsname#1\noexpand\else\letterpercent\noexpand\fi\endcsname}
+
+\let\directsetup\dosetups
+
+\def\doifsetupselse#1% to be done: grid
+ {\doifdefinedelse{\??su:#1}}
+
+\chardef\setupseolmode\plusone
+
+\unexpanded\def\startsetups {\xxstartsetups\plusone \stopsetups } \let\stopsetups \relax
+\unexpanded\def\startlocalsetups{\xxstartsetups\plusone \stoplocalsetups} \let\stoplocalsetups\relax
+\unexpanded\def\startrawsetups {\xxstartsetups\zerocount\stoprawsetups } \let\stoprawsetups \relax
+\unexpanded\def\startxmlsetups {\xxstartsetups\plustwo \stopxmlsetups } \let\stopxmlsetups \relax
+
+\def\xxstartsetups#1#2%
+ {\begingroup\let\setupseolmode#1\doifnextoptionalelse{\dostartsetupsA#2}{\dostartsetupsB#2}}
+
+\def\dostartsetupsA#1% [ ] delimited
+ {\ifcase\setupseolmode\or\catcode`\^^M\@@ignore\or\catcode`\^^M\@@ignore\catcode`\|\@@other\fi
+ \dotripleempty\dostartsetups[#1]}
+
+\def\dostartsetupsB#1#2 % space delimited
+ {\ifcase\setupseolmode\or\catcode`\^^M\@@ignore\or\catcode`\^^M\@@ignore\catcode`\|\@@other\fi
+ \dodostartsetups#1\empty{#2}}
+
+\def\dostartsetupsC[#1][#2][#3]{\dodostartsetups#1{#2}{#3}} % [..] [..]
+\def\dostartsetupsD[#1][#2][#3]{\dodostartsetups#1\empty{#2}} % [..]
+
+\def\dostartsetups
+ {\ifthirdargument\@EA\dostartsetupsC\else\@EA\dostartsetupsD\fi}
+
+\long\def\dodostartsetups#1#2#3%
+ {\long\def\dododostartsetups##1#1%
+ {\endgroup
+ \dodoglobal % bah
+ \long\expandafter\def\csname\??su#2:#3\expandafter\endcsname\expandafter####\expandafter1\expandafter{##1}}%
+ \dododostartsetups\empty} % the empty trick prevents the { } in {arg} from being eaten up
+
+\def\systemsetupsprefix{*}
+
+\def\systemsetups#1{\dosetups{\systemsetupsprefix#1}}
+
+\def\resetsetups[#1]% see x-fo for usage
+ {\ifcsname\??su\ifgridsnapping\v!grid\fi:#1\endcsname
+ \dodoglobal\letbeundefined{\??su\ifgridsnapping\v!grid\fi:#1}%
+ \else
+ \dodoglobal\letbeundefined{\??su:#1}%
+ \fi}
+
+%D \macros
+%D {setvariables,getvariable,getvariabledefault}
+%D
+%D \starttyping
+%D \setvariables[xx][title=]
+%D \setvariables[xx][title=test test]
+%D \setvariables[xx][title=test $x=1$ test] % fatal error reported
+%D \setvariables[xx][title=test {$x=1$} test]
+%D \setvariables[xx][title] % fatal error reported
+%D \setvariables[xx][titletitel=e]
+%D \stoptyping
+
+\def\??vars{@@vars}
+
+\def\setvariables {\dotripleargument\dosetvariables[\getrawparameters ]}
+\def\setevariables{\dotripleargument\dosetvariables[\getraweparameters]}
+\def\setgvariables{\dotripleargument\dosetvariables[\getrawgparameters]}
+\def\setxvariables{\dotripleargument\dosetvariables[\getrawxparameters]}
+
+\def\globalsetvariables % obsolete
+ {\dotripleargument\dosetvariables[\globalgetrawparameters]}
+
+\long\def\dosetvariables[#1][#2][#3]% tricky, test on s-pre-60
+ {\errorisfataltrue
+ \doifelse{#2}\currentvariableclass
+ {#1[\??vars:#2:][#3]}%
+ {\pushmacro\currentvariableclass
+ \def\currentvariableclass{#2}%
+ \getvariable{#2}\s!reset
+ #1[\??vars:#2:][#3]%
+ \getvariable{#2}\s!set
+ \popmacro\currentvariableclass}%
+ \errorisfatalfalse}
+
+\long\def\setvariable #1#2#3{\long\expandafter\def \csname\??vars:#1:#2\endcsname{#3}}
+\long\def\setevariable#1#2#3{\long\expandafter\edef\csname\??vars:#1:#2\endcsname{#3}}
+\long\def\setgvariable#1#2#3{\long\expandafter\gdef\csname\??vars:#1:#2\endcsname{#3}}
+\long\def\setxvariable#1#2#3{\long\expandafter\xdef\csname\??vars:#1:#2\endcsname{#3}}
+
+\def\getvariable#1#2%
+ {\csname
+ \ifcsname\??vars:#1:#2\endcsname\??vars:#1:#2\else\s!empty\fi
+ \endcsname}
+
+\def\showvariable#1#2%
+ {\showvalue{\ifcsname\??vars:#1:#2\endcsname\??vars:#1:#2\else\s!empty\fi}}
+
+\let\currentvariableclass\empty
+
+%D \macros
+%D {checkvariables}
+%D
+%D I'll probably forget that this on exists.
+
+\def\checkvariables
+ {\dodoubleargument\docheckvariables}
+
+\def\docheckvariables
+ {\dogetparameters\docheckrawvalue}
+
+\long\def\docheckrawvalue#1#2#3%
+ {\ifcsname\??vars:#1:#2\endcsname
+ \edef\checkedrawvalue{\csname\??vars:#1:#2\endcsname}%
+ \ifx\checkedrawvalue\empty
+ \long\expandafter\def\csname\??vars:#1:#2\endcsname{#3}%
+ \fi
+ \else
+ \long\expandafter\def\csname\??vars:#1:#2\endcsname{#3}%
+ \fi}
+
+%D \macros
+%D {doifelsevariable,doifvariable,doifnotvariable}
+%D
+%D A few trivial macros:
+
+\def\doifelsevariable#1#2%
+ {\ifcsname\??vars:#1:#2\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifvariable#1#2%
+ {\ifcsname\??vars:#1:#2\endcsname
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotvariable#1#2%
+ {\ifcsname\??vars:#1:#2\endcsname
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\getvariabledefault#1#2% #3% can be command, so no ifcsname here
+ {\executeifdefined{\??vars:#1:#2}}% {#3}
+
+% \unexpanded\def\setupenv{\dodoubleargument\rawgetparameters[\??en]}
+%
+% \def\doifenvelse#1{\doifdefinedelse{\??en#1}} % speed up
+% \def\doifenv #1{\doifdefined {\??en#1}} % speed up
+% \def\doifnotenv #1{\doifundefined {\??en#1}} % speed up
+%
+% \def\env#1{\csname\??en#1\endcsname}
+%
+% \def\envvar#1#2%
+% {\ifcsname\??en#1\endcsname
+% \csname\??en#1\endcsname\else#2%
+% \fi}
+%
+% low level change, now also accessible as \getvariable
+% {environment}{...}; the next macros will become obsolete
+% some day in favor of normal variables in the environment
+% namespace
+
+\def\s!environment{environment}
+
+\unexpanded\def\setupenv {\dotripleargument\dosetvariables[\getrawparameters][\s!environment]}
+\def\doifenvelse{\doifelsevariable \s!environment}
+\def\doifenv {\doifvariable \s!environment}
+\def\doifnotenv {\doifnotvariable \s!environment}
+\def\env {\getvariable \s!environment}
+\def\envvar {\getvariabledefault\s!environment}
+
+\protect \endinput
diff --git a/tex/context/base/core-fil.mkii b/tex/context/base/core-fil.mkii
new file mode 100644
index 000000000..fca253a7b
--- /dev/null
+++ b/tex/context/base/core-fil.mkii
@@ -0,0 +1,347 @@
+%D \module
+%D [ file=core-fil,
+%D version=1997.11.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=File Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / File Support}
+
+\unprotect
+
+%D Files registered as temporary files will be deleted after a
+%D run by texexec:
+
+% \starttext
+% \immediate\openout\scratchwrite=oeps.tmp
+% \immediate\write\scratchwrite{oeps}
+% \immediate\closeout\scratchwrite
+% \registertempfile{oeps.tmp}
+% \typefile{oeps.tmp}
+% \stoptext
+
+\let\usedtempfile\gobbleoneargument
+
+\def\registertempfile#1{\immediatewriteutility{f t {#1}}}
+
+%D \macros
+%D {definefilesynonym}
+%D
+%D One of the problems with loading files is that their names
+%D can depend on the interface language. We therefore need a
+%D method to define filesynonyms. The actual synonyms are
+%D defined elsewhere, but look like:
+%D
+%D \starttyping
+%D \definefilesynonym [chemic] [chemie]
+%D \definefilesynonym [einheit] [unit]
+%D \definefilesynonym [unit] [unit]
+%D \stoptyping
+%D
+%D So we can say in english:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemic,unit]
+%D \stoptyping
+%D
+%D and in dutch:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemie,unit]
+%D \stoptyping
+
+% will be redone in mkiv
+
+\def\definefilesynonym
+ {\dodoubleempty\dodefinefilesynonym}
+
+\def\dodefinefilesynonym[#1][#2]%
+ {\ifundefined{\??fs#1}\else
+ \doifnotvalue{\??fs#1}{#2}{\showmessage\m!files1{#1 (#2),\getvalue{\??fs#1}}}%
+ \fi
+ \doifelse{#1}{#2}{\letbeundefined{\??fs#1}{#2}}{\setevalue{\??fs#1}{#2}}}
+
+%D \macros
+%D {definefilefallback}
+
+\def\definefilefallback
+ {\dodoubleargument\dodefinefilefallback}
+
+\def\dodefinefilefallback[#1][#2]%
+ {\doifnotfile{#1}
+ {\def\docommand##1{\doiffile{##1}{\definefilesynonym[#1][##1]\quitcommalist}}%
+ \processcommalist[#2]\docommand}}
+
+%D \macros
+%D {truefilename}
+%D
+%D At the system level such a filename can be called upon by
+%D saying:
+%D
+%D \starttyping
+%D \truefilename{filename/filesynonym}
+%D \stoptyping
+%D
+%D The implementation shows that nesting is supported.
+
+\def\truefilename#1%
+ {\ifundefined{\??fs#1}#1\else\truefilename{\csname\??fs#1\endcsname}\fi}
+
+%D \macros
+%D {makeshortfilename}
+%D
+%D To prevent cross platform problems with filenames, we
+%D lowercase them as well as only use the first 8~characters.
+%D
+%D \starttyping
+%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
+%D {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
+%D \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+%D
+%D \def\makeshortfilename[#1]%
+%D {\edef\fullfilename{#1.........}%
+%D \expanded{\domakeshortfilename[\fullfilename]}}
+%D \stoptyping
+%D
+%D In 2005 there is no need for the 8~character limit any more, so:
+
+\def\makeshortfilename[#1]% no need for further cleanup and shortening
+ {\lowercase{\edef\shortfilename{#1.}}%
+ \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+
+%D \macros
+%D {usemodule}
+%D
+%D Most of \CONTEXT is preloaded in the format file. Some very
+%D domain specific typesetting topics are however dealt with in
+%D separate modules, e.g. typesetting of chemical structure
+%D formulas. These modules are loaded by:
+%D
+%D \showsetup{usemodule}
+%D
+%D More information on the specific modules can be found in
+%D their dedicated manuals. We use \type {\next} so that we
+%D can \type {\end} in modules.
+
+\newconditional\moduleisloaded
+
+\def\dododousemodules#1#2% no \unprotect/\protect when loading,
+ {\relax % since we need to use ? ! unprotected
+ \ifconditional\moduleisloaded % sometimes (see xtag-map)
+ \let\next\relax % or: \expandafter\gobbleoneargument
+ \else
+ \makeshortfilename[#1\truefilename{#2}]% beware: *- is not part of syn
+ \doifelseflagged\shortfilename
+ {\showmessage\m!systems7{#2 (line \number\inputlineno)}%
+ \settrue\moduleisloaded
+ \let\next\relax}
+ {\doglobal\setflag\shortfilename
+ \def\next
+ {\startreadingfile
+ \readsysfile\shortfilename
+ {\showmessage\m!systems5{#2}\settrue\moduleisloaded}
+ {\readsysfile{\shortfilename.\mksuffix} % new
+ {\showmessage\m!systems5{#2 (\mksuffix)}\settrue\moduleisloaded}
+ \donothing}%
+ \stopreadingfile}}%
+ \fi
+ \next}
+
+\def\dodousemodules#1#2%
+ {\setfalse\moduleisloaded
+ \doifelsenothing{#1}
+ {\dododousemodules\f!moduleprefix {#2}%
+ \dododousemodules\f!privateprefix{#2}%
+ \dododousemodules\f!styleprefix {#2}%
+ \dododousemodules\f!xstyleprefix {#2}%
+ \dododousemodules\f!thirdprefix {#2}%
+ \dododousemodules\empty {#2}}% new, fall back on raw name
+ {\dododousemodules{#1-}{#2}}%
+ \ifconditional\moduleisloaded\else
+ \showmessage\m!systems6{#2}%
+ \appendtoks\showmessage\m!systems6{#2}\to\everynotabene
+ \fi}
+
+% \def\usemodules
+% {\dodoubleempty\dousemodules}
+%
+% \def\dousemodules[#1][#2]%
+% {\ifsecondargument
+% \doifelsenothing{#2}
+% {\let\next\relax}
+% {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
+% \else
+% \def\next{\usemodules[][#1]}%
+% \fi
+% \next}
+%
+% \let\usemodule\usemodules
+
+\def\usemodules
+ {\dotripleempty\dousemodules}
+
+\def\dousemodules[#1][#2][#3]%
+ {\pushmacro\currentmodule
+ \pushmacro\currentmoduleparameters
+ \let\currentmoduleparameters\empty
+ \ifthirdargument
+ \doifelsenothing{#2}
+ {\let\next\relax}
+ {\def\currentmoduleparameters{#3}%
+ \def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
+ \else\ifsecondargument
+ \doifelsenothing{#2}
+ {\let\next\relax}
+ {\doifassignmentelse{#2}
+ {\def\currentmoduleparameters{#2}%
+ \def\next{\processcommalist[#1]{\dodousemodules{}}}}
+ {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}}%
+ \else
+ \def\next{\processcommalist[#1]{\dodousemodules{}}}%
+ \fi\fi
+ \next
+ \popmacro\currentmoduleparameters
+ \popmacro\currentmodule}
+
+\let\currentmoduleparameters\empty
+\let\currentmodule \s!unknown
+
+\def\startmodule
+ {\doifnextoptionalelse\dostartmodule\nostartmodule}
+
+\def\nostartmodule #1 %
+ {\dostartmodule[#1]}
+
+\def\dostartmodule[#1]%
+ {\pushmacro\currentmodule
+ \pushmacro\currentmoduleparameters
+ \def\currentmodule{#1}}
+
+\def\stopmodule
+ {\popmacro\currentmoduleparameters
+ \popmacro\currentmodule}
+
+\def\setupmodule
+ {\dodoubleempty\dosetupmodule}
+
+\def\dosetupmodule[#1][#2]%
+ {\scratchtoks\expandafter{\currentmoduleparameters}%
+ \ifsecondargument
+ \getparameters[\??md:#1:][#2]%
+ \expanded{\getparameters[\??md:#1:][\the\scratchtoks]}%
+ \else
+ \getparameters[\??md:\currentmodule:][#1]%
+ \expanded{\getparameters[\??md:\currentmodule:][\the\scratchtoks]}%
+ \fi
+ \let\currentmoduleparameters\empty}
+
+\def\moduleparameter #1#2{\executeifdefined{\??md:#1:#2}\s!empty}
+\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}\s!empty}
+
+% \usemodule[newmml]
+% \usemodule[newmml][a=b]
+% \usemodule[x][newmml]
+% \usemodule[x][newmml][a=b]
+%
+% \startmodule [mathml]
+% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars will be set afterwards
+% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars are now forgotten
+% \stopmodule
+
+% one can introduce test sections with:
+%
+% \enablemode[newmml:test:\currentmoduleparameter{test}]
+% \startmode[newmml:test:yes} ... \stopmode
+%
+% these will be ignored unless test=yes
+%
+% however, a better way is:
+
+\let\stopmoduletestsection\donothing
+
+\def\startmoduletestsection
+ {\bgroup
+ \setupmodule % we need to make sure that the vars are set
+ \doifelse{\currentmoduleparameter\v!test}\v!yes
+ {\egroup
+ \writestatus{\currentmodule}{loading experimental code}}
+ {\egroup
+ \writestatus{\currentmodule}{skipping experimental code}%
+ \gobbleuntil\stopmoduletestsection}}
+
+%D We also support a singular call, which saves us for
+%D frustrations when we do a typo.
+
+\let\usemodule=\usemodules
+
+% %D The definition shows that the language specific settings
+% %D are activated after loading all the modules specified.
+
+%D \macros
+%D {ifprotectbuffers, bufferprefix,
+%D TEXbufferfile, MPgraphicfile}
+%D
+%D The next switch enables protection of temporary filenames,
+%D which is needed when we process more files on one path at
+%D the same time.
+
+\newif\ifprotectbuffers
+
+\def\bufferprefix{\ifprotectbuffers\jobname-\fi}
+
+% The following filenames are defined here:
+
+\def\TEXbufferfile #1{\bufferprefix#1.\f!temporaryextension}
+\def\MPgraphicfile {\bufferprefix mp\ifMPrun run\else graph\fi} % not needed in luatex
+\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}
+
+%D To save memory, we implement some seldomly used commands
+%D in a lazy way. Nota bene: such runtime definitions are
+%D global.
+%D
+%D \starttyping
+%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
+%D \stoptyping
+
+\def\fetchruntimecommand#1#2%
+ {\def#1{\dofetchruntimecommand#1{#2}}}
+
+\def\dofetchruntimecommand#1#2%
+ {\doifnotflagged{#2}
+ {\let#1\undefined
+ \startreadingfile
+ \startnointerference % \bgroup
+ \cleanupfeatures % better \setnormalcatcodes / test first
+ \readfile{#2}\donothing\donothing
+ \stopnointerference % \egroup
+ \stopreadingfile
+ \doglobal\setflag{#2}}%
+ \ifx#1\undefined
+ \writestatus\m!systems{command \string#1 not found in file #2}%
+ \def#1{{\infofont[unknown command \string#1]}}%
+ \fi
+ #1}
+
+%D Experimental:
+
+\let\checkpreprocessor\relax
+
+%D To be documented and probably moved
+
+\def\documentresources{\@@erurl}
+
+\def\setupexternalresources
+ {\dodoubleargument\getparameters[\??er]}
+
+\setupexternalresources
+ [url=]
+
+%D This module will be perfected / changed / weeded.
+
+\protect \endinput
diff --git a/tex/context/base/core-fil.mkiv b/tex/context/base/core-fil.mkiv
new file mode 100644
index 000000000..daef176d2
--- /dev/null
+++ b/tex/context/base/core-fil.mkiv
@@ -0,0 +1,284 @@
+%D \module
+%D [ file=core-fil,
+%D version=1997.11.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=File Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / File Support}
+
+\unprotect
+
+%D \macros
+%D {definefilesynonym}
+%D
+%D One of the problems with loading files is that their names
+%D can depend on the interface language. We therefore need a
+%D method to define filesynonyms. The actual synonyms are
+%D defined elsewhere, but look like:
+%D
+%D \starttyping
+%D \definefilesynonym [chemic] [chemie]
+%D \definefilesynonym [einheit] [unit]
+%D \definefilesynonym [unit] [unit]
+%D \stoptyping
+%D
+%D So we can say in english:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemic,unit]
+%D \stoptyping
+%D
+%D and in dutch:
+%D
+%D \starttyping
+%D \usemodules[pictex,chemie,unit]
+%D \stoptyping
+
+% will be redone in mkiv
+
+\unexpanded\def\definefilesynonym
+ {\dodoubleempty\dodefinefilesynonym}
+
+\def\dodefinefilesynonym[#1][#2]%
+ {\ifcsname\??fs#1\endcsname
+ \doifnotvalue{\??fs#1}{#2}{\showmessage\m!files1{#1 (#2),\getvalue{\??fs#1}}}%
+ \fi
+ \doifelse{#1}{#2}{\letbeundefined{\??fs#1}{#2}}{\setevalue{\??fs#1}{#2}}}
+
+%D \macros
+%D {definefilefallback}
+
+\unexpanded\def\definefilefallback
+ {\dodoubleargument\dodefinefilefallback}
+
+\def\dodefinefilefallback[#1][#2]%
+ {\doifnotfile{#1}
+ {\def\docommand##1{\doiffile{##1}{\definefilesynonym[#1][##1]\quitcommalist}}%
+ \processcommalist[#2]\docommand}}
+
+%D \macros
+%D {truefilename}
+%D
+%D At the system level such a filename can be called upon by
+%D saying:
+%D
+%D \starttyping
+%D \truefilename{filename/filesynonym}
+%D \stoptyping
+%D
+%D The implementation shows that nesting is supported.
+
+\def\truefilename#1%
+ {\ifcsname\??fs#1\endcsname\expandafter\truefilename\csname\??fs#1\endcsname\else#1\fi}
+
+%D \macros
+%D {makeshortfilename}
+%D
+%D To prevent cross platform problems with filenames, we
+%D lowercase them as well as only use the first 8~characters.
+%D
+%D \starttyping
+%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
+%D {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
+%D \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+%D
+%D \def\makeshortfilename[#1]%
+%D {\edef\fullfilename{#1.........}%
+%D \expanded{\domakeshortfilename[\fullfilename]}}
+%D \stoptyping
+%D
+%D In 2005 there is no need for the 8~character limit any more, so:
+
+\def\makeshortfilename[#1]% no need for further cleanup and shortening
+ {\lowercase{\edef\shortfilename{#1.}}%
+ \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+
+%D \macros
+%D {usemodule}
+%D
+%D Most of \CONTEXT is preloaded in the format file. Some very
+%D domain specific typesetting topics are however dealt with in
+%D separate modules, e.g. typesetting of chemical structure
+%D formulas. These modules are loaded by:
+%D
+%D \showsetup{usemodule}
+%D
+%D More information on the specific modules can be found in
+%D their dedicated manuals. We use \type {\next} so that we
+%D can \type {\end} in modules.
+
+\def\dodousemodules#1#2%
+ {\ctxlua{support.usemodules("#1","#2","\truefilename{#2}")}}
+
+\def\usemodules
+ {\dotripleempty\dousemodules}
+
+\def\dousemodules[#1][#2][#3]%
+ {\pushmacro\currentmodule
+ \pushmacro\currentmoduleparameters
+ \let\currentmoduleparameters\empty
+ \ifthirdargument
+ \doifelsenothing{#2}
+ {\let\next\relax}
+ {\def\currentmoduleparameters{#3}%
+ \def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
+ \else\ifsecondargument
+ \doifelsenothing{#2}
+ {\let\next\relax}
+ {\doifassignmentelse{#2}
+ {\def\currentmoduleparameters{#2}%
+ \def\next{\processcommalist[#1]{\dodousemodules{}}}}
+ {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}}%
+ \else
+ \def\next{\processcommalist[#1]{\dodousemodules{}}}%
+ \fi\fi
+ \next
+ \popmacro\currentmoduleparameters
+ \popmacro\currentmodule}
+
+\let\currentmoduleparameters\empty
+\let\currentmodule \s!unknown
+
+\unexpanded\def\startmodule
+ {\doifnextoptionalelse\dostartmodule\nostartmodule}
+
+\def\nostartmodule #1 %
+ {\dostartmodule[#1]}
+
+\def\dostartmodule[#1]%
+ {\pushmacro\currentmodule
+ \pushmacro\currentmoduleparameters
+ \def\currentmodule{#1}}
+
+\unexpanded\def\stopmodule
+ {\popmacro\currentmoduleparameters
+ \popmacro\currentmodule}
+
+\unexpanded\def\setupmodule
+ {\dodoubleempty\dosetupmodule}
+
+\def\dosetupmodule[#1][#2]%
+ {\scratchtoks\expandafter{\currentmoduleparameters}%
+ \ifsecondargument
+ \getparameters[\??md:#1:][#2]%
+ \expanded{\getparameters[\??md:#1:][\the\scratchtoks]}%
+ \else
+ \getparameters[\??md:\currentmodule:][#1]%
+ \expanded{\getparameters[\??md:\currentmodule:][\the\scratchtoks]}%
+ \fi
+ \let\currentmoduleparameters\empty}
+
+\def\moduleparameter #1#2{\executeifdefined{\??md:#1:#2}\s!empty}
+\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}\s!empty}
+
+\def\useluamodule [#1]{\ctxlua{dofile(resolvers.findctxfile("#1"))}}
+\def\luaenvironment #1 {\ctxlua{dofile(resolvers.findctxfile("#1"))}}
+
+% \usemodule[newmml]
+% \usemodule[newmml][a=b]
+% \usemodule[x][newmml]
+% \usemodule[x][newmml][a=b]
+%
+% \startmodule [mathml]
+% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars will be set afterwards
+% \setupmodule[a=c] \relax [\currentmoduleparameter{a}] % user vars are now forgotten
+% \stopmodule
+
+% one can introduce test sections with:
+%
+% \enablemode[newmml:test:\currentmoduleparameter{test}]
+% \startmode[newmml:test:yes} ... \stopmode
+%
+% these will be ignored unless test=yes
+%
+% however, a better way is:
+
+\let\stopmoduletestsection\donothing
+
+\unexpanded\def\startmoduletestsection
+ {\bgroup
+ \setupmodule % we need to make sure that the vars are set
+ \doifelse{\currentmoduleparameter\v!test}\v!yes
+ {\egroup
+ \writestatus{\currentmodule}{loading experimental code}}
+ {\egroup
+ \writestatus{\currentmodule}{skipping experimental code}%
+ \gobbleuntil\stopmoduletestsection}}
+
+%D We also support a singular call, which saves us for
+%D frustrations when we do a typo.
+
+\let\usemodule=\usemodules
+
+% %D The definition shows that the language specific settings
+% %D are activated after loading all the modules specified.
+
+%D \macros
+%D {ifprotectbuffers, bufferprefix,
+%D TEXbufferfile, MPgraphicfile}
+%D
+%D The next switch enables protection of temporary filenames,
+%D which is needed when we process more files on one path at
+%D the same time.
+
+\newif\ifprotectbuffers
+
+\def\bufferprefix{\ifprotectbuffers\jobname-\fi}
+
+% The following filenames are defined here:
+
+\def\TEXbufferfile #1{\bufferprefix#1.\f!temporaryextension}
+\def\MPgraphicfile {\bufferprefix mp\ifMPrun run\else graph\fi} % not needed in luatex
+\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}
+
+%D To save memory, we implement some seldomly used commands
+%D in a lazy way. Nota bene: such runtime definitions are
+%D global.
+%D
+%D \starttyping
+%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
+%D \stoptyping
+
+\def\fetchruntimecommand#1#2%
+ {\def#1{\dofetchruntimecommand#1{#2}}}
+
+\def\dofetchruntimecommand#1#2%
+ {\doifnotflagged{#2}
+ {\let#1\undefined
+ \startreadingfile
+ \startnointerference % \bgroup
+ \cleanupfeatures % better \setnormalcatcodes / test first
+ \readfile{#2}\donothing\donothing
+ \stopnointerference % \egroup
+ \stopreadingfile
+ \doglobal\setflag{#2}}%
+ \ifx#1\undefined
+ \writestatus\m!systems{command \string#1 not found in file #2}%
+ \def#1{{\infofont[unknown command \string#1]}}%
+ \fi
+ #1}
+
+%D Experimental:
+
+\let\checkpreprocessor\relax
+
+%D To be documented and probably moved
+
+\def\documentresources{\@@erurl}
+
+\unexpanded\def\setupexternalresources
+ {\dodoubleargument\getparameters[\??er]}
+
+\setupexternalresources
+ [url=]
+
+%D This module will be perfected / changed / weeded.
+
+\protect \endinput
diff --git a/tex/context/base/core-fnt.mkii b/tex/context/base/core-fnt.mkii
new file mode 100644
index 000000000..9bc2a66f5
--- /dev/null
+++ b/tex/context/base/core-fnt.mkii
@@ -0,0 +1,726 @@
+%D \module
+%D [ file=core-fnt,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Fonts}
+
+\unprotect
+
+%D \macros
+%D {compound}
+%D
+%D We will overload the already active \type {|} so we have
+%D to save its meaning in order to be able to use this handy
+%D macro.
+%D
+%D \starttyping
+%D so test\compound{}test can be used instead of test||test
+%D \stoptyping
+
+\bgroup \catcode`\|=\@@active \gdef\compound#1{|#1|} \egroup
+
+%D Here we hook some code into the clean up mechanism needed
+%D for verbatim data.
+
+\appendtoks
+ \disablecompoundcharacters
+ \disablediscretionaries
+\to \everycleanupfeatures
+
+%D \macros
+%D {kap,KAP,Kap,Kaps,nokap,userealcaps,usepseudocaps}
+%D
+%D We already introduced \type{\cap} as way to capitalize
+%D words. This command comes in several versions:
+%D
+%D \startbuffer
+%D \cap {let's put on a \cap{cap}}
+%D \cap {let's put on a \nocap{cap}}
+%D \CAP {let's put on a \\{cap}}
+%D \Cap {let's put on a \\{cap}}
+%D \Caps{let's put on a cap}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Note the use of \type{\nocap}, \type{\\} and the nested
+%D \type{\cap}.
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D These macros show te main reason why we introduced the
+%D smaller \type{\tx} and \type{\txx}.
+%D
+%D \starttyping
+%D \cap\romannumerals{1995}
+%D \stoptyping
+%D
+%D This at first sight unusual capitilization is completely
+%D legal.
+%D
+%D \showsetup{smallcapped}
+%D \showsetup{notsmallcapped}
+%D \showsetup{CAPPED}
+%D \showsetup{SmallCapped}
+%D \showsetup{SmallCaps}
+%D
+%D The difference between pseudo and real caps is demonstrated
+%D below:
+%D
+%D \startbuffer
+%D \usepseudocaps \cap{Hans Hagen}
+%D \userealcaps \cap{Hans Hagen}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D The \type {\bgroup} trickery below is needed because of
+%D \type {\groupedcommand}.
+
+\def\usepseudocaps
+ {\def\cap@@uppercase{\the\everyuppercase\uppercased}%
+ \def\cap@@lowercase{\the\everylowercase\lowercased}%
+ \def\cap@@visualize{\tx}}
+
+\def\userealcaps
+ {\let\cap@@uppercase\relax
+ %\let\cap@@lowercase\relax % Definitely not!
+ \def\cap@@visualize{\sc}}
+
+\usepseudocaps
+
+\unexpanded\def\smallcapped % else conflict with math
+ {\futurelet\next\dosmallcapped}
+
+\def\disablepseudocaps
+ {\let\smallcapped\donothing}
+
+\def\dosmallcapped
+ {\ifx\next\bgroup
+ \expandafter\dodosmallcapped\expandafter\relax
+ \else
+ \expandafter\dodosmallcapped
+ \fi}
+
+\def\dodosmallcapped#1#2%
+ {\ifmmode\hbox\fi
+ \bgroup
+ \cap@@visualize
+ \cap@@uppercase{#1{#2}}%
+ \egroup}
+
+\unexpanded\def\notsmallcapped#1%
+ {\cap@@lowercase{#1}}
+
+\unexpanded\def\CAPPED#1%
+ {{\def\\##1{\smallcapped{##1}}#1}}
+
+\unexpanded\def\SmallCapped#1%
+ {\CAPPED{\\#1}}
+
+\unexpanded\def\SmallCaps
+ {\let\processword\SmallCapped
+ \processwords}
+
+%D Sure:
+
+\def\kap{\smallcapped} % for old times sake
+
+%D Some precautions for a \PLAIN\ \TEX\ definition.
+
+\unexpanded\def\normalcap{\dohandlemathtoken{cap}}
+\unexpanded\def\normalCap{\dohandlemathtoken{Cap}}
+
+\def\cap{\mathortext\normalcap\smallcapped}
+\def\Cap{\mathortext\normalCap\SmallCapped}
+
+\appendtoks
+ \let\cap\firstofoneargument
+ \let\Cap\firstofoneargument
+\to \simplifiedcommands
+
+%D \macros
+%D {setupcapitals}
+%D
+%D By default we use pseudo small caps in titles. This can be
+%D set up with:
+%D
+%D \showsetup{setupcapitals}
+
+\let\normalsmallcapped\smallcapped
+
+\def\setupcapitals
+ {\dosingleempty\dosetupcapitals}
+
+\def\dosetupcapitals[#1]%
+ {\getparameters[\??kk][#1]%
+ \doifelse\@@kktitle\v!yes
+ {\definealternativestyle[\v!capital][\normalsmallcapped][\normalsmallcapped]%
+ \definealternativestyle[\v!smallcaps][\sc][\sc]%
+ \unexpanded\def\smallcapped{\normalsmallcapped}}
+ {\definealternativestyle[\v!capital][\normalsmallcapped][\uppercased]%
+ \definealternativestyle[\v!smallcaps][\sc][\uppercased]%
+ \unexpanded\def\smallcapped{\doconvertfont\v!capital}}%
+ \doifelse\@@kksc\v!yes
+ \userealcaps
+ \usepseudocaps}
+
+\ifx\uppercased\undefined \let\uppercased\uppercase \fi
+\ifx\lowercased\undefined \let\lowercased\lowercase \fi
+
+% pretty tricky stuff:
+%
+% \usemodule[abr-01] \TEX \METAPOST \PPCHTEX \LATEX
+% \usemodule[abr-02] \TEX \METAPOST \PPCHTEX \LATEX
+
+%def\uppercased#1{{\forceunexpanded\xdef\@@globalcrap{\uppercase{#1}}}\@@globalcrap}
+%def\lowercased#1{{\forceunexpanded\xdef\@@globalcrap{\lowercase{#1}}}\@@globalcrap}
+
+\def\uppercased#1{{\forceunexpanded\xdef\@@expanded{\uppercase{#1}}}\@@expanded}
+\def\lowercased#1{{\forceunexpanded\xdef\@@expanded{\lowercase{#1}}}\@@expanded}
+
+\setupcapitals
+ [\c!title=\v!yes,
+ \c!sc=\v!no]
+
+%D \macros
+%D {Word, Words, WORD, WORDS, doprocesswords}
+%D
+%D This is probably not the right place to present the next set
+%D of macros.
+%D
+%D \starttyping
+%D \Word {far too many words}
+%D \Words{far too many words}
+%D \WORD {far too many words}
+%D \WORDS{far too many words}
+%D \stoptyping
+%D
+%D \typebuffer
+%D
+%D This calls result in:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D \showsetup{Word}
+%D \showsetup{Words}
+%D \showsetup{WORD}
+%D \showsetup{WORDS}
+
+\def\doWord#1%
+ {\bgroup
+ \the\everyuppercase
+ \uppercase{#1}%
+ \egroup}
+
+\unexpanded\def\Word#1%
+ {\doWord#1}
+
+\def\doprocesswords#1 #2\od
+ {\ConvertToConstant\doifnot{#1}{}
+ {\processword{#1} %
+ \doprocesswords#2 \od}}
+
+\def\processwords#1%
+ {\doprocesswords#1 \od\unskip}
+
+\let\processword\relax
+
+\unexpanded\def\Words
+ {\let\processword\Word
+ \processwords}
+
+\unexpanded\def\WORD#1%
+ {\bgroup
+ \let\smallcapped\firstofoneargument
+ \let\WORD\firstofoneargument
+ \douppercase{#1}%
+ \egroup}
+
+\unexpanded\def\WORDS#1%
+ {\WORD{#1}}
+
+%D \macros
+%D {stretched}
+%D
+%D Stretching characters in a word is a sort of typographical
+%D murder. Nevertheless we support this manipulation for use in
+%D for instance titles.
+%D
+%D \starttyping
+%D \hbox to 5cm{\stretched{murder}}
+%D \stoptyping
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D \showsetup{stretched}
+
+\def\stretched#1%
+ {\ifvmode\hbox to \hsize\else\ifinner\else\hbox\fi\fi
+ \bgroup\processtokens\relax\hss\relax{\hss\hss}{#1}\egroup}
+
+%D \startbuffer
+%D \stretched{Unknown Box}
+%D \hbox to .5\hsize{\stretched{A Horizontal Box}}
+%D \vbox to 2cm{\stretched{A Vertical Box}}
+%D \hbox to 3cm{\stretched{sp{\'e}c{\`\i}{\"a}l}}
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D The first line of this macros takes care of boxing. Normally
+%D one will use an \type{\hbox} specification. The last line
+%D shows how special characters should be passed.
+%D
+%D \typebuffer
+
+%D \macros
+%D {stretchednormalcase, stretcheduppercase, stretchedlowercase}
+%D
+%D A convenient alternative is:
+%D
+%D \starttyping
+%D \stretcheduppercase{Is this what you like?}
+%D \stoptyping
+%D
+%D \typebuffer
+%D
+%D this one uses fixed skips and kerns.
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D The default skip can be set with:
+
+% \def\stretchedspacefactor{4}
+% \def\stretchedspaceamount{.25em}
+%
+% \unexpanded\def\stretcheduppercase#1%
+% {\bgroup
+% \the\everyuppercase
+% \uppercase{\def\textstring{#1}}%
+% \ifdim\stretchedspaceamount>\zeropoint
+% \def\textkern%
+% {\kern\stretchedspaceamount}%
+% \def\textskip%
+% {\scratchdimen=\stretchedspaceamount
+% \hskip\stretchedspacefactor\scratchdimen}%
+% \@EA\processtokens\@EA\relax\@EA\textkern\@EA\relax\@EA
+% \textskip\@EA{\textstring}%
+% \else
+% \textstring
+% \fi
+% \egroup}
+
+%D Given the following settings, the space is 1em by default:
+
+\def\stretchedspacefactor{4}
+\def\stretchedspaceamount{.25em}
+\def\stretchedbreaktokens{.@/}
+
+\unexpanded\def\stretchednormalcase
+ {\stretchedsomecase\firstofoneargument}
+
+\unexpanded\def\stretcheduppercase
+ {\stretchedsomecase{\the\everyuppercase\uppercase}}
+
+\unexpanded\def\stretchedlowercase
+ {\stretchedsomecase{\the\everylowercase\lowercase}}
+
+\def\stretchedsomecase#1#2%
+ {\bgroup
+ #1{\def\textstring{#2}}%
+ \ifdim\stretchedspaceamount=\zeropoint
+ \textstring
+ \else
+ \def\textkern##1%
+ {% beware: ##1 may not be \box\somebox -)
+ \determinemidwordbreak{##1}{\stretchedbreaktokens}%
+ \kern\stretchedspaceamount##1\domidwordbreak}%
+ \def\textskip
+ {\scratchdimen\stretchedspaceamount
+ \hskip\stretchedspacefactor\scratchdimen}%
+ \@EA\processtokens\@EA\relax\@EA\textkern\@EA\relax\@EA
+ \textskip\@EA{\textstring}%
+ \fi
+ \egroup}
+
+%D An auxiliary macro, see for usage \type {\stretcheduppercase}.
+
+\let\domidwordbreak\relax
+
+\def\setmidwordbreaktoken#1%
+ {\sfcode`#1=5000\relax}
+
+\def\determinemidwordbreak#1#2%
+ {\edef\midwordbreaktokens{#2}%
+ \ifx\midwordbreaktokens\empty
+ \global\let\domidwordbreak\relax
+ \else
+ \setbox\scratchbox\hbox
+ {\expandafter\handletokens\midwordbreaktokens\with\setmidwordbreaktoken
+ a\space \!!dimena\lastskip
+ #1\space\!!dimenb\lastskip \relax % needed
+ \ifdim\!!dimena=\!!dimenb
+ \globallet\domidwordbreak\relax
+ \else
+ \globallet\domidwordbreak\allowbreak
+ \fi}%
+ \fi}
+
+%D \macros
+%D {underbar,underbars,
+%D overbar,overbars,
+%D overstrike,overstrikes,
+%D setupunderbar}
+%D
+%D In the rare case that we need undelined words, for instance
+%D because all font alternatives are already in use, one can
+%D use \type{\underbar} and \type{\overstrike} and their plural
+%D forms.
+%D
+%D \startbuffer
+%D \underbars{drawing \underbar{bars} under words is a typewriter leftover}
+%D \overstrikes{striking words makes them \overstrike{unreadable} but
+%D sometimes even \overbar{top lines} come into view.}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D The next macros are derived from the \PLAIN\ \TEX\ one, but
+%D also supports nesting. The \type{$} keeps us in horizontal
+%D mode and at the same time applies grouping.
+%D
+%D \showsetup{underbar}
+%D \showsetup{underbars}
+%D \showsetup{overbar}
+%D \showsetup{overbars}
+%D \showsetup{overstrike}
+%D \showsetup{overstrikes}
+%D
+%D Although underlining is ill advised, we permit some
+%D alternatives, that can be set up by:
+%D
+%D \showsetup{setupunderbar}
+%D
+%D The alternatives show up as
+%D {\setupunderbar [alternative=a]\underbar{alternative a}},
+%D {\setupunderbar [alternative=b]\underbar{alternative b}},
+%D {\setupunderbar [alternative=c]\underbar{alternative c}}
+%D and
+%D {\setupunderbar [rulethickness=1pt]\underbar{1pt width}},
+%D {\setupunderbar [rulethickness=2pt]\underbar{2pt width}},
+%D or whatever. Because \type{\overstrike} uses the same
+%D method, the settings also apply to that macro.
+
+\newcount\underbarlevel
+
+\def\underbarmethoda#1#2#3% RULE
+ {\hbox to #1{\vrule\!!width#1\!!height#2\!!depth#3}}
+
+\def\underbarmethodb#1#2#3% DASH
+ {\hbox to #1
+ {\hskip-.25em
+ \xleaders
+ \hbox{\hskip.25em\vrule\!!width.25em\!!height#2\!!depth#3}
+ \hfil}}
+
+\def\underbarmethodc#1#2#3% PERIOD
+ {\hbox to #1
+ {\dimen4=#3
+ \advance\dimen4 .2ex
+ \hskip-.25em
+ \xleaders
+ \hbox{\hskip.25em\lower\dimen4\hbox{.}}
+ \hfil}}
+
+\def\dododounderbar#1#2#3%
+ {\startmathmode
+ \setbox0\hbox{#3}%
+ \setbox2\hbox{\color[\@@onrulecolor]{\getvalue{underbarmethod\@@onalternative}{\wd0}{#1}{#2}}}%
+ \wd0\zeropoint
+ \ht2\ht0
+ \dp2\dp0
+ \box0\box2
+ \stopmathmode}
+
+\unexpanded\def\dodounderbar#1%
+ {\bgroup
+ \dimen0=\@@onbottomoffset
+ \dimen0=\underbarlevel\dimen0
+ \ifdone \else
+ \advance\dimen0 -\strutht
+ \fi
+ \dimen2\dimen0
+ \advance\dimen2 \@@onrulethickness
+ \dododounderbar{-\dimen0}{\dimen2}{#1}%
+ \egroup}
+
+\def\betweenunderbarwords
+ {\bgroup
+ \setbox0\hbox{\dodounderbar{\hskip\interwordspace}}%
+ \nobreak
+ \hskip\zeropoint\!!minus\interwordshrink
+ \discretionary{}{}{\box0}%
+ \egroup}
+
+\def\betweenunderbarspaces
+ {\hskip\currentspaceskip}
+
+% \unexpanded\def\dounderbar#1#2%
+% {\let\betweenisolatedwords#1%
+% \processisolatedwords{#2}\dodounderbar
+% \egroup}
+
+\unexpanded\def\underbar
+ {\bgroup
+ \advance\underbarlevel\plusone
+ \donetrue
+ \dounderbar\betweenunderbarwords}
+
+\unexpanded\def\dounderbar#1%
+ {\let\betweenisolatedwords#1%
+ \dosingleempty\redounderbar}
+
+\unexpanded\def\redounderbar[#1]#2%
+ {\iffirstargument\setupunderbar[#1]\fi
+ \processisolatedwords{#2}\dodounderbar
+ \egroup}
+
+\unexpanded\def\underbars
+ {\bgroup
+ \advance\underbarlevel\plusone
+ \donetrue
+ \dounderbar\betweenunderbarspaces}
+
+\unexpanded\def\overbar
+ {\bgroup
+ \advance\underbarlevel\minusone
+ \donefalse
+ \dounderbar\betweenunderbarwords}
+
+\unexpanded\def\overbars
+ {\bgroup
+ \advance\underbarlevel\minusone
+ \donefalse
+ \dounderbar\betweenunderbarspaces}
+
+\def\dooverstrike#1%
+ {\bgroup
+ \dimen0=\@@ontopoffset
+ \dimen2=\dimen0
+ \advance\dimen2 \@@onrulethickness
+ \dododounderbar{\dimen2}{-\dimen0}{#1}%
+ \egroup}
+
+\def\betweenoverstrikewords
+ {\bgroup
+ \setbox0\hbox{\dooverstrike{\hskip\interwordspace}}%
+ \nobreak
+ \hskip\zeropoint\!!minus\interwordshrink
+ \discretionary{}{}{\box0}%
+ \egroup}
+
+\unexpanded\def\overstrike#1%
+ {\bgroup
+ \let\betweenisolatedwords\betweenoverstrikewords
+ \processisolatedwords{#1}\dooverstrike
+ \egroup}
+
+\unexpanded\def\overstrikes#1%
+ {\bgroup
+ \processisolatedwords{#1}\dooverstrike
+ \egroup}
+
+\def\underbarparameter#1{\csname\??on#1\csname}
+
+\def\setupunderbar
+ {\dodoubleargument\getparameters[\??on]}
+
+%D \macros
+%D {shiftedword, shiftedwords}
+%D
+%D Used as \type {\shiftedwords {10pt} {some text}} this macro will
+%D move
+
+% \def\shiftedword#1% #2%
+% {\raise#1\hbox} % {#2}} % officially: {\ifdim#1>\zeropoint\raise\else\lower\fi#1\hbox{#2}}
+
+% \def\shiftedwords#1#2%
+% {\processisolatedwords{#2}{\shiftedword{#1}}}
+
+%D \macros
+%D {low, high, lohi}
+%D
+%D Although \TEX\ is pretty well aware of super- and
+%D subscripts, its mechanism is mainly tuned for math mode.
+%D The next few commands take care of script texts both modes.
+%D
+%D \startbuffer
+%D The higher\high{one goes} the lower\low{one drops}, or\lohi{yes}{no}?
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D Note the different placement of \type {\lohi}, where we
+%D need a bit more space. The implementation looks a bit
+%D fuzzy, since some \type {\fontdimen}'s are involved to
+%D determine the optimal placement.
+
+\def\dodohighlow
+ {\ifx\fontsize\empty
+ \ifmmode
+ \ifnum\fam<0 \tx \else \holamathfont \fi
+ \else
+ \tx
+ \fi
+ \else
+ \tx
+ \fi}
+
+\def\dohighlow#1#2#3#4#5% todo, named fontdimens
+ {\dontleavehmode
+ \bgroup
+ \scratchdimen\ifdim\fontexheight\textfont2=1ex #2\textfont2\else #3ex\fi
+ \advance\scratchdimen #4ex
+ \kern.1ex
+ \setbox\scratchbox\hbox{#1\scratchdimen\hbox{\dodohighlow#5}}%
+ \ht\scratchbox\strutheight
+ \dp\scratchbox\strutdepth
+ \box\scratchbox
+ \egroup}
+
+\unexpanded\def\high{\dohighlow\raise\mathsupnormal{.86}{0}}
+\unexpanded\def\low {\dohighlow\lower\mathsubnormal{.48}{0}}
+
+% \unexpanded\def\lohi#1#2%
+% {\dontleavehmode
+% \hbox
+% {\setbox4=\hbox{\dohighlow\lower\mathsubnormal{.48}{.1}{#1}}%
+% \setbox6=\hbox{\dohighlow\raise\mathsupnormal{.86}{.1}{#2}}%
+% \ifdim\wd4<\wd6
+% \wd4=\zeropoint\box4\box6
+% \else
+% \wd6=\zeropoint\box6\box4
+% \fi}}
+
+\unexpanded\def\lohi
+ {\dosingleempty\dolohi}
+
+\def\dolohi[#1]#2#3%
+ {\dontleavehmode
+ \hbox
+ {\setbox4\hbox{\dohighlow\lower\mathsubnormal{.48}{.1}{#2}}%
+ \setbox6\hbox{\dohighlow\raise\mathsupnormal{.86}{.1}{#3}}%
+ \doif{#1}{\v!left}
+ {\ifdim\wd4<\wd6
+ \setbox4\hbox to \wd6{\hss\box4}%
+ \else
+ \setbox6\hbox to \wd4{\hss\box6}%
+ \fi}%
+ \ifdim\wd4<\wd6
+ \wd4=\zeropoint\box4\box6
+ \else
+ \wd6=\zeropoint\box6\box4
+ \fi}}
+
+%D You can provide an optional keyword \type {left}, in which
+%D case the super and subscripts will be aligned in a way that
+%D permits placement at the left of a word (which means that
+%D it will be right aligned).
+%D
+%D \startbuffer
+%D \lohi{aha}{ah} test \lohi{aha}{ah} test
+%D \lohi[left]{aha}{ah} test \lohi[left]{aha}{ah} test
+%D \lohi{aha}{ah} test\lohi{aha}{ah} test
+%D \lohi[left]{aha}{ah}test \lohi[left]{aha}{ah}test
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+%D \macros
+%D {setupinitial,placeinitial,checkinitial}
+%D
+%D {\em To be documented.}
+%D
+%D \starttyping
+%D \setupinitial[state=start] \placeinitial \input tufte
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \def\bpar{\ifvmode\checkinitial\fi}
+%D \def\epar{\ifhmode\par\fi\checkinitial}
+%D \stoptyping
+
+% to do: more fine tuning
+
+\def\setupinitial
+ {\dodoubleempty\getparameters[\??dc]}
+
+\definefontsynonym[Initial][Regular] % prefered initial identifier
+\definefontsynonym[initial][Initial] % internal but accepted too
+
+\setupinitial
+ [\c!state=\v!stop,
+ \c!location=\v!text,
+ \c!n=3,
+ \c!distance=.125em,
+ \c!command=,
+ \s!font=initial]
+
+\def\AutoDroppedCapsCommand{\NiceDroppedCaps\@@dccommand\@@dcfont\@@dcdistance\@@dcn}%
+
+\def\placeinitial
+ {\doifelse\@@dclocation\v!margin{\chardef\DropMode\plusone}{\chardef\DropMode\zerocount}%
+ \doif \@@dcstate\v!start{\ifcase\@@dcn\else\AutoDroppedCaps\fi}}
+
+\let\checkinitial\CheckDroppedCaps
+
+%D This module has only a few setups:
+
+\setupunderbar
+ [\c!alternative=a,
+ \c!rulethickness=\linewidth,
+ \c!bottomoffset=1.5pt,
+ \c!topoffset=2.5pt,
+ \c!rulecolor=]
+
+\protect \endinput
diff --git a/tex/context/base/core-fnt.mkiv b/tex/context/base/core-fnt.mkiv
new file mode 100644
index 000000000..a7c84a5a0
--- /dev/null
+++ b/tex/context/base/core-fnt.mkiv
@@ -0,0 +1,293 @@
+%D \module
+%D [ file=core-fnt,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Fonts}
+
+\unprotect
+
+%D \macros
+%D {compound}
+%D
+%D We will overload the already active \type {|} so we have
+%D to save its meaning in order to be able to use this handy
+%D macro.
+%D
+%D \starttyping
+%D so test\compound{}test can be used instead of test||test
+%D \stoptyping
+
+\bgroup \catcode`\|=\@@active \gdef\compound#1{|#1|} \egroup
+
+%D Here we hook some code into the clean up mechanism needed
+%D for verbatim data.
+
+\appendtoks
+ \disablecompoundcharacters
+ \disablediscretionaries
+\to \everycleanupfeatures
+
+%D \macros
+%D {stretched}
+%D
+%D Stretching characters in a word is a sort of typographical
+%D murder. Nevertheless we support this manipulation for use in
+%D for instance titles.
+%D
+%D \starttyping
+%D \hbox to 5cm{\stretched{murder}}
+%D \stoptyping
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D \showsetup{stretched}
+
+\def\stretched#1%
+ {\ifvmode\hbox to \hsize\else\ifinner\else\hbox\fi\fi
+ \bgroup\processtokens\relax\hss\relax{\hss\hss}{#1}\egroup}
+
+%D \startbuffer
+%D \stretched{Unknown Box}
+%D \hbox to .5\hsize{\stretched{A Horizontal Box}}
+%D \vbox to 2cm{\stretched{A Vertical Box}}
+%D \hbox to 3cm{\stretched{sp{\'e}c{\`\i}{\"a}l}}
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D The first line of this macros takes care of boxing. Normally
+%D one will use an \type{\hbox} specification. The last line
+%D shows how special characters should be passed.
+%D
+%D \typebuffer
+
+%D \macros
+%D {stretchednormalcase, stretcheduppercase, stretchedlowercase}
+%D
+%D A convenient alternative is:
+%D
+%D \starttyping
+%D \stretcheduppercase{Is this what you like?}
+%D \stoptyping
+%D
+%D \typebuffer
+%D
+%D this one uses fixed skips and kerns.
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D The default skip can be set with:
+
+%D Given the following settings, the space is 1em by default:
+
+\def\stretchedspacefactor{4}
+\def\stretchedspaceamount{.25em}
+\def\stretchedbreaktokens{.@/}
+
+\unexpanded\def\stretchednormalcase
+ {\stretchedsomecase\firstofoneargument}
+
+\unexpanded\def\stretcheduppercase
+ {\stretchedsomecase{\the\everyuppercase\uppercase}}
+
+\unexpanded\def\stretchedlowercase
+ {\stretchedsomecase{\the\everylowercase\lowercase}}
+
+\def\stretchedsomecase#1#2%
+ {\bgroup
+ #1{\def\textstring{#2}}%
+ \ifdim\stretchedspaceamount=\zeropoint
+ \textstring
+ \else
+ \def\textkern##1%
+ {% beware: ##1 may not be \box\somebox -)
+ \determinemidwordbreak{##1}{\stretchedbreaktokens}%
+ \kern\stretchedspaceamount##1\domidwordbreak}%
+ \def\textskip
+ {\scratchdimen\stretchedspaceamount
+ \hskip\stretchedspacefactor\scratchdimen}%
+ \@EA\processtokens\@EA\relax\@EA\textkern\@EA\relax\@EA\textskip\@EA{\textstring}%
+ \fi
+ \egroup}
+
+%D An auxiliary macro, see for usage \type {\stretcheduppercase}.
+
+\let\domidwordbreak\relax
+
+\def\setmidwordbreaktoken#1%
+ {\sfcode`#1=5000\relax}
+
+\def\determinemidwordbreak#1#2%
+ {\edef\midwordbreaktokens{#2}%
+ \ifx\midwordbreaktokens\empty
+ \global\let\domidwordbreak\relax
+ \else
+ \setbox\scratchbox\hbox
+ {\expandafter\handletokens\midwordbreaktokens\with\setmidwordbreaktoken
+ a\space \!!dimena\lastskip
+ #1\space\!!dimenb\lastskip \relax % needed
+ \ifdim\!!dimena=\!!dimenb
+ \globallet\domidwordbreak\relax
+ \else
+ \globallet\domidwordbreak\allowbreak
+ \fi}%
+ \fi}
+
+%D \macros
+%D {shiftedword, shiftedwords}
+%D
+%D Used as \type {\shiftedwords {10pt} {some text}} this macro will
+%D move
+
+% \def\shiftedword#1% #2%
+% {\raise#1\hbox} % {#2}} % officially: {\ifdim#1>\zeropoint\raise\else\lower\fi#1\hbox{#2}}
+
+% \def\shiftedwords#1#2%
+% {\processisolatedwords{#2}{\shiftedword{#1}}}
+
+%D \macros
+%D {low, high, lohi, hilo}
+%D
+%D Although \TEX\ is pretty well aware of super- and
+%D subscripts, its mechanism is mainly tuned for math mode.
+%D The next few commands take care of script texts both modes.
+%D
+%D \startbuffer
+%D The higher\high{one goes} the lower\low{one drops}, or\lohi{yes}{no}?
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D Note the different placement of \type {\lohi}, where we
+%D need a bit more space. The implementation looks a bit
+%D fuzzy, since some \type {\fontdimen}'s are involved to
+%D determine the optimal placement.
+
+\def\dodohighlow
+ {\ifx\fontsize\empty
+ \ifmmode
+ \ifnum\fam<0 \tx \else \holamathfont \fi
+ \else
+ \tx
+ \fi
+ \else
+ \tx
+ \fi}
+
+\def\dohighlow#1#2#3#4#5% todo, named fontdimens
+ {\dontleavehmode
+ \bgroup
+ \scratchdimen\ifdim\fontexheight\textfont2=1ex #2\textfont2\else #3ex\fi
+ \advance\scratchdimen #4ex
+ \kern.1ex
+ \setbox\scratchbox\hbox{#1\scratchdimen\hbox{\dodohighlow#5}}%
+ \ht\scratchbox\strutheight
+ \dp\scratchbox\strutdepth
+ \box\scratchbox
+ \egroup}
+
+\unexpanded\def\high{\dohighlow\raise\mathsupnormal{.86}{0}}
+\unexpanded\def\low {\dohighlow\lower\mathsubnormal{.48}{0}}
+
+\unexpanded\def\lohi
+ {\dosingleempty\dolohi}
+
+\unexpanded\def\hilo
+ {\dosingleempty\dohilo}
+
+\def\dolohi[#1]#2#3%
+ {\dontleavehmode
+ \hbox
+ {\setbox4\hbox{\dohighlow\lower\mathsubnormal{.48}{.1}{#2}}%
+ \setbox6\hbox{\dohighlow\raise\mathsupnormal{.86}{.1}{#3}}%
+ \doif{#1}{\v!left}
+ {\ifdim\wd4<\wd6
+ \setbox4\hbox to \wd6{\hss\box4}%
+ \else
+ \setbox6\hbox to \wd4{\hss\box6}%
+ \fi}%
+ \ifdim\wd4<\wd6
+ \wd4=\zeropoint\box4\box6
+ \else
+ \wd6=\zeropoint\box6\box4
+ \fi}}
+
+\def\dohilo[#1]#2#3%
+ {\dolohi[#1]{#3}{#2}}
+
+%D You can provide an optional keyword \type {left}, in which
+%D case the super and subscripts will be aligned in a way that
+%D permits placement at the left of a word (which means that
+%D it will be right aligned).
+%D
+%D \startbuffer
+%D \lohi{aha}{ah} test \lohi{aha}{ah} test
+%D \lohi[left]{aha}{ah} test \lohi[left]{aha}{ah} test
+%D \lohi{aha}{ah} test\lohi{aha}{ah} test
+%D \lohi[left]{aha}{ah}test \lohi[left]{aha}{ah}test
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+%D \macros
+%D {setupinitial,placeinitial,checkinitial}
+%D
+%D {\em To be documented.}
+%D
+%D \starttyping
+%D \setupinitial[state=start] \placeinitial \input tufte
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \def\bpar{\ifvmode\checkinitial\fi}
+%D \def\epar{\ifhmode\par\fi\checkinitial}
+%D \stoptyping
+
+% to do: more fine tuning
+
+\unexpanded\def\setupinitial
+ {\dodoubleempty\getparameters[\??dc]}
+
+\definefontsynonym[Initial][Regular] % prefered initial identifier
+\definefontsynonym[initial][Initial] % internal but accepted too
+
+\setupinitial
+ [\c!state=\v!stop,
+ \c!location=\v!text,
+ \c!n=3,
+ \c!distance=.125em,
+ \c!command=,
+ \s!font=initial]
+
+\def\AutoDroppedCapsCommand{\NiceDroppedCaps\@@dccommand\@@dcfont\@@dcdistance\@@dcn}%
+
+\unexpanded\def\placeinitial
+ {\doifelse\@@dclocation\v!margin{\chardef\DropMode\plusone}{\chardef\DropMode\zerocount}%
+ \doif \@@dcstate\v!start{\ifcase\@@dcn\else\AutoDroppedCaps\fi}}
+
+\let\checkinitial\CheckDroppedCaps
+
+\protect \endinput
diff --git a/tex/context/base/core-gen.mkii b/tex/context/base/core-gen.mkii
new file mode 100644
index 000000000..b6ab2a208
--- /dev/null
+++ b/tex/context/base/core-gen.mkii
@@ -0,0 +1,166 @@
+%D \module
+%D [ file=core-gen,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=General,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / General}
+
+\unprotect
+
+%D \macros
+%D {assigndimension,assignalfadimension}
+%D
+%D Hieronder worden enkele commando's gedefinieerd rond
+%D toekenningen. Allereerst een commando om waarden aan
+%D een \DIMENSION\ toe te kennen:
+%D
+%D \starttyping
+%D \assigndimension
+%D {<waarde>|klein|middel|groot|-klein|-middel|-groot|geen}
+%D {\dimension}
+%D {waarde klein}
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt de \DIMENSION\ \type{\dimension} een waarde
+%D afhankelijk van het meegegeven trefwoord.
+%D
+%D \startnarrower
+%D \startlines
+%D \type{(-)klein }\qquad (--) waarde klein
+%D \type{(-)middel}\qquad (--) waarde middel
+%D \type{(-)groot }\qquad (--) waarde groot
+%D \type{geen }\qquad 0pt
+%D \type{waarde }\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Een trefwoord mag worden voorafgegaan door een \type{-}.
+%D Deze macro toont een voorbeeld van het gebruik van
+%D \type{\processaction} en constanten.
+%D
+%D Analoog aan het bovenstaande commando kennen we een
+%D commando om waarden toe te kennen aan een macro:
+%D
+%D \starttyping
+%D \assignalfadimension
+%D {<waarde>|klein|middel|groot|geen}
+%D {\macro}
+%D {waarde klein}
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptyping
+
+% The third (optimized) version:
+
+\def\@ad@{@ad@}
+
+\setvalue{\@ad@ \v!none }{\zeropoint\gobblethreearguments}
+\setvalue{\@ad@ \v!big }{\thirdofthreearguments}
+\setvalue{\@ad@ \v!medium}{\secondofthreearguments}
+\setvalue{\@ad@ \v!small }{\firstofthreearguments}
+\setvalue{\@ad@-\v!big }{-\thirdofthreearguments}
+\setvalue{\@ad@-\v!medium}{-\secondofthreearguments}
+\setvalue{\@ad@-\v!small }{-\firstofthreearguments}
+
+\def\assigndimension#1#2% #3 #4 #5
+ {#2=\ifcsname\@ad@#1\endcsname
+ \csname\@ad@#1\expandafter\endcsname
+ \else
+ #1\expandafter\gobblethreearguments
+ \fi}
+
+\def\@aa@{@aa@}
+
+\setvalue{\@aa@\v!none }{0\gobblethreearguments}
+\setvalue{\@aa@\v!big }{\thirdofthreearguments}
+\setvalue{\@aa@\v!medium}{\secondofthreearguments}
+\setvalue{\@aa@\v!small }{\firstofthreearguments}
+
+\def\assignalfadimension#1#2#3#4#5% #3#4#5 are single digits
+ {\edef#2{\ifcsname\@aa@#1\endcsname
+ \csname\@aa@#1\expandafter\endcsname
+ \else
+ #1\expandafter\gobblethreearguments
+ \fi#3#4#5}}
+
+%D \macros
+%D {assignvalue}
+%D
+%D Een variant hierop is het commando:
+%D
+%D \starttyping
+%D \assignvalue
+%D {<waarde>|klein|middel|groot}
+%D {\macro}
+%D {waarde klein }
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt \type{\macro} een waarde afhankelijk van
+%D het meegegeven trefwoord:
+%D
+%D \startnarrower
+%D \startlines
+%D \type{klein }\qquad waarde klein
+%D \type{middel}\qquad waarde middel
+%D \type{groot }\qquad waarde groot
+%D \type{waarde}\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Hier doet \type{geen} dus niet mee.
+
+\def\@av@{@av@}
+
+\letvalue{\@av@\v!big }\thirdofthreearguments
+\letvalue{\@av@\v!medium}\secondofthreearguments
+\letvalue{\@av@\v!small }\firstofthreearguments
+
+\def\assignvalue#1#2#3#4#5%
+ {\edef#2{\ifcsname\@av@#1\endcsname
+ \csname\@av@#1\expandafter\endcsname
+ \else
+ #1\expandafter\gobblethreearguments
+ \fi{#3}{#4}{#5}}}
+
+%D \macros
+%D {assignwidth}
+%D
+%D Een breedte van een opgegeven tekst kan worden berekend en
+%D toegekend aan een \DIMENSION\ met:
+%D
+%D \starttyping
+%D \assignwidth
+%D {\dimension}
+%D {<waarde>|passend|ruim}
+%D {tekst}
+%D \stoptyping
+%D
+%D Dit commando sluit, evenals de bovenstaande
+%D \type{\assign}||commando's, aan op de wijze waarop
+%D in de andere \CONTEXT||modules toekenningen
+%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte
+%D met 1~em vermeerderd.
+
+\def\assignwidth#1#2#3#4%
+ {\doifelsenothing{#2}
+ {\setbox\scratchbox\hbox{#3}%
+ #1\wd\scratchbox}
+ {\doifinsetelse{#2}{\v!fit,\v!broad}
+ {\setbox\scratchbox\hbox{#3}%
+ #1\wd\scratchbox
+ \doif{#2}\v!broad{\advance#1 #4}}%
+ {#1=#2}}}%
+
+\protect \endinput
diff --git a/tex/context/base/core-gen.mkiv b/tex/context/base/core-gen.mkiv
new file mode 100644
index 000000000..b6ab2a208
--- /dev/null
+++ b/tex/context/base/core-gen.mkiv
@@ -0,0 +1,166 @@
+%D \module
+%D [ file=core-gen,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=General,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / General}
+
+\unprotect
+
+%D \macros
+%D {assigndimension,assignalfadimension}
+%D
+%D Hieronder worden enkele commando's gedefinieerd rond
+%D toekenningen. Allereerst een commando om waarden aan
+%D een \DIMENSION\ toe te kennen:
+%D
+%D \starttyping
+%D \assigndimension
+%D {<waarde>|klein|middel|groot|-klein|-middel|-groot|geen}
+%D {\dimension}
+%D {waarde klein}
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt de \DIMENSION\ \type{\dimension} een waarde
+%D afhankelijk van het meegegeven trefwoord.
+%D
+%D \startnarrower
+%D \startlines
+%D \type{(-)klein }\qquad (--) waarde klein
+%D \type{(-)middel}\qquad (--) waarde middel
+%D \type{(-)groot }\qquad (--) waarde groot
+%D \type{geen }\qquad 0pt
+%D \type{waarde }\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Een trefwoord mag worden voorafgegaan door een \type{-}.
+%D Deze macro toont een voorbeeld van het gebruik van
+%D \type{\processaction} en constanten.
+%D
+%D Analoog aan het bovenstaande commando kennen we een
+%D commando om waarden toe te kennen aan een macro:
+%D
+%D \starttyping
+%D \assignalfadimension
+%D {<waarde>|klein|middel|groot|geen}
+%D {\macro}
+%D {waarde klein}
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptyping
+
+% The third (optimized) version:
+
+\def\@ad@{@ad@}
+
+\setvalue{\@ad@ \v!none }{\zeropoint\gobblethreearguments}
+\setvalue{\@ad@ \v!big }{\thirdofthreearguments}
+\setvalue{\@ad@ \v!medium}{\secondofthreearguments}
+\setvalue{\@ad@ \v!small }{\firstofthreearguments}
+\setvalue{\@ad@-\v!big }{-\thirdofthreearguments}
+\setvalue{\@ad@-\v!medium}{-\secondofthreearguments}
+\setvalue{\@ad@-\v!small }{-\firstofthreearguments}
+
+\def\assigndimension#1#2% #3 #4 #5
+ {#2=\ifcsname\@ad@#1\endcsname
+ \csname\@ad@#1\expandafter\endcsname
+ \else
+ #1\expandafter\gobblethreearguments
+ \fi}
+
+\def\@aa@{@aa@}
+
+\setvalue{\@aa@\v!none }{0\gobblethreearguments}
+\setvalue{\@aa@\v!big }{\thirdofthreearguments}
+\setvalue{\@aa@\v!medium}{\secondofthreearguments}
+\setvalue{\@aa@\v!small }{\firstofthreearguments}
+
+\def\assignalfadimension#1#2#3#4#5% #3#4#5 are single digits
+ {\edef#2{\ifcsname\@aa@#1\endcsname
+ \csname\@aa@#1\expandafter\endcsname
+ \else
+ #1\expandafter\gobblethreearguments
+ \fi#3#4#5}}
+
+%D \macros
+%D {assignvalue}
+%D
+%D Een variant hierop is het commando:
+%D
+%D \starttyping
+%D \assignvalue
+%D {<waarde>|klein|middel|groot}
+%D {\macro}
+%D {waarde klein }
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptyping
+%D
+%D Hierbij krijgt \type{\macro} een waarde afhankelijk van
+%D het meegegeven trefwoord:
+%D
+%D \startnarrower
+%D \startlines
+%D \type{klein }\qquad waarde klein
+%D \type{middel}\qquad waarde middel
+%D \type{groot }\qquad waarde groot
+%D \type{waarde}\qquad waarde
+%D \stoplines
+%D \stopnarrower
+%D
+%D Hier doet \type{geen} dus niet mee.
+
+\def\@av@{@av@}
+
+\letvalue{\@av@\v!big }\thirdofthreearguments
+\letvalue{\@av@\v!medium}\secondofthreearguments
+\letvalue{\@av@\v!small }\firstofthreearguments
+
+\def\assignvalue#1#2#3#4#5%
+ {\edef#2{\ifcsname\@av@#1\endcsname
+ \csname\@av@#1\expandafter\endcsname
+ \else
+ #1\expandafter\gobblethreearguments
+ \fi{#3}{#4}{#5}}}
+
+%D \macros
+%D {assignwidth}
+%D
+%D Een breedte van een opgegeven tekst kan worden berekend en
+%D toegekend aan een \DIMENSION\ met:
+%D
+%D \starttyping
+%D \assignwidth
+%D {\dimension}
+%D {<waarde>|passend|ruim}
+%D {tekst}
+%D \stoptyping
+%D
+%D Dit commando sluit, evenals de bovenstaande
+%D \type{\assign}||commando's, aan op de wijze waarop
+%D in de andere \CONTEXT||modules toekenningen
+%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte
+%D met 1~em vermeerderd.
+
+\def\assignwidth#1#2#3#4%
+ {\doifelsenothing{#2}
+ {\setbox\scratchbox\hbox{#3}%
+ #1\wd\scratchbox}
+ {\doifinsetelse{#2}{\v!fit,\v!broad}
+ {\setbox\scratchbox\hbox{#3}%
+ #1\wd\scratchbox
+ \doif{#2}\v!broad{\advance#1 #4}}%
+ {#1=#2}}}%
+
+\protect \endinput
diff --git a/tex/context/base/core-ini.mkii b/tex/context/base/core-ini.mkii
new file mode 100644
index 000000000..69edf9735
--- /dev/null
+++ b/tex/context/base/core-ini.mkii
@@ -0,0 +1,67 @@
+%D \module
+%D [ file=core-ini,
+%D version=2003.12.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Additional Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Additional Initialization}
+
+%D We will move more code to here, so that we become less dependent of the
+%D orde in which modules are loaded.
+
+\unprotect
+
+\everypar \emptytoks
+\neverypar \emptytoks
+
+\appendtoks \flushnotes \to \everypar
+\appendtoks \synchronizesidefloats \to \everypar
+
+\appendtoks \checkinlinedirection \to \everypar
+
+\appendtoks \checkindentation \to \everypar
+\appendtoks \showparagraphnumber \to \everypar
+\appendtoks \flushmargincontents \to \everypar
+\appendtoks \flushcommentanchors \to \everypar
+\appendtoks \synchronizenotes \to \everypar
+\appendtoks \OTRSETshowstatus \to \everypar
+\appendtoks \flushpostponedbookmark \to \everypar
+\appendtoks \registerparoptions \to \everypar
+\appendtoks \flushsyncpositions \to \everypar
+\appendtoks \flushpostponednodedata \to \everypar
+\appendtoks \dohandlerepeatdelimitedtext \to \everypar
+\appendtoks \insertparagraphintro \to \everypar
+
+\appendtoks \flushpostponedbookmark \to \neverypar
+\appendtoks \flushpostponedbookmark \to \everylistentry
+
+\appendtoks \flushnotes \to \everydisplay
+\appendtoks \adjustsidefloatdisplaylines \to \everydisplay
+
+\appendtoks \flushsyncpositions \to \everyheadstart
+
+\appendtoks \flushsyncresets \to \everyendoftextbody
+
+\appendtoks \ignorespaces \to \everybeginofpar
+
+\appendtoks \removeunwantedspaces \to \everyendofpar
+%appendtoks \strut \to \everyendofpar % option ?
+\appendtoks \flushsyncresets \to \everyendofpar
+\appendtoks \setlastlinewidth \to \everyendofpar % must happen before endgraf
+\appendtoks \endgraf \to \everyendofpar
+
+% Todo: verbatim, xml, tex, move code to here
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\appendtoks \catcode`|=\@@active \let|\normalcompound \to \everyTEXinputmode
+\appendtoks \catcode`|=\@@letter \to \everyXMLinputmode
+
+\protect \endinput
diff --git a/tex/context/base/core-ini.mkiv b/tex/context/base/core-ini.mkiv
new file mode 100644
index 000000000..d6a72bb26
--- /dev/null
+++ b/tex/context/base/core-ini.mkiv
@@ -0,0 +1,66 @@
+%D \module
+%D [ file=core-ini,
+%D version=2003.12.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Additional Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Additional Initialization}
+
+%D We will move more code to here, so that we become less dependent of the
+%D orde in which modules are loaded.
+
+\unprotect
+
+\everypar \emptytoks
+\neverypar \emptytoks
+
+\appendtoks \flushnotes \to \everypar
+\appendtoks \synchronizesidefloats \to \everypar
+
+\appendtoks \checkindentation \to \everypar
+\appendtoks \showparagraphnumber \to \everypar
+\appendtoks \restoreinterlinepenalty \to \everypar
+\appendtoks \flushmargincontents \to \everypar
+\appendtoks \flushcommentanchors \to \everypar
+\appendtoks \synchronizenotes \to \everypar
+\appendtoks \OTRSETshowstatus \to \everypar
+\appendtoks \flushpostponedbookmark \to \everypar
+\appendtoks \registerparoptions \to \everypar
+\appendtoks \flushsyncpositions \to \everypar
+\appendtoks \flushpostponednodedata \to \everypar
+\appendtoks \dohandlerepeatdelimitedtext \to \everypar
+\appendtoks \insertparagraphintro \to \everypar
+
+\appendtoks \flushpostponedbookmark \to \neverypar
+\appendtoks \flushpostponedbookmark \to \everylistentry
+
+\appendtoks \flushnotes \to \everydisplay
+\appendtoks \adjustsidefloatdisplaylines \to \everydisplay
+
+\appendtoks \flushsyncpositions \to \everyheadstart
+
+\appendtoks \flushsyncresets \to \everyendoftextbody
+
+\appendtoks \ignorespaces \to \everybeginofpar
+
+\appendtoks \removeunwantedspaces \to \everyendofpar
+%appendtoks \strut \to \everyendofpar % option ?
+\appendtoks \flushsyncresets \to \everyendofpar
+%appendtoks \setlastlinewidth \to \everyendofpar % gone, will be done in lua
+\appendtoks \endgraf \to \everyendofpar
+
+% Todo: verbatim, xml, tex, move code to here
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\appendtoks \catcode`|=\@@active \let|\normalcompound \to \everyTEXinputmode
+\appendtoks \catcode`|=\@@letter \to \everyXMLinputmode
+
+\protect \endinput
diff --git a/tex/context/base/core-job.lua b/tex/context/base/core-job.lua
new file mode 100644
index 000000000..d557818bb
--- /dev/null
+++ b/tex/context/base/core-job.lua
@@ -0,0 +1,202 @@
+if not modules then modules = { } end modules ['core-job'] = {
+ version = 1.001,
+ comment = "companion to core-job.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local texsprint, texprint, texwrite = tex.sprint, tex.print, tex.write
+local ctxcatcodes, texcatcodes = tex.ctxcatcodes, tex.texcatcodes
+local lower, format, find, gmatch, gsub, match = string.lower, string.format, string.find, string.gmatch, string.gsub, string.match
+local concat = table.concat
+
+-- main code
+
+resolvers.maxreadlevel = 3
+
+directives.register("resolvers.maxreadlevel", function(v) resolvers.maxreadlevel = tonumber(v) or resolvers.maxreadlevel end)
+
+local function exists(n)
+ if io.exists(n) then
+ return n
+ else
+ n = file.addsuffix(n,'tex')
+ if io.exists(n) then
+ return n
+ end
+ end
+ return nil
+end
+
+function resolvers.findctxfile(name,maxreadlevel)
+ if file.is_qualified_path(name) then
+ return name
+ else
+ -- not that efficient, too many ./ lookups
+ local n = "./" .. name
+ local found = exists(n)
+ if found then
+ return found
+ else
+ for i=1,maxreadlevel or resolvers.maxreadlevel or 0 do
+ n = "../" .. n
+ found = exists(n)
+ if found then
+ return found
+ end
+ end
+ end
+ return resolvers.find_file(name) or ""
+ end
+end
+
+function commands.maxreadlevel()
+ texwrite(resolvers.maxreadlevel)
+end
+
+function commands.processfile(name,maxreadlevel)
+ name = resolvers.findctxfile(name,maxreadlevel)
+ if name ~= "" then
+ texsprint(ctxcatcodes,format("\\input %s\\relax",name)) -- we need \input {name}
+ end
+end
+
+function commands.doifinputfileelse(name,maxreadlevel)
+ commands.doifelse(resolvers.findctxfile(name,maxreadlevel) ~= "")
+end
+
+function commands.locatefilepath(name,maxreadlevel)
+ texsprint(texcatcodes,file.dirname(resolvers.findctxfile(name,maxreadlevel)))
+end
+
+function commands.usepath(paths,maxreadlevel)
+ resolvers.register_extra_path(paths)
+ texsprint(texcatcodes,concat(resolvers.instance.extra_paths or {}, ""))
+end
+
+function commands.usesubpath(subpaths,maxreadlevel)
+ resolvers.register_extra_path(nil,subpaths)
+ texsprint(texcatcodes,concat(resolvers.instance.extra_paths or {}, ""))
+end
+
+function commands.usezipfile(name,tree)
+ if tree and tree ~= "" then
+ resolvers.usezipfile(format("zip:///%s?tree=%s",name,tree))
+ else
+ resolvers.usezipfile(format("zip:///%s",name))
+ end
+end
+
+-- for the moment here, maybe a module
+
+--~ <?xml version='1.0' standalone='yes'?>
+--~ <exa:variables xmlns:exa='htpp://www.pragma-ade.com/schemas/exa-variables.rng'>
+--~ <exa:variable label='mode:pragma'>nee</exa:variable>
+--~ <exa:variable label='mode:variant'>standaard</exa:variable>
+--~ </exa:variables>
+
+local function convertexamodes(str)
+ local x = xml.convert(str)
+ for e in xml.collected(x,"exa:variable") do
+ local label = e.at and e.at.label
+ if label and label ~= "" then
+ local data = xml.text(e)
+ local mode = match(label,"^mode:(.+)$")
+ if mode then
+ texsprint(ctxcatcodes,format("\\enablemode[%s:%s]",mode,data))
+ end
+ texsprint(ctxcatcodes,format("\\setvariable{exa:variables}{%s}{%s}",label,gsub(data,"([{}])","\\%1")))
+ end
+ end
+end
+
+-- we need a system file option: ,. .. etc + paths but no tex lookup so resolvers.find_file is wrong here
+
+function commands.loadexamodes(filename)
+ if not filename or filename == "" then
+ filename = file.removesuffix(tex.jobname)
+ end
+ filename = resolvers.find_file(file.addsuffix(filename,'ctm')) or ""
+ if filename ~= "" then
+ commands.writestatus("examodes","loading %s",filename) -- todo: message system
+ convertexamodes(io.loaddata(filename))
+ else
+ commands.writestatus("examodes","no mode file %s",filename) -- todo: message system
+ end
+end
+
+function commands.logoptionfile(name)
+ -- todo: xml if xml logmode
+ local f = io.open(name)
+ if f then
+ texio.write_nl("log","%\n%\tbegin of optionfile\n%\n")
+ for line in f:lines() do
+ texio.write("log",format("%%\t%s\n",line))
+ end
+ texio.write("log","%\n%\tend of optionfile\n%\n")
+ f:close()
+ end
+end
+
+--~ set functions not ok and not faster on mk runs either
+--~
+--~ local function doifcommonelse(a,b)
+--~ local ba = find(a,",")
+--~ local bb = find(b,",")
+--~ if ba and bb then
+--~ for sa in gmatch(a,"[^ ,]+") do
+--~ for sb in gmatch(b,"[^ ,]+") do
+--~ if sa == sb then
+--~ texsprint(ctxcatcodes,"\\def\\commalistelement{",sa,"}")
+--~ return true
+--~ end
+--~ end
+--~ end
+--~ elseif ba then
+--~ for sa in gmatch(a,"[^ ,]+") do
+--~ if sa == b then
+--~ texsprint(ctxcatcodes,"\\def\\commalistelement{",b,"}")
+--~ return true
+--~ end
+--~ end
+--~ elseif bb then
+--~ for sb in gmatch(b,"[^ ,]+") do
+--~ if a == sb then
+--~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}")
+--~ return true
+--~ end
+--~ end
+--~ else
+--~ if a == b then
+--~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}")
+--~ return true
+--~ end
+--~ end
+--~ texsprint(ctxcatcodes,"\\let\\commalistelement\\empty")
+--~ return false
+--~ end
+--~ local function doifinsetelse(a,b)
+--~ local bb = find(b,",")
+--~ if bb then
+--~ for sb in gmatch(b,"[^ ,]+") do
+--~ if a == sb then
+--~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}")
+--~ return true
+--~ end
+--~ end
+--~ else
+--~ if a == b then
+--~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}")
+--~ return true
+--~ end
+--~ end
+--~ texsprint(ctxcatcodes,"\\let\\commalistelement\\empty")
+--~ return false
+--~ end
+--~ function commands.doifcommon (a,b) commands.doif (doifcommonelse(a,b)) end
+--~ function commands.doifnotcommon (a,b) commands.doifnot (doifcommonelse(a,b)) end
+--~ function commands.doifcommonelse(a,b) commands.doifelse(doifcommonelse(a,b)) end
+--~ function commands.doifinset (a,b) commands.doif (doifinsetelse(a,b)) end
+--~ function commands.doifnotinset (a,b) commands.doifnot (doifinsetelse(a,b)) end
+--~ function commands.doifinsetelse (a,b) commands.doifelse(doifinsetelse(a,b)) end
diff --git a/tex/context/base/core-job.mkii b/tex/context/base/core-job.mkii
new file mode 100644
index 000000000..5c280c15b
--- /dev/null
+++ b/tex/context/base/core-job.mkii
@@ -0,0 +1,415 @@
+%D \module
+%D [ file=core-job, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Job Handling,
+%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 is still to be split and documented.
+
+\writestatus{loading}{ConTeXt Core Macros / Job Handling}
+
+\unprotect
+
+\let \currentproject \empty
+\let \currentproduct \empty
+\let \currentenvironment \empty
+\let \currentcomponent \empty
+
+\let \loadedfiles \empty
+\let \processedfiles \empty
+
+\let \nomorefiles \relax
+
+\let \allinputpaths \empty
+\let \locatedfilepath \empty
+
+\newcount\textlevel
+\newcount\fileprocesslevel
+
+\setvalue{\c!file::0}{\jobname}
+
+\def\processedfile % is used in styles, don't change !
+ {\getvalue{\c!file::\number\fileprocesslevel}}
+
+\def\dostarttextfile#1%
+ {\global\advance\fileprocesslevel\plusone
+ \setxvalue{\c!file::\number\fileprocesslevel}{#1}%
+ \@EA\doglobal\@EA\addtocommalist\@EA{#1}\processedfiles}
+
+\def\dostoptextfile
+ {\global\advance\fileprocesslevel\minusone}
+
+\def\processlocalfile#1#2%
+ {#1{#2}\donothing{\readfile{#2}\donothing\donothing}}
+
+\def\processfile#1%
+ {\ifx\allinputpaths\empty
+ \def\next{\processlocalfile\readlocfile}%
+ \else
+ \let\filepath\empty
+ \def\docommand##1%
+ {\doiffileelse{\pathplusfile{##1}{#1}}{\donetrue\def\filepath{##1}}\donefalse
+ \ifdone\expandafter\quitcommalist\fi}%
+ \doifparentfileelse{#1} % new
+ {\processcommacommand [\allinputpaths]\docommand}
+ {\processcommacommand[.,\allinputpaths]\docommand}%
+ \ifx\filepath\empty
+ \def\next{\processlocalfile\readlocfile}% fall back ../../..
+ \else
+ \def\next{\processlocalfile{\readsetfile\filepath}}% file found
+ \fi
+ \fi
+ \next{#1}}
+
+\def\doifinputfileelse#1% rarely used
+ {\ifx\allinputpaths\empty
+ \@EA\secondoftwoarguments
+ \else
+ \let\filepath\empty
+ \def\docommand##1%
+ {\doiffileelse{\pathplusfile{##1}{#1}}{\donetrue\def\filepath{##1}}\donefalse
+ \ifdone\expandafter\quitcommalist\fi}%
+ \processcommacommand[.,\allinputpaths]\docommand
+ \ifx\filepath\empty
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi
+ \fi}
+
+\let\locatedfilepath\empty
+
+\def\locatefilepath#1%
+ {\let\locatedfilepath\empty
+ \ifx\allinputpaths\empty \else
+ \def\docommand##1%
+ {\doiffileelse{\pathplusfile{##1}{#1}}{\donetrue\def\locatedfilepath{##1}}\donefalse
+ \ifdone\expandafter\quitcommalist\fi}%
+ \doifparentfileelse{#1} % new
+ {\processcommacommand [\allinputpaths]\docommand}
+ {\processcommacommand[.,\allinputpaths]\docommand}%
+ \fi}
+
+\def\usepath[#1]%
+ {\def\docommand##1%
+ {\doifelse{##1}\v!reset
+ {\let\allinputpaths\empty}
+ {\sanitizefilename#1\to\ascii
+ \defconvertedcommand\ascii\ascii
+ \addtocommalist\ascii\allinputpaths}}%
+ \processcommalist[#1]\docommand}
+
+\def\usesubpath[#1]% test for a real long time, permits ../{name} i.e. braces
+ {\ifx\allinputpaths\empty
+ \sanitizefilename#1\to\allinputpaths
+ \else
+ \def\docommand##1%
+ {\def\dodocommand####1%
+ {\sanitizefilename####1\to\ascii
+ \defconvertedcommand\ascii\ascii
+ \addtocommalist{##1/\ascii}\allinputpaths}%
+ \processcommalist[#1]\dodocommand}%
+ \processcommacommand[\allinputpaths]\docommand
+ \fi}
+
+\def\registerfileinfo[#1#2]#3% geen \showmessage ?
+ {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}%
+ \immediatewriteutility{f #1 {#3}}}
+
+\ifx\preloadfonts \undefined \let\preloadfonts \relax \fi
+\ifx\preloadspecials\undefined \let\preloadspecials\relax \fi
+
+\def\loadallsystemfiles#1#2%
+ {\ifx\@@svdirectory\empty
+ \readsysfile{#1}{\showmessage\m!systems2{#1}}{#2}%
+ \else% yet undocumented
+ \def\doloadsystemfile##1%
+ {\readsetfile{##1}{#1}{\showmessage\m!systems2{#1}}{#2}}%
+ \processcommacommand[\@@svdirectory]\doloadsystemfile
+ \fi}
+
+\ifx\disableXML\undefined \let\disableXML\relax \fi
+
+\def\loadsystemfiles
+ {\reportprotectionstate
+ \readsysfile\f!newfilename{\showmessage\m!systems2\f!newfilename}\donothing
+ %\readsysfile\f!oldfilename{\showmessage\m!systems2\f!oldfilename}\donothing
+ \loadallsystemfiles\f!filfilename
+ \donothing
+ \loadallsystemfiles\f!sysfilename
+ {\loadallsystemfiles{\f!sysfilename.rme}\donothing % new, fall back
+ \doglobal\appendtoks % brrr better \setcatcodetable\ctxcatcodes % % test
+ \bgroup\disableXML\loadallsystemfiles\f!errfilename\donothing\egroup
+ \to\everygoodbye}}
+
+%D Loading of \type {cont-usr.tex} (edited by the user)
+%D and \type {cont-fmt.tex} (generated by texexec).
+
+\def\loaduserspecifications
+ {% this used to be the file where users can tune their system, especially patterns
+ \readsysfile\f!usrfilename{\showmessage\m!systems2\f!usrfilename}\donothing
+ % this one took care of user preferences (fonts, messages) but lm made this obsolete
+ \readjobfile\f!fmtfilename{\showmessage\m!systems2\f!fmtfilename}\donothing
+ % from now on we preload all patterns (only in mkii)
+ \preloadallpatterns}
+
+\let\loaduserspecifications\relax
+
+%D We don't want multiple jobfiles to interfere.
+
+\def\loadoptionfile
+ {\readjobfile{\jobname.\f!optionextension}
+ {\showmessage\m!systems2{\jobname.\f!optionextension}}%
+ {\writestatus\m!systems {no \jobname.\f!optionextension}}}
+
+% Most natural ...
+%
+% \def\doateverystarttext
+% {\the\everystarttext
+% \global\let\doateverystarttext\relax}
+%
+% ... most practical, since we can load env's in a
+% something.run file (nested \starttext's; see for
+% instance x-res-08, where we definitely want to
+% open the file!).
+
+\def\doateverystarttext
+ {\the\everystarttext
+ \global\everystarttext\emptytoks}
+
+\def\starttext
+ {\doateverystarttext
+ \ifcase\textlevel
+ \registerfileinfo[begin]\jobname
+ \expandafter\startcopyingblocks
+ \fi
+ \global\advance\textlevel\plusone}
+
+\def\stoptext
+ {\global\advance\textlevel\minusone
+ \ifnum\textlevel>\zerocount \else
+ \page[\v!last]\page % new, moved from everybye to here; flushes headers, colors etc etc etc
+ \the\everystoptext
+ %\the\everybye %
+ %\the\everygoodbye % == \end (new)
+ %\expandafter\normalend %
+ \expandafter\finalend
+ \fi}
+
+\def\forcequitjob#1%
+ {\writestatus\m!systems{forcing quit: #1}%
+ \batchmode
+ \dorecurse\textlevel\stoptext
+ \normalend}
+
+\let\autostoptext\relax
+
+\def\autostarttext
+ {\ifcase\textlevel
+ \starttext
+ \writestatus\m!systems{auto \string\starttext..\string\stoptext}%
+ \let\autostoptext\stoptext
+ \fi}
+
+\def\finalend
+ {\ifnum\textlevel>\zerocount \else
+ \the\everybye
+ \the\everygoodbye
+ \doifsometokselse\everynotabene{\writeline\the\everynotabene\writeline}\donothing
+ \global\everybye \emptytoks % rather unneeded
+ \global\everygoodbye\emptytoks % but for sure
+ \expandafter\normalend
+ \fi}
+
+\let\end\finalend
+
+\def\emergencyend
+ {\writestatus\m!systems{invalid \@EA\string\csname\e!start\v!text\endcsname...\@EA\string\csname\e!stop\v!text\endcsname\space structure}%
+ \stoptext}
+
+\def\currentfile{\inputfilename}
+
+\def\doexecutefileonce#1%
+ {\beforesplitstring#1\at.\to\currentfile
+ \fullexpandtwoargsafter\doifnotinset\currentfile\loadedfiles
+ {\fullexpandoneargafter\addtocommalist\currentfile\loadedfiles
+ \doexecutefile{#1}}}
+
+\def\doexecutefile#1%
+ {\registerfileinfo[begin]{#1}%
+ \dostarttextfile{#1}%
+ \processfile{#1}%
+ \dostoptextfile
+ \registerfileinfo[end]{#1}}
+
+\def\donotexecutefile#1%
+ {}
+
+\def\verwerkfile#1 %
+ {\doexecutefile{#1}}
+
+\def\useenvironment[#1]% maybe commalist
+ {\environment #1 \relax}
+
+\def\environment #1 % at outermost level only (load only once)
+ {\pushmacro\startenvironment
+ \pushmacro\stopenvironment
+ \def\startenvironment ##1 {}%
+ \let\stopenvironment\relax
+ \startreadingfile
+ \doexecutefileonce{#1}
+ \stopreadingfile
+ \popmacro\stopenvironment
+ \popmacro\startenvironment}
+
+\def\component #1 % at outermost level only
+ {\dostarttextfile{#1}%
+ \processfile{#1}%
+ \dostoptextfile}
+
+\newcount\filelevel
+
+\let\currentcomponent \v!text
+\let\currentcomponentpath\f!currentpath
+
+\def\donextlevel#1#2#3#4#5#6#7\\%
+ {\pushmacro\currentcomponent
+ \pushmacro\currentcomponentpath
+ \let\currentcomponent#1%
+ \setsystemmode\currentcomponent
+ \splitfilename{#1}%
+ \ifx\splitoffpath\empty
+ \let\currentcomponentpath\f!currentpath
+ \else
+ \let\currentcomponentpath\splitoffpath
+ \fi
+ \beforesplitstring#7\at.\to#2\relax % can become path + base
+ \ifcase\filelevel\relax
+ \starttext
+ \def\project ##1 {#3{##1}}%
+ \def\environment ##1 {#4{##1}}%
+ \def\product ##1 {#5{##1}}%
+ \def\component ##1 {#6{##1}}%
+ \fi
+ \advance\filelevel\plusone
+ \fullexpandoneargafter\addtocommalist{#1}\loadedfiles}
+
+\def\doprevlevel
+ {\popmacro\currentcomponentpath
+ \popmacro\currentcomponent
+ \setsystemmode\currentcomponent
+ \ifnum\filelevel=\plusone
+ \expandafter\stoptext
+ \else
+ \advance\filelevel\minusone
+ \expandafter\endinput
+ \fi}
+
+\def\startproject #1 %
+ {\donextlevel\v!project\currentproject
+ \donotexecutefile\doexecutefileonce
+ \doexecutefileonce\doexecutefile#1\\}
+
+\def\startproduct #1 %
+ {\doateverystarttext
+ \donextlevel\v!product\currentproduct
+ \doexecutefileonce\doexecutefileonce
+ \donotexecutefile\doexecutefile#1\\}
+
+\def\startcomponent #1 %
+ {\doateverystarttext
+ \donextlevel\v!component\currentcomponent
+ \doexecutefileonce\doexecutefileonce
+ \donotexecutefile\doexecutefile#1\\}
+
+\def\startenvironment #1 %
+ {\donextlevel\v!environment\currentenvironment
+ \donotexecutefile\doexecutefileonce
+ \donotexecutefile\donotexecutefile#1\\}
+
+% \startproject test
+% 1: \startmode[*project] project \stopmode \endgraf
+% 2: \startmode[*product] product \stopmode \endgraf
+% \stopproject
+
+\def\stopproject {\doprevlevel}
+\def\stopproduct {\doprevlevel}
+\def\stopcomponent {\doprevlevel}
+\def\stopenvironment{\doprevlevel}
+
+% more or less replaced by modes
+
+\setvalue{\e!start\v!localenvironment}[#1]%
+ {\let\loadedlocalenvironments\empty
+ \def\docommand##1%
+ {\beforesplitstring##1\at.\to\someevironment
+ \fullexpandoneargafter\addtocommalist\someevironment\loadedlocalenvironments}%
+ \processcommalist[#1]\docommand
+ \fullexpandtwoargsafter\doifcommonelse % no longer next needed
+ {\currentproject,\currentproduct,%
+ \currentcomponent,\currentenvironment}
+ {\loadedlocalenvironments}
+ {\letvalue{\e!stop\v!localenvironment}\relax}
+ {\grabuntil{\e!stop\v!localenvironment}\gobbleoneargument}} % TH: fixed, was \relax
+
+\setvalue{\v!localenvironment}#1 {\doexecutefileonce{#1}}
+
+% NOT TOEVOEGEN: \the\everytrace
+
+\neverypar=\emptytoks
+
+% \appendtoks \flushnotes \to \everypar
+% \appendtoks \synchronizesidefloats \to \everypar
+% \appendtoks \checkindentation \to \everypar
+% \appendtoks \showparagraphnumber \to \everypar
+% \appendtoks \flushmargincontents \to \everypar
+% \appendtoks \flushcommentanchors \to \everypar
+% \appendtoks \synchronizenotes \to \everypar
+
+% \appendtoks \flushnotes \to \everydisplay
+% \appendtoks \adjustsidefloatdisplaylines \to \everydisplay
+
+% soon, when pdftex 1.22 is out in the field:
+
+\chardef\systemcommandmode\zerocount % 0=unknown 1=disabled 2=enabled
+
+\def\checksystemcommandmode
+ {\ifx\pdfshellescape\undefined \else
+ \chardef\systemcommandmode \ifcase\pdfshellescape \plusone \else \plustwo \fi
+ \fi
+ \global\let\checksystemcommandmode\relax}
+
+\def\reportsystemcommandmode
+ {\ifcase\systemcommandmode
+ \or
+ \writestatus\m!systems{system commands are disabled}%
+ \or
+ \writestatus\m!systems{system commands are enabled}%
+ \fi}
+
+% \ifx\etexversion\undefined \else \ifnum\etexversion<202
+% \prependtoks
+% \writestatus\m!systems{eTeX version \number\etexversion\space -> too old (bugs)}%
+% \writeline
+% \to \everyjob
+% \fi \fi
+
+% \ifx\pdftexversion\undefined \else \ifnum\number\pdftexversion<120
+% \prependtoks
+% \writestatus\m!systems{pdfTeX version \number\pdftexversion\space -> please update}%
+% \writeline
+% \to \everyjob
+% \fi \fi
+
+% Default-instellingen (verborgen)
+
+\resetutilities
+
+\protect \endinput
diff --git a/tex/context/base/core-job.mkiv b/tex/context/base/core-job.mkiv
new file mode 100644
index 000000000..de328c92b
--- /dev/null
+++ b/tex/context/base/core-job.mkiv
@@ -0,0 +1,309 @@
+%D \module
+%D [ file=core-job, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Job Handling,
+%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 is still to be split and documented.
+
+\writestatus{loading}{ConTeXt Core Macros / Job Handling}
+
+\unprotect
+
+\registerctxluafile{core-job}{1.001}
+
+\let \currentproject \empty
+\let \currentproduct \empty
+\let \currentenvironment \empty
+\let \currentcomponent \empty
+
+\let \loadedfiles \empty
+\let \processedfiles \empty
+
+\let \nomorefiles \relax
+
+\let \allinputpaths \empty
+\let \locatedfilepath \empty
+
+\newcount\textlevel
+\newcount\fileprocesslevel
+
+\setvalue{\c!file::0}{\jobname}
+
+\def\processedfile % is used in styles, don't change !
+ {\getvalue{\c!file::\number\fileprocesslevel}}
+
+\def\dostarttextfile#1%
+ {\global\advance\fileprocesslevel\plusone
+ \setxvalue{\c!file::\number\fileprocesslevel}{#1}%
+ \@EA\doglobal\@EA\addtocommalist\@EA{#1}\processedfiles}
+
+\def\dostoptextfile
+ {\global\advance\fileprocesslevel\minusone}
+
+\def\processlocalfile#1#2%
+ {#1{#2}\donothing{\readfile{#2}\donothing\donothing}}
+
+\def\processfile #1{\ctxlua{commands.processfile("#1")}}
+\def\doifinputfileelse #1{\ctxlua{commands.doifinputfileelse("#1")}}
+\def\locatefilepath #1{\edef\locatedfilepath{\ctxlua{commands.locatefilepath("#1")}}}
+\def\usepath [#1]{\edef\allinputpaths{\ctxlua{commands.usepath("#1")}}}
+\def\usesubpath [#1]{\edef\allinputpaths{\ctxlua{commands.usesubpath("#1")}}}
+\def\usezipfile {\dodoubleempty\dousezipfile}
+\def\dousezipfile[#1][#2]{\ctxlua{commands.usezipfile("#1","#2")}} % [filename] [optional subtree]
+
+\def\loadexamodes {\dosingleempty\doloadexamodes}
+\def\doloadexamodes [#1]{\ctxlua{commands.loadexamodes("#1")}}
+
+\def\registerfileinfo[#1#2]#3% geen \showmessage ?
+ {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}}
+
+\ifx\preloadfonts \undefined \let\preloadfonts \relax \fi
+\ifx\preloadspecials\undefined \let\preloadspecials\relax \fi
+
+\def\loadallsystemfiles#1#2%
+ {\ifx\@@svdirectory\empty
+ \readsysfile{#1}{\showmessage\m!systems2{#1}}{#2}%
+ \else% yet undocumented
+ \def\doloadsystemfile##1%
+ {\readsetfile{##1}{#1}{\showmessage\m!systems2{#1}}{#2}}%
+ \processcommacommand[\@@svdirectory]\doloadsystemfile
+ \fi}
+
+\ifx\disableXML\undefined \let\disableXML\relax \fi
+
+\def\loadsystemfiles
+ {\reportprotectionstate
+ \readsysfile\f!newfilename{\showmessage\m!systems2\f!newfilename}\donothing
+ %\readsysfile\f!oldfilename{\showmessage\m!systems2\f!oldfilename}\donothing
+ \loadallsystemfiles\f!filfilename
+ \donothing
+ \loadallsystemfiles\f!sysfilename
+ {\loadallsystemfiles{\f!sysfilename.rme}\donothing % new, fall back
+ \doglobal\appendtoks % brrr better \setcatcodetable\ctxcatcodes % % test
+ \bgroup\disableXML\loadallsystemfiles\f!errfilename\donothing\egroup
+ \to\everygoodbye}}
+
+%D We don't want multiple jobfiles to interfere.
+
+\def\loadoptionfile
+ {\readjobfile{\jobname.\f!optionextension}
+ {\showmessage\m!systems2{\jobname.\f!optionextension}%
+ \ctxlua{commands.logoptionfile("\jobname.\f!optionextension")}}%
+ {\writestatus\m!systems {no \jobname.\f!optionextension}}}
+
+% Most natural ...
+%
+% \def\doateverystarttext
+% {\the\everystarttext
+% \global\let\doateverystarttext\relax}
+%
+% ... most practical, since we can load env's in a
+% something.run file (nested \starttext's; see for
+% instance x-res-08, where we definitely want to
+% open the file!).
+
+\def\doateverystarttext
+ {\the\everystarttext
+ \global\everystarttext\emptytoks}
+
+\unexpanded\def\starttext
+ {\doateverystarttext
+ \ifcase\textlevel
+ \registerfileinfo[begin]\jobfilename
+ \fi
+ \global\advance\textlevel\plusone}
+
+\unexpanded\def\stoptext
+ {\global\advance\textlevel\minusone
+ \ifnum\textlevel>\zerocount \else
+ \flushfinallayoutpage % optional
+ \page % anyway
+ \the\everystoptext
+ %\the\everybye %
+ %\the\everygoodbye % == \end (new)
+ %\expandafter\normalend %
+\ifcase\textlevel
+ \registerfileinfo[end]\jobfilename
+\fi
+ \expandafter\finalend
+ \fi}
+
+\def\forcequitjob#1%
+ {\writestatus\m!systems{forcing quit: #1}%
+ \batchmode
+ \dorecurse\textlevel{\stoptext}
+ \normalend}
+
+\let\autostoptext\relax
+
+\def\autostarttext
+ {\ifcase\textlevel
+ \starttext
+ \writestatus\m!systems{auto \string\starttext..\string\stoptext}%
+ \let\autostoptext\stoptext
+ \fi}
+
+\def\finalend
+ {\ifnum\textlevel>\zerocount \else
+ \the\everybye
+ \the\everygoodbye
+ \doifsometokselse\everynotabene{\writeline\the\everynotabene\writeline}\donothing
+ \global\everybye \emptytoks % rather unneeded
+ \global\everygoodbye\emptytoks % but for sure
+ \expandafter\normalend
+ \fi}
+
+\let\end\finalend
+
+\def\emergencyend
+ {\writestatus\m!systems{invalid \@EA\string\csname\e!start\v!text\endcsname...\@EA\string\csname\e!stop\v!text\endcsname\space structure}%
+ \stoptext}
+
+\def\currentfile{\inputfilename}
+
+\def\doexecutefileonce#1%
+ {\beforesplitstring#1\at.\to\currentfile
+ \fullexpandtwoargsafter\doifnotinset\currentfile\loadedfiles
+ {\fullexpandoneargafter\addtocommalist\currentfile\loadedfiles
+ \doexecutefile{#1}}}
+
+\def\doexecutefile#1%
+ {\registerfileinfo[begin]{#1}%
+ \dostarttextfile{#1}%
+ \processfile{#1}%
+ \dostoptextfile
+ \registerfileinfo[end]{#1}}
+
+\def\donotexecutefile#1%
+ {}
+
+\def\useenvironment[#1]% maybe commalist
+ {\environment #1 \relax}
+
+\def\environment #1 % at outermost level only (load only once)
+ {\pushmacro\startenvironment
+ \pushmacro\stopenvironment
+ \unexpanded\def\startenvironment ##1 {}%
+ \let\stopenvironment\relax
+ \startreadingfile
+ \doexecutefileonce{#1}
+ \stopreadingfile
+ \popmacro\stopenvironment
+ \popmacro\startenvironment}
+
+\def\component #1 % at outermost level only
+ {\dostarttextfile{#1}%
+ \processfile{#1}%
+ \dostoptextfile}
+
+\newcount\filelevel
+
+\let\currentcomponent \v!text
+\let\currentcomponentpath\f!currentpath
+
+\def\donextlevel#1#2#3#4#5#6#7\\%
+ {\pushmacro\currentcomponent
+ \pushmacro\currentcomponentpath
+ \let\currentcomponent#1%
+ \setsystemmode\currentcomponent
+ \splitfilename{#1}%
+ \ifx\splitoffpath\empty
+ \let\currentcomponentpath\f!currentpath
+ \else
+ \let\currentcomponentpath\splitoffpath
+ \fi
+ \beforesplitstring#7\at.\to#2\relax % can become path + base
+ \ifcase\filelevel\relax
+ \starttext
+ \def\project ##1 {#3{##1}}%
+ \def\environment ##1 {#4{##1}}%
+ \def\product ##1 {#5{##1}}%
+ \def\component ##1 {#6{##1}}%
+ \fi
+ \advance\filelevel\plusone
+ \fullexpandoneargafter\addtocommalist{#1}\loadedfiles}
+
+\def\doprevlevel
+ {\popmacro\currentcomponentpath
+ \popmacro\currentcomponent
+ \setsystemmode\currentcomponent
+ \ifnum\filelevel=\plusone
+ \expandafter\stoptext
+ \else
+ \advance\filelevel\minusone
+ \expandafter\endinput
+ \fi}
+
+\unexpanded\def\startproject #1 %
+ {\donextlevel\v!project\currentproject
+ \donotexecutefile\doexecutefileonce
+ \doexecutefileonce\doexecutefile#1\\}
+
+\unexpanded\def\startproduct #1 %
+ {\doateverystarttext
+ \donextlevel\v!product\currentproduct
+ \doexecutefileonce\doexecutefileonce
+ \donotexecutefile\doexecutefile#1\\}
+
+\unexpanded\def\startcomponent #1 %
+ {\doateverystarttext
+ \donextlevel\v!component\currentcomponent
+ \doexecutefileonce\doexecutefileonce
+ \donotexecutefile\doexecutefile#1\\}
+
+\unexpanded\def\startenvironment #1 %
+ {\donextlevel\v!environment\currentenvironment
+ \donotexecutefile\doexecutefileonce
+ \donotexecutefile\donotexecutefile#1\\}
+
+% \startproject test
+% 1: \startmode[*project] project \stopmode \endgraf
+% 2: \startmode[*product] product \stopmode \endgraf
+% \stopproject
+
+\unexpanded\def\stopproject {\doprevlevel}
+\unexpanded\def\stopproduct {\doprevlevel}
+\unexpanded\def\stopcomponent {\doprevlevel}
+\unexpanded\def\stopenvironment{\doprevlevel}
+
+% more or less replaced by modes
+
+\setvalue{\e!start\v!localenvironment}[#1]%
+ {\let\loadedlocalenvironments\empty
+ \def\docommand##1%
+ {\beforesplitstring##1\at.\to\someevironment
+ \fullexpandoneargafter\addtocommalist\someevironment\loadedlocalenvironments}%
+ \processcommalist[#1]\docommand
+ \fullexpandtwoargsafter\doifcommonelse % no longer next needed
+ {\currentproject,\currentproduct,%
+ \currentcomponent,\currentenvironment}
+ {\loadedlocalenvironments}
+ {\letvalue{\e!stop\v!localenvironment}\relax}
+ {\grabuntil{\e!stop\v!localenvironment}\gobbleoneargument}} % TH: fixed, was \relax
+
+\setvalue{\v!localenvironment}#1 {\doexecutefileonce{#1}}
+
+% NOT TOEVOEGEN: \the\everytrace
+
+\neverypar\emptytoks
+
+% \appendtoks \flushnotes \to \everypar
+% \appendtoks \synchronizesidefloats \to \everypar
+% \appendtoks \checkindentation \to \everypar
+% \appendtoks \showparagraphnumber \to \everypar
+% \appendtoks \flushmargincontents \to \everypar
+% \appendtoks \flushcommentanchors \to \everypar
+% \appendtoks \synchronizenotes \to \everypar
+
+% \appendtoks \flushnotes \to \everydisplay
+% \appendtoks \adjustsidefloatdisplaylines \to \everydisplay
+
+\protect \endinput
diff --git a/tex/context/base/core-mis.mkii b/tex/context/base/core-mis.mkii
new file mode 100644
index 000000000..98079830d
--- /dev/null
+++ b/tex/context/base/core-mis.mkii
@@ -0,0 +1,2742 @@
+%D \module
+%D [ file=core-mis,
+%D version=1998.01.29,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Miscelaneous,
+%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 / Misc Commands}
+
+% todo: kleur in legenda + letter
+
+% %D You would not expect the next macro in \CONTEXT,
+% %D wouldn't you? It's there to warn \LATEX\ users that
+% %D something is wrong.
+% %D
+% %D Obsolete now:
+% %
+% % \def\documentstyle{\showmessage\m!systems3\empty\stoptekst}
+% %
+% % \let\documentclass=\documentstyle
+% %D \macros
+% %D {simplifiedcommands, simplifycommands}
+% %D
+% %D I first needed this simplification in bookmarks. Users can
+% %D add their own if needed.
+
+\unprotect
+
+%D Sometimes (for instance in bookmarks) we need to simplify macro
+%D behaviour, so here is the hook.
+
+\ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
+
+\def\simplifycommands{\the\simplifiedcommands}
+
+%D A possibly growing list:
+
+%appendtoks \def\executesynonym#1#2#3#4{#3}\to\simplifiedcommands
+%appendtoks \def\executesort#1#2#3{#3}\to\simplifiedcommands
+
+\appendtoks \def\ { }\to\simplifiedcommands
+\appendtoks \def\type#1{\letterbackslash\strippedcsname#1}\to\simplifiedcommands
+\appendtoks \def\tex#1{\letterbackslash#1}\to\simplifiedcommands
+\appendtoks \def\TeX{TeX}\to\simplifiedcommands
+\appendtoks \def\ConTeXt{ConTeXt}\to\simplifiedcommands
+\appendtoks \def\MetaPost{MetaPost}\to\simplifiedcommands
+\appendtoks \def\MetaFont{MetaFont}\to\simplifiedcommands
+\appendtoks \def\MetaFun{MetaFun}\to\simplifiedcommands
+%appendtoks \def||{-}\to\simplifiedcommands
+\appendtoks \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands
+
+\appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands
+
+% THIS WAS MAIN-002.TEX
+
+%\def\checkinterlineskip
+% {\ifvmode
+% \ifdim\lastskip>\zeropoint
+% \nointerlineskip
+% \else\ifdim\lastkern>\zeropoint
+% \nointerlineskip
+% \fi\fi
+% \fi}
+
+\def\horitems#1#2% #1=breedte #2=commandos
+ {\scratchdimen#1%
+ \divide\scratchdimen \nofitems
+ \!!counta\zerocount
+ \def\docommand##1%
+ {\advance\!!counta \plusone
+ \processaction
+ [\@@isalign]
+ [ \v!left=>\hbox to \scratchdimen{\strut##1\hss},
+ \v!right=>\hbox to \scratchdimen{\hss\strut##1},
+ \v!middle=>\hbox to \scratchdimen{\hss\strut##1\hss},
+ \v!margin=>\ifnum\!!counta=\plusone\hss\else\hfill\fi
+ \strut##1%
+ \ifnum\!!counta=\nofitems\hss\else\hfill\fi,
+ \s!default=>\hbox to \scratchdimen{\hss\strut##1\hss}, % midden
+ \s!unknown=>\hbox to \scratchdimen{\strut##1\hss}]}% % links
+ \hbox to #1{\hss#2\hss}}
+
+\def\veritems#1#2% #1=breedte #2=commandos
+ {\scratchdimen#1%
+ \def\docommand##1%
+ {\ifdim\scratchdimen<\zeropoint % the - was a signal
+ \hbox to -\scratchdimen{\hss\strut##1}%
+ \else\ifdim\scratchdimen>\zeropoint
+ \hbox to \scratchdimen{\strut##1\hss}%
+ \else
+ \hbox{\strut##1}%
+ \fi\fi}%
+ \vbox{#2}}
+
+\def\dosetupitems[#1]%
+ {\getparameters[\??is][#1]%
+ \doif\@@iswidth\v!unknown
+ {\def\@@iswidth{\hsize}}%
+ \doifconversiondefinedelse\@@issymbol
+ {\def\doitembullet##1{\convertnumber{\@@issymbol}{##1}}}
+ {\doifsymboldefinedelse\@@issymbol
+ {\def\doitembullet##1{\symbol[\@@issymbol]}}{}}}
+
+\def\makeitemsandbullets#1%
+ {\doifelse\@@isn\v!unknown
+ {\getcommalistsize[#1]%
+ \edef\nofitems{\commalistsize}}
+ {\edef\nofitems{\@@isn}}%
+ \setbox0\hbox
+ {\doitems \@@iswidth
+ {\processcommalist[#1]\docommand}}%
+ \setbox2\hbox
+ {\doitems \@@isbulletbreedte
+ {\dorecurse\nofitems
+ {\docommand{\strut\doitembullet\recurselevel}}}}}
+
+\def\dostartitems#1#2#3%
+ {\let\doitems#2%
+ \def\@@isbulletbreedte{#3}%
+ \makeitemsandbullets{#1}%
+ \@@isbefore}
+
+\def\dostopitems
+ {\@@isafter
+ \egroup}
+
+\setvalue{doitems\v!top}#1%
+ {\dostartitems{#1}\horitems\@@iswidth
+ \noindent\vbox
+ {\forgetall
+ \doifsomething\@@issymbol
+ {\doifnot\@@issymbol\v!none
+ {\box2
+ \@@isinbetween
+ \nointerlineskip}}%
+ \box0}%
+ \dostopitems}
+
+\setvalue{doitems\v!bottom}#1%
+ {\dostartitems{#1}\horitems\@@iswidth
+ \noindent\vbox
+ {\forgetall
+ \box0
+ \doifsomething\@@issymbol
+ {\@@isinbetween
+ \nointerlineskip
+ \box2}}%
+ \dostopitems}
+
+\setvalue{doitems\v!inmargin}#1%
+ {\dostartitems{#1}\veritems{-1.5em}% - is a signal
+ \noindent\hbox{\llap{\box2\hskip\leftmargindistance}\box0}%
+ \dostopitems}
+
+\setvalue{doitems\v!left}#1%
+ {\advance\hsize -1.5em%
+ \dostartitems{#1}\veritems{1.5em}%
+ \noindent\hbox{\box2\box0}%
+ \dostopitems}
+
+\setvalue{doitems\v!right}#1%
+ {\dostartitems{#1}\veritems{0em}%
+ \noindent\hbox{\box0\hskip-\wd2\box2}%
+ \dostopitems}
+
+\def\setupitems
+ {\dosingleargument\dosetupitems}
+
+\def\complexitems[#1]%
+ {\bgroup
+ \setupitems[#1]%
+ \parindent\zeropoint
+ \setlocalhsize
+ \hsize\localhsize
+ \dontcomplain
+ %\doifundefined{doitems\@@islocation}%
+ % {\let\@@islocation\v!left}%
+ %\getvalue{doitems\@@islocation}}
+ \executeifdefined{doitems\@@islocation}{\let\@@islocation\v!left}}
+
+\definecomplexorsimpleempty\items
+
+\setupitems
+ [\c!location=\v!left,
+ \c!symbol=5,
+ \c!width=\hsize,
+ \c!align=\v!middle,
+ \c!n=\v!unknown,
+ \c!before=\blank,
+ \c!inbetween={\blank[\v!medium]},
+ \c!after=\blank]
+
+% \definieerplaats[naam][instellingen]
+% \stelplaatsin[naam][instellingen]
+% \plaats<naam>[[instellingen]]
+%
+% - still undocumented and also not in setupb yet
+% - kan ook intern/direct (scheelt duplicatie), zie \framedtext
+
+\def\dodefineplacement[#1][#2]%
+ {\getparameters
+ [\??pl#1]
+ [\c!left=\hss,
+ \c!right=\hss,
+ \c!linecorrection=\v!off,
+ \c!depthcorrection=\v!off,
+ \c!margin=\v!standard,
+ \c!grid=\v!middle,
+ %\c!before=,
+ %\c!after=,
+ #2]%
+ \setvalue{\e!place#1}{\doplacement[\??pl#1]}}
+
+\def\defineplacement
+ {\dodoubleempty\dodefineplacement}
+
+\def\setupplacement
+ {\dodoubleempty\dosetupplacement}
+
+\def\dosetupplacement[#1]%
+ {\dodoubleempty\getparameters[\??pl#1]}
+
+\def\doplacement
+ {\dodoubleempty\dodoplacement}
+
+\def\dodoplacement[#1][#2]% correctie moet mooier
+ {\bgroup
+ \dowithnextboxcontent
+ {\forgetall}
+ {\setlocalhsize
+ \getparameters[#1][#2]%
+ \getvalue{#1\c!before}%
+ \begingroup
+ \disableparpositions
+ \setbox\nextbox\hbox to \localhsize
+ {\getvalue{#1\c!left}%
+ \flushnextbox
+ \getvalue{#1\c!right}}%
+ \ifinsidefloat \else
+ \addlocalbackgroundtobox\nextbox
+ \fi
+ \ifgridsnapping
+ \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}%
+ % unchecked
+ \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+ \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}%
+ \else
+ \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection
+ \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+ \flushnextbox
+ \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection
+ \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection
+ \fi
+ \endgroup
+ \getvalue{#1\c!after}%
+ \egroup}
+ \vbox}
+
+% Te zijner tijd [plaats=boven,onder,midden] implementeren,
+% in dat geval moet eerst de maximale hoogte worden bepaald.
+%
+% Overigens kan een en ander mooier met \halign.
+
+% there is quite some historic balast in this mechanism, the next variant
+% is a first cleanup
+
+\let\currentparagraph\empty
+
+\newcount\alcounter \newcount\alnsize \newdimen\alhsize
+
+\def\paragraphparameter#1% \checkedparameter\??al\currentparagraph#1
+ {\executeifdefined{\??al\currentparagraph#1}{\executeifdefined{\??al#1}\empty}}
+
+\def\paragraphcellmeter#1#2% \checkedparameter\??al\currentparagraph#1
+ {\executeifdefined{\??al\currentparagraph\number#1#2}{\paragraphparameter{#2}}}
+
+\def\dodefineparagraphs[#1][#2]%
+ {\edef\currentparagraph{#1}%
+ \setvalue{\s!do\s!next\currentparagraph}%
+ {\def\\{\getvalue\currentparagraph}}%
+ \setvalue\currentparagraph
+ {\getvalue{\s!do\s!next#1}%
+ \dostartparagraphs{#1}}%
+ \setvalue{\e!next\currentparagraph}%
+ {\getvalue{#1}}%
+ \setvalue{\e!start\currentparagraph}%
+ {\bgroup
+ \edef\currentparagraph{#1}%
+ \letvalue{\s!do\s!next\currentparagraph}\empty
+ \setvalue{\e!stop\currentparagraph}{\getvalue\currentparagraph\egroup}%
+ \getvalue\currentparagraph}%
+ \getparameters[\??al\currentparagraph]%
+ [%\c!n=3,
+ %\c!before=\blank,
+ %\c!after=\blank,
+ %\c!distance=1em,
+ %\c!height=\v!fit,
+ %\c!rule=\v!off,
+ %\c!command=,
+ %\c!align=,
+ %\c!tolerance=\v!tolerant,
+ %\c!rulethickness=\linewidth,
+ %\c!rulecolor=,
+ %\c!style=,
+ %\c!color=,
+ %\c!top=,
+ %\c!top=\vss,
+ %\c!bottom=\vfill,
+ #2]%
+ \setvalue{\e!setup#1\e!endsetup}%
+ {\setupparagraphs[#1]}%
+ \dorecurse
+ {\paragraphparameter\c!n}
+ {\setupparagraphs
+ [\currentparagraph]
+ [\recurselevel]
+ [\c!width=,
+ %\c!bottom=\paragraphparameter\c!bottom,
+ %\c!top=\paragraphparameter\c!top,
+ %\c!height=\paragraphparameter\c!height,
+ %\c!rule=\paragraphparameter\c!rule,
+ %\c!rulethickness=\paragraphparameter\c!rulethickness,
+ %\c!rulecolor=\paragraphparameter\c!rulecolor,
+ %\c!align=\paragraphparameter\c!align,
+ %\c!tolerance=\paragraphparameter\c!tolerance, % obsolete
+ %\c!distance=\paragraphparameter\c!distance,
+ \c!style=\paragraphparameter\c!style,
+ \c!color=\paragraphparameter\c!color]}%
+ \setupparagraphs[\currentparagraph][1][\c!distance=\zeropoint]}
+
+\def\defineparagraphs
+ {\dodoubleargument\dodefineparagraphs}
+
+\def\dosetupparagraphs[#1][#2][#3]%
+ {\edef\currentparagraph{#1}%
+ \ifsecondargument
+ \doifelse{#2}\v!each
+ {\dorecurse
+ {\paragraphparameter\c!n}
+ {\getparameters[\??al\currentparagraph\recurselevel][#3]}}
+ {\doifelsenothing{#3}
+ {\getparameters[\??al\currentparagraph][#2]}
+ {\def\docommand##1{\getparameters[\??al\currentparagraph##1][#3]}%
+ \processcommalist[#2]\docommand}}%
+ \else
+ \getparameters[\??al][#1]%
+ \fi}
+
+\def\setupparagraphs
+ {\dotripleempty\dosetupparagraphs}
+
+\setupparagraphs
+ [\c!n=3,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!distance=1em,
+ \c!height=\v!fit,
+ \c!rule=\v!off,
+ \c!command=,
+ \c!align=,
+ \c!tolerance=\v!tolerant, % obsolete
+ \c!rulethickness=\linewidth,
+ \c!rulecolor=,
+ \c!style=,
+ \c!color=,
+ \c!top=,
+ \c!top=\vss,
+ \c!bottom=\vfill]
+
+\def\doparagraphrule
+ {\doifelse{\paragraphcellmeter\alcounter\c!rule}\v!on
+ {\linewidth\paragraphcellmeter\alcounter\c!rulethickness
+ \scratchdimen\paragraphcellmeter\alcounter\c!distance
+ \advance\scratchdimen-\linewidth
+ \divide\scratchdimen \plustwo
+ \hskip\scratchdimen
+ \color[\paragraphcellmeter\alcounter\c!rulecolor]{\vrule\!!width\linewidth}%
+ \hskip\scratchdimen}
+ {\hskip\paragraphcellmeter\alcounter\c!distance}}
+
+\def\dostartparagraph
+ {\doifelsenothing{\paragraphcellmeter\alcounter\c!width}
+ {\!!widtha\alhsize
+ \divide\!!widtha \alnsize}
+ {\!!widtha\paragraphcellmeter\alcounter\c!width}%
+ \dostartattributes{\??al\currentparagraph\number\alcounter}\c!style\c!color\empty
+ \doifelse{\paragraphcellmeter\alcounter\c!height}\v!fit
+ {\setbox\scratchbox\vtop}
+ {\setbox\scratchbox\vtop to \paragraphcellmeter\alcounter\c!height}%
+ \bgroup
+ \blank[\v!disable]%
+ \forgetall
+ \paragraphcellmeter\alcounter\c!top
+ \paragraphparameter\c!inner
+ \hsize\!!widtha % setting \wd afterwards removed
+ \paragraphcellmeter\alcounter\c!inner % twice
+ \expanded{\setupalign [\paragraphcellmeter\alcounter\c!align ]}% {normal,verytolerant,stretch}
+ \expanded{\setuptolerance[\paragraphcellmeter\alcounter\c!tolerance]}% obsolete
+ \ignorespaces
+ \endgraf
+ \ignorespaces
+ %
+ % Nadeel van de onderstaande constructie is dat \everypar
+ % binnen een groep kan staan en zo steeds \begstruts
+ % worden geplaatst. Mooi is anders dus moet het anders!
+ %
+ % Hier is \Everypar niet nodig.
+ %
+ \everypar{\begstrut\everypar\emptytoks}%
+ %
+ \nospace % remove + ignore
+ \paragraphcellmeter\alcounter\c!command}
+
+\def\dostopparagraph
+ {\ifvmode
+ \removelastskip
+ \else
+ \unskip\endstrut\endgraf
+ \fi
+ \paragraphcellmeter\alcounter\c!bottom
+ \egroup
+ \ifdim\wd\scratchbox=\zeropoint % no data
+ \wd\scratchbox\!!widtha
+ \fi
+ \box\scratchbox
+ \dostopattributes
+ \ifnum\alcounter<\paragraphparameter\c!n\relax
+ \@EA\doparagraphcell
+ \else
+ \@EA\dostopparagraphs
+ \fi}
+
+\def\doparagraphcell
+ {\global\advance\alcounter \plusone
+ \doifelsenothing{\paragraphcellmeter\alcounter\c!distance}
+ {\ifnum\alcounter=\plusone\else
+ \hskip\paragraphparameter\c!distance
+ \fi}
+ {\ifnum\alcounter=\plusone
+ \hskip\paragraphcellmeter\alcounter\c!distance
+ \else
+ \doparagraphrule
+ \fi}%
+ \letvalue\currentparagraph\dostopparagraph
+ \dostartparagraph}
+
+\def\dostartparagraphs#1%
+ {\bgroup
+ \edef\currentparagraph{#1}%
+ \global\alcounter\zerocount
+ \parindent\zeropoint
+ \setlocalhsize
+ \alhsize\localhsize
+ \alnsize\paragraphparameter\c!n\relax
+ \dorecurse \alnsize
+ {\doifelsenothing{\paragraphcellmeter\recurselevel\c!distance}
+ {\ifnum\recurselevel=\plusone\else
+ \global\advance\alhsize -\paragraphparameter\c!distance
+ \fi}
+ {\global\advance\alhsize -\paragraphcellmeter\recurselevel\c!distance}%
+ \doifsomething{\paragraphcellmeter\recurselevel\c!width}
+ {\global\advance\alnsize \minusone
+ \global\advance\alhsize -\paragraphcellmeter\recurselevel\c!width}}%
+ %whitespace % gaat fout bij \framed
+ \paragraphparameter\c!before
+ \leavevmode % gaat wel goed bij \framed, brrr
+ \setbox\scratchbox\vbox\bgroup\hbox\bgroup\doparagraphcell}
+
+\def\dostopparagraphs
+ {\egroup
+ \egroup
+ \iftrue
+ \hbox{\raise\strutheight\box\scratchbox}% new
+ \else
+ \box\scratchbox % old
+ \fi
+ \par
+ \paragraphparameter\c!after
+ \egroup}
+
+\def\dosetuptab[#1]%
+ {\getparameters[\??ta]
+ [\c!headstyle=\v!normal,
+ \c!headcolor=,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!width=\v!broad,
+ \c!sample={\hskip4em},
+ \c!before=,
+ \c!after=,
+ #1]%
+ \definedescription
+ [tab]
+ [\c!headstyle=\@@taheadstyle,
+ \c!headcolor=\@@tacolor,
+ \c!sample=\@@tasample,
+ \c!width=\@@tawidth,
+ \c!before=\@@tabefore,
+ \c!after=\@@taafter]}
+
+\def\setuptab
+ {\dosingleargument\dosetuptab}
+
+\setuptab
+ [\c!location=\v!left]
+
+% The following macro's are derived from PPCHTEX and
+% therefore take some LaTeX font-switching into account.
+
+\newif\ifloweredsubscripts
+
+% Due to some upward incompatibality of LaTeX to LaTeX2.09
+% and/or LaTeX2e we had to force \@@chemieletter. Otherwise
+% some weird \nullfont error comes up.
+
+\doifundefined{@@chemieletter}{\def\@@chemieletter{\rm}}
+
+\def\beginlatexmathmodehack
+ {\ifmmode
+ \let\endlatexmathmodehack\relax
+ \else
+ \def\endlatexmathmodehack{$}$\@@chemieletter
+ \fi}
+
+\def\setsubscripts
+ {\beginlatexmathmodehack
+ \def\dosetsubscript##1##2##3%
+ {\dimen0=##3\fontexheight##2%
+ \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
+ ##1##2=\dimen0\relax}%
+ \def\dodosetsubscript##1##2%
+ {\dosetsubscript{##1}{\textfont2}{##2}%
+ \dosetsubscript{##1}{\scriptfont2}{##2}%
+ \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
+ %dodosetsubscript\mathsupnormal {?}%
+ \dodosetsubscript\mathsubnormal {.7}%
+ \dodosetsubscript\mathsubcombined{.7}%
+ \global\loweredsubscriptstrue
+ \endlatexmathmodehack}
+
+\def\resetsubscripts
+ {\ifloweredsubscripts
+ \beginlatexmathmodehack
+ \def\doresetsubscript##1##2%
+ {\dimen0=\getvalue{@@\string##1\string##2}\relax
+ ##1##2=\dimen0}%
+ \def\dodoresetsubscript##1%
+ {\doresetsubscript{##1}{\textfont2}%
+ \doresetsubscript{##1}{\scriptfont2}%
+ \doresetsubscript{##1}{\scriptscriptfont2}}%
+ %dodoresetsubscript\mathsupnormal
+ \dodoresetsubscript\mathsubnormal
+ \dodoresetsubscript\mathsubcombined
+ \global\loweredsubscriptsfalse
+ \endlatexmathmodehack
+ \fi}
+
+\let\beginlatexmathmodehack = \relax
+\let\endlatexmathmodehack = \relax
+
+\def\chem#1#2#3%
+ {\bgroup
+ \setsubscripts
+ \mathematics{\hbox{#1}_{#2}^{#3}}%
+ \resetsubscripts
+ \egroup}
+
+\unexpanded\def\celsius #1{#1\mathematics{^\circ}C}
+\unexpanded\def\inch {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
+\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
+
+% very dutch
+
+\unexpanded\def\graden {\mathematics{^\circ}}
+
+\def\bedragprefix {\euro\normalfixedspace}
+\def\bedragsuffix {}
+\def\bedragempty {\euro}
+
+\unexpanded\def\bedrag#1%
+ {\strut\hbox\bgroup
+ \let\normalfixedspace\nonbreakablespace
+ \doifelsenothing{#1}
+ {\bedragempty}
+ {\bedragprefix\digits{#1}\bedragsuffix}%
+ \egroup}
+
+% \definieeralineas[test][n=3]
+%
+% \stelalineasin[test][3][breedte=4cm,uitlijnen=links]
+%
+% \startopelkaar
+% \test hans \\ ton \\ \bedrag{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{~.~~1,--} \\
+% \test hans \\ ton \\ \bedrag{~.~~1,~~} \\
+% \test hans \\ ton \\ \bedrag{~.100,--} \\
+% \test hans \\ ton \\ \subtot{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{1.000,--} \\
+% \test hans \\ ton \\ \totaal{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{nihil,--} \\
+% \test hans \\ ton \\ \totaal{nihil,--} \\
+% \test hans \\ ton \\ \subtot{nihil,--} \\
+% \stopopelkaar
+
+\def\periodswidth {.5em}
+\def\periodsdefault{3} % was 5, but now it's like \unknown
+
+\unexpanded\def\periods
+ {\dosingleempty\doperiods}
+
+\def\doperiods[#1]%
+ {\dontleavehmode
+ \begingroup
+ \scratchdimen\periodswidth
+ \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
+ {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
+ \endgroup}
+
+\unexpanded\def\unknown
+ {\periods\relax} % relax prevents lookahead for []
+
+% compatibility macros
+
+\def\doorsnede
+ {\hbox{\rlap/$\circ$} }
+
+\unexpanded\def\ongeveer
+ {\mathematics\pm}
+
+\chardef\boundarycharactermode\plusone
+
+\def\midboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \languageparameter#1%
+ %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \or
+ \languageparameter#1%
+ \fi
+ \chardef\boundarycharactermode\plusone}
+
+\def\leftboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ \languageparameter#1%
+ \nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \or
+ \languageparameter#1%
+ \fi
+ \chardef\boundarycharactermode\plusone}
+
+\def\rightboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ \prewordbreak %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \languageparameter#1%
+ \or
+ \languageparameter#1%
+ \fi
+ \chardef\boundarycharactermode\plusone}
+
+% actually this is pretty old, but temporary moved here
+%
+% obsolete:
+
+\def\setuphyphenmark
+ {\dodoubleargument\getparameters[\??kp]}
+
+\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]
+
+\definehspace [sentence] [\zeropoint]
+\definehspace [intersentence] [.250em]
+
+\definesymbol
+ [\c!midsentence]
+ [\midboundarycharacter\c!midsentence{sentence}]
+
+\definesymbol
+ [\c!leftsentence]
+ [\leftboundarycharacter\c!leftsentence{sentence}]
+
+\definesymbol
+ [\c!rightsentence]
+ [\rightboundarycharacter\c!rightsentence{sentence}]
+
+\definesymbol
+ [\c!leftsubsentence]
+ [\leftboundarycharacter\c!leftsubsentence{sentence}]
+
+\definesymbol
+ [\c!rightsubsentence]
+ [\rightboundarycharacter\c!rightsubsentence{sentence}]
+
+\newsignal \subsentencesignal
+\newcounter\subsentencelevel
+
+\let\beforesubsentence\donothing
+\let\aftersubsentence \donothing
+
+% todo: make this language option
+%
+% \def\beforesubsentence{\removeunwantedspaces}
+% \def\aftersubsentence {\ignorespaces}
+
+\def\midsentence
+ {\symbol[\c!midsentence]}
+
+\def\beginofsubsentence
+ {\beforesubsentence
+ \ifdim\lastkern=\subsentencesignal
+ \unskip
+ \kern\hspaceamount\currentlanguage{intersentence}%
+ \fi
+ \doglobal\increment\subsentencelevel
+ \ifnum\subsentencelevel=\plusone
+ \dontleavehmode % was \leaveoutervmode
+ \fi
+ \symbol[\ifodd\subsentencelevel\c!leftsentence\else\c!leftsubsentence\fi]%
+ }% \ignorespaces}
+
+\def\endofsubsentence % relax prevents space gobbling
+ {\symbol[\ifodd\subsentencelevel\c!rightsentence\else\c!rightsubsentence\fi]%
+ \doglobal\decrement\subsentencelevel
+ \unskip
+ \kern\subsentencesignal\relax
+ \aftersubsentence}
+
+\def\beginofsubsentencespacing % relax prevents space gobbling
+ {\kern\subsentencesignal\relax}% \ignorespaces}
+
+\def\endofsubsentencespacing
+ {\ifdim\lastkern=\subsentencesignal
+ \unskip
+ \hskip\hspaceamount\currentlanguage{intersentence}%
+ % no good, actually language dependent:
+% \ignorespaces
+ \else
+ \unskip
+ \fi}
+
+%D \startbuffer
+%D test |<|test |<|test|>| test|>| test \par
+%D test|<|test|<|test|>|test|>|test \par
+%D test |<||<|test|>||>| test \par
+%D test \directdiscretionary{<}test\directdiscretionary{>} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+
+\def\startsubsentence{\beginofsubsentence \prewordbreak\beginofsubsentencespacing}
+\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+
+%D \defineXMLenvironment [subsentence]
+%D {|<|}
+%D {|>|}
+%D \defineXMLenvironment [subsentence]
+%D {\directdiscretionary{<}}
+%D {\directdiscretionary{>}}
+%D \defineXMLenvironment [subsentence]
+%D {\startsubsentence}
+%D {\stopsubsentence}
+%D
+%D \startbuffer
+%D test <subsentence>test</subsentence> test
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \processXMLbuffer
+
+\enableactivediscretionaries
+
+\definehspace [quotation] [\zeropoint]
+\definehspace [interquotation] [.125em]
+
+%definehspace [quote] [\zeropoint]
+%definehspace [speech] [\zeropoint]
+
+\definehspace [quote] [\hspaceamount\currentlanguage{quotation}]
+\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
+
+\definesymbol
+ [\c!leftquotation]
+ [\leftboundarycharacter\c!leftquotation{quotation}]
+
+\definesymbol
+ [\c!rightquotation]
+ [\rightboundarycharacter\c!rightquotation{quotation}]
+
+\definesymbol
+ [\c!leftquote]
+ [\leftboundarycharacter\c!leftquote{quote}]
+
+\definesymbol
+ [\c!rightquote]
+ [\rightboundarycharacter\c!rightquote{quote}]
+
+\definesymbol
+ [\c!leftspeech]
+ [\leftboundarycharacter\c!leftspeech{speech}]
+
+\definesymbol
+ [\c!rightspeech]
+ [\rightboundarycharacter\c!rightspeech{speech}]
+
+\definesymbol
+ [\c!middlespeech]
+ [\leftboundarycharacter\c!middlespeech{speech}]
+
+\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
+\appendtoks\def\quote #1{'#1'}\to\simplifiedcommands
+
+%D The next features was so desperately needed by Giuseppe
+%D Bilotta that he made a module for it. Since this is a
+%D typical example of core functionality, I decided to extend
+%D the low level quotation macros in such a way that a speech
+%D feature could be build on top of it. The speech opening and
+%D closing symbols are defined per language. Italian is an
+%D example of a language that has them set.
+
+% this will replace the quotation and speed definitions
+
+\newsignal\delimitedtextsignal
+
+\let\currentdelimitedtext\s!unknown
+
+\def\delimitedtextparameter#1% will be sped up
+ {\executeifdefined{\??ci\currentdelimitedtext:\csname\??ci\currentdelimitedtext\c!level\endcsname#1}%
+ {\executeifdefined{\??ci\currentdelimitedtext#1}%
+ {\executeifdefined{\??ci#1}\empty}}}
+
+\def\definedelimitedtext
+ {\dodoubleempty\dodefinedelimitedtext}
+
+\def\dodefinedelimitedtext[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\getparameters
+ [\??ci#1]
+ [\c!location=\v!margin, % \v!text \v!paragraph
+ \c!spacebefore=,
+ \c!spaceafter=\delimitedtextparameter\c!spacebefore,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\delimitedtextparameter\c!leftmargin,
+ \c!indentnext=\v!yes,
+ \c!before=,
+ \c!after=,
+ \c!left=,
+ \c!right=,
+ \c!level=0,
+ \c!repeat=\v!no,
+ \c!method=,
+ #2]}%
+ {\doifdefined{#2}
+ {\copyparameters[\??ci#1][\??ci#2]
+ [\c!location,\c!spacebefore,\c!spaceafter,\c!style,\c!color,
+ \c!leftmargin,\c!rightmargin,\c!indentnext,
+ \c!before,\c!after,\c!left,\c!right]}}%
+ \doifsomething{#1}
+ {\unexpanded\setvalue{#1}{\delimitedtext[#1]}%
+ \setvalue{\e!start#1}{\startdelimitedtext[#1]}%
+ \setvalue{\e!stop #1}{\stopdelimitedtext}}}
+
+\def\setupdelimitedtext
+ {\dotripleargument\dosetupdelimitedtext}
+
+\def\dosetupdelimitedtext[#1][#2][#3]% #2 = optional level
+ {\ifthirdargument
+ \getparameters[\??ci#1:#2][#3]%
+ \else\ifsecondargument
+ \getparameters[\??ci#1][#2]%
+ \else
+ \getparameters[\??ci][#1]%
+ \fi\fi}
+
+\def\dorepeatdelimitedtext
+ {\relax\ifcase\delimitedtextparameter\c!level\else
+ \dohandledelimitedtext\c!middle % maybe better \dohandleleftdelimitedtext
+ \fi}
+
+\let\dohandlerepeatdelimitedtext\relax
+
+\def\startdelimitedtext[#1]%
+ {\bgroup
+ \pushdelimitedtext{#1}%
+ \doifelse{\delimitedtextparameter\c!method}\s!font
+ {\def\dostopdelimitedtext
+ {\removeunwantedspaces\ignoredelimitedtext\c!right}%
+ \ignoredelimitedtext\c!left\ignorespaces}
+ {\doifelse{\delimitedtextparameter\c!repeat}\v!yes
+ {\let\dohandlerepeatdelimitedtext\dorepeatdelimitedtext}%
+ {\let\dohandlerepeatdelimitedtext\relax}%
+ \doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
+ {\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}
+
+\def\dostartdelimitedtextpar[#1]%
+ {\let\dostopdelimitedtext\dostopdelimitedtextpar
+ \doifsomething{\delimitedtextparameter\c!spacebefore}
+ {\blank[\delimitedtextparameter\c!spacebefore]}%
+ \delimitedtextparameter\c!before
+ % nicer:
+ % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+ % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+ % backward compatible:
+ \doifelsenothing{#1}
+ {\endgraf
+ \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+ \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+ \let\dodostopdelimitedtextpar\endgraf}
+ {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
+ % so far
+ % \dochecknextindentation{\??ci\currentdelimitedtext}% AM: not here
+ \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
+ \leftdelimitedtextmark
+ \ignorespaces}
+
+\def\dostopdelimitedtextpar
+ {\removeunwantedspaces
+ \removelastskip
+ \rightdelimitedtextmark
+ \dostopattributes
+ \dodostopdelimitedtextpar
+ \delimitedtextparameter\c!after
+ \doifsomething{\delimitedtextparameter\c!spaceafter}
+ {\blank[\delimitedtextparameter\c!spaceafter]}%
+ \dochecknextindentation{\??ci\currentdelimitedtext}% AM: here
+ \dorechecknextindentation}% AM: This was missing!
+
+\def\dostartdelimitedtexttxt
+ {\let\dostopdelimitedtext\dostopdelimitedtexttxt
+ \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
+ \dohandleleftdelimitedtext\c!left
+ \ignorespaces}
+
+\def\dostopdelimitedtexttxt
+ {\removeunwantedspaces
+ \dohandlerightdelimitedtext\c!right
+ \dostopattributes}
+
+\def\stopdelimitedtext
+ {\dostopdelimitedtext
+ \popdelimitedtext
+ \egroup}
+
+\def\pushdelimitedtext#1%
+ {\globalpushmacro\currentdelimitedtext
+ \def\currentdelimitedtext{#1}%
+ \doglobal\incrementvalue{\??ci\currentdelimitedtext\c!level}}
+
+\def\popdelimitedtext
+ {\doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
+ \globalpopmacro\currentdelimitedtext}
+
+\def\delimitedtext[#1]%
+ {\pushdelimitedtext{#1}%
+ \doifelse{\delimitedtextparameter\c!method}\s!font
+ {\dofontdrivendelimited}
+ {\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
+ \dodelimitedtextpar\dodelimitedtexttxt}}
+
+% shortcuts
+
+\def\startdelimited{\startdelimitedtext}
+\def\stopdelimited {\stopdelimitedtext} % no let, dynamically assigned
+\def\delimited {\delimitedtext}
+
+\def\leftdelimitedtextmark
+ {\doifsomething{\delimitedtextparameter\c!left}
+ {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
+ \dontleavehmode
+ \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
+ \box\scratchbox}}
+
+\def\rightdelimitedtextmark
+ {\doifsomething{\delimitedtextparameter\c!right}
+ {\hsmash{\delimitedtextparameter\c!right}}}
+
+% \starttext
+% \hyphenatedword{groepsvrijstellingsverordeningen}\par
+% \hyphenatedword{\quote{groepsvrijstellingsverordeningen}}\par
+% \dorecurse{100}{\hskip300pt\hskip\recurselevel pt test \quote{xxx xxxx}.\par}
+% \page \setuppapersize[A5][A4]
+% \quotation {overly beautiful pusillanimous sesquipedalian
+% longwinded} test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test
+% \stoptext
+
+\def\dohandledelimitedtext#1#2%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+% \ifdim\lastskip=\delimitedtextsignal
+% \unskip
+ \ifdim\lastkern=\delimitedtextsignal
+ \unkern
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else
+ #2%
+ \fi
+ \ifhmode % else funny pagebeaks
+ \penalty\!!tenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+% \penalty\!!tenthousand % else overfull boxes, but that's better than dangling periods
+ \kern\delimitedtextsignal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\def\dohandleleftdelimitedtext#1#2%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \ifdim\lastkern=\delimitedtextsignal
+ \unkern
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else\ifdim\lastskip=\delimitedtextsignal
+ \unskip
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else
+ #2%
+ \fi\fi
+ \strut % new, needed below
+ \ifhmode % else funny pagebeaks
+ \penalty\!!tenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+ \hskip\delimitedtextsignal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\def\dohandlerightdelimitedtext#1#2%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \ifdim\lastkern=\delimitedtextsignal
+ \unkern
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else\ifdim\lastskip=\delimitedtextsignal
+ \unskip
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else
+ #2%
+ \fi\fi
+ \ifhmode % else funny pagebeaks
+ \penalty\!!tenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+ \kern\delimitedtextsignal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\def\ignoredelimitedtext#1%
+ {\delimitedtextparameter#1}
+
+\def\handledelimitedtext#1%
+ {\dohandledelimitedtext{#1}\relax}
+
+\def\handleleftdelimitedtext#1%
+ {\dohandleleftdelimitedtext{#1}\relax}
+
+\def\handlerightdelimitedtext#1%
+ {\dohandlerightdelimitedtext{#1}\relax}
+
+\unexpanded\def\dodelimitedtextpar
+ {\dohandleleftdelimitedtext\c!left\relax
+ \groupedcommand
+ \donothing
+ {\dohandlerightdelimitedtext\c!right\removelastskip
+ \popdelimitedtext}}
+
+\unexpanded\def\dodelimitedtexttxt
+ {\doifelse{\delimitedtextparameter\c!style}\v!normal
+ \doquoteddelimited\doattributeddelimited}
+
+\def\doquoteddelimited
+ {\dohandleleftdelimitedtext\c!left\relax
+ \groupedcommand
+ \donothing
+ {\dohandlerightdelimitedtext\c!right
+ \removelastskip
+ \popdelimitedtext}}
+
+\def\doattributeddelimited
+ {\groupedcommand
+ {\dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color}
+ {\dostopattributes
+ \popdelimitedtext}}
+
+\def\dofontdrivendelimited
+ {\simplegroupedcommand
+ {\languageparameter{\c!left\currentdelimitedtext}}
+ {\languageparameter{\c!right\currentdelimitedtext}%
+ \popdelimitedtext}}
+
+% testcase for nesting:
+%
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+% \setupdelimitedtext[quotation][1][left=(,right=)]
+% \setupdelimitedtext[quotation][2][left={[},right={]}]
+% \setupdelimitedtext[quotation][3][left=\{,right=\}]
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+
+\definedelimitedtext
+ [\v!quotation]
+ [\c!left={\symbol[\c!leftquotation]},
+ \c!right={\symbol[\c!rightquotation]},
+ \c!leftmargin=\v!standard]
+
+\definedelimitedtext
+ [\v!quote][\v!quotation]
+
+\setupdelimitedtext
+ [\v!quote]
+ [\c!location=\v!text,
+ \c!left={\symbol[\c!leftquote]},
+ \c!right={\symbol[\c!rightquote]}]
+
+\definedelimitedtext
+ [\v!blockquote][\v!quotation]
+
+\setupdelimitedtext
+ [\v!blockquote]
+ [\c!left=,
+ \c!right=]
+
+\definedelimitedtext
+ [\v!speech][\v!quotation]
+
+\setupdelimitedtext
+ [\v!speech]
+ [\c!repeat=\v!yes,
+ \c!left={\symbol[\c!leftspeech]},
+ \c!middle={\symbol[\c!middlespeech]},
+ \c!right={\symbol[\c!rightspeech]}]
+
+% how do we call an tight quote
+%
+% \definedelimitedtext
+% [\v!quotation][\v!quotation]
+%
+% \setupdelimitedtext
+% [\v!quotation]
+% [\c!indentnext=\v!no,
+% \c!spacebefore=\v!nowhite]
+
+\def\setupquotation{\setupdelimitedtext[\v!quotation]}
+\def\setupquote {\setupdelimitedtext[\v!quote]}
+
+% seldom used, move from kernel to run time module
+
+\ifx\tfx\undefined \let\tfx\relax \fi
+
+\def\basegrid
+ {\dosingleempty\dobasegrid}
+
+\def\dobasegrid[#1]%
+ {\begingroup
+ \getparameters[\??rt]
+ [\c!x=0,\c!y=0,
+ \c!nx=10,\c!ny=10,
+ \c!dx=.5,\c!dy=.5,
+ \c!xstep=0,\c!ystep=0,
+ \c!unit=\s!cm,
+ \c!scale=1,
+ \c!factor=1,
+ \c!offset=\v!yes,
+ \c!location=\v!left,
+ #1]%
+ \startpositioning
+ \dimen0=\@@rtdx\@@rtunit\relax
+ \dimen0=\@@rtscale\dimen0\relax
+ \dimen0=\@@rtfactor\dimen0\relax
+ \multiply\dimen0 \@@rtnx\relax
+ \dimen2=\@@rtdy\@@rtunit\relax
+ \dimen2=\@@rtscale\dimen2\relax
+ \dimen2=\@@rtfactor\dimen2\relax
+ \multiply\dimen2 \@@rtny\relax
+ \def\horline
+ {\vbox
+ {\hrule
+ \!!width \dimen0
+ \!!height \linewidth
+ \!!depth \!!zeropoint}}%
+ \def\verline%
+ {\vrule
+ \!!width \linewidth
+ \!!height \dimen2
+ \!!depth \!!zeropoint}%
+ \doglobal\newcounter\@@gridc
+ \doglobal\newcounter\@@gridd
+ \doglobal\newcounter\@@gride
+ \def\setlegend##1##2##3%
+ {\gdef\@@gridc{0}%
+ \dimen0=2em\relax
+ \dimen2=##2\@@rtunit\relax
+ \dimen2=\@@rtscale\dimen2\relax
+ \dimen2=\@@rtfactor\dimen2\relax
+ \divide\dimen0 \dimen2\relax
+ \xdef\@@gride{\number\dimen0}%
+ \ifnum\@@gride>50
+ \gdef\@@gride{100}%
+ \else\ifnum\@@gride>10
+ \gdef\@@gride{50}%
+ \else\ifnum\@@gride>5
+ \gdef\@@gride{10}%
+ \else\ifnum\@@gride>1
+ \gdef\@@gride{5}%
+ \else
+ \gdef\@@gride{1}%
+ \fi\fi\fi\fi
+ \gdef\@@gridd{0}%
+ \def\legend
+ {\ifnum\@@gridd=\zerocount
+ \vbox
+ {\increment(\@@gridc,##1)%
+ \hbox to 2em{\hss\@@gridc\hss}}%
+ \global\let\@@gridd=\@@gride
+ \fi
+ \doglobal\decrement\@@gridd
+ \doglobal\increment(\@@gridc,##1)}}%
+ \def\draw##1##2##3##4##5##6##7##8##9%
+ {\setuppositioning
+ [\c!state=##8,
+ \c!xstep=\v!absolute,
+ \c!ystep=\v!absolute,
+ \c!unit=\@@rtunit,
+ \c!scale=\@@rtscale,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!xoffset=##6,
+ \c!yoffset=##7]%
+ \doifelse{##9}\v!middle
+ {\scratchdimen##3pt\scratchdimen.5\scratchdimen
+ \edef\@@psxx{\withoutpt\the\scratchdimen}%
+ \scratchdimen##4pt\scratchdimen.5\scratchdimen
+ \edef\@@psyy{\withoutpt\the\scratchdimen}%
+ \scratchcounter##2\advance\scratchcounter -1
+ \edef\@@pszz{\the\scratchcounter}}
+ {\edef\@@psxx{0}\edef\@@psyy{0}\edef\@@pszz{##2}}%
+ \position(\@@psxx,\@@psyy){##1}%
+ \setuppositioning
+ [\c!state=##8,
+ \c!xstep=\v!relative,
+ \c!ystep=\v!relative,
+ \c!scale=\@@rtscale,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!unit=\@@rtunit]%
+ \dorecurse\@@pszz{\position(##3,##4){##5}}}%
+ \draw
+ \verline\@@rtnx\@@rtdx0\verline\!!zeropoint\!!zeropoint\v!start\empty
+ \draw
+ \horline\@@rtny0\@@rtdy\horline\!!zeropoint\!!zeropoint\v!start\empty
+ \tfx
+ \doifnot\@@rtxstep{0}
+ {\setlegend\@@rtxstep\@@rtdx\@@rtx
+ \draw\legend\@@rtnx\@@rtdx0\legend{-1em}{-1.5em}\v!overlay\@@rtlocation}%
+ \doifnot\@@rtystep{0}
+ {\setlegend\@@rtystep\@@rtdy\@@rty
+ \draw\legend\@@rtny0\@@rtdy\legend{-2em}{-.75ex}\v!overlay\@@rtlocation}%
+ \stoppositioning
+ \endgroup}
+
+\let\grid\basegrid
+
+% Dit wordt:
+%
+% \doorverwijzen[naam][instellingen] enz.
+%
+% waarbij <naam> bijvoorbeeld publicatie is. Dit levert:
+%
+% \start<naam>
+% \stop<naam>
+%
+% \beginvan<naam>
+% \eindvan<naam>
+%
+% \publicatie
+%
+% \volledigelijstmetpublicaties
+%
+% eigenlijk kan ook door... zo worden uitgebreid!
+
+% old, will become obsolete or module, replace by bib module
+
+% \defineenumeration
+% [@publicatie]
+% [\c!location=\v!left,
+% \c!width=\@@pbwidth,\c!hang=,\c!sample=,
+% \c!before=\@@pbbefore,\c!after=\@@pbafter,\c!inbetween=,
+% \c!headstyle=\@@pbheadstyle,\c!style=,
+% \c!headcolor=\@@pbheadcolor,\c!color=,
+% \c!way=\@@pbway,\c!blockway=\@@pbblockway,
+% \c!text=,\c!left=\@@pbleft,\c!right=\@@pbright]
+
+% \def\dosetuppublications[#1]%
+% {\getparameters[\??pb][#1]}
+%
+% \def\setuppublications%
+% {\dosingleargument\dosetuppublications}
+%
+% \def\apa@publicatie
+% {\doifsomething\@@pb@naam {\@@pb@naam,\space}%
+% \doifsomething\@@pb@titel {{\sl\@@pb@titel}.\space}%
+% \doifsomething\@@pb@jaar {(\@@pb@jaar).\space}%
+% \doifsomething\@@pb@plaats {\@@pb@plaats\doifelsenothing\@@pb@uitgever{.}{:\space}}%
+% \doifsomething\@@pb@uitgever{\@@pb@uitgever.}}
+%
+% \def\normaal@publicatie
+% {\@@pb@naam, \@@pb@titel, \@@pb@jaar, \@@pb@pagina, \@@pb@plaats, \@@pb@uitgever.}
+%
+% \def\complexstartpublicatie[#1]#2\stoppublicatie
+% {\bgroup
+% \def\dosetpublicatie
+% {\processcommalist
+% [naam,titel,jaar,plaats,pagina,uitgever]
+% \setpublicatie
+% \ignorespaces}%
+% \def\setpublicatie##1%
+% {\letvalue{\??pb @##1}\empty
+% \setvalue{##1}####1{\setvalue{\??pb @##1}{####1}\ignorespaces}}%
+% \def\getpublicatie%
+% {\doifsomething\@@pbalternative{\getvalue{\@@pbalternative @publicatie}}}%
+% \doifelse\@@pbnumbering\v!yes
+% {\@publicatie[#1]\dosetpublicatie#2\getpublicatie\par}%
+% {\@@pbbefore
+% \dosetpublicatie\ignorespaces#2\getpublicatie
+% \@@pbafter}%
+% \egroup}
+%
+% \definecomplexorsimpleempty\startpublicatie
+%
+% \def\publication#1[#2]%
+% {\@@pbleft\in{#1}[#2]\@@pbright}
+%
+% \setuppublications
+% [\c!numbering=\v!yes,
+% \c!alternative=\c!apa,
+% \c!width=2em,
+% \c!hang=,
+% \c!sample=,
+% \c!before=,
+% \c!after=,
+% \c!inbetween=,
+% \c!headstyle=,
+% \c!headcolor=,
+% \c!style=,
+% \c!color=,
+% \c!blockway=\v!by\v!text,
+% \c!way=\v!by\v!text,
+% \c!text=,
+% \c!left={[},
+% \c!right={]}]
+
+% only used at pragma, move from kernel to run time module
+
+\def\referraldate
+ {\currentdate[\v!referral]}
+
+\def\doreferral[#1]%
+ {\noheaderandfooterlines
+ \bgroup
+ \getparameters
+ [\??km]
+ [\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
+ \c!from=,\c!to=,\c!ref=,#1]%
+ % moet anders, hoort niet in 01b
+ \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!sp=referencia]\to\@@@kmref
+ \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!sp=de]\to\@@@kmvan
+ \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!sp=a]\to\@@@kmaan
+ \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!sp=]\to\@@@kmbet
+ \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!sp=fecha]\to\@@@kmdat
+ \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!sp=]\to\@@@kmken
+ %
+ \definetabulate[\s!dummy][|l|p|]
+ \startdummy
+ \NC\@@@kmbet\EQ\@@kmbet\NC\NR
+ \NC\@@@kmdat\EQ\@@kmdat\NC\NR
+ \NC\@@@kmken\EQ\expanded{\smallcapped{\@@kmken}}\NC\NR
+ \doifsomething{\@@kmfrom\@@kmto}{\NC\NC\NC\NR}%
+ \doifsomething \@@kmfrom {\NC\@@@kmvan\EQ\@@kmfrom\NC\NR}%
+ \doifsomething \@@kmto {\NC\@@@kmaan\EQ\@@kmto\NC\NR}%
+ \doifsomething \@@kmref {\NC\NC\NC\NR\NC\@@@kmref\EQ\@@kmref\NC\NR}%
+ \stopdummy
+ \egroup}
+
+\def\referral
+ {\dosingleargument\doreferral}
+
+% FUZZY OLD STUFF: will be removed when not used in some manual;
+% rows instead of columns, i'd forgotten that this code exist
+%
+% \definesystemvariable{ri}
+%
+% \def\setuprows
+% {\dodoubleargument\getparameters[\??ri]}
+%
+% \definecomplexorsimpleempty\startrows
+%
+% \def\complexstartrows[#1]%
+% {\bgroup
+% \setuprows[#1]%
+% \let\do@@ribottom\relax
+% \def\row
+% {\do@@ribottom
+% \egroup
+% \dimen0\vsize
+% \divide\dimen0 \@@rin
+% \advance\dimen0 -\lineskip
+% \vbox to \dimen0
+% \bgroup
+% \@@ritop
+% \let\do@@ribottom\@@ribottom
+% \ignorespaces}%
+% \bgroup
+% \row}
+%
+% \def\stoprows
+% {\do@@ribottom
+% \egroup
+% \egroup}
+%
+% \setuprows
+% [\c!n=2,
+% \c!top=,
+% \c!bottom=\vfill]
+
+% THIS WAS MAIN-003.TEX
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+\definetabulate
+ [\v!legend]
+ [|emj1|i1|mR|]
+
+\setuptabulate
+ [\v!legend]
+ [\c!unit=.75em,\c!inner=\setquicktabulate\leg,EQ={=}]
+
+\definetabulate
+ [\v!legend][\v!two]
+ [|emj1|emk1|i1|mR|]
+
+\definetabulate
+ [\v!fact]
+ [|R|ecmj1|i1mR|]
+
+\setuptabulate
+ [\v!fact]
+ [\c!unit=.75em,\c!inner=\setquicktabulate\fact,EQ={=}]
+
+\unexpanded\def\xbox
+ {\bgroup\aftergroup\egroup\hbox\bgroup\tx\let\next=}
+
+\unexpanded\def\xxbox
+ {\bgroup\aftergroup\egroup\hbox\bgroup\txx\let\next=}
+
+% \def\mrm#1%
+% {$\rm#1$}
+
+%D \macros
+%D {definepairedbox, setuppairedbox, placepairedbox}
+%D
+%D Paired boxes, formally called legends, but from now on a
+%D legend is just an instance, are primarily meant for
+%D typesetting some text alongside an illustration. Although
+%D there is quite some variation possible, the functionality is
+%D kept simple, if only because in most cases such pairs are
+%D typeset sober.
+%D
+%D The location specification accepts a pair, where the first
+%D keyword specifies the arrangement, and the second one the
+%D alignment. The first key of the location pair is one of
+%D \type {left}, \type {right}, \type {top} or \type {bottom},
+%D while the second key can also be \type {middle}.
+%D
+%D The first box is just collected in an horizontal box, but
+%D the second one is a vertical box that gets passed the
+%D bodyfont and alignment settings.
+
+%D Today we would implement this using layers .... but for the
+%D moment we keep it this way.
+
+% \startbuffer[test]
+% \test left \test left,top \test left,bottom \test left,middle
+% \test right \test right,top \test right,bottom \test right,middle
+% \test top \test top,left \test top,right \test top,middle
+% \test bottom \test bottom,left \test bottom,right \test bottom,middle
+% \stopbuffer
+%
+% \def\showtest#1%
+% {\pagina
+% \typebuffer[demo]
+% \def\test##1
+% {\startlinecorrection[blank]
+% \getbuffer[demo]%
+% \ruledhbox\placelegend
+% [bodyfont=6pt,location={##1}]
+% {\framed[width=.25\textwidth]{\tttf##1}}
+% {#1}
+% \stoplinecorrection}
+% \getbuffer[test]}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=\hsize,maxwidth=\makeupwidth,
+% height=\vsize,maxheight=\makeupheight]
+% \stopbuffer
+%
+% \showtest{These examples demonstrate the default settings.}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=\textwidth,
+% maxwidth=\textwidth]
+% \stopbuffer
+%
+% \showtest{\input tufte }
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=.65\textwidth]
+% \stopbuffer
+%
+% \showtest{\input knuth }
+%
+% \startbuffer[demo]
+% \setuplegend
+% [height=2cm]
+% \stopbuffer
+%
+% \showtest{These examples demonstrate some other settings.}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=.65\textwidth,
+% height=2cm]
+% \stopbuffer
+%
+% \showtest{These examples demonstrate some other settings.}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [n=2,align=right,width=.5\textwidth]
+% \stopbuffer
+%
+% \showtest{\input zapf }
+
+%D \macros
+%D {setuplegend, placelegend}
+%D
+%D It makes sense to typeset a legend to a figure in \TEX\
+%D and not in a drawing package. The macro \type {\placelegend}
+%D combines a figure (or something else) and its legend. This
+%D command is just a paired box.
+%D
+%D The legend is placed according to \type {location}, being
+%D \type {bottom} or \type {right}. The macro macro is used as
+%D follows.
+%D
+%D \starttyping
+%D \placefigure
+%D {whow}
+%D {\placelegend
+%D {\externalfigure[cow]}
+%D {\starttabulation
+%D \NC 1 \NC head \NC \NR
+%D \NC 2 \NC legs \NC \NR
+%D \NC 3 \NC tail \NC \NR
+%D \stoptabulation}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend
+%D {\externalfigure[cow]}
+%D {\starttabulation[|l|l|l|l|]
+%D \NC 1 \NC head \NC 3 \NC tail \NC \NR
+%D \NC 2 \NC legs \NC \NC \NC \NR
+%D \stoptabulation}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2]
+%D {\externalfigure[cow]}
+%D {\starttabulation
+%D \NC 1 \NC head \NC \NR
+%D \NC 2 \NC legs \NC \NR
+%D \NC 3 \NC tail \NC \NR
+%D \stoptabulation}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2]
+%D {\externalfigure[cow]}
+%D {head \par legs \par tail}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2]
+%D {\externalfigure[cow]}
+%D {\startitemize[packed]
+%D \item head \item legs \item tail \item belly \item horns
+%D \stopitemize}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2,width=.8\hsize]
+%D {\externalfigure[cow]}
+%D {\startitemize[packed]
+%D \item head \item legs \item tail \item belly \item horns
+%D \stopitemize}}
+%D \stoptyping
+
+\newbox\firstpairedbox
+\newbox\secondpairedbox
+
+\def\definepairedbox
+ {\dodoubleempty\dodefinepairedbox}
+
+\def\dodefinepairedbox[#1][#2]%
+ {\getparameters
+ [\??ld#1]
+ [\c!n=1,
+ \c!distance=\bodyfontsize,
+ \c!before=,
+ \c!after=,
+ \c!color=,
+ \c!style=,
+ \c!inbetween={\blank[\v!medium]},
+ \c!width=\hsize,
+ \c!height=\vsize,
+ \c!maxwidth=\textwidth, % \makeupwidth,
+ \c!maxheight=\textheight, % \makeupheight,
+ \c!bodyfont=,
+ \c!align=,
+ \c!location=\v!bottom,
+ #2]%
+ \setvalue{\e!setup#1\e!endsetup}{\setuppairedbox[#1]}%
+ \setvalue{\e!place#1}{\placepairedbox[#1]}}
+
+\def\setuppairedbox
+ {\dodoubleempty\dosetuppairedbox}
+
+\def\dosetuppairedbox[#1]%
+ {\getparameters[\??ld#1]}
+
+\def\placepairedbox
+ {\bgroup\dodoubleempty\doplacepairedbox}
+
+\def\doplacepairedbox[#1][#2]% watch the hsize/vsize tricks
+ {\setuppairedbox[#1][#2]% % and don't change them
+ \copyparameters % brrr
+ [\??ld][\??ld#1]
+ [\c!n,\c!distance,\c!inbetween,\c!before,\c!after,
+ \c!width,\c!height,\c!maxwidth,\c!maxheight,
+ \c!color,\c!style,\c!bodyfont,\c!align,\c!location]%
+ \@@ldbefore\bgroup
+ \global\setsystemmode{pairedbox}%
+ \beforefirstpairedbox
+ \dowithnextbox
+ {\betweenbothpairedboxes
+ \dowithnextbox
+ {\afterbothpairedboxes
+ \egroup\@@ldafter
+ \egroup}
+ \vbox\bgroup
+ \insidesecondpairedbox
+ \let\next=}
+ \hbox}
+
+\def\beforefirstpairedbox
+ {\chardef\pairedlocationa1 % left
+ \chardef\pairedlocationb4 % middle
+ \getfromcommacommand[\@@ldlocation][1]%
+ \processaction
+ [\commalistelement]
+ [ \v!left=>\chardef\pairedlocationa0,
+ \v!right=>\chardef\pairedlocationa1,
+ \v!top=>\chardef\pairedlocationa2,
+ \v!bottom=>\chardef\pairedlocationa3]%
+ \getfromcommacommand[\@@ldlocation][2]%
+ \processaction
+ [\commalistelement]
+ [ \v!left=>\chardef\pairedlocationb0,
+ \v!right=>\chardef\pairedlocationb1,
+ \v!high=>\chardef\pairedlocationb2,
+ \v!top=>\chardef\pairedlocationb2,
+ \v!low=>\chardef\pairedlocationb3,
+ \v!bottom=>\chardef\pairedlocationb3,
+ \v!middle=>\chardef\pairedlocationb4]}
+
+\def\betweenbothpairedboxes
+ {\switchtobodyfont[\@@ldbodyfont]% split under same regime
+ \setbox\firstpairedbox\flushnextbox
+ \ifnum\pairedlocationa<2
+ \hsize\wd\firstpairedbox % trick
+ \hsize\@@ldwidth
+ \scratchdimen\wd\firstpairedbox
+ \advance\scratchdimen \@@lddistance
+ \bgroup\advance\scratchdimen \hsize
+ \ifdim\scratchdimen>\@@ldmaxwidth\relax
+ \egroup
+ \hsize\@@ldmaxwidth
+ \advance\hsize -\scratchdimen
+ \else
+ \egroup
+ \fi
+ \else
+ \hsize\wd\firstpairedbox
+ \hsize\@@ldwidth % can be \hsize
+ \ifdim\hsize>\@@ldmaxwidth\relax \hsize\@@ldmaxwidth \fi % can be \hsize
+ \fi
+ \ifnum\@@ldn>\plusone
+ \setrigidcolumnhsize\hsize\@@lddistance\@@ldn
+ \fi}
+
+\def\afterbothpairedboxes
+ {\setbox\secondpairedbox\vbox
+ {% \localstartcolor[\@@ldcolor]% does not work yet
+ \ifnum\@@ldn>1
+ \rigidcolumnbalance\nextbox
+ \else
+ \flushnextbox
+ \fi
+ }% \localstopcolor}%
+ \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize
+ \forgetall
+ \ifnum\pairedlocationa<2
+ \scratchdimen\maxoftwoboxdimens\ht\firstpairedbox\secondpairedbox
+ \vsize\scratchdimen
+ \ifdim\scratchdimen<\@@ldheight\relax % can be \vsize
+ \scratchdimen\@@ldheight
+ \fi
+ \ifdim\scratchdimen>\@@ldmaxheight\relax
+ \scratchdimen\@@ldmaxheight
+ \fi
+ \valignpairedbox\firstpairedbox \scratchdimen
+ \valignpairedbox\secondpairedbox\scratchdimen
+ \else
+ \scratchdimen\maxoftwoboxdimens\wd\firstpairedbox\secondpairedbox
+ \halignpairedbox\firstpairedbox \scratchdimen
+ \halignpairedbox\secondpairedbox\scratchdimen
+ \scratchdimen\ht\secondpairedbox
+ \vsize\scratchdimen
+ \ifdim\ht\secondpairedbox<\@@ldheight\relax % can be \vsize
+ \scratchdimen\@@ldheight\relax % \relax needed
+ \fi
+ \ifdim\scratchdimen>\@@ldmaxheight\relax % todo: totale hoogte
+ \scratchdimen\@@ldmaxheight\relax % \relax needed
+ \fi
+ \ifdim\scratchdimen>\ht\secondpairedbox
+ \setbox\secondpairedbox\vbox to \scratchdimen
+ {\ifnum\pairedlocationa=3 \vss\fi %
+ \box\secondpairedbox
+ \ifnum\pairedlocationa=2 \vss\fi}% \kern\zeropoint
+ \fi
+ \fi
+ \ifcase\pairedlocationa
+ \box\secondpairedbox\hskip\@@lddistance\box\firstpairedbox \or
+ \box\firstpairedbox \hskip\@@lddistance\box\secondpairedbox\or
+ \box\secondpairedbox\endgraf \nointerlineskip \@@ldinbetween \box\firstpairedbox \or
+ \box\firstpairedbox \endgraf \nointerlineskip \@@ldinbetween \box\secondpairedbox\else
+ \fi
+ \egroup}
+
+\def\insidesecondpairedbox
+ {\forgetall
+ \setupalign[\@@ldalign]%
+ \tolerantTABLEbreaktrue % hm.
+ \blank[\v!disable]%
+ \everypar{\begstrut}}
+
+\def\maxoftwoboxdimens#1#2#3%
+ {#1\ifdim#1#2>#1#3 #2\else#3\fi}
+
+\def\valignpairedbox#1#2%
+ {\setbox#1\vbox to #2
+ {\ifcase\pairedlocationb\or\or\or\vss\or\vss\fi
+ \box#1\relax
+ \ifcase\pairedlocationb\or\or\vss\or\or\vss\fi}}
+
+\def\halignpairedbox#1#2%
+ {\setbox#1\hbox to #2
+ {\ifcase\pairedlocationb\or\hss\or\or\or\hss\fi
+ \box#1\relax
+ \ifcase\pairedlocationb\hss\or\or\or\or\hss\fi}}
+
+\definepairedbox[\v!legend]
+
+%D Goody:
+
+\appendtoks
+ \global\resetsystemmode{combination}%
+ \global\resetsystemmode{pairedbox}%
+\to \everyinsidefloat
+
+% todo: \startcombination \startcomb \stopcomb ...
+
+\newcount\horcombination % counter
+\newcount\totcombination
+
+\def\definecombination
+ {\dodoubleempty\dodefinecombination}
+
+\def\dodefinecombination[#1][#2]%
+ {\copyparameters
+ [\??co#1][\??co]
+ [\c!width,\c!height,\c!distance,\c!location,%
+ \c!before,\c!inbetween,\c!after,\c!align,%
+ \c!style,\c!color]%
+ \getparameters
+ [\??co#1][#2]}
+
+\def\setupcombinations
+ {\dodoubleempty\dosetupcombinations}
+
+\def\dosetupcombinations[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??co#1][#2]%
+ \else
+ \getparameters[\??co][#1]%
+ \fi}
+
+\def\combinationparameter#1%
+ {\csname\??co\currentcombination#1\endcsname}%
+
+\def\startcombination
+ {\bgroup % so we can grab a group
+ \dodoubleempty\dostartcombination}
+
+% \startcombination {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2*1] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[1*2] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2] {alpha} {a} {beta} {b} \stopcombination
+
+\def\dostartcombination[#1][#2]%
+ {\global\setsystemmode{combination}%
+ \doifnothing{#1}\firstargumentfalse % to be sure (when called in macros)
+ \doifnothing{#2}\secondargumentfalse % to be sure (when called in macros)
+ \ifsecondargument
+ \def\currentcombination{#1}%
+ \edef\currentcombinationspec{#2*1*}%
+ \else % better : \doifcombinationelse ... \??co#1\c!location
+ \doifinstringelse{*}{#1}
+ {\let\currentcombination\empty
+ \edef\currentcombinationspec{#1*1*}}
+ {\doifnumberelse{#1}
+ {\let\currentcombination\empty
+ \edef\currentcombinationspec{#1*1*}}
+ {\def\currentcombination{#1}%
+ \edef\currentcombinationspec{2*1*}}}%
+ \fi
+ \forgetall
+ \doifelse{\combinationparameter\c!height}\v!fit
+ \vbox {\vbox to \combinationparameter\c!height}%
+ \bgroup
+ \expanded{\dodostartcombination[\currentcombinationspec]}}
+
+\long\def\dodostartcombination[#1*#2*#3]%
+ {\setuphorizontaldivision
+ [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
+ \global\horcombination#1%
+ \global\totcombination#2%
+ \global\setbox\combinationstack\emptybox
+ \xdef\maxhorcombination{\the\horcombination}%
+ \multiply\totcombination\horcombination
+ \tabskip\zeropoint
+ \doifelse{\combinationparameter\c!width}\v!fit
+ {\halign}{\halign to \combinationparameter\c!width}%
+ \bgroup&%
+ %\hfil##\hfil% now : location={left,top}
+ \expanded{\doifnotinset{\v!left}{\combinationparameter\c!location}}\hfil
+ ##%
+ \expanded{\doifnotinset{\v!right}{\combinationparameter\c!location}}\hfil
+ &\tabskip\zeropoint \!!plus 1fill##\cr
+ \docombination}
+
+\def\docombination % we want to add struts but still ignore an empty box
+ {\dowithnextbox
+ {\setbox0\flushnextbox
+ \dowithnextbox
+ {\setbox2\flushnextbox
+ \dodocombination}%
+ \vtop\bgroup
+ \def\next
+ {\futurelet\nexttoken\nextnext}%
+ \def\nextnext
+ {\ifx\nexttoken\egroup \else % the next box is empty
+ \hsize\wd0
+ \setupalign[\combinationparameter\c!align]%
+ \dostartattributes{\??co\currentcombination}\c!style\c!color\empty
+ \bgroup
+ \aftergroup\endstrut
+ \aftergroup\dostopattributes
+ \aftergroup\egroup
+ \begstrut
+ \fi}%
+ \afterassignment\next\let\nexttoken=}
+ \hbox}
+
+% stupid version, does not align top stuff when captions,
+% keep as example
+%
+% \def\dodocombination
+% {\vbox
+% {\forgetall % \setupwhitespace[\v!none]%
+% \let\next\vbox
+% \ExpandFirstAfter\processallactionsinset
+% [\combinationparameter\c!location]
+% [ \v!top=>\let\next\tbox,
+% \v!middle=>\let\next\halfwaybox]%
+% \next{\copy0}%
+% \ifdim\ht2>\zeropoint % beter dan \wd2, nu \strut mogelijk
+% \combinationparameter\c!inbetween
+% %\vtop % wrong code
+% % {\nointerlineskip % recently added
+% % \hsize\wd0
+% % \setupalign[\combinationparameter\c!align]% % \raggedcenter
+% % \begstrut\unhbox2\endstrut}%
+% \box2
+% \fi}%
+% \ifnum\totcombination>\plusone
+% \global\advance\totcombination\minusone
+% \global\advance\horcombination\minusone
+% \ifnum\horcombination=\zerocount
+% \def\next
+% {\cr\noalign
+% {\forgetall % \setupwhitespace[\v!geen]% no
+% \nointerlineskip
+% \combinationparameter\c!before
+% \combinationparameter\c!after
+% \vss
+% \nointerlineskip}%
+% \global\horcombination\maxhorcombination\relax
+% \docombination}%
+% \else
+% \def\next
+% {&&&\hskip\combinationparameter\c!distance&\docombination}%
+% \fi
+% \else
+% \def\next
+% {\cr\egroup}%
+% \fi
+% \next}
+
+% \def\dodocombination
+% {\vbox
+% {\forgetall % \setupwhitespace[\v!none]%
+% \let\next\vbox
+% \ExpandFirstAfter\processallactionsinset
+% [\combinationparameter\c!plaats]
+% [ \v!top=>\let\next\tbox,
+% \v!middle=>\let\next\halfwaybox]%
+% \next{\copy0}%
+% % we need to save the caption for a next alignment line
+% \saveoncombinationstack2}%
+% \ifnum\totcombination>\plusone
+% \global\advance\totcombination\minusone
+% \global\advance\horcombination\minusone
+% \ifnum\horcombination=\zerocount
+% \def\next
+% {\cr
+% \flushcombinationstack
+% \noalign
+% {\forgetall % \setupwhitespace[\v!none]% no
+% \global\setbox\combinationstack\emptybox
+% \nointerlineskip
+% \combinationparameter\c!after
+% \combinationparameter\c!before
+% \vss
+% \nointerlineskip}%
+% \global\horcombination\maxhorcombination\relax
+% \docombination}%
+% \else
+% \def\next
+% {&&&\hskip\combinationparameter\c!distance&\docombination}%
+% \fi
+% \else
+% \def\next
+% {\cr
+% \flushcombinationstack
+% \egroup}%
+% \fi
+% \next}
+
+\def\depthonlybox
+ {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}
+
+% \def\boxwithstrutheight
+% {\dowithnextbox
+% {\scratchdimen\strutheight
+% \advance\scratchdimen-\nextboxht
+% \hbox{\raise\scratchdimen\box\nextbox}}%
+% \vbox}
+
+\def\dodocombination
+ {\vbox
+ {\forgetall % \setupwhitespace[\v!none]%
+ \let\next\vbox
+ \expanded{\processallactionsinset[\combinationparameter\c!location]}
+ [ \v!top=>\let\next\depthonlybox, % \tbox,
+ \v!middle=>\let\next\halfwaybox]%
+ \next{\copy0}%
+ % we need to save the caption for a next alignment line
+ \saveoncombinationstack2}%
+ \ifnum\totcombination>\plusone
+ \global\advance\totcombination\minusone
+ \global\advance\horcombination\minusone
+ \ifnum\horcombination=\zerocount
+ \def\next
+ {\cr
+ \flushcombinationstack
+ \noalign
+ {\forgetall % \setupwhitespace[\v!none]% no
+ \global\setbox\combinationstack\emptybox
+ \nointerlineskip
+ \combinationparameter\c!after
+ \combinationparameter\c!before
+ \vss
+ \nointerlineskip}%
+ \global\horcombination\maxhorcombination\relax
+ \docombination}%
+ \else
+ \def\next
+ {&&&\hskip\combinationparameter\c!distance&\docombination}%
+ \fi
+ \else
+ \def\next
+ {\cr
+ \flushcombinationstack
+ \egroup}%
+ \fi
+ \next}
+
+% formally ok:
+%
+% \def\stopcombination
+% {\egroup
+% \egroup}
+%
+% more robust:
+%
+% \def\stopcombination
+% {{}{}{}{}{}{}{}{}% catches (at most 4) missing entries
+% \egroup
+% \egroup}
+%
+% even better:
+
+\def\stopcombination
+ {{\scratchtoks{{}{}{}}\dorecurse\totcombination{\appendtoks{}{}{}{}\to\scratchtoks}\expandafter}\the\scratchtoks
+ \egroup
+ \egroup}
+
+\newbox\combinationstack
+
+\def\saveoncombinationstack#1%
+ {\global\setbox\combinationstack\hbox
+ {\hbox{\box#1}\unhbox\combinationstack}}
+
+\def\flushcombinationstack
+ {\noalign
+ {\ifdim\ht\combinationstack>\zeropoint
+\nointerlineskip % nieuw
+ \combinationparameter\c!inbetween
+ \global\horcombination\maxhorcombination
+ \globallet\doflushcombinationstack\dodoflushcombinationstack
+ \else
+ \global\setbox\combinationstack\emptybox
+ \globallet\doflushcombinationstack\donothing
+ \fi}%
+ \doflushcombinationstack\crcr}
+
+\gdef\dodoflushcombinationstack
+ {\global\setbox\combinationstack\hbox
+ {\unhbox\combinationstack
+ \global\setbox1\lastbox}%
+ \box1% \ruledhbox{\box1}%
+ \global\advance\horcombination\minusone\relax
+ \ifnum\horcombination>\zerocount
+ \def\next{&&&&\doflushcombinationstack}%
+ \else
+ \global\setbox\combinationstack\emptybox
+ %\let\next\relax
+ \@EA\gobbleoneargument
+ \fi
+ \next}
+
+\setupcombinations
+ [\c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!distance=1em,
+ \c!location=\v!bottom, % can be something {top,left}
+ \c!before=\blank,
+ \c!inbetween={\blank[\v!medium]},
+ \c!style=,
+ \c!color=,
+ \c!after=,
+ \c!align=\v!middle]
+
+%D \macros
+%D {startfloatcombination}
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D \placefigure
+%D [left,none]
+%D {}
+%D {\startfloatcombination[2*2]
+%D \placefigure{alpha}{\externalfigure[cow.pdf][width=1cm]}
+%D \placefigure{beta} {\externalfigure[cow.pdf][width=2cm]}
+%D \placefigure{gamma}{\externalfigure[cow.pdf][width=3cm]}
+%D \placefigure{delta}{\externalfigure[cow.pdf][width=4cm]}
+%D \stopfloatcombination}
+%D
+%D \input tufte
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\startfloatcombination
+ {\dodoubleempty\dostartfloatcombination}
+
+\def\dostartfloatcombination[#1][#2]%
+ {\vbox\bgroup
+ %\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature
+ \chardef\postcenterfloatmethod\zerocount
+ \forcelocalfloats
+ \def\stopfloatcombination
+ {\scratchtoks\emptytoks
+ \dorecurse\noflocalfloats
+ {\appendetoks{\noexpand\getlocalfloat{\recurselevel}}{}\to\scratchtoks}%
+ \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination
+ \resetlocalfloats
+ \egroup}}
+
+\def\placerelativetoeachother#1#2%
+ {\bgroup
+ \dowithnextbox
+ {\bgroup
+ \setbox0\box\nextbox
+ \dowithnextbox
+ {\setbox2\box\nextbox
+ #1{#2#########2\cr\box0\cr\box2\cr}
+ \egroup
+ \egroup}
+ \hbox}
+ \hbox}
+
+\def\placeontopofeachother{\placerelativetoeachother\halign\hss}
+\def\placesidebyside {\placerelativetoeachother\valign\vss}
+
+% this will be replaced or go away, never used
+
+\def\douseexternalfiles[#1][#2]%
+ {\getparameters
+ [\??fi#1]
+ [\c!file=,
+ \c!bodyfont=,
+ \c!option=,
+ #2]}
+
+\def\useexternalfiles
+ {\dodoubleargument\douseexternalfiles}
+
+\def\dostelexternefilesin[#1][#2]%
+ {\doifundefinedelse{\??fi#1\c!file}
+ {\useexternalfiles[#1][#2]}
+ {\getparameters[\??fi#1][#2]}}
+
+\def\stelexternefilesin
+ {\dodoubleargument\dostelexternefilesin}
+
+\def\verwerkexternefile#1#2#3%
+ {\bgroup
+ \getparameters[\??fi#1][\c!file=,#3]%
+ \doinputonce{\getvalue{\??fi#1\c!file}}%
+ \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!bodyfont}]%
+ \readsysfile{#2} % beter: loc of fix gebied
+ \donothing
+ {\showmessage\m!systems{41}{#2,#1}}%
+ \egroup}
+
+\def\douseexternalfile[#1][#2][#3][#4]%
+ {\stelexternefilesin[#1][]%
+ \doinputonce{\getvalue{\??fi#1\c!file}}%
+ \doifelsenothing{#2}
+ {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}}
+ {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}}
+
+\def\useexternalfile
+ {\doquadrupleargument\douseexternalfile}
+
+\useexternalfiles
+ [pictex]
+ [\c!bodyfont=\v!small,
+ \c!file=pictex]
+
+\useexternalfiles
+ [table]
+ [\c!file=table]
+
+%D A couple of examples, demonstrating how the depth is
+%D taken care of:
+%D
+%D \startbuffer
+%D test\rotate[frame=on, rotation=0] {gans}%
+%D test\rotate[frame=on, rotation=90] {gans}%
+%D test\rotate[frame=on, rotation=180]{gans}%
+%D test\rotate[frame=on, rotation=270]{gans}%
+%D test
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% When we rotate over arbitrary angles, we need to relocate the
+% resulting box because rotation brings that box onto the negative
+% axis. The calculations (mostly sin and cosine) need to be tuned for
+% the way a box is packages (i.e. the refence point). A typical example
+% of drawing, scribbling, and going back to the days of school math.
+%
+% We do a bit more calculations than needed, simply because that way
+% it's easier to debug the code.
+
+\def\dododorotatenextbox
+ {\setbox\nextbox\vbox to \@@layerysiz
+ {\vfill
+ \hbox to \@@layerxsiz
+ {\dostartrotation\@@rorotation
+ \nextboxwd\zeropoint
+ \nextboxht\zeropoint
+ \flushnextbox
+ \dostoprotation
+ \hfill}%
+ \kern\@@layerypos}%
+ \setbox\nextbox\hbox
+ {\kern\@@layerxpos
+ \kern\@@layerxoff
+ \lower\@@layeryoff\flushnextbox}}
+
+\def\dodorotatenextbox#1#2% quite some trial and error -)
+ {\dontshowcomposition
+ \dontcomplain
+ \ifnum#2=\plusfour
+ % new, location=middle
+ \!!widthb \nextboxwd
+ \!!heightb\nextboxht
+ \!!depthb \nextboxdp
+ \setbox\nextbox\vbox{\vskip.5\nextboxht\hskip-.5\nextboxwd\flushnextbox}%
+ \smashbox\nextbox
+ \fi
+ \!!widtha \nextboxwd
+ \!!heighta\nextboxht
+ \!!deptha \nextboxdp
+ \!!doneafalse
+ \!!donebfalse
+ \ifcase#2\or
+ % 1: fit
+ \or
+ % 2: depth, not fit
+ \!!doneatrue
+ \!!donebtrue
+ \or
+ % 3: depth, fit
+ \!!donebtrue
+ \fi
+ \setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}%
+ \!!dimena \nextboxht
+ \setcalculatedcos\cos\@@rorotation
+ \setcalculatedsin\sin\@@rorotation
+ \@@layerxpos\zeropoint
+ \@@layerypos\zeropoint
+ \@@layerxoff\zeropoint
+ \@@layeryoff\zeropoint
+ \ifdim\sin\points>\zeropoint
+ \ifdim\cos\points>\zeropoint
+ \@@layerxsiz \cos\!!widtha
+ \@@layerysiz \sin\!!widtha
+ \advance\@@layerxsiz \sin\!!dimena
+ \advance\@@layerysiz \cos\!!dimena
+ \@@layerypos \cos\!!dimena
+ \if!!donea
+ \@@layerxoff \negated\sin\!!dimena
+ \advance\@@layerxoff \sin\!!deptha
+ \fi
+ \if!!doneb
+ \@@layeryoff \cos\!!deptha
+ \fi
+ \dododorotatenextbox
+ \else
+ \@@layerxsiz \negated\cos\!!widtha
+ \@@layerysiz \sin\!!widtha
+ \advance\@@layerxsiz \sin\!!dimena
+ \advance\@@layerysiz \negated\cos\!!dimena
+ \@@layerxpos \negated\cos\!!widtha
+ \if!!donea
+ \@@layerxoff -\@@layerxsiz
+ \advance\@@layerxoff \sin\!!deptha
+ \fi
+ \if!!doneb
+ \@@layeryoff \negated\cos\!!heighta
+ \fi
+ \dododorotatenextbox
+ \wd\nextbox\if!!donea\sin\!!deptha\else\@@layerxsiz\fi
+ \fi
+ \else
+ \ifdim\cos\points<\zeropoint
+ \@@layerxsiz \negated\cos\!!widtha
+ \@@layerysiz \negated\sin\!!widtha
+ \advance\@@layerxsiz \negated\sin\!!dimena
+ \advance\@@layerysiz \negated\cos\!!dimena
+ \@@layerxpos \@@layerxsiz
+ \@@layerypos \negated\sin\!!widtha
+ \if!!donea
+ \@@layerxoff -\@@layerxsiz
+ \advance\@@layerxoff \negated\sin\!!heighta
+ \fi
+ \if!!doneb
+ \@@layeryoff \@@layerysiz
+ \advance\@@layeryoff \cos\!!deptha
+ \fi
+ \dododorotatenextbox
+ \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
+ \else
+ \@@layerxsiz \cos\!!widtha
+ \@@layerysiz \negated\sin\!!widtha
+ \advance\@@layerxsiz \negated\sin\!!dimena
+ \advance\@@layerysiz \cos\!!dimena
+ \ifdim\sin\points=\zeropoint
+ \@@layerxpos \zeropoint
+ \@@layerxoff \zeropoint
+ \@@layerypos \@@layerysiz
+ \if!!doneb
+ \@@layeryoff \!!deptha
+ \fi
+ \else
+ \@@layerypos \@@layerysiz
+ \@@layerxpos \negated\sin\!!dimena
+ \if!!donea
+ \@@layerxoff -\@@layerxsiz
+ \advance\@@layerxoff \negated\sin\!!heighta
+ \fi
+ \if!!doneb
+ \@@layeryoff \negated\sin\!!deptha
+ \fi
+ \fi
+ \dododorotatenextbox
+ \ifdim\sin\points=\zeropoint
+ \else
+ \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
+ \fi
+ \fi
+ \fi
+ % new, location=middle
+ \ifnum#2=\plusfour
+ \setbox\nextbox\vbox{\vskip-.5\!!heightb\hskip.5\!!heightb\flushnextbox}%
+ \nextboxwd\!!widthb
+ \nextboxht\!!heightb
+ \nextboxdp\!!depthb
+ \fi}
+
+\def\dorotatenextbox#1#2%
+ {\doifsomething{#1}
+ {\edef\@@rorotation{\realnumber{#1}}% get rid of leading zeros and spaces
+ \setbox\nextbox\vbox{\flushnextbox}% not really needed
+ \dodorotatenextbox\@@rorotation#2}%
+ \hbox{\boxcursor\flushnextbox}}
+
+\def\dodorotatebox#1% {angle} \hbox/\vbox/\vtop
+ {\bgroup\hbox\bgroup % compatibility hack
+ \dowithnextbox
+ {\dorotatenextbox{#1}\plusone
+ \egroup\egroup}}
+
+\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
+ {\ifcase#1\relax
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\dodorotatebox
+ \fi{#1}}
+
+\unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
+ {\bgroup\complexorsimpleempty\rotate}
+
+% \def\complexrotate[#1]% framed met diepte !
+% {\getparameters[\??ro][#1]%
+% \processaction
+% [\@@rolocation]
+% [ \v!depth=>\!!counta\plusthree\donefalse,% depth fit - raw box
+% \v!fit=>\!!counta\plustwo \donefalse,% depth tight - raw box
+% \v!broad=>\!!counta\plusone \donefalse,% nodepth fit - raw box
+% \v!high=>\!!counta\plusone \donetrue ,% nodepth fit - framed
+% \v!middle=>\!!counta\plusfour \donefalse,% centered, keep dimensions
+% \s!default=>\!!counta\plusthree\donetrue ,% depth fit - framed
+% \s!unknown=>\!!counta\plusthree\donetrue ]% depth fit - framed
+% \ifdone
+% \def\docommand{\localframed[\??ro][#1,\c!location=]}%
+% \else
+% \let\docommand\relax
+% \fi
+% \dowithnextbox{\dorotatenextbox\@@rorotation\!!counta\egroup}\vbox\docommand}
+
+\setvalue{\??ro::\c!location::\v!depth }{\!!counta\plusthree\donefalse} % depth fit - raw box
+\setvalue{\??ro::\c!location::\v!fit }{\!!counta\plustwo \donefalse} % depth tight - raw box
+\setvalue{\??ro::\c!location::\v!broad }{\!!counta\plusone \donefalse} % nodepth fit - raw box
+\setvalue{\??ro::\c!location::\v!high }{\!!counta\plusone \donetrue } % nodepth fit - framed
+\setvalue{\??ro::\c!location::\v!middle }{\!!counta\plusfour \donefalse} % centered, keep dimensions
+\setvalue{\??ro::\c!location::\v!default}{\!!counta\plusthree\donetrue } % depth fit - framed
+
+\def\complexrotate[#1]% framed met diepte !
+ {\getparameters[\??ro][#1]%
+ \executeifdefined{\??ro::\c!location::\@@rolocation}{\!!counta\plusthree\donetrue}%
+ \ifdone
+ \def\docommand{\localframed[\??ro][#1,\c!location=]}%
+ \else
+ \let\docommand\relax
+ \fi
+ \dowithnextbox{\dorotatenextbox\@@rorotation\!!counta\egroup}\vbox\docommand}
+
+\presetlocalframed[\??ro]
+
+\def\setuprotate
+ {\dodoubleargument\getparameters[\??ro]}
+
+\setuprotate
+ [\c!rotation=90,
+ \c!location=\v!normal,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off]
+
+% \dostepwiserecurse{0}{360}{10}
+% {\startlinecorrection[blank]
+% \hbox
+% {\expanded{\setuprotate[rotation=\recurselevel]}%
+% \traceboxplacementtrue
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=depth] {\ruledhbox{\bfb (depth)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=fit] {\ruledhbox{\bfb (fit)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=broad] {\ruledhbox{\bfb (broad)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=normal]{\ruledhbox{\bfb (normal)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=high] {\ruledhbox{\bfb (high)}}}}}
+% \stoplinecorrection}
+
+% to be used in some other places! todo!
+%
+% divides \hsize in fractions, will be made a bit more
+% clever and advanced when needed
+%
+% \horizontaldivision[n/m,elements,distance]
+%
+% \horizontaldivision[2/5,3,1em]
+% \horizontaldivision[2/5,3,1em]
+% \horizontaldivision[1/5,3,1em]
+%
+% \setuphorizontaldivision[afstand=,aantal=] (passend,passend)
+
+\def\??fr{@@fr}
+
+\def\setuphorizontaldivision
+ {\dodoubleargument\getparameters[\??fr]}
+
+\def\horizontaldivision
+ {\dosingleargument\dohorizontaldivision}
+
+\def\dohorizontaldivision[#1]%
+ {\dodohorizontaldivision[#1,,,,,,]}
+
+\def\dodohorizontaldivision[#1/#2,#3,#4,#5]%
+ {\doifelsenothing{#3}
+ {\doifelse\@@frn\v!fit
+ {\!!counta#2\relax}
+ {\!!counta\@@frn\relax}}
+ {\!!counta#3\relax}%
+ \doifelsenothing{#4}
+ {\doifelse\@@frdistance\v!fit
+ {\!!widtha\zeropoint}
+ {\!!widtha\@@frdistance}}
+ {\!!widtha#4}%
+ \advance\!!counta \minusone
+ \multiply\!!widtha \!!counta
+ \advance\hsize -\!!widtha
+ \divide\hsize #2\relax
+ \hsize#1\hsize}
+
+\setuphorizontaldivision
+ [\c!distance=\tfskipsize,
+ \c!n=\v!fit]
+
+%D This one is for Daniel Pittman, who wanted tight
+%D fractions. We show three versions. First the simple
+%D one using \type {\low} and \type {high}:
+%D
+%D \startbuffer
+%D \def\vfrac#1#2%
+%D {\hbox{\high{\tx#1\kern-.25em}/\low{\kern-.25em\tx#2}}}
+%D
+%D test \vfrac{1}{2} test \vfrac{123}{456} test
+%D \stopbuffer
+%D
+%D \typebuffer {\showmakeup\getbuffer}
+%D
+%D A better way to handle the kerning is the following, here
+%D we kind of assume that tye slash is symmetrical and has
+%D nearly zero width.
+%D
+%D \startbuffer
+%D \def\vfract#1#2%
+%D {\hbox{\high{\tx#1}\hbox to \zeropoint{\hss/\hss}\low{\tx#2}}}
+%D \stopbuffer
+%D
+%D \typebuffer {\showmakeup\getbuffer}
+%D
+%D The third and best alternative is the following:
+%D
+%D {\showmakeup\getbuffer}\crlf\getbuffer
+%D
+%D This time we measure the height of the \type {/} and
+%D shift over the maximum height and depths of this
+%D character and the fractional digits (we use 57 as
+%D sample). Here we combine all methods in one macros.
+
+\chardef\vulgarfractionmethod=3
+
+\definehspace[vulgarfraction][.25em] % [.15em]
+\definesymbol[vulgarfraction][/] % [\raise.2ex\hbox{/}]
+
+\unexpanded\def\vulgarfraction#1#2%
+ {\dontleavehmode
+ \hbox
+ {\def\vulgarfraction{vulgarfraction}%
+ \ifcase\vulgarfractionmethod
+ #1\symbol[\vulgarfraction]#2%
+ \or
+ \high{\tx#1\kern-\hspaceamount\empty\vulgarfraction}%
+ \symbol[\vulgarfraction]%
+ \low {\kern-\hspaceamount\empty\vulgarfraction\tx#2}%
+ \or
+ \high{\tx#1}%
+ \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
+ \low{\tx#2}%
+ \or
+ \setbox0\hbox{\symbol[\vulgarfraction]}%
+ \setbox2\hbox{\txx57}%
+ \raise\ht0\hbox{\lower\ht2\hbox{\txx#1}}%
+ \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
+ \lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
+ \fi}}
+
+\ifx\vfrac\undefined \let\vfrac\vulgarfraction \fi
+
+%D \starttabulate
+%D \HL
+%D \NC \bf method \NC \bf visualization \NC\NR
+%D \HL
+%D \NC 0 \NC \chardef\vulgarfractionmethod0\vulgarfraction{1}{2} \NC\NR
+%D \NC 1 \NC \chardef\vulgarfractionmethod1\vulgarfraction{1}{2} \NC\NR
+%D \NC 2 \NC \chardef\vulgarfractionmethod2\vulgarfraction{1}{2} \NC\NR
+%D \NC 3 \NC \chardef\vulgarfractionmethod3\vulgarfraction{1}{2} \NC\NR
+%D \HL
+%D \stoptabulate
+
+%D Under construction:
+%D
+%D \starttyping
+%D \commalistsentence[aap,noot,mies]
+%D \commalistsentence[aap,noot]
+%D \commalistsentence[aap]
+%D \commalistsentence[a,b,c]
+%D \commalistsentence[a,b,c][{ \& },{ and }]
+%D \commalistsentence[a,b,c][+,-]
+%D \stoptyping
+
+\let\handlecommalistsentence\firstofoneargument
+
+\def\commalistsentenceone{and-1}
+\def\commalistsentencetwo{and-2}
+
+\def\commalistsentence
+ {\dodoubleempty\docommalistsentence}
+
+\def\docommalistsentence[#1][#2]%
+ {\bgroup
+ \getfromcommalist[#2][1]%
+ \ifx\commalistelement\empty
+ \def\@@commalistsentenceone{\labeltext\commalistsentenceone}%
+ \else
+ \let\@@commalistsentenceone\commalistelement
+ \fi
+ \getfromcommalist[#2][2]%
+ \ifx\commalistelement\empty
+ \def\@@commalistsentencetwo{\labeltext\commalistsentencetwo}%
+ \else
+ \let\@@commalistsentencetwo\commalistelement
+ \fi
+ \getcommalistsize[#1]%
+ \ifcase\commalistsize\relax
+ \def\serializedcommalist{#1}%
+ \else
+ \let\serializedcommalist\empty
+ \scratchcounter\zerocount
+ \def\docommand##1%
+ {\advance\scratchcounter \plusone
+ \ifnum\scratchcounter=\plusone
+ \scratchtoks{\handlecommalistsentence{##1}}%
+ \else
+ \ifnum\scratchcounter=\commalistsize
+ \appendtoks\@@commalistsentencetwo\handlecommalistsentence{##1}\to\scratchtoks
+ \else
+ \appendtoks\@@commalistsentenceone\handlecommalistsentence{##1}\to\scratchtoks
+ \fi
+ \fi}%
+ \processcommacommand[#1]\docommand
+ \edef\serializedcommalist{\the\scratchtoks}%
+ \fi
+ \serializedcommalist
+ \egroup}
+
+\def\commacommandsentence[#1]{\@EA\commalistsentence\@EA[#1]}
+
+\ifx\textcomma\undefined \def\textcomma{,} \fi
+
+\setuplabeltext [\s!nl] [and-1=\textcomma\ , and-2= en ]
+\setuplabeltext [\s!en] [and-1=\textcomma\ , and-2=\textcomma\ and ]
+\setuplabeltext [\s!de] [and-1=\textcomma\ , and-2= und ]
+
+%D \macros
+%D {somekindoftab}
+%D
+%D This macro can be used to create tabs:
+%D
+%D \starttyping
+%D \setupheadertexts[{\somekindoftab[alternative=horizontal]{\framed{\realfolio}}}]
+%D \setuptexttexts [{\somekindoftab[alternative=vertical] {\framed{\realfolio}}}]
+%D
+%D \starttext
+%D \showframe \dorecurse{10}{test\page}
+%D \stoptext
+%D \stoptyping
+
+\def\somekindoftab
+ {\dosingleempty\dosomekindoftab}
+
+\def\dosomekindoftab[#1]%
+ {\bgroup
+ \getparameters[xx]
+ [\c!alternative=\v!vertical,
+ \c!width=\textwidth,\c!height=\textheight,
+ \c!n=\lastpage,\c!m=\realpageno,
+ #1]%
+ \doifelse\xxalternative\v!vertical
+ {\dodosomekindoftab\vbox\vskip\xxheight}
+ {\dodosomekindoftab\hbox\hskip\xxwidth }}
+
+\def\dodosomekindoftab#1#2#3#4%
+ {#1 to #3 \bgroup
+ \forgetall
+ \ifnum\xxm>\plusone
+ #2\zeropoint \!!plus \the\numexpr\xxm -1\relax fill\relax
+ \fi
+ #4%
+ \ifnum\xxm<\xxn\relax
+ #2\zeropoint \!!plus \the\numexpr\xxn-\xxm\relax fill\relax
+ \fi
+ \egroup
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv
new file mode 100644
index 000000000..e2bd28bd5
--- /dev/null
+++ b/tex/context/base/core-mis.mkiv
@@ -0,0 +1,2505 @@
+%D \module
+%D [ file=core-mis,
+%D version=1998.01.29,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Miscelaneous,
+%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 / Misc Commands}
+
+% todo: kleur in legenda + letter
+
+% %D You would not expect the next macro in \CONTEXT,
+% %D wouldn't you? It's there to warn \LATEX\ users that
+% %D something is wrong.
+% %D
+% %D Obsolete now:
+% %
+% % \def\documentstyle{\showmessage\m!systems3\empty\stoptekst}
+% %
+% % \let\documentclass=\documentstyle
+% %D \macros
+% %D {simplifiedcommands, simplifycommands}
+% %D
+% %D I first needed this simplification in bookmarks. Users can
+% %D add their own if needed.
+
+\unprotect
+
+%D Sometimes (for instance in bookmarks) we need to simplify macro
+%D behaviour, so here is the hook.
+
+\ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
+
+\def\simplifycommands{\the\simplifiedcommands}
+
+%D A possibly growing list:
+
+%appendtoks \def\executesynonym#1#2#3#4{#3}\to\simplifiedcommands
+%appendtoks \def\executesort#1#2#3{#3}\to\simplifiedcommands
+
+\appendtoks \def\ { }\to\simplifiedcommands
+\appendtoks \def\type#1{\letterbackslash\checkedstrippedcsname#1}\to\simplifiedcommands
+\appendtoks \def\tex#1{\letterbackslash#1}\to\simplifiedcommands
+\appendtoks \def\TeX{TeX}\to\simplifiedcommands
+\appendtoks \def\ConTeXt{ConTeXt}\to\simplifiedcommands
+\appendtoks \def\MetaPost{MetaPost}\to\simplifiedcommands
+\appendtoks \def\MetaFont{MetaFont}\to\simplifiedcommands
+\appendtoks \def\MetaFun{MetaFun}\to\simplifiedcommands
+%appendtoks \def||{-}\to\simplifiedcommands
+\appendtoks \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands
+
+\appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands
+
+% THIS WAS MAIN-002.TEX
+
+%\def\checkinterlineskip
+% {\ifvmode
+% \ifdim\lastskip>\zeropoint
+% \nointerlineskip
+% \else\ifdim\lastkern>\zeropoint
+% \nointerlineskip
+% \fi\fi
+% \fi}
+
+\def\horitems#1#2% #1=breedte #2=commandos
+ {\scratchdimen#1%
+ \divide\scratchdimen \nofitems
+ \!!counta\zerocount
+ \def\docommand##1%
+ {\advance\!!counta \plusone
+ \processaction
+ [\@@isalign]
+ [ \v!left=>\hbox to \scratchdimen{\strut##1\hss},
+ \v!right=>\hbox to \scratchdimen{\hss\strut##1},
+ \v!middle=>\hbox to \scratchdimen{\hss\strut##1\hss},
+ \v!margin=>\ifnum\!!counta=\plusone\hss\else\hfill\fi
+ \strut##1%
+ \ifnum\!!counta=\nofitems\hss\else\hfill\fi,
+ \s!default=>\hbox to \scratchdimen{\hss\strut##1\hss}, % midden
+ \s!unknown=>\hbox to \scratchdimen{\strut##1\hss}]}% % links
+ \hbox to #1{\hss#2\hss}}
+
+\def\veritems#1#2% #1=breedte #2=commandos
+ {\scratchdimen#1%
+ \def\docommand##1%
+ {\ifdim\scratchdimen<\zeropoint % the - was a signal
+ \hbox to -\scratchdimen{\hss\strut##1}%
+ \else\ifdim\scratchdimen>\zeropoint
+ \hbox to \scratchdimen{\strut##1\hss}%
+ \else
+ \hbox{\strut##1}%
+ \fi\fi}%
+ \vbox{#2}}
+
+\def\dosetupitems[#1]%
+ {\getparameters[\??is][#1]%
+ \doif\@@iswidth\v!unknown
+ {\def\@@iswidth{\hsize}}%
+ \doifconversiondefinedelse\@@issymbol
+ {\def\doitembullet##1{\convertnumber{\@@issymbol}{##1}}}
+ {\doifsymboldefinedelse\@@issymbol
+ {\def\doitembullet##1{\symbol[\@@issymbol]}}{}}}
+
+\def\makeitemsandbullets#1%
+ {\doifelse\@@isn\v!unknown
+ {\getcommalistsize[#1]%
+ \edef\nofitems{\commalistsize}}
+ {\edef\nofitems{\@@isn}}%
+ \setbox0\hbox
+ {\doitems \@@iswidth
+ {\processcommalist[#1]\docommand}}%
+ \setbox2\hbox
+ {\doitems \@@isbulletbreedte
+ {\dorecurse\nofitems
+ {\docommand{\strut\doitembullet\recurselevel}}}}}
+
+\def\dostartitems#1#2#3%
+ {\let\doitems#2%
+ \def\@@isbulletbreedte{#3}%
+ \makeitemsandbullets{#1}%
+ \@@isbefore}
+
+\def\dostopitems
+ {\@@isafter
+ \egroup}
+
+\setvalue{doitems\v!top}#1%
+ {\dostartitems{#1}\horitems\@@iswidth
+ \noindent\vbox
+ {\forgetall
+ \doifsomething\@@issymbol
+ {\doifnot\@@issymbol\v!none
+ {\box2
+ \@@isinbetween
+ \nointerlineskip}}%
+ \box0}%
+ \dostopitems}
+
+\setvalue{doitems\v!bottom}#1%
+ {\dostartitems{#1}\horitems\@@iswidth
+ \noindent\vbox
+ {\forgetall
+ \box0
+ \doifsomething\@@issymbol
+ {\@@isinbetween
+ \nointerlineskip
+ \box2}}%
+ \dostopitems}
+
+\setvalue{doitems\v!inmargin}#1%
+ {\dostartitems{#1}\veritems{-1.5em}% - is a signal
+ \noindent\hbox{\llap{\box2\hskip\leftmargindistance}\box0}%
+ \dostopitems}
+
+\setvalue{doitems\v!left}#1%
+ {\advance\hsize -1.5em%
+ \dostartitems{#1}\veritems{1.5em}%
+ \noindent\hbox{\box2\box0}%
+ \dostopitems}
+
+\setvalue{doitems\v!right}#1%
+ {\dostartitems{#1}\veritems{0em}%
+ \noindent\hbox{\box0\hskip-\wd2\box2}%
+ \dostopitems}
+
+\unexpanded\def\setupitems
+ {\dosingleargument\dosetupitems}
+
+\def\complexitems[#1]%
+ {\bgroup
+ \setupitems[#1]%
+ \parindent\zeropoint
+ \setlocalhsize
+ \hsize\localhsize
+ \dontcomplain
+ %\doifundefined{doitems\@@islocation}%
+ % {\let\@@islocation\v!left}%
+ %\getvalue{doitems\@@islocation}}
+ \executeifdefined{doitems\@@islocation}{\let\@@islocation\v!left}}
+
+\definecomplexorsimpleempty\items
+
+\setupitems
+ [\c!location=\v!left,
+ \c!symbol=5,
+ \c!width=\hsize,
+ \c!align=\v!middle,
+ \c!n=\v!unknown,
+ \c!before=\blank,
+ \c!inbetween={\blank[\v!medium]},
+ \c!after=\blank]
+
+% \definieerplaats[naam][instellingen]
+% \stelplaatsin[naam][instellingen]
+% \plaats<naam>[[instellingen]]
+%
+% - still undocumented and also not in setupb yet
+% - kan ook intern/direct (scheelt duplicatie), zie \framedtext
+
+\def\dodefineplacement[#1][#2]%
+ {\getparameters
+ [\??pl#1]
+ [\c!left=\hss,
+ \c!right=\hss,
+ \c!linecorrection=\v!off,
+ \c!depthcorrection=\v!off,
+ \c!margin=\v!standard,
+ \c!grid=\v!middle,
+ %\c!before=,
+ %\c!after=,
+ #2]%
+ \setvalue{\e!place#1}{\doplacement[\??pl#1]}}
+
+\unexpanded\def\defineplacement
+ {\dodoubleempty\dodefineplacement}
+
+\unexpanded\def\setupplacement
+ {\dodoubleempty\dosetupplacement}
+
+\def\dosetupplacement[#1]%
+ {\dodoubleempty\getparameters[\??pl#1]}
+
+\def\doplacement
+ {\dodoubleempty\dodoplacement}
+
+\def\dodoplacement[#1][#2]% correctie moet mooier
+ {\bgroup
+ \dowithnextboxcontent
+ {\forgetall}
+ {\setlocalhsize
+ \getparameters[#1][#2]%
+ \getvalue{#1\c!before}%
+ \begingroup
+ \disableparpositions
+ \setbox\nextbox\hbox to \localhsize
+ {\getvalue{#1\c!left}%
+ \flushnextbox
+ \getvalue{#1\c!right}}%
+ \ifinsidefloat \else
+ \addlocalbackgroundtobox\nextbox
+ \fi
+ \ifgridsnapping
+ \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}%
+ % unchecked
+ \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+ \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}%
+ \else
+ \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection
+ \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
+ \flushnextbox
+ \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection
+ \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection
+ \fi
+ \endgroup
+ \getvalue{#1\c!after}%
+ \egroup}
+ \vbox}
+
+% Te zijner tijd [plaats=boven,onder,midden] implementeren,
+% in dat geval moet eerst de maximale hoogte worden bepaald.
+%
+% Overigens kan een en ander mooier met \halign.
+
+% there is quite some historic balast in this mechanism, the next variant
+% is a first cleanup
+
+\let\currentparagraph\empty
+
+\newcount\alcounter \newcount\alnsize \newdimen\alhsize
+
+\def\paragraphparameter#1% \checkedparameter\??al\currentparagraph#1
+ {\executeifdefined{\??al\currentparagraph#1}{\executeifdefined{\??al#1}\empty}}
+
+\def\paragraphcellmeter#1#2% \checkedparameter\??al\currentparagraph#1
+ {\executeifdefined{\??al\currentparagraph\number#1#2}{\paragraphparameter{#2}}}
+
+\def\dodefineparagraphs[#1][#2]%
+ {\edef\currentparagraph{#1}%
+ \setvalue{\s!do\s!next\currentparagraph}%
+ {\def\\{\getvalue\currentparagraph}}%
+ \setvalue\currentparagraph
+ {\getvalue{\s!do\s!next#1}%
+ \dostartparagraphs{#1}}%
+ \setvalue{\e!next\currentparagraph}%
+ {\getvalue{#1}}%
+ \setvalue{\e!start\currentparagraph}%
+ {\bgroup
+ \edef\currentparagraph{#1}%
+ \letvalue{\s!do\s!next\currentparagraph}\empty
+ \setvalue{\e!stop\currentparagraph}{\getvalue\currentparagraph\egroup}%
+ \getvalue\currentparagraph}%
+ \getparameters[\??al\currentparagraph]%
+ [%\c!n=3,
+ %\c!before=\blank,
+ %\c!after=\blank,
+ %\c!distance=1em,
+ %\c!height=\v!fit,
+ %\c!rule=\v!off,
+ %\c!command=,
+ %\c!align=,
+ %\c!tolerance=\v!tolerant,
+ %\c!rulethickness=\linewidth,
+ %\c!rulecolor=,
+ %\c!style=,
+ %\c!color=,
+ %\c!top=,
+ %\c!top=\vss,
+ %\c!bottom=\vfill,
+ #2]%
+ \setvalue{\e!setup#1\e!endsetup}%
+ {\setupparagraphs[#1]}%
+ \dorecurse
+ {\paragraphparameter\c!n}
+ {\setupparagraphs
+ [\currentparagraph]
+ [\recurselevel]
+ [\c!width=,
+ %\c!bottom=\paragraphparameter\c!bottom,
+ %\c!top=\paragraphparameter\c!top,
+ %\c!height=\paragraphparameter\c!height,
+ %\c!rule=\paragraphparameter\c!rule,
+ %\c!rulethickness=\paragraphparameter\c!rulethickness,
+ %\c!rulecolor=\paragraphparameter\c!rulecolor,
+ %\c!align=\paragraphparameter\c!align,
+ %\c!tolerance=\paragraphparameter\c!tolerance, % obsolete
+ %\c!distance=\paragraphparameter\c!distance,
+ \c!style=\paragraphparameter\c!style,
+ \c!color=\paragraphparameter\c!color]}%
+ \setupparagraphs[\currentparagraph][1][\c!distance=\zeropoint]}
+
+\unexpanded\def\defineparagraphs
+ {\dodoubleargument\dodefineparagraphs}
+
+\def\dosetupparagraphs[#1][#2][#3]%
+ {\edef\currentparagraph{#1}%
+ \ifsecondargument
+ \doifelse{#2}\v!each
+ {\dorecurse
+ {\paragraphparameter\c!n}
+ {\getparameters[\??al\currentparagraph\recurselevel][#3]}}
+ {\doifelsenothing{#3}
+ {\getparameters[\??al\currentparagraph][#2]}
+ {\def\docommand##1{\getparameters[\??al\currentparagraph##1][#3]}%
+ \processcommalist[#2]\docommand}}%
+ \else
+ \getparameters[\??al][#1]%
+ \fi}
+
+\unexpanded\def\setupparagraphs
+ {\dotripleempty\dosetupparagraphs}
+
+\setupparagraphs
+ [\c!n=3,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!distance=1em,
+ \c!height=\v!fit,
+ \c!rule=\v!off,
+ \c!command=,
+ \c!align=,
+ \c!tolerance=\v!tolerant, % obsolete
+ \c!rulethickness=\linewidth,
+ \c!rulecolor=,
+ \c!style=,
+ \c!color=,
+ \c!top=,
+ \c!top=\vss,
+ \c!bottom=\vfill]
+
+\def\doparagraphrule
+ {\doifelse{\paragraphcellmeter\alcounter\c!rule}\v!on
+ {\linewidth\paragraphcellmeter\alcounter\c!rulethickness
+ \scratchdimen\dimexpr(\paragraphcellmeter\alcounter\c!distance-\linewidth)/2\relax
+ \hskip\scratchdimen
+ \color[\paragraphcellmeter\alcounter\c!rulecolor]{\vrule\!!width\linewidth}%
+ \hskip\scratchdimen}
+ {\hskip\paragraphcellmeter\alcounter\c!distance}}
+
+\def\dostartparagraph
+ {\doifelsenothing{\paragraphcellmeter\alcounter\c!width}
+ {\!!widtha\alhsize
+ \divide\!!widtha \alnsize}
+ {\!!widtha\paragraphcellmeter\alcounter\c!width}%
+ \dostartattributes{\??al\currentparagraph\number\alcounter}\c!style\c!color\empty
+ \doifelse{\paragraphcellmeter\alcounter\c!height}\v!fit
+ {\setbox\scratchbox\vtop}
+ {\setbox\scratchbox\vtop to \paragraphcellmeter\alcounter\c!height}%
+ \bgroup
+ \blank[\v!disable]%
+ \forgetall
+ \paragraphcellmeter\alcounter\c!top
+ \paragraphparameter\c!inner
+ \hsize\!!widtha % setting \wd afterwards removed
+ \paragraphcellmeter\alcounter\c!inner % twice
+ \expanded{\setupalign [\paragraphcellmeter\alcounter\c!align ]}% {normal,verytolerant,stretch}
+ \expanded{\setuptolerance[\paragraphcellmeter\alcounter\c!tolerance]}% obsolete
+ \ignorespaces
+ \endgraf
+ \ignorespaces
+ %
+ % Nadeel van de onderstaande constructie is dat \everypar
+ % binnen een groep kan staan en zo steeds \begstruts
+ % worden geplaatst. Mooi is anders dus moet het anders!
+ %
+ % Hier is \Everypar niet nodig.
+ %
+ \everypar{\begstrut\everypar\emptytoks}%
+ %
+ \nospace % remove + ignore
+ \paragraphcellmeter\alcounter\c!command}
+
+\def\dostopparagraph
+ {\ifvmode
+ \removelastskip
+ \else
+ \unskip\endstrut\endgraf
+ \fi
+ \paragraphcellmeter\alcounter\c!bottom
+ \egroup
+ \ifdim\wd\scratchbox=\zeropoint % no data
+ \wd\scratchbox\!!widtha
+ \fi
+ \box\scratchbox
+ \dostopattributes
+ \ifnum\alcounter<\paragraphparameter\c!n\relax
+ \@EA\doparagraphcell
+ \else
+ \@EA\dostopparagraphs
+ \fi}
+
+\def\doparagraphcell
+ {\global\advance\alcounter \plusone
+ \doifelsenothing{\paragraphcellmeter\alcounter\c!distance}
+ {\ifnum\alcounter=\plusone\else
+ \hskip\paragraphparameter\c!distance
+ \fi}
+ {\ifnum\alcounter=\plusone
+ \hskip\paragraphcellmeter\alcounter\c!distance
+ \else
+ \doparagraphrule
+ \fi}%
+ \letvalue\currentparagraph\dostopparagraph
+ \dostartparagraph}
+
+\def\dostartparagraphs#1%
+ {\bgroup
+ \edef\currentparagraph{#1}%
+ \global\alcounter\zerocount
+ \parindent\zeropoint
+ \setlocalhsize
+ \alhsize\localhsize
+ \alnsize\paragraphparameter\c!n\relax
+ \dorecurse \alnsize
+ {\doifelsenothing{\paragraphcellmeter\recurselevel\c!distance}
+ {\ifnum\recurselevel=\plusone\else
+ \global\advance\alhsize -\paragraphparameter\c!distance
+ \fi}
+ {\global\advance\alhsize -\paragraphcellmeter\recurselevel\c!distance}%
+ \doifsomething{\paragraphcellmeter\recurselevel\c!width}
+ {\global\advance\alnsize \minusone
+ \global\advance\alhsize -\paragraphcellmeter\recurselevel\c!width}}%
+ %whitespace % gaat fout bij \framed
+ \paragraphparameter\c!before
+ \leavevmode % gaat wel goed bij \framed, brrr
+ \setbox\scratchbox\vbox\bgroup\hbox\bgroup\doparagraphcell}
+
+\def\dostopparagraphs
+ {\egroup
+ \egroup
+ \iftrue
+ \hbox{\raise\strutheight\box\scratchbox}% new
+ \else
+ \box\scratchbox % old
+ \fi
+ \par
+ \paragraphparameter\c!after
+ \egroup}
+
+\def\dosetuptab[#1]%
+ {\getparameters[\??ta]
+ [\c!headstyle=\v!normal,
+ \c!headcolor=,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!width=\v!broad,
+ \c!sample={\hskip4em},
+ \c!before=,
+ \c!after=,
+ #1]%
+ \definedescription
+ [tab]
+ [\c!headstyle=\@@taheadstyle,
+ \c!headcolor=\@@tacolor,
+ \c!sample=\@@tasample,
+ \c!width=\@@tawidth,
+ \c!before=\@@tabefore,
+ \c!after=\@@taafter]}
+
+\unexpanded\def\setuptab
+ {\dosingleargument\dosetuptab}
+
+\setuptab
+ [\c!location=\v!left]
+
+\unexpanded\def\celsius #1{#1\mathematics{^\circ}C}
+\unexpanded\def\inch {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
+\unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
+
+% very dutch
+
+\unexpanded\def\graden {\mathematics{^\circ}}
+
+\def\bedragprefix {\euro\normalfixedspace}
+\def\bedragsuffix {}
+\def\bedragempty {\euro}
+
+\unexpanded\def\bedrag#1%
+ {\strut\hbox\bgroup
+ \let\normalfixedspace\nonbreakablespace
+ \doifelsenothing{#1}
+ {\bedragempty}
+ {\bedragprefix\digits{#1}\bedragsuffix}%
+ \egroup}
+
+% \definieeralineas[test][n=3]
+%
+% \stelalineasin[test][3][breedte=4cm,uitlijnen=links]
+%
+% \startopelkaar
+% \test hans \\ ton \\ \bedrag{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{~.~~1,--} \\
+% \test hans \\ ton \\ \bedrag{~.~~1,~~} \\
+% \test hans \\ ton \\ \bedrag{~.100,--} \\
+% \test hans \\ ton \\ \subtot{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{1.000,--} \\
+% \test hans \\ ton \\ \totaal{1.000,--} \\
+% \test hans \\ ton \\ \bedrag{nihil,--} \\
+% \test hans \\ ton \\ \totaal{nihil,--} \\
+% \test hans \\ ton \\ \subtot{nihil,--} \\
+% \stopopelkaar
+
+\def\periodswidth {.5em}
+\def\periodsdefault{3} % was 5, but now it's like \unknown
+
+\unexpanded\def\periods
+ {\dosingleempty\doperiods}
+
+\def\doperiods[#1]% todo: also n=,width= or maybe just #1,#2
+ {\dontleavehmode
+ \begingroup
+ \scratchdimen\periodswidth
+ \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
+ {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
+ \endgroup}
+
+\unexpanded\def\unknown
+ {\periods\relax} % relax prevents lookahead for []
+
+% Example by Wolfgang Schuster on the context list:
+%
+% \unexpanded\def\fourdots{{\def\periodswidth{.3em}\periods[4]}}
+%
+% Hello\fourdots\ World\fourdots \par Hello\fourdots\ World.
+
+% compatibility macros
+
+\def\doorsnede
+ {\hbox{\rlap/$\circ$} }
+
+\unexpanded\def\ongeveer
+ {\mathematics\pm}
+
+\chardef\boundarycharactermode\plusone
+
+\def\midboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \languageparameter#1%
+ %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \or
+ \languageparameter#1%
+ \fi
+ \chardef\boundarycharactermode\plusone}
+
+\def\leftboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ \languageparameter#1%
+ \nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \or
+ \languageparameter#1%
+ \fi
+ \chardef\boundarycharactermode\plusone}
+
+\def\rightboundarycharacter#1#2%
+ {\ifcase\boundarycharactermode
+ \or
+ \prewordbreak %\nobreak
+ \hskip\hspaceamount\currentlanguage{#2}%
+ \languageparameter#1%
+ \or
+ \languageparameter#1%
+ \fi
+ \chardef\boundarycharactermode\plusone}
+
+% actually this is pretty old, but temporary moved here
+%
+% obsolete:
+
+\unexpanded\def\setuphyphenmark
+ {\dodoubleargument\getparameters[\??kp]}
+
+\unexpanded\def\setuphyphenmark[#1]% sign=normal|wide
+ {\dodoubleargument\getparameters[\??kp][#1]%
+ \doifelse\@@kpsign {\v!normal}% was inset?
+ {\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!righthyphen}}
+ {\hbox{\directsymbol\empty\c!lefthyphen}}
+ {\hbox{\directsymbol\empty\c!hyphen}}}
+
+\def\composedhyphendiscretionary
+ {\discretionary
+ {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
+ {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
+ {\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]
+
+\definehspace [sentence] [\zeropoint]
+\definehspace [intersentence] [.250em]
+
+\definesymbol
+ [\c!midsentence]
+ [\midboundarycharacter\c!midsentence{sentence}]
+
+\definesymbol
+ [\c!leftsentence]
+ [\leftboundarycharacter\c!leftsentence{sentence}]
+
+\definesymbol
+ [\c!rightsentence]
+ [\rightboundarycharacter\c!rightsentence{sentence}]
+
+\definesymbol
+ [\c!leftsubsentence]
+ [\leftboundarycharacter\c!leftsubsentence{sentence}]
+
+\definesymbol
+ [\c!rightsubsentence]
+ [\rightboundarycharacter\c!rightsubsentence{sentence}]
+
+\newsignal \subsentencesignal
+\newcount \subsentencelevel
+
+\let\beforesubsentence\donothing
+\let\aftersubsentence \donothing
+
+% todo: make this language option
+%
+% \def\beforesubsentence{\removeunwantedspaces}
+% \def\aftersubsentence {\ignorespaces}
+
+\def\midsentence
+ {\symbol[\c!midsentence]}
+
+\def\beginofsubsentence
+ {\beforesubsentence
+ \ifdim\lastkern=\subsentencesignal
+ \unskip
+ \kern\hspaceamount\currentlanguage{intersentence}%
+ \fi
+ \global\advance\subsentencelevel\plusone
+ \ifnum\subsentencelevel=\plusone
+ \dontleavehmode % was \leaveoutervmode
+ \fi
+ \symbol[\ifodd\subsentencelevel\c!leftsentence\else\c!leftsubsentence\fi]%
+ }% \ignorespaces}
+
+\def\endofsubsentence % relax prevents space gobbling
+ {\symbol[\ifodd\subsentencelevel\c!rightsentence\else\c!rightsubsentence\fi]%
+ \global\advance\subsentencelevel\minusone
+ \unskip
+ \kern\subsentencesignal\relax
+ \aftersubsentence}
+
+\def\beginofsubsentencespacing % relax prevents space gobbling
+ {\kern\subsentencesignal\relax}% \ignorespaces}
+
+\def\endofsubsentencespacing
+ {\ifdim\lastkern=\subsentencesignal
+ \unskip
+ \hskip\hspaceamount\currentlanguage{intersentence}%
+ % no good, actually language dependent:
+% \ignorespaces
+ \else
+ \unskip
+ \fi}
+
+%D \startbuffer
+%D test |<|test |<|test|>| test|>| test \par
+%D test|<|test|<|test|>|test|>|test \par
+%D test |<||<|test|>||>| test \par
+%D test \directdiscretionary{<}test\directdiscretionary{>} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+
+\unexpanded\def\startsubsentence{\beginofsubsentence \prewordbreak\beginofsubsentencespacing}
+\unexpanded\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+
+%D \defineXMLenvironment [subsentence]
+%D {|<|}
+%D {|>|}
+%D \defineXMLenvironment [subsentence]
+%D {\directdiscretionary{<}}
+%D {\directdiscretionary{>}}
+%D \defineXMLenvironment [subsentence]
+%D {\startsubsentence}
+%D {\stopsubsentence}
+%D
+%D \startbuffer
+%D test <subsentence>test</subsentence> test
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \processXMLbuffer
+
+\enableactivediscretionaries
+
+\definehspace [quotation] [\zeropoint]
+\definehspace [interquotation] [.125em]
+
+%definehspace [quote] [\zeropoint]
+%definehspace [speech] [\zeropoint]
+
+\definehspace [quote] [\hspaceamount\currentlanguage{quotation}]
+\definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
+
+\definesymbol
+ [\c!leftquotation]
+ [\leftboundarycharacter\c!leftquotation{quotation}]
+
+\definesymbol
+ [\c!rightquotation]
+ [\rightboundarycharacter\c!rightquotation{quotation}]
+
+\definesymbol
+ [\c!leftquote]
+ [\leftboundarycharacter\c!leftquote{quote}]
+
+\definesymbol
+ [\c!rightquote]
+ [\rightboundarycharacter\c!rightquote{quote}]
+
+\definesymbol
+ [\c!leftspeech]
+ [\leftboundarycharacter\c!leftspeech{speech}]
+
+\definesymbol
+ [\c!rightspeech]
+ [\rightboundarycharacter\c!rightspeech{speech}]
+
+\definesymbol
+ [\c!middlespeech]
+ [\leftboundarycharacter\c!middlespeech{speech}]
+
+\appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
+\appendtoks\def\quote #1{'#1'}\to\simplifiedcommands
+
+%D The next features was so desperately needed by Giuseppe
+%D Bilotta that he made a module for it. Since this is a
+%D typical example of core functionality, I decided to extend
+%D the low level quotation macros in such a way that a speech
+%D feature could be build on top of it. The speech opening and
+%D closing symbols are defined per language. Italian is an
+%D example of a language that has them set.
+
+% this will replace the quotation and speed definitions
+
+\newsignal\delimitedtextsignal
+
+\let\currentdelimitedtext\s!unknown
+
+\def\delimitedtextlevel{\csname\??ci:\currentdelimitedtext:\c!level\endcsname}
+
+\def\doinitializetextlevel#1%
+ {\ifcsname\??ci:#1:\c!level\endcsname
+ \csname\??ci:#1:\c!level\endcsname\zerocount
+ \else
+ \expandafter\newcount\csname\??ci:#1:\c!level\endcsname
+ \fi}
+
+\def\delimitedtextparameter#1% will be sped up
+ {\executeifdefined{\??ci\currentdelimitedtext:\number\delimitedtextlevel#1}%
+ {\executeifdefined{\??ci\currentdelimitedtext#1}%
+ {\executeifdefined{\??ci#1}\empty}}}
+
+\unexpanded\def\definedelimitedtext
+ {\dodoubleempty\dodefinedelimitedtext}
+
+\def\dodefinedelimitedtext[#1][#2]%
+ {\doinitializetextlevel{#1}%
+ \doifassignmentelse{#2}
+ {\getparameters
+ [\??ci#1]
+ [\c!location=\v!margin, % \v!text \v!paragraph
+ \c!spacebefore=,
+ \c!spaceafter=\delimitedtextparameter\c!spacebefore,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\delimitedtextparameter\c!leftmargin,
+ \c!indentnext=\v!yes,
+ \c!before=,
+ \c!after=,
+ \c!left=,
+ \c!right=,
+ %\c!level=0,
+ \c!repeat=\v!no,
+ \c!method=,
+ #2]}%
+ {\doifdefined{#2}
+ {\copyparameters[\??ci#1][\??ci#2]
+ [\c!location,\c!spacebefore,\c!spaceafter,\c!style,\c!color,
+ \c!leftmargin,\c!rightmargin,\c!indentnext,
+ \c!before,\c!after,\c!left,\c!right]}}%
+ \doifsomething{#1}
+ {\setuvalue{#1}{\delimitedtext[#1]}%
+ \setvalue{\e!start#1}{\startdelimitedtext[#1]}%
+ \setvalue{\e!stop #1}{\stopdelimitedtext}}}
+
+\unexpanded\def\setupdelimitedtext
+ {\dotripleargument\dosetupdelimitedtext}
+
+\def\dosetupdelimitedtext[#1][#2][#3]% #2 = optional level
+ {\ifthirdargument
+ \getparameters[\??ci#1:#2][#3]%
+ \else\ifsecondargument
+ \getparameters[\??ci#1][#2]%
+ \else
+ \getparameters[\??ci][#1]%
+ \fi\fi}
+
+\def\dorepeatdelimitedtext
+ {\relax\ifcase\delimitedtextlevel\else
+ \dohandledelimitedtext\c!middle % maybe better \dohandleleftdelimitedtext
+ \fi}
+
+\let\dohandlerepeatdelimitedtext\relax
+
+\unexpanded\def\startdelimitedtext[#1]%
+ {\bgroup
+ \pushdelimitedtext{#1}%
+ \doifelse{\delimitedtextparameter\c!method}\s!font
+ {\def\dostopdelimitedtext
+ {\removeunwantedspaces\ignoredelimitedtext\c!right}%
+ \ignoredelimitedtext\c!left\ignorespaces}
+ {\doifelse{\delimitedtextparameter\c!repeat}\v!yes
+ {\let\dohandlerepeatdelimitedtext\dorepeatdelimitedtext}%
+ {\let\dohandlerepeatdelimitedtext\relax}%
+ \doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
+ {\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}
+
+% \def\dostartdelimitedtextpar[#1]%
+% {\let\dostopdelimitedtext\dostopdelimitedtextpar
+% \doifsomething{\delimitedtextparameter\c!spacebefore}
+% {\blank[\delimitedtextparameter\c!spacebefore]}%
+% \delimitedtextparameter\c!before
+% % nicer:
+% % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+% % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+% % backward compatible:
+% \doifelsenothing{#1}
+% {\endgraf
+% \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+% \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+% \let\dodostopdelimitedtextpar\endgraf}
+% {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
+% % so far
+% % \dochecknextindentation{\??ci\currentdelimitedtext}% AM: not here
+% \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
+% \leftdelimitedtextmark
+% \ignorespaces}
+
+% \def\dostopdelimitedtextpar
+% {\removeunwantedspaces
+% \removelastskip
+% \rightdelimitedtextmark
+% \dostopattributes
+% \dodostopdelimitedtextpar
+% \delimitedtextparameter\c!after
+% \doifsomething{\delimitedtextparameter\c!spaceafter}
+% {\blank[\delimitedtextparameter\c!spaceafter]}%
+% \dochecknextindentation{\??ci\currentdelimitedtext}% AM: here
+% \dorechecknextindentation}% AM: This was missing!
+
+\def\dostartdelimitedtextpar[#1]%
+ {\let\dostopdelimitedtext\dostopdelimitedtextpar
+ \doifsomething{\delimitedtextparameter\c!spacebefore}
+ {\blank[\delimitedtextparameter\c!spacebefore]}%
+ \delimitedtextparameter\c!before
+ % nicer:
+ % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+ % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+ % backward compatible:
+ \doifelsenothing{#1}
+ {\endgraf
+ \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
+ \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
+ \let\dodostopdelimitedtextpar\endgraf}
+ {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
+ % so far
+ % \dochecknextindentation{\??ci\currentdelimitedtext}% AM: not here
+ \pushmacro\checkindentation
+ \doifsomething{\delimitedtextparameter\c!indenting} % WS
+ {\setupindenting[\delimitedtextparameter\c!indenting]}%
+ \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
+ \leftdelimitedtextmark
+ \ignorespaces}
+
+\def\dostopdelimitedtextpar
+ {\removeunwantedspaces
+ \removelastskip
+ \rightdelimitedtextmark
+ \dostopattributes
+ \popmacro\checkindentation
+ \dodostopdelimitedtextpar
+ \delimitedtextparameter\c!after
+ \doifsomething{\delimitedtextparameter\c!spaceafter}
+ {\blank[\delimitedtextparameter\c!spaceafter]}%
+ \dochecknextindentation{\??ci\currentdelimitedtext}% AM: here
+ \dorechecknextindentation}% AM: This was missing!
+
+\def\dostartdelimitedtexttxt
+ {\let\dostopdelimitedtext\dostopdelimitedtexttxt
+ \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
+ \dohandleleftdelimitedtext\c!left
+ \ignorespaces}
+
+\def\dostopdelimitedtexttxt
+ {\removeunwantedspaces
+ \dohandlerightdelimitedtext\c!right
+ \dostopattributes}
+
+\unexpanded\def\stopdelimitedtext
+ {\dostopdelimitedtext
+ \popdelimitedtext
+ \egroup}
+
+\def\pushdelimitedtext#1%
+ {\globalpushmacro\currentdelimitedtext
+ \def\currentdelimitedtext{#1}%
+ \global\advance\delimitedtextlevel\plusone}
+
+\def\popdelimitedtext
+ {\global\advance\delimitedtextlevel\minusone
+ \globalpopmacro\currentdelimitedtext}
+
+\unexpanded\def\delimitedtext[#1]%
+ {\dontleavehmode % following ones can be omited
+ \pushdelimitedtext{#1}%
+ \doifelse{\delimitedtextparameter\c!method}\s!font
+ {\dofontdrivendelimited}
+ {\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
+ \dodelimitedtextpar\dodelimitedtexttxt}}
+
+% shortcuts
+
+\unexpanded\def\startdelimited{\startdelimitedtext}
+\unexpanded\def\stopdelimited {\stopdelimitedtext} % no let, dynamically assigned
+\def\delimited {\delimitedtext}
+
+\def\leftdelimitedtextmark
+ {\doifsomething{\delimitedtextparameter\c!left}
+ {\setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
+ \dontleavehmode
+ \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
+ \box\scratchbox}}
+
+\def\rightdelimitedtextmark
+ {\doifsomething{\delimitedtextparameter\c!right}
+ {\hsmash{\delimitedtextparameter\c!right}}}
+
+% \starttext
+% \hyphenatedword{groepsvrijstellingsverordeningen}\par
+% \hyphenatedword{\quote{groepsvrijstellingsverordeningen}}\par
+% \dorecurse{100}{\hskip300pt\hskip\recurselevel pt test \quote{xxx xxxx}.\par}
+% \page \setuppapersize[A5][A4]
+% \quotation {overly beautiful pusillanimous sesquipedalian
+% longwinded} test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test test test test test test test test test test test
+% test test test
+% \stoptext
+
+\def\dohandledelimitedtext#1#2%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+% \ifdim\lastskip=\delimitedtextsignal
+% \unskip
+ \ifdim\lastkern=\delimitedtextsignal
+ \unkern
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else
+ #2%
+ \fi
+ \ifhmode % else funny pagebeaks
+ \penalty\plustenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+% \penalty\plustenthousand % else overfull boxes, but that's better than dangling periods
+ \kern\delimitedtextsignal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\def\dohandleleftdelimitedtext#1#2%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \ifdim\lastkern=\delimitedtextsignal
+ \unkern
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else\ifdim\lastskip=\delimitedtextsignal
+ \unskip
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else
+ #2%
+ \fi\fi
+ \strut % new, needed below
+ \ifhmode % else funny pagebeaks
+ \penalty\plustenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+ \hskip\delimitedtextsignal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+\def\dohandlerightdelimitedtext#1#2%
+ {\begingroup
+ \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \ifdim\lastkern=\delimitedtextsignal
+ \unkern
+ \penalty\plustenthousand
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else\ifdim\lastskip=\delimitedtextsignal
+ \unskip
+ \penalty\plustenthousand
+ \hskip\hspaceamount\currentlanguage{interquotation}%
+ \else
+ #2%
+ \fi\fi
+ \ifhmode % else funny pagebeaks
+ \penalty\plustenthousand
+ \hskip\zeropoint % == \prewordbreak
+ \fi
+ \strut % new, needed below
+ \delimitedtextparameter#1% unhbox\scratchbox
+ \kern\delimitedtextsignal % +- \prewordbreak
+ \fi
+ \endgroup}
+
+
+\def\ignoredelimitedtext#1%
+ {\delimitedtextparameter#1}
+
+\def\handledelimitedtext#1%
+ {\dohandledelimitedtext{#1}\relax}
+
+\def\handleleftdelimitedtext#1%
+ {\dohandleleftdelimitedtext{#1}\relax}
+
+\def\handlerightdelimitedtext#1%
+ {\dohandlerightdelimitedtext{#1}\relax}
+
+\unexpanded\def\dodelimitedtextpar
+ {\dohandleleftdelimitedtext\c!left\relax
+ \groupedcommand
+ \donothing
+ {\dohandlerightdelimitedtext\c!right\removelastskip
+ \popdelimitedtext}}
+
+\unexpanded\def\dodelimitedtexttxt
+ {\doifelse{\delimitedtextparameter\c!style}\v!normal
+ \doquoteddelimited\doattributeddelimited}
+
+\def\doquoteddelimited
+ {\dohandleleftdelimitedtext\c!left\relax
+ \groupedcommand
+ \donothing
+ {\dohandlerightdelimitedtext\c!right
+ \removelastskip
+ \popdelimitedtext}}
+
+\def\doattributeddelimited
+ {\groupedcommand
+ {\dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color}
+ {\dostopattributes
+ \popdelimitedtext}}
+
+\def\dofontdrivendelimited
+ {\simplegroupedcommand
+ {\languageparameter{\c!left\currentdelimitedtext}}
+ {\languageparameter{\c!right\currentdelimitedtext}%
+ \popdelimitedtext}}
+
+% testcase for nesting:
+%
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+% \setupdelimitedtext[quotation][1][left=(,right=)]
+% \setupdelimitedtext[quotation][2][left={[},right={]}]
+% \setupdelimitedtext[quotation][3][left=\{,right=\}]
+% \quotation{... \quotation{...} ...}
+% \startquotation ... \startquotation... \quotation{...} \stopquotation\space ...\stopquotation
+
+\definedelimitedtext
+ [\v!quotation]
+ [\c!left={\symbol[\c!leftquotation]},
+ \c!right={\symbol[\c!rightquotation]},
+ \c!leftmargin=\v!standard]
+
+\definedelimitedtext
+ [\v!quote][\v!quotation]
+
+\setupdelimitedtext
+ [\v!quote]
+ [\c!location=\v!text,
+ \c!left={\symbol[\c!leftquote]},
+ \c!right={\symbol[\c!rightquote]}]
+
+\definedelimitedtext
+ [\v!blockquote][\v!quotation]
+
+\setupdelimitedtext
+ [\v!blockquote]
+ [\c!left=,
+ \c!right=]
+
+\definedelimitedtext
+ [\v!speech][\v!quotation]
+
+\setupdelimitedtext
+ [\v!speech]
+ [\c!repeat=\v!yes,
+ \c!left={\symbol[\c!leftspeech]},
+ \c!middle={\symbol[\c!middlespeech]},
+ \c!right={\symbol[\c!rightspeech]}]
+
+% how do we call an tight quote
+%
+% \definedelimitedtext
+% [\v!quotation][\v!quotation]
+%
+% \setupdelimitedtext
+% [\v!quotation]
+% [\c!indentnext=\v!no,
+% \c!spacebefore=\v!nowhite]
+
+\unexpanded\def\setupquotation{\setupdelimitedtext[\v!quotation]}
+\unexpanded\def\setupquote {\setupdelimitedtext[\v!quote]}
+
+% seldom used, move from kernel to run time module
+
+\ifx\tfx\undefined \let\tfx\relax \fi
+
+\def\basegrid
+ {\dosingleempty\dobasegrid}
+
+\def\dobasegrid[#1]%
+ {\begingroup
+ \getparameters[\??rt]
+ [\c!x=0,\c!y=0,
+ \c!nx=10,\c!ny=10,
+ \c!dx=.5,\c!dy=.5,
+ \c!xstep=0,\c!ystep=0,
+ \c!unit=\s!cm,
+ \c!scale=1,
+ \c!factor=1,
+ \c!offset=\v!yes,
+ \c!location=\v!left,
+ #1]%
+ \startpositioning
+ \dimen0=\@@rtdx\@@rtunit\relax
+ \dimen0=\@@rtscale\dimen0\relax
+ \dimen0=\@@rtfactor\dimen0\relax
+ \multiply\dimen0 \@@rtnx\relax
+ \dimen2=\@@rtdy\@@rtunit\relax
+ \dimen2=\@@rtscale\dimen2\relax
+ \dimen2=\@@rtfactor\dimen2\relax
+ \multiply\dimen2 \@@rtny\relax
+ \def\horline
+ {\vbox
+ {\hrule
+ \!!width \dimen0
+ \!!height \linewidth
+ \!!depth \!!zeropoint}}%
+ \def\verline%
+ {\vrule
+ \!!width \linewidth
+ \!!height \dimen2
+ \!!depth \!!zeropoint}%
+ \doglobal\newcounter\@@gridc
+ \doglobal\newcounter\@@gridd
+ \doglobal\newcounter\@@gride
+ \def\setlegend##1##2##3%
+ {\gdef\@@gridc{0}%
+ \dimen0=2em\relax
+ \dimen2=##2\@@rtunit\relax
+ \dimen2=\@@rtscale\dimen2\relax
+ \dimen2=\@@rtfactor\dimen2\relax
+ \divide\dimen0 \dimen2\relax
+ \xdef\@@gride{\number\dimen0}%
+ \ifnum\@@gride>50
+ \gdef\@@gride{100}%
+ \else\ifnum\@@gride>10
+ \gdef\@@gride{50}%
+ \else\ifnum\@@gride>5
+ \gdef\@@gride{10}%
+ \else\ifnum\@@gride>1
+ \gdef\@@gride{5}%
+ \else
+ \gdef\@@gride{1}%
+ \fi\fi\fi\fi
+ \gdef\@@gridd{0}%
+ \def\legend
+ {\ifnum\@@gridd=\zerocount
+ \vbox
+ {\increment(\@@gridc,##1)%
+ \hbox to 2em{\hss\@@gridc\hss}}%
+ \global\let\@@gridd=\@@gride
+ \fi
+ \doglobal\decrement\@@gridd
+ \doglobal\increment(\@@gridc,##1)}}%
+ \def\draw##1##2##3##4##5##6##7##8##9%
+ {\setuppositioning
+ [\c!state=##8,
+ \c!xstep=\v!absolute,
+ \c!ystep=\v!absolute,
+ \c!unit=\@@rtunit,
+ \c!scale=\@@rtscale,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!xoffset=##6,
+ \c!yoffset=##7]%
+ \doifelse{##9}\v!middle
+ {\scratchdimen##3pt\scratchdimen.5\scratchdimen
+ \edef\@@psxx{\withoutpt\the\scratchdimen}%
+ \scratchdimen##4pt\scratchdimen.5\scratchdimen
+ \edef\@@psyy{\withoutpt\the\scratchdimen}%
+ \scratchcounter##2\advance\scratchcounter -1
+ \edef\@@pszz{\the\scratchcounter}}
+ {\edef\@@psxx{0}\edef\@@psyy{0}\edef\@@pszz{##2}}%
+ \position(\@@psxx,\@@psyy){##1}%
+ \setuppositioning
+ [\c!state=##8,
+ \c!xstep=\v!relative,
+ \c!ystep=\v!relative,
+ \c!scale=\@@rtscale,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!unit=\@@rtunit]%
+ \dorecurse\@@pszz{\position(##3,##4){##5}}}%
+ \draw
+ \verline\@@rtnx\@@rtdx0\verline\!!zeropoint\!!zeropoint\v!start\empty
+ \draw
+ \horline\@@rtny0\@@rtdy\horline\!!zeropoint\!!zeropoint\v!start\empty
+ \tfx
+ \doifnot\@@rtxstep{0}
+ {\setlegend\@@rtxstep\@@rtdx\@@rtx
+ \draw\legend\@@rtnx\@@rtdx0\legend{-1em}{-1.5em}\v!overlay\@@rtlocation}%
+ \doifnot\@@rtystep{0}
+ {\setlegend\@@rtystep\@@rtdy\@@rty
+ \draw\legend\@@rtny0\@@rtdy\legend{-2em}{-.75ex}\v!overlay\@@rtlocation}%
+ \stoppositioning
+ \endgroup}
+
+\let\grid\basegrid
+
+% only used at pragma, move from kernel to run time module
+
+\def\referraldate
+ {\currentdate[\v!referral]}
+
+\def\doreferral[#1]%
+ {\noheaderandfooterlines
+ \bgroup
+ \getparameters
+ [\??km]
+ [\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
+ \c!from=,\c!to=,\c!ref=,#1]%
+ % moet anders, hoort niet in 01b
+ \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!sp=referencia]\to\@@@kmref
+ \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!sp=de]\to\@@@kmvan
+ \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!sp=a]\to\@@@kmaan
+ \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!sp=]\to\@@@kmbet
+ \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!sp=fecha]\to\@@@kmdat
+ \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!sp=]\to\@@@kmken
+ %
+ \definetabulate[\s!dummy][|l|p|]
+ \startdummy
+ \NC\@@@kmbet\EQ\@@kmbet\NC\NR
+ \NC\@@@kmdat\EQ\@@kmdat\NC\NR
+ \NC\@@@kmken\EQ\expanded{\smallcapped{\@@kmken}}\NC\NR
+ \doifsomething{\@@kmfrom\@@kmto}{\NC\NC\NC\NR}%
+ \doifsomething \@@kmfrom {\NC\@@@kmvan\EQ\@@kmfrom\NC\NR}%
+ \doifsomething \@@kmto {\NC\@@@kmaan\EQ\@@kmto\NC\NR}%
+ \doifsomething \@@kmref {\NC\NC\NC\NR\NC\@@@kmref\EQ\@@kmref\NC\NR}%
+ \stopdummy
+ \egroup}
+
+\def\referral
+ {\dosingleargument\doreferral}
+
+% FUZZY OLD STUFF: will be removed when not used in some manual;
+% rows instead of columns, i'd forgotten that this code exist
+%
+% \definesystemvariable{ri}
+%
+% \unexpanded\def\setuprows
+% {\dodoubleargument\getparameters[\??ri]}
+%
+% \definecomplexorsimpleempty\startrows
+%
+% \def\complexstartrows[#1]%
+% {\bgroup
+% \setuprows[#1]%
+% \let\do@@ribottom\relax
+% \def\row
+% {\do@@ribottom
+% \egroup
+% \dimen0\vsize
+% \divide\dimen0 \@@rin
+% \advance\dimen0 -\lineskip
+% \vbox to \dimen0
+% \bgroup
+% \@@ritop
+% \let\do@@ribottom\@@ribottom
+% \ignorespaces}%
+% \bgroup
+% \row}
+%
+% \unexpanded\def\stoprows
+% {\do@@ribottom
+% \egroup
+% \egroup}
+%
+% \setuprows
+% [\c!n=2,
+% \c!top=,
+% \c!bottom=\vfill]
+
+% THIS WAS MAIN-003.TEX
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+\definetabulate
+ [\v!legend]
+ [|emj1|i1|mR|]
+
+\setuptabulate
+ [\v!legend]
+ [\c!unit=.75em,\c!inner=\setquicktabulate\leg,EQ={=}]
+
+\definetabulate
+ [\v!legend][\v!two]
+ [|emj1|emk1|i1|mR|]
+
+\definetabulate
+ [\v!fact]
+ [|R|ecmj1|i1mR|]
+
+\setuptabulate
+ [\v!fact]
+ [\c!unit=.75em,\c!inner=\setquicktabulate\fact,EQ={=}]
+
+\unexpanded\def\xbox
+ {\bgroup\aftergroup\egroup\hbox\bgroup\tx\let\next=}
+
+\unexpanded\def\xxbox
+ {\bgroup\aftergroup\egroup\hbox\bgroup\txx\let\next=}
+
+% \def\mrm#1%
+% {$\rm#1$}
+
+%D \macros
+%D {definepairedbox, setuppairedbox, placepairedbox}
+%D
+%D Paired boxes, formally called legends, but from now on a
+%D legend is just an instance, are primarily meant for
+%D typesetting some text alongside an illustration. Although
+%D there is quite some variation possible, the functionality is
+%D kept simple, if only because in most cases such pairs are
+%D typeset sober.
+%D
+%D The location specification accepts a pair, where the first
+%D keyword specifies the arrangement, and the second one the
+%D alignment. The first key of the location pair is one of
+%D \type {left}, \type {right}, \type {top} or \type {bottom},
+%D while the second key can also be \type {middle}.
+%D
+%D The first box is just collected in an horizontal box, but
+%D the second one is a vertical box that gets passed the
+%D bodyfont and alignment settings.
+
+%D Today we would implement this using layers .... but for the
+%D moment we keep it this way.
+
+% \startbuffer[test]
+% \test left \test left,top \test left,bottom \test left,middle
+% \test right \test right,top \test right,bottom \test right,middle
+% \test top \test top,left \test top,right \test top,middle
+% \test bottom \test bottom,left \test bottom,right \test bottom,middle
+% \stopbuffer
+%
+% \def\showtest#1%
+% {\pagina
+% \typebuffer[demo]
+% \def\test##1
+% {\startlinecorrection[blank]
+% \getbuffer[demo]%
+% \ruledhbox\placelegend
+% [bodyfont=6pt,location={##1}]
+% {\framed[width=.25\textwidth]{\tttf##1}}
+% {#1}
+% \stoplinecorrection}
+% \getbuffer[test]}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=\hsize,maxwidth=\makeupwidth,
+% height=\vsize,maxheight=\makeupheight]
+% \stopbuffer
+%
+% \showtest{These examples demonstrate the default settings.}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=\textwidth,
+% maxwidth=\textwidth]
+% \stopbuffer
+%
+% \showtest{\input tufte }
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=.65\textwidth]
+% \stopbuffer
+%
+% \showtest{\input knuth }
+%
+% \startbuffer[demo]
+% \setuplegend
+% [height=2cm]
+% \stopbuffer
+%
+% \showtest{These examples demonstrate some other settings.}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [width=.65\textwidth,
+% height=2cm]
+% \stopbuffer
+%
+% \showtest{These examples demonstrate some other settings.}
+%
+% \startbuffer[demo]
+% \setuplegend
+% [n=2,align=right,width=.5\textwidth]
+% \stopbuffer
+%
+% \showtest{\input zapf }
+
+%D \macros
+%D {setuplegend, placelegend}
+%D
+%D It makes sense to typeset a legend to a figure in \TEX\
+%D and not in a drawing package. The macro \type {\placelegend}
+%D combines a figure (or something else) and its legend. This
+%D command is just a paired box.
+%D
+%D The legend is placed according to \type {location}, being
+%D \type {bottom} or \type {right}. The macro macro is used as
+%D follows.
+%D
+%D \starttyping
+%D \placefigure
+%D {whow}
+%D {\placelegend
+%D {\externalfigure[cow]}
+%D {\starttabulation
+%D \NC 1 \NC head \NC \NR
+%D \NC 2 \NC legs \NC \NR
+%D \NC 3 \NC tail \NC \NR
+%D \stoptabulation}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend
+%D {\externalfigure[cow]}
+%D {\starttabulation[|l|l|l|l|]
+%D \NC 1 \NC head \NC 3 \NC tail \NC \NR
+%D \NC 2 \NC legs \NC \NC \NC \NR
+%D \stoptabulation}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2]
+%D {\externalfigure[cow]}
+%D {\starttabulation
+%D \NC 1 \NC head \NC \NR
+%D \NC 2 \NC legs \NC \NR
+%D \NC 3 \NC tail \NC \NR
+%D \stoptabulation}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2]
+%D {\externalfigure[cow]}
+%D {head \par legs \par tail}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2]
+%D {\externalfigure[cow]}
+%D {\startitemize[packed]
+%D \item head \item legs \item tail \item belly \item horns
+%D \stopitemize}}
+%D
+%D \placefigure
+%D {whow}
+%D {\placelegend[n=2,width=.8\hsize]
+%D {\externalfigure[cow]}
+%D {\startitemize[packed]
+%D \item head \item legs \item tail \item belly \item horns
+%D \stopitemize}}
+%D \stoptyping
+
+\newbox\firstpairedbox
+\newbox\secondpairedbox
+
+\unexpanded\def\definepairedbox
+ {\dodoubleempty\dodefinepairedbox}
+
+\def\dodefinepairedbox[#1][#2]%
+ {\getparameters
+ [\??ld#1]
+ [\c!n=1,
+ \c!distance=\bodyfontsize,
+ \c!before=,
+ \c!after=,
+ \c!color=,
+ \c!style=,
+ \c!inbetween={\blank[\v!medium]},
+ \c!width=\hsize,
+ \c!height=\vsize,
+ \c!maxwidth=\textwidth, % \makeupwidth,
+ \c!maxheight=\textheight, % \makeupheight,
+ \c!bodyfont=,
+ \c!align=,
+ \c!location=\v!bottom,
+ #2]%
+ \setvalue{\e!setup#1\e!endsetup}{\setuppairedbox[#1]}%
+ \setvalue{\e!place#1}{\placepairedbox[#1]}}
+
+\unexpanded\def\setuppairedbox
+ {\dodoubleempty\dosetuppairedbox}
+
+\def\dosetuppairedbox[#1]%
+ {\getparameters[\??ld#1]}
+
+\unexpanded\def\placepairedbox
+ {\bgroup\dodoubleempty\doplacepairedbox}
+
+\def\doplacepairedbox[#1][#2]% watch the hsize/vsize tricks
+ {\setuppairedbox[#1][#2]% % and don't change them
+ \copyparameters % brrr
+ [\??ld][\??ld#1]
+ [\c!n,\c!distance,\c!inbetween,\c!before,\c!after,
+ \c!width,\c!height,\c!maxwidth,\c!maxheight,
+ \c!color,\c!style,\c!bodyfont,\c!align,\c!location]%
+ \@@ldbefore\bgroup
+ \global\setsystemmode{pairedbox}%
+ \beforefirstpairedbox
+ \dowithnextbox
+ {\betweenbothpairedboxes
+ \dowithnextbox
+ {\afterbothpairedboxes
+ \egroup\@@ldafter
+ \egroup}
+ \vbox\bgroup
+ \insidesecondpairedbox
+ \let\next=}
+ \hbox}
+
+\def\beforefirstpairedbox
+ {\chardef\pairedlocationa1 % left
+ \chardef\pairedlocationb4 % middle
+ \getfromcommacommand[\@@ldlocation][1]%
+ \processaction
+ [\commalistelement]
+ [ \v!left=>\chardef\pairedlocationa0,
+ \v!right=>\chardef\pairedlocationa1,
+ \v!top=>\chardef\pairedlocationa2,
+ \v!bottom=>\chardef\pairedlocationa3]%
+ \getfromcommacommand[\@@ldlocation][2]%
+ \processaction
+ [\commalistelement]
+ [ \v!left=>\chardef\pairedlocationb0,
+ \v!right=>\chardef\pairedlocationb1,
+ \v!high=>\chardef\pairedlocationb2,
+ \v!top=>\chardef\pairedlocationb2,
+ \v!low=>\chardef\pairedlocationb3,
+ \v!bottom=>\chardef\pairedlocationb3,
+ \v!middle=>\chardef\pairedlocationb4]}
+
+\def\betweenbothpairedboxes
+ {\switchtobodyfont[\@@ldbodyfont]% split under same regime
+ \setbox\firstpairedbox\flushnextbox
+ \ifnum\pairedlocationa<2
+ \hsize\wd\firstpairedbox % trick
+ \hsize\@@ldwidth
+ \scratchdimen\wd\firstpairedbox
+ \advance\scratchdimen \@@lddistance
+ \bgroup\advance\scratchdimen \hsize
+ \ifdim\scratchdimen>\@@ldmaxwidth\relax
+ \egroup
+ \hsize\@@ldmaxwidth
+ \advance\hsize -\scratchdimen
+ \else
+ \egroup
+ \fi
+ \else
+ \hsize\wd\firstpairedbox
+ \hsize\@@ldwidth % can be \hsize
+ \ifdim\hsize>\@@ldmaxwidth\relax \hsize\@@ldmaxwidth \fi % can be \hsize
+ \fi
+ \ifnum\@@ldn>\plusone
+ \setrigidcolumnhsize\hsize\@@lddistance\@@ldn
+ \fi}
+
+\def\afterbothpairedboxes
+ {\setbox\secondpairedbox\vbox
+ {\ifnum\@@ldn>1
+ \rigidcolumnbalance\nextbox
+ \else
+ \flushnextbox
+ \fi}%
+ \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize
+ \forgetall
+ \ifnum\pairedlocationa<2
+ \scratchdimen\maxoftwoboxdimens\ht\firstpairedbox\secondpairedbox
+ \vsize\scratchdimen
+ \ifdim\scratchdimen<\@@ldheight\relax % can be \vsize
+ \scratchdimen\@@ldheight
+ \fi
+ \ifdim\scratchdimen>\@@ldmaxheight\relax
+ \scratchdimen\@@ldmaxheight
+ \fi
+ \valignpairedbox\firstpairedbox \scratchdimen
+ \valignpairedbox\secondpairedbox\scratchdimen
+ \else
+ \scratchdimen\maxoftwoboxdimens\wd\firstpairedbox\secondpairedbox
+ \halignpairedbox\firstpairedbox \scratchdimen
+ \halignpairedbox\secondpairedbox\scratchdimen
+ \scratchdimen\ht\secondpairedbox
+ \vsize\scratchdimen
+ \ifdim\ht\secondpairedbox<\@@ldheight\relax % can be \vsize
+ \scratchdimen\@@ldheight\relax % \relax needed
+ \fi
+ \ifdim\scratchdimen>\@@ldmaxheight\relax % todo: totale hoogte
+ \scratchdimen\@@ldmaxheight\relax % \relax needed
+ \fi
+ \ifdim\scratchdimen>\ht\secondpairedbox
+ \setbox\secondpairedbox\vbox to \scratchdimen
+ {\ifnum\pairedlocationa=3 \vss\fi %
+ \box\secondpairedbox
+ \ifnum\pairedlocationa=2 \vss\fi}% \kern\zeropoint
+ \fi
+ \fi
+ \ifcase\pairedlocationa
+ \box\secondpairedbox\hskip\@@lddistance\box\firstpairedbox \or
+ \box\firstpairedbox \hskip\@@lddistance\box\secondpairedbox\or
+ \box\secondpairedbox\endgraf \nointerlineskip \@@ldinbetween \box\firstpairedbox \or
+ \box\firstpairedbox \endgraf \nointerlineskip \@@ldinbetween \box\secondpairedbox\else
+ \fi
+ \egroup}
+
+\def\insidesecondpairedbox
+ {\forgetall
+ \setupalign[\@@ldalign]%
+ \tolerantTABLEbreaktrue % hm.
+ \blank[\v!disable]%
+ \everypar{\begstrut}}
+
+\def\maxoftwoboxdimens#1#2#3%
+ {#1\ifdim#1#2>#1#3 #2\else#3\fi}
+
+\def\valignpairedbox#1#2%
+ {\setbox#1\vbox to #2
+ {\ifcase\pairedlocationb\or\or\or\vss\or\vss\fi
+ \box#1\relax
+ \ifcase\pairedlocationb\or\or\vss\or\or\vss\fi}}
+
+\def\halignpairedbox#1#2%
+ {\setbox#1\hbox to #2
+ {\ifcase\pairedlocationb\or\hss\or\or\or\hss\fi
+ \box#1\relax
+ \ifcase\pairedlocationb\hss\or\or\or\or\hss\fi}}
+
+\definepairedbox[\v!legend]
+
+%D Goody:
+
+\appendtoks
+ \global\resetsystemmode{combination}%
+ \global\resetsystemmode{pairedbox}%
+\to \everyinsidefloat
+
+% todo: \startcombination \startcomb \stopcomb ...
+
+% needs to be mkiv'd
+
+\newcount\horcombination % counter
+\newcount\totcombination
+
+\unexpanded\def\definecombination
+ {\dodoubleempty\dodefinecombination}
+
+\def\dodefinecombination[#1][#2]%
+ {\copyparameters
+ [\??co#1][\??co]
+ [\c!width,\c!height,\c!distance,\c!location,%
+ \c!before,\c!inbetween,\c!after,\c!align,%
+ \c!style,\c!color]%
+ \getparameters
+ [\??co#1][#2]}
+
+\unexpanded\def\setupcombinations
+ {\dodoubleempty\dosetupcombinations}
+
+\def\dosetupcombinations[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??co#1][#2]%
+ \else
+ \getparameters[\??co][#1]%
+ \fi}
+
+\def\combinationparameter#1%
+ {\csname\??co\currentcombination#1\endcsname}%
+
+\unexpanded\def\startcombination
+ {\bgroup % so we can grab a group
+ \dodoubleempty\dostartcombination}
+
+% \startcombination {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2*1] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[1*2] {alpha} {a} {beta} {b} \stopcombination
+% \startcombination[2] {alpha} {a} {beta} {b} \stopcombination
+
+\def\dostartcombination[#1][#2]%
+ {\global\setsystemmode{combination}%
+ \doifnothing{#1}\firstargumentfalse % to be sure (when called in macros)
+ \doifnothing{#2}\secondargumentfalse % to be sure (when called in macros)
+ \ifsecondargument
+ \def\currentcombination{#1}%
+ \edef\currentcombinationspec{#2*1*}%
+ \else % better : \doifcombinationelse ... \??co#1\c!location
+ \doifinstringelse{*}{#1}
+ {\let\currentcombination\empty
+ \edef\currentcombinationspec{#1*1*}}
+ {\doifnumberelse{#1}
+ {\let\currentcombination\empty
+ \edef\currentcombinationspec{#1*1*}}
+ {\def\currentcombination{#1}%
+ \edef\currentcombinationspec{2*1*}}}%
+ \fi
+ \forgetall
+ \doifelse{\combinationparameter\c!height}\v!fit
+ \vbox {\vbox to \combinationparameter\c!height}%
+ \bgroup
+ \expanded{\dodostartcombination[\currentcombinationspec]}}
+
+\long\def\dodostartcombination[#1*#2*#3]%
+ {\setuphorizontaldivision
+ [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
+ \global\horcombination#1%
+ \global\totcombination#2%
+ \global\setbox\combinationstack\emptybox
+ \xdef\maxhorcombination{\the\horcombination}%
+ \multiply\totcombination\horcombination
+ \tabskip\zeropoint
+ \doifelse{\combinationparameter\c!width}\v!fit
+ {\halign}{\halign to \combinationparameter\c!width}%
+ \bgroup&%
+ %\hfil##\hfil% now : location={left,top}
+ \expanded{\doifnotinset{\v!left}{\combinationparameter\c!location}}\hfil
+ ##%
+ \expanded{\doifnotinset{\v!right}{\combinationparameter\c!location}}\hfil
+ &\tabskip\zeropoint \!!plus 1fill##\cr
+ \docombination}
+
+\def\docombination % we want to add struts but still ignore an empty box
+ {\dowithnextbox
+ {\setbox0\flushnextbox
+ \dowithnextbox
+ {\setbox2\flushnextbox
+ \dodocombination}%
+ \vtop\bgroup
+ \def\next
+ {\futurelet\nexttoken\nextnext}%
+ \def\nextnext
+ {\ifx\nexttoken\egroup \else % the next box is empty
+ \hsize\wd0
+ \setupalign[\combinationparameter\c!align]%
+ \dostartattributes{\??co\currentcombination}\c!style\c!color\empty
+ \bgroup
+ \aftergroup\endstrut
+ \aftergroup\dostopattributes
+ \aftergroup\egroup
+ \begstrut
+ \fi}%
+ \afterassignment\next\let\nexttoken=}
+ \hbox}
+
+\def\depthonlybox
+ {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}
+
+\def\dodocombination
+ {\vbox
+ {\forgetall % \setupwhitespace[\v!none]%
+ \let\next\vbox
+ \expanded{\processallactionsinset[\combinationparameter\c!location]}
+ [ \v!top=>\let\next\depthonlybox, % \tbox,
+ \v!middle=>\let\next\halfwaybox]%
+ \next{\copy0}%
+ % we need to save the caption for a next alignment line
+ \saveoncombinationstack2}%
+ \ifnum\totcombination>\plusone
+ \global\advance\totcombination\minusone
+ \global\advance\horcombination\minusone
+ \ifnum\horcombination=\zerocount
+ \def\next
+ {\cr
+ \flushcombinationstack
+ \noalign
+ {\forgetall % \setupwhitespace[\v!none]% no
+ \global\setbox\combinationstack\emptybox
+ \nointerlineskip
+ \combinationparameter\c!after
+ \combinationparameter\c!before
+ \vss
+ \nointerlineskip}%
+ \global\horcombination\maxhorcombination\relax
+ \docombination}%
+ \else
+ \def\next
+ {&&&\hskip\combinationparameter\c!distance&\docombination}%
+ \fi
+ \else
+ \def\next
+ {\cr
+ \flushcombinationstack
+ \egroup}%
+ \fi
+ \next}
+
+% formally ok:
+%
+% \unexpanded\def\stopcombination
+% {\egroup
+% \egroup}
+%
+% more robust:
+%
+% \unexpanded\def\stopcombination
+% {{}{}{}{}{}{}{}{}% catches (at most 4) missing entries
+% \egroup
+% \egroup}
+%
+% even better:
+
+\unexpanded\def\stopcombination
+ {{\scratchtoks{{}{}{}}\dorecurse\totcombination{\appendtoks{}{}{}{}\to\scratchtoks}\expandafter}\the\scratchtoks
+ \egroup
+ \egroup}
+
+\newbox\combinationstack
+
+\def\saveoncombinationstack#1%
+ {\global\setbox\combinationstack\hbox
+ {\hbox{\box#1}\unhbox\combinationstack}}
+
+\def\flushcombinationstack
+ {\noalign
+ {\ifdim\ht\combinationstack>\zeropoint
+\nointerlineskip % nieuw
+ \combinationparameter\c!inbetween
+ \global\horcombination\maxhorcombination
+ \globallet\doflushcombinationstack\dodoflushcombinationstack
+ \else
+ \global\setbox\combinationstack\emptybox
+ \globallet\doflushcombinationstack\donothing
+ \fi}%
+ \doflushcombinationstack\crcr}
+
+\gdef\dodoflushcombinationstack
+ {\global\setbox\combinationstack\hbox
+ {\unhbox\combinationstack
+ \global\setbox1\lastbox}%
+ \box1% \ruledhbox{\box1}%
+ \global\advance\horcombination\minusone\relax
+ \ifnum\horcombination>\zerocount
+ \def\next{&&&&\doflushcombinationstack}%
+ \else
+ \global\setbox\combinationstack\emptybox
+ %\let\next\relax
+ \@EA\gobbleoneargument
+ \fi
+ \next}
+
+\setupcombinations
+ [\c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!distance=1em,
+ \c!location=\v!bottom, % can be something {top,left}
+ \c!before=\blank,
+ \c!inbetween={\blank[\v!medium]},
+ \c!style=,
+ \c!color=,
+ \c!after=,
+ \c!align=\v!middle]
+
+%D \macros
+%D {startfloatcombination}
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D \placefigure
+%D [left,none]
+%D {}
+%D {\startfloatcombination[2*2]
+%D \placefigure{alpha}{\externalfigure[cow.pdf][width=1cm]}
+%D \placefigure{beta} {\externalfigure[cow.pdf][width=2cm]}
+%D \placefigure{gamma}{\externalfigure[cow.pdf][width=3cm]}
+%D \placefigure{delta}{\externalfigure[cow.pdf][width=4cm]}
+%D \stopfloatcombination}
+%D
+%D \input tufte
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\startfloatcombination
+ {\dodoubleempty\dostartfloatcombination}
+
+\def\dostartfloatcombination[#1][#2]%
+ {\vbox\bgroup
+ %\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature
+ \chardef\postcenterfloatmethod\zerocount
+ \forcelocalfloats
+ \unexpanded\def\stopfloatcombination
+ {\scratchtoks\emptytoks
+ \dorecurse\noflocalfloats
+ {\appendetoks{\noexpand\getlocalfloat{\recurselevel}}{}\to\scratchtoks}%
+ \expanded{\startcombination[#1]\the\scratchtoks}\stopcombination
+ \resetlocalfloats
+ \egroup}}
+
+\unexpanded\def\placerelativetoeachother#1#2%
+ {\bgroup
+ \dowithnextbox
+ {\bgroup
+ \setbox0\box\nextbox
+ \dowithnextbox
+ {\setbox2\box\nextbox
+ #1{#2#########2\cr\box0\cr\box2\cr}
+ \egroup
+ \egroup}
+ \hbox}
+ \hbox}
+
+\unexpanded\def\placeontopofeachother{\placerelativetoeachother\halign\hss}
+\unexpanded\def\placesidebyside {\placerelativetoeachother\valign\vss}
+
+%D A couple of examples, demonstrating how the depth is
+%D taken care of:
+%D
+%D \startbuffer
+%D test\rotate[frame=on, rotation=0] {gans}%
+%D test\rotate[frame=on, rotation=90] {gans}%
+%D test\rotate[frame=on, rotation=180]{gans}%
+%D test\rotate[frame=on, rotation=270]{gans}%
+%D test
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% When we rotate over arbitrary angles, we need to relocate the
+% resulting box because rotation brings that box onto the negative
+% axis. The calculations (mostly sin and cosine) need to be tuned for
+% the way a box is packages (i.e. the refence point). A typical example
+% of drawing, scribbling, and going back to the days of school math.
+%
+% We do a bit more calculations than needed, simply because that way
+% it's easier to debug the code.
+
+\def\dododorotatenextbox
+ {\setbox\nextbox\vbox to \@@layerysiz
+ {\vfill
+ \hbox to \@@layerxsiz
+ {\dostartrotation\@@rorotation
+ \nextboxwd\zeropoint
+ \nextboxht\zeropoint
+ \flushnextbox
+ \dostoprotation
+ \hfill}%
+ \kern\@@layerypos}%
+ \setbox\nextbox\hbox
+ {\kern\@@layerxpos
+ \kern\@@layerxoff
+ \lower\@@layeryoff\flushnextbox}}
+
+\def\dodorotatenextbox#1#2% quite some trial and error -)
+ {\dontshowcomposition
+ \dontcomplain
+ \ifnum#2=\plusfour
+ % new, location=middle
+ \!!widthb \nextboxwd
+ \!!heightb\nextboxht
+ \!!depthb \nextboxdp
+ \setbox\nextbox\vbox{\vskip.5\nextboxht\hskip-.5\nextboxwd\flushnextbox}%
+ \smashbox\nextbox
+ \fi
+ \!!widtha \nextboxwd
+ \!!heighta\nextboxht
+ \!!deptha \nextboxdp
+ \!!doneafalse
+ \!!donebfalse
+ \ifcase#2\or
+ % 1: fit
+ \or
+ % 2: depth, not fit
+ \!!doneatrue
+ \!!donebtrue
+ \or
+ % 3: depth, fit
+ \!!donebtrue
+ \fi
+ \setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}%
+ \!!dimena \nextboxht
+ \setcalculatedcos\cos\@@rorotation
+ \setcalculatedsin\sin\@@rorotation
+ \@@layerxpos\zeropoint
+ \@@layerypos\zeropoint
+ \@@layerxoff\zeropoint
+ \@@layeryoff\zeropoint
+ \ifdim\sin\points>\zeropoint
+ \ifdim\cos\points>\zeropoint
+ \@@layerxsiz \cos\!!widtha
+ \@@layerysiz \sin\!!widtha
+ \advance\@@layerxsiz \sin\!!dimena
+ \advance\@@layerysiz \cos\!!dimena
+ \@@layerypos \cos\!!dimena
+ \if!!donea
+ \@@layerxoff \negated\sin\!!dimena
+ \advance\@@layerxoff \sin\!!deptha
+ \fi
+ \if!!doneb
+ \@@layeryoff \cos\!!deptha
+ \fi
+ \dododorotatenextbox
+ \else
+ \@@layerxsiz \negated\cos\!!widtha
+ \@@layerysiz \sin\!!widtha
+ \advance\@@layerxsiz \sin\!!dimena
+ \advance\@@layerysiz \negated\cos\!!dimena
+ \@@layerxpos \negated\cos\!!widtha
+ \if!!donea
+ \@@layerxoff -\@@layerxsiz
+ \advance\@@layerxoff \sin\!!deptha
+ \fi
+ \if!!doneb
+ \@@layeryoff \negated\cos\!!heighta
+ \fi
+ \dododorotatenextbox
+ \wd\nextbox\if!!donea\sin\!!deptha\else\@@layerxsiz\fi
+ \fi
+ \else
+ \ifdim\cos\points<\zeropoint
+ \@@layerxsiz \negated\cos\!!widtha
+ \@@layerysiz \negated\sin\!!widtha
+ \advance\@@layerxsiz \negated\sin\!!dimena
+ \advance\@@layerysiz \negated\cos\!!dimena
+ \@@layerxpos \@@layerxsiz
+ \@@layerypos \negated\sin\!!widtha
+ \if!!donea
+ \@@layerxoff -\@@layerxsiz
+ \advance\@@layerxoff \negated\sin\!!heighta
+ \fi
+ \if!!doneb
+ \@@layeryoff \@@layerysiz
+ \advance\@@layeryoff \cos\!!deptha
+ \fi
+ \dododorotatenextbox
+ \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
+ \else
+ \@@layerxsiz \cos\!!widtha
+ \@@layerysiz \negated\sin\!!widtha
+ \advance\@@layerxsiz \negated\sin\!!dimena
+ \advance\@@layerysiz \cos\!!dimena
+ \ifdim\sin\points=\zeropoint
+ \@@layerxpos \zeropoint
+ \@@layerxoff \zeropoint
+ \@@layerypos \@@layerysiz
+ \if!!doneb
+ \@@layeryoff \!!deptha
+ \fi
+ \else
+ \@@layerypos \@@layerysiz
+ \@@layerxpos \negated\sin\!!dimena
+ \if!!donea
+ \@@layerxoff -\@@layerxsiz
+ \advance\@@layerxoff \negated\sin\!!heighta
+ \fi
+ \if!!doneb
+ \@@layeryoff \negated\sin\!!deptha
+ \fi
+ \fi
+ \dododorotatenextbox
+ \ifdim\sin\points=\zeropoint
+ \else
+ \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
+ \fi
+ \fi
+ \fi
+ % new, location=middle
+ \ifnum#2=\plusfour
+ \setbox\nextbox\vbox{\vskip-.5\!!heightb\hskip.5\!!heightb\flushnextbox}%
+ \nextboxwd\!!widthb
+ \nextboxht\!!heightb
+ \nextboxdp\!!depthb
+ \fi}
+
+\def\dorotatenextbox#1#2%
+ {\doifsomething{#1}
+ {\edef\@@rorotation{\realnumber{#1}}% get rid of leading zeros and spaces
+ \setbox\nextbox\vbox{\flushnextbox}% not really needed
+ \dodorotatenextbox\@@rorotation#2}%
+ \hbox{\boxcursor\flushnextbox}}
+
+\def\dodorotatebox#1% {angle} \hbox/\vbox/\vtop
+ {\bgroup\hbox\bgroup % compatibility hack
+ \dowithnextbox
+ {\dorotatenextbox{#1}\plusone
+ \egroup\egroup}}
+
+\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
+ {\ifcase#1\relax
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\dodorotatebox
+ \fi{#1}}
+
+\unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
+ {\bgroup\complexorsimpleempty\rotate}
+
+% \def\complexrotate[#1]% framed met diepte !
+% {\getparameters[\??ro][#1]%
+% \processaction
+% [\@@rolocation]
+% [ \v!depth=>\!!counta\plusthree\donefalse,% depth fit - raw box
+% \v!fit=>\!!counta\plustwo \donefalse,% depth tight - raw box
+% \v!broad=>\!!counta\plusone \donefalse,% nodepth fit - raw box
+% \v!high=>\!!counta\plusone \donetrue ,% nodepth fit - framed
+% \v!middle=>\!!counta\plusfour \donefalse,% centered, keep dimensions
+% \s!default=>\!!counta\plusthree\donetrue ,% depth fit - framed
+% \s!unknown=>\!!counta\plusthree\donetrue ]% depth fit - framed
+% \ifdone
+% \def\docommand{\localframed[\??ro][#1,\c!location=]}%
+% \else
+% \let\docommand\relax
+% \fi
+% \dowithnextbox{\dorotatenextbox\@@rorotation\!!counta\egroup}\vbox\docommand}
+
+\setvalue{\??ro::\c!location::\v!depth }{\!!counta\plusthree\donefalse} % depth fit - raw box
+\setvalue{\??ro::\c!location::\v!fit }{\!!counta\plustwo \donefalse} % depth tight - raw box
+\setvalue{\??ro::\c!location::\v!broad }{\!!counta\plusone \donefalse} % nodepth fit - raw box
+\setvalue{\??ro::\c!location::\v!high }{\!!counta\plusone \donetrue } % nodepth fit - framed
+\setvalue{\??ro::\c!location::\v!middle }{\!!counta\plusfour \donefalse} % centered, keep dimensions
+\setvalue{\??ro::\c!location::\v!default}{\!!counta\plusthree\donetrue } % depth fit - framed
+
+\def\complexrotate[#1]% framed met diepte !
+ {\getparameters[\??ro][#1]%
+ \executeifdefined{\??ro::\c!location::\@@rolocation}{\!!counta\plusthree\donetrue}%
+ \ifdone
+ \def\docommand{\localframed[\??ro][#1,\c!location=]}%
+ \else
+ \let\docommand\relax
+ \fi
+ \dowithnextbox{\dorotatenextbox\@@rorotation\!!counta\egroup}\vbox\docommand}
+
+\presetlocalframed[\??ro]
+
+\unexpanded\def\setuprotate
+ {\dodoubleargument\getparameters[\??ro]}
+
+\setuprotate
+ [\c!rotation=90,
+ \c!location=\v!normal,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off]
+
+% \dostepwiserecurse{0}{360}{10}
+% {\startlinecorrection[blank]
+% \hbox
+% {\expanded{\setuprotate[rotation=\recurselevel]}%
+% \traceboxplacementtrue
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=depth] {\ruledhbox{\bfb (depth)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=fit] {\ruledhbox{\bfb (fit)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=broad] {\ruledhbox{\bfb (broad)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=normal]{\ruledhbox{\bfb (normal)}}}}%
+% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=high] {\ruledhbox{\bfb (high)}}}}}
+% \stoplinecorrection}
+
+% to be used in some other places! todo!
+%
+% divides \hsize in fractions, will be made a bit more
+% clever and advanced when needed
+%
+% \horizontaldivision[n/m,elements,distance]
+%
+% \horizontaldivision[2/5,3,1em]
+% \horizontaldivision[2/5,3,1em]
+% \horizontaldivision[1/5,3,1em]
+%
+% \setuphorizontaldivision[afstand=,aantal=] (passend,passend)
+
+\def\??fr{@@fr}
+
+\unexpanded\def\setuphorizontaldivision
+ {\dodoubleargument\getparameters[\??fr]}
+
+\def\horizontaldivision
+ {\dosingleargument\dohorizontaldivision}
+
+\def\dohorizontaldivision[#1]%
+ {\dodohorizontaldivision[#1,,,,,,]}
+
+\def\dodohorizontaldivision[#1/#2,#3,#4,#5]%
+ {\doifelsenothing{#3}
+ {\doifelse\@@frn\v!fit
+ {\!!counta#2\relax}
+ {\!!counta\@@frn\relax}}
+ {\!!counta#3\relax}%
+ \doifelsenothing{#4}
+ {\doifelse\@@frdistance\v!fit
+ {\!!widtha\zeropoint}
+ {\!!widtha\@@frdistance}}
+ {\!!widtha#4}%
+ \advance\!!counta \minusone
+ \multiply\!!widtha \!!counta
+ \advance\hsize -\!!widtha
+ \divide\hsize #2\relax
+ \hsize#1\hsize}
+
+\setuphorizontaldivision
+ [\c!distance=\tfskipsize,
+ \c!n=\v!fit]
+
+%D This one is for Daniel Pittman, who wanted tight
+%D fractions. We show three versions. First the simple
+%D one using \type {\low} and \type {high}:
+%D
+%D \startbuffer
+%D \def\vfrac#1#2%
+%D {\hbox{\high{\tx#1\kern-.25em}/\low{\kern-.25em\tx#2}}}
+%D
+%D test \vfrac{1}{2} test \vfrac{123}{456} test
+%D \stopbuffer
+%D
+%D \typebuffer {\showmakeup\getbuffer}
+%D
+%D A better way to handle the kerning is the following, here
+%D we kind of assume that tye slash is symmetrical and has
+%D nearly zero width.
+%D
+%D \startbuffer
+%D \def\vfract#1#2%
+%D {\hbox{\high{\tx#1}\hbox to \zeropoint{\hss/\hss}\low{\tx#2}}}
+%D \stopbuffer
+%D
+%D \typebuffer {\showmakeup\getbuffer}
+%D
+%D The third and best alternative is the following:
+%D
+%D {\showmakeup\getbuffer}\crlf\getbuffer
+%D
+%D This time we measure the height of the \type {/} and
+%D shift over the maximum height and depths of this
+%D character and the fractional digits (we use 57 as
+%D sample). Here we combine all methods in one macros.
+
+\chardef\vulgarfractionmethod=3
+
+\definehspace[vulgarfraction][.25em] % [.15em]
+\definesymbol[vulgarfraction][/] % [\raise.2ex\hbox{/}]
+
+\unexpanded\def\vulgarfraction#1#2%
+ {\dontleavehmode
+ \hbox
+ {\def\vulgarfraction{vulgarfraction}%
+ \ifcase\vulgarfractionmethod
+ #1\symbol[\vulgarfraction]#2%
+ \or
+ \high{\tx#1\kern-\hspaceamount\empty\vulgarfraction}%
+ \symbol[\vulgarfraction]%
+ \low {\kern-\hspaceamount\empty\vulgarfraction\tx#2}%
+ \or
+ \high{\tx#1}%
+ \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
+ \low{\tx#2}%
+ \or
+ \setbox0\hbox{\symbol[\vulgarfraction]}%
+ \setbox2\hbox{\txx57}%
+ \raise\ht0\hbox{\lower\ht2\hbox{\txx#1}}%
+ \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
+ \lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
+ \fi}}
+
+\ifx\vfrac\undefined \let\vfrac\vulgarfraction \fi
+
+%D \starttabulate
+%D \HL
+%D \NC \bf method \NC \bf visualization \NC\NR
+%D \HL
+%D \NC 0 \NC \chardef\vulgarfractionmethod0\vulgarfraction{1}{2} \NC\NR
+%D \NC 1 \NC \chardef\vulgarfractionmethod1\vulgarfraction{1}{2} \NC\NR
+%D \NC 2 \NC \chardef\vulgarfractionmethod2\vulgarfraction{1}{2} \NC\NR
+%D \NC 3 \NC \chardef\vulgarfractionmethod3\vulgarfraction{1}{2} \NC\NR
+%D \HL
+%D \stoptabulate
+
+%D Under construction:
+%D
+%D \starttyping
+%D \commalistsentence[aap,noot,mies]
+%D \commalistsentence[aap,noot]
+%D \commalistsentence[aap]
+%D \commalistsentence[a,b,c]
+%D \commalistsentence[a,b,c][{ \& },{ and }]
+%D \commalistsentence[a,b,c][+,-]
+%D \stoptyping
+
+\let\handlecommalistsentence\firstofoneargument
+
+\def\commalistsentenceone{and-1}
+\def\commalistsentencetwo{and-2}
+
+\def\commalistsentence
+ {\dodoubleempty\docommalistsentence}
+
+\def\docommalistsentence[#1][#2]%
+ {\bgroup
+ \getfromcommalist[#2][1]%
+ \ifx\commalistelement\empty
+ \def\@@commalistsentenceone{\labeltext\commalistsentenceone}%
+ \else
+ \let\@@commalistsentenceone\commalistelement
+ \fi
+ \getfromcommalist[#2][2]%
+ \ifx\commalistelement\empty
+ \def\@@commalistsentencetwo{\labeltext\commalistsentencetwo}%
+ \else
+ \let\@@commalistsentencetwo\commalistelement
+ \fi
+ \getcommalistsize[#1]%
+ \ifcase\commalistsize\relax
+ \def\serializedcommalist{#1}%
+ \else
+ \let\serializedcommalist\empty
+ \scratchcounter\zerocount
+ \def\docommand##1%
+ {\advance\scratchcounter \plusone
+ \ifnum\scratchcounter=\plusone
+ \scratchtoks{\handlecommalistsentence{##1}}%
+ \else
+ \ifnum\scratchcounter=\commalistsize
+ \appendtoks\@@commalistsentencetwo\handlecommalistsentence{##1}\to\scratchtoks
+ \else
+ \appendtoks\@@commalistsentenceone\handlecommalistsentence{##1}\to\scratchtoks
+ \fi
+ \fi}%
+ \processcommacommand[#1]\docommand
+ \edef\serializedcommalist{\the\scratchtoks}%
+ \fi
+ \serializedcommalist
+ \egroup}
+
+\def\commacommandsentence[#1]{\@EA\commalistsentence\@EA[#1]}
+
+\ifx\textcomma\undefined \def\textcomma{,} \fi
+
+\setuplabeltext [\s!nl] [and-1=\textcomma\ , and-2= en ]
+\setuplabeltext [\s!en] [and-1=\textcomma\ , and-2=\textcomma\ and ]
+\setuplabeltext [\s!de] [and-1=\textcomma\ , and-2= und ]
+
+%D \macros
+%D {somekindoftab}
+%D
+%D This macro can be used to create tabs:
+%D
+%D \starttyping
+%D \setupheadertexts[{\somekindoftab[alternative=horizontal]{\framed{\realfolio}}}]
+%D \setuptexttexts [{\somekindoftab[alternative=vertical] {\framed{\realfolio}}}]
+%D
+%D \starttext
+%D \showframe \dorecurse{10}{test\page}
+%D \stoptext
+%D \stoptyping
+
+\def\somekindoftab
+ {\dosingleempty\dosomekindoftab}
+
+\def\dosomekindoftab[#1]%
+ {\bgroup
+ \getparameters[xx]
+ [\c!alternative=\v!vertical,
+ \c!width=\textwidth,\c!height=\textheight,
+ \c!n=\lastpage,\c!m=\realpageno,
+ #1]%
+ \doifelse\xxalternative\v!vertical
+ {\dodosomekindoftab\vbox\vskip\xxheight}
+ {\dodosomekindoftab\hbox\hskip\xxwidth }}
+
+\def\dodosomekindoftab#1#2#3#4%
+ {#1 to #3 \bgroup
+ \forgetall
+ \ifnum\xxm>\plusone
+ #2\zeropoint \!!plus \the\numexpr\xxm -1\relax fill\relax
+ \fi
+ #4%
+ \ifnum\xxm<\xxn\relax
+ #2\zeropoint \!!plus \the\numexpr\xxn-\xxm\relax fill\relax
+ \fi
+ \egroup
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/core-par.mkii b/tex/context/base/core-par.mkii
new file mode 100644
index 000000000..0b283b294
--- /dev/null
+++ b/tex/context/base/core-par.mkii
@@ -0,0 +1,300 @@
+%D \module
+%D [ file=core-par,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Paragraph Tricks,
+%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 / Pararaph Tricks}
+
+\unprotect
+
+% \ifprocesspreviousparagraphs
+%
+% \nofskippedparagraphs
+% \paragraphnumber
+% \nofparagraphs
+%
+% \dosetparagraph
+% \doresetparagraph
+% \dobeforeparagraph
+% \doafterparagraph
+% \dobeforeskipparagraph
+% \doafterskipparagraph
+%
+% \pushparagraphs\endcommand alle alineas tot \endcommand laden
+% \pushmoreparagraphs\endcommand alle alineas tot \endcommand toevoegen
+% \popparagraphs alle alineas oproepen
+% \popparagraphs[a,b,c] enkele alineas oproepen [geen]
+%
+% tzt een optionele prefix:
+%
+% \pushparagraphs[xxx]\endcommand alle alineas tot \endcommand laden
+% \popparagraphs[xxx] alle alineas oproepen
+% \popparagraphs[xxx][a,b,c] enkele alineas oproepen
+%
+% \numberparagraphs
+% \numberparagraphlines
+% \resetparagraphlines
+
+\newif\ifprocesspreviousparagraphs % public
+\newif\ifprocessallparagraphs % private
+
+\newcounter\totalnofparagraphs % private
+\newcounter\globalparagraphnumber % private
+\newcounter\discardedparagraphs % private
+\newcounter\mostrecentparagraphtotal % public
+
+\let\dosetparagraph = \relax % public
+\let\doresetparagraph = \relax % public
+\let\dobeforeparagraph = \relax % public
+\let\doafterparagraph = \relax % public
+\let\dobeforeskipparagraph = \relax % public
+\let\doafterskipparagraph = \relax % public
+
+\def\paragraphnumber {} % public
+\def\nofparagraphs {} % public
+\def\nofskippedparagraphs {} % public
+
+\def\paragraphprefix {paragraph} % private
+
+% voorlopig, wordt nog class
+
+\def\resetparagraphlines
+ {\global\linenumber\plusone}
+
+\def\numberparagraphs % instelbaar maken en slimmer ivm breedte regelnummer !!!!!
+ {\processpreviousparagraphstrue
+ \def\dosetparagraph
+ {\bgroup
+ \resetparagraphlines
+ \EveryPar
+ {\strut\inleftmargin{\tf{\tx\paragraphnumber}\kern2em}%
+ \ignorespaces}}%
+ \def\doresetparagraph
+ {\resetparagraphlines
+ \egroup}}
+
+\def\numberparagraphlines
+ {\processpreviousparagraphstrue
+ \def\dosetparagraph
+ {\resetparagraphlines}%
+ \def\doresetparagraph
+ {\resetparagraphlines}%
+ \def\dobeforeparagraph
+ {\startlinenumbering[\v!continue]}%
+ \def\doafterparagraph
+ {\stoplinenumbering}%
+ \def\dobeforeskipparagraph
+ {\stoplinenumbering
+ \let\paragraphnumber\relax}%
+ \def\doafterskipparagraph
+ {\startlinenumbering[\v!continue]}}
+
+\long\def\directpushparagraph#1%
+ {\doglobal\increment\totalnofparagraphs
+ \ifnum\totalnofparagraphs>0\nofskippedparagraphs\relax
+ \setgvalue{\paragraphprefix\totalnofparagraphs}{#1}%
+ \else
+ \setgvalue{\paragraphprefix\totalnofparagraphs}{\skipparagraph#1\par}%
+ \fi}
+
+\long\def\directskipparagraph#1%
+ {\doglobal\increment\totalnofparagraphs
+ \setgvalue{\paragraphprefix\totalnofparagraphs}{\skipparagraph#1\par}}
+
+\def\dopushparagraphs#1%
+ {\global\let\mostrecentparagraphtotal\totalnofparagraphs
+ \ifx#1\undefined
+ \let#1\relax
+ \fi
+ \defconvertedargument\asciia{#1}%
+ \defconvertedargument\asciib{ }% % lege regel
+ \def\dopushparagraph##1\par
+ {\defconvertedargument\asciic{##1}%
+ \doifelse\asciic\asciia
+ {#1}
+ {\doifsomething\asciic % lege paragraaf
+ {\doifnot\asciic\asciib
+ {\directpushparagraph{#1}}}%
+ \dopushparagraph}}%
+ \dopushparagraph}
+
+\def\pushparagraphs
+ {\doglobal\newcounter\totalnofparagraphs
+ \dopushparagraphs}
+
+\def\pushmoreparagraphs
+ {\dopushparagraphs}
+
+\def\dododopopparagraph#1% no grouping, i.v.m. sidefloats
+ {\ifnum#1>\totalnofparagraphs\relax
+ \else
+ \let\paragraphnumber\globalparagraphnumber
+ \decrement(\paragraphnumber,\discardedparagraphs)%
+ \dobeforeparagraph
+ \ifhmode\indentation\fi\getvalue{\paragraphprefix#1}\par
+ \doafterparagraph
+ \fi}
+
+\long\def\skipparagraph#1\par
+ {\doglobal\increment\discardedparagraphs
+ \ifprocessallparagraphs
+ \dobeforeskipparagraph
+ \ifhmode\indentation\fi#1\par
+ \doafterskipparagraph
+ \fi}
+
+\def\dodopopparagraph
+ {\dododopopparagraph}
+
+\def\dodoprocessparagraph#1%
+ {\ifprocesspreviousparagraphs
+ \bgroup
+ \setbox0\vbox{\dododopopparagraph{#1}}%
+ \egroup
+ \fi}
+
+\def\processpreviousparagraphs[#1]% process previous ones
+ {\ifprocesspreviousparagraphs
+ \bgroup
+ \getfromcommacommand[#1][1]% tzt snelle \..command.. testen
+ \let\totalnofparagraphs\commalistelement
+ \decrement\totalnofparagraphs
+ \let\dodopopparagraph\dodoprocessparagraph
+ \popparagraphs
+ \egroup
+ \fi}
+
+\def\dopopparagraphs[#1]%
+ {\doifnotinset{#1}{\v!none,0}
+ {\dosetparagraph
+ \doglobal\newcounter\globalparagraphnumber
+ \doglobal\newcounter\discardedparagraphs
+ \doifelse{#1}{}
+ {\processallparagraphstrue}
+ {\processallparagraphsfalse}%
+ \def\dopopparagraph
+ {\doglobal\increment\globalparagraphnumber
+ \ifnum\globalparagraphnumber>\totalnofparagraphs\relax
+ \let\dopopparagraph\relax
+ \else\ifprocessallparagraphs
+ \ifnum\globalparagraphnumber>\mostrecentparagraphtotal\relax
+ \dodopopparagraph\globalparagraphnumber
+ \else
+ \dodoprocessparagraph\globalparagraphnumber
+ \fi
+ \else
+ \let\paragraphnumber\globalparagraphnumber
+ \decrement(\paragraphnumber,\discardedparagraphs)%
+ \ExpandBothAfter\doifinsetelse{\paragraphnumber}{#1}
+ {\dodopopparagraph\globalparagraphnumber}
+ {\dodoprocessparagraph\globalparagraphnumber}%
+ \fi\fi
+ \dopopparagraph}%
+ \dopopparagraph
+ \doresetparagraph}}
+
+\def\popparagraphs
+ {\dosingleempty\dopopparagraphs}
+
+\def\countparagraphs
+ {\popparagraphs[\!!maxcard]%
+ \global\let\nofparagraphs\totalnofparagraphs
+ \doglobal\decrement(\nofparagraphs,\discardedparagraphs)}
+
+% \showframe
+%
+% \numberparagraphlines
+% \numberparagraphs
+%
+% \def\nofskippedparagraphs{1}
+%
+% \pushparagraphs\ThatsIt
+%
+% \ruledbaseline eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste
+%
+% \ruledbaseline eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste
+%
+% \ruledbaseline tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped
+%
+% \ruledbaseline derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped
+%
+% \ruledbaseline vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde
+%
+% \ruledbaseline vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped
+%
+% \ThatsIt
+%
+% \popparagraphs
+%
+% \countparagraphs
+%
+% \blanko[2*groot]
+%
+% nofparagraphs:~\nofparagraphs
+%
+% \pagina
+%
+% \popparagraphs[1]
+% \popparagraphs[2]
+% \popparagraphs[3]
+% \popparagraphs[4]
+% \popparagraphs[5]
+%
+% \pagina
+%
+% \ruledvbox{\popparagraphs[1,2,3,4,5]}
+%
+% \pagina
+
+\protect \endinput
diff --git a/tex/context/base/core-stg.mkii b/tex/context/base/core-stg.mkii
new file mode 100644
index 000000000..429e1e894
--- /dev/null
+++ b/tex/context/base/core-stg.mkii
@@ -0,0 +1,72 @@
+%D \module
+%D [ file=core-stg,
+%D version=2006.08.16,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Strategies,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is a prelude to strategies. It is rather old code
+%D used in a project many years ago. Use with care since I
+%D will pick up this thread. (moved from cont-new)
+
+\unprotect
+
+\def\s!strategy{strategy}
+
+\def\currentstrategypass {1}
+\def\currentstrategyvariable{0}
+\def\maximumstrategypass {8}
+
+\newconditional\strategypassneeded
+\newconditional\strategypassforced
+
+\definetwopasslist{\s!strategy}
+
+\def\registerstrategypass
+ {\ifnum\currentstrategypass>\maximumstrategypass \else
+ \ifconditional\strategypassforced
+ \doglobal\increment\currentstrategypass
+ \else%\ifconditional\strategypassneeded
+ %\doglobal\increment\currentstrategypass
+ \fi%\fi
+ \fi
+ \savecurrentvalue\currentstrategypass{\currentstrategypass}}
+
+\appendtoks \registerstrategypass \to \everybye % \everylastshipout
+
+\def\setstrategyvariable#1#2% key value
+ {%\doifnotstrategyvariable{#1}{\global\settrue\strategypassneeded}%
+ \doglobal\increment\currentstrategyvariable
+ \savetaggedtwopassdata{\s!strategy}{\currentstrategyvariable}{#1}{#2}}
+
+\def\doifstrategyvariableelse#1#2#3%
+ {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi}
+
+\def\getstrategyvariable#1% key
+ {\findtwopassdata{\s!strategy}{#1}%
+ \setxvalue{\s!strategy:#1}{\twopassdata}}
+
+\def\retainstrategyvariable#1% key
+ {\expanded{\setstrategyvariable{#1}{\strategyvariable{#1}}}}
+
+\def\strategyvariable#1% key
+ {\csname\s!strategy:#1\endcsname}
+
+\let\stratvar\strategyvariable
+
+\def\forcestrategy{\global\settrue \strategypassforced}
+\def\abortstrategy{\global\setfalse\strategypassforced}
+
+\def\doifstrategyvariableelse#1#2#3%
+ {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi}
+
+\def\doifstrategyvariable #1#2{\doifstrategyvariableelse{#1}{#2}{}}
+\def\doifnotstrategyvariable#1#2{\doifstrategyvariableelse{#1}{}{#2}}
+
+\protect \endinput
diff --git a/tex/context/base/core-sys.lua b/tex/context/base/core-sys.lua
new file mode 100644
index 000000000..c5aa89d98
--- /dev/null
+++ b/tex/context/base/core-sys.lua
@@ -0,0 +1,22 @@
+if not modules then modules = { } end modules ['core-sys'] = {
+ version = 1.001,
+ comment = "companion to core-sys.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local lower, extname, basename, removesuffix = string.lower, file.extname, file.basename, file.removesuffix
+
+function commands.updatefilenames(inputfilename,outputfilename)
+ environment.inputfilename = inputfilename or ""
+ environment.outputfilename = outputfilename or ""
+ environment.jobfilename = inputfilename or tex.jobname or ""
+ environment.jobfilesuffix = lower(extname(environment.jobfilename))
+ environment.inputfilebarename = removesuffix(basename(inputfilename))
+ environment.inputfilesuffix = lower(extname(inputfilename))
+end
+
+statistics.register("result saved in file", function()
+ return string.format( "%s.%s", environment.outputfilename, (tex.pdfoutput>0 and "pdf") or "dvi")
+end)
diff --git a/tex/context/base/core-sys.mkii b/tex/context/base/core-sys.mkii
new file mode 100644
index 000000000..24975ffb6
--- /dev/null
+++ b/tex/context/base/core-sys.mkii
@@ -0,0 +1,396 @@
+%D \module
+%D [ file=core-sys, % moved from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=System,
+%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 / System}
+
+\unprotect
+
+%D Version checking:
+
+\def\newcontextversion#1%
+ {\doifelse{#1}\contextversion
+ {\let\newcontextversion\gobbleoneargument}
+ {\writeline
+ \writestatus{Fatal Error}{Your format does not match the base files!}%
+ \writeline
+ \writestatus{Format Version}{\contextversion\space\contextmark}%
+ \writestatus{Files Version}{#1}%
+ \batchmode
+ \normalend}}
+
+%D End of lines to the output. \TEX\ will map this onto the platform specific
+%D line ending. I hate this mess.
+
+%newlinechar=10 \def\outputnewlinechar{\rawcharacter{10}}
+\newlinechar=10 \edef\outputnewlinechar{^^J}
+
+% in case formats are shared:
+
+\def\initializenewlinechar
+ {\bgroup\newlinechar=10\xdef\outputnewlinechar{^^J}\egroup}
+
+%D Job names.
+
+\def\outputfilename {\@@svfile}
+\def\inputfilename {\@@svinputfile}
+\def\operatingsystem{\@@svtype}
+
+\let\jobfilename \jobname
+\let\jobfilesuffix\c!tex
+
+\def\splitjobfilename % todo: mkiv
+ {\resetsystemmode{suffix-\jobfilesuffix}%
+ \edef\ascii{\inputfilename}\defconvertedcommand\ascii\ascii
+ \splitstring\ascii\at.\to\jobfilename\and\jobfilesuffix
+ \lowercasestring\jobfilesuffix\to\jobfilesuffix
+ \doifnothing\jobfilename {\let\jobfilename \jobname}%
+ % todo and totest: \defconvertedcommand\jobfilename\jobfilename
+ \doifnothing\jobfilesuffix{\let\jobfilesuffix\c!tex}%
+ \setsystemmode{suffix-\jobfilesuffix}}
+
+% Some mechanisms (see x-res-01) use either \jobfilename or
+% \jobfilename.somesuffix, in which case we need to use the
+% full name if given or a default (like \jobfilename.xml);
+% this comes down to replacing the default tex suffix.
+
+\def\jobfullname{\jobfilename.\jobfilesuffix}
+
+\def\setjobfullname#1% #1 = default if not given
+ {\doifelsenothing\jobfilename
+ {\let\jobfullname\empty}
+ {\doif\jobfilesuffix\c!tex{\edef\jobfullname{\jobfilename.#1}}}}
+
+% ...
+
+\def\dosetupsystem[#1]%
+ {\getparameters[\??sv][#1]%
+ \setuprandomize[\@@svrandom]%
+ \beforesplitstring\@@svresolution\at dpi\to\@@svresolution
+ \let\outputresolution\@@svresolution
+ \ifcase\@@svn
+ % % 0 : unknown
+ \or
+ \setsystemmode\v!first % 1 : first run
+ \or
+ % % 2 : successive run
+ \or
+ \setsystemmode\v!first % 3 : first and only run
+ \or
+ \setsystemmode\v!last % 4 : (extra) last run
+ \fi
+% \processaction
+% [\@@svtype]
+% %[ mswin=>\edef\@@svline{\rawcharacter{13}\rawcharacter{10}}, % crlf
+% [ mswin=>\edef\@@svline{\rawcharacter{13}}, % cr % crlf
+% darwin=>\edef\@@svline{\rawcharacter{13}}, % cr
+% \s!unknown=>\edef\@@svline{\rawcharacter{10}}]% % lf
+ \splitjobfilename}
+
+% \edef\@@svline{\rawcharacter{10}} % unix is the most critical/sensitive system
+
+\let\systemendofline\outputnewlinechar % will become obsolete
+
+\def\setupsystem
+ {\dosingleargument\dosetupsystem}
+
+\def\systemparameter#1{\executeifdefined{\??sv#1}\empty}
+
+%D The system modes set by the setup command can be used in
+%D situations like:
+%D
+%D \starttyping
+%D \startmode[*first]
+%D \executesystemcommand{cleanupxml text.xml clean-text.xml}
+%D \stopmode
+%D
+%D \starttext
+%D \typefile{clean-text.xml}
+%D \stoptext
+%D \stoptyping
+
+\def\setuprandomize[#1]%
+ {\doifsomething{#1}
+ {\bgroup
+ % tex's time is in minutes
+ \scratchcounter\normaltime
+ \processaction
+ [#1]
+ [ \v!small=>\divide\scratchcounter 15, % 900,
+ \v!medium=>\divide\scratchcounter 30, % 1800,
+ \v!big=>\divide\scratchcounter 60, % 3600,
+ \v!normal=>\getnewrandomseed\scratchcounter,
+ \s!default=>\getnewrandomseed\scratchcounter,
+ \s!unknown=>\scratchcounter#1]%
+ \expanded{\setrandomseed{\the\scratchcounter}}%
+% \writestatus\m!systems{randomseed: \the\scratchcounter}%
+ \egroup}}
+
+
+\setupsystem
+ [\c!directory=,
+ \c!n=0, % 0:unknown 1: one run 2: first 3: successive 4: final run
+ \c!resolution=600dpi,
+ \c!random=,
+ \c!file=\jobname,
+ \c!inputfile=\outputfilename,
+ \c!type=unix, % windows is normally less sensitive to handle
+ \c!bodyfont=\normalizedlocalbodyfontsize] % of iets anders
+
+%D Remark: windows programs normally handle \type {cr|lf|crlf} but unix
+%D is more picky, so we default to the \type {cr}. I never understood why
+%D \type {crlf} was not used in all systems, since it makes most sense.
+
+\def\dostartglobaldefs#1#2%
+ {\edef\!!stringa{\the\globaldefs}%
+ \ifnum\globaldefs#10
+ \globaldefs-\globaldefs
+ \fi
+ \advance\globaldefs #21
+ \setevalue{@gd@\the\globaldefs}{\!!stringa}}
+
+\def\dostopglobaldefs
+ {\doifdefinedelse{@gd@\the\globaldefs}
+ {\globaldefs\getvalue{@gd@\the\globaldefs}\relax}
+ {\globaldefs\zerocount}}
+
+\def\startlocal {\dostartglobaldefs>-}
+\def\stoplocal {\dostopglobaldefs}
+\def\startglobal {\dostartglobaldefs<+}
+\def\stopglobal {\dostopglobaldefs}
+
+\def\complexstart[#1]{\bgroup\getvalue{\e!start#1}}
+\def\complexstop [#1]{\getvalue{\e!stop #1}\egroup}
+
+\let\simplestart\bgroup
+\let\simplestop \egroup
+
+\definecomplexorsimple\start
+\definecomplexorsimple\stop
+
+\def\dododefinestartstop[#1][#2]% todo: use indirect commands
+ {\getparameters
+ [\??be#1]
+ [\c!before=,
+ \c!after=,
+ \c!inbetween=,
+ \c!commands=,
+ \c!style=,
+ #2]%
+ \unexpanded\setvalue{#1}%
+ {\groupedcommand
+ {\getvalue{\??be#1\c!commands}%
+ \dostartattributes{\??be#1}\c!style\c!color}
+ {\dostopattributes
+ \getvalue{\??be#1\c!inbetween}}}%
+ \setvalue{\e!start#1}%
+ {\getvalue{\??be#1\c!before}%
+ \bgroup
+ \getvalue{\??be#1\c!commands}%
+ \dostartattributes{\??be#1}\c!style\c!color\empty}%
+ \setvalue{\e!stop#1}%
+ {\dostopattributes
+ \egroup
+ \getvalue{\??be#1\c!after}}}
+
+\def\dodefinestartstop[#1][#2]%
+ {\def\docommand##1{\dododefinestartstop[##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\def\definestartstop
+ {\dodoubleargument\dodefinestartstop}
+
+\def\dosetupstartstop[#1][#2]%
+ {\def\docommand##1{\getparameters[\??be##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\def\setupstartstop
+ {\dodoubleargument\dosetupstartstop}
+
+% \docommand kan niet worden gebruikt omdat deze macro
+% soms lokaal wordt gebruikt
+
+% te zijner tijd:
+%
+% \definevariable {pc} % ProtectedCommand
+%
+% \def\executeprotected#1%
+% {\csname\??pc\string#1\endcsname}
+%
+% \def\defineprotected#1#2%
+% {\expandafter\def\csname\??pc\string#2\endcsname}
+%
+% \def\defineunprotected#1%
+% {\def#1}
+%
+% \def\doprotected%
+% {\ifx\next\define
+% \let\next=\defineprotected
+% \else
+% \let\next=\executeprotected
+% \fi
+% \next}
+%
+% \def\unexpanded%
+% {\futurelet\next\doprotected}
+%
+% \unexpanded\define\ziezo{ziezo}
+%
+% \unexpanded\ziezo
+
+\def\complexdefine[#1]#2#3%
+ {\ifx#2\undefined
+ \else
+ \showmessage\m!systems4{\string#2}%
+ \fi
+ \ifcase0#1\def#2{#3}%
+ \or\def#2##1{#3}%
+ \or\def#2##1##2{#3}%
+ \or\def#2##1##2##3{#3}%
+ \or\def#2##1##2##3##4{#3}%
+ \or\def#2##1##2##3##4##5{#3}%
+ \or\def#2##1##2##3##4##5##6{#3}%
+ \or\def#2##1##2##3##4##5##6##7{#3}%
+ \or\def#2##1##2##3##4##5##6##7##8{#3}%
+ \or\def#2##1##2##3##4##5##6##7##8##9{#3}%
+ \else\def#2{#3}%
+ \fi}
+
+\definecomplexorsimpleempty\define
+
+\unexpanded\def\macroname#1% brrr
+ {\executeifdefined{#1}\empty}
+
+\def\usecommands#1%
+ {\bgroup
+ \def\docommand##1{\setbox0\hbox{\getvalue{\string##1}##1}}%
+ \processcommalist[#1]\docommand
+ \egroup}
+
+\newif\ifforcefileexpansion % handy for document level overload
+
+%D The next implementation is about 4 times as faster than a
+%D processaction alternative on an string of average length.
+%D Since this feature is used in XML processing, it made sense
+%D to support this faster alternative. It's installable as well.
+
+\def\installexpander#1#2#3% changed, no longer \convert..\to...
+ {\setvalue{\s!do\c!expansion#1l}{#2}%
+ \setvalue{\s!do\c!expansion#1g}{#3}}%
+
+% \convertexpanded is obsolete
+
+\long\def\doconvertexpanded#1#2#3% #4 % [l|g] \cs {kind} {data}
+ {\csname % that we assign all exp a value
+ \s!do\c!expansion
+ \ifforcefileexpansion
+ \v!yes
+ \else\ifcsname\s!do\c!expansion#3#1\endcsname
+ #3%
+ \else
+ \s!default
+ \fi\fi
+ #1%
+ \endcsname#2}% #3
+
+\long\def\defconvertexpanded {\doconvertexpanded l}
+\long\def\gdefconvertexpanded{\doconvertexpanded g}
+
+\installexpander\v!command \defconvertedcommand \gdefconvertedcommand
+\installexpander\s!default \defconvertedargument \gdefconvertedargument
+\installexpander\empty \defconvertedargument \gdefconvertedargument
+\installexpander\v!no \defconvertedargument \gdefconvertedargument
+\installexpander\v!yes \defconvertedmeaning \gdefconvertedmeaning
+\installexpander\v!yes \defconvertedmeaning \gdefconvertedmeaning
+\installexpander\v!strict \defreducedargument \gdefreducedargument
+\installexpander {utf} \defreducedtoutf \gdefreducedtoutf
+
+%installexpander {xml} {see xtag-ext}
+
+\def\dodefconvertedmeaning#1#2#3% watch the double expansion !
+ {\bgroup
+ \honorunexpanded
+ \convertencodedtokens % can be overloaded
+ \xdef\@@globalexpanded{#3}%
+ \xdef\@@globalexpanded{\@@globalexpanded}%
+ \egroup
+ #1#2\@@globalexpanded}
+
+\def\defconvertedmeaning {\dodefconvertedmeaning\defconvertedcommand}
+\def\gdefconvertedmeaning{\dodefconvertedmeaning\gdefconvertedcommand}
+
+\def\dodefreducedargument#1#2#3%
+ {\begingroup
+ \reducetocoding[raw]%
+ \edef\ascii{#3}%
+ \expandafter\endgroup\expandafter#1\expandafter#2\expandafter{\ascii}}
+
+\def\defreducedargument {\dodefreducedargument\edef}
+\def\gdefreducedargument{\dodefreducedargument\xdef}
+
+% \setupindex[expansion=utf]\index{\eacute}
+
+\def\dodefreducedtoutf#1#2#3%
+ {\begingroup
+ \reducetocoding[uc]%
+ \let\uchar\uchartoutf
+ \let\unicodechar\numbertoutf
+ \edef\ascii{#3}%
+ \expandafter\endgroup\expandafter#1\expandafter#2\expandafter{\ascii}}
+
+\def\defreducedtoutf {\dodefreducedtoutf\edef}
+\def\gdefreducedtoutf{\dodefreducedtoutf\xdef}
+
+% old syntax:
+
+\def\convertmeaning#1\to#2% watch the double expansion !
+ {\bgroup
+ \honorunexpanded
+ \convertencodedtokens % can be overloaded
+ \xdef\@@globalexpanded{#1}%
+ \xdef\@@globalexpanded{\@@globalexpanded}%
+ \egroup
+ \defconvertedcommand#2\@@globalexpanded}
+
+\def\reduceargument#1\to#2%
+ {\begingroup
+ \reducetocoding[raw]%
+ \edef\ascii{#1}%
+ \expandafter\endgroup\expandafter\edef\expandafter#2\expandafter{\ascii}}
+
+\def\reducetoutf#1\to#2%
+ {\begingroup
+ \reducetocoding[uc]%
+ \let\uchar\uchartoutf
+ \let\unicodechar\numbertoutf
+ \edef\ascii{#1}%
+ \expandafter\endgroup\expandafter\edef\expandafter#2\expandafter{\ascii}}
+
+% \setvalue{statevalue\v!stop }{0}
+% \setvalue{statevalue\v!start }{1}
+% \setvalue{statevalue\v!normaal}{2}
+% \setvalue{statevalue\v!leeg }{3}
+% \setvalue{statevalue\v!geen }{4}
+%
+% \def\setcurrentstate#1%
+% {\chardef\currentstate=0\getvalue{statevalue\getvalue{#1\c!state}\relax}
+%
+% \ifcase\currentstate ...
+
+\def\redo{\dorepeat} % [n*10], kind of obsolete
+
+% obsolete, use \dorecurse instead
+%
+% \def\herhaler {\repeater}
+% \def\herhaalmetcommando {\dorepeatwithcommand}
+
+\protect \endinput
diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv
new file mode 100644
index 000000000..649e5e65c
--- /dev/null
+++ b/tex/context/base/core-sys.mkiv
@@ -0,0 +1,432 @@
+%D \module
+%D [ file=core-sys, % moved from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=System,
+%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 need to mkiv-ize this file !
+
+\writestatus{loading}{ConTeXt Core Macros / System}
+
+\registerctxluafile{core-sys}{1.001}
+
+\unprotect
+
+%D Version checking:
+
+\def\newcontextversion#1%
+ {\doifelse{#1}\contextversion
+ {\let\newcontextversion\gobbleoneargument}
+ {\writeline
+ \writestatus{Fatal Error}{Your format does not match the base files!}%
+ \writeline
+ \writestatus{Format Version}{\contextversion\space\contextmark}%
+ \writestatus{Files Version}{#1}%
+ \batchmode
+ \normalend}}
+
+%D End of lines to the output. \TEX\ will map this onto the platform specific
+%D line ending. I hate this mess.
+
+%newlinechar=10 \def\outputnewlinechar{\rawcharacter{10}}
+\newlinechar=10 \edef\outputnewlinechar{^^J}
+
+\edef\operatingsystem {\ctxlua{tex.write(os.platform)}}
+
+\def\jobfilename {\ctxlua{tex.sprint(tex.texcatcodes,environment.jobfilename or "")}}
+\def\jobfilesuffix {\ctxlua{tex.sprint(tex.texcatcodes,environment.jobfilesuffix or "")}}
+\def\inputfilebarename{\ctxlua{tex.sprint(tex.texcatcodes,environment.inputfilebarename or "")}}
+\def\inputfilesuffix {\ctxlua{tex.sprint(tex.texcatcodes,environment.inputfilesuffix or "")}}
+\def\inputfilename {\ctxlua{tex.sprint(tex.texcatcodes,environment.inputfilename or "")}}
+\def\outputfilename {\ctxlua{tex.sprint(tex.texcatcodes,environment.outputfilename or "")}}
+
+\def\initializenewlinechar
+ {\bgroup\newlinechar=10\xdef\outputnewlinechar{^^J}\egroup}
+
+\newtoks \everysetupsystem
+
+\unexpanded\def\setupsystem
+ {\dosingleargument\dosetupsystem}
+
+\def\dosetupsystem[#1]%
+ {\getparameters[\??sv][#1]%
+ \the\everysetupsystem}
+
+\appendtoks
+ \edef\outputresolution{\@@svresolution}%
+\to \everysetupsystem
+
+\appendtoks
+ \ifcase\@@svn
+ % % 0 : unknown
+ \or
+ \setsystemmode\v!first % 1 : first run
+ \or
+ % % 2 : successive run
+ \or
+ \setsystemmode\v!first % 3 : first and only run
+ \or
+ \setsystemmode\v!last % 4 : (extra) last run
+ \fi
+\to \everysetupsystem
+
+\appendtoks
+ \edef\outputfilename{\@@svfile}%
+ \edef\inputfilename {\@@svinputfile}%
+\to \everysetupsystem
+
+\let\@@jobsuffix\s!unknown
+
+\appendtoks
+ \resetsystemmode{suffix-\@@jobsuffix}%
+ \edef\@@jobsuffix{\jobsuffix}%
+ \setsystemmode{suffix-\@@jobsuffix}%
+\to \everysetupsystem
+
+\appendtoks
+ \ctxlua {commands.updatefilenames("\inputfilename","\outputfilename")}%
+\to \everysetupsystem
+
+% Some mechanisms (see x-res-01) use either \jobfilename or
+% \jobfilename.somesuffix, in which case we need to use the
+% full name if given or a default (like \jobfilename.xml);
+% this comes down to replacing the default tex suffix.
+
+\def\jobfullname{\jobfilename.\jobfilesuffix}
+
+\def\setjobfullname#1% #1 = default if not given
+ {\doifelsenothing\jobfilename
+ {\let\jobfullname\empty}
+ {\doif\jobfilesuffix\c!tex{\edef\jobfullname{\jobfilename.#1}}}}
+
+\let\systemendofline\outputnewlinechar % will become obsolete
+
+\def\systemparameter#1{\executeifdefined{\??sv#1}\empty}
+
+%D There are a couple of system states avaiable:
+%D
+%D \starttabulate [|T|T|]
+%D \NC \type{\jobname} \NC \jobname \NC \NR
+%D \NC \type{\jobfilename} \NC \jobfilename \NC \NR
+%D \NC \type{\jobfilesuffix} \NC \jobfilesuffix \NC \NR
+%D \NC \type{\inputfilename} \NC \inputfilename \NC \NR
+%D \NC \type{\inputfilebarename} \NC \inputfilebarename \NC \NR
+%D \NC \type{\inputfilesuffix} \NC \inputfilesuffix \NC \NR
+%D \NC \type{\outputfilename} \NC \outputfilename \NC \NR
+%D \NC \type{\operatingsystem} \NC \operatingsystem \NC \NR
+%D \stoptabulate
+
+%D The system modes set by the setup command can be used in
+%D situations like:
+%D
+%D \starttyping
+%D \startmode[*first]
+%D \executesystemcommand{cleanupxml text.xml clean-text.xml}
+%D \stopmode
+%D
+%D \starttext
+%D \typefile{clean-text.xml}
+%D \stoptext
+%D \stoptyping
+
+\unexpanded\def\setuprandomize[#1]%
+ {\doifsomething{#1}
+ {\bgroup
+ % tex's time is in minutes
+ \scratchcounter\normaltime
+ \processaction
+ [#1]
+ [ \v!small=>\divide\scratchcounter 15, % 900,
+ \v!medium=>\divide\scratchcounter 30, % 1800,
+ \v!big=>\divide\scratchcounter 60, % 3600,
+ \v!normal=>\getnewrandomseed\scratchcounter,
+ \s!default=>\getnewrandomseed\scratchcounter,
+ \s!unknown=>\scratchcounter#1]%
+ \expanded{\setrandomseed{\the\scratchcounter}}%
+ % \writestatus\m!systems{randomseed: \the\scratchcounter}%
+ \egroup}}
+
+\setupsystem
+ [\c!directory=,
+ \c!n=0, % 0:unknown 1: one run 2: first 3: successive 4: final run
+ \c!resolution=600,% in dpi, no unit in mkiv
+ %c!random=, % obsolete here
+ \c!file=\jobname,
+ \c!inputfile=\outputfilename,
+ \c!type=unix, % windows is normally less sensitive to handle
+ \c!bodyfont=\normalizedlocalbodyfontsize] % of iets anders
+
+%D Remark: windows programs normally handle \type {cr|lf|crlf} but unix
+%D is more picky, so we default to the \type {cr}. I never understood why
+%D \type {crlf} was not used in all systems, since it makes most sense.
+
+\def\dostartglobaldefs#1#2%
+ {\edef\!!stringa{\the\globaldefs}%
+ \ifnum\globaldefs#10
+ \globaldefs-\globaldefs
+ \fi
+ \advance\globaldefs #21
+ \setevalue{@gd@\the\globaldefs}{\!!stringa}}
+
+\def\dostopglobaldefs
+ {\doifdefinedelse{@gd@\the\globaldefs}
+ {\globaldefs\getvalue{@gd@\the\globaldefs}\relax}
+ {\globaldefs\zerocount}}
+
+\unexpanded\def\startlocal {\dostartglobaldefs>-}
+\unexpanded\def\stoplocal {\dostopglobaldefs}
+\unexpanded\def\startglobal {\dostartglobaldefs<+}
+\unexpanded\def\stopglobal {\dostopglobaldefs}
+
+\def\complexstart[#1]{\bgroup\getvalue{\e!start#1}}
+\def\complexstop [#1]{\getvalue{\e!stop #1}\egroup}
+
+\let\simplestart\bgroup
+\let\simplestop \egroup
+
+\definecomplexorsimple\start
+\definecomplexorsimple\stop
+
+\def\dododefinestartstop[#1][#2]% todo: use indirect commands
+ {\getparameters
+ [\??be#1]
+ [\c!before=,
+ \c!after=,
+ \c!inbetween=,
+ \c!commands=,
+ \c!style=,
+ #2]%
+ \setuvalue{#1}%
+ {\groupedcommand
+ {\getvalue{\??be#1\c!commands}%
+ \dostartattributes{\??be#1}\c!style\c!color}
+ {\dostopattributes
+ \getvalue{\??be#1\c!inbetween}}}%
+ \setvalue{\e!start#1}%
+ {\getvalue{\??be#1\c!before}%
+ \bgroup
+ \getvalue{\??be#1\c!commands}%
+ \dostartattributes{\??be#1}\c!style\c!color\empty}%
+ \setvalue{\e!stop#1}%
+ {\dostopattributes
+ \egroup
+ \getvalue{\??be#1\c!after}}}
+
+\def\dodefinestartstop[#1][#2]%
+ {\def\docommand##1{\dododefinestartstop[##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\unexpanded\def\definestartstop
+ {\dodoubleargument\dodefinestartstop}
+
+\def\dosetupstartstop[#1][#2]%
+ {\def\docommand##1{\getparameters[\??be##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\unexpanded\def\setupstartstop
+ {\dodoubleargument\dosetupstartstop}
+
+% \docommand kan niet worden gebruikt omdat deze macro
+% soms lokaal wordt gebruikt
+
+% te zijner tijd:
+%
+% \definevariable {pc} % ProtectedCommand
+%
+% \def\executeprotected#1%
+% {\csname\??pc\string#1\endcsname}
+%
+% \unexpanded\def\defineprotected#1#2%
+% {\expandafter\def\csname\??pc\string#2\endcsname}
+%
+% \unexpanded\def\defineunprotected#1%
+% {\def#1}
+%
+% \def\doprotected%
+% {\ifx\next\define
+% \let\next=\defineprotected
+% \else
+% \let\next=\executeprotected
+% \fi
+% \next}
+%
+% \def\unexpanded%
+% {\futurelet\next\doprotected}
+%
+% \unexpanded\define\ziezo{ziezo}
+%
+% \unexpanded\ziezo
+
+\def\complexdefine[#1]#2#3%
+ {\ifx#2\undefined
+ \else
+ \showmessage\m!systems4{\string#2}%
+ \fi
+ \ifcase0#1\def#2{#3}%
+ \or\def#2##1{#3}%
+ \or\def#2##1##2{#3}%
+ \or\def#2##1##2##3{#3}%
+ \or\def#2##1##2##3##4{#3}%
+ \or\def#2##1##2##3##4##5{#3}%
+ \or\def#2##1##2##3##4##5##6{#3}%
+ \or\def#2##1##2##3##4##5##6##7{#3}%
+ \or\def#2##1##2##3##4##5##6##7##8{#3}%
+ \or\def#2##1##2##3##4##5##6##7##8##9{#3}%
+ \else\def#2{#3}%
+ \fi}
+
+\definecomplexorsimpleempty\define
+
+% \startluacode
+% local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+% local format, match, gmatch, rep = string.format, string.match, string.gmatch, string.rep
+% local empty = {
+% "single",
+% "double",
+% "triple",
+% "quadruple",
+% "quintuple",
+% }
+% local check = {
+% "first",
+% "second",
+% "third",
+% "fourth",
+% "fifth",
+% }
+% function commands.define(str)
+% -- we could store the defaults in lua and call lua instead but why bother
+% local arg, cmd = match(str,"(.*)\\(.-)$")
+% local a = { }
+% for s in gmatch(arg,"%[(.-)%]") do
+% a[#a+1] = s
+% end
+% local n = tonumber(a[#a])
+% if n then
+% a[#a] = nil
+% else
+% n = 0
+% end
+% texsprint(ctxcatcodes,format("\\unexpanded\\def\\%s",cmd))
+% if #a > 0 then
+% texsprint(ctxcatcodes,format("{\\do%sempty\\do%s}",empty[#a],cmd))
+% texsprint(ctxcatcodes,format("\\def\\do%s",cmd))
+% for i=1,#a do
+% texsprint(ctxcatcodes,"[#",i,"]")
+% end
+% texsprint(ctxcatcodes,"{")
+% for i=#a,1,-1 do
+% texsprint(ctxcatcodes,format("\\if%sargument",check[i]))
+% texsprint(ctxcatcodes,format("\\def\\next{\\dodo%s",cmd))
+% for j=1,#a-i do
+% texsprint(ctxcatcodes,format("[%s]",a[j]))
+% end
+% for j=1,i do
+% texsprint(ctxcatcodes,format("[#%s]",j))
+% end
+% texsprint(ctxcatcodes,"}")
+% if i == 1 then
+% texsprint(ctxcatcodes,rep("\\fi",#a))
+% else
+% texsprint(ctxcatcodes,"\\else")
+% end
+% end
+% texsprint(ctxcatcodes,"\\next}")
+% texsprint(ctxcatcodes,format("\\def\\dodo%s",cmd))
+% for i=1,#a do
+% texsprint(ctxcatcodes,"[#",i,"]")
+% end
+% end
+% for i=1,n do
+% texsprint(ctxcatcodes,"#",#a+i)
+% end
+% end
+% \stopluacode
+%
+% \unexpanded\def\define#1#{\ctxlua{commands.define([[\detokenize{#1}]])}}
+%
+% \starttext
+% \define[2]\whatevera{#1+#2}
+% \whatevera{A}{B}
+% \define[me][too][2]\whateverb{#1+#2+#3+#4}
+% \whateverb[A]{B}{C}
+% \whateverb[A][B]{C}{D}
+% \stoptext
+
+\unexpanded\def\macroname#1% brrr
+ {\executeifdefined{#1}\empty}
+
+\def\usecommands#1%
+ {\bgroup
+ \def\docommand##1{\setbox0\hbox{\getvalue{\string##1}##1}}%
+ \processcommalist[#1]\docommand
+ \egroup}
+
+\newif\ifforcefileexpansion % handy for document level overload
+
+%D The next implementation is about 4 times as faster than a
+%D processaction alternative on an string of average length.
+%D Since this feature is used in XML processing, it made sense
+%D to support this faster alternative. It's installable as well.
+%D
+%D We keep this around for \MKII\ \XML\ but it's not used in \MKIV\
+%D code as expansion is controlled in another way there.
+
+\def\installexpander#1#2#3% changed, no longer \convert..\to...
+ {\setvalue{\s!do\c!expansion#1l}{#2}%
+ \setvalue{\s!do\c!expansion#1g}{#3}}%
+
+% \convertexpanded is obsolete
+
+\long\def\doconvertexpanded#1#2#3% #4 % [l|g] \cs {kind} {data}
+ {\csname % that we assign all exp a value
+ \s!do\c!expansion
+ \ifforcefileexpansion
+ \v!yes
+ \else\ifcsname\s!do\c!expansion#3#1\endcsname
+ #3%
+ \else
+ \s!default
+ \fi\fi
+ #1%
+ \endcsname#2}% #3
+
+\long\def\defconvertexpanded {\doconvertexpanded l}
+\long\def\gdefconvertexpanded{\doconvertexpanded g}
+
+\installexpander\v!command \defconvertedcommand \gdefconvertedcommand
+\installexpander\s!default \defconvertedargument \gdefconvertedargument
+\installexpander\empty \defconvertedargument \gdefconvertedargument
+\installexpander\v!no \defconvertedargument \gdefconvertedargument
+\installexpander\v!yes \defconvertedmeaning \gdefconvertedmeaning
+\installexpander\v!yes \defconvertedmeaning \gdefconvertedmeaning
+\installexpander\v!strict \defreducedargument \gdefreducedargument
+\installexpander {utf} \defreducedtoutf \gdefreducedtoutf
+
+\def\dodefconvertedmeaning#1#2#3% watch the double expansion !
+ {\bgroup
+ \xdef\@@globalexpanded{#3}%
+ \xdef\@@globalexpanded{\@@globalexpanded}%
+ \egroup
+ #1#2\@@globalexpanded}
+
+\def\defconvertedmeaning {\dodefconvertedmeaning\defconvertedcommand}
+\def\gdefconvertedmeaning{\dodefconvertedmeaning\gdefconvertedcommand}
+
+\def\dodefreducedargument#1#2#3%
+ {\begingroup
+ \reducetocoding[raw]%
+ \edef\ascii{#3}%
+ \expandafter\endgroup\expandafter#1\expandafter#2\expandafter{\ascii}}
+
+\def\defreducedargument {\dodefreducedargument\edef}
+\def\gdefreducedargument{\dodefreducedargument\xdef}
+
+\protect \endinput
diff --git a/tex/context/base/core-two.lua b/tex/context/base/core-two.lua
new file mode 100644
index 000000000..24a3191a7
--- /dev/null
+++ b/tex/context/base/core-two.lua
@@ -0,0 +1,137 @@
+if not modules then modules = { } end modules ['core-two'] = {
+ version = 1.001,
+ comment = "companion to core-two.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local remove, concat = table.remove, table.concat
+
+local texprint = tex.print
+
+--[[ldx--
+<p>We save multi-pass information in the main utility table. This is a
+bit of a mess because we support old and new methods.</p>
+--ldx]]--
+
+jobpasses = jobpasses or { }
+jobpasses.collected = jobpasses.collected or { }
+jobpasses.tobesaved = jobpasses.tobesaved or { }
+
+local collected, tobesaved = jobpasses.collected, jobpasses.tobesaved
+
+local function initializer()
+ collected, tobesaved = jobpasses.collected, jobpasses.tobesaved
+end
+
+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 jobpasses.savetagged(id,tag,str)
+ local jti = allocate(id)
+ jti[tag] = str
+end
+
+function jobpasses.getcollected(id)
+ return collected[id] or { }
+end
+
+function jobpasses.gettobesaved(id)
+ return allocate(id)
+end
+
+function jobpasses.get(id)
+ local jti = collected[id]
+ if jti and #jti > 0 then
+ texprint(remove(jti,1))
+ end
+end
+
+function jobpasses.first(id)
+ local jti = collected[id]
+ if jti and #jti > 0 then
+ texprint(jti[1])
+ end
+end
+
+function jobpasses.last(id)
+ local jti = collected[id]
+ if jti and #jti > 0 then
+ texprint(jti[#jti])
+ end
+end
+
+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 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
+ texprint(concat(jti,','))
+ end
+end
+
+function jobpasses.doifinlistelse(id,str)
+ local jti = collected[id]
+ if jti then
+ local found = false
+ for _, v in next, jti do
+ if v == str then
+ found = true
+ break
+ end
+ end
+ commands.testcase(found)
+ else
+ commands.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]
+ local value = jit and jti[index]
+ texprint((value ~= "" and value) or default or "")
+end
+
+function jobpasses.getfield(id,index,tag,default)
+ local jti = collected[id]
+ jti = jti and jti[index]
+ local value = jti and jti[tag]
+ texprint((value ~= "" and value) or default or "")
+end
+
diff --git a/tex/context/base/core-two.mkii b/tex/context/base/core-two.mkii
new file mode 100644
index 000000000..0f2e0048c
--- /dev/null
+++ b/tex/context/base/core-two.mkii
@@ -0,0 +1,206 @@
+%D \module
+%D [ file=core-two, % moved from core-uti
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Two Pass Data,
+%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 / Two Pass Data}
+
+%D This is a rather old mechanism which has not changed much over
+%D time, apart from adding a few more selectors. This code used
+%D to be part of \type {core-uti}. The following examples demonstrate
+%D the interface.
+%D
+%D \startbuffer
+%D \definetwopasslist{test-1}
+%D
+%D \gettwopassdatalist{test-1} [\twopassdatalist=]
+%D \checktwopassdata {test-1} [\twopassdata=]
+%D \checktwopassdata {test-1} [\twopassdata=]
+%D \gettwopassdata {test-1} [\twopassdata=]
+%D \gettwopassdata {test-1} [\twopassdata=]
+%D
+%D \definetwopasslist{test-2}
+%D
+%D \lazysavetwopassdata{test-2}{1}{x}
+%D \lazysavetwopassdata{test-2}{2}{y}
+%D \lazysavetwopassdata{test-2}{3}{z}
+%D
+%D \gettwopassdatalist{test-2} [\twopassdatalist=x,y,z]
+%D \checktwopassdata {test-2} [\twopassdata=x]
+%D \checktwopassdata {test-2} [\twopassdata=x]
+%D \gettwopassdata {test-2} [\twopassdata=x]
+%D \gettwopassdata {test-2} [\twopassdata=y]
+%D \gettwopassdata {test-2} [\twopassdata=z]
+%D \gettwopassdata {test-2} [\twopassdata=]
+%D
+%D \definetwopasslist{test-3}
+%D
+%D \lazysavetaggedtwopassdata{test-3}{1}{x}{a}
+%D \lazysavetaggedtwopassdata{test-3}{2}{y}{b}
+%D \lazysavetaggedtwopassdata{test-3}{3}{z}{c}
+%D
+%D \findtwopassdata{test-3}{x} [\twopassdata=a]
+%D \findtwopassdata{test-3}{y} [\twopassdata=b]
+%D \findtwopassdata{test-3}{z} [\twopassdata=c]
+%D \findtwopassdata{test-3}{w} [\twopassdata=]
+%D
+%D \definetwopasslist{test-4}
+%D
+%D \lazysavetwopassdata{test-4}{1}{A}
+%D \lazysavetwopassdata{test-4}{2}{B}
+%D \lazysavetwopassdata{test-4}{3}{C}
+%D
+%D \getfirsttwopassdata{test-4} [\twopassdata=A]
+%D \getlasttwopassdata {test-4} [\twopassdata=C]
+%D \getfirsttwopassdata{test-4} [\twopassdata=A]
+%D \getlasttwopassdata {test-4} [\twopassdata=C]
+%D \getfromtwopassdata {test-4}{1} [\twopassdata=A]
+%D \getfromtwopassdata {test-4}{3} [\twopassdata=C]
+%D \getfromtwopassdata {test-4}{2} [\twopassdata=B]
+%D \stopbuffer
+%D
+%D \getbuffer \typebuffer
+
+\unprotect
+
+\let\alltwopasslists\empty
+\let\twopassentry \gobblethreearguments % permits loading a MK II file
+\let\twopassdata \empty
+\let\twopassdatalist\empty
+
+\newif\iftwopassdatafound
+
+\addutilityreset{twopassentries}
+
+\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\resettwopassentries
+ {\let\twopassentry\gobblethreearguments}
+
+\def\settwopassentries
+ {\def\twopassentry##1{\executeifdefined{@@##1\s!pass}\gobbletwoarguments}}
+
+\resettwopassentries
+
+\def\appendtwopasselement#1#2#3% can sometimes become a large list
+ {%\debuggerinfo{\m!systems}{twopass data #1 - #2 = #3}%
+ \expandafter\xdef\csname#1:\s!list\endcsname
+ {\@EA\ifx\csname#1:\s!list\endcsname\empty \else
+ \csname#1:\s!list\endcsname,\fi#3}}
+
+\def\dodefinetwopasslist#1%
+ {\doifundefined{#1:\s!list}
+ {%\debuggerinfo\m!systems{defining twopass class #1}%
+ \doglobal\addutilityreset{#1\s!pass}%
+ \setgvalue{\s!set #1\s!pass}{\dosettwopasslist {#1}}%
+ \setgvalue{\s!reset#1\s!pass}{\doresettwopasslist{#1}}%
+ \getvalue {\s!reset#1\s!pass}}}
+
+\def\definetwopasslist#1%
+ {\expanded{\dodefinetwopasslist{#1}}%
+ \doglobal\addtocommalist{#1}\alltwopasslists}
+
+\def\dosettwopasslist#1%
+ {\letgvalue{\s!set#1\s!pass}\gobbletwoarguments
+ \setgvalue{@@#1\s!pass}{\appendtwopasselement{#1}}}
+
+\def\doresettwopasslist#1%
+ {\letgvalue{@@#1\s!pass}\gobbletwoarguments}
+
+\def\doloadtwopassdata#1%
+ {\doifundefined{#1:\s!list}
+ {\startnointerference
+ \letgvalueempty{#1:\s!list}%
+ \protectlabels
+ \doutilities{twopassentries,#1\s!pass}\jobname\empty\relax\relax
+ \stopnointerference}}
+
+\def\loadtwopassdata
+ {\ifx\alltwopasslists\empty\else
+ \processcommacommand[\alltwopasslists]\doloadtwopassdata
+ \globallet\alltwopasslists\empty
+ \fi}
+
+\def\dogettwopassdata[#1,#2]#3#4%
+ {\edef\twopassdata{#1}%
+ \ifx\twopassdata\empty
+ \twopassdatafoundfalse
+ \let\twopassdata\empty
+ \else
+ \twopassdatafoundtrue
+ \ifcase#4\or\setxvalue{#3:\s!list}{#2}\fi
+ \fi}
+
+\def\gettwopassdata#1%
+ {\loadtwopassdata \@EAEAEA\dogettwopassdata\@EA\@EA\@EA[\csname#1:\s!list\endcsname,]{#1}\plusone}
+
+\def\checktwopassdata#1%
+ {\loadtwopassdata \@EAEAEA\dogettwopassdata\@EA\@EA\@EA[\csname#1:\s!list\endcsname,]{#1}\zerocount}
+
+\def\findtwopassdata#1#2%
+ {\loadtwopassdata \expanded{\dofindtwopassdata{#1}{#2}}}
+
+\def\dofindtwopassdata#1#2%
+ {\def\dodofindtwopassdata[##1,##2#2::##3,##4]{\edef\twopassdata{##3}}%
+ \@EAEAEA\dodofindtwopassdata\@EA\@EA\@EA[\@EA\@EA\@EA,\csname#1:\s!list\endcsname,#2,#2::,]%
+ \ifx\twopassdata\empty
+ \twopassdatafoundfalse
+ \else
+ \twopassdatafoundtrue
+ \fi}
+
+\let\getfirsttwopassdata\checktwopassdata
+
+\def\getlasttwopassdata#1%
+ {\loadtwopassdata
+ \scratchcounter\zerocount
+ \@EAEAEA\rawprocesscommalist\@EA\@EA\@EA[\csname#1:\s!list\endcsname]\dogetlasttwopassdata
+ \edef\noftwopassitems{\the\scratchcounter}%
+ \iftwopassdatafound\else
+ \let\twopassdata\empty
+ \fi}
+
+\def\dogetlasttwopassdata#1%
+ {\edef\nexttwopassdata{#1}%
+ \ifx\nexttwopassdata\empty \else
+ \let\twopassdata\nexttwopassdata
+ \advance\scratchcounter \plusone
+ \twopassdatafoundtrue
+ \fi}
+
+\def\getfromtwopassdata#1#2%
+ {\loadtwopassdata
+ \@EAEAEA\getfromcommalist\@EA\@EA\@EA[\csname#1:\s!list\endcsname][#2]%
+ \ifx\commalistelement\empty
+ \twopassdatafoundfalse
+ \let\twopassdata\empty
+ \else
+ \twopassdatafoundtrue
+ \let\twopassdata\commalistelement
+ \fi}
+
+\def\gettwopassdatalist#1%
+ {\loadtwopassdata
+ \letcscsname\twopassdatalist\csname#1:\s!list\endcsname
+ \ifx\twopassdatalist\relax\let\twopassdatalist\empty\fi}
+
+\def\gettwopassdatalist
+ {\getnamedtwopassdatalist\twopassdatalist}
+
+\def\doifelseintwopassdata#1#2% tag dat
+ {\gettwopassdatalist{#1}%
+ \expanded{\doifinsetelse{#2}{\twopassdatalist}}}
+
+\protect \endinput
diff --git a/tex/context/base/core-two.mkiv b/tex/context/base/core-two.mkiv
new file mode 100644
index 000000000..2cc9412af
--- /dev/null
+++ b/tex/context/base/core-two.mkiv
@@ -0,0 +1,106 @@
+%D \module
+%D [ file=core-two, % moved from core-uti
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Two Pass Data,
+%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 / Two Pass Data}
+
+%D This is a rather old mechanism which has not changed much over
+%D time, apart from adding a few more selectors. This code used
+%D to be part of \type {core-uti}. The following examples demonstrate
+%D the interface.
+%D
+%D \startbuffer
+%D \definetwopasslist{test-1}
+%D
+%D \gettwopassdatalist{test-1} [\twopassdatalist=]
+%D \checktwopassdata {test-1} [\twopassdata=]
+%D \checktwopassdata {test-1} [\twopassdata=]
+%D \gettwopassdata {test-1} [\twopassdata=]
+%D \gettwopassdata {test-1} [\twopassdata=]
+%D
+%D \definetwopasslist{test-2}
+%D
+%D \lazysavetwopassdata{test-2}{1}{x}
+%D \lazysavetwopassdata{test-2}{2}{y}
+%D \lazysavetwopassdata{test-2}{3}{z}
+%D
+%D \gettwopassdatalist{test-2} [\twopassdatalist=x,y,z]
+%D \checktwopassdata {test-2} [\twopassdata=x]
+%D \checktwopassdata {test-2} [\twopassdata=x]
+%D \gettwopassdata {test-2} [\twopassdata=x]
+%D \gettwopassdata {test-2} [\twopassdata=y]
+%D \gettwopassdata {test-2} [\twopassdata=z]
+%D \gettwopassdata {test-2} [\twopassdata=]
+%D
+%D \definetwopasslist{test-3}
+%D
+%D \lazysavetaggedtwopassdata{test-3}{1}{x}{a}
+%D \lazysavetaggedtwopassdata{test-3}{2}{y}{b}
+%D \lazysavetaggedtwopassdata{test-3}{3}{z}{c}
+%D
+%D \findtwopassdata{test-3}{x} [\twopassdata=a]
+%D \findtwopassdata{test-3}{y} [\twopassdata=b]
+%D \findtwopassdata{test-3}{z} [\twopassdata=c]
+%D \findtwopassdata{test-3}{w} [\twopassdata=]
+%D
+%D \definetwopasslist{test-4}
+%D
+%D \lazysavetwopassdata{test-4}{1}{A}
+%D \lazysavetwopassdata{test-4}{2}{B}
+%D \lazysavetwopassdata{test-4}{3}{C}
+%D
+%D \getfirsttwopassdata{test-4} [\twopassdata=A]
+%D \getlasttwopassdata {test-4} [\twopassdata=C]
+%D \getfirsttwopassdata{test-4} [\twopassdata=A]
+%D \getlasttwopassdata {test-4} [\twopassdata=C]
+%D \getfromtwopassdata {test-4}{1} [\twopassdata=A]
+%D \getfromtwopassdata {test-4}{3} [\twopassdata=C]
+%D \getfromtwopassdata {test-4}{2} [\twopassdata=B]
+%D \stopbuffer
+%D
+%D \getbuffer \typebuffer
+
+\unprotect
+
+\let\twopassdatalist\empty
+
+\newif\iftwopassdatafound
+
+\registerctxluafile{core-two}{1.001}
+
+%D I'm not that sure if this behaves exactly like mkii. This needs a cleanup.
+
+\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlua {jobpasses.save('#1',"#3")}}}
+\def\savetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatelua{jobpasses.save('#1',"#3")}}}
+\def\lazysavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatelua{jobpasses.save('#1',"#3")}}}
+\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\ctxlua {jobpasses.savetagged('#1','#3',"#4")}}}
+\def\lazysavetaggedtwopassdata#1#2#3#4{\normalexpanded{\noexpand\ctxlatelua{jobpasses.savetagged('#1','#3',"#4")}}}
+
+% temp hack: needs a proper \starteverytimeluacode
+
+\def\testtwopassdata{\ifx\twopassdata\empty\twopassdatafoundfalse\else\twopassdatafoundtrue\fi}
+
+% todo: move the edef to lua
+
+\unexpanded\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")}}
+
+\let\getfromtwopassdata\findtwopassdata
+
+\protect \endinput
diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua
new file mode 100644
index 000000000..01fd8522b
--- /dev/null
+++ b/tex/context/base/core-uti.lua
@@ -0,0 +1,294 @@
+if not modules then modules = { } end modules ['core-uti'] = {
+ version = 1.001,
+ comment = "companion to core-uti.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: keep track of changes here (hm, track access, and only true when
+-- accessed and changed)
+
+--[[ldx--
+<p>A utility file has always been part of <l n='context'/> and with
+the move to <l n='luatex'/> we also moved a lot of multi-pass info
+to a <l n='lua'/> table. Instead of loading a <l n='tex'/> based
+utility file under different setups, we now load a table once. This
+saves much runtime but at the cost of more memory usage.</p>
+--ldx]]--
+
+local sort, concat, format, match = table.sort, table.concat, string.format, string.match
+local next, type, tostring = next, type, tostring
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+
+jobs.version = 1.10
+
+--[[ldx--
+<p>Variables are saved using in the previously defined table and passed
+onto <l n='tex'/> using the following method. Of course one can also
+directly access the variable using a <l n='lua'/> call.</p>
+--ldx]]--
+
+local savelist, comment = { }, { }
+
+function job.comment(str)
+ comment[#comment+1] = str
+end
+
+job.comment(format("version: %1.2f",jobs.version))
+
+function job.initialize(loadname,savename)
+ job.load(loadname)
+ main.register_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 { }
+jobvariables.checksums = jobvariables.checksums or { }
+
+if not jobvariables.checksums.old then jobvariables.checksums.old = md5.HEX("old") end -- used in experiment
+if not jobvariables.checksums.new then jobvariables.checksums.new = md5.HEX("new") end -- used in experiment
+
+job.register('jobvariables.checksums', jobvariables.checksums)
+
+local function initializer()
+ local r = jobvariables.collected.randomseed
+ if not r then
+ r = math.random()
+ math.setrandomseedi(r,"initialize")
+ else
+ math.setrandomseedi(r,"previous run")
+ end
+ jobvariables.tobesaved.randomseed = r
+ for cs, value in next, jobvariables.collected do
+ texsprint(ctxcatcodes,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
+
+-- experiment (bugged: some loop in running)
+
+-- for the moment here, very experimental stuff
+
+packer = packer or { }
+packer.version = 1.00
+
+local function hashed(t)
+ local s = { }
+ for k, v in next, t do
+ if type(v) == "table" then
+ s[#s+1] = k.."={"..hashed(v).."}"
+ else
+ s[#s+1] = k.."="..tostring(v)
+ end
+ end
+ sort(s)
+ return concat(s,",")
+end
+
+local function pack(t,keys,hash,index)
+ for k,v in next, t do
+ if type(v) == "table" then
+ pack(v,keys,hash,index)
+ end
+ if keys[k] and type(v) == "table" then
+ local h = hashed(v)
+ local i = hash[h]
+ if not i then
+ i = #index+1
+ index[i] = v
+ hash[h] = i
+ end
+ t[k] = i
+ end
+ end
+end
+
+local function unpack(t,keys,index)
+ for k,v in next, t do
+ if keys[k] and type(v) == "number" then
+ local iv = index[v]
+ if iv then
+ v = iv
+ t[k] = v
+ end
+ end
+ if type(v) == "table" then
+ unpack(v,keys,index)
+ end
+ end
+end
+
+function packer.new(keys,version)
+ return {
+ version = version or packer.version,
+ keys = table.tohash(keys),
+ hash = { },
+ index = { },
+ }
+end
+
+function packer.pack(t,p,shared)
+ if shared then
+ pack(t,p.keys,p.hash,p.index)
+ elseif not t.packer then
+ pack(t,p.keys,p.hash,p.index)
+ if #p.index > 0 then
+ t.packer = {
+ version = p.version or packer.version,
+ keys = p.keys,
+ index = p.index,
+ }
+ end
+ p.hash, p.index = { }, { }
+ end
+end
+
+function packer.unpack(t,p,shared)
+ if shared then
+ if p then
+ unpack(t,p.keys,p.index)
+ end
+ else
+ local tp = t.packer
+ if tp then
+ if tp.version == (p and p.version or packer.version) then
+ unpack(t,tp.keys,tp.index)
+ else
+ -- fatal error, wrong version
+ end
+ t.packer = nil
+ end
+ end
+end
+
+function packer.strip(p)
+ p.hash = nil
+end
+
+local packlist = {
+ "numbers",
+ "metadata",
+ "sectiondata",
+ "prefixdata",
+ "numberdata",
+ "pagedata",
+ "directives",
+ "specification",
+ "processors", -- might become key under directives or metadata
+-- "references", -- we need to rename of them as only one packs (not structure.lists.references)
+}
+
+local jobpacker = packer.new(packlist,1.01)
+
+job.pack = true
+
+job._save_, job._load_ = { }, { } -- registers timing
+
+function job.save(filename)
+ statistics.starttiming(job._save_)
+ local f = io.open(filename,'w')
+ if f then
+ for c=1,#comment do
+ f:write("-- ",comment[c],"\n")
+ end
+ f:write("\n")
+ for l=1,#savelist do
+ local list = savelist[l]
+ local target, data, finalizer = list[1], list[2], list[4]
+ if type(finalizer) == "function" then
+ finalizer()
+ end
+ if job.pack then
+ packer.pack(data,jobpacker,true)
+ end
+ f:write(aux.definetable(target),"\n")
+ f:write(table.serialize(data,target,true,true),"\n")
+ end
+ if job.pack then
+ packer.strip(jobpacker)
+ f:write(table.serialize(jobpacker,"job.packer",true,true),"\n")
+ end
+ f:close()
+ end
+ statistics.stoptiming(job._save_)
+end
+
+function job.load(filename)
+ statistics.starttiming(job._load_)
+ local data = io.loaddata(filename)
+ if data and data ~= "" then
+ local version = tonumber(match(data,"^-- version: ([%d%.]+)"))
+ if version ~= jobs.version then
+ logs.report("job","version mismatch with jobfile: %s <> %s", version or "?", jobs.version)
+ else
+ local data = loadstring(data)
+ if data then
+ data()
+ end
+ for l=1,#savelist do
+ local list = savelist[l]
+ local target, initializer = list[1], list[3]
+ packer.unpack(aux.accesstable(target),job.packer,true)
+ if type(initializer) == "function" then
+ initializer(aux.accesstable(target))
+ end
+ end
+ job.packer = nil
+ end
+ end
+ statistics.stoptiming(job._load_)
+end
+
+-- eventually this will end up in strc-ini
+
+statistics.register("startup time", function()
+ return statistics.elapsedseconds(ctx,"including runtime option file processing")
+end)
+
+statistics.register("jobdata time",function()
+ if statistics.elapsedindeed(job._save_) or statistics.elapsedindeed(job._load_) then
+ return format("%s seconds saving, %s seconds loading", statistics.elapsedtime(job._save_), statistics.elapsedtime(job._load_))
+ end
+end)
+
+statistics.register("callbacks", function()
+ local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
+ local pages = tex.count['realpageno'] - 1
+ if pages > 1 then
+ return format("direct: %s, indirect: %s, total: %s (%i per page)", total-indirect, indirect, total, total/pages)
+ else
+ return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
+ end
+end)
+
+function statistics.formatruntime(runtime)
+ local shipped = tex.count['nofshipouts']
+ local pages = tex.count['realpageno'] - 1
+ if shipped > 0 or pages > 0 then
+ local persecond = shipped / runtime
+ if pages == 0 then pages = shipped end
+ return format("%s seconds, %i processed pages, %i shipped pages, %.3f pages/second",runtime,pages,shipped,persecond)
+ else
+ return format("%s seconds",runtime)
+ end
+end
diff --git a/tex/context/base/core-uti.mkii b/tex/context/base/core-uti.mkii
new file mode 100644
index 000000000..5b8f66f50
--- /dev/null
+++ b/tex/context/base/core-uti.mkii
@@ -0,0 +1,349 @@
+%D \module
+%D [ file=core-uti,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Utility File Handling,
+%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 / Utility File Handling}
+
+\unprotect
+
+% todo : safe lan etc too
+% todo : load all commands at once (tok)
+% todo : merge status info patch into tui file (language, encoding, etc),
+
+% Utility-file
+%
+% De onderstaande macro's ondersteunen het gebruik van de
+% zogeheten utility-file. Alle extern onder te brengen
+% informatie wordt opgeslagen in de file \jobname.tui, tenzij
+% er selectief pagina's worden gezet. In dat geval wordt de
+% file \jobname.tmp gebruikt. Informatie wordt ingelezen uit
+% de file \jobname.tuo, welke door TeXUtil wordt aangemaakt.
+
+\edef\utilityversion{1998.07.07} % was: 1996.03.15 % status variables
+\edef\utilityversion{1998.12.20} % was: 1998.07.07 % index attributes
+\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.
+
+% Om een opbouw van spaties te voorkomen (???) moet ^^M een
+% andere betekenis krijgen:
+%
+% \catcode`\^^M=14 (comment)
+%
+% read file
+%
+% \catcode`\^^M=5 (end of line)
+
+\newwrite\utility@tui
+\newif\ifutilitydone
+
+\ifx\sectionseparator\undefined \def\sectionseparator{-} \fi
+
+\def\@@utilityerrormessage
+ {\showmessage\m!systems8\empty
+ \globallet\@@utilityerrormessage\relax}
+
+\def\thisisutilityversion#1%
+ {\doifelse\utilityversion{#1}%
+ {\checksectionseparator}
+ {\@@utilityerrormessage\resetutilities\endinput}}
+
+\def\checksectionseparator % catches backward compatibility conflict
+ {}% \doifnot\sectionseparator:\endinput} % this dependency may go in a few years
+
+\def\dosplitofffoliopart[#1--#2--#3]{#3}
+
+\def\thisissectionseparator#1%
+ {\bgroup
+ \globallet\checksectionseparator\relax
+ \defconvertedcommand \asciia\sectionseparator
+ \defconvertedargument\asciib{#1}%
+ \expanded{\gdef\noexpand\dosplitofffoliopart[####1\sectionseparator
+ \sectionseparator####2\sectionseparator\sectionseparator####3]{####3}}%
+ \ifx\asciia\asciib
+ \egroup
+ \else
+ \egroup
+ % todo \@@utilityerrormessage
+ \resetutilities
+ \endinput
+ \fi}
+
+\def\writeutility {\write\utility@tui}
+\def\writeutilitycommand#1{\write\utility@tui{c \string#1}}
+
+% less tokens
+%
+% \def\immediatewriteutility {\immediate\writeutility}
+% \def\immediatewriteutilitycommand{\immediate\writeutilitycommand}
+%
+% more flexible (for overloading)
+
+\def\immediatewriteutility {\immediate\write\utility@tui}
+\def\immediatewriteutilitycommand#1{\immediate\write\utility@tui{c \string#1}}
+
+% as in:
+
+\def\cwriteutility#1%
+ {\write\utility@tui{\noexpand\checkedutility{\number\nofshipouts}{#1}}}
+
+\def\cwriteutilitycommand#1%
+ {\write\utility@tui{\noexpand\checkedutility{\number\nofshipouts}{c \string#1}}}
+
+\let\checkedutility\secondoftwoarguments
+
+\def\docheckedutility#1#2{\ifnum#1=\nofshipouts#2\else\letterpercent\fi}
+
+\prependtoks
+ \let\checkedutility\docheckedutility
+\to \everybeforeshipout
+
+% Better use marks.
+
+\newtoks \everyopenutilities
+\newtoks \everycloseutilities
+\newtoks \everycheckutilities
+
+\def\openutilities {\the\everyopenutilities } % \global\everyopenutilities\emptytoks
+\def\closeutilities{\the\everycloseutilities}
+\def\checkutilities{\the\everycheckutilities}
+
+\appendtoks
+ \let\writeutility \cwriteutility
+ \let\writeutilitycommand \cwriteutilitycommand
+ %\let\immediatewriteutility \cimmediatewriteutility
+ %\let\immediatewriteutilitycommand\cimmediatewriteutilitycommand
+ \let\checkutilities \relax
+\to \everycheckutilities
+
+\appendtoks
+ \immediate\openout\utility@tui\jobname.\f!inputextension
+ \immediatewriteutilitycommand{\thisissectionseparator{\sectionseparator}}% for the moment
+ \immediatewriteutilitycommand{\thisisutilityversion {\utilityversion }}% in this order
+\to \everyopenutilities
+
+\appendtoks
+% \immediate\closeout\utility@tui % niet echt nodig
+ \reportutilityproblems
+ % should be a message :
+ \let\writeutilitycommand \gobbleoneargument
+ \let\writeutility \gobbleoneargument
+ \let\immediatewriteutilitycommand\gobbleoneargument
+ \let\immediatewriteutility \gobbleoneargument
+\to \everycloseutilities
+
+% \def\reopenutilities
+% {\immediate\closeout\utility@tui
+% \openutilities}
+
+\def\abortutilitygeneration
+ {\immediatewriteutilitycommand\utilitygenerationaborted
+ \immediatewriteutility{q {quit}}}
+
+\def\utilitygenerationaborted
+ {\showmessage\m!systems{21}\empty
+ \globallet\utilitygenerationaborted\endinput
+ \gdef\reportutilityproblems{\showmessage\m!systems{22}\empty}%
+ \endinput}
+
+\def\savecurrentvalue#1#2%
+ {\immediatewriteutilitycommand{\initializevariable\string#1{#2}}}
+
+\let\initializevariable\gdef
+
+\appendtoks
+ \globallet\initializevariable\gobbletwoarguments
+\to \everyafterutilityread
+
+\let\reportutilityproblems\relax
+
+\newtoks\utilityresetlist
+
+\def\addutilityreset#1%
+ {\@EA\appendtoks\csname\s!reset#1\endcsname\to\utilityresetlist}
+
+\def\resetutilities
+ {\the\utilityresetlist}
+
+% #1=type #2=file #3=melding #4=voor #5=na
+%
+% Er wordt gegroepeerd. Als binnen een lijst (bijvoorbeeld) de
+% \leftskip is aangepast, maar nog geen \par is gegeven, dan
+% geldt buiten de groep de oude \leftskip. Aan #5 kan dan
+% ook \par worden meegegeven om de paragraaf af te sluiten.
+
+\newif\ifdoinpututilities
+\newif\ifunprotectutilities % voor't geval er \v!xxxxxx's zijn
+
+\def\currentutilityfilename{\jobname}
+
+% we need to pop and push, else problems with reading
+% utility files (toc) in xml mode and (e.g.) in a toc
+% entry doing a doifmode
+%
+% the following is not ok because we have no way to signal
+% xml content (yet), so for the moment we use this:
+
+\appendtoks
+ \ifprocessingXML
+ \processingXMLfalse
+ \enableXML
+ \catcode`\\=\@@escape
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup
+ \catcode`\%=\@@comment\relax
+ \fi
+\to \everybeforeutilityread
+
+% \edef\testbytesequence
+% {\rawcharacter{7}%
+% \rawcharacter{27}%
+% %rawcharacter{227}% invalid in xetex, which expects utf
+% \rawcharacter{195}\rawcharacter{128}} % valid utf code
+%
+% \def\thisisbytesequence#1%
+% {\ifx\testbytesequence\empty\else
+% \defconvertedcommand\testbytesequence\testbytesequence
+% \defconvertedargument\ascii{#1}%
+% \ifx\testbytesequence\ascii \else
+% \writestatus\m!systems{possible problem with 8 bit output}%
+% \fi
+% \fi
+% \global\let\thisisbytesequence\gobbleoneargument}
+%
+% \ifnum\texengine=\xetexengine
+% \let\testbytesequence\empty
+% \fi
+%
+% \appendtoks
+% \immediatewriteutilitycommand{\thisisbytesequence{\testbytesequence}}%
+% \to \everyopenutilities
+
+\let\testbytesequence \empty % keep this
+\let\thisisbytesequence\gobbleoneargument % keep this
+
+\long\def\doutilities#1#2#3#4#5% % introduceren in utility file
+ {\resetutilities
+ % more than one utility thing can be handled in one pass,
+ % for instance lists, so we process ##1 as list
+ \def\douticommand##1{\csname\s!set##1\endcsname}%
+ \processcommacommand[#1]\douticommand
+ \begingroup
+ \def\currentutilityfilename{#2}%
+ \notesenabledfalse
+ \doinpututilitiestrue
+ \global\utilitydonefalse
+ \pushendofline % geeft problemen zodra andere file wordt ingelezen
+ \pushcatcodetable
+ \setcatcodetable\ctxcatcodes
+ \ifunprotectutilities % nog nodig ?
+ \unprotect
+ \fi
+ #4%
+ \the\everybeforeutilityread
+ \readjobfile{#2.\f!outputextension}\donothing\donothing
+ \the\everyafterutilityread
+ \popcatcodetable
+ #5%
+ \relax
+ \ifunprotectutilities
+ \protect
+ \fi
+ \popendofline
+ \ifutilitydone\else
+ \doifsomething{#3}
+ {\showmessage\m!systems9{{#3}}%
+ \doifconcepttracing
+ {\blank
+ \setmessagetext\m!systems9{{#3}}%
+ \type{[\currentmessagetext]}%
+ \blank}}%
+ \fi
+ \endgroup}
+
+% Default-instellingen (verborgen)
+
+\prependtoks \resetutilities \to \everyjob
+
+% Experiment
+%
+% \installprogram{Hello World}
+% \installprogram[hw]{Hello World}
+% \installedprogram[hw]
+
+\def\installprogram
+ {\dosingleempty\doinstallprogram}
+
+\def\doinstallprogram[#1]#2%
+ {\doifelsenothing{#1}
+ {\dodoinstallprogram{#2}}
+ {\setvalue{\??up#1}{\dodoinstallprogram{#2}}}}
+
+\def\dodoinstallprogram#1%
+ {\immediatewriteutility{e p {#1}}}
+
+\def\installedprogram[#1]%
+ {\getvalue{\??up#1}}
+
+% \writeplugindata{texutil}{{alpha}}
+% \writeplugindata{texutil}{{beta}}
+% \writeplugindata{texutil}{{gamma}}
+% \writeplugindata{texutil}{{delta}}
+%
+% \loadplugindata {plugintest}
+
+\def\immediatewriteplugindata#1#2%
+ {\immediatewriteutility{p u {#1} #2}}
+
+\def\writeplugindata#1#2%
+ {\writeutility{p u {#1} #2}}
+
+\def\loadplugindata#1%
+ {\doutilities{#1}\jobname\empty\relax\relax}
+
+% \plugincommand{\command{}{}{}}
+%
+% this way we can catch undefined commands
+
+\long\def\plugincommand#1%
+ {\doplugincommand#1\relax}
+
+\long\def\doplugincommand#1%
+ {\ifx#1\undefined
+ \expandafter\noplugincommand
+ \else
+ \expandafter#1%
+ \fi}
+
+\long\def\noplugincommand#1\relax
+ {}
+
+% \addutilityreset{plugintest}
+%
+% \def\resetplugintest{\let\plugintest\gobbletwoarguments}
+% \def\setplugintest {\let\plugintest\writestatus}
+%
+% \installplugin
+% {plugintest}
+% {\let\plugintest\gobbletwoarguments}
+% {\let\plugintest\writestatus}
+
+\long\def\installplugin#1#2#3%
+ {\addutilityreset {#1}%
+ \long\setvalue{\s!reset#1}{#2}%
+ \long\setvalue{\s!set #1}{#3}}
+
+\protect \endinput
diff --git a/tex/context/base/core-uti.mkiv b/tex/context/base/core-uti.mkiv
new file mode 100644
index 000000000..6b2dae2c9
--- /dev/null
+++ b/tex/context/base/core-uti.mkiv
@@ -0,0 +1,66 @@
+%D \module
+%D [ file=core-uti,
+%D version=1997.03.31, % 2006.09.19 mkiv
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Utility File Handling,
+%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 / Utility File Handling}
+
+\unprotect
+
+\registerctxluafile{core-uti}{1.001}
+
+\def\savecurrentvalue#1#2%
+ {\ctxlua{jobvariables.save("\strippedcsname#1","#2")}}
+
+\appendtoks
+ \ctxlua{storage.dump()}% will move to lua
+\to \everydump
+
+\appendtoks
+ \ctxlua{storage.finalize()}% will move to lua
+\to \everyfinalizeluacode
+
+\appendtoks
+ \ctxlua{nodes.cleanup_reserved()}% will move to lua
+\to \everydump
+
+\appendtoks
+ \ctxlua {
+ job.comment("file: \jobname")
+ job.comment("format: \contextformat")
+ job.comment("stamp: \contextversion")
+ job.comment("escape: \!!bs\space...\space\!!es")
+ job.initialize("\jobname.tuc","\jobname.tua")
+ }%
+\to \everystarttext
+
+\def\notuccompression{\ctxlua{job.pack=false}}
+
+% cleaner, for the moment
+
+% \appendtoks
+% \ctxlua {
+% os.remove("\jobname.tui")
+% os.remove("\jobname.tuo")
+% }%
+% \to \everystarttext
+
+%D Some styles might use these use these commands:
+
+\newif \ifutilitydone
+\let \checkutilities \relax
+\let \currentutilityfilename \jobname
+\def \installprogram {\dosingleempty\doinstallprogram}
+\def \doinstallprogram [#1]{\gobbleoneargument}
+\def \installedprogram [#1]{}
+\let \installplugin \gobblethreearguments
+
+\protect \endinput
diff --git a/tex/context/base/core-var.mkii b/tex/context/base/core-var.mkii
new file mode 100644
index 000000000..4de1b8718
--- /dev/null
+++ b/tex/context/base/core-var.mkii
@@ -0,0 +1,286 @@
+%D \module
+%D [ file=core-var,
+%D version=1998.02.21,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Variables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Variables}
+
+\unprotect
+
+%D We introduce a couple of variables that are used all over
+%D \CONTEXT. Alternatively we could define them in each module
+%D but as they are part of the bigger picture we prefer to do
+%D it here.
+
+%D \macros
+%D {every...}
+%D
+%D A few every's. Some are only used in \MKII\ or \MKIV.
+
+%D Output routine:
+
+\newtoks \everybeforeoutput
+\newtoks \everyafteroutput
+
+%D Shipout:
+
+\newtoks \everyshipout
+\newtoks \everybeforeshipout
+\newtoks \everyaftershipout
+\newtoks \everyfirstshipout
+\newtoks \everylastshipout
+
+%D End of run:
+
+\newtoks \everybye
+\newtoks \everygoodbye
+\newtoks \everynotabene
+
+%D Document
+
+\newtoks \everysetupdocument
+\newtoks \everyendoftextbody
+
+\newtoks \everystarttext
+\newtoks \everystoptext
+
+%D Purity:
+
+\newtoks \everyforgetall
+\newtoks \everycleanupfeatures
+
+\def\cleanupfeatures{\the\everycleanupfeatures}
+\def\forgetall {\the\everyforgetall}
+
+%D Page building:
+
+\newtoks \everybeforepagebody
+\newtoks \everyafterpagebody
+
+\let \everypagebody \everybeforepagebody % backward compatible
+
+%D Multipass:
+
+\newtoks \everybeforeutilityread
+\newtoks \everyafterutilityread
+
+%D Floats:
+
+\newtoks \everyinsidefloat
+
+%D Sectioning:
+
+\newtoks \everyheadstart
+
+%D Par building (experimental, used in xml <p> .. </p>)
+
+\newtoks \everybeginofpar
+\newtoks \everyendofpar
+%newtoks \everyparflush
+
+\def\bpar{\the\everybeginofpar\ignorespaces} % may interfere with \everypar
+\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi} % test prevents problems with \bpar\epar
+
+%D Lists:
+
+\newtoks \everylistentry
+\newtoks \everysavesortkeys
+
+%D Marks:
+
+\newtoks \everymarking
+
+%D Fonts:
+
+\newtoks \everyfont
+\newtoks \everyglobalbodyfont
+\newtoks \everydefinedfont
+
+\newevery \everybodyfont \EveryBodyFont
+\newevery \everyfontswitch \EveryFontSwitch
+
+%D Math:
+
+\newtoks \everybeforedisplayformula
+\newtoks \everymathematics
+
+\prependtoks \the\everymathematics \to \everymath
+\prependtoks \the\everymathematics \to \everydisplay
+
+%D Tables
+
+\newtoks \everytable
+
+%D State mess:
+
+\newtoks \everypushsomestate
+\newtoks \everypopsomestate
+
+\def\pushsomestates{\the\everypushsomestate}
+\def\popsomestates {\the\everypopsomestate }
+
+%D More generic (used to be pushcolor etc)
+
+\newtoks\everypushproperties
+\newtoks\everypopproperties
+\newtoks\everypopsplitproperties
+
+\newtoks\everystarttextproperties
+\newtoks\everystoptextproperties
+
+\def\pushproperties {\the\everypushproperties}
+\def\popproperties {\the\everypopproperties}
+\def\popsplitproperties {\the\everypopsplitproperties}
+
+\def\starttextproperties{\the\everystarttextproperties}
+\def\stoptextproperties {\the\everystoptextproperties}
+
+%D This is pretty important (esp since we now ignore shipouts).
+%D Actually we should nil all writes, marks, specials.
+
+\appendtoks \globallet\popproperties \relax \to \everylastshipout
+\appendtoks \globallet\popsplitproperties\relax \to \everylastshipout
+
+%D \macros
+%D {defineinputmode,setinputmode}
+%D
+%D New. Some work needs to be done.
+
+% not in mkiv
+
+\def\defineinputmode[#1]{\@EA\newtoks\csname every#1inputmode\endcsname}
+\def\setinputmode [#1]{\the\executeifdefined{every#1inputmode}\emptytoks}
+
+\defineinputmode [TEX]
+\defineinputmode [XML]
+
+\setinputmode [TEX]
+
+%D \macros
+%D {trialtypesetting}
+%D
+%D We disable trial typesetting in the output routine,
+%D just to be sure.
+
+\newif\iftrialtypesetting
+
+\prependtoks \trialtypesettingfalse \to \everybeforepagebody
+
+%D \macros
+%D {ifinpagebody,ifinsidecolumns,ifdoublesided,ifsinglesided}
+
+\newif \ifinpagebody
+\newif \ifinsidecolumns
+\newif \ifdoublesided \doublesidedfalse
+\newif \ifsinglesided \singlesidedtrue
+\newif \ifinsidefloat
+\newif \ifdoingblocks
+\newif \ifgridsnapping
+
+%D \macros
+%D {ifprocessingXML}
+%D
+%D We need this one even if no \XML\ is supported.
+
+\newif\ifprocessingXML % old way
+
+%D \macros
+%D {ifproductionrun}
+%D
+%D This boolean can be used to bypass certain
+%D initializations.
+
+\ifx\protectionlevel\undefined \newcount\protectionlevel \fi
+
+\newif\ifproductionrun
+
+\appendtoks \productionruntrue \to \everydump
+
+\appendtoks \ifcase\protectionlevel\else\reportunprotection\fi \to \everydump
+
+%D \macros
+%D {everyboxedcontent, ifboxedcontent,
+%D startboxedcontent, stopboxedcontent}
+%D
+%D This one is relatively new and will be used as a more
+%D robust test for inner situations.
+
+\newif \ifboxedcontent
+\newtoks\everyboxedcontent
+
+\appendtoks \boxedcontenttrue \to \everyboxedcontent
+
+\def\startboxedcontent{\bgroup\the\everyboxedcontent}
+\let\stopboxedcontent \egroup
+
+%D \macros
+%D {fastmode,silentmode}
+%D
+%D These commands are obsolete.
+
+\let\fastmode \relax
+\let\silentmode\relax
+
+%D \macros
+%D {defineselector,setupselector}
+%D
+%D \starttyping
+%D \defineselector[caption][max=2,n=2]
+%D
+%D \start
+%D \setupselector[caption][n=1]
+%D \placelist[figure][criterium=all]
+%D \stop
+%D
+%D \starttext
+%D \placefigure
+%D {\select{caption}{zapf}{\input zapf \relax}}
+%D {}
+%D \stoptext
+%D \stoptyping
+
+\def\defineselector{\dodoubleargument\dodefineselector}
+\def\setupselector {\dodoubleargument\dosetupselector}
+
+\def\dodefineselector[#1][#2]{\getparameters[\??sx#1][\c!max=2,\c!n=1,#2]}
+\def\dosetupselector [#1][#2]{\getparameters[\??sx#1][#2]}
+
+\unexpanded\def\select#1%
+ {\filterfromnext
+ {\executeifdefined{\??sx#1\c!max}1}
+ {\executeifdefined{\??sx#1\c!n }1}}
+
+%D We store some original meanings, maybe in \type
+%D {math-ini}.
+
+\let\normalat \at
+\let\normalin \in
+\let\normalfrom \from
+%let\normalover \over
+\let\normalabout\about
+
+%D Add-ons:
+
+\let\startlayoutcomponent\gobbletwoarguments
+\let\stoplayoutcomponent \relax
+
+%D Concepts:
+
+\chardef\conceptmode\zerocount
+
+\def\doifconcepttracing
+ {\ifnum\conceptmode>\plustwo
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv
new file mode 100644
index 000000000..62cc9fc50
--- /dev/null
+++ b/tex/context/base/core-var.mkiv
@@ -0,0 +1,270 @@
+%D \module
+%D [ file=core-var,
+%D version=1998.02.21,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Variables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Variables}
+
+\unprotect
+
+%D We introduce a couple of variables that are used all over
+%D \CONTEXT. Alternatively we could define them in each module
+%D but as they are part of the bigger picture we prefer to do
+%D it here.
+
+%D \macros
+%D {every...}
+%D
+%D A few every's. Some are only used in \MKII\ or \MKIV.
+
+%D Output routine:
+
+\newtoks \everybeforeoutput
+\newtoks \everyafteroutput
+
+%D Shipout:
+
+\newtoks \everyshipout
+\newtoks \everybeforeshipout
+\newtoks \everyaftershipout
+\newtoks \everyfirstshipout
+\newtoks \everylastshipout
+
+%D End of run:
+
+\newtoks \everybye
+\newtoks \everygoodbye
+\newtoks \everynotabene
+
+%D Document
+
+\newtoks \everysetupdocument
+\newtoks \everyendoftextbody
+
+\newtoks \everystarttext
+\newtoks \everystoptext
+
+%D Purity:
+
+\newtoks \everyforgetall
+\newtoks \everycleanupfeatures
+
+\def\cleanupfeatures{\the\everycleanupfeatures}
+\def\forgetall {\the\everyforgetall}
+
+%D Page building:
+
+\newtoks \everybeforepagebody
+\newtoks \everyafterpagebody
+
+\let \everypagebody \everybeforepagebody % backward compatible
+
+%D Multipass:
+
+\newtoks \everybeforeutilityread
+\newtoks \everyafterutilityread
+
+%D Floats:
+
+\newtoks \everyinsidefloat
+
+%D Sectioning:
+
+\newtoks \everyheadstart
+
+%D Par building (experimental, used in xml <p> .. </p>)
+
+\newtoks \everybeginofpar
+\newtoks \everyendofpar
+%newtoks \everyparflush
+
+\def\bpar{\the\everybeginofpar\ignorespaces} % may interfere with \everypar
+\def\epar{\ifhmode\removeunwantedspaces\the\everyendofpar\fi} % test prevents problems with \bpar\epar
+
+%D Lists:
+
+\newtoks \everylistentry
+\newtoks \everysavesortkeys
+
+%D Marks:
+
+\newtoks \everymarking
+
+%D Fonts:
+
+\newtoks \everyfont
+\newtoks \everyglobalbodyfont
+\newtoks \everydefinedfont
+
+\newevery \everybodyfont \EveryBodyFont
+\newevery \everyfontswitch \EveryFontSwitch
+
+\newtoks \everysetupbodyfont
+\newtoks \everyswitchtobodyfont
+
+%D Math:
+
+\newtoks \everybeforedisplayformula
+\newtoks \everymathematics
+
+\prependtoks \the\everymathematics \to \everymath
+\prependtoks \the\everymathematics \to \everydisplay
+
+%D Tables
+
+\newtoks \everytable
+
+%D State mess:
+
+\newtoks \everypushsomestate
+\newtoks \everypopsomestate
+
+\def\pushsomestates{\the\everypushsomestate}
+\def\popsomestates {\the\everypopsomestate }
+
+%D More generic (used to be pushcolor etc)
+
+\newtoks\everystarttextproperties
+\newtoks\everystoptextproperties
+
+\unexpanded\def\starttextproperties{\the\everystarttextproperties}
+\unexpanded\def\stoptextproperties {\the\everystoptextproperties}
+
+%D \macros
+%D {defineinputmode,setinputmode}
+%D
+%D New. Some work needs to be done.
+
+% not in mkiv
+
+\unexpanded\def\defineinputmode[#1]{\@EA\newtoks\csname every#1inputmode\endcsname}
+\def\setinputmode [#1]{\the\executeifdefined{every#1inputmode}\emptytoks}
+
+\defineinputmode [TEX]
+\defineinputmode [XML]
+
+\setinputmode [TEX]
+
+%D \macros
+%D {trialtypesetting}
+%D
+%D We disable trial typesetting in the output routine,
+%D just to be sure.
+
+\newif\iftrialtypesetting
+
+\prependtoks \trialtypesettingfalse \to \everybeforepagebody
+
+%D \macros
+%D {ifinpagebody,ifinsidecolumns,ifdoublesided,ifsinglesided}
+
+\newif \ifinpagebody
+\newif \ifinsidecolumns
+\newif \ifdoublesided \doublesidedfalse
+\newif \ifsinglesided \singlesidedtrue
+\newif \ifinsidefloat
+\newif \ifdoingblocks
+\newif \ifgridsnapping
+
+%D \macros
+%D {ifprocessingXML}
+%D
+%D We need this one even if no \XML\ is supported.
+
+\newif\ifprocessingXML % old way
+
+%D \macros
+%D {ifproductionrun}
+%D
+%D This boolean can be used to bypass certain
+%D initializations.
+
+\newif\ifproductionrun \appendtoks \productionruntrue \to \everydump
+
+%D \macros
+%D {everyboxedcontent, ifboxedcontent,
+%D startboxedcontent, stopboxedcontent}
+%D
+%D This one is relatively new and will be used as a more
+%D robust test for inner situations.
+
+\newif \ifboxedcontent
+\newtoks\everyboxedcontent
+
+\appendtoks \boxedcontenttrue \to \everyboxedcontent
+
+\unexpanded\def\startboxedcontent{\bgroup\the\everyboxedcontent}
+\let\stopboxedcontent \egroup
+
+%D \macros
+%D {fastmode,silentmode}
+%D
+%D These commands are obsolete.
+
+\let\fastmode \relax
+\let\silentmode\relax
+
+%D \macros
+%D {defineselector,setupselector}
+%D
+%D \starttyping
+%D \defineselector[caption][max=2,n=2]
+%D
+%D \start
+%D \setupselector[caption][n=1]
+%D \placelist[figure][criterium=all]
+%D \stop
+%D
+%D \starttext
+%D \placefigure
+%D {\select{caption}{zapf}{\input zapf \relax}}
+%D {}
+%D \stoptext
+%D \stoptyping
+
+\unexpanded\def\defineselector{\dodoubleargument\dodefineselector}
+\unexpanded\def\setupselector {\dodoubleargument\dosetupselector}
+
+\def\dodefineselector[#1][#2]{\getparameters[\??sx#1][\c!max=2,\c!n=1,#2]}
+\def\dosetupselector [#1][#2]{\getparameters[\??sx#1][#2]}
+
+\unexpanded\def\select#1%
+ {\filterfromnext
+ {\executeifdefined{\??sx#1\c!max}1}
+ {\executeifdefined{\??sx#1\c!n }1}}
+
+%D We store some original meanings, maybe in \type
+%D {math-ini}.
+
+\let\normalat \at
+\let\normalin \in
+\let\normalfrom \from
+%let\normalover \over
+\let\normalabout\about
+
+%D Add-ons:
+
+\let\setlayoutcomponentattribute \gobbletwoarguments
+\let\resetlayoutcomponentattribute\relax
+\let\layoutcomponentboxattribute \empty
+
+%D Concepts:
+
+\chardef\conceptmode\zerocount
+
+\def\doifconcepttracing
+ {\ifnum\conceptmode>\plustwo
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/data-aux.lua b/tex/context/base/data-aux.lua
new file mode 100644
index 000000000..26e1f551c
--- /dev/null
+++ b/tex/context/base/data-aux.lua
@@ -0,0 +1,57 @@
+if not modules then modules = { } end modules ['data-aux'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local find = string.find
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+function resolvers.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+ local scriptpath = "scripts/context/lua"
+ newname = file.addsuffix(newname,"lua")
+ local oldscript = resolvers.clean_path(oldname)
+ if trace_locating then
+ logs.report("fileio","to be replaced old script %s", oldscript)
+ end
+ local newscripts = resolvers.find_files(newname) or { }
+ if #newscripts == 0 then
+ if trace_locating then
+ logs.report("fileio","unable to locate new script")
+ end
+ else
+ for i=1,#newscripts do
+ local newscript = resolvers.clean_path(newscripts[i])
+ if trace_locating then
+ logs.report("fileio","checking new script %s", newscript)
+ end
+ if oldscript == newscript then
+ if trace_locating then
+ logs.report("fileio","old and new script are the same")
+ end
+ elseif not find(newscript,scriptpath) then
+ if trace_locating then
+ logs.report("fileio","new script should come from %s",scriptpath)
+ end
+ elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
+ if trace_locating then
+ logs.report("fileio","invalid new script name")
+ end
+ else
+ local newdata = io.loaddata(newscript)
+ if newdata then
+ if trace_locating then
+ logs.report("fileio","old script content replaced by new content")
+ end
+ io.savedata(oldscript,newdata)
+ break
+ elseif trace_locating then
+ logs.report("fileio","unable to load new script")
+ end
+ end
+ end
+ end
+end
diff --git a/tex/context/base/data-bin.lua b/tex/context/base/data-bin.lua
new file mode 100644
index 000000000..5e4397a54
--- /dev/null
+++ b/tex/context/base/data-bin.lua
@@ -0,0 +1,27 @@
+if not modules then modules = { } end modules ['data-bin'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+local unpack = unpack or table.unpack
+
+function resolvers.findbinfile(filename, filetype)
+ return resolvers.methodhandler('finders',filename, filetype)
+end
+
+function resolvers.openbinfile(filename)
+ return resolvers.methodhandler('loaders',filename)
+end
+
+function resolvers.loadbinfile(filename, filetype)
+ local fname = resolvers.methodhandler('finders',filename, filetype)
+ if fname and fname ~= "" then
+ return resolvers.openbinfile(fname)
+ else
+ return unpack(loaders.notfound)
+ end
+end
diff --git a/tex/context/base/data-con.lua b/tex/context/base/data-con.lua
new file mode 100644
index 000000000..fabe0baa1
--- /dev/null
+++ b/tex/context/base/data-con.lua
@@ -0,0 +1,120 @@
+if not modules then modules = { } end modules ['data-con'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, lower, gsub = string.format, string.lower, string.gsub
+
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
+local trace_containers = false trackers.register("resolvers.containers", function(v) trace_containers = v end)
+local trace_storage = false trackers.register("resolvers.storage", function(v) trace_storage = v end)
+
+--[[ldx--
+<p>Once we found ourselves defining similar cache constructs
+several times, containers were introduced. Containers are used
+to collect tables in memory and reuse them when possible based
+on (unique) hashes (to be provided by the calling function).</p>
+
+<p>Caching to disk is disabled by default. Version numbers are
+stored in the saved table which makes it possible to change the
+table structures without bothering about the disk cache.</p>
+
+<p>Examples of usage can be found in the font related code.</p>
+--ldx]]--
+
+containers = containers or { }
+
+containers.usecache = true
+
+local function report(container,tag,name)
+ if trace_cache or trace_containers then
+ logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ end
+end
+
+local allocated = { }
+
+-- tracing
+
+function containers.define(category, subcategory, version, enabled)
+ return function()
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or 1.000,
+ trace = false,
+ path = caches and caches.setpath and caches.setpath(category,subcategory),
+ }
+ c[subcategory] = s
+ end
+ return s
+ else
+ return nil
+ end
+ end
+end
+
+function containers.is_usable(container, name)
+ return container.enabled and caches and caches.iswritable(container.path, name)
+end
+
+function containers.is_valid(container, name)
+ if name and name ~= "" then
+ local storage = container.storage[name]
+ return storage and storage.cache_version == container.version
+ else
+ return false
+ end
+end
+
+function containers.read(container,name)
+ if container.enabled and caches and not container.storage[name] and containers.usecache then
+ container.storage[name] = caches.loaddata(container.path,name)
+ if containers.is_valid(container,name) then
+ report(container,"loaded",name)
+ else
+ container.storage[name] = nil
+ end
+ end
+ if container.storage[name] then
+ report(container,"reusing",name)
+ end
+ return container.storage[name]
+end
+
+function containers.write(container, name, data)
+ if data then
+ data.cache_version = container.version
+ if container.enabled and caches then
+ local unique, shared = data.unique, data.shared
+ data.unique, data.shared = nil, nil
+ caches.savedata(container.path, name, data)
+ report(container,"saved",name)
+ data.unique, data.shared = unique, shared
+ end
+ report(container,"stored",name)
+ container.storage[name] = data
+ end
+ return data
+end
+
+function containers.content(container,name)
+ return container.storage[name]
+end
+
+function containers.cleanname(name)
+ return (gsub(lower(name),"[^%w%d]+","-"))
+end
diff --git a/tex/context/base/data-crl.lua b/tex/context/base/data-crl.lua
new file mode 100644
index 000000000..55b1a8fad
--- /dev/null
+++ b/tex/context/base/data-crl.lua
@@ -0,0 +1,60 @@
+if not modules then modules = { } end modules ['data-crl'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local gsub = string.gsub
+
+curl = curl or { }
+
+curl.cached = { }
+curl.cachepath = caches.definepath("curl")
+
+local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+
+function curl.fetch(protocol, name)
+ local cachename = curl.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
+-- cachename = gsub(cachename,"[\\/]", io.fileseparator)
+ cachename = gsub(cachename,"[\\]", "/") -- cleanup
+ if not curl.cached[name] then
+ if not io.exists(cachename) then
+ curl.cached[name] = cachename
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+ os.spawn(command)
+ end
+ if io.exists(cachename) then
+ curl.cached[name] = cachename
+ else
+ curl.cached[name] = ""
+ end
+ end
+ return curl.cached[name]
+end
+
+function finders.curl(protocol,filename)
+ local foundname = curl.fetch(protocol, filename)
+ return finders.generic(protocol,foundname,filetype)
+end
+
+function openers.curl(protocol,filename)
+ return openers.generic(protocol,filename)
+end
+
+function loaders.curl(protocol,filename)
+ return loaders.generic(protocol,filename)
+end
+
+-- todo: metamethod
+
+function curl.install(protocol)
+ finders[protocol] = function (filename,filetype) return finders.curl(protocol,filename) end
+ openers[protocol] = function (filename) return openers.curl(protocol,filename) end
+ loaders[protocol] = function (filename) return loaders.curl(protocol,filename) end
+end
+
+curl.install('http')
+curl.install('https')
+curl.install('ftp')
diff --git a/tex/context/base/data-ctx.lua b/tex/context/base/data-ctx.lua
new file mode 100644
index 000000000..89eb2742d
--- /dev/null
+++ b/tex/context/base/data-ctx.lua
@@ -0,0 +1,31 @@
+if not modules then modules = { } end modules ['data-ctx'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+function resolvers.save_used_files_in_trees(filename,jobname)
+ if not filename then filename = 'luatex.jlg' end
+ local found = instance.foundintrees
+ local f = io.open(filename,'w')
+ if f then
+ f:write("<?xml version='1.0' standalone='yes'?>\n")
+ f:write("<rl:job>\n")
+ if jobname then
+ f:write(format("\t<rl:name>%s</rl:name>\n",jobname))
+ end
+ f:write("\t<rl:files>\n")
+ local sorted = table.sortedkeys(found)
+ for k=1,#sorted do
+ local v = sorted[k]
+ f:write(format("\t\t<rl:file n='%s'>%s</rl:file>\n",found[v],v))
+ end
+ f:write("\t</rl:files>\n")
+ f:write("</rl:usedfiles>\n")
+ f:close()
+ end
+end
diff --git a/tex/context/base/data-gen.lua b/tex/context/base/data-gen.lua
new file mode 100644
index 000000000..5a0755831
--- /dev/null
+++ b/tex/context/base/data-gen.lua
@@ -0,0 +1,9 @@
+if not modules then modules = { } end modules ['data-gen'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- move generators here
diff --git a/tex/context/base/data-inp.lua b/tex/context/base/data-inp.lua
new file mode 100644
index 000000000..b7354e1ae
--- /dev/null
+++ b/tex/context/base/data-inp.lua
@@ -0,0 +1,15 @@
+if not modules then modules = { } end modules ['data-inp'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+resolvers.finders = resolvers.finders or { }
+resolvers.openers = resolvers.openers or { }
+resolvers.loaders = resolvers.loaders or { }
+
+resolvers.finders.notfound = { nil }
+resolvers.openers.notfound = { nil }
+resolvers.loaders.notfound = { false, nil, 0 }
diff --git a/tex/context/base/data-kps.lua b/tex/context/base/data-kps.lua
new file mode 100644
index 000000000..09d502409
--- /dev/null
+++ b/tex/context/base/data-kps.lua
@@ -0,0 +1,101 @@
+if not modules then modules = { } end modules ['luat-kps'] = {
+ version = 1.001,
+ comment = "companion to luatools.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This file is used when we want the input handlers to behave like
+<type>kpsewhich</type>. What to do with the following:</p>
+
+<typing>
+{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
+$SELFAUTOLOC : /usr/tex/bin/platform
+$SELFAUTODIR : /usr/tex/bin
+$SELFAUTOPARENT : /usr/tex
+</typing>
+
+<p>How about just forgetting about them?</p>
+--ldx]]--
+
+local suffixes = resolvers.suffixes
+local formats = resolvers.formats
+
+suffixes['gf'] = { '<resolution>gf' }
+suffixes['pk'] = { '<resolution>pk' }
+suffixes['base'] = { 'base' }
+suffixes['bib'] = { 'bib' }
+suffixes['bst'] = { 'bst' }
+suffixes['cnf'] = { 'cnf' }
+suffixes['mem'] = { 'mem' }
+suffixes['mf'] = { 'mf' }
+suffixes['mfpool'] = { 'pool' }
+suffixes['mft'] = { 'mft' }
+suffixes['mppool'] = { 'pool' }
+suffixes['graphic/figure'] = { 'eps', 'epsi' }
+suffixes['texpool'] = { 'pool' }
+suffixes['PostScript header'] = { 'pro' }
+suffixes['ist'] = { 'ist' }
+suffixes['web'] = { 'web', 'ch' }
+suffixes['cweb'] = { 'w', 'web', 'ch' }
+suffixes['cmap files'] = { 'cmap' }
+suffixes['lig files'] = { 'lig' }
+suffixes['bitmap font'] = { }
+suffixes['MetaPost support'] = { }
+suffixes['TeX system documentation'] = { }
+suffixes['TeX system sources'] = { }
+suffixes['dvips config'] = { }
+suffixes['type42 fonts'] = { }
+suffixes['web2c files'] = { }
+suffixes['other text files'] = { }
+suffixes['other binary files'] = { }
+suffixes['opentype fonts'] = { 'otf' }
+
+suffixes['fmt'] = { 'fmt' }
+suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
+
+suffixes['pdftex config'] = { }
+suffixes['Troff fonts'] = { }
+
+suffixes['ls-R'] = { }
+
+--[[ldx--
+<p>If you wondered abou tsome of the previous mappings, how about
+the next bunch:</p>
+--ldx]]--
+
+formats['bib'] = ''
+formats['bst'] = ''
+formats['mft'] = ''
+formats['ist'] = ''
+formats['web'] = ''
+formats['cweb'] = ''
+formats['MetaPost support'] = ''
+formats['TeX system documentation'] = ''
+formats['TeX system sources'] = ''
+formats['Troff fonts'] = ''
+formats['dvips config'] = ''
+formats['graphic/figure'] = ''
+formats['ls-R'] = ''
+formats['other text files'] = ''
+formats['other binary files'] = ''
+
+formats['gf'] = ''
+formats['pk'] = ''
+formats['base'] = 'MFBASES'
+formats['cnf'] = ''
+formats['mem'] = 'MPMEMS'
+formats['mf'] = 'MFINPUTS'
+formats['mfpool'] = 'MFPOOL'
+formats['mppool'] = 'MPPOOL'
+formats['texpool'] = 'TEXPOOL'
+formats['PostScript header'] = 'TEXPSHEADERS'
+formats['cmap files'] = 'CMAPFONTS'
+formats['type42 fonts'] = 'T42FONTS'
+formats['web2c files'] = 'WEB2C'
+formats['pdftex config'] = 'PDFTEXCONFIG'
+formats['texmfscripts'] = 'TEXMFSCRIPTS'
+formats['bitmap font'] = ''
+formats['lig files'] = 'LIGFONTS'
diff --git a/tex/context/base/data-lst.lua b/tex/context/base/data-lst.lua
new file mode 100644
index 000000000..82f675486
--- /dev/null
+++ b/tex/context/base/data-lst.lua
@@ -0,0 +1,63 @@
+if not modules then modules = { } end modules ['data-lst'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- used in mtxrun
+
+local find, concat, upper, format = string.find, table.concat, string.upper, string.format
+
+resolvers.listers = resolvers.listers or { }
+
+local function tabstr(str)
+ if type(str) == 'table' then
+ return concat(str," | ")
+ else
+ return str
+ end
+end
+
+local function list(list,report)
+ local instance = resolvers.instance
+ local pat = upper(pattern or "","")
+ local report = report or texio.write_nl
+ local sorted = table.sortedkeys(list)
+ for i=1,#sorted do
+ local key = sorted[i]
+ if instance.pattern == "" or find(upper(key),pat) then
+ if instance.kpseonly then
+ if instance.kpsevars[key] then
+ report(format("%s=%s",key,tabstr(list[key])))
+ end
+ else
+ report(format('%s %s=%s',(instance.kpsevars[key] and 'K') or 'E',key,tabstr(list[key])))
+ end
+ end
+ end
+end
+
+function resolvers.listers.variables () list(resolvers.instance.variables ) end
+function resolvers.listers.expansions() list(resolvers.instance.expansions) end
+
+function resolvers.listers.configurations(report)
+ local report = report or texio.write_nl
+ local instance = resolvers.instance
+ local sorted = table.sortedkeys(instance.kpsevars)
+ for i=1,#sorted do
+ local key = sorted[i]
+ if not instance.pattern or (instance.pattern=="") or find(key,instance.pattern) then
+ report(format("%s\n",key))
+ local order = instance.order
+ for i=1,#order do
+ local str = order[i][key]
+ if str then
+ report(format("\t%s\t%s",i,str))
+ end
+ end
+ report("")
+ end
+ end
+end
diff --git a/tex/context/base/data-lua.lua b/tex/context/base/data-lua.lua
new file mode 100644
index 000000000..988133fbe
--- /dev/null
+++ b/tex/context/base/data-lua.lua
@@ -0,0 +1,152 @@
+if not modules then modules = { } end modules ['data-lua'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- some loading stuff ... we might move this one to slot 2 depending
+-- on the developments (the loaders must not trigger kpse); we could
+-- of course use a more extensive lib path spec
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local gsub, insert = string.gsub, table.insert
+local unpack = unpack or table.unpack
+
+local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -- 'luainputs'
+local clibformats = { 'lib' }
+
+local _path_, libpaths, _cpath_, clibpaths
+
+function package.libpaths()
+ if not _path_ or package.path ~= _path_ then
+ _path_ = package.path
+ libpaths = file.split_path(_path_,";")
+ end
+ return libpaths
+end
+
+function package.clibpaths()
+ if not _cpath_ or package.cpath ~= _cpath_ then
+ _cpath_ = package.cpath
+ clibpaths = file.split_path(_cpath_,";")
+ end
+ return clibpaths
+end
+
+local function thepath(...)
+ local t = { ... } t[#t+1] = "?.lua"
+ local path = file.join(unpack(t))
+ if trace_locating then
+ logs.report("fileio","! appending '%s' to 'package.path'",path)
+ end
+ return path
+end
+
+local p_libpaths, a_libpaths = { }, { }
+
+function package.append_libpath(...)
+ insert(a_libpath,thepath(...))
+end
+
+function package.prepend_libpath(...)
+ insert(p_libpaths,1,thepath(...))
+end
+
+-- beware, we need to return a loadfile result !
+
+local function loaded(libpaths,name,simple)
+ for i=1,#libpaths do -- package.path, might become option
+ local libpath = libpaths[i]
+ local resolved = gsub(libpath,"%?",simple)
+ if trace_locating then -- more detail
+ logs.report("fileio","! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
+ end
+ if resolvers.isreadable.file(resolved) then
+ if trace_locating then
+ logs.report("fileio","! lib '%s' located via 'package.path': '%s'",name,resolved)
+ end
+ return loadfile(resolved)
+ end
+ end
+end
+
+
+package.loaders[2] = function(name) -- was [#package.loaders+1]
+ if trace_locating then -- mode detail
+ logs.report("fileio","! locating '%s'",name)
+ end
+ for i=1,#libformats do
+ local format = libformats[i]
+ local resolved = resolvers.find_file(name,format) or ""
+ if trace_locating then -- mode detail
+ logs.report("fileio","! checking for '%s' using 'libformat path': '%s'",name,format)
+ end
+ if resolved ~= "" then
+ if trace_locating then
+ logs.report("fileio","! lib '%s' located via environment: '%s'",name,resolved)
+ end
+ return loadfile(resolved)
+ end
+ end
+ -- libpaths
+ local libpaths, clibpaths = package.libpaths(), package.clibpaths()
+ local simple = gsub(name,"%.lua$","")
+ local simple = gsub(simple,"%.","/")
+ local resolved = loaded(p_libpaths,name,simple) or loaded(libpaths,name,simple) or loaded(a_libpaths,name,simple)
+ if resolved then
+ return resolved
+ end
+ --
+ local libname = file.addsuffix(simple,os.libsuffix)
+ for i=1,#clibformats do
+ -- better have a dedicated loop
+ local format = clibformats[i]
+ local paths = resolvers.expanded_path_list_from_var(format)
+ for p=1,#paths do
+ local path = paths[p]
+ local resolved = file.join(path,libname)
+ if trace_locating then -- mode detail
+ logs.report("fileio","! checking for '%s' using 'clibformat path': '%s'",libname,path)
+ end
+ if resolvers.isreadable.file(resolved) then
+ if trace_locating then
+ logs.report("fileio","! lib '%s' located via 'clibformat': '%s'",libname,resolved)
+ end
+ return package.loadlib(resolved,name)
+ end
+ end
+ end
+ for i=1,#clibpaths do -- package.path, might become option
+ local libpath = clibpaths[i]
+ local resolved = gsub(libpath,"?",simple)
+ if trace_locating then -- more detail
+ logs.report("fileio","! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
+ end
+ if resolvers.isreadable.file(resolved) then
+ if trace_locating then
+ logs.report("fileio","! lib '%s' located via 'package.cpath': '%s'",name,resolved)
+ end
+ return package.loadlib(resolved,name)
+ end
+ end
+ -- just in case the distribution is messed up
+ if trace_loading then -- more detail
+ logs.report("fileio","! checking for '%s' using 'luatexlibs': '%s'",name)
+ end
+ local resolved = resolvers.find_file(file.basename(name),'luatexlibs') or ""
+ if resolved ~= "" then
+ if trace_locating then
+ logs.report("fileio","! lib '%s' located by basename via environment: '%s'",name,resolved)
+ end
+ return loadfile(resolved)
+ end
+ if trace_locating then
+ logs.report("fileio",'? unable to locate lib: %s',name)
+ end
+-- return "unable to locate " .. name
+end
+
+resolvers.loadlualib = require
diff --git a/tex/context/base/data-out.lua b/tex/context/base/data-out.lua
new file mode 100644
index 000000000..f73ff9bdc
--- /dev/null
+++ b/tex/context/base/data-out.lua
@@ -0,0 +1,10 @@
+if not modules then modules = { } end modules ['data-out'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+outputs = outputs or { }
+
diff --git a/tex/context/base/data-pre.lua b/tex/context/base/data-pre.lua
new file mode 100644
index 000000000..9348f6cd3
--- /dev/null
+++ b/tex/context/base/data-pre.lua
@@ -0,0 +1,109 @@
+if not modules then modules = { } end modules ['data-res'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--~ print(resolvers.resolve("abc env:tmp file:cont-en.tex path:cont-en.tex full:cont-en.tex rel:zapf/one/p-chars.tex"))
+
+local upper, lower, gsub = string.upper, string.lower, string.gsub
+
+local prefixes = { }
+
+prefixes.environment = function(str)
+ return resolvers.clean_path(os.getenv(str) or os.getenv(upper(str)) or os.getenv(lower(str)) or "")
+end
+
+prefixes.relative = function(str,n)
+ if io.exists(str) then
+ -- nothing
+ elseif io.exists("./" .. str) then
+ str = "./" .. str
+ else
+ local p = "../"
+ for i=1,n or 2 do
+ if io.exists(p .. str) then
+ str = p .. str
+ break
+ else
+ p = p .. "../"
+ end
+ end
+ end
+ return resolvers.clean_path(str)
+end
+
+prefixes.auto = function(str)
+ local fullname = prefixes.relative(str)
+ if not lfs.isfile(fullname) then
+ fullname = prefixes.locate(str)
+ end
+ return fullname
+end
+
+prefixes.locate = function(str)
+ local fullname = resolvers.find_given_file(str) or ""
+ return resolvers.clean_path((fullname ~= "" and fullname) or str)
+end
+
+prefixes.filename = function(str)
+ local fullname = resolvers.find_given_file(str) or ""
+ return resolvers.clean_path(file.basename((fullname ~= "" and fullname) or str))
+end
+
+prefixes.pathname = function(str)
+ local fullname = resolvers.find_given_file(str) or ""
+ return resolvers.clean_path(file.dirname((fullname ~= "" and fullname) or str))
+end
+
+prefixes.env = prefixes.environment
+prefixes.rel = prefixes.relative
+prefixes.loc = prefixes.locate
+prefixes.kpse = prefixes.locate
+prefixes.full = prefixes.locate
+prefixes.file = prefixes.filename
+prefixes.path = prefixes.pathname
+
+function resolvers.allprefixes(separator)
+ local all = table.sortedkeys(prefixes)
+ if separator then
+ for i=1,#all do
+ all[i] = all[i] .. ":"
+ end
+ end
+ return all
+end
+
+local function _resolve_(method,target)
+ if prefixes[method] then
+ return prefixes[method](target)
+ else
+ return method .. ":" .. target
+ end
+end
+
+local function resolve(str)
+ if type(str) == "table" then
+ for k=1,#str do
+ local v = str[k]
+ str[k] = resolve(v) or v
+ end
+ elseif str and str ~= "" then
+ str = gsub(str,"([a-z]+):([^ \"\']*)",_resolve_)
+ end
+ return str
+end
+
+resolvers.resolve = resolve
+
+if os.uname then
+
+ for k, v in next, os.uname() do
+ if not prefixes[k] then
+ prefixes[k] = function() return v end
+ end
+ end
+
+end
diff --git a/tex/context/base/data-res.lua b/tex/context/base/data-res.lua
new file mode 100644
index 000000000..ecef14188
--- /dev/null
+++ b/tex/context/base/data-res.lua
@@ -0,0 +1,2181 @@
+if not modules then modules = { } end modules ['data-inp'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- After a few years using the code the large luat-inp.lua file
+-- has been split up a bit. In the process some functionality was
+-- dropped:
+--
+-- * support for reading lsr files
+-- * selective scanning (subtrees)
+-- * some public auxiliary functions were made private
+--
+-- TODO: os.getenv -> os.env[]
+-- TODO: instances.[hashes,cnffiles,configurations,522]
+-- TODO: check escaping in find etc, too much, too slow
+
+-- This lib is multi-purpose and can be loaded again later on so that
+-- additional functionality becomes available. We will split thislogs.report("fileio",
+-- module in components once we're done with prototyping. This is the
+-- first code I wrote for LuaTeX, so it needs some cleanup. Before changing
+-- something in this module one can best check with Taco or Hans first; there
+-- is some nasty trickery going on that relates to traditional kpse support.
+
+-- To be considered: hash key lowercase, first entry in table filename
+-- (any case), rest paths (so no need for optimization). Or maybe a
+-- separate table that matches lowercase names to mixed case when
+-- present. In that case the lower() cases can go away. I will do that
+-- only when we run into problems with names ... well ... Iwona-Regular.
+
+-- Beware, loading and saving is overloaded in luat-tmp!
+
+local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
+local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
+local next, type = next, type
+local lpegmatch = lpeg.match
+
+local trace_locating, trace_detail, trace_expansions = false, false, false
+
+trackers.register("resolvers.locating", function(v) trace_locating = v end)
+trackers.register("resolvers.details", function(v) trace_detail = v end)
+trackers.register("resolvers.expansions", function(v) trace_expansions = v end) -- todo
+
+if not resolvers then
+ resolvers = {
+ suffixes = { },
+ formats = { },
+ dangerous = { },
+ suffixmap = { },
+ alternatives = { },
+ locators = { }, -- locate databases
+ hashers = { }, -- load databases
+ generators = { }, -- generate databases
+ }
+end
+
+local resolvers = resolvers
+
+resolvers.locators .notfound = { nil }
+resolvers.hashers .notfound = { nil }
+resolvers.generators.notfound = { nil }
+
+resolvers.cacheversion = '1.0.1'
+resolvers.cnfname = 'texmf.cnf'
+resolvers.luaname = 'texmfcnf.lua'
+resolvers.homedir = os.env[os.type == "windows" and 'USERPROFILE'] or os.env['HOME'] or '~'
+resolvers.cnfdefault = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}'
+
+local dummy_path_expr = "^!*unset/*$"
+
+local formats = resolvers.formats
+local suffixes = resolvers.suffixes
+local dangerous = resolvers.dangerous
+local suffixmap = resolvers.suffixmap
+local alternatives = resolvers.alternatives
+
+formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' }
+formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' }
+formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' }
+formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' }
+formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' }
+formats['ocp'] = 'OCPINPUTS' suffixes['ocp'] = { 'ocp' }
+formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' }
+formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -- 'ttf'
+formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' }
+formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' }
+formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' }
+formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' }
+formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' }
+formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' }
+formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' }
+formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' }
+formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' }
+
+formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' }
+formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' }
+
+formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
+suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
+
+formats ['lua'] = 'LUAINPUTS' -- new
+suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
+
+-- backward compatible ones
+
+alternatives['map files'] = 'map'
+alternatives['enc files'] = 'enc'
+alternatives['cid maps'] = 'cid' -- great, why no cid files
+alternatives['font feature files'] = 'fea' -- and fea files here
+alternatives['opentype fonts'] = 'otf'
+alternatives['truetype fonts'] = 'ttf'
+alternatives['truetype collections'] = 'ttc'
+alternatives['truetype dictionary'] = 'dfont'
+alternatives['type1 fonts'] = 'pfb'
+
+-- obscure ones
+
+formats ['misc fonts'] = ''
+suffixes['misc fonts'] = { }
+
+formats ['sfd'] = 'SFDFONTS'
+suffixes ['sfd'] = { 'sfd' }
+alternatives['subfont definition files'] = 'sfd'
+
+-- lib paths
+
+formats ['lib'] = 'CLUAINPUTS' -- new (needs checking)
+suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' }
+
+-- In practice we will work within one tds tree, but i want to keep
+-- the option open to build tools that look at multiple trees, which is
+-- why we keep the tree specific data in a table. We used to pass the
+-- instance but for practical pusposes we now avoid this and use a
+-- instance variable.
+
+-- here we catch a few new thingies (todo: add these paths to context.tmf)
+--
+-- FONTFEATURES = .;$TEXMF/fonts/fea//
+-- FONTCIDMAPS = .;$TEXMF/fonts/cid//
+
+-- we always have one instance active
+
+resolvers.instance = resolvers.instance or nil -- the current one (slow access)
+local instance = resolvers.instance or nil -- the current one (fast access)
+
+function resolvers.newinstance()
+
+ -- store once, freeze and faster (once reset we can best use
+ -- instance.environment) maybe better have a register suffix
+ -- function
+
+ for k, v in next, suffixes do
+ for i=1,#v do
+ local vi = v[i]
+ if vi then
+ suffixmap[vi] = k
+ end
+ end
+ end
+
+ -- because vf searching is somewhat dangerous, we want to prevent
+ -- too liberal searching esp because we do a lookup on the current
+ -- path anyway; only tex (or any) is safe
+
+ for k, v in next, formats do
+ dangerous[k] = true
+ end
+ dangerous.tex = nil
+
+ -- the instance
+
+ local newinstance = {
+ rootpath = '',
+ treepath = '',
+ progname = 'context',
+ engine = 'luatex',
+ format = '',
+ environment = { },
+ variables = { },
+ expansions = { },
+ files = { },
+ remap = { },
+ configuration = { },
+ setup = { },
+ order = { },
+ found = { },
+ foundintrees = { },
+ kpsevars = { },
+ hashes = { },
+ cnffiles = { },
+ luafiles = { },
+ lists = { },
+ remember = true,
+ diskcache = true,
+ renewcache = false,
+ scandisk = true,
+ cachepath = nil,
+ loaderror = false,
+ sortdata = false,
+ savelists = true,
+ cleanuppaths = true,
+ allresults = false,
+ pattern = nil, -- lists
+ data = { }, -- only for loading
+ force_suffixes = true,
+ fakepaths = { },
+ }
+
+ local ne = newinstance.environment
+
+ for k,v in next, os.env do
+ ne[k] = resolvers.bare_variable(v)
+ end
+
+ return newinstance
+
+end
+
+function resolvers.setinstance(someinstance)
+ instance = someinstance
+ resolvers.instance = someinstance
+ return someinstance
+end
+
+function resolvers.reset()
+ return resolvers.setinstance(resolvers.newinstance())
+end
+
+local function reset_hashes()
+ instance.lists = { }
+ instance.found = { }
+end
+
+local function check_configuration() -- not yet ok, no time for debugging now
+ local ie, iv = instance.environment, instance.variables
+ local function fix(varname,default)
+ local proname = varname .. "." .. instance.progname or "crap"
+ local p, v = ie[proname], ie[varname] or iv[varname]
+ if not ((p and p ~= "") or (v and v ~= "")) then
+ iv[varname] = default -- or environment?
+ end
+ end
+ local name = os.name
+ if name == "windows" then
+ fix("OSFONTDIR", "c:/windows/fonts//")
+ elseif name == "macosx" then
+ fix("OSFONTDIR", "$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
+ else
+ -- bad luck
+ end
+ fix("LUAINPUTS" , ".;$TEXINPUTS;$TEXMFSCRIPTS") -- no progname, hm
+ -- this will go away some day
+ fix("FONTFEATURES", ".;$TEXMF/fonts/{data,fea}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS")
+ fix("FONTCIDMAPS" , ".;$TEXMF/fonts/{data,cid}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS")
+ --
+ fix("LUATEXLIBS" , ".;$TEXMF/luatex/lua//")
+end
+
+function resolvers.bare_variable(str) -- assumes str is a string
+ return (gsub(str,"\s*([\"\']?)(.+)%1\s*", "%2"))
+end
+
+function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
+ if n then
+ trackers.disable("resolvers.*")
+ trackers.enable("resolvers."..n)
+ end
+end
+
+resolvers.settrace(os.getenv("MTX_INPUT_TRACE"))
+
+function resolvers.osenv(key)
+ local ie = instance.environment
+ local value = ie[key]
+ if value == nil then
+ -- local e = os.getenv(key)
+ local e = os.env[key]
+ if e == nil then
+ -- value = "" -- false
+ else
+ value = resolvers.bare_variable(e)
+ end
+ ie[key] = value
+ end
+ return value or ""
+end
+
+function resolvers.env(key)
+ return instance.environment[key] or resolvers.osenv(key)
+end
+
+--
+
+local function expand_vars(lst) -- simple vars
+ local variables, env = instance.variables, resolvers.env
+ local function resolve(a)
+ return variables[a] or env(a)
+ end
+ for k=1,#lst do
+ lst[k] = gsub(lst[k],"%$([%a%d%_%-]+)",resolve)
+ end
+end
+
+local function expanded_var(var) -- simple vars
+ local function resolve(a)
+ return instance.variables[a] or resolvers.env(a)
+ end
+ return (gsub(var,"%$([%a%d%_%-]+)",resolve))
+end
+
+local function entry(entries,name)
+ if name and (name ~= "") then
+ name = gsub(name,'%$','')
+ local result = entries[name..'.'..instance.progname] or entries[name]
+ if result then
+ return result
+ else
+ result = resolvers.env(name)
+ if result then
+ instance.variables[name] = result
+ resolvers.expand_variables()
+ return instance.expansions[name] or ""
+ end
+ end
+ end
+ return ""
+end
+
+local function is_entry(entries,name)
+ if name and name ~= "" then
+ name = gsub(name,'%$','')
+ return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
+ else
+ return false
+ end
+end
+
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a{b,c}{d,e}f
+-- {a,b,c,d}
+-- {a,b,c/{p,q,r},d}
+-- {a,b,c/{p,q,r}/d/{x,y,z}//}
+-- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
+-- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
+-- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
+
+-- this one is better and faster, but it took me a while to realize
+-- that this kind of replacement is cleaner than messy parsing and
+-- fuzzy concatenating we can probably gain a bit with selectively
+-- applying lpeg, but experiments with lpeg parsing this proved not to
+-- work that well; the parsing is ok, but dealing with the resulting
+-- table is a pain because we need to work inside-out recursively
+
+local function do_first(a,b)
+ local t = { }
+ for s in gmatch(b,"[^,]+") do t[#t+1] = a .. s end
+ return "{" .. concat(t,",") .. "}"
+end
+
+local function do_second(a,b)
+ local t = { }
+ for s in gmatch(a,"[^,]+") do t[#t+1] = s .. b end
+ return "{" .. concat(t,",") .. "}"
+end
+
+local function do_both(a,b)
+ local t = { }
+ for sa in gmatch(a,"[^,]+") do
+ for sb in gmatch(b,"[^,]+") do
+ t[#t+1] = sa .. sb
+ end
+ end
+ return "{" .. concat(t,",") .. "}"
+end
+
+local function do_three(a,b,c)
+ return a .. b.. c
+end
+
+local function splitpathexpr(str, t, validate)
+ -- no need for further optimization as it is only called a
+ -- few times, we can use lpeg for the sub
+ if trace_expansions then
+ logs.report("fileio","expanding variable '%s'",str)
+ end
+ t = t or { }
+ str = gsub(str,",}",",@}")
+ str = gsub(str,"{,","{@,")
+ -- str = "@" .. str .. "@"
+ local ok, done
+ while true do
+ done = false
+ while true do
+ str, ok = gsub(str,"([^{},]+){([^{}]+)}",do_first)
+ if ok > 0 then done = true else break end
+ end
+ while true do
+ str, ok = gsub(str,"{([^{}]+)}([^{},]+)",do_second)
+ if ok > 0 then done = true else break end
+ end
+ while true do
+ str, ok = gsub(str,"{([^{}]+)}{([^{}]+)}",do_both)
+ if ok > 0 then done = true else break end
+ end
+ str, ok = gsub(str,"({[^{}]*){([^{}]+)}([^{}]*})",do_three)
+ if ok > 0 then done = true end
+ if not done then break end
+ end
+ str = gsub(str,"[{}]", "")
+ str = gsub(str,"@","")
+ if validate then
+ for s in gmatch(str,"[^,]+") do
+ s = validate(s)
+ if s then t[#t+1] = s end
+ end
+ else
+ for s in gmatch(str,"[^,]+") do
+ t[#t+1] = s
+ end
+ end
+ if trace_expansions then
+ for k=1,#t do
+ logs.report("fileio","% 4i: %s",k,t[k])
+ end
+ end
+ return t
+end
+
+local function expanded_path_from_list(pathlist) -- maybe not a list, just a path
+ -- a previous version fed back into pathlist
+ local newlist, ok = { }, false
+ for k=1,#pathlist do
+ if find(pathlist[k],"[{}]") then
+ ok = true
+ break
+ end
+ end
+ if ok then
+ local function validate(s)
+ s = file.collapse_path(s)
+ return s ~= "" and not find(s,dummy_path_expr) and s
+ end
+ for k=1,#pathlist do
+ splitpathexpr(pathlist[k],newlist,validate)
+ end
+ else
+ for k=1,#pathlist do
+ for p in gmatch(pathlist[k],"([^,]+)") do
+ p = file.collapse_path(p)
+ if p ~= "" then newlist[#newlist+1] = p end
+ end
+ end
+ end
+ return newlist
+end
+
+-- we follow a rather traditional approach:
+--
+-- (1) texmf.cnf given in TEXMFCNF
+-- (2) texmf.cnf searched in default variable
+--
+-- also we now follow the stupid route: if not set then just assume *one*
+-- cnf file under texmf (i.e. distribution)
+
+local args = environment and environment.original_arguments or arg -- this needs a cleanup
+
+resolvers.ownbin = resolvers.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
+resolvers.ownbin = gsub(resolvers.ownbin,"\\","/")
+
+function resolvers.getownpath()
+ local ownpath = resolvers.ownpath or os.selfdir
+ if not ownpath or ownpath == "" or ownpath == "unset" then
+ ownpath = args[-1] or arg[-1]
+ ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
+ if not ownpath or ownpath == "" then
+ ownpath = args[-0] or arg[-0]
+ ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
+ end
+ local binary = resolvers.ownbin
+ if not ownpath or ownpath == "" then
+ ownpath = ownpath and file.dirname(binary)
+ end
+ if not ownpath or ownpath == "" then
+ if os.binsuffix ~= "" then
+ binary = file.replacesuffix(binary,os.binsuffix)
+ end
+ for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
+ local b = file.join(p,binary)
+ if lfs.isfile(b) then
+ -- we assume that after changing to the path the currentdir function
+ -- resolves to the real location and use this side effect here; this
+ -- trick is needed because on the mac installations use symlinks in the
+ -- path instead of real locations
+ local olddir = lfs.currentdir()
+ if lfs.chdir(p) then
+ local pp = lfs.currentdir()
+ if trace_locating and p ~= pp then
+ logs.report("fileio","following symlink '%s' to '%s'",p,pp)
+ end
+ ownpath = pp
+ lfs.chdir(olddir)
+ else
+ if trace_locating then
+ logs.report("fileio","unable to check path '%s'",p)
+ end
+ ownpath = p
+ end
+ break
+ end
+ end
+ end
+ if not ownpath or ownpath == "" then
+ ownpath = "."
+ logs.report("fileio","forcing fallback ownpath .")
+ elseif trace_locating then
+ logs.report("fileio","using ownpath '%s'",ownpath)
+ end
+ end
+ resolvers.ownpath = ownpath
+ function resolvers.getownpath()
+ return resolvers.ownpath
+ end
+ return ownpath
+end
+
+local own_places = { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF" }
+
+local function identify_own()
+ local ownpath = resolvers.getownpath() or dir.current()
+ local ie = instance.environment
+ if ownpath then
+ if resolvers.env('SELFAUTOLOC') == "" then os.env['SELFAUTOLOC'] = file.collapse_path(ownpath) end
+ if resolvers.env('SELFAUTODIR') == "" then os.env['SELFAUTODIR'] = file.collapse_path(ownpath .. "/..") end
+ if resolvers.env('SELFAUTOPARENT') == "" then os.env['SELFAUTOPARENT'] = file.collapse_path(ownpath .. "/../..") end
+ else
+ logs.report("fileio","error: unable to locate ownpath")
+ os.exit()
+ end
+ if resolvers.env('TEXMFCNF') == "" then os.env['TEXMFCNF'] = resolvers.cnfdefault end
+ if resolvers.env('TEXOS') == "" then os.env['TEXOS'] = resolvers.env('SELFAUTODIR') end
+ if resolvers.env('TEXROOT') == "" then os.env['TEXROOT'] = resolvers.env('SELFAUTOPARENT') end
+ if trace_locating then
+ for i=1,#own_places do
+ local v = own_places[i]
+ logs.report("fileio","variable '%s' set to '%s'",v,resolvers.env(v) or "unknown")
+ end
+ end
+ identify_own = function() end
+end
+
+function resolvers.identify_cnf()
+ if #instance.cnffiles == 0 then
+ -- fallback
+ identify_own()
+ -- the real search
+ resolvers.expand_variables()
+ local t = resolvers.split_path(resolvers.env('TEXMFCNF'))
+ t = expanded_path_from_list(t)
+ expand_vars(t) -- redundant
+ local function locate(filename,list)
+ for i=1,#t do
+ local ti = t[i]
+ local texmfcnf = file.collapse_path(file.join(ti,filename))
+ if lfs.isfile(texmfcnf) then
+ list[#list+1] = texmfcnf
+ end
+ end
+ end
+ locate(resolvers.luaname,instance.luafiles)
+ locate(resolvers.cnfname,instance.cnffiles)
+ end
+end
+
+local function load_cnf_file(fname)
+ fname = resolvers.clean_path(fname)
+ local lname = file.replacesuffix(fname,'lua')
+ if lfs.isfile(lname) then
+ local dname = file.dirname(fname) -- fname ?
+ if not instance.configuration[dname] then
+ resolvers.load_data(dname,'configuration',lname and file.basename(lname))
+ instance.order[#instance.order+1] = instance.configuration[dname]
+ end
+ else
+ f = io.open(fname)
+ if f then
+ if trace_locating then
+ logs.report("fileio","loading configuration file %s", fname)
+ end
+ local line, data, n, k, v
+ local dname = file.dirname(fname)
+ if not instance.configuration[dname] then
+ instance.configuration[dname] = { }
+ instance.order[#instance.order+1] = instance.configuration[dname]
+ end
+ local data = instance.configuration[dname]
+ while true do
+ local line, n = f:read(), 0
+ if line then
+ while true do -- join lines
+ line, n = gsub(line,"\\%s*$", "")
+ if n > 0 then
+ line = line .. f:read()
+ else
+ break
+ end
+ end
+ if not find(line,"^[%%#]") then
+ local l = gsub(line,"%s*%%.*$","")
+ local k, v = match(l,"%s*(.-)%s*=%s*(.-)%s*$")
+ if k and v and not data[k] then
+ v = gsub(v,"[%%#].*",'')
+ data[k] = gsub(v,"~","$HOME")
+ instance.kpsevars[k] = true
+ end
+ end
+ else
+ break
+ end
+ end
+ f:close()
+ elseif trace_locating then
+ logs.report("fileio","skipping configuration file '%s'", fname)
+ end
+ end
+end
+
+local function collapse_cnf_data() -- potential optimization: pass start index (setup and configuration are shared)
+ local order = instance.order
+ for i=1,#order do
+ local c = order[i]
+ for k,v in next, c do
+ if not instance.variables[k] then
+ if instance.environment[k] then
+ instance.variables[k] = instance.environment[k]
+ else
+ instance.kpsevars[k] = true
+ instance.variables[k] = resolvers.bare_variable(v)
+ end
+ end
+ end
+ end
+end
+
+function resolvers.load_cnf()
+ local function loadoldconfigdata()
+ local cnffiles = instance.cnffiles
+ for i=1,#cnffiles do
+ load_cnf_file(cnffiles[i])
+ end
+ end
+ -- instance.cnffiles contain complete names now !
+ -- we still use a funny mix of cnf and new but soon
+ -- we will switch to lua exclusively as we only use
+ -- the file to collect the tree roots
+ if #instance.cnffiles == 0 then
+ if trace_locating then
+ logs.report("fileio","no cnf files found (TEXMFCNF may not be set/known)")
+ end
+ else
+ local cnffiles = instance.cnffiles
+ instance.rootpath = cnffiles[1]
+ for k=1,#cnffiles do
+ instance.cnffiles[k] = file.collapse_path(cnffiles[k])
+ end
+ for i=1,3 do
+ instance.rootpath = file.dirname(instance.rootpath)
+ end
+ instance.rootpath = file.collapse_path(instance.rootpath)
+ if instance.diskcache and not instance.renewcache then
+ resolvers.loadoldconfig(instance.cnffiles)
+ if instance.loaderror then
+ loadoldconfigdata()
+ resolvers.saveoldconfig()
+ end
+ else
+ loadoldconfigdata()
+ if instance.renewcache then
+ resolvers.saveoldconfig()
+ end
+ end
+ collapse_cnf_data()
+ end
+ check_configuration()
+end
+
+function resolvers.load_lua()
+ if #instance.luafiles == 0 then
+ -- yet harmless
+ else
+ instance.rootpath = instance.luafiles[1]
+ local luafiles = instance.luafiles
+ for k=1,#luafiles do
+ instance.luafiles[k] = file.collapse_path(luafiles[k])
+ end
+ for i=1,3 do
+ instance.rootpath = file.dirname(instance.rootpath)
+ end
+ instance.rootpath = file.collapse_path(instance.rootpath)
+ resolvers.loadnewconfig()
+ collapse_cnf_data()
+ end
+ check_configuration()
+end
+
+-- database loading
+
+function resolvers.load_hash()
+ resolvers.locatelists()
+ if instance.diskcache and not instance.renewcache then
+ resolvers.loadfiles()
+ if instance.loaderror then
+ resolvers.loadlists()
+ resolvers.savefiles()
+ end
+ else
+ resolvers.loadlists()
+ if instance.renewcache then
+ resolvers.savefiles()
+ end
+ end
+end
+
+function resolvers.append_hash(type,tag,name)
+ if trace_locating then
+ logs.report("fileio","hash '%s' appended",tag)
+ end
+ insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function resolvers.prepend_hash(type,tag,name)
+ if trace_locating then
+ logs.report("fileio","hash '%s' prepended",tag)
+ end
+ insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function resolvers.extend_texmf_var(specification) -- crap, we could better prepend the hash
+-- local t = resolvers.expanded_path_list('TEXMF') -- full expansion
+ local t = resolvers.split_path(resolvers.env('TEXMF'))
+ insert(t,1,specification)
+ local newspec = concat(t,";")
+ if instance.environment["TEXMF"] then
+ instance.environment["TEXMF"] = newspec
+ elseif instance.variables["TEXMF"] then
+ instance.variables["TEXMF"] = newspec
+ else
+ -- weird
+ end
+ resolvers.expand_variables()
+ reset_hashes()
+end
+
+-- locators
+
+function resolvers.locatelists()
+ local texmfpaths = resolvers.clean_path_list('TEXMF')
+ for i=1,#texmfpaths do
+ local path = texmfpaths[i]
+ if trace_locating then
+ logs.report("fileio","locating list of '%s'",path)
+ end
+ resolvers.locatedatabase(file.collapse_path(path))
+ end
+end
+
+function resolvers.locatedatabase(specification)
+ return resolvers.methodhandler('locators', specification)
+end
+
+function resolvers.locators.tex(specification)
+ if specification and specification ~= '' and lfs.isdir(specification) then
+ if trace_locating then
+ logs.report("fileio","tex locator '%s' found",specification)
+ end
+ resolvers.append_hash('file',specification,filename)
+ elseif trace_locating then
+ logs.report("fileio","tex locator '%s' not found",specification)
+ end
+end
+
+-- hashers
+
+function resolvers.hashdatabase(tag,name)
+ return resolvers.methodhandler('hashers',tag,name)
+end
+
+function resolvers.loadfiles()
+ instance.loaderror = false
+ instance.files = { }
+ if not instance.renewcache then
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ resolvers.hashdatabase(hash.tag,hash.name)
+ if instance.loaderror then break end
+ end
+ end
+end
+
+function resolvers.hashers.tex(tag,name)
+ resolvers.load_data(tag,'files')
+end
+
+-- generators:
+
+function resolvers.loadlists()
+ local hashes = instance.hashes
+ for i=1,#hashes do
+ resolvers.generatedatabase(hashes[i].tag)
+ end
+end
+
+function resolvers.generatedatabase(specification)
+ return resolvers.methodhandler('generators', specification)
+end
+
+-- starting with . or .. etc or funny char
+
+local weird = lpeg.P(".")^1 + lpeg.anywhere(lpeg.S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+
+--~ local l_forbidden = lpeg.S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
+--~ local l_confusing = lpeg.P(" ")
+--~ local l_character = lpeg.patterns.utf8
+--~ local l_dangerous = lpeg.P(".")
+
+--~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * lpeg.P(-1)
+--~ ----- l_normal = l_normal * lpeg.Cc(true) + lpeg.Cc(false)
+
+--~ local function test(str)
+--~ print(str,lpeg.match(l_normal,str))
+--~ end
+--~ test("ヒラギノ明朝 Pro W3")
+--~ test("..ヒラギノ明朝 Pro W3")
+--~ test(":ヒラギノ明朝 Pro W3;")
+--~ test("ヒラギノ明朝 /Pro W3;")
+--~ test("ヒラギノ明朝 Pro W3")
+
+function resolvers.generators.tex(specification)
+ local tag = specification
+ if trace_locating then
+ logs.report("fileio","scanning path '%s'",specification)
+ end
+ instance.files[tag] = { }
+ local files = instance.files[tag]
+ local n, m, r = 0, 0, 0
+ local spec = specification .. '/'
+ local attributes = lfs.attributes
+ local directory = lfs.dir
+ local function action(path)
+ local full
+ if path then
+ full = spec .. path .. '/'
+ else
+ full = spec
+ end
+ for name in directory(full) do
+ if not lpegmatch(weird,name) then
+ -- if lpegmatch(l_normal,name) then
+ local mode = attributes(full..name,'mode')
+ if mode == 'file' then
+ if path then
+ n = n + 1
+ local f = files[name]
+ if f then
+ if type(f) == 'string' then
+ files[name] = { f, path }
+ else
+ f[#f+1] = path
+ end
+ else -- probably unique anyway
+ files[name] = path
+ local lower = lower(name)
+ if name ~= lower then
+ files["remap:"..lower] = name
+ r = r + 1
+ end
+ end
+ end
+ elseif mode == 'directory' then
+ m = m + 1
+ if path then
+ action(path..'/'..name)
+ else
+ action(name)
+ end
+ end
+ end
+ end
+ end
+ action()
+ if trace_locating then
+ logs.report("fileio","%s files found on %s directories with %s uppercase remappings",n,m,r)
+ end
+end
+
+-- savers, todo
+
+function resolvers.savefiles()
+ resolvers.save_data('files')
+end
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+--~ local checkedsplit = string.checkedsplit
+
+local cache = { }
+
+local splitter = lpeg.Ct(lpeg.splitat(lpeg.S(os.type == "windows" and ";" or ":;")))
+
+local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
+ local found = cache[str]
+ if not found then
+ if str == "" then
+ found = { }
+ else
+ str = gsub(str,"\\","/")
+--~ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
+local split = lpegmatch(splitter,str)
+ found = { }
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ found[#found+1] = s
+ end
+ end
+ if trace_expansions then
+ logs.report("fileio","splitting path specification '%s'",str)
+ for k=1,#found do
+ logs.report("fileio","% 4i: %s",k,found[k])
+ end
+ end
+ cache[str] = found
+ end
+ end
+ return found
+end
+
+resolvers.split_kpse_path = split_kpse_path
+
+function resolvers.splitconfig()
+ for i=1,#instance do
+ local c = instance[i]
+ for k,v in next, c do
+ if type(v) == 'string' then
+ local t = split_kpse_path(v)
+ if #t > 1 then
+ c[k] = t
+ end
+ end
+ end
+ end
+end
+
+function resolvers.joinconfig()
+ local order = instance.order
+ for i=1,#order do
+ local c = order[i]
+ for k,v in next, c do -- indexed?
+ if type(v) == 'table' then
+ c[k] = file.join_path(v)
+ end
+ end
+ end
+end
+
+function resolvers.split_path(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return split_kpse_path(str)
+ end
+end
+
+function resolvers.join_path(str)
+ if type(str) == 'table' then
+ return file.join_path(str)
+ else
+ return str
+ end
+end
+
+function resolvers.splitexpansions()
+ local ie = instance.expansions
+ for k,v in next, ie do
+ local t, h, p = { }, { }, split_kpse_path(v)
+ for kk=1,#p do
+ local vv = p[kk]
+ if vv ~= "" and not h[vv] then
+ t[#t+1] = vv
+ h[vv] = true
+ end
+ end
+ if #t > 1 then
+ ie[k] = t
+ else
+ ie[k] = t[1]
+ end
+ end
+end
+
+-- end of split/join code
+
+function resolvers.saveoldconfig()
+ resolvers.splitconfig()
+ resolvers.save_data('configuration')
+ resolvers.joinconfig()
+end
+
+resolvers.configbanner = [[
+-- This is a Luatex configuration file created by 'luatools.lua' or
+-- 'luatex.exe' directly. For comment, suggestions and questions you can
+-- contact the ConTeXt Development Team. This configuration file is
+-- not copyrighted. [HH & TH]
+]]
+
+function resolvers.serialize(files)
+ -- This version is somewhat optimized for the kind of
+ -- tables that we deal with, so it's much faster than
+ -- the generic serializer. This makes sense because
+ -- luatools and mtxtools are called frequently. Okay,
+ -- we pay a small price for properly tabbed tables.
+ local t = { }
+ local function dump(k,v,m) -- could be moved inline
+ if type(v) == 'string' then
+ return m .. "['" .. k .. "']='" .. v .. "',"
+ elseif #v == 1 then
+ return m .. "['" .. k .. "']='" .. v[1] .. "',"
+ else
+ return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
+ end
+ end
+ t[#t+1] = "return {"
+ if instance.sortdata then
+ local sortedfiles = sortedkeys(files)
+ for i=1,#sortedfiles do
+ local k = sortedfiles[i]
+ local fk = files[k]
+ if type(fk) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ local sortedfk = sortedkeys(fk)
+ for j=1,#sortedfk do
+ local kk = sortedfk[j]
+ t[#t+1] = dump(kk,fk[kk],"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,fk,"\t")
+ end
+ end
+ else
+ for k, v in next, files do
+ if type(v) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ for kk,vv in next, v do
+ t[#t+1] = dump(kk,vv,"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,v,"\t")
+ end
+ end
+ end
+ t[#t+1] = "}"
+ return concat(t,"\n")
+end
+
+local data_state = { }
+
+function resolvers.data_state()
+ return data_state or { }
+end
+
+function resolvers.save_data(dataname, makename) -- untested without cache overload
+ for cachename, files in next, instance[dataname] do
+ local name = (makename or file.join)(cachename,dataname)
+ local luaname, lucname = name .. ".lua", name .. ".luc"
+ if trace_locating then
+ logs.report("fileio","preparing '%s' for '%s'",dataname,cachename)
+ end
+ for k, v in next, files do
+ if type(v) == "table" and #v == 1 then
+ files[k] = v[1]
+ end
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = resolvers.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = files,
+ uuid = os.uuid(),
+ }
+ local ok = io.savedata(luaname,resolvers.serialize(data))
+ if ok then
+ if trace_locating then
+ logs.report("fileio","'%s' saved in '%s'",dataname,luaname)
+ end
+ if utils.lua.compile(luaname,lucname,false,true) then -- no cleanup but strip
+ if trace_locating then
+ logs.report("fileio","'%s' compiled to '%s'",dataname,lucname)
+ end
+ else
+ if trace_locating then
+ logs.report("fileio","compiling failed for '%s', deleting file '%s'",dataname,lucname)
+ end
+ os.remove(lucname)
+ end
+ elseif trace_locating then
+ logs.report("fileio","unable to save '%s' in '%s' (access error)",dataname,luaname)
+ end
+ end
+end
+
+function resolvers.load_data(pathname,dataname,filename,makename) -- untested without cache overload
+ filename = ((not filename or (filename == "")) and dataname) or filename
+ filename = (makename and makename(dataname,filename)) or file.join(pathname,filename)
+ local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
+ if blob then
+ local data = blob()
+ if data and data.content and data.type == dataname and data.version == resolvers.cacheversion then
+ data_state[#data_state+1] = data.uuid
+ if trace_locating then
+ logs.report("fileio","loading '%s' for '%s' from '%s'",dataname,pathname,filename)
+ end
+ instance[dataname][pathname] = data.content
+ else
+ if trace_locating then
+ logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
+ end
+ instance[dataname][pathname] = { }
+ instance.loaderror = true
+ end
+ elseif trace_locating then
+ logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
+ end
+end
+
+-- some day i'll use the nested approach, but not yet (actually we even drop
+-- engine/progname support since we have only luatex now)
+--
+-- first texmfcnf.lua files are located, next the cached texmf.cnf files
+--
+-- return {
+-- TEXMFBOGUS = 'effe checken of dit werkt',
+-- }
+
+function resolvers.resetconfig()
+ identify_own()
+ instance.configuration, instance.setup, instance.order, instance.loaderror = { }, { }, { }, false
+end
+
+function resolvers.loadnewconfig()
+ local luafiles = instance.luafiles
+ for i=1,#luafiles do
+ local cnf = luafiles[i]
+ local pathname = file.dirname(cnf)
+ local filename = file.join(pathname,resolvers.luaname)
+ local blob = loadfile(filename)
+ if blob then
+ local data = blob()
+ if data then
+ if trace_locating then
+ logs.report("fileio","loading configuration file '%s'",filename)
+ end
+ if true then
+ -- flatten to variable.progname
+ local t = { }
+ for k, v in next, data do -- v = progname
+ if type(v) == "string" then
+ t[k] = v
+ else
+ for kk, vv in next, v do -- vv = variable
+ if type(vv) == "string" then
+ t[vv.."."..v] = kk
+ end
+ end
+ end
+ end
+ instance['setup'][pathname] = t
+ else
+ instance['setup'][pathname] = data
+ end
+ else
+ if trace_locating then
+ logs.report("fileio","skipping configuration file '%s'",filename)
+ end
+ instance['setup'][pathname] = { }
+ instance.loaderror = true
+ end
+ elseif trace_locating then
+ logs.report("fileio","skipping configuration file '%s'",filename)
+ end
+ instance.order[#instance.order+1] = instance.setup[pathname]
+ if instance.loaderror then break end
+ end
+end
+
+function resolvers.loadoldconfig()
+ if not instance.renewcache then
+ local cnffiles = instance.cnffiles
+ for i=1,#cnffiles do
+ local cnf = cnffiles[i]
+ local dname = file.dirname(cnf)
+ resolvers.load_data(dname,'configuration')
+ instance.order[#instance.order+1] = instance.configuration[dname]
+ if instance.loaderror then break end
+ end
+ end
+ resolvers.joinconfig()
+end
+
+function resolvers.expand_variables()
+ local expansions, environment, variables = { }, instance.environment, instance.variables
+ local env = resolvers.env
+ instance.expansions = expansions
+ if instance.engine ~= "" then environment['engine'] = instance.engine end
+ if instance.progname ~= "" then environment['progname'] = instance.progname end
+ for k,v in next, environment do
+ local a, b = match(k,"^(%a+)%_(.*)%s*$")
+ if a and b then
+ expansions[a..'.'..b] = v
+ else
+ expansions[k] = v
+ end
+ end
+ for k,v in next, environment do -- move environment to expansions
+ if not expansions[k] then expansions[k] = v end
+ end
+ for k,v in next, variables do -- move variables to expansions
+ if not expansions[k] then expansions[k] = v end
+ end
+ local busy = false
+ local function resolve(a)
+ busy = true
+ return expansions[a] or env(a)
+ end
+ while true do
+ busy = false
+ for k,v in next, expansions do
+ local s, n = gsub(v,"%$([%a%d%_%-]+)",resolve)
+ local s, m = gsub(s,"%$%{([%a%d%_%-]+)%}",resolve)
+ if n > 0 or m > 0 then
+ expansions[k]= s
+ end
+ end
+ if not busy then break end
+ end
+ for k,v in next, expansions do
+ expansions[k] = gsub(v,"\\", '/')
+ end
+end
+
+function resolvers.variable(name)
+ return entry(instance.variables,name)
+end
+
+function resolvers.expansion(name)
+ return entry(instance.expansions,name)
+end
+
+function resolvers.is_variable(name)
+ return is_entry(instance.variables,name)
+end
+
+function resolvers.is_expansion(name)
+ return is_entry(instance.expansions,name)
+end
+
+function resolvers.unexpanded_path_list(str)
+ local pth = resolvers.variable(str)
+ local lst = resolvers.split_path(pth)
+ return expanded_path_from_list(lst)
+end
+
+function resolvers.unexpanded_path(str)
+ return file.join_path(resolvers.unexpanded_path_list(str))
+end
+
+do -- no longer needed
+
+ local done = { }
+
+ function resolvers.reset_extra_path()
+ local ep = instance.extra_paths
+ if not ep then
+ ep, done = { }, { }
+ instance.extra_paths = ep
+ elseif #ep > 0 then
+ instance.lists, done = { }, { }
+ end
+ end
+
+ function resolvers.register_extra_path(paths,subpaths)
+ local ep = instance.extra_paths or { }
+ local n = #ep
+ if paths and paths ~= "" then
+ if subpaths and subpaths ~= "" then
+ for p in gmatch(paths,"[^,]+") do
+ -- we gmatch each step again, not that fast, but used seldom
+ for s in gmatch(subpaths,"[^,]+") do
+ local ps = p .. "/" .. s
+ if not done[ps] then
+ ep[#ep+1] = resolvers.clean_path(ps)
+ done[ps] = true
+ end
+ end
+ end
+ else
+ for p in gmatch(paths,"[^,]+") do
+ if not done[p] then
+ ep[#ep+1] = resolvers.clean_path(p)
+ done[p] = true
+ end
+ end
+ end
+ elseif subpaths and subpaths ~= "" then
+ for i=1,n do
+ -- we gmatch each step again, not that fast, but used seldom
+ for s in gmatch(subpaths,"[^,]+") do
+ local ps = ep[i] .. "/" .. s
+ if not done[ps] then
+ ep[#ep+1] = resolvers.clean_path(ps)
+ done[ps] = true
+ end
+ end
+ end
+ end
+ if #ep > 0 then
+ instance.extra_paths = ep -- register paths
+ end
+ if #ep > n then
+ instance.lists = { } -- erase the cache
+ end
+ end
+
+end
+
+local function made_list(instance,list)
+ local ep = instance.extra_paths
+ if not ep or #ep == 0 then
+ return list
+ else
+ local done, new = { }, { }
+ -- honour . .. ../.. but only when at the start
+ for k=1,#list do
+ local v = list[k]
+ if not done[v] then
+ if find(v,"^[%.%/]$") then
+ done[v] = true
+ new[#new+1] = v
+ else
+ break
+ end
+ end
+ end
+ -- first the extra paths
+ for k=1,#ep do
+ local v = ep[k]
+ if not done[v] then
+ done[v] = true
+ new[#new+1] = v
+ end
+ end
+ -- next the formal paths
+ for k=1,#list do
+ local v = list[k]
+ if not done[v] then
+ done[v] = true
+ new[#new+1] = v
+ end
+ end
+ return new
+ end
+end
+
+function resolvers.clean_path_list(str)
+ local t = resolvers.expanded_path_list(str)
+ if t then
+ for i=1,#t do
+ t[i] = file.collapse_path(resolvers.clean_path(t[i]))
+ end
+ end
+ return t
+end
+
+function resolvers.expand_path(str)
+ return file.join_path(resolvers.expanded_path_list(str))
+end
+
+function resolvers.expanded_path_list(str)
+ if not str then
+ return ep or { } -- ep ?
+ elseif instance.savelists then
+ -- engine+progname hash
+ str = gsub(str,"%$","")
+ if not instance.lists[str] then -- cached
+ local lst = made_list(instance,resolvers.split_path(resolvers.expansion(str)))
+ instance.lists[str] = expanded_path_from_list(lst)
+ end
+ return instance.lists[str]
+ else
+ local lst = resolvers.split_path(resolvers.expansion(str))
+ return made_list(instance,expanded_path_from_list(lst))
+ end
+end
+
+function resolvers.expanded_path_list_from_var(str) -- brrr
+ local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$",""))
+ if tmp ~= "" then
+ return resolvers.expanded_path_list(tmp)
+ else
+ return resolvers.expanded_path_list(str)
+ end
+end
+
+function resolvers.expand_path_from_var(str)
+ return file.join_path(resolvers.expanded_path_list_from_var(str))
+end
+
+function resolvers.format_of_var(str)
+ return formats[str] or formats[alternatives[str]] or ''
+end
+function resolvers.format_of_suffix(str)
+ return suffixmap[file.extname(str)] or 'tex'
+end
+
+function resolvers.variable_of_format(str)
+ return formats[str] or formats[alternatives[str]] or ''
+end
+
+function resolvers.var_of_format_or_suffix(str)
+ local v = formats[str]
+ if v then
+ return v
+ end
+ v = formats[alternatives[str]]
+ if v then
+ return v
+ end
+ v = suffixmap[file.extname(str)]
+ if v then
+ return formats[isf]
+ end
+ return ''
+end
+
+function resolvers.expand_braces(str) -- output variable and brace expansion of STRING
+ local ori = resolvers.variable(str)
+ local pth = expanded_path_from_list(resolvers.split_path(ori))
+ return file.join_path(pth)
+end
+
+resolvers.isreadable = { }
+
+function resolvers.isreadable.file(name)
+ local readable = lfs.isfile(name) -- brrr
+ if trace_detail then
+ if readable then
+ logs.report("fileio","file '%s' is readable",name)
+ else
+ logs.report("fileio","file '%s' is not readable", name)
+ end
+ end
+ return readable
+end
+
+resolvers.isreadable.tex = resolvers.isreadable.file
+
+-- name
+-- name/name
+
+local function collect_files(names)
+ local filelist = { }
+ for k=1,#names do
+ local fname = names[k]
+ if trace_detail then
+ logs.report("fileio","checking name '%s'",fname)
+ end
+ local bname = file.basename(fname)
+ local dname = file.dirname(fname)
+ if dname == "" or find(dname,"^%.") then
+ dname = false
+ else
+ dname = "/" .. dname .. "$"
+ end
+ local hashes = instance.hashes
+ for h=1,#hashes do
+ local hash = hashes[h]
+ local blobpath = hash.tag
+ local files = blobpath and instance.files[blobpath]
+ if files then
+ if trace_detail then
+ logs.report("fileio","deep checking '%s' (%s)",blobpath,bname)
+ end
+ local blobfile = files[bname]
+ if not blobfile then
+ local rname = "remap:"..bname
+ blobfile = files[rname]
+ if blobfile then
+ bname = files[rname]
+ blobfile = files[bname]
+ end
+ end
+ if blobfile then
+ if type(blobfile) == 'string' then
+ if not dname or find(blobfile,dname) then
+ filelist[#filelist+1] = {
+ hash.type,
+ file.join(blobpath,blobfile,bname), -- search
+ resolvers.concatinators[hash.type](blobpath,blobfile,bname) -- result
+ }
+ end
+ else
+ for kk=1,#blobfile do
+ local vv = blobfile[kk]
+ if not dname or find(vv,dname) then
+ filelist[#filelist+1] = {
+ hash.type,
+ file.join(blobpath,vv,bname), -- search
+ resolvers.concatinators[hash.type](blobpath,vv,bname) -- result
+ }
+ end
+ end
+ end
+ end
+ elseif trace_locating then
+ logs.report("fileio","no match in '%s' (%s)",blobpath,bname)
+ end
+ end
+ end
+ if #filelist > 0 then
+ return filelist
+ else
+ return nil
+ end
+end
+
+function resolvers.suffix_of_format(str)
+ if suffixes[str] then
+ return suffixes[str][1]
+ else
+ return ""
+ end
+end
+
+function resolvers.suffixes_of_format(str)
+ if suffixes[str] then
+ return suffixes[str]
+ else
+ return {}
+ end
+end
+
+function resolvers.register_in_trees(name)
+ if not find(name,"^%.") then
+ instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
+ end
+end
+
+-- split the next one up for readability (bu this module needs a cleanup anyway)
+
+local function can_be_dir(name) -- can become local
+ local fakepaths = instance.fakepaths
+ if not fakepaths[name] then
+ if lfs.isdir(name) then
+ fakepaths[name] = 1 -- directory
+ else
+ fakepaths[name] = 2 -- no directory
+ end
+ end
+ return (fakepaths[name] == 1)
+end
+
+local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
+ local result = collected or { }
+ local stamp = nil
+ filename = file.collapse_path(filename)
+ -- speed up / beware: format problem
+ if instance.remember then
+ stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.found[stamp] then
+ if trace_locating then
+ logs.report("fileio","remembering file '%s'",filename)
+ end
+ return instance.found[stamp]
+ end
+ end
+ if not dangerous[instance.format or "?"] then
+ if resolvers.isreadable.file(filename) then
+ if trace_detail then
+ logs.report("fileio","file '%s' found directly",filename)
+ end
+ instance.found[stamp] = { filename }
+ return { filename }
+ end
+ end
+ if find(filename,'%*') then
+ if trace_locating then
+ logs.report("fileio","checking wildcard '%s'", filename)
+ end
+ result = resolvers.find_wildcard_files(filename)
+ elseif file.is_qualified_path(filename) then
+ if resolvers.isreadable.file(filename) then
+ if trace_locating then
+ logs.report("fileio","qualified name '%s'", filename)
+ end
+ result = { filename }
+ else
+ local forcedname, ok, suffix = "", false, file.extname(filename)
+ if suffix == "" then -- why
+ if instance.format == "" then
+ forcedname = filename .. ".tex"
+ if resolvers.isreadable.file(forcedname) then
+ if trace_locating then
+ logs.report("fileio","no suffix, forcing standard filetype 'tex'")
+ end
+ result, ok = { forcedname }, true
+ end
+ else
+ local suffixes = resolvers.suffixes_of_format(instance.format)
+ for _, s in next, suffixes do
+ forcedname = filename .. "." .. s
+ if resolvers.isreadable.file(forcedname) then
+ if trace_locating then
+ logs.report("fileio","no suffix, forcing format filetype '%s'", s)
+ end
+ result, ok = { forcedname }, true
+ break
+ end
+ end
+ end
+ end
+ if not ok and suffix ~= "" then
+ -- try to find in tree (no suffix manipulation), here we search for the
+ -- matching last part of the name
+ local basename = file.basename(filename)
+ local pattern = gsub(filename .. "$","([%.%-])","%%%1")
+ local savedformat = instance.format
+ local format = savedformat or ""
+ if format == "" then
+ instance.format = resolvers.format_of_suffix(suffix)
+ end
+ if not format then
+ instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
+ end
+ --
+ if basename ~= filename then
+ local resolved = collect_instance_files(basename)
+ if #result == 0 then
+ local lowered = lower(basename)
+ if filename ~= lowered then
+ resolved = collect_instance_files(lowered)
+ end
+ end
+ resolvers.format = savedformat
+ --
+ for r=1,#resolved do
+ local rr = resolved[r]
+ if find(rr,pattern) then
+ result[#result+1], ok = rr, true
+ end
+ end
+ end
+ -- a real wildcard:
+ --
+ -- if not ok then
+ -- local filelist = collect_files({basename})
+ -- for f=1,#filelist do
+ -- local ff = filelist[f][3] or ""
+ -- if find(ff,pattern) then
+ -- result[#result+1], ok = ff, true
+ -- end
+ -- end
+ -- end
+ end
+ if not ok and trace_locating then
+ logs.report("fileio","qualified name '%s'", filename)
+ end
+ end
+ else
+ -- search spec
+ local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
+ if ext == "" then
+ if not instance.force_suffixes then
+ wantedfiles[#wantedfiles+1] = filename
+ end
+ else
+ wantedfiles[#wantedfiles+1] = filename
+ end
+ if instance.format == "" then
+ if ext == "" then
+ local forcedname = filename .. '.tex'
+ wantedfiles[#wantedfiles+1] = forcedname
+ filetype = resolvers.format_of_suffix(forcedname)
+ if trace_locating then
+ logs.report("fileio","forcing filetype '%s'",filetype)
+ end
+ else
+ filetype = resolvers.format_of_suffix(filename)
+ if trace_locating then
+ logs.report("fileio","using suffix based filetype '%s'",filetype)
+ end
+ end
+ else
+ if ext == "" then
+ local suffixes = resolvers.suffixes_of_format(instance.format)
+ for _, s in next, suffixes do
+ wantedfiles[#wantedfiles+1] = filename .. "." .. s
+ end
+ end
+ filetype = instance.format
+ if trace_locating then
+ logs.report("fileio","using given filetype '%s'",filetype)
+ end
+ end
+ local typespec = resolvers.variable_of_format(filetype)
+ local pathlist = resolvers.expanded_path_list(typespec)
+ if not pathlist or #pathlist == 0 then
+ -- no pathlist, access check only / todo == wildcard
+ if trace_detail then
+ logs.report("fileio","checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
+ end
+ for k=1,#wantedfiles do
+ local fname = wantedfiles[k]
+ if fname and resolvers.isreadable.file(fname) then
+ filename, done = fname, true
+ result[#result+1] = file.join('.',fname)
+ break
+ end
+ end
+ -- this is actually 'other text files' or 'any' or 'whatever'
+ local filelist = collect_files(wantedfiles)
+ local fl = filelist and filelist[1]
+ if fl then
+ filename = fl[3]
+ result[#result+1] = filename
+ done = true
+ end
+ else
+ -- list search
+ local filelist = collect_files(wantedfiles)
+ local dirlist = { }
+ if filelist then
+ for i=1,#filelist do
+ dirlist[i] = file.dirname(filelist[i][2]) .. "/"
+ end
+ end
+ if trace_detail then
+ logs.report("fileio","checking filename '%s'",filename)
+ end
+ -- a bit messy ... esp the doscan setting here
+ local doscan
+ for k=1,#pathlist do
+ local path = pathlist[k]
+ if find(path,"^!!") then doscan = false else doscan = true end
+ local pathname = gsub(path,"^!+", '')
+ done = false
+ -- using file list
+ if filelist then
+ local expression
+ -- compare list entries with permitted pattern -- /xx /xx//
+ if not find(pathname,"/$") then
+ expression = pathname .. "/"
+ else
+ expression = pathname
+ end
+ expression = gsub(expression,"([%-%.])","%%%1") -- this also influences
+ expression = gsub(expression,"//+$", '/.*') -- later usage of pathname
+ expression = gsub(expression,"//", '/.-/') -- not ok for /// but harmless
+ expression = "^" .. expression .. "$"
+ if trace_detail then
+ logs.report("fileio","using pattern '%s' for path '%s'",expression,pathname)
+ end
+ for k=1,#filelist do
+ local fl = filelist[k]
+ local f = fl[2]
+ local d = dirlist[k]
+ if find(d,expression) then
+ --- todo, test for readable
+ result[#result+1] = fl[3]
+ resolvers.register_in_trees(f) -- for tracing used files
+ done = true
+ if instance.allresults then
+ if trace_detail then
+ logs.report("fileio","match in hash for file '%s' on path '%s', continue scanning",f,d)
+ end
+ else
+ if trace_detail then
+ logs.report("fileio","match in hash for file '%s' on path '%s', quit scanning",f,d)
+ end
+ break
+ end
+ elseif trace_detail then
+ logs.report("fileio","no match in hash for file '%s' on path '%s'",f,d)
+ end
+ end
+ end
+ if not done and doscan then
+ -- check if on disk / unchecked / does not work at all / also zips
+ if resolvers.splitmethod(pathname).scheme == 'file' then -- ?
+ local pname = gsub(pathname,"%.%*$",'')
+ if not find(pname,"%*") then
+ local ppname = gsub(pname,"/+$","")
+ if can_be_dir(ppname) then
+ for k=1,#wantedfiles do
+ local w = wantedfiles[k]
+ local fname = file.join(ppname,w)
+ if resolvers.isreadable.file(fname) then
+ if trace_detail then
+ logs.report("fileio","found '%s' by scanning",fname)
+ end
+ result[#result+1] = fname
+ done = true
+ if not instance.allresults then break end
+ end
+ end
+ else
+ -- no access needed for non existing path, speedup (esp in large tree with lots of fake)
+ end
+ end
+ end
+ end
+ if not done and doscan then
+ -- todo: slow path scanning
+ end
+ if done and not instance.allresults then break end
+ end
+ end
+ end
+ for k=1,#result do
+ result[k] = file.collapse_path(result[k])
+ end
+ if instance.remember then
+ instance.found[stamp] = result
+ end
+ return result
+end
+
+if not resolvers.concatinators then resolvers.concatinators = { } end
+
+resolvers.concatinators.tex = file.join
+resolvers.concatinators.file = resolvers.concatinators.tex
+
+function resolvers.find_files(filename,filetype,mustexist)
+ if type(mustexist) == boolean then
+ -- all set
+ elseif type(filetype) == 'boolean' then
+ filetype, mustexist = nil, false
+ elseif type(filetype) ~= 'string' then
+ filetype, mustexist = nil, false
+ end
+ instance.format = filetype or ''
+ local result = collect_instance_files(filename)
+ if #result == 0 then
+ local lowered = lower(filename)
+ if filename ~= lowered then
+ return collect_instance_files(lowered)
+ end
+ end
+ instance.format = ''
+ return result
+end
+
+function resolvers.find_file(filename,filetype,mustexist)
+ return (resolvers.find_files(filename,filetype,mustexist)[1] or "")
+end
+
+function resolvers.find_given_files(filename)
+ local bname, result = file.basename(filename), { }
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ local files = instance.files[hash.tag] or { }
+ local blist = files[bname]
+ if not blist then
+ local rname = "remap:"..bname
+ blist = files[rname]
+ if blist then
+ bname = files[rname]
+ blist = files[bname]
+ end
+ end
+ if blist then
+ if type(blist) == 'string' then
+ result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
+ if not instance.allresults then break end
+ else
+ for kk=1,#blist do
+ local vv = blist[kk]
+ result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
+ if not instance.allresults then break end
+ end
+ end
+ end
+ end
+ return result
+end
+
+function resolvers.find_given_file(filename)
+ return (resolvers.find_given_files(filename)[1] or "")
+end
+
+local function doit(path,blist,bname,tag,kind,result,allresults)
+ local done = false
+ if blist and kind then
+ if type(blist) == 'string' then
+ -- make function and share code
+ if find(lower(blist),path) then
+ result[#result+1] = resolvers.concatinators[kind](tag,blist,bname) or ""
+ done = true
+ end
+ else
+ for kk=1,#blist do
+ local vv = blist[kk]
+ if find(lower(vv),path) then
+ result[#result+1] = resolvers.concatinators[kind](tag,vv,bname) or ""
+ done = true
+ if not allresults then break end
+ end
+ end
+ end
+ end
+ return done
+end
+
+function resolvers.find_wildcard_files(filename) -- todo: remap:
+ local result = { }
+ local bname, dname = file.basename(filename), file.dirname(filename)
+ local path = gsub(dname,"^*/","")
+ path = gsub(path,"*",".*")
+ path = gsub(path,"-","%%-")
+ if dname == "" then
+ path = ".*"
+ end
+ local name = bname
+ name = gsub(name,"*",".*")
+ name = gsub(name,"-","%%-")
+ path = lower(path)
+ name = lower(name)
+ local files, allresults, done = instance.files, instance.allresults, false
+ if find(name,"%*") then
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ local tag, kind = hash.tag, hash.type
+ for kk, hh in next, files[hash.tag] do
+ if not find(kk,"^remap:") then
+ if find(lower(kk),name) then
+ if doit(path,hh,kk,tag,kind,result,allresults) then done = true end
+ if done and not allresults then break end
+ end
+ end
+ end
+ end
+ else
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ local tag, kind = hash.tag, hash.type
+ if doit(path,files[tag][bname],bname,tag,kind,result,allresults) then done = true end
+ 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
+
+function resolvers.find_wildcard_file(filename)
+ return (resolvers.find_wildcard_files(filename)[1] or "")
+end
+
+-- main user functions
+
+function resolvers.automount()
+ -- implemented later
+end
+
+function resolvers.load(option)
+ statistics.starttiming(instance)
+ resolvers.resetconfig()
+ resolvers.identify_cnf()
+ resolvers.load_lua() -- will become the new method
+ resolvers.expand_variables()
+ resolvers.load_cnf() -- will be skipped when we have a lua file
+ resolvers.expand_variables()
+ if option ~= "nofiles" then
+ resolvers.load_hash()
+ resolvers.automount()
+ end
+ statistics.stoptiming(instance)
+end
+
+function resolvers.for_files(command, files, filetype, mustexist)
+ if files and #files > 0 then
+ local function report(str)
+ if trace_locating then
+ logs.report("fileio",str) -- has already verbose
+ else
+ print(str)
+ end
+ end
+ if trace_locating then
+ report('') -- ?
+ end
+ for f=1,#files do
+ local file = files[f]
+ local result = command(file,filetype,mustexist)
+ if type(result) == 'string' then
+ report(result)
+ else
+ for i=1,#result do
+ report(result[i]) -- could be unpack
+ end
+ end
+ end
+ end
+end
+
+-- strtab
+
+resolvers.var_value = resolvers.variable -- output the value of variable $STRING.
+resolvers.expand_var = resolvers.expansion -- output variable expansion of STRING.
+
+function resolvers.show_path(str) -- output search path for file type NAME
+ return file.join_path(resolvers.expanded_path_list(resolvers.format_of_var(str)))
+end
+
+-- resolvers.find_file(filename)
+-- resolvers.find_file(filename, filetype, mustexist)
+-- resolvers.find_file(filename, mustexist)
+-- resolvers.find_file(filename, filetype)
+
+function resolvers.register_file(files, name, path)
+ if files[name] then
+ if type(files[name]) == 'string' then
+ files[name] = { files[name], path }
+ else
+ files[name] = path
+ end
+ else
+ files[name] = path
+ end
+end
+
+function resolvers.splitmethod(filename)
+ if not filename then
+ return { } -- safeguard
+ elseif type(filename) == "table" then
+ return filename -- already split
+ elseif not find(filename,"://") then
+ return { scheme="file", path = filename, original=filename } -- quick hack
+ else
+ return url.hashed(filename)
+ end
+end
+
+function table.sequenced(t,sep) -- temp here
+ local s = { }
+ for k, v in next, t do -- indexed?
+ s[#s+1] = k .. "=" .. tostring(v)
+ end
+ return concat(s, sep or " | ")
+end
+
+function resolvers.methodhandler(what, filename, filetype) -- ...
+ filename = file.collapse_path(filename)
+ local specification = (type(filename) == "string" and resolvers.splitmethod(filename)) or filename -- no or { }, let it bomb
+ local scheme = specification.scheme
+ if resolvers[what][scheme] then
+ if trace_locating then
+ logs.report("fileio","handler '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
+ end
+ return resolvers[what][scheme](filename,filetype) -- todo: specification
+ else
+ return resolvers[what].tex(filename,filetype) -- todo: specification
+ end
+end
+
+function resolvers.clean_path(str)
+ if str then
+ str = gsub(str,"\\","/")
+ str = gsub(str,"^!+","")
+ str = gsub(str,"^~",resolvers.homedir)
+ return str
+ else
+ return nil
+ end
+end
+
+function resolvers.do_with_path(name,func)
+ local pathlist = resolvers.expanded_path_list(name)
+ for i=1,#pathlist do
+ func("^"..resolvers.clean_path(pathlist[i]))
+ end
+end
+
+function resolvers.do_with_var(name,func)
+ func(expanded_var(name))
+end
+
+function resolvers.with_files(pattern,handle)
+ local hashes = instance.hashes
+ for i=1,#hashes do
+ local hash = hashes[i]
+ local blobpath = hash.tag
+ local blobtype = hash.type
+ if blobpath then
+ local files = instance.files[blobpath]
+ if files then
+ for k,v in next, files do
+ if find(k,"^remap:") then
+ k = files[k]
+ v = files[k] -- chained
+ end
+ if find(k,pattern) then
+ if type(v) == "string" then
+ handle(blobtype,blobpath,v,k)
+ else
+ for _,vv in next, v do -- indexed
+ handle(blobtype,blobpath,vv,k)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function resolvers.locate_format(name)
+ local barename, fmtname = gsub(name,"%.%a+$",""), ""
+ if resolvers.usecache then
+ local path = file.join(caches.setpath("formats")) -- maybe platform
+ fmtname = file.join(path,barename..".fmt") or ""
+ end
+ if fmtname == "" then
+ fmtname = resolvers.find_files(barename..".fmt")[1] or ""
+ end
+ fmtname = resolvers.clean_path(fmtname)
+ if fmtname ~= "" then
+ local barename = file.removesuffix(fmtname)
+ local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
+ if lfs.isfile(luiname) then
+ return barename, luiname
+ elseif lfs.isfile(lucname) then
+ return barename, lucname
+ elseif lfs.isfile(luaname) then
+ return barename, luaname
+ end
+ end
+ return nil, nil
+end
+
+function resolvers.boolean_variable(str,default)
+ local b = resolvers.expansion(str)
+ if b == "" then
+ return default
+ else
+ b = toboolean(b)
+ return (b == nil and default) or b
+ end
+end
+
+texconfig.kpse_init = false
+
+kpse = { original = kpse } setmetatable(kpse, { __index = function(k,v) return resolvers[v] end } )
+
+-- for a while
+
+input = resolvers
diff --git a/tex/context/base/data-sch.lua b/tex/context/base/data-sch.lua
new file mode 100644
index 000000000..e68b6cd01
--- /dev/null
+++ b/tex/context/base/data-sch.lua
@@ -0,0 +1,142 @@
+if not modules then modules = { } end modules ['data-sch'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local http = require("socket.http")
+local ltn12 = require("ltn12")
+
+local gsub, concat, format = string.gsub, table.concat, string.format
+
+local trace_schemes = false trackers.register("resolvers.schemes",function(v) trace_schemes = v end)
+
+schemes = schemes or { }
+
+schemes.cached = { }
+schemes.cachepath = caches.definepath("schemes")
+schemes.threshold = 24 * 60 * 60
+
+directives.register("schemes.threshold", function(v) schemes.threshold = tonumber(v) or schemes.threshold end)
+
+local cached, loaded, reused = schemes.cached, { }, { }
+
+local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+
+function schemes.curl(name,cachename)
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+ os.spawn(command)
+end
+
+function schemes.fetch(protocol,name,handler)
+ local cachename = schemes.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
+ cachename = gsub(cachename,"[\\]", "/") -- cleanup
+ if not cached[name] then
+ statistics.starttiming(schemes)
+ if not io.exists(cachename) or (os.difftime(os.time(),lfs.attributes(cachename).modification) > schemes.threshold) then
+ cached[name] = cachename
+ if handler then
+ if trace_schemes then
+ logs.report("schemes","fetching '%s', protocol '%s', method 'built-in'",name,protocol)
+ end
+ io.flush()
+ handler(protocol,name,cachename)
+ else
+ if trace_schemes then
+ logs.report("schemes","fetching '%s', protocol '%s', method 'curl'",name,protocol)
+ end
+ io.flush()
+ schemes.curl(name,cachename)
+ end
+ end
+ if io.exists(cachename) then
+ cached[name] = cachename
+ if trace_schemes then
+ logs.report("schemes","using cached '%s', protocol '%s', cachename '%s'",name,protocol,cachename)
+ end
+ else
+ cached[name] = ""
+ if trace_schemes then
+ logs.report("schemes","using missing '%s', protocol '%s'",name,protocol)
+ end
+ end
+ loaded[protocol] = loaded[protocol] + 1
+ statistics.stoptiming(schemes)
+ else
+ if trace_schemes then
+ logs.report("schemes","reusing '%s', protocol '%s'",name,protocol)
+ end
+ reused[protocol] = reused[protocol] + 1
+ end
+ return cached[name]
+end
+
+function finders.schemes(protocol,filename,handler)
+ local foundname = schemes.fetch(protocol,filename,handler)
+ return finders.generic(protocol,foundname,filetype)
+end
+
+function openers.schemes(protocol,filename)
+ return openers.generic(protocol,filename)
+end
+
+function loaders.schemes(protocol,filename)
+ return loaders.generic(protocol,filename)
+end
+
+-- could be metatable
+
+function schemes.install(protocol,handler)
+ loaded [protocol] = 0
+ reused [protocol] = 0
+ finders[protocol] = function (filename,filetype) return finders.schemes(protocol,filename,handler) end
+ openers[protocol] = function (filename) return openers.schemes(protocol,filename) end
+ loaders[protocol] = function (filename) return loaders.schemes(protocol,filename) end
+end
+
+local function http_handler(protocol,name,cachename)
+ local tempname = cachename .. ".tmp"
+ local f = io.open(tempname,"wb")
+ local status, message = http.request {
+ url = name,
+ sink = ltn12.sink.file(f)
+ }
+ if not status then
+ os.remove(tempname)
+ else
+ os.remove(cachename)
+ os.rename(tempname,cachename)
+ end
+end
+
+schemes.install('http',http_handler)
+schemes.install('https')
+schemes.install('ftp')
+
+statistics.register("scheme handling time", function()
+ local l, r = { }, { }
+ for k, v in table.sortedhash(loaded) do
+ if v > 0 then
+ l[#l+1] = k .. ":" .. v
+ end
+ end
+ for k, v in table.sortedhash(reused) do
+ if v > 0 then
+ r[#r+1] = k .. ":" .. v
+ end
+ end
+ local n = #l + #r
+ if n > 0 then
+ l = (#l > 0 and concat(l)) or "none"
+ r = (#r > 0 and concat(r)) or "none"
+ return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
+ statistics.elapsedtime(schemes), n, schemes.threshold, l, r)
+ else
+ return nil
+ end
+end)
+
+--~ trace_schemes = true
+--~ print(schemes.fetch("http","http://www.pragma-ade.com/show-man.pdf",http_handler))
diff --git a/tex/context/base/data-tex.lua b/tex/context/base/data-tex.lua
new file mode 100644
index 000000000..c9fa3625a
--- /dev/null
+++ b/tex/context/base/data-tex.lua
@@ -0,0 +1,226 @@
+if not modules then modules = { } end modules ['data-tex'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- special functions that deal with io
+
+local format, lower = string.format, string.lower
+local unpack = unpack or table.unpack
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local texiowrite_nl = (texio and texio.write_nl) or print
+local texiowrite = (texio and texio.write) or print
+
+local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+
+function finders.generic(tag,filename,filetype)
+ local foundname = resolvers.find_file(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ logs.report("fileio","%s finder: file '%s' found",tag,filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ logs.report("fileio","%s finder: unknown file '%s'",tag,filename)
+ end
+ return unpack(finders.notfound)
+ end
+end
+
+--~ local lpegmatch = lpeg.match
+--~ local getlines = lpeg.Ct(lpeg.patterns.textline)
+
+local input_translator, utf_translator, user_translator = nil, nil, nil
+
+function resolvers.install_text_filter(name,func)
+ if name == "input" then input_translator = func
+ elseif name == "utf" then utf_translator = func
+ elseif name == "user" then user_translator = func end
+end
+
+function openers.text_opener(filename,file_handle,tag)
+ local u = unicode.utftype(file_handle)
+ local t = { }
+ if u > 0 then
+ if trace_locating then
+ logs.report("fileio","%s opener, file '%s' opened using method '%s'",tag,filename,unicode.utfname[u])
+ end
+ local l
+ if u > 2 then
+ l = unicode.utf32_to_utf8(file_handle:read("*a"),u==4)
+ else
+ l = unicode.utf16_to_utf8(file_handle:read("*a"),u==2)
+ end
+ file_handle:close()
+ t = {
+ utftype = u, -- may go away
+ lines = l,
+ current = 0, -- line number, not really needed
+ handle = nil,
+ noflines = #l,
+ close = function()
+ if trace_locating then
+ logs.report("fileio","%s closer, file '%s' closed",tag,filename)
+ end
+ logs.show_close(filename)
+ t = nil
+ end,
+ reader = function(self)
+ self = self or t
+ local current, lines = self.current, self.lines
+ if current >= #lines then
+ return nil
+ else
+ current = current + 1
+ self.current = current
+ local line = lines[current]
+ if not line then
+ return nil
+ elseif line == "" then
+ return ""
+ else
+ if input_translator then
+ line = input_translator(line)
+ end
+ if utf_translator then
+ line = utf_translator(line)
+ end
+ if user_translator then
+ line = user_translator(line)
+ end
+ return line
+ end
+ end
+ end
+ }
+ else
+ if trace_locating then
+ logs.report("fileio","%s opener, file '%s' opened",tag,filename)
+ end
+ -- todo: file;name -> freeze / eerste regel scannen -> freeze
+ --~ local data = lpegmatch(getlines,file_handle:read("*a"))
+ --~ local n = 0
+ t = {
+ reader = function() -- self
+ local line = file_handle:read()
+ --~ n = n + 1
+ --~ local line = data[n]
+ --~ print(line)
+ if not line then
+ return nil
+ elseif line == "" then
+ return ""
+ else
+ if input_translator then
+ line = input_translator(line)
+ end
+ if utf_translator then
+ line = utf_translator(line)
+ end
+ if user_translator then
+ line = user_translator(line)
+ end
+ return line
+ end
+ end,
+ close = function()
+ if trace_locating then
+ logs.report("fileio","%s closer, file '%s' closed",tag,filename)
+ end
+ logs.show_close(filename)
+ file_handle:close()
+ t = nil
+ collectgarbage("step") -- saves some memory
+ end,
+ handle = function()
+ return file_handle
+ end,
+ noflines = function()
+ t.noflines = io.noflines(file_handle)
+ return t.noflines
+ end
+ }
+ end
+ return t
+end
+
+function openers.generic(tag,filename)
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ logs.show_open(filename) -- todo
+ if trace_locating then
+ logs.report("fileio","%s opener, file '%s' opened",tag,filename)
+ end
+ return openers.text_opener(filename,f,tag)
+ end
+ end
+ if trace_locating then
+ logs.report("fileio","%s opener, file '%s' not found",tag,filename)
+ end
+ return unpack(openers.notfound)
+end
+
+function loaders.generic(tag,filename)
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ logs.show_load(filename)
+ if trace_locating then
+ logs.report("fileio","%s loader, file '%s' loaded",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
+ end
+ end
+ end
+ if trace_locating then
+ logs.report("fileio","%s loader, file '%s' not found",tag,filename)
+ end
+ return unpack(loaders.notfound)
+end
+
+function finders.tex(filename,filetype)
+ return finders.generic('tex',filename,filetype)
+end
+
+function openers.tex(filename)
+ return openers.generic('tex',filename)
+end
+
+function loaders.tex(filename)
+ return loaders.generic('tex',filename)
+end
+
+function resolvers.findtexfile(filename, filetype)
+ return resolvers.methodhandler('finders',filename, filetype)
+end
+
+function resolvers.opentexfile(filename)
+ return resolvers.methodhandler('openers',filename)
+end
+
+function resolvers.openfile(filename)
+ local fullname = resolvers.findtexfile(filename)
+ if fullname and (fullname ~= "") then
+ return resolvers.opentexfile(fullname)
+ else
+ return nil
+ end
+end
+
+function resolvers.texdatablob(filename, filetype)
+ local ok, data, size = resolvers.loadbinfile(filename, filetype)
+ return data or ""
+end
+
+resolvers.loadtexfile = resolvers.texdatablob
diff --git a/tex/context/base/data-tmf.lua b/tex/context/base/data-tmf.lua
new file mode 100644
index 000000000..7421eacfc
--- /dev/null
+++ b/tex/context/base/data-tmf.lua
@@ -0,0 +1,75 @@
+if not modules then modules = { } end modules ['data-tmf'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local find, gsub, match = string.find, string.gsub, string.match
+local getenv, setenv = os.getenv, os.setenv
+
+-- loads *.tmf files in minimal tree roots (to be optimized and documented)
+
+function resolvers.check_environment(tree)
+ logs.simpleline()
+ setenv('TMP', getenv('TMP') or getenv('TEMP') or getenv('TMPDIR') or getenv('HOME'))
+ setenv('TEXOS', getenv('TEXOS') or ("texmf-" .. os.platform))
+ setenv('TEXPATH', gsub(tree or "tex","\/+$",''))
+ setenv('TEXMFOS', getenv('TEXPATH') .. "/" .. getenv('TEXOS'))
+ logs.simpleline()
+ logs.simple("preset : TEXPATH => %s", getenv('TEXPATH'))
+ logs.simple("preset : TEXOS => %s", getenv('TEXOS'))
+ logs.simple("preset : TEXMFOS => %s", getenv('TEXMFOS'))
+ logs.simple("preset : TMP => %s", getenv('TMP'))
+ logs.simple('')
+end
+
+function resolvers.load_environment(name) -- todo: key=value as well as lua
+ local f = io.open(name)
+ if f then
+ for line in f:lines() do
+ if find(line,"^[%%%#]") then
+ -- skip comment
+ else
+ local key, how, value = match(line,"^(.-)%s*([<=>%?]+)%s*(.*)%s*$")
+ if how then
+ value = gsub(value,"%%(.-)%%", function(v) return getenv(v) or "" end)
+ if how == "=" or how == "<<" then
+ setenv(key,value)
+ elseif how == "?" or how == "??" then
+ setenv(key,getenv(key) or value)
+ elseif how == "<" or how == "+=" then
+ if getenv(key) then
+ setenv(key,getenv(key) .. io.fileseparator .. value)
+ else
+ setenv(key,value)
+ end
+ elseif how == ">" or how == "=+" then
+ if getenv(key) then
+ setenv(key,value .. io.pathseparator .. getenv(key))
+ else
+ setenv(key,value)
+ end
+ end
+ end
+ end
+ end
+ f:close()
+ end
+end
+
+function resolvers.load_tree(tree)
+ if tree and tree ~= "" then
+ local setuptex = 'setuptex.tmf'
+ if lfs.attributes(tree, "mode") == "directory" then -- check if not nil
+ setuptex = tree .. "/" .. setuptex
+ else
+ setuptex = tree
+ end
+ if io.exists(setuptex) then
+ resolvers.check_environment(tree)
+ resolvers.load_environment(setuptex)
+ end
+ end
+end
diff --git a/tex/context/base/data-tmp.lua b/tex/context/base/data-tmp.lua
new file mode 100644
index 000000000..25f5b975c
--- /dev/null
+++ b/tex/context/base/data-tmp.lua
@@ -0,0 +1,178 @@
+if not modules then modules = { } end modules ['data-tmp'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+local format, lower, gsub = string.format, string.lower, string.gsub
+
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) -- not used yet
+
+caches = caches or { }
+
+caches.path = caches.path or nil
+caches.base = caches.base or "luatex-cache"
+caches.more = caches.more or "context"
+caches.direct = false -- true is faster but may need huge amounts of memory
+caches.tree = false
+caches.paths = caches.paths or nil
+caches.force = false
+caches.defaults = { "TEXMFCACHE", "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+
+function caches.temp()
+ local cachepath = nil
+ local function check(list,isenv)
+ if not cachepath then
+ for k=1,#list do
+ local v = list[k]
+ cachepath = (isenv and (os.env[v] or "")) or v or ""
+ if cachepath == "" then
+ -- next
+ else
+ cachepath = resolvers.clean_path(cachepath)
+ if lfs.isdir(cachepath) and file.iswritable(cachepath) then -- lfs.attributes(cachepath,"mode") == "directory"
+ break
+ elseif caches.force or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
+ dir.mkdirs(cachepath)
+ if lfs.isdir(cachepath) and file.iswritable(cachepath) then
+ break
+ end
+ end
+ end
+ cachepath = nil
+ end
+ end
+ end
+ check(resolvers.clean_path_list("TEXMFCACHE") or { })
+ check(caches.defaults,true)
+ if not cachepath then
+ print("\nfatal error: there is no valid (writable) cache path defined\n")
+ os.exit()
+ elseif not lfs.isdir(cachepath) then -- lfs.attributes(cachepath,"mode") ~= "directory"
+ print(format("\nfatal error: cache path %s is not a directory\n",cachepath))
+ os.exit()
+ end
+ cachepath = file.collapse_path(cachepath)
+ function caches.temp()
+ return cachepath
+ end
+ return cachepath
+end
+
+function caches.configpath()
+ return table.concat(resolvers.instance.cnffiles,";")
+end
+
+function caches.hashed(tree)
+ return md5.hex(gsub(lower(tree),"[\\\/]+","/"))
+end
+
+function caches.treehash()
+ local tree = caches.configpath()
+ if not tree or tree == "" then
+ return false
+ else
+ return caches.hashed(tree)
+ end
+end
+
+function caches.setpath(...)
+ if not caches.path then
+ if not caches.path then
+ caches.path = caches.temp()
+ end
+ caches.path = resolvers.clean_path(caches.path) -- to be sure
+ caches.tree = caches.tree or caches.treehash()
+ if caches.tree then
+ caches.path = dir.mkdirs(caches.path,caches.base,caches.more,caches.tree)
+ else
+ caches.path = dir.mkdirs(caches.path,caches.base,caches.more)
+ end
+ end
+ if not caches.path then
+ caches.path = '.'
+ end
+ caches.path = resolvers.clean_path(caches.path)
+ local dirs = { ... }
+ if #dirs > 0 then
+ local pth = dir.mkdirs(caches.path,...)
+ return pth
+ end
+ caches.path = dir.expand_name(caches.path)
+ return caches.path
+end
+
+function caches.definepath(category,subcategory)
+ return function()
+ return caches.setpath(category,subcategory)
+ end
+end
+
+function caches.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
+end
+
+function caches.loaddata(path,name)
+ local tmaname, tmcname = caches.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ loader = loader()
+ collectgarbage("step")
+ return loader
+ else
+ return false
+ end
+end
+
+--~ function caches.loaddata(path,name)
+--~ local tmaname, tmcname = caches.setluanames(path,name)
+--~ return dofile(tmcname) or dofile(tmaname)
+--~ end
+
+function caches.iswritable(filepath,filename)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ return file.iswritable(tmaname)
+end
+
+function caches.savedata(filepath,filename,data,raw)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ data.cache_uuid = os.uuid()
+ if caches.direct then
+ file.savedata(tmaname, table.serialize(data,'return',false,true,false)) -- no hex
+ else
+ table.tofile(tmaname, data,'return',false,true,false) -- maybe not the last true
+ end
+ local cleanup = resolvers.boolean_variable("PURGECACHE", false)
+ local strip = resolvers.boolean_variable("LUACSTRIP", true)
+ utils.lua.compile(tmaname, tmcname, cleanup, strip)
+end
+
+-- here we use the cache for format loading (texconfig.[formatname|jobname])
+
+--~ if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
+if tex and texconfig and (not texconfig.formatname or texconfig.formatname == "") and input and resolvers.instance then
+ if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end -- or luc
+ texconfig.formatname = caches.setpath("formats") .. "/" .. gsub(texconfig.luaname,"%.lu.$",".fmt")
+end
diff --git a/tex/context/base/data-tre.lua b/tex/context/base/data-tre.lua
new file mode 100644
index 000000000..d5ca258e4
--- /dev/null
+++ b/tex/context/base/data-tre.lua
@@ -0,0 +1,47 @@
+if not modules then modules = { } end modules ['data-tre'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- \input tree://oeps1/**/oeps.tex
+
+local find, gsub = string.find, string.gsub
+local unpack = unpack or table.unpack
+
+local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+
+local done, found = { }, { }
+
+function finders.tree(specification,filetype)
+ local fnd = found[specification]
+ if not fnd then
+ local spec = resolvers.splitmethod(specification).path or ""
+ if spec ~= "" then
+ local path, name = file.dirname(spec), file.basename(spec)
+ if path == "" then path = "." end
+ local hash = done[path]
+ if not hash then
+ local pattern = path .. "/*" -- we will use the proper splitter
+ hash = dir.glob(pattern)
+ done[path] = hash
+ end
+ local pattern = "/" .. gsub(name,"([%.%-%+])", "%%%1") .. "$"
+ for k=1,#hash do
+ local v = hash[k]
+ if find(v,pattern) then
+ found[specification] = v
+ return v
+ end
+ end
+ end
+ fnd = unpack(finders.notfound)
+ found[specification] = fnd
+ end
+ return fnd
+end
+
+openers.tree = openers.generic
+loaders.tree = loaders.generic
diff --git a/tex/context/base/data-use.lua b/tex/context/base/data-use.lua
new file mode 100644
index 000000000..5ecd7805f
--- /dev/null
+++ b/tex/context/base/data-use.lua
@@ -0,0 +1,129 @@
+if not modules then modules = { } end modules ['data-use'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, lower, gsub, find = string.format, string.lower, string.gsub, string.find
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+-- since we want to use the cache instead of the tree, we will now
+-- reimplement the saver.
+
+local save_data = resolvers.save_data
+local load_data = resolvers.load_data
+
+resolvers.cachepath = nil -- public, for tracing
+resolvers.usecache = true -- public, for tracing
+
+function resolvers.save_data(dataname)
+ save_data(dataname, function(cachename,dataname)
+ resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
+ if resolvers.usecache then
+ resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
+ return file.join(resolvers.cachepath(),caches.hashed(cachename))
+ else
+ return file.join(cachename,dataname)
+ end
+ end)
+end
+
+function resolvers.load_data(pathname,dataname,filename)
+ load_data(pathname,dataname,filename,function(dataname,filename)
+ resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
+ if resolvers.usecache then
+ resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
+ return file.join(resolvers.cachepath(),caches.hashed(pathname))
+ else
+ if not filename or (filename == "") then
+ filename = dataname
+ end
+ return file.join(pathname,filename)
+ end
+ end)
+end
+
+-- we will make a better format, maybe something xml or just text or lua
+
+resolvers.automounted = resolvers.automounted or { }
+
+function resolvers.automount(usecache)
+ local mountpaths = resolvers.clean_path_list(resolvers.expansion('TEXMFMOUNT'))
+ if (not mountpaths or #mountpaths == 0) and usecache then
+ mountpaths = { caches.setpath("mount") }
+ end
+ if mountpaths and #mountpaths > 0 then
+ statistics.starttiming(resolvers.instance)
+ for k=1,#mountpaths do
+ local root = mountpaths[k]
+ local f = io.open(root.."/url.tmi")
+ if f then
+ for line in f:lines() do
+ if line then
+ if find(line,"^[%%#%-]") then -- or %W
+ -- skip
+ elseif find(line,"^zip://") then
+ if trace_locating then
+ logs.report("fileio","mounting %s",line)
+ end
+ table.insert(resolvers.automounted,line)
+ resolvers.usezipfile(line)
+ end
+ end
+ end
+ f:close()
+ end
+ end
+ statistics.stoptiming(resolvers.instance)
+ end
+end
+
+-- status info
+
+statistics.register("used config path", function() return caches.configpath() end)
+statistics.register("used cache path", function() return caches.temp() or "?" end)
+
+-- experiment (code will move)
+
+function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname
+ local enginebanner = status.list().banner
+ if formatbanner and enginebanner and sourcefile then
+ local luvname = file.replacesuffix(texname,"luv")
+ local luvdata = {
+ enginebanner = enginebanner,
+ formatbanner = formatbanner,
+ sourcehash = md5.hex(io.loaddata(resolvers.find_file(sourcefile)) or "unknown"),
+ sourcefile = sourcefile,
+ }
+ io.savedata(luvname,table.serialize(luvdata,true))
+ end
+end
+
+function statistics.check_fmt_status(texname)
+ local enginebanner = status.list().banner
+ if enginebanner and texname then
+ local luvname = file.replacesuffix(texname,"luv")
+ if lfs.isfile(luvname) then
+ local luv = dofile(luvname)
+ if luv and luv.sourcefile then
+ local sourcehash = md5.hex(io.loaddata(resolvers.find_file(luv.sourcefile)) or "unknown")
+ local luvbanner = luv.enginebanner or "?"
+ if luvbanner ~= enginebanner then
+ return string.format("engine mismatch (luv:%s <> bin:%s)",luvbanner,enginebanner)
+ end
+ local luvhash = luv.sourcehash or "?"
+ if luvhash ~= sourcehash then
+ return string.format("source mismatch (luv:%s <> bin:%s)",luvhash,sourcehash)
+ end
+ else
+ return "invalid status file"
+ end
+ else
+ return "missing status file"
+ end
+ end
+ return true
+end
diff --git a/tex/context/base/data-zip.lua b/tex/context/base/data-zip.lua
new file mode 100644
index 000000000..aa3740a83
--- /dev/null
+++ b/tex/context/base/data-zip.lua
@@ -0,0 +1,241 @@
+if not modules then modules = { } end modules ['data-zip'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, find, match = string.format, string.find, string.match
+local unpack = unpack or table.unpack
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+-- zip:///oeps.zip?name=bla/bla.tex
+-- zip:///oeps.zip?tree=tex/texmf-local
+-- zip:///texmf.zip?tree=/tex/texmf
+-- zip:///texmf.zip?tree=/tex/texmf-local
+-- zip:///texmf-mine.zip?tree=/tex/texmf-projects
+
+zip = zip or { }
+zip.archives = zip.archives or { }
+zip.registeredfiles = zip.registeredfiles or { }
+
+local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+local locators, hashers, concatinators = resolvers.locators, resolvers.hashers, resolvers.concatinators
+
+local archives = zip.archives
+
+local function validzip(str) -- todo: use url splitter
+ if not find(str,"^zip://") then
+ return "zip:///" .. str
+ else
+ return str
+ end
+end
+
+function zip.openarchive(name)
+ if not name or name == "" then
+ return nil
+ else
+ local arch = archives[name]
+ if not arch then
+ local full = resolvers.find_file(name) or ""
+ arch = (full ~= "" and zip.open(full)) or false
+ archives[name] = arch
+ end
+ return arch
+ end
+end
+
+function zip.closearchive(name)
+ if not name or (name == "" and archives[name]) then
+ zip.close(archives[name])
+ archives[name] = nil
+ end
+end
+
+function locators.zip(specification) -- where is this used? startup zips (untested)
+ specification = resolvers.splitmethod(specification)
+ local zipfile = specification.path
+ local zfile = zip.openarchive(name) -- tricky, could be in to be initialized tree
+ if trace_locating then
+ if zfile then
+ logs.report("fileio","zip locator, archive '%s' found",specification.original)
+ else
+ logs.report("fileio","zip locator, archive '%s' not found",specification.original)
+ end
+ end
+end
+
+function hashers.zip(tag,name)
+ if trace_locating then
+ logs.report("fileio","loading zip file '%s' as '%s'",name,tag)
+ end
+ resolvers.usezipfile(format("%s?tree=%s",tag,name))
+end
+
+function concatinators.zip(tag,path,name)
+ if not path or path == "" then
+ return format('%s?name=%s',tag,name)
+ else
+ return format('%s?name=%s/%s',tag,path,name)
+ end
+end
+
+function resolvers.isreadable.zip(name)
+ return true
+end
+
+function finders.zip(specification,filetype)
+ specification = resolvers.splitmethod(specification)
+ if specification.path then
+ local q = url.query(specification.query)
+ if q.name then
+ local zfile = zip.openarchive(specification.path)
+ if zfile then
+ if trace_locating then
+ logs.report("fileio","zip finder, archive '%s' found",specification.path)
+ end
+ local dfile = zfile:open(q.name)
+ if dfile then
+ dfile = zfile:close()
+ if trace_locating then
+ logs.report("fileio","zip finder, file '%s' found",q.name)
+ end
+ return specification.original
+ elseif trace_locating then
+ logs.report("fileio","zip finder, file '%s' not found",q.name)
+ end
+ elseif trace_locating then
+ logs.report("fileio","zip finder, unknown archive '%s'",specification.path)
+ end
+ end
+ end
+ if trace_locating then
+ logs.report("fileio","zip finder, '%s' not found",filename)
+ end
+ return unpack(finders.notfound)
+end
+
+function openers.zip(specification)
+ local zipspecification = resolvers.splitmethod(specification)
+ if zipspecification.path then
+ local q = url.query(zipspecification.query)
+ if q.name then
+ local zfile = zip.openarchive(zipspecification.path)
+ if zfile then
+ if trace_locating then
+ logs.report("fileio","zip opener, archive '%s' opened",zipspecification.path)
+ end
+ local dfile = zfile:open(q.name)
+ if dfile then
+ logs.show_open(specification)
+ if trace_locating then
+ logs.report("fileio","zip opener, file '%s' found",q.name)
+ end
+ return openers.text_opener(specification,dfile,'zip')
+ elseif trace_locating then
+ logs.report("fileio","zip opener, file '%s' not found",q.name)
+ end
+ elseif trace_locating then
+ logs.report("fileio","zip opener, unknown archive '%s'",zipspecification.path)
+ end
+ end
+ end
+ if trace_locating then
+ logs.report("fileio","zip opener, '%s' not found",filename)
+ end
+ return unpack(openers.notfound)
+end
+
+function loaders.zip(specification)
+ specification = resolvers.splitmethod(specification)
+ if specification.path then
+ local q = url.query(specification.query)
+ if q.name then
+ local zfile = zip.openarchive(specification.path)
+ if zfile then
+ if trace_locating then
+ logs.report("fileio","zip loader, archive '%s' opened",specification.path)
+ end
+ local dfile = zfile:open(q.name)
+ if dfile then
+ logs.show_load(filename)
+ if trace_locating then
+ logs.report("fileio","zip loader, file '%s' loaded",filename)
+ end
+ local s = dfile:read("*all")
+ dfile:close()
+ return true, s, #s
+ elseif trace_locating then
+ logs.report("fileio","zip loader, file '%s' not found",q.name)
+ end
+ elseif trace_locating then
+ logs.report("fileio","zip loader, unknown archive '%s'",specification.path)
+ end
+ end
+ end
+ if trace_locating then
+ logs.report("fileio","zip loader, '%s' not found",filename)
+ end
+ return unpack(openers.notfound)
+end
+
+-- zip:///somefile.zip
+-- zip:///somefile.zip?tree=texmf-local -> mount
+
+function resolvers.usezipfile(zipname)
+ zipname = validzip(zipname)
+ local specification = resolvers.splitmethod(zipname)
+ local zipfile = specification.path
+ if zipfile and not zip.registeredfiles[zipname] then
+ local tree = url.query(specification.query).tree or ""
+ local z = zip.openarchive(zipfile)
+ if z then
+ local instance = resolvers.instance
+ if trace_locating then
+ logs.report("fileio","zip registering, registering archive '%s'",zipname)
+ end
+ statistics.starttiming(instance)
+ resolvers.prepend_hash('zip',zipname,zipfile)
+ resolvers.extend_texmf_var(zipname) -- resets hashes too
+ zip.registeredfiles[zipname] = z
+ instance.files[zipname] = resolvers.register_zip_file(z,tree or "")
+ statistics.stoptiming(instance)
+ elseif trace_locating then
+ logs.report("fileio","zip registering, unknown archive '%s'",zipname)
+ end
+ elseif trace_locating then
+ logs.report("fileio","zip registering, '%s' not found",zipname)
+ end
+end
+
+function resolvers.register_zip_file(z,tree)
+ local files, filter = { }, ""
+ if tree == "" then
+ filter = "^(.+)/(.-)$"
+ else
+ filter = format("^%s/(.+)/(.-)$",tree)
+ end
+ if trace_locating then
+ logs.report("fileio","zip registering, using filter '%s'",filter)
+ end
+ local register, n = resolvers.register_file, 0
+ for i in z:files() do
+ local path, name = match(i.filename,filter)
+ if path then
+ if name and name ~= '' then
+ register(files, name, path)
+ n = n + 1
+ else
+ -- directory
+ end
+ else
+ register(files, i.filename, '')
+ n = n + 1
+ end
+ end
+ logs.report("fileio","zip registering, %s files registered",n)
+ return files
+end
diff --git a/tex/context/base/enco-032.mkii b/tex/context/base/enco-032.mkii
new file mode 100644
index 000000000..d7e15126c
--- /dev/null
+++ b/tex/context/base/enco-032.mkii
@@ -0,0 +1,82 @@
+%D \module
+%D [ file=enco-032,
+%D version=2006.03.30,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Unicode Goodies,
+%D author={Taco Hoekwater},
+%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.
+
+\unprotect
+
+% unicode table 32 (= hex 20)
+
+\startencoding [default]
+
+ \definecommand unic@threeperemspace {\hskip .33333em }
+ \definecommand unic@fourperemspace {\hskip .25em }
+ \definecommand unic@sixperemspace {\hskip .16667em }
+ \definecommand unic@figurespace {\hphantom{0}}
+ \definecommand unic@punctuationspace {\hphantom{,}}
+ \definecommand unic@hairspace {\hskip .08333em }
+ \definecommand unic@zerowidthspace {\hskip 0em plus 1sp }
+ \definecommand unic@zerowidthjoiner {\kern 0em }
+ \definecommand unic@zerowidthnonjoiner {\hskip 0em }
+
+ \definecommand unic@quotedblleftreversed {\mirror{\quotedblright}}
+ \definecommand unic@quoteleftreversed {\mirror{\quoteright}}
+
+ \definecommand unic@onedotleader {{\periods[1]}}
+ \definecommand unic@twodotleader {{\periods[2]}}
+ \definecommand unic@hyphenationpoint {.\allowbreak }
+
+ \definecommand unic@doubleexclamationmark {!!}
+ \definecommand unic@exclamationquestionmark {!?}
+ \definecommand unic@questionexclamationmark {?!}
+ \definecommand unic@doublequestionmark {??}
+
+ \definecommand unic@reversedpilcrowsign {\mirror{\P}}
+ \definecommand unic@reversedsemicolon {\mirror{;}}
+
+ \definecommand unic@superscriptzero {\high{0}}
+ \definecommand unic@superscripti {\high{i}}
+ \definecommand unic@superscriptfour {\high{4}}
+ \definecommand unic@superscriptfive {\high{5}}
+ \definecommand unic@superscriptsix {\high{6}}
+ \definecommand unic@superscriptseven {\high{7}}
+ \definecommand unic@superscripteight {\high{8}}
+ \definecommand unic@superscriptnine {\high{9}}
+ \definecommand unic@superscriptplus {\high{+}}
+ \definecommand unic@superscriptminus {\high{\textminus}}
+ \definecommand unic@superscriptequals {\high{=}}
+ \definecommand unic@superscriptleft {\high{(}}
+ \definecommand unic@superscriptright {\high{)}}
+ \definecommand unic@superscriptn {\high{n}}
+ \definecommand unic@subscriptzero {\low{0}}
+ \definecommand unic@subscriptone {\low{1}}
+ \definecommand unic@subscripttwo {\low{2}}
+ \definecommand unic@subscriptthree {\low{3}}
+ \definecommand unic@subscriptfour {\low{4}}
+ \definecommand unic@subscriptfive {\low{5}}
+ \definecommand unic@subscriptsix {\low{6}}
+ \definecommand unic@subscriptseven {\low{7}}
+ \definecommand unic@subscripteight {\low{8}}
+ \definecommand unic@subscriptnine {\low{9}}
+ \definecommand unic@subscriptplus {\low{+}}
+ \definecommand unic@subscriptminus {\low{\textminus}}
+ \definecommand unic@subscriptequals {\low{=}}
+ \definecommand unic@subscriptleft {\low{(}}
+ \definecommand unic@subscriptright {\low{)}}
+ \definecommand unic@subscripta {\low{a}}
+ \definecommand unic@subscripte {\low{e}}
+ \definecommand unic@subscripto {\low{o}}
+ \definecommand unic@subscriptx {\low{x}}
+ \definecommand unic@subscriptschwa {\low{\schwa}}
+
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-037.mkii b/tex/context/base/enco-037.mkii
new file mode 100644
index 000000000..d9fc653b2
--- /dev/null
+++ b/tex/context/base/enco-037.mkii
@@ -0,0 +1,276 @@
+%D \module
+%D [ file=enco-037,
+%D version=2006.02.13,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Encoding for vector 37,
+%D author=Luigi Scarso,
+%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.
+
+\startencoding[default]
+
+\definecharacter UnicodeLightHorizontal {\uchar{37}{000}} %%BOX DRAWINGS LIGHT HORIZONTAL
+\definecharacter UnicodeHeavyHorizontal {\uchar{37}{001}} %%BOX DRAWINGS HEAVY HORIZONTAL
+\definecharacter UnicodeLightVertical {\uchar{37}{002}} %%BOX DRAWINGS LIGHT VERTICAL
+\definecharacter UnicodeHeavyVertical {\uchar{37}{003}} %%BOX DRAWINGS HEAVY VERTICAL
+\definecharacter UnicodeLightTripleDashHorizontal {\uchar{37}{004}} %%BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+\definecharacter UnicodeHeavyTripleDashHorizontal {\uchar{37}{005}} %%BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+\definecharacter UnicodeLightTripleDashVertical {\uchar{37}{006}} %%BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+\definecharacter UnicodeHeavyTripleDashVertical {\uchar{37}{007}} %%BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+\definecharacter UnicodeLightQuadrupleDashHorizontal {\uchar{37}{008}} %%BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+\definecharacter UnicodeHeavyQuadrupleDashHorizontal {\uchar{37}{009}} %%BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+\definecharacter UnicodeLightQuadrupleDashVertical {\uchar{37}{010}} %%BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+\definecharacter UnicodeHeavyQuadrupleDashVertical {\uchar{37}{011}} %%BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+\definecharacter UnicodeLightDownAndRight {\uchar{37}{012}} %%BOX DRAWINGS LIGHT DOWN AND RIGHT
+\definecharacter UnicodeDownLightAndRightHeavy {\uchar{37}{013}} %%BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+\definecharacter UnicodeDownHeavyAndRightLight {\uchar{37}{014}} %%BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+\definecharacter UnicodeHeavyDownAndRight {\uchar{37}{015}} %%BOX DRAWINGS HEAVY DOWN AND RIGHT
+\definecharacter UnicodeLightDownAndLeft {\uchar{37}{016}} %%BOX DRAWINGS LIGHT DOWN AND LEFT
+\definecharacter UnicodeDownLightAndLeftHeavy {\uchar{37}{017}} %%BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+\definecharacter UnicodeDownHeavyAndLeftLight {\uchar{37}{018}} %%BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+\definecharacter UnicodeHeavyDownAndLeft {\uchar{37}{019}} %%BOX DRAWINGS HEAVY DOWN AND LEFT
+\definecharacter UnicodeLightUpAndRight {\uchar{37}{020}} %%BOX DRAWINGS LIGHT UP AND RIGHT
+\definecharacter UnicodeUpLightAndRightHeavy {\uchar{37}{021}} %%BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+\definecharacter UnicodeUpHeavyAndRightLight {\uchar{37}{022}} %%BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+\definecharacter UnicodeHeavyUpAndRight {\uchar{37}{023}} %%BOX DRAWINGS HEAVY UP AND RIGHT
+\definecharacter UnicodeLightUpAndLeft {\uchar{37}{024}} %%BOX DRAWINGS LIGHT UP AND LEFT
+\definecharacter UnicodeUpLightAndLeftHeavy {\uchar{37}{025}} %%BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+\definecharacter UnicodeUpHeavyAndLeftLight {\uchar{37}{026}} %%BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+\definecharacter UnicodeHeavyUpAndLeft {\uchar{37}{027}} %%BOX DRAWINGS HEAVY UP AND LEFT
+\definecharacter UnicodeLightVerticalAndRight {\uchar{37}{028}} %%BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+\definecharacter UnicodeVerticalLightAndRightHeavy {\uchar{37}{029}} %%BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+\definecharacter UnicodeUpHeavyAndRightDownLight {\uchar{37}{030}} %%BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+\definecharacter UnicodeDownHeavyAndRightUpLight {\uchar{37}{031}} %%BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+\definecharacter UnicodeVerticalHeavyAndRightLight {\uchar{37}{032}} %%BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+\definecharacter UnicodeDownLightAndRightUpHeavy {\uchar{37}{033}} %%BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+\definecharacter UnicodeUpLightAndRightDownHeavy {\uchar{37}{034}} %%BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+\definecharacter UnicodeHeavyVerticalAndRight {\uchar{37}{035}} %%BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+\definecharacter UnicodeLightVerticalAndLeft {\uchar{37}{036}} %%BOX DRAWINGS LIGHT VERTICAL AND LEFT
+\definecharacter UnicodeVerticalLightAndLeftHeavy {\uchar{37}{037}} %%BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+\definecharacter UnicodeUpHeavyAndLeftDownLight {\uchar{37}{038}} %%BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+\definecharacter UnicodeDownHeavyAndLeftUpLight {\uchar{37}{039}} %%BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+\definecharacter UnicodeVerticalHeavyAndLeftLight {\uchar{37}{040}} %%BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+\definecharacter UnicodeDownLightAndLeftUpHeavy {\uchar{37}{041}} %%BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+\definecharacter UnicodeUpLightAndLeftDownHeavy {\uchar{37}{042}} %%BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+\definecharacter UnicodeHeavyVerticalAndLeft {\uchar{37}{043}} %%BOX DRAWINGS HEAVY VERTICAL AND LEFT
+\definecharacter UnicodeLightDownAndHorizontal {\uchar{37}{044}} %%BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+\definecharacter UnicodeLeftHeavyAndRightDownLight {\uchar{37}{045}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+\definecharacter UnicodeRightHeavyAndLeftDownLight {\uchar{37}{046}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+\definecharacter UnicodeDownLightAndHorizontalHeavy {\uchar{37}{047}} %%BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+\definecharacter UnicodeDownHeavyAndHorizontalLight {\uchar{37}{048}} %%BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+\definecharacter UnicodeRightLightAndLeftDownHeavy {\uchar{37}{049}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+\definecharacter UnicodeLeftLightAndRightDownHeavy {\uchar{37}{050}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+\definecharacter UnicodeHeavyDownAndHorizontal {\uchar{37}{051}} %%BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+\definecharacter UnicodeLightUpAndHorizontal {\uchar{37}{052}} %%BOX DRAWINGS LIGHT UP AND HORIZONTAL
+\definecharacter UnicodeLeftHeavyAndRightUpLight {\uchar{37}{053}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+\definecharacter UnicodeRightHeavyAndLeftUpLight {\uchar{37}{054}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+\definecharacter UnicodeUpLightAndHorizontalHeavy {\uchar{37}{055}} %%BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+\definecharacter UnicodeUpHeavyAndHorizontalLight {\uchar{37}{056}} %%BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+\definecharacter UnicodeRightLightAndLeftUpHeavy {\uchar{37}{057}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+\definecharacter UnicodeLeftLightAndRightUpHeavy {\uchar{37}{058}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+\definecharacter UnicodeHeavyUpAndHorizontal {\uchar{37}{059}} %%BOX DRAWINGS HEAVY UP AND HORIZONTAL
+\definecharacter UnicodeLightVerticalAndHorizontal {\uchar{37}{060}} %%BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+\definecharacter UnicodeLeftHeavyAndRightVerticalLight {\uchar{37}{061}} %%BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+\definecharacter UnicodeRightHeavyAndLeftVerticalLight {\uchar{37}{062}} %%BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+\definecharacter UnicodeVerticalLightAndHorizontalHeavy {\uchar{37}{063}} %%BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+\definecharacter UnicodeUpHeavyAndDownHorizontalLight {\uchar{37}{064}} %%BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+\definecharacter UnicodeDownHeavyAndUpHorizontalLight {\uchar{37}{065}} %%BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+\definecharacter UnicodeVerticalHeavyAndHorizontalLight {\uchar{37}{066}} %%BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+\definecharacter UnicodeLeftUpHeavyAndRightDownLight {\uchar{37}{067}} %%BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+\definecharacter UnicodeRightUpHeavyAndLeftDownLight {\uchar{37}{068}} %%BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+\definecharacter UnicodeLeftDownHeavyAndRightUpLight {\uchar{37}{069}} %%BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+\definecharacter UnicodeRightDownHeavyAndLeftUpLight {\uchar{37}{070}} %%BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+\definecharacter UnicodeDownLightAndUpHorizontalHeavy {\uchar{37}{071}} %%BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+\definecharacter UnicodeUpLightAndDownHorizontalHeavy {\uchar{37}{072}} %%BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+\definecharacter UnicodeRightLightAndLeftVerticalHeavy {\uchar{37}{073}} %%BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+\definecharacter UnicodeLeftLightAndRightVerticalHeavy {\uchar{37}{074}} %%BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+\definecharacter UnicodeHeavyVerticalAndHorizontal {\uchar{37}{075}} %%BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+\definecharacter UnicodeLightDoubleDashHorizontal {\uchar{37}{076}} %%BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+\definecharacter UnicodeHeavyDoubleDashHorizontal {\uchar{37}{077}} %%BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+\definecharacter UnicodeLightDoubleDashVertical {\uchar{37}{078}} %%BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+\definecharacter UnicodeHeavyDoubleDashVertical {\uchar{37}{079}} %%BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+\definecharacter UnicodeDoubleHorizontal {\uchar{37}{080}} %%BOX DRAWINGS DOUBLE HORIZONTAL
+\definecharacter UnicodeDoubleVertical {\uchar{37}{081}} %%BOX DRAWINGS DOUBLE VERTICAL
+\definecharacter UnicodeDownSingleAndRightDouble {\uchar{37}{082}} %%BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+\definecharacter UnicodeDownDoubleAndRightSingle {\uchar{37}{083}} %%BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+\definecharacter UnicodeDoubleDownAndRight {\uchar{37}{084}} %%BOX DRAWINGS DOUBLE DOWN AND RIGHT
+\definecharacter UnicodeDownSingleAndLeftDouble {\uchar{37}{085}} %%BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+\definecharacter UnicodeDownDoubleAndLeftSingle {\uchar{37}{086}} %%BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+\definecharacter UnicodeDoubleDownAndLeft {\uchar{37}{087}} %%BOX DRAWINGS DOUBLE DOWN AND LEFT
+\definecharacter UnicodeUpSingleAndRightDouble {\uchar{37}{088}} %%BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+\definecharacter UnicodeUpDoubleAndRightSingle {\uchar{37}{089}} %%BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+\definecharacter UnicodeDoubleUpAndRight {\uchar{37}{090}} %%BOX DRAWINGS DOUBLE UP AND RIGHT
+\definecharacter UnicodeUpSingleAndLeftDouble {\uchar{37}{091}} %%BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+\definecharacter UnicodeUpDoubleAndLeftSingle {\uchar{37}{092}} %%BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+\definecharacter UnicodeDoubleUpAndLeft {\uchar{37}{093}} %%BOX DRAWINGS DOUBLE UP AND LEFT
+\definecharacter UnicodeVerticalSingleAndRightDouble {\uchar{37}{094}} %%BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+\definecharacter UnicodeVerticalDoubleAndRightSingle {\uchar{37}{095}} %%BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+\definecharacter UnicodeDoubleVerticalAndRight {\uchar{37}{096}} %%BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+\definecharacter UnicodeVerticalSingleAndLeftDouble {\uchar{37}{097}} %%BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+\definecharacter UnicodeVerticalDoubleAndLeftSingle {\uchar{37}{098}} %%BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+\definecharacter UnicodeDoubleVerticalAndLeft {\uchar{37}{099}} %%BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+\definecharacter UnicodeDownSingleAndHorizontalDouble {\uchar{37}{100}} %%BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+\definecharacter UnicodeDownDoubleAndHorizontalSingle {\uchar{37}{101}} %%BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+\definecharacter UnicodeDoubleDownAndHorizontal {\uchar{37}{102}} %%BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+\definecharacter UnicodeUpSingleAndHorizontalDouble {\uchar{37}{103}} %%BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+\definecharacter UnicodeUpDoubleAndHorizontalSingle {\uchar{37}{104}} %%BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+\definecharacter UnicodeDoubleUpAndHorizontal {\uchar{37}{105}} %%BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+\definecharacter UnicodeVerticalSingleAndHorizontalDouble {\uchar{37}{106}} %%BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+\definecharacter UnicodeVerticalDoubleAndHorizontalSingle {\uchar{37}{107}} %%BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+\definecharacter UnicodeDoubleVerticalAndHorizontal {\uchar{37}{108}} %%BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+\definecharacter UnicodeLightArcDownAndRight {\uchar{37}{109}} %%BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+\definecharacter UnicodeLightArcDownAndLeft {\uchar{37}{110}} %%BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+\definecharacter UnicodeLightArcUpAndLeft {\uchar{37}{111}} %%BOX DRAWINGS LIGHT ARC UP AND LEFT
+\definecharacter UnicodeLightArcUpAndRight {\uchar{37}{112}} %%BOX DRAWINGS LIGHT ARC UP AND RIGHT
+\definecharacter UnicodeLightDiagonalUpperRightToLowerLeft {\uchar{37}{113}} %%BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+\definecharacter UnicodeLightDiagonalUpperLeftToLowerRight {\uchar{37}{114}} %%BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+\definecharacter UnicodeLightDiagonalCross {\uchar{37}{115}} %%BOX DRAWINGS LIGHT DIAGONAL CROSS
+\definecharacter UnicodeLightLeft {\uchar{37}{116}} %%BOX DRAWINGS LIGHT LEFT
+\definecharacter UnicodeLightUp {\uchar{37}{117}} %%BOX DRAWINGS LIGHT UP
+\definecharacter UnicodeLightRight {\uchar{37}{118}} %%BOX DRAWINGS LIGHT RIGHT
+\definecharacter UnicodeLightDown {\uchar{37}{119}} %%BOX DRAWINGS LIGHT DOWN
+\definecharacter UnicodeHeavyLeft {\uchar{37}{120}} %%BOX DRAWINGS HEAVY LEFT
+\definecharacter UnicodeHeavyUp {\uchar{37}{121}} %%BOX DRAWINGS HEAVY UP
+\definecharacter UnicodeHeavyRight {\uchar{37}{122}} %%BOX DRAWINGS HEAVY RIGHT
+\definecharacter UnicodeHeavyDown {\uchar{37}{123}} %%BOX DRAWINGS HEAVY DOWN
+\definecharacter UnicodeLightLeftAndHeavyRight {\uchar{37}{124}} %%BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+\definecharacter UnicodeLightUpAndHeavyDown {\uchar{37}{125}} %%BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+\definecharacter UnicodeHeavyLeftAndLightRight {\uchar{37}{126}} %%BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+\definecharacter UnicodeHeavyUpAndLightDown {\uchar{37}{127}} %%BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+\definecharacter UnicodeUpperHalfBlock {\uchar{37}{128}} %%UPPER HALF BLOCK
+\definecharacter UnicodeLowerOneEighthBlock {\uchar{37}{129}} %%LOWER ONE EIGHTH BLOCK
+\definecharacter UnicodeLowerOneQuarterBlock {\uchar{37}{130}} %%LOWER ONE QUARTER BLOCK
+\definecharacter UnicodeLowerThreeEighthsBlock {\uchar{37}{131}} %%LOWER THREE EIGHTHS BLOCK
+\definecharacter UnicodeLowerHalfBlock {\uchar{37}{132}} %%LOWER HALF BLOCK
+\definecharacter UnicodeLowerFiveEighthsBlock {\uchar{37}{133}} %%LOWER FIVE EIGHTHS BLOCK
+\definecharacter UnicodeLowerThreeQuartersBlock {\uchar{37}{134}} %%LOWER THREE QUARTERS BLOCK
+\definecharacter UnicodeLowerSevenEighthsBlock {\uchar{37}{135}} %%LOWER SEVEN EIGHTHS BLOCK
+\definecharacter UnicodeFullBlock {\uchar{37}{136}} %%FULL BLOCK
+\definecharacter UnicodeLeftSevenEighthsBlock {\uchar{37}{137}} %%LEFT SEVEN EIGHTHS BLOCK
+\definecharacter UnicodeLeftThreeQuartersBlock {\uchar{37}{138}} %%LEFT THREE QUARTERS BLOCK
+\definecharacter UnicodeLeftFiveEighthsBlock {\uchar{37}{139}} %%LEFT FIVE EIGHTHS BLOCK
+\definecharacter UnicodeLeftHalfBlock {\uchar{37}{140}} %%LEFT HALF BLOCK
+\definecharacter UnicodeLeftThreeEighthsBlock {\uchar{37}{141}} %%LEFT THREE EIGHTHS BLOCK
+\definecharacter UnicodeLeftOneQuarterBlock {\uchar{37}{142}} %%LEFT ONE QUARTER BLOCK
+\definecharacter UnicodeLeftOneEighthBlock {\uchar{37}{143}} %%LEFT ONE EIGHTH BLOCK
+\definecharacter UnicodeRightHalfBlock {\uchar{37}{144}} %%RIGHT HALF BLOCK
+\definecharacter UnicodeLightShade {\uchar{37}{145}} %%LIGHT SHADE
+\definecharacter UnicodeMediumShade {\uchar{37}{146}} %%MEDIUM SHADE
+\definecharacter UnicodeDarkShade {\uchar{37}{147}} %%DARK SHADE
+\definecharacter UnicodeUpperOneEighthBlock {\uchar{37}{148}} %%UPPER ONE EIGHTH BLOCK
+\definecharacter UnicodeRightOneEighthBlock {\uchar{37}{149}} %%RIGHT ONE EIGHTH BLOCK
+\definecharacter UnicodeQuadrantLowerLeft {\uchar{37}{150}} %%[Unassigned U+2596]
+\definecharacter UnicodeQuadrantLowerRight {\uchar{37}{151}} %%[Unassigned U+2597]
+\definecharacter UnicodeQuadrantUpperLeft {\uchar{37}{152}} %%[Unassigned U+2598]
+\definecharacter UnicodeQuadrantUpperLeftAndLowerLeftAndLowerRight {\uchar{37}{153}} %%[Unassigned U+2599]
+\definecharacter UnicodeQuadrantUpperLeftAndLowerRight {\uchar{37}{154}} %%[Unassigned U+259A]
+\definecharacter UnicodeQuadrantUpperLeftAndUpperRightandLowerLeft {\uchar{37}{155}} %%[Unassigned U+259B]
+\definecharacter UnicodeQuadrantUpperLeftAndUpperRightAndLowerRight {\uchar{37}{156}} %%[Unassigned U+259C]
+\definecharacter UnicodeQuadrantUpperRight {\uchar{37}{157}} %%[Unassigned U+259D]
+\definecharacter UnicodeQuadrantUpperRightAndLowerLeft {\uchar{37}{158}} %%[Unassigned U+259E]
+\definecharacter UnicodeQuadrantUpperRightAndLowerLeftAndLowerRight {\uchar{37}{159}} %%[Unassigned U+259F]
+\definecharacter UnicodeBlackSquare {\uchar{37}{160}} %%BLACK SQUARE
+\definecharacter UnicodeWhiteSquare {\uchar{37}{161}} %%WHITE SQUARE
+\definecharacter UnicodeWhiteSquareWithRoundedCorners {\uchar{37}{162}} %%WHITE SQUARE WITH ROUNDED CORNERS
+\definecharacter UnicodeWhiteSquareContainingBlackSmallSquare {\uchar{37}{163}} %%WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+\definecharacter UnicodeSquareWithHorizontalFill {\uchar{37}{164}} %%SQUARE WITH HORIZONTAL FILL
+\definecharacter UnicodeSquareWithVerticalFill {\uchar{37}{165}} %%SQUARE WITH VERTICAL FILL
+\definecharacter UnicodeSquareWithOrthogonalCrosshatchFill {\uchar{37}{166}} %%SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+\definecharacter UnicodeSquareWithUpperLeftToLowerRightFill {\uchar{37}{167}} %%SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+\definecharacter UnicodeSquareWithUpperRightToLowerLeftFill {\uchar{37}{168}} %%SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+\definecharacter UnicodeSquareWithDiagonalCrosshatchFill {\uchar{37}{169}} %%SQUARE WITH DIAGONAL CROSSHATCH FILL
+\definecharacter UnicodeBlackSmallSquare {\uchar{37}{170}} %%BLACK SMALL SQUARE
+\definecharacter UnicodeWhiteSmallSquare {\uchar{37}{171}} %%WHITE SMALL SQUARE
+\definecharacter UnicodeBlackRectangle {\uchar{37}{172}} %%BLACK RECTANGLE
+\definecharacter UnicodeWhiteRectangle {\uchar{37}{173}} %%WHITE RECTANGLE
+\definecharacter UnicodeBlackVerticalRectangle {\uchar{37}{174}} %%BLACK VERTICAL RECTANGLE
+\definecharacter UnicodeWhiteVerticalRectangle {\uchar{37}{175}} %%WHITE VERTICAL RECTANGLE
+\definecharacter UnicodeBlackParallelogram {\uchar{37}{176}} %%BLACK PARALLELOGRAM
+\definecharacter UnicodeWhiteParallelogram {\uchar{37}{177}} %%WHITE PARALLELOGRAM
+\definecharacter UnicodeBlackUpPointingTriangle {\uchar{37}{178}} %%BLACK UP-POINTING TRIANGLE
+\definecharacter UnicodeWhiteUpPointingTriangle {\uchar{37}{179}} %%WHITE UP-POINTING TRIANGLE
+\definecharacter UnicodeBlackUpPointingSmallTriangle {\uchar{37}{180}} %%BLACK UP-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteUpPointingSmallTriangle {\uchar{37}{181}} %%WHITE UP-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackRightPointingTriangle {\uchar{37}{182}} %%BLACK RIGHT-POINTING TRIANGLE
+\definecharacter UnicodeWhiteRightPointingTriangle {\uchar{37}{183}} %%WHITE RIGHT-POINTING TRIANGLE
+\definecharacter UnicodeBlackRightPointingSmallTriangle {\uchar{37}{184}} %%BLACK RIGHT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteRightPointingSmallTriangle {\uchar{37}{185}} %%WHITE RIGHT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackRightPointingPointer {\uchar{37}{186}} %%BLACK RIGHT-POINTING POINTER
+\definecharacter UnicodeWhiteRightPointingPointer {\uchar{37}{187}} %%WHITE RIGHT-POINTING POINTER
+\definecharacter UnicodeBlackDownPointingTriangle {\uchar{37}{188}} %%BLACK DOWN-POINTING TRIANGLE
+\definecharacter UnicodeWhiteDownPointingTriangle {\uchar{37}{189}} %%WHITE DOWN-POINTING TRIANGLE
+\definecharacter UnicodeBlackDownPointingSmallTriangle {\uchar{37}{190}} %%BLACK DOWN-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteDownPointingSmallTriangle {\uchar{37}{191}} %%WHITE DOWN-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackLeftPointingTriangle {\uchar{37}{192}} %%BLACK LEFT-POINTING TRIANGLE
+\definecharacter UnicodeWhiteLeftPointingTriangle {\uchar{37}{193}} %%WHITE LEFT-POINTING TRIANGLE
+\definecharacter UnicodeBlackLeftPointingSmallTriangle {\uchar{37}{194}} %%BLACK LEFT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeWhiteLeftPointingSmallTriangle {\uchar{37}{195}} %%WHITE LEFT-POINTING SMALL TRIANGLE
+\definecharacter UnicodeBlackLeftPointingPointer {\uchar{37}{196}} %%BLACK LEFT-POINTING POINTER
+\definecharacter UnicodeWhiteLeftPointingPointer {\uchar{37}{197}} %%WHITE LEFT-POINTING POINTER
+\definecharacter UnicodeBlackDiamond {\uchar{37}{198}} %%BLACK DIAMOND
+\definecharacter UnicodeWhiteDiamond {\uchar{37}{199}} %%WHITE DIAMOND
+\definecharacter UnicodeWhiteDiamondContainingBlackSmallDiamond {\uchar{37}{200}} %%WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+\definecharacter UnicodeFisheye {\uchar{37}{201}} %%FISHEYE
+\definecharacter UnicodeLozenge {\uchar{37}{202}} %%LOZENGE
+\definecharacter UnicodeWhiteCircle {\uchar{37}{203}} %%WHITE CIRCLE
+\definecharacter UnicodeDottedCircle {\uchar{37}{204}} %%DOTTED CIRCLE
+\definecharacter UnicodeCircleWithVerticalFill {\uchar{37}{205}} %%CIRCLE WITH VERTICAL FILL
+\definecharacter UnicodeBullseye {\uchar{37}{206}} %%BULLSEYE
+\definecharacter UnicodeBlackCircle {\uchar{37}{207}} %%BLACK CIRCLE
+\definecharacter UnicodeCircleWithLeftHalfBlack {\uchar{37}{208}} %%CIRCLE WITH LEFT HALF BLACK
+\definecharacter UnicodeCircleWithRightHalfBlack {\uchar{37}{209}} %%CIRCLE WITH RIGHT HALF BLACK
+\definecharacter UnicodeCircleWithLowerHalfBlack {\uchar{37}{210}} %%CIRCLE WITH LOWER HALF BLACK
+\definecharacter UnicodeCircleWithUpperHalfBlack {\uchar{37}{211}} %%CIRCLE WITH UPPER HALF BLACK
+\definecharacter UnicodeCircleWithUpperRightQuadrantBlack {\uchar{37}{212}} %%CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+\definecharacter UnicodeCircleWithAllButUpperLeftQuadrantBlack {\uchar{37}{213}} %%CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+\definecharacter UnicodeLeftHalfBlackCircle {\uchar{37}{214}} %%LEFT HALF BLACK CIRCLE
+\definecharacter UnicodeRightHalfBlackCircle {\uchar{37}{215}} %%RIGHT HALF BLACK CIRCLE
+\definecharacter UnicodeInverseBullet {\uchar{37}{216}} %%INVERSE BULLET
+\definecharacter UnicodeInverseWhiteCircle {\uchar{37}{217}} %%INVERSE WHITE CIRCLE
+\definecharacter UnicodeUpperHalfInverseWhiteCircle {\uchar{37}{218}} %%UPPER HALF INVERSE WHITE CIRCLE
+\definecharacter UnicodeLowerHalfInverseWhiteCircle {\uchar{37}{219}} %%LOWER HALF INVERSE WHITE CIRCLE
+\definecharacter UnicodeUpperLeftQuadrantCircularArc {\uchar{37}{220}} %%UPPER LEFT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeUpperRightQuadrantCircularArc {\uchar{37}{221}} %%UPPER RIGHT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeLowerRightQuadrantCircularArc {\uchar{37}{222}} %%LOWER RIGHT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeLowerLeftQuadrantCircularArc {\uchar{37}{223}} %%LOWER LEFT QUADRANT CIRCULAR ARC
+\definecharacter UnicodeUpperHalfCircle {\uchar{37}{224}} %%UPPER HALF CIRCLE
+\definecharacter UnicodeLowerHalfCircle {\uchar{37}{225}} %%LOWER HALF CIRCLE
+\definecharacter UnicodeBlackLowerRightTriangle {\uchar{37}{226}} %%BLACK LOWER RIGHT TRIANGLE
+\definecharacter UnicodeBlackLowerLeftTriangle {\uchar{37}{227}} %%BLACK LOWER LEFT TRIANGLE
+\definecharacter UnicodeBlackUpperLeftTriangle {\uchar{37}{228}} %%BLACK UPPER LEFT TRIANGLE
+\definecharacter UnicodeBlackUpperRightTriangle {\uchar{37}{229}} %%BLACK UPPER RIGHT TRIANGLE
+\definecharacter UnicodeWhiteBullet {\uchar{37}{230}} %%WHITE BULLET
+\definecharacter UnicodeSquareWithLeftHalfBlack {\uchar{37}{231}} %%SQUARE WITH LEFT HALF BLACK
+\definecharacter UnicodeSquareWithRightHalfBlack {\uchar{37}{232}} %%SQUARE WITH RIGHT HALF BLACK
+\definecharacter UnicodeSquareWithUpperLeftDiagonalHalfBlack {\uchar{37}{233}} %%SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+\definecharacter UnicodeSquareWithLowerRightDiagonalHalfBlack {\uchar{37}{234}} %%SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+\definecharacter UnicodeWhiteSquareWithVerticalBisectingLine {\uchar{37}{235}} %%WHITE SQUARE WITH VERTICAL BISECTING LINE
+\definecharacter UnicodeWhiteUpPointingTriangleWithDot {\uchar{37}{236}} %%WHITE UP-POINTING TRIANGLE WITH DOT
+\definecharacter UnicodeUpPointingTriangleWithLeftHalfBlack {\uchar{37}{237}} %%UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+\definecharacter UnicodeUpPointingTriangleWithRightHalfBlack {\uchar{37}{238}} %%UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+\definecharacter UnicodeLargeCircle {\uchar{37}{239}} %%LARGE CIRCLE
+\definecharacter UnicodeWhiteSquareWithUpperLeftQuadrant {\uchar{37}{240}} %%WHITE SQUARE WITH UPPER LEFT QUADRANT
+\definecharacter UnicodeWhiteSquareWithLowerLeftQuadrant {\uchar{37}{241}} %%WHITE SQUARE WITH LOWER LEFT QUADRANT
+\definecharacter UnicodeWhiteSquareWithLowerRightQuadrant {\uchar{37}{242}} %%WHITE SQUARE WITH LOWER RIGHT QUADRANT
+\definecharacter UnicodeWhiteSquareWithUpperRightQuadrant {\uchar{37}{243}} %%WHITE SQUARE WITH UPPER RIGHT QUADRANT
+\definecharacter UnicodeWhiteCircleWithUpperLeftQuadrant {\uchar{37}{244}} %%WHITE CIRCLE WITH UPPER LEFT QUADRANT
+\definecharacter UnicodeWhiteCircleWithLowerLeftQuadrant {\uchar{37}{245}} %%WHITE CIRCLE WITH LOWER LEFT QUADRANT
+\definecharacter UnicodeWhiteCircleWithLowerRightQuadrant {\uchar{37}{246}} %%WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+\definecharacter UnicodeWhiteCircleWithUpperRightQuadrant {\uchar{37}{247}} %%WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+\definecharacter UnicodeUpperLeftTriangle {\uchar{37}{248}} %%[Unassigned U+25F8]
+\definecharacter UnicodeUpperRightTriangle {\uchar{37}{249}} %%[Unassigned U+25F9]
+\definecharacter UnicodeLowerLeftTriangle {\uchar{37}{250}} %%[Unassigned U+25FA]
+\definecharacter UnicodeWhiteMediumSquare {\uchar{37}{251}} %%[Unassigned U+25FB]
+\definecharacter UnicodeBlackMediumSquare {\uchar{37}{252}} %%[Unassigned U+25FC]
+\definecharacter UnicodeWhiteMediumSmallSquare {\uchar{37}{253}} %%[Unassigned U+25FD]
+\definecharacter UnicodeBlackMediumSmallSquare {\uchar{37}{254}} %%[Unassigned U+25FE]
+\definecharacter UnicodeLowerRightTriangle {\uchar{37}{255}} %%[Unassigned U+25FF]
+
+\stopencoding
+
+\endinput
+
diff --git a/tex/context/base/enco-acc.mkii b/tex/context/base/enco-acc.mkii
new file mode 100644
index 000000000..e02536be6
--- /dev/null
+++ b/tex/context/base/enco-acc.mkii
@@ -0,0 +1,139 @@
+%D \module
+%D [ file=enco-acc,
+%D version=2000.20.12, % split from base file
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Composed Characters Commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen \& Ton Otten]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Although it is technically possible to redefine the commands
+%D that are responsible for building composed characters, this
+%D is seldom needed, since they map onto named glyphs. The
+%D meaning of these names glyphs may change, although their
+%D visual appearance seldom will.
+
+\startencoding[default]
+
+\defineaccent ^ A {\Acircumflex} \defineaccent ^ a {\acircumflex}
+\defineaccent ^ C {\Ccircumflex} \defineaccent ^ c {\ccircumflex}
+\defineaccent ^ E {\Ecircumflex} \defineaccent ^ e {\ecircumflex}
+\defineaccent ^ G {\Gcircumflex} \defineaccent ^ g {\gcircumflex}
+\defineaccent ^ H {\Hcircumflex} \defineaccent ^ h {\hcircumflex}
+\defineaccent ^ I {\Icircumflex} \defineaccent ^ i {\icircumflex} \defineaccent ^ {\i} {\icircumflex}
+\defineaccent ^ J {\Jcircumflex} \defineaccent ^ j {\jcircumflex} \defineaccent ^ {\j} {\jcircumflex}
+\defineaccent ^ O {\Ocircumflex} \defineaccent ^ o {\ocircumflex}
+\defineaccent ^ S {\Scircumflex} \defineaccent ^ s {\scircumflex}
+\defineaccent ^ U {\Ucircumflex} \defineaccent ^ u {\ucircumflex}
+\defineaccent ^ W {\Wcircumflex} \defineaccent ^ w {\wcircumflex}
+\defineaccent ^ Y {\Ycircumflex} \defineaccent ^ y {\ycircumflex}
+
+\defineaccent ` A {\Agrave} \defineaccent ` a {\agrave}
+\defineaccent ` E {\Egrave} \defineaccent ` e {\egrave}
+\defineaccent ` I {\Igrave} \defineaccent ` i {\igrave} \defineaccent ` {\i} {\igrave}
+\defineaccent ` O {\Ograve} \defineaccent ` o {\ograve}
+\defineaccent ` U {\Ugrave} \defineaccent ` u {\ugrave}
+\defineaccent ` Y {\Ygrave} \defineaccent ` y {\ygrave}
+
+\defineaccent ~ A {\Atilde} \defineaccent ~ a {\atilde}
+\defineaccent ~ I {\Itilde} \defineaccent ~ i {\itilde} \defineaccent ~ {\i} {\itilde}
+\defineaccent ~ O {\Otilde} \defineaccent ~ o {\otilde}
+\defineaccent ~ U {\Utilde} \defineaccent ~ u {\utilde}
+
+\defineaccent " A {\Adiaeresis} \defineaccent " a {\adiaeresis}
+\defineaccent " E {\Ediaeresis} \defineaccent " e {\ediaeresis}
+\defineaccent " I {\Idiaeresis} \defineaccent " i {\idiaeresis} \defineaccent " {\i} {\idiaeresis}
+\defineaccent " O {\Odiaeresis} \defineaccent " o {\odiaeresis}
+\defineaccent " U {\Udiaeresis} \defineaccent " u {\udiaeresis}
+\defineaccent " Y {\Ydiaeresis} \defineaccent " y {\ydiaeresis}
+
+\defineaccent ' A {\Aacute} \defineaccent ' a {\aacute}
+\defineaccent ' C {\Cacute} \defineaccent ' c {\cacute}
+\defineaccent ' E {\Eacute} \defineaccent ' e {\eacute}
+\defineaccent ' I {\Iacute} \defineaccent ' i {\iacute} \defineaccent ' {\i} {\iacute}
+\defineaccent ' L {\Lacute} \defineaccent ' l {\lacute}
+\defineaccent ' N {\Nacute} \defineaccent ' n {\nacute}
+\defineaccent ' O {\Oacute} \defineaccent ' o {\oacute}
+\defineaccent ' R {\Racute} \defineaccent ' r {\racute}
+\defineaccent ' S {\Sacute} \defineaccent ' s {\sacute}
+\defineaccent ' U {\Uacute} \defineaccent ' u {\uacute}
+\defineaccent ' Y {\Yacute} \defineaccent ' y {\yacute}
+\defineaccent ' Z {\Zacute} \defineaccent ' z {\zacute}
+
+\defineaccent . C {\Cdotaccent} \defineaccent . c {\cdotaccent}
+\defineaccent . E {\Edotaccent} \defineaccent . e {\edotaccent}
+\defineaccent . G {\Gdotaccent} \defineaccent . g {\gdotaccent}
+\defineaccent . I {\Idotaccent} \defineaccent . i {\idotaccent} \defineaccent . {\i} {\idotaccent}
+\defineaccent . Z {\Zdotaccent} \defineaccent . z {\zdotaccent}
+
+\defineaccent = A {\Amacron} \defineaccent = a {\amacron}
+\defineaccent = E {\Emacron} \defineaccent = e {\emacron}
+\defineaccent = I {\Imacron} \defineaccent = i {\imacron} \defineaccent = {\i} {\imacron}
+\defineaccent = O {\Omacron} \defineaccent = o {\omacron}
+\defineaccent = U {\Umacron} \defineaccent = u {\umacron}
+
+\defineaccent c C {\Ccedilla} \defineaccent c c {\ccedilla}
+\defineaccent c K {\Kcedilla} \defineaccent c k {\kcedilla}
+\defineaccent c L {\Lcedilla} \defineaccent c l {\lcedilla}
+\defineaccent c N {\Ncedilla} \defineaccent c n {\ncedilla}
+\defineaccent c R {\Rcedilla} \defineaccent c r {\rcedilla}
+\defineaccent c S {\Scedilla} \defineaccent c s {\scedilla}
+\defineaccent c T {\Tcedilla} \defineaccent c t {\tcedilla}
+
+\defineaccent H O {\Ohungarumlaut} \defineaccent H o {\ohungarumlaut}
+\defineaccent H u {\uhungarumlaut} \defineaccent H U {\Uhungarumlaut}
+
+\defineaccent k A {\Aogonek} \defineaccent k a {\aogonek}
+\defineaccent k E {\Eogonek} \defineaccent k e {\eogonek}
+\defineaccent k I {\Iogonek} \defineaccent k i {\iogonek}
+\defineaccent k U {\Uogonek} \defineaccent k u {\uogonek}
+
+\defineaccent r A {\Aring} \defineaccent r a {\aring}
+\defineaccent r U {\Uring} \defineaccent r u {\uring}
+
+\defineaccent u A {\Abreve} \defineaccent u a {\abreve}
+\defineaccent u E {\Ebreve} \defineaccent u e {\ebreve}
+\defineaccent u G {\Gbreve} \defineaccent u g {\gbreve}
+\defineaccent u I {\Ibreve} \defineaccent u i {\ibreve} \defineaccent u {\i} {\ibreve}
+\defineaccent u O {\Obreve} \defineaccent u o {\obreve}
+\defineaccent u U {\Ubreve} \defineaccent u u {\ubreve}
+
+\defineaccent v C {\Ccaron} \defineaccent v c {\ccaron}
+\defineaccent v D {\Dcaron} \defineaccent v d {\dcaron}
+\defineaccent v E {\Ecaron} \defineaccent v e {\ecaron}
+\defineaccent v L {\Lcaron} \defineaccent v l {\lcaron}
+\defineaccent v N {\Ncaron} \defineaccent v n {\ncaron}
+\defineaccent v R {\Rcaron} \defineaccent v r {\rcaron}
+\defineaccent v S {\Scaron} \defineaccent v s {\scaron}
+\defineaccent v T {\Tcaron} \defineaccent v t {\tcaron}
+\defineaccent v Z {\Zcaron} \defineaccent v z {\zcaron}
+
+\stopencoding
+
+\startencoding[default]
+
+% vietnamese: if needed, \useencoding[enco-vna]
+
+\stopencoding
+
+% For Tobias Burnus, who wants:
+%
+% \starttypen
+% \setupinteraction[state=start]
+% \setupinteractionscreen[option=bookmark]
+% \placebookmarks[chapter]
+%
+% \starttext \chapter{F\"ur Na\"ive und Na\"\i ve} \stoptext
+% \stoptypen
+
+\startencoding[default]
+
+ \defineaccent " {\i} {\idiaeresis}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-agr.mkii b/tex/context/base/enco-agr.mkii
new file mode 100644
index 000000000..cfd86dfd3
--- /dev/null
+++ b/tex/context/base/enco-agr.mkii
@@ -0,0 +1,364 @@
+%D \module
+%D [ file=enco-agr,
+%D version=2005.02.20,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Ancient Greek,
+%D author=Thomas A. Schmitz,
+%D date=\currentdate]
+
+\startmapping[agr]
+
+ \definecasemaps 13 to 64 lc 0 uc 0
+ \definecasemaps 65 to 66 lc +32 uc 0
+ \definecasemaps 67 to 67 lc 0 uc 0
+ \definecasemaps 68 to 85 lc +32 uc 0
+ \definecasemaps 86 to 86 lc 0 uc 0
+ \definecasemaps 87 to 90 lc +32 uc 0
+ \definecasemaps 91 to 255 lc 0 uc 0
+
+\stopmapping
+
+\startencoding[agr]
+
+\definecharacter greeksigmalunate 1
+\definecharacter endash 2
+\definecharacter emdash 3
+\definecharacter apostrophe 4
+\definecharacter greekaltbeta 5
+\definecharacter epih 6
+
+\definecharacter textbraceleft 8
+\definecharacter textbraceright 9
+\definecharacter textbreve 10
+
+\definecharacter greekSigmalunate 13
+\definecharacter greekIotadialytika 14
+\definecharacter greekUpsilondialytika 15
+
+\definecharacter greekepsilonperispomeni 18
+\definecharacter greekomicronperispomeni 19
+\definecharacter greekepsilondasiaperispomeni 20
+\definecharacter greekomicrondasiaperispomeni 21
+\definecharacter greekepsilonpsiliperispomeni 22
+\definecharacter greekomicronpsiliperispomeni 23
+\definecharacter greekiotadialytikaperispomeni 24
+\definecharacter greekupsilondialytikaperispomeni 25
+\definecharacter greekdialytikaperispomeni 26
+
+\definecharacter textbottomdot 33
+\definecharacter greeksampi 34
+\definecharacter greekdigamma 35
+\definecharacter greekstigma 36
+\definecharacter greeknumkoppa 37
+\definecharacter greekkoppa 38
+\definecharacter guilsingleright 39
+
+\definecharacter textdag 43
+
+\definecharacter greekoxia 47
+
+\definecharacter greekanoteleia 59
+\definecharacter greekdasia 60
+
+\definecharacter greekpsili 62
+\definecharacter greekquestionmark 63
+\definecharacter dialytika 64
+\definecharacter greekAlpha 65
+\definecharacter greekBeta 66
+\definecharacter greekomegaiotasub 67
+\definecharacter greekDelta 68
+\definecharacter greekEpsilon 69
+\definecharacter greekPhi 70
+\definecharacter greekGamma 71
+\definecharacter greekEta 72
+\definecharacter greekIota 73
+\definecharacter greekTheta 74
+\definecharacter greekKappa 75
+\definecharacter greekLambda 76
+\definecharacter greekMu 77
+\definecharacter greekNu 78
+\definecharacter greekOmicron 79
+\definecharacter greekPi 80
+\definecharacter greekChi 81
+\definecharacter greekRho 82
+\definecharacter greekSigma 83
+\definecharacter greekTau 84
+\definecharacter greekUpsilon 85
+\definecharacter greeketaiotasub 86
+\definecharacter greekOmega 87
+\definecharacter greekXi 88
+\definecharacter greekPsi 89
+\definecharacter greekZeta 90
+\definecharacter bracketleft 91
+\definecharacter greekvaria 92
+\definecharacter bracketright 93
+\definecharacter greekperispomeni 94
+
+\definecharacter guilsingleleft 96
+
+% the above is a quote character
+\definecharacter greekalpha 97
+\definecharacter greekbeta 98
+\definecharacter greekfinalsigma 99
+\definecharacter greekdelta 100
+\definecharacter greekepsilon 101
+\definecharacter greekphi 102
+\definecharacter greekgamma 103
+\definecharacter greeketa 104
+\definecharacter greekiota 105
+\definecharacter greektheta 106
+\definecharacter greekkappa 107
+\definecharacter greeklambda 108
+\definecharacter greekmu 109
+\definecharacter greeknu 110
+\definecharacter greekomicron 111
+\definecharacter greekpi 112
+\definecharacter greekchi 113
+\definecharacter greekrho 114
+\definecharacter greeksigma 115
+\definecharacter greektau 116
+\definecharacter greekupsilon 117
+\definecharacter greekalphaiotasub 118
+\definecharacter greekomega 119
+\definecharacter greekxi 120
+\definecharacter greekpsi 121
+\definecharacter greekzeta 122
+\definecharacter floorleft 123
+\definecharacter textbar 124
+\definecharacter floorright 125
+\definecharacter greekperispomeni 126
+
+\definecharacter quotedblleft 128
+\definecharacter quotedblright 129
+\definecharacter exclam 130
+\definecharacter greekiotadasia 131
+\definecharacter greekiotapsili 132
+\definecharacter greekiotaoxia 133
+\definecharacter greekiotadasiatonos 134
+\definecharacter greekiotapsilitonos 135
+\definecharacter greekiotavaria 136
+\definecharacter greekiotadasiavaria 137
+\definecharacter greekiotapsilivaria 138
+\definecharacter greekiotaperispomeni 139
+\definecharacter greekiotadasiaperispomeni 140
+\definecharacter greekiotapsiliperispomeni 141
+\definecharacter greekiotadialytika 142
+\definecharacter greekiotadialytikatonos 143
+\definecharacter greekiotadialytikavaria 144
+\definecharacter greekdasiaperispomeni 145
+\definecharacter greekpsiliperispomeni 146
+\definecharacter greekdasiatonos 147
+\definecharacter greekpsilitonos 148
+\definecharacter greekdasiavaria 149
+\definecharacter greekpsilivaria 150
+\definecharacter greekdialytikatonos 151
+\definecharacter greekepsilondasia 152
+\definecharacter greekepsilonpsili 153
+\definecharacter greekepsilonoxia 154
+\definecharacter greekepsilondasiatonos 155
+\definecharacter greekepsilonpsilitonos 156
+\definecharacter greekepsilonvaria 157
+\definecharacter greekepsilondasiavaria 158
+\definecharacter greekepsilonpsilivaria 159
+\definecharacter greekdialytikavaria 160
+\definecharacter greekalphadasia 161
+\definecharacter greekalphapsili 162
+\definecharacter greekalphaoxia 163
+\definecharacter greekalphadasiatonos 164
+\definecharacter greekalphapsilitonos 165
+\definecharacter greekalphavaria 166
+\definecharacter greekalphadasiavaria 167
+\definecharacter greekalphapsilivaria 168
+\definecharacter greekalphaperispomeni 169
+\definecharacter greekalphadasiaperispomeni 170
+\definecharacter greekalphapsiliperispomeni 171
+\definecharacter greekalphaiotasubdasia 172
+\definecharacter greekalphaiotasubpsili 173
+\definecharacter greekalphaiotasubtonos 174
+\definecharacter greekalphaiotasubdasiatonos 175
+\definecharacter greekalphaiotasubpsilitonos 176
+\definecharacter greekalphaiotasubvaria 177
+\definecharacter greekalphaiotasubdasiavaria 178
+\definecharacter greekalphaiotasubpsilivaria 179
+\definecharacter greekalphaiotasubperispomeni 180
+\definecharacter greekalphaiotasubdasiaperispomeni 181
+\definecharacter greekalphaiotasubpsiliperispomeni 182
+\definecharacter greekrhodasia 183
+\definecharacter greekrhopsili 184
+\definecharacter greeketadasia 185
+\definecharacter greeketapsili 186
+\definecharacter greeketaoxia 187
+\definecharacter greeketadasiatonos 188
+\definecharacter greeketapsilitonos 189
+\definecharacter greeketavaria 190
+\definecharacter greeketadasiavaria 191
+\definecharacter greeketapsilivaria 192
+\definecharacter greeketaperispomeni 193
+\definecharacter greeketadasiaperispomeni 194
+\definecharacter greeketapsiliperispomeni 195
+\definecharacter textslash 196
+\definecharacter greeketaiotasubdasia 197
+\definecharacter greeketaiotasubpsili 198
+\definecharacter greeketaiotasubtonos 199
+\definecharacter greeketaiotasubdasiatonos 200
+\definecharacter greeketaiotasubpsilitonos 201
+\definecharacter greeketaiotasubvaria 202
+\definecharacter greeketaiotasubdasiavaria 203
+\definecharacter greeketaiotasubpsilivaria 204
+\definecharacter greeketaiotasubperispomeni 205
+\definecharacter greeketaiotasubdasiaperispomeni 206
+\definecharacter greeketaiotasubpsiliperispomeni 207
+\definecharacter greekomicrondasia 208
+\definecharacter greekomicronpsili 209
+\definecharacter greekomicronoxia 210
+\definecharacter greekomicrondasiatonos 211
+\definecharacter greekomicronpsilitonos 212
+\definecharacter greekomicronvaria 213
+\definecharacter greekomicrondasiavaria 214
+\definecharacter greekomicronpsilivaria 215
+\definecharacter greekupsilondasia 216
+\definecharacter greekupsilonpsili 217
+\definecharacter greekupsilonoxia 218
+\definecharacter greekupsilondasiatonos 219
+\definecharacter greekupsilonpsilitonos 220
+\definecharacter greekupsilonvaria 221
+\definecharacter greekupsilondasiavaria 222
+\definecharacter greekupsilonpsilivaria 223
+\definecharacter greekupsilonperispomeni 224
+\definecharacter greekupsilondasiaperispomeni 225
+\definecharacter greekupsilonpsiliperispomeni 226
+\definecharacter greekupsilondiaeresis 227
+\definecharacter greekupsilondialytikatonos 228
+\definecharacter greekupsilondialytikavaria 229
+\definecharacter greekomegadasia 230
+\definecharacter greekomegapsili 231
+\definecharacter greekomegaoxia 232
+\definecharacter greekomegadasiatonos 233
+\definecharacter greekomegapsilitonos 234
+\definecharacter greekomegavaria 235
+\definecharacter greekomegadasiavaria 236
+\definecharacter greekomegapsilivaria 237
+\definecharacter greekomegaperispomeni 238
+\definecharacter greekomegadasiaperispomeni 239
+\definecharacter greekomegapsiliperispomeni 240
+\definecharacter greekomegaiotasubdasia 241
+\definecharacter greekomegaiotasubpsili 242
+\definecharacter greekomegaiotasubtonos 243
+\definecharacter greekomegaiotasubdasiatonos 244
+\definecharacter greekomegaiotasubpsilitonos 245
+\definecharacter greekomegaiotasubvaria 246
+\definecharacter greekomegaiotasubdasiavaria 247
+\definecharacter greekomegaiotasubpsilivaria 248
+\definecharacter greekomegaiotasubperispomeni 249
+\definecharacter greekomegaiotasubdasiaperispomeni 250
+\definecharacter greekomegaiotasubpsiliperispomeni 251
+\definecharacter greeknumeralsign 254
+\definecharacter greeknumeralsignlower 255
+
+\stopencoding
+
+\startencoding[default]
+
+\definecharacter greekAlphapsili {\greekpsili \greekAlpha}
+\definecharacter greekAlphadasia {\greekdasia \greekAlpha}
+\definecharacter greekAlphapsilivaria {\greekpsilivaria \greekAlpha}
+\definecharacter greekAlphadasiavaria {\greekdasiavaria \greekAlpha}
+\definecharacter greekAlphapsilitonos {\greekpsilitonos \greekAlpha}
+\definecharacter greekAlphadasiatonos {\greekdasiatonos \greekAlpha}
+\definecharacter greekAlphapsiliperispomeni {\greekpsiliperispomeni \greekAlpha}
+\definecharacter greekAlphadasiaperispomeni {\greekdasiaperispomeni \greekAlpha}
+\definecharacter greekEpsilonpsili {\greekpsili \greekEpsilon}
+\definecharacter greekEpsilondasia {\greekdasia \greekEpsilon}
+\definecharacter greekEpsilonpsilivaria {\greekpsilivaria \greekEpsilon}
+\definecharacter greekEpsilondasiavaria {\greekdasiavaria \greekEpsilon}
+\definecharacter greekEpsilonpsilitonos {\greekpsilitonos \greekEpsilon}
+\definecharacter greekEpsilondasiatonos {\greekdasiatonos \greekEpsilon}
+\definecharacter greekEtapsili {\greekpsili \greekEta}
+\definecharacter greekEtadasia {\greekdasia \greekEta}
+\definecharacter greekEtapsilivaria {\greekpsilivaria \greekEta}
+\definecharacter greekEtadasiavaria {\greekdasiavaria \greekEta}
+\definecharacter greekEtapsilitonos {\greekpsilitonos \greekEta}
+\definecharacter greekEtadasiatonos {\greekdasiatonos \greekEta}
+\definecharacter greekEtapsiliperispomeni {\greekpsiliperispomeni \greekEta}
+\definecharacter greekEtadasiaperispomeni {\greekdasiaperispomeni \greekEta}
+\definecharacter greekIotapsili {\greekpsili \greekIota}
+\definecharacter greekIotadasia {\greekdasia \greekIota}
+\definecharacter greekIotapsilivaria {\greekpsilivaria \greekIota}
+\definecharacter greekIotadasiavaria {\greekdasiavaria \greekIota}
+\definecharacter greekIotapsilitonos {\greekpsilitonos \greekIota}
+\definecharacter greekIotadasiatonos {\greekdasiatonos \greekIota}
+\definecharacter greekIotapsiliperispomeni {\greekpsiliperispomeni \greekIota}
+\definecharacter greekIotadasiaperispomeni {\greekdasiaperispomeni \greekIota}
+\definecharacter greekOmicronpsili {\greekpsili \greekOmicron}
+\definecharacter greekOmicrondasia {\greekdasia \greekOmicron}
+\definecharacter greekOmicronpsilivaria {\greekpsilivaria \greekOmicron}
+\definecharacter greekOmicrondasiavaria {\greekdasiavaria \greekOmicron}
+\definecharacter greekOmicronpsilitonos {\greekpsilitonos \greekOmicron}
+\definecharacter greekOmicrondasiatonos {\greekdasiatonos \greekOmicron}
+\definecharacter greekUpsilondasia {\greekdasia \greekUpsilon}
+\definecharacter greekUpsilondasiavaria {\greekdasiavaria \greekUpsilon}
+\definecharacter greekUpsilondasiatonos {\greekdasiatonos \greekUpsilon}
+\definecharacter greekUpsilondasiaperispomeni {\greekdasiaperispomeni \greekUpsilon}
+\definecharacter greekOmegapsili {\greekpsili \greekOmega}
+\definecharacter greekOmegadasia {\greekdasia \greekOmega}
+\definecharacter greekOmegapsilivaria {\greekpsilivaria \greekOmega}
+\definecharacter greekOmegadasiavaria {\greekdasiavaria \greekOmega}
+\definecharacter greekOmegapsilitonos {\greekpsilitonos \greekOmega}
+\definecharacter greekOmegadasiatonos {\greekdasiatonos \greekOmega}
+\definecharacter greekOmegapsiliperispomeni {\greekpsiliperispomeni \greekOmega}
+\definecharacter greekOmegadasiaperispomeni {\greekdasiaperispomeni \greekOmega}
+\definecharacter greekAlphaiotasubpsili {\greekpsili \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasia {\greekdasia \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubpsilivaria {\greekpsilivaria \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasiavaria {\greekdasiavaria \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubpsilitonos {\greekpsilitonos \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasiatonos {\greekdasiatonos \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubpsiliperispomeni {\greekpsiliperispomeni \greekAlpha \greekiota}
+\definecharacter greekAlphaiotasubdasiaperispomeni {\greekdasiaperispomeni \greekAlpha \greekiota}
+\definecharacter greekEtaiotasubpsili {\greekpsili \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasia {\greekdasia \greekEta \greekiota}
+\definecharacter greekEtaiotasubpsilivaria {\greekpsilivaria \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasiavaria {\greekdasiavaria \greekEta \greekiota}
+\definecharacter greekEtaiotasubpsilitonos {\greekpsilitonos \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasiatonos {\greekdasiatonos \greekEta \greekiota}
+\definecharacter greekEtaiotasubpsiliperispomeni {\greekpsiliperispomeni \greekEta \greekiota}
+\definecharacter greekEtaiotasubdasiaperispomeni {\greekdasiaperispomeni \greekEta \greekiota}
+\definecharacter greekOmegaiotasubpsili {\greekpsili \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasia {\greekdasia \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubpsilivaria {\greekpsilivaria \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasiavaria {\greekdasiavaria \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubpsilitonos {\greekpsilitonos \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasiatonos {\greekdasiatonos \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubpsiliperispomeni {\greekpsiliperispomeni \greekOmega \greekiota}
+\definecharacter greekOmegaiotasubdasiaperispomeni {\greekdasiaperispomeni \greekOmega \greekiota}
+\definecharacter greekAlphavaria {\greekvaria \greekAlpha}
+\definecharacter greekAlphaoxia {\greekoxia \greekAlpha}
+\definecharacter greekAlphaiotasub {\greekAlpha \greekiota}
+\definecharacter greekEpsilonvaria {\greekvaria \greekEpsilon}
+\definecharacter greekEpsilonoxia {\greekoxia \greekEpsilon}
+\definecharacter greekEtavaria {\greekvaria \greekEta}
+\definecharacter greekEtaoxia {\greekoxia \greekEta}
+\definecharacter greekEtaiotasub {\greekEta \greekiota}
+\definecharacter greekIotavaria {\greekvaria \greekIota}
+\definecharacter greekIotaoxia {\greekoxia \greekIota}
+\definecharacter greekUpsilonvaria {\greekvaria \greekUpsilon}
+\definecharacter greekUpsilonoxia {\greekoxia \greekUpsilon}
+\definecharacter greekOmicronvaria {\greekvaria \greekOmicron}
+\definecharacter greekOmicronoxia {\greekoxia \greekOmicron}
+\definecharacter greekOmegavaria {\greekvaria \greekOmega}
+\definecharacter greekOmegaoxia {\greekoxia \greekOmega}
+\definecharacter greekOmegaiotasub {\greekOmega \greekiota}
+\definecharacter greekRhodasia {\greekdasia \greekRho}
+\definecharacter digamma {\greekdigamma}
+\definecharacter sampi {\greeksampi}
+\definecharacter stigma {\greekstigma}
+\definecharacter koppa {\greeknumkoppa}
+\definecharacter lunars {\greeksigmalunate}
+\definecharacter lunarS {\greekSigmalunate}
+\definecharacter halfbraceleft {\floorleft}
+\definecharacter halfbraceright {\floorright}
+\definecharacter crux {\textdag}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-ans.mkii b/tex/context/base/enco-ans.mkii
new file mode 100644
index 000000000..7a48b5b55
--- /dev/null
+++ b/tex/context/base/enco-ans.mkii
@@ -0,0 +1,237 @@
+%D \module
+%D [ file=enco-ans,
+%D version=2000.05.07, % 1995.01.01,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=\YandY\ texnansi Encoding,
+%D author={Patrick Gundlach, Hans Hagen},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is \YandY's texnansi encoding vector, which combines
+%D the best of the ansi encoding vector (prebuilt accented
+%D characters etc.) and some of \TEX's vectors.
+
+\startmapping[texnansi]
+
+\resetcaserange 128 to 158
+\resetcaserange 160 to 191
+\resetcaserange 215 to 215
+\resetcaserange 247 to 247
+
+\definecasemaps 192 to 214 lc +32 uc 0
+\definecasemaps 224 to 246 lc 0 uc -32
+\definecasemaps 216 to 222 lc +32 uc 0
+\definecasemaps 248 to 254 lc 0 uc -32
+
+\definecaseself 223
+\definecaseswap 156 140
+\definecaseswap 255 159
+
+% needed by some patterns:
+
+% \definecaseself 34 % quotedbl
+% \definecaseself 132 % quotedblbase
+% \definecaseself 147 % quotedblleft
+% \definecaseself 148 % quotedblright
+% \definecaseself 129 % quotesingle
+% \definecaseself 130 % quotesinglebase
+% \definecaseself 145 % quoteleft
+% \definecaseself 146 % quoteright
+
+\stopmapping
+
+\startencoding[texnansi]
+
+\definecharacter textacute 19
+\definecharacter textbreve 21
+\definecharacter textcaron 20
+\definecharacter textcedilla 184
+\definecharacter textcircumflex 94 % 136
+\definecharacter textdiaeresis 168
+\definecharacter textdotaccent 5
+\definecharacter textgrave 18
+\definecharacter texthungarumlaut 6
+\definecharacter textmacron 175
+\definecharacter textogonek 7
+\definecharacter textring 23
+\definecharacter texttilde 152
+
+\definecharacter dotlessi 16 % 105
+\definecharacter dotlessj 17
+
+\definecharacter endash 150 % lig
+\definecharacter emdash 151 % lig
+
+\definecharacter aeligature 230
+\definecharacter AEligature 198
+\definecharacter oeligature 156
+\definecharacter OEligature 140
+
+\definecharacter ssharp 223
+
+\definecharacter thorn 254
+\definecharacter Thorn 222
+
+\definecharacter Dstroke 208 % also Eth, mapped in enco-def
+\definecharacter eth 240
+
+\definecharacter exclamdown 161
+\definecharacter questiondown 191
+
+\definecharacter copyright 169
+\definecharacter registered 174
+\definecharacter trademark 153
+
+\definecharacter sectionmark 167
+\definecharacter paragraphmark 182
+
+\definecharacter onequarter 188
+\definecharacter onehalf 189
+\definecharacter threequarter 190
+
+\definecharacter onesuperior 185
+\definecharacter twosuperior 178
+\definecharacter threesuperior 179
+
+\definecharacter textcent 162 % ?
+\definecharacter textcurrency 164
+\definecharacter texteuro 1
+\definecharacter textflorin 131
+\definecharacter textsterling 163
+\definecharacter textyen 165
+
+\definecharacter percent 37
+\definecharacter perthousand 137
+
+\definecharacter softhyphen 45
+\definecharacter periodcentered 183
+
+\definecharacter textasciicircum 142
+\definecharacter textasciitilde 158
+\definecharacter textbackslash 92
+\definecharacter textbraceleft 123
+\definecharacter textbar 124
+\definecharacter textbraceright 125
+\definecharacter textunderscore 95
+
+\definecharacter textbrokenbar 166
+\definecharacter textbullet 149
+\definecharacter textdag 134
+\definecharacter textddag 135
+\definecharacter textdegree 176
+\definecharacter textdiv 247
+\definecharacter textellipsis 133
+\definecharacter textfraction 4
+\definecharacter textlognot 172
+\definecharacter textminus 143
+\definecharacter textmu 181
+\definecharacter textmultiply 215
+\definecharacter textpm 177
+
+\definecharacter quotedbl 34
+\definecharacter quotedblbase 132
+\definecharacter quotedblleft 147
+\definecharacter quotedblright 148
+
+\definecharacter quotesingle 129
+\definecharacter quotesinglebase 130
+
+\definecharacter quoteleft 145
+\definecharacter quoteright 146
+
+\definecharacter guilsingleleft 139
+\definecharacter guilsingleright 155
+\definecharacter leftguillemot 171
+\definecharacter rightguillemot 187
+
+\definecharacter aacute 225
+\definecharacter Aacute 193
+\definecharacter eacute 233
+\definecharacter Eacute 201
+\definecharacter iacute 237
+\definecharacter Iacute 205
+\definecharacter oacute 243
+\definecharacter Oacute 211
+\definecharacter uacute 250
+\definecharacter Uacute 218
+\definecharacter yacute 253
+\definecharacter Yacute 221
+
+\definecharacter scaron 154
+\definecharacter Scaron 138
+\definecharacter zcaron 157
+\definecharacter Zcaron 141
+
+\definecharacter ccedilla 231
+\definecharacter Ccedilla 199
+
+\definecharacter acircumflex 226
+\definecharacter Acircumflex 194
+\definecharacter ecircumflex 234
+\definecharacter Ecircumflex 202
+\definecharacter icircumflex 238
+\definecharacter Icircumflex 206
+\definecharacter ocircumflex 244
+\definecharacter Ocircumflex 212
+\definecharacter ucircumflex 251
+\definecharacter Ucircumflex 219
+
+\definecharacter adiaeresis 228
+\definecharacter Adiaeresis 196
+\definecharacter ediaeresis 235
+\definecharacter Ediaeresis 203
+\definecharacter idiaeresis 239
+\definecharacter Idiaeresis 207
+\definecharacter odiaeresis 246
+\definecharacter Odiaeresis 214
+\definecharacter udiaeresis 252
+\definecharacter Udiaeresis 220
+\definecharacter ydiaeresis 255
+\definecharacter Ydiaeresis 159
+
+\definecharacter agrave 224
+\definecharacter Agrave 192
+\definecharacter egrave 232
+\definecharacter Egrave 200
+\definecharacter igrave 236
+\definecharacter Igrave 204
+\definecharacter ograve 242
+\definecharacter Ograve 210
+\definecharacter ugrave 249
+\definecharacter Ugrave 217
+
+\definecharacter aring 229
+\definecharacter Aring 197
+
+\definecharacter Lstroke 128
+\definecharacter lstroke 144
+\definecharacter ostroke 248
+\definecharacter Ostoke 216
+
+\definecharacter atilde 227
+\definecharacter Atilde 195
+\definecharacter ntilde 241
+\definecharacter Ntilde 209
+\definecharacter otilde 245
+\definecharacter Otilde 213
+
+\stopencoding
+
+% will be replaced by math collection, fails anyway
+
+\startencoding[texnansi]
+
+\definecharacter mathgrave "7060
+\definecharacter mathacute "70B4
+\definecharacter mathhat "7088
+\definecharacter mathtilde "7098
+\definecharacter mathddot "70A8
+\definecharacter mathbar "70AF
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-cas.mkii b/tex/context/base/enco-cas.mkii
new file mode 100644
index 000000000..38d12f9fa
--- /dev/null
+++ b/tex/context/base/enco-cas.mkii
@@ -0,0 +1,143 @@
+%D \module
+%D [ file=enco-cas,
+%D version=2005.08.23,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Named Glyph Case Mapping,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D For quite some years \CONTEXT\ used a rather compact way of
+%D defining encoded characters as well as case maps. When late
+%D 2000 more advanced remapping features were needed (like pdf
+%D unicode remapping), named glyphs were introduced to keep the
+%D coding tables more readable. At the same time, we introduced
+%D named glyph case mapping.
+
+\defineULcharacter Acircumflex acircumflex
+\defineULcharacter Ccircumflex ccircumflex
+\defineULcharacter Ecircumflex ecircumflex
+\defineULcharacter Gcircumflex gcircumflex
+\defineULcharacter Hcircumflex hcircumflex
+\defineULcharacter Icircumflex icircumflex
+\defineULcharacter Jcircumflex jcircumflex
+\defineULcharacter Ocircumflex ocircumflex
+\defineULcharacter Scircumflex scircumflex
+\defineULcharacter Ucircumflex ucircumflex
+\defineULcharacter Wcircumflex wcircumflex
+\defineULcharacter Ycircumflex ycircumflex
+
+\defineULcharacter Agrave agrave
+\defineULcharacter Egrave egrave
+\defineULcharacter Igrave igrave
+\defineULcharacter Ograve ograve
+\defineULcharacter Ugrave ugrave
+\defineULcharacter Ygrave ygrave
+
+\defineULcharacter Atilde atilde
+\defineULcharacter Itilde itilde
+\defineULcharacter Otilde otilde
+\defineULcharacter Ntilde ntilde
+\defineULcharacter Utilde utilde
+
+\defineULcharacter Adiaeresis adiaeresis
+\defineULcharacter Ediaeresis ediaeresis
+\defineULcharacter Idiaeresis idiaeresis
+\defineULcharacter Odiaeresis odiaeresis
+\defineULcharacter Udiaeresis udiaeresis
+\defineULcharacter Ydiaeresis ydiaeresis
+
+\defineULcharacter Aacute aacute
+\defineULcharacter Cacute cacute
+\defineULcharacter Eacute eacute
+\defineULcharacter Iacute iacute
+\defineULcharacter Lacute lacute
+\defineULcharacter Nacute nacute
+\defineULcharacter Oacute oacute
+\defineULcharacter Racute racute
+\defineULcharacter Sacute sacute
+\defineULcharacter Uacute uacute
+\defineULcharacter Yacute yacute
+\defineULcharacter Zacute zacute
+
+\defineULcharacter Dstroke dstroke
+\defineULcharacter Hstroke hstroke
+\defineULcharacter Lstroke lstroke
+\defineULcharacter Lslash lslash
+\defineULcharacter Ostroke ostroke
+\defineULcharacter Tstroke tstroke
+
+\defineULcharacter Cdotaccent cdotaccent
+\defineULcharacter Edotaccent edotaccent
+\defineULcharacter Gdotaccent gdotaccent
+\defineULcharacter Idotaccent idotaccent
+\defineULcharacter Zdotaccent zdotaccent
+
+\defineULcharacter Amacron amacron
+\defineULcharacter Emacron emacron
+\defineULcharacter Imacron imacron
+\defineULcharacter Omacron omacron
+\defineULcharacter Umacron umacron
+
+\defineULcharacter Ccedilla ccedilla
+\defineULcharacter Gcedilla gcedilla
+\defineULcharacter Kcedilla kcedilla
+\defineULcharacter Lcedilla lcedilla
+\defineULcharacter Ncedilla ncedilla
+\defineULcharacter Rcedilla rcedilla
+\defineULcharacter Scedilla scedilla
+\defineULcharacter Tcedilla tcedilla
+
+\defineULcharacter Ccommaaccent ccommaaccent
+\defineULcharacter Gcommaaccent gcommaaccent
+\defineULcharacter Kcommaaccent kcommaaccent
+\defineULcharacter Lcommaaccent lcommaaccent
+\defineULcharacter Ncommaaccent ncommaaccent
+\defineULcharacter Rcommaaccent rcommaaccent
+\defineULcharacter Scommaaccent scommaaccent
+\defineULcharacter Tcommaaccent tcommaaccent
+
+\defineULcharacter Ohungarumlaut ohungarumlaut
+\defineULcharacter Uhungarumlaut uhungarumlaut
+
+\defineULcharacter Aogonek aogonek
+\defineULcharacter Eogonek eogonek
+\defineULcharacter Iogonek iogonek
+\defineULcharacter Uogonek uogonek
+
+\defineULcharacter Aring aring
+\defineULcharacter Uring uring
+
+\defineULcharacter Abreve abreve
+\defineULcharacter Ebreve ebreve
+\defineULcharacter Gbreve gbreve
+\defineULcharacter Ibreve ibreve
+\defineULcharacter Obreve obreve
+\defineULcharacter Ubreve ubreve
+
+\defineULcharacter Ccaron ccaron
+\defineULcharacter Dcaron dcaron
+\defineULcharacter Ecaron ecaron
+\defineULcharacter Lcaron lcaron
+\defineULcharacter Ncaron ncaron
+\defineULcharacter Rcaron rcaron
+\defineULcharacter Scaron scaron
+\defineULcharacter Tcaron tcaron
+\defineULcharacter Zcaron zcaron
+
+\defineULcharacter dotlessI dotlessi
+\defineULcharacter dotlessJ dotlessj
+
+\defineULcharacter AEligature aeligature
+\defineULcharacter OEligature oeligature
+\defineULcharacter Ssharp ssharp
+\defineULcharacter IJligature ijligature
+
+\defineULcharacter Eth eth
+\defineULcharacter Thorn thorn
+
+\endinput
diff --git a/tex/context/base/enco-chi.mkii b/tex/context/base/enco-chi.mkii
new file mode 100644
index 000000000..9d77893a0
--- /dev/null
+++ b/tex/context/base/enco-chi.mkii
@@ -0,0 +1,371 @@
+%D \module
+%D [ file=enco-chi,
+%D version=1999.12.02,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Traditional and Simplified Chinese,
+%D author={Wang Lei \& 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.
+
+% actually this is also a filter -> enco-fcn.tex
+
+%D This is an experimental definition. Since we are dealing
+%D with unicode's, the registered values are not saved, so
+%D actually we're dealing with an pseudo encoding. The digits
+%D on the other hand are encoding specific.
+
+% chinese classes: left=1|right=2|center=3
+
+% untested, probably wrong
+
+\startencoding[cjk-uni]
+
+\defineuclass 1 32 24
+\defineuclass 1 32 28
+\defineuclass 1 48 20
+\defineuclass 1 48 8
+\defineuclass 1 48 10
+\defineuclass 1 48 12
+\defineuclass 1 48 14
+\defineuclass 1 48 22
+\defineuclass 1 48 16
+\defineuclass 1 255 8
+\defineuclass 1 255 59
+\defineuclass 1 255 64
+\defineuclass 1 255 91
+
+\defineuclass 3 0 183
+\defineuclass 3 0 168
+\defineuclass 3 32 38
+\defineuclass 3 255 30
+
+\defineuclass 2 48 1
+\defineuclass 2 48 2
+\defineuclass 2 32 20
+\defineuclass 2 255 94
+\defineuclass 2 32 25
+\defineuclass 2 32 29
+\defineuclass 2 48 21
+\defineuclass 2 48 9
+\defineuclass 2 48 11
+\defineuclass 2 48 13
+\defineuclass 2 48 15
+\defineuclass 2 48 23
+\defineuclass 2 48 17
+\defineuclass 2 34 55
+\defineuclass 2 0 176
+\defineuclass 2 32 50
+\defineuclass 2 32 51
+\defineuclass 2 255 1
+\defineuclass 2 255 2
+\defineuclass 2 255 7
+\defineuclass 2 255 9
+\defineuclass 2 255 12
+\defineuclass 2 255 14
+\defineuclass 2 255 26
+\defineuclass 2 255 27
+\defineuclass 2 255 31
+\defineuclass 2 255 61
+\defineuclass 2 255 93
+
+\defineudigit 0 37 203
+\defineudigit 1 78 0
+\defineudigit 2 78 140
+\defineudigit 3 78 9
+\defineudigit 4 86 219
+\defineudigit 5 78 148
+\defineudigit 6 81 109
+\defineudigit 7 78 3
+\defineudigit 8 81 107
+\defineudigit 9 78 93
+\defineudigit 10 83 65
+\defineudigit 100 118 126
+\defineudigit 1000 83 67
+\defineudigit 10000 78 7
+\defineudigit 100000000 78 191
+
+\defineudigit 0* 150 246
+\defineudigit 1* 88 249
+\defineudigit 2* 141 48
+\defineudigit 3* 83 193
+\defineudigit 4* 128 134
+\defineudigit 5* 79 13
+\defineudigit 6* 150 70
+\defineudigit 7* 103 210
+\defineudigit 8* 99 76
+\defineudigit 9* 115 150
+\defineudigit 10* 98 254
+\defineudigit 100* 79 112
+\defineudigit 1000* 78 223
+\defineudigit 10000* 132 44
+\defineudigit 100000000* 78 191
+
+\defineudigit 20 94 255
+\defineudigit 21 78 0
+\defineudigit 22 78 140
+\defineudigit 23 78 9
+\defineudigit 24 86 219
+\defineudigit 25 78 148
+\defineudigit 26 81 109
+\defineudigit 27 78 3
+\defineudigit 28 81 107
+\defineudigit 29 78 93
+
+\defineudigit 30 83 69
+\defineudigit 31 78 0
+\defineudigit 32 78 140
+\defineudigit 33 78 9
+\defineudigit 34 86 219
+\defineudigit 35 78 148
+\defineudigit 36 81 109
+\defineudigit 37 78 3
+\defineudigit 38 81 107
+\defineudigit 39 78 93
+
+\stopencoding
+
+% \doif \currentregime {utf} \endinput
+
+\startencoding[big5]
+
+\defineuclass 1 161 93
+\defineuclass 1 161 95
+\defineuclass 1 161 97
+\defineuclass 1 161 99
+\defineuclass 1 161 101
+\defineuclass 1 161 103
+\defineuclass 1 161 105
+\defineuclass 1 161 107
+\defineuclass 1 161 111
+\defineuclass 1 161 111
+\defineuclass 1 161 113
+\defineuclass 1 161 115
+\defineuclass 1 161 117
+\defineuclass 1 161 119
+\defineuclass 1 161 121
+\defineuclass 1 161 123
+\defineuclass 1 161 125
+\defineuclass 1 161 161
+\defineuclass 1 161 163
+\defineuclass 1 161 165
+\defineuclass 1 161 167
+\defineuclass 1 161 169
+\defineuclass 1 161 171
+
+\defineuclass 3 161 69
+\defineuclass 3 161 75
+\defineuclass 3 161 76
+
+\defineuclass 2 161 65
+\defineuclass 2 161 66
+\defineuclass 2 161 67
+\defineuclass 2 161 68
+\defineuclass 2 161 70
+\defineuclass 2 161 71
+\defineuclass 2 161 72
+\defineuclass 2 161 73
+\defineuclass 2 161 74
+\defineuclass 2 161 77
+\defineuclass 2 161 78
+\defineuclass 2 161 79
+\defineuclass 2 161 80
+\defineuclass 2 161 81
+\defineuclass 2 161 82
+\defineuclass 2 161 83
+\defineuclass 2 161 84
+\defineuclass 2 161 88
+\defineuclass 2 161 94
+\defineuclass 2 161 96
+\defineuclass 2 161 98
+\defineuclass 2 161 100
+\defineuclass 2 161 102
+\defineuclass 2 161 104
+\defineuclass 2 161 106
+\defineuclass 2 161 108
+\defineuclass 2 161 110
+\defineuclass 2 161 112
+\defineuclass 2 161 114
+\defineuclass 2 161 116
+\defineuclass 2 161 118
+\defineuclass 2 161 120
+\defineuclass 2 161 122
+\defineuclass 2 161 124
+\defineuclass 2 161 126
+\defineuclass 2 161 162
+\defineuclass 2 161 164
+\defineuclass 2 161 166
+\defineuclass 2 161 168
+\defineuclass 2 161 170
+\defineuclass 2 161 172
+\defineuclass 2 161 196
+\defineuclass 2 161 227
+\defineuclass 2 162 88
+\defineuclass 2 163 223
+
+\defineudigit 0 162 179
+\defineudigit 1 164 64
+\defineudigit 2 164 71
+\defineudigit 3 164 84
+\defineudigit 4 165 124
+\defineudigit 5 164 173
+\defineudigit 6 164 187
+\defineudigit 7 164 67
+\defineudigit 8 164 75
+\defineudigit 9 164 69
+\defineudigit 10 164 81
+\defineudigit 100 166 202
+\defineudigit 1000 164 100
+\defineudigit 10000 201 69
+\defineudigit 100000000 187 245
+
+\defineudigit 0* 185 115
+\defineudigit 1* 179 252
+\defineudigit 2* 182 76
+\defineudigit 3* 176 209
+\defineudigit 4* 184 118
+\defineudigit 5* 165 238
+\defineudigit 6* 179 176
+\defineudigit 7* 172 110
+\defineudigit 8* 174 195
+\defineudigit 9* 168 104
+\defineudigit 10* 172 66
+\defineudigit 100* 168 213
+\defineudigit 1000* 165 97
+\defineudigit 10000* 184 85
+\defineudigit 100000000* 187 245
+
+\defineudigit 20 164 220
+\defineudigit 21 164 64
+\defineudigit 22 164 71
+\defineudigit 23 164 84
+\defineudigit 24 165 124
+\defineudigit 25 164 173
+\defineudigit 26 164 187
+\defineudigit 27 164 67
+\defineudigit 28 164 75
+\defineudigit 29 164 69
+
+\defineudigit 30 164 202
+\defineudigit 31 164 64
+\defineudigit 32 164 71
+\defineudigit 33 164 84
+\defineudigit 34 165 124
+\defineudigit 35 164 173
+\defineudigit 36 164 187
+\defineudigit 37 164 67
+\defineudigit 38 164 75
+\defineudigit 39 164 69
+
+\stopencoding
+
+\startencoding[gbk]
+
+\defineuclass 1 161 174
+\defineuclass 1 161 176
+\defineuclass 1 161 178
+\defineuclass 1 161 180
+\defineuclass 1 161 182
+\defineuclass 1 161 184
+\defineuclass 1 161 186
+\defineuclass 1 161 188
+\defineuclass 1 161 190
+\defineuclass 1 163 168
+\defineuclass 1 163 219
+\defineuclass 1 163 224
+\defineuclass 1 163 251
+
+\defineuclass 3 161 164
+\defineuclass 3 161 167
+\defineuclass 3 161 173
+\defineuclass 3 163 190
+
+\defineuclass 2 161 162
+\defineuclass 2 161 163
+\defineuclass 2 161 170
+\defineuclass 2 161 171
+\defineuclass 2 161 175
+\defineuclass 2 161 177
+\defineuclass 2 161 179
+\defineuclass 2 161 181
+\defineuclass 2 161 183
+\defineuclass 2 161 185
+\defineuclass 2 161 187
+\defineuclass 2 161 189
+\defineuclass 2 161 191
+\defineuclass 2 161 203
+\defineuclass 2 161 227
+\defineuclass 2 161 228
+\defineuclass 2 161 229
+\defineuclass 2 163 161
+\defineuclass 2 163 162
+\defineuclass 2 163 167
+\defineuclass 2 163 169
+\defineuclass 2 163 172
+\defineuclass 2 163 174
+\defineuclass 2 163 186
+\defineuclass 2 163 187
+\defineuclass 2 163 191
+\defineuclass 2 163 221
+\defineuclass 2 163 253
+
+\defineudigit 0 161 240
+\defineudigit 1 210 187
+\defineudigit 2 182 254
+\defineudigit 3 200 253
+\defineudigit 4 203 196
+\defineudigit 5 206 229
+\defineudigit 6 193 249
+\defineudigit 7 198 223
+\defineudigit 8 176 203
+\defineudigit 9 190 197
+\defineudigit 10 202 174
+\defineudigit 100 176 217
+\defineudigit 1000 199 167
+\defineudigit 10000 205 242
+\defineudigit 100000000 210 218
+
+\defineudigit 0* 193 227
+\defineudigit 1* 210 188
+\defineudigit 2* 183 161
+\defineudigit 3* 200 254
+\defineudigit 4* 203 193
+\defineudigit 5* 206 233
+\defineudigit 6* 194 189
+\defineudigit 7* 198 226
+\defineudigit 8* 176 198
+\defineudigit 9* 190 193
+\defineudigit 10* 202 176
+\defineudigit 100* 176 219
+\defineudigit 1000* 199 170
+\defineudigit 10000* 200 102
+\defineudigit 100000000* 210 218
+
+\defineudigit 20 216 165
+\defineudigit 21 210 187
+\defineudigit 22 182 254
+\defineudigit 23 200 253
+\defineudigit 24 203 196
+\defineudigit 25 206 229
+\defineudigit 26 193 249
+\defineudigit 27 198 223
+\defineudigit 28 176 203
+\defineudigit 29 190 197
+
+\defineudigit 30 216 166
+\defineudigit 31 210 187
+\defineudigit 32 182 254
+\defineudigit 33 200 253
+\defineudigit 34 203 196
+\defineudigit 35 206 229
+\defineudigit 36 193 249
+\defineudigit 37 198 223
+\defineudigit 38 176 203
+\defineudigit 39 190 197
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-com.mkii b/tex/context/base/enco-com.mkii
new file mode 100644
index 000000000..42d0d4774
--- /dev/null
+++ b/tex/context/base/enco-com.mkii
@@ -0,0 +1,37 @@
+%D \module
+%D [ file=enco-com,
+%D version=2000.20.12, % split from base file
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Composed Characters Commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen \& Ton Otten]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Here we map some \quote {short} names onto the more
+%D verbose glyph names.
+
+\def\AA{\Aring}
+\def\aa{\aring}
+\def\AE{\AEligature}
+\def\ae{\aeligature}
+\def\CC{\Ccedilla}
+\def\cc{\ccedilla}
+\def \L{\Lstroke}
+\def \l{\lstroke}
+\def \O{\Ostroke}
+\def \o{\ostroke}
+\def\OE{\OEligature}
+\def\oe{\oeligature}
+\def\SZ{\Ssharp}
+\def\sz{\ssharp}
+\def\SS{\ssharp}
+\def\IJ{\IJligature}
+\def\ij{\ijligature}
+\def \i{\dotlessi}
+\def \j{\dotlessj}
+
+\endinput
diff --git a/tex/context/base/enco-cyr.mkii b/tex/context/base/enco-cyr.mkii
new file mode 100644
index 000000000..36bca82b5
--- /dev/null
+++ b/tex/context/base/enco-cyr.mkii
@@ -0,0 +1,1037 @@
+%D \module
+%D [ file=enco-cyr,
+%D version=2003.01.24,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Cyrillic,
+%D author=...,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The following kerning test is inspired by a test file
+%D provided by Victor Figurnov. I hope he still recognizes
+%D some bit and pieces.
+%D
+%D \starttyping
+%D \setupoutput[pdftex]
+%D
+%D \startMPenvironment[global]
+%D \useregime[cyr]
+%D \useencoding[cyr]
+%D \mainlanguage[ru]
+%D \enableregime[cp1251]
+%D \setupbodyfont[cyr]
+%D \stopMPenvironment
+%D
+%D \startbuffer
+%D \starttabulate[|l|l|l|]
+%D \NC \ruledhbox{} \NC \ruledhbox{AV} \NC with kerning \NC \NR
+%D \NC \ruledhbox{{}{}} \NC \ruledhbox{A{}V} \NC without kerning \NC \NR
+%D \NC \ruledhbox{\tfd } \NC \ruledhbox{\tfd AV} \NC with kerning \NC \NR
+%D \NC \ruledhbox{\tfd {}{}} \NC \ruledhbox{\tfd A{}V} \NC without kerning \NC \NR
+%D \stoptabulate
+%D
+%D \showkerning{ }
+%D \stopbuffer
+%D
+%D \starttext
+%D
+%D \title{Kerning test}
+%D
+%D \typebuffer
+%D
+%D \rm \subject{Serif font} \getbuffer
+%D \ss \subject{SansSerif font} \getbuffer
+%D \tt \subject{MonoSpacec font} \getbuffer
+%D
+%D \stoptext
+%D \stoptyping
+
+%D We start with a fallback, define by HH, who assumes that
+%D this is phonetic.
+
+\startmapping[t2a]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc 0 % base letters (russian)
+\definecasemaps 224 to 255 lc 0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc 0 % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc 0 uc -32
+
+\definecasemap 73 105 73 \definecasemap 105 105 73 % cyrillicII
+\definecasemap 74 106 74 \definecasemap 106 106 74 % cyrillicJE
+\definecasemap 81 113 81 \definecasemap 113 113 81 % cyrillicQ
+\definecasemap 87 119 87 \definecasemap 119 119 87 % cyrillicW
+
+\stopmapping
+
+\startencoding[t2a]
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter texthungarumlaut 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter textogonek 12
+
+\definecharacter textcyrillicflex 18
+\definecharacter textdblgrave 19
+\definecharacter textcyrillicbreve 20
+
+\definecharacter endash 21
+\definecharacter emdash 22
+
+\definecharacter textcompwordmark 23
+\definecharacter textbackslash 92
+\definecharacter textasciicircum 94
+\definecharacter textunderscore 95
+\definecharacter textbraceleft 123
+\definecharacter textbraceright 125
+\definecharacter textasciitilde 126
+\definecharacter textnumero 157
+\definecharacter textcurrency 158
+\definecharacter sectionmark 159
+
+\definecharacter quotedbl 34
+\definecharacter quoteleft 96
+\definecharacter upperleftsingleninequote 39
+\definecharacter quotedblleft 16
+\definecharacter quotedblright 17
+\definecharacter lowerleftdoubleninequote 189
+\definecharacter upperrightdoublesixquote 16
+\definecharacter upperrightdoubleninequote 17
+\definecharacter quotedblbase 189
+
+\definecharacter cyrillicpalochka 13
+\definecharacter cyrilliclangle 14
+\definecharacter cyrillicrangle 15
+
+\definecharacter leftguillemot 190
+\definecharacter rightguillemot 191
+\definecharacter dotlessi 25
+
+\definecharacter cyrillicA 192
+\definecharacter cyrillica 224
+\definecharacter cyrillicB 193
+\definecharacter cyrillicb 225
+\definecharacter cyrillicV 194
+\definecharacter cyrillicv 226
+\definecharacter cyrillicG 195
+\definecharacter cyrillicg 227
+\definecharacter cyrillicD 196
+\definecharacter cyrillicd 228
+\definecharacter cyrillicE 197
+\definecharacter cyrillice 229
+\definecharacter cyrillicZH 198
+\definecharacter cyrilliczh 230
+\definecharacter cyrillicZ 199
+\definecharacter cyrillicz 231
+\definecharacter cyrillicI 200
+\definecharacter cyrillici 232
+\definecharacter cyrillicISHRT 201
+\definecharacter cyrillicishrt 233
+\definecharacter cyrillicK 202
+\definecharacter cyrillick 234
+\definecharacter cyrillicL 203
+\definecharacter cyrillicl 235
+\definecharacter cyrillicM 204
+\definecharacter cyrillicm 236
+\definecharacter cyrillicN 205
+\definecharacter cyrillicn 237
+\definecharacter cyrillicO 206
+\definecharacter cyrillico 238
+\definecharacter cyrillicP 207
+\definecharacter cyrillicp 239
+\definecharacter cyrillicR 208
+\definecharacter cyrillicr 240
+\definecharacter cyrillicS 209
+\definecharacter cyrillics 241
+\definecharacter cyrillicT 210
+\definecharacter cyrillict 242
+\definecharacter cyrillicU 211
+\definecharacter cyrillicu 243
+\definecharacter cyrillicF 212
+\definecharacter cyrillicf 244
+\definecharacter cyrillicH 213
+\definecharacter cyrillich 245
+\definecharacter cyrillicC 214
+\definecharacter cyrillicc 246
+\definecharacter cyrillicCH 215
+\definecharacter cyrillicch 247
+\definecharacter cyrillicSH 216
+\definecharacter cyrillicsh 248
+\definecharacter cyrillicSHCH 217
+\definecharacter cyrillicshch 249
+\definecharacter cyrillicHRDSN 218
+\definecharacter cyrillichrdsn 250
+\definecharacter cyrillicERY 219
+\definecharacter cyrillicery 251
+\definecharacter cyrillicSFTSN 220
+\definecharacter cyrillicsftsn 252
+\definecharacter cyrillicEREV 221
+\definecharacter cyrillicerev 253
+\definecharacter cyrillicYU 222
+\definecharacter cyrillicyu 254
+\definecharacter cyrillicYA 223
+\definecharacter cyrillicya 255
+\definecharacter cyrillicGUP 128
+\definecharacter cyrillicgup 160
+\definecharacter cyrillicGHCRS 129
+\definecharacter cyrillicghcrs 161
+\definecharacter cyrillicDJE 130
+\definecharacter cyrillicdje 162
+\definecharacter cyrillicTSHE 131
+\definecharacter cyrillictshe 163
+\definecharacter cyrillicSHHA 132
+\definecharacter cyrillicshha 164
+\definecharacter cyrillicZHDSC 133
+\definecharacter cyrilliczhdsc 165
+\definecharacter cyrillicZDSC 134
+\definecharacter cyrilliczdsc 166
+\definecharacter cyrillicLJE 135
+\definecharacter cyrilliclje 167
+\definecharacter cyrillicYI 136
+\definecharacter cyrillicyi 168
+\definecharacter cyrillicKDSC 137
+\definecharacter cyrillickdsc 169
+\definecharacter cyrillicKBEAK 138
+\definecharacter cyrillickbeak 170
+\definecharacter cyrillicKVCRS 139
+\definecharacter cyrillickvcrs 171
+\definecharacter cyrillicAE 140
+\definecharacter cyrillicae 172
+\definecharacter cyrillicNDSC 141
+\definecharacter cyrillicndsc 173
+\definecharacter cyrillicNG 142
+\definecharacter cyrillicng 174
+\definecharacter cyrillicDZE 143
+\definecharacter cyrillicdze 175
+\definecharacter cyrillicOTLD 144
+\definecharacter cyrillicotld 176
+\definecharacter cyrillicSDSC 145
+\definecharacter cyrillicsdsc 177
+\definecharacter cyrillicUSHRT 146
+\definecharacter cyrillicushrt 178
+\definecharacter cyrillicY 147
+\definecharacter cyrillicy 179
+\definecharacter cyrillicYHCRS 148
+\definecharacter cyrillicyhcrs 180
+\definecharacter cyrillicHDSC 149
+\definecharacter cyrillichdsc 181
+\definecharacter cyrillicDZHE 150
+\definecharacter cyrillicdzhe 182
+\definecharacter cyrillicCHVCRS 151
+\definecharacter cyrillicchvcrs 183
+\definecharacter cyrillicCHRDSC 152
+\definecharacter cyrillicchrdsc 184
+\definecharacter cyrillicIE 153
+\definecharacter cyrillicie 185
+\definecharacter cyrillicSCHWA 154
+\definecharacter cyrillicschwa 186
+\definecharacter cyrillicNJE 155
+\definecharacter cyrillicnje 187
+\definecharacter cyrillicYO 156
+\definecharacter cyrillicyo 188
+\definecharacter cyrillicII 73
+\definecharacter cyrillicii 105
+\definecharacter cyrillicJE 74
+\definecharacter cyrillicje 106
+\definecharacter cyrillicQ 81
+\definecharacter cyrillicq 113
+\definecharacter cyrillicW 87
+\definecharacter cyrillicw 119
+
+% \definecharacter textperthousand {\%\char 24 }
+% \definecharacter textpertenthousand {\%\char 24\char 24 }
+
+\definecharacter cyrillicgheupturn 160 % to satisfy the patterns
+
+\stopencoding
+
+\startmapping[t2b]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc 0 % base letters (russian)
+\definecasemaps 224 to 255 lc 0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc 0 % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc 0 uc -32
+
+\definecasemap 73 105 73 \definecasemap 105 105 73 % cyrillicII
+\definecasemap 74 106 74 \definecasemap 106 106 74 % cyrillicJE
+\definecasemap 81 113 81 \definecasemap 113 113 81 % cyrillicQ
+\definecasemap 83 115 83 \definecasemap 115 115 83 % cyrillicDZE
+\definecasemap 87 119 87 \definecasemap 119 119 87 % cyrillicW
+
+\stopmapping
+
+\startencoding[t2b]
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter texthungarumlaut 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter textogonek 12
+
+\definecharacter textcyrillicflex 18
+\definecharacter textdblgrave 19
+\definecharacter textcyrillicbreve 20
+
+\definecharacter endash 21
+\definecharacter emdash 22
+
+\definecharacter textcompwordmark 23
+\definecharacter textbackslash 92
+\definecharacter textasciicircum 94
+\definecharacter textunderscore 95
+\definecharacter textbraceleft 123
+\definecharacter textbraceright 125
+\definecharacter textasciitilde 126
+\definecharacter textnumero 157
+\definecharacter textcurrency 158
+\definecharacter sectionmark 159
+\definecharacter quotedbl 34
+\definecharacter quoteleft 96
+\definecharacter upperleftsingleninequote 39
+\definecharacter quotedblleft 16
+\definecharacter quotedblright 17
+\definecharacter lowerleftdoubleninequote 189
+
+\definecharacter upperrightdoublesixquote 16
+\definecharacter upperrightdoubleninequote 17
+\definecharacter quotedblbase 189
+
+\definecharacter cyrillicpalochka 13
+\definecharacter cyrilliclangle 14
+\definecharacter cyrillicrangle 15
+
+\definecharacter leftguillemot 190
+\definecharacter rightguillemot 191
+\definecharacter dotlessi 25
+
+\definecharacter cyrillicA 192
+\definecharacter cyrillica 224
+\definecharacter cyrillicB 193
+\definecharacter cyrillicb 225
+\definecharacter cyrillicV 194
+\definecharacter cyrillicv 226
+\definecharacter cyrillicG 195
+\definecharacter cyrillicg 227
+\definecharacter cyrillicD 196
+\definecharacter cyrillicd 228
+\definecharacter cyrillicE 197
+\definecharacter cyrillice 229
+\definecharacter cyrillicZH 198
+\definecharacter cyrilliczh 230
+\definecharacter cyrillicZ 199
+\definecharacter cyrillicz 231
+\definecharacter cyrillicI 200
+\definecharacter cyrillici 232
+\definecharacter cyrillicISHRT 201
+\definecharacter cyrillicishrt 233
+\definecharacter cyrillicK 202
+\definecharacter cyrillick 234
+\definecharacter cyrillicL 203
+\definecharacter cyrillicl 235
+\definecharacter cyrillicM 204
+\definecharacter cyrillicm 236
+\definecharacter cyrillicN 205
+\definecharacter cyrillicn 237
+\definecharacter cyrillicO 206
+\definecharacter cyrillico 238
+\definecharacter cyrillicP 207
+\definecharacter cyrillicp 239
+\definecharacter cyrillicR 208
+\definecharacter cyrillicr 240
+\definecharacter cyrillicS 209
+\definecharacter cyrillics 241
+\definecharacter cyrillicT 210
+\definecharacter cyrillict 242
+\definecharacter cyrillicU 211
+\definecharacter cyrillicu 243
+\definecharacter cyrillicF 212
+\definecharacter cyrillicf 244
+\definecharacter cyrillicH 213
+\definecharacter cyrillich 245
+\definecharacter cyrillicC 214
+\definecharacter cyrillicc 246
+\definecharacter cyrillicCH 215
+\definecharacter cyrillicch 247
+\definecharacter cyrillicSH 216
+\definecharacter cyrillicsh 248
+\definecharacter cyrillicSHCH 217
+\definecharacter cyrillicshch 249
+\definecharacter cyrillicHRDSN 218
+\definecharacter cyrillichrdsn 250
+\definecharacter cyrillicERY 219
+\definecharacter cyrillicery 251
+\definecharacter cyrillicSFTSN 220
+\definecharacter cyrillicsftsn 252
+\definecharacter cyrillicEREV 221
+\definecharacter cyrillicerev 253
+\definecharacter cyrillicYU 222
+\definecharacter cyrillicyu 254
+\definecharacter cyrillicYA 223
+\definecharacter cyrillicya 255
+\definecharacter cyrillicGDSCHCRS 128
+\definecharacter cyrillicgdschcrs 160
+\definecharacter cyrillicGHCRS 129
+\definecharacter cyrillicghcrs 161
+\definecharacter cyrillicGDSC 130
+\definecharacter cyrillicgdsc 162
+\definecharacter cyrillicGHK 131
+\definecharacter cyrillicghk 163
+\definecharacter cyrillicSHHA 132
+\definecharacter cyrillicshha 164
+\definecharacter cyrillicZHDSC 133
+\definecharacter cyrilliczhdsc 165
+\definecharacter cyrillicDELTA 134
+\definecharacter cyrillicdelta 166
+\definecharacter cyrillicABHDZE 135
+\definecharacter cyrillicabhdze 167
+\definecharacter cyrillicLJE 136
+\definecharacter cyrilliclje 168
+\definecharacter cyrillicKDSC 137
+\definecharacter cyrillickdsc 169
+\definecharacter cyrillicLDSC 138
+\definecharacter cyrillicldsc 170
+\definecharacter cyrillicKHK 139
+\definecharacter cyrillickhk 171
+\definecharacter cyrillicLHK 140
+\definecharacter cyrilliclhk 172
+\definecharacter cyrillicNDSC 141
+\definecharacter cyrillicndsc 173
+\definecharacter cyrillicNG 142
+\definecharacter cyrillicng 174
+\definecharacter cyrillicNHK 143
+\definecharacter cyrillicnhk 175
+\definecharacter cyrillicOTLD 144
+\definecharacter cyrillicotld 176
+\definecharacter cyrillicSACRS 145
+\definecharacter cyrillicsacrs 177
+\definecharacter cyrillicUSHRT 146
+\definecharacter cyrillicushrt 178
+\definecharacter cyrillicY 147
+\definecharacter cyrillicy 179
+\definecharacter cyrillicHHCRS 148
+\definecharacter cyrillichhcrs 180
+\definecharacter cyrillicHDSC 149
+\definecharacter cyrillichdsc 181
+\definecharacter cyrillicHHK 150
+\definecharacter cyrillichhk 182
+\definecharacter cyrillicCHLDSC 151
+\definecharacter cyrillicchldsc 183
+\definecharacter cyrillicCHRDSC 152
+\definecharacter cyrillicchrdsc 184
+\definecharacter cyrillicNJE 153
+\definecharacter cyrillicnje 185
+\definecharacter cyrillicSCHWA 154
+\definecharacter cyrillicschwa 186
+\definecharacter cyrillicEPS 155
+\definecharacter cyrilliceps 187
+\definecharacter cyrillicYO 156
+\definecharacter cyrillicyo 188
+\definecharacter cyrillicII 73
+\definecharacter cyrillicii 105
+\definecharacter cyrillicJE 74
+\definecharacter cyrillicje 106
+\definecharacter cyrillicQ 81
+\definecharacter cyrillicq 113
+\definecharacter cyrillicDZE 83
+\definecharacter cyrillicdze 115
+\definecharacter cyrillicW 87
+\definecharacter cyrillicw 119
+
+\stopencoding
+
+\startmapping[t2c]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc 0 % base letters (russian)
+\definecasemaps 224 to 255 lc 0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc 0 % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc 0 uc -32
+
+\definecasemap 73 105 73 \definecasemap 105 105 73 % cyrillicII
+\definecasemap 74 106 74 \definecasemap 106 106 74 % cyrillicJE
+\definecasemap 81 113 81 \definecasemap 113 113 81 % cyrillicQ
+\definecasemap 83 115 83 \definecasemap 115 115 83 % cyrillicDZE
+\definecasemap 87 119 87 \definecasemap 119 119 87 % cyrillicW
+
+\stopmapping
+
+\startencoding[t2c]
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter texthungarumlaut 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter textogonek 12
+
+\definecharacter textcyrillicflex 18
+\definecharacter textdblgrave 19
+\definecharacter textcyrillicbreve 20
+
+\definecharacter endash 21
+\definecharacter emdash 22
+
+\definecharacter textcompwordmark 23
+\definecharacter textbackslash 92
+\definecharacter textasciicircum 94
+\definecharacter textunderscore 95
+\definecharacter textbraceleft 123
+\definecharacter textbraceright 125
+\definecharacter textasciitilde 126
+\definecharacter textnumero 157
+\definecharacter textcurrency 158
+\definecharacter sectionmark 159
+\definecharacter quotedbl 34
+\definecharacter quoteleft 96
+\definecharacter upperleftsingleninequote 39
+\definecharacter quotedblleft 16
+\definecharacter quotedblright 17
+\definecharacter lowerleftdoubleninequote 189
+\definecharacter upperrightdoublesixquote 16
+\definecharacter upperrightdoubleninequote 17
+\definecharacter quotedblbase 189
+
+\definecharacter cyrillicpalochka 13
+\definecharacter cyrilliclangle 14
+\definecharacter cyrillicrangle 15
+
+\definecharacter leftguillemot 190
+\definecharacter rightguillemot 191
+
+\definecharacter dotlessi 25
+
+\definecharacter cyrillicA 192
+\definecharacter cyrillica 224
+\definecharacter cyrillicB 193
+\definecharacter cyrillicb 225
+\definecharacter cyrillicV 194
+\definecharacter cyrillicv 226
+\definecharacter cyrillicG 195
+\definecharacter cyrillicg 227
+\definecharacter cyrillicD 196
+\definecharacter cyrillicd 228
+\definecharacter cyrillicE 197
+\definecharacter cyrillice 229
+\definecharacter cyrillicZH 198
+\definecharacter cyrilliczh 230
+\definecharacter cyrillicZ 199
+\definecharacter cyrillicz 231
+\definecharacter cyrillicI 200
+\definecharacter cyrillici 232
+\definecharacter cyrillicISHRT 201
+\definecharacter cyrillicishrt 233
+\definecharacter cyrillicK 202
+\definecharacter cyrillick 234
+\definecharacter cyrillicL 203
+\definecharacter cyrillicl 235
+\definecharacter cyrillicM 204
+\definecharacter cyrillicm 236
+\definecharacter cyrillicN 205
+\definecharacter cyrillicn 237
+\definecharacter cyrillicO 206
+\definecharacter cyrillico 238
+\definecharacter cyrillicP 207
+\definecharacter cyrillicp 239
+\definecharacter cyrillicR 208
+\definecharacter cyrillicr 240
+\definecharacter cyrillicS 209
+\definecharacter cyrillics 241
+\definecharacter cyrillicT 210
+\definecharacter cyrillict 242
+\definecharacter cyrillicU 211
+\definecharacter cyrillicu 243
+\definecharacter cyrillicF 212
+\definecharacter cyrillicf 244
+\definecharacter cyrillicH 213
+\definecharacter cyrillich 245
+\definecharacter cyrillicC 214
+\definecharacter cyrillicc 246
+\definecharacter cyrillicCH 215
+\definecharacter cyrillicch 247
+\definecharacter cyrillicSH 216
+\definecharacter cyrillicsh 248
+\definecharacter cyrillicSHCH 217
+\definecharacter cyrillicshch 249
+\definecharacter cyrillicHRDSN 218
+\definecharacter cyrillichrdsn 250
+\definecharacter cyrillicERY 219
+\definecharacter cyrillicery 251
+\definecharacter cyrillicSFTSN 220
+\definecharacter cyrillicsftsn 252
+\definecharacter cyrillicEREV 221
+\definecharacter cyrillicerev 253
+\definecharacter cyrillicYU 222
+\definecharacter cyrillicyu 254
+\definecharacter cyrillicYA 223
+\definecharacter cyrillicya 255
+\definecharacter cyrillicPHK 128
+\definecharacter cyrillicphk 160
+\definecharacter cyrillicTETSE 129
+\definecharacter cyrillictetse 161
+\definecharacter cyrillicTDSC 130
+\definecharacter cyrillictdsc 162
+\definecharacter cyrillicGHK 131
+\definecharacter cyrillicghk 163
+\definecharacter cyrillicSHHA 132
+\definecharacter cyrillicshha 164
+\definecharacter cyrillicRDSC 133
+\definecharacter cyrillicrdsc 165
+\definecharacter cyrillicRTICK 134
+\definecharacter cyrillicrtick 166
+\definecharacter cyrillicABHDZE 135
+\definecharacter cyrillicabhdze 167
+\definecharacter cyrillicMDSC 136
+\definecharacter cyrillicmdsc 168
+\definecharacter cyrillicKDSC 137
+\definecharacter cyrillickdsc 169
+\definecharacter cyrillicLDSC 138
+\definecharacter cyrillicldsc 170
+\definecharacter cyrillicKHCRS 139
+\definecharacter cyrillickhcrs 171
+\definecharacter cyrillicLHK 140
+\definecharacter cyrilliclhk 172
+\definecharacter cyrillicNDSC 141
+\definecharacter cyrillicndsc 173
+\definecharacter cyrillicMHK 142
+\definecharacter cyrillicmhk 174
+\definecharacter cyrillicNHK 143
+\definecharacter cyrillicnhk 175
+\definecharacter cyrillicOTLD 144
+\definecharacter cyrillicotld 176
+\definecharacter cyrillicABHCH 145
+\definecharacter cyrillicabhch 177
+\definecharacter cyrillicABHCHDSC 146
+\definecharacter cyrillicabhchdsc 178
+\definecharacter cyrillicSEMISFTSN 147
+\definecharacter cyrillicsemisftsn 179
+\definecharacter cyrillicISHRTDSC 148
+\definecharacter cyrillicishrtdsc 180
+\definecharacter cyrillicHDSC 149
+\definecharacter cyrillichdsc 181
+\definecharacter cyrillicDZHE 150
+\definecharacter cyrillicdzhe 182
+\definecharacter cyrillicABHHA 151
+\definecharacter cyrillicabhha 183
+\definecharacter cyrillicCHRDSC 152
+\definecharacter cyrillicchrdsc 184
+\definecharacter cyrillicNLHK 153
+\definecharacter cyrillicnlhk 185
+\definecharacter cyrillicSCHWA 154
+\definecharacter cyrillicschwa 186
+\definecharacter cyrillicRHK 155
+\definecharacter cyrillicrhk 187
+\definecharacter cyrillicYO 156
+\definecharacter cyrillicyo 188
+\definecharacter cyrillicII 73
+\definecharacter cyrillicii 105
+\definecharacter cyrillicJE 74
+\definecharacter cyrillicje 106
+\definecharacter cyrillicQ 81
+\definecharacter cyrillicq 113
+\definecharacter cyrillicDZE 83
+\definecharacter cyrillicdze 115
+\definecharacter cyrillicW 87
+\definecharacter cyrillicw 119
+
+\stopencoding
+
+\startmapping[x2]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 192 to 223 lc +32 uc 0 % base letters (russian)
+\definecasemaps 224 to 255 lc 0 uc -32
+
+\definecasemaps 128 to 156 lc +32 uc 0 % extra letters (cyrillic and old-slav)
+\definecasemaps 160 to 188 lc 0 uc -32
+
+\definecasemaps 65 to 90 lc +32 uc 0 % more extra letters (cyrillic and old-slav)
+\definecasemaps 97 to 122 lc 0 uc -32
+
+\definecasemap 28 29 28 \definecasemap 29 29 28 % cyrillicNLHK
+\definecasemap 30 31 30 \definecasemap 31 31 30 % cyrillicDELTA
+
+\stopmapping
+
+\startencoding[x2]
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter texthungarumlaut 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter textogonek 12
+
+\definecharacter endash 21
+\definecharacter emdash 22
+
+\definecharacter textcompwordmark 23
+\definecharacter textvisiblespace 32
+\definecharacter textdollar 36
+\definecharacter textless 60
+\definecharacter textgreater 62
+\definecharacter textbackslash 92
+\definecharacter textasciicircum 94
+\definecharacter textunderscore 95
+\definecharacter textbraceleft 123
+\definecharacter textbar 124
+\definecharacter textbraceright 125
+\definecharacter textasciitilde 126
+\definecharacter textnumero 157
+\definecharacter textcurrency 158
+\definecharacter textsection 159
+\definecharacter sectionmark 159
+\definecharacter textquotedbl 34
+
+\definecharacter cyrillicpalochka 13
+\definecharacter cyrilliclangle 14
+\definecharacter cyrillicrangle 15
+
+\definecharacter leftguillemot 190
+\definecharacter rightguillemot 191
+
+\definecharacter upperleftsinglesixquote 96
+\definecharacter upperleftsingleninequote 39
+\definecharacter upperleftdoublesixquote 16
+\definecharacter upperleftdoubleninequote 17
+\definecharacter lowerleftdoubleninequote 189
+
+\definecharacter upperrightsinglesixquote 96
+\definecharacter upperrightsingleninequote 39
+\definecharacter upperrightdoublesixquote 16
+\definecharacter upperrightdoubleninequote 17
+\definecharacter lowerrightdoubleninequote 189
+
+\definecharacter cyrillicA 192
+\definecharacter cyrillica 224
+\definecharacter cyrillicB 193
+\definecharacter cyrillicb 225
+\definecharacter cyrillicV 194
+\definecharacter cyrillicv 226
+\definecharacter cyrillicG 195
+\definecharacter cyrillicg 227
+\definecharacter cyrillicD 196
+\definecharacter cyrillicd 228
+\definecharacter cyrillicE 197
+\definecharacter cyrillice 229
+\definecharacter cyrillicZH 198
+\definecharacter cyrilliczh 230
+\definecharacter cyrillicZ 199
+\definecharacter cyrillicz 231
+\definecharacter cyrillicI 200
+\definecharacter cyrillici 232
+\definecharacter cyrillicISHRT 201
+\definecharacter cyrillicishrt 233
+\definecharacter cyrillicK 202
+\definecharacter cyrillick 234
+\definecharacter cyrillicL 203
+\definecharacter cyrillicl 235
+\definecharacter cyrillicM 204
+\definecharacter cyrillicm 236
+\definecharacter cyrillicN 205
+\definecharacter cyrillicn 237
+\definecharacter cyrillicO 206
+\definecharacter cyrillico 238
+\definecharacter cyrillicP 207
+\definecharacter cyrillicp 239
+\definecharacter cyrillicR 208
+\definecharacter cyrillicr 240
+\definecharacter cyrillicS 209
+\definecharacter cyrillics 241
+\definecharacter cyrillicT 210
+\definecharacter cyrillict 242
+\definecharacter cyrillicU 211
+\definecharacter cyrillicu 243
+\definecharacter cyrillicF 212
+\definecharacter cyrillicf 244
+\definecharacter cyrillicH 213
+\definecharacter cyrillich 245
+\definecharacter cyrillicC 214
+\definecharacter cyrillicc 246
+\definecharacter cyrillicCH 215
+\definecharacter cyrillicch 247
+\definecharacter cyrillicSH 216
+\definecharacter cyrillicsh 248
+\definecharacter cyrillicSHCH 217
+\definecharacter cyrillicshch 249
+\definecharacter cyrillicHRDSN 218
+\definecharacter cyrillichrdsn 250
+\definecharacter cyrillicERY 219
+\definecharacter cyrillicery 251
+\definecharacter cyrillicSFTSN 220
+\definecharacter cyrillicsftsn 252
+\definecharacter cyrillicEREV 221
+\definecharacter cyrillicerev 253
+\definecharacter cyrillicYU 222
+\definecharacter cyrillicyu 254
+\definecharacter cyrillicYA 223
+\definecharacter cyrillicya 255
+\definecharacter cyrillicGUP 128
+\definecharacter cyrillicgup 160
+\definecharacter cyrillicGHCRS 129
+\definecharacter cyrillicghcrs 161
+\definecharacter cyrillicGDSC 130
+\definecharacter cyrillicgdsc 162
+\definecharacter cyrillicGHK 131
+\definecharacter cyrillicghk 163
+\definecharacter cyrillicSHHA 132
+\definecharacter cyrillicshha 164
+\definecharacter cyrillicZHDSC 133
+\definecharacter cyrilliczhdsc 165
+\definecharacter cyrillicZDSC 134
+\definecharacter cyrilliczdsc 166
+\definecharacter cyrillicABHDZE 135
+\definecharacter cyrillicabhdze 167
+\definecharacter cyrillicYI 136
+\definecharacter cyrillicyi 168
+\definecharacter cyrillicKDSC 137
+\definecharacter cyrillickdsc 169
+\definecharacter cyrillicKBEAK 138
+\definecharacter cyrillickbeak 170
+\definecharacter cyrillicKHK 139
+\definecharacter cyrillickhk 171
+\definecharacter cyrillicLHK 140
+\definecharacter cyrilliclhk 172
+\definecharacter cyrillicNDSC 141
+\definecharacter cyrillicndsc 173
+\definecharacter cyrillicNG 142
+\definecharacter cyrillicng 174
+\definecharacter cyrillicNHK 143
+\definecharacter cyrillicnhk 175
+\definecharacter cyrillicOTLD 144
+\definecharacter cyrillicotld 176
+\definecharacter cyrillicSDSC 145
+\definecharacter cyrillicsdsc 177
+\definecharacter cyrillicUSHRT 146
+\definecharacter cyrillicushrt 178
+\definecharacter cyrillicY 147
+\definecharacter cyrillicy 179
+\definecharacter cyrillicYHCRS 148
+\definecharacter cyrillicyhcrs 180
+\definecharacter cyrillicHDSC 149
+\definecharacter cyrillichdsc 181
+\definecharacter cyrillicHHK 150
+\definecharacter cyrillichhk 182
+\definecharacter cyrillicCHLDSC 151
+\definecharacter cyrillicchldsc 183
+\definecharacter cyrillicCHRDSC 152
+\definecharacter cyrillicchrdsc 184
+\definecharacter cyrillicIE 153
+\definecharacter cyrillicie 185
+\definecharacter cyrillicSCHWA 154
+\definecharacter cyrillicschwa 186
+\definecharacter cyrillicEPS 155
+\definecharacter cyrilliceps 187
+\definecharacter cyrillicYO 156
+\definecharacter cyrillicyo 188
+\definecharacter cyrillicAE 65
+\definecharacter cyrillicae 97
+\definecharacter cyrillicDJE 66
+\definecharacter cyrillicdje 98
+\definecharacter cyrillicTSHE 67
+\definecharacter cyrillictshe 99
+\definecharacter cyrillicABHCH 68
+\definecharacter cyrillicabhch 100
+\definecharacter cyrillicABHCHDSC 69
+\definecharacter cyrillicabhchdsc 101
+\definecharacter cyrillicKVCRS 70
+\definecharacter cyrillickvcrs 102
+\definecharacter cyrillicKHCRS 71
+\definecharacter cyrillickhcrs 103
+\definecharacter cyrillicLDSC 72
+\definecharacter cyrillicldsc 104
+\definecharacter cyrillicII 73
+\definecharacter cyrillicii 105
+\definecharacter cyrillicJE 74
+\definecharacter cyrillicje 106
+\definecharacter cyrillicLJE 75
+\definecharacter cyrilliclje 107
+\definecharacter cyrillicMDSC 76
+\definecharacter cyrillicmdsc 108
+\definecharacter cyrillicNJE 77
+\definecharacter cyrillicnje 109
+\definecharacter cyrillicABHHA 78
+\definecharacter cyrillicabhha 110
+\definecharacter cyrillicPHK 79
+\definecharacter cyrillicphk 111
+\definecharacter cyrillicRDSC 80
+\definecharacter cyrillicrdsc 112
+\definecharacter cyrillicQ 81
+\definecharacter cyrillicq 113
+\definecharacter cyrillicTDSC 82
+\definecharacter cyrillictdsc 114
+\definecharacter cyrillicDZE 83
+\definecharacter cyrillicdze 115
+\definecharacter cyrillicTETSE 84
+\definecharacter cyrillictetse 116
+\definecharacter cyrillicDZHE 85
+\definecharacter cyrillicdzhe 117
+\definecharacter cyrillicCHVCRS 86
+\definecharacter cyrillicchvcrs 118
+\definecharacter cyrillicW 87
+\definecharacter cyrillicw 119
+\definecharacter cyrillicYAT 88
+\definecharacter cyrillicyat 120
+\definecharacter cyrillicBYUS 89
+\definecharacter cyrillicbyus 121
+\definecharacter cyrillicIZH 90
+\definecharacter cyrillicizh 122
+\definecharacter cyrillicNLHK 28
+\definecharacter cyrillicnlhk 29
+\definecharacter cyrillicDELTA 30
+\definecharacter cyrillicdelta 31
+
+\stopencoding
+
+\startmapping[lcy]
+
+\resetcaserange 128 to 255
+
+\definecasemaps 128 to 143 lc +32 uc 0
+\definecasemaps 160 to 175 lc 0 uc -32
+
+\definecasemaps 144 to 159 lc +80 uc 0
+\definecasemaps 224 to 239 lc 0 uc -80
+
+\definecasemap 240 241 240 \definecasemap 241 241 240 % cyrillicYO
+\definecasemap 242 243 242 \definecasemap 243 243 242 % cyrillicGUP
+\definecasemap 244 245 244 \definecasemap 245 245 244 % cyrillicIE
+\definecasemap 244 247 244 \definecasemap 247 247 244 % cyrillicII
+\definecasemap 248 249 248 \definecasemap 249 249 248 % cyrillicYI
+\definecasemap 250 251 240 \definecasemap 241 241 240 % cyrillicUSHRT
+
+\stopmapping
+
+\startencoding[lcy]
+
+%D Characters 0 to 127 are as in normal cmr slots
+
+\definecharacter cyrillicA 128
+\definecharacter cyrillicB 129
+\definecharacter cyrillicV 130
+\definecharacter cyrillicG 131
+\definecharacter cyrillicD 132
+\definecharacter cyrillicE 133
+\definecharacter cyrillicZH 134
+\definecharacter cyrillicZ 135
+\definecharacter cyrillicI 136
+\definecharacter cyrillicISHRT 137
+\definecharacter cyrillicK 138
+\definecharacter cyrillicL 139
+\definecharacter cyrillicM 140
+\definecharacter cyrillicN 141
+\definecharacter cyrillicO 142
+\definecharacter cyrillicP 143
+\definecharacter cyrillicR 144
+\definecharacter cyrillicS 145
+\definecharacter cyrillicT 146
+\definecharacter cyrillicU 147
+\definecharacter cyrillicF 148
+\definecharacter cyrillicH 149
+\definecharacter cyrillicC 150
+\definecharacter cyrillicCH 151
+\definecharacter cyrillicSH 152
+\definecharacter cyrillicSHCH 153
+\definecharacter cyrillicHRDSN 154
+\definecharacter cyrillicERY 155
+\definecharacter cyrillicSFTSN 156
+\definecharacter cyrillicEREV 157
+\definecharacter cyrillicYU 158
+\definecharacter cyrillicYA 159
+\definecharacter cyrillica 160
+\definecharacter cyrillicb 161
+\definecharacter cyrillicv 162
+\definecharacter cyrillicg 163
+\definecharacter cyrillicd 164
+\definecharacter cyrillice 165
+\definecharacter cyrilliczh 166
+\definecharacter cyrillicz 167
+\definecharacter cyrillici 168
+\definecharacter cyrillicishrt 169
+\definecharacter cyrillick 170
+\definecharacter cyrillicl 171
+\definecharacter cyrillicm 172
+\definecharacter cyrillicn 173
+\definecharacter cyrillico 174
+\definecharacter cyrillicp 175
+\definecharacter cyrillicr 224
+\definecharacter cyrillics 225
+\definecharacter cyrillict 226
+\definecharacter cyrillicu 227
+\definecharacter cyrillicf 228
+\definecharacter cyrillich 229
+\definecharacter cyrillicc 230
+\definecharacter cyrillicch 231
+\definecharacter cyrillicsh 232
+\definecharacter cyrillicshch 233
+\definecharacter cyrillichrdsn 234
+\definecharacter cyrillicery 235
+\definecharacter cyrillicsftsn 236
+\definecharacter cyrillicerev 237
+\definecharacter cyrillicyu 238
+\definecharacter cyrillicya 239
+\definecharacter cyrillicYO 240
+\definecharacter cyrillicyo 241
+\definecharacter cyrillicGUP 242
+\definecharacter cyrillicgup 243
+\definecharacter cyrillicIE 244
+\definecharacter cyrillicie 245
+\definecharacter cyrillicII 246
+\definecharacter cyrillicii 247
+\definecharacter cyrillicYI 248
+\definecharacter cyrillicyi 249
+\definecharacter cyrillicUSHRT 250
+\definecharacter cyrillicushrt 251
+
+\definecharacter emdash 196
+\definecharacter textcurrency 197
+\definecharacter textnumero 252
+\definecharacter leftguillemot 253
+\definecharacter rightguillemot 254
+\definecharacter quotedblbase 255
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-def.mkii b/tex/context/base/enco-def.mkii
new file mode 100644
index 000000000..4d8e280cb
--- /dev/null
+++ b/tex/context/base/enco-def.mkii
@@ -0,0 +1,922 @@
+%D \module
+%D [ file=enco-def,
+%D version=2000.05.07, % 2000.20.12, % split from less verbose base file
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Default Character Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Instead of overloading plain \TEX\ macros (and keeping them
+%D available as an escape), we now use the more verbose
+%D definitions in this file. Since memory is less a problem
+%D these days, this verbosity has only a small price, but we
+%D gain readability. The following definitions are based on
+%D usage of the the original \TEX\ fonts, where composed
+%D characters were not part of the design. So, occasionally
+%D we have to revert to hacks. Thanks to all those users who
+%D helped me to fill in the details.
+
+\startencoding[default]
+
+\definecharacter textcomma ,
+\definecharacter textperiod .
+
+\definecharacter textacute 19
+\definecharacter textbottomdot 46
+\definecharacter textbreve 21
+\definecharacter textcaron 20
+\definecharacter textcedilla 24
+\definecharacter textcircumflex 94
+\definecharacter textdiaeresis 127
+\definecharacter textdotaccent 95
+\definecharacter textgrave 18
+\definecharacter texthungarumlaut 125
+\definecharacter textmacron 22
+\definecharacter textogonek 24 % fake
+\definecharacter textring 23
+\definecharacter texttilde 126
+
+\definecharacter textat 64 % for mojca
+
+\definecharacter textbottomcomma {\hbox{\lower.35ex\hbox{\tx,}}} % for mojca
+
+\definecharacter dotlessi {\char"10 }
+\definecharacter dotlessj {\char"11 }
+\definecharacter dotlessI {I}
+\definecharacter dotlessJ {J}
+
+\definecharacter endash 123
+\definecharacter emdash 124
+
+\definecharacter aeligature {\char26 } % "1A
+\definecharacter AEligature {\char29 } % "1D
+\definecharacter ijligature {ij}
+\definecharacter IJligature {IJ}
+\definecharacter oeligature {\char27 } % "1B
+\definecharacter OEligature {\char30 } % "1E
+
+\definecharacter ssharp {\char25 } % "19
+\definecharacter Ssharp {SS}
+
+\definecharacter thorn {\unknownchar}
+\definecharacter Thorn {\unknownchar}
+
+\definecharacter eth {\unknownchar} % mojca prefers this (was \dstroke)
+%definecharacter Eth {\unknownchar}
+\definecharacter Eth {\Dstroke} % mojca prefers this too
+
+\definecharacter exclamdown 60
+\definecharacter questiondown 62
+
+\definecharacter copyright {\encircled{\txx C}}
+\definecharacter registered {\encircled{\txx R}}
+\definecharacter trademark {\high{\txx TM}}
+
+\definecharacter sectionmark {\mathematics{\mathhexbox278}}
+\definecharacter paragraphmark {\mathematics{\mathhexbox27B}}
+
+\definecharacter onequarter {\vulgarfraction{1}{4}}
+\definecharacter onehalf {\vulgarfraction{1}{2}}
+\definecharacter threequarter {\vulgarfraction{3}{4}}
+
+\definecharacter onesuperior {\high{1}}
+\definecharacter twosuperior {\high{2}}
+\definecharacter threesuperior {\high{3}}
+
+\definecharacter textcent {c}
+\definecharacter textcurrency {\unknownchar}
+\definecharacter textdollar {\fakedollar}
+\definecharacter texteuro {E}
+\definecharacter textflorin {\fakeflorin}
+\definecharacter textsterling {\fakesterling}
+\definecharacter textyen {Y}
+
+\definecharacter ordfeminine {\high{\txx a}}
+\definecharacter ordmasculine {\high{\txx o}}
+
+\definecharacter percent {\fakepercent}
+\definecharacter perthousand {\fakeperthousand}
+
+\definecharacter softhyphen 45
+\definecharacter periodcentered {\hbox{\mathematics\cdot}}
+\definecharacter compoundwordmark 23
+
+\definecharacter textasciicircum 94
+\definecharacter textasciitilde 126
+\definecharacter textslash 47
+\definecharacter textbackslash {\tex{}} % todo
+\definecharacter textbraceleft {\mathematics\{}
+\definecharacter textbraceright {\mathematics\}}
+\definecharacter textunderscore {\fakeunderscore}
+\definecharacter textvisiblespace {\fakevisiblespace}
+
+\definecharacter textbrokenbar {\mathematics\vert}
+\definecharacter textbullet {\mathematics\bullet}
+\definecharacter textdag {\mathematics\dag}
+\definecharacter textddag {\mathematics\ddag}
+\definecharacter textdegree {\mathematics{{}^{\circ}}}
+\definecharacter textdiv {\mathematics\div}
+\definecharacter textellipsis {\mathematics\cdots}
+\definecharacter textfraction {\mathematics/}
+\definecharacter textlognot {\mathematics\neg}
+\definecharacter textminus {\mathematics-}
+\definecharacter textmu {\mathematics\mu}
+\definecharacter textmultiply {\mathematics\times}
+\definecharacter textpm {\mathematics\pm}
+
+\definecharacter quotedbl {"}
+\definecharacter quotedblbase {,,}
+\definecharacter quotedblleft {``}
+\definecharacter quotedblright {''}
+
+\definecharacter quotesingle {`}
+\definecharacter quotesinglebase {,}
+
+\definecharacter quoteleft {`}
+\definecharacter quoteright {'}
+
+\definecharacter guilsingleleft {\fakeleftsubguillemot }
+\definecharacter guilsingleright {\fakerightsubguillemot}
+
+\definecharacter leftguillemot {\fakeleftguillemot }
+\definecharacter rightguillemot {\fakerightguillemot}
+
+\definecharacter Acircumflex {\buildtextaccent\textcircumflex A}
+\definecharacter acircumflex {\buildtextaccent\textcircumflex a}
+\definecharacter Ccircumflex {\buildtextaccent\textcircumflex C}
+\definecharacter ccircumflex {\buildtextaccent\textcircumflex c}
+\definecharacter Ecircumflex {\buildtextaccent\textcircumflex E}
+\definecharacter ecircumflex {\buildtextaccent\textcircumflex e}
+\definecharacter Gcircumflex {\buildtextaccent\textcircumflex G}
+\definecharacter gcircumflex {\buildtextaccent\textcircumflex g}
+\definecharacter Hcircumflex {\buildtextaccent\textcircumflex H}
+\definecharacter hcircumflex {\buildtextaccent\textcircumflex h}
+\definecharacter Icircumflex {\buildtextaccent\textcircumflex \dotlessI}
+\definecharacter icircumflex {\buildtextaccent\textcircumflex \dotlessi}
+\definecharacter Jcircumflex {\buildtextaccent\textcircumflex \dotlessJ}
+\definecharacter jcircumflex {\buildtextaccent\textcircumflex \dotlessj}
+\definecharacter Ocircumflex {\buildtextaccent\textcircumflex O}
+\definecharacter ocircumflex {\buildtextaccent\textcircumflex o}
+\definecharacter Scircumflex {\buildtextaccent\textcircumflex S}
+\definecharacter scircumflex {\buildtextaccent\textcircumflex s}
+\definecharacter Ucircumflex {\buildtextaccent\textcircumflex U}
+\definecharacter ucircumflex {\buildtextaccent\textcircumflex u}
+\definecharacter Wcircumflex {\buildtextaccent\textcircumflex W}
+\definecharacter wcircumflex {\buildtextaccent\textcircumflex w}
+\definecharacter Ycircumflex {\buildtextaccent\textcircumflex Y}
+\definecharacter ycircumflex {\buildtextaccent\textcircumflex y}
+
+\definecharacter Agrave {\buildtextaccent\textgrave A}
+\definecharacter agrave {\buildtextaccent\textgrave a}
+\definecharacter Egrave {\buildtextaccent\textgrave E}
+\definecharacter egrave {\buildtextaccent\textgrave e}
+\definecharacter Igrave {\buildtextaccent\textgrave \dotlessI}
+\definecharacter igrave {\buildtextaccent\textgrave \dotlessi}
+\definecharacter Ograve {\buildtextaccent\textgrave O}
+\definecharacter ograve {\buildtextaccent\textgrave o}
+\definecharacter Ugrave {\buildtextaccent\textgrave U}
+\definecharacter ugrave {\buildtextaccent\textgrave u}
+\definecharacter Ygrave {\buildtextaccent\textgrave Y}
+\definecharacter ygrave {\buildtextaccent\textgrave y}
+
+\definecharacter Atilde {\buildtextaccent\texttilde A}
+\definecharacter atilde {\buildtextaccent\texttilde a}
+\definecharacter Itilde {\buildtextaccent\texttilde \dotlessI}
+\definecharacter itilde {\buildtextaccent\texttilde \dotlessi}
+\definecharacter Ntilde {\buildtextaccent\texttilde N}
+\definecharacter ntilde {\buildtextaccent\texttilde n}
+\definecharacter Otilde {\buildtextaccent\texttilde O}
+\definecharacter otilde {\buildtextaccent\texttilde o}
+\definecharacter Utilde {\buildtextaccent\texttilde U}
+\definecharacter utilde {\buildtextaccent\texttilde u}
+\definecharacter Ytilde {\buildtextaccent\texttilde Y}
+\definecharacter ytilde {\buildtextaccent\texttilde y}
+
+\definecharacter Adiaeresis {\buildtextaccent\textdiaeresis A}
+\definecharacter adiaeresis {\buildtextaccent\textdiaeresis a}
+\definecharacter Ediaeresis {\buildtextaccent\textdiaeresis E}
+\definecharacter ediaeresis {\buildtextaccent\textdiaeresis e}
+\definecharacter Idiaeresis {\buildtextaccent\textdiaeresis \dotlessI}
+\definecharacter idiaeresis {\buildtextaccent\textdiaeresis \dotlessi}
+\definecharacter Odiaeresis {\buildtextaccent\textdiaeresis O}
+\definecharacter odiaeresis {\buildtextaccent\textdiaeresis o}
+\definecharacter Udiaeresis {\buildtextaccent\textdiaeresis U}
+\definecharacter udiaeresis {\buildtextaccent\textdiaeresis u}
+\definecharacter Ydiaeresis {\buildtextaccent\textdiaeresis Y}
+\definecharacter ydiaeresis {\buildtextaccent\textdiaeresis y}
+
+\definecharacter Aacute {\buildtextaccent\textacute A}
+\definecharacter aacute {\buildtextaccent\textacute a}
+\definecharacter Cacute {\buildtextaccent\textacute C}
+\definecharacter cacute {\buildtextaccent\textacute c}
+\definecharacter Eacute {\buildtextaccent\textacute E}
+\definecharacter eacute {\buildtextaccent\textacute e}
+\definecharacter Iacute {\buildtextaccent\textacute \dotlessI}
+\definecharacter iacute {\buildtextaccent\textacute \dotlessi}
+\definecharacter Lacute {\buildtextaccent\textacute L}
+\definecharacter lacute {\buildtextaccent\textacute l}
+\definecharacter Nacute {\buildtextaccent\textacute N}
+\definecharacter nacute {\buildtextaccent\textacute n}
+\definecharacter Oacute {\buildtextaccent\textacute O}
+\definecharacter oacute {\buildtextaccent\textacute o}
+\definecharacter Racute {\buildtextaccent\textacute R}
+\definecharacter racute {\buildtextaccent\textacute r}
+\definecharacter Sacute {\buildtextaccent\textacute S}
+\definecharacter sacute {\buildtextaccent\textacute s}
+\definecharacter Uacute {\buildtextaccent\textacute U}
+\definecharacter uacute {\buildtextaccent\textacute u}
+\definecharacter Yacute {\buildtextaccent\textacute Y}
+\definecharacter yacute {\buildtextaccent\textacute y}
+\definecharacter Zacute {\buildtextaccent\textacute Z}
+\definecharacter zacute {\buildtextaccent\textacute z}
+
+%definecharacter Dstroke {D}
+%definecharacter dstroke {d}
+
+\definecharacter dstroke {\pseudoencodeddj}
+\definecharacter Dstroke {\pseudoencodedDJ}
+\definecharacter Hstroke {H}
+\definecharacter hstroke {h}
+\definecharacter Tstroke {T}
+\definecharacter tstroke {t}
+
+\definecharacter Cdotaccent {\buildtextaccent\textdotaccent C}
+\definecharacter cdotaccent {\buildtextaccent\textdotaccent c}
+\definecharacter Edotaccent {\buildtextaccent\textdotaccent E}
+\definecharacter edotaccent {\buildtextaccent\textdotaccent e}
+\definecharacter Gdotaccent {\buildtextaccent\textdotaccent G}
+\definecharacter gdotaccent {\buildtextaccent\textdotaccent g}
+\definecharacter Idotaccent {\buildtextaccent\textdotaccent \dotlessI}
+\definecharacter idotaccent {\buildtextaccent\textdotaccent \dotlessi}
+\definecharacter Zdotaccent {\buildtextaccent\textdotaccent Z}
+\definecharacter zdotaccent {\buildtextaccent\textdotaccent z}
+
+\definecharacter Amacron {\buildtextaccent\textmacron A}
+\definecharacter amacron {\buildtextaccent\textmacron a}
+\definecharacter Emacron {\buildtextaccent\textmacron E}
+\definecharacter emacron {\buildtextaccent\textmacron e}
+\definecharacter Imacron {\buildtextaccent\textmacron \dotlessI}
+\definecharacter imacron {\buildtextaccent\textmacron \dotlessi}
+\definecharacter Omacron {\buildtextaccent\textmacron O}
+\definecharacter omacron {\buildtextaccent\textmacron o}
+\definecharacter Umacron {\buildtextaccent\textmacron U}
+\definecharacter umacron {\buildtextaccent\textmacron u}
+
+\definecharacter Ccedilla {\buildtextcedilla C}
+\definecharacter ccedilla {\buildtextcedilla c}
+\definecharacter Kcedilla {\buildtextcedilla K}
+\definecharacter kcedilla {\buildtextcedilla k}
+\definecharacter Lcedilla {\buildtextcedilla L}
+\definecharacter lcedilla {\buildtextcedilla l}
+\definecharacter Ncedilla {\buildtextcedilla N}
+\definecharacter ncedilla {\buildtextcedilla n}
+\definecharacter Rcedilla {\buildtextcedilla R}
+\definecharacter rcedilla {\buildtextcedilla r}
+\definecharacter Scedilla {\buildtextcedilla S}
+\definecharacter scedilla {\buildtextcedilla s}
+\definecharacter Tcedilla {\buildtextcedilla T}
+\definecharacter tcedilla {\buildtextcedilla t}
+
+\definecharacter Ohungarumlaut {\buildtextaccent\texthungarumlaut O}
+\definecharacter ohungarumlaut {\buildtextaccent\texthungarumlaut o}
+\definecharacter Uhungarumlaut {\buildtextaccent\texthungarumlaut U}
+\definecharacter uhungarumlaut {\buildtextaccent\texthungarumlaut u}
+
+\definecharacter Aogonek {\buildtextogonek A}
+\definecharacter aogonek {\buildtextogonek a}
+\definecharacter Eogonek {\buildtextogonek E}
+\definecharacter eogonek {\buildtextogonek e}
+\definecharacter Iogonek {\buildtextogonek I}
+\definecharacter iogonek {\buildtextogonek i}
+\definecharacter Uogonek {\buildtextogonek U}
+\definecharacter uogonek {\buildtextogonek u}
+
+\definecharacter Aring {\buildtextaccent\textring A}
+\definecharacter aring {\buildtextaccent\textring a}
+\definecharacter Uring {\buildtextaccent\textring U}
+\definecharacter uring {\buildtextaccent\textring u}
+
+\definecharacter Abreve {\buildtextaccent\textbreve A}
+\definecharacter abreve {\buildtextaccent\textbreve a}
+\definecharacter Ebreve {\buildtextaccent\textbreve E}
+\definecharacter ebreve {\buildtextaccent\textbreve e}
+\definecharacter Gbreve {\buildtextaccent\textbreve G}
+\definecharacter gbreve {\buildtextaccent\textbreve g}
+\definecharacter Ibreve {\buildtextaccent\textbreve \dotlessI}
+\definecharacter ibreve {\buildtextaccent\textbreve \dotlessi}
+\definecharacter Obreve {\buildtextaccent\textbreve O}
+\definecharacter obreve {\buildtextaccent\textbreve o}
+\definecharacter Ubreve {\buildtextaccent\textbreve U}
+\definecharacter ubreve {\buildtextaccent\textbreve u}
+
+\definecharacter Ccaron {\buildtextaccent\textcaron C}
+\definecharacter ccaron {\buildtextaccent\textcaron c}
+\definecharacter Dcaron {\buildtextaccent\textcaron D}
+\definecharacter dcaron {\buildtextaccent\textcaron d}
+\definecharacter Ecaron {\buildtextaccent\textcaron E}
+\definecharacter ecaron {\buildtextaccent\textcaron e}
+\definecharacter Lcaron {\buildtextaccent\textcaron L}
+\definecharacter lcaron {\buildtextaccent\textcaron l}
+\definecharacter Ncaron {\buildtextaccent\textcaron N}
+\definecharacter ncaron {\buildtextaccent\textcaron n}
+\definecharacter Rcaron {\buildtextaccent\textcaron R}
+\definecharacter rcaron {\buildtextaccent\textcaron r}
+\definecharacter Scaron {\buildtextaccent\textcaron S}
+\definecharacter scaron {\buildtextaccent\textcaron s}
+\definecharacter Tcaron {\buildtextaccent\textcaron T}
+\definecharacter tcaron {\buildtextaccent\textcaron t}
+\definecharacter Ycaron {\buildtextaccent\textcaron Y}
+\definecharacter ycaron {\buildtextaccent\textcaron y}
+\definecharacter Zcaron {\buildtextaccent\textcaron Z}
+\definecharacter zcaron {\buildtextaccent\textcaron z}
+
+\definecharacter Lstroke {\hsmash{\char32}L}
+\definecharacter lstroke {\hsmash{\char32}l}
+\definecharacter Ostroke {\char31 } % "1F
+\definecharacter ostroke {\char28 } % "1C
+
+\definecharacter aumlaut {\moveaccent{-.1ex}\adiaeresis}
+\definecharacter eumlaut {\moveaccent{-.1ex}\ediaeresis}
+\definecharacter iumlaut {\moveaccent{-.1ex}\idiaeresis}
+\definecharacter oumlaut {\moveaccent{-.1ex}\odiaeresis}
+\definecharacter uumlaut {\moveaccent{-.1ex}\udiaeresis}
+
+\definecharacter Aumlaut {\smashaccent\Adiaeresis}
+\definecharacter Eumlaut {\smashaccent\Ediaeresis}
+\definecharacter Iumlaut {\smashaccent\Idiaeresis}
+\definecharacter Oumlaut {\smashaccent\Odiaeresis}
+\definecharacter Uumlaut {\smashaccent\Udiaeresis}
+
+\definecharacter scommaaccent {\buildtextbottomcomma s}
+\definecharacter Scommaaccent {\buildtextbottomcomma S}
+\definecharacter tcommaaccent {\buildtextbottomcomma t}
+\definecharacter Tcommaaccent {\buildtextbottomcomma T}
+\definecharacter lcommaaccent {\buildtextbottomcomma l}
+\definecharacter Lcommaaccent {\buildtextbottomcomma L}
+
+\definecharacter Etilde {\buildtextaccent\texttilde E}
+\definecharacter etilde {\buildtextaccent\texttilde e}
+
+\definecharacter Ahook {A}
+\definecharacter ahook {a}
+\definecharacter Ehook {E}
+\definecharacter ehook {e}
+\definecharacter Ihook {I}
+\definecharacter ihook {i}
+\definecharacter Ohook {O}
+\definecharacter ohook {o}
+\definecharacter Uhook {U}
+\definecharacter uhook {u}
+\definecharacter Yhook {Y}
+\definecharacter yhook {y}
+
+\definecharacter Acircumflexgrave {\Acircumflex}
+\definecharacter Acircumflexacute {\Acircumflex}
+\definecharacter Acircumflextilde {\Acircumflex}
+\definecharacter Acircumflexhook {\Acircumflex}
+\definecharacter acircumflexgrave {\acircumflex}
+\definecharacter acircumflexacute {\acircumflex}
+\definecharacter acircumflextilde {\acircumflex}
+\definecharacter acircumflexhook {\acircumflex}
+\definecharacter Ecircumflexgrave {\Ecircumflex}
+\definecharacter Ecircumflexacute {\Ecircumflex}
+\definecharacter Ecircumflextilde {\Ecircumflex}
+\definecharacter Ecircumflexhook {\Ecircumflex}
+\definecharacter ecircumflexgrave {\ecircumflex}
+\definecharacter ecircumflexacute {\ecircumflex}
+\definecharacter ecircumflextilde {\ecircumflex}
+\definecharacter ecircumflexhook {\ecircumflex}
+\definecharacter Ocircumflexgrave {\Ocircumflex}
+\definecharacter Ocircumflexacute {\Ocircumflex}
+\definecharacter Ocircumflextilde {\Ocircumflex}
+\definecharacter Ocircumflexhook {\Ocircumflex}
+\definecharacter ocircumflexgrave {\ocircumflex}
+\definecharacter ocircumflexacute {\ocircumflex}
+\definecharacter ocircumflextilde {\ocircumflex}
+\definecharacter ocircumflexhook {\ocircumflex}
+
+\definecharacter Abrevegrave {\Abreve}
+\definecharacter Abreveacute {\Abreve}
+\definecharacter Abrevetilde {\Abreve}
+\definecharacter Abrevehook {\Abreve}
+\definecharacter abrevegrave {\abreve}
+\definecharacter abreveacute {\abreve}
+\definecharacter abrevetilde {\abreve}
+\definecharacter abrevehook {\abreve}
+
+\definecharacter Adotbelow {\buildtextbottomdot A}
+\definecharacter adotbelow {\buildtextbottomdot a}
+\definecharacter Edotbelow {\buildtextbottomdot E}
+\definecharacter edotbelow {\buildtextbottomdot e}
+\definecharacter Idotbelow {\buildtextbottomdot I}
+\definecharacter idotbelow {\buildtextbottomdot i}
+\definecharacter Odotbelow {\buildtextbottomdot O}
+\definecharacter odotbelow {\buildtextbottomdot o}
+\definecharacter Udotbelow {\buildtextbottomdot U}
+\definecharacter udotbelow {\buildtextbottomdot u}
+\definecharacter Ydotbelow {\buildtextbottomdot Y}
+\definecharacter ydotbelow {\buildtextbottomdot y}
+
+\definecharacter Ohorndotbelow {\buildtextbottomdot\Ohorn}
+\definecharacter ohorndotbelow {\buildtextbottomdot\ohorn}
+\definecharacter Uhorndotbelow {\buildtextbottomdot\Uhorn}
+\definecharacter uhorndotbelow {\buildtextbottomdot\uhorn}
+
+\definecharacter Acircumflexdotbelow {\buildtextbottomdot\Acircumflex}
+\definecharacter acircumflexdotbelow {\buildtextbottomdot\acircumflex}
+\definecharacter Ecircumflexdotbelow {\buildtextbottomdot\Ecircumflex}
+\definecharacter ecircumflexdotbelow {\buildtextbottomdot\ecircumflex}
+\definecharacter Ocircumflexdotbelow {\buildtextbottomdot\Ocircumflex}
+\definecharacter ocircumflexdotbelow {\buildtextbottomdot\ocircumflex}
+\definecharacter Abrevedotbelow {\buildtextbottomdot\Abreve}
+\definecharacter abrevedotbelow {\buildtextbottomdot\abreve}
+
+\definecharacter Ohorn {O}
+\definecharacter Ohorngrave {\Ograve}
+\definecharacter Ohornacute {\Oacute}
+\definecharacter Ohorntilde {\Otilde}
+\definecharacter Ohornhook {O}
+\definecharacter ohorn {o}
+\definecharacter ohorngrave {\ograve}
+\definecharacter ohornacute {\oacute}
+\definecharacter ohorntilde {\otilde}
+\definecharacter ohornhook {o}
+\definecharacter Uhorn {U}
+\definecharacter Uhorngrave {\Ugrave}
+\definecharacter Uhornacute {\Uacute}
+\definecharacter Uhorntilde {\Utilde}
+\definecharacter Uhornhook {U}
+\definecharacter uhorn {u}
+\definecharacter uhorngrave {\ugrave}
+\definecharacter uhornacute {\uacute}
+\definecharacter uhorntilde {\utilde}
+\definecharacter uhornhook {u}
+
+\stopencoding
+
+%D Needed for transliterated chinese (provided by Tobias Burnus).
+
+\startencoding[default]
+
+\definecharacter acaron {\buildtextaccent\textcaron a} % U+01CE
+\definecharacter icaron {\buildtextaccent\textcaron \dotlessi} % U+01D0
+\definecharacter ocaron {\buildtextaccent\textcaron o} % U+01D2
+\definecharacter ucaron {\buildtextaccent\textcaron u} % U+01D4
+
+\stopencoding
+
+%D Greek (moved to here):
+
+\startencoding[default]
+
+% Uppercase Greek letters
+
+\definecharacter greekAlpha {\Alpha}
+\definecharacter greekBeta {\Beta}
+\definecharacter greekGamma {\Gamma}
+\definecharacter greekDelta {\Delta}
+\definecharacter greekEpsilon {\Epsilon}
+\definecharacter greekZeta {\Zeta}
+\definecharacter greekEta {\Eta}
+\definecharacter greekTheta {\Theta}
+\definecharacter greekIota {\Iota}
+\definecharacter greekKappa {\Kappa}
+\definecharacter greekLambda {\Lambda}
+\definecharacter greekMu {\Mu}
+\definecharacter greekNu {\Nu}
+\definecharacter greekXi {\Xi}
+\definecharacter greekOmicron {\Omicron}
+\definecharacter greekPi {\Pi}
+\definecharacter greekRho {\Rho}
+\definecharacter greekSigma {\Sigma}
+\definecharacter greekTau {\Tau}
+\definecharacter greekUpsilon {\Upsilon}
+\definecharacter greekPhi {\Phi}
+\definecharacter greekChi {\Chi}
+\definecharacter greekPsi {\Psi}
+\definecharacter greekOmega {\Omega}
+
+% Lowercase Greek letters
+
+\definecharacter greekalpha {\alpha}
+\definecharacter greekbeta {\beta}
+\definecharacter greekgamma {\gamma}
+\definecharacter greekdelta {\delta}
+\definecharacter greekepsilon {\varepsilon}
+\definecharacter greekepsilonalt {\epsilon}
+\definecharacter greekzeta {\zeta}
+\definecharacter greeketa {\eta}
+\definecharacter greektheta {\theta}
+\definecharacter greekthetaalt {\vartheta}
+\definecharacter greekiota {\iota}
+\definecharacter greekkappa {\kappa}
+\definecharacter greeklambda {\lambda}
+\definecharacter greekmu {\mu}
+\definecharacter greeknu {\nu}
+\definecharacter greekxi {\xi}
+\definecharacter greekomicron {\omicron}
+\definecharacter greekpi {\pi}
+\definecharacter greekrho {\rho}
+\definecharacter greeksigma {\sigma}
+\definecharacter greekfinalsigma {\varsigma}
+\definecharacter greektau {\tau}
+\definecharacter greekupsilon {\upsilon}
+\definecharacter greekphi {\varphi}
+\definecharacter greekphialt {\phi}
+\definecharacter greekchi {\chi}
+\definecharacter greekpsi {\psi}
+\definecharacter greekomega {\omega}
+
+% Accented Uppercase Greek letters
+
+\definecharacter greekAlphatonos {'A}
+\definecharacter greekEpsilontonos {'E}
+\definecharacter greekEtatonos {'H}
+\definecharacter greekIotatonos {'I}
+\definecharacter greekOmicrontonos {'O}
+\definecharacter greekUpsilontonos {'U}
+\definecharacter greekOmegatonos {'W}
+\definecharacter greekIotadialytika {"I}
+\definecharacter greekUpsilondialytika {"U}
+
+% Accented Lowercase Greek letters
+
+\definecharacter greekalphatonos {'a}
+\definecharacter greekepsilontonos {'e}
+\definecharacter greeketatonos {'h}
+\definecharacter greekiotatonos {'i}
+\definecharacter greekomicrontonos {'o}
+\definecharacter greekupsilontonos {'u}
+\definecharacter greekomegatonos {'w}
+\definecharacter greekiotadialytika {"i}
+\definecharacter greekupsilondialytika {"u}
+\definecharacter greekiotadialytikatonos {'"i}
+\definecharacter greekupsilondialytikatonos {'"u}
+
+% Miscellaneous Greek symbols
+
+\definecharacter greekleftquot {((}
+\definecharacter greekrightquot {))}
+\definecharacter greektonos {'}
+\definecharacter greekdialytikatonos {'"}
+\definecharacter greekapostrophos {''}
+
+\stopencoding
+
+%D Cyrillic (moved to here):
+
+\startencoding[default]
+
+\definecharacter cyrillicA {A}
+\definecharacter cyrillicB {B}
+\definecharacter cyrillicV {V}
+\definecharacter cyrillicG {G}
+\definecharacter cyrillicD {D}
+\definecharacter cyrillicE {E}
+\definecharacter cyrillicZH {ZH}
+\definecharacter cyrillicZ {Z}
+\definecharacter cyrillicI {I}
+\definecharacter cyrillicISHRT {ISHRT}
+\definecharacter cyrillicK {K}
+\definecharacter cyrillicL {L}
+\definecharacter cyrillicM {M}
+\definecharacter cyrillicN {N}
+\definecharacter cyrillicO {O}
+\definecharacter cyrillicP {P}
+\definecharacter cyrillicR {R}
+\definecharacter cyrillicS {S}
+\definecharacter cyrillicT {T}
+\definecharacter cyrillicU {U}
+\definecharacter cyrillicF {F}
+\definecharacter cyrillicH {H}
+\definecharacter cyrillicC {C}
+\definecharacter cyrillicCH {CH}
+\definecharacter cyrillicSH {SH}
+\definecharacter cyrillicSHCH {SHCH}
+\definecharacter cyrillicHRDSN {HRDSN}
+\definecharacter cyrillicERY {ERY}
+\definecharacter cyrillicSFTSN {SFTSN}
+\definecharacter cyrillicEREV {EREV}
+\definecharacter cyrillicYU {YU}
+\definecharacter cyrillicYA {YA}
+\definecharacter cyrillicGUP {GUP}
+\definecharacter cyrillicGHCRS {GHCRS}
+\definecharacter cyrillicDJE {DJE}
+\definecharacter cyrillicTSHE {TSHE}
+\definecharacter cyrillicSHHA {SHHA}
+\definecharacter cyrillicZHDSC {ZHDSC}
+\definecharacter cyrillicZDSC {ZDSC}
+\definecharacter cyrillicLJE {LJE}
+\definecharacter cyrillicYI {YI}
+\definecharacter cyrillicKDSC {KDSC}
+\definecharacter cyrillicKBEAK {KBEAK}
+\definecharacter cyrillicKVCRS {KVCRS}
+\definecharacter cyrillicAE {AE}
+\definecharacter cyrillicNDSC {NDSC}
+\definecharacter cyrillicNG {NG}
+\definecharacter cyrillicDZE {DZE}
+\definecharacter cyrillicOTLD {OTLD}
+\definecharacter cyrillicSDSC {SDSC}
+\definecharacter cyrillicUSHRT {USHRT}
+\definecharacter cyrillicY {Y}
+\definecharacter cyrillicYHCRS {YHCRS}
+\definecharacter cyrillicHDSC {HDSC}
+\definecharacter cyrillicDZHE {DZHE}
+\definecharacter cyrillicCHVCRS {CHVCRS}
+\definecharacter cyrillicCHRDSC {CHRDSC}
+\definecharacter cyrillicIE {IE}
+\definecharacter cyrillicSCHWA {SCHWA}
+\definecharacter cyrillicNJE {NJE}
+\definecharacter cyrillicYO {YO}
+\definecharacter cyrillicII {II}
+\definecharacter cyrillicJE {JE}
+\definecharacter cyrillicQ {Q}
+\definecharacter cyrillicW {W}
+
+\definecharacter cyrillica {a}
+\definecharacter cyrillicb {b}
+\definecharacter cyrillicv {v}
+\definecharacter cyrillicg {g}
+\definecharacter cyrillicd {d}
+\definecharacter cyrillice {e}
+\definecharacter cyrilliczh {zh}
+\definecharacter cyrillicz {z}
+\definecharacter cyrillici {i}
+\definecharacter cyrillicishrt {ishrt}
+\definecharacter cyrillick {k}
+\definecharacter cyrillicl {l}
+\definecharacter cyrillicm {m}
+\definecharacter cyrillicn {n}
+\definecharacter cyrillico {o}
+\definecharacter cyrillicp {p}
+\definecharacter cyrillicr {r}
+\definecharacter cyrillics {s}
+\definecharacter cyrillict {t}
+\definecharacter cyrillicu {u}
+\definecharacter cyrillicf {f}
+\definecharacter cyrillich {h}
+\definecharacter cyrillicc {c}
+\definecharacter cyrillicch {ch}
+\definecharacter cyrillicsh {sh}
+\definecharacter cyrillicshch {shch}
+\definecharacter cyrillichrdsn {hrdsn}
+\definecharacter cyrillicery {ery}
+\definecharacter cyrillicsftsn {sftsn}
+\definecharacter cyrillicerev {erev}
+\definecharacter cyrillicyu {yu}
+\definecharacter cyrillicya {ya}
+\definecharacter cyrillicgup {gup}
+\definecharacter cyrillicghcrs {ghcrs}
+\definecharacter cyrillicdje {dje}
+\definecharacter cyrillictshe {tshe}
+\definecharacter cyrillicshha {shha}
+\definecharacter cyrilliczhdsc {zhdsc}
+\definecharacter cyrilliczdsc {zdsc}
+\definecharacter cyrilliclje {lje}
+\definecharacter cyrillicyi {yi}
+\definecharacter cyrillickdsc {kdsc}
+\definecharacter cyrillickbeak {kbeak}
+\definecharacter cyrillickvcrs {kvcrs}
+\definecharacter cyrillicae {ae}
+\definecharacter cyrillicndsc {ndsc}
+\definecharacter cyrillicng {ng}
+\definecharacter cyrillicdze {dze}
+\definecharacter cyrillicotld {otld}
+\definecharacter cyrillicsdsc {sdsc}
+\definecharacter cyrillicushrt {ushrt}
+\definecharacter cyrillicy {y}
+\definecharacter cyrillicyhcrs {yhcrs}
+\definecharacter cyrillichdsc {hdsc}
+\definecharacter cyrillicdzhe {dzhe}
+\definecharacter cyrillicchvcrs {chvcrs}
+\definecharacter cyrillicchrdsc {chrdsc}
+\definecharacter cyrillicie {ie}
+\definecharacter cyrillicschwa {schwa}
+\definecharacter cyrillicnje {nje}
+\definecharacter cyrillicyo {yo}
+\definecharacter cyrillicii {ii}
+\definecharacter cyrillicje {je}
+\definecharacter cyrillicq {q}
+\definecharacter cyrillicw {w}
+
+\definecharacter cyrillicGJE {\'\cyrillicG}
+\definecharacter cyrillicgje {\'\cyrillicg}
+\definecharacter cyrillicKJE {\'\cyrillicK}
+\definecharacter cyrillickje {\'\cyrillick}
+
+\stopencoding
+
+\def\cyrillicio{\cyrillicyo}
+\def\cyrillicIO{\cyrillicYO}
+
+%D Hebrew:
+
+\startencoding[default]
+
+\definecharacter hebrewAlef {'}
+\definecharacter hebrewBet {b}
+\definecharacter hebrewGimel {g}
+\definecharacter hebrewDalet {d}
+\definecharacter hebrewHe {h}
+\definecharacter hebrewVav {w}
+\definecharacter hebrewZayin {z}
+\definecharacter hebrewHet {\hstroke}
+\definecharacter hebrewTet {\tcedilla}
+\definecharacter hebrewYod {y}
+\definecharacter hebrewKaffinal {k}
+\definecharacter hebrewKaf {k}
+\definecharacter hebrewLamed {l}
+\definecharacter hebrewMemfinal {m}
+\definecharacter hebrewMem {m}
+\definecharacter hebrewNunfinal {n}
+\definecharacter hebrewNun {n}
+\definecharacter hebrewSamekh {s}
+\definecharacter hebrewAyin {\gdotaccent}
+\definecharacter hebrewPefinal {p}
+\definecharacter hebrewPe {p}
+\definecharacter hebrewTsadifinal {\scedilla}
+\definecharacter hebrewTsadi {\scedilla}
+\definecharacter hebrewQof {q}
+\definecharacter hebrewResh {r}
+\definecharacter hebrewShin {\scaron}
+\definecharacter hebrewTav {th}
+
+\stopencoding
+
+%D A few goodies:
+
+\def\eszett{\ssharp}
+\def\Eszett{\Ssharp}
+
+\def\lslash{\lstroke}
+\def\Lslash{\Lstroke}
+\def\dslash{\dstroke}
+\def\Dslash{\Dstroke}
+\def\oslash{\ostroke}
+\def\Oslash{\Ostroke}
+
+\def\dcroat{\dstroke}
+\def\Dcroat{\Dstroke}
+
+% \startencoding [default]
+%
+% \definecharacter scommaaccent {\scedilla}
+% \definecharacter Scommaaccent {\Scedilla}
+% \definecharacter tcommaaccent {\tcedilla}
+% \definecharacter Tcommaaccent {\Tcedilla}
+%
+% \stopencoding
+
+% for plain tex's sake
+
+\def\S {\sectionmark }
+\def\P {\paragraphmark}
+
+% for latex users sake
+
+\def\textS {\sectionmark }
+\def\textP {\paragraphmark}
+
+% for old times sake
+
+\def\florin {\textflorin } \def\florijn{\textflorin}
+\def\dollar {\textdollar }
+\def\pound {\textsterling}
+\def\sterling{\textsterling}
+
+% idem
+
+\def\promille{\perthousand}
+\def\permille{\perthousand}
+\def\procent {\percent }
+\def\permine {\fakepermine}
+
+% some more
+
+\def\hyphen {\softhyphen}
+\def\cwm {\compoundwordmark}
+\def\nonbreakinghyphen {\hyphen}
+\def\breakinghyphen {\hyphen\prewordbreak}
+
+% quotes
+
+\def\lowerleftsingleninequote {\quotesinglebase}
+\def\lowerleftdoubleninequote {\quotedblbase}
+\def\lowerrightsingleninequote {\quotesinglebase}
+\def\lowerrightdoubleninequote {\quotedblbase}
+
+\def\upperleftsingleninequote {\quoteright}
+\def\upperleftdoubleninequote {\quotedblright}
+\def\upperrightsingleninequote {\quoteright}
+\def\upperrightdoubleninequote {\quotedblright}
+
+\def\upperleftsinglesixquote {\quoteleft}
+\def\upperleftdoublesixquote {\quotedblleft}
+\def\upperrightsinglesixquote {\quoteleft}
+\def\upperrightdoublesixquote {\quotedblleft}
+
+\def\leftsubguillemot {\guilsingleleft}
+\def\rightsubguillemot {\guilsingleright}
+
+%D A couple of fallbacks suggestion by users, slightly
+%D adapted and obscured by memory saving hacks.
+
+\unprotect
+
+\startencoding[default]
+
+\definecharacter textcent {c\rlap{\hskip-.2\s!em
+ \vrule\!!width.2\s!pt\!!height1.2\s!ex\!!depth.2\s!ex}}
+
+\definecharacter texteuro {C\rlap{\hskip-.75\s!em
+ \vrule\!!width.4\s!em\!!height.85\s!ex\!!depth-.8\s!ex}}
+
+\definecharacter textblacksquare {\dontleavehmode\hbox{%
+ \vrule\!!width.3\s!em\!!height.4\s!em\!!depth-.1\s!em}}
+
+\definecharacter textbrokenbar {\dontleavehmode\hbox{\kern.05\s!em
+ \vrule\!!width.4\s!pt\!!height1.8\s!ex\!!depth-.85\s!ex
+ \llap{%
+ \vrule\!!width.4\s!pt\!!height.35\s!ex\!!depth.6\s!ex}%
+ \kern.05\s!em}}
+
+\stopencoding
+
+\protect
+
+%D We also use symbolic names for math accents.
+
+\startencoding[default]
+
+\definecharacter mathacute "7013
+\definecharacter mathgrave "7012
+\definecharacter mathddot "707F
+\definecharacter mathtilde "707E
+\definecharacter mathbar "7016
+\definecharacter mathbreve "7015
+\definecharacter mathcheck "7014
+\definecharacter mathhat "705E
+\definecharacter mathvec "017E
+\definecharacter mathdot "705F
+\definecharacter mathwidetilde "0365
+\definecharacter mathwidehat "0362
+
+\stopencoding
+
+% \startencoding [default]
+
+% \definecommand prime {\mathematics{'}}
+% \definecommand doubleprime {\mathematics{''}}
+% \definecommand tripleprime {\mathematics{'''}}
+
+% \stopencoding
+
+\ifx\zdot\undefined \def\zdot{\zdotaccent} \fi
+\ifx\Zdot\undefined \def\Zdot{\Zdotaccent} \fi
+
+\ifx\greeklamda\undefined \def\greeklamda{\greeklambda} \fi
+\ifx\greekLamda\undefined \def\greekLamda{\greekLambda} \fi
+
+\ifx\leftguillemet \undefined \def\leftguillemet {\leftguillemot } \fi
+\ifx\rightguillemet\undefined \def\rightguillemet{\rightguillemot} \fi
+
+%D New:
+
+\startencoding[\s!default]
+
+\definecharacter schwa {\hbox{\rotate[\c!rotation=180,\c!location=\v!high]{\hbox{e}}}}
+\definecharacter schwagrave {\buildtextgrave\schwa}
+
+\stopencoding
+
+%D Also new, from Taco, for Mojca, who wanted another 8~regimes.
+
+\startencoding[\s!default]
+
+\definecharacter texthorizontalbar {{\endash\kern\zeropoint\endash}}
+\definecharacter textdong {\underbar{\dstroke}}
+
+\stopencoding
+
+%D Goodie (makes more sense):
+
+\def\normalcontrolspace
+ {\getglyph{ComputerModernMono}{\char32}}
+
+\def\fakedcontrolspace % can be virtual in luatex
+ {\dontleavehmode\hbox
+ {\scratchdimen.1ex%
+ \kern\scratchdimen
+ \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
+ \vrule \!!width\dimexpr.5em-4\scratchdimen\relax \!!height-2\scratchdimen \!!depth3\scratchdimen
+ \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
+ \kern\scratchdimen}}
+
+\def\fakecontrolspace{\let\normalcontrolspace\fakedcontrolspace}
+
+\endinput
diff --git a/tex/context/base/enco-ec.mkii b/tex/context/base/enco-ec.mkii
new file mode 100644
index 000000000..1ac41cadf
--- /dev/null
+++ b/tex/context/base/enco-ec.mkii
@@ -0,0 +1,295 @@
+%D \module
+%D [ file=enco-ec,
+%D version=2000.05.07, % 1999.16.07,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=\LATEX\ EC Encoding,
+%D author={Patrick Gundlach, Hans Hagen, Taco Hoekwater, Mojca Miklavec},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is \LATEX2e's T1 encoding vector. All standard \LATEX\
+%D accents will work, including \type{\k}. The only accent that
+%D does not work is \type{\t} (there is no tie in T1 encoding).
+%D
+%D Annoyingly, most \POSTSCRIPT\ fonts do not have \type
+%D {\dotlessj}, and T1 encoding does not make the various
+%D prebuilts with \type {j} available. When this is the case:
+%D
+%D \starttyping
+%D \startencoding[ec]
+%D \definecharacter dotlessj {j}
+%D \stopencoding
+%D \stoptyping
+%D
+%D is a way out.
+
+%D There is hardly a point in supporting TS1 encoding.
+
+\startmapping[ec]
+
+% a problem is that the uppercase of dstroke (158) and eth (240)
+% is the same glyph (208) so we cannot do lowercase mapping there
+
+\definecasemaps 128 to 156 lc +32 uc 0
+\definecasemap 157 `i 157 % Idotaccent i
+\definecasemap 158 158 208 % dstroke Eth
+\definecasemap 159 159 159 % sectionmark
+\definecasemaps 160 to 187 lc 0 uc -32
+\resetcaserange 189 to 191 % exclamdown, questiondown, textsterling
+\definecasemaps 192 to 223 lc +32 uc 0
+\definecasemaps 224 to 254 lc 0 uc -32
+\definecaseswap 255 223 % ssharp (else patterns fail)
+\definecaseswap 25 `I % dotless i
+
+% 156 vs. 188 IJligature
+
+%D Some languages need this:
+
+% \definecaseself 34 % quotedbl
+% \definecaseself 18 % quotedblbase
+% \definecaseself 16 % quotedblleft
+% \definecaseself 17 % quotedblright
+% \definecaseself 39 % quotesingle
+% \definecaseself 13 % quotesinglebase
+% \definecaseself 96 % quoteleft
+% \definecaseself 39 % quoteright
+
+%D So far for the mapping.
+
+%D The following characters are kind of dangerous,
+%D that is, they are normally not part of fonts, unless
+%D explicitly constructed.
+%D
+%D \startitemize[columns,two]
+%D \item \type{\dotlessj} - but then it may not be defined!!!!
+%D \item \type{\IJligature}
+%D \item \type{\ijligature}
+%D \item \type{\Ssharp}
+%D \item \type{\perthousand}
+%D \item \type{\compoundwordmark}
+% \item \type{\textvisiblespace}
+%D \stopitemize
+
+%D So, for the moment we nil them; we can always create
+%D another vector if needed.
+
+\stopmapping
+
+\startencoding[ec][ec] % second arg defines auto regime, needed here ?
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter texthungarumlaut 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter textogonek 12
+\definecharacter quotesinglebase 13
+\definecharacter guilsingleleft 14
+\definecharacter guilsingleright 15
+\definecharacter quotedblleft 16
+\definecharacter quotedblright 17
+\definecharacter quotedblbase 18
+\definecharacter leftguillemot 19
+\definecharacter rightguillemot 20
+\definecharacter endash 21
+\definecharacter emdash 22
+%definecharacter compoundwordmark 23
+%definecharacter perthousand 24
+\definecharacter dotlessi 25 % or when missing: {j}
+\definecharacter dotlessj 26
+% ff 27
+% fi 28
+% fl 29
+% ffi 30
+% ffl 31
+%definecharacter textvisiblespace 32
+% exclam ! 33
+\definecharacter quotedbl 34
+% numbersign # 35
+% dollar $ 36
+\definecharacter percent 37
+% ampersand & 38
+%definecharacter quotesingle 39 % fake 'm TODO:enco-def!!!!
+\definecharacter quoteright 39
+% parenleft ( 40
+% parenright ) 41
+% asterisk * 42
+% plus + 43
+% comma , 44
+\definecharacter softhyphen 45
+% period . 46
+% slash / 47
+% 0-9 48-57
+% colon : 58
+% semicolon ; 59
+% less < 60
+% equal = 61
+% greater > 62
+% question ? 63
+% at @ 64
+% A-Z 65-90
+% bracketleft [ 91
+\definecharacter textbackslash 92
+% bracketright ] 93
+\definecharacter textasciicircum 94
+\definecharacter textunderscore 95
+\definecharacter quoteleft 96
+% a-z 97-122
+\definecharacter textbraceleft 123
+\definecharacter textbraceright 125
+\definecharacter textasciitilde 126
+%definecharacter softhyphen 127 % -> 45 (127 often undefined)
+\definecharacter Abreve 128 % abreve 160
+\definecharacter Aogonek 129 % aogonek 161
+\definecharacter Cacute 130 % cacute 162
+\definecharacter Ccaron 131 % ccaron 163
+\definecharacter Dcaron 132 % dcaron 164
+\definecharacter Ecaron 133 % ecaron 165
+\definecharacter Eogonek 134 % eogonek 166
+\definecharacter Gbreve 135 % gbreve 167
+\definecharacter Lacute 136 % lacute 168
+\definecharacter Lcaron 137 % lcaron 169
+\definecharacter Lstroke 138 % lstroke 170
+\definecharacter Nacute 139 % nacute 171
+\definecharacter Ncaron 140 % ncaron 172
+\definecharacter Eng 141 % eng 173
+\definecharacter Neng 141 % Neng 173
+\definecharacter Ohungarumlaut 142 % ohungarumlaut 174
+\definecharacter Racute 143 % racute 175
+\definecharacter Rcaron 144 % rcaron 176
+\definecharacter Sacute 145 % sacute 177
+\definecharacter Scaron 146 % scaron 178
+\definecharacter Scedilla 147 % scedilla 179
+\definecharacter Tcaron 148 % tcaron 180
+\definecharacter Tcedilla 149 % tcedilla 181
+\definecharacter Uhungarumlaut 150 % uhungarumlaut 182
+\definecharacter Uring 151 % uring 183
+\definecharacter Ydiaeresis 152 % ydiaeresis 184
+\definecharacter Zacute 153 % zacute 185
+\definecharacter Zcaron 154 % zcaron 186
+\definecharacter Zdotaccent 155 % zdotaccent 187
+\definecharacter IJligature 156 % ijligature 188
+\definecharacter Idotaccent 157
+\definecharacter dstroke 158 % Dstroke 208
+\definecharacter sectionmark 159
+\definecharacter abreve 160 % Abreve 128
+\definecharacter aogonek 161 % Aogonek 129
+\definecharacter cacute 162 % Cacute 130
+\definecharacter ccaron 163 % Ccaron 131
+\definecharacter dcaron 164 % Dcaron 132
+\definecharacter ecaron 165 % Ecaron 133
+\definecharacter eogonek 166 % Eogonek 134
+\definecharacter gbreve 167 % Gbreve 135
+\definecharacter lacute 168 % Lacute 136
+\definecharacter lcaron 169 % Lcaron 137
+\definecharacter lstroke 170 % Lstroke 138
+\definecharacter nacute 171 % Nacute 139
+\definecharacter ncaron 172 % Ncaron 140
+\definecharacter eng 173 % Eng 141
+\definecharacter ohungarumlaut 174 % Ohungarumlaut 142
+\definecharacter racute 175 % Racute 143
+\definecharacter rcaron 176 % Rcaron 144
+\definecharacter sacute 177 % Sacute 145
+\definecharacter scaron 178 % Scaron 146
+\definecharacter scedilla 179 % Scedilla 147
+\definecharacter tcaron 180 % Tcaron 148
+\definecharacter tcedilla 181 % Tcedilla 149
+\definecharacter uhungarumlaut 182 % Uhungarumlaut 150
+\definecharacter uring 183 % Uring 151
+\definecharacter ydiaeresis 184 % Ydiaeresis 152
+\definecharacter zacute 185 % Zacute 153
+\definecharacter zcaron 186 % Zcaron 154
+\definecharacter zdotaccent 187 % Zdotaccent 155
+\definecharacter ijligature 188 % IJligature 156
+\definecharacter exclamdown 189
+\definecharacter questiondown 190
+\definecharacter textsterling 191
+\definecharacter Agrave 192 % agrave 224
+\definecharacter Aacute 193 % aacute 225
+\definecharacter Acircumflex 194 % acircumflex 226
+\definecharacter Atilde 195 % atilde 227
+\definecharacter Adiaeresis 196 % adiaeresis 228
+\definecharacter Aring 197 % aring 229
+\definecharacter AEligature 198 % aeligature 230
+\definecharacter Ccedilla 199 % ccedilla 231
+\definecharacter Egrave 200 % egrave 232
+\definecharacter Eacute 201 % eacute 233
+\definecharacter Ecircumflex 202 % ecircumflex 234
+\definecharacter Ediaeresis 203 % ediaeresis 235
+\definecharacter Igrave 204 % igrave 236
+\definecharacter Iacute 205 % iacute 237
+\definecharacter Icircumflex 206 % icircumflex 238
+\definecharacter Idiaeresis 207 % idiaeresis 239
+\definecharacter Eth 208 % eth 240
+\definecharacter Dstroke 208 % dstroke 158
+\definecharacter Ntilde 209 % ntilde 241
+\definecharacter Ograve 210 % ograve 242
+\definecharacter Oacute 211 % oacute 243
+\definecharacter Ocircumflex 212 % ocircumflex 244
+\definecharacter Otilde 213 % otilde 245
+\definecharacter Odiaeresis 214 % odiaeresis 246
+\definecharacter OEligature 215 % oeligature 247
+\definecharacter Ostroke 216 % ostroke 248
+\definecharacter Ugrave 217 % ugrave 249
+\definecharacter Uacute 218 % uacute 250
+\definecharacter Ucircumflex 219 % ucircumflex 251
+\definecharacter Udiaeresis 220 % udiaeresis 252
+\definecharacter Yacute 221 % yacute 253
+\definecharacter Thorn 222 % thorn 254
+\definecharacter Ssharp 223 % ssharp 255
+\definecharacter agrave 224 % Agrave 192
+\definecharacter aacute 225 % Aacute 193
+\definecharacter acircumflex 226 % Acircumflex 194
+\definecharacter atilde 227 % Atilde 195
+\definecharacter adiaeresis 228 % Adiaeresis 196
+\definecharacter aring 229 % Aring 197
+\definecharacter aeligature 230 % AEligature 198
+\definecharacter ccedilla 231 % Ccedilla 199
+\definecharacter egrave 232 % Egrave 200
+\definecharacter eacute 233 % Eacute 201
+\definecharacter ecircumflex 234 % Ecircumflex 202
+\definecharacter ediaeresis 235 % Ediaeresis 203
+\definecharacter igrave 236 % Igrave 204
+\definecharacter iacute 237 % Iacute 205
+\definecharacter icircumflex 238 % Icircumflex 206
+\definecharacter idiaeresis 239 % Idiaeresis 207
+\definecharacter eth 240 % Eth 208
+\definecharacter ntilde 241 % Ntilde 209
+\definecharacter ograve 242 % Ograve 210
+\definecharacter oacute 243 % Oacute 211
+\definecharacter ocircumflex 244 % Ocircumflex 212
+\definecharacter otilde 245 % Otilde 213
+\definecharacter odiaeresis 246 % Odiaeresis 214
+\definecharacter oeligature 247 % OEligature 215
+\definecharacter ostroke 248 % Ostroke 216
+\definecharacter ugrave 249 % Ugrave 217
+\definecharacter uacute 250 % Uacute 218
+\definecharacter ucircumflex 251 % Ucircumflex 219
+\definecharacter udiaeresis 252 % Udiaeresis 220
+\definecharacter yacute 253 % Yacute 221
+\definecharacter thorn 254 % Thorn 222
+\definecharacter ssharp 255 % Ssharp 223
+
+\stopencoding
+
+\startencoding[ec]
+
+\definecharacter Scommaaccent {\Scedilla}
+\definecharacter scommaaccent {\scedilla}
+\definecharacter Tcommaaccent {\Tcedilla}
+\definecharacter tcommaaccent {\tcedilla}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-ecm.mkii b/tex/context/base/enco-ecm.mkii
new file mode 100644
index 000000000..b74473960
--- /dev/null
+++ b/tex/context/base/enco-ecm.mkii
@@ -0,0 +1,33 @@
+%D \module
+%D [ file=enco-ec,
+%D version=2000.05.07,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Glyphs that may not be present in EC,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The next typescript removes a few problematic characters
+%D from the ec encoding vector. So, in case of troubles, say
+%D
+%D \starttyping
+%D \useencoding[ecm] % ec minus
+%D \stoptyping
+
+\startencoding[ec][ec]
+
+\definecharacter ijligature {ij}
+\definecharacter IJligature {IJ}
+\definecharacter Ssharp {SS}
+\definecharacter tcaron {\buildtextaccent\textcaron t}
+\definecharacter Tcedilla {\buildtextcedilla T}
+\definecharacter tcedilla {\buildtextcedilla t}
+\definecharacter ydiaeresis {\buildtextaccent\textdiaeresis y}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-el.mkii b/tex/context/base/enco-el.mkii
new file mode 100644
index 000000000..24729967b
--- /dev/null
+++ b/tex/context/base/enco-el.mkii
@@ -0,0 +1,272 @@
+%D \module
+%D [ file=enco-el,
+%D version=2005.08.24,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=EuroLetter,
+%D author={Several Users},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This EuroLetter encoding vector, also known as Dense Encoding is
+%D the result of discussion among users, most noticably Adam Lindsay,
+%D Mojka Miklavec, Patrick Gundlach, Taco Hoekwater and \unknown.
+%D It was a follow up of a thread started long ago where we
+%D discussed an encoding without the weird, never used symbols, but
+%D with as many characters as possible in order to support the utf-8
+%D input regime.
+
+\startencoding[el]
+
+\definecasemaps 1 to 15 lc +16 uc 0
+\definecasemaps 17 to 31 lc 0 uc -16
+
+\definecasemaps 128 to 159 lc +32 uc 0
+\definecasemaps 160 to 191 lc 0 uc -32
+
+\definecasemaps 192 to 223 lc +32 uc 0
+\definecasemaps 224 to 255 lc 0 uc -32
+
+\definecasemap 92 92 124
+\definecasemap 92 124 92
+
+\definecharacter dotlessi 160
+\definecharacter endash 32
+\definecharacter emdash 16
+
+\definecharacter aeligature 230
+\definecharacter AEligature 198
+\definecharacter oeligature 247
+\definecharacter OEligature 215
+
+\definecharacter ssharp 38
+
+\definecharacter thorn 254
+\definecharacter Thorn 222
+
+\definecharacter eth 240
+\definecharacter Eth 208
+
+\definecharacter exclamdown 42
+\definecharacter questiondown 43
+
+\definecharacter quotedbl 35
+\definecharacter quotedblbase 36
+\definecharacter quotedblleft 34
+\definecharacter quotedblright 35
+
+\definecharacter quotesingle 39
+\definecharacter quotesinglebase 0
+
+\definecharacter quoteleft 96
+\definecharacter quoteright 39
+
+\definecharacter guilsingleleft 60
+\definecharacter guilsingleright 62
+
+\definecharacter leftguillemot 123
+\definecharacter rightguillemot 125
+
+\definecharacter Acircumflex 194
+\definecharacter acircumflex 226
+%definecharacter Ccircumflex {\buildtextaccent\textcircumflex C}
+%definecharacter ccircumflex {\buildtextaccent\textcircumflex c}
+\definecharacter Ecircumflex 202
+\definecharacter ecircumflex 234
+%definecharacter Gcircumflex {\buildtextaccent\textcircumflex G}
+%definecharacter gcircumflex {\buildtextaccent\textcircumflex g}
+%definecharacter Hcircumflex {\buildtextaccent\textcircumflex H}
+%definecharacter hcircumflex {\buildtextaccent\textcircumflex h}
+\definecharacter Icircumflex 206
+\definecharacter icircumflex 238
+%definecharacter Jcircumflex {\buildtextaccent\textcircumflex \dotlessJ}
+%definecharacter jcircumflex {\buildtextaccent\textcircumflex \dotlessj}
+\definecharacter Ocircumflex 212
+\definecharacter ocircumflex 244
+%definecharacter Scircumflex {\buildtextaccent\textcircumflex S}
+%definecharacter scircumflex {\buildtextaccent\textcircumflex s}
+\definecharacter Ucircumflex 219
+\definecharacter ucircumflex 251
+\definecharacter Wcircumflex 154
+\definecharacter wcircumflex 186
+\definecharacter Ycircumflex 156
+\definecharacter ycircumflex 188
+
+\definecharacter Agrave 192
+\definecharacter agrave 224
+\definecharacter Egrave 200
+\definecharacter egrave 232
+\definecharacter Igrave 204
+\definecharacter igrave 236
+\definecharacter Ograve 210
+\definecharacter ograve 242
+\definecharacter Ugrave 217
+\definecharacter ugrave 249
+\definecharacter Ygrave 155
+\definecharacter ygrave 187
+
+\definecharacter Atilde 195
+\definecharacter atilde 227
+%definecharacter Itilde {\buildtextaccent\texttilde \dotlessI}
+%definecharacter itilde {\buildtextaccent\texttilde \dotlessi}
+\definecharacter Ntilde 209
+\definecharacter ntilde 241
+\definecharacter Otilde 213
+\definecharacter otilde 245
+%definecharacter Utilde {\buildtextaccent\texttilde U}
+%definecharacter utilde {\buildtextaccent\texttilde u}
+%definecharacter Ytilde {\buildtextaccent\texttilde Y}
+%definecharacter ytilde {\buildtextaccent\texttilde y}
+
+\definecharacter Adiaeresis 196
+\definecharacter adiaeresis 228
+\definecharacter Ediaeresis 203
+\definecharacter ediaeresis 235
+\definecharacter Idiaeresis 207
+\definecharacter idiaeresis 239
+\definecharacter Odiaeresis 214
+\definecharacter odiaeresis 246
+\definecharacter Udiaeresis 220
+\definecharacter udiaeresis 252
+\definecharacter Ydiaeresis 223
+\definecharacter ydiaeresis 255
+
+\definecharacter Aacute 193
+\definecharacter aacute 225
+\definecharacter Cacute 4
+\definecharacter cacute 20
+\definecharacter Eacute 201
+\definecharacter eacute 233
+\definecharacter Iacute 205
+\definecharacter iacute 237
+\definecharacter Lacute 132
+\definecharacter lacute 164
+\definecharacter Nacute 136
+\definecharacter nacute 168
+\definecharacter Oacute 211
+\definecharacter oacute 243
+\definecharacter Racute 141
+\definecharacter racute 173
+\definecharacter Sacute 144
+\definecharacter sacute 176
+\definecharacter Uacute 218
+\definecharacter uacute 250
+\definecharacter Yacute 221
+\definecharacter yacute 253
+\definecharacter Zacute 157
+\definecharacter zacute 189
+
+\definecharacter Dstroke 8
+\definecharacter dstroke 24
+\definecharacter Hstroke 92
+\definecharacter hstroke 124
+%definecharacter Tstroke {T}
+%definecharacter tstroke {t}
+
+\definecharacter Cdotaccent 6
+\definecharacter cdotaccent 22
+\definecharacter Edotaccent 10
+\definecharacter edotaccent 26
+\definecharacter Gdotaccent 15
+\definecharacter gdotaccent 31
+\definecharacter Idotaccent 128
+%definecharacter idotaccent {\buildtextaccent\textdotaccent \dotlessi}
+\definecharacter Zdotaccent 159
+\definecharacter zdotaccent 191
+
+\definecharacter Amacron 2
+\definecharacter amacron 18
+\definecharacter Emacron 11
+\definecharacter emacron 27
+\definecharacter Imacron 129
+\definecharacter imacron 161
+\definecharacter Omacron 140
+\definecharacter omacron 172
+\definecharacter Umacron 152
+\definecharacter umacron 184
+
+\definecharacter Ccedilla 199
+\definecharacter ccedilla 231
+\definecharacter Scedilla 146
+\definecharacter scedilla 178
+
+\definecharacter Gcommaaccent 14
+\definecharacter gcommaaccent 30
+\definecharacter Kcommaaccent 131
+\definecharacter kcommaaccent 163
+\definecharacter Lcommaaccent 135
+\definecharacter lcommaaccent 167
+\definecharacter Ncommaaccent 138
+\definecharacter ncommaaccent 170
+\definecharacter Rcommaaccent 143
+\definecharacter rcommaaccent 175
+%definecharacter Tcedilla 149 % there is no tcedilla in encoding
+%definecharacter tcedilla 181
+
+\definecharacter Scommaaccent 147
+\definecharacter scommaaccent 179
+\definecharacter Tcommaaccent 149
+\definecharacter tcommaaccent 181
+
+\definecharacter Ohungarumlaut 139
+\definecharacter ohungarumlaut 171
+\definecharacter Uhungarumlaut 150
+\definecharacter uhungarumlaut 182
+
+\definecharacter Aogonek 3
+\definecharacter aogonek 19
+\definecharacter Eogonek 12
+\definecharacter eogonek 28
+\definecharacter Iogonek 130
+\definecharacter iogonek 162
+\definecharacter Uogonek 153
+\definecharacter uogonek 185
+
+\definecharacter Aring 197
+\definecharacter aring 229
+\definecharacter Uring 151
+\definecharacter uring 183
+
+\definecharacter Abreve 1
+\definecharacter abreve 17
+%definecharacter Ebreve {\buildtextaccent\textbreve E}
+%definecharacter ebreve {\buildtextaccent\textbreve e}
+\definecharacter Gbreve 13
+\definecharacter gbreve 29
+%definecharacter Ibreve {\buildtextaccent\textbreve \dotlessI}
+%definecharacter ibreve {\buildtextaccent\textbreve \dotlessi}
+%definecharacter Obreve {\buildtextaccent\textbreve O}
+%definecharacter obreve {\buildtextaccent\textbreve o}
+%definecharacter Ubreve {\buildtextaccent\textbreve U}
+%definecharacter ubreve {\buildtextaccent\textbreve u}
+
+\definecharacter Ccaron 5
+\definecharacter ccaron 21
+\definecharacter Dcaron 7
+\definecharacter dcaron 23
+\definecharacter Ecaron 9
+\definecharacter ecaron 25
+\definecharacter Lcaron 133
+\definecharacter lcaron 165
+\definecharacter Ncaron 137
+\definecharacter ncaron 169
+\definecharacter Rcaron 142
+\definecharacter rcaron 174
+\definecharacter Scaron 145
+\definecharacter scaron 177
+\definecharacter Tcaron 148
+\definecharacter tcaron 180
+%definecharacter Ycaron {\buildtextaccent\textcaron Y}
+%definecharacter ycaron {\buildtextaccent\textcaron y}
+\definecharacter Zcaron 158
+\definecharacter zcaron 190
+
+\definecharacter Lstroke 134
+\definecharacter lstroke 166
+\definecharacter Ostroke 216
+\definecharacter ostroke 248
+
+\stopencoding
diff --git a/tex/context/base/enco-fde.mkii b/tex/context/base/enco-fde.mkii
new file mode 100644
index 000000000..a7c11abfc
--- /dev/null
+++ b/tex/context/base/enco-fde.mkii
@@ -0,0 +1,128 @@
+%D \module
+%D [ file=enco-fde,
+%D version=2000.08.20,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=German Input Filter,
+%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.
+
+\doifmode{mkiv}{\endinput}
+
+\unprotect
+
+\installactivecharacter "
+
+\startlanguagespecifics[\s!de]
+
+ \installcompoundcharacter "a {\aumlaut\midworddiscretionary}
+ \installcompoundcharacter "e {\eumlaut\midworddiscretionary}
+ \installcompoundcharacter "i {\iumlaut\midworddiscretionary}
+ \installcompoundcharacter "o {\oumlaut\midworddiscretionary}
+ \installcompoundcharacter "u {\uumlaut\midworddiscretionary}
+ \installcompoundcharacter "s {\ssharp}
+ \installcompoundcharacter "z {\ssharp}
+
+ \installcompoundcharacter "A {\Aumlaut}
+ \installcompoundcharacter "E {\Eumlaut}
+ \installcompoundcharacter "I {\Iumlaut}
+ \installcompoundcharacter "O {\Oumlaut}
+ \installcompoundcharacter "U {\Uumlaut}
+ \installcompoundcharacter "Z {SZ}
+ \installcompoundcharacter "S {SS}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!de]
+
+ \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+ \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+ \installcompoundcharacter "ll {\discretionary{ll-}{l}{ll}}
+ \installcompoundcharacter "mm {\discretionary{mm-}{m}{mm}}
+ \installcompoundcharacter "nn {\discretionary{nn-}{n}{nn}}
+ \installcompoundcharacter "pp {\discretionary{pp-}{p}{pp}}
+ \installcompoundcharacter "rr {\discretionary{rr-}{r}{rr}}
+ \installcompoundcharacter "tt {\discretionary{tt-}{t}{tt}}
+
+ \installcompoundcharacter "CK {\discretionary {K-}{K}{CK}}
+ \installcompoundcharacter "FF {\discretionary{FF-}{F}{FF}}
+ \installcompoundcharacter "LL {\discretionary{LL-}{L}{LL}}
+ \installcompoundcharacter "MM {\discretionary{MM-}{M}{MM}}
+ \installcompoundcharacter "NN {\discretionary{NN-}{N}{NN}}
+ \installcompoundcharacter "PP {\discretionary{PP-}{P}{PP}}
+ \installcompoundcharacter "RR {\discretionary{RR-}{R}{RR}}
+ \installcompoundcharacter "TT {\discretionary{TT-}{T}{TT}}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!de]
+
+ \installcompoundcharacter "` {\startdelimitedtext[\v!quotation]}
+ \installcompoundcharacter "' {\stopdelimitedtext}
+ \installcompoundcharacter ". {\kern.1em\ignorespaces}
+
+ %installcompoundcharacter "` {\languageparameter\c!leftquotation }
+ %installcompoundcharacter "' {\languageparameter\c!rightquotation}
+
+ \def\setupDElanguage
+ {\setuplanguage
+ [\s!de]
+ [\c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\leftsubguillemot,
+ \c!rightsubsentence=\rightsubguillemot]}
+
+ \installcompoundcharacter "< {{\setupDElanguage|<|}}
+ \installcompoundcharacter "> {{\setupDElanguage|>|}}
+ \installcompoundcharacter "| {|*|}
+
+\stoplanguagespecifics
+
+% \hyphenatedword{hinauff|*|liegen}
+% \hyphenatedword{hinauff"|liegen}
+
+%D An experimental hack:
+
+% no {\simplifiedcompoundcharacter"}
+
+% \startencoding[pdfdoc]
+% \startlanguagespecifics[\s!de]% hm, a % is needed
+% \defineactivecharacter " {\"}
+% \stoplanguagespecifics
+% \stopencoding
+
+\startencoding[ec]
+ \startlanguagespecifics[\s!de]%
+ \installcompoundcharacter "a {\adiaeresis}
+ \installcompoundcharacter "e {\ediaeresis}
+ \installcompoundcharacter "i {\idiaeresis}
+ \installcompoundcharacter "o {\odiaeresis}
+ \installcompoundcharacter "u {\udiaeresis}
+ \installcompoundcharacter "A {\Adiaeresis}
+ \installcompoundcharacter "E {\Ediaeresis}
+ \installcompoundcharacter "I {\Idiaeresis}
+ \installcompoundcharacter "O {\Odiaeresis}
+ \installcompoundcharacter "U {\Udiaeresis}
+ \stoplanguagespecifics
+\stopencoding
+
+\startencoding[texnansi]
+ \startlanguagespecifics[\s!de]%
+ \installcompoundcharacter "a {\adiaeresis}
+ \installcompoundcharacter "e {\ediaeresis}
+ \installcompoundcharacter "i {\idiaeresis}
+ \installcompoundcharacter "o {\odiaeresis}
+ \installcompoundcharacter "u {\udiaeresis}
+ \installcompoundcharacter "A {\Adiaeresis}
+ \installcompoundcharacter "E {\Ediaeresis}
+ \installcompoundcharacter "I {\Idiaeresis}
+ \installcompoundcharacter "O {\Odiaeresis}
+ \installcompoundcharacter "U {\Udiaeresis}
+ \stoplanguagespecifics
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-ffr.mkii b/tex/context/base/enco-ffr.mkii
new file mode 100644
index 000000000..093cc6500
--- /dev/null
+++ b/tex/context/base/enco-ffr.mkii
@@ -0,0 +1,57 @@
+%D \module
+%D [ file=enco-ffr,
+%D version=2002.05.07,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=French Input Filter,
+%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.
+
+\doifmode{mkiv}{\endinput}
+
+% \definehspace[fr][:][.25em]
+% \definehspace[fr][;][.25em]
+% \definehspace[fr][!][.25em]
+% \definehspace[fr][?][.25em]
+
+\enablemode[activecolon] \usemodule[tryout] % for the moment
+
+\installactivecharacter :
+\installactivecharacter ;
+\installactivecharacter ?
+\installactivecharacter !
+
+\unprotect
+
+\startlanguagespecifics[\s!fr]
+ \definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{:}:}
+ \definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{;};}
+ \definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{?}?}
+ \definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentmainlanguage{!}!}
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!fr]
+ \defineactivecharacter : {\mathortext{:}{\directdiscretionary{:}}}
+ \defineactivecharacter ; {\mathortext{;}{\directdiscretionary{;}}}
+ \defineactivecharacter ! {\mathortext{!}{\directdiscretionary{!}}}
+ \defineactivecharacter ? {\mathortext{?}{\directdiscretionary{?}}}
+\stoplanguagespecifics
+
+\appendtoks % maybe everywhere
+ \chardef\activecharactermode\zerocount
+\to\everyMPgraphic
+
+% maybe tricky due to possible name clashes:
+%
+% \def\ieme {\highordinalstr{e}}
+% \def\iemes{\highordinalstr{es}}
+% \def\ier {\highordinalstr{er}}
+% \def\iers {\highordinalstr{ers}}
+% \def\iere {\highordinalstr{re}}
+% \def\ieres{\highordinalstr{res}}
+
+\protect \endinput
diff --git a/tex/context/base/enco-fpl.mkii b/tex/context/base/enco-fpl.mkii
new file mode 100644
index 000000000..14d102ff1
--- /dev/null
+++ b/tex/context/base/enco-fpl.mkii
@@ -0,0 +1,98 @@
+%D \module
+%D [ file=enco-fpl,
+%D version=2000.08.20,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Polish Input Filter,
+%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.
+
+%D These definitions used to be part of lang-sla.tex.
+
+\unprotect
+
+% todo : named glyphs
+
+\installactivecharacter /
+
+\startlanguagespecifics[\s!pl]
+
+% \appendtoks \makecharacteractive / \to \everynormalcatcodes % obsolete
+
+ \installcompoundcharacter /a {\aogonek}
+ \installcompoundcharacter /c {\cacute}
+ \installcompoundcharacter /e {\eogonek}
+ \installcompoundcharacter /l {\lstroke}
+ \installcompoundcharacter /n {\nacute}
+ \installcompoundcharacter /o {\oacute}
+ \installcompoundcharacter /s {\sacute}
+ \installcompoundcharacter /x {\zacute}
+ \installcompoundcharacter /z {\zdotaccent}
+ \installcompoundcharacter /A {\Aogonek}
+ \installcompoundcharacter /C {\Cacute}
+ \installcompoundcharacter /E {\Eogonek}
+ \installcompoundcharacter /L {\Lstroke}
+ \installcompoundcharacter /N {\Nacute}
+ \installcompoundcharacter /O {\Oacute}
+ \installcompoundcharacter /S {\Sacute}
+ \installcompoundcharacter /X {\Zacute}
+ \installcompoundcharacter /Z {\Zdotaccent}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!pl]
+
+ \installcompoundcharacter /, {\handlequotation\c!leftquotation}
+ \installcompoundcharacter /' {\handlequotation\c!rightquotation}
+
+ \def\setupPLlanguage%
+ {\setuplanguage
+ [\s!pl]
+ [\c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\leftsubguillemot,
+ \c!rightsubsentence=\rightsubguillemot]}
+
+ \installcompoundcharacter /< {{\setupPLlanguage|<|}}
+ \installcompoundcharacter /> {{\setupPLlanguage|>|}}
+
+ \installcompoundcharacter /- {|-|}
+
+\stoplanguagespecifics
+
+% obsolete
+%
+% \startlanguagespecifics[\s!pl]
+%
+% \definesortkey {/a}{a}{a}{\k a}
+% \definesortkey {/A}{a}{a}{\k a}
+% \definesortkey {/c}{c}{a}{\'c}
+% \definesortkey {/C}{c}{a}{\'c}
+% \definesortkey {/e}{e}{a}{\k e}
+% \definesortkey {/E}{e}{a}{\k e}
+% \definesortkey {/l}{l}{a}{\l }
+% \definesortkey {/L}{l}{a}{\l }
+% \definesortkey {/n}{n}{a}{\'n}
+% \definesortkey {/N}{n}{a}{\'n}
+% \definesortkey {/o}{o}{a}{\'o}
+% \definesortkey {/O}{o}{a}{\'o}
+% \definesortkey {/s}{s}{a}{\'s}
+% \definesortkey {/S}{s}{a}{\'s}
+% \definesortkey {/x}{z}{a}{\'x}
+% \definesortkey {/X}{z}{a}{\'x}
+% \definesortkey {/z}{z}{b}{\.z}
+% \definesortkey {/Z}{z}{b}{\.z}
+%
+% \stoplanguagespecifics
+
+\startencoding[pdfdoc]
+ \startlanguagespecifics[pl]% hm
+ \defineactivecharacter / {\simplifiedcompoundcharacter/}
+ \stoplanguagespecifics
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-fro.mkii b/tex/context/base/enco-fro.mkii
new file mode 100644
index 000000000..e5f5e1257
--- /dev/null
+++ b/tex/context/base/enco-fro.mkii
@@ -0,0 +1,35 @@
+%D \module
+%D [ file=enco-fro,
+%D version=2000.08.20,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Romanian Input Filter,
+%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.
+
+%D These definitions used to be part of lang-ita.tex.
+
+\unprotect
+
+\installactivecharacter "
+
+\startlanguagespecifics[\s!ro]
+
+ \installcompoundcharacter "a {\acircumflex}
+ \installcompoundcharacter "i {\icircumflex}
+ \installcompoundcharacter "s {\scedilla}
+ \installcompoundcharacter "t {\tcedilla}
+ \installcompoundcharacter "A {\Acircumflex}
+ \installcompoundcharacter "I {\Icircumflex}
+ \installcompoundcharacter "S {\Scedilla}
+ \installcompoundcharacter "T {\Tcedilla}
+ \installcompoundcharacter "` {\startdelimitedtext[\v!quotation]}
+ \installcompoundcharacter "' {\stopdelimitedtext}
+
+\stoplanguagespecifics
+
+\protect \endinput
diff --git a/tex/context/base/enco-fsl.mkii b/tex/context/base/enco-fsl.mkii
new file mode 100644
index 000000000..86a41c88a
--- /dev/null
+++ b/tex/context/base/enco-fsl.mkii
@@ -0,0 +1,32 @@
+%D \module
+%D [ file=enco-fsl,
+%D version=2005.08.17,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Slovenian Specialities,
+%D author={Hans Hagen, Mojka Miklavec},
+%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.
+
+%D Usage:
+%D
+%D \starttyping
+%D \useencoding[fsl]
+%D
+%D \starttext
+%D \dstroke \language[sl] \dstroke
+%D \stoptext
+%D \stoptyping
+
+\unprotect
+
+\startlanguagespecifics[\s!sl]
+ \startencoding[\s!default]
+ \definecharacter dstroke {d\zcaron} % hm, expects a space delimiter
+ \stopencoding
+\stoplanguagespecifics
+
+\protect \endinput
diff --git a/tex/context/base/enco-grk.mkii b/tex/context/base/enco-grk.mkii
new file mode 100644
index 000000000..882a3c9b0
--- /dev/null
+++ b/tex/context/base/enco-grk.mkii
@@ -0,0 +1,190 @@
+%D \module
+%D [ file=enco-grk,
+%D version=2003.03.01,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Greek,
+%D author=Apostolos Syropoulos,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startmapping[iso-8859-7]
+
+% Uppercase Greek letters
+
+\definecasemap 193 193 225 % greekAlpha
+\definecasemap 194 194 226 % greekBeta
+\definecasemap 195 195 227 % greekGamma
+\definecasemap 196 196 228 % greekDelta
+\definecasemap 197 197 229 % greekEpsilon
+\definecasemap 198 198 230 % greekZeta
+\definecasemap 199 199 213 % greekEta
+\definecasemap 200 200 232 % greekTheta
+\definecasemap 201 201 233 % greekIota
+\definecasemap 202 202 234 % greekKappa
+\definecasemap 203 203 235 % greekLambda
+\definecasemap 204 204 236 % greekMu
+\definecasemap 205 205 237 % greekNu
+\definecasemap 206 206 238 % greekXi
+\definecasemap 207 207 239 % greekOmicron
+\definecasemap 208 208 240 % greekPi
+\definecasemap 209 209 241 % greekRho
+\definecasemap 211 211 243 % greekSigma
+\definecasemap 212 212 244 % greekTau
+\definecasemap 213 213 245 % greekUpsilon
+\definecasemap 214 214 246 % greekPhi
+\definecasemap 215 215 247 % greekChi
+\definecasemap 216 216 248 % greekPsi
+\definecasemap 217 217 249 % greekOmega
+
+% Lowercase Greek letters
+
+\definecasemap 225 193 225 % greekalpha
+\definecasemap 226 194 226 % greekbeta
+\definecasemap 227 195 227 % greekgamma
+\definecasemap 228 196 228 % greekdelta
+\definecasemap 229 197 229 % greekepsilon
+\definecasemap 230 198 230 % greekzeta
+\definecasemap 213 199 213 % greeketa
+\definecasemap 232 200 232 % greektheta
+\definecasemap 233 201 233 % greekiota
+\definecasemap 234 202 234 % greekkappa
+\definecasemap 235 203 235 % greeklambda
+\definecasemap 236 204 236 % greekmu
+\definecasemap 237 205 237 % greeknu
+\definecasemap 238 206 238 % greekxi
+\definecasemap 239 207 239 % greekomicron
+\definecasemap 240 208 240 % greekpi
+\definecasemap 241 209 241 % greekrho
+\definecasemap 242 211 242 % greekfinalsigma
+\definecasemap 243 211 243 % greekSigma
+\definecasemap 244 212 244 % greekTau
+\definecasemap 245 213 245 % greekUpsilon
+\definecasemap 246 214 246 % greekPhi
+\definecasemap 247 215 247 % greekChi
+\definecasemap 248 216 248 % greekPsi
+\definecasemap 249 217 249 % greekOmega
+
+% Accented Uppercase Greek letters
+
+\definecasemap 182 193 220 % greekAlphatonos
+\definecasemap 184 197 221 % greekEpsilontonos
+\definecasemap 185 199 222 % greekEtatonos
+\definecasemap 186 201 223 % greekIotatonos
+\definecasemap 188 207 252 % greekOmicrontonos
+\definecasemap 190 213 253 % greekUpsilontonos
+\definecasemap 191 217 254 % greekOmegatonos
+\definecasemap 218 218 250 % greekIotadialytika
+\definecasemap 219 219 251 % greekUpsilondialytika
+
+% Accented Lowercase Greek letters
+
+\definecasemap 220 193 220 % greekalphatonos
+\definecasemap 221 197 221 % greekepsilontonos
+\definecasemap 222 199 222 % greeketatonos
+\definecasemap 223 201 223 % greekiotatonos
+\definecasemap 252 207 252 % greekomicrontonos
+\definecasemap 253 213 253 % greekupsilontonos
+\definecasemap 254 217 254 % greekomegatonos
+\definecasemap 250 218 250 % greekiotadialytika
+\definecasemap 251 219 251 % greekupsilondialytika
+\definecasemap 192 218 192 % greekiotadialytikatonos
+\definecasemap 224 219 224 % greekupsilondialytikatonos
+
+\stopmapping
+
+\startencoding[iso-8859-7]
+
+% Uppercase Greek letters
+
+\definecharacter greekAlpha 193
+\definecharacter greekBeta 194
+\definecharacter greekGamma 195
+\definecharacter greekDelta 196
+\definecharacter greekEpsilon 197
+\definecharacter greekZeta 198
+\definecharacter greekEta 199
+\definecharacter greekTheta 200
+\definecharacter greekIota 201
+\definecharacter greekKappa 202
+\definecharacter greekLambda 203
+\definecharacter greekMu 204
+\definecharacter greekNu 205
+\definecharacter greekXi 206
+\definecharacter greekOmicron 207
+\definecharacter greekPi 208
+\definecharacter greekRho 209
+\definecharacter greekSigma 211
+\definecharacter greekTau 212
+\definecharacter greekUpsilon 213
+\definecharacter greekPhi 214
+\definecharacter greekChi 215
+\definecharacter greekPsi 216
+\definecharacter greekOmega 217
+
+% Lowercase Greek letters
+
+\definecharacter greekalpha 225
+\definecharacter greekbeta 226
+\definecharacter greekgamma 227
+\definecharacter greekdelta 228
+\definecharacter greekepsilon 229
+\definecharacter greekzeta 230
+\definecharacter greeketa 231
+\definecharacter greektheta 232
+\definecharacter greekiota 233
+\definecharacter greekkappa 234
+\definecharacter greeklambda 235
+\definecharacter greekmu 236
+\definecharacter greeknu 237
+\definecharacter greekxi 238
+\definecharacter greekomicron 239
+\definecharacter greekpi 240
+\definecharacter greekrho 241
+\definecharacter greekfinalsigma 242
+\definecharacter greeksigma 243
+\definecharacter greektau 244
+\definecharacter greekupsilon 245
+\definecharacter greekphi 246
+\definecharacter greekchi 247
+\definecharacter greekpsi 248
+\definecharacter greekomega 249
+
+% Accented Uppercase Greek letters
+
+\definecharacter greekAlphatonos 182
+\definecharacter greekEpsilontonos 184
+\definecharacter greekEtatonos 185
+\definecharacter greekIotatonos 186
+\definecharacter greekOmicrontonos 188
+\definecharacter greekUpsilontonos 190
+\definecharacter greekOmegatonos 191
+\definecharacter greekIotadialytika 218
+\definecharacter greekUpsilondialytika 219
+
+% Accented Lowercase Greek letters
+
+\definecharacter greekalphatonos 220
+\definecharacter greekepsilontonos 221
+\definecharacter greeketatonos 222
+\definecharacter greekiotatonos 223
+\definecharacter greekomicrontonos 252
+\definecharacter greekupsilontonos 253
+\definecharacter greekomegatonos 254
+\definecharacter greekiotadialytika 250
+\definecharacter greekupsilondialytika 251
+\definecharacter greekiotadialytikatonos 192
+\definecharacter greekupsilondialytikatonos 224
+
+% Miscellaneous Greek symbols
+
+\definecharacter greekleftquot 171
+\definecharacter greekrightquot 187
+\definecharacter greektonos 180
+\definecharacter greekdialytikatonos 181
+\definecharacter greekapostrophos 162
+
+\stopencoding
diff --git a/tex/context/base/enco-heb.mkii b/tex/context/base/enco-heb.mkii
new file mode 100644
index 000000000..443745752
--- /dev/null
+++ b/tex/context/base/enco-heb.mkii
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=enco-heb,
+%D version=2005.01.27,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Hebrew,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D To be done.
+
+\endinput
diff --git a/tex/context/base/enco-ibm.mkii b/tex/context/base/enco-ibm.mkii
new file mode 100644
index 000000000..48695ca52
--- /dev/null
+++ b/tex/context/base/enco-ibm.mkii
@@ -0,0 +1,7 @@
+% temporary module, needed for downward compatibility
+
+%\input regi-ibm.tex
+
+\enableregime[ibm]
+
+\endinput
diff --git a/tex/context/base/enco-il2.mkii b/tex/context/base/enco-il2.mkii
new file mode 100644
index 000000000..9fb87b2fd
--- /dev/null
+++ b/tex/context/base/enco-il2.mkii
@@ -0,0 +1,157 @@
+%D \module
+%D [ file=enco-il2,
+%D version=2000.05.07, % 1998.12.01,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Czech and Slovak ISO Latin 2 Encoding,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% This encoding will go but the regime will remain.
+
+%D This Czech/Slovak encoding is dedicated to Han The Thanh.
+%D The numbers are derived from some files he sent me. This
+%D definition file is (still) sort of beta.
+
+\startmapping[il2]
+
+\resetcaserange 127 to 255 % we map them all to themselves
+
+\definecaseswap 184 152
+\definecaseswap 181 165
+\definecaseswap 185 169
+\definecaseswap 187 171
+\definecaseswap 190 174
+\definecaseswap 224 192
+\definecaseswap 225 193
+\definecaseswap 228 196
+\definecaseswap 229 197
+\definecaseswap 232 200
+\definecaseswap 233 201
+\definecaseswap 236 204
+\definecaseswap 237 205
+\definecaseswap 239 207
+\definecaseswap 242 210
+\definecaseswap 243 211
+\definecaseswap 244 212
+\definecaseswap 246 214
+\definecaseswap 248 216
+\definecaseswap 249 217
+\definecaseswap 250 218
+\definecaseswap 252 220
+\definecaseswap 253 221
+
+\stopmapping
+
+\startencoding[il2][il2]
+
+\definecharacter textgrave 18
+\definecharacter textacute 19
+\definecharacter textcaron 20
+\definecharacter textbreve 21
+\definecharacter textmacron 22
+\definecharacter textring 23
+\definecharacter textcedilla 24
+\definecharacter textcircumflex 94
+\definecharacter textdotaccent 95
+\definecharacter texthungarumlaut 125
+\definecharacter texttilde 126
+\definecharacter textdiaeresis 127
+
+\definecharacter dotlessi 16
+\definecharacter dotlessj 17
+
+\definecharacter aeligature 26
+\definecharacter AEligature 29
+\definecharacter oeligature 27
+\definecharacter OEligature 30
+
+\definecharacter ssharp 25
+
+\definecharacter Racute 192
+\definecharacter Aacute 193
+\definecharacter Lacute 197
+\definecharacter Eacute 201
+\definecharacter Iacute 205
+\definecharacter Oacute 211
+\definecharacter Uacute 218
+\definecharacter Yacute 221
+\definecharacter racute 224
+\definecharacter aacute 225
+\definecharacter lacute 229
+\definecharacter eacute 233
+\definecharacter iacute 237
+\definecharacter oacute 243
+\definecharacter uacute 250
+\definecharacter yacute 253
+
+\definecharacter Lcaron 165
+\definecharacter Scaron 169
+\definecharacter Tcaron 171
+\definecharacter Zcaron 174
+\definecharacter lcaron 181
+\definecharacter scaron 185
+\definecharacter tcaron 187
+\definecharacter zcaron 190
+\definecharacter Ccaron 200
+\definecharacter Ecaron 204
+\definecharacter Dcaron 207
+\definecharacter Ncaron 210
+\definecharacter Rcaron 216
+\definecharacter ccaron 232
+\definecharacter ecaron 236
+\definecharacter dcaron 239
+\definecharacter ncaron 242
+\definecharacter rcaron 248
+
+\definecharacter Ocircumflex 212
+\definecharacter ocircumflex 244
+
+\definecharacter Adiaeresis 196
+\definecharacter Odiaeresis 214
+\definecharacter Udiaeresis 220
+\definecharacter adiaeresis 228
+\definecharacter odiaeresis 246
+\definecharacter udiaeresis 252
+
+\definecharacter Agrave 152
+\definecharacter agrave 184
+
+\definecharacter Ohungarumlaut 213
+\definecharacter Uhungarumlaut 219
+\definecharacter ohungarumlaut 245
+\definecharacter uhungarumlaut 251
+
+\definecharacter Uring 217
+\definecharacter uring 249
+\definecharacter Aring {\ilencodedrA}
+
+\definecharacter ostroke 28
+\definecharacter Ostroke 31
+\definecharacter Lstroke {\ilencodedL}
+\definecharacter lstroke {\ilencodedl}
+
+\def\ilencodedrA
+ {\dontleavehmode\hbox\bgroup
+ \setbox0\hbox{h}%
+ \dimen0=\ht0
+ \advance\dimen0 by -1ex
+ \rlap{\raise.67\dimen0\hbox{\char'27}}A%
+ \egroup}
+
+\def\ilencodedl
+ {\dontleavehmode{\char32l}}
+
+\def\ilencodedL
+ {\dontleavehmode\hbox\bgroup
+ \setbox0\hbox{L}%
+ \hbox to\wd0{\hss\char32L}%
+ \egroup}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-ini.mkii b/tex/context/base/enco-ini.mkii
new file mode 100644
index 000000000..33825f94d
--- /dev/null
+++ b/tex/context/base/enco-ini.mkii
@@ -0,0 +1,1137 @@
+%D \module
+%D [ file=enco-ini,
+%D version=2007.02.19, % 2000.12.27, % 1998.12.03,
+%D title=\CONTEXT\ Encoding 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 Quite some code will be moved to the mk files once we're ready
+%D for it.
+
+%D This module is a reimplementation of the module that handled
+%D composed characters and non \ASCII\ characters. The changed
+%D are not that fundamental, and mainly concerns moving
+%D definitions of specific glyphs and accents to other files as
+%D well as moving plain handling of accents to this module
+%D instead of overloading plain \TEX\ commands.
+
+%D Patterns are kind of mixed with font encodings and
+%D mappings. Alas.
+
+\ifx\synchronizepatterns\undefined \let\synchronizepatterns\relax \fi
+
+%D While dealing with input (the text source) and output (the
+%D glyphs), encoding comes into view. To summarize a few:
+%D
+%D \startitemize
+%D \item Bytes in the input file are mapped to an internal
+%D representation. An~\type {a} often stays an~\type {a},
+%D but~\type {\"e} can become either one code or become
+%D two codes (ending in overlapping glyphs).
+%D \item Characters can be made active and mapped onto another
+%D character.
+%D \item When changing case, characters are mapped onto
+%D themselves, their case||counterpart or a reasonable
+%D alternative, like~\"e onto~e.
+%D \item Single character representations in a \DVI\ file can
+%D be mapped onto one or more characters, either of not
+%D in more than one font file (virtual fonts).
+%D \item In the final format, fonts collections can be
+%D partially embedded, thereby losing the one||to||one
+%D relation between several instances of one font.
+%D \item For special purposes, individual characters should be
+%D mapped onto a dedicated encoding vector, for instance
+%D \PDF\ document encoding.
+%D \stopitemize
+%D
+%D These and other kind of mappings are to be dealt with, and
+%D the exact way of dealing often depends on the language to be
+%D typeset.
+
+\writestatus{loading}{ConTeXt Encoding Macros / Initialization}
+
+\unprotect
+
+%D First we define a few local or not yet initialized constants.
+
+\def\@map@{@m@ap@} % mapping prefix
+\def\@fha@{@f@ha@} % font prefix
+\def\@cas@{@c@as@} % casecom prefix
+
+\ifx\currentlanguage\undefined \let\currentlanguage\s!en \fi
+
+%D \macros
+%D {setupencoding}
+%D
+%D The following setup command is used to tune encoding
+%D handling.
+
+\def\setupencoding
+ {\dosingleargument\dosetupencoding}
+
+\def\dosetupencoding[#1]%
+ {\getparameters[\??ec][#1]%
+ \edef\defaultencoding
+ {\ifx\@@ecdefault\empty\s!default\else\@@ecdefault\fi}}
+
+%D \macros
+%D {useencoding}
+%D
+%D Encodings things are defined in separate files and are
+%D loaded only once, using:
+%D
+%D \showsetup{useencoding}
+
+\def\douseencoding#1%
+ {\doifundefined{\c!file\f!encodingprefix#1}%
+ {\letvalue{\c!file\f!encodingprefix#1}\empty
+ \makeshortfilename[\truefilename{\f!encodingprefix#1}]%
+ \startreadingfile
+ \readsysfile{\shortfilename.mkii}
+ {\showmessage\m!encodings2{#1}}
+ {\showmessage\m!encodings3{#1}}%
+ \stopreadingfile}}
+
+\def\useencoding[#1]%
+ {\processcommalist[#1]\douseencoding}
+
+%D \macros
+%D {startmapping,enablemapping}
+%D
+%D In order to process patterns, convert from lower to
+%D uppercase and vise versa and some more, we provide a
+%D mechanism to define mappings. The first real application
+%D of this command was:
+%D
+%D \starttyping
+%D \startmapping [something]
+%D \definecasemap 165 181 165
+%D \definecasemap 171 187 171
+%D ...
+%D \defineuppercasecom \i {I}
+%D \defineuppercasecom \l \L
+%D \definelowercasecom \AE \ae
+%D ...
+%D \stopmapping
+%D \stoptyping
+%D
+%D So, character 165 becomes 181 in uppercase and 165 in
+%D lowercase. A mapping is activated with \type {\enablemapping}.
+
+\def\startsavingmappingtoks#1%
+ {\bgroup
+ \edef\charactermapping{@#1@}%
+ \checkmappingtoks
+ \setmappingtoks
+ \the\mappingtoks}
+
+\def\stopsavingmappingtoks
+ {\global\mappingtoks\emptytoks
+ \dostepwiserecurse{0}{255}\plusone
+ {\edef\@@expanded
+ {\the\mappingtoks
+ \ifnum\recurselevel>127
+ \noexpand\settoletterunlessactive{\recurselevel}%
+ \fi
+ \lccode\recurselevel\ifnum\lccode\recurselevel=\zerocount\zerocount\else\space\the\lccode\recurselevel\space\fi
+ \uccode\recurselevel\ifnum\uccode\recurselevel=\zerocount\zerocount\else\space\the\uccode\recurselevel\space\fi
+ \ifnum\sfcode\recurselevel=\plusthousand\else\sfcode\recurselevel=\the\sfcode\recurselevel\space\fi
+ }%
+ \global\mappingtoks\expandafter{\@@expanded}}%
+ \egroup
+ \let\enabledmapping\empty
+ \enablemapping[\currentmapping]}
+
+\def\startmapping[#1]%
+ {\startsavingmappingtoks{#1}}
+
+\def\stopmapping
+ {\stopsavingmappingtoks}
+
+\def\optimizemapping[#1]%
+ {\startsavingmappingtoks{#1}%
+ % nothing, just an automatic cleanup
+ \stopsavingmappingtoks
+ % we need to resync
+ %\let\enabledmapping\relax
+ }%\enablemapping[\currentmapping]}
+
+\def\setmappingtoks
+ {\@EA\let\@EA\mappingtoks\csname\@map@\charactermapping\endcsname
+ \@EA\let\@EA\casecomtoks\csname\@cas@\charactermapping\endcsname}
+
+\def\checkmappingtoks
+ {\ifundefined{\@map@\charactermapping}%
+ \expandafter\newtoks\csname\@map@\charactermapping\endcsname
+ \fi
+ \ifundefined{\@cas@\charactermapping}%
+ \expandafter\newtoks\csname\@cas@\charactermapping\endcsname
+ \fi}
+
+\def\definecasemap #1 #2 #3 % code lower upper
+ {\doifelse{#2}{to}
+ {\presetcaserange{#1}{#3}}
+ {\lccode#1=#2\relax
+ \uccode#1=#3\relax}%
+ \ignorespaces}
+
+%D Saves a few tokens
+
+\def\definecaseswap #1 #2 % lower upper
+ {\lccode#1=#1\relax
+ \uccode#2=#2\relax
+ \lccode#2=#1\relax
+ \uccode#1=#2\relax
+ \ignorespaces}
+
+\def\definecaseself #1 % lower=upper=self
+ {\lccode#1=#1\relax
+ \uccode#1=#1\relax
+ \ignorespaces}
+
+%D Watch the \type {\definecasemap 127 to 255} option!
+%D Dedicated to Taco there is also:
+
+\def\definecasemaps #1 to #2 lc #3 uc #4 % from to lc+ uc+
+ {\dostepwiserecurse{#1}{#2}\plusone
+ {\scratchcounter\recurselevel\advance\scratchcounter#3\lccode\recurselevel=\scratchcounter
+ \scratchcounter\recurselevel\advance\scratchcounter#4\uccode\recurselevel=\scratchcounter}%
+ \ignorespaces}
+
+%D This can be used like:
+%D
+%D \starttyping
+%D \definecasemaps 128 to 156 lc 32 uc 0
+%D \definecasemaps 160 to 188 lc -32 uc 0
+%D \definecasemaps 160 to 188 lc -32 uc 0
+%D \definecasemaps 192 to 255 lc 32 uc 0
+%D \stoptyping
+%D
+%D and saves a lot of typing (copying).
+
+\def\resetcaserange #1 to #2
+ {\dostepwiserecurse{#1}{#2}\plusone
+ {\lccode\recurselevel\zerocount
+ \uccode\recurselevel\zerocount}%
+ \ignorespaces}
+
+\def\presetcaserange#1#2% could be pre-expanded
+ {\dostepwiserecurse{#1}{#2}\plusone
+ {\lccode\recurselevel=\recurselevel
+ \uccode\recurselevel=\recurselevel}%
+ \ignorespaces}
+
+\def\setcasemap #1 #2 #3 %
+ {\settoletterunlessactive{#1}%
+ \lccode #1=#2
+ \uccode #1=#3 }
+
+\def\setcaseswap #1 #2 %
+ {\settoletterunlessactive{#1}%
+ \settoletterunlessactive{#2}%
+ \lccode #1=#1
+ \uccode #2=#2
+ \lccode #2=#1
+ \uccode #1=#2 }
+
+\def\setcaseself #1 %
+ {\settoletterunlessactive{#1}%
+ \lccode #1=#1
+ \uccode #1=#1 }
+
+\def\definespacemap #1 #2 % code sfcode
+ {\sfcode#1=#2%
+ \ignorespaces}
+
+\def\setspacemap #1 #2 %
+ {\settootherunlessactive{#1}%
+ %\lccode #1=\zerocount
+ %\uccode #1=\zerocount
+ \sfcode #1=#2 }
+
+\def\defineuppercasecom#1#2%
+ {\global\casecomtoks\expandafter{\the\casecomtoks\setuppercasecom#1{#2}}%
+ \ignorespaces}
+
+\def\definelowercasecom#1#2%
+ {\global\casecomtoks\expandafter{\the\casecomtoks\setlowercasecom#1{#2}}%
+ \ignorespaces}
+
+\let\setuppercasecom\gobbletwoarguments
+\let\setlowercasecom\gobbletwoarguments
+
+\def\setcasecom#1#2{\def#1{#2}}
+
+\let\enabledmapping\empty % indirect, needed to handle default too
+
+\def\enablemapping[#1]%
+ {\edef\charactermapping{@#1@}%
+ \ifx\enabledmapping\charactermapping \else
+ \doifdefined{\@map@\charactermapping}
+ {%\expandafter\showthe\csname\@map@\charactermapping\endcsname\endcsname
+ \the\csname\@map@\charactermapping\endcsname}%
+ % == \the\executeifdefined{\@map@\charactermapping}\emptytoks
+ \edef\enabledmapping{\charactermapping}%
+ \enablelanguagespecifics[\currentlanguage]% new
+ % \edef\enabledmapping{\charactermapping\currentlanguage}% can be comma list
+ \fi
+ \synchronizepatterns}
+
+% on behalf of font switching:
+
+\def\fastenablemapping#1%
+ {\edef\charactermapping{@#1@}%
+ \ifx\enabledmapping\charactermapping \else
+ \@EA\ifx\csname\@map@\charactermapping\endcsname\relax\else
+ \the\csname\@map@\charactermapping\endcsname
+ \fi
+ % == \the\executeifdefined{\@map@\charactermapping}\emptytoks
+ \let\enabledmapping\charactermapping
+ \enablelanguagespecifics[\currentlanguage]% to faster
+ \fi}
+
+%D This macro wil be implemented in \type {lang-ini.tex}.
+
+\ifx\enablelanguagespecifics\undefined
+ \def\enablelanguagespecifics[#1]{}
+\fi
+
+%D Further on we have to take some precautions when dealing
+%D with special characters like~\type{~}, \type{_}
+%D and~\type{^}, so let us define ourselve some handy macros
+%D first.
+
+\def\protectfontcharacters
+ {\edef\unprotectfontcharacters
+ {\catcode`\noexpand ~=\the\catcode`~\relax
+ \catcode`\noexpand _=\the\catcode`_\relax
+ \catcode`\noexpand ^=\the\catcode`^\relax}%
+ \catcode`~=\@@letter
+ \catcode`_=\@@letter
+ \catcode`^=\@@letter\relax}
+
+%D The completeness of the Computer Modern Roman typefaces
+%D makes clear how incomplete other faces are. To honour 7~bit
+%D \ASCII, these fonts were designed using only the first 127
+%D values of the 256 ones that can be presented by one byte.
+%D Nowadays 8~bit character codings are more common, mainly
+%D because they permit us to predefine some composed
+%D characters, which are needed in most european languages.
+%D
+%D Supporting more than the standard \TEX\ encoding vector
+%D |<|which in itself is far from standard and differs per
+%D font|>| puts a burden on the fonts mechanism. The \CONTEXT\
+%D mechanism is far from complete, but can handle several
+%D schemes at once. The main problem lays in the accented
+%D characters and ligatures like~ff, although handling
+%D ligatures is not the responsibility of this module.
+%D
+%D By default, we use \PLAIN\ \TEX's approach of placing
+%D accents. All other schemes sooner or later give problems
+%D when we distribute \DVI||files are distributed across
+%D machines and platforms. Nevertheless, we have to take care
+%D of different encoding vectors, which tell us where to find
+%D the characters we need. This means that all kind of
+%D character placement macro's like \type{\"} and \type{\ae}
+%D have to be implemented and adapted in a way that suits
+%D these vectors.
+%D
+%D The main difference between different vector is the way
+%D accents are ordered and/or the availability of prebuilt
+%D accented characters. Accented characters can for instance be
+%D called for by sequences like \type{\"e}. Here the \type{\"}
+%D is defined as:
+%D
+%D \starttyping
+%D \def\"#1{{\accent"7F #1}}
+%D \stoptyping
+%D
+%D This macro places the accent \accent"7F {} on top of an~e
+%D gives \"e. Some fonts however can have prebuild accents and
+%D use a more direct approach like
+%D
+%D \starttyping
+%D \def\"#1{\if#1e\char 235\else ... \fi}
+%D \stoptyping
+%D
+%D The latter approach is not used in \CONTEXT, because we
+%D store relevant combinations of accents and characters in
+%D individual macros.
+
+%D We define character substitutes and commands with definition
+%D commands like:
+%D
+%D \starttyping
+%D \startcoding[texnansi]
+%D
+%D \defineaccent " a 228
+%D \defineaccent ^ e 234
+%D \defineaccent ' {\dotlessi} 237
+%D
+%D \definecharacter ae 230
+%D \definecharacter oe 156
+%D
+%D \definecommand b \texnansiencodedb
+%D \definecommand c \texnansiencodedc
+%D
+%D \stopcoding
+%D \stoptyping
+%D
+%D The last argument of \type{\defineaccent} and
+%D \type{\definecharacter} tells \TEX\ the position of the
+%D accented character in the encoding vector. In order to
+%D complish this, we tag each implementation with the character
+%D coding identifier. We therefore need two auxiliary variables
+%D \type{\characterencoding} and \type{\nocharacterencoding}. These
+%D contain the current and default encoding vectors and both
+%D default to the \PLAIN\ one.
+
+\edef\characterencoding {@\s!default @}
+\edef\nocharacterencoding {@\s!default @}
+\edef\charactermapping {@\s!default @}
+
+% todo, else \d j == \dj, print file and check
+
+\def\accentprefix {}%{*}
+\def\commandprefix {}%{=}
+\def\characterprefix{}%{-}
+
+%D \macros
+%D {startcoding, reducetocoding}
+%D
+%D Before we can redefine accents and special characters, we
+%D have to tell \CONTEXT\ what encoding is in force. The next
+%D command is responsible for doing this and also takes care of
+%D the definition of the recoding commands. We use the \type
+%D {\start}||\type {\stop}||commands for definitions and the
+%D \type {\reduceto}||command for local switching to
+%D simplified commands.
+
+% etex : \ifcsname
+
+\def\justhandleaccent#1#2% \empty makes #2={} save % no \unexpanded
+ {\ifundefined{\accentprefix\characterencoding#1\string#2\empty}%
+ #2%
+ \else
+ \csname\accentprefix\characterencoding#1\string#2\empty\endcsname
+ \fi}
+
+\def\justhandlecommand#1% % no \unexpanded, otherwise pdfdoc will fail
+ {\ifundefined{\commandprefix\characterencoding#1}% as well as hyph patterns
+ #1%
+ \else
+ \csname\commandprefix\characterencoding#1\endcsname
+ \fi}
+
+\def\enableencoding
+ {\dodoubleempty\doenableencoding}
+
+\def\doenableencoding[#1][#2]% main fallback
+ {\iffirstargument\edef\characterencoding{@#1@}\fi
+ \edef\nocharacterencoding{@\ifsecondargument#2\else\s!default\fi @}%
+ \synchronizepatterns}
+
+\edef\xnocharacterencoding{@\s!default @}
+
+\def\fastenableencoding#1%
+ {\edef\characterencoding{@#1@}%
+ \let\nocharacterencoding\xnocharacterencoding}
+
+\def\startencoding
+ {\dodoubleempty\dostartencoding}
+
+\def\dostartencoding[#1][#2]% encoding regime
+ {%\showmessage\m!encodings1{#1}%
+ \pushmacro\characterencoding
+ \pushmacro\currentregime
+ \pushmacro\dohandleaccent % still needed?
+ \pushmacro\dohandlecommand % still needed?
+ \pushmacro\doautosetregime
+ \let\dohandleaccent\donthandleaccent % still needed?
+ \let\dohandlecommand\donthandlecommand % still needed?
+ %let\definesortkey\savesortkey
+ \edef\characterencoding{@#1@}%
+ \doifelsenothing{#2}%
+ {\let\doautosetregime\gobbletwoarguments}
+ {\def\currentregime{#2}}}
+
+\def\stopencoding
+ {\popmacro\doautosetregime
+ \popmacro\dohandlecommand % still needed?
+ \popmacro\dohandleaccent % still needed?
+ \popmacro\currentregime
+ \popmacro\characterencoding}
+
+% probably obsolete (hm, not yet)
+
+\def\reducetocoding[#1]% use grouped!
+ {\doifsomething{#1}
+ {\let\dohandleaccent \justhandleaccent
+ \let\dohandlecommand\justhandlecommand
+ \enableencoding[#1]%
+ \enablelanguagespecifics[\currentlanguage]}}
+
+\let\startcoding \startencoding
+\def\stopcoding {\stopencoding}
+\let\enablecoding \enableencoding
+
+%D The use of these macros are not limited to font
+%D definition files, but may also be used when loading
+%D patterns.
+
+%D \macros
+%D {definesortkey,flushsortkeys,flushsortkey}
+%D
+%D Yet another definition concerns sorting of indexes and
+%D lists.
+%D
+%D \starttyping
+%D \definesortkey {\'e} {e} {a} {\'e}
+%D \stoptyping
+%D
+%D The first argument denotes the string to be treated. The
+%D second argument is the raw replacement, while the third
+%D argument determines the sort order given the replacement.
+%D The last argument is used as entry in the index (a, b, etc).
+%D
+%D The keys can be flushed using \type {\flushsortkeys}
+%D which in turn results in a sequence of calls to \type
+%D {\flushsortkey}, a macro taking 4~arguments.
+%D
+%D This mechanism is currently being tested and subjected to
+%D changes! Obsolete:
+
+\let\definesortkey\gobblefourarguments
+\let\savesortkey \gobblefourarguments
+\let\flushsortkeys\relax
+\let\flushsortkey \relax
+
+%D \macros
+%D {defineaccent, definecharacter, definecommand}
+%D
+%D The actual definition of accents, special characters and
+%D commands is done with the next three commands.
+
+\def\defineaccent
+ {\protectfontcharacters
+ \dodefineaccent}
+
+\def\dodefineaccent#1 #2 %
+ {\unprotectfontcharacters
+ \dododefineaccent#1 #2 }
+
+\def\dododefineaccent#1 #2 #3 %
+ {\setvalue{#1}{\dohandleaccent{#1}}%
+ \doifnumberelse{\string#3}
+ {\setvalue{\accentprefix\characterencoding#1\string#2}{\char#3 }} % space added
+ {\setvalue{\accentprefix\characterencoding#1\string#2}{#3}}}
+
+\def\dohandleaccent#1#2%
+ {\ifcsname\accentprefix\characterencoding#1\string#2\empty\endcsname
+ \csname\accentprefix\characterencoding#1\string#2\empty\endcsname
+ \else\ifcsname\accentprefix\nocharacterencoding#1\string#2\empty\endcsname
+ \csname\accentprefix\nocharacterencoding#1\string#2\empty\endcsname
+ \else\ifcsname\accentprefix\characterencoding#1\endcsname
+ \csname\accentprefix\characterencoding#1\endcsname{#2}%
+ \else%\ifcsname\accentprefix\nocharacterencoding#1\endcsname
+ \csname\accentprefix\nocharacterencoding#1\endcsname{#2}%
+% \else
+% \donormaltextaccent{#1}{#2}%
+ \fi\fi\fi}%\fi}
+
+\def\patternchar#1 {\rawcharacter{#1}} % space is part of character definition !
+
+% \ifx \enablepatterntokens\undefined
+% \def\handlepatterntoken#1]{\csname#1\endcsname}
+% \fi
+
+% we need to postpone catcode changes, e.g. hr patterns
+% have \catcode" -> which fails when " is letter
+
+\def\pathypsettings
+ {\ifx \enablepatterntokens\undefined
+ \defineactivecharacter [ {\handlepatterntoken}%
+ \else
+ \enablepatterntokens
+ \fi
+ \let\dochar\thechr
+ \lccode16=16 % brrr, extra quote in ec (turkish)
+ \lccode17=17 % brrr, extra quote in ec (turkish)
+ \lccode`\-=`\-
+ \lccode`\'=`\'
+ \lccode`\"=`\"
+ \relax}
+
+\def\patterns {\pathypsettings\normalpatterns }
+\def\hyphenation{\pathypsettings\normalhyphenation}
+
+%D Because we don't want to use the second command grouped, we
+%D (re)define it as follows:
+
+\def\hyphenation
+ {\begingroup\def\hyphenation{\normalhyphenation{\the\scratchtoks}\endgroup}%
+ \pathypsettings\afterassignment\hyphenation\scratchtoks=}
+
+%D This is not needed for patterns because they are loaded grouped
+%D anyway and it saves us an assignment. Can go ... no longer
+%D shared patterns.
+
+\def\startpatternloading#1#2#3% % we should use \everypatternloading
+ {\startreadingfile
+ \bgroup
+ % let's get rid of interfering stuff
+ \let\everyjob\scratchtoks
+ \let\message \gobbleoneargument
+ % we want direct characters
+ \let\char\patternchar
+ \doifelsenothing{#2}{\enableencoding[ec]}{\enableencoding[#2]}%
+ \doifelsenothing{#3}{\enablemapping [ec]}{\enablemapping [#3]}%
+ \expanded{\doifinstring{\f!languageprefix}{#1}}
+ {\ifx \enablepatternxml\undefined \else
+ \enablepatternxml
+ \fi}%
+ \let\dohandleaccent\normaldohandleaccent}
+
+\def\stoppatternloading
+ {\egroup
+ \stopreadingfile}
+
+ \def\thechr#1{\char#1 } % just in case \relax interferes
+\unexpanded\def\numchr#1{\char#1\relax}
+\unexpanded\def\strchr#1{\csname#1\endcsname}
+
+\let\dochar\numchr
+
+\def\startdirectcharacters {\pushmacro\dochar \let\dochar\thechr}
+\def\stopdirectcharacters {\popmacro \dochar}
+
+\def\definecharacter#1 #2 %
+ {\ifundefined{#1}\setvalue{#1}{\dohandlecharacter{#1}}\fi
+ \doifnumberelse{\string#2}
+ {\setvalue{\characterprefix\characterencoding\string#1}{\dochar{#2}}%
+ \doautosetregime{#1}{#2}}
+ {\setvalue{\characterprefix\characterencoding\string#1}{#2}}}
+
+\def\dohandlecharacter#1%
+ {\csname\characterprefix\ifcsname\characterprefix\characterencoding#1\endcsname
+ \characterencoding\else\nocharacterencoding\fi#1\endcsname}
+
+% \def\fallbackpatternchar{x} % makes no sense, duplicate patterns
+
+\def\defaultcharacter#1%
+ {\csname\characterprefix\nocharacterencoding\strippedcsname#1\endcsname}
+
+%D Instead of numbers, a command may be entered.
+
+\def\definecommand#1 #2 %
+ {\setvalue{\string#1}{\dohandlecommand{#1}}%
+ %\redefinecommand #1 % just to be sure
+ \setvalue{\commandprefix\characterencoding\string#1}{#2}}
+
+%D Here we see that redefining accents is characters is more
+%D or less the same as redefining commands. We also could have
+%D said:
+%D
+%D \starttyping
+%D \def\defineaccent#1 #2 {\definecommand#1\string#2 \char}
+%D \def\definecharacter#1 {\definecommand#1 \char}
+%D \stoptyping
+
+%D \macros
+%D {defineaccentcommand}
+%D
+%D When needed, one can overload the default positions of the
+%D accents. The \PLAIN\ \TEX\ defaults are:
+%D
+%D \starttyping
+%D \defineaccentcommand ` 18
+%D \defineaccentcommand ' 19
+%D \defineaccentcommand v 20
+%D \defineaccentcommand u 21
+%D \defineaccentcommand = 22
+%D \defineaccentcommand ^ 94
+%D \defineaccentcommand . 95
+%D \defineaccentcommand H 125 % "7D
+%D \defineaccentcommand ~ 126 % "7E
+%D \defineaccentcommand " 127 % "7F
+%D \stoptyping
+
+\def\defineaccentcommand
+ {\protectfontcharacters
+ \dodefineaccentcommand}
+
+\def\dodefineaccentcommand#1 #2 % \string toegevoegd
+ {\doifnumberelse{\string#2}
+ {\setvalue{\accentprefix\characterencoding\string#1}##1{{\accent#2 ##1}}}
+ {\setvalue{\accentprefix\characterencoding\string#1}##1{{#2##1}}}%
+ \unprotectfontcharacters}
+
+%D We don't have to define them for the default \PLAIN\ case.
+%D Commands may be used instead of character codes.
+
+%D \macros
+%D {redefinecommand}
+%D
+%D Redefinition of encoding dependant commands like \type{\b}
+%D and \type{\c} can be triggered by:
+%D
+%D \starttyping
+%D \redefinecommand b % something math
+%D \redefinecommand c % something math
+%D \stoptyping
+%D
+%D Handling of characters is easier than handling accents
+%D because here we don't have to take care of arguments. We
+%D just call for the right glyph in the right place.
+%D
+%D The \type{\next} construction permits handling of commands
+%D that take arguments. This means that we can use this
+%D command to redefine accent handling commands too
+%D (although today the next is not needed any longer in test
+%D macros).
+
+\def\redefinecommand#1 %
+ {% no \unexpanded, else pdfdoc fails
+ \setvalue{\string#1}{\dohandlecommand{#1}}}%
+
+\def\dohandlecommand#1%
+ {\csname\commandprefix
+ \ifcsname\commandprefix\characterencoding#1\endcsname
+ \characterencoding
+ \else
+ \nocharacterencoding
+ \fi
+ #1\endcsname}
+
+%D \macros
+%D {currentencoding, currentmapping}
+%D
+%D When we show 'm, we don't want to see the protection
+%D measures.
+
+\def\currentencoding{\@EA\dopureencodingname\characterencoding}
+\def\currentmapping {\@EA\dopureencodingname\charactermapping }
+
+\def\dopureencodingname @#1@{#1}
+
+\def\pureencodingname#1{\@EA\dopureencodingname#1}
+
+%D \macros
+%D {showaccents, showcharacters,
+%D showcharacterbounds, showhyphenations}
+%D
+%D Encoding is a tricky business. Therefore we provide a
+%D a few macros that show most of the characters involved. The
+%D next two tables show the result of \type {\showaccents}.
+%D
+%D \placetable
+%D {The special glyphs in default encoding.}
+%D {\showaccents}
+%D
+%D \placetable
+%D {The special glyphs in texnansi encoding.}
+%D {\switchtobodyfont[lbr]\showaccents}
+%D
+%D The command
+%D
+%D \starttyping
+%D \showhyphenations{doordefini\"eren}
+%D \stoptyping
+%D
+%D can be used to check the correct loading of hyphenation
+%D patterns.
+
+\fetchruntimecommand \showaccents {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showcharacters {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showcharacterbounds {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showhyphenations {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showmapping {\f!encodingprefix\s!run.mkii}
+
+%D \macros
+%D {everyuppercase, EveryUppercase,
+%D everyuppercase, EveryUppercase}
+%D
+%D When we want to uppercase strings of characters, we have to
+%D take care of those characters that have a special meaning or
+%D are only accessible by means of macros. The next hack was
+%D introduced when Tobias Burnus started translating head and
+%D label texts into spanish and italian. The first application
+%D of this token register therefore can be found in the module
+%D that deals with these texts.
+
+\newevery \everyuppercase \EveryUppercase
+\newevery \everylowercase \EveryLowercase
+
+%D This magic trick maps takes care of mapping from lower to
+%D upper case and reverse.
+
+\def\reloadmapping{\the\executeifdefined{\@cas@\charactermapping}\emptytoks}
+
+\appendtoks\let\setuppercasecom\setcasecom\to\everyuppercase
+\appendtoks\let\setlowercasecom\setcasecom\to\everylowercase
+
+\appendtoks\reloadmapping\to\everyuppercase % slow, will be sped up
+\appendtoks\reloadmapping\to\everylowercase % slow, will be sped up
+
+\newtoks\everyULmap
+
+\appendtoks\let\remapcase\remapuppercase\the\everyULmap\to\everyuppercase
+\appendtoks\let\remapcase\remaplowercase\the\everyULmap\to\everylowercase
+
+\let\remapcase\gobbletwoarguments
+
+\def\remapuppercase#1#2{\let#2#1} % more efficient:
+\def\remaplowercase#1#2{\let#1#2} \let\remaplowercase\let
+
+\def\defineLCcharacter #1 #2 %
+ {\appendtoks\let\to\everylowercase
+ \@EA\appendtoks\csname#1\endcsname\to\everylowercase
+ \@EA\appendtoks\csname#2\endcsname\to\everylowercase}
+
+\def\defineUCcharacter #1 #2 %
+ {\appendtoks\let\to\everyuppercase
+ \@EA\appendtoks\csname#1\endcsname\to\everyuppercase
+ \@EA\appendtoks\csname#2\endcsname\to\everyuppercase}
+
+\def\defineULcharacter #1 #2 %
+ {\appendtoks\remapcase\to\everyULmap
+ \@EA\appendtoks\csname#1\endcsname\to\everyULmap
+ \@EA\appendtoks\csname#2\endcsname\to\everyULmap}
+
+% slightly faster with \smallcapped's but far more hash and stringspace
+%
+% \newif\ifuppercase \appendtoks\uppercasetrue\to\everyuppercase
+% \newif\iflowercase \appendtoks\lowercasetrue\to\everylowercase
+%
+% \def\defineULcharacter #1 #2 %
+% {\def\!!stringa{@#1}\@EA\letvalue\@EA\!!stringa\csname#1\endcsname
+% \def\!!stringa{@#2}\@EA\letvalue\@EA\!!stringa\csname#2\endcsname
+% \setvalue{#1}{\getvalue{@\ifuppercase#2\else#1\fi}}%
+% \setvalue{#2}{\getvalue{@\iflowercase#1\else#2\fi}}}
+
+% 2 = tricky, since expanding \definedfont[lowcasename] ... goes wrong
+
+\chardef\uppercasemode\plusthree % 0=ignore 1=normal 2=expand 3=auto
+\chardef\casecommode \plusone % 0=noexpand 1=expand
+
+\def\setcasecom #1#2{\def#1{\ifcase\casecommode\noexpand#1\else#2\fi}}
+
+% \def\OEPS{whatever}
+%
+% \startmapping[ec]
+% \defineuppercasecom \oeps {\getvalue{OEPS}}
+% \stopmapping
+%
+% \WORD{xx \oeps}
+
+\def\douppercase#1%
+ {\bgroup
+ \let\douppercase\firstofoneargument
+ \the\everyuppercase % currently also checks uppercasemode
+ \let\dochar\rawcharacter
+ \ifcase\uppercasemode
+ #1%
+ \or % No expansion here, otherwise \getvalue problems! Default!!!
+ %\edef\next{#1}% keep this to prevent roll back
+ %\uppercase\expandafter{\next}% keep this to prevent roll back
+ \uppercase{#1}%
+ \or
+ \chardef\casecommode\zerocount
+ \let\docasecom\firstoftwoarguments
+ \edef\ascii{#1}%
+ \edef\ascii{\expandafter\uppercase\expandafter{\ascii}}% needed when in regime
+ \chardef\casecommode\plusone
+ \ascii
+ \else
+ % mode three may trigger setting 2 elsewhere (e.g. regime test)
+ \uppercase{#1}%
+ \fi
+ \egroup}
+
+\prependtoksonce
+ \doifnot\currentregime\s!default
+ {\ifnum\uppercasemode=\plusthree \chardef\uppercasemode\plustwo \fi}%
+\to \everyuppercase
+
+%D \macros
+%D {everysanitize, EverySanitize}
+%D
+%D Whenever we are sanitizing strings, like we sometimes do
+%D when we deal with specials, the next token register can be
+%D called.
+
+\newevery \everysanitize \EverySanitize
+
+%D \macros
+%D {defineuclass,defineudigit,udigit}
+%D
+%D The next few macros are experimental and needed for unicoded
+%D chinese characters.
+
+\def\defineuclass #1 #2 #3 %
+ {\setvalue{uc\the\numexpr#2*256+#3\relax}{#1}}
+
+\def\defineudigit #1 #2 #3 {\setvalue{\characterencoding uc#1}{\uchar{#2}{#3}}}
+
+%D It may look strange, but for the moment, we want the encoding
+%D to be part of the digit specification. This may change!
+
+\unexpanded\def\udigit#1#2{\getvalue{@#1@uc\number#2}}
+
+%D \macros
+%D {uchar, octuchar, hexuchar}
+
+\ifx\uchar\undefined \def\uchar#1#2{(\number#1,\number#2)} \fi
+
+\def\octuchar#1#2{\uchar{`#1}{`#2}}
+\def\hexuchar#1#2{\uchar{"#1}{"#2}}
+
+%D Basics and fallbacks.
+
+\newif\ifignoreaccent
+
+\let\textaccent \accent
+\let\normaltextaccent\textaccent
+
+% ** we will explicitly embrace the two arguments, since in definitions
+% this may not be the case, and we don't want faulty expansions like
+% "\dobuildtextaccent \char 18 a" but "\dobuildtextaccent {\char 18}{a}"
+% instead
+
+\def\buildmathaccent#1%
+ {\mathaccent#1 }
+
+\def\buildtextaccent#1#2% **
+ {\ifignoreaccent
+ \expandafter\nobuildtextaccent
+ \else
+ \expandafter\dobuildtextaccent
+ \fi{#1}{#2}}
+
+\unexpanded\def\nobuildtextaccent#1#2%
+ {#2}
+
+\unexpanded\def\dobuildtextaccent#1#2%
+ {{\let\char\normalaccent#1\let\char\normalchar#2}}
+
+% some fake ones, name will change into build
+
+\unexpanded\def\bottomaccent#1#2#3#4#5% down right slantcorrection accent char
+ {\dontleavehmode % why this align mess
+ \vtop
+ {\forgetall
+ \baselineskip\zeropoint
+ \lineskip#1%
+ \everycr\emptytoks
+ \tabskip\zeropoint
+ \lineskiplimit\zeropoint
+ \setbox0\hbox{#4}%
+ \halign
+ {##\crcr\hbox{#5}\crcr
+ \hidewidth
+ \hskip#2\wd0
+ \hskip-#3\slantperpoint % in plain 1ex * dimenless value
+ \vbox to .2ex{\box0\vss}\hidewidth
+ \crcr}}}
+
+\def\buildtextmacron {\bottomaccent{.25ex}{0}{15}{\textmacron}}
+\def\buildtextbottomdot{\bottomaccent{.25ex}{0}{5}{\textbottomdot}}
+\def\buildtextcedilla {\bottomaccent{0ex}{0}{5}{\textcedilla}}
+\def\buildtextogonek {\bottomaccent{-.1ex}{.5}{0}{\textogonek}}
+
+%D A collectors item:
+
+\def\buildtextbottomcomma{\bottomaccent{.15ex}{0}{5}{\tx,}}
+
+%D Rarely needed but there:
+
+\unexpanded\def\topaccent#1#2#3#4#5% down right slantcorrection accent char
+ {\dontleavehmode
+ \bgroup
+ \setbox0\hbox{#4}%
+ \setbox2\hbox{#5}%
+ \hbox to \wd2 \bgroup
+ \hss\copy2\hss
+ \hskip-\wd2
+ \hss\hskip#2\wd0\hskip-#3\slantperpoint\raise#1\hbox{#4}\hss
+ \egroup
+ \egroup}
+
+\def\buildtextgrave{\topaccent{0pt}{0}{15}{\textgrave}} % e.g.
+
+% \definecharacter schwa {\hbox{\rotate[rotation=180,location=high]{\hbox{e}}}}
+% \definecharacter schwagrave {\buildtextgrave\schwa}
+
+% math stuff, will change
+
+\def\definemathaccent#1 #2%
+ {\setvalue{\string#1}{#2}%
+ \setvalue{normalmathaccent\string#1}{#2}}
+
+\def\donormalmathaccent#1%
+ {\getvalue{normalmathaccent\string#1}}
+
+%D Some precautions:
+
+\ifx\usepdffontresource\undefined
+ \def\usepdffontresource #1 {} % this will be defined elsewhere
+\fi
+
+\def\donthandleaccent #1{\expandafter\string\csname#1\endcsname\space}
+\def\donthandlecommand #1{\expandafter\string\csname#1\endcsname\space}
+\def\donthandlecharacter #1{\expandafter\string\csname#1\endcsname\space}
+
+\def\stringifyhandleaccent #1{\strchr{#1}}
+\def\stringifyhandlecommand #1{\strchr{#1}}
+\def\stringifyhandlecharacter#1{\strchr{#1}}
+
+\def\keephandleaccent #1{\expandafter\noexpand\csname#1\endcsname}
+\def\keephandlecommand #1{\expandafter\noexpand\csname#1\endcsname}
+\def\keephandlecharacter #1{\expandafter\noexpand\csname#1\endcsname}
+
+\def\handleaccent #1{\csname#1\endcsname}
+\def\handlecommand #1{\csname#1\endcsname}
+\def\handlecharacter #1{\csname#1\endcsname}
+
+\def\dontexpandencoding
+ {\let\dohandleaccent \donthandleaccent
+ \let\dohandlecommand \donthandlecommand
+ \let\dohandlecharacter\donthandlecharacter}
+
+\def\keepencodedtokens
+ {\let\dohandleaccent \keephandleaccent
+ \let\dohandlecommand \keephandlecommand
+ \let\dohandlecharacter\keephandlecharacter}
+
+\def\literateencodedtokens
+ {% \let\dohandleaccent \keephandleaccent
+ % \let\dohandlecommand \keephandlecommand
+ \let\dohandlecharacter\keephandlecharacter}
+
+\def\stringifyencodedtokens
+ {% \let\dohandleaccent \stringifyhandleaccent
+ % \let\dohandlecommand \stringifyhandlecommand
+ \let\dohandlecharacter\stringifyhandlecharacter}
+
+\unexpanded\def\uhandleaccent #1{\csname#1\endcsname}
+\unexpanded\def\uhandlecommand #1{\csname#1\endcsname}
+\unexpanded\def\uhandlecharacter#1{\csname#1\endcsname}
+
+\def\dontexpandencodedtokens
+ {\def\dohandleaccent {\uhandleaccent}%
+ \def\dohandlecommand {\uhandlecommand}%
+ \def\dohandlecharacter{\uhandlecharacter}}
+
+% no longer: \def\convertencodedtokens{\dontexpandencoding} but:
+
+\def\convertencodedtokens{\stringifyencodedtokens}
+
+% test case:
+%
+% \enableregime[cp1250]
+% \mainlanguage[cz]
+%
+% \starttext
+%
+% \title{Ϭuޯu餭 kon졺p
+% \placelist[chapter][criterium=all]
+%
+% \startbuffer
+% <chapter>
+% <title>Ϭuޯu餭 kon졺p󛱴itle>
+% </chapter>
+% \stopbuffer
+%
+% \defineXMLenvironment
+% [chapter]
+% {\defineXMLsave[title]}
+% {\expanded{\chapter{\XMLflush{title}}}}
+% \processXMLbuffer
+%
+% \setuphead[chapter][expansion=yes]
+% \defineXMLenvironment
+% [chapter]
+% {\defineXMLsave[title]}
+% {\chapter{\XMLflush{title}}}
+% \processXMLbuffer
+%
+% \stoptext
+
+%D Still valid? To be checked:
+
+\def\doignoreaccent #1#2{\string#1\string#2}%
+\def\doignorecommand #1{\string#1}
+\def\doignorecharacter#1{\string#1}
+
+\def\ignoreencoding
+ {\let\dohandleaccent \doignoreaccent
+ \let\dohandlecommand \doignorecommand
+ \let\dohandlecharacter\doignorecharacter}
+
+\appendtoks
+ \ignoreencoding
+\to \everycleanupfeatures
+
+\appendtoks
+ \keepencodedtokens
+\to \everysafeexpanded
+
+%D Now we will not redefine any more, so:
+
+\let\normaldohandleaccent \dohandleaccent
+\let\normaldohandlecharacter\dohandlecharacter
+
+\definecommand ` {\buildtextaccent\textgrave}
+\definecommand ' {\buildtextaccent\textacute}
+\definecommand r {\buildtextaccent\textring}
+\definecommand v {\buildtextaccent\textcaron}
+\definecommand u {\buildtextaccent\textbreve}
+\definecommand = {\buildtextaccent\textmacron}
+\definecommand ^ {\buildtextaccent\textcircumflex}
+\definecommand . {\buildtextaccent\textdotaccent}
+\definecommand H {\buildtextaccent\texthungarumlaut}
+\definecommand ~ {\buildtextaccent\texttilde}
+\definecommand " {\buildtextaccent\textdiaeresis}
+
+\definecommand c {\buildtextcedilla}
+\definecommand b {\buildtextmacron}
+\definecommand d {\buildtextbottomdot}
+\definecommand k {\buildtextogonek}
+
+\definemathaccent acute {\buildmathaccent\mathacute}
+\definemathaccent grave {\buildmathaccent\mathgrave}
+\definemathaccent ddot {\buildmathaccent\mathddot}
+\definemathaccent tilde {\buildmathaccent\mathtilde}
+\definemathaccent bar {\buildmathaccent\mathbar}
+\definemathaccent breve {\buildmathaccent\mathbreve}
+\definemathaccent check {\buildmathaccent\mathcheck}
+\definemathaccent hat {\buildmathaccent\mathhat}
+\definemathaccent vec {\buildmathaccent\mathvec}
+\definemathaccent dot {\buildmathaccent\mathdot}
+\definemathaccent widetilde {\buildmathaccent\mathwidetilde}
+\definemathaccent widehat {\buildmathaccent\mathwidehat}
+
+\useencoding[def] % defaults (partly simplified)
+\useencoding[acc] % accent commands
+\useencoding[raw] % simplified (incomplete)
+\useencoding[com] % a few commands
+\useencoding[cas] % case mapping, not needed in mkiv
+\useencoding[mis] % a few commands
+
+%D We preload several encodings:
+
+\ifnum\texengine=\xetexengine
+ \setupencoding[\s!default=\s!default]
+\else
+ \useencoding[ans,il2,ec,tbo,pdf,pol,qx,t5,l7x,cyr,agr] % pol and il2 will go away, not needed in mkiv, uc removed
+ \useencoding[032,033,037] % fallbacks for some unicode chars
+ \setupencoding[\s!default=ec] % was: [\s!default=\s!default]
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
new file mode 100644
index 000000000..da1892faf
--- /dev/null
+++ b/tex/context/base/enco-ini.mkiv
@@ -0,0 +1,536 @@
+%D \module
+%D [ file=enco-ini,
+%D version=2007.02.19, % 2000.12.27, % 1998.12.03,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is stripped down version of th eoriginal enco-ini.tex
+%D file. For more details you might want to study the \MKII\ file
+%D but since \LUATEX\ is unicode inside we need less code.
+
+% When dealing with characters we have four cases to take into account
+% when moving from mkii to mkiv:
+
+% 1. <byte 200> => ref to slot 200 in current font
+% 2. \char 200 => ref to slot 200 in current font
+% 3. <active 200> => can (e.g.) map to another slot in current font
+% 4. \namedglyph => can map to some slot in some font
+
+% Using case 2 for special characters is doomed to fail because we are not going
+% to intercept these on the fly as happens automatically with traditional font
+% encoding handling. We could do that in a node pass but it's not worth the effort
+% because we seldom use this case in a document source.
+
+% We can consider using utf as internal format for mkii. The main reason for not
+% doing this before was that it was slow. On the other hand, it would make dealing
+% with utility files easier. However, we've now kind of frozen mkii.
+
+\writestatus{loading}{ConTeXt Encoding Macros / Initialization}
+
+\unprotect
+
+%D Quite some commands are now obsolete. We keep only a few commands
+%D around, just in case they are used in styles (and in for instance
+%D symb and xtag files).
+
+\unexpanded\def\startencoding [#1]{} % used in symb
+\let\stopencoding \relax
+\unexpanded\def\setupencoding [#1]{}
+\def\enablemapping [#1]{}
+\def\enableencoding[#1]{}
+
+\def\currentencoding{utf}
+\def\currentmapping {utf}
+\let\defaultencoding\s!default
+
+% todo:
+
+% \def\showaccents {\f!encodingprefix\s!run}
+% \def\showcharacters {\f!encodingprefix\s!run}
+% \def\showcharacterbounds {\f!encodingprefix\s!run}
+% \def\showhyphenations {\f!encodingprefix\s!run}
+% \def\showmapping {\f!encodingprefix\s!run}
+
+%D \macros
+%D {defineaccent, definecharacter, definecommand}
+
+\unexpanded\def\defineaccent#1 #2 #3 %
+ {\setevalue{\string#1}{\noexpand\dohandleaccent{\string#1}}%
+ \setvalue{\??ac\string#1\string#2}{#3}}
+
+\def\dohandleaccent#1#2%
+ {\csname\??ac\string#1\string#2\empty\endcsname}
+
+\unexpanded\def\definecharacter#1 #2 %
+ {\doifnumberelse{\string#2}
+ {\setevalue{\string#1}{\utfchar{#2}}} % or {\expandafter\chardef\csname#1\endcsname#2\relax}
+ {\setuvalue {\string#1}{#2}}}
+
+\unexpanded\def\definecommand#1 #2 %
+ {\setuvalue{\string#1}{#2}}
+
+%D \macros
+%D {everyuppercase, EveryUppercase,
+%D everyuppercase, EveryUppercase,
+%D everysanitize, EverySanitize}
+
+\newevery \everyuppercase \EveryUppercase
+\newevery \everylowercase \EveryLowercase
+\newevery \everysanitize \EverySanitize
+
+%D Some saved meanings (not really needed):
+
+\let\textaccent \accent
+\let\normaltextaccent\accent
+
+%D Accent handling (try to avoid this):
+
+\newbox\accenttestbox
+
+\def\buildmathaccent#1%
+ {\mathaccent#1 }
+
+\unexpanded\def\buildtextaccent#1#2%
+ {\begingroup
+ \global\setbox\accenttestbox\hbox{#1}%
+ \scratchcounter\ctxlua{characters.charcode(\number\accenttestbox)}%
+ \ifcase\scratchcounter\else\accent\scratchcounter\fi
+ \relax#2%
+ \endgroup}
+
+\unexpanded\def\bottomaccent#1#2#3#4#5% down right slantcorrection accent char
+ {\dontleavehmode % why this align mess
+ \vtop
+ {\forgetall
+ \baselineskip\zeropoint
+ \lineskip#1%
+ \everycr\emptytoks
+ \tabskip\zeropoint
+ \lineskiplimit\zeropoint
+ \setbox0\hbox{#4}%
+ \halign
+ {##\crcr\hbox{#5}\crcr
+ \hidewidth
+ \hskip#2\wd0
+ \hskip-#3\slantperpoint % in plain 1ex * dimenless value
+ \vbox to .2ex{\box0\vss}\hidewidth
+ \crcr}}}
+
+\unexpanded\def\buildtextmacron {\bottomaccent{.25ex}{0}{15}{\textmacron}}
+\unexpanded\def\buildtextbottomdot {\bottomaccent{.25ex}{0}{5}{\textbottomdot}}
+\unexpanded\def\buildtextcedilla {\bottomaccent{0ex}{0}{5}{\textcedilla}}
+\unexpanded\def\buildtextogonek {\bottomaccent{-.1ex}{.5}{0}{\textogonek}}
+\unexpanded\def\buildtextbottomcomma{\bottomaccent{.15ex}{0}{5}{\tx,}}
+
+\let\d\buildtextbottomdot
+
+\unexpanded\def\topaccent#1#2#3#4#5% down right slantcorrection accent char
+ {\dontleavehmode
+ \bgroup
+ \setbox0\hbox{#4}%
+ \setbox2\hbox{#5}%
+ \hbox to \wd2 \bgroup
+ \hss\copy2\hss
+ \hskip-\wd2
+ \hss\hskip#2\wd0\hskip-#3\slantperpoint\raise#1\hbox{#4}\hss
+ \egroup
+ \egroup}
+
+\def\buildtextgrave{\topaccent{0pt}{0}{15}{\textgrave}} % e.g.
+
+\unexpanded\def\definemathaccent#1 #2%
+ {\setvalue{#1}{\mathaccent#2 }}
+
+%D Math (will move):
+
+\definemathaccent acute \mathacute
+\definemathaccent grave \mathgrave
+\definemathaccent ddot \mathddot
+\definemathaccent tilde \mathtilde
+\definemathaccent bar \mathbar
+\definemathaccent breve \mathbreve
+\definemathaccent check \mathcheck
+\definemathaccent hat \mathhat
+\definemathaccent vec \mathvec
+\definemathaccent dot \mathdot
+\definemathaccent widetilde \mathwidetilde
+\definemathaccent widehat \mathwidehat
+
+% from enco-com:
+
+\def\AA{\Aring}
+\def\aa{\aring}
+\def\AE{\AEligature}
+\def\ae{\aeligature}
+\def\CC{\Ccedilla}
+\def\cc{\ccedilla}
+\def \L{\Lstroke}
+\def \l{\lstroke}
+\def \O{\Ostroke}
+\def \o{\ostroke}
+\def\OE{\OEligature}
+\def\oe{\oeligature}
+\def\SZ{\Ssharp}
+\def\sz{\ssharp}
+\def\SS{\ssharp}
+\def\IJ{\IJligature}
+\def\ij{\ijligature}
+\def \i{\dotlessi}
+\def \j{\dotlessj}
+
+% from enco-def:
+
+\def\dotlessI {I}
+\def\dotlessJ {J}
+
+\def\Ssharp {SS}
+
+\def\eszett {\ssharp}
+\def\Eszett {\Ssharp}
+
+\def\lslash {\lstroke}
+\def\Lslash {\Lstroke}
+\def\dslash {\dstroke}
+\def\Dslash {\Dstroke}
+\def\oslash {\ostroke}
+\def\Oslash {\Ostroke}
+\def\dcroat {\dstroke}
+\def\Dcroat {\Dstroke}
+
+\def\Kcedilla {\Kcommaaccent}
+\def\kcedilla {\kcommaaccent}
+\def\Lcedilla {\Lcommaaccent}
+\def\lcedilla {\lcommaaccent}
+\def\Ncedilla {\Ncommaaccent}
+\def\ncedilla {\ncommaaccent}
+\def\Rcedilla {\Rcommaaccent}
+\def\rcedilla {\rcommaaccent}
+
+\def\S {\sectionmark}
+\def\P {\paragraphmark}
+
+\def\aumlaut {\adiaeresis}
+\def\eumlaut {\ediaeresis}
+\def\iumlaut {\idiaeresis}
+\def\oumlaut {\odiaeresis}
+\def\uumlaut {\udiaeresis}
+\def\Aumlaut {\Adiaeresis}
+\def\Eumlaut {\Ediaeresis}
+\def\Iumlaut {\Idiaeresis}
+\def\Oumlaut {\Odiaeresis}
+\def\Uumlaut {\Udiaeresis}
+
+% for latex users
+
+\def\textS {\sectionmark}
+\def\textP {\paragraphmark}
+
+% for old times sake
+
+\def\textflorin{\fhook}
+\def\florin {\textflorin}
+\def\dollar {\textdollar}
+\def\pound {\textsterling}
+\def\sterling {\textsterling}
+\def\promille {\perthousand}
+\def\permille {\perthousand}
+\def\procent {\percent}
+\def\permine {\fakepermine}
+
+% some more
+
+\def\hyphen {\softhyphen}
+\def\compoundwordmark {\hyphen}
+\def\cwm {\hyphen}
+\def\nonbreakinghyphen{\hyphen}
+\def\breakinghyphen {\hyphen\prewordbreak}
+
+% quotes
+
+\def\lowerleftsingleninequote {\quotesinglebase}
+\def\lowerleftdoubleninequote {\quotedblbase}
+\def\lowerrightsingleninequote {\quotesinglebase}
+\def\lowerrightdoubleninequote {\quotedblbase}
+
+\def\upperleftsingleninequote {\quoteright}
+\def\upperleftdoubleninequote {\quotedblright}
+\def\upperrightsingleninequote {\quoteright}
+\def\upperrightdoubleninequote {\quotedblright}
+
+\def\upperleftsinglesixquote {\quoteleft}
+\def\upperleftdoublesixquote {\quotedblleft}
+\def\upperrightsinglesixquote {\quoteleft}
+\def\upperrightdoublesixquote {\quotedblleft}
+
+\def\leftsubguillemot {\guilsingleleft}
+\def\rightsubguillemot {\guilsingleright}
+
+% obsolete:
+
+% \greekleftquot {[obsolete]}
+% \greekrightquot {[obsolete]}
+% \greekapostrophos {[obsolete]}
+% \greekupsilondialytika{[obsolete]}
+% \Ycaron {[obsolete]}
+% \ycaron {[obsolete]}
+
+% to be done in char-def:
+
+% \definecharacter cyrillicGUP {GUP}
+% \definecharacter cyrillicGHCRS {GHCRS}
+% \definecharacter cyrillicZHDSC {ZHDSC}
+% \definecharacter cyrillicKDSC {KDSC}
+% \definecharacter cyrillicKBEAK {KBEAK}
+% \definecharacter cyrillicKVCRS {KVCRS}
+% \definecharacter cyrillicNG {NG}
+% \definecharacter cyrillicOTLD {OTLD}
+% \definecharacter cyrillicY {Y}
+% \definecharacter cyrillicYHCRS {YHCRS}
+% \definecharacter cyrillicHDSC {HDSC}
+% \definecharacter cyrillicCHVCRS {CHVCRS}
+% \definecharacter cyrillicCHRDSC {CHRDSC}
+% \definecharacter cyrillicQ {Q}
+% \definecharacter cyrillicW {W}
+%
+% \definecharacter cyrillicgup {gup}
+% \definecharacter cyrillicghcrs {ghcrs}
+% \definecharacter cyrilliczhdsc {zhdsc}
+% \definecharacter cyrillickdsc {kdsc}
+% \definecharacter cyrillickbeak {kbeak}
+% \definecharacter cyrillickvcrs {kvcrs}
+% \definecharacter cyrillicng {ng}
+% \definecharacter cyrillicotld {otld}
+% \definecharacter cyrillicy {y}
+% \definecharacter cyrillicyhcrs {yhcrs}
+% \definecharacter cyrillichdsc {hdsc}
+% \definecharacter cyrillicchvcrs {chvcrs}
+% \definecharacter cyrillicchrdsc {chrdsc}
+% \definecharacter cyrillicq {q}
+% \definecharacter cyrillicw {w}
+
+% \definecharacter softhyphen 45
+% \definecharacter compoundwordmark 23
+
+% left-overs (some day in private unicode space, so that we can roundtrip)
+
+\unexpanded\def\textblacksquare {\dontleavehmode\hbox{\vrule\!!width.3\s!em\!!height.4\s!em\!!depth-.1\s!em}}
+\unexpanded\def\schwa {\hbox{\rotate[\c!rotation=180,\c!location=\v!high]{\hbox{e}}}}
+\unexpanded\def\schwagrave {\buildtextgrave\schwa}
+
+\chardef\textcontrolspace"2423
+
+\unexpanded\def\fallbackcontrolspace
+ %{\getglyph{ComputerModernMono}\textcontrolspace}
+ {\getglyph{LMTypewriter10-Regular}\textcontrolspace}
+
+\unexpanded\def\normalcontrolspace
+ {\iffontchar\font\textcontrolspace
+ \textcontrolspace
+ \else
+ \fallbackcontrolspace
+ \fi}
+
+\let\textvisiblespace\normalcontrolspace
+
+\unexpanded\def\fastcontrolspace % no glyph resolving after first (use grouped)
+ {\dofastcontrolspace}
+
+\def\dofastcontrolspace
+ {\iffontchar\font\textcontrolspace
+ \nofastfallbackcontrolspace
+ \else
+ \dofastfallbackcontrolspace
+ \fi
+ \dofastcontrolspace}
+
+\newbox\controlspacebox
+
+\def\nofastfallbackcontrolspace
+ {\let\dofastcontrolspace\textcontrolspace}
+
+\def\dofastfallbackcontrolspace
+ {\setbox\controlspacebox\hbox{\space}%
+ \setbox\controlspacebox\hbox to \wd\controlspacebox{\hss\fallbackcontrolspace\hss}%
+ \let\dofastcontrolspace\flushcontrolspacebox}
+
+\def\flushcontrolspacebox
+ {\copy\controlspacebox}
+
+% a few defaults (\<whatever>{}), we really need the verbose \empty as it will be
+% stringified
+
+\defineaccent ^ {\empty} {\textcircumflex}
+\defineaccent ` {\empty} {\textgrave}
+\defineaccent ~ {\empty} {\texttilde}
+\defineaccent " {\empty} {\textdiaeresis}
+\defineaccent ' {\empty} {\textacute}
+\defineaccent . {\empty} {\textdotaccent}
+\defineaccent = {\empty} {\textmacron}
+\defineaccent c {\empty} {\textcedilla}
+\defineaccent H {\empty} {\texthungarumlaut}
+\defineaccent k {\empty} {\textogonek}
+\defineaccent r {\empty} {\textring}
+\defineaccent u {\empty} {\textbreve}
+\defineaccent v {\empty} {\textcaron}
+
+% from enco-acc:
+%
+% we should to this at the lua end and share code ..
+
+\defineaccent ^ A {\Acircumflex} \defineaccent ^ a {\acircumflex}
+\defineaccent ^ C {\Ccircumflex} \defineaccent ^ c {\ccircumflex}
+\defineaccent ^ E {\Ecircumflex} \defineaccent ^ e {\ecircumflex}
+\defineaccent ^ G {\Gcircumflex} \defineaccent ^ g {\gcircumflex}
+\defineaccent ^ H {\Hcircumflex} \defineaccent ^ h {\hcircumflex}
+\defineaccent ^ I {\Icircumflex} \defineaccent ^ i {\icircumflex} \defineaccent ^ {\i} {\icircumflex}
+\defineaccent ^ J {\Jcircumflex} \defineaccent ^ j {\jcircumflex} \defineaccent ^ {\j} {\jcircumflex}
+\defineaccent ^ O {\Ocircumflex} \defineaccent ^ o {\ocircumflex}
+\defineaccent ^ S {\Scircumflex} \defineaccent ^ s {\scircumflex}
+\defineaccent ^ U {\Ucircumflex} \defineaccent ^ u {\ucircumflex}
+\defineaccent ^ W {\Wcircumflex} \defineaccent ^ w {\wcircumflex}
+\defineaccent ^ Y {\Ycircumflex} \defineaccent ^ y {\ycircumflex}
+
+\defineaccent ` A {\Agrave} \defineaccent ` a {\agrave}
+\defineaccent ` E {\Egrave} \defineaccent ` e {\egrave}
+\defineaccent ` I {\Igrave} \defineaccent ` i {\igrave} \defineaccent ` {\i} {\igrave}
+\defineaccent ` O {\Ograve} \defineaccent ` o {\ograve}
+\defineaccent ` U {\Ugrave} \defineaccent ` u {\ugrave}
+\defineaccent ` Y {\Ygrave} \defineaccent ` y {\ygrave}
+
+\defineaccent ~ A {\Atilde} \defineaccent ~ a {\atilde}
+\defineaccent ~ I {\Itilde} \defineaccent ~ i {\itilde} \defineaccent ~ {\i} {\itilde}
+\defineaccent ~ O {\Otilde} \defineaccent ~ o {\otilde}
+\defineaccent ~ U {\Utilde} \defineaccent ~ u {\utilde}
+\defineaccent ~ N {\Ntilde} \defineaccent ~ n {\ntilde}
+
+\defineaccent " A {\Adiaeresis} \defineaccent " a {\adiaeresis}
+\defineaccent " E {\Ediaeresis} \defineaccent " e {\ediaeresis}
+\defineaccent " I {\Idiaeresis} \defineaccent " i {\idiaeresis} \defineaccent " {\i} {\idiaeresis}
+\defineaccent " O {\Odiaeresis} \defineaccent " o {\odiaeresis}
+\defineaccent " U {\Udiaeresis} \defineaccent " u {\udiaeresis}
+\defineaccent " Y {\Ydiaeresis} \defineaccent " y {\ydiaeresis}
+
+\defineaccent ' A {\Aacute} \defineaccent ' a {\aacute}
+\defineaccent ' C {\Cacute} \defineaccent ' c {\cacute}
+\defineaccent ' E {\Eacute} \defineaccent ' e {\eacute}
+\defineaccent ' I {\Iacute} \defineaccent ' i {\iacute} \defineaccent ' {\i} {\iacute}
+\defineaccent ' L {\Lacute} \defineaccent ' l {\lacute}
+\defineaccent ' N {\Nacute} \defineaccent ' n {\nacute}
+\defineaccent ' O {\Oacute} \defineaccent ' o {\oacute}
+\defineaccent ' R {\Racute} \defineaccent ' r {\racute}
+\defineaccent ' S {\Sacute} \defineaccent ' s {\sacute}
+\defineaccent ' U {\Uacute} \defineaccent ' u {\uacute}
+\defineaccent ' Y {\Yacute} \defineaccent ' y {\yacute}
+\defineaccent ' Z {\Zacute} \defineaccent ' z {\zacute}
+
+\defineaccent . C {\Cdotaccent} \defineaccent . c {\cdotaccent}
+\defineaccent . E {\Edotaccent} \defineaccent . e {\edotaccent}
+\defineaccent . G {\Gdotaccent} \defineaccent . g {\gdotaccent}
+\defineaccent . I {\Idotaccent} \defineaccent . i {\idotaccent} \defineaccent . {\i} {\idotaccent}
+\defineaccent . Z {\Zdotaccent} \defineaccent . z {\zdotaccent}
+
+\defineaccent = A {\Amacron} \defineaccent = a {\amacron}
+\defineaccent = E {\Emacron} \defineaccent = e {\emacron}
+\defineaccent = I {\Imacron} \defineaccent = i {\imacron} \defineaccent = {\i} {\imacron}
+\defineaccent = O {\Omacron} \defineaccent = o {\omacron}
+\defineaccent = U {\Umacron} \defineaccent = u {\umacron}
+
+\defineaccent c C {\Ccedilla} \defineaccent c c {\ccedilla}
+\defineaccent c K {\Kcedilla} \defineaccent c k {\kcedilla}
+\defineaccent c L {\Lcedilla} \defineaccent c l {\lcedilla}
+\defineaccent c N {\Ncedilla} \defineaccent c n {\ncedilla}
+\defineaccent c R {\Rcedilla} \defineaccent c r {\rcedilla}
+\defineaccent c S {\Scedilla} \defineaccent c s {\scedilla}
+\defineaccent c T {\Tcedilla} \defineaccent c t {\tcedilla}
+
+\defineaccent H O {\Ohungarumlaut} \defineaccent H o {\ohungarumlaut}
+\defineaccent H u {\uhungarumlaut} \defineaccent H U {\Uhungarumlaut}
+
+\defineaccent k A {\Aogonek} \defineaccent k a {\aogonek}
+\defineaccent k E {\Eogonek} \defineaccent k e {\eogonek}
+\defineaccent k I {\Iogonek} \defineaccent k i {\iogonek}
+\defineaccent k U {\Uogonek} \defineaccent k u {\uogonek}
+
+\defineaccent r A {\Aring} \defineaccent r a {\aring}
+\defineaccent r U {\Uring} \defineaccent r u {\uring}
+
+\defineaccent u A {\Abreve} \defineaccent u a {\abreve}
+\defineaccent u E {\Ebreve} \defineaccent u e {\ebreve}
+\defineaccent u G {\Gbreve} \defineaccent u g {\gbreve}
+\defineaccent u I {\Ibreve} \defineaccent u i {\ibreve} \defineaccent u {\i} {\ibreve}
+\defineaccent u O {\Obreve} \defineaccent u o {\obreve}
+\defineaccent u U {\Ubreve} \defineaccent u u {\ubreve}
+
+\defineaccent v C {\Ccaron} \defineaccent v c {\ccaron}
+\defineaccent v D {\Dcaron} \defineaccent v d {\dcaron}
+\defineaccent v E {\Ecaron} \defineaccent v e {\ecaron}
+\defineaccent v L {\Lcaron} \defineaccent v l {\lcaron}
+\defineaccent v N {\Ncaron} \defineaccent v n {\ncaron}
+\defineaccent v R {\Rcaron} \defineaccent v r {\rcaron}
+\defineaccent v S {\Scaron} \defineaccent v s {\scaron}
+\defineaccent v T {\Tcaron} \defineaccent v t {\tcaron}
+\defineaccent v Z {\Zcaron} \defineaccent v z {\zcaron}
+
+% from enco-mis:
+
+\def\fakepercent
+ {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}}
+
+\def\fakeperthousand
+ {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}}
+
+\def\fakepermine
+ {\dontleavehmode
+ \bgroup
+ \setbox\scratchbox\hbox
+ {\mathematics{+}}%
+ \hbox to \wd\scratchbox
+ {\hss
+ \mathematics{^{\scriptscriptstyle-}\kern-.4em/\kern-.3em_{\scriptscriptstyle-}}%
+ \hss}%
+ \egroup}
+
+%D A smaller and bolder variant, more like the math and monospaced ones.
+
+% \def\fakeunderscore
+% {\dontleavehmode\hbox % was \leavevmode
+% {\setbox\scratchbox\hbox{(}%
+% \scratchdimen.2\dp\scratchbox
+% \setbox\scratchbox\hbox{\space}%
+% \vrule
+% \!!depth \scratchdimen
+% \!!width \wd\scratchbox
+% \!!height\zeropoint}}
+
+% \startTEXpage
+% \ruledhbox{\strut$1\fakeunderscore^{1\fakeunderscore}$}
+% \ruledhbox{\strut$1\xfakeunderscore^{1\xfakeunderscore}$}
+% \stopTEXpage
+
+\def\fakeunderscore
+ {\relax\ifmmode
+ \vrule\!!depth .12\fontexheight\mathstylefont\normalmathstyle\!!width \fontinterwordspace\mathstylefont\normalmathstyle\!!height\zeropoint\relax
+ \else
+ \dontleavehmode\hbox{\vrule\!!depth .12\fontexheight\font\!!width \fontinterwordspace\font\!!height\zeropoint}%
+ \fi}
+
+\def\fakeunderscores{\let\_\fakeunderscore}
+\def\textunderscores{\let\_\textunderscore}
+
+\textunderscores
+
+\ifx\mathunderscore\undefined \let\mathunderscore\fakeunderscore \fi
+\ifx\textunderscore\undefined \let\textunderscore\fakeunderscore \fi
+
+\unexpanded\def\normalunderscore{\ifmmode\mathunderscore\else\textunderscore\fi}
+
+\let\_\normalunderscore
+
+\protect \endinput
diff --git a/tex/context/base/enco-l7x.mkii b/tex/context/base/enco-l7x.mkii
new file mode 100644
index 000000000..8f355317b
--- /dev/null
+++ b/tex/context/base/enco-l7x.mkii
@@ -0,0 +1,236 @@
+%D \module
+%D [ file=enco-l7x,
+%D version=2010.01.22,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=\LATEX\ L7x Encoding,
+%D author={Hans Hagen \& Mojca Miklavec},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Encoding vector to support Latvian and Lithuanian. The first
+%D part is taken from EC encoding, the rest has not been tested
+%D extensively.
+
+\startmapping[l7x]
+
+\definecaseswap 25 `I % dotless i (TODO - probably wrong; maybe use \defineuppercasecom)
+\definecaseswap 156 140 % oeligature
+\definecaseswap 184 168 % ostroke
+\definecaseswap 186 170 % rcommaaccent
+\definecaseswap 191 175 % aeligature
+\definecaseself 223 % ssharp (this is wrong, but no better way)
+
+\definecasemaps 192 to 222 lc +32 uc 0
+\definecasemaps 224 to 254 lc 0 uc -32
+\resetcaserange 215 to 215 % textmultiply
+\resetcaserange 247 to 247 % textdiv
+
+\stopmapping
+
+\startencoding[l7x]
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter texthungarumlaut 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter textogonek 12
+\definecharacter quotesinglebase 13
+\definecharacter guilsingleleft 14
+\definecharacter guilsingleright 15
+\definecharacter quotedblleft 16
+\definecharacter quotedblright 17
+\definecharacter quotedblbase 18
+\definecharacter leftguillemot 19
+\definecharacter rightguillemot 20
+\definecharacter endash 21
+\definecharacter emdash 22
+%definecharacter compoundwordmark 23
+%definecharacter perthousand 24
+\definecharacter dotlessi 25 % or when missing: {j}
+\definecharacter dotlessj 26
+% ff 27
+% fi 28
+% fl 29
+% ffi 30
+% ffl 31
+%definecharacter textvisiblespace 32
+% exclam ! 33
+\definecharacter quotedbl 34
+% numbersign # 35
+% dollar $ 36
+\definecharacter percent 37
+% ampersand & 38
+%definecharacter quotesingle 39 % fake 'm TODO:enco-def!!!!
+\definecharacter quoteright 39
+% parenleft ( 40
+% parenright ) 41
+% asterisk * 42
+% plus + 43
+% comma , 44
+\definecharacter softhyphen 45
+% period . 46
+% slash / 47
+% 0-9 48-57
+% colon : 58
+% semicolon ; 59
+% less < 60
+% equal = 61
+% greater > 62
+% question ? 63
+% at @ 64
+% A-Z 65-90
+% bracketleft [ 91
+\definecharacter textbackslash 92
+% bracketright ] 93
+\definecharacter textasciicircum 94
+\definecharacter textunderscore 95
+\definecharacter quoteleft 96
+% a-z 97-122
+\definecharacter textbraceleft 123
+\definecharacter textbraceright 125
+\definecharacter textasciitilde 126
+% .notdef 127
+\definecharacter texteuro 128
+% .notdef 129
+\definecharacter quotesinglebase 130
+\definecharacter textflorin 131 \definecharacter fhook 131
+\definecharacter quotedblbase 132
+\definecharacter textellipsis 133
+\definecharacter textdag 134
+\definecharacter textddag 135
+% .notdef 136
+\definecharacter perthousand 137
+% .notdef 138
+\definecharacter guilsingleleft 139
+\definecharacter OEligature 140 % TODO: also \OE???
+\definecharacter textdiaeresis 141
+\definecharacter textcaron 142
+\definecharacter textcedilla 143
+% .notdef 144
+\definecharacter quoteleft 145
+\definecharacter quoteright 146
+\definecharacter quotedblleft 147
+\definecharacter quotedblright 148
+\definecharacter textbullet 149
+\definecharacter endash 150
+\definecharacter emdash 151
+% .notdef 152
+\definecharacter trademark 153
+% .notdef 154
+\definecharacter guilsingleright 155
+\definecharacter oeligature 156
+\definecharacter textmacron 157
+\definecharacter textogonek 158
+% .notdef 159
+%definecharacter space 160 % TODO!!!
+\definecharacter quotedblright 161
+\definecharacter textcent 162
+\definecharacter textsterling 163
+\definecharacter textcurrency 164
+\definecharacter quotedblbase 165
+\definecharacter textbrokenbar 166
+\definecharacter sectionmark 167
+\definecharacter Ostroke 168
+\definecharacter copyright 169
+\definecharacter Rcommaaccent 170
+\definecharacter leftguillemot 171
+\definecharacter textlognot 172
+%definecharacter softhyphen 173 % -> 45 (TODO!!!)
+\definecharacter registered 174
+\definecharacter AEligature 175
+\definecharacter textdegree 176
+\definecharacter textpm 177
+\definecharacter twosuperior 178
+\definecharacter threesuperior 179
+\definecharacter quotedblleft 180
+\definecharacter textmu 181
+\definecharacter paragraphmark 182
+\definecharacter periodcentered 183
+\definecharacter ostroke 184
+\definecharacter onesuperior 185
+\definecharacter rcommaaccent 186
+\definecharacter rightguillemot 187
+\definecharacter onequarter 188
+\definecharacter onehalf 189
+\definecharacter threequarter 190
+\definecharacter aeligature 191
+\definecharacter Aogonek 192
+\definecharacter Iogonek 193
+\definecharacter Amacron 194
+\definecharacter Cacute 195
+\definecharacter Adiaeresis 196
+\definecharacter Aring 197
+\definecharacter Eogonek 198
+\definecharacter Emacron 199
+\definecharacter Ccaron 200
+\definecharacter Eacute 201
+\definecharacter Zacute 202
+\definecharacter Edotaccent 203
+\definecharacter Gcommaaccent 204
+\definecharacter Kcommaaccent 205
+\definecharacter Imacron 206
+\definecharacter Lcommaaccent 207
+\definecharacter Scaron 208
+\definecharacter Nacute 209
+\definecharacter Ncommaaccent 210
+\definecharacter Oacute 211
+\definecharacter Omacron 212
+\definecharacter Otilde 213
+\definecharacter Odiaeresis 214
+\definecharacter textmultiply 215
+\definecharacter Uogonek 216
+\definecharacter Lstroke 217
+\definecharacter Sacute 218
+\definecharacter Umacron 219
+\definecharacter Udiaeresis 220
+\definecharacter Zdotaccent 221
+\definecharacter Zcaron 222
+\definecharacter ssharp 223
+\definecharacter aogonek 224
+\definecharacter iogonek 225
+\definecharacter amacron 226
+\definecharacter cacute 227
+\definecharacter adiaeresis 228
+\definecharacter aring 229
+\definecharacter eogonek 230
+\definecharacter emacron 231
+\definecharacter ccaron 232
+\definecharacter eacute 233
+\definecharacter zacute 234
+\definecharacter edotaccent 235
+\definecharacter gcommaaccent 236
+\definecharacter kcommaaccent 237
+\definecharacter imacron 238
+\definecharacter lcommaaccent 239
+\definecharacter scaron 240
+\definecharacter nacute 241
+\definecharacter ncommaaccent 242
+\definecharacter oacute 243
+\definecharacter omacron 244
+\definecharacter otilde 245
+\definecharacter odiaeresis 246
+\definecharacter textdiv 247
+\definecharacter uogonek 248
+\definecharacter lstroke 249
+\definecharacter sacute 250
+\definecharacter umacron 251
+\definecharacter udiaeresis 252
+\definecharacter zdotaccent 253
+\definecharacter zcaron 254
+\definecharacter quoteright 255
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-lat.mkii b/tex/context/base/enco-lat.mkii
new file mode 100644
index 000000000..2623aae8d
--- /dev/null
+++ b/tex/context/base/enco-lat.mkii
@@ -0,0 +1,7 @@
+% temporary module, needed for downward compatibility
+
+\input regi-lat.tex
+
+\enableregime[latin2]
+
+\endinput
diff --git a/tex/context/base/enco-mis.mkii b/tex/context/base/enco-mis.mkii
new file mode 100644
index 000000000..92dc61b3f
--- /dev/null
+++ b/tex/context/base/enco-mis.mkii
@@ -0,0 +1,188 @@
+%D \module
+%D [ file=enco-mis,
+%D version=2000.05.07, % 1999.11.11,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Missing Glyphs,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D In this file we collect some definitions that construct
+%D pseudo characters. Some day we will move some definitions
+%D from \type {plain.tex} to this file. Some definitions are
+%D derived from definitions in the \LATEX\ distribution,
+%D especially Johannes Braams' Babel system.
+
+\startmapping[\s!default]
+
+\defineuppercasecom \dj \DJ
+\defineuppercasecom \Dj \dj
+\defineuppercasecom \DJ \dj
+
+\definecharacter dstroke {\pseudoencodeddj}
+\definecharacter Dstroke {\pseudoencodedDJ}
+
+\stopmapping
+
+%D We need proper names like in enco-com.tex!
+
+\definecharacter dj {\dstroke} % {\pseudoencodeddj}
+\definecharacter Dj {\Dstroke} % {\pseudoencodedDJ}
+\definecharacter DJ {\Dstroke} % {\pseudoencodedDJ}
+
+\unprotect
+
+\def\pseudoencodeddj % like in babel, but safer
+ {\dontleavehmode\hbox\bgroup
+ \setbox\scratchbox\hbox{d}%
+ \scratchdimen\ht\scratchbox
+ \advance\scratchdimen 1ex
+ \scratchdimen.45\scratchdimen
+ \dimen2=\withoutpt\the\slantperpoint\dimen0
+ \advance\dimen2 .5ex
+ \hbox to \wd\scratchbox
+ {\box\scratchbox\hss
+ \raise\scratchdimen\hbox{\kern\dimen2\vbox{\hrule\!!height0.1ex\!!width0.3em}}}%
+ \egroup}
+
+\def\pseudoencodedDJ % design: taco; quality assurance: mojca; cleanup: hans
+ {\dontleavehmode
+ \hbox\bgroup
+ \setbox\scratchbox\hbox{D}%
+ \dimen2=1.1ex
+ \dimen2=\withoutpt\the\slantperpoint\dimen2
+ \hbox to \wd\scratchbox
+ {\rlap
+ {\raise.52\ht\scratchbox
+ \hbox
+ {\kern\dimen2
+ \vbox{\hrule\!!height.04ex\!!depth.04ex\!!width.4\wd\scratchbox}}}%
+ \box\scratchbox}%
+ \egroup}
+
+% currency
+
+\def\fakedollar % pretty cmr dependent
+ {\bgroup
+ \ifnum\fam=\itfam
+ \sl
+ \else\ifnum\fam=\bifam
+ \bs
+ \fi\fi
+ \$%
+ \egroup}
+
+\def\fakesterling % pretty cmr dependent
+ {\bgroup
+ \ifnum\fam=\bffam
+ \bi
+ \else\ifnum\fam=\bifam
+ \bi
+ \else\ifnum\fam=\bsfam
+ \bi
+ \else
+ \it
+ \fi\fi\fi
+ \$%
+ \egroup}
+
+\def\fakeflorin
+ {\bgroup
+ \ifnum\fam=\bffam
+ \bi
+ \else\ifnum\fam=\bifam
+ \bi
+ \else\ifnum\fam=\bsfam
+ \bi
+ \else
+ \it
+ \fi\fi\fi
+ f%
+ \egroup}
+
+% perthings
+
+\def\fakepercent
+ {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}}
+
+\def\fakeperthousand
+ {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}}
+
+\def\fakepermine
+ {\dontleavehmode
+ \bgroup
+ \setbox\scratchbox\hbox
+ {\mathematics{+}}%
+ \hbox to \wd\scratchbox
+ {\hss
+ \mathematics{^{\scriptscriptstyle-}\kern-.4em/\kern-.3em_{\scriptscriptstyle-}}%
+ \hss}%
+ \egroup}
+
+% guillemots
+
+%D Yes I know, they are ugly:
+
+\def\fakeleftguillemot
+ {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle\ll$}}}
+
+\def\fakerightguillemot
+ {\hbox{\raise.25ex\hbox{$\scriptscriptstyle\gg$}}}
+
+\def\fakeleftsubguillemot
+ {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle<$}}}
+
+\def\fakerightsubguillemot
+ {\hbox{\raise.25ex\hbox{$\scriptscriptstyle>$}}}
+
+%D Needed:
+
+\def\fakevisiblespace
+ {\leavevmode\hbox
+ {\setbox\scratchbox\hbox{(}%
+ \scratchdimen.1\dp\scratchbox
+ \setbox\scratchbox\hbox{\space}%
+ \hbox to \wd\scratchbox
+ {\vrule
+ \!!depth 5\scratchdimen
+ \!!width \scratchdimen
+ \!!height \zeropoint
+ \hss
+ \vrule
+ \!!depth 5\scratchdimen
+ \!!width \wd\scratchbox
+ \!!height-4\scratchdimen
+ \hss
+ \vrule
+ \!!depth 5\scratchdimen
+ \!!width \scratchdimen
+ \!!height \zeropoint}}}
+
+%\def\fakeunderscore{\leavevmode\kern.06em\vbox{\hrule\!!width.3em}}
+
+\def\fakeunderscore
+ {\leavevmode\hbox
+ {\setbox\scratchbox\hbox{(}%
+ \scratchdimen.2\dp\scratchbox
+ \setbox\scratchbox\hbox{\space}%
+ \vrule
+ \!!depth \scratchdimen
+ \!!width \wd\scratchbox
+ \!!height\zeropoint}}
+
+\ifx\mathunderscore\undefined \let\mathunderscore\fakeunderscore \fi
+\ifx\textunderscore\undefined \let\textunderscore\fakeunderscore \fi
+
+\unexpanded\def\normalunderscore{\ifmmode\mathunderscore\else\textunderscore\fi}
+
+\let\_\normalunderscore
+
+% Handy but obsolete, replaced by \unknownchar:
+%
+% \def\missingglyph{\ruledhbox{?}}
+
+\protect \endinput
diff --git a/tex/context/base/enco-pdf.mkii b/tex/context/base/enco-pdf.mkii
new file mode 100644
index 000000000..a03e81df2
--- /dev/null
+++ b/tex/context/base/enco-pdf.mkii
@@ -0,0 +1,278 @@
+%D \module
+%D [ file=enco-pdf,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=\YandY\ texnansi Encoding,
+%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.
+
+%D This is the \PDF\ document encoding.
+
+\startencoding[pdfdoc] % \rawcharacter{number}
+
+\definecharacter oeligature ^^9c
+
+\definecharacter leftguillemot ^^ab
+\definecharacter rightguillemot ^^bb
+
+\definecharacter Agrave ^^c0
+\definecharacter Aacute ^^c1
+\definecharacter Acircumflex ^^c2
+\definecharacter Atilde ^^c3
+\definecharacter Adiaeresis ^^c4
+\definecharacter OAligature ^^c5
+\definecharacter AEligature ^^c6
+\definecharacter Ccedilla ^^c7
+\definecharacter Egrave ^^c8
+\definecharacter Eacute ^^c9
+\definecharacter Ecircumflex ^^ca
+\definecharacter Ediaeresis ^^cb
+\definecharacter Igrave ^^cc
+\definecharacter Iacute ^^cd
+\definecharacter Icircumflex ^^ce
+\definecharacter Idiaeresis ^^cf
+
+\definecharacter Ntilde ^^d1
+\definecharacter Ograve ^^d2
+\definecharacter Oacute ^^d3
+\definecharacter Ocircumflex ^^d4
+\definecharacter Otilde ^^d5
+\definecharacter Odiaeresis ^^d6
+
+\definecharacter Ugrave ^^d9
+\definecharacter Uacute ^^da
+\definecharacter Ucircumflex ^^db
+\definecharacter Udiaeresis ^^dc
+\definecharacter Yacute ^^dd
+
+\definecharacter ssharp ^^df
+\definecharacter agrave ^^e0
+\definecharacter aacute ^^e1
+\definecharacter acircumflex ^^e2
+\definecharacter atilde ^^e3
+\definecharacter adiaeresis ^^e4
+\definecharacter oaligature ^^e5
+\definecharacter aeligature ^^e6
+\definecharacter ccedilla ^^e7
+\definecharacter egrave ^^e8
+\definecharacter eacute ^^e9
+\definecharacter ecircumflex ^^ea
+\definecharacter ediaeresis ^^eb
+\definecharacter igrave ^^ec
+\definecharacter iacute ^^ed
+\definecharacter icircumflex ^^ee
+\definecharacter idiaeresis ^^ef
+
+\definecharacter ntilde ^^f1
+\definecharacter ograve ^^f2
+\definecharacter oacute ^^f3
+\definecharacter ocircumflex ^^f4
+\definecharacter otilde ^^f5
+\definecharacter odiaeresis ^^f6
+
+\definecharacter ugrave ^^f9
+\definecharacter uacute ^^fa
+\definecharacter ucircumflex ^^fb
+\definecharacter udiaeresis ^^fc
+\definecharacter yacute ^^fd
+
+\definecharacter ydiaeresis ^^ff
+
+\definecharacter leftsubguillemot {\leftguillemot}
+\definecharacter rightsubguillemot {\rightguillemot}
+
+\definecharacter Uhungarumlaut {\Ucircumflex}
+\definecharacter uhungarumlaut {\ucircumflex}
+\definecharacter Ohungarumlaut {\Ocircumflex}
+\definecharacter ohungarumlaut {\ocircumflex}
+
+\definecharacter Aogonek {A}
+\definecharacter aogonek {a}
+\definecharacter Eogonek {E}
+\definecharacter eogonek {e}
+\definecharacter Iogonek {I}
+\definecharacter iogonek {i}
+\definecharacter Uogonek {U}
+\definecharacter uogonek {u}
+
+\definecharacter Aring {A}
+\definecharacter aring {a}
+\definecharacter Uring {U}
+\definecharacter uring {u}
+
+\definecharacter Abreve {A}
+\definecharacter abreve {a}
+\definecharacter Ebreve {E}
+\definecharacter ebreve {e}
+\definecharacter Gbreve {G}
+\definecharacter gbreve {g}
+\definecharacter Ibreve {I}
+\definecharacter ibreve {i}
+\definecharacter Obreve {O}
+\definecharacter obreve {o}
+\definecharacter Ubreve {U}
+\definecharacter ubreve {u}
+
+\definecharacter Ccaron {C}
+\definecharacter ccaron {c}
+\definecharacter Dcaron {D}
+\definecharacter dcaron {d}
+\definecharacter Ecaron {E}
+\definecharacter ecaron {e}
+\definecharacter Lcaron {L}
+\definecharacter lcaron {l}
+\definecharacter Ncaron {N}
+\definecharacter ncaron {n}
+\definecharacter Rcaron {R}
+\definecharacter rcaron {r}
+\definecharacter Scaron {S}
+\definecharacter scaron {s}
+\definecharacter Tcaron {T}
+\definecharacter tcaron {t}
+\definecharacter Ycaron {Y}
+\definecharacter ycaron {y}
+\definecharacter Zcaron {Z}
+\definecharacter zcaron {z}
+
+\definecharacter Lstroke {L}
+\definecharacter lstroke {l}
+\definecharacter Ostroke {O}
+\definecharacter ostroke {o}
+
+\definecharacter aumlaut {\adiaeresis}
+\definecharacter eumlaut {\ediaeresis}
+\definecharacter iumlaut {\idiaeresis}
+\definecharacter oumlaut {\odiaeresis}
+\definecharacter uumlaut {\udiaeresis}
+
+\definecharacter Aumlaut {\Adiaeresis}
+\definecharacter Eumlaut {\Ediaeresis}
+\definecharacter Iumlaut {\Idiaeresis}
+\definecharacter Oumlaut {\Odiaeresis}
+\definecharacter Uumlaut {\Udiaeresis}
+
+\definecharacter scommaaccent {s}
+\definecharacter Scommaaccent {S}
+\definecharacter tcommaaccent {t}
+\definecharacter Tcommaaccent {T}
+
+\definecharacter Etilde {E}
+\definecharacter etilde {e}
+
+\definecharacter Ahook {A}
+\definecharacter ahook {a}
+\definecharacter Ehook {E}
+\definecharacter ehook {e}
+\definecharacter Ihook {I}
+\definecharacter ihook {i}
+\definecharacter Ohook {O}
+\definecharacter ohook {o}
+\definecharacter Uhook {U}
+\definecharacter uhook {u}
+\definecharacter Yhook {Y}
+\definecharacter yhook {y}
+
+\definecharacter Acircumflexgrave {\Acircumflex}
+\definecharacter Acircumflexacute {\Acircumflex}
+\definecharacter Acircumflextilde {\Acircumflex}
+\definecharacter Acircumflexhook {\Acircumflex}
+\definecharacter acircumflexgrave {\acircumflex}
+\definecharacter acircumflexacute {\acircumflex}
+\definecharacter acircumflextilde {\acircumflex}
+\definecharacter acircumflexhook {\acircumflex}
+\definecharacter Ecircumflexgrave {\Ecircumflex}
+\definecharacter Ecircumflexacute {\Ecircumflex}
+\definecharacter Ecircumflextilde {\Ecircumflex}
+\definecharacter Ecircumflexhook {\Ecircumflex}
+\definecharacter ecircumflexgrave {\ecircumflex}
+\definecharacter ecircumflexacute {\ecircumflex}
+\definecharacter ecircumflextilde {\ecircumflex}
+\definecharacter ecircumflexhook {\ecircumflex}
+\definecharacter Ocircumflexgrave {\Ocircumflex}
+\definecharacter Ocircumflexacute {\Ocircumflex}
+\definecharacter Ocircumflextilde {\Ocircumflex}
+\definecharacter Ocircumflexhook {\Ocircumflex}
+\definecharacter ocircumflexgrave {\ocircumflex}
+\definecharacter ocircumflexacute {\ocircumflex}
+\definecharacter ocircumflextilde {\ocircumflex}
+\definecharacter ocircumflexhook {\ocircumflex}
+
+\definecharacter Abrevegrave {A}
+\definecharacter Abreveacute {A}
+\definecharacter Abrevetilde {A}
+\definecharacter Abrevehook {A}
+\definecharacter abrevegrave {a}
+\definecharacter abreveacute {a}
+\definecharacter abrevetilde {a}
+\definecharacter abrevehook {a}
+
+\definecharacter Adotbelow {A}
+\definecharacter adotbelow {a}
+\definecharacter Edotbelow {E}
+\definecharacter edotbelow {e}
+\definecharacter Idotbelow {I}
+\definecharacter idotbelow {i}
+\definecharacter Odotbelow {O}
+\definecharacter odotbelow {o}
+\definecharacter Udotbelow {U}
+\definecharacter udotbelow {u}
+\definecharacter Ydotbelow {Y}
+\definecharacter ydotbelow {y}
+\definecharacter Ohorndotbelow {O}
+\definecharacter ohorndotbelow {o}
+\definecharacter Uhorndotbelow {U}
+\definecharacter uhorndotbelow {u}
+
+\definecharacter Acircumflexdotbelow {\Acircumflex}
+\definecharacter acircumflexdotbelow {\acircumflex}
+\definecharacter Ecircumflexdotbelow {\Ecircumflex}
+\definecharacter ecircumflexdotbelow {\ecircumflex}
+\definecharacter Ocircumflexdotbelow {\Ocircumflex}
+\definecharacter ocircumflexdotbelow {\ocircumflex}
+\definecharacter Abrevedotbelow {\Abreve}
+\definecharacter abrevedotbelow {\abreve}
+
+\definecharacter Ohorn {O}
+\definecharacter Ohorngrave {O}
+\definecharacter Ohornacute {O}
+\definecharacter Ohorntilde {O}
+\definecharacter Ohornhook {O}
+
+\definecharacter ohorn {o}
+\definecharacter ohorngrave {o}
+\definecharacter ohornacute {o}
+\definecharacter ohorntilde {o}
+\definecharacter ohornhook {o}
+
+\definecharacter Uhorn {U}
+\definecharacter Uhorngrave {U}
+\definecharacter Uhornacute {U}
+\definecharacter Uhorntilde {U}
+\definecharacter Uhornhook {U}
+
+\definecharacter uhorn {u}
+\definecharacter uhorngrave {u}
+\definecharacter uhornacute {u}
+\definecharacter uhorntilde {u}
+\definecharacter uhornhook {u}
+
+\definecharacter Utilde {U}
+\definecharacter utilde {u}
+\definecharacter Itilde {I}
+\definecharacter itilde {i}
+\definecharacter Ygrave {Y}
+\definecharacter ygrave {y}
+\definecharacter Ytilde {Y}
+\definecharacter ytilde {y}
+
+\definecharacter dstroke {d}
+\definecharacter Dstroke {D}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-pfr.mkii b/tex/context/base/enco-pfr.mkii
new file mode 100644
index 000000000..b279e40aa
--- /dev/null
+++ b/tex/context/base/enco-pfr.mkii
@@ -0,0 +1,305 @@
+%D \module
+%D [ file=enco-pfr,
+%D version=2000.12.10, % adapted 2005.08.14 to more delayed loading
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=PDF Resources,
+%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.
+
+\ifnum\texengine>\pdftexengine
+ \expandafter \endinput
+\fi
+
+\ifdefined\pdffontresource \else
+ \expandafter \endinput
+\fi
+
+\writestatus{loading}{ConTeXt Encoding Macros / PDF Resources}
+
+%D This is an experimental module in which we implement
+%D font resource inclusion in \PDF. One reason to include
+%D font resources is that it enables a search engine to
+%D perform a search (I'm told). This feature ws requested by
+%D Petr Ferdus from Czech.
+
+%D A simple test file may look like this (watch how we first
+%D load the encoding and then the font; previous font
+%D definitions are left untouched.)
+%D
+%D \starttyping
+%D % output=pdftex interface=en
+%D
+%D \useencoding[pfr]
+%D \setupbodyfont[csr]
+%D
+%D \starttext
+%D test \`z \'z \bf test \sl test \bs quite funny \`z \page
+%D test \`z \'z \bf test \sl test \bs quite funny \`z \page
+%D \stoptext
+%D \stoptyping
+%D
+%D We do our best to include a (often large) font resources
+%D only once. The current implementation is not that
+%D general which is also due to the fact that \type
+%D {\pdffontattr} is expanded instantly and persistent. A
+%D more versatile (but also slower) approach is to keep track
+%D of the fonts and either flush the information at shipout
+%D time, or at the end of the document.
+
+%D \macros
+%D {ifincludepdffontresources}
+%D
+%D You can turn of this feature using the following switch.
+
+\newif\ifincludepdffontresources \includepdffontresourcestrue
+
+\ifx\pdfglyphtounicode\undefined \else
+ \appendtoks
+ \doif\jobsuffix{pdf}{\readfile{pdfr-def.mkii}\donothing\donothing}%
+ \to \everystarttext
+\fi
+
+% somehow we cannot preload this beast; also, it's mk dependent
+%
+% \appendtoks
+% \doifelse{\jobsuffix}{pdf}{\loadmkiifile{pdfr-def.mkii}}%
+% \to \everystarttext
+
+% ugly, this should go to the driver spec-tpd
+
+\ifx\pdfgentounicode\undefined \else
+ \ifcase\pdfgentounicode \else
+ \expandafter \expandafter \expandafter \endinput
+ \fi
+\fi
+
+\unprotect
+
+% a problem is that there is always an ec vector added even when
+% we switch to texnansi early; this has to do with the fact that
+% we need to setup fonts at startup; this a pain when we have
+% textless documents, so we should have a way around, i.e. an
+% extension to pdftex where we can tag numbers inside user specs
+% and attributes.
+%
+% currently we need to use immediate so we end up with entries
+
+%D The name of the resource is stored in a macro, as is its
+%D object reference. A resource is only processed once. When
+%D done, the resource name is erased, and we use this fact to
+%D prevent redefinition as well as well as reloading. So, a
+%D macro defined with \type {\pdffontfileresource} can have
+%D three states:
+%D
+%D \startitemize[packed]
+%D \item undefined: not yet loaded, and not yet included
+%D \item some value: loaded, but not yet included
+%D \item empty: loaded, and already included
+%D \stopitemize
+
+\def\pdffontresource {pdfr:\currentencoding}
+\def\pdffontfileresource{pdff:\pdffontresource}
+
+%D A resource is defined in a file prefixed by \type {pdfr-}.
+%D The following \PDF\ code is composed by Ondrej Koala Vacha (I
+%D probably mispelled this name).
+%D
+%D \starttyping
+%D \startpdffontresource[il2]
+%D /CIDInit /ProcSet findresource begin
+%D 12 dict begin
+%D begincmap
+%D /CIDSystemInfo
+%D << /Registry (Adobe)
+%D /Ordering (T1UV)
+%D /Supplement 0
+%D >> def
+%D /CMapName /Adobe-Identity-UCS def
+%D /CMapType 1 def
+%D 1 begincodespacerange
+%D <00> <FF>
+%D endcodespacerange
+%D %%FontSpecificEncoding
+%D 191 beginbfrange
+%D <20> <20> <0020> % space dec: 32 oct:040 hex:20
+%D .... .... ...... . ........ .... .. ....... ......
+%D <ff> <ff> <00ff> % dotaccent dec:255 oct:377 hex:ff
+%D endbfrange
+%D endcmap
+%D CMapName currentdict /CMap defineresource pop end
+%D end
+%D \stoppdffontresource
+%D \stoptyping
+%D
+%D We don't preload such huge definitions, and process them
+%D run||time to save memory. Therefore, in the encoding
+%D vector, we only add an entry like:
+%D
+%D \starttyping
+%D \startencoding [il2]
+%D \usepdffontresource il2
+%D \stopencoding
+%D \stoptyping
+%D
+%D This macro is defined as follows.
+
+\def\usepdffontresource #1 %
+ {\doifundefinedelse\pdffontfileresource % okay, undefined, so either
+ {\setxvalue\pdffontfileresource{#1}} % brand new, or not yet loaded
+ {\doifvaluesomething\pdffontfileresource % only if not loaded in which
+ {\setxvalue\pdffontfileresource{#1}}}} % case it's made empty
+
+%D Watch how we check for duplicated loading. The resource
+%D itself, when asked for, is included immediately, after which
+%D we save its reference. Normally a document will have one
+%D such a resource.
+
+% \long\def\startpdffontresource[#1]#2\stoppdffontresource
+% {\doif{#1}\currentencoding
+% {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}
+
+% alternatively we can use object references
+
+% fails when we switch back and forward between dvi/pdf mode
+%
+% \long\def\startpdffontresource[#1]#2\stoppdffontresource
+% {\doif{#1}\currentencoding{\doifdefined\pdffontresource
+% {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}}
+
+\long\def\startpdffontresource[#1]#2\stoppdffontresource
+ {\doif{#1}\currentencoding{\doifdefined\pdffontresource
+ {\expanded{\doshipoutpdffontresource{\getvalue{\pdffontresource}}{#2}}}}}
+
+\def\doshipoutpdffontresource#1#2%
+ {\ifnum\realpageno<\plustwo
+ \doglobal\appendtoks
+ \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
+ \to\everyfirstshipout
+ \else
+ \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
+ \fi}
+
+% cleaner but not better:
+%
+% \newtoks \collectedpdffontresources
+%
+% \def\doshipoutpdffontresource#1#2%
+% {\doglobal\appendtoks
+% \ifcase\pdfoutput\else\immediate\pdfobj useobjnum #1 stream {#2}\fi
+% \to \collectedpdffontresources}
+%
+% \def\dofluspdffontresources
+% {\the\collectedpdffontresources
+% \global\collectedpdffontresources\emptytoks}
+%
+% \appendtoks \dofluspdffontresources \to \everybeforeshipout
+
+%D The reference to such a vector is to be handled at font
+%D definition time, which is why we hook it into the font
+%D loading routine. A little bit of indirectness speeds up
+%D the process when this feature is disabled and keeps the
+%D macros readable.
+
+% \newevery \everyfont \relax
+
+\appendtoksonce \includepdffontresource \to \everyfont
+
+% \def\includepdffontresource
+% {\ifincludepdffontresources
+% \ifx\pdffontattr\undefined
+% % we're not using (a recent version of) pdftex
+% \else\ifcase\pdfoutput
+% % we're not in pdf mode
+% \else
+% \doincludepdffontresource
+% \fi\fi
+% \fi}
+
+\def\includepdffontresource
+ {\ifx\pdfgentounicode\undefined
+ \expandafter\ifx\the\font\nullfont \else
+ \ifx\pdffontattr\undefined
+ % we're not using (a recent version of) pdftex
+ \else\ifcase\pdfoutput
+ % we're not in pdf mode
+ \else
+ \doincludepdffontresource
+ \fi\fi
+ \fi
+ \else\ifcase\pdfgentounicode
+ \ifincludepdffontresources
+ \expandafter\ifx\the\font\nullfont \else
+ \ifx\pdffontattr\undefined
+ % we're not using (a recent version of) pdftex
+ \else\ifcase\pdfoutput
+ % we're not in pdf mode
+ \else
+ \doincludepdffontresource
+ \fi\fi
+ \fi
+ \fi
+ \or
+ \global\let\includepdffontresource\relax % automatic, built in
+ \fi\fi}
+
+\def\dododoincludepdffontresource#1% encoding
+ {\bgroup
+ \edef\currentencoding{#1}%
+ \doifvaluesomething\pdffontfileresource
+ {\startreadingfile
+ \ignorelines % just in case \par is redefined; this thing can get called anywhere
+ \readsysfile{pdfr-\getvalue\pdffontfileresource.mkii}\donothing\donothing
+ \stopreadingfile
+ \letgvalue\pdffontfileresource\empty}%
+ \egroup}
+
+\def\doincludepdffontresource
+ {\ifcsname\s!ucmap\fontfile\endcsname\else
+ \dodoincludepdffontresource
+ \fi}
+
+\def\dodoincludepdffontresource
+ {% does this font has an encoding specified vector
+ \doifsomething\currentencoding % no \ifx
+ {% is there a pdf font encoding resource file defined
+ \ifcsname\pdffontresource\endcsname
+ % (fake) object defined
+ \else\ifcsname\pdffontfileresource\endcsname
+ % is there a resource already included
+ \doifsomething\pdffontfileresource
+ {\pdfobj reserveobjnum {}%
+ \setxvalue\pdffontresource{\the\pdflastobj}%
+ \flushatshipout{\dododoincludepdffontresource{\currentencoding}}}%
+% \doglobal\appendetoks
+% \noexpand\dododoincludepdffontresource{\currentencoding}%
+% \to \everybeforeshipout}% prevent multiple loading
+ \fi\fi
+ \ifcsname\pdffontresource\endcsname
+ \expanded{\pdffontattr\font{/ToUnicode \csname\pdffontresource\endcsname\space0 R}}%
+ % do it only once for each font
+ \letgvalue{\s!ucmap\fontfile}\empty
+ \fi}}
+
+%D For the moment, we keep this definition here, if only
+%D because \type {\usepdffontencoding} is not defined in the
+%D core. In the end, this will go to \type {enco-*.tex}.
+%D
+%D Test:
+%D
+%D \starttyping
+%D \useencoding[pfr] \usetypescript[palatino][ec] \setupbodyfont[palatino]
+%D
+%D \starttext
+%D fi ff ffi
+%D \stoptext
+%D \stoptyping
+
+\startencoding [il2] \usepdffontresource il2 \stopencoding
+\startencoding [ec] \usepdffontresource ec \stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/enco-pol.mkii b/tex/context/base/enco-pol.mkii
new file mode 100644
index 000000000..a012f0370
--- /dev/null
+++ b/tex/context/base/enco-pol.mkii
@@ -0,0 +1,276 @@
+%D \module
+%D [ file=enco-pol,
+%D version=2000.05.07, % 1999.28.8,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Polish Mixed Encoding,
+%D author={Taco Hoekwater \& Hans Hagen},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% This encoding will go but the regime will remain.
+
+%D Polish native encoding; normally polish users will use
+%D translate=cp1250pl in combination with ec encoding.
+
+\startmapping[pl0]
+
+\resetcaserange 128 to 255
+
+\definecaseswap 161 129 % a ogonek
+\definecaseswap 162 130 % c acute
+\definecaseswap 166 134 % e ogonek
+\definecaseswap 170 138 % l crossed
+\definecaseswap 171 139 % n acute
+\definecaseswap 177 145 % s acute
+\definecaseswap 185 153 % z acute
+\definecaseswap 187 155 % z dotaccent
+\definecaseswap 243 211 % o acute
+
+% \definecasemap 161 161 129 % a ogonek
+% \definecasemap 162 162 130 % c acute
+% \definecasemap 166 166 134 % e ogonek
+% \definecasemap 170 170 138 % l crossed
+% \definecasemap 171 171 139 % n acute
+% \definecasemap 177 177 145 % s acute
+% \definecasemap 185 185 153 % z acute
+% \definecasemap 187 187 155 % z dotaccent
+% \definecasemap 243 243 211 % o acute
+
+% \definecasemap 129 161 129 % A ogonek
+% \definecasemap 130 162 130 % C acute
+% \definecasemap 134 166 134 % E ogonek
+% \definecasemap 138 170 138 % L crossed
+% \definecasemap 139 171 139 % N acute
+% \definecasemap 145 177 145 % S acute
+% \definecasemap 153 185 153 % Z acute
+% \definecasemap 155 187 155 % Z dotaccent
+% \definecasemap 211 243 211 % O acute
+
+\stopmapping
+
+\startmapping[pl0]
+
+\definespacemap 129 999 % A ogonek
+\definespacemap 130 999 % C acute
+\definespacemap 134 999 % E ogonek
+\definespacemap 138 999 % L crossed
+\definespacemap 139 999 % N acute
+\definespacemap 211 999 % O acute
+\definespacemap 145 999 % S acute
+\definespacemap 153 999 % Z acute
+\definespacemap 155 999 % Z dot
+
+\stopmapping
+
+\startencoding[pl0][pl0]
+
+\definecharacter Aogonek 129
+\definecharacter Cacute 130
+\definecharacter Eogonek 134
+\definecharacter Lstroke 138
+\definecharacter Nacute 139
+\definecharacter Sacute 145
+\definecharacter Zacute 153
+\definecharacter Zdotaccent 155
+\definecharacter aogonek 161
+\definecharacter cacute 162
+\definecharacter eogonek 166
+\definecharacter lstroke 170
+\definecharacter nacute 171
+\definecharacter sacute 177
+\definecharacter zacute 185
+\definecharacter zdotaccent 187
+\definecharacter Oacute 211
+\definecharacter oacute 243
+
+\stopencoding
+
+\startencoding[pl0][pl0]
+
+\definecharacter leftguillemot 174
+\definecharacter rightguillemot 175
+\definecharacter guilsingleleft 174
+\definecharacter guilsingleright 175
+
+\stopencoding
+
+% obsolete
+%
+% \startencoding[pl0]
+%
+% \definesortkey {161} {a}{a}{\k a} \definesortkey {129} {a}{a}{\k a}
+% \definesortkey {162} {c}{a}{\'c} \definesortkey {130} {c}{a}{\'c}
+% \definesortkey {166} {e}{a}{\k e} \definesortkey {134} {e}{a}{\k e}
+% \definesortkey {170} {l}{a}{\l } \definesortkey {138} {l}{a}{\l }
+% \definesortkey {171} {n}{a}{\'n} \definesortkey {139} {n}{a}{\'n}
+% \definesortkey {177} {s}{a}{\'s} \definesortkey {145} {s}{a}{\'s}
+% \definesortkey {185} {z}{a}{\'z} \definesortkey {153} {z}{a}{\'z}
+% \definesortkey {187} {z}{b}{\.z} \definesortkey {155} {z}{b}{\.z}
+% \definesortkey {243} {o}{a}{\'o} \definesortkey {211} {o}{a}{\'o}
+%
+% \definesortkey {\'c} {c}{a}{\'c} \definesortkey {\'C} {c}{a}{\'c}
+% \definesortkey {\'n} {n}{a}{\'n} \definesortkey {\'N} {n}{a}{\'n}
+% \definesortkey {\'o} {o}{a}{\'o} \definesortkey {\'O} {o}{a}{\'o}
+% \definesortkey {\'s} {s}{a}{\'s} \definesortkey {\'S} {s}{a}{\'s}
+% \definesortkey {\'z} {z}{a}{\'z} \definesortkey {\'Z} {z}{a}{\'z}
+% \definesortkey {\.z} {z}{b}{\.z} \definesortkey {\.Z} {z}{b}{\.z}
+% \definesortkey {\k a}{a}{a}{\k a} \definesortkey {\k A}{a}{a}{\k a}
+% \definesortkey {\k e}{e}{a}{\k e} \definesortkey {\k E}{e}{a}{\k e}
+% \definesortkey {\l } {l}{a}{\l} \definesortkey {\L } {l}{a}{\l}
+%
+% \stopencoding
+
+%D Polish CP-1250 encoding.
+
+% \startmapping[pl1]
+%
+%
+% \resetcaserange 128 to 255
+%
+% \definecasemap 185 185 165 % a ogonek
+% \definecasemap 230 230 198 % c acute
+% \definecasemap 234 234 202 % e ogonek
+% \definecasemap 179 179 163 % l crossed
+% \definecasemap 241 241 209 % n acute
+% \definecasemap 243 243 211 % o acute
+% \definecasemap 156 156 140 % s acute
+% \definecasemap 159 159 143 % z acute
+% \definecasemap 191 191 175 % z dot
+%
+% \definecasemap 165 165 185 % A ogonek
+% \definecasemap 198 198 230 % C acute
+% \definecasemap 202 202 234 % E ogonek
+% \definecasemap 163 163 179 % L crossed
+% \definecasemap 209 209 241 % N acute
+% \definecasemap 211 211 243 % O acute
+% \definecasemap 140 140 156 % S acute
+% \definecasemap 143 143 159 % Z acute
+% \definecasemap 175 175 191 % Z dot
+%
+% \stopmapping
+%
+% \startmapping[pl1]
+%
+% \definespacemap 165 999 % A ogonek
+% \definespacemap 198 999 % C acute
+% \definespacemap 202 999 % E ogonek
+% \definespacemap 163 999 % L crossed
+% \definespacemap 209 999 % N acute
+% \definespacemap 211 999 % O acute
+% \definespacemap 140 999 % S acute
+% \definespacemap 143 999 % Z acute
+% \definespacemap 175 999 % Z dot
+%
+% \stopmapping
+%
+% \startencoding[pl1]
+%
+% \definecharacter Sacute 140
+% \definecharacter Zacute 143
+% \definecharacter sacute 156
+% \definecharacter zacute 159
+% \definecharacter Lstroke 163
+% \definecharacter Aogonek 165
+% \definecharacter Zdotaccent 175
+% \definecharacter lstroke 179
+% \definecharacter aogonek 185
+% \definecharacter zdotaccent 191
+% \definecharacter Cacute 198
+% \definecharacter Eogonek 202
+% \definecharacter Nacute 209
+% \definecharacter Oacute 211
+% \definecharacter cacute 230
+% \definecharacter eogonek 234
+% \definecharacter nacute 241
+% \definecharacter oacute 243
+%
+% \stopencoding
+%
+% \startencoding[pl1]
+%
+% \definecharacter leftguillemot 174
+% \definecharacter rightguillemot 175
+% \definecharacter guilsingleleft 174
+% \definecharacter guilsingleright 175
+%
+% \stopencoding
+
+%D Polish ISO-8859-2 encoding.
+
+% \startmapping[pl2]
+%
+% \resetcaserange 128 to 255
+%
+% \definecasemap 177 177 161 % a ogonek
+% \definecasemap 230 230 198 % c acute
+% \definecasemap 234 234 202 % e ogonek
+% \definecasemap 179 179 163 % l crossed
+% \definecasemap 241 241 209 % n acute
+% \definecasemap 243 243 211 % o acute
+% \definecasemap 182 182 166 % s acute
+% \definecasemap 188 188 172 % z acute
+% \definecasemap 191 191 175 % z dotaccent
+%
+% \definecasemap 161 161 177 % A ogonek
+% \definecasemap 198 198 230 % C acute
+% \definecasemap 202 202 234 % E ogonek
+% \definecasemap 163 163 179 % L crossed
+% \definecasemap 209 209 241 % N acute
+% \definecasemap 211 211 243 % O acute
+% \definecasemap 166 166 182 % S acute
+% \definecasemap 172 172 188 % Z acute
+% \definecasemap 175 175 191 % Z dotaccent
+%
+% \stopmapping
+%
+% \startmapping[pl2]
+%
+% \definespacemap 161 999 % A ogonek
+% \definespacemap 198 999 % C acute
+% \definespacemap 202 999 % E ogonek
+% \definespacemap 163 999 % L crossed
+% \definespacemap 209 999 % N acute
+% \definespacemap 211 999 % O acute
+% \definespacemap 166 999 % S acute
+% \definespacemap 172 999 % Z acute
+% \definespacemap 175 999 % Z dot
+%
+% \stopmapping
+%
+% \startencoding[pl2]
+%
+% \definecharacter Aogonek 161
+% \definecharacter Lstroke 163
+% \definecharacter Sacute 166
+% \definecharacter Zacute 172
+% \definecharacter Zdotaccent 175
+% \definecharacter aogonek 177
+% \definecharacter lstroke 179
+% \definecharacter sacute 182
+% \definecharacter zacute 188
+% \definecharacter zdotaccent 191
+% \definecharacter Cacute 198
+% \definecharacter Eogonek 202
+% \definecharacter Nacute 209
+% \definecharacter Oacute 211
+% \definecharacter cacute 230
+% \definecharacter eogonek 234
+% \definecharacter nacute 241
+% \definecharacter oacute 243
+%
+% \stopencoding
+%
+% \startencoding[pl2]
+%
+% \definecharacter leftguillemot 174
+% \definecharacter rightguillemot 175
+% \definecharacter guilsingleleft 174
+% \definecharacter guilsingleright 175
+%
+% \stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-qx.mkii b/tex/context/base/enco-qx.mkii
new file mode 100644
index 000000000..407d60bd7
--- /dev/null
+++ b/tex/context/base/enco-qx.mkii
@@ -0,0 +1,266 @@
+%D \module
+%D [ file=enco-qx,
+%D version=2004.04.03,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Polish QX Encoding,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% to be done
+
+% 35 numbersign
+% 95 dotaccent
+% 132 greaterequal
+% 133 approxequal
+% 137 lessequal
+% 142 ell
+% 156 IJ
+% 173 infinity
+% 182 threequartersemdash
+% 188 ij
+% 247 anglearc
+% 248 diameter
+
+\startmapping[qx] % to be done
+
+\resetcaserange 128 to 128
+\resetcaserange 131 to 133
+\resetcaserange 136 to 137
+\resetcaserange 140 to 144
+\resetcaserange 148 to 148
+\resetcaserange 150 to 150
+\resetcaserange 157 to 160
+\resetcaserange 163 to 165
+\resetcaserange 168 to 169
+\resetcaserange 172 to 176
+\resetcaserange 180 to 180
+\resetcaserange 182 to 182
+\resetcaserange 189 to 191
+\resetcaserange 198 to 198
+\resetcaserange 215 to 216
+\resetcaserange 223 to 223
+\resetcaserange 230 to 230
+\resetcaserange 247 to 248
+\resetcaserange 255 to 255
+
+\definecaseswap 161 129
+\definecaseswap 162 130
+
+\definecaseswap 166 134
+\definecaseswap 167 135
+
+\definecaseswap 170 138
+\definecaseswap 171 139
+
+\definecaseswap 177 145
+\definecaseswap 178 146
+\definecaseswap 179 147
+
+\definecaseswap 181 149
+
+\definecasemaps 151 to 156 lc +32 uc 0
+\definecasemaps 183 to 188 lc 0 uc -32
+
+\definecasemaps 192 to 197 lc +32 uc 0
+\definecasemaps 224 to 229 lc 0 uc -32
+
+\definecasemaps 199 to 214 lc +32 uc 0
+\definecasemaps 231 to 246 lc 0 uc -32
+
+\definecasemaps 217 to 222 lc +32 uc 0
+\definecasemaps 249 to 254 lc 0 uc -32
+
+\stopmapping
+
+\startencoding[qx]
+
+\definecharacter textacute 19
+\definecharacter textbreve 21
+\definecharacter textcaron 20
+\definecharacter textcedilla 24
+\definecharacter textcircumflex 94
+\definecharacter textdiaeresis 127
+\definecharacter textdotaccent 94
+\definecharacter textgrave 18
+\definecharacter texthungarumlaut 125
+\definecharacter textmacron 22
+\definecharacter textogonek 150
+\definecharacter textring 23
+\definecharacter texttilde 126
+
+\definecharacter dotlessi 16
+\definecharacter dotlessj 17
+
+\definecharacter endash 123
+\definecharacter emdash 124
+
+\definecharacter aeligature 26
+\definecharacter AEligature 29
+\definecharacter oeligature 27
+\definecharacter OEligature 30
+
+\definecharacter ssharp 25
+%definecharacter Ssharp 25
+
+\definecharacter thorn 254
+\definecharacter Thorn 222
+
+\definecharacter Dstroke 208 % also Eth, mapped into enco-def
+\definecharacter eth 240
+
+\definecharacter exclamdown 60
+\definecharacter questiondown 62
+
+\definecharacter sectionmark 159
+
+\definecharacter percent 37
+\definecharacter perthousand 216
+
+\definecharacter textasciicircum 141
+\definecharacter textasciitilde 140
+\definecharacter textbackslash 198
+\definecharacter textbraceleft 157
+\definecharacter textbraceright 158
+\definecharacter textunderscore 230
+
+\definecharacter textcurrency 215
+\definecharacter textdollar 36
+\definecharacter texteuro 128
+
+\definecharacter periodcentered 189
+\definecharacter textdag 143
+\definecharacter textddag 144
+\definecharacter textdegree 148
+\definecharacter textbullet 180
+
+\definecharacter paragraphmark 176
+
+\definecharacter copyright 164
+\definecharacter registered 163
+
+\definecharacter textbrokenbar 223
+\definecharacter textellipsis 8
+\definecharacter textslash 47
+\definecharacter textpm 172
+\definecharacter textdiv 165
+\definecharacter textminus 168
+\definecharacter textmultiply 169
+\definecharacter textmu 7
+
+\definecharacter quotedbl 190
+\definecharacter quotedblbase 255
+\definecharacter quotedblleft 92
+\definecharacter quotedblright 34
+
+\definecharacter quotesingle 191
+
+\definecharacter quoteleft 96
+\definecharacter quoteright 39
+
+\definecharacter leftguillemot 174
+\definecharacter rightguillemot 175
+
+\definecharacter aacute 225
+\definecharacter Aacute 193
+\definecharacter cacute 162
+\definecharacter Cacute 130
+\definecharacter eacute 233
+\definecharacter Eacute 201
+\definecharacter iacute 237
+\definecharacter Iacute 205
+\definecharacter Nacute 139
+\definecharacter Oacute 211
+\definecharacter nacute 171
+\definecharacter oacute 243
+\definecharacter sacute 177
+\definecharacter Sacute 145
+\definecharacter uacute 250
+\definecharacter Uacute 218
+\definecharacter yacute 253
+\definecharacter Yacute 221
+\definecharacter zacute 185
+\definecharacter Zacute 153
+
+\definecharacter scaron 178
+\definecharacter Scaron 146
+\definecharacter zcaron 186
+\definecharacter Zcaron 154
+
+\definecharacter ccedilla 231
+\definecharacter Ccedilla 199
+
+\definecharacter acircumflex 226
+\definecharacter Acircumflex 194
+\definecharacter ecircumflex 234
+\definecharacter Ecircumflex 202
+\definecharacter icircumflex 238
+\definecharacter Icircumflex 206
+\definecharacter ocircumflex 244
+\definecharacter Ocircumflex 212
+\definecharacter ucircumflex 251
+\definecharacter Ucircumflex 219
+
+\definecharacter adiaeresis 228
+\definecharacter Adiaeresis 196
+\definecharacter ediaeresis 235
+\definecharacter Ediaeresis 203
+\definecharacter idiaeresis 239
+\definecharacter Idiaeresis 207
+\definecharacter odiaeresis 246
+\definecharacter Odiaeresis 214
+\definecharacter udiaeresis 252
+\definecharacter Udiaeresis 220
+\definecharacter ydiaeresis 184
+\definecharacter Ydiaeresis 152
+
+\definecharacter zdotaccent 187
+\definecharacter Zdotaccent 155
+
+\definecharacter agrave 224
+\definecharacter Agrave 192
+\definecharacter egrave 232
+\definecharacter Egrave 200
+\definecharacter igrave 236
+\definecharacter Igrave 204
+\definecharacter ograve 242
+\definecharacter Ograve 210
+\definecharacter ugrave 249
+\definecharacter Ugrave 217
+
+\definecharacter aogonek 161
+\definecharacter Aogonek 129
+\definecharacter eogonek 166
+\definecharacter Eogonek 134
+\definecharacter iogonek 167
+\definecharacter Iogonek 135
+\definecharacter uogonek 183
+\definecharacter Uogonek 151
+
+\definecharacter aring 229
+\definecharacter Aring 197
+
+\definecharacter lstroke 170
+\definecharacter Lstroke 138
+\definecharacter ostroke 28
+\definecharacter Ostroke 31
+
+\definecharacter atilde 227
+\definecharacter Atilde 195
+\definecharacter ntilde 241
+\definecharacter Ntilde 209
+\definecharacter otilde 245
+\definecharacter Otilde 213
+
+\definecharacter scommaaccent 179
+\definecharacter Scommaaccent 147
+\definecharacter tcommaaccent 181
+\definecharacter Tcommaaccent 149
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-raw.mkii b/tex/context/base/enco-raw.mkii
new file mode 100644
index 000000000..e3a46e3d7
--- /dev/null
+++ b/tex/context/base/enco-raw.mkii
@@ -0,0 +1,119 @@
+% default instelbaar maken: \enableencoding[main][fallback]
+
+\startencoding[raw]
+
+\definecharacter Acircumflex {A} \definecharacter acircumflex {a}
+\definecharacter Ccircumflex {C} \definecharacter ccircumflex {c}
+\definecharacter Ecircumflex {E} \definecharacter ecircumflex {e}
+\definecharacter Gcircumflex {G} \definecharacter gcircumflex {g}
+\definecharacter Hcircumflex {H} \definecharacter hcircumflex {h}
+\definecharacter Icircumflex {I} \definecharacter icircumflex {i}
+\definecharacter Jcircumflex {J} \definecharacter jcircumflex {j}
+\definecharacter Ocircumflex {O} \definecharacter ocircumflex {o}
+\definecharacter Scircumflex {S} \definecharacter scircumflex {s}
+\definecharacter Ucircumflex {U} \definecharacter ucircumflex {u}
+\definecharacter Wcircumflex {W} \definecharacter wcircumflex {w}
+\definecharacter Ycircumflex {Y} \definecharacter ycircumflex {y}
+
+\definecharacter Agrave {A} \definecharacter agrave {a}
+\definecharacter Egrave {E} \definecharacter egrave {e}
+\definecharacter Igrave {I} \definecharacter igrave {i}
+\definecharacter Ograve {O} \definecharacter ograve {o}
+\definecharacter Ugrave {U} \definecharacter ugrave {u}
+\definecharacter Ygrave {Y} \definecharacter ygrave {y}
+
+\definecharacter Atilde {A} \definecharacter atilde {a}
+\definecharacter Itilde {I} \definecharacter itilde {i}
+\definecharacter Otilde {O} \definecharacter otilde {o}
+\definecharacter Utilde {U} \definecharacter utilde {u}
+\definecharacter Utilde {N} \definecharacter utilde {n}
+
+\definecharacter Adiaeresis {A} \definecharacter adiaeresis {a}
+\definecharacter Ediaeresis {E} \definecharacter ediaeresis {e}
+\definecharacter Idiaeresis {I} \definecharacter idiaeresis {i}
+\definecharacter Odiaeresis {O} \definecharacter odiaeresis {o}
+\definecharacter Udiaeresis {U} \definecharacter udiaeresis {u}
+\definecharacter Ydiaeresis {Y} \definecharacter ydiaeresis {y}
+
+\definecharacter Aacute {A} \definecharacter aacute {a}
+\definecharacter Cacute {C} \definecharacter cacute {c}
+\definecharacter Eacute {E} \definecharacter eacute {e}
+\definecharacter Iacute {I} \definecharacter iacute {i}
+\definecharacter Lacute {L} \definecharacter lacute {l}
+\definecharacter Nacute {N} \definecharacter nacute {n}
+\definecharacter Oacute {O} \definecharacter oacute {o}
+\definecharacter Racute {R} \definecharacter racute {r}
+\definecharacter Sacute {S} \definecharacter sacute {s}
+\definecharacter Uacute {U} \definecharacter uacute {u}
+\definecharacter Yacute {Y} \definecharacter yacute {y}
+\definecharacter Zacute {Z} \definecharacter zacute {z}
+
+\definecharacter Dstroke {D} \definecharacter dstroke {d}
+\definecharacter Hstroke {H} \definecharacter hstroke {h}
+\definecharacter Tstroke {T} \definecharacter tstroke {t}
+
+\definecharacter Cdotaccent {C} \definecharacter cdotaccent {c}
+\definecharacter Edotaccent {E} \definecharacter edotaccent {e}
+\definecharacter Gdotaccent {G} \definecharacter gdotaccent {g}
+\definecharacter Idotaccent {I} \definecharacter idotaccent {i}
+\definecharacter Zdotaccent {Z} \definecharacter zdotaccent {z}
+
+\definecharacter Amacron {A} \definecharacter amacron {a}
+\definecharacter Emacron {E} \definecharacter emacron {e}
+\definecharacter Imacron {I} \definecharacter imacron {i}
+\definecharacter Omacron {O} \definecharacter omacron {o}
+\definecharacter Umacron {U} \definecharacter umacron {u}
+
+\definecharacter Ccedilla {C} \definecharacter ccedilla {c}
+\definecharacter Kcedilla {K} \definecharacter kcedilla {k}
+\definecharacter Lcedilla {L} \definecharacter lcedilla {l}
+\definecharacter Ncedilla {N} \definecharacter ncedilla {n}
+\definecharacter Rcedilla {R} \definecharacter rcedilla {r}
+\definecharacter Scedilla {S} \definecharacter scedilla {s}
+\definecharacter Tcedilla {T} \definecharacter tcedilla {t}
+
+\definecharacter Ohungarumlaut {O} \definecharacter ohungarumlaut {o}
+\definecharacter Uhungarumlaut {U} \definecharacter uhungarumlaut {u}
+
+\definecharacter Aogonek {A} \definecharacter aogonek {a}
+\definecharacter Eogonek {E} \definecharacter eogonek {e}
+\definecharacter Iogonek {I} \definecharacter iogonek {i}
+\definecharacter Uogonek {U} \definecharacter uogonek {u}
+
+\definecharacter Aring {A} \definecharacter aring {a}
+\definecharacter Uring {U} \definecharacter uring {u}
+
+\definecharacter Abreve {A} \definecharacter abreve {a}
+\definecharacter Ebreve {E} \definecharacter ebreve {e}
+\definecharacter Gbreve {G} \definecharacter gbreve {g}
+\definecharacter Ibreve {I} \definecharacter ibreve {i}
+\definecharacter Obreve {O} \definecharacter obreve {o}
+\definecharacter Ubreve {U} \definecharacter ubreve {u}
+
+\definecharacter Ccaron {C} \definecharacter ccaron {c}
+\definecharacter Dcaron {D} \definecharacter dcaron {d}
+\definecharacter Ecaron {E} \definecharacter ecaron {e}
+\definecharacter Lcaron {L} \definecharacter lcaron {l}
+\definecharacter Ncaron {N} \definecharacter ncaron {n}
+\definecharacter Rcaron {R} \definecharacter rcaron {r}
+\definecharacter Scaron {S} \definecharacter scaron {s}
+\definecharacter Tcaron {T} \definecharacter tcaron {t}
+\definecharacter Zcaron {Z} \definecharacter zcaron {z}
+
+\definecharacter dotlessI {I} \definecharacter dotlessi {i}
+\definecharacter dotlessJ {J} \definecharacter dotlessj {j}
+
+\definecharacter AEligature {AE} \definecharacter aeligature {ae}
+\definecharacter Lstroke {L} \definecharacter lstroke {l}
+\definecharacter Ostroke {O} \definecharacter ostroke {o}
+\definecharacter OEligature {OE} \definecharacter oeligature {oe}
+\definecharacter Ssharp {SS} \definecharacter ssharp {ss}
+\definecharacter IJligature {IJ} \definecharacter ijligature {ij}
+
+\definecharacter Aumlaut {A} \definecharacter aumlaut {a}
+\definecharacter Eumlaut {E} \definecharacter eumlaut {e}
+\definecharacter Iumlaut {I} \definecharacter iumlaut {i}
+\definecharacter Oumlaut {O} \definecharacter oumlaut {o}
+\definecharacter Uumlaut {U} \definecharacter uumlaut {u}
+
+\stopencoding
diff --git a/tex/context/base/enco-run.mkii b/tex/context/base/enco-run.mkii
new file mode 100644
index 000000000..50fb52e15
--- /dev/null
+++ b/tex/context/base/enco-run.mkii
@@ -0,0 +1,149 @@
+%D \module
+%D [ file=enco-run,
+%D version=2000.27.12, % moved to runtime module
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen \& Ton Otten]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\gdef\visualizecharacters% {}'s needed
+ {\def\uchar##1##2{\hbox to 2.5em
+ {\ifcase##1\relax\red\or\blue\else\green\fi##1\hss##2}}%
+ \let\normalbuildtextaccent\buildtextaccent
+ \let\normalbottomaccent \bottomaccent
+ %\def\char{\green\normalchar}%
+ \def\char % can be used in \oalign
+ {\bgroup\def\char{\green\normalchar\scratchcounter\egroup}%
+ \afterassignment\char\scratchcounter}%
+ \def\buildtextaccent{\let\green\empty\blue\normalbuildtextaccent}%
+ \def\bottomaccent{\let\green\empty\red\normalbottomaccent}}
+
+\unexpanded\gdef\visualizecharacterslegend
+ {\hbox
+ {\edef\banner{\currentencoding\space\fontname\font}%
+ \tttf\banner:\space
+ {\blue composed}\space{\red bottom}\space{\green char}\space raw}}
+
+\gdef\showaccents
+ {\bgroup
+ \savefont
+ \setuptextrules[\c!bodyfont=,\c!style=]
+ \starttextrule{\visualizecharacterslegend}
+ \whitespace
+ \restorefont\setupinterlinespace
+ \visualizecharacters
+ \def\do##1%
+ {{\def\dodo####1%
+ {\hss\hbox to 1em{\hss\expanded{##1####1\recurselevel}\hss}}%
+ \hbox to \hsize
+ {\strut
+ \localcolortrue
+ \hbox to 2em{\tttf\string##1\hss}%
+ \dorecurse{26}{\dodo\character}}%
+ \hbox to \hsize
+ {\strut
+ \localcolortrue
+ \hskip2em
+ \dorecurse{26}{\dodo\Character}}}%
+ \par}
+ \do\'\do\`\do\^\do\~\do\"
+ \do\H\do\r\do\v\do\u\do\=
+ \do\.\do\b\do\d\do\k\do\c
+ \stoptextrule
+ \egroup}
+
+\gdef\showcharacters
+ {\bgroup
+ \savefont
+ \setuptextrules[\c!bodyfont=,\c!style=]
+ \starttextrule{\visualizecharacterslegend}
+ \whitespace
+ \dontcomplain
+ \forgetall
+ \def\startencoding[##1]{}
+ \def\stopencoding{\endinput}
+ \dimen0=\zeropoint
+ \dimen2=\zeropoint
+ \def\definecharacter ##1 ##2 %
+ {\setbox0=\hbox spread 1em{\getvalue{##1}}%
+ \ifdim\wd0>\dimen0 \dimen0=\wd0 \fi
+ \setbox2=\hbox spread 1em{\box0 \tttf##1}
+ \ifdim\wd2>\dimen2 \dimen2=\wd2 \fi}%
+ \readsysfile{\f!encodingprefix def}{}{}
+ \edef\encwidth{\the\dimen0}
+ \dimen0=\hsize
+ \advance\dimen0 2em
+ \advance\dimen2 2em
+ \divide \dimen0 by \dimen2 \advance\dimen0 1sp
+ \edef\enccols{\number\dimen0}
+ \visualizecharacters
+ \startcolumns[\c!n=\enccols,\c!distance=2em]
+ \restorefont\setupinterlinespace
+ \def\definecharacter ##1 ##2 %
+ {\setbox0=\hbox to \hsize{\localcolortrue\hbox to \encwidth{\getvalue{##1}\hss}\tttf##1}%
+ \ht0\strutheight \dp0\strutdepth \box0 \allowbreak}
+ \readsysfile{\f!encodingprefix def}{}{}
+ \stopcolumns
+ \stoptextrule
+ \egroup}
+
+% \hbox
+% {\font\test=uplr8t \test \ruledhbox{t}
+% \font\test=uplr8r \test \ruledhbox{t}}
+
+\ifnum\texengine=\pdftexengine
+
+ \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\showmapping
+ {\dostepwiserecurse{128}{255}{1}
+ {\hbox\bgroup
+ \hbox to 2em{\hss\recurselevel}%
+ \hbox to 2em{\hss\char\recurselevel\hss}%
+ \hbox to 3em{\hss\ifcase\lccode\recurselevel\else\the \lccode\recurselevel\fi}%
+ \hbox to 2em{\hss\ifcase\lccode\recurselevel\else\char\lccode\recurselevel\fi\hss}%
+ \hbox to 3em{\hss\ifcase\lccode\recurselevel\else\the \uccode\recurselevel\fi}%
+ \hbox to 2em{\hss\ifcase\uccode\recurselevel\else\char\uccode\recurselevel\fi\hss}%
+ \egroup
+ \endgraf}}
+
+ \gdef\showcharacterbounds
+ {\bgroup
+ \localcolortrue
+ \dorecurse{255}
+ {\ifdim\fontcharwd\font\recurselevel>\zeropoint
+ \noindent\ruledhbox{\darkgray\char\recurselevel}\space
+ \fi}\unskip
+ \egroup}
+
+\else
+
+ \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}
+
+ \globallet\showmapping\relax
+
+ \globallet\showcharacterbounds\relax
+
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/enco-t5.mkii b/tex/context/base/enco-t5.mkii
new file mode 100644
index 000000000..251c68765
--- /dev/null
+++ b/tex/context/base/enco-t5.mkii
@@ -0,0 +1,244 @@
+%D \module
+%D [ file=enco-t5,
+%D version=2004.11.16,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=New Vietnamese Encoding,
+%D author=Hans Hagen \& Adam Lindsay,
+%D date=\currentdate,
+%D copyright=PRAGMA \& Adam Lindsay]
+%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 is derived from the enco-x5 encoding, but now
+%D approaches the world with named glyphs.
+
+\startencoding[t5]
+
+\definecasemaps 128 to 159 lc +32 uc 0
+
+\definecasemaps 160 to 191 lc 0 uc -32
+
+\definecasemaps 192 to 223 lc +32 uc 0
+
+\definecasemaps 224 to 225 lc 0 uc -32
+
+\definecasemap 26 26 27 \definecasemap 27 26 27
+\definecasemap 28 28 29 \definecasemap 29 28 29
+\definecasemap 30 30 31 \definecasemap 31 30 31
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter textbottomdot 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter texthookabove 12
+\definecharacter textogonek {}
+
+\definecharacter quotesinglebase 13
+\definecharacter guilsingleleft 14
+\definecharacter guilsingleright 15
+\definecharacter quotedblleft 16
+\definecharacter quotedblright 17
+\definecharacter quotedblbase 18
+\definecharacter leftguillemot 19
+\definecharacter rightguillemot 20
+\definecharacter endash 21
+\definecharacter emdash 22
+
+\definecharacter cwm 23
+\definecharacter zeroinferior 24
+\definecharacter Yhook 26
+\definecharacter yhook 27
+\definecharacter Ydotbelow 28
+\definecharacter ydotbelow 29
+\definecharacter Dstroke 30
+\definecharacter dstroke 31
+\definecharacter textvisiblespace 32
+
+\definecharacter dotlessi 25
+%definecharacter DJ 30
+%definecharacter dj 31
+\definecharacter Agrave 128
+\definecharacter Aacute 129
+\definecharacter Atilde 130
+\definecharacter Ahook 131
+\definecharacter Adotbelow 132
+\definecharacter Acircumflex 133
+\definecharacter Acircumflexgrave 134
+\definecharacter Acircumflexacute 135
+\definecharacter Acircumflextilde 136
+\definecharacter Acircumflexhook 137
+\definecharacter Acircumflexdotbelow 138
+\definecharacter Abreve 139
+\definecharacter Abrevegrave 140
+\definecharacter Abreveacute 141
+\definecharacter Abrevetilde 142
+\definecharacter Abrevehook 143
+\definecharacter Abrevedotbelow 144
+\definecharacter Egrave 145
+\definecharacter Eacute 146
+\definecharacter Etilde 147
+\definecharacter Ehook 148
+\definecharacter Edotbelow 149
+\definecharacter Ecircumflex 150
+\definecharacter Ecircumflexgrave 151
+\definecharacter Ecircumflexacute 152
+\definecharacter Ecircumflextilde 153
+\definecharacter Ecircumflexhook 154
+\definecharacter Ecircumflexdotbelow 155
+\definecharacter Igrave 156
+\definecharacter Iacute 157
+\definecharacter Itilde 158
+\definecharacter Ihook 159
+\definecharacter agrave 160
+\definecharacter aacute 161
+\definecharacter atilde 162
+\definecharacter ahook 163
+\definecharacter adotbelow 164
+\definecharacter acircumflex 165
+\definecharacter acircumflexgrave 166
+\definecharacter acircumflexacute 167
+\definecharacter acircumflextilde 168
+\definecharacter acircumflexhook 169
+\definecharacter acircumflexdotbelow 170
+\definecharacter abreve 171
+\definecharacter abrevegrave 172
+\definecharacter abreveacute 173
+\definecharacter abrevetilde 174
+\definecharacter abrevehook 175
+\definecharacter abrevedotbelow 176
+\definecharacter egrave 177
+\definecharacter eacute 178
+\definecharacter etilde 179
+\definecharacter ehook 180
+\definecharacter edotbelow 181
+\definecharacter ecircumflex 182
+\definecharacter ecircumflexgrave 183
+\definecharacter ecircumflexacute 184
+\definecharacter ecircumflextilde 185
+\definecharacter ecircumflexhook 186
+\definecharacter ecircumflexdotbelow 187
+\definecharacter igrave 188
+\definecharacter iacute 189
+\definecharacter itilde 190
+\definecharacter ihook 191
+\definecharacter Idotbelow 192
+\definecharacter Ograve 193
+\definecharacter Oacute 194
+\definecharacter Otilde 195
+\definecharacter Ohook 196
+\definecharacter Odotbelow 197
+\definecharacter Ocircumflex 198
+\definecharacter Ocircumflexgrave 199
+\definecharacter Ocircumflexacute 200
+\definecharacter Ocircumflextilde 201
+\definecharacter Ocircumflexhook 202
+\definecharacter Ocircumflexdotbelow 203
+\definecharacter Ohorn 204
+\definecharacter Ohorngrave 205
+\definecharacter Ohornacute 206
+\definecharacter Ohorntilde 207
+\definecharacter Ohornhook 208
+\definecharacter Ohorndotbelow 209
+\definecharacter Ugrave 210
+\definecharacter Uacute 211
+\definecharacter Utilde 212
+\definecharacter Uhook 213
+\definecharacter Udotbelow 214
+\definecharacter Uhorn 215
+\definecharacter Uhorngrave 216
+\definecharacter Uhornacute 217
+\definecharacter Uhorntilde 218
+\definecharacter Uhornhook 219
+\definecharacter Uhorndotbelow 220
+\definecharacter Ytilde 223
+\definecharacter idotbelow 224
+\definecharacter ograve 225
+\definecharacter oacute 226
+\definecharacter otilde 227
+\definecharacter ohook 228
+\definecharacter odotbelow 229
+\definecharacter ocircumflex 230
+\definecharacter ocircumflexgrave 231
+\definecharacter ocircumflexacute 232
+\definecharacter ocircumflextilde 233
+\definecharacter ocircumflexhook 234
+\definecharacter ocircumflexdotbelow 235
+\definecharacter ohorn 236
+\definecharacter ohorngrave 237
+\definecharacter ohornacute 238
+\definecharacter ohorntilde 239
+\definecharacter ohornhook 240
+\definecharacter ohorndotbelow 241
+\definecharacter ugrave 242
+\definecharacter uacute 243
+\definecharacter utilde 244
+\definecharacter uhook 245
+\definecharacter udotbelow 246
+\definecharacter uhorn 247
+\definecharacter uhorngrave 248
+\definecharacter uhornacute 249
+\definecharacter uhorntilde 250
+\definecharacter uhornhook 251
+\definecharacter uhorndotbelow 252
+\definecharacter ygrave 253
+\definecharacter yacute 254
+\definecharacter ytilde 255
+
+\stopencoding
+
+\endinput
+
+% \startencoding [x5]
+%
+% \definecharacter aa {\xfiveencodedaa}
+% \definecharacter AA {\xfiveencodedAA}
+%
+% \stopencoding
+%
+% \def\xfiveencodedaa%
+% {\accent23a}
+%
+% \def\xfiveencodedAA%
+% {\leavevmode
+% \setbox\zerocount\hbox{h}%
+% \dimen@\ht\zerocount
+% \advance\dimen@ -1ex
+% \rlap{\raise.67\dimen@\hbox{\char23}}A}
+
+% \quotesinglbase 13
+% \guilsinglleft 14
+% \guilsinglright 15
+% \textquotedblleft 16
+% \textquotedblright 17
+% \quotedblbase 18
+% \guillemotleft 19
+% \guillemotright 20
+% \textendash 21
+% \textemdash 22
+% \textcompwordmark 23
+% \textperthousand \% \char 24
+% \textpertenthousand \%\char 24\char 24
+% \textvisiblespace 32
+% \textquotedbl `\"
+% \textdollar `\$
+% \textquoteright `\'
+% \textless `\<
+% \textgreater `\>
+% \textbackslash `\
+% \textasciicircum `\^
+% \textunderscore 95
+% \textquoteleft `\`
+% \textbraceleft `\{
+% \textbar `\|
+% \textbraceright `\}
+% \textasciitilde `\~
diff --git a/tex/context/base/enco-tbo.mkii b/tex/context/base/enco-tbo.mkii
new file mode 100644
index 000000000..475be4602
--- /dev/null
+++ b/tex/context/base/enco-tbo.mkii
@@ -0,0 +1,222 @@
+%D \module
+%D [ file=enco-tbo,
+%D version=2000.05.07, % 2001.8.4,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=TeXBaseOne Encoding,
+%D author={Patrick Gundlach, Hans Hagen},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startmapping[8r]
+
+\resetcaserange 128 to 255
+
+\definecasemap 228 228 196 \definecasemap 196 228 196
+\definecasemap 235 235 203 \definecasemap 203 235 203
+\definecasemap 239 239 207 \definecasemap 207 239 207
+\definecasemap 246 246 214 \definecasemap 214 246 214
+\definecasemap 252 252 220 \definecasemap 220 252 220
+\definecasemap 255 255 159 \definecasemap 159 255 159
+
+\definecasemap 225 225 193 \definecasemap 193 225 193
+\definecasemap 233 233 201 \definecasemap 201 233 201
+\definecasemap 237 237 205 \definecasemap 205 237 205
+\definecasemap 243 243 211 \definecasemap 211 243 211
+\definecasemap 250 250 218 \definecasemap 218 250 218
+\definecasemap 253 253 221 \definecasemap 221 253 221
+
+\definecasemap 224 224 192 \definecasemap 192 224 192
+\definecasemap 232 232 200 \definecasemap 200 232 200
+\definecasemap 236 236 204 \definecasemap 204 236 204
+\definecasemap 242 242 210 \definecasemap 210 242 210
+\definecasemap 249 249 217 \definecasemap 217 249 217
+
+\definecasemap 226 226 194 \definecasemap 194 226 194
+\definecasemap 234 234 202 \definecasemap 202 234 202
+\definecasemap 238 238 206 \definecasemap 206 238 206
+\definecasemap 244 244 212 \definecasemap 212 244 212
+\definecasemap 251 251 219 \definecasemap 219 251 219
+
+\definecasemap 227 227 195 \definecasemap 195 227 195
+\definecasemap 241 241 209 \definecasemap 209 241 209
+\definecasemap 245 245 213 \definecasemap 213 245 213
+
+\stopmapping
+
+\startencoding[8r]
+
+\definecharacter textacute 180
+\definecharacter textbreve 11
+\definecharacter textcaron 16
+\definecharacter textcedilla 184
+\definecharacter textcircumflex 136
+\definecharacter textdiaeresis 168
+\definecharacter textdotaccent 1
+\definecharacter textgrave 30
+\definecharacter texthungarumlaut 5
+\definecharacter textmacron 175
+\definecharacter textogonek 8
+\definecharacter textring 9
+\definecharacter texttilde 152
+
+\definecharacter dotlessi 17
+%definecharacter dotlessj 18
+
+\definecharacter endash 150
+\definecharacter emdash 151
+
+\definecharacter oeligature 156
+\definecharacter OEligature 140
+\definecharacter aeligature 230
+\definecharacter AEligature 198
+
+\definecharacter ssharp 223
+
+\definecharacter thorn 254
+\definecharacter Thorn 222
+
+\definecharacter exclamdown 161
+\definecharacter questiondown 191
+
+\definecharacter copyright 169
+\definecharacter registered 174
+\definecharacter trademark 153
+
+\definecharacter sectionmark 167
+\definecharacter paragraphmark 182
+
+\definecharacter onequarter 188
+\definecharacter onehalf 189
+\definecharacter threequarter 190
+\definecharacter onesuperior 185
+\definecharacter twosuperior 178
+\definecharacter threesuperior 179
+
+\definecharacter textcent 162
+\definecharacter textcurrency 164
+\definecharacter texteuro 128
+\definecharacter textflorin 131
+\definecharacter textsterling 163
+\definecharacter textyen 165
+
+\definecharacter percent 37
+\definecharacter perthousand 137
+
+\definecharacter periodcentered 183
+\definecharacter softhyphen 173
+
+\definecharacter textasciicircum 94
+\definecharacter textasciitilde 126
+\definecharacter textslash 47
+\definecharacter textbackslash 92
+\definecharacter textbraceleft 123
+\definecharacter textbraceright 125
+\definecharacter textunderscore 95
+
+\definecharacter textbrokenbar 166
+\definecharacter textbullet 149
+\definecharacter textdag 134
+\definecharacter textddag 135
+\definecharacter textdegree 176
+\definecharacter textdiv 247
+\definecharacter textellipsis 133
+\definecharacter textfraction 4
+\definecharacter textlognot 172
+\definecharacter textminus 12
+\definecharacter textmu 181
+\definecharacter textmultiply 215
+\definecharacter textpm 177
+
+\definecharacter quotedbl 34
+\definecharacter quotedblbase 132
+\definecharacter quotedblleft 147
+\definecharacter quotedblright 148
+
+\definecharacter quotesingle 31
+\definecharacter quotesinglebase 130
+
+\definecharacter quoteleft 96
+\definecharacter quoteright 39
+
+\definecharacter guilsingleleft 139
+\definecharacter guilsingleright 155
+\definecharacter leftguillemot 171
+\definecharacter rightguillemot 187
+
+\definecharacter aacute 225
+\definecharacter Aacute 193
+\definecharacter eacute 233
+\definecharacter Eacute 201
+\definecharacter iacute 237
+\definecharacter Iacute 205
+\definecharacter oacute 243
+\definecharacter Oacute 211
+\definecharacter uacute 250
+\definecharacter Uacute 218
+\definecharacter Yacute 221
+\definecharacter yacute 253
+
+\definecharacter scaron 154
+\definecharacter Scaron 138
+%definecharacter Zcaron 141
+
+\definecharacter ccedilla 231
+\definecharacter Ccedilla 199
+
+\definecharacter acircumflex 226
+\definecharacter Acircumflex 194
+\definecharacter ecircumflex 234
+\definecharacter Ecircumflex 202
+\definecharacter icircumflex 238
+\definecharacter Icircumflex 206
+\definecharacter ocircumflex 244
+\definecharacter Ocircumflex 212
+\definecharacter ucircumflex 251
+\definecharacter Ucircumflex 219
+
+\definecharacter adiaeresis 228
+\definecharacter Adiaeresis 196
+\definecharacter ediaeresis 235
+\definecharacter Ediaeresis 203
+\definecharacter idiaeresis 239
+\definecharacter Idiaeresis 207
+\definecharacter odiaeresis 246
+\definecharacter Odiaeresis 214
+\definecharacter udiaeresis 252
+\definecharacter Udiaeresis 220
+\definecharacter ydiaeresis 255
+\definecharacter Ydiaeresis 159
+
+\definecharacter agrave 224
+\definecharacter Agrave 192
+\definecharacter egrave 232
+\definecharacter Egrave 200
+\definecharacter igrave 236
+\definecharacter Igrave 204
+\definecharacter ograve 242
+\definecharacter Ograve 210
+\definecharacter ugrave 249
+\definecharacter Ugrave 217
+
+\definecharacter aring 229
+\definecharacter Aring 197
+
+\definecharacter lstroke 7
+\definecharacter Lstroke 6
+\definecharacter ostroke 248
+\definecharacter Ostroke 216
+
+\definecharacter atilde 227
+\definecharacter Atilde 195
+\definecharacter ntilde 241
+\definecharacter Ntilde 209
+\definecharacter otilde 245
+\definecharacter Otilde 213
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-uc.mkii b/tex/context/base/enco-uc.mkii
new file mode 100644
index 000000000..981eb6ae4
--- /dev/null
+++ b/tex/context/base/enco-uc.mkii
@@ -0,0 +1,1091 @@
+%D \module
+%D [ file=enco-uc,
+%D version=2000.xx.xx, % and later
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Unicode (backwards mapping),
+%D author={Adam Lindsay \& Hans Hagen},
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D An alternative approach would be to misuse the utf vectors, but they
+%D don't carry enough info around.
+
+% todo : \defineucharacter hebrewAlef 5 "D0
+
+\startencoding[uc]
+
+\definecharacter Agrave {\uchar0{192}}
+\definecharacter Aacute {\uchar0{193}}
+\definecharacter Acircumflex {\uchar0{194}}
+\definecharacter Atilde {\uchar0{195}}
+\definecharacter Adiaeresis {\uchar0{196}}
+\definecharacter Aring {\uchar0{197}}
+\definecharacter AEligature {\uchar0{198}}
+\definecharacter Ccedilla {\uchar0{199}}
+\definecharacter Egrave {\uchar0{200}}
+\definecharacter Eacute {\uchar0{201}}
+\definecharacter Ediaeresis {\uchar0{203}}
+\definecharacter Igrave {\uchar0{204}}
+\definecharacter Iacute {\uchar0{205}}
+\definecharacter Icircumflex {\uchar0{206}}
+\definecharacter Idiaeresis {\uchar0{207}}
+\definecharacter Eth {\uchar0{208}}
+\definecharacter Ntilde {\uchar0{209}}
+\definecharacter Ograve {\uchar0{210}}
+\definecharacter Oacute {\uchar0{211}}
+\definecharacter Ocircumflex {\uchar0{212}}
+\definecharacter Otilde {\uchar0{213}}
+\definecharacter Odiaeresis {\uchar0{214}}
+
+\definecharacter Ostroke {\uchar0{216}}
+\definecharacter Ugrave {\uchar0{217}}
+\definecharacter Uacute {\uchar0{218}}
+\definecharacter Uhungarumlaut {\uchar0{219}}
+\definecharacter Udiaeresis {\uchar0{220}}
+\definecharacter Yacute {\uchar0{221}}
+\definecharacter Thorn {\uchar0{222}}
+\definecharacter ssharp {\uchar0{223}}
+\definecharacter agrave {\uchar0{224}}
+\definecharacter aacute {\uchar0{225}}
+\definecharacter acircumflex {\uchar0{226}}
+\definecharacter atilde {\uchar0{227}}
+\definecharacter adiaeresis {\uchar0{228}}
+\definecharacter aring {\uchar0{229}}
+\definecharacter aeligature {\uchar0{230}}
+\definecharacter ccedilla {\uchar0{231}}
+\definecharacter egrave {\uchar0{232}}
+\definecharacter eacute {\uchar0{233}}
+\definecharacter ecircumflex {\uchar0{234}}
+\definecharacter ediaeresis {\uchar0{235}}
+\definecharacter igrave {\uchar0{236}}
+\definecharacter iacute {\uchar0{237}}
+\definecharacter icircumflex {\uchar0{238}}
+\definecharacter idiaeresis {\uchar0{239}}
+\definecharacter eth {\uchar0{240}}
+\definecharacter ntilde {\uchar0{241}}
+\definecharacter ograve {\uchar0{242}}
+\definecharacter oacute {\uchar0{243}}
+\definecharacter ocircumflex {\uchar0{244}}
+\definecharacter otilde {\uchar0{245}}
+\definecharacter odiaeresis {\uchar0{246}}
+
+\definecharacter ostroke {\uchar0{248}}
+\definecharacter ugrave {\uchar0{249}}
+\definecharacter uacute {\uchar0{250}}
+\definecharacter ucircumflex {\uchar0{251}}
+\definecharacter udiaeresis {\uchar0{252}}
+\definecharacter yacute {\uchar0{253}}
+\definecharacter thorn {\uchar0{254}}
+\definecharacter ydiaeresis {\uchar0{255}}
+
+\definecharacter Amacron {\uchar1{0}}
+\definecharacter amacron {\uchar1{1}}
+\definecharacter Abreve {\uchar1{2}}
+\definecharacter abreve {\uchar1{3}}
+\definecharacter Aogonek {\uchar1{4}}
+\definecharacter aogonek {\uchar1{5}}
+\definecharacter Cacute {\uchar1{6}}
+\definecharacter cacute {\uchar1{7}}
+\definecharacter Ccircumflex {\uchar1{8}}
+\definecharacter ccircumflex {\uchar1{9}}
+\definecharacter Cdotaccent {\uchar1{10}}
+\definecharacter cdotaccent {\uchar1{11}}
+\definecharacter Ccaron {\uchar1{12}}
+\definecharacter ccaron {\uchar1{13}}
+\definecharacter Dcaron {\uchar1{14}}
+\definecharacter dcaron {\uchar1{15}}
+\definecharacter Dstroke {\uchar1{16}}
+\definecharacter dstroke {\uchar1{17}}
+\definecharacter Emacron {\uchar1{18}}
+\definecharacter emacron {\uchar1{19}}
+\definecharacter Ebreve {\uchar1{20}}
+\definecharacter ebreve {\uchar1{21}}
+\definecharacter Edotaccent {\uchar1{22}}
+\definecharacter edotaccent {\uchar1{23}}
+\definecharacter Eogonek {\uchar1{24}}
+\definecharacter eogonek {\uchar1{25}}
+\definecharacter Ecaron {\uchar1{26}}
+\definecharacter ecaron {\uchar1{27}}
+\definecharacter Gcircumflex {\uchar1{28}}
+\definecharacter gcircumflex {\uchar1{29}}
+\definecharacter Gbreve {\uchar1{30}}
+\definecharacter gbreve {\uchar1{31}}
+\definecharacter Gdotaccent {\uchar1{32}}
+\definecharacter gdotaccent {\uchar1{33}}
+\definecharacter Gcommaaccent {\uchar1{34}}
+\definecharacter gcommaaccent {\uchar1{35}}
+\definecharacter Hcircumflex {\uchar1{36}}
+\definecharacter hcircumflex {\uchar1{37}}
+\definecharacter Hstroke {\uchar1{38}}
+\definecharacter hstroke {\uchar1{39}}
+\definecharacter Itilde {\uchar1{40}}
+\definecharacter itilde {\uchar1{41}}
+\definecharacter Imacron {\uchar1{42}}
+\definecharacter imacron {\uchar1{43}}
+\definecharacter Ibreve {\uchar1{44}}
+\definecharacter ibreve {\uchar1{45}}
+\definecharacter Iogonek {\uchar1{46}}
+\definecharacter iogonek {\uchar1{47}}
+\definecharacter Idotaccent {\uchar1{48}}
+\definecharacter dotlessi {\uchar1{49}}
+\definecharacter IJligature {\uchar1{50}}
+\definecharacter ijligature {\uchar1{51}}
+\definecharacter Jcircumflex {\uchar1{52}}
+\definecharacter jcircumflex {\uchar1{53}}
+\definecharacter Kcommaaccent {\uchar1{54}}
+\definecharacter kcommaaccent {\uchar1{55}}
+\definecharacter kkra {\uchar1{56}}
+\definecharacter Lacute {\uchar1{57}}
+\definecharacter lacute {\uchar1{58}}
+\definecharacter Lcommaaccent {\uchar1{59}}
+\definecharacter lcommaaccent {\uchar1{60}}
+\definecharacter Lcaron {\uchar1{61}}
+\definecharacter lcaron {\uchar1{62}}
+\definecharacter Ldotmiddle {\uchar1{63}}
+\definecharacter ldotmiddle {\uchar1{64}}
+\definecharacter Lstroke {\uchar1{65}}
+\definecharacter lstroke {\uchar1{66}}
+\definecharacter Nacute {\uchar1{67}}
+\definecharacter nacute {\uchar1{68}}
+\definecharacter Ncommaaccent {\uchar1{69}}
+\definecharacter ncommaaccent {\uchar1{70}}
+\definecharacter Ncaron {\uchar1{71}}
+\definecharacter ncaron {\uchar1{72}}
+\definecharacter napostrophe {\uchar1{73}}
+\definecharacter Neng {\uchar1{74}}
+\definecharacter neng {\uchar1{75}}
+\definecharacter Omacron {\uchar1{76}}
+\definecharacter omacron {\uchar1{77}}
+\definecharacter Obreve {\uchar1{78}}
+\definecharacter obreve {\uchar1{79}}
+\definecharacter Ohungarumlaut {\uchar1{80}}
+\definecharacter ohungarumlaut {\uchar1{81}}
+\definecharacter OEligature {\uchar1{82}}
+\definecharacter oeligature {\uchar1{83}}
+\definecharacter Racute {\uchar1{84}}
+\definecharacter racute {\uchar1{85}}
+\definecharacter Rcommaaccent {\uchar1{86}}
+\definecharacter rcommaaccent {\uchar1{87}}
+\definecharacter Rcaron {\uchar1{88}}
+\definecharacter rcaron {\uchar1{89}}
+\definecharacter Sacute {\uchar1{90}}
+\definecharacter sacute {\uchar1{91}}
+\definecharacter Scircumflex {\uchar1{92}}
+\definecharacter scircumflex {\uchar1{93}}
+\definecharacter Scedilla {\uchar1{94}}
+\definecharacter scedilla {\uchar1{95}}
+\definecharacter Scaron {\uchar1{96}}
+\definecharacter scaron {\uchar1{97}}
+\definecharacter Tcedilla {\uchar1{98}}
+\definecharacter tcedilla {\uchar1{99}}
+\definecharacter Tcaron {\uchar1{100}}
+\definecharacter tcaron {\uchar1{101}}
+\definecharacter Tstroke {\uchar1{102}}
+\definecharacter tstroke {\uchar1{103}}
+\definecharacter Utilde {\uchar1{104}}
+\definecharacter utilde {\uchar1{105}}
+\definecharacter Umacron {\uchar1{106}}
+\definecharacter umacron {\uchar1{107}}
+\definecharacter Ubreve {\uchar1{108}}
+\definecharacter ubreve {\uchar1{109}}
+\definecharacter Uring {\uchar1{110}}
+\definecharacter uring {\uchar1{111}}
+\definecharacter Uhungarumlaut {\uchar1{112}}
+\definecharacter uhungarumlaut {\uchar1{113}}
+\definecharacter Uogonek {\uchar1{114}}
+\definecharacter uogonek {\uchar1{115}}
+\definecharacter Wcircumflex {\uchar1{116}}
+\definecharacter wcircumflex {\uchar1{117}}
+\definecharacter Ycircumflex {\uchar1{118}}
+\definecharacter ycircumflex {\uchar1{119}}
+\definecharacter Ydiaeresis {\uchar1{120}}
+\definecharacter Zacute {\uchar1{121}}
+\definecharacter zacute {\uchar1{122}}
+\definecharacter Zdotaccent {\uchar1{123}}
+\definecharacter zdotaccent {\uchar1{124}}
+\definecharacter Zcaron {\uchar1{125}}
+\definecharacter zcaron {\uchar1{126}}
+\definecharacter slong {\uchar1{127}}
+
+\stopencoding
+
+\startencoding[uc]
+
+\definecharacter endash {\uchar{32}{19}}
+\definecharacter emdash {\uchar{32}{20}}
+\definecharacter quoteleft {\uchar{32}{24}}
+\definecharacter quoteright {\uchar{32}{25}}
+\definecharacter quotesinglebase {\uchar{32}{26}}
+
+\definecharacter quotedblleft {\uchar{32}{28}}
+\definecharacter quotedblright {\uchar{32}{29}}
+\definecharacter quotedblbase {\uchar{32}{30}}
+
+\definecharacter leftguillemot {\uchar0{171}}
+\definecharacter rightguillemot {\uchar0{187}}
+
+\definecharacter guilsingleleft {\uchar{32}{57}}
+\definecharacter guilsingleright {\uchar{32}{58}}
+
+\stopencoding
+
+%D Adam Lindsay's additions
+
+\startencoding[uc]
+
+\definecharacter exclamdown {\uchar0{161}}
+\definecharacter textcent {\uchar0{162}}
+\definecharacter textsterling {\uchar0{163}}
+\definecharacter textcurrency {\uchar0{164}}
+\definecharacter textyen {\uchar0{165}}
+\definecharacter textbrokenbar {\uchar0{166}}
+\definecharacter sectionmark {\uchar0{167}}
+\definecharacter textdiaresis {\uchar0{168}}
+\definecharacter copyright {\uchar0{169}}
+
+\definecharacter textlognot {\uchar0{172}}
+\definecharacter softhyphen {\uchar0{173}}
+\definecharacter registered {\uchar0{174}}
+\definecharacter textmacron {\uchar0{175}}
+\definecharacter textdegree {\uchar0{176}}
+\definecharacter textpm {\uchar0{177}}
+\definecharacter twosuperior {\uchar0{178}}
+\definecharacter threesuperior {\uchar0{179}}
+\definecharacter textacute {\uchar0{180}}
+\definecharacter textmu {\uchar0{181}}
+\definecharacter paragraphmark {\uchar0{182}}
+\definecharacter periodcentered {\uchar0{183}}
+\definecharacter textcedilla {\uchar0{184}}
+\definecharacter onesuperior {\uchar0{185}}
+
+\definecharacter textgrave {\uchar3{0}}
+\definecharacter textacute {\uchar3{1}}
+\definecharacter textcircumflex {\uchar3{2}}
+\definecharacter texttilde {\uchar3{3}}
+\definecharacter textmacron {\uchar3{4}}
+\definecharacter textbreve {\uchar3{6}}
+\definecharacter textdotaccent {\uchar3{7}}
+\definecharacter textdiaeresis {\uchar3{8}}
+\definecharacter textring {\uchar3{10}}
+\definecharacter texthungarumlaut {\uchar3{11}}
+\definecharacter textcaron {\uchar3{12}}
+\definecharacter textogonek {\uchar3{40}}
+
+\definecharacter percent {\uchar0{37}}
+\definecharacter textunderscore {\uchar0{95}}
+
+\definecharacter ordfeminine {\uchar0{170}}
+\definecharacter ordmasculine {\uchar0{186}}
+\definecharacter onequarter {\uchar0{188}}
+\definecharacter onehalf {\uchar0{189}}
+\definecharacter threequarter {\uchar0{190}}
+\definecharacter questiondown {\uchar0{191}}
+
+\definecharacter textmultiply {\uchar0{215}}
+\definecharacter textdiv {\uchar0{247}}
+
+\definecharacter textminus {\uchar{32}{18}}
+\definecharacter textdag {\uchar{32}{32}}
+\definecharacter textddag {\uchar{32}{33}}
+\definecharacter textbullet {\uchar{32}{34}}
+\definecharacter textellipsis {\uchar{32}{38}}
+\definecharacter perthousand {\uchar{32}{48}}
+
+%new:
+\definecharacter Scommaaccent {\uchar2{24}}
+\definecharacter scommaaccent {\uchar2{25}}
+\definecharacter Tcommaaccent {\uchar2{26}}
+\definecharacter tcommaaccent {\uchar2{27}}
+
+\stopencoding
+
+%D Mojca's and Taco's additions:
+
+\startencoding[uc]
+
+\definecharacter textasciicircum {\uchar{0}{94}} % 5e
+\definecharacter textgrave {\uchar{0}{96}} % 60
+\definecharacter textdiaeresis {\uchar{0}{168}} % a8
+%definecharacter textmacron {\uchar{0}{175}} % af
+%definecharacter textacute {\uchar{0}{180}} % b4
+%definecharacter textcedilla {\uchar{0}{184}} % b8
+\definecharacter textcircumflex {\uchar{2}{198}} % c6
+\definecharacter textcaron {\uchar{2}{199}} % c7
+\definecharacter textbreve {\uchar{2}{216}} % d8
+\definecharacter textdotaccent {\uchar{2}{217}} % d9
+\definecharacter textring {\uchar{2}{218}} % da
+\definecharacter textogonek {\uchar{2}{219}} % db
+\definecharacter texttilde {\uchar{2}{220}} % dc
+\definecharacter texthungarumlaut {\uchar{2}{221}} % dd
+
+\stopencoding
+
+%D Vietnamese:
+
+\startencoding[uc]
+
+\definecharacter Ohorn {\uchar1{160}}
+\definecharacter ohorn {\uchar1{161}}
+\definecharacter Uhorn {\uchar1{175}}
+\definecharacter uhorn {\uchar1{176}}
+
+\definecharacter Yhook {\uchar{30}{246}}
+\definecharacter yhook {\uchar{30}{247}}
+\definecharacter Ydotbelow {\uchar{30}{244}}
+\definecharacter ydotbelow {\uchar{30}{245}}
+\definecharacter Ahook {\uchar{30}{162}}
+\definecharacter Adotbelow {\uchar{30}{160}}
+\definecharacter Acircumflexgrave {\uchar{30}{166}}
+\definecharacter Acircumflexacute {\uchar{30}{164}}
+\definecharacter Acircumflextilde {\uchar{30}{170}}
+\definecharacter Acircumflexhook {\uchar{30}{168}}
+\definecharacter Acircumflexdotbelow {\uchar{30}{172}}
+\definecharacter Abrevegrave {\uchar{30}{176}}
+\definecharacter Abreveacute {\uchar{30}{174}}
+\definecharacter Abrevetilde {\uchar{30}{180}}
+\definecharacter Abrevehook {\uchar{30}{178}}
+\definecharacter Abrevedotbelow {\uchar{30}{182}}
+\definecharacter Ehook {\uchar{30}{186}}
+\definecharacter Edotbelow {\uchar{30}{184}}
+\definecharacter Ecircumflexgrave {\uchar{30}{192}}
+\definecharacter Ecircumflexacute {\uchar{30}{190}}
+\definecharacter Ecircumflextilde {\uchar{30}{196}}
+\definecharacter Ecircumflexhook {\uchar{30}{194}}
+\definecharacter Ecircumflexdotbelow {\uchar{30}{198}}
+\definecharacter Ihook {\uchar{30}{200}}
+\definecharacter ahook {\uchar{30}{163}}
+\definecharacter adotbelow {\uchar{30}{161}}
+\definecharacter acircumflexgrave {\uchar{30}{167}}
+\definecharacter acircumflexacute {\uchar{30}{165}}
+\definecharacter acircumflextilde {\uchar{30}{171}}
+\definecharacter acircumflexhook {\uchar{30}{169}}
+\definecharacter acircumflexdotbelow {\uchar{30}{173}}
+\definecharacter abrevegrave {\uchar{30}{177}}
+\definecharacter abreveacute {\uchar{30}{175}}
+\definecharacter abrevetilde {\uchar{30}{181}}
+\definecharacter abrevehook {\uchar{30}{179}}
+\definecharacter abrevedotbelow {\uchar{30}{183}}
+\definecharacter ehook {\uchar{30}{187}}
+\definecharacter edotbelow {\uchar{30}{185}}
+\definecharacter ecircumflexgrave {\uchar{30}{193}}
+\definecharacter ecircumflexacute {\uchar{30}{191}}
+\definecharacter ecircumflextilde {\uchar{30}{197}}
+\definecharacter ecircumflexhook {\uchar{30}{195}}
+\definecharacter ecircumflexdotbelow {\uchar{30}{199}}
+\definecharacter ihook {\uchar{30}{201}}
+\definecharacter Idotbelow {\uchar{30}{202}}
+\definecharacter Ohook {\uchar{30}{206}}
+\definecharacter Odotbelow {\uchar{30}{204}}
+\definecharacter Ocircumflexgrave {\uchar{30}{210}}
+\definecharacter Ocircumflexacute {\uchar{30}{208}}
+\definecharacter Ocircumflextilde {\uchar{30}{214}}
+\definecharacter Ocircumflexhook {\uchar{30}{212}}
+\definecharacter Ocircumflexdotbelow {\uchar{30}{216}}
+\definecharacter Ohorngrave {\uchar{30}{220}}
+\definecharacter Ohornacute {\uchar{30}{218}}
+\definecharacter Ohorntilde {\uchar{30}{224}}
+\definecharacter Ohornhook {\uchar{30}{222}}
+\definecharacter Ohorndotbelow {\uchar{30}{226}}
+\definecharacter Uhook {\uchar{30}{230}}
+\definecharacter Udotbelow {\uchar{30}{228}}
+\definecharacter Uhorngrave {\uchar{30}{234}}
+\definecharacter Uhornacute {\uchar{30}{232}}
+\definecharacter Uhorntilde {\uchar{30}{238}}
+\definecharacter Uhornhook {\uchar{30}{236}}
+\definecharacter Uhorndotbelow {\uchar{30}{240}}
+\definecharacter Ytilde {\uchar{30}{248}}
+\definecharacter idotbelow {\uchar{30}{203}}
+\definecharacter ohook {\uchar{30}{207}}
+\definecharacter odotbelow {\uchar{30}{205}}
+\definecharacter ocircumflexgrave {\uchar{30}{211}}
+\definecharacter ocircumflexacute {\uchar{30}{209}}
+\definecharacter ocircumflextilde {\uchar{30}{215}}
+\definecharacter ocircumflexhook {\uchar{30}{213}}
+\definecharacter ocircumflexdotbelow {\uchar{30}{217}}
+\definecharacter ohorngrave {\uchar{30}{221}}
+\definecharacter ohornacute {\uchar{30}{219}}
+\definecharacter ohorntilde {\uchar{30}{225}}
+\definecharacter ohornhook {\uchar{30}{223}}
+\definecharacter ohorndotbelow {\uchar{30}{227}}
+\definecharacter uhook {\uchar{30}{231}}
+\definecharacter udotbelow {\uchar{30}{229}}
+\definecharacter uhorngrave {\uchar{30}{235}}
+\definecharacter uhornacute {\uchar{30}{233}}
+\definecharacter uhorntilde {\uchar{30}{239}}
+\definecharacter uhornhook {\uchar{30}{237}}
+\definecharacter uhorndotbelow {\uchar{30}{241}}
+\definecharacter ytilde {\uchar{30}{249}}
+
+\definecharacter Etilde {\uchar{30}{188}}
+\definecharacter etilde {\uchar{30}{189}}
+\definecharacter Ygrave {\uchar{30}{242}}
+\definecharacter ygrave {\uchar{30}{243}}
+
+\stopencoding
+
+% Greek:
+
+\startencoding[uc]
+
+\definecharacter greekAlphatonos {\uchar3{134}}
+\definecharacter greekEpsilontonos {\uchar3{136}}
+\definecharacter greekEtatonos {\uchar3{137}}
+\definecharacter greekIotatonos {\uchar3{138}}
+\definecharacter greekOmicrontonos {\uchar3{140}}
+\definecharacter greekUpsilontonos {\uchar3{142}}
+\definecharacter greekOmegatonos {\uchar3{143}}
+\definecharacter greekiotadialytikatonos {\uchar3{144}}
+\definecharacter greekAlpha {\uchar3{145}}
+\definecharacter greekBeta {\uchar3{146}}
+\definecharacter greekGamma {\uchar3{147}}
+\definecharacter greekDelta {\uchar3{148}}
+\definecharacter greekEpsilon {\uchar3{149}}
+\definecharacter greekZeta {\uchar3{150}}
+\definecharacter greekEta {\uchar3{151}}
+\definecharacter greekTheta {\uchar3{152}}
+\definecharacter greekIota {\uchar3{153}}
+\definecharacter greekKappa {\uchar3{154}}
+\definecharacter greekLambda {\uchar3{155}}
+\definecharacter greekMu {\uchar3{156}}
+\definecharacter greekNu {\uchar3{157}}
+\definecharacter greekXi {\uchar3{158}}
+\definecharacter greekOmicron {\uchar3{159}}
+\definecharacter greekPi {\uchar3{160}}
+\definecharacter greekRho {\uchar3{161}}
+\definecharacter greekSigma {\uchar3{163}}
+\definecharacter greekTau {\uchar3{164}}
+\definecharacter greekUpsilon {\uchar3{165}}
+\definecharacter greekPhi {\uchar3{166}}
+\definecharacter greekChi {\uchar3{167}}
+\definecharacter greekPsi {\uchar3{168}}
+\definecharacter greekOmega {\uchar3{169}}
+
+\definecharacter greekalpha {\uchar3{177}}
+\definecharacter greekbeta {\uchar3{178}}
+\definecharacter greekgamma {\uchar3{179}}
+\definecharacter greekdelta {\uchar3{180}}
+\definecharacter greekepsilon {\uchar3{181}}
+\definecharacter greekzeta {\uchar3{182}}
+\definecharacter greeketa {\uchar3{183}}
+\definecharacter greektheta {\uchar3{184}}
+\definecharacter greekiota {\uchar3{185}}
+\definecharacter greekkappa {\uchar3{186}}
+\definecharacter greeklambda {\uchar3{187}}
+\definecharacter greekmu {\uchar3{188}}
+\definecharacter greeknu {\uchar3{189}}
+\definecharacter greekxi {\uchar3{190}}
+\definecharacter greekomicron {\uchar3{191}}
+\definecharacter greekpi {\uchar3{192}}
+\definecharacter greekrho {\uchar3{193}}
+\definecharacter greekfinalsigma {\uchar3{194}}
+\definecharacter greeksigma {\uchar3{195}}
+\definecharacter greektau {\uchar3{196}}
+\definecharacter greekupsilon {\uchar3{197}}
+\definecharacter greekphi {\uchar3{198}}
+\definecharacter greekchi {\uchar3{199}}
+\definecharacter greekpsi {\uchar3{200}}
+\definecharacter greekomega {\uchar3{201}}
+\definecharacter greekiotadialytika {\uchar3{202}}
+\definecharacter greekupsilondialytika {\uchar3{203}}
+\definecharacter greekomicrontonos {\uchar3{204}}
+\definecharacter greekupsilontonos {\uchar3{205}}
+\definecharacter greekomegatonos {\uchar3{206}}
+
+\definecharacter greekIotadialytika {\uchar3{170}}
+\definecharacter greekUpsilondialytika {\uchar3{171}}
+
+\definecharacter greekalphatonos {\uchar3{172}}
+\definecharacter greekepsilontonos {\uchar3{173}}
+\definecharacter greeketatonos {\uchar3{174}}
+\definecharacter greekiotatonos {\uchar3{175}}
+\definecharacter greekupsilondialytikatonos {\uchar3{176}}
+
+% new:
+\definecharacter greekthetaalt {\uchar3{209}}
+\definecharacter greekphialt {\uchar3{213}}
+\definecharacter greekpialt {\uchar3{214}}
+\definecharacter greekrhoalt {\uchar3{241}}
+\definecharacter greekepsilonalt {\uchar3{245}}
+
+\stopencoding
+
+% Cyrillic:
+
+\startencoding[uc]
+
+\definecharacter cyrillicA {\uchar4{16}}
+\definecharacter cyrillicB {\uchar4{17}}
+\definecharacter cyrillicV {\uchar4{18}}
+\definecharacter cyrillicG {\uchar4{19}}
+\definecharacter cyrillicD {\uchar4{20}}
+\definecharacter cyrillicE {\uchar4{21}}
+\definecharacter cyrillicZH {\uchar4{22}}
+\definecharacter cyrillicZ {\uchar4{23}}
+\definecharacter cyrillicI {\uchar4{24}}
+\definecharacter cyrillicISHRT {\uchar4{25}}
+\definecharacter cyrillicK {\uchar4{26}}
+\definecharacter cyrillicL {\uchar4{27}}
+\definecharacter cyrillicM {\uchar4{28}}
+\definecharacter cyrillicN {\uchar4{29}}
+\definecharacter cyrillicO {\uchar4{30}}
+\definecharacter cyrillicP {\uchar4{31}}
+\definecharacter cyrillicR {\uchar4{32}}
+\definecharacter cyrillicS {\uchar4{33}}
+\definecharacter cyrillicT {\uchar4{34}}
+\definecharacter cyrillicU {\uchar4{35}}
+\definecharacter cyrillicF {\uchar4{36}}
+\definecharacter cyrillicH {\uchar4{37}}
+\definecharacter cyrillicC {\uchar4{38}}
+\definecharacter cyrillicCH {\uchar4{39}}
+\definecharacter cyrillicSH {\uchar4{40}}
+\definecharacter cyrillicSHCH {\uchar4{41}}
+\definecharacter cyrillicHRDSN {\uchar4{42}}
+\definecharacter cyrillicERY {\uchar4{43}}
+\definecharacter cyrillicSFTSN {\uchar4{44}}
+\definecharacter cyrillicEREV {\uchar4{45}}
+\definecharacter cyrillicYU {\uchar4{46}}
+\definecharacter cyrillicYA {\uchar4{47}}
+
+\definecharacter cyrillica {\uchar4{48}}
+\definecharacter cyrillicb {\uchar4{49}}
+\definecharacter cyrillicv {\uchar4{50}}
+\definecharacter cyrillicg {\uchar4{51}}
+\definecharacter cyrillicd {\uchar4{52}}
+\definecharacter cyrillice {\uchar4{53}}
+\definecharacter cyrilliczh {\uchar4{54}}
+\definecharacter cyrillicz {\uchar4{55}}
+\definecharacter cyrillici {\uchar4{56}}
+\definecharacter cyrillicishrt {\uchar4{57}}
+\definecharacter cyrillick {\uchar4{58}}
+\definecharacter cyrillicl {\uchar4{59}}
+\definecharacter cyrillicm {\uchar4{60}}
+\definecharacter cyrillicn {\uchar4{61}}
+\definecharacter cyrillico {\uchar4{62}}
+\definecharacter cyrillicp {\uchar4{63}}
+\definecharacter cyrillicr {\uchar4{64}}
+\definecharacter cyrillics {\uchar4{65}}
+\definecharacter cyrillict {\uchar4{66}}
+\definecharacter cyrillicu {\uchar4{67}}
+\definecharacter cyrillicf {\uchar4{68}}
+\definecharacter cyrillich {\uchar4{69}}
+\definecharacter cyrillicc {\uchar4{70}}
+\definecharacter cyrillicch {\uchar4{71}}
+\definecharacter cyrillicsh {\uchar4{72}}
+\definecharacter cyrillicshch {\uchar4{73}}
+\definecharacter cyrillichrdsn {\uchar4{74}}
+\definecharacter cyrillicery {\uchar4{75}}
+\definecharacter cyrillicsftsn {\uchar4{76}}
+\definecharacter cyrillicerev {\uchar4{77}}
+\definecharacter cyrillicyu {\uchar4{78}}
+\definecharacter cyrillicya {\uchar4{79}}
+
+%D I tried to figure out what these were, but the unicode
+%D tables suggested they were the same as cyrillici, which was
+%D already defined! So, a temporary definition:
+
+% \def\cyrillicII{\cyrillicI}
+% \def\cyrillicii{\cyrillici}
+
+%D a guess derived from looking at enco-cyr suggests that this is
+%D identical to the Roman I/i pair. To me, that sounds like
+%D CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I in the UC tables!
+
+\definecharacter cyrillicII {\uchar4{6}}
+\definecharacter cyrillicii {\uchar4{86}}
+
+%D Guessing that tlir6a corresponds with t2a encoding as advertised,
+%D here are some more, cos I had some spare time: (AL)
+
+\definecharacter cyrillicDJE {\uchar4{2}}
+\definecharacter cyrillicTSHE {\uchar4{11}}
+%definecharacter cyrillicSHHA 132
+%definecharacter cyrillicZHDSC 133
+\definecharacter cyrillicZDSC {\uchar4{152}}
+\definecharacter cyrillicLJE {\uchar4{9}}
+\definecharacter cyrillicYI {\uchar4{7}}
+\definecharacter cyrillicAE {\uchar4{212}}
+%definecharacter cyrillicNDSC 141
+%definecharacter cyrillicNG 142
+\definecharacter cyrillicDZE {\uchar4{5}}
+%definecharacter cyrillicOTLD 144
+\definecharacter cyrillicSDSC {\uchar4{170}}
+\definecharacter cyrillicUSHRT {\uchar4{14}}
+%definecharacter cyrillicY 147
+%definecharacter cyrillicYHCRS 148
+%definecharacter cyrillicHDSC 149
+\definecharacter cyrillicDZHE {\uchar4{15}}
+\definecharacter cyrillicIE {\uchar4{4}}
+\definecharacter cyrillicNJE {\uchar4{10}}
+\definecharacter cyrillicYO {\uchar4{1}}
+
+\definecharacter cyrillicdje {\uchar4{82}}
+\definecharacter cyrillictshe {\uchar4{91}}
+%definecharacter cyrillicshha 164
+%definecharacter cyrilliczhdsc 165
+\definecharacter cyrilliczdsc {\uchar4{153}}
+\definecharacter cyrilliclje {\uchar4{89}}
+\definecharacter cyrillicyi {\uchar4{87}}
+\definecharacter cyrillicae {\uchar4{213}}
+%definecharacter cyrillicndsc 173
+%definecharacter cyrillicng 174
+\definecharacter cyrillicdze {\uchar4{85}}
+%definecharacter cyrillicotld 176
+\definecharacter cyrillicsdsc {\uchar4{171}}
+\definecharacter cyrillicushrt {\uchar4{94}}
+%definecharacter cyrillicy 179
+%definecharacter cyrillicyhcrs 180
+%definecharacter cyrillichdsc 181
+\definecharacter cyrillicdzhe {\uchar4{95}}
+\definecharacter cyrillicie {\uchar4{84}}
+\definecharacter cyrillicnje {\uchar4{90}}
+\definecharacter cyrillicyo {\uchar4{81}}
+
+% is there overlap with the above definitions
+
+\definecharacter cyrillicEgrave {\uchar4{0}}
+\definecharacter cyrillicGJE {\uchar4{3}}
+\definecharacter cyrillicJE {\uchar4{8}}
+\definecharacter cyrillicKJE {\uchar4{12}}
+\definecharacter cyrillicIgrave {\uchar4{13}}
+\definecharacter cyrillicegrave {\uchar4{80}}
+\definecharacter cyrillicgje {\uchar4{83}}
+\definecharacter cyrillicje {\uchar4{88}}
+\definecharacter cyrillickje {\uchar4{92}}
+\definecharacter cyrillicigrave {\uchar4{93}}
+\definecharacter cyrillicOMEGA {\uchar4{96}}
+\definecharacter cyrillicomega {\uchar4{97}}
+\definecharacter cyrillicYAT {\uchar4{98}}
+\definecharacter cyrillicyat {\uchar4{99}}
+\definecharacter cyrillicEiotified {\uchar4{100}}
+\definecharacter cyrilliceiotified {\uchar4{101}}
+\definecharacter cyrillicLITTLEYUS {\uchar4{102}}
+\definecharacter cyrilliclittleyus {\uchar4{103}}
+\definecharacter cyrillicLITTLEYUSiotified {\uchar4{104}}
+\definecharacter cyrilliclittleyusiotified {\uchar4{105}}
+\definecharacter cyrillicBIGYUS {\uchar4{106}}
+\definecharacter cyrillicbigyus {\uchar4{107}}
+\definecharacter cyrillicBIGYUSiotified {\uchar4{108}}
+\definecharacter cyrillicbigyusiotified {\uchar4{109}}
+\definecharacter cyrillicKSI {\uchar4{110}}
+\definecharacter cyrillicksi {\uchar4{111}}
+\definecharacter cyrillicPSI {\uchar4{112}}
+\definecharacter cyrillicpsi {\uchar4{113}}
+\definecharacter cyrillicFITA {\uchar4{114}}
+\definecharacter cyrillicfita {\uchar4{115}}
+\definecharacter cyrillicIZHITSA {\uchar4{116}}
+\definecharacter cyrillicizhitsa {\uchar4{117}}
+\definecharacter cyrillicIZHITSAdoublegrave {\uchar4{118}}
+\definecharacter cyrillicizhitsadoublegrave {\uchar4{119}}
+\definecharacter cyrillicUK {\uchar4{120}}
+\definecharacter cyrillicuk {\uchar4{121}}
+\definecharacter cyrillicOMEGAround {\uchar4{122}}
+\definecharacter cyrillicomegaround {\uchar4{123}}
+\definecharacter cyrillicOMEGAtitlo {\uchar4{124}}
+\definecharacter cyrillicomegatitlo {\uchar4{125}}
+\definecharacter cyrillicOT {\uchar4{126}}
+\definecharacter cyrillicot {\uchar4{127}}
+\definecharacter cyrillicKOPPA {\uchar4{128}}
+\definecharacter cyrillickoppa {\uchar4{129}}
+\definecharacter cyrillicTITLO {\uchar4{131}}
+\definecharacter cyrillicPALATALIZATION {\uchar4{132}}
+\definecharacter cyrillicDASIAPNEUMATA {\uchar4{133}}
+\definecharacter cyrillicPSILIPNEUMATA {\uchar4{134}}
+\definecharacter cyrillicISHRTtail {\uchar4{138}}
+\definecharacter cyrillicishrttail {\uchar4{139}}
+\definecharacter cyrillicSEMISOFT {\uchar4{140}}
+\definecharacter cyrillicsemisoft {\uchar4{141}}
+\definecharacter cyrillicERtick {\uchar4{142}}
+\definecharacter cyrillicertick {\uchar4{143}}
+\definecharacter cyrillicGHEupturn {\uchar4{144}}
+\definecharacter cyrillicgheupturn {\uchar4{145}}
+\definecharacter cyrillicGHEstroke {\uchar4{146}}
+\definecharacter cyrillicghestroke {\uchar4{147}}
+\definecharacter cyrillicGHEmidhook {\uchar4{148}}
+\definecharacter cyrillicghemidhook {\uchar4{149}}
+\definecharacter cyrillicZHEdescender {\uchar4{150}}
+\definecharacter cyrilliczhedescender {\uchar4{151}}
+\definecharacter cyrillicZDSC {\uchar4{152}}
+\definecharacter cyrilliczdsc {\uchar4{153}}
+\definecharacter cyrillicKADC {\uchar4{154}}
+\definecharacter cyrillickadc {\uchar4{155}}
+\definecharacter cyrillicKAvertstroke {\uchar4{156}}
+\definecharacter cyrillickavertstroke {\uchar4{157}}
+\definecharacter cyrillicKAstroke {\uchar4{158}}
+\definecharacter cyrillickastroke {\uchar4{159}}
+\definecharacter cyrillicKAbashkir {\uchar4{160}}
+\definecharacter cyrillickabashkir {\uchar4{161}}
+\definecharacter cyrillicENDC {\uchar4{162}}
+\definecharacter cyrillicendc {\uchar4{163}}
+\definecharacter cyrillicENGHE {\uchar4{164}}
+\definecharacter cyrillicenghe {\uchar4{165}}
+\definecharacter cyrillicPEmidhook {\uchar4{166}}
+\definecharacter cyrillicpemidhook {\uchar4{167}}
+\definecharacter cyrillicHA {\uchar4{168}}
+\definecharacter cyrillicha {\uchar4{169}}
+%definecharacter cyrillicSDSC {\uchar4{170}} % already defined
+%definecharacter cyrilliccdsc {\uchar4{171}} % already defined
+\definecharacter cyrillicTEDC {\uchar4{172}}
+\definecharacter cyrillictedc {\uchar4{173}}
+\definecharacter cyrillicYstr {\uchar4{174}}
+\definecharacter cyrillicystr {\uchar4{175}}
+\definecharacter cyrillicYstrstroke {\uchar4{176}}
+\definecharacter cyrillicystrstroke {\uchar4{177}}
+\definecharacter cyrillicHADC {\uchar4{178}}
+\definecharacter cyrillichadc {\uchar4{179}}
+\definecharacter cyrillicTETSE {\uchar4{180}}
+\definecharacter cyrillictetse {\uchar4{181}}
+\definecharacter cyrillicCHEDC {\uchar4{182}}
+\definecharacter cyrillicchedc {\uchar4{183}}
+\definecharacter cyrillicCHEvertstroke {\uchar4{184}}
+\definecharacter cyrillicchevertstroke {\uchar4{185}}
+\definecharacter cyrillicSHHA {\uchar4{186}}
+\definecharacter cyrillicshha {\uchar4{187}}
+\definecharacter cyrillicCHEabkhasian {\uchar4{188}}
+\definecharacter cyrilliccheabkhasian {\uchar4{189}}
+\definecharacter cyrillicCHEDCabkhasian {\uchar4{190}}
+\definecharacter cyrillicchedcabkhasian {\uchar4{191}}
+\definecharacter cyrillicPALOCHKA {\uchar4{192}}
+\definecharacter cyrillicZHEbreve {\uchar4{193}}
+\definecharacter cyrilliczhebreve {\uchar4{194}}
+\definecharacter cyrillicKAhook {\uchar4{195}}
+\definecharacter cyrillickahook {\uchar4{196}}
+\definecharacter cyrillicELtail {\uchar4{197}}
+\definecharacter cyrilliceltail {\uchar4{198}}
+\definecharacter cyrillicENhook {\uchar4{199}}
+\definecharacter cyrillicenhook {\uchar4{200}}
+\definecharacter cyrillicENtail {\uchar4{201}}
+\definecharacter cyrillicentail {\uchar4{202}}
+\definecharacter cyrillicCHEkhakassian {\uchar4{203}}
+\definecharacter cyrillicchekhakassian {\uchar4{204}}
+\definecharacter cyrillicEMtail {\uchar4{205}}
+\definecharacter cyrillicemtail {\uchar4{206}}
+\definecharacter cyrillicAbreve {\uchar4{208}}
+\definecharacter cyrillicabreve {\uchar4{209}}
+\definecharacter cyrillicAdiaeresis {\uchar4{210}}
+\definecharacter cyrillicadiaeresis {\uchar4{211}}
+%definecharacter cyrillicAE {\uchar4{212}} % already defined
+%definecharacter cyrillicae {\uchar4{213}} % already defined
+\definecharacter cyrillicEbreve {\uchar4{214}}
+\definecharacter cyrillicebreve {\uchar4{215}}
+\definecharacter cyrillicSCHWA {\uchar4{216}}
+\definecharacter cyrillicschwa {\uchar4{217}}
+\definecharacter cyrillicSCHWAdiaeresis {\uchar4{218}}
+\definecharacter cyrillicschwadiaeresis {\uchar4{219}}
+\definecharacter cyrillicZHEdiaeresis {\uchar4{220}}
+\definecharacter cyrilliczhediaeresis {\uchar4{221}}
+\definecharacter cyrillicZEdiaeresis {\uchar4{222}}
+\definecharacter cyrilliczediaeresis {\uchar4{223}}
+\definecharacter cyrillicDZEabkhasian {\uchar4{224}}
+\definecharacter cyrillicdzeabkhasian {\uchar4{225}}
+\definecharacter cyrillicImacron {\uchar4{226}}
+\definecharacter cyrillicimacron {\uchar4{227}}
+\definecharacter cyrillicIdiaeresis {\uchar4{228}}
+\definecharacter cyrillicidiaeresis {\uchar4{229}}
+\definecharacter cyrillicOdiaeresis {\uchar4{230}}
+\definecharacter cyrillicodiaeresis {\uchar4{231}}
+\definecharacter cyrillicObarred {\uchar4{232}}
+\definecharacter cyrillicobarred {\uchar4{233}}
+\definecharacter cyrillicObarreddiaeresis {\uchar4{234}}
+\definecharacter cyrillicobarreddiaeresis {\uchar4{235}}
+\definecharacter cyrillicEdiaeresis {\uchar4{236}}
+\definecharacter cyrillicediaeresis {\uchar4{237}}
+\definecharacter cyrillicUmacron {\uchar4{238}}
+\definecharacter cyrillicumacron {\uchar4{239}}
+\definecharacter cyrillicUdiaeresis {\uchar4{240}}
+\definecharacter cyrillicudiaeresis {\uchar4{241}}
+\definecharacter cyrillicUdoubleacute {\uchar4{242}}
+\definecharacter cyrillicudoubleacute {\uchar4{243}}
+\definecharacter cyrillicCHEdiaeresis {\uchar4{244}}
+\definecharacter cyrillicchediaeresis {\uchar4{245}}
+\definecharacter cyrillicYERUdiaeresis {\uchar4{248}}
+\definecharacter cyrillicyerudiaeresis {\uchar4{249}}
+
+\stopencoding
+
+% Greek Extended
+
+\startencoding[uc]
+
+\definecharacter greekalphapsili {\uchar{31}{0}}
+\definecharacter greekalphadasia {\uchar{31}{1}}
+\definecharacter greekalphapsilivaria {\uchar{31}{2}}
+\definecharacter greekalphadasiavaria {\uchar{31}{3}}
+\definecharacter greekalphapsilitonos {\uchar{31}{4}}
+\definecharacter greekalphadasiatonos {\uchar{31}{5}}
+\definecharacter greekalphapsiliperispomeni {\uchar{31}{6}}
+\definecharacter greekalphadasiaperispomeni {\uchar{31}{7}}
+\definecharacter greekAlphapsili {\uchar{31}{8}}
+\definecharacter greekAlphadasia {\uchar{31}{9}}
+\definecharacter greekAlphapsilivaria {\uchar{31}{10}}
+\definecharacter greekAlphadasiavaria {\uchar{31}{11}}
+\definecharacter greekAlphapsilitonos {\uchar{31}{12}}
+\definecharacter greekAlphadasiatonos {\uchar{31}{13}}
+\definecharacter greekAlphapsiliperispomeni {\uchar{31}{14}}
+\definecharacter greekAlphadasiaperispomeni {\uchar{31}{15}}
+\definecharacter greekepsilonpsili {\uchar{31}{16}} % 1f10
+\definecharacter greekepsilondasia {\uchar{31}{17}}
+\definecharacter greekepsilonpsilivaria {\uchar{31}{18}}
+\definecharacter greekepsilondasiavaria {\uchar{31}{19}}
+\definecharacter greekepsilonpsilitonos {\uchar{31}{20}}
+\definecharacter greekepsilondasiatonos {\uchar{31}{21}}
+\definecharacter greekEpsilonpsili {\uchar{31}{24}}
+\definecharacter greekEpsilondasia {\uchar{31}{25}}
+\definecharacter greekEpsilonpsilivaria {\uchar{31}{26}}
+\definecharacter greekEpsilondasiavaria {\uchar{31}{27}}
+\definecharacter greekEpsilonpsilitonos {\uchar{31}{28}}
+\definecharacter greekEpsilondasiatonos {\uchar{31}{29}}
+\definecharacter greeketapsili {\uchar{31}{32}} % 1f20
+\definecharacter greeketadasia {\uchar{31}{33}}
+\definecharacter greeketapsilivaria {\uchar{31}{34}}
+\definecharacter greeketadasiavaria {\uchar{31}{35}}
+\definecharacter greeketapsilitonos {\uchar{31}{36}}
+\definecharacter greeketadasiatonos {\uchar{31}{37}}
+\definecharacter greeketapsiliperispomeni {\uchar{31}{38}}
+\definecharacter greeketadasiaperispomeni {\uchar{31}{39}}
+\definecharacter greekEtapsili {\uchar{31}{40}}
+\definecharacter greekEtadasia {\uchar{31}{41}}
+\definecharacter greekEtapsilivaria {\uchar{31}{42}}
+\definecharacter greekEtadasiavaria {\uchar{31}{43}}
+\definecharacter greekEtapsilitonos {\uchar{31}{44}}
+\definecharacter greekEtadasiatonos {\uchar{31}{45}}
+\definecharacter greekEtapsiliperispomeni {\uchar{31}{46}}
+\definecharacter greekEtadasiaperispomeni {\uchar{31}{47}}
+\definecharacter greekiotapsili {\uchar{31}{48}} % 1f30
+\definecharacter greekiotadasia {\uchar{31}{49}}
+\definecharacter greekiotapsilivaria {\uchar{31}{50}}
+\definecharacter greekiotadasiavaria {\uchar{31}{51}}
+\definecharacter greekiotapsilitonos {\uchar{31}{52}}
+\definecharacter greekiotadasiatonos {\uchar{31}{53}}
+\definecharacter greekiotapsiliperispomeni {\uchar{31}{54}}
+\definecharacter greekiotadasiaperispomeni {\uchar{31}{55}}
+\definecharacter greekIotapsili {\uchar{31}{56}}
+\definecharacter greekIotadasia {\uchar{31}{57}}
+\definecharacter greekIotapsilivaria {\uchar{31}{58}}
+\definecharacter greekIotadasiavaria {\uchar{31}{59}}
+\definecharacter greekIotapsilitonos {\uchar{31}{60}}
+\definecharacter greekIotadasiatonos {\uchar{31}{61}}
+\definecharacter greekIotapsiliperispomeni {\uchar{31}{62}}
+\definecharacter greekIotadasiaperispomeni {\uchar{31}{63}}
+\definecharacter greekomicronpsili {\uchar{31}{64}} % 1f40
+\definecharacter greekomicrondasia {\uchar{31}{65}}
+\definecharacter greekomicronpsilivaria {\uchar{31}{66}}
+\definecharacter greekomicrondasiavaria {\uchar{31}{67}}
+\definecharacter greekomicronpsilitonos {\uchar{31}{68}}
+\definecharacter greekomicrondasiatonos {\uchar{31}{69}}
+\definecharacter greekOmicronpsili {\uchar{31}{72}}
+\definecharacter greekOmicrondasia {\uchar{31}{73}}
+\definecharacter greekOmicronpsilivaria {\uchar{31}{74}}
+\definecharacter greekOmicrondasiavaria {\uchar{31}{75}}
+\definecharacter greekOmicronpsilitonos {\uchar{31}{76}}
+\definecharacter greekOmicrondasiatonos {\uchar{31}{77}}
+\definecharacter greekupsilonpsili {\uchar{31}{80}} % 1f50
+\definecharacter greekupsilondasia {\uchar{31}{81}}
+\definecharacter greekupsilonpsilivaria {\uchar{31}{82}}
+\definecharacter greekupsilondasiavaria {\uchar{31}{83}}
+\definecharacter greekupsilonpsilitonos {\uchar{31}{84}}
+\definecharacter greekupsilondasiatonos {\uchar{31}{85}}
+\definecharacter greekupsilonpsiliperispomeni {\uchar{31}{86}}
+\definecharacter greekupsilondasiaperispomeni {\uchar{31}{87}}
+\definecharacter greekUpsilondasia {\uchar{31}{89}}
+\definecharacter greekUpsilondasiavaria {\uchar{31}{91}}
+\definecharacter greekUpsilondasiatonos {\uchar{31}{93}}
+\definecharacter greekUpsilondasiaperispomeni {\uchar{31}{95}}
+\definecharacter greekomegapsili {\uchar{31}{96}} % 1f60
+\definecharacter greekomegadasia {\uchar{31}{97}}
+\definecharacter greekomegapsilivaria {\uchar{31}{98}}
+\definecharacter greekomegadasiavaria {\uchar{31}{99}}
+\definecharacter greekomegapsilitonos {\uchar{31}{100}}
+\definecharacter greekomegadasiatonos {\uchar{31}{101}}
+\definecharacter greekomegapsiliperispomeni {\uchar{31}{102}}
+\definecharacter greekomegadasiaperispomeni {\uchar{31}{103}}
+\definecharacter greekOmegapsili {\uchar{31}{104}}
+\definecharacter greekOmegadasia {\uchar{31}{105}}
+\definecharacter greekOmegapsilivaria {\uchar{31}{106}}
+\definecharacter greekOmegadasiavaria {\uchar{31}{107}}
+\definecharacter greekOmegapsilitonos {\uchar{31}{108}}
+\definecharacter greekOmegadasiatonos {\uchar{31}{109}}
+\definecharacter greekOmegapsiliperispomeni {\uchar{31}{110}}
+\definecharacter greekOmegadasiaperispomeni {\uchar{31}{111}}
+\definecharacter greekalphavaria {\uchar{31}{112}} % 1f70
+\definecharacter greekalphaoxia {\uchar{31}{113}}
+\definecharacter greekepsilonvaria {\uchar{31}{114}}
+\definecharacter greekepsilonoxia {\uchar{31}{115}}
+\definecharacter greeketavaria {\uchar{31}{116}}
+\definecharacter greeketaoxia {\uchar{31}{117}}
+\definecharacter greekiotavaria {\uchar{31}{118}}
+\definecharacter greekiotaoxia {\uchar{31}{119}}
+\definecharacter greekomicronvaria {\uchar{31}{120}}
+\definecharacter greekomicronoxia {\uchar{31}{121}}
+\definecharacter greekupsilonvaria {\uchar{31}{122}}
+\definecharacter greekupsilonoxia {\uchar{31}{123}}
+\definecharacter greekomegavaria {\uchar{31}{124}}
+\definecharacter greekomegaoxia {\uchar{31}{125}}
+\definecharacter greekalphaiotasubpsili {\uchar{31}{128}} % 1f80
+\definecharacter greekalphaiotasubdasia {\uchar{31}{129}}
+\definecharacter greekalphaiotasubpsilivaria {\uchar{31}{130}}
+\definecharacter greekalphaiotasubdasiavaria {\uchar{31}{131}}
+\definecharacter greekalphaiotasubpsilitonos {\uchar{31}{132}}
+\definecharacter greekalphaiotasubdasiatonos {\uchar{31}{133}}
+\definecharacter greekalphaiotasubpsiliperispomeni {\uchar{31}{134}}
+\definecharacter greekalphaiotasubdasiaperispomeni {\uchar{31}{135}}
+\definecharacter greekAlphaiotasubpsili {\uchar{31}{136}}
+\definecharacter greekAlphaiotasubdasia {\uchar{31}{137}}
+\definecharacter greekAlphaiotasubpsilivaria {\uchar{31}{138}}
+\definecharacter greekAlphaiotasubdasiavaria {\uchar{31}{139}}
+\definecharacter greekAlphaiotasubpsilitonos {\uchar{31}{140}}
+\definecharacter greekAlphaiotasubdasiatonos {\uchar{31}{141}}
+\definecharacter greekAlphaiotasubpsiliperispomeni {\uchar{31}{142}}
+\definecharacter greekAlphaiotasubdasiaperispomeni {\uchar{31}{143}}
+\definecharacter greeketaiotasubpsili {\uchar{31}{144}} % 1f90
+\definecharacter greeketaiotasubdasia {\uchar{31}{145}}
+\definecharacter greeketaiotasubpsilivaria {\uchar{31}{146}}
+\definecharacter greeketaiotasubdasiavaria {\uchar{31}{147}}
+\definecharacter greeketaiotasubpsilitonos {\uchar{31}{148}}
+\definecharacter greeketaiotasubdasiatonos {\uchar{31}{149}}
+\definecharacter greeketaiotasubpsiliperispomeni {\uchar{31}{150}}
+\definecharacter greeketaiotasubdasiaperispomeni {\uchar{31}{151}}
+\definecharacter greekEtaiotasubpsili {\uchar{31}{152}}
+\definecharacter greekEtaiotasubdasia {\uchar{31}{153}}
+\definecharacter greekEtaiotasubpsilivaria {\uchar{31}{154}}
+\definecharacter greekEtaiotasubdasiavaria {\uchar{31}{155}}
+\definecharacter greekEtaiotasubpsilitonos {\uchar{31}{156}}
+\definecharacter greekEtaiotasubdasiatonos {\uchar{31}{157}}
+\definecharacter greekEtaiotasubpsiliperispomeni {\uchar{31}{158}}
+\definecharacter greekEtaiotasubdasiaperispomeni {\uchar{31}{159}}
+\definecharacter greekomegaiotasubpsili {\uchar{31}{160}} % 1fa0
+\definecharacter greekomegaiotasubdasia {\uchar{31}{161}}
+\definecharacter greekomegaiotasubpsilivaria {\uchar{31}{162}}
+\definecharacter greekomegaiotasubdasiavaria {\uchar{31}{163}}
+\definecharacter greekomegaiotasubpsilitonos {\uchar{31}{164}}
+\definecharacter greekomegaiotasubdasiatonos {\uchar{31}{165}}
+\definecharacter greekomegaiotasubpsiliperispomeni {\uchar{31}{166}}
+\definecharacter greekomegaiotasubdasiaperispomeni {\uchar{31}{167}}
+\definecharacter greekOmegaiotasubpsili {\uchar{31}{168}}
+\definecharacter greekOmegaiotasubdasia {\uchar{31}{169}}
+\definecharacter greekOmegaiotasubpsilivaria {\uchar{31}{170}}
+\definecharacter greekOmegaiotasubdasiavaria {\uchar{31}{171}}
+\definecharacter greekOmegaiotasubpsilitonos {\uchar{31}{172}}
+\definecharacter greekOmegaiotasubdasiatonos {\uchar{31}{173}}
+\definecharacter greekOmegaiotasubpsiliperispomeni {\uchar{31}{174}}
+\definecharacter greekOmegaiotasubdasiaperispomeni {\uchar{31}{175}}
+\definecharacter greekalphavrachy {\uchar{31}{176}} % 1fb0
+\definecharacter greekalphamacron {\uchar{31}{177}}
+\definecharacter greekalphaiotasubvaria {\uchar{31}{178}}
+\definecharacter greekalphaiotasub {\uchar{31}{179}}
+\definecharacter greekalphaiotasubtonos {\uchar{31}{180}}
+\definecharacter greekalphaperispomeni {\uchar{31}{182}}
+\definecharacter greekalphaiotasubperispomeni {\uchar{31}{183}}
+\definecharacter greekAlphavrachy {\uchar{31}{184}}
+\definecharacter greekAlphamacron {\uchar{31}{185}}
+\definecharacter greekAlphavaria {\uchar{31}{186}}
+\definecharacter greekAlphatonos {\uchar{31}{187}}
+\definecharacter greekAlphaiotasub {\uchar{31}{188}}
+\definecharacter greekCoronis {\uchar{31}{189}}
+\definecharacter greekprosgegrammeni {\uchar{31}{190}}
+\definecharacter greekpsili {\uchar{31}{191}}
+\definecharacter greekperispomeni {\uchar{31}{192}} % 1fc0
+\definecharacter greekdialytikaperispomeni {\uchar{31}{193}}
+\definecharacter greeketaiotasubvaria {\uchar{31}{194}}
+\definecharacter greeketaiotasub {\uchar{31}{195}}
+\definecharacter greeketaiotasubtonos {\uchar{31}{196}}
+\definecharacter greeketaperispomeni {\uchar{31}{198}}
+\definecharacter greeketaiotasubperispomeni {\uchar{31}{199}}
+\definecharacter greekEpsilonvaria {\uchar{31}{200}}
+\definecharacter greekEpsilontonos {\uchar{31}{201}}
+\definecharacter greekEtavaria {\uchar{31}{202}}
+\definecharacter greekEtatonos {\uchar{31}{203}}
+\definecharacter greekEtaiotasub {\uchar{31}{204}}
+\definecharacter greekpsilivaria {\uchar{31}{205}}
+\definecharacter greekpsilitonos {\uchar{31}{206}}
+\definecharacter greekpsiliperispomeni {\uchar{31}{207}}
+\definecharacter greekiotavrachy {\uchar{31}{208}} % 1fd0
+\definecharacter greekiotamacron {\uchar{31}{209}}
+\definecharacter greekiotadialytikavaria {\uchar{31}{210}}
+\definecharacter greekiotadialytikatonos {\uchar{31}{211}}
+\definecharacter greekiotaperispomeni {\uchar{31}{214}}
+\definecharacter greekiotadialytikaperispomeni {\uchar{31}{215}}
+\definecharacter greekIotavrachy {\uchar{31}{216}}
+\definecharacter greekIotamacron {\uchar{31}{217}}
+\definecharacter greekIotavaria {\uchar{31}{218}}
+\definecharacter greekIotatonos {\uchar{31}{219}}
+\definecharacter greekdasiavaria {\uchar{31}{221}}
+\definecharacter greekdasiatonos {\uchar{31}{222}}
+\definecharacter greekdasiaperispomeni {\uchar{31}{223}}
+\definecharacter greekupsilonvrachy {\uchar{31}{224}} % 1fe0
+\definecharacter greekupsilonmacron {\uchar{31}{225}}
+\definecharacter greekupsilondialytikavaria {\uchar{31}{226}}
+\definecharacter greekupsilondialytikatonos {\uchar{31}{227}}
+\definecharacter greekrhopsili {\uchar{31}{228}}
+\definecharacter greekrhodasia {\uchar{31}{229}}
+\definecharacter greekupsilonperispomeni {\uchar{31}{230}}
+\definecharacter greekupsilondialytikaperispomeni {\uchar{31}{231}}
+\definecharacter greekUpsilonvrachy {\uchar{31}{232}}
+\definecharacter greekUpsilonmacron {\uchar{31}{233}}
+\definecharacter greekUpsilonvaria {\uchar{31}{234}}
+\definecharacter greekUpsilontonos {\uchar{31}{235}}
+\definecharacter greekRhodasia {\uchar{31}{236}}
+\definecharacter greekdialytikavaria {\uchar{31}{237}}
+\definecharacter greekdialytikatonos {\uchar{31}{238}}
+\definecharacter greekvaria {\uchar{31}{239}}
+\definecharacter greekomegaiotasubvaria {\uchar{31}{242}}
+\definecharacter greekomegaiotasub {\uchar{31}{243}}
+\definecharacter greekomegaiotasubtonos {\uchar{31}{244}}
+\definecharacter greekomegaperispomeni {\uchar{31}{246}}
+\definecharacter greekomegaiotasubperispomeni {\uchar{31}{247}}
+\definecharacter greekOmicronvaria {\uchar{31}{248}}
+\definecharacter greekOmicrontonos {\uchar{31}{249}}
+\definecharacter greekOmegavaria {\uchar{31}{250}}
+\definecharacter greekOmegatonos {\uchar{31}{251}}
+\definecharacter greekOmegaiotasub {\uchar{31}{252}}
+\definecharacter greekoxia {\uchar{31}{253}}
+\definecharacter greekdasia {\uchar{31}{254}}
+\definecharacter greeksigmalunate {\uchar3{242}}
+\definecharacter greekSigmalunate {\uchar3{249}}
+\definecharacter greeksampi {\uchar3{225}}
+\definecharacter greekdigamma {\uchar3{221}}
+\definecharacter greekstigma {\uchar3{219}}
+\definecharacter greeknumkoppa {\uchar3{223}}
+\definecharacter greekkoppa {\uchar3{217}}
+\definecharacter greekupsilondiaeresis {\uchar3{203}}
+
+\stopencoding
+
+% Hebrew:
+
+\startencoding[uc]
+
+\definecharacter hebrewAlef {\uchar5{208}} % 05D0
+\definecharacter hebrewBet {\uchar5{209}}
+\definecharacter hebrewGimel {\uchar5{210}}
+\definecharacter hebrewDalet {\uchar5{211}}
+\definecharacter hebrewHe {\uchar5{212}}
+\definecharacter hebrewVav {\uchar5{213}}
+\definecharacter hebrewZayin {\uchar5{214}}
+\definecharacter hebrewHet {\uchar5{215}}
+\definecharacter hebrewTet {\uchar5{216}}
+\definecharacter hebrewYod {\uchar5{217}}
+\definecharacter hebrewKaffinal {\uchar5{218}}
+\definecharacter hebrewKaf {\uchar5{219}}
+\definecharacter hebrewLamed {\uchar5{220}}
+\definecharacter hebrewMemfinal {\uchar5{221}}
+\definecharacter hebrewMem {\uchar5{222}}
+\definecharacter hebrewNunfinal {\uchar5{223}}
+\definecharacter hebrewNun {\uchar5{224}}
+\definecharacter hebrewSamekh {\uchar5{225}}
+\definecharacter hebrewAyin {\uchar5{226}}
+\definecharacter hebrewPefinal {\uchar5{227}}
+\definecharacter hebrewPe {\uchar5{228}}
+\definecharacter hebrewTsadifinal {\uchar5{229}}
+\definecharacter hebrewTsadi {\uchar5{230}}
+\definecharacter hebrewQof {\uchar5{231}}
+\definecharacter hebrewResh {\uchar5{232}}
+\definecharacter hebrewShin {\uchar5{233}}
+\definecharacter hebrewTav {\uchar5{234}} % 05EA
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-vis.mkii b/tex/context/base/enco-vis.mkii
new file mode 100644
index 000000000..3c1fd7765
--- /dev/null
+++ b/tex/context/base/enco-vis.mkii
@@ -0,0 +1,3 @@
+% temporary module, needed for downward compatibility
+
+\input regi-vis.tex \enableregime[viscii] \endinput
diff --git a/tex/context/base/enco-vna.mkii b/tex/context/base/enco-vna.mkii
new file mode 100644
index 000000000..05753f37b
--- /dev/null
+++ b/tex/context/base/enco-vna.mkii
@@ -0,0 +1,145 @@
+%D \module
+%D [ file=enco-vna,
+%D version=1999.12.12,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Vietnamese Accents,
+%D author=Han The Thanh & Adam Lindsay & 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.
+
+%D This module is originally derived from the some files Han The Thanh
+%D prepared for \LATEX. The dual accent support is still preliminary,
+%D but works ok. It's now adapted to named glyphs, and is activated by
+%D \type {\useencoding[thisfile]}.
+
+%D This was apparently buggy from the start: there is nothing to
+%D disambiguate \type {\ohorn} from \type {\ohook}. Both are entered
+%D with \type {\h{o}} (AL)!
+
+%D Once stable, this code will move to \type {enco-acc.tex}.
+
+\startencoding[default]
+
+\defineaccent h A {\Ahook}
+\defineaccent d A {\Adotbelow}
+\defineaccent ` ^A {\Acircumflexgrave}
+\defineaccent ' ^A {\Acircumflexacute}
+\defineaccent ~ ^A {\Acircumflextilde}
+\defineaccent h ^A {\Acircumflexhook}
+\defineaccent d ^A {\Acircumflexdotbelow}
+\defineaccent ` uA {\Abrevegrave}
+\defineaccent ' uA {\Abreveacute}
+\defineaccent ~ uA {\Abrevetilde}
+\defineaccent h uA {\Abrevehook}
+\defineaccent d uA {\Abrevedotbelow}
+\defineaccent h E {\Ehook}
+\defineaccent d E {\Edotbelow}
+\defineaccent ` ^E {\Ecircumflexgrave}
+\defineaccent ' ^E {\Ecircumflexacute}
+\defineaccent ~ ^E {\Ecircumflextilde}
+\defineaccent h ^E {\Ecircumflexhook}
+\defineaccent d ^E {\Ecircumflexdotbelow}
+\defineaccent h I {\Ihook}
+\defineaccent d I {\Idotbelow}
+\defineaccent h O {\Ohook}
+\defineaccent d O {\Odotbelow}
+\defineaccent ` ^O {\Ocircumflexgrave}
+\defineaccent ' ^O {\Ocircumflexacute}
+\defineaccent ~ ^O {\Ocircumflextilde}
+\defineaccent h ^O {\Ocircumflexhook}
+\defineaccent d ^O {\Ocircumflexdotbelow}
+%defineaccent h O {\Ohorn} % !!! conflict with \Ohook!
+\defineaccent ` hO {\Ohorngrave}
+\defineaccent ` {\Ohorn} {\Ohorngrave}
+\defineaccent ' hO {\Ohornacute}
+\defineaccent ' {\Ohorn} {\Ohornacute}
+\defineaccent ~ hO {\Ohorntilde}
+\defineaccent ~ {\Ohorn} {\Ohorntilde}
+\defineaccent h hO {\Ohornhook}
+\defineaccent h {\Ohorn} {\Ohornhook}
+\defineaccent d hO {\Ohorndotbelow}
+\defineaccent d {\Ohorn} {\Ohorndotbelow}
+\defineaccent h U {\Uhook}
+\defineaccent d U {\Udotbelow}
+%defineaccent h U {\Uhorn} % !!! conflict with \Uhook! honestly, people!
+\defineaccent ` hU {\Uhorngrave}
+\defineaccent ` {\Uhorn} {\Uhorngrave}
+\defineaccent ' hU {\Uhornacute}
+\defineaccent ' {\Uhorn} {\Uhornacute}
+\defineaccent ~ hU {\Uhorntilde}
+\defineaccent ~ {\Uhorn} {\Uhorntilde}
+\defineaccent h hU {\Uhornhook}
+\defineaccent h {\Uhorn} {\Uhornhook}
+\defineaccent d hU {\Uhorndotbelow}
+\defineaccent d {\Uhorn} {\Uhorndotbelow}
+\defineaccent ` Y {\Ygrave}
+\defineaccent ' Y {\Yacute}
+\defineaccent ~ Y {\Ytilde}
+\defineaccent h Y {\Yhook}
+\defineaccent d Y {\Ydotbelow}
+\defineaccent h a {\ahook}
+\defineaccent d a {\adotbelow}
+\defineaccent ` ^a {\acircumflexgrave}
+\defineaccent ' ^a {\acircumflexacute}
+\defineaccent ~ ^a {\acircumflextilde}
+\defineaccent h ^a {\acircumflexhook}
+\defineaccent d ^a {\acircumflexdotbelow}
+\defineaccent ` ua {\abrevegrave}
+\defineaccent ' ua {\abreveacute}
+\defineaccent ~ ua {\abrevetilde}
+\defineaccent h ua {\abrevehook}
+\defineaccent d ua {\abrevedotbelow}
+\defineaccent h e {\ehook}
+\defineaccent d e {\edotbelow}
+\defineaccent ` ^e {\ecircumflexgrave}
+\defineaccent ' ^e {\ecircumflexacute}
+\defineaccent ~ ^e {\ecircumflextilde}
+\defineaccent h ^e {\ecircumflexhook}
+\defineaccent d ^e {\ecircumflexdotbelow}
+\defineaccent h i {\ihook}
+\defineaccent d i {\idotbelow}
+\defineaccent h o {\ohook}
+\defineaccent d o {\odotbelow}
+\defineaccent ^ o {\ocircumflex}
+\defineaccent ` ^o {\ocircumflexgrave}
+\defineaccent ' ^o {\ocircumflexacute}
+\defineaccent ~ ^o {\ocircumflextilde}
+\defineaccent h ^o {\ocircumflexhook}
+\defineaccent d ^o {\ocircumflexdotbelow}
+%defineaccent h o {\ohorn} % !!!
+\defineaccent ` ho {\ohorngrave}
+\defineaccent ' ho {\ohornacute}
+\defineaccent ~ ho {\ohorntilde}
+\defineaccent h ho {\ohornhook}
+\defineaccent d ho {\ohorndotbelow}
+\defineaccent ` {\ohorn} {\ohorngrave}
+\defineaccent ' {\ohorn} {\ohornacute}
+\defineaccent ~ {\ohorn} {\ohorntilde}
+\defineaccent h {\ohorn} {\ohornhook}
+\defineaccent d {\ohorn} {\ohorndotbelow}
+\defineaccent h u {\uhook}
+\defineaccent d u {\udotbelow}
+%defineaccent h u {\uhorn} % !!!
+\defineaccent ` hu {\uhorngrave}
+\defineaccent ' hu {\uhornacute}
+\defineaccent ~ hu {\uhorntilde}
+\defineaccent h hu {\uhornhook}
+\defineaccent d hu {\uhorndotbelow}
+\defineaccent ` {\uhorn} {\uhorngrave}
+\defineaccent ' {\uhorn} {\uhornacute}
+\defineaccent ~ {\uhorn} {\uhorntilde}
+\defineaccent h {\uhorn} {\uhornhook}
+\defineaccent d {\uhorn} {\uhorndotbelow}
+\defineaccent ` y {\ygrave}
+\defineaccent ' y {\yacute}
+\defineaccent ~ y {\ytilde}
+\defineaccent h y {\yhook}
+\defineaccent d y {\ydotbelow}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/enco-win.mkii b/tex/context/base/enco-win.mkii
new file mode 100644
index 000000000..826371d8a
--- /dev/null
+++ b/tex/context/base/enco-win.mkii
@@ -0,0 +1,7 @@
+% temporary module, needed for downward compatibility
+
+%\input regi-win.tex
+
+\enableregime[windows]
+
+\endinput
diff --git a/tex/context/base/enco-x5.mkii b/tex/context/base/enco-x5.mkii
new file mode 100644
index 000000000..f82ec6c5c
--- /dev/null
+++ b/tex/context/base/enco-x5.mkii
@@ -0,0 +1,218 @@
+%D \module
+%D [ file=enco-x5,
+%D version=1999.12.12,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Vietnamese Encoding,
+%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.
+
+%D This module is derived from the some files Han The Thanh
+%D prepared for \LATEX. The dual accent support is still
+%D preliminary, but works ok.
+
+\startencoding[x5]
+
+\definecharacter textgrave 0
+\definecharacter textacute 1
+\definecharacter textcircumflex 2
+\definecharacter texttilde 3
+\definecharacter textdiaeresis 4
+\definecharacter texthungarumlaut 5
+\definecharacter textring 6
+\definecharacter textcaron 7
+\definecharacter textbreve 8
+\definecharacter textmacron 9
+\definecharacter textdotaccent 10
+\definecharacter textcedilla 11
+\definecharacter textogonek 12
+
+\definecharacter dotlessi 25
+\definecharacter DJ 30
+\definecharacter dj 31
+
+\defineaccent ` A 128
+\defineaccent ' A 129
+\defineaccent ~ A 130
+\defineaccent h A 131
+\defineaccent d A 132
+\defineaccent ^ A 133
+\defineaccent ` ^A 134
+\defineaccent ' ^A 135
+\defineaccent ~ ^A 136
+\defineaccent h ^A 137
+\defineaccent d ^A 138
+\defineaccent u A 139
+\defineaccent ` uA 140
+\defineaccent ' uA 141
+\defineaccent ~ uA 142
+\defineaccent h uA 143
+\defineaccent d uA 144
+\defineaccent ` E 145
+\defineaccent ' E 146
+\defineaccent ~ E 147
+\defineaccent h E 148
+\defineaccent d E 149
+\defineaccent ^ E 150
+\defineaccent ` ^E 151
+\defineaccent ' ^E 152
+\defineaccent ~ ^E 153
+\defineaccent h ^E 154
+\defineaccent d ^E 155
+\defineaccent ` I 156
+\defineaccent ' I 157
+\defineaccent ~ I 158
+\defineaccent h I 159
+\defineaccent d I 192
+\defineaccent ` O 193
+\defineaccent ' O 194
+\defineaccent ~ O 195
+\defineaccent h O 196
+\defineaccent d O 197
+\defineaccent ^ O 198
+\defineaccent ` ^O 199
+\defineaccent ' ^O 200
+\defineaccent ~ ^O 201
+\defineaccent h ^O 202
+\defineaccent d ^O 203
+\defineaccent h O 204
+\defineaccent ` hO 205
+\defineaccent ' hO 206
+\defineaccent ~ hO 207
+\defineaccent h hO 208
+\defineaccent d hO 209
+\defineaccent ` U 210
+\defineaccent ' U 211
+\defineaccent ~ U 212
+\defineaccent h U 213
+\defineaccent d U 214
+\defineaccent h U 215
+\defineaccent ` hU 216
+\defineaccent ' hU 217
+\defineaccent ~ hU 218
+\defineaccent h hU 219
+\defineaccent d hU 220
+\defineaccent ` Y 221
+\defineaccent ' Y 222
+\defineaccent ~ Y 223
+\defineaccent h Y 26
+\defineaccent d Y 28
+\defineaccent ` a 160
+\defineaccent ' a 161
+\defineaccent ~ a 162
+\defineaccent h a 163
+\defineaccent d a 164
+\defineaccent ^ a 165
+\defineaccent ` ^a 166
+\defineaccent ' ^a 167
+\defineaccent ~ ^a 168
+\defineaccent h ^a 169
+\defineaccent d ^a 170
+\defineaccent u a 171
+\defineaccent ` ua 172
+\defineaccent ' ua 173
+\defineaccent ~ ua 174
+\defineaccent h ua 175
+\defineaccent d ua 176
+\defineaccent ` e 177
+\defineaccent ' e 178
+\defineaccent ~ e 179
+\defineaccent h e 180
+\defineaccent d e 181
+\defineaccent ^ e 182
+\defineaccent ` ^e 183
+\defineaccent ' ^e 184
+\defineaccent ~ ^e 185
+\defineaccent h ^e 186
+\defineaccent d ^e 187
+\defineaccent ` i 188
+\defineaccent ' i 189
+\defineaccent ~ i 190
+\defineaccent h i 191
+\defineaccent d i 224
+\defineaccent ` o 225
+\defineaccent ' o 226
+\defineaccent ~ o 227
+\defineaccent h o 228
+\defineaccent d o 229
+\defineaccent ^ o 230
+\defineaccent ` ^o 231
+\defineaccent ' ^o 232
+\defineaccent ~ ^o 233
+\defineaccent h ^o 234
+\defineaccent d ^o 235
+\defineaccent h o 236
+\defineaccent ` ho 237
+\defineaccent ' ho 238
+\defineaccent ~ ho 239
+\defineaccent h ho 240
+\defineaccent d ho 241
+\defineaccent ` u 242
+\defineaccent ' u 243
+\defineaccent ~ u 244
+\defineaccent h u 245
+\defineaccent d u 246
+\defineaccent h u 247
+\defineaccent ` hu 248
+\defineaccent ' hu 249
+\defineaccent ~ hu 250
+\defineaccent h hu 251
+\defineaccent d hu 252
+\defineaccent ` y 253
+\defineaccent ' y 254
+\defineaccent ~ y 255
+\defineaccent h y 27
+\defineaccent d y 29
+
+\stopencoding
+
+\endinput
+
+% \startencoding [x5]
+%
+% \definecharacter aa {\xfiveencodedaa}
+% \definecharacter AA {\xfiveencodedAA}
+%
+% \stopencoding
+%
+% \def\xfiveencodedaa%
+% {\accent23a}
+%
+% \def\xfiveencodedAA%
+% {\leavevmode
+% \setbox\zerocount\hbox{h}%
+% \dimen@\ht\zerocount
+% \advance\dimen@ -1ex
+% \rlap{\raise.67\dimen@\hbox{\char23}}A}
+
+% \quotesinglbase 13
+% \guilsinglleft 14
+% \guilsinglright 15
+% \textquotedblleft 16
+% \textquotedblright 17
+% \quotedblbase 18
+% \guillemotleft 19
+% \guillemotright 20
+% \textendash 21
+% \textemdash 22
+% \textcompwordmark 23
+% \textperthousand \% \char 24
+% \textpertenthousand \%\char 24\char 24
+% \textvisiblespace 32
+% \textquotedbl `\"
+% \textdollar `\$
+% \textquoteright `\'
+% \textless `\<
+% \textgreater `\>
+% \textbackslash `\
+% \textasciicircum `\^
+% \textunderscore 95
+% \textquoteleft `\`
+% \textbraceleft `\{
+% \textbar `\|
+% \textbraceright `\}
+% \textasciitilde `\~
diff --git a/tex/context/base/filt-bas.mkii b/tex/context/base/filt-bas.mkii
new file mode 100644
index 000000000..ca3bc3d70
--- /dev/null
+++ b/tex/context/base/filt-bas.mkii
@@ -0,0 +1,63 @@
+%D \module
+%D [ file=filt-bas,
+%D version=2000.09.19,
+%D title=\CONTEXT\ Filter Macros,
+%D subtitle=A Base Collection,
+%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.
+
+% BEWARE: THIS IS A TEST MODULE, NAMES MAY CHANGE!
+
+\definefiltersynonym [utf8 to unicode16] [inutf8]
+
+\definefiltersynonym [persian fix] [FarsiToArabic]
+\definefiltersynonym [arabic analysis] [uni2cuni]
+\definefiltersynonym [arabic glyphs] [cuni2oar]
+
+\definefiltersequence
+ [farsi]
+ [utf8 to unicode16,
+ persian fix,
+ arabic analysis,
+ arabic glyphs]
+
+\definefiltersynonym [basic context analysis step1] [bcaa-1]
+\definefiltersynonym [basic context analysis step2] [bcaa-2]
+\definefiltersynonym [basic context analysis step3] [bcaa-3]
+\definefiltersynonym [farsi processing for uomarab] [uomarab-farsi]
+
+\definefiltersynonym [basic presentation forms to sf] [bpftosf]
+
+\definefiltersynonym [omega persian fix] [FarsiToArabic]
+\definefiltersynonym [omega arabic analysis] [uni2cuni]
+\definefiltersynonym [omega arabic glyphs] [cuni2oar]
+
+\definefiltersequence
+ [farsi-1]
+ [utf8 to unicode16,
+ omega persian fix,
+ omega arabic analysis,
+ omega arabic glyphs]
+
+\definefiltersequence
+ [farsi-2]
+ [utf8 to unicode16,
+ basic context analysis step1,
+ basic context analysis step2,
+ basic context analysis step3,
+ farsi processing for uomarab]
+
+\definefiltersequence
+ [farsi-3]
+ [utf8 to unicode16,
+ basic context analysis step1,
+ basic context analysis step2,
+ basic context analysis step3,
+ basic presentation forms to sf]
+
+\endinput
diff --git a/tex/context/base/filt-ini.mkii b/tex/context/base/filt-ini.mkii
new file mode 100644
index 000000000..6e1a16e9a
--- /dev/null
+++ b/tex/context/base/filt-ini.mkii
@@ -0,0 +1,121 @@
+%D \module
+%D [ file=filt-ini,
+%D version=2000.09.19,
+%D title=\CONTEXT\ Filter 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 Filter Macros / Initialization}
+
+% \ifx\OmegaVersion\undefined
+
+% \let\definefiltersynonym \gobbledoubleempty
+% \let\definefiltersequence \gobbledoubleempty
+% \unexpanded\def\usefiltersequence {\gobblesingleempty}
+% \let\usefilter \gobblesingleempty
+% \let\truefiltername \gobbleoneargument
+
+% \expandafter \endinput
+% \fi
+
+\unprotect
+
+%D The real work starts here.
+
+% We need the {\??ot::#1} check because otherwise aleph will crash. Taco's
+% torture test:
+%
+% \ocp\ArabicContext = contextual
+%
+% \dorecurse {5000} {
+% \message{[\recurselevel]}
+% \ocplist\Arabic=\addbeforeocplist 1 \ArabicContext \nullocplist
+% }
+
+%D \macros
+%D {definefiltersynonym}
+
+\def\definefiltersynonym
+ {\dodoubleargument\dodefinefiltersynonym}
+
+\def\dodefinefiltersynonym[#1][#2]%
+ {\setvalue{\??or#1}{#2}}
+
+%D \macros
+%D {truefiltername}
+
+\def\truefiltername#1%
+ {\ifundefined{\??or#1}#1\else\truefiltername{\getvalue{\??or#1}}\fi}
+
+%D \macros
+%D {definefiltersequence}
+
+\def\definefiltersequence
+ {\dodoubleargument\dodefinefiltersequence}
+
+% \def\dodefinefiltersequence[#1][#2]%
+% {\setvalue{\??ot#1}{#2}}
+
+\def\dodefinefiltersequence[#1][#2]%
+ {\setxvalue{\??ot#1}{#2}%
+ \letgvalue{\??ot::#1}\v!stop}
+
+%D \macros
+%D {usefiltersequence}
+%D
+
+\def\magicocpnumber{1}
+
+% one can do:
+%
+% \definefiltersequence
+% [farsi]
+% [utf8 to unicode16=>5,
+% persian fix,
+% arabic analysis=>3,
+% arabic glyphs]
+%
+% so, => is used to signal a priority
+
+\def\dodousefiltersequence#1%
+ {\expandafter\ocp\csname\??or:#1\endcsname=\truefiltername{#1}\relax
+ \splitstring#1\at=>\to\!!stringa\and\!!stringb
+ \edef\!!stringb{\number\ifx\!!stringb\empty\magicocpnumber\else\!!stringb\fi}%
+ \appendetoks
+ \noexpand\addbeforeocplist
+ \!!stringb\space
+ \expandafter\noexpand\csname\??or:\!!stringa\endcsname
+ \to \scratchtoks}
+
+\unexpanded\def\usefiltersequence[#1]%
+ {\doifdefined{\??ot::#1}%
+ {\doifvalue{\??ot::#1}\v!stop
+ {\scratchtoks\emptytoks
+ \expanded{\processcommalist[\getvalue{\??ot#1}]}\dodousefiltersequence
+ \expanded{\global\ocplist\csname\??ot:#1\endcsname=\the\scratchtoks}\nullocplist
+ \letgvalue{\??ot::#1}\v!start}%
+ \expanded{\pushocplist\csname\??ot:#1\endcsname}\relax}}
+
+%D \macros
+%D {usefilter}
+
+\def\dousefilter#1%
+ {\doifundefined{\c!file\f!filterprefix#1}%
+ {\letvalue{\c!file\f!filterprefix#1}\empty
+ \makeshortfilename[\truefilename{\f!filterprefix#1}]%
+ \startreadingfile
+ \readsysfile{\shortfilename.mkii}
+ {\showmessage\m!filters1{#1}}
+ {\showmessage\m!filters2{#1}}%
+ \stopreadingfile}}
+
+\def\usefilter[#1]%
+ {\processcommalist[#1]\dousefilter}
+
+\protect \endinput
diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua
new file mode 100644
index 000000000..87dec59c6
--- /dev/null
+++ b/tex/context/base/font-afm.lua
@@ -0,0 +1,855 @@
+if not modules then modules = { } end modules ['font-afm'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Some code may look a bit obscure but this has to do with the
+fact that we also use this code for testing and much code evolved
+in the transition from <l n='tfm'/> to <l n='afm'/> to <l
+n='otf'/>.</p>
+
+<p>The following code still has traces of intermediate font support
+where we handles font encodings. Eventually font encoding goes
+away.</p>
+--ldx]]--
+
+local trace_features = false trackers.register("afm.features", function(v) trace_features = v end)
+local trace_indexing = false trackers.register("afm.indexing", function(v) trace_indexing = v end)
+local trace_loading = false trackers.register("afm.loading", function(v) trace_loading = v end)
+
+local format, match, gmatch, lower, gsub = string.format, string.match, string.gmatch, string.lower, string.gsub
+local lpegmatch = lpeg.match
+local abs = math.abs
+
+fonts = fonts or { }
+fonts.afm = fonts.afm or { }
+
+local afm = fonts.afm
+local tfm = fonts.tfm
+
+afm.version = 1.402 -- 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.features = { }
+afm.features.aux = { }
+afm.features.data = { }
+afm.features.list = { }
+afm.features.default = { }
+afm.cache = containers.define("fonts", "afm", afm.version, true)
+
+--[[ldx--
+<p>We start with the basic reader which we give a name similar to the
+built in <l n='tfm'/> and <l n='otf'/> reader.</p>
+--ldx]]--
+
+--~ Comment FONTIDENTIFIER LMMATHSYMBOLS10
+--~ Comment CODINGSCHEME TEX MATH SYMBOLS
+--~ Comment DESIGNSIZE 10.0 pt
+--~ Comment CHECKSUM O 4261307036
+--~ Comment SPACE 0 plus 0 minus 0
+--~ Comment QUAD 1000
+--~ Comment EXTRASPACE 0
+--~ Comment NUM 676.508 393.732 443.731
+--~ Comment DENOM 685.951 344.841
+--~ Comment SUP 412.892 362.892 288.889
+--~ Comment SUB 150 247.217
+--~ Comment SUPDROP 386.108
+--~ Comment SUBDROP 50
+--~ Comment DELIM 2390 1010
+--~ Comment AXISHEIGHT 250
+
+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 = { }
+ lpegmatch(pattern,str)
+ return fd
+end
+
+-- On a rainy day I will rewrite this in lpeg ...
+
+local keys = { }
+
+function keys.FontName (data,line) data.metadata.fullname = line:strip() end
+function keys.ItalicAngle (data,line) data.metadata.italicangle = tonumber (line) end
+function keys.IsFixedPitch(data,line) data.metadata.isfixedpitch = toboolean(line,true) end
+function keys.CharWidth (data,line) data.metadata.charwidth = tonumber (line) end
+function keys.XHeight (data,line) data.metadata.xheight = tonumber (line) end
+function keys.Descender (data,line) data.metadata.descender = tonumber (line) end
+function keys.Ascender (data,line) data.metadata.ascender = tonumber (line) end
+function keys.Comment (data,line)
+ -- Comment DesignSize 12 (pts)
+ -- Comment TFM designsize: 12 (in points)
+ line = lower(line)
+ local designsize = match(line,"designsize[^%d]*(%d+)")
+ if designsize then data.metadata.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 gmatch(charmetrics,"([%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 = match(v,"^ *(.-) +(.-) +(.-) +(.-)$")
+ chr.boundingbox = { tonumber(llx), tonumber(lly), tonumber(urx), tonumber(ury) }
+ elseif k == 'L' then
+ local plus, becomes = match(v,"^(.-) +(.-)$")
+ if not chr.ligatures then chr.ligatures = { } end
+ chr.ligatures[plus] = becomes
+ 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 gmatch(kernpairs,"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 gmatch(fontmetrics,"(%a+) *(.-)[\n\r]") do
+ if keys[key] then keys[key](data,rest) end
+ end
+end
+
+local function get_indexes(data,filename)
+ local pfbfile = file.replacesuffix(filename,"pfb")
+ local pfbname = resolvers.find_file(pfbfile,"pfb") or ""
+ if pfbname == "" then
+ pfbname = resolvers.find_file(file.basename(pfbfile),"pfb") or ""
+ end
+ if pfbname ~= "" then
+ data.luatex.filename = pfbname
+ local pfbblob = fontloader.open(pfbname)
+ if pfbblob then
+ local characters = data.characters
+ local pfbdata = fontloader.to_table(pfbblob)
+ --~ print(table.serialize(pfbdata))
+ if pfbdata then
+ local glyphs = pfbdata.glyphs
+ if glyphs then
+ if trace_loading 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 next, glyphs do
+ local name = glyph.name
+ if name then
+ local char = characters[name]
+ if char then
+ if trace_indexing then
+ logs.report("load afm","glyph %s has index %s",name,index)
+ end
+ char.index = index
+ end
+ end
+ end
+ elseif trace_loading then
+ logs.report("load afm","no glyph data in pfb file %s",pfbname)
+ end
+ elseif trace_loading then
+ logs.report("load afm","no data in pfb file %s",pfbname)
+ end
+ fontloader.close(pfbblob)
+ elseif trace_loading then
+ logs.report("load afm","invalid pfb file %s",pfbname)
+ end
+ elseif trace_loading then
+ logs.report("load afm","no pfb file for %s",filename)
+ end
+end
+
+function afm.read_afm(filename)
+ local ok, afmblob, size = resolvers.loadbinfile(filename) -- has logging
+-- local ok, afmblob = true, file.readdata(filename)
+ if ok and afmblob then
+ local data = {
+ characters = { },
+ metadata = {
+ version = version or '0', -- hm
+ filename = file.removesuffix(file.basename(filename))
+ }
+ }
+ afmblob = gsub(afmblob,"StartCharMetrics(.-)EndCharMetrics", function(charmetrics)
+ if trace_loading then
+ logs.report("load afm","loading char metrics")
+ end
+ get_charmetrics(data,charmetrics,vector)
+ return ""
+ end)
+ afmblob = gsub(afmblob,"StartKernPairs(.-)EndKernPairs", function(kernpairs)
+ if trace_loading then
+ logs.report("load afm","loading kern pairs")
+ end
+ get_kernpairs(data,kernpairs)
+ return ""
+ end)
+ afmblob = gsub(afmblob,"StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics)
+ if trace_loading 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)
+ data.luatex = { }
+ get_indexes(data,filename)
+ return data
+ else
+ if trace_loading then
+ logs.report("load afm","no valid afm file %s",filename)
+ end
+ return nil
+ end
+end
+
+--[[ldx--
+<p>We cache files. Caching is taken care of in the loader. We cheat a bit
+by adding ligatures and kern information to the afm derived data. That
+way we can set them faster when defining a font.</p>
+--ldx]]--
+
+function afm.load(filename)
+ -- hm, for some reasons not resolved yet
+ filename = resolvers.find_file(filename,'afm') or ""
+ if filename ~= "" then
+ local name = file.removesuffix(file.basename(filename))
+ local data = containers.read(afm.cache(),name)
+ local size = lfs.attributes(filename,"size") or 0
+ if not data or data.verbose ~= fonts.verbose or data.size ~= size then
+ logs.report("load afm", "reading %s",filename)
+ data = afm.read_afm(filename)
+ if data then
+ -- data.luatex = data.luatex or { }
+ logs.report("load afm", "unifying %s",filename)
+ afm.unify(data,filename)
+ if afm.enhance_data then
+ logs.report("load afm", "add ligatures")
+ afm.add_ligatures(data,'ligatures') -- easier this way
+ logs.report("load afm", "add tex-ligatures")
+ afm.add_ligatures(data,'texligatures') -- easier this way
+ logs.report("load afm", "add extra kerns")
+ afm.add_kerns(data) -- faster this way
+ end
+ logs.report("load afm", "add tounicode data")
+ fonts.map.add_to_unicode(data,filename)
+ data.size = size
+ data.verbose = fonts.verbose
+ logs.report("load afm","saving: %s in cache",name)
+ data = containers.write(afm.cache(), name, data)
+ data = containers.read(afm.cache(),name)
+ end
+ end
+ return data
+ else
+ return nil
+ end
+end
+
+function afm.unify(data, filename)
+ local unicodevector = fonts.enc.load('unicode').hash
+ local glyphs, indices, unicodes, names = { }, { }, { }, { }
+ local verbose, private = fonts.verbose, fonts.private
+ for name, blob in next, data.characters do
+ local code = unicodevector[name] -- or characters.name_to_unicode[name]
+ if not code then
+ local u = match(name,"^uni(%x+)$")
+ code = u and tonumber(u,16)
+ if not code then
+ code = private
+ private = private + 1
+ logs.report("afm glyph", "assigning private slot U+%04X for unknown glyph name %s", code, name)
+ end
+ end
+ 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.glyphs = glyphs
+ data.characters = nil
+ local luatex = data.luatex
+ luatex.filename = luatex.filename or file.removesuffix(file.basename(filename))
+ luatex.unicodes = unicodes -- name to unicode
+ luatex.indices = indices -- unicode to index
+ luatex.marks = { } -- todo
+ luatex.names = names -- name to index
+ luatex.private = private
+end
+
+--[[ldx--
+<p>These helpers extend the basic table with extra ligatures, texligatures
+and extra kerns. This saves quite some lookups later.</p>
+--ldx]]--
+
+function afm.add_ligatures(afmdata,ligatures)
+ local glyphs, luatex = afmdata.glyphs, afmdata.luatex
+ local indices, unicodes, names = luatex.indices, luatex.unicodes, luatex.names
+ for k,v in next, characters[ligatures] do -- main characters table
+ local one = glyphs[names[k]]
+ if one then
+ for _, b in next, v do
+ two, three = b[1], b[2]
+ 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
+ ol[two] = three
+ end
+ else
+ one[ligatures] = { [two] = three }
+ end
+ end
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>We keep the extra kerns in separate kerning tables so that we can use
+them selectively.</p>
+--ldx]]--
+
+function afm.add_kerns(afmdata)
+ local glyphs = afmdata.glyphs
+ local names = afmdata.luatex.names
+ local uncomposed = characters.uncomposed
+ local function do_it_left(what)
+ for index, glyph in next, glyphs do
+ local kerns = glyph.kerns
+ if kerns then
+ local extrakerns = glyph.extrakerns or { }
+ for complex, simple in next, uncomposed[what] do
+ if names[compex] then
+ local ks = kerns[simple]
+ if ks and not kerns[complex] then
+ extrakerns[complex] = ks
+ end
+ end
+ end
+ if next(extrakerns) then
+ glyph.extrakerns = extrakerns
+ end
+ end
+ end
+ end
+ local function do_it_copy(what)
+ for complex, simple in next, uncomposed[what] do
+ local c = glyphs[names[complex]]
+ if c then -- optional
+ local s = glyphs[names[simple]]
+ if s then
+ if not c.kerns then
+ c.extrakerns = s.kerns or { }
+ end
+ if s.extrakerns then
+ local extrakerns = c.extrakerns or { }
+ for k, v in next, s.extrakerns do
+ extrakerns[k] = v
+ end
+ if next(extrakerns) then
+ s.extrakerns = extrakerns
+ end
+ end
+ 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
+
+--[[ldx--
+<p>The copying routine looks messy (and is indeed a bit messy).</p>
+--ldx]]--
+
+-- once we have otf sorted out (new format) we can try to make the afm
+-- cache similar to it (similar tables)
+
+function afm.add_dimensions(data) -- we need to normalize afm to otf i.e. indexed table instead of name
+ if data then
+ for index, glyph in next, data.glyphs do
+ local bb = glyph.boundingbox
+ if bb then
+ local ht, dp = bb[4], -bb[2]
+ if ht == 0 or ht < 0 then
+ -- no need to set it and no negative heights, nil == 0
+ else
+ glyph.height = ht
+ end
+ if dp == 0 or dp < 0 then
+ -- no negative depths and no negative depths, nil == 0
+ else
+ glyph.depth = dp
+ end
+ end
+ end
+ end
+end
+
+fonts.formats.afm = "type1"
+fonts.formats.pfb = "type1"
+
+function afm.copy_to_tfm(data)
+ if data then
+ local glyphs = data.glyphs
+ if glyphs then
+ local metadata, luatex = data.metadata, data.luatex
+ local unicodes, indices = luatex.unicodes, luatex.indices
+ local characters, parameters, descriptions = { }, { }, { }
+ -- todo : merge into tfm
+ for u, i in next, indices do
+ local d = glyphs[i]
+ characters[u] = { }
+ descriptions[u] = d
+ end
+ local filename = fonts.tfm.checked_filename(luatex) -- was metadata.filename
+ local fontname = metadata.fontname or metadata.fullname
+ local fullname = metadata.fullname or metadata.fontname
+ local endash, emdash, space, spaceunits = unicodes['space'], unicodes['emdash'], "space", 500
+ -- same as otf
+ if metadata.isfixedpitch then
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, spacer = descriptions[emdash].width, "emdash"
+ end
+ if not spaceunits and metadata.charwidth then
+ spaceunits, spacer = metadata.charwidth, "charwidth"
+ end
+ else
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
+ end
+ if not spaceunits and metadata.charwidth then
+ spaceunits, spacer = metadata.charwidth, "charwidth"
+ end
+ end
+ spaceunits = tonumber(spaceunits)
+ if spaceunits < 200 then
+ -- todo: warning
+ end
+ --
+ parameters.slant = 0
+ parameters.space = spaceunits
+ parameters.space_stretch = 500
+ parameters.space_shrink = 333
+ parameters.x_height = 400
+ parameters.quad = 1000
+ local italicangle = data.metadata.italicangle
+ if italicangle then
+ parameters.slant = parameters.slant - math.round(math.tan(italicangle*math.pi/180))
+ end
+ if metadata.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
+ parameters.extra_space = parameters.space_shrink
+ if metadata.xheight and metadata.xheight > 0 then
+ parameters.x_height = metadata.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 next, fd do
+ parameters[k] = v
+ end
+ end
+ --
+ if next(characters) then
+ return {
+ characters = characters,
+ parameters = parameters,
+ descriptions = descriptions,
+ indices = indices,
+ unicodes = unicodes,
+ luatex = luatex,
+ encodingbytes = 2,
+ filename = filename,
+ fontname = fontname,
+ fullname = fullname,
+ psname = fullname, -- in otf: tfm.fontname or tfm.fullname
+ name = filename or fullname or fontname,
+ format = fonts.fontformat(filename,"type1"),
+ type = 'real',
+ units = 1000,
+ direction = 0,
+ boundarychar_label = 0,
+ boundarychar = 65536,
+ --~ false_boundarychar = 65536, -- produces invalid tfm in luatex
+ designsize = (metadata.designsize or 10)*65536,
+ spacer = spacer,
+ ascender = abs(metadata.ascender or 0),
+ descender = abs(metadata.descender or 0),
+ italicangle = italicangle,
+ }
+ end
+ end
+ end
+ return nil
+end
+
+--[[ldx--
+<p>Originally we had features kind of hard coded for <l n='afm'/>
+files but since I expect to support more font formats, I decided
+to treat this fontformat like any other and handle features in a
+more configurable way.</p>
+--ldx]]--
+
+function afm.features.register(name,default)
+ afm.features.list[#afm.features.list+1] = name
+ afm.features.default[name] = default
+end
+
+function afm.set_features(tfmdata)
+ local shared = tfmdata.shared
+ local afmdata = shared.afmdata
+ local features = shared.features
+ if features and next(features) then
+ local mode = tfmdata.mode or fonts.mode
+ local initializers = fonts.initializers
+ local fi = initializers[mode]
+ local fiafm = fi and fi.afm
+ if fiafm then
+ local lists = {
+ fonts.triggers,
+ afm.features.list,
+ fonts.manipulators,
+ }
+ for l=1,3 do
+ local list = lists[l]
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ local value = features[f]
+ if value and fiafm[f] then -- brr
+ if trace_features then
+ logs.report("define afm","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown')
+ end
+ fiafm[f](tfmdata,value)
+ mode = tfmdata.mode or fonts.mode
+ fiafm = initializers[mode].afm
+ end
+ end
+ end
+ end
+ end
+ local fm = fonts.methods[mode]
+ local fmafm = fm and fm.afm
+ if fmfm then
+ local lists = {
+ afm.features.list,
+ }
+ local sp = shared.processors
+ for l=1,1 do
+ local list = lists[l]
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ if features[f] and fmafm[f] then -- brr
+ if not sp then
+ sp = { fmafm[f] }
+ shared.processors = sp
+ else
+ sp[#sp+1] = fmafm[f]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function afm.check_features(specification)
+ local features, done = fonts.define.check(specification.features.normal,afm.features.default)
+ if done then
+ specification.features.normal = features
+ tfm.hash_instance(specification,true)
+ end
+end
+
+function afm.afm_to_tfm(specification)
+ local afmname = specification.filename or specification.name
+ if specification.forced == "afm" or specification.format == "afm" then -- move this one up
+ if trace_loading then
+ logs.report("load afm","forcing afm format for %s",afmname)
+ end
+ else
+ local tfmname = resolvers.findbinfile(afmname,"ofm") or ""
+ if tfmname ~= "" then
+ if trace_loading then
+ logs.report("load afm","fallback from afm to tfm for %s",afmname)
+ end
+ afmname = ""
+ end
+ end
+ if afmname == "" then
+ return nil
+ else
+ afm.check_features(specification)
+ specification = fonts.define.resolve(specification) -- new, was forgotten
+ local features = specification.features.normal
+ local cache_id = specification.hash
+ local tfmdata = containers.read(tfm.cache(), cache_id) -- cache with features applied
+ if not tfmdata then
+ local afmdata = afm.load(afmname)
+ if afmdata and next(afmdata) then
+ afm.add_dimensions(afmdata)
+ tfmdata = afm.copy_to_tfm(afmdata)
+ if tfmdata and next(tfmdata) then
+ tfmdata.shared = tfmdata.shared or { }
+ tfmdata.unique = tfmdata.unique or { }
+ tfmdata.shared.afmdata = afmdata
+ tfmdata.shared.features = features
+ afm.set_features(tfmdata)
+ end
+ elseif trace_loading then
+ logs.report("load afm","no (valid) afm file found with name %s",afmname)
+ end
+ tfmdata = containers.write(tfm.cache(),cache_id,tfmdata)
+ end
+ return tfmdata
+ end
+end
+
+--[[ldx--
+<p>As soon as we could intercept the <l n='tfm'/> reader, I implemented an
+<l n='afm'/> reader. Since traditional <l n='pdftex'/> could use <l n='opentype'/>
+fonts with <l n='afm'/> companions, the following method also could handle
+those cases, but now that we can handle <l n='opentype'/> directly we no longer
+need this features.</p>
+--ldx]]--
+
+tfm.default_encoding = 'unicode'
+
+function tfm.set_normal_feature(specification,name,value)
+ if specification and name then
+ specification.features = specification.features or { }
+ specification.features.normal = specification.features.normal or { }
+ specification.features.normal[name] = value
+ end
+end
+
+function tfm.read_from_afm(specification)
+ local tfmtable = afm.afm_to_tfm(specification)
+ if tfmtable then
+ tfmtable.name = specification.name
+ tfmtable = tfm.scale(tfmtable, specification.size, specification.relativeid)
+ local afmdata = tfmtable.shared.afmdata
+--~ local filename = afmdata and afmdata.luatex and afmdata.luatex.filename
+--~ if filename then
+--~ tfmtable.encodingbytes = 2
+--~ tfmtable.filename = resolvers.findbinfile(filename,"") or filename
+--~ tfmtable.fontname = afmdata.metadata.fontname or afmdata.metadata.fullname
+--~ tfmtable.fullname = afmdata.metadata.fullname or afmdata.metadata.fontname
+--~ tfmtable.format = 'type1'
+--~ tfmtable.name = afmdata.luatex.filename or tfmtable.fullname
+--~ end
+ if fonts.dontembed[filename] then
+ tfmtable.file = nil -- or filename ?
+ end
+ fonts.logger.save(tfmtable,'afm',specification)
+ end
+ return tfmtable
+end
+
+--[[ldx--
+<p>Here comes the implementation of a few features. We only implement
+those that make sense for this format.</p>
+--ldx]]--
+
+function afm.features.prepare_ligatures(tfmdata,ligatures,value)
+ if value then
+ local afmdata = tfmdata.shared.afmdata
+ local luatex = afmdata.luatex
+ local unicodes = luatex.unicodes
+ local descriptions = tfmdata.descriptions
+ for u, chr in next, 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 next, l do
+ local uk, uv = unicodes[k], unicodes[v]
+ if uk and uv then
+ ligatures[uk] = {
+ char = uv,
+ type = 0
+ }
+ end
+ end
+ end
+ end
+ end
+end
+
+function afm.features.prepare_kerns(tfmdata,kerns,value)
+ if value then
+ local afmdata = tfmdata.shared.afmdata
+ local luatex = afmdata.luatex
+ local unicodes = luatex.unicodes
+ local descriptions = tfmdata.descriptions
+ for u, chr in next, tfmdata.characters do
+ local d = descriptions[u]
+ local newkerns = d[kerns]
+ if newkerns then
+ local kerns = chr.kerns
+ if not kerns then
+ kerns = { }
+ chr.kerns = kerns
+ end
+ for k,v in next, newkerns do
+ local uk = unicodes[k]
+ if uk then
+ kerns[uk] = v
+ end
+ end
+ end
+ end
+ end
+end
+
+-- hm, register?
+
+function fonts.initializers.base.afm.ligatures (tfmdata,value) afm.features.prepare_ligatures(tfmdata,'ligatures', value) end
+function fonts.initializers.base.afm.texligatures(tfmdata,value) afm.features.prepare_ligatures(tfmdata,'texligatures',value) end
+function fonts.initializers.base.afm.kerns (tfmdata,value) afm.features.prepare_kerns (tfmdata,'kerns', value) end
+function fonts.initializers.base.afm.extrakerns (tfmdata,value) afm.features.prepare_kerns (tfmdata,'extrakerns', value) end
+
+afm.features.register('liga',true)
+afm.features.register('kerns',true)
+afm.features.register('extrakerns') -- needed?
+
+fonts.initializers.node.afm.ligatures = fonts.initializers.base.afm.ligatures
+fonts.initializers.node.afm.texligatures = fonts.initializers.base.afm.texligatures
+fonts.initializers.node.afm.kerns = fonts.initializers.base.afm.kerns
+fonts.initializers.node.afm.extrakerns = fonts.initializers.base.afm.extrakerns
+
+fonts.initializers.base.afm.liga = fonts.initializers.base.afm.ligatures
+fonts.initializers.node.afm.liga = fonts.initializers.base.afm.ligatures
+fonts.initializers.base.afm.tlig = fonts.initializers.base.afm.texligatures
+fonts.initializers.node.afm.tlig = fonts.initializers.base.afm.texligatures
+
+fonts.initializers.base.afm.trep = tfm.replacements
+fonts.initializers.node.afm.trep = tfm.replacements
+
+afm.features.register('tlig',true) -- todo: also proper features for afm
+afm.features.register('trep',true) -- todo: also proper features for afm
+
+-- tfm features
+
+fonts.initializers.base.afm.equaldigits = fonts.initializers.common.equaldigits
+fonts.initializers.node.afm.equaldigits = fonts.initializers.common.equaldigits
+fonts.initializers.base.afm.lineheight = fonts.initializers.common.lineheight
+fonts.initializers.node.afm.lineheight = fonts.initializers.common.lineheight
+
+-- vf features
+
+fonts.initializers.base.afm.compose = fonts.initializers.common.compose
+fonts.initializers.node.afm.compose = fonts.initializers.common.compose
+
+-- afm specific, encodings ...kind of obsolete
+
+afm.features.register('encoding')
+
+fonts.initializers.base.afm.encoding = fonts.initializers.common.encoding
+fonts.initializers.node.afm.encoding = fonts.initializers.common.encoding
+
+-- todo: oldstyle smallcaps as features for afm files (use with care)
+
+fonts.initializers.base.afm.onum = fonts.initializers.common.oldstyle
+fonts.initializers.base.afm.smcp = fonts.initializers.common.smallcaps
+fonts.initializers.base.afm.fkcp = fonts.initializers.common.fakecaps
+
+afm.features.register('onum',false)
+afm.features.register('smcp',false)
+afm.features.register('fkcp',false)
+
diff --git a/tex/context/base/font-agl.lua b/tex/context/base/font-agl.lua
new file mode 100644
index 000000000..8a087b123
--- /dev/null
+++ b/tex/context/base/font-agl.lua
@@ -0,0 +1,3695 @@
+if not modules then modules = { } end modules ['font-map'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt",
+ comment = "Adobe Glyph List, version 2.0, September 20, 2002",
+}
+
+fonts = fonts or { }
+fonts.map = fonts.map or { }
+
+fonts.map.unicode_to_agl = {
+ "controlSTX",
+ "controlSOT",
+ "controlETX",
+ "controlEOT",
+ "controlENQ",
+ "controlACK",
+ "controlBEL",
+ "controlBS",
+ "controlHT",
+ "controlLF",
+ "controlVT",
+ "controlFF",
+ "controlCR",
+ "controlSO",
+ "controlSI",
+ "controlDLE",
+ "controlDC1",
+ "controlDC2",
+ "controlDC3",
+ "controlDC4",
+ "controlNAK",
+ "controlSYN",
+ "controlETB",
+ "controlCAN",
+ "controlEM",
+ "controlSUB",
+ "controlESC",
+ "controlFS",
+ "controlGS",
+ "controlRS",
+ "controlUS",
+ "spacehackarabic",
+ "exclam",
+ "quotedbl",
+ "numbersign",
+ "dollar",
+ "percent",
+ "ampersand",
+ "quotesingle",
+ "parenleft",
+ "parenright",
+ "asterisk",
+ "plus",
+ "comma",
+ "hyphen",
+ "period",
+ "slash",
+ "zero",
+ "one",
+ "two",
+ "three",
+ "four",
+ "five",
+ "six",
+ "seven",
+ "eight",
+ "nine",
+ "colon",
+ "semicolon",
+ "less",
+ "equal",
+ "greater",
+ "question",
+ "at",
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+ "bracketleft",
+ "backslash",
+ "bracketright",
+ "asciicircum",
+ "underscore",
+ "grave",
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z",
+ "braceleft",
+ "verticalbar",
+ "braceright",
+ "asciitilde",
+ "controlDEL",
+ [0x00A0] = "nonbreakingspace",
+ [0x00A1] = "exclamdown",
+ [0x00A2] = "cent",
+ [0x00A3] = "sterling",
+ [0x00A4] = "currency",
+ [0x00A5] = "yen",
+ [0x00A6] = "brokenbar",
+ [0x00A7] = "section",
+ [0x00A8] = "dieresis",
+ [0x00A9] = "copyright",
+ [0x00AA] = "ordfeminine",
+ [0x00AB] = "guillemotleft",
+ [0x00AC] = "logicalnot",
+ [0x00AD] = "softhyphen",
+ [0x00AE] = "registered",
+ [0x00AF] = "overscore",
+ [0x00B0] = "degree",
+ [0x00B1] = "plusminus",
+ [0x00B2] = "twosuperior",
+ [0x00B3] = "threesuperior",
+ [0x00B4] = "acute",
+ [0x00B5] = "mu1",
+ [0x00B6] = "paragraph",
+ [0x00B7] = "periodcentered",
+ [0x00B8] = "cedilla",
+ [0x00B9] = "onesuperior",
+ [0x00BA] = "ordmasculine",
+ [0x00BB] = "guillemotright",
+ [0x00BC] = "onequarter",
+ [0x00BD] = "onehalf",
+ [0x00BE] = "threequarters",
+ [0x00BF] = "questiondown",
+ [0x00C0] = "Agrave",
+ [0x00C1] = "Aacute",
+ [0x00C2] = "Acircumflex",
+ [0x00C3] = "Atilde",
+ [0x00C4] = "Adieresis",
+ [0x00C5] = "Aring",
+ [0x00C6] = "AE",
+ [0x00C7] = "Ccedilla",
+ [0x00C8] = "Egrave",
+ [0x00C9] = "Eacute",
+ [0x00CA] = "Ecircumflex",
+ [0x00CB] = "Edieresis",
+ [0x00CC] = "Igrave",
+ [0x00CD] = "Iacute",
+ [0x00CE] = "Icircumflex",
+ [0x00CF] = "Idieresis",
+ [0x00D0] = "Eth",
+ [0x00D1] = "Ntilde",
+ [0x00D2] = "Ograve",
+ [0x00D3] = "Oacute",
+ [0x00D4] = "Ocircumflex",
+ [0x00D5] = "Otilde",
+ [0x00D6] = "Odieresis",
+ [0x00D7] = "multiply",
+ [0x00D8] = "Oslash",
+ [0x00D9] = "Ugrave",
+ [0x00DA] = "Uacute",
+ [0x00DB] = "Ucircumflex",
+ [0x00DC] = "Udieresis",
+ [0x00DD] = "Yacute",
+ [0x00DE] = "Thorn",
+ [0x00DF] = "germandbls",
+ [0x00E0] = "agrave",
+ [0x00E1] = "aacute",
+ [0x00E2] = "acircumflex",
+ [0x00E3] = "atilde",
+ [0x00E4] = "adieresis",
+ [0x00E5] = "aring",
+ [0x00E6] = "ae",
+ [0x00E7] = "ccedilla",
+ [0x00E8] = "egrave",
+ [0x00E9] = "eacute",
+ [0x00EA] = "ecircumflex",
+ [0x00EB] = "edieresis",
+ [0x00EC] = "igrave",
+ [0x00ED] = "iacute",
+ [0x00EE] = "icircumflex",
+ [0x00EF] = "idieresis",
+ [0x00F0] = "eth",
+ [0x00F1] = "ntilde",
+ [0x00F2] = "ograve",
+ [0x00F3] = "oacute",
+ [0x00F4] = "ocircumflex",
+ [0x00F5] = "otilde",
+ [0x00F6] = "odieresis",
+ [0x00F7] = "divide",
+ [0x00F8] = "oslash",
+ [0x00F9] = "ugrave",
+ [0x00FA] = "uacute",
+ [0x00FB] = "ucircumflex",
+ [0x00FC] = "udieresis",
+ [0x00FD] = "yacute",
+ [0x00FE] = "thorn",
+ [0x00FF] = "ydieresis",
+ [0x0100] = "Amacron",
+ [0x0101] = "amacron",
+ [0x0102] = "Abreve",
+ [0x0103] = "abreve",
+ [0x0104] = "Aogonek",
+ [0x0105] = "aogonek",
+ [0x0106] = "Cacute",
+ [0x0107] = "cacute",
+ [0x0108] = "Ccircumflex",
+ [0x0109] = "ccircumflex",
+ [0x010A] = "Cdotaccent",
+ [0x010B] = "cdotaccent",
+ [0x010C] = "Ccaron",
+ [0x010D] = "ccaron",
+ [0x010E] = "Dcaron",
+ [0x010F] = "dcaron",
+ [0x0110] = "Dslash",
+ [0x0111] = "dmacron",
+ [0x0112] = "Emacron",
+ [0x0113] = "emacron",
+ [0x0114] = "Ebreve",
+ [0x0115] = "ebreve",
+ [0x0116] = "Edotaccent",
+ [0x0117] = "edotaccent",
+ [0x0118] = "Eogonek",
+ [0x0119] = "eogonek",
+ [0x011A] = "Ecaron",
+ [0x011B] = "ecaron",
+ [0x011C] = "Gcircumflex",
+ [0x011D] = "gcircumflex",
+ [0x011E] = "Gbreve",
+ [0x011F] = "gbreve",
+ [0x0120] = "Gdotaccent",
+ [0x0121] = "gdotaccent",
+ [0x0122] = "Gcommaaccent",
+ [0x0123] = "gcommaaccent",
+ [0x0124] = "Hcircumflex",
+ [0x0125] = "hcircumflex",
+ [0x0126] = "Hbar",
+ [0x0127] = "hbar",
+ [0x0128] = "Itilde",
+ [0x0129] = "itilde",
+ [0x012A] = "Imacron",
+ [0x012B] = "imacron",
+ [0x012C] = "Ibreve",
+ [0x012D] = "ibreve",
+ [0x012E] = "Iogonek",
+ [0x012F] = "iogonek",
+ [0x0130] = "Idotaccent",
+ [0x0131] = "dotlessi",
+ [0x0132] = "IJ",
+ [0x0133] = "ij",
+ [0x0134] = "Jcircumflex",
+ [0x0135] = "jcircumflex",
+ [0x0136] = "Kcommaaccent",
+ [0x0137] = "kcommaaccent",
+ [0x0138] = "kgreenlandic",
+ [0x0139] = "Lacute",
+ [0x013A] = "lacute",
+ [0x013B] = "Lcommaaccent",
+ [0x013C] = "lcommaaccent",
+ [0x013D] = "Lcaron",
+ [0x013E] = "lcaron",
+ [0x013F] = "Ldotaccent",
+ [0x0140] = "ldotaccent",
+ [0x0141] = "Lslash",
+ [0x0142] = "lslash",
+ [0x0143] = "Nacute",
+ [0x0144] = "nacute",
+ [0x0145] = "Ncommaaccent",
+ [0x0146] = "ncommaaccent",
+ [0x0147] = "Ncaron",
+ [0x0148] = "ncaron",
+ [0x0149] = "quoterightn",
+ [0x014A] = "Eng",
+ [0x014B] = "eng",
+ [0x014C] = "Omacron",
+ [0x014D] = "omacron",
+ [0x014E] = "Obreve",
+ [0x014F] = "obreve",
+ [0x0150] = "Ohungarumlaut",
+ [0x0151] = "ohungarumlaut",
+ [0x0152] = "OE",
+ [0x0153] = "oe",
+ [0x0154] = "Racute",
+ [0x0155] = "racute",
+ [0x0156] = "Rcommaaccent",
+ [0x0157] = "rcommaaccent",
+ [0x0158] = "Rcaron",
+ [0x0159] = "rcaron",
+ [0x015A] = "Sacute",
+ [0x015B] = "sacute",
+ [0x015C] = "Scircumflex",
+ [0x015D] = "scircumflex",
+ [0x015E] = "Scedilla",
+ [0x015F] = "scedilla",
+ [0x0160] = "Scaron",
+ [0x0161] = "scaron",
+ [0x0162] = "Tcommaaccent",
+ [0x0163] = "tcommaaccent",
+ [0x0164] = "Tcaron",
+ [0x0165] = "tcaron",
+ [0x0166] = "Tbar",
+ [0x0167] = "tbar",
+ [0x0168] = "Utilde",
+ [0x0169] = "utilde",
+ [0x016A] = "Umacron",
+ [0x016B] = "umacron",
+ [0x016C] = "Ubreve",
+ [0x016D] = "ubreve",
+ [0x016E] = "Uring",
+ [0x016F] = "uring",
+ [0x0170] = "Uhungarumlaut",
+ [0x0171] = "uhungarumlaut",
+ [0x0172] = "Uogonek",
+ [0x0173] = "uogonek",
+ [0x0174] = "Wcircumflex",
+ [0x0175] = "wcircumflex",
+ [0x0176] = "Ycircumflex",
+ [0x0177] = "ycircumflex",
+ [0x0178] = "Ydieresis",
+ [0x0179] = "Zacute",
+ [0x017A] = "zacute",
+ [0x017B] = "Zdotaccent",
+ [0x017C] = "zdotaccent",
+ [0x017D] = "Zcaron",
+ [0x017E] = "zcaron",
+ [0x017F] = "slong",
+ [0x0180] = "bstroke",
+ [0x0181] = "Bhook",
+ [0x0182] = "Btopbar",
+ [0x0183] = "btopbar",
+ [0x0184] = "Tonesix",
+ [0x0185] = "tonesix",
+ [0x0186] = "Oopen",
+ [0x0187] = "Chook",
+ [0x0188] = "chook",
+ [0x0189] = "Dafrican",
+ [0x018A] = "Dhook",
+ [0x018B] = "Dtopbar",
+ [0x018C] = "dtopbar",
+ [0x018D] = "deltaturned",
+ [0x018E] = "Ereversed",
+ [0x018F] = "Schwa",
+ [0x0190] = "Eopen",
+ [0x0191] = "Fhook",
+ [0x0192] = "florin",
+ [0x0193] = "Ghook",
+ [0x0194] = "Gammaafrican",
+ [0x0195] = "hv",
+ [0x0196] = "Iotaafrican",
+ [0x0197] = "Istroke",
+ [0x0198] = "Khook",
+ [0x0199] = "khook",
+ [0x019A] = "lbar",
+ [0x019B] = "lambdastroke",
+ [0x019C] = "Mturned",
+ [0x019D] = "Nhookleft",
+ [0x019E] = "nlegrightlong",
+ [0x019F] = "Ocenteredtilde",
+ [0x01A0] = "Ohorn",
+ [0x01A1] = "ohorn",
+ [0x01A2] = "Oi",
+ [0x01A3] = "oi",
+ [0x01A4] = "Phook",
+ [0x01A5] = "phook",
+ [0x01A6] = "yr",
+ [0x01A7] = "Tonetwo",
+ [0x01A8] = "tonetwo",
+ [0x01A9] = "Esh",
+ [0x01AA] = "eshreversedloop",
+ [0x01AB] = "tpalatalhook",
+ [0x01AC] = "Thook",
+ [0x01AD] = "thook",
+ [0x01AE] = "Tretroflexhook",
+ [0x01AF] = "Uhorn",
+ [0x01B0] = "uhorn",
+ [0x01B1] = "Upsilonafrican",
+ [0x01B2] = "Vhook",
+ [0x01B3] = "Yhook",
+ [0x01B4] = "yhook",
+ [0x01B5] = "Zstroke",
+ [0x01B6] = "zstroke",
+ [0x01B7] = "Ezh",
+ [0x01B8] = "Ezhreversed",
+ [0x01B9] = "ezhreversed",
+ [0x01BA] = "ezhtail",
+ [0x01BB] = "twostroke",
+ [0x01BC] = "Tonefive",
+ [0x01BD] = "tonefive",
+ [0x01BE] = "glottalinvertedstroke",
+ [0x01BF] = "wynn",
+ [0x01C0] = "clickdental",
+ [0x01C1] = "clicklateral",
+ [0x01C2] = "clickalveolar",
+ [0x01C3] = "clickretroflex",
+ [0x01C4] = "DZcaron",
+ [0x01C5] = "Dzcaron",
+ [0x01C6] = "dzcaron",
+ [0x01C7] = "LJ",
+ [0x01C8] = "Lj",
+ [0x01C9] = "lj",
+ [0x01CA] = "NJ",
+ [0x01CB] = "Nj",
+ [0x01CC] = "nj",
+ [0x01CD] = "Acaron",
+ [0x01CE] = "acaron",
+ [0x01CF] = "Icaron",
+ [0x01D0] = "icaron",
+ [0x01D1] = "Ocaron",
+ [0x01D2] = "ocaron",
+ [0x01D3] = "Ucaron",
+ [0x01D4] = "ucaron",
+ [0x01D5] = "Udieresismacron",
+ [0x01D6] = "udieresismacron",
+ [0x01D7] = "Udieresisacute",
+ [0x01D8] = "udieresisacute",
+ [0x01D9] = "Udieresiscaron",
+ [0x01DA] = "udieresiscaron",
+ [0x01DB] = "Udieresisgrave",
+ [0x01DC] = "udieresisgrave",
+ [0x01DD] = "eturned",
+ [0x01DE] = "Adieresismacron",
+ [0x01DF] = "adieresismacron",
+ [0x01E0] = "Adotmacron",
+ [0x01E1] = "adotmacron",
+ [0x01E2] = "AEmacron",
+ [0x01E3] = "aemacron",
+ [0x01E4] = "Gstroke",
+ [0x01E5] = "gstroke",
+ [0x01E6] = "Gcaron",
+ [0x01E7] = "gcaron",
+ [0x01E8] = "Kcaron",
+ [0x01E9] = "kcaron",
+ [0x01EA] = "Oogonek",
+ [0x01EB] = "oogonek",
+ [0x01EC] = "Oogonekmacron",
+ [0x01ED] = "oogonekmacron",
+ [0x01EE] = "Ezhcaron",
+ [0x01EF] = "ezhcaron",
+ [0x01F0] = "jcaron",
+ [0x01F1] = "DZ",
+ [0x01F2] = "Dz",
+ [0x01F3] = "dz",
+ [0x01F4] = "Gacute",
+ [0x01F5] = "gacute",
+ [0x01FA] = "Aringacute",
+ [0x01FB] = "aringacute",
+ [0x01FC] = "AEacute",
+ [0x01FD] = "aeacute",
+ [0x01FE] = "Ostrokeacute",
+ [0x01FF] = "ostrokeacute",
+ [0x0200] = "Adblgrave",
+ [0x0201] = "adblgrave",
+ [0x0202] = "Ainvertedbreve",
+ [0x0203] = "ainvertedbreve",
+ [0x0204] = "Edblgrave",
+ [0x0205] = "edblgrave",
+ [0x0206] = "Einvertedbreve",
+ [0x0207] = "einvertedbreve",
+ [0x0208] = "Idblgrave",
+ [0x0209] = "idblgrave",
+ [0x020A] = "Iinvertedbreve",
+ [0x020B] = "iinvertedbreve",
+ [0x020C] = "Odblgrave",
+ [0x020D] = "odblgrave",
+ [0x020E] = "Oinvertedbreve",
+ [0x020F] = "oinvertedbreve",
+ [0x0210] = "Rdblgrave",
+ [0x0211] = "rdblgrave",
+ [0x0212] = "Rinvertedbreve",
+ [0x0213] = "rinvertedbreve",
+ [0x0214] = "Udblgrave",
+ [0x0215] = "udblgrave",
+ [0x0216] = "Uinvertedbreve",
+ [0x0217] = "uinvertedbreve",
+ [0x0218] = "Scommaaccent",
+ [0x0219] = "scommaaccent",
+ [0x0250] = "aturned",
+ [0x0251] = "ascript",
+ [0x0252] = "ascriptturned",
+ [0x0253] = "bhook",
+ [0x0254] = "oopen",
+ [0x0255] = "ccurl",
+ [0x0256] = "dtail",
+ [0x0257] = "dhook",
+ [0x0258] = "ereversed",
+ [0x0259] = "schwa",
+ [0x025A] = "schwahook",
+ [0x025B] = "eopen",
+ [0x025C] = "eopenreversed",
+ [0x025D] = "eopenreversedhook",
+ [0x025E] = "eopenreversedclosed",
+ [0x025F] = "jdotlessstroke",
+ [0x0260] = "ghook",
+ [0x0261] = "gscript",
+ [0x0263] = "gammalatinsmall",
+ [0x0264] = "ramshorn",
+ [0x0265] = "hturned",
+ [0x0266] = "hhook",
+ [0x0267] = "henghook",
+ [0x0268] = "istroke",
+ [0x0269] = "iotalatin",
+ [0x026B] = "lmiddletilde",
+ [0x026C] = "lbelt",
+ [0x026D] = "lhookretroflex",
+ [0x026E] = "lezh",
+ [0x026F] = "mturned",
+ [0x0270] = "mlonglegturned",
+ [0x0271] = "mhook",
+ [0x0272] = "nhookleft",
+ [0x0273] = "nhookretroflex",
+ [0x0275] = "obarred",
+ [0x0277] = "omegalatinclosed",
+ [0x0278] = "philatin",
+ [0x0279] = "rturned",
+ [0x027A] = "rlonglegturned",
+ [0x027B] = "rhookturned",
+ [0x027C] = "rlongleg",
+ [0x027D] = "rhook",
+ [0x027E] = "rfishhook",
+ [0x027F] = "rfishhookreversed",
+ [0x0281] = "Rsmallinverted",
+ [0x0282] = "shook",
+ [0x0283] = "esh",
+ [0x0284] = "dotlessjstrokehook",
+ [0x0285] = "eshsquatreversed",
+ [0x0286] = "eshcurl",
+ [0x0287] = "tturned",
+ [0x0288] = "tretroflexhook",
+ [0x0289] = "ubar",
+ [0x028A] = "upsilonlatin",
+ [0x028B] = "vhook",
+ [0x028C] = "vturned",
+ [0x028D] = "wturned",
+ [0x028E] = "yturned",
+ [0x0290] = "zretroflexhook",
+ [0x0291] = "zcurl",
+ [0x0292] = "ezh",
+ [0x0293] = "ezhcurl",
+ [0x0294] = "glottalstop",
+ [0x0295] = "glottalstopreversed",
+ [0x0296] = "glottalstopinverted",
+ [0x0297] = "cstretched",
+ [0x0298] = "bilabialclick",
+ [0x029A] = "eopenclosed",
+ [0x029B] = "Gsmallhook",
+ [0x029D] = "jcrossedtail",
+ [0x029E] = "kturned",
+ [0x02A0] = "qhook",
+ [0x02A1] = "glottalstopstroke",
+ [0x02A2] = "glottalstopstrokereversed",
+ [0x02A3] = "dzaltone",
+ [0x02A4] = "dezh",
+ [0x02A5] = "dzcurl",
+ [0x02A6] = "ts",
+ [0x02A7] = "tesh",
+ [0x02A8] = "tccurl",
+ [0x02B0] = "hsuperior",
+ [0x02B1] = "hhooksuperior",
+ [0x02B2] = "jsuperior",
+ [0x02B4] = "rturnedsuperior",
+ [0x02B5] = "rhookturnedsuperior",
+ [0x02B6] = "Rsmallinvertedsuperior",
+ [0x02B7] = "wsuperior",
+ [0x02B8] = "ysuperior",
+ [0x02B9] = "primemod",
+ [0x02BA] = "dblprimemod",
+ [0x02BB] = "commaturnedmod",
+ [0x02BC] = "apostrophemod",
+ [0x02BD] = "commareversedmod",
+ [0x02BE] = "ringhalfright",
+ [0x02BF] = "ringhalfleft",
+ [0x02C0] = "glottalstopmod",
+ [0x02C1] = "glottalstopreversedmod",
+ [0x02C2] = "arrowheadleftmod",
+ [0x02C3] = "arrowheadrightmod",
+ [0x02C4] = "arrowheadupmod",
+ [0x02C5] = "arrowheaddownmod",
+ [0x02C6] = "circumflex",
+ [0x02C7] = "caron",
+ [0x02C8] = "verticallinemod",
+ [0x02C9] = "firsttonechinese",
+ [0x02CA] = "secondtonechinese",
+ [0x02CB] = "fourthtonechinese",
+ [0x02CC] = "verticallinelowmod",
+ [0x02CD] = "macronlowmod",
+ [0x02CE] = "gravelowmod",
+ [0x02CF] = "acutelowmod",
+ [0x02D0] = "colontriangularmod",
+ [0x02D1] = "colontriangularhalfmod",
+ [0x02D2] = "ringhalfrightcentered",
+ [0x02D3] = "ringhalfleftcentered",
+ [0x02D4] = "uptackmod",
+ [0x02D5] = "downtackmod",
+ [0x02D6] = "plusmod",
+ [0x02D7] = "minusmod",
+ [0x02D8] = "breve",
+ [0x02D9] = "dotaccent",
+ [0x02DA] = "ring",
+ [0x02DB] = "ogonek",
+ [0x02DC] = "tilde",
+ [0x02DD] = "hungarumlaut",
+ [0x02DE] = "rhotichookmod",
+ [0x02E0] = "gammasuperior",
+ [0x02E3] = "xsuperior",
+ [0x02E4] = "glottalstopreversedsuperior",
+ [0x02E5] = "tonebarextrahighmod",
+ [0x02E6] = "tonebarhighmod",
+ [0x02E7] = "tonebarmidmod",
+ [0x02E8] = "tonebarlowmod",
+ [0x02E9] = "tonebarextralowmod",
+ [0x0300] = "gravecomb",
+ [0x0301] = "acutecomb",
+ [0x0302] = "circumflexcmb",
+ [0x0303] = "tildecomb",
+ [0x0304] = "macroncmb",
+ [0x0305] = "overlinecmb",
+ [0x0306] = "brevecmb",
+ [0x0307] = "dotaccentcmb",
+ [0x0308] = "dieresiscmb",
+ [0x0309] = "hookcmb",
+ [0x030A] = "ringcmb",
+ [0x030B] = "hungarumlautcmb",
+ [0x030C] = "caroncmb",
+ [0x030D] = "verticallineabovecmb",
+ [0x030E] = "dblverticallineabovecmb",
+ [0x030F] = "dblgravecmb",
+ [0x0310] = "candrabinducmb",
+ [0x0311] = "breveinvertedcmb",
+ [0x0312] = "commaturnedabovecmb",
+ [0x0313] = "commaabovecmb",
+ [0x0314] = "commareversedabovecmb",
+ [0x0315] = "commaaboverightcmb",
+ [0x0316] = "gravebelowcmb",
+ [0x0317] = "acutebelowcmb",
+ [0x0318] = "lefttackbelowcmb",
+ [0x0319] = "righttackbelowcmb",
+ [0x031A] = "leftangleabovecmb",
+ [0x031B] = "horncmb",
+ [0x031C] = "ringhalfleftbelowcmb",
+ [0x031D] = "uptackbelowcmb",
+ [0x031E] = "downtackbelowcmb",
+ [0x031F] = "plusbelowcmb",
+ [0x0320] = "minusbelowcmb",
+ [0x0321] = "hookpalatalizedbelowcmb",
+ [0x0322] = "hookretroflexbelowcmb",
+ [0x0323] = "dotbelowcomb",
+ [0x0324] = "dieresisbelowcmb",
+ [0x0325] = "ringbelowcmb",
+ [0x0327] = "cedillacmb",
+ [0x0328] = "ogonekcmb",
+ [0x0329] = "verticallinebelowcmb",
+ [0x032A] = "bridgebelowcmb",
+ [0x032B] = "dblarchinvertedbelowcmb",
+ [0x032C] = "caronbelowcmb",
+ [0x032D] = "circumflexbelowcmb",
+ [0x032E] = "brevebelowcmb",
+ [0x032F] = "breveinvertedbelowcmb",
+ [0x0330] = "tildebelowcmb",
+ [0x0331] = "macronbelowcmb",
+ [0x0332] = "lowlinecmb",
+ [0x0333] = "dbllowlinecmb",
+ [0x0334] = "tildeoverlaycmb",
+ [0x0335] = "strokeshortoverlaycmb",
+ [0x0336] = "strokelongoverlaycmb",
+ [0x0337] = "solidusshortoverlaycmb",
+ [0x0338] = "soliduslongoverlaycmb",
+ [0x0339] = "ringhalfrightbelowcmb",
+ [0x033A] = "bridgeinvertedbelowcmb",
+ [0x033B] = "squarebelowcmb",
+ [0x033C] = "seagullbelowcmb",
+ [0x033D] = "xabovecmb",
+ [0x033E] = "tildeverticalcmb",
+ [0x033F] = "dbloverlinecmb",
+ [0x0340] = "gravetonecmb",
+ [0x0341] = "acutetonecmb",
+ [0x0342] = "perispomenigreekcmb",
+ [0x0343] = "koroniscmb",
+ [0x0344] = "dialytikatonoscmb",
+ [0x0345] = "ypogegrammenigreekcmb",
+ [0x0360] = "tildedoublecmb",
+ [0x0361] = "breveinverteddoublecmb",
+ [0x0374] = "numeralsigngreek",
+ [0x0375] = "numeralsignlowergreek",
+ [0x037A] = "ypogegrammeni",
+ [0x037E] = "questiongreek",
+ [0x0384] = "tonos",
+ [0x0385] = "dieresistonos",
+ [0x0386] = "Alphatonos",
+ [0x0387] = "anoteleia",
+ [0x0388] = "Epsilontonos",
+ [0x0389] = "Etatonos",
+ [0x038A] = "Iotatonos",
+ [0x038C] = "Omicrontonos",
+ [0x038E] = "Upsilontonos",
+ [0x038F] = "Omegatonos",
+ [0x0390] = "iotadieresistonos",
+ [0x0391] = "Alpha",
+ [0x0392] = "Beta",
+ [0x0393] = "Gamma",
+ [0x0394] = "Deltagreek",
+ [0x0395] = "Epsilon",
+ [0x0396] = "Zeta",
+ [0x0397] = "Eta",
+ [0x0398] = "Theta",
+ [0x0399] = "Iota",
+ [0x039A] = "Kappa",
+ [0x039B] = "Lambda",
+ [0x039C] = "Mu",
+ [0x039D] = "Nu",
+ [0x039E] = "Xi",
+ [0x039F] = "Omicron",
+ [0x03A0] = "Pi",
+ [0x03A1] = "Rho",
+ [0x03A3] = "Sigma",
+ [0x03A4] = "Tau",
+ [0x03A5] = "Upsilon",
+ [0x03A6] = "Phi",
+ [0x03A7] = "Chi",
+ [0x03A8] = "Psi",
+ [0x03A9] = "Omegagreek",
+ [0x03AA] = "Iotadieresis",
+ [0x03AB] = "Upsilondieresis",
+ [0x03AC] = "alphatonos",
+ [0x03AD] = "epsilontonos",
+ [0x03AE] = "etatonos",
+ [0x03AF] = "iotatonos",
+ [0x03B0] = "upsilondieresistonos",
+ [0x03B1] = "alpha",
+ [0x03B2] = "beta",
+ [0x03B3] = "gamma",
+ [0x03B4] = "delta",
+ [0x03B5] = "epsilon",
+ [0x03B6] = "zeta",
+ [0x03B7] = "eta",
+ [0x03B8] = "theta",
+ [0x03B9] = "iota",
+ [0x03BA] = "kappa",
+ [0x03BB] = "lambda",
+ [0x03BC] = "mugreek",
+ [0x03BD] = "nu",
+ [0x03BE] = "xi",
+ [0x03BF] = "omicron",
+ [0x03C0] = "pi",
+ [0x03C1] = "rho",
+ [0x03C2] = "sigmafinal",
+ [0x03C3] = "sigma",
+ [0x03C4] = "tau",
+ [0x03C5] = "upsilon",
+ [0x03C6] = "phi",
+ [0x03C7] = "chi",
+ [0x03C8] = "psi",
+ [0x03C9] = "omega",
+ [0x03CA] = "iotadieresis",
+ [0x03CB] = "upsilondieresis",
+ [0x03CC] = "omicrontonos",
+ [0x03CD] = "upsilontonos",
+ [0x03CE] = "omegatonos",
+ [0x03D0] = "betasymbolgreek",
+ [0x03D1] = "thetasymbolgreek",
+ [0x03D2] = "Upsilonhooksymbol",
+ [0x03D3] = "Upsilonacutehooksymbolgreek",
+ [0x03D4] = "Upsilondieresishooksymbolgreek",
+ [0x03D5] = "phisymbolgreek",
+ [0x03D6] = "pisymbolgreek",
+ [0x03DA] = "Stigmagreek",
+ [0x03DC] = "Digammagreek",
+ [0x03DE] = "Koppagreek",
+ [0x03E0] = "Sampigreek",
+ [0x03E2] = "Sheicoptic",
+ [0x03E3] = "sheicoptic",
+ [0x03E4] = "Feicoptic",
+ [0x03E5] = "feicoptic",
+ [0x03E6] = "Kheicoptic",
+ [0x03E7] = "kheicoptic",
+ [0x03E8] = "Horicoptic",
+ [0x03E9] = "horicoptic",
+ [0x03EA] = "Gangiacoptic",
+ [0x03EB] = "gangiacoptic",
+ [0x03EC] = "Shimacoptic",
+ [0x03ED] = "shimacoptic",
+ [0x03EE] = "Deicoptic",
+ [0x03EF] = "deicoptic",
+ [0x03F0] = "kappasymbolgreek",
+ [0x03F1] = "rhosymbolgreek",
+ [0x03F2] = "sigmalunatesymbolgreek",
+ [0x03F3] = "yotgreek",
+ [0x0401] = "afii10023",
+ [0x0402] = "afii10051",
+ [0x0403] = "afii10052",
+ [0x0404] = "afii10053",
+ [0x0405] = "afii10054",
+ [0x0406] = "afii10055",
+ [0x0407] = "afii10056",
+ [0x0408] = "afii10057",
+ [0x0409] = "afii10058",
+ [0x040A] = "afii10059",
+ [0x040B] = "afii10060",
+ [0x040C] = "afii10061",
+ [0x040E] = "afii10062",
+ [0x040F] = "afii10145",
+ [0x0410] = "afii10017",
+ [0x0411] = "afii10018",
+ [0x0412] = "afii10019",
+ [0x0413] = "afii10020",
+ [0x0414] = "afii10021",
+ [0x0415] = "afii10022",
+ [0x0416] = "afii10024",
+ [0x0417] = "afii10025",
+ [0x0418] = "afii10026",
+ [0x0419] = "afii10027",
+ [0x041A] = "afii10028",
+ [0x041B] = "afii10029",
+ [0x041C] = "afii10030",
+ [0x041D] = "afii10031",
+ [0x041E] = "afii10032",
+ [0x041F] = "afii10033",
+ [0x0420] = "afii10034",
+ [0x0421] = "afii10035",
+ [0x0422] = "afii10036",
+ [0x0423] = "afii10037",
+ [0x0424] = "afii10038",
+ [0x0425] = "afii10039",
+ [0x0426] = "afii10040",
+ [0x0427] = "afii10041",
+ [0x0428] = "afii10042",
+ [0x0429] = "afii10043",
+ [0x042A] = "afii10044",
+ [0x042B] = "afii10045",
+ [0x042C] = "afii10046",
+ [0x042D] = "afii10047",
+ [0x042E] = "afii10048",
+ [0x042F] = "afii10049",
+ [0x0430] = "afii10065",
+ [0x0431] = "becyrillic",
+ [0x0432] = "vecyrillic",
+ [0x0433] = "gecyrillic",
+ [0x0434] = "decyrillic",
+ [0x0435] = "iecyrillic",
+ [0x0436] = "zhecyrillic",
+ [0x0437] = "zecyrillic",
+ [0x0438] = "iicyrillic",
+ [0x0439] = "iishortcyrillic",
+ [0x043A] = "kacyrillic",
+ [0x043B] = "elcyrillic",
+ [0x043C] = "emcyrillic",
+ [0x043D] = "encyrillic",
+ [0x043E] = "ocyrillic",
+ [0x043F] = "pecyrillic",
+ [0x0440] = "ercyrillic",
+ [0x0441] = "escyrillic",
+ [0x0442] = "tecyrillic",
+ [0x0443] = "ucyrillic",
+ [0x0444] = "efcyrillic",
+ [0x0445] = "khacyrillic",
+ [0x0446] = "tsecyrillic",
+ [0x0447] = "checyrillic",
+ [0x0448] = "shacyrillic",
+ [0x0449] = "shchacyrillic",
+ [0x044A] = "hardsigncyrillic",
+ [0x044B] = "yericyrillic",
+ [0x044C] = "softsigncyrillic",
+ [0x044D] = "ereversedcyrillic",
+ [0x044E] = "iucyrillic",
+ [0x044F] = "iacyrillic",
+ [0x0451] = "iocyrillic",
+ [0x0452] = "djecyrillic",
+ [0x0453] = "gjecyrillic",
+ [0x0454] = "ecyrillic",
+ [0x0455] = "dzecyrillic",
+ [0x0456] = "icyrillic",
+ [0x0457] = "yicyrillic",
+ [0x0458] = "jecyrillic",
+ [0x0459] = "ljecyrillic",
+ [0x045A] = "njecyrillic",
+ [0x045B] = "tshecyrillic",
+ [0x045C] = "kjecyrillic",
+ [0x045E] = "ushortcyrillic",
+ [0x045F] = "dzhecyrillic",
+ [0x0460] = "Omegacyrillic",
+ [0x0461] = "omegacyrillic",
+ [0x0462] = "afii10146",
+ [0x0463] = "yatcyrillic",
+ [0x0464] = "Eiotifiedcyrillic",
+ [0x0465] = "eiotifiedcyrillic",
+ [0x0466] = "Yuslittlecyrillic",
+ [0x0467] = "yuslittlecyrillic",
+ [0x0468] = "Yuslittleiotifiedcyrillic",
+ [0x0469] = "yuslittleiotifiedcyrillic",
+ [0x046A] = "Yusbigcyrillic",
+ [0x046B] = "yusbigcyrillic",
+ [0x046C] = "Yusbigiotifiedcyrillic",
+ [0x046D] = "yusbigiotifiedcyrillic",
+ [0x046E] = "Ksicyrillic",
+ [0x046F] = "ksicyrillic",
+ [0x0470] = "Psicyrillic",
+ [0x0471] = "psicyrillic",
+ [0x0472] = "afii10147",
+ [0x0473] = "fitacyrillic",
+ [0x0474] = "afii10148",
+ [0x0475] = "izhitsacyrillic",
+ [0x0476] = "Izhitsadblgravecyrillic",
+ [0x0477] = "izhitsadblgravecyrillic",
+ [0x0478] = "Ukcyrillic",
+ [0x0479] = "ukcyrillic",
+ [0x047A] = "Omegaroundcyrillic",
+ [0x047B] = "omegaroundcyrillic",
+ [0x047C] = "Omegatitlocyrillic",
+ [0x047D] = "omegatitlocyrillic",
+ [0x047E] = "Otcyrillic",
+ [0x047F] = "otcyrillic",
+ [0x0480] = "Koppacyrillic",
+ [0x0481] = "koppacyrillic",
+ [0x0482] = "thousandcyrillic",
+ [0x0483] = "titlocyrilliccmb",
+ [0x0484] = "palatalizationcyrilliccmb",
+ [0x0485] = "dasiapneumatacyrilliccmb",
+ [0x0486] = "psilipneumatacyrilliccmb",
+ [0x0490] = "afii10050",
+ [0x0491] = "gheupturncyrillic",
+ [0x0492] = "Ghestrokecyrillic",
+ [0x0493] = "ghestrokecyrillic",
+ [0x0494] = "Ghemiddlehookcyrillic",
+ [0x0495] = "ghemiddlehookcyrillic",
+ [0x0496] = "Zhedescendercyrillic",
+ [0x0497] = "zhedescendercyrillic",
+ [0x0498] = "Zedescendercyrillic",
+ [0x0499] = "zedescendercyrillic",
+ [0x049A] = "Kadescendercyrillic",
+ [0x049B] = "kadescendercyrillic",
+ [0x049C] = "Kaverticalstrokecyrillic",
+ [0x049D] = "kaverticalstrokecyrillic",
+ [0x049E] = "Kastrokecyrillic",
+ [0x049F] = "kastrokecyrillic",
+ [0x04A0] = "Kabashkircyrillic",
+ [0x04A1] = "kabashkircyrillic",
+ [0x04A2] = "Endescendercyrillic",
+ [0x04A3] = "endescendercyrillic",
+ [0x04A4] = "Enghecyrillic",
+ [0x04A5] = "enghecyrillic",
+ [0x04A6] = "Pemiddlehookcyrillic",
+ [0x04A7] = "pemiddlehookcyrillic",
+ [0x04A8] = "Haabkhasiancyrillic",
+ [0x04A9] = "haabkhasiancyrillic",
+ [0x04AA] = "Esdescendercyrillic",
+ [0x04AB] = "esdescendercyrillic",
+ [0x04AC] = "Tedescendercyrillic",
+ [0x04AD] = "tedescendercyrillic",
+ [0x04AE] = "Ustraightcyrillic",
+ [0x04AF] = "ustraightcyrillic",
+ [0x04B0] = "Ustraightstrokecyrillic",
+ [0x04B1] = "ustraightstrokecyrillic",
+ [0x04B2] = "Hadescendercyrillic",
+ [0x04B3] = "hadescendercyrillic",
+ [0x04B4] = "Tetsecyrillic",
+ [0x04B5] = "tetsecyrillic",
+ [0x04B6] = "Chedescendercyrillic",
+ [0x04B7] = "chedescendercyrillic",
+ [0x04B8] = "Cheverticalstrokecyrillic",
+ [0x04B9] = "cheverticalstrokecyrillic",
+ [0x04BA] = "Shhacyrillic",
+ [0x04BB] = "shhacyrillic",
+ [0x04BC] = "Cheabkhasiancyrillic",
+ [0x04BD] = "cheabkhasiancyrillic",
+ [0x04BE] = "Chedescenderabkhasiancyrillic",
+ [0x04BF] = "chedescenderabkhasiancyrillic",
+ [0x04C0] = "palochkacyrillic",
+ [0x04C1] = "Zhebrevecyrillic",
+ [0x04C2] = "zhebrevecyrillic",
+ [0x04C3] = "Kahookcyrillic",
+ [0x04C4] = "kahookcyrillic",
+ [0x04C7] = "Enhookcyrillic",
+ [0x04C8] = "enhookcyrillic",
+ [0x04CB] = "Chekhakassiancyrillic",
+ [0x04CC] = "chekhakassiancyrillic",
+ [0x04D0] = "Abrevecyrillic",
+ [0x04D1] = "abrevecyrillic",
+ [0x04D2] = "Adieresiscyrillic",
+ [0x04D3] = "adieresiscyrillic",
+ [0x04D4] = "Aiecyrillic",
+ [0x04D5] = "aiecyrillic",
+ [0x04D6] = "Iebrevecyrillic",
+ [0x04D7] = "iebrevecyrillic",
+ [0x04D8] = "Schwacyrillic",
+ [0x04D9] = "schwacyrillic",
+ [0x04DA] = "Schwadieresiscyrillic",
+ [0x04DB] = "schwadieresiscyrillic",
+ [0x04DC] = "Zhedieresiscyrillic",
+ [0x04DD] = "zhedieresiscyrillic",
+ [0x04DE] = "Zedieresiscyrillic",
+ [0x04DF] = "zedieresiscyrillic",
+ [0x04E0] = "Dzeabkhasiancyrillic",
+ [0x04E1] = "dzeabkhasiancyrillic",
+ [0x04E2] = "Imacroncyrillic",
+ [0x04E3] = "imacroncyrillic",
+ [0x04E4] = "Idieresiscyrillic",
+ [0x04E5] = "idieresiscyrillic",
+ [0x04E6] = "Odieresiscyrillic",
+ [0x04E7] = "odieresiscyrillic",
+ [0x04E8] = "Obarredcyrillic",
+ [0x04E9] = "obarredcyrillic",
+ [0x04EA] = "Obarreddieresiscyrillic",
+ [0x04EB] = "obarreddieresiscyrillic",
+ [0x04EE] = "Umacroncyrillic",
+ [0x04EF] = "umacroncyrillic",
+ [0x04F0] = "Udieresiscyrillic",
+ [0x04F1] = "udieresiscyrillic",
+ [0x04F2] = "Uhungarumlautcyrillic",
+ [0x04F3] = "uhungarumlautcyrillic",
+ [0x04F4] = "Chedieresiscyrillic",
+ [0x04F5] = "chedieresiscyrillic",
+ [0x04F8] = "Yerudieresiscyrillic",
+ [0x04F9] = "yerudieresiscyrillic",
+ [0x0531] = "Aybarmenian",
+ [0x0532] = "Benarmenian",
+ [0x0533] = "Gimarmenian",
+ [0x0534] = "Daarmenian",
+ [0x0535] = "Echarmenian",
+ [0x0536] = "Zaarmenian",
+ [0x0537] = "Eharmenian",
+ [0x0538] = "Etarmenian",
+ [0x0539] = "Toarmenian",
+ [0x053A] = "Zhearmenian",
+ [0x053B] = "Iniarmenian",
+ [0x053C] = "Liwnarmenian",
+ [0x053D] = "Xeharmenian",
+ [0x053E] = "Caarmenian",
+ [0x053F] = "Kenarmenian",
+ [0x0540] = "Hoarmenian",
+ [0x0541] = "Jaarmenian",
+ [0x0542] = "Ghadarmenian",
+ [0x0543] = "Cheharmenian",
+ [0x0544] = "Menarmenian",
+ [0x0545] = "Yiarmenian",
+ [0x0546] = "Nowarmenian",
+ [0x0547] = "Shaarmenian",
+ [0x0548] = "Voarmenian",
+ [0x0549] = "Chaarmenian",
+ [0x054A] = "Peharmenian",
+ [0x054B] = "Jheharmenian",
+ [0x054C] = "Raarmenian",
+ [0x054D] = "Seharmenian",
+ [0x054E] = "Vewarmenian",
+ [0x054F] = "Tiwnarmenian",
+ [0x0550] = "Reharmenian",
+ [0x0551] = "Coarmenian",
+ [0x0552] = "Yiwnarmenian",
+ [0x0553] = "Piwrarmenian",
+ [0x0554] = "Keharmenian",
+ [0x0555] = "Oharmenian",
+ [0x0556] = "Feharmenian",
+ [0x0559] = "ringhalfleftarmenian",
+ [0x055A] = "apostrophearmenian",
+ [0x055B] = "emphasismarkarmenian",
+ [0x055C] = "exclamarmenian",
+ [0x055D] = "commaarmenian",
+ [0x055E] = "questionarmenian",
+ [0x055F] = "abbreviationmarkarmenian",
+ [0x0561] = "aybarmenian",
+ [0x0562] = "benarmenian",
+ [0x0563] = "gimarmenian",
+ [0x0564] = "daarmenian",
+ [0x0565] = "echarmenian",
+ [0x0566] = "zaarmenian",
+ [0x0567] = "eharmenian",
+ [0x0568] = "etarmenian",
+ [0x0569] = "toarmenian",
+ [0x056A] = "zhearmenian",
+ [0x056B] = "iniarmenian",
+ [0x056C] = "liwnarmenian",
+ [0x056D] = "xeharmenian",
+ [0x056E] = "caarmenian",
+ [0x056F] = "kenarmenian",
+ [0x0570] = "hoarmenian",
+ [0x0571] = "jaarmenian",
+ [0x0572] = "ghadarmenian",
+ [0x0573] = "cheharmenian",
+ [0x0574] = "menarmenian",
+ [0x0575] = "yiarmenian",
+ [0x0576] = "nowarmenian",
+ [0x0577] = "shaarmenian",
+ [0x0578] = "voarmenian",
+ [0x0579] = "chaarmenian",
+ [0x057A] = "peharmenian",
+ [0x057B] = "jheharmenian",
+ [0x057C] = "raarmenian",
+ [0x057D] = "seharmenian",
+ [0x057E] = "vewarmenian",
+ [0x057F] = "tiwnarmenian",
+ [0x0580] = "reharmenian",
+ [0x0581] = "coarmenian",
+ [0x0582] = "yiwnarmenian",
+ [0x0583] = "piwrarmenian",
+ [0x0584] = "keharmenian",
+ [0x0585] = "oharmenian",
+ [0x0586] = "feharmenian",
+ [0x0587] = "echyiwnarmenian",
+ [0x0589] = "periodarmenian",
+ [0x0591] = "etnahtalefthebrew",
+ [0x0592] = "segoltahebrew",
+ [0x0593] = "shalshelethebrew",
+ [0x0594] = "zaqefqatanhebrew",
+ [0x0595] = "zaqefgadolhebrew",
+ [0x0596] = "tipehalefthebrew",
+ [0x0597] = "reviamugrashhebrew",
+ [0x0598] = "zarqahebrew",
+ [0x0599] = "pashtahebrew",
+ [0x059A] = "yetivhebrew",
+ [0x059B] = "tevirlefthebrew",
+ [0x059C] = "gereshaccenthebrew",
+ [0x059D] = "gereshmuqdamhebrew",
+ [0x059E] = "gershayimaccenthebrew",
+ [0x059F] = "qarneyparahebrew",
+ [0x05A0] = "telishagedolahebrew",
+ [0x05A1] = "pazerhebrew",
+ [0x05A3] = "munahlefthebrew",
+ [0x05A4] = "mahapakhlefthebrew",
+ [0x05A5] = "merkhalefthebrew",
+ [0x05A6] = "merkhakefulalefthebrew",
+ [0x05A7] = "dargalefthebrew",
+ [0x05A8] = "qadmahebrew",
+ [0x05A9] = "telishaqetanahebrew",
+ [0x05AA] = "yerahbenyomolefthebrew",
+ [0x05AB] = "olehebrew",
+ [0x05AC] = "iluyhebrew",
+ [0x05AD] = "dehihebrew",
+ [0x05AE] = "zinorhebrew",
+ [0x05AF] = "masoracirclehebrew",
+ [0x05B0] = "shevawidehebrew",
+ [0x05B1] = "hatafsegolwidehebrew",
+ [0x05B2] = "hatafpatahwidehebrew",
+ [0x05B3] = "hatafqamatswidehebrew",
+ [0x05B4] = "hiriqwidehebrew",
+ [0x05B5] = "tserewidehebrew",
+ [0x05B6] = "segolwidehebrew",
+ [0x05B7] = "patahwidehebrew",
+ [0x05B8] = "qamatswidehebrew",
+ [0x05B9] = "holamwidehebrew",
+ [0x05BB] = "qubutswidehebrew",
+ [0x05BC] = "dageshhebrew",
+ [0x05BD] = "siluqlefthebrew",
+ [0x05BE] = "maqafhebrew",
+ [0x05BF] = "rafehebrew",
+ [0x05C0] = "paseqhebrew",
+ [0x05C1] = "shindothebrew",
+ [0x05C2] = "sindothebrew",
+ [0x05C3] = "sofpasuqhebrew",
+ [0x05C4] = "upperdothebrew",
+ [0x05D0] = "alefhebrew",
+ [0x05D1] = "bethebrew",
+ [0x05D2] = "gimelhebrew",
+ [0x05D3] = "dalettserehebrew",
+ [0x05D4] = "hehebrew",
+ [0x05D5] = "vavhebrew",
+ [0x05D6] = "zayinhebrew",
+ [0x05D7] = "hethebrew",
+ [0x05D8] = "tethebrew",
+ [0x05D9] = "yodhebrew",
+ [0x05DA] = "finalkafshevahebrew",
+ [0x05DB] = "kafhebrew",
+ [0x05DC] = "lamedholamhebrew",
+ [0x05DD] = "finalmemhebrew",
+ [0x05DE] = "memhebrew",
+ [0x05DF] = "finalnunhebrew",
+ [0x05E0] = "nunhebrew",
+ [0x05E1] = "samekhhebrew",
+ [0x05E2] = "ayinhebrew",
+ [0x05E3] = "finalpehebrew",
+ [0x05E4] = "pehebrew",
+ [0x05E5] = "finaltsadihebrew",
+ [0x05E6] = "tsadihebrew",
+ [0x05E7] = "qoftserehebrew",
+ [0x05E8] = "reshtserehebrew",
+ [0x05E9] = "shinhebrew",
+ [0x05EA] = "tavhebrew",
+ [0x05F0] = "vavvavhebrew",
+ [0x05F1] = "vavyodhebrew",
+ [0x05F2] = "yodyodhebrew",
+ [0x05F3] = "gereshhebrew",
+ [0x05F4] = "gershayimhebrew",
+ [0x060C] = "commaarabic",
+ [0x061B] = "semicolonarabic",
+ [0x061F] = "questionarabic",
+ [0x0621] = "hamzasukunarabic",
+ [0x0622] = "alefmaddaabovearabic",
+ [0x0623] = "alefhamzaabovearabic",
+ [0x0624] = "wawhamzaabovearabic",
+ [0x0625] = "alefhamzabelowarabic",
+ [0x0626] = "yehhamzaabovearabic",
+ [0x0627] = "alefarabic",
+ [0x0628] = "beharabic",
+ [0x0629] = "tehmarbutaarabic",
+ [0x062A] = "teharabic",
+ [0x062B] = "theharabic",
+ [0x062C] = "jeemarabic",
+ [0x062D] = "haharabic",
+ [0x062E] = "khaharabic",
+ [0x062F] = "dalarabic",
+ [0x0630] = "thalarabic",
+ [0x0631] = "rehyehaleflamarabic",
+ [0x0632] = "zainarabic",
+ [0x0633] = "seenarabic",
+ [0x0634] = "sheenarabic",
+ [0x0635] = "sadarabic",
+ [0x0636] = "dadarabic",
+ [0x0637] = "taharabic",
+ [0x0638] = "zaharabic",
+ [0x0639] = "ainarabic",
+ [0x063A] = "ghainarabic",
+ [0x0640] = "tatweelarabic",
+ [0x0641] = "feharabic",
+ [0x0642] = "qafarabic",
+ [0x0643] = "kafarabic",
+ [0x0644] = "lamarabic",
+ [0x0645] = "meemarabic",
+ [0x0646] = "noonarabic",
+ [0x0647] = "heharabic",
+ [0x0648] = "wawarabic",
+ [0x0649] = "alefmaksuraarabic",
+ [0x064A] = "yeharabic",
+ [0x064B] = "fathatanarabic",
+ [0x064C] = "dammatanarabic",
+ [0x064D] = "kasratanarabic",
+ [0x064E] = "fathalowarabic",
+ [0x064F] = "dammalowarabic",
+ [0x0650] = "kasraarabic",
+ [0x0651] = "shaddafathatanarabic",
+ [0x0652] = "sukunarabic",
+ [0x0660] = "zerohackarabic",
+ [0x0661] = "onehackarabic",
+ [0x0662] = "twohackarabic",
+ [0x0663] = "threehackarabic",
+ [0x0664] = "fourhackarabic",
+ [0x0665] = "fivehackarabic",
+ [0x0666] = "sixhackarabic",
+ [0x0667] = "sevenhackarabic",
+ [0x0668] = "eighthackarabic",
+ [0x0669] = "ninehackarabic",
+ [0x066A] = "percentarabic",
+ [0x066B] = "decimalseparatorpersian",
+ [0x066C] = "thousandsseparatorpersian",
+ [0x066D] = "asteriskarabic",
+ [0x0679] = "tteharabic",
+ [0x067E] = "peharabic",
+ [0x0686] = "tcheharabic",
+ [0x0688] = "ddalarabic",
+ [0x0691] = "rreharabic",
+ [0x0698] = "jeharabic",
+ [0x06A4] = "veharabic",
+ [0x06AF] = "gafarabic",
+ [0x06BA] = "noonghunnaarabic",
+ [0x06C1] = "hehaltonearabic",
+ [0x06D1] = "yehthreedotsbelowarabic",
+ [0x06D2] = "yehbarreearabic",
+ [0x06D5] = "afii57534",
+ [0x06F0] = "zeropersian",
+ [0x06F1] = "onepersian",
+ [0x06F2] = "twopersian",
+ [0x06F3] = "threepersian",
+ [0x06F4] = "fourpersian",
+ [0x06F5] = "fivepersian",
+ [0x06F6] = "sixpersian",
+ [0x06F7] = "sevenpersian",
+ [0x06F8] = "eightpersian",
+ [0x06F9] = "ninepersian",
+ [0x0901] = "candrabindudeva",
+ [0x0902] = "anusvaradeva",
+ [0x0903] = "visargadeva",
+ [0x0905] = "adeva",
+ [0x0906] = "aadeva",
+ [0x0907] = "ideva",
+ [0x0908] = "iideva",
+ [0x0909] = "udeva",
+ [0x090A] = "uudeva",
+ [0x090B] = "rvocalicdeva",
+ [0x090C] = "lvocalicdeva",
+ [0x090D] = "ecandradeva",
+ [0x090E] = "eshortdeva",
+ [0x090F] = "edeva",
+ [0x0910] = "aideva",
+ [0x0911] = "ocandradeva",
+ [0x0912] = "oshortdeva",
+ [0x0913] = "odeva",
+ [0x0914] = "audeva",
+ [0x0915] = "kadeva",
+ [0x0916] = "khadeva",
+ [0x0917] = "gadeva",
+ [0x0918] = "ghadeva",
+ [0x0919] = "ngadeva",
+ [0x091A] = "cadeva",
+ [0x091B] = "chadeva",
+ [0x091C] = "jadeva",
+ [0x091D] = "jhadeva",
+ [0x091E] = "nyadeva",
+ [0x091F] = "ttadeva",
+ [0x0920] = "tthadeva",
+ [0x0921] = "ddadeva",
+ [0x0922] = "ddhadeva",
+ [0x0923] = "nnadeva",
+ [0x0924] = "tadeva",
+ [0x0925] = "thadeva",
+ [0x0926] = "dadeva",
+ [0x0927] = "dhadeva",
+ [0x0928] = "nadeva",
+ [0x0929] = "nnnadeva",
+ [0x092A] = "padeva",
+ [0x092B] = "phadeva",
+ [0x092C] = "badeva",
+ [0x092D] = "bhadeva",
+ [0x092E] = "madeva",
+ [0x092F] = "yadeva",
+ [0x0930] = "radeva",
+ [0x0931] = "rradeva",
+ [0x0932] = "ladeva",
+ [0x0933] = "lladeva",
+ [0x0934] = "llladeva",
+ [0x0935] = "vadeva",
+ [0x0936] = "shadeva",
+ [0x0937] = "ssadeva",
+ [0x0938] = "sadeva",
+ [0x0939] = "hadeva",
+ [0x093C] = "nuktadeva",
+ [0x093D] = "avagrahadeva",
+ [0x093E] = "aavowelsigndeva",
+ [0x093F] = "ivowelsigndeva",
+ [0x0940] = "iivowelsigndeva",
+ [0x0941] = "uvowelsigndeva",
+ [0x0942] = "uuvowelsigndeva",
+ [0x0943] = "rvocalicvowelsigndeva",
+ [0x0944] = "rrvocalicvowelsigndeva",
+ [0x0945] = "ecandravowelsigndeva",
+ [0x0946] = "eshortvowelsigndeva",
+ [0x0947] = "evowelsigndeva",
+ [0x0948] = "aivowelsigndeva",
+ [0x0949] = "ocandravowelsigndeva",
+ [0x094A] = "oshortvowelsigndeva",
+ [0x094B] = "ovowelsigndeva",
+ [0x094C] = "auvowelsigndeva",
+ [0x094D] = "viramadeva",
+ [0x0950] = "omdeva",
+ [0x0951] = "udattadeva",
+ [0x0952] = "anudattadeva",
+ [0x0953] = "gravedeva",
+ [0x0954] = "acutedeva",
+ [0x0958] = "qadeva",
+ [0x0959] = "khhadeva",
+ [0x095A] = "ghhadeva",
+ [0x095B] = "zadeva",
+ [0x095C] = "dddhadeva",
+ [0x095D] = "rhadeva",
+ [0x095E] = "fadeva",
+ [0x095F] = "yyadeva",
+ [0x0960] = "rrvocalicdeva",
+ [0x0961] = "llvocalicdeva",
+ [0x0962] = "lvocalicvowelsigndeva",
+ [0x0963] = "llvocalicvowelsigndeva",
+ [0x0964] = "danda",
+ [0x0965] = "dbldanda",
+ [0x0966] = "zerodeva",
+ [0x0967] = "onedeva",
+ [0x0968] = "twodeva",
+ [0x0969] = "threedeva",
+ [0x096A] = "fourdeva",
+ [0x096B] = "fivedeva",
+ [0x096C] = "sixdeva",
+ [0x096D] = "sevendeva",
+ [0x096E] = "eightdeva",
+ [0x096F] = "ninedeva",
+ [0x0970] = "abbreviationsigndeva",
+ [0x0981] = "candrabindubengali",
+ [0x0982] = "anusvarabengali",
+ [0x0983] = "visargabengali",
+ [0x0985] = "abengali",
+ [0x0986] = "aabengali",
+ [0x0987] = "ibengali",
+ [0x0988] = "iibengali",
+ [0x0989] = "ubengali",
+ [0x098A] = "uubengali",
+ [0x098B] = "rvocalicbengali",
+ [0x098C] = "lvocalicbengali",
+ [0x098F] = "ebengali",
+ [0x0990] = "aibengali",
+ [0x0993] = "obengali",
+ [0x0994] = "aubengali",
+ [0x0995] = "kabengali",
+ [0x0996] = "khabengali",
+ [0x0997] = "gabengali",
+ [0x0998] = "ghabengali",
+ [0x0999] = "ngabengali",
+ [0x099A] = "cabengali",
+ [0x099B] = "chabengali",
+ [0x099C] = "jabengali",
+ [0x099D] = "jhabengali",
+ [0x099E] = "nyabengali",
+ [0x099F] = "ttabengali",
+ [0x09A0] = "tthabengali",
+ [0x09A1] = "ddabengali",
+ [0x09A2] = "ddhabengali",
+ [0x09A3] = "nnabengali",
+ [0x09A4] = "tabengali",
+ [0x09A5] = "thabengali",
+ [0x09A6] = "dabengali",
+ [0x09A7] = "dhabengali",
+ [0x09A8] = "nabengali",
+ [0x09AA] = "pabengali",
+ [0x09AB] = "phabengali",
+ [0x09AC] = "babengali",
+ [0x09AD] = "bhabengali",
+ [0x09AE] = "mabengali",
+ [0x09AF] = "yabengali",
+ [0x09B0] = "rabengali",
+ [0x09B2] = "labengali",
+ [0x09B6] = "shabengali",
+ [0x09B7] = "ssabengali",
+ [0x09B8] = "sabengali",
+ [0x09B9] = "habengali",
+ [0x09BC] = "nuktabengali",
+ [0x09BE] = "aavowelsignbengali",
+ [0x09BF] = "ivowelsignbengali",
+ [0x09C0] = "iivowelsignbengali",
+ [0x09C1] = "uvowelsignbengali",
+ [0x09C2] = "uuvowelsignbengali",
+ [0x09C3] = "rvocalicvowelsignbengali",
+ [0x09C4] = "rrvocalicvowelsignbengali",
+ [0x09C7] = "evowelsignbengali",
+ [0x09C8] = "aivowelsignbengali",
+ [0x09CB] = "ovowelsignbengali",
+ [0x09CC] = "auvowelsignbengali",
+ [0x09CD] = "viramabengali",
+ [0x09D7] = "aulengthmarkbengali",
+ [0x09DC] = "rrabengali",
+ [0x09DD] = "rhabengali",
+ [0x09DF] = "yyabengali",
+ [0x09E0] = "rrvocalicbengali",
+ [0x09E1] = "llvocalicbengali",
+ [0x09E2] = "lvocalicvowelsignbengali",
+ [0x09E3] = "llvocalicvowelsignbengali",
+ [0x09E6] = "zerobengali",
+ [0x09E7] = "onebengali",
+ [0x09E8] = "twobengali",
+ [0x09E9] = "threebengali",
+ [0x09EA] = "fourbengali",
+ [0x09EB] = "fivebengali",
+ [0x09EC] = "sixbengali",
+ [0x09ED] = "sevenbengali",
+ [0x09EE] = "eightbengali",
+ [0x09EF] = "ninebengali",
+ [0x09F0] = "ramiddlediagonalbengali",
+ [0x09F1] = "ralowerdiagonalbengali",
+ [0x09F2] = "rupeemarkbengali",
+ [0x09F3] = "rupeesignbengali",
+ [0x09F4] = "onenumeratorbengali",
+ [0x09F5] = "twonumeratorbengali",
+ [0x09F6] = "threenumeratorbengali",
+ [0x09F7] = "fournumeratorbengali",
+ [0x09F8] = "denominatorminusonenumeratorbengali",
+ [0x09F9] = "sixteencurrencydenominatorbengali",
+ [0x09FA] = "issharbengali",
+ [0x0A02] = "bindigurmukhi",
+ [0x0A05] = "agurmukhi",
+ [0x0A06] = "aagurmukhi",
+ [0x0A07] = "igurmukhi",
+ [0x0A08] = "iigurmukhi",
+ [0x0A09] = "ugurmukhi",
+ [0x0A0A] = "uugurmukhi",
+ [0x0A0F] = "eegurmukhi",
+ [0x0A10] = "aigurmukhi",
+ [0x0A13] = "oogurmukhi",
+ [0x0A14] = "augurmukhi",
+ [0x0A15] = "kagurmukhi",
+ [0x0A16] = "khagurmukhi",
+ [0x0A17] = "gagurmukhi",
+ [0x0A18] = "ghagurmukhi",
+ [0x0A19] = "ngagurmukhi",
+ [0x0A1A] = "cagurmukhi",
+ [0x0A1B] = "chagurmukhi",
+ [0x0A1C] = "jagurmukhi",
+ [0x0A1D] = "jhagurmukhi",
+ [0x0A1E] = "nyagurmukhi",
+ [0x0A1F] = "ttagurmukhi",
+ [0x0A20] = "tthagurmukhi",
+ [0x0A21] = "ddagurmukhi",
+ [0x0A22] = "ddhagurmukhi",
+ [0x0A23] = "nnagurmukhi",
+ [0x0A24] = "tagurmukhi",
+ [0x0A25] = "thagurmukhi",
+ [0x0A26] = "dagurmukhi",
+ [0x0A27] = "dhagurmukhi",
+ [0x0A28] = "nagurmukhi",
+ [0x0A2A] = "pagurmukhi",
+ [0x0A2B] = "phagurmukhi",
+ [0x0A2C] = "bagurmukhi",
+ [0x0A2D] = "bhagurmukhi",
+ [0x0A2E] = "magurmukhi",
+ [0x0A2F] = "yagurmukhi",
+ [0x0A30] = "ragurmukhi",
+ [0x0A32] = "lagurmukhi",
+ [0x0A35] = "vagurmukhi",
+ [0x0A36] = "shagurmukhi",
+ [0x0A38] = "sagurmukhi",
+ [0x0A39] = "hagurmukhi",
+ [0x0A3C] = "nuktagurmukhi",
+ [0x0A3E] = "aamatragurmukhi",
+ [0x0A3F] = "imatragurmukhi",
+ [0x0A40] = "iimatragurmukhi",
+ [0x0A41] = "umatragurmukhi",
+ [0x0A42] = "uumatragurmukhi",
+ [0x0A47] = "eematragurmukhi",
+ [0x0A48] = "aimatragurmukhi",
+ [0x0A4B] = "oomatragurmukhi",
+ [0x0A4C] = "aumatragurmukhi",
+ [0x0A4D] = "halantgurmukhi",
+ [0x0A59] = "khhagurmukhi",
+ [0x0A5A] = "ghhagurmukhi",
+ [0x0A5B] = "zagurmukhi",
+ [0x0A5C] = "rragurmukhi",
+ [0x0A5E] = "fagurmukhi",
+ [0x0A66] = "zerogurmukhi",
+ [0x0A67] = "onegurmukhi",
+ [0x0A68] = "twogurmukhi",
+ [0x0A69] = "threegurmukhi",
+ [0x0A6A] = "fourgurmukhi",
+ [0x0A6B] = "fivegurmukhi",
+ [0x0A6C] = "sixgurmukhi",
+ [0x0A6D] = "sevengurmukhi",
+ [0x0A6E] = "eightgurmukhi",
+ [0x0A6F] = "ninegurmukhi",
+ [0x0A70] = "tippigurmukhi",
+ [0x0A71] = "addakgurmukhi",
+ [0x0A72] = "irigurmukhi",
+ [0x0A73] = "uragurmukhi",
+ [0x0A74] = "ekonkargurmukhi",
+ [0x0A81] = "candrabindugujarati",
+ [0x0A82] = "anusvaragujarati",
+ [0x0A83] = "visargagujarati",
+ [0x0A85] = "agujarati",
+ [0x0A86] = "aagujarati",
+ [0x0A87] = "igujarati",
+ [0x0A88] = "iigujarati",
+ [0x0A89] = "ugujarati",
+ [0x0A8A] = "uugujarati",
+ [0x0A8B] = "rvocalicgujarati",
+ [0x0A8D] = "ecandragujarati",
+ [0x0A8F] = "egujarati",
+ [0x0A90] = "aigujarati",
+ [0x0A91] = "ocandragujarati",
+ [0x0A93] = "ogujarati",
+ [0x0A94] = "augujarati",
+ [0x0A95] = "kagujarati",
+ [0x0A96] = "khagujarati",
+ [0x0A97] = "gagujarati",
+ [0x0A98] = "ghagujarati",
+ [0x0A99] = "ngagujarati",
+ [0x0A9A] = "cagujarati",
+ [0x0A9B] = "chagujarati",
+ [0x0A9C] = "jagujarati",
+ [0x0A9D] = "jhagujarati",
+ [0x0A9E] = "nyagujarati",
+ [0x0A9F] = "ttagujarati",
+ [0x0AA0] = "tthagujarati",
+ [0x0AA1] = "ddagujarati",
+ [0x0AA2] = "ddhagujarati",
+ [0x0AA3] = "nnagujarati",
+ [0x0AA4] = "tagujarati",
+ [0x0AA5] = "thagujarati",
+ [0x0AA6] = "dagujarati",
+ [0x0AA7] = "dhagujarati",
+ [0x0AA8] = "nagujarati",
+ [0x0AAA] = "pagujarati",
+ [0x0AAB] = "phagujarati",
+ [0x0AAC] = "bagujarati",
+ [0x0AAD] = "bhagujarati",
+ [0x0AAE] = "magujarati",
+ [0x0AAF] = "yagujarati",
+ [0x0AB0] = "ragujarati",
+ [0x0AB2] = "lagujarati",
+ [0x0AB3] = "llagujarati",
+ [0x0AB5] = "vagujarati",
+ [0x0AB6] = "shagujarati",
+ [0x0AB7] = "ssagujarati",
+ [0x0AB8] = "sagujarati",
+ [0x0AB9] = "hagujarati",
+ [0x0ABC] = "nuktagujarati",
+ [0x0ABE] = "aavowelsigngujarati",
+ [0x0ABF] = "ivowelsigngujarati",
+ [0x0AC0] = "iivowelsigngujarati",
+ [0x0AC1] = "uvowelsigngujarati",
+ [0x0AC2] = "uuvowelsigngujarati",
+ [0x0AC3] = "rvocalicvowelsigngujarati",
+ [0x0AC4] = "rrvocalicvowelsigngujarati",
+ [0x0AC5] = "ecandravowelsigngujarati",
+ [0x0AC7] = "evowelsigngujarati",
+ [0x0AC8] = "aivowelsigngujarati",
+ [0x0AC9] = "ocandravowelsigngujarati",
+ [0x0ACB] = "ovowelsigngujarati",
+ [0x0ACC] = "auvowelsigngujarati",
+ [0x0ACD] = "viramagujarati",
+ [0x0AD0] = "omgujarati",
+ [0x0AE0] = "rrvocalicgujarati",
+ [0x0AE6] = "zerogujarati",
+ [0x0AE7] = "onegujarati",
+ [0x0AE8] = "twogujarati",
+ [0x0AE9] = "threegujarati",
+ [0x0AEA] = "fourgujarati",
+ [0x0AEB] = "fivegujarati",
+ [0x0AEC] = "sixgujarati",
+ [0x0AED] = "sevengujarati",
+ [0x0AEE] = "eightgujarati",
+ [0x0AEF] = "ninegujarati",
+ [0x0E01] = "kokaithai",
+ [0x0E02] = "khokhaithai",
+ [0x0E03] = "khokhuatthai",
+ [0x0E04] = "khokhwaithai",
+ [0x0E05] = "khokhonthai",
+ [0x0E06] = "khorakhangthai",
+ [0x0E07] = "ngonguthai",
+ [0x0E08] = "chochanthai",
+ [0x0E09] = "chochingthai",
+ [0x0E0A] = "chochangthai",
+ [0x0E0B] = "sosothai",
+ [0x0E0C] = "chochoethai",
+ [0x0E0D] = "yoyingthai",
+ [0x0E0E] = "dochadathai",
+ [0x0E0F] = "topatakthai",
+ [0x0E10] = "thothanthai",
+ [0x0E11] = "thonangmonthothai",
+ [0x0E12] = "thophuthaothai",
+ [0x0E13] = "nonenthai",
+ [0x0E14] = "dodekthai",
+ [0x0E15] = "totaothai",
+ [0x0E16] = "thothungthai",
+ [0x0E17] = "thothahanthai",
+ [0x0E18] = "thothongthai",
+ [0x0E19] = "nonuthai",
+ [0x0E1A] = "bobaimaithai",
+ [0x0E1B] = "poplathai",
+ [0x0E1C] = "phophungthai",
+ [0x0E1D] = "fofathai",
+ [0x0E1E] = "phophanthai",
+ [0x0E1F] = "fofanthai",
+ [0x0E20] = "phosamphaothai",
+ [0x0E21] = "momathai",
+ [0x0E22] = "yoyakthai",
+ [0x0E23] = "roruathai",
+ [0x0E24] = "ruthai",
+ [0x0E25] = "lolingthai",
+ [0x0E26] = "luthai",
+ [0x0E27] = "wowaenthai",
+ [0x0E28] = "sosalathai",
+ [0x0E29] = "sorusithai",
+ [0x0E2A] = "sosuathai",
+ [0x0E2B] = "hohipthai",
+ [0x0E2C] = "lochulathai",
+ [0x0E2D] = "oangthai",
+ [0x0E2E] = "honokhukthai",
+ [0x0E2F] = "paiyannoithai",
+ [0x0E30] = "saraathai",
+ [0x0E31] = "maihanakatthai",
+ [0x0E32] = "saraaathai",
+ [0x0E33] = "saraamthai",
+ [0x0E34] = "saraithai",
+ [0x0E35] = "saraiithai",
+ [0x0E36] = "sarauethai",
+ [0x0E37] = "saraueethai",
+ [0x0E38] = "sarauthai",
+ [0x0E39] = "sarauuthai",
+ [0x0E3A] = "phinthuthai",
+ [0x0E3F] = "bahtthai",
+ [0x0E40] = "saraethai",
+ [0x0E41] = "saraaethai",
+ [0x0E42] = "saraothai",
+ [0x0E43] = "saraaimaimuanthai",
+ [0x0E44] = "saraaimaimalaithai",
+ [0x0E45] = "lakkhangyaothai",
+ [0x0E46] = "maiyamokthai",
+ [0x0E47] = "maitaikhuthai",
+ [0x0E48] = "maiekthai",
+ [0x0E49] = "maithothai",
+ [0x0E4A] = "maitrithai",
+ [0x0E4B] = "maichattawathai",
+ [0x0E4C] = "thanthakhatthai",
+ [0x0E4D] = "nikhahitthai",
+ [0x0E4E] = "yamakkanthai",
+ [0x0E4F] = "fongmanthai",
+ [0x0E50] = "zerothai",
+ [0x0E51] = "onethai",
+ [0x0E52] = "twothai",
+ [0x0E53] = "threethai",
+ [0x0E54] = "fourthai",
+ [0x0E55] = "fivethai",
+ [0x0E56] = "sixthai",
+ [0x0E57] = "seventhai",
+ [0x0E58] = "eightthai",
+ [0x0E59] = "ninethai",
+ [0x0E5A] = "angkhankhuthai",
+ [0x0E5B] = "khomutthai",
+ [0x1E00] = "Aringbelow",
+ [0x1E01] = "aringbelow",
+ [0x1E02] = "Bdotaccent",
+ [0x1E03] = "bdotaccent",
+ [0x1E04] = "Bdotbelow",
+ [0x1E05] = "bdotbelow",
+ [0x1E06] = "Blinebelow",
+ [0x1E07] = "blinebelow",
+ [0x1E08] = "Ccedillaacute",
+ [0x1E09] = "ccedillaacute",
+ [0x1E0A] = "Ddotaccent",
+ [0x1E0B] = "ddotaccent",
+ [0x1E0C] = "Ddotbelow",
+ [0x1E0D] = "ddotbelow",
+ [0x1E0E] = "Dlinebelow",
+ [0x1E0F] = "dlinebelow",
+ [0x1E10] = "Dcedilla",
+ [0x1E11] = "dcedilla",
+ [0x1E12] = "Dcircumflexbelow",
+ [0x1E13] = "dcircumflexbelow",
+ [0x1E14] = "Emacrongrave",
+ [0x1E15] = "emacrongrave",
+ [0x1E16] = "Emacronacute",
+ [0x1E17] = "emacronacute",
+ [0x1E18] = "Ecircumflexbelow",
+ [0x1E19] = "ecircumflexbelow",
+ [0x1E1A] = "Etildebelow",
+ [0x1E1B] = "etildebelow",
+ [0x1E1C] = "Ecedillabreve",
+ [0x1E1D] = "ecedillabreve",
+ [0x1E1E] = "Fdotaccent",
+ [0x1E1F] = "fdotaccent",
+ [0x1E20] = "Gmacron",
+ [0x1E21] = "gmacron",
+ [0x1E22] = "Hdotaccent",
+ [0x1E23] = "hdotaccent",
+ [0x1E24] = "Hdotbelow",
+ [0x1E25] = "hdotbelow",
+ [0x1E26] = "Hdieresis",
+ [0x1E27] = "hdieresis",
+ [0x1E28] = "Hcedilla",
+ [0x1E29] = "hcedilla",
+ [0x1E2A] = "Hbrevebelow",
+ [0x1E2B] = "hbrevebelow",
+ [0x1E2C] = "Itildebelow",
+ [0x1E2D] = "itildebelow",
+ [0x1E2E] = "Idieresisacute",
+ [0x1E2F] = "idieresisacute",
+ [0x1E30] = "Kacute",
+ [0x1E31] = "kacute",
+ [0x1E32] = "Kdotbelow",
+ [0x1E33] = "kdotbelow",
+ [0x1E34] = "Klinebelow",
+ [0x1E35] = "klinebelow",
+ [0x1E36] = "Ldotbelow",
+ [0x1E37] = "ldotbelow",
+ [0x1E38] = "Ldotbelowmacron",
+ [0x1E39] = "ldotbelowmacron",
+ [0x1E3A] = "Llinebelow",
+ [0x1E3B] = "llinebelow",
+ [0x1E3C] = "Lcircumflexbelow",
+ [0x1E3D] = "lcircumflexbelow",
+ [0x1E3E] = "Macute",
+ [0x1E3F] = "macute",
+ [0x1E40] = "Mdotaccent",
+ [0x1E41] = "mdotaccent",
+ [0x1E42] = "Mdotbelow",
+ [0x1E43] = "mdotbelow",
+ [0x1E44] = "Ndotaccent",
+ [0x1E45] = "ndotaccent",
+ [0x1E46] = "Ndotbelow",
+ [0x1E47] = "ndotbelow",
+ [0x1E48] = "Nlinebelow",
+ [0x1E49] = "nlinebelow",
+ [0x1E4A] = "Ncircumflexbelow",
+ [0x1E4B] = "ncircumflexbelow",
+ [0x1E4C] = "Otildeacute",
+ [0x1E4D] = "otildeacute",
+ [0x1E4E] = "Otildedieresis",
+ [0x1E4F] = "otildedieresis",
+ [0x1E50] = "Omacrongrave",
+ [0x1E51] = "omacrongrave",
+ [0x1E52] = "Omacronacute",
+ [0x1E53] = "omacronacute",
+ [0x1E54] = "Pacute",
+ [0x1E55] = "pacute",
+ [0x1E56] = "Pdotaccent",
+ [0x1E57] = "pdotaccent",
+ [0x1E58] = "Rdotaccent",
+ [0x1E59] = "rdotaccent",
+ [0x1E5A] = "Rdotbelow",
+ [0x1E5B] = "rdotbelow",
+ [0x1E5C] = "Rdotbelowmacron",
+ [0x1E5D] = "rdotbelowmacron",
+ [0x1E5E] = "Rlinebelow",
+ [0x1E5F] = "rlinebelow",
+ [0x1E60] = "Sdotaccent",
+ [0x1E61] = "sdotaccent",
+ [0x1E62] = "Sdotbelow",
+ [0x1E63] = "sdotbelow",
+ [0x1E64] = "Sacutedotaccent",
+ [0x1E65] = "sacutedotaccent",
+ [0x1E66] = "Scarondotaccent",
+ [0x1E67] = "scarondotaccent",
+ [0x1E68] = "Sdotbelowdotaccent",
+ [0x1E69] = "sdotbelowdotaccent",
+ [0x1E6A] = "Tdotaccent",
+ [0x1E6B] = "tdotaccent",
+ [0x1E6C] = "Tdotbelow",
+ [0x1E6D] = "tdotbelow",
+ [0x1E6E] = "Tlinebelow",
+ [0x1E6F] = "tlinebelow",
+ [0x1E70] = "Tcircumflexbelow",
+ [0x1E71] = "tcircumflexbelow",
+ [0x1E72] = "Udieresisbelow",
+ [0x1E73] = "udieresisbelow",
+ [0x1E74] = "Utildebelow",
+ [0x1E75] = "utildebelow",
+ [0x1E76] = "Ucircumflexbelow",
+ [0x1E77] = "ucircumflexbelow",
+ [0x1E78] = "Utildeacute",
+ [0x1E79] = "utildeacute",
+ [0x1E7A] = "Umacrondieresis",
+ [0x1E7B] = "umacrondieresis",
+ [0x1E7C] = "Vtilde",
+ [0x1E7D] = "vtilde",
+ [0x1E7E] = "Vdotbelow",
+ [0x1E7F] = "vdotbelow",
+ [0x1E80] = "Wgrave",
+ [0x1E81] = "wgrave",
+ [0x1E82] = "Wacute",
+ [0x1E83] = "wacute",
+ [0x1E84] = "Wdieresis",
+ [0x1E85] = "wdieresis",
+ [0x1E86] = "Wdotaccent",
+ [0x1E87] = "wdotaccent",
+ [0x1E88] = "Wdotbelow",
+ [0x1E89] = "wdotbelow",
+ [0x1E8A] = "Xdotaccent",
+ [0x1E8B] = "xdotaccent",
+ [0x1E8C] = "Xdieresis",
+ [0x1E8D] = "xdieresis",
+ [0x1E8E] = "Ydotaccent",
+ [0x1E8F] = "ydotaccent",
+ [0x1E90] = "Zcircumflex",
+ [0x1E91] = "zcircumflex",
+ [0x1E92] = "Zdotbelow",
+ [0x1E93] = "zdotbelow",
+ [0x1E94] = "Zlinebelow",
+ [0x1E95] = "zlinebelow",
+ [0x1E96] = "hlinebelow",
+ [0x1E97] = "tdieresis",
+ [0x1E98] = "wring",
+ [0x1E99] = "yring",
+ [0x1E9A] = "arighthalfring",
+ [0x1E9B] = "slongdotaccent",
+ [0x1EA0] = "Adotbelow",
+ [0x1EA1] = "adotbelow",
+ [0x1EA2] = "Ahookabove",
+ [0x1EA3] = "ahookabove",
+ [0x1EA4] = "Acircumflexacute",
+ [0x1EA5] = "acircumflexacute",
+ [0x1EA6] = "Acircumflexgrave",
+ [0x1EA7] = "acircumflexgrave",
+ [0x1EA8] = "Acircumflexhookabove",
+ [0x1EA9] = "acircumflexhookabove",
+ [0x1EAA] = "Acircumflextilde",
+ [0x1EAB] = "acircumflextilde",
+ [0x1EAC] = "Acircumflexdotbelow",
+ [0x1EAD] = "acircumflexdotbelow",
+ [0x1EAE] = "Abreveacute",
+ [0x1EAF] = "abreveacute",
+ [0x1EB0] = "Abrevegrave",
+ [0x1EB1] = "abrevegrave",
+ [0x1EB2] = "Abrevehookabove",
+ [0x1EB3] = "abrevehookabove",
+ [0x1EB4] = "Abrevetilde",
+ [0x1EB5] = "abrevetilde",
+ [0x1EB6] = "Abrevedotbelow",
+ [0x1EB7] = "abrevedotbelow",
+ [0x1EB8] = "Edotbelow",
+ [0x1EB9] = "edotbelow",
+ [0x1EBA] = "Ehookabove",
+ [0x1EBB] = "ehookabove",
+ [0x1EBC] = "Etilde",
+ [0x1EBD] = "etilde",
+ [0x1EBE] = "Ecircumflexacute",
+ [0x1EBF] = "ecircumflexacute",
+ [0x1EC0] = "Ecircumflexgrave",
+ [0x1EC1] = "ecircumflexgrave",
+ [0x1EC2] = "Ecircumflexhookabove",
+ [0x1EC3] = "ecircumflexhookabove",
+ [0x1EC4] = "Ecircumflextilde",
+ [0x1EC5] = "ecircumflextilde",
+ [0x1EC6] = "Ecircumflexdotbelow",
+ [0x1EC7] = "ecircumflexdotbelow",
+ [0x1EC8] = "Ihookabove",
+ [0x1EC9] = "ihookabove",
+ [0x1ECA] = "Idotbelow",
+ [0x1ECB] = "idotbelow",
+ [0x1ECC] = "Odotbelow",
+ [0x1ECD] = "odotbelow",
+ [0x1ECE] = "Ohookabove",
+ [0x1ECF] = "ohookabove",
+ [0x1ED0] = "Ocircumflexacute",
+ [0x1ED1] = "ocircumflexacute",
+ [0x1ED2] = "Ocircumflexgrave",
+ [0x1ED3] = "ocircumflexgrave",
+ [0x1ED4] = "Ocircumflexhookabove",
+ [0x1ED5] = "ocircumflexhookabove",
+ [0x1ED6] = "Ocircumflextilde",
+ [0x1ED7] = "ocircumflextilde",
+ [0x1ED8] = "Ocircumflexdotbelow",
+ [0x1ED9] = "ocircumflexdotbelow",
+ [0x1EDA] = "Ohornacute",
+ [0x1EDB] = "ohornacute",
+ [0x1EDC] = "Ohorngrave",
+ [0x1EDD] = "ohorngrave",
+ [0x1EDE] = "Ohornhookabove",
+ [0x1EDF] = "ohornhookabove",
+ [0x1EE0] = "Ohorntilde",
+ [0x1EE1] = "ohorntilde",
+ [0x1EE2] = "Ohorndotbelow",
+ [0x1EE3] = "ohorndotbelow",
+ [0x1EE4] = "Udotbelow",
+ [0x1EE5] = "udotbelow",
+ [0x1EE6] = "Uhookabove",
+ [0x1EE7] = "uhookabove",
+ [0x1EE8] = "Uhornacute",
+ [0x1EE9] = "uhornacute",
+ [0x1EEA] = "Uhorngrave",
+ [0x1EEB] = "uhorngrave",
+ [0x1EEC] = "Uhornhookabove",
+ [0x1EED] = "uhornhookabove",
+ [0x1EEE] = "Uhorntilde",
+ [0x1EEF] = "uhorntilde",
+ [0x1EF0] = "Uhorndotbelow",
+ [0x1EF1] = "uhorndotbelow",
+ [0x1EF2] = "Ygrave",
+ [0x1EF3] = "ygrave",
+ [0x1EF4] = "Ydotbelow",
+ [0x1EF5] = "ydotbelow",
+ [0x1EF6] = "Yhookabove",
+ [0x1EF7] = "yhookabove",
+ [0x1EF8] = "Ytilde",
+ [0x1EF9] = "ytilde",
+ [0x2002] = "enspace",
+ [0x200B] = "zerowidthspace",
+ [0x200C] = "zerowidthnonjoiner",
+ [0x200D] = "afii301",
+ [0x200E] = "afii299",
+ [0x200F] = "afii300",
+ [0x2010] = "hyphentwo",
+ [0x2012] = "figuredash",
+ [0x2013] = "endash",
+ [0x2014] = "emdash",
+ [0x2015] = "horizontalbar",
+ [0x2016] = "dblverticalbar",
+ [0x2017] = "underscoredbl",
+ [0x2018] = "quoteleft",
+ [0x2019] = "quoteright",
+ [0x201A] = "quotesinglbase",
+ [0x201B] = "quotereversed",
+ [0x201C] = "quotedblleft",
+ [0x201D] = "quotedblright",
+ [0x201E] = "quotedblbase",
+ [0x2020] = "dagger",
+ [0x2021] = "daggerdbl",
+ [0x2022] = "bullet",
+ [0x2024] = "onedotenleader",
+ [0x2025] = "twodotleader",
+ [0x2026] = "ellipsis",
+ [0x202C] = "afii61573",
+ [0x202D] = "afii61574",
+ [0x202E] = "afii61575",
+ [0x2030] = "perthousand",
+ [0x2032] = "minute",
+ [0x2033] = "second",
+ [0x2035] = "primereversed",
+ [0x2039] = "guilsinglleft",
+ [0x203A] = "guilsinglright",
+ [0x203B] = "referencemark",
+ [0x203C] = "exclamdbl",
+ [0x203E] = "overline",
+ [0x2042] = "asterism",
+ [0x2044] = "fraction",
+ [0x2070] = "zerosuperior",
+ [0x2074] = "foursuperior",
+ [0x2075] = "fivesuperior",
+ [0x2076] = "sixsuperior",
+ [0x2077] = "sevensuperior",
+ [0x2078] = "eightsuperior",
+ [0x2079] = "ninesuperior",
+ [0x207A] = "plussuperior",
+ [0x207C] = "equalsuperior",
+ [0x207D] = "parenleftsuperior",
+ [0x207E] = "parenrightsuperior",
+ [0x207F] = "nsuperior",
+ [0x2080] = "zeroinferior",
+ [0x2081] = "oneinferior",
+ [0x2082] = "twoinferior",
+ [0x2083] = "threeinferior",
+ [0x2084] = "fourinferior",
+ [0x2085] = "fiveinferior",
+ [0x2086] = "sixinferior",
+ [0x2087] = "seveninferior",
+ [0x2088] = "eightinferior",
+ [0x2089] = "nineinferior",
+ [0x208D] = "parenleftinferior",
+ [0x208E] = "parenrightinferior",
+ [0x20A1] = "colonsign",
+ [0x20A2] = "cruzeiro",
+ [0x20A3] = "franc",
+ [0x20A4] = "lira",
+ [0x20A7] = "peseta",
+ [0x20A9] = "won",
+ [0x20AA] = "sheqelhebrew",
+ [0x20AB] = "dong",
+ [0x20AC] = "euro",
+ [0x2103] = "centigrade",
+ [0x2105] = "careof",
+ [0x2109] = "fahrenheit",
+ [0x2111] = "Ifraktur",
+ [0x2113] = "lsquare",
+ [0x2116] = "numero",
+ [0x2118] = "weierstrass",
+ [0x211C] = "Rfraktur",
+ [0x211E] = "prescription",
+ [0x2121] = "telephone",
+ [0x2122] = "trademark",
+ [0x2126] = "Omega",
+ [0x212B] = "angstrom",
+ [0x212E] = "estimated",
+ [0x2135] = "aleph",
+ [0x2153] = "onethird",
+ [0x2154] = "twothirds",
+ [0x215B] = "oneeighth",
+ [0x215C] = "threeeighths",
+ [0x215D] = "fiveeighths",
+ [0x215E] = "seveneighths",
+ [0x2160] = "Oneroman",
+ [0x2161] = "Tworoman",
+ [0x2162] = "Threeroman",
+ [0x2163] = "Fourroman",
+ [0x2164] = "Fiveroman",
+ [0x2165] = "Sixroman",
+ [0x2166] = "Sevenroman",
+ [0x2167] = "Eightroman",
+ [0x2168] = "Nineroman",
+ [0x2169] = "Tenroman",
+ [0x216A] = "Elevenroman",
+ [0x216B] = "Twelveroman",
+ [0x2170] = "oneroman",
+ [0x2171] = "tworoman",
+ [0x2172] = "threeroman",
+ [0x2173] = "fourroman",
+ [0x2174] = "fiveroman",
+ [0x2175] = "sixroman",
+ [0x2176] = "sevenroman",
+ [0x2177] = "eightroman",
+ [0x2178] = "nineroman",
+ [0x2179] = "tenroman",
+ [0x217A] = "elevenroman",
+ [0x217B] = "twelveroman",
+ [0x2190] = "arrowleft",
+ [0x2191] = "arrowup",
+ [0x2192] = "arrowright",
+ [0x2193] = "arrowdown",
+ [0x2194] = "arrowboth",
+ [0x2195] = "arrowupdn",
+ [0x2196] = "arrowupleft",
+ [0x2197] = "arrowupright",
+ [0x2198] = "arrowdownright",
+ [0x2199] = "arrowdownleft",
+ [0x21A8] = "arrowupdownbase",
+ [0x21B5] = "carriagereturn",
+ [0x21BC] = "harpoonleftbarbup",
+ [0x21C0] = "harpoonrightbarbup",
+ [0x21C4] = "arrowrightoverleft",
+ [0x21C5] = "arrowupleftofdown",
+ [0x21C6] = "arrowleftoverright",
+ [0x21CD] = "arrowleftdblstroke",
+ [0x21CF] = "arrowrightdblstroke",
+ [0x21D0] = "arrowleftdbl",
+ [0x21D1] = "arrowdblup",
+ [0x21D2] = "dblarrowright",
+ [0x21D3] = "arrowdbldown",
+ [0x21D4] = "dblarrowleft",
+ [0x21DE] = "pageup",
+ [0x21DF] = "pagedown",
+ [0x21E0] = "arrowdashleft",
+ [0x21E1] = "arrowdashup",
+ [0x21E2] = "arrowdashright",
+ [0x21E3] = "arrowdashdown",
+ [0x21E4] = "arrowtableft",
+ [0x21E5] = "arrowtabright",
+ [0x21E6] = "arrowleftwhite",
+ [0x21E7] = "arrowupwhite",
+ [0x21E8] = "arrowrightwhite",
+ [0x21E9] = "arrowdownwhite",
+ [0x21EA] = "capslock",
+ [0x2200] = "universal",
+ [0x2202] = "partialdiff",
+ [0x2203] = "thereexists",
+ [0x2205] = "emptyset",
+ [0x2206] = "increment",
+ [0x2207] = "nabla",
+ [0x2208] = "element",
+ [0x2209] = "notelementof",
+ [0x220B] = "suchthat",
+ [0x220C] = "notcontains",
+ [0x220F] = "product",
+ [0x2211] = "summation",
+ [0x2212] = "minus",
+ [0x2213] = "minusplus",
+ [0x2215] = "divisionslash",
+ [0x2217] = "asteriskmath",
+ [0x2219] = "bulletoperator",
+ [0x221A] = "radical",
+ [0x221D] = "proportional",
+ [0x221E] = "infinity",
+ [0x221F] = "rightangle",
+ [0x2220] = "angle",
+ [0x2223] = "divides",
+ [0x2225] = "parallel",
+ [0x2226] = "notparallel",
+ [0x2227] = "logicaland",
+ [0x2228] = "logicalor",
+ [0x2229] = "intersection",
+ [0x222A] = "union",
+ [0x222B] = "integral",
+ [0x222C] = "dblintegral",
+ [0x222E] = "contourintegral",
+ [0x2234] = "therefore",
+ [0x2235] = "because",
+ [0x2236] = "ratio",
+ [0x2237] = "proportion",
+ [0x223C] = "tildeoperator",
+ [0x223D] = "reversedtilde",
+ [0x2243] = "asymptoticallyequal",
+ [0x2245] = "congruent",
+ [0x2248] = "approxequal",
+ [0x224C] = "allequal",
+ [0x2250] = "approaches",
+ [0x2251] = "geometricallyequal",
+ [0x2252] = "approxequalorimage",
+ [0x2253] = "imageorapproximatelyequal",
+ [0x2260] = "notequal",
+ [0x2261] = "equivalence",
+ [0x2262] = "notidentical",
+ [0x2264] = "lessequal",
+ [0x2265] = "greaterequal",
+ [0x2266] = "lessoverequal",
+ [0x2267] = "greateroverequal",
+ [0x226A] = "muchless",
+ [0x226B] = "muchgreater",
+ [0x226E] = "notless",
+ [0x226F] = "notgreater",
+ [0x2270] = "notlessnorequal",
+ [0x2271] = "notgreaternorequal",
+ [0x2272] = "lessorequivalent",
+ [0x2273] = "greaterorequivalent",
+ [0x2276] = "lessorgreater",
+ [0x2277] = "greaterorless",
+ [0x2279] = "notgreaternorless",
+ [0x227A] = "precedes",
+ [0x227B] = "succeeds",
+ [0x2280] = "notprecedes",
+ [0x2281] = "notsucceeds",
+ [0x2282] = "subset",
+ [0x2283] = "superset",
+ [0x2284] = "notsubset",
+ [0x2285] = "notsuperset",
+ [0x2286] = "subsetorequal",
+ [0x2287] = "supersetorequal",
+ [0x228A] = "subsetnotequal",
+ [0x228B] = "supersetnotequal",
+ [0x2295] = "pluscircle",
+ [0x2296] = "minuscircle",
+ [0x2297] = "timescircle",
+ [0x2299] = "circleot",
+ [0x22A3] = "tackleft",
+ [0x22A4] = "tackdown",
+ [0x22A5] = "perpendicular",
+ [0x22BF] = "righttriangle",
+ [0x22C5] = "dotmath",
+ [0x22CE] = "curlyor",
+ [0x22CF] = "curlyand",
+ [0x22DA] = "lessequalorgreater",
+ [0x22DB] = "greaterequalorless",
+ [0x22EE] = "ellipsisvertical",
+ [0x2302] = "house",
+ [0x2303] = "control",
+ [0x2305] = "projective",
+ [0x2310] = "revlogicalnot",
+ [0x2312] = "arc",
+ [0x2318] = "propellor",
+ [0x2320] = "integraltp",
+ [0x2321] = "integralbt",
+ [0x2325] = "option",
+ [0x2326] = "deleteright",
+ [0x2327] = "clear",
+ [0x2329] = "angleleft",
+ [0x232A] = "angleright",
+ [0x232B] = "deleteleft",
+ [0x2423] = "blank",
+ [0x2460] = "onecircle",
+ [0x2461] = "twocircle",
+ [0x2462] = "threecircle",
+ [0x2463] = "fourcircle",
+ [0x2464] = "fivecircle",
+ [0x2465] = "sixcircle",
+ [0x2466] = "sevencircle",
+ [0x2467] = "eightcircle",
+ [0x2468] = "ninecircle",
+ [0x2469] = "tencircle",
+ [0x246A] = "elevencircle",
+ [0x246B] = "twelvecircle",
+ [0x246C] = "thirteencircle",
+ [0x246D] = "fourteencircle",
+ [0x246E] = "fifteencircle",
+ [0x246F] = "sixteencircle",
+ [0x2470] = "seventeencircle",
+ [0x2471] = "eighteencircle",
+ [0x2472] = "nineteencircle",
+ [0x2473] = "twentycircle",
+ [0x2474] = "oneparen",
+ [0x2475] = "twoparen",
+ [0x2476] = "threeparen",
+ [0x2477] = "fourparen",
+ [0x2478] = "fiveparen",
+ [0x2479] = "sixparen",
+ [0x247A] = "sevenparen",
+ [0x247B] = "eightparen",
+ [0x247C] = "nineparen",
+ [0x247D] = "tenparen",
+ [0x247E] = "elevenparen",
+ [0x247F] = "twelveparen",
+ [0x2480] = "thirteenparen",
+ [0x2481] = "fourteenparen",
+ [0x2482] = "fifteenparen",
+ [0x2483] = "sixteenparen",
+ [0x2484] = "seventeenparen",
+ [0x2485] = "eighteenparen",
+ [0x2486] = "nineteenparen",
+ [0x2487] = "twentyparen",
+ [0x2488] = "oneperiod",
+ [0x2489] = "twoperiod",
+ [0x248A] = "threeperiod",
+ [0x248B] = "fourperiod",
+ [0x248C] = "fiveperiod",
+ [0x248D] = "sixperiod",
+ [0x248E] = "sevenperiod",
+ [0x248F] = "eightperiod",
+ [0x2490] = "nineperiod",
+ [0x2491] = "tenperiod",
+ [0x2492] = "elevenperiod",
+ [0x2493] = "twelveperiod",
+ [0x2494] = "thirteenperiod",
+ [0x2495] = "fourteenperiod",
+ [0x2496] = "fifteenperiod",
+ [0x2497] = "sixteenperiod",
+ [0x2498] = "seventeenperiod",
+ [0x2499] = "eighteenperiod",
+ [0x249A] = "nineteenperiod",
+ [0x249B] = "twentyperiod",
+ [0x249C] = "aparen",
+ [0x249D] = "bparen",
+ [0x249E] = "cparen",
+ [0x249F] = "dparen",
+ [0x24A0] = "eparen",
+ [0x24A1] = "fparen",
+ [0x24A2] = "gparen",
+ [0x24A3] = "hparen",
+ [0x24A4] = "iparen",
+ [0x24A5] = "jparen",
+ [0x24A6] = "kparen",
+ [0x24A7] = "lparen",
+ [0x24A8] = "mparen",
+ [0x24A9] = "nparen",
+ [0x24AA] = "oparen",
+ [0x24AB] = "pparen",
+ [0x24AC] = "qparen",
+ [0x24AD] = "rparen",
+ [0x24AE] = "sparen",
+ [0x24AF] = "tparen",
+ [0x24B0] = "uparen",
+ [0x24B1] = "vparen",
+ [0x24B2] = "wparen",
+ [0x24B3] = "xparen",
+ [0x24B4] = "yparen",
+ [0x24B5] = "zparen",
+ [0x24B6] = "Acircle",
+ [0x24B7] = "Bcircle",
+ [0x24B8] = "Ccircle",
+ [0x24B9] = "Dcircle",
+ [0x24BA] = "Ecircle",
+ [0x24BB] = "Fcircle",
+ [0x24BC] = "Gcircle",
+ [0x24BD] = "Hcircle",
+ [0x24BE] = "Icircle",
+ [0x24BF] = "Jcircle",
+ [0x24C0] = "Kcircle",
+ [0x24C1] = "Lcircle",
+ [0x24C2] = "Mcircle",
+ [0x24C3] = "Ncircle",
+ [0x24C4] = "Ocircle",
+ [0x24C5] = "Pcircle",
+ [0x24C6] = "Qcircle",
+ [0x24C7] = "Rcircle",
+ [0x24C8] = "Scircle",
+ [0x24C9] = "Tcircle",
+ [0x24CA] = "Ucircle",
+ [0x24CB] = "Vcircle",
+ [0x24CC] = "Wcircle",
+ [0x24CD] = "Xcircle",
+ [0x24CE] = "Ycircle",
+ [0x24CF] = "Zcircle",
+ [0x24D0] = "acircle",
+ [0x24D1] = "bcircle",
+ [0x24D2] = "ccircle",
+ [0x24D3] = "dcircle",
+ [0x24D4] = "ecircle",
+ [0x24D5] = "fcircle",
+ [0x24D6] = "gcircle",
+ [0x24D7] = "hcircle",
+ [0x24D8] = "icircle",
+ [0x24D9] = "jcircle",
+ [0x24DA] = "kcircle",
+ [0x24DB] = "lcircle",
+ [0x24DC] = "mcircle",
+ [0x24DD] = "ncircle",
+ [0x24DE] = "ocircle",
+ [0x24DF] = "pcircle",
+ [0x24E0] = "qcircle",
+ [0x24E1] = "rcircle",
+ [0x24E2] = "scircle",
+ [0x24E3] = "tcircle",
+ [0x24E4] = "ucircle",
+ [0x24E5] = "vcircle",
+ [0x24E6] = "wcircle",
+ [0x24E7] = "xcircle",
+ [0x24E8] = "ycircle",
+ [0x24E9] = "zcircle",
+ [0x2500] = "SF100000",
+ [0x2502] = "SF110000",
+ [0x250C] = "SF010000",
+ [0x2510] = "SF030000",
+ [0x2514] = "SF020000",
+ [0x2518] = "SF040000",
+ [0x251C] = "SF080000",
+ [0x2524] = "SF090000",
+ [0x252C] = "SF060000",
+ [0x2534] = "SF070000",
+ [0x253C] = "SF050000",
+ [0x2550] = "SF430000",
+ [0x2551] = "SF240000",
+ [0x2552] = "SF510000",
+ [0x2553] = "SF520000",
+ [0x2554] = "SF390000",
+ [0x2555] = "SF220000",
+ [0x2556] = "SF210000",
+ [0x2557] = "SF250000",
+ [0x2558] = "SF500000",
+ [0x2559] = "SF490000",
+ [0x255A] = "SF380000",
+ [0x255B] = "SF280000",
+ [0x255C] = "SF270000",
+ [0x255D] = "SF260000",
+ [0x255E] = "SF360000",
+ [0x255F] = "SF370000",
+ [0x2560] = "SF420000",
+ [0x2561] = "SF190000",
+ [0x2562] = "SF200000",
+ [0x2563] = "SF230000",
+ [0x2564] = "SF470000",
+ [0x2565] = "SF480000",
+ [0x2566] = "SF410000",
+ [0x2567] = "SF450000",
+ [0x2568] = "SF460000",
+ [0x2569] = "SF400000",
+ [0x256A] = "SF540000",
+ [0x256B] = "SF530000",
+ [0x256C] = "SF440000",
+ [0x2580] = "upblock",
+ [0x2584] = "dnblock",
+ [0x2588] = "block",
+ [0x258C] = "lfblock",
+ [0x2590] = "rtblock",
+ [0x2591] = "shadelight",
+ [0x2592] = "shademedium",
+ [0x2593] = "shadedark",
+ [0x25A0] = "filledbox",
+ [0x25A1] = "whitesquare",
+ [0x25A3] = "squarewhitewithsmallblack",
+ [0x25A4] = "squarehorizontalfill",
+ [0x25A5] = "squareverticalfill",
+ [0x25A6] = "squareorthogonalcrosshatchfill",
+ [0x25A7] = "squareupperlefttolowerrightfill",
+ [0x25A8] = "squareupperrighttolowerleftfill",
+ [0x25A9] = "squarediagonalcrosshatchfill",
+ [0x25AA] = "blacksmallsquare",
+ [0x25AB] = "whitesmallsquare",
+ [0x25AC] = "filledrect",
+ [0x25B2] = "triagup",
+ [0x25B3] = "whiteuppointingtriangle",
+ [0x25B4] = "blackuppointingsmalltriangle",
+ [0x25B5] = "whiteuppointingsmalltriangle",
+ [0x25B6] = "blackrightpointingtriangle",
+ [0x25B7] = "whiterightpointingtriangle",
+ [0x25B9] = "whiterightpointingsmalltriangle",
+ [0x25BA] = "triagrt",
+ [0x25BC] = "triagdn",
+ [0x25BD] = "whitedownpointingtriangle",
+ [0x25BF] = "whitedownpointingsmalltriangle",
+ [0x25C0] = "blackleftpointingtriangle",
+ [0x25C1] = "whiteleftpointingtriangle",
+ [0x25C3] = "whiteleftpointingsmalltriangle",
+ [0x25C4] = "triaglf",
+ [0x25C6] = "blackdiamond",
+ [0x25C7] = "whitediamond",
+ [0x25C8] = "whitediamondcontainingblacksmalldiamond",
+ [0x25C9] = "fisheye",
+ [0x25CA] = "lozenge",
+ [0x25CB] = "whitecircle",
+ [0x25CC] = "dottedcircle",
+ [0x25CE] = "bullseye",
+ [0x25CF] = "blackcircle",
+ [0x25D0] = "circlewithlefthalfblack",
+ [0x25D1] = "circlewithrighthalfblack",
+ [0x25D8] = "invbullet",
+ [0x25D9] = "whitecircleinverse",
+ [0x25E2] = "blacklowerrighttriangle",
+ [0x25E3] = "blacklowerlefttriangle",
+ [0x25E4] = "blackupperlefttriangle",
+ [0x25E5] = "blackupperrighttriangle",
+ [0x25E6] = "whitebullet",
+ [0x25EF] = "largecircle",
+ [0x2605] = "blackstar",
+ [0x2606] = "whitestar",
+ [0x260E] = "telephoneblack",
+ [0x260F] = "whitetelephone",
+ [0x261C] = "pointingindexleftwhite",
+ [0x261D] = "pointingindexupwhite",
+ [0x261E] = "pointingindexrightwhite",
+ [0x261F] = "pointingindexdownwhite",
+ [0x262F] = "yinyang",
+ [0x263A] = "whitesmilingface",
+ [0x263B] = "invsmileface",
+ [0x263C] = "sun",
+ [0x2640] = "venus",
+ [0x2641] = "earth",
+ [0x2642] = "mars",
+ [0x2660] = "spadesuitblack",
+ [0x2661] = "heartsuitwhite",
+ [0x2662] = "diamondsuitwhite",
+ [0x2663] = "clubsuitblack",
+ [0x2664] = "spadesuitwhite",
+ [0x2665] = "heartsuitblack",
+ [0x2666] = "diamond",
+ [0x2667] = "clubsuitwhite",
+ [0x2668] = "hotsprings",
+ [0x2669] = "quarternote",
+ [0x266A] = "musicalnote",
+ [0x266B] = "musicalnotedbl",
+ [0x266C] = "beamedsixteenthnotes",
+ [0x266D] = "musicflatsign",
+ [0x266F] = "musicsharpsign",
+ [0x2713] = "checkmark",
+ [0x278A] = "onecircleinversesansserif",
+ [0x278B] = "twocircleinversesansserif",
+ [0x278C] = "threecircleinversesansserif",
+ [0x278D] = "fourcircleinversesansserif",
+ [0x278E] = "fivecircleinversesansserif",
+ [0x278F] = "sixcircleinversesansserif",
+ [0x2790] = "sevencircleinversesansserif",
+ [0x2791] = "eightcircleinversesansserif",
+ [0x2792] = "ninecircleinversesansserif",
+ [0x279E] = "arrowrightheavy",
+ [0x3000] = "ideographicspace",
+ [0x3001] = "ideographiccomma",
+ [0x3002] = "ideographicperiod",
+ [0x3003] = "dittomark",
+ [0x3004] = "jis",
+ [0x3005] = "ideographiciterationmark",
+ [0x3006] = "ideographicclose",
+ [0x3007] = "ideographiczero",
+ [0x3008] = "anglebracketleft",
+ [0x3009] = "anglebracketright",
+ [0x300A] = "dblanglebracketleft",
+ [0x300B] = "dblanglebracketright",
+ [0x300C] = "cornerbracketleft",
+ [0x300D] = "cornerbracketright",
+ [0x300E] = "whitecornerbracketleft",
+ [0x300F] = "whitecornerbracketright",
+ [0x3010] = "blacklenticularbracketleft",
+ [0x3011] = "blacklenticularbracketright",
+ [0x3012] = "postalmark",
+ [0x3013] = "getamark",
+ [0x3014] = "tortoiseshellbracketleft",
+ [0x3015] = "tortoiseshellbracketright",
+ [0x3016] = "whitelenticularbracketleft",
+ [0x3017] = "whitelenticularbracketright",
+ [0x3018] = "whitetortoiseshellbracketleft",
+ [0x3019] = "whitetortoiseshellbracketright",
+ [0x301C] = "wavedash",
+ [0x301D] = "quotedblprimereversed",
+ [0x301E] = "quotedblprime",
+ [0x3020] = "postalmarkface",
+ [0x3021] = "onehangzhou",
+ [0x3022] = "twohangzhou",
+ [0x3023] = "threehangzhou",
+ [0x3024] = "fourhangzhou",
+ [0x3025] = "fivehangzhou",
+ [0x3026] = "sixhangzhou",
+ [0x3027] = "sevenhangzhou",
+ [0x3028] = "eighthangzhou",
+ [0x3029] = "ninehangzhou",
+ [0x3036] = "circlepostalmark",
+ [0x3041] = "asmallhiragana",
+ [0x3042] = "ahiragana",
+ [0x3043] = "ismallhiragana",
+ [0x3044] = "ihiragana",
+ [0x3045] = "usmallhiragana",
+ [0x3046] = "uhiragana",
+ [0x3047] = "esmallhiragana",
+ [0x3048] = "ehiragana",
+ [0x3049] = "osmallhiragana",
+ [0x304A] = "ohiragana",
+ [0x304B] = "kahiragana",
+ [0x304C] = "gahiragana",
+ [0x304D] = "kihiragana",
+ [0x304E] = "gihiragana",
+ [0x304F] = "kuhiragana",
+ [0x3050] = "guhiragana",
+ [0x3051] = "kehiragana",
+ [0x3052] = "gehiragana",
+ [0x3053] = "kohiragana",
+ [0x3054] = "gohiragana",
+ [0x3055] = "sahiragana",
+ [0x3056] = "zahiragana",
+ [0x3057] = "sihiragana",
+ [0x3058] = "zihiragana",
+ [0x3059] = "suhiragana",
+ [0x305A] = "zuhiragana",
+ [0x305B] = "sehiragana",
+ [0x305C] = "zehiragana",
+ [0x305D] = "sohiragana",
+ [0x305E] = "zohiragana",
+ [0x305F] = "tahiragana",
+ [0x3060] = "dahiragana",
+ [0x3061] = "tihiragana",
+ [0x3062] = "dihiragana",
+ [0x3063] = "tusmallhiragana",
+ [0x3064] = "tuhiragana",
+ [0x3065] = "duhiragana",
+ [0x3066] = "tehiragana",
+ [0x3067] = "dehiragana",
+ [0x3068] = "tohiragana",
+ [0x3069] = "dohiragana",
+ [0x306A] = "nahiragana",
+ [0x306B] = "nihiragana",
+ [0x306C] = "nuhiragana",
+ [0x306D] = "nehiragana",
+ [0x306E] = "nohiragana",
+ [0x306F] = "hahiragana",
+ [0x3070] = "bahiragana",
+ [0x3071] = "pahiragana",
+ [0x3072] = "hihiragana",
+ [0x3073] = "bihiragana",
+ [0x3074] = "pihiragana",
+ [0x3075] = "huhiragana",
+ [0x3076] = "buhiragana",
+ [0x3077] = "puhiragana",
+ [0x3078] = "hehiragana",
+ [0x3079] = "behiragana",
+ [0x307A] = "pehiragana",
+ [0x307B] = "hohiragana",
+ [0x307C] = "bohiragana",
+ [0x307D] = "pohiragana",
+ [0x307E] = "mahiragana",
+ [0x307F] = "mihiragana",
+ [0x3080] = "muhiragana",
+ [0x3081] = "mehiragana",
+ [0x3082] = "mohiragana",
+ [0x3083] = "yasmallhiragana",
+ [0x3084] = "yahiragana",
+ [0x3085] = "yusmallhiragana",
+ [0x3086] = "yuhiragana",
+ [0x3087] = "yosmallhiragana",
+ [0x3088] = "yohiragana",
+ [0x3089] = "rahiragana",
+ [0x308A] = "rihiragana",
+ [0x308B] = "ruhiragana",
+ [0x308C] = "rehiragana",
+ [0x308D] = "rohiragana",
+ [0x308E] = "wasmallhiragana",
+ [0x308F] = "wahiragana",
+ [0x3090] = "wihiragana",
+ [0x3091] = "wehiragana",
+ [0x3092] = "wohiragana",
+ [0x3093] = "nhiragana",
+ [0x3094] = "vuhiragana",
+ [0x309B] = "voicedmarkkana",
+ [0x309C] = "semivoicedmarkkana",
+ [0x309D] = "iterationhiragana",
+ [0x309E] = "voicediterationhiragana",
+ [0x30A1] = "asmallkatakana",
+ [0x30A2] = "akatakana",
+ [0x30A3] = "ismallkatakana",
+ [0x30A4] = "ikatakana",
+ [0x30A5] = "usmallkatakana",
+ [0x30A6] = "ukatakana",
+ [0x30A7] = "esmallkatakana",
+ [0x30A8] = "ekatakana",
+ [0x30A9] = "osmallkatakana",
+ [0x30AA] = "okatakana",
+ [0x30AB] = "kakatakana",
+ [0x30AC] = "gakatakana",
+ [0x30AD] = "kikatakana",
+ [0x30AE] = "gikatakana",
+ [0x30AF] = "kukatakana",
+ [0x30B0] = "gukatakana",
+ [0x30B1] = "kekatakana",
+ [0x30B2] = "gekatakana",
+ [0x30B3] = "kokatakana",
+ [0x30B4] = "gokatakana",
+ [0x30B5] = "sakatakana",
+ [0x30B6] = "zakatakana",
+ [0x30B7] = "sikatakana",
+ [0x30B8] = "zikatakana",
+ [0x30B9] = "sukatakana",
+ [0x30BA] = "zukatakana",
+ [0x30BB] = "sekatakana",
+ [0x30BC] = "zekatakana",
+ [0x30BD] = "sokatakana",
+ [0x30BE] = "zokatakana",
+ [0x30BF] = "takatakana",
+ [0x30C0] = "dakatakana",
+ [0x30C1] = "tikatakana",
+ [0x30C2] = "dikatakana",
+ [0x30C3] = "tusmallkatakana",
+ [0x30C4] = "tukatakana",
+ [0x30C5] = "dukatakana",
+ [0x30C6] = "tekatakana",
+ [0x30C7] = "dekatakana",
+ [0x30C8] = "tokatakana",
+ [0x30C9] = "dokatakana",
+ [0x30CA] = "nakatakana",
+ [0x30CB] = "nikatakana",
+ [0x30CC] = "nukatakana",
+ [0x30CD] = "nekatakana",
+ [0x30CE] = "nokatakana",
+ [0x30CF] = "hakatakana",
+ [0x30D0] = "bakatakana",
+ [0x30D1] = "pakatakana",
+ [0x30D2] = "hikatakana",
+ [0x30D3] = "bikatakana",
+ [0x30D4] = "pikatakana",
+ [0x30D5] = "hukatakana",
+ [0x30D6] = "bukatakana",
+ [0x30D7] = "pukatakana",
+ [0x30D8] = "hekatakana",
+ [0x30D9] = "bekatakana",
+ [0x30DA] = "pekatakana",
+ [0x30DB] = "hokatakana",
+ [0x30DC] = "bokatakana",
+ [0x30DD] = "pokatakana",
+ [0x30DE] = "makatakana",
+ [0x30DF] = "mikatakana",
+ [0x30E0] = "mukatakana",
+ [0x30E1] = "mekatakana",
+ [0x30E2] = "mokatakana",
+ [0x30E3] = "yasmallkatakana",
+ [0x30E4] = "yakatakana",
+ [0x30E5] = "yusmallkatakana",
+ [0x30E6] = "yukatakana",
+ [0x30E7] = "yosmallkatakana",
+ [0x30E8] = "yokatakana",
+ [0x30E9] = "rakatakana",
+ [0x30EA] = "rikatakana",
+ [0x30EB] = "rukatakana",
+ [0x30EC] = "rekatakana",
+ [0x30ED] = "rokatakana",
+ [0x30EE] = "wasmallkatakana",
+ [0x30EF] = "wakatakana",
+ [0x30F0] = "wikatakana",
+ [0x30F1] = "wekatakana",
+ [0x30F2] = "wokatakana",
+ [0x30F3] = "nkatakana",
+ [0x30F4] = "vukatakana",
+ [0x30F5] = "kasmallkatakana",
+ [0x30F6] = "kesmallkatakana",
+ [0x30F7] = "vakatakana",
+ [0x30F8] = "vikatakana",
+ [0x30F9] = "vekatakana",
+ [0x30FA] = "vokatakana",
+ [0x30FB] = "dotkatakana",
+ [0x30FC] = "prolongedkana",
+ [0x30FD] = "iterationkatakana",
+ [0x30FE] = "voicediterationkatakana",
+ [0x3105] = "bbopomofo",
+ [0x3106] = "pbopomofo",
+ [0x3107] = "mbopomofo",
+ [0x3108] = "fbopomofo",
+ [0x3109] = "dbopomofo",
+ [0x310A] = "tbopomofo",
+ [0x310B] = "nbopomofo",
+ [0x310C] = "lbopomofo",
+ [0x310D] = "gbopomofo",
+ [0x310E] = "kbopomofo",
+ [0x310F] = "hbopomofo",
+ [0x3110] = "jbopomofo",
+ [0x3111] = "qbopomofo",
+ [0x3112] = "xbopomofo",
+ [0x3113] = "zhbopomofo",
+ [0x3114] = "chbopomofo",
+ [0x3115] = "shbopomofo",
+ [0x3116] = "rbopomofo",
+ [0x3117] = "zbopomofo",
+ [0x3118] = "cbopomofo",
+ [0x3119] = "sbopomofo",
+ [0x311A] = "abopomofo",
+ [0x311B] = "obopomofo",
+ [0x311C] = "ebopomofo",
+ [0x311D] = "ehbopomofo",
+ [0x311E] = "aibopomofo",
+ [0x311F] = "eibopomofo",
+ [0x3120] = "aubopomofo",
+ [0x3121] = "oubopomofo",
+ [0x3122] = "anbopomofo",
+ [0x3123] = "enbopomofo",
+ [0x3124] = "angbopomofo",
+ [0x3125] = "engbopomofo",
+ [0x3126] = "erbopomofo",
+ [0x3127] = "ibopomofo",
+ [0x3128] = "ubopomofo",
+ [0x3129] = "iubopomofo",
+ [0x3131] = "kiyeokkorean",
+ [0x3132] = "ssangkiyeokkorean",
+ [0x3133] = "kiyeoksioskorean",
+ [0x3134] = "nieunkorean",
+ [0x3135] = "nieuncieuckorean",
+ [0x3136] = "nieunhieuhkorean",
+ [0x3137] = "tikeutkorean",
+ [0x3138] = "ssangtikeutkorean",
+ [0x3139] = "rieulkorean",
+ [0x313A] = "rieulkiyeokkorean",
+ [0x313B] = "rieulmieumkorean",
+ [0x313C] = "rieulpieupkorean",
+ [0x313D] = "rieulsioskorean",
+ [0x313E] = "rieulthieuthkorean",
+ [0x313F] = "rieulphieuphkorean",
+ [0x3140] = "rieulhieuhkorean",
+ [0x3141] = "mieumkorean",
+ [0x3142] = "pieupkorean",
+ [0x3143] = "ssangpieupkorean",
+ [0x3144] = "pieupsioskorean",
+ [0x3145] = "sioskorean",
+ [0x3146] = "ssangsioskorean",
+ [0x3147] = "ieungkorean",
+ [0x3148] = "cieuckorean",
+ [0x3149] = "ssangcieuckorean",
+ [0x314A] = "chieuchkorean",
+ [0x314B] = "khieukhkorean",
+ [0x314C] = "thieuthkorean",
+ [0x314D] = "phieuphkorean",
+ [0x314E] = "hieuhkorean",
+ [0x314F] = "akorean",
+ [0x3150] = "aekorean",
+ [0x3151] = "yakorean",
+ [0x3152] = "yaekorean",
+ [0x3153] = "eokorean",
+ [0x3154] = "ekorean",
+ [0x3155] = "yeokorean",
+ [0x3156] = "yekorean",
+ [0x3157] = "okorean",
+ [0x3158] = "wakorean",
+ [0x3159] = "waekorean",
+ [0x315A] = "oekorean",
+ [0x315B] = "yokorean",
+ [0x315C] = "ukorean",
+ [0x315D] = "weokorean",
+ [0x315E] = "wekorean",
+ [0x315F] = "wikorean",
+ [0x3160] = "yukorean",
+ [0x3161] = "eukorean",
+ [0x3162] = "yikorean",
+ [0x3163] = "ikorean",
+ [0x3164] = "hangulfiller",
+ [0x3165] = "ssangnieunkorean",
+ [0x3166] = "nieuntikeutkorean",
+ [0x3167] = "nieunsioskorean",
+ [0x3168] = "nieunpansioskorean",
+ [0x3169] = "rieulkiyeoksioskorean",
+ [0x316A] = "rieultikeutkorean",
+ [0x316B] = "rieulpieupsioskorean",
+ [0x316C] = "rieulpansioskorean",
+ [0x316D] = "rieulyeorinhieuhkorean",
+ [0x316E] = "mieumpieupkorean",
+ [0x316F] = "mieumsioskorean",
+ [0x3170] = "mieumpansioskorean",
+ [0x3171] = "kapyeounmieumkorean",
+ [0x3172] = "pieupkiyeokkorean",
+ [0x3173] = "pieuptikeutkorean",
+ [0x3174] = "pieupsioskiyeokkorean",
+ [0x3175] = "pieupsiostikeutkorean",
+ [0x3176] = "pieupcieuckorean",
+ [0x3177] = "pieupthieuthkorean",
+ [0x3178] = "kapyeounpieupkorean",
+ [0x3179] = "kapyeounssangpieupkorean",
+ [0x317A] = "sioskiyeokkorean",
+ [0x317B] = "siosnieunkorean",
+ [0x317C] = "siostikeutkorean",
+ [0x317D] = "siospieupkorean",
+ [0x317E] = "sioscieuckorean",
+ [0x317F] = "pansioskorean",
+ [0x3180] = "ssangieungkorean",
+ [0x3181] = "yesieungkorean",
+ [0x3182] = "yesieungsioskorean",
+ [0x3183] = "yesieungpansioskorean",
+ [0x3184] = "kapyeounphieuphkorean",
+ [0x3185] = "ssanghieuhkorean",
+ [0x3186] = "yeorinhieuhkorean",
+ [0x3187] = "yoyakorean",
+ [0x3188] = "yoyaekorean",
+ [0x3189] = "yoikorean",
+ [0x318A] = "yuyeokorean",
+ [0x318B] = "yuyekorean",
+ [0x318C] = "yuikorean",
+ [0x318D] = "araeakorean",
+ [0x318E] = "araeaekorean",
+ [0x3200] = "kiyeokparenkorean",
+ [0x3201] = "nieunparenkorean",
+ [0x3202] = "tikeutparenkorean",
+ [0x3203] = "rieulparenkorean",
+ [0x3204] = "mieumparenkorean",
+ [0x3205] = "pieupparenkorean",
+ [0x3206] = "siosparenkorean",
+ [0x3207] = "ieungparenkorean",
+ [0x3208] = "cieucparenkorean",
+ [0x3209] = "chieuchparenkorean",
+ [0x320A] = "khieukhparenkorean",
+ [0x320B] = "thieuthparenkorean",
+ [0x320C] = "phieuphparenkorean",
+ [0x320D] = "hieuhparenkorean",
+ [0x320E] = "kiyeokaparenkorean",
+ [0x320F] = "nieunaparenkorean",
+ [0x3210] = "tikeutaparenkorean",
+ [0x3211] = "rieulaparenkorean",
+ [0x3212] = "mieumaparenkorean",
+ [0x3213] = "pieupaparenkorean",
+ [0x3214] = "siosaparenkorean",
+ [0x3215] = "ieungaparenkorean",
+ [0x3216] = "cieucaparenkorean",
+ [0x3217] = "chieuchaparenkorean",
+ [0x3218] = "khieukhaparenkorean",
+ [0x3219] = "thieuthaparenkorean",
+ [0x321A] = "phieuphaparenkorean",
+ [0x321B] = "hieuhaparenkorean",
+ [0x321C] = "cieucuparenkorean",
+ [0x3220] = "oneideographicparen",
+ [0x3221] = "twoideographicparen",
+ [0x3222] = "threeideographicparen",
+ [0x3223] = "fourideographicparen",
+ [0x3224] = "fiveideographicparen",
+ [0x3225] = "sixideographicparen",
+ [0x3226] = "sevenideographicparen",
+ [0x3227] = "eightideographicparen",
+ [0x3228] = "nineideographicparen",
+ [0x3229] = "tenideographicparen",
+ [0x322A] = "ideographicmoonparen",
+ [0x322B] = "ideographicfireparen",
+ [0x322C] = "ideographicwaterparen",
+ [0x322D] = "ideographicwoodparen",
+ [0x322E] = "ideographicmetalparen",
+ [0x322F] = "ideographicearthparen",
+ [0x3230] = "ideographicsunparen",
+ [0x3231] = "ideographicstockparen",
+ [0x3232] = "ideographichaveparen",
+ [0x3233] = "ideographicsocietyparen",
+ [0x3234] = "ideographicnameparen",
+ [0x3235] = "ideographicspecialparen",
+ [0x3236] = "ideographicfinancialparen",
+ [0x3237] = "ideographiccongratulationparen",
+ [0x3238] = "ideographiclaborparen",
+ [0x3239] = "ideographicrepresentparen",
+ [0x323A] = "ideographiccallparen",
+ [0x323B] = "ideographicstudyparen",
+ [0x323C] = "ideographicsuperviseparen",
+ [0x323D] = "ideographicenterpriseparen",
+ [0x323E] = "ideographicresourceparen",
+ [0x323F] = "ideographicallianceparen",
+ [0x3240] = "ideographicfestivalparen",
+ [0x3242] = "ideographicselfparen",
+ [0x3243] = "ideographicreachparen",
+ [0x3260] = "kiyeokcirclekorean",
+ [0x3261] = "nieuncirclekorean",
+ [0x3262] = "tikeutcirclekorean",
+ [0x3263] = "rieulcirclekorean",
+ [0x3264] = "mieumcirclekorean",
+ [0x3265] = "pieupcirclekorean",
+ [0x3266] = "sioscirclekorean",
+ [0x3267] = "ieungcirclekorean",
+ [0x3268] = "cieuccirclekorean",
+ [0x3269] = "chieuchcirclekorean",
+ [0x326A] = "khieukhcirclekorean",
+ [0x326B] = "thieuthcirclekorean",
+ [0x326C] = "phieuphcirclekorean",
+ [0x326D] = "hieuhcirclekorean",
+ [0x326E] = "kiyeokacirclekorean",
+ [0x326F] = "nieunacirclekorean",
+ [0x3270] = "tikeutacirclekorean",
+ [0x3271] = "rieulacirclekorean",
+ [0x3272] = "mieumacirclekorean",
+ [0x3273] = "pieupacirclekorean",
+ [0x3274] = "siosacirclekorean",
+ [0x3275] = "ieungacirclekorean",
+ [0x3276] = "cieucacirclekorean",
+ [0x3277] = "chieuchacirclekorean",
+ [0x3278] = "khieukhacirclekorean",
+ [0x3279] = "thieuthacirclekorean",
+ [0x327A] = "phieuphacirclekorean",
+ [0x327B] = "hieuhacirclekorean",
+ [0x327F] = "koreanstandardsymbol",
+ [0x328A] = "ideographmooncircle",
+ [0x328B] = "ideographfirecircle",
+ [0x328C] = "ideographwatercircle",
+ [0x328D] = "ideographwoodcircle",
+ [0x328E] = "ideographmetalcircle",
+ [0x328F] = "ideographearthcircle",
+ [0x3290] = "ideographsuncircle",
+ [0x3294] = "ideographnamecircle",
+ [0x3296] = "ideographicfinancialcircle",
+ [0x3298] = "ideographiclaborcircle",
+ [0x3299] = "ideographicsecretcircle",
+ [0x329D] = "ideographicexcellentcircle",
+ [0x329E] = "ideographicprintcircle",
+ [0x32A3] = "ideographiccorrectcircle",
+ [0x32A4] = "ideographichighcircle",
+ [0x32A5] = "ideographiccentrecircle",
+ [0x32A6] = "ideographiclowcircle",
+ [0x32A7] = "ideographicleftcircle",
+ [0x32A8] = "ideographicrightcircle",
+ [0x32A9] = "ideographicmedicinecircle",
+ [0x3300] = "apaatosquare",
+ [0x3303] = "aarusquare",
+ [0x3305] = "intisquare",
+ [0x330D] = "karoriisquare",
+ [0x3314] = "kirosquare",
+ [0x3315] = "kiroguramusquare",
+ [0x3316] = "kiromeetorusquare",
+ [0x3318] = "guramusquare",
+ [0x331E] = "kooposquare",
+ [0x3322] = "sentisquare",
+ [0x3323] = "sentosquare",
+ [0x3326] = "dorusquare",
+ [0x3327] = "tonsquare",
+ [0x332A] = "haitusquare",
+ [0x332B] = "paasentosquare",
+ [0x3331] = "birusquare",
+ [0x3333] = "huiitosquare",
+ [0x3336] = "hekutaarusquare",
+ [0x3339] = "herutusquare",
+ [0x333B] = "peezisquare",
+ [0x3342] = "hoonsquare",
+ [0x3347] = "mansyonsquare",
+ [0x3349] = "mirisquare",
+ [0x334A] = "miribaarusquare",
+ [0x334D] = "meetorusquare",
+ [0x334E] = "yaadosquare",
+ [0x3351] = "rittorusquare",
+ [0x3357] = "wattosquare",
+ [0x337B] = "heiseierasquare",
+ [0x337C] = "syouwaerasquare",
+ [0x337D] = "taisyouerasquare",
+ [0x337E] = "meizierasquare",
+ [0x337F] = "corporationsquare",
+ [0x3380] = "paampssquare",
+ [0x3381] = "nasquare",
+ [0x3382] = "muasquare",
+ [0x3383] = "masquare",
+ [0x3384] = "kasquare",
+ [0x3385] = "KBsquare",
+ [0x3386] = "MBsquare",
+ [0x3387] = "GBsquare",
+ [0x3388] = "calsquare",
+ [0x3389] = "kcalsquare",
+ [0x338A] = "pfsquare",
+ [0x338B] = "nfsquare",
+ [0x338C] = "mufsquare",
+ [0x338D] = "mugsquare",
+ [0x338E] = "squaremg",
+ [0x338F] = "squarekg",
+ [0x3390] = "Hzsquare",
+ [0x3391] = "khzsquare",
+ [0x3392] = "mhzsquare",
+ [0x3393] = "ghzsquare",
+ [0x3394] = "thzsquare",
+ [0x3395] = "mulsquare",
+ [0x3396] = "mlsquare",
+ [0x3397] = "dlsquare",
+ [0x3398] = "klsquare",
+ [0x3399] = "fmsquare",
+ [0x339A] = "nmsquare",
+ [0x339B] = "mumsquare",
+ [0x339C] = "squaremm",
+ [0x339D] = "squarecm",
+ [0x339E] = "squarekm",
+ [0x339F] = "mmsquaredsquare",
+ [0x33A0] = "cmsquaredsquare",
+ [0x33A1] = "squaremsquared",
+ [0x33A2] = "kmsquaredsquare",
+ [0x33A3] = "mmcubedsquare",
+ [0x33A4] = "cmcubedsquare",
+ [0x33A5] = "mcubedsquare",
+ [0x33A6] = "kmcubedsquare",
+ [0x33A7] = "moverssquare",
+ [0x33A8] = "moverssquaredsquare",
+ [0x33A9] = "pasquare",
+ [0x33AA] = "kpasquare",
+ [0x33AB] = "mpasquare",
+ [0x33AC] = "gpasquare",
+ [0x33AD] = "radsquare",
+ [0x33AE] = "radoverssquare",
+ [0x33AF] = "radoverssquaredsquare",
+ [0x33B0] = "pssquare",
+ [0x33B1] = "nssquare",
+ [0x33B2] = "mussquare",
+ [0x33B3] = "mssquare",
+ [0x33B4] = "pvsquare",
+ [0x33B5] = "nvsquare",
+ [0x33B6] = "muvsquare",
+ [0x33B7] = "mvsquare",
+ [0x33B8] = "kvsquare",
+ [0x33B9] = "mvmegasquare",
+ [0x33BA] = "pwsquare",
+ [0x33BB] = "nwsquare",
+ [0x33BC] = "muwsquare",
+ [0x33BD] = "mwsquare",
+ [0x33BE] = "kwsquare",
+ [0x33BF] = "mwmegasquare",
+ [0x33C0] = "kohmsquare",
+ [0x33C1] = "mohmsquare",
+ [0x33C2] = "amsquare",
+ [0x33C3] = "bqsquare",
+ [0x33C4] = "squarecc",
+ [0x33C5] = "cdsquare",
+ [0x33C6] = "coverkgsquare",
+ [0x33C7] = "cosquare",
+ [0x33C8] = "dbsquare",
+ [0x33C9] = "gysquare",
+ [0x33CA] = "hasquare",
+ [0x33CB] = "HPsquare",
+ [0x33CD] = "KKsquare",
+ [0x33CE] = "squarekmcapital",
+ [0x33CF] = "ktsquare",
+ [0x33D0] = "lmsquare",
+ [0x33D1] = "squareln",
+ [0x33D2] = "squarelog",
+ [0x33D3] = "lxsquare",
+ [0x33D4] = "mbsquare",
+ [0x33D5] = "squaremil",
+ [0x33D6] = "molsquare",
+ [0x33D8] = "pmsquare",
+ [0x33DB] = "srsquare",
+ [0x33DC] = "svsquare",
+ [0x33DD] = "wbsquare",
+ [0x5344] = "twentyhangzhou",
+ [0xF6BE] = "dotlessj",
+ [0xF6BF] = "LL",
+ [0xF6C0] = "ll",
+ [0xF6C3] = "commaaccent",
+ [0xF6C4] = "afii10063",
+ [0xF6C5] = "afii10064",
+ [0xF6C6] = "afii10192",
+ [0xF6C7] = "afii10831",
+ [0xF6C8] = "afii10832",
+ [0xF6C9] = "Acute",
+ [0xF6CA] = "Caron",
+ [0xF6CB] = "Dieresis",
+ [0xF6CC] = "DieresisAcute",
+ [0xF6CD] = "DieresisGrave",
+ [0xF6CE] = "Grave",
+ [0xF6CF] = "Hungarumlaut",
+ [0xF6D0] = "Macron",
+ [0xF6D1] = "cyrBreve",
+ [0xF6D2] = "cyrFlex",
+ [0xF6D3] = "dblGrave",
+ [0xF6D4] = "cyrbreve",
+ [0xF6D5] = "cyrflex",
+ [0xF6D6] = "dblgrave",
+ [0xF6D7] = "dieresisacute",
+ [0xF6D8] = "dieresisgrave",
+ [0xF6D9] = "copyrightserif",
+ [0xF6DA] = "registerserif",
+ [0xF6DB] = "trademarkserif",
+ [0xF6DC] = "onefitted",
+ [0xF6DD] = "rupiah",
+ [0xF6DE] = "threequartersemdash",
+ [0xF6DF] = "centinferior",
+ [0xF6E0] = "centsuperior",
+ [0xF6E1] = "commainferior",
+ [0xF6E2] = "commasuperior",
+ [0xF6E3] = "dollarinferior",
+ [0xF6E4] = "dollarsuperior",
+ [0xF6E5] = "hypheninferior",
+ [0xF6E6] = "hyphensuperior",
+ [0xF6E7] = "periodinferior",
+ [0xF6E8] = "periodsuperior",
+ [0xF6E9] = "asuperior",
+ [0xF6EA] = "bsuperior",
+ [0xF6EB] = "dsuperior",
+ [0xF6EC] = "esuperior",
+ [0xF6ED] = "isuperior",
+ [0xF6EE] = "lsuperior",
+ [0xF6EF] = "msuperior",
+ [0xF6F0] = "osuperior",
+ [0xF6F1] = "rsuperior",
+ [0xF6F2] = "ssuperior",
+ [0xF6F3] = "tsuperior",
+ [0xF6F4] = "Brevesmall",
+ [0xF6F5] = "Caronsmall",
+ [0xF6F6] = "Circumflexsmall",
+ [0xF6F7] = "Dotaccentsmall",
+ [0xF6F8] = "Hungarumlautsmall",
+ [0xF6F9] = "Lslashsmall",
+ [0xF6FA] = "OEsmall",
+ [0xF6FB] = "Ogoneksmall",
+ [0xF6FC] = "Ringsmall",
+ [0xF6FD] = "Scaronsmall",
+ [0xF6FE] = "Tildesmall",
+ [0xF6FF] = "Zcaronsmall",
+ [0xF721] = "exclamsmall",
+ [0xF724] = "dollaroldstyle",
+ [0xF726] = "ampersandsmall",
+ [0xF730] = "zerooldstyle",
+ [0xF731] = "oneoldstyle",
+ [0xF732] = "twooldstyle",
+ [0xF733] = "threeoldstyle",
+ [0xF734] = "fouroldstyle",
+ [0xF735] = "fiveoldstyle",
+ [0xF736] = "sixoldstyle",
+ [0xF737] = "sevenoldstyle",
+ [0xF738] = "eightoldstyle",
+ [0xF739] = "nineoldstyle",
+ [0xF73F] = "questionsmall",
+ [0xF760] = "Gravesmall",
+ [0xF761] = "Asmall",
+ [0xF762] = "Bsmall",
+ [0xF763] = "Csmall",
+ [0xF764] = "Dsmall",
+ [0xF765] = "Esmall",
+ [0xF766] = "Fsmall",
+ [0xF767] = "Gsmall",
+ [0xF768] = "Hsmall",
+ [0xF769] = "Ismall",
+ [0xF76A] = "Jsmall",
+ [0xF76B] = "Ksmall",
+ [0xF76C] = "Lsmall",
+ [0xF76D] = "Msmall",
+ [0xF76E] = "Nsmall",
+ [0xF76F] = "Osmall",
+ [0xF770] = "Psmall",
+ [0xF771] = "Qsmall",
+ [0xF772] = "Rsmall",
+ [0xF773] = "Ssmall",
+ [0xF774] = "Tsmall",
+ [0xF775] = "Usmall",
+ [0xF776] = "Vsmall",
+ [0xF777] = "Wsmall",
+ [0xF778] = "Xsmall",
+ [0xF779] = "Ysmall",
+ [0xF77A] = "Zsmall",
+ [0xF7A1] = "exclamdownsmall",
+ [0xF7A2] = "centoldstyle",
+ [0xF7A8] = "Dieresissmall",
+ [0xF7AF] = "Macronsmall",
+ [0xF7B4] = "Acutesmall",
+ [0xF7B8] = "Cedillasmall",
+ [0xF7BF] = "questiondownsmall",
+ [0xF7E0] = "Agravesmall",
+ [0xF7E1] = "Aacutesmall",
+ [0xF7E2] = "Acircumflexsmall",
+ [0xF7E3] = "Atildesmall",
+ [0xF7E4] = "Adieresissmall",
+ [0xF7E5] = "Aringsmall",
+ [0xF7E6] = "AEsmall",
+ [0xF7E7] = "Ccedillasmall",
+ [0xF7E8] = "Egravesmall",
+ [0xF7E9] = "Eacutesmall",
+ [0xF7EA] = "Ecircumflexsmall",
+ [0xF7EB] = "Edieresissmall",
+ [0xF7EC] = "Igravesmall",
+ [0xF7ED] = "Iacutesmall",
+ [0xF7EE] = "Icircumflexsmall",
+ [0xF7EF] = "Idieresissmall",
+ [0xF7F0] = "Ethsmall",
+ [0xF7F1] = "Ntildesmall",
+ [0xF7F2] = "Ogravesmall",
+ [0xF7F3] = "Oacutesmall",
+ [0xF7F4] = "Ocircumflexsmall",
+ [0xF7F5] = "Otildesmall",
+ [0xF7F6] = "Odieresissmall",
+ [0xF7F8] = "Oslashsmall",
+ [0xF7F9] = "Ugravesmall",
+ [0xF7FA] = "Uacutesmall",
+ [0xF7FB] = "Ucircumflexsmall",
+ [0xF7FC] = "Udieresissmall",
+ [0xF7FD] = "Yacutesmall",
+ [0xF7FE] = "Thornsmall",
+ [0xF7FF] = "Ydieresissmall",
+ [0xF884] = "maihanakatleftthai",
+ [0xF885] = "saraileftthai",
+ [0xF886] = "saraiileftthai",
+ [0xF887] = "saraueleftthai",
+ [0xF888] = "saraueeleftthai",
+ [0xF889] = "maitaikhuleftthai",
+ [0xF88A] = "maiekupperleftthai",
+ [0xF88B] = "maieklowrightthai",
+ [0xF88C] = "maieklowleftthai",
+ [0xF88D] = "maithoupperleftthai",
+ [0xF88E] = "maitholowrightthai",
+ [0xF88F] = "maitholowleftthai",
+ [0xF890] = "maitriupperleftthai",
+ [0xF891] = "maitrilowrightthai",
+ [0xF892] = "maitrilowleftthai",
+ [0xF893] = "maichattawaupperleftthai",
+ [0xF894] = "maichattawalowrightthai",
+ [0xF895] = "maichattawalowleftthai",
+ [0xF896] = "thanthakhatupperleftthai",
+ [0xF897] = "thanthakhatlowrightthai",
+ [0xF898] = "thanthakhatlowleftthai",
+ [0xF899] = "nikhahitleftthai",
+ [0xF8E5] = "radicalex",
+ [0xF8E6] = "arrowvertex",
+ [0xF8E7] = "arrowhorizex",
+ [0xF8E8] = "registersans",
+ [0xF8E9] = "copyrightsans",
+ [0xF8EA] = "trademarksans",
+ [0xF8EB] = "parenlefttp",
+ [0xF8EC] = "parenleftex",
+ [0xF8ED] = "parenleftbt",
+ [0xF8EE] = "bracketlefttp",
+ [0xF8EF] = "bracketleftex",
+ [0xF8F0] = "bracketleftbt",
+ [0xF8F1] = "bracelefttp",
+ [0xF8F2] = "braceleftmid",
+ [0xF8F3] = "braceleftbt",
+ [0xF8F4] = "braceex",
+ [0xF8F5] = "integralex",
+ [0xF8F6] = "parenrighttp",
+ [0xF8F7] = "parenrightex",
+ [0xF8F8] = "parenrightbt",
+ [0xF8F9] = "bracketrighttp",
+ [0xF8FA] = "bracketrightex",
+ [0xF8FB] = "bracketrightbt",
+ [0xF8FC] = "bracerighttp",
+ [0xF8FD] = "bracerightmid",
+ [0xF8FE] = "bracerightbt",
+ [0xF8FF] = "apple",
+ [0xFB00] = "ff",
+ [0xFB01] = "fi",
+ [0xFB02] = "fl",
+ [0xFB03] = "ffi",
+ [0xFB04] = "ffl",
+ [0xFB1F] = "yodyodpatahhebrew",
+ [0xFB20] = "ayinaltonehebrew",
+ [0xFB2A] = "shinshindothebrew",
+ [0xFB2B] = "shinsindothebrew",
+ [0xFB2C] = "shindageshshindothebrew",
+ [0xFB2D] = "shindageshsindothebrew",
+ [0xFB2E] = "alefpatahhebrew",
+ [0xFB2F] = "alefqamatshebrew",
+ [0xFB30] = "alefdageshhebrew",
+ [0xFB31] = "betdageshhebrew",
+ [0xFB32] = "gimeldageshhebrew",
+ [0xFB33] = "daletdageshhebrew",
+ [0xFB34] = "hedageshhebrew",
+ [0xFB35] = "vavdageshhebrew",
+ [0xFB36] = "zayindageshhebrew",
+ [0xFB38] = "tetdageshhebrew",
+ [0xFB39] = "yoddageshhebrew",
+ [0xFB3A] = "finalkafdageshhebrew",
+ [0xFB3B] = "kafdageshhebrew",
+ [0xFB3C] = "lameddageshhebrew",
+ [0xFB3E] = "memdageshhebrew",
+ [0xFB40] = "nundageshhebrew",
+ [0xFB41] = "samekhdageshhebrew",
+ [0xFB43] = "pefinaldageshhebrew",
+ [0xFB44] = "pedageshhebrew",
+ [0xFB46] = "tsadidageshhebrew",
+ [0xFB47] = "qofdageshhebrew",
+ [0xFB48] = "reshdageshhebrew",
+ [0xFB49] = "shindageshhebrew",
+ [0xFB4A] = "tavdageshhebrew",
+ [0xFB4B] = "vavholamhebrew",
+ [0xFB4C] = "betrafehebrew",
+ [0xFB4D] = "kafrafehebrew",
+ [0xFB4E] = "perafehebrew",
+ [0xFB4F] = "aleflamedhebrew",
+ [0xFB57] = "pehfinalarabic",
+ [0xFB58] = "pehinitialarabic",
+ [0xFB59] = "pehmedialarabic",
+ [0xFB67] = "ttehfinalarabic",
+ [0xFB68] = "ttehinitialarabic",
+ [0xFB69] = "ttehmedialarabic",
+ [0xFB6B] = "vehfinalarabic",
+ [0xFB6C] = "vehinitialarabic",
+ [0xFB6D] = "vehmedialarabic",
+ [0xFB7B] = "tchehfinalarabic",
+ [0xFB7C] = "tchehmeeminitialarabic",
+ [0xFB7D] = "tchehmedialarabic",
+ [0xFB89] = "ddalfinalarabic",
+ [0xFB8B] = "jehfinalarabic",
+ [0xFB8D] = "rrehfinalarabic",
+ [0xFB93] = "gaffinalarabic",
+ [0xFB94] = "gafinitialarabic",
+ [0xFB95] = "gafmedialarabic",
+ [0xFB9F] = "noonghunnafinalarabic",
+ [0xFBA4] = "hehhamzaaboveisolatedarabic",
+ [0xFBA5] = "hehhamzaabovefinalarabic",
+ [0xFBA7] = "hehfinalaltonearabic",
+ [0xFBA8] = "hehinitialaltonearabic",
+ [0xFBA9] = "hehmedialaltonearabic",
+ [0xFBAF] = "yehbarreefinalarabic",
+ [0xFC08] = "behmeemisolatedarabic",
+ [0xFC0B] = "tehjeemisolatedarabic",
+ [0xFC0C] = "tehhahisolatedarabic",
+ [0xFC0E] = "tehmeemisolatedarabic",
+ [0xFC48] = "meemmeemisolatedarabic",
+ [0xFC4B] = "noonjeemisolatedarabic",
+ [0xFC4E] = "noonmeemisolatedarabic",
+ [0xFC58] = "yehmeemisolatedarabic",
+ [0xFC5E] = "shaddadammatanarabic",
+ [0xFC5F] = "shaddakasratanarabic",
+ [0xFC60] = "shaddafathaarabic",
+ [0xFC61] = "shaddadammaarabic",
+ [0xFC62] = "shaddakasraarabic",
+ [0xFC6D] = "behnoonfinalarabic",
+ [0xFC73] = "tehnoonfinalarabic",
+ [0xFC8D] = "noonnoonfinalarabic",
+ [0xFC94] = "yehnoonfinalarabic",
+ [0xFC9F] = "behmeeminitialarabic",
+ [0xFCA1] = "tehjeeminitialarabic",
+ [0xFCA2] = "tehhahinitialarabic",
+ [0xFCA4] = "tehmeeminitialarabic",
+ [0xFCC9] = "lamjeeminitialarabic",
+ [0xFCCA] = "lamhahinitialarabic",
+ [0xFCCB] = "lamkhahinitialarabic",
+ [0xFCCC] = "lammeeminitialarabic",
+ [0xFCD1] = "meemmeeminitialarabic",
+ [0xFCD2] = "noonjeeminitialarabic",
+ [0xFCD5] = "noonmeeminitialarabic",
+ [0xFCDD] = "yehmeeminitialarabic",
+ [0xFD3E] = "parenleftaltonearabic",
+ [0xFD3F] = "parenrightaltonearabic",
+ [0xFD88] = "lammeemhahinitialarabic",
+ [0xFDF2] = "lamlamhehisolatedarabic",
+ [0xFDFA] = "sallallahoualayhewasallamarabic",
+ [0xFE30] = "twodotleadervertical",
+ [0xFE31] = "emdashvertical",
+ [0xFE32] = "endashvertical",
+ [0xFE33] = "underscorevertical",
+ [0xFE34] = "wavyunderscorevertical",
+ [0xFE35] = "parenleftvertical",
+ [0xFE36] = "parenrightvertical",
+ [0xFE37] = "braceleftvertical",
+ [0xFE38] = "bracerightvertical",
+ [0xFE39] = "tortoiseshellbracketleftvertical",
+ [0xFE3A] = "tortoiseshellbracketrightvertical",
+ [0xFE3B] = "blacklenticularbracketleftvertical",
+ [0xFE3C] = "blacklenticularbracketrightvertical",
+ [0xFE3D] = "dblanglebracketleftvertical",
+ [0xFE3E] = "dblanglebracketrightvertical",
+ [0xFE3F] = "anglebracketleftvertical",
+ [0xFE40] = "anglebracketrightvertical",
+ [0xFE41] = "cornerbracketleftvertical",
+ [0xFE42] = "cornerbracketrightvertical",
+ [0xFE43] = "whitecornerbracketleftvertical",
+ [0xFE44] = "whitecornerbracketrightvertical",
+ [0xFE49] = "overlinedashed",
+ [0xFE4A] = "overlinecenterline",
+ [0xFE4B] = "overlinewavy",
+ [0xFE4C] = "overlinedblwavy",
+ [0xFE4D] = "lowlinedashed",
+ [0xFE4E] = "lowlinecenterline",
+ [0xFE4F] = "underscorewavy",
+ [0xFE50] = "commasmall",
+ [0xFE52] = "periodsmall",
+ [0xFE54] = "semicolonsmall",
+ [0xFE55] = "colonsmall",
+ [0xFE59] = "parenleftsmall",
+ [0xFE5A] = "parenrightsmall",
+ [0xFE5B] = "braceleftsmall",
+ [0xFE5C] = "bracerightsmall",
+ [0xFE5D] = "tortoiseshellbracketleftsmall",
+ [0xFE5E] = "tortoiseshellbracketrightsmall",
+ [0xFE5F] = "numbersignsmall",
+ [0xFE61] = "asterisksmall",
+ [0xFE62] = "plussmall",
+ [0xFE63] = "hyphensmall",
+ [0xFE64] = "lesssmall",
+ [0xFE65] = "greatersmall",
+ [0xFE66] = "equalsmall",
+ [0xFE69] = "dollarsmall",
+ [0xFE6A] = "percentsmall",
+ [0xFE6B] = "atsmall",
+ [0xFE82] = "alefmaddaabovefinalarabic",
+ [0xFE84] = "alefhamzaabovefinalarabic",
+ [0xFE86] = "wawhamzaabovefinalarabic",
+ [0xFE88] = "alefhamzabelowfinalarabic",
+ [0xFE8A] = "yehhamzaabovefinalarabic",
+ [0xFE8B] = "yehhamzaaboveinitialarabic",
+ [0xFE8C] = "yehhamzaabovemedialarabic",
+ [0xFE8E] = "aleffinalarabic",
+ [0xFE90] = "behfinalarabic",
+ [0xFE91] = "behinitialarabic",
+ [0xFE92] = "behmedialarabic",
+ [0xFE94] = "tehmarbutafinalarabic",
+ [0xFE96] = "tehfinalarabic",
+ [0xFE97] = "tehinitialarabic",
+ [0xFE98] = "tehmedialarabic",
+ [0xFE9A] = "thehfinalarabic",
+ [0xFE9B] = "thehinitialarabic",
+ [0xFE9C] = "thehmedialarabic",
+ [0xFE9E] = "jeemfinalarabic",
+ [0xFE9F] = "jeeminitialarabic",
+ [0xFEA0] = "jeemmedialarabic",
+ [0xFEA2] = "hahfinalarabic",
+ [0xFEA3] = "hahinitialarabic",
+ [0xFEA4] = "hahmedialarabic",
+ [0xFEA6] = "khahfinalarabic",
+ [0xFEA7] = "khahinitialarabic",
+ [0xFEA8] = "khahmedialarabic",
+ [0xFEAA] = "dalfinalarabic",
+ [0xFEAC] = "thalfinalarabic",
+ [0xFEAE] = "rehfinalarabic",
+ [0xFEB0] = "zainfinalarabic",
+ [0xFEB2] = "seenfinalarabic",
+ [0xFEB3] = "seeninitialarabic",
+ [0xFEB4] = "seenmedialarabic",
+ [0xFEB6] = "sheenfinalarabic",
+ [0xFEB7] = "sheeninitialarabic",
+ [0xFEB8] = "sheenmedialarabic",
+ [0xFEBA] = "sadfinalarabic",
+ [0xFEBB] = "sadinitialarabic",
+ [0xFEBC] = "sadmedialarabic",
+ [0xFEBE] = "dadfinalarabic",
+ [0xFEBF] = "dadinitialarabic",
+ [0xFEC0] = "dadmedialarabic",
+ [0xFEC2] = "tahfinalarabic",
+ [0xFEC3] = "tahinitialarabic",
+ [0xFEC4] = "tahmedialarabic",
+ [0xFEC6] = "zahfinalarabic",
+ [0xFEC7] = "zahinitialarabic",
+ [0xFEC8] = "zahmedialarabic",
+ [0xFECA] = "ainfinalarabic",
+ [0xFECB] = "aininitialarabic",
+ [0xFECC] = "ainmedialarabic",
+ [0xFECE] = "ghainfinalarabic",
+ [0xFECF] = "ghaininitialarabic",
+ [0xFED0] = "ghainmedialarabic",
+ [0xFED2] = "fehfinalarabic",
+ [0xFED3] = "fehinitialarabic",
+ [0xFED4] = "fehmedialarabic",
+ [0xFED6] = "qaffinalarabic",
+ [0xFED7] = "qafinitialarabic",
+ [0xFED8] = "qafmedialarabic",
+ [0xFEDA] = "kaffinalarabic",
+ [0xFEDB] = "kafinitialarabic",
+ [0xFEDC] = "kafmedialarabic",
+ [0xFEDE] = "lamfinalarabic",
+ [0xFEDF] = "lammeemkhahinitialarabic",
+ [0xFEE0] = "lammedialarabic",
+ [0xFEE2] = "meemfinalarabic",
+ [0xFEE3] = "meeminitialarabic",
+ [0xFEE4] = "meemmedialarabic",
+ [0xFEE6] = "noonfinalarabic",
+ [0xFEE7] = "nooninitialarabic",
+ [0xFEE8] = "noonmedialarabic",
+ [0xFEEA] = "hehfinalarabic",
+ [0xFEEB] = "hehinitialarabic",
+ [0xFEEC] = "hehmedialarabic",
+ [0xFEEE] = "wawfinalarabic",
+ [0xFEF0] = "alefmaksurafinalarabic",
+ [0xFEF2] = "yehfinalarabic",
+ [0xFEF3] = "yehinitialarabic",
+ [0xFEF4] = "yehmedialarabic",
+ [0xFEF5] = "lamalefmaddaaboveisolatedarabic",
+ [0xFEF6] = "lamalefmaddaabovefinalarabic",
+ [0xFEF7] = "lamalefhamzaaboveisolatedarabic",
+ [0xFEF8] = "lamalefhamzaabovefinalarabic",
+ [0xFEF9] = "lamalefhamzabelowisolatedarabic",
+ [0xFEFA] = "lamalefhamzabelowfinalarabic",
+ [0xFEFB] = "lamalefisolatedarabic",
+ [0xFEFC] = "lamaleffinalarabic",
+ [0xFEFF] = "zerowidthjoiner",
+ [0xFF01] = "exclammonospace",
+ [0xFF02] = "quotedblmonospace",
+ [0xFF03] = "numbersignmonospace",
+ [0xFF04] = "dollarmonospace",
+ [0xFF05] = "percentmonospace",
+ [0xFF06] = "ampersandmonospace",
+ [0xFF07] = "quotesinglemonospace",
+ [0xFF08] = "parenleftmonospace",
+ [0xFF09] = "parenrightmonospace",
+ [0xFF0A] = "asteriskmonospace",
+ [0xFF0B] = "plusmonospace",
+ [0xFF0C] = "commamonospace",
+ [0xFF0D] = "hyphenmonospace",
+ [0xFF0E] = "periodmonospace",
+ [0xFF0F] = "slashmonospace",
+ [0xFF10] = "zeromonospace",
+ [0xFF11] = "onemonospace",
+ [0xFF12] = "twomonospace",
+ [0xFF13] = "threemonospace",
+ [0xFF14] = "fourmonospace",
+ [0xFF15] = "fivemonospace",
+ [0xFF16] = "sixmonospace",
+ [0xFF17] = "sevenmonospace",
+ [0xFF18] = "eightmonospace",
+ [0xFF19] = "ninemonospace",
+ [0xFF1A] = "colonmonospace",
+ [0xFF1B] = "semicolonmonospace",
+ [0xFF1C] = "lessmonospace",
+ [0xFF1D] = "equalmonospace",
+ [0xFF1E] = "greatermonospace",
+ [0xFF1F] = "questionmonospace",
+ [0xFF20] = "atmonospace",
+ [0xFF21] = "Amonospace",
+ [0xFF22] = "Bmonospace",
+ [0xFF23] = "Cmonospace",
+ [0xFF24] = "Dmonospace",
+ [0xFF25] = "Emonospace",
+ [0xFF26] = "Fmonospace",
+ [0xFF27] = "Gmonospace",
+ [0xFF28] = "Hmonospace",
+ [0xFF29] = "Imonospace",
+ [0xFF2A] = "Jmonospace",
+ [0xFF2B] = "Kmonospace",
+ [0xFF2C] = "Lmonospace",
+ [0xFF2D] = "Mmonospace",
+ [0xFF2E] = "Nmonospace",
+ [0xFF2F] = "Omonospace",
+ [0xFF30] = "Pmonospace",
+ [0xFF31] = "Qmonospace",
+ [0xFF32] = "Rmonospace",
+ [0xFF33] = "Smonospace",
+ [0xFF34] = "Tmonospace",
+ [0xFF35] = "Umonospace",
+ [0xFF36] = "Vmonospace",
+ [0xFF37] = "Wmonospace",
+ [0xFF38] = "Xmonospace",
+ [0xFF39] = "Ymonospace",
+ [0xFF3A] = "Zmonospace",
+ [0xFF3B] = "bracketleftmonospace",
+ [0xFF3C] = "backslashmonospace",
+ [0xFF3D] = "bracketrightmonospace",
+ [0xFF3E] = "asciicircummonospace",
+ [0xFF3F] = "underscoremonospace",
+ [0xFF40] = "gravemonospace",
+ [0xFF41] = "amonospace",
+ [0xFF42] = "bmonospace",
+ [0xFF43] = "cmonospace",
+ [0xFF44] = "dmonospace",
+ [0xFF45] = "emonospace",
+ [0xFF46] = "fmonospace",
+ [0xFF47] = "gmonospace",
+ [0xFF48] = "hmonospace",
+ [0xFF49] = "imonospace",
+ [0xFF4A] = "jmonospace",
+ [0xFF4B] = "kmonospace",
+ [0xFF4C] = "lmonospace",
+ [0xFF4D] = "mmonospace",
+ [0xFF4E] = "nmonospace",
+ [0xFF4F] = "omonospace",
+ [0xFF50] = "pmonospace",
+ [0xFF51] = "qmonospace",
+ [0xFF52] = "rmonospace",
+ [0xFF53] = "smonospace",
+ [0xFF54] = "tmonospace",
+ [0xFF55] = "umonospace",
+ [0xFF56] = "vmonospace",
+ [0xFF57] = "wmonospace",
+ [0xFF58] = "xmonospace",
+ [0xFF59] = "ymonospace",
+ [0xFF5A] = "zmonospace",
+ [0xFF5B] = "braceleftmonospace",
+ [0xFF5C] = "barmonospace",
+ [0xFF5D] = "bracerightmonospace",
+ [0xFF5E] = "asciitildemonospace",
+ [0xFF61] = "periodhalfwidth",
+ [0xFF62] = "cornerbracketlefthalfwidth",
+ [0xFF63] = "cornerbracketrighthalfwidth",
+ [0xFF64] = "ideographiccommaleft",
+ [0xFF65] = "middledotkatakanahalfwidth",
+ [0xFF66] = "wokatakanahalfwidth",
+ [0xFF67] = "asmallkatakanahalfwidth",
+ [0xFF68] = "ismallkatakanahalfwidth",
+ [0xFF69] = "usmallkatakanahalfwidth",
+ [0xFF6A] = "esmallkatakanahalfwidth",
+ [0xFF6B] = "osmallkatakanahalfwidth",
+ [0xFF6C] = "yasmallkatakanahalfwidth",
+ [0xFF6D] = "yusmallkatakanahalfwidth",
+ [0xFF6E] = "yosmallkatakanahalfwidth",
+ [0xFF6F] = "tusmallkatakanahalfwidth",
+ [0xFF70] = "katahiraprolongmarkhalfwidth",
+ [0xFF71] = "akatakanahalfwidth",
+ [0xFF72] = "ikatakanahalfwidth",
+ [0xFF73] = "ukatakanahalfwidth",
+ [0xFF74] = "ekatakanahalfwidth",
+ [0xFF75] = "okatakanahalfwidth",
+ [0xFF76] = "kakatakanahalfwidth",
+ [0xFF77] = "kikatakanahalfwidth",
+ [0xFF78] = "kukatakanahalfwidth",
+ [0xFF79] = "kekatakanahalfwidth",
+ [0xFF7A] = "kokatakanahalfwidth",
+ [0xFF7B] = "sakatakanahalfwidth",
+ [0xFF7C] = "sikatakanahalfwidth",
+ [0xFF7D] = "sukatakanahalfwidth",
+ [0xFF7E] = "sekatakanahalfwidth",
+ [0xFF7F] = "sokatakanahalfwidth",
+ [0xFF80] = "takatakanahalfwidth",
+ [0xFF81] = "tikatakanahalfwidth",
+ [0xFF82] = "tukatakanahalfwidth",
+ [0xFF83] = "tekatakanahalfwidth",
+ [0xFF84] = "tokatakanahalfwidth",
+ [0xFF85] = "nakatakanahalfwidth",
+ [0xFF86] = "nikatakanahalfwidth",
+ [0xFF87] = "nukatakanahalfwidth",
+ [0xFF88] = "nekatakanahalfwidth",
+ [0xFF89] = "nokatakanahalfwidth",
+ [0xFF8A] = "hakatakanahalfwidth",
+ [0xFF8B] = "hikatakanahalfwidth",
+ [0xFF8C] = "hukatakanahalfwidth",
+ [0xFF8D] = "hekatakanahalfwidth",
+ [0xFF8E] = "hokatakanahalfwidth",
+ [0xFF8F] = "makatakanahalfwidth",
+ [0xFF90] = "mikatakanahalfwidth",
+ [0xFF91] = "mukatakanahalfwidth",
+ [0xFF92] = "mekatakanahalfwidth",
+ [0xFF93] = "mokatakanahalfwidth",
+ [0xFF94] = "yakatakanahalfwidth",
+ [0xFF95] = "yukatakanahalfwidth",
+ [0xFF96] = "yokatakanahalfwidth",
+ [0xFF97] = "rakatakanahalfwidth",
+ [0xFF98] = "rikatakanahalfwidth",
+ [0xFF99] = "rukatakanahalfwidth",
+ [0xFF9A] = "rekatakanahalfwidth",
+ [0xFF9B] = "rokatakanahalfwidth",
+ [0xFF9C] = "wakatakanahalfwidth",
+ [0xFF9D] = "nkatakanahalfwidth",
+ [0xFF9E] = "voicedmarkkanahalfwidth",
+ [0xFF9F] = "semivoicedmarkkanahalfwidth",
+ [0xFFE0] = "centmonospace",
+ [0xFFE1] = "sterlingmonospace",
+ [0xFFE3] = "macronmonospace",
+ [0xFFE5] = "yenmonospace",
+ [0xFFE6] = "wonmonospace",
+}
+
+fonts.map.agl_to_unicode = table.swapped(fonts.map.unicode_to_agl)
diff --git a/tex/context/base/font-arb.mkii b/tex/context/base/font-arb.mkii
new file mode 100644
index 000000000..3ec0395f3
--- /dev/null
+++ b/tex/context/base/font-arb.mkii
@@ -0,0 +1,5 @@
+\unprotected \writestatus\m!systems{load ARABTEX as a module instead}
+
+\usemodule[arabtex]
+
+\endinput
diff --git a/tex/context/base/font-bfm.mkii b/tex/context/base/font-bfm.mkii
new file mode 100644
index 000000000..23e3176c4
--- /dev/null
+++ b/tex/context/base/font-bfm.mkii
@@ -0,0 +1,196 @@
+%D \module
+%D [ file=font-bfm,
+%D version=2003.11.25,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Mixed Normal and Bold Math,
+%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 / Mixed Bold Math Support}
+
+%D The following example demonstrates how to use normal, bold, and mixed
+%D normal|/|bold math. Since not everyone has the Lucida on his|/|her
+%D machine we don't show the result.
+%D
+%D \starttyping
+%D \setupformulas
+%D [method=bold]
+%D
+%D \definetypeface [mainface] [rm] [serif] [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [tt] [mono] [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [ss] [sans] [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [mm] [math] [lucida] [default] [encoding=texnansi]
+%D \definetypeface [mainface] [mm] [bfmath] [lucida] [default] [encoding=texnansi]
+%D
+%D \definetypeface [boldmath] [rm] [serif] [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [tt] [mono] [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [ss] [sans] [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [mm] [boldmath] [lucida] [default] [encoding=texnansi]
+%D
+%D \switchtobodyfont[mainface]
+%D
+%D \startlines
+%D $\mainface x=10 \Gamma \Delta \alpha \delta \zeta$
+%D $\boldmath x=10 \Gamma \Delta \alpha \delta \zeta$
+%D \stoplines
+%D
+%D \startformula
+%D x=12=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[mainface]
+%D x=12=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath]
+%D x=12=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,8pt]
+%D x=8=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,12pt,small]
+%D x=12s=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,small]
+%D x=s=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,10pt]
+%D x=10=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,11pt,small]
+%D x=11s=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startformula[boldmath,9pt]
+%D x=9=\fontbody \Gamma \Delta \alpha \delta \zeta
+%D \stopformula
+%D
+%D \startlines
+%D \formula{1=2x}
+%D \formula[boldmath]{1=2x}
+%D \formula[mainface]{1=2x}
+%D \formula[mainface]{1 \theta \Gamma = \bfm 1 \beta \hbox{\sl test}\Gamma \alpha ' x x}
+%D \formula[mainface]{1 \theta \Gamma = {\bfm 1 \beta \hbox{\sl test}\Gamma \alpha ' x} x}
+%D \stoplines
+%D \stoptyping
+
+\unprotect
+
+%D \TEX\ has some hard wired expectations about where to look for
+%D certain characters. This means that we cannot overload the families
+%D 0 upto~3. Also, since we use C upto~F for math as well, we are left
+%D with the range 4 upto~B.
+
+\chardef\mrbffam\itfam \edef\c!mrbf{\c!mr\c!bf} \let\hexmrbffam\hexitfam % 4 it
+\chardef\exbffam\slfam \edef\c!exbf{\c!ex\c!bf} \let\hexexbffam\hexslfam % 5 sl
+\chardef\mibffam\bffam \edef\c!mibf{\c!mi\c!bf} \let\hexmibffam\hexbffam % 6 bf
+\chardef\sybffam\nnfam \edef\c!sybf{\c!sy\c!bf} \let\hexsybffam\hexnnfam % 7 nn
+\chardef\mabffam\bsfam \edef\c!mabf{\c!ma\c!bf} \let\hexmabffam\hexbsfam % 8 bs
+\chardef\mbbffam\bifam \edef\c!mbbf{\c!mb\c!bf} \let\hexmbbffam\hexbifam % 9 bi
+\chardef\mcbffam\scfam \edef\c!mcbf{\c!mc\c!bf} \let\hexmcbffam\hexscfam % A sc
+\chardef\mdbffam\scfam \edef\c!mdbf{\c!mc\c!bf} \let\hexmdbffam\hexscfam % B tf % tricky
+
+%D The next bunch of code looks horrible and tricky but one has to keep in
+%D mind that because \TEX\ makes several passes over the math list we need to
+%D make sure that grouping is handled well. Later assignments to a family
+%D overload previous ones, the last one counts.
+
+\newtoks \boldmathstrategies
+\newtoks \boldsymbstrategies
+
+\appendtoks
+ \dosetmathfamily\mrbffam\textface\scriptface\scriptscriptface\c!mrbf\mrfallback
+ \dosetmathfamily\mibffam\textface\scriptface\scriptscriptface\c!mibf\empty
+ \dosetmathfamily\sybffam\textface\scriptface\scriptscriptface\c!sybf\empty
+ \dosetmathfamily\exbffam\textface\textface \textface \c!exbf\empty
+ \dosetmathfamily\mabffam\textface\scriptface\scriptscriptface\c!mabf\empty
+ \dosetmathfamily\mbbffam\textface\scriptface\scriptscriptface\c!mbbf\empty
+ \dosetmathfamily\mcbffam\textface\scriptface\scriptscriptface\c!mcbf\empty
+\to \boldmathstrategies
+
+\appendtoks
+ \dosetskewchar\mifam\defaultskewcharmi
+ \dosetskewchar\syfam\defaultskewcharsy
+\to \boldmathstrategies
+
+\appendtoks
+ \dosetsymbfamily\mrbffam\textface\scriptface\scriptscriptface\c!mrbf
+ \dosetsymbfamily\mibffam\textface\scriptface\scriptscriptface\c!mibf
+ \dosetsymbfamily\sybffam\textface\scriptface\scriptscriptface\c!sybf
+ \dosetsymbfamily\exbffam\textface\textface \textface \c!exbf
+ \dosetsymbfamily\mabffam\textface\scriptface\scriptscriptface\c!mabf
+ \dosetsymbfamily\mbbffam\textface\scriptface\scriptscriptface\c!mbbf
+ \dosetsymbfamily\mcbffam\textface\scriptface\scriptscriptface\c!mcbf
+\to \boldsymbstrategies
+
+%D Here comes the real mess (due to semi||global settings en multiple
+%D passes over the math list once the input is expanded.
+
+\newevery \everyboldfacemath \relax
+\chardef \boldfacemathmethod \zerocount
+
+\appendtoks
+ \ifcase\boldfacemathmethod \else \the\boldmathstrategies \fi
+\to \mathstrategies
+
+\appendtoks
+ \ifcase\boldfacemathmethod \else \the\boldsymbstrategies \fi
+\to \symbstrategies
+
+\appendtoks
+ \let\mrfam\mrbffam \let\c!mr\c!mrbf \let\hexmrfam\hexmrbffam
+ \let\mifam\mibffam \let\c!mi\c!mibf \let\hexmifam\hexmibffam
+ \let\syfam\sybffam \let\c!sy\c!sybf \let\hexsyfam\hexsybffam
+ \let\exfam\exbffam \let\c!ex\c!exbf \let\hexexfam\hexexbffam
+ \let\mafam\mabffam \let\c!ma\c!mabf \let\hexmafam\hexmabffam
+ \let\mbfam\mbbffam \let\c!mb\c!mbbf \let\hexmbfam\hexmbbffam
+ \let\mcfam\mcbffam \let\c!mc\c!mcbf \let\hexmcfam\hexmcbffam
+\to \everyboldfacemath
+
+\appendtoks
+ \let\mathsubfamily\c!bf
+\to \everyboldfacemath
+
+\appendtoks
+ \synchronizemath \aftergroup\synchronizemath
+\to \everyboldfacemath
+
+%D \macros
+%D {boldfacemath, bfm, autoboldfacemath}
+%D
+%D These are the user commands, with \type {\bfm} being the most comfortable.
+
+\def\boldfacemath {\ifcase\boldfacemathmethod\else\the\everyboldfacemath\fi}
+\def\bfm {\boldfacemath} % no \let, so that we can redefine
+\def\autoboldfacemath{\appendtoks\ifcase\boldfacemathmethod\else\let\bf\boldfacemath\fi\to\everymathematics}
+
+%D We hook this feature into the formula mechanism.
+
+\setupformulas
+ [\c!method=\v!normal]
+
+\appendtoks
+ \doifelse{\formulaparameter\c!method}\v!bold
+ {\chardef\boldfacemathmethod\plusone}
+ {\chardef\boldfacemathmethod\zerocount}%
+\to \everysetupformulas
+
+%D Of course this only works when bfmath fonts are set up (see example at
+%D the top of this file) and bold math is enabled:
+%D
+%D \starttyping
+%D \setupformulas
+%D [method=bold]
+%D \stoptyping
+
+\protect \endinput
diff --git a/tex/context/base/font-chi.mkii b/tex/context/base/font-chi.mkii
new file mode 100644
index 000000000..0acf710d5
--- /dev/null
+++ b/tex/context/base/font-chi.mkii
@@ -0,0 +1,1156 @@
+%D \module
+%D [ file=font-chi,
+%D version=1999.10.10,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Chinese,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D suggestions=Wang Lei,
+%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.
+
+\ifx\handlechineseunicodeglyph\undefined \else \endinput \fi
+
+% NOT YET ADAPTED TO THE NEW FONT MACROS
+
+%D The first implementation (most of which is here) is based on
+%D the specific font layout. This is because not all glyphs are
+%D available in uniciode, which means that we cannot use
+%D unicode codepoints (yet); if it were possible we could use
+%D just one table per input encoding.
+
+\writestatus{loading}{ConTeXt Font Macros / Chinese}
+
+% much will to typo-chi.tex
+
+%D Still to be implemented:
+%D
+%D \startitemize
+%D \item columns left right touch
+%D \item distance = (hsize-n*bodyfontsize)/(n-1)
+%D \item char grids
+%D \item char tables
+%D \item all kind of rotated combinations
+%D \item hanging puctuation
+%D \item a few more encodings
+%D \item rotation list
+%D \stopitemize
+
+%M \setupbodyfont[chi]
+%M
+%M \def\WangLei{\purechinese{\uchar{205}{245}\uchar{192}{218}}}
+
+\useencoding[chi]
+
+%D When \WangLei\ sent me a mail asking if \CONTEXT\ was able
+%D to support Chinese, I wasn't sure if the answer could be
+%D yes. I knew that those languages, rich of glyphs, were
+%D typeset by \TEX, so in principle it should be possible. I
+%D asked or some more input and was told that there were
+%D \LATEX\ styles regarding those languages. When I unzipped
+%D the accompanying files, it became clear that I had to
+%D implement support for Chinese from scratch. There was a
+%D multitude of font, with rather unfamiliar encodings, a
+%D large collection of files with |<|at least for me|>|
+%D unknown purposes, and worse, the documentation was mainly
+%D in Chinese.
+%D
+%D So, \WangLei\ and I started exchanging some emails and it
+%D soon became clear that supporting Chinese was not that
+%D complicated at all. It mostly came to dealing with handling
+%D \UNICODE\ fonts. It also became clear that everything
+%D Chinese took place in the upper region of the eight bit
+%D character set. I wrote some macros that could process the
+%D small \type {Hello World} file \WangLei\ had send me, and
+%D after some bug fixes real Chinese came out. I started to
+%D like the look and fel of Chinese glyphs, so on we went.
+%D
+%D The first comments concerned spacing. The mix of English
+%D and Chinese demands some rather deliberate handling of
+%D spacing. Breaking lines was not so much a problem, and
+%D could be solved by adding some glue between Chinese glyphs.
+%D
+%D In the meantime had asked \WangLei\ for some language bound
+%D labels and texts, and implementing these was rather
+%D straightforward. But, there were still some issues to deal
+%D with: conversion of numbers, date handling and index
+%D sorting.
+%D
+%D I consider(ed) writing Chinese support to be a nice puzzle,
+%D since I have to act on chinese \CONTEXT\ code, where I only
+%D understand the \CONTEXT\ part. The drawings \WangLei\ made
+%D me (in drawing packages) were of great help. Since I write
+%D these modules from scratch, although I fall back on some
+%D basic encoding and font modules, I consider them to be
+%D rather clean. This cannot be said of all \CONTEXT\ font
+%D modules \type {-)}.
+
+\unprotect
+
+%D Because Chinese glyphs have more height than the average
+%D Latin glyph, and at the same time don't have much depth,
+%D we adapt the scale.
+%D
+%D Before and after the glyph we have to deal with Chinese
+%D spacing. Special attention is given to punctuation.
+%D
+%D \starttyping
+%D [some short nice chinese text with () and english]
+%D \stoptyping
+%D
+%D We insert a bit of stretch and introduce a signal to
+%D keep track of previous characters. We use a similar
+%D method in the units module, which may be a nice
+%D introduction to using signals.
+
+%D \macros
+%D {chineseunicodescale, chineseinterglyphskip,
+%D chineseunicodeheight, chineseunicodedepth, chinesespace}
+%D
+%D There are a few variables, that can be (re|)|set
+%D depending on the current font. They default to:
+
+% hm, why don't we use the normal unicodestrut mechanism?
+
+\def\chineseunicodescale {1.00} % not smaller than .85
+\def\chineseunicodeheight {1.00}
+\def\chineseunicodedepth {1.00}
+\def\chineseinterglyphskip{0pt \!!plus .05em \!!minus .01em}
+\def\chinesesurroundskip {.25em \!!plus .15em \!!minus .05em}
+
+%D We define a few signals. As said, another example of
+%D using signals can be found in the module \type {m-units}.
+
+\newsignal\chineseLsignal % left boundary character
+\newsignal\chineseRsignal % right boundary character
+\newsignal\chineseSsignal % any other character (symbol)
+
+\chardef\chineseBstatus=0 % 0=unknown 1=left 2=right 3=chinese 4=nospace
+\chardef\chineseAstatus=0 % 0=unknown 1=left 2=right 3=space
+\chardef\chineseSstatus=0 % 0=unknown 1=left 2=right
+
+\sfcode`(=2000 % a temporary hack
+
+\def\chinesenobreak
+ {\relax
+ \iftracechinese
+ \nobreak
+ \kern-.5pt\color[red]{\vrule\!!width1pt}\kern-.5pt
+ \nobreak
+ \else
+ \nobreak
+ \fi}
+
+\newif\ifcorrectchineseboundarychars
+
+\def\chineseunskip
+ {\unskip\unskip\unskip\unskip}
+
+\def\insertchineseglyph
+ {\iftracechinese\tracedchineseglyph\else\insertunicodeglyph\fi}
+
+\newif\ifverticalchinese
+
+\def\handlechineseunicodeglyph
+ {\ifinpagebody
+ \horizontalchineseunicodeglyph
+ \else\ifverticalchinese
+ \verticalchineseunicodeglyph
+ \else
+ \horizontalchineseunicodeglyph
+ \fi\fi}
+
+% chinese classes: left=1|right=2|center=3
+
+\chardef\plusfour=4
+
+\def\analyzechineseunicodeglyph % beware, no zerocount !
+ {\chardef\chineseSstatus0\getvalue{uc\number\unicodeposition}\relax}
+
+\def\analyzechineseunicodeenviroment
+ {% left
+ \ifx (\nextutoken \chardef\chineseAstatus\plusone \else
+ \ifx [\nextutoken \chardef\chineseAstatus\plusone \else
+ % right
+ \ifx ,\nextutoken \chardef\chineseAstatus\plustwo \else
+ \ifx .\nextutoken \chardef\chineseAstatus\plustwo \else
+ \ifx ?\nextutoken \chardef\chineseAstatus\plustwo \else
+ \ifx ;\nextutoken \chardef\chineseAstatus\plustwo \else
+ \ifx :\nextutoken \chardef\chineseAstatus\plustwo \else
+ \ifx !\nextutoken \chardef\chineseAstatus\plustwo \else
+ \ifx )\nextutoken \chardef\chineseAstatus\plustwo \else
+ \ifx ]\nextutoken \chardef\chineseAstatus\plustwo \else
+ % space
+ \ifx\nextutoken\blankspace \chardef\chineseAstatus\plusthree \else
+ \ifx\nextutoken\space \chardef\chineseAstatus\plusthree \else
+ \chardef\chineseAstatus\zerocount
+ % unknown
+ \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi \fi\fi
+ % maybe save the last skip?
+ \chardef\chineseBstatus\ifdim\lastskip=\zeropoint\plusfour\else\zerocount\fi
+ \ifdim\lastskip=\chineseLsignal \chardef\chineseBstatus\plusone \else
+ \ifdim\lastskip=\chineseRsignal \chardef\chineseBstatus\plustwo \else
+ \ifdim\lastskip=\chineseSsignal \chardef\chineseBstatus\plusthree \else
+ \scratchskip=\lastskip \unskip
+ \ifdim\lastskip=\chineseLsignal \chardef\chineseBstatus\plusone \else
+ \ifdim\lastskip=\chineseRsignal \chardef\chineseBstatus\plustwo \else
+ \ifdim\lastskip=\chineseSsignal \chardef\chineseBstatus\plusthree \else
+ \space\scratchskip=\lastskip \unskip
+ \setbox\scratchbox=\hbox\bgroup
+ (\space
+ \ifdim\lastskip=\scratchskip
+ \egroup \chardef\chineseBstatus\plusone
+ \else
+ \egroup
+ \ifdim\scratchskip=\zeropoint \chardef\chineseBstatus\plusfour \fi
+ \fi
+ \fi\fi\fi
+ \fi\fi\fi}
+
+\def\horizontalchineseunicodeglyph
+ {\relax
+ \ifhmode\else\dontleavehmode\fi % added
+ \setunicodescale\chineseunicodescale % redundant
+ \setunicodestrut\chineseunicodeheight\chineseunicodedepth % redundant
+ \ifprocessingverbatim
+ \iftracechinese
+ \ruledhbox{\insertunicodeglyph}%
+ \else
+ \insertunicodeglyph
+ \fi
+ \else\ifx\nextutoken\relax
+ \insertunicodeglyph
+ \else
+ \analyzechineseunicodeglyph
+ \analyzechineseunicodeenviroment
+ \ifcase\chineseSstatus\relax
+ \ifcase\chineseBstatus\relax
+ \chineseunskip
+ \hskip\chinesesurroundskip % unknown
+ \or
+ \chineseunskip
+ \chinesenobreak % left
+ \or
+ \ifcorrectchineseboundarychars\else\chineseunskip\fi
+ \hskip\chineseinterglyphskip % right
+ \or
+ \chineseunskip
+ \hskip\chineseinterglyphskip % chinese
+ \or
+ % whatever
+ \fi
+ \insertchineseglyph
+ \ifcase\chineseAstatus\relax
+ \hskip\chineseinterglyphskip % unknown
+ \hskip\chinesesurroundskip
+ \ifcase\chineseSstatus
+ \hskip\chineseSsignal
+ \or
+ \hskip\chineseLsignal
+ \else
+ \hskip\chineseRsignal
+ \fi
+ \or
+ \hskip\chineseinterglyphskip % left
+ \chinesenobreak
+ \hskip\chineseLsignal
+ \or
+ \chinesenobreak % right
+ \hskip\chineseinterglyphskip
+ \chinesenobreak
+ \hskip\chineseRsignal
+ \or
+ \hskip\chineseinterglyphskip % space
+ \hskip\chinesesurroundskip
+ \hskip\chineseSsignal
+ \fi
+ \or % left
+ \ifcorrectchineseboundarychars
+ \let\unicodecharcommand\chineseleftcharcommand
+ \fi
+ \chineseunskip
+ \insertchineseglyph
+ \chinesenobreak
+ \hskip\chineseLsignal
+ \or % right
+ \ifcorrectchineseboundarychars
+ \let\unicodecharcommand\chineserightcharcommand
+ \fi
+ \chineseunskip
+ \chinesenobreak
+ \insertchineseglyph
+ \hskip\chineseRsignal
+ \else % center
+ \chineseunskip
+ \chinesenobreak
+ \insertchineseglyph
+ \hskip\chineseinterglyphskip
+ \hskip\chineseRsignal
+ \fi\fi
+ \aftergroup\ignorespaces % watch this
+ \fi}
+
+\def\verticalchineseunicodeglyph
+ {\relax
+ \ifprocessingverbatim % to do
+ \horizontalchineseunicodeglyph
+ \else
+ \setunicodescale\chineseunicodescale % redundant
+ \setunicodestrut\chineseunicodeheight\chineseunicodedepth % redundant
+ \ifx\nextutoken\relax
+ \insertchineseglyph
+ \ifvmode % catches \hbox{...}, actually \hbox should be \vbox -)
+ \nointerlineskip
+ \fi
+ \allowbreak
+ \else
+ \analyzechineseunicodeglyph
+ \setbox\scratchbox\hbox to \hsize
+ {\hss
+ \ifcase\chineseSstatus\relax
+ \insertchineseglyph
+ \else % left / right
+ \setbox\scratchbox\hbox{\insertchineseglyph}%
+ \rotate[\c!rotation=270]{\box\scratchbox}%
+ \fi
+ \hss}%
+ \ht\scratchbox\unicodeheight\strutht
+ \dp\scratchbox\unicodedepth \strutdp
+ \ifvmode % catches \hbox{...}, actually \hbox should be \vbox -)
+ \nointerlineskip
+ \fi
+ \ifcase\prevchineseSstatus\relax
+ \ifnum\chineseSstatus=\plustwo \par\nobreak\else\allowbreak\fi
+ \or % left
+ \par\nobreak
+ \or % right
+ \ifnum\chineseSstatus=\plustwo \par\nobreak\else\allowbreak\fi
+ \fi
+ \global\chardef\prevchineseSstatus\chineseSstatus % pagebody ...
+ \box\scratchbox\par
+ \fi
+ \aftergroup\ignorespaces % watch this
+ \fi}
+
+%D \macros
+%D {setupchinese,startvertical,nochinese}
+%D
+%D The previous macros implement horizontal as well as
+%D vertical typesetting. Vertical typesetting is implemented
+%D on top of the multi||column routines.
+
+\def\setupchinese
+ {\dodoubleargument\getparameters[\??vt]}
+
+\def\startvertical
+ {\dosingleempty\dostartvertical}
+
+\def\dostartvertical[#1]%
+ {\bgroup
+ \def\maxnofcolumns{25}%
+ \verticalchinesetrue
+ \global\chardef\prevchineseSstatus\zerocount
+ \let\nochinese\nochineseinvertical
+ \doif\@@vtn\v!fit
+ {\dimen0=\textwidth \advance\dimen0 \@@vtdistance
+ \dimen2=\bodyfontsize \advance\dimen2 \@@vtdistance
+ \divide\dimen0 \number\dimen2
+ \edef\@@vtn{\number\dimen0}}%
+ \startcolumns
+ [\c!direction=\@@vtdirection,
+ \c!balance=\@@vtbalance,
+ \c!distance=\@@vtdistance,
+ \c!n=\@@vtn,
+ #1]}
+
+\def\stopvertical
+ {\stopcolumns
+ \egroup}
+
+\setupchinese
+ [\c!direction=\v!left,
+ \c!balance=\v!no,
+ \c!n=\v!fit,
+ \c!distance=1.5\bodyfontsize]
+
+%D We can set up vertical typesetting with \type
+%D {\setupchinese}.
+
+%D \macros
+%D {nochineseinvertical}
+%D
+%D English (non chinese) text is typeset rotated:
+
+\def\nochineseinvertical#1%
+ {\par
+ \setbox\scratchbox\hbox{\strut#1}
+ \getnoflines{\wd\scratchbox}
+ \setbox\scratchbox\hbox to \noflines\openlineheight
+ {\hss\box\scratchbox\hss}
+ \hbox to \hsize
+ {\hss
+ \rotate
+ [\c!rotation=270]
+ {\vbox to \ht\scratchbox{\vss\box\scratchbox\vss}}%
+ \hss}
+ \par}
+
+%D \macros
+%D {correctchineseboundarychars}
+%D
+%D Careful reading of the previous macro learns that we
+%D treat left and right glyphs differently. When we say
+%D
+%D \starttyping
+%D \correctchineseboundarycharstrue
+%D \stoptyping
+%D
+%D For the moment correction in on by default.
+
+\correctchineseboundarycharstrue
+
+\def\chineserightcharcommand#1%
+ {\iftracechinese\ruledhbox\else\hbox\fi \!!to .5em{#1\hss}%
+ \hskip.25em\!!plus .25em\relax}%
+
+\def\chineseleftcharcommand#1%
+ {\ifnum\chineseBstatus<4 \hskip.25em \!!plus .25em\relax\fi
+ \iftracechinese\ruledhbox\else\hbox\fi \!!to .5em{\hss#1}}%
+
+% \def\chineserightcharcommand#1%
+% {\setbox\scratchbox=\hbox{#1}%
+% \scratchdimen=.5em
+% \ifdim\wd\scratchbox>\scratchdimen
+% \iftracechinese\ruledhbox\else\hbox\fi \!!to \scratchdimen
+% {\box\scratchbox\hss}%
+% \hskip.5\scratchdimen\!!plus.5\scratchdimen\relax
+% \else
+% \box\scratchbox
+% \fi}
+
+% \def\chineseleftcharcommand#1%
+% {\setbox\scratchbox=\hbox{#1}%
+% \scratchdimen=.5em
+% \ifdim\wd\scratchbox>\scratchdimen
+% \ifnum\chineseBstatus<4
+% \hskip.5\scratchdimen\!!plus.5\scratchdimen\relax
+% \fi
+% \iftracechinese\ruledhbox\else\hbox\fi \!!to \scratchdimen
+% {\hss\box\scratchbox}%
+% \else
+% \box\scratchbox
+% \fi}
+
+%D The long list of numbers in the previous macro identify the
+%D characters where special care is needed for breaking lines.
+%D A linebreak is not permitted before:
+%D
+%D \def\DoIt #1 #2 %
+%D {\hbox{\hbox to 2em{\uchar{#1}{#2}\hss}#1 #2}\par}
+%D
+%D \startcolumns[n=5]
+%D \DoIt 161 162 \DoIt 161 163 \DoIt 161 164 \DoIt 161 167 \DoIt 161 173
+%D \DoIt 161 175 \DoIt 161 177 \DoIt 161 179 \DoIt 161 181 \DoIt 161 183
+%D \DoIt 161 185 \DoIt 161 187 \DoIt 161 189 \DoIt 161 191 \DoIt 161 227
+%D \DoIt 161 228 \DoIt 161 229 \DoIt 163 161 \DoIt 163 162 \DoIt 163 167
+%D \DoIt 163 169 \DoIt 163 172 \DoIt 163 174 \DoIt 163 186 \DoIt 163 187
+%D \DoIt 163 190 \DoIt 163 191 \DoIt 163 221 \DoIt 163 253
+%D \stopcolumns
+%D
+%D A linebreak is not permitted after the following glyphs:
+%D
+%D \startcolumns[n=5]
+%D \DoIt 161 174 \DoIt 161 176 \DoIt 161 178 \DoIt 161 180 \DoIt 161 182
+%D \DoIt 161 184 \DoIt 161 186 \DoIt 161 188 \DoIt 161 190 \DoIt 163 168
+%D \DoIt 163 219 \DoIt 163 224 \DoIt 163 251
+%D \stopcolumns
+
+%D \macros
+%D {tracechinesetrue, showchinesetracelegend}
+%D
+%D When we say \type {\tracechinesetrue}, we get some
+%D insight in the way \CONTEXT\ handles the Chinese glyphs.
+%D The symbols and color used represent:
+%D
+%D \showchinesetracelegend
+
+\newif\iftracechinese
+
+\def\showchinesetracelegend
+ {\definetabulate[\s!dummy][|c|l|l|l|]%
+ \startdummy
+ \HL
+ \NC \bf key \NC \bf meaning \NC \bf glyph \NC \bf keys \NC\NR
+ \HL
+ \NC u \NC unknown character type \NC \color[green]{current} \NC u l r \NC\NR
+ \NC l \NC left boundary character \NC \color[red]{previous} \NC u l r c n \NC\NR
+ \NC r \NC right boundary character \NC \color[blue]{next} \NC u l r s \NC\NR
+ \NC c \NC chinese character \NC \NC \NC\NR
+ \NC s \NC following space \NC \NC \NC\NR
+ \NC n \NC no preceding space \NC \NC \NC\NR
+ \HL
+ \stopdummy}
+
+\def\tracedchineseglyph
+ {\dontleavehmode
+ \ruledhbox
+ {\setbox\scratchbox\hbox{\insertunicodeglyph}%
+ \hbox to \wd\scratchbox
+ {\localcolortrue
+ \copy\scratchbox
+ \infofont
+ \hskip-\wd\scratchbox
+ \hbox to \wd\scratchbox
+ {\hss
+ \color[green]{\ifcase\chineseSstatus\relax u\or l\or r\fi}%
+ \hss}%
+ \hskip-\wd\scratchbox
+ \lower\dp\scratchbox\hbox to \wd\scratchbox
+ {\hss
+ \color[red]{\ifcase\chineseBstatus\relax u\or l\or r\or c\or n\fi}%
+ \hss
+ \color[blue]{\ifcase\chineseAstatus\relax u\or l\or r\or s\fi}%
+ \hss}}}}
+
+%D The following example shows how tracing works.
+%D
+%D \start \tracechinesetrue
+%D һθǽܶĵ֧֡ĵ
+%D ѯ \nochinese{\CONTEXT} ǷܴʱѾԹ
+%D еĺ꼯ûеõζŶĵֻ֧û
+%D ʵ֡
+%D
+%D һ(θ) () ܶĵ֧֡ĵ,
+%D ѯ\nochinese{\CONTEXT}ǷܴʱѾ
+%D Թеĺ꼯ûеõζŶĵ֧
+%D ûʵ֡.
+%D \stop
+
+%D Because fonts are defined each time a \UNICODE\ is
+%D encountered |<|which is less inefficient than one would
+%D imagine, because \TEX\ is optimized quite well in this
+%D repect|>| we can define macros like this to take care of
+%D font switches. When available, one can add definitions
+%D for italic, slanted, bold fonts and combinations of these.
+
+%D \macros
+%D {chinesenumber}
+%D
+%D The chinese numbering systems rather straightforward. First
+%D there are the digits:
+%D
+%D \starttabulate[|c|c|c|c|c|c|c|c|c|c|]
+%D \NC 0 \NC 1 \NC 2 \NC 3 \NC 4 \NC 5 \NC 6 \NC 7 \NC 8 \NC 9 \NC\NR
+%D \NC \chinesenumber{0} \NC \chinesenumber{1} \NC \chinesenumber{2}
+%D \NC \chinesenumber{3} \NC \chinesenumber{4} \NC \chinesenumber{5}
+%D \NC \chinesenumber{6} \NC \chinesenumber{7} \NC \chinesenumber{8}
+%D \NC \chinesenumber{9} \NC\NR
+%D \stoptabulate
+%D
+%D Apart from these numbers, we have dedicated representations
+%D of some powers of~$10$.
+%D
+%D \starttabulate[|c|c|c|c|c|]
+%D \NC 10 \NC 100 \NC 1000 \NC 10000 \NC 100000000 \NC\NR
+%D \NC \chinesenumber{10} \NC \chinesenumber{100}
+%D \NC \chinesenumber{1000} \NC \chinesenumber{10000}
+%D \NC \chinesenumber{100000000} \NC\NR
+%D \stoptabulate
+%D
+%D The number~12 is a combination of $1\times10+2$, or:
+%D \chinesenumber {12}, while~22 becomes \chinesenumber {22}.
+%D The numbers below 20 are treated a bit different, just like
+%D numbers with series of $0$'s. So $2\times10$ comes out as
+%D two glyphs, but $1\times10$ as one, because in the latter
+%D case the~$1$ is redundant. The same is true for the powers
+%D of~10.
+%D
+%D \starttabulate[|r|r|r|r|r|r|]
+%D \NC 1 \NC \chinesenumber {1} \NC
+%D 9 \NC \chinesenumber {9} \NC
+%D 4 \NC \chinesenumber {4} \NC\NR
+%D \NC 11 \NC \chinesenumber {11} \NC
+%D 99 \NC \chinesenumber {99} \NC
+%D 16 \NC \chinesenumber {16} \NC\NR
+%D \NC 111 \NC \chinesenumber {111} \NC
+%D 999 \NC \chinesenumber {999} \NC
+%D 256 \NC \chinesenumber {256} \NC\NR
+%D \NC 1111 \NC \chinesenumber {1111} \NC
+%D 9999 \NC \chinesenumber {9999} \NC
+%D 65536 \NC \chinesenumber {65536} \NC\NR
+%D \stoptabulate
+%D
+%D The implementation is rather simple. For internal purposes,
+%D we let zero expand to~0. The digits $0-9$ and numbers $10$,
+%D $100$, $1000$, $10000$ and $100000000$ are hard coded.
+
+% This was the first implementation, before \WangLei\ asked
+% me to look into Big Five encoding, so, like everthing in
+% \TEX, things become a bit more complicated, but also more
+% versatile.
+%
+% \starttypen
+% \def\chinesedigit#1%
+% {\ifnum #1=100000000 \uchar{210}{218}% 100000000
+% \else\ifnum #1=10000 \uchar{205}{242}% 10000
+% \else\ifnum #1=1000 \uchar{199}{167}% 1000
+% \else\ifnum #1=100 \uchar{176}{217}% 100
+% \else\ifnum #1=10 \uchar{202}{174}% 10
+% \else\ifcase#1 \uchar{193}{227}% 0
+% \or \uchar{210}{187}% 1
+% \or \uchar{182}{254}% 2
+% \or \uchar{200}{253}% 3
+% \or \uchar{203}{196}% 4
+% \or \uchar{206}{229}% 5
+% \or \uchar{193}{249}% 6
+% \or \uchar{198}{223}% 7
+% \or \uchar{176}{203}% 8
+% \or \uchar{190}{197}% 9
+% \fi\fi\fi\fi\fi\fi}
+% \stoptypen
+
+%D We will implement four methods, the one described earlier,
+%D a derived one with capitalized characters, an extended
+%D version of the first method, and a rather Arabic method.
+%D
+%D \starttabulate[|l|l|]
+%D \HL
+%D \NC \bf command \NC \bf number 39 \NC\NR
+%D \HL
+%D \NC \type{\normalchinesenumber} \NC \normalchinesenumber {39} \NC\NR
+%D \NC \type{\capitalizedchinesenumber} \NC \capitalizedchinesenumber{39} \NC\NR
+%D \NC \type{\arabicchinesenumber} \NC \arabicchinesenumber {39} \NC\NR
+%D \NC \type{\extendedchinesenumber} \NC \extendedchinesenumber {39} \NC\NR
+%D \HL
+%D \stoptabulate
+%D
+%D We use a dirty trick to enable Chinese Capital Digits. In
+%D the encoding vectors, we define these by appending a suffix
+%D \type {*} to the digit, which in the following macro is
+%D appended or not (by passing \type {\empty}).
+
+\def\chinesedigit#1#2% #2: suffix, here * or \empty
+ {\udigit{\chineseencoding}{\number#1#2}}
+
+% Normal Chinese Number
+
+\def\normalchinesenumber#1%
+ {\expandafter\dochinesenumber\number#1\relax\empty}
+
+\def\dochinesenumber#1#2\relax#3%
+ {\ifnum#1#2<10 % 1-10
+ \chinesedigit{#1}#3%
+ \else\ifnum#1#2<20 % 11-99
+ \chinesedigit{10}#3%
+ \dodochinesenumberA#2\relax#3%
+ \else
+ \dodochinesenumber#1#2\relax#3%
+ \fi\fi}
+
+\def\dodochinesenumber#1#2\relax#3%
+ {\ifnum#1=0
+ \chinesedigit{0}#3%
+ \dododochinesenumber0#2\relax#3%
+ \else\ifnum#1#2<10 % 1-10
+ \chinesedigit{#1#2}#3%
+ \dodochinesenumberA#2\relax#3%
+ \else\ifnum#1#2<100 % 11-99
+ \dodochinesenumber#1\relax#3%
+ \chinesedigit{10}#3%
+ \dodochinesenumberA#2\relax#3%
+ \else\ifnum#1#2<1000 % 100-999
+ \dodochinesenumber#1\relax#3%
+ \chinesedigit{100}#3%
+ \dodochinesenumberA#2\relax#3%
+ \else\ifnum#1#2<10000 % 1000-9999
+ \dodochinesenumber#1\relax#3%
+ \chinesedigit{1000}#3%
+ \dodochinesenumberA#2\relax#3%
+ \else\ifnum#1#2<100000 % 10000-99999
+ \dodochinesenumber#1\relax#3%
+ \chinesedigit{10000}#3%
+ \dodochinesenumberA#2\relax#3%
+ \else\ifnum#1#2<1000000 % 100000-999999
+ \dodochinesenumberB#1#2\relax#3%
+ \else\ifnum#1#2<10000000 % 1000000-9999999
+ \dodochinesenumberC#1#2\relax#3%
+ \else\ifnum#1#2<100000000 % 10000000-99999999
+ \dodochinesenumberD#1#2\relax#3%
+ \else\ifnum#1#2<1000000000 % 10000000-99999999
+ \dochinesenumber#1\relax#3%
+ \chinesedigit{100000000}#3%
+ \dododochinesenumber#2\relax#3%
+ \else
+ \dodochinesenumberE#1#2\relax#3%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\def\dododochinesenumber#1#2\relax#3%
+ {\ifnum#1=0
+ \ifnum0#2>0 \dododochinesenumber#2\relax#3\fi
+ \else
+ \dodochinesenumber#1#2\relax#3%
+ \fi}
+
+\def\dodochinesenumberA#1\relax#2%
+ {\ifcase0#1 \else\dodochinesenumber#1\relax#2\fi}
+
+\def\dodochinesenumberB#1#2#3\relax#4%
+ {\dochinesenumber#1#2\relax#4%
+ \chinesedigit{10000}#4%
+ \dododochinesenumber#3\relax#4}
+
+\def\dodochinesenumberC#1#2#3#4\relax#5%
+ {\dochinesenumber#1#2#3\relax#5%
+ \chinesedigit{10000}#5%
+ \dododochinesenumber#4\relax#5}
+
+\def\dodochinesenumberD#1#2#3#4#5\relax#6%
+ {\dochinesenumber#1#2#3#4\relax#6%
+ \chinesedigit{10000}#6%
+ \dododochinesenumber#5\relax#6}
+
+\def\dodochinesenumberE#1#2#3\relax#4%
+ {\dochinesenumber#1#2\relax#4%
+ \chinesedigit{100000000}#4%
+ \dododochinesenumber#3\relax#4}
+
+% Capitalized Chinese Number
+
+\def\capitalizedchinesenumber#1%
+ {\expandafter\dochinesenumber\number#1\relax*}
+
+% Extended Chinese Number
+
+\def\extendedchinesenumber#1%
+ {\expandafter\doextendedchinesenumber\number#1\relax}
+
+\def\doextendedchinesenumber#1#2\relax%
+ {\ifnum #1#2<20 % 0-19
+ \dochinesenumber#1#2\relax\empty
+ \else\ifnum#1#2<30 % 20-29
+ \chinesedigit{20}\empty
+ \ifcase#2\else\chinesedigit{2#2}\fi
+ \else\ifnum#1#2<40 % 30-39
+ \chinesedigit{30}\empty
+ \ifcase#2\else\chinesedigit{3#2}\fi
+ \else
+ \dochinesenumber#1#2\relax\empty
+ \fi\fi\fi}
+
+% Arabic Chinese Number
+
+\def\arabicchinesenumber#1%
+ {\expandafter\doarabicchinesenumber\number#1@\relax}
+
+\def\doarabicchinesenumber#1#2\relax
+ {\if#1@\else
+ \chinesedigit{#1}\empty
+ \doarabicchinesenumber#2\relax
+ \fi}
+
+% The short call:
+
+\def\chinesenumber{\normalchinesenumber}
+
+% \dorecurse{40}
+% {\hbox
+% {\processingverbatimtrue
+% \hbox to 1cm{\hss\recurselevel}\quad
+% \hbox to 3cm{\hss\strut\normalchinesenumber {\recurselevel}}\quad
+% \hbox to 3cm{\hss\strut\capitalizedchinesenumber{\recurselevel}}\quad
+% \hbox to 3cm{\hss\strut\arabicchinesenumber {\recurselevel}}\quad
+% \hbox to 3cm{\hss\strut\extendedchinesenumber {\recurselevel}}\crlf}}
+
+%D The next table demonstates the correctness of the
+%D conversion macro.
+%D
+%D \startbuffer
+%D \starttable[|l|l|l|l|l|l|]
+%D \HL
+%D \NC number \NC converter \NC hard coded \NC
+%D number \NC converter \NC hard coded\NC \SR
+%D \HL
+%D \NC 1 \NC \chinesenumber{1} \NC һ \NC
+%D 0 \NC \chinesenumber{0} \NC \NC\FR
+%D \NC 11 \NC \chinesenumber{11} \NC ʮһ \NC
+%D 10 \NC \chinesenumber{10} \NC ʮ \NC\MR
+%D \NC 111 \NC \chinesenumber{111} \NC һһʮһ \NC
+%D 100 \NC \chinesenumber{100} \NC һ \NC\MR
+%D \NC 101 \NC \chinesenumber{101} \NC һһ \NC
+%D 120 \NC \chinesenumber{120} \NC һٶʮ \NC\MR
+%D \NC 1111 \NC \chinesenumber{1111} \NC һǧһһʮһ \NC
+%D 1000 \NC \chinesenumber{1000} \NC һǧ \NC\MR
+%D \NC 1001 \NC \chinesenumber{1001} \NC һǧһ \NC
+%D 1020 \NC \chinesenumber{1020} \NC һǧʮ \NC\MR
+%D \NC 11111 \NC \chinesenumber{11111} \NC һһǧһһʮһ \NC
+%D 10000 \NC \chinesenumber{10000} \NC һ \NC\MR
+%D \NC 10001 \NC \chinesenumber{10001} \NC һһ \NC
+%D 10200 \NC \chinesenumber{10200} \NC һ \NC\LR
+%D \HL
+%D \NC 111111 \NC \chinesenumber{111111} \NC ʮһһǧһһʮһ \NC
+%D 100000 \NC \chinesenumber{100000} \NC ʮ \NC\FR
+%D \NC 1111111 \NC \chinesenumber{1111111} \NC һһʮһһǧһһʮһ \NC
+%D 1000000 \NC \chinesenumber{1000000} \NC һ \NC\MR
+%D \NC 11111111 \NC \chinesenumber{11111111} \NC һǧһһʮһһǧһһʮһ \NC
+%D 10000000 \NC \chinesenumber{10000000} \NC һǧ \NC\MR
+%D \NC 111111111 \NC \chinesenumber{111111111} \NC һһǧһһʮһһǧһһʮһ \NC
+%D 100000000 \NC \chinesenumber{100000000} \NC һ \NC\MR
+%D \NC 1111111111 \NC \chinesenumber{1111111111} \NC ʮһһǧһһʮһһǧһһʮһ \NC
+%D 1000000000 \NC \chinesenumber{1000000000} \NC ʮ \NC\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \placetable{Some Chinese number examples.}{\getbuffer}
+
+%D Although the conversion can be hooked into most commands
+%D that deal with numbers |<|those familiar with \TEX\ macro
+%D programming will notice that the macro if fully
+%D expandable|>| in many cases Chinese documents use western
+%D digits. So, in practice, the change that the next example
+%D shows up, is minimal.
+%D
+%D \starttabulate[|r|r|c|]
+%D \NC 2546 \NC \chinesenumber {2546} \NC \NC\NR
+%D \NC 9258 \NC \chinesenumber {9258} \NC $+$ \NC\NR
+%D \HL
+%D \NC 11804 \NC \chinesenumber {11804} \NC \NC\NR
+%D \stoptabulate
+%D
+%D While in arabic arithmics addition leads to more digits, in
+%D Chinese the number of glyphs can (temporary) decrease.
+%D Given that the number of people dealing with Chinese is
+%D considerably larger than the number of latin speaking
+%D people, a successor of \TEX\ definitely must provide a
+%D \type {\chinesenumeral} primitive.
+
+\defineconversion [c] [\normalchinesenumber]
+\defineconversion [chinese] [\normalchinesenumber]
+\defineconversion [nc] [\normalchinesenumber]
+\defineconversion [normalchinese] [\normalchinesenumber]
+\defineconversion [cc] [\capitalizedchinesenumber]
+\defineconversion [capitalizedchinese] [\capitalizedchinesenumber]
+\defineconversion [ec] [\extendedchinesenumber]
+\defineconversion [extendedchinese] [\extendedchinesenumber]
+\defineconversion [ac] [\arabicchinesenumber]
+\defineconversion [arabicchinese] [\arabicchinesenumber]
+
+%D Date conversion:
+
+\defineconversion [cn] [\v!day] [\chinesenumber]
+\defineconversion [cn] [\v!month] [\chinesenumber]
+\defineconversion [cn] [\v!year] [\chinesenumber]
+
+%D \macros
+%D {SimChi, TraChi}
+%D
+%D These components enable us to construct dedicated Chinese
+%D font switches, like:
+
+\setupunicodefont
+ [chinese]
+ [ \c!scale=\chineseunicodescale,
+ \c!height=\chineseunicodeheight,
+ \c!depth=\chineseunicodedepth,
+ \c!strut=\v!yes,
+ \c!interlinespace=\v!yes,
+ \c!conversion=\chinesenumber,
+ \c!commands=\setchineseencoding, % needed for digits
+ \c!command=\handlechineseunicodeglyph]
+
+%D For the moment, this encoding is implemented rather ugly. The
+%D trick is to move the encoding value from the current font
+%D definition to the \type {\chineseencoding} macro.
+
+\let\chineseencoding\empty
+
+\def\setchineseencoding % normally SomeChineseRegular
+ {\getfontfileparameters\unicodestyle
+ \ifx\currentfontfileencoding\undefined \else
+ \let\chineseencoding\currentfontfileencoding
+ \fi}
+
+%D We could have said:
+%D
+%D \starttyping
+%D \defineunicodefont
+%D [SimChi]
+%D [SimplifiedChinese]
+%D [\c!scale=\chineseunicodescale,
+%D \c!height=\chineseunicodeheight,
+%D \c!depth=\chineseunicodedepth,
+%D \c!conversion=\chinesenumber,
+%D \c!commands=\setchineseencoding, % needed for digits
+%D \c!command=\handlechineseunicodeglyph]
+%D \stoptyping
+%D
+%D However, the former definitions is more general. Next we
+%D map a few fonts:
+
+\definefontsynonym [SimplifiedChineseRegular] [gbsong] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSlanted] [gbsongsl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseItalic] [gbsongsl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseBold] [gbhei] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseBoldSlanted] [gbheisl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseBoldItalic] [gbheisl] [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseRegular] [b5song] [encoding=big5]
+\definefontsynonym [TraditionalChineseSlanted] [b5songsl] [encoding=big5]
+\definefontsynonym [TraditionalChineseItalic] [b5songsl] [encoding=big5]
+\definefontsynonym [TraditionalChineseBold] [b5hei] [encoding=big5]
+\definefontsynonym [TraditionalChineseBoldSlanted] [b5heisl] [encoding=big5]
+\definefontsynonym [TraditionalChineseBoldItalic] [b5heisl] [encoding=big5]
+
+% we need to move this to typescripts
+
+\doifelse \currentregime {utf} {
+
+ \definefontsynonym [SimplifiedChineseRegular] [ChineseRegular]
+ \definefontsynonym [SimplifiedChineseSlanted] [ChineseSlanted]
+ \definefontsynonym [SimplifiedChineseItalic] [ChineseItalic]
+ \definefontsynonym [SimplifiedChineseBold] [ChineseBold]
+ \definefontsynonym [SimplifiedChineseBoldSlanted] [ChineseBoldSlanted]
+ \definefontsynonym [SimplifiedChineseBoldItalic] [ChineseBoldItalic]
+
+ \definefontsynonym [TraditionalChineseRegular] [ChineseRegular]
+ \definefontsynonym [TraditionalChineseSlanted] [ChineseSlanted]
+ \definefontsynonym [TraditionalChineseItalic] [ChineseItalic]
+ \definefontsynonym [TraditionalChineseBold] [ChineseBold]
+ \definefontsynonym [TraditionalChineseBoldSlanted][ChineseBoldSlanted]
+ \definefontsynonym [TraditionalChineseBoldItalic] [ChineseBoldItalic]
+
+ \definefontsynonym [ChineseRegular] [uni-htsong-][encoding=cjk-uni]
+ \definefontsynonym [ChineseSlanted] [uni-htsong-][encoding=cjk-uni]
+ \definefontsynonym [ChineseItalic] [uni-htsong-][encoding=cjk-uni]
+ \definefontsynonym [ChineseBold] [uni-hthei-] [encoding=cjk-uni]
+ \definefontsynonym [ChineseBoldSlanted][uni-hthei-] [encoding=cjk-uni]
+ \definefontsynonym [ChineseBoldItalic] [uni-hthei-] [encoding=cjk-uni]
+
+ \loadmapfile[uni-htsong.map]
+ \loadmapfile[uni-htfs.map]
+ \loadmapfile[uni-hthei.map]
+ \loadmapfile[uni-htkai.map]
+
+} {
+
+ \loadmapfile[gbk]
+
+}
+
+\defineunicodefont [SimChi] [SimplifiedChinese] [chinese]
+\defineunicodefont [TraChi] [TraditionalChinese] [chinese]
+
+%D We default to these so called Simplified Chinese fonts.
+
+\SimChi
+
+%D In addition to these fonts, we (pre|)|define some commonly
+%D used fonts:
+
+\definefontsynonym [SimplifiedChineseSongTiRegular] [gbsong] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSongTiSlanted] [gbsongsl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSongTiBold] [gbsong] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseSongTiBoldSlanted] [gbsongsl] [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseSongTiRegular] [b5song] [encoding=big5]
+\definefontsynonym [TraditionalChineseSongTiSlanted] [b5songsl] [encoding=big5]
+\definefontsynonym [TraditionalChineseSongTiBold] [b5song] [encoding=big5]
+\definefontsynonym [TraditionalChineseSongTiBoldSlanted] [b5songsl] [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseHeiTiRegular] [gbhei] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseHeiTiSlanted] [gbheisl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseHeiTiBold] [gbhei] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseHeiTiBoldSlanted] [gbheisl] [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseHeiTiRegular] [b5hei] [encoding=big5]
+\definefontsynonym [TraditionalChineseHeiTiSlanted] [b5heisl] [encoding=big5]
+\definefontsynonym [TraditionalChineseHeiTiBold] [b5hei] [encoding=big5]
+\definefontsynonym [TraditionalChineseHeiTiBoldSlanted] [b5heisl] [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseKaiTiRegular] [gbkai] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseKaiTiSlanted] [gbkaisl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseKaiTiBold] [gbkai] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseKaiTiBoldSlanted] [gbkaisl] [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseKaiTiRegular] [b5kai] [encoding=big5]
+\definefontsynonym [TraditionalChineseKaiTiSlanted] [b5kaisl] [encoding=big5]
+\definefontsynonym [TraditionalChineseKaiTiBold] [b5kai] [encoding=big5]
+\definefontsynonym [TraditionalChineseKaiTiBoldSlanted] [b5kaisl] [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseFangSongRegular] [gbfs] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseFangSongSlanted] [gbfssl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseFangSongBold] [gbfs] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseFangSongBoldSlanted] [gbfssl] [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseFangSongRegular] [b5fs] [encoding=big5]
+\definefontsynonym [TraditionalChineseFangSongSlanted] [b5fssl] [encoding=big5]
+\definefontsynonym [TraditionalChineseFangSongBold] [b5fs] [encoding=big5]
+\definefontsynonym [TraditionalChineseFangSongBoldSlanted] [b5fssl] [encoding=big5]
+
+\definefontsynonym [SimplifiedChineseLiShuRegular] [gbli] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseLiShuSlanted] [gblisl] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseLiShuBold] [gbli] [encoding=gbk]
+\definefontsynonym [SimplifiedChineseLiShuBoldSlanted] [gblisl] [encoding=gbk]
+
+\definefontsynonym [TraditionalChineseLiShuRegular] [b5li] [encoding=big5]
+\definefontsynonym [TraditionalChineseLiShuSlanted] [b5lisl] [encoding=big5]
+\definefontsynonym [TraditionalChineseLiShuBold] [b5li] [encoding=big5]
+\definefontsynonym [TraditionalChineseLiShuBoldSlanted] [b5lisl] [encoding=big5]
+
+%D The following definitions provide us the commands to switch
+%D to these fonts.
+
+\defineunicodefont [SimSongTi] [SimplifiedChineseSongTi] [chinese]
+\defineunicodefont [TraSongTi] [TraditionalChineseSongTi] [chinese]
+
+\defineunicodefont [SimHeiTi] [SimplifiedChineseHeiTi] [chinese]
+\defineunicodefont [TraHeiTi] [TraditionalChineseHeiTi] [chinese]
+
+\defineunicodefont [SimKaiTi] [SimplifiedChineseKaiTi] [chinese]
+\defineunicodefont [TraKaiTi] [TraditionalChineseKaiTi] [chinese]
+
+\defineunicodefont [SimFangSong] [SimplifiedChineseFangSong] [chinese]
+\defineunicodefont [TraFangSong] [TraditionalChineseFangSong] [chinese]
+
+\defineunicodefont [SimLiShu] [SimplifiedChineseLiShu] [chinese]
+\defineunicodefont [TraLiShu] [TraditionalChineseLiShu] [chinese]
+
+% \definealternativestyle [ChineseTitleFont] [\bfd\SimKaiTi] []
+
+%D \macros
+%D {purechinese}
+%D
+%D Use this macro to suppress spacing around Chinese text.
+
+\def\purechinese#1% evt geen rek
+ {\hskip\chineseSsignal\relax
+ #1\unskip\unskip\unskip
+ \hskip\chineseSsignal\relax}
+
+%D \macros
+%D {stillchinese}
+%D
+%D Use the next macro when you want the next item to be put
+%D tight to the previous chinese character.
+
+\def\stillchinese
+ {\hskip\chineseSsignal\relax}
+
+%D \macros
+%D {nochinese}
+%D
+%D When we want to be sure of non||Chinese inline text,
+%D we can package the for instance english text in \type
+%D {\nochinese}.
+
+\def\nochinese#1%
+ {\unskip\unskip\unskip
+ \hskip\chinesesurroundskip
+ \hskip\chineseinterglyphskip\relax
+ #1%
+ \hskip\chineseinterglyphskip\relax
+ \hskip\chinesesurroundskip
+ \ignorespaces}
+
+%D \macros
+%D {chisize}
+%D
+%D Chinese font sizes are specified in a different way,
+%D using positive and negative numbers:
+
+\def\chisize#1%
+ {\ifnum#11<0 % a trick to catch -0
+ \ifcase#1\space36\or24\or18\or15\or12\or9\or\else6.5\fi
+ \else
+ \ifcase#1\space42\or26\or22\or16\or14\or10.5\or7.5\or5.5\else5\fi
+ \fi pt}
+
+%D So:
+%D
+%D \startbuffer
+%D [\chisize{-1}] [\chisize{7}] [\chisize{+4}]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives:
+%D
+%D \getbuffer
+%D
+%D The full range of sizes is:
+%D
+%D \starttabulate[|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|]
+%D \NC 8 \NC 7 \NC -6 \NC 6 \NC
+%D -5 \NC 5 \NC -4 \NC 4 \NC
+%D -3 \NC 3 \NC -2 \NC 2 \NC
+%D -1 \NC 1 \NC -0 \NC 0 \NC\NR
+%D \NC\chisize {8}\NC\chisize{7}\NC\chisize{-6}\NC\chisize{6}\NC
+%D \chisize{-5}\NC\chisize{5}\NC\chisize{-4}\NC\chisize{4}\NC
+%D \chisize{-3}\NC\chisize{3}\NC\chisize{-2}\NC\chisize{2}\NC
+%D \chisize{-1}\NC\chisize{1}\NC\chisize{-0}\NC\chisize{0}\NC\NR
+%D \stoptabulate
+
+%D Now it's time for some real Chinese. This example
+%D also shows that font switching is supported.
+%D
+%D \startnarrower
+%D \midaligned{\tfd ˮͷ}
+%D \blank
+%D \midaligned{\tfb ﵩƪ滳ɡ}
+%D \blank
+%D \midaligned{\tfb }
+%D \blank
+%D ¼ʱУѾ졣֪ϹڣϦǺꣿ˷ȥ
+%D ֿ¥ߴʤŪӰ˼䣿
+%D \blank
+%D ת󣬵ͻߡӦкޣƫʱԲбϣ
+%D Բȱ¹ȫԸ˳ãǧﹲ濾ꡣ
+%D \stopnarrower
+%D
+%D The english translation is:
+%D
+%D \startnarrower
+%D \midaligned{\tfd Tune: Prelude to the Melody of Water}
+%D \blank
+%D \midaligned{\tfb On the night of the Mid||Autumn Festival of
+%D 1076, I drank happily till dawn and wrote this in my cups
+%D while thinking of Zi||you.}
+%D \blank
+%D \midaligned{\tfb Su Shi}
+%D \blank
+%D How long will the bright moon appear? Wine||cup in hand, I
+%D ask the sky. I do not know waht time of year it would be
+%D tonight in the palace on high. Riding the wind, there I
+%D would fly, yet I fear the crystal palace would be far too
+%D high and cold for me. I rise and dance, with my shadow I
+%D play. On high as on earth, would it be as gay?
+%D \blank
+%D The moon goes round the mansion red though gauze||draped
+%D windows soft to shed her light upon the sleepless bed.
+%D Against man she should have no spite. Why then when people
+%D part is she oft full and bright? Men have sorrow and joy,
+%D they part or meet again; The moon may be bright or dim, she
+%D may wax or wane. There has been nothing perfect since the
+%D olden days. So let us wish that man will live long as he
+%D can! Though miles apart, we'll share the beauty she
+%D displays.
+%D \stopnarrower
+
+%D This package is written in the city of Hasselt, a pretty
+%D small town in the |<|compared to China real small|>|
+%D Netherlands. Like most dutch cities, even this small one
+%D has a chinese restaurant, run by chinese, speaking chinese,
+%D and |<|indeed|>| writing chinese. Eating there will never
+%D be the same, since now I can at least pretend to know the
+%D glyphs all around the place. The numbers should pose me no
+%D problems, but I fear I will never manage to recognize those
+%D scribles they draw on their pads when thay take your order.
+
+%D To make our lives more easy, we put it here (too):
+
+\setuptyping[\c!tab=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/font-chk.lua b/tex/context/base/font-chk.lua
new file mode 100644
index 000000000..32fdf8894
--- /dev/null
+++ b/tex/context/base/font-chk.lua
@@ -0,0 +1,90 @@
+if not modules then modules = { } end modules ['font-chk'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- possible optimization: delayed initialization of vectors
+
+fonts = fonts or { }
+fonts.checkers = fonts.checkers or { }
+
+local checkers = fonts.checkers
+local fontdata = fonts.ids
+local is_character = characters.is_character
+local chardata = characters.data
+
+local glyph = node.id('glyph')
+local traverse_id = node.traverse_id
+local remove_node = nodes.remove
+
+-- maybe in fonts namespace
+-- deletion can be option
+
+checkers.enabled = false
+checkers.delete = false
+
+function fonts.register_message(font,char,message)
+ local tfmdata = fontdata[font]
+ local shared = tfmdata.shared
+ local messages = shared.messages
+ if not messages then
+ messages = { }
+ shared.messages = messages
+ end
+ local category = messages[message]
+ if not category then
+ category = { }
+ messages[message] = category
+ end
+ if not category[char] then
+ logs.report("fonts","char U+%04X in font '%s' with id %s: %s",char,tfmdata.fullname,font,message)
+ category[char] = true
+ end
+end
+
+function checkers.missing(head)
+ if checkers.enabled then
+ local lastfont, characters, found = nil, nil, nil
+ for n in traverse_id(glyph,head) do
+ local font, char = n.font, n.char
+ if font ~= lastfont then
+ characters = fontdata[font].characters
+ end
+ if not characters[char] and is_character[chardata[char].category] then
+ if checkers.delete then
+ fonts.register_message(font,char,"missing (will be deleted)")
+ else
+ fonts.register_message(font,char,"missing")
+ end
+ if not found then
+ found = { n }
+ else
+ found[#found+1] = n
+ end
+ end
+ end
+ if found and checkers.delete then
+ for i=1,#found do
+ head = remove_node(head,found[i],true)
+ end
+ end
+ end
+ return head, false
+end
+
+trackers.register("fonts.missing", function(v)
+ tasks.enableaction("processors", "fonts.checkers.missing") -- always on then
+ checkers.enabled = v
+end)
+
+function checkers.enable(delete)
+ tasks.enableaction("processors", "fonts.checkers.missing") -- always on then
+ if delete ~= nil then
+ checkers.delete = delete
+ end
+ checkers.enabled = true
+end
+
diff --git a/tex/context/base/font-cid.lua b/tex/context/base/font-cid.lua
new file mode 100644
index 000000000..d1c727af2
--- /dev/null
+++ b/tex/context/base/font-cid.lua
@@ -0,0 +1,147 @@
+if not modules then modules = { } end modules ['font-cid'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (cidmaps)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, match, lower = string.format, string.match, string.lower
+local tonumber = tonumber
+local lpegmatch = lpeg.match
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+
+fonts = fonts or { }
+fonts.cid = fonts.cid or { }
+fonts.cid.map = fonts.cid.map or { }
+fonts.cid.max = fonts.cid.max or 10
+
+
+-- original string parser: 0.109, lpeg parser: 0.036 seconds for Adobe-CNS1-4.cidmap
+--
+-- 18964 18964 (leader)
+-- 0 /.notdef
+-- 1..95 0020
+-- 99 3000
+
+local number = lpeg.C(lpeg.R("09","af","AF")^1)
+local space = lpeg.S(" \n\r\t")
+local spaces = space^0
+local period = lpeg.P(".")
+local periods = period * period
+local name = lpeg.P("/") * lpeg.C((1-space)^1)
+
+local unicodes, names = { }, { }
+
+local function do_one(a,b)
+ unicodes[tonumber(a)] = tonumber(b,16)
+end
+
+local function do_range(a,b,c)
+ c = tonumber(c,16)
+ for i=tonumber(a),tonumber(b) do
+ unicodes[i] = c
+ c = c + 1
+ end
+end
+
+local function do_name(a,b)
+ names[tonumber(a)] = b
+end
+
+local grammar = lpeg.P { "start",
+ start = number * spaces * number * lpeg.V("series"),
+ series = (spaces * (lpeg.V("one") + lpeg.V("range") + lpeg.V("named")) )^1,
+ one = (number * spaces * number) / do_one,
+ range = (number * periods * number * spaces * number) / do_range,
+ named = (number * spaces * name) / do_name
+}
+
+function fonts.cid.load(filename)
+ local data = io.loaddata(filename)
+ if data then
+ unicodes, names = { }, { }
+ lpegmatch(grammar,data)
+ local supplement, registry, ordering = match(filename,"^(.-)%-(.-)%-()%.(.-)$")
+ return {
+ supplement = supplement,
+ registry = registry,
+ ordering = ordering,
+ filename = filename,
+ unicodes = unicodes,
+ names = names
+ }
+ else
+ return nil
+ end
+end
+
+local template = "%s-%s-%s.cidmap"
+
+
+local function locate(registry,ordering,supplement)
+ local filename = format(template,registry,ordering,supplement)
+ local hashname = lower(filename)
+ local cidmap = fonts.cid.map[hashname]
+ if not cidmap then
+ if trace_loading then
+ logs.report("load otf","checking cidmap, registry: %s, ordering: %s, supplement: %s, filename: %s",registry,ordering,supplement,filename)
+ end
+ local fullname = resolvers.find_file(filename,'cid') or ""
+ if fullname ~= "" then
+ cidmap = fonts.cid.load(fullname)
+ if cidmap then
+ if trace_loading then
+ logs.report("load otf","using cidmap file %s",filename)
+ end
+ fonts.cid.map[hashname] = cidmap
+ cidmap.usedname = file.basename(filename)
+ return cidmap
+ end
+ end
+ end
+ return cidmap
+end
+
+function fonts.cid.getmap(registry,ordering,supplement)
+ -- cf Arthur R. we can safely scan upwards since cids are downward compatible
+ local supplement = tonumber(supplement)
+ if trace_loading then
+ logs.report("load otf","needed cidmap, registry: %s, ordering: %s, supplement: %s",registry,ordering,supplement)
+ end
+ local cidmap = locate(registry,ordering,supplement)
+ if not cidmap then
+ local cidnum = nil
+ -- next highest (alternatively we could start high)
+ if supplement < fonts.cid.max then
+ for supplement=supplement+1,fonts.cid.max do
+ local c = locate(registry,ordering,supplement)
+ if c then
+ cidmap, cidnum = c, supplement
+ break
+ end
+ end
+ end
+ -- next lowest (least worse fit)
+ if not cidmap and supplement > 0 then
+ for supplement=supplement-1,0,-1 do
+ local c = locate(registry,ordering,supplement)
+ if c then
+ cidmap, cidnum = c, supplement
+ break
+ end
+ end
+ end
+ -- prevent further lookups
+ if cidmap and cidnum > 0 then
+ for s=0,cidnum-1 do
+ filename = format(template,registry,ordering,s)
+ if not fonts.cid.map[filename] then
+ fonts.cid.map[filename] = cidmap -- copy of ref
+ end
+ end
+ end
+ end
+ return cidmap
+end
diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua
new file mode 100644
index 000000000..d313357a2
--- /dev/null
+++ b/tex/context/base/font-col.lua
@@ -0,0 +1,216 @@
+if not modules then modules = { } end modules ['font-col'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- possible optimization: delayed initialization of vectors
+
+local format, gmatch, texsprint, type = string.format, string.gmatch, tex.sprint, type
+local traverse_id, first_character = node.traverse_id, node.first_character
+local lpegmatch = lpeg.match
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local trace_collecting = false trackers.register("fonts.collecting", function(v) trace_collecting = v end)
+
+local fontdata = fonts.ids
+
+local glyph = node.id('glyph')
+
+fonts.normalizers = fonts.normalizers or { }
+
+fonts.collections = fonts.collections or { }
+fonts.collections.definitions = fonts.collections.definitions or { }
+fonts.collections.vectors = fonts.collections.vectors or { }
+
+local collections = fonts.collections
+local definitions = fonts.collections.definitions
+local vectors = fonts.collections.vectors
+
+local list, current, active = { }, 0, false
+
+-- maybe also a copy
+
+function collections.reset(name,font)
+ if font and font ~= "" then
+ local d = definitions[name]
+ if d then
+ d[font] = nil
+ if not next(d) then
+ definitions[name] = nil
+ end
+ end
+ else
+ definitions[name] = nil
+ end
+end
+
+function collections.define(name,font,ranges,details)
+ -- todo: details -> method=force|conditional rscale=
+ -- todo: remap=name
+ local d = definitions[name]
+ if d then
+ if name and trace_collecting then
+ logs.report("fonts","def: extending set %s using %s",name, font)
+ end
+ else
+ if name and trace_collecting 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 gmatch(ranges,"([^, ]+)") do
+ local start, stop, description = characters.getrange(s)
+ if start and stop then
+ if trace_collecting then
+ if description then
+ logs.report("fonts","def: using range %s (U+%04x-U+%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 U+%04x-U+%04X and U+%04x-U+%04X",start,stop,di.start,di.stop)
+ end
+ end
+ end
+ details.font, details.start, details.stop = font, start, stop
+ d[#d+1] = table.fastcopy(details)
+ end
+ end
+end
+
+function collections.stage_1(name)
+ local last = font.current()
+ if trace_collecting then
+ logs.report("fonts","def: registering font %s with name %s",last,name)
+ end
+ list[#list+1] = last
+end
+
+function collections.stage_2(name)
+ statistics.starttiming(fonts)
+ local d = definitions[name]
+ local t = { }
+ if trace_collecting then
+ logs.report("fonts","def: process collection %s",name)
+ end
+ for i=1,#d do
+ local f = d[i]
+ local id = list[i]
+ local start, stop = f.start, f.stop
+ if trace_collecting then
+ logs.report("fonts","def: remapping font %s to %s for range U+%04X - U+%04X",current,id,start,stop)
+ end
+ local check = toboolean(f.check or "false",true)
+ local force = toboolean(f.force or "true",true)
+ local remap = f.remap or nil
+ -- check: when true, only set when present in font
+ -- force: when false, then not set when already set
+ local oldchars = fontdata[current].characters
+ local newchars = fontdata[id].characters
+ if check then
+ for i=start,stop do
+ if newchars[i] and (force or (not t[i] and not oldchars[i])) then
+ if remap then
+ t[i] = { id, remap[i] }
+ else
+ t[i] = id
+ end
+ end
+ end
+ else
+ for i=start,stop do
+ if force or (not t[i] and not oldchars[i]) then
+ if remap then
+ t[i] = { id, remap[i] }
+ else
+ t[i] = id
+ end
+ end
+ end
+ end
+ end
+ vectors[current] = t
+ if trace_collecting then
+ logs.report("fonts","def: activating collection %s for font %s",name,current)
+ end
+ active = true
+ statistics.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 collections.prepare(name)
+ current = font.current()
+ if vectors[current] then
+ return
+ end
+ local d = definitions[name]
+ if d then
+ if trace_collecting then
+ local filename = file.basename(fontdata[current].filename or "?")
+ logs.report("fonts","def: applying collection %s to %s (file: %s)",name,current,filename)
+ end
+ list = { }
+ texsprint(ctxcatcodes,"\\dostartcloningfonts") -- move this to tex \dostart...
+ for i=1,#d do
+ local f = d[i]
+ local name = f.font
+ local scale = f.rscale or 1
+ if lpegmatch(okay,name) then
+ texsprint(ctxcatcodes,format("\\doclonefonta{%s}{%s}",name,scale)) -- define with unique specs
+ else
+ texsprint(ctxcatcodes,format("\\doclonefontb{%s}{%s}",name,scale)) -- define with inherited specs
+ end
+ texsprint(ctxcatcodes,format("\\ctxlua{fonts.collections.stage_1('%s')}",name)) -- registering main font
+ end
+ texsprint(ctxcatcodes,format("\\ctxlua{fonts.collections.stage_2('%s')}",name)) -- preparing clone vectors
+ texsprint(ctxcatcodes,"\\dostopcloningfonts")
+ elseif trace_collecting then
+ local filename = file.basename(fontdata[current].filename or "?")
+ logs.report("fonts","def: error in applying collection %s to %s (file: %s)",name,current,filename)
+ end
+end
+
+function collections.message(message)
+ if trace_collecting then
+ logs.report("fonts","tex: %s",message)
+ end
+end
+
+function collections.process(head)
+ if active then
+ local done = false
+ for n in traverse_id(glyph,head) do
+ local v = vectors[n.font]
+ if v then
+ local id = v[n.char]
+ if id then
+ if type(id) == "table" then
+ local newid, newchar = id[1], id[2]
+ if trace_collecting then
+ 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_collecting then
+ logs.report("fonts","lst: remapping font %s to %s for character %s",n.font,id,n.char)
+ end
+ n.font = id
+ end
+ end
+ end
+ end
+ end
+ return head, done
+end
diff --git a/tex/context/base/font-col.mkiv b/tex/context/base/font-col.mkiv
new file mode 100644
index 000000000..181b985f6
--- /dev/null
+++ b/tex/context/base/font-col.mkiv
@@ -0,0 +1,148 @@
+%D \module
+%D [ file=font-col,
+%D version=2008.06.11,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Fallbacks (collections),
+%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.
+
+% ! EXPERIMENTAL ! code will be made more nice
+%
+% actually we can now do more at the lua end
+
+% todo: missing only, force always, multiple fallbacks with test, scale
+%
+% \resetfontfallback [whatever]
+%
+% \definefontfallback [whatever] [Slanted] [0x0060-0x007F] [force=yes]
+% \definefontfallback [whatever] [Bold] [0x0080-0x00FF,0x00A0-0x00AF] [rscale=1.2]
+% \definefontfallback [whatever] [BoldSlanted] [0x00C0-0x00C7] [check=yes,force=yes]
+
+\writestatus{loading}{ConTeXt Font Macros / Collections}
+
+\registerctxluafile{font-col}{1.001}
+
+\unprotect
+
+\unexpanded\def\definefontfallback
+ {\doquadrupleempty\dodefinefontfallback}
+
+\def\dodefinefontfallback[#1][#2][#3][#4]%
+ {\ctxlua{fonts.collections.define("#1","#2",\!!bs#3\!!es,\!!bs#4\!!es)}}
+
+\def\resetfontfallback
+ {\dodoubleempty\doresetfontfallback}
+
+\def\doresetfontfallback[#1][#2]%
+ {\ctxlua{fonts.collections.reset("#1","#2")}}
+
+% add fallbacks to last font
+
+\def\dodefinefontfallbacks#1%
+ {\ctxlua{fonts.collections.prepare("#1")}}
+
+% we might as well move the handling to lua but then we need to pass the
+% fallbacks, skewchar etc.
+
+\setfalse\doingfontfallbacks
+
+\def\dodefinefontfallbacksindeed#1%
+ {\begingroup
+ \settrue\doingfontfallbacks
+ \lastrawfontcall % sets current font id
+ \dodefinefontfallbacks#1%
+ \endgroup}
+
+\appendtoks
+ \ifconditional\doingfontfallbacks\else
+ \ifx\@@fontfallbacks\empty
+ \ifx\@@fontclassfallbacks\empty
+ \else
+ \dodefinefontfallbacksindeed\@@fontclassfallbacks
+ \fi
+ \else
+ \dodefinefontfallbacksindeed\@@fontfallbacks
+ \fi
+ \fi
+\to\everydefinefont
+
+\def\dostartcloningfonts
+ {\bgroup
+ \let\savedfontspec\somefontspec}
+
+\def\dostopcloningfonts
+ {\egroup}
+
+\def\doclonefonta#1#2% kind of dododefinefont
+ {\ctxlua{fonts.collections.message("defining #1 (relative scale: #2)")}%
+ \autofontsizefalse
+ \let\lastfontidentifier\s!dummy
+ \def\localrelativefontsize{#2}%
+ \let\localabsolutefontsize\fontbody
+ \lowleveldefinefont{#1}\rawfontidentifier
+ \csname\rawfontidentifier\endcsname
+ \autofontsizefalse
+ %\setfontcharacteristics
+ }%\the\everyfontswitch}
+
+\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)
+
+% \definefontfallback [whatever] [Slanted] [0x0060-0x007F] [force=yes]
+% \definefontfallback [whatever] [Bold] [0x0080:0x00FF,0x00A0:0x00AF] [rscale=2.0]
+% \definefontfallback [whatever] [BoldSlanted] ["00C0-"00C7] [check=yes,force=yes]
+% \definefontfallback [whatever] [Mono] [latinextendeda] [force=yes] % 0x0100:0x017F
+% \definefontfallback [whatever] [Mono] [latin extended a] [force=yes] % 0x0100:0x017F
+%
+% \definefontsynonym[SerifPlus][Serif][fallbacks=whatever]
+%
+% \definefont[MySerif][SerifPlus at 10pt]
+%
+% \startcolumns[n=6]
+% \MySerif
+% \dostepwiserecurse {0} {65000} {1} {
+% \iffontchar\font\recurselevel
+% {\tttf\uchexnumbers\recurselevel:} \char\recurselevel\par
+% \fi
+% }
+% \stopcolumns
+
+% \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-ctx.lua b/tex/context/base/font-ctx.lua
new file mode 100644
index 000000000..76e9f095a
--- /dev/null
+++ b/tex/context/base/font-ctx.lua
@@ -0,0 +1,624 @@
+if not modules then modules = { } end modules ['font-ctx'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- needs a cleanup: merge of replace, lang/script etc
+
+local texsprint, count, texsetcount = tex.sprint, tex.count, tex.setcount
+local format, concat, gmatch, match, find, lower, gsub, byte = string.format, table.concat, string.gmatch, string.match, string.find, string.lower, string.gsub, string.byte
+
+local tostring, next, type = tostring, next, type
+local lpegmatch = lpeg.match
+local round = math.round
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+local tfm = fonts.tfm
+local define = fonts.define
+local fontdata = fonts.identifiers
+local specify = define.specify
+
+specify.context_setups = specify.context_setups or { }
+specify.context_numbers = specify.context_numbers or { }
+specify.context_merged = specify.context_merged or { }
+specify.synonyms = specify.synonyms or { }
+
+local setups = specify.context_setups
+local numbers = specify.context_numbers
+local merged = specify.context_merged
+local synonyms = specify.synonyms
+local triggers = fonts.triggers
+
+--[[ldx--
+<p>So far we haven't really dealt with features (or whatever we want
+to pass along with the font definition. We distinguish the following
+situations:</p>
+situations:</p>
+
+<code>
+name:xetex like specs
+name@virtual font spec
+name*context specification
+</code>
+--ldx]]--
+
+function specify.predefined(specification)
+ local detail = specification.detail
+ if detail ~= "" then
+ -- detail = gsub(detail,"["..define.splitsymbols.."].*$","") -- get rid of *whatever specs and such
+ if define.methods[detail] then -- since these may be appended at the
+ specification.features.vtf = { preset = detail } -- tex end by default
+ end
+ end
+ return specification
+end
+
+define.register_split("@", specify.predefined)
+
+storage.register("fonts/setups" , define.specify.context_setups , "fonts.define.specify.context_setups" )
+storage.register("fonts/numbers", define.specify.context_numbers, "fonts.define.specify.context_numbers")
+storage.register("fonts/merged", define.specify.context_merged, "fonts.define.specify.context_merged")
+storage.register("fonts/synonyms", define.specify.synonyms, "fonts.define.specify.synonyms")
+
+local normalize_meanings = fonts.otf.meanings.normalize
+local settings_to_hash = aux.settings_to_hash
+local default_features = fonts.otf.features.default
+
+local function preset_context(name,parent,features) -- currently otf only
+ if features == "" and find(parent,"=") then
+ features = parent
+ parent = ""
+ end
+ if features == "" then
+ features = { }
+ elseif type(features) == "string" then
+ features = normalize_meanings(settings_to_hash(features))
+ else
+ features = normalize_meanings(features)
+ end
+ -- todo: synonyms, and not otf bound
+ if parent ~= "" then
+ for p in gmatch(parent,"[^, ]+") do
+ local s = setups[p]
+ if s then
+ for k,v in next, s do
+ if features[k] == nil then
+ features[k] = v
+ end
+ end
+ end
+ end
+ end
+ -- these are auto set so in order to prevent redundant definitions
+ -- we need to preset them (we hash the features and adding a default
+ -- setting during initialization may result in a different hash)
+ for k,v in next, triggers do
+ if features[v] == nil then -- not false !
+ local vv = default_features[v]
+ if vv then features[v] = vv end
+ end
+ end
+ -- sparse 'm so that we get a better hash and less test (experimental
+ -- optimization)
+ local t = { } -- can we avoid t ?
+ for k,v in next, features do
+ if v then t[k] = v end
+ end
+ -- needed for dynamic features
+ local number = (setups[name] and setups[name].number) or 0
+ if number == 0 then
+ number = #numbers + 1
+ numbers[number] = name
+ end
+ t.number = number
+ setups[name] = t
+ return number, t
+end
+
+local function context_number(name) -- will be replaced
+ local t = setups[name]
+ if not t then
+ return 0
+ elseif t.auto then
+ local lng = tonumber(tex.language)
+ local tag = name .. ":" .. lng
+ local s = setups[tag]
+ if s then
+ return s.number or 0
+ else
+ local script, language = languages.association(lng)
+ if t.script ~= script or t.language ~= language then
+ local s = table.fastcopy(t)
+ local n = #numbers + 1
+ setups[tag] = s
+ numbers[n] = tag
+ s.number = n
+ s.script = script
+ s.language = language
+ return n
+ else
+ setups[tag] = t
+ return t.number or 0
+ end
+ end
+ else
+ return t.number or 0
+ end
+end
+
+local function merge_context(currentnumber,extraname,option)
+ local current = setups[numbers[currentnumber]]
+ local extra = setups[extraname]
+ if extra then
+ local mergedfeatures, mergedname = { }, nil
+ if option < 0 then
+ if current then
+ for k, v in next, current do
+ if not extra[k] then
+ mergedfeatures[k] = v
+ end
+ end
+ end
+ mergedname = currentnumber .. "-" .. extraname
+ else
+ if current then
+ for k, v in next, current do
+ mergedfeatures[k] = v
+ end
+ end
+ for k, v in next, extra do
+ mergedfeatures[k] = v
+ end
+ mergedname = currentnumber .. "+" .. extraname
+ end
+ local number = #numbers + 1
+ mergedfeatures.number = number
+ numbers[number] = mergedname
+ merged[number] = option
+ setups[mergedname] = mergedfeatures
+ return number -- context_number(mergedname)
+ else
+ return currentnumber
+ end
+end
+
+local function register_context(fontnumber,extraname,option)
+ local extra = setups[extraname]
+ if extra then
+ local mergedfeatures, mergedname = { }, nil
+ if option < 0 then
+ mergedname = fontnumber .. "-" .. extraname
+ else
+ mergedname = fontnumber .. "+" .. extraname
+ end
+ for k, v in next, extra do
+ mergedfeatures[k] = v
+ end
+ local number = #numbers + 1
+ mergedfeatures.number = number
+ numbers[number] = mergedname
+ merged[number] = option
+ setups[mergedname] = mergedfeatures
+ return number -- context_number(mergedname)
+ else
+ return 0
+ end
+end
+
+specify.preset_context = preset_context
+specify.context_number = context_number
+specify.merge_context = merge_context
+specify.register_context = register_context
+
+local current_font = font.current
+local tex_attribute = tex.attribute
+
+local cache = { } -- concat might be less efficient than nested tables
+
+function fonts.withset(name,what)
+ local zero = tex_attribute[0]
+ local hash = zero .. "+" .. name .. "*" .. what
+ local done = cache[hash]
+ if not done then
+ done = merge_context(zero,name,what)
+ cache[hash] = done
+ end
+ tex_attribute[0] = done
+end
+function fonts.withfnt(name,what)
+ local font = current_font()
+ local hash = font .. "*" .. name .. "*" .. what
+ local done = cache[hash]
+ if not done then
+ done = register_context(font,name,what)
+ cache[hash] = done
+ end
+ tex_attribute[0] = done
+end
+
+function specify.show_context(name)
+ return setups[name] or setups[numbers[name]] or setups[numbers[tonumber(name)]] or { }
+end
+
+local function split_context(features)
+ return setups[features] or (preset_context(features,"","") and setups[features])
+end
+
+specify.split_context = split_context
+
+function specify.context_tostring(name,kind,separator,yes,no,strict,omit) -- not used
+ return aux.hash_to_string(table.merged(fonts[kind].features.default or {},setups[name] or {}),separator,yes,no,strict,omit)
+end
+
+local splitter = lpeg.splitat(",")
+
+function specify.starred(features) -- no longer fallbacks here
+ local detail = features.detail
+ if detail and detail ~= "" then
+ features.features.normal = split_context(detail)
+ else
+ features.features.normal = { }
+ end
+ return features
+end
+
+define.register_split('*',specify.starred)
+
+-- define (two steps)
+
+local P, C, Cc = lpeg.P, lpeg.C, lpeg.Cc
+
+local space = P(" ")
+local spaces = space^0
+local leftparent = (P"(")
+local rightparent = (P")")
+local value = C((leftparent * (1-rightparent)^0 * rightparent + (1-space))^1)
+local dimension = C((space/"" + P(1))^1)
+local rest = C(P(1)^0)
+local scale_none = Cc(0)
+local scale_at = P("at") * Cc(1) * spaces * dimension -- value
+local scale_sa = P("sa") * Cc(2) * spaces * dimension -- value
+local scale_mo = P("mo") * Cc(3) * spaces * dimension -- value
+local scale_scaled = P("scaled") * Cc(4) * spaces * dimension -- value
+
+local sizepattern = spaces * (scale_at + scale_sa + scale_mo + scale_scaled + scale_none)
+local splitpattern = spaces * value * spaces * rest
+
+local specification --
+
+local get_specification = define.get_specification
+
+-- we can make helper macros which saves parsing (but normaly not
+-- that many calls, e.g. in mk a couple of 100 and in metafun 3500)
+
+function define.command_1(str)
+ statistics.starttiming(fonts)
+ local fullname, size = lpegmatch(splitpattern,str)
+ local lookup, name, sub, method, detail = get_specification(fullname)
+ if not name then
+ logs.report("define font","strange definition '%s'",str)
+ texsprint(ctxcatcodes,"\\fcglet\\somefontname\\defaultfontfile")
+ elseif name == "unknown" then
+ texsprint(ctxcatcodes,"\\fcglet\\somefontname\\defaultfontfile")
+ else
+ texsprint(ctxcatcodes,"\\fcxdef\\somefontname{",name,"}")
+ end
+ -- we can also use a count for the size
+ if size and size ~= "" then
+ local mode, size = lpegmatch(sizepattern,size)
+ if size and mode then
+ count.scaledfontmode = mode
+ texsprint(ctxcatcodes,"\\def\\somefontsize{",size,"}")
+ else
+ count.scaledfontmode = 0
+ texsprint(ctxcatcodes,"\\let\\somefontsize\\empty")
+ end
+ elseif true then
+ -- so we don't need to check in tex
+ count.scaledfontmode = 2
+ texsprint(ctxcatcodes,"\\let\\somefontsize\\empty")
+ else
+ count.scaledfontmode = 0
+ texsprint(ctxcatcodes,"\\let\\somefontsize\\empty")
+ end
+ specification = define.makespecification(str,lookup,name,sub,method,detail,size)
+end
+
+local n = 0
+
+-- we can also move rscale to here (more consistent)
+
+function define.command_2(global,cs,str,size,classfeatures,fontfeatures,classfallbacks,fontfallbacks,mathsize,textsize,relativeid)
+ if trace_defining then
+ logs.report("define font","memory usage before: %s",statistics.memused())
+ end
+ -- name is now resolved and size is scaled cf sa/mo
+ local lookup, name, sub, method, detail = get_specification(str or "")
+ -- asome settings can be overloaded
+ if lookup and lookup ~= "" then
+ specification.lookup = lookup
+ end
+ if relativeid and relativeid ~= "" then -- experimental hook
+ local id = tonumber(relativeid) or 0
+ specification.relativeid = id > 0 and id
+ end
+ specification.name = name
+ specification.size = size
+ specification.sub = (sub and sub ~= "" and sub) or specification.sub
+ specification.mathsize = mathsize
+ specification.textsize = textsize
+ 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 fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+ elseif classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+ end
+ local tfmdata = define.read(specification,size) -- id not yet known
+ if not tfmdata then
+ logs.report("define font","unable to define %s as \\%s",name,cs)
+ texsetcount("global","lastfontid",-1)
+ elseif type(tfmdata) == "number" then
+ if trace_defining 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(ctxcatcodes,format("\\def\\somefontsize{%isp}",fontdata[tfmdata].size))
+ texsetcount("global","lastfontid",tfmdata)
+ else
+ -- local t = os.clock(t)
+ local id = font.define(tfmdata)
+ -- print(name,os.clock()-t)
+ tfmdata.id = id
+ define.register(tfmdata,id)
+ tex.definefont(global,cs,id)
+ tfm.cleanup_table(tfmdata)
+ if trace_defining 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(ctxcatcodes,format("\\def\\somefontsize{%isp}",tfmdata.size))
+ --~ if specification.fallbacks then
+ --~ fonts.collections.prepare(specification.fallbacks)
+ --~ end
+ texsetcount("global","lastfontid",id)
+ end
+ if trace_defining then
+ logs.report("define font","memory usage after: %s",statistics.memused())
+ end
+ statistics.stoptiming(fonts)
+end
+
+local enable_auto_r_scale = false
+
+experiments.register("fonts.autorscale", function(v)
+ enable_auto_r_scale = v
+end)
+
+local calculate_scale = fonts.tfm.calculate_scale
+
+function fonts.tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
+ local scaledpoints, delta, units = calculate_scale(tfmtable, scaledpoints, relativeid)
+ if enable_auto_r_scale and relativeid then -- for the moment this is rather context specific
+ local relativedata = fontdata[relativeid]
+ local id_x_height = relativedata and relativedata.parameters and relativedata.parameters.x_height
+ local tf_x_height = id_x_height and tfmtable.parameters and tfmtable.parameters.x_height * delta
+ if tf_x_height then
+ scaledpoints = (id_x_height/tf_x_height) * scaledpoints
+ delta = scaledpoints/units
+ end
+ end
+ return scaledpoints, delta, units
+end
+
+--~ table.insert(readers.sequence,1,'vtf')
+
+--~ function readers.vtf(specification)
+--~ if specification.features.vtf and specification.features.vtf.preset then
+--~ return tfm.make(specification)
+--~ else
+--~ return nil
+--~ end
+--~ end
+
+-- we need a place for this .. outside the generic scope
+
+local dimenfactors = number.dimenfactors
+
+function fonts.dimenfactor(unit,tfmdata)
+ if unit == "ex" then
+ return (tfmdata and tfmdata.parameters.x_height) or 655360
+ elseif unit == "em" then
+ return (tfmdata and tfmdata.parameters.em_height) or 655360
+ else
+ return dimenfactors[unit] or unit
+ end
+end
+
+function fonts.cleanname(name)
+ texsprint(ctxcatcodes,fonts.names.cleanname(name))
+end
+
+local p, f = 1, "%0.1fpt" -- normally this value is changed only once
+
+local stripper = lpeg.patterns.strip_zeros
+
+function fonts.nbfs(amount,precision)
+ if precision ~= p then
+ p = precision
+ f = "%0." .. p .. "fpt"
+ end
+ texsprint(ctxcatcodes,lpegmatch(stripper,format(f,amount/65536)))
+end
+
+-- for the moment here, this will become a chain of extras that is
+-- hooked into the ctx registration (or scaler or ...)
+
+function fonts.set_digit_width(font)
+ local tfmtable = fontdata[font]
+ local parameters = tfmtable.parameters
+ local width = parameters.digitwidth
+ if not width then
+ width = round(parameters.quad/2) -- maybe tex.scale
+ local characters = tfmtable.characters
+ for i=48,57 do
+ local wd = round(characters[i].width)
+ if wd > width then
+ width = wd
+ end
+ end
+ parameters.digitwidth = width
+ end
+ return width
+end
+
+fonts.get_digit_width = fonts.set_digit_width
+
+-- soon to be obsolete:
+
+local loaded = { -- prevent loading (happens in cont-sys files)
+ ["original-base.map" ] = true,
+ ["original-ams-base.map" ] = true,
+ ["original-ams-euler.map"] = true,
+ ["original-public-lm.map"] = true,
+}
+
+function fonts.map.loadfile(name)
+ name = file.addsuffix(name,"map")
+ if not loaded[name] then
+ pdf.mapfile(name)
+ loaded[name] = true
+ end
+end
+
+local loaded = { -- prevent double loading
+}
+
+function fonts.map.loadline(how,line)
+ if line then
+ how = how .. " " .. line
+ elseif how == "" then
+ how = "= " .. line
+ end
+ if not loaded[how] then
+ pdf.mapline(how)
+ loaded[how] = true
+ end
+end
+
+function fonts.map.reset()
+ pdf.mapfile("")
+end
+
+fonts.map.reset() -- resets the default file
+
+-- we need an 'do after the banner hook'
+
+-- pdf.mapfile("mkiv-base.map") -- loads the default file
+
+local nounicode = byte("?")
+
+local function name_to_slot(name) -- maybe some day rawdata
+ local tfmdata = fonts.ids[font.current()]
+ local shared = tfmdata and tfmdata.shared
+ local fntdata = shared and shared.otfdata or shared.afmdata
+ if fntdata then
+ local unicode = fntdata.luatex.unicodes[name]
+ if not unicode then
+ return nounicode
+ elseif type(unicode) == "number" then
+ return unicode
+ else -- multiple unicodes
+ return unicode[1]
+ end
+ end
+ return nounicode
+end
+
+fonts.name_to_slot = name_to_slot
+
+function fonts.char(n) -- todo: afm en tfm
+ if type(n) == "string" then
+ n = name_to_slot(n)
+ end
+ if type(n) == "number" then
+ texsprint(ctxcatcodes,format("\\char%s ",n))
+ end
+end
+
+-- moved from ini:
+
+fonts.color = { } -- dummy in ini
+
+local attribute = attributes.private('color')
+local mapping = (attributes and attributes.list[attribute]) or { }
+
+local set_attribute = node.set_attribute
+local unset_attribute = node.unset_attribute
+
+function fonts.color.set(n,c)
+ local mc = mapping[c]
+ if not mc then
+ unset_attribute(n,attribute)
+ else
+ set_attribute(n,attribute,mc)
+ end
+end
+
+function fonts.color.reset(n)
+ unset_attribute(n,attribute)
+end
+
+-- this will become obsolete:
+
+fonts.otf.name_to_slot = name_to_slot
+fonts.afm.name_to_slot = name_to_slot
+
+fonts.otf.char = fonts.char
+fonts.afm.char = fonts.char
+
+-- this will change ...
+
+function fonts.show_char_data(n)
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata then
+ if type(n) == "string" then
+ n = utf.byte(n)
+ end
+ local chr = tfmdata.characters[n]
+ if chr then
+ write_nl(format("%s @ %s => U%04X => %s => ",tfmdata.fullname,tfmdata.size,n,utf.char(n)) .. serialize(chr,false))
+ end
+ end
+end
+
+function fonts.show_font_parameters()
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata then
+ local parameters, mathconstants = tfmdata.parameters, tfmdata.MathConstants
+ local hasparameters, hasmathconstants = parameters and next(parameters), mathconstants and next(mathconstants)
+ if hasparameters then
+ write_nl(format("%s @ %s => parameters => ",tfmdata.fullname,tfmdata.size) .. serialize(parameters,false))
+ end
+ if hasmathconstants then
+ write_nl(format("%s @ %s => math constants => ",tfmdata.fullname,tfmdata.size) .. serialize(mathconstants,false))
+ end
+ if not hasparameters and not hasmathconstants then
+ write_nl(format("%s @ %s => no parameters and/or mathconstants",tfmdata.fullname,tfmdata.size))
+ end
+ end
+end
diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua
new file mode 100644
index 000000000..c3b10162c
--- /dev/null
+++ b/tex/context/base/font-def.lua
@@ -0,0 +1,651 @@
+if not modules then modules = { } end modules ['font-def'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
+local tostring, next = tostring, next
+local lpegmatch = lpeg.match
+
+local trace_defining = false trackers .register("fonts.defining", function(v) trace_defining = v end)
+local directive_embedall = false directives.register("fonts.embedall", function(v) directive_embedall = v end)
+
+trackers.register("fonts.loading", "fonts.defining", "otf.loading", "afm.loading", "tfm.loading")
+trackers.register("fonts.all", "fonts.*", "otf.*", "afm.*", "tfm.*")
+
+--[[ldx--
+<p>Here we deal with defining fonts. We do so by intercepting the
+default loader that only handles <l n='tfm'/>.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.define = fonts.define or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+fonts.vf = fonts.vf or { }
+fonts.used = fonts.used or { }
+
+local tfm = fonts.tfm
+local vf = fonts.vf
+local define = fonts.define
+
+tfm.version = 1.01
+tfm.cache = containers.define("fonts", "tfm", tfm.version, false) -- better in font-tfm
+
+define.method = "afm or tfm" -- afm, tfm, afm or tfm, tfm or afm
+define.specify = fonts.define.specify or { }
+define.methods = fonts.define.methods or { }
+
+tfm.fonts = tfm.fonts or { }
+tfm.readers = tfm.readers or { }
+tfm.internalized = tfm.internalized or { } -- internal tex numbers
+
+tfm.readers.sequence = { 'otf', 'ttf', 'afm', 'tfm' }
+
+tfm.auto_afm = true
+
+local readers = tfm.readers
+local sequence = readers.sequence
+
+--[[ldx--
+<p>We hardly gain anything when we cache the final (pre scaled)
+<l n='tfm'/> table. But it can be handy for debugging.</p>
+--ldx]]--
+
+fonts.version = 1.05
+fonts.cache = containers.define("fonts", "def", fonts.version, false)
+
+--[[ldx--
+<p>We can prefix a font specification by <type>name:</type> or
+<type>file:</type>. The first case will result in a lookup in the
+synonym table.</p>
+
+<typing>
+[ name: | file: ] identifier [ separator [ specification ] ]
+</typing>
+
+<p>The following function split the font specification into components
+and prepares a table that will move along as we proceed.</p>
+--ldx]]--
+
+-- 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, ""
+
+local P, C, S, Cc = lpeg.P, lpeg.C, lpeg.S, lpeg.Cc
+
+local left = P("(")
+local right = P(")")
+local colon = P(":")
+local space = P(" ")
+
+define.defaultlookup = "file"
+
+local prefixpattern = P(false)
+
+function define.add_specifier(symbol)
+ specifiers = specifiers .. symbol
+ local method = S(specifiers)
+ local lookup = C(prefixpattern) * colon
+ local sub = left * C(P(1-left-right-method)^1) * right
+ local specification = C(method) * C(P(1)^1)
+ local name = C((1-sub-specification)^1)
+ splitter = P((lookup + Cc("")) * name * (sub + Cc("")) * (specification + Cc("")))
+end
+
+function define.add_lookup(str,default)
+ prefixpattern = prefixpattern + P(str)
+end
+
+define.add_lookup("file")
+define.add_lookup("name")
+define.add_lookup("spec")
+
+function define.get_specification(str)
+ return lpegmatch(splitter,str)
+end
+
+function define.register_split(symbol,action)
+ define.add_specifier(symbol)
+ define.specify[symbol] = action
+end
+
+function define.makespecification(specification, lookup, name, sub, method, detail, size)
+ size = size or 655360
+ if trace_defining 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
+--~ if specification.lookup then
+--~ lookup = specification.lookup -- can come from xetex [] syntax
+--~ specification.lookup = nil
+--~ end
+ if not lookup or lookup == "" then
+ lookup = define.defaultlookup
+ end
+ local t = {
+ lookup = lookup, -- forced type
+ specification = specification, -- full specification
+ size = size, -- size in scaled points or -1000*n
+ name = name, -- font or filename
+ sub = sub, -- subfont (eg in ttc)
+ method = method, -- specification method
+ detail = detail, -- specification
+ resolved = "", -- resolved font name
+ forced = "", -- forced loader
+ features = { }, -- preprocessed features
+ }
+ return t
+end
+
+function define.analyze(specification, size)
+ -- can be optimized with locals
+ local lookup, name, sub, method, detail = define.get_specification(specification or "")
+ return define.makespecification(specification, lookup, name, sub, method, detail, size)
+end
+
+--[[ldx--
+<p>A unique hash value is generated by:</p>
+--ldx]]--
+
+local sortedhashkeys = table.sortedhashkeys
+
+function tfm.hash_features(specification)
+ local features = specification.features
+ if features then
+ local t = { }
+ local normal = features.normal
+ if normal and next(normal) then
+ local f = sortedhashkeys(normal)
+ for i=1,#f do
+ local v = f[i]
+ if v ~= "number" and v ~= "features" then -- i need to figure this out, features
+ t[#t+1] = v .. '=' .. tostring(normal[v])
+ end
+ end
+ end
+ local vtf = features.vtf
+ if vtf and next(vtf) then
+ local f = sortedhashkeys(vtf)
+ for i=1,#f do
+ local v = f[i]
+ t[#t+1] = v .. '=' .. tostring(vtf[v])
+ end
+ end
+--~ if specification.mathsize then
+--~ t[#t+1] = "mathsize=" .. specification.mathsize
+--~ end
+ if #t > 0 then
+ return concat(t,"+")
+ end
+ end
+ return "unknown"
+end
+
+fonts.designsizes = { }
+
+--[[ldx--
+<p>In principle we can share tfm tables when we are in node for a font, but then
+we need to define a font switch as an id/attr switch which is no fun, so in that
+case users can best use dynamic features ... so, we will not use that speedup. Okay,
+when we get rid of base mode we can optimize even further by sharing, but then we
+loose our testcases for <l n='luatex'/>.</p>
+--ldx]]--
+
+function tfm.hash_instance(specification,force)
+ 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 = math.round(tfm.scaled(size, fonts.designsizes[hash]))
+ specification.size = size
+ end
+--~ local mathsize = specification.mathsize or 0
+--~ if mathsize > 0 then
+--~ local textsize = specification.textsize
+--~ if fallbacks then
+--~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks
+--~ else
+--~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]'
+--~ end
+--~ else
+ if fallbacks then
+ return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks
+ else
+ return hash .. ' @ ' .. tostring(size)
+ end
+--~ end
+end
+
+--[[ldx--
+<p>We can resolve the filename using the next function:</p>
+--ldx]]--
+
+define.resolvers = resolvers
+
+function define.resolvers.file(specification)
+ specification.forced = file.extname(specification.name)
+ specification.name = file.removesuffix(specification.name)
+end
+
+function define.resolvers.name(specification)
+ local resolve = fonts.names.resolve
+ if resolve 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
+ else
+ define.resolvers.file(specification)
+ end
+end
+
+function define.resolvers.spec(specification)
+ local resolvespec = fonts.names.resolvespec
+ if resolvespec then
+ specification.resolved, specification.sub = fonts.names.resolvespec(specification.name,specification.sub)
+ if specification.resolved then
+ specification.forced = file.extname(specification.resolved)
+ specification.name = file.removesuffix(specification.resolved)
+ end
+ else
+ define.resolvers.name(specification)
+ end
+end
+
+function define.resolve(specification)
+ if not specification.resolved or specification.resolved == "" then -- resolved itself not per se in mapping hash
+ local r = define.resolvers[specification.lookup]
+ if r then
+ r(specification)
+ end
+ end
+ if specification.forced == "" then
+ specification.forced = nil
+ else
+ specification.forced = specification.forced
+ end
+ specification.hash = lower(specification.name .. ' @ ' .. tfm.hash_features(specification))
+ if specification.sub and specification.sub ~= "" then
+ specification.hash = specification.sub .. ' @ ' .. specification.hash
+ end
+ return specification
+end
+
+--[[ldx--
+<p>The main read function either uses a forced reader (as determined by
+a lookup) or tries to resolve the name using the list of readers.</p>
+
+<p>We need to cache when possible. We do cache raw tfm data (from <l
+n='tfm'/>, <l n='afm'/> or <l n='otf'/>). After that we can cache based
+on specificstion (name) and size, that is, <l n='tex'/> only needs a number
+for an already loaded fonts. However, it may make sense to cache fonts
+before they're scaled as well (store <l n='tfm'/>'s with applied methods
+and features). However, there may be a relation between the size and
+features (esp in virtual fonts) so let's not do that now.</p>
+
+<p>Watch out, here we do load a font, but we don't prepare the
+specification yet.</p>
+--ldx]]--
+
+function tfm.read(specification)
+ local hash = tfm.hash_instance(specification)
+ local tfmtable = tfm.fonts[hash] -- hashes by size !
+ if not tfmtable then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ tfmtable = readers[lower(forced)](specification)
+ if not tfmtable then
+ logs.report("define font","forced type %s of %s not found",forced,specification.name)
+ end
+ else
+ for s=1,#sequence do -- reader sequence
+ local reader = sequence[s]
+ if readers[reader] then -- not really needed
+ if trace_defining then
+ logs.report("define font","trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown")
+ end
+ tfmtable = readers[reader](specification)
+ if tfmtable then
+ break
+ else
+ specification.filename = nil
+ end
+ end
+ end
+ end
+ if tfmtable then
+ if directive_embedall then
+ tfmtable.embedding = "full"
+ elseif tfmtable.filename and fonts.dontembed[tfmtable.filename] then
+ tfmtable.embedding = "no"
+ else
+ tfmtable.embedding = "subset"
+ end
+ tfm.fonts[hash] = tfmtable
+ fonts.designsizes[specification.hash] = tfmtable.designsize -- we only know this for sure after loading once
+ --~ tfmtable.mode = specification.features.normal.mode or "base"
+ end
+ end
+ if not tfmtable then
+ logs.report("define font","font with name %s is not found",specification.name)
+ end
+ return tfmtable
+end
+
+--[[ldx--
+<p>For virtual fonts we need a slightly different approach:</p>
+--ldx]]--
+
+function tfm.read_and_define(name,size) -- no id
+ local specification = define.analyze(name,size)
+ local method = specification.method
+ if method and define.specify[method] then
+ specification = define.specify[method](specification)
+ end
+ specification = define.resolve(specification)
+ local hash = tfm.hash_instance(specification)
+ local id = define.registered(hash)
+ if not id then
+ local fontdata = tfm.read(specification)
+ if fontdata then
+ fontdata.hash = hash
+ id = font.define(fontdata)
+ define.register(fontdata,id)
+ tfm.cleanup_table(fontdata)
+ else
+ id = 0 -- signal
+ end
+ end
+ return fonts.ids[id], id
+end
+
+--[[ldx--
+<p>Next follow the readers. This code was written while <l n='luatex'/>
+evolved. Each one has its own way of dealing with its format.</p>
+--ldx]]--
+
+local function check_tfm(specification,fullname)
+ -- ofm directive blocks local path search unless set; btw, in context we
+ -- don't support ofm files anyway as this format is obsolete
+ local foundname = resolvers.findbinfile(fullname, 'tfm') or "" -- just to be sure
+ if foundname == "" then
+ foundname = resolvers.findbinfile(fullname, 'ofm') or "" -- bonus for usage outside context
+ end
+ if foundname ~= "" then
+ specification.filename, specification.format = foundname, "ofm"
+ return tfm.read_from_tfm(specification)
+ end
+end
+
+local function check_afm(specification,fullname)
+ local foundname = resolvers.findbinfile(fullname, 'afm') or "" -- just to be sure
+ if foundname == "" and tfm.auto_afm then
+ local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.*
+ if encoding and shortname and fonts.enc.known[encoding] then
+ shortname = resolvers.findbinfile(shortname,'afm') or "" -- just to be sure
+ if shortname ~= "" then
+ foundname = shortname
+ -- tfm.set_normal_feature(specification,'encoding',encoding) -- will go away
+ if trace_loading then
+ logs.report("load afm","stripping encoding prefix from filename %s",afmname)
+ end
+ end
+ end
+ end
+ if foundname ~= "" then
+ specification.filename, specification.format = foundname, "afm"
+ return tfm.read_from_afm(specification)
+ end
+end
+
+function readers.tfm(specification)
+ local fullname, tfmtable = specification.filename or "", nil
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ tfmtable = check_tfm(specification,specification.name .. "." .. forced)
+ end
+ if not tfmtable then
+ tfmtable = check_tfm(specification,specification.name)
+ end
+ else
+ tfmtable = check_tfm(specification,fullname)
+ end
+ return tfmtable
+end
+
+function readers.afm(specification,method)
+ local fullname, tfmtable = specification.filename or "", nil
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ tfmtable = check_afm(specification,specification.name .. "." .. forced)
+ end
+ if not tfmtable then
+ method = method or define.method or "afm or tfm"
+ if method == "tfm" then
+ tfmtable = check_tfm(specification,specification.name)
+ elseif method == "afm" then
+ tfmtable = check_afm(specification,specification.name)
+ elseif method == "tfm or afm" then
+ tfmtable = check_tfm(specification,specification.name) or check_afm(specification,specification.name)
+ else -- method == "afm or tfm" or method == "" then
+ tfmtable = check_afm(specification,specification.name) or check_tfm(specification,specification.name)
+ end
+ end
+ else
+ tfmtable = check_afm(specification,fullname)
+ end
+ return tfmtable
+end
+
+-- maybe some day a set of names
+
+local function check_otf(forced,specification,suffix,what)
+ local name = specification.name
+ if forced then
+ name = file.addsuffix(name,suffix)
+ end
+ local fullname, tfmtable = resolvers.findbinfile(name,suffix) or "", nil -- one shot
+ if fullname == "" then
+ local fb = fonts.names.old_to_new[name]
+ if fb then
+ fullname = resolvers.findbinfile(fb,suffix) or ""
+ end
+ end
+ if fullname == "" then
+ local fb = fonts.names.new_to_old[name]
+ if fb then
+ fullname = resolvers.findbinfile(fb,suffix) or ""
+ end
+ end
+ if fullname ~= "" then
+ specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then
+ tfmtable = tfm.read_from_open_type(specification) -- we need to do it for all matches / todo
+ end
+ return tfmtable
+end
+
+function readers.opentype(specification,suffix,what)
+ local forced = specification.forced or ""
+ if forced == "otf" then
+ return check_otf(true,specification,forced,"opentype")
+ elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then
+ return check_otf(true,specification,forced,"truetype")
+ else
+ return check_otf(false,specification,suffix,what)
+ end
+end
+
+function readers.otf (specification) return readers.opentype(specification,"otf","opentype") end
+function readers.ttf (specification) return readers.opentype(specification,"ttf","truetype") end
+function readers.ttc (specification) return readers.opentype(specification,"ttf","truetype") end -- !!
+function readers.dfont(specification) return readers.opentype(specification,"ttf","truetype") end -- !!
+
+--[[ldx--
+<p>We need to check for default features. For this we provide
+a helper function.</p>
+--ldx]]--
+
+function define.check(features,defaults) -- nb adapts features !
+ local done = false
+ if features and next(features) then
+ for k,v in next, defaults do
+ if features[k] == nil then
+ features[k], done = v, true
+ end
+ end
+ else
+ features, done = table.fastcopy(defaults), true
+ end
+ return features, done -- done signals a change
+end
+
+--[[ldx--
+<p>So far the specifyers. Now comes the real definer. Here we cache
+based on id's. Here we also intercept the virtual font handler. Since
+it evolved stepwise I may rewrite this bit (combine code).</p>
+
+In the previously defined reader (the one resulting in a <l n='tfm'/>
+table) we cached the (scaled) instances. Here we cache them again, but
+this time based on id. We could combine this in one cache but this does
+not gain much. By the way, passing id's back to in the callback was
+introduced later in the development.</p>
+--ldx]]--
+
+define.last = nil
+
+function define.register(fontdata,id)
+ if fontdata and id then
+ local hash = fontdata.hash
+ if not tfm.internalized[hash] then
+ if trace_defining then
+ logs.report("define font","loading at 2 id %s, hash: %s",id or "?",hash or "?")
+ end
+ fonts.identifiers[id] = fontdata
+ fonts.characters [id] = fontdata.characters
+ fonts.quads [id] = fontdata.parameters.quad
+ -- todo: extra functions, e.g. setdigitwidth etc in list
+ tfm.internalized[hash] = id
+ end
+ end
+end
+
+function define.registered(hash)
+ local id = tfm.internalized[hash]
+ return id, id and fonts.ids[id]
+end
+
+local cache_them = false
+
+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 = define.methods[specification.features.vtf.preset]
+ if fvm then
+ return fvm(specification)
+ else
+ return nil
+ end
+end
+
+function define.read(specification,size,id) -- id can be optional, name can already be table
+ statistics.starttiming(fonts)
+ if type(specification) == "string" then
+ specification = define.analyze(specification,size)
+ end
+ local method = specification.method
+ if method and define.specify[method] then
+ specification = define.specify[method](specification)
+ end
+ specification = define.resolve(specification)
+ local hash = tfm.hash_instance(specification)
+ if cache_them then
+ local fontdata = containers.read(fonts.cache(),hash) -- for tracing purposes
+ end
+ local fontdata = define.registered(hash) -- id
+ if not fontdata then
+ if specification.features.vtf and specification.features.vtf.preset then
+ fontdata = tfm.make(specification)
+ else
+ fontdata = tfm.read(specification)
+ if fontdata then
+ tfm.check_virtual_id(fontdata)
+ end
+ end
+ if cache_them then
+ fontdata = containers.write(fonts.cache(),hash,fontdata) -- for tracing purposes
+ end
+ if fontdata then
+ fontdata.hash = hash
+ fontdata.cache = "no"
+ if id then
+ define.register(fontdata,id)
+ end
+ end
+ end
+ define.last = fontdata or id -- todo ! ! ! ! !
+ if not fontdata then
+ logs.report("define font", "unknown font %s, loading aborted",specification.name)
+ elseif trace_defining and type(fontdata) == "table" then
+ logs.report("define font","using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s",
+ fontdata.type or "unknown",
+ id or "?",
+ fontdata.name or "?",
+ fontdata.size or "default",
+ fontdata.encodingbytes or "?",
+ fontdata.encodingname or "unicode",
+ fontdata.fullname or "?",
+ file.basename(fontdata.filename or "?"))
+
+ end
+ statistics.stoptiming(fonts)
+ return fontdata
+end
+
+function vf.find(name)
+ name = file.removesuffix(file.basename(name))
+ if tfm.resolve_vf then
+ local format = fonts.logger.format(name)
+ if format == 'tfm' or format == 'ofm' then
+ if trace_defining then
+ logs.report("define font","locating vf for %s",name)
+ end
+ return resolvers.findbinfile(name,"ovf")
+ else
+ if trace_defining then
+ logs.report("define font","vf for %s is already taken care of",name)
+ end
+ return nil -- ""
+ end
+ else
+ if trace_defining then
+ logs.report("define font","locating vf for %s",name)
+ end
+ return resolvers.findbinfile(name,"ovf")
+ end
+end
+
+--[[ldx--
+<p>We overload both the <l n='tfm'/> and <l n='vf'/> readers.</p>
+--ldx]]--
+
+callbacks.register('define_font' , define.read, "definition of fonts (tfmtable preparation)")
+callbacks.register('find_vf_file', vf.find , "locating virtual fonts, insofar needed") -- not that relevant any more
diff --git a/tex/context/base/font-dum.lua b/tex/context/base/font-dum.lua
new file mode 100644
index 000000000..0a9bcd301
--- /dev/null
+++ b/tex/context/base/font-dum.lua
@@ -0,0 +1,301 @@
+if not modules then modules = { } end modules ['font-dum'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+fonts = fonts or { }
+
+-- general
+
+fonts.otf.pack = false -- only makes sense in context
+fonts.tfm.resolve_vf = false -- no sure about this
+fonts.tfm.fontname_mode = "specification" -- somehow latex needs this
+
+-- readers
+
+fonts.tfm.readers = fonts.tfm.readers or { }
+fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm' }
+fonts.tfm.readers.afm = nil
+
+-- define
+
+fonts.define = fonts.define or { }
+
+--~ fonts.define.method = "tfm"
+
+fonts.define.specify.colonized_default_lookup = "name"
+
+function fonts.define.get_specification(str)
+ return "", str, "", ":", str
+end
+
+-- logger
+
+fonts.logger = fonts.logger or { }
+
+function fonts.logger.save()
+end
+
+-- names
+--
+-- Watch out, the version number is the same as the one used in
+-- the mtx-fonts.lua function scripts.fonts.names as we use a
+-- simplified font database in the plain solution and by using
+-- a different number we're less dependent on context.
+
+fonts.names = fonts.names or { }
+
+fonts.names.version = 1.001 -- not the same as in context
+fonts.names.basename = "luatex-fonts-names.lua"
+fonts.names.new_to_old = { }
+fonts.names.old_to_new = { }
+
+local data, loaded = nil, false
+
+local fileformats = { "lua", "tex", "other text files" }
+
+function fonts.names.resolve(name,sub)
+ if not loaded then
+ local basename = fonts.names.basename
+ if basename and basename ~= "" then
+ for i=1,#fileformats do
+ local format = fileformats[i]
+ local foundname = resolvers.find_file(basename,format) or ""
+ if foundname ~= "" then
+ data = dofile(foundname)
+ break
+ end
+ end
+ end
+ loaded = true
+ end
+ if type(data) == "table" and data.version == fonts.names.version then
+ local condensed = string.gsub(string.lower(name),"[^%a%d]","")
+ local found = data.mappings and data.mappings[condensed]
+ if found then
+ local fontname, filename, subfont = found[1], found[2], found[3]
+ if subfont then
+ return filename, fontname
+ else
+ return filename, false
+ end
+ else
+ return name, false -- fallback to filename
+ end
+ end
+end
+
+fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv
+
+-- For the moment we put this (adapted) pseudo feature here.
+
+table.insert(fonts.triggers,"itlc")
+
+local function itlc(tfmdata,value)
+ if value then
+ -- the magic 40 and it formula come from Dohyun Kim
+ local metadata = tfmdata.shared.otfdata.metadata
+ if metadata then
+ local italicangle = metadata.italicangle
+ if italicangle and italicangle ~= 0 then
+ local uwidth = (metadata.uwidth or 40)/2
+ for unicode, d in next, tfmdata.descriptions do
+ local it = d.boundingbox[3] - d.width + uwidth
+ if it ~= 0 then
+ d.italic = it
+ end
+ end
+ tfmdata.has_italic = true
+ end
+ end
+ end
+end
+
+fonts.initializers.base.otf.itlc = itlc
+fonts.initializers.node.otf.itlc = itlc
+
+-- slant and extend
+
+function fonts.initializers.common.slant(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 1 then
+ value = 1
+ elseif value < -1 then
+ value = -1
+ end
+ tfmdata.slant_factor = value
+end
+
+function fonts.initializers.common.extend(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 10 then
+ value = 10
+ elseif value < -10 then
+ value = -10
+ end
+ tfmdata.extend_factor = value
+end
+
+table.insert(fonts.triggers,"slant")
+table.insert(fonts.triggers,"extend")
+
+fonts.initializers.base.otf.slant = fonts.initializers.common.slant
+fonts.initializers.node.otf.slant = fonts.initializers.common.slant
+fonts.initializers.base.otf.extend = fonts.initializers.common.extend
+fonts.initializers.node.otf.extend = fonts.initializers.common.extend
+
+-- expansion and protrusion
+
+fonts.protrusions = fonts.protrusions or { }
+fonts.protrusions.setups = fonts.protrusions.setups or { }
+
+local setups = fonts.protrusions.setups
+
+function fonts.initializers.common.protrusion(tfmdata,value)
+ if value then
+ local setup = setups[value]
+ if setup then
+ local factor, left, right = setup.factor or 1, setup.left or 1, setup.right or 1
+ local emwidth = tfmdata.parameters.quad
+ tfmdata.auto_protrude = true
+ for i, chr in next, tfmdata.characters do
+ local v, pl, pr = setup[i], nil, nil
+ if v then
+ pl, pr = v[1], v[2]
+ end
+ if pl and pl ~= 0 then chr.left_protruding = left *pl*factor end
+ if pr and pr ~= 0 then chr.right_protruding = right*pr*factor end
+ end
+ end
+ end
+end
+
+fonts.expansions = fonts.expansions or { }
+fonts.expansions.setups = fonts.expansions.setups or { }
+
+local setups = fonts.expansions.setups
+
+function fonts.initializers.common.expansion(tfmdata,value)
+ if value then
+ local setup = setups[value]
+ if setup then
+ local stretch, shrink, step, factor = setup.stretch or 0, setup.shrink or 0, setup.step or 0, setup.factor or 1
+ tfmdata.stretch, tfmdata.shrink, tfmdata.step, tfmdata.auto_expand = stretch * 10, shrink * 10, step * 10, true
+ for i, chr in next, tfmdata.characters do
+ local v = setup[i]
+ if v and v ~= 0 then
+ chr.expansion_factor = v*factor
+ else -- can be option
+ chr.expansion_factor = factor
+ end
+ end
+ end
+ end
+end
+
+table.insert(fonts.manipulators,"protrusion")
+table.insert(fonts.manipulators,"expansion")
+
+fonts.initializers.base.otf.protrusion = fonts.initializers.common.protrusion
+fonts.initializers.node.otf.protrusion = fonts.initializers.common.protrusion
+fonts.initializers.base.otf.expansion = fonts.initializers.common.expansion
+fonts.initializers.node.otf.expansion = fonts.initializers.common.expansion
+
+-- left over
+
+function fonts.register_message()
+end
+
+-- example vectors
+
+local byte = string.byte
+
+fonts.expansions.setups['default'] = {
+
+ stretch = 2, shrink = 2, step = .5, factor = 1,
+
+ [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
+ [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
+ [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
+ [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
+ [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
+ [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
+ [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
+ [byte('w')] = 0.7, [byte('z')] = 0.7,
+ [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
+}
+
+fonts.protrusions.setups['default'] = {
+
+ factor = 1, left = 1, right = 1,
+
+ [0x002C] = { 0, 1 }, -- comma
+ [0x002E] = { 0, 1 }, -- period
+ [0x003A] = { 0, 1 }, -- colon
+ [0x003B] = { 0, 1 }, -- semicolon
+ [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 。
+ [0x060C] = { 0, 1 }, -- arabic comma ،
+ [0x061B] = { 0, 1 }, -- arabic semicolon ؛
+ [0x06D4] = { 0, 1 }, -- arabic full stop ۔
+
+}
+
+-- normalizer
+
+fonts.otf.meanings = fonts.otf.meanings or { }
+
+fonts.otf.meanings.normalize = fonts.otf.meanings.normalize or function(t)
+ if t.rand then
+ t.rand = "random"
+ end
+end
+
+-- bonus
+
+function fonts.otf.name_to_slot(name)
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata and tfmdata.shared then
+ local otfdata = tfmdata.shared.otfdata
+ local unicode = otfdata.luatex.unicodes[name]
+ return unicode and (type(unicode) == "number" and unicode or unicode[1])
+ end
+end
+
+function fonts.otf.char(n)
+ if type(n) == "string" then
+ n = fonts.otf.name_to_slot(n)
+ end
+ if type(n) == "number" then
+ tex.sprint("\\char" .. n)
+ end
+end
+
+-- another one:
+
+fonts.strippables = table.tohash {
+ 0x000AD, 0x017B4, 0x017B5, 0x0200B, 0x0200C, 0x0200D, 0x0200E, 0x0200F, 0x0202A, 0x0202B,
+ 0x0202C, 0x0202D, 0x0202E, 0x02060, 0x02061, 0x02062, 0x02063, 0x0206A, 0x0206B, 0x0206C,
+ 0x0206D, 0x0206E, 0x0206F, 0x0FEFF, 0x1D173, 0x1D174, 0x1D175, 0x1D176, 0x1D177, 0x1D178,
+ 0x1D179, 0x1D17A, 0xE0001, 0xE0020, 0xE0021, 0xE0022, 0xE0023, 0xE0024, 0xE0025, 0xE0026,
+ 0xE0027, 0xE0028, 0xE0029, 0xE002A, 0xE002B, 0xE002C, 0xE002D, 0xE002E, 0xE002F, 0xE0030,
+ 0xE0031, 0xE0032, 0xE0033, 0xE0034, 0xE0035, 0xE0036, 0xE0037, 0xE0038, 0xE0039, 0xE003A,
+ 0xE003B, 0xE003C, 0xE003D, 0xE003E, 0xE003F, 0xE0040, 0xE0041, 0xE0042, 0xE0043, 0xE0044,
+ 0xE0045, 0xE0046, 0xE0047, 0xE0048, 0xE0049, 0xE004A, 0xE004B, 0xE004C, 0xE004D, 0xE004E,
+ 0xE004F, 0xE0050, 0xE0051, 0xE0052, 0xE0053, 0xE0054, 0xE0055, 0xE0056, 0xE0057, 0xE0058,
+ 0xE0059, 0xE005A, 0xE005B, 0xE005C, 0xE005D, 0xE005E, 0xE005F, 0xE0060, 0xE0061, 0xE0062,
+ 0xE0063, 0xE0064, 0xE0065, 0xE0066, 0xE0067, 0xE0068, 0xE0069, 0xE006A, 0xE006B, 0xE006C,
+ 0xE006D, 0xE006E, 0xE006F, 0xE0070, 0xE0071, 0xE0072, 0xE0073, 0xE0074, 0xE0075, 0xE0076,
+ 0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F,
+}
+
diff --git a/tex/context/base/font-enc.lua b/tex/context/base/font-enc.lua
new file mode 100644
index 000000000..874f7c3f4
--- /dev/null
+++ b/tex/context/base/font-enc.lua
@@ -0,0 +1,122 @@
+if not modules then modules = { } end modules ['font-enc'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local match, gmatch, gsub = string.match, string.gmatch, string.gsub
+
+--[[ldx--
+<p>Because encodings are going to disappear, we don't bother defining
+them in tables. But we may do so some day, for consistency.</p>
+--ldx]]--
+
+fonts.enc = fonts.enc or { }
+fonts.enc.version = 1.03
+fonts.enc.cache = containers.define("fonts", "enc", fonts.enc.version, true)
+
+fonts.enc.known = { -- sort of obsolete
+ texnansi = true,
+ ec = true,
+ qx = true,
+ t5 = true,
+ t2a = true,
+ t2b = true,
+ t2c = true,
+ unicode = true
+}
+
+function fonts.enc.is_known(encoding)
+ return containers.is_valid(fonts.enc.cache(),encoding)
+end
+
+--[[ldx--
+<p>An encoding file looks like this:</p>
+
+<typing>
+/TeXnANSIEncoding [
+/.notdef
+/Euro
+...
+/ydieresis
+] def
+</typing>
+
+<p>Beware! The generic encoding files don't always apply to the ones that
+ship with fonts. This has to do with the fact that names follow (slightly)
+different standards. However, the fonts where this applies to (for instance
+Latin Modern or <l n='tex'> Gyre) come in OpenType variants too, so these
+will be used.</p>
+--ldx]]--
+
+function fonts.enc.load(filename)
+ local name = file.removesuffix(filename)
+ local data = containers.read(fonts.enc.cache(),name)
+ if data then
+ return data
+ end
+ if name == "unicode" then
+ data = fonts.enc.make_unicode_vector() -- special case, no tex file for this
+ end
+ if data then
+ return data
+ end
+ local vector, tag, hash, unicodes = { }, "", { }, { }
+ local foundname = resolvers.find_file(filename,'enc')
+ if foundname and foundname ~= "" then
+ local ok, encoding, size = resolvers.loadbinfile(foundname)
+ if ok and encoding then
+ local enccodes = characters.enccodes
+ encoding = gsub(encoding,"%%(.-)\n","")
+ local tag, vec = match(encoding,"/(%w+)%s*%[(.*)%]%s*def")
+ local i = 0
+ for ch in gmatch(vec,"/([%a%d%.]+)") do
+ if ch ~= ".notdef" then
+ vector[i] = ch
+ if not hash[ch] then
+ hash[ch] = i
+ else
+ -- duplicate, play safe for tex ligs and take first
+ end
+ if enccodes[ch] then
+ unicodes[enccodes[ch]] = i
+ end
+ end
+ i = i + 1
+ end
+ end
+ end
+ local data = {
+ name=name,
+ tag=tag,
+ vector=vector,
+ hash=hash,
+ unicodes=unicodes
+ }
+ return containers.write(fonts.enc.cache(), name, data)
+end
+
+--[[ldx--
+<p>There is no unicode encoding but for practical purposed we define
+one.</p>
+--ldx]]--
+
+-- maybe make this a function:
+
+function fonts.enc.make_unicode_vector()
+ local vector, hash = { }, { }
+ for code, v in next, characters.data do
+ local name = v.adobename
+ if name then
+ vector[code], hash[name] = name, code
+ else
+ vector[code] = '.notdef'
+ end
+ end
+ for name, code in next, characters.synonyms do
+ vector[code], hash[name] = name, code
+ end
+ return containers.write(fonts.enc.cache(), 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash })
+end
diff --git a/tex/context/base/font-enh.lua b/tex/context/base/font-enh.lua
new file mode 100644
index 000000000..fc70c04c5
--- /dev/null
+++ b/tex/context/base/font-enh.lua
@@ -0,0 +1,201 @@
+if not modules then modules = { } end modules ['font-enh'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, match = next, string.match
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+-- tfmdata has also fast access to indices and unicodes
+-- to be checked: otf -> tfm -> tfmscaled
+--
+-- watch out: no negative depths and negative eights permitted in regular fonts
+
+--[[ldx--
+<p>Here we only implement a few helper functions.</p>
+--ldx]]--
+
+local tfm = fonts.tfm
+
+--[[ldx--
+<p>The next function encapsulates the standard <l n='tfm'/> loader as
+supplied by <l n='luatex'/>.</p>
+--ldx]]--
+
+-- auto complete font with missing composed characters
+
+table.insert(fonts.manipulators,"compose")
+
+function fonts.initializers.common.compose(tfmdata,value)
+ if value then
+ fonts.vf.aux.compose_characters(tfmdata)
+ end
+end
+
+-- tfm features, experimental
+
+tfm.features = tfm.features or { }
+tfm.features.list = tfm.features.list or { }
+tfm.features.default = tfm.features.default or { }
+
+function tfm.enhance(tfmdata,specification)
+ -- we don't really share tfm data because we always reload
+ -- but this is more in sycn with afm and such
+ local features = (specification.features and specification.features.normal ) or { }
+ tfmdata.shared = tfmdata.shared or { }
+ tfmdata.shared.features = features
+ -- tfmdata.shared.tfmdata = tfmdata -- circular
+ tfmdata.filename = specification.name
+ if not features.encoding then
+ local name, size = specification.name, specification.size
+ local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.*
+ if filename and encoding and fonts.enc.known[encoding] then
+ features.encoding = encoding
+ end
+ end
+ tfm.set_features(tfmdata)
+end
+
+function tfm.set_features(tfmdata)
+ -- todo: no local functions
+ local shared = tfmdata.shared
+-- local tfmdata = shared.tfmdata
+ local features = shared.features
+ if features and next(features) then
+ local mode = tfmdata.mode or fonts.mode
+ local fi = fonts.initializers[mode]
+ if fi and fi.tfm then
+ local function initialize(list) -- using tex lig and kerning
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ local value = features[f]
+ if value and fi.tfm[f] then -- brr
+ if tfm.trace_features then
+ logs.report("define font","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown')
+ end
+ fi.tfm[f](tfmdata,value)
+ mode = tfmdata.mode or fonts.mode
+ fi = fonts.initializers[mode]
+ end
+ end
+ end
+ end
+ initialize(fonts.triggers)
+ initialize(tfm.features.list)
+ initialize(fonts.manipulators)
+ end
+ local fm = fonts.methods[mode]
+ if fm and fm.tfm then
+ local function register(list) -- node manipulations
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ if features[f] and fm.tfm[f] then -- brr
+ if not shared.processors then -- maybe also predefine
+ shared.processors = { fm.tfm[f] }
+ else
+ shared.processors[#shared.processors+1] = fm.tfm[f]
+ end
+ end
+ end
+ end
+ end
+ register(tfm.features.list)
+ end
+ end
+end
+
+function tfm.features.register(name,default)
+ tfm.features.list[#tfm.features.list+1] = name
+ tfm.features.default[name] = default
+end
+
+function tfm.reencode(tfmdata,encoding)
+ if encoding and fonts.enc.known[encoding] then
+ local data = fonts.enc.load(encoding)
+ if data then
+ local characters, original, vector = tfmdata.characters, { }, data.vector
+ tfmdata.encoding = encoding -- not needed
+ for k, v in next, characters do
+ v.name, v.index, original[k] = vector[k], k, v
+ end
+ for k,v in next, data.unicodes do
+ if k ~= v then
+ if trace_defining then
+ logs.report("define font","reencoding U+%04X to U+%04X",k,v)
+ end
+ characters[k] = original[v]
+ end
+ end
+ end
+ end
+end
+
+tfm.features.register('reencode')
+
+fonts.initializers.base.tfm.reencode = tfm.reencode
+fonts.initializers.node.tfm.reencode = tfm.reencode
+
+fonts.enc = fonts.enc or { }
+fonts.enc.remappings = fonts.enc.remappings or { }
+
+function tfm.remap(tfmdata,remapping)
+ local vector = remapping and fonts.enc.remappings[remapping]
+ if vector then
+ local characters, original = tfmdata.characters, { }
+ for k, v in next, characters do
+ original[k], characters[k] = v, nil
+ end
+ for k,v in next, vector do
+ if k ~= v then
+ if trace_defining then
+ logs.report("define font","remapping U+%04X to U+%04X",k,v)
+ end
+ local c = original[k]
+ characters[v] = c
+ c.index = k
+ end
+ end
+ tfmdata.encodingbytes = 2
+ tfmdata.format = 'type1'
+ end
+end
+
+tfm.features.register('remap')
+
+fonts.initializers.base.tfm.remap = tfm.remap
+fonts.initializers.node.tfm.remap = tfm.remap
+
+--~ obsolete
+--~
+--~ function tfm.enhance(tfmdata,specification)
+--~ local name, size = specification.name, specification.size
+--~ local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.*
+--~ if filename and encoding and fonts.enc.known[encoding] then
+--~ local data = fonts.enc.load(encoding)
+--~ if data then
+--~ local characters = tfmdata.characters
+--~ tfmdata.encoding = encoding
+--~ local vector = data.vector
+--~ local original = { }
+--~ for k, v in next, characters do
+--~ v.name = vector[k]
+--~ v.index = k
+--~ original[k] = v
+--~ end
+--~ for k,v in next, data.unicodes do
+--~ if k ~= v then
+--~ if trace_defining then
+--~ logs.report("define font","mapping %s onto %s",k,v)
+--~ end
+--~ characters[k] = original[v]
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
diff --git a/tex/context/base/font-ext.lua b/tex/context/base/font-ext.lua
new file mode 100644
index 000000000..05bdaf2fc
--- /dev/null
+++ b/tex/context/base/font-ext.lua
@@ -0,0 +1,623 @@
+if not modules then modules = { } end modules ['font-ext'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv and hand-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local next, type, byte = next, type, string.byte
+local gmatch, concat = string.gmatch, table.concat
+local utfchar = utf.char
+
+local trace_protrusion = false trackers.register("fonts.protrusion", function(v) trace_protrusion = v end)
+local trace_expansion = false trackers.register("fonts.expansion", function(v) trace_expansion = v end)
+
+commands = commands or { }
+
+--[[ldx--
+<p>When we implement functions that deal with features, most of them
+will depend of the font format. Here we define the few that are kind
+of neutral.</p>
+--ldx]]--
+
+fonts.triggers = fonts.triggers or { }
+fonts.initializers = fonts.initializers or { }
+fonts.methods = fonts.methods or { }
+fonts.initializers.common = fonts.initializers.common or { }
+
+local initializers = fonts.initializers
+local methods = fonts.methods
+
+--[[ldx--
+<p>This feature will remove inter-digit kerns.</p>
+--ldx]]--
+
+table.insert(fonts.triggers,"equaldigits")
+
+function initializers.common.equaldigits(tfmdata,value)
+ if value then
+ local chr = tfmdata.characters
+ for i = utfbyte('0'), utfbyte('9') do
+ local c = chr[i]
+ if c then
+ c.kerns = nil
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>This feature will give all glyphs an equal height and/or depth. Valid
+values are <type>none</type>, <type>height</type>, <type>depth</type> and
+<type>both</type>.</p>
+--ldx]]--
+
+table.insert(fonts.triggers,"lineheight")
+
+function initializers.common.lineheight(tfmdata,value)
+ if value and type(value) == "string" then
+ if value == "none" then
+ for _,v in next, tfmdata.characters do
+ v.height, v.depth = 0, 0
+ end
+ else
+ local ascender, descender = tfmdata.ascender, tfmdata.descender
+ if ascender and descender then
+ local ht, dp = ascender or 0, descender or 0
+ if value == "height" then
+ dp = 0
+ elseif value == "depth" then
+ ht = 0
+ end
+ if ht > 0 then
+ if dp > 0 then
+ for _,v in next, tfmdata.characters do
+ v.height, v.depth = ht, dp
+ end
+ else
+ for _,v in next, tfmdata.characters do
+ v.height = ht
+ end
+ end
+ elseif dp > 0 then
+ for _,v in next, tfmdata.characters do
+ v.depth = dp
+ end
+ end
+ end
+ end
+ end
+end
+
+-- -- -- -- -- --
+-- shared
+-- -- -- -- -- --
+
+local function get_class_and_vector(tfmdata,value,where) -- "expansions"
+ local g_where = tfmdata.goodies and tfmdata.goodies[where]
+ local f_where = fonts[where]
+ local g_classes = g_where and g_where.classes
+ local class = g_where and g_where[value] or f_where.classes[value]
+ if class then
+ local class_vector = class.vector
+ local g_vectors = g_where and g_where.vectors
+ local vector = g_vectors and g_vectors[class_vector] or f_where.vectors[class_vector]
+ return class, vector
+ end
+end
+
+-- -- -- -- -- --
+-- expansion (hz)
+-- -- -- -- -- --
+
+fonts.expansions = fonts.expansions or { }
+fonts.expansions.classes = fonts.expansions.classes or { }
+fonts.expansions.vectors = fonts.expansions.vectors or { }
+
+local expansions = fonts.expansions
+local classes = fonts.expansions.classes
+local vectors = fonts.expansions.vectors
+
+-- beware, pdftex itself uses percentages * 10
+
+classes.preset = { stretch = 2, shrink = 2, step = .5, factor = 1 }
+
+function commands.setupfontexpansion(class,settings)
+ aux.getparameters(classes,class,'preset',settings)
+end
+
+classes['quality'] = {
+ stretch = 2, shrink = 2, step = .5, vector = 'default', factor = 1
+}
+
+vectors['default'] = {
+ [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
+ [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
+ [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
+ [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
+ [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
+ [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
+ [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
+ [byte('w')] = 0.7, [byte('z')] = 0.7,
+ [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
+}
+
+vectors['quality'] = vectors['default'] -- metatable ?
+
+--~ function table.locator(...)
+--~ local k = { ... }
+--~ return function(t)
+--~ for i=1,#k do
+--~ t = t[k[i]]
+--~ if not k then
+--~ return false
+--~ end
+--~ end
+--~ return t
+--~ end
+--~ end
+
+--~ local locate = table.locator { "goodies", "expansions" }
+
+function initializers.common.expansion(tfmdata,value)
+ if value then
+ local class, vector = get_class_and_vector(tfmdata,value,"expansions")
+ if class then
+ if vector then
+ local stretch, shrink, step, factor = class.stretch or 0, class.shrink or 0, class.step or 0, class.factor or 1
+ if trace_expansion then
+ logs.report("fonts","set expansion class %s, vector: %s, factor: %s, stretch: %s, shrink: %s, step: %s",value,class_vector,factor,stretch,shrink,step)
+ end
+ tfmdata.stretch, tfmdata.shrink, tfmdata.step, tfmdata.auto_expand = stretch * 10, shrink * 10, step * 10, true
+ local data = characters and characters.data
+ for i, chr in next, tfmdata.characters do
+ local v = vector[i]
+ if data and not v then -- we could move the data test outside (needed for plain)
+ local d = data[i]
+ if d then
+ local s = d.shcode
+ if not s then
+ -- sorry
+ elseif type(s) == "table" then
+ v = ((vector[s[1]] or 0) + (vector[s[#s]] or 0)) / 2
+ else
+ v = vector[s] or 0
+ end
+ end
+ end
+ if v and v ~= 0 then
+ chr.expansion_factor = v*factor
+ else -- can be option
+ chr.expansion_factor = factor
+ end
+ end
+ elseif trace_expansion then
+ logs.report("fonts","unknown expansion vector '%s' in class '%s",class_vector,value)
+ end
+ elseif trace_expansion then
+ logs.report("fonts","unknown expansion class '%s'",value)
+ end
+ end
+end
+
+table.insert(fonts.manipulators,"expansion")
+
+initializers.base.otf.expansion = initializers.common.expansion
+initializers.node.otf.expansion = initializers.common.expansion
+
+initializers.base.afm.expansion = initializers.common.expansion
+initializers.node.afm.expansion = initializers.common.expansion
+
+fonts.goodies.register("expansions", function(...) return fonts.goodies.report("expansions", trace_expansion, ...) end)
+
+-- -- -- -- -- --
+-- protrusion
+-- -- -- -- -- --
+
+fonts.protrusions = fonts.protrusions or { }
+fonts.protrusions.classes = fonts.protrusions.classes or { }
+fonts.protrusions.vectors = fonts.protrusions.vectors or { }
+
+local protrusions = fonts.protrusions
+local classes = fonts.protrusions.classes
+local vectors = fonts.protrusions.vectors
+
+-- the values need to be revisioned
+
+classes.preset = { factor = 1, left = 1, right = 1 }
+
+function commands.setupfontprotrusion(class,settings)
+ aux.getparameters(classes,class,'preset',settings)
+end
+
+classes['pure'] = {
+ vector = 'pure', factor = 1
+}
+classes['punctuation'] = {
+ vector = 'punctuation', factor = 1
+}
+classes['alpha'] = {
+ vector = 'alpha', factor = 1
+}
+classes['quality'] = {
+ vector = 'quality', factor = 1
+}
+
+vectors['pure'] = {
+
+ [0x002C] = { 0, 1 }, -- comma
+ [0x002E] = { 0, 1 }, -- period
+ [0x003A] = { 0, 1 }, -- colon
+ [0x003B] = { 0, 1 }, -- semicolon
+ [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 。
+ [0x060C] = { 0, 1 }, -- arabic comma ،
+ [0x061B] = { 0, 1 }, -- arabic semicolon ؛
+ [0x06D4] = { 0, 1 }, -- arabic full stop ۔
+
+}
+
+vectors['punctuation'] = {
+
+ [0x003F] = { 0, 0.20 }, -- ?
+ [0x00BF] = { 0, 0.20 }, -- ¿
+ [0x0021] = { 0, 0.20 }, -- !
+ [0x00A1] = { 0, 0.20 }, -- ¡
+ [0x0028] = { 0.05, 0 }, -- (
+ [0x0029] = { 0, 0.05 }, -- )
+ [0x005B] = { 0.05, 0 }, -- [
+ [0x005D] = { 0, 0.05 }, -- ]
+ [0x002C] = { 0, 0.70 }, -- comma
+ [0x002E] = { 0, 0.70 }, -- period
+ [0x003A] = { 0, 0.50 }, -- colon
+ [0x003B] = { 0, 0.50 }, -- semicolon
+ [0x002D] = { 0, 0.70 }, -- hyphen
+ [0x2013] = { 0, 0.30 }, -- endash
+ [0x2014] = { 0, 0.20 }, -- emdash
+ [0x060C] = { 0, 0.70 }, -- arabic comma
+ [0x061B] = { 0, 0.50 }, -- arabic semicolon
+ [0x06D4] = { 0, 0.70 }, -- arabic full stop
+ [0x061F] = { 0, 0.20 }, -- ؟
+
+ -- 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 ‟
+
+}
+
+vectors['alpha'] = {
+
+ [byte("A")] = { .05, .05 },
+ [byte("F")] = { 0, .05 },
+ [byte("J")] = { .05, 0 },
+ [byte("K")] = { 0, .05 },
+ [byte("L")] = { 0, .05 },
+ [byte("T")] = { .05, .05 },
+ [byte("V")] = { .05, .05 },
+ [byte("W")] = { .05, .05 },
+ [byte("X")] = { .05, .05 },
+ [byte("Y")] = { .05, .05 },
+
+ [byte("k")] = { 0, .05 },
+ [byte("r")] = { 0, .05 },
+ [byte("t")] = { 0, .05 },
+ [byte("v")] = { .05, .05 },
+ [byte("w")] = { .05, .05 },
+ [byte("x")] = { .05, .05 },
+ [byte("y")] = { .05, .05 },
+
+}
+
+vectors['quality'] = table.merge( {},
+ vectors['punctuation'],
+ vectors['alpha']
+)
+
+-- As this is experimental code, users should not depend on it. The
+-- implications are still discussed on the ConTeXt Dev List and we're
+-- not sure yet what exactly the spec is (the next code is tested with
+-- a gyre font patched by / fea file made by Khaled Hosny). The double
+-- trick should not be needed it proper hanging punctuation is used in
+-- which case values < 1 can be used.
+--
+-- preferred (in context, usine vectors):
+--
+-- \definefontfeature[whatever][default][mode=node,protrusion=quality]
+--
+-- using lfbd and rtbd, with possibibility to enable only one side :
+--
+-- \definefontfeature[whocares][default][mode=node,protrusion=yes, opbd=yes,script=latn]
+-- \definefontfeature[whocares][default][mode=node,protrusion=right,opbd=yes,script=latn]
+--
+-- idem, using multiplier
+--
+-- \definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn]
+-- \definefontfeature[whocares][default][mode=node,protrusion=double,opbd=yes,script=latn]
+--
+-- idem, using named feature file (less frozen):
+--
+-- \definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn,featurefile=texgyrepagella-regularxx.fea]
+
+classes['double'] = { -- for testing opbd
+ factor = 2, left = 1, right = 1,
+}
+
+local function map_opbd_onto_protrusion(tfmdata,value,opbd)
+ local characters, descriptions = tfmdata.characters, tfmdata.descriptions
+ local otfdata = tfmdata.shared.otfdata
+ local singles = otfdata.shared.featuredata.gpos_single
+ local script, language = tfmdata.script, tfmdata.language
+ local done, factor, left, right = false, 1, 1, 1
+ local class = classes[value]
+ if class then
+ factor = class.factor or 1
+ left = class.left or 1
+ right = class.right or 1
+ else
+ factor = tonumber(value) or 1
+ end
+ if opbd ~= "right" then
+ local validlookups, lookuplist = fonts.otf.collect_lookups(otfdata,"lfbd",script,language)
+ if validlookups then
+ for i=1,#lookuplist do
+ local lookup = lookuplist[i]
+ local data = singles[lookup]
+ if data then
+ if trace_protrusion then
+ logs.report("fonts","set left protrusion using lfbd lookup '%s'",lookup)
+ end
+ for k, v in next, data do
+ -- local p = - v[3] / descriptions[k].width-- or 1 ~= 0 too but the same
+ local p = - (v[1] / 1000) * factor * left
+ characters[k].left_protruding = p
+ if trace_protrusion then
+ logs.report("opbd","lfbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
+ end
+ end
+ done = true
+ end
+ end
+ end
+ end
+ if opbd ~= "left" then
+ local validlookups, lookuplist = fonts.otf.collect_lookups(otfdata,"rtbd",script,language)
+ if validlookups then
+ for i=1,#lookuplist do
+ local lookup = lookuplist[i]
+ local data = singles[lookup]
+ if data then
+ if trace_protrusion then
+ logs.report("fonts","set right protrusion using rtbd lookup '%s'",lookup)
+ end
+ for k, v in next, data do
+ -- local p = v[3] / descriptions[k].width -- or 3
+ local p = (v[1] / 1000) * factor * right
+ characters[k].right_protruding = p
+ if trace_protrusion then
+ logs.report("opbd","rtbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
+ end
+ end
+ end
+ done = true
+ end
+ end
+ end
+ tfmdata.auto_protrude = done
+end
+
+-- The opbd test is just there because it was discussed on the
+-- context development list. However, the mentioned fxlbi.otf font
+-- only has some kerns for digits. So, consider this feature not
+-- supported till we have a proper test font.
+
+function initializers.common.protrusion(tfmdata,value)
+ if value then
+ local opbd = tfmdata.shared.features.opbd
+ if opbd then
+ -- possible values: left right both yes no (experimental)
+ map_opbd_onto_protrusion(tfmdata,value,opbd)
+ else
+ local class, vector = get_class_and_vector(tfmdata,value,"protrusions")
+ if class then
+ if vector then
+ local factor = class.factor or 1
+ local left = class.left or 1
+ local right = class.right or 1
+ if trace_protrusion then
+ logs.report("fonts","set protrusion class %s, vector: %s, factor: %s, left: %s, right: %s",value,class_vector,factor,left,right)
+ end
+ local data = characters.data
+ local emwidth = tfmdata.parameters.quad
+ tfmdata.auto_protrude = true
+ for i, chr in next, tfmdata.characters do
+ local v, pl, pr = vector[i], nil, nil
+ if v then
+ pl, pr = v[1], v[2]
+ else
+ local d = data[i]
+ if d then
+ local s = d.shcode
+ if not s then
+ -- sorry
+ elseif type(s) == "table" then
+ local vl, vr = vector[s[1]], vector[s[#s]]
+ if vl then pl = vl[1] end
+ if vr then pr = vr[2] end
+ else
+ v = vector[s]
+ if v then
+ pl, pr = v[1], v[2]
+ end
+ end
+ end
+ end
+ if pl and pl ~= 0 then
+ chr.left_protruding = left *pl*factor
+ end
+ if pr and pr ~= 0 then
+ chr.right_protruding = right*pr*factor
+ end
+ end
+ elseif trace_protrusion then
+ logs.report("fonts","unknown protrusion vector '%s' in class '%s",class_vector,value)
+ end
+ elseif trace_protrusion then
+ logs.report("fonts","unknown protrusion class '%s'",value)
+ end
+ end
+ end
+end
+
+table.insert(fonts.manipulators,"protrusion")
+
+initializers.base.otf.protrusion = initializers.common.protrusion
+initializers.node.otf.protrusion = initializers.common.protrusion
+
+initializers.base.afm.protrusion = initializers.common.protrusion
+initializers.node.afm.protrusion = initializers.common.protrusion
+
+fonts.goodies.register("protrusions", function(...) return fonts.goodies.report("protrusions", trace_protrusion, ...) end)
+
+-- -- --
+
+function initializers.common.nostackmath(tfmdata,value)
+ tfmdata.ignore_stack_math = value
+end
+
+table.insert(fonts.manipulators,"nostackmath")
+
+initializers.base.otf.nostackmath = initializers.common.nostackmath
+initializers.node.otf.nostackmath = initializers.common.nostackmath
+
+table.insert(fonts.triggers,"itlc")
+
+function initializers.common.itlc(tfmdata,value)
+ if value then
+ -- the magic 40 and it formula come from Dohyun Kim
+ local fontdata = tfmdata.shared.otfdata or tfmdata.shared.afmdata
+ local metadata = fontdata and fontdata.metadata
+ if metadata then
+ local italicangle = metadata.italicangle
+ if italicangle and italicangle ~= 0 then
+ local uwidth = (metadata.uwidth or 40)/2
+ for unicode, d in next, tfmdata.descriptions do
+ local it = d.boundingbox[3] - d.width + uwidth
+ if it ~= 0 then
+ d.italic = it
+ end
+ end
+ tfmdata.has_italic = true
+ end
+ end
+ end
+end
+
+initializers.base.otf.itlc = initializers.common.itlc
+initializers.node.otf.itlc = initializers.common.itlc
+
+initializers.base.afm.itlc = initializers.common.itlc
+initializers.node.afm.itlc = initializers.common.itlc
+
+-- slanting
+
+table.insert(fonts.triggers,"slant")
+
+function initializers.common.slant(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 1 then
+ value = 1
+ elseif value < -1 then
+ value = -1
+ end
+ tfmdata.slant_factor = value
+end
+
+initializers.base.otf.slant = initializers.common.slant
+initializers.node.otf.slant = initializers.common.slant
+
+initializers.base.afm.slant = initializers.common.slant
+initializers.node.afm.slant = initializers.common.slant
+
+table.insert(fonts.triggers,"extend")
+
+function initializers.common.extend(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 10 then
+ value = 10
+ elseif value < -10 then
+ value = -10
+ end
+ tfmdata.extend_factor = value
+end
+
+initializers.base.otf.extend = initializers.common.extend
+initializers.node.otf.extend = initializers.common.extend
+
+initializers.base.afm.extend = initializers.common.extend
+initializers.node.afm.extend = initializers.common.extend
+
+-- historic stuff, move from font-ota
+
+local delete_node = nodes.delete
+local glyph = node.id("glyph")
+local fontdata = fonts.ids
+
+fonts.strippables = fonts.strippables or { -- just a placeholder
+ [0x200C] = true, -- zwnj
+ [0x200D] = true, -- zwj
+}
+
+local strippables = fonts.strippables
+
+local function processformatters(head,font)
+ local how = fontdata[font].shared.features.formatters
+ if how == nil or how == "strip" then -- nil when forced
+ local current, done = head, false
+ while current do
+ if current.id == glyph and current.subtype<256 and current.font == font then
+ local char = current.char
+ if strippables[char] then
+ head, current = delete_node(head,current)
+ done = true
+ else
+ current = current.next
+ end
+ else
+ current = current.next
+ end
+ end
+ return head, done
+ else
+ return head, false
+ end
+end
+
+methods.node.otf.formatters = processformatters
+methods.base.otf.formatters = processformatters
+
+fonts.otf.tables.features['formatters'] = 'Hide Formatting Characters'
+
+fonts.otf.features.register("formatters")
+
+table.insert(fonts.manipulators,"formatters") -- at end
diff --git a/tex/context/base/font-fbk.lua b/tex/context/base/font-fbk.lua
new file mode 100644
index 000000000..1ad1cc781
--- /dev/null
+++ b/tex/context/base/font-fbk.lua
@@ -0,0 +1,316 @@
+if not modules then modules = { } end modules ['font-fbk'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local cos, tan, rad, format = math.cos, math.tan, math.rad, string.format
+
+local trace_combining = false trackers.register("fonts.combining", function(v) trace_combining = v end)
+
+--[[ldx--
+<p>This is very experimental code!</p>
+--ldx]]--
+
+fonts.fallbacks = fonts.fallbacks or { }
+
+local vf = fonts.vf
+local tfm = fonts.tfm
+
+vf.aux.combine.commands["enable-tracing"] = function(g,v)
+ trace_combining = true
+end
+
+vf.aux.combine.commands["disable-tracing"] = function(g,v)
+ trace_combining = false
+end
+
+vf.aux.combine.commands["set-tracing"] = function(g,v)
+ if v[2] == nil then
+ trace_combining = true
+ else
+ trace_combining = v[2]
+ end
+end
+
+function vf.aux.combine.initialize_trace()
+ if trace_combining then
+ return "special", "pdf: .8 0 0 rg .8 0 0 RG", "pdf: 0 .8 0 rg 0 .8 0 RG", "pdf: 0 0 .8 rg 0 0 .8 RG", "pdf: 0 g 0 G"
+ else
+ return "comment", "", "", "", ""
+ end
+end
+
+vf.aux.combine.force_fallback = false
+
+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], g.descriptions[index] = fonts.fallbacks[fallback](g)
+ end
+ end
+end
+
+fonts.fallbacks['textcent'] = function (g)
+ local c = ("c"):byte()
+ local t = table.fastcopy(g.characters[c])
+ local a = - tan(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*quad},
+ {special, black},
+ }
+ else
+ t.commands = {
+ {"push"},
+ {"right", .5*t.width-.025*quad},
+ {"down", .2*t.height},
+ {"special",format("pdf: q 1 0 %s 1 0 0 cm",a)},
+ {special, green},
+ {"rule", 1.4*t.height, .025*quad},
+ {special, black},
+ {"special","pdf: Q"},
+ {"pop"},
+ {"slot", 1, c} -- last else problems with cm
+ }
+ end
+ -- somehow the width is messed up now
+ -- todo: set height
+ t.height = 1.2*t.height
+ t.depth = 0.2*t.height
+ g.virtualized = true
+ local d = g.descriptions
+ return t, d and d[c]
+end
+
+fonts.fallbacks['texteuro'] = function (g)
+ local c = ("C"):byte()
+ local t = table.fastcopy(g.characters[c])
+ local d = cos(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},
+ {"push"}, {"slot", 1, c}, {"pop"},
+ {"right", .5*t.width*d},
+ {"down", -.5*t.height},
+ {special, green},
+ {"rule", .05*quad, .4*quad},
+ {special, black},
+ }
+ g.virtualized = true
+ return t, g.descriptions[c]
+end
+
+-- maybe store llx etc instead of bbox in tfm blob / more efficient
+
+vf.aux.combine.force_composed = false
+
+local push, pop = { "push" }, { "pop" }
+
+local cache = { } -- we could make these weak
+
+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, 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 = cos(rad(90+(g.italicangle or 0)))
+ local force = vf.aux.combine.force_composed
+ local fallbacks = characters.fallbacks
+ local special, red, green, blue, black
+ if trace_combining then
+ special, red, green, blue, black = vf.aux.combine.initialize_trace()
+ red, green, blue, black = { special, red }, { special, green }, { special, blue }, { special, black }
+ end
+ local done = false
+ for i,c in next, characters.data do
+ if force or not chars[i] then
+ local s = c.specials
+ if s and s[1] == 'char' then
+ local chr = s[2]
+ local charschr = chars[chr]
+ if charschr then
+ local cc = c.category
+ if cc == 'll' or cc == 'lu' or cc == 'lt' then
+ local acc = s[3]
+ local t = { }
+ for k, v in next, charschr do
+ if k ~= "commands" then
+ t[k] = v
+ end
+ end
+ local charsacc = chars[acc]
+--~ local ca = charsacc.category
+--~ if ca == "mn" then
+--~ -- mark nonspacing
+--~ elseif ca == "ms" then
+--~ -- mark spacing combining
+--~ elseif ca == "me" then
+--~ -- mark enclosing
+--~ else
+ if not charsacc then
+ acc = fallbacks[acc]
+ charsacc = acc and chars[acc]
+ end
+ if charsacc then
+ local chr_t = cache[chr]
+ if not cht_t then
+ chr_t = {"slot", 1, chr}
+ cache[chr] = chr_t
+ end
+ local acc_t = cache[acc]
+ if not acc_t then
+ acc_t = {"slot", 1, acc}
+ cache[acc] = acc_t
+ end
+ local cb = descs[chr].boundingbox
+ local ab = descs[acc].boundingbox
+ if cb and ab then
+ -- 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
+ if a_ury < 0 then
+ if trace_combining then
+ t.commands = {
+ push,
+ {"right", dx-dd},
+ red,
+ acc_t,
+ black,
+ pop,
+ chr_t,
+ }
+ else
+ t.commands = {
+ push,
+ {"right", dx-dd},
+ acc_t,
+ pop,
+ chr_t,
+ }
+ end
+ elseif c_ury > a_lly then
+ local dy = cap_lly-a_lly
+ if trace_combining then
+ t.commands = {
+ push,
+ {"right", dx+dd},
+ {"down", -dy},
+ green,
+ acc_t,
+ black,
+ pop,
+ chr_t,
+ }
+ else
+ t.commands = {
+ push,
+ {"right", dx+dd},
+ {"down", -dy},
+ acc_t,
+ pop,
+ chr_t,
+ }
+ end
+ else
+ if trace_combining then
+ t.commands = {
+ {"push"},
+ {"right", dx+dd},
+ blue,
+ acc_t,
+ black,
+ {"pop"},
+ chr_t,
+ }
+ else
+ t.commands = {
+ {"push"},
+ {"right", dx+dd},
+ acc_t,
+ {"pop"},
+ chr_t,
+ }
+ end
+ end
+ done = true
+ end
+ end
+ chars[i] = t
+ local d = { }
+ for k, v in next, descs[chr] do
+ d[k] = v
+ end
+ d.name = c.adobename or "unknown"
+ -- d.unicode = i
+ descs[i] = d
+ end
+ end
+ end
+ end
+ end
+ if done then
+ g.virtualized = true
+ end
+ end
+end
+
+vf.aux.combine.commands["complete-composed-characters"] = function(g,v)
+ vf.aux.compose_characters(g)
+end
+
+--~ {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'},
+--~ {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'},
+--~ -- {'special', 'pdf: /Fm\XX\space Do'},
+--~ {'special', 'pdf: Q'},
+--~ {'special', 'pdf: Q'},
+
+-- for documentation purposes we provide:
+
+fonts.define.methods.install("fallback", { -- todo: auto-fallback with loop over data.characters
+ { "fake-character", 0x00A2, 'textcent' },
+ { "fake-character", 0x20AC, 'texteuro' }
+})
+
+vf.aux.combine.commands["enable-force"] = function(g,v)
+ vf.aux.combine.force_composed = true
+ vf.aux.combine.force_fallback = true
+end
+vf.aux.combine.commands["disable-force"] = function(g,v)
+ vf.aux.combine.force_composed = false
+ vf.aux.combine.force_fallback = false
+end
+
+fonts.define.methods.install("demo-2", {
+ { "enable-tracing" },
+ { "enable-force" },
+ { "initialize" },
+ { "include-method", "fallback" },
+ { "complete-composed-characters" },
+ { "disable-tracing" },
+ { "disable-force" },
+})
+
+fonts.define.methods.install("demo-3", {
+ { "enable-tracing" },
+ { "initialize" },
+ { "complete-composed-characters" },
+ { "disable-tracing" },
+})
diff --git a/tex/context/base/font-gds.lua b/tex/context/base/font-gds.lua
new file mode 100644
index 000000000..e3db8c816
--- /dev/null
+++ b/tex/context/base/font-gds.lua
@@ -0,0 +1,294 @@
+if not modules then modules = { } end modules ['font-gds'] = {
+ version = 1.000,
+ comment = "companion to font-gds.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type, next = type, next
+local gmatch = string.gmatch
+
+local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end)
+
+-- goodies=name,colorscheme=,featureset=
+--
+-- goodies=auto
+
+-- goodies
+
+fonts.goodies = fonts.goodies or { }
+fonts.goodies.data = fonts.goodies.data or { }
+fonts.goodies.list = fonts.goodies.list or { }
+
+local data = fonts.goodies.data
+local list = fonts.goodies.list
+
+function fonts.goodies.report(what,trace,goodies)
+ if trace_goodies or trace then
+ local whatever = goodies[what]
+ if whatever then
+ logs.report("fonts", "goodie '%s' found in '%s'",what,goodies.name)
+ end
+ end
+end
+
+local function getgoodies(filename) -- maybe a merge is better
+ local goodies = data[filename] -- we assume no suffix is given
+ if goodies ~= nil then
+ -- found or tagged unfound
+ elseif type(filename) == "string" then
+ local fullname = resolvers.find_file(file.addsuffix(filename,"lfg")) or "" -- prefered suffix
+ if fullname == "" then
+ fullname = resolvers.find_file(file.addsuffix(filename,"lua")) or "" -- fallback suffix
+ end
+ if fullname == "" then
+ logs.report("fonts", "goodie file '%s.lfg' is not found",filename)
+ data[filename] = false -- signal for not found
+ else
+ goodies = dofile(fullname) or false
+ if not goodies then
+ logs.report("fonts", "goodie file '%s' is invalid",fullname)
+ return nil
+ elseif trace_goodies then
+ logs.report("fonts", "goodie file '%s' is loaded",fullname)
+ end
+ goodies.name = goodies.name or "no name"
+ for name, fnc in next, list do
+ fnc(goodies)
+ end
+ goodies.initialized = true
+ data[filename] = goodies
+ end
+ end
+ return goodies
+end
+
+function fonts.goodies.register(name,fnc)
+ list[name] = fnc
+end
+
+fonts.goodies.get = getgoodies
+
+-- register goodies file
+
+local preset_context = fonts.define.specify.preset_context
+
+function fonts.initializers.common.goodies(tfmdata,value)
+ local goodies = tfmdata.goodies or { } -- future versions might store goodies in the cached instance
+ for filename in gmatch(value,"[^, ]+") do
+ -- we need to check for duplicates
+ local ok = getgoodies(filename)
+ if ok then
+ goodies[#goodies+1] = ok
+ end
+ end
+ tfmdata.goodies = goodies -- shared ?
+end
+
+-- featuresets
+
+local function flattened(t,tt)
+ -- first set value dominates
+ local tt = tt or { }
+ for i=1,#t do
+ local ti = t[i]
+ if type(ti) == "table" then
+ flattened(ti,tt)
+ elseif tt[ti] == nil then
+ tt[ti] = true
+ end
+ end
+ for k, v in next, t do
+ if type(k) ~= "number" then
+ if type(v) == "table" then
+ flattened(v,tt)
+ elseif tt[k] == nil then
+ tt[k] = v
+ end
+ end
+ end
+ return tt
+end
+
+fonts.flattened_features = flattened
+
+function fonts.goodies.prepare_features(goodies,name,set)
+ if set then
+ local ff = fonts.flattened_features(set)
+ local fullname = goodies.name .. "::" .. name
+ local n, s = preset_context(fullname,"",ff)
+ goodies.featuresets[name] = s -- set
+ if trace_goodies then
+ logs.report("fonts", "feature set '%s' gets number %s and name '%s'",name,n,fullname)
+ end
+ return n
+ end
+end
+
+local function initialize(goodies,tfmdata)
+ local featuresets = goodies.featuresets
+ local goodiesname = goodies.name
+ if featuresets then
+ if trace_goodies then
+ logs.report("fonts", "checking featuresets in '%s'",goodies.name)
+ end
+ for name, set in next, featuresets do
+ fonts.goodies.prepare_features(goodies,name,set)
+ end
+ end
+end
+
+fonts.goodies.register("featureset",initialize)
+
+function fonts.initializers.common.featureset(tfmdata,set)
+ local goodies = tfmdata.goodies -- shared ?
+ if goodies then
+ local features = tfmdata.shared.features
+ local what
+ for i=1,#goodies do
+ -- last one counts
+ local g = goodies[i]
+ what = (g.featuresets and g.featuresets[set]) or what
+ end
+ if what then
+ for feature, value in next, what do
+ if features[feature] == nil then
+ features[feature] = value
+ end
+ end
+ tfmdata.mode = features.mode or tfmdata.mode
+ end
+ end
+end
+
+-- colorschemes
+
+fonts.goodies.colorschemes = fonts.goodies.colorschemes or { }
+fonts.goodies.colorschemes.data = fonts.goodies.colorschemes.data or { }
+
+local colorschemes = fonts.goodies.colorschemes
+
+function fonts.initializers.common.colorscheme(tfmdata,scheme)
+ if type(scheme) == "string" then
+ local goodies = tfmdata.goodies
+ -- todo : check for already defined in shared
+ if goodies then
+ local what
+ for i=1,#goodies do
+ -- last one counts
+ local g = goodies[i]
+ what = (g.colorschemes and g.colorschemes[scheme]) or what
+ end
+ if what then
+ -- this is font bound but we can share them if needed
+ -- just as we could hash the conversions (per font)
+ local hash, reverse = tfmdata.luatex.unicodes, { }
+ for i=1,#what do
+ local w = what[i]
+ for j=1,#w do
+ local name = w[j]
+ local unicode = hash[name]
+ if unicode then
+ reverse[unicode] = i
+ end
+ end
+ end
+ tfmdata.colorscheme = reverse
+ return
+ end
+ end
+ end
+ tfmdata.colorscheme = false
+end
+
+local fontdata = fonts.ids
+local fcs = fonts.color.set
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local a_colorscheme = attributes.private('colorscheme')
+local glyph = node.id("glyph")
+
+function fonts.goodies.colorschemes.coloring(head)
+ local lastfont, lastscheme
+ for n in traverse_id(glyph,head) do
+ local a = has_attribute(n,a_colorscheme)
+ if a then
+ local f = n.font
+ if f ~= lastfont then
+ lastscheme, lastfont = fontdata[f].colorscheme, f
+ end
+ if lastscheme then
+ local sc = lastscheme[n.char]
+ if sc then
+ fcs(n,"colorscheme:"..a..":"..sc) -- slow
+ end
+ end
+ end
+ end
+end
+
+function fonts.goodies.colorschemes.enable()
+ tasks.appendaction("processors","fonts","fonts.goodies.colorschemes.coloring")
+ function fonts.goodies.colorschemes.enable() end
+end
+
+-- installation (collected to keep the overview)
+
+fonts.otf.tables.features['goodies'] = 'Goodies on top of built in features'
+fonts.otf.tables.features['featurset'] = 'Goodie Feature Set'
+fonts.otf.tables.features['colorscheme'] = 'Goodie Color Scheme'
+
+fonts.otf.features.register('goodies')
+fonts.otf.features.register('featureset')
+fonts.otf.features.register('colorscheme')
+
+table.insert(fonts.triggers, 1, "goodies")
+table.insert(fonts.triggers, 2, "featureset") -- insert after
+table.insert(fonts.triggers, "colorscheme")
+
+fonts.initializers.base.otf.goodies = fonts.initializers.common.goodies
+fonts.initializers.node.otf.goodies = fonts.initializers.common.goodies
+
+fonts.initializers.base.otf.featureset = fonts.initializers.common.featureset
+fonts.initializers.node.otf.featureset = fonts.initializers.common.featureset
+
+fonts.initializers.base.otf.colorscheme = fonts.initializers.common.colorscheme
+fonts.initializers.node.otf.colorscheme = fonts.initializers.common.colorscheme
+
+-- experiment, we have to load the definitions immediately as they precede
+-- the definition so they need to be initialized in the typescript
+
+local function initialize(goodies)
+ local mathgoodies = goodies.mathematics
+ local virtuals = mathgoodies and mathgoodies.virtuals
+ local mapfiles = mathgoodies and mathgoodies.mapfiles
+ local maplines = mathgoodies and mathgoodies.maplines
+ if virtuals then
+ for name, specification in next, virtuals do
+ mathematics.make_font(name,specification)
+ end
+ end
+ if mapfiles then
+ for i=1,#mapfiles do
+ fonts.map.loadfile(mapfiles[i]) -- todo: backend function
+ end
+ end
+ if maplines then
+ for i=1,#maplines do
+ fonts.map.loadline(maplines[i]) -- todo: backend function
+ end
+ end
+end
+
+fonts.goodies.register("mathematics", initialize)
+
+-- The following file (husayni.lfg) is the experimental setup that we used
+-- for Idris font. For the moment we don't store this in the cache and quite
+-- probably these files sit in one of the paths:
+--
+-- tex/context/fonts/goodies
+-- tex/fonts/goodies/context
+-- tex/fonts/data/foundry/collection
+--
+-- see lfg files in distribution
diff --git a/tex/context/base/font-gds.mkiv b/tex/context/base/font-gds.mkiv
new file mode 100644
index 000000000..e36116283
--- /dev/null
+++ b/tex/context/base/font-gds.mkiv
@@ -0,0 +1,83 @@
+%D \module
+%D [ file=font-gds,
+%D version=2009.10.14,
+%D title=\CONTEXT\ Font Support,
+%D subtitle=Colorschemes,
+%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}{ConTeXt Font Support / Colorschemes}
+
+% \registerctxluafile{font-gds}{1.001}
+
+\unprotect
+
+\def\loadfontgoodies[#1]%
+ {\ctxlua{fonts.goodies.get("#1")}}
+
+
+% this will become colorgroups and move to font-col or so
+
+\definecolor[colorscheme:1:1][s=.75]
+\definecolor[colorscheme:1:2][r=.75]
+\definecolor[colorscheme:1:3][g=.75]
+\definecolor[colorscheme:1:4][b=.75]
+\definecolor[colorscheme:1:5][c=.75]
+\definecolor[colorscheme:1:6][m=.75]
+\definecolor[colorscheme:1:7][y=.75]
+
+\definecolor[colorscheme:2:7][s=.75]
+\definecolor[colorscheme:2:6][r=.75]
+\definecolor[colorscheme:2:5][g=.75]
+\definecolor[colorscheme:2:4][b=.75]
+\definecolor[colorscheme:2:3][c=.75]
+\definecolor[colorscheme:2:2][m=.75]
+\definecolor[colorscheme:2:1][y=.75]
+
+\definesystemattribute[colorscheme] \chardef\colorschemeattribute \dogetattributeid{colorscheme}
+
+\def\setfontcolorscheme
+ {\ctxlua{fonts.goodies.colorschemes.enable()}%
+ \xdef\setfontcolorscheme[##1]{\attribute\colorschemeattribute##1\relax}%
+ \setfontcolorscheme}
+
+\edef\resetfontcolorscheme{\attribute\colorschemeattribute\attributeunsetvalue}
+
+\protect \endinput
+
+% \definefontfeature[husayni-colored][goodies=husayni,colorscheme=default,featureset=default]
+%
+% \definedfont[husayni*husayni-colored at 36pt]
+%
+% \starttext \pardir TRT \textdir TRT
+%
+% \setfontcolorscheme[1]
+%
+% اَلْحَمْ‍دُ لِلّٰهِ حَمْدَ مُعْتَرِفٍ بِحَمْدِهٖ، مُغْتَرِفٌ مِنْ بِحَارِ
+% مَجْدِهٖ، بِلِسَانِ ٱلثَّنَاۤءِ شَاكِرًا، وَلِحُسْنِ اٰلاۤئِهٖ نَاشِرًا؛
+% اَلَّذِيْ خَلَقَ ٱلْمَوْتَ وَٱلْحَيٰوةَ، وَٱلْخَيْرَ وَٱلشَّرَّ،
+% وَٱلنَّفْعَ وَٱلضَّرَّ، وَٱلسُّكُوْنَ وَٱلْحَرَكَةَ، وَٱلْأَرْوَاحَ
+% وَٱلْأَجْسَامَ، وَٱلذِّكْرَ وَٱلنِّسْيَانَ.
+%
+% \setfontcolorscheme[2]
+%
+% اَلْحَمْ‍دُ لِلّٰهِ حَمْدَ مُعْتَرِفٍ بِحَمْدِهٖ، مُغْتَرِفٌ مِنْ بِحَارِ
+% مَجْدِهٖ، بِلِسَانِ ٱلثَّنَاۤءِ شَاكِرًا، وَلِحُسْنِ اٰلاۤئِهٖ نَاشِرًا؛
+% اَلَّذِيْ خَلَقَ ٱلْمَوْتَ وَٱلْحَيٰوةَ، وَٱلْخَيْرَ وَٱلشَّرَّ،
+% وَٱلنَّفْعَ وَٱلضَّرَّ، وَٱلسُّكُوْنَ وَٱلْحَرَكَةَ، وَٱلْأَرْوَاحَ
+% وَٱلْأَجْسَامَ، وَٱلذِّكْرَ وَٱلنِّسْيَانَ.
+%
+% \resetfontcolorscheme
+%
+% اَلْحَمْ‍دُ لِلّٰهِ حَمْدَ مُعْتَرِفٍ بِحَمْدِهٖ، مُغْتَرِفٌ مِنْ بِحَارِ
+% مَجْدِهٖ، بِلِسَانِ ٱلثَّنَاۤءِ شَاكِرًا، وَلِحُسْنِ اٰلاۤئِهٖ نَاشِرًا؛
+% اَلَّذِيْ خَلَقَ ٱلْمَوْتَ وَٱلْحَيٰوةَ، وَٱلْخَيْرَ وَٱلشَّرَّ،
+% وَٱلنَّفْعَ وَٱلضَّرَّ، وَٱلسُّكُوْنَ وَٱلْحَرَكَةَ، وَٱلْأَرْوَاحَ
+% وَٱلْأَجْسَامَ، وَٱلذِّكْرَ وَٱلنِّسْيَانَ.
+%
+% \stoptext
diff --git a/tex/context/base/font-heb.mkii b/tex/context/base/font-heb.mkii
new file mode 100644
index 000000000..3ec0395f3
--- /dev/null
+++ b/tex/context/base/font-heb.mkii
@@ -0,0 +1,5 @@
+\unprotected \writestatus\m!systems{load ARABTEX as a module instead}
+
+\usemodule[arabtex]
+
+\endinput
diff --git a/tex/context/base/font-ini.lua b/tex/context/base/font-ini.lua
new file mode 100644
index 000000000..e45149781
--- /dev/null
+++ b/tex/context/base/font-ini.lua
@@ -0,0 +1,95 @@
+if not modules then modules = { } end modules ['font-ini'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Not much is happening here.</p>
+--ldx]]--
+
+local utf = unicode.utf8
+local format, serialize = string.format, table.serialize
+local write_nl = texio.write_nl
+
+if not fontloader then fontloader = fontforge end
+
+fontloader.totable = fontloader.to_table
+
+-- vtf comes first
+-- fix comes last
+
+fonts = fonts or { }
+
+fonts.ids = fonts.ids or { } fonts.identifiers = fonts.ids -- aka fontdata
+fonts.chr = fonts.chr or { } fonts.characters = fonts.chr -- aka chardata
+fonts.qua = fonts.qua or { } fonts.quads = fonts.qua -- aka quaddata
+
+fonts.tfm = fonts.tfm or { }
+
+fonts.mode = 'base'
+fonts.private = 0xF0000 -- 0x10FFFF
+fonts.verbose = false -- more verbose cache tables
+
+fonts.ids[0] = { -- nullfont
+ characters = { },
+ descriptions = { },
+ name = "nullfont",
+}
+
+fonts.chr[0] = { }
+
+fonts.methods = fonts.methods or {
+ base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+ node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+}
+
+fonts.initializers = fonts.initializers or {
+ base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+ node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }
+}
+
+fonts.triggers = fonts.triggers or {
+ 'mode',
+ 'language',
+ 'script',
+ 'strategy',
+}
+
+fonts.processors = fonts.processors or {
+}
+
+fonts.manipulators = fonts.manipulators or {
+}
+
+fonts.define = fonts.define or { }
+fonts.define.specify = fonts.define.specify or { }
+fonts.define.specify.synonyms = fonts.define.specify.synonyms or { }
+
+-- tracing
+
+if not fonts.color then
+
+ fonts.color = {
+ set = function() end,
+ reset = function() end,
+ }
+
+end
+
+-- format identification
+
+fonts.formats = { }
+
+function fonts.fontformat(filename,default)
+ local extname = file.extname(filename)
+ local format = fonts.formats[extname]
+ if format then
+ return format
+ else
+ logs.report("fonts define","unable to detemine font format for '%s'",filename)
+ return default
+ end
+end
diff --git a/tex/context/base/font-ini.mkii b/tex/context/base/font-ini.mkii
new file mode 100644
index 000000000..89fbb5d07
--- /dev/null
+++ b/tex/context/base/font-ini.mkii
@@ -0,0 +1,4573 @@
+%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 / Initialization}
+
+\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} % 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
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+%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
+
+\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 \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
+\def\@fontclass@ {@f@cl@} % fontclass
+
+%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.
+
+\def\fontrelativesizelist{\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 1000\or1200\or1440\or1728\or2074\or2488\or1000\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
+
+\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}
+
+% \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
+
+\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 % can for instance happen with MathGamma
+ \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\\}
+
+%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]
+
+\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontfile{#3}%
+ \@EA\let\csname\??ff\fontclass#1\endcsname\@@fontfile
+ \doifnextoptionalelse\dodefinefontsynonym\donothing}
+
+\def\dodefinefontsynonym[#1]%
+ {\edef\@@fontdata{#1}%
+ \ifx\@@fontdata\empty \else \ifx\fontclass\empty
+ \getfontparameters
+ \else
+ \getglobalfontparameters
+ \fi \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%
+ {\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\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\fontsizelist\empty
+\let\fontstylelist\empty
+
+\def\definefontsize[#1]% sneller met toks
+ {\addtocommalist{#1}\fontsizelist
+ \def\docommand##1%
+ {\def\dodocommand####1%
+ {\def\dododocommand########1%
+ %{\checkbodyfont{}{########1}{####1}{##1}}%
+ {\checkbodyfont{########1}{####1}{##1}}%
+ \processcommacommand[\fontstylelist]\dododocommand}%
+ \processcommacommand[\fontalternativelist]\dodocommand}%
+ \processcommacommand[\fontsizelist]\docommand}
+
+\def\fontalternativetextlist{\c!tf,\c!bf,\c!it,\c!sl,\c!bs,\c!bi,\c!sc}
+\def\fontalternativemathlist{\c!mr,\c!mi,\c!sy,\c!ex,\c!ma,\c!mb}
+
+\let\fontalternativelist\fontalternativetextlist % upward compatible
+
+%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[\fontrelativesizelist]\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[\fontrelativesizelist]\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
+% [\fontstylelist]
+% \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[\fontrelativesizelist]\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[\fontrelativesizelist]{\dodefineunknownfont{#1}}%
+ \let\c!text\c!savedtext
+ \ifdone
+ \donefalse
+ \processcommacommand
+ [\fontstylelist]
+ {\dodefineunknownbodyfont{#1}}%
+ \ifdone
+ \donefalse
+ \setvalue{\@size@#1}{\docompletefontswitch[#1]}%
+ \ifdefiningunknownfont \else
+ \definingunknownfonttrue
+ \processcommacommand[\fontrelativesizelist]{\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[\fontstylelist]\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.
+
+\ifdefined\globalbodyfontsize\else \newdimen\globalbodyfontsize \fi \globalbodyfontsize=12pt
+\ifdefined\localbodyfontsize \else \newdimen\localbodyfontsize \fi \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=2 % was 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}}
+
+\def\normalizebodyfontsize#1\to#2%
+ {\scratchdimen\dimexpr#1+\ifcase\fontdigits.5\or.05\or.005\fi\points\relax
+ \@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\scratchdimen000\to#2}
+
+\def\donormalizedbodyfontsize#1.#2#3#4#5\to#6% \points ?
+ {\edef#6% not \ifcase#2\else due to \relax adding
+ {#1%
+ \ifcase\fontdigits
+ \or \ifcase#2 \else .#2\fi % 1
+ \or \ifcase#2#3 \else .#2\ifcase#3 \else #3\fi\fi % 2
+ \else \ifcase#2#3#4 \else .#2\ifcase#4 \ifcase#3 \else#3\fi \else#3#4\fi\fi % 3
+ \fi
+ \s!pt}}
+
+%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.mkii}
+ {\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}}
+
+\def\registerfontclass#1%
+ {\letgvalue{\@fontclass@#1}\v!yes} % global ?
+
+\def\setcurrentfontclass#1%
+ {\ifcsname\@fontclass@#1\endcsname
+ \edef\fontclass{#1}%
+ \fi}
+
+\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}{\fontstylelist}
+ {}%\debuggerinfo\m!fonts{unknown style #2}}
+ {\addtocommalist{#2}\fontstylelist
+ \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}%
+ \edef\@@fontmapping {\truefontdata\fontfile \s!mapping }%
+ \edef\@@fonthandling{\truefontdata\somefontname\s!handling}%
+ \edef\@@fontfeatures{\truefontdata\fontfile \s!features}%
+ \edef\@@fontskewchar{\truefontdata\fontfile \s!skewchar}}
+
+\def\setfontcharacteristics
+ {\updatefontparameters % redundant, will go away, faster too
+ \fastenableencoding
+ {\ifx\@@fontencoding\empty
+ \s!default \else \@@fontencoding
+ \fi}%
+ \fastenablemapping
+ {\ifx\@@fontmapping\empty
+ \ifx\@@fontencoding\empty
+ \s!default \else \@@fontencoding
+ \fi
+ \else
+ \@@fontmapping
+ \fi}%
+ \fastenablehandling
+ {\ifx\@@fonthandling\empty
+ \s!default \else \@@fonthandling
+ \fi}%
+ {\lastfontidentifier}%
+ \the\everyfont
+ \synchronizepatternswithfont}
+
+\ifx\synchronizepatternswithfont\undefined
+ \def\synchronizepatternswithfont{\synchronizepatterns}
+\fi
+
+%D Experimental:
+
+\def\definefontfeature
+ {\dotripleargument\dodefinefontfeature}
+
+\def\dododefinefontfeature#1%
+ {\edef\!!stringa{\ifx\!!stringa\empty\else\!!stringa,\fi\executeifdefined{\??fa#1}\empty}}
+
+\def\dodefinefontfeature[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\setevalue{\??fa#1}{#2}}
+ {\let\!!stringa\empty
+ \processcommalist[#2]\dododefinefontfeature
+ \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]
+ [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]
+
+\definefontfeature
+ [none]
+ [features=no]
+
+%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
+
+\unexpanded\def\os {\mathortext{\fam\purefamily {oldstyle}}{\symbolicfont {OldStyle}}}
+\unexpanded\def\frak{\mathortext{\fam\purefamily {fraktur}}{\symbolicfont {Fraktur}}}
+\unexpanded\def\goth{\mathortext{\fam\purefamily {gothic}}{\symbolicfont {Gothic}}}
+\unexpanded\def\cal {\mathortext{\fam\purefamily{calligraphic}}{\symbolicfont{Calligraphic}}}
+\unexpanded\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
+
+\unexpanded\def\fraktur #1{\mathortext\domathtext\donothing{\frak#1}}
+\unexpanded\def\gothic #1{\mathortext\domathtext\donothing{\goth#1}}
+\unexpanded\def\calligraphic#1{\mathortext\domathtext\donothing{\cal #1}}
+\unexpanded\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.mkii}
+
+%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.mkii}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkii}
+
+%D \macros
+%D {showkerning}
+%D
+%D A goody is:
+%D
+%D \showkerning{Can you guess what kerning is?}
+
+\fetchruntimecommand \showkerning {\f!fontprefix\s!run.mkii}
+
+%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.mkii}
+
+%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.mkii}
+\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showligature {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkii}
+
+%D \macros
+%D {getglyph, symbolicfont}
+%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{\mathparentwd}. 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\mathparentwd\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!mm] [\c!mm]
+\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
+ \scaledfont\currentfontscale\bodyfontsize
+ \scaledfont\relativefontsize\scaledfont}
+
+\unexpanded\def\variant[#1]% slow
+ {\dosetscaledfont
+ \expanded{\definedfont
+ [\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}}
+ at \scaledfont]}%
+ \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 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}
+
+%D New commands (not yet interfaced):
+
+\def\style[#1]% for inline usage, like \color
+ {\groupedcommand{\ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}{}}
+
+\def\startstyle[#1]%
+ {\begingroup
+ \ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}
+
+\def\stopstyle
+ {\endgroup}
+
+%D Still experimental (might even go away).
+
+% \definestylecollection[mine]
+
+% \definestyleinstance[mine][default][sorry]
+% \definestyleinstance[mine][tt][bs][ttbs:\rm\sl]
+% \definestyleinstance[mine][tt][bf][ttbf:\rm\sl]
+% \definestyleinstance[mine][bf][\sl]
+% \definestyleinstance[mine][sl][\tt]
+
+% {\bf test \mine test \sl test \mine test \bs oeps \mine oeps {\tt test \mine \bf test}}
+
+\definesystemvariable{sx}
+
+\def\definestylecollection
+ {\dosingleargument\dodefinestylecollection}
+
+\def\dodefinestylecollection[#1]%
+ {\iffirstargument
+ \unexpanded\setvalue{#1}{\styleinstance[#1]}%
+ \def\docommand##1%
+ {\def\dodocommand####1{\letbeundefined{\??sx##1:####1:\commalistelement}}%
+ \processcommacommand[\fontalternativelist,\s!default]\dodocommand}%
+ \processcommacommand[\fontstylelist,\s!default]\docommand
+ \fi}
+
+\def\definestyleinstance
+ {\doquadrupleargument\dodefinestyleinstance}
+
+\def\dodefinestyleinstance[#1][#2][#3][#4]% [name] [rm|ss|tt|..] [sl|bf|...] [whatever]
+ {\iffirstargument
+ \doifundefined{#1}{\definestylecollection[#1]}%
+ \fi
+ \iffourthargument
+ \setvalue{\??sx#1:#2:#3}{#4}%
+ \else\ifthirdargument
+ \setvalue{\??sx#1::#2}{#3}%
+ \else\ifsecondargument
+ \letvalue{\??sx#1::#2}\empty
+ \fi\fi\fi}
+
+\unexpanded\def\styleinstance[#1]% will be faster
+ {%\begingroup\expanded{\infofont[#1:\fontstyle:\fontalternative]}\endgroup
+ \executeifdefined{\??sx#1:\fontstyle:\fontalternative}%
+ {\executeifdefined{\??sx#1:\fontstyle:\s!default}%
+ {\executeifdefined{\??sx#1::\fontalternative}
+ {\getvalue {\??sx#1::\s!default}}}}}
+
+% \unexpanded\def\styleinstance[#1]%
+% {\csname\??sx#1%
+% \ifcsname:\fontstyle:\fontalternative\endcsname
+% :\fontstyle:\fontalternative
+% \else\ifcsname:\fontstyle:\s!default\endcsname
+% :\fontstyle:\s!default
+% \else\ifcsname::\fontalternative\endcsname
+% ::\fontalternative
+% \else\ifcsname::\s!default\endcsname
+% ::\s!default
+% \else
+% % nothing, \relax
+% \fi\fi\fi\fi
+% \endcsname}
+
+%D \Compatibility with \MKIV:
+
+\def\somefontsize{\scaledfont}
+
+\protect \endinput
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
new file mode 100644
index 000000000..c7d515cca
--- /dev/null
+++ b/tex/context/base/font-ini.mkiv
@@ -0,0 +1,3896 @@
+%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.
+
+% runtime commands will move to modules
+
+% simplification ... we no longer deal with specific mmtfa specifications
+
+% todo: always fontclass, then less testing
+
+% \definefontfeature[smallcaps][smcp=yes,script=latn]
+% \definefontfeature[smallcaps][SmallCapitals=yes,script=latn]
+% \definefontfeature[smallcaps][Small Capitals=yes,script=latn]
+% \definefontfeature[smallcaps][small capitals=yes,script=latn]
+% \definefontfeature[smallcaps][smallcapitals=yes,script=latn]
+%
+% \definedfont[cambria*smallcaps] test
+
+% \starttext
+% \definefontfeature[basekerned][default][mode=base]
+% \definefontfeature[nodekerned][default][mode=node]
+% \definefontfeature[nonekerned][default][mode=base,kern=no]
+% \setupcolors[state=start]
+% \startoverlay
+% {\vbox{\red \definedfont[Serif*nonekerned at 12pt]\input tufte }}
+% {\vbox{\blue \definedfont[Serif*basekerned at 12pt]\input tufte }}
+% {\vbox{\green\definedfont[Serif*nodekerned at 12pt]\input tufte }}
+% \stopoverlay
+% \stoptext
+
+% \enabletrackers[otf.kerns]
+%
+% \definefontfeature[withkern][default][mode=node]
+% \definefontfeature[nokern] [default][mode=node,kern=no]
+% \definefontfeature[single] [default][mode=node,cpsp=yes]
+% \definefontfeature[simple] [default][mode=node,cpsp=yes,kern=no]
+%
+% {\definedfont[Serif*default] [FGFGFGFGFGFGFGFGFGFGFGFGFG ABCDEFGHIJKLMNOPQRSTUVWXYZ] \par}
+% {\definedfont[Serif*nokern] [FGFGFGFGFGFGFGFGFGFGFGFGFG ABCDEFGHIJKLMNOPQRSTUVWXYZ] \par}
+% {\definedfont[Serif*single] [FGFGFGFGFGFGFGFGFGFGFGFGFG ABCDEFGHIJKLMNOPQRSTUVWXYZ] \par}
+% {\definedfont[Serif*simple] [FGFGFGFGFGFGFGFGFGFGFGFGFG ABCDEFGHIJKLMNOPQRSTUVWXYZ] \par}
+
+% figure out why \fontbody is not expanded
+
+\writestatus{loading}{ConTeXt Font Macros / Initialization}
+
+\registerctxluafile{font-ini}{1.001}
+\registerctxluafile{node-fnt}{1.001} % here
+\registerctxluafile{font-enc}{1.001}
+\registerctxluafile{font-map}{1.001}
+\registerctxluafile{font-syn}{1.001}
+\registerctxluafile{font-log}{1.001}
+\registerctxluafile{font-tfm}{1.001}
+\registerctxluafile{font-enh}{1.001}
+\registerctxluafile{font-afm}{1.001}
+\registerctxluafile{font-cid}{1.001} % cid maps
+\registerctxluafile{font-ott}{1.001} % otf tables
+\registerctxluafile{font-otf}{1.001} % otf main
+\registerctxluafile{font-otd}{1.001} % otf dynamics
+\registerctxluafile{font-oti}{1.001} % otf initialization
+\registerctxluafile{font-otb}{1.001} % otf main base
+\registerctxluafile{font-otn}{1.001} % otf main node
+\registerctxluafile{font-ota}{1.001} % otf analyzers
+\registerctxluafile{font-otp}{1.001} % otf pack
+\registerctxluafile{font-otc}{1.001} % otf context
+\registerctxluafile{font-vf} {1.001}
+\registerctxluafile{font-def}{1.001}
+\registerctxluafile{font-ctx}{1.001}
+\registerctxluafile{font-xtx}{1.001}
+\registerctxluafile{font-fbk}{1.001}
+\registerctxluafile{font-gds}{1.001}
+\registerctxluafile{font-ext}{1.001}
+\registerctxluafile{font-pat}{1.001}
+\registerctxluafile{font-chk}{1.001}
+\registerctxluafile{font-agl}{1.001}
+
+\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}
+
+\def\restorefont
+ {\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:
+
+% \newtoks \everydefinedfont % not ot be confused with \everydefinefont
+
+\def\dodefinedfont[#1]%
+ {\iffirstargument\definefont[thedefinedfont][#1]\fi % we can speed this one up
+ \csname thedefinedfont\endcsname
+ \the\everydefinedfont}
+
+\unexpanded\def\definedfont
+ {\dosingleempty\dodefinedfont}
+
+\unexpanded\def\startfont
+ {\bgroup\definedfont}
+
+\unexpanded\def\stopfont
+ {\egroup}
+
+\def\doiffontcharelse#1#2%
+ {\bgroup
+ \definedfont[#1]%
+ \iffontchar\font#2\relax
+ \egroup\expandafter\firstoftwoarguments
+ \else
+ \egroup\expandafter\secondoftwoarguments
+ \fi}
+
+%D For more detailed (and historic information) we refer to the file
+%D \type {font-ini.mkii}. Here we have a much simplified lower level
+%D implementation due to a different approach to math. Also the chapter
+%D on fonts in the reference manual explains a lot.
+
+%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 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
+%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
+%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
+%D Remark: math support has changed a bit.
+
+%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.
+
+\ifdefined\uchar\else \unexpanded\def\uchar#1#2{[#1,#2]} \fi
+
+%D We define some (very private) constants to improve speed,
+%D memory usage and consistency.
+
+\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
+\def\@fontclass@ {@f@cl@} % fontclass
+
+%D \macros
+%D {fontclass, defaultfontclass}
+%D
+%D The fontclass model was introduced a while after we implement
+%D the basic font model and at that time we still defaulted to
+%D no model at all. Nowadays we default to the \type {modern}
+%D fontclass.
+
+\let\fontclass \empty
+\let\defaultfontclass\empty
+
+%D \macros
+%D {textonly}
+%D
+%D Traditionally math has a big impact on font definitions, mainly
+%D because we need to define alphabet variants using families and
+%D fonts. This means that one can easily get 10 fonts loaded per
+%D math size. In \MKIV\ we use a different approach: one family
+%D which has either a virtual font made of traditional fonts, or
+%D an \OPENTYPE\ font that has it all.
+%D
+%D We currently use only one math family but in the future we
+%D might consider using a second one for bold math. For the
+%D moment we keep the \MKII\ method of using a token register
+%D for definitions but we already dropped the text and symbols
+%D ones since they now live in the same family.
+
+\newtoks \mathstrategies
+
+\newif\ifsynchronizemathfonts \synchronizemathfontstrue
+
+\def\synchronizemath % math stuff in mmode
+ {\ifsynchronizemathfonts\the\mathstrategies\fi}
+
+\def\textonly{\synchronizemathfontsfalse} % document this
+
+%D The main math font definer. We have removed some optimized
+%D code simply because we now always have a fontclass. We could
+%D check for fontclass being default or empty and save a few
+%D tests but it does not help us when no math is defined.
+
+\chardef\mrfam\zerocount % math regular
+\chardef\mbfam\plusone % math bold
+
+\unexpanded\def\mr{\ifmmode\fam\zerocount\else\setcurrentfontalternative\c!mr\fi} % \fam\csname\c!mr fam\endcsname
+\unexpanded\def\mb{\ifmmode\fam\plusone \else\setcurrentfontalternative\c!mb\fi} % \fam\csname\c!mb fam\endcsname
+
+\def\mathtextsuffix {-text}
+\def\mathscriptsuffix {-script}
+\def\mathscriptscriptsuffix{-scriptscript}
+
+% \let\mathsizesuffix\empty
+
+\let\currentmathsize\empty
+
+\def\mathsizesuffix{\ifcase0\currentmathsize\or\mathtextsuffix\or\mathscriptsuffix\or\mathscriptscriptsuffix\fi}
+
+\def\dodosetmathfamily#1#2%
+ {\ifcsname\fontclass \fontbody\c!mm\fontfamily\fontsize\currentmathsize\endcsname \autofontsizefalse
+ \csname\fontclass \fontbody\c!mm\fontfamily\fontsize\currentmathsize\endcsname \else
+ \ifcsname\fontclass \fontbody\c!mm\fontfamily \currentmathsize\endcsname \autofontsizetrue
+ \csname\fontclass \fontbody\c!mm\fontfamily \currentmathsize\endcsname \else
+ \dodosetmathfamilyx#1#2%
+ \fi\fi
+ #1#2\font}
+
+\def\dodosetmathfamilyx#1#2%
+ {\ifcsname\defaultfontclass\fontbody\c!mm\fontfamily\fontsize\currentmathsize\endcsname \autofontsizefalse
+ \csname\defaultfontclass\fontbody\c!mm\fontfamily\fontsize\currentmathsize\endcsname \else
+ \ifcsname\defaultfontclass\fontbody\c!mm\fontfamily \currentmathsize\endcsname \autofontsizetrue
+ \csname\defaultfontclass\fontbody\c!mm\fontfamily \currentmathsize\endcsname \else
+ \dodosetmathfamilyxx#1#2%
+ \fi\fi}
+
+\def\dodosetmathfamilyxx#1#2%
+ {\ifcsname \fontbody\c!mm\fontfamily\fontsize\currentmathsize\endcsname \autofontsizefalse
+ \csname \fontbody\c!mm\fontfamily\fontsize\currentmathsize\endcsname \else
+ \ifcsname \fontbody\c!mm\fontfamily \currentmathsize\endcsname \autofontsizetrue
+ \csname \fontbody\c!mm\fontfamily \currentmathsize\endcsname \else
+ \nullfont \autofontsizetrue
+ \fi\fi}
+
+\def\dosetmathfamily#1#2%
+ {\let\savedfontbody\fontbody % op hoger plan
+ \let\fontfamily#2%
+ \let\currentmathsize\!!plusthree\let\fontbody\scriptscriptface\dodosetmathfamily\scriptscriptfont#1%
+ \let\currentmathsize\!!plustwo \let\fontbody\scriptface \dodosetmathfamily\scriptfont #1%
+ \let\currentmathsize\!!plusone \let\fontbody\textface \dodosetmathfamily\textfont #1%
+ \let\currentmathsize\empty
+ \let\fontbody\savedfontbody
+ \autofontsizefalse}
+
+\appendtoks
+ \dosetmathfamily\mrfam\c!mr
+\to \mathstrategies
+
+% not official !
+
+\chardef\boldmathmode\zerocount % might change ... maybe \mathfontsupport 1 (normal) 2 (bold too)
+
+\def\enableboldmath {\chardef\boldmathmode\plusone } % todo: \setupbodyfont[boldmath,...]
+\def\disableboldmath{\chardef\boldmathmode\zerocount}
+
+\appendtoks
+ \ifcase\boldmathmode\or\dosetmathfamily\mbfam\c!mb\fi
+\to \mathstrategies
+
+% \chardef\msfam\plustwo % math symbol
+%
+% \def\c!ms{ms}
+%
+% \unexpanded\def\ms{\ifmmode\fam\plustwo\else\setcurrentfontalternative\c!ms\fi}
+%
+% \chardef\symbolmathmode\zerocount
+%
+% \def\enablesymbolmath {\chardef\symbolmathmode\plusone }
+% \def\disablesymbolmath{\chardef\symbolmathmode\zerocount}
+%
+% \appendtoks
+% \ifcase\symbolmathmode\or\dosetmathfamily\msfam\c!ms\fi
+% \to \mathstrategies
+
+%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.
+
+\def\fontrelativesizelist{\s!text,\s!script,\s!scriptscript,\c!x,\c!xx,\c!big,\c!small}
+
+%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 2
+%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 scaled option is not that useful as one needs to
+%D know the design size.
+%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.
+
+% \enableexperiments[fonts.autorscale]
+%
+% \starttypescript[mscore]
+% \definetypeface [mscore] [rm] [serif] [mscoretimes] [default]
+% \definetypeface [mscore] [ss] [sans] [mscorearial] [default] [rscale=auto] % 0.860]
+% \definetypeface [mscore] [tt] [mono] [mscorecourier] [default] [rscale=auto] % 1.065]
+% \definetypeface [mscore] [mm] [math] [times] [default] [rscale=auto] % 1.020]
+% \stoptypescript
+%
+% \starttext
+% \setupbodyfont[mscore,12pt]
+% \startTEXpage
+% test \ss test \tt test
+% \stopTEXpage
+% \stoptext
+
+\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\checkrelativefontid
+ {\ifcsname\??tf\fontclass\s!rname\endcsname
+ \@EA\let\@EA\relativefontid\csname\??tf\fontclass\s!rname\endcsname
+ \else
+ \@EA\xdef\csname\??tf\fontclass\s!rname\endcsname{\the\lastfontid}%
+ \let\relativefontid\empty
+ \fi}
+
+\def\checkrelativefontsize#1%
+ {\edef\relativefontsize
+ {\ifcsname\fontclass#1\s!rscale\endcsname
+ \csname\fontclass#1\s!rscale\endcsname
+ \else\ifcsname\defaultfontclass#1\s!rscale\endcsname
+ \csname\defaultfontclass#1\s!rscale\endcsname
+ \else
+ \defaultrelativefontsize
+ \fi\fi}%
+ \ifx\relativefontsize\v!auto
+ \let\relativefontsize\plusone
+ \checkrelativefontid
+ \else
+ \let\relativefontid\minusone
+ \fi}
+
+%D Scaling macros:
+%D
+%D This system is somewhat complicated by two (possible conflicting)
+%D demands:
+%D
+%D \startitemize
+%D \item We support wildcards like \type {sa *} which will adapt
+%D to the current size. This is also the default specification.
+%D \item We support named scales like \type {sa d}; beware: \type
+%D {x} and \type {xx} are valid scales but they are not alway
+%D the same as the ones used in for instance \type {\bfx} because
+%D there the sized come from the bodyfont environment. In the
+%D future there maybe a switch that also honors the environment
+%D in named scales.
+%D \stopitemize
+
+%D Keep in mind that the smaller sizes are just for text super and
+%D subscripts while larger sizes can be used in titles where for
+%D instance math follows the size.
+
+% b:x{\definedfont[SerifBold sa b]x}{\bfb x $x^x$}\par
+% 1:x{\definedfont[SerifBold sa 1]x}{\bf x $x^x$}\par
+% x:x{\definedfont[SerifBold sa x]x}{\bfx x $x^x$}\par
+% xx:x{\definedfont[SerifBold sa xx]x}{\bfxx x $x^x$}\par
+%
+% *:x{\definedfont[Serif sa *]x}\par
+% 1:x{\definedfont[Serif sa 1]x}\par
+% 2:x{\definedfont[Serif sa 2]x}\par
+% 3:x{\definedfont[Serif sa 3]x}\par
+% 4:x{\definedfont[Serif sa 4]x}\par
+% 5:x{\definedfont[Serif sa 5]x}\par
+%
+% {\definedfont[cmbx10 at 10pt]x\definedfont[cmbx8 at 10pt]x}
+
+\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
+\newcount\lastfontid
+
+\def\currentfontbodysize
+ {\ifcsname\??ft\s!default\somefontsize\endcsname
+ \csname\??ft\s!default\somefontsize\endcsname
+ \else
+ \somefontsize
+ \fi}
+
+\let\relativefontid\empty
+
+\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, avoid the designsize if possible
+ \scaledfontsize-1000\scaledpoint
+ \or
+ % at
+ \scaledfontsize\somefontsize
+ \or
+ % sa
+ \scaledfontsize\localabsolutefontsize\relax
+ \scaledfontsize\currentfontbodysize\scaledfontsize
+ \or
+ % mo
+ \scaledfontsize\setmappedfontsize\localabsolutefontsize
+ \scaledfontsize\currentfontbodysize\scaledfontsize
+ \or
+ % scaled, don't use this one as it's unpredictable
+ \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",
+ 0\currentmathsize,
+ \number\dimexpr\textface\relax,
+ "\relativefontid" % experiment
+ )}%
+ \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\fontstyle\s!features \endcsname\csname\fontclass\fontstyle\s!features \endcsname\fi}%
+ \edef\@@fontclassfallbacks{\ifcsname\fontclass\fontstyle\s!fallbacks\endcsname\csname\fontclass\fontstyle\s!fallbacks\endcsname\fi}}
+
+% 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\@@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\updatefontparametersyes
+ {\@@thefeaturesyes \somefontname
+ \@@thefallbacksyes\somefontname}
+
+\def\updatefontparametersnop
+ {\@@thefeaturesnop \somefontname
+ \@@thefallbacksnop\somefontname}
+
+\def\updatefontparameters
+ {\ifx\fontclass\empty\updatefontparametersnop\else\updatefontparametersyes\fi}
+
+\let\@@fontclassfeatures \empty
+\let\@@fontclassfallbacks\empty
+
+\let\@@fontfallbacks\empty
+\let\@@fontfeatures \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[slanted] [default][slant=.25]
+% \definefontfeature[stretched][default][stretch=2]
+%
+% \start \definedfont[SerifBold*slanted at 20pt] \ruledhbox{Test!} \stop
+% \start \definedfont[SerifBold*stretched at 20pt] \ruledhbox{Test!} \stop
+
+% \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}
+
+%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 \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.
+
+\unexpanded\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontname{#1}%
+ \edef\@@fontfile{#3}%
+ \ifx\fontclass\empty
+ \expandafter\dodefinefontsynonymnop
+ \else
+ \expandafter\dodefinefontsynonymyes
+ \fi}
+
+\def\dodefinefontsynonymnop
+ {\@EA\let\csname\??ff\@@fontname\endcsname\@@fontfile % maybe just #1 #3, saves expansion
+ \doifnextoptionalelse\dododefinefontsynonymnop\nonodefinefontsynonymnop}
+
+\def\dodefinefontsynonymyes
+ {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile % maybe just #1 #3, saves expansion
+ \doifnextoptionalelse\dododefinefontsynonymyes\nonodefinefontsynonymyes}
+
+\def\dododefinefontsynonymnop[#1]%
+ {\let\@@ff@@features \undefined
+ \let\@@ff@@fallbacks\undefined
+ \expandafter\dogetfontparameternop#1,]=,}
+
+\def\dododefinefontsynonymyes[#1]%
+ {\let\@@ff@@features \undefined
+ \let\@@ff@@fallbacks\undefined
+ \expandafter\dogetfontparameteryes#1,]=,}
+
+\def\dogetfontparameternop#1=#2,%
+ {\if]#1%
+ \dodododefinefontsynonymnop
+ \else
+ \expandafter\def\csname @@ff@@#1\endcsname{#2}%
+ \expandafter\dogetfontparameternop
+ \fi}
+
+\def\dogetfontparameteryes#1=#2,%
+ {\if]#1%
+ \dodododefinefontsynonymyes
+ \else
+ \expandafter\def\csname @@ff@@#1\endcsname{#2}%
+ \expandafter\dogetfontparameteryes
+ \fi}
+
+% hm, was wrong, class/global reversed
+
+\let\fcglobal\global
+\let\fcxdef \xdef
+\let\fcglet \glet
+
+\def\nonodefinefontsynonymnop
+ {\@EA\let\csname\??ff\@@fontname\s!features \endcsname\undefined
+ \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\undefined}
+
+\def\nonodefinefontsynonymyes
+ {\fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\undefined
+ \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\undefined}
+
+\def\dodododefinefontsynonymnop
+ {\@EA\let\csname\??ff\@@fontname\s!features \endcsname\@@ff@@features
+ \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks}
+
+\def\dodododefinefontsynonymyes
+ {\fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\@@ff@@features
+ \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks}
+
+\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
+
+\unexpanded\def\setupfontsynonym
+ {\dodoubleempty\dosetupfontsynonym}
+
+\def\dosetupfontsynonym[#1][#2]% not yet supported, will do when needed
+ {}
+
+\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\defaultfontclass#1\endcsname
+ \ifx#2\empty
+ \@EA\truefontname\csname\??ff\defaultfontclass#1\endcsname
+ \else
+ \@EA\redotruefontname\csname\??ff\defaultfontclass#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\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\defaultfontclass#1\endcsname
+ \@EA\redotruefontname\csname\??ff\defaultfontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ \@EA\redotruefontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi\fi}
+
+\def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1)
+ {\ifcsname\??ff\fontclass#2\endcsname
+ \expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}%
+ \else\ifcsname\??ff\defaultfontclass#2\endcsname
+ \expandafter\def\expandafter#1\expandafter{\csname\??ff\defaultfontclass#2\endcsname}%
+ \fi\fi}
+
+\def\doifelsefontsynonym#1%
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \@EA\firstoftwoarguments
+ \else\ifcsname\??ff\defaultfontclass#1\endcsname
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi\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]
+
+\unexpanded\def\startfontclass
+ {\dosingleempty\dostartfontclass}
+
+\def\dostartfontclass[#1]%
+ {\pushmacro\fontclass
+ \doifelse{#1}\v!each
+ {\let\fontclass\empty}
+ {\doifsomething{#1}{\def\fontclass{#1}}}}
+
+\unexpanded\def\stopfontclass
+ {\popmacro\fontclass}
+
+%D \macros
+%D {tracedfontname}
+%D
+%D A goody:
+
+\def\tracedfontname#1%
+ {#1\ifcsname\??ff\fontclass#1\endcsname
+ \@EA\tracedfontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ \@EA\tracedfontname\csname\??ff#1\endcsname
+ \fi\fi}
+
+%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:
+
+\unexpanded\def\definefont
+ {\dotripleempty\dodefinefont}
+
+\def\dodefinefont[#1][#2][#3]% [name][spec][1.6 | line=10pt | setup_id]
+ {\ifthirdargument
+ \setuvalue{#1}{\redodefinefont{#1}{#2}{#3}}%
+ \else
+ \setuvalue{#1}{\dododefinefont{#1}{#2}}%
+ \fi}
+
+\def\redodefinefont#1#2#3%
+ {\dododefinefont{#1}{#2}%
+ \doifsetupselse{#3}
+ {\setups[#3]} % don't forget to document this !
+ {\setuplocalinterlinespace[#3]%
+ \setupspacing}} % needed ?
+
+\unexpanded\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\currentmathsize**}
+\def\newfontidentifier{*\fontclass\lastfontidentifier\fontsize\currentmathsize*}
+
+\let\oldrawfontidentifier\rawfontidentifier
+\let\oldnewfontidentifier\newfontidentifier
+
+\def\newfontidentifier{*\fontclass\lastfontidentifier\fontstyle\fontsize*}
+
+\def\dododefinefont#1#2%
+ {\edef\lastfontidentifier{#1}%
+ \let\localrelativefontsize\defaultrelativefontsize
+ \let\localabsolutefontsize\fontbody
+ \lowleveldefinefont{#2}\rawfontidentifier
+ \csname\rawfontidentifier\endcsname
+ \autofontsizefalse
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \let\rawfontidentifier\oldrawfontidentifier}
+
+\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
+ \fi
+ \csname\newfontidentifier\endcsname
+ \autofontsizefalse
+ %\edef\lastfontidentifier{#3}%
+ \ifskipfontcharacteristics \else
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi
+ \let\newfontidentifier\oldnewfontidentifier}
+
+%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]%
+ {\setvalue{\??ft*\the\dimexpr#1\relax}{#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\fontsizelist \empty
+\let\fontalternativelist\empty
+\let\fontstylelist \empty
+
+\def\checkfontnamecombinations % we need to split math and text here ... todo (math only has mr and mb)
+ {\def\docommand##1%
+ {\def\dodocommand####1%
+ {\def\dododocommand########1{\checkbodyfont{########1}{####1}{##1}}%
+ \processcommacommand[\fontstylelist]\dododocommand}%
+ \processcommacommand[\fontalternativelist]\dodocommand}%
+ \processcommacommand[\fontsizelist]\docommand}
+
+\unexpanded\def\definefontsize[#1]% sneller met toks
+ {\addtocommalist{#1}\fontsizelist
+ \checkfontnamecombinations}
+
+\unexpanded\def\definefontalternative[#1]%
+ {\addtocommalist{#1}\fontalternativelist
+ \checkfontnamecombinations}
+
+%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. However, long ago
+%D we decided to stick to \s!text in definitions as it closely
+%D relates to the math model where text, script and scriptscript
+%D are used untranslated. Also, we are now english at the low
+%D level so it cannot go wrong anymore.
+%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 % check if this is still needed
+
+\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}
+
+\unexpanded\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
+ \ifx\fontclass\empty\else
+ \writestatus\m!fonts{beware: fontclass ignored (if needed use: [fontclass][size][settings])}%
+ \fi
+ \pushmacro\fontclass
+ \let\fontclass\empty
+ \definebodyfontenvironment[\fontclass][#1][#2]% change */*
+ \popmacro\fontclass
+ \fi}
+
+\def\dododefinebodyfontenvironment[#1][#2][#3]% size class settings
+ {\@@beginfontdef % \s!text goes wrong in testing because the 12pt alternative will called when typesetting the test (or so)
+ \ifcsname\??ft#2#1\c!em\endcsname
+ % we test for em as we assume it to be set
+ \else
+ \def\docommand##1%
+ {\scratchdimen\csname\??ft\s!default##1\endcsname\dimexpr#1\relax
+ \normalizebodyfontsize\scratchdimen\to\tempbodyfontsize
+ \letvalue{\??ft#2#1##1}\tempbodyfontsize}%
+ \processcommacommand[\fontrelativesizelist]\docommand
+ \copyparameters
+ [\??ft#2#1][\??ft\s!default]
+ [\c!interlinespace,\c!em]%
+ \fi
+ \getparameters[\??ft#2#1][#3]%
+ \@@endfontdef
+ % new code, see remark
+ \ifloadingfonts
+ % only runtime
+ \else\ifcsname\@size@#1\endcsname
+ % only once
+ \else
+ % prevent loop (hence \empty)
+ \letvalue{\@size@#1}\empty
+ \pushmacro\fontclass % new per 26102009
+ \edef\fontclass{#2}% % new per 26102009
+ \defineunknownfont{#1}%
+ \popmacro\fontclass % new per 26102009
+ \fi\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][]}
+
+\def\checkbodyfontenvironment[#1]%
+ {\ifcsname\??ft\fontclass#1\c!em\endcsname
+ % we test for em as we assume it to be set
+ \else
+ \definebodyfontenvironment[\fontclass][#1][]%
+ \fi}
+
+% this one already catches both define/setup
+
+\let\setupbodyfontenvironment\definebodyfontenvironment
+
+%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. The magic scaled
+%D values are derived from plain \TEX's \type {\magstep}:
+%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 1.200,
+%D tfb=cmr12 scaled 1.440,
+%D tfc=cmr12 scaled 1.728,
+%D tfd=cmr12 scaled 2.074,
+%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.
+
+\unexpanded\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]
+ \ifcsname#2\endcsname\else\normalexpanded{\noexpand\definefontstyle[#2][#2]}\fi % new
+ \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}}
+ {% [12pt] [style] [identifier]
+ \dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier
+ {% [identifier] [style] [settings] % see ***
+ \setvalue{\s!default#1#2}##1##2{\normalexpanded{\noexpand\xdodefinebodyfont[##1][##2][#3]}}}%
+ \else\ifsecondargument
+ \definebodyfont[#1][\c!rm][#2]%
+ \else
+ % Maybe there are default dependencies defined which we can use ([unknown]) and
+ % if not, then we have at least to make sure some basics are set up.
+ \ifcsname\@size@#1\endcsname \else
+ \defineunknownfont{#1}%
+ \fi
+ \ifcsname\@size@#1\endcsname \else
+ \definebodyfont[#1][\c!rm][]%
+ \fi
+ \fi\fi}
+
+\def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
+ {\checkrelativefontsize{#2}% rather new, inherit from other defs
+ \ifcsname#2\endcsname\else\normalexpanded{\noexpand\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\dododododefinebodyfont
+ {\ifx\fontclass\empty
+ \expandafter\dododododefinebodyfontnop
+ \else
+ \expandafter\dododododefinebodyfontyes
+ \fi}
+
+\def\dododododefinebodyfontyes#1% style body def
+ {\edef\askedbodyfontstyle{#1}%
+ \ifx\askedbodyfontstyle\c!mm
+ \expandafter\dodefinebodyfontyesmm
+ \else
+ \expandafter\dodefinebodyfontyesxx
+ \fi\askedbodyfontstyle} % we can get rid of #1
+
+\def\dododododefinebodyfontnop#1% style body def
+ {\edef\askedbodyfontstyle{#1}%
+ \ifx\askedbodyfontstyle\c!mm
+ \expandafter\dodefinebodyfontnopmm
+ \else
+ \expandafter\dodefinebodyfontnopxx
+ \fi\askedbodyfontstyle} % we can get rid of #1
+
+\def\dodefinebodyfontnopxx#1#2[#3#4#5=#6]% style body def
+ {\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5]
+ \@EA\let\csname*#2#1#3#4#5*\endcsname\undefined
+ \unexpanded\@EA\edef\csname#2#1#3#4#5\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#5}{\normalunexpanded{#6}}}}
+
+\def\dodefinebodyfontyesxx#1#2[#3#4#5=#6]% style body def
+ {\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5]
+ \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#5*\endcsname\undefined
+ \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#5\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#5}{\normalunexpanded{#6}}}}
+
+\def\dodefinebodyfontnopmm#1#2[#3#4#5=#6]% style body def
+ {\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5]
+ \@EA\let\csname*#2#1#3#4#51*\endcsname\undefined
+ \@EA\let\csname*#2#1#3#4#52*\endcsname\undefined
+ \@EA\let\csname*#2#1#3#4#53*\endcsname\undefined
+ \unexpanded\@EA\edef\csname#2#1#3#4#51\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#51}{\normalunexpanded{#6}}}%
+ \unexpanded\@EA\edef\csname#2#1#3#4#52\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#52}{\normalunexpanded{#6}}}%
+ \unexpanded\@EA\edef\csname#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}}
+
+\def\dodefinebodyfontyesmm#1#2[#3#4#5=#6]% style body def
+ {\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5]
+ \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#51*\endcsname\undefined
+ \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#52*\endcsname\undefined
+ \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#53*\endcsname\undefined
+ \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#51\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#51}{\normalunexpanded{#6}}}%
+ \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#52\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#52}{\normalunexpanded{#6}}}%
+ \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}}
+
+\def\checkbodyfont#1% tests for ttsl mmbf
+ {\edef\c!!mm{#1}%
+ \ifx\c!!mm\c!mm % prevents \max and alike (re)defs
+ \expandafter\checkmathbodyfont
+ \else
+ \expandafter\checktextbodyfont
+ \fi{#1}} % no \c!!mm, not expanded later on
+
+% some day we can do an auto-fam if needed
+
+\def\checkmathbodyfont#1#2#3% style alt size / gdef % #3 can be empty
+ {%\message{!m #1 #2 #3!}%
+ % #1 #2 #3 = signal
+ %setugvalue {#2}{\setcurrentfontalternative {#2}}% \mr \mb
+ \setugvalue {#1}{\setcurrentfontstyle {#1}}}% \mm
+
+\def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty
+ {%\message{!t #1 #2 #3!}%
+ \setugvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% \rma
+ \setugvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% \sla
+ \setugvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \rmsla
+ \setugvalue {#1}{\setcurrentfontstyle {#1}}% \rm
+ \setugvalue {#2}{\setcurrentfontalternative {#2}}% \sl
+ \setugvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% \rmx
+ \setugvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% \rmxx
+ \setugvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% \slx
+ \setugvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% \slxx
+ \setugvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}}% \rmsl
+
+\def\dodefinedefaultbodyfont[#1][#2][#3]% sizes styles identifier
+ {\def\dododefinedefaultbodyfont##1%
+ {\def\dodododefinedefaultbodyfont####1%
+ {\def\dododododefinedefaultbodyfont########1%
+ {\ifcsname\s!default########1####1\endcsname
+ % [12pt] [style] [identifier]
+ \csname\s!default########1####1\endcsname{##1}{####1}%
+ \fi}%
+ \processcommalist[#3]\dododododefinedefaultbodyfont}%
+ \processcommalist[#2]\dodododefinedefaultbodyfont}%
+ \processcommalist[#1]\dododefinedefaultbodyfont}
+
+%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%
+ {\ifcsname\??ft\s!default#2\endcsname
+ \donetrue
+ \normalizebodyfontsize\csname\??ft\s!default#2\endcsname\dimexpr#1\relax\to\tempbodyfontsize
+ \letvalue{\??ft#1#2}\tempbodyfontsize
+ \fi}
+
+\def\dodefineunknownbodyfont#1#2% see ***
+ {\ifcsname\s!default\s!default#2\endcsname % somehow related to */*
+ \donetrue
+ \csname\s!default\s!default#2\endcsname{#1}{#2}%
+ \fi}
+
+\def\dodefineunknownsubfont#1#2%
+ {\ifcsname\@size@\csname\??ft#1#2\endcsname\endcsname
+ \else
+ \donetrue
+ \defineunknownfont{\csname\??ft#1#2\endcsname}%
+ \fi}
+
+\unexpanded\def\defineunknownfont#1%
+ {\let\c!savedtext\c!text
+ \let\c!text\s!text
+ \donefalse
+ \processcommacommand[\fontrelativesizelist]{\dodefineunknownfont{#1}}%
+ \let\c!text\c!savedtext
+ \ifdone
+ \donefalse
+ \processcommacommand
+ [\fontstylelist]
+ {\dodefineunknownbodyfont{#1}}%
+ \ifdone
+ \donefalse
+ \setvalue{\@size@#1}{\docompletefontswitch[#1]}%
+ \ifdefiningunknownfont \else
+ \definingunknownfonttrue
+ \processcommacommand[\fontrelativesizelist]{\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 \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.
+
+\ifdefined\globalbodyfontsize\else \newdimen\globalbodyfontsize \fi \globalbodyfontsize=12pt
+\ifdefined\localbodyfontsize \else \newdimen\localbodyfontsize \fi \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 {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=2 % was 1
+
+% \def\normalizebodyfontsize#1\to#2%
+% {\@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\dimexpr#1+\ifcase\fontdigits.5\or.05\or.005\fi\points\relax000\to#2}
+%
+% \def\donormalizedbodyfontsize#1.#2#3#4#5\to#6% \points ?
+% {\edef#6% not \ifcase#2\else due to \relax adding
+% {#1%
+% \ifcase\fontdigits
+% \or \ifcase#2 \else .#2\fi % 1
+% \or \ifcase#2#3 \else .#2\ifcase#3 \else #3\fi\fi % 2
+% \else \ifcase#2#3#4 \else .#2\ifcase#4 \ifcase#3 \else#3\fi \else#3#4\fi\fi % 3
+% \fi
+% \s!pt}}
+
+\def\normalizebodyfontsize#1\to#2%
+ {\edef#2{\ctxlua{fonts.nbfs(\number\dimexpr#1\relax,\number\fontdigits)}}}
+
+\def\thenormalizedbodyfontsize#1%
+ {\ctxlua{fonts.nbfs(\number\dimexpr#1\relax,\number\fontdigits)}}
+
+\normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+
+%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 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.
+
+% can be made faster (only used internally now)
+
+\def\doswitchpoints[#1]%
+ {\normalexpanded{\dodoswitchpoints{#1}}}
+
+\unexpanded \def\dodoswitchpoints#1%
+ {\ifcsname\@size@#1\endcsname \else
+ \defineunknownfont{#1}%
+ \fi%
+ %\defineunknownfontstyles{#1}%
+ \ifcsname\@size@#1\endcsname
+ \csname\@size@#1\endcsname
+ \localbodyfontsize#1\relax
+ \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+ % \edef\fontbody{\fontbody}% to be tested but we can clean up mkiv further
+ \checkbodyfontenvironment[\normalizedbodyfontsize]%
+ \else
+ \showmessage\m!fonts4{#1}%
+ \fi}
+
+\unexpanded \def\doswitchstyle[#1]%
+ {\ifcsname\@style@#1\endcsname
+ \csname\@style@#1\endcsname
+ \edef\fontstyle{#1}%
+ \ifmmode\mr\fi % in order to be compatible with \rm in math mode
+ % \the\everybodyfont % cleaner, in setting size as well as style
+ \else
+ \showmessage\m!fonts5{#1}%
+ \fi}
+
+%D \TEX\ loads font metric files like \type{cmr10.tfm} and
+%D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files
+%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.
+
+% \appendtoks
+% \to \everysetupdocument
+
+\newconditional\fontsareloaded
+
+\def\preloadfonts % never called, needs a clean up
+ {\global\loadingfontsfalse
+ \ifconditional\fontsareloaded \else
+ \doifmodeelse {*nofonts}
+ {\writestatus\m!fonts{latin modern fonts are not preloaded}}
+ {\writestatus\m!fonts{preloading latin modern fonts}%
+ \usetypescript[modern]%
+ \setuptypeface[modern]%
+ \showmessage\m!fonts6{\normalizedbodyfontsize\normalspace\fontstyle}}%
+ \fi
+ \global\let\preloadfonts\relax}
+
+% maybe add this to \everystarttext
+%
+% \ifconditional\fontsareloaded\else
+% \usetypescript[modern]%
+% \setuptypeface[modern]%
+% \fi
+
+%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
+ \global\settrue\fontsareloaded
+ \doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \ifx\defaultfontclass\empty
+ \let\defaultfontclass\fontclass
+ \fi
+ \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}}}}
+
+% % % this can be retrofitted in mkii code % % %
+
+% \def\normalizebodyfontsize#1\to#2%
+% {\@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\dimexpr#1+\ifcase\fontdigits.5\or.05\or.005\fi\points\relax000\to#2}
+
+\def\dododosetfont#1#2#3% #1 = set/switch state ! ! ! !could also be used for mkii
+ {\doifnumberelse{#2}\dodododosetfont\redododosetfont{#1}{#2}{#3}}
+
+\def\redododosetfont#1#2#3% #1 = set/switch state ! ! ! !could also be used for mkii
+ {\edef\expandedfontthing{#2}%
+ \def\interfacedfontsize{\normalizedbodyfontsize\interfaced\expandedfontthing}%
+ \ifcsname\??ft\interfacedfontsize\endcsname
+ \edef\fontstep{\csname\bodyfontvariable\interfacedfontsize\endcsname}%
+ \normalexpanded{\noexpand\dodododosetfont{#1}{\fontstep}}{#3}%
+ \else\ifx\expandedfontthing\v!reset
+ \let\fontstyle\empty % new 31/7/2006
+ \let\fontsize \empty
+ \else
+ \ifcsname\@style@\expandedfontthing\endcsname
+ \let\fontstyle\expandedfontthing
+ \else
+ \setcurrentfontclass\expandedfontthing
+ \ifcase#1\relax
+ \let\globalfontclass\globalfontclass
+ \else
+ \let\globalfontclass\fontclass
+ \fi
+ \ifx\fontclass\empty
+ \let\fontstyle\c!rm
+ \else\ifcsname\??tf\fontclass\s!default\endcsname
+ \edef\fontstyle{\csname\??tf\fontclass\s!default\endcsname}%
+ \else
+ \let\fontstyle\c!rm
+ \fi\fi
+ \fi
+ \fi\fi}
+
+\def\dodododosetfont#1#2#3% #1 = set/switch state
+ {\normalizebodyfontsize#2\to\normalizedsetfont
+ \ifcsname\@size@\normalizedsetfont\endcsname \else
+ \defineunknownfont{#2}%
+ \fi
+ \ifcsname\@size@\normalizedsetfont\endcsname
+ \localbodyfontsize\normalizedsetfont
+ \let\normalizedbodyfontsize\normalizedsetfont
+ \else
+ #3\dosetsubstitutefont{#1}{#2}%
+ \fi}
+
+% % %
+
+%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
+
+% we need to check the fontclass
+
+\def\registerfontclass#1%
+ {\letgvalue{\@fontclass@#1}\v!yes} % global ?
+
+\edef\@no@fontclass@{\@fontclass@:?:}
+
+\def\setcurrentfontclass#1%
+ {\ifcsname\@fontclass@#1\endcsname
+ \edef\fontclass{#1}%
+ \else\ifcsname\@no@fontclass@#1\endcsname
+ % already tried
+ \else\ifcase\currentgrouplevel
+ \trycurrentfontclass{#1}%
+ \fi\fi\fi}
+
+\def\savefontclassparameters#1#2#3#4% #1=rm|ss|.. rscale features fallbacks
+ {\setxvalue{\fontclass#1\s!rscale }{#2}%
+ \setxvalue{\fontclass#1\s!features }{#3}%
+ \setxvalue{\fontclass#1\s!fallbacks}{#4}}
+
+\settrue\autotypescripts
+
+% \def\trycurrentfontclass#1%
+% {\ifconditional\autotypescripts
+% \usetypescript[#1]%
+% \ifcsname\@fontclass@#1\endcsname
+% \edef\fontclass{#1}%
+% \else
+% \letvalue{\@no@fontclass@#1}\empty
+% \fi
+% \else
+% \letvalue{\@no@fontclass@#1}\empty
+% \fi}
+
+\def\trycurrentfontclass#1%
+ {\ifconditional\autotypescripts
+ % try to load typescript #1
+ \usetypescript[#1]%
+ \ifcsname\@fontclass@#1\endcsname
+ \edef\fontclass{#1}%
+ \else
+ % try to load type-#1.mkiv
+ \usetypescriptfile[\f!typeprefix#1]%
+ % try to load typescript #1
+ \usetypescript[#1]%
+ \ifcsname\@fontclass@#1\endcsname
+ \edef\fontclass{#1}%
+ \else
+ % todo: message
+ \letvalue{\@no@fontclass@#1}\empty
+ \fi
+ \fi
+ \else
+ % todo: message
+ \letvalue{\@no@fontclass@#1}\empty
+ \fi}
+
+\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\zerocount}
+\def\autobigmath{\chardef\synchronizebigmathflag\plusone\synchronizebigmath}
+\def\bigmath {\chardef\synchronizebigmathflag\plustwo\synchronizebigmath}
+
+\let\bigmathfontsize\empty
+
+\def\synchronizebigmath
+ {\ifx\bigmathfontsize\fontsize
+ % already in sync
+ \else
+ \let\bigmathfontsize\fontsize
+ \synchronizemath
+ \fi}
+
+\def\checkbigmathsynchronization
+ {\ifcase\synchronizebigmathflag
+ % never
+ \or
+ \ifmmode \synchronizebigmath \fi
+ \or
+ \synchronizebigmath
+ \fi}
+
+%D So far for synchronisation. (We can inline the following macros.)
+
+\def\dosetcurrentfontsize#1%
+ {\edef\fontsize{#1}%
+ \checkbigmathsynchronization}
+
+\def\dosetcurrentfontalternative#1%
+ {\edef\fontalternative{#1}}
+
+\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\setcurrentfontstyle#1%
+ {%\message{[3 #1]}%
+ \edef\fontstyle{#1}%
+ \checkfontclass\fontstyle
+ \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 % we can have dups i.e. no need to let fontstrategy
+ {\tryingfonttrue
+ \ifx\fontclass\empty
+ \applyfontstrategies
+ \else
+ \applyfontclassstrategies
+ \fi
+ \autofontsizefalse
+ \ifskipfontcharacteristics
+ \setfontcharacteristics
+ \the\everyfontswitch
+ \fi}
+
+\def\fontclassstrategiesa % --- --- --- --- % pt tt bf a
+ {\ifcsname\fontclass\fontbody \fontstyle \fontalternative \fontsize\endcsname
+ \autofontsizefalse
+ \csname\fontclass\fontbody \fontstyle \fontalternative \fontsize\endcsname
+ \else
+ \expandafter\fontclassstrategiesb
+ \fi}
+
+\def\fontclassstrategiesb % --- --- --- def % pt tt bf
+ {\ifcsname\fontclass\fontbody \fontstyle \fontalternative \defaultfontsize\endcsname
+ \autofontsizetrue
+ \csname\fontclass\fontbody \fontstyle \fontalternative \defaultfontsize\endcsname
+ \else
+ \expandafter\fontclassstrategiesc
+ \fi}
+
+\def\fontclassstrategiesc % --- --- def --- % pt tt tf a
+ {\ifcsname\fontclass\fontbody \fontstyle \defaultfontalternative \fontsize\endcsname
+ \autofontsizetrue
+ \csname\fontclass\fontbody \fontstyle \defaultfontalternative \fontsize\endcsname
+ \else
+ \expandafter\fontclassstrategiesd
+ \fi}
+
+\def\fontclassstrategiesd % --- --- def def % pt tt tf
+ {\ifcsname\fontclass\fontbody \fontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \autofontsizetrue
+ \csname\fontclass\fontbody \fontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \else
+ \expandafter\fontclassstrategiese
+ \fi}
+
+\def\fontclassstrategiese % --- def def def % pt rm tf
+ {\ifcsname\fontclass\fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \autofontsizefalse
+ \csname\fontclass\fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \else
+ \expandafter\fontclassstrategiesf
+ \fi}
+
+\def\fontclassstrategiesf % def def def def % rm tf
+ {\ifcsname\fontclass\defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \autofontsizetrue
+ \csname\fontclass\defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \else
+ \expandafter\fontstrategiesa
+ \fi}
+
+% no class
+
+\def\fontstrategiesa % --- --- --- --- % pt tt bf a
+ {\ifcsname\fontbody \fontstyle \fontalternative \fontsize\endcsname
+ \autofontsizefalse
+ \csname\fontbody \fontstyle \fontalternative \fontsize\endcsname
+ \else
+ \expandafter\fontstrategiesb
+ \fi}
+
+\def\fontstrategiesb % --- --- --- --- % pt tt bf a
+ {\ifcsname\fontbody \fontstyle \fontalternative \defaultfontsize\endcsname
+ \autofontsizetrue
+ \csname\fontbody \fontstyle \fontalternative \defaultfontsize\endcsname
+ \else
+ \expandafter\fontstrategiesc
+ \fi}
+
+\def\fontstrategiesc % --- --- --- --- % pt tt bf a
+ {\ifcsname\fontbody \fontstyle \defaultfontalternative \fontsize\endcsname
+ \autofontsizetrue
+ \csname\fontbody \fontstyle \defaultfontalternative \fontsize\endcsname
+ \else
+ \expandafter\fontstrategiesd
+ \fi}
+
+\def\fontstrategiesd % --- --- --- --- % pt tt bf a
+ {\ifcsname\fontbody \fontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \autofontsizetrue
+ \csname\fontbody \fontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \else
+ \expandafter\fontstrategiese
+ \fi}
+
+\def\fontstrategiese % --- --- --- --- % pt tt bf a
+ {\ifcsname\fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \autofontsizefalse
+ \csname\fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \else
+ \expandafter\fontstrategiesf
+ \fi}
+
+\def\fontstrategiesf % --- --- --- --- % pt tt bf a
+ {\ifcsname\defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \autofontsizetrue
+ \csname\defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize\endcsname
+ \fi}
+
+\let\applyfontstrategies \fontstrategiesa
+\let\applyfontclassstrategies\fontclassstrategiesa
+
+%D Let's synchronize:
+
+\newif\ifsynchronizefonts \synchronizefontstrue
+
+\prependtoks
+ \ifsynchronizefonts
+ \synchronizemath
+ \synchronizefont % problem: syncs last font
+ \fi
+\to \everybodyfont
+
+%D Setting the normal sizes 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\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}{\fontstylelist}
+ {%\debuggerinfo\m!fonts{unknown style #2}%
+ }
+ {%\debuggerinfo\m!fonts8{#2\space (#1)}%
+ \addtocommalist{#2}\fontstylelist}%
+ % check kan hier
+ \def\docommand##1%
+ {\setvalue{\@shortstyle@##1}{#2}%
+ \setvalue{\@style@##1}{\csname#2\endcsname}}%
+ \processcommalist[#1]\docommand}
+
+\unexpanded\def\definefontstyle
+ {\dodoubleargument\dodefinefontstyle}
+
+\def\setfontstyle#1#2% #1:name (roman, romaan) #2:style (rm)
+ {\edef\fontstyle{#1}%
+ \checkfontnamecombinations
+ \setcurrentfontstyle\normalizedbodyfontsize}
+
+%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 % rounded, still used in m-chart
+ \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[modern,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
+
+% \newtoks \everysetupbodyfont
+% \newtoks \everyswitchtobodyfont
+
+\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
+ \the\everysetupbodyfont}}
+
+\unexpanded\def\switchtobodyfont[#1]%
+ {\doifsomething{#1}
+ {\ifcsname\??ft\normalizedbodyfontsize\interfaced{#1}\endcsname
+ \setbodyfontstep{#1}% so we have a fast [small] switch
+ \else
+ \dosetfont0{#1}%
+ \fi
+ \the\everybodyfont
+ \the\everyswitchtobodyfont}}
+
+%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 \starttyping
+%D $\cases{& \ccaron}$ $x=\hbox{\ccaron $x=\hbox{\ccaron}$}$
+%D \stoptyping
+
+\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:
+
+\unexpanded\def\definefontfeature
+ {\dotripleargument\dodefinefontfeature}
+
+\def\dodefinefontfeature[#1][#2][#3]%
+ {\global\expandafter\chardef\csname\??fq=#1\endcsname % beware () needed as we get two values returned
+ \ctxlua{tex.write((fonts.define.specify.preset_context("#1","#2","#3")))}\relax}
+
+\definefontfeature
+ [default]
+ [%mode=node,
+ liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [smallcaps]
+ [%mode=node,liga=yes,
+ smcp=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [oldstyle]
+ [%mode=node,
+ onum=yes,liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature % == default unless redefined
+ [ligatures]
+ [%mode=node,
+ liga=yes,kern=yes,tlig=yes,trep=yes]
+
+\definefontfeature % can be used for type1 fonts
+ [complete]
+ [liga=yes,kern=yes,compose=yes,tlig=yes,trep=yes]
+
+\definefontfeature
+ [arabic]
+ [mode=node,language=dflt,script=arab,ccmp=yes,
+ init=yes,medi=yes,fina=yes,isol=yes,
+ liga=yes,dlig=yes,rlig=yes,clig=yes,calt=yes,
+ mark=yes,mkmk=yes,kern=yes,curs=yes]
+
+\definefontfeature
+ [none]
+ [mode=none,features=no]
+
+\definefontfeature
+ [virtualmath]
+ [mode=base,liga=yes,kern=yes,tlig=yes,trep=yes]
+
+% for the moment here, this will change but we need it for mk.tex
+
+\definefontfeature[math-text] [virtualmath][ssty=no]
+\definefontfeature[math-script] [virtualmath][ssty=1,mathsize=yes]
+\definefontfeature[math-scriptscript][virtualmath][ssty=2,mathsize=yes]
+
+\definefontfeature [math-nostack-text] [math-text] [nostackmath=yes]
+\definefontfeature [math-nostack-script] [math-script] [nostackmath=yes]
+\definefontfeature [math-nostack-scriptscript][math-scriptscript][nostackmath=yes]
+
+% \definefontfeature[mathtext] [math-text]
+% \definefontfeature[mathscript] [math-script]
+% \definefontfeature[mathscriptscript] [math-scriptscript]
+
+%D Also new, handy for manuals:
+
+\unexpanded\def\fontchar#1{\ctxlua{fonts.char("#1")}}
+
+\let\otfchar\fontchar % will disappear, for compatibility only
+\let\afmchar\fontchar % will disappear, for compatibility only
+
+%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][r=.75,g=.75] % [y=.75]
+\definecolor[font:mark][r=.75,b=.75] % [m=.75]
+\definecolor[font:rest][g=.75,b=.75] % [c=.75]
+
+%D Experimental!
+
+\def\installfontfeature
+ {\dodoubleargument\doinstallfontfeature}
+
+\def\doinstallfontfeature[#1][#2]%
+ {\writestatus\m!fonts{installing font features was experimental}} % \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
+
+% ! ! ! very experimental, some test code for idris advanced features ! ! !
+%
+% \startbuffer
+% \definefontfeature[smallcaps][smallcaps][script=latn]
+% \definefontfeature[oldstyle] [oldstyle] [script=latn]
+%
+% \definedfont[name:cambria at 15pt]
+%
+% Hello there {\setff{smallcaps}capped 123 \setff{oldstyle}123!} \blank
+% Hello there {\addff{smallcaps}capped 123 \addff{oldstyle}123!} \blank
+% Hello there {\addff{smallcaps}capped \subff{smallcaps}normal} \blank
+% \stopbuffer
+%
+% \typebuffer \getbuffer
+
+\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} % initial value
+
+\def\addfontfeaturetoset #1{\ctxlua{fonts.withset("#1", 1)}} % merge
+\def\subtractfontfeaturefromset #1{\ctxlua{fonts.withset("#1",-1)}} % merge
+\def\addfontfeaturetofont #1{\ctxlua{fonts.withfnt("#1", 2)}} % overload
+\def\subtractfontfeaturefromfont#1{\ctxlua{fonts.withfnt("#1",-2)}} % overload
+
+\let\setff\setfontfeature
+\let\addfs\addfontfeaturetoset
+\let\subfs\subtractfontfeaturefromset
+\let\addff\addfontfeaturetofont
+\let\subff\subtractfontfeaturefromfont
+
+%D The next auxilliary macro is an alternative to \type
+%D {\fontname}.
+
+\def\purefontname#1{\ctxlua{file.basename("\fontname#1"}} % will be function using id
+
+%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[\checkedstrippedcsname#1]}
+
+\def\complexswitchstyleonly[#1]% todo : check
+ {\setcurrentfontstyle{\csname\@shortstyle@#1\endcsname}%
+ \the\everybodyfont} % needed ?
+
+%D \macros
+%D {os}
+%D
+%D In good old \TEX, the old style numerals were often taken
+%D from the math fonts. No longer.
+
+\definefontfeature
+ [just-os]
+ [mode=node,onum=yes]
+
+% \def\sc{\setfontfeature{smallcaps}}
+\unexpanded\def\os{\setfontfeature{just-os}}
+
+%D Code for switching to fraktur and script has also been
+%D changed. We now have an alphabet switcher.
+
+\ifx\mathtext\undefined \let\mathtext\hbox \fi
+
+%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}
+
+\unexpanded\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\globalfontstyle\c!rm
+
+\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
+ \the\everybodyfont % indeed needed
+ \the\everyglobalbodyfont % indeed needed
+ \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%
+ {\ifcsname##1\endcsname\else\setuvalue{##1}{\groupedcommand{#2}{}}\fi
+ \setvalue{\@letter@ ##1}{#2}%
+ \setvalue{\@noletter@##1}{#3}}%
+ \processcommalist[#1]\docommand}
+
+\unexpanded\def\definealternativestyle
+ {\dotripleempty\dodefinealternativestyle}
+
+\unexpanded\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 argument, 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}.
+
+% subtle ... \expandafter is needed else problems with lookahead caps
+
+\def\@@dodoconvertfont{\csname\@letter@ \p!defined\expandafter\endcsname\gobbleoneargument}
+\def\@@donoconvertfont{\csname\@noletter@\p!defined\endcsname}
+\def\@@redoconvertfont{\csname \p!defined\expandafter\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%
+ {\edef\emphasizedtypeface{\csname\??ft\fontclass\normalizedbodyfontsize\c!em\endcsname}%
+ \ifx\emphasizedtypeface\v!slanted
+ #1%
+ \else\ifx\emphasizedtypeface\v!italic
+ #2%
+ \else\ifx\emphasizedtypeface\v!empty
+ \edef\emphasizedtypeface{\csname\??ft\normalizedbodyfontsize\c!em\endcsname}%
+ \ifx\emphasizedtypeface\v!slanted
+ #1%
+ \else\ifx\emphasizedtypeface\v!italic
+ #2%
+ \else
+ \getvalue\emphasizedtypeface
+ \fi\fi
+ \else
+ \getvalue\emphasizedtypeface
+ \fi\fi\fi}
+
+\def\emphasistypeface{\doemphasistypeface\sl\it}
+\def\emphasisboldface{\doemphasistypeface\bs\bi}
+
+%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
+ \def\emphasistypeface{\it}\tf
+ \else\ifx\fontalternative\c!sl
+ \def\emphasistypeface{\sl}\tf
+ \else\ifx\fontalternative\c!bf
+ \emphasisboldface
+ \else\ifx\fontalternative\c!bs
+ \def\emphasisboldface{\bs}\bf
+ \else\ifx\fontalternative\c!bi
+ \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\savedemphasisboldface\bf
+ \let\setemphasisboldface\relax
+ \unexpanded\def\bf
+ {%\relax
+ \let\bf\relax % new
+ \ifx\fontalternative\c!it
+ \bi
+ \else\ifx\fontalternative\c!sl
+ \bs
+ \else
+ \savedemphasisboldface
+ \fi\fi
+ \let\bf\savedemphasisboldface}}
+
+%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=\/ % tex primitive
+
+\def\emphasiscorrection
+ {\ifhmode
+ \expandafter\emphasislook
+ \fi}
+
+\def\emphasislook
+ {\begingroup
+ \futurelet\next\emphasistest}
+
+\def\emphasistest
+ {\ifcat\noexpand\next,% still ok?
+ \expandafter\doemphasiscorrection
+ \else
+ \expandafter\dododoemphasiscorrection
+ \fi}
+
+\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}% hm, we need to use \setuplocalinterlinespace
+ \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.mkiv}
+
+%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.mkiv}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkiv}
+
+%D \macros
+%D {showkerning}
+%D
+%D A goody is:
+%D
+%D \showkerning{Can you guess what kerning is?}
+
+\fetchruntimecommand \showkerning {\f!fontprefix\s!run.mkiv}
+
+%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.mkiv}
+
+%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 \getbuffer
+
+% to be internationalized
+
+\fetchruntimecommand \showfont {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showligature {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkiv}
+
+%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 \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 Personally I think that using \TEX\ macro packages is
+%D complicated by the way fonts are handled. Apart from the
+%D many encodings, we also deal with different naming schemes.
+%D Confronted with this problem, I decided to change the
+%D 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!mm] [\c!mm]
+\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]
+
+\definefontalternative[\c!tf]
+\definefontalternative[\c!bf]
+\definefontalternative[\c!it]
+\definefontalternative[\c!sl]
+\definefontalternative[\c!bs]
+\definefontalternative[\c!bi]
+\definefontalternative[\c!sc]
+
+\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 {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% 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 \macros
+%D {definefontvariant,fontvariant,variant}
+%D
+%D This command is obsolete in \MKIV\ as we have features. It might
+%D come back using the local features handlers.
+
+\unexpanded\def\definefontvariant{\dotripleargument\dodefinefontvariant}
+
+\def\dodefinefontvariant[#1][#2][#3]{}
+\def\variant [#1]{}
+
+\ifdefined\Var\else \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}. Loading
+%D takes place elsewhere.
+%D
+%D For tracing purposes we define:
+
+\definefont[tinyfont][Mono at 1ex]
+
+% \tracinglostchars=1
+
+% this needs some interfacing
+%
+% \setupfonts[check=...]
+
+\def\checkcharactersinfont {\ctxlua{fonts.checkers.enable()}}
+\def\removemissingcharacters{\ctxlua{fonts.checkers.enable(true)}}
+
+%D New commands (not yet interfaced):
+
+\def\style[#1]% for inline usage, like \color
+ {\groupedcommand{\ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}{}}
+
+\unexpanded\def\startstyle[#1]%
+ {\begingroup
+ \ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}
+
+\unexpanded\def\stopstyle
+ {\endgroup}
+
+%D Still experimental (might even go away).
+
+% \definestylecollection[mine]
+
+% \definestyleinstance[mine][default][sorry]
+% \definestyleinstance[mine][tt][bs][ttbs:\rm\sl]
+% \definestyleinstance[mine][tt][bf][ttbf:\rm\sl]
+% \definestyleinstance[mine][bf][\sl]
+% \definestyleinstance[mine][sl][\tt]
+
+% {\bf test \mine test \sl test \mine test \bs oeps \mine oeps {\tt test \mine \bf test}}
+
+\unexpanded\def\definestylecollection
+ {\dosingleargument\dodefinestylecollection}
+
+\def\dodefinestylecollection[#1]%
+ {\iffirstargument
+ \setuvalue{#1}{\styleinstance[#1]}%
+ \def\docommand##1%
+ {\def\dodocommand####1{\letbeundefined{\??sx##1:####1:\commalistelement}}%
+ \processcommacommand[\fontalternativelist,\s!default]\dodocommand}%
+ \processcommacommand[\fontstylelist,\s!default]\docommand
+ \fi}
+
+\unexpanded\def\definestyleinstance
+ {\doquadrupleargument\dodefinestyleinstance}
+
+\def\dodefinestyleinstance[#1][#2][#3][#4]% [name] [rm|ss|tt|..] [sl|bf|...] [whatever]
+ {\iffirstargument
+ \ifcsname#1\endcsname\else\definestylecollection[#1]\fi
+ \fi
+ \iffourthargument
+ \setvalue{\??sx#1:#2:#3}{#4}%
+ \else\ifthirdargument
+ \setvalue{\??sx#1::#2}{#3}%
+ \else\ifsecondargument
+ \letvalue{\??sx#1::#2}\empty
+ \fi\fi\fi}
+
+\unexpanded\def\styleinstance[#1]% will be made faster
+ {%\begingroup\normalexpanded{\noexpand\infofont[#1:\fontstyle:\fontalternative]}\endgroup
+ \executeifdefined{\??sx#1:\fontstyle:\fontalternative}%
+ {\executeifdefined{\??sx#1:\fontstyle:\s!default}%
+ {\executeifdefined{\??sx#1::\fontalternative}
+ {\getvalue {\??sx#1::\s!default}}}}}
+
+% \unexpanded\def\styleinstance[#1]%
+% {\csname\??sx#1%
+% \ifcsname:\fontstyle:\fontalternative\endcsname
+% :\fontstyle:\fontalternative
+% \else\ifcsname:\fontstyle:\s!default\endcsname
+% :\fontstyle:\s!default
+% \else\ifcsname::\fontalternative\endcsname
+% ::\fontalternative
+% \else\ifcsname::\s!default\endcsname
+% ::\s!default
+% \else
+% % nothing, \relax
+% \fi\fi\fi\fi
+% \endcsname}
+
+%D goodies:
+
+\def\showchardata#1{\ctxlua{fonts.show_char_data("#1")}}
+\def\showfontdata {\ctxlua{fonts.show_font_parameters()}}
+
+%D some low level helpers
+%D
+%D \starttyping
+%D \def\TestLookup#1%
+%D {\dolookupfontbyspec{#1}
+%D pattern: #1, found: \dolookupnoffound
+%D \blank
+%D \dorecurse {\dolookupnoffound} {%
+%D \recurselevel:~\dolookupgetkeyofindex{fontname}{\recurselevel}\quad
+%D }%
+%D \blank}
+%D
+%D \TestLookup{familyname=helveticaneue}
+%D \TestLookup{familyname=helveticaneue,weight=bold}
+%D \TestLookup{familyname=helveticaneue,weight=bold,style=italic}
+%D \stoptyping
+
+% we can also move the lookups to the fonts.namespace (of commands)
+
+\def\dolookupfontbyspec #1{\ctxlua{fonts.names.lookup("#1")}}
+\def\dolookupnoffound {\ctxlua{tex.write(fonts.names.noflookups())}}
+\def\dolookupgetkeyofindex#1#2{\ctxlua{tex.write(fonts.names.getlookupkey("#1",#2))}}
+\def\dolookupgetkey #1{\ctxlua{tex.write(fonts.names.getlookupkey("#1"))}}
+\def\cleanfontname #1{\ctxlua{fonts.cleanname("#1")}}
+
+\protect \endinput
+
+% \startluacode
+% function commands.doifelsecurrentfonthasfeature(name)
+% local f = fonts.ids[font.current()]
+% f = f and f.shared
+% f = f and f.otfdata
+% f = f and f.luatex
+% f = f and f.features
+% commands.doifelse(f and (f.gpos[name] or f.gsub[name]))
+% end
+% \stopluacode
+
+% \def\doifelsecurrentfonthasfeature#1%
+% {\ctxlua{commands.doifelsecurrentfonthasfeature("#1")}}
+
+% \doifelsecurrentfonthasfeature{smcp}{YES}{NO}
+% \doifelsecurrentfonthasfeature{crap}{YES}{NO}
+% \doifelsecurrentfonthasfeature{kern}{YES}{NO}
diff --git a/tex/context/base/font-jap.mkii b/tex/context/base/font-jap.mkii
new file mode 100644
index 000000000..42480df43
--- /dev/null
+++ b/tex/context/base/font-jap.mkii
@@ -0,0 +1,83 @@
+%D \module
+%D [ file=font-jap,
+%D version=2006.01.13,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Japanese,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D suggestions=Wang Lei,
+%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.
+
+\ifx\handlejapaneseunicodeglyph\undefined \else \endinput \fi
+\ifx\handlechineseunicodeglyph \undefined \input font-chi.tex \fi
+
+\writestatus{loading}{ConTeXt Font Macros / Japanese}
+
+\unprotect
+
+\newif\iftracejapanese
+
+\let\japaneseencoding\empty
+
+\def\setjapaneseencoding
+ {\getfontfileparameters\unicodestyle
+ \ifx\currentfontfileencoding\undefined \else
+ \let\japaneseencoding\currentfontfileencoding
+ \fi}
+
+\def\japaneseunicodescale {\chineseunicodescale }
+\def\japaneseunicodeheight {\chineseunicodeheight }
+\def\japaneseunicodedepth {\chineseunicodedepth }
+\def\japaneseinterglyphskip{\chineseinterglyphskip}
+\def\japanesesurroundskip {\chinesesurroundskip }
+
+\setupunicodefont
+ [japanese]
+ [ \c!scale=\japaneseunicodescale,
+ \c!height=\japaneseunicodeheight,
+ \c!depth=\japaneseunicodedepth,
+ \c!strut=\v!yes,
+ \c!interlinespace=\v!yes,
+ \c!conversion=\japanesenumber,
+ \c!commands=\setjapaneseencoding, % needed for digits
+ \c!command=\handlejapaneseunicodeglyph]
+
+\def\japanesenumber{\numbers}
+
+\def\handlejapaneseunicodeglyph
+ {\begingroup
+% \let\chineseunicodescale \japaneseunicodescale
+% \let\chineseunicodeheight \japaneseunicodeheight
+% \let\chineseunicodedepth \japaneseunicodedepth
+% \let\chineseinterglyphskip\japaneseinterglyphskip
+% \let\chinesesurroundskip \japanesesurroundskip
+ \iftracejapanese\tracechinesetrue\else\tracechinesefalse\fi
+ \handlechineseunicodeglyph
+ \endgroup}
+
+\doifelse \currentregime {utf} {
+
+ % todo: typescripts
+
+ \definefontsynonym [JapaneseRegular] [uni-cybercjk-][encoding=cjk-uni]
+ \definefontsynonym [JapaneseSlanted] [uni-cybercjk-][encoding=cjk-uni]
+ \definefontsynonym [JapaneseItalic] [uni-cybercjk-][encoding=cjk-uni]
+ \definefontsynonym [JapaneseBold] [uni-cybercjk-][encoding=cjk-uni]
+ \definefontsynonym [JapaneseBoldSlanted][uni-cybercjk-][encoding=cjk-uni]
+ \definefontsynonym [JapaneseBoldItalic] [uni-cybercjk-][encoding=cjk-uni]
+
+ \loadmapfile[uni-cybercjk.map]
+
+ \defineunicodefont [Japanese] [Japanese] [japanese]
+
+} {
+ \writestatus{Japanese}{No fonts defined}
+}
+
+\Japanese
+
+\protect \endinput
diff --git a/tex/context/base/font-log.lua b/tex/context/base/font-log.lua
new file mode 100644
index 000000000..97cb4ff7c
--- /dev/null
+++ b/tex/context/base/font-log.lua
@@ -0,0 +1,58 @@
+if not modules then modules = { } end modules ['font-log'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, format, lower, concat = next, string.format, string.lower, table.concat
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+fonts.logger = fonts.logger or { }
+
+--[[ldx--
+<p>The following functions are used for reporting about the fonts
+used. The message itself is not that useful in regular runs but since
+we now have several readers it may be handy to know what reader is
+used for which font.</p>
+--ldx]]--
+
+function fonts.logger.save(tfmtable,source,specification) -- save file name in spec here ! ! ! ! ! !
+ if tfmtable and specification and specification.specification then
+ local name = lower(specification.name)
+ if trace_defining and not fonts.used[name] then
+ logs.report("define font","registering %s as %s (used: %s)",file.basename(specification.name),source,file.basename(specification.filename))
+ end
+ specification.source = source
+ fonts.loaded[lower(specification.specification)] = specification
+ -- fonts.used[name] = source
+ fonts.used[lower(specification.filename or specification.name)] = source
+ end
+end
+
+function fonts.logger.report(complete)
+ local t = { }
+ for name, used in table.sortedhash(fonts.used) do
+ if complete then
+ t[#t+1] = used .. "->" .. file.basename(name)
+ else
+ t[#t+1] = file.basename(name)
+ end
+ end
+ return t
+end
+
+function fonts.logger.format(name)
+ return fonts.used[name] or "unknown"
+end
+
+statistics.register("loaded fonts", function()
+ if next(fonts.used) then
+ local t = fonts.logger.report()
+ return (#t > 0 and format("%s files: %s",#t,concat(t,separator or " "))) or "none"
+ else
+ return nil
+ end
+end)
diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua
new file mode 100644
index 000000000..299508764
--- /dev/null
+++ b/tex/context/base/font-map.lua
@@ -0,0 +1,370 @@
+if not modules then modules = { } end modules ['font-map'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower
+local lpegmatch = lpeg.match
+local utfbyte = utf.byte
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local trace_unimapping = false trackers.register("otf.unimapping", function(v) trace_unimapping = v end)
+
+local ctxcatcodes = tex and tex.ctxcatcodes
+
+--[[ldx--
+<p>Eventually this code will disappear because map files are kind
+of obsolete. Some code may move to runtime or auxiliary modules.</p>
+<p>The name to unciode related code will stay of course.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.map = fonts.map or { }
+
+local function load_lum_table(filename) -- will move to font goodies
+ local lumname = file.replacesuffix(file.basename(filename),"lum")
+ local lumfile = resolvers.find_file(lumname,"map") or ""
+ if lumfile ~= "" and lfs.isfile(lumfile) then
+ if trace_loading or trace_unimapping then
+ logs.report("load otf","enhance: loading %s ",lumfile)
+ end
+ lumunic = dofile(lumfile)
+ return lumunic, lumfile
+ end
+end
+
+local hex = lpeg.R("AF","09")
+local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end
+local hexsix = (hex^1) / function(s) return tonumber(s,16) end
+local dec = (lpeg.R("09")^1) / tonumber
+local period = lpeg.P(".")
+
+local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true))
+local ucode = lpeg.P("u") * (hexsix * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexsix ^1) * lpeg.Cc(true))
+local index = lpeg.P("index") * dec * lpeg.Cc(false)
+
+local parser = unicode + ucode + index
+
+local parsers = { }
+
+local function make_name_parser(str)
+ if not str or str == "" then
+ return parser
+ else
+ local p = parsers[str]
+ if not p then
+ p = lpeg.P(str) * period * dec * lpeg.Cc(false)
+ parsers[str] = p
+ end
+ return p
+ end
+end
+
+--~ local parser = fonts.map.make_name_parser("Japan1")
+--~ local parser = fonts.map.make_name_parser()
+--~ local function test(str)
+--~ local b, a = lpegmatch(parser,str)
+--~ print((a and table.serialize(b)) or b)
+--~ end
+--~ test("a.sc")
+--~ test("a")
+--~ test("uni1234")
+--~ test("uni1234.xx")
+--~ test("uni12349876")
+--~ test("index1234")
+--~ test("Japan1.123")
+
+local function tounicode16(unicode)
+ if unicode < 0x10000 then
+ return format("%04X",unicode)
+ else
+ return format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+ end
+end
+
+local function tounicode16sequence(unicodes)
+ local t = { }
+ for l=1,#unicodes do
+ local unicode = unicodes[l]
+ if unicode < 0x10000 then
+ t[l] = format("%04X",unicode)
+ else
+ t[l] = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+ end
+ end
+ return concat(t)
+end
+
+--~ This is quite a bit faster but at the cost of some memory but if we
+--~ do this we will also use it elsewhere so let's not follow this route
+--~ now. I might use this method in the plain variant (no caching there)
+--~ but then I need a flag that distinguishes between code branches.
+--~
+--~ local cache = { }
+--~
+--~ function fonts.map.tounicode16(unicode)
+--~ local s = cache[unicode]
+--~ if not s then
+--~ if unicode < 0x10000 then
+--~ s = format("%04X",unicode)
+--~ else
+--~ s = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+--~ end
+--~ cache[unicode] = s
+--~ end
+--~ return s
+--~ end
+
+fonts.map.load_lum_table = load_lum_table
+fonts.map.make_name_parser = make_name_parser
+fonts.map.tounicode16 = tounicode16
+fonts.map.tounicode16sequence = tounicode16sequence
+
+local separator = lpeg.S("_.")
+local other = lpeg.C((1 - separator)^1)
+local ligsplitter = lpeg.Ct(other * (separator * other)^0)
+
+--~ print(table.serialize(lpegmatch(ligsplitter,"this")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"this.that")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"japan1.123")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that")))
+
+fonts.map.add_to_unicode = function(data,filename)
+ local unicodes = data.luatex and data.luatex.unicodes
+ if not unicodes then
+ return
+ end
+ -- we need to move this code
+ unicodes['space'] = unicodes['space'] or 32
+ unicodes['hyphen'] = unicodes['hyphen'] or 45
+ unicodes['zwj'] = unicodes['zwj'] or 0x200D
+ unicodes['zwnj'] = unicodes['zwnj'] or 0x200C
+ -- the tounicode mapping is sparse and only needed for alternatives
+ local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?"))
+ data.luatex.tounicode, data.luatex.originals = tounicode, originals
+ local lumunic, uparser, oparser
+ if false then -- will become an option
+ lumunic = load_lum_table(filename)
+ lumunic = lumunic and lumunic.tounicode
+ end
+ local cidinfo, cidnames, cidcodes = data.cidinfo
+ local usedmap = cidinfo and cidinfo.usedname
+ usedmap = usedmap and lower(usedmap)
+ usedmap = usedmap and fonts.cid.map[usedmap]
+ if usedmap then
+ oparser = usedmap and make_name_parser(cidinfo.ordering)
+ cidnames = usedmap.names
+ cidcodes = usedmap.unicodes
+ end
+ uparser = make_name_parser()
+ local aglmap = fonts.map and fonts.map.agl_to_unicode
+ for index, glyph in next, data.glyphs do
+ local name, unic = glyph.name, glyph.unicode or -1 -- play safe
+ if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then
+ local unicode = (lumunic and lumunic[name]) or (aglmap and aglmap[name])
+ if unicode then
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ end
+ -- cidmap heuristics, beware, there is no guarantee for a match unless
+ -- the chain resolves
+ if (not unicode) and usedmap then
+ local foundindex = lpegmatch(oparser,name)
+ if foundindex then
+ unicode = cidcodes[foundindex] -- name to number
+ if unicode then
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ else
+ local reference = cidnames[foundindex] -- number to name
+ if reference then
+ local foundindex = lpegmatch(oparser,reference)
+ if foundindex then
+ unicode = cidcodes[foundindex]
+ if unicode then
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ end
+ end
+ if not unicode then
+ local foundcodes, multiple = lpegmatch(uparser,reference)
+ if foundcodes then
+ if multiple then
+ originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true
+ else
+ originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ -- a.whatever or a_b_c.whatever or a_b_c (no numbers)
+ if not unicode then
+ local split = lpegmatch(ligsplitter,name)
+ local nplit = (split and #split) or 0
+ if nplit == 0 then
+ -- skip
+ elseif nplit == 1 then
+ local base = split[1]
+ unicode = unicodes[base] or (aglmap and aglmap[base])
+ if unicode then
+ if type(unicode) == "table" then
+ unicode = unicode[1]
+ end
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ end
+ else
+ local t = { }
+ for l=1,nplit do
+ local base = split[l]
+ local u = unicodes[base] or (aglmap and aglmap[base])
+ if not u then
+ break
+ elseif type(u) == "table" then
+ t[#t+1] = u[1]
+ else
+ t[#t+1] = u
+ end
+ end
+ if #t > 0 then -- done then
+ originals[index], tounicode[index], nl, unicode = t, tounicode16sequence(t), nl + 1, true
+ end
+ end
+ end
+ -- last resort
+ if not unicode then
+ local foundcodes, multiple = lpegmatch(uparser,name)
+ if foundcodes then
+ if multiple then
+ originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true
+ else
+ originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes
+ end
+ end
+ end
+ if not unicode then
+ originals[index], tounicode[index] = 0xFFFD, "FFFD"
+ end
+ end
+ end
+ if trace_unimapping then
+ for index, glyph in table.sortedhash(data.glyphs) do
+ local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe
+ if toun then
+ logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
+ else
+ logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic)
+ end
+ end
+ end
+ if trace_loading and (ns > 0 or nl > 0) then
+ logs.report("load otf","enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns)
+ end
+end
+
+-- the following is sort of obsolete
+--
+-- fonts.map.data = fonts.map.data or { }
+-- fonts.map.encodings = fonts.map.encodings or { }
+-- fonts.map.loaded = fonts.map.loaded or { }
+-- fonts.map.line = fonts.map.line or { }
+--
+-- function fonts.map.line.pdftex(e)
+-- if e.name and e.fontfile then
+-- local fullname = e.fullname or ""
+-- if e.slant and e.slant ~= 0 then
+-- if e.encoding then
+-- pdf.mapline(format('= %s %s "%g SlantFont" <%s <%s',e.name,fullname,e.slant,e.encoding,e.fontfile)))
+-- else
+-- pdf.mapline(format('= %s %s "%g SlantFont" <%s',e.name,fullname,e.slant,e.fontfile)))
+-- end
+-- elseif e.extend and e.extend ~= 1 and e.extend ~= 0 then
+-- if e.encoding then
+-- pdf.mapline(format('= %s %s "%g ExtendFont" <%s <%s',e.name,fullname,e.extend,e.encoding,e.fontfile)))
+-- else
+-- pdf.mapline(format('= %s %s "%g ExtendFont" <%s',e.name,fullname,e.extend,e.fontfile)))
+-- end
+-- else
+-- if e.encoding then
+-- pdf.mapline(format('= %s %s <%s <%s',e.name,fullname,e.encoding,e.fontfile)))
+-- else
+-- pdf.mapline(format('= %s %s <%s',e.name,fullname,e.fontfile)))
+-- end
+-- end
+-- else
+-- return nil
+-- end
+-- end
+--
+-- function fonts.map.flush(backend) -- will also erase the accumulated data
+-- local flushline = fonts.map.line[backend or "pdftex"] or fonts.map.line.pdftex
+-- for _, e in next, fonts.map.data do
+-- flushline(e)
+-- end
+-- fonts.map.data = { }
+-- end
+--
+-- fonts.map.line.dvips = fonts.map.line.pdftex
+-- fonts.map.line.dvipdfmx = function() end
+--
+-- function fonts.map.convert_entries(filename)
+-- if not fonts.map.loaded[filename] then
+-- fonts.map.data, fonts.map.encodings = fonts.map.load_file(filename,fonts.map.data, fonts.map.encodings)
+-- fonts.map.loaded[filename] = true
+-- end
+-- end
+--
+-- function fonts.map.load_file(filename, entries, encodings)
+-- entries = entries or { }
+-- encodings = encodings or { }
+-- local f = io.open(filename)
+-- if f then
+-- local data = f:read("*a")
+-- if data then
+-- for line in gmatch(data,"(.-)[\n\t]") do
+-- if find(line,"^[%#%%%s]") then
+-- -- print(line)
+-- else
+-- local extend, slant, name, fullname, fontfile, encoding
+-- line = gsub(line,'"(.+)"', function(s)
+-- extend = find(s,'"([^"]+) ExtendFont"')
+-- slant = find(s,'"([^"]+) SlantFont"')
+-- return ""
+-- end)
+-- if not name then
+-- -- name fullname encoding fontfile
+-- name, fullname, encoding, fontfile = match(line,"^(%S+)%s+(%S*)[%s<]+(%S*)[%s<]+(%S*)%s*$")
+-- end
+-- if not name then
+-- -- name fullname (flag) fontfile encoding
+-- name, fullname, fontfile, encoding = match(line,"^(%S+)%s+(%S*)[%d%s<]+(%S*)[%s<]+(%S*)%s*$")
+-- end
+-- if not name then
+-- -- name fontfile
+-- name, fontfile = match(line,"^(%S+)%s+[%d%s<]+(%S*)%s*$")
+-- end
+-- if name then
+-- if encoding == "" then encoding = nil end
+-- entries[name] = {
+-- name = name, -- handy
+-- fullname = fullname,
+-- encoding = encoding,
+-- fontfile = fontfile,
+-- slant = tonumber(slant),
+-- extend = tonumber(extend)
+-- }
+-- encodings[name] = encoding
+-- elseif line ~= "" then
+-- -- print(line)
+-- end
+-- end
+-- end
+-- end
+-- f:close()
+-- end
+-- return entries, encodings
+-- end
diff --git a/tex/context/base/font-mis.lua b/tex/context/base/font-mis.lua
new file mode 100644
index 000000000..80a56332a
--- /dev/null
+++ b/tex/context/base/font-mis.lua
@@ -0,0 +1,101 @@
+if not modules then modules = { } end modules ['font-mis'] = {
+ version = 1.001,
+ comment = "companion to luatex-fonts.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next = next
+local lower, strip = string.lower, string.strip
+
+fonts.otf = fonts.otf or { }
+
+fonts.otf.version = fonts.otf.version or 2.650
+fonts.otf.pack = true
+fonts.otf.cache = containers.define("fonts", "otf", fonts.otf.version, true)
+
+function fonts.otf.loadcached(filename,format,sub)
+ -- no recache when version mismatch
+ local name = file.basename(file.removesuffix(filename))
+ if sub == "" then sub = false end
+ local hash = name
+ if sub then
+ hash = hash .. "-" .. sub
+ end
+ hash = containers.cleanname(hash)
+ local data = containers.read(fonts.otf.cache(), hash)
+ if data and not data.verbose then
+ fonts.otf.enhancers.unpack(data)
+ return data
+ else
+ return nil
+ end
+end
+
+local featuregroups = { "gsub", "gpos" }
+
+function fonts.get_features(name,t,script,language)
+ local t = lower(t or (name and file.extname(name)) or "")
+ if t == "otf" or t == "ttf" or t == "ttc" or t == "dfont" then
+ local filename = resolvers.find_file(name,t) or ""
+ if filename ~= "" then
+ local data = fonts.otf.loadcached(filename)
+ if data and data.luatex and data.luatex.features then
+ return data.luatex.features
+ else
+ local ff = fontloader.open(filename)
+ if ff then
+ local data = fontloader.to_table(ff)
+ fontloader.close(ff)
+ local features = { }
+ for k=1,#featuregroups do
+ local what = featuregroups[k]
+ local dw = data[what]
+ if dw then
+ local f = { }
+ features[what] = f
+ for i=1,#dw do
+ local d = dw[i]
+ local dfeatures = d.features
+ if dfeatures then
+ for i=1,#dfeatures do
+ local df = dfeatures[i]
+ local tag = strip(lower(df.tag))
+ local ft = f[tag] if not ft then ft = {} f[tag] = ft end
+ local dfscripts = df.scripts
+ for i=1,#dfscripts do
+ local ds = dfscripts[i]
+ local scri = strip(lower(ds.script))
+ local fts = ft[scri] if not fts then fts = {} ft[scri] = fts end
+ local dslangs = ds.langs
+ for i=1,#dslangs do
+ local lang = dslangs[i]
+ lang = strip(lower(lang))
+ if scri == script then
+ if lang == language then
+ fts[lang] = 'sl'
+ else
+ fts[lang] = 's'
+ end
+ else
+ if lang == language then
+ fts[lang] = 'l'
+ else
+ fts[lang] = true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return features
+ end
+ end
+ end
+ end
+ return nil, nil
+end
diff --git a/tex/context/base/font-ota.lua b/tex/context/base/font-ota.lua
new file mode 100644
index 000000000..0b61e17d1
--- /dev/null
+++ b/tex/context/base/font-ota.lua
@@ -0,0 +1,286 @@
+if not modules then modules = { } end modules ['font-ota'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (analysing)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this might become scrp-*.lua
+
+local type, tostring, match, format, concat = type, tostring, string.match, string.format, table.concat
+
+if not trackers then trackers = { register = function() end } end
+
+local trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
+local trace_cjk = false trackers.register("cjk.injections", function(v) trace_cjk = v end)
+
+trackers.register("cjk.analyzing","otf.analyzing")
+
+fonts = fonts or { }
+fonts.analyzers = fonts.analyzers or { }
+fonts.analyzers.initializers = fonts.analyzers.initializers or { node = { otf = { } } }
+fonts.analyzers.methods = fonts.analyzers.methods or { node = { otf = { } } }
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local initializers = fonts.analyzers.initializers
+local methods = fonts.analyzers.methods
+
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local penalty = node.id('penalty')
+
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local traverse_node_list = node.traverse
+
+local fontdata = fonts.ids
+local state = attributes.private('state')
+
+local fcs = (fonts.color and fonts.color.set) or function() end
+local fcr = (fonts.color and fonts.color.reset) or function() end
+
+local a_to_script = otf.a_to_script
+local a_to_language = otf.a_to_language
+
+-- in the future we will use language/script attributes instead of the
+-- font related value, but then we also need dynamic features which is
+-- somewhat slower; and .. we need a chain of them
+
+function fonts.initializers.node.otf.analyze(tfmdata,value,attr)
+ if attr and attr > 0 then
+ script, language = a_to_script[attr], a_to_language[attr]
+ else
+ script, language = tfmdata.script, tfmdata.language
+ end
+ local action = initializers[script]
+ if action then
+ if type(action) == "function" then
+ return action(tfmdata,value)
+ else
+ local action = action[language]
+ if action then
+ return action(tfmdata,value)
+ end
+ end
+ end
+ return nil
+end
+
+function fonts.methods.node.otf.analyze(head,font,attr)
+ local tfmdata = fontdata[font]
+ local script, language
+ if attr and attr > 0 then
+ script, language = a_to_script[attr], a_to_language[attr]
+ else
+ script, language = tfmdata.script, tfmdata.language
+ end
+ local action = methods[script]
+ if action then
+ if type(action) == "function" then
+ return action(head,font,attr)
+ else
+ action = action[language]
+ if action then
+ return action(head,font,attr)
+ end
+ end
+ end
+ return head, false
+end
+
+otf.features.register("analyze",true) -- we always analyze
+table.insert(fonts.triggers,"analyze") -- we need a proper function for doing this
+
+-- latin
+
+fonts.analyzers.methods.latn = fonts.analyzers.aux.setstate
+
+-- this info eventually will go into char-def
+
+local zwnj = 0x200C
+local zwj = 0x200D
+
+local isol = {
+ [0x0600] = true, [0x0601] = true, [0x0602] = true, [0x0603] = true,
+ [0x0608] = true, [0x060B] = true, [0x0621] = true, [0x0674] = true,
+ [0x06DD] = true, [zwnj] = true,
+}
+
+local isol_fina = {
+ [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true,
+ [0x0627] = true, [0x0629] = true, [0x062F] = true, [0x0630] = true,
+ [0x0631] = true, [0x0632] = true, [0x0648] = true, [0x0671] = true,
+ [0x0672] = true, [0x0673] = true, [0x0675] = true, [0x0676] = true,
+ [0x0677] = true, [0x0688] = true, [0x0689] = true, [0x068A] = true,
+ [0x068B] = true, [0x068C] = true, [0x068D] = true, [0x068E] = true,
+ [0x068F] = true, [0x0690] = true, [0x0691] = true, [0x0692] = true,
+ [0x0693] = true, [0x0694] = true, [0x0695] = true, [0x0696] = true,
+ [0x0697] = true, [0x0698] = true, [0x0699] = true, [0x06C0] = true,
+ [0x06C3] = true, [0x06C4] = true, [0x06C5] = true, [0x06C6] = true,
+ [0x06C7] = true, [0x06C8] = true, [0x06C9] = true, [0x06CA] = true,
+ [0x06CB] = true, [0x06CD] = true, [0x06CF] = true, [0x06D2] = true,
+ [0x06D3] = true, [0x06D5] = true, [0x06EE] = true, [0x06EF] = true,
+ [0x0759] = true, [0x075A] = true, [0x075B] = true, [0x076B] = true,
+ [0x076C] = true, [0x0771] = true, [0x0773] = true, [0x0774] = true,
+ [0x0778] = true, [0x0779] = true, [0xFEF5] = true, [0xFEF7] = true,
+ [0xFEF9] = true, [0xFEFB] = true,
+}
+
+local isol_fina_medi_init = {
+ [0x0626] = true, [0x0628] = true, [0x062A] = true, [0x062B] = true,
+ [0x062C] = true, [0x062D] = true, [0x062E] = true, [0x0633] = true,
+ [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true,
+ [0x0638] = true, [0x0639] = true, [0x063A] = true, [0x063B] = true,
+ [0x063C] = true, [0x063D] = true, [0x063E] = true, [0x063F] = true,
+ [0x0640] = true, [0x0641] = true, [0x0642] = true, [0x0643] = true,
+ [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true,
+ [0x0649] = true, [0x064A] = true, [0x066E] = true, [0x066F] = true,
+ [0x0678] = true, [0x0679] = true, [0x067A] = true, [0x067B] = true,
+ [0x067C] = true, [0x067D] = true, [0x067E] = true, [0x067F] = true,
+ [0x0680] = true, [0x0681] = true, [0x0682] = true, [0x0683] = true,
+ [0x0684] = true, [0x0685] = true, [0x0686] = true, [0x0687] = true,
+ [0x069A] = true, [0x069B] = true, [0x069C] = true, [0x069D] = true,
+ [0x069E] = true, [0x069F] = true, [0x06A0] = true, [0x06A1] = true,
+ [0x06A2] = true, [0x06A3] = true, [0x06A4] = true, [0x06A5] = true,
+ [0x06A6] = true, [0x06A7] = true, [0x06A8] = true, [0x06A9] = true,
+ [0x06AA] = true, [0x06AB] = true, [0x06AC] = true, [0x06AD] = true,
+ [0x06AE] = true, [0x06AF] = true, [0x06B0] = true, [0x06B1] = true,
+ [0x06B2] = true, [0x06B3] = true, [0x06B4] = true, [0x06B5] = true,
+ [0x06B6] = true, [0x06B7] = true, [0x06B8] = true, [0x06B9] = true,
+ [0x06BA] = true, [0x06BB] = true, [0x06BC] = true, [0x06BD] = true,
+ [0x06BE] = true, [0x06BF] = true, [0x06C1] = true, [0x06C2] = true,
+ [0x06CC] = true, [0x06CE] = true, [0x06D0] = true, [0x06D1] = true,
+ [0x06FA] = true, [0x06FB] = true, [0x06FC] = true, [0x06FF] = true,
+ [0x0750] = true, [0x0751] = true, [0x0752] = true, [0x0753] = true,
+ [0x0754] = true, [0x0755] = true, [0x0756] = true, [0x0757] = true,
+ [0x0758] = true, [0x075C] = true, [0x075D] = true, [0x075E] = true,
+ [0x075F] = true, [0x0760] = true, [0x0761] = true, [0x0762] = true,
+ [0x0763] = true, [0x0764] = true, [0x0765] = true, [0x0766] = true,
+ [0x0767] = true, [0x0768] = true, [0x0769] = true, [0x076A] = true,
+ [0x076D] = true, [0x076E] = true, [0x076F] = true, [0x0770] = true,
+ [0x0772] = true, [0x0775] = true, [0x0776] = true, [0x0777] = true,
+ [0x077A] = true, [0x077B] = true, [0x077C] = true, [0x077D] = true,
+ [0x077E] = true, [0x077F] = true, [zwj] = true,
+}
+
+local arab_warned = { }
+
+-- todo: gref
+
+local function warning(current,what)
+ local char = current.char
+ if not arab_warned[char] then
+ log.report("analyze","arab: character %s (U+%04X) has no %s class", char, char, what)
+ arab_warned[char] = true
+ end
+end
+
+function fonts.analyzers.methods.nocolor(head,font,attr)
+ for n in traverse_node_list(head,glyph) do
+ if not font or n.font == font then
+ fcr(n)
+ end
+ end
+ return head, true
+end
+
+local function finish(first,last)
+ if last then
+ if first == last then
+ local fc = first.char
+ if isol_fina_medi_init[fc] or isol_fina[fc] then
+ set_attribute(first,state,4) -- isol
+ if trace_analyzing then fcs(first,"font:isol") end
+ else
+ warning(first,"isol")
+ set_attribute(first,state,0) -- error
+ if trace_analyzing then fcr(first) end
+ end
+ else
+ local lc = last.char
+ if isol_fina_medi_init[lc] or isol_fina[lc] then -- why isol here ?
+ -- if laststate == 1 or laststate == 2 or laststate == 4 then
+ set_attribute(last,state,3) -- fina
+ if trace_analyzing then fcs(last,"font:fina") end
+ else
+ warning(last,"fina")
+ set_attribute(last,state,0) -- error
+ if trace_analyzing then fcr(last) end
+ end
+ end
+ first, last = nil, nil
+ elseif first then
+ -- first and last are either both set so we never com here
+ local fc = first.char
+ if isol_fina_medi_init[fc] or isol_fina[fc] then
+ set_attribute(first,state,4) -- isol
+ if trace_analyzing then fcs(first,"font:isol") end
+ else
+ warning(first,"isol")
+ set_attribute(first,state,0) -- error
+ if trace_analyzing then fcr(first) end
+ end
+ first = nil
+ end
+ return first, last
+end
+
+function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special version with no trace
+ local tfmdata = fontdata[font]
+ local marks = tfmdata.marks
+ local first, last, current, done = nil, nil, head, false
+ while current do
+ if current.id == glyph and current.subtype<256 and current.font == font and not has_attribute(current,state) then
+ done = true
+ local char = current.char
+ if marks[char] then
+ set_attribute(current,state,5) -- mark
+ if trace_analyzing then fcs(current,"font:mark") end
+ elseif isol[char] then -- can be zwj or zwnj too
+ first, last = finish(first,last)
+ set_attribute(current,state,4) -- isol
+ if trace_analyzing then fcs(current,"font:isol") end
+ first, last = nil, nil
+ elseif not first then
+ if isol_fina_medi_init[char] then
+ set_attribute(current,state,1) -- init
+ if trace_analyzing then fcs(current,"font:init") end
+ first, last = first or current, current
+ elseif isol_fina[char] then
+ set_attribute(current,state,4) -- isol
+ if trace_analyzing then fcs(current,"font:isol") end
+ first, last = nil, nil
+ else -- no arab
+ first, last = finish(first,last)
+ end
+ elseif isol_fina_medi_init[char] then
+ first, last = first or current, current
+ set_attribute(current,state,2) -- medi
+ if trace_analyzing then fcs(current,"font:medi") end
+ elseif isol_fina[char] then
+ if not has_attribute(last,state,1) then
+ -- tricky, we need to check what last may be !
+ set_attribute(last,state,2) -- medi
+ if trace_analyzing then fcs(last,"font:medi") end
+ end
+ set_attribute(current,state,3) -- fina
+ if trace_analyzing then fcs(current,"font:fina") end
+ first, last = nil, nil
+ elseif char >= 0x0600 and char <= 0x06FF then
+ if trace_analyzing then fcs(current,"font:rest") end
+ first, last = finish(first,last)
+ else --no
+ first, last = finish(first,last)
+ end
+ else
+ first, last = finish(first,last)
+ end
+ current = current.next
+ end
+ first, last = finish(first,last)
+ return head, done
+end
diff --git a/tex/context/base/font-otb.lua b/tex/context/base/font-otb.lua
new file mode 100644
index 000000000..a3d347737
--- /dev/null
+++ b/tex/context/base/font-otb.lua
@@ -0,0 +1,373 @@
+if not modules then modules = { } end modules ['font-otb'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local concat = table.concat
+local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local lpegmatch = lpeg.match
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
+local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
+local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
+local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
+local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
+local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
+local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
+
+local wildcard = "*"
+local default = "dflt"
+
+local split_at_space = lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+
+local pcache, fcache = { }, { } -- could be weak
+
+local function gref(descriptions,n)
+ if type(n) == "number" then
+ local name = descriptions[n].name
+ if name then
+ return format("U+%04X (%s)",n,name)
+ else
+ return format("U+%04X")
+ end
+ elseif n then
+ local num, nam = { }, { }
+ for i=1,#n do
+ local ni = n[i]
+ num[i] = format("U+%04X",ni)
+ nam[i] = descriptions[ni].name or "?"
+ end
+ return format("%s (%s)",concat(num," "), concat(nam," "))
+ else
+ return "?"
+ end
+end
+
+local function cref(kind,lookupname)
+ if lookupname then
+ return format("feature %s, lookup %s",kind,lookupname)
+ else
+ return format("feature %s",kind)
+ end
+end
+
+local function resolve_ligatures(tfmdata,ligatures,kind)
+ kind = kind or "unknown"
+ local unicodes = tfmdata.unicodes
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local changed = tfmdata.changed
+ local done = { }
+ while true do
+ local ok = false
+ for k,v in next, ligatures do
+ local lig = v[1]
+ if not done[lig] then
+ local ligs = lpegmatch(split_at_space,lig)
+ if #ligs == 2 then
+ local uc = v[2]
+ local c, f, s = characters[uc], ligs[1], ligs[2]
+ local uft, ust = unicodes[f] or 0, unicodes[s] or 0
+ if not uft or not ust then
+ logs.report("define otf","%s: unicode problem with base ligature %s = %s + %s",cref(kind),gref(descriptions,uc),gref(descriptions,uft),gref(descriptions,ust))
+ -- 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_baseinit and trace_ligatures then
+ logs.report("define otf","%s: base ligature %s + %s ignored",cref(kind),gref(descriptions,uf),gref(descriptions,us))
+ end
+ else
+ local first, second = characters[uf], us
+ if first and second then
+ local t = first.ligatures
+ if not t then
+ t = { }
+ first.ligatures = t
+ end
+ if type(uc) == "number" then
+ t[second] = { type = 0, char = uc }
+ else
+ t[second] = { type = 0, char = uc[1] } -- can this still happen?
+ end
+ if trace_baseinit and trace_ligatures then
+ logs.report("define otf","%s: base ligature %s + %s => %s",cref(kind),gref(descriptions,uf),gref(descriptions,us),gref(descriptions,uc))
+ end
+ end
+ end
+ end
+ end
+ end
+ ok, done[lig] = true, descriptions[uc].name
+ end
+ end
+ end
+ if ok then
+ -- done has "a b c" = "a_b_c" and ligatures the already set ligatures: "a b" = 123
+ -- and here we add extras (f i i = fi + i and alike)
+ --
+ -- we could use a hash for fnc and pattern
+ --
+ -- this might be interfering !
+ for d,n in next, done do
+ local pattern = pcache[d] if not pattern then pattern = "^(" .. d .. ") " pcache[d] = pattern end
+ local fnc = fcache[n] if not fnc then fnc = function() return n .. " " end fcache[n] = fnc end
+ for k,v in next, ligatures do
+ v[1] = gsub(v[1],pattern,fnc)
+ end
+ end
+ else
+ break
+ end
+ end
+end
+
+local splitter = lpeg.splitat(" ")
+
+function prepare_base_substitutions(tfmdata,kind,value) -- we can share some code with the node features
+ if value then
+ local otfdata = tfmdata.shared.otfdata
+ local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
+ if validlookups then
+ local ligatures = { }
+ local unicodes = tfmdata.unicodes -- names to unicodes
+ local indices = tfmdata.indices
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local changed = tfmdata.changed
+ --
+ local actions = {
+ substitution = function(p,lookup,k,glyph,unicode)
+ local pv = p[2] -- p.variant
+ if pv then
+ local upv = unicodes[pv]
+ if upv then
+ if type(upv) == "table" then
+ upv = upv[1]
+ end
+ if characters[upv] then
+ if trace_baseinit and trace_singles then
+ logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv))
+ end
+ changed[k] = upv
+ end
+ end
+ end
+ end,
+ alternate = function(p,lookup,k,glyph,unicode)
+ local pc = p[2] -- p.components
+ if pc then
+ -- a bit optimized ugliness
+ if value == 1 then
+ pc = lpegmatch(splitter,pc)
+ elseif value == 2 then
+ local a, b = lpegmatch(splitter,pc)
+ pc = b or a
+ else
+ pc = { lpegmatch(splitter,pc) }
+ pc = pc[value] or pc[#pc]
+ end
+ if pc then
+ local upc = unicodes[pc]
+ if upc then
+ if type(upc) == "table" then
+ upc = upc[1]
+ end
+ if characters[upc] then
+ if trace_baseinit and trace_alternatives then
+ logs.report("define otf","%s: base alternate %s %s => %s",cref(kind,lookup),tostring(value),gref(descriptions,k),gref(descriptions,upc))
+ end
+ changed[k] = upc
+ end
+ end
+ end
+ end
+ end,
+ ligature = function(p,lookup,k,glyph,unicode)
+ local pc = p[2]
+ if pc then
+ if trace_baseinit and trace_ligatures then
+ local upc = { lpegmatch(splitter,pc) }
+ for i=1,#upc do upc[i] = unicodes[upc[i]] end
+ -- we assume that it's no table
+ logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k))
+ end
+ ligatures[#ligatures+1] = { pc, k }
+ end
+ end,
+ }
+ --
+ for k,c in next, characters do
+ local glyph = descriptions[k]
+ local lookups = glyph.slookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local p = lookups[lookup]
+ if p then
+ local a = actions[p[1]]
+ if a then
+ a(p,lookup,k,glyph,unicode)
+ end
+ end
+ end
+ end
+ local lookups = glyph.mlookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local ps = lookups[lookup]
+ if ps then
+ for i=1,#ps do
+ local p = ps[i]
+ local a = actions[p[1]]
+ if a then
+ a(p,lookup,k,glyph,unicode)
+ end
+ end
+ end
+ end
+ end
+ end
+ resolve_ligatures(tfmdata,ligatures,kind)
+ end
+ else
+ tfmdata.ligatures = tfmdata.ligatures or { } -- left over from what ?
+ end
+end
+
+local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all
+ if value then
+ local otfdata = tfmdata.shared.otfdata
+ local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
+ if validlookups then
+ local unicodes = tfmdata.unicodes -- names to unicodes
+ local indices = tfmdata.indices
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local sharedkerns = { }
+ for u, chr in next, characters do
+ local d = descriptions[u]
+ if d then
+ local dk = d.mykerns -- shared
+ if dk then
+ local s = sharedkerns[dk]
+ if s == false then
+ -- skip
+ elseif s then
+ chr.kerns = s
+ else
+ local t, done = chr.kerns or { }, false
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local kerns = dk[lookup]
+ if kerns then
+ for k, v in next, kerns do
+ if v ~= 0 and not t[k] then -- maybe no 0 test here
+ t[k], done = v, true
+ if trace_baseinit and trace_kerns then
+ logs.report("define otf","%s: base kern %s + %s => %s",cref(kind,lookup),gref(descriptions,u),gref(descriptions,k),v)
+ end
+ end
+ end
+ end
+ end
+ if done then
+ sharedkerns[dk] = t
+ chr.kerns = t -- no empty assignments
+ else
+ sharedkerns[dk] = false
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+-- In principle we could register each feature individually which was
+-- what we did in earlier versions. However, after the rewrite it
+-- made more sense to collect them in an overall features initializer
+-- just as with the node variant. There it was needed because we need
+-- to do complete mixed runs and not run featurewise (as we did before).
+
+local supported_gsub = {
+ 'liga', 'dlig', 'rlig', 'hlig',
+ 'pnum', 'onum', 'tnum', 'lnum',
+ 'zero',
+ 'smcp', 'cpsp', 'c2sc', 'ornm', 'aalt',
+ 'hwid', 'fwid',
+ 'ssty', 'rtlm', -- math
+-- 'tlig', 'trep',
+}
+
+local supported_gpos = {
+ 'kern'
+}
+
+function otf.features.register_base_substitution(tag)
+ supported_gsub[#supported_gsub+1] = tag
+end
+function otf.features.register_base_kern(tag)
+ supported_gsub[#supported_gpos+1] = tag
+end
+
+local basehash, basehashes = { }, 1
+
+function fonts.initializers.base.otf.features(tfmdata,value)
+ if true then -- value then
+ -- not shared
+ local t = trace_preparing and os.clock()
+ local features = tfmdata.shared.features
+ if features then
+ local h = { }
+ for f=1,#supported_gsub do
+ local feature = supported_gsub[f]
+ local value = features[feature]
+ prepare_base_substitutions(tfmdata,feature,value)
+ if value then
+ h[#h+1] = feature .. "=" .. tostring(value)
+ end
+ end
+ for f=1,#supported_gpos do
+ local feature = supported_gpos[f]
+ local value = features[feature]
+ prepare_base_kerns(tfmdata,feature,features[feature])
+ if value then
+ h[#h+1] = feature .. "=" .. tostring(value)
+ end
+ end
+ local hash = concat(h," ")
+ local base = basehash[hash]
+ if not base then
+ basehashes = basehashes + 1
+ base = basehashes
+ basehash[hash] = base
+ end
+ -- We need to make sure that luatex sees the difference between
+ -- base fonts that have different glyphs in the same slots in fonts
+ -- that have the same fullname (or filename). LuaTeX will merge fonts
+ -- eventually (and subset later on). If needed we can use a more
+ -- verbose name as long as we don't use <()<>[]{}/%> and the length
+ -- is < 128.
+ tfmdata.fullname = tfmdata.fullname .. "-" .. base -- tfmdata.psname is the original
+ --~ logs.report("otf define","fullname base hash: '%s', featureset '%s'",tfmdata.fullname,hash)
+ end
+ if trace_preparing then
+ logs.report("otf define","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ end
+ end
+end
diff --git a/tex/context/base/font-otc.lua b/tex/context/base/font-otc.lua
new file mode 100644
index 000000000..357d347b1
--- /dev/null
+++ b/tex/context/base/font-otc.lua
@@ -0,0 +1,213 @@
+if not modules then modules = { } end modules ['font-otc'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (context)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, insert = string.format, table.insert
+local type, next = type, next
+
+-- we assume that the other otf stuff is loaded already
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+-- instead of "script = "DFLT", langs = { 'dflt' }" we now use wildcards (we used to
+-- have always); some day we can write a "force always when true" trick for other
+-- features as well
+--
+-- we could have a tnum variant as well
+
+local extra_lists = {
+ tlig = {
+ {
+ endash = "hyphen hyphen",
+ emdash = "hyphen hyphen hyphen",
+ -- quotedblleft = "quoteleft quoteleft",
+ -- quotedblright = "quoteright quoteright",
+ -- quotedblleft = "grave grave",
+ -- quotedblright = "quotesingle quotesingle",
+ -- quotedblbase = "comma comma",
+ },
+ },
+ trep = {
+ {
+ -- [0x0022] = 0x201D,
+ [0x0027] = 0x2019,
+ -- [0x0060] = 0x2018,
+ },
+ },
+ anum = {
+ { -- arabic
+ [0x0030] = 0x0660,
+ [0x0031] = 0x0661,
+ [0x0032] = 0x0662,
+ [0x0033] = 0x0663,
+ [0x0034] = 0x0664,
+ [0x0035] = 0x0665,
+ [0x0036] = 0x0666,
+ [0x0037] = 0x0667,
+ [0x0038] = 0x0668,
+ [0x0039] = 0x0669,
+ },
+ { -- persian
+ [0x0030] = 0x06F0,
+ [0x0031] = 0x06F1,
+ [0x0032] = 0x06F2,
+ [0x0033] = 0x06F3,
+ [0x0034] = 0x06F4,
+ [0x0035] = 0x06F5,
+ [0x0036] = 0x06F6,
+ [0x0037] = 0x06F7,
+ [0x0038] = 0x06F8,
+ [0x0039] = 0x06F9,
+ },
+ },
+}
+
+local extra_features = { -- maybe just 1..n so that we prescribe order
+ tlig = {
+ {
+ features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "tlig", comment = "added bij mkiv" }, },
+ name = "ctx_tlig_1",
+ subtables = { { name = "ctx_tlig_1_s" } },
+ type = "gsub_ligature",
+ flags = { },
+ },
+ },
+ trep = {
+ {
+ features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "trep", comment = "added bij mkiv" }, },
+ name = "ctx_trep_1",
+ subtables = { { name = "ctx_trep_1_s" } },
+ type = "gsub_single",
+ flags = { },
+ },
+ },
+ anum = {
+ {
+ features = { { scripts = { { script = "arab", langs = { "dflt", "FAR" }, } }, tag = "anum", comment = "added bij mkiv" }, },
+ name = "ctx_anum_1",
+ subtables = { { name = "ctx_anum_1_s" } },
+ type = "gsub_single",
+ flags = { },
+ },
+ {
+ features = { { scripts = { { script = "arab", langs = { "URD" }, } }, tag = "anum", comment = "added bij mkiv" }, },
+ name = "ctx_anum_2",
+ subtables = { { name = "ctx_anum_2_s" } },
+ type = "gsub_single",
+ flags = { },
+ },
+ },
+}
+
+fonts.otf.enhancers["add some missing characters"] = function(data,filename)
+ -- todo
+end
+
+fonts.otf.enhancers["enrich with features"] = function(data,filename)
+ -- could be done elsewhere (true can be #)
+ local used = { }
+ for i=1,#otf.glists do
+ local g = data[otf.glists[i]]
+ if g then
+ for i=1,#g do
+ local f = g[i].features
+ if f then
+ for i=1,#f do
+ local t = f[i].tag
+ if t then used[t] = true end
+ end
+ end
+ end
+ end
+ end
+ --
+ local glyphs = data.glyphs
+ local indices = data.map.map
+ data.gsub = data.gsub or { }
+ for kind, specifications in next, extra_features do
+ if not used[kind] then
+ local done = 0
+ for s=1,#specifications do
+ local added = false
+ local specification = specifications[s]
+ local list = extra_lists[kind][s]
+ local name = specification.name .. "_s"
+ if specification.type == "gsub_ligature" then
+ for unicode, index in next, indices do
+ local glyph = glyphs[index]
+ local ligature = list[glyph.name]
+ if ligature then
+ local o = glyph.lookups or { }
+ -- o[name] = { "ligature", ligature, glyph.name }
+ o[name] = {
+ {
+ ["type"] = "ligature",
+ ["specification"] = {
+ char = glyph.name,
+ components = ligature,
+ }
+ }
+ }
+ glyph.lookups, done, added = o, done+1, true
+ end
+ end
+ elseif specification.type == "gsub_single" then
+ for unicode, index in next, indices do
+ local glyph = glyphs[index]
+ local r = list[unicode]
+ if r then
+ local replacement = indices[r]
+ if replacement and glyphs[replacement] then
+ local o = glyph.lookups or { }
+ -- o[name] = { { "substitution", glyphs[replacement].name } }
+ o[name] = {
+ {
+ ["type"] = "substitution",
+ ["specification"] = {
+ variant = glyphs[replacement].name,
+ }
+ }
+ }
+ glyph.lookups, done, added = o, done+1, true
+ end
+ end
+ end
+ end
+ if added then
+ insert(data.gsub,s,table.fastcopy(specification)) -- right order
+ end
+ end
+ if done > 0 then
+ if trace_loading then
+ logs.report("load otf","enhance: registering %s feature (%s glyphs affected)",kind,done)
+ end
+ end
+ end
+ end
+end
+
+otf.tables.features['tlig'] = 'TeX Ligatures'
+otf.tables.features['trep'] = 'TeX Replacements'
+otf.tables.features['anum'] = 'Arabic Digits'
+
+otf.features.register_base_substitution('tlig')
+otf.features.register_base_substitution('trep')
+otf.features.register_base_substitution('anum')
+
+-- the functionality is defined elsewhere
+
+fonts.initializers.base.otf.equaldigits = fonts.initializers.common.equaldigits
+fonts.initializers.node.otf.equaldigits = fonts.initializers.common.equaldigits
+
+fonts.initializers.base.otf.lineheight = fonts.initializers.common.lineheight
+fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight
+
+fonts.initializers.base.otf.compose = fonts.initializers.common.compose
+fonts.initializers.node.otf.compose = fonts.initializers.common.compose
diff --git a/tex/context/base/font-otd.lua b/tex/context/base/font-otd.lua
new file mode 100644
index 000000000..41e885331
--- /dev/null
+++ b/tex/context/base/font-otd.lua
@@ -0,0 +1,78 @@
+if not modules then modules = { } end modules ['font-otd'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+
+local otf = fonts.otf
+local fontdata = fonts.ids
+
+otf.features = otf.features or { }
+otf.features.default = otf.features.default or { }
+
+local context_setups = fonts.define.specify.context_setups
+local context_numbers = fonts.define.specify.context_numbers
+
+local a_to_script = { } otf.a_to_script = a_to_script
+local a_to_language = { } otf.a_to_language = a_to_language
+
+function otf.set_dynamics(font,dynamics,attribute)
+ features = context_setups[context_numbers[attribute]] -- can be moved to caller
+ if features then
+ local script = features.script or 'dflt'
+ local language = features.language or 'dflt'
+ local ds = dynamics[script]
+ if not ds then
+ ds = { }
+ dynamics[script] = ds
+ end
+ local dsl = ds[language]
+ if not dsl then
+ dsl = { }
+ ds[language] = dsl
+ end
+ local dsla = dsl[attribute]
+ if dsla then
+ -- if trace_dynamics then
+ -- logs.report("otf define","using dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
+ -- end
+ return dsla
+ else
+ local tfmdata = fontdata[font]
+ a_to_script [attribute] = script
+ a_to_language[attribute] = language
+ -- we need to save some values
+ local saved = {
+ script = tfmdata.script,
+ language = tfmdata.language,
+ mode = tfmdata.mode,
+ features = tfmdata.shared.features
+ }
+ tfmdata.mode = "node"
+ tfmdata.language = language
+ tfmdata.script = script
+ tfmdata.shared.features = { }
+ -- end of save
+ dsla = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
+ if trace_dynamics then
+ logs.report("otf define","setting dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
+ end
+ -- we need to restore some values
+ tfmdata.script = saved.script
+ tfmdata.language = saved.language
+ tfmdata.mode = saved.mode
+ tfmdata.shared.features = saved.features
+ -- end of restore
+ dynamics[script][language][attribute] = dsla -- cache
+ return dsla
+ end
+ end
+ return nil -- { }
+end
diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua
new file mode 100644
index 000000000..9cecf21f0
--- /dev/null
+++ b/tex/context/base/font-otf.lua
@@ -0,0 +1,1752 @@
+if not modules then modules = { } end modules ['font-otf'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local concat, getn, utfbyte = table.concat, table.getn, utf.byte
+local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local abs = math.abs
+local lpegmatch = lpeg.match
+
+local trace_private = false trackers.register("otf.private", function(v) trace_private = v end)
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local trace_features = false trackers.register("otf.features", function(v) trace_features = v end)
+local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
+local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end)
+local trace_math = false trackers.register("otf.math", function(v) trace_math = v end)
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+--~ trackers.enable("otf.loading")
+
+--[[ldx--
+<p>The fontforge table has organized lookups in a certain way. A first implementation
+of this code was organized featurewise: information related to features was
+collected and processing boiled down to a run over the features. The current
+implementation honors the order in the main feature table. Since we can reorder this
+table as we want, we can eventually support several models of processing. We kept
+the static as well as dynamic feature processing, because it had proved to be
+rather useful. The formerly three loop variants have beem discarded but will
+reapear at some time.</p>
+
+<itemize>
+<item>we loop over all lookups</item>
+<item>for each lookup we do a run over the list of glyphs</item>
+<item>but we only process them for features that are enabled</item>
+<item>if we're dealing with a contextual lookup, we loop over all contexts</item>
+<item>in that loop we quit at a match and then process the list of sublookups</item>
+<item>we always continue after the match</item>
+</itemize>
+
+<p>In <l n='context'/> we do this for each font that is used in a list, so in
+practice we have quite some nested loops.</p>
+
+<p>We process the whole list and then consult the glyph nodes. An alternative approach
+is to collect strings of characters using the same font including spaces (because some
+lookups involve spaces). However, we then need to reconstruct the list which is no fun.
+Also, we need to carry quite some information, like attributes, so eventually we don't
+gain much (if we gain something at all).</p>
+
+<p>Another consideration has been to operate on sublists (subhead, subtail) but again
+this would complicate matters as we then neext to keep track of a changing subhead
+and subtail. On the other hand, this might save some runtime. The number of changes
+involved is not that large. This only makes sense when we have many fonts in a list
+and don't change to frequently.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+fonts.tfm = fonts.tfm or { }
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local fontdata = fonts.ids
+
+otf.tables = otf.tables or { } -- defined in font-ott.lua
+otf.meanings = otf.meanings or { } -- defined in font-ott.lua
+otf.tables.features = otf.tables.features or { } -- defined in font-ott.lua
+otf.tables.languages = otf.tables.languages or { } -- defined in font-ott.lua
+otf.tables.scripts = otf.tables.scripts or { } -- defined in font-ott.lua
+
+otf.features = otf.features or { }
+otf.features.list = otf.features.list or { }
+otf.features.default = otf.features.default or { }
+
+otf.enhancers = otf.enhancers or { }
+otf.glists = { "gsub", "gpos" }
+
+otf.version = 2.650 -- beware: also sync font-mis.lua
+otf.pack = true -- beware: also sync font-mis.lua
+otf.syncspace = true
+otf.notdef = false
+otf.cache = containers.define("fonts", "otf", otf.version, true)
+otf.cleanup_aat = false -- only context
+
+local wildcard = "*"
+local default = "dflt"
+
+--[[ldx--
+<p>We start with a lot of tables and related functions.</p>
+--ldx]]--
+
+otf.tables.global_fields = table.tohash {
+ "lookups",
+ "glyphs",
+ "subfonts",
+ "luatex",
+ "pfminfo",
+ "cidinfo",
+ "tables",
+ "names",
+ "unicodes",
+ "names",
+--~ "math",
+ "anchor_classes",
+ "kern_classes",
+ "gpos",
+ "gsub"
+}
+
+otf.tables.valid_fields = {
+ "anchor_classes",
+ "ascent",
+ "cache_version",
+ "cidinfo",
+ "copyright",
+ "creationtime",
+ "descent",
+ "design_range_bottom",
+ "design_range_top",
+ "design_size",
+ "encodingchanged",
+ "extrema_bound",
+ "familyname",
+ "fontname",
+ "fontstyle_id",
+ "fontstyle_name",
+ "fullname",
+ "glyphs",
+ "hasvmetrics",
+ "head_optimized_for_cleartype",
+ "horiz_base",
+ "issans",
+ "isserif",
+ "italicangle",
+ "kerns",
+ "lookups",
+ -- "luatex",
+ "macstyle",
+ "modificationtime",
+ "onlybitmaps",
+ "origname",
+ "os2_version",
+ "pfminfo",
+ "private",
+ "serifcheck",
+ "sfd_version",
+ -- "size",
+ "strokedfont",
+ "strokewidth",
+ "subfonts",
+ "table_version",
+ -- "tables",
+ -- "ttf_tab_saved",
+ "ttf_tables",
+ "uni_interp",
+ "uniqueid",
+ "units_per_em",
+ "upos",
+ "use_typo_metrics",
+ "uwidth",
+ "validation_state",
+ "verbose",
+ "version",
+ "vert_base",
+ "weight",
+ "weight_width_slope_only",
+ "xuid",
+}
+
+--[[ldx--
+<p>Here we go.</p>
+--ldx]]--
+
+local function load_featurefile(ff,featurefile)
+ if featurefile then
+ featurefile = resolvers.find_file(file.addsuffix(featurefile,'fea'),'fea')
+ if featurefile and featurefile ~= "" then
+ if trace_loading then
+ logs.report("load otf", "featurefile: %s", featurefile)
+ end
+ fontloader.apply_featurefile(ff, featurefile)
+ end
+ end
+end
+
+function otf.enhance(name,data,filename,verbose)
+ local enhancer = otf.enhancers[name]
+ if enhancer then
+ if (verbose ~= nil and verbose) or trace_loading then
+ logs.report("load otf","enhance: %s (%s)",name,filename)
+ end
+ enhancer(data,filename)
+ end
+end
+
+local enhancers = {
+ -- pack and unpack are handled separately; they might even be moved
+ -- away from the enhancers namespace
+ "patch bugs",
+ "merge cid fonts", "prepare unicode", "cleanup ttf tables", "compact glyphs", "reverse coverage",
+ "cleanup aat", "enrich with features", "add some missing characters",
+ "reorganize mark classes",
+ "reorganize kerns", -- moved here
+ "flatten glyph lookups", "flatten anchor tables", "flatten feature tables",
+ "simplify glyph lookups", -- some saving
+ "prepare luatex tables",
+ "analyse features", "rehash features",
+ "analyse anchors", "analyse marks", "analyse unicodes", "analyse subtables",
+ "check italic correction","check math",
+ "share widths",
+ "strip not needed data",
+ "migrate metadata",
+ "check math parameters",
+}
+
+function otf.load(filename,format,sub,featurefile)
+ local name = file.basename(file.removesuffix(filename))
+ if featurefile then
+ name = name .. "@" .. file.removesuffix(file.basename(featurefile))
+ end
+ if sub == "" then sub = false end
+ local hash = name
+ if sub then
+ hash = hash .. "-" .. sub
+ end
+ hash = containers.cleanname(hash)
+ local data = containers.read(otf.cache(), hash)
+ local size = lfs.attributes(filename,"size") or 0
+ if not data or data.verbose ~= fonts.verbose or data.size ~= size then
+ logs.report("load otf","loading: %s (hash: %s)",filename,hash)
+ local ff, messages
+ if sub then
+ ff, messages = fontloader.open(filename,sub)
+ else
+ ff, messages = fontloader.open(filename)
+ end
+ if trace_loading and messages and #messages > 0 then
+ if type(messages) == "string" then
+ logs.report("load otf","warning: %s",messages)
+ else
+ for m=1,#messages do
+ logs.report("load otf","warning: %s",tostring(messages[m]))
+ end
+ end
+ else
+ logs.report("load otf","font loaded okay")
+ end
+ if ff then
+ load_featurefile(ff,featurefile)
+ data = fontloader.to_table(ff)
+ fontloader.close(ff)
+ if data then
+ logs.report("load otf","file size: %s", size)
+ logs.report("load otf","enhancing ...")
+ for e=1,#enhancers do
+ otf.enhance(enhancers[e],data,filename)
+ io.flush() -- we want instant messages
+ end
+ if otf.pack and not fonts.verbose then
+ otf.enhance("pack",data,filename)
+ end
+ data.size = size
+ data.verbose = fonts.verbose
+ logs.report("load otf","saving in cache: %s",filename)
+ data = containers.write(otf.cache(), hash, data)
+ collectgarbage("collect")
+ data = containers.read(otf.cache(), hash) -- this frees the old table and load the sparse one
+ collectgarbage("collect")
+ else
+ logs.report("load otf","loading failed (table conversion error)")
+ end
+ else
+ logs.report("load otf","loading failed (file read error)")
+ end
+ end
+ if data then
+ if trace_defining then
+ logs.report("define font","loading from cache: %s",hash)
+ end
+ otf.enhance("unpack",data,filename,false) -- no message here
+ otf.add_dimensions(data)
+ if trace_sequences then
+ otf.show_feature_order(data,filename)
+ end
+ end
+ return data
+end
+
+function otf.add_dimensions(data)
+ -- todo: forget about the width if it's the defaultwidth (saves mem)
+ -- we could also build the marks hash here (instead of storing it)
+ if data then
+ local force = otf.notdef
+ local luatex = data.luatex
+ local defaultwidth = luatex.defaultwidth or 0
+ local defaultheight = luatex.defaultheight or 0
+ local defaultdepth = luatex.defaultdepth or 0
+ for _, d in next, data.glyphs do
+ local bb, wd = d.boundingbox, d.width
+ if not wd then
+ d.width = defaultwidth
+ elseif wd ~= 0 and d.class == "mark" then
+ d.width = -wd
+ end
+ if force and not d.name then
+ d.name = ".notdef"
+ end
+ if bb then
+ local ht, dp = bb[4], -bb[2]
+ if ht == 0 or ht < 0 then
+ -- no need to set it and no negative heights, nil == 0
+ else
+ d.height = ht
+ end
+ if dp == 0 or dp < 0 then
+ -- no negative depths and no negative depths, nil == 0
+ else
+ d.depth = dp
+ end
+ end
+ end
+ end
+end
+
+function otf.show_feature_order(otfdata,filename)
+ local sequences = otfdata.luatex.sequences
+ if sequences and #sequences > 0 then
+ if trace_loading then
+ logs.report("otf check","font %s has %s sequences",filename,#sequences)
+ logs.report("otf check"," ")
+ end
+ for nos=1,#sequences do
+ local sequence = sequences[nos]
+ local typ = sequence.type or "no-type"
+ local name = sequence.name or "no-name"
+ local subtables = sequence.subtables or { "no-subtables" }
+ local features = sequence.features
+ if trace_loading then
+ logs.report("otf check","%3i %-15s %-20s [%s]",nos,name,typ,concat(subtables,","))
+ end
+ if features then
+ for feature, scripts in next, features do
+ local tt = { }
+ for script, languages in next, scripts do
+ local ttt = { }
+ for language, _ in next, languages do
+ ttt[#ttt+1] = language
+ end
+ tt[#tt+1] = format("[%s: %s]",script,concat(ttt," "))
+ end
+ if trace_loading then
+ logs.report("otf check"," %s: %s",feature,concat(tt," "))
+ end
+ end
+ end
+ end
+ if trace_loading then
+ logs.report("otf check","\n")
+ end
+ elseif trace_loading then
+ logs.report("otf check","font %s has no sequences",filename)
+ end
+end
+
+-- todo: normalize, design_size => designsize
+
+otf.enhancers["reorganize mark classes"] = function(data,filename)
+ if data.mark_classes then
+ local unicodes = data.luatex.unicodes
+ local reverse = { }
+ for name, class in next, data.mark_classes do
+ local t = { }
+ for s in gmatch(class,"[^ ]+") do
+ local us = unicodes[s]
+ if type(us) == "table" then
+ for u=1,#us do
+ t[us[u]] = true
+ end
+ else
+ t[us] = true
+ end
+ end
+ reverse[name] = t
+ end
+ data.luatex.markclasses = reverse
+ data.mark_classes = nil
+ end
+end
+
+otf.enhancers["prepare luatex tables"] = function(data,filename)
+ data.luatex = data.luatex or { }
+ local luatex = data.luatex
+ luatex.filename = filename
+ luatex.version = otf.version
+ luatex.creator = "context mkiv"
+end
+
+otf.enhancers["cleanup aat"] = function(data,filename)
+ if otf.cleanup_aat then
+ end
+end
+
+local function analyze_features(g, features)
+ if g then
+ local t, done = { }, { }
+ for k=1,#g do
+ local f = features or g[k].features
+ if f then
+ for k=1,#f do
+ -- scripts and tag
+ local tag = f[k].tag
+ if not done[tag] then
+ t[#t+1] = tag
+ done[tag] = true
+ end
+ end
+ end
+ end
+ if #t > 0 then
+ return t
+ end
+ end
+ return nil
+end
+
+otf.enhancers["analyse features"] = function(data,filename)
+ -- local luatex = data.luatex
+ -- luatex.gposfeatures = analyze_features(data.gpos)
+ -- luatex.gsubfeatures = analyze_features(data.gsub)
+end
+
+otf.enhancers["rehash features"] = function(data,filename)
+ local features = { }
+ data.luatex.features = features
+ for k, what in next, otf.glists do
+ local dw = data[what]
+ if dw then
+ local f = { }
+ features[what] = f
+ for i=1,#dw do
+ local d= dw[i]
+ local dfeatures = d.features
+ if dfeatures then
+ for i=1,#dfeatures do
+ local df = dfeatures[i]
+ local tag = strip(lower(df.tag))
+ local ft = f[tag] if not ft then ft = {} f[tag] = ft end
+ local dscripts = df.scripts
+ for script, languages in next, dscripts do
+ script = strip(lower(script))
+ local fts = ft[script] if not fts then fts = {} ft[script] = fts end
+ for i=1,#languages do
+ fts[strip(lower(languages[i]))] = true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["analyse anchors"] = function(data,filename)
+ local classes = data.anchor_classes
+ local luatex = data.luatex
+ local anchor_to_lookup, lookup_to_anchor = { }, { }
+ luatex.anchor_to_lookup, luatex.lookup_to_anchor = anchor_to_lookup, lookup_to_anchor
+ if classes then
+ for c=1,#classes do
+ local class = classes[c]
+ local anchor = class.name
+ local lookups = class.lookup
+ if type(lookups) ~= "table" then
+ lookups = { lookups }
+ end
+ local a = anchor_to_lookup[anchor]
+ if not a then a = { } anchor_to_lookup[anchor] = a end
+ for l=1,#lookups do
+ local lookup = lookups[l]
+ local l = lookup_to_anchor[lookup]
+ if not l then l = { } lookup_to_anchor[lookup] = l end
+ l[anchor] = true
+ a[lookup] = true
+ end
+ end
+ end
+end
+
+otf.enhancers["analyse marks"] = function(data,filename)
+ local glyphs = data.glyphs
+ local marks = { }
+ data.luatex.marks = marks
+ for unicode, index in next, data.luatex.indices do
+ local glyph = glyphs[index]
+ if glyph.class == "mark" then
+ marks[unicode] = true
+ end
+ end
+end
+
+otf.enhancers["analyse unicodes"] = fonts.map.add_to_unicode
+
+otf.enhancers["analyse subtables"] = function(data,filename)
+ data.luatex = data.luatex or { }
+ local luatex = data.luatex
+ local sequences = { }
+ local lookups = { }
+ luatex.sequences = sequences
+ luatex.lookups = lookups
+ for _, g in next, { data.gsub, data.gpos } do
+ for k=1,#g do
+ local gk = g[k]
+ local typ = gk.type
+ if typ == "gsub_contextchain" or typ == "gpos_contextchain" then
+ gk.chain = 1
+ elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then
+ gk.chain = -1
+ else
+ gk.chain = 0
+ end
+ local features = gk.features
+ if features then
+ sequences[#sequences+1] = gk
+ -- scripts, tag, ismac
+ local t = { }
+ for f=1,#features do
+ local feature = features[f]
+ local hash = { }
+ -- only script and langs matter
+ for s, languages in next, feature.scripts do
+ s = lower(s)
+ local h = hash[s]
+ if not h then h = { } hash[s] = h end
+ for l=1,#languages do
+ h[strip(lower(languages[l]))] = true
+ end
+ end
+ t[feature.tag] = hash
+ end
+ gk.features = t
+ else
+ lookups[gk.name] = gk
+ gk.name = nil
+ end
+ local subtables = gk.subtables
+ if subtables then
+ local t = { }
+ for s=1,#subtables do
+ local subtable = subtables[s]
+ local name = subtable.name
+ t[#t+1] = name
+ end
+ gk.subtables = t
+ end
+ local flags = gk.flags
+ if flags then
+ gk.flags = { -- forcing false packs nicer
+ (flags.ignorecombiningmarks and "mark") or false,
+ (flags.ignoreligatures and "ligature") or false,
+ (flags.ignorebaseglyphs and "base") or false,
+ flags.r2l or false,
+ }
+ if flags.mark_class then
+ gk.markclass = luatex.markclasses[flags.mark_class]
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["merge cid fonts"] = function(data,filename)
+ -- we can also move the names to data.luatex.names which might
+ -- save us some more memory (at the cost of harder tracing)
+ if data.subfonts then
+ if data.glyphs and next(data.glyphs) then
+ logs.report("load otf","replacing existing glyph table due to subfonts")
+ end
+ local cidinfo = data.cidinfo
+ local verbose = fonts.verbose
+ if cidinfo.registry then
+ local cidmap, cidname = fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement)
+ if cidmap then
+ cidinfo.usedname = cidmap.usedname
+ local glyphs, uni_to_int, int_to_uni, nofnames, nofunicodes = { }, { }, { }, 0, 0
+ local unicodes, names = cidmap.unicodes, cidmap.names
+ for n, subfont in next, data.subfonts do
+ for index, g in next, subfont.glyphs do
+ if not next(g) then
+ -- dummy entry
+ else
+ local unicode, name = unicodes[index], names[index]
+ g.cidindex = n
+ g.boundingbox = g.boundingbox -- or zerobox
+ g.name = g.name or name or "unknown"
+ if unicode then
+ uni_to_int[unicode] = index
+ int_to_uni[index] = unicode
+ nofunicodes = nofunicodes + 1
+ g.unicode = unicode
+ elseif name then
+ nofnames = nofnames + 1
+ g.unicode = -1
+ end
+ glyphs[index] = g
+ end
+ end
+ subfont.glyphs = nil
+ end
+ if trace_loading then
+ logs.report("load otf","cid font remapped, %s unicode points, %s symbolic names, %s glyphs",nofunicodes, nofnames, nofunicodes+nofnames)
+ end
+ data.glyphs = glyphs
+ data.map = data.map or { }
+ data.map.map = uni_to_int
+ data.map.backmap = int_to_uni
+ elseif trace_loading then
+ logs.report("load otf","unable to remap cid font, missing cid file for %s",filename)
+ end
+ elseif trace_loading then
+ logs.report("load otf","font %s has no glyphs",filename)
+ end
+ end
+end
+
+otf.enhancers["prepare unicode"] = function(data,filename)
+ local luatex = data.luatex
+ if not luatex then luatex = { } data.luatex = luatex end
+ local indices, unicodes, multiples, internals = { }, { }, { }, { }
+ local glyphs = data.glyphs
+ local mapmap = data.map
+ if not mapmap then
+ logs.report("load otf","no map in %s",filename)
+ mapmap = { }
+ data.map = { map = mapmap }
+ elseif not mapmap.map then
+ logs.report("load otf","no unicode map in %s",filename)
+ mapmap = { }
+ data.map.map = mapmap
+ else
+ mapmap = mapmap.map
+ end
+ local criterium = fonts.private
+ local private = fonts.private
+ for index, glyph in next, glyphs do
+ if index > 0 then
+ local name = glyph.name
+ if name then
+ local unicode = glyph.unicode
+ if unicode == -1 or unicode >= criterium then
+ glyph.unicode = private
+ indices[private] = index
+ unicodes[name] = private
+ internals[index] = true
+ if trace_private then
+ logs.report("load otf","enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
+ end
+ private = private + 1
+ else
+ indices[unicode] = index
+ unicodes[name] = unicode
+ end
+ end
+ end
+ end
+ -- beware: the indices table is used to initialize the tfm table
+ for unicode, index in next, mapmap do
+ if not internals[index] then
+ 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
+ if un ~= unicode then
+ multiples[#multiples+1] = name
+ unicodes[name] = { un, unicode }
+ indices[unicode] = index
+ end
+ else
+ local ok = false
+ for u=1,#un do
+ if un[u] == unicode then
+ ok = true
+ break
+ end
+ end
+ if not ok then
+ multiples[#multiples+1] = name
+ un[#un+1] = unicode
+ indices[unicode] = index
+ end
+ end
+ end
+ end
+ end
+ if trace_loading then
+ if #multiples > 0 then
+ logs.report("load otf","%s glyph are reused: %s",#multiples, concat(multiples," "))
+ else
+ logs.report("load otf","no glyph are reused")
+ end
+ end
+ luatex.indices = indices
+ luatex.unicodes = unicodes
+ luatex.private = private
+end
+
+otf.enhancers["cleanup ttf tables"] = function(data,filename)
+ local ttf_tables = data.ttf_tables
+ if ttf_tables then
+ for k=1,#ttf_tables do
+ if ttf_tables[k].data then ttf_tables[k].data = "deleted" end
+ end
+ end
+ data.ttf_tab_saved = nil
+end
+
+otf.enhancers["compact glyphs"] = function(data,filename)
+ table.compact(data.glyphs) -- needed?
+ if data.subfonts then
+ for _, subfont in next, data.subfonts do
+ table.compact(subfont.glyphs) -- needed?
+ end
+ end
+end
+
+otf.enhancers["reverse coverage"] = function(data,filename)
+ -- we prefer the before lookups in a normal order
+ if data.lookups then
+ for _, v in next, data.lookups do
+ if v.rules then
+ for _, vv in next, v.rules do
+ local c = vv.coverage
+ if c and c.before then
+ c.before = table.reverse(c.before)
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["check italic correction"] = function(data,filename)
+ local glyphs = data.glyphs
+ local ok = false
+ for index, glyph in next, glyphs do
+ local ic = glyph.italic_correction
+ if ic then
+ if ic ~= 0 then
+ glyph.italic = ic
+ end
+ glyph.italic_correction = nil
+ ok = true
+ end
+ end
+ -- we can use this to avoid calculations
+ otf.tables.valid_fields[#otf.tables.valid_fields+1] = "has_italic"
+ data.has_italic = true
+end
+
+otf.enhancers["check math"] = function(data,filename)
+ if data.math then
+ -- we move the math stuff into a math subtable because we then can
+ -- test faster in the tfm copy
+ local glyphs = data.glyphs
+ local unicodes = data.luatex.unicodes
+ for index, glyph in next, glyphs do
+ local mk = glyph.mathkern
+ local hv = glyph.horiz_variants
+ local vv = glyph.vert_variants
+ if mk or hv or vv then
+ local math = { }
+ glyph.math = math
+ if mk then
+ for k, v in next, mk do
+ if not next(v) then
+ mk[k] = nil
+ end
+ end
+ math.kerns = mk
+ glyph.mathkern = nil
+ end
+ if hv then
+ math.horiz_variants = hv.variants
+ local p = hv.parts
+ if p then
+ if #p>0 then
+ for i=1,#p do
+ local pi = p[i]
+ pi.glyph = unicodes[pi.component] or 0
+ end
+ math.horiz_parts = p
+ end
+ end
+ local ic = hv.italic_correction
+ if ic and ic ~= 0 then
+ math.horiz_italic_correction = ic
+ end
+ glyph.horiz_variants = nil
+ end
+ if vv then
+ local uc = unicodes[index]
+ math.vert_variants = vv.variants
+ local p = vv.parts
+ if p then
+ if #p>0 then
+ for i=1,#p do
+ local pi = p[i]
+ pi.glyph = unicodes[pi.component] or 0
+ end
+ math.vert_parts = p
+ end
+ end
+ local ic = vv.italic_correction
+ if ic and ic ~= 0 then
+ math.vert_italic_correction = ic
+ end
+ glyph.vert_variants = nil
+ end
+ local ic = glyph.italic_correction
+ if ic then
+ if ic ~= 0 then
+ math.italic_correction = ic
+ end
+ glyph.italic_correction = nil
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["share widths"] = function(data,filename)
+ local glyphs = data.glyphs
+ local widths = { }
+ for index, glyph in next, glyphs do
+ local width = glyph.width
+ widths[width] = (widths[width] or 0) + 1
+ end
+ -- share width for cjk fonts
+ local wd, most = 0, 1
+ for k,v in next, widths do
+ if v > most then
+ wd, most = k, v
+ end
+ end
+ if most > 1000 then
+ if trace_loading then
+ logs.report("load otf", "most common width: %s (%s times), sharing (cjk font)",wd,most)
+ end
+ for k, v in next, glyphs do
+ if v.width == wd then
+ v.width = nil
+ end
+ end
+ data.luatex.defaultwidth = wd
+ end
+end
+
+-- kern: ttf has a table with kerns
+
+--~ otf.enhancers["reorganize kerns"] = function(data,filename)
+--~ local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
+--~ local mkdone = false
+--~ for index, glyph in next, data.glyphs do
+--~ if glyph.kerns then
+--~ local mykerns = { }
+--~ for k,v in next, glyph.kerns do
+--~ 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 not uvc then
+--~ if trace_loading then
+--~ logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
+--~ end
+--~ else
+--~ if type(vl) ~= "table" then
+--~ vl = { vl }
+--~ end
+--~ for l=1,#vl do
+--~ local vll = vl[l]
+--~ local mkl = mykerns[vll]
+--~ if not mkl then
+--~ mkl = { }
+--~ mykerns[vll] = mkl
+--~ end
+--~ if type(uvc) == "table" then
+--~ for u=1,#uvc do
+--~ mkl[uvc[u]] = vo
+--~ end
+--~ else
+--~ mkl[uvc] = vo
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ glyph.mykerns = mykerns
+--~ glyph.kerns = nil -- saves space and time
+--~ mkdone = true
+--~ end
+--~ end
+--~ if trace_loading and mkdone then
+--~ logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
+--~ end
+--~ if data.kerns then
+--~ if trace_loading then
+--~ logs.report("load otf", "removing global 'kern' table")
+--~ end
+--~ data.kerns = nil
+--~ end
+--~ local dgpos = data.gpos
+--~ if dgpos then
+--~ for gp=1,#dgpos do
+--~ local gpos = dgpos[gp]
+--~ local subtables = gpos.subtables
+--~ if subtables then
+--~ for s=1,#subtables do
+--~ local subtable = subtables[s]
+--~ local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
+--~ if kernclass then -- the next one is quite slow
+--~ for k=1,#kernclass do
+--~ local kcl = kernclass[k]
+--~ local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
+--~ if type(lookups) ~= "table" then
+--~ lookups = { lookups }
+--~ end
+--~ for l=1,#lookups do
+--~ local lookup = lookups[l]
+--~ -- weird, as maxfirst and maxseconds can have holes
+--~ local maxfirsts, maxseconds = getn(firsts), getn(seconds)
+--~ if trace_loading then
+--~ logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
+--~ end
+--~ for fk, fv in next, firsts do
+--~ for first in gmatch(fv,"[^ ]+") do
+--~ local first_unicode = unicodes[first]
+--~ if type(first_unicode) == "number" then
+--~ first_unicode = { first_unicode }
+--~ end
+--~ for f=1,#first_unicode do
+--~ local glyph = glyphs[mapmap[first_unicode[f]]]
+--~ if glyph then
+--~ 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 next, seconds do
+--~ local offset = offsets[(fk-1) * maxseconds + sk]
+--~ --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
+--~ for second in gmatch(sv,"[^ ]+") 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
+--~ elseif trace_loading then
+--~ logs.report("load otf", "no glyph data for U+%04X", first_unicode[f])
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
+--~ subtable.kernclass = { }
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+otf.enhancers["reorganize kerns"] = function(data,filename)
+ local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
+ local mkdone = false
+ for index, glyph in next, data.glyphs do
+ if glyph.kerns then
+ local mykerns = { }
+ for k,v in next, glyph.kerns do
+ 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 not uvc then
+ if trace_loading then
+ logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
+ end
+ else
+ if type(vl) ~= "table" then
+ vl = { vl }
+ end
+ for l=1,#vl do
+ local vll = vl[l]
+ local mkl = mykerns[vll]
+ if not mkl then
+ mkl = { }
+ mykerns[vll] = mkl
+ end
+ if type(uvc) == "table" then
+ for u=1,#uvc do
+ mkl[uvc[u]] = vo
+ end
+ else
+ mkl[uvc] = vo
+ end
+ end
+ end
+ end
+ end
+ glyph.mykerns = mykerns
+ glyph.kerns = nil -- saves space and time
+ mkdone = true
+ end
+ end
+ if trace_loading and mkdone then
+ logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
+ end
+ if data.kerns then
+ if trace_loading then
+ logs.report("load otf", "removing global 'kern' table")
+ end
+ data.kerns = nil
+ end
+ local dgpos = data.gpos
+ if dgpos then
+ local separator = lpeg.P(" ")
+ local other = ((1 - separator)^0) / unicodes
+ local splitter = lpeg.Ct(other * (separator * other)^0)
+ for gp=1,#dgpos do
+ local gpos = dgpos[gp]
+ local subtables = gpos.subtables
+ if subtables then
+ for s=1,#subtables do
+ local subtable = subtables[s]
+ local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
+ if kernclass then -- the next one is quite slow
+ for k=1,#kernclass do
+ local kcl = kernclass[k]
+ local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
+ if type(lookups) ~= "table" then
+ lookups = { lookups }
+ end
+ local split = { }
+ for l=1,#lookups do
+ local lookup = lookups[l]
+ -- weird, as maxfirst and maxseconds can have holes, first seems to be indexed, seconds starts at 2
+ local maxfirsts, maxseconds = getn(firsts), getn(seconds)
+ for _, s in next, firsts do
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
+ for _, s in next, seconds do
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
+ if trace_loading then
+ logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
+ end
+ local function do_it(fk,first_unicode)
+ local glyph = glyphs[mapmap[first_unicode]]
+ if glyph then
+ 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
+ local baseoffset = (fk-1) * maxseconds
+ for sk=2,maxseconds do
+ local sv = seconds[sk]
+ local offset = offsets[baseoffset + sk]
+ --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
+ local splt = split[sv]
+ if splt then
+ for i=1,#splt do
+ local second_unicode = splt[i]
+ if tonumber(second_unicode) then
+ lookupkerns[second_unicode] = offset
+ else
+ for s=1,#second_unicode do
+ lookupkerns[second_unicode[s]] = offset
+ end
+ end
+ end
+ end
+ end
+ elseif trace_loading then
+ logs.report("load otf", "no glyph data for U+%04X", first_unicode)
+ end
+ end
+ for fk=1,#firsts do
+ local fv = firsts[fk]
+ local splt = split[fv]
+ if splt then
+ for i=1,#splt do
+ local first_unicode = splt[i]
+ if tonumber(first_unicode) then
+ do_it(fk,first_unicode)
+ else
+ for f=1,#first_unicode do
+ do_it(fk,first_unicode[f])
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
+ subtable.kernclass = { }
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["strip not needed data"] = function(data,filename)
+ local verbose = fonts.verbose
+ local int_to_uni = data.luatex.unicodes
+ for k, v in next, data.glyphs do
+ local d = v.dependents
+ if d then v.dependents = nil end
+ local a = v.altuni
+ if a then v.altuni = nil end
+ if verbose then
+ local code = int_to_uni[k]
+ -- looks like this is done twice ... bug?
+ if code then
+ local vu = v.unicode
+ if not vu then
+ v.unicode = code
+ elseif type(vu) == "table" then
+ if vu[#vu] == code then
+ -- weird
+ else
+ vu[#vu+1] = code
+ end
+ elseif vu ~= code then
+ 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.map = nil
+ data.names = nil -- funny names for editors
+ data.glyphcnt = nil
+ data.glyphmax = nil
+ if true then
+ data.gpos = nil
+ data.gsub = nil
+ data.anchor_classes = nil
+ end
+end
+
+otf.enhancers["migrate metadata"] = function(data,filename)
+ local global_fields = otf.tables.global_fields
+ local metadata = { }
+ for k,v in next, data do
+ if not global_fields[k] then
+ metadata[k] = v
+ data[k] = nil
+ end
+ end
+ data.metadata = metadata
+ -- goodies
+ local pfminfo = data.pfminfo
+ metadata.isfixedpitch = metadata.isfixedpitch or (pfminfo.panose and pfminfo.panose["proportion"] == "Monospaced")
+ metadata.charwidth = pfminfo and pfminfo.avgwidth
+end
+
+local private_math_parameters = {
+ "FractionDelimiterSize",
+ "FractionDelimiterDisplayStyleSize",
+}
+
+otf.enhancers["check math parameters"] = function(data,filename)
+ local mathdata = data.metadata.math
+ if mathdata then
+ for m=1,#private_math_parameters do
+ local pmp = private_math_parameters[m]
+ if not mathdata[pmp] then
+ if trace_loading then
+ logs.report("load otf", "setting math parameter '%s' to 0", pmp)
+ end
+ mathdata[pmp] = 0
+ end
+ end
+ end
+end
+
+otf.enhancers["flatten glyph lookups"] = function(data,filename)
+ for k, v in next, data.glyphs do
+ local lookups = v.lookups
+ if lookups then
+ for kk, vv in next, lookups do
+ for kkk=1,#vv do
+ local vvv = vv[kkk]
+ local s = vvv.specification
+ if s then
+ local t = vvv.type
+ if t == "ligature" then
+ vv[kkk] = { "ligature", s.components, s.char }
+ elseif t == "alternate" then
+ vv[kkk] = { "alternate", s.components }
+ elseif t == "substitution" then
+ vv[kkk] = { "substitution", s.variant }
+ elseif t == "multiple" then
+ vv[kkk] = { "multiple", s.components }
+ elseif t == "position" then
+ vv[kkk] = { "position", { s.x or 0, s.y or 0, s.h or 0, s.v or 0 } }
+ elseif t == "pair" then
+ local one, two, paired = s.offsets[1], s.offsets[2], s.paired or ""
+ if one then
+ if two then
+ vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0 } }
+ else
+ vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 } }
+ end
+ else
+ if two then
+ vv[kkk] = { "pair", paired, { }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0} } -- maybe nil instead of { }
+ else
+ vv[kkk] = { "pair", paired }
+ end
+ end
+ else
+ if trace_loading then
+ logs.report("load otf", "flattening needed, report to context list")
+ end
+ for a, b in next, s do
+ if trace_loading and vvv[a] then
+ logs.report("load otf", "flattening conflict, report to context list")
+ end
+ vvv[a] = b
+ end
+ vvv.specification = nil
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["simplify glyph lookups"] = function(data,filename)
+ for k, v in next, data.glyphs do
+ local lookups = v.lookups
+ if lookups then
+ local slookups, mlookups
+ for kk, vv in next, lookups do
+ if #vv == 1 then
+ if not slookups then
+ slookups = { }
+ v.slookups = slookups
+ end
+ slookups[kk] = vv[1]
+ else
+ if not mlookups then
+ mlookups = { }
+ v.mlookups = mlookups
+ end
+ mlookups[kk] = vv
+ end
+ end
+ v.lookups = nil
+ end
+ end
+end
+
+otf.enhancers["flatten anchor tables"] = function(data,filename)
+ for k, v in next, data.glyphs do
+ if v.anchors then
+ for kk, vv in next, v.anchors do
+ for kkk, vvv in next, vv do
+ if vvv.x or vvv.y then
+ vv[kkk] = { vvv.x or 0, vvv.y or 0 }
+ else
+ for kkkk=1,#vvv do
+ local vvvv = vvv[kkkk]
+ vvv[kkkk] = { vvvv.x or 0, vvvv.y or 0 }
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["flatten feature tables"] = function(data,filename)
+ -- is this needed? do we still use them at all?
+ for _, tag in next, otf.glists do
+ if data[tag] then
+ if trace_loading then
+ logs.report("load otf", "flattening %s table", tag)
+ end
+ for k, v in next, data[tag] do
+ local features = v.features
+ if features then
+ for kk=1,#features do
+ local vv = features[kk]
+ local t = { }
+ local scripts = vv.scripts
+ for kkk=1,#scripts do
+ local vvv = scripts[kkk]
+ t[vvv.script] = vvv.langs
+ end
+ vv.scripts = t
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers.patches = otf.enhancers.patches or { }
+
+otf.enhancers["patch bugs"] = function(data,filename)
+ local basename = file.basename(lower(filename))
+ for pattern, action in next, otf.enhancers.patches do
+ if find(basename,pattern) then
+ action(data,filename)
+ end
+ end
+end
+
+-- tex features
+
+fonts.otf.enhancers["enrich with features"] = function(data,filename)
+ -- later, ctx only
+end
+
+function otf.features.register(name,default)
+ otf.features.list[#otf.features.list+1] = name
+ otf.features.default[name] = default
+end
+
+-- for context this will become a task handler
+
+function otf.set_features(tfmdata,features)
+ local processes = { }
+ if features and next(features) then
+ local lists = { -- why local
+ fonts.triggers,
+ fonts.processors,
+ fonts.manipulators,
+ }
+ local mode = tfmdata.mode or fonts.mode -- or features.mode
+ local initializers = fonts.initializers
+ local fi = initializers[mode]
+ if fi then
+ local fiotf = fi.otf
+ if fiotf then
+ local done = { }
+ for l=1,4 do
+ local list = lists[l]
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ local value = features[f]
+ if value and fiotf[f] then -- brr
+ if not done[f] then -- so, we can move some to triggers
+ if trace_features then
+ logs.report("define otf","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown', tfmdata.fullname or 'unknown')
+ end
+ fiotf[f](tfmdata,value) -- can set mode (no need to pass otf)
+ mode = tfmdata.mode or fonts.mode -- keep this, mode can be set local !
+ local im = initializers[mode]
+ if im then
+ fiotf = initializers[mode].otf
+ end
+ done[f] = true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ local fm = fonts.methods[mode] -- todo: zonder node/mode otf/...
+ if fm then
+ local fmotf = fm.otf
+ if fmotf then
+ for l=1,4 do
+ local list = lists[l]
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ if fmotf[f] then -- brr
+ if trace_features then
+ logs.report("define otf","installing feature handler %s for mode %s for font %s",f,mode or 'unknown', tfmdata.fullname or 'unknown')
+ end
+ processes[#processes+1] = fmotf[f]
+ end
+ end
+ end
+ end
+ end
+ else
+ -- message
+ end
+ end
+ return processes, features
+end
+
+function otf.otf_to_tfm(specification)
+ local name = specification.name
+ local sub = specification.sub
+ local filename = specification.filename
+ local format = specification.format
+ local features = specification.features.normal
+ local cache_id = specification.hash
+ local tfmdata = containers.read(tfm.cache(),cache_id)
+--~ print(cache_id)
+ if not tfmdata then
+ local otfdata = otf.load(filename,format,sub,features and features.featurefile)
+ if otfdata and next(otfdata) then
+ otfdata.shared = otfdata.shared or {
+ featuredata = { },
+ anchorhash = { },
+ initialized = false,
+ }
+ tfmdata = otf.copy_to_tfm(otfdata,cache_id)
+ if tfmdata and next(tfmdata) then
+ tfmdata.unique = tfmdata.unique or { }
+ tfmdata.shared = tfmdata.shared or { } -- combine
+ local shared = tfmdata.shared
+ shared.otfdata = otfdata
+ shared.features = features -- default
+ shared.dynamics = { }
+ shared.processes = { }
+ shared.set_dynamics = otf.set_dynamics -- fast access and makes other modules independent
+ -- this will be done later anyway, but it's convenient to have
+ -- them already for fast access
+ tfmdata.luatex = otfdata.luatex
+ tfmdata.indices = otfdata.luatex.indices
+ tfmdata.unicodes = otfdata.luatex.unicodes
+ tfmdata.marks = otfdata.luatex.marks
+ tfmdata.originals = otfdata.luatex.originals
+ tfmdata.changed = { }
+ tfmdata.has_italic = otfdata.metadata.has_italic
+ if not tfmdata.language then tfmdata.language = 'dflt' end
+ if not tfmdata.script then tfmdata.script = 'dflt' end
+ shared.processes, shared.features = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
+ end
+ end
+ containers.write(tfm.cache(),cache_id,tfmdata)
+ end
+ return tfmdata
+end
+
+--~ {
+--~ ['boundingbox']={ 95, -458, 733, 1449 },
+--~ ['class']="base",
+--~ ['name']="braceleft",
+--~ ['unicode']=123,
+--~ ['vert_variants']={
+--~ ['italic_correction']=0,
+--~ ['parts']={
+--~ { ['component']="uni23A9", ['endConnectorLength']=1000, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=0, }, -- bot
+--~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
+--~ { ['component']="uni23A8", ['endConnectorLength']=1000, ['fullAdvance']=4688, ['is_extender']=0, ['startConnectorLength']=1000, }, -- mid
+--~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
+--~ { ['component']="uni23A7", ['endConnectorLength']=0, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=1000, }, -- top
+--~ },
+--~ ['variants']="braceleft braceleft.vsize1 braceleft.vsize2 braceleft.vsize3 braceleft.vsize4 braceleft.vsize5 braceleft.vsize6 braceleft.vsize7",
+--~ },
+--~ ['width']=793,
+--~ },
+
+-- the first version made a top/mid/not extensible table, now we just pass on the variants data
+-- and deal with it in the tfm scaler (there is no longer an extensible table anyway)
+
+-- we cannot share descriptions as virtual fonts might extend them (ok, we could
+-- use a cache with a hash
+
+fonts.formats.dfont = "truetype"
+fonts.formats.ttc = "truetype"
+fonts.formats.ttf = "truetype"
+fonts.formats.otf = "opentype"
+
+function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)
+ if data then
+ local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { }
+ local luatex = data.luatex
+ local unicodes = luatex.unicodes -- names to unicodes
+ local indices = luatex.indices
+ local characters, parameters, math_parameters, descriptions = { }, { }, { }, { }
+ local designsize = metadata.designsize or metadata.design_size or 100
+ if designsize == 0 then
+ designsize = 100
+ end
+ local spaceunits = 500
+ -- indices maps from unicodes to indices
+ for u, i in next, indices do
+ characters[u] = { } -- we need this because for instance we add protruding info and loop over characters
+ descriptions[u] = glyphs[i]
+ end
+ -- math
+ if metadata.math then
+ -- parameters
+ for name, value in next, metadata.math do
+ math_parameters[name] = value
+ end
+ -- we could use a subset
+ for u, char in next, characters do
+ local d = descriptions[u]
+ local m = d.math
+ -- we have them shared because that packs nicer
+ -- we could prepare the variants and keep 'm in descriptions
+ if m then
+ local variants = m.horiz_variants
+ if variants then
+ local c = char
+ for n in gmatch(variants,"[^ ]+") do
+ local un = unicodes[n]
+ if un and u ~= un then
+ c.next = un
+ c = characters[un]
+ end
+ end
+ c.horiz_variants = m.horiz_parts
+ else
+ local variants = m.vert_variants
+ if variants then
+ local c = char
+ for n in gmatch(variants,"[^ ]+") do
+ local un = unicodes[n]
+ if un and u ~= un then
+ c.next = un
+ c = characters[un]
+ end
+ end
+ c.vert_variants = m.vert_parts
+ c.vert_italic_correction = m.vert_italic_correction
+ end
+ end
+ local kerns = m.kerns
+ if kerns then
+ char.mathkerns = kerns
+ end
+ end
+ end
+ end
+ -- end math
+ local endash, emdash, space = 0x20, 0x2014, "space" -- unicodes['space'], unicodes['emdash']
+ if metadata.isfixedpitch then
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, spacer = descriptions[emdash].width, "emdash"
+ end
+ if not spaceunits and metadata.charwidth then
+ spaceunits, spacer = metadata.charwidth, "charwidth"
+ end
+ else
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, spacer = descriptions[emdash].width/2, "emdash/2"
+ end
+ if not spaceunits and metadata.charwidth then
+ spaceunits, spacer = metadata.charwidth, "charwidth"
+ end
+ end
+ spaceunits = tonumber(spaceunits) or tfm.units/2 -- 500 -- brrr
+ -- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't we use the basename then?)
+ local filename = fonts.tfm.checked_filename(luatex)
+ local fontname = metadata.fontname
+ local fullname = metadata.fullname or fontname
+ local cidinfo = data.cidinfo
+ local units = metadata.units_per_em or 1000
+ --
+ cidinfo.registry = cidinfo and cidinfo.registry or "" -- weird here, fix upstream
+ --
+ parameters.slant = 0
+ parameters.space = spaceunits -- 3.333 (cmr10)
+ parameters.space_stretch = units/2 -- 500 -- 1.666 (cmr10)
+ parameters.space_shrink = 1*units/3 -- 333 -- 1.111 (cmr10)
+ parameters.x_height = 2*units/5 -- 400
+ parameters.quad = units -- 1000
+ if spaceunits < 2*units/5 then
+ -- todo: warning
+ end
+ local italicangle = metadata.italicangle
+ if italicangle then -- maybe also in afm _
+ parameters.slant = parameters.slant - math.round(math.tan(italicangle*math.pi/180))
+ end
+ if metadata.isfixedpitch then
+ parameters.space_stretch = 0
+ parameters.space_shrink = 0
+ elseif otf.syncspace then --
+ parameters.space_stretch = spaceunits/2
+ parameters.space_shrink = spaceunits/3
+ end
+ parameters.extra_space = parameters.space_shrink -- 1.111 (cmr10)
+ if pfminfo.os2_xheight and pfminfo.os2_xheight > 0 then
+ parameters.x_height = pfminfo.os2_xheight
+ else
+ local x = 0x78 -- unicodes['x']
+ if x then
+ local x = descriptions[x]
+ if x then
+ parameters.x_height = x.height
+ end
+ end
+ end
+ --
+ return {
+ characters = characters,
+ parameters = parameters,
+ math_parameters = math_parameters,
+ descriptions = descriptions,
+ indices = indices,
+ unicodes = unicodes,
+ type = "real",
+ direction = 0,
+ boundarychar_label = 0,
+ boundarychar = 65536,
+ designsize = (designsize/10)*65536,
+ spacer = "500 units",
+ encodingbytes = 2,
+ filename = filename,
+ fontname = fontname,
+ fullname = fullname,
+ psname = fontname or fullname,
+ name = filename or fullname,
+ units = units,
+ format = fonts.fontformat(filename,"opentype"),
+ cidinfo = cidinfo,
+ ascender = abs(metadata.ascent or 0),
+ descender = abs(metadata.descent or 0),
+ spacer = spacer,
+ italicangle = italicangle,
+ }
+ else
+ return nil
+ end
+end
+
+otf.features.register('mathsize')
+
+function tfm.read_from_open_type(specification)
+ local tfmtable = otf.otf_to_tfm(specification)
+ if tfmtable then
+ local otfdata = tfmtable.shared.otfdata
+ tfmtable.name = specification.name
+ tfmtable.sub = specification.sub
+ local s = specification.size
+ local m = otfdata.metadata.math
+ if m then
+ -- this will move to a function
+ local f = specification.features
+ if f then
+ local f = f.normal
+ if f and f.mathsize then
+ local mathsize = specification.mathsize or 0
+ if mathsize == 2 then
+ local p = m.ScriptPercentScaleDown
+ if p then
+ local ps = p * specification.textsize / 100
+ if trace_math then
+ logs.report("define font","asked script size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
+ end
+ s = ps
+ end
+ elseif mathsize == 3 then
+ local p = m.ScriptScriptPercentScaleDown
+ if p then
+ local ps = p * specification.textsize / 100
+ if trace_math then
+ logs.report("define font","asked scriptscript size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
+ end
+ s = ps
+ end
+ end
+ end
+ end
+ end
+ tfmtable = tfm.scale(tfmtable,s,specification.relativeid)
+ if tfm.fontname_mode == "specification" then
+ -- not to be used in context !
+ local specname = specification.specification
+ if specname then
+ tfmtable.name = specname
+ if trace_defining then
+ logs.report("define font","overloaded fontname: '%s'",specname)
+ end
+ end
+ end
+ fonts.logger.save(tfmtable,file.extname(specification.filename),specification)
+ end
+--~ print(tfmtable.fullname)
+ return tfmtable
+end
+
+-- helpers
+
+function otf.collect_lookups(otfdata,kind,script,language)
+ -- maybe store this in the font
+ local sequences = otfdata.luatex.sequences
+ if sequences then
+ local featuremap, featurelist = { }, { }
+ for s=1,#sequences do
+ local sequence = sequences[s]
+ local features = sequence.features
+ features = features and features[kind]
+ features = features and (features[script] or features[default] or features[wildcard])
+ features = features and (features[language] or features[default] or features[wildcard])
+ if features then
+ local subtables = sequence.subtables
+ if subtables then
+ for s=1,#subtables do
+ local ss = subtables[s]
+ if not featuremap[s] then
+ featuremap[ss] = true
+ featurelist[#featurelist+1] = ss
+ end
+ end
+ end
+ end
+ end
+ if #featurelist > 0 then
+ return featuremap, featurelist
+ end
+ end
+ return nil, nil
+end
diff --git a/tex/context/base/font-oti.lua b/tex/context/base/font-oti.lua
new file mode 100644
index 000000000..4cb270626
--- /dev/null
+++ b/tex/context/base/font-oti.lua
@@ -0,0 +1,57 @@
+if not modules then modules = { } end modules ['font-oti'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- i need to check features=yes|no also in relation to hashing
+
+local lower = string.lower
+
+local otf = fonts.otf
+
+otf.default_language = 'latn'
+otf.default_script = 'dflt'
+
+local languages = otf.tables.languages
+local scripts = otf.tables.scripts
+
+function otf.features.language(tfmdata,value)
+ if value then
+ value = lower(value)
+ if languages[value] then
+ tfmdata.language = value
+ end
+ end
+end
+
+function otf.features.script(tfmdata,value)
+ if value then
+ value = lower(value)
+ if scripts[value] then
+ tfmdata.script = value
+ end
+ end
+end
+
+function otf.features.mode(tfmdata,value)
+ if value then
+ tfmdata.mode = lower(value)
+ end
+end
+
+fonts.initializers.base.otf.language = otf.features.language
+fonts.initializers.base.otf.script = otf.features.script
+fonts.initializers.base.otf.mode = otf.features.mode
+fonts.initializers.base.otf.method = otf.features.mode
+
+fonts.initializers.node.otf.language = otf.features.language
+fonts.initializers.node.otf.script = otf.features.script
+fonts.initializers.node.otf.mode = otf.features.mode
+fonts.initializers.node.otf.method = otf.features.mode
+
+otf.features.register("features",true) -- we always do features
+table.insert(fonts.processors,"features") -- we need a proper function for doing this
+
diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua
new file mode 100644
index 000000000..d4f89adc6
--- /dev/null
+++ b/tex/context/base/font-otn.lua
@@ -0,0 +1,2660 @@
+if not modules then modules = { } end modules ['font-otn'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this is still somewhat preliminary and it will get better in due time;
+-- much functionality could only be implemented thanks to the husayni font
+-- of Idris Samawi Hamid to who we dedicate this module.
+
+-- I'm in the process of cleaning up the code (which happens in another
+-- file) so don't rely on things staying the same.
+
+-- some day when we can jit this, we can use more functions
+
+-- we can use more lpegs when lpeg is extended with function args and so
+-- resolving to unicode does not gain much
+
+-- in retrospect it always looks easy but believe it or not, it took a lot
+-- of work to get proper open type support done: buggy fonts, fuzzy specs,
+-- special made testfonts, many skype sessions between taco, idris and me,
+-- torture tests etc etc ... unfortunately the code does not show how much
+-- time it took ...
+
+-- todo:
+--
+-- kerning is probably not yet ok for latin around dics nodes
+-- extension infrastructure (for usage out of context)
+-- sorting features according to vendors/renderers
+-- alternative loop quitters
+-- check cursive and r2l
+-- find out where ignore-mark-classes went
+-- remove unused tables
+-- slide tail (always glue at the end so only needed once
+-- default features (per language, script)
+-- cleanup kern(class) code, remove double info
+-- handle positions (we need example fonts)
+-- handle gpos_single (we might want an extra width field in glyph nodes because adding kerns might interfere)
+
+--[[ldx--
+<p>This module is a bit more split up that I'd like but since we also want to test
+with plain <l n='tex'/> it has to be so. This module is part of <l n='context'/>
+and discussion about improvements and functionality mostly happens on the
+<l n='context'/> mailing list.</p>
+
+<p>The specification of OpenType is kind of vague. Apart from a lack of a proper
+free specifications there's also the problem that Microsoft and Adobe
+may have their own interpretation of how and in what order to apply features.
+In general the Microsoft website has more detailed specifications and is a
+better reference. There is also some information in the FontForge help files.</p>
+
+<p>Because there is so much possible, fonts might contain bugs and/or be made to
+work with certain rederers. These may evolve over time which may have the side
+effect that suddenly fonts behave differently.</p>
+
+<p>After a lot of experiments (mostly by Taco, me and Idris) we're now at yet another
+implementation. Of course all errors are mine and of course the code can be
+improved. There are quite some optimizations going on here and processing speed
+is currently acceptable. Not all functions are implemented yet, often because I
+lack the fonts for testing. Many scripts are not yet supported either, but I will
+look into them as soon as <l n='context'/> users ask for it.</p>
+
+<p>Because there are different interpretations possible, I will extend the code
+with more (configureable) variants. I can also add hooks for users so that they can
+write their own extensions.</p>
+
+<p>Glyphs are indexed not by unicode but in their own way. This is because there is no
+relationship with unicode at all, apart from the fact that a font might cover certain
+ranges of characters. One character can have multiple shapes. However, at the
+<l n='tex'/> end we use unicode so and all extra glyphs are mapped into a private
+space. This is needed because we need to access them and <l n='tex'/> has to include
+then in the output eventually.</p>
+
+<p>The raw table as it coms from <l n='fontforge'/> gets reorganized in to fit out needs.
+In <l n='context'/> that table is packed (similar tables are shared) and cached on disk
+so that successive runs can use the optimized table (after loading the table is
+unpacked). The flattening code used later is a prelude to an even more compact table
+format (and as such it keeps evolving).</p>
+
+<p>This module is sparsely documented because it is a moving target. The table format
+of the reader changes and we experiment a lot with different methods for supporting
+features.</p>
+
+<p>As with the <l n='afm'/> code, we may decide to store more information in the
+<l n='otf'/> table.</p>
+
+<p>Incrementing the version number will force a re-cache. We jump the number by one
+when there's a fix in the <l n='fontforge'/> library or <l n='lua'/> code that
+results in different tables.</p>
+--ldx]]--
+
+-- action handler chainproc chainmore comment
+--
+-- gsub_single ok ok ok
+-- gsub_multiple ok ok not implemented yet
+-- gsub_alternate ok ok not implemented yet
+-- gsub_ligature ok ok ok
+-- gsub_context ok --
+-- gsub_contextchain ok --
+-- gsub_reversecontextchain ok --
+-- chainsub -- ok
+-- reversesub -- ok
+-- gpos_mark2base ok ok
+-- gpos_mark2ligature ok ok
+-- gpos_mark2mark ok ok
+-- gpos_cursive ok untested
+-- gpos_single ok ok
+-- gpos_pair ok ok
+-- gpos_context ok --
+-- gpos_contextchain ok --
+--
+-- actions:
+--
+-- handler : actions triggered by lookup
+-- chainproc : actions triggered by contextual lookup
+-- chainmore : multiple substitutions triggered by contextual lookup (e.g. fij -> f + ij)
+--
+-- remark: the 'not implemented yet' variants will be done when we have fonts that use them
+-- remark: we need to check what to do with discretionaries
+
+local concat, insert, remove = table.concat, table.insert, table.remove
+local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local lpegmatch = lpeg.match
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local trace_lookups = false trackers.register("otf.lookups", function(v) trace_lookups = v end)
+local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
+local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
+local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
+local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
+local trace_contexts = false trackers.register("otf.contexts", function(v) trace_contexts = v end)
+local trace_marks = false trackers.register("otf.marks", function(v) trace_marks = v end)
+local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
+local trace_cursive = false trackers.register("otf.cursive", function(v) trace_cursive = v end)
+local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
+local trace_bugs = false trackers.register("otf.bugs", function(v) trace_bugs = v end)
+local trace_details = false trackers.register("otf.details", function(v) trace_details = v end)
+local trace_applied = false trackers.register("otf.applied", function(v) trace_applied = v end)
+local trace_steps = false trackers.register("otf.steps", function(v) trace_steps = v end)
+local trace_skips = false trackers.register("otf.skips", function(v) trace_skips = v end)
+local trace_directions = false trackers.register("otf.directions", function(v) trace_directions = v end)
+
+trackers.register("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end)
+trackers.register("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end)
+
+trackers.register("otf.replacements", "otf.singles,otf.multiples,otf.alternatives,otf.ligatures")
+trackers.register("otf.positions","otf.marks,otf.kerns,otf.cursive")
+trackers.register("otf.actions","otf.replacements,otf.positions")
+trackers.register("otf.injections","nodes.injections")
+
+trackers.register("*otf.sample","otf.steps,otf.actions,otf.analyzing")
+
+local insert_node_after = node.insert_after
+local delete_node = nodes.delete
+local copy_node = node.copy
+local find_node_tail = node.tail or node.slide
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+
+local zwnj = 0x200C
+local zwj = 0x200D
+local wildcard = "*"
+local default = "dflt"
+
+local split_at_space = lpeg.splitters[" "] or lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local kern = node.id('kern')
+local disc = node.id('disc')
+local whatsit = node.id('whatsit')
+
+local state = attributes.private('state')
+local markbase = attributes.private('markbase')
+local markmark = attributes.private('markmark')
+local markdone = attributes.private('markdone')
+local cursbase = attributes.private('cursbase')
+local curscurs = attributes.private('curscurs')
+local cursdone = attributes.private('cursdone')
+local kernpair = attributes.private('kernpair')
+
+local set_mark = nodes.set_mark
+local set_cursive = nodes.set_cursive
+local set_kern = nodes.set_kern
+local set_pair = nodes.set_pair
+
+local markonce = true
+local cursonce = true
+local kernonce = true
+
+local fontdata = fonts.ids
+
+otf.features.process = { }
+
+-- 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 descriptions = false
+local marks = false
+local indices = false
+local unicodes = false
+local currentfont = false
+local lookuptable = false
+local anchorlookups = false
+local handlers = { }
+local rlmode = 0
+local featurevalue = false
+
+-- we cheat a bit and assume that a font,attr combination are kind of ranged
+
+local context_setups = fonts.define.specify.context_setups
+local context_numbers = fonts.define.specify.context_numbers
+local context_merged = fonts.define.specify.context_merged
+
+-- we cannot optimize with "start = first_character(head)" because then we don't
+-- know which rlmode we're in which messes up cursive handling later on
+--
+-- head is always a whatsit so we can safely assume that head is not changed
+
+local special_attributes = {
+ init = 1,
+ medi = 2,
+ fina = 3,
+ isol = 4
+}
+
+-- we use this for special testing and documentation
+
+local checkstep = (nodes and nodes.tracers and nodes.tracers.steppers.check) or function() end
+local registerstep = (nodes and nodes.tracers and nodes.tracers.steppers.register) or function() end
+local registermessage = (nodes and nodes.tracers and nodes.tracers.steppers.message) or function() end
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf direct",...)
+end
+local function logwarning(...)
+ logs.report("otf direct",...)
+end
+
+local function gref(n)
+ if type(n) == "number" then
+ local description = descriptions[n]
+ local name = description and description.name
+ if name then
+ return format("U+%04X (%s)",n,name)
+ else
+ return format("U+%04X",n)
+ end
+ elseif not n then
+ return "<error in tracing>"
+ else
+ local num, nam = { }, { }
+ for i=1,#n do
+ local ni = n[i]
+ num[#num+1] = format("U+%04X",ni)
+ local dni = descriptions[ni]
+ nam[#num] = (dni and dni.name) or "?"
+ end
+ return format("%s (%s)",concat(num," "), concat(nam," "))
+ end
+end
+
+local function cref(kind,chainname,chainlookupname,lookupname,index)
+ if index then
+ return format("feature %s, chain %s, sub %s, lookup %s, index %s",kind,chainname,chainlookupname,lookupname,index)
+ elseif lookupname then
+ return format("feature %s, chain %s, sub %s, lookup %s",kind,chainname or "?",chainlookupname or "?",lookupname)
+ elseif chainlookupname then
+ return format("feature %s, chain %s, sub %s",kind,chainname or "?",chainlookupname)
+ elseif chainname then
+ return format("feature %s, chain %s",kind,chainname)
+ else
+ return format("feature %s",kind)
+ end
+end
+
+local function pref(kind,lookupname)
+ return format("feature %s, lookup %s",kind,lookupname)
+end
+
+-- we can assume that languages that use marks are not hyphenated
+-- we can also assume that at most one discretionary is present
+
+local function markstoligature(kind,lookupname,start,stop,char)
+ local n = copy_node(start)
+ local keep = start
+ local current
+ current, start = insert_node_after(start,start,n)
+ local snext = stop.next
+ current.next = snext
+ if snext then
+ snext.prev = current
+ end
+ start.prev, stop.next = nil, nil
+ current.char, current.subtype, current.components = char, 2, start
+ return keep
+end
+
+local function toligature(kind,lookupname,start,stop,char,markflag,discfound) -- brr head
+ if start ~= stop then
+--~ if discfound then
+--~ local lignode = copy_node(start)
+--~ lignode.font = start.font
+--~ lignode.char = char
+--~ lignode.subtype = 2
+--~ start = node.do_ligature_n(start, stop, lignode)
+--~ if start.id == disc then
+--~ local prev = start.prev
+--~ start = start.next
+--~ end
+ if discfound then
+ -- print("start->stop",nodes.tosequence(start,stop))
+ local lignode = copy_node(start)
+ lignode.font, lignode.char, lignode.subtype = start.font, char, 2
+ local next, prev = stop.next, start.prev
+ stop.next = nil
+ lignode = node.do_ligature_n(start, stop, lignode)
+ prev.next = lignode
+ if next then
+ next.prev = lignode
+ end
+ lignode.next, lignode.prev = next, prev
+ start = lignode
+ -- print("start->end",nodes.tosequence(start))
+ else -- start is the ligature
+ local deletemarks = markflag ~= "mark"
+ local n = copy_node(start)
+ local current
+ current, start = insert_node_after(start,start,n)
+ local snext = stop.next
+ current.next = snext
+ if snext then
+ snext.prev = current
+ end
+ start.prev, stop.next = nil, nil
+ current.char, current.subtype, current.components = char, 2, start
+ local head = current
+ if deletemarks then
+ if trace_marks then
+ while start do
+ if marks[start.char] then
+ logwarning("%s: remove mark %s",pref(kind,lookupname),gref(start.char))
+ end
+ start = start.next
+ end
+ end
+ else
+ local i = 0
+ while start do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
+ end
+ head, current = insert_node_after(head,current,copy_node(start))
+ else
+ i = i + 1
+ end
+ start = start.next
+ end
+ start = current.next
+ while start and start.id == glyph do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
+ end
+ else
+ break
+ end
+ start = start.next
+ end
+ end
+ return head
+ end
+ else
+ start.char = char
+ end
+ return start
+end
+
+function handlers.gsub_single(start,kind,lookupname,replacement)
+ if trace_singles then
+ logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(start.char),gref(replacement))
+ end
+ start.char = replacement
+ return start, true
+end
+
+local function alternative_glyph(start,alternatives,kind,chainname,chainlookupname,lookupname) -- chainname and chainlookupname optional
+ local value, choice, n = featurevalue or tfmdata.shared.features[kind], nil, #alternatives -- global value, brrr
+ if value == "random" then
+ local r = math.random(1,n)
+ value, choice = format("random, choice %s",r), alternatives[r]
+ elseif value == "first" then
+ value, choice = format("first, choice %s",1), alternatives[1]
+ elseif value == "last" then
+ value, choice = format("last, choice %s",n), alternatives[n]
+ else
+ value = tonumber(value)
+ if type(value) ~= "number" then
+ value, choice = "default, choice 1", alternatives[1]
+ elseif value > n then
+ value, choice = format("no %s variants, taking %s",value,n), alternatives[n]
+ elseif value == 0 then
+ value, choice = format("choice %s (no change)",value), start.char
+ elseif value < 1 then
+ value, choice = format("no %s variants, taking %s",value,1), alternatives[1]
+ else
+ value, choice = format("choice %s",value), alternatives[value]
+ end
+ end
+ if not choice then
+ logwarning("%s: no variant %s for %s",cref(kind,chainname,chainlookupname,lookupname),value,gref(start.char))
+ choice, value = start.char, format("no replacement instead of %s",value)
+ end
+ return choice, value
+end
+
+function handlers.gsub_alternate(start,kind,lookupname,alternative,sequence)
+ local choice, index = alternative_glyph(start,alternative,kind,lookupname)
+ if trace_alternatives then
+ logprocess("%s: replacing %s by alternative %s (%s)",pref(kind,lookupname),gref(start.char),gref(choice),index)
+ end
+ start.char = choice
+ return start, true
+end
+
+function handlers.gsub_multiple(start,kind,lookupname,multiple)
+ if trace_multiples then
+ logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple))
+ end
+ start.char = multiple[1]
+ if #multiple > 1 then
+ for k=2,#multiple do
+ local n = copy_node(start)
+ n.char = multiple[k]
+ local sn = start.next
+ n.next = sn
+ n.prev = start
+ if sn then
+ sn.prev = n
+ end
+ start.next = n
+ start = n
+ end
+ end
+ return start, true
+end
+
+function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or maybe pass lookup ref
+ local s, stop, discfound = start.next, nil, false
+ local startchar = start.char
+ if marks[startchar] then
+ while s do
+ local id = s.id
+ if id == glyph and s.subtype<256 then
+ if s.font == currentfont then
+ local char = s.char
+ local lg = ligature[1][char]
+ if not lg then
+ break
+ else
+ stop = s
+ ligature = lg
+ s = s.next
+ end
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if stop and ligature[2] then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = markstoligature(kind,lookupname,start,stop,ligature[2])
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = markstoligature(kind,lookupname,start,stop,ligature[2])
+ end
+ return start, true
+ end
+ else
+ local skipmark = sequence.flags[1]
+ while s do
+ local id = s.id
+ if id == glyph and s.subtype<256 then
+ if s.font == currentfont then
+ local char = s.char
+ if skipmark and marks[char] then
+ s = s.next
+ else
+ local lg = ligature[1][char]
+ if not lg then
+ break
+ else
+ stop = s
+ ligature = lg
+ s = s.next
+ end
+ end
+ else
+ break
+ end
+ elseif id == disc then
+ discfound = true
+ s = s.next
+ else
+ break
+ end
+ end
+ if stop and ligature[2] then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
+ end
+ return start, true
+ end
+ end
+ return start, false
+end
+
+--[[ldx--
+<p>We get hits on a mark, but we're not sure if the it has to be applied so
+we need to explicitly test for basechar, baselig and basemark entries.</p>
+--ldx]]--
+
+function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
+ local markchar = start.char
+ if marks[markchar] then
+ local base = start.prev -- [glyph] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+ end
+ end
+ end
+ local baseanchors = descriptions[basechar]
+ if baseanchors then
+ baseanchors = baseanchors.anchors
+ end
+ if baseanchors then
+ local baseanchors = baseanchors['basechar']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
+ pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s, no matching anchors for mark %s and base %s",pref(kind,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
+ fonts.register_message(currentfont,basechar,"no base anchors")
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char",pref(kind,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
+ -- check chainpos variant
+ local markchar = start.char
+ if marks[markchar] then
+ local base = start.prev -- [glyph] [optional marks] [start=mark]
+ local index = 1
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ else
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+ end
+ end
+ end
+ local i = has_attribute(start,markdone)
+ if i then index = i end
+ local baseanchors = descriptions[basechar]
+ if baseanchors then
+ baseanchors = baseanchors.anchors
+ if baseanchors then
+ local baseanchors = baseanchors['baselig']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ ba = ba[index]
+ if ba then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ if trace_marks then
+ logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
+ pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and baselig %s",pref(kind,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
+ fonts.register_message(currentfont,basechar,"no base anchors")
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char",pref(kind,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
+ local markchar = start.char
+ if marks[markchar] then
+--~ local alreadydone = markonce and has_attribute(start,markmark)
+--~ if not alreadydone then
+ local base = start.prev -- [glyph] [basemark] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ local basechar = base.char
+ local baseanchors = descriptions[basechar]
+ if baseanchors then
+ baseanchors = baseanchors.anchors
+ if baseanchors then
+ baseanchors = baseanchors['basemark']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
+ pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start,true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and basemark %s",pref(kind,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
+ fonts.register_message(currentfont,basechar,"no base anchors")
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no mark",pref(kind,lookupname))
+ end
+--~ elseif trace_marks and trace_details then
+--~ logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone)
+--~ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar))
+ end
+ return start,false
+end
+
+function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to be checked
+ local alreadydone = cursonce and has_attribute(start,cursbase)
+ if not alreadydone then
+ local done = false
+ local startchar = start.char
+ if marks[startchar] then
+ if trace_cursive then
+ logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
+ end
+ else
+ local nxt = start.next
+ while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ local nextchar = nxt.char
+ if marks[nextchar] then
+ -- should not happen (maybe warning)
+ nxt = nxt.next
+ else
+ local entryanchors = descriptions[nextchar]
+ if entryanchors then
+ entryanchors = entryanchors.anchors
+ if entryanchors then
+ entryanchors = entryanchors['centry']
+ if entryanchors then
+ local al = anchorlookups[lookupname]
+ for anchor, entry in next, entryanchors do
+ if al[anchor] then
+ local exit = exitanchors[anchor]
+ if exit then
+ local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ if trace_cursive then
+ logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
+ end
+ done = true
+ break
+ end
+ end
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
+ fonts.register_message(currentfont,startchar,"no entry anchors")
+ end
+ break
+ end
+ end
+ end
+ return start, done
+ else
+ if trace_cursive and trace_details then
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ end
+ return start, false
+ end
+end
+
+function handlers.gpos_single(start,kind,lookupname,kerns,sequence)
+ local startchar = start.char
+ local dx, dy, w, h = set_pair(start,tfmdata.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting single %s by (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),dx,dy,w,h)
+ end
+ return start, false
+end
+
+function handlers.gpos_pair(start,kind,lookupname,kerns,sequence)
+ -- todo: kerns in disc nodes: pre, post, replace -> loop over disc too
+ -- todo: kerns in components of ligatures
+ local snext = start.next
+ if not snext then
+ return start, false
+ else
+ local prev, done = start, false
+ local factor = tfmdata.factor
+ while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local nextchar = snext.char
+local krn = kerns[nextchar]
+ if not krn and marks[nextchar] then
+ prev = snext
+ snext = snext.next
+ else
+ local krn = kerns[nextchar]
+ if not krn then
+ -- skip
+ elseif type(krn) == "table" then
+ if krn[1] == "pair" then
+ local a, b = krn[3], krn[4]
+ if a and #a > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting first of pair %s and %s by (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ if b and #b > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
+ if trace_kerns then
+ logprocess("%s: shifting second of pair %s and %s by (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ else
+ logs.report("%s: check this out (old kern stuff)",pref(kind,lookupname))
+ local a, b = krn[3], krn[7]
+ if a and a ~= 0 then
+ local k = set_kern(snext,factor,rlmode,a)
+ if trace_kerns then
+ logprocess("%s: inserting first kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar))
+ end
+ end
+ if b and b ~= 0 then
+ logwarning("%s: ignoring second kern xoff %s",pref(kind,lookupname),b*factor)
+ end
+ end
+ done = true
+ elseif krn ~= 0 then
+ local k = set_kern(snext,factor,rlmode,krn)
+ if trace_kerns then
+ logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar))
+ end
+ done = true
+ end
+ break
+ end
+ end
+ return start, done
+ end
+end
+
+--[[ldx--
+<p>I will implement multiple chain replacements once I run into a font that uses
+it. It's not that complex to handle.</p>
+--ldx]]--
+
+local chainmores = { }
+local chainprocs = { }
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf subchain",...)
+end
+local function logwarning(...)
+ logs.report("otf subchain",...)
+end
+
+-- ['coverage']={
+-- ['after']={ "r" },
+-- ['before']={ "q" },
+-- ['current']={ "a", "b", "c" },
+-- },
+-- ['lookups']={ "ls_l_1", "ls_l_1", "ls_l_1" },
+
+function chainmores.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname,n)
+ logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+
+-- handled later:
+--
+-- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- end
+
+function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+ logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+ logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+
+-- handled later:
+--
+-- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- end
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf chain",...)
+end
+local function logwarning(...)
+ logs.report("otf chain",...)
+end
+
+-- We could share functions but that would lead to extra function calls with many
+-- arguments, redundant tests and confusing messages.
+
+function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname)
+ logwarning("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+
+-- The reversesub is a special case, which is why we need to store the replacements
+-- in a bit weird way. There is no lookup and the replacement comes from the lookup
+-- itself. It is meant mostly for dealing with Urdu.
+
+function chainprocs.reversesub(start,stop,kind,chainname,currentcontext,cache,replacements)
+ local char = start.char
+ local replacement = replacements[char]
+ if replacement then
+ if trace_singles then
+ logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement))
+ end
+ start.char = replacement
+ return start, true
+ else
+ return start, false
+ end
+end
+
+--[[ldx--
+<p>This chain stuff is somewhat tricky since we can have a sequence of actions to be
+applied: single, alternate, multiple or ligature where ligature can be an invalid
+one in the sense that it will replace multiple by one but not neccessary one that
+looks like the combination (i.e. it is the counterpart of multiple then). For
+example, the following is valid:</p>
+
+<typing>
+<line>xxxabcdexxx [single a->A][multiple b->BCD][ligature cde->E] xxxABCDExxx</line>
+</typing>
+
+<p>Therefore we we don't really do the replacement here already unless we have the
+single lookup case. The efficiency of the replacements can be improved by deleting
+as less as needed but that would also mke the code even more messy.</p>
+--ldx]]--
+
+local function delete_till_stop(start,stop,ignoremarks)
+ if start ~= stop then
+ -- todo keep marks
+ local done = false
+ while not done do
+ done = start == stop
+ delete_node(start,start.next)
+ end
+ end
+end
+
+--[[ldx--
+<p>Here we replace start by a single variant, First we delete the rest of the
+match.</p>
+--ldx]]--
+
+function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+ -- todo: marks ?
+ if not chainindex then
+ delete_till_stop(start,stop) -- ,currentlookup.flags[1])
+ end
+ local current = start
+ local subtables = currentlookup.subtables
+ while current do
+ if current.id == glyph then
+ local currentchar = current.char
+ local lookupname = subtables[1]
+ local replacement = cache.gsub_single[lookupname]
+ if not replacement then
+ if trace_bugs then
+ logwarning("%s: no single hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
+ end
+ else
+ replacement = replacement[currentchar]
+ if not replacement then
+ if trace_bugs then
+ logwarning("%s: no single for %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar))
+ end
+ else
+ if trace_singles then
+ logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement))
+ end
+ current.char = replacement
+ end
+ end
+ return start, true
+ elseif current == stop then
+ break
+ else
+ current = current.next
+ end
+ end
+ return start, false
+end
+
+chainmores.gsub_single = chainprocs.gsub_single
+
+--[[ldx--
+<p>Here we replace start by a sequence of new glyphs. First we delete the rest of
+the match.</p>
+--ldx]]--
+
+function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ delete_till_stop(start,stop)
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local replacements = cache.gsub_multiple[lookupname]
+ if not replacements then
+ if trace_bugs then
+ logwarning("%s: no multiple hits",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ else
+ replacements = replacements[startchar]
+ if not replacements then
+ if trace_bugs then
+ logwarning("%s: no multiple for %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar))
+ end
+ else
+ if trace_multiples then
+ logprocess("%s: replacing %s by multiple characters %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar),gref(replacements))
+ end
+ local sn = start.next
+ for k=1,#replacements do
+ if k == 1 then
+ start.char = replacements[k]
+ else
+ local n = copy_node(start) -- maybe delete the components and such
+ n.char = replacements[k]
+ n.next, n.prev = sn, start
+ if sn then
+ sn.prev = n
+ end
+ start.next, start = n, n
+ end
+ end
+ return start, true
+ end
+ end
+ return start, false
+end
+
+--[[ldx--
+<p>Here we replace start by new glyph. First we delete the rest of the match.</p>
+--ldx]]--
+
+function chainprocs.gsub_alternate(start,stop,kind,lookupname,currentcontext,cache,currentlookup)
+ -- todo: marks ?
+ delete_till_stop(start,stop)
+ local current = start
+ local subtables = currentlookup.subtables
+ while current do
+ if current.id == glyph then
+ local currentchar = current.char
+ local lookupname = subtables[1]
+ local alternatives = cache.gsub_alternate[lookupname]
+ if not alternatives then
+ if trace_bugs then
+ logwarning("%s: no alternative hits",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ else
+ alternatives = alternatives[currentchar]
+ if not alternatives then
+ if trace_bugs then
+ logwarning("%s: no alternative for %s",cref(kind,chainname,chainlookupname,lookupname),gref(currentchar))
+ end
+ else
+ local choice, index = alternative_glyph(current,alternatives,kind,chainname,chainlookupname,lookupname)
+ current.char = choice
+ if trace_alternatives then
+ logprocess("%s: replacing single %s by alternative %s (%s)",cref(kind,chainname,chainlookupname,lookupname),index,gref(currentchar),gref(choice),index)
+ end
+ end
+ end
+ return start, true
+ elseif current == stop then
+ break
+ else
+ current = current.next
+ end
+ end
+ return start, false
+end
+
+--[[ldx--
+<p>When we replace ligatures we use a helper that handles the marks. I might change
+this function (move code inline and handle the marks by a separate function). We
+assume rather stupid ligatures (no complex disc nodes).</p>
+--ldx]]--
+
+function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local ligatures = cache.gsub_ligature[lookupname]
+ if not ligatures then
+ if trace_bugs then
+ logwarning("%s: no ligature hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
+ end
+ else
+ ligatures = ligatures[startchar]
+ if not ligatures then
+ if trace_bugs then
+ logwarning("%s: no ligatures starting with %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
+ end
+ else
+ local s, discfound, last, nofreplacements = start.next, false, stop, 0
+ while s do
+ local id = s.id
+ if id == disc then
+ s = s.next
+ discfound = true
+ else
+ local schar = s.char
+ if marks[schar] then -- marks
+ s = s.next
+ else
+ local lg = ligatures[1][schar]
+ if not lg then
+ break
+ else
+ ligatures, last, nofreplacements = lg, s, nofreplacements + 1
+ if s == stop then
+ break
+ else
+ s = s.next
+ end
+ end
+ end
+ end
+ end
+ local l2 = ligatures[2]
+ if l2 then
+ if chainindex then
+ stop = last
+ end
+ if trace_ligatures then
+ if start == stop then
+ logprocess("%s: replacing character %s by ligature %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(l2))
+ else
+ logprocess("%s: replacing character %s upto %s by ligature %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2))
+ end
+ end
+ start = toligature(kind,lookup,start,stop,l2,currentlookup.flags[1],discfound)
+ return start, true, nofreplacements
+ elseif trace_bugs then
+ if start == stop then
+ logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
+ else
+ logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char))
+ end
+ end
+ end
+ end
+ return start, false, 0
+end
+
+chainmores.gsub_ligature = chainprocs.gsub_ligature
+
+function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local markchar = start.char
+ if marks[markchar] then
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local markanchors = cache.gpos_mark2base[lookupname]
+ if markanchors then
+ markanchors = markanchors[markchar]
+ end
+ if markanchors then
+ local base = start.prev -- [glyph] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+ end
+ end
+ end
+ local baseanchors = descriptions[basechar].anchors
+ if baseanchors then
+ local baseanchors = baseanchors['basechar']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s, no matching anchors for mark %s and base %s",cref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local markchar = start.char
+ if marks[markchar] then
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local markanchors = cache.gpos_mark2ligature[lookupname]
+ if markanchors then
+ markanchors = markanchors[markchar]
+ end
+ if markanchors then
+ local base = start.prev -- [glyph] [optional marks] [start=mark]
+ local index = 1
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ else
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",cref(kind,chainname,chainlookupname,lookupname),markchar)
+ end
+ return start, false
+ end
+ end
+ end
+ -- todo: like marks a ligatures hash
+ local i = has_attribute(start,markdone)
+ if i then index = i end
+ local baseanchors = descriptions[basechar].anchors
+ if baseanchors then
+ local baseanchors = baseanchors['baselig']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ ba = ba[index]
+ if ba then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and baselig %s",cref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("feature %s, lookup %s: prev node is no char",kind,lookupname)
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local markchar = start.char
+ if marks[markchar] then
+--~ local alreadydone = markonce and has_attribute(start,markmark)
+--~ if not alreadydone then
+ -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local markanchors = cache.gpos_mark2mark[lookupname]
+ if markanchors then
+ markanchors = markanchors[markchar]
+ end
+ if markanchors then
+ local base = start.prev -- [glyph] [basemark] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ local basechar = base.char
+ local baseanchors = descriptions[basechar].anchors
+ if baseanchors then
+ baseanchors = baseanchors['basemark']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
+--~ elseif trace_marks and trace_details then
+--~ logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone)
+--~ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
+ end
+ return start, false
+end
+
+-- ! ! ! untested ! ! !
+
+function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local alreadydone = cursonce and has_attribute(start,cursbase)
+ if not alreadydone then
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local exitanchors = cache.gpos_cursive[lookupname]
+ if exitanchors then
+ exitanchors = exitanchors[startchar]
+ end
+ if exitanchors then
+ local done = false
+ if marks[startchar] then
+ if trace_cursive then
+ logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
+ end
+ else
+ local nxt = start.next
+ while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ local nextchar = nxt.char
+ if marks[nextchar] then
+ -- should not happen (maybe warning)
+ nxt = nxt.next
+ else
+ local entryanchors = descriptions[nextchar]
+ if entryanchors then
+ entryanchors = entryanchors.anchors
+ if entryanchors then
+ entryanchors = entryanchors['centry']
+ if entryanchors then
+ local al = anchorlookups[lookupname]
+ for anchor, entry in next, entryanchors do
+ if al[anchor] then
+ local exit = exitanchors[anchor]
+ if exit then
+ local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ if trace_cursive then
+ logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
+ end
+ done = true
+ break
+ end
+ end
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
+ fonts.register_message(currentfont,startchar,"no entry anchors")
+ end
+ break
+ end
+ end
+ end
+ return start, done
+ else
+ if trace_cursive and trace_details then
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ end
+ return start, false
+ end
+ end
+ return start, false
+end
+
+function chainprocs.gpos_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
+ -- untested
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local kerns = cache.gpos_single[lookupname]
+ if kerns then
+ kerns = kerns[startchar]
+ if kerns then
+ local dx, dy, w, h = set_pair(start,tfmdata.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting single %s by (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),dx,dy,w,h)
+ end
+ end
+ end
+ return start, false
+end
+
+-- when machines become faster i will make a shared function
+
+function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
+-- logwarning("%s: gpos_pair not yet supported",cref(kind,chainname,chainlookupname))
+ local snext = start.next
+ if snext then
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local kerns = cache.gpos_pair[lookupname]
+ if kerns then
+ kerns = kerns[startchar]
+ if kerns then
+ local prev, done = start, false
+ local factor = tfmdata.factor
+ while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local nextchar = snext.char
+ local krn = kerns[nextchar]
+ if not krn and marks[nextchar] then
+ prev = snext
+ snext = snext.next
+ else
+ if not krn then
+ -- skip
+ elseif type(krn) == "table" then
+ if krn[1] == "pair" then
+ local a, b = krn[3], krn[4]
+ if a and #a > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting first of pair %s and %s by (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ if b and #b > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
+ if trace_kerns then
+ logprocess("%s: shifting second of pair %s and %s by (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ else
+ logs.report("%s: check this out (old kern stuff)",cref(kind,chainname,chainlookupname))
+ local a, b = krn[3], krn[7]
+ if a and a ~= 0 then
+ local k = set_kern(snext,factor,rlmode,a)
+ if trace_kerns then
+ logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ end
+ end
+ if b and b ~= 0 then
+ logwarning("%s: ignoring second kern xoff %s",cref(kind,chainname,chainlookupname),b*factor)
+ end
+ end
+ done = true
+ elseif krn ~= 0 then
+ local k = set_kern(snext,factor,rlmode,krn)
+ if trace_kerns then
+ logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ end
+ done = true
+ end
+ break
+ end
+ end
+ return start, done
+ end
+ end
+ end
+ return start, false
+end
+
+-- what pointer to return, spec says stop
+-- to be discussed ... is bidi changer a space?
+-- elseif char == zwnj and sequence[n][32] then -- brrr
+
+-- somehow l or f is global
+-- we don't need to pass the currentcontext, saves a bit
+-- make a slow variant then can be activated but with more tracing
+
+local function show_skip(kind,chainname,char,ck,class)
+ if ck[9] then
+ logwarning("%s: skipping char %s (%s) in rule %s, lookuptype %s (%s=>%s)",cref(kind,chainname),gref(char),class,ck[1],ck[2],ck[9],ck[10])
+ else
+ logwarning("%s: skipping char %s (%s) in rule %s, lookuptype %s",cref(kind,chainname),gref(char),class,ck[1],ck[2])
+ end
+end
+
+local function normal_handle_contextchain(start,kind,chainname,contexts,sequence,cache)
+ -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
+ local flags, done = sequence.flags, false
+ local skipmark, skipligature, skipbase = flags[1], flags[2], flags[3]
+ local someskip = skipmark or skipligature or skipbase -- could be stored in flags for a fast test (hm, flags could be false !)
+ local markclass = sequence.markclass -- todo, first we need a proper test
+ local skipped = false
+ for k=1,#contexts do
+ local match, current, last = true, start, start
+ local ck = contexts[k]
+ local seq = ck[3]
+ local s = #seq
+ -- f..l = mid string
+ if s == 1 then
+ -- never happens
+ match = current.id == glyph and current.subtype<256 and current.font == currentfont and seq[1][current.char]
+ else
+ -- todo: better space check (maybe check for glue)
+ local f, l = ck[4], ck[5]
+ if f == l then
+ -- already a hit
+ match = true
+ else
+ -- no need to test first hit (to be optimized)
+ local n = f + 1
+ last = last.next
+ -- we cannot optimize for n=2 because there can be disc nodes
+ -- if not someskip and n == l then
+ -- -- n=2 and no skips then faster loop
+ -- match = last and last.id == glyph and last.subtype<256 and last.font == currentfont and seq[n][last.char]
+ -- else
+ while n <= l do
+ if last then
+ local id = last.id
+ if id == glyph then
+ if last.subtype<256 and last.font == currentfont then
+ local char = last.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ skipped = true
+ if trace_skips then
+ show_skip(kind,chainname,char,ck,class)
+ end
+ last = last.next
+ elseif seq[n][char] then
+ if n < l then
+ last = last.next
+ end
+ n = n + 1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ elseif id == disc then -- what to do with kerns?
+ last = last.next
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ end
+ -- end
+ end
+ if match and f > 1 then
+ -- before
+ local prev = start.prev
+ if prev then
+ local n = f-1
+ while n >= 1 do
+ if prev then
+ local id = prev.id
+ if id == glyph then
+ if prev.subtype<256 and prev.font == currentfont then -- normal char
+ local char = prev.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ skipped = true
+ if trace_skips then
+ show_skip(kind,chainname,char,ck,class)
+ end
+ elseif seq[n][char] then
+ n = n -1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ elseif id == disc then
+ -- skip 'm
+ elseif seq[n][32] then
+ n = n -1
+ else
+ match = false break
+ end
+ prev = prev.prev
+ elseif seq[n][32] then
+ n = n -1
+ else
+ match = false break
+ end
+ end
+ elseif f == 2 then
+ match = seq[1][32]
+ else
+ for n=f-1,1 do
+ if not seq[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ if match and s > l then
+ -- after
+ local current = last.next
+ if current then
+ -- removed optimization for s-l == 1, we have to deal with marks anyway
+ local n = l + 1
+ while n <= s do
+ if current then
+ local id = current.id
+ if id == glyph then
+ if current.subtype<256 and current.font == currentfont then -- normal char
+ local char = current.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ skipped = true
+ if trace_skips then
+ show_skip(kind,chainname,char,ck,class)
+ end
+ elseif seq[n][char] then
+ n = n + 1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ elseif id == disc then
+ -- skip 'm
+ elseif seq[n][32] then -- brrr
+ n = n + 1
+ else
+ match = false break
+ end
+ current = current.next
+ elseif seq[n][32] then
+ n = n + 1
+ else
+ match = false break
+ end
+ end
+ elseif s-l == 1 then
+ match = seq[s][32]
+ else
+ for n=l+1,s do
+ if not seq[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ end
+ if match then
+ -- ck == currentcontext
+ if trace_contexts then
+ local rule, lookuptype, f, l = ck[1], ck[2], ck[4], ck[5]
+ local char = start.char
+ if ck[9] then
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s (%s=>%s)",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
+ else
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype)
+ end
+ end
+ local chainlookups = ck[6]
+ if chainlookups then
+ local nofchainlookups = #chainlookups
+ -- we can speed this up if needed
+ if nofchainlookups == 1 then
+ local chainlookupname = chainlookups[1]
+ local chainlookup = lookuptable[chainlookupname]
+ local cp = chainprocs[chainlookup.type]
+ if cp then
+ start, done = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,nil,sequence)
+ else
+ logprocess("%s: %s is not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
+ end
+ else
+ -- actually this needs a more complex treatment for which we will use chainmores
+--~ local i = 1
+--~ repeat
+--~ local chainlookupname = chainlookups[i]
+--~ local chainlookup = lookuptable[chainlookupname]
+--~ local cp = chainmores[chainlookup.type]
+--~ if cp then
+--~ local ok, n
+--~ start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
+--~ -- messy since last can be changed !
+--~ if ok then
+--~ done = true
+--~ start = start.next
+--~ if n then
+--~ -- skip next one(s) if ligature
+--~ i = i + n - 1
+--~ end
+--~ end
+--~ else
+--~ logprocess("%s: multiple subchains for %s are not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
+--~ end
+--~ i = i + 1
+--~ until i > nofchainlookups
+
+ local i = 1
+ repeat
+if skipped then
+ while true do
+ local char = start.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ start = start.next
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+end
+ local chainlookupname = chainlookups[i]
+ local chainlookup = lookuptable[chainlookupname]
+ local cp = chainmores[chainlookup.type]
+ if cp then
+ local ok, n
+ start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
+ -- messy since last can be changed !
+ if ok then
+ done = true
+ -- skip next one(s) if ligature
+ i = i + (n or 1)
+ else
+ i = i + 1
+ end
+ else
+ logprocess("%s: multiple subchains for %s are not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
+ i = i + 1
+ end
+ start = start.next
+ until i > nofchainlookups
+
+ end
+ else
+ local replacements = ck[7]
+ if replacements then
+ start, done = chainprocs.reversesub(start,last,kind,chainname,ck,cache,replacements) -- sequence
+ else
+ done = true -- can be meant to be skipped
+ if trace_contexts then
+ logprocess("%s: skipping match",cref(kind,chainname))
+ end
+ end
+ end
+ end
+ end
+ return start, done
+end
+
+-- Because we want to keep this elsewhere (an because speed is less an issue) we
+-- pass the font id so that the verbose variant can access the relevant helper tables.
+
+local verbose_handle_contextchain = function(font,...)
+ logwarning("no verbose handler installed, reverting to 'normal'")
+ otf.setcontextchain()
+ return normal_handle_contextchain(...)
+end
+
+otf.chainhandlers = {
+ normal = normal_handle_contextchain,
+ verbose = verbose_handle_contextchain,
+}
+
+function otf.setcontextchain(method)
+ if not method or method == "normal" or not otf.chainhandlers[method] then
+ if handlers.contextchain then -- no need for a message while making the format
+ logwarning("installing normal contextchain handler")
+ end
+ handlers.contextchain = normal_handle_contextchain
+ else
+ logwarning("installing contextchain handler '%s'",method)
+ local handler = otf.chainhandlers[method]
+ handlers.contextchain = function(...)
+ return handler(currentfont,...) -- hm, get rid of ...
+ end
+ end
+ handlers.gsub_context = handlers.contextchain
+ handlers.gsub_contextchain = handlers.contextchain
+ handlers.gsub_reversecontextchain = handlers.contextchain
+ handlers.gpos_contextchain = handlers.contextchain
+ handlers.gpos_context = handlers.contextchain
+end
+
+otf.setcontextchain()
+
+local missing = { } -- we only report once
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf process",...)
+end
+local function logwarning(...)
+ logs.report("otf process",...)
+end
+
+local function report_missing_cache(typ,lookup)
+ local f = missing[currentfont] if not f then f = { } missing[currentfont] = f end
+ local t = f[typ] if not t then t = { } f[typ] = t end
+ if not t[lookup] then
+ t[lookup] = true
+ logwarning("missing cache for lookup %s of type %s in font %s (%s)",lookup,typ,currentfont,tfmdata.fullname)
+ end
+end
+
+local resolved = { } -- we only resolve a font,script,language pair once
+
+-- todo: pass all these 'locals' in a table
+
+function fonts.methods.node.otf.features(head,font,attr)
+ if trace_steps then
+ checkstep(head)
+ end
+ tfmdata = fontdata[font]
+ local shared = tfmdata.shared
+ otfdata = shared.otfdata
+ local luatex = otfdata.luatex
+ descriptions = tfmdata.descriptions
+ characters = tfmdata.characters
+ indices = tfmdata.indices
+ unicodes = tfmdata.unicodes
+ marks = tfmdata.marks
+ anchorlookups = luatex.lookup_to_anchor
+ currentfont = font
+ rlmode = 0
+ local featuredata = otfdata.shared.featuredata -- can be made local to closure
+ local sequences = luatex.sequences
+ lookuptable = luatex.lookups
+ local done = false
+ local script, language, s_enabled, a_enabled, dyn
+ local attribute_driven = attr and attr ~= 0
+ if attribute_driven then
+ local features = context_setups[context_numbers[attr]] -- could be a direct list
+ dyn = context_merged[attr] or 0
+ language, script = features.language or "dflt", features.script or "dflt"
+ a_enabled = features -- shared.features -- can be made local to the resolver
+ if dyn == 2 or dyn == -2 then
+ -- font based
+ s_enabled = shared.features
+ end
+ else
+ language, script = tfmdata.language or "dflt", tfmdata.script or "dflt"
+ s_enabled = shared.features -- can be made local to the resolver
+ dyn = 0
+ end
+ -- we can save some runtime by caching feature tests
+ local res = resolved[font] if not res then res = { } resolved[font] = res end
+ local rs = res [script] if not rs then rs = { } res [script] = rs end
+ local rl = rs [language] if not rl then rl = { } rs [language] = rl end
+ local ra = rl [attr] if ra == nil then ra = { } rl [attr] = ra end -- attr can be false
+ -- sequences always > 1 so no need for optimization
+ for s=1,#sequences do
+ local pardir, txtdir = 0, { }
+ local success = false
+ local sequence = sequences[s]
+ local r = ra[s] -- cache
+ if r == nil then
+ --
+ -- this bit will move to font-ctx and become a function
+ ---
+ local chain = sequence.chain or 0
+ local features = sequence.features
+ if not features then
+ -- indirect lookup, part of chain (todo: make this a separate table)
+ r = false -- { false, false, chain }
+ else
+ local valid, attribute, kind, what = false, false
+ for k,v in next, features do
+ -- we can quit earlier but for the moment we want the tracing
+ local s_e = s_enabled and s_enabled[k]
+ local a_e = a_enabled and a_enabled[k]
+ if s_e or a_e then
+ local l = v[script] or v[wildcard]
+ if l then
+ -- not l[language] or l[default] or l[wildcard] because we want tracing
+ -- only first attribute match check, so we assume simple fina's
+ -- default can become a font feature itself
+ if l[language] then
+ valid, what = s_e or a_e, language
+ -- elseif l[default] then
+ -- valid, what = true, default
+ elseif l[wildcard] then
+ valid, what = s_e or a_e, wildcard
+ end
+ if valid then
+ kind, attribute = k, special_attributes[k] or false
+ if a_e and dyn < 0 then
+ valid = false
+ end
+ if trace_applied then
+ local typ, action = match(sequence.type,"(.*)_(.*)")
+ logs.report("otf node mode",
+ "%s font: %03i, dynamic: %03i, kind: %s, lookup: %3i, script: %-4s, language: %-4s (%-4s), type: %s, action: %s, name: %s",
+ (valid and "+") or "-",font,attr or 0,kind,s,script,language,what,typ,action,sequence.name)
+ end
+ break
+ end
+ end
+ end
+ end
+ if valid then
+ r = { valid, attribute, chain, kind }
+ else
+ r = false -- { valid, attribute, chain, "generic" } -- false anyway, could be flag instead of table
+ end
+ end
+ ra[s] = r
+ end
+ featurevalue = r and r[1] -- todo: pass to function instead of using a global
+ if featurevalue then
+ local attribute, chain, typ, subtables = r[2], r[3], sequence.type, sequence.subtables
+ if chain < 0 then
+ -- this is a limited case, no special treatments like 'init' etc
+ local handler = handlers[typ]
+ local thecache = featuredata[typ] or { }
+ -- we need to get rid of this slide !
+ local start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo
+ while start do
+ local id = start.id
+ if id == glyph then
+ if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) then
+--~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) then
+ for i=1,#subtables do
+ local lookupname = subtables[i]
+ local lookupcache = thecache[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ start, success = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
+ if success then
+ break
+ end
+ end
+ else
+ report_missing_cache(typ,lookupname)
+ end
+ end
+ if start then start = start.prev end
+ else
+ start = start.prev
+ end
+ else
+ start = start.prev
+ end
+ end
+ else
+ local handler = handlers[typ]
+ local ns = #subtables
+ local thecache = featuredata[typ] or { }
+ local start = head -- local ?
+ rlmode = 0 -- to be checked ?
+ if ns == 1 then
+ local lookupname = subtables[1]
+ local lookupcache = thecache[lookupname]
+ if not lookupcache then
+ report_missing_cache(typ,lookupname)
+ else
+ while start do
+ local id = start.id
+ if id == glyph then
+--~ if start.font == font and start.subtype<256 and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
+ if start.font == font and start.subtype<256 and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ -- sequence kan weg
+ local ok
+ start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,1)
+ if ok then
+ success = true
+ end
+ end
+ if start then start = start.next end
+ else
+ start = start.next
+ end
+ -- elseif id == glue then
+ -- if p[5] then -- chain
+ -- local pc = pp[32]
+ -- if pc then
+ -- start, ok = start, false -- p[1](start,kind,p[2],pc,p[3],p[4])
+ -- if ok then
+ -- done = true
+ -- end
+ -- if start then start = start.next end
+ -- else
+ -- start = start.next
+ -- end
+ -- else
+ -- start = start.next
+ -- end
+ elseif id == whatsit then
+ local subtype = start.subtype
+ if subtype == 7 then
+ local dir = start.dir
+ if dir == "+TRT" or dir == "+TLT" then
+ insert(txtdir,dir)
+ elseif dir == "-TRT" or dir == "-TLT" then
+ remove(txtdir)
+ end
+ local d = txtdir[#txtdir]
+ if d == "+TRT" then
+ rlmode = -1
+ elseif d == "+TLT" then
+ rlmode = 1
+ else
+ rlmode = pardir
+ end
+ if trace_directions then
+ logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ elseif subtype == 6 then
+ local dir = start.dir
+ if dir == "TRT" then
+ pardir = -1
+ elseif dir == "TLT" then
+ pardir = 1
+ else
+ pardir = 0
+ end
+ rlmode = pardir
+ --~ txtdir = { }
+ if trace_directions then
+ logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ end
+ start = start.next
+ else
+ start = start.next
+ end
+ end
+ end
+ else
+ while start do
+ local id = start.id
+ if id == glyph then
+ if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
+--~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
+ for i=1,ns do
+ local lookupname = subtables[i]
+ local lookupcache = thecache[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ -- we could move all code inline but that makes things even more unreadable
+ local ok
+ start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
+ if ok then
+ success = true
+ break
+ end
+ end
+ else
+ report_missing_cache(typ,lookupname)
+ end
+ end
+ if start then start = start.next end
+ else
+ start = start.next
+ end
+ -- elseif id == glue then
+ -- if p[5] then -- chain
+ -- local pc = pp[32]
+ -- if pc then
+ -- start, ok = start, false -- p[1](start,kind,p[2],pc,p[3],p[4])
+ -- if ok then
+ -- done = true
+ -- end
+ -- if start then start = start.next end
+ -- else
+ -- start = start.next
+ -- end
+ -- else
+ -- start = start.next
+ -- end
+ elseif id == whatsit then
+ local subtype = start.subtype
+ local subtype = start.subtype
+ if subtype == 7 then
+ local dir = start.dir
+ if dir == "+TRT" or dir == "+TLT" then
+ insert(txtdir,dir)
+ elseif dir == "-TRT" or dir == "-TLT" then
+ remove(txtdir)
+ end
+ local d = txtdir[#txtdir]
+ if d == "+TRT" then
+ rlmode = -1
+ elseif d == "+TLT" then
+ rlmode = 1
+ else
+ rlmode = pardir
+ end
+ if trace_directions then
+ logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ elseif subtype == 6 then
+ local dir = start.dir
+ if dir == "TRT" then
+ pardir = -1
+ elseif dir == "TLT" then
+ pardir = 1
+ else
+ pardir = 0
+ end
+ rlmode = pardir
+ --~ txtdir = { }
+ if trace_directions then
+ logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ end
+ start = start.next
+ else
+ start = start.next
+ end
+ end
+ end
+ end
+ if success then
+ done = true
+ end
+ if trace_steps then -- ?
+ registerstep(head)
+ end
+ end
+ end
+ return head, done
+end
+
+otf.features.prepare = { }
+
+-- we used to share code in the following functions but that costs a lot of
+-- memory due to extensive calls to functions (easily hundreds of thousands per
+-- document)
+
+local function split(replacement,original,cache,unicodes)
+ -- we can cache this too, but not the same (although unicode is a unique enough hash)
+ local o, t, n = { }, { }, 0
+ for s in gmatch(original,"[^ ]+") do
+ local us = unicodes[s]
+ if type(us) == "number" then -- tonumber(us)
+ o[#o+1] = us
+ else
+ o[#o+1] = us[1]
+ end
+ end
+ for s in gmatch(replacement,"[^ ]+") do
+ n = n + 1
+ local us = unicodes[s]
+ if type(us) == "number" then -- tonumber(us)
+ t[o[n]] = us
+ else
+ t[o[n]] = us[1]
+ end
+ end
+ return t
+end
+
+local function uncover(covers,result,cache,unicodes)
+ -- lpeg hardly faster (.005 sec on mk)
+ for n=1,#covers do
+ local c = covers[n]
+ local cc = cache[c]
+ if not cc then
+ local t = { }
+ for s in gmatch(c,"[^ ]+") do
+ 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
+ else
+ result[#result+1] = cc
+ end
+ end
+end
+
+local function prepare_lookups(tfmdata)
+ local otfdata = tfmdata.shared.otfdata
+ local featuredata = otfdata.shared.featuredata
+ local anchor_to_lookup = otfdata.luatex.anchor_to_lookup
+ local lookup_to_anchor = otfdata.luatex.lookup_to_anchor
+ --
+ local multiple = featuredata.gsub_multiple
+ local alternate = featuredata.gsub_alternate
+ local single = featuredata.gsub_single
+ local ligature = featuredata.gsub_ligature
+ local pair = featuredata.gpos_pair
+ local position = featuredata.gpos_single
+ local kerns = featuredata.gpos_pair
+ local mark = featuredata.gpos_mark2mark
+ local cursive = featuredata.gpos_cursive
+ --
+ local unicodes = tfmdata.unicodes -- names to unicodes
+ local indices = tfmdata.indices
+ local descriptions = tfmdata.descriptions
+ --
+ -- we can change the otf table after loading but then we need to adapt base mode
+ -- as well (no big deal)
+ --
+ local action = {
+ substitution = function(p,lookup,k,glyph,unicode)
+ local old, new = unicode, unicodes[p[2]]
+ if type(new) == "table" then
+ new = new[1]
+ end
+ local s = single[lookup]
+ if not s then s = { } single[lookup] = s end
+ s[old] = new
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new)
+ --~ end
+ end,
+ multiple = function (p,lookup,k,glyph,unicode)
+ local old, new = unicode, { }
+ local m = multiple[lookup]
+ if not m then m = { } multiple[lookup] = m end
+ m[old] = new
+ for pc in gmatch(p[2],"[^ ]+") do
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ new[#new+1] = upc
+ else
+ new[#new+1] = upc[1]
+ end
+ end
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," "))
+ --~ end
+ end,
+ alternate = function(p,lookup,k,glyph,unicode)
+ local old, new = unicode, { }
+ local a = alternate[lookup]
+ if not a then a = { } alternate[lookup] = a end
+ a[old] = new
+ for pc in gmatch(p[2],"[^ ]+") do
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ new[#new+1] = upc
+ else
+ new[#new+1] = upc[1]
+ end
+ end
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|"))
+ --~ end
+ end,
+ ligature = function (p,lookup,k,glyph,unicode)
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name)
+ --~ end
+ local first = true
+ local t = ligature[lookup]
+ if not t then t = { } ligature[lookup] = t end
+ for s in gmatch(p[2],"[^ ]+") do
+ if first then
+ local u = unicodes[s]
+ if not u then
+ logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name)
+ break
+ 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
+ first = false
+ else
+ s = unicodes[s]
+ local t1 = t[1]
+ if not t1[s] then
+ t1[s] = { { } }
+ end
+ t = t1[s]
+ end
+ end
+ t[2] = unicode
+ end,
+ position = function(p,lookup,k,glyph,unicode)
+ -- not used
+ local s = position[lookup]
+ if not s then s = { } position[lookup] = s end
+ s[unicode] = p[2] -- direct pointer to kern spec
+ end,
+ pair = function(p,lookup,k,glyph,unicode)
+ local s = pair[lookup]
+ if not s then s = { } pair[lookup] = s end
+ local others = s[unicode]
+ if not others then others = { } s[unicode] = others end
+ -- todo: fast check for space
+ local two = p[2]
+ local upc = unicodes[two]
+ if not upc then
+ for pc in gmatch(two,"[^ ]+") do
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ others[upc] = p -- direct pointer to main table
+ else
+ for i=1,#upc do
+ others[upc[i]] = p -- direct pointer to main table
+ end
+ end
+ end
+ elseif type(upc) == "number" then
+ others[upc] = p -- direct pointer to main table
+ else
+ for i=1,#upc do
+ others[upc[i]] = p -- direct pointer to main table
+ end
+ end
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode)
+ --~ end
+ end,
+ }
+ --
+ for unicode, glyph in next, descriptions do
+ local lookups = glyph.slookups
+ if lookups then
+ for lookup, p in next, lookups do
+ action[p[1]](p,lookup,k,glyph,unicode)
+ end
+ end
+ local lookups = glyph.mlookups
+ if lookups then
+ for lookup, whatever in next, lookups do
+ for i=1,#whatever do -- normaly one
+ local p = whatever[i]
+ action[p[1]](p,lookup,k,glyph,unicode)
+ end
+ end
+ end
+ local list = glyph.mykerns
+ if list then
+ for lookup, krn in next, list do
+ local k = kerns[lookup]
+ if not k then k = { } kerns[lookup] = k end
+ k[unicode] = krn -- ref to glyph, saves lookup
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode)
+ --~ end
+ end
+ end
+ local oanchor = glyph.anchors
+ if oanchor then
+ for typ, anchors in next, oanchor do -- types
+ if typ == "mark" then
+ for name, anchor in next, anchors do
+ local lookups = anchor_to_lookup[name]
+ if lookups then
+ for lookup, _ in next, lookups do
+ local f = mark[lookup]
+ if not f then f = { } mark[lookup] = f end
+ f[unicode] = anchors -- ref to glyph, saves lookup
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode)
+ --~ end
+ end
+ end
+ end
+ elseif typ == "cexit" then -- or entry?
+ for name, anchor in next, anchors do
+ local lookups = anchor_to_lookup[name]
+ if lookups then
+ for lookup, _ in next, lookups do
+ local f = cursive[lookup]
+ if not f then f = { } cursive[lookup] = f end
+ f[unicode] = anchors -- ref to glyph, saves lookup
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode)
+ --~ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+-- local cache = { }
+luatex = luatex or {} -- this has to change ... we need a better one
+
+function prepare_contextchains(tfmdata)
+ local otfdata = tfmdata.shared.otfdata
+ local lookups = otfdata.lookups
+ if lookups then
+ local featuredata = otfdata.shared.featuredata
+ local contextchain = featuredata.gsub_contextchain -- shared with gpos
+ local reversecontextchain = featuredata.gsub_reversecontextchain -- shared with gpos
+ local characters = tfmdata.characters
+ local unicodes = tfmdata.unicodes
+ local indices = tfmdata.indices
+ local cache = luatex.covers
+ if not cache then
+ cache = { }
+ luatex.covers = cache
+ end
+ --
+ for lookupname, lookupdata in next, otfdata.lookups do
+ local lookuptype = lookupdata.type
+ if not lookuptype then
+ logs.report("otf process","missing lookuptype for %s",lookupname)
+ else
+ local rules = lookupdata.rules
+ if rules then
+ local fmt = lookupdata.format
+ -- contextchain[lookupname][unicode]
+ if fmt == "coverage" then
+ if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+ logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
+ else
+ local contexts = contextchain[lookupname]
+ if not contexts then
+ contexts = { }
+ contextchain[lookupname] = contexts
+ end
+ local t = { }
+ for nofrules=1,#rules do -- does #rules>1 happen often?
+ local rule = rules[nofrules]
+ local coverage = rule.coverage
+ if coverage and coverage.current then
+ local current, before, after, sequence = coverage.current, coverage.before, coverage.after, { }
+ if before then
+ uncover(before,sequence,cache,unicodes)
+ end
+ local start = #sequence + 1
+ uncover(current,sequence,cache,unicodes)
+ local stop = #sequence
+ if after then
+ uncover(after,sequence,cache,unicodes)
+ end
+ if sequence[1] then
+ t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif fmt == "reversecoverage" then
+ if lookuptype ~= "reversesub" then
+ logs.report("otf process","unsupported reverse coverage %s for %s",lookuptype,lookupname)
+ else
+ local contexts = reversecontextchain[lookupname]
+ if not contexts then
+ contexts = { }
+ reversecontextchain[lookupname] = contexts
+ end
+ local t = { }
+ for nofrules=1,#rules do
+ local rule = rules[nofrules]
+ local reversecoverage = rule.reversecoverage
+ if reversecoverage and reversecoverage.current then
+ local current, before, after, replacements, sequence = reversecoverage.current, reversecoverage.before, reversecoverage.after, reversecoverage.replacements, { }
+ if before then
+ uncover(before,sequence,cache,unicodes)
+ end
+ local start = #sequence + 1
+ uncover(current,sequence,cache,unicodes)
+ local stop = #sequence
+ if after then
+ uncover(after,sequence,cache,unicodes)
+ end
+ if replacements then
+ replacements = split(replacements,current[1],cache,unicodes)
+ end
+ if sequence[1] then
+ -- this is different from normal coverage, we assume only replacements
+ t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif fmt == "glyphs" then
+ if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+ logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
+ else
+ local contexts = contextchain[lookupname]
+ if not contexts then
+ contexts = { }
+ contextchain[lookupname] = contexts
+ end
+ local t = { }
+ for nofrules=1,#rules do
+ -- nearly the same as coverage so we could as well rename it
+ local rule = rules[nofrules]
+ local glyphs = rule.glyphs
+ if glyphs and glyphs.names then
+ local fore, back, names, sequence = glyphs.fore, glyphs.back, glyphs.names, { }
+ if fore and fore ~= "" then
+ fore = lpegmatch(split_at_space,fore)
+ uncover(fore,sequence,cache,unicodes)
+ end
+ local start = #sequence + 1
+ names = lpegmatch(split_at_space,names)
+ uncover(names,sequence,cache,unicodes)
+ local stop = #sequence
+ if back and back ~= "" then
+ back = lpegmatch(split_at_space,back)
+ uncover(back,sequence,cache,unicodes)
+ end
+ if sequence[1] then
+ t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function fonts.initializers.node.otf.features(tfmdata,value)
+ if true then -- value then
+ if not tfmdata.shared.otfdata.shared.initialized then
+ local t = trace_preparing and os.clock()
+ local otfdata = tfmdata.shared.otfdata
+ local featuredata = otfdata.shared.featuredata
+ -- caches
+ featuredata.gsub_multiple = { }
+ featuredata.gsub_alternate = { }
+ featuredata.gsub_single = { }
+ featuredata.gsub_ligature = { }
+ featuredata.gsub_contextchain = { }
+ featuredata.gsub_reversecontextchain = { }
+ featuredata.gpos_pair = { }
+ featuredata.gpos_single = { }
+ featuredata.gpos_mark2base = { }
+ featuredata.gpos_mark2ligature = featuredata.gpos_mark2base
+ featuredata.gpos_mark2mark = featuredata.gpos_mark2base
+ featuredata.gpos_cursive = { }
+ featuredata.gpos_contextchain = featuredata.gsub_contextchain
+ featuredata.gpos_reversecontextchain = featuredata.gsub_reversecontextchain
+ --
+ prepare_contextchains(tfmdata)
+ prepare_lookups(tfmdata)
+ otfdata.shared.initialized = true
+ if trace_preparing then
+ logs.report("otf process","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ end
+ end
+ end
+end
diff --git a/tex/context/base/font-otp.lua b/tex/context/base/font-otp.lua
new file mode 100644
index 000000000..a80c515ad
--- /dev/null
+++ b/tex/context/base/font-otp.lua
@@ -0,0 +1,504 @@
+if not modules then modules = { } end modules ['font-otp'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (packing)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: pack math (but not that much to share)
+
+local next, type, tostring = next, type, tostring
+local sort, concat = table.sort, table.concat
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+fonts.otf.enhancers = fonts.otf.enhancers or { }
+fonts.otf.glists = fonts.otf.glists or { "gsub", "gpos" }
+
+local criterium, threshold, tabstr = 1, 0, table.serialize
+
+local function tabstr(t) -- hashed from core-uti / experiment
+ local s = { }
+ for k, v in next, t do
+ if type(v) == "table" then
+ s[#s+1] = k.."={"..tabstr(v).."}"
+ else
+ s[#s+1] = k.."="..tostring(v)
+ end
+ end
+ sort(s)
+ return concat(s,",")
+end
+
+function fonts.otf.enhancers.pack(data)
+ if data then
+ local h, t, c = { }, { }, { }
+ local hh, tt, cc = { }, { }, { }
+ local function pack_1(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
+ local function pack_2(v)
+ -- v == number
+ if c[v] <= criterium then
+ return t[v]
+ else
+ -- 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
+ local function success(stage,pass)
+ if #t == 0 then
+ if trace_loading then
+ logs.report("load otf","pack quality: nothing to pack")
+ end
+ return false
+ elseif #t >= threshold then
+ local one, two, rest = 0, 0, 0
+ if pass == 1 then
+ for k,v in next, 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 next, 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
+ if trace_loading then
+ logs.report("load otf","pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)", stage, pass, one+two+rest, one, two, rest, criterium)
+ end
+ return true
+ else
+ if trace_loading then
+ logs.report("load otf","pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)", stage, pass, #t, threshold)
+ end
+ return false
+ end
+ end
+ for pass=1,2 do
+ local pack = (pass == 1 and pack_1) or pack_2
+ for k, v in next, data.glyphs do
+ v.boundingbox = pack(v.boundingbox)
+ local l = v.slookups
+ if l then
+ for k,v in next, l do
+ l[k] = pack(v)
+ end
+ end
+ local l = v.mlookups
+ if l then
+ for k,v in next, l do
+ for kk=1,#v do
+ local vkk = v[kk]
+ local what = vkk[1]
+ if what == "pair" then
+ local t = vkk[3] if t then vkk[3] = pack(t) end
+ local t = vkk[4] if t then vkk[4] = pack(t) end
+ elseif what == "position" then
+ local t = vkk[2] if t then vkk[2] = pack(t) end
+ end
+ -- v[kk] = pack(vkk)
+ end
+ end
+ end
+ local m = v.mykerns
+ if m then
+ for k,v in next, m do
+ m[k] = pack(v)
+ end
+ end
+ local m = v.math
+ if m then
+ local mk = m.kerns
+ if mk then
+ for k,v in next, mk do
+ mk[k] = pack(v)
+ end
+ end
+ end
+ local a = v.anchors
+ if a then
+ for k,v in next, a do
+ if k == "baselig" then
+ for kk, vv in next, v do
+ for kkk=1,#vv do
+ vv[kkk] = pack(vv[kkk])
+ end
+ end
+ else
+ for kk, vv in next, v do
+ v[kk] = pack(vv)
+ end
+ end
+ end
+ end
+ end
+ if data.lookups then
+ for k, v in next, data.lookups do
+ if v.rules then
+ for kk, vv in next, v.rules do
+ local l = vv.lookups
+ if l then
+ vv.lookups = pack(l)
+ end
+ local c = vv.coverage
+ if c then
+ local cc = c.before if cc then c.before = pack(cc) end
+ local cc = c.after if cc then c.after = pack(cc) end
+ local cc = c.current if cc then c.current = pack(cc) end
+ end
+ local c = vv.reversecoverage
+ if c then
+ local cc = c.before if cc then c.before = pack(cc) end
+ local cc = c.after if cc then c.after = pack(cc) end
+ local cc = c.current if cc then c.current = pack(cc) end
+ end
+ -- no need to pack vv.glyphs
+ local c = vv.glyphs
+ if c then
+ if c.fore == "" then c.fore = nil end
+ if c.back == "" then c.back = nil end
+ end
+ end
+ end
+ end
+ end
+ if data.luatex then
+ local la = data.luatex.anchor_to_lookup
+ if la then
+ for lookup, ldata in next, la do
+ la[lookup] = pack(ldata)
+ end
+ end
+ local la = data.luatex.lookup_to_anchor
+ if la then
+ for lookup, ldata in next, la do
+ la[lookup] = pack(ldata)
+ end
+ end
+ local ls = data.luatex.sequences
+ if ls then
+ for feature, fdata in next, ls do
+ local flags = fdata.flags
+ if flags then
+ fdata.flags = pack(flags)
+ end
+ local subtables = fdata.subtables
+ if subtables then
+ fdata.subtables = pack(subtables)
+ end
+ local features = fdata.features
+ if features then
+ for script, sdata in next, features do
+ features[script] = pack(sdata)
+ end
+ end
+ end
+ end
+ local ls = data.luatex.lookups
+ if ls then
+ for lookup, fdata in next, ls do
+ local flags = fdata.flags
+ if flags then
+ fdata.flags = pack(flags)
+ end
+ local subtables = fdata.subtables
+ if subtables then
+ fdata.subtables = pack(subtables)
+ end
+ end
+ end
+ local lf = data.luatex.features
+ if lf then
+ for _, g in next, fonts.otf.glists do
+ local gl = lf[g]
+ if gl then
+ for feature, spec in next, gl do
+ gl[feature] = pack(spec)
+ end
+ end
+ end
+ end
+ end
+ if not success(1,pass) then
+ return
+ end
+ end
+ if #t > 0 then
+ for pass=1,2 do
+ local pack = (pass == 1 and pack_1) or pack_2
+ for k, v in next, data.glyphs do
+ local m = v.mykerns
+ if m then
+ v.mykerns = pack(m)
+ end
+ local m = v.math
+ if m then
+ local mk = m.kerns
+ if mk then
+ m.kerns = pack(mk)
+ end
+ end
+ local a = v.anchors
+ if a then
+ v.anchors = pack(a)
+ end
+ local l = v.mlookups
+ if l then
+ for k,v in next, l do
+ for kk=1,#v do
+ v[kk] = pack(v[kk])
+ end
+ end
+ end
+ end
+ local ls = data.luatex.sequences
+ if ls then
+ for feature, fdata in next, ls do
+ fdata.features = pack(fdata.features)
+ end
+ end
+ if not success(2,pass) then
+--~ return
+ end
+ end
+ end
+ end
+end
+
+function fonts.otf.enhancers.unpack(data)
+ if data then
+ local t = data.tables
+ if t then
+ local unpacked = { }
+ for k, v in next, data.glyphs do
+ local tv = t[v.boundingbox] if tv then v.boundingbox = tv end
+ local l = v.slookups
+ if l then
+ for k,v in next, l do
+ local tv = t[v] if tv then l[k] = tv end
+ end
+ end
+ local l = v.mlookups
+ if l then
+ for k,v in next, l do
+ for i=1,#v do
+ local vi = v[i]
+ local tv = t[vi]
+ if tv then
+ v[i] = tv
+ if unpacked[tv] then
+ vi = false
+ else
+ unpacked[tv], vi = true, tv
+ end
+ end
+ if vi then
+ local what = vi[1]
+ if what == "pair" then
+ local tv = t[vi[3]] if tv then vi[3] = tv end
+ local tv = t[vi[4]] if tv then vi[4] = tv end
+ elseif what == "position" then
+ local tv = t[vi[2]] if tv then vi[2] = tv end
+ end
+ end
+ end
+ end
+ end
+ local m = v.mykerns
+ if m then
+ local tm = t[m]
+ if tm then
+ v.mykerns = tm
+ if unpacked[tm] then
+ m = false
+ else
+ unpacked[tm], m = true, tm
+ end
+ end
+ if m then
+ for k,v in next, m do
+ local tv = t[v] if tv then m[k] = tv end
+ end
+ end
+ end
+ local m = v.math
+ if m then
+ local mk = m.kerns
+ if mk then
+ local tm = t[mk]
+ if tm then
+ m.kerns = tm
+ if unpacked[tm] then
+ mk = false
+ else
+ unpacked[tm], mk = true, tm
+ end
+ end
+ if mk then
+ for k,v in next, mk do
+ local tv = t[v] if tv then mk[k] = tv end
+ end
+ end
+ end
+ end
+ local a = v.anchors
+ if a then
+ local ta = t[a]
+ if ta then
+ v.anchors = ta
+ if not unpacked[ta] then
+ unpacked[ta], a = true, ta
+ else
+ a = false
+ end
+ end
+ if a then
+ for k,v in next, a do
+ if k == "baselig" then
+ for kk, vv in next, v do
+ for kkk=1,#vv do
+ local tv = t[vv[kkk]] if tv then vv[kkk] = tv end
+ end
+ end
+ else
+ for kk, vv in next, v do
+ local tv = t[vv] if tv then v[kk] = tv end
+ end
+ end
+ end
+ end
+ end
+ end
+ if data.lookups then
+ for k, v in next, data.lookups do
+ local r = v.rules
+ if r then
+ for kk, vv in next, r do
+ local l = vv.lookups
+ if l then
+ 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 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
+ local c = vv.reversecoverage
+ if c then
+ 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
+ -- no need to unpack vv.glyphs
+ end
+ end
+ end
+ end
+ local luatex = data.luatex
+ if luatex then
+ local la = luatex.anchor_to_lookup
+ if la then
+ for lookup, ldata in next, la do
+ local tv = t[ldata] if tv then la[lookup] = tv end
+ end
+ end
+ local la = luatex.lookup_to_anchor
+ if la then
+ for lookup, ldata in next, la do
+ local tv = t[ldata] if tv then la[lookup] = tv end
+ end
+ end
+ local ls = luatex.sequences
+ if ls then
+ for feature, fdata in next, ls do
+ local flags = fdata.flags
+ if flags then
+ local tv = t[flags] if tv then fdata.flags = tv end
+ end
+ local subtables = fdata.subtables
+ if subtables then
+ local tv = t[subtables] if tv then fdata.subtables = tv end
+ end
+ local features = fdata.features
+ if features then
+ local tv = t[features]
+ if tv then
+ fdata.features = tv
+ if not unpacked[tv] then
+ unpacked[tv], features = true, tv
+ else
+ features = false
+ end
+ end
+ if features then
+ for script, sdata in next, features do
+ local tv = t[sdata] if tv then features[script] = tv end
+ end
+ end
+ end
+ end
+ end
+ local ls = luatex.lookups
+ if ls then
+ for lookups, fdata in next, ls do
+ local flags = fdata.flags
+ if flags then
+ local tv = t[flags] if tv then fdata.flags = tv end
+ end
+ local subtables = fdata.subtables
+ if subtables then
+ local tv = t[subtables] if tv then fdata.subtables = tv end
+ end
+ end
+ end
+ local lf = luatex.features
+ if lf then
+ for _, g in next, fonts.otf.glists do
+ local gl = lf[g]
+ if gl then
+ for feature, spec in next, gl do
+ local tv = t[spec] if tv then gl[feature] = tv end
+ end
+ end
+ end
+ end
+ end
+ data.tables = nil
+ end
+ end
+end
diff --git a/tex/context/base/font-ott.lua b/tex/context/base/font-ott.lua
new file mode 100644
index 000000000..2be1bf06c
--- /dev/null
+++ b/tex/context/base/font-ott.lua
@@ -0,0 +1,956 @@
+if not modules then modules = { } end modules ['font-otf'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (tables)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local gsub, lower = string.gsub, string.lower
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+
+local otf = fonts.otf
+
+otf.tables = otf.tables or { }
+otf.meanings = otf.meanings or { }
+
+otf.tables.scripts = {
+ ['dflt'] = 'Default',
+
+ ['arab'] = 'Arabic',
+ ['armn'] = 'Armenian',
+ ['bali'] = 'Balinese',
+ ['beng'] = 'Bengali',
+ ['bopo'] = 'Bopomofo',
+ ['brai'] = 'Braille',
+ ['bugi'] = 'Buginese',
+ ['buhd'] = 'Buhid',
+ ['byzm'] = 'Byzantine Music',
+ ['cans'] = 'Canadian Syllabics',
+ ['cher'] = 'Cherokee',
+ ['copt'] = 'Coptic',
+ ['cprt'] = 'Cypriot Syllabary',
+ ['cyrl'] = 'Cyrillic',
+ ['deva'] = 'Devanagari',
+ ['dsrt'] = 'Deseret',
+ ['ethi'] = 'Ethiopic',
+ ['geor'] = 'Georgian',
+ ['glag'] = 'Glagolitic',
+ ['goth'] = 'Gothic',
+ ['grek'] = 'Greek',
+ ['gujr'] = 'Gujarati',
+ ['guru'] = 'Gurmukhi',
+ ['hang'] = 'Hangul',
+ ['hani'] = 'CJK Ideographic',
+ ['hano'] = 'Hanunoo',
+ ['hebr'] = 'Hebrew',
+ ['ital'] = 'Old Italic',
+ ['jamo'] = 'Hangul Jamo',
+ ['java'] = 'Javanese',
+ ['kana'] = 'Hiragana and Katakana',
+ ['khar'] = 'Kharosthi',
+ ['khmr'] = 'Khmer',
+ ['knda'] = 'Kannada',
+ ['lao' ] = 'Lao',
+ ['latn'] = 'Latin',
+ ['limb'] = 'Limbu',
+ ['linb'] = 'Linear B',
+ ['math'] = 'Mathematical Alphanumeric Symbols',
+ ['mlym'] = 'Malayalam',
+ ['mong'] = 'Mongolian',
+ ['musc'] = 'Musical Symbols',
+ ['mymr'] = 'Myanmar',
+ ['nko' ] = "N'ko",
+ ['ogam'] = 'Ogham',
+ ['orya'] = 'Oriya',
+ ['osma'] = 'Osmanya',
+ ['phag'] = 'Phags-pa',
+ ['phnx'] = 'Phoenician',
+ ['runr'] = 'Runic',
+ ['shaw'] = 'Shavian',
+ ['sinh'] = 'Sinhala',
+ ['sylo'] = 'Syloti Nagri',
+ ['syrc'] = 'Syriac',
+ ['tagb'] = 'Tagbanwa',
+ ['tale'] = 'Tai Le',
+ ['talu'] = 'Tai Lu',
+ ['taml'] = 'Tamil',
+ ['telu'] = 'Telugu',
+ ['tfng'] = 'Tifinagh',
+ ['tglg'] = 'Tagalog',
+ ['thaa'] = 'Thaana',
+ ['thai'] = 'Thai',
+ ['tibt'] = 'Tibetan',
+ ['ugar'] = 'Ugaritic Cuneiform',
+ ['xpeo'] = 'Old Persian Cuneiform',
+ ['xsux'] = 'Sumero-Akkadian Cuneiform',
+ ['yi' ] = 'Yi',
+}
+
+otf.tables.languages = {
+ ['dflt'] = 'Default',
+
+ ['aba'] = 'Abaza',
+ ['abk'] = 'Abkhazian',
+ ['ady'] = 'Adyghe',
+ ['afk'] = 'Afrikaans',
+ ['afr'] = 'Afar',
+ ['agw'] = 'Agaw',
+ ['als'] = 'Alsatian',
+ ['alt'] = 'Altai',
+ ['amh'] = 'Amharic',
+ ['ara'] = 'Arabic',
+ ['ari'] = 'Aari',
+ ['ark'] = 'Arakanese',
+ ['asm'] = 'Assamese',
+ ['ath'] = 'Athapaskan',
+ ['avr'] = 'Avar',
+ ['awa'] = 'Awadhi',
+ ['aym'] = 'Aymara',
+ ['aze'] = 'Azeri',
+ ['bad'] = 'Badaga',
+ ['bag'] = 'Baghelkhandi',
+ ['bal'] = 'Balkar',
+ ['bau'] = 'Baule',
+ ['bbr'] = 'Berber',
+ ['bch'] = 'Bench',
+ ['bcr'] = 'Bible Cree',
+ ['bel'] = 'Belarussian',
+ ['bem'] = 'Bemba',
+ ['ben'] = 'Bengali',
+ ['bgr'] = 'Bulgarian',
+ ['bhi'] = 'Bhili',
+ ['bho'] = 'Bhojpuri',
+ ['bik'] = 'Bikol',
+ ['bil'] = 'Bilen',
+ ['bkf'] = 'Blackfoot',
+ ['bli'] = 'Balochi',
+ ['bln'] = 'Balante',
+ ['blt'] = 'Balti',
+ ['bmb'] = 'Bambara',
+ ['bml'] = 'Bamileke',
+ ['bos'] = 'Bosnian',
+ ['bre'] = 'Breton',
+ ['brh'] = 'Brahui',
+ ['bri'] = 'Braj Bhasha',
+ ['brm'] = 'Burmese',
+ ['bsh'] = 'Bashkir',
+ ['bti'] = 'Beti',
+ ['cat'] = 'Catalan',
+ ['ceb'] = 'Cebuano',
+ ['che'] = 'Chechen',
+ ['chg'] = 'Chaha Gurage',
+ ['chh'] = 'Chattisgarhi',
+ ['chi'] = 'Chichewa',
+ ['chk'] = 'Chukchi',
+ ['chp'] = 'Chipewyan',
+ ['chr'] = 'Cherokee',
+ ['chu'] = 'Chuvash',
+ ['cmr'] = 'Comorian',
+ ['cop'] = 'Coptic',
+ ['cos'] = 'Corsican',
+ ['cre'] = 'Cree',
+ ['crr'] = 'Carrier',
+ ['crt'] = 'Crimean Tatar',
+ ['csl'] = 'Church Slavonic',
+ ['csy'] = 'Czech',
+ ['dan'] = 'Danish',
+ ['dar'] = 'Dargwa',
+ ['dcr'] = 'Woods Cree',
+ ['deu'] = 'German',
+ ['dgr'] = 'Dogri',
+ ['div'] = 'Divehi',
+ ['djr'] = 'Djerma',
+ ['dng'] = 'Dangme',
+ ['dnk'] = 'Dinka',
+ ['dri'] = 'Dari',
+ ['dun'] = 'Dungan',
+ ['dzn'] = 'Dzongkha',
+ ['ebi'] = 'Ebira',
+ ['ecr'] = 'Eastern Cree',
+ ['edo'] = 'Edo',
+ ['efi'] = 'Efik',
+ ['ell'] = 'Greek',
+ ['eng'] = 'English',
+ ['erz'] = 'Erzya',
+ ['esp'] = 'Spanish',
+ ['eti'] = 'Estonian',
+ ['euq'] = 'Basque',
+ ['evk'] = 'Evenki',
+ ['evn'] = 'Even',
+ ['ewe'] = 'Ewe',
+ ['fan'] = 'French Antillean',
+ ['far'] = 'Farsi',
+ ['fin'] = 'Finnish',
+ ['fji'] = 'Fijian',
+ ['fle'] = 'Flemish',
+ ['fne'] = 'Forest Nenets',
+ ['fon'] = 'Fon',
+ ['fos'] = 'Faroese',
+ ['fra'] = 'French',
+ ['fri'] = 'Frisian',
+ ['frl'] = 'Friulian',
+ ['fta'] = 'Futa',
+ ['ful'] = 'Fulani',
+ ['gad'] = 'Ga',
+ ['gae'] = 'Gaelic',
+ ['gag'] = 'Gagauz',
+ ['gal'] = 'Galician',
+ ['gar'] = 'Garshuni',
+ ['gaw'] = 'Garhwali',
+ ['gez'] = "Ge'ez",
+ ['gil'] = 'Gilyak',
+ ['gmz'] = 'Gumuz',
+ ['gon'] = 'Gondi',
+ ['grn'] = 'Greenlandic',
+ ['gro'] = 'Garo',
+ ['gua'] = 'Guarani',
+ ['guj'] = 'Gujarati',
+ ['hai'] = 'Haitian',
+ ['hal'] = 'Halam',
+ ['har'] = 'Harauti',
+ ['hau'] = 'Hausa',
+ ['haw'] = 'Hawaiin',
+ ['hbn'] = 'Hammer-Banna',
+ ['hil'] = 'Hiligaynon',
+ ['hin'] = 'Hindi',
+ ['hma'] = 'High Mari',
+ ['hnd'] = 'Hindko',
+ ['ho'] = 'Ho',
+ ['hri'] = 'Harari',
+ ['hrv'] = 'Croatian',
+ ['hun'] = 'Hungarian',
+ ['hye'] = 'Armenian',
+ ['ibo'] = 'Igbo',
+ ['ijo'] = 'Ijo',
+ ['ilo'] = 'Ilokano',
+ ['ind'] = 'Indonesian',
+ ['ing'] = 'Ingush',
+ ['inu'] = 'Inuktitut',
+ ['iri'] = 'Irish',
+ ['irt'] = 'Irish Traditional',
+ ['isl'] = 'Icelandic',
+ ['ism'] = 'Inari Sami',
+ ['ita'] = 'Italian',
+ ['iwr'] = 'Hebrew',
+ ['jan'] = 'Japanese',
+ ['jav'] = 'Javanese',
+ ['jii'] = 'Yiddish',
+ ['jud'] = 'Judezmo',
+ ['jul'] = 'Jula',
+ ['kab'] = 'Kabardian',
+ ['kac'] = 'Kachchi',
+ ['kal'] = 'Kalenjin',
+ ['kan'] = 'Kannada',
+ ['kar'] = 'Karachay',
+ ['kat'] = 'Georgian',
+ ['kaz'] = 'Kazakh',
+ ['keb'] = 'Kebena',
+ ['kge'] = 'Khutsuri Georgian',
+ ['kha'] = 'Khakass',
+ ['khk'] = 'Khanty-Kazim',
+ ['khm'] = 'Khmer',
+ ['khs'] = 'Khanty-Shurishkar',
+ ['khv'] = 'Khanty-Vakhi',
+ ['khw'] = 'Khowar',
+ ['kik'] = 'Kikuyu',
+ ['kir'] = 'Kirghiz',
+ ['kis'] = 'Kisii',
+ ['kkn'] = 'Kokni',
+ ['klm'] = 'Kalmyk',
+ ['kmb'] = 'Kamba',
+ ['kmn'] = 'Kumaoni',
+ ['kmo'] = 'Komo',
+ ['kms'] = 'Komso',
+ ['knr'] = 'Kanuri',
+ ['kod'] = 'Kodagu',
+ ['koh'] = 'Korean Old Hangul',
+ ['kok'] = 'Konkani',
+ ['kon'] = 'Kikongo',
+ ['kop'] = 'Komi-Permyak',
+ ['kor'] = 'Korean',
+ ['koz'] = 'Komi-Zyrian',
+ ['kpl'] = 'Kpelle',
+ ['kri'] = 'Krio',
+ ['krk'] = 'Karakalpak',
+ ['krl'] = 'Karelian',
+ ['krm'] = 'Karaim',
+ ['krn'] = 'Karen',
+ ['krt'] = 'Koorete',
+ ['ksh'] = 'Kashmiri',
+ ['ksi'] = 'Khasi',
+ ['ksm'] = 'Kildin Sami',
+ ['kui'] = 'Kui',
+ ['kul'] = 'Kulvi',
+ ['kum'] = 'Kumyk',
+ ['kur'] = 'Kurdish',
+ ['kuu'] = 'Kurukh',
+ ['kuy'] = 'Kuy',
+ ['kyk'] = 'Koryak',
+ ['lad'] = 'Ladin',
+ ['lah'] = 'Lahuli',
+ ['lak'] = 'Lak',
+ ['lam'] = 'Lambani',
+ ['lao'] = 'Lao',
+ ['lat'] = 'Latin',
+ ['laz'] = 'Laz',
+ ['lcr'] = 'L-Cree',
+ ['ldk'] = 'Ladakhi',
+ ['lez'] = 'Lezgi',
+ ['lin'] = 'Lingala',
+ ['lma'] = 'Low Mari',
+ ['lmb'] = 'Limbu',
+ ['lmw'] = 'Lomwe',
+ ['lsb'] = 'Lower Sorbian',
+ ['lsm'] = 'Lule Sami',
+ ['lth'] = 'Lithuanian',
+ ['ltz'] = 'Luxembourgish',
+ ['lub'] = 'Luba',
+ ['lug'] = 'Luganda',
+ ['luh'] = 'Luhya',
+ ['luo'] = 'Luo',
+ ['lvi'] = 'Latvian',
+ ['maj'] = 'Majang',
+ ['mak'] = 'Makua',
+ ['mal'] = 'Malayalam Traditional',
+ ['man'] = 'Mansi',
+ ['map'] = 'Mapudungun',
+ ['mar'] = 'Marathi',
+ ['maw'] = 'Marwari',
+ ['mbn'] = 'Mbundu',
+ ['mch'] = 'Manchu',
+ ['mcr'] = 'Moose Cree',
+ ['mde'] = 'Mende',
+ ['men'] = "Me'en",
+ ['miz'] = 'Mizo',
+ ['mkd'] = 'Macedonian',
+ ['mle'] = 'Male',
+ ['mlg'] = 'Malagasy',
+ ['mln'] = 'Malinke',
+ ['mlr'] = 'Malayalam Reformed',
+ ['mly'] = 'Malay',
+ ['mnd'] = 'Mandinka',
+ ['mng'] = 'Mongolian',
+ ['mni'] = 'Manipuri',
+ ['mnk'] = 'Maninka',
+ ['mnx'] = 'Manx Gaelic',
+ ['moh'] = 'Mohawk',
+ ['mok'] = 'Moksha',
+ ['mol'] = 'Moldavian',
+ ['mon'] = 'Mon',
+ ['mor'] = 'Moroccan',
+ ['mri'] = 'Maori',
+ ['mth'] = 'Maithili',
+ ['mts'] = 'Maltese',
+ ['mun'] = 'Mundari',
+ ['nag'] = 'Naga-Assamese',
+ ['nan'] = 'Nanai',
+ ['nas'] = 'Naskapi',
+ ['ncr'] = 'N-Cree',
+ ['ndb'] = 'Ndebele',
+ ['ndg'] = 'Ndonga',
+ ['nep'] = 'Nepali',
+ ['new'] = 'Newari',
+ ['ngr'] = 'Nagari',
+ ['nhc'] = 'Norway House Cree',
+ ['nis'] = 'Nisi',
+ ['niu'] = 'Niuean',
+ ['nkl'] = 'Nkole',
+ ['nko'] = "N'ko",
+ ['nld'] = 'Dutch',
+ ['nog'] = 'Nogai',
+ ['nor'] = 'Norwegian',
+ ['nsm'] = 'Northern Sami',
+ ['nta'] = 'Northern Tai',
+ ['nto'] = 'Esperanto',
+ ['nyn'] = 'Nynorsk',
+ ['oci'] = 'Occitan',
+ ['ocr'] = 'Oji-Cree',
+ ['ojb'] = 'Ojibway',
+ ['ori'] = 'Oriya',
+ ['oro'] = 'Oromo',
+ ['oss'] = 'Ossetian',
+ ['paa'] = 'Palestinian Aramaic',
+ ['pal'] = 'Pali',
+ ['pan'] = 'Punjabi',
+ ['pap'] = 'Palpa',
+ ['pas'] = 'Pashto',
+ ['pgr'] = 'Polytonic Greek',
+ ['pil'] = 'Pilipino',
+ ['plg'] = 'Palaung',
+ ['plk'] = 'Polish',
+ ['pro'] = 'Provencal',
+ ['ptg'] = 'Portuguese',
+ ['qin'] = 'Chin',
+ ['raj'] = 'Rajasthani',
+ ['rbu'] = 'Russian Buriat',
+ ['rcr'] = 'R-Cree',
+ ['ria'] = 'Riang',
+ ['rms'] = 'Rhaeto-Romanic',
+ ['rom'] = 'Romanian',
+ ['roy'] = 'Romany',
+ ['rsy'] = 'Rusyn',
+ ['rua'] = 'Ruanda',
+ ['rus'] = 'Russian',
+ ['sad'] = 'Sadri',
+ ['san'] = 'Sanskrit',
+ ['sat'] = 'Santali',
+ ['say'] = 'Sayisi',
+ ['sek'] = 'Sekota',
+ ['sel'] = 'Selkup',
+ ['sgo'] = 'Sango',
+ ['shn'] = 'Shan',
+ ['sib'] = 'Sibe',
+ ['sid'] = 'Sidamo',
+ ['sig'] = 'Silte Gurage',
+ ['sks'] = 'Skolt Sami',
+ ['sky'] = 'Slovak',
+ ['sla'] = 'Slavey',
+ ['slv'] = 'Slovenian',
+ ['sml'] = 'Somali',
+ ['smo'] = 'Samoan',
+ ['sna'] = 'Sena',
+ ['snd'] = 'Sindhi',
+ ['snh'] = 'Sinhalese',
+ ['snk'] = 'Soninke',
+ ['sog'] = 'Sodo Gurage',
+ ['sot'] = 'Sotho',
+ ['sqi'] = 'Albanian',
+ ['srb'] = 'Serbian',
+ ['srk'] = 'Saraiki',
+ ['srr'] = 'Serer',
+ ['ssl'] = 'South Slavey',
+ ['ssm'] = 'Southern Sami',
+ ['sur'] = 'Suri',
+ ['sva'] = 'Svan',
+ ['sve'] = 'Swedish',
+ ['swa'] = 'Swadaya Aramaic',
+ ['swk'] = 'Swahili',
+ ['swz'] = 'Swazi',
+ ['sxt'] = 'Sutu',
+ ['syr'] = 'Syriac',
+ ['tab'] = 'Tabasaran',
+ ['taj'] = 'Tajiki',
+ ['tam'] = 'Tamil',
+ ['tat'] = 'Tatar',
+ ['tcr'] = 'TH-Cree',
+ ['tel'] = 'Telugu',
+ ['tgn'] = 'Tongan',
+ ['tgr'] = 'Tigre',
+ ['tgy'] = 'Tigrinya',
+ ['tha'] = 'Thai',
+ ['tht'] = 'Tahitian',
+ ['tib'] = 'Tibetan',
+ ['tkm'] = 'Turkmen',
+ ['tmn'] = 'Temne',
+ ['tna'] = 'Tswana',
+ ['tne'] = 'Tundra Nenets',
+ ['tng'] = 'Tonga',
+ ['tod'] = 'Todo',
+ ['trk'] = 'Turkish',
+ ['tsg'] = 'Tsonga',
+ ['tua'] = 'Turoyo Aramaic',
+ ['tul'] = 'Tulu',
+ ['tuv'] = 'Tuvin',
+ ['twi'] = 'Twi',
+ ['udm'] = 'Udmurt',
+ ['ukr'] = 'Ukrainian',
+ ['urd'] = 'Urdu',
+ ['usb'] = 'Upper Sorbian',
+ ['uyg'] = 'Uyghur',
+ ['uzb'] = 'Uzbek',
+ ['ven'] = 'Venda',
+ ['vit'] = 'Vietnamese',
+ ['wa' ] = 'Wa',
+ ['wag'] = 'Wagdi',
+ ['wcr'] = 'West-Cree',
+ ['wel'] = 'Welsh',
+ ['wlf'] = 'Wolof',
+ ['xbd'] = 'Tai Lue',
+ ['xhs'] = 'Xhosa',
+ ['yak'] = 'Yakut',
+ ['yba'] = 'Yoruba',
+ ['ycr'] = 'Y-Cree',
+ ['yic'] = 'Yi Classic',
+ ['yim'] = 'Yi Modern',
+ ['zhh'] = 'Chinese Hong Kong',
+ ['zhp'] = 'Chinese Phonetic',
+ ['zhs'] = 'Chinese Simplified',
+ ['zht'] = 'Chinese Traditional',
+ ['znd'] = 'Zande',
+ ['zul'] = 'Zulu'
+}
+
+otf.tables.features = {
+ ['aalt'] = 'Access All Alternates',
+ ['abvf'] = 'Above-Base Forms',
+ ['abvm'] = 'Above-Base Mark Positioning',
+ ['abvs'] = 'Above-Base Substitutions',
+ ['afrc'] = 'Alternative Fractions',
+ ['akhn'] = 'Akhands',
+ ['blwf'] = 'Below-Base Forms',
+ ['blwm'] = 'Below-Base Mark Positioning',
+ ['blws'] = 'Below-Base Substitutions',
+ ['c2pc'] = 'Petite Capitals From Capitals',
+ ['c2sc'] = 'Small Capitals From Capitals',
+ ['calt'] = 'Contextual Alternates',
+ ['case'] = 'Case-Sensitive Forms',
+ ['ccmp'] = 'Glyph Composition/Decomposition',
+ ['cjct'] = 'Conjunct Forms',
+ ['clig'] = 'Contextual Ligatures',
+ ['cpsp'] = 'Capital Spacing',
+ ['cswh'] = 'Contextual Swash',
+ ['curs'] = 'Cursive Positioning',
+ ['dflt'] = 'Default Processing',
+ ['dist'] = 'Distances',
+ ['dlig'] = 'Discretionary Ligatures',
+ ['dnom'] = 'Denominators',
+ ['dtls'] = 'Dotless Forms', -- math
+ ['expt'] = 'Expert Forms',
+ ['falt'] = 'Final glyph Alternates',
+ ['fin2'] = 'Terminal Forms #2',
+ ['fin3'] = 'Terminal Forms #3',
+ ['fina'] = 'Terminal Forms',
+ ['flac'] = 'Flattened Accents Over Capitals', -- math
+ ['frac'] = 'Fractions',
+ ['fwid'] = 'Full Width',
+ ['half'] = 'Half Forms',
+ ['haln'] = 'Halant Forms',
+ ['halt'] = 'Alternate Half Width',
+ ['hist'] = 'Historical Forms',
+ ['hkna'] = 'Horizontal Kana Alternates',
+ ['hlig'] = 'Historical Ligatures',
+ ['hngl'] = 'Hangul',
+ ['hojo'] = 'Hojo Kanji Forms',
+ ['hwid'] = 'Half Width',
+ ['init'] = 'Initial Forms',
+ ['isol'] = 'Isolated Forms',
+ ['ital'] = 'Italics',
+ ['jalt'] = 'Justification Alternatives',
+ ['jp04'] = 'JIS2004 Forms',
+ ['jp78'] = 'JIS78 Forms',
+ ['jp83'] = 'JIS83 Forms',
+ ['jp90'] = 'JIS90 Forms',
+ ['kern'] = 'Kerning',
+ ['lfbd'] = 'Left Bounds',
+ ['liga'] = 'Standard Ligatures',
+ ['ljmo'] = 'Leading Jamo Forms',
+ ['lnum'] = 'Lining Figures',
+ ['locl'] = 'Localized Forms',
+ ['mark'] = 'Mark Positioning',
+ ['med2'] = 'Medial Forms #2',
+ ['medi'] = 'Medial Forms',
+ ['mgrk'] = 'Mathematical Greek',
+ ['mkmk'] = 'Mark to Mark Positioning',
+ ['mset'] = 'Mark Positioning via Substitution',
+ ['nalt'] = 'Alternate Annotation Forms',
+ ['nlck'] = 'NLC Kanji Forms',
+ ['nukt'] = 'Nukta Forms',
+ ['numr'] = 'Numerators',
+ ['onum'] = 'Old Style Figures',
+ ['opbd'] = 'Optical Bounds',
+ ['ordn'] = 'Ordinals',
+ ['ornm'] = 'Ornaments',
+ ['palt'] = 'Proportional Alternate Width',
+ ['pcap'] = 'Petite Capitals',
+ ['pnum'] = 'Proportional Figures',
+ ['pref'] = 'Pre-base Forms',
+ ['pres'] = 'Pre-base Substitutions',
+ ['pstf'] = 'Post-base Forms',
+ ['psts'] = 'Post-base Substitutions',
+ ['pwid'] = 'Proportional Widths',
+ ['qwid'] = 'Quarter Widths',
+ ['rand'] = 'Randomize',
+ ['rkrf'] = 'Rakar Forms',
+ ['rlig'] = 'Required Ligatures',
+ ['rphf'] = 'Reph Form',
+ ['rtbd'] = 'Right Bounds',
+ ['rtla'] = 'Right-To-Left Alternates',
+ ['rtlm'] = 'Right To Left Math', -- math
+ ['ruby'] = 'Ruby Notation Forms',
+ ['salt'] = 'Stylistic Alternates',
+ ['sinf'] = 'Scientific Inferiors',
+ ['size'] = 'Optical Size',
+ ['smcp'] = 'Small Capitals',
+ ['smpl'] = 'Simplified Forms',
+ ['ss01'] = 'Stylistic Set 1',
+ ['ss02'] = 'Stylistic Set 2',
+ ['ss03'] = 'Stylistic Set 3',
+ ['ss04'] = 'Stylistic Set 4',
+ ['ss05'] = 'Stylistic Set 5',
+ ['ss06'] = 'Stylistic Set 6',
+ ['ss07'] = 'Stylistic Set 7',
+ ['ss08'] = 'Stylistic Set 8',
+ ['ss09'] = 'Stylistic Set 9',
+ ['ss10'] = 'Stylistic Set 10',
+ ['ss11'] = 'Stylistic Set 11',
+ ['ss12'] = 'Stylistic Set 12',
+ ['ss13'] = 'Stylistic Set 13',
+ ['ss14'] = 'Stylistic Set 14',
+ ['ss15'] = 'Stylistic Set 15',
+ ['ss16'] = 'Stylistic Set 16',
+ ['ss17'] = 'Stylistic Set 17',
+ ['ss18'] = 'Stylistic Set 18',
+ ['ss19'] = 'Stylistic Set 19',
+ ['ss20'] = 'Stylistic Set 20',
+ ['ssty'] = 'Script Style', -- math
+ ['subs'] = 'Subscript',
+ ['sups'] = 'Superscript',
+ ['swsh'] = 'Swash',
+ ['titl'] = 'Titling',
+ ['tjmo'] = 'Trailing Jamo Forms',
+ ['tnam'] = 'Traditional Name Forms',
+ ['tnum'] = 'Tabular Figures',
+ ['trad'] = 'Traditional Forms',
+ ['twid'] = 'Third Widths',
+ ['unic'] = 'Unicase',
+ ['valt'] = 'Alternate Vertical Metrics',
+ ['vatu'] = 'Vattu Variants',
+ ['vert'] = 'Vertical Writing',
+ ['vhal'] = 'Alternate Vertical Half Metrics',
+ ['vjmo'] = 'Vowel Jamo Forms',
+ ['vkna'] = 'Vertical Kana Alternates',
+ ['vkrn'] = 'Vertical Kerning',
+ ['vpal'] = 'Proportional Alternate Vertical Metrics',
+ ['vrt2'] = 'Vertical Rotation',
+ ['zero'] = 'Slashed Zero',
+
+ ['trep'] = 'Traditional TeX Replacements',
+ ['tlig'] = 'Traditional TeX Ligatures',
+}
+
+otf.tables.baselines = {
+ ['hang'] = 'Hanging baseline',
+ ['icfb'] = 'Ideographic character face bottom edge baseline',
+ ['icft'] = 'Ideographic character face tope edige baseline',
+ ['ideo'] = 'Ideographic em-box bottom edge baseline',
+ ['idtp'] = 'Ideographic em-box top edge baseline',
+ ['math'] = 'Mathmatical centered baseline',
+ ['romn'] = 'Roman baseline'
+}
+
+-- can be sped up by local tables
+
+function otf.tables.to_tag(id)
+ return stringformat("%4s",lower(id))
+end
+
+local function resolve(tab,id)
+ if tab and id then
+ id = lower(id)
+ return tab[id] or tab[gsub(id," ","")] or tab['dflt'] or ''
+ else
+ return "unknown"
+ end
+end
+
+function otf.meanings.script(id)
+ return resolve(otf.tables.scripts,id)
+end
+function otf.meanings.language(id)
+ return resolve(otf.tables.languages,id)
+end
+function otf.meanings.feature(id)
+ return resolve(otf.tables.features,id)
+end
+function otf.meanings.baseline(id)
+ return resolve(otf.tables.baselines,id)
+end
+
+otf.tables.to_scripts = table.reverse_hash(otf.tables.scripts )
+otf.tables.to_languages = table.reverse_hash(otf.tables.languages)
+otf.tables.to_features = table.reverse_hash(otf.tables.features )
+
+local scripts = otf.tables.scripts
+local languages = otf.tables.languages
+local features = otf.tables.features
+
+local to_scripts = otf.tables.to_scripts
+local to_languages = otf.tables.to_languages
+local to_features = otf.tables.to_features
+
+for k, v in next, to_features do
+ local stripped = gsub(k,"%-"," ")
+ to_features[stripped] = v
+ local stripped = gsub(k,"[^a-zA-Z0-9]","")
+ to_features[stripped] = v
+end
+for k, v in next, to_features do
+ to_features[lower(k)] = v
+end
+
+otf.meanings.checkers = {
+ rand = function(v)
+ return v and "random"
+ end
+}
+
+local checkers = otf.meanings.checkers
+
+function otf.meanings.normalize(features)
+ local h = { }
+ for k,v in next, features do
+ k = lower(k)
+ if k == "language" or k == "lang" then
+ v = gsub(lower(v),"[^a-z0-9%-]","")
+ k = language
+ if not languages[v] then
+ h.language = to_languages[v] or "dflt"
+ else
+ h.language = v
+ end
+ elseif k == "script" then
+ v = gsub(lower(v),"[^a-z0-9%-]","")
+ if not scripts[v] then
+ h.script = to_scripts[v] or "dflt"
+ else
+ h.script = v
+ end
+ else
+ if type(v) == "string" then
+ local b = v:is_boolean()
+ if type(b) == "nil" then
+ v = tonumber(v) or lower(v)
+ else
+ v = b
+ end
+ end
+ k = to_features[k] or k
+ local c = checkers[k]
+ h[k] = c and c(v) or v
+ end
+ end
+ return h
+end
+
+-- When I feel the need ...
+
+--~ otf.tables.aat = {
+--~ [ 0] = {
+--~ name = "allTypographicFeaturesType",
+--~ [ 0] = "allTypeFeaturesOnSelector",
+--~ [ 1] = "allTypeFeaturesOffSelector",
+--~ },
+--~ [ 1] = {
+--~ name = "ligaturesType",
+--~ [0 ] = "requiredLigaturesOnSelector",
+--~ [1 ] = "requiredLigaturesOffSelector",
+--~ [2 ] = "commonLigaturesOnSelector",
+--~ [3 ] = "commonLigaturesOffSelector",
+--~ [4 ] = "rareLigaturesOnSelector",
+--~ [5 ] = "rareLigaturesOffSelector",
+--~ [6 ] = "logosOnSelector ",
+--~ [7 ] = "logosOffSelector ",
+--~ [8 ] = "rebusPicturesOnSelector",
+--~ [9 ] = "rebusPicturesOffSelector",
+--~ [10] = "diphthongLigaturesOnSelector",
+--~ [11] = "diphthongLigaturesOffSelector",
+--~ [12] = "squaredLigaturesOnSelector",
+--~ [13] = "squaredLigaturesOffSelector",
+--~ [14] = "abbrevSquaredLigaturesOnSelector",
+--~ [15] = "abbrevSquaredLigaturesOffSelector",
+--~ },
+--~ [ 2] = {
+--~ name = "cursiveConnectionType",
+--~ [ 0] = "unconnectedSelector",
+--~ [ 1] = "partiallyConnectedSelector",
+--~ [ 2] = "cursiveSelector ",
+--~ },
+--~ [ 3] = {
+--~ name = "letterCaseType",
+--~ [ 0] = "upperAndLowerCaseSelector",
+--~ [ 1] = "allCapsSelector ",
+--~ [ 2] = "allLowerCaseSelector",
+--~ [ 3] = "smallCapsSelector ",
+--~ [ 4] = "initialCapsSelector",
+--~ [ 5] = "initialCapsAndSmallCapsSelector",
+--~ },
+--~ [ 4] = {
+--~ name = "verticalSubstitutionType",
+--~ [ 0] = "substituteVerticalFormsOnSelector",
+--~ [ 1] = "substituteVerticalFormsOffSelector",
+--~ },
+--~ [ 5] = {
+--~ name = "linguisticRearrangementType",
+--~ [ 0] = "linguisticRearrangementOnSelector",
+--~ [ 1] = "linguisticRearrangementOffSelector",
+--~ },
+--~ [ 6] = {
+--~ name = "numberSpacingType",
+--~ [ 0] = "monospacedNumbersSelector",
+--~ [ 1] = "proportionalNumbersSelector",
+--~ },
+--~ [ 7] = {
+--~ name = "appleReserved1Type",
+--~ },
+--~ [ 8] = {
+--~ name = "smartSwashType",
+--~ [ 0] = "wordInitialSwashesOnSelector",
+--~ [ 1] = "wordInitialSwashesOffSelector",
+--~ [ 2] = "wordFinalSwashesOnSelector",
+--~ [ 3] = "wordFinalSwashesOffSelector",
+--~ [ 4] = "lineInitialSwashesOnSelector",
+--~ [ 5] = "lineInitialSwashesOffSelector",
+--~ [ 6] = "lineFinalSwashesOnSelector",
+--~ [ 7] = "lineFinalSwashesOffSelector",
+--~ [ 8] = "nonFinalSwashesOnSelector",
+--~ [ 9] = "nonFinalSwashesOffSelector",
+--~ },
+--~ [ 9] = {
+--~ name = "diacriticsType",
+--~ [ 0] = "showDiacriticsSelector",
+--~ [ 1] = "hideDiacriticsSelector",
+--~ [ 2] = "decomposeDiacriticsSelector",
+--~ },
+--~ [10] = {
+--~ name = "verticalPositionType",
+--~ [ 0] = "normalPositionSelector",
+--~ [ 1] = "superiorsSelector ",
+--~ [ 2] = "inferiorsSelector ",
+--~ [ 3] = "ordinalsSelector ",
+--~ },
+--~ [11] = {
+--~ name = "fractionsType",
+--~ [ 0] = "noFractionsSelector",
+--~ [ 1] = "verticalFractionsSelector",
+--~ [ 2] = "diagonalFractionsSelector",
+--~ },
+--~ [12] = {
+--~ name = "appleReserved2Type",
+--~ },
+--~ [13] = {
+--~ name = "overlappingCharactersType",
+--~ [ 0] = "preventOverlapOnSelector",
+--~ [ 1] = "preventOverlapOffSelector",
+--~ },
+--~ [14] = {
+--~ name = "typographicExtrasType",
+--~ [0 ] = "hyphensToEmDashOnSelector",
+--~ [1 ] = "hyphensToEmDashOffSelector",
+--~ [2 ] = "hyphenToEnDashOnSelector",
+--~ [3 ] = "hyphenToEnDashOffSelector",
+--~ [4 ] = "unslashedZeroOnSelector",
+--~ [5 ] = "unslashedZeroOffSelector",
+--~ [6 ] = "formInterrobangOnSelector",
+--~ [7 ] = "formInterrobangOffSelector",
+--~ [8 ] = "smartQuotesOnSelector",
+--~ [9 ] = "smartQuotesOffSelector",
+--~ [10] = "periodsToEllipsisOnSelector",
+--~ [11] = "periodsToEllipsisOffSelector",
+--~ },
+--~ [15] = {
+--~ name = "mathematicalExtrasType",
+--~ [ 0] = "hyphenToMinusOnSelector",
+--~ [ 1] = "hyphenToMinusOffSelector",
+--~ [ 2] = "asteriskToMultiplyOnSelector",
+--~ [ 3] = "asteriskToMultiplyOffSelector",
+--~ [ 4] = "slashToDivideOnSelector",
+--~ [ 5] = "slashToDivideOffSelector",
+--~ [ 6] = "inequalityLigaturesOnSelector",
+--~ [ 7] = "inequalityLigaturesOffSelector",
+--~ [ 8] = "exponentsOnSelector",
+--~ [ 9] = "exponentsOffSelector",
+--~ },
+--~ [16] = {
+--~ name = "ornamentSetsType",
+--~ [ 0] = "noOrnamentsSelector",
+--~ [ 1] = "dingbatsSelector ",
+--~ [ 2] = "piCharactersSelector",
+--~ [ 3] = "fleuronsSelector ",
+--~ [ 4] = "decorativeBordersSelector",
+--~ [ 5] = "internationalSymbolsSelector",
+--~ [ 6] = "mathSymbolsSelector",
+--~ },
+--~ [17] = {
+--~ name = "characterAlternativesType",
+--~ [ 0] = "noAlternatesSelector",
+--~ },
+--~ [18] = {
+--~ name = "designComplexityType",
+--~ [ 0] = "designLevel1Selector",
+--~ [ 1] = "designLevel2Selector",
+--~ [ 2] = "designLevel3Selector",
+--~ [ 3] = "designLevel4Selector",
+--~ [ 4] = "designLevel5Selector",
+--~ },
+--~ [19] = {
+--~ name = "styleOptionsType",
+--~ [ 0] = "noStyleOptionsSelector",
+--~ [ 1] = "displayTextSelector",
+--~ [ 2] = "engravedTextSelector",
+--~ [ 3] = "illuminatedCapsSelector",
+--~ [ 4] = "titlingCapsSelector",
+--~ [ 5] = "tallCapsSelector ",
+--~ },
+--~ [20] = {
+--~ name = "characterShapeType",
+--~ [0 ] = "traditionalCharactersSelector",
+--~ [1 ] = "simplifiedCharactersSelector",
+--~ [2 ] = "jis1978CharactersSelector",
+--~ [3 ] = "jis1983CharactersSelector",
+--~ [4 ] = "jis1990CharactersSelector",
+--~ [5 ] = "traditionalAltOneSelector",
+--~ [6 ] = "traditionalAltTwoSelector",
+--~ [7 ] = "traditionalAltThreeSelector",
+--~ [8 ] = "traditionalAltFourSelector",
+--~ [9 ] = "traditionalAltFiveSelector",
+--~ [10] = "expertCharactersSelector",
+--~ },
+--~ [21] = {
+--~ name = "numberCaseType",
+--~ [ 0] = "lowerCaseNumbersSelector",
+--~ [ 1] = "upperCaseNumbersSelector",
+--~ },
+--~ [22] = {
+--~ name = "textSpacingType",
+--~ [ 0] = "proportionalTextSelector",
+--~ [ 1] = "monospacedTextSelector",
+--~ [ 2] = "halfWidthTextSelector",
+--~ [ 3] = "normallySpacedTextSelector",
+--~ },
+--~ [23] = {
+--~ name = "transliterationType",
+--~ [ 0] = "noTransliterationSelector",
+--~ [ 1] = "hanjaToHangulSelector",
+--~ [ 2] = "hiraganaToKatakanaSelector",
+--~ [ 3] = "katakanaToHiraganaSelector",
+--~ [ 4] = "kanaToRomanizationSelector",
+--~ [ 5] = "romanizationToHiraganaSelector",
+--~ [ 6] = "romanizationToKatakanaSelector",
+--~ [ 7] = "hanjaToHangulAltOneSelector",
+--~ [ 8] = "hanjaToHangulAltTwoSelector",
+--~ [ 9] = "hanjaToHangulAltThreeSelector",
+--~ },
+--~ [24] = {
+--~ name = "annotationType",
+--~ [ 0] = "noAnnotationSelector",
+--~ [ 1] = "boxAnnotationSelector",
+--~ [ 2] = "roundedBoxAnnotationSelector",
+--~ [ 3] = "circleAnnotationSelector",
+--~ [ 4] = "invertedCircleAnnotationSelector",
+--~ [ 5] = "parenthesisAnnotationSelector",
+--~ [ 6] = "periodAnnotationSelector",
+--~ [ 7] = "romanNumeralAnnotationSelector",
+--~ [ 8] = "diamondAnnotationSelector",
+--~ },
+--~ [25] = {
+--~ name = "kanaSpacingType",
+--~ [ 0] = "fullWidthKanaSelector",
+--~ [ 1] = "proportionalKanaSelector",
+--~ },
+--~ [26] = {
+--~ name = "ideographicSpacingType",
+--~ [ 0] = "fullWidthIdeographsSelector",
+--~ [ 1] = "proportionalIdeographsSelector",
+--~ },
+--~ [103] = {
+--~ name = "cjkRomanSpacingType",
+--~ [ 0] = "halfWidthCJKRomanSelector",
+--~ [ 1] = "proportionalCJKRomanSelector",
+--~ [ 2] = "defaultCJKRomanSelector",
+--~ [ 3] = "fullWidthCJKRomanSelector",
+--~ },
+--~ }
diff --git a/tex/context/base/font-pat.lua b/tex/context/base/font-pat.lua
new file mode 100644
index 000000000..6aba4d47e
--- /dev/null
+++ b/tex/context/base/font-pat.lua
@@ -0,0 +1,126 @@
+if not modules then modules = { } end modules ['font-pat'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local match, lower, find = string.match, string.lower, string.find
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+
+-- this will become a per font patch file
+--
+-- older versions of latin modern didn't have the designsize set
+-- so for them we get it from the name
+
+local patches = fonts.otf.enhancers.patches
+
+local function patch(data,filename)
+ if data.design_size == 0 then
+ local ds = match(file.basename(lower(filename)),"(%d+)")
+ if ds then
+ if trace_loading then
+ logs.report("load otf","patching design size (%s)",ds)
+ end
+ data.design_size = tonumber(ds) * 10
+ end
+ end
+ local uni_to_ind = data.map.map
+ if not uni_to_ind[0x391] then
+ -- beware, this is a hack, features for latin often don't apply to greek
+ -- but lm has not much features anyway (and only greek for math)
+ if trace_loading then
+ logs.report("load otf","adding 13 greek capitals")
+ end
+ uni_to_ind[0x391] = uni_to_ind[0x41]
+ uni_to_ind[0x392] = uni_to_ind[0x42]
+ uni_to_ind[0x395] = uni_to_ind[0x45]
+ uni_to_ind[0x397] = uni_to_ind[0x48]
+ uni_to_ind[0x399] = uni_to_ind[0x49]
+ uni_to_ind[0x39A] = uni_to_ind[0x4B]
+ uni_to_ind[0x39C] = uni_to_ind[0x4D]
+ uni_to_ind[0x39D] = uni_to_ind[0x4E]
+ uni_to_ind[0x39F] = uni_to_ind[0x4F]
+ uni_to_ind[0x3A1] = uni_to_ind[0x52]
+ uni_to_ind[0x3A4] = uni_to_ind[0x54]
+ uni_to_ind[0x3A7] = uni_to_ind[0x58]
+ uni_to_ind[0x396] = uni_to_ind[0x5A]
+ end
+ -- better make this into a feature
+ --
+ -- local glyphs = data.glyphs
+ -- for i=0x300,0x36F do
+ -- local c = glyphs[uni_to_ind[i]]
+ -- if c and c.width == 0 then
+ -- local boundingbox = c.boundingbox
+ -- c.width = boundingbox[3] - boundingbox[1]
+ -- 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)
+ local gpos = data.gpos
+ if gpos then
+ for k=1,#gpos do
+ local v = gpos[k]
+ if not v.features and v.type == "gpos_mark2mark" then
+ if trace_loading then
+ logs.report("load otf","patching mkmk feature (name: %s)", v.name or "?")
+ end
+ v.features = {
+ {
+ scripts = {
+ {
+ langs = { "ARA ", "FAR ", "URD ", "dflt" },
+ script = "arab",
+ },
+ },
+ tag = "mkmk"
+ }
+ }
+ end
+ end
+ end
+end
+
+patches["palatino.*arabic"] = patch
+
+local function patch_domh(data,filename,threshold)
+ local m = data.math
+ if m then
+ local d = m.DisplayOperatorMinHeight or 0
+ if d < threshold then
+ if trace_loading then
+ logs.report("load otf","patching DisplayOperatorMinHeight(%s -> %s)",d,threshold)
+ end
+ m.DisplayOperatorMinHeight = threshold
+ end
+ end
+ if tex.luatexversion < 48 then
+ for _, g in next, data.glyphs do
+ local name = g.name
+ if find(name,"^integral$") or find(name,"^integral%.vsize") then
+ local width, italic = g.width or 0, g.italic_correction or 0
+ local newwidth = width - italic
+ if trace_loading then
+ logs.report("load otf","patching width of %s: %s (width) - %s (italic) = %s",name,width,italic,newwidth)
+ end
+ g.width = newwidth
+ end
+ end
+ end
+end
+
+patches["cambria"] = function(data,filename) patch_domh(data,filename,2800) end
+patches["cambmath"] = function(data,filename) patch_domh(data,filename,2800) end
+patches["asana"] = function(data,filename) patch_domh(data,filename,1350) end
diff --git a/tex/context/base/font-run.mkii b/tex/context/base/font-run.mkii
new file mode 100644
index 000000000..0a0ddd057
--- /dev/null
+++ b/tex/context/base/font-run.mkii
@@ -0,0 +1,326 @@
+%D \module
+%D [ file=font-run,
+%D version=1998.09.11, % (second)
+%D version=2001.02.20, % (third)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D [This code is hooked into the core macros and saves some
+%D format space.]
+
+\unprotect
+
+\gdef\@@onlyenglish#1%
+ {\blank{\tttf \type {#1} is only available in the english interface}\blank}
+
+\gdef\dosetshowfonttitle#1%
+ {\tabskip\zeropoint
+ \parindent\zeropoint
+ \setlocalhsize
+ \doifelsenothing{#1}
+ {\def\title{[\the\bodyfontsize]}}
+ {\switchtobodyfont[#1]\def\title{[#1]}}
+ \doifsomething\fontclass
+ {\doifnot{[\fontclass]}\title
+ {\edef\title{[\fontclass]\space\title}}}}
+
+\gdef\showbodyfont
+ {\dosingleempty\doshowbodyfont}
+
+\gdef\doshowbodyfont[#1]%
+ {\ifinsidefloat\else\startbaselinecorrection\fi
+ \vbox
+ {\dosetshowfonttitle{#1}%
+ \def\bigstrut##1##2%
+ {\hbox{\vrule
+ \!!height##1\strutht
+ \!!depth ##2\strutdp
+ \!!width \zeropoint}}
+ \def\next##1##2##3%
+ {&&##1&&##2\tf##3&&##2\sc##3%
+ &&##2\sl##3&&##2\it##3&&##2\bf##3&&##2\bs##3&&##2\bi##3%
+ &&##2\tfx##3&&##2\tfxx##3%
+ &&##2\tfa##3&&##2\tfb##3&&##2\tfc##3&&##2\tfd##3&\cr}%
+ \halign to \localhsize
+ {\bigstrut{1.5}{2}##&\vrule##
+ \tabskip=\!!zeropoint \!!plus 1fill
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule
+ \tabskip=\!!zeropoint\cr
+ \noalign{\hrule}
+ &\multispan{29}{\vrule\hfil\tttf\strut\title\hfil
+ \llap{\string\mr\hbox to 1em{\hss:\hss}$\mr \languageparameter\c!text$\quad}\vrule}\cr
+ \noalign{\hrule}\next{}{\tt\string}{}
+ \noalign{\hrule}\next{\tt\string\rm}\rm{\languageparameter\c!text}
+ \noalign{\hrule}\next{\tt\string\ss}\ss{\languageparameter\c!text}
+ \noalign{\hrule}\next{\tt\string\tt}\tt{\languageparameter\c!text}
+ \noalign{\hrule}}}
+ \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showbodyfontenvironment
+ {\dosingleempty\doshowbodyfontenvironment}
+
+\gdef\doshowbodyfontenvironment[#1]%
+ {\ifinsidefloat\else\startbaselinecorrection\fi
+ \vbox
+ {\dosetshowfonttitle{#1}%
+ \def\next##1%
+ {&&\getvalue{\bodyfontvariable{##1\s!text}}%
+ &&\getvalue{\bodyfontvariable{##1\s!script}}%
+ &&\getvalue{\bodyfontvariable{##1\s!scriptscript}}%
+ &&\getvalue{\bodyfontvariable{##1\c!x}}%
+ &&\getvalue{\bodyfontvariable{##1\c!xx}}%
+ &&\getvalue{\bodyfontvariable{##1\interfaced\v!small}}%
+ &&\getvalue{\bodyfontvariable{##1\interfaced\v!big}}%
+ &&\edef\next{\getvalue{\bodyfontvariable{##1\c!interlinespace}}}\ifx\next\empty not set\else\next\fi&\cr
+ \noalign{\hrule}}
+ \halign to \localhsize
+ {##&\vrule##\strut
+ \tabskip=\!!zeropoint \!!plus 1fill
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule
+ \tabskip\zeropoint\cr
+ \noalign{\hrule}
+ &\multispan{17}{\vrule\hfil\tttf\strut\title\hfil}\vrule\cr
+ \noalign{\hrule}
+ &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript
+ &&\tttf\tx\c!x&&\tttf\tx\c!xx&&\tttf\tx\v!small&&\tttf\tx\v!big
+ &&\tttf\tx\c!interlinespace&\cr
+ \noalign{\hrule}
+ \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}}
+ \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showfont
+ {\dodoubleempty\doshowfont}
+
+\gdef\doshowfont[#1][#2]%
+ {\bgroup
+ \boxrulewidth=.1pt
+ \setupcolors[\c!state=\v!local]%
+ \iffirstargument
+ \definefont[\s!dummy][#1]\dummy
+ \else\ifdim2.5em>.05\hsize \tx
+ \ifdim2.5em>.05\hsize \txx
+ \fi\fi\fi
+ \ifinsidefloat\else\startbaselinecorrection\fi
+ \vbox\bgroup
+ \forgetall
+ \startoverlay
+ {\vbox
+ {\tf \setstrut \dummy
+ \localcolortrue \offinterlineskip
+ \dostepwiserecurse{0}{15}{1}
+ {\let\row\recurselevel
+ \hbox
+ {\red
+ \dostepwiserecurse{0}{15}{1}
+ {\let\col\recurselevel
+ \@EA\scratchcounter\normaldblquote\hexnumber\row\hexnumber\col\relax
+ \edef\rowcol{\the\scratchcounter}%
+ \iffontchar\font\scratchcounter
+ \setbox\scratchbox\ruledhbox{\black\char\scratchcounter}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \donetrue \else \donefalse
+ \fi
+ \else
+ \setbox\scratchbox\hbox{\gray\vrule\!!width1ex\!!height.5ex\!!depth.5ex}%
+ \fi
+ \startoverlay
+ {\tf\vbox to 2.5em
+ {\vss
+ \hbox to 2.5em
+ {\dummy\ifdim\interwordspace=\zeropoint
+ \setbox\scratchbox\hbox
+ {\raise.5\dp\scratchbox\hbox
+ {\lower.5\ht\scratchbox\copy\scratchbox}}%
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \else
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \strut
+ \fi
+ \hss\copy\scratchbox\hss}
+ \vss}}
+ {\tf\vbox to 2.3em
+ {\ifdone
+ \hsize2.4em
+ \blue
+ \edef\theshowfontspecs
+ {\ifnum\hyphenchar\font=\rowcol hyph\else
+ \ifnum\skewchar \font=\rowcol skew\fi\fi}%
+ \tinyfont % after \edef, else wrong font analyzed
+ \doifnot\v!unknown{#2}{{\red\theshowfontspecs}}\hfill\number\rowcol
+ \vfill
+ \octnumber\rowcol\hfill\lchexnumbers\rowcol
+ \par
+ \fi}}
+ \stopoverlay}}}
+ \par}}
+ {\tf\basegrid[\c!nx=16,\c!ny=16,\c!dx=2.5,\c!dy=2.5,\c!unit=em]}
+ \stopoverlay
+ \nointerlineskip
+ \vskip2pt
+ % the \noexpand before \blank is needed for non etex
+ \edef\ascii{name: {\noexpand\black\fontname\font}}
+ \def\do##1##2{\ifx##1\undefined\else\ifx##1\empty\else##2\fi\fi}%
+ \doifelse\v!unknown{#2}
+ {\edef\theshowfontspecs
+ {name: {\noexpand\black\fontname\font}}}
+ {\edef\theshowfontspecs
+ {name: {\noexpand\black\fontname\font}\noexpand\quad
+ \do\currentencoding{encoding: {\noexpand\black\currentencoding\noexpand\quad}}%
+ \do\currentmapping {mapping: {\noexpand\black\currentmapping \noexpand\quad}}%
+ \do\fonthandling {handling: {\noexpand\black\fonthandling }}}}%
+ \tf % also sets em
+ \hbox to 40em{\blue\hfill\tinyfont\setstrut\strut\theshowfontspecs}
+ \egroup
+ \ifinsidefloat\else\stopbaselinecorrection\fi
+ \egroup}
+
+\gdef\showfontstyle
+ {\dotripleempty\doshowfontstyle}
+
+\gdef\doshowfontstyle[#1][#2][#3]%
+ {\ifthirdargument
+ \bgroup
+ \raggedright
+ \switchtobodyfont[#1]
+ \def\dodocommand##1##2%
+ {\starttextrule{\tttf #1 ##1 ##2}
+ \nobreak \getvalue{##2}%
+ \dorecurse{255}
+ {\iffontchar\font\recurselevel\relax
+ \char\recurselevel\relax\space
+ \fi}
+ \par \nobreak
+ \stoptextrule}
+ \def\docommand##1%
+ {\getvalue{##1}\processcommacommand[#3]{\dodocommand{##1}}}
+ \processcommalist[#2]\docommand
+ \egroup
+ \else\ifsecondargument
+ \showfontstyle[#1][#2][\fontalternativelist]% math is gone
+ \else
+ \showfontstyle[#1][\c!rm]\showfontstyle[#1][\c!ss]
+ \showfontstyle[#1][\c!tt]\showfontstyle[#1][\c!mm]
+ \fi\fi}
+
+\gdef\showligature#1%
+ {\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}}
+
+\gdef\showligatures[#1]%
+ {\ifx\starttabulate\undefined
+ \@@onlyenglish\showligatures
+ \else
+ \bgroup
+ \setupcolors[\c!state=\v!local]%
+ \def\show##1{\hbox{\red\ruledhbox{\black##1}}}%
+ \definefont[\s!dummy][#1]\dummy
+ \starttabulate[|*{9}{c|}]
+ \NC\type{ff}\NC\type{fi}\NC\type{fl}\NC\type{ffi}\NC\type{ffl}\NC
+ \type{``}\NC\type{''}\NC\type{--}\NC\type{---}\NC\NR
+ \NC\show{ff}\NC\show{fi}\NC\show{fl}\NC\show{ffi}\NC\show{ffl}\NC
+ \show{``}\NC\show{''}\NC\show{--}\NC\show{---}\NC\NR
+ \stoptabulate
+ \egroup
+ \fi}
+
+\gdef\showfontstrip
+ {\dosingleempty\doshowfontstrip}
+
+\gdef\doshowfontstrip[#1]%
+ {\ifx\starttabulate\undefined
+ \@@onlyenglish\showfontstrip
+ \else
+ \bgroup
+ \def\dofontstripa##1##2%
+ {\tttf\string##1}
+ \def\dofontstripb##1##2%
+ {\ruledhbox{\switchtobodyfont[#1]##1{##2}}}
+ \def\dofontstripc##1##2%
+ {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+ \tt\tfx\the\ht\scratchbox}%
+ \def\dofontstripd##1##2%
+ {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+ \tt\tfx\the\wd\scratchbox}%
+ \def\fontstrip##1##2##3%
+ {\NC##2\rm{##3}\NC
+ ##2\ss{##3}\NC
+ ##2\tt{##3}\NC
+ ##2\mathematics{##3}\NC
+ \tttf##1\NR}
+ \starttabulate[|c|c|c|c|c|]
+ \fontstrip\relax\dofontstripa\empty
+ \TB
+ \fontstrip\relax\dofontstripb{xxxx}
+ \fontstrip\relax\dofontstripb{12345}
+ \fontstrip\relax\dofontstripb{(Agw)}
+ \TB
+ \fontstrip{(x height)}\dofontstripc{x}
+ \fontstrip{(m width)}\dofontstripd{m}
+ \stoptabulate
+ \egroup
+ \fi}
+
+\ifx\databox\undefined \newbox\databox \fi
+
+\gdef\testminimalbaseline#1%
+ {\setbox\databox\ruledhbox{#1}%
+ \scratchdimen\ht\databox
+ \advance\scratchdimen\dp\databox
+ \scratchtoks{#1}%
+ \expanded
+ {\NC \ruledhbox{\the\scratchtoks}
+ \noexpand \NC ->
+ \noexpand \NC \the\scratchdimen
+ \noexpand \NC =
+ \noexpand \NC \the\ht\databox
+ \noexpand \NC +
+ \noexpand \NC \the\dp\databox
+ \noexpand \NC \ifdim\scratchdimen<\baselineskip <
+ \else\ifdim\scratchdimen=\baselineskip =
+ \else > \fi\fi
+ \noexpand \NC \the\baselineskip
+ \noexpand \NC (\ifdim\scratchdimen>\baselineskip not \fi ok)
+ \noexpand \NC \noexpand \NR }}
+
+\gdef\showminimalbaseline
+ {\ifx\starttabulate\undefined
+ \@@onlyenglish\showminimalbaseline
+ \else
+ \starttabulate[||T|T|T|T|T|T|T|T|T|]
+ \testminimalbaseline{\hbox to 1em{\hss\showstruts\strut\hss}}%
+ \testminimalbaseline{(/)}%
+ \testminimalbaseline{$\frac{1}{2}x^2_3$}
+ \stoptabulate
+ \fi}
+
+\gdef\showkerning#1%
+ {\bgroup
+ \let\MPfshowcommand\ruledhbox
+ \setMPtext\s!dummy{#1}%
+ \startMPcode draw textext(\MPstring\s!dummy);\stopMPcode
+ \egroup}
+
+\gdef\showcharratio
+ {\dowithnextboxcontent
+ {\switchtobodyfont[10pt]}%
+ {(\expanded{\withoutpt\the\nextboxht},%
+ \expanded{\withoutpt\the\nextboxdp})}%
+ \hbox}
+
+\protect \endinput
diff --git a/tex/context/base/font-run.mkiv b/tex/context/base/font-run.mkiv
new file mode 100644
index 000000000..aad6bebe8
--- /dev/null
+++ b/tex/context/base/font-run.mkiv
@@ -0,0 +1,337 @@
+%D \module
+%D [ file=font-run,
+%D version=1998.09.11, % (second)
+%D version=2001.02.20, % (third)
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D [This code is hooked into the core macros and saves some
+%D format space.]
+
+\unprotect
+
+\gdef\@@onlyenglish#1%
+ {\blank{\tttf \type {#1} is only available in the english interface}\blank}
+
+\gdef\dosetshowfonttitle#1%
+ {\tabskip\zeropoint
+ \parindent\zeropoint
+ \setlocalhsize
+ \doifelsenothing{#1}
+ {\def\title{[\the\bodyfontsize]}}
+ {\switchtobodyfont[#1]\def\title{[#1]}}
+ \doifsomething\fontclass
+ {\doifnot{[\fontclass]}\title
+ {\edef\title{[\fontclass]\space\title}}}}
+
+\gdef\showbodyfont
+ {\dosingleempty\doshowbodyfont}
+
+\gdef\doshowbodyfont[#1]%
+ {\ifinsidefloat\else\startbaselinecorrection\fi
+ \vbox
+ {\dosetshowfonttitle{#1}%
+ \def\bigstrut##1##2%
+ {\hbox{\vrule
+ \!!height##1\strutht
+ \!!depth ##2\strutdp
+ \!!width \zeropoint}}
+ \def\next##1##2##3%
+ {&&##1&&##2\tf##3&&##2\sc##3%
+ &&##2\sl##3&&##2\it##3&&##2\bf##3&&##2\bs##3&&##2\bi##3%
+ &&##2\tfx##3&&##2\tfxx##3%
+ &&##2\tfa##3&&##2\tfb##3&&##2\tfc##3&&##2\tfd##3&\cr}%
+ \halign to \localhsize
+ {\bigstrut{1.5}{2}##&\vrule##
+ \tabskip=\!!zeropoint \!!plus 1fill
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule
+ \tabskip=\!!zeropoint\cr
+ \noalign{\hrule}
+ &\multispan{29}{\vrule\hfil\tttf\strut\title\hfil
+ \llap{\string\mr\hbox to 1em{\hss:\hss}$\mr \languageparameter\c!text$\quad}\vrule}\cr
+ \noalign{\hrule}\next{}{\tt\string}{}
+ \noalign{\hrule}\next{\tt\string\rm}\rm{\languageparameter\c!text}
+ \noalign{\hrule}\next{\tt\string\ss}\ss{\languageparameter\c!text}
+ \noalign{\hrule}\next{\tt\string\tt}\tt{\languageparameter\c!text}
+ \noalign{\hrule}}}
+ \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showbodyfontenvironment
+ {\dosingleempty\doshowbodyfontenvironment}
+
+\gdef\doshowbodyfontenvironment[#1]%
+ {\ifinsidefloat\else\startbaselinecorrection\fi
+ \vbox
+ {\dosetshowfonttitle{#1}%
+ \def\next##1%
+ {&&\getvalue{\bodyfontvariable{##1\s!text}}%
+ &&\getvalue{\bodyfontvariable{##1\s!script}}%
+ &&\getvalue{\bodyfontvariable{##1\s!scriptscript}}%
+ &&\getvalue{\bodyfontvariable{##1\c!x}}%
+ &&\getvalue{\bodyfontvariable{##1\c!xx}}%
+ &&\getvalue{\bodyfontvariable{##1\interfaced\v!small}}%
+ &&\getvalue{\bodyfontvariable{##1\interfaced\v!big}}%
+ &&\edef\next{\getvalue{\bodyfontvariable{##1\c!interlinespace}}}\ifx\next\empty not set\else\next\fi&\cr
+ \noalign{\hrule}}
+ \halign to \localhsize
+ {##&\vrule##\strut
+ \tabskip=\!!zeropoint \!!plus 1fill
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule
+ \tabskip\zeropoint\cr
+ \noalign{\hrule}
+ &\multispan{17}{\vrule\hfil\tttf\strut\title\hfil}\vrule\cr
+ \noalign{\hrule}
+ &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript
+ &&\tttf\tx\c!x&&\tttf\tx\c!xx&&\tttf\tx\v!small&&\tttf\tx\v!big
+ &&\tttf\tx\c!interlinespace&\cr
+ \noalign{\hrule}
+ \@EA\globalprocesscommalist\@EA[\bodyfontenvironmentlist]\next}}
+ \ifinsidefloat\else\stopbaselinecorrection\fi}
+
+\gdef\showfont
+ {\dodoubleempty\doshowfont}
+
+\gdef\doshowfont[#1][#2]%
+ {\bgroup
+ \iffirstargument
+ \definefont[\s!dummy][#1]\dummy
+ \fi
+ \doifelsenothing{#2}
+ {\dodoshowfont{#1}{0}}
+ {\doifelse{#2}\v!all
+ {\dostepwiserecurse{0}{255}{1}
+ {\donefalse
+ \let\charplane\recurselevel
+ \dostepwiserecurse{0}{255}{1}
+ {\iffontchar\font\numexpr\charplane*256+\recurselevel\relax
+ \donetrue
+ \exitloop
+ \fi}%
+ \ifdone
+ \dodoshowfont{#1}\charplane
+ \fi}}
+ {\processcommalist[#2]{\dodoshowfont{#1}}}}%
+ \egroup}
+
+\gdef\dodoshowfont#1#2%
+ {\bgroup
+ \edef\charplane{\number#2}%
+ \boxrulewidth=.1pt
+ \iffirstargument
+% \definefont[\s!dummy][#1]\dummy
+ \else\ifdim2.5em>.05\hsize \tx
+ \ifdim2.5em>.05\hsize \txx
+ \fi\fi\fi
+ \ifinsidefloat\else\startbaselinecorrection\fi
+ \vbox\bgroup
+ \forgetall
+ \startoverlay
+ {\vbox
+ {\tf \setstrut \dummy
+ \offinterlineskip
+ \dostepwiserecurse{0}{15}{1}
+ {\let\row\recurselevel
+ \hbox
+ {\red
+ \dostepwiserecurse{0}{15}{1}
+ {\let\col\recurselevel
+ \@EA\scratchcounter\string"\hexnumber\row\hexnumber\col\relax
+ \edef\rowcol{\the\scratchcounter}%
+ \iffontchar\font\scratchcounter
+ \setbox\scratchbox\ruledhbox{\black\char\numexpr\charplane*256+\scratchcounter\relax}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \donetrue \else \donefalse
+ \fi
+ \else
+ \setbox\scratchbox\hbox{\gray\vrule\!!width1ex\!!height.5ex\!!depth.5ex}%
+ \fi
+ \startoverlay
+ {\tf\vbox to 2.5em
+ {\vss
+ \hbox to 2.5em
+ {\dummy\ifdim\interwordspace=\zeropoint
+ \setbox\scratchbox\hbox
+ {\raise.5\dp\scratchbox\hbox
+ {\lower.5\ht\scratchbox\copy\scratchbox}}%
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \else
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \strut
+ \fi
+ \hss\copy\scratchbox\hss}
+ \vss}}
+ {\tf\vbox to 2.3em
+ {\ifdone
+ \hsize2.4em
+ \blue
+ \tinyfont
+ \hfill\number\rowcol
+ \vfill
+ \octnumber\rowcol\hfill\lchexnumbers\rowcol
+ \par
+ \fi}}
+ \stopoverlay}}}
+ \par}}
+ {\tf\basegrid[\c!nx=16,\c!ny=16,\c!dx=2.5,\c!dy=2.5,\c!unit=em]}
+ \stopoverlay
+ \nointerlineskip
+ \vskip2pt
+ % the \noexpand before \blank is needed for non etex
+ \edef\ascii{name: {\noexpand\black\fontname\font}}
+ \def\do##1##2{\ifx##1\undefined\else\ifx##1\empty\else##2\fi\fi}%
+ \edef\theshowfontspecs{name: {\noexpand\black\fontname\font}\quad plane: \charplane\enspace"\hexnumber\charplane}%
+ \tf % also sets em
+ \hbox to 40em{\blue\hfill\tinyfont\setstrut\strut\theshowfontspecs}
+ \egroup
+ \ifinsidefloat\else\stopbaselinecorrection\fi
+ \egroup}
+
+\gdef\showfontstyle
+ {\dotripleempty\doshowfontstyle}
+
+\gdef\doshowfontstyle[#1][#2][#3]%
+ {\ifthirdargument
+ \bgroup
+ \raggedright
+ \switchtobodyfont[#1]
+ \def\dodocommand##1##2%
+ {\starttextrule{\tttf #1 ##1 ##2}
+ \nobreak \getvalue{##2}%
+ \dorecurse{255}
+ {\iffontchar\font\recurselevel\relax
+ \char\recurselevel\relax\space
+ \fi}
+ \par \nobreak
+ \stoptextrule}
+ \def\docommand##1%
+ {\getvalue{##1}\processcommacommand[#3]{\dodocommand{##1}}}
+ \processcommalist[#2]\docommand
+ \egroup
+ \else\ifsecondargument
+ \showfontstyle[#1][#2][\fontalternativelist]% math is gone
+ \else
+ \showfontstyle[#1][\c!rm]\showfontstyle[#1][\c!ss]
+ \showfontstyle[#1][\c!tt]\showfontstyle[#1][\c!mm]
+ \fi\fi}
+
+\gdef\showligature#1%
+ {\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}}
+
+\gdef\showligatures[#1]%
+ {\ifx\starttabulate\undefined
+ \@@onlyenglish\showligatures
+ \else
+ \bgroup
+ \def\show##1{\hbox{\red\ruledhbox{\black##1}}}%
+ \definefont[\s!dummy][#1]\dummy
+ \starttabulate[|*{9}{c|}]
+ \NC\type{ff}\NC\type{fi}\NC\type{fl}\NC\type{ffi}\NC\type{ffl}\NC
+ \type{``}\NC\type{''}\NC\type{--}\NC\type{---}\NC\NR
+ \NC\show{ff}\NC\show{fi}\NC\show{fl}\NC\show{ffi}\NC\show{ffl}\NC
+ \show{``}\NC\show{''}\NC\show{--}\NC\show{---}\NC\NR
+ \stoptabulate
+ \egroup
+ \fi}
+
+\gdef\showfontstrip
+ {\dosingleempty\doshowfontstrip}
+
+\gdef\doshowfontstrip[#1]%
+ {\ifx\starttabulate\undefined
+ \@@onlyenglish\showfontstrip
+ \else
+ \bgroup
+ \def\dofontstripa##1##2%
+ {\tttf\string##1}
+ \def\dofontstripb##1##2%
+ {\ruledhbox{\switchtobodyfont[#1]##1{##2}}}
+ \def\dofontstripc##1##2%
+ {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+ \tt\tfx\the\ht\scratchbox}%
+ \def\dofontstripd##1##2%
+ {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
+ \tt\tfx\the\wd\scratchbox}%
+ \def\fontstrip##1##2##3%
+ {\NC##2\rm{##3}\NC
+ ##2\ss{##3}\NC
+ ##2\tt{##3}\NC
+ ##2\mathematics{##3}\NC
+ \tttf##1\NR}
+ \starttabulate[|c|c|c|c|c|]
+ \fontstrip\relax\dofontstripa\empty
+ \TB
+ \fontstrip\relax\dofontstripb{xxxx}
+ \fontstrip\relax\dofontstripb{12345}
+ \fontstrip\relax\dofontstripb{(Agw)}
+ \TB
+ \fontstrip{(x height)}\dofontstripc{x}
+ \fontstrip{(m width)}\dofontstripd{m}
+ \stoptabulate
+ \egroup
+ \fi}
+
+\ifx\databox\undefined \newbox\databox \fi
+
+\gdef\testminimalbaseline#1%
+ {\setbox\databox\ruledhbox{#1}%
+ \scratchdimen\ht\databox
+ \advance\scratchdimen\dp\databox
+ \scratchtoks{#1}%
+ \expanded
+ {\NC \ruledhbox{\the\scratchtoks}
+ \noexpand \NC ->
+ \noexpand \NC \the\scratchdimen
+ \noexpand \NC =
+ \noexpand \NC \the\ht\databox
+ \noexpand \NC +
+ \noexpand \NC \the\dp\databox
+ \noexpand \NC \ifdim\scratchdimen<\baselineskip <
+ \else\ifdim\scratchdimen=\baselineskip =
+ \else > \fi\fi
+ \noexpand \NC \the\baselineskip
+ \noexpand \NC (\ifdim\scratchdimen>\baselineskip not \fi ok)
+ \noexpand \NC \noexpand \NR }}
+
+\gdef\showminimalbaseline
+ {\ifx\starttabulate\undefined
+ \@@onlyenglish\showminimalbaseline
+ \else
+ \starttabulate[||T|T|T|T|T|T|T|T|T|]
+ \testminimalbaseline{\hbox to 1em{\hss\showstruts\strut\hss}}%
+ \testminimalbaseline{(/)}%
+ \testminimalbaseline{$\frac{1}{2}x^2_3$}
+ \stoptabulate
+ \fi}
+
+\gdef\showkerning#1%
+ {\bgroup
+ \let\MPfshowcommand\ruledhbox
+ \setMPtext\s!dummy{#1}%
+ \startMPcode draw textext(\MPstring\s!dummy);\stopMPcode
+ \egroup}
+
+\gdef\showcharratio
+ {\dowithnextboxcontent
+ {\switchtobodyfont[10pt]}%
+ {(\expanded{\withoutpt\the\nextboxht},%
+ \expanded{\withoutpt\the\nextboxdp})}%
+ \hbox}
+
+\protect \endinput
diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua
new file mode 100644
index 000000000..5ad92e002
--- /dev/null
+++ b/tex/context/base/font-syn.lua
@@ -0,0 +1,1454 @@
+if not modules then modules = { } end modules ['font-syn'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: subs in lookups requests
+
+local utf = unicode.utf8
+local next, tonumber = next, tonumber
+local gsub, lower, match, find, lower, upper = string.gsub, string.lower, string.match, string.find, string.lower, string.upper
+local find, gmatch = string.find, string.gmatch
+local concat, sort, format = table.concat, table.sort, string.format
+local lpegmatch = lpeg.match
+local utfgsub, utflower = utf.gsub, utf.lower
+local unpack = unpack or table.unpack
+
+local trace_names = false trackers.register("fonts.names", function(v) trace_names = v end)
+local trace_warnings = false trackers.register("fonts.warnings", function(v) trace_warnings = v end)
+
+--[[ldx--
+<p>This module implements a name to filename resolver. Names are resolved
+using a table that has keys filtered from the font related files.</p>
+--ldx]]--
+
+local texsprint = (tex and tex.sprint) or print
+
+fonts = fonts or { }
+input = input or { }
+texmf = texmf or { }
+
+fonts.names = fonts.names or { }
+fonts.names.filters = fonts.names.filters or { }
+fonts.names.data = fonts.names.data or { }
+
+local names = fonts.names
+local filters = fonts.names.filters
+
+names.version = 1.103
+names.basename = "names"
+names.saved = false
+names.loaded = false
+names.be_clever = true
+names.enabled = true
+names.autoreload = toboolean(os.env['MTX.FONTS.AUTOLOAD'] or os.env['MTX_FONTS_AUTOLOAD'] or "no")
+names.cache = containers.define("fonts","data",names.version,true)
+
+--[[ldx--
+<p>A few helpers.</p>
+--ldx]]--
+
+local P, C, Cc, Cs, Carg = lpeg.P, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg
+
+-- what to do with 'thin'
+
+local weights = Cs ( -- not extra
+ P("demibold")
+ + P("semibold")
+ + P("mediumbold")
+ + P("ultrabold")
+ + P("extrabold")
+ + P("ultralight")
+ + P("bold")
+ + P("demi")
+ + P("semi")
+ + P("light")
+ + P("medium")
+ + P("heavy")
+ + P("ultra")
+ + P("black")
+ + P("bol") -- / "bold"
+ + P("regular") / "normal"
+)
+
+local styles = Cs (
+ P("reverseoblique") / "reverseitalic"
+ + P("regular") / "normal"
+ + P("italic")
+ + P("oblique") / "italic"
+ + P("slanted")
+ + P("roman") / "normal"
+ + P("ital") / "italic"
+ + P("ita") / "italic"
+)
+
+local widths = Cs(
+ P("condensed")
+ + P("thin")
+ + P("expanded")
+ + P("cond") / "condensed"
+ + P("normal")
+ + P("book") / "normal"
+)
+
+local variants = Cs( -- fax casual
+ P("smallcaps")
+ + P("oldstyle")
+ + P("caps") / "smallcaps"
+)
+
+local any = P(1)
+
+local analysed_table
+
+local analyser = Cs (
+ (
+ weights / function(s) analysed_table[1] = s return "" end
+ + styles / function(s) analysed_table[2] = s return "" end
+ + widths / function(s) analysed_table[3] = s return "" end
+ + variants / function(s) analysed_table[4] = s return "" end
+ + any
+ )^0
+)
+
+local splitter = lpeg.splitat("-")
+
+function names.splitspec(askedname)
+ local name, weight, style, width, variant = lpegmatch(splitter,askedname)
+ weight = weight and lpegmatch(weights, weight) or weight
+ style = style and lpegmatch(styles, style) or style
+ width = width and lpegmatch(widths, width) or width
+ variant = variant and lpegmatch(variants,variant) or variant
+ if trace_names then
+ logs.report("fonts","requested name '%s' split in name '%s', weight '%s', style '%s', width '%s' and variant '%s'",
+ askedname,name or '',weight or '',style or '',width or '',variant or '')
+ end
+ if not weight or not weight or not width or not variant then
+ weight, style, width, variant = weight or "normal", style or "normal", width or "normal", variant or "normal"
+ if trace_names then
+ logs.report("fonts","request '%s' normalized to '%s-%s-%s-%s-%s'",
+ askedname,name,weight,style,width,variant)
+ end
+ end
+ return name or askedname, weight, style, width, variant
+end
+
+local function analysespec(somename)
+ if somename then
+ analysed_table = { }
+ local name = lpegmatch(analyser,somename)
+ return name, analysed_table[1], analysed_table[2], analysed_table[3], analysed_table[4]
+ end
+end
+
+--[[ldx--
+<p>It would make sense to implement the filters in the related modules,
+but to keep the overview, we define them here.</p>
+--ldx]]--
+
+filters.otf = fontloader.info
+filters.ttf = fontloader.info
+filters.ttc = fontloader.info
+filters.dfont = fontloader.info
+
+function fontloader.fullinfo(...)
+ local ff = fontloader.open(...)
+ if ff then
+ local d = ff and fontloader.to_table(ff)
+ d.glyphs, d.subfonts, d.gpos, d.gsub, d.lookups = nil, nil, nil, nil, nil
+ fontloader.close(ff)
+ return d
+ else
+ return nil, "error in loading font"
+ end
+end
+
+filters.otf = fontloader.fullinfo
+
+function filters.afm(name)
+ -- we could parse the afm file as well, and then report an error but
+ -- it's not worth the trouble
+ local pfbname = resolvers.find_file(file.removesuffix(name)..".pfb","pfb") or ""
+ if pfbname == "" then
+ pfbname = resolvers.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 = match(line,"^(.+)%s+(.+)%s*$")
+ if key and #key > 0 then
+ hash[lower(key)] = value
+ end
+ if find(line,"StartCharMetrics") then
+ break
+ end
+ end
+ f:close()
+ return hash
+ end
+ end
+ return nil, "no matching pfb file"
+end
+
+function filters.pfb(name)
+ return fontloader.info(name)
+end
+
+--[[ldx--
+<p>The scanner loops over the filters using the information stored in
+the file databases. Watch how we check not only for the names, but also
+for combination with the weight of a font.</p>
+--ldx]]--
+
+filters.list = {
+ "otf", "ttf", "ttc", "dfont", "afm",
+--~ "ttc", "otf", "ttf", "dfont", "afm",
+}
+
+names.xml_configuration_file = "fonts.conf" -- a bit weird format, bonus feature
+names.environment_path_variable = "OSFONTDIR" -- the official way, in minimals etc
+
+filters.paths = { }
+filters.names = { }
+
+function names.getpaths(trace)
+ local hash, result = { }, { }
+ local function collect(t)
+ for i=1, #t do
+ local v = resolvers.clean_path(t[i])
+ v = gsub(v,"/+$","")
+ local key = lower(v)
+ if not hash[key] then
+ hash[key], result[#result+1] = true, v
+ end
+ end
+ end
+ local path = names.environment_path_variable or ""
+ if path ~= "" then
+ collect(resolvers.expanded_path_list(path))
+ end
+ if xml then
+ local confname = names.xml_configuration_file or ""
+ if confname ~= "" then
+ -- first look in the tex tree
+ local name = resolvers.find_file(confname,"other")
+ if name == "" then
+ -- after all, fontconfig is a unix thing
+ name = file.join("/etc",confname)
+ if not lfs.isfile(name) then
+ name = "" -- force quit
+ end
+ end
+ if name ~= "" and lfs.isfile(name) then
+ if trace_names then
+ logs.report("fontnames","loading fontconfig file: %s",name)
+ end
+ local xmldata = xml.load(name)
+ -- begin of untested mess
+ xml.include(xmldata,"include","",true,function(incname)
+ if not file.is_qualified_path(incname) then
+ local path = file.dirname(name) -- main name
+ if path ~= "" then
+ incname = file.join(path,incname)
+ end
+ end
+ if lfs.isfile(incname) then
+ if trace_names then
+ logs.report("fontnames","merging included fontconfig file: %s",incname)
+ end
+ return io.loaddata(incname)
+ elseif trace_names then
+ logs.report("fontnames","ignoring included fontconfig file: %s",incname)
+ end
+ end)
+ -- end of untested mess
+ local fontdirs = xml.collect_texts(xmldata,"dir",true)
+ if trace_names then
+ logs.report("fontnames","%s dirs found in fontconfig",#fontdirs)
+ end
+ collect(fontdirs)
+ end
+ end
+ end
+ function names.getpaths()
+ return result
+ end
+ return result
+end
+
+local function cleanname(name)
+ return (gsub(lower(name),"[^%a%d]",""))
+ -- once we can load files with utf names, we can play with the following:
+ -- return (utfgsub(utfgsub(lower(str),"[^%a%A%d]",""),"%s",""))
+end
+
+names.cleanname = cleanname
+
+local function check_names(result)
+ local names = result.names
+ if names then
+ for i=1,#names do
+ local name = names[i]
+ if name.lang == "English (US)" then
+ return name.names
+ end
+ end
+ end
+end
+
+local function walk_tree(pathlist,suffix,identify)
+ if pathlist then
+ for i=1,#pathlist do
+ local path = pathlist[i]
+ path = resolvers.clean_path(path .. "/")
+ path = gsub(path,"/+","/")
+ local pattern = path .. "**." .. suffix -- ** forces recurse
+ logs.report("fontnames", "globbing path %s",pattern)
+ local t = dir.glob(pattern)
+ sort(t,sorter)
+ for j=1,#t do
+ local completename = t[j]
+ identify(completename,file.basename(completename),suffix,completename)
+ end
+ end
+ end
+end
+
+local function check_name(data,result,filename,suffix,subfont)
+ -- shortcuts
+ local specifications = data.specifications
+ local families = data.families
+ -- prepare
+ local names = check_names(result)
+ -- fetch
+ local familyname = (names and names.preffamilyname) or result.familyname
+ local fullname = (names and names.fullname) or result.fullname
+ local fontname = result.fontname
+ local subfamily = (names and names.subfamily)
+ local modifiers = (names and names.prefmodifiers)
+ local weight = (names and names.weight) or result.weight
+ local italicangle = tonumber(result.italicangle)
+ local subfont = subfont or nil
+ local rawname = fullname or fontname or familyname
+ -- normalize
+ familyname = familyname and cleanname(familyname)
+ fullname = fullname and cleanname(fullname)
+ fontname = fontname and cleanname(fontname)
+ subfamily = subfamily and cleanname(subfamily)
+ modifiers = modifiers and cleanname(modifiers)
+ weight = weight and cleanname(weight)
+ italicangle = (italicangle == 0) and nil
+ -- analyse
+ local a_name, a_weight, a_style, a_width, a_variant = analysespec(fullname or fontname or familyname)
+ -- check
+ local width = a_width
+ local variant = a_variant
+ local style = modifiers and gsub(modifiers,"[^%a]","")
+ if not style and italicangle then
+ style = "italic"
+ end
+ if not variant or variant == "" then
+ variant = "normal"
+ end
+ if not weight or weight == "" then
+ weight = a_weight
+ end
+ if not style or style == "" then
+ style = a_style
+ end
+ if not familyname then
+ familyname = a_name
+ end
+ fontname = fontname or fullname or familyname or file.basename(filename)
+ fullname = fullname or fontname
+ familyname = familyname or fontname
+ specifications[#specifications + 1] = {
+ filename = filename,
+ format = lower(suffix),
+ subfont = subfont,
+ rawname = rawname,
+ familyname = familyname,
+ fullname = fullname,
+ fontname = fontname,
+ subfamily = subfamily,
+ modifiers = modifiers,
+ weight = weight,
+ style = style,
+ width = width,
+ variant = variant,
+ minsize = result.design_range_bottom or 0,
+ maxsize = result.design_range_top or 0,
+ designsize = result.design_size or 0,
+ }
+end
+
+local function cleanupkeywords()
+ local data = names.data
+ local specifications = names.data.specifications
+ if specifications then
+ local weights, styles, widths, variants = { }, { }, { }, { }
+ for i=1,#specifications do
+ local s = specifications[i]
+ -- fix (sofar styles are taken from the name, and widths from the specification)
+ local _, b_weight, b_style, b_width, b_variant = analysespec(s.weight)
+ local _, c_weight, c_style, c_width, c_variant = analysespec(s.style)
+ local _, d_weight, d_style, d_width, d_variant = analysespec(s.width)
+ local _, e_weight, e_style, e_width, e_variant = analysespec(s.variant)
+ local _, f_weight, f_style, f_width, f_variant = analysespec(s.fullname or "")
+ local weight = b_weight or c_weight or d_weight or e_weight or f_weight or "normal"
+ local style = b_style or c_style or d_style or e_style or f_style or "normal"
+ local width = b_width or c_width or d_width or e_width or f_width or "normal"
+ local variant = b_variant or c_variant or d_variant or e_variant or f_variant or "normal"
+ if not weight or weight == "" then weight = "normal" end
+ if not style or style == "" then style = "normal" end
+ if not width or width == "" then width = "normal" end
+ if not variant or variant == "" then variant = "normal" end
+ weights [weight ] = (weights [weight ] or 0) + 1
+ styles [style ] = (styles [style ] or 0) + 1
+ widths [width ] = (widths [width ] or 0) + 1
+ variants[variant] = (variants[variant] or 0) + 1
+ if weight ~= s.weight then
+ s.fontweight = s.weight
+ end
+ s.weight, s.style, s.width, s.variant = weight, style, width, variant
+ end
+ local stats = data.statistics
+ stats.used_weights, stats.used_styles, stats.used_widths, stats.used_variants = weights, styles, widths, variants
+ end
+end
+
+local function collectstatistics()
+ local data = names.data
+ local specifications = data.specifications
+ if specifications then
+ local weights, styles, widths, variants = { }, { }, { }, { }
+ for i=1,#specifications do
+ local s = specifications[i]
+ local weight, style, width, variant = s.weight, s.style, s.width, s.variant
+ if weight then weights [weight ] = (weights [weight ] or 0) + 1 end
+ if style then styles [style ] = (styles [style ] or 0) + 1 end
+ if width then widths [width ] = (widths [width ] or 0) + 1 end
+ if variant then variants[variant] = (variants[variant] or 0) + 1 end
+ end
+ local stats = data.statistics
+ stats.weights, stats.styles, stats.widths, stats.variants, stats.fonts = weights, styles, widths, variants, #specifications
+ end
+end
+
+local function collecthashes()
+ local data = names.data
+ local mappings = data.mappings
+ local fallbacks = data.fallbacks
+ local specifications = data.specifications
+ local nofmappings, noffallbacks = 0, 0
+ if specifications then
+ -- maybe multiple passes
+ for index=1,#specifications do
+ local s = specifications[index]
+ local format, fullname, fontname, familyname, weight, subfamily = s.format, s.fullname, s.fontname, s.familyname, s.weight, s.subfamily
+ local mf, ff = mappings[format], fallbacks[format]
+ if fullname and not mf[fullname] then
+ mf[fullname], nofmappings = index, nofmappings + 1
+ end
+ if fontname and not mf[fontname] then
+ mf[fontname], nofmappings = index, nofmappings + 1
+ end
+ if familyname and weight then
+ local madename = familyname .. weight
+ if not mf[madename] and not ff[madename] then
+ ff[madename], noffallbacks = index, noffallbacks + 1
+ end
+ end
+ if familyname and subfamily then
+ local extraname = familyname .. subfamily
+ if not mf[extraname] and not ff[extraname] then
+ ff[extraname], noffallbacks = index, noffallbacks + 1
+ end
+ end
+ if familyname then
+ if not mf[familyname] and not ff[familyname] then
+ ff[familyname], noffallbacks = index, noffallbacks + 1
+ end
+ end
+ end
+ end
+ return nofmappings, noffallbacks
+end
+
+local function collectfamilies()
+ local data = names.data
+ local specifications = data.specifications
+ local families = data.families
+ for index=1,#specifications do
+ local familyname = specifications[index].familyname
+ local family = families[familyname]
+ if not family then
+ families[familyname] = { index }
+ else
+ family[#family+1] = index
+ end
+ end
+end
+
+local function checkduplicate(where) -- fails on "Romantik" but that's a border case anyway
+ local data = names.data
+ local mapping = data[where]
+ local specifications, loaded = data.specifications, { }
+ if specifications and mapping then
+ for _, m in next, mapping do
+ for k, v in next, m do
+ local s = specifications[v]
+ local hash = format("%s-%s-%s-%s-%s",s.familyname,s.weight or "*",s.style or "*",s.width or "*",s.variant or "*")
+ local h = loaded[hash]
+ if h then
+ local ok = true
+ local fn = s.filename
+ for i=1,#h do
+ local hn = s.filename
+ if h[i] == fn then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ h[#h+1] = fn
+ end
+ else
+ loaded[hash] = { s.filename }
+ end
+ end
+ end
+ end
+ local n = 0
+ for k, v in table.sortedhash(loaded) do
+ local nv = #v
+ if nv > 1 then
+ if trace_warnings then
+ logs.report("fontnames", "double lookup: %s => %s",k,concat(v," | "))
+ end
+ n = n + nv
+ end
+ end
+ logs.report("fontnames", "%s double lookups in %s",n,where)
+end
+
+local function checkduplicates()
+ checkduplicate("mappings")
+ checkduplicate("fallbacks")
+end
+
+local sorter = function(a,b)
+ return a > b -- to be checked
+end
+
+local function sorthashes()
+ local data, list = names.data, filters.list
+ local mappings, fallbacks, sorted_mappings, sorted_fallbacks = data.mappings, data.fallbacks, { }, { }
+ data.sorted_mappings, data.sorted_fallbacks = sorted_mappings, sorted_fallbacks
+ for i=1,#list do
+ local l = list[i]
+ sorted_mappings[l], sorted_fallbacks[l] = table.keys(mappings[l]), table.keys(fallbacks[l])
+ sort(sorted_mappings[l],sorter)
+ sort(sorted_fallbacks[l],sorter)
+ end
+ data.sorted_families = table.keys(data.families)
+ sort(data.sorted_families,sorter)
+end
+
+local function unpackreferences()
+ local data = names.data
+ local specifications = data.specifications
+ if specifications then
+ for k, v in next, data.families do
+ for i=1,#v do
+ v[i] = specifications[v[i]]
+ end
+ end
+ local mappings = data.mappings
+ if mappings then
+ for _, m in next, mappings do
+ for k, v in next, m do
+ m[k] = specifications[v]
+ end
+ end
+ end
+ local fallbacks = data.fallbacks
+ if fallbacks then
+ for _, f in next, fallbacks do
+ for k, v in next, f do
+ f[k] = specifications[v]
+ end
+ end
+ end
+ end
+end
+
+local function analysefiles()
+ local data = names.data
+ local done, totalnofread, totalnofskipped = { }, 0, 0
+ local skip_paths, skip_names = filters.paths, filters.names
+ local function identify(completename,name,suffix,storedname)
+ local basename = file.basename(completename)
+ local basepath = file.dirname(completename)
+ if done[name] then
+ -- already done (avoid otf afm clash)
+ elseif not io.exists(completename) then
+ -- weird error
+ elseif not file.is_qualified_path(completename) and resolvers.find_file(completename,suffix) == "" then
+ -- not locateble by backend anyway
+ else
+ nofread = nofread + 1
+ if #skip_paths > 0 then
+ for i=1,#skip_paths do
+ if find(basepath,skip_paths[i]) then
+ if trace_names then
+ logs.report("fontnames","rejecting path of %s font %s",suffix,completename)
+ logs.push()
+ end
+ return
+ end
+ end
+ end
+ if #skip_names > 0 then
+ for i=1,#skip_paths do
+ if find(basename,skip_names[i]) then
+ done[name] = true
+ if trace_names then
+ logs.report("fontnames","rejecting name of %s font %s",suffix,completename)
+ logs.push()
+ end
+ return
+ end
+ end
+ end
+ if trace_names then
+ logs.report("fontnames","identifying %s font %s",suffix,completename)
+ logs.push()
+ end
+ local result, message = filters[lower(suffix)](completename)
+ if trace_names then
+ logs.pop()
+ end
+ if result then
+ if not result[1] then
+ local ok = check_name(data,result,storedname,suffix)
+ if not ok then
+ nofskipped = nofskipped + 1
+ end
+ else
+ for r=1,#result do
+ local ok = check_name(data,result[r],storedname,suffix,r-1) -- subfonts start at zero
+ if not ok then
+ nofskipped = nofskipped + 1
+ end
+ end
+ end
+ if trace_warnings and message and message ~= "" then
+ logs.report("fontnames","warning when identifying %s font %s: %s",suffix,completename,message)
+ end
+ elseif trace_warnings then
+ logs.report("fontnames","error when identifying %s font %s: %s",suffix,completename,message or "unknown")
+ end
+ done[name] = true
+ end
+ end
+ local function traverse(what, method)
+ local list = filters.list
+ for n=1,#list do
+ local suffix = list[n]
+ local t = os.gettimeofday() -- use elapser
+ nofread, nofskipped = 0, 0
+ suffix = lower(suffix)
+ logs.report("fontnames", "identifying %s font files with suffix %s",what,suffix)
+ method(suffix)
+ suffix = upper(suffix)
+ logs.report("fontnames", "identifying %s font files with suffix %s",what,suffix)
+ method(suffix)
+ totalnofread, totalnofskipped = totalnofread + nofread, totalnofskipped + nofskipped
+ local elapsed = os.gettimeofday() - t
+ logs.report("fontnames", "%s %s files identified, %s hash entries added, runtime %0.3f seconds",nofread,what,nofread-nofskipped,elapsed)
+ end
+ end
+ if not trace_warnings then
+ logs.report("fontnames", "warnings are disabled (tracker 'fonts.warnings')")
+ end
+ traverse("tree", function(suffix) -- TEXTREE only
+ resolvers.with_files(".*%." .. suffix .. "$", function(method,root,path,name)
+ if method == "file" then
+ local completename = root .."/" .. path .. "/" .. name
+ identify(completename,name,suffix,name,name)
+ end
+ end)
+ end)
+ if texconfig.kpse_init then
+ -- we do this only for a stupid names run, not used for context itself,
+ -- using the vars is to clumsy so we just stick to a full scan instead
+ traverse("lsr", function(suffix) -- all trees
+ local pathlist = resolvers.split_path(resolvers.show_path("ls-R") or "")
+ walk_tree(pathlist,suffix,identify)
+ end)
+ else
+ traverse("system", function(suffix) -- OSFONTDIR cum suis
+ walk_tree(names.getpaths(trace),suffix,identify)
+ end)
+ end
+ data.statistics.readfiles, data.statistics.skippedfiles = totalnofread, totalnofskipped
+end
+
+local function rejectclashes() -- just to be sure, so no explicit afm will be found then
+ local specifications, used, okay = names.data.specifications, { }, { }
+ for i=1,#specifications do
+ local s = specifications[i]
+ local f = s.fontname
+ if f then
+ local fnd, fnm = used[f], s.filename
+ if fnd then
+ if trace_warnings then
+ logs.report("fontnames", "fontname '%s' clashes, rejecting '%s' in favor of '%s'",f,fnm,fnd)
+ end
+ else
+ used[f], okay[#okay+1] = fnm, s
+ end
+ else
+ okay[#okay+1] = s
+ end
+ end
+ local d = #specifications - #okay
+ if d > 0 then
+ logs.report("fontnames", "%s files rejected due to clashes",d)
+ end
+ names.data.specifications = okay
+end
+
+local function resetdata()
+ local mappings, fallbacks = { }, { }
+ for _, k in next, filters.list do
+ mappings[k], fallbacks[k] = { }, { }
+ end
+ names.data = {
+ version = names.version,
+ mappings = mappings,
+ fallbacks = fallbacks,
+ specifications = { },
+ families = { },
+ statistics = { },
+ data_state = resolvers.data_state(),
+ }
+end
+
+function names.identify()
+ resetdata()
+ analysefiles()
+ rejectclashes()
+ collectfamilies()
+ collectstatistics()
+ cleanupkeywords()
+ collecthashes()
+ checkduplicates()
+ -- sorthashes() -- will be resorted when saved
+end
+
+function names.is_permitted(name)
+ return containers.is_usable(names.cache(), name)
+end
+function names.write_data(name,data)
+ containers.write(names.cache(),name,data)
+end
+function names.read_data(name)
+ return containers.read(names.cache(),name)
+end
+
+function names.load(reload,verbose)
+ if not names.loaded then
+ if reload then
+ if names.is_permitted(names.basename) then
+ names.identify(verbose)
+ names.write_data(names.basename,names.data)
+ else
+ logs.report("font table", "unable to access database cache")
+ end
+ names.saved = true
+ end
+ local data = names.read_data(names.basename)
+ names.data = data
+ if not names.saved then
+ if not data or not next(data) or not data.specifications or not next(data.specifications) then
+ names.load(true)
+ end
+ names.saved = true
+ end
+ if not data then
+ logs.report("font table", "accessing the data table failed")
+ else
+ unpackreferences()
+ sorthashes()
+ end
+ names.loaded = true
+ end
+end
+
+local function list_them(mapping,sorted,pattern,t,all)
+ if mapping[pattern] then
+ t[pattern] = mapping[pattern]
+ else
+ for k=1,#sorted do
+ local v = sorted[k]
+ if not t[v] and find(v,pattern) then
+ t[v] = mapping[v]
+ if not all then
+ return
+ end
+ end
+ end
+ end
+end
+
+function names.list(pattern,reload,all) -- here?
+ names.load(reload)
+ if names.loaded then
+ local t = { }
+ local data = names.data
+ if data then
+ local list = filters.list
+ local mappings, sorted_mappings = data.mappings, data.sorted_mappings
+ local fallbacks, sorted_fallbacks = data.fallbacks, data.sorted_fallbacks
+ for i=1,#list do
+ local format = list[i]
+ list_them(mappings[format],sorted_mappings[format],pattern,t,all)
+ if next(t) and not all then
+ return t
+ end
+ list_them(fallbacks[format],sorted_fallbacks[format],pattern,t,all)
+ if next(t) and not all then
+ return t
+ end
+ end
+ end
+ return t
+ end
+end
+
+local reloaded = false
+
+local function is_reloaded()
+ if not reloaded then
+ local data = names.data
+ if names.autoreload then
+ local c_status = table.serialize(resolvers.data_state())
+ local f_status = table.serialize(data.data_state)
+ if c_status == f_status then
+ -- logs.report("fonts","font database matches configuration and file hashes")
+ return
+ else
+ logs.report("fonts","font database does not match configuration and file hashes")
+ end
+ end
+ names.loaded = false
+ reloaded = true
+ io.flush()
+ names.load(true)
+ end
+end
+
+--[[ldx--
+<p>The resolver also checks if the cached names are loaded. Being clever
+here is for testing purposes only (it deals with names prefixed by an
+encoding name).</p>
+--ldx]]--
+
+local function fuzzy(mapping,sorted,name,sub)
+ local condensed = gsub(name,"[^%a%d]","")
+ for k=1,#sorted do
+ local v = sorted[k]
+ if find(v,condensed) then
+ return mapping[v], v
+ end
+ end
+end
+
+-- we could cache a lookup .. maybe some day ... (only when auto loaded!)
+
+local function foundname(name,sub) -- sub is not used currently
+ local data = names.data
+ local mappings, sorted_mappings = data.mappings, data.sorted_mappings
+ local fallbacks, sorted_fallbacks = data.fallbacks, data.sorted_fallbacks
+ local list = filters.list
+ -- dilemma: we lookup in the order otf ttf ttc ... afm but now an otf fallback
+ -- can come after an afm match ... well, one should provide nice names anyway
+ -- and having two lists is not an option
+ for i=1,#list do
+ local l = list[i]
+ local found = mappings[l][name]
+ if found then
+ if trace_names then
+ logs.report("fonts","resolved via direct name match: '%s'",name)
+ end
+ return found
+ end
+ end
+ for i=1,#list do
+ local l = list[i]
+ local found, fname = fuzzy(mappings[l],sorted_mappings[l],name,sub)
+ if found then
+ if trace_names then
+ logs.report("fonts","resolved via fuzzy name match: '%s' => '%s'",name,fname)
+ end
+ return found
+ end
+ end
+ for i=1,#list do
+ local l = list[i]
+ local found = fallbacks[l][name]
+ if found then
+ if trace_names then
+ logs.report("fonts","resolved via direct fallback match: '%s'",name)
+ end
+ return found
+ end
+ end
+ for i=1,#list do
+ local l = list[i]
+ local found, fname = fuzzy(sorted_mappings[l],sorted_fallbacks[l],name,sub)
+ if found then
+ if trace_names then
+ logs.report("fonts","resolved via fuzzy fallback match: '%s' => '%s'",name,fname)
+ end
+ return found
+ end
+ end
+end
+
+function names.resolvedspecification(askedname,sub)
+ if askedname and askedname ~= "" and names.enabled then
+ askedname = cleanname(askedname)
+ names.load()
+ local found = foundname(askedname,sub)
+ if not found and is_reloaded() then
+ found = foundname(askedname,sub)
+ end
+ return found
+ end
+end
+
+function names.resolve(askedname,sub)
+ local found = names.resolvedspecification(askedname,sub)
+ if found then
+ return found.filename, found.subfont and found.rawname
+ end
+end
+
+-- specified search
+
+local function s_collect_weight_style_width_variant(found,done,all,weight,style,width,variant,family)
+ if family then
+ for i=1,#family do
+ local f = family[i]
+ if f and weight == f.weight and style == f.style and width == f.width and variant == f.variant then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect_weight_style_width_variant(found,done,all,weight,style,width,variant,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and weight == f.weight and style == f.style and width == f.width and variant == f.variant and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function s_collect_weight_style_width(found,done,all,weight,style,width,family)
+ if family then
+ for i=1,#family do
+ local f = family[i]
+ if f and weight == f.weight and style == f.style and width == f.width then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect_weight_style_width(found,done,all,weight,style,width,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and weight == f.weight and style == f.style and width == f.width and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function s_collect_weight_style(found,done,all,weight,style,family)
+ if family then
+ for i=1,#family do local f = family[i]
+ if f and weight == f.weight and style == f.style then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect_weight_style(found,done,all,weight,style,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and weight == f.weight and style == f.style and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function s_collect_style_width(found,done,all,style,width,family)
+ if family then
+ for i=1,#family do local f = family[i]
+ if f and style == f.style and width == f.width then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect_style_width(found,done,all,style,width,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and style == f.style and width == f.width and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function s_collect_weight(found,done,all,weight,family)
+ if family then
+ for i=1,#family do local f = family[i]
+ if f and weight == f.weight then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect_weight(found,done,all,weight,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and weight == f.weight and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function s_collect_style(found,done,all,style,family)
+ if family then
+ for i=1,#family do local f = family[i]
+ if f and style == f.style then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect_style(found,done,all,style,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and style == f.style and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function s_collect_width(found,done,all,width,family)
+ if family then
+ for i=1,#family do local f = family[i]
+ if f and width == f.width then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect_width(found,done,all,width,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and width == f.width and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function s_collect(found,done,all,family)
+ if family then
+ for i=1,#family do local f = family[i]
+ if f then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+local function m_collect(found,done,all,families,sorted,strictname)
+ for i=1,#sorted do
+ local k = sorted[i]
+ local family = families[k]
+ for i=1,#family do
+ local f = family[i]
+ if not done[f] and find(f.fontname,strictname) then
+ found[#found+1], done[f] = f, true
+ if not all then return end
+ end
+ end
+ end
+end
+
+local function collect(stage,found,done,name,weight,style,width,variant,all)
+ local data = names.data
+ local families, sorted = data.families, data.sorted_families
+ strictname = "^".. name -- to be checked
+ local family = families[name]
+ if trace_names then
+ logs.report("fonts","resolving name '%s', weight '%s', style '%s', width '%s', variant '%s'",
+ name or "?",tostring(weight),tostring(style),tostring(width),tostring(variant))
+ end
+ --~ print(name,table.serialize(family))
+ if weight and weight ~= "" then
+ if style and style ~= "" then
+ if width and width ~= "" then
+ if variant and variant ~= "" then
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s', weight '%s', style '%s', width '%s', variant '%s'",stage,name,weight,style,width,variant)
+ end
+ s_collect_weight_style_width_variant(found,done,all,weight,style,width,variant,family)
+ m_collect_weight_style_width_variant(found,done,all,weight,style,width,variant,families,sorted,strictname)
+ else
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s', weight '%s', style '%s', width '%s'",stage,name,weight,style,width)
+ end
+ s_collect_weight_style_width(found,done,all,weight,style,width,family)
+ m_collect_weight_style_width(found,done,all,weight,style,width,families,sorted,strictname)
+ end
+ else
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s', weight '%s', style '%s'",stage,name,weight,style)
+ end
+ s_collect_weight_style(found,done,all,weight,style,family)
+ m_collect_weight_style(found,done,all,weight,style,families,sorted,strictname)
+ end
+ else
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s', weight '%s'",stage,name,weight)
+ end
+ s_collect_weight(found,done,all,weight,family)
+ m_collect_weight(found,done,all,weight,families,sorted,strictname)
+ end
+ elseif style and style ~= "" then
+ if width and width ~= "" then
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s', style '%s', width '%s'",stage,name,style,width)
+ end
+ s_collect_style_width(found,done,all,style,width,family)
+ m_collect_style_width(found,done,all,style,width,families,sorted,strictname)
+ else
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s', style '%s'",stage,name,style)
+ end
+ s_collect_style(found,done,all,style,family)
+ m_collect_style(found,done,all,style,families,sorted,strictname)
+ end
+ elseif width and width ~= "" then
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s', width '%s'",stage,name,width)
+ end
+ s_collect_width(found,done,all,width,family)
+ m_collect_width(found,done,all,width,families,sorted,strictname)
+ else
+ if trace_names then
+ logs.report("fonts","resolving stage %s, name '%s'",stage,name)
+ end
+ s_collect(found,done,all,family)
+ m_collect(found,done,all,families,sorted,strictname)
+ end
+end
+
+function heuristic(name,weight,style,width,variant,all) -- todo: fallbacks
+ local found, done = { }, { }
+--~ print(name,weight,style,width,variant)
+ weight, style, width, variant = weight or "normal", style or "normal", width or "normal", variant or "normal"
+ name = cleanname(name)
+ collect(1,found,done,name,weight,style,width,variant,all)
+ -- still needed ?
+ if #found == 0 and variant ~= "normal" then -- not weight
+ variant = "normal"
+ collect(4,found,done,name,weight,style,width,variant,all)
+ end
+ if #found == 0 and width ~= "normal" then
+ width = "normal"
+ collect(2,found,done,name,weight,style,width,variant,all)
+ end
+ if #found == 0 and weight ~= "normal" then -- not style
+ weight = "normal"
+ collect(3,found,done,name,weight,style,width,variant,all)
+ end
+ if #found == 0 and style ~= "normal" then -- not weight
+ style = "normal"
+ collect(4,found,done,name,weight,style,width,variant,all)
+ end
+ --
+ local nf = #found
+ if trace_names then
+ if nf then
+ local t = { }
+ for i=1,nf do
+ t[#t+1] = format("'%s'",found[i].fontname)
+ end
+ logs.report("fonts","name '%s' resolved to %s instances: %s",name,nf,concat(t," "))
+ else
+ logs.report("fonts","name '%s' unresolved",name)
+ end
+ end
+ if all then
+ return nf > 0 and found
+ else
+ return found[1]
+ end
+end
+
+function names.specification(askedname,weight,style,width,variant,reload,all)
+ if askedname and askedname ~= "" and names.enabled then
+ askedname = lower(askedname) -- or cleanname
+ names.load(reload)
+ local found = heuristic(askedname,weight,style,width,variant,all)
+ if not found and is_reloaded() then
+ found = heuristic(askedname,weight,style,width,variant,all)
+ if not filename then
+ found = foundname(askedname) -- old method
+ end
+ end
+ return found
+ end
+end
+
+function names.collect(askedname,weight,style,width,variant,reload,all)
+ if askedname and askedname ~= "" and names.enabled then
+ askedname = lower(askedname) -- or cleanname
+ names.load(reload)
+ local list = heuristic(askedname,weight,style,width,variant,true)
+ if not list or #list == 0 and is_reloaded() then
+ list = heuristic(askedname,weight,style,width,variant,true)
+ end
+ return list
+ end
+end
+
+function names.collectspec(askedname,reload,all)
+ local name, weight, style, width, variant = names.splitspec(askedname)
+ return names.collect(name,weight,style,width,variant,reload,all)
+end
+
+function names.resolvespec(askedname,sub)
+ local found = names.specification(names.splitspec(askedname))
+ if found then
+ return found.filename, found.subfont and found.rawname
+ end
+end
+
+function names.collectfiles(askedname,reload) -- no all
+ if askedname and askedname ~= "" and names.enabled then
+ askedname = lower(askedname) -- or cleanname
+ names.load(reload)
+ local list = { }
+ local basename = file.basename
+ local specifications = names.data.specifications
+ for i=1,#specifications do
+ local s = specifications[i]
+ if find(lower(basename(s.filename)),askedname) then
+ list[#list+1] = s
+ end
+ end
+ return list
+ end
+end
+
+--[[ldx--
+<p>Fallbacks, not permanent but a transition thing.</p>
+--ldx]]--
+
+names.new_to_old = {
+ ["lmroman10-capsregular"] = "lmromancaps10-oblique",
+ ["lmroman10-capsoblique"] = "lmromancaps10-regular",
+ ["lmroman10-demi"] = "lmromandemi10-oblique",
+ ["lmroman10-demioblique"] = "lmromandemi10-regular",
+ ["lmroman8-oblique"] = "lmromanslant8-regular",
+ ["lmroman9-oblique"] = "lmromanslant9-regular",
+ ["lmroman10-oblique"] = "lmromanslant10-regular",
+ ["lmroman12-oblique"] = "lmromanslant12-regular",
+ ["lmroman17-oblique"] = "lmromanslant17-regular",
+ ["lmroman10-boldoblique"] = "lmromanslant10-bold",
+ ["lmroman10-dunhill"] = "lmromandunh10-oblique",
+ ["lmroman10-dunhilloblique"] = "lmromandunh10-regular",
+ ["lmroman10-unslanted"] = "lmromanunsl10-regular",
+ ["lmsans10-demicondensed"] = "lmsansdemicond10-regular",
+ ["lmsans10-demicondensedoblique"] = "lmsansdemicond10-oblique",
+ ["lmsansquotation8-bold"] = "lmsansquot8-bold",
+ ["lmsansquotation8-boldoblique"] = "lmsansquot8-boldoblique",
+ ["lmsansquotation8-oblique"] = "lmsansquot8-oblique",
+ ["lmsansquotation8-regular"] = "lmsansquot8-regular",
+ ["lmtypewriter8-regular"] = "lmmono8-regular",
+ ["lmtypewriter9-regular"] = "lmmono9-regular",
+ ["lmtypewriter10-regular"] = "lmmono10-regular",
+ ["lmtypewriter12-regular"] = "lmmono12-regular",
+ ["lmtypewriter10-italic"] = "lmmono10-italic",
+ ["lmtypewriter10-oblique"] = "lmmonoslant10-regular",
+ ["lmtypewriter10-capsoblique"] = "lmmonocaps10-oblique",
+ ["lmtypewriter10-capsregular"] = "lmmonocaps10-regular",
+ ["lmtypewriter10-light"] = "lmmonolt10-regular",
+ ["lmtypewriter10-lightoblique"] = "lmmonolt10-oblique",
+ ["lmtypewriter10-lightcondensed"] = "lmmonoltcond10-regular",
+ ["lmtypewriter10-lightcondensedoblique"] = "lmmonoltcond10-oblique",
+ ["lmtypewriter10-dark"] = "lmmonolt10-bold",
+ ["lmtypewriter10-darkoblique"] = "lmmonolt10-boldoblique",
+ ["lmtypewritervarwd10-regular"] = "lmmonoproplt10-regular",
+ ["lmtypewritervarwd10-oblique"] = "lmmonoproplt10-oblique",
+ ["lmtypewritervarwd10-light"] = "lmmonoprop10-regular",
+ ["lmtypewritervarwd10-lightoblique"] = "lmmonoprop10-oblique",
+ ["lmtypewritervarwd10-dark"] = "lmmonoproplt10-bold",
+ ["lmtypewritervarwd10-darkoblique"] = "lmmonoproplt10-boldoblique",
+}
+
+names.old_to_new = table.swapped(names.new_to_old)
+
+function names.exists(name)
+ local found = false
+ local list = filters.list
+ for k=1,#list do
+ local v = list[k]
+ found = (resolvers.find_file(name,v) or "") ~= ""
+ if found then
+ return found
+ end
+ end
+ return ((resolvers.find_file(name,"tfm") or "") ~= "") or ((names.resolve(name) or "") ~= "")
+end
+
+-- for i=1,fonts.names.lookup(pattern) do
+-- texio.write_nl(fonts.names.getkey("filename",i))
+-- end
+
+local lastlookups, lastpattern = { }, ""
+
+function names.lookup(pattern,name,reload) -- todo: find
+ if lastpattern ~= pattern then
+ names.load(reload)
+ local specifications = names.data.specifications
+ local families = names.data.families
+ local lookups = specifications
+ if name then
+ lookups = families[name]
+ elseif not find(pattern,"=") then
+ lookups = families[pattern]
+ end
+ if trace_names then
+ logs.report("fonts","starting with %s lookups for '%s'",#lookups,pattern)
+ end
+ if lookups then
+ for key, value in gmatch(pattern,"([^=,]+)=([^=,]+)") do
+ local t = { }
+ for i=1,#lookups do
+ local s = lookups[i]
+ if s[key] == value then
+ t[#t+1] = lookups[i]
+ end
+ end
+ if trace_names then
+ logs.report("fonts","%s matches for key '%s' with value '%s'",#t,key,value)
+ end
+ lookups = t
+ end
+ end
+ lastpattern = pattern
+ lastlookups = lookups or { }
+ end
+ return #lastlookups
+end
+
+function names.getlookupkey(key,n)
+ local l = lastlookups[n or 1]
+ return (l and l[key]) or ""
+end
+
+function names.noflookups()
+ return #lastlookups
+end
+
+function names.getlookups(pattern,name,reload)
+ if pattern then
+ names.lookup(pattern,name,reload)
+ end
+ return lastlookups
+end
+
+function table.formatcolumns(result)
+ if result and #result > 0 then
+ local widths = { }
+ local first = result[1]
+ local n = #first
+ for i=1,n do
+ widths[i] = 0
+ end
+ for i=1,#result do
+ local r = result[i]
+ for j=1,n do
+ local w = #r[j]
+ if w > widths[j] then
+ widths[j] = w
+ end
+ end
+ end
+ for i=1,n do
+ widths[i] = "%-" .. widths[i] .. "s"
+ end
+ local template = concat(widths," ")
+ for i=1,#result do
+ local str = format(template,unpack(result[i]))
+ result[i] = string.strip(str)
+ end
+ end
+ return result
+end
diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua
new file mode 100644
index 000000000..31ae2cae1
--- /dev/null
+++ b/tex/context/base/font-tfm.lua
@@ -0,0 +1,736 @@
+if not modules then modules = { } end modules ['font-tfm'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local next, format, match, lower, gsub = next, string.format, string.match, string.lower, string.gsub
+local concat, sortedkeys, utfbyte, serialize = table.concat, table.sortedkeys, utf.byte, table.serialize
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_scaling = false trackers.register("fonts.scaling" , function(v) trace_scaling = v end)
+
+-- tfmdata has also fast access to indices and unicodes
+-- to be checked: otf -> tfm -> tfmscaled
+--
+-- watch out: no negative depths and negative eights permitted in regular fonts
+
+--[[ldx--
+<p>Here we only implement a few helper functions.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+
+local tfm = fonts.tfm
+
+fonts.loaded = fonts.loaded or { }
+fonts.dontembed = fonts.dontembed or { }
+fonts.triggers = fonts.triggers or { } -- brrr
+fonts.initializers = fonts.initializers or { }
+fonts.initializers.common = fonts.initializers.common or { }
+
+local fontdata = fonts.ids
+local disc = node.id('disc')
+local glyph = node.id('glyph')
+local set_attribute = node.set_attribute
+
+--[[ldx--
+<p>The next function encapsulates the standard <l n='tfm'/> loader as
+supplied by <l n='luatex'/>.</p>
+--ldx]]--
+
+tfm.resolve_vf = true -- false
+tfm.share_base_kerns = false -- true (.5 sec slower on mk but brings down mem from 410M to 310M, beware: then script/lang share too)
+tfm.mathactions = { }
+tfm.fontname_mode = "fullpath"
+
+tfm.enhance = tfm.enhance or function() end
+
+function tfm.read_from_tfm(specification)
+ local fname, tfmdata = specification.filename or "", nil
+ if fname ~= "" then
+ if trace_defining then
+ logs.report("define font","loading tfm file %s at size %s",fname,specification.size)
+ 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 = resolvers.findbinfile(specification.name, 'ovf')
+ if fname and fname ~= "" then
+ local vfdata = font.read_vf(fname,specification.size) -- not cached, fast enough
+ if vfdata then
+ local chars = tfmdata.characters
+ for k,v in next, vfdata.characters do
+ chars[k].commands = v.commands
+ end
+ tfmdata.type = 'virtual'
+ tfmdata.fonts = vfdata.fonts
+ end
+ end
+ end
+ tfm.enhance(tfmdata,specification)
+ end
+ elseif trace_defining then
+ logs.report("define font","loading tfm with name %s fails",specification.name)
+ end
+ return tfmdata
+end
+
+--[[ldx--
+<p>We need to normalize the scale factor (in scaled points). This has to
+do with the fact that <l n='tex'/> uses a negative multiple of 1000 as
+a signal for a font scaled based on the design size.</p>
+--ldx]]--
+
+local factors = {
+ pt = 65536.0,
+ bp = 65781.8,
+}
+
+function tfm.setfactor(f)
+ tfm.factor = factors[f or 'pt'] or factors.pt
+end
+
+tfm.setfactor()
+
+function tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as well
+ if scaledpoints < 0 then
+ if designsize then
+ if designsize > tfm.factor then -- or just 1000 / when? mp?
+ return (- scaledpoints/1000) * designsize -- sp's
+ else
+ return (- scaledpoints/1000) * designsize * tfm.factor
+ end
+ else
+ return (- scaledpoints/1000) * 10 * tfm.factor
+ end
+ else
+ return scaledpoints
+ end
+end
+
+--[[ldx--
+<p>Before a font is passed to <l n='tex'/> we scale it. Here we also need
+to scale virtual characters.</p>
+--ldx]]--
+
+function tfm.get_virtual_id(tfmdata)
+ -- since we don't know the id yet, we use 0 as signal
+ if not tfmdata.fonts then
+ tfmdata.type = "virtual"
+ tfmdata.fonts = { { id = 0 } }
+ return 1
+ else
+ tfmdata.fonts[#tfmdata.fonts+1] = { id = 0 }
+ return #tfmdata.fonts
+ end
+end
+
+function tfm.check_virtual_id(tfmdata, id)
+ if tfmdata and tfmdata.type == "virtual" then
+ if not tfmdata.fonts or #tfmdata.fonts == 0 then
+ tfmdata.type, tfmdata.fonts = "real", nil
+ else
+ local vfonts = tfmdata.fonts
+ for f=1,#vfonts do
+ local fnt = vfonts[f]
+ if fnt.id and fnt.id == 0 then
+ fnt.id = id
+ end
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>Beware, the boundingbox is passed as reference so we may not overwrite it
+in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to
+excessive memory usage in CJK fonts, we no longer pass the boundingbox.)</p>
+--ldx]]--
+
+fonts.trace_scaling = false
+
+-- the following hack costs a bit of runtime but safes memory
+--
+-- basekerns are scaled and will be hashed by table id
+-- sharedkerns are unscaled and are be hashed by concatenated indexes
+
+--~ function tfm.check_base_kerns(tfmdata)
+--~ if tfm.share_base_kerns then
+--~ local sharedkerns = tfmdata.sharedkerns
+--~ if sharedkerns then
+--~ local basekerns = { }
+--~ tfmdata.basekerns = basekerns
+--~ return sharedkerns, basekerns
+--~ end
+--~ end
+--~ return nil, nil
+--~ end
+
+--~ function tfm.prepare_base_kerns(tfmdata)
+--~ if tfm.share_base_kerns and not tfmdata.sharedkerns then
+--~ local sharedkerns = { }
+--~ tfmdata.sharedkerns = sharedkerns
+--~ for u, chr in next, tfmdata.characters do
+--~ local kerns = chr.kerns
+--~ if kerns then
+--~ local hash = concat(sortedkeys(kerns), " ")
+--~ local base = sharedkerns[hash]
+--~ if not base then
+--~ sharedkerns[hash] = kerns
+--~ else
+--~ chr.kerns = base
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+-- we can have cache scaled characters when we are in node mode and don't have
+-- protruding and expansion: hash == fullname @ size @ protruding @ expansion
+-- but in practice (except from mk) the otf hash will be enough already so it
+-- makes no sense to mess up the code now
+
+local charactercache = { }
+
+-- The scaler is only used for otf and afm and virtual fonts. If
+-- a virtual font has italic correction make sure to set the
+-- has_italic flag. Some more flags will be added in the future.
+
+function tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
+ if scaledpoints < 0 then
+ scaledpoints = (- scaledpoints/1000) * tfmtable.designsize -- already in sp
+ end
+ local units = tfmtable.units or 1000
+ local delta = scaledpoints/units -- brr, some open type fonts have 2048
+ return scaledpoints, delta, units
+end
+
+function tfm.do_scale(tfmtable, scaledpoints, relativeid)
+ -- tfm.prepare_base_kerns(tfmtable) -- optimalization
+ local t = { } -- the new table
+ local scaledpoints, delta, units = tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
+ t.units_per_em = units or 1000
+ local hdelta, vdelta = delta, delta
+ -- unicoded unique descriptions shared cidinfo characters changed parameters indices
+ for k,v in next, tfmtable do
+ if type(v) == "table" then
+ -- print(k)
+ else
+ t[k] = v
+ end
+ end
+ local extend_factor = tfmtable.extend_factor or 0
+ if extend_factor ~= 0 and extend_factor ~= 1 then
+ hdelta = hdelta * extend_factor
+ t.extend = extend_factor * 1000
+ else
+ t.extend = 1000
+ end
+ local slant_factor = tfmtable.slant_factor or 0
+ if slant_factor ~= 0 then
+ t.slant = slant_factor * 1000
+ else
+ t.slant = 0
+ end
+ -- status
+ local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized
+ local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil)
+ local nodemode = tfmtable.mode == "node"
+ local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude
+ local hasitalic = tfmtable.has_italic
+ --
+ t.parameters = { }
+ t.characters = { }
+ t.MathConstants = { }
+ -- fast access
+ local descriptions = tfmtable.descriptions or { }
+ t.unicodes = tfmtable.unicodes
+ t.indices = tfmtable.indices
+ t.marks = tfmtable.marks
+t.goodies = tfmtable.goodies
+t.colorscheme = tfmtable.colorscheme
+--~ t.embedding = tfmtable.embedding
+ t.descriptions = descriptions
+ if tfmtable.fonts then
+ t.fonts = table.fastcopy(tfmtable.fonts) -- hm also at the end
+ end
+ local tp = t.parameters
+ local mp = t.math_parameters
+ local tfmp = tfmtable.parameters -- let's check for indexes
+ --
+ tp.slant = (tfmp.slant or tfmp[1] or 0)
+ tp.space = (tfmp.space or tfmp[2] or 0)*hdelta
+ tp.space_stretch = (tfmp.space_stretch or tfmp[3] or 0)*hdelta
+ tp.space_shrink = (tfmp.space_shrink or tfmp[4] or 0)*hdelta
+ tp.x_height = (tfmp.x_height or tfmp[5] or 0)*vdelta
+ tp.quad = (tfmp.quad or tfmp[6] or 0)*hdelta
+ tp.extra_space = (tfmp.extra_space or tfmp[7] or 0)*hdelta
+ local protrusionfactor = (tp.quad ~= 0 and 1000/tp.quad) or 0
+ local tc = t.characters
+ local characters = tfmtable.characters
+ local nameneeded = not tfmtable.shared.otfdata --hack
+ local changed = tfmtable.changed or { } -- for base mode
+ local ischanged = changed and next(changed)
+ local indices = tfmtable.indices
+ local luatex = tfmtable.luatex
+ local tounicode = luatex and luatex.tounicode
+ local defaultwidth = luatex and luatex.defaultwidth or 0
+ local defaultheight = luatex and luatex.defaultheight or 0
+ local defaultdepth = luatex and luatex.defaultdepth or 0
+ -- experimental, sharing kerns (unscaled and scaled) saves memory
+ -- local sharedkerns, basekerns = tfm.check_base_kerns(tfmtable)
+ -- loop over descriptions (afm and otf have descriptions, tfm not)
+ -- there is no need (yet) to assign a value to chr.tonunicode
+ local scaledwidth = defaultwidth * hdelta
+ local scaledheight = defaultheight * vdelta
+ local scaleddepth = defaultdepth * vdelta
+ local stackmath = tfmtable.ignore_stack_math ~= true
+ local private = fonts.private
+ local sharedkerns = { }
+ for k,v in next, characters do
+ local chr, description, index
+ if ischanged then
+ -- basemode hack
+ local c = changed[k]
+ if c then
+ description = descriptions[c] or v
+ v = characters[c] or v
+ index = (indices and indices[c]) or c
+ else
+ description = descriptions[k] or v
+ index = (indices and indices[k]) or k
+ end
+ else
+ description = descriptions[k] or v
+ index = (indices and indices[k]) or k
+ end
+ local width = description.width
+ local height = description.height
+ local depth = description.depth
+ if width then width = hdelta*width else width = scaledwidth end
+ if height then height = vdelta*height else height = scaledheight end
+ -- if depth then depth = vdelta*depth else depth = scaleddepth end
+ if depth and depth ~= 0 then
+ depth = delta*depth
+ if nameneeded then
+ chr = {
+ name = description.name,
+ index = index,
+ height = height,
+ depth = depth,
+ width = width,
+ }
+ else
+ chr = {
+ index = index,
+ height = height,
+ depth = depth,
+ width = width,
+ }
+ end
+ else
+ -- this saves a little bit of memory time and memory, esp for big cjk fonts
+ if nameneeded then
+ chr = {
+ name = description.name,
+ index = index,
+ height = height,
+ width = width,
+ }
+ else
+ chr = {
+ index = index,
+ height = height,
+ width = width,
+ }
+ end
+ end
+ -- if trace_scaling then
+ -- logs.report("define font","t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-')
+ -- end
+ if tounicode then
+ local tu = tounicode[index] -- nb: index!
+ if tu then
+ chr.tounicode = tu
+ end
+ end
+ if hasquality then
+ -- we could move these calculations elsewhere (saves calculations)
+ local ve = v.expansion_factor
+ if ve then
+ chr.expansion_factor = ve*1000 -- expansionfactor, hm, can happen elsewhere
+ end
+ local vl = v.left_protruding
+ if vl then
+ chr.left_protruding = protrusionfactor*width*vl
+ end
+ local vr = v.right_protruding
+ if vr then
+ chr.right_protruding = protrusionfactor*width*vr
+ end
+ end
+ -- todo: hasitalic
+ if hasitalic then
+ local vi = description.italic or v.italic
+ if vi and vi ~= 0 then
+ chr.italic = vi*hdelta
+ end
+ end
+ -- to be tested
+ if hasmath then
+ -- todo, just operate on descriptions.math
+ local vn = v.next
+ if vn then
+ chr.next = vn
+ else
+ local vv = v.vert_variants
+ if vv then
+ local t = { }
+ for i=1,#vv do
+ local vvi = vv[i]
+ t[i] = {
+ ["start"] = (vvi["start"] or 0)*vdelta,
+ ["end"] = (vvi["end"] or 0)*vdelta,
+ ["advance"] = (vvi["advance"] or 0)*vdelta,
+ ["extender"] = vvi["extender"],
+ ["glyph"] = vvi["glyph"],
+ }
+ end
+ chr.vert_variants = t
+ --~ local ic = v.vert_italic_correction
+ --~ if ic then
+ --~ chr.italic = ic * hdelta
+ --~ print(format("0x%05X -> %s",k,chr.italic))
+ --~ end
+ else
+ local hv = v.horiz_variants
+ if hv then
+ local t = { }
+ for i=1,#hv do
+ local hvi = hv[i]
+ t[i] = {
+ ["start"] = (hvi["start"] or 0)*hdelta,
+ ["end"] = (hvi["end"] or 0)*hdelta,
+ ["advance"] = (hvi["advance"] or 0)*hdelta,
+ ["extender"] = hvi["extender"],
+ ["glyph"] = hvi["glyph"],
+ }
+ end
+ chr.horiz_variants = t
+ end
+ end
+ end
+ local vt = description.top_accent
+ if vt then
+ chr.top_accent = vdelta*vt
+ end
+ if stackmath then
+ local mk = v.mathkerns
+ if mk then
+ local kerns = { }
+ local v = mk.top_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.top_right = k end
+ local v = mk.top_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.top_left = k end
+ local v = mk.bottom_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.bottom_left = k end
+ local v = mk.bottom_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.bottom_right = k end
+ chr.mathkern = kerns -- singular
+ end
+ end
+ end
+ if not nodemode then
+ local vk = v.kerns
+ if vk then
+ --~ if sharedkerns then
+ --~ local base = basekerns[vk] -- hashed by table id, not content
+ --~ if not base then
+ --~ base = {}
+ --~ for k,v in next, vk do base[k] = v*hdelta end
+ --~ basekerns[vk] = base
+ --~ end
+ --~ chr.kerns = base
+ --~ else
+ --~ local tt = {}
+ --~ for k,v in next, vk do tt[k] = v*hdelta end
+ --~ chr.kerns = tt
+ --~ end
+ local s = sharedkerns[vk]
+ if not s then
+ s = { }
+ for k,v in next, vk do s[k] = v*hdelta end
+ sharedkerns[vk] = s
+ end
+ chr.kerns = s
+ end
+ local vl = v.ligatures
+ if vl then
+ if true then
+ chr.ligatures = vl -- shared
+ else
+ local tt = { }
+ for i,l in next, vl do
+ tt[i] = l
+ end
+ chr.ligatures = tt
+ end
+ end
+ end
+ if isvirtual then
+ local vc = v.commands
+ if vc then
+ -- we assume non scaled commands here
+ -- tricky .. we need to scale pseudo math glyphs too
+ -- which is why we deal with rules too
+ local ok = false
+ for i=1,#vc do
+ local key = vc[i][1]
+ if key == "right" or key == "down" then
+ ok = true
+ break
+ end
+ end
+ if ok then
+ local tt = { }
+ for i=1,#vc do
+ local ivc = vc[i]
+ local key = ivc[1]
+ if key == "right" then
+ tt[#tt+1] = { key, ivc[2]*hdelta }
+ elseif key == "down" then
+ tt[#tt+1] = { key, ivc[2]*vdelta }
+ elseif key == "rule" then
+ tt[#tt+1] = { key, ivc[2]*vdelta, ivc[3]*hdelta }
+ else -- not comment
+ tt[#tt+1] = ivc -- shared since in cache and untouched
+ end
+ end
+ chr.commands = tt
+ else
+ chr.commands = vc
+ end
+ end
+ end
+ tc[k] = chr
+ end
+ -- t.encodingbytes, t.filename, t.fullname, t.name: elsewhere
+ t.size = scaledpoints
+ t.factor = delta
+ t.hfactor = hdelta
+ t.vfactor = vdelta
+ if t.fonts then
+ t.fonts = table.fastcopy(t.fonts) -- maybe we virtualize more afterwards
+ end
+ if hasmath then
+ -- mathematics.extras.copy(t) -- can be done elsewhere if needed
+ local ma = tfm.mathactions
+ for i=1,#ma do
+ ma[i](t,tfmtable,delta,hdelta,vdelta) -- what delta?
+ end
+ end
+ -- needed for \high cum suis
+ local tpx = tp.x_height
+ if hasmath then
+ if not tp[13] then tp[13] = .86*tpx end -- mathsupdisplay
+ if not tp[14] then tp[14] = .86*tpx end -- mathsupnormal
+ if not tp[15] then tp[15] = .86*tpx end -- mathsupcramped
+ if not tp[16] then tp[16] = .48*tpx end -- mathsubnormal
+ if not tp[17] then tp[17] = .48*tpx end -- mathsubcombined
+ if not tp[22] then tp[22] = 0 end -- mathaxisheight
+ if t.MathConstants then t.MathConstants.AccentBaseHeight = nil end -- safeguard
+ end
+ t.tounicode = 1
+ t.cidinfo = tfmtable.cidinfo
+ -- we have t.name=metricfile and t.fullname=RealName and t.filename=diskfilename
+ -- when collapsing fonts, luatex looks as both t.name and t.fullname as ttc files
+ -- can have multiple subfonts
+ if hasmath then
+ if trace_defining then
+ logs.report("define font","math enabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+ end
+ else
+ if trace_defining then
+ logs.report("define font","math disabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+ end
+ t.nomath, t.MathConstants = true, nil
+ end
+ if not t.psname then
+ -- name used in pdf file as well as for selecting subfont in ttc/dfont
+ t.psname = t.fontname or (t.fullname and fonts.names.cleanname(t.fullname))
+ end
+ if trace_defining then
+ logs.report("define font","used for accesing subfont: '%s'",t.psname or "nopsname")
+ logs.report("define font","used for subsetting: '%s'",t.fontname or "nofontname")
+ end
+--~ print(t.fontname,table.serialize(t.MathConstants))
+ return t, delta
+end
+
+--[[ldx--
+<p>The reason why the scaler is split, is that for a while we experimented
+with a helper function. However, in practice the <l n='api'/> calls are too slow to
+make this profitable and the <l n='lua'/> based variant was just faster. A days
+wasted day but an experience richer.</p>
+--ldx]]--
+
+tfm.auto_cleanup = true
+
+local lastfont = nil
+
+-- we can get rid of the tfm instance when we have fast access to the
+-- scaled character dimensions at the tex end, e.g. a fontobject.width
+--
+-- flushing the kern and ligature tables from memory saves a lot (only
+-- base mode) but it complicates vf building where the new characters
+-- demand this data .. solution: functions that access them
+
+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 tfmdata.type == 'virtual' or tfmdata.virtualized then
+ for k, v in next, tfmdata.characters do
+ if v.commands then v.commands = nil end
+ -- if v.kerns then v.kerns = nil end
+ end
+ else
+ -- for k, v in next, tfmdata.characters do
+ -- if v.kerns then v.kerns = nil end
+ -- end
+ end
+ end
+end
+
+function tfm.cleanup(tfmdata) -- we need a cleanup callback, now we miss the last one
+end
+
+function tfm.scale(tfmtable, scaledpoints, relativeid)
+ local t, factor = tfm.do_scale(tfmtable, scaledpoints, relativeid)
+ t.factor = factor
+ t.ascender = factor*(tfmtable.ascender or 0)
+ t.descender = factor*(tfmtable.descender or 0)
+ t.shared = tfmtable.shared or { }
+ t.unique = table.fastcopy(tfmtable.unique or {})
+--~ print("scaling", t.name, t.factor) -- , tfm.hash_features(tfmtable.specification))
+ tfm.cleanup(t)
+ return t
+end
+
+--[[ldx--
+<p>Analyzers run per script and/or language and are needed in order to
+process features right.</p>
+--ldx]]--
+
+fonts.analyzers = fonts.analyzers or { }
+fonts.analyzers.aux = fonts.analyzers.aux or { }
+fonts.analyzers.methods = fonts.analyzers.methods or { }
+fonts.analyzers.initializers = fonts.analyzers.initializers or { }
+
+-- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
+-- e.g. latin -> hyphenate, arab -> 1/2/3 analyze
+
+-- an example analyzer (should move to font-ota.lua)
+
+local state = attributes.private('state')
+
+function fonts.analyzers.aux.setstate(head,font)
+ 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
+ local id = current.id
+ if id == glyph and current.font == font 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
+ first, last, n = current, current, 1
+ set_attribute(current,state,1) -- init
+ else
+ last, n = current, n+1
+ set_attribute(current,state,2) -- medi
+ end
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ elseif id == disc then
+ -- always in the middle
+ set_attribute(current,state,2) -- midi
+ last = current
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ current = current.next
+ end
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ return head, done
+end
+
+function tfm.replacements(tfm,value)
+ -- tfm.characters[0x0022] = table.fastcopy(tfm.characters[0x201D])
+ -- tfm.characters[0x0027] = table.fastcopy(tfm.characters[0x2019])
+ -- tfm.characters[0x0060] = table.fastcopy(tfm.characters[0x2018])
+ -- tfm.characters[0x0022] = tfm.characters[0x201D]
+ tfm.characters[0x0027] = tfm.characters[0x2019]
+ -- tfm.characters[0x0060] = tfm.characters[0x2018]
+end
+
+-- checking
+
+function tfm.checked_filename(metadata,whatever)
+ local foundfilename = metadata.foundfilename
+ if not foundfilename then
+ local askedfilename = metadata.filename or ""
+ if askedfilename ~= "" then
+ foundfilename = resolvers.findbinfile(askedfilename,"") or ""
+ if foundfilename == "" then
+ logs.report("fonts","source file '%s' is not found",askedfilename)
+ foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or ""
+ if foundfilename ~= "" then
+ logs.report("fonts","using source file '%s' (cache mismatch)",foundfilename)
+ end
+ end
+ elseif whatever then
+ logs.report("fonts","no source file for '%s'",whatever)
+ foundfilename = ""
+ end
+ metadata.foundfilename = foundfilename
+ -- logs.report("fonts","using source file '%s'",foundfilename)
+ end
+ return foundfilename
+end
+
+-- status info
+
+statistics.register("fonts load time", function()
+ return statistics.elapsedseconds(fonts)
+end)
diff --git a/tex/context/base/font-tra.mkiv b/tex/context/base/font-tra.mkiv
new file mode 100644
index 000000000..e47c8c49d
--- /dev/null
+++ b/tex/context/base/font-tra.mkiv
@@ -0,0 +1,113 @@
+%D \module
+%D [ file=font-tra,
+%D version=2009.01.02, % or so
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Tracing,
+%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
+
+%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"))}}
+
+% experimental, maybe this becomes a module
+
+\newbox\otfcollector
+
+\unexpanded\def\startotfcollecting{\ctxlua{nodes.tracers.steppers.start()}}
+\unexpanded\def\stopotfcollecting {\ctxlua{nodes.tracers.steppers.stop()}}
+\def\resetotfcollecting{\ctxlua{nodes.tracers.steppers.reset()}}
+
+% Rather experimental:
+%
+% \page \showotfcomposition{arabtype*arab-default at 48pt}{-1}{الضَّرَّ} \page
+% \page \showotfcomposition{arabtype*arab-default at 48pt}{-1}{لِلّٰهِ} \page
+
+\def\showotfstepglyphs#1%
+ {\ctxlua{nodes.tracers.steppers.glyphs(\number\otfcollector,#1)}%
+ \unhbox\otfcollector}
+
+\def\otfstepcharcommand#1#2% font char
+ {\removeunwantedspaces
+ \hskip.5em plus .125em\relax
+ U+\hexnumber{#2}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}%
+ \hskip.5em plus .125em\relax}
+
+\def\otfstepmessagecommand#1#2%
+ {\begingroup
+ \tttf\language\minusone
+ \veryraggedright
+ \hangindent1em
+ \hangafter\plusone
+ \dontleavehmode\hbox{\detokenize{#1}}\removeunwantedspaces
+ \doifsomething{#2}{\break\detokenize{#2}}\endgraf
+ \endgroup
+ \blank}
+
+\def\showotfstepchars#1%
+ {\ctxlua{nodes.tracers.steppers.codes(#1,\!!bs\detokenize{\otfstepcharcommand}\!!es)}}
+
+\def\showotfstepmessages#1%
+ {\ctxlua{nodes.tracers.steppers.messages(#1,\!!bs\detokenize{\otfstepmessagecommand}\!!es,true)}}
+
+\def\showotfstepfeatures
+ {\ctxlua{nodes.tracers.steppers.features()}}
+
+\def\showotfsteps
+ {\dontleavehmode\bgroup\tttf \language\minusone features: \showotfstepfeatures\egroup
+ \blank
+ \dontleavehmode\bgroup\tttf result:\egroup
+ \blank
+ \startlinecorrection
+ \ruledhbox\bgroup\box\otfcompositionbox\egroup
+ \stoplinecorrection
+ \dorecurse{\ctxlua{nodes.tracers.steppers.nofsteps()}}
+ {\blank
+ \showotfstepmessages\recurselevel
+ \blank
+ \startlinecorrection
+ \dontleavehmode\bgroup\resetallattributes\pardir TLT\textdir TLT\relax\tttf\recurselevel: \showotfstepchars\recurselevel\egroup
+ \stoplinecorrection
+ \blank
+ \startlinecorrection
+ \ruledhbox % can be mode
+ \bgroup\resetallattributes\showotfstepglyphs\recurselevel\egroup % reset is new, we don't want additional processing
+ \stoplinecorrection
+ \blank}}
+
+\unexpanded\def\startotfsample
+ {\enabletrackers[*otf.sample]% beware, kind of global
+ \startotfcollecting
+ \begingroup}
+
+\unexpanded\def\stopotfsample
+ {\endgroup
+ \stopotfcollecting
+ \disabletrackers[*otf.sample]% beware, kind of global: otf.sample
+ \showotfsteps
+ \resetotfcollecting}
+
+\newbox\otfcompositionbox
+
+\def\showotfcomposition#1#2#3% {font*features at size}, rl=-1, text
+ {\begingroup
+ \setupcolors[\c!state=\v!start]% can be option
+ \startotfsample
+ \global\setbox\otfcompositionbox\hbox{\definedfont[#1]\ifnum#2<0 \textdir TRT\else\ifnum#2>0 \textdir TLT\fi\fi\relax#3}%
+ \stopotfsample
+ \endgroup}
+
+\protect \endinput
diff --git a/tex/context/base/font-uni.mkii b/tex/context/base/font-uni.mkii
new file mode 100644
index 000000000..02ab6ce2c
--- /dev/null
+++ b/tex/context/base/font-uni.mkii
@@ -0,0 +1,444 @@
+%D \module
+%D [ file=font-uni,
+%D version=1999.10.10,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=\UNICODE,
+%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 / Unicode}
+
+%D In \XETEX, unicode support is straightforward, so we
+%D simply output a \type {\char} with a 16||bit number.
+
+\ifnum\texengine=\xetexengine
+ \unexpanded\def\uchar#1#2{\char\numexpr#2+#1*\pluscclvi\relax}
+ \let\uc\uchar
+ \expandafter \endinput
+\fi
+
+%D Now comes the more traditional 8 bit \TEX\ hackery.
+
+%D I wrote this module when Wang Lei asked me how to use
+%D Chinese in \CONTEXT. From the samples he sent me, I deduced
+%D that some mixture of one and two byte encoding was used,
+%D which he confirmed. Since \TEX\ normally does not use the
+%D characters $>127$, so as long as the two byte characters
+%D have a first character with code $>127$, we can use active
+%D characters to handle them. In an optimistic mood, I called
+%D this module the \UNICODE\ font module. In the module that
+%D handles Chinese, we will see that some more interpretation
+%D is involved, which is why the macros handling those
+%D characters look ahead.
+
+\unprotect
+
+%D \macros
+%D {handleunicodeflowglyph, uchar,
+%D handleunicodeglyph, insertunicodeglyph,
+%D unicodeposition, unicodeone, unicodetwo}
+%D
+%D For the moment \UNICODE\ support is rather primitive but
+%D nevertheless effective. The reference to \UNICODE\ is not
+%D entirely correct, since in many cases one will use \quote
+%D {older} mappings, but in principle, \UNICODE\ can be
+%D supported.
+%D
+%D We expect each character to come as two eight bit
+%D characters. Those doubles are handled by making all
+%D characters in the range $>127$ active, so that they can
+%D pick up the next one, and act upon both their values.
+%D Internally only numbers are used. A first implementation
+%D simply internally prefixed the second part of the \UNICODE\
+%D pair with \type {\string} or \type {\char}, but this was
+%D not that handy when it came to testing those values.
+%D Because in principle we are dealing with an encoding, the
+%D making active is handled in \type {enco-uni}.
+%D
+%D There are two commands to handle unicode characters:
+%D
+%D \starttyping
+%D \handleunicodeflowglyph{number}{character}
+%D \uchar{number}{number}
+%D \stoptyping
+%D
+%D The first one can be assigned to an active character, the
+%D second one can be used to directly access a glyph. Both
+%D command call \type {\handleunicodeglyph} that in turn
+%D calls \type {\insertunicodeglyph}. Both can be overruled
+%D in specialized modules. The low level command \type
+%D {\unicodeglyph} can best be left untouched, which is not
+%D so much a problem because there is a hook into this macro:
+%D \type {\unicodecharcommand}.
+%D
+%D In most cases one will redefine \type {\handleunicodeglyph}
+%D in such a way that it identifies special situations first,
+%D takes some actions next, calls \type {\insertunicodeglyph},
+%D if needed with \type {\unicodecharcommand} changed, and
+%D finally does some finishing:
+%D
+%D \starttyping
+%D \def\handleunicodeglyph
+%D {take actions based on \unicodeone-two-position cq. \nextutoken
+%D redefine \unicodecharcommand if needed
+%D expand \insertunicodeglyph
+%D take some final actions}
+%D \stoptyping
+
+\newcount\unicodeposition
+
+%D The multistep approach is needed to pick up the second
+%D token, since this token can have any value and any
+%D catcode.
+
+% the \relax trick prevents eating up the space (needed for
+% korean
+
+\def\handleunicodeflowglyph#1#2%
+ {\begingroup
+ \edef\unicodeone{#1}%
+ \@EA\afterassignment\@EA\dohandleunicodeflowglyph % two redundant ea's
+ \@EA\chardef\@EA\nexttoken\@EA`\string#2\relax}
+
+\def\dohandleunicodeflowglyph\relax
+ {\futurelet\nextutoken\dodohandleunicodeflowglyph}
+
+\def\dodohandleunicodeflowglyph % todo tex (or maybe no longer)
+ {\edef\unicodetwo{\the\nexttoken}%
+ \unicodeposition\numexpr\unicodeone*256+\unicodetwo\relax
+ \handleunicodeglyph
+ \endgroup}
+
+\unexpanded\def\uchar#1#2% use as standalone glyph
+ {\begingroup
+ \edef\unicodeone{#1}%
+ \edef\unicodetwo{#2}%
+ \unicodeposition\numexpr\unicodeone*256+\unicodetwo\relax
+ \handleunicodeglyph
+ \endgroup}
+
+\let\nextutoken\relax
+
+\unexpanded\def\lookaheaduchar#1#2%
+ {\def\dolookaheaduchar{\uchar{#1}{#2}\let\nextutoken\relax}%
+ \futurelet\nextutoken\dolookaheaduchar}
+
+\def\dohandleucflowglyph
+ {\unicodeposition\numexpr\unicodeone*256+\unicodetwo\relax
+ \handleunicodeglyph
+ \endgroup}
+
+\unexpanded\def\uc#1#2% used in tricky situations
+ {\begingroup
+ \edef\unicodeone{#1}%
+ \edef\unicodetwo{#2}%
+ \futurelet\nextutoken\dohandleucflowglyph}
+
+\def\insertunicodeglyph
+ {\unicodeglyph\unicodeone\unicodetwo}
+
+\let\handleunicodeglyph\insertunicodeglyph
+
+%D One can use the \type {\unicodeposition} in the macros
+%D that handle pre and post material.
+
+%D \macros
+%D {unicodestyle, unicodecharcommand}
+%D
+%D Each character pair will become one glyph. Because \TEX\
+%D cannot handle fonts with more that 256 characters, we use
+%D \TFM\ files for each range. The first character of the pair
+%D is appended to the name of a font, and the second is used to
+%D access the glyph in that font. This means that a particular
+%D font is split up in subfonts with names in the range:
+%D
+%D \starttyping
+%D <filename>80 ... <filename>ff
+%D \stoptyping
+%D
+%D The \type {<filename>} as well as the composed name are
+%D mapped ones. The next macros take care of this mapping.
+%D Let us assume that the next mapping has taken place,
+%D
+%D \starttyping
+%D \definefontsynonym [UnicodeRegular] [gbsong]
+%D \stoptyping
+%D
+%D Let us also assume that we are dealing with the range \type
+%D {b1}. Given that a font name results from:
+%D
+%D \starttyping
+%D \truefontname{\truefontname{UnicodeRegular}b1}
+%D \stoptyping
+%D
+%D we get \type {gbsongb1}. The outer \type {\truefontname}
+%D takes care of additional mapping, so when we say:
+%D
+%D \starttyping
+%D \definefontsynonym [gbsongb1] [gbsong-b1]
+%D \stoptyping
+%D
+%D the filename used will be \type {gbsong-b1}. From the next
+%D definition it will be clear that other fontshapes are also
+%D supported. The prefix \type {Unicode} is mapped!
+%D
+%D The command \type {\unicodecharcommand} can be used to
+%D handle special cases. At that moment \type {1em} is known.
+
+\def\unicodestyle
+ {\truefontname\s!Unicode\fontstylesuffix}
+
+\let\unicodecharcommand\firstofoneargument
+
+\unexpanded\def\unicodeglyph#1#2% watch the double mapping
+ {\begingroup
+ \getvalue{@@\currentucharmapping\strippedcsname\uchar}{#1}{#2}% map to a to hex font range
+ \bodyfontsize\unicodescale\bodyfontsize
+ % readable:
+ % \doifelsefontsynonym{\unicodestyle\unicodeone}
+ % {\font\unicodefont=\truefontname{\unicodestyle\unicodeone}
+ % at \currentfontscale\bodyfontsize}
+ % {\font\unicodefont=\truefontname{\truefontname\unicodestyle\unicodeone}
+ % at \currentfontscale\bodyfontsize}%
+ % unreadable but more efficient:
+ \font\unicodefont=\truefontname{\doifelsefontsynonym{\unicodestyle
+ \unicodeone}\empty\truefontname\unicodestyle\unicodeone}
+ at \currentfontscale\bodyfontsize
+ \unicodestrut % off by default
+ \unicodefont\unicodecharcommand{\char\unicodetwo\relax}%
+ \endgroup}
+
+%D This handler is used by default, for instance in:
+%D
+%D \starttyping
+%D \defineunicodefont [MySwitch] [MyFont] % [strut=no,command=\insertunicodeglyph]
+%D
+%D \definefontsynonym [MyFontRegular40] [Sans]
+%D \definefontsynonym [MyFontBold40] [SansBold]
+%D
+%D {\MySwitch \uchar{"40}{`a}}
+%D {\MySwitch \bf \uchar{"40}{`a}}
+%D \stoptyping
+%D
+%D \starttyping
+%D \definefontsynonym [MyFontRegular] [Sans]
+%D \definefontsynonym [MyFontBold] [SansBold]
+%D \stoptyping
+%D
+%D Is also possible, but in that case the number is appended to the raw font
+%D name!
+
+%D \macros
+%D {currentucharmapping,defineucharmapping}
+%D
+%D A (plane,char) pair can be remapped using a uchar mapping
+%D function. The default mapping is to convert the plane to a
+%D lowercase hexadecimal number, and leave the number
+%D untouched. The current remapping is kept in a macro.
+
+\let\currentucharmapping\s!default
+
+\def\defineucharmapping#1%
+ {\setvalue{@@#1\strippedcsname\uchar}}
+
+\defineucharmapping{\s!default}#1#2%
+ {\edef\unicodeone{\lchexnumbers{#1}}\edef\unicodetwo{#2}}
+
+%D An example of a remapping is the following:
+%D
+%D \starttyping
+%D \defineucharmapping{GBK}#1#2%
+%D {\unicodeposition=#1
+%D \advance\unicodeposition -129
+%D \multiply\unicodeposition 190
+%D \advance\unicodeposition #2
+%D \advance\unicodeposition-\ifnum#2>127 65\else64\fi
+%D \dorepositionunicode}
+%D \stoptyping
+%D
+%D This maps the GBK vector onto a compact GBK one. The
+%D auxiliary macro is defined here as a goody.
+
+\def\dorepositionunicode
+ {\dosetdivision\unicodeposition{256}\scratchcounter
+ \advance\scratchcounter \plusone
+ \edef\unicodeone{\ifnum\scratchcounter<10 0\fi\the\scratchcounter}%
+ \dosetmodulo\unicodeposition{256}\scratchcounter
+ \edef\unicodetwo{\the\scratchcounter}}
+
+%D \macros
+%D {setunicodestrut, setunicodescale, nextutoken,
+%D handleunicodeglyph, insertunicodeglyph}
+%D
+%D A careful analysis of the previous macros, learns that the
+%D process of mapping comes down to:
+%D
+%D \startitemize[packed,n]
+%D \item taking care of preceding material (and spacing)
+%D \item defining the font at \type {\currentfontscale} $\times$
+%D \type {\unicodescale} $\times$ \type {\bodyfontsize}
+%D \item inserting a \type {\unicodestrut}
+%D \item inserting the character (glyph)
+%D \item executing some actions afterwards
+%D \stopitemize
+%D
+%D The actions before and after placing the glyph, is up to
+%D the user supplied handler. This handler (\type
+%D {\handleunicodeglpyh}) must, at a certain moment, insert
+%D the glyph using \type {\insertunicodeglyph}
+
+\def\setunicodescale#1%
+ {\def\unicodescale{#1}}
+
+\def\dosetunicodestrut#1#2% height depth
+ {\def\unicodestrut
+ {\vrule
+ \!!width \zeropoint
+ \!!height#1\strutht
+ \!!depth #2\strutdp
+ \relax}}
+
+\def\setunicodestrut#1#2% height depth
+ {\ifdim#1\strutht>\zeropoint
+ \dosetunicodestrut{#1}{#2}%
+ \else\ifdim#1\strutdp>\zeropoint
+ \dosetunicodestrut{#1}{#2}%
+ \else
+ \let\unicodestrut\empty
+ \fi\fi}
+
+\def\resetunicodestrut
+ {\let\unicodestrut\empty}
+
+%D The additional scaling and strut default to:
+
+\setunicodescale{1}
+\setunicodestrut{1}{1}
+
+%D But better is not to have a strut added by default:
+
+\resetunicodestrut
+
+%D The actual code for the additional actions as well as
+%D specific spacing is handled outside these routines. The
+%D character after the two that are under treatment is
+%D available in \type {\nextutoken}.
+
+%D \macros
+%D {defineunicodefont, setupunicodefont}
+%D
+%D Apart from this rather low level implementation, we also
+%D provide a more user friendly alternative. Given that one
+%D has defined:
+%D
+%D \starttyping
+%D \defineunicodefont
+%D [SimChi] [SimplifiedChinese]
+%D [\c!scale=0.85,
+%D \c!height=1.25,
+%D \c!depth=1.00,
+%D \c!interlinespaceinterlinie=yes,
+%D \c!conversion=\chinesenumber,
+%D \c!command=\handlechineseunicodeglyph]
+%D \stoptyping
+%D
+%D Together with:
+%D
+%D \starttyping
+%D \definefontsynonym [SimplifiedChineseRegular] [gbsong]
+%D \definefontsynonym [SimplifiedChineseSlanted] [gbsongsl]
+%D \stoptyping
+%D
+%D we can now switch to Simplified Chinese by saying \type
+%D {SimChi}. Some values can be changed afterwards with
+%D
+%D \starttyping
+%D \setupunicodefont[SimChi][...=...]
+%D \stoptyping
+%D
+%D Specific initializations can be assigned to \type
+%D {commands}.
+
+\def\defineunicodefont
+ {\dotripleempty\dodefineunicodefont}
+
+\def\dodefineunicodefont[#1][#2][#3]%
+ {\doifassignmentelse{#3}
+ {\setupunicodefont[#1][#3]}
+ {\doifelsenothing{#3}
+ {\setupunicodefont[#1][#3]}
+ {\copyparameters
+ [\??uc#1][\??uc#3]
+ [\c!height,\c!depth,\c!scale,\c!commands,\c!strut,
+ \c!interlinespace,\c!command,\c!conversion]}}%
+ \doifelsenothing{#2}
+ {\setvalue{#1}{[uc font #1 undefined]}}
+ {\setvalue{\??uc#1\c!file}{#2}%
+ \doifundefined{\??ff#2\s!Bold}
+ {\definefontsynonym[#2\s!Bold] [#2\s!Regular]%
+ \definefontsynonym[#2\s!Slanted] [#2\s!Regular]%
+ \definefontsynonym[#2\s!Italic] [#2\s!Regular]%
+ \definefontsynonym[#2\s!BoldSlanted][#2\s!Slanted]%
+ \definefontsynonym[#2\s!BoldItalic] [#2\s!Italic]}%
+ \unexpanded\setvalue{#1}{\enableunicodefont{#1}}}}
+
+\def\setupunicodefont
+ {\dodoubleempty\dosetupunicodefont}
+
+\def\dosetupunicodefont[#1][#2]% also predefines
+ {\doifundefined{\??uc#1\c!command}
+ {\copyparameters
+ [\??uc#1][\??uc\s!default]
+ [\c!height,\c!depth,\c!scale,\c!commands,\v!strut,
+ \c!interlinespace,\c!command,\c!conversion]}%
+ \getparameters[\??uc#1][#2]}
+
+\def\enableunicodefont#1%
+ {\definefontsynonym[\s!Unicode][\getvalue{\??uc#1\c!file}]%
+ \def\unicodescale {\getvalue{\??uc#1\c!scale}}%
+ \def\unicodeheight {\getvalue{\??uc#1\c!height}}%
+ \def\unicodedepth {\getvalue{\??uc#1\c!depth}}%
+ \def\unicodedigits {\getvalue{\??uc#1\c!conversion}}%
+ \def\handleunicodeglyph {\getvalue{\??uc#1\c!command}}%
+ \doifnot\currentregime{utf}{\enableregime[unicode]}%
+ % the following \relax's are realy needed
+ \doifvalue{\??uc#1\c!interlinespace}\v!yes
+ \setupinterlinespace\relax
+ \doifelsevalue{\??uc#1\c!strut}\v!yes
+ {\setunicodestrut\unicodeheight\unicodedepth}
+ {\resetunicodestrut}%
+ \getvalue{\??uc#1\c!commands}\relax}
+
+%D \macros
+%D {unicodedigits}
+%D
+%D For convenience we also predefine a number conversion
+%D macro:
+
+\let\unicodedigits\number
+
+%D Because we cannot be sure of the pressence of all font
+%D styles, we remap some by default.
+
+\definefontsynonym [\s!Unicode\s!Bold] [\s!Unicode\s!Regular]
+\definefontsynonym [\s!Unicode\s!Slanted] [\s!Unicode\s!Regular]
+\definefontsynonym [\s!Unicode\s!Italic] [\s!Unicode\s!Regular]
+\definefontsynonym [\s!Unicode\s!BoldSlanted] [\s!Unicode\s!Slanted]
+\definefontsynonym [\s!Unicode\s!BoldItalic] [\s!Unicode\s!Italic]
+
+\setupunicodefont
+ [\s!default]
+ [\c!height=1,
+ \c!depth=1,
+ \c!scale=1,
+ \c!strut=\v!no,
+ \c!interlinespace=\v!no,
+ \c!command=\insertunicodeglyph,
+ \c!conversion=\number]
+
+\protect \endinput
diff --git a/tex/context/base/font-uni.mkiv b/tex/context/base/font-uni.mkiv
new file mode 100644
index 000000000..40ab75ed6
--- /dev/null
+++ b/tex/context/base/font-uni.mkiv
@@ -0,0 +1,26 @@
+%D \module
+%D [ file=font-uni,
+%D version=2008.11.03, % 1999.10.10,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=\UNICODE,
+%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 / Unicode}
+
+%D In \MKIV\ we only provide the \type {\uchar} macro and
+%D implement it as just an \UTF\ converter. We expand it so
+%D best not use not use it for active characters.
+
+\unprotect
+
+\def\uchar#1#2{\ctxlua{commands.uchar(\number#1,\number#2)}}
+
+\let\uc\uchar
+
+\protect \endinput
diff --git a/tex/context/base/font-unk.mkii b/tex/context/base/font-unk.mkii
new file mode 100644
index 000000000..30f824781
--- /dev/null
+++ b/tex/context/base/font-unk.mkii
@@ -0,0 +1,187 @@
+%D \module
+%D [ file=font-unk,
+%D version=1998.09.10,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Unknown Defaults,
+%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 is rather important, because it enables us to
+%D define and call for not yet defined fonts in a way
+%D completely independant of real font names. First we map
+%D some meaningful names onto unknown filenames.
+
+\unprotect
+
+\definefontsynonym [Serif] [unknown]
+\definefontsynonym [SerifBold] [unknown]
+\definefontsynonym [SerifItalic] [unknown]
+\definefontsynonym [SerifSlanted] [unknown]
+\definefontsynonym [SerifBoldItalic] [unknown]
+\definefontsynonym [SerifBoldSlanted] [unknown]
+\definefontsynonym [SerifCaps] [unknown]
+
+\definefontsynonym [Sans] [unknown]
+\definefontsynonym [SansBold] [unknown]
+\definefontsynonym [SansItalic] [unknown]
+\definefontsynonym [SansSlanted] [unknown]
+\definefontsynonym [SansBoldItalic] [unknown]
+\definefontsynonym [SansBoldSlanted] [unknown]
+\definefontsynonym [SansCaps] [unknown]
+
+\definefontsynonym [Mono] [unknown]
+\definefontsynonym [MonoBold] [unknown]
+\definefontsynonym [MonoItalic] [unknown]
+\definefontsynonym [MonoSlanted] [unknown]
+\definefontsynonym [MonoBoldItalic] [unknown]
+\definefontsynonym [MonoBoldSlanted] [unknown]
+\definefontsynonym [MonoCaps] [unknown]
+
+\definefontsynonym [MathRoman] [unknown]
+\definefontsynonym [MathExtension] [unknown]
+\definefontsynonym [MathItalic] [unknown]
+\definefontsynonym [MathSymbol] [unknown]
+
+\definefontsynonym [MathNoName] [unknown]
+
+\definefontsynonym [MathAlpha] [unknown]
+\definefontsynonym [MathBeta] [unknown]
+\definefontsynonym [MathGamma] [unknown]
+\definefontsynonym [MathDelta] [unknown]
+
+\definefontsynonym [MathRomanBold] [MathRoman]
+\definefontsynonym [MathExtensionBold] [MathExtension]
+\definefontsynonym [MathItalicBold] [MathItalic]
+\definefontsynonym [MathSymbolBold] [MathSymbol]
+\definefontsynonym [MathAlphaBold] [MathAlpha]
+\definefontsynonym [MathBetaBold] [MathBeta]
+\definefontsynonym [MathGammaBold] [MathGamma]
+\definefontsynonym [MathDeltaBold] [MathDelta]
+
+\definefontsynonym [Handwriting] [unknown]
+\definefontsynonym [Calligraphic] [unknown]
+
+%D This permit us to define (use) fonts that refer to the default
+%D style (so, Bold may expand to SansBold or SerifBold, depending
+%D on the default style in the typeface).
+
+% \def\setfontsynonym[#1]#2[#3]{\setvalue{\??ff\fontclass#1}{#3}}
+%
+% \setfontsynonym[\s!Normal] [\fontstringD]
+% \setfontsynonym[\s!Bold] [\fontstringD\s!Bold]
+% \setfontsynonym[\s!Italic] [\fontstringD\s!Italic]
+% \setfontsynonym[\s!Slanted] [\fontstringD\s!Slanted]
+% \setfontsynonym[\s!BoldItalic] [\fontstringD\s!BoldItalic]
+% \setfontsynonym[\s!BoldSlanted][\fontstringD\s!BoldSlanted]
+% \setfontsynonym[\s!Caps] [\fontstringD\s!Caps]
+
+\definefontsynonym[\s!Normal] [\noexpand\fontstringD]
+\definefontsynonym[\s!Bold] [\noexpand\fontstringD\noexpand\s!Bold]
+\definefontsynonym[\s!Italic] [\noexpand\fontstringD\noexpand\s!Italic]
+\definefontsynonym[\s!Slanted] [\noexpand\fontstringD\noexpand\s!Slanted]
+\definefontsynonym[\s!BoldItalic] [\noexpand\fontstringD\noexpand\s!BoldItalic]
+\definefontsynonym[\s!BoldSlanted][\noexpand\fontstringD\noexpand\s!BoldSlanted]
+\definefontsynonym[\s!Caps] [\noexpand\fontstringD\noexpand\s!Caps]
+
+%D Also handy:
+
+\definefontsynonym [Regular] [Serif]
+\definefontsynonym [RegularBold] [SerifBold]
+\definefontsynonym [RegularItalic] [SerifItalic]
+\definefontsynonym [RegularSlanted] [SerifSlanted]
+\definefontsynonym [RegularBoldItalic] [SerifBoldItalic]
+\definefontsynonym [RegularBoldSlanted] [SerifBoldSlanted]
+\definefontsynonym [RegularCaps] [SerifCaps]
+
+\definefontsynonym [Support] [Sans]
+\definefontsynonym [SupportBold] [SansBold]
+\definefontsynonym [SupportItalic] [SansItalic]
+\definefontsynonym [SupportSlanted] [SansSlanted]
+\definefontsynonym [SupportBoldItalic] [SansBoldItalic]
+\definefontsynonym [SupportBoldSlanted] [SansBoldSlanted]
+\definefontsynonym [SupportCaps] [SansCaps]
+
+%D Well, not that good an idea:
+
+\definefontsynonym [Roman] [Serif]
+\definefontsynonym [RomanBold] [SerifBold]
+\definefontsynonym [RomanItalic] [SerifItalic]
+\definefontsynonym [RomanSlanted] [SerifSlanted]
+\definefontsynonym [RomanBoldItalic] [SerifBoldItalic]
+\definefontsynonym [RomanBoldSlanted] [SerifBoldSlanted]
+\definefontsynonym [RomanCaps] [SerifCaps]
+
+\definefontsynonym [Type] [Mono]
+\definefontsynonym [TypeBold] [MonoBold]
+\definefontsynonym [TypeItalic] [MonoItalic]
+\definefontsynonym [TypeSlanted] [MonoSlanted]
+\definefontsynonym [TypeBoldItalic] [MonoBoldItalic]
+\definefontsynonym [TypeBoldSlanted] [MonoBoldSlanted]
+\definefontsynonym [TypeCaps] [MonoCaps]
+
+%D Next we define roman, sans and monospaced font sets.
+
+\definebodyfont [default] [rm]
+ [tf=Serif sa 1,
+ bf=SerifBold sa 1,
+ it=SerifItalic sa 1,
+ sl=SerifSlanted sa 1,
+ bi=SerifBoldItalic sa 1,
+ bs=SerifBoldSlanted sa 1,
+ sc=SerifCaps sa 1]
+
+\definebodyfont [default] [ss]
+ [tf=Sans sa 1,
+ bf=SansBold sa 1,
+ it=SansItalic sa 1,
+ sl=SansSlanted sa 1,
+ bi=SansBoldItalic sa 1,
+ bs=SansBoldSlanted sa 1,
+ sc=SansCaps sa 1]
+
+\definebodyfont [default] [tt]
+ [tf=Mono sa 1,
+ bf=MonoBold sa 1,
+ it=MonoItalic sa 1,
+ sl=MonoSlanted sa 1,
+ bi=MonoBoldItalic sa 1,
+ bs=MonoBoldSlanted sa 1,
+ sc=MonoCaps sa 1]
+
+\definebodyfont [default] [mm]
+ [mr=MathRoman mo 1,
+ ex=MathExtension mo 1,
+ mi=MathItalic mo 1,
+ sy=MathSymbol mo 1,
+ nn=MathNoName mo 1,
+ ma=MathAlpha mo 1,
+ mb=MathBeta mo 1,
+ mc=MathGamma mo 1,
+ md=MathDelta mo 1]
+
+\definebodyfont [bfmath] [mm]
+ [mrbf=MathRomanBold mo 1,
+ exbf=MathExtensionBold mo 1,
+ mibf=MathItalicBold mo 1,
+ sybf=MathSymbolBold mo 1,
+ mabf=MathAlphaBold mo 1,
+ mbbf=MathBetaBold mo 1,
+ mcbf=MathGammaBold mo 1,
+ mdbf=MathDeltaBold mo 1]
+
+\definebodyfont [default] [hw]
+ [tf=Handwriting sa 1]
+
+\definebodyfont [default] [cg]
+ [tf=Calligraphy sa 1]
+
+%D These definitions come into action as soon as names are
+%D mapped onto real file names (or names that themselves are
+%D mapped).
+
+\protect \endinput
diff --git a/tex/context/base/font-unk.mkiv b/tex/context/base/font-unk.mkiv
new file mode 100644
index 000000000..bd699ef71
--- /dev/null
+++ b/tex/context/base/font-unk.mkiv
@@ -0,0 +1,162 @@
+%D \module
+%D [ file=font-unk,
+%D version=1998.09.10,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Unknown Defaults,
+%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 is rather important, because it enables us to
+%D define and call for not yet defined fonts in a way
+%D completely independant of real font names. First we map
+%D some meaningful names onto unknown filenames.
+
+\unprotect
+
+\definefontsynonym [Serif] [unknown]
+\definefontsynonym [SerifBold] [unknown]
+\definefontsynonym [SerifItalic] [unknown]
+\definefontsynonym [SerifSlanted] [unknown]
+\definefontsynonym [SerifBoldItalic] [unknown]
+\definefontsynonym [SerifBoldSlanted] [unknown]
+\definefontsynonym [SerifCaps] [unknown]
+
+\definefontsynonym [Sans] [unknown]
+\definefontsynonym [SansBold] [unknown]
+\definefontsynonym [SansItalic] [unknown]
+\definefontsynonym [SansSlanted] [unknown]
+\definefontsynonym [SansBoldItalic] [unknown]
+\definefontsynonym [SansBoldSlanted] [unknown]
+\definefontsynonym [SansCaps] [unknown]
+
+\definefontsynonym [Mono] [unknown]
+\definefontsynonym [MonoBold] [unknown]
+\definefontsynonym [MonoItalic] [unknown]
+\definefontsynonym [MonoSlanted] [unknown]
+\definefontsynonym [MonoBoldItalic] [unknown]
+\definefontsynonym [MonoBoldSlanted] [unknown]
+\definefontsynonym [MonoCaps] [unknown]
+
+\definefontsynonym [MathRoman] [unknown]
+\definefontsynonym [MathExtension] [unknown]
+\definefontsynonym [MathItalic] [unknown]
+\definefontsynonym [MathSymbol] [unknown]
+
+\definefontsynonym [MathNoName] [unknown]
+
+\definefontsynonym [MathAlpha] [unknown]
+\definefontsynonym [MathBeta] [unknown]
+\definefontsynonym [MathGamma] [unknown]
+\definefontsynonym [MathDelta] [unknown]
+
+\definefontsynonym [MathRomanBold] [MathRoman] % todo:
+\definefontsynonym [MathExtensionBold] [MathExtension] % [MathRoman]
+\definefontsynonym [MathItalicBold] [MathItalic] % [MathRoman]
+\definefontsynonym [MathSymbolBold] [MathSymbol] % [MathRoman]
+\definefontsynonym [MathAlphaBold] [MathAlpha] % [MathRoman]
+\definefontsynonym [MathBetaBold] [MathBeta] % [MathRoman]
+\definefontsynonym [MathGammaBold] [MathGamma] % [MathRoman]
+\definefontsynonym [MathDeltaBold] [MathDelta] % [MathRoman]
+
+\definefontsynonym [Handwriting] [unknown]
+\definefontsynonym [Calligraphic] [unknown]
+
+%D This permit us to define (use) fonts that refer to the default
+%D style (so, Bold may expand to SansBold or SerifBold, depending
+%D on the default style in the typeface).
+
+\definefontsynonym[\s!Normal] [\noexpand\fontstringD]
+\definefontsynonym[\s!Bold] [\noexpand\fontstringD\noexpand\s!Bold]
+\definefontsynonym[\s!Italic] [\noexpand\fontstringD\noexpand\s!Italic]
+\definefontsynonym[\s!Slanted] [\noexpand\fontstringD\noexpand\s!Slanted]
+\definefontsynonym[\s!BoldItalic] [\noexpand\fontstringD\noexpand\s!BoldItalic]
+\definefontsynonym[\s!BoldSlanted][\noexpand\fontstringD\noexpand\s!BoldSlanted]
+\definefontsynonym[\s!Caps] [\noexpand\fontstringD\noexpand\s!Caps]
+
+%D Also handy:
+
+\definefontsynonym [Regular] [Serif]
+\definefontsynonym [RegularBold] [SerifBold]
+\definefontsynonym [RegularItalic] [SerifItalic]
+\definefontsynonym [RegularSlanted] [SerifSlanted]
+\definefontsynonym [RegularBoldItalic] [SerifBoldItalic]
+\definefontsynonym [RegularBoldSlanted] [SerifBoldSlanted]
+\definefontsynonym [RegularCaps] [SerifCaps]
+
+\definefontsynonym [Support] [Sans]
+\definefontsynonym [SupportBold] [SansBold]
+\definefontsynonym [SupportItalic] [SansItalic]
+\definefontsynonym [SupportSlanted] [SansSlanted]
+\definefontsynonym [SupportBoldItalic] [SansBoldItalic]
+\definefontsynonym [SupportBoldSlanted] [SansBoldSlanted]
+\definefontsynonym [SupportCaps] [SansCaps]
+
+%D Well, not that good an idea:
+
+\definefontsynonym [Roman] [Serif]
+\definefontsynonym [RomanBold] [SerifBold]
+\definefontsynonym [RomanItalic] [SerifItalic]
+\definefontsynonym [RomanSlanted] [SerifSlanted]
+\definefontsynonym [RomanBoldItalic] [SerifBoldItalic]
+\definefontsynonym [RomanBoldSlanted] [SerifBoldSlanted]
+\definefontsynonym [RomanCaps] [SerifCaps]
+
+\definefontsynonym [Type] [Mono]
+\definefontsynonym [TypeBold] [MonoBold]
+\definefontsynonym [TypeItalic] [MonoItalic]
+\definefontsynonym [TypeSlanted] [MonoSlanted]
+\definefontsynonym [TypeBoldItalic] [MonoBoldItalic]
+\definefontsynonym [TypeBoldSlanted] [MonoBoldSlanted]
+\definefontsynonym [TypeCaps] [MonoCaps]
+
+%D Next we define roman, sans and monospaced font sets.
+
+\definebodyfont [default] [rm]
+ [tf=Serif sa 1,
+ bf=SerifBold sa 1,
+ it=SerifItalic sa 1,
+ sl=SerifSlanted sa 1,
+ bi=SerifBoldItalic sa 1,
+ bs=SerifBoldSlanted sa 1,
+ sc=SerifCaps sa 1]
+
+\definebodyfont [default] [ss]
+ [tf=Sans sa 1,
+ bf=SansBold sa 1,
+ it=SansItalic sa 1,
+ sl=SansSlanted sa 1,
+ bi=SansBoldItalic sa 1,
+ bs=SansBoldSlanted sa 1,
+ sc=SansCaps sa 1]
+
+\definebodyfont [default] [tt]
+ [tf=Mono sa 1,
+ bf=MonoBold sa 1,
+ it=MonoItalic sa 1,
+ sl=MonoSlanted sa 1,
+ bi=MonoBoldItalic sa 1,
+ bs=MonoBoldSlanted sa 1,
+ sc=MonoCaps sa 1]
+
+\definebodyfont [default] [mm]
+ [mr=MathRoman mo 1]
+
+\definebodyfont [bfmath] [mm]
+ [mr=MathRomanBold mo 1]
+
+\definebodyfont [default] [hw]
+ [tf=Handwriting sa 1]
+
+\definebodyfont [default] [cg]
+ [tf=Calligraphy sa 1]
+
+%D These definitions come into action as soon as names are
+%D mapped onto real file names (or names that themselves are
+%D mapped).
+
+\protect \endinput
diff --git a/tex/context/base/font-vf.lua b/tex/context/base/font-vf.lua
new file mode 100644
index 000000000..4f99c47b9
--- /dev/null
+++ b/tex/context/base/font-vf.lua
@@ -0,0 +1,213 @@
+if not modules then modules = { } end modules ['font-vf'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This is very experimental code! Not yet adapted to recent
+changes. This will change.</p>
+--ldx]]--
+
+-- define.methods elsewhere !
+
+fonts = fonts or { }
+fonts.vf = fonts.vf or { }
+
+local vf = fonts.vf
+local tfm = fonts.tfm
+
+fonts.define = fonts.define or { }
+fonts.define.methods = fonts.define.methods or { }
+
+vf.combinations = vf.combinations or { }
+vf.aux = vf.aux or { }
+vf.aux.combine = vf.aux.combine or { }
+
+function fonts.define.methods.install(tag, rules)
+ vf.combinations[tag] = rules
+ fonts.define.methods[tag] = function(specification)
+ return vf.combine(specification,tag)
+ end
+end
+
+function vf.aux.combine.assign(g, name, from, to, start, force)
+ local f, id = vf.aux.combine.load(g,name)
+ if f and id then
+ -- optimize for whole range, then just g = f
+ if not from then from, to = 0, 0xFF00 end
+ if not to then to = from end
+ if not start then start = from end
+ local fc, gc = f.characters, g.characters
+ 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]) -- 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.factor = f.factor -- brrr
+ end
+ end
+end
+
+function vf.aux.combine.process(g,list)
+ if list then
+ for _,v in next, list do
+ (vf.aux.combine.commands[v[1]] or nop)(g,v)
+ end
+ end
+end
+
+function vf.aux.combine.load(g,name)
+ return tfm.read_and_define(name or g.specification.name,g.specification.size)
+end
+
+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 next, 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.factor = f.factor -- brrr
+ end
+ end
+end
+
+vf.aux.combine.commands = {
+ ["initialize"] = function(g,v) vf.aux.combine.assign (g,g.name) end,
+ ["include-method"] = function(g,v) vf.aux.combine.process (g,vf.combinations[v[2]]) end, -- name
+ ["copy-parameters"] = function(g,v) vf.aux.combine.parameters(g,v[2]) end, -- name
+ ["copy-range"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[4],v[5],true) end, -- name, from-start, from-end, to-start
+ ["copy-char"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[3],v[4],true) end, -- name, from, to
+ ["fallback-range"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[4],v[5],false) end, -- name, from-start, from-end, to-start
+ ["fallback-char"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[3],v[4],false) end, -- name, from, to
+ ["copy_names"] = function(g,v) vf.aux.combine.names (g,v[2],true) end,
+ ["fallback_names"] = function(g,v) vf.aux.combine.names (g,v[2],false) end,
+}
+
+function vf.combine(specification,tag)
+ local g = {
+ name = specification.name,
+ -- type = 'virtual',
+ virtualized = true,
+ fonts = { },
+ characters = { },
+ descriptions = { },
+ specification = table.fastcopy(specification)
+ }
+ vf.aux.combine.process(g,vf.combinations[tag])
+ return g
+end
+
+vf.aux.combine.commands["feature"] = function(g,v)
+ local key, value = v[2], v[3]
+ if key then
+ if value == nil then
+ value = true
+ end
+ if g.specification and g.specification.features.normal then
+ g.specification.features.normal[key] = value -- otf?
+ end
+ end
+end
+
+-- simple example with features
+
+fonts.define.methods.install(
+ "ligatures", {
+ { "feature", "liga" } ,
+ { "feature", "dlig" } ,
+ { "initialize" } ,
+ }
+)
+
+--~ fonts.define.methods.install (
+--~ "ligatures-x", {
+--~ { "feature", "liga" } ,
+--~ { "feature", "dlig" } ,
+--~ { "initialize" } ,
+--~ { "lineheight" }
+--~ }
+--~ )
+
+--~ fonts.define.methods.install(
+--~ "lmsymbol10", {
+--~ { "fallback_names", "lmsy10.afm" } ,
+--~ { "fallback_names", "msam10.afm" } ,
+--~ { "fallback_names", "msbm10.afm" }
+--~ }
+--~ )
+--~ \font\TestFont=dummy@lmsymbol10 at 24pt
+
+-- docu case
+
+--~ fonts.define.methods.install(
+--~ "weird", {
+--~ { "copy-range", "lmroman10-regular" } ,
+--~ { "copy-char", "lmroman10-regular", 65, 66 } ,
+--~ { "copy-range", "lmsans10-regular", 0x0100, 0x01FF } ,
+--~ { "copy-range", "lmtypewriter10-regular", 0x0200, 0xFF00 } ,
+--~ { "fallback-range", "lmtypewriter10-regular", 0x0000, 0x0200 }
+--~ }
+--~ )
+
+-- demo case -> move to module
+
+fonts.define.methods["demo-1"] = function(specification)
+ local name = specification.name -- symbolic name
+ local size = specification.size -- given size
+ local f, id = tfm.read_and_define('lmroman10-regular',size)
+ if f and id then
+ local capscale, digscale = 0.85, 0.75
+ -- f.name, f.type = name, 'virtual'
+ f.name, f.virtualized = name, true
+ f.fonts = {
+ { id = id },
+ { name = 'lmsans10-regular' , size = size*capscale }, -- forced extra name
+ { name = 'lmtypewriter10-regular', size = size*digscale } -- forced extra name
+ }
+ local i_is_of_category = characters.i_is_of_category
+ local characters, descriptions = f.characters, f.descriptions
+ local red = {'special','pdf: 1 0 0 rg'}
+ local green = {'special','pdf: 0 1 0 rg'}
+ local blue = {'special','pdf: 0 0 1 rg'}
+ local black = {'special','pdf: 0 g'}
+ for u,v in next, characters do
+ if u and i_is_of_category(u,'lu') then
+ v.width = capscale*v.width
+ v.commands = { red, {'slot',2,u}, black }
+ elseif u and i_is_of_category(u,'nd') then
+ v.width = digscale*v.width
+ v.commands = { blue, {'slot',3,u}, black }
+ else
+ v.commands = { green, {'slot',1,u}, black }
+ end
+ end
+ end
+ return f
+end
diff --git a/tex/context/base/font-xtx.lua b/tex/context/base/font-xtx.lua
new file mode 100644
index 000000000..eac75dd29
--- /dev/null
+++ b/tex/context/base/font-xtx.lua
@@ -0,0 +1,122 @@
+if not modules then modules = { } end modules ['font-xtx'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local texsprint, count = tex.sprint, tex.count
+local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
+local tostring, next = tostring, next
+local lpegmatch = lpeg.match
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+--[[ldx--
+<p>Choosing a font by name and specififying its size is only part of the
+game. In order to prevent complex commands, <l n='xetex'/> introduced
+a method to pass feature information as part of the font name. At the
+risk of introducing nasty parsing and compatinility problems, this
+syntax was expanded over time.</p>
+
+<p>For the sake of users who have defined fonts using that syntax, we
+will support it, but we will provide additional methods as well.
+Normally users will not use this direct way, but use a more abstract
+interface.</p>
+
+<p>The next one is the official one. However, in the plain
+variant we need to support the crappy [] specification as
+well and that does not work too well with the general design
+of the specifier.</p>
+--ldx]]--
+
+--~ function fonts.define.specify.colonized(specification) -- xetex mode
+--~ local list = { }
+--~ if specification.detail and specification.detail ~= "" then
+--~ for v in gmatch(specification.detail,"%s*([^;]+)%s*") do
+--~ local a, b = match(v,"^(%S*)%s*=%s*(%S*)$")
+--~ if a and b then
+--~ list[a] = b:is_boolean()
+--~ if type(list[a]) == "nil" then
+--~ list[a] = b
+--~ end
+--~ else
+--~ local a, b = match(v,"^([%+%-]?)%s*(%S+)$")
+--~ if a and b then
+--~ list[b] = a ~= "-"
+--~ end
+--~ end
+--~ end
+--~ end
+--~ specification.features.normal = list
+--~ return specification
+--~ end
+
+--~ check("oeps/BI:+a;-b;c=d")
+--~ check("[oeps]/BI:+a;-b;c=d")
+--~ check("file:oeps/BI:+a;-b;c=d")
+--~ check("name:oeps/BI:+a;-b;c=d")
+
+local list = { }
+
+fonts.define.specify.colonized_default_lookup = "file"
+
+local function issome () list.lookup = fonts.define.specify.colonized_default_lookup end
+local function isfile () list.lookup = 'file' end
+local function isname () list.lookup = 'name' end
+local function thename(s) list.name = s end
+local function issub (v) list.sub = v end
+local function iscrap (s) list.crap = string.lower(s) end
+local function istrue (s) list[s] = 'yes' end
+local function isfalse(s) list[s] = 'no' end
+local function iskey (k,v) list[k] = v end
+
+local function istrue (s) list[s] = true end
+local function isfalse(s) list[s] = false end
+
+local spaces = lpeg.P(" ")^0
+local namespec = (1-lpeg.S("/:("))^0 -- was: (1-lpeg.S("/: ("))^0
+local crapspec = spaces * lpeg.P("/") * (((1-lpeg.P(":"))^0)/iscrap) * spaces
+local filename = (lpeg.P("file:")/isfile * (namespec/thename)) + (lpeg.P("[") * lpeg.P(true)/isname * (((1-lpeg.P("]"))^0)/thename) * lpeg.P("]"))
+local fontname = (lpeg.P("name:")/isname * (namespec/thename)) + lpeg.P(true)/issome * (namespec/thename)
+local sometext = (lpeg.R("az","AZ","09") + lpeg.S("+-."))^1
+local truevalue = lpeg.P("+") * spaces * (sometext/istrue)
+local falsevalue = lpeg.P("-") * spaces * (sometext/isfalse)
+local keyvalue = (lpeg.C(sometext) * spaces * lpeg.P("=") * spaces * lpeg.C(sometext))/iskey
+local somevalue = sometext/istrue
+local subvalue = lpeg.P("(") * (lpeg.C(lpeg.P(1-lpeg.S("()"))^1)/issub) * lpeg.P(")") -- for Kim
+local option = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces
+local options = lpeg.P(":") * spaces * (lpeg.P(";")^0 * option)^0
+local pattern = (filename + fontname) * subvalue^0 * crapspec^0 * options^0
+
+local normalize_meanings = fonts.otf.meanings.normalize
+
+function fonts.define.specify.colonized(specification) -- xetex mode
+ list = { }
+ lpegmatch(pattern,specification.specification)
+--~ for k, v in next, list do
+--~ list[k] = v:is_boolean()
+--~ if type(list[a]) == "nil" then
+--~ list[k] = v
+--~ end
+--~ end
+ list.crap = nil -- style not supported, maybe some day
+ if list.name then
+ specification.name = list.name
+ list.name = nil
+ end
+ if list.lookup then
+ specification.lookup = list.lookup
+ list.lookup = nil
+ end
+ if list.sub then
+ specification.sub = list.sub
+ list.sub = nil
+ end
+-- specification.features.normal = list
+ specification.features.normal = normalize_meanings(list)
+ return specification
+end
+
+fonts.define.register_split(":", fonts.define.specify.colonized)
diff --git a/tex/context/base/font-xtx.mkii b/tex/context/base/font-xtx.mkii
new file mode 100644
index 000000000..d6086b44e
--- /dev/null
+++ b/tex/context/base/font-xtx.mkii
@@ -0,0 +1,376 @@
+%D \module
+%D [ file=font-xtx,
+%D version=2004.09.11,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=\XETEX\ Hacks,
+%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.
+
+\ifnum\texengine=\xetexengine
+ \writestatus{loading}{ConTeXt Font Macros / XeTeX Hacks}
+\else
+ \endinput
+\fi
+
+\unprotect
+
+%D Loading:
+
+%D for some reason xetex does not support [filename] for tfm files and
+%D quotes also behave kind of strange " vs ' vs [ vs ...
+%D
+%D \starttyping
+%D \font\myfont = msam7 % ok
+%D \font\myfont = "msam7" % also ok
+%D \font\myfont = "msam7" at 8pt % error
+%D \stoptyping
+
+\newconditional\tracexetexfonts
+
+%D Because \XETEX\ is not that fast on locating fonts we cache lookups so
+%D that we minimize the test. It saves a little bit of runtime, depending
+%D on the number of fonts loaded (which is normally not that much).
+
+\def\doiffoundXTXfontelse#1#2%
+ {\ifcsname xtx@fnt@#2\somefontspec\endcsname
+ \ifconditional\tracexetexfonts
+ \writestatus\m!fonts{already checked #1: #2\somefontspec\space (state: \number\csname xtx@fnt@#2\somefontspec\endcsname)}%
+ \fi
+ \else
+ \suppressfontnotfounderror\plusone
+ \font\xetextempfont=#2\somefontspec\relax
+ \suppressfontnotfounderror\zerocount
+ \edef\xetextempfont{\fontname\xetextempfont}%
+ \global\expandafter\chardef\csname xtx@fnt@#2\somefontspec\endcsname
+ \ifx\xetextempfont\nullfontname
+ \zerocount \ifconditional\tracexetexfonts
+ \writestatus\m!fonts{not found #1: #2\somefontspec}%
+ \fi
+ \else
+ \plusone \ifconditional\tracexetexfonts
+ \writestatus\m!fonts{found #1: #2\somefontspec}%
+ \fi
+ \fi
+ \fi
+ \ifcase\csname xtx@fnt@#2\somefontspec\endcsname
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\docheckfontfilenameprefix#1:#2:#3#4\relax
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \ifx\!!stringb\empty
+ % no prefix
+ \let\checkedfontfile\!!stringa
+ \doiffoundXTXfontelse{1a}{\checkedfontfile\checkedfontfeatures}
+ {\edef\checkedfontfile{\checkedfontfile\checkedfontfeatures}}
+ {\doiffoundXTXfontelse{1b}{"\checkedfontfile\checkedfontfeatures"}
+ {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
+ {\doiffoundXTXfontelse{1c}{"[\checkedfontfile]\checkedfontfeatures"}
+ {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+ {}}}%
+ \else\ifx\!!stringa\v!file
+ % force file, only file check when no spaces
+ \let\checkedfontfile\!!stringb
+ \doiffoundXTXfontelse{2a}{"[\checkedfontfile]\checkedfontfeatures"}
+ {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+ {\doiffoundXTXfontelse{2b}{"\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"}%
+ \ifconditional\tracexetexfonts
+ \writestatus\m!fonts{no checking 3a: \checkedfontfile}%
+ \fi
+ \else
+ % whatever, maybe even xetex spec, forget about features
+ \edef\checkedfontfile{"\!!stringa\!!stringb"}%
+ \ifconditional\tracexetexfonts
+ \writestatus\m!fonts{no checking 3b: \checkedfontfile}%
+ \fi
+ \fi\fi\fi}
+
+\newconditional\enabledfontfeatures
+
+\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
+ {\settrue\enabledfontfeatures
+ \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\ifconditional\enabledfontfeatures
+ \edef\checkedfontfeatures{:\convertedfontfeatures}%
+ \else
+ \let\checkedfontfeatures\empty
+ \fi\fi
+ \fi
+ \fi
+ \docheckfontfilenameprefix#1:\empty:\empty\relax
+ \doshowcheckedfontfeatures}
+
+\edef\@@fontfeaturesareno {features\v!no}
+\edef\@@fontfeaturesareoff{features\v!off}
+
+\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\!!stringc{#1#2#3}%
+ \ifx\!!stringc\@@fontfeaturesareoff
+ \setfalse\enabledfontfeatures
+ \else\ifx\!!stringc\@@fontfeaturesareno
+ \setfalse\enabledfontfeatures
+ \else
+ \edef\convertedfontfeatures
+ {\convertedfontfeatures
+ \ifx\!!stringb\v!yes
+ +\!!stringa
+ \else\ifx\!!stringb\v!on
+ +\!!stringa
+ \else\ifx\!!stringb\v!no
+ -\!!stringa
+ \else\ifx\!!stringb\v!off
+ -\!!stringa
+ \else
+ \!!stringa=\!!stringb
+ \fi\fi\fi\fi;}%
+ \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=
+
+%D Variants:
+
+\unexpanded\def\variant[#1]%
+ {\dosetscaledfont
+ \font\variantfont\truefontname{\fontstringA\fontstylesuffix\fontvariant\fontstringA{#1}} at \scaledfont
+ \variantfont}
+
+%D Possible optimizations:
+
+% \def\updatefontparameters
+% {\edef\@@fontfeatures{\truefontdata\fontfile\s!features}%
+% \edef\@@fontskewchar{\truefontdata\fontfile\s!skewchar}}
+
+% \def\setfontcharacteristics
+% {\updatefontparameters % redundant, will go away, faster too
+% \the\everyfont}
+
+% \let\synchronizepatternswithfont\relax
+
+%D Names:
+
+% 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}%
+ \doifnextoptionalelse\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}
+
+\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
+
+% 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}
+
+%D Default:
+
+\def\defaultfontfile{file:lmmono10-regular}
+
+%D Maybe:
+
+% \def\updatefontparameters
+% {\edef\@@fontfeatures{\truefontdata\fontfile \s!features}%
+% \edef\@@fontskewchar{\truefontdata\fontfile \s!skewchar}}
+
+% \def\setfontcharacteristics
+% {%\updatefontparameters % redundant, will go away, faster too
+% \the\everyfont
+% \synchronizepatternswithfont}
+
+\protect \endinput
+
+% \starttypescript[serif] [myzhfont]
+% \definefontsynonym [Serif] [file:SimSun]
+% \definefontsynonym [SerifBold] [file:SimSun]
+% \definefontsynonym [SerifItalic] [file:SimSun]
+% \definefontsynonym [SerifBoldItalic] [file:SimSun]
+% \stoptypescript
+% \starttypescript[sans] [myzhfont]
+% \definefontsynonym [Sans] [file:SimSun]
+% \definefontsynonym [SansBold] [file:SimSun]
+% \definefontsynonym [SansItalic] [file:SimSun]
+% \definefontsynonym [SansBoldItalic] [file:SimSun]
+% \stoptypescript
+% \starttypescript[mono] [myzhfont]
+% \definefontsynonym [Mono] [file:SimSun]
+% \definefontsynonym [MonoBold] [file:SimSun]
+% \definefontsynonym [MonoItalic] [file:SimSun]
+% \definefontsynonym [MonoBoldItalic] [file:SimSun]
+% \stoptypescript
+% \definetypeface [myzhfont] [rm] [serif][myzhfont] [default]
+% \definetypeface [myzhfont] [ss] [sans] [myzhfont] [default]
+% \definetypeface [myzhfont] [tt] [mono] [myzhfont] [default]
+
+% \starttext
+% % on windows: make sure fonts.conf has no cache mentioned
+% %
+% % 64 sec xetex, 11 sec luatex (56 sec xetex when \nobigmath)
+% %
+% \setupbodyfont[myzhfont] \dorecurse{10000}{{hello {\switchtobodyfont[myzhfont] 你好}}\par}
+% %
+% % 67 sec xetex, 11.5 sec luatex
+% %
+% % \dorecurse{10000}{{hello {\switchtobodyfont[myzhfont] 你好}}\par}
+% %
+% % 5 sec xetex, 7 sec luatex
+% %
+% % \setupbodyfont[myzhfont] \dorecurse{10000}{{hello {你好}}\par}
+% %
+% % 5 sec xetex, 7 sec luatex
+% %
+% % \setupbodyfont[myzhfont] \dorecurse{10000}{{\bf hello {你好}}\par}
+% \stoptext
+
diff --git a/tex/context/base/grph-fig.mkii b/tex/context/base/grph-fig.mkii
new file mode 100644
index 000000000..c7f990af2
--- /dev/null
+++ b/tex/context/base/grph-fig.mkii
@@ -0,0 +1,559 @@
+%D \module
+%D [ file=grph-fig,
+%D version=2006.08.26, % overhaul of 1997.03.31
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Figure Inclusion,
+%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 Graphic Macros / Figure Handling}
+
+\unprotect
+
+\def\setupexternalfigures
+ {\dosingleempty\dosetupexternalfigures}
+
+\def\dosetupexternalfigures[#1]%
+ {\getparameters[\??ef][#1]% local settings
+ \getparameters[\??ex][#1]% global settings
+ \setfigurepathlist} % the path may be used elsewhere too (as in x-res-04)
+
+\presetlocalframed[\??ef]
+
+\newconditional\externalfigurelevel % true=background false=normal
+\newconditional\externalfigureflush % true=place false=ignore
+
+\setfalse\externalfigurelevel
+\settrue \externalfigureflush
+
+\def\doplaceexternalfigure[#1][#2][#3][#4][#5]%
+ {\doifsomething{#2}% catches \defineexternalfigure dummies
+ {\doifundefinedelse{\??ef\??ef#2}
+ {\dodoplaceexternalfigure[#1][#2][#3][#4][#5]}
+ {\doifelse{#1}{#2}
+ {\dodoplaceexternalfigure[#1][#2][#3][#4][#5]}
+ {\getvalue{\??ef\??ef#2}[#5]}}}}
+
+\def\dodoplaceexternalfigure[#1][#2][#3][#4][#5]%
+ {\bgroup
+ \pushmacro\textunderscore
+ \edef\textunderscore{\string_}% brrr, temp hack, still needed?
+ \calculateexternalfigure [][#1][#2][#3][#4][#5]% [] is dummy dwcomp
+ \calculateexternalscreenfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp
+ \popmacro\textunderscore
+ \box\foundexternalfigure
+ \egroup}
+
+\def\externalfigurereplacement#1#2#3%
+ {\setupcolors
+ [\c!state=\v!local]%
+ \expanded{\localframed
+ [\??ef]
+ [\c!width=\figurewidth,
+ \c!height=\figureheight,
+ \c!background=\v!screen,
+ \c!backgroundscreen=.8,
+ \c!frame=\@@efframe]}%
+ {\tt\tfxx \nohyphens
+ name: \expanded{\verbatimstring{#1}}\\%
+ file: \expanded{\verbatimstring{#2}}\\%
+ state: \expanded{\verbatimstring{#3}}}}
+
+\def\externalfigureplaceholder#1#2#3%
+ {\localframed
+ [\??ef]
+ [\c!width=#2,
+ \c!height=#3,
+ \c!frame=\v!on]%
+ {\tt\tfxx \nohyphens
+ name: \expanded{\verbatimstring{#1}}\\%
+ state: \expanded{\verbatimstring{placeholder}}}}
+
+% new: more convenient/efficient than
+%
+% \use..[a][a][setting] \externalfigure[b][a]
+%
+% is equivalent to:
+%
+% \def..[a][setting] \externalfigure[b][a]
+%
+% see x-res modules for usage:
+%
+% \defineexternalfigure[name][settings]
+
+\def\defineexternalfigure
+ {\dodoubleargument\dodefineexternalfigure}
+
+\def\dodefineexternalfigure[#1][#2]%
+ {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][][][#2]}}
+
+\def\getexternalfigure#1% efef has 4 args already and take an 5th
+ {\wait} % OBSOLETE
+
+% \useexternalfigure[alpha][koe]
+% \useexternalfigure[beta] [koe] [breedte=1cm]
+% \useexternalfigure[gamma][koe][alpha]
+% \useexternalfigure[delta][koe][alpha][breedte=2cm]
+%
+% volle breedte: \externalfigure[koe] \par
+% 3cm breed: \externalfigure[koe] [breedte=3cm] \par
+% volle breedte: \externalfigure[alpha] \par
+% 1cm breed: \externalfigure[beta] \par
+% volle breedte: \externalfigure[gamma] \par
+% 2cm breed: \externalfigure[delta] \par
+% 4cm breed: \externalfigure[beta] [breedte=4cm] \par
+% 5cm breed: \externalfigure[gamma][breedte=5cm] \par
+
+% \defineexternalfigure[a][width=10cm]
+% \defineexternalfigure[b][width=5cm]
+% \externalfigure[cow][a]
+% \externalfigure[cow][b][height=8cm]
+
+% \useexternalfigure[x][cow][width=10cm,height=1cm]
+% \externalfigure[x]
+% \externalfigure[x][width=3cm]
+
+\def\useexternalfigure
+ {\doquadrupleempty\douseexternalfigure}
+
+% [label] [filename]
+% [label] [filename] [parent]
+% [label] [filename] [parent] [settings]
+% [label] [filename] [settings]
+
+\def\useexternalfigure
+ {\doquadrupleempty\douseexternalfigure}
+
+\def\douseexternalfigure[#1][#2][#3][#4]%
+ {\doifelsenothing{#1}
+ {\doifsomething{#2}
+ {\doifassignmentelse{#3}
+ {\setvalue{\??ef\??ef#2}{\doplaceexternalfigure[#2][#2][#3][#4]}}
+ {\setvalue{\??ef\??ef#2}{\doplaceexternalfigure[#2][#2][][#4]}}}}
+ {\doifelsenothing{#2}
+ {\doifassignmentelse{#3}
+ {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#1][][#3]}}
+ {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#1][#3][#4]}}}
+ {\doifassignmentelse{#3}
+ {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#2][][#3]}}
+ {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#2][#3][#4]}}}}}
+
+\def\dosetefparameters#1#2#3% parent_id use_settings current_settings
+ {\doifelsenothing{#1} % inherit from parent
+ {\getparameters[\??ef][#2,#3]}
+ {\doifdefinedelse{\??ef\??ef#1}
+ {\pushmacro\doplaceexternalfigure
+ \def\doplaceexternalfigure[##1][##2][##3][##4]{\getparameters[\??ef][##4,#2,#3]}%
+ \getvalue{\??ef\??ef#1}%
+ \popmacro\doplaceexternalfigure}
+ {\getparameters[\??ef][#2,#3]}}}
+
+\unexpanded\def\externalfigure
+ {\dotripleempty\doexternalfigure}
+
+\def\doexternalfigure[#1][#2][#3]% [label][file][settings] | [file][settings] | [file][parent][settings]
+ {\bgroup
+ \doifelsenothing{#1}
+ {\framed[\c!width=\defaultfigurewidth,\c!height=\defaultfigureheight]{external\\figure\\no name}}
+ {\doifundefinedelse{\??ef\??ef#1}
+ {\useexternalfigure[\s!dummy][#1][#2][#3]%
+ \getvalue{\??ef\??ef\s!dummy}[]} % [] is dummy arg 5
+ {\doifassignmentelse{#2}
+ {\getvalue{\??ef\??ef#1}[#2]}%
+ {\getvalue{\??ef\??ef#1}[#3]}}}%
+ \globallet\currentresourcecomment\empty
+ \egroup}
+
+\long\def\resourcecomment#1%
+ {\long\gdef\currentresourcecomment{#1}}
+
+\long\def\startresourcecomment#1\stopresourcecomment
+ {\long\gdef\currentresourcecomment{#1}}
+
+\let\currentresourcecomment\empty
+
+\def\showexternalfigures % maybe run time command is better, but no core-run, unless figs-run ...
+ {%\writestatus\m!systems{for \string\showexternalfigures\space see \truefilename{x-res-20}.tex}
+ \usemodule[res-20]\showexternalfigures} % so for the moment we do it this way
+
+\def\overlayfigure#1%
+ {\externalfigure[#1][\c!width=\overlaywidth,\c!height=\overlayheight]}
+
+%D Still undocumented! No one uses it I think, better be done with layers.
+
+\newcount\efreference
+\newdimen\efxsteps
+\newdimen\efysteps
+
+\def\calculateefsteps
+ {\ifnum0\@@exxmax=\zerocount
+ \ifnum0\@@exymax=\zerocount
+ \def\@@exymax{24}%
+ \fi
+ \efysteps\figureheight \divide\efysteps \@@exymax
+ \efxsteps\efysteps
+ \dimen0=\figurewidth
+ \advance\dimen0 \efysteps
+ \divide \dimen0 \efysteps
+ \edef\@@exxmax{\number\dimen0}%
+ \else
+ \efxsteps\figurewidth \divide\efxsteps \@@exxmax
+ \efysteps\figureheight \divide\efysteps \@@exymax
+ \fi}
+
+\def\efcomment#1(#2,#3)#4(#5,#6)% {kader}(x,y)(h,b)[...]{tekst}
+ {\def\complexefdocomment[##1]##2%
+ {\position(#2,#3)%
+ {\setnostrut
+ \framed
+ [\c!width=#5\efxsteps,
+ \c!height=#6\exysteps,
+ \c!offset=\v!none,
+ \c!frame=#1,
+ ##1]%
+ {##2}}}%
+ \complexorsimpleempty\efdocomment}
+
+\def\efnocomment(#1,#2)#3(#4,#5)% (x,y)(h,b)[...]{tekst}
+ {\def\complexefdonocomment[##1]##2{}%
+ \complexorsimpleempty\efdonocomment}
+
+\def\efdomarker(#1,#2)#3#4% (h,b){kader}{tekst}
+ {\framed
+ [\c!width=#1\efxsteps,
+ \c!height=#2\efysteps,
+ \c!offset=\v!none,
+ \c!frame=#3]%
+ {#4}}
+
+\def\effigure#1%
+ {\position(0,0){\getvalue{#1}}}
+
+\def\efdoarea(#1,#2)#3#4% (h,b){kader}{tekst}
+ {\bgroup
+ \setnostrut
+ \framed
+ [\c!width=#1\efxsteps,
+ \c!height=#2\efysteps,
+ \c!offset=\!!zeropoint,
+ \c!frame=#3]
+ {#4}%
+ \egroup}
+
+\def\efgoto(#1,#2)#3[#4]% (h,b)kader[ref]
+ {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}%
+ \gotobox{\copy0}[#4]}
+
+\def\efmark(#1,#2)#3(#4,#5)#6[#7]%
+ {\advance\efreference \plusone
+ \position(#1,#2)
+ {\hbox{\the\efreference}}%
+ \position(#1,#2)
+ {\gotosomeinternal\s!vwb{#7}\realfolio
+ {\efdomarker(#4,#5)\v!on{\thisissomeinternal\s!vwa{#7}}}}}
+
+\def\eftext#1(#2,#3)#4(#5,#6)#7[#8]%
+ {\advance\efreference \plusone
+ \hbox
+ {\quad
+ \thisissomeinternal\s!vwb{#8}%
+ \gotosomeinternal \s!vwa{#8}\realfolio
+ {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}%
+ \quad#1 (#2,#3) (#5,#6) [#8]\hfill}%
+ \endgraf}
+
+\def\efthisis(#1,#2)#3[#4]%
+ {\efdoarea(#1,#2){#3}{\pagereference[#4]}}
+
+\newbox\colorbarbox
+
+\def\makecolorbar[#1]%
+ {\def\docommand##1%
+ {\color[##1]
+ {\blackrule
+ [\c!width=2em,
+ \c!height=1ex,
+ \c!depth=\!!zeropoint]}%
+ \endgraf}%
+ \global\setbox\colorbarbox\vbox
+ {\forgetall
+ \processcommalist[#1]\docommand}%
+ \global\setbox\colorbarbox\vbox
+ {\hskip2em\box\colorbarbox}%
+ \global\wd\colorbarbox\zeropoint}
+
+\def\placestartfigure[#1][#2][#3]#4\placestopfigure[#5]%
+ {\hbox
+ {\setbox0\hbox
+ {\useexternalfigure[\s!dummy][#2][#3,#5]%
+ \externalfigure[\s!dummy]}%
+ \calculateefsteps
+ \startpositioning
+ \def\referring(##1,##2)##3(##4,##5)##6[##7]%
+ {\position(##1,##2){\efgoto(##4,##5){\@@exframes}[##7]}}%
+ \def\marking(##1,##2)##3(##4,##5)##6[##7]%
+ {\position(##1,##2){\efthisis(##4,##5){\@@exframes}[##7]}}%
+ \def\remark{\efnocomment}%
+ \def\colorbar##1[##2]{}%
+ \position(0,0){\box0}%
+ \linewidth\onepoint
+ \setuppositioning
+ [\c!unit=pt,
+ \c!xscale=\withoutpt\the\efxsteps,
+ \c!yscale=\withoutpt\the\efysteps,
+ \c!factor=1]%
+ \ignorespaces#4%
+ \def\referring(##1,##2)##3(##4,##5)##6[##7]%
+ {}%
+ \let\marking\referring
+ \def\remark{\efcomment\v!no}%
+ \def\colorbar##1[##2]{\makecolorbar[##2]}%
+ \ignorespaces#4%
+ \stoppositioning
+ \box\colorbarbox}}
+
+\def\dodostartfigure[#1][#2][#3]#4\stopfigure
+ {\doifelse\v!test\@@exoption
+ {\teststartfigure[#1][#2][#3]#4\teststopfigure
+ \let\@@exframes\v!on}
+ {\let\@@exframes\v!off}%
+ \setvalue{\??ef\??ef#1}%
+ {\dosingleempty{\placestartfigure[#1][#2][#3]#4\placestopfigure}}%
+ }% no longer \doifundefined{#1}{\setvalue{#1}{\getexternalfigure{#1}}}}
+
+% De onderstaande macro mag niet zondermeer worden aangepast
+% en is afgestemd op gebruik in de handleiding.
+
+\def\teststartfigure[#1][#2][#3]#4\teststopfigure%
+ {\begingroup
+ \setbox0\hbox
+ {\useexternalfigure[\s!dummy][#2][\c!wfactor=\v!max]%
+ \externalfigure[\s!dummy]}%
+ \def\referring{\efmark}%
+ \def\marking{\efmark}%
+ \def\remark{\efcomment\v!yes}%
+ \def\colorbar##1[##2]{}%
+ \efreference\zerocount
+ \setbox0\vbox
+ {\hsize240pt
+ \startpositioning
+ \calculateefsteps
+ \position(0,0)
+ {\box0}%
+ \position(0,0)
+ {\basegrid
+ [\c!nx=\@@exxmax,
+ \c!dx=\withoutpt\the\efxsteps,
+ \c!ny=\@@exymax,
+ \c!dy=\withoutpt\the\efysteps,
+ \c!xstep=1,
+ \c!ystep=1,
+ \c!scale=1,
+ \c!offset=\v!no,
+ \c!unit=pt]}%
+ \setuppositioning
+ [\c!unit=pt,
+ \c!xscale=\withoutpt\the\efxsteps,
+ \c!yscale=\withoutpt\the\efysteps,
+ \c!factor=1]%
+ \linewidth\onepoint
+ \ignorespaces#4\relax
+ \stoppositioning
+ \vfill}%
+ \efreference\zerocount
+ \def\referring{\eftext{$\rightarrow$}}%
+ \def\marking{\eftext{$\leftarrow$}}%
+ \def\remark{\efnocomment}%
+ \def\colorbar##1[##2]{}%
+ \setbox2\vbox
+ {{\tfa\doifelsenothing{#1}{#2}{#1}}
+ \blank
+ \tfxx#4
+ \vfilll}%
+ \ifdim\ht0>\ht2
+ \ht2\ht0
+ \else
+ \ht0\ht2
+ \fi
+ \hbox
+ {\hskip3em
+ \vtop{\vskip12pt\box0\vskip6pt}%
+ \vtop{\vskip12pt\box2\vskip6pt}}%
+ \endgroup}
+
+\def\dodostartfigure[#1][#2][#3]#4\stopfigure
+ {\doifelse\v!test\@@exoption
+ {\teststartfigure[#1][#2][#3]#4\teststopfigure
+ \let\@@exframe\v!on}
+ {\let\@@exframe\v!off}%
+ \setvalue{\??ef\??ef#1}%
+ {\def\next{\placestartfigure[#1][#2][#3]#4\placestopfigure}%
+ \dosingleempty\next}%
+ }% no longer: \doifundefined{#1}{\setvalue{#1}{\getexternalfigure{#1}}}}
+
+\long\def\dostartfigure#1%
+ {\dotripleargument\dodostartfigure#1\stopfigure}
+
+\def\startfigure
+ {\grabuntil{\e!stop\v!figure}\dostartfigure}
+
+%D defining sound tracks:
+%D
+%D \starttyping
+%D \useexternalsoundtrack[label][file]
+%D \stoptyping
+%D
+%D associated actions: StartSound StopSound PauseSound ResumeSound
+%D
+%D Todo: like external figures, also search on path,
+%D although, they need to be present ar viewing time, so ...
+
+\def\useexternalsoundtrack
+ {\dodoubleargument\douseexternalsoundtrack}
+
+\def\douseexternalsoundtrack[#1][#2]%
+ {\setgvalue{\??sd:#1}{#2}}
+
+\def\checksoundtrack#1%
+ {\iflocation
+ \doifdefined{\??sd:#1}{\doifvaluesomething{\??sd:#1}
+ {\doinsertsoundtrack{\getvalue{\??sd:#1}}{#1}\@@sdoption
+ % brr, \..empty not really needed and maybe even wrong;
+ % also, not here but in driver
+ % well, no: sounds need to be reinitialize each time (i.e., be on page), so no
+ }}% \letgvalueempty{\??sd:#1}}}%
+ \fi}
+
+\setexecutecommandcheck {startsound} \checksoundtrack
+
+\def\setupexternalsoundtracks
+ {\dodoubleargument\getparameters[\??sd]}
+
+\setupexternalsoundtracks
+ [\c!option=]
+
+%D NEW: used in styledesign manual
+
+% \setbuffer[typeset-b]\endbuffer
+% \setbuffer[typeset-a]\endbuffer
+%
+% todo:
+%
+% \appendtoks \setbuffer[typeset-b]\endbuffer\to \everystarttext
+% \appendtoks \setbuffer[typeset-a]\endbuffer\to \everystarttext
+
+\def\typesetbuffer
+ {\dodoubleempty\dotypesetbuffer}
+
+\newcounter\noftypesetbuffers % all loaded at the end
+
+\defineexternalfigure
+ [typeset]
+ [\c!background=\v!color,
+ \c!backgroundcolor=\s!white]
+
+\def\dotypesetbuffer[#1][#2]% beware: this will mix up the mp graphics
+ {\bgroup
+ \def\TEXbufferfile##1{\bufferprefix##1.tex}%
+ \expanded{\setbuffer[typeset]%
+ \def\noexpand\bufferprefix{\ifprotectbuffers\jobname-\fi typeset-}}%
+ \starttext
+ \getbuffer[b,#1,a]%
+ \stoptext
+ \endbuffer
+ \doglobal\increment\noftypesetbuffers
+ % batch is needed
+ \executesystemcommand{texmfstart texexec --batch --pdf --result=\bufferprefix typeset-\noftypesetbuffers\space \bufferprefix typeset.tex}%
+ %\externalfigure[\bufferprefix typeset-\noftypesetbuffers.pdf][\c!object=\v!no,#2]%
+ \externalfigure[\bufferprefix typeset-\noftypesetbuffers.pdf][#2]%
+ \egroup}
+
+% for me only (manuals and such)
+
+\definesystemvariable{tz}
+
+\def\definetypesetting{\dotripleempty\dodefinetypesetting}
+\def\typesetfile {\dotripleempty\dotypesetfile}
+
+\def\dodefinetypesetting[#1][#2][#3]%
+ {\doifsomething{#1}{\setvalue{\??tz#1}{\dodotypesetfile{#2}{#3}}}}
+
+\def\dotypesetfile[#1][#2][#3]%
+ {\executeifdefined{\??tz#1}\gobbletwoarguments{#2}{#3}}
+
+\def\dodotypesetfile#1#2#3#4% args settings file settings
+ {\doifmode{*\v!first}{\executesystemcommand{texmfstart texexec.pl --batch --pdf #1 #3}}%
+ \doglobal\beforesplitstring#3\at.\to\typesetfilename
+ \externalfigure[\typesetfilename.pdf][#2,#4]}
+
+\setupexternalfigures
+ [\c!option=,
+ \c!object=\v!yes, % we only check for no
+ \c!reset=\v!no,
+ \c!maxwidth=\@@efwidth,
+ \c!maxheight=\@@efheight,
+ \c!bodyfont=\bodyfontsize,
+ \c!directory=,
+ \c!file=\f!utilityfilename.\f!figureextension,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!frame=\v!off,
+ \c!background=, % new
+ \c!splitcolor=\s!white,
+ \c!conversion=,
+ \c!prefix=,
+ \c!cache=,
+% \c!grid=,
+ \c!equalwidth=,
+ \c!equalheight=,
+ \c!location={\v!local,\v!global}]
+
+\setupexternalfigures
+ [\c!frames=\v!off,
+ \c!ymax=24,
+ \c!xmax=]
+
+\useexternalfigure
+ [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/grph-fig.mkiv b/tex/context/base/grph-fig.mkiv
new file mode 100644
index 000000000..e10dc0a32
--- /dev/null
+++ b/tex/context/base/grph-fig.mkiv
@@ -0,0 +1,640 @@
+%D \module
+%D [ file=grph-fig,
+%D version=2006.08.26, % overhaul of 1997.03.31
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Figure Inclusion,
+%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 Graphic Macros / Figure Handling}
+
+\unprotect
+
+\unexpanded\def\setupexternalfigures
+ {\dosingleempty\dosetupexternalfigures}
+
+\def\dosetupexternalfigures[#1]%
+ {\getparameters[\??ef][#1]% local settings
+ \getparameters[\??ex][#1]% global settings
+ \setfigurepathlist} % the path may be used elsewhere too (as in x-res-04)
+
+\presetlocalframed[\??ef]
+
+\newconditional\externalfigurelevel % true=background false=normal
+\newconditional\externalfigureflush % true=place false=ignore
+
+\setfalse\externalfigurelevel
+\settrue \externalfigureflush
+
+\def\doplaceexternalfigure[#1][#2][#3][#4][#5]%
+ {\doifsomething{#2}% catches \defineexternalfigure dummies
+ {\doifundefinedelse{\??ef\??ef#2}
+ {\dodoplaceexternalfigure[#1][#2][#3][#4][#5]}
+ {\doifelse{#1}{#2}
+ {\dodoplaceexternalfigure[#1][#2][#3][#4][#5]}
+ {\getvalue{\??ef\??ef#2}[#5]}}}}
+
+\def\dodoplaceexternalfigure[#1][#2][#3][#4][#5]%
+ {\bgroup
+ \pushmacro\textunderscore
+ \edef\textunderscore{\string_}% brrr, temp hack, still needed?
+ \calculateexternalfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp
+ \popmacro\textunderscore
+ \box\foundexternalfigure
+ \egroup}
+
+\def\externalfigurereplacement#1#2#3%
+ {\setupcolors
+ [\c!state=\v!local]%
+ \expanded{\localframed
+ [\??ef]
+ [\c!width=\figurewidth,
+ \c!height=\figureheight,
+ \c!background=\v!color,
+ \c!backgroundcolor=missingfigurecolor,
+ \c!frame=\@@efframe]}%
+ {\tt\tfxx \nohyphens
+ name: \expanded{\verbatimstring{#1}}\\%
+ file: \expanded{\verbatimstring{#2}}\\%
+ state: \expanded{\verbatimstring{#3}}}}
+
+\definecolor[missingfigurecolor][s=.8]
+
+\def\externalfigureplaceholder#1#2#3%
+ {\localframed
+ [\??ef]
+ [\c!width=#2,
+ \c!height=#3,
+ \c!frame=\v!on]%
+ {\tt\tfxx \nohyphens
+ name: \expanded{\verbatimstring{#1}}\\%
+ state: \expanded{\verbatimstring{placeholder}}}}
+
+% new: more convenient/efficient than
+%
+% \use..[a][a][setting] \externalfigure[b][a]
+%
+% is equivalent to:
+%
+% \def..[a][setting] \externalfigure[b][a]
+%
+% see x-res modules for usage:
+%
+% \defineexternalfigure[name][settings]
+
+\unexpanded\def\defineexternalfigure
+ {\dodoubleargument\dodefineexternalfigure}
+
+\def\dodefineexternalfigure[#1][#2]%
+ {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][][][#2]}}
+
+\def\getexternalfigure#1% efef has 4 args already and take an 5th
+ {\wait} % OBSOLETE
+
+% \useexternalfigure[alpha][koe]
+% \useexternalfigure[beta] [koe] [breedte=1cm]
+% \useexternalfigure[gamma][koe][alpha]
+% \useexternalfigure[delta][koe][alpha][breedte=2cm]
+%
+% volle breedte: \externalfigure[koe] \par
+% 3cm breed: \externalfigure[koe] [breedte=3cm] \par
+% volle breedte: \externalfigure[alpha] \par
+% 1cm breed: \externalfigure[beta] \par
+% volle breedte: \externalfigure[gamma] \par
+% 2cm breed: \externalfigure[delta] \par
+% 4cm breed: \externalfigure[beta] [breedte=4cm] \par
+% 5cm breed: \externalfigure[gamma][breedte=5cm] \par
+
+% \defineexternalfigure[a][width=10cm]
+% \defineexternalfigure[b][width=5cm]
+% \externalfigure[cow][a]
+% \externalfigure[cow][b][height=8cm]
+
+% \useexternalfigure[x][cow][width=10cm,height=1cm]
+% \externalfigure[x]
+% \externalfigure[x][width=3cm]
+
+\def\useexternalfigure
+ {\doquadrupleempty\douseexternalfigure}
+
+% [label] [filename]
+% [label] [filename] [parent]
+% [label] [filename] [parent] [settings]
+% [label] [filename] [settings]
+
+\def\useexternalfigure
+ {\doquadrupleempty\douseexternalfigure}
+
+% \def\douseexternalfigure[#1][#2][#3][#4]%
+% {\doifelsenothing{#1}
+% {\doifsomething{#2}
+% {\doifassignmentelse{#3}
+% {\setvalue{\??ef\??ef#2}{\doplaceexternalfigure[#2][#2][#3][#4]}}
+% {\setvalue{\??ef\??ef#2}{\doplaceexternalfigure[#2][#2][][#4]}}}}
+% {\doifelsenothing{#2}
+% {\doifassignmentelse{#3}
+% {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#1][][#3]}}
+% {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#1][#3][#4]}}}
+% {\doifassignmentelse{#3}
+% {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#2][][#3]}}
+% {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#2][#3][#4]}}}}}
+
+\def\douseexternalfigure[#1][#2][#3][#4]%
+ {\doifelsenothing{#1}
+ {\doifsomething{#2}
+ {\doifassignmentelse{#3}
+ {\dodouseexternalfigure{#2}{#2}{#3}{#4}}
+ {\dodouseexternalfigure{#2}{#2}{}{#4}}}}
+ {\doifelsenothing{#2}
+ {\doifassignmentelse{#3}
+ {\dodouseexternalfigure{#1}{#1}{}{#3}}
+ {\dodouseexternalfigure{#1}{#1}{#3}{#4}}}
+ {\doifassignmentelse{#3}
+ {\dodouseexternalfigure{#1}{#2}{}{#3}}
+ {\dodouseexternalfigure{#1}{#2}{#3}{#4}}}}}
+
+\def\dodouseexternalfigure#1#2#3#4%
+ {\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#2][#3][#4]}%
+ \doanalyseexternalfigurecollection[#2][#4]}
+
+\newconditional\inexternalfigurecollection
+\newdimen\xexternalfigurecollectionminwidth
+\newdimen\xexternalfigurecollectionmaxwidth
+\newdimen\xexternalfigurecollectionminheight
+\newdimen\xexternalfigurecollectionmaxheight
+
+\def\doanalyseexternalfigurecollection[#1][#2]%
+ {\ifconditional\inexternalfigurecollection
+ \setfalse\inexternalfigurecollection
+ \getfiguredimensions[#1][#2]%
+ \settrue\inexternalfigurecollection
+ \scratchdimen\naturalfigurewidth
+ \ifdim\scratchdimen>\xexternalfigurecollectionmaxwidth \xexternalfigurecollectionmaxwidth \scratchdimen \fi
+ \ifdim\scratchdimen<\xexternalfigurecollectionminwidth \xexternalfigurecollectionminwidth \scratchdimen \fi
+ \scratchdimen\naturalfigureheight
+ \ifdim\scratchdimen>\xexternalfigurecollectionmaxheight \xexternalfigurecollectionmaxheight\scratchdimen \fi
+ \ifdim\scratchdimen<\xexternalfigurecollectionminheight \xexternalfigurecollectionminheight\scratchdimen \fi
+ \fi}
+
+\unexpanded\def\startexternalfigurecollection[#1]%
+ {\begingroup
+ \def\currentexternalfigurecollection{#1}%
+ \settrue\inexternalfigurecollection
+ \xexternalfigurecollectionminwidth \maxdimen
+ \xexternalfigurecollectionmaxwidth \zeropoint
+ \xexternalfigurecollectionminheight\maxdimen
+ \xexternalfigurecollectionmaxheight\zeropoint}
+
+\unexpanded\def\stopexternalfigurecollection
+ {\setxvalue{\??ef:c:\currentexternalfigurecollection:\c!minwidth }{\the\xexternalfigurecollectionminwidth }%
+ \setxvalue{\??ef:c:\currentexternalfigurecollection:\c!maxwidth }{\the\xexternalfigurecollectionmaxwidth }%
+ \setxvalue{\??ef:c:\currentexternalfigurecollection:\c!minheight}{\the\xexternalfigurecollectionminheight}%
+ \setxvalue{\??ef:c:\currentexternalfigurecollection:\c!maxheight}{\the\xexternalfigurecollectionmaxheight}%
+ \endgroup}
+
+\def\externalfigurecollectionparameter#1#2%
+ {\csname\ifcsname\??ef:c:#1:#2\endcsname\??ef:c:#1:#2\else\s!empty\fi\endcsname}
+
+\def\externalfigurecollectionminwidth #1{\externalfigurecollectionparameter{#1}\c!minwidth }
+\def\externalfigurecollectionmaxwidth #1{\externalfigurecollectionparameter{#1}\c!maxwidth }
+\def\externalfigurecollectionminheight#1{\externalfigurecollectionparameter{#1}\c!minheight}
+\def\externalfigurecollectionmaxheight#1{\externalfigurecollectionparameter{#1}\c!maxheight}
+
+\let\efcparameter\externalfigurecollectionparameter
+\let\efcminwidth \externalfigurecollectionminwidth
+\let\efcmaxwidth \externalfigurecollectionmaxwidth
+\let\efcminheight\externalfigurecollectionminheight
+\let\efcmaxheight\externalfigurecollectionmaxheight
+
+% \startexternalfigurecollection[name]
+% \useexternalfigure[cow] [cow.pdf]
+% \useexternalfigure[mill][mill.png]
+% \stopexternalfigurecollection
+% \starttext
+% \bTABLE
+% \bTR
+% \bTD \externalfigure[cow] [height=\externalfigurecollectionmaxheight{name}] \eTD
+% \bTD \externalfigure[mill][height=\externalfigurecollectionmaxheight{name}] \eTD
+% \eTR
+% \eTABLE
+% \stoptext
+
+\def\dosetefparameters#1#2#3% parent_id use_settings current_settings
+ {\doifelsenothing{#1} % inherit from parent
+ {\getparameters[\??ef][#2,#3]}
+ {\doifdefinedelse{\??ef\??ef#1}
+ {\pushmacro\doplaceexternalfigure
+ \def\doplaceexternalfigure[##1][##2][##3][##4]{\getparameters[\??ef][##4,#2,#3]}%
+ \getvalue{\??ef\??ef#1}%
+ \popmacro\doplaceexternalfigure}
+ {\getparameters[\??ef][#2,#3]}}}
+
+\unexpanded\def\externalfigure
+ {\dotripleempty\doexternalfigure}
+
+\def\doexternalfigure[#1][#2][#3]% [label][file][settings] | [file][settings] | [file][parent][settings]
+ {\bgroup
+ \doifelsenothing{#1}
+ {\framed[\c!width=\defaultfigurewidth,\c!height=\defaultfigureheight]{external\\figure\\no name}}
+ {\doifundefinedelse{\??ef\??ef#1}
+ {\useexternalfigure[\s!dummy][#1][#2][#3]%
+ \getvalue{\??ef\??ef\s!dummy}[]} % [] is dummy arg 5
+ {\doifassignmentelse{#2}
+ {\getvalue{\??ef\??ef#1}[#2]}%
+ {\getvalue{\??ef\??ef#1}[#3]}}}%
+ \globallet\currentresourcecomment\empty
+ \egroup}
+
+\long\def\resourcecomment#1%
+ {\long\gdef\currentresourcecomment{#1}}
+
+\long\unexpanded\def\startresourcecomment#1\stopresourcecomment
+ {\long\gdef\currentresourcecomment{#1}}
+
+\let\currentresourcecomment\empty
+
+\def\showexternalfigures % maybe run time command is better, but no core-run, unless figs-run ...
+ {%\writestatus\m!systems{for \string\showexternalfigures\space see \truefilename{x-res-20}.tex}
+ \usemodule[res-20]\showexternalfigures} % so for the moment we do it this way
+
+\def\overlayfigure#1%
+ {\externalfigure[#1][\c!width=\overlaywidth,\c!height=\overlayheight]}
+
+%D Still undocumented! No one uses it I think, better be done with layers.
+
+% when there is need for this i'll reimplement it
+%
+% \newcount\efreference
+% \newdimen\efxsteps
+% \newdimen\efysteps
+%
+% \def\calculateefsteps
+% {\ifnum0\@@exxmax=\zerocount
+% \ifnum0\@@exymax=\zerocount
+% \def\@@exymax{24}%
+% \fi
+% \efysteps\figureheight \divide\efysteps \@@exymax
+% \efxsteps\efysteps
+% \dimen0=\figurewidth
+% \advance\dimen0 \efysteps
+% \divide \dimen0 \efysteps
+% \edef\@@exxmax{\number\dimen0}%
+% \else
+% \efxsteps\figurewidth \divide\efxsteps \@@exxmax
+% \efysteps\figureheight \divide\efysteps \@@exymax
+% \fi}
+%
+% \def\efcomment#1(#2,#3)#4(#5,#6)% {kader}(x,y)(h,b)[...]{tekst}
+% {\def\complexefdocomment[##1]##2%
+% {\position(#2,#3)%
+% {\setnostrut
+% \framed
+% [\c!width=#5\efxsteps,
+% \c!height=#6\exysteps,
+% \c!offset=\v!none,
+% \c!frame=#1,
+% ##1]%
+% {##2}}}%
+% \complexorsimpleempty\efdocomment}
+%
+% \def\efnocomment(#1,#2)#3(#4,#5)% (x,y)(h,b)[...]{tekst}
+% {\def\complexefdonocomment[##1]##2{}%
+% \complexorsimpleempty\efdonocomment}
+%
+% \def\efdomarker(#1,#2)#3#4% (h,b){kader}{tekst}
+% {\framed
+% [\c!width=#1\efxsteps,
+% \c!height=#2\efysteps,
+% \c!offset=\v!none,
+% \c!frame=#3]%
+% {#4}}
+%
+% \def\effigure#1%
+% {\position(0,0){\getvalue{#1}}}
+%
+% \def\efdoarea(#1,#2)#3#4% (h,b){kader}{tekst}
+% {\bgroup
+% \setnostrut
+% \framed
+% [\c!width=#1\efxsteps,
+% \c!height=#2\efysteps,
+% \c!offset=\!!zeropoint,
+% \c!frame=#3]
+% {#4}%
+% \egroup}
+%
+% \def\efgoto(#1,#2)#3[#4]% (h,b)kader[ref]
+% {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}%
+% \gotobox{\copy0}[#4]}
+%
+% \def\efmark(#1,#2)#3(#4,#5)#6[#7]%
+% {\advance\efreference \plusone
+% \position(#1,#2)
+% {\hbox{\the\efreference}}%
+% \position(#1,#2)
+% {\gotosomeinternal\s!vwb{#7}\realfolio
+% {\efdomarker(#4,#5)\v!on{\thisissomeinternal\s!vwa{#7}}}}}
+%
+% \def\eftext#1(#2,#3)#4(#5,#6)#7[#8]%
+% {\advance\efreference \plusone
+% \hbox
+% {\quad
+% \thisissomeinternal\s!vwb{#8}%
+% \gotosomeinternal \s!vwa{#8}\realfolio
+% {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}%
+% \quad#1 (#2,#3) (#5,#6) [#8]\hfill}%
+% \endgraf}
+%
+% \def\efthisis(#1,#2)#3[#4]%
+% {\efdoarea(#1,#2){#3}{\pagereference[#4]}}
+
+\newbox\colorbarbox
+
+\def\makecolorbar[#1]%
+ {\def\docommand##1%
+ {\color[##1]
+ {\blackrule
+ [\c!width=2em,
+ \c!height=1ex,
+ \c!depth=\!!zeropoint]}%
+ \endgraf}%
+ \global\setbox\colorbarbox\vbox
+ {\forgetall
+ \processcommalist[#1]\docommand}%
+ \global\setbox\colorbarbox\vbox
+ {\hskip2em\box\colorbarbox}%
+ \global\wd\colorbarbox\zeropoint}
+
+\unexpanded\def\placestartfigure[#1][#2][#3]#4\placestopfigure[#5]%
+ {\hbox
+ {\setbox0\hbox
+ {\useexternalfigure[\s!dummy][#2][#3,#5]%
+ \externalfigure[\s!dummy]}%
+ \calculateefsteps
+ \startpositioning
+ \def\referring(##1,##2)##3(##4,##5)##6[##7]%
+ {\position(##1,##2){\efgoto(##4,##5){\@@exframes}[##7]}}%
+ \def\marking(##1,##2)##3(##4,##5)##6[##7]%
+ {\position(##1,##2){\efthisis(##4,##5){\@@exframes}[##7]}}%
+ \def\remark{\efnocomment}%
+ \def\colorbar##1[##2]{}%
+ \position(0,0){\box0}%
+ \linewidth\onepoint
+ \setuppositioning
+ [\c!unit=pt,
+ \c!xscale=\withoutpt\the\efxsteps,
+ \c!yscale=\withoutpt\the\efysteps,
+ \c!factor=1]%
+ \ignorespaces#4%
+ \def\referring(##1,##2)##3(##4,##5)##6[##7]%
+ {}%
+ \let\marking\referring
+ \def\remark{\efcomment\v!no}%
+ \def\colorbar##1[##2]{\makecolorbar[##2]}%
+ \ignorespaces#4%
+ \stoppositioning
+ \box\colorbarbox}}
+
+\def\dodostartfigure[#1][#2][#3]#4\stopfigure
+ {\doifelse\v!test\@@exoption
+ {\teststartfigure[#1][#2][#3]#4\teststopfigure
+ \let\@@exframes\v!on}
+ {\let\@@exframes\v!off}%
+ \setvalue{\??ef\??ef#1}%
+ {\dosingleempty{\placestartfigure[#1][#2][#3]#4\placestopfigure}}%
+ }% no longer \doifundefined{#1}{\setvalue{#1}{\getexternalfigure{#1}}}}
+
+% De onderstaande macro mag niet zondermeer worden aangepast
+% en is afgestemd op gebruik in de handleiding.
+
+\def\teststartfigure[#1][#2][#3]#4\teststopfigure%
+ {\begingroup
+ \setbox0\hbox
+ {\useexternalfigure[\s!dummy][#2][\c!wfactor=\v!max]%
+ \externalfigure[\s!dummy]}%
+ \def\referring{\efmark}%
+ \def\marking{\efmark}%
+ \def\remark{\efcomment\v!yes}%
+ \def\colorbar##1[##2]{}%
+ \efreference\zerocount
+ \setbox0\vbox
+ {\hsize240pt
+ \startpositioning
+ \calculateefsteps
+ \position(0,0)
+ {\box0}%
+ \position(0,0)
+ {\basegrid
+ [\c!nx=\@@exxmax,
+ \c!dx=\withoutpt\the\efxsteps,
+ \c!ny=\@@exymax,
+ \c!dy=\withoutpt\the\efysteps,
+ \c!xstep=1,
+ \c!ystep=1,
+ \c!scale=1,
+ \c!offset=\v!no,
+ \c!unit=pt]}%
+ \setuppositioning
+ [\c!unit=pt,
+ \c!xscale=\withoutpt\the\efxsteps,
+ \c!yscale=\withoutpt\the\efysteps,
+ \c!factor=1]%
+ \linewidth\onepoint
+ \ignorespaces#4\relax
+ \stoppositioning
+ \vfill}%
+ \efreference\zerocount
+ \def\referring{\eftext{$\rightarrow$}}%
+ \def\marking{\eftext{$\leftarrow$}}%
+ \def\remark{\efnocomment}%
+ \def\colorbar##1[##2]{}%
+ \setbox2\vbox
+ {{\tfa\doifelsenothing{#1}{#2}{#1}}
+ \blank
+ \tfxx#4
+ \vfilll}%
+ \ifdim\ht0>\ht2
+ \ht2\ht0
+ \else
+ \ht0\ht2
+ \fi
+ \hbox
+ {\hskip3em
+ \vtop{\vskip12pt\box0\vskip6pt}%
+ \vtop{\vskip12pt\box2\vskip6pt}}%
+ \endgroup}
+
+\def\dodostartfigure[#1][#2][#3]#4\stopfigure
+ {\doifelse\v!test\@@exoption
+ {\teststartfigure[#1][#2][#3]#4\teststopfigure
+ \let\@@exframe\v!on}
+ {\let\@@exframe\v!off}%
+ \setvalue{\??ef\??ef#1}%
+ {\def\next{\placestartfigure[#1][#2][#3]#4\placestopfigure}%
+ \dosingleempty\next}%
+ }% no longer: \doifundefined{#1}{\setvalue{#1}{\getexternalfigure{#1}}}}
+
+\long\def\dostartfigure#1%
+ {\dotripleargument\dodostartfigure#1\stopfigure}
+
+\unexpanded\def\startfigure
+ {\grabuntil{\e!stop\v!figure}\dostartfigure}
+
+%D NEW: used in styledesign manual
+
+% beware in mkiv we don't have the typeset- prefix
+%
+% \setbuffer[typeset-b]\endbuffer
+% \setbuffer[typeset-a]\endbuffer
+%
+% todo:
+%
+% \appendtoks \setbuffer[typeset-b]\endbuffer\to \everystarttext
+% \appendtoks \setbuffer[typeset-a]\endbuffer\to \everystarttext
+
+\newcount\noftypesetbuffers
+
+\def\typesetbuffer
+ {\dodoubleempty\dotypesetbuffer}
+
+\def\dotypesetbuffer[#1][#2]% beware: this will mix up the mp graphics
+ {\ifsecondargument
+ \dodotypesetbuffer[#1][#2]%
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\dodotypesetbuffer[\jobname][#1]}%
+ {\dodotypesetbuffer[#1][]}%
+ \else
+ \dodotypesetbuffer[\jobname][]
+ \fi\fi}
+
+% \def\dodotypesetbuffer[#1][#2]%
+% {\bgroup
+% \global\advance\noftypesetbuffers\plusone
+% \edef\bufferfilename{\jobname-buffer-\the\noftypesetbuffers}%
+% \doifmode{*\v!first}
+% {\ctxlua{buffers.save("\bufferfilename.tmp","#1",true)}%
+% \executesystemcommand{context \bufferfilename.tmp}}%
+% \externalfigure[\bufferfilename.pdf][#2]%
+% \egroup}
+
+\def\dodotypesetbuffer[#1][#2]%
+ {\bgroup
+ \global\advance\noftypesetbuffers\plusone
+ \edef\bufferfilename{\jobname-buffer-\the\noftypesetbuffers}%
+ \ctxlua{buffers.run("\bufferfilename.tmp","#1",true)}%
+ \externalfigure[\bufferfilename.pdf][#2]%
+ \egroup}
+
+\def\dodotypesetbufferindeed#1%
+ {}
+
+% for me only (manuals and such)
+%
+% \definetypesetting [name] [options] [settings-a]
+%
+% \typesetfile [name] [file] [settings-b]
+% \typesetfile [file] [options] [settings-b]
+% \typesetfile [file] [settings-b]
+% \typesetfile [file]
+%
+% \enabletrackers[files.run]
+% \starttext
+% \typesetfile[oepsoeps.tex][width=10cm,frame=on]
+% \stoptext
+
+\definesystemvariable{tz}
+
+\unexpanded\def\definetypesetting{\dotripleempty\dodefinetypesetting}
+\def\typesetfile {\dotripleempty\dotypesetfile}
+
+\unexpanded\def\definetypesetting{\dotripleempty\dodefinetypesetting}
+\def\typesetfile {\dotripleempty\dotypesetfile}
+
+\def\dodefinetypesetting[#1][#2][#3]% <name> options settings-a
+ {\doifsomething{#1}{\setvalue{\??tz#1}{\dodotypesetfile{#2}{#3}}}}
+
+\def\dotypesetfile[#1][#2][#3]% <name> filename settings-b | filename options settings
+ {\ifcsname\??tz#1\endcsname
+ \csname\??tz#1\endcsname{#2}{#3}%
+ \else\ifthirdargument % filename options settings
+ \dodotypesetfile{#2}{#3}{#1}{}%
+ \else\ifsecondargument % filename settings
+ \dodotypesetfile{}{#2}{#1}{}%
+ \fi\fi\fi}
+
+\def\dodotypesetfile#1#2#3#4% options settings-a filename settings-b
+ {\edef\typesetfilename{\ctxlua{tex.write(jobfiles.run("#3","#1"))}}%
+ \expanded{\externalfigure[\typesetfilename]}[#2,#4]}
+
+\setupexternalfigures
+ [\c!option=,
+ \c!object=\v!yes, % we only check for no
+ \c!reset=\v!no,
+ \c!maxwidth=\@@efwidth,
+ \c!maxheight=\@@efheight,
+ \c!bodyfont=\bodyfontsize,
+ \c!directory=,
+ \c!file=\f!utilityfilename.\f!figureextension,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!frame=\v!off,
+ \c!background=, % new
+ \c!splitcolor=\s!white,
+ \c!conversion=,
+ \c!prefix=,
+ \c!cache=,
+% \c!grid=,
+ \c!equalwidth=,
+ \c!equalheight=,
+ \c!location={\v!local,\v!global}]
+
+\setupexternalfigures
+ [\c!frames=\v!off,
+ \c!ymax=24,
+ \c!xmax=]
+
+\useexternalfigure
+ [buffer] [\jobname.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/grph-fil.lua b/tex/context/base/grph-fil.lua
new file mode 100644
index 000000000..2e32c7a60
--- /dev/null
+++ b/tex/context/base/grph-fil.lua
@@ -0,0 +1,42 @@
+if not modules then modules = { } end modules ['grph-fil'] = {
+ version = 1.001,
+ comment = "companion to grph-fig.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, concat = string.format, table.concat
+
+local trace_run = false trackers.register("files.run",function(v) trace_run = v end)
+
+local command = "context %s"
+
+jobfiles = jobfiles or { }
+jobfiles.collected = jobfiles.collected or { }
+jobfiles.tobesaved = jobfiles.tobesaved or { }
+
+local tobesaved, collected = jobfiles.tobesaved, jobfiles.collected
+
+local function initializer()
+ tobesaved, collected = jobfiles.tobesaved, jobfiles.collected
+end
+
+job.register('jobfiles.collected', jobfiles.tobesaved, initializer)
+
+jobfiles.forcerun = false
+
+function jobfiles.run(name,...)
+ local oldchecksum = collected[name]
+ local newchecksum = file.checksum(name)
+ if jobfiles.forcerun or not oldchecksum or oldchecksum ~= newchecksum then
+ if trace_run then
+ commands.writestatus("buffers","changes in '%s', processing forced",name)
+ end
+ os.execute(format(command,concat({ name, ... }," ")))
+ elseif trace_run then
+ commands.writestatus("buffers","no changes in '%s', not processed",name)
+ end
+ tobesaved[name] = newchecksum
+ return file.replacesuffix(name,"pdf")
+end
diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua
new file mode 100644
index 000000000..508240a3b
--- /dev/null
+++ b/tex/context/base/grph-inc.lua
@@ -0,0 +1,1115 @@
+if not modules then modules = { } end modules ['grph-inc'] = {
+ version = 1.001,
+ comment = "companion to grph-inc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- lowercase types
+-- mps tex tmp svg
+-- partly qualified
+-- dimensions
+-- consult rlx
+
+-- figures.boxnumber can go as we now can use names
+
+--[[
+The ConTeXt figure inclusion mechanisms are among the oldest code
+in ConTeXt and evolve dinto a complex whole. One reason is that we
+deal with backend in an abstract way. What complicates matters is
+that we deal with internal graphics as well: TeX code, MetaPost code,
+etc. Later on figure databases were introduced, which resulted in
+a plug in model for locating images. On top of that runs a conversion
+mechanism (with caching) and resource logging.
+
+Porting that to Lua is not that trivial because quite some
+status information is kept between al these stages. Of course, image
+reuse also has some price, and so I decided to implement the graphics
+inclusion in several layers: detection, loading, inclusion, etc.
+
+Object sharing and scaling can happen at each stage, depending on the
+way the resource is dealt with.
+
+The TeX-Lua mix is suboptimal. This has to do with the fact that we cannot
+run TeX code from within Lua. Some more functionality will move to Lua.
+]]--
+
+local format, lower, find, match, gsub, gmatch = string.format, string.lower, string.find, string.match, string.gsub, string.gmatch
+local texsprint, texbox = tex.sprint, tex.box
+local contains = table.contains
+local concat = table.concat
+local todimen = string.todimen
+
+local ctxcatcodes = tex.ctxcatcodes
+local variables = interfaces.variables
+
+local trace_figures = false trackers.register("figures.locating", function(v) trace_figures = v end)
+local trace_bases = false trackers.register("figures.bases", function(v) trace_bases = v end)
+local trace_programs = false trackers.register("figures.programs", function(v) trace_programs = v end)
+local trace_conversion = false trackers.register("figures.conversion", function(v) trace_conversion = v end)
+local trace_inclusion = false trackers.register("figures.inclusion", function(v) trace_inclusion = v end)
+
+--- some extra img functions ---
+
+local imgkeys = img.keys()
+
+function img.totable(imgtable)
+ local result = { }
+ for k=1,#imgkeys do
+ local key = imgkeys[k]
+ result[key] = imgtable[key]
+ end
+ return result
+end
+
+function img.serialize(i)
+ return table.serialize(img.totable(i))
+end
+
+function img.clone(i,data)
+ i.width = data.width or i.width
+ i.height = data.height or i.height
+ -- attr etc
+ return i
+end
+
+local validsizes = table.tohash(img.boxes())
+local validtypes = table.tohash(img.types())
+
+function img.check_size(size)
+ if size then
+ size = gsub(size,"box","")
+ return (validsizes[size] and size) or "crop"
+ else
+ return "crop"
+ end
+end
+
+---
+
+figures = figures or { }
+figures.loaded = figures.loaded or { }
+figures.used = figures.used or { }
+figures.found = figures.found or { }
+figures.suffixes = figures.suffixes or { }
+figures.patterns = figures.patterns or { }
+figures.boxnumber = figures.boxnumber or 0
+figures.defaultsearch = true
+figures.defaultwidth = 0
+figures.defaultheight = 0
+figures.defaultdepth = 0
+figures.n = 0
+figures.prefer_quality = true -- quality over location
+
+figures.localpaths = {
+ ".", "..", "../.."
+}
+figures.cachepaths = {
+ prefix = "",
+ path = ".",
+ subpath = ".",
+}
+
+figures.paths = table.copy(figures.localpaths)
+
+figures.order = {
+ "pdf", "mps", "jpg", "png", "jbig", "svg", "eps", "gif", "mov", "buffer", "tex",
+}
+
+figures.formats = {
+ ["pdf"] = { list = { "pdf" } },
+ ["mps"] = { patterns = { "mps", "%d+" } },
+ ["jpg"] = { list = { "jpg", "jpeg" } },
+ ["png"] = { list = { "png" } },
+ ["jbig"] = { list = { "jbig", "jbig2", "jb2" } },
+ ["svg"] = { list = { "svg", "svgz" } },
+ ["eps"] = { list = { "eps", "ai" } },
+ ["gif"] = { list = { "gif" } },
+ ["mov"] = { list = { "mov", "avi" } },
+ ["buffer"] = { list = { "tmp", "buffer", "buf" } },
+ ["tex"] = { list = { "tex" } },
+}
+
+function figures.setlookups()
+ figures.suffixes, figures.patterns = { }, { }
+ for _, format in next, figures.order do
+ local data = figures.formats[format]
+ local fs, fp = figures.suffixes, figures.patterns
+ local list = data.list
+ if list then
+ for i=1,#list do
+ fs[list[i]] = format -- hash
+ end
+ else
+ fs[format] = format
+ end
+ local patterns = data.patterns
+ if patterns then
+ for i=1,#patterns do
+ fp[#fp+1] = { patterns[i], format } -- array
+ end
+ end
+ end
+end
+
+figures.setlookups()
+
+local function register(tag,target,what)
+ local data = figures.formats[target] -- resolver etc
+ if not data then
+ data = { }
+ figures.formats[target] = data
+ end
+ local d = data[tag] -- list or pattern
+ if d and not contains(d,what) then
+ d[#d+1] = what -- suffix or patternspec
+ else
+ data[tag] = { what }
+ end
+ if not contains(figures.order,target) then
+ figures.order[#figures.order+1] = target
+ end
+ figures.setlookups()
+end
+
+function figures.registersuffix (suffix, target) register('list', target,suffix ) end
+function figures.registerpattern(pattern,target) register('pattern',target,pattern) end
+
+local last_locationset, last_pathlist = last_locationset or nil, last_pathlist or nil
+
+function figures.setpaths(locationset,pathlist)
+ 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 h[iv["global"]] then
+ -- for s in gmatch(pathlist,",* *([^,]+)") do
+ local list = aux.settings_to_array(pathlist)
+ for i=1,#list do
+ local s = list[i]
+ if not contains(t,s) then
+ t[#t+1] = s
+ end
+ end
+ end
+ figures.paths, last_pathlist = t, pathlist
+ if trace_figures then
+ commands.writestatus("figures","locations: %s",last_locationset)
+ commands.writestatus("figures","path list: %s",concat(figures.paths, " "))
+ end
+end
+
+-- check conversions and handle it here
+
+function figures.hash(data)
+ return data.status.hash or tostring(data.status.private) -- the <img object>
+-- return data.status.fullname .. "+".. (data.status.page or data.request.page or 1) -- img is still not perfect
+end
+
+-- interfacing to tex
+
+do
+
+ local figuredata = { }
+ local callstack = { }
+
+ function figures.new()
+ figuredata = {
+ request = {
+ name = false,
+ label = false,
+ format = false,
+ page = false,
+ width = false,
+ height = false,
+ preview = false,
+ ["repeat"] = false,
+ controls = false,
+ display = false,
+ conversion = false,
+ cache = false,
+ prefix = false,
+ size = false,
+ },
+ used = {
+ fullname = false,
+ format = false,
+ name = false,
+ path = false,
+ suffix = false,
+ width = false,
+ height = false,
+ },
+ status = {
+ status = 0,
+ converted = false,
+ cached = false,
+ fullname = false,
+ format = false,
+ },
+ }
+ return figuredata
+ end
+
+ function figures.push(request)
+ local ncs = #callstack + 1
+ if ncs == 1 then
+ statistics.starttiming(figures)
+ end
+ local figuredata = figures.new()
+ if request then
+ local iv = interfaces.variables
+ -- request.width/height are strings and are only used when no natural dimensions
+ -- can be determined; at some point the handlers might set them to numbers instead
+ -- local w, h = tonumber(request.width), tonumber(request.height)
+ request.page = math.max(tonumber(request.page) or 1,1)
+ request.size = img.check_size(request.size)
+ request.object = iv[request.object] == variables.yes
+ request["repeat"] = iv[request["repeat"]] == variables.yes
+ request.preview = iv[request.preview] == variables.yes
+ request.cache = request.cache ~= "" and request.cache
+ request.prefix = request.prefix ~= "" and request.prefix
+ request.format = request.format ~= "" and request.format
+ -- request.width = (w and w > 0) or false
+ -- request.height = (h and h > 0) or false
+ table.merge(figuredata.request,request)
+ end
+ callstack[ncs] = figuredata
+ return figuredata
+ end
+ function figures.pop()
+ local ncs = #callstack
+ figuredata = callstack[ncs]
+ callstack[ncs] = nil
+ if ncs == 1 then
+ statistics.stoptiming(figures)
+ end
+ end
+ -- maybe move texsprint to tex
+ function figures.get(category,tag,default)
+ local value = figuredata[category]
+ value = value and value[tag]
+ if not value or value == "" or value == true then
+ return default or ""
+ else
+ return value
+ end
+ end
+ function figures.tprint(category,tag,default)
+ texsprint(ctxcatcodes,figures.get(category,tag,default))
+ end
+ function figures.current()
+ return callstack[#callstack]
+ end
+
+end
+
+local defaultformat = "pdf"
+local defaultprefix = "m_k_v_i_"
+
+local function register(askedname,specification)
+ if specification then
+ local format = specification.format
+ if format then
+ local conversion = specification.conversion
+ if conversion == "" then
+ conversion = nil
+ end
+ local newformat = conversion
+ if not newformat or newformat == "" then
+ newformat = defaultformat
+ end
+ local converter = (newformat ~= format) and figures.converters[format]
+ if trace_conversion then
+ logs.report("figures","checking conversion of '%s': old format '%s', new format '%s', conversion '%s'",
+ askedname,format,newformat,conversion or "default")
+ end
+ if converter then
+ if converter[newformat] then
+ converter = converter[newformat]
+ else
+ newformat = defaultformat
+ if converter[newformat] then
+ converter = converter[newformat]
+ else
+ newformat = defaultformat
+ end
+ end
+ end
+ if converter then
+ local oldname = specification.fullname
+ local newpath = file.dirname(oldname)
+ local oldbase = file.basename(oldname)
+ local newbase = file.replacesuffix(oldbase,newformat)
+ local fc = specification.cache or figures.cachepaths.path
+ if fc and fc ~= "" and fc ~= "." then
+ newpath = fc
+ else
+ newbase = defaultprefix .. newbase
+ end
+ local subpath = specification.subpath or figures.cachepaths.subpath
+ if subpath and subpath ~= "" and subpath ~= "." then
+ newpath = newpath .. "/" .. subpath
+ end
+ local prefix = specification.prefix or figures.cachepaths.prefix
+ if prefix and prefix ~= "" then
+ newbase = prefix .. newbase
+ end
+ local newname = file.join(newpath,newbase)
+ dir.makedirs(newpath)
+ oldname = file.collapse_path(oldname)
+ newname = file.collapse_path(newname)
+ local oldtime = lfs.attributes(oldname,'modification') or 0
+ local newtime = lfs.attributes(newname,'modification') or 0
+ if oldtime > newtime then
+ if trace_conversion then
+ logs.report("figures","converting '%s' from '%s' to '%s'",askedname,format,newformat)
+ end
+ converter(oldname,newname)
+ else
+ if trace_conversion then
+ logs.report("figures","no need to convert '%s' from '%s' to '%s'",askedname,format,newformat)
+ end
+ end
+ if io.exists(newname) then
+ specification.foundname = oldname
+ specification.fullname = newname
+ specification.prefix = prefix
+ specification.subpath = subpath
+ specification.converted = true
+ format = newformat
+ elseif io.exists(oldname) then
+ specification.fullname = newname
+ specification.converted = false
+ end
+ end
+ end
+ local found = figures.suffixes[format] -- validtypes[format]
+ if not found then
+ specification.found = false
+ if trace_figures then
+ commands.writestatus("figures","format not supported: %s",format)
+ end
+ else
+ specification.found = true
+ if trace_figures then
+ if validtypes[format] then
+ commands.writestatus("figures","format natively supported by backend: %s",format)
+ else
+ commands.writestatus("figures","format supported by output file format: %s",format)
+ end
+ end
+ end
+ else
+ specification = { }
+ end
+ specification.foundname = specification.foundname or specification.fullname
+ figures.found[askedname .. "->" .. (specification.conversion or "default")] = specification
+ return specification
+end
+
+local resolve_too = true -- urls
+
+local function locate(request) -- name, format, cache
+ local askedname = resolvers.clean_path(request.name)
+ local foundname = figures.found[askedname .. "->" .. (request.conversion or "default")]
+ if foundname then
+ return foundname
+ end
+ -- protocol check
+ local hashed = url.hashed(askedname)
+ if hashed and hashed.scheme ~= "file" then
+ local foundname = resolvers.findbinfile(askedname)
+ if foundname then
+ askedname = foundname
+ end
+ end
+ -- we could use the hashed data instead
+ local askedpath= file.is_rootbased_path(askedname)
+ local askedbase = file.basename(askedname)
+ local askedformat = (request.format ~= "" and request.format ~= "unknown" and request.format) or file.extname(askedname) or ""
+ local askedcache = request.cache
+ local askedconversion = request.conversion
+ if askedformat ~= "" then
+ if trace_figures then
+ commands.writestatus("figures","strategy: forced format")
+ end
+ askedformat = lower(askedformat)
+ local format = figures.suffixes[askedformat]
+ if not format then
+ local figurepatterns = figures.patterns
+ for i=1,#figurepatterns do
+ local pattern = figurepatterns[i]
+ if find(askedformat,pattern[1]) then
+ format = pattern[2]
+ break
+ end
+ end
+ end
+ if format then
+ local foundname = figures.exists(askedname,format,resolve_too) -- not askedformat
+ if foundname then
+ return register(askedname, {
+ askedname = askedname,
+ fullname = askedname,
+ format = format,
+ cache = askedcache,
+ foundname = foundname,
+ conversion = askedconversion,
+ })
+ end
+ end
+ if askedpath then
+ -- path and type given, todo: strip pieces of path
+ if figures.exists(askedname,askedformat,resolve_too) then
+ return register(askedname, {
+ askedname = askedname,
+ fullname = askedname,
+ format = askedformat,
+ cache = askedcache,
+ conversion = askedconversion,
+ })
+ end
+ else
+ -- type given
+ local figurepaths = figures.paths
+ for i=1,#figurepaths do
+ local path = figurepaths[i]
+ local check = path .. "/" .. askedname
+ -- we pass 'true' as it can be an url as well, as the type
+ -- is given we don't waste much time
+ if figures.exists(check,askedformat,resolve_too) then
+ return register(check, {
+ askedname = askedname,
+ fullname = check,
+ format = askedformat,
+ cache = askedcache,
+ conversion = askedconversion,
+ })
+ end
+ end
+ if figures.defaultsearch then
+ local check = resolvers.find_file(askedname)
+ if check and check ~= "" then
+ return register(askedname, {
+ askedname = askedname,
+ fullname = check,
+ format = askedformat,
+ cache = askedcache,
+ conversion = askedconversion,
+ })
+ end
+ end
+ end
+ elseif askedpath then
+ if trace_figures then
+ commands.writestatus("figures","strategy: rootbased path")
+ end
+ local figureorder = figures.order
+ for i=1,#figureorder do
+ local format = figureorder[i]
+ local list = figures.formats[format].list or { format }
+ for j=1,#list do
+ local suffix = list[j]
+ local check = file.addsuffix(askedname,suffix)
+ if figures.exists(check,format,resolve_too) then
+ return register(askedname, {
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
+ conversion = askedconversion,
+ })
+ end
+ end
+ end
+ else
+ if figures.prefer_quality then
+ if trace_figures then
+ commands.writestatus("figures","strategy: unknown format, prefer quality")
+ end
+ local figurepaths = figures.paths
+ local figureorder = figures.order
+ for j=1,#figureorder do
+ local format = figureorder[j]
+ local list = figures.formats[format].list or { format }
+ for k=1,#list do
+ local suffix = list[k]
+ -- local name = file.replacesuffix(askedbase,suffix)
+ local name = file.replacesuffix(askedname,suffix)
+ for i=1,#figurepaths do
+ local path = figurepaths[i]
+ local check = path .. "/" .. name
+ local isfile = url.hashed(check).scheme == "file"
+ if not isfile then
+ if trace_figures then
+ commands.writestatus("figures","warning: skipping path %s",path)
+ end
+ elseif figures.exists(check,format,true) then
+ return register(askedname, {
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
+ conversion = askedconversion,
+ })
+ end
+ end
+ end
+ end
+ else -- 'location'
+ if trace_figures then
+ commands.writestatus("figures","strategy: unknown format, prefer path")
+ end
+ local figurepaths = figures.paths
+ local figureorder = figures.order
+ for i=1,#figurepaths do
+ local path = figurepaths[i]
+ for j=1,#figureorder do
+ local format = figureorder[j]
+ local list = figures.formats[format].list or { format }
+ for k=1,#list do
+ local suffix = list[k]
+ local check = path .. "/" .. file.replacesuffix(askedbase,suffix)
+ if figures.exists(check,format,resolve_too) then
+ return register(askedname, {
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
+ conversion = askedconversion,
+ })
+ end
+ end
+ end
+ end
+ end
+ if figures.defaultsearch then
+ if trace_figures then
+ commands.writestatus("figures","strategy: default tex path")
+ end
+ local figureorder = figures.order
+ for j=1,#figureorder do
+ local format = figureorder[j]
+ local list = figures.formats[format].list or { format }
+ for k=1,#list do
+ local suffix = list[k]
+ local check = resolvers.find_file(file.replacesuffix(askedname,suffix))
+ if check and check ~= "" then
+ return register(askedname, {
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
+ conversion = askedconversion,
+ })
+ end
+ end
+ end
+ end
+ end
+ return register(askedname)
+end
+
+-- -- -- plugins -- -- --
+
+figures.existers = figures.existers or { }
+figures.checkers = figures.checkers or { }
+figures.includers = figures.includers or { }
+figures.converters = figures.converters or { }
+figures.identifiers = figures.identifiers or { }
+figures.programs = figures.programs or { }
+
+figures.identifiers.list = {
+ figures.identifiers.default
+}
+
+function figures.identifiers.default(data)
+ local dr, du, ds = data.request, data.used, data.status
+ local l = locate(dr)
+ local foundname = l.foundname
+ local fullname = l.fullname or foundname
+ if fullname then
+ du.format = l.format or false
+ du.fullname = fullname -- can be cached
+ ds.fullname = foundname -- original
+ ds.format = l.format
+ ds.status = (l.found and 10) or 0
+ end
+ return data
+end
+
+function figures.identify(data)
+ data = data or figures.current()
+ local list = figures.identifiers.list
+ for i=1,#list do
+ local identifier = list[i]
+ data = identifier(data)
+ if data.status.status > 0 then
+ break
+ end
+ end
+ return data
+end
+function figures.exists(askedname,format,resolve)
+ return (figures.existers[format] or figures.existers.generic)(askedname,resolve)
+end
+function figures.check(data)
+ data = data or figures.current()
+ local dr, du, ds = data.request, data.used, data.status
+ return (figures.checkers[ds.format] or figures.checkers.generic)(data)
+end
+function figures.include(data)
+ data = data or figures.current()
+ local dr, du, ds = data.request, data.used, data.status
+ return (figures.includers[ds.format] or figures.includers.generic)(data)
+end
+function figures.scale(data) -- will become lua code
+ texsprint(ctxcatcodes,"\\doscalefigure")
+ return data
+end
+function figures.done(data)
+ figures.n = figures.n + 1
+ data = data or figures.current()
+--~ print(table.serialize(figures.current()))
+ local dr, du, ds, nr = data.request, data.used, data.status, figures.boxnumber
+ local box = texbox[nr]
+ ds.width = box.width
+ ds.height = box.height
+ ds.xscale = ds.width /(du.width or 1)
+ ds.yscale = ds.height/(du.height or 1)
+--~ print(table.serialize(figures.current()))
+ return data
+end
+
+function figures.dummy(data)
+ data = data or figures.current()
+ local dr, du, ds, nr = data.request, data.used, data.status, figures.boxnumber
+ local box = node.hpack(node.new("hlist")) -- we need to set the dir (luatex 0.60 buglet)
+ du.width = du.width or figures.defaultwidth
+ du.height = du.height or figures.defaultheight
+ du.depth = du.depth or figures.defaultdepth
+ -- box.dir = "TLT"
+ box.width = du.width
+ box.height = du.height
+ box.depth = du.depth
+ texbox[nr] = box -- hm, should be global (to be checked for consistency)
+end
+
+-- -- -- generic -- -- --
+
+function figures.existers.generic(askedname,resolve)
+ -- not findbinfile
+ local result
+ if lfs.isfile(askedname) then
+ result = askedname
+ elseif resolve then
+ result = resolvers.findbinfile(askedname) or ""
+ if result == "" then result = false end
+ end
+ if trace_figures then
+ if result then
+ commands.writestatus("figures","found: %s -> %s",askedname,result)
+ else
+ commands.writestatus("figures","not found: %s",askedname)
+ end
+ end
+ return result
+end
+function figures.checkers.generic(data)
+ local dr, du, ds = data.request, data.used, data.status
+ local name, page, size, color = du.fullname or "unknown generic", du.page or dr.page, dr.size or "crop", dr.color or "natural"
+ local conversion = dr.conversion
+ if not conversion or conversion == "" then
+ conversion = "unknown"
+ end
+ local hash = name .. "->" .. page .. "->" .. size .. "->" .. color .. "->" .. conversion
+ local figure = figures.loaded[hash]
+ if figure == nil then
+ figure = img.new { filename = name, page = page, pagebox = dr.size }
+ backends.codeinjections.setfigurecolorspace(data,figure)
+ figure = (figure and img.scan(figure)) or false
+ local f, d = backends.codeinjections.setfigurealternative(data,figure)
+ figure, data = f or figure, d or data
+ figures.loaded[hash] = figure
+ if trace_conversion then
+ logs.report("figures","new graphic, hash: %s",hash)
+ end
+ else
+ if trace_conversion then
+ logs.report("figures","existing graphic, hash: %s",hash)
+ end
+ end
+ if figure then
+ du.width = figure.width
+ du.height = figure.height
+ du.pages = figure.pages
+ ds.private = figure
+ ds.hash = hash
+ end
+ return data
+end
+function figures.includers.generic(data)
+ local dr, du, ds = data.request, data.used, data.status
+ -- here we set the 'natural dimensions'
+ dr.width = du.width
+ dr.height = du.height
+ local hash = figures.hash(data)
+ local figure = figures.used[hash]
+ if figure == nil then
+ figure = ds.private
+ if figure then
+ figure = img.copy(figure)
+ figure = (figure and img.clone(figure,data.request)) or false
+ end
+ figures.used[hash] = figure
+ end
+ if figure then
+ local nr = figures.boxnumber
+ -- it looks like we have a leak in attributes here .. todo
+ local box = node.hpack(img.node(figure)) -- img.node(figure) not longer valid
+ box.width, box.height, box.depth = figure.width, figure.height, 0 -- new, hm, tricky, we need to do that in tex (yet)
+ texbox[nr] = box
+ ds.objectnumber = figure.objnum
+ texsprint(ctxcatcodes,"\\relocateexternalfigure")
+ end
+ return data
+end
+
+-- -- -- nongeneric -- -- --
+
+function figures.checkers.nongeneric(data,command)
+ local dr, du, ds = data.request, data.used, data.status
+ local name = du.fullname or "unknown nongeneric"
+ local hash = name
+ if dr.object then
+ -- hm, bugged
+ if not jobobjects.get("FIG::"..hash) then
+ texsprint(ctxcatcodes,command)
+ texsprint(ctxcatcodes,format("\\setobject{FIG}{%s}\\vbox{\\box\\foundexternalfigure}",hash))
+ end
+ texsprint(ctxcatcodes,format("\\global\\setbox\\foundexternalfigure\\vbox{\\getobject{FIG}{%s}}",hash))
+ else
+ texsprint(ctxcatcodes,command)
+ end
+ return data
+end
+function figures.includers.nongeneric(data)
+ return data
+end
+
+-- -- -- mov -- -- --
+
+function figures.checkers.mov(data)
+ local dr, du, ds = data.request, data.used, data.status
+ local width = todimen(dr.width or figures.defaultwidth)
+ local height = todimen(dr.height or figures.defaultheight)
+ local foundname = du.fullname
+ dr.width, dr.height = width, height
+ du.width, du.height, du.foundname = width, height, foundname
+ if trace_inclusion then
+ logs.report("figures","including movie '%s': width %s, height %s",foundname,width,height)
+ end
+ -- we need to push the node.write in between ... we could make a shared helper for this
+ context.startfoundexternalfigure(width .. "sp",height .. "sp")
+ context(function()
+ backends.codeinjections.insertmovie {
+ width = width,
+ height = height,
+ factor = number.dimenfactors.bp,
+ ["repeat"] = dr["repeat"],
+ controls = dr.controls,
+ preview = dr.preview,
+ label = dr.label,
+ foundname = foundname,
+ }
+ end)
+ context.stopfoundexternalfigure()
+ return data
+end
+
+figures.includers.mov = figures.includers.nongeneric
+
+-- -- -- mps -- -- --
+
+local function internal(askedname)
+ local spec, mprun, mpnum = match(lower(askedname),"mprun(:?)(.-)%.(%d+)")
+ if spec == ":" then
+ return mprun, mpnum
+ else
+ return "", mpnum
+ end
+end
+
+function figures.existers.mps(askedname)
+ local mprun, mpnum = internal(askedname)
+ if mpnum then
+ return askedname
+ else
+ return figures.existers.generic(askedname)
+ end
+end
+function figures.checkers.mps(data)
+ local mprun, mpnum = internal(data.used.fullname)
+ if mpnum then
+ return figures.checkers.nongeneric(data,format("\\docheckfiguremprun{%s}{%s}",mprun,mpnum))
+ else
+ return figures.checkers.nongeneric(data,format("\\docheckfiguremps{%s}",data.used.fullname))
+ end
+end
+figures.includers.mps = figures.includers.nongeneric
+
+-- -- -- buffer -- -- --
+
+function figures.existers.buffer(askedname)
+ askedname = file.nameonly(askedname)
+ return buffers.exists(askedname) and askedname
+end
+function figures.checkers.buffer(data)
+ return figures.checkers.nongeneric(data,format("\\docheckfigurebuffer{%s}", file.nameonly(data.used.fullname)))
+end
+figures.includers.buffers = figures.includers.nongeneric
+
+-- -- -- tex -- -- --
+
+function figures.existers.tex(askedname)
+ askedname = resolvers.find_file(askedname)
+ return (askedname ~= "" and askedname) or false
+end
+function figures.checkers.tex(data)
+ return figures.checkers.nongeneric(data,format("\\docheckfiguretex{%s}", data.used.fullname))
+end
+figures.includers.tex = figures.includers.nongeneric
+
+-- -- -- converters -- -- --
+
+local function makeoptions(program)
+ local to = type(options)
+ return (to == "table" and concat(options," ")) or (to == "string" and options) or ""
+end
+
+local function runprogram(...)
+ local command = format(...)
+ if trace_conversion or trace_programs then
+ logs.report("figures","running %s",command)
+ end
+ os.spawn(command)
+end
+
+-- -- -- eps -- -- --
+
+local epsconverter = { }
+figures.converters.eps = epsconverter
+
+figures.programs.gs = {
+ options = {
+ "-dAutoRotatePages=/None",
+ "-dPDFSETTINGS=/prepress",
+ "-dEPSCrop",
+ },
+ command = (os.type == "windows" and "gswin32") or "gs"
+}
+
+function epsconverter.pdf(oldname,newname)
+ local gs = figures.programs.gs
+ runprogram (
+ '%s -q -sDEVICE=pdfwrite -dNOPAUSE -dNOCACHE -dBATCH %s -sOutputFile="%s" "%s" -c quit',
+ gs.command, makeoptions(gs.options), newname, oldname
+ )
+end
+
+epsconverter.default = epsconverter.pdf
+
+-- -- -- svg -- -- --
+
+local svgconverter = { }
+figures.converters.svg = svgconverter
+figures.converters.svgz = svgconverter
+
+-- inkscape on windows only works with complete paths
+
+figures.programs.inkscape = {
+ options = {
+ "--export-dpi=600"
+ },
+ command = "inkscape"
+}
+
+function svgconverter.pdf(oldname,newname)
+ local inkscape = figures.programs.inkscape
+ runprogram (
+ '%s "%s" --export-pdf="%s" %s',
+ inkscape.command, oldname, newname, makeoptions(inkscape.options)
+ )
+end
+
+function svgconverter.png(oldname,newname)
+ local inkscape = figures.programs.inkscape
+ runprogram (
+ '%s "%s" --export-png="%s" %s',
+ inkscape.command, oldname, newname, makeoptions(inkscape.options)
+ )
+end
+
+svgconverter.default = svgconverter.pdf
+
+-- -- -- gif -- -- --
+
+local gifconverter = { }
+figures.converters.gif = gifconverter
+
+figures.programs.convert = {
+ command = "convert" -- imagemagick
+}
+
+function gifconverter.pdf(oldname,newname)
+ local convert = figures.programs.convert
+ runprogram (
+ "convert %s %s",
+ convert.command, makeoptions(convert.options), oldname, newname
+ )
+end
+
+gifconverter.default = gifconverter.pdf
+
+-- todo: lowres
+
+-- -- -- bases -- -- --
+
+figures.bases = { }
+figures.bases.list = { } -- index => { basename, fullname, xmlroot }
+figures.bases.used = { } -- [basename] => { basename, fullname, xmlroot } -- pointer to list
+figures.bases.found = { }
+figures.bases.enabled = false
+
+local bases = figures.bases
+
+function bases.use(basename)
+ if basename == "reset" then
+ bases.list, bases.used, bases.found, bases.enabled = { }, { }, { }, false
+ else
+ basename = file.addsuffix(basename,"xml")
+ if not bases.used[basename] then
+ local t = { basename, nil, nil }
+ bases.used[basename] = t
+ bases.list[#bases.list+1] = t
+ if not bases.enabled then
+ bases.enabled = true
+ xml.registerns("rlx","http://www.pragma-ade.com/schemas/rlx") -- we should be able to do this per xml file
+ end
+ if trace_bases then
+ commands.writestatus("figures","registering base '%s'",basename)
+ end
+ end
+ end
+end
+
+function bases.find(basename,askedlabel)
+ if trace_bases then
+ commands.writestatus("figures","checking for '%s' in base '%s'",askedlabel,basename)
+ end
+ basename = file.addsuffix(basename,"xml")
+ local t = bases.found[askedlabel]
+ if t == nil then
+ local base = bases.used[basename]
+ local page = 0
+ if base[2] == nil then
+ -- no yet located
+ local figurepaths = figures.paths
+ for i=1,#figurepaths do
+ local path = figurepaths[i]
+ local xmlfile = path .. "/" .. basename
+ if io.exists(xmlfile) then
+ base[2] = xmlfile
+ base[3] = xml.load(xmlfile)
+ if trace_bases then
+ commands.writestatus("figures","base '%s' loaded",xmlfile)
+ end
+ break
+ end
+ end
+ end
+ t = false
+ if base[2] and base[3] then -- rlx:library
+ for e in xml.collected(base[3],"/(*:library|figurelibrary)/*:figure/*:label") do
+ page = page + 1
+ if xml.text(e) == askedlabel then
+ t = {
+ base = file.replacesuffix(base[2],"pdf"),
+ format = "pdf",
+ name = xml.text(e,"../*:file"), -- to be checked
+ page = page,
+ }
+ bases.found[askedlabel] = t
+ if trace_bases then
+ commands.writestatus("figures","figure '%s' found in base '%s'",askedlabel,base[2])
+ end
+ return t
+ end
+ end
+ if trace_bases and not t then
+ commands.writestatus("figures","figure '%s' not found in base '%s'",askedlabel,base[2])
+ end
+ end
+ end
+ return t
+end
+
+-- we can access sequential or by name
+
+function bases.locate(askedlabel)
+ local list = bases.list
+ for i=1,#list do
+ local entry = list[i]
+ local t = bases.find(entry[1],askedlabel)
+ if t then
+ return t
+ end
+ end
+ return false
+end
+
+function figures.identifiers.base(data)
+ if bases.enabled then
+ local dr, du, ds = data.request, data.used, data.status
+ local fbl = bases.locate(dr.name or dr.label)
+ if fbl then
+ du.page = fbl.page
+ du.format = fbl.format
+ du.fullname = fbl.base
+ ds.fullname = fbl.name
+ ds.format = fbl.format
+ ds.page = fbl.page
+ ds.status = 10
+ end
+ end
+ return data
+end
+
+figures.identifiers.list = {
+ figures.identifiers.base,
+ figures.identifiers.default
+}
+
+-- tracing
+
+statistics.register("graphics processing time", function()
+ local n = figures.n
+ if n > 0 then
+ return format("%s seconds including tex, n=%s", statistics.elapsedtime(figures),n)
+ else
+ return nil
+ end
+end)
diff --git a/tex/context/base/grph-inc.mkii b/tex/context/base/grph-inc.mkii
new file mode 100644
index 000000000..1bd7544d8
--- /dev/null
+++ b/tex/context/base/grph-inc.mkii
@@ -0,0 +1,1243 @@
+%D \module
+%D [ file=grph-inc, % moved from core-fig
+%D version=2006.08.26, % overhaul of 1997.03.31
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Figure Inclusion,
+%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 Graphic Macros / Figure Inclusion}
+
+% todo: directory : system -> \allinputpaths (so that we can \usesubpath)
+
+%D This is a reimplementation of the original module, which
+%D over time had evolved into a pretty complex whole. This
+%D was partly due to the fact that we needed to handle many
+%D formats, deal with substitute graphics, handle fallbacks
+%D and driver specifics (objects), etc. In the meantime we
+%D have more clever backends, moved away from texutil to
+%D rlxtools, can use runtime or betweentime runs etc. Also,
+%D more memory permits a cleaner implementation. Time to
+%D move on. We can now also assume that scaling is available.
+%D
+%D Another mess that can go is the llx/lly handling since
+%D drivers now automatically can determine such things.
+
+%D Messages 3 and 5 needs to be translated!
+
+\unprotect
+
+%D Due to the mere fact that \DVI|/|\PDF\ drivers differ in their
+%D needs for figure dimensions, we have to provide the width,
+%D height, horizontal and vertical scale. Also we want to
+%D specify at the user level either width and|/|or height, scale,
+%D or a factor related to the current document bodyfont size.
+%D Even better: we can also specify isometric scaling and
+%D automatically let \CONTEXT\ calculate the maximum possible
+%D dimensions. Whatever we calculate, the results will come
+%D available in the next registers.
+
+\letempty \@@DriverImageBox
+\letempty \@@DriverImageOptions
+\letempty \@@DriverImageWidth
+\letempty \@@DriverImageHeight
+\letempty \@@DriverImageFile
+\letempty \@@DriverImageLabel
+\letempty \@@DriverImageType
+\letempty \@@DriverImageMethod
+\letempty \@@DriverImagePage
+
+%D Because looking for dimensions can take many steps (locating
+%D the figure, maybe on more directories, scanning the figure
+%D on dimension, or when not found, trying to find them in the
+%D utility file, and again when not found, trying to generate
+%D such a file, and, as a last resort, trying to use the
+%D dimensions. Now when things do not work out the way we want,
+%D we can set a switch and get some information on what takes
+%D place.
+
+\newif\iftraceexternalfigures
+
+\let\traceexternalfigures\traceexternalfigurestrue
+
+\def\doshowfigurestate
+ {\iftraceexternalfigures
+ \expandafter\writestatus\expandafter\m!figures
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doshowfiguremessage
+ {\iftraceexternalfigures
+ \expandafter\gobbletwoarguments
+ \else
+ \expandafter\showmessage\expandafter\m!figures
+ \fi}
+
+%D Another switch tells \CONTEXT\ to locate and calculate a
+%D figure, but does not actually insert it. Especially when we
+%D use \PDFTEX\ this saves a lot of time on trialruns. (Keep
+%D in mind that \PDFTEX\ is both a \TEX\ pre|| and postprocessor.)
+
+\newif\ifskipexternalfigures % can be set elsewhere
+
+% \newif\ifrunutilityfile
+% \newif\ifconsultutilityfile
+%
+% Let's save two hash entries:
+
+\let\runutilityfiletrue \relax \let\runutilityfilefalse \relax
+\let\consultutilityfiletrue\relax \let\consultutilityfilefalse\relax
+
+%D Intermediate, private.
+
+\newdimen\determinedfigurewidth
+\newdimen\determinedfigureheight
+
+\let\naturalfigureheight\!!zeropoint
+\let\naturalfigurewidth \!!zeropoint
+
+\def\defaultfigurewidth {8\lineheight}
+\def\defaultfigureheight{6\lineheight}
+
+\def\defaultfigurepathsignal{(\v!default)}
+
+\def\checknaturalfiguredimensions
+ {\edef\naturalfigurewidth{\the\dimexpr\ifzeropt\determinedfigurewidth
+ \defaultfigurewidth \else\determinedfigurewidth \fi\relax}%
+ \edef\naturalfigureheight{\the\dimexpr\ifzeropt\determinedfigureheight
+ \defaultfigureheight\else\determinedfigureheight\fi\relax}}
+
+%D Locating figures. Dilemma: we do support eps and svg parsing but drivers
+%D don't always support it.
+
+\def\figuretypes{\c!mps,\c!pdf,\c!eps,\c!svg,\c!svg z,\c!png,\c!tif,jb2,\c!jpg}
+
+\def\supportedfiguretypes{\figuretypes}
+
+\def\checksupportedfiguretypes
+ {\begingroup
+ \global\let\supportedfiguretypes\empty
+ \def\docommand##1%
+ {\doiffileinsertionsupportedelse{##1}
+ {\doglobal\addtocommalist{##1}\supportedfiguretypes}
+ \donothing}%
+ \processcommacommand[\figuretypes]\docommand
+ \gdef\checksupportedfiguretypes{\let\figuretypes\supportedfiguretypes}%
+ \endgroup
+ \checksupportedfiguretypes}
+
+%D The next box is used to store the graphic. It's globally assigned.
+
+\newbox\foundexternalfigure
+
+\chardef\figurestatus\zerocount % nothing found
+
+\def\noffigurepages{\nofinsertpages}
+
+%D Variables.
+
+\newtoks\everyexternalfigureresets
+
+\def\resetfigurevariables
+ {\the\everyexternalfigureresets}
+
+%D Example usage:
+
+\appendtoks
+ \global\let\externalfigurelog\empty
+\to\everyexternalfigureresets
+
+%D Intermediate, private
+
+\def\resetprivatefigurevariables
+ {\let \wantedfigurefull \empty
+ \let \wantedfigurepath \empty
+ \let \wantedfigurename \empty
+ \let \wantedfigurebase \empty
+ \let \wantedfiguretype \empty
+ \let \wantedfigurefullname \empty
+ \let \wantedfiguretypespec \empty
+ \let \wantedfiguremethod \empty
+ \let \wantedfigurepage \empty
+ \let \wantedfigureoptions \empty
+ \let \wantedfigureconversion\empty
+ \let \wantedfigureprefix \empty
+ \let \wantedfiguretypelist \figuretypes
+ \let \figurepathlist \empty
+ \chardef \figurestatus \zerocount
+ \let \expandedfigurename \empty
+ \global\let \analyzedfigurewidth \!!zeropoint % set by indentifying code
+ \global\let \analyzedfigureheight \!!zeropoint % set by indentifying code
+ \global\setbox\foundexternalfigure \emptybox
+ \def \frozenfigurestamp {\externalfigurestamp}} % no edef
+
+\resetprivatefigurevariables
+
+\appendtoks
+ \resetprivatefigurevariables
+\to\everyexternalfigureresets
+
+%D Private/public.
+
+\def\resetpublicfigurevariables
+ {\let\figurewidth \!!zeropoint
+ \let\figureheight \!!zeropoint
+ \let\figurenaturalwidth \!!zeropoint
+ \let\figurenaturalheight \!!zeropoint
+ \let\figurelabel \empty
+ \let\figurefileoriginal \empty
+ \let\figurefileoptions \empty
+ \let\figurefilename \empty
+ \let\figurefiletype \empty
+ \let\figurefilepage \!!zerocount
+ \let\figurefileconversion\empty
+ \let\figurefileprefix \empty
+ \let\figurefilepath \empty
+ \let\figurefilecache \empty}
+
+\resetpublicfigurevariables
+
+\appendtoks
+ \resetpublicfigurevariables
+\to\everyexternalfigureresets
+
+\newcounter\figurenestinglevel
+
+\def\pushpublicfigurevariables
+ {\ifcase\figurenestinglevel\else
+ \doshowfigurestate{variables : push}%
+ \globalpushmacro\figurewidth
+ \globalpushmacro\figureheight
+ \globalpushmacro\figurenaturalwidth
+ \globalpushmacro\figurenaturalheight
+ \globalpushmacro\figurelabel
+ \globalpushmacro\figurefileoriginal
+ \globalpushmacro\figurefileoptions
+ \globalpushmacro\figurefilename
+ \globalpushmacro\figurefiletype
+ \globalpushmacro\figurefilepage
+ \globalpushmacro\figurefileconversion
+ \globalpushmacro\figurefileprefix
+ \globalpushmacro\figurefilepath
+ \globalpushmacro\figurefilecache
+ \fi}
+
+\def\poppublicfigurevariables
+ {\ifcase\figurenestinglevel\else
+ \doshowfigurestate{variables : pop}%
+ \globalpopmacro\figurefilecache
+ \globalpopmacro\figurefilepath
+ \globalpopmacro\figurefileprefix
+ \globalpopmacro\figurefileconversion
+ \globalpopmacro\figurefilepage
+ \globalpopmacro\figurefiletype
+ \globalpopmacro\figurefilename
+ \globalpopmacro\figurefileoptions
+ \globalpopmacro\figurefileoriginal
+ \globalpopmacro\figurelabel
+ \globalpopmacro\figurenaturalheight
+ \globalpopmacro\figurenaturalwidth
+ \globalpopmacro\figureheight
+ \globalpopmacro\figurewidth
+ \fi}
+
+\def\setpublicfigurevariables % todo: type vs typespec
+ {\xdef\figurewidth {\the\wd\foundexternalfigure}%
+ \xdef\figureheight {\the\ht\foundexternalfigure}%
+ \xdef\figurenaturalwidth {\naturalfigurewidth}%
+ \xdef\figurenaturalheight {\naturalfigureheight}%
+ \xdef\figurelabel {\wantedfigurelabel}%
+ \xdef\figurefilepath {\wantedfigurepath}%
+ \xdef\figurefilename {\wantedfigurename}%
+ \xdef\figurefiletype {\wantedfiguretypespec}%
+ \xdef\figurefilepage {\wantedfigurepage}%
+ \xdef\figurefileoptions {\wantedfigureoptions}%
+ \xdef\figurefileconversion{\wantedfigureconversion}%
+ \xdef\figurefilecache {\wantedconversioncache}%
+ \xdef\figurefileprefix {\wantedconversionprefix}%
+ \xdef\figurefileoriginal {\wantedconversionname}%
+ \xdef\figurefullname {\wantedfigurepath/\wantedfigurename.\wantedfiguretypespec}%
+ \ifcase\figurestatus
+ \let\figurefiletype\empty % ?
+ \fi}
+
+\def\setpublicfigurescalevariables
+ {\edef\figurescalewidth {\finalscaleboxwidth }%
+ \edef\figurescaleheight {\finalscaleboxheight}%
+ \edef\figurescalexscale {\finalscaleboxxscale}%
+ \edef\figurescaleyscale {\finalscaleboxyscale}}
+
+\def\resetpublicfigurescalevariables
+ {\let\figurescalewidth \!!zeropoint
+ \let\figurescaleheight \!!zeropoint
+ \let\figurescalexscale \!!plusone
+ \let\figurescaleyscale \!!plusone}
+
+\resetpublicfigurescalevariables
+
+\appendtoks
+ \resetpublicfigurescalevariables
+\to \everyexternalfigureresets
+
+%D The next one is for instance used in symbols. Since
+%D we only need to reset some parameters, we can
+%D better use the fast alternative:
+%D
+%D \starttyping
+%D \def\resetexternalfigures
+%D {\getparameters[\??ef]
+%D [\c!option=,\c!maxwidth=,\c!maxheight=,
+%D \c!foregroundcolor=,\c!color=,
+%D %\c!conversion=,\c!prefix=,\c!splitcolor=,
+%D \c!frame=\v!off,\c!background=]}
+%D \stoptyping
+%D
+%D This one dropped the runtime of the \MAPS\ bibliography
+%D from over 110 seconds down to less than 105 seconds. The
+%D tremendously faster (but uglier) implementation is:
+
+\def\resetexternalfigures
+ {\let\@@efoption \empty % \let\@@efprefix\empty
+ \let\@@efmaxwidth \empty % \let\@@efcache \empty
+ \let\@@efmaxheight \empty % \let\@@efframe \v!off
+ \let\@@efforegroundcolor\empty
+ \let\@@efcolor \empty
+ \let\@@efconversion \empty
+ \let\@@efbackground \empty}
+
+%D The following code will move:
+
+\appendtoks \resetexternalfigures \to \everyoverlay
+\appendtoks \resetexternalfigures \to \everybeforepagebody % not really needed
+%appendtoks \resetexternalfigures \to \everysymbol
+
+%D We need this one for bookkeeping:
+
+\newcounter\forcedMPSobject % better something \every<type>
+
+%D Features:
+
+% converted -> prefix, suffix
+% alternative -> other suffix
+% buffer -> prefix
+
+%D Still messy:
+
+\newtoks\everyfiguretypepresets
+
+\def\presetfiguretypeprocessing
+ {\the\everyfiguretypepresets}
+
+\def\presetspecialfigure#1%
+ {\doif\wantedfiguretype{#1}%
+ {\let\@@efobject\v!no
+ \let\@@efpreset\v!no
+ \ifx\@@efwidth \empty\def\@@efwidth {\defaultfigurewidth }\fi
+ \ifx\@@efheight\empty\def\@@efheight{\defaultfigureheight}\fi}}
+
+\appendtoks
+ \presetspecialfigure\c!mov
+ \presetspecialfigure\c!avi
+\to \everyfiguretypepresets
+
+\def\checkformpsfigurefiles % to be checked
+ {\doif\wantedfigurename{mprun}
+ {\doshowfigurestate{type check : forcing mps (mprun)}%
+ \doifnotinstring{^\bufferprefix}{^\wantedfigurename}
+ {\edef\wantedfigurename{\bufferprefix\wantedfigurename}}%
+ \let\wantedfiguremethod \c!mps
+ \let\wantedfiguretypespec\c!mps}%
+ \doifnumberelse\wantedfiguretype
+ {\doshowfigurestate{type check : forcing mps (number)}%
+ \let\wantedfiguremethod \c!mps
+ \let\wantedfiguretypespec\c!mps}
+ \donothing
+ \doif\wantedfiguretypespec\c!mps
+ {\let\wantedfiguretypelist\wantedfiguretypespec
+ \ifcase\EPSspecial\else\ifinobject\else
+ \doglobal\increment\forcedMPSobject
+ \edef\externalfigurestamp{\c!mps::\forcedMPSobject}%
+ \let\@@efobject\v!yes
+ \fi\fi}}
+
+\appendtoks
+ \checkformpsfigurefiles
+\to \everyfiguretypepresets
+
+\def\checkfortexfigurefiles % to be checked (brrr: c!) / brrr: eftype
+ {\doifinset\wantedfiguretype{\c!tex,\c!tmp}
+ {\let\wantedfiguretypespec \wantedfiguretype}%
+ \doifinset\wantedfiguretypespec{\c!tex,\c!tmp,\v!buffer}
+ {\doshowfigurestate{type check : forcing tex (\wantedfiguretypespec)}%
+ \let\wantedfiguretypelist\wantedfiguretypespec
+ \let\wantedfiguremethod \c!tex
+ \let\@@efobject\v!no
+ \doifnothing\wantedfiguretype{\let\wantedfiguretype\c!tmp}%
+ % there can be a non buffer \jobname.tmp (made by texexec)
+ \doifnotinstring{^\bufferprefix}{^\wantedfigurename}
+ {\edef\wantedfigurename{\bufferprefix\wantedfigurename}}}}
+
+\appendtoks
+ \checkfortexfigurefiles
+\to \everyfiguretypepresets
+
+\def\checkforunknownfigurefiles
+ {\doifnothing\wantedfiguretype
+ {\dogetcommacommandelement\plusone\from\@@eftype\to\commalistelement
+ \edef\wantedfigurefullname{\wantedfigurename.\commalistelement}}}
+
+\appendtoks
+ \checkforunknownfigurefiles
+\to \everyfiguretypepresets
+
+% note * : this is needed because reusable graphics
+% combined with funny page aspect aspect ratio's can lead to
+% strange side effects of preceding factor=max specs. This
+% surfaced in the metafun manual, where the two side by
+% side clipped cow heads [the second one was a reused object]
+% where the second one inherited some characteristics from
+% the factor=max one some 30 pages back. Sigh.
+
+\chardef\splitexternalfigure\zerocount % 0 nosplit 1 split/yes 2 split/no
+
+\def\checkfigurecolorsettings
+ {% seperation, seldom used
+ \doifseparatingcolorselse
+ {\let\@@efforegroundcolor\empty
+ \doifelsenothing\@@efsplit
+ {\chardef\splitexternalfigure\zerocount}
+ {\doifcolorchannelelse\@@efsplit
+ {\let\@@efobject\v!no % why?
+ \chardef\splitexternalfigure\plusone}
+ {\chardef\splitexternalfigure\plustwo}}}
+ {\chardef\splitexternalfigure\zerocount}%
+ % fake color in gray bitmaps, assumes that
+ % a transparent color is used
+ \doifsomething\@@efforegroundcolor
+ {\def\@@efbackground{\v!foreground,\v!color}%
+ \def\@@efbackgroundcolor{\@@efforegroundcolor}}%
+ \doifsomething\@@efcolor
+ {\doifcolorelse\@@efcolor
+ {\checkpredefinedcolor[\@@efcolor]%
+ \doregisterfigurecolor\@@efcolor}}%
+ \donothing}
+
+\def\setextrafiguredriveroptions
+ {\let\@@DriverImageOptions\empty
+ \doifsomething\@@efpage {\addtocommalist\@@efpage \@@DriverImageOptions}%
+ \doif \@@efpreview \v!yes{\addtocommalist\v!preview \@@DriverImageOptions}%
+ \doif \@@efcontrols\v!yes{\addtocommalist\v!controls\@@DriverImageOptions}%
+ \doif \@@efrepeat \v!yes{\addtocommalist\v!repeat \@@DriverImageOptions}%
+ \doifinsetelse\@@efsize{mediabox,cropbox,artbox,bleedbox,trimbox}
+ {\let \@@DriverImageBox \@@efsize}%
+ {\doifinsetelse\@@efsize{media,crop,art,bleed,trim}
+ {\edef\@@DriverImageBox{\@@efsize box}}%
+ {\let \@@DriverImageBox \empty}}%
+ \let\wantedfigureoptions\@@DriverImageOptions}
+
+\def\checkiffigureobjectpresent
+ {\doifnot\@@efobject\v!no
+ {\doifobjectssupportedelse
+ {\doifobjectfoundelse{FIG}\externalfigurestamp
+ {\doshowfigurestate{object found : \externalfigurestamp}%
+ \getobjectdimensions{FIG}\externalfigurestamp
+ \edef\frozenfigurestamp{\externalfigurestamp}%
+ \xdef\analyzedfigurewidth {\the\dimexpr\objectwidth \relax}%
+ \xdef\analyzedfigureheight{\the\dimexpr\objectheight\relax}%
+ \setanalyzedfiguredimensions\plusone}
+ {\doshowfigurestate{unknown object: \externalfigurestamp}}}
+ {}}}
+
+\def\checkifknownfigureobjectpresent
+ {\ifx\wantedfiguretype\empty
+ \let\savedwantedfiguretype\wantedfiguretype
+ \def\docommand##1%
+ {\ifcase\figurestatus
+ \edef\wantedfiguretype{##1}%
+ \checkiffigureobjectpresent
+ \fi}%
+ \processcommacommand[\figuretypes]\docommand
+ \ifcase\figurestatus
+ \let\wantedfiguretype\savedwantedfiguretype
+ \fi
+ \fi}
+
+\def\checkforfigurefile
+ {\ifcase\figurestatus
+ \ifconditional\externalfigureflush
+ \analyzefigurefiles
+ \fi
+ \fi}
+
+\def\externalfigurestamp % needs \edef'd macros!
+ {\ifx\wantedfigurepath\empty\else
+ -\wantedfigurepath
+ \fi
+ \wantedfigurename
+ \ifx\wantedfiguretype\empty\else
+ \ifx\wantedfiguretype\s!unknown\else
+ -\wantedfiguretype
+ \fi
+ \fi
+ \ifx\wantedfiguretypespec\empty\else
+ \ifx\wantedfiguretypespec\s!unknown\else
+ \ifx\wantedfiguretypespec\wantedfiguretype\else
+ -\wantedfiguretypespec
+ \fi
+ \fi
+ \fi
+ \ifnum\wantedfigurepage>\zeropoint
+ -\wantedfigurepage
+ \fi}
+
+\def\checkfigurerenderingoptions
+ {\ifcase\figurestatus
+ \let\@@efframe\v!on
+ \fi
+ \doif\@@exoption\v!frame
+ {\let\@@efframe\v!on}%
+ \doif\@@exoption\v!empty
+ {\skipexternalfigurestrue
+ \let\@@efframe\v!off}}
+
+\newtoks\externalfigurepostprocessors
+
+\def\resetfigureusersettings
+ {\let\@@eftype \s!unknown \let\@@efmethod \empty \let\@@efpreset\v!yes
+ \let\@@eflabel \empty \let\@@efsize \empty \let\@@efpage \!!zerocount
+ \let\@@efobject \@@exobject \let\@@efdisplay \empty
+ \let\@@efsplit \empty \let\@@efcolor \empty \let\@@efsymbol\v!no
+ \let\@@efcontrols \v!no \let\@@efpreview \v!no \let\@@efrepeat\v!no
+ \let\@@efhfactor \empty \let\@@efwfactor \empty \let\@@effactor\empty
+ \let\@@efmaxwidth \@@exmaxwidth \let\@@efmaxheight\@@exmaxheight
+ \let\@@efxscale \empty \let\@@efyscale \empty \let\@@efscale \empty
+ \let\@@efsx \!!plusone \let\@@efsy \!!plusone
+ \let\@@efwidth \empty \let\@@efheight \empty
+ \let\@@eflines \empty \let\@@efgrid \empty
+ \let\@@efconversion\@@exconversion \let\@@efprefix \@@exprefix \let\@@efcache \@@excache}
+
+%D Types and Methods are a bit history. Anyhow, user scan use the
+%D type to force the handler. So, what to do with the method. We can
+%D use that one to force a handler with a given suffix, so when no
+%D type is given, but a suffix is part of the name, the method will
+%D determine the handler.
+
+\def\checkfigureusersettings
+ {\doif\@@efreset\v!yes\resetexternalfigures
+ \doifelsenothing\@@eflabel
+ {\doifnothing\wantedfigurelabel{\let\wantedfigurelabel\wantedfigurename}}%
+ {\let\wantedfigurelabel\@@eflabel}%
+ \doifsomething\@@eftype
+ {\doifnot\@@eftype\s!unknown
+ {\edef\wantedfiguretypespec{\@@eftype}%
+ \let\wantedfiguremethod\wantedfiguretypespec}}%
+ \doifnothing\wantedfigurepage % can be set by plug in
+ {\let\wantedfigurepage\@@efpage}%
+ \doif\wantedfigurepage\empty
+ {\let\wantedfigurepage\!!zerocount}% 0 is signal !
+ \doifsomething\@@efmethod % rather untested misusage of the remapper
+ {\doifsomething\wantedfiguretype
+ {\definegraphictypesynonym[\wantedfiguretype][\@@method]}}}
+
+% #1 is now obsolete
+
+\def\calculateexternalfigure[#1][#2][#3][#4][#5][#6]% \cmd label filename parent_id preset current
+ {\doshowfigurestate{begin}%
+ \dontcomplain
+ % let's limit the search, which means that e.g. svg has to be given explicitly
+ \checksupportedfiguretypes
+ % recently added; we presume local use
+ \restorecatcodes
+ % collected resets (token list)
+ \resetfigurevariables
+\resetwantedconversionvariables % new here
+ % analyze filename and set wanted variables
+ \analyzefigurefilename{#3}{#2}%
+ \doanalyzefiguredimensionsfromfile
+ % handle user settings
+ \resetfigureusersettings
+ \dosetefparameters{#4}{#5}{#6}%
+ \checkfigureusersettings
+ \checkfigurecolorsettings
+ % adapt settings based on suffix and/or type
+ \presetfiguretypeprocessing
+ % now we really start
+ \checkiffigureobjectpresent % first guess, we may not yet know the typespec
+ \checkifknownfigureobjectpresent
+ \checkforfigurefilepresence
+ \checkiffigureobjectpresent % to be sure, in case we now know the typespec
+ \checkfigurerenderingoptions % was later, moved here
+ \checknaturalfiguredimensions % inherit from global values and/or fallbacks
+ % by now we know what we're dealing with (put in box and scale)
+ \setextrafiguredriveroptions
+ \prepackageexternalfigureobject
+ % set public variables in case postprocessing needs them
+ \pushpublicfigurevariables
+ \setpublicfigurevariables
+ \setpublicfigureconversionvariables
+ \setpublicfigurescalevariables
+ % package final graphic, only now we can apply backgrounds and such
+ \doglobal\increment\figurenestinglevel
+ \finishexternalfigure
+ \doglobal\decrement\figurenestinglevel
+ % restore variables
+ \poppublicfigurevariables
+ \doshowfigurestate{end}}
+
+\def\checkforfigurefilepresence
+ {\checkforconvertedfigure
+ \checkforfigurefile}
+
+%D Figure objects.
+
+\def\setfigureobject
+ {\doshowfigurestate{object set : \externalfigurestamp}%
+ \setobject{FIG}\externalfigurestamp}
+
+% \def\getfigureobject
+% {\doshowfigurestate{object used : \externalfigurestamp}%
+% \getobject{FIG}\externalfigurestamp}
+
+\def\getfigureobject
+ {\doshowfigurestate{object used : \frozenfigurestamp}%
+ \getobject{FIG}\frozenfigurestamp}
+
+\def\prepackageexternalfigureobject
+ {\ifcase\figurestatus
+ \doshowfiguremessage1\expandedfigurename
+ \doshowfigurestate{state : figure not found (\expandedfigurename)}%
+ \global\setbox\foundexternalfigure\naturalvbox
+ {\doscalebox\??ef{\blackrule[\c!width=\naturalfigurewidth,\c!height=\naturalfigureheight]}}%
+ \xdef\noffigurepages{0}%
+ \or
+ \doshowfiguremessage8\expandedfigurename
+ \doshowfigurestate{state : reusing existing figure}%
+ \global\setbox\foundexternalfigure\naturalvbox
+ {\doscalebox\??ef{\dowithfigure{\getfigureobject}}}%
+ \xdef\noffigurepages{\number\getvalue{\externalfigurestamp\c!n}}%
+ \or
+ \doshowfiguremessage2\expandedfigurename
+ \doshowfigurestate{state : using special figure}%
+ \setbox\scratchbox\naturalvbox % make a dummy
+ {\doscalebox\??ef{\blackrule[\c!width=\naturalfigurewidth,\c!height=\naturalfigureheight]}}%
+ \global\setbox\foundexternalfigure\naturalvbox to \finalscaleboxheight
+ {\vfill
+ \hsize\finalscaleboxwidth
+ \dowithfigure{\insertscaledfiguredriverdata}}%
+ \xdef\noffigurepages{\number\nofinsertpages}%
+ \else
+ \ifdim\naturalfigurewidth>\zeropoint
+ \ifnum\figurestatus>\!!ten\relax
+ \doshowfiguremessage3\expandedfigurename
+ \else
+ \doshowfiguremessage4\expandedfigurename
+ \fi
+ \else
+ \doshowfiguremessage5\expandedfigurename
+ \fi
+ \doshowfigurestate{state : using found figure}% 3=self 4=rlx
+ \doifelse\@@efobject\v!no
+ {\donefalse}
+ {\doifobjectssupportedelse\donetrue\donefalse}%
+ \ifdone
+ % make an object and use it
+ \packageexternalfigureobject
+ \setfigureobject\vbox{\box\foundexternalfigure}%
+ \setxvalue{\externalfigurestamp\c!n}{\number\nofinsertpages}%
+ \global\setbox\foundexternalfigure\naturalvbox
+ {\doscalebox\??ef{\dowithfigure{\getfigureobject}}}%
+ \xdef\noffigurepages{\number\getvalue{\externalfigurestamp\c!n}}%
+ \else
+ % maybe a tex figure
+ \global\setbox\foundexternalfigure\naturalvbox
+ {\doscalebox\??ef{\dowithfigure{\box\foundexternalfigure}}}%
+ \xdef\noffigurepages{\number\nofinsertpages}%
+ \fi
+ \fi
+ \global\wd\foundexternalfigure\finalscaleboxwidth
+ \global\ht\foundexternalfigure\finalscaleboxheight
+ \global\let\lastfigureobjectname\externalfigurestamp
+ \doresetobjects} % clean up driver left overs
+
+\def\packageexternalfigureobject
+ {\global\setbox\foundexternalfigure\vbox to \naturalfigureheight
+ {\vfill
+ \ifdim\wd\foundexternalfigure=\zeropoint
+ \setextrafiguredriveroptions
+ \insertunscaledfiguredriverdata
+ \else\ifskipexternalfigures
+ \ruledhbox{\backgroundline[\@@efsplitcolor]{\fakebox\foundexternalfigure}}%
+ \else
+ \box\foundexternalfigure
+ \fi\fi}%
+ \wd\foundexternalfigure\naturalfigurewidth
+ \ht\foundexternalfigure\naturalfigureheight}
+
+\def\finishexternalfigure % here we use \figurevariables
+ {\global\setbox\foundexternalfigure\vbox
+ {\forgetall
+ \ifcase\figurestatus
+ \resetsystemmode\v!figure % todo, also: \v!resource
+ \else
+ \setsystemmode \v!figure % todo, also: \v!resource
+ \fi
+ \ifconditional\externalfigureflush
+ \ifconditional\externalfigurelevel % probably background
+ \ifskipexternalfigures
+ % nothing
+ \fakebox\foundexternalfigure
+ \else\ifcase\figurestatus
+ % nothing
+ \else\ifnum\splitexternalfigure=\plustwo\else
+ \the\externalfigurepostprocessors
+ \box\foundexternalfigure
+ \fi\fi\fi
+ \else
+ \iftrialtypesetting \else \feedbackexternalfigure \fi
+ \settrue\externalfigurelevel
+ \ifskipexternalfigures
+ \ifcase\figurestatus
+ \externalfigurereplacement\figurelabel\figurefilename{unknown}%
+ \else
+ \externalfigurereplacement\figurelabel\figurefullname{skipped}%
+ \fi
+ \else\ifcase\figurestatus
+ \externalfigurereplacement\figurelabel\figurefilename{unknown}%
+ \else\ifnum\splitexternalfigure=\plustwo
+ \backgroundline[\@@efsplitcolor]{\fakebox\foundexternalfigure}%
+ \else
+ \the\externalfigurepostprocessors
+ \doifelse\@@efreset\v!yes
+ {\wd\foundexternalfigure\figurewidth
+ \ht\foundexternalfigure\figureheight
+ \dp\foundexternalfigure\zeropoint
+ \box\foundexternalfigure}
+ {\localframed % should also be applied to high res !
+ [\??ef]
+ [\c!offset=\v!overlay,
+ \c!width=\figurewidth,
+ \c!height=\figureheight]
+ {\vfilll
+ \ifnum\splitexternalfigure=\plusone
+ % hm, eigenlijk in dit geval achtergrondkleur
+ \hidesplitcolorfalse % really needed
+ \backgroundline[\@@efsplitcolor]{\box\foundexternalfigure}%
+ \else % = 0, no split mode
+ \box\foundexternalfigure
+ \fi}}%
+ \fi\fi\fi
+ \fi
+ \else
+ % maybe also \the\externalfigurepostprocessors
+ \iftrialtypesetting \else \feedbackexternalfigure \fi
+ \fi}}
+
+\def\insertfiguredriverdata#1#2%
+ {\lowercasestring\wantedfiguretypespec\to\lcwantedfiguretypespec
+ \lowercasestring\wantedfiguremethod \to\lcwantedfiguremethod
+ \edef\@@DriverImageWidth {\the\dimexpr#1\relax}%
+ \edef\@@DriverImageHeight{\the\dimexpr#2\relax}%
+ \let \@@DriverImageFile \wantedfigurefullname
+ \let \@@DriverImageType \lcwantedfiguretypespec
+ \let \@@DriverImageMethod \lcwantedfiguremethod
+ \let \@@DriverImageLabel \wantedfigurelabel
+ \let \@@DriverImagePage \wantedfigurepage
+ \doinsertfile}
+
+\def\insertunscaledfiguredriverdata
+ {\insertfiguredriverdata\naturalfigurewidth\naturalfigureheight}
+
+\def\insertscaledfiguredriverdata
+ {\insertfiguredriverdata\finalscaleboxwidth\finalscaleboxheight}
+
+\ifx\externalfigurereplacement\undefined\let\externalfigurereplacement\gobblethreearguments\fi
+\ifx\externalfigureplaceholder\undefined\let\externalfigureplaceholder\gobblethreearguments\fi
+
+\def\registerexternalfigure % no placement, handy for preprocessing
+ {\dotripleempty\doregisterexternalfigure}
+
+\def\doregisterexternalfigure[#1][#2][#3]%
+ {\bgroup
+ \setfalse\externalfigureflush
+ \externalfigure[#1][#2][#3]% or \doexternalfigure
+ \egroup}
+
+\let\feedbackexternalfigure\relax % \gobblefourarguments
+\let\dowithfigure \relax
+
+%D Conversion stuff:
+
+\newcount\nofconversionfigures
+
+\def\resetwantedconversionvariables
+ {\let\wantedconversionpath \empty % these point to the to be converted graphic
+ \let\wantedconversionname \empty
+ \let\wantedconversiontype \empty
+ \let\wantedconversioncache \empty
+ \let\wantedconversionprefix\empty}
+
+\resetwantedconversionvariables
+
+\def\checkforconvertedfigure
+ {\ifcase\figurestatus
+ \resetwantedconversionvariables
+ \doifsomething\@@efconversion
+ {\global\advance\nofconversionfigures\plusone
+ \doshowfigurestate{n-of-conversions : \number\nofconversionfigures}%
+ \edef\wantedfigureconversion{\@@efconversion}%
+ \edef\wantedconversioncache {\@@efcache}%
+ \edef\wantedconversionprefix{\@@efprefix}%
+ \doshowfigurestate{checking paths : \figurepathlist}%
+ \processcommacommand[\figurepathlist]\dolocatefigureconversionfile
+ \ifcase\figurestatus
+ \doshowfigurestate{remark : no conversion file found}%
+ \else
+ \doshowfigurestate{remark : conversion file found}%
+ \chardef\figurestatus\zerocount
+ \fi
+ \let\wantedconversionname\wantedfigurename
+ \edef\wantedfigurename{\wantedconversionprefix\wantedfigurename}%
+ \ifx\wantedconversioncache\empty
+ \let \wantedfigurepath \wantedconversionpath
+ \else
+ \checkfilename\@@efcache
+ \ifnum\kindoffile=\plusone
+ \let\wantedfigurepath\@@efcache % root related path
+ \else % brrr
+ \edef\wantedfigurepath{\@@efcache,\wantedconversionpath/\@@efcache}% in case of explicit paths, what a mess
+ \fi
+ \fi
+ \let\wantedfiguretype \empty
+ \let\wantedfiguretypelist\figuretypes % hm, why needed
+ \ifx\figurepathlist\empty
+ \let\figurepathlist\wantedfigurepath
+ \else
+ \edef\figurepathlist{\wantedfigurepath,\figurepathlist}%
+ \fi
+ \doshowfigurestate{conversion path : \wantedconversionpath}%
+ \doshowfigurestate{conversion name : \wantedconversionname}}%
+ \doshowfigurestate{new figure path : \wantedfigurepath}%
+ \fi}
+
+\def\dolocatefigureconversionfile#1%
+ {\ifcase\figurestatus
+ \setwantedfigurefullname{#1}\wantedfigurename\wantedfiguretype
+ \doshowfigurestate{locating original : \wantedfigurefullname}%
+ \doiffile\wantedfigurefullname
+ {\def\wantedconversionpath{#1}%
+ \let\wantedconversionname\wantedfigurename
+ \let\wantedconversiontype\wantedfiguretype
+ \chardef\figurestatus\plusfive}%
+ \fi}
+
+\def\setpublicfigureconversionvariables % also prefix, cache
+ {\doifsomething\@@efconversion
+ {\doifmode{\systemmodeprefix\v!first}
+ {\let\figurefilepath\wantedconversionpath
+ \let\figurefilename\wantedconversionname
+ \let\figurefiletype\wantedconversiontype
+ \let\figurefileconversion\wantedfigureconversion
+ \def\figurefullname
+ {\ifx\wantedconversionpath\empty\else\wantedconversionpath/\fi
+ \wantedconversionname
+ \ifx\wantedconversiontype\empty\else.\wantedconversiontype\fi}}}}
+
+%D In \PDF\ one can specify an alternative graphic. This means
+%D that for instance a low resolution graphic can be used for
+%D viewing and a high res one for printing. Because this
+%D feature depends much on the driver, here we only take care
+%D of perparations. It is up to the special driver to handle
+%D the inclusion. The driver routines can change the content of
+%D box \type {\foundexternalfigure} if suitable.
+%D
+%D One complication is for instance that an alternative may
+%D not itself have an alternative, and these kind of situations
+%D are best handled by the driver.
+
+\let\lastfigureobjectname\empty
+
+%D The next macro does not work well with figure bases yet.
+
+\def\calculateexternalscreenfigure[#1][#2][#3][#4][#5][#6]%
+ {\ifx\@@efdisplay\empty\else
+ \doifnot\@@efobject\v!no
+ {\doifobjectssupportedelse
+ {\doifspecialavailableelse\doregisterfigure
+ {\doshowfigurestate{screen alternative : start}%
+ \bgroup
+ \dosetefparameters{#4}{#5}{#6}%
+ \doregisterfigure{FIG}{\lastfigureobjectname}%
+ \let\@@ef@@scherm\@@efdisplay
+ \calculateexternalfigure[#1][\@@ef@@scherm][\@@ef@@scherm][#4,\c!display=][#5][#6]%
+ \doshowfigurestate{screen alternative : stop}%
+ \egroup}
+ {}}
+ {}}%
+ \fi}
+
+\def\getfiguredimensions
+ {\dodoubleempty\dogetfiguredimensions}
+
+\def\dogetfiguredimensions[#1][#2]%
+ {{\let\immediate\relax % very dirty but prevents flushing, will change
+ \setbox0\hbox{\externalfigure[#1][#2,\c!display=,\c!object=\v!no]}}}
+
+% use the next one when the object must be forgotten (xobj
+% nums can migrate to the next object; maybe it should
+% always be done; todo ....
+
+\def\getfiguredimensionsonly
+ {\dodoubleempty\dogetfiguredimensionsonly}
+
+\def\dogetfiguredimensionsonly[#1][#2]%
+ {\dogetfiguredimensions[#1][#2]%
+ \doresetobjects}
+
+\def\doiffigureelse#1%
+ {\getfiguredimensions[#1]% so data is available !
+ \ifdim\analyzedfigurewidth=\zeropoint % todo: \figurestatus
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D Size determination.
+%D
+%D An analyzer must set the following dimensions (global macros):
+%D
+%D \starttyping
+%D \analyzedfigurewidth
+%D \analyzedfigureheight
+%D \stoptyping
+%D
+%D And afterwards, when succeeded, call:
+%D
+%D \starttyping
+%D \setanalyzedfiguredimensions{number>=10}
+%D \stoptyping
+%D
+%D Numbers upto 9 are reserved for special purposes:
+%D
+%D \starttabulate
+%D \NC 0 \NC not found \NC \NR
+%D \NC 1 \NC object (will be reused) \NC \NR
+%D \NC 2 \NC found but no dimensions (e.g. special annotation) \NC \NR
+%D \stoptabulate
+
+\let\doanalyzefiguredimensionsfromfile\relax % hook for figuredatabase
+\let\doanalyzefiguredimensionsinternal\relax
+\let\doanalyzefiguredimensionsexternal\relax % hook for rli support (see later)
+\let\doanalyzefiguredimensionsfallback\relax
+
+\def\doanalyzefiguredimensions
+ {\lowercasestring\wantedfiguretypespec\to\lcwantedfiguretypespec
+ \doiffileinsertionsupportedelse\lcwantedfiguretypespec
+ {\doiffileelse\wantedfigurefullname
+ {\doshowfigurestate{analyzing : \wantedfigurefullname}%
+ \doanalyzefiguredimensionsinternal
+ \doanalyzefiguredimensionsexternal
+ \doanalyzefiguredimensionsfallback}
+ {\doshowfigurestate{not found : \wantedfigurefullname}}}
+ {}}
+
+\def\setanalyzedfiguredimensions#1%
+ {\ifdim\analyzedfigurewidth>\zeropoint
+ \ifdim\analyzedfigureheight>\zeropoint
+ \determinedfigurewidth \analyzedfigurewidth
+ \determinedfigureheight\analyzedfigureheight
+ \chardef\figurestatus #1\relax
+ \doshowfigurestate{dimensions :
+ \the\dimexpr\analyzedfigurewidth\relax\space x\space
+ \the\dimexpr\analyzedfigureheight\relax}%
+ \else
+ \determinedfigurewidth \zeropoint
+ \determinedfigureheight\zeropoint
+ \chardef\figurestatus \zerocount
+ \fi
+ \else
+ \determinedfigurewidth \zeropoint
+ \determinedfigureheight\zeropoint
+ \chardef\figurestatus \zerocount
+ \fi}
+
+%D We can remap types. This is to be dealt with in the driver files.
+
+\def\definegraphictypesynonym
+ {\dodoubleargument\dodefinegraphictypesynonym}
+
+\def\dodefinegraphictypesynonym[#1][#2]%
+ {\setvalue{\??ef:\??ex:#1}{#2}}
+
+\def\truegraphictype#1%
+ {\ifcsname\??ef:\??ex:#1\endcsname
+ \expandafter\truegraphictype\csname\??ef:\??ex:#1\endcsname\else#1%
+ \fi}
+
+\definegraphictypesynonym[epdf] [pdf]
+\definegraphictypesynonym[jpeg] [jpg]
+\definegraphictypesynonym[jp2] [jpg]
+\definegraphictypesynonym[jbig] [jb2]
+\definegraphictypesynonym[jbig2][jb2]
+\definegraphictypesynonym[jbg] [jb2]
+
+%D The self method (mostly used) uses the driver.
+
+% todo: when zero width mps, ok
+%
+% analyzer must set the analyzed dimensions
+
+\def\doanalyzefiguredimensionsinternal
+ {\ifcase\figurestatus
+ \lowercasestring\wantedfiguretypespec\to\lcwantedfiguretypespec
+ \let\@@DriverImageFile \wantedfigurefullname
+ \let\@@DriverImagePage \wantedfigurepage
+ \let\@@DriverImageType\lcwantedfiguretypespec
+ % use internal when available, otherwise try driver (\dogetfiguresize)
+ \executeifdefined{dogetfiguresize\@@DriverImageType}\dogetfiguresize
+ \setanalyzedfiguredimensions\!!ten
+ \fi}
+
+%D The tex method.
+
+\def\dogetfiguresizetex
+ {\ifcase\figurestatus
+ \global\setbox\foundexternalfigure\vbox
+ {\insidefloattrue
+ \forgetall
+ \blank[\v!disable]% niet meer weg !
+ \startreadingfile
+ \readfile\wantedfigurefullname \donothing \donothing
+ \stopreadingfile
+ \endgraf
+ \removelastskip}%
+ \global\setbox\foundexternalfigure\hbox
+ {\raise\dp\foundexternalfigure\box\foundexternalfigure}%
+ \xdef\analyzedfigurewidth {\the\wd\foundexternalfigure}%
+ \xdef\analyzedfigureheight{\the\ht\foundexternalfigure}%
+ \fi}
+
+\let\dogetfiguresizetmp \dogetfiguresizetex
+\let\dogetfiguresizebuffer\dogetfiguresizetex
+
+%D The eps, mps and svg files are read directly.
+
+\def\dogetfiguresizeeps
+ {\dogetEPSboundingbox\wantedfigurefullname\!!widtha\!!heighta\!!widthb\!!heightb
+ \xdef\analyzedfigurewidth {\the\!!widthb}%
+ \xdef\analyzedfigureheight{\the\!!heightb}}
+
+\let\dogetfiguresizemps\dogetfiguresizeeps
+
+\def\dogetfiguresizesvg
+ {\doifinset\wantedfiguretypespec\c!svg
+ {\startnointerference
+ \startXMLignore
+ \defineXMLcommand[svg][width=100,height=75]
+ {\doifdimensionelse{\XMLop{width}}
+ {\xdef\analyzedfigurewidth {\the\dimexpr\XMLop{width}\relax}}
+ {\xdef\analyzedfigurewidth {\the\dimexpr\XMLop{width}\onebasepoint\relax}}%
+ \doifdimensionelse{\XMLop{height}}
+ {\xdef\analyzedfigurewidth {\the\dimexpr\XMLop{height}\relax}}
+ {\xdef\analyzedfigurewidth {\the\dimexpr\XMLop{height}\onebasepoint\relax}}%
+ \endinput}%
+ \processXMLfilegrouped\wantedfigurefullname
+ \stopXMLignore
+ \stopnointerference}}
+
+%D Do some checking on the filename.
+
+\newconditional \figurefileisqualified
+
+\def\setfigurepathlist
+ {\let\figurepathlist\empty
+ \expanded{\doifinset{\v!global }{\@@exlocation}}
+ {\let\figurepathlist\@@exdirectory}%
+ \expanded{\doifinset{\v!local }{\@@exlocation}}
+ {\prependtocommalist\f!currentpath\figurepathlist}%
+ \expanded{\doifinset{\v!default}{\@@exlocation}}
+ {\appendtocommalist\defaultfigurepathsignal\figurepathlist}}
+
+% The combined path and qualified path hack is dedicated to Onno Tomson,
+% our partner in fighting inconsistent and faulty image specifications in
+% user files.
+
+\def\analyzefigurefilename#1#2%
+ {\sanitizefilename#1\to\expandedfigurename
+ \expanded{\checkfilename{\expandedfigurename}}%
+ \ifcase\kindoffile
+ \splitfigurefilename
+ \ifcase\splitoffkind
+ \let\wantedfigurepath\empty % no . either
+ \setfigurepathlist
+ \setfalse\figurefileisqualified
+ \else
+ \splitfigurefilename
+ % will become splitoffkind 3 ! ! ! !
+ \setfalse\figurefileisqualified
+ \doifinstring{$$/}{$$\wantedfigurepath}{\settrue\figurefileisqualified}%
+ \doifinstring {:} {\wantedfigurepath}{\settrue\figurefileisqualified}%
+ \ifconditional\figurefileisqualified
+ \let\figurepathlist\wantedfigurepath
+ \let\wantedfigurepath\empty
+ \settrue\figurefileisqualified
+ \else
+ \let\figurepathlist\@@exdirectory
+ \let\oldfigurepathlist\figurepathlist
+ \let\figurepathlist\wantedfigurepath
+ \def\docommand##1{\edef\figurepathlist{\figurepathlist,##1/\wantedfigurepath}}%
+ \processcommacommand[\oldfigurepathlist]\docommand
+ \fi
+ \fi
+ \else % fully qualified
+ \splitfigurefilename
+ \let\wantedfigurepath\empty
+ \settrue\figurefileisqualified
+ \fi
+ \ifx\figurepathlist\empty
+ \let\figurepathlist\defaultfigurepathsignal % will prepend no path
+ \fi
+ \doifelsenothing\wantedfiguretype
+ {\doifparentfileelse\wantedfigurename
+ {\@EA\removefromcommalist\@EA{\jobsuffix }\wantedfiguretypelist
+ \@EA\removefromcommalist\@EA{\jobfilesuffix}\wantedfiguretypelist}
+ {}}
+ {\let\wantedfiguretypelist\empty
+ \let\wantedfiguretypespec\wantedfiguretype}%
+ \edef\wantedfigurelabel{#2}%
+ \doshowfigurestate{type check : \ifx\wantedfiguretypelist\empty forced type \wantedfiguretypespec\else\wantedfiguretypelist\fi}%
+ \doshowfigurestate{file specs : \wantedfigurefull\space [\wantedfigurepath] [\wantedfigurename] [\wantedfiguretype]}%
+ \doshowfigurestate{file type : \ifconditional\figurefileisqualified qualified\else simple\fi}}
+
+\def\setwantedfigurefullname#1#2#3% path name spec
+ {\ifx\wantedfiguremethod\empty
+ % the either explicit or gambled typespec determines the method
+ \edef\wantedfiguretypespec{#3}%
+ \doifelse{#1}\defaultfigurepathsignal
+ {\edef\wantedfigurefullname {#2.\wantedfiguretypespec}}
+ {\edef\wantedfigurefullname{#1/#2.\wantedfiguretypespec}}%
+ \else\ifx\wantedfiguretype\empty %
+ % the typespec (probably the same as the method) determines the suffix
+ \doifelse{#1}\defaultfigurepathsignal
+ {\edef\wantedfigurefullname {#2.\wantedfiguretypespec}}
+ {\edef\wantedfigurefullname{#1/#2.\wantedfiguretypespec}}%
+ \let\wantedfiguretypespec\wantedfiguremethod
+ \else
+ % the given suffix is used
+ \let\wantedfiguretypespec\wantedfiguremethod
+ \doifelse{#1}\defaultfigurepathsignal
+ {\edef\wantedfigurefullname {#2.\wantedfiguretype}}
+ {\edef\wantedfigurefullname{#1/#2.\wantedfiguretype}}%
+ \fi\fi}
+
+\def\splitfigurefilename
+ {\splitfilename\expandedfigurename
+ \let\wantedfigurefull\splitofffull
+ \let\wantedfigurepath\splitoffpath
+ \let\wantedfigurename\splitoffname
+ \let\wantedfigurebase\splitoffbase
+ \let\wantedfiguretype\splitofftype}
+
+\def\analyzefigurefiles
+ {\ifconditional\figurefileisqualified
+ \ifx\wantedfiguretype\empty
+ \doshowfigurestate{locating : unknown type}%
+ \doanalyzeunknownfiguretype
+ \else
+ % this file or none
+ \doshowfigurestate{locating : known type}%
+ \doanalyzequalifiedfigure
+ \fi
+ \else
+ \ifx\wantedfiguretype\empty
+ % locate best fit / check support
+ \doshowfigurestate{locating : best fit}%
+ \doanalyzeunknownfiguretype
+ \else
+ % only check on paths
+ \doshowfigurestate{locating : known types}%
+ \doanalyzeknownfiguretype
+ \fi
+ \fi}
+
+\def\doanalyzequalifiedfigure
+ {\let\wantedfigurefullname\wantedfigurefull
+ \let\wantedfiguretypespec\wantedfiguretype
+ \doshowfigurestate{forced type : \wantedfiguretype}%
+ \doshowfigurestate{identifying : \wantedfigurefullname}%
+ \doanalyzefiguredimensions}
+
+\def\doanalyzeknownfiguretype
+ {\doshowfigurestate{using paths : \figurepathlist}%
+ \doshowfigurestate{known type : \wantedfiguretype}%
+ \doshowfigurestate{identifying : \wantedfigurename}%
+ \let\wantedfiguretypespec\wantedfiguretype
+ \processcommacommand[\figurepathlist]\dodoanalyzeknownfiguretype}
+
+\def\dodoanalyzeknownfiguretype#1% path
+ {\ifcase\figurestatus
+ \setwantedfigurefullname{#1}\wantedfigurename\wantedfiguretype
+ \doanalyzefiguredimensions
+ \fi}
+
+\def\doanalyzeunknownfiguretype
+ {\doshowfigurestate{using paths : \figurepathlist}%
+ \doshowfigurestate{using types : \wantedfiguretypelist}%
+ \doshowfigurestate{identifying : \wantedfigurename}%
+ \processcommacommand[\wantedfiguretypelist]\dodoanalyzeunknownfiguretype}
+
+\def\dodoanalyzeunknownfiguretype#1%
+ {\processcommacommand[\figurepathlist]{\dododoanalyzeunknownfiguretype{#1}}}
+
+\def\dododoanalyzeunknownfiguretype#1#2% type path
+ {\ifcase\figurestatus
+ \setwantedfigurefullname{#2}\wantedfigurename{#1}% path spec
+ \doanalyzefiguredimensions
+ \fi}
+
+%D Some files, take for instance movies, cannot easilly be
+%D parsed on dimensions, that is, not yet. Although the current
+%D mechanism has no problems with this, as long as the user
+%D specified width and height reflect the right aspect ratio.
+%D Nevertheless, when one does not want any scanning done, one
+%D can disable \type{preset}. When no preset is needed, we only
+%D locate the file.
+
+\def\doanalyzefiguredimensionsfallback
+ {\ifcase\figurestatus
+ \doshowfigurestate{warning : assuming adaptive figure}%
+ \xdef\analyzedfigurewidth {\the\dimexpr\@@efwidth +\zeropoint\relax}%
+ \xdef\analyzedfigureheight{\the\dimexpr\@@efheight+\zeropoint\relax}%
+ \setanalyzedfiguredimensions\plustwo
+ \fi}
+
+%D This is \MKII\ only and comes from cont-new (maybe used in a project).
+
+% maybe to be integrated (option=...)
+
+\def\directexternalfigure
+ {\dodoubleempty\dodirectexternalfigure}
+
+\def\dodirectexternalfigure[#1][#2]%
+ {\bgroup
+ \getparameters[\??ef][\c!type=\splitofftype,\c!page=1,#2]%
+ \sanitizefilename#1\to\expandedfigurename
+ \splitfilename\expandedfigurename
+ \let\@@DriverImageWidth \!!zeropoint
+ \let\@@DriverImageHeight \!!zeropoint
+ \let\@@DriverImageFile \splitofffull
+ \let\@@DriverImageType \@@eftype
+ \let\@@DriverImageMethod \@@eftype
+ \let\@@DriverImageLabel \empty
+ \let\@@DriverImagePage \@@efpage
+ \doinsertfile
+ \egroup}
+
+% \directexternalfigure[cow.pdf]
+
+\protect \endinput
diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv
new file mode 100644
index 000000000..16ee1097a
--- /dev/null
+++ b/tex/context/base/grph-inc.mkiv
@@ -0,0 +1,433 @@
+%D \module
+%D [ file=grph-inc, % moved from core-fig
+%D version=2006.08.26, % overhaul of 1997.03.31
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Figure Inclusion,
+%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 Graphic Macros / Figure Inclusion}
+
+%D todo:
+%D
+%D - color conversion
+%D - alternative images
+%D - a few more obscure things
+
+\registerctxluafile{grph-inc}{1.001}
+\registerctxluafile{grph-fil}{1.001}
+\registerctxluafile{grph-u3d}{1.001} % this will change
+\registerctxluafile{grph-swf}{1.001} % this will change
+
+\unprotect
+
+%D The following registers are used (if only to be downward compatible).
+
+\newbox \foundexternalfigure
+\newif \ifskipexternalfigures
+\newtoks \everyexternalfigureresets
+\newtoks \everyexternalfigurechecks
+\newtoks \externalfigurepostprocessors
+
+\def\resetfigurevariables {\the\everyexternalfigureresets}
+\def\checkfigurevariables {\the\everyexternalfigurechecks}
+
+%D Historic feature:
+
+\appendtoks
+ \global\let\externalfigurelog\empty
+\to \everyexternalfigureresets
+
+\let\runutilityfiletrue \relax \let\runutilityfilefalse \relax
+\let\consultutilityfiletrue\relax \let\consultutilityfilefalse\relax
+
+%D You can register additional suffixes with the following command:
+%D
+%D \starttyping
+%D \definegraphictypesynonym[jbig] [jb2]
+%D \definegraphictypesynonym[jbig2][jb2]
+%D \definegraphictypesynonym[jbg] [jb2]
+%D \stoptyping
+
+\unexpanded\def\definegraphictypesynonym
+ {\dodoubleargument\dodefinegraphictypesynonym}
+
+\def\dodefinegraphictypesynonym[#1][#2]%
+ {\ctxlua{figures.registersuffix("#1","#2")}}
+
+%D Additional paths can be installed with the regular setup command. The next
+%D macro picks up the list.
+
+\def\setfigurepathlist
+ {\ctxlua{figures.setpaths("\@@exlocation",\!!bs\@@exdirectory\!!es)}}
+
+%D Variables:
+
+\def\defaultfigurewidth {8\lineheight}
+\def\defaultfigureheight {6\lineheight}
+
+\def\figurestatus {\numexpr\ctxlua{figures.tprint("status","status",0)}\relax} % number: 0 = not found
+\def\figurewidth {\ctxlua{figures.tprint("status","width",0)}sp}
+\def\figureheight {\ctxlua{figures.tprint("status","height",0)}sp}
+\def\figurexscale {\ctxlua{figures.tprint("status","xscale",1)}}
+\def\figureyscale {\ctxlua{figures.tprint("status","yscale",1)}}
+
+\def\figurelabel {\ctxlua{figures.tprint("request","label")}}
+\def\figurefileoriginal {\ctxlua{figures.tprint("request","name")}}
+\def\figurefilepage {\ctxlua{figures.tprint("request","page",1)}}
+\def\figurefileoptions {\ctxlua{figures.tprint("request","options")}}
+\def\figurefileconversion{\ctxlua{figures.tprint("request","conversion")}}
+\def\figurefilecache {\ctxlua{figures.tprint("request","cache")}}
+\def\figurefileprefix {\ctxlua{figures.tprint("request","prefix")}}
+
+\def\figurenaturalwidth {\ctxlua{figures.tprint("used","width", \number\dimexpr\defaultfigurewidth \relax)}sp}
+\def\figurenaturalheight {\ctxlua{figures.tprint("used","height",\number\dimexpr\defaultfigureheight\relax)}sp}
+
+\def\figurefilepath {\ctxlua{tex.sprint(tex.ctxcatcodes,file.dirname (figures.get("used","fullname")))}}
+\def\figurefilename {\ctxlua{tex.sprint(tex.ctxcatcodes,file.nameonly(figures.get("used","fullname")))}}
+\def\figurefiletype {\ctxlua{tex.sprint(tex.ctxcatcodes,file.extname (figures.get("used","fullname")))}}
+\def\figurefullname {\ctxlua{figures.tprint("used","fullname")}}
+\def\noffigurepages {\ctxlua{figures.tprint("used","pages",0)}}
+
+\let\naturalfigurewidth \figurenaturalwidth
+\let\naturalfigureheight \figurenaturalheight
+
+\let\figurescalewidth \figurewidth
+\let\figurescaleheight \figureheight
+\let\figurescalexscale \figurexscale
+\let\figurescaleyscale \figureyscale
+
+\appendtoks
+ \ctxlua { % figures.defaultwidth .. why not dimen
+ figures.setpaths("\@@exlocation","\@@exdirectory") ;
+ figures.defaultwidth = \number\dimexpr\defaultfigurewidth \relax ;
+ figures.defaultheight = \number\dimexpr\defaultfigureheight\relax ;
+ figures.boxnumber = \number\foundexternalfigure ;
+ }%
+\to \everyexternalfigureresets
+
+%D In some situations we need to make sure that the figure related variables
+%D are reset. This is especially important when we are nesting. Is this still
+%D needed in \MKIV.
+
+\def\resetexternalfigures
+ {\let\@@efoption \empty % \let\@@efprefix\empty
+ \let\@@efmaxwidth \empty % \let\@@efcache \empty
+ \let\@@efmaxheight \empty % \let\@@efframe \v!off
+ \let\@@efforegroundcolor\empty
+ \let\@@efcolor \empty
+ \let\@@efconversion \empty
+ \let\@@efbackground \empty}
+
+\appendtoks \resetexternalfigures \to \everyoverlay
+\appendtoks \resetexternalfigures \to \everybeforepagebody % not really needed
+
+\def\resetfigureusersettings
+ {%
+ \let\@@efmethod \empty
+ \let\@@eflabel \empty
+ \let\@@efsize \empty
+ \let\@@efconversion\@@exconversion
+ \let\@@efprefix \@@exprefix
+ \let\@@efcache \@@excache
+ \let\@@efpage \!!zerocount
+ \let\@@efobject \@@exobject
+ \let\@@efdisplay \empty
+ %
+ \let\@@efpreset \v!yes
+ \let\@@efsplit \empty
+ \let\@@efcolor \empty
+ %
+ \let\@@efsymbol \v!no
+ %
+ \let\@@efcontrols \v!no
+ \let\@@efpreview \v!no
+ \let\@@efrepeat \v!no
+ %
+ \let\@@efforegroundcolor\empty
+ %
+ \let\@@efhfactor \empty
+ \let\@@efwfactor \empty
+ \let\@@effactor \empty
+ \let\@@efmaxwidth \@@exmaxwidth
+ \let\@@efmaxheight \@@exmaxheight
+ \let\@@efxscale \empty
+ \let\@@efyscale \empty
+ \let\@@efscale \empty
+ \let\@@efsx \!!plusone
+ \let\@@efsy \!!plusone
+ \let\@@efwidth \empty
+ \let\@@efheight \empty
+ \let\@@eflines \empty
+ \let\@@efgrid \empty}
+
+\resetfigureusersettings
+
+\appendtoks
+ \resetfigureusersettings
+\to \everyexternalfigureresets
+
+\def\checkfigureusersettings
+ {% old features
+ \doif\@@exoption\v!frame
+ {\let\@@efframe\v!on}%
+ \doif\@@exoption\v!empty
+ {\skipexternalfigurestrue
+ \let\@@efframe\v!off}%
+ \doifsomething\@@efwidth {\doifdimensionelse\@@efwidth {\edef\@@efwidth {\the\dimexpr\@@efwidth }}\donothing}%
+ \doifsomething\@@efheight{\doifdimensionelse\@@efheight{\edef\@@efheight{\the\dimexpr\@@efheight}}\donothing}%
+ % fake color in gray bitmaps, assumes that
+ % a transparent color is used
+ \doifsomething\@@efforegroundcolor
+ {\def\@@efbackground{\v!foreground,\v!color}%
+ \def\@@efbackgroundcolor{\@@efforegroundcolor}}}
+
+\appendtoks
+ \checkfigureusersettings
+\to \everyexternalfigurechecks
+
+%D Internal graphics are handled at the \TEX\ end:
+
+\def\doprocesstexlikefigure#1% retrofit into mkii
+ {\global\setbox\foundexternalfigure\vbox\framed
+ [\c!strut=\v!no,\c!align=\v!normal,\c!frame=\v!off,
+ \c!offset=\v!overlay,\c!width=\v!fit,\c!height=\v!fit]
+ {\blank[\v!disable]#1\endgraf\removelastskip}} % disable should stay here!
+
+\def\doprocessmpslikefigure#1% retrofit into mkii
+ {\global\setbox\foundexternalfigure\vbox{\convertMPtoPDF{#1}11}}
+
+\def\docheckfigurebuffer #1{\doprocesstexlikefigure{\getbuffer[#1]}}
+\def\docheckfiguretex #1{\doprocesstexlikefigure{\input#1\relax}}
+\def\docheckfiguremps #1{\doprocessmpslikefigure{#1}}
+\def\docheckfiguremprun #1#2{\doprocesstexlikefigure{\useMPrun{#1}{#2}}}
+
+\def\doscalefigure
+ {\global\setbox\foundexternalfigure\vbox{\doscalebox\??ef{\dowithfigure{\box\foundexternalfigure}}}}
+
+\newconditional\testexternalfigureonly
+
+% \enabletrackers[figures.conversion]
+% \externalfigure[demo.svg]
+% \externalfigure[demo.svg][conversion=png]
+
+\def\calculateexternalfigure[#1][#2][#3][#4][#5][#6]% \cmd label filename parent_id preset current
+ {\dontcomplain
+ \restorecatcodes
+ \forgetall
+ \resetfigurevariables
+ \dosetefparameters{#4}{#5}{#6}%
+ \checkfigurevariables
+% \begingroup
+% \color[\@@efcolor]{\xdef\globcolorattr{\internalspotcolorname}}
+% \endgroup
+ \ctxlua{figures.push {
+ name="#3",
+ label="#2", % todo: \@eflabel
+ page="\@@efpage",
+ size="\@@efsize",
+ object="\@@efobject",
+ prefix="\@@efprefix",
+ cache="\@@efcache",
+ format="\@@efmethod",
+ preset="\@@efprefix",
+ controls="\@@efcontrols",
+ preview="\@@efpreview",
+ display="\@@efdisplay",
+ conversion="\@@efconversion",
+ color="\internalspotcolorparent\@@efcolor", % hack is needed
+ ["repeat"]="\@@efrepeat",
+ width="\@@efwidth", % can be crap
+ height="\@@efheight", % can be crap
+ } }%
+ \ctxlua{figures.identify()}%
+ \ifconditional\testexternalfigureonly
+ \ifcase\figurestatus \else
+ \ctxlua{figures.check()}%
+ \ctxlua{figures.dummy()}%
+ \ctxlua{figures.scale()}%
+ \ctxlua{figures.done()}%
+ \fi
+ \signalexternalfigure
+ \else
+ \ifcase\figurestatus
+ \ctxlua{figures.dummy()}%
+ \ctxlua{figures.scale()}%
+ \else
+ \ctxlua{figures.check()}%
+ \ctxlua{figures.include()}%
+ \ctxlua{figures.scale()}%
+ \fi
+ \ctxlua{figures.done()}%
+ \signalexternalfigure
+ \finishexternalfigure
+ \fi
+ \ctxlua{figures.pop()}}
+
+\def\relocateexternalfigure % easier here than in lua
+ {\global\setbox\foundexternalfigure\vbox to \ht\foundexternalfigure\bgroup
+ \vss
+ \ht\foundexternalfigure\zeropoint
+ \hbox to \wd\foundexternalfigure\bgroup
+ \box\foundexternalfigure
+ \hss
+ \egroup
+ \egroup}
+
+\def\signalexternalfigure % global
+ {\ifcase\figurestatus
+ \global\resetsystemmode\v!figure % todo, also: \v!resource
+ \else
+ \global\setsystemmode \v!figure % todo, also: \v!resource
+ \fi}
+
+\unexpanded\def\startfoundexternalfigure#1#2% ht wd
+ {\global\setbox\foundexternalfigure\vbox to #2\bgroup\vss\hbox to #1\bgroup}
+
+\unexpanded\def\stopfoundexternalfigure
+ {\hss\egroup\egroup}
+
+\def\emptyfoundexternalfigure
+ {\startfoundexternalfigure\defaultfigurewidth\defaultfigureheight
+ \stopfoundexternalfigure}
+
+\def\finishexternalfigure % here we use \figurevariables
+ {\global\setbox\foundexternalfigure\vbox
+ {\ifcase\figurestatus
+ \let\@@efframe\v!on
+ \fi
+ \ifconditional\externalfigureflush
+ \ifconditional\externalfigurelevel % probably background
+ \ifskipexternalfigures
+ % nothing
+ \fakebox\foundexternalfigure
+ \else\ifcase\figurestatus
+ % nothing
+ \else
+ \the\externalfigurepostprocessors
+ \box\foundexternalfigure
+ \fi\fi
+ \else
+ \iftrialtypesetting \else \feedbackexternalfigure \fi
+ \settrue\externalfigurelevel
+ \ifskipexternalfigures
+ \ifcase\figurestatus
+ \externalfigurereplacement\figurelabel\figurefileoriginal{unknown}%
+ \else
+ \externalfigurereplacement\figurelabel\figurefullname{skipped}%
+ \fi
+ \else\ifcase\figurestatus
+ \externalfigurereplacement\figurelabel\figurefileoriginal{unknown}%
+ \else
+ \the\externalfigurepostprocessors
+ \doifelse\@@efreset\v!yes
+ {\wd\foundexternalfigure\figurewidth
+ \ht\foundexternalfigure\figureheight
+ \dp\foundexternalfigure\zeropoint
+ \box\foundexternalfigure}
+ {\localframed % should also be applied to high res !
+ [\??ef]
+ [\c!offset=\v!overlay,
+ \c!width=\figurewidth,
+ \c!height=\figureheight]
+ {\vfilll\box\foundexternalfigure}}%
+ \fi\fi
+ \fi
+ \else
+ % maybe also \the\externalfigurepostprocessors
+ \iftrialtypesetting \else \feedbackexternalfigure \fi
+ \fi}}
+
+\ifx\externalfigurereplacement\undefined\let\externalfigurereplacement\gobblethreearguments\fi
+\ifx\externalfigureplaceholder\undefined\let\externalfigureplaceholder\gobblethreearguments\fi
+
+\let\feedbackexternalfigure\relax % \gobblefourarguments
+\let\dowithfigure \relax
+
+\def\getfiguredimensions
+ {\dodoubleempty\dogetfiguredimensions}
+
+\def\dogetfiguredimensions[#1][#2]%
+ {\startnointerference
+ \settrue\testexternalfigureonly
+ \externalfigure[#1][#2,\c!display=,\c!object=\v!no]%
+ \stopnointerference}
+
+\let\getfiguredimensionsonly\getfiguredimensions
+
+\def\doiffigureelse#1%
+ {\getfiguredimensions[#1]% so data is available !
+ \ifdim\figurewidth=\zeropoint % todo: \figurestatus
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\registerexternalfigure % no placement, handy for preprocessing
+ {\dotripleempty\doregisterexternalfigure}
+
+\def\doregisterexternalfigure[#1][#2][#3]%
+ {\startnointerference
+ \testexternalfigureonly
+ \setfalse\externalfigureflush % == test ?
+ \externalfigure[#1][#2][#3]% or \doexternalfigure
+ \externalfigure[#1][#2,\c!display=,\c!object=\v!no]%
+ \stopnointerference}
+
+% figurebases
+
+\def\usefigurebase[#1]%
+ {\ctxlua{figures.bases.use("#1")}}
+
+\protect \endinput
+
+% \startbuffer
+% \definecolor [blue] [c=1,m=.38,y=0,k=.64]
+% \definecolor [yellow] [c=0,m=.28,y=1,k=.06]
+%
+% \definespotcolor [blue-100] [blue] [p=1]
+% \definespotcolor [yellow-100] [yellow] [p=1]
+%
+% \definemultitonecolor [combicolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1]
+%
+% \definemultitonecolor [combicolor-b] [blue=1] [c=1,m=.38,y=0,k=.64] % force multitone
+% \definemultitonecolor [combicolor-y] [yellow=1] [c=0,m=.28,y=1,k=.06] % force multitone
+%
+% \useexternalfigure[demo-a][mill.png] [object=no,width=.2\textwidth]
+% \useexternalfigure[demo-b][hacker-bw.jpg][object=no,width=.2\textwidth]
+%
+% \startbaselinecorrection \startcombination[4*1]
+% {\externalfigure[demo-a]} {no color}
+% {\externalfigure[demo-a][color=combicolor]} {indexed duotone}
+% {\externalfigure[demo-a][color=combicolor-b]} {spot color}
+% {\externalfigure[demo-a][color=combicolor-y]} {spot color}
+% \stopcombination \stopbaselinecorrection
+%
+% \startbaselinecorrection \startcombination[4*1]
+% {\externalfigure[demo-b]} {no color}
+% {\externalfigure[demo-b][color=combicolor]} {indexed duotone}
+% {\externalfigure[demo-b][color=combicolor-b]} {spot color}
+% {\externalfigure[demo-b][color=combicolor-y]} {spot color}
+% \stopcombination \stopbaselinecorrection
+%
+% \startbaselinecorrection \startcombination[4*1]
+% {\externalfigure[demo-a]} {no color}
+% {\externalfigure[demo-a][color=combicolor]} {indexed duotone}
+% {\externalfigure[demo-a][color=blue-100]} {spot color}
+% {\externalfigure[demo-a][color=yellow-100]} {spot color}
+% \stopcombination \stopbaselinecorrection
+%
+% \startbaselinecorrection \startcombination[4*1]
+% {\externalfigure[demo-b]} {no color}
+% {\externalfigure[demo-b][color=combicolor]} {indexed duotone}
+% {\externalfigure[demo-b][color=blue-100]} {spot color}
+% {\externalfigure[demo-b][color=yellow-100]} {spot color}
+% \stopcombination \stopbaselinecorrection
+% \stopbuffer
+%
+% \getbuffer \typebuffer
diff --git a/tex/context/base/grph-swf.lua b/tex/context/base/grph-swf.lua
new file mode 100644
index 000000000..e55454b52
--- /dev/null
+++ b/tex/context/base/grph-swf.lua
@@ -0,0 +1,43 @@
+if not modules then modules = { } end modules ['grph-swf'] = {
+ version = 1.001,
+ comment = "companion to grph-inc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local texsprint = tex.sprint
+local ctxcatcodes = tex.ctxcatcodes
+local pdfannotation = nodes.pdfannotation
+
+function figures.checkers.swf(data)
+ local dr, du, ds = data.request, data.used, data.status
+ local width = (dr.width or figures.defaultwidth):todimen()
+ local height = (dr.height or figures.defaultheight):todimen()
+ local foundname = du.fullname
+ dr.width, dr.height = width, height
+ du.width, du.height, du.foundname = width, height, foundname
+ texsprint(ctxcatcodes,format("\\startfoundexternalfigure{%ssp}{%ssp}",width,height))
+ local annot, preview, ref = backends.pdf.helpers.insertswf {
+ foundname = foundname,
+ width = width,
+ height = height,
+ -- factor = number.dimenfactors.bp,
+ -- display = dr.display,
+ -- controls = dr.controls,
+ -- label = dr.label,
+ }
+ -- node.write(pdfannotation(width,-height,0,annot()))
+ texsprint(ctxcatcodes,format("\\pdfannot width %ssp height %ssp {%s}",width,height,annot())) -- brrrr
+--~ if ref then -- wrong ! a direct ref should work
+--~ texsprint(ctxcatcodes,format("\\smash{\\pdfrefximage%s\\relax}",ref)) -- brrrr
+--~ end
+ texsprint(ctxcatcodes,"\\stopfoundexternalfigure")
+ return data
+end
+
+figures.includers.swf = figures.includers.nongeneric
+
+figures.registersuffix("swf","swf")
diff --git a/tex/context/base/grph-trf.mkii b/tex/context/base/grph-trf.mkii
new file mode 100644
index 000000000..3e32395b4
--- /dev/null
+++ b/tex/context/base/grph-trf.mkii
@@ -0,0 +1,579 @@
+%D \module
+%D [ file=grph-fig,
+%D version=2006.08.26, % overhaul/split of 1997.03.31 core-fig
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Transformations,
+%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 It may be that some functionality got lost. If it concerns
+%D defined features, let me know and it will be sorted out.
+
+\writestatus{loading}{ConTeXt Graphic Macros / Transformations}
+
+\unprotect
+
+%D Scaling:
+
+\unexpanded\def\scale{\dodoubleempty\doscalenextbox[\??xy]}
+
+% probably too many dimens / the width calculations can go
+% since we may assume scaling is available (was not true
+% long ago which is why we also calculate the width)
+
+\newdimen\scaleboxwidth
+\newdimen\scaleboxheight
+\newdimen\scaleboxdepth
+
+\newdimen\scaleboxsizex
+\newdimen\scaleboxsizey
+\newdimen\scaleboxoffsetx
+\newdimen\scaleboxoffsety
+
+\newdimen\scaleboxhsize
+\newdimen\scaleboxvsize
+
+% global
+
+\newdimen\scaleboxdimx \let\figwid \scaleboxdimx
+\newdimen\scaleboxdimy \let\fighei \scaleboxdimy
+\newcount\scaleboxscax \let\figxsca\scaleboxscax
+\newcount\scaleboxscay \let\figysca\scaleboxscay
+
+\newdimen\scaleboxoutervsize % we cannot manipulate any global vsize !
+
+\let\finalscaleboxxscale \!!plusone
+\let\finalscaleboxyscale \!!plusone
+\let\finalscaleboxwidth \!!zeropoint
+\let\finalscaleboxheight \!!zeropoint
+\let\finalscaleboxxfactor\!!hundred
+\let\finalscaleboxyfactor\!!hundred
+
+\newconditional\scaleboxdone
+
+\def\doscalenextbox[#1][#2]%
+ {\bgroup
+ \getparameters
+ [#1]
+ [\c!scale=,\c!xscale=,\c!yscale=,\c!width=,\c!height=,\c!lines=,
+ \c!factor=,\c!hfactor=,\c!wfactor=,\c!grid=,\c!sx=1,\c!sy=1,
+ \c!equalwidth=,\c!equalheight=,
+ \c!maxwidth=\scaleparameter\c!width,\c!maxheight=\scaleparameter\c!height,
+ #2]%
+ \dowithnextbox{\dodoscalenextbox{#1}\egroup}\hbox}
+
+\def\doscalebox#1%
+ {\bgroup\dowithnextbox{\dodoscalenextbox{#1}\egroup}\hbox}
+
+\let\currentscaletag\??xy
+
+\def\scaleparameter#1%
+ {\csname\currentscaletag#1\endcsname}
+
+\def\setscaleparameter#1#2%
+ {\setvalue{\currentscaletag#1}{#2}}
+
+\def\dodoscalenextbox#1%
+ {\edef\currentscaletag{#1}%
+ \doif{\scaleparameter\c!depth}\v!no{\setbox\nextbox\hbox{\raise\nextboxdp\box\nextbox}}% new
+ \forgetall
+ \dontshowcomposition
+ \dontcomplain
+ \doscaleboxcalculations
+ \doscaleboxindeed
+ \doscaleboxposition
+ \flushnextbox}
+
+\def\doscaleboxindeed
+ {\ifconditional\scaleboxdone
+ \scaleboxwidth \finalscaleboxxscale\nextboxwd
+ \scaleboxheight\finalscaleboxyscale\nextboxht
+ \scaleboxdepth \finalscaleboxyscale\nextboxdp
+ \setbox\nextbox\hbox
+ {\dostartscaling \finalscaleboxxscale \finalscaleboxyscale
+ \smashedbox\nextbox
+ \dostopscaling}%
+ \nextboxwd\scaleboxwidth
+ \nextboxht\scaleboxheight
+ \nextboxdp\scaleboxdepth
+ \fi}
+
+\def\doscaleboxcalculations
+ {\setfalse\scaleboxdone
+ % initial final value
+ \global\let\finalscaleboxxscale \!!plusone
+ \global\let\finalscaleboxyscale \!!plusone
+ \xdef \finalscaleboxwidth {\the\nextboxwd}%
+ \xdef \finalscaleboxheight{\the\nextboxht}%
+ \global\let\finalscaleboxxfactor\!!hundred
+ \global\let\finalscaleboxyfactor\!!hundred
+ \ifdim\nextboxht>\zeropoint \ifdim\nextboxwd>\zeropoint
+ \edef\scaleboxstampa % slow way [can be combined]
+ {\scaleparameter\c!scale \scaleparameter\c!xscale \scaleparameter\c!yscale
+ \scaleparameter\c!factor\scaleparameter\c!wfactor\scaleparameter\c!hfactor
+ \scaleparameter\c!lines \scaleparameter\c!width \scaleparameter\c!height}%
+ \edef\scaleboxstampb % fast way [just sx/sy]
+ {\scaleparameter\c!sx
+ \scaleparameter\c!sy}%
+ \edef\scaleboxstampc
+ {11}%
+ \ifx\scaleboxstampa\empty
+ \ifx\scaleboxstampb\scaleboxstampc
+ % no scaling, but still check; new, gone again
+% wrong: scaled proportionally as side effect
+% \doifsomething{\scaleparameter\c!maxwidth }{\letvalue{\currentscaletag\c!factor}\v!fit}%
+% \doifsomething{\scaleparameter\c!maxheight}{\letvalue{\currentscaletag\c!factor}\v!fit}%
+ \insidefloattrue % trick
+ \dodoscaleboxcalculations
+ \else
+ \dosetscalboxsxsy
+ \nodoscaleboxcalculations
+ \fi
+ \else
+ \ifx\scaleboxstampb\empty
+ % no need to check further
+ \else
+ \dosetscalboxsxsy
+ \fi
+ \dodoscaleboxcalculations
+ \fi
+ \fi \fi}
+
+\def\dosetscalboxsxsy
+ {\ifdim\scaleparameter\c!sx\onepoint=\onepoint\else
+ \setevalue{\currentscaletag\c!width }{\the\dimexpr\scaleparameter\c!sx\wd\nextbox\relax}%
+ \fi
+ \ifdim\scaleparameter\c!sy\onepoint=\onepoint\else
+ \setevalue{\currentscaletag\c!height}{\the\dimexpr\scaleparameter\c!sy\ht\nextbox\relax}%
+ \fi}
+
+\def\doscaleboxrounding#1.#2\relax{#1}
+
+\def\scaleboxrounding#1%
+ {\@EA\@EA\@EA\doscaleboxrounding\@EA\WITHOUTPT\the\dimexpr#1\points*100+32768sp\relax.\relax}
+
+\def\nodoscaleboxcalculations
+ {\settrue\scaleboxdone
+ \xdef\finalscaleboxwidth {\the\dimexpr\scaleparameter\c!sx\wd\nextbox\relax}%
+ \xdef\finalscaleboxheight {\the\dimexpr\scaleparameter\c!sy\ht\nextbox\relax}%
+ \xdef\finalscaleboxxscale {\scaleparameter\c!sx}%
+ \xdef\finalscaleboxyscale {\scaleparameter\c!sy}%
+ \ifx\finalscaleboxxscale\empty\let\finalscaleboxxscale\!!plusone\fi
+ \ifx\finalscaleboxyscale\empty\let\finalscaleboxyscale\!!plusone\fi
+ \xdef\finalscaleboxxfactor{\scaleboxrounding\finalscaleboxxscale}%
+ \xdef\finalscaleboxyfactor{\scaleboxrounding\finalscaleboxyscale}}
+
+\def\dodoscaleboxcalculations
+ {\settrue\scaleboxdone
+ % initial values
+ \scaleboxoffsetx\zeropoint
+ \scaleboxoffsety\zeropoint
+ \scaleboxsizex \nextboxwd
+ \scaleboxsizey \nextboxht % alleen ht wordt geschaald!
+ % final values
+ \global\scaleboxdimx \zeropoint % see note * (core-fig)
+ \global\scaleboxdimy \zeropoint % see note * (core-fig)
+ \scaleboxscax \plusone % see note * (core-fig)
+ \scaleboxscay \plusone % see note * (core-fig)
+ % preparations
+ \setfalse\scaleboxscalingdone
+ \checkscaleboxsettings
+ % calculators
+ % beware, they operate in sequence, and calculate missing dimensions / messy
+ %setscaleboxbynature % when? needed?
+ \ifconditional\scaleboxscalingdone\else\setscaleboxbyfactor \fi
+ \ifconditional\scaleboxscalingdone\else\setscaleboxbyscale \fi
+ \ifconditional\scaleboxscalingdone\else\setscaleboxbydimension\fi
+ % finalizers / to be done (no longer needed this way, clean up)
+ \convertscaleboxinsertscale\scaleboxhsize\figx\scaleboxscax\scax
+ \convertscaleboxinsertscale\scaleboxvsize\figy\scaleboxscay\scay
+ % used in actual scaling
+ \xdef\finalscaleboxwidth {\the\scaleboxdimx}%
+ \xdef\finalscaleboxheight {\the\scaleboxdimy}%
+ \xdef\finalscaleboxxfactor{\the\scaleboxscax}%
+ \xdef\finalscaleboxyfactor{\the\scaleboxscay}%
+ \xdef\finalscaleboxxscale {\withoutpt\the\dimexpr\scax\points/\plushundred\relax}%
+ \xdef\finalscaleboxyscale {\withoutpt\the\dimexpr\scay\points/\plushundred\relax}}
+
+
+\setvalue{\??xy:\c!grid:\v!yes }{\getnoflines \fighei\setevalue{\currentscaletag\c!height}{\the\noflines\lineheight}}
+\setvalue{\??xy:\c!grid:\v!height }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight+\strutdepth\relax}}
+\setvalue{\??xy:\c!grid:\v!depth }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight-\strutdepth\relax}}
+\setvalue{\??xy:\c!grid:\v!halfline}{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight+.5\lineheight\relax}}
+\setvalue{\??xy:\c!grid:\v!fit }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\noflines\lineheight}}
+\letvalue{\??xy:\c!grid:\empty }\donothing
+
+\def\checkscaleboxsettings
+ {\doifsomething{\scaleparameter\c!maxwidth }% can be defined in itself
+ {\setevalue{\currentscaletag\c!maxwidth }{\the\dimexpr\scaleparameter\c!maxwidth \relax}}%
+ \doifsomething{\scaleparameter\c!maxheight}% can be defined in itself
+ {\setevalue{\currentscaletag\c!maxheight}{\the\dimexpr\scaleparameter\c!maxheight\relax}}%
+ \doifsomething{\scaleparameter\c!lines}
+ {\setevalue{\currentscaletag\c!height}{\the\dimexpr\scaleparameter\c!lines\lineheight\relax}}%
+ \getvalue{\??xy:\c!grid:\scaleparameter\c!grid}}
+
+\def\setscaleboxbynature % where ! ! ! ! !
+ {\doifsomething{\scaleparameter\c!width }{\global\scaleboxdimx\scaleparameter\c!width }%
+ \doifsomething{\scaleparameter\c!height}{\global\scaleboxdimy\scaleparameter\c!height}%
+ \doifsomething{\scaleparameter\c!scale } {\scaleboxscax\scaleparameter\c!scale
+ \scaleboxscay\scaleparameter\c!scale }%
+ \doifsomething{\scaleparameter\c!xscale} {\scaleboxscax\scaleparameter\c!xscale}%
+ \doifsomething{\scaleparameter\c!yscale} {\scaleboxscay\scaleparameter\c!yscale}} % oeps, was x
+
+% \defineexternalfigure[width-6][factor=auto,maxwidth=\textheight,maxheight=\textwidth]
+% \defineexternalfigure[width-7][factor=auto,maxwidth=\textwidth,maxheight=\textheight]
+% \placefigure{none}{\rotate[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-6]}} \page
+% \placefigure{none}{\framed[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-7]}}
+
+\def\setscaleboxbyfactor
+ {\doifinsetelse{\scaleparameter\c!factor}{\v!max,\v!fit,\v!broad,\v!auto}
+ {\doapplyscaleboxsize
+ \ifdim\scaleboxsizex>\scaleboxsizey
+ \docalculatescaleboxnorm \scaleboxdimx\c!factor\c!maxwidth\hsize\scaleboxhsize
+ \docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey
+ \else
+ \docalculatescaleboxnorm \scaleboxdimy\c!factor\c!maxheight\scaleboxoutervsize\scaleboxvsize
+ \docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex
+ \fi
+ \donetrue}
+ {\doifinsetelse{\scaleparameter\c!hfactor}{\v!max,\v!fit,\v!broad,\v!auto}
+ {\doapplyscaleboxsize
+ \docalculatescaleboxnorm \scaleboxdimy\c!hfactor\c!maxheight\scaleboxoutervsize\scaleboxvsize
+ \docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex
+ \donetrue}
+ {\doifinsetelse{\scaleparameter\c!wfactor}{\v!max,\v!fit,\v!broad,\v!auto}
+ {\doapplyscaleboxsize
+ \docalculatescaleboxnorm \scaleboxdimx\c!wfactor\c!maxwidth\hsize\scaleboxhsize
+ \docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey
+ \donetrue}
+ {\docalculatescaleboxnorm\scaleboxdimy\c!factor \c!height \textheight\scaleboxvsize
+ \docalculatescaleboxnorm\scaleboxdimy\c!hfactor\c!height \textheight\scaleboxvsize
+ \docalculatescaleboxnorm\scaleboxdimx\c!wfactor\c!width \hsize \hsize
+ \donefalse}}}%
+ \ifdone
+ \settrue\scaleboxscalingdone
+ \ifdim\scaleboxdimx>\scaleboxhsize
+ \global\scaleboxdimy\zeropoint \global\scaleboxdimx\scaleboxhsize
+ \else\ifdim\scaleboxdimy>\scaleboxvsize
+ \global\scaleboxdimx\zeropoint \global\scaleboxdimy\scaleboxvsize
+ \fi\fi
+ \setscaleboxbydimension
+ \fi}
+
+\def\setscaleboxbyscale
+ {\doifsomething{\scaleparameter\c!scale\scaleparameter\c!xscale\scaleparameter\c!yscale}
+ {\doapplyscaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax\c!xscale
+ \doapplyscaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay\c!yscale
+ \global\scaleboxdimx\zeropoint
+ \global\scaleboxdimy\zeropoint
+ \doifelsenothing{\scaleparameter\c!maxwidth}
+ {\doifsomething{\scaleparameter\c!maxheight}
+ {\ifdim\scaleboxsizey>\scaleparameter\c!maxheight\relax
+ \global\scaleboxdimy\scaleparameter\c!maxheight
+ \fi}}
+ {\ifdim\scaleboxsizex>\scaleparameter\c!maxwidth\relax
+ \global\scaleboxdimx\scaleparameter\c!maxwidth
+ \fi}}}
+
+\def\setscaleboxbydimension
+ {\ifdim\scaleboxdimx>\zeropoint
+ \ifdim\scaleboxdimy>\zeropoint
+ \dosetdimensionscaleboxsize
+ {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay
+ \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}%
+ {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay
+ \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}%
+ {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay
+ \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}%
+ \else
+ \dosetdimensionscaleboxsize
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ \fi
+ \else
+ \ifdim\scaleboxdimy>\zeropoint
+ \dosetdimensionscaleboxsize
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ \else
+ \dosetdimensionscaleboxsize
+ {\doapplyscaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax\c!xscale
+ \doapplyscaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay\c!yscale}%
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ \fi
+ \fi}
+
+\def\dosetdimensionscaleboxsize#1#2#3%
+ {#1\relax
+ \doifsomething{\scaleparameter\c!maxwidth}
+ {\ifdim\scaleboxdimx>\scaleparameter\c!maxwidth\relax
+ \global\scaleboxdimx\scaleparameter\c!maxwidth
+ #2\relax
+ \fi}%
+ \doifsomething{\scaleparameter\c!maxheight}
+ {\ifdim\scaleboxdimy>\scaleparameter\c!maxheight\relax
+ \global\scaleboxdimy\scaleparameter\c!maxheight
+ #3\relax
+ \fi}}
+
+\def\docalculatescaleboxnorm#1#2#3#4#5% 2 3 parameters (dodo:speedup)
+ {\processaction
+ [\scaleparameter#2]
+ [ \v!max=>\global#1\dimexpr#4\relax,
+ \v!fit=>\global#1\dimexpr#5\relax,
+ \v!broad=>\global#1\dimexpr#5-4\@@exbodyfont\relax,
+ \v!auto=>\doifsomething{\scaleparameter#3}{\global#1\dimexpr\scaleparameter#3\relax},
+ \s!default=>\doifsomething{\scaleparameter#3}{\global#1\dimexpr\scaleparameter#3\relax},
+ \s!unknown=>\global#1\dimexpr\scaleparameter#2\dimexpr\@@exbodyfont/10\relax\relax]}
+
+\def\docalculatescaleboxscales#1#2#3#4%
+ {\scratchdimen\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax
+ \scaleboxscax\scratchdimen
+ \scaleboxscay\scratchdimen
+ #3\dimexpr\scaleboxscax\dimexpr#4/\plusthousand\relax\relax}
+
+\def\docalculatescaleboxscale#1#2#3%
+ {#3\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax}
+
+\def\doapplyscaleboxscale#1#2#3#4% $4 = parameter / scale can be empty
+ {\ifcase0\scaleparameter#4\relax
+ \ifcase0\scaleparameter\c!scale\relax
+ #3=\plusthousand
+ \else
+ #3=\scaleparameter\c!scale
+ \fi
+ \else
+ #3=\scaleparameter#4%
+ \fi
+ \relax % important ! still ?
+ \global#1\ifnum#3=\plusthousand#2\else\dimexpr#3\dimexpr#2/\plusthousand\relax\relax\fi
+ \relax}
+
+\def\doapplyscaleboxsize
+ {\doifelsenothing{\scaleparameter\c!maxheight}
+ {\scaleboxoutervsize\textheight
+ \ifinner
+ \scaleboxoutervsize \vsize % \textheight =\vsize
+ \scratchdimen\vsize % \scratchdimen=\textheight
+ \else\ifinsidefloat
+ \scaleboxoutervsize \vsize % \textheight =\vsize
+ \scratchdimen\vsize % \scratchdimen=\textheight
+ \else\ifinpagebody
+ \scaleboxoutervsize \vsize % \textheight =\vsize
+ \scratchdimen\vsize % \scratchdimen=\textheight
+ \else % hm, there should be an option to force this
+ \ifdim\pagegoal<\maxdimen
+ \ifdim\pagetotal<\pagegoal
+ \scratchdimen\pagegoal
+ \advance\scratchdimen -\pagetotal
+ \else
+ \scratchdimen\scaleboxoutervsize % \textheight
+ \fi
+ \else
+ \scratchdimen\scaleboxoutervsize % \textheight
+ \fi
+ \fi\fi\fi}
+ {\scratchdimen\scaleparameter\c!maxheight
+ \scaleboxoutervsize\scratchdimen}%
+ \doifelsenothing{\scaleparameter\c!height}
+ {\scaleboxvsize\scratchdimen}
+ {\scaleboxvsize\scaleparameter\c!height}%
+ \doifelsenothing{\scaleparameter\c!width}
+ {\scaleboxhsize\hsize}
+ {\scaleboxhsize\scaleparameter\c!width}}
+
+\def\convertscaleboxinsertscale#1#2#3#4%
+ {\scratchdimen#1\relax
+ \ifnum#3=\plusthousand
+ % == scale 1
+ \else
+ % better 1000 100 10 ranges, evt round 2sp
+ \divide\scratchdimen \plusthousand
+ \multiply\scratchdimen #3\relax
+ \fi
+ \scratchdimen-\scratchdimen % beter hier - dan in driver
+ \edef#2{\the\scratchdimen}%
+ \scratchcounter#3\relax
+ \ifnum\scratchcounter>\plustenthousand
+ \divide\scratchcounter\!!ten \scratchdimen\the\scratchcounter\points
+ \else
+ \scratchdimen\the\scratchcounter\points \divide\scratchdimen\!!ten
+ \fi
+ \edef#4{\withoutpt\the\scratchdimen}}
+
+% \startcombination
+% {\externalfigure[cow.pdf] [frame=on,height=3cm,equalwidth=6cm]} {}
+% {\externalfigure[mill.png][frame=on,height=3cm,equalwidth=6cm]} {}
+% \stopcombination
+
+\def\doscaleboxposition
+ {\doifsomething{\scaleparameter\c!equalwidth}
+ {\scratchdimen\scaleparameter\c!equalwidth\relax
+ \ifdim\wd\nextbox<\scratchdimen
+ \setbox\nextbox\hbox to \scratchdimen{\hss\box\nextbox\hss}%
+ \fi}%
+ \doifsomething{\scaleparameter\c!equalheight}
+ {\scratchdimen\scaleparameter\c!equalheight\relax
+ \ifdim\ht\nextbox<\scratchdimen
+ \setbox\nextbox\vbox to \scratchdimen{\vss\box\nextbox\vss}%
+ \fi}}
+
+%D \macros
+%D {clip, setupclipping}
+%D
+%D Although related to figures, clipping can be applied to
+%D arbitrary content. We can use \METAPOST\ to provide a non
+%D rectangular clipping path.
+%D
+%D \starttyping
+%D \startMPclip{fun}
+%D clip currentpicture to fullcircle
+%D shifted (.5,.5) xscaled \width yscaled \height ;
+%D \stopMPclip
+%D \stoptyping
+%D
+%D We get a rectangular piece of the figure when we say:
+%D
+%D \starttyping
+%D \clip[x=2,y=1]{\externalfigure[photo]}
+%D \stoptyping
+%D
+%D When we want to clip to the oval we defined a few lines ago,
+%D we say:
+%D
+%D \starttyping
+%D \clip[nx=1,ny=1,x=1,y=1,mp=fun]{\externalfigure[photo]}
+%D \stoptyping
+%D
+%D The general characteristics of clipping can be set up with
+%D
+%D \showsetup{setupclipping}
+
+\def\setupclipping
+ {\dodoubleargument\getparameters[\??cp]}
+
+\def\clip
+ {\dosingleempty\doclip}
+
+\def\doclip[#1]% nb top->bottom left->right
+ {\bgroup
+ \getparameters[\??cp][#1]%
+ \doifelse\@@cpstate\v!start\dodoclip{\egroup\hbox}}
+
+\def\dodoclip
+ {\dowithnextbox
+ {\ifdim\@@cpwidth>\zeropoint
+ \!!dimena\@@cpwidth
+ \!!dimenc\@@cphoffset
+ \else
+ \!!dimena\nextboxwd
+ \divide\!!dimena \@@cpnx
+ \!!dimenc\@@cpx\!!dimena
+ \advance\!!dimenc -\!!dimena
+ \!!dimena\@@cpsx\!!dimena
+ \fi
+ \relax % sure
+ \ifdim\@@cpheight>\zeropoint
+ \!!dimenb\@@cpheight
+ \!!dimend\nextboxht
+ \advance\!!dimend -\@@cpvoffset
+ \advance\!!dimend -\!!dimenb
+ \else
+ \!!dimenb\nextboxht
+ \divide\!!dimenb \@@cpny
+ \!!dimend-\@@cpy\!!dimenb
+ \advance\!!dimend -\@@cpsy\!!dimenb
+ \advance\!!dimend \!!dimenb
+ \!!dimenb\@@cpsy\!!dimenb
+ \advance\!!dimend \nextboxht % dimend !
+ \fi
+ \setbox\nextbox\hbox % old
+ {\advance\!!dimenc -\@@cpleftoffset % new !
+ \advance\!!dimend -\@@cpbottomoffset % new ! % - added
+ \hskip-\!!dimenc\lower\!!dimend\flushnextbox}% old
+ \nextboxwd\zeropoint
+ \nextboxht\zeropoint
+ \nextboxdp\zeropoint
+ \setbox\nextbox\hbox
+ {\advance\!!dimena \@@cpleftoffset % new !
+ \advance\!!dimena \@@cprightoffset % new !
+ \advance\!!dimenb \@@cpbottomoffset % new !
+ \advance\!!dimenb \@@cptopoffset % new !
+ \dostartclipping\@@cpmp\!!dimena\!!dimenb % old
+ \flushnextbox
+ \dostopclipping}%
+ \setbox\nextbox\hbox % new !
+ {\!!dimena-\@@cpleftoffset % new !
+ \!!dimenb \@@cpbottomoffset % new ! % - removed
+ \hskip\!!dimena\lower\!!dimenb\flushnextbox}% new !
+ \nextboxwd\!!dimena
+ \nextboxht\!!dimenb
+ \nextboxdp\zeropoint
+ \flushnextbox
+ \egroup}%
+ \hbox}
+
+\setupclipping
+ [\c!state=\v!start,
+ \c!n=1, % was 2
+ \c!nx=\@@cpn,\c!x=1,\c!sx=1,
+ \c!ny=\@@cpn,\c!y=1,\c!sy=1,
+ \c!width=\!!zeropoint,
+ \c!height=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,
+ \c!voffset=\!!zeropoint,
+ \c!offset=\zeropoint,
+ \c!leftoffset=\@@cpoffset, % \zeropoint,
+ \c!rightoffset=\@@cpoffset, % \zeropoint,
+ \c!topoffset=\@@cpoffset, % \zeropoint,
+ \c!bottomoffset=\@@cpoffset,% \zeropoint,
+ \c!mp=]
+
+%D \startbuffer
+%D \startuseMPgraphic{test}
+%D path p ; p := fullcircle scaled 4cm ;
+%D draw p withpen pencircle scaled 1cm ;
+%D setbounds currentpicture to boundingbox p ;
+%D \stopuseMPgraphic
+%D
+%D \hbox to \hsize \bgroup
+%D \hss
+%D \ruledhbox{\useMPgraphic{test}}%
+%D \hss
+%D \ruledhbox{\clip{\useMPgraphic{test}}}%
+%D \hss
+%D \egroup
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D Mirroring.
+
+\def\domirrorbox % \hbox/\vbox/\vtop
+ {\bgroup
+ \dowithnextbox
+ {\dontshowcomposition
+ \scratchdimen\nextboxwd
+ % better use an hbox (if no \forgetall, leftskip etc may creep in)
+ %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
+ \setbox\nextbox\hbox{\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
+ \nextboxwd\scratchdimen
+ \flushnextbox
+ \egroup}}
+
+\unexpanded\def\mirror
+ {\domirrorbox\hbox}
+
+% \setbox0=\hbox{gans}
+% \ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}}
+% \mirror{\ruledhbox{\copy0 \schaal{\box0}}}
+
+\protect \endinput
diff --git a/tex/context/base/grph-trf.mkiv b/tex/context/base/grph-trf.mkiv
new file mode 100644
index 000000000..9924a68e8
--- /dev/null
+++ b/tex/context/base/grph-trf.mkiv
@@ -0,0 +1,580 @@
+%D \module
+%D [ file=grph-fig,
+%D version=2006.08.26, % overhaul/split of 1997.03.31 core-fig
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Transformations,
+%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 It may be that some functionality got lost. If it concerns
+%D defined features, let me know and it will be sorted out.
+
+%D We will move the calculations to lua.
+
+\writestatus{loading}{ConTeXt Graphic Macros / Transformations}
+
+\unprotect
+
+%D Scaling:
+
+\unexpanded\def\scale{\dodoubleempty\doscalenextbox[\??xy]}
+
+% probably too many dimens / the width calculations can go
+% since we may assume scaling is available (was not true
+% long ago which is why we also calculate the width)
+
+\newdimen\scaleboxwidth
+\newdimen\scaleboxheight
+\newdimen\scaleboxdepth
+
+\newdimen\scaleboxsizex
+\newdimen\scaleboxsizey
+\newdimen\scaleboxoffsetx
+\newdimen\scaleboxoffsety
+
+\newdimen\scaleboxhsize
+\newdimen\scaleboxvsize
+
+% global
+
+\newdimen\scaleboxdimx \let\figwid \scaleboxdimx
+\newdimen\scaleboxdimy \let\fighei \scaleboxdimy
+\newcount\scaleboxscax \let\figxsca\scaleboxscax
+\newcount\scaleboxscay \let\figysca\scaleboxscay
+
+\newdimen\scaleboxoutervsize % we cannot manipulate any global vsize !
+
+\let\finalscaleboxxscale \!!plusone
+\let\finalscaleboxyscale \!!plusone
+\let\finalscaleboxwidth \!!zeropoint
+\let\finalscaleboxheight \!!zeropoint
+\let\finalscaleboxxfactor\!!hundred
+\let\finalscaleboxyfactor\!!hundred
+
+\newconditional\scaleboxdone
+
+\def\doscalenextbox[#1][#2]%
+ {\bgroup
+ \getparameters
+ [#1]
+ [\c!scale=,\c!xscale=,\c!yscale=,\c!width=,\c!height=,\c!lines=,
+ \c!factor=,\c!hfactor=,\c!wfactor=,\c!grid=,\c!sx=1,\c!sy=1,
+ \c!equalwidth=,\c!equalheight=,
+ \c!maxwidth=\scaleparameter\c!width,\c!maxheight=\scaleparameter\c!height,
+ #2]%
+ \dowithnextbox{\dodoscalenextbox{#1}\egroup}\hbox}
+
+\def\doscalebox#1%
+ {\bgroup\dowithnextbox{\dodoscalenextbox{#1}\egroup}\hbox}
+
+\let\currentscaletag\??xy
+
+\def\scaleparameter#1%
+ {\csname\currentscaletag#1\endcsname}
+
+\def\setscaleparameter#1#2%
+ {\setvalue{\currentscaletag#1}{#2}}
+
+\def\dodoscalenextbox#1%
+ {\edef\currentscaletag{#1}%
+ \doif{\scaleparameter\c!depth}\v!no{\setbox\nextbox\hbox{\raise\nextboxdp\box\nextbox}}% new
+ \forgetall
+ \dontshowcomposition
+ \dontcomplain
+ \doscaleboxcalculations
+ \doscaleboxindeed
+ \doscaleboxposition
+ \flushnextbox}
+
+\def\doscaleboxindeed
+ {\ifconditional\scaleboxdone
+ \scaleboxwidth \finalscaleboxxscale\nextboxwd
+ \scaleboxheight\finalscaleboxyscale\nextboxht
+ \scaleboxdepth \finalscaleboxyscale\nextboxdp
+ \setbox\nextbox\hbox
+ {\dostartscaling \finalscaleboxxscale \finalscaleboxyscale
+ \smashedbox\nextbox
+ \dostopscaling}%
+ \nextboxwd\scaleboxwidth
+ \nextboxht\scaleboxheight
+ \nextboxdp\scaleboxdepth
+ \fi}
+
+\def\doscaleboxcalculations
+ {\setfalse\scaleboxdone
+ % initial final value
+ \global\let\finalscaleboxxscale \!!plusone
+ \global\let\finalscaleboxyscale \!!plusone
+ \xdef \finalscaleboxwidth {\the\nextboxwd}%
+ \xdef \finalscaleboxheight{\the\nextboxht}%
+ \global\let\finalscaleboxxfactor\!!hundred
+ \global\let\finalscaleboxyfactor\!!hundred
+ \ifdim\nextboxht>\zeropoint \ifdim\nextboxwd>\zeropoint
+ % hm, still useful? better in lua anyway
+ \edef\scaleboxstampa % slow way [can be combined]
+ {\scaleparameter\c!scale \scaleparameter\c!xscale \scaleparameter\c!yscale
+ \scaleparameter\c!factor\scaleparameter\c!wfactor\scaleparameter\c!hfactor
+ \scaleparameter\c!lines \scaleparameter\c!width \scaleparameter\c!height}%
+ \edef\scaleboxstampb % fast way [just sx/sy]
+ {\scaleparameter\c!sx
+ \scaleparameter\c!sy}%
+ \edef\scaleboxstampc
+ {11}%
+ \ifx\scaleboxstampa\empty
+ \ifx\scaleboxstampb\scaleboxstampc
+ % no scaling, but still check; new, gone again
+% wrong: scaled proportionally as side effect
+% \doifsomething{\scaleparameter\c!maxwidth }{\letvalue{\currentscaletag\c!factor}\v!fit}%
+% \doifsomething{\scaleparameter\c!maxheight}{\letvalue{\currentscaletag\c!factor}\v!fit}%
+ \insidefloattrue % trick
+ \dodoscaleboxcalculations
+ \else
+ \dosetscalboxsxsy
+ \nodoscaleboxcalculations
+ \fi
+ \else
+ \ifx\scaleboxstampb\empty
+ % no need to check further
+ \else
+ \dosetscalboxsxsy
+ \fi
+ \dodoscaleboxcalculations
+ \fi
+ \fi \fi}
+
+\def\dosetscalboxsxsy
+ {\ifdim\scaleparameter\c!sx\onepoint=\onepoint\else
+ \setevalue{\currentscaletag\c!width }{\the\dimexpr\scaleparameter\c!sx\wd\nextbox\relax}%
+ \fi
+ \ifdim\scaleparameter\c!sy\onepoint=\onepoint\else
+ \setevalue{\currentscaletag\c!height}{\the\dimexpr\scaleparameter\c!sy\ht\nextbox\relax}%
+ \fi}
+
+\def\doscaleboxrounding#1.#2\relax{#1}
+
+\def\scaleboxrounding#1%
+ {\@EA\@EA\@EA\doscaleboxrounding\@EA\WITHOUTPT\the\dimexpr#1\points*100+32768sp\relax.\relax}
+
+\def\nodoscaleboxcalculations
+ {\settrue\scaleboxdone
+ \xdef\finalscaleboxwidth {\the\dimexpr\scaleparameter\c!sx\wd\nextbox\relax}%
+ \xdef\finalscaleboxheight {\the\dimexpr\scaleparameter\c!sy\ht\nextbox\relax}%
+ \xdef\finalscaleboxxscale {\scaleparameter\c!sx}%
+ \xdef\finalscaleboxyscale {\scaleparameter\c!sy}%
+ \ifx\finalscaleboxxscale\empty\let\finalscaleboxxscale\!!plusone\fi
+ \ifx\finalscaleboxyscale\empty\let\finalscaleboxyscale\!!plusone\fi
+ \xdef\finalscaleboxxfactor{\scaleboxrounding\finalscaleboxxscale}%
+ \xdef\finalscaleboxyfactor{\scaleboxrounding\finalscaleboxyscale}}
+
+\def\dodoscaleboxcalculations
+ {\settrue\scaleboxdone
+ % initial values
+ \scaleboxoffsetx\zeropoint
+ \scaleboxoffsety\zeropoint
+ \scaleboxsizex \nextboxwd
+ \scaleboxsizey \nextboxht % alleen ht wordt geschaald!
+ % final values
+ \global\scaleboxdimx \zeropoint % see note * (core-fig)
+ \global\scaleboxdimy \zeropoint % see note * (core-fig)
+ \scaleboxscax \plusone % see note * (core-fig)
+ \scaleboxscay \plusone % see note * (core-fig)
+ % preparations
+ \setfalse\scaleboxscalingdone
+ \checkscaleboxsettings
+ % calculators
+ % beware, they operate in sequence, and calculate missing dimensions / messy
+ %setscaleboxbynature % when? needed?
+ \ifconditional\scaleboxscalingdone\else\setscaleboxbyfactor \fi
+ \ifconditional\scaleboxscalingdone\else\setscaleboxbyscale \fi
+ \ifconditional\scaleboxscalingdone\else\setscaleboxbydimension\fi
+ % finalizers / to be done (no longer needed this way, clean up)
+ \convertscaleboxinsertscale\scaleboxhsize\figx\scaleboxscax\scax
+ \convertscaleboxinsertscale\scaleboxvsize\figy\scaleboxscay\scay
+ % used in actual scaling
+ \xdef\finalscaleboxwidth {\the\scaleboxdimx}%
+ \xdef\finalscaleboxheight {\the\scaleboxdimy}%
+ \xdef\finalscaleboxxfactor{\the\scaleboxscax}%
+ \xdef\finalscaleboxyfactor{\the\scaleboxscay}%
+ \xdef\finalscaleboxxscale {\withoutpt\the\dimexpr\scax\points/\plushundred\relax}%
+ \xdef\finalscaleboxyscale {\withoutpt\the\dimexpr\scay\points/\plushundred\relax}}
+
+\setvalue{\??xy:\c!grid:\v!yes }{\getnoflines \fighei\setevalue{\currentscaletag\c!height}{\the\noflines\lineheight}}
+\setvalue{\??xy:\c!grid:\v!height }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight+\strutdepth\relax}}
+\setvalue{\??xy:\c!grid:\v!depth }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight-\strutdepth\relax}}
+\setvalue{\??xy:\c!grid:\v!halfline}{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight+.5\lineheight\relax}}
+\setvalue{\??xy:\c!grid:\v!fit }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\noflines\lineheight}}
+\letvalue{\??xy:\c!grid:\empty }\donothing
+
+\def\checkscaleboxsettings
+ {\doifsomething{\scaleparameter\c!maxwidth }% can be defined in itself
+ {\setevalue{\currentscaletag\c!maxwidth }{\the\dimexpr\scaleparameter\c!maxwidth \relax}}%
+ \doifsomething{\scaleparameter\c!maxheight}% can be defined in itself
+ {\setevalue{\currentscaletag\c!maxheight}{\the\dimexpr\scaleparameter\c!maxheight\relax}}%
+ \doifsomething{\scaleparameter\c!lines}
+ {\setevalue{\currentscaletag\c!height}{\the\dimexpr\scaleparameter\c!lines\lineheight\relax}}%
+ \getvalue{\??xy:\c!grid:\scaleparameter\c!grid}}
+
+\def\setscaleboxbynature % where ! ! ! ! !
+ {\doifsomething{\scaleparameter\c!width }{\global\scaleboxdimx\scaleparameter\c!width }%
+ \doifsomething{\scaleparameter\c!height}{\global\scaleboxdimy\scaleparameter\c!height}%
+ \doifsomething{\scaleparameter\c!scale } {\scaleboxscax\scaleparameter\c!scale
+ \scaleboxscay\scaleparameter\c!scale }%
+ \doifsomething{\scaleparameter\c!xscale} {\scaleboxscax\scaleparameter\c!xscale}%
+ \doifsomething{\scaleparameter\c!yscale} {\scaleboxscay\scaleparameter\c!yscale}} % oeps, was x
+
+% \defineexternalfigure[width-6][factor=auto,maxwidth=\textheight,maxheight=\textwidth]
+% \defineexternalfigure[width-7][factor=auto,maxwidth=\textwidth,maxheight=\textheight]
+% \placefigure{none}{\rotate[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-6]}} \page
+% \placefigure{none}{\framed[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-7]}}
+
+\def\setscaleboxbyfactor
+ {\doifinsetelse{\scaleparameter\c!factor}{\v!max,\v!fit,\v!broad,\v!auto}
+ {\doapplyscaleboxsize
+ \ifdim\scaleboxsizex>\scaleboxsizey
+ \docalculatescaleboxnorm \scaleboxdimx\c!factor\c!maxwidth\hsize\scaleboxhsize
+ \docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey
+ \else
+ \docalculatescaleboxnorm \scaleboxdimy\c!factor\c!maxheight\scaleboxoutervsize\scaleboxvsize
+ \docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex
+ \fi
+ \donetrue}
+ {\doifinsetelse{\scaleparameter\c!hfactor}{\v!max,\v!fit,\v!broad,\v!auto}
+ {\doapplyscaleboxsize
+ \docalculatescaleboxnorm \scaleboxdimy\c!hfactor\c!maxheight\scaleboxoutervsize\scaleboxvsize
+ \docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex
+ \donetrue}
+ {\doifinsetelse{\scaleparameter\c!wfactor}{\v!max,\v!fit,\v!broad,\v!auto}
+ {\doapplyscaleboxsize
+ \docalculatescaleboxnorm \scaleboxdimx\c!wfactor\c!maxwidth\hsize\scaleboxhsize
+ \docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey
+ \donetrue}
+ {\docalculatescaleboxnorm\scaleboxdimy\c!factor \c!height \textheight\scaleboxvsize
+ \docalculatescaleboxnorm\scaleboxdimy\c!hfactor\c!height \textheight\scaleboxvsize
+ \docalculatescaleboxnorm\scaleboxdimx\c!wfactor\c!width \hsize \hsize
+ \donefalse}}}%
+ \ifdone
+ \settrue\scaleboxscalingdone
+ \ifdim\scaleboxdimx>\scaleboxhsize
+ \global\scaleboxdimy\zeropoint \global\scaleboxdimx\scaleboxhsize
+ \else\ifdim\scaleboxdimy>\scaleboxvsize
+ \global\scaleboxdimx\zeropoint \global\scaleboxdimy\scaleboxvsize
+ \fi\fi
+ \setscaleboxbydimension
+ \fi}
+
+\def\setscaleboxbyscale
+ {\doifsomething{\scaleparameter\c!scale\scaleparameter\c!xscale\scaleparameter\c!yscale}
+ {\doapplyscaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax\c!xscale
+ \doapplyscaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay\c!yscale
+ \global\scaleboxdimx\zeropoint
+ \global\scaleboxdimy\zeropoint
+ \doifelsenothing{\scaleparameter\c!maxwidth}
+ {\doifsomething{\scaleparameter\c!maxheight}
+ {\ifdim\scaleboxsizey>\scaleparameter\c!maxheight\relax
+ \global\scaleboxdimy\scaleparameter\c!maxheight
+ \fi}}
+ {\ifdim\scaleboxsizex>\scaleparameter\c!maxwidth\relax
+ \global\scaleboxdimx\scaleparameter\c!maxwidth
+ \fi}}}
+
+\def\setscaleboxbydimension
+ {\ifdim\scaleboxdimx>\zeropoint
+ \ifdim\scaleboxdimy>\zeropoint
+ \dosetdimensionscaleboxsize
+ {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay
+ \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}%
+ {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay
+ \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}%
+ {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay
+ \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}%
+ \else
+ \dosetdimensionscaleboxsize
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ \fi
+ \else
+ \ifdim\scaleboxdimy>\zeropoint
+ \dosetdimensionscaleboxsize
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ \else
+ \dosetdimensionscaleboxsize
+ {\doapplyscaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax\c!xscale
+ \doapplyscaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay\c!yscale}%
+ {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}%
+ {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}%
+ \fi
+ \fi}
+
+\def\dosetdimensionscaleboxsize#1#2#3%
+ {#1\relax
+ \doifsomething{\scaleparameter\c!maxwidth}
+ {\ifdim\scaleboxdimx>\scaleparameter\c!maxwidth\relax
+ \global\scaleboxdimx\scaleparameter\c!maxwidth
+ #2\relax
+ \fi}%
+ \doifsomething{\scaleparameter\c!maxheight}
+ {\ifdim\scaleboxdimy>\scaleparameter\c!maxheight\relax
+ \global\scaleboxdimy\scaleparameter\c!maxheight
+ #3\relax
+ \fi}}
+
+\def\docalculatescaleboxnorm#1#2#3#4#5% 2 3 parameters (dodo:speedup)
+ {\processaction
+ [\scaleparameter#2]
+ [ \v!max=>\global#1\dimexpr#4\relax,
+ \v!fit=>\global#1\dimexpr#5\relax,
+ \v!broad=>\global#1\dimexpr#5-4\@@exbodyfont\relax,
+ \v!auto=>\doifsomething{\scaleparameter#3}{\global#1\dimexpr\scaleparameter#3\relax},
+ \s!default=>\doifsomething{\scaleparameter#3}{\global#1\dimexpr\scaleparameter#3\relax},
+ \s!unknown=>\global#1\dimexpr\scaleparameter#2\dimexpr\@@exbodyfont/10\relax\relax]}
+
+\def\docalculatescaleboxscales#1#2#3#4%
+ {\scratchdimen\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax
+ \scaleboxscax\scratchdimen
+ \scaleboxscay\scratchdimen
+ #3\dimexpr\scaleboxscax\dimexpr#4/\plusthousand\relax\relax}
+
+\def\docalculatescaleboxscale#1#2#3%
+ {#3\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax}
+
+\def\doapplyscaleboxscale#1#2#3#4% $4 = parameter / scale can be empty
+ {\ifcase0\scaleparameter#4\relax
+ \ifcase0\scaleparameter\c!scale\relax
+ #3=\plusthousand
+ \else
+ #3=\scaleparameter\c!scale
+ \fi
+ \else
+ #3=\scaleparameter#4%
+ \fi
+ \relax % important ! still ?
+ \global#1\ifnum#3=\plusthousand#2\else\dimexpr#3\dimexpr#2/\plusthousand\relax\relax\fi
+ \relax}
+
+\def\doapplyscaleboxsize
+ {\doifelsenothing{\scaleparameter\c!maxheight}
+ {\scaleboxoutervsize\textheight
+ \ifinner
+ \scaleboxoutervsize \vsize % \textheight =\vsize
+ \scratchdimen\vsize % \scratchdimen=\textheight
+ \else\ifinsidefloat
+ \scaleboxoutervsize \vsize % \textheight =\vsize
+ \scratchdimen\vsize % \scratchdimen=\textheight
+ \else\ifinpagebody
+ \scaleboxoutervsize \vsize % \textheight =\vsize
+ \scratchdimen\vsize % \scratchdimen=\textheight
+ \else % hm, there should be an option to force this
+ \ifdim\pagegoal<\maxdimen
+ \ifdim\pagetotal<\pagegoal
+ \scratchdimen\dimexpr\pagegoal-\pagetotal\relax
+ \else
+ \scratchdimen\scaleboxoutervsize % \textheight
+ \fi
+ \else
+ \scratchdimen\scaleboxoutervsize % \textheight
+ \fi
+ \fi\fi\fi}
+ {\scratchdimen\scaleparameter\c!maxheight
+ \scaleboxoutervsize\scratchdimen}%
+ \doifelsenothing{\scaleparameter\c!height}
+ {\scaleboxvsize\scratchdimen}
+ {\scaleboxvsize\scaleparameter\c!height}%
+ \doifelsenothing{\scaleparameter\c!width}
+ {\scaleboxhsize\hsize}
+ {\scaleboxhsize\scaleparameter\c!width}}
+
+\def\convertscaleboxinsertscale#1#2#3#4%
+ {\scratchdimen#1\relax
+ \ifnum#3=\plusthousand
+ % == scale 1
+ \else
+ % better 1000 100 10 ranges, evt round 2sp
+ \divide\scratchdimen \plusthousand
+ \multiply\scratchdimen #3\relax
+ \fi
+ \scratchdimen-\scratchdimen % beter hier - dan in driver
+ \edef#2{\the\scratchdimen}%
+ \scratchcounter#3\relax
+ \ifnum\scratchcounter>\plustenthousand
+ \divide\scratchcounter\!!ten \scratchdimen\the\scratchcounter\points
+ \else
+ \scratchdimen\the\scratchcounter\points \divide\scratchdimen\!!ten
+ \fi
+ \edef#4{\withoutpt\the\scratchdimen}}
+
+% \startcombination
+% {\externalfigure[cow.pdf] [frame=on,height=3cm,equalwidth=6cm]} {}
+% {\externalfigure[mill.png][frame=on,height=3cm,equalwidth=6cm]} {}
+% \stopcombination
+
+\def\doscaleboxposition
+ {\doifsomething{\scaleparameter\c!equalwidth}
+ {\scratchdimen\scaleparameter\c!equalwidth\relax
+ \ifdim\wd\nextbox<\scratchdimen
+ \setbox\nextbox\hbox to \scratchdimen{\hss\box\nextbox\hss}%
+ \fi}%
+ \doifsomething{\scaleparameter\c!equalheight}
+ {\scratchdimen\scaleparameter\c!equalheight\relax
+ \ifdim\ht\nextbox<\scratchdimen
+ \setbox\nextbox\vbox to \scratchdimen{\vss\box\nextbox\vss}%
+ \fi}}
+
+%D \macros
+%D {clip, setupclipping}
+%D
+%D Although related to figures, clipping can be applied to
+%D arbitrary content. We can use \METAPOST\ to provide a non
+%D rectangular clipping path.
+%D
+%D \starttyping
+%D \startMPclip{fun}
+%D clip currentpicture to fullcircle
+%D shifted (.5,.5) xscaled \width yscaled \height ;
+%D \stopMPclip
+%D \stoptyping
+%D
+%D We get a rectangular piece of the figure when we say:
+%D
+%D \starttyping
+%D \clip[x=2,y=1]{\externalfigure[photo]}
+%D \stoptyping
+%D
+%D When we want to clip to the oval we defined a few lines ago,
+%D we say:
+%D
+%D \starttyping
+%D \clip[nx=1,ny=1,x=1,y=1,mp=fun]{\externalfigure[photo]}
+%D \stoptyping
+%D
+%D The general characteristics of clipping can be set up with
+%D
+%D \showsetup{setupclipping}
+
+\unexpanded\def\setupclipping
+ {\dodoubleargument\getparameters[\??cp]}
+
+\def\clip
+ {\dosingleempty\doclip}
+
+\def\doclip[#1]% nb top->bottom left->right
+ {\bgroup
+ \getparameters[\??cp][#1]%
+ \doifelse\@@cpstate\v!start\dodoclip{\egroup\hbox}}
+
+\def\dodoclip
+ {\dowithnextbox
+ {\ifdim\@@cpwidth>\zeropoint
+ \!!dimena\@@cpwidth
+ \!!dimenc\@@cphoffset
+ \else
+ \!!dimena\nextboxwd
+ \divide\!!dimena \@@cpnx
+ \!!dimenc\@@cpx\!!dimena
+ \advance\!!dimenc -\!!dimena
+ \!!dimena\@@cpsx\!!dimena
+ \fi
+ \relax % sure
+ \ifdim\@@cpheight>\zeropoint
+ \!!dimenb\@@cpheight
+ \!!dimend\nextboxht
+ \advance\!!dimend -\@@cpvoffset
+ \advance\!!dimend -\!!dimenb
+ \else
+ \!!dimenb\nextboxht
+ \divide\!!dimenb \@@cpny
+ \!!dimend-\@@cpy\!!dimenb
+ \advance\!!dimend -\@@cpsy\!!dimenb
+ \advance\!!dimend \!!dimenb
+ \!!dimenb\@@cpsy\!!dimenb
+ \advance\!!dimend \nextboxht % dimend !
+ \fi
+ \setbox\nextbox\hbox % old
+ {\advance\!!dimenc -\@@cpleftoffset % new !
+ \advance\!!dimend -\@@cpbottomoffset % new ! % - added
+ \hskip-\!!dimenc\lower\!!dimend\flushnextbox}% old
+ \nextboxwd\zeropoint
+ \nextboxht\zeropoint
+ \nextboxdp\zeropoint
+ \setbox\nextbox\hbox
+ {\advance\!!dimena \@@cpleftoffset % new !
+ \advance\!!dimena \@@cprightoffset % new !
+ \advance\!!dimenb \@@cpbottomoffset % new !
+ \advance\!!dimenb \@@cptopoffset % new !
+ \dostartclipping\@@cpmp\!!dimena\!!dimenb % old
+ \flushnextbox
+ \dostopclipping}%
+ \setbox\nextbox\hbox % new !
+ {\!!dimena-\@@cpleftoffset % new !
+ \!!dimenb \@@cpbottomoffset % new ! % - removed
+ \hskip\!!dimena\lower\!!dimenb\flushnextbox}% new !
+ \nextboxwd\!!dimena
+ \nextboxht\!!dimenb
+ \nextboxdp\zeropoint
+ \flushnextbox
+ \egroup}%
+ \hbox}
+
+\setupclipping
+ [\c!state=\v!start,
+ \c!n=1, % was 2
+ \c!nx=\@@cpn,\c!x=1,\c!sx=1,
+ \c!ny=\@@cpn,\c!y=1,\c!sy=1,
+ \c!width=\!!zeropoint,
+ \c!height=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,
+ \c!voffset=\!!zeropoint,
+ \c!offset=\zeropoint,
+ \c!leftoffset=\@@cpoffset, % \zeropoint,
+ \c!rightoffset=\@@cpoffset, % \zeropoint,
+ \c!topoffset=\@@cpoffset, % \zeropoint,
+ \c!bottomoffset=\@@cpoffset,% \zeropoint,
+ \c!mp=]
+
+%D \startbuffer
+%D \startuseMPgraphic{test}
+%D path p ; p := fullcircle scaled 4cm ;
+%D draw p withpen pencircle scaled 1cm ;
+%D setbounds currentpicture to boundingbox p ;
+%D \stopuseMPgraphic
+%D
+%D \hbox to \hsize \bgroup
+%D \hss
+%D \ruledhbox{\useMPgraphic{test}}%
+%D \hss
+%D \ruledhbox{\clip{\useMPgraphic{test}}}%
+%D \hss
+%D \egroup
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D Mirroring.
+
+\def\domirrorbox % \hbox/\vbox/\vtop
+ {\bgroup
+ \dowithnextbox
+ {\dontshowcomposition
+ \scratchdimen\nextboxwd
+ % better use an hbox (if no \forgetall, leftskip etc may creep in)
+ %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
+ \setbox\nextbox\hbox{\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
+ \nextboxwd\scratchdimen
+ \flushnextbox
+ \egroup}}
+
+\unexpanded\def\mirror
+ {\domirrorbox\hbox}
+
+% \setbox0=\hbox{gans}
+% \ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}}
+% \mirror{\ruledhbox{\copy0 \schaal{\box0}}}
+
+\protect \endinput
diff --git a/tex/context/base/grph-u3d.lua b/tex/context/base/grph-u3d.lua
new file mode 100644
index 000000000..f3bf17631
--- /dev/null
+++ b/tex/context/base/grph-u3d.lua
@@ -0,0 +1,49 @@
+if not modules then modules = { } end modules ['grph-u3d'] = {
+ version = 1.001,
+ comment = "companion to grph-inc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- see lpdf-u3d.lua for comment
+
+local trace_inclusion = false trackers.register("figures.inclusion", function(v) trace_inclusion = v end)
+
+local pdfannotation = nodes.pdfannotation
+local todimen = string.todimen
+
+-- maybe todo: backends.codeinjections.insertu3d
+
+function figures.checkers.u3d(data)
+ local dr, du, ds = data.request, data.used, data.status
+ local width = todimen(dr.width or figures.defaultwidth)
+ local height = todimen(dr.height or figures.defaultheight)
+ local foundname = du.fullname
+ dr.width, dr.height = width, height
+ du.width, du.height, du.foundname = width, height, foundname
+ if trace_inclusion then
+ logs.report("figures","including u3d '%s': width %s, height %s",foundname,width,height)
+ end
+ context.startfoundexternalfigure(width .. "sp",height .. "sp")
+ context(function()
+ local annotation, preview, ref = backends.pdf.helpers.insert3d {
+ foundname = foundname,
+ width = width,
+ height = height,
+ factor = number.dimenfactors.bp,
+ display = dr.display,
+ controls = dr.controls,
+ label = dr.label,
+ }
+--~ print(annotation, preview, ref)
+ node.write(pdfannotation(width,height,0,annotation()))
+ end)
+ context.stopfoundexternalfigure()
+ return data
+end
+
+figures.includers.u3d = figures.includers.nongeneric
+
+figures.registersuffix("u3d","u3d")
+figures.registersuffix("prc","u3d")
diff --git a/tex/context/base/hand-def.mkii b/tex/context/base/hand-def.mkii
new file mode 100644
index 000000000..0a19ce270
--- /dev/null
+++ b/tex/context/base/hand-def.mkii
@@ -0,0 +1,577 @@
+%D \module
+%D [ file=hand-def, % was enco-pro
+%D version=2000.29.09,
+%D title=\CONTEXT\ Handling Macros,
+%D subtitle=Default Protruding Factors,
+%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.
+
+%D This is an experimental definition file. The protruding
+%D values we use here are those found from \THANH's thesis.
+
+\startfonthandling [pure]
+
+ \defineprotrudefactor , 0 1
+ \defineprotrudefactor . 0 1
+ \defineprotrudefactor : 0 1
+ \defineprotrudefactor ; 0 1
+ \defineprotrudefactor - 0 1
+
+ \defineprotrudefactor hyphen 0 1
+ \defineprotrudefactor endash 0 .5
+ \defineprotrudefactor emdash 0 .33 % .5
+
+\stopfonthandling
+
+\startfonthandling [punctuation]
+
+ \defineprotrudefactor ! 0 .2
+ \defineprotrudefactor ' 0 .7
+ \defineprotrudefactor ` .7 0
+ \defineprotrudefactor ( .05 0
+ \defineprotrudefactor ) 0 .05
+ \defineprotrudefactor [ .05 0
+ \defineprotrudefactor ] 0 .05
+ \defineprotrudefactor , 0 .7
+ \defineprotrudefactor - 0 .7
+ \defineprotrudefactor . 0 .7
+ \defineprotrudefactor : 0 .5
+ \defineprotrudefactor ; 0 .5
+
+ \defineprotrudefactor rightupperninequote 0 .5
+ \defineprotrudefactor leftupperninequote .5 0
+ \defineprotrudefactor endash 0 .3
+ \defineprotrudefactor emdash 0 .2
+
+ \defineprotrudefactor hyphen 0 .7
+
+\stopfonthandling
+
+\startfonthandling [alpha]
+
+ \defineprotrudefactor A .05 .05
+ \defineprotrudefactor F 0 .05
+ \defineprotrudefactor J .05 0
+ \defineprotrudefactor K 0 .05
+ \defineprotrudefactor L 0 .05
+ \defineprotrudefactor T .05 .05
+ \defineprotrudefactor V .05 .05
+ \defineprotrudefactor W .05 .05
+ \defineprotrudefactor X .05 .05
+ \defineprotrudefactor Y .05 .05
+
+ \defineprotrudefactor k 0 .05
+ \defineprotrudefactor r 0 .05
+ \defineprotrudefactor t 0 .05
+ \defineprotrudefactor v .05 .05
+ \defineprotrudefactor w .05 .05
+ \defineprotrudefactor x .05 .05
+ \defineprotrudefactor y .05 .05
+
+\stopfonthandling
+
+% ogoneks may need another treatment
+
+\startfonthandling [extended]
+
+ \inherithandling Acircumflex A
+ \inherithandling acircumflex a
+ \inherithandling Ccircumflex C
+ \inherithandling ccircumflex c
+ \inherithandling Ecircumflex E
+ \inherithandling ecircumflex e
+ \inherithandling Gcircumflex G
+ \inherithandling gcircumflex g
+ \inherithandling Hcircumflex H
+ \inherithandling hcircumflex h
+ \inherithandling Icircumflex I
+ \inherithandling icircumflex i
+ \inherithandling Jcircumflex J
+ \inherithandling jcircumflex j
+ \inherithandling Ocircumflex O
+ \inherithandling ocircumflex o
+ \inherithandling Scircumflex S
+ \inherithandling scircumflex s
+ \inherithandling Ucircumflex U
+ \inherithandling ucircumflex u
+ \inherithandling Wcircumflex W
+ \inherithandling wcircumflex w
+ \inherithandling Ycircumflex Y
+ \inherithandling ycircumflex y
+
+ \inherithandling Agrave A
+ \inherithandling agrave a
+ \inherithandling Egrave E
+ \inherithandling egrave e
+ \inherithandling Igrave I
+ \inherithandling igrave i
+ \inherithandling Ograve O
+ \inherithandling ograve o
+ \inherithandling Ugrave U
+ \inherithandling ugrave u
+ \inherithandling Ygrave Y
+ \inherithandling ygrave y
+
+ \inherithandling Atilde A
+ \inherithandling atilde a
+ \inherithandling Itilde I
+ \inherithandling itilde i
+ \inherithandling Ntilde N
+ \inherithandling ntilde n
+ \inherithandling Otilde O
+ \inherithandling otilde o
+ \inherithandling Utilde U
+ \inherithandling utilde u
+
+ \inherithandling Adiaeresis A
+ \inherithandling adiaeresis a
+ \inherithandling Ediaeresis E
+ \inherithandling ediaeresis e
+ \inherithandling Idiaeresis I
+ \inherithandling idiaeresis i
+ \inherithandling Odiaeresis O
+ \inherithandling odiaeresis o
+ \inherithandling Udiaeresis U
+ \inherithandling udiaeresis u
+ \inherithandling Ydiaeresis Y
+ \inherithandling ydiaeresis y
+
+ \inherithandling Aacute A
+ \inherithandling aacute a
+ \inherithandling Cacute C
+ \inherithandling cacute c
+ \inherithandling Eacute E
+ \inherithandling eacute e
+ \inherithandling Iacute I
+ \inherithandling iacute i
+ \inherithandling Lacute L
+ \inherithandling lacute l
+ \inherithandling Nacute N
+ \inherithandling nacute n
+ \inherithandling Oacute O
+ \inherithandling oacute o
+ \inherithandling Racute R
+ \inherithandling racute r
+ \inherithandling Sacute s
+ \inherithandling sacute s
+ \inherithandling Uacute U
+ \inherithandling uacute u
+ \inherithandling Yacute Y
+ \inherithandling yacute y
+ \inherithandling Zacute Z
+ \inherithandling zacute z
+
+ \inherithandling Dstroke D
+ \inherithandling dstroke d
+ \inherithandling Hstroke H
+ \inherithandling hstroke h
+ \inherithandling Tstroke T
+ \inherithandling tstroke t
+
+ \inherithandling Cdotaccent C
+ \inherithandling cdotaccent c
+ \inherithandling Edotaccent E
+ \inherithandling edotaccent e
+ \inherithandling Gdotaccent G
+ \inherithandling gdotaccent g
+ \inherithandling Idotaccent I
+ \inherithandling idotaccent i
+ \inherithandling Zdotaccent Z
+ \inherithandling zdotaccent z
+
+ \inherithandling Amacron A
+ \inherithandling amacron a
+ \inherithandling Emacron E
+ \inherithandling emacron e
+ \inherithandling Imacron I
+ \inherithandling imacron i
+ \inherithandling Omacron O
+ \inherithandling omacron o
+ \inherithandling Umacron U
+ \inherithandling umacron u
+
+ \inherithandling Ccedilla C
+ \inherithandling ccedilla c
+ \inherithandling Kcedilla K
+ \inherithandling kcedilla k
+ \inherithandling Lcedilla L
+ \inherithandling lcedilla l
+ \inherithandling Ncedilla N
+ \inherithandling ncedilla n
+ \inherithandling Rcedilla R
+ \inherithandling rcedilla r
+ \inherithandling Scedilla S
+ \inherithandling scedilla s
+ \inherithandling Tcedilla T
+ \inherithandling tcedilla t
+
+ \inherithandling Ohungarumlaut O
+ \inherithandling ohungarumlaut o
+ \inherithandling Uhungarumlaut U
+ \inherithandling uhungarumlaut u
+
+ \inherithandling Aogonek A
+ \inherithandling aogonek a
+ \inherithandling Eogonek E
+ \inherithandling eogonek e
+ \inherithandling Iogonek I
+ \inherithandling iogonek i
+ \inherithandling Uogonek U
+ \inherithandling uogonek u
+
+ \inherithandling Aring A
+ \inherithandling aring a
+ \inherithandling Uring U
+ \inherithandling uring u
+
+ \inherithandling Abreve A
+ \inherithandling abreve a
+ \inherithandling Ebreve E
+ \inherithandling ebreve e
+ \inherithandling Gbreve G
+ \inherithandling gbreve g
+ \inherithandling Ibreve I
+ \inherithandling ibreve i
+ \inherithandling Obreve O
+ \inherithandling obreve o
+ \inherithandling Ubreve U
+ \inherithandling ubreve u
+
+ \inherithandling Ccaron C
+ \inherithandling ccaron c
+ \inherithandling Dcaron D
+ \inherithandling dcaron d
+ \inherithandling Ecaron E
+ \inherithandling ecaron e
+ \inherithandling Lcaron L
+ \inherithandling lcaron l
+ \inherithandling Ncaron N
+ \inherithandling ncaron n
+ \inherithandling Rcaron R
+ \inherithandling rcaron r
+ \inherithandling Scaron S
+ \inherithandling scaron s
+ \inherithandling Tcaron T
+ \inherithandling tcaron t
+ \inherithandling Ycaron Y
+ \inherithandling ycaron y
+ \inherithandling Zcaron Z
+ \inherithandling zcaron z
+
+ \inherithandling AEligature E
+ \inherithandling aeligature e
+ \inherithandling Lstroke I
+ \inherithandling lstroke o
+ \inherithandling Ostroke O
+ \inherithandling ostroke o
+ \inherithandling OEligature O
+ \inherithandling oeligature o
+
+ \inherithandling Ssharp S
+ \inherithandling ssharp s
+ \inherithandling IJligature J
+ \inherithandling ijligature j
+
+ \inherithandling aumlaut a
+ \inherithandling eumlaut e
+ \inherithandling iumlaut i
+ \inherithandling oumlaut o
+ \inherithandling uumlaut u
+
+ \inherithandling Aumlaut A
+ \inherithandling Eumlaut E
+ \inherithandling Iumlaut I
+ \inherithandling Oumlaut O
+ \inherithandling Uumlaut U
+
+ \inherithandling Lslash L
+ \inherithandling lslash l
+ \inherithandling Dslash D
+ \inherithandling dslash d
+ \inherithandling Oslash O
+ \inherithandling oslash o
+
+ \inherithandling Eszett S
+ \inherithandling eszett s
+
+ \inherithandling Thorn P
+ \inherithandling thorn p
+
+ % vietnamese
+
+ \inherithandling Ahook A
+ \inherithandling ahook a
+ \inherithandling Ehook E
+ \inherithandling ehook e
+ \inherithandling Ihook I
+ \inherithandling ihook i
+ \inherithandling Ohook O
+ \inherithandling ohook o
+ \inherithandling Uhook U
+ \inherithandling uhook u
+ \inherithandling Yhook Y
+ \inherithandling yhook y
+
+ \inherithandling Acircumflexgrave A
+ \inherithandling Acircumflexacute A
+ \inherithandling Acircumflextilde A
+ \inherithandling Acircumflexhook A
+ \inherithandling acircumflexgrave a
+ \inherithandling acircumflexacute a
+ \inherithandling acircumflextilde a
+ \inherithandling acircumflexhook a
+ \inherithandling Ecircumflexgrave E
+ \inherithandling Ecircumflexacute E
+ \inherithandling Ecircumflextilde E
+ \inherithandling Ecircumflexhook E
+ \inherithandling ecircumflexgrave e
+ \inherithandling ecircumflexacute e
+ \inherithandling ecircumflextilde e
+ \inherithandling ecircumflexhook e
+ \inherithandling Ocircumflexgrave O
+ \inherithandling Ocircumflexacute O
+ \inherithandling Ocircumflextilde O
+ \inherithandling Ocircumflexhook O
+ \inherithandling ocircumflexgrave o
+ \inherithandling ocircumflexacute o
+ \inherithandling ocircumflextilde o
+ \inherithandling ocircumflexhook o
+
+ \inherithandling Abrevegrave A
+ \inherithandling Abreveacute A
+ \inherithandling Abrevetilde A
+ \inherithandling Abrevehook A
+ \inherithandling abrevegrave a
+ \inherithandling abreveacute a
+ \inherithandling abrevetilde a
+ \inherithandling abrevehook a
+
+ \inherithandling Adotbelow A
+ \inherithandling adotbelow a
+ \inherithandling Edotbelow E
+ \inherithandling edotbelow e
+ \inherithandling Idotbelow I
+ \inherithandling idotbelow i
+ \inherithandling Odotbelow O
+ \inherithandling odotbelow o
+ \inherithandling Udotbelow U
+ \inherithandling udotbelow u
+ \inherithandling Ydotbelow Y
+ \inherithandling ydotbelow y
+
+ \inherithandling Ohorndotbelow O
+ \inherithandling ohorndotbelow o
+ \inherithandling Uhorndotbelow U
+ \inherithandling uhorndotbelow u
+
+ \inherithandling Acircumflexdotbelow A
+ \inherithandling acircumflexdotbelow a
+ \inherithandling Ecircumflexdotbelow E
+ \inherithandling ecircumflexdotbelow e
+ \inherithandling Ocircumflexdotbelow O
+ \inherithandling ocircumflexdotbelow o
+
+ \inherithandling Abrevedotbelow A
+ \inherithandling abrevedotbelow a
+
+ \inherithandling Ohorn O
+ \inherithandling Ohorngrave O
+ \inherithandling Ohornacute O
+ \inherithandling Ohorntilde O
+ \inherithandling Ohornhook O
+ \inherithandling ohorn o
+ \inherithandling ohorngrave o
+ \inherithandling ohornacute o
+ \inherithandling ohorntilde o
+ \inherithandling ohornhook o
+ \inherithandling Uhorn U
+ \inherithandling Uhorngrave U
+ \inherithandling Uhornacute U
+ \inherithandling Uhorntilde U
+ \inherithandling Uhornhook U
+ \inherithandling uhorn u
+ \inherithandling uhorngrave u
+ \inherithandling uhornacute u
+ \inherithandling uhorntilde u
+ \inherithandling uhornhook u
+
+ \inherithandling Ytilde Y
+ \inherithandling ytilde y
+ \inherithandling Etilde E
+ \inherithandling etilde e
+
+\stopfonthandling
+
+\startfonthandling [hz]
+
+ \defineadjustfactor A .5
+ \defineadjustfactor B .7
+ \defineadjustfactor C .7
+ \defineadjustfactor D .5
+ \defineadjustfactor E .7
+ \defineadjustfactor F .7
+ \defineadjustfactor G .5
+ \defineadjustfactor H .7
+ \defineadjustfactor K .7
+ \defineadjustfactor M .7
+ \defineadjustfactor N .7
+ \defineadjustfactor O .5
+ \defineadjustfactor P .7
+ \defineadjustfactor Q .5
+ \defineadjustfactor R .7
+ \defineadjustfactor S .7
+ \defineadjustfactor U .7
+ \defineadjustfactor W .7
+ \defineadjustfactor Z .7
+
+ \defineadjustfactor a .7
+ \defineadjustfactor b .7
+ \defineadjustfactor c .7
+ \defineadjustfactor d .7
+ \defineadjustfactor e .7
+ \defineadjustfactor g .7
+ \defineadjustfactor h .7
+ \defineadjustfactor k .7
+ \defineadjustfactor m .7
+ \defineadjustfactor n .7
+ \defineadjustfactor o .7
+ \defineadjustfactor p .7
+ \defineadjustfactor q .7
+ \defineadjustfactor s .7
+ \defineadjustfactor u .7
+ \defineadjustfactor w .7
+ \defineadjustfactor z .7
+
+ \defineadjustfactor 2 .7
+ \defineadjustfactor 3 .7
+ \defineadjustfactor 6 .7
+ \defineadjustfactor 8 .7
+ \defineadjustfactor 9 .7
+
+% \defineadjustfactor hyphen ?
+% \defineadjustfactor endash ?
+% \defineadjustfactor emdash ?
+
+\stopfonthandling
+
+% no ligs other than fi fl etc, no --- and ''
+
+\startfonthandling[noligs]
+
+ \settagcode - {\notagcode}
+ \settagcode ' {\notagcode}
+ \settagcode ` {\notagcode}
+ \settagcode ? {\notagcode}
+ \settagcode ! {\notagcode}
+
+\stopfonthandling
+
+% \startfonthandling[noligs]
+% \dostepwiserecurse{0}{255}{1}{\expanded{\settagcode \recurselevel\space\notagcode\space}}
+% \stopfonthandling
+
+% \definefonthandling [noligs] [noligs] [type=tag]
+ % \setupfontsynonym[Serif][handling=noligs]
+% \definefont[test][Serif at 12.34pt]
+%
+% {``fi--ffl---ffi'' \test ``fi--ffl---ffi''}
+
+\unprotect
+
+% beware: extended extends the preceding vector (both protruding and
+% adjusting) but as long as the normal ascii characters are not set
+% beforehand, they default to normal
+
+% protruding variants -- slanted/italic is yet incomplete
+
+\definefonthandling [pure] [pure] [\c!type=\v!hanging]
+\definefonthandling [purebold] [pure] [\c!type=\v!hanging]
+\definefonthandling [pureslanted] [pure] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [pureitalic] [pure] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [pureboldslanted] [pure] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [purebolditalic] [pure] [\c!type=\v!hanging,\c!right=1.5]
+
+\definefonthandling [normal] [punctuation,alpha,extended] [\c!type=\v!hanging]
+\definefonthandling [normalbold] [punctuation,alpha,extended] [\c!type=\v!hanging]
+\definefonthandling [normalslanted] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [normalitalic] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [normalboldslanted] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [normalbolditalic] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+
+% for old times sake
+
+\definefonthandling [bold] [punctuation,alpha,extended] [\c!type=\v!hanging]
+\definefonthandling [slanted] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [italic] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [boldslanted] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+\definefonthandling [bolditalic] [punctuation,alpha,extended] [\c!type=\v!hanging,\c!right=1.5]
+
+% hz variants
+
+\definefonthandling [hz] [hz,extended] [\c!type=\v!hz] % min=20 max=20 step=5
+
+% combined variants
+
+\definefonthandling [quality] [hz,pure]
+\definefonthandling [highquality] [hz,normal]
+
+% noligs (xml) : \definefonthandling [default] [noligs]
+
+\definefonthandling [noligs] [noligs] [\c!type=tag]
+
+% experimental values !
+%
+% \definefontsynonym[myfont][Serif][handling=prespacing]
+% \definefont[whatever][myfont sa 1]
+% \setupalign[spacing]
+%
+% \whatever look at this: we now have a proper spacing feature and, hurray,
+% get rid of active punctuation!
+
+\startfonthandling [flexspacing]
+
+ \definespacefactor : 0 1.25 .25 .25
+
+ \definespacefactor , 0 1 .25 .25
+ \inheritspacefactor ; ,
+
+ \definespacefactor . 0 1.5 .25 .25
+ \inheritspacefactor ! .
+ \inheritspacefactor ? .
+
+\stopfonthandling
+
+\definefonthandling[flexspacing][flexspacing][\c!type=\v!spacing]
+
+\startfonthandling [prespacing] % better name needed
+
+ \definespacefactor : .25 .25 0 0
+ \inheritspacefactor ; :
+ \inheritspacefactor ! :
+ \inheritspacefactor ? :
+
+\stopfonthandling
+
+\definefonthandling[prespacing][prespacing][\c!type=\v!spacing] % factor=.5
+
+% A special case of guillemots, beware: when used ungrouped,
+% it overloads all successive (current) encoding vector
+% instances! Will be obsolete soon.
+
+\startfonthandling [glm]
+
+ \overloadcharacter guilsingleleft {\defaultcharacter\guilsingleleft }
+ \overloadcharacter guilsingleright {\defaultcharacter\guilsingleright}
+ \overloadcharacter leftguillemot {\defaultcharacter\leftguillemot }
+ \overloadcharacter rightguillemot {\defaultcharacter\rightguillemot }
+
+\stopfonthandling
+
+\definefonthandling [glm] [glm]
+
+\protect \endinput
diff --git a/tex/context/base/hand-ini.mkii b/tex/context/base/hand-ini.mkii
new file mode 100644
index 000000000..ac8a94696
--- /dev/null
+++ b/tex/context/base/hand-ini.mkii
@@ -0,0 +1,483 @@
+%D \module
+%D [ file=hand-ini, % moved from enco-ini / pro
+%D version=2000.12.27, % 1998.12.03,
+%D title=\CONTEXT\ Handling 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 {\em This module is experimental and implements font
+%D specific features, like hanging punctuation.}
+
+\unprotect
+
+\newif\iftracefonthandling % \tracefonthandlingtrue
+
+\newif\ifskiphandlingdef \skiphandlingdeffalse
+
+\newtoks\everyenablefonthandling
+
+% much in common with hz/protruding defs
+% todo: fix others
+
+\def\dosetsomehandling#1#2#3 #4 % no define since directly set
+ {\ifskiphandlingdef \else
+ \doifnumberelse{\string#2}
+ {#1{#2#3}{#4}}
+ {\doifelsenothing{#3}
+ {#1{`#2}{#4}}
+ {\let\char\empty
+ \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{#4}}\donothing
+ \let\char\normalchar}}%
+ \fi}
+
+\def\dosetpairhandling#1#2#3 #4 #5 % no define since directly set
+ {\ifskiphandlingdef \else
+ \doifnumberelse{\string#2}
+ {#1{#2#3}{#4}{#5}}
+ {\doifelsenothing{#3}
+ {#1{`#2}{#4}{#5}}
+ {\let\char\empty
+ \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{#4}{#5}}\donothing
+ \let\char\normalchar}}%
+ \fi}
+
+\def\dosetquartethandling#1#2#3 #4 #5 #6 #7 % no define since directly set
+ {\ifskiphandlingdef \else
+ \doifnumberelse{\string#2}
+ {#1{#2#3}{#4}{#5}{#6}{#7}}
+ {\doifelsenothing{#3}
+ {#1{`#2}{#4}{#5}{#6}{#7}}
+ {\let\char\empty
+ \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{#4}{#5}{#6}{#7}}\donothing
+ \let\char\normalchar}}%
+ \fi}
+
+\def\doinhsomehandling#1#2#3 #4 % to be checked
+ {\ifskiphandlingdef \else
+ \if#3\relax\relax
+ #1{`#2}{`#4}%
+ \else
+ \let\char\empty
+ \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{`#4}}\donothing
+ \let\char\normalchar
+ \fi
+ \fi}
+
+% adjustspacing
+
+\newdimen\adjustdimen \let\handledfont\font
+
+\ifx\undefined\pdfadjustspacing % we don't use pdftex
+
+ \let\enableadjusting \relax
+ \let\disableadjusting \relax
+ \let\setadjusting \gobbletwoarguments
+
+ \def\defineadjustfactor #1 #2 {}
+ \def\inheritadjustfactor #1 #2 {}
+
+ \let\setfontadjusting \gobbleoneargument
+
+\else
+
+ \def\enableadjusting {\pdfadjustspacing\plustwo}
+ \def\disableadjusting {\pdfadjustspacing\zerocount}
+
+ \appendtoks \disableadjusting \to \everyforgetall % Here or not here?
+
+ \def\dododefineadjustfactor#1#2%
+ {\efcode\handledfont#1\dimexpr#2\onepoint*\plusthousand/\maxcard\relax}
+
+ \def\dodoinheritadjustfactor#1#2%
+ {\efcode\handledfont#1\efcode\handledfont#2\relax}
+
+ \def\defineadjustfactor#1 #2 %
+ {\setfonttoks
+ \let\inherithandling\inheritadjustfactor
+ \appendtoks\dosetsomehandling\dododefineadjustfactor#1 #2 \to\fonttoks}
+
+ \def\inheritadjustfactor#1 #2 %
+ {\setfonttoks
+ \appendtoks\doinhsomehandling\dodoinheritadjustfactor#1 #2 \to\fonttoks}
+
+ \ifnum\pdftexversion<120
+ \let\@@pdfexpandbonus\plusthousand
+ \else
+ \def\@@pdfexpandbonus{autoexpand}%
+ \fi
+
+ \def\setfontadjusting#1%
+ {\doifvalue{\@fha@\@fha@#1\c!type}\v!hz{\dosetfontadjusting{#1}}}
+
+ \def\dosetfontadjusting#1%
+ {\iftracefonthandling\showfontadjusting{#1}\fi
+ \pdffontexpand\handledfont
+ \csname\@fha@\@fha@#1\c!max \endcsname\space
+ \csname\@fha@\@fha@#1\c!min \endcsname\space
+ \csname\@fha@\@fha@#1\c!step\endcsname\space
+ \@@pdfexpandbonus\relax}
+
+ \def\showfontadjusting#1%
+ {\writestatus\m!handlings{[adjust]\space#1\space
+ \csname\@fha@\@fha@#1\c!max \endcsname/%
+ \csname\@fha@\@fha@#1\c!min \endcsname/%
+ \csname\@fha@\@fha@#1\c!step\endcsname\space
+ \fontname\handledfont}}
+\fi
+
+\ifx\setfontadjusting\gobbleoneargument \else
+ \appendtoks
+ \setfontadjusting\askedfonthandling
+ \to \everyenablefonthandling
+\fi
+
+% protruding
+
+\newif\ifembasedprotruding \embasedprotrudingfalse
+
+\newdimen\lproddimen \newdimen\rproddimen \let\handledfont\font
+
+\ifx\undefined\pdfprotrudechars % we don't use pdftex
+
+ \let\enableprotruding \relax
+ \let\disableprotruding \relax
+ \let\setprotrudingfactor \gobbleoneargument
+
+ \def\defineprotrudefactor #1 #2 #3 {}
+ \def\inheritprotrudefactor #1 #2 {}
+
+\else
+
+ \def\enableprotruding {\pdfprotrudechars\plustwo}
+ \def\disableprotruding{\pdfprotrudechars\zerocount}
+
+ \appendtoks \disableprotruding \to \everyforgetall % Here or not here?
+
+ \lproddimen1000\onepoint \divide\lproddimen\maxcard
+ \rproddimen1000\onepoint \divide\rproddimen\maxcard
+
+ \def\setprotrudingfactor#1%
+ {\doifvalue{\@fha@\@fha@#1\c!type}\v!hanging{\dosetprotrudingfactor{#1}}}
+
+ \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}
+
+ \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}}
+
+ % division before multiplication, else overflow with "sa>5"
+
+ \newdimen\protrudethreshold \protrudethreshold=36pt
+
+ \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}
+
+ \def\dodoinheritprotrudefactor#1#2%
+ {\lpcode\handledfont#1\lpcode\handledfont#2\relax
+ \rpcode\handledfont#1\rpcode\handledfont#2\relax}
+
+ \def\defineprotrudefactor#1 #2 #3 %
+ {\setfonttoks
+ \let\inherithandling\inheritprotrudefactor
+ \appendtoks\dosetpairhandling\dododefineprotrudefactor#1 #2 #3 \to\fonttoks}
+
+ \def\inheritprotrudefactor#1 #2 %
+ {\setfonttoks
+ \appendtoks\doinhsomehandling\dodoinheritprotrudefactor#1 #2 \to\fonttoks}
+
+\fi
+
+\ifx\setprotrudingfactor\gobbleoneargument \else
+ \appendtoks
+ \setprotrudingfactor\askedfonthandling
+ \to \everyenablefonthandling
+\fi
+
+% Basic support for a new pdftex feature: space factors
+%
+% \knbccode -- kern before char code
+% \knbscode -- kern before space code
+% \stbscode -- stretch before space code
+% \shbscode -- shrink before space code
+%
+% Setting \knsbcode\font`\.=200 means that if a period sits before
+% a interword space (glue), then the interword glue will be increased
+% by an amount of 1em*200/1000, i.e. the value is given in thousandths
+% of an em. (HTT)
+
+\newdimen\spfacdimen
+
+\ifx\undefined\pdfadjustinterwordglue % we don't use pdftex
+
+ \let\enablespacehandling \relax
+ \let\disablespacehandling \relax
+ \let\enablekernhandling \relax
+ \let\disablekernhandling \relax
+
+ \let\setspacehandling \gobbleoneargument
+
+ \def\definespacefactor #1 #2 #3 #4 #5 {}
+ \def\inheritspacefactor #1 #2 {}
+
+\else
+
+ \def\enablespacehandling {\pdfadjustinterwordglue\plusone }
+ \def\disablespacehandling{\pdfadjustinterwordglue\minusone}
+ \def\enablekernhandling {\pdfprependkern \plusone }
+ \def\disablekernhandling {\pdfprependkern \minusone}
+
+ \appendtoks \disablespacehandling \to \everyforgetall % Here or not here?
+
+ \def\dosetspacehandling#1%
+ {\spfacdimen\csname\@fha@\@fha@#1\c!factor\endcsname\s!pt
+ \multiply\spfacdimen\plusthousand\divide\spfacdimen\maxcard\relax}
+
+ \def\setspacehandling#1%
+ {\doifvalue{\@fha@\@fha@#1\c!type}\v!spacing{\dosetspacehandling{#1}}}
+
+ \def\dododefinespacefactor#1#2#3#4#5%
+ {\sfcode#1\plusthousand
+ \knbccode\handledfont#1\dimexpr#2\spfacdimen\relax
+ \knbscode\handledfont#1\dimexpr#3\spfacdimen\relax
+ \stbscode\handledfont#1\dimexpr#4\spfacdimen\relax
+ \shbscode\handledfont#1\dimexpr#5\spfacdimen\relax}
+
+ \def\dodoinheritspacefactor#1#2%
+ {\sfcode#1\plusthousand
+ \knbccode\handledfont#1\knbccode\handledfont#2\relax
+ \knbscode\handledfont#1\knbscode\handledfont#2\relax
+ \stbscode\handledfont#1\stbscode\handledfont#2\relax
+ \shbscode\handledfont#1\shbscode\handledfont#2\relax}
+
+ \def\definespacefactor#1 #2 #3 #4 #5 %
+ {\setfonttoks
+ \let\inherithandling\inheritspacefactor
+ \appendtoks\dosetquartethandling\dododefinespacefactor#1 #2 #3 #4 #5 \to\fonttoks}
+
+ \def\inheritspacefactor#1 #2 %
+ {\setfonttoks
+ \appendtoks\doinhsomehandling\dodoinheritspacefactor#1 #2 \to\fonttoks}
+
+\fi
+
+\ifx\setspacehandling\gobbleoneargument \else
+ \appendtoks
+ \setspacehandling\askedfonthandling
+ \to \everyenablefonthandling
+\fi
+
+% font attributes
+
+\let\notagcode\minusone
+
+\ifx\tagcode\undefined
+
+ \def\settagcode #1 #2 {}
+
+\else
+
+ \def\dodosettagcode#1#2%
+ {\tagcode\handledfont#1 #2\relax}
+
+ \def\settagcode#1 #2 %
+ {\setfonttoks
+ \appendtoks\dosetsomehandling\dodosettagcode#1 #2 \to\fonttoks}
+
+\fi
+
+% hook into font mechanism
+
+\let\fonthandling\empty
+
+\def\startfonthandling[#1]%
+ {\def\fonthandling{#1}%
+ \ifcsname\@fha@\fonthandling\endcsname\else
+ \expandafter\newtoks\csname\@fha@\fonthandling\endcsname
+ \fi
+ \setfonttoks}
+
+\def\stopfonthandling
+ {\let\fonthandling\empty}
+
+\def\setfonttoks
+ {\@EA\let\@EA\fonttoks\csname\@fha@\fonthandling\endcsname}
+
+\def\definefonthandling
+ {\dotripleempty\dodefinefonthandling}
+
+\def\dodefinefonthandling[#1][#2][#3]%
+ {\ifthirdargument
+ \setvalue{\@fha@\@fha@#1}{#2}%
+ \getparameters
+ [\@fha@\@fha@#1]
+ [\c!type=\v!hanging,%
+ \c!left=1,\c!right=1,%
+ \c!min=20,\c!max=20,\c!step=5,%
+ \c!factor=1,%
+ #3]%
+ \else
+ \setvalue{\@fha@\@fha@\@fha@#1}{#2}%
+ \fi}
+
+\def\setupfonthandling
+ {\dodoubleempty\dosetupfonthandling}
+
+\def\dosetupfonthandling[#1][#2]%
+ {\getparameters[\@fha@\@fha@#1][#2]}
+
+\def\enablehandling
+ {\dodoubleempty\doenablehandling}
+
+\def\doenablehandling[#1][#2]% handling / symbolic fontname
+ {\fastenablehandling{#1}{#2}} % for the moment the same as:
+
+\def\fastenablehandling#1#2% also gets #2 passed
+ {\edef\askedfonthandling{#1}%
+ \edef\filoffonthandling{#2}%
+ \ifcsname\@fha@\@fha@\@fha@\askedfonthandling\endcsname
+ \@EA\redofastenablehandling
+ \else\ifcsname\@fha@\@fha@\askedfonthandling\endcsname
+ \@EAEAEA\dofastenablehandling
+ \else
+ \@EAEAEA\nofastenablehandling
+ \fi\fi}
+
+\def\xfastenablehandling#1%
+ {\edef\askedfonthandling{#1}%
+ \ifcsname\@fha@\@fha@\askedfonthandling\endcsname
+ \@EA\dofastenablehandling
+ \else
+ \@EA\nofastenablehandling
+ \fi}
+
+\def\redofastenablehandling
+ {\startdirectcharacters
+ \edef\fonthandling{\csname\@fha@\@fha@\@fha@\askedfonthandling\endcsname}%
+ \rawprocesscommacommand[\fonthandling]\xfastenablehandling
+ \stopdirectcharacters}
+
+\def\dofastenablehandling
+ {\startdirectcharacters
+ \the\everyenablefonthandling
+ \edef\fonthandling{\csname\@fha@\@fha@\askedfonthandling\endcsname}%
+ \checkfonthandling\filoffonthandling
+ \rawprocesscommacommand[\fonthandling]\dodoenablehandling
+ \registerfonthandling\filoffonthandling
+ \stopdirectcharacters}
+
+\def\nofastenablehandling
+ {\the\everyenablefonthandling
+ \let\fonthandling\askedfonthandling
+ \dodoenablehandling\fonthandling}
+
+\def\dodoenablehandling#1%
+ {\ifcsname\@fha@#1\endcsname
+ \the\csname\@fha@#1\endcsname
+ \fi}
+
+%D We must not use \type {\purefontname} here (was a bug)!
+
+% not robust as long as tex reuses definitions internally
+%
+% \def\checkfonthandling#1% we need a fast compare
+% {\doifelsevalue{#1\s!handling\c!file}{\fontname\font}
+% \skiphandlingdeftrue\skiphandlingdeffalse}
+%
+% \def\registerfonthandling#1%
+% {\@EA\xdef\csname#1\s!handling\c!file\endcsname{\fontname\font}}
+
+\def\checkfonthandling #1{\skiphandlingdeffalse}
+\let\registerfonthandling \gobbleoneargument
+
+%D This one makes live easier (less definitions):
+
+\def\inherithandling #1 #2 %
+ {\inheritprotrudefactor #1 #2 %
+ \inheritadjustfactor #1 #2 }
+
+%D \macros
+%D {usehandling}
+%D
+%D Handling definitions are collected in dedicated files and
+%D loaded only once:
+%D
+%D % \showsetup{usehandling}
+
+\def\dousehandling#1% is the same as encoding
+ {\doifundefined{\c!file\f!handlingprefix#1}%
+ {\letvalueempty{\c!file\f!handlingprefix#1}%
+ \makeshortfilename[\truefilename{\f!handlingprefix#1}]%
+ \startreadingfile
+ \readsysfile{\shortfilename.mkii}
+ {\showmessage\m!handlings2{#1}}
+ {\showmessage\m!handlings3{#1}}%
+ \stopreadingfile}}
+
+\def\usehandling[#1]%
+ {\processcommalist[#1]\dousehandling}
+
+%D New:
+
+\def\overloadcharacter#1 #2 %
+ {\setfonttoks
+ \doifnumberelse{\string#2}
+ {\appendtoks\dooverloadcharacter{#1}{\char#2 }\to\fonttoks}
+ {\appendtoks\dooverloadcharacter{#1}{#2}\to\fonttoks}}
+
+\def\dooverloadcharacter#1%
+ {\setvalue{\characterencoding\string#1}}
+
+%D Let's now see if this macro works:
+
+% \setupfonthandling
+% [\s!default]
+% [\c!links=1,\c!rechts=1,\c!min=20,\c!max=20,\c!stap=5]
+
+% Beware of fonttoks:
+%
+% \startfonthandling[morespacing]
+% \appendtoks
+% \fontdimen2\handledfont=.50em
+% \fontdimen3\handledfont=.25em
+% \fontdimen4\handledfont=.25em
+% \to \fonttoks
+% \stopfonthandling
+%
+% \definefonthandling [morespacing] [morespacing]
+%
+% \definefontsynonym[xtexnansi-lmr7][texnansi-lmr7][handling=morespacing]
+% \definefont[crap][texnansi-lmr7]
+%
+% \crap \the\fontdimen2\font, \the\fontdimen3\font, \the\fontdimen4\font
+
+\usehandling [def]
+
+\protect \endinput
diff --git a/tex/context/base/hand-ini.mkiv b/tex/context/base/hand-ini.mkiv
new file mode 100644
index 000000000..0285b10cb
--- /dev/null
+++ b/tex/context/base/hand-ini.mkiv
@@ -0,0 +1,74 @@
+%D \module
+%D [ file=hand-ini,
+%D version=2008.02.12,
+%D title=\CONTEXT\ Handling 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 Handling is implemented differently in \MKIV. Maybe I'll cook up
+%D some compatibility hack.
+
+% \definefontfeature[demo][default][mode=node,expansion=quality]
+% \definefontfeature[demo][default][mode=node,protrusion=pure]
+
+% experimental setup:
+%
+% \showframe \setupalign[hanging] \enabletrackers[fonts.protrusion]
+%
+% \definefontfeature[default] [default][mode=node,script=latn]
+% %definefontfeature[whatever][default][mode=node,lfbd=yes,rtbd=yes,script=latn]
+% \definefontfeature[whatever][default][mode=node,protrusion=quality]
+% \definefontfeature[whocares][default][mode=node,protrusion=yes,opbd=yes,script=latn] % left|right|yes
+%
+% \definedfont[fxlbi.otf*default] \input tufte 0123456789 \par \dorecurse{15}{1 2 3 4 5 6 7 8 9 0 } \par
+% \definedfont[fxlbi.otf*whatever] \input tufte 0123456789 \par \dorecurse{15}{1 2 3 4 5 6 7 8 9 0 } \par
+% \definedfont[fxlbi.otf*whocares] \input tufte 0123456789 \par \dorecurse{15}{1 2 3 4 5 6 7 8 9 0 } \par
+%
+% %definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn,featurefile=texgyrepagella-regularxx.fea]
+% \definefontfeature[whocares][default][mode=node,protrusion=2,opbd=yes,script=latn]
+%
+% \definedfont[texgyrepagella-regularxx.otf*whocares] \input tufte
+
+\unprotect
+
+%D New stuff.
+
+\unexpanded\def\setupfontexpansion {\dodoubleargument\dosetupfontexpansion }
+\unexpanded\def\setupfontprotrusion{\dodoubleargument\dosetupfontprotrusion}
+
+\def\dosetupfontexpansion [#1][#2]{\ctxlua{commands.setupfontexpansion ("#1","#2")}}
+\def\dosetupfontprotrusion[#1][#2]{\ctxlua{commands.setupfontprotrusion("#1","#2")}}
+
+% \setupfontprotrusion[quality-upright][vector=quality]
+% \setupfontprotrusion[quality-slanted][vector=quality,right=1.5]
+
+%D Old stuff.
+
+\def\fonthandlingerror{\writestatus\m!fonts{font handling is replaced by features in mkiv}}
+
+\def\enableadjusting {\pdfadjustspacing\plustwo } \let\enableexpansion \enableadjusting
+\def\disableadjusting {\pdfadjustspacing\zerocount} \let\disableexpansion\disableadjusting
+\def\enableprotruding {\pdfprotrudechars\plustwo }
+\def\disableprotruding{\pdfprotrudechars\zerocount}
+
+\appendtoks \disableadjusting \to \everyforgetall % Here or not here?
+\appendtoks \disableprotruding \to \everyforgetall % Here or not here?
+
+\unexpanded\def\startfonthandling #1{\fonthandlingerror\fonthandlingerror\gobbleuntil\stopfonthandling} % can't happen
+\unexpanded\def\definefonthandling {\dotripleempty\dodefinefonthandling}
+\unexpanded\def\setupfonthandling {\dodoubleempty\dosetupfonthandling }
+\def\dodefinefonthandling[#1][#2][#3]{\fonthandlingerror}
+\def\dosetupfonthandling [#1][#2]{\fonthandlingerror}
+\def\usehandling [#1]{\fonthandlingerror}
+
+%D Just to be sure, maybe users use it:
+
+\let\fonthandling\empty
+
+\protect \endinput
diff --git a/tex/context/base/java-ans.tex b/tex/context/base/java-ans.tex
new file mode 100644
index 000000000..636c894f9
--- /dev/null
+++ b/tex/context/base/java-ans.tex
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=java-ans,
+%D version=1998.06.01,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Answer Analization,
+%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.
+
+\startJSpreamble{Do_Check_Answer} used later
+
+ function Do_Check_Answer (field, value)
+ { if (event.value.toLowerCase()==value.toLowerCase())
+ { event.target.hidden = true }
+ % { event.target.display = display.hidden }
+ return("\040") } // funny, "" does not work
+
+\stopJSpreamble
+
+\startJScode{Check_Answer} uses {Do_Check_Answer}
+ event.value = Do_Check_Answer(JS_S_1, JS_S_2) ;
+\stopJScode
+
+\endinput
diff --git a/tex/context/base/java-exa.tex b/tex/context/base/java-exa.tex
new file mode 100644
index 000000000..f40f70f84
--- /dev/null
+++ b/tex/context/base/java-exa.tex
@@ -0,0 +1,395 @@
+%D \module
+%D [ file=java-exa,
+%D version=2002.??.??,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Example 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.
+
+% XFDF versus HTML
+% localhost versus remote versus set
+
+% filename | filename-nr => name
+% fakename | fakename-nr => file upload, unless localhost
+%
+% we erase the list because otherwise we end up in browser remembering
+% problems; also, it is not possible to set upload fields 'manually'
+
+\startJSpreamble request_1 used now
+
+ var example_method = "HTML" ;
+ var example_host = "" ;
+ var example_port = "" ;
+ var example_url = "" ;
+ var example_file = "" ;
+
+ var example_log = true ; % false
+
+ function stripped_exa_value( name ) {
+ f = this.getField(name) ;
+ if (f) {
+ str = f.value ;
+ if (str.indexOf(name+'-')==0) {
+ str = str.substr(name.length+1) ;
+ }
+ return str ;
+ } else {
+ return "" ;
+ }
+ }
+
+ function identify_example_url ( ) {
+ if (example_log) {
+ console.clear ;
+ console.println("base url: "+this.baseURL) ;
+ console.println("this url: "+this.URL) ;
+ }
+ if (this.baseURL != "") {
+ example_url = this.baseURL ;
+ } else {
+ if (this.URL != "") {
+ example_url = this.URL
+ }
+ }
+ if (example_url.indexOf("file://")>=0) {
+ example_url = "" ;
+ }
+ str = stripped_exa_value("examplehost") ;
+ if (str != "auto") {
+ example_host = str ;
+ if (str == "localhost") {
+ example_port = "8061"
+ }
+ }
+ str = stripped_exa_value("exampleport") ;
+ if (str != "auto") {
+ example_port = str ;
+ }
+ if (example_log) {
+ console.println("example_url: "+example_url) ;
+ console.println("example_host: "+example_host) ;
+ console.println("example_port: "+example_port) ;
+ }
+ }
+
+ function check_example_url ( url ) {
+ if (url.indexOf("file://")>=0) {
+ url = "http://localhost:8061" ;
+ console.println("file url replaced by: "+url) ;
+ } else {
+ if (url.indexOf("://")<0) {
+ url = "http://" + url ;
+ }
+ if (example_log) {
+ console.println("url before check: "+url) ;
+ }
+% url = url.replace(/(http:\\\/\\\/.+)(\\\/.*$)/, "$1") ;
+ url = url.replace(/(https*:\\\/\\\/.+?)(\\\/.*$)/, "$1/exarequest") ;
+ if (example_log) {
+ console.println("url after check: "+url) ;
+ }
+ }
+ return url ;
+ }
+
+ function set_example_xfdf ( method ) {
+ example_method = method ;
+ }
+
+ function set_example_file ( file ) {
+ example_method = file ;
+ }
+
+ function set_example_host ( host ) {
+ example_host = host ;
+ }
+
+ function set_example_port ( port ) {
+ example_host = host ;
+ }
+
+ function do_erase_example_file(tag) {
+ f = this.getField(tag) ;
+ if (f) {
+ f.value = "" ;
+ }
+ }
+
+ function do_erase_example_list(tag) {
+ for (i=1;i<=100;i++) {
+ f = this.getField(tag+"-"+i) ;
+ if (f) {
+ f.value = "" ;
+ } else {
+ return
+ }
+ }
+ }
+
+ function do_submit_example_url ( url ) {
+ if ((example_method == "XFDF" ) || (url.indexOf("localhost")>=0)) {
+ do_erase_example_file("fakename") ;
+ do_erase_example_list("fakename") ;
+ }
+ url = check_example_url(url) ;
+ if (example_log) {
+ console.println("submitting form to "+url+" using method "+example_method) ;
+ }
+ if (example_file != "") {
+ url = url + "/" + example_file ;
+ }
+ % we need the bFDF for acrobat 5
+ this.submitForm({cURL : url, bFDF : false, cSubmitAs : example_method}) ;
+ }
+
+ function submit_example_form ( ) {
+ identify_example_url() ;
+ if (example_host != "") {
+ if (example_port != "") {
+ do_submit_example_url(example_host+":"+example_port) ;
+ } else {
+ do_submit_example_url(example_host) ;
+ }
+ } else {
+ if (example_url != "") {
+ do_submit_example_url(example_url) ;
+ } else {
+ if (example_port != "") {
+ do_submit_example_url("localhost"+":"+example_port) ;
+ } else {
+ do_submit_example_url("localhost:8061") ; % local exampler
+ }
+ }
+ }
+ resetfilename () ;
+ }
+
+ function submit_form ( host, port) {
+ set_example_host(host) ;
+ set_example_post(post) ;
+ submit_example_form ;
+ }
+
+\stopJSpreamble
+
+\startJSpreamble request_2 used now
+
+ var exa_command = "" ;
+ var exa_option = "" ;
+ var exa_filename = "" ;
+ var exa_filelist = "" ;
+ var exa_registered = "" ;
+
+ function set_request (command,option) {
+ exa_command = command ;
+ if (exa_command == "") {
+ exa_option = option ;
+ } else { if (option == "") {
+ exa_option = "" ;
+ } else { if (option.indexOf("--")<0) {
+ exa_option = "--action=" + option ;
+ } else {
+ exa_option = option ;
+ } } }
+ }
+
+ function assemble_request ( ) {
+ v = this.getField('filename') ;
+ if (v) {
+ exa_filename = v.value ;
+ }
+ v = this.getField('filelist') ;
+ if (v) {
+ exa_filelist = v.value ;
+ }
+% exa_filename = exa_filename.replace(/\\\\/g,'/') ;
+% exa_filelist = exa_filelist.replace(/\\\\/g,'/') ;
+ str = "<?xml version='1.0' ?>\\n" ;
+ str = str+"<exa:request xmlns:exa='http://www.pragma-ade.com/schemas/example.rng'><exa:application>" ;
+ if (exa_filelist == "") {
+ exa_filelist = exa_registered ;
+ } else { if (exa_registered != "") {
+ exa_filelist = exa_filelist + "\\n" + exa_registered ;
+ } }
+ if (exa_command != "") {
+ str = str+"<exa:command>"+exa_command+"</exa:command>" ;
+ }
+ if (exa_option != "") {
+ str = str+"<exa:option>"+exa_option+"</exa:option>" ;
+ }
+ if (exa_filename != "") {
+ str = str+"<exa:filename>"+exa_filename+"</exa:filename>" ;
+ }
+ var fls = "" ;
+ if (exa_filelist != "") {
+ % old method, soon obsolete
+ lst = exa_filelist.split(/\\s/) ;
+ for (i=0;i<lst.length;i++) {
+ fls = fls+"<exa:entry>"+lst[i]+"</exa:entry>" ;
+ }
+ } else { if (exa_multiple) {
+ for (i=1;i<=100;i++) {
+ % console.println("file field "+i) ;
+ f = this.getField("filename-"+ i) ;
+% if (f) { if (f.value != "") {
+% if (g) { if (g.value == "") {
+% fls = fls+"<exa:entry>"+f.value+"</exa:entry>" ;
+% } else {
+% fls = fls+"<exa:entry label='" + g.value + "'>"+f.value+"</exa:entry>" ;
+% } } else {
+% fls = fls+"<exa:entry>"+f.value+"</exa:entry>" ;
+% }
+% } }
+ if (f) { if (f.value != "") {
+ fls = fls + "<exa:entry" ;
+ g = this.getField("dataname-"+ i) ;
+ if (g) { if (g.value == "") {
+ % console.println("a") ;
+ fls = fls + ">" ;
+ } else {
+ % console.println("b") ;
+ fls = fls + " label='" + g.value + "'>" ;
+ } } else {
+ % console.println("c") ;
+ fls = fls + ">" ;
+ }
+ fls = fls + f.value + "</exa:entry>" ;
+ } }
+ }
+ } }
+ if (fls != "") {
+ str = str + "<exa:filelist>" + fls + "</exa:filelist>" ;
+ }
+ str = str + "</exa:application></exa:request>" ;
+ v = this.getField('exa:request') ;
+ if (v) {
+ v.value = str ;
+ }
+ }
+
+\stopJSpreamble
+
+\startJSpreamble request_3 used now
+
+ var exa_multiple = false ;
+
+ function setfilename ( suffixes ) {
+ if (event.targetName) {
+ var name = event.targetName ;
+ var fake = name.replace(/filename/,"fakename") ;
+ } else {
+ var name = 'filename' ;
+ var fake = 'fakename' ;
+ }
+ f = this.getField(fake) ;
+ if (f) {
+ f.browseForFileToSubmit() ;
+ if ((suffixes != "") && (f.value != "")) {
+ %
+ s = suffixes.replace(/,/g,"|") ;
+ r = new RegExp() ;
+ s = "\\\\.(" + s + ")$" ;
+ r.compile(s, "i") ;
+ if (f.value.search(r)<=0) {
+ f.value = "" ;
+ app.alert('This filetype is not permitted.') ;
+ %
+ % lst = suffixes.split(/,/) ;
+ % ok = false ;
+ % for (i=0;i<lst.length;i++) {
+ % if (f.value == lst[i]) {
+ % ok = true ;
+ % }
+ % }
+ % if (! ok) {
+ % f.value = "" ;
+ % app.alert('This filetype is not permitted.') ;
+ %
+ }
+ }
+ g = this.getField(name) ;
+ if (g) {
+ g.value = f.value ;
+ }
+% we need to set the value of the selector to empty else
+% we get some funny preloading of multimeg files in spite
+% of the specs that say that xml fields will not get sent
+% if (example_method == "XFDF" ) {
+% f.value = "" ;
+% } else {
+% identify_example_url ;
+% if (example_url.indexOf("localhost")>=0) {
+% f.value = "" ;
+% }
+% }
+ }
+ this.dirty = false ;
+ }
+
+ function addfilename () {
+ if (exa_multiple) {
+ h = this.getField("filelist") ;
+ g = this.getField("filename") ;
+ if ((g) && (h)) {
+ str = g.value ;
+ if (h.value == "") {
+ h.value = str ;
+ } else {
+ h.value = h.value + "\\n" + str ;
+ }
+ g.value = "" ;
+ this.value = "" ;
+ }
+ }
+ this.dirty = false ;
+ }
+
+ % this only works with client that assembles request
+
+ function registerfilename (str) {
+ if (str!="") {
+ h = this.getField("filelist") ;
+ if (h) {
+ if (h.value != "") {
+ h.value = h.value + "\\n" ;
+ }
+ h.value = h.value + str ;
+ } else {
+ if (exa_registered != "") {
+ exa_registered = exa_registered + "\\n" ;
+ }
+ exa_registered = exa_registered + str ;
+ }
+ }
+ console.show ;
+ console.println('registered files') ;
+ console.println("file: "+str) ;
+ console.println("list: "+exa_registered) ;
+ this.dirty = false ;
+ }
+
+ function checkfilename () {
+ }
+
+ function getfilename ( suffixes ) {
+ setfilename(suffixes) ;
+ checkfilename() ;
+ addfilename() ;
+ }
+
+ function resetfilename () {
+ do_erase_example_file("fakename") ;
+ do_erase_example_file("filename") ;
+ do_erase_example_file("filelist") ;
+ do_erase_example_list("filename") ;
+ do_erase_example_list("fakename") ;
+ }
+
+\stopJSpreamble
+
+\endinput
diff --git a/tex/context/base/java-fil.tex b/tex/context/base/java-fil.tex
new file mode 100644
index 000000000..4d79a2ace
--- /dev/null
+++ b/tex/context/base/java-fil.tex
@@ -0,0 +1,48 @@
+%D \module
+%D [ file=java-fil,
+%D version=1998.06.01,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Filing and Printing,
+%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.
+
+\startJSpreamble Auxiliary used now
+
+ function DocumentFileName ()
+ { var Paths = this.path.split("/") ;
+ Paths = Paths[Paths.length-1].split(".") ;
+ return(Paths[0]) }
+
+ function Print_Page_Range(From, To) % gaat mis, nog geen args mogelijk
+ { if ((Number(From)>0)&&(Number(To)>=Number(From)))
+ { var myFrom = Number(From)-1 ;
+ var myTo = Number(To)-1 ;
+ this.print(false,myFrom,myTo,true) } }
+
+ function Print_This_Page ()
+ { this.print(false,this.pageNum,this.pageNum,true) }
+
+\stopJSpreamble
+
+\definereference
+ [PrintSubPaginas]
+ [JS(Print_Page_Range{\firstsubpage,\lastsubpage})]
+
+\definereference
+ [PrintSubPages]
+ [JS(Print_Page_Range{\firstsubpage,\lastsubpage})]
+
+\definereference
+ [PrintDezePagina]
+ [JS(Print_This_Page)]
+
+\definereference
+ [PrintThisPage]
+ [JS(Print_This_Page)]
+
+\endinput
diff --git a/tex/context/base/java-fld.tex b/tex/context/base/java-fld.tex
new file mode 100644
index 000000000..3c24b7e02
--- /dev/null
+++ b/tex/context/base/java-fld.tex
@@ -0,0 +1,282 @@
+%D \module
+%D [ file=java-fld,
+%D version=1998.05.20,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Field 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.
+
+% will be simplified, since we now parse functions
+
+% nu nog alles geladen, moet dus anders
+
+\startJSpreamble {Sanitize_TeX_Input} used later
+
+ function Sanitized_TeX_String (value)
+ { var v = value ;
+ v = v.replace( /\\\\oe/g,"\\234") ;
+ v = v.replace( /\\\\<</g,"\\253") ;
+ v = v.replace( /\\\\>>/g,"\\273") ;
+ v = v.replace( /\\\\`A/g,"\\300") ;
+ v = v.replace( /\\\\'A/g,"\\301") ;
+ v = v.replace( /\\\\^A/g,"\\302") ;
+ v = v.replace( /\\\\~A/g,"\\303") ;
+ v = v.replace( /\\\\"A/g,"\\304") ;
+ v = v.replace( /\\\\oA/g,"\\305") ;
+ v = v.replace( /\\\\AE/g,"\\306") ;
+ v = v.replace( /\\\\,C/g,"\\307") ;
+ v = v.replace( /\\\\`E/g,"\\310") ;
+ v = v.replace( /\\\\'E/g,"\\311") ;
+ v = v.replace( /\\\\^E/g,"\\312") ;
+ v = v.replace( /\\\\"E/g,"\\313") ;
+ v = v.replace( /\\\\`I/g,"\\314") ;
+ v = v.replace( /\\\\'I/g,"\\315") ;
+ v = v.replace( /\\\\^I/g,"\\316") ;
+ v = v.replace( /\\\\"I/g,"\\317") ;
+ v = v.replace( /\\\\~N/g,"\\321") ;
+ v = v.replace( /\\\\`O/g,"\\322") ;
+ v = v.replace( /\\\\'O/g,"\\323") ;
+ v = v.replace( /\\\\^O/g,"\\324") ;
+ v = v.replace( /\\\\~O/g,"\\325") ;
+ v = v.replace( /\\\\"O/g,"\\326") ;
+ v = v.replace( /\\\\`U/g,"\\331") ;
+ v = v.replace( /\\\\'U/g,"\\332") ;
+ v = v.replace( /\\\\^U/g,"\\333") ;
+ v = v.replace( /\\\\"U/g,"\\334") ;
+ v = v.replace( /\\\\'Y/g,"\\335") ;
+ v = v.replace( /\\\\ss/g,"\\337") ;
+ v = v.replace( /\\\\`a/g,"\\340") ;
+ v = v.replace( /\\\\'a/g,"\\341") ;
+ v = v.replace( /\\\\^a/g,"\\342") ;
+ v = v.replace( /\\\\~a/g,"\\343") ;
+ v = v.replace( /\\\\"a/g,"\\344") ;
+ v = v.replace( /\\\\oa/g,"\\345") ;
+ v = v.replace( /\\\\ae/g,"\\346") ;
+ v = v.replace( /\\\\,c/g,"\\347") ;
+ v = v.replace( /\\\\`e/g,"\\350") ;
+ v = v.replace( /\\\\'e/g,"\\351") ;
+ v = v.replace( /\\\\^e/g,"\\352") ;
+ v = v.replace( /\\\\"e/g,"\\353") ;
+ v = v.replace( /\\\\`i/g,"\\354") ;
+ v = v.replace( /\\\\'i/g,"\\355") ;
+ v = v.replace( /\\\\^i/g,"\\356") ;
+ v = v.replace( /\\\\"i/g,"\\357") ;
+ v = v.replace( /\\\\~n/g,"\\361") ;
+ v = v.replace( /\\\\`o/g,"\\362") ;
+ v = v.replace( /\\\\'o/g,"\\363") ;
+ v = v.replace( /\\\\^o/g,"\\364") ;
+ v = v.replace( /\\\\~o/g,"\\365") ;
+ v = v.replace( /\\\\"o/g,"\\366") ;
+ v = v.replace( /\\\\`u/g,"\\371") ;
+ v = v.replace( /\\\\'u/g,"\\372") ;
+ v = v.replace( /\\\\^u/g,"\\373") ;
+ v = v.replace( /\\\\"u/g,"\\374") ;
+ v = v.replace( /\\\\'y/g,"\\375") ;
+ v = v.replace( /\\\\"y/g,"\\377") ;
+ return(v) }
+
+ var TeX_Key_Mode = 0 ;
+
+ function Initialize_TeX_Keystroke ()
+ { TeX_Key_Char = "" ;
+ TeX_Key_Mode = 0 }
+
+ function Sanitized_TeX_Keystroke (change)
+ { if (change=="\\\\")
+ { TeX_Key_Mode = 1 ;
+ return("") }
+ else if (TeX_Key_Mode==1)
+ { TeX_Key_Mode = 2 ;
+ TeX_Key_Char = change ;
+ return("") }
+ else if (TeX_Key_Mode==2)
+ { TeX_Key_Mode = 0 ;
+ TeX_Key_Char = "\\\\"+TeX_Key_Char+change ;
+ return(Sanitized_TeX_String(TeX_Key_Char)) }
+ else
+ { TeX_Key_Mode = 0 ;
+ return(change) } }
+
+\stopJSpreamble
+
+\startJScode {Initialize_TeX_Key} uses {Sanitize_TeX_Input}
+ Initialize_TeX_Keystroke() ;
+\stopJScode
+
+\startJScode {Convert_TeX_Key} uses {Sanitize_TeX_Input}
+ if (!event.willCommit)
+ { event.change = Sanitized_TeX_Keystroke(event.change) }
+\stopJScode
+
+\startJScode{Convert_TeX_String} uses {Sanitize_TeX_Input}
+ event.value = Sanitized_TeX_String(event.value) ;
+\stopJScode
+
+\startJSpreamble fields_1 used now
+
+var visible_field = new Array() ;
+var visible_fields = 0 ;
+
+function PresetFields ( )
+ { this.syncAnnotScan() }
+
+function Preset_Fields ( )
+ { this.syncAnnotScan() }
+
+function Hide_When_Down ( )
+ { event.target.hidden = true }
+
+function Hide_Field ( Name )
+ { var v = this.getField(Name) ;
+ if (v)
+ { v.hidden = true ;
+ v.readonly = true ;
+ this.dirty = false } }
+
+function Do_Vide_Field ( Name, Closable )
+ { var v = this.getField(Name) ;
+ if (v)
+ { ++visible_fields ;
+ visible_field[visible_fields] = Name ;
+ v.hidden = false ;
+ if (Closable)
+ { v.readonly = false ;
+ v.value = "On" }
+ this.dirty = false } }
+
+function Vide_Field ( Name )
+ { Do_Vide_Field(Name,false) }
+
+function Vide_Hide_Field ( Name )
+ { Do_Vide_Field(Name,true) }
+
+function Hide_Fields ()
+ { while (visible_fields>0)
+ { Hide_Field(visible_field[visible_fields]) ;
+ --visible_fields } }
+
+function Vide_Fields ( Name )
+ { Hide_Fields () ;
+ Vide_Field ( Name) }
+
+function Vide_Hide_Fields ( Name )
+ { Hide_Fields () ;
+ Vide_Hide_Field ( Name) }
+
+function Toggle_Hide ( Name )
+ { var v = this.getField(Name) ;
+ if (v)
+ { v.hidden = !v.hidden ;
+ this.dirty = false } }
+
+function Field_On ( Name )
+ { v = this.getField(Name) ;
+ if (v) { v.value = "On" ; this.dirty = false } }
+
+function Field_Off ( Name )
+ { var v = this.getField(Name) ;
+ if (v) { v.value = "Off" ; this.dirty = false } }
+
+function Toggle_Value ( Name )
+ { var v = this.getField(Name) ;
+ if (v)
+ { if (v.value=="On")
+ { v.value = "Off" }
+ else
+ { v.value = "On" } }
+ this.dirty = false }
+
+function Toggle_Read ( Name )
+ { var v = this.getField(Name);
+ if (v) { v.readonly = !v.readonly } }
+
+function Flip_Fields ( Name )
+ { var Names = Name.split(",") ;
+ for (var i=0;i<Names.length;i++)
+ { v = this.getField(Names[i]) ;
+ if (v)
+ { v.hidden = !v.hidden ;
+ v.value = "On" } } }
+
+function Forget_Changes ()
+ { this.dirty = false }
+
+function ForgetChanges ()
+ { this.dirty = false }
+\stopJSpreamble
+
+%\startJScode{Hide_When_Down} Hide_When_Down() \stopJScode
+%\startJScode{Hide_Field} Hide_Field(JS_S_1) \stopJScode
+%\startJScode{Vide_Field} Vide_Field(JS_S_1) \stopJScode
+%\startJScode{Toggle_Hide} Toggle_Hide(JS_S_1) \stopJScode
+%\startJScode{Field_On} Field_On(JS_S_1) \stopJScode
+%\startJScode{Field_Off} Field_Off(JS_S_1) \stopJScode
+%\startJScode{Toggle_Value} Toggle_Value(JS_S_1) \stopJScode
+%\startJScode{Toggle_Read} Toggle_Read(JS_S_1) \stopJScode
+%\startJScode{Flip_Fields} Flip_Fields(JS_S_1) \stopJScode
+%
+%\startJScode{Forget_Changes} this.dirty = false \stopJScode
+
+\definereference[ForgetChanges][JS(Forget_Changes)]
+
+% This can be done more efficient, by keeping track of the
+% current top of the stack.
+
+\startJSpreamble FieldStack used later
+
+function Reset_Fields ( FieldSet )
+ { var i = 1 ;
+ while (true)
+ { v = this.getField(FieldSet+":"+i) ;
+ if (!v)
+ { break }
+ else
+ { v.value = "Off" }
+ i++ } }
+
+function Set_Fields ( FieldSet )
+ { var i = 1 ;
+ while (true)
+ { v = this.getField(FieldSet+":"+i) ;
+ if (!v)
+ { break }
+ else
+ { v.value = "On" }
+ i++ } }
+
+function Set_Field ( FieldSet, FieldName )
+ { Reset_Fields(FieldSet) ;
+ v = this.getField(FieldSet+":"+FieldName) ;
+ if (v) { v.value = "On" } }
+
+function Reset_Field ( FieldSet, FieldName )
+ { Set_Fields(FieldSet) ;
+ v = this.getField(FieldSet+":"+FieldName) ;
+ if (v) { v.value = "Off" } }
+
+function Walk_Field ( FieldSet )
+ { var i = 1 ;
+ while (true)
+ { v = this.getField(FieldSet+":"+i) ;
+ if (v)
+ { if (v.value=="On")
+ { v.value = "Off" ;
+ var ii = i ; ii++ ;
+ v = this.getField(FieldSet+":"+ii) ;
+ if (!v)
+ { v = this.getField(FieldSet+":"+1) }
+ if (v)
+ { v.value = "On" }
+ break }
+ i++ }
+ else
+ { break } } }
+
+\stopJSpreamble
+
+\endinput
diff --git a/tex/context/base/java-ini.lua b/tex/context/base/java-ini.lua
new file mode 100644
index 000000000..f64a8a18f
--- /dev/null
+++ b/tex/context/base/java-ini.lua
@@ -0,0 +1,120 @@
+if not modules then modules = { } end modules ['java-ini'] = {
+ version = 1.001,
+ comment = "companion to java-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+local lpegmatch = lpeg.match
+
+javascripts = javascripts or { }
+javascripts.codes = javascripts.codes or { }
+javascripts.preambles = javascripts.preambles or { }
+javascripts.functions = javascripts.functions or { }
+
+local codes, preambles, functions = javascripts.codes, javascripts.preambles, javascripts.functions
+
+local preambled = { }
+
+local function storefunction(s)
+ functions[s] = true
+end
+
+local uses = lpeg.P("uses")
+local used = lpeg.P("used")
+local left = lpeg.P("{")
+local right = lpeg.P("}")
+local space = lpeg.S(" \r\n")
+local spaces = space^0
+local braced = left * lpeg.C((1-right-space)^1) * right
+local unbraced = lpeg.C((1-space)^1)
+local name = spaces * (braced + unbraced) * spaces
+local any = lpeg.P(1)
+local script = lpeg.C(any^1)
+local funct = lpeg.P("function")
+local leftp = lpeg.P("(")
+local rightp = lpeg.P(")")
+local fname = spaces * funct * spaces * (((1-space-left)^1)/storefunction) * spaces * leftp
+
+local parsecode = name * ((uses * name) + lpeg.Cc("")) * spaces * script
+local parsepreamble = name * ((used * name) + lpeg.Cc("")) * spaces * script
+local parsefunctions = (fname + any)^0
+
+function javascripts.storecode(str)
+ local name, uses, script = lpegmatch(parsecode,str)
+ if name and name ~= "" then
+ javascripts.codes[name] = { uses, script }
+ end
+end
+
+function javascripts.storepreamble(str) -- now later
+ local name, used, script = lpegmatch(parsepreamble,str)
+ if name and name ~= "" then
+ preambles[#preambles+1] = { name, used, script }
+ preambled[name] = #preambles
+ lpegmatch(parsefunctions,script)
+ end
+end
+
+function javascripts.setpreamble(name,script) -- now later
+ if name and name ~= "" then
+ preambles[#preambles+1] = { name, "now", script }
+ preambled[name] = #preambles
+ lpegmatch(parsefunctions,script)
+ end
+end
+
+function javascripts.addtopreamble(name,script) -- now later
+ if name and name ~= "" then
+ local p = preambled[name]
+ if p then
+ preambles[p] = { "now", preambles[p] .. " ;\n" .. script }
+ else
+ preambles[#preambles+1] = { name, "now", script }
+ preambled[name] = #preambles
+ lpegmatch(parsefunctions,script)
+ end
+ end
+end
+
+function javascripts.usepreamblenow(name) -- now later
+ if name and name ~= "" and preambled[name] then
+ preambles[preambled[name]][2] = "now"
+ end
+end
+
+function javascripts.code(name,arguments)
+ local c = codes[name]
+ if c then
+ local u, code = c[1], c[2]
+ if u ~= "" then
+ local p = preambled[u]
+ if p then
+ preambles[p][1] = "now"
+ end
+ end
+ return code
+ end
+ local f = functions[name]
+ if f then
+ -- temporary hack, i need a more clever approach
+ if arguments then
+ return format("%s(%s)",name,'"' .. arguments.gsub(arguments,'%s*,%s*','"%1",') .. '"')
+ else
+ return format("%s()",name)
+ end
+ end
+end
+
+function javascripts.flushpreambles()
+ local t = { }
+ for i=1,#preambles do
+ local preamble = preambles[i]
+ if preamble[2] == "now" then
+ t[#t+1] = { preamble[1], preamble[3] }
+ end
+ end
+ return t
+end
diff --git a/tex/context/base/java-ini.mkii b/tex/context/base/java-ini.mkii
new file mode 100644
index 000000000..e929da108
--- /dev/null
+++ b/tex/context/base/java-ini.mkii
@@ -0,0 +1,713 @@
+%D \module
+%D [ file=java-ini,
+%D version=1998.01.30,
+%D title=\CONTEXT\ JavaScript 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 JavaScript Macros / Initialization}
+
+% BUG: preamble zonder used/used en split
+
+% todo: lua sanitizer
+
+% JavaScript support is under development. In the near future
+% a slightly different model will be used. The JScode stuff
+% will probably become just auto function inclusion and the
+% JS_* things will disappear. First I have to find a way to
+% deal with global variables so the 'uses' thing will remain.
+
+% ook p{ref}
+% documentation should be corrected to JS(
+
+% Also, obeylines will be supported.
+
+\unprotect
+
+%D \JAVA\ support is not implemented as a generic support
+%D module. The main reason for this is that passing system
+%D variables to a \JAVASCRIPT\ is closely related to other core
+%D macros. First some messages:
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+
+%D \TEX\ is not the right tool to check the \JAVA\ code; the
+%D most we can do is reporting some passed variables:
+
+\newif\iftraceJScode \traceJScodefalse
+
+\let\traceJScode\traceJScodetrue
+
+%D A bit out of place, but not dangerous:
+
+\bgroup
+\catcode127=\@@letter
+\gdef\delcharacter{^^7f}
+\egroup
+
+%D The number of passed variables is minimalized by setting the
+%D next switch.
+
+\newif\ifminimalizeJScode \minimalizeJScodetrue
+
+%D \macros
+%D {JS*}
+%D
+%D Because \JAVASCRIPT's are activated by the user, for
+%D instance by activating on a button, their support is closely
+%D related to the referencing mechanism. Integration takes
+%D place by
+%D
+%D \starttyping
+%D \goto{calculate total}[Sum()]
+%D \stoptyping
+%D
+%D The \type{()} classify this as a script. If they are absent,
+%D the keyword is treated as a normal reference.
+%D
+%D One can pass arguments to such a script by saying:
+%D
+%D \starttyping
+%D \goto{calculate total}[Sum(1.5,2.3)]
+%D \stoptyping
+%D
+%D References are passed by using the \type{R{}} classifier.
+%D
+%D \starttyping
+%D \goto{calculate total}[Sum(1.5,2.3,R{overflow})]
+%D \stoptyping
+%D
+%D The last call calls the script \type{Sum} and passes the
+%D next set of variables:
+%D
+%D \starttyping
+%D JS_S_1="1.5";
+%D JS_S_2="2.3";
+%D JS_R_3="overflow";
+%D JS_P_3=3;
+%D \stoptyping
+%D
+%D The first two parameters are just strings, the third one
+%D however is treated as a reference and results in passing the
+%D reference (if needed this references is prefixed) and the
+%D (real) page number. The alternative:
+%D
+%D \starttyping
+%D \goto{calculate total}[JS(Sum{V{1.5},V{2.3},R{overflow}})]
+%D \stoptyping
+%D
+%D does a verbose passing:
+%D
+%D \starttyping
+%D JS_V_1=1.5;
+%D JS_V_2=2.3;
+%D JS_R_3="overflow";
+%D JS_P_3=3;
+%D \stoptyping
+% %D
+% %D Finally we have a counter that tells\JAVA\ how many
+% %D arguments were passed,
+% %D
+% %D \starttyping
+% %D JS_N
+% %D \stoptyping
+
+%D We will also support direct function calls. In that case
+%D no intermediate variables are used.
+
+%D \macros
+%D {startJScode}
+%D
+%D A piece of \JAVASCRIPT\ code is defined by saying:
+%D
+%D \starttyping
+%D \startJScode{SomeScript}
+%D var Item=this.getField("item");
+%D N=Item.getArray();
+%D Total=this.getField("total");
+%D Total.value=0;
+%D for (j=0; j<N.length; j++)
+%D { if (N[j].value!="")
+%D { Total.value += N[j].value } } ;
+%D if ((JS_N>0) && (JS_R_1!=""))
+%D { gotoNamedDest(JS_R_1) };
+%D \stopJScode
+%D \stoptyping
+%D
+%D Such a piece of code is closely related to the interpreter
+%D used. Watch the last two lines, here the script adapts
+%D itself to the presence of a reference.
+%D
+%D While
+%D
+%D \starttyping
+%D \startJScode{name}
+%D name = 4 ;
+%D \stopJScode
+%D \stoptyping
+%D
+%D assumes uses no preamble or presumes that the preamble is
+%D always loaded, the next definition also tells \CONTEXT\ to
+%D actually include the preamble needed.
+%D
+%D \starttyping
+%D \startJScode{uses} uses {later}
+%D uses = 6 ;
+%D \stopJScode
+%D \stoptyping
+
+\long\def\startJScode#1 #2
+ {\doifelse{#2}{uses}
+ {\dostartJScodeA{#1}}
+ {\dostartJScodeB{#1} #2 }}
+
+\long\def\dostartJScodeA#1#2 #3\stopJScode
+ {\long\setgvalue{\r!java#1}{\do{#2}{#3}}}
+
+\long\def\dostartJScodeB#1#2\stopJScode
+ {\long\setgvalue{\r!java#1}{\do{}{#2}}}
+
+\let\stopJScode\relax
+
+%D \macros
+%D {presetJScode}
+%D
+%D The code can be retrieved by saying
+%D
+%D \starttyping
+%D \presetJScode{SomeScript}{template}
+%D \stoptyping
+%D
+%D Such a template is a comma separated list, where
+%D individual entries can optionally be transformed by
+%D \type{R{}} and \type{V{}}.
+%D
+%D After this call, the code is available in \type{\JScode}.
+
+\newif\ifdirectJScode
+
+\def\presetJScode#1#2% #1=operation #2=arguments
+ {\setverbosecscharacters
+ \def\par{\delcharacter}% was: { }
+ \scratchcounter\zerocount
+ \globallet\JScode\empty
+ \def\do##1##2%
+ {\doifelse{##2}{!}\directJScodetrue\directJScodefalse}%
+ \getvalue{\r!java#1}%
+ \edef\!!stringa{#2}%
+ \ifx\!!stringa\empty \else
+ \processcommacommand[\!!stringa]\dopresetJSvariables
+ \fi
+ \def\docommand##1%
+ {\doifundefinedelse{\r!java\r!java##1}
+ {\showmessage\m!javascript2{##1}}
+ {\useJSpreamblenow{##1}}}%
+% {\doglobal\increment\currentJSpreamble
+% \doglobal\addtocommalist{##1}\allJSpreambles}}%
+ \def\do##1##2%
+ {\xdef\JScode{\ifdirectJScode#1(\JScode)\else\JScode##2\fi}%
+ %\xdef\JScode{JS\string_N=\the\scratchcounter;\JScode}%
+ \processcommalist[##1]\docommand}%
+ \getvalue{\r!java#1}}
+
+\def\dopresetJSvariables#1%
+ {\advance\scratchcounter \plusone
+ \donefalse
+ \dodopresetJSvariables#1\end}%
+
+\def\dodopresetJSvariables
+ {\doifnextcharelse R\dodopresetJSrefvariables
+ {\doifnextcharelse V\dodopresetJSvervariables
+ {\doifnextcharelse S\dodopresetJSstrvariables
+ \dodopresetJSrawvariables}}}
+
+\def\dodopresetJSrefvariables R#1\end
+ {\doifreferencefoundelse{#1}
+ {\donetrue \dododopresetJSvariables R{\referenceprefix#1}%
+ \donefalse\dododopresetJSvariables P{\currentrealreference}}
+ {\unknownreference{#1}}%
+ \ifminimalizeJScode \else
+ \donetrue\dododopresetJSvariables S{#1}%
+ \fi}
+
+\def\dodopresetJSvervariables V#1\end
+ {\donefalse\dododopresetJSvariables V{#1}%
+ \ifminimalizeJScode \else
+ \donetrue\dododopresetJSvariables S{#1}%
+ \fi}
+
+\def\dodopresetJSstrvariables S#1\end
+ {\donetrue\dododopresetJSvariables S{#1}}
+
+\def\dodopresetJSrawvariables #1\end
+ {\donetrue\dododopresetJSvariables S{#1}}
+
+\def\JSprefix#1%
+ {JS\string_#1\string_\the\scratchcounter}
+
+\def\dododopresetJSvariables#1#2%
+ {\iftraceJScode
+ \writestatus{JavaScript}{\JSprefix#1=#2}
+ \xdef\JScode{\JScode console.println("\JSprefix#1=#2"); }%
+ \fi
+ \ifdirectJScode
+ \xdef\JScode{\ifx\JScode\empty\else\JScode,\fi\ifdone"#2"\else#2\fi}%
+ \else
+ \xdef\JScode{\JScode\JSprefix#1=\ifdone"#2"\else#2\fi; }%
+ \fi}
+
+%D \macros
+%D {startJSpreamble, flushJSpreamble}
+%D
+%D One can define insert \JAVASCRIPT\ code at the document level
+%D by using:
+%D
+%D \starttyping
+%D \startJSpreamble{oeps}
+%D oeps = 1 ;
+%D \stopJSpreamble
+%D \stoptyping
+%D
+%D which is the same as:
+%D
+%D \starttyping
+%D \startJSpreamble{now} used now
+%D now = 2 ;
+%D \stopJSpreamble
+%D \stoptyping
+%D
+%D while the next definition is only included when actually
+%D used.
+%D
+%D \starttyping
+%D \startJSpreamble{later} used later
+%D later = 3 ;
+%D \stopJSpreamble
+%D \stoptyping
+%D
+%D This command may be used more that once, but always before
+%D the first page is shipped out.
+
+\newif\ifoneJSpreamble \oneJSpreamblefalse
+
+\let\allJSpreambles\empty
+\newcounter\nofJSpreambles
+\newcounter\currentJSpreamble
+
+\long\def\startJSpreamble#1 #2 %
+ {\bgroup % we need to restore the catcodes
+ \restoreendofline % just in case it happens while reading lists
+ \doifelse{#2}{used}
+ {\dostartJSpreamble#1 }
+ {\dostartJSpreamble#1 now #2 }}
+
+\long\def\dostartJSpreamble#1 #2 %
+ {\processaction
+ [#2]
+ [ later=>\chardef\JSstatus\zerocount,%
+ now=>\chardef\JSstatus\plusone ,%
+ \s!default=>\chardef\JSstatus\plustwo ,%
+ \s!unknown=>\chardef\JSstatus\plustwo ]%
+ \ifaddJSlinebreaks
+ \obeylines \let\obeyedline \normalpar
+ \obeyspaces \let\obeyedspace\normalspace
+ \fi
+ \dodostartJSpreamble{#1}}
+
+\long\def\dodostartJSpreamble#1#2\stopJSpreamble
+ {\presetJSfunctions #2function ()\end
+ \long\setgvalue{\r!java\r!java#1}{#2}%
+ \ifcase\JSstatus \else
+ \useJSpreamblenow{#1}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {setJSpreamble, addtoJSpreamble}
+%D
+%D In addition to the previous preamble definitions, we can
+%D set a preamble \quote {in||line} and add tokens to a
+%D preamble.
+
+\def\setJSpreamble#1#2%
+ {\doifundefined{\r!java\r!java#1}
+ {\setgvalue{\r!java\r!java#1}{#2;}%
+ \doglobal\increment\currentJSpreamble
+ \doglobal\addtocommalist{#1}\allJSpreambles}}
+
+\def\addtoJSpreamble#1#2%
+ {\doifdefinedelse{\r!java\r!java#1}
+ {\edef\!!stringa{\r!java\r!java#1}%
+ \edef\!!stringb{\csname\!!stringa\endcsname}%
+ \@EA\setgvalue\@EA\!!stringa\@EA{\!!stringb #2;}}
+ {\setJSpreamble{#1}{#2}}}
+
+%D \macros
+%D {useJSpreamblenow}
+%D
+%D The next macro can be used to force inclusion of postponed
+%D \JAVASCRIPT\ preambles.
+
+\def\useJSpreamblenow#1%
+ {\doglobal\increment\currentJSpreamble
+ \doglobal\addtocommalist{#1}\allJSpreambles}
+
+%D Because we want to check for valid calls, we preload the
+%D functions. This means that we can call them directly as
+%D well as indirectly when defined by \type {\startJScode} etc.
+
+% \long\def\presetJSfunctions#1function #2(#3)%
+% {\doifelsenothing{#2}
+% {\long\def\presetJSfunctions##1\end{}}
+% {\stripspaces\from#2\to\ascii
+% \doifundefined{\r!java\ascii}{\setgvalue{\r!java\ascii}{\do{}{!}}}}%
+% \presetJSfunctions}
+
+\long\def\presetJSfunctions#1function#2(#3)%
+ {\doifelse{#2}\space
+ {\long\def\presetJSfunctions##1\end{}}
+ {\stripspaces\from#2\to\ascii
+ \doifundefined{\r!java\ascii}{\setgvalue{\r!java\ascii}{\do{}{!}}}}%
+ \presetJSfunctions}
+
+\def\getJSpreamble#1%
+ {\getvalue{\r!java\r!java#1}}
+
+\def\presetJSpreamble
+ {\ifx\allJSpreambles\empty\else
+ \bgroup
+ \setverbosecscharacters
+ \obeyspaces \let\obeyedspace\normalspace
+ \def\par{\delcharacter}% was: { }
+ \globallet\JSpreamble\empty
+ \def\@@collectedJSpreamble{\r!java\r!java collected}%
+ \letvalue{\@@collectedJSpreamble}=\empty
+ \def\docommand##1%
+ {\xdef\JScode{\getvalue{\r!java\r!java##1}}%
+ \ifoneJSpreamble % \global\letcdcsname
+ \@EA\setxvalue\@EA\@@collectedJSpreamble\@EA
+ {\csname\@@collectedJSpreamble\endcsname\JScode}%
+ \else
+ \setxvalue{\r!java\r!java##1}{\JScode}%
+ \fi}%
+ \processcommacommand[\allJSpreambles]\docommand
+ \ifoneJSpreamble
+ \gdef\allJSpreambles{collected}%
+ \fi
+ \globallet\presetJSpreamble\relax
+ \egroup
+ \fi}
+
+\def\flushJSpreamble
+ {\iflocation\ifx\allJSpreambles\empty\else
+ \ifcase\nofJSpreambles\else\ifnum\nofJSpreambles=\currentJSpreamble
+ \bgroup
+ \presetJSpreamble
+ \expanded{\doflushJSpreamble{\allJSpreambles}}%
+ \globallet\flushJSpreamble\relax
+ \globallet\allJSpreambles\empty
+ \egroup
+ \fi\fi
+ \fi\fi}
+
+\def\finalflushJSpreamble
+ {\iflocation
+ \flushJSpreamble
+ \ifcase\currentJSpreamble\relax\else
+ \savecurrentvalue\nofJSpreambles\currentJSpreamble
+ \globallet\currentJSpreamble\nofJSpreambles
+ \fi
+ \fi}
+
+\prependtoks \flushJSpreamble \to \everyshipout
+\prependtoks \finalflushJSpreamble \to \everylastshipout
+
+%D \macros
+%D {doPSsanitizeJScode}
+%D
+%D Before the code can be passed to the (\POSTSCRIPT\ or \PDF)
+%D output file, some precautions must be made concerning the
+%D use of \type{(} and~\type{)}. Here we use a beautiful
+%D \type{\aftergroup} trick I discovered in the \TABLE\ format.
+
+\def\doPSsanitizeJScode#1\to#2%
+ {\begingroup
+ \scratchcounter\zerocount % \aftergroup counter
+ \aftergroup\xdef
+ \aftergroup#2%
+ \aftergroup{%
+ \expanded{\defconvertedargument\noexpand\JScode{#1}}%
+ \expandafter\handletokens\JScode\with\dodoPSsanitizeJScode
+ \aftergroup}%
+ \endgroup
+ \iftraceJScode
+ \writestatus{JS trace}{#2}%
+ \fi}
+
+%D I started with:
+%D
+%D \starttyping
+%D \def\dodoPSsanitizeJScode#1%
+%D {\aftergroup\string
+%D \if#1(%
+%D \expandafter\aftergroup\csname#1\endcsname
+%D \else\if#1)%
+%D \expandafter\aftergroup\csname#1\endcsname
+%D \else\if#1;%
+%D \aftergroup;\aftergroup\string\expandafter\aftergroup\
+%D \else
+%D \expandafter\aftergroup#1%
+%D \fi\fi\fi
+%D \advance\scratchcounter by 1
+%D \ifnum\scratchcounter=500
+%D \expandafter\dododoPSsanitizeJScode
+%D \fi}
+%D \stoptyping
+%D
+%D For pretty printing purposes, we need some way to signal
+%D \TEX\ macros. Therefore we introduce a special keyword
+%D \type{TEX}. When followed by a space, this keyword is
+%D ignored, that is, filtered from the stream. Now we have:
+
+\chardef\JSisTEX \zerocount
+\chardef\JScomment\zerocount
+
+\newif\ifaddJSlinebreaks \addJSlinebreakstrue
+
+\def\flushJSisTEX
+ {\ifcase\JSisTEX
+ \or \aftergroup T%
+ \or \aftergroup T\aftergroup E%
+ \or \aftergroup T\aftergroup E\aftergroup X%
+ \fi
+ \chardef\JSisTEX\zerocount}
+
+% \def\doJSlinebreak
+% {\ifaddJSlinebreaks
+% \aftergroup\string\aftergroup\n%
+% \fi}
+%
+% \def\dodoPSsanitizeJScode#1% % input stack>500 & TEX check
+% {\if#1/%
+% \ifnum\JScomment=0
+% \chardef\JScomment\plusone
+% \else\ifnum\JScomment=1
+% \chardef\JScomment\plustwo
+% \fi\fi
+% \else
+% \ifnum\JScomment=1
+% \aftergroup/%
+% \chardef\JScomment\zerocount
+% \fi
+% \ifnum\JScomment=2
+% \if#1\delcharacter
+% \chardef\JScomment\zerocount
+% \fi
+% \else
+% \if#1\delcharacter
+% \flushJSisTEX\doJSlinebreak
+% \else\if#1(%
+% \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
+% \else\if#1)%
+% \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
+% \else\if#1;%
+% \flushJSisTEX\aftergroup;\doJSlinebreak
+% \else\if#1T%
+% \ifnum\JSisTEX=0 \chardef\JSisTEX\plusone \else\flushJSisTEX\aftergroup T\fi
+% \else\if#1E%
+% \ifnum\JSisTEX=1 \chardef\JSisTEX\plustwo \else\flushJSisTEX\aftergroup E\fi
+% \else\if#1X%
+% \ifnum\JSisTEX=2 \chardef\JSisTEX\plusthree \else\flushJSisTEX\aftergroup X\fi
+% \else\if#1\normalspace
+% \ifnum\JSisTEX=3 \chardef\JSisTEX\zerocount \else\flushJSisTEX\aftergroup#1\fi
+% \else
+% \flushJSisTEX\aftergroup\string\expandafter\aftergroup#1%
+% \fi\fi\fi\fi\fi\fi\fi\fi
+% \fi
+% \fi
+% \dododoPSsanitizeJScode}
+
+% todo: "http:\\" -> simple. maar wel \" afvangen
+%
+% use new pdftex escape mechanism or make fully expandable version, not used that often btw
+
+\chardef\JSstring\zerocount
+
+\def\doJSlinebreak
+ {\chardef\JScomment\zerocount
+ \chardef\JSstring\zerocount
+ \ifaddJSlinebreaks
+ \aftergroup\string\aftergroup\n%
+ \fi}
+
+\def\dodoPSsanitizeJScode#1% % input stack>500 & TEX check
+ {\if#1/%
+ \ifnum\JSstring=0
+ \ifnum\JScomment=0
+ \chardef\JScomment\plusone
+ \else\ifnum\JScomment=1
+ \chardef\JScomment\plustwo
+ \fi\fi
+ \else
+ \aftergroup/%
+ \fi
+ \else
+ \ifnum\JScomment=1
+ \aftergroup/%
+ \chardef\JScomment\zerocount
+ \fi
+ % is the delchar trick still needed?
+ \ifnum\JScomment=2
+ \ifnum`#1=13 % brrr
+ \doJSlinebreak
+ \else\if#1\par
+ \doJSlinebreak
+ \else\if#1\delcharacter
+ \doJSlinebreak
+ \fi\fi\fi
+ \else
+ \ifnum`#1=13 % brrr
+ \flushJSisTEX\doJSlinebreak
+ \else\if#1\par
+ \flushJSisTEX\doJSlinebreak
+ \else\if#1\delcharacter
+ \flushJSisTEX\doJSlinebreak
+ \else\if#1(%
+ \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
+ \else\if#1)%
+ \flushJSisTEX\aftergroup\string\expandafter\aftergroup\csname#1\endcsname
+ %\else\if#1;%
+ % \flushJSisTEX\aftergroup;\doJSlinebreak
+ \else\if#1T%
+ \ifnum\JSisTEX=0 \chardef\JSisTEX\plusone \else\flushJSisTEX\aftergroup T\fi
+ \else\if#1E%
+ \ifnum\JSisTEX=1 \chardef\JSisTEX\plustwo \else\flushJSisTEX\aftergroup E\fi
+ \else\if#1X%
+ \ifnum\JSisTEX=2 \chardef\JSisTEX\plusthree \else\flushJSisTEX\aftergroup X\fi
+ \else\if#1\normalspace
+ \ifnum\JSisTEX=3 \chardef\JSisTEX\zerocount \else\flushJSisTEX\aftergroup#1\fi
+ \else
+ % todo: "test\"test"
+ \if#1"%
+ \ifcase\JSstring
+ \chardef\JSstring\plusone
+ \else
+ \chardef\JSstring\zerocount
+ \fi
+ \fi
+ \flushJSisTEX\aftergroup\string\expandafter\aftergroup#1%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi % \fi
+ \fi
+ \fi
+ \dododoPSsanitizeJScode}
+
+%D Close reading learns that one line comments (\type{// ...})
+%D are removed from the stream. This permits switching in
+%D pretty printing \JAVASCRIPT\ sources as well as saves
+%D some bytes.
+
+%D The magic 500 in the next hack prevents the input stack from
+%D overflowing when large scripts are sanitized.
+
+\def\dododoPSsanitizeJScode
+ {\ifcase\JSisTEX\ifcase\JScomment
+ \advance\scratchcounter \plusone
+ \fi\fi
+ \ifnum\scratchcounter=500
+ \expandafter\dodododoPSsanitizeJScode
+ \fi}
+
+\def\dodododoPSsanitizeJScode
+ {\let\next={%
+ \aftergroup}%
+ \endgroup
+ \begingroup
+ \aftergroup\xdef
+ \aftergroup\sanitizedJScode
+ \aftergroup{%
+ \aftergroup\sanitizedJScode
+ \let\next=}}
+
+%D The macro \type{\doPSsanitizeJScode} converts its argument
+%D into the macro \type{\sanitizedJScode}, thereby prefixing
+%D each \type{(} and \type{)} by a slash.
+
+%D Hooking this mechanism into the general \CONTEXT\ reference
+%D mechanism does not take much effort:
+
+\definespecialtest{JS}%
+ {\doifdefinedelse{\r!java\currentreferenceoperation}}
+
+\definespeciallocation{JS}#1#2%
+ {\iflocation
+ \bgroup
+ \bgroup
+ \presetJScode
+ \currentreferenceoperation
+ \currentreferencearguments
+ \egroup
+ \dohandlegoto
+ {#2}%
+ {\dostartgotoJS\buttonwidth\buttonheight\JScode}%
+ {\dostopgotoJS}%
+ \egroup
+ \else
+ {#2}%
+ \fi}
+
+%D \macros
+%D {useJSscripts}
+%D
+%D In due time, users will build their collections of scripts,
+%D which can be used (loaded) when applicable. Although not all
+%D public, we will provide some general purpose scripts,
+%D collected in files with names like \type{java-...}. One can
+%D load these scripts with \type{\useJSscripts}, like:
+%D
+%D \starttyping
+%D \useJSscripts[fld]
+%D \stoptyping
+%D
+%D The not so complicated implementation of this macro is:
+
+\def\dodouseJSscripts#1%
+ {\doifelse{#1}\v!reset
+ {\let\allJSpreambles\empty}
+ {\doifundefined{\c!file\f!javascriptprefix#1}
+ {\startnointerference
+ \letgvalueempty{\c!file\f!javascriptprefix#1}%
+ \makeshortfilename[\f!javascriptprefix#1]%
+ \startreadingfile
+ \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing
+ \stopreadingfile
+ \stopnointerference}}}
+
+\def\douseJSscripts[#1][#2]%
+ {\processcommalist[#1]\dodouseJSscripts
+ \processcommalist[#2]\useJSpreamblenow}
+
+\def\useJSscripts
+ {\dodoubleempty\douseJSscripts}
+
+\protect \endinput
diff --git a/tex/context/base/java-ini.mkiv b/tex/context/base/java-ini.mkiv
new file mode 100644
index 000000000..6536ced48
--- /dev/null
+++ b/tex/context/base/java-ini.mkiv
@@ -0,0 +1,164 @@
+%D \module
+%D [ file=java-ini,
+%D version=1998.01.30,
+%D title=\CONTEXT\ JavaScript 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 JavaScript Macros / Initialization}
+
+\registerctxluafile{java-ini}{1.001}
+
+\unprotect
+
+%D \macros
+%D {JS*}
+%D
+%D Because \JAVASCRIPT's are activated by the user, for
+%D instance by activating on a button, their support is closely
+%D related to the referencing mechanism. Integration takes
+%D place by
+%D
+%D \starttyping
+%D \goto{calculate total}[Sum()]
+%D \stoptyping
+%D
+%D The \type{()} classify this as a script. If they are absent,
+%D the keyword is treated as a normal reference.
+%D
+%D One can pass arguments to such a script by saying:
+%D
+%D \starttyping
+%D \goto{calculate total}[Sum(1.5,2.3)]
+%D \stoptyping
+
+
+%D \macros
+%D {startJScode}
+%D
+%D A piece of \JAVASCRIPT\ code is defined by saying:
+%D
+%D \starttyping
+%D \startJScode{name}
+%D name = 4 ;
+%D \stopJScode
+%D \stoptyping
+%D
+%D This assumes uses no preamble or presumes that the preamble is
+%D always loaded, the next definition also tells \CONTEXT\ to
+%D actually include the preamble needed.
+%D
+%D \starttyping
+%D \startJScode{uses} uses {later}
+%D uses = 6 ;
+%D \stopJScode
+%D \stoptyping
+%D
+%D \macros
+%D {startJSpreamble}
+%D
+%D One can define insert \JAVASCRIPT\ code at the document level
+%D by using:
+%D
+%D \starttyping
+%D \startJSpreamble{oeps}
+%D oeps = 1 ;
+%D \stopJSpreamble
+%D \stoptyping
+%D
+%D which is the same as:
+%D
+%D \starttyping
+%D \startJSpreamble{now} used now
+%D now = 2 ;
+%D \stopJSpreamble
+%D \stoptyping
+%D
+%D while the next definition is only included when actually
+%D used.
+%D
+%D \starttyping
+%D \startJSpreamble{later} used later
+%D later = 3 ;
+%D \stopJSpreamble
+%D \stoptyping
+%D
+%D This command may be used more that once, but always before
+%D the first page is shipped out.
+%D
+%D \macros
+%D {setJSpreamble, addtoJSpreamble}
+%D
+%D In addition to the previous preamble definitions, we can
+%D set a preamble \quote {in||line} and add tokens to a
+%D preamble.
+%D
+%D \macros
+%D {useJSpreamblenow}
+%D
+%D This macro can be used to force inclusion of postponed
+%D \JAVASCRIPT\ preambles.
+
+\unexpanded\def\startJScode
+ {\begingroup\obeylualines\obeyluatokens\dostartJScode}
+
+\long\def\dostartJScode#1\stopJScode
+ {\normalexpanded{\endgroup\ctxlua{javascripts.storecode(\!!bs#1\!!es)}}}
+
+\let\stopJScode\relax
+
+\unexpanded\def\startJSpreamble
+ {\begingroup\obeylualines\obeyluatokens\dostartJSpreamble}
+
+\long\def\dostartJSpreamble#1\stopJSpreamble
+ {\normalexpanded{\endgroup\ctxlua{javascripts.storepreamble(\!!bs#1\!!es)}}}
+
+\let\stopJSpreamble\relax
+
+\def\setJSpreamble #1#2{\ctxlua{javascripts.storepreamble ("#1",\!!bs#2\!!es)}}
+\def\addtoJSpreamble #1#2{\ctxlua{javascripts.addtopreamble ("#1",\!!bs#2\!!es)}}
+\def\useJSpreamblenow #1{\ctxlua{javascripts.usepreamblenow("#1")}}
+\def\finalflushJSpreamble{\iflocation\ctxlua{javascripts.flushpreambles()}\fi}
+
+%D \macros
+%D {useJSscripts}
+%D
+%D In due time, users will build their collections of scripts,
+%D which can be used (loaded) when applicable. Although not all
+%D public, we will provide some general purpose scripts,
+%D collected in files with names like \type{java-...}. One can
+%D load these scripts with \type{\useJSscripts}, like:
+%D
+%D \starttyping
+%D \useJSscripts[fld]
+%D \stoptyping
+%D
+%D The not so complicated implementation of this macro is:
+
+\def\dodouseJSscripts#1%
+ {\doifelse{#1}\v!reset
+ {\let\allJSpreambles\empty}
+ {\ifcsname\c!file\f!javascriptprefix#1\endcsname \else
+ \startnointerference
+ \letgvalueempty{\c!file\f!javascriptprefix#1}%
+ \makeshortfilename[\f!javascriptprefix#1]%
+ \startreadingfile
+ \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing
+ \stopreadingfile
+ \stopnointerference
+ \fi}}
+
+\def\douseJSscripts[#1][#2]%
+ {\processcommalist[#1]\dodouseJSscripts
+ \processcommalist[#2]\useJSpreamblenow}
+
+\def\useJSscripts
+ {\dodoubleempty\douseJSscripts}
+
+\protect \endinput
diff --git a/tex/context/base/java-stp.tex b/tex/context/base/java-stp.tex
new file mode 100644
index 000000000..df4fbcc2f
--- /dev/null
+++ b/tex/context/base/java-stp.tex
@@ -0,0 +1,121 @@
+%D \module
+%D [ file=java-stp,
+%D version=2004.03.15,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Stepping,
+%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 define ocglist global, otherwise we quickly run into a memory hog (even
+% out of memory in a 512 Meg machine)
+
+% we cannot use doc_visited[this.pageNum] instead of doc_currentstep because
+% of some funny side effect (i.e. dup or so)
+
+\startJSpreamble Steps used now
+
+ var doc_ocglist = this.getOCGs() ;
+ var doc_stepname = "step" ;
+ var doc_currentstep = 0 ;
+ var doc_maxstep = 50 ;
+ var doc_visited = new Array() ;
+ var doc_busy = new Array() ;
+
+ function SetupStepper ( layername, laststep ) {
+ doc_stepname = layername ;
+ doc_maxstep = laststep ;
+ for (var i=0; i<=this.numPages; i++) {
+ doc_visited[i] = 0 ;
+ doc_busy[i] = 0 ;
+ }
+ }
+
+ for (var i=0; i<=this.numPages; i++) {
+ doc_visited[i] = 0 ;
+ doc_busy[i] = 0 ;
+ }
+
+ function GetOCG ( name ) {
+ for (var i=0; i < doc_ocglist.length; i++) {
+ if (doc_ocglist[i].name == name) {
+ return doc_ocglist[i] ;
+ }
+ }
+ return null ;
+ }
+
+ function CheckBusy ( ) {
+ var ocg = GetOCG("step:busy") ;
+ if (ocg != null) {
+ if (doc_visited[this.pageNum]==0) {
+ ocg.state = true ;
+ } else {
+ if (doc_visited[this.pageNum]<doc_busy[this.pageNum]) {
+ ocg.state = true ;
+ } else {
+ ocg.state = false ;
+ }
+ }
+ }
+ }
+
+ function SetStepper ( maxstep, state ) {
+ for (var i=1; i<=maxstep; i++) {
+ try {
+ var ocg = GetOCG(doc_stepname + ':' + String(i)) ;
+ if (ocg != null) {
+ ocg.state = state ;
+ }
+ } catch (e) {
+ return ;
+ }
+ }
+ }
+
+ function CheckStepper ( maxsteps ) {
+ SetStepper(doc_visited[this.pageNum], true) ;
+ doc_busy[this.pageNum] = Number(maxsteps) ;
+ doc_currentstep = doc_visited[this.pageNum] ;
+ CheckBusy() ;
+ }
+
+ function ResetStepper ( ) {
+ SetStepper(doc_maxstep, false) ;
+ doc_currentstep = 0 ;
+ }
+
+ function InvokeStepper ( ) {
+ try {
+ if (doc_currentstep<doc_busy[this.pageNum]) {
+ doc_currentstep += 1 ;
+ doc_visited[this.pageNum] = doc_currentstep ;
+ var ocg = GetOCG(doc_stepname + ':' + String(doc_currentstep)) ;
+ if (ocg != null) {
+ ocg.state = true ;
+ }
+ } else {
+ if (this.pageNum+1==this.numPages) {
+ this.pageNum = 0 ;
+ } else {
+ this.pageNum += 1 ;
+ }
+ }
+ CheckBusy() ;
+ } catch (e) {
+ return ;
+ }
+ }
+
+\stopJSpreamble
+
+% \definereference [SetupStepper] [JS(SetupStepper{step,50})]
+% \definereference [ResetStepper] [JS(ResetStepper)]
+% \definereference [CheckStepper] [JS(CheckStepper{\StepCounter})]
+% \definereference [InvokeStepper] [JS(InvokeStepper)]
+
+\endinput
diff --git a/tex/context/base/l-aux.lua b/tex/context/base/l-aux.lua
new file mode 100644
index 000000000..97063e3bc
--- /dev/null
+++ b/tex/context/base/l-aux.lua
@@ -0,0 +1,261 @@
+if not modules then modules = { } end modules ['l-aux'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- for inline, no store split : for s in string.gmatch(str,",* *([^,]+)") do .. end
+
+aux = aux or { }
+
+local concat, format, gmatch = table.concat, string.format, string.gmatch
+local tostring, type = tostring, type
+local lpegmatch = lpeg.match
+
+local P, R, V = lpeg.P, lpeg.R, lpeg.V
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
+local space = lpeg.P(' ')
+local equal = lpeg.P("=")
+local comma = lpeg.P(",")
+local lbrace = lpeg.P("{")
+local rbrace = lpeg.P("}")
+local nobrace = 1 - (lbrace+rbrace)
+local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
+local spaces = space^0
+
+local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
+
+local key = lpeg.C((1-equal-comma)^1)
+local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C(""))
+local pattern_c = (space+comma)^0 * (key * equal * value)
+
+local key = lpeg.C((1-space-equal-comma)^1)
+local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C("")))
+
+-- "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
+
+local hash = { }
+
+local function set(key,value) -- using Carg is slower here
+ hash[key] = value
+end
+
+local pattern_a_s = (pattern_a/set)^1
+local pattern_b_s = (pattern_b/set)^1
+local pattern_c_s = (pattern_c/set)^1
+
+aux.settings_to_hash_pattern_a = pattern_a_s
+aux.settings_to_hash_pattern_b = pattern_b_s
+aux.settings_to_hash_pattern_c = pattern_c_s
+
+function aux.make_settings_to_hash_pattern(set,how)
+ if how == "strict" then
+ return (pattern_c/set)^1
+ elseif how == "tolerant" then
+ return (pattern_b/set)^1
+ else
+ return (pattern_a/set)^1
+ end
+end
+
+function aux.settings_to_hash(str,existing)
+ if str and str ~= "" then
+ hash = existing or { }
+ if moretolerant then
+ lpegmatch(pattern_b_s,str)
+ else
+ lpegmatch(pattern_a_s,str)
+ end
+ return hash
+ else
+ return { }
+ end
+end
+
+function aux.settings_to_hash_tolerant(str,existing)
+ if str and str ~= "" then
+ hash = existing or { }
+ lpegmatch(pattern_b_s,str)
+ return hash
+ else
+ return { }
+ end
+end
+
+function aux.settings_to_hash_strict(str,existing)
+ if str and str ~= "" then
+ hash = existing or { }
+ lpegmatch(pattern_c_s,str)
+ return next(hash) and hash
+ else
+ return nil
+ end
+end
+
+local separator = comma * space^0
+local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
+local pattern = lpeg.Ct(value*(separator*value)^0)
+
+-- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
+
+aux.settings_to_array_pattern = pattern
+
+-- we could use a weak table as cache
+
+function aux.settings_to_array(str)
+ if not str or str == "" then
+ return { }
+ else
+ return lpegmatch(pattern,str)
+ end
+end
+
+local function set(t,v)
+ t[#t+1] = v
+end
+
+local value = lpeg.P(lpeg.Carg(1)*value) / set
+local pattern = value*(separator*value)^0 * lpeg.Carg(1)
+
+function aux.add_settings_to_array(t,str)
+ return lpegmatch(pattern,str,nil,t)
+end
+
+function aux.hash_to_string(h,separator,yes,no,strict,omit)
+ if h then
+ local t, s = { }, table.sortedkeys(h)
+ omit = omit and table.tohash(omit)
+ for i=1,#s do
+ local key = s[i]
+ if not omit or not omit[key] then
+ local value = h[key]
+ if type(value) == "boolean" then
+ if yes and no then
+ if value then
+ t[#t+1] = key .. '=' .. yes
+ elseif not strict then
+ t[#t+1] = key .. '=' .. no
+ end
+ elseif value or not strict then
+ t[#t+1] = key .. '=' .. tostring(value)
+ end
+ else
+ t[#t+1] = key .. '=' .. value
+ end
+ end
+ end
+ return concat(t,separator or ",")
+ else
+ return ""
+ end
+end
+
+function aux.array_to_string(a,separator)
+ if a then
+ return concat(a,separator or ",")
+ else
+ return ""
+ end
+end
+
+function aux.settings_to_set(str,t)
+ t = t or { }
+ for s in gmatch(str,"%s*([^,]+)") do
+ t[s] = true
+ end
+ return t
+end
+
+local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace
+local pattern = lpeg.Ct((space + value)^0)
+
+function aux.arguments_to_table(str)
+ return lpegmatch(pattern,str)
+end
+
+-- temporary here
+
+function aux.getparameters(self,class,parentclass,settings)
+ local sc = self[class]
+ if not sc then
+ sc = table.clone(self[parent])
+ self[class] = sc
+ end
+ aux.settings_to_hash(settings,sc)
+end
+
+-- temporary here
+
+local digit = lpeg.R("09")
+local period = lpeg.P(".")
+local zero = lpeg.P("0")
+local trailingzeros = zero^0 * -digit -- suggested by Roberto R
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = lpeg.Cs((number + 1)^0)
+
+--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
+--~ collectgarbage("collect")
+--~ str = string.rep(sample,10000)
+--~ local ts = os.clock()
+--~ lpegmatch(stripper,str)
+--~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
+
+lpeg.patterns.strip_zeros = stripper
+
+function aux.strip_zeros(str)
+ return lpegmatch(stripper,str)
+end
+
+function aux.definetable(target) -- defines undefined tables
+ local composed, t = nil, { }
+ for name in gmatch(target,"([^%.]+)") 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 gmatch(target,"([^%.]+)") do
+ t = t[name]
+ end
+ return t
+end
+
+--~ function string.commaseparated(str)
+--~ return gmatch(str,"([^,%s]+)")
+--~ end
+
+-- as we use this a lot ...
+
+--~ function aux.cachefunction(action,weak)
+--~ local cache = { }
+--~ if weak then
+--~ setmetatable(cache, { __mode = "kv" } )
+--~ end
+--~ local function reminder(str)
+--~ local found = cache[str]
+--~ if not found then
+--~ found = action(str)
+--~ cache[str] = found
+--~ end
+--~ return found
+--~ end
+--~ return reminder, cache
+--~ end
diff --git a/tex/context/base/l-boolean.lua b/tex/context/base/l-boolean.lua
new file mode 100644
index 000000000..be7ec7d57
--- /dev/null
+++ b/tex/context/base/l-boolean.lua
@@ -0,0 +1,55 @@
+if not modules then modules = { } end modules ['l-boolean'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+boolean = boolean or { }
+
+local type, tonumber = type, tonumber
+
+function boolean.tonumber(b)
+ if b then return 1 else return 0 end
+end
+
+function toboolean(str,tolerant)
+ if tolerant then
+ local tstr = type(str)
+ if tstr == "string" then
+ return str == "true" or str == "yes" or str == "on" or str == "1" or str == "t"
+ elseif tstr == "number" then
+ return tonumber(str) ~= 0
+ elseif tstr == "nil" then
+ return false
+ else
+ return str
+ end
+ elseif str == "true" then
+ return true
+ elseif str == "false" then
+ return false
+ else
+ return str
+ end
+end
+
+function string.is_boolean(str)
+ if type(str) == "string" then
+ if str == "true" or str == "yes" or str == "on" or str == "t" then
+ return true
+ elseif str == "false" or str == "no" or str == "off" or str == "f" then
+ return false
+ end
+ end
+ return nil
+end
+
+function boolean.alwaystrue()
+ return true
+end
+
+function boolean.falsetrue()
+ return false
+end
diff --git a/tex/context/base/l-dimen.lua b/tex/context/base/l-dimen.lua
new file mode 100644
index 000000000..da5ab143e
--- /dev/null
+++ b/tex/context/base/l-dimen.lua
@@ -0,0 +1,432 @@
+if not modules then modules = { } end modules ['l-dimen'] = {
+ version = 1.001,
+ comment = "support for dimensions",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Internally <l n='luatex'/> work with scaled point, which are
+represented by integers. However, in practice, at east at the
+<l n='tex'/> end we work with more generic units like points (pt). Going
+from scaled points (numbers) to one of those units can be
+done by using the conversion factors collected in the following
+table.</p>
+--ldx]]--
+
+local format, match, gsub, type, setmetatable = string.format, string.match, string.gsub, type, setmetatable
+local P, S, R, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.Cc, lpeg.match
+
+number = number or { }
+
+number.tonumberf = function(n) return match(format("%.20f",n),"(.-0?)0*$") end -- one zero too much but alas
+number.tonumberg = function(n) return format("%.20g",n) end
+
+local dimenfactors = {
+ ["pt"] = 1/65536,
+ ["in"] = ( 100/ 7227)/65536,
+ ["cm"] = ( 254/ 7227)/65536,
+ ["mm"] = ( 2540/ 7227)/65536,
+ ["sp"] = 1, -- 65536 sp in 1pt
+ ["bp"] = ( 7200/ 7227)/65536,
+ ["pc"] = ( 1/ 12)/65536,
+ ["dd"] = ( 1157/ 1238)/65536,
+ ["cc"] = ( 1157/14856)/65536,
+ ["nd"] = (20320/21681)/65536,
+ ["nc"] = ( 5080/65043)/65536
+}
+
+--~ print(table.serialize(dimenfactors))
+--~
+--~ %.99g:
+--~
+--~ t={
+--~ ["bp"]=1.5201782378580324e-005,
+--~ ["cc"]=1.1883696112892098e-006,
+--~ ["cm"]=5.3628510057769479e-007,
+--~ ["dd"]=1.4260435335470516e-005,
+--~ ["em"]=0.000152587890625,
+--~ ["ex"]=6.103515625e-005,
+--~ ["in"]=2.1113586636917117e-007,
+--~ ["mm"]=5.3628510057769473e-008,
+--~ ["nc"]=1.1917446679504327e-006,
+--~ ["nd"]=1.4300936015405194e-005,
+--~ ["pc"]=1.2715657552083333e-006,
+--~ ["pt"]=1.52587890625e-005,
+--~ ["sp"]=1,
+--~ }
+--~
+--~ patched %s and tonumber
+--~
+--~ t={
+--~ ["bp"]=0.00001520178238,
+--~ ["cc"]=0.00000118836961,
+--~ ["cm"]=0.0000005362851,
+--~ ["dd"]=0.00001426043534,
+--~ ["em"]=0.00015258789063,
+--~ ["ex"]=0.00006103515625,
+--~ ["in"]=0.00000021113587,
+--~ ["mm"]=0.00000005362851,
+--~ ["nc"]=0.00000119174467,
+--~ ["nd"]=0.00001430093602,
+--~ ["pc"]=0.00000127156576,
+--~ ["pt"]=0.00001525878906,
+--~ ["sp"]=1,
+--~ }
+
+--[[ldx--
+<p>A conversion function that takes a number, unit (string) and optional
+format (string) is implemented using this table.</p>
+--ldx]]--
+
+-- was:
+
+local function todimen(n,unit,fmt)
+ if type(n) == 'string' then
+ return n
+ else
+ unit = unit or 'pt'
+ return format(fmt or "%s%s",n*dimenfactors[unit],unit)
+ -- if fmt then
+ -- return format(fmt,n*dimenfactors[unit],unit)
+ -- else
+ -- return match(format("%.20f",n*dimenfactors[unit]),"(.-0?)0*$") .. unit
+ -- end
+ end
+end
+
+--[[ldx--
+<p>We collect a bunch of converters in the <type>number</type> namespace.</p>
+--ldx]]--
+
+number.maxdimen = 1073741823
+number.todimen = todimen
+number.dimenfactors = dimenfactors
+
+function number.topoints (n) return todimen(n,"pt") end
+function number.toinches (n) return todimen(n,"in") end
+function number.tocentimeters (n) return todimen(n,"cm") end
+function number.tomillimeters (n) return todimen(n,"mm") end
+function number.toscaledpoints(n) return todimen(n,"sp") end
+function number.toscaledpoints(n) return n .. "sp" end
+function number.tobasepoints (n) return todimen(n,"bp") end
+function number.topicas (n) return todimen(n "pc") end
+function number.todidots (n) return todimen(n,"dd") end
+function number.tociceros (n) return todimen(n,"cc") end
+function number.tonewdidots (n) return todimen(n,"nd") end
+function number.tonewciceros (n) return todimen(n,"nc") end
+
+--[[ldx--
+<p>More interesting it to implement a (sort of) dimen datatype, one
+that permits calculations too. First we define a function that
+converts a string to scaledpoints. We use <l n='lpeg'/>. We capture
+a number and optionally a unit. When no unit is given a constant
+capture takes place.</p>
+--ldx]]--
+
+local amount = (S("+-")^0 * R("09")^0 * P(".")^0 * R("09")^0) + Cc("0")
+local unit = R("az")^1
+
+local dimenpair = amount/tonumber * (unit^1/dimenfactors + Cc(1)) -- tonumber is new
+
+lpeg.patterns.dimenpair = dimenpair
+
+--[[ldx--
+<p>We use a metatable to intercept errors. When no key is found in
+the table with factors, the metatable will be consulted for an
+alternative index function.</p>
+--ldx]]--
+
+local mt = { } setmetatable(dimenfactors,mt)
+
+mt.__index = function(t,s)
+ -- error("wrong dimension: " .. (s or "?")) -- better a message
+ return false
+end
+
+function string:todimen()
+ if type(self) == "number" then
+ return self
+ else
+ local value, unit = lpegmatch(dimenpair,self)
+ return value/unit
+ end
+end
+
+local amount = S("+-")^0 * R("09")^0 * S(".,")^0 * R("09")^0
+local unit = P("pt") + P("cm") + P("mm") + P("sp") + P("bp") + P("in") +
+ P("pc") + P("dd") + P("cc") + P("nd") + P("nc")
+
+local validdimen = amount * unit
+
+lpeg.patterns.validdimen = pattern
+
+--[[ldx--
+<p>This converter accepts calls like:</p>
+
+<typing>
+string.todimen("10")
+string.todimen(".10")
+string.todimen("10.0")
+string.todimen("10.0pt")
+string.todimen("10pt")
+string.todimen("10.0pt")
+</typing>
+
+<p>And of course the often more efficient:</p>
+
+<typing>
+somestring:todimen("12.3cm")
+</typing>
+
+<p>With this in place, we can now implement a proper datatype for dimensions, one
+that permits us to do this:</p>
+
+<typing>
+s = dimen "10pt" + dimen "20pt" + dimen "200pt"
+ - dimen "100sp" / 10 + "20pt" + "0pt"
+</typing>
+
+<p>We create a local metatable for this new type:</p>
+--ldx]]--
+
+local dimensions = { }
+
+--[[ldx--
+<p>The main (and globally) visible representation of a dimen is defined next: it is
+a one-element table. The unit that is returned from the match is normally a number
+(one of the previously defined factors) but we also accept functions. Later we will
+see why.</p>
+--ldx]]--
+
+function dimen(a)
+ if a then
+ local ta= type(a)
+ if ta == "string" then
+ local value, unit = lpegmatch(pattern,a)
+ if type(unit) == "function" then
+ k = value/unit()
+ else
+ k = value/unit
+ end
+ a = k
+ elseif ta == "table" then
+ a = a[1]
+ end
+ return setmetatable({ a }, dimensions)
+ else
+ return setmetatable({ 0 }, dimensions)
+ end
+end
+
+--[[ldx--
+<p>This function return a small hash with a metatable attached. It is
+through this metatable that we can do the calculations. We could have
+shared some of the code but for reasons of speed we don't.</p>
+--ldx]]--
+
+function dimensions.__add(a, b)
+ local ta, tb = type(a), type(b)
+ if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ return setmetatable({ a + b }, dimensions)
+end
+
+function dimensions.__sub(a, b)
+ local ta, tb = type(a), type(b)
+ if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ return setmetatable({ a - b }, dimensions)
+end
+
+function dimensions.__mul(a, b)
+ local ta, tb = type(a), type(b)
+ if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ return setmetatable({ a * b }, dimensions)
+end
+
+function dimensions.__div(a, b)
+ local ta, tb = type(a), type(b)
+ if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ return setmetatable({ a / b }, dimensions)
+end
+
+function dimensions.__unm(a)
+ local ta = type(a)
+ if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
+ return setmetatable({ - a }, dimensions)
+end
+
+--[[ldx--
+<p>It makes no sense to implement the power and modulo function but
+the next two do make sense because they permits is code like:</p>
+
+<typing>
+local a, b = dimen "10pt", dimen "11pt"
+...
+if a > b then
+ ...
+end
+</typing>
+--ldx]]--
+
+-- makes no sense: dimensions.__pow and dimensions.__mod
+
+function dimensions.__lt(a, b)
+ return a[1] < b[1]
+end
+
+function dimensions.__eq(a, b)
+ return a[1] == b[1]
+end
+
+--[[ldx--
+<p>We also need to provide a function for conversion to string (so that
+we can print dimensions). We print them as points, just like <l n='tex'/>.</p>
+--ldx]]--
+
+function dimensions.__tostring(a)
+ return a[1]/65536 .. "pt" -- instead of todimen(a[1])
+end
+
+--[[ldx--
+<p>Since it does not take much code, we also provide a way to access
+a few accessors</p>
+
+<typing>
+print(dimen().pt)
+print(dimen().sp)
+</typing>
+--ldx]]--
+
+function dimensions.__index(tab,key)
+ local d = dimenfactors[key]
+ if not d then
+ error("illegal property of dimen: " .. key)
+ d = 1
+ end
+ return 1/d
+end
+
+--[[ldx--
+<p>In the converter from string to dimension we support functions as
+factors. This is because in <l n='tex'/> we have a few more units:
+<type>ex</type> and <type>em</type>. These are not constant factors but
+depend on the current font. They are not defined by default, but need
+an explicit function call. This is because at the moment that this code
+is loaded, the relevant tables that hold the functions needed may not
+yet be available.</p>
+--ldx]]--
+
+function dimensions.texify() -- todo: %
+ local fti, fc = fonts and fonts.ids and fonts.ids, font and font.current
+ if fti and fc then
+ dimenfactors["ex"] = function() return fti[fc()].ex_height end
+ dimenfactors["em"] = function() return fti[fc()].quad end
+ else
+ dimenfactors["ex"] = 1/65536* 4 -- 4pt
+ dimenfactors["em"] = 1/65536*10 -- 10pt
+ end
+end
+
+--[[ldx--
+<p>In order to set the defaults we call this function now. At some point
+the macro package needs to make sure the function is called again.</p>
+--ldx]]--
+
+dimensions.texify()
+
+--[[ldx--
+<p>The previous code is rather efficient (also thanks to <l n='lpeg'/>) but we
+can speed it up by caching converted dimensions. On my machine (2008) the following
+loop takes about 25.5 seconds.</p>
+
+<typing>
+for i=1,1000000 do
+ local s = dimen "10pt" + dimen "20pt" + dimen "200pt"
+ - dimen "100sp" / 10 + "20pt" + "0pt"
+end
+</typing>
+
+<p>When we cache converted strings this becomes 16.3 seconds. In order not
+to waste too much memory on it, we tag the values of the cache as being
+week which mean that the garbage collector will collect them in a next
+sweep. This means that in most cases the speed up is mostly affecting the
+current couple of calculations and as such the speed penalty is small.</p>
+
+<p>We redefine two previous defined functions that can benefit from
+this:</p>
+--ldx]]--
+
+local known = { } setmetatable(known, { __mode = "v" })
+
+function dimen(a)
+ if a then
+ local ta= type(a)
+ if ta == "string" then
+ local k = known[a]
+ if k then
+ a = k
+ else
+ local value, unit = lpegmatch(dimenpair,a)
+ if type(unit) == "function" then
+ k = value/unit()
+ else
+ k = value/unit
+ end
+ known[a] = k
+ a = k
+ end
+ elseif ta == "table" then
+ a = a[1]
+ end
+ return setmetatable({ a }, dimensions)
+ else
+ return setmetatable({ 0 }, dimensions)
+ end
+end
+
+function string:todimen()
+ if type(self) == "number" then
+ return self
+ else
+ local k = known[self]
+ if not k then
+ local value, unit = lpegmatch(dimenpair,self)
+ if value and unit then
+ k = value/unit
+ else
+ k = 0
+ end
+ -- print(self,value,unit)
+ known[self] = k
+ end
+ return k
+ end
+end
+
+function number.toscaled(d)
+ return format("0.5f",d/2^16)
+end
+
+--[[ldx--
+<p>In a similar fashion we can define a glue datatype. In that case we
+probably use a hash instead of a one-element table.</p>
+--ldx]]--
+
+--[[ldx--
+<p>Goodie:s</p>
+--ldx]]--
+
+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
new file mode 100644
index 000000000..2643f538b
--- /dev/null
+++ b/tex/context/base/l-dir.lua
@@ -0,0 +1,363 @@
+if not modules then modules = { } end modules ['l-dir'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- dir.expand_name will be merged with cleanpath and collapsepath
+
+local type = type
+local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
+local lpegmatch = lpeg.match
+
+dir = dir or { }
+
+-- handy
+
+function dir.current()
+ return (gsub(lfs.currentdir(),"\\","/"))
+end
+
+-- optimizing for no string.find (*) does not save time
+
+local attributes = lfs.attributes
+local walkdir = lfs.dir
+
+local function glob_pattern(path,patt,recurse,action)
+ local ok, scanner
+ if path == "/" then
+ ok, scanner = xpcall(function() return walkdir(path..".") end, function() end) -- kepler safe
+ else
+ ok, scanner = xpcall(function() return walkdir(path) end, function() end) -- kepler safe
+ end
+ if ok and type(scanner) == "function" then
+ if not find(path,"/$") then path = path .. '/' end
+ for name in scanner do
+ local full = path .. name
+ local mode = attributes(full,'mode')
+ if mode == 'file' then
+ if find(full,patt) then
+ action(full)
+ end
+ elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
+ glob_pattern(full,patt,recurse,action)
+ end
+ end
+ end
+end
+
+dir.glob_pattern = glob_pattern
+
+local function collect_pattern(path,patt,recurse,result)
+ local ok, scanner
+ result = result or { }
+ if path == "/" then
+ ok, scanner = xpcall(function() return walkdir(path..".") end, function() end) -- kepler safe
+ else
+ ok, scanner = xpcall(function() return walkdir(path) end, function() end) -- kepler safe
+ end
+ if ok and type(scanner) == "function" then
+ if not find(path,"/$") then path = path .. '/' end
+ for name in scanner do
+ local full = path .. name
+ local attr = attributes(full)
+ local mode = attr.mode
+ if mode == 'file' then
+ if find(full,patt) then
+ result[name] = attr
+ end
+ elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
+ attr.list = collect_pattern(full,patt,recurse)
+ result[name] = attr
+ end
+ end
+ end
+ return result
+end
+
+dir.collect_pattern = collect_pattern
+
+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 {
+ [1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3),
+ [2] = C(((1-S("*?/"))^0 * P("/"))^0),
+ [3] = C(P(1)^0)
+}
+
+local filter = Cs ( (
+ P("**") / ".*" +
+ P("*") / "[^/]*" +
+ P("?") / "[^/]" +
+ P(".") / "%%." +
+ P("+") / "%%+" +
+ P("-") / "%%-" +
+ P(1)
+)^0 )
+
+local function glob(str,t)
+ if type(t) == "function" then
+ if type(str) == "table" then
+ for s=1,#str do
+ glob(str[s],t)
+ end
+ elseif lfs.isfile(str) then
+ t(str)
+ else
+ local split = lpegmatch(pattern,str)
+ if split then
+ local root, path, base = split[1], split[2], split[3]
+ local recurse = find(base,"%*%*")
+ local start = root .. path
+ local result = lpegmatch(filter,start .. base)
+ glob_pattern(start,result,recurse,t)
+ end
+ end
+ else
+ if type(str) == "table" then
+ local t = t or { }
+ for s=1,#str do
+ glob(str[s],t)
+ end
+ return t
+ elseif lfs.isfile(str) then
+ local t = t or { }
+ t[#t+1] = str
+ return t
+ else
+ local split = lpegmatch(pattern,str)
+ if split then
+ local t = t or { }
+ local action = action or function(name) t[#t+1] = name end
+ local root, path, base = split[1], split[2], split[3]
+ local recurse = find(base,"%*%*")
+ local start = root .. path
+ local result = lpegmatch(filter,start .. base)
+ glob_pattern(start,result,recurse,action)
+ return t
+ else
+ return { }
+ end
+ end
+ end
+end
+
+dir.glob = glob
+
+--~ list = dir.glob("**/*.tif")
+--~ list = dir.glob("/**/*.tif")
+--~ list = dir.glob("./**/*.tif")
+--~ list = dir.glob("oeps/**/*.tif")
+--~ list = dir.glob("/oeps/**/*.tif")
+
+local function globfiles(path,recurse,func,files) -- func == pattern or function
+ if type(func) == "string" then
+ local s = func -- alas, we need this indirect way
+ func = function(name) return find(name,s) end
+ end
+ files = files or { }
+ for name in walkdir(path) do
+ if find(name,"^%.") then
+ --- skip
+ else
+ local mode = attributes(name,'mode')
+ if mode == "directory" then
+ if recurse then
+ globfiles(path .. "/" .. name,recurse,func,files)
+ end
+ elseif mode == "file" then
+ if func then
+ if func(name) then
+ files[#files+1] = path .. "/" .. name
+ end
+ else
+ files[#files+1] = path .. "/" .. name
+ end
+ end
+ end
+ end
+ return files
+end
+
+dir.globfiles = globfiles
+
+-- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex")
+-- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex")
+-- t = dir.glob("c:/data/develop/context/texmf/**/*.tex")
+-- t = dir.glob("f:/minimal/tex/**/*")
+-- print(dir.ls("f:/minimal/tex/**/*"))
+-- print(dir.ls("*.tex"))
+
+function dir.ls(pattern)
+ return table.concat(glob(pattern),"\n")
+end
+
+--~ mkdirs("temp")
+--~ mkdirs("a/b/c")
+--~ mkdirs(".","/a/b/c")
+--~ mkdirs("a","b","c")
+
+local make_indeed = true -- false
+
+if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
+
+ function dir.mkdirs(...)
+ local str, pth, t = "", "", { ... }
+ for i=1,#t do
+ local s = t[i]
+ if s ~= "" then
+ if str ~= "" then
+ str = str .. "/" .. s
+ else
+ str = s
+ end
+ end
+ end
+ local first, middle, last
+ local drive = false
+ first, middle, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ -- empty network path == local path
+ else
+ first, last = match(str,"^(//)/*(.-)$")
+ if first then
+ middle, last = match(str,"([^/]+)/+(.-)$")
+ if middle then
+ pth = "//" .. middle
+ else
+ pth = "//" .. last
+ last = ""
+ end
+ else
+ first, middle, last = match(str,"^([a-zA-Z]:)(/*)(.-)$")
+ if first then
+ pth, drive = first .. middle, true
+ else
+ middle, last = match(str,"^(/*)(.-)$")
+ if not middle then
+ last = str
+ end
+ end
+ end
+ end
+ for s in gmatch(last,"[^/]+") do
+ if pth == "" then
+ pth = s
+ elseif drive then
+ pth, drive = pth .. s, false
+ else
+ pth = pth .. "/" .. s
+ end
+ if make_indeed and not lfs.isdir(pth) then
+ lfs.mkdir(pth)
+ end
+ end
+ return pth, (lfs.isdir(pth) == true)
+ end
+
+--~ print(dir.mkdirs("","","a","c"))
+--~ print(dir.mkdirs("a"))
+--~ print(dir.mkdirs("a:"))
+--~ print(dir.mkdirs("a:/b/c"))
+--~ print(dir.mkdirs("a:b/c"))
+--~ print(dir.mkdirs("a:/bbb/c"))
+--~ print(dir.mkdirs("/a/b/c"))
+--~ print(dir.mkdirs("/aaa/b/c"))
+--~ print(dir.mkdirs("//a/b/c"))
+--~ print(dir.mkdirs("///a/b/c"))
+--~ print(dir.mkdirs("a/bbb//ccc/"))
+
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
+ local first, nothing, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ first = dir.current() .. "/"
+ end
+ if not first then
+ first, last = match(str,"^(//)/*(.*)$")
+ end
+ if not first then
+ first, last = match(str,"^([a-zA-Z]:)(.*)$")
+ if first and not find(last,"^/") then
+ local d = lfs.currentdir()
+ if lfs.chdir(first) then
+ first = dir.current()
+ end
+ lfs.chdir(d)
+ end
+ end
+ if not first then
+ first, last = dir.current(), str
+ end
+ last = gsub(last,"//","/")
+ last = gsub(last,"/%./","/")
+ last = gsub(last,"^/*","")
+ first = gsub(first,"/*$","")
+ if last == "" then
+ return first
+ else
+ return first .. "/" .. last
+ end
+ end
+
+else
+
+ function dir.mkdirs(...)
+ local str, pth, t = "", "", { ... }
+ for i=1,#t do
+ local s = t[i]
+ if s ~= "" then
+ if str ~= "" then
+ str = str .. "/" .. s
+ else
+ str = s
+ end
+ end
+ end
+ str = gsub(str,"/+","/")
+ if find(str,"^/") then
+ pth = "/"
+ for s in gmatch(str,"[^/]+") do
+ local first = (pth == "/")
+ if first then
+ pth = pth .. s
+ else
+ pth = pth .. "/" .. s
+ end
+ if make_indeed and not first and not lfs.isdir(pth) then
+ lfs.mkdir(pth)
+ end
+ end
+ else
+ pth = "."
+ for s in gmatch(str,"[^/]+") do
+ pth = pth .. "/" .. s
+ if make_indeed and not lfs.isdir(pth) then
+ lfs.mkdir(pth)
+ end
+ end
+ end
+ return pth, (lfs.isdir(pth) == true)
+ end
+
+--~ print(dir.mkdirs("","","a","c"))
+--~ print(dir.mkdirs("a"))
+--~ print(dir.mkdirs("/a/b/c"))
+--~ print(dir.mkdirs("/aaa/b/c"))
+--~ print(dir.mkdirs("//a/b/c"))
+--~ print(dir.mkdirs("///a/b/c"))
+--~ print(dir.mkdirs("a/bbb//ccc/"))
+
+ function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
+ if not find(str,"^/") then
+ str = lfs.currentdir() .. "/" .. str
+ end
+ str = gsub(str,"//","/")
+ str = gsub(str,"/%./","/")
+ return str
+ end
+
+end
+
+dir.makedirs = dir.mkdirs
diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua
new file mode 100644
index 000000000..2bfc07090
--- /dev/null
+++ b/tex/context/base/l-file.lua
@@ -0,0 +1,314 @@
+if not modules then modules = { } end modules ['l-file'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- needs a cleanup
+
+file = file or { }
+
+local concat = table.concat
+local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local lpegmatch = lpeg.match
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
+end
+
+function file.addsuffix(filename, suffix)
+ if not suffix or suffix == "" then
+ return filename
+ elseif not find(filename,"%.[%a%d]+$") then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+end
+
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
+
+function file.dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
+end
+
+function file.basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
+end
+
+function file.nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+end
+
+function file.extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
+end
+
+file.suffix = file.extname
+
+--~ function file.join(...)
+--~ local pth = concat({...},"/")
+--~ pth = gsub(pth,"\\","/")
+--~ local a, b = match(pth,"^(.*://)(.*)$")
+--~ if a and b then
+--~ return a .. gsub(b,"//+","/")
+--~ end
+--~ a, b = match(pth,"^(//)(.*)$")
+--~ if a and b then
+--~ return a .. gsub(b,"//+","/")
+--~ end
+--~ return (gsub(pth,"//+","/"))
+--~ end
+
+local trick_1 = char(1)
+local trick_2 = "^" .. trick_1 .. "/+"
+
+function file.join(...)
+ local lst = { ... }
+ local a, b = lst[1], lst[2]
+ if a == "" then
+ lst[1] = trick_1
+ elseif b and find(a,"^/+$") and find(b,"^/") then
+ lst[1] = ""
+ lst[2] = gsub(b,"^/+","")
+ end
+ local pth = concat(lst,"/")
+ pth = gsub(pth,"\\","/")
+ local a, b = match(pth,"^(.*://)(.*)$")
+ if a and b then
+ return a .. gsub(b,"//+","/")
+ end
+ a, b = match(pth,"^(//)(.*)$")
+ if a and b then
+ return a .. gsub(b,"//+","/")
+ end
+ pth = gsub(pth,trick_2,"")
+ return (gsub(pth,"//+","/"))
+end
+
+--~ print(file.join("//","/y"))
+--~ print(file.join("/","/y"))
+--~ print(file.join("","/y"))
+--~ print(file.join("/x/","/y"))
+--~ print(file.join("x/","/y"))
+--~ print(file.join("http://","/y"))
+--~ print(file.join("http://a","/y"))
+--~ print(file.join("http:///a","/y"))
+--~ print(file.join("//nas-1","/y"))
+
+function file.iswritable(name)
+ local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+ return a and sub(a.permissions,2,2) == "w"
+end
+
+function file.isreadable(name)
+ local a = lfs.attributes(name)
+ return a and sub(a.permissions,1,1) == "r"
+end
+
+file.is_readable = file.isreadable
+file.is_writable = file.iswritable
+
+-- todo: lpeg
+
+--~ function file.split_path(str)
+--~ local t = { }
+--~ str = gsub(str,"\\", "/")
+--~ str = gsub(str,"(%a):([;/])", "%1\001%2")
+--~ for name in gmatch(str,"([^;:]+)") do
+--~ if name ~= "" then
+--~ t[#t+1] = gsub(name,"\001",":")
+--~ end
+--~ end
+--~ return t
+--~ end
+
+local checkedsplit = string.checkedsplit
+
+function file.split_path(str,separator)
+ str = gsub(str,"\\","/")
+ return checkedsplit(str,separator or io.pathseparator)
+end
+
+function file.join_path(tab)
+ return concat(tab,io.pathseparator) -- can have trailing //
+end
+
+-- we can hash them weakly
+
+function file.collapse_path(str)
+ str = gsub(str,"\\","/")
+ if find(str,"/") then
+ str = gsub(str,"^%./",(gsub(lfs.currentdir(),"\\","/")) .. "/") -- ./xx in qualified
+ str = gsub(str,"/%./","/")
+ local n, m = 1, 1
+ while n > 0 or m > 0 do
+ str, n = gsub(str,"[^/%.]+/%.%.$","")
+ str, m = gsub(str,"[^/%.]+/%.%./","")
+ end
+ str = gsub(str,"([^/])/$","%1")
+ -- str = gsub(str,"^%./","") -- ./xx in qualified
+ str = gsub(str,"/%.$","")
+ end
+ if str == "" then str = "." end
+ return str
+end
+
+--~ print(file.collapse_path("/a"))
+--~ print(file.collapse_path("a/./b/.."))
+--~ print(file.collapse_path("a/aa/../b/bb"))
+--~ print(file.collapse_path("a/../.."))
+--~ print(file.collapse_path("a/.././././b/.."))
+--~ print(file.collapse_path("a/./././b/.."))
+--~ print(file.collapse_path("a/b/c/../.."))
+
+function file.robustname(str)
+ return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
+end
+
+file.readdata = io.loaddata
+file.savedata = io.savedata
+
+function file.copy(oldname,newname)
+ file.savedata(newname,io.loaddata(oldname))
+end
+
+-- lpeg variants, slightly faster, not always
+
+--~ local period = lpeg.P(".")
+--~ local slashes = lpeg.S("\\/")
+--~ local noperiod = 1-period
+--~ local noslashes = 1-slashes
+--~ local name = noperiod^1
+
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
+
+--~ function file.extname(name)
+--~ return lpegmatch(pattern,name) or ""
+--~ end
+
+--~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
+
+--~ function file.removesuffix(name)
+--~ return lpegmatch(pattern,name)
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
+
+--~ function file.basename(name)
+--~ return lpegmatch(pattern,name) or name
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
+
+--~ function file.dirname(name)
+--~ local p = lpegmatch(pattern,name)
+--~ if p then
+--~ return sub(name,1,p-2)
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+
+--~ function file.addsuffix(name, suffix)
+--~ local p = lpegmatch(pattern,name)
+--~ if p then
+--~ return name
+--~ else
+--~ return name .. "." .. suffix
+--~ end
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+
+--~ function file.replacesuffix(name,suffix)
+--~ local p = lpegmatch(pattern,name)
+--~ if p then
+--~ return sub(name,1,p-2) .. "." .. suffix
+--~ else
+--~ return name .. "." .. suffix
+--~ end
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
+
+--~ function file.nameonly(name)
+--~ local a, b = lpegmatch(pattern,name)
+--~ if b then
+--~ return sub(name,a,b-2)
+--~ elseif a then
+--~ return sub(name,a)
+--~ else
+--~ return name
+--~ end
+--~ end
+
+--~ local test = file.extname
+--~ local test = file.basename
+--~ local test = file.dirname
+--~ local test = file.addsuffix
+--~ local test = file.replacesuffix
+--~ local test = file.nameonly
+
+--~ print(1,test("./a/b/c/abd.def.xxx","!!!"))
+--~ print(2,test("./../b/c/abd.def.xxx","!!!"))
+--~ print(3,test("a/b/c/abd.def.xxx","!!!"))
+--~ print(4,test("a/b/c/def.xxx","!!!"))
+--~ print(5,test("a/b/c/def","!!!"))
+--~ print(6,test("def","!!!"))
+--~ print(7,test("def.xxx","!!!"))
+
+--~ local tim = os.clock() for i=1,250000 do local ext = test("abd.def.xxx","!!!") end print(os.clock()-tim)
+
+-- also rewrite previous
+
+local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
+local separator = lpeg.P("://")
+
+local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
+local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+
+-- ./name ../name /name c: :// name/name
+
+function file.is_qualified_path(filename)
+ return lpegmatch(qualified,filename) ~= nil
+end
+
+function file.is_rootbased_path(filename)
+ return lpegmatch(rootbased,filename) ~= nil
+end
+
+local slash = lpeg.S("\\/")
+local period = lpeg.P(".")
+local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
+local path = lpeg.C(((1-slash)^0 * slash)^0)
+local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
+local base = lpeg.C((1-suffix)^0)
+
+local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+
+function file.splitname(str) -- returns drive, path, base, suffix
+ return lpegmatch(pattern,str)
+end
+
+-- function test(t) for k, v in next, t do print(v, "=>", file.splitname(v)) end end
+--
+-- test { "c:", "c:/aa", "c:/aa/bb", "c:/aa/bb/cc", "c:/aa/bb/cc.dd", "c:/aa/bb/cc.dd.ee" }
+-- test { "c:", "c:aa", "c:aa/bb", "c:aa/bb/cc", "c:aa/bb/cc.dd", "c:aa/bb/cc.dd.ee" }
+-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
+-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
diff --git a/tex/context/base/l-io.lua b/tex/context/base/l-io.lua
new file mode 100644
index 000000000..66e279309
--- /dev/null
+++ b/tex/context/base/l-io.lua
@@ -0,0 +1,187 @@
+if not modules then modules = { } end modules ['l-io'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local byte, find, gsub = string.byte, string.find, string.gsub
+
+if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator = "\\", ";"
+else
+ io.fileseparator, io.pathseparator = "/" , ":"
+end
+
+function io.loaddata(filename,textmode)
+ local f = io.open(filename,(textmode and 'r') or 'rb')
+ if f then
+ -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
+ local data = f:read('*all')
+ -- garbagecollector.check(data)
+ f:close()
+ return data
+ else
+ return nil
+ end
+end
+
+function io.savedata(filename,data,joiner)
+ local f = io.open(filename,"wb")
+ if f then
+ if type(data) == "table" then
+ f:write(table.join(data,joiner or ""))
+ elseif type(data) == "function" then
+ data(f)
+ else
+ f:write(data or "")
+ end
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function io.exists(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return false
+ else
+ assert(f:close())
+ return true
+ end
+end
+
+function io.size(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return 0
+ else
+ local s = f:seek("end")
+ assert(f:close())
+ return s
+ end
+end
+
+function io.noflines(f)
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
+end
+
+local nextchar = {
+ [ 4] = function(f)
+ return f:read(1,1,1,1)
+ end,
+ [ 2] = function(f)
+ return f:read(1,1)
+ end,
+ [ 1] = function(f)
+ return f:read(1)
+ end,
+ [-2] = function(f)
+ local a, b = f:read(1,1)
+ return b, a
+ end,
+ [-4] = function(f)
+ local a, b, c, d = f:read(1,1,1,1)
+ return d, c, b, a
+ end
+}
+
+function io.characters(f,n)
+ if f then
+ return nextchar[n or 1], f
+ else
+ return nil, nil
+ end
+end
+
+local nextbyte = {
+ [4] = function(f)
+ local a, b, c, d = f:read(1,1,1,1)
+ if d then
+ return byte(a), byte(b), byte(c), byte(d)
+ else
+ return nil, nil, nil, nil
+ end
+ end,
+ [2] = function(f)
+ local a, b = f:read(1,1)
+ if b then
+ return byte(a), byte(b)
+ else
+ return nil, nil
+ end
+ end,
+ [1] = function (f)
+ local a = f:read(1)
+ if a then
+ return byte(a)
+ else
+ return nil
+ end
+ end,
+ [-2] = function (f)
+ local a, b = f:read(1,1)
+ if b then
+ return byte(b), byte(a)
+ else
+ return nil, nil
+ end
+ end,
+ [-4] = function(f)
+ local a, b, c, d = f:read(1,1,1,1)
+ if d then
+ return byte(d), byte(c), byte(b), byte(a)
+ else
+ return nil, nil, nil, nil
+ end
+ end
+}
+
+function io.bytes(f,n)
+ if f then
+ return nextbyte[n or 1], f
+ else
+ return nil, nil
+ end
+end
+
+function io.ask(question,default,options)
+ while true do
+ io.write(question)
+ if options then
+ io.write(string.format(" [%s]",table.concat(options,"|")))
+ end
+ if default then
+ io.write(string.format(" [%s]",default))
+ end
+ io.write(string.format(" "))
+ local answer = io.read()
+ answer = gsub(answer,"^%s*(.*)%s*$","%1")
+ if answer == "" and default then
+ return default
+ elseif not options then
+ return answer
+ else
+ for k=1,#options do
+ if options[k] == answer then
+ return answer
+ end
+ end
+ local pattern = "^" .. answer
+ for k=1,#options do
+ local v = options[k]
+ if find(v,pattern) then
+ return v
+ end
+ end
+ end
+ end
+end
diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua
new file mode 100644
index 000000000..b107a8e64
--- /dev/null
+++ b/tex/context/base/l-lpeg.lua
@@ -0,0 +1,165 @@
+if not modules then modules = { } end modules ['l-lpeg'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local lpeg = require("lpeg")
+
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
+
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
+local match = lpeg.match
+
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.octal = patterns.oct
+patterns.HEX = P("0x") * R("09","AF")^1
+patterns.hex = P("0x") * R("09","af")^1
+patterns.hexadecimal = P("0x") * R("09","AF","af")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+
+function lpeg.anywhere(pattern) --slightly adapted from website
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
+end
+
+function lpeg.splitter(pattern, action)
+ return (((1-P(pattern))^1)/action+1)^0
+end
+
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+local capture = Ct(content^0)
+
+function string:splitlines()
+ return match(capture,self)
+end
+
+patterns.textline = content
+
+--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
+--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
+--~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
+--~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
+
+local splitters_s, splitters_m = { }, { }
+
+local function splitat(separator,single)
+ local splitter = (single and splitters_s[separator]) or splitters_m[separator]
+ if not splitter then
+ separator = P(separator)
+ if single then
+ local other, any = C((1 - separator)^0), P(1)
+ splitter = other * (separator * C(any^0) + "") -- ?
+ splitters_s[separator] = splitter
+ else
+ local other = C((1 - separator)^0)
+ splitter = other * (separator * other)^0
+ splitters_m[separator] = splitter
+ end
+ end
+ return splitter
+end
+
+lpeg.splitat = splitat
+
+local cache = { }
+
+function lpeg.split(separator,str)
+ local c = cache[separator]
+ if not c then
+ c = Ct(splitat(separator))
+ cache[separator] = c
+ end
+ return match(c,str)
+end
+
+function string:split(separator)
+ local c = cache[separator]
+ if not c then
+ c = Ct(splitat(separator))
+ cache[separator] = c
+ end
+ return match(c,self)
+end
+
+lpeg.splitters = cache
+
+local cache = { }
+
+function lpeg.checkedsplit(separator,str)
+ local c = cache[separator]
+ if not c then
+ separator = P(separator)
+ local other = C((1 - separator)^0)
+ c = Ct(separator^0 * other * (separator^1 * other)^0)
+ cache[separator] = c
+ end
+ return match(c,str)
+end
+
+function string:checkedsplit(separator)
+ local c = cache[separator]
+ if not c then
+ separator = P(separator)
+ local other = C((1 - separator)^0)
+ c = Ct(separator^0 * other * (separator^1 * other)^0)
+ cache[separator] = c
+ end
+ return match(c,self)
+end
+
+--~ function lpeg.append(list,pp)
+--~ local p = pp
+--~ for l=1,#list do
+--~ if p then
+--~ p = p + P(list[l])
+--~ else
+--~ p = P(list[l])
+--~ end
+--~ end
+--~ return p
+--~ end
+
+--~ from roberto's site:
+
+local f1 = string.byte
+
+local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2 - 12416 end
+local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
+local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
+
+patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
diff --git a/tex/context/base/l-math.lua b/tex/context/base/l-math.lua
new file mode 100644
index 000000000..fc8db4721
--- /dev/null
+++ b/tex/context/base/l-math.lua
@@ -0,0 +1,41 @@
+if not modules then modules = { } end modules ['l-math'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local floor, sin, cos, tan = math.floor, math.sin, math.cos, math.tan
+
+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
+
+local pipi = 2*math.pi/360
+
+function math.sind(d)
+ return sin(d*pipi)
+end
+
+function math.cosd(d)
+ return cos(d*pipi)
+end
+
+function math.tand(d)
+ return tan(d*pipi)
+end
diff --git a/tex/context/base/l-md5.lua b/tex/context/base/l-md5.lua
new file mode 100644
index 000000000..27955ef9b
--- /dev/null
+++ b/tex/context/base/l-md5.lua
@@ -0,0 +1,72 @@
+if not modules then modules = { } end modules ['l-md5'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This also provides file checksums and checkers.
+
+local gsub, format, byte = string.gsub, string.format, string.byte
+
+local function convert(str,fmt)
+ return (gsub(md5.sum(str),".",function(chr) return format(fmt,byte(chr)) end))
+end
+
+if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
+if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
+if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
+
+--~ if not md5.HEX then
+--~ local function remap(chr) return format("%02X",byte(chr)) end
+--~ function md5.HEX(str) return (gsub(md5.sum(str),".",remap)) end
+--~ end
+--~ if not md5.hex then
+--~ local function remap(chr) return format("%02x",byte(chr)) end
+--~ function md5.hex(str) return (gsub(md5.sum(str),".",remap)) end
+--~ end
+--~ if not md5.dec then
+--~ local function remap(chr) return format("%03i",byte(chr)) end
+--~ function md5.dec(str) return (gsub(md5.sum(str),".",remap)) end
+--~ end
+
+file.needs_updating_threshold = 1
+
+function file.needs_updating(oldname,newname) -- size modification access change
+ local oldtime = lfs.attributes(oldname, modification)
+ local newtime = lfs.attributes(newname, modification)
+ if newtime >= oldtime then
+ return false
+ elseif oldtime - newtime < file.needs_updating_threshold then
+ return false
+ else
+ return true
+ end
+end
+
+function file.checksum(name)
+ if md5 then
+ local data = io.loaddata(name)
+ if data then
+ return md5.HEX(data)
+ end
+ end
+ return nil
+end
+
+function file.loadchecksum(name)
+ if md5 then
+ local data = io.loaddata(name .. ".md5")
+ return data and (gsub(data,"%s",""))
+ end
+ return nil
+end
+
+function file.savechecksum(name, checksum)
+ if not checksum then checksum = file.checksum(name) end
+ if checksum then
+ io.savedata(name .. ".md5",checksum)
+ return checksum
+ end
+ return nil
+end
diff --git a/tex/context/base/l-number.lua b/tex/context/base/l-number.lua
new file mode 100644
index 000000000..a1249f055
--- /dev/null
+++ b/tex/context/base/l-number.lua
@@ -0,0 +1,58 @@
+if not modules then modules = { } end modules ['l-number'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local tostring = tostring
+local format, floor, insert, match = string.format, math.floor, table.insert, string.match
+local lpegmatch = lpeg.match
+
+number = number or { }
+
+-- a,b,c,d,e,f = number.toset(100101)
+
+function number.toset(n)
+ return match(tostring(n),"(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)")
+end
+
+function number.toevenhex(n)
+ local s = format("%X",n)
+ if #s % 2 == 0 then
+ return s
+ else
+ return "0" .. s
+ end
+end
+
+-- the lpeg way is slower on 8 digits, but faster on 4 digits, some 7.5%
+-- on
+--
+-- for i=1,1000000 do
+-- local a,b,c,d,e,f,g,h = number.toset(12345678)
+-- local a,b,c,d = number.toset(1234)
+-- local a,b,c = number.toset(123)
+-- end
+--
+-- of course dedicated "(.)(.)(.)(.)" matches are even faster
+
+local one = lpeg.C(1-lpeg.S(''))^1
+
+function number.toset(n)
+ return lpegmatch(one,tostring(n))
+end
+
+function number.bits(n,zero)
+ local t, i = { }, (zero and 0) or 1
+ while n > 0 do
+ local m = n % 2
+ if m > 0 then
+ insert(t,1,i)
+ end
+ n = floor(n/2)
+ i = i + 1
+ end
+ return t
+end
diff --git a/tex/context/base/l-os.lua b/tex/context/base/l-os.lua
new file mode 100644
index 000000000..fba2cd317
--- /dev/null
+++ b/tex/context/base/l-os.lua
@@ -0,0 +1,301 @@
+if not modules then modules = { } end modules ['l-os'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- maybe build io.flush in os.execute
+
+local find, format, gsub = string.find, string.format, string.gsub
+local random, ceil = math.random, math.ceil
+
+local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
+
+function os.execute(...) ioflush() return execute(...) end
+function os.spawn (...) ioflush() return spawn (...) end
+function os.exec (...) ioflush() return exec (...) end
+
+function os.resultof(command)
+ ioflush() -- else messed up logging
+ local handle = io.popen(command,"r")
+ if not handle then
+ -- print("unknown command '".. command .. "' in os.resultof")
+ return ""
+ else
+ return handle:read("*all") or ""
+ end
+end
+
+--~ os.type : windows | unix (new, we already guessed os.platform)
+--~ os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
+--~ os.platform : extended os.name with architecture
+
+if not io.fileseparator then
+ if find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator, os.type = "\\", ";", os.type or "mswin"
+ else
+ io.fileseparator, io.pathseparator, os.type = "/" , ":", os.type or "unix"
+ end
+end
+
+os.type = os.type or (io.pathseparator == ";" and "windows") or "unix"
+os.name = os.name or (os.type == "windows" and "mswin" ) or "linux"
+
+if os.type == "windows" then
+ os.libsuffix, os.binsuffix = 'dll', 'exe'
+else
+ os.libsuffix, os.binsuffix = 'so', ''
+end
+
+function os.launch(str)
+ if os.type == "windows" then
+ os.execute("start " .. str) -- os.spawn ?
+ else
+ os.execute(str .. " &") -- os.spawn ?
+ end
+end
+
+if not os.times then
+ -- utime = user time
+ -- stime = system time
+ -- cutime = children user time
+ -- cstime = children system time
+ function os.times()
+ return {
+ utime = os.gettimeofday(), -- user
+ stime = 0, -- system
+ cutime = 0, -- children user
+ cstime = 0, -- children system
+ }
+ end
+end
+
+os.gettimeofday = os.gettimeofday or os.clock
+
+local startuptime = os.gettimeofday()
+
+function os.runtime()
+ return os.gettimeofday() - startuptime
+end
+
+--~ print(os.gettimeofday()-os.time())
+--~ os.sleep(1.234)
+--~ print (">>",os.runtime())
+--~ print(os.date("%H:%M:%S",os.gettimeofday()))
+--~ print(os.date("%H:%M:%S",os.time()))
+
+-- no need for function anymore as we have more clever code and helpers now
+-- this metatable trickery might as well disappear
+
+os.resolvers = os.resolvers or { }
+
+local resolvers = os.resolvers
+
+local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end } -- maybe nil
+local osix = osmt.__index
+
+osmt.__index = function(t,k)
+ return (resolvers[k] or osix)(t,k)
+end
+
+setmetatable(os,osmt)
+
+if not os.setenv then
+
+ -- we still store them but they won't be seen in
+ -- child processes although we might pass them some day
+ -- using command concatination
+
+ local env, getenv = { }, os.getenv
+
+ function os.setenv(k,v)
+ env[k] = v
+ end
+
+ function os.getenv(k)
+ return env[k] or getenv(k)
+ end
+
+end
+
+-- we can use HOSTTYPE on some platforms
+
+local name, platform = os.name or "linux", os.getenv("MTX_PLATFORM") or ""
+
+local function guess()
+ local architecture = os.resultof("uname -m") or ""
+ if architecture ~= "" then
+ return architecture
+ end
+ architecture = os.getenv("HOSTTYPE") or ""
+ if architecture ~= "" then
+ return architecture
+ end
+ return os.resultof("echo $HOSTTYPE") or ""
+end
+
+if platform ~= "" then
+
+ os.platform = platform
+
+elseif os.type == "windows" then
+
+ -- we could set the variable directly, no function needed here
+
+ function os.resolvers.platform(t,k)
+ local platform, architecture = "", os.getenv("PROCESSOR_ARCHITECTURE") or ""
+ if find(architecture,"AMD64") then
+ platform = "mswin-64"
+ else
+ platform = "mswin"
+ end
+ os.setenv("MTX_PLATFORM",platform)
+ os.platform = platform
+ return platform
+ end
+
+elseif name == "linux" then
+
+ function os.resolvers.platform(t,k)
+ -- we sometims have HOSTTYPE set so let's check that first
+ local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
+ if find(architecture,"x86_64") then
+ platform = "linux-64"
+ elseif find(architecture,"ppc") then
+ platform = "linux-ppc"
+ else
+ platform = "linux"
+ end
+ os.setenv("MTX_PLATFORM",platform)
+ os.platform = platform
+ return platform
+ end
+
+elseif name == "macosx" then
+
+ --[[
+ Identifying the architecture of OSX is quite a mess and this
+ is the best we can come up with. For some reason $HOSTTYPE is
+ a kind of pseudo environment variable, not known to the current
+ environment. And yes, uname cannot be trusted either, so there
+ is a change that you end up with a 32 bit run on a 64 bit system.
+ Also, some proper 64 bit intel macs are too cheap (low-end) and
+ therefore not permitted to run the 64 bit kernel.
+ ]]--
+
+ function os.resolvers.platform(t,k)
+ -- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
+ -- if architecture == "" then
+ -- architecture = os.resultof("echo $HOSTTYPE") or ""
+ -- end
+ local platform, architecture = "", os.resultof("echo $HOSTTYPE") or ""
+ if architecture == "" then
+ -- print("\nI have no clue what kind of OSX you're running so let's assume an 32 bit intel.\n")
+ platform = "osx-intel"
+ elseif find(architecture,"i386") then
+ platform = "osx-intel"
+ elseif find(architecture,"x86_64") then
+ platform = "osx-64"
+ else
+ platform = "osx-ppc"
+ end
+ os.setenv("MTX_PLATFORM",platform)
+ os.platform = platform
+ return platform
+ end
+
+elseif name == "sunos" then
+
+ function os.resolvers.platform(t,k)
+ local platform, architecture = "", os.resultof("uname -m") or ""
+ if find(architecture,"sparc") then
+ platform = "solaris-sparc"
+ else -- if architecture == 'i86pc'
+ platform = "solaris-intel"
+ end
+ os.setenv("MTX_PLATFORM",platform)
+ os.platform = platform
+ return platform
+ end
+
+elseif name == "freebsd" then
+
+ function os.resolvers.platform(t,k)
+ local platform, architecture = "", os.resultof("uname -m") or ""
+ if find(architecture,"amd64") then
+ platform = "freebsd-amd64"
+ else
+ platform = "freebsd"
+ end
+ os.setenv("MTX_PLATFORM",platform)
+ os.platform = platform
+ return platform
+ end
+
+elseif name == "kfreebsd" then
+
+ function os.resolvers.platform(t,k)
+ -- we sometims have HOSTTYPE set so let's check that first
+ local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
+ if find(architecture,"x86_64") then
+ platform = "kfreebsd-64"
+ else
+ platform = "kfreebsd-i386"
+ end
+ os.setenv("MTX_PLATFORM",platform)
+ os.platform = platform
+ return platform
+ end
+
+else
+
+ -- platform = "linux"
+ -- os.setenv("MTX_PLATFORM",platform)
+ -- os.platform = platform
+
+ function os.resolvers.platform(t,k)
+ local platform = "linux"
+ os.setenv("MTX_PLATFORM",platform)
+ os.platform = platform
+ return platform
+ end
+
+end
+
+-- beware, we set the randomseed
+
+-- from wikipedia: Version 4 UUIDs use a scheme relying only on random numbers. This algorithm sets the
+-- version number as well as two reserved bits. All other bits are set using a random or pseudorandom
+-- data source. Version 4 UUIDs have the form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx with hexadecimal
+-- digits x and hexadecimal digits 8, 9, A, or B for y. e.g. f47ac10b-58cc-4372-a567-0e02b2c3d479.
+--
+-- as we don't call this function too often there is not so much risk on repetition
+
+local t = { 8, 9, "a", "b" }
+
+function os.uuid()
+ return format("%04x%04x-4%03x-%s%03x-%04x-%04x%04x%04x",
+ random(0xFFFF),random(0xFFFF),
+ random(0x0FFF),
+ t[ceil(random(4))] or 8,random(0x0FFF),
+ random(0xFFFF),
+ random(0xFFFF),random(0xFFFF),random(0xFFFF)
+ )
+end
+
+local d
+
+function os.timezone(delta)
+ d = d or tonumber(tonumber(os.date("%H")-os.date("!%H")))
+ if delta then
+ if d > 0 then
+ return format("+%02i:00",d)
+ else
+ return format("-%02i:00",-d)
+ end
+ else
+ return 1
+ end
+end
diff --git a/tex/context/base/l-pdfview.lua b/tex/context/base/l-pdfview.lua
new file mode 100644
index 000000000..627477ee8
--- /dev/null
+++ b/tex/context/base/l-pdfview.lua
@@ -0,0 +1,95 @@
+if not modules then modules = { } end modules ['l-pdfview'] = {
+ version = 1.001,
+ comment = "companion to mtx-context.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, getenv = string.format, os.getenv
+
+pdfview = pdfview or { }
+
+local opencalls = {
+ ['default'] = "pdfopen --file", -- "pdfopen --back --file"
+ ['xpdf'] = "xpdfopen",
+}
+
+local closecalls= {
+ ['default'] = "pdfclose --file",
+ ['xpdf'] = nil,
+}
+
+local allcalls = {
+ ['default'] = "pdfclose --all",
+ ['xpdf'] = nil,
+}
+
+if os.type == "windows" then
+ opencalls['okular'] = 'start "test" "c:/program files/kde/bin/okular.exe" --unique' -- todo: get focus
+else
+ opencalls['okular'] = 'okular --unique'
+end
+
+pdfview.METHOD = "MTX_PDFVIEW_METHOD"
+pdfview.method = getenv(pdfview.METHOD) or 'default'
+pdfview.method = (opencalls[pdfview.method] and pdfview.method) or 'default'
+
+function pdfview.methods()
+ return table.concat(table.sortedkeys(opencalls), " ")
+end
+
+function pdfview.status()
+ return format("pdfview methods: %s, current method: %s, MTX_PDFVIEW_METHOD=%s",pdfview.methods(),pdfview.method,getenv(pdfview.METHOD) or "<unset>")
+end
+
+local openedfiles = { }
+
+local function fullname(name)
+ return file.addsuffix(name,"pdf")
+end
+
+function pdfview.open(...)
+ local opencall = opencalls[pdfview.method]
+ if opencall then
+ local t = { ... }
+ for i=1,#t do
+ local name = fullname(t[i])
+ if io.exists(name) then
+ os.execute(format('%s "%s" 2>&1', opencall, name))
+ openedfiles[name] = true
+ end
+ end
+ end
+end
+
+function pdfview.close(...)
+ local closecall = closecalls[pdfview.method]
+ if closecall then
+ local t = { ... }
+ for i=1,#t do
+ local name = fullname(t[i])
+ if openedfiles[name] then
+ os.execute(format('%s "%s" 2>&1', closecall, name))
+ openedfiles[name] = nil
+ else
+ pdfview.closeall()
+ break
+ end
+ end
+ end
+end
+
+function pdfview.closeall()
+ local allcall = allcalls[pdfview.method]
+ if allcall then
+ os.execute(format('%s 2>&1', allcall))
+ end
+ openedfiles = { }
+end
+
+--~ pdfview.open("t:/document/show-exa.pdf")
+--~ os.sleep(3)
+--~ pdfview.close("t:/document/show-exa.pdf")
+
+return pdfview
diff --git a/tex/context/base/l-set.lua b/tex/context/base/l-set.lua
new file mode 100644
index 000000000..f844d0b40
--- /dev/null
+++ b/tex/context/base/l-set.lua
@@ -0,0 +1,84 @@
+if not modules then modules = { } end modules ['l-set'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+set = set or { }
+
+local nums = { }
+local tabs = { }
+local concat = table.concat
+local next, type = next, type
+
+set.create = table.tohash
+
+function set.tonumber(t)
+ if next(t) then
+ local s = ""
+ -- we could save mem by sorting, but it slows down
+ for k, v in next, t do
+ if v then
+ -- why bother about the leading space
+ s = s .. " " .. k
+ end
+ end
+ local n = nums[s]
+ if not n then
+ n = #tabs + 1
+ tabs[n] = t
+ nums[s] = n
+ end
+ return n
+ else
+ return 0
+ end
+end
+
+function set.totable(n)
+ if n == 0 then
+ return { }
+ else
+ return tabs[n] or { }
+ end
+end
+
+function set.tolist(n)
+ if n == 0 or not tabs[n] then
+ return ""
+ else
+ local t = { }
+ for k, v in next, tabs[n] do
+ if v then
+ t[#t+1] = k
+ end
+ end
+ return concat(t," ")
+ end
+end
+
+function set.contains(n,s)
+ if type(n) == "table" then
+ return n[s]
+ elseif n == 0 then
+ return false
+ else
+ local t = tabs[n]
+ return t and t[s]
+ end
+end
+
+--~ local c = set.create{'aap','noot','mies'}
+--~ local s = set.tonumber(c)
+--~ local t = set.totable(s)
+--~ print(t['aap'])
+--~ local c = set.create{'zus','wim','jet'}
+--~ local s = set.tonumber(c)
+--~ local t = set.totable(s)
+--~ print(t['aap'])
+--~ print(t['jet'])
+--~ print(set.contains(t,'jet'))
+--~ print(set.contains(t,'aap'))
+
diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua
new file mode 100644
index 000000000..9856d5212
--- /dev/null
+++ b/tex/context/base/l-string.lua
@@ -0,0 +1,288 @@
+if not modules then modules = { } end modules ['l-string'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
+local lpegmatch = lpeg.match
+
+-- some functions may disappear as they are not used anywhere
+
+if not string.split then
+
+ -- this will be overloaded by a faster lpeg variant
+
+ function string:split(pattern)
+ if #self > 0 then
+ local t = { }
+ for s in gmatch(self..pattern,"(.-)"..pattern) do
+ t[#t+1] = s
+ end
+ return t
+ else
+ return { }
+ end
+ end
+
+end
+
+local chr_to_esc = {
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["^"] = "%^", ["$"] = "%$",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ ["{"] = "%{", ["}"] = "%}"
+}
+
+string.chr_to_esc = chr_to_esc
+
+function string:esc() -- variant 2
+ return (gsub(self,"(.)",chr_to_esc))
+end
+
+function string:unquote()
+ return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+end
+
+--~ function string:unquote()
+--~ if find(self,"^[\'\"]") then
+--~ return sub(self,2,-2)
+--~ else
+--~ return self
+--~ end
+--~ end
+
+function string:quote() -- we could use format("%q")
+ return format("%q",self)
+end
+
+function string:count(pattern) -- variant 3
+ local n = 0
+ for _ in gmatch(self,pattern) do
+ n = n + 1
+ end
+ return n
+end
+
+function string:limit(n,sentinel)
+ if #self > n then
+ sentinel = sentinel or " ..."
+ return sub(self,1,(n-#sentinel)) .. sentinel
+ else
+ return self
+ end
+end
+
+--~ function string:strip() -- the .- is quite efficient
+--~ -- return match(self,"^%s*(.-)%s*$") or ""
+--~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
+--~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
+--~ end
+
+do -- roberto's variant:
+ local space = lpeg.S(" \t\v\n")
+ local nospace = 1 - space
+ local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
+ function string.strip(str)
+ return lpegmatch(stripper,str) or ""
+ end
+end
+
+function string:is_empty()
+ return not find(self,"%S")
+end
+
+function string:enhance(pattern,action)
+ local ok, n = true, 0
+ while ok do
+ ok = false
+ self = gsub(self,pattern, function(...)
+ ok, n = true, n + 1
+ return action(...)
+ end)
+ end
+ return self, n
+end
+
+local chr_to_hex, hex_to_chr = { }, { }
+
+for i=0,255 do
+ local c, h = char(i), format("%02X",i)
+ chr_to_hex[c], hex_to_chr[h] = h, c
+end
+
+function string:to_hex()
+ return (gsub(self or "","(.)",chr_to_hex))
+end
+
+function string:from_hex()
+ return (gsub(self or "","(..)",hex_to_chr))
+end
+
+if not string.characters then
+
+ local function nextchar(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, sub(str,index,index)
+ end
+ function string:characters()
+ return nextchar, self, 0
+ end
+ local function nextbyte(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, byte(sub(str,index,index))
+ end
+ function string:bytes()
+ return nextbyte, self, 0
+ end
+
+end
+
+-- we can use format for this (neg n)
+
+function string:rpadd(n,chr)
+ local m = n-#self
+ if m > 0 then
+ return self .. rep(chr or " ",m)
+ else
+ return self
+ end
+end
+
+function string:lpadd(n,chr)
+ local m = n-#self
+ if m > 0 then
+ return rep(chr or " ",m) .. self
+ else
+ return self
+ end
+end
+
+string.padd = string.rpadd
+
+function is_number(str) -- tonumber
+ return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+end
+
+--~ print(is_number("1"))
+--~ print(is_number("1.1"))
+--~ print(is_number(".1"))
+--~ print(is_number("-0.1"))
+--~ print(is_number("+0.1"))
+--~ print(is_number("-.1"))
+--~ print(is_number("+.1"))
+
+function string:split_settings() -- no {} handling, see l-aux for lpeg variant
+ if find(self,"=") then
+ local t = { }
+ for k,v in gmatch(self,"(%a+)=([^%,]*)") do
+ t[k] = v
+ end
+ return t
+ else
+ return nil
+ end
+end
+
+local patterns_escapes = {
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["+"] = "%+",
+ ["*"] = "%*",
+ ["%"] = "%%",
+ ["("] = "%)",
+ [")"] = "%)",
+ ["["] = "%[",
+ ["]"] = "%]",
+}
+
+function string:pattesc()
+ return (gsub(self,".",patterns_escapes))
+end
+
+local simple_escapes = {
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+function string:simpleesc()
+ return (gsub(self,".",simple_escapes))
+end
+
+function string:tohash()
+ local t = { }
+ for s in gmatch(self,"([^, ]+)") do -- lpeg
+ t[s] = true
+ end
+ return t
+end
+
+local pattern = lpeg.Ct(lpeg.C(1)^0)
+
+function string:totable()
+ return lpegmatch(pattern,self)
+end
+
+--~ local t = {
+--~ "1234567123456712345671234567",
+--~ "a\tb\tc",
+--~ "aa\tbb\tcc",
+--~ "aaa\tbbb\tccc",
+--~ "aaaa\tbbbb\tcccc",
+--~ "aaaaa\tbbbbb\tccccc",
+--~ "aaaaaa\tbbbbbb\tcccccc",
+--~ }
+--~ for k,v do
+--~ print(string.tabtospace(t[k]))
+--~ end
+
+function string.tabtospace(str,tab)
+ -- we don't handle embedded newlines
+ while true do
+ local s = find(str,"\t")
+ if s then
+ if not tab then tab = 7 end -- only when found
+ local d = tab-(s-1) % tab
+ if d > 0 then
+ str = gsub(str,"\t",rep(" ",d),1)
+ else
+ str = gsub(str,"\t","",1)
+ end
+ else
+ break
+ end
+ end
+ return str
+end
+
+function string:compactlong() -- strips newlines and leading spaces
+ self = gsub(self,"[\n\r]+ *","")
+ self = gsub(self,"^ *","")
+ return self
+end
+
+function string:striplong() -- strips newlines and leading spaces
+ self = gsub(self,"^%s*","")
+ self = gsub(self,"[\n\r]+ *","\n")
+ return self
+end
+
+function string:topattern(lowercase,strict)
+ if lowercase then
+ self = lower(self)
+ end
+ self = gsub(self,".",simple_escapes)
+ if self == "" then
+ self = ".*"
+ elseif strict then
+ self = "^" .. self .. "$"
+ end
+ return self
+end
diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua
new file mode 100644
index 000000000..ee395d0f1
--- /dev/null
+++ b/tex/context/base/l-table.lua
@@ -0,0 +1,910 @@
+if not modules then modules = { } end modules ['l-table'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+table.join = table.concat
+
+local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
+local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
+local getmetatable, setmetatable = getmetatable, setmetatable
+local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
+
+-- Starting with version 5.2 Lua no longer provide ipairs, which makes
+-- sense. As we already used the for loop and # in most places the
+-- impact on ConTeXt was not that large; the remaining ipairs already
+-- have been replaced. In a similar fashio we also hardly used pairs.
+--
+-- Just in case, we provide the fallbacks as discussed in Programming
+-- in Lua (http://www.lua.org/pil/7.3.html):
+
+if not ipairs then
+
+ -- for k, v in ipairs(t) do ... end
+ -- for k=1,#t do local v = t[k] ... end
+
+ local function iterate(a,i)
+ i = i + 1
+ local v = a[i]
+ if v ~= nil then
+ return i, v --, nil
+ end
+ end
+
+ function ipairs(a)
+ return iterate, a, 0
+ end
+
+end
+
+if not pairs then
+
+ -- for k, v in pairs(t) do ... end
+ -- for k, v in next, t do ... end
+
+ function pairs(t)
+ return next, t -- , nil
+ end
+
+end
+
+-- Also, unpack has been moved to the table table, and for compatiility
+-- reasons we provide both now.
+
+if not table.unpack then
+ table.unpack = _G.unpack
+elseif not unpack then
+ _G.unpack = table.unpack
+end
+
+-- extra functions, some might go (when not used)
+
+function table.strip(tab)
+ local lst = { }
+ for i=1,#tab do
+ local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
+ if s == "" then
+ -- skip this one
+ else
+ lst[#lst+1] = s
+ end
+ end
+ return lst
+end
+
+function table.keys(t)
+ local k = { }
+ for key, _ in next, t do
+ k[#k+1] = key
+ end
+ return k
+end
+
+local function compare(a,b)
+ return (tostring(a) < tostring(b))
+end
+
+local function sortedkeys(tab)
+ local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ for key,_ in next, tab do
+ srt[#srt+1] = key
+ if kind == 3 then
+ -- no further check
+ else
+ local tkey = type(key)
+ if tkey == "string" then
+ -- if kind == 2 then kind = 3 else kind = 1 end
+ kind = (kind == 2 and 3) or 1
+ elseif tkey == "number" then
+ -- if kind == 1 then kind = 3 else kind = 2 end
+ kind = (kind == 1 and 3) or 2
+ else
+ kind = 3
+ end
+ end
+ end
+ if kind == 0 or kind == 3 then
+ sort(srt,compare)
+ else
+ sort(srt)
+ end
+ return srt
+end
+
+local function sortedhashkeys(tab) -- fast one
+ local srt = { }
+ for key,_ in next, tab do
+ srt[#srt+1] = key
+ end
+ sort(srt)
+ return srt
+end
+
+table.sortedkeys = sortedkeys
+table.sortedhashkeys = sortedhashkeys
+
+function table.sortedhash(t)
+ local s = sortedhashkeys(t) -- maybe just sortedkeys
+ local n = 0
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+end
+
+table.sortedpairs = table.sortedhash
+
+function table.append(t, list)
+ for _,v in next, list do
+ insert(t,v)
+ end
+end
+
+function table.prepend(t, list)
+ for k,v in next, list do
+ insert(t,k,v)
+ end
+end
+
+function table.merge(t, ...) -- first one is target
+ t = t or {}
+ local lst = {...}
+ for i=1,#lst do
+ for k, v in next, lst[i] do
+ t[k] = v
+ end
+ end
+ return t
+end
+
+function table.merged(...)
+ local tmp, lst = { }, {...}
+ for i=1,#lst do
+ for k, v in next, lst[i] do
+ tmp[k] = v
+ end
+ end
+ return tmp
+end
+
+function table.imerge(t, ...)
+ local lst = {...}
+ for i=1,#lst do
+ local nst = lst[i]
+ for j=1,#nst do
+ t[#t+1] = nst[j]
+ end
+ end
+ return t
+end
+
+function table.imerged(...)
+ local tmp, lst = { }, {...}
+ for i=1,#lst do
+ local nst = lst[i]
+ for j=1,#nst do
+ tmp[#tmp+1] = nst[j]
+ end
+ end
+ return tmp
+end
+
+local function fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in next, old do
+ if type(v) == "table" then
+ new[k] = fastcopy(v) -- was just table.copy
+ else
+ new[k] = v
+ end
+ end
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
+ return new
+ else
+ return { }
+ end
+end
+
+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 next, 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]
+ else
+ tcopy[i] = copy(v, tables)
+ end
+ end
+ local mt = getmetatable(t)
+ if mt then
+ setmetatable(tcopy,mt)
+ end
+ return tcopy
+end
+
+table.fastcopy = fastcopy
+table.copy = copy
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
+end
+
+function table.replace(a,b)
+ for k,v in next, b do
+ a[k] = v
+ end
+end
+
+-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
+
+function table.is_empty(t) -- obolete, use inline code instead
+ return not t or not next(t)
+end
+
+function table.one_entry(t) -- obolete, use inline code instead
+ local n = next(t)
+ return n and not next(t,n)
+end
+
+--~ function table.starts_at(t) -- obsolete, not nice anyway
+--~ return ipairs(t,1)(t,0)
+--~ end
+
+function table.tohash(t,value)
+ local h = { }
+ if t then
+ if value == nil then value = true end
+ for _, v in next, t do -- no ipairs here
+ h[v] = value
+ end
+ end
+ return h
+end
+
+function table.fromhash(t)
+ local h = { }
+ for k, v in next, 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")
+--~ print(table.serialize(t,false), "\n")
+--~ print(table.serialize(t,true), "\n")
+--~ print(table.serialize(t,"name",true), "\n")
+--~ print(table.serialize(t,"name",true,true), "\n")
+
+table.serialize_functions = true
+table.serialize_compact = true
+table.serialize_inline = true
+
+local noquotes, hexify, handle, reduce, compact, inline, functions
+
+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 simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in next, 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] = format("0x%04X",v)
+ else
+ tt[#tt+1] = tostring(v) -- tostring not needed
+ end
+ elseif tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = format("%q",v)
+ else
+ tt = nil
+ break
+ end
+ end
+ return tt
+ end
+ end
+ return nil
+end
+
+-- Because this is a core function of mkiv I moved some function calls
+-- inline.
+--
+-- twice as fast in a test:
+--
+-- local propername = lpeg.P(lpeg.R("AZ","az","__") * lpeg.R("09","AZ","az", "__")^0 * lpeg.P(-1) )
+
+-- problem: there no good number_to_string converter with the best resolution
+
+local function do_serialize(root,name,depth,level,indexed)
+ if level > 0 then
+ depth = depth .. " "
+ if indexed then
+ handle(format("%s{",depth))
+ elseif name then
+ --~ handle(format("%s%s={",depth,key(name)))
+ if type(name) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s[0x%04X]={",depth,name))
+ else
+ handle(format("%s[%s]={",depth,name))
+ end
+ elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ else
+ handle(format("%s{",depth))
+ end
+ end
+ -- we could check for k (index) being number (cardinal)
+ if root and next(root) then
+ local first, last = nil, 0 -- #root cannot be trusted here (will be ok in 5.2 when ipairs is gone)
+ if compact then
+ -- NOT: for k=1,#root do (we need to quit at nil)
+ for k,v in ipairs(root) do -- can we use next?
+ if not first then first = k end
+ last = last + 1
+ end
+ 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(format("%s 0x%04X,",depth,v))
+ else
+ handle(format("%s %s,",depth,v)) -- %.99g
+ end
+ elseif t == "string" then
+ if reduce and tonumber(v) then
+ handle(format("%s %s,",depth,v))
+ else
+ handle(format("%s %q,",depth,v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(format("%s {},",depth))
+ elseif inline then -- and #t > 0
+ local st = simple_table(v)
+ if st then
+ handle(format("%s { %s },",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(format("%s %s,",depth,tostring(v)))
+ elseif t == "function" then
+ if functions then
+ handle(format('%s loadstring(%q),',depth,dump(v)))
+ else
+ handle(format('%s "function",',depth))
+ end
+ else
+ handle(format("%s %q,",depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(format("%s __p__=nil,",depth))
+ end
+ elseif t == "number" then
+ --~ if hexify then
+ --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
+ --~ else
+ --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
+ --~ end
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ else
+ handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ if hexify then
+ handle(format("%s %s=0x%04X,",depth,k,v))
+ else
+ handle(format("%s %s=%s,",depth,k,v)) -- %.99g
+ end
+ else
+ if hexify then
+ handle(format("%s [%q]=0x%04X,",depth,k,v))
+ else
+ handle(format("%s [%q]=%s,",depth,k,v)) -- %.99g
+ end
+ end
+ elseif t == "string" then
+ if reduce and tonumber(v) then
+ --~ handle(format("%s %s=%s,",depth,key(k),v))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%s,",depth,k,v))
+ else
+ handle(format("%s [%s]=%s,",depth,k,v))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%s,",depth,k,v))
+ else
+ handle(format("%s [%q]=%s,",depth,k,v))
+ end
+ else
+ --~ handle(format("%s %s=%q,",depth,key(k),v))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%q,",depth,k,v))
+ else
+ handle(format("%s [%s]=%q,",depth,k,v))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%q,",depth,k,v))
+ else
+ handle(format("%s [%q]=%q,",depth,k,v))
+ end
+ end
+ elseif t == "table" then
+ if not next(v) then
+ --~ handle(format("%s %s={},",depth,key(k)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]={},",depth,k))
+ else
+ handle(format("%s [%s]={},",depth,k))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s={},",depth,k))
+ else
+ handle(format("%s [%q]={},",depth,k))
+ end
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ else
+ handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
+ else
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
+ end
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ elseif t == "boolean" then
+ --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%s]=%s,",depth,k,tostring(v)))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%s,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%q]=%s,",depth,k,tostring(v)))
+ end
+ elseif t == "function" then
+ if functions then
+ --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
+ else
+ handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
+ else
+ handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ end
+ end
+ else
+ --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%s]=%q,",depth,k,tostring(v)))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%q,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
+ end
+ end
+ --~ end
+ end
+ end
+ if level > 0 then
+ handle(format("%s},",depth))
+ end
+end
+
+-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
+-- faster (0.03 on 1.00 for zapfino.tma)
+
+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
+ 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
+
+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()
+ end
+end
+
+local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
+ 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.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+end
+
+table.flatten_one_level = table.unnest
+
+-- a better one:
+
+local function flattened(t,f)
+ if not f then
+ f = { }
+ end
+ for k, v in next, t do
+ if type(v) == "table" then
+ flattened(v,f)
+ else
+ f[k] = v
+ end
+ end
+ return f
+end
+
+table.flattened = flattened
+
+-- 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)
+ 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
+end
+
+function table.insert_after_value(t,value,str)
+ 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
+end
+
+local function are_equal(a,b,n,m) -- indexed
+ if a and b and #a == #b then
+ n = n or 1
+ m = m or #a
+ for i=n,m do
+ local ai, bi = a[i], b[i]
+ if ai==bi then
+ -- same
+ elseif type(ai)=="table" and type(bi)=="table" then
+ if not are_equal(ai,bi) then
+ return false
+ end
+ else
+ return false
+ end
+ end
+ return true
+ else
+ return false
+ end
+end
+
+local function identical(a,b) -- assumes same structure
+ for ka, va in next, a do
+ local vb = b[k]
+ if va == vb then
+ -- same
+ elseif type(va) == "table" and type(vb) == "table" then
+ if not identical(va,vb) then
+ return false
+ end
+ else
+ return false
+ end
+ end
+ return true
+end
+
+table.are_equal = are_equal
+table.identical = identical
+
+-- maybe also make a combined one
+
+function table.compact(t)
+ if t then
+ for k,v in next, t do
+ if not next(v) then
+ t[k] = nil
+ end
+ end
+ end
+end
+
+function table.contains(t, v)
+ if t then
+ for i=1, #t do
+ if t[i] == v then
+ return i
+ end
+ end
+ end
+ return false
+end
+
+function table.count(t)
+ local n, e = 0, next(t)
+ while e do
+ n, e = n + 1, next(t,e)
+ end
+ return n
+end
+
+function table.swapped(t)
+ local s = { }
+ for k, v in next, t do
+ s[v] = k
+ end
+ return s
+end
+
+--~ function table.are_equal(a,b)
+--~ return table.serialize(a) == table.serialize(b)
+--~ end
+
+function table.clone(t,p) -- t is optional or nil or table
+ if not p then
+ t, p = { }, t or { }
+ elseif not t then
+ t = { }
+ end
+ setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
+ return t
+end
+
+function table.hexed(t,seperator)
+ local tt = { }
+ for i=1,#t do tt[i] = format("0x%04X",t[i]) end
+ return concat(tt,seperator or " ")
+end
+
+function table.reverse_hash(h)
+ local r = { }
+ for k,v in next, h do
+ r[v] = lower(gsub(k," ",""))
+ end
+ return r
+end
+
+function table.reverse(t)
+ local tt = { }
+ if #t > 0 then
+ for i=#t,1,-1 do
+ tt[#tt+1] = t[i]
+ end
+ end
+ return tt
+end
+
+function table.insert_before_value(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,extra)
+ return
+ end
+ end
+ insert(t,1,extra)
+end
+
+function table.insert_after_value(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,extra)
+ return
+ end
+ end
+ insert(t,#t+1,extra)
+end
+
diff --git a/tex/context/base/l-unicode.lua b/tex/context/base/l-unicode.lua
new file mode 100644
index 000000000..0c5a60142
--- /dev/null
+++ b/tex/context/base/l-unicode.lua
@@ -0,0 +1,199 @@
+if not modules then modules = { } end modules ['l-unicode'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if not unicode then
+
+ unicode = { utf8 = { } }
+
+ local floor, char = math.floor, string.char
+
+ function unicode.utf8.utfchar(n)
+ if n < 0x80 then
+ return char(n)
+ elseif n < 0x800 then
+ return char(0xC0 + floor(n/0x40)) .. char(0x80 + (n % 0x40))
+ elseif n < 0x10000 then
+ return char(0xE0 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
+ elseif n < 0x40000 then
+ return char(0xF0 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
+ else -- wrong:
+ -- return char(0xF1 + floor(n/0x1000000)) .. char(0x80 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
+ return "?"
+ end
+ end
+
+end
+
+utf = utf or unicode.utf8
+
+local concat, utfchar, utfgsub = table.concat, utf.char, utf.gsub
+local char, byte, find, bytepairs = string.char, string.byte, string.find, string.bytepairs
+
+-- 0 EF BB BF UTF-8
+-- 1 FF FE UTF-16-little-endian
+-- 2 FE FF UTF-16-big-endian
+-- 3 FF FE 00 00 UTF-32-little-endian
+-- 4 00 00 FE FF UTF-32-big-endian
+
+unicode.utfname = {
+ [0] = 'utf-8',
+ [1] = 'utf-16-le',
+ [2] = 'utf-16-be',
+ [3] = 'utf-32-le',
+ [4] = 'utf-32-be'
+}
+
+-- \000 fails in <= 5.0 but is valid in >=5.1 where %z is depricated
+
+function unicode.utftype(f)
+ local str = f:read(4)
+ if not str then
+ f:seek('set')
+ return 0
+ -- elseif find(str,"^%z%z\254\255") then -- depricated
+ -- elseif find(str,"^\000\000\254\255") then -- not permitted and bugged
+ elseif find(str,"\000\000\254\255",1,true) then -- seems to work okay (TH)
+ return 4
+ -- elseif find(str,"^\255\254%z%z") then -- depricated
+ -- elseif find(str,"^\255\254\000\000") then -- not permitted and bugged
+ elseif find(str,"\255\254\000\000",1,true) then -- seems to work okay (TH)
+ return 3
+ elseif find(str,"^\254\255") then
+ f:seek('set',2)
+ return 2
+ elseif find(str,"^\255\254") then
+ f:seek('set',2)
+ return 1
+ elseif find(str,"^\239\187\191") then
+ f:seek('set',3)
+ return 0
+ else
+ f:seek('set')
+ return 0
+ end
+end
+
+function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
+ 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] = concat(tmp)
+ tmp = { }
+ p = 0
+ end
+ elseif n == 13 then
+ result[#result+1] = concat(tmp)
+ tmp = { }
+ p = n
+ else
+ tmp[#tmp+1] = utfchar(n)
+ p = 0
+ end
+ end
+ for l,r in bytepairs(str) do
+ if r then
+ if endian then
+ n = l*256 + r
+ else
+ n = r*256 + l
+ end
+ if m > 0 then
+ n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000
+ m = 0
+ doit()
+ elseif n >= 0xD800 and n <= 0xDBFF then
+ m = n
+ else
+ doit()
+ end
+ end
+ end
+ if #tmp > 0 then
+ result[#result+1] = concat(tmp)
+ end
+ return result
+end
+
+function unicode.utf32_to_utf8(str, endian)
+ local result = { }
+ 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] = concat(tmp)
+ tmp = { }
+ p = 0
+ end
+ elseif n == 13 then
+ result[#result+1] = concat(tmp)
+ tmp = { }
+ p = n
+ else
+ tmp[#tmp+1] = utfchar(n)
+ p = 0
+ end
+ end
+ for a,b in bytepairs(str) do
+ if a and b then
+ if m < 0 then
+ if endian then
+ m = a*256*256*256 + b*256*256
+ else
+ m = b*256 + a
+ end
+ else
+ if endian then
+ n = m + a*256 + b
+ else
+ n = m + b*256*256*256 + a*256*256
+ end
+ m = -1
+ doit()
+ end
+ else
+ break
+ end
+ end
+ if #tmp > 0 then
+ result[#result+1] = concat(tmp)
+ end
+ return result
+end
+
+local function little(c)
+ local b = byte(c) -- b = c:byte()
+ if b < 0x10000 then
+ return char(b%256,b/256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1%256,b1/256,b2%256,b2/256)
+ end
+end
+
+local function big(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b/256,b%256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1/256,b1%256,b2/256,b2%256)
+ end
+end
+
+function unicode.utf8_to_utf16(str,littleendian)
+ if littleendian then
+ return char(255,254) .. utfgsub(str,".",little)
+ else
+ return char(254,255) .. utfgsub(str,".",big)
+ end
+end
diff --git a/tex/context/base/l-url.lua b/tex/context/base/l-url.lua
new file mode 100644
index 000000000..e3e6f8130
--- /dev/null
+++ b/tex/context/base/l-url.lua
@@ -0,0 +1,134 @@
+if not modules then modules = { } end modules ['l-url'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local char, gmatch, gsub = string.char, string.gmatch, string.gsub
+local tonumber, type = tonumber, type
+local lpegmatch = lpeg.match
+
+-- from the spec (on the web):
+--
+-- foo://example.com:8042/over/there?name=ferret#nose
+-- \_/ \______________/\_________/ \_________/ \__/
+-- | | | | |
+-- scheme authority path query fragment
+-- | _____________________|__
+-- / \ / \
+-- urn:example:animal:ferret:nose
+
+url = url or { }
+
+local function tochar(s)
+ return char(tonumber(s,16))
+end
+
+local colon, qmark, hash, slash, percent, endofstring = lpeg.P(":"), lpeg.P("?"), lpeg.P("#"), lpeg.P("/"), lpeg.P("%"), lpeg.P(-1)
+
+local hexdigit = lpeg.R("09","AF","af")
+local plus = lpeg.P("+")
+local escaped = (plus / " ") + (percent * lpeg.C(hexdigit * hexdigit) / tochar)
+
+-- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
+
+local scheme = lpeg.Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + lpeg.Cc("")
+local authority = slash * slash * lpeg.Cs((escaped+(1- slash-qmark-hash))^0) + lpeg.Cc("")
+local path = slash * lpeg.Cs((escaped+(1- qmark-hash))^0) + lpeg.Cc("")
+local query = qmark * lpeg.Cs((escaped+(1- hash))^0) + lpeg.Cc("")
+local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0) + lpeg.Cc("")
+
+local parser = lpeg.Ct(scheme * authority * path * query * fragment)
+
+-- todo: reconsider Ct as we can as well have five return values (saves a table)
+-- so we can have two parsers, one with and one without
+
+function url.split(str)
+ return (type(str) == "string" and lpegmatch(parser,str)) or str
+end
+
+-- todo: cache them
+
+function url.hashed(str)
+ local s = url.split(str)
+ local somescheme = s[1] ~= ""
+ return {
+ scheme = (somescheme and s[1]) or "file",
+ authority = s[2],
+ path = s[3],
+ query = s[4],
+ fragment = s[5],
+ original = str,
+ noscheme = not somescheme,
+ }
+end
+
+function url.hasscheme(str)
+ return url.split(str)[1] ~= ""
+end
+
+function url.addscheme(str,scheme)
+ return (url.hasscheme(str) and str) or ((scheme or "file:///") .. str)
+end
+
+function url.construct(hash)
+ local fullurl = hash.sheme .. "://".. hash.authority .. hash.path
+ if hash.query then
+ fullurl = fullurl .. "?".. hash.query
+ end
+ if hash.fragment then
+ fullurl = fullurl .. "?".. hash.fragment
+ end
+ return fullurl
+end
+
+function url.filename(filename)
+ local t = url.hashed(filename)
+ return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
+end
+
+function url.query(str)
+ if type(str) == "string" then
+ local t = { }
+ for k, v in gmatch(str,"([^&=]*)=([^&=]*)") do
+ t[k] = v
+ end
+ return t
+ else
+ return str
+ end
+end
+
+--~ print(url.filename("file:///c:/oeps.txt"))
+--~ print(url.filename("c:/oeps.txt"))
+--~ print(url.filename("file:///oeps.txt"))
+--~ print(url.filename("file:///etc/test.txt"))
+--~ print(url.filename("/oeps.txt"))
+
+--~ from the spec on the web (sort of):
+--~
+--~ function test(str)
+--~ print(table.serialize(url.hashed(str)))
+--~ end
+--~
+--~ test("%56pass%20words")
+--~ test("file:///c:/oeps.txt")
+--~ test("file:///c|/oeps.txt")
+--~ test("file:///etc/oeps.txt")
+--~ test("file://./etc/oeps.txt")
+--~ test("file:////etc/oeps.txt")
+--~ test("ftp://ftp.is.co.za/rfc/rfc1808.txt")
+--~ test("http://www.ietf.org/rfc/rfc2396.txt")
+--~ test("ldap://[2001:db8::7]/c=GB?objectClass?one#what")
+--~ test("mailto:John.Doe@example.com")
+--~ test("news:comp.infosystems.www.servers.unix")
+--~ test("tel:+1-816-555-1212")
+--~ test("telnet://192.0.2.16:80/")
+--~ test("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
+--~ test("/etc/passwords")
+--~ test("http://www.pragma-ade.com/spaced%20name")
+
+--~ test("zip:///oeps/oeps.zip#bla/bla.tex")
+--~ test("zip:///oeps/oeps.zip?bla/bla.tex")
diff --git a/tex/context/base/l-utils.lua b/tex/context/base/l-utils.lua
new file mode 100644
index 000000000..ebc27b8cf
--- /dev/null
+++ b/tex/context/base/l-utils.lua
@@ -0,0 +1,176 @@
+if not modules then modules = { } end modules ['l-utils'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- hm, quite unreadable
+
+local gsub = string.gsub
+local concat = table.concat
+local type, next = type, next
+
+if not utils then utils = { } end
+if not utils.merger then utils.merger = { } end
+if not utils.lua then utils.lua = { } end
+
+utils.merger.m_begin = "begin library merge"
+utils.merger.m_end = "end library merge"
+utils.merger.pattern =
+ "%c+" ..
+ "%-%-%s+" .. utils.merger.m_begin ..
+ "%c+(.-)%c+" ..
+ "%-%-%s+" .. utils.merger.m_end ..
+ "%c+"
+
+function utils.merger._self_fake_()
+ return
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. utils.merger.m_begin .. "\n\n" ..
+ "-- " .. utils.merger.m_end .. "\n\n"
+end
+
+function utils.report(...)
+ print(...)
+end
+
+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
+ data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "")
+ end
+ return data or ""
+end
+
+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
+ end
+end
+
+function utils.merger._self_swap_(data,code)
+ if data ~= "" then
+ return (gsub(data,utils.merger.pattern, function(s)
+ return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
+ end, 1))
+ else
+ return ""
+ end
+end
+
+--~ stripper:
+--~
+--~ data = gsub(data,"%-%-~[^\n]*\n","")
+--~ data = gsub(data,"\n\n+","\n")
+
+function utils.merger._self_libs_(libs,list)
+ local result, f, frozen = { }, nil, false
+ result[#result+1] = "\n"
+ if type(libs) == 'string' then libs = { libs } end
+ if type(list) == 'string' then list = { list } end
+ local foundpath = nil
+ for i=1,#libs do
+ local lib = libs[i]
+ for j=1,#list do
+ local pth = gsub(list[j],"\\","/") -- file.clean_path
+ utils.report("checking library path %s",pth)
+ local name = pth .. "/" .. lib
+ if lfs.isfile(name) then
+ foundpath = pth
+ end
+ end
+ if foundpath then break end
+ end
+ if foundpath then
+ utils.report("using library path %s",foundpath)
+ local right, wrong = { }, { }
+ for i=1,#libs do
+ local lib = libs[i]
+ local fullname = foundpath .. "/" .. lib
+ if lfs.isfile(fullname) then
+ -- right[#right+1] = lib
+ utils.report("merging library %s",fullname)
+ result[#result+1] = "do -- create closure to overcome 200 locals limit"
+ result[#result+1] = io.loaddata(fullname,true)
+ result[#result+1] = "end -- of closure"
+ else
+ -- wrong[#wrong+1] = lib
+ utils.report("no library %s",fullname)
+ end
+ end
+ if #right > 0 then
+ utils.report("merged libraries: %s",concat(right," "))
+ end
+ if #wrong > 0 then
+ utils.report("skipped libraries: %s",concat(wrong," "))
+ end
+ else
+ utils.report("no valid library path found")
+ end
+ return concat(result, "\n\n")
+end
+
+function utils.merger.selfcreate(libs,list,target)
+ if target then
+ utils.merger._self_save_(
+ target,
+ utils.merger._self_swap_(
+ utils.merger._self_fake_(),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+ end
+end
+
+function utils.merger.selfmerge(name,libs,list,target)
+ utils.merger._self_save_(
+ target or name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+end
+
+function utils.merger.selfclean(name)
+ utils.merger._self_save_(
+ name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ ""
+ )
+ )
+end
+
+function utils.lua.compile(luafile, lucfile, cleanup, strip) -- defaults: cleanup=false strip=true
+ -- utils.report("compiling",luafile,"into",lucfile)
+ os.remove(lucfile)
+ local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
+ if strip ~= false then
+ command = "-s " .. command
+ end
+ local done = (os.spawn("texluac " .. command) == 0) or (os.spawn("luac " .. command) == 0)
+ if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
+ -- utils.report("removing",luafile)
+ os.remove(luafile)
+ end
+ return done
+end
+
diff --git a/tex/context/base/l-xml.lua b/tex/context/base/l-xml.lua
new file mode 100644
index 000000000..14e97337b
--- /dev/null
+++ b/tex/context/base/l-xml.lua
@@ -0,0 +1,23 @@
+if not modules then modules = { } end modules ['l-xml'] = {
+ version = 1.001,
+ comment = "this module is replaced by the lxml-* ones",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- We asume that the helper modules l-*.lua are loaded
+-- already. But anyway if you use mtxrun to run your script
+-- all is taken care of.
+
+if not trackers then
+ require('trac-tra')
+end
+
+if not xml then
+ require('lxml-tab')
+ require('lxml-lpt')
+ require('lxml-mis')
+ require('lxml-aux')
+ require('lxml-xml')
+end
diff --git a/tex/context/base/lang-all.xml b/tex/context/base/lang-all.xml
new file mode 100644
index 000000000..503cb0ae5
--- /dev/null
+++ b/tex/context/base/lang-all.xml
@@ -0,0 +1,376 @@
+<?xml version='1.0' standalone='yes'?>
+
+<!-- author: Willy Egger -->
+
+<descriptions>
+
+<description language='ba'>
+ <sourcefile>bahyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Basque language</title>
+ <copyright>
+ <year>1991</year>
+ <owner>Julio Sanchez (jsanchez@gmv.es)</owner>
+ <comment>These patterns have been derived from "On Word Division in Spanish"
+ Jos'e A. Ma~nas</comment>
+ </copyright>
+ <copyright>
+ <year>1997</year>
+ <owner>Juan M. Aguirregabiria (wtpagagj@lg.ehu.es)</owner>
+ <comment>Adaption to TeX based on shyphen.sh</comment>
+ </copyright>
+</description>
+
+<description language='ca'>
+ <sourcefile>cahyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Catalan language</title>
+ <remarks>Version 1.11</remarks>
+ <copyright>
+ <year>1991-1995 </year>
+ <owner>Gon\c{c}al Badenes,Francina Turon</owner>
+ </copyright>
+ <copyright>
+ <year>1991-2003</year>
+ <owner>Gon\c{c}al Badenes</owner>
+ </copyright>
+</description>
+
+<description language='cy'>
+ <sourcefile>cyhyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Welsh Language</title>
+ <remarks>v3,GNU General Public License</remarks>
+ <copyright>
+ <year>1996</year>
+ <owner>Yannis Haralambous</owner>
+ <comment>Inputs cathyph.tex, patterns in EC/DC encoding</comment>
+ </copyright>
+</description>
+
+<description language='cz'>
+ <sourcefile>czhyphen.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Czech language</title>
+ <copyright>
+ <year>1991</year>
+ <owner>Karel Horak</owner>
+ <comment>List of exceptions</comment>
+ </copyright>
+ <copyright>
+ <year>1995</year>
+ <owner>Pavel Sevecek (\v{S}eve\v{c}ek) (pavel@lingea.cz)</owner>
+ <comment>Macros, adaption for TeX 2</comment>
+ </copyright>
+ <!-- samples>
+ <sample>au-to-ma-tic-k</sample>
+ <sample>bram-bo-rk</sample>
+ <sample>da-ta-b-ze</sample>
+ <sample>kr-ka-vec</sample>
+ <sample>Kro-me-r</sample>
+ <sample>ob-hos-po-da-ro-vat</sample>
+ <sample>rem-dich</sample>
+ <sample>scvrk-nout</sample>
+ <sample>za-les-nit</sample>
+ <sample>e-u-lic-ka</sample>
+ </samples -->
+</description>
+
+<description language='da'>
+ <sourcefile>dkspecial.tex dkcommon.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Danish language</title>
+ <copyright/>
+</description>
+
+<description language='de'>
+ <sourcefile>dehyphn.tex</sourcefile>
+ <title>TeX hyphenation patterns for the German language (new orthography)</title>
+ <copyright>
+ <year>1988, 1991</year>
+ <owner>Rechenzentrum der Ruhr-Universitaet Bochum</owner>
+ <comment>German hyphen patterns</comment>
+ </copyright>
+ <copyright>
+ <year>1993, 1994, 1999</year>
+ <owner>Bernd Raichle/DANTE e.V.</owner>
+ <comment>Macros, adaption for TeX 2</comment>
+ </copyright>
+ <copyright>
+ <year>1998-2001</year>
+ <owner>Walter Schmidt</owner>
+ <comment>Adaption to new German orthography</comment>
+ </copyright>
+</description>
+
+<description language='deo'>
+ <sourcefile>dehypht.tex</sourcefile>
+ <title>TeX hyphenation patterns for the German language (traditional orthography)</title>
+ <copyright>
+ <year>1988, 1991</year>
+ <owner>Rechenzentrum der Ruhr-Universitaet Bochum</owner>
+ <comment>German hyphen patterns</comment>
+ </copyright>
+ <copyright>
+ <year>1993, 1994, 1999</year>
+ <owner>Bernd Raichle/DANTE e.V.</owner>
+ <comment>Macros, adaption for TeX 2</comment>
+ </copyright>
+</description>
+
+<description language='en'>
+ <sourcefile>hyphen.tex</sourcefile>
+ <title>Plain TeX hyphenation patterns for the English language (US) </title>
+ <remarks>[NOT TO BE CHANGED IN ANY WAY!]</remarks>
+ <copyright/>
+</description>
+
+<description language='es'>
+ <sourcefile>eshyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Spanish language</title>
+ <copyright>
+ <year>1993</year>
+ <owner>Francesc Carmona (franc@porthos.bio.ub.es)</owner>
+ </copyright>
+</description>
+
+<description language='fi'>
+ <sourcefile>fihyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Finnish language</title>
+ <copyright>
+ <year>1986</year>
+ <owner>Kauko Saarinen</owner>
+ <comment>First release</comment>
+ </copyright>
+ <copyright>
+ <year>1988</year>
+ <owner>Fred Karlsson</owner>
+ <comment>Completely rewritten patterns</comment>
+ </copyright>
+ <copyright>
+ <year>1989</year>
+ <owner>Fred Karlsson</owner>
+ <comment>Some vowel tripples added</comment>
+ </copyright>
+ <copyright>
+ <year>1995</year>
+ <owner>Thomas Esser</owner>
+ <comment>Added \uccode and \lccode </comment>
+ </copyright>
+</description>
+
+<description language='fr'>
+ <sourcefile>frhyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the French language</title>
+ <remarks>V2.11</remarks>
+ <copyright>
+ <owner>Jacques Desarmenien, Norman Buckle, Michael Ferguson, Justin Bur, Daniel Flipo and Bernard Gaulle</owner>
+ </copyright>
+ <copyright>
+ <year>1996</year>
+ <owner>Bernd Raichle/DANTE e.V.</owner>
+ <comment>Adaption for TeX 3.x and MLTeX 3.x (2.x)</comment>
+ </copyright>
+</description>
+
+<description language='hr'>
+ <sourcefile> hrhyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Croatian language</title>
+ <copyright>
+ <year>1994, 1996</year>
+ <owner>Marinovi\'c Igor (migor@student.math.hr)</owner>
+ </copyright>
+</description>
+
+<description language='hu'>
+ <sourcefile> huhyphn.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Hungarian language</title>
+</description>
+
+<description language='is'>
+ <sourcefile>ishyph.tex</sourcefile>
+ <title>Plain TeX hyphenation patterns for the Icelandic language</title>
+ <remarks>[NOT TO BE CHANGED IN ANY WAY!]</remarks>
+ <copyright>
+ <year>1987</year>
+ <owner>Jorgen Pind</owner>
+ </copyright>
+</description>
+
+<description language='it'>
+ <sourcefile>ithyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Italian language</title>
+ <remarks>v4.8d</remarks>
+ <copyright>
+ <year>1998, 2001</year>
+ <owner>Claudio Beccari</owner>
+ </copyright>
+ <copyright>
+ <year>1993, 1994, 1999</year>
+ <owner>Bernd Raichle/DANTE e.V.</owner>
+ <comment>Macros, adaption for TeX 2</comment>
+ </copyright>
+</description>
+
+<description language='la'>
+ <sourcefile>lahyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Latin language</title>
+ <remarks>v3.0b</remarks>
+ <copyright>
+ <year>1999-2001</year>
+ <owner>Claudio Beccari</owner>
+ </copyright>
+ <copyright>
+ <year>1993, 1994, 1998, 1999</year>
+ <owner>Bernd Raichle/DANTE e.V.</owner>
+ <comment>Macro code in 'dehypht.tex'</comment>
+ </copyright>
+</description>
+
+<description language='nl'>
+ <sourcefile>nehyph96.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Dutch language</title>
+ <copyright>
+ <year>1996</year>
+ <owner> Piet Tutelaers (P.T.H.Tutelaers@tue.nl)</owner>
+ <comment>8-bit hyphenation patterns for TeX based upon the new Dutch
+ spelling, officially since 1 August 1996. These patterns follow
+ the new hyphenation rules in the `Woordenlijst Nederlandse
+ Taal, SDU Uitgevers, Den Haag 1995' (the so called `Groene
+ Boekje') described in section 5.2 (Het afbreekteken)</comment>
+ </copyright>
+</description>
+
+<!-- Watch the next one: what a naming mess. What user can keep track of
+such an inconsistent name scheme (well, no name scheme). Please warn me
+when yet another name shows up -->
+
+<description language='no'>
+ <sourcefile>nohyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Norwegian language</title>
+ <copyright>
+ <year>2005</year>
+ <owner>Rune Kleveland with patches from Ole Michael Selberg</owner>
+ <comment>nohyphbx.tex</comment>
+ </copyright>
+ <copyright>
+ <year>200+</year>
+ <owner>Rune Kleveland</owner>
+ <comment>nohyphb.tex</comment>
+ </copyright>
+ <copyright>
+ <year>199+</year>
+ <owner>Dag Langmyhr and student</owner>
+ <comment>nohyph2.tex</comment>
+ </copyright>
+ <copyright>
+ <year>199+</year>
+ <owner>Ivar Aavatsmark and others</owner>
+ <comment>nohyph.tex sometimes named nohyph1.tex</comment>
+ </copyright>
+ <copyright>
+ <year>1992,1993</year>
+ <owner>Ivar Aavatsmark</owner>
+ <comment>nohyphen.tex based on danhyph.tex</comment>
+ </copyright>
+ <copyright>
+ <year>1994</year>
+ <owner>Preben Randhol, Jon Martin Solaas</owner>
+ </copyright>
+ <copyright>
+ <year>1995</year>
+ <owner>Thomas Esser (te@dbs.uni-hannover.de)</owner>
+ <comment>Make patterns work with non-T1 encoding</comment>
+ </copyright>
+</description>
+
+<description language='pl'>
+ <sourcefile>plhyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Polish language</title>
+ <copyright/>
+</description>
+
+<description language='pt'>
+ <sourcefile>pthyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Portuguese language</title>
+ <copyright/>
+</description>
+
+<description language='ro'>
+ <sourcefile>rohyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Romanian language</title>
+ <copyright/>
+</description>
+
+<description language='sk'>
+ <sourcefile>skhyphen.tex skhyphen.ex</sourcefile>
+ <title>TeX hyphenation patterns for the Slovakian language</title>
+ <copyright>
+ <year>1992</year>
+ <owner>Jana Chlebikova</owner>
+ </copyright>
+ <copyright>
+ <year>1991</year>
+ <owner>Karel Horak</owner>
+ <comment>List of exceptions</comment>
+ </copyright>
+</description>
+
+<description language='sl'>
+ <sourcefile>sihyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Slovenian language</title>
+ <copyright>
+ <year>1990</year>
+ <owner>TeXCeX (SLO),TeXCeH Norbert Schwarz</owner>
+ </copyright>
+ <copyright>
+ <year>1994</year>
+ <owner>Leon "Zlajpah (leon.zlajpah@ijs.si)</owner>
+ <comment>Use of code page 852 in patterns</comment>
+ </copyright>
+ <copyright>
+ <year>1995,1997</year>
+ <owner>Leon "Zlajpah (leon.zlajpah@ijs.si)</owner>
+ <comment>Adaptaion of Slovenian hyphenation pattens, macros</comment>
+ </copyright>
+</description>
+
+<description language='sv'>
+ <sourcefile>svhyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the Swedish language</title>
+ <copyright>
+ <year>1991,1994</year>
+ <owner>Jan Michael Rynning</owner>
+ </copyright>
+</description>
+
+<description language='tr'>
+ <sourcefile>tkhyph.tex</sourcefile>
+ <title>TeX hyphenation patterns for the modern Turkish language</title>
+ <copyright>
+ <year>1996</year>
+ <owner>Yannis Haralambous</owner>
+ <comment>A mechanically generated Turkish Hyphenation table for TeX,
+ using the University of Washington diacritical coding
+ developed by P. A. MacKay for the Ottoman Texts Project</comment>
+ </copyright>
+</description>
+
+<description language='uk'>
+ <sourcefile>ukhyphen.tex</sourcefile>
+ <title>TeX hyphenation patterns for the English language (UK)</title>
+ <copyright/>
+</description>
+
+<description language='vn'>
+ <comment>Vietnamese needs no patterns.</comment>
+</description>
+
+<description language='agr'>
+ <sourcefile>grahyph4.tex</sourcefile>
+ <title>TeX hyphenation patterns for the ancient Greek language</title>
+ <copyright>
+ <year>2004</year>
+ <owner>Dimitrios Filippou</owner>
+ <comment>These hyphenation patterns are explained in "ancient.pdf".
+ Hyphenation examples are given in the file "anc-test.pdf".
+ Some doubtful patterns are marked by three question marks "???".</comment>
+ </copyright>
+</description>
+
+</descriptions>
diff --git a/tex/context/base/lang-alt.tex b/tex/context/base/lang-alt.tex
new file mode 100644
index 000000000..f65acbda3
--- /dev/null
+++ b/tex/context/base/lang-alt.tex
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=lang-alt,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Altaic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Altaic Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+
+% Uigur, Uzbek
+% Azeri/Azerbaijani, Chuvash, Turkish, Turkmen
+% Kazakh, Kazar, Kireghiz, Noghay, Talar
+% Buryat, Kalmuck, Khalkha
+%
+% Turkmen translation by Nazar Annagurban <nazartm at gmail.com> 18. March 2010
+
+\unprotect
+
+\installlanguage
+ [\s!tr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day}]
+
+\installlanguage
+ [\s!tk]
+ [\c!spacing=\v!broad,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day}
+ \s!patterns=\s!tk,
+ \s!lefthyphenmin=1,
+ \s!righthyphenmin=2]
+
+\installlanguage [turkish] [\s!tr]
+\installlanguage [turkmen] [\s!tk]
+
+\setupheadtext [\s!tr] [\v!content=Fihrist]
+\setupheadtext [\s!tk] [\v!content=Mazmuny]
+\setupheadtext [\s!tr] [\v!tables=Tablolar]
+\setupheadtext [\s!tk] [\v!tables=Tablisalar]
+\setupheadtext [\s!tr] [\v!figures=\Scedilla ekiller]
+\setupheadtext [\s!tk] [\v!figures=Suratlar]
+\setupheadtext [\s!tr] [\v!graphics=Grafikler]
+\setupheadtext [\s!tk] [\v!graphics=Grafikler]
+\setupheadtext [\s!tr] [\v!intermezzi=...]
+\setupheadtext [\s!tk] [\v!intermezzi=Arakesmeler]
+\setupheadtext [\s!tr] [\v!index=\Idotaccent ndex]
+\setupheadtext [\s!tk] [\v!index=Indeks]
+\setupheadtext [\s!tr] [\v!abbreviations=K\dotlessi saltmalar]
+\setupheadtext [\s!tk] [\v!abbreviations=Gysgaltmalar]
+\setupheadtext [\s!tr] [\v!logos=Logolar]
+\setupheadtext [\s!tk] [\v!logos=Logolar]
+\setupheadtext [\s!tr] [\v!units=Birimler]
+\setupheadtext [\s!tk] [\v!units=Birlikler]
+
+\setuplabeltext [\s!tr] [\v!table=Tablo ]
+\setuplabeltext [\s!tk] [\v!table=Tablisa]
+\setuplabeltext [\s!tr] [\v!figure=\Scedilla ekil ]
+\setuplabeltext [\s!tk] [\v!figure=Surat]
+\setuplabeltext [\s!tr] [\v!intermezzo=... ]
+\setuplabeltext [\s!tk] [\v!intermezzo=Arakesme]
+\setuplabeltext [\s!tr] [\v!graphic=Grafik]
+\setuplabeltext [\s!tk] [\v!graphic=Grafik]
+\setuplabeltext [\s!tr] [\v!chapter=]
+\setuplabeltext [\s!tk] [\v!chapter=Bap]
+\setuplabeltext [\s!tr] [\v!section=]
+\setuplabeltext [\s!tk] [\v!section=]
+\setuplabeltext [\s!tr] [\v!subsection=]
+\setuplabeltext [\s!tk] [\v!subsection=]
+\setuplabeltext [\s!tr] [\v!subsubsection=]
+\setuplabeltext [\s!tr] [\v!subsubsubsection=]
+\setuplabeltext [\s!tk] [\v!subsubsubsection=]
+\setuplabeltext [\s!tr] [\v!appendix=]
+\setuplabeltext [\s!tk] [\v!appendix=Go\scedilla ma\ccedilla a]
+\setuplabeltext [\s!tr] [\v!part=Cilt ]
+\setuplabeltext [\s!tk] [\v!part=B\odiaeresis l\udiaeresis m]
+\setuplabeltext [\s!tr] [\v!line=sat\dotlessi r ]
+\setuplabeltext [\s!tk] [\v!line=setir]
+\setuplabeltext [\s!tr] [\v!lines=sat\dotlessi rlar ]
+\setuplabeltext [\s!tk] [\v!lines=setirler]
+
+\setuplabeltext [\s!tk] [\v!january=\yacute anwar]
+\setuplabeltext [\s!tk] [\v!february=fewral]
+\setuplabeltext [\s!tk] [\v!march=mart]
+\setuplabeltext [\s!tk] [\v!april=aprel]
+\setuplabeltext [\s!tk] [\v!may=ma\yacute]
+\setuplabeltext [\s!tk] [\v!june=i\yacute un]
+\setuplabeltext [\s!tk] [\v!july=i\yacute ul]
+\setuplabeltext [\s!tk] [\v!august=awgust]
+\setuplabeltext [\s!tk] [\v!september=sent\yacute abr]
+\setuplabeltext [\s!tk] [\v!october=okt\yacute abr]
+\setuplabeltext [\s!tk] [\v!november=no\yacute abr]
+\setuplabeltext [\s!tk] [\v!december=dekabr]
+
+\setuplabeltext [\s!tr] [\v!january=ocak]
+\setuplabeltext [\s!tr] [\v!february=\Scedilla ubat]
+\setuplabeltext [\s!tr] [\v!march=mart]
+\setuplabeltext [\s!tr] [\v!april=nisan]
+\setuplabeltext [\s!tr] [\v!may=may\dotlessi s]
+\setuplabeltext [\s!tr] [\v!june=haziran]
+\setuplabeltext [\s!tr] [\v!july=temmuz]
+\setuplabeltext [\s!tr] [\v!august=a\gbreve ustos]
+\setuplabeltext [\s!tr] [\v!september=eyl\udiaeresis l]
+\setuplabeltext [\s!tr] [\v!october=ekim]
+\setuplabeltext [\s!tr] [\v!november=kas\dotlessi m]
+\setuplabeltext [\s!tr] [\v!december=aral\dotlessi k]
+
+\setuplabeltext [\s!tr] [\v!sunday=pazar]
+\setuplabeltext [\s!tr] [\v!monday=pazartesi]
+\setuplabeltext [\s!tr] [\v!tuesday=sal\dotlessi]
+\setuplabeltext [\s!tr] [\v!wednesday=\ccedilla ar\scedilla amba]
+\setuplabeltext [\s!tr] [\v!thursday=per\scedilla embe]
+\setuplabeltext [\s!tr] [\v!friday=cuma]
+\setuplabeltext [\s!tr] [\v!saturday=cumartesi]
+
+\setuplabeltext [\s!tk] [\v!sunday=dyn\ccedilla\ g\udiaeresis n]
+\setuplabeltext [\s!tk] [\v!monday=birinji g\udiaeresis n]
+\setuplabeltext [\s!tk] [\v!tuesday=ikinji g\udiaeresis n]
+\setuplabeltext [\s!tk] [\v!wednesday=\udiaeresis\ccedilla\udiaeresis nji]
+\setuplabeltext [\s!tk] [\v!thursday=d\odiaeresis rd\udiaeresis nji g\udiaeresis n]
+\setuplabeltext [\s!tk] [\v!friday=b\adiaeresis\scedilla inji g\udiaeresis n]
+\setuplabeltext [\s!tk] [\v!saturday=altynjy g\udiaeresis n]
+
+%D \ShowAllLanguageValues [\s!tr] [turkish] {Turkish} {delight} % turks fruit
+
+\protect \endinput
diff --git a/tex/context/base/lang-ana.tex b/tex/context/base/lang-ana.tex
new file mode 100644
index 000000000..c108655c4
--- /dev/null
+++ b/tex/context/base/lang-ana.tex
@@ -0,0 +1,24 @@
+%D \module
+%D [ file=lang-ana,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Anatolian Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Anatolian Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+
+\unprotect
+
+\protect \endinput
diff --git a/tex/context/base/lang-ara.mkiv b/tex/context/base/lang-ara.mkiv
new file mode 100644
index 000000000..3c4d3c522
--- /dev/null
+++ b/tex/context/base/lang-ara.mkiv
@@ -0,0 +1,150 @@
+%D \module
+%D [ file=lang-ara,
+%D version=2008.06.20,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Arabic Languages,
+%D author=Khaled Hosny,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Arabic Languages}
+
+\unprotect
+
+\definesystemconstant {arabic}
+\definesystemvariable {ar}
+
+\installlanguage
+ [\s!ar]
+ [\c!spacing=\v!broad,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\ ,\v!month,{،\ },\v!year}]
+
+\installlanguage [\s!arabic] [\s!ar]
+
+% Just aliases to "ar" for now
+
+\installlanguage[\s!ar-ae][\c!default=\s!ar] % U.A.E.
+\installlanguage[\s!ar-bh][\c!default=\s!ar] % Bahrain
+\installlanguage[\s!ar-eg][\c!default=\s!ar] % Egypt
+\installlanguage[\s!ar-in][\c!default=\s!ar] % India?
+\installlanguage[\s!ar-kw][\c!default=\s!ar] % Kuwait
+\installlanguage[\s!ar-ly][\c!default=\s!ar] % Libya
+\installlanguage[\s!ar-om][\c!default=\s!ar] % Oman
+\installlanguage[\s!ar-qa][\c!default=\s!ar] % Qatar
+\installlanguage[\s!ar-sa][\c!default=\s!ar] % Saudi Arabia
+\installlanguage[\s!ar-sd][\c!default=\s!ar] % Sudan
+\installlanguage[\s!ar-tn][\c!default=\s!ar] % Tunisia
+\installlanguage[\s!ar-ye][\c!default=\s!ar] % Yemen
+
+% Syriac months
+
+\installlanguage[\s!ar-sy][\c!default=\s!ar] % Syria
+\installlanguage[\s!ar-iq][\c!default=\s!ar-sy] % Iraq
+\installlanguage[\s!ar-jo][\c!default=\s!ar-sy] % Jordan
+\installlanguage[\s!ar-lb][\c!default=\s!ar-sy] % Lebanon
+
+% Maghribi months
+
+\installlanguage[\s!ar-dz][\c!default=\s!ar] % Algeria
+\installlanguage[\s!ar-ma][\c!default=\s!ar] % Morocco
+
+\setupheadtext [\s!ar] [\v!content=المحتويات]
+\setupheadtext [\s!ar] [\v!tables=الجداول]
+\setupheadtext [\s!ar] [\v!figures=الأشكال]
+\setupheadtext [\s!ar] [\v!graphics=الرسوم]
+\setupheadtext [\s!ar] [\v!intermezzi=فسح]
+\setupheadtext [\s!ar] [\v!index=الفهرس]
+\setupheadtext [\s!ar] [\v!abbreviations=الاختصارات]
+\setupheadtext [\s!ar] [\v!logos=الشعارات]
+\setupheadtext [\s!ar] [\v!units=الوحدات]
+\setuplabeltext [\s!ar] [\v!table=جدول ]
+\setuplabeltext [\s!ar] [\v!figure=شكل ]
+\setuplabeltext [\s!ar] [\v!intermezzo=فسحة ]
+\setuplabeltext [\s!ar] [\v!graphic=رسم ]
+
+%D We don't set these here. One can do that in a style.
+
+\setuplabeltext [\s!ar] [\v!chapter=] % باب
+\setuplabeltext [\s!ar] [\v!section=] % فصل or قسم
+\setuplabeltext [\s!ar] [\v!subsection=] % فصل أدنى
+\setuplabeltext [\s!ar] [\v!subsubsection=] % فصل أ دنى أدنى
+\setuplabeltext [\s!ar] [\v!subsubsubsection=] % فصل أدنى أدنى أدنى
+\setuplabeltext [\s!ar] [\v!appendix=] % ملحق
+\setuplabeltext [\s!ar] [\v!part=جزء ]
+\setuplabeltext [\s!ar] [\v!line=سطر ]
+\setuplabeltext [\s!ar] [\v!lines=السطور ]
+
+\setuplabeltext [\s!ar] [\v!january=يناير]
+\setuplabeltext [\s!ar] [\v!february=فبراير]
+\setuplabeltext [\s!ar] [\v!march=مارس]
+\setuplabeltext [\s!ar] [\v!april=أبريل]
+\setuplabeltext [\s!ar] [\v!may=مايو]
+\setuplabeltext [\s!ar] [\v!june=يونيو]
+\setuplabeltext [\s!ar] [\v!july=يوليو]
+\setuplabeltext [\s!ar] [\v!august=أغسطس]
+\setuplabeltext [\s!ar] [\v!september=سبتمبر]
+\setuplabeltext [\s!ar] [\v!october=أكتوبر]
+\setuplabeltext [\s!ar] [\v!november=نوفمبر]
+\setuplabeltext [\s!ar] [\v!december=ديسمبر]
+
+\setuplabeltext [\s!ar-sy] [\v!january=كانون الثاني]
+\setuplabeltext [\s!ar-sy] [\v!february=شباط]
+\setuplabeltext [\s!ar-sy] [\v!march=آذار]
+\setuplabeltext [\s!ar-sy] [\v!april=نيسان]
+\setuplabeltext [\s!ar-sy] [\v!may=أيار]
+\setuplabeltext [\s!ar-sy] [\v!june=حزيران]
+\setuplabeltext [\s!ar-sy] [\v!july=تموز]
+\setuplabeltext [\s!ar-sy] [\v!august=آب]
+\setuplabeltext [\s!ar-sy] [\v!september=أيلول]
+\setuplabeltext [\s!ar-sy] [\v!october=تشرين الأول]
+\setuplabeltext [\s!ar-sy] [\v!november=تشرين الثاني]
+\setuplabeltext [\s!ar-sy] [\v!december=كانون الأول]
+
+\setuplabeltext [\s!ar-ma] [\v!may=ماي]
+\setuplabeltext [\s!ar-ma] [\v!july=يوليوز]
+\setuplabeltext [\s!ar-ma] [\v!august=غشت]
+\setuplabeltext [\s!ar-ma] [\v!september=شتنبر]
+\setuplabeltext [\s!ar-ma] [\v!november=نونبر]
+\setuplabeltext [\s!ar-ma] [\v!december=دجنبر]
+
+\setuplabeltext [\s!ar-dz] [\v!january=جانفي]
+\setuplabeltext [\s!ar-dz] [\v!february=فيفري]
+\setuplabeltext [\s!ar-dz] [\v!april=أفريل]
+\setuplabeltext [\s!ar-dz] [\v!may=ماي]
+\setuplabeltext [\s!ar-dz] [\v!june=جوان]
+\setuplabeltext [\s!ar-dz] [\v!july=جويلة]
+\setuplabeltext [\s!ar-dz] [\v!august=أوت]
+
+\setuplabeltext [\s!ar] [\v!sunday=الأحد]
+\setuplabeltext [\s!ar] [\v!monday=الاثنين]
+\setuplabeltext [\s!ar] [\v!tuesday=الثلاثاء]
+\setuplabeltext [\s!ar] [\v!wednesday=الأربعاء]
+\setuplabeltext [\s!ar] [\v!thursday=الخميس]
+\setuplabeltext [\s!ar] [\v!friday=الجمعة]
+\setuplabeltext [\s!ar] [\v!saturday=السبت]
+
+%D Rather new ...
+
+\setuplabeltext [\s!ar] [\v!page=صفحة ]
+\setuplabeltext [\s!ar] [\v!atpage=في صفحة ]
+\setuplabeltext [\s!ar] [\v!hencefore=كما وضحنا سابقا]
+\setuplabeltext [\s!ar] [\v!hereafter=كما نوضح لاحقا]
+\setuplabeltext [\s!ar] [\v!see=انظر ]
+
+%D ... and to be completed!
+
+%D \ShowAllLanguageValues [\s!ar] [arabic] {Arabic} {horn} % engelse humor
+
+\protect \endinput
diff --git a/tex/context/base/lang-art.tex b/tex/context/base/lang-art.tex
new file mode 100644
index 000000000..e8be91630
--- /dev/null
+++ b/tex/context/base/lang-art.tex
@@ -0,0 +1,26 @@
+%D \module
+%D [ file=lang--art,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Artificial Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Artificial Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+
+% Esperanto
+
+\unprotect
+
+\protect \endinput
diff --git a/tex/context/base/lang-bal.tex b/tex/context/base/lang-bal.tex
new file mode 100644
index 000000000..394e9d93c
--- /dev/null
+++ b/tex/context/base/lang-bal.tex
@@ -0,0 +1,118 @@
+%D \module
+%D [ file=lang-bal,
+%D version=2010.01.21,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Baltic Languages,
+%D author=Marius Aleknevičius,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Baltic Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D all the translations were done by Marius Aleknevičius. If
+%D you have suggestions, don't hesitate to send us an email.
+
+%D This file is in \UTF\ encoding and is meant for \MKIV.
+
+% Lettish/Latvian, Lietuvių/Lithuanian
+
+\unprotect
+
+\installlanguage
+ [\s!lt]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\lowerleftdoubleninequote,
+ \c!rightquote=\upperrightdoublesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!year,~m.,\ ,\v!month,\ ,\v!day,~d.},
+ \s!patterns=\s!lt,
+ \s!encoding=l7x,
+ \s!mapping=l7x,
+ \s!lefthyphenmin=2,
+ \s!righthyphenmin=2]
+
+\installlanguage [lithuanian] [\s!lt]
+
+\setupheadtext [\s!lt] [\v!content=Turinys]
+\setupheadtext [\s!lt] [\v!tables=Lentelės]
+\setupheadtext [\s!lt] [\v!figures=Iliustracijos]
+\setupheadtext [\s!lt] [\v!graphics=Graphics] % TODO what is the difference between the "graphics" and the "figures"?
+\setupheadtext [\s!lt] [\v!intermezzi=Intermezzos] % TODO what is the "intermezzi"?
+\setupheadtext [\s!lt] [\v!index=Rodyklė]
+\setupheadtext [\s!lt] [\v!abbreviations=Santrumpos]
+\setupheadtext [\s!lt] [\v!logos=Logos] % TODO where it is used?
+\setupheadtext [\s!lt] [\v!units=Units] % TODO where it is used?
+\setupheadtext [\s!lt] [pubs=Literatūra]
+
+\setuplabeltext [\s!lt] [\v!table={, lentelė.}]
+\setuplabeltext [\s!lt] [\v!figure={, pav.}]
+\setuplabeltext [\s!lt] [\v!intermezzo=Intermezzo ] % TODO
+\setuplabeltext [\s!lt] [\v!graphic=Graphic ] % TODO
+
+%\startlanguagespecifics[\s!lt]
+% \setupheads[\c!sectionstopper=.] %TODO how do I set dots after section numbers?
+%\stoplanguagespecifics
+
+\setuplabeltext [\s!lt] [\v!chapter=] % Chapter
+\setuplabeltext [\s!lt] [\v!section=]
+\setuplabeltext [\s!lt] [\v!subsection=]
+\setuplabeltext [\s!lt] [\v!subsubsection=]
+\setuplabeltext [\s!lt] [\v!subsubsubsection=]
+\setuplabeltext [\s!lt] [\v!appendix=] % Appendix
+\setuplabeltext [\s!lt] [\v!part={, dalis}]
+\setuplabeltext [\s!lt] [\v!line=line ] % TODO where it is used?
+\setuplabeltext [\s!lt] [\v!lines=lines ] % TODO where it is used?
+
+\setuplabeltext [\s!lt] [\v!january=sausio]
+\setuplabeltext [\s!lt] [\v!february=vasario]
+\setuplabeltext [\s!lt] [\v!march=kovo]
+\setuplabeltext [\s!lt] [\v!april=balandžio]
+\setuplabeltext [\s!lt] [\v!may=gegužės]
+\setuplabeltext [\s!lt] [\v!june=birželio]
+\setuplabeltext [\s!lt] [\v!july=liepos]
+\setuplabeltext [\s!lt] [\v!august=rugpjūčio]
+\setuplabeltext [\s!lt] [\v!september=rugsėjo]
+\setuplabeltext [\s!lt] [\v!october=spalio]
+\setuplabeltext [\s!lt] [\v!november=lapkričio]
+\setuplabeltext [\s!lt] [\v!december=gruodžio]
+
+\setuplabeltext [\s!lt] [\v!sunday=sekmadienis]
+\setuplabeltext [\s!lt] [\v!monday=pirmadienis]
+\setuplabeltext [\s!lt] [\v!tuesday=antradienis]
+\setuplabeltext [\s!lt] [\v!wednesday=trečiadienis]
+\setuplabeltext [\s!lt] [\v!thursday=ketvirtadienis]
+\setuplabeltext [\s!lt] [\v!friday=penktadienis]
+\setuplabeltext [\s!lt] [\v!saturday=šeštadienis]
+
+\setuplabeltext [\s!lt] [\v!page=puslapis ] % TODO how to test?
+\setuplabeltext [\s!lt] [\v!atpage=puslapyje ] % TODO how to test?
+\setuplabeltext [\s!lt] [\v!hencefore=kaip parodyta aukščiau] % TODO how to test?
+\setuplabeltext [\s!lt] [\v!hereafter=kaip parodyta žemiau] % TODO how to test?
+\setuplabeltext [\s!lt] [\v!see=žiūrėti ] % TODO how to test?
+
+\setuplabeltext [\s!lt] [\v!january :\s!mnem=jan] % I think, there is no abbreviated versions of months in lithuanian
+\setuplabeltext [\s!lt] [\v!february :\s!mnem=feb]
+\setuplabeltext [\s!lt] [\v!march :\s!mnem=mar]
+\setuplabeltext [\s!lt] [\v!april :\s!mnem=apr]
+\setuplabeltext [\s!lt] [\v!may :\s!mnem=may]
+\setuplabeltext [\s!lt] [\v!june :\s!mnem=jun]
+\setuplabeltext [\s!lt] [\v!july :\s!mnem=jul]
+\setuplabeltext [\s!lt] [\v!august :\s!mnem=aug]
+\setuplabeltext [\s!lt] [\v!september:\s!mnem=sep]
+\setuplabeltext [\s!lt] [\v!october :\s!mnem=oct]
+\setuplabeltext [\s!lt] [\v!november :\s!mnem=nov]
+\setuplabeltext [\s!lt] [\v!december :\s!mnem=dec]
+
+%D \ShowAllLanguageValues [\s!lt] [lithuanian] {Lithuanian} {doll} % What does this mean? Do I need it?
+
+\protect \endinput
diff --git a/tex/context/base/lang-cel.tex b/tex/context/base/lang-cel.tex
new file mode 100644
index 000000000..4d93957f1
--- /dev/null
+++ b/tex/context/base/lang-cel.tex
@@ -0,0 +1,26 @@
+%D \module
+%D [ file=lang-cel,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Celtic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Celtic Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+
+% Breton, Welsh, Irish, Manx, Scottish Gaelic
+
+\unprotect
+
+\protect \endinput
diff --git a/tex/context/base/lang-chi.mkii b/tex/context/base/lang-chi.mkii
new file mode 100644
index 000000000..278e10745
--- /dev/null
+++ b/tex/context/base/lang-chi.mkii
@@ -0,0 +1,305 @@
+%D \module
+%D [ file=lang-chi,
+%D version=2002.06.25, % 1998.10.10,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Chinese,
+%D author={Hans Hagen \& Wang Lei},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Chinese}
+
+%D This module is coded using the \UNICODE\ support built in
+%D \CONTEXT. Therefore, \type {\uchar} is used instead of latin
+%D characters.
+
+\unprotect
+
+\definesystemconstant {chinese} \definesystemconstant {cn}
+
+\installlanguage
+ [\s!cn]
+ [\c!leftsentence=\cnencoding\cnleftsentence,
+ \c!rightsentence=\cnencoding\cnrightsentence,
+ \c!leftsubsentence=\cnencoding\cnleftsubsentence,
+ \c!rightsubsentence=\cnencoding\cnrightsubsentence,
+ \c!leftquote=\cnencoding\cnupperleftsinglequote,
+ \c!rightquote=\cnencoding\cnupperrightsinglequote,
+ \c!leftquotation=\cnencoding\cnupperleftdoublequote,
+ \c!rightquotation=\cnencoding\cnupperrightdoublequote,
+ \c!date={\v!year,\cnyear,\ ,\v!month,\v!day,\cnday}]
+
+\setupheadtext [\s!cn] [\v!content={\cnencoding\cnencodedcontents}]
+\setupheadtext [\s!cn] [\v!tables={\cnencoding\cnencodedtables}]
+\setupheadtext [\s!cn] [\v!figures={\cnencoding\cnencodedfigures}]
+\setupheadtext [\s!cn] [\v!graphics={\cnencoding\cnencodedgraphics}]% RG & XJF
+\setupheadtext [\s!cn] [\v!intermezzi={\cnencoding\cnencodedintermezzo}]% RG & XJF
+\setupheadtext [\s!cn] [\v!index={\cnencoding\cnencodedindex}]
+\setupheadtext [\s!cn] [\v!abbreviations={\cnencoding\cnencodedabbreviations}]
+\setupheadtext [\s!cn] [\v!logos={\cnencoding\cnencodedlogos}]
+\setupheadtext [\s!cn] [\v!units={\cnencoding\cnencodedunits}]
+
+\setuplabeltext [\s!cn] [\v!table={\cnencoding\cnencodedtable}]
+\setuplabeltext [\s!cn] [\v!figure={\cnencoding\cnencodedfigure}]
+\setuplabeltext [\s!cn] [\v!intermezzo={\cnencoding\cnencodedintermezzo}]% RG & XJF
+\setuplabeltext [\s!cn] [\v!graphic={\cnencoding\cnencodedillustration}]% RG & XJF
+\setuplabeltext [\s!cn] [\v!appendix={\cnencoding\cnencodedappendix}]% RG
+\setuplabeltext [\s!cn] [\v!part={\cnencoding\cnencodedintro,\cnencoding\cnencodedpart}]
+\setuplabeltext [\s!cn] [\v!chapter={\cnencoding\cnencodedintro,\cnencoding\cnencodedchapter}]
+\setuplabeltext [\s!cn] [\v!section={\cnencoding\cnencodedintro,\cnencoding\cnencodedsection}]
+\setuplabeltext [\s!cn] [\v!line={\cnencoding\cnencodedline}]% RG & XJF
+\setuplabeltext [\s!cn] [\v!lines={\cnencoding\cnencodedline}]% RG & XJF
+
+\setuplabeltext [\s!cn] [\v!subsection=]
+\setuplabeltext [\s!cn] [\v!subsubsection=]
+\setuplabeltext [\s!cn] [\v!subsubsubsection=]
+
+%D From this definition one can deduce that language, input
+%D encoding, font encoding, and glyph meaning form a pretty
+%D complex four dimensional space.
+
+\startlanguagespecifics[\s!cn]
+
+\setuplabeltext [\s!cn] [\v!january=\cnencoding\cnencodedjanuary ]
+\setuplabeltext [\s!cn] [\v!february=\cnencoding\cnencodedfebrary ]
+\setuplabeltext [\s!cn] [\v!march=\cnencoding\cnencodedmarch ]
+\setuplabeltext [\s!cn] [\v!april=\cnencoding\cnencodedapril ]
+\setuplabeltext [\s!cn] [\v!may=\cnencoding\cnencodedmay ]
+\setuplabeltext [\s!cn] [\v!june=\cnencoding\cnencodedjune ]
+\setuplabeltext [\s!cn] [\v!july=\cnencoding\cnencodedjuly ]
+\setuplabeltext [\s!cn] [\v!august=\cnencoding\cnencodedaugust ]
+\setuplabeltext [\s!cn] [\v!september=\cnencoding\cnencodedseptember]
+\setuplabeltext [\s!cn] [\v!october=\cnencoding\cnencodedoctober ]
+\setuplabeltext [\s!cn] [\v!november=\cnencoding\cnencodednovember ]
+\setuplabeltext [\s!cn] [\v!december=\cnencoding\cnencodeddecember ]
+
+\setuplabeltext [\s!cn] [\v!sunday=\cnencoding\cnencodedsunday ]
+\setuplabeltext [\s!cn] [\v!monday=\cnencoding\cnencodedmonday ]
+\setuplabeltext [\s!cn] [\v!tuesday=\cnencoding\cnencodedtuesday ]
+\setuplabeltext [\s!cn] [\v!wednesday=\cnencoding\cnencodedwednesday]
+\setuplabeltext [\s!cn] [\v!thursday=\cnencoding\cnencodedthursday ]
+\setuplabeltext [\s!cn] [\v!friday=\cnencoding\cnencodedfriday ]
+\setuplabeltext [\s!cn] [\v!saturday=\cnencoding\cnencodedsaturday ]
+
+\stoplanguagespecifics
+
+%D One can specify a split labeltext, as demonstrated in
+%D the definition of the \type {part} label. Unfortunately
+%D the glyphs of both part depend on the encoding. Therefore,
+%D we have an encoding section here.
+
+\unexpanded\def\cnencoding{\enableencoding[\chineseencoding]} % ugly and temporary
+
+\startencoding[cjk-uni]
+ \definecommand cnleftsentence {\uchar{32}{20}\uchar{32}{20}}
+ \definecommand cnrightsentence {\uchar{32}{20}\uchar{32}{20}}
+ \definecommand cnleftsubsentence {\uchar{32}{20}\uchar{32}{20}}
+ \definecommand cnrightsubsentence {\uchar{32}{20}\uchar{32}{20}}
+ \definecommand cnupperleftsinglequote {\uchar{32}{24}}
+ \definecommand cnupperrightsinglequote {\uchar{32}{25}}
+ \definecommand cnupperleftdoublequote {\uchar{32}{28}}
+ \definecommand cnupperrightdoublequote {\uchar{32}{29}}
+ \definecommand cnupperleftsinglequote-v {\uchar{48}{12}}
+ \definecommand cnupperrightsinglequote-v {\uchar{48}{13}}
+ \definecommand cnupperleftdoublequote-v {\uchar{48}{14}}
+ \definecommand cnupperrightdoublequote-v {\uchar{48}{15}}
+ \definecommand cnencodedcontents {\uchar{118}{238}\uchar{95}{85}}
+ \definecommand cnencodedtables {\uchar{136}{104}\uchar{104}{60}}
+ \definecommand cnencodedfigures {\uchar{86}{254}\uchar{95}{98}}
+ \definecommand cnencodedindex {\uchar{125}{34}\uchar{95}{21}}
+ \definecommand cnencodedabbreviations {\uchar{127}{41}\uchar{117}{101}\uchar{139}{237}}
+ \definecommand cnencodedlogos {\uchar{95}{189}\uchar{141}{44}}
+ \definecommand cnencodedunits {\uchar{139}{161}\uchar{145}{207}\uchar{83}{85}\uchar{79}{77}}
+ \definecommand cnencodedtable {\uchar{136}{104}}
+ \definecommand cnencodedfigure {\uchar{86}{254}}
+ \definecommand cnencodedintro {\uchar{123}{44}}
+ \definecommand cnencodedpart {\uchar{144}{232}\uchar{82}{6}}
+ \definecommand cnencodedchapter {\uchar{122}{224}}
+ \definecommand cnencodedsection {\uchar{130}{130}}
+ \definecommand cnencodedjanuary {\uchar{78}{0}\uchar{103}{8}}
+ \definecommand cnencodedfebrary {\uchar{78}{140}\uchar{103}{8}}
+ \definecommand cnencodedmarch {\uchar{78}{9}\uchar{103}{8}}
+ \definecommand cnencodedapril {\uchar{86}{219}\uchar{103}{8}}
+ \definecommand cnencodedmay {\uchar{78}{148}\uchar{103}{8}}
+ \definecommand cnencodedjune {\uchar{81}{109}\uchar{103}{8}}
+ \definecommand cnencodedjuly {\uchar{78}{3}\uchar{103}{8}}
+ \definecommand cnencodedaugust {\uchar{81}{107}\uchar{103}{8}}
+ \definecommand cnencodedseptember {\uchar{78}{93}\uchar{103}{8}}
+ \definecommand cnencodedoctober {\uchar{83}{65}\uchar{103}{8}}
+ \definecommand cnencodednovember {\uchar{83}{65}\uchar{78}{0}\uchar{103}{8}}
+ \definecommand cnencodeddecember {\uchar{83}{65}\uchar{78}{140}\uchar{103}{8}}
+ \definecommand cnencodedsunday {\uchar{102}{31}\uchar{103}{31}\uchar{101}{229}}
+ \definecommand cnencodedmonday {\uchar{102}{31}\uchar{103}{31}\uchar{78}{0}}
+ \definecommand cnencodedtuesday {\uchar{102}{31}\uchar{103}{31}\uchar{78}{140}}
+ \definecommand cnencodedwednesday {\uchar{102}{31}\uchar{103}{31}\uchar{78}{9}}
+ \definecommand cnencodedthursday {\uchar{102}{31}\uchar{103}{31}\uchar{86}{219}}
+ \definecommand cnencodedfriday {\uchar{102}{31}\uchar{103}{31}\uchar{78}{148}}
+ \definecommand cnencodedsaturday {\uchar{102}{31}\uchar{103}{31}\uchar{81}{109}}
+ % RG & XJF
+ \definecommand cnencodedgraphics {\uchar{86}{254}}
+ \definecommand cnencodedintermezzo {\uchar{210}{99}\uchar{242}{102}}
+ \definecommand cnencodedillustration {\uchar{99}{210}\uchar{86}{254}}
+ \definecommand cnencodedappendix {\uchar{150}{68}\uchar{95}{85}}
+ \definecommand cnencodedline {\uchar{136}{76}}
+ % Tobias Burnus & XJF
+ \definecommand cnyear {\uchar{94}{116}}
+ \definecommand cnmonth {\uchar{103}{8}}
+ \definecommand cnday {\uchar{101}{229}}
+\stopencoding
+
+\startencoding[gbk]
+ \definecommand cnleftsentence {\uchar{161}{170}\uchar{161}{170}}
+ \definecommand cnrightsentence {\uchar{161}{170}\uchar{161}{170}}
+ \definecommand cnleftsubsentence {\uchar{161}{170}\uchar{161}{170}}
+ \definecommand cnrightsubsentence {\uchar{161}{170}\uchar{161}{170}}
+ \definecommand cnupperleftsinglequote {\uchar{161}{174}}
+ \definecommand cnupperrightsinglequote {\uchar{161}{175}}
+ \definecommand cnupperleftdoublequote {\uchar{161}{176}}
+ \definecommand cnupperrightdoublequote {\uchar{161}{177}}
+ \definecommand cnupperleftsinglequote-v {\uchar{161}{184}}
+ \definecommand cnupperrightsinglequote-v {\uchar{161}{185}}
+ \definecommand cnupperleftdoublequote-v {\uchar{161}{186}}
+ \definecommand cnupperrightdoublequote-v {\uchar{161}{187}}
+ \definecommand cnencodedcontents {\uchar{196}{191}\uchar{194}{188}}
+ \definecommand cnencodedtables {\uchar{177}{237}\uchar{184}{241}}
+ \definecommand cnencodedfigures {\uchar{205}{188}\uchar{208}{206}}
+ \definecommand cnencodedindex {\uchar{203}{247}\uchar{210}{253}}
+ \definecommand cnencodedabbreviations {\uchar{203}{245}\uchar{194}{212}\uchar{211}{239}}
+ \definecommand cnencodedlogos {\uchar{187}{213}\uchar{177}{225}}
+ \definecommand cnencodedunits {\uchar{188}{198}\uchar{193}{191}\uchar{181}{165}\uchar{206}{187}}
+ \definecommand cnencodedtable {\uchar{177}{237}}
+ \definecommand cnencodedfigure {\uchar{205}{188}}
+ \definecommand cnencodedintro {\uchar{181}{218}}
+ \definecommand cnencodedpart {\uchar{178}{191}\uchar{183}{214}}
+ \definecommand cnencodedchapter {\uchar{213}{194}}
+ \definecommand cnencodedsection {\uchar{189}{218}}
+ \definecommand cnencodedjanuary {\uchar{210}{187}\uchar{212}{194}}
+ \definecommand cnencodedfebrary {\uchar{182}{254}\uchar{212}{194}}
+ \definecommand cnencodedmarch {\uchar{200}{253}\uchar{212}{194}}
+ \definecommand cnencodedapril {\uchar{203}{196}\uchar{212}{194}}
+ \definecommand cnencodedmay {\uchar{206}{229}\uchar{212}{194}}
+ \definecommand cnencodedjune {\uchar{193}{249}\uchar{212}{194}}
+ \definecommand cnencodedjuly {\uchar{198}{223}\uchar{212}{194}}
+ \definecommand cnencodedaugust {\uchar{176}{203}\uchar{212}{194}}
+ \definecommand cnencodedseptember {\uchar{190}{197}\uchar{212}{194}}
+ \definecommand cnencodedoctober {\uchar{202}{174}\uchar{212}{194}}
+ \definecommand cnencodednovember {\uchar{202}{174}\uchar{210}{187}\uchar{212}{194}}
+ \definecommand cnencodeddecember {\uchar{202}{174}\uchar{182}{254}\uchar{212}{194}}
+ \definecommand cnencodedsunday {\uchar{208}{199}\uchar{198}{218}\uchar{200}{213}}
+ \definecommand cnencodedmonday {\uchar{208}{199}\uchar{198}{218}\uchar{210}{187}}
+ \definecommand cnencodedtuesday {\uchar{208}{199}\uchar{198}{218}\uchar{182}{254}}
+ \definecommand cnencodedwednesday {\uchar{208}{199}\uchar{198}{218}\uchar{200}{253}}
+ \definecommand cnencodedthursday {\uchar{208}{199}\uchar{198}{218}\uchar{203}{196}}
+ \definecommand cnencodedfriday {\uchar{208}{199}\uchar{198}{218}\uchar{206}{229}}
+ \definecommand cnencodedsaturday {\uchar{208}{199}\uchar{198}{218}\uchar{193}{249}}
+ % RG & XJF
+ \definecommand cnencodedgraphics {\uchar{205}{188}}
+ \definecommand cnencodedintermezzo {\uchar{178}{229}\uchar{199}{250}}
+ \definecommand cnencodedillustration {\uchar{178}{229}\uchar{205}{188}}
+ \definecommand cnencodedappendix {\uchar{184}{189}\uchar{194}{188}}
+ \definecommand cnencodedline {\uchar{208}{208}}
+ % Tobias Burnus & XJF
+ \definecommand cnyear {\uchar{196}{234}}
+ \definecommand cnmonth {\uchar{212}{194}}
+ \definecommand cnday {\uchar{200}{213}}
+\stopencoding
+
+\startencoding[big5]
+ \definecommand cnleftsentence {\uchar{162}{119}\uchar{162}{119}}
+ \definecommand cnrightsentence {\uchar{162}{119}\uchar{162}{119}}
+ \definecommand cnleftsubsentence {\uchar{162}{119}\uchar{162}{119}}
+ \definecommand cnrightsubsentence {\uchar{162}{119}\uchar{162}{119}}
+ \definecommand cnupperleftsinglequote {\uchar{161}{165}}
+ \definecommand cnupperrightsinglequote {\uchar{161}{166}}
+ \definecommand cnupperleftdoublequote {\uchar{161}{167}}
+ \definecommand cnupperrightdoublequote {\uchar{161}{168}}
+ \definecommand cnupperleftsinglequote-v {\uchar{161}{117}}
+ \definecommand cnupperrightsinglequote-v {\uchar{161}{118}}
+ \definecommand cnupperleftdoublequote-v {\uchar{161}{121}}
+ \definecommand cnupperrightdoublequote-v {\uchar{161}{122}}
+ \definecommand cnencodecontents {\uchar{165}{216}\uchar{191}{253}}
+ \definecommand cnencodetables {\uchar{170}{237}\uchar{174}{230}}
+ \definecommand cnencodefigures {\uchar{185}{207}\uchar{167}{206}}
+ \definecommand cnencodeindex {\uchar{175}{193}\uchar{174}{222}}
+ \definecommand cnencodeabbreviations {\uchar{191}{89}\uchar{178}{164}\uchar{187}{121}}
+ \definecommand cnencodelogos {\uchar{192}{178}\uchar{188}{208}}
+ \definecommand cnencodeunits {\uchar{173}{112}\uchar{182}{113}\uchar{179}{230}\uchar{166}{236}}
+ \definecommand cnencodetable {\uchar{170}{237}}
+ \definecommand cnencodefigure {\uchar{185}{207}}
+ \definecommand cnencodedintro {\uchar{178}{196}}
+ \definecommand cnencodedpart {\uchar{179}{161}\uchar{164}{192}}
+ \definecommand cnencodedchapter {\uchar{179}{185}}
+ \definecommand cnencodedsection {\uchar{184} {96}}
+ \definecommand cnencodedjanuary {\uchar{164} {64}\uchar{164}{235}}
+ \definecommand cnencodedfebrary {\uchar{164} {71}\uchar{164}{235}}
+ \definecommand cnencodedmarch {\uchar{164} {84}\uchar{164}{235}}
+ \definecommand cnencodedapril {\uchar{165}{124}\uchar{164}{235}}
+ \definecommand cnencodedmay {\uchar{164}{173}\uchar{164}{235}}
+ \definecommand cnencodedjune {\uchar{164}{187}\uchar{164}{235}}
+ \definecommand cnencodedjuly {\uchar{164} {67}\uchar{164}{235}}
+ \definecommand cnencodedaugust {\uchar{164} {75}\uchar{164}{235}}
+ \definecommand cnencodedseptember {\uchar{164} {69}\uchar{164}{235}}
+ \definecommand cnencodedoctober {\uchar{164} {81}\uchar{164}{235}}
+ \definecommand cnencodednovember {\uchar{164} {81}\uchar{164} {64}\uchar{164}{235}}
+ \definecommand cnencodeddecember {\uchar{164} {81}\uchar{164} {71}\uchar{164}{235}}
+ \definecommand cnencodedsunday {\uchar{172} {80}\uchar{180}{193}\uchar{164}{233}}
+ \definecommand cnencodedmonday {\uchar{172} {80}\uchar{180}{193}\uchar{164} {64}}
+ \definecommand cnencodedtuesday {\uchar{172} {80}\uchar{180}{193}\uchar{164} {71}}
+ \definecommand cnencodedwednesday {\uchar{172} {80}\uchar{180}{193}\uchar{164} {84}}
+ \definecommand cnencodedthursday {\uchar{172} {80}\uchar{180}{193}\uchar{165}{124}}
+ \definecommand cnencodedfriday {\uchar{172} {80}\uchar{180}{193}\uchar{164}{173}}
+ \definecommand cnencodedsaturday {\uchar{172} {80}\uchar{180}{193}\uchar{164}{187}}
+ % Tobias Burnus &\XJF
+ \definecommand cnyear {\uchar{166}{126}}
+ \definecommand cnmonth {\uchar{164}{235}}
+ \definecommand cnday {\uchar{164}{233}}
+
+% Traditional Chinese characters (only where they differ to the
+% simplified ones) for lang-chi.tex and font-chi.tex.
+
+% \startencoding[cjk-uni]
+% \defineudigit 10000 132 44
+% \defineudigit 100000000 81 4
+
+% \definecommand cnencodedsection {\uchar{123}{192}}
+% \definecommand cnencodedfigure {\uchar{87}{22}}
+% \definecommand cnencodedunits {\uchar{138}{8}\uchar{145}{207}\uchar{85}{174}\uchar{79}{77}}
+% \definecommand cnencodedlogos {\uchar{95}{189}\uchar{140}{182}}
+% \definecommand cnencodedabbreviations {\uchar{126}{46}\uchar{117}{101}\uchar{138}{158}}
+% \definecommand cnencodedfigures {\uchar{87}{22}\uchar{95}{98}}
+% \definecommand cnencodedcontents {\uchar{118}{238}\uchar{147}{4}}
+% \stopencoding
+
+% \startencoding[gbk]
+% \defineudigit 10000 200 102
+% \defineudigit 100000000 131 124
+
+% \definecommand cnencodedsection {\uchar{185}{157}}
+% \definecommand cnencodedfigure {\uchar{136}{68}}
+% \definecommand cnencodedunits {\uchar{211}{139}\uchar{193}{191}\uchar{134}{206}\uchar{206}{187}}
+% \definecommand cnencodedlogos {\uchar{187}{213}\uchar{217}{72}
+% \definecommand cnencodedabbreviations {\uchar{191}{115}\uchar{194}{212}\uchar{213}{90}}
+% \definecommand cnencodedfigures {\uchar{136}{68}\uchar{208}{206}}
+% \definecommand cnencodedcontents {\uchar{196}{191}\uchar{228}{155}}
+% \stopencoding
+
+% \startencoding[big5]
+% \defineudigit 10000 184 85
+% \defineudigit 100000000 187 245
+
+% \definecommand cnencodedsection {\uchar{184}{96}}
+% \definecommand cnencodedfigure {\uchar{185}{207}}
+% \definecommand cnencodedunits {\uchar{173}{112}\uchar{182}{113}\uchar{179}{230}\uchar{166}{236}}
+% \definecommand cnencodedlogos {\uchar{192}{178}\uchar{182}{83}}
+% \definecommand cnencodedabbreviations {\uchar{193}{89}\uchar{178}{164}\uchar{187}{121}}
+% \definecommand cnencodedfigures {\uchar{185}{207}\uchar{167}{206}}
+% \definecommand cnencodedcontents {\uchar{165}{216}\uchar{191}{253}}
+% \stopencoding
+
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/lang-cjk.mkiv b/tex/context/base/lang-cjk.mkiv
new file mode 100644
index 000000000..5f736d4a1
--- /dev/null
+++ b/tex/context/base/lang-cjk.mkiv
@@ -0,0 +1,328 @@
+%D \module
+%D [ file=lang-chi,
+%D version=2009.03.02,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Chinese,
+%D author={Hans Hagen \& Wang Lei},
+%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 Derived from \MKII\ files.
+
+\writestatus{loading}{ConTeXt Language Macros / CJK}
+
+\definesystemconstant {chinese} \definesystemconstant {cn}
+\definesystemconstant {japanese} \definesystemconstant {ja}
+\definesystemconstant {korean} \definesystemconstant {kr}
+
+\unprotect
+
+% Chinese
+
+\installlanguage
+ [\s!cn]
+ [\c!leftsentence=——,
+ \c!rightsentence=——,
+ \c!leftsubsentence=——,
+ \c!rightsubsentence=——,
+ \c!leftquote=‘,
+ \c!rightquote=’,
+ \c!leftquotation=“,
+ \c!rightquotation=”,
+ \c!date={\v!year,年,\ ,\v!month,\v!day,日}]
+
+\setupheadtext [\s!cn] [\v!content=目录]
+\setupheadtext [\s!cn] [\v!tables=表格]
+\setupheadtext [\s!cn] [\v!figures=图形]
+\setupheadtext [\s!cn] [\v!graphics=图]
+\setupheadtext [\s!cn] [\v!intermezzi=퉣]
+\setupheadtext [\s!cn] [\v!index=索引]
+\setupheadtext [\s!cn] [\v!abbreviations=缩略语]
+\setupheadtext [\s!cn] [\v!logos=徽贬]
+\setupheadtext [\s!cn] [\v!units=计量单位]
+
+\setuplabeltext [\s!cn] [\v!table=表]
+\setuplabeltext [\s!cn] [\v!figure=图]
+\setuplabeltext [\s!cn] [\v!intermezzo=퉣]
+\setuplabeltext [\s!cn] [\v!graphic=插图]
+\setuplabeltext [\s!cn] [\v!appendix=附录]
+\setuplabeltext [\s!cn] [\v!part={第,部分}]
+\setuplabeltext [\s!cn] [\v!chapter={第,章}]
+\setuplabeltext [\s!cn] [\v!section={第,节}]
+\setuplabeltext [\s!cn] [\v!line=行]
+\setuplabeltext [\s!cn] [\v!lines=行]
+
+\setuplabeltext [\s!cn] [\v!subsection=]
+\setuplabeltext [\s!cn] [\v!subsubsection=]
+\setuplabeltext [\s!cn] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!cn] [\v!january=一月]
+\setuplabeltext [\s!cn] [\v!february=二月]
+\setuplabeltext [\s!cn] [\v!march=三月]
+\setuplabeltext [\s!cn] [\v!april=四月]
+\setuplabeltext [\s!cn] [\v!may=五月]
+\setuplabeltext [\s!cn] [\v!june=六月]
+\setuplabeltext [\s!cn] [\v!july=七月]
+\setuplabeltext [\s!cn] [\v!august=八月]
+\setuplabeltext [\s!cn] [\v!september=九月]
+\setuplabeltext [\s!cn] [\v!october=十月]
+\setuplabeltext [\s!cn] [\v!november=十一月]
+\setuplabeltext [\s!cn] [\v!december=十二月]
+
+\setuplabeltext [\s!cn] [\v!sunday=星期日]
+\setuplabeltext [\s!cn] [\v!monday=星期一]
+\setuplabeltext [\s!cn] [\v!tuesday=星期二]
+\setuplabeltext [\s!cn] [\v!wednesday=星期三]
+\setuplabeltext [\s!cn] [\v!thursday=星期四]
+\setuplabeltext [\s!cn] [\v!friday=星期五]
+\setuplabeltext [\s!cn] [\v!saturday=星期六]
+
+%D Japanese
+
+\installlanguage
+ [\s!ja]
+ [\c!leftsentence=——,
+ \c!rightsentence=——,
+ \c!leftsubsentence=——,
+ \c!rightsubsentence=——,
+ \c!leftquote=‘,
+ \c!rightquote=’,
+ \c!leftquotation=「,
+ \c!rightquotation=」,
+ \c!date={西暦,\v!year,年,\v!month,月,\v!day,日}]
+
+\setupheadtext [\s!ja] [\v!content=目次]
+\setupheadtext [\s!ja] [\v!tables=机]
+\setupheadtext [\s!ja] [\v!figures=図]
+\setupheadtext [\s!ja] [\v!graphics=グラフ]
+\setupheadtext [\s!ja] [\v!intermezzi=間奏曲]
+\setupheadtext [\s!ja] [\v!index=目次]
+\setupheadtext [\s!ja] [\v!abbreviations=略語]
+\setupheadtext [\s!ja] [\v!logos=理性]
+\setupheadtext [\s!ja] [\v!units=ユニッツ]
+
+\setuplabeltext [\s!ja] [\v!table=表]
+\setuplabeltext [\s!ja] [\v!figure=図]
+\setuplabeltext [\s!ja] [\v!intermezzo=間奏曲]
+\setuplabeltext [\s!ja] [\v!graphic=イラスト]
+\setuplabeltext [\s!ja] [\v!appendix=付録]
+\setuplabeltext [\s!ja] [\v!part={第,パート}]
+\setuplabeltext [\s!ja] [\v!chapter={第,章}]
+\setuplabeltext [\s!ja] [\v!section={第,項}]
+\setuplabeltext [\s!ja] [\v!line=線]
+\setuplabeltext [\s!ja] [\v!lines=線]
+
+\setuplabeltext [\s!ja] [\v!subsection=]
+\setuplabeltext [\s!ja] [\v!subsubsection=]
+\setuplabeltext [\s!ja] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!ja] [\v!january=1]
+\setuplabeltext [\s!ja] [\v!february=2]
+\setuplabeltext [\s!ja] [\v!march=3]
+\setuplabeltext [\s!ja] [\v!april=4]
+\setuplabeltext [\s!ja] [\v!may=5]
+\setuplabeltext [\s!ja] [\v!june=6]
+\setuplabeltext [\s!ja] [\v!july=7]
+\setuplabeltext [\s!ja] [\v!august=8]
+\setuplabeltext [\s!ja] [\v!september=9]
+\setuplabeltext [\s!ja] [\v!october=10]
+\setuplabeltext [\s!ja] [\v!november=11]
+\setuplabeltext [\s!ja] [\v!december=12]
+
+\setuplabeltext [\s!ja] [\v!monday=月曜日]
+\setuplabeltext [\s!ja] [\v!tuesday=火曜日]
+\setuplabeltext [\s!ja] [\v!wednesday=水曜日]
+\setuplabeltext [\s!ja] [\v!thursday=木曜日]
+\setuplabeltext [\s!ja] [\v!friday=金曜日]
+\setuplabeltext [\s!ja] [\v!saturday=土曜日]
+\setuplabeltext [\s!ja] [\v!sunday=日曜日]
+
+%D Korean
+
+% todo
+
+\protect \endinput
+
+cn={
+ ["abbreviations"]="缩略语",
+ ["appendix"]="附录",
+ ["april"]="四月",
+ ["august"]="八月",
+ ["chapter"]="章",
+ ["contents"]="目录",
+ ["day"]="日",
+ ["december"]="十二月",
+ ["febrary"]="二月",
+ ["figure"]="图",
+ ["figures"]="图形",
+ ["friday"]="星期五",
+ ["graphics"]="图",
+ ["illustration"]="插图",
+ ["index"]="索引",
+ ["intermezzo"]="퉣",
+ ["intro"]="第",
+ ["january"]="一月",
+ ["july"]="七月",
+ ["june"]="六月",
+ ["leftsentence"]="——",
+ ["leftsubsentence"]="——",
+ ["line"]="行",
+ ["logos"]="徽贬",
+ ["march"]="三月",
+ ["may"]="五月",
+ ["monday"]="星期一",
+ ["month"]="月",
+ ["november"]="十一月",
+ ["october"]="十月",
+ ["part"]="部分",
+ ["rightsentence"]="——",
+ ["rightsubsentence"]="——",
+ ["saturday"]="星期六",
+ ["section"]="节",
+ ["september"]="九月",
+ ["sunday"]="星期日",
+ ["table"]="表",
+ ["tables"]="表格",
+ ["thursday"]="星期四",
+ ["tuesday"]="星期二",
+ ["units"]="计量单位",
+ ["upperleftdoublequote"]="“",
+ ["upperleftdoublequote-v"]="『",
+ ["upperleftsinglequote"]="‘",
+ ["upperleftsinglequote-v"]="「",
+ ["upperrightdoublequote"]="”",
+ ["upperrightdoublequote-v"]="』",
+ ["upperrightsinglequote"]="’",
+ ["upperrightsinglequote-v"]="」",
+ ["wednesday"]="星期三",
+ ["year"]="年",
+}
+
+ja={
+ ["abbreviations"]="略語",
+ ["abstract"]="概要",
+ ["and"]="、",
+ ["answer"]="答:",
+ ["appendix"]="付録",
+ ["april"]="四月",
+ ["article"]="項目",
+ ["august"]="八月",
+ ["bibliography"]="参考文献",
+ ["book"]="ブック",
+ ["bridgehead"]="項",
+ ["bullet"]="●",
+ ["by"]=":",
+ ["caution"]="注意",
+ ["chapter"]="章",
+ ["christiandate"]="西暦",
+ ["colophon"]="奥付",
+ ["copyright"]="製作著作",
+ ["day"]="日",
+ ["december"]="十二月",
+ ["dedication"]="謝辞",
+ ["edited"]="編者",
+ ["editedby"]="編者:",
+ ["edition"]="編集",
+ ["endquote"]="」",
+ ["equation"]="式",
+ ["example"]="例",
+ ["february"]="二月",
+ ["figure"]="図",
+ ["figures"]="図",
+ ["friday"]="土曜日",
+ ["glossary"]="用語集",
+ ["glosssee"]="参照",
+ ["glossseealso"]="参照",
+ ["graphics"]="グラフ",
+ ["illustration"]="イラスト",
+ ["important"]="重要項目",
+ ["index"]="目次",
+ ["indexsymbols"]="シンボル",
+ ["intermezzo"]="間奏曲",
+ ["intermezzos"]="間奏曲",
+ ["intro"]="第",
+ ["january"]="一月",
+ ["july"]="七月",
+ ["june"]="六月",
+ ["leftsentence"]="——",
+ ["leftsubsentence"]="——",
+ ["line"]="線",
+ ["lines"]="線",
+ ["listofequations"]="式目次",
+ ["listofexamples"]="例目次",
+ ["listoffigures"]="図目次",
+ ["listoftables"]="表目次",
+ ["listofunknown"]="不明目次",
+ ["logos"]="理性",
+ ["march"]="三月",
+ ["may"]="五月",
+ ["monday"]="火曜日",
+ ["month"]="月",
+ ["msgaud"]="対象者",
+ ["msglevel"]="レベル",
+ ["msgorig"]="発信元",
+ ["navhome"]="ホーム",
+ ["navnext"]="次のページ",
+ ["navnextsibling"]="早送り",
+ ["navprev"]="前のページ",
+ ["navprevsibling"]="巻戻し",
+ ["navup"]="上に戻る",
+ ["nestedendquote"]="』",
+ ["nestedstartquote"]="『",
+ ["nonexistantelement"]="要素が存在しません",
+ ["note"]="注意",
+ ["notes"]="注意",
+ ["november"]="十一月",
+ ["october"]="十月",
+ ["pages"]="偧献",
+ ["part"]="パート",
+ ["preface"]="序文",
+ ["procedure"]="手順",
+ ["procedureformal"]="手順",
+ ["productionset"]="プロダクション",
+ ["productionsetformal"]="プロダクション",
+ ["published"]="発行",
+ ["qandadiv"]="問:、答:",
+ ["qandaentry"]="問:",
+ ["question"]="問:",
+ ["reference"]="参照",
+ ["refname"]="名前",
+ ["refsection"]="項",
+ ["refsynopsisdiv"]="概要",
+ ["revhistory"]="改訂履歴",
+ ["revision"]="改訂",
+ ["rightsentence"]="——",
+ ["rightsubsentence"]="——",
+ ["saturday"]="日曜日",
+ ["section"]="項",
+ ["see"]="参照",
+ ["seealso"]="参照",
+ ["separator"]="、",
+ ["september"]="九月",
+ ["set"]="設定",
+ ["setindex"]="目次設定",
+ ["sidebar"]="サイドバー",
+ ["simplesect"]="項",
+ ["singleendquote"]="’",
+ ["singlestartquote"]="‘",
+ ["startquote"]="「",
+ ["step"]="ステップ",
+ ["sunday"]="月曜日",
+ ["table"]="表",
+ ["tablenotes"]="注意",
+ ["tableofcontents"]="目次",
+ ["tables"]="机",
+ ["thursday"]="金曜日",
+ ["tip"]="ティップ",
+ ["tuesday"]="水曜日",
+ ["unexpectedelementname"]="不明な要素名",
+ ["units"]="ユニッツ",
+ ["unsupported"]="サポートしません",
+ ["warning"]="警告",
+ ["wednesday"]="木曜日",
+ ["year"]="年",
+}
diff --git a/tex/context/base/lang-ctx.mkii b/tex/context/base/lang-ctx.mkii
new file mode 100644
index 000000000..09f28dda1
--- /dev/null
+++ b/tex/context/base/lang-ctx.mkii
@@ -0,0 +1,53 @@
+%D \module
+%D [ file=lang-ctx,
+%D version=2005.02.12,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Generic Patterns,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Generic Patterns}
+
+\unprotect
+
+%D The \CONTEXT\ specific patterns are more generic and
+%D are more or less encoding independent. They are generated
+%D from the ones shipped with distributions using:
+%D
+%D \starttyping
+%D ctxtools --pattern --all
+%D \stoptyping
+
+%D In order to get 8 bit characters hyphenated, we need to load
+%D patterns under the right circumstances. In some countries, more
+%D than one font encoding is in use. I can add more defaults here
+%D if users let me know what encoding they use.
+
+% \installlanguage [\s!nl] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!fr] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!de] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!it] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!pt] [\s!mapping={texnansi,ec},\s!encoding={texnansi,ec}]
+% \installlanguage [\s!hr] [\s!mapping=ec,\s!encoding=ec] % no il2, misses cacute characters
+% \installlanguage [\s!pl] [\s!mapping={pl0,ec,qx},\s!encoding={pl0,ec,qx}] % pl0 may go
+% \installlanguage [\s!cs] [\s!mapping={il2,ec},\s!encoding={il2,ec}] % il2 may go
+% \installlanguage [\s!sk] [\s!mapping={il2,ec},\s!encoding={il2,ec}] % il2 may go
+% \installlanguage [\s!sl] [\s!mapping=ec,\s!encoding=ec] % il2 has gone
+% \installlanguage [\s!vi] [\s!mapping=t5,\s!encoding=t5]
+% \installlanguage [\s!ru] [\s!mapping=t2a,\s!encoding=t2a]
+
+% beware, don't use \setuplanguage here
+
+% \installlanguage[\s!gb][\s!lefthyphenmin=3,\s!righthyphenmin=3] % patterns can only handle this
+% \installlanguage[\s!us][\s!lefthyphenmin=2,\s!righthyphenmin=3] % patterns can only handle this
+
+% greek
+
+% \installlanguage[\s!agr][\s!mapping=\s!agr,\s!encoding=\s!agr]
+
+\protect \endinput
diff --git a/tex/context/base/lang-cyr.tex b/tex/context/base/lang-cyr.tex
new file mode 100644
index 000000000..470402bb1
--- /dev/null
+++ b/tex/context/base/lang-cyr.tex
@@ -0,0 +1,371 @@
+%D \module
+%D [ file=lang-cyr,
+%D version=2003.01.24,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Cyrillic Languages,
+%D author=see below,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Cyrillic Languages}
+
+%D The cyrillic languages always use a dedicated input regime.
+%D Therefore we define the labels using symbolic names.
+%D Support for cyrillic is initiated by Olga Briginets who
+%D also layed the base for the language, encoding and font
+%D definition. Later Alexander Bokovoy and Victor Figurnov
+%D improved things. I (Hans Hagen) mainly cleaned things up
+%D a bit.
+
+\unprotect
+
+\installlanguage
+ [\s!ru]
+ [\s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \c!spacing=\v!packed,
+ \c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\lowerleftdoubleninequote,
+ \c!rightsubsentence=\upperrightdoubleninequote,
+ \c!leftquote=\lowerleftdoubleninequote,
+ \c!rightquote=\upperrightdoubleninequote,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year},
+ \s!mapping=t2a,
+ \s!encoding=t2a]
+
+\installlanguage
+ [\s!ua]
+ [\s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \c!spacing=\v!packed,
+ \c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\lowerleftdoubleninequote,
+ \c!rightsubsentence=\upperrightdoubleninequote,
+ \c!leftquote=\lowerleftdoubleninequote,
+ \c!rightquote=\upperrightdoubleninequote,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year},
+ \s!patterns=\s!uk,
+ \s!mapping=t2a,
+ \s!encoding=t2a]
+
+\installlanguage [russian] [\s!ru]
+\installlanguage [ukrainian] [\s!ua]
+
+%D Labels and header texts.
+
+\setupheadtext [\s!ru] [ \v!content=\cyrillicS \cyrillico \cyrillicd
+ \cyrillice \cyrillicr \cyrilliczh
+ \cyrillica \cyrillicn \cyrillici
+ \cyrillice]
+\setupheadtext [\s!ua] [\v!content=\cyrillicZ \cyrillicm \cyrillicii
+ \cyrillics \cyrillict]
+
+\setupheadtext [\s!ru] [\v!tables=\cyrillicS \cyrillicp \cyrillici
+ \cyrillics \cyrillico \cyrillick
+ \space \cyrillict \cyrillica
+ \cyrillicb \cyrillicl \cyrillici
+ \cyrillicc]
+\setupheadtext [\s!ua] [\v!tables=\cyrillicP \cyrillice \cyrillicr
+ \cyrillice \cyrillicl \cyrillicii
+ \cyrillick \space \cyrillict
+ \cyrillica \cyrillicb \cyrillicl
+ \cyrillici \cyrillicc \cyrillicsftsn]
+
+\setupheadtext [\s!ru] [\v!figures=\cyrillicS \cyrillicp \cyrillici
+ \cyrillics \cyrillico \cyrillick
+ \space \cyrillici \cyrillicl
+ \cyrillicl \cyrillicyu\cyrillics
+ \cyrillict \cyrillicr \cyrillica
+ \cyrillicc \cyrillici \cyrillicishrt]
+\setupheadtext [\s!ua] [\v!figures=\cyrillicP \cyrillice \cyrillicr
+ \cyrillice \cyrillicl \cyrillicii
+ \cyrillick \space \cyrillicii
+ \cyrillicl \cyrillicyu\cyrillics
+ \cyrillict \cyrillicr \cyrillica
+ \cyrillicc \cyrillicii\cyrillicishrt]
+
+\setupheadtext [\s!ru] [\v!graphics=\cyrillicS \cyrillicp \cyrillici
+ \cyrillics \cyrillico \cyrillick
+ \space \cyrillicg \cyrillicr
+ \cyrillica \cyrillicf \cyrillici
+ \cyrillick \cyrillico \cyrillicv]
+\setupheadtext [\s!ua] [\v!graphics=\cyrillicP \cyrillice \cyrillicr
+ \cyrillice \cyrillicl \cyrillicii
+ \cyrillick \space \cyrillicg
+ \cyrillicr \cyrillica \cyrillicf
+ \cyrillicii\cyrillick \cyrillico
+ \cyrillicv]
+
+\setupheadtext [\s!ru] [\v!intermezzi=\cyrillicS \cyrillicp \cyrillici
+ \cyrillics \cyrillico \cyrillick
+ \space \cyrillicv \cyrillics
+ \cyrillict \cyrillica \cyrillicv
+ \cyrillico \cyrillick]
+\setupheadtext [\s!ua] [\v!intermezzi=\cyrillicP \cyrillice \cyrillicr
+ \cyrillice \cyrillicl \cyrillicii
+ \cyrillick \space \cyrillicv
+ \cyrillics \cyrillict \cyrillica
+ \cyrillicv \cyrillico \cyrillick]
+
+\setupheadtext [\s!ru] [\v!index=\cyrillicA \cyrillicl \cyrillicf
+ \cyrillica \cyrillicv \cyrillici
+ \cyrillict \cyrillicn \cyrillicery
+ \cyrillicishrt \space \cyrillicu
+ \cyrillick \cyrillica \cyrillicz
+ \cyrillica \cyrillict \cyrillice
+ \cyrillicl \cyrillicsftsn]
+\setupheadtext [\s!ua] [\v!index=\cyrillicP \cyrillico \cyrillick
+ \cyrillica \cyrilliczh\cyrillicch
+ \cyrillici \cyrillick]
+
+\setupheadtext [\s!ru] [\v!abbreviations=\cyrillicS \cyrillicp \cyrillici
+ \cyrillics \cyrillico \cyrillick
+ \space \cyrillics \cyrillico
+ \cyrillick \cyrillicr \cyrillica
+ \cyrillicshch \cyrillice
+ \cyrillicn
+ \cyrillici \cyrillicishrt]
+\setupheadtext [\s!ua] [\v!abbreviations=\cyrillicP \cyrillice \cyrillicr
+ \cyrillice \cyrillicl \cyrillicii
+ \cyrillick \space \cyrillics
+ \cyrillick \cyrillico \cyrillicr
+ \cyrillico \cyrillicch\cyrillice
+ \cyrillicn \cyrillicsftsn]
+
+\setupheadtext [\s!ru] [\v!logos=\cyrillicL \cyrillico \cyrillicg
+ \cyrillico \cyrillict \cyrillici
+ \cyrillicp \cyrillicery]
+\setupheadtext [\s!ua] [\v!logos=\cyrillicL \cyrillico \cyrillicg
+ \cyrillico \cyrillict \cyrillici
+ \cyrillicp \cyrillici]
+
+\setupheadtext [\s!ru] [\v!units=\cyrillicE \cyrillicd \cyrillici
+ \cyrillicn \cyrillici \cyrillicc
+ \cyrillicery \space \cyrillici
+ \cyrillicz \cyrillicm \cyrillice
+ \cyrillicr \cyrillice \cyrillicn
+ \cyrillici \cyrillicya]
+\setupheadtext [\s!ua] [\v!units=\cyrillicO \cyrillicd \cyrillici
+ \cyrillicn \cyrillici \cyrillicc
+ \cyrillicii\space \cyrillicv
+ \cyrillici \cyrillicm \cyrillicii
+ \cyrillicr \cyrillicu]
+
+\setuplabeltext [\s!ru] [\v!table=\cyrillicT \cyrillica \cyrillicb
+ \cyrillicl \cyrillici \cyrillicc
+ \cyrillica \space]
+\setuplabeltext [\s!ua] [\v!table=\cyrillicT \cyrillica \cyrillicb
+ \cyrillicl \cyrillici \cyrillicc
+ \cyrillicya\space]
+
+\setuplabeltext [\s!ru] [\v!figure=\cyrillicR \cyrillici \cyrillics
+ \cyrillicu \cyrillicn \cyrillico
+ \cyrillick \space]
+\setuplabeltext [\s!ua] [\v!figure=\cyrillicM \cyrillica \cyrillicl
+ \cyrillicyu\cyrillicn \cyrillico
+ \cyrillick \space]
+
+\setuplabeltext [\s!ru] [\v!intermezzo=\cyrillicV \cyrillics \cyrillict
+ \cyrillica \cyrillicv \cyrillick
+ \cyrillica \space]
+\setuplabeltext [\s!ua] [\v!intermezzo=\cyrillicV \cyrillics \cyrillict
+ \cyrillica \cyrillicv \cyrillick
+ \cyrillica \space]
+
+\setuplabeltext [\s!ru] [\v!graphic=\cyrillicG \cyrillicr \cyrillica
+ \cyrillicf \cyrillici \cyrillick
+ \space]
+\setuplabeltext [\s!ua] [\v!graphic=\cyrillicG \cyrillicr \cyrillica
+ \cyrillicf \cyrillici \cyrillick
+ \space]
+
+\setuplabeltext [\s!ru] [\v!chapter=]
+\setuplabeltext [\s!ua] [\v!chapter=]
+
+\setuplabeltext [\s!ru] [\v!section=]
+\setuplabeltext [\s!ua] [\v!section=]
+
+\setuplabeltext [\s!ru] [\v!subsection=]
+\setuplabeltext [\s!ua] [\v!subsection=]
+
+\setuplabeltext [\s!ru] [\v!subsubsection=]
+\setuplabeltext [\s!ua] [\v!subsubsection=]
+
+\setuplabeltext [\s!ru] [\v!subsubsubsection=]
+\setuplabeltext [\s!ua] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!ru] [\v!appendix=]
+\setuplabeltext [\s!ua] [\v!appendix=]
+
+\setuplabeltext [\s!ru] [\v!part=\cyrillicCH\cyrillica \cyrillics
+ \cyrillict \cyrillicsftsn
+ \space]
+\setuplabeltext [\s!ua] [\v!part=\cyrillicCH\cyrillica \cyrillics
+ \cyrillict \cyrillici \cyrillicn
+ \cyrillica \space]
+
+\setuplabeltext [\s!ru] [\v!line=\cyrillics \cyrillict \cyrillicr
+ \cyrillico \cyrillick \cyrillica
+ \space]
+\setuplabeltext [\s!ua] [\v!line=\cyrillicr \cyrillicya\cyrillicd
+ \cyrillico \cyrillick \space]
+
+\setuplabeltext [\s!ru] [\v!lines=\cyrillics \cyrillict \cyrillicr
+ \cyrillico \cyrillick \cyrillici
+ \space]
+\setuplabeltext [\s!ua] [\v!lines=\cyrillicr \cyrillicya\cyrillicd
+ \cyrillick \cyrillici \space]
+
+\setuplabeltext [\s!ru] [\v!page=\cyrillics \cyrillict \cyrillicr
+ \cyrillica \cyrillicn \cyrillici
+ \cyrillicc \cyrillica \space]
+\setuplabeltext [\s!ua] [\v!page=\cyrillics \cyrillict \cyrillico
+ \cyrillicr \cyrillicii\cyrillicn
+ \cyrillick \cyrillica \space ]
+
+\setuplabeltext [\s!ru] [\v!atpage=\cyrillicn \cyrillica \space
+ \cyrillics \cyrillict \cyrillicr
+ \cyrillica \cyrillicn \cyrillici
+ \cyrillicc \cyrillice \space]
+\setuplabeltext [\s!ua] [\v!atpage=\cyrillicn \cyrillica \space
+ \cyrillics \cyrillict \cyrillico
+ \cyrillicr \cyrillicii\cyrillicn
+ \cyrillicc \cyrillicii\space ]
+
+\setuplabeltext [\s!ru] [\v!hencefore=\cyrillics \cyrillicm.\space
+ \cyrillicv \cyrillicery \cyrillicsh
+ \cyrillice]
+\setuplabeltext [\s!ua] [\v!hencefore=\cyrillicya\cyrillick \space
+ \cyrillicp \cyrillico \cyrillick
+ \cyrillica \cyrillicz \cyrillica
+ \cyrillicn \cyrillico \space
+ \cyrillicv \cyrillici \cyrillicshch
+ \cyrillice]
+
+\setuplabeltext [\s!ru] [\v!hereafter=\cyrillics \cyrillicm.\space
+ \cyrillicn \cyrillici \cyrilliczh
+ \cyrillice]
+\setuplabeltext [\s!ua] [\v!hereafter=\cyrillicya\cyrillick \space
+ \cyrillicp \cyrillico \cyrillick
+ \cyrillica \cyrillicz \cyrillica
+ \cyrillicn \cyrillico \space
+ \cyrillicn \cyrillici \cyrilliczh
+ \cyrillicch\cyrillice]
+
+\setuplabeltext [\s!ru] [\v!see=\cyrillics \cyrillicm.\space]
+\setuplabeltext [\s!ua] [\v!see=\cyrillicd \cyrillici
+ \cyrillicv.\space ]
+
+\setuplabeltext [\s!ru] [\v!january=\cyrillicya\cyrillicn \cyrillicv
+ \cyrillica \cyrillicr \cyrillicya]
+\setuplabeltext [\s!ru] [\v!february=\cyrillicf \cyrillice \cyrillicv
+ \cyrillicr \cyrillica \cyrillicl
+ \cyrillicya]
+\setuplabeltext [\s!ru] [\v!march=\cyrillicm \cyrillica \cyrillicr
+ \cyrillict \cyrillica]
+\setuplabeltext [\s!ru] [\v!april=\cyrillica \cyrillicp \cyrillicr
+ \cyrillice \cyrillicl \cyrillicya]
+\setuplabeltext [\s!ru] [\v!may=\cyrillicm \cyrillica \cyrillicya]
+\setuplabeltext [\s!ru] [\v!june=\cyrillici \cyrillicyu\cyrillicn
+ \cyrillicya]
+\setuplabeltext [\s!ru] [\v!july=\cyrillici \cyrillicyu\cyrillicl
+ \cyrillicya]
+\setuplabeltext [\s!ru] [\v!august=\cyrillica \cyrillicv \cyrillicg
+ \cyrillicu \cyrillics \cyrillict
+ \cyrillica]
+\setuplabeltext [\s!ru] [\v!september=\cyrillics \cyrillice \cyrillicn
+ \cyrillict \cyrillicya\cyrillicb
+ \cyrillicr \cyrillicya]
+\setuplabeltext [\s!ru] [\v!october=\cyrillico \cyrillick \cyrillict
+ \cyrillicya\cyrillicb \cyrillicr
+ \cyrillicya]
+\setuplabeltext [\s!ru] [\v!november=\cyrillicn \cyrillico \cyrillicya
+ \cyrillicb \cyrillicr \cyrillicya]
+\setuplabeltext [\s!ru] [\v!december=\cyrillicd \cyrillice \cyrillick
+ \cyrillica \cyrillicb \cyrillicr
+ \cyrillicya]
+
+\setuplabeltext [\s!ua] [\v!january=\cyrillics \cyrillicii\cyrillicch
+ \cyrillicn \cyrillicya]
+\setuplabeltext [\s!ua] [\v!february=\cyrillicl \cyrillicyu\cyrillict
+ \cyrillico \cyrillicg \cyrillico]
+\setuplabeltext [\s!ua] [\v!march=\cyrillicb \cyrillice \cyrillicr
+ \cyrillice \cyrillicz \cyrillicn
+ \cyrillicya]
+\setuplabeltext [\s!ua] [\v!april=\cyrillick \cyrillicv \cyrillicii
+ \cyrillict \cyrillicn \cyrillicya]
+\setuplabeltext [\s!ua] [\v!may=\cyrillict \cyrillicr \cyrillica
+ \cyrillicv \cyrillicn \cyrillicya]
+\setuplabeltext [\s!ua] [\v!june=\cyrillicch\cyrillice \cyrillicr
+ \cyrillicv \cyrillicn \cyrillicya]
+\setuplabeltext [\s!ua] [\v!july=\cyrillicl \cyrillici \cyrillicp
+ \cyrillicn \cyrillicya]
+\setuplabeltext [\s!ua] [\v!august=\cyrillics \cyrillice \cyrillicr
+ \cyrillicp \cyrillicn \cyrillicya]
+\setuplabeltext [\s!ua] [\v!september=\cyrillicv \cyrillice \cyrillicr
+ \cyrillice \cyrillics \cyrillicn
+ \cyrillicya]
+\setuplabeltext [\s!ua] [\v!october=\cyrilliczh\cyrillico \cyrillicv
+ \cyrillict \cyrillicn \cyrillicya]
+\setuplabeltext [\s!ua] [\v!november=\cyrillicl \cyrillici \cyrillics
+ \cyrillict \cyrillico \cyrillicp
+ \cyrillica \cyrillicd \cyrillica]
+\setuplabeltext [\s!ua] [\v!december=\cyrillicg \cyrillicr \cyrillicu
+ \cyrillicd \cyrillicn \cyrillicya]
+
+\setuplabeltext [\s!ru] [\v!sunday=\cyrillicv \cyrillico \cyrillics
+ \cyrillick \cyrillicr \cyrillice
+ \cyrillics \cyrillice \cyrillicn
+ \cyrillicsftsn \cyrillice]
+\setuplabeltext [\s!ru] [\v!monday=\cyrillicp \cyrillico \cyrillicn
+ \cyrillice \cyrillicd \cyrillice
+ \cyrillicl \cyrillicsftsn
+ \cyrillicn \cyrillici \cyrillick]
+\setuplabeltext [\s!ru] [\v!tuesday=\cyrillicv \cyrillict \cyrillico
+ \cyrillicr \cyrillicn \cyrillici
+ \cyrillick]
+\setuplabeltext [\s!ru] [\v!wednesday=\cyrillics \cyrillicr \cyrillice
+ \cyrillicd \cyrillica]
+\setuplabeltext [\s!ru] [\v!thursday=\cyrillicch\cyrillice \cyrillict
+ \cyrillicv \cyrillice \cyrillicr
+ \cyrillicg]
+\setuplabeltext [\s!ru] [\v!friday=\cyrillicp \cyrillicya\cyrillict
+ \cyrillicn \cyrillici \cyrillicc
+ \cyrillica]
+\setuplabeltext [\s!ru] [\v!saturday=\cyrillics \cyrillicu \cyrillicb
+ \cyrillicb \cyrillico \cyrillict
+ \cyrillica]
+
+\setuplabeltext [\s!ua] [\v!sunday=\cyrillicn \cyrillice \cyrillicd
+ \cyrillicii\cyrillicl \cyrillicya]
+\setuplabeltext [\s!ua] [\v!monday=\cyrillicp \cyrillico \cyrillicn
+ \cyrillice \cyrillicd \cyrillicii
+ \cyrillicl \cyrillico \cyrillick]
+\setuplabeltext [\s!ua] [\v!tuesday=\cyrillicv \cyrillicii\cyrillicv
+ \cyrillict \cyrillico \cyrillicr
+ \cyrillico \cyrillick]
+\setuplabeltext [\s!ua] [\v!wednesday=\cyrillics \cyrillice \cyrillicr
+ \cyrillice \cyrillicd \cyrillica]
+\setuplabeltext [\s!ua] [\v!thursday=\cyrillicch\cyrillice \cyrillict
+ \cyrillicv \cyrillice \cyrillicr]
+\setuplabeltext [\s!ua] [\v!friday=\cyrillicp'\cyrillicya\cyrillict
+ \cyrillicn \cyrillici \cyrillicc
+ \cyrillicya]
+\setuplabeltext [\s!ua] [\v!saturday=\cyrillics \cyrillicu \cyrillicb
+ \cyrillico \cyrillict \cyrillica]
+
+
+%D \ShowAllLanguageValues [\s!ru] [russian] {Russian} {doll}
+%D \ShowAllLanguageValues [\s!ua] [ukranian] {Ukranian} {dance}
+
+\protect \endinput
diff --git a/tex/context/base/lang-dis.mkii b/tex/context/base/lang-dis.mkii
new file mode 100644
index 000000000..f081bf4a9
--- /dev/null
+++ b/tex/context/base/lang-dis.mkii
@@ -0,0 +1,59 @@
+%D \module
+%D [ file=lang-dis,
+%D version=2005.02.12,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Distribution Patterns,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This code used to be part of cont-usr.tex but now that we
+%D use more generic pattern files, we decided to isolate these
+%D mappings.
+
+\writestatus{loading}{ConTeXt Language Macros / Distribution Patterns}
+
+%D Hyphenation patterns are normally sought in filed named
+%D \type {lang-xx.pat}. When present on the system, those
+%D patterns take precedence. This list will be adapted to
+%D the actual situation, given that it's noticed.
+
+%D The us/uk hyph 1/2 files will go
+
+\unprotect
+
+% \definefilefallback [lang-ca.pat] [cahyph.tex]
+% \definefilefallback [lang-da.pat] [dkhyph.tex]
+% \definefilefallback [lang-de.pat] [dehyphn.tex]
+% \definefilefallback [lang-es.pat] [eshyph.tex]
+% \definefilefallback [lang-fi.pat] [fihyph.tex]
+% \definefilefallback [lang-fr.pat] [frhyph.tex]
+% \definefilefallback [lang-hr.pat] [hrhyph.tex]
+% \definefilefallback [lang-hu.pat] [huhyph.tex]
+% \definefilefallback [lang-it.pat] [ithyph.tex]
+% \definefilefallback [lang-la.pat] [lahyph7.tex]
+% \definefilefallback [lang-no.pat] [nohyph.tex]
+% \definefilefallback [lang-pl.pat] [plhyph.tex]
+% \definefilefallback [lang-pt.pat] [pthyph.tex]
+% \definefilefallback [lang-ro.pat] [rohyph.tex]
+% \definefilefallback [lang-ru.pat] [ruenhyph.tex]
+% \definefilefallback [lang-sl.pat] [sihyph.tex,slhyph.tex]
+% \definefilefallback [lang-sv.pat] [svhyph.tex,sehyph.tex]
+% \definefilefallback [lang-tr.pat] [tkhyph.tex,trhyph.tex]
+% \definefilefallback [lang-ua.pat] [ukrenhyp.tex]
+% \definefilefallback [lang-uk.pat] [ukhyphen.tex,ukhyph.tex]
+% \definefilefallback [lang-us.pat] [ushyphmax.tex,ushyph.tex,ushyph1.tex,ushyph2.tex,hyphen.tex]
+% \definefilefallback [lang-nl.pat] [nehyph96.tex,dutch96.pat,nehyph.tex]
+% \definefilefallback [lang-cz.pat] [czhyphen.tex,czhyph.pat]
+% \definefilefallback [lang-sk.pat] [skhyphen.tex,skhyph.pat]
+% \definefilefallback [lang-deo.pat] [dehypht.tex]
+
+% \definefilesynonym [lang-af.pat] [lang-nl.pat]
+% \definefilesynonym [lang-en.pat] [lang-us.pat]
+% \definefilesynonym [lang-en.hyp] [lang-us.hyp]
+
+\protect \endinput
diff --git a/tex/context/base/lang-frd.tex b/tex/context/base/lang-frd.tex
new file mode 100644
index 000000000..6cc27080b
--- /dev/null
+++ b/tex/context/base/lang-frd.tex
@@ -0,0 +1,140 @@
+%D \module
+%D [ file=lang-frd,
+%D version=2004.01.15,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Language Frequency Table Data,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is expewrimental work!
+
+% http://www.onzetaal.nl/advies/letterfreq.html
+
+\startcharactertable[nl]
+ \charfreq a 7.47
+ \charfreq b 1.58
+ \charfreq c 1.24
+ \charfreq d 5.93
+ \charfreq e 18.91
+ \charfreq f .81
+ \charfreq g 3.4
+ \charfreq h 2.38
+ \charfreq i 6.5
+ \charfreq j 1.46
+ \charfreq k 2.25
+ \charfreq l 3.57
+ \charfreq m 2.21
+ \charfreq n 10.03
+ \charfreq o 6.06
+ \charfreq p 1.57
+ \charfreq q .009
+ \charfreq r 6.41
+ \charfreq s 3.73
+ \charfreq t 6.79
+ \charfreq u 1.99
+ \charfreq v 2.85
+ \charfreq w 1.52
+ \charfreq x .04
+ \charfreq y .035
+ \charfreq z 1.39
+\stopcharactertable
+
+% http://caislab.icu.ac.kr/course/2001/spring/ice605/down/010306.pdf
+
+% \startcharactertable[en]
+% \charfreq a 8.2
+% \charfreq b 1.5
+% \charfreq c 2.8
+% \charfreq d 4.3
+% \charfreq e 12.7
+% \charfreq f 2.2
+% \charfreq g 2
+% \charfreq h 6.1
+% \charfreq i 7
+% \charfreq j .2
+% \charfreq k .8
+% \charfreq l 4
+% \charfreq m 2.4
+% \charfreq n 6.7
+% \charfreq o 7.5
+% \charfreq p 1.9
+% \charfreq q .1
+% \charfreq r 6
+% \charfreq s 6.3
+% \charfreq t 9.1
+% \charfreq u 2.8
+% \charfreq v 1
+% \charfreq w 2.3
+% \charfreq x .1
+% \charfreq y 2
+% \charfreq z .1
+% \stopcharactertable
+
+% http://www.blankenburg.de/gat/pages/fach/info/analyse2.htm
+
+\startcharactertable[en]
+ \charfreq a 8.04
+ \charfreq b 1.54
+ \charfreq c 3.06
+ \charfreq d 3.99
+ \charfreq e 12.51
+ \charfreq f 2.3
+ \charfreq g 1.96
+ \charfreq h 5.49
+ \charfreq i 7.26
+ \charfreq j .16
+ \charfreq k .67
+ \charfreq l 4.14
+ \charfreq m 2.53
+ \charfreq n 7.09
+ \charfreq o 7.6
+ \charfreq p 2
+ \charfreq q .11
+ \charfreq r 6.12
+ \charfreq s 6.54
+ \charfreq t 9.25
+ \charfreq u 2.71
+ \charfreq v .99
+ \charfreq w 1.92
+ \charfreq x .19
+ \charfreq y 1.73
+ \charfreq z .09
+\stopcharactertable
+
+% http://www.blankenburg.de/gat/pages/fach/info/analyse2.htm
+
+\startcharactertable[de]
+ \charfreq a 6.47
+ \charfreq b 1.93
+ \charfreq c 2.68
+ \charfreq d 4.83
+ \charfreq e 17.48
+ \charfreq f 1.65
+ \charfreq g 3.06
+ \charfreq h 4.23
+ \charfreq i 7.73
+ \charfreq j .27
+ \charfreq k 1.46
+ \charfreq l 3.49
+ \charfreq m 2.58
+ \charfreq n 9.84
+ \charfreq o 2.98
+ \charfreq p .96
+ \charfreq q .02
+ \charfreq r 7.54
+ \charfreq s 6.83
+ \charfreq t 6.13
+ \charfreq u 4.17
+ \charfreq v .94
+ \charfreq w 1.48
+ \charfreq x .04
+ \charfreq y .08
+ \charfreq z 1.14
+\stopcharactertable
+
+\endinput
diff --git a/tex/context/base/lang-frq.tex b/tex/context/base/lang-frq.tex
new file mode 100644
index 000000000..773230e6c
--- /dev/null
+++ b/tex/context/base/lang-frq.tex
@@ -0,0 +1,207 @@
+%D \module
+%D [ file=lang-frq,
+%D version=2004.01.15,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Frequency Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Frequency Tables}
+
+\unprotect
+
+\ifx\s!en\undefined \def\v!en{en} \fi
+\ifx\??lg\undefined \def\??lg{@@lg} \fi
+
+%M \usemodule[layout]
+
+%D \macros
+%D {charwidthmethod}
+%D
+%D This module implements a method for determining the width of an
+%D average character in a language. It uses the dimensions of the
+%D current fonts.
+%D
+%D \def\ShwChrWd#1#2#3%
+%D {\chardef\charwidthmethod#1\relax
+%D \mainlanguage[#2#3]\the\dimexpr(\averagecharwidth)}
+%D
+%D \starttabulate[|c|c|c|c|c|c|]
+%D \HL
+%D \NC \NC\bf0=amount\NC\bf1=.5em\NC2=ex\NC\bf3=frequency\NC\bf4=list\NC\NR
+%D \HL
+%D \NC\bf en\NC\ShwChrWd0en\NC\ShwChrWd1en\NC\ShwChrWd2en\NC\ShwChrWd3en\NC\ShwChrWd4en\NC\NR
+%D \NC\bf nl\NC\ShwChrWd0nl\NC\ShwChrWd1nl\NC\ShwChrWd2nl\NC\ShwChrWd3nl\NC\ShwChrWd4nl\NC\NR
+%D \NC\bf de\NC\ShwChrWd0de\NC\ShwChrWd1de\NC\ShwChrWd2de\NC\ShwChrWd3de\NC\ShwChrWd4de\NC\NR
+%D \HL
+%D \stoptabulate
+%D
+%D Method~1 ignores the widths and assumes that each character has a
+%D width of .5em, which is true for most monospaced fonts. Method~2
+%D takes the x as starting point, and assumes that it's height kind of
+%D matches its width. Method~3 is the best one, and determines the
+%D average width based on the language specific character table.
+%D Method~4 is a mixture between the first two methods: character
+%D specific widths applied to an equal distribution. Method~0 reports
+%D the total count, which normally is~100.
+
+\chardef\charwidthmethod=3 % 0=amount 1=em 2=ex 3=frequency 4=flattened >4=ex
+
+%D \macros
+%D {charwidthlanguage}
+%D
+%D The language used for the calculations is defined as:
+
+\def\charwidthlanguage{\currentmainlanguage}
+
+%D \macros
+%D {charfreq}
+%D
+%D This method comes into action in the following macro:
+
+\def\charfreq#1 #2 % character fraction
+ {+(\ifcase\charwidthmethod
+ #2\dimexpr100\onepoint\relax
+ \or
+ #2\dimexpr.5em\relax % \emwidth/2
+ \or
+ #2\dimexpr\exheight\relax
+ \or
+ #2\fontcharwd\font`#1%
+ \or
+ \dimexpr100\fontcharwd\font`#1/\charactertsize\charwidthlanguage\relax % ugly hack
+ \else
+ #2\dimexpr\exheight\relax
+ \fi)}
+
+%D \macros
+%D {startcharactertable}
+%D
+%D A frequency table is defined with the following macro. The \type
+%D {charfreq} macro is used in this table.
+
+\def\startcharactertable[#1]#2\stopcharactertable % \dimexpr has fuzzy lookahead
+ {\startnointerference
+ \long\setgvalue{\??lg:w:#1}{#2}% the width vector
+ \scratchcounter\zerocount \def\charfreq##1 ##2 {\advance\scratchcounter\plusone} #2%
+ \long\setxvalue{\??lg:c:#1}{\the\scratchcounter}% the character count
+ \stopnointerference}
+
+%D \macros
+%D {charactertable,charactertsize}
+%D
+%D The table content as well as the number of entries can be fetched with
+%D the following two macros. The architecture of the table and calling
+%D macro permits a fully expandable application.
+
+\def\charactertable#1%
+ {\csname\??lg:w:\ifcsname\??lg:w:#1\endcsname#1\else\s!en\fi\endcsname}
+
+\def\charactertsize#1%
+ {\csname\??lg:c:\ifcsname\??lg:c:#1\endcsname#1\else\s!en\fi\endcsname}
+
+%D Although it is of hardly any use, you can inherit a character table:
+%D
+%D \starttyping
+%D \startcharactertable[cz] \charactertable{en} \stopcharactertable
+%D \stoptyping
+%D
+%D We define a default vector with 100\% x's.
+
+\startcharactertable[en] 100 x \stopcharactertable % kind of default
+
+%D \macros
+%D {averagecharwidth}
+%D
+%D This macro reports the average width for the current main
+%D language (\the \dimexpr (\averagecharwidth)).
+
+\def\averagecharwidth{\dimexpr((\zeropoint\charactertable\charwidthlanguage)/100)}
+
+\def\showcharfreq
+ {\hbox\bgroup
+ \charwidthlanguage:%
+ \dostepwiserecurse041%
+ {\chardef\charwidthmethod\recurselevel\relax
+ \enspace\recurselevel/\the\dimexpr(\averagecharwidth)}%
+ \egroup}
+
+%D Just for fun, we show a few frequency tables as graphic (\in {figure}
+%D [fig:charfreq]).
+%D
+%D \startbuffer
+%D \definepalet [charfreq] [en=darkred, nl=darkgreen, de=darkblue]
+%D
+%D \def\charfreq#1 #2 %
+%D {\startMPdrawing
+%D interim linejoin := butt ;
+%D a := ASCII "#1" ;
+%D if (a >= (ASCII "a")) and (a <= (ASCII "z")) :
+%D draw ((0,#2*.25cm)--origin--(0,#2*.5cm))
+%D shifted (a*4mm+o,0)
+%D withpen pencircle scaled .5mm
+%D withcolor c;
+%D fi ;
+%D \stopMPdrawing}
+%D
+%D \resetMPdrawing
+%D \startMPdrawing
+%D numeric a, o ; a := o := 0 ;
+%D color c ; c := .5white ;
+%D string s ; s := "" ;
+%D \stopMPdrawing
+%D
+%D \startMPdrawing o := 0mm ; c := \MPcolor{charfreq:en} ; \stopMPdrawing
+%D \charactertable{en}
+%D
+%D \startMPdrawing o := 1mm ; c := \MPcolor{charfreq:nl} ; \stopMPdrawing
+%D \charactertable{nl}
+%D
+%D \startMPdrawing o := 2mm ; c := \MPcolor{charfreq:de} ; \stopMPdrawing
+%D \charactertable{de}
+%D
+%D \startMPdrawing
+%D for a := ASCII "a" upto ASCII "z" :
+%D draw textext.bot("\strut\tttf " & char a) shifted (a*4mm+1mm,-1mm) ;
+%D endfor ;
+%D \stopMPdrawing
+%D
+%D \MPdrawingdonetrue \getMPdrawing \resetMPdrawing
+%D \stopbuffer
+%D
+%D \placefigure
+%D [here]
+%D [fig:charfreq]
+%D {The character distributions for English, Dutch and German.}
+%D {\getbuffer}
+%D
+%D A few samples of usage of this mechanism are shown below:
+%D
+%D \startbuffer
+%D {\mainlanguage[en]\hsize65\averagecharwidth\mainlanguage[en]\input ward \blank}
+%D {\mainlanguage[nl]\hsize65\averagecharwidth\mainlanguage[en]\input ward \blank}
+%D {\mainlanguage[de]\hsize65\averagecharwidth\mainlanguage[en]\input ward \blank}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D Although the widthts differ, the consequenes for breaking the paragraph
+%D into lines are minimal.
+
+%D \macros
+%D {freezeaveragecharacterwidth}
+%D
+%D This macro can be used to make sure that the width does not change during a
+%D page break when another font is used.
+
+\let\normalaveragecharacterwidth\averagecharacterwidth
+
+\def\freezeaveragecharacterwidth % global
+ {\xdef\averagecharacterwidth{\dimexpr(\the\normalaveragecharacterwidth)}}
+
+\protect \endinput
diff --git a/tex/context/base/lang-ger.tex b/tex/context/base/lang-ger.tex
new file mode 100644
index 000000000..1ffbb33e6
--- /dev/null
+++ b/tex/context/base/lang-ger.tex
@@ -0,0 +1,738 @@
+%D \module
+%D [ file=lang-ger,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Germanic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Germanic Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+%D
+%D \starttabulate[|lB|l|]
+%D \NC Norwegian \NC Hans Fredrik Nordhaug \NC \NR
+%D \NC Danish \NC Arne Jorgensen \NC \NR % check the o
+%D \NC Afrikaans \NC \NC \NR
+%D \stoptabulate
+
+% Danish, Faeroese, Icelandic, Norwegian, Swedish, German, Yiddish
+% Afrikaans, Dutch, English, Flemush, Frisian, Plattdeutsch
+
+\unprotect
+
+\installlanguage
+ [\s!nl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year},
+ \s!mapping={texnansi,ec},
+ \s!encoding={texnansi,ec}]
+
+\installlanguage
+ [\s!en]
+ [\c!spacing=\v!broad,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!month,\ ,\v!day,{,\ },\v!year},
+ \s!patterns=\s!us,
+ \s!lefthyphenmin=2,
+ \s!righthyphenmin=3]
+
+\installlanguage
+ [\s!de]
+ [\c!spacing=\v!packed,
+ \s!lefthyphenmin=3,
+ \s!righthyphenmin=3,
+ \c!leftsentence={\hbox{--~}},
+ \c!rightsentence={\hbox{~--}},
+ \c!leftsubsentence={--},
+ \c!rightsubsentence={--},
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
+ \s!mapping={texnansi,ec},
+ \s!encoding={texnansi,ec}]
+
+\installlanguage
+ [\s!da]
+ [\c!spacing=\v!packed,
+ \c!leftsentence={\hbox{--\hskip.5em}},
+ \c!rightsentence={\hbox{\hskip.5em--}},
+ \c!leftsubsentence={--},
+ \c!rightsubsentence={--},
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year}]
+
+\installlanguage
+ [\s!sv]
+ [\c!spacing=\v!packed,
+ \c!leftsentence={\hbox{--~}},
+ \c!rightsentence={\hbox{~--}},
+ \c!leftsubsentence={--},
+ \c!rightsubsentence={--},
+ \c!leftquote=\upperrightsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperrightdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
+
+\installlanguage
+ [\s!af]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day},
+ \s!patterns=\s!nl]
+
+\installlanguage
+ [\s!nb]
+ [spacing=packed,
+ lefthyphenmin=2,
+ righthyphenmin=2,
+ leftsentence=---,
+ rightsentence=---,
+ leftsubsentence=---,
+ rightsubsentence=---,
+ leftquote=\upperleftsinglesixquote,
+ rightquote=\upperrightsingleninequote,
+ leftquotation=\leftguillemot,
+ rightquotation=\rightguillemot,
+ date={day,{.},\ ,month,\ ,year},
+ state=stop]
+
+\installlanguage
+ [\s!nn]
+ [spacing=packed,
+ lefthyphenmin=2,
+ righthyphenmin=2,
+ leftsentence=---,
+ rightsentence=---,
+ leftsubsentence=---,
+ rightsubsentence=---,
+ leftquote=\upperleftsinglesixquote,
+ rightquote=\upperrightsingleninequote,
+ leftquotation=\leftguillemot,
+ rightquotation=\rightguillemot,
+ date={day,{.},\ ,month,\ ,year},
+ state=stop]
+
+\installlanguage [\s!no] [\s!nb]
+\installlanguage [\s!norwegian] [\s!nb]
+\installlanguage [\s!bokmal] [\s!nb]
+\installlanguage [\s!nynorsk] [\s!nn]
+
+%D Extra:
+
+% \mainlanguage[en]
+% \mainlanguage[de]
+% \mainlanguage[deo]
+% \mainlanguage[de-de]
+% \mainlanguage[de-at]
+% \mainlanguage[de-ch]
+%
+% \starttext
+% Die Herren Meier\index{Meier}, Müller\index{Müller}, Huber\index{Huber}
+% und Schmidt\index{Schmidt} arbeiten in der gleichen Firma.
+%
+% \index{Mass}\index{Mas}\index{Maß}\index{Maße}\index{Masse}
+% \index{Muller}\index{Mûller}
+% \index{Hutte}\index{Hütte}\index{Huttf}
+% \index{paar}\index{Paar}
+% \index{a}\index{aa}\index{ä}\index{az}\index{aza}
+% \index{o}\index{oo}\index{ö}\index{oz}\index{oza}
+% \index{u}\index{uu}\index{ü}\index{uz}\index{uza}\index{üa}
+% \index{call}\index{chip}
+%
+% \subject{Index} \placeindex
+% \stoptext
+
+\installlanguage % old german
+ [deo]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de]
+
+\installlanguage
+ [de-de]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de]
+
+\installlanguage
+ [de-at]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de,
+ \c!leftquote=\leftguillemot,
+ \c!rightquote=\rightguillemot,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot]
+
+\installlanguage
+ [de-ch]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de]
+
+%D And some alternative (but very real) english patterns:
+
+\installlanguage
+ [en-gb]
+ [\c!default=\s!en,
+ \s!patterns=\s!gb,
+ \s!lefthyphenmin=3,
+ \s!righthyphenmin=3]
+
+\installlanguage
+ [en-us]
+ [\c!default=\s!en]
+
+\installlanguage [\s!uk] [en-gb]
+\installlanguage [\s!us] [en-us]
+
+%D For compatibility reasons we also define:
+
+%installlanguage [du] [\s!de] % old times context
+%installlanguage [sp] [\s!es] % old times context /lang-ita
+
+\installlanguage [usenglish] [en-us]
+\installlanguage [ukenglish] [en-gb]
+\installlanguage [english] [en-us]
+\installlanguage [dutch] [\s!nl]
+\installlanguage [german] [\s!de]
+\installlanguage [danish] [\s!da]
+\installlanguage [swedish] [\s!sv]
+\installlanguage [afrikaans] [\s!af]
+
+\setupheadtext [\s!en] [\v!content=Contents]
+\setupheadtext [\s!nl] [\v!content=Inhoud]
+\setupheadtext [\s!de] [\v!content=Inhalt]
+\setupheadtext [\s!da] [\v!content=Indhold]
+\setupheadtext [\s!sv] [\v!content=Inneh\aring ll]
+\setupheadtext [\s!af] [\v!content=Inhoud]
+\setupheadtext [\s!nb] [\v!content=Innhold]
+\setupheadtext [\s!nn] [\v!content=Innhald]
+
+\setupheadtext [\s!en] [\v!tables=Tables]
+\setupheadtext [\s!nl] [\v!tables=Tabellen]
+\setupheadtext [\s!de] [\v!tables=Tabellen]
+\setupheadtext [\s!da] [\v!tables=Tabeller]
+\setupheadtext [\s!sv] [\v!tables=Tabeller]
+\setupheadtext [\s!af] [\v!tables=Tabelle]
+\setupheadtext [\s!nb] [\v!tables=Tabeller]
+\setupheadtext [\s!nn] [\v!tables=Tabellar]
+
+\setupheadtext [\s!en] [\v!figures=Figures]
+\setupheadtext [\s!nl] [\v!figures=Figuren]
+\setupheadtext [\s!de] [\v!figures=Abbildungen]
+\setupheadtext [\s!da] [\v!figures=Figurer]
+\setupheadtext [\s!sv] [\v!figures=Figurer]
+\setupheadtext [\s!af] [\v!figures=Figure]
+\setupheadtext [\s!nb] [\v!figures=Figurer]
+\setupheadtext [\s!nn] [\v!figures=Figurar]
+
+\setupheadtext [\s!en] [\v!graphics=Graphics]
+\setupheadtext [\s!nl] [\v!graphics=Grafieken]
+\setupheadtext [\s!de] [\v!graphics=Graphiken]
+\setupheadtext [\s!da] [\v!graphics=Grafik]
+\setupheadtext [\s!sv] [\v!graphics=Grafik]
+\setupheadtext [\s!af] [\v!graphics=Grafieke]
+\setupheadtext [\s!nb] [\v!graphics=Bilde]
+\setupheadtext [\s!nn] [\v!graphics=Bilete]
+
+\setupheadtext [\s!en] [\v!intermezzi=Intermezzos]
+\setupheadtext [\s!nl] [\v!intermezzi=Intermezzo's]
+\setupheadtext [\s!de] [\v!intermezzi=Intermezzi]
+\setupheadtext [\s!da] [\v!intermezzi=Intermezzoer]
+\setupheadtext [\s!sv] [\v!intermezzi=Intermezzon]
+\setupheadtext [\s!af] [\v!intermezzi=Intermezzos]
+\setupheadtext [\s!nb] [\v!intermezzi=Intermesso]
+\setupheadtext [\s!nn] [\v!intermezzi=Intermesso]
+
+\setupheadtext [\s!en] [\v!index=Index]
+\setupheadtext [\s!nl] [\v!index=Index]
+\setupheadtext [\s!de] [\v!index=Index]
+\setupheadtext [\s!da] [\v!index=Indeks]
+\setupheadtext [\s!sv] [\v!index=Sakregister]
+\setupheadtext [\s!af] [\v!index=Indeks]
+\setupheadtext [\s!nb] [\v!index=Register]
+\setupheadtext [\s!nn] [\v!index=Register]
+
+\setupheadtext [\s!en] [\v!abbreviations=Abbreviations]
+\setupheadtext [\s!nl] [\v!abbreviations=Afkortingen]
+\setupheadtext [\s!de] [\v!abbreviations=Abk\uumlaut rzungen]
+\setupheadtext [\s!da] [\v!abbreviations=Forkortelser]
+\setupheadtext [\s!sv] [\v!abbreviations=F\oumlaut rkortningar]
+\setupheadtext [\s!af] [\v!abbreviations=Afkortings]
+\setupheadtext [\s!nb] [\v!abbreviations=Forkortelser]
+\setupheadtext [\s!nn] [\v!abbreviations=Forkortingar]
+
+\setupheadtext [\s!en] [\v!logos=Logos]
+\setupheadtext [\s!nl] [\v!logos=Logo's]
+\setupheadtext [\s!de] [\v!logos=Logos]
+\setupheadtext [\s!da] [\v!logos=Logoer]
+\setupheadtext [\s!sv] [\v!logos=Loggor]
+\setupheadtext [\s!af] [\v!logos=Logos]
+\setupheadtext [\s!nb] [\v!logos=Logoer]
+\setupheadtext [\s!nn] [\v!logos=Logoar]
+
+\setupheadtext [\s!en] [\v!units=Units]
+\setupheadtext [\s!nl] [\v!units=Eenheden]
+\setupheadtext [\s!de] [\v!units=Einheiten]
+\setupheadtext [\s!da] [\v!units=Enheder]
+\setupheadtext [\s!sv] [\v!units=Enheter]
+\setupheadtext [\s!af] [\v!units=Eenhede]
+\setupheadtext [\s!nb] [\v!units=Enheter]
+\setupheadtext [\s!nn] [\v!units=Einingar]
+
+\setupheadtext [\s!en] [pubs=References]
+\setupheadtext [\s!nl] [pubs=Literatuur]
+\setupheadtext [\s!de] [pubs=Literatur]
+%setupheadtext [\s!da] [pubs=?]
+%setupheadtext [\s!sv] [pubs=?]
+%setupheadtext [\s!af] [pubs=?]
+%setupheadtext [\s!nb] [pubs=?]
+%setupheadtext [\s!nn] [pubs=?]
+
+\setuplabeltext [\s!en] [\v!table=Table ]
+\setuplabeltext [\s!nl] [\v!table=Tabel ]
+\setuplabeltext [\s!de] [\v!table=Tabelle ]
+\setuplabeltext [\s!da] [\v!table=Tabel ]
+\setuplabeltext [\s!sv] [\v!table=Tabell ]
+\setuplabeltext [\s!af] [\v!table=Tabel]
+\setuplabeltext [\s!nb] [\v!table=Tabell ]
+\setuplabeltext [\s!nn] [\v!table=Tabell ]
+
+\setuplabeltext [\s!en] [\v!figure=Figure ]
+\setuplabeltext [\s!nl] [\v!figure=Figuur ]
+\setuplabeltext [\s!de] [\v!figure=Abbildung ]
+\setuplabeltext [\s!da] [\v!figure=Figur ]
+\setuplabeltext [\s!sv] [\v!figure=Figur ]
+\setuplabeltext [\s!af] [\v!figure=Figuur ]
+\setuplabeltext [\s!nb] [\v!figure=Figur ]
+\setuplabeltext [\s!nn] [\v!figure=Figur ]
+
+\setuplabeltext [\s!en] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!nl] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!de] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!da] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!sv] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!af] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!nb] [\v!intermezzo=Intermesso ]
+\setuplabeltext [\s!nn] [\v!intermezzo=Intermesso ]
+
+\setuplabeltext [\s!en] [\v!graphic=Graphic ]
+\setuplabeltext [\s!nl] [\v!graphic=Grafiek ]
+\setuplabeltext [\s!de] [\v!graphic=Graphik ]
+\setuplabeltext [\s!da] [\v!graphic=Grafik ]
+\setuplabeltext [\s!sv] [\v!graphic=Grafik ]
+\setuplabeltext [\s!af] [\v!graphic=Grafiek ]
+\setuplabeltext [\s!nb] [\v!graphic=Bilde ]
+\setuplabeltext [\s!nn] [\v!graphic=Bilete ]
+
+%D We don't set these here. One can do that in a style.
+
+\setuplabeltext [\s!en] [\v!chapter=] % Chapter
+\setuplabeltext [\s!nl] [\v!chapter=]
+\setuplabeltext [\s!de] [\v!chapter=] % Kapitel
+\setuplabeltext [\s!da] [\v!chapter=]
+\setuplabeltext [\s!sv] [\v!chapter=]
+\setuplabeltext [\s!af] [\v!chapter=] % Hoofstuk
+\setuplabeltext [\s!nb] [\v!chapter=]
+\setuplabeltext [\s!nn] [\v!chapter=]
+
+\setuplabeltext [\s!en] [\v!section=]
+\setuplabeltext [\s!nl] [\v!section=]
+\setuplabeltext [\s!de] [\v!section=]
+\setuplabeltext [\s!da] [\v!section=]
+\setuplabeltext [\s!sv] [\v!section=]
+\setuplabeltext [\s!af] [\v!section=] % Paragraaf
+\setuplabeltext [\s!nb] [\v!section=]
+\setuplabeltext [\s!nn] [\v!section=]
+
+\setuplabeltext [\s!en] [\v!subsection=]
+\setuplabeltext [\s!nl] [\v!subsection=]
+\setuplabeltext [\s!de] [\v!subsection=]
+\setuplabeltext [\s!da] [\v!subsection=]
+\setuplabeltext [\s!sv] [\v!subsection=]
+\setuplabeltext [\s!af] [\v!subsection=]
+\setuplabeltext [\s!nb] [\v!subsection=]
+\setuplabeltext [\s!nn] [\v!subsection=]
+
+\setuplabeltext [\s!en] [\v!subsubsection=]
+\setuplabeltext [\s!nl] [\v!subsubsection=]
+\setuplabeltext [\s!de] [\v!subsubsection=]
+\setuplabeltext [\s!da] [\v!subsubsection=]
+\setuplabeltext [\s!sv] [\v!subsubsection=]
+\setuplabeltext [\s!af] [\v!subsubsection=]
+\setuplabeltext [\s!nb] [\v!subsubsection=]
+\setuplabeltext [\s!nn] [\v!subsubsection=]
+
+\setuplabeltext [\s!en] [\v!subsubsubsection=]
+\setuplabeltext [\s!nl] [\v!subsubsubsection=]
+\setuplabeltext [\s!de] [\v!subsubsubsection=]
+\setuplabeltext [\s!da] [\v!subsubsubsection=]
+\setuplabeltext [\s!sv] [\v!subsubsubsection=]
+\setuplabeltext [\s!af] [\v!subsubsubsection=]
+\setuplabeltext [\s!nb] [\v!subsubsubsection=]
+\setuplabeltext [\s!nn] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!en] [\v!appendix=] % Appendix
+\setuplabeltext [\s!nl] [\v!appendix=]
+\setuplabeltext [\s!de] [\v!appendix=] % Anhang
+\setuplabeltext [\s!da] [\v!appendix=] % Bilag
+\setuplabeltext [\s!sv] [\v!appendix=]
+\setuplabeltext [\s!af] [\v!appendix=] % Bylae
+\setuplabeltext [\s!nb] [\v!appendix=] % Tillegg
+\setuplabeltext [\s!nn] [\v!appendix=] % Tillegg
+
+\setuplabeltext [\s!en] [\v!part=Part ]
+\setuplabeltext [\s!nl] [\v!part=Deel ]
+\setuplabeltext [\s!de] [\v!part=Teil ]
+\setuplabeltext [\s!da] [\v!part=Del ]
+\setuplabeltext [\s!sv] [\v!part=Del ]
+\setuplabeltext [\s!af] [\v!part=Deel ]
+\setuplabeltext [\s!nb] [\v!part=Del]
+\setuplabeltext [\s!nn] [\v!part=Del]
+
+\setuplabeltext [\s!en] [\v!line=line ]
+\setuplabeltext [\s!nl] [\v!line=regel ]
+\setuplabeltext [\s!de] [\v!line=Zeile ]
+\setuplabeltext [\s!da] [\v!line=linie ] % or linje
+\setuplabeltext [\s!sv] [\v!line=rad ]
+\setuplabeltext [\s!af] [\v!line=re\ediaeresis l ]
+\setuplabeltext [\s!nb] [\v!line=linje ]
+\setuplabeltext [\s!nn] [\v!line=linje ]
+
+\setuplabeltext [\s!en] [\v!lines=lines ]
+\setuplabeltext [\s!nl] [\v!lines=regels ]
+\setuplabeltext [\s!de] [\v!lines=Zeilen ]
+\setuplabeltext [\s!da] [\v!lines=linier ] % or linjer
+\setuplabeltext [\s!sv] [\v!lines=rader ]
+\setuplabeltext [\s!af] [\v!lines=re\ediaeresis ls ]
+\setuplabeltext [\s!nb] [\v!lines=linjer ]
+\setuplabeltext [\s!nn] [\v!lines=linjer ]
+
+\setuplabeltext [\s!en] [\v!january=January]
+\setuplabeltext [\s!en] [\v!february=February]
+\setuplabeltext [\s!en] [\v!march=March]
+\setuplabeltext [\s!en] [\v!april=April]
+\setuplabeltext [\s!en] [\v!may=May]
+\setuplabeltext [\s!en] [\v!june=June]
+\setuplabeltext [\s!en] [\v!july=July]
+\setuplabeltext [\s!en] [\v!august=August]
+\setuplabeltext [\s!en] [\v!september=September]
+\setuplabeltext [\s!en] [\v!october=October]
+\setuplabeltext [\s!en] [\v!november=November]
+\setuplabeltext [\s!en] [\v!december=December]
+
+\setuplabeltext [\s!nl] [\v!january=januari]
+\setuplabeltext [\s!nl] [\v!february=februari]
+\setuplabeltext [\s!nl] [\v!march=maart]
+\setuplabeltext [\s!nl] [\v!april=april]
+\setuplabeltext [\s!nl] [\v!may=mei]
+\setuplabeltext [\s!nl] [\v!june=juni]
+\setuplabeltext [\s!nl] [\v!july=juli]
+\setuplabeltext [\s!nl] [\v!august=augustus]
+\setuplabeltext [\s!nl] [\v!september=september]
+\setuplabeltext [\s!nl] [\v!october=oktober]
+\setuplabeltext [\s!nl] [\v!november=november]
+\setuplabeltext [\s!nl] [\v!december=december]
+
+\setuplabeltext [\s!de] [\v!january=Januar]
+\setuplabeltext [\s!de] [\v!february=Februar]
+\setuplabeltext [\s!de] [\v!march=M\aumlaut rz]
+\setuplabeltext [\s!de] [\v!april=April]
+\setuplabeltext [\s!de] [\v!may=Mai]
+\setuplabeltext [\s!de] [\v!june=Juni]
+\setuplabeltext [\s!de] [\v!july=Juli]
+\setuplabeltext [\s!de] [\v!august=August]
+\setuplabeltext [\s!de] [\v!september=September]
+\setuplabeltext [\s!de] [\v!october=Oktober]
+\setuplabeltext [\s!de] [\v!november=November]
+\setuplabeltext [\s!de] [\v!december=Dezember]
+
+\setuplabeltext [\s!da] [\v!january=januar]
+\setuplabeltext [\s!da] [\v!february=februar]
+\setuplabeltext [\s!da] [\v!march=marts]
+\setuplabeltext [\s!da] [\v!april=april]
+\setuplabeltext [\s!da] [\v!may=maj]
+\setuplabeltext [\s!da] [\v!june=juni]
+\setuplabeltext [\s!da] [\v!july=juli]
+\setuplabeltext [\s!da] [\v!august=august]
+\setuplabeltext [\s!da] [\v!september=september]
+\setuplabeltext [\s!da] [\v!october=oktober]
+\setuplabeltext [\s!da] [\v!november=november]
+\setuplabeltext [\s!da] [\v!december=december]
+
+\setuplabeltext [\s!sv] [\v!january=januari]
+\setuplabeltext [\s!sv] [\v!february=februari]
+\setuplabeltext [\s!sv] [\v!march=mars]
+\setuplabeltext [\s!sv] [\v!april=april]
+\setuplabeltext [\s!sv] [\v!may=maj]
+\setuplabeltext [\s!sv] [\v!june=juni]
+\setuplabeltext [\s!sv] [\v!july=juli]
+\setuplabeltext [\s!sv] [\v!august=augusti]
+\setuplabeltext [\s!sv] [\v!september=september]
+\setuplabeltext [\s!sv] [\v!october=oktober]
+\setuplabeltext [\s!sv] [\v!november=november]
+\setuplabeltext [\s!sv] [\v!december=december]
+
+\setuplabeltext [\s!af] [\v!january=januarie]
+\setuplabeltext [\s!af] [\v!february=februarie]
+\setuplabeltext [\s!af] [\v!march=maart]
+\setuplabeltext [\s!af] [\v!april=april]
+\setuplabeltext [\s!af] [\v!may=mei]
+\setuplabeltext [\s!af] [\v!june=junie]
+\setuplabeltext [\s!af] [\v!july=julie]
+\setuplabeltext [\s!af] [\v!august=augustus]
+\setuplabeltext [\s!af] [\v!september=september]
+\setuplabeltext [\s!af] [\v!october=oktober]
+\setuplabeltext [\s!af] [\v!november=november]
+\setuplabeltext [\s!af] [\v!december=desember]
+
+\setuplabeltext [\s!nb] [\v!january=januar]
+\setuplabeltext [\s!nb] [\v!february=februar]
+\setuplabeltext [\s!nb] [\v!march=mars]
+\setuplabeltext [\s!nb] [\v!april=april]
+\setuplabeltext [\s!nb] [\v!may=mai]
+\setuplabeltext [\s!nb] [\v!june=juni]
+\setuplabeltext [\s!nb] [\v!july=juli]
+\setuplabeltext [\s!nb] [\v!august=august]
+\setuplabeltext [\s!nb] [\v!september=september]
+\setuplabeltext [\s!nb] [\v!october=oktober]
+\setuplabeltext [\s!nb] [\v!november=november]
+\setuplabeltext [\s!nb] [\v!december=desember]
+
+\setuplabeltext [\s!nn] [\v!january=januar]
+\setuplabeltext [\s!nn] [\v!february=februar]
+\setuplabeltext [\s!nn] [\v!march=mars]
+\setuplabeltext [\s!nn] [\v!april=april]
+\setuplabeltext [\s!nn] [\v!may=mai]
+\setuplabeltext [\s!nn] [\v!june=juni]
+\setuplabeltext [\s!nn] [\v!july=juli]
+\setuplabeltext [\s!nn] [\v!august=august]
+\setuplabeltext [\s!nn] [\v!september=september]
+\setuplabeltext [\s!nn] [\v!october=oktober]
+\setuplabeltext [\s!nn] [\v!november=november]
+\setuplabeltext [\s!nn] [\v!december=desember]
+
+\setuplabeltext [\s!en] [\v!sunday=Sunday]
+\setuplabeltext [\s!en] [\v!monday=Monday]
+\setuplabeltext [\s!en] [\v!tuesday=Tuesday]
+\setuplabeltext [\s!en] [\v!wednesday=Wednesday]
+\setuplabeltext [\s!en] [\v!thursday=Thursday]
+\setuplabeltext [\s!en] [\v!friday=Friday]
+\setuplabeltext [\s!en] [\v!saturday=Saturday]
+
+\setuplabeltext [\s!nl] [\v!sunday=zondag]
+\setuplabeltext [\s!nl] [\v!monday=maandag]
+\setuplabeltext [\s!nl] [\v!tuesday=dinsdag]
+\setuplabeltext [\s!nl] [\v!wednesday=woensdag]
+\setuplabeltext [\s!nl] [\v!thursday=donderdag]
+\setuplabeltext [\s!nl] [\v!friday=vrijdag]
+\setuplabeltext [\s!nl] [\v!saturday=zaterdag]
+
+\setuplabeltext [\s!de] [\v!sunday=Sonntag]
+\setuplabeltext [\s!de] [\v!monday=Montag]
+\setuplabeltext [\s!de] [\v!tuesday=Dienstag]
+\setuplabeltext [\s!de] [\v!wednesday=Mittwoch]
+\setuplabeltext [\s!de] [\v!thursday=Donnerstag]
+\setuplabeltext [\s!de] [\v!friday=Freitag]
+\setuplabeltext [\s!de] [\v!saturday=Samstag]
+
+\setuplabeltext [\s!da] [\v!sunday=s\ostroke ndag]
+\setuplabeltext [\s!da] [\v!monday=mandag]
+\setuplabeltext [\s!da] [\v!tuesday=tirsdag]
+\setuplabeltext [\s!da] [\v!wednesday=onsdag]
+\setuplabeltext [\s!da] [\v!thursday=torsdag]
+\setuplabeltext [\s!da] [\v!friday=fredag]
+\setuplabeltext [\s!da] [\v!saturday=l\ostroke rdag]
+
+\setuplabeltext [\s!sv] [\v!sunday=s\oumlaut ndag]
+\setuplabeltext [\s!sv] [\v!monday=m\aring ndag]
+\setuplabeltext [\s!sv] [\v!tuesday=tisdag]
+\setuplabeltext [\s!sv] [\v!wednesday=onsdag]
+\setuplabeltext [\s!sv] [\v!thursday=torsdag]
+\setuplabeltext [\s!sv] [\v!friday=fredag]
+\setuplabeltext [\s!sv] [\v!saturday=l\oumlaut rdag]
+
+\setuplabeltext [\s!af] [\v!sunday=sondag]
+\setuplabeltext [\s!af] [\v!monday=maandag]
+\setuplabeltext [\s!af] [\v!tuesday=dinsdag]
+\setuplabeltext [\s!af] [\v!wednesday=woensdag]
+\setuplabeltext [\s!af] [\v!thursday=donderdag]
+\setuplabeltext [\s!af] [\v!friday=vrydag]
+\setuplabeltext [\s!af] [\v!saturday=saterdag]
+
+\setuplabeltext [\s!nb] [\v!sunday=s\ostroke ndag]
+\setuplabeltext [\s!nb] [\v!monday=mandag]
+\setuplabeltext [\s!nb] [\v!tuesday=tirsdag]
+\setuplabeltext [\s!nb] [\v!wednesday=onsdag]
+\setuplabeltext [\s!nb] [\v!thursday=torsdag]
+\setuplabeltext [\s!nb] [\v!friday=fredag]
+\setuplabeltext [\s!nb] [\v!saturday=l\ostroke rdag]
+
+\setuplabeltext [\s!nn] [\v!sunday=sundag]
+\setuplabeltext [\s!nn] [\v!monday=m\aring ndag]
+\setuplabeltext [\s!nn] [\v!tuesday=tysdag]
+\setuplabeltext [\s!nn] [\v!wednesday=onsdag]
+\setuplabeltext [\s!nn] [\v!thursday=torsdag]
+\setuplabeltext [\s!nn] [\v!friday=fredag]
+\setuplabeltext [\s!nn] [\v!saturday=laurdag]
+
+%D Rather new ...
+
+\setuplabeltext [\s!nl] [\v!page=pagina ]
+\setuplabeltext [\s!nl] [\v!atpage=op pagina ]
+\setuplabeltext [\s!nl] [\v!hencefore=hierboven]
+\setuplabeltext [\s!nl] [\v!hereafter=hieronder]
+\setuplabeltext [\s!nl] [\v!see=zie ]
+
+\setuplabeltext [\s!en] [\v!page=page ]
+\setuplabeltext [\s!en] [\v!atpage=at page ]
+\setuplabeltext [\s!en] [\v!hencefore=as we show above]
+\setuplabeltext [\s!en] [\v!hereafter=as we show below]
+\setuplabeltext [\s!en] [\v!see=see ]
+
+\setuplabeltext [\s!de] [\v!page=Seite ]
+\setuplabeltext [\s!de] [\v!atpage=auf Seite ]
+\setuplabeltext [\s!de] [\v!hencefore=siehe oben]
+\setuplabeltext [\s!de] [\v!hereafter=siehe unten]
+\setuplabeltext [\s!de] [\v!see=siehe ]
+
+\setuplabeltext [\s!da] [\v!page=Side ]
+\setuplabeltext [\s!da] [\v!atpage=p\aring\ side ]
+\setuplabeltext [\s!da] [\v!hencefore=se foroven]
+\setuplabeltext [\s!da] [\v!hereafter=se forneden]
+\setuplabeltext [\s!da] [\v!see=se ]
+
+\setuplabeltext [\s!sv] [\v!page=Sida ]
+\setuplabeltext [\s!sv] [\v!atpage=p\aring\ sida ]
+\setuplabeltext [\s!sv] [\v!hencefore=se ovan]
+\setuplabeltext [\s!sv] [\v!hereafter=se nedan]
+\setuplabeltext [\s!sv] [\v!see=se ]
+
+\setuplabeltext [\s!nb] [\v!page=side ]
+\setuplabeltext [\s!nb] [\v!atpage=p\aring\ side ]
+\setuplabeltext [\s!nb] [\v!hencefore=som vist over]
+\setuplabeltext [\s!nb] [\v!hereafter=som vist under]
+\setuplabeltext [\s!nb] [\v!see=se ]
+
+\setuplabeltext [\s!nn] [\v!page=side ]
+\setuplabeltext [\s!nn] [\v!atpage=p\aring\ side ]
+\setuplabeltext [\s!nn] [\v!hencefore=som vist over]
+\setuplabeltext [\s!nn] [\v!hereafter=som vist under]
+\setuplabeltext [\s!nn] [\v!see=sj\aring\ ]
+
+%D ... and to be completed!
+
+%D Next we implement couple of ordinal mumber converters:
+
+\def\enordinaldaynumber#1%
+ {#1\ifnum\lasttwodigits{#1}=11
+ \highordinalstr{th}%
+ \else\ifnum\lasttwodigits{#1}=12
+ \highordinalstr{th}%
+ \else\ifnum\lasttwodigits{#1}=13
+ \highordinalstr{th}%
+ \else\ifcase\lastdigit{#1}%
+ \highordinalstr{th}%
+ \or % 1
+ \highordinalstr{st}%
+ \or % 2
+ \highordinalstr{nd}%
+ \or % 3
+ \highordinalstr{rd}%
+ \else
+ \highordinalstr{th}%
+ \fi\fi\fi\fi}
+
+% \def\enordinaldaynumber#1%
+% {#1\ordinalstr{\ifnum\lasttwodigits{#1}=11 th\else\ifcase\lastdigit{#1}
+% th\or st\or nd\or rd\else th\fi\fi}}
+
+\def\nlordinaldaynumber#1%
+ {#1\highordinalstr{e}}
+
+%D \ShowAllLanguageValues [\s!en] [english] {English} {horn} % engelse humor
+%D \ShowAllLanguageValues [\s!nl] [dutch] {Dutch} {treat} % nederlandse zuinigheid
+%D \ShowAllLanguageValues [\s!de] [german] {German} {beer} % duitse degelijkheid
+%D \ShowAllLanguageValues [\s!da] [danish] {Danish} {pastry}
+%D \ShowAllLanguageValues [\s!sv] [swedish] {Swedish} {design}
+%D \ShowAllLanguageValues [\s!af] [afrikaans] {Afrikaaner} {boer} % afrikaanse gasvryheid
+%D \ShowAllLanguageValues [\s!nb] [bokmal] {Norwegian} {wood}
+%D \ShowAllLanguageValues [\s!nn] [nynorsk] {Norwegian} {fish}
+
+%D Extra month names:
+
+\setuplabeltext [\s!en] [\v!january :\s!mnem=jan]
+\setuplabeltext [\s!en] [\v!february :\s!mnem=feb]
+\setuplabeltext [\s!en] [\v!march :\s!mnem=mar]
+\setuplabeltext [\s!en] [\v!april :\s!mnem=apr]
+\setuplabeltext [\s!en] [\v!may :\s!mnem=may]
+\setuplabeltext [\s!en] [\v!june :\s!mnem=jun]
+\setuplabeltext [\s!en] [\v!july :\s!mnem=jul]
+\setuplabeltext [\s!en] [\v!august :\s!mnem=aug]
+\setuplabeltext [\s!en] [\v!september:\s!mnem=sep]
+\setuplabeltext [\s!en] [\v!october :\s!mnem=oct]
+\setuplabeltext [\s!en] [\v!november :\s!mnem=nov]
+\setuplabeltext [\s!en] [\v!december :\s!mnem=dec]
+
+\setuplabeltext [\s!nb] [\v!january :\s!mnem=jan.]
+\setuplabeltext [\s!nb] [\v!february :\s!mnem=feb.]
+\setuplabeltext [\s!nb] [\v!march :\s!mnem=mars]
+\setuplabeltext [\s!nb] [\v!april :\s!mnem=april]
+\setuplabeltext [\s!nb] [\v!may :\s!mnem=mai]
+\setuplabeltext [\s!nb] [\v!june :\s!mnem=juni]
+\setuplabeltext [\s!nb] [\v!july :\s!mnem=juli]
+\setuplabeltext [\s!nb] [\v!august :\s!mnem=aug.]
+\setuplabeltext [\s!nb] [\v!september:\s!mnem=sep.]
+\setuplabeltext [\s!nb] [\v!october :\s!mnem=okt.]
+\setuplabeltext [\s!nb] [\v!november :\s!mnem=nov.]
+\setuplabeltext [\s!nb] [\v!december :\s!mnem=des.]
+
+\setuplabeltext [\s!nn] [\v!january :\s!mnem=jan.]
+\setuplabeltext [\s!nn] [\v!february :\s!mnem=feb.]
+\setuplabeltext [\s!nn] [\v!march :\s!mnem=mars]
+\setuplabeltext [\s!nn] [\v!april :\s!mnem=april]
+\setuplabeltext [\s!nn] [\v!may :\s!mnem=mai]
+\setuplabeltext [\s!nn] [\v!june :\s!mnem=juni]
+\setuplabeltext [\s!nn] [\v!july :\s!mnem=juli]
+\setuplabeltext [\s!nn] [\v!august :\s!mnem=aug.]
+\setuplabeltext [\s!nn] [\v!september:\s!mnem=sep.]
+\setuplabeltext [\s!nn] [\v!october :\s!mnem=okt.]
+\setuplabeltext [\s!nn] [\v!november :\s!mnem=nov.]
+\setuplabeltext [\s!nn] [\v!december :\s!mnem=des.]
+
+\protect \endinput
diff --git a/tex/context/base/lang-grk.tex b/tex/context/base/lang-grk.tex
new file mode 100644
index 000000000..e4ba781eb
--- /dev/null
+++ b/tex/context/base/lang-grk.tex
@@ -0,0 +1,94 @@
+%D \module
+%D [ file=lang-grk,
+%D version=2003.04.01,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Uralic Languages,
+%D author=Apostolos Syropoulos
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Greek}
+
+%D The framework of this module is set up by Hans Hagen while
+%D all the translations have been done by Apostolos Syropoulos
+
+\unprotect
+
+\installlanguage
+ [\s!gr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\greekleftquot,
+ \c!rightquote=\greekrightquot,
+ \c!leftquotation=\greekleftquot,
+ \c!rightquotation=\greekrightquot,
+ \c!date={\v!day\ \v!month\ \v!year}]
+
+\installlanguage [greek] [\s!gr]
+
+\setupheadtext [\s!gr] [\v!content=\greekPi\greekepsilon\greekrho\greekiota\greekepsilon\greekchi\greekomicrontonos\greekmu\greekepsilon\greeknu\greekalpha]
+\setupheadtext [\s!gr] [\v!tables=\greekPi\greekiotatonos\greeknu\greekalpha\greekkappa\greekepsilon\greekfinalsigma]
+\setupheadtext [\s!gr] [\v!figures=\greekSigma\greekchi\greeketatonos\greekmu\greekalpha\greektau\greekalpha]
+\setupheadtext [\s!gr] [\v!graphics=\greekGamma\greekrho\greekalpha\greekphi\greekiota\greekkappa\greekalphatonos]
+\setupheadtext [\s!gr] [\v!intermezzi=\greekPi\greekalpha\greekupsilontonos\greeksigma\greekepsilon\greekiota\greekfinalsigma]
+\setupheadtext [\s!gr] [\v!index=\greekEpsilon\greekupsilon\greekrho\greekepsilon\greektau\greeketatonos\greekrho\greekiota\greekomicron]
+\setupheadtext [\s!gr] [\v!abbreviations=\greekSigma\greekupsilon\greeknu\greektau\greekomicron\greekmu\greekomicron\greekgamma\greekrho\greekalpha\greekphi\greekiotatonos\greekepsilon\greekfinalsigma]
+\setupheadtext [\s!gr] [\v!logos=\greekLambda\greekomicron\greekgamma\greekomicrontonos\greektau\greekupsilon\greekpi\greekalpha]
+\setupheadtext [\s!gr] [\v!units=\greekMu\greekomicron\greeknu\greekalphatonos\greekdelta\greekepsilon\greekfinalsigma]
+
+\setuplabeltext [\s!gr] [\v!table=\greekPi\greekiotatonos\greeknu\greekalpha\greekkappa\greekalpha\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!figure=\greekSigma\greekchi\greeketatonos\greekmu\greekalpha]
+\setuplabeltext [\s!gr] [\v!intermezzo=\greekPi\greekalpha\greekupsilontonos\greeksigma\greeketa]
+\setuplabeltext [\s!gr] [\v!graphic=\greekGamma\greekrho\greekalpha\greekphi\greekiota\greekkappa\greekomicrontonos]
+
+\setuplabeltext [\s!gr] [\v!chapter=\greekKappa\greekepsilon\greekphi\greekalphatonos\greeklambda\greekalpha\greekiota\greekomicron]
+\setuplabeltext [\s!gr] [\v!section=\greekEpsilon\greeknu\greekomicrontonos\greektau\greeketa\greektau\greekalpha]
+\setuplabeltext [\s!gr] [\v!subsection=\greekUpsilon\greekpi\greekomicrontonos\greekepsilon\greeknu\greekomicrontonos\greektau\greeketa\greektau\greekalpha]
+\setuplabeltext [\s!gr] [\v!subsubsection=]
+\setuplabeltext [\s!gr] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!gr] [\v!appendix=\greekPi\greekalpha\greekrho\greekalphatonos\greekrho\greektau\greeketa\greekmu\greekalpha]
+\setuplabeltext [\s!gr] [\v!part=\greekMu\greekepsilontonos\greekrho\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!line=\greekGamma\greekrho\greekalpha\greekmu\greekmu\greeketatonos]
+\setuplabeltext [\s!gr] [\v!lines=\greekGamma\greekrho\greekalpha\greekmu\greekmu\greekepsilontonos\greekfinalsigma]
+
+\setuplabeltext [\s!gr] [\v!january=\greekIota\greekalpha\greeknu\greekomicron\greekupsilon\greekalphatonos\greekrho\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!february=\greekPhi\greekepsilon\greekbeta\greekrho\greekomicron\greekupsilon\greekalphatonos\greekrho\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!march=\greekMu\greekalphatonos\greekrho\greektau\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!april=\greekAlpha\greekpi\greekrho\greekiotatonos\greeklambda\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!may=\greekMu\greekalphatonos\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!june=\greekIota\greekomicron\greekupsilontonos\greeknu\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!july=\greekIota\greekomicron\greekupsilontonos\greeklambda\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!august=\greekAlpha\greekupsilontonos\greekgamma\greekomicron\greekupsilon\greeksigma\greektau\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!september=\greekSigma\greekepsilon\greekpi\greektau\greekepsilontonos\greekmu\greekbeta\greekrho\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!october=\greekOmicron\greekkappa\greektau\greekomegatonos\greekbeta\greekrho\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!november=\greekNu\greekomicron\greekepsilontonos\greekmu\greekbeta\greekrho\greekiota\greekomicron\greekfinalsigma]
+\setuplabeltext [\s!gr] [\v!december=\greekDelta\greekepsilon\greekkappa\greekepsilontonos\greekmu\greekbeta\greekrho\greekiota\greekomicron\greekfinalsigma]
+
+\setuplabeltext [\s!gr] [\v!sunday=\greekKappa\greekupsilon\greekrho\greekiota\greekalpha\greekkappa\greeketatonos]
+\setuplabeltext [\s!gr] [\v!monday=\greekDelta\greekepsilon\greekupsilon\greektau\greekepsilontonos\greekrho\greekalpha]
+\setuplabeltext [\s!gr] [\v!tuesday=\greekTau\greekrho\greekiotatonos\greektau\greeketa]
+\setuplabeltext [\s!gr] [\v!wednesday=\greekTau\greekepsilon\greektau\greekalphatonos\greekrho\greektau\greeketa]
+\setuplabeltext [\s!gr] [\v!thursday=\greekPi\greekepsilontonos\greekmu\greekpi\greektau\greeketa]
+\setuplabeltext [\s!gr] [\v!friday=\greekPi\greekalpha\greekrho\greekalpha\greeksigma\greekkappa\greekepsilon\greekupsilon\greeketatonos]
+\setuplabeltext [\s!gr] [\v!saturday=\greekSigma\greekalphatonos\greekbeta\greekbeta\greekalpha\greektau\greekomicron]
+
+%D % \ShowAllLanguageValues [\s!gr] [\greekEpsilon\greeklambda\greeklambda\greeketa\greeknu\greekiota\greekkappa\greekalphatonos] {Greek} {love}
+
+\installlanguage
+ [\s!agr]
+ [\s!default=\s!gr,
+ \s!patterns=\s!agr,
+ \s!mapping=\s!agr,
+ \s!encoding=\s!agr]
+
+\installlanguage [ancientgreek] [\s!agr]
+
+\protect \endinput
diff --git a/tex/context/base/lang-ind.tex b/tex/context/base/lang-ind.tex
new file mode 100644
index 000000000..9b6e5ff1d
--- /dev/null
+++ b/tex/context/base/lang-ind.tex
@@ -0,0 +1,26 @@
+%D \module
+%D [ file=lang--ind,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Indo Iranian Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Indo-Iranian Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+
+% 34 languages
+
+\unprotect
+
+\protect \endinput
diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua
new file mode 100644
index 000000000..239e5390c
--- /dev/null
+++ b/tex/context/base/lang-ini.lua
@@ -0,0 +1,321 @@
+if not modules then modules = { } end modules ['lang-ini'] = {
+ version = 1.001,
+ comment = "companion to lang-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- needs a cleanup (share locals)
+
+local utf = unicode.utf8
+local utfbyte = utf.byte
+local format = string.format
+local concat = table.concat
+local lpegmatch = lpeg.match
+
+local trace_patterns = false trackers.register("languages.patterns", function(v) trace_patterns = v end)
+
+languages = languages or {}
+languages.version = 1.009
+languages.hyphenation = languages.hyphenation or { }
+languages.hyphenation.data = languages.hyphenation.data or { }
+
+local langdata = languages.hyphenation.data
+
+-- 002D : hyphen-minus (ascii)
+-- 2010 : hyphen
+-- 2011 : nonbreakable hyphen
+-- 2013 : endash (compound hyphen)
+
+--~ lang:hyphenation(string)
+--~ string =lang:hyphenation()
+--~ lang:clear_hyphenation()
+
+-- we can consider hiding data (faster access too)
+
+-- 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
+--
+-- the following lpeg can probably be improved (it was one of the first I made)
+
+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 file.extname(filename) == "rpl" then
+ return io.loaddata(resolvers.find_file(filename)) or ""
+ else
+ return lpegmatch(parser,io.loaddata(resolvers.find_file(filename)) or "")
+ end
+end
+
+local command = lpeg.P("\\hyphenation")
+local parser = (1-command)^0 * command * content
+
+local function filterexceptions(filename)
+ if file.extname(filename) == "rhl" then
+ return io.loaddata(resolvers.find_file(filename)) or ""
+ else
+ return lpegmatch(parser,io.loaddata(resolvers.find_file(filename)) or {}) -- "" ?
+ end
+end
+
+local function record(tag)
+ local data = langdata[tag]
+ if not data then
+ data = lang.new()
+ langdata[tag] = data or 0
+ end
+ return data
+end
+
+languages.hyphenation.record = record
+
+function languages.hyphenation.define(tag)
+ local data = record(tag)
+ return data:id()
+end
+
+function languages.hyphenation.number(tag)
+ local d = langdata[tag]
+ return (d and d:id()) or 0
+end
+
+lang.exceptions = lang.hyphenation
+
+local function loadthem(tag, filename, filter, target)
+ statistics.starttiming(languages)
+ local data = record(tag)
+ local fullname = (filename and filename ~= "" and resolvers.find_file(filename)) or ""
+ local ok = fullname ~= ""
+ if ok then
+ if trace_patterns then
+ logs.report("languages","filtering %s for language '%s' from '%s'",target,tag,fullname)
+ end
+ lang[target](data,filterpatterns(fullname))
+ else
+ if trace_patterns then
+ logs.report("languages","no %s for language '%s' in '%s'",target,tag,filename or "?")
+ end
+ lang[target](data,"")
+ end
+ langdata[tag] = data
+ statistics.stoptiming(languages)
+ return ok
+end
+
+function languages.hyphenation.loadpatterns(tag, patterns)
+ return loadthem(tag, patterns, filterpatterns, "patterns")
+end
+
+function languages.hyphenation.loadexceptions(tag, exceptions)
+ return loadthem(tag, patterns, filterexceptions, "exceptions")
+end
+
+function languages.hyphenation.exceptions(tag, ...)
+ local data = record(tag)
+ data:hyphenation(...)
+end
+
+function languages.hyphenation.hyphenate(tag, str)
+ return lang.hyphenate(record(tag), str)
+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.hyphenation.n()
+ return table.count(langdata)
+end
+
+languages.registered = languages.registered or { }
+languages.associated = languages.associated or { }
+languages.numbers = languages.numbers or { }
+
+storage.register("languages/registered",languages.registered,"languages.registered")
+storage.register("languages/associated",languages.associated,"languages.associated")
+
+local numbers = languages.numbers
+local registered = languages.registered
+local associated = languages.associated
+
+-- we can speed this one up with locals if needed
+
+local function tolang(what)
+ local kind = type(what)
+ if kind == "number" then
+ local w = what >= 0 and what <= 0x7FFF and numbers[what]
+ return (w and langdata[w]) or 0
+ elseif kind == "string" then
+ return langdata[what]
+ else
+ return what
+ end
+end
+
+function languages.setup(what,settings)
+ what = languages.tolang(what or tex.language)
+ local lefthyphen = settings.lefthyphen
+ local righthyphen = settings.righthyphen
+ lefthyphen = lefthyphen ~= "" and lefthyphen or nil
+ righthyphen = righthyphen ~= "" and righthyphen or nil
+ lefthyphen = lefthyphen and utfbyte(lefthyphen) or 0
+ righthyphen = righthyphen and utfbyte(righthyphen) or 0
+ lang.posthyphenchar(what,lefthyphen)
+ lang.prehyphenchar (what,righthyphen)
+ lang.postexhyphenchar(what,lefthyphen)
+ lang.preexhyphenchar (what,righthyphen)
+end
+
+function languages.prehyphenchar(what)
+ return lang.prehyphenchar(tolang(what))
+end
+function languages.posthyphenchar(what)
+ return lang.posthyphenchar(tolang(what))
+end
+
+languages.tolang = tolang
+
+function languages.register(tag,parent,patterns,exceptions)
+ parent = parent or tag
+ registered[tag] = {
+ parent = parent,
+ patterns = patterns or format("lang-%s.pat",parent),
+ exceptions = exceptions or format("lang-%s.hyp",parent),
+ loaded = false,
+ number = 0,
+ }
+end
+
+function languages.associate(tag,script,language)
+ associated[tag] = { script, language }
+end
+
+function languages.association(tag)
+ if type(tag) == "number" then
+ tag = numbers[tag]
+ end
+ local lat = tag and associated[tag]
+ if lat then
+ return lat[1], lat[2]
+ else
+ return nil, nil
+ end
+end
+
+function languages.loadable(tag)
+ local l = registered[tag]
+ if l and l.patterns and resolvers.find_file(patterns) then
+ return true
+ else
+ return false
+ end
+end
+
+languages.share = false -- we don't share language numbers
+
+function languages.enable(tags)
+ -- beware: we cannot set tex.language, but need tex.normallanguage
+ for i=1,#tags do
+ local tag = tags[i]
+ local l = registered[tag]
+ if l and l ~= "" then
+ if not l.loaded then
+ local tag = l.parent
+ local number = languages.hyphenation.number(tag)
+ if languages.share and number > 0 then
+ l.number = number
+ else
+ -- we assume the same filenames
+ l.number = languages.hyphenation.define(tag)
+ languages.hyphenation.loadpatterns(tag,l.patterns)
+ languages.hyphenation.loadexceptions(tag,l.exceptions)
+ numbers[l.number] = tag
+ end
+ l.loaded = true
+ if trace_patterns then
+ logs.report("languages","assigning number %s",l.number)
+ end
+ end
+ if l.number > 0 then
+ return l.number
+ end
+ end
+ end
+ return 0
+end
+
+-- e['implementer']= 'imple{m}{-}{-}menter'
+-- e['manual'] = 'man{}{}{}'
+-- e['as'] = 'a-s'
+-- e['user-friendly'] = 'user=friend-ly'
+-- e['exceptionally-friendly'] = 'excep-tionally=friend-ly'
+
+function languages.hyphenation.loadwords(tag, filename)
+ local id = languages.hyphenation.number(tag)
+ if id > 0 then
+ local l = lang.new(id) or 0
+ statistics.starttiming(languages)
+ local data = io.loaddata(filename) or ""
+ l:hyphenation(data)
+ statistics.stoptiming(languages)
+ end
+end
+
+languages.hyphenation.define ("zerolanguage")
+languages.hyphenation.loadpatterns ("zerolanguage") -- else bug
+languages.hyphenation.loadexceptions("zerolanguage") -- else bug
+
+languages.logger = languages.logger or { }
+
+function languages.logger.report()
+ local result = { }
+ local sorted = table.sortedkeys(registered)
+ for i=1,#sorted do
+ local tag = sorted[i]
+ local l = registered[tag]
+ if l.loaded then
+ local p = (l.patterns and "pat") or '-'
+ local e = (l.exceptions and "exc") or '-'
+ result[#result+1] = format("%s:%s:%s:%s:%s", tag, l.parent, p, e, l.number)
+ end
+ end
+ return (#result > 0 and concat(result," ")) or "none"
+end
+
+-- must happen at the tex end
+
+languages.associate('en','latn','eng')
+languages.associate('uk','latn','eng')
+languages.associate('nl','latn','nld')
+languages.associate('de','latn','deu')
+languages.associate('fr','latn','fra')
+
+statistics.register("loaded patterns", function()
+ local result = languages.logger.report()
+ if result ~= "none" then
+ return result
+ end
+end)
+
+statistics.register("language load time", function()
+ return statistics.elapsedseconds(languages, format(", n=%s",languages.hyphenation.n()))
+end)
diff --git a/tex/context/base/lang-ini.mkii b/tex/context/base/lang-ini.mkii
new file mode 100644
index 000000000..91ac59847
--- /dev/null
+++ b/tex/context/base/lang-ini.mkii
@@ -0,0 +1,696 @@
+%D \module
+%D [ file=lang-ini,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Language 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 needs a further cleanup (real split between ii/iv).
+
+%D This module implements the (for the moment still simple)
+%D multi||language support of \CONTEXT, which should not be
+%D confused with the multi||lingual interface. This support
+%D will be extended when needed.
+
+\writestatus{loading}{ConTeXt Language Macros / Initialization}
+
+\unprotect
+
+\ifx\nonfrenchspacing\undefined \let\nonfrenchspacing\relax \fi
+\ifx\frenchspacing \undefined \let\frenchspacing \relax \fi
+
+%D When loading hyphenation patterns, \TEX\ assign a number to
+%D each loaded table, starting with~0. Switching to a specific
+%D table is done by assigning the relevant number to the
+%D predefined \COUNTER\ \type{\language}.
+
+%D We keep track of the last loaded patterns by means of a
+%D pseudo \COUNTER. This just one of those situations in which
+%D we don't want to spent a real one. Language zero has no
+%D patterns, first of all because I like to start numbering
+%D at one. It may come in handy for special purposes as well.
+
+\normallanguage\zerocount \def\loadedlanguage{1}
+
+%D \macros
+%D {currentlanguage, setupcurrentlanguage}
+%D
+%D Instead of numbers,we are going to use symbolic names for
+%D the languages. The current langage is saved in the macro
+%D \type {\currentlanguage}. The setup macro is mainly used
+%D for cosmetic purposes.
+%D
+%D \starttyping
+%D \dorecurse{3}
+%D {\language[nl]
+%D \startmode[*en] english \stopmode
+%D \startmode[*nl] dutch \stopmode
+%D \language[en]
+%D \startmode[*en] english \stopmode
+%D \startmode[*nl] dutch \stopmode}
+%D \stoptyping
+
+\let\currentlanguage \empty
+\let\currentmainlanguage\empty
+
+\def\setupcurrentlanguage[#1]{\setcurrentlanguage\currentmainlanguage{#1}}
+
+\def\setcurrentlanguage#1#2% sets modes: **id (currentmain) *id (current)
+ {\doifsomething{#1}
+ {\ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
+ \edef\currentmainlanguage{#1}%
+ \setsystemmode{\systemmodeprefix\currentmainlanguage}}%
+ \doifsomething{#2}
+ {\ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi
+ \edef\currentlanguage{#2}%
+ \setsystemmode\currentlanguage}}
+
+%D The internal macros will be defined later.
+
+%D \macros
+%D {installlanguage}
+%D
+%D Hyphenation patterns can only be loaded when the format file
+%D is prepared. The next macro takes care of this loading. A
+%D language is specified with
+%D
+%D \showsetup{installlanguage}
+%D
+%D When \type {state} equals \type {start}, both patterns
+%D and additional hyphenation specifications are loaded. These
+%D files are seached for on the system path and are to be
+%D named:
+%D
+%D \starttyping
+%D \f!languageprefix-identifier.\f!patternsextension
+%D \f!languageprefix-identifier.\f!hyhensextension
+%D \stoptyping
+%D
+%D The \type{spacing} variable specifies how the spaces after
+%D punctuation has to be handled. English is by tradition more
+%D tolerant to inter||sentence spacing than other languages.
+%D
+%D This macro also defines \type {\identifier} as a shortcut
+%D switch to the language. Furthermore the command defined as
+%D being language specific, are executed. With
+%D \type {default} we can default to another language
+%D (patterns) at format generation time. This default language
+%D is overruled when the appropriate patterns are loaded (some
+%D implementations support run time addition of patterns to a
+%D preloaded format).
+
+\def\dodoinstalllanguage#1#2% #2 added
+ {\doifundefined{#1}{\setvalue{#1}{\complexlanguage[#2]}}%
+ \expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
+ \doifundefined\ascii{\setvalue\ascii{\complexlanguage[#2]}}}
+
+%D \macros
+%D {preloadlanguages}
+%D
+%D We first try to load the files defined as file synonym
+%D for \type {lang-*.pat} and \type {lang-*.hyp}. After that we
+%D fall back on those files. The macro \type {\preloadpatterns}
+%D reports which patterns are loaded and what hyphenmin
+%D values are set.
+
+\let\installedlanguages\empty
+
+\def\doiflanguageelse#1{\doifdefinedelse{\??la#1\c!state}}
+
+\def\doloadlanguagefiles#1%
+ {\doifelsevalue{\??la#1\c!state}\v!start
+ {\edef\languagesuffix{\specificlanguageparameter{#1}\s!patterns}%
+ \ifx\languagesuffix\empty
+ \edef\languagesuffix{\defaultlanguage{#1}}%
+ \else\ifx\languagesuffix\relax
+ \edef\languagesuffix{\defaultlanguage{#1}}%
+ \fi\fi
+ \ifx\languagesuffix\empty
+ \edef\languagesuffix{#1}%
+ \fi
+ \doifundefinedelse{\??la\??la:\currentencoding:\currentmapping:\languagesuffix}
+ {\doloadpatterns{#1}\languagesuffix}
+ {\bgroup
+ \edef\loadedlanguage{\getvalue{\??la\??la:\currentencoding:\currentmapping:\languagesuffix}}%
+ %\showmessage\m!linguals1{\languagesuffix,#1,\loadedlanguage,*,*}%
+ %\showmessage\m!linguals3{\languagesuffix,#1,\loadedlanguage,*,*}%
+ \egroup}}
+ {\showmessage\m!linguals5{#1}}}
+
+\def\doinstalllanguage[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\doiflanguageelse{#1}
+ {\getparameters[\??la#1][#2]}
+ {\setvalue{\l!prefix!#1}{#1}%
+ \addtocommalist{#1}\installedlanguages
+ \dodoinstalllanguage{#1}{#1}%
+ \getparameters[\??la#1][\c!state=\v!start,#2]}%
+ \doloadlanguagefiles{#1}}
+ {\setvalue{\l!prefix!#1}{#2}%
+ \getparameters[\??la#1][\s!default=#2]%
+ \dodoinstalllanguage{#1}{#2}}}
+
+\def\reallanguagetag#1%
+ {\ifcsname\l!prefix!#1\endcsname\csname\l!prefix!#1\endcsname\else#1\fi}
+
+\let\preloadedpatterns\empty
+\let\preloadedpmessage\empty
+
+\def\doshowpatterns#1#2#3#4% language number encoding mapping
+ {#1->#3:#4->#2->\specificlanguageparameter{#1}\s!lefthyphenmin:\specificlanguageparameter{#1}\s!righthyphenmin\space}
+
+\def\preloadlanguages
+ {\doifsomething\preloadedpmessage{\showmessage\m!linguals{10}\preloadedpmessage}}
+
+\def\preloadallpatterns
+ {\gdef\preloadallpatterns##1{\installlanguage[##1][\c!state=\v!start]}%
+ \processcommacommand[\installedlanguages]\preloadallpatterns
+ \global\let\preloadallpatterns\relax}
+
+% ^^ \language[#1] gave unwanted side effect of loading language specifics
+
+\def\installlanguage
+ {\dodoubleargument\doinstalllanguage}
+
+%D When the second argument is a language identifier, a
+%D synonym is created. This feature is present because we
+%D used dutch mnemonics in the dutch version, but nowadays
+%D conform a standard.
+
+\let \patternencoding \s!default
+\let \patternmapping \s!default
+
+\def\doifpatternselse#1%
+ {\expanded{\doifinsetelse{#1}{\preloadedpatterns}}}
+
+\def\doloadpatterns#1#2%
+ {\edef\askedlanguageencoding{\specificlanguageparameter{#1}\s!encoding}%
+ \edef\askedlanguagemapping {\specificlanguageparameter{#1}\s!mapping}%
+ \expanded{\getcommacommandsize[\askedlanguageencoding]}%
+ % slightly faster: \let\unicodechar\utfunihashglyph
+ \ifnum\commalistsize>0
+ %\message{[nofpatterns #2: \commalistsize/\askedlanguageencoding]}%
+ \dorecurse\commalistsize
+ {\expanded{\getfromcommacommand[\askedlanguageencoding][\recurselevel]}%
+ \let\patternencoding\commalistelement
+ \expanded{\getfromcommacommand[\askedlanguagemapping][\recurselevel]}%
+ \let\patternmapping \commalistelement
+ %\message{[patterns: #1/#2/\patternencoding/\patternmapping]}%
+ \dodoloadpatterns{#1}{#2}\patternencoding\patternmapping}%
+ \else
+ %\message{[patterns: #1/#2]}%
+ \dodoloadpatterns{#1}{#2}{}{}%
+ \fi}
+
+\ifnum\texengine=\xetexengine
+
+ \def\doloadpatterns#1#2%
+ {%\letvalue{\??la#2\s!encoding}\empty
+ %\letvalue{\??la#2\s!mapping }\empty
+ \dodoloadpatterns{#1}{#2}{}{}}
+
+\fi
+
+\def\setuphyppatencoding
+ {\pathypsettings
+ \enableregime[utf]}
+
+\def\dodoloadpatterns#1#2#3#4% beware, loaded language also incr
+ {\normallanguage\loadedlanguage % when not really needed
+ \bgroup
+ \let\synchronizepatterns\relax % needed?
+ \let\enabledmapping \empty % needed?
+ \doifelsenothing{#3}{\enableencoding[\s!default]}{\enableencoding[#3]}%
+ \doifelsenothing{#4}{\enablemapping [\s!default]}{\enablemapping [#4]}%
+ \setuphyppatencoding
+ \ifundefined{\??la\??la:\currentencoding:\currentmapping:#2}%
+ \let\doshowpatterns\relax
+ \edef\alreadyloadedlanguage
+ {\executeifdefined{\??la\??la:\currentencoding:\currentmapping:\truefilename{\f!languageprefix#2.\f!patternsextension}}\empty}%
+ \edef\alreadyloadedlanguage
+ {\executeifdefined{\??la\??la:\currentencoding:\currentmapping:\f!languageprefix#2.\f!patternsextension}\alreadyloadedlanguage}%
+ \ifx\alreadyloadedlanguage\empty
+ \letgvalue{\??la\??la:\currentencoding:\currentmapping:#2}\loadedlanguage
+ \doifundefined{\??la\??la:\s!default:\s!default:#2}{\letgvalue{\??la\??la:\s!default:\s!default:#2}\loadedlanguage}% fall back
+ \startpatternloading{\truefilename{\f!languageprefix#2.\f!patternsextension}}{#3}{#4}%
+ \readsysfile{\truefilename{\f!languageprefix#2.\f!patternsextension}}
+ {\setxvalue{\??la#1\s!patterns}{#2}%
+ \setxvalue{\??la\??la:\currentencoding:\currentmapping:\truefilename{\f!languageprefix#2.\f!patternsextension}}{\number\loadedlanguage}%
+ \xdef\preloadedpmessage{\preloadedpmessage\doshowpatterns{#2}{\number\normallanguage}{\currentencoding}{\currentmapping}}%
+ \doglobal\addtocommalist{#2}\preloadedpatterns
+ \showmessage\m!linguals1{#2,#1,\loadedlanguage,\currentencoding,\currentmapping}}
+ {\showmessage\m!linguals2{#2,#1,\loadedlanguage,\currentencoding,\currentmapping,\f!languageprefix#2.\f!patternsextension,\truefilename{\f!languageprefix#2.\f!patternsextension}}}%
+ \stoppatternloading
+ \startpatternloading{\truefilename{\f!languageprefix#2.\f!hyphensextension}}{#3}{#4}%
+ \readsysfile{\truefilename{\f!languageprefix#2.\f!hyphensextension}}
+ {\showmessage\m!linguals3{#2,#1,\loadedlanguage,\currentencoding,\currentmapping}}
+ {\showmessage\m!linguals4{#2,#1,\loadedlanguage,\currentencoding,\currentmapping}}%
+ \stoppatternloading
+ \doglobal\increment\loadedlanguage
+ % \stopencoding
+ \else % optimization, introduced 2004.08.24, while sorting out changes in tl
+ \letgvalue{\??la\??la:\currentencoding:\currentmapping:#2}\alreadyloadedlanguage
+ \doifundefined{\??la\??la:\s!default:\s!default:#2}{\letgvalue{\??la\??la:\s!default:\s!default:#2}\loadedlanguage}% fall back
+ \setxvalue{\??la#1\s!patterns}{#2}%
+ \xdef\preloadedpmessage{\preloadedpmessage\doshowpatterns{#2}{[\number\alreadyloadedlanguage]}{\currentencoding}{\currentmapping}}%
+ \doglobal\addtocommalist{#2}\preloadedpatterns
+ \showmessage\m!linguals1{#2,#1,[\alreadyloadedlanguage],\currentencoding,\currentmapping}%
+ \fi
+ \fi
+ \egroup}
+
+\fetchruntimecommand \showpatterns {\f!languageprefix\s!run.mkii}
+
+%D Since we can only load patterns in ini\TeX, we nil the
+%D loading before dumping (which saves a bit of memory, but
+%D strangely enough not in the format).
+
+\appendtoks
+ \gdef\doloadpatterns{\doglobal\increment\loadedlanguage\gobbletwoarguments}%
+ \globallet\dodoloadpatterns\gobblefourarguments
+\to \everydump
+
+%D \macros
+%D {setuplanguage}
+%D
+%D Quick and dirty, but useful:
+%D
+%D \showsetup{setuplanguage}
+%D
+%D Beware, this command can only be used when a language is installed.
+
+\unprotected \def\setuplanguage
+ {\dodoubleempty\dosetuplanguage}
+
+\def\dosetuplanguage[#1][#2]% handy patch for testing
+ {\ifsecondargument
+ \getparameters[\??la#1][#2]%
+ \doif{#1}\currentlanguage\docomplexlanguage
+ \else
+ \getparameters[\??la\currentlanguage][#1]%
+ \docomplexlanguage
+ \fi}
+
+\setuplanguage
+ [\s!default]
+ [\s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \s!patterns=,
+ \c!spacing=\v!packed,
+ \s!encoding=,
+ \s!mapping=,
+ \c!lefthyphen=,
+ \c!righthyphen=-,
+ \c!hyphen=-,
+ \c!midsentence=---,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!leftspeech=\languageparameter\c!leftquotation,
+ \c!middlespeech=,
+ \c!rightspeech=\languageparameter\c!rightquotation,
+ \c!limittext=\unknown,
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day},
+ \c!text=Ag]
+
+% rather new, split and per language
+
+\setuplanguage
+ [\s!default]
+ [\c!compoundhyphen=\compoundhyphen,
+ \c!leftcompoundhyphen=\compoundhyphen,
+ \c!rightcompoundhyphen=]
+
+%D The values \type {leftsentence} and \type
+%D {rightsentence} can be (and are) used to implement
+%D automatic subsentence boundary glyphs, like in {\fr
+%D |<|french guillemots|>|} or {\de |<|german guillemots|>|} or
+%D {\nl |<|dutch dashes|>|} like situations. Furthermore \type
+%D {leftquotation} and \type {leftquote} come into view
+%D \quotation {when we quote} or \quote {quote} something.
+
+%D \macros
+%D {currentdatespecification}
+%D
+%D Just to make things easy we can ask for the current date
+%D specification by saying:
+
+\def\currentdatespecification{\languageparameter\c!date}
+
+%D This command is not meant for users.
+
+%D Carefull reading of these macros shows that it's legal to
+%D say
+%D
+%D \starttyping
+%D \installlanguage [du] [de]
+%D \stoptyping
+
+%D \macros
+%D {language,mainlanguage}
+%D
+%D Switching to another language (actually another hyphenation
+%D pattern) is done with:
+%D
+%D \starttyping
+%D \language[identifier]
+%D \stoptyping
+%D
+%D or with \type{\identifier}. Just to be compatible with
+%D \PLAIN\ \TEX, we still support the original meaning, so
+%D
+%D \starttyping
+%D \language=1
+%D \stoptyping
+%D
+%D is a valid operation, where the relation between number
+%D and language depends on the order in installing languages.
+%D
+%D \showsetup{language}
+%D \showsetup{mainlanguage}
+%D
+%D Both commands take a predefined language identifier as
+%D argument. We can use \type{\mainlanguage[identifier]} for
+%D setting the (indeed) main language. This is the language
+%D used for translating labels like {\em figure} and {\em
+%D table}. The main language defaults to the current language.
+%D
+%D We take care of local as well as standardized language
+%D switching (fr and fa, de and du, but nl and nl).
+
+\ifx\synchronizepatterns \undefined \let\synchronizepatterns\relax \fi
+\ifx\synchronizepatternswithfont\undefined \def\synchronizepatternswithfont{\synchronizepatterns} \fi
+
+\def\setnormallanguage#1#2% current default
+ {% called quite often, so we use \csname
+ % \def\synchronizepatterns{\setnormallanguage
+ % {\csname\??la\currentlanguage\s!patterns\endcsname}}% called often
+ % of even better pre-expand in an ugly way:
+ \ifnum\normallanguage<\zerocount
+ % we've blocked hyphenation (e.g. verbatim)
+ \else
+ \edef\synchronizepatterns{\noexpand\dosetnormallanguage{\languageparameter\s!patterns}}%
+ \donefalse
+ \synchronizepatterns
+ \ifdone\else
+ \def\synchronizepatterns{\dosetnormallanguage\currentlanguage}%
+ \synchronizepatterns
+ \ifdone\else
+ \ifx\currentdefaultlanguage\empty\else
+ \edef\synchronizepatterns{\noexpand\dosetnormallanguage{\specificlanguageparameter\currentdefaultlanguage\s!patterns}}%
+ \synchronizepatterns
+ \ifdone\else
+ \dosetnormallanguage\currentdefaultlanguage
+ \synchronizepatterns
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\normallanguage\zerocount
+
+\def\dosetnormallanguage#1% #1 == \cs (no longer)
+ {\ifnum\normallanguage<\zerocount
+ % we've blocked hyphenation (e.g. verbatim)
+ \else
+ \dodosetnormallanguage{:\currentencoding:\currentmapping:}{#1}{%
+ \dodosetnormallanguage{:\currentencoding:\s!default :}{#1}{%
+ \dodosetnormallanguage{:\s!default :\currentmapping:}{#1}{%
+ \dodosetnormallanguage{:\s!default :\s!default :}{#1}\empty}}}%
+ \fi}
+
+\def\dodosetnormallanguage#1#2%
+ {\ifcsname\??la\??la#1#2\endcsname
+ \edef\thenormallanguage{\csname\??la\??la#1#2\endcsname}% can be \chardef
+ \ifx\thenormallanguage\empty
+ \@EAEAEA\firstofoneargument
+ \else
+ \donetrue
+ \@EA\xdef\csname\??la\currentlanguage\s!patterns\endcsname{#2}%
+ \normallanguage\thenormallanguage\relax % \relax is needed for lookahead problems
+ \@EAEAEA\gobbleoneargument
+ \fi
+ \else
+ \@EA\firstofoneargument
+ \fi}
+
+\newevery \everylanguage \relax
+
+\def\disablelanguagespecifics
+ {\ignorecompoundcharacter}
+
+\def\sethyphenationvariables
+ {\lefthyphenmin 0\languageparameter\s!lefthyphenmin \relax
+ \righthyphenmin0\languageparameter\s!righthyphenmin\relax
+ \lefthyphenmin \numexpr\lefthyphenmin +\hyphenminoffset\relax
+ \righthyphenmin\numexpr\righthyphenmin+\hyphenminoffset\relax}
+
+\def\docomplexlanguage% assumes that \currentlanguage is set
+ {\edef\currentdefaultlanguage{\defaultlanguage\currentlanguage}%
+ \setnormallanguage\currentlanguage\currentdefaultlanguage
+ \the\everylanguage
+ \enablelanguagespecifics[\currentlanguage]%
+ \sethyphenationvariables
+ \relax
+ % will be definable and move to core-spa !
+ \doifelse{\languageparameter\c!spacing}\v!broad\nonfrenchspacing\frenchspacing}
+
+\ifx\enablelanguagespecifics\undefined \def\enablelanguagespecifics[#1]{} \fi
+
+% The following may be a solution for the fact that one cannot
+% change catcodes of characters like : and ; inside an environment.
+
+\appendtoks
+ \enablelanguagespecifics[\currentlanguage]%
+\to \everystarttext
+
+\def\complexlanguage[#1]%
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty \else
+ \ifcsname\l!prefix!\askedlanguage\endcsname
+ \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
+ \ifx\currentlanguage\askedlanguage \else
+ \setcurrentlanguage\currentmainlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \else
+ \showmessage\m!linguals6{#1}%
+ \fi
+ \fi}
+
+\let\simplelanguage\normallanguage
+
+\definecomplexorsimple\language
+
+\def\mainlanguage[#1]%
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty \else
+ \ifcsname\l!prefix!\askedlanguage\endcsname
+ \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
+ \ifx\currentlanguage\askedlanguage
+ \ifx\currentmainlanguage\askedlanguage
+ \else
+ \setcurrentlanguage\askedlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \else
+ \setcurrentlanguage\askedlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \fi
+ \fi}
+
+%D \macros
+%D {defaultlanguage,languageparameter,specificlanguageparameter}
+
+\def\defaultlanguage#1%
+ {\ifcsname\??la#1\s!default\endcsname
+ \expandafter\defaultlanguage\csname\??la#1\s!default\endcsname
+ \else
+ #1%
+ \fi}
+
+\def\languageparameter#1%
+ {\ifcsname\??la\currentlanguage#1\endcsname
+ \csname\??la\currentlanguage#1\endcsname
+ \else\ifcsname\??la\currentlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??la\currentlanguage\s!default\endcsname{#1}%
+ \else\ifcsname\??la\s!default#1\endcsname
+ \csname\??la\s!default#1\endcsname
+ \fi\fi\fi}
+
+\def\specificlanguageparameter#1#2%
+ {\ifcsname\??la#1#2\endcsname
+ \csname\??la#1#2\endcsname
+ \else\ifcsname\??la#1\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??la#1\s!default\endcsname{#2}%
+ \else\ifcsname\??la\s!default#2\endcsname
+ \csname\??la\s!default#2\endcsname
+ \fi\fi\fi}
+
+%D New (see nomarking and nolist):
+
+\def\splitsequence#1#2%
+ {\doifelse{#1}\v!no{#2}{\doifelse{#1}\v!yes{\languageparameter\c!limittext}{#1}}}
+
+\def\splitsymbol#1%
+ {\splitsequence{#1}{\languageparameter\c!limittext}}
+
+%D Just like with subsentence boundary symbols, quotes
+%D placement depends on the current language, therefore we show
+%D the defaults here.
+%D
+%D \def\ShowLanguageValues [#1] [#2] #3 #4
+%D {\blank
+%D \startlinecorrection
+%D \vbox\bgroup
+%D \language[#1]%
+%D \setbox0=\hbox to \hsize{\hss\bf#2 subsentence symbol and quotes\hss}
+%D \dp0=0pt
+%D \box0
+%D \vskip.5em
+%D \hrule
+%D \vskip.5em
+%D \let\normalbar=|
+%D \hbox to \hsize
+%D {\hfil\quotation{#3 #4}\hfil\quote{#2}\hfil
+%D \let|=\normalbar\strut|<||<|#3|>|#4|>|\hfil}
+%D \vskip.5em
+%D \hrule
+%D \egroup
+%D \stoplinecorrection
+%D \blank}
+%D
+%D \ShowLanguageValues [af] [afrikaans] afrikaanse ...
+%D \ShowLanguageValues [ca] [catalan] catalan ...
+%D \ShowLanguageValues [cs] [czech] tjechisch tex
+%D \ShowLanguageValues [cs] [slovak] slowaakse ...
+%D \ShowLanguageValues [da] [danish] deense ...
+%D \ShowLanguageValues [de] [german] duitse degelijkheid
+%D \ShowLanguageValues [en] [english] engelse humor
+%D \ShowLanguageValues [fi] [finnish] finse ...
+%D \ShowLanguageValues [fr] [french] franse slag
+%D \ShowLanguageValues [it] [italian] italiaanse ...
+%D \ShowLanguageValues [la] [latin] latijnse missen
+%D \ShowLanguageValues [nl] [dutch] nederlandse zuinigheid
+%D \ShowLanguageValues [nb] [bokmal] noorse zalm
+%D \ShowLanguageValues [nn] [nnynorsk] noorse zalm
+%D \ShowLanguageValues [pl] [polish] poolse vlag
+%D \ShowLanguageValues [pt] [portuguese] portugese ...
+%D \ShowLanguageValues [es] [spanish] spaans benauwd
+%D \ShowLanguageValues [sv] [swedish] zweedse ...
+%D \ShowLanguageValues [tr] [turkish] turks fruit
+
+%D We support a lot of languages. These are specified and
+%D loaded in separate files, according to their roots. Here
+%D we only take care of (postponed) setting of the current
+%D language.
+%D
+%D \unprotect
+%D \placetable{The germanic languages (\type{lang-ger})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!nl \NC dutch \NC germanic \NC\FR
+%D \NC \s!en \NC english \NC germanic \NC\MR
+%D \NC \s!de \NC german \NC germanic \NC\MR
+%D \NC \s!da \NC danish \NC germanic \NC\MR
+%D \NC \s!sv \NC swedish \NC germanic \NC\MR
+%D \NC \s!af \NC afrikaans \NC germanic \NC\MR
+%D \NC \s!nb \NC bokmal \NC germanic \NC\LR
+%D \NC \s!nn \NC nynorsk \NC germanic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D
+%D \unprotect
+%D \placetable{The italic languages (\type{lang-ita})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fr \NC french \NC italic \NC\FR
+%D \NC \s!ca \NC catalan \NC italic \NC\MR
+%D \NC \s!es \NC spanish \NC italic \NC\MR
+%D \NC \s!it \NC italian \NC italic \NC\MR
+%D \NC \s!la \NC latin \NC italic \NC\MR
+%D \NC \s!pt \NC portuguese \NC italic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D
+%D \unprotect
+%D \placetable{The slavic languages (\type{lang-sla})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!pl \NC polish \NC slavic \NC\FR
+%D \NC \s!cs \NC czech \NC slavic \NC\MR
+%D \NC \s!sk \NC slavik \NC slavic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D \unprotect
+%D
+%D \placetable{The altaic languages (\type{lang-alt})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!tr \NC turkish \NC altaic \NC\SR
+%D \HL
+%D \stoptable
+%D
+%D \placetable{The uralic languages (\type{lang-ura})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fi \NC finnish \NC uralic \NC\SR
+%D \HL
+%D \stoptable
+%D \protect
+
+% \bgroup \normallanguage255 \patterns{} \egroup
+% \def\nopatterns{\normallanguage255 }
+
+\def\nopatterns{\normallanguage\minusone}
+
+%D \XETEX\ is \UNICODE:
+
+\ifnum\texengine=\xetexengine
+
+ \def\synchronizepatternswithfont{}
+ \def\doloadpatterns #1#2{\dodoloadpatterns{#1}{#2}\s!default\s!default}
+ \def\dosetnormallanguage #1{\dodosetnormallanguage{:\s!default:\s!default:}{#1}\empty}
+ \def\setuphyppatencoding {\pathypsettings}
+
+\fi
+
+%D We default to the language belonging to the interface. This
+%D is one of the few places outside the interface modules where
+%D \type{\startinterface} is used.
+
+%D We default to english:
+
+\setupcurrentlanguage[\s!en]
+
+\def\initializemainlanguage
+ {\mainlanguage[\currentlanguage]%
+ \showmessage\m!linguals9\currentlanguage}
+
+\protect \endinput
diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv
new file mode 100644
index 000000000..45bb71b85
--- /dev/null
+++ b/tex/context/base/lang-ini.mkiv
@@ -0,0 +1,560 @@
+%D \module
+%D [ file=lang-ini,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Language 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 needs a further cleanup (real split between ii/iv).
+
+%D This module implements the (for the moment still simple)
+%D multi||language support of \CONTEXT, which should not be
+%D confused with the multi||lingual interface. This support
+%D will be extended when needed.
+
+\writestatus{loading}{ConTeXt Language Macros / Initialization}
+
+\registerctxluafile{lang-ini}{1.001}
+
+\unprotect
+
+% \def\testlanguage[#1]%
+% {\start
+% \language[#1]
+% \number\normallanguage/\the\lefthyphenmin/\the\righthyphenmin:
+% \input tufte
+% \hyphenatedword{effetestenofditwerkt}
+% \par
+% \stop}
+%
+% \testlanguage[de] \testlanguage[de-de] \testlanguage[de-at] \testlanguage[de-ch] \page
+% \testlanguage[en] \testlanguage[us] \testlanguage[en-us] \testlanguage[uk] \testlanguage[en-gb] \page
+
+\ifx\nonfrenchspacing\undefined \let\nonfrenchspacing\relax \fi
+\ifx\frenchspacing \undefined \let\frenchspacing \relax \fi
+
+%D When loading hyphenation patterns, \TEX\ assign a number to
+%D each loaded table, starting with~0. Switching to a specific
+%D table is done by assigning the relevant number to the
+%D predefined \COUNTER\ \type{\language}.
+
+%D We keep track of the last loaded patterns by means of a
+%D pseudo \COUNTER. This just one of those situations in which
+%D we don't want to spent a real one. Language zero has no
+%D patterns, first of all because I like to start numbering
+%D at one. It may come in handy for special purposes as well.
+
+\normallanguage\zerocount \def\loadedlanguage{1}
+
+%D \macros
+%D {currentlanguage, setupcurrentlanguage}
+%D
+%D Instead of numbers,we are going to use symbolic names for
+%D the languages. The current langage is saved in the macro
+%D \type {\currentlanguage}. The setup macro is mainly used
+%D for cosmetic purposes.
+%D
+%D \starttyping
+%D \dorecurse{3}
+%D {\language[nl]
+%D \startmode[*en] english \stopmode
+%D \startmode[*nl] dutch \stopmode
+%D \language[en]
+%D \startmode[*en] english \stopmode
+%D \startmode[*nl] dutch \stopmode}
+%D \stoptyping
+
+\let\currentlanguage \empty
+\let\currentmainlanguage\empty
+
+\unexpanded\def\setupcurrentlanguage[#1]{\setcurrentlanguage\currentmainlanguage{#1}}
+
+\def\setcurrentlanguage#1#2% sets modes: **id (currentmain) *id (current)
+ {\edef\xaskedlanguage{#1}% otherwise clash with \askedlanguage
+ \ifx\xaskedlanguage\empty \else
+ \ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
+ \let\currentmainlanguage\xaskedlanguage
+ \setsystemmode{\systemmodeprefix\currentmainlanguage}%
+ \fi
+ \edef\xaskedlanguage{#2}%
+ \ifx\xaskedlanguage\empty \else
+ \ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi
+ \let\currentlanguage\xaskedlanguage
+ \setsystemmode\currentlanguage
+ \fi}
+
+%D The internal macros will be defined later.
+
+%D \macros
+%D {installlanguage}
+%D
+%D Hyphenation patterns can only be loaded when the format file
+%D is prepared. The next macro takes care of this loading. A
+%D language is specified with
+%D
+%D \showsetup{installlanguage}
+%D
+%D When \type {state} equals \type {start}, both patterns
+%D and additional hyphenation specifications are loaded. These
+%D files are seached for on the system path and are to be
+%D named:
+%D
+%D \starttyping
+%D \f!languageprefix-identifier.\f!patternsextension
+%D \f!languageprefix-identifier.\f!hyhensextension
+%D \stoptyping
+%D
+%D The \type{spacing} variable specifies how the spaces after
+%D punctuation has to be handled. English is by tradition more
+%D tolerant to inter||sentence spacing than other languages.
+%D
+%D This macro also defines \type {\identifier} as a shortcut
+%D switch to the language. Furthermore the command defined as
+%D being language specific, are executed. With
+%D \type {default} we can default to another language
+%D (patterns) at format generation time. This default language
+%D is overruled when the appropriate patterns are loaded (some
+%D implementations support run time addition of patterns to a
+%D preloaded format).
+
+\def\dodoinstalllanguage#1#2% #2 added
+ {\expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
+ \ifcsname #1\endcsname\else\setvalue {#1}{\complexlanguage[#2]}\fi
+ \ifcsname\ascii\endcsname\else\setvalue\ascii{\complexlanguage[#2]}\fi}
+
+%D \macros
+%D {preloadlanguages}
+%D
+%D We first try to load the files defined as file synonym
+%D for \type {lang-*.pat} and \type {lang-*.hyp}. After that we
+%D fall back on those files. The macro \type {\preloadpatterns}
+%D reports which patterns are loaded and what hyphenmin
+%D values are set.
+
+\let\installedlanguages\empty
+
+\def\doiflanguageelse#1{\doifdefinedelse{\??la#1\c!state}}
+
+\def\doloadpatterns#1#2%
+ {\ctxlua{languages.register(
+ "#1",
+ "#2",
+ "\truefilename{\f!languageprefix#2.\f!patternsextension}",
+ "\truefilename{\f!languageprefix#2.\f!hyphensextension }")
+ }}
+
+\def\doloadlanguagefiles#1%
+ {\edef\languagesuffix{\specificlanguageparameter{#1}\s!patterns}%
+ \ifx\languagesuffix\empty
+ \edef\languagesuffix{\defaultlanguage{#1}}%
+ \else\ifx\languagesuffix\relax
+ \edef\languagesuffix{\defaultlanguage{#1}}%
+ \fi\fi
+ \ifx\languagesuffix\empty
+ \edef\languagesuffix{#1}%
+ \fi
+ \doloadpatterns{#1}\languagesuffix}
+
+\def\doinstalllanguage[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\doiflanguageelse{#1}
+ {\getparameters[\??la#1][#2]}
+ {\setvalue{\l!prefix!#1}{#1}%
+ \addtocommalist{#1}\installedlanguages
+ \dodoinstalllanguage{#1}{#1}%
+ \getparameters[\??la#1][\c!state=\v!start,#2]}%
+ \doloadlanguagefiles{#1}}
+ {\setvalue{\l!prefix!#1}{#2}%
+ \getparameters[\??la#1][\s!default=#2]%
+ \dodoinstalllanguage{#1}{#2}}}
+
+\def\reallanguagetag#1%
+ {\ifcsname\l!prefix!#1\endcsname\csname\l!prefix!#1\endcsname\else#1\fi}
+
+% ^^ \language[#1] gave unwanted side effect of loading language specifics
+
+\def\installlanguage
+ {\dodoubleargument\doinstalllanguage}
+
+%D When the second argument is a language identifier, a
+%D synonym is created. This feature is present because we
+%D used dutch mnemonics in the dutch version, but nowadays
+%D conform a standard.
+
+\def\doifpatternselse#1%
+ {\ctxlua{cs.testcase(languages.loadable("#1"))}}
+
+%D \macros
+%D {setuplanguage}
+%D
+%D Quick and dirty, but useful:
+%D
+%D \showsetup{setuplanguage}
+%D
+%D Beware, this command can only be used when a language is installed.
+
+\unexpanded\def\setuplanguage
+ {\dodoubleempty\dosetuplanguage}
+
+\def\dosetuplanguage[#1][#2]% handy patch for testing
+ {\ifsecondargument
+ \getparameters[\??la#1][#2]%
+ \doif{#1}\currentlanguage\docomplexlanguage
+ \else
+ \getparameters[\??la\currentlanguage][#1]%
+ \docomplexlanguage
+ \fi}
+
+\setuplanguage
+ [\s!default]
+ [\s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \s!patterns=,
+ \c!spacing=\v!packed,
+ \c!lefthyphen=,
+ \c!righthyphen=-,
+ \c!hyphen=-,
+ \c!midsentence=---,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!leftspeech=\languageparameter\c!leftquotation,
+ \c!middlespeech=,
+ \c!rightspeech=\languageparameter\c!rightquotation,
+ \c!limittext=\unknown,
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day},
+ \c!text=Ag]
+
+% rather new, split and per language
+
+\setuplanguage
+ [\s!default]
+ [\c!compoundhyphen=\compoundhyphen,
+ \c!rightcompoundhyphen=\compoundhyphen,
+ \c!leftcompoundhyphen=]
+
+%D The values \type {leftsentence} and \type
+%D {rightsentence} can be (and are) used to implement
+%D automatic subsentence boundary glyphs, like in {\fr
+%D |<|french guillemots|>|} or {\de |<|german guillemots|>|} or
+%D {\nl |<|dutch dashes|>|} like situations. Furthermore \type
+%D {leftquotation} and \type {leftquote} come into view
+%D \quotation {when we quote} or \quote {quote} something.
+
+%D \macros
+%D {currentdatespecification}
+%D
+%D Just to make things easy we can ask for the current date
+%D specification by saying:
+
+\def\currentdatespecification{\languageparameter\c!date}
+
+%D This command is not meant for users.
+
+%D Carefull reading of these macros shows that it's legal to
+%D say
+%D
+%D \starttyping
+%D \installlanguage [du] [de]
+%D \stoptyping
+
+%D \macros
+%D {language,mainlanguage}
+%D
+%D Switching to another language (actually another hyphenation
+%D pattern) is done with:
+%D
+%D \starttyping
+%D \language[identifier]
+%D \stoptyping
+%D
+%D or with \type{\identifier}. Just to be compatible with
+%D \PLAIN\ \TEX, we still support the original meaning, so
+%D
+%D \starttyping
+%D \language=1
+%D \stoptyping
+%D
+%D is a valid operation, where the relation between number
+%D and language depends on the order in installing languages.
+%D
+%D \showsetup{language}
+%D \showsetup{mainlanguage}
+%D
+%D Both commands take a predefined language identifier as
+%D argument. We can use \type{\mainlanguage[identifier]} for
+%D setting the (indeed) main language. This is the language
+%D used for translating labels like {\em figure} and {\em
+%D table}. The main language defaults to the current language.
+%D
+%D We take care of local as well as standardized language
+%D switching (fr and fa, de and du, but nl and nl).
+
+\def\dosetnormallanguage#1#2% current default
+ {\edef\askedlanguagepatterns{\specificlanguageparameter{#1}\s!patterns}%
+ \normallanguage=\ctxlua{tex.sprint(languages.enable({"\askedlanguagepatterns","#1","#2"}))}%
+ \ifproductionrun
+ \setxvalue{\??la\??la#1#2}{\number\normallanguage}%
+ \fi}
+
+\def\setnormallanguage#1#2% current default / we can freeze the number here
+ {\ifcsname\??la\??la#1#2\endcsname
+ \normallanguage\csname\??la\??la#1#2\endcsname % todo: we can set language at the lua end now
+ \else
+ \dosetnormallanguage{#1}{#2}%
+ \fi}
+
+\newtoks \everylanguage
+
+\def\sethyphenationvariables % as we can have cloning we need to set it each time, unless we move all to lua
+ {\ctxlua{languages.setup(tex.language, {
+ lefthyphen = "\languageparameter\c!lefthyphen",
+ righthyphen = "\languageparameter\c!righthyphen",
+ } )}%
+ \lefthyphenmin \numexpr0\languageparameter\s!lefthyphenmin +\hyphenminoffset\relax
+ \righthyphenmin\numexpr0\languageparameter\s!righthyphenmin+\hyphenminoffset\relax}
+
+\def\docomplexlanguage% assumes that \currentlanguage is set
+ {\edef\currentdefaultlanguage{\defaultlanguage\currentlanguage}%
+ \setnormallanguage\currentlanguage\currentdefaultlanguage
+ \the\everylanguage
+ \sethyphenationvariables
+ \relax
+ % will be definable and move to core-spa !
+ \doifelse{\languageparameter\c!spacing}\v!broad\nonfrenchspacing\frenchspacing}
+
+% \mainlanguage[nl] \setuplanguage[nl][lefthyphen=,righthyphen=?]
+%
+% \dorecurse{100}{dit is toch wel een heel\normalhyphendiscretionary lang\normalhyphendiscretionary woord \recurselevel\ }
+% \dorecurse{100}{dit is toch wel een heellangwoord \recurselevel\ }
+
+% The following may be a solution for the fact that one cannot
+% change catcodes of characters like : and ; inside an environment.
+
+\def\complexlanguage[#1]%
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty \else
+ \ifcsname\l!prefix!\askedlanguage\endcsname
+ \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
+ \ifx\currentlanguage\askedlanguage \else
+ \setcurrentlanguage\currentmainlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \else
+ \showmessage\m!linguals6{#1}%
+ \fi
+ \fi}
+
+\let\simplelanguage\normallanguage
+
+\definecomplexorsimple\language
+
+\def\mainlanguage[#1]%
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty \else
+ \ifcsname\l!prefix!\askedlanguage\endcsname
+ \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
+ \ifx\currentlanguage\askedlanguage
+ \ifx\currentmainlanguage\askedlanguage
+ \else
+ \setcurrentlanguage\askedlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \else
+ \setcurrentlanguage\askedlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \fi
+ \fi}
+
+%D \macros
+%D {defaultlanguage,languageparameter,specificlanguageparameter}
+
+\def\defaultlanguage#1%
+ {\ifcsname\??la#1\s!default\endcsname
+ \expandafter\defaultlanguage\csname\??la#1\s!default\endcsname
+ \else
+ #1%
+ \fi}
+
+\def\languageparameter#1%
+ {\ifcsname\??la\currentlanguage#1\endcsname
+ \csname\??la\currentlanguage#1\endcsname
+ \else\ifcsname\??la\currentlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??la\currentlanguage\s!default\endcsname{#1}%
+ \else\ifcsname\??la\s!default#1\endcsname
+ \csname\??la\s!default#1\endcsname
+ \fi\fi\fi}
+
+\def\specificlanguageparameter#1#2%
+ {\ifcsname\??la#1#2\endcsname
+ \csname\??la#1#2\endcsname
+ \else\ifcsname\??la#1\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??la#1\s!default\endcsname{#2}%
+ \else\ifcsname\??la\s!default#2\endcsname
+ \csname\??la\s!default#2\endcsname
+ \fi\fi\fi}
+
+%D New (see nomarking and nolist):
+
+\def\splitsequence#1#2%
+ {\doifelse{#1}\v!no{#2}{\doifelse{#1}\v!yes{\languageparameter\c!limittext}{#1}}}
+
+\def\splitsymbol#1%
+ {\splitsequence{#1}{\languageparameter\c!limittext}}
+
+%D Just like with subsentence boundary symbols, quotes
+%D placement depends on the current language, therefore we show
+%D the defaults here.
+%D
+%D \def\ShowLanguageValues [#1] [#2] #3 #4
+%D {\blank
+%D \startlinecorrection
+%D \vbox\bgroup
+%D \language[#1]%
+%D \setbox0=\hbox to \hsize{\hss\bf#2 subsentence symbol and quotes\hss}
+%D \dp0=0pt
+%D \box0
+%D \vskip.5em
+%D \hrule
+%D \vskip.5em
+%D \let\normalbar=|
+%D \hbox to \hsize
+%D {\hfil\quotation{#3 #4}\hfil\quote{#2}\hfil
+%D \let|=\normalbar\strut|<||<|#3|>|#4|>|\hfil}
+%D \vskip.5em
+%D \hrule
+%D \egroup
+%D \stoplinecorrection
+%D \blank}
+%D
+%D \ShowLanguageValues [af] [afrikaans] afrikaanse ...
+%D \ShowLanguageValues [ca] [catalan] catalan ...
+%D \ShowLanguageValues [cs] [czech] tjechisch tex
+%D \ShowLanguageValues [cs] [slovak] slowaakse ...
+%D \ShowLanguageValues [da] [danish] deense ...
+%D \ShowLanguageValues [de] [german] duitse degelijkheid
+%D \ShowLanguageValues [en] [english] engelse humor
+%D \ShowLanguageValues [fi] [finnish] finse ...
+%D \ShowLanguageValues [fr] [french] franse slag
+%D \ShowLanguageValues [it] [italian] italiaanse ...
+%D \ShowLanguageValues [la] [latin] latijnse missen
+%D \ShowLanguageValues [nl] [dutch] nederlandse zuinigheid
+%D \ShowLanguageValues [nb] [bokmal] noorse zalm
+%D \ShowLanguageValues [nn] [nnynorsk] noorse zalm
+%D \ShowLanguageValues [pl] [polish] poolse vlag
+%D \ShowLanguageValues [pt] [portuguese] portugese ...
+%D \ShowLanguageValues [es] [spanish] spaans benauwd
+%D \ShowLanguageValues [sv] [swedish] zweedse ...
+%D \ShowLanguageValues [tr] [turkish] turks fruit
+
+%D We support a lot of languages. These are specified and
+%D loaded in separate files, according to their roots. Here
+%D we only take care of (postponed) setting of the current
+%D language.
+%D
+%D \unprotect
+%D \placetable{The germanic languages (\type{lang-ger})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!nl \NC dutch \NC germanic \NC\FR
+%D \NC \s!en \NC english \NC germanic \NC\MR
+%D \NC \s!de \NC german \NC germanic \NC\MR
+%D \NC \s!da \NC danish \NC germanic \NC\MR
+%D \NC \s!sv \NC swedish \NC germanic \NC\MR
+%D \NC \s!af \NC afrikaans \NC germanic \NC\MR
+%D \NC \s!nb \NC bokmal \NC germanic \NC\LR
+%D \NC \s!nn \NC nynorsk \NC germanic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D
+%D \unprotect
+%D \placetable{The italic languages (\type{lang-ita})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fr \NC french \NC italic \NC\FR
+%D \NC \s!ca \NC catalan \NC italic \NC\MR
+%D \NC \s!es \NC spanish \NC italic \NC\MR
+%D \NC \s!it \NC italian \NC italic \NC\MR
+%D \NC \s!la \NC latin \NC italic \NC\MR
+%D \NC \s!pt \NC portuguese \NC italic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D
+%D \unprotect
+%D \placetable{The slavic languages (\type{lang-sla})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!pl \NC polish \NC slavic \NC\FR
+%D \NC \s!cs \NC czech \NC slavic \NC\MR
+%D \NC \s!sk \NC slavik \NC slavic \NC\LR
+%D \HL
+%D \stoptable
+%D \protect
+%D \unprotect
+%D
+%D \placetable{The altaic languages (\type{lang-alt})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!tr \NC turkish \NC altaic \NC\SR
+%D \HL
+%D \stoptable
+%D
+%D \placetable{The uralic languages (\type{lang-ura})}
+%D \starttable[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fi \NC finnish \NC uralic \NC\SR
+%D \HL
+%D \stoptable
+%D \protect
+
+% \bgroup \normallanguage255 \patterns{} \egroup
+% \def\nopatterns{\normallanguage255 }
+
+\def\nopatterns{\normallanguage\minusone}
+
+%D We default to the language belonging to the interface. This
+%D is one of the few places outside the interface modules where
+%D \type{\startinterface} is used.
+
+%D We default to english:
+
+\setupcurrentlanguage[\s!en]
+
+\def\initializemainlanguage
+ {\mainlanguage[\currentlanguage]%
+ \showmessage\m!linguals9\currentlanguage}
+
+%D Might be in use:
+
+\let\preloadallpatterns\relax % just for old times sake
+\let\preloadlanguages \relax % just for old times sake
+
+\uchyph=1
+
+\exhyphenchar=45 % to permit breaking at explicit hyphens
+
+\protect \endinput
diff --git a/tex/context/base/lang-ita.tex b/tex/context/base/lang-ita.tex
new file mode 100644
index 000000000..03efb0614
--- /dev/null
+++ b/tex/context/base/lang-ita.tex
@@ -0,0 +1,518 @@
+%D \module
+%D [ file=lang-ita,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Italic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Todo: replace \'.. by \namedglyph
+
+\writestatus{loading}{ConTeXt Language Macros / Italic Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+%D
+%D \starttabulate[|lB|l|]
+%D \NC Italian \NC Giuseppe Bilotta \NC \NR
+%D \NC Romanian \NC Dan Seracu \NC \NR
+%D \NC Portuguese \NC Pedro F. M. Mendon\c a \NC \NR
+%D \stoptabulate
+
+% Latin, Italian, Rhaeto-Romanic, Rumanian, Sardian
+% Catalan, French, Ladino, Portuguese, Proven\c{c}al, Spanish
+
+\unprotect
+
+\ifx\guillemotspace\undefined \let\guillemotspace\empty \fi
+\ifx\sentencespace \undefined \let\sentencespace \empty \fi
+
+\installlanguage
+ [\s!fr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\leftguillemot,
+ \c!rightquote=\rightguillemot,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot,
+ \c!date={\v!day+,\v!space,\v!month,\v!space,\v!year},
+ \s!mapping={texnansi,ec},
+ \s!encoding={texnansi,ec}]
+
+\installlanguage
+ [\s!es]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
+
+\installlanguage [sp] [\s!es] % old times context
+
+\installlanguage
+ [\s!ca]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
+
+% Note GB left|/|right (sub)sentences are for \quote {incisi}.
+
+\installlanguage
+ [\s!it]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=--,
+ \c!rightsubsentence=--,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!leftspeech=\leftguillemot,
+ \c!middlespeech=\leftguillemot,
+ \c!rightspeech=\rightguillemot,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year},
+ \s!mapping={texnansi,ec},
+ \s!encoding={texnansi,ec}]
+
+\installlanguage % the same as italian
+ [\s!la]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\lowerrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\lowerrightdoubleninequote,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
+
+\installlanguage
+ [\s!pt]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day},
+ \s!mapping={texnansi,ec},
+ \s!encoding={texnansi,ec}]
+
+\installlanguage
+ [\s!ro]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\leftguillemot,
+ \c!rightquote=\rightguillemot,
+ \c!leftquotation=\lowerrightdoubleninequote,
+ \c!rightquotation=\upperleftdoublesixquote,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
+
+%D For compatibility reasons we also define:
+
+\installlanguage [fa] [\s!fr] % for dutchies only
+
+\installlanguage [french] [\s!fr]
+\installlanguage [spanish] [\s!es]
+\installlanguage [catalan] [\s!ca]
+\installlanguage [italian] [\s!it]
+\installlanguage [latin] [\s!la]
+\installlanguage [portuguese] [\s!pt]
+\installlanguage [romanian] [\s!ro]
+
+%D Labels and header texts.
+
+\setupheadtext [\s!fr] [\v!content=Table des mati\`eres]
+\setupheadtext [\s!es] [\v!content=\'Indice]
+\setupheadtext [\s!ca] [\v!content=\'Index de continguts]
+\setupheadtext [\s!it] [\v!content=Indice]
+\setupheadtext [\s!la] [\v!content=Quod in libro continetur] %Argumentum
+\setupheadtext [\s!pt] [\v!content=Conte\'udo]
+\setupheadtext [\s!ro] [\v!content=Cuprins]
+
+\setupheadtext [\s!fr] [\v!tables=Tableaux]
+\setupheadtext [\s!es] [\v!tables=Tablas]
+\setupheadtext [\s!ca] [\v!tables=Taules]
+\setupheadtext [\s!it] [\v!tables=Tabelle]
+\setupheadtext [\s!la] [\v!tables=Tabulae]
+\setupheadtext [\s!pt] [\v!tables=Tabelas]
+\setupheadtext [\s!ro] [\v!tables=Tabele]
+
+\setupheadtext [\s!fr] [\v!figures=Figures]
+\setupheadtext [\s!es] [\v!figures=Ilustraciones]
+\setupheadtext [\s!ca] [\v!figures=Figures]
+\setupheadtext [\s!it] [\v!figures=Figure]
+\setupheadtext [\s!la] [\v!figures=Imagines]
+\setupheadtext [\s!pt] [\v!figures=Figuras]
+\setupheadtext [\s!ro] [\v!figures=Figuri]
+
+\setupheadtext [\s!fr] [\v!graphics=Graphiques]
+\setupheadtext [\s!es] [\v!graphics=Gr\'aficos]
+\setupheadtext [\s!it] [\v!graphics=Grafici]
+\setupheadtext [\s!ca] [\v!graphics=Gr\`afiques]
+\setupheadtext [\s!la] [\v!graphics=Typi]
+\setupheadtext [\s!pt] [\v!graphics=Gr\'aficos]
+\setupheadtext [\s!ro] [\v!graphics=Grafice]
+
+\setupheadtext [\s!fr] [\v!intermezzi=Interm\`edes]
+\setupheadtext [\s!es] [\v!intermezzi=Intermedios]
+\setupheadtext [\s!ca] [\v!intermezzi=Intermedis]
+\setupheadtext [\s!it] [\v!intermezzi=Intermezzi]
+\setupheadtext [\s!la] [\v!intermezzi=Intermissa]
+\setupheadtext [\s!pt] [\v!intermezzi=Interm\'edios]
+\setupheadtext [\s!ro] [\v!intermezzi=Intermzzo]
+
+\setupheadtext [\s!fr] [\v!index=Index]
+\setupheadtext [\s!es] [\v!index=\'Indice alfab\'etico]
+\setupheadtext [\s!ca] [\v!index=\'Index alfab\`etic]
+\setupheadtext [\s!it] [\v!index=Indice]
+\setupheadtext [\s!la] [\v!index=Indices]
+\setupheadtext [\s!pt] [\v!index=\'Indice]
+\setupheadtext [\s!ro] [\v!index=Index]
+
+\setupheadtext [\s!fr] [\v!abbreviations=Abr\'eviations]
+\setupheadtext [\s!es] [\v!abbreviations=Abreviaturas]
+\setupheadtext [\s!ca] [\v!abbreviations=Abreviacions]
+\setupheadtext [\s!it] [\v!abbreviations=Abbreviazioni]
+\setupheadtext [\s!la] [\v!abbreviations=Notae]
+\setupheadtext [\s!pt] [\v!abbreviations=Abreviaturas]
+\setupheadtext [\s!ro] [\v!abbreviations=Abrevieri]
+
+\setupheadtext [\s!fr] [\v!logos=Logos]
+\setupheadtext [\s!es] [\v!logos=Logotipos]
+\setupheadtext [\s!ca] [\v!logos=Logotips]
+\setupheadtext [\s!it] [\v!logos=Logotipi]
+\setupheadtext [\s!la] [\v!logos=Typi negotiales]
+\setupheadtext [\s!pt] [\v!logos=Logotipos]
+\setupheadtext [\s!ro] [\v!logos=Logo-uri]
+
+\setupheadtext [\s!fr] [\v!units=Unit\'es]
+\setupheadtext [\s!es] [\v!units=Unidades]
+\setupheadtext [\s!ca] [\v!units=Unitats]
+\setupheadtext [\s!it] [\v!units=Unit\`a]
+\setupheadtext [\s!la] [\v!units=Modi]
+\setupheadtext [\s!pt] [\v!units=Unidades]
+\setupheadtext [\s!ro] [\v!units=Unit\u{a}\c{t}i]
+
+\setupheadtext [\s!fr] [pubs=Bibliographie]
+\setupheadtext [\s!es] [pubs=Bibliograf\'\ia]
+\setupheadtext [\s!ca] [pubs=Referències]
+\setupheadtext [\s!it] [pubs=Bibliografia]
+%setupheadtext [\s!la] [pubs=?]
+%setupheadtext [\s!pt] [pubs=?]
+%setupheadtext [\s!ro] [pubs=?]
+
+\setuplabeltext [\s!fr] [\v!table=Tableau ]
+\setuplabeltext [\s!es] [\v!table=Tabla ]
+\setuplabeltext [\s!ca] [\v!table=Taula ]
+\setuplabeltext [\s!it] [\v!table=Tabella ]
+\setuplabeltext [\s!la] [\v!table=Tabula ]
+\setuplabeltext [\s!pt] [\v!table=Tabela ]
+\setuplabeltext [\s!ro] [\v!table=Tabelul ]
+
+\setuplabeltext [\s!fr] [\v!figure=Figure ]
+\setuplabeltext [\s!es] [\v!figure=Ilustraci\'on ]
+\setuplabeltext [\s!ca] [\v!figure=Figura ]
+\setuplabeltext [\s!it] [\v!figure=Fig. ]
+\setuplabeltext [\s!la] [\v!figure=Imago ]
+\setuplabeltext [\s!pt] [\v!figure=Figura ]
+\setuplabeltext [\s!ro] [\v!figure=Figura ]
+
+\setuplabeltext [\s!fr] [\v!intermezzo=Interm\`ede ]
+\setuplabeltext [\s!es] [\v!intermezzo=Intermedio ]
+\setuplabeltext [\s!ca] [\v!intermezzo=Intermedi ]
+\setuplabeltext [\s!it] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!la] [\v!intermezzo=Intermissum ]
+\setuplabeltext [\s!pt] [\v!intermezzo=Interm\'edio ]
+\setuplabeltext [\s!ro] [\v!intermezzo=Intermezzo ]
+
+\setuplabeltext [\s!fr] [\v!graphic=Illustration ]
+\setuplabeltext [\s!es] [\v!graphic=Gr\'afico ]
+\setuplabeltext [\s!ca] [\v!graphic=Gr\`afica ]
+\setuplabeltext [\s!it] [\v!graphic=Grafico ]
+\setuplabeltext [\s!la] [\v!graphic=Typus ]
+\setuplabeltext [\s!pt] [\v!graphic=Gr\'afico ]
+\setuplabeltext [\s!ro] [\v!graphic=Graficul ]
+
+\setuplabeltext [\s!fr] [\v!chapter=] % Chapitre
+\setuplabeltext [\s!es] [\v!chapter=] % Cap\'\i tulo
+\setuplabeltext [\s!ca] [\v!chapter=] % Cap\'\i tol
+\setuplabeltext [\s!it] [\v!chapter=]
+\setuplabeltext [\s!la] [\v!chapter=]
+\setuplabeltext [\s!pt] [\v!chapter=]
+\setuplabeltext [\s!ro] [\v!chapter=]
+
+\setuplabeltext [\s!fr] [\v!section=] % Section
+\setuplabeltext [\s!es] [\v!section=] % Secci\'on
+\setuplabeltext [\s!ca] [\v!section=] % Secci\'o
+\setuplabeltext [\s!it] [\v!section=]
+\setuplabeltext [\s!la] [\v!section=]
+\setuplabeltext [\s!pt] [\v!section=]
+\setuplabeltext [\s!ro] [\v!section=]
+
+\setuplabeltext [\s!fr] [\v!subsection=] % Soussection
+\setuplabeltext [\s!es] [\v!subsection=] % Subsecci\'on
+\setuplabeltext [\s!ca] [\v!subsection=] % Subsecci\'o
+\setuplabeltext [\s!it] [\v!subsection=]
+\setuplabeltext [\s!la] [\v!subsection=]
+\setuplabeltext [\s!pt] [\v!subsection=]
+\setuplabeltext [\s!ro] [\v!subsection=]
+
+\setuplabeltext [\s!fr] [\v!subsubsection=] % Soussoussection
+\setuplabeltext [\s!es] [\v!subsubsection=] % Subsubsecci\'on
+\setuplabeltext [\s!ca] [\v!subsubsection=] % Subsubsecci\'o
+\setuplabeltext [\s!it] [\v!subsubsection=]
+\setuplabeltext [\s!la] [\v!subsubsection=]
+\setuplabeltext [\s!pt] [\v!subsubsection=]
+\setuplabeltext [\s!ro] [\v!subsubsection=]
+
+\setuplabeltext [\s!fr] [\v!subsubsubsection=] % Soussoussoussection
+\setuplabeltext [\s!es] [\v!subsubsubsection=] % Subsubsubsecci\'on
+\setuplabeltext [\s!ca] [\v!subsubsubsection=] % Subsubsubsecci\'o
+\setuplabeltext [\s!it] [\v!subsubsubsection=]
+\setuplabeltext [\s!la] [\v!subsubsubsection=]
+\setuplabeltext [\s!pt] [\v!subsubsubsection=]
+\setuplabeltext [\s!ro] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!fr] [\v!appendix=] % Annexe
+\setuplabeltext [\s!es] [\v!appendix=] % Ap\'endice
+\setuplabeltext [\s!ca] [\v!appendix=] % Ap\`endix
+\setuplabeltext [\s!it] [\v!appendix=]
+\setuplabeltext [\s!la] [\v!appendix=]
+\setuplabeltext [\s!pt] [\v!appendix=]
+\setuplabeltext [\s!ro] [\v!appendix=]
+
+\setuplabeltext [\s!fr] [\v!part=Partie ]
+\setuplabeltext [\s!es] [\v!part=Parte ]
+\setuplabeltext [\s!ca] [\v!part=Part ]
+\setuplabeltext [\s!it] [\v!part=Parte ]
+\setuplabeltext [\s!la] [\v!part=Pars ]
+\setuplabeltext [\s!pt] [\v!part=Parte ]
+\setuplabeltext [\s!ro] [\v!part=Partea ]
+
+\setuplabeltext [\s!fr] [\v!line=ligne ]
+\setuplabeltext [\s!es] [\v!line=l\'\i nea ]
+\setuplabeltext [\s!ca] [\v!line=l\'\i nia ]
+\setuplabeltext [\s!it] [\v!line=riga ]
+\setuplabeltext [\s!la] [\v!line=versus ]
+\setuplabeltext [\s!pt] [\v!line=linha ]
+\setuplabeltext [\s!ro] [\v!line=linia ]
+
+\setuplabeltext [\s!fr] [\v!lines=lignes ]
+\setuplabeltext [\s!es] [\v!lines=l\'\i neas ]
+\setuplabeltext [\s!ca] [\v!lines=l\'\i nies ]
+\setuplabeltext [\s!it] [\v!lines=righe ]
+\setuplabeltext [\s!la] [\v!lines=versus ]
+\setuplabeltext [\s!pt] [\v!lines=linhas ]
+\setuplabeltext [\s!ro] [\v!lines=liniile ]
+
+\setuplabeltext [\s!fr] [\v!january=janvier]
+\setuplabeltext [\s!fr] [\v!february=f\'evrier]
+\setuplabeltext [\s!fr] [\v!march=mars]
+\setuplabeltext [\s!fr] [\v!april=avril]
+\setuplabeltext [\s!fr] [\v!may=mai]
+\setuplabeltext [\s!fr] [\v!june=juin]
+\setuplabeltext [\s!fr] [\v!july=juillet]
+\setuplabeltext [\s!fr] [\v!august=ao\^ut]
+\setuplabeltext [\s!fr] [\v!september=septembre]
+\setuplabeltext [\s!fr] [\v!october=octobre]
+\setuplabeltext [\s!fr] [\v!november=novembre]
+\setuplabeltext [\s!fr] [\v!december=d\'ecembre]
+
+\setuplabeltext [\s!es] [\v!january=enero]
+\setuplabeltext [\s!es] [\v!february=febrero]
+\setuplabeltext [\s!es] [\v!march=marzo]
+\setuplabeltext [\s!es] [\v!april=abril]
+\setuplabeltext [\s!es] [\v!may=mayo]
+\setuplabeltext [\s!es] [\v!june=junio]
+\setuplabeltext [\s!es] [\v!july=julio]
+\setuplabeltext [\s!es] [\v!august=agosto]
+\setuplabeltext [\s!es] [\v!september=septiembre]
+\setuplabeltext [\s!es] [\v!october=octubre]
+\setuplabeltext [\s!es] [\v!november=noviembre]
+\setuplabeltext [\s!es] [\v!december=diciembre]
+
+\setuplabeltext [\s!ca] [\v!january=gener]
+\setuplabeltext [\s!ca] [\v!february=febrer]
+\setuplabeltext [\s!ca] [\v!march=mar\c{c}]
+\setuplabeltext [\s!ca] [\v!april=abril]
+\setuplabeltext [\s!ca] [\v!may=maig]
+\setuplabeltext [\s!ca] [\v!june=juny]
+\setuplabeltext [\s!ca] [\v!july=juliol]
+\setuplabeltext [\s!ca] [\v!august=agost]
+\setuplabeltext [\s!ca] [\v!september=setembre]
+\setuplabeltext [\s!ca] [\v!october=octubre]
+\setuplabeltext [\s!ca] [\v!november=novembre]
+\setuplabeltext [\s!ca] [\v!december=desembre]
+
+\setuplabeltext [\s!it] [\v!january=gennaio]
+\setuplabeltext [\s!it] [\v!february=febbraio]
+\setuplabeltext [\s!it] [\v!march=marzo]
+\setuplabeltext [\s!it] [\v!april=aprile]
+\setuplabeltext [\s!it] [\v!may=maggio]
+\setuplabeltext [\s!it] [\v!june=giugno]
+\setuplabeltext [\s!it] [\v!july=luglio]
+\setuplabeltext [\s!it] [\v!august=agosto]
+\setuplabeltext [\s!it] [\v!september=settembre]
+\setuplabeltext [\s!it] [\v!october=ottobre]
+\setuplabeltext [\s!it] [\v!november=novembre]
+\setuplabeltext [\s!it] [\v!december=dicembre]
+
+\setuplabeltext [\s!la] [\v!january=Ianuarius]
+\setuplabeltext [\s!la] [\v!february=Februarius]
+\setuplabeltext [\s!la] [\v!march=Martius]
+\setuplabeltext [\s!la] [\v!april=Aprilis]
+\setuplabeltext [\s!la] [\v!may=Maius]
+\setuplabeltext [\s!la] [\v!june=Iunius]
+\setuplabeltext [\s!la] [\v!july=Iulius] % formerly Quintilis
+\setuplabeltext [\s!la] [\v!august=Augustus] % formerly Sextilis
+\setuplabeltext [\s!la] [\v!september=September]
+\setuplabeltext [\s!la] [\v!october=October]
+\setuplabeltext [\s!la] [\v!november=November]
+\setuplabeltext [\s!la] [\v!december=December]
+
+\setuplabeltext [\s!pt] [\v!january=janeiro]
+\setuplabeltext [\s!pt] [\v!february=fevereiro]
+\setuplabeltext [\s!pt] [\v!march=mar\c{c}o]
+\setuplabeltext [\s!pt] [\v!april=abril]
+\setuplabeltext [\s!pt] [\v!may=maio]
+\setuplabeltext [\s!pt] [\v!june=junho]
+\setuplabeltext [\s!pt] [\v!july=julho]
+\setuplabeltext [\s!pt] [\v!august=agosto]
+\setuplabeltext [\s!pt] [\v!september=setembro]
+\setuplabeltext [\s!pt] [\v!october=outubro]
+\setuplabeltext [\s!pt] [\v!november=novembro]
+\setuplabeltext [\s!pt] [\v!december=dezembro]
+
+\setuplabeltext [\s!ro] [\v!january=ianuarie]
+\setuplabeltext [\s!ro] [\v!february=februarie]
+\setuplabeltext [\s!ro] [\v!march=martie]
+\setuplabeltext [\s!ro] [\v!april=aprilie]
+\setuplabeltext [\s!ro] [\v!may=mai]
+\setuplabeltext [\s!ro] [\v!june=iunie]
+\setuplabeltext [\s!ro] [\v!july=iulie]
+\setuplabeltext [\s!ro] [\v!august=august]
+\setuplabeltext [\s!ro] [\v!september=septembrie]
+\setuplabeltext [\s!ro] [\v!october=octombrie]
+\setuplabeltext [\s!ro] [\v!november=noiembrie]
+\setuplabeltext [\s!ro] [\v!december=decembrie]
+
+\setuplabeltext [\s!fr] [\v!sunday=dimanche]
+\setuplabeltext [\s!fr] [\v!monday=lundi]
+\setuplabeltext [\s!fr] [\v!tuesday=mardi]
+\setuplabeltext [\s!fr] [\v!wednesday=mercredi]
+\setuplabeltext [\s!fr] [\v!thursday=jeudi]
+\setuplabeltext [\s!fr] [\v!friday=vendredi]
+\setuplabeltext [\s!fr] [\v!saturday=samedi]
+
+\setuplabeltext [\s!es] [\v!sunday=domingo]
+\setuplabeltext [\s!es] [\v!monday=lunes]
+\setuplabeltext [\s!es] [\v!tuesday=martes]
+\setuplabeltext [\s!es] [\v!wednesday=mi\'ercoles]
+\setuplabeltext [\s!es] [\v!thursday=jueves]
+\setuplabeltext [\s!es] [\v!friday=viernes]
+\setuplabeltext [\s!es] [\v!saturday=s\'abado]
+
+\setuplabeltext [\s!ca] [\v!sunday=diumenge]
+\setuplabeltext [\s!ca] [\v!monday=dilluns]
+\setuplabeltext [\s!ca] [\v!tuesday=dimarts]
+\setuplabeltext [\s!ca] [\v!wednesday=dimecres]
+\setuplabeltext [\s!ca] [\v!thursday=dijous]
+\setuplabeltext [\s!ca] [\v!friday=divendres]
+\setuplabeltext [\s!ca] [\v!saturday=dissabte]
+
+\setuplabeltext [\s!it] [\v!sunday=domenica]
+\setuplabeltext [\s!it] [\v!monday=luned\`\i]
+\setuplabeltext [\s!it] [\v!tuesday=marted\`\i]
+\setuplabeltext [\s!it] [\v!wednesday=mercoled\`\i]
+\setuplabeltext [\s!it] [\v!thursday=gioved\`\i]
+\setuplabeltext [\s!it] [\v!friday=venerd\`\i]
+\setuplabeltext [\s!it] [\v!saturday=sabato]
+
+\setuplabeltext [\s!la] [\v!sunday=Dies Solis]
+\setuplabeltext [\s!la] [\v!monday=Dies Lunae]
+\setuplabeltext [\s!la] [\v!tuesday=Dies Martis]
+\setuplabeltext [\s!la] [\v!wednesday=Dies Mercuri]
+\setuplabeltext [\s!la] [\v!thursday=Dies Iovis]
+\setuplabeltext [\s!la] [\v!friday=Dies Veneris]
+\setuplabeltext [\s!la] [\v!saturday=Dies Saturni]
+
+\setuplabeltext [\s!pt] [\v!sunday=domingo]
+\setuplabeltext [\s!pt] [\v!monday=segunda-feira]
+\setuplabeltext [\s!pt] [\v!tuesday=ter\c{c}a-feira]
+\setuplabeltext [\s!pt] [\v!wednesday=quarta-feira]
+\setuplabeltext [\s!pt] [\v!thursday=quinta-feira]
+\setuplabeltext [\s!pt] [\v!friday=sexta-feira]
+\setuplabeltext [\s!pt] [\v!saturday=s\'abado]
+
+\setuplabeltext [\s!ro] [\v!sunday=duminic\u{a}]
+\setuplabeltext [\s!ro] [\v!monday=luni]
+\setuplabeltext [\s!ro] [\v!tuesday=mar\c{t}i]
+\setuplabeltext [\s!ro] [\v!wednesday=miercuri]
+\setuplabeltext [\s!ro] [\v!thursday=joi]
+\setuplabeltext [\s!ro] [\v!friday=vineri]
+\setuplabeltext [\s!ro] [\v!saturday=s\^{a}mb\u{a}t\u{a}]
+
+%D Rather new \unknown
+
+\setuplabeltext [\s!it] [\v!page=pagina ]
+\setuplabeltext [\s!it] [\v!atpage=a pagina ]
+\setuplabeltext [\s!it] [\v!hencefore=come mostrato sopra]
+\setuplabeltext [\s!it] [\v!hereafter=come mostrato sotto]
+\setuplabeltext [\s!it] [\v!see=cf. ]
+
+\setuplabeltext [\s!fr] [\v!page=page ]
+\setuplabeltext [\s!fr] [\v!atpage=à la page ]
+\setuplabeltext [\s!fr] [\v!hencefore=ci-dessus]
+\setuplabeltext [\s!fr] [\v!hereafter=ci-dessous]
+\setuplabeltext [\s!fr] [\v!see=cf. ]
+
+%D Ordinal converters:
+
+\def\frordinaldaynumber#1% date is masculine
+ {\number#1\ifcase#1\or
+ \highordinalstr{er}%
+ \fi}
+
+\defineconversion [\s!fr] [\v!day+] [\frordinaldaynumber]
+
+%D \ShowAllLanguageValues [\s!fr] [french] {French} {kiss} % franse slag
+%D \ShowAllLanguageValues [\s!es] [spanish] {Spanish} {guitar} % spaans benauwd
+%D \ShowAllLanguageValues [\s!ca] [catalan] {Catalan} {cream}
+%D \ShowAllLanguageValues [\s!it] [italian] {Italian} {aria}
+%D \ShowAllLanguageValues [\s!la] [latin] {Latin} {lover} % latijnse missen
+%D \ShowAllLanguageValues [\s!pt] [portuguese] {Portuguese} {fisherman}
+%D \ShowAllLanguageValues [\s!ro] [romanian] {Romanian} {traveller}
+
+\protect \endinput
diff --git a/tex/context/base/lang-jap.mkii b/tex/context/base/lang-jap.mkii
new file mode 100644
index 000000000..05c9b1d41
--- /dev/null
+++ b/tex/context/base/lang-jap.mkii
@@ -0,0 +1,234 @@
+%D \module
+%D [ file=lang-jap,
+%D version=2006.01.13,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Japanese,
+%D author={Richard Gabriel},
+%D date=\currentdate,
+%D copyright={PRAGMA / RG}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% rgabriel@kerio.com
+
+\writestatus{loading}{ConTeXt Language Macros / Japanese}
+
+\unprotect
+
+\definesystemconstant {japanese} \definesystemconstant {ja}
+
+\installlanguage
+ [\s!ja]
+ [\c!leftsentence=\jaencoding\jaleftsentence,
+ \c!rightsentence=\jaencoding\jarightsentence,
+ \c!leftsubsentence=\jaencoding\jaleftsubsentence,
+ \c!rightsubsentence=\jaencoding\jarightsubsentence,
+ \c!leftquote=\jaencoding\jaencodedsinglestartquote,
+ \c!rightquote=\jaencoding\jaencodedsingleendquote,
+ \c!leftquotation=\jaencoding\jaencodedstartquote,
+ \c!rightquotation=\jaencoding\jaencodedendquote,
+ \c!date={\jaencodedchristiandate,\v!year,\jaencodedyear,\v!month,\jaencodedmonth,\v!day,\jaencodedday}]
+
+\setupheadtext [\s!ja] [\v!content={\jaencoding\jaencodedtableofcontents}]
+\setupheadtext [\s!ja] [\v!tables={\jaencoding\jaencodedtables}]
+\setupheadtext [\s!ja] [\v!figures={\jaencoding\jaencodedfigures}]
+\setupheadtext [\s!ja] [\v!graphics={\jaencoding\jaencodedgraphics}]
+\setupheadtext [\s!ja] [\v!intermezzi={\jaencoding\jaencodedintermezzos}]
+\setupheadtext [\s!ja] [\v!index={\jaencoding\jaencodedindex}]
+\setupheadtext [\s!ja] [\v!abbreviations={\jaencoding\jaencodedabbreviations}]
+\setupheadtext [\s!ja] [\v!logos={\jaencoding\jaencodedlogos}]
+\setupheadtext [\s!ja] [\v!units={\jaencoding\jaencodedunits}]
+
+\setuplabeltext [\s!ja] [\v!table={\jaencoding\jaencodedtable}]
+\setuplabeltext [\s!ja] [\v!figure={\jaencoding\jaencodedfigure}]
+\setuplabeltext [\s!ja] [\v!intermezzo={\jaencoding\jaencodedintermezzo}]
+\setuplabeltext [\s!ja] [\v!graphic={\jaencoding\jaencodedillustration}]
+\setuplabeltext [\s!ja] [\v!appendix={\jaencoding\jaencodedappendix}]
+\setuplabeltext [\s!ja] [\v!part={\jaencoding\jaencodedintro,\jaencoding\jaencodedpart}]
+\setuplabeltext [\s!ja] [\v!chapter={\jaencoding\jaencodedintro,\jaencoding\jaencodedchapter}]
+\setuplabeltext [\s!ja] [\v!section={\jaencoding\jaencodedintro,\jaencoding\jaencodedsection}]
+\setuplabeltext [\s!ja] [\v!line={\jaencoding\jaencodedline}]
+\setuplabeltext [\s!ja] [\v!lines={\jaencoding\jaencodedline}]
+
+\setuplabeltext [\s!ja] [\v!subsection=]
+\setuplabeltext [\s!ja] [\v!subsubsection=]
+\setuplabeltext [\s!ja] [\v!subsubsubsection=]
+
+%D Why are these languagespecifics ?
+
+\setuplabeltext [\s!ja] [\v!january=1]
+\setuplabeltext [\s!ja] [\v!february=2]
+\setuplabeltext [\s!ja] [\v!march=3]
+\setuplabeltext [\s!ja] [\v!april=4]
+\setuplabeltext [\s!ja] [\v!may=5]
+\setuplabeltext [\s!ja] [\v!june=6]
+\setuplabeltext [\s!ja] [\v!july=7]
+\setuplabeltext [\s!ja] [\v!august=8]
+\setuplabeltext [\s!ja] [\v!september=9]
+\setuplabeltext [\s!ja] [\v!october=10]
+\setuplabeltext [\s!ja] [\v!november=11]
+\setuplabeltext [\s!ja] [\v!december=12]
+
+\setuplabeltext [\s!ja] [\v!sunday=\jaencoding\jaencodedsunday ]
+\setuplabeltext [\s!ja] [\v!monday=\jaencoding\jaencodedmonday ]
+\setuplabeltext [\s!ja] [\v!tuesday=\jaencoding\jaencodedtuesday ]
+\setuplabeltext [\s!ja] [\v!wednesday=\jaencoding\jaencodedwednesday]
+\setuplabeltext [\s!ja] [\v!thursday=\jaencoding\jaencodedthursday ]
+\setuplabeltext [\s!ja] [\v!friday=\jaencoding\jaencodedfriday ]
+\setuplabeltext [\s!ja] [\v!saturday=\jaencoding\jaencodedsaturday ]
+
+% Hardcoded - \japaneseencoding should be defined similarly to \chineseencoding
+
+\unexpanded\def\jaencoding{\enableencoding[cjk-uni]}
+
+%D This list is taken from DocBook XSL stylesheets (http://docbook.sourceforge.net/).
+
+\startencoding[cjk-uni]
+
+ \definecommand jaencodedabstract {\uchar{105}{130}\uchar{137}{129}}
+ \definecommand jaencodedand {\uchar{48}{1}}
+ \definecommand jaencodedanswer {\uchar{123}{84}\uchar{255}{26}}
+ \definecommand jaencodedappendix {\uchar{78}{216}\uchar{147}{50}}
+ \definecommand jaencodedarticle {\uchar{152}{5}\uchar{118}{238}}
+ \definecommand jaencodedbibliography {\uchar{83}{194}\uchar{128}{3}\uchar{101}{135}\uchar{115}{46}}
+ \definecommand jaencodedbook {\uchar{48}{214}\uchar{48}{195}\uchar{48}{175}}
+ \definecommand jaencodedbridgehead {\uchar{152}{5}}
+ \definecommand jaencodedbullet {\uchar{37}{207}}
+ \definecommand jaencodedby {\uchar{255}{26}}
+ \definecommand jaencodedcaution {\uchar{108}{232}\uchar{97}{15}}
+ \definecommand jaencodedcolophon {\uchar{89}{101}\uchar{78}{216}}
+ \definecommand jaencodedcopyright {\uchar{136}{253}\uchar{79}{92}\uchar{132}{87}\uchar{79}{92}}
+ \definecommand jaencodeddedication {\uchar{139}{29}\uchar{143}{158}}
+ \definecommand jaencodededited {\uchar{125}{232}\uchar{128}{5}}
+ \definecommand jaencodededitedby {\uchar{125}{232}\uchar{128}{5}\uchar{255}{26}}
+ \definecommand jaencodededition {\uchar{125}{232}\uchar{150}{198}}
+ \definecommand jaencodedendquote {\uchar{48}{13}}
+ \definecommand jaencodedequation {\uchar{95}{15}}
+ \definecommand jaencodedexample {\uchar{79}{139}}
+ \definecommand jaencodedfigure {\uchar{86}{243}}
+ \definecommand jaencodedglossary {\uchar{117}{40}\uchar{138}{158}\uchar{150}{198}}
+ \definecommand jaencodedglosssee {\uchar{83}{194}\uchar{113}{103}}
+ \definecommand jaencodedglossseealso {\uchar{83}{194}\uchar{113}{103}}
+ \definecommand jaencodedchapter {\uchar{122}{224}}
+ \definecommand jaencodedimportant {\uchar{145}{205}\uchar{137}{129}\uchar{152}{5}\uchar{118}{238}}
+ \definecommand jaencodedindex {\uchar{118}{238}\uchar{107}{33}}
+ \definecommand jaencodedindexsymbols {\uchar{48}{183}\uchar{48}{243}\uchar{48}{220}\uchar{48}{235}}
+ \definecommand jaencodedintro {\uchar{123}{44}}
+ \definecommand jaencodedlistofequations {\uchar{95}{15}\uchar{118}{238}\uchar{107}{33}}
+ \definecommand jaencodedlistofexamples {\uchar{79}{139}\uchar{118}{238}\uchar{107}{33}}
+ \definecommand jaencodedlistoffigures {\uchar{86}{243}\uchar{118}{238}\uchar{107}{33}}
+ \definecommand jaencodedlistoftables {\uchar{136}{104}\uchar{118}{238}\uchar{107}{33}}
+ \definecommand jaencodedlistofunknown {\uchar{78}{13}\uchar{102}{14}\uchar{118}{238}\uchar{107}{33}}
+ \definecommand jaencodedmsgaud {\uchar{91}{254}\uchar{140}{97}\uchar{128}{5}}
+ \definecommand jaencodedmsglevel {\uchar{48}{236}\uchar{48}{217}\uchar{48}{235}}
+ \definecommand jaencodedmsgorig {\uchar{118}{122}\uchar{79}{225}\uchar{81}{67}}
+ \definecommand jaencodednavhome {\uchar{48}{219}\uchar{48}{252}\uchar{48}{224}}
+ \definecommand jaencodednavnext {\uchar{107}{33}\uchar{48}{110}\uchar{48}{218}\uchar{48}{252}\uchar{48}{184}}
+ \definecommand jaencodednavnextsibling {\uchar{101}{233}\uchar{144}{1}\uchar{48}{138}}
+ \definecommand jaencodednavprev {\uchar{82}{77}\uchar{48}{110}\uchar{48}{218}\uchar{48}{252}\uchar{48}{184}}
+ \definecommand jaencodednavprevsibling {\uchar{93}{251}\uchar{98}{59}\uchar{48}{87}}
+ \definecommand jaencodednavup {\uchar{78}{10}\uchar{48}{107}\uchar{98}{59}\uchar{48}{139}}
+ \definecommand jaencodednestedendquote {\uchar{48}{15}}
+ \definecommand jaencodednestedstartquote {\uchar{48}{14}}
+ \definecommand jaencodednonexistantelement {\uchar{137}{129}\uchar{125}{32}\uchar{48}{76}\uchar{91}{88}\uchar{87}{40}\uchar{48}{87}\uchar{48}{126}\uchar{48}{91}\uchar{48}{147}}
+ \definecommand jaencodednote {\uchar{108}{232}\uchar{97}{15}}
+ \definecommand jaencodednotes {\uchar{108}{232}\uchar{97}{15}}
+ \definecommand jaencodedpages {\uchar{80}{103}\uchar{115}{46}}
+ \definecommand jaencodedpart {\uchar{48}{209}\uchar{48}{252}\uchar{48}{200}}
+ \definecommand jaencodedpreface {\uchar{94}{143}\uchar{101}{135}}
+ \definecommand jaencodedprocedure {\uchar{98}{75}\uchar{152}{6}}
+ \definecommand jaencodedprocedureformal {\uchar{98}{75}\uchar{152}{6}}
+ \definecommand jaencodedproductionset {\uchar{48}{215}\uchar{48}{237}\uchar{48}{192}\uchar{48}{175}\uchar{48}{183}\uchar{48}{231}\uchar{48}{243}}
+ \definecommand jaencodedproductionsetformal {\uchar{48}{215}\uchar{48}{237}\uchar{48}{192}\uchar{48}{175}\uchar{48}{183}\uchar{48}{231}\uchar{48}{243}}
+ \definecommand jaencodedpublished {\uchar{118}{122}\uchar{136}{76}}
+ \definecommand jaencodedqandadiv {\uchar{85}{79}\uchar{255}{26}\uchar{48}{1}\uchar{123}{84}\uchar{255}{26}}
+ \definecommand jaencodedqandaentry {\uchar{85}{79}\uchar{255}{26}}
+ \definecommand jaencodedquestion {\uchar{85}{79}\uchar{255}{26}}
+ \definecommand jaencodedreference {\uchar{83}{194}\uchar{113}{103}}
+ \definecommand jaencodedrefname {\uchar{84}{13}\uchar{82}{77}}
+ \definecommand jaencodedrefsection {\uchar{152}{5}}
+ \definecommand jaencodedrefsynopsisdiv {\uchar{105}{130}\uchar{137}{129}}
+ \definecommand jaencodedrevhistory {\uchar{101}{57}\uchar{138}{2}\uchar{92}{101}\uchar{107}{116}}
+ \definecommand jaencodedrevision {\uchar{101}{57}\uchar{138}{2}}
+ \definecommand jaencodedsection {\uchar{152}{5}}
+ \definecommand jaencodedsee {\uchar{83}{194}\uchar{113}{103}}
+ \definecommand jaencodedseealso {\uchar{83}{194}\uchar{113}{103}}
+ \definecommand jaencodedseparator {\uchar{48}{1}}
+ \definecommand jaencodedset {\uchar{138}{45}\uchar{91}{154}}
+ \definecommand jaencodedsetindex {\uchar{118}{238}\uchar{107}{33}\uchar{138}{45}\uchar{91}{154}}
+ \definecommand jaencodedsidebar {\uchar{48}{181}\uchar{48}{164}\uchar{48}{201}\uchar{48}{208}\uchar{48}{252}}
+ \definecommand jaencodedsimplesect {\uchar{152}{5}}
+ \definecommand jaencodedsingleendquote {\uchar{32}{25}}
+ \definecommand jaencodedsinglestartquote {\uchar{32}{24}}
+ \definecommand jaencodedstartquote {\uchar{48}{12}}
+ \definecommand jaencodedstep {\uchar{48}{185}\uchar{48}{198}\uchar{48}{195}\uchar{48}{215}}
+ \definecommand jaencodedtable {\uchar{136}{104}}
+ \definecommand jaencodedtablenotes {\uchar{108}{232}\uchar{97}{15}}
+ \definecommand jaencodedtableofcontents {\uchar{118}{238}\uchar{107}{33}}
+ \definecommand jaencodedtip {\uchar{48}{198}\uchar{48}{163}\uchar{48}{195}\uchar{48}{215}}
+ \definecommand jaencodedunexpectedelementname {\uchar{78}{13}\uchar{102}{14}\uchar{48}{106}\uchar{137}{129}\uchar{125}{32}\uchar{84}{13}}
+ \definecommand jaencodedunsupported {\uchar{48}{181}\uchar{48}{221}\uchar{48}{252}\uchar{48}{200}\uchar{48}{87}\uchar{48}{126}\uchar{48}{91}\uchar{48}{147}}
+ \definecommand jaencodedwarning {\uchar{139}{102}\uchar{84}{74}}
+
+ \definecommand jaencodedyear {\uchar{94}{116}}
+ \definecommand jaencodedmonth {\uchar{103}{8}}
+ \definecommand jaencodedday {\uchar{101}{229}}
+
+\stopencoding
+
+%D Taken from Chinese (will be investigated yet...)
+
+\startencoding[cjk-uni]
+
+ \definecommand jaencodedleftsentence {\uchar{32}{20}\uchar{32}{20}}
+ \definecommand jaencodedrightsentence {\uchar{32}{20}\uchar{32}{20}}
+ \definecommand jaencodedleftsubsentence {\uchar{32}{20}\uchar{32}{20}}
+ \definecommand jaencodedrightsubsentence {\uchar{32}{20}\uchar{32}{20}}
+
+\stopencoding
+
+%D Special thanxx to Eizo Tsuchihashi (eizo@arcbrain.jp) for the following stuff
+
+\startencoding[cjk-uni]
+
+ \definecommand jaencodedchristiandate {\uchar{137}{127}\uchar{102}{166}}
+
+ \definecommand jaencodedtables {\uchar{103}{58}}
+ \definecommand jaencodedfigures {\uchar{86}{243}}
+ \definecommand jaencodedabbreviations {\uchar{117}{101}\uchar{138}{158}}
+ \definecommand jaencodedlogos {\uchar{116}{6}\uchar{96}{39}}
+ \definecommand jaencodedunits {\uchar{48}{230}\uchar{48}{203}\uchar{48}{195}\uchar{48}{196}}
+
+ \definecommand jaencodedgraphics {\uchar{48}{176}\uchar{48}{233}\uchar{48}{213}}
+ \definecommand jaencodedintermezzo {\uchar{149}{147}\uchar{89}{79}\uchar{102}{242}}
+ \definecommand jaencodedintermezzos {\uchar{149}{147}\uchar{89}{79}\uchar{102}{242}}
+ \definecommand jaencodedillustration {\uchar{48}{164}\uchar{48}{233}\uchar{48}{185}\uchar{48}{200}}
+ \definecommand jaencodedline {\uchar{125}{218}}
+ \definecommand jaencodedlines {\uchar{125}{218}}
+
+ \definecommand jaencodedjanuary {\uchar{78}{0}\uchar{103}{8}}
+ \definecommand jaencodedfebruary {\uchar{78}{140}\uchar{103}{8}}
+ \definecommand jaencodedmarch {\uchar{78}{9}\uchar{103}{8}}
+ \definecommand jaencodedapril {\uchar{86}{219}\uchar{103}{8}}
+ \definecommand jaencodedmay {\uchar{78}{148}\uchar{103}{8}}
+ \definecommand jaencodedjune {\uchar{81}{109}\uchar{103}{8}}
+ \definecommand jaencodedjuly {\uchar{78}{3}\uchar{103}{8}}
+ \definecommand jaencodedaugust {\uchar{81}{107}\uchar{103}{8}}
+ \definecommand jaencodedseptember {\uchar{78}{93}\uchar{103}{8}}
+ \definecommand jaencodedoctober {\uchar{83}{65}\uchar{103}{8}}
+ \definecommand jaencodednovember {\uchar{83}{65}\uchar{78}{0}\uchar{103}{8}}
+ \definecommand jaencodeddecember {\uchar{83}{65}\uchar{78}{140}\uchar{103}{8}}
+
+ \definecommand jaencodedsunday {\uchar{103}{8}\uchar{102}{220}\uchar{101}{229}}
+ \definecommand jaencodedmonday {\uchar{112}{107}\uchar{102}{220}\uchar{101}{229}}
+ \definecommand jaencodedtuesday {\uchar{108}{52}\uchar{102}{220}\uchar{101}{229}}
+ \definecommand jaencodedwednesday {\uchar{103}{40}\uchar{102}{220}\uchar{101}{229}}
+ \definecommand jaencodedthursday {\uchar{145}{209}\uchar{102}{220}\uchar{101}{229}}
+ \definecommand jaencodedfriday {\uchar{87}{31}\uchar{102}{220}\uchar{101}{229}}
+ \definecommand jaencodedsaturday {\uchar{101}{229}\uchar{102}{220}\uchar{101}{229}}
+
+\stopencoding
+
+\protect \endinput
diff --git a/tex/context/base/lang-lab.mkii b/tex/context/base/lang-lab.mkii
new file mode 100644
index 000000000..269ac249b
--- /dev/null
+++ b/tex/context/base/lang-lab.mkii
@@ -0,0 +1,295 @@
+%D \module
+%D [ file=lang-lab,
+%D version=1997.08.27,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Labels,
+%D author=Hans Hagen / Tobias Burnus,
+%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
+
+%D In this module we deal with language dependant labels and
+%D prefixes, like in {\em Figure~12} and {\em Chapter 1}. In
+%D this file we set the default values. Users can easily
+%D overrule these.
+%D
+%D This module is dedicated to the grandfather of Tobias
+%D Burnus, who's extensive languages oriented library helped us
+%D a lot in finding the right translations. All those labels
+%D are collected in files that reflect their common ancestor.
+%D
+%D Not all languages can be satisfied with the labeling
+%D mechanism as provided here. Chinese for instance put a label
+%D in front as well as after a part number. This is why the
+%D current implementation of labels supports two labels too.
+
+%D \macros
+%D {setupheadtext, setuplabeltext}
+%D
+%D First we present some macros that deal with what we will
+%D call head and label texts. Such texts are defines by:
+%D
+%D \showsetup{setupheadtext}
+%D \showsetup{setuplabeltext}
+%D
+%D In a few paragraphs we'll show quite a lot of examples
+%D of its use.
+
+\let\handletextprefix\relax
+
+\def\setupheadtext {\dosetupsometextprefix[\c!title]}
+\def\setuplabeltext{\dosetupsometextprefix[\c!label]}
+
+\def\dosetupsometextprefix
+ {\let\dodocommand\xdosetupsometextprefix
+ \dotripleempty\dodosetupsometextprefix}
+
+% \def\dodosetupsometextprefix[#1][#2][#3]%
+% {\ifthirdargument
+% \def\docommand##1{\dodocommand[#1#2][##1]}%
+% \processcommalist[#3]\docommand
+% \else
+% \def\docommand##1{\dodocommand[#1\currentmainlanguage][##1]}%
+% \processcommalist[#2]\docommand
+% \fi}
+
+\def\dodosetupsometextprefix[#1][#2][#3]%
+ {\ifthirdargument
+ \def\docommand##1{\expanded{\dodocommand[#1\reallanguagetag{#2}]}[##1]}%
+ \processcommalist[#3]\docommand
+ \else
+ \def\docommand##1{\expanded{\dodocommand[#1\reallanguagetag\currentmainlanguage]}[##1]}%
+ \processcommalist[#2]\docommand
+ \fi}
+
+\def\doassignsometextprefix[#1][#2,#3,#4]%
+ {\setvalue{#1}{\handletextprefix{#2}{#3}}}
+
+\def\xdosetupsometextprefix[#1][#2=#3]%
+ {\doassignsometextprefix[#1#2][#3,,]}
+
+%D By changing the meaning of \type {\handletextprefix} we
+%D can filter the left and right labeltext as well as convert
+%D labels to uppercase.
+%D
+%D These commands accept all kind of inputs:
+%D
+%D \starttyping
+%D \setuplabeltext [language] [labellabel=text]
+%D \setuplabeltext [language] [labellabel=text,labellabel=text,...]
+%D \setuplabeltext [labellabel=text]
+%D \setuplabeltext [labellabel=text,labellabel=text,...]
+%D \stoptyping
+%D
+%D The last two cases concern the current language.
+
+%D \macros
+%D {headtext,
+%D labeltext, leftlabeltext, rightlabeltext, labeltexts,
+%D LABELTEXT, LEFTLABELTEXT, RIGHTLABELTEXT, LABELTEXTS}
+%D
+%D Once defined, head and label texts can be called upon using:
+%D
+%D \showsetup{headtext}
+%D \showsetup{labeltext}
+%D
+%D The latter one has an upcased alternative \type{\LABELTEXT}.
+
+% \def\labellanguage{\currentmainlanguage}
+% \def\headlanguage {\currentmainlanguage}
+
+% \def\labellanguage{\defaultlanguage\currentmainlanguage}
+% \def\headlanguage {\defaultlanguage\currentmainlanguage}
+
+\def\labellanguage{\reallanguagetag{\defaultlanguage\currentmainlanguage}}
+\def\headlanguage {\reallanguagetag{\defaultlanguage\currentmainlanguage}}
+
+\appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate
+
+\unexpanded\def\headtext
+ {\let\handletextprefix\firstoftwoarguments
+ \let\reporttextprefixerror\doreporttextprefixerror
+ \global\labeltextdonetrue
+ \dogetupsometextprefix\headlanguage\c!title}
+
+\unexpanded\def\leftlabeltext
+ {\let\handletextprefix\firstoftwoarguments
+ \let\reporttextprefixerror\doreporttextprefixerror
+ \global\labeltextdonetrue
+ \dogetupsometextprefix\labellanguage\c!label}
+
+\unexpanded\def\rightlabeltext
+ {\let\handletextprefix\secondoftwoarguments
+ \let\reporttextprefixerror\doreporttextprefixerror
+ \global\labeltextdonetrue
+ \dogetupsometextprefix\labellanguage\c!label}
+
+\unexpanded\def\LEFTLABELTEXT
+ {\def\handletextprefix##1##2{\uppercase{##1}}\DOLABELTEXT}
+
+\unexpanded\def\RIGHTLABELTEXT
+ {\def\handletextprefix##1##2{\uppercase{##2}}\DOLABELTEXT}
+
+\def\DOLABELTEXT#1%
+ {\bgroup
+ \the\everyuppercase
+ \let\reporttextprefixerror\doreporttextprefixerror
+ \global\labeltextdonetrue
+ \dogetupsometextprefix\labellanguage\c!label{#1}% not \labeltext (see \MONTH)
+ \egroup}
+
+\let\labeltext \leftlabeltext
+\let\LABELTEXT \LEFTLABELTEXT
+
+\unexpanded\def\labeltexts#1#2{\leftlabeltext{#1}#2\rightlabeltext{#1}}
+\unexpanded\def\LABELTEXTS#1#2{\LEFTLABELTEXT{#1}#2\RIGHTLABELTEXT{#1}}
+
+\newif\iflabeltextdone % needs to be reset elsewhere
+\newif\iftracelabels % shows missing labels
+
+\def\doreporttextprefixerror#1#2#3%
+ {\iftracelabels{\tttf[#2:~#3/#1]~}\fi}
+
+\def\dosetexpandedheadlabeltext#1#2#3%
+ {\bgroup
+ \let\handletextprefix\firstoftwoarguments
+ \let\reporttextprefixerror\gobblethreearguments
+ \keepencodedtokens % test on multilingual pascal, ok in stretched
+ %\dontexpandencodedtokens % not usable in token handler
+ \expanded
+ {\egroup\noexpand\def\noexpand#2% watch out, no \edef
+ {\dogetupsometextprefix{\headlanguage}{#1}{#3}}}}
+
+\def\setexpandedheadtext {\dosetexpandedheadlabeltext\c!title}
+\def\setexpandedlabeltext{\dosetexpandedheadlabeltext\c!label}
+
+% \def\dogetupsometextprefix#1#2#3%
+% {\ifcsname#2#1#3\endcsname
+% \csname#2#1#3\endcsname \else
+% \ifcsname#2#3\endcsname
+% \csname#2#3\endcsname \else
+% \ifcsname#2\defaultlanguage#1#3\endcsname
+% \csname#2\defaultlanguage#1#3\endcsname \else
+% \ifcsname#2\s!en#3\endcsname
+% \csname#2\s!en#3\endcsname \else
+% \ifcsname#2\s!nl#3\endcsname
+% \csname#2\s!nl#3\endcsname \else
+% \reporttextprefixerror{#1}{#2}{#3}%
+% \fi\fi\fi\fi\fi}
+%
+% \def\dogetupsometextprefix#1#2#3% must be expandable !
+% {\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
+% \dogetupsometextprefix{\csname\??la#1\c!default\endcsname}{#2}{#3}%
+% \fi\fi}
+
+\def\dogetupsometextprefix#1#2#3% must be expandable ! #1 == language
+ {\ifcsname#2#1#3\endcsname
+ \csname#2#1#3\endcsname
+ \else\ifcsname\??la#1\s!default\endcsname
+ \expandafter\dogetupsometextprefix\csname\??la#1\s!default\endcsname{#2}{#3}%
+ \else\ifcsname#2#3\endcsname
+ \csname#2#3\endcsname
+ \else\ifcsname#1\s!en#3\endcsname
+ \csname#2\s!en#3\endcsname
+ \else
+ \reporttextprefixerror{#1}{#2}{#3}%
+ \fi\fi\fi\fi}
+
+\ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
+
+\appendtoks
+ \let \headtext \firstofoneargument
+ \let \labeltext \firstofoneargument
+ \let \leftlabeltext \firstofoneargument
+ \let \rightlabeltext \firstofoneargument
+ \let \HEADTEXT \firstofoneargument
+ \let \LABELTEXT \firstofoneargument
+ \let \LEFTLABELTEXT \firstofoneargument
+ \let \RIGHTLABELTEXT \firstofoneargument
+\to \simplifiedcommands
+
+%D \macros
+%D {presetheadtext,presetlabeltext}
+%D
+%D The next two macros enable us to automatically define
+%D head and label texts without replacing predefined ones.
+%D These are internal macros.
+
+\def\xdopresetsometextprefix[#1][#2=#3]%
+ {\ifundefined{#1#2}\doassignsometextprefix[#1\reallanguagetag{#2}][#3,,]\fi}
+
+\def\dopresetsometextprefix
+ {\let\dodocommand\xdopresetsometextprefix
+ \dotripleempty\dodosetupsometextprefix}
+
+\def\presetheadtext {\dopresetsometextprefix[\c!title]}
+\def\presetlabeltext{\dopresetsometextprefix[\c!label]}
+
+%D \macros
+%D {translate}
+%D
+%D Sometismes macros contain language specific words that are to
+%D be typeset. Such macros can be made (more) language
+%D independant by using:
+%D
+%D \showsetup{translate}
+%D
+%D like for instance:
+%D
+%D \starttyping
+%D \translate[en=something,nl=iets]
+%D \stoptyping
+%D
+%D which expands to {\em something} or {\em iets}, depending on
+%D de current language.
+
+\def\dotranslate[#1]%
+ {\getparameters[\??lg][#1]%
+ \ifcsname\??lg\currentlanguage\endcsname
+ \csname\??lg\currentlanguage\endcsname
+ \else\ifcsname\??lg\s!en\endcsname
+ \csname\??lg\s!en\endcsname
+ \else
+ [translation #1]%
+ \fi\fi}
+
+\unexpanded\def\translate
+ {\dosingleempty\dotranslate}
+
+%D When used without argument, the last defined values are
+%D used. This enables repetitive use like
+%D
+%D \starttyping
+%D \en \translate\ means \nl \translate
+%D \stoptyping
+
+%D \macros
+%D {assigntranslation}
+%D
+%D This macro is a system macro, and can be used to assign a
+%D translation to a macro. Its form is:
+%D
+%D \starttyping
+%D \assigntranslation[en=something,nl=iets]\to\command
+%D \stoptyping
+
+\def\assigntranslation[#1]\to#2%
+ {\getparameters[\??lg][#1]%
+ \edef#2{\csname\??lg\currentlanguage\endcsname}}
+
+\protect \endinput
diff --git a/tex/context/base/lang-lab.mkiv b/tex/context/base/lang-lab.mkiv
new file mode 100644
index 000000000..42f2db8ff
--- /dev/null
+++ b/tex/context/base/lang-lab.mkiv
@@ -0,0 +1,283 @@
+%D \module
+%D [ file=lang-lab,
+%D version=1997.08.27,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Labels,
+%D author=Hans Hagen / Tobias Burnus,
+%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
+
+%D In this module we deal with language dependant labels and
+%D prefixes, like in {\em Figure~12} and {\em Chapter 1}. In
+%D this file we set the default values. Users can easily
+%D overrule these.
+%D
+%D This module is dedicated to the grandfather of Tobias
+%D Burnus, who's extensive languages oriented library helped us
+%D a lot in finding the right translations. All those labels
+%D are collected in files that reflect their common ancestor.
+%D
+%D Not all languages can be satisfied with the labeling
+%D mechanism as provided here. Chinese for instance put a label
+%D in front as well as after a part number. This is why the
+%D current implementation of labels supports two labels too.
+
+%D \macros
+%D {setupheadtext, setuplabeltext}
+%D
+%D First we present some macros that deal with what we will
+%D call head and label texts. Such texts are defines by:
+%D
+%D \showsetup{setupheadtext}
+%D \showsetup{setuplabeltext}
+%D
+%D A regular \CONTEXT\ stores some 1500 labels at most.
+
+\let\handletextprefix\relax
+
+\newconditional\protecttextprefixes
+
+\let\currenttextprefixtag \s!unknown
+\let\currenttextprefixclass\s!unknown
+
+\unexpanded\def\setupheadtext {\setfalse\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix}
+\unexpanded\def\setuplabeltext {\setfalse\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix}
+\unexpanded\def\setupmathlabeltext{\setfalse\protecttextprefixes\let\currenttextprefixclass\??mm\dodoubleempty\dosetupsometextprefix}
+
+\def\dosetupsometextprefix[#1][#2]%
+ {\ifsecondargument
+ \edef\currenttextprefixtag{\reallanguagetag{#1}}%
+ \processcommalist[#2]\dodosetupsometextprefix
+ \else
+ \edef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
+ \processcommalist[#1]\dodosetupsometextprefix
+ \fi}
+
+\def\dodosetupsometextprefix#1%
+ {\dododosetupsometextprefix[#1]}
+
+\def\dododosetupsometextprefix[#1=#2]%
+ {\doassignsometextprefix{#1}[#2,,]}
+
+\def\doassignsometextprefix#1%
+ {\ifconditional\protecttextprefixes
+ \ifcsname\currenttextprefixclass\currenttextprefixtag#1\endcsname
+ \expandafter\expandafter\expandafter\doassignsometextprefixnop
+ \else
+ \expandafter\expandafter\expandafter\doassignsometextprefixyes
+ \fi
+ \else
+ \expandafter\doassignsometextprefixyes
+ \fi{#1}}
+
+\ifdefined\Word\else \let\Word\relax \fi
+
+% Checking saves some 8K in the compressed format and getting rid of the embedded
+% \handletextprefix was good for another 6K. In the end the new solution is not
+% even that inefficient. And the checking is done at format generation time anyway.
+
+\def\doassignsometextprefixyes#1[#2,#3,#4]%
+ {\edef\!!stringa{#2}%
+ \edef\!!stringb{#3}%
+ \ifx\!!stringb\empty
+ \ifx\!!stringa\empty
+ \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{\empty\empty}%
+ \else
+ \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}\empty}%
+ \fi
+ \else
+ \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}{#3}}%
+ \fi}
+
+\def\doassignsometextprefixnop#1[#2]%
+ {}
+
+%D By changing the meaning of \type {\handletextprefix} we
+%D can filter the left and right labeltext as well as convert
+%D labels to uppercase.
+%D
+%D These commands accept all kind of inputs:
+%D
+%D \starttyping
+%D \setuplabeltext [language] [labellabel=text]
+%D \setuplabeltext [language] [labellabel=text,labellabel=text,...]
+%D \setuplabeltext [labellabel=text]
+%D \setuplabeltext [labellabel=text,labellabel=text,...]
+%D \stoptyping
+%D
+%D The last two cases concern the current language.
+
+%D \macros
+%D {headtext,
+%D labeltext, leftlabeltext, rightlabeltext, labeltexts,
+%D LABELTEXT, LEFTLABELTEXT, RIGHTLABELTEXT, LABELTEXTS}
+%D
+%D Once defined, head and label texts can be called upon using:
+%D
+%D \showsetup{headtext}
+%D \showsetup{labeltext}
+%D
+%D The latter one has an upcased alternative \type{\LABELTEXT}.
+
+\def\labellanguage {\reallanguagetag{\defaultlanguage\currentmainlanguage}}
+\def\headlanguage {\reallanguagetag{\defaultlanguage\currentmainlanguage}}
+\def\mathlabellanguage{\reallanguagetag{\defaultlanguage\currentmainlanguage}}
+
+\appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate
+
+\def\dummytextprefix{\empty\empty}
+
+\def\dogetupsomelabeltext {\dodogetupsomelabeltext \labellanguage } % second argument is textlabel
+\def\dogetupsomeheadtext {\dodogetupsomeheadtext \headlanguage } % second argument is headlabel
+\def\dogetupsomemathlabeltext{\dodogetupsomemathlabeltext\mathlabellanguage } % second argument is headlabel
+
+\def\dodogetupsomelabeltext#1#2%
+ {\ifcsname\??ml#1#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??ml#1#2\endcsname
+ \else\ifcsname\??la\labellanguage\s!default\endcsname
+ \expandafter\dodogetupsomelabeltext\csname\??la\labellanguage\s!default\endcsname{#2}%
+ \else\ifcsname\??ml#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??ml#2\endcsname
+ \else\ifcsname\??ml\s!en#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??ml\s!en#2\endcsname
+ \else
+ \let\thetextprefix\dummytextprefix
+ \fi\fi\fi\fi}
+
+\def\dodogetupsomeheadtext#1#2%
+ {\ifcsname\??mh#1#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??mh#1#2\endcsname
+ \else\ifcsname\??la\headlanguage\s!default\endcsname
+ \expandafter\dodogetupsomeheadtext\csname\??la\headlanguage\s!default\endcsname{#2}%
+ \else\ifcsname\??mh#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??mh#2\endcsname
+ \else\ifcsname\??mh\s!en#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??mh\s!en#2\endcsname
+ \else
+ \let\thetextprefix\dummytextprefix
+ \fi\fi\fi\fi}
+
+\def\dodogetupsomemathlabeltext#1#2%
+ {\ifcsname\??mm#1#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??mm#1#2\endcsname
+ \else\ifcsname\??la\mathlabellanguage\s!default\endcsname
+ \expandafter\dodogetupsomemathlabeltext\csname\??la\mathlabellanguage\s!default\endcsname{#2}%
+ \else\ifcsname\??mm#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??mm#2\endcsname
+ \else\ifcsname\??mm\s!en#2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??mm\s!en#2\endcsname
+ \else
+ \let\thetextprefix\dummytextprefix
+ \fi\fi\fi\fi}
+
+% The WORD variants are a bit inefficient when #1/#2 are empty but they are
+% seldom used (one can better set the style).
+
+\let\flushleftlabeltext \firstoftwoarguments
+\let\flushrightlabeltext \secondoftwoarguments
+\let\flushleftmathlabeltext \firstoftwoarguments
+\let\flushrightmathlabeltext\secondoftwoarguments
+
+\def\flushleftlabelWORD #1#2{\WORD{#1}}
+\def\flushrightlabelWORD #1#2{\WORD{#2}}
+\def\flushbothlabeltexts #1#2#3{#1#3#2}
+\def\flushbothlabelTEXTS #1#2#3{\WORD{#1}#3\WORD{#2}}
+
+\unexpanded\def\headtext #1{\dogetupsomeheadtext {#1}\expandafter\flushleftlabeltext \thetextprefix}
+\unexpanded\def\leftlabeltext #1{\dogetupsomelabeltext {#1}\expandafter\flushleftlabeltext \thetextprefix}
+\unexpanded\def\rightlabeltext #1{\dogetupsomelabeltext {#1}\expandafter\flushrightmathlabeltext\thetextprefix}
+\unexpanded\def\LEFTLABELTEXT #1{\dogetupsomelabeltext {#1}\expandafter\flushleftlabelWORD \thetextprefix}
+\unexpanded\def\RIGHTLABELTEXT #1{\dogetupsomelabeltext {#1}\expandafter\flushrightlabelWORD \thetextprefix}
+\unexpanded\def\labeltexts #1{\dogetupsomelabeltext {#1}\expandafter\flushbothlabeltexts \thetextprefix} % #2
+\unexpanded\def\LABELTEXTS #1{\dogetupsomelabeltext {#1}\expandafter\flushbothlabelTEXTS \thetextprefix} % #2
+\unexpanded\def\leftmathlabeltext #1{\dogetupsomemathlabeltext{#1}\expandafter\flushleftmathlabeltext \thetextprefix}
+\unexpanded\def\rightmathlabeltext#1{\dogetupsomemathlabeltext{#1}\expandafter\flushrightlabeltext \thetextprefix}
+
+\let\labeltext \leftlabeltext
+\let\LABELTEXT \LEFTLABELTEXT
+\let\mathlabeltext\leftmathlabeltext
+
+\ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
+
+\appendtoks
+ \let \headtext \firstofoneargument
+ \let \labeltext \firstofoneargument
+ \let \leftlabeltext \firstofoneargument
+ \let \rightlabeltext \firstofoneargument
+ \let \HEADTEXT \firstofoneargument
+ \let \LABELTEXT \firstofoneargument
+ \let \LEFTLABELTEXT \firstofoneargument
+ \let \RIGHTLABELTEXT \firstofoneargument
+ \let \mathlabeltext \firstofoneargument
+\to \simplifiedcommands
+
+%D \macros
+%D {presetheadtext,presetlabeltext}
+%D
+%D The next two macros enable us to automatically define
+%D head and label texts without replacing predefined ones.
+%D These are internal macros.
+
+\def\presetheadtext {\settrue\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix}
+\def\presetlabeltext {\settrue\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix}
+\def\presetmathlabeltext{\settrue\protecttextprefixes\let\currenttextprefixclass\??mm\dodoubleempty\dosetupsometextprefix}
+
+%D \macros
+%D {translate}
+%D
+%D Sometismes macros contain language specific words that are to
+%D be typeset. Such macros can be made (more) language
+%D independant by using:
+%D
+%D \showsetup{translate}
+%D
+%D like for instance:
+%D
+%D \starttyping
+%D \translate[en=something,nl=iets]
+%D \stoptyping
+%D
+%D which expands to {\em something} or {\em iets}, depending on
+%D de current language.
+
+\def\dotranslate[#1]%
+ {\getparameters[\??lg][#1]%
+ \ifcsname\??lg\currentlanguage\endcsname
+ \csname\??lg\currentlanguage\endcsname
+ \else\ifcsname\??lg\s!en\endcsname
+ \csname\??lg\s!en\endcsname
+ \else
+ [translation #1]%
+ \fi\fi}
+
+\unexpanded\def\translate
+ {\dosingleempty\dotranslate}
+
+%D When used without argument, the last defined values are
+%D used. This enables repetitive use like
+%D
+%D \starttyping
+%D \en \translate\ means \nl \translate
+%D \stoptyping
+
+%D \macros
+%D {assigntranslation}
+%D
+%D This macro is a system macro, and can be used to assign a
+%D translation to a macro. Its form is:
+%D
+%D \starttyping
+%D \assigntranslation[en=something,nl=iets]\to\command
+%D \stoptyping
+
+\def\assigntranslation[#1]\to#2%
+ {\getparameters[\??lg][#1]%
+ \edef#2{\csname\??lg\currentlanguage\endcsname}}
+
+\protect \endinput
diff --git a/tex/context/base/lang-mis.mkii b/tex/context/base/lang-mis.mkii
new file mode 100644
index 000000000..eb7bb1a04
--- /dev/null
+++ b/tex/context/base/lang-mis.mkii
@@ -0,0 +1,683 @@
+%D \module
+%D [ file=lang-mis,
+%D version=1997.03.20, % used to be supp-lan.tex
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Compounds,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Compounds}
+
+%D \gdef\starttest
+%D {\blank
+%D \noindent
+%D \halign\bgroup\tt##\hskip2em&##\hskip2em&##\cr}
+%D
+%D \gdef\stoptest
+%D {\egroup
+%D \blank}
+%D
+%D \gdef\test#1%
+%D {\defconvertedargument\ascii{#1}\ascii&\hyphenatedword{#1}&#1\cr}
+
+\unprotect
+
+%D One of \TEX's strong points in building paragraphs is the way
+%D hyphenations are handled. Although for real good hyphenation
+%D of non||english languages some extensions to the program are
+%D needed, fairly good results can be reached with the standard
+%D mechanisms and an additional macro, at least in Dutch.
+
+%D \CONTEXT\ originates in the wish to typeset educational
+%D materials, especially in a technical environment. In
+%D production oriented environments, a lot of compound words
+%D are used. Because the Dutch language poses no limits on
+%D combining words, we often favor putting dashes between those
+%D words, because it facilitates reading, at least for those
+%D who are not that accustomed to it.
+%D
+%D In \TEX\ compound words, separated by a hyphen, are not
+%D hyphenated at all. In spite of the multiple pass paragraph
+%D typesetting this can lead to parts of words sticking into
+%D the margin. The solution lays in saying \type
+%D {spoelwater||terugwinunit} instead of \type
+%D {spoelwater-terugwinunit}. By using a one character command
+%D like \type {|}, delimited by the same character \type {|},
+%D we get ourselves both a decent visualization (in \TEXEDIT\
+%D and colored verbatim we color these commands yellow) and an
+%D efficient way of combining words.
+%D
+%D The sequence \type{||} simply leads to two words connected by
+%D a hyphen. Because we want to distinguish such a hyphen from
+%D the one inserted when \TEX\ hyphenates a word, we use a bit
+%D longer one.
+%D
+%D \hyphenation {spoel-wa-ter te-rug-win-unit}
+%D
+%D \starttest
+%D \test {spoelwater||terugwinunit}
+%D \stoptest
+%D
+%D As we already said, the \type{|} is a command. This commands
+%D accepts an optional argument before it's delimiter, which is
+%D also a \type{|}.
+%D
+%D \hyphenation {po-ly-meer che-mie}
+%D
+%D \starttest
+%D \test {polymeer|*|chemie}
+%D \stoptest
+%D
+%D Arguments like \type{*} are not interpreted and inserted
+%D directly, in contrary to arguments like:
+%D
+%D \starttest
+%D \test {polymeer|~|chemie}
+%D \test {|(|polymeer|)|chemie}
+%D \test {polymeer|(|chemie|)| }
+%D \stoptest
+%D
+%D Although such situations seldom occur |<|we typeset thousands
+%D of pages before we encountered one that forced us to enhance
+%D this mechanism|>| we also have to take care of comma's.
+%D
+%D \hyphenation {uit-stel-len}
+%D
+%D \starttest
+%D \test {op||, in|| en uitstellen}
+%D \stoptest
+%D
+%D The next special case (concerning quotes) was brought to my
+%D attention by Piet Tutelaers, one of the driving forces
+%D behind rebuilding hyphenation patterns for the dutch
+%D language.\footnote{In 1996 the spelling of the dutch
+%D language has been slightly reformed which made this topic
+%D actual again.} We'll also take care of this case.
+%D
+%D \starttest
+%D \test {AOW|'|er}
+%D \test {cd|'|tje}
+%D \test {ex|-|PTT|'|er}
+%D \test {rock|-|'n|-|roller}
+%D \stoptest
+%D
+%D Tobias Burnus pointed out that I should also support
+%D something like
+%D
+%D \starttest
+%D \test {well|_|known}
+%D \stoptest
+%D
+%D to stress the compoundness of hyphenated words.
+%D
+%D Of course we also have to take care of the special case:
+%D
+%D \starttest
+%D \test {text||color and ||font}
+%D \stoptest
+
+%D \macros
+%D {installdiscretionaries}
+%D
+%D The mechanism described here is one of the older inner parts
+%D of \CONTEXT. The most recent extensions concerns some
+%D special cases as well as the possibility to install other
+%D characters as delimiters. The prefered way of specifying
+%D compound words is using \type{||}, which is installed by:
+%D
+%D \starttyping
+%D \installdiscretionaries || -
+%D \stoptyping
+%D
+%D Some alternative definitions are:
+%D
+%D \startbuffer
+%D \installdiscretionaries ** -
+%D \installdiscretionaries ++ -
+%D \installdiscretionaries // -
+%D \installdiscretionaries ~~ -
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D after which we can say:
+%D
+%D \bgroup
+%D \getbuffer
+%D \starttest
+%D \test {test**test**test}
+%D \test {test++test++test}
+%D \test {test//test//test}
+%D \test {test~~test~~test}
+%D \stoptest
+%D \egroup
+
+%D \macros
+%D {compoundhyphen,
+%D beginofsubsentence,endofsubsentence}
+%D
+%D Now let's go to the macros. First we define some variables.
+%D In the main \CONTEXT\ modules these can be tuned by a setup
+%D command. Watch the (maybe) better looking compound hyphen.
+
+\ifx\compoundhyphen \undefined \def\compoundhyphen{\hbox{-\kern-.25ex-}} \fi
+
+\ifx\beginofsubsentence \undefined \def\beginofsubsentence{\hbox{---}} \fi
+\ifx\endofsubsentence \undefined \def\endofsubsentence {\hbox{---}} \fi
+
+%D The last two variables are needed for subsentences
+%D |<|like this one|>| which we did not yet mention.
+%D
+%D We want to enable breaking but at the same time don't want
+%D compound characters like |-| or || to be separated from the
+%D words. \TEX\ hackers will recognise the next two macro's:
+
+\ifx\prewordbreak \undefined \def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi
+%ifx\postwordbreak \undefined \def\postwordbreak{\penalty\zerocount \prewordbreak } \fi
+\ifx\postwordbreak \undefined \def\postwordbreak{\penalty\zerocount \hskip\zeropoint\relax} \fi
+
+\ifx\hspaceamount \undefined \def\hspaceamount#1#2{.16667em} \fi % language specific
+
+%D \macros
+%D {beginofsubsentencespacing,endofsubsentencespacing}
+%D
+%D In the previous macros we provided two hooks which can be
+%D used to support nested sub||sentences. In \CONTEXT\ these
+%D hooks are used to insert a small space when needed.
+
+\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi
+\ifx\endofsubsentencespacing \undefined \let\endofsubsentencespacing \relax \fi
+
+%D The following piece of code is a torture test compound
+%D hndling. The \type {\relax} before the \type {\ifmmode} is
+%D needed because of the alignment scanner (in \ETEX\ this
+%D problem is not present because there a protected macro is
+%D not expanded. Thanks to Tobias Burnus for providing this
+%D example.
+%D
+%D \startformula
+%D \left|f(x_n)-{1\over2}\right| =
+%D {\cases{|{1\over2}-x_n| &for $0\le x_n < {1\over2}$\cr
+%D |x_n-{1\over2}| &for ${1\over2}<x_n\le1$ \cr}}
+%D \stopformula
+
+\def\@tmd@action@{@tmd@a@}
+\def\@tmd@text@ {@tmd@t@}
+\def\@tmd@math@ {@tmd@m@}
+\def\@tmd@both@ {@tmd@b@}
+
+\def\installdiscretionary#1#2%
+ {\setevalue{\@tmd@math@\detokenize{#1}}{\detokenize{#1}}%
+ \setvalue {\@tmd@text@\detokenize{#1}}{#2}%
+ \setvalue {\@tmd@both@\detokenize{#1}}{\discretionarycommand#1}%
+ \scratchcounter\expandafter`\detokenize{#1}%
+ \@EA\uedcatcodecommand\@EA\ctxcatcodes\@EA\scratchcounter\csname\@tmd@both@\detokenize{#1}\endcsname}
+
+\def\handlemathmodediscretionary#1{\executeifdefined{\@tmd@math@\detokenize{#1}}\donothing}
+\def\handletextmodediscretionary#1{\executeifdefined{\@tmd@text@\detokenize{#1}}\donothing}
+
+\def\installdiscretionaries#1#2{\writestatus\m!systems{use \string \installdiscretionary}} % obsolete
+
+\chardef\discretionarymode\plusone
+
+\def\ignorediscretionaries
+ {\chardef\discretionarymode\zerocount}
+
+\def\discretionarycommand
+ {% if direct if, we need \relax for lookahead in math mode
+ \csname
+ \ifcase\discretionarymode
+ \strippedcsname\dononemodediscretionary
+ \else\ifmmode
+ \strippedcsname\domathmodediscretionary
+ \else
+ \strippedcsname\dotextmodediscretionary
+ \fi\fi
+ \endcsname}
+
+\def\dononemodediscretionary#1%
+ {\detokenize{#1}}
+
+%D The macro \type{\checkbeforediscretionary} takes care of
+%D loners like \type{||word}, while it counterpart
+%D \type{\checkafterdiscretionary} is responsible for handling
+%D the comma.
+
+\newsignal\compoundbreakpoint
+
+\newconditional\punctafterdiscretionary
+\newconditional\spaceafterdiscretionary
+
+\def\checkbeforediscretionary
+ {\ifvmode\dontleavehmode\fi
+ \ifhmode
+ \begingroup
+ \setbox\scratchbox\lastbox
+ \ifzeropt\wd\scratchbox
+ \let\postwordbreak\prewordbreak
+ \fi
+ \box\scratchbox\relax
+ \endgroup
+ \fi}
+
+\def\checkafterdiscretionary
+ {\setfalse\punctafterdiscretionary
+ \setfalse\spaceafterdiscretionary
+ \ifx\blankspace\nextnext \settrue \spaceafterdiscretionary \else
+ \ifx\space \nextnext \settrue \spaceafterdiscretionary \else
+ \ifx .\nextnext \settrue \punctafterdiscretionary \else
+ \ifx ,\nextnext \settrue \punctafterdiscretionary \else
+ \ifx :\nextnext \settrue \punctafterdiscretionary \else
+ \ifx ;\nextnext \settrue \punctafterdiscretionary \fi\fi\fi\fi\fi\fi}
+
+\let\domathmodediscretionary\handlemathmodediscretionary
+
+\def\dotextmodediscretionary#1%
+ {\bgroup
+ \let\nextnextnext\egroup
+ \def\next##1#1%
+ {\def\next{\activedododotextmodediscretionary#1{##1}}%
+ \futurelet\nextnext\next}%
+ \next}
+
+\def\activedododotextmodediscretionary#1#2%
+ {\edef\discretionarytoken{\detokenize{#2}}%
+ \def\textmodediscretionary{\handletextmodediscretionary{#1}}%
+ \checkafterdiscretionary
+ \ifx\discretionarytoken\empty
+ \ifx#1\nextnext % takes care of ||| and +++ and ......
+ \ifcsname\@tmd@action@\string#1\endcsname
+ \csname\@tmd@action@\string#1\endcsname
+ \else\ifconditional\spaceafterdiscretionary
+ \prewordbreak\hbox{\string#1}\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\hbox{\string#1}\relax
+ \else
+ \prewordbreak\hbox{\string#1}\prewordbreak
+ \fi\fi\fi
+ \def\nextnextnext{\afterassignment\egroup\let\next=}%
+ \else
+ \checkbeforediscretionary
+ % the next line has been changed (20050203)
+ % \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak
+ % but an hbox blocks a possible \discretionary
+ \ifcsname\@tmd@action@\endcsname
+ \csname\@tmd@action@\endcsname
+ \else\ifconditional\spaceafterdiscretionary
+ \prewordbreak\textmodediscretionary\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\textmodediscretionary\relax
+ \else
+ \prewordbreak\textmodediscretionary\prewordbreak
+ \fi\fi\fi
+ % \prewordbreak\textmodediscretionary\nextnext\allowbreak\postwordbreak
+ \fi
+ \else\ifcsname\@tmd@action@\discretionarytoken\endcsname
+ \csname\@tmd@action@\discretionarytoken\endcsname
+ \else
+ \checkbeforediscretionary
+ \ifconditional\spaceafterdiscretionary
+ \prewordbreak\hbox{#2}\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\hbox{#2}\relax
+ \else
+ \prewordbreak\discretionary{\hbox{#2}}{}{\hbox{#2}}\allowbreak\postwordbreak
+ \fi\fi
+ \fi\fi
+ \nextnextnext} % lookahead in commands
+
+%D \macros
+%D {directdiscretionary}
+%D
+%D In those situations where the nature of characters is
+%D less predictable, we can use the more direct approach:
+
+\def\directdiscretionary
+ {\csname
+ \ifcase\discretionarymode
+ \strippedcsname\dononemodediscretionary
+ \else
+ \strippedcsname\dodirectdiscretionary
+ \fi
+ \endcsname}
+
+\def\indirectdiscretionary
+ {\csname
+ \ifcase\discretionarymode
+ \strippedcsname\dononemodediscretionary
+ \else
+ \strippedcsname\doindirectdiscretionary
+ \fi
+ \endcsname}
+
+\unexpanded\def\dodirectdiscretionary#1%
+ {\edef\discretionarytoken{\detokenize{#1}}%
+ \let\textmodediscretionary\compoundhyphen
+ \executeifdefined{\@tmd@action@\discretionarytoken}{\indirectdiscretionary{#1}}}
+
+\unexpanded\def\doindirectdiscretionary#1%
+ {\prewordbreak\discretionary{\hbox{#1}}{}{\hbox{#1}}\allowbreak\postwordbreak}
+
+\def\definetextmodediscretionary #1
+ {\setvalue{\@tmd@action@\detokenize{#1}}}
+
+% \start \hsize 1mm
+% test |||test test|||, test\blank
+% test test|-|, test|-| and test|-|test\blank
+% test test|_|, test|_| and test|_|test\blank
+% test cd|'|tje\blank
+% test |(|test test|)|, test\blank
+% test test test|x|, test\blank
+% test|~|test
+% test|^|test
+% \stop
+
+\def\hyphenliketextmodediscretionary#1#2%
+ {\ifconditional\spaceafterdiscretionary
+ \prewordbreak\hbox{#1}\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\hbox{#1}\relax
+ \else
+ \prewordbreak#2\postwordbreak % was prewordbreak
+ \fi\fi}
+
+\definetextmodediscretionary {}
+ {\hyphenliketextmodediscretionary\textmodehyphen\textmodehyphendiscretionary}
+
+\definetextmodediscretionary -
+ {\hyphenliketextmodediscretionary\normalhyphen\normalhyphendiscretionary}
+
+\definetextmodediscretionary _
+ {\hyphenliketextmodediscretionary\composedhyphen\composedhyphendiscretionary}
+
+\definetextmodediscretionary )
+ {\hyphenliketextmodediscretionary{)}{\discretionary{-)}{}{)}}}
+
+\definetextmodediscretionary (
+ {\ifdim\lastskip>\zeropoint
+ (\prewordbreak
+ \else
+ \prewordbreak\discretionary{}{(-}{(}\prewordbreak
+ \fi}
+
+\definetextmodediscretionary ~
+ {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak}
+
+\definetextmodediscretionary '
+ {\prewordbreak\discretionary{-}{}{'}\postwordbreak}
+
+\definetextmodediscretionary ^
+ {\prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}%
+ \allowbreak\postwordbreak} % bugged
+
+\definetextmodediscretionary <
+ {\beginofsubsentence\prewordbreak\beginofsubsentencespacing}
+
+\definetextmodediscretionary >
+ {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+
+\definetextmodediscretionary =
+ {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen}
+
+% french
+
+\definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{:}:}
+\definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{;};}
+\definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{?}?}
+\definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{!}!}
+
+\definetextmodediscretionary *
+ {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak}
+
+% spanish
+
+\definetextmodediscretionary ?? {\prewordbreak\questiondown}
+\definetextmodediscretionary !! {\prewordbreak\exclamdown}
+
+% \ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+%D \installdiscretionary | +
+%D \installdiscretionary + =
+
+\def\defaultdiscretionaryhyphen{\compoundhyphen}
+
+\installdiscretionary | \defaultdiscretionaryhyphen % installs in ctx and prt will fall back on it
+
+%D \macros
+%D {fakecompoundhyphen}
+%D
+%D In headers and footers as well as in active pieces of text
+%D we need a dirty hack. Try to imagine what is needed to
+%D savely break the next text across a line and at the same
+%D time make the words interactive.
+%D
+%D \starttyping
+%D \goto{Some||Long||Word}
+%D \stoptyping
+
+\def\fakecompoundhyphen
+ {\def\|{\mathortext\vert\dofakecompoundhyphen}}
+
+\def\dofakecompoundhyphen
+ {\def##1|%
+ {\doifelsenothing{##1}\compoundhyphen{##1}%
+ \kern\compoundbreakpoint\allowbreak}}
+
+%D \macros
+%D {midworddiscretionary}
+%D
+%D If needed, one can add a discretionary hyphen using \type
+%D {\midworddiscretionary}. This macro does the same as
+%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented
+%D earlier, this one also looks ahead for spaces and grouping
+%D tokens.
+
+\def\midworddiscretionary
+ {\futurelet\next\domidworddiscretionary}
+
+\def\domidworddiscretionary
+ {\ifx\next\blankspace\else
+ \ifx\next\bgroup \else
+ \ifx\next\egroup \else
+ \discretionary{-}{}{}%
+ \fi\fi\fi}
+
+%D \macros
+%D {installcompoundcharacter}
+%D
+%D When Tobias Burnus started translating the dutch manual of
+%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support
+%D the \type{german.sty} method of handling compound
+%D characters, especially the umlaut. This package is meant for
+%D use with \PLAIN\ \TEX\ as well as \LATEX.
+%D
+%D I decided to implement compound character support as
+%D versatile as possible. As a result one can define his own
+%D compound character support, like:
+%D
+%D \starttyping
+%D \installcompoundcharacter "a {\"a}
+%D \installcompoundcharacter "e {\"e}
+%D \installcompoundcharacter "i {\"i}
+%D \installcompoundcharacter "u {\"u}
+%D \installcompoundcharacter "o {\"o}
+%D \installcompoundcharacter "s {\SS}
+%D \stoptyping
+%D
+%D or even
+%D
+%D \starttyping
+%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+%D \stoptyping
+%D
+%D The support is not limited to alphabetic characters, so the
+%D next definition is also valid.
+%D
+%D \starttyping
+%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}}
+%D \stoptyping
+%D
+%D The implementation looks familiar and uses the same tricks as
+%D mentioned earlier in this module. We take care of two
+%D arguments, which complicates things a bit.
+
+\def\@nc@{@nc@} % normal character
+\def\@cc@{@cc@} % compound character
+\def\@cs@{@cs@} % compound characters
+\def\@cx@{@cx@} % compound definition
+
+%D When we started working on MK IV code, we needed a different
+%D approach for defining the active character itself. In MK II as
+%D well as in MK IV we now use the catcode vectors.
+
+\chardef\compoundcharactermode\plusone
+
+\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping
+ {\ifcase\compoundcharactermode
+ % ignore mode
+ \else
+ \chardef\thecompoundcharacter`#1%
+ \@EA\chardef\csname\@nc@\string#1\endcsname\thecompoundcharacter
+ \def\!!stringa{#3}%
+ \@EA\def\csname\ifx\!!stringa\empty\@cc@\else\@cs@\fi\detokenize{#1#2#3}\endcsname{#4}%
+ \setevalue{\@cx@\detokenize{#1}}{\noexpand\handlecompoundcharacter{\detokenize{#1}}}% beter nr's
+% \@EA\letcatcodecommand\@EA\prtcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+% \@EA\letcatcodecommand\@EA\texcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+ \@EA\letcatcodecommand\@EA\ctxcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+ \fi}
+
+%D In order to serve the language specific well, we will introduce
+%D a namespace:
+
+% \ifx\currentlanguage\undefined
+ \let\compoundcharacterclass\empty
+% \else
+% \def\compoundcharacterclass{\currentlanguage}
+% \fi
+
+\def\@cc@{@cc@\compoundcharacterclass} % compound character
+\def\@cs@{@cs@\compoundcharacterclass} % compound characters
+
+%D We can also ignore definitions (needed in for instance \XML). Beware,
+%D this macro is supposed to be used grouped!
+
+\def\ignorecompoundcharacter
+ {\chardef\compoundcharactermode\zerocount}
+
+\let\restorecompoundcharacter \gobbleoneargument % obsolete
+\let\enableactivediscretionaries\relax % obsolete
+
+%D In handling the compound characters we have to take care of
+%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
+%D a multi||step interpretation macro. We look ahead for a
+%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being
+%D no user of this mechanism, the credits for testing them goes
+%D to Tobias Burnus, the first german user of \CONTEXT.
+%D
+%D We define these macros as \type{\long} because we can
+%D expect \type{\par} tokens. We need to look into the future
+%D with \type{\futurelet} to prevent spaces from
+%D disappearing.
+
+\def\handlecompoundcharacter#1%
+ {\def\xhandlecompoundcharacter{\dohandlecompoundcharacter{#1}}%
+ \futurelet\next\xhandlecompoundcharacter}
+
+\def\dohandlecompoundcharacter
+ {\ifx\next\bgroup
+ %\@EA\dodohandlecompoundcharacter % handle "{ee} -> \"ee
+ %\@EA\gobbleoneargument % forget "{ee} -> ee
+ \@EA\handlecompoundcharacterone % ignore "{ee} -> "ee
+ \else\ifx\next\egroup
+ \@EAEAEA\donohandlecompoundcharacter
+ \else\ifx\next\blankspace
+ \@EA\@EAEAEA\@EA\donohandlecompoundcharacter
+ \else
+ \@EA\@EAEAEA\@EA\dodohandlecompoundcharacter
+ \fi\fi\fi}
+
+\def\donohandlecompoundcharacter#1{\csname\@nc@\string#1\endcsname}
+
+\def\dododohandlecompoundcharacter
+ {\ifx\next\bgroup
+ \@EA\handlecompoundcharacterone
+ \else\ifx\next\egroup
+ \@EAEAEA\handlecompoundcharacterone
+ \else\ifx\next\blankspace
+ \@EA\@EAEAEA\@EA\handlecompoundcharacterone
+ \else
+ \@EA\@EAEAEA\@EA\handlecompoundcharactertwo
+ \fi\fi\fi}
+
+\def\dodohandlecompoundcharacter#1#2% preserve space
+ {\def\xdodohandlecompoundcharacter{\dododohandlecompoundcharacter#1#2}%
+ \futurelet\next\xdodohandlecompoundcharacter}
+
+%D Besides taken care of the grouping and space tokens, we have
+%D to deal with three situations. First we look if the next
+%D character equals the first one, if so, then we just insert
+%D the original. Next we look if indeed a compound character is
+%D defined. We either execute the compound character or just
+%D insert the first. So we have
+%D
+%D \starttyping
+%D <key><key> <key><known> <key><unknown>
+%D \stoptyping
+%D
+%D In later modules we will see how these commands are used.
+
+\long\def\handlecompoundcharacterone#1#2%
+ {\if\string#1\string#2% was: \ifx#1#2%
+ \def\next{\csname\@nc@\string#1\endcsname}%
+ \else\ifcsname\@cc@\string#1\string#2\endcsname
+ \def\next{\csname\@cc@\string#1\string#2\endcsname}%
+ \else
+ \def\next{\csname\@nc@\string#1\endcsname#2}%
+ \fi\fi
+ \next}
+
+\long\def\handlecompoundcharactertwo#1#2#3%
+ {\if\string#1\string#2%
+ \def\next{\csname\@nc@\string#1\endcsname#3}%
+ \else\ifcsname\@cs@\string#1\string#2\string#3\endcsname
+ \def\next{\csname\@cs@\string#1\string#2\string#3\endcsname}%
+ \else\ifcsname\@cc@\string#1\string#2\endcsname
+ \def\next{\csname\@cc@\string#1\string#2\endcsname#3}%
+ \else
+ \def\next{\csname\@nc@\string#1\endcsname#2#3}%
+ \fi\fi\fi
+ \next}
+
+%D For very obscure applications (see for an application \type
+%D {lang-sla.tex}) we provide:
+
+\def\simplifiedcompoundcharacter#1#2%
+ {\ifcsname\@cc@\string#1\string#2\endcsname
+ \@EA\@EA\@EA\firstofoneargument\csname\@cc@\string#1\string#2\endcsname
+ \else
+ #2%
+ \fi}
+
+%D \macros
+%D {disablediscretionaries,disablecompoundcharacter}
+%D
+%D Occasionally we need to disable this mechanism. For the
+%D moment we assume that \type {|} is used.
+
+\let\disablediscretionaries \ignorediscretionaries
+\let\disablecompoundcharacters\ignorecompoundcharacter
+
+%D \macros
+%D {normalcompound}
+%D
+%D Handy in for instance XML. (Kind of obsolete)
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\protect \endinput
diff --git a/tex/context/base/lang-mis.mkiv b/tex/context/base/lang-mis.mkiv
new file mode 100644
index 000000000..0df45877b
--- /dev/null
+++ b/tex/context/base/lang-mis.mkiv
@@ -0,0 +1,689 @@
+%D \module
+%D [ file=lang-mis,
+%D version=1997.03.20, % used to be supp-lan.tex
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Compounds,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Compounds}
+
+%D \gdef\starttest
+%D {\blank
+%D \noindent
+%D \halign\bgroup\tt##\hskip2em&##\hskip2em&##\cr}
+%D
+%D \gdef\stoptest
+%D {\egroup
+%D \blank}
+%D
+%D \gdef\test#1%
+%D {\defconvertedargument\ascii{#1}\ascii&\hyphenatedword{#1}&#1\cr}
+
+\unprotect
+
+%D One of \TEX's strong points in building paragraphs is the way
+%D hyphenations are handled. Although for real good hyphenation
+%D of non||english languages some extensions to the program are
+%D needed, fairly good results can be reached with the standard
+%D mechanisms and an additional macro, at least in Dutch.
+
+%D \CONTEXT\ originates in the wish to typeset educational
+%D materials, especially in a technical environment. In
+%D production oriented environments, a lot of compound words
+%D are used. Because the Dutch language poses no limits on
+%D combining words, we often favor putting dashes between those
+%D words, because it facilitates reading, at least for those
+%D who are not that accustomed to it.
+%D
+%D In \TEX\ compound words, separated by a hyphen, are not
+%D hyphenated at all. In spite of the multiple pass paragraph
+%D typesetting this can lead to parts of words sticking into
+%D the margin. The solution lays in saying \type
+%D {spoelwater||terugwinunit} instead of \type
+%D {spoelwater-terugwinunit}. By using a one character command
+%D like \type {|}, delimited by the same character \type {|},
+%D we get ourselves both a decent visualization (in \TEXEDIT\
+%D and colored verbatim we color these commands yellow) and an
+%D efficient way of combining words.
+%D
+%D The sequence \type{||} simply leads to two words connected by
+%D a hyphen. Because we want to distinguish such a hyphen from
+%D the one inserted when \TEX\ hyphenates a word, we use a bit
+%D longer one.
+%D
+%D \hyphenation {spoel-wa-ter te-rug-win-unit}
+%D
+%D \starttest
+%D \test {spoelwater||terugwinunit}
+%D \stoptest
+%D
+%D As we already said, the \type{|} is a command. This commands
+%D accepts an optional argument before it's delimiter, which is
+%D also a \type{|}.
+%D
+%D \hyphenation {po-ly-meer che-mie}
+%D
+%D \starttest
+%D \test {polymeer|*|chemie}
+%D \stoptest
+%D
+%D Arguments like \type{*} are not interpreted and inserted
+%D directly, in contrary to arguments like:
+%D
+%D \starttest
+%D \test {polymeer|~|chemie}
+%D \test {|(|polymeer|)|chemie}
+%D \test {polymeer|(|chemie|)| }
+%D \stoptest
+%D
+%D Although such situations seldom occur |<|we typeset thousands
+%D of pages before we encountered one that forced us to enhance
+%D this mechanism|>| we also have to take care of comma's.
+%D
+%D \hyphenation {uit-stel-len}
+%D
+%D \starttest
+%D \test {op||, in|| en uitstellen}
+%D \stoptest
+%D
+%D The next special case (concerning quotes) was brought to my
+%D attention by Piet Tutelaers, one of the driving forces
+%D behind rebuilding hyphenation patterns for the dutch
+%D language.\footnote{In 1996 the spelling of the dutch
+%D language has been slightly reformed which made this topic
+%D actual again.} We'll also take care of this case.
+%D
+%D \starttest
+%D \test {AOW|'|er}
+%D \test {cd|'|tje}
+%D \test {ex|-|PTT|'|er}
+%D \test {rock|-|'n|-|roller}
+%D \stoptest
+%D
+%D Tobias Burnus pointed out that I should also support
+%D something like
+%D
+%D \starttest
+%D \test {well|_|known}
+%D \stoptest
+%D
+%D to stress the compoundness of hyphenated words.
+%D
+%D Of course we also have to take care of the special case:
+%D
+%D \starttest
+%D \test {text||color and ||font}
+%D \stoptest
+
+%D \macros
+%D {installdiscretionaries}
+%D
+%D The mechanism described here is one of the older inner parts
+%D of \CONTEXT. The most recent extensions concerns some
+%D special cases as well as the possibility to install other
+%D characters as delimiters. The prefered way of specifying
+%D compound words is using \type{||}, which is installed by:
+%D
+%D \starttyping
+%D \installdiscretionaries || -
+%D \stoptyping
+%D
+%D Some alternative definitions are:
+%D
+%D \startbuffer
+%D \installdiscretionaries ** -
+%D \installdiscretionaries ++ -
+%D \installdiscretionaries // -
+%D \installdiscretionaries ~~ -
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D after which we can say:
+%D
+%D \bgroup
+%D \getbuffer
+%D \starttest
+%D \test {test**test**test}
+%D \test {test++test++test}
+%D \test {test//test//test}
+%D \test {test~~test~~test}
+%D \stoptest
+%D \egroup
+
+%D \macros
+%D {compoundhyphen,
+%D beginofsubsentence,endofsubsentence}
+%D
+%D Now let's go to the macros. First we define some variables.
+%D In the main \CONTEXT\ modules these can be tuned by a setup
+%D command. Watch the (maybe) better looking compound hyphen.
+
+\ifx\compoundhyphen \undefined \def\compoundhyphen{\hbox{-\kern-.25ex-}} \fi
+
+\ifx\beginofsubsentence \undefined \def\beginofsubsentence{\hbox{---}} \fi
+\ifx\endofsubsentence \undefined \def\endofsubsentence {\hbox{---}} \fi
+
+%D The last two variables are needed for subsentences
+%D |<|like this one|>| which we did not yet mention.
+%D
+%D We want to enable breaking but at the same time don't want
+%D compound characters like |-| or || to be separated from the
+%D words. \TEX\ hackers will recognise the next two macro's:
+
+\ifx\prewordbreak \undefined \def\prewordbreak {\penalty\plustenthousand\hskip\zeropoint\relax} \fi
+%ifx\postwordbreak \undefined \def\postwordbreak{\penalty\zerocount \prewordbreak } \fi
+\ifx\postwordbreak \undefined \def\postwordbreak{\penalty\zerocount \hskip\zeropoint\relax} \fi
+
+\ifx\hspaceamount \undefined \def\hspaceamount#1#2{.16667em} \fi % language specific
+
+%D \macros
+%D {beginofsubsentencespacing,endofsubsentencespacing}
+%D
+%D In the previous macros we provided two hooks which can be
+%D used to support nested sub||sentences. In \CONTEXT\ these
+%D hooks are used to insert a small space when needed.
+
+\ifx\beginofsubsentencespacing\undefined \let\beginofsubsentencespacing\relax \fi
+\ifx\endofsubsentencespacing \undefined \let\endofsubsentencespacing \relax \fi
+
+%D The following piece of code is a torture test compound
+%D hndling. The \type {\relax} before the \type {\ifmmode} is
+%D needed because of the alignment scanner (in \ETEX\ this
+%D problem is not present because there a protected macro is
+%D not expanded. Thanks to Tobias Burnus for providing this
+%D example.
+%D
+%D \startformula
+%D \left|f(x_n)-{1\over2}\right| =
+%D {\cases{|{1\over2}-x_n| &for $0\le x_n < {1\over2}$\cr
+%D |x_n-{1\over2}| &for ${1\over2}<x_n\le1$ \cr}}
+%D \stopformula
+
+\def\@tmd@action@{@tmd@a@}
+\def\@tmd@text@ {@tmd@t@}
+\def\@tmd@math@ {@tmd@m@}
+\def\@tmd@both@ {@tmd@b@}
+
+\def\installdiscretionary#1#2%
+ {\setevalue{\@tmd@math@\detokenize{#1}}{\detokenize{#1}}%
+ \setvalue {\@tmd@text@\detokenize{#1}}{#2}%
+ \setvalue {\@tmd@both@\detokenize{#1}}{\discretionarycommand#1}%
+ \scratchcounter\expandafter`\detokenize{#1}%
+ \@EA\uedcatcodecommand\@EA\ctxcatcodes\@EA\scratchcounter\csname\@tmd@both@\detokenize{#1}\endcsname}
+
+\def\handlemathmodediscretionary#1{\executeifdefined{\@tmd@math@\detokenize{#1}}\donothing}
+\def\handletextmodediscretionary#1{\executeifdefined{\@tmd@text@\detokenize{#1}}\donothing}
+
+\def\installdiscretionaries#1#2{\writestatus\m!systems{use \string \installdiscretionary}} % obsolete
+
+\chardef\discretionarymode\plusone
+
+\def\ignorediscretionaries
+ {\chardef\discretionarymode\zerocount}
+
+\def\discretionarycommand
+ {% if direct if, we need \relax for lookahead in math mode
+ \csname
+ \ifcase\discretionarymode
+ \strippedcsname\dononemodediscretionary
+ \else\ifmmode
+ \strippedcsname\domathmodediscretionary
+ \else
+ \strippedcsname\dotextmodediscretionary
+ \fi\fi
+ \endcsname}
+
+\def\dononemodediscretionary#1%
+ {\detokenize{#1}}
+
+%D The macro \type{\checkbeforediscretionary} takes care of
+%D loners like \type{||word}, while it counterpart
+%D \type{\checkafterdiscretionary} is responsible for handling
+%D the comma.
+
+\newsignal\compoundbreakpoint
+
+\newconditional\punctafterdiscretionary
+\newconditional\spaceafterdiscretionary
+
+\def\checkbeforediscretionary
+ {\ifvmode\dontleavehmode\fi
+ \ifhmode
+ \begingroup
+ \setbox\scratchbox\lastbox
+ \ifzeropt\wd\scratchbox
+ \let\postwordbreak\prewordbreak
+ \fi
+ \box\scratchbox\relax
+ \endgroup
+ \fi}
+
+\def\checkafterdiscretionary
+ {\setfalse\punctafterdiscretionary
+ \setfalse\spaceafterdiscretionary
+ \ifx\blankspace\nextnext \settrue \spaceafterdiscretionary \else
+ \ifx\space \nextnext \settrue \spaceafterdiscretionary \else
+ \ifx .\nextnext \settrue \punctafterdiscretionary \else
+ \ifx ,\nextnext \settrue \punctafterdiscretionary \else
+ \ifx :\nextnext \settrue \punctafterdiscretionary \else
+ \ifx ;\nextnext \settrue \punctafterdiscretionary \fi\fi\fi\fi\fi\fi}
+
+\let\domathmodediscretionary\handlemathmodediscretionary
+
+\def\dotextmodediscretionary#1%
+ {\bgroup
+ \let\nextnextnext\egroup
+ \def\next##1#1%
+ {\def\next{\activedododotextmodediscretionary#1{##1}}%
+ \futurelet\nextnext\next}%
+ \next}
+
+\def\activedododotextmodediscretionary#1#2%
+ {\edef\discretionarytoken{\detokenize{#2}}%
+ \def\textmodediscretionary{\handletextmodediscretionary{#1}}%
+ \checkafterdiscretionary
+ \ifx\discretionarytoken\empty
+ \ifx#1\nextnext % takes care of ||| and +++ and ......
+ \ifcsname\@tmd@action@\string#1\endcsname
+ \csname\@tmd@action@\string#1\endcsname
+ \else\ifconditional\spaceafterdiscretionary
+ \prewordbreak\hbox{\string#1}\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\hbox{\string#1}\relax
+ \else
+ \prewordbreak\hbox{\string#1}\prewordbreak
+ \fi\fi\fi
+ \def\nextnextnext{\afterassignment\egroup\let\next=}%
+ \else
+ \checkbeforediscretionary
+ % the next line has been changed (20050203)
+ % \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak
+ % but an hbox blocks a possible \discretionary
+ \ifcsname\@tmd@action@\endcsname
+ \csname\@tmd@action@\endcsname
+ \else\ifconditional\spaceafterdiscretionary
+ \prewordbreak\textmodediscretionary\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\textmodediscretionary\relax
+ \else
+ \prewordbreak\textmodediscretionary\prewordbreak
+ \fi\fi\fi
+ % \prewordbreak\textmodediscretionary\nextnext\allowbreak\postwordbreak
+ \fi
+ \else\ifcsname\@tmd@action@\discretionarytoken\endcsname
+ \csname\@tmd@action@\discretionarytoken\endcsname
+ \else
+ \checkbeforediscretionary
+ \ifconditional\spaceafterdiscretionary
+ \prewordbreak\hbox{#2}\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\hbox{#2}\relax
+ \else
+ \prewordbreak\discretionary{\hbox{#2}}{}{\hbox{#2}}\allowbreak\postwordbreak
+ \fi\fi
+ \fi\fi
+ \nextnextnext} % lookahead in commands
+
+%D \macros
+%D {directdiscretionary}
+%D
+%D In those situations where the nature of characters is
+%D less predictable, we can use the more direct approach:
+
+\def\directdiscretionary
+ {\csname
+ \ifcase\discretionarymode
+ \strippedcsname\dononemodediscretionary
+ \else
+ \strippedcsname\dodirectdiscretionary
+ \fi
+ \endcsname}
+
+\def\indirectdiscretionary
+ {\csname
+ \ifcase\discretionarymode
+ \strippedcsname\dononemodediscretionary
+ \else
+ \strippedcsname\doindirectdiscretionary
+ \fi
+ \endcsname}
+
+\unexpanded\def\dodirectdiscretionary#1%
+ {\edef\discretionarytoken{\detokenize{#1}}%
+ \let\textmodediscretionary\compoundhyphen
+ \executeifdefined{\@tmd@action@\discretionarytoken}{\indirectdiscretionary{#1}}}
+
+\unexpanded\def\doindirectdiscretionary#1%
+ {\prewordbreak\discretionary{\hbox{#1}}{}{\hbox{#1}}\allowbreak\postwordbreak}
+
+\unexpanded\def\definetextmodediscretionary #1
+ {\setvalue{\@tmd@action@\detokenize{#1}}}
+
+% \start \hsize 1mm
+% test |||test test|||, test\blank
+% test test|-|, test|-| and test|-|test\blank
+% test test|_|, test|_| and test|_|test\blank
+% test cd|'|tje\blank
+% test |(|test test|)|, test\blank
+% test test test|x|, test\blank
+% test|~|test
+% test|^|test
+% \stop
+
+% x\discretionary{1}{2}{3}xxxxxxx
+% xxxxxxx\discretionary{1}{2}{3}x
+%
+% xxx3xxx
+% xxx1<newline>2xxx
+
+\def\hyphenliketextmodediscretionary#1#2%
+ {\ifconditional\spaceafterdiscretionary
+ \prewordbreak\hbox{#1}\relax
+ \else\ifconditional\punctafterdiscretionary
+ \prewordbreak\hbox{#1}\relax
+ \else
+ \prewordbreak#2\postwordbreak % was prewordbreak
+ \fi\fi}
+
+\definetextmodediscretionary {}
+ {\hyphenliketextmodediscretionary\textmodehyphen\textmodehyphendiscretionary}
+
+\definetextmodediscretionary -
+ {\hyphenliketextmodediscretionary\normalhyphen\normalhyphendiscretionary}
+
+\definetextmodediscretionary _
+ {\hyphenliketextmodediscretionary\composedhyphen\composedhyphendiscretionary}
+
+\definetextmodediscretionary )
+ {\hyphenliketextmodediscretionary{)}{\discretionary{-)}{}{)}}}
+
+\definetextmodediscretionary (
+ {\ifdim\lastskip>\zeropoint
+ (\prewordbreak
+ \else
+ \prewordbreak\discretionary{}{(-}{(}\prewordbreak
+ \fi}
+
+\definetextmodediscretionary ~
+ {\prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak}
+
+\definetextmodediscretionary '
+ {\prewordbreak\discretionary{-}{}{'}\postwordbreak}
+
+\definetextmodediscretionary ^
+ {\prewordbreak\discretionary{\hbox{$|$}}{}{\hbox{$|$}}%
+ \allowbreak\postwordbreak} % bugged
+
+\definetextmodediscretionary <
+ {\beginofsubsentence\prewordbreak\beginofsubsentencespacing}
+
+\definetextmodediscretionary >
+ {\endofsubsentencespacing\prewordbreak\endofsubsentence}
+
+\definetextmodediscretionary =
+ {\prewordbreak\midsentence\prewordbreak} % {\prewordbreak\compoundhyphen}
+
+% french
+
+\definetextmodediscretionary : {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{:}:}
+\definetextmodediscretionary ; {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{;};}
+\definetextmodediscretionary ? {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{?}?}
+\definetextmodediscretionary ! {\removeunwantedspaces\prewordbreak\kern\hspaceamount\empty{!}!}
+
+\definetextmodediscretionary *
+ {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak}
+
+% spanish
+
+\definetextmodediscretionary ?? {\prewordbreak\questiondown}
+\definetextmodediscretionary !! {\prewordbreak\exclamdown}
+
+% \ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+%D \installdiscretionary | +
+%D \installdiscretionary + =
+
+\def\defaultdiscretionaryhyphen{\compoundhyphen}
+
+\installdiscretionary | \defaultdiscretionaryhyphen % installs in ctx and prt will fall back on it
+
+%D \macros
+%D {fakecompoundhyphen}
+%D
+%D In headers and footers as well as in active pieces of text
+%D we need a dirty hack. Try to imagine what is needed to
+%D savely break the next text across a line and at the same
+%D time make the words interactive.
+%D
+%D \starttyping
+%D \goto{Some||Long||Word}
+%D \stoptyping
+
+\def\fakecompoundhyphen
+ {\def\|{\mathortext\vert\dofakecompoundhyphen}}
+
+\def\dofakecompoundhyphen
+ {\def##1|%
+ {\doifelsenothing{##1}\compoundhyphen{##1}%
+ \kern\compoundbreakpoint\allowbreak}}
+
+%D \macros
+%D {midworddiscretionary}
+%D
+%D If needed, one can add a discretionary hyphen using \type
+%D {\midworddiscretionary}. This macro does the same as
+%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented
+%D earlier, this one also looks ahead for spaces and grouping
+%D tokens.
+
+\def\midworddiscretionary
+ {\futurelet\next\domidworddiscretionary}
+
+\def\domidworddiscretionary
+ {\ifx\next\blankspace\else
+ \ifx\next\bgroup \else
+ \ifx\next\egroup \else
+ \discretionary{-}{}{}%
+ \fi\fi\fi}
+
+%D \macros
+%D {installcompoundcharacter}
+%D
+%D When Tobias Burnus started translating the dutch manual of
+%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support
+%D the \type{german.sty} method of handling compound
+%D characters, especially the umlaut. This package is meant for
+%D use with \PLAIN\ \TEX\ as well as \LATEX.
+%D
+%D I decided to implement compound character support as
+%D versatile as possible. As a result one can define his own
+%D compound character support, like:
+%D
+%D \starttyping
+%D \installcompoundcharacter "a {\"a}
+%D \installcompoundcharacter "e {\"e}
+%D \installcompoundcharacter "i {\"i}
+%D \installcompoundcharacter "u {\"u}
+%D \installcompoundcharacter "o {\"o}
+%D \installcompoundcharacter "s {\SS}
+%D \stoptyping
+%D
+%D or even
+%D
+%D \starttyping
+%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+%D \stoptyping
+%D
+%D The support is not limited to alphabetic characters, so the
+%D next definition is also valid.
+%D
+%D \starttyping
+%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}}
+%D \stoptyping
+%D
+%D The implementation looks familiar and uses the same tricks as
+%D mentioned earlier in this module. We take care of two
+%D arguments, which complicates things a bit.
+
+\def\@nc@{@nc@} % normal character
+\def\@cc@{@cc@} % compound character
+\def\@cs@{@cs@} % compound characters
+\def\@cx@{@cx@} % compound definition
+
+%D When we started working on MK IV code, we needed a different
+%D approach for defining the active character itself. In MK II as
+%D well as in MK IV we now use the catcode vectors.
+
+\chardef\compoundcharactermode\plusone
+
+\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping
+ {\ifcase\compoundcharactermode
+ % ignore mode
+ \else
+ \chardef\thecompoundcharacter`#1%
+ \@EA\chardef\csname\@nc@\string#1\endcsname\thecompoundcharacter
+ \def\!!stringa{#3}%
+ \@EA\def\csname\ifx\!!stringa\empty\@cc@\else\@cs@\fi\detokenize{#1#2#3}\endcsname{#4}%
+ \setevalue{\@cx@\detokenize{#1}}{\noexpand\handlecompoundcharacter{\detokenize{#1}}}% beter nr's
+% \@EA\letcatcodecommand\@EA\prtcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+% \@EA\letcatcodecommand\@EA\texcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+ \@EA\letcatcodecommand\@EA\ctxcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
+ \fi}
+
+%D In order to serve the language specific well, we will introduce
+%D a namespace:
+
+% \ifx\currentlanguage\undefined
+ \let\compoundcharacterclass\empty
+% \else
+% \def\compoundcharacterclass{\currentlanguage}
+% \fi
+
+\def\@cc@{@cc@\compoundcharacterclass} % compound character
+\def\@cs@{@cs@\compoundcharacterclass} % compound characters
+
+%D We can also ignore definitions (needed in for instance \XML). Beware,
+%D this macro is supposed to be used grouped!
+
+\def\ignorecompoundcharacter
+ {\chardef\compoundcharactermode\zerocount}
+
+\let\restorecompoundcharacter \gobbleoneargument % obsolete
+\let\enableactivediscretionaries\relax % obsolete
+
+%D In handling the compound characters we have to take care of
+%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
+%D a multi||step interpretation macro. We look ahead for a
+%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being
+%D no user of this mechanism, the credits for testing them goes
+%D to Tobias Burnus, the first german user of \CONTEXT.
+%D
+%D We define these macros as \type{\long} because we can
+%D expect \type{\par} tokens. We need to look into the future
+%D with \type{\futurelet} to prevent spaces from
+%D disappearing.
+
+\def\handlecompoundcharacter#1%
+ {\def\xhandlecompoundcharacter{\dohandlecompoundcharacter{#1}}%
+ \futurelet\next\xhandlecompoundcharacter}
+
+\def\dohandlecompoundcharacter
+ {\ifx\next\bgroup
+ %\@EA\dodohandlecompoundcharacter % handle "{ee} -> \"ee
+ %\@EA\gobbleoneargument % forget "{ee} -> ee
+ \@EA\handlecompoundcharacterone % ignore "{ee} -> "ee
+ \else\ifx\next\egroup
+ \@EAEAEA\donohandlecompoundcharacter
+ \else\ifx\next\blankspace
+ \@EA\@EAEAEA\@EA\donohandlecompoundcharacter
+ \else
+ \@EA\@EAEAEA\@EA\dodohandlecompoundcharacter
+ \fi\fi\fi}
+
+\def\donohandlecompoundcharacter#1{\csname\@nc@\string#1\endcsname}
+
+\def\dododohandlecompoundcharacter
+ {\ifx\next\bgroup
+ \@EA\handlecompoundcharacterone
+ \else\ifx\next\egroup
+ \@EAEAEA\handlecompoundcharacterone
+ \else\ifx\next\blankspace
+ \@EA\@EAEAEA\@EA\handlecompoundcharacterone
+ \else
+ \@EA\@EAEAEA\@EA\handlecompoundcharactertwo
+ \fi\fi\fi}
+
+\def\dodohandlecompoundcharacter#1#2% preserve space
+ {\def\xdodohandlecompoundcharacter{\dododohandlecompoundcharacter#1#2}%
+ \futurelet\next\xdodohandlecompoundcharacter}
+
+%D Besides taken care of the grouping and space tokens, we have
+%D to deal with three situations. First we look if the next
+%D character equals the first one, if so, then we just insert
+%D the original. Next we look if indeed a compound character is
+%D defined. We either execute the compound character or just
+%D insert the first. So we have
+%D
+%D \starttyping
+%D <key><key> <key><known> <key><unknown>
+%D \stoptyping
+%D
+%D In later modules we will see how these commands are used.
+
+\long\def\handlecompoundcharacterone#1#2%
+ {\if\string#1\string#2% was: \ifx#1#2%
+ \def\next{\csname\@nc@\string#1\endcsname}%
+ \else\ifcsname\@cc@\string#1\string#2\endcsname
+ \def\next{\csname\@cc@\string#1\string#2\endcsname}%
+ \else
+ \def\next{\csname\@nc@\string#1\endcsname#2}%
+ \fi\fi
+ \next}
+
+\long\def\handlecompoundcharactertwo#1#2#3%
+ {\if\string#1\string#2%
+ \def\next{\csname\@nc@\string#1\endcsname#3}%
+ \else\ifcsname\@cs@\string#1\string#2\string#3\endcsname
+ \def\next{\csname\@cs@\string#1\string#2\string#3\endcsname}%
+ \else\ifcsname\@cc@\string#1\string#2\endcsname
+ \def\next{\csname\@cc@\string#1\string#2\endcsname#3}%
+ \else
+ \def\next{\csname\@nc@\string#1\endcsname#2#3}%
+ \fi\fi\fi
+ \next}
+
+%D For very obscure applications (see for an application \type
+%D {lang-sla.tex}) we provide:
+
+\def\simplifiedcompoundcharacter#1#2%
+ {\ifcsname\@cc@\string#1\string#2\endcsname
+ \@EA\@EA\@EA\firstofoneargument\csname\@cc@\string#1\string#2\endcsname
+ \else
+ #2%
+ \fi}
+
+%D \macros
+%D {disablediscretionaries,disablecompoundcharacter}
+%D
+%D Occasionally we need to disable this mechanism. For the
+%D moment we assume that \type {|} is used.
+
+\let\disablediscretionaries \ignorediscretionaries
+\let\disablecompoundcharacters\ignorecompoundcharacter
+
+%D \macros
+%D {normalcompound}
+%D
+%D Handy in for instance XML. (Kind of obsolete)
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\protect \endinput
diff --git a/tex/context/base/lang-run.mkii b/tex/context/base/lang-run.mkii
new file mode 100644
index 000000000..4b332cfb9
--- /dev/null
+++ b/tex/context/base/lang-run.mkii
@@ -0,0 +1,36 @@
+%D \module
+%D [ file=lang-run,
+%D version=2005.09.08,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D [This code is hooked into the core macros and saves some
+%D format space.]
+
+\unprotect
+
+\gdef\showpatterns
+ {\bgroup
+ \def\doshowpatterns##1##2##3##4% language number encoding mapping
+ {\NC##1\NC##3\NC##4\NC##2\NC
+ \specificlanguageparameter{##1}\s!lefthyphenmin \NC
+ \specificlanguageparameter{##1}\s!righthyphenmin\NC\NR}%
+ \starttabulate[|c|c|c|c|c|c|]
+ \HL
+ \NC \bf language \NC \bf encoding \NC \bf mapping \NC \bf number \NC
+ \bf left\low{min} \NC
+ \bf right\low{min} \NC \NR
+ \HL
+ \preloadedpmessage
+ \HL
+ \stoptabulate
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/lang-sla.mkii b/tex/context/base/lang-sla.mkii
new file mode 100644
index 000000000..62483aeb6
--- /dev/null
+++ b/tex/context/base/lang-sla.mkii
@@ -0,0 +1,30 @@
+%D \module
+%D [ file=lang-sla,
+%D version=1999.09.13, % 1997.09.03
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Slavic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+\def\sloveniancharacter#1%
+ {\ifcase#1\unknowncharacter
+ \or a\or b\or c\or \ccaron\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m%
+ \or n\or o\or p\or r\or s\or \scaron\or t\or u\or v\or z\or \zcaron
+ \else
+ \unknowncharacter
+ \fi}
+
+\def\slovenianCharacter#1%
+ {\ifcase#1\unknowncharacter
+ \or A\or B\or C\or \Ccaron\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M%
+ \or N\or O\or P\or R\or S\or \Scaron\or T\or U\or V\or Z\or \Zcaron
+ \else
+ \unknowncharacter
+ \fi}
+
+\endinput
diff --git a/tex/context/base/lang-sla.mkiv b/tex/context/base/lang-sla.mkiv
new file mode 100644
index 000000000..479012615
--- /dev/null
+++ b/tex/context/base/lang-sla.mkiv
@@ -0,0 +1,17 @@
+%D \module
+%D [ file=lang-sla,
+%D version=2006.09.16,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Slavic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+\def\sloveniancharacters#1{\ctxlua{converters.alphabetic(\number#1,"sl")}}
+\def\slovenianCharacters#1{\ctxlua{converters.Alphabetic(\number#1,"sl")}}
+
+\endinput
diff --git a/tex/context/base/lang-sla.tex b/tex/context/base/lang-sla.tex
new file mode 100644
index 000000000..2c645af5a
--- /dev/null
+++ b/tex/context/base/lang-sla.tex
@@ -0,0 +1,497 @@
+%D \module
+%D [ file=lang-sla,
+%D version=1999.09.13, % 1997.09.03
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Slavic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Todo: replace \'.. by \namedglyph
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+%D
+%D \starttabulate[|lB|l|]
+%D \NC Czech \NC Tom Hudec, Petr Sojka \NC \NR
+%D \NC Polish \NC Grzegorz Sapijaszko \NC \NR
+%D \NC Croatian \NC \Zcaron eljko Vrba \NC \NR
+%D \NC Slovenian \NC Mojca Miklavec \NC \NR
+%D \NC Cz and Sk \NC Richard Gabriel \NC \NR
+%D \stoptabulate
+
+% Belarussian, Russian, Ukrainian, Bulgarian, Macedonian,
+% Serbo-Croatian, Slovenian, Czech, Kushubian,
+% Lusatian/Sorbian/Wendish, Polish, Slovak, Albanian,
+% Illyrian, Armenian
+
+\writestatus{loading}{ConTeXt Language Macros / Slavic Languages}
+
+\unprotect
+
+% \unexpanded\def\textormathglue#1#2#3% submitted original
+% {\begingroup
+% \scratchdimen=#1\hspaceamount\empty{#3}%
+% \scratchskip=\zeropoint\!!plus.5\scratchdimen\!!minus.3\scratchdimen\relax
+% \ifmmode
+% \mskip#1#2%
+% \else
+% \kern#1\hspaceamount\empty{#3}%
+% \hskip\scratchskip
+% \fi
+% \endgroup}
+
+% actually we could use the new pdftex features
+
+\unexpanded\def\textormathglue#1#2#3% cleaned up one
+ {\begingroup
+ \ifmmode
+ \mskip#1#2%
+ \else
+ \scratchdimen#1\hspaceamount\empty{#3}%
+ \scratchskip\scratchdimen\!!plus.5\scratchdimen\!!minus.3\scratchdimen
+ \hskip\scratchskip
+ \fi
+ \endgroup}
+
+\def\thinglue {\textormathglue+\thinmuskip 1}
+\def\medglue {\textormathglue+\medmuskip 2}
+\def\thickglue{\textormathglue+\thickmuskip3}
+
+\installlanguage
+ [\s!pl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
+ \s!mapping={pl0,ec,qx},
+ \s!encoding={pl0,ec,qx}]
+
+\installlanguage
+ [\s!cs]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\thickglue--\thickglue\penalty-20\relax, % hh, \relax added
+ \c!rightsentence=\thickglue--\thickglue\penalty-20\relax,
+ \c!leftsubsentence=~---~\penalty-20\relax,
+ \c!rightsubsentence=~---~\penalty-20\relax,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!day,{.\,},\v!month,\ ,\v!year},
+ \s!mapping={il2,ec},
+ \s!encoding={il2,ec}]
+
+\installlanguage
+ [\s!sk]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.\,},\v!month,\ ,\v!year},
+ \s!mapping={il2,ec},
+ \s!encoding={il2,ec}]
+
+\installlanguage
+ [\s!hr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\ ,\v!month,\ ,\v!year},
+ \s!mapping=ec,
+ \s!encoding=ec]
+
+%D The default quotation marks for Slovenian were chosen as
+%D \lowerleftdoubleninequote these ones\upperrightdoublesixquote\
+%D which was probably due to the strong influence computers
+%D had on typesetting, but \rightguillemot these ones\leftguillemot\
+%D are \quotation{more correct}.
+%D
+%D If you still want the other quotation marks, use this:
+%D
+%D \starttyping
+%D \installlanguage
+%D [sl]
+%D [leftquote=\lowerleftsingleninequote,
+%D rightquote=\upperrightsinglesixquote,
+%D leftquotation=\lowerleftdoubleninequote,
+%D rightquotation=\upperrightdoublesixquote]
+%D \stoptyping
+%D
+%D If you disagree with the change, please send an email to Mojca, but
+%D best use some pretty strong arguments because she loves S{\sl love}nia
+%D to much to comprimise on this.
+%D
+%D German faces approximately the same problem. I (MM) would prefer to
+%D have something like:
+%D
+%D \starttyping
+%D \mainlanguage[sl][quotationstyle=guillemot|doublequote] % better name needed
+%D \stoptyping
+%D
+%D but users are expected to respect the rules of nice and correct
+%D typography anyway.
+
+\installlanguage
+ [\s!sl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence={\hbox{--~}},
+ \c!rightsentence={\hbox{~--}},
+ \c!leftsubsentence={--},
+ \c!rightsubsentence={--},
+ %\c!leftquote=\lowerleftsingleninequote,
+ %\c!rightquote=\upperrightsinglesixquote,
+ %\c!leftquotation=\lowerleftdoubleninequote,
+ %\c!rightquotation=\upperrightdoublesixquote,
+ \c!leftquote=\guilsingleright,
+ \c!rightquote=\guilsingleleft,
+ \c!leftquotation=\rightguillemot,
+ \c!rightquotation=\leftguillemot,
+ \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
+ \s!mapping=ec,
+ \s!encoding=ec]
+
+\installlanguage [polish] [\s!pl]
+\installlanguage [czech] [\s!cs]
+\installlanguage [slovak] [\s!sk]
+\installlanguage [croatian] [\s!hr]
+\installlanguage [slovenian] [\s!sl]
+\installlanguage [slovene] [\s!sl] % both possible (mojca: still needed?)
+
+\installlanguage [cz] [\s!cs]
+
+% labels
+
+\setupheadtext [\s!pl] [\v!content=Spis tre\sacute ci]
+\setupheadtext [\s!cs] [\v!content=Obsah]
+\setupheadtext [\s!sk] [\v!content=Obsah]
+\setupheadtext [\s!hr] [\v!content=Sadr\zcaron aj]
+\setupheadtext [\s!sl] [\v!content=Kazalo]
+
+\setupheadtext [\s!pl] [\v!tables=Tabele]
+\setupheadtext [\s!cs] [\v!tables=Tabulky]
+\setupheadtext [\s!sk] [\v!tables=Tabuliek]
+\setupheadtext [\s!hr] [\v!tables=Tablice]
+\setupheadtext [\s!sl] [\v!tables=Tabele]
+
+\setupheadtext [\s!pl] [\v!figures=Ilustracje]
+\setupheadtext [\s!cs] [\v!figures=Obr\aacute zky]
+\setupheadtext [\s!sk] [\v!figures=Obr\aacute zkov]
+\setupheadtext [\s!hr] [\v!figures=Slike]
+\setupheadtext [\s!sl] [\v!figures=Slike]
+
+\setupheadtext [\s!pl] [\v!graphics=Grafika]
+\setupheadtext [\s!cs] [\v!graphics=Grafy]
+\setupheadtext [\s!sk] [\v!graphics=Graf]
+\setupheadtext [\s!hr] [\v!graphics=Slike]
+\setupheadtext [\s!sl] [\v!graphics=Slike]
+
+\setupheadtext [\s!pl] [\v!intermezzi=Intermezza]
+\setupheadtext [\s!cs] [\v!intermezzi=Intermezza]
+\setupheadtext [\s!sk] [\v!intermezzi=Intermezz\aacute]
+\setupheadtext [\s!hr] [\v!intermezzi=Intermezza]
+\setupheadtext [\s!sl] [\v!intermezzi=Intermezzi]
+
+\setupheadtext [\s!pl] [\v!index=Indeks]
+\setupheadtext [\s!cs] [\v!index=Rejst\rcaron\iacute k]
+\setupheadtext [\s!sk] [\v!index=Zoznam]
+\setupheadtext [\s!hr] [\v!index=Indeks]
+\setupheadtext [\s!sl] [\v!index=Stvarno kazalo]
+
+\setupheadtext [\s!pl] [\v!abbreviations=Skr\oacute cenie]
+\setupheadtext [\s!cs] [\v!abbreviations=Zkratky]
+\setupheadtext [\s!sk] [\v!abbreviations=Skratky]
+\setupheadtext [\s!hr] [\v!abbreviations=Kratice]
+\setupheadtext [\s!sl] [\v!abbreviations=Kratice]
+
+\setupheadtext [\s!pl] [\v!logos=Znaki]
+\setupheadtext [\s!cs] [\v!logos=Loga]
+\setupheadtext [\s!sk] [\v!logos=Log\aacute]
+\setupheadtext [\s!hr] [\v!logos=Znakovi]
+\setupheadtext [\s!sl] [\v!logos=Logotipi]
+
+\setupheadtext [\s!pl] [\v!units=Jednostki]
+\setupheadtext [\s!cs] [\v!units=Jednotky]
+\setupheadtext [\s!sk] [\v!units=Jednotky]
+\setupheadtext [\s!hr] [\v!units=Jednostki]
+\setupheadtext [\s!sl] [\v!units=Enote]
+
+%setupheadtext [\s!pl] [pubs=?]
+\setupheadtext [\s!cs] [pubs=Literatura]
+%setupheadtext [\s!sk] [pubs=?]
+%setupheadtext [\s!hr] [pubs=?]
+\setupheadtext [\s!sl] [pubs=Literatura]
+
+\setuplabeltext [\s!pl] [\v!table=Tabela ]
+\setuplabeltext [\s!cs] [\v!table=Tabulka ]
+\setuplabeltext [\s!sk] [\v!table=Tabu\lcaron ka ]
+\setuplabeltext [\s!hr] [\v!table=T\aacute bl\aacute zat ] % [\v!table=Tablica ]
+\setuplabeltext [\s!sl] [\v!table=Tabela ]
+
+\setuplabeltext [\s!pl] [\v!figure=Ilustracja ]
+\setuplabeltext [\s!cs] [\v!figure=Obr\aacute zek ]
+\setuplabeltext [\s!sk] [\v!figure=Obr\aacute zok ]
+\setuplabeltext [\s!hr] [\v!figure=Slika ]
+\setuplabeltext [\s!sl] [\v!figure=Slika ]
+
+\setuplabeltext [\s!pl] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!cs] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!sk] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!hr] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!sl] [\v!intermezzo=Intermezzo ]
+
+\setuplabeltext [\s!pl] [\v!graphic=Grafika ]
+\setuplabeltext [\s!cs] [\v!graphic=Graf ]
+\setuplabeltext [\s!sk] [\v!graphic=Graf ]
+\setuplabeltext [\s!hr] [\v!graphic=Slika ]
+\setuplabeltext [\s!sl] [\v!graphic=Slika ]
+
+\setuplabeltext [\s!pl] [\v!chapter=] % Rozdzia\l
+\setuplabeltext [\s!cs] [\v!chapter=] % Kapitola
+\setuplabeltext [\s!sk] [\v!chapter=] % Kapitola
+\setuplabeltext [\s!hr] [\v!chapter=] % Rozdzia\l
+\setuplabeltext [\s!sl] [\v!chapter=] % Poglavje
+
+\setuplabeltext [\s!pl] [\v!section=] % Podrozdzia\l
+\setuplabeltext [\s!cs] [\v!section=] % Sekce
+\setuplabeltext [\s!sk] [\v!section=] % Sekcia
+\setuplabeltext [\s!hr] [\v!section=] % Podrozdzia\l
+\setuplabeltext [\s!sl] [\v!section=]
+
+\setuplabeltext [\s!pl] [\v!subsection=]
+\setuplabeltext [\s!cs] [\v!subsection=] % Podsekce
+\setuplabeltext [\s!sk] [\v!subsection=] % Podsekcia
+\setuplabeltext [\s!hr] [\v!subsection=]
+\setuplabeltext [\s!sl] [\v!subsection=]
+
+\setuplabeltext [\s!pl] [\v!subsubsection=]
+\setuplabeltext [\s!cs] [\v!subsubsection=] % Podpodsekce
+\setuplabeltext [\s!sk] [\v!subsubsection=] % Podpodsekcia
+\setuplabeltext [\s!hr] [\v!subsubsection=]
+\setuplabeltext [\s!sl] [\v!subsubsection=]
+
+\setuplabeltext [\s!pl] [\v!subsubsubsection=]
+\setuplabeltext [\s!cs] [\v!subsubsubsection=] % Podpodpodsekce
+\setuplabeltext [\s!sk] [\v!subsubsubsection=] % Podpodpodsekcia
+\setuplabeltext [\s!hr] [\v!subsubsubsection=]
+\setuplabeltext [\s!sl] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!pl] [\v!appendix=] % Dodatek
+\setuplabeltext [\s!cs] [\v!appendix=P\rcaron\iacute loha ]
+\setuplabeltext [\s!sk] [\v!appendix=Pr\iacute loha ]
+\setuplabeltext [\s!hr] [\v!appendix=Dodatak ]
+\setuplabeltext [\s!sl] [\v!appendix=Dodatek ]
+
+\setuplabeltext [\s!pl] [\v!part=Ust\eogonek p ]
+\setuplabeltext [\s!cs] [\v!part=\Ccaron \aacute st ]
+\setuplabeltext [\s!sk] [\v!part=\Ccaron as\tcaron{} ]
+\setuplabeltext [\s!hr] [\v!part=Dio ]
+\setuplabeltext [\s!sl] [\v!part=Del ]
+
+\setuplabeltext [\s!pl] [\v!line=wiersz ]
+\setuplabeltext [\s!cs] [\v!line=\rcaron\aacute dek ]
+\setuplabeltext [\s!sk] [\v!line=riadok ]
+\setuplabeltext [\s!hr] [\v!line=red ]
+\setuplabeltext [\s!sl] [\v!line=vrstica ]
+
+\setuplabeltext [\s!pl] [\v!lines=wiersze ]
+\setuplabeltext [\s!cs] [\v!lines=\rcaron\aacute dky ]
+\setuplabeltext [\s!sk] [\v!lines=riadky ]
+\setuplabeltext [\s!hr] [\v!lines=redovi ]
+\setuplabeltext [\s!sl] [\v!lines=vrstice ]
+
+\setuplabeltext [\s!pl] [\v!january=stycznia]
+\setuplabeltext [\s!pl] [\v!february=lutego]
+\setuplabeltext [\s!pl] [\v!march=marca]
+\setuplabeltext [\s!pl] [\v!april=kwietnia]
+\setuplabeltext [\s!pl] [\v!may=maja]
+\setuplabeltext [\s!pl] [\v!june=czerwca]
+\setuplabeltext [\s!pl] [\v!july=lipca]
+\setuplabeltext [\s!pl] [\v!august=sierpnia]
+\setuplabeltext [\s!pl] [\v!september=wrze\sacute nia]
+\setuplabeltext [\s!pl] [\v!october=pa\zacute dziernika]
+\setuplabeltext [\s!pl] [\v!november=listopada]
+\setuplabeltext [\s!pl] [\v!december=grudnia]
+
+\setuplabeltext [\s!cs] [\v!january=ledna]
+\setuplabeltext [\s!cs] [\v!february=\uacute nora]
+\setuplabeltext [\s!cs] [\v!march=b\rcaron ezna]
+\setuplabeltext [\s!cs] [\v!april=dubna]
+\setuplabeltext [\s!cs] [\v!may=kv\ecaron tna]
+\setuplabeltext [\s!cs] [\v!june=\ccaron ervna]
+\setuplabeltext [\s!cs] [\v!july=\ccaron ervence]
+\setuplabeltext [\s!cs] [\v!august=srpna]
+\setuplabeltext [\s!cs] [\v!september=z\aacute\rcaron\iacute{}]
+\setuplabeltext [\s!cs] [\v!october=\rcaron\iacute jna]
+\setuplabeltext [\s!cs] [\v!november=listopadu]
+\setuplabeltext [\s!cs] [\v!december=prosince]
+
+\setuplabeltext [\s!sk] [\v!january=janu\aacute ra]
+\setuplabeltext [\s!sk] [\v!february=febru\aacute ra]
+\setuplabeltext [\s!sk] [\v!march=marca]
+\setuplabeltext [\s!sk] [\v!april=apr\iacute la]
+\setuplabeltext [\s!sk] [\v!may=m\aacute ja]
+\setuplabeltext [\s!sk] [\v!june=j\uacute na]
+\setuplabeltext [\s!sk] [\v!july=j\uacute la]
+\setuplabeltext [\s!sk] [\v!august=augusta]
+\setuplabeltext [\s!sk] [\v!september=septembra]
+\setuplabeltext [\s!sk] [\v!october=okt\oacute bra]
+\setuplabeltext [\s!sk] [\v!november=novembra]
+\setuplabeltext [\s!sk] [\v!december=decembra]
+
+\setuplabeltext [\s!hr] [\v!january=sije\ccaron anj]
+\setuplabeltext [\s!hr] [\v!february=velja\ccaron a]
+\setuplabeltext [\s!hr] [\v!march=o\zcaron ujak]
+\setuplabeltext [\s!hr] [\v!april=travanj]
+\setuplabeltext [\s!hr] [\v!may=svibanj]
+\setuplabeltext [\s!hr] [\v!june=lipanj]
+\setuplabeltext [\s!hr] [\v!july=srpanj]
+\setuplabeltext [\s!hr] [\v!august=kolovoz]
+\setuplabeltext [\s!hr] [\v!september=rujan]
+\setuplabeltext [\s!hr] [\v!october=listopad]
+\setuplabeltext [\s!hr] [\v!november=studeni]
+\setuplabeltext [\s!hr] [\v!december=prosinac]
+
+\setuplabeltext [\s!sl] [\v!january=januar]
+\setuplabeltext [\s!sl] [\v!february=februar]
+\setuplabeltext [\s!sl] [\v!march=marec]
+\setuplabeltext [\s!sl] [\v!april=april]
+\setuplabeltext [\s!sl] [\v!may=maj]
+\setuplabeltext [\s!sl] [\v!june=junij]
+\setuplabeltext [\s!sl] [\v!july=julij]
+\setuplabeltext [\s!sl] [\v!august=avgust]
+\setuplabeltext [\s!sl] [\v!september=september]
+\setuplabeltext [\s!sl] [\v!october=oktober]
+\setuplabeltext [\s!sl] [\v!november=november]
+\setuplabeltext [\s!sl] [\v!december=december]
+
+\setuplabeltext [\s!pl] [\v!sunday=niedziela]
+\setuplabeltext [\s!pl] [\v!monday=poniedzia\lstroke ek]
+\setuplabeltext [\s!pl] [\v!tuesday=wtorek]
+\setuplabeltext [\s!pl] [\v!wednesday=\sacute roda]
+\setuplabeltext [\s!pl] [\v!thursday=czwartek]
+\setuplabeltext [\s!pl] [\v!friday=pi\aogonek tek]
+\setuplabeltext [\s!pl] [\v!saturday=sobota]
+
+% new
+\setuplabeltext [\s!cs] [\v!sunday=ned\ecaron le]
+\setuplabeltext [\s!cs] [\v!monday=pond\ecaron l\iacute]
+\setuplabeltext [\s!cs] [\v!tuesday=\uacute ter\yacute]
+\setuplabeltext [\s!cs] [\v!wednesday=st\rcaron eda]
+\setuplabeltext [\s!cs] [\v!thursday=\ccaron tvrtek]
+\setuplabeltext [\s!cs] [\v!friday=p\aacute tek]
+\setuplabeltext [\s!cs] [\v!saturday=sobota]
+
+\setuplabeltext [\s!hr] [\v!sunday=nedjelja]
+\setuplabeltext [\s!hr] [\v!monday=ponedjeljak]
+\setuplabeltext [\s!hr] [\v!tuesday=utorak]
+\setuplabeltext [\s!hr] [\v!wednesday=srijeda]
+\setuplabeltext [\s!hr] [\v!thursday=\ccaron etvrtak]
+\setuplabeltext [\s!hr] [\v!friday=petak]
+\setuplabeltext [\s!hr] [\v!saturday=subota]
+
+\setuplabeltext [\s!sl] [\v!sunday=nedelja]
+\setuplabeltext [\s!sl] [\v!monday=ponedeljek]
+\setuplabeltext [\s!sl] [\v!tuesday=torek]
+\setuplabeltext [\s!sl] [\v!wednesday=sreda]
+\setuplabeltext [\s!sl] [\v!thursday=\ccaron etrtek]
+\setuplabeltext [\s!sl] [\v!friday=petek]
+\setuplabeltext [\s!sl] [\v!saturday=sobota]
+
+%D Rather new ...
+%\installlanguage
+% [\s!cs]
+% [\c!spacing=\v!packed,
+% \c!leftsentence=---,
+% \c!rightsentence=---,
+% \c!leftsubsentence=---,
+% \c!rightsubsentence=---,
+% \c!leftquote=\lowerleftsingleninequote,
+% \c!rightquote=\upperrightsinglesixquote,
+% \c!leftquotation=\lowerleftdoubleninequote,
+% \c!rightquotation=\upperrightdoublesixquote,
+% \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
+
+\setuplabeltext [\s!sl] [\v!page=stran ]
+\setuplabeltext [\s!sl] [\v!atpage=na strani ]
+\setuplabeltext [\s!sl] [\v!hencefore=glej zgoraj]
+\setuplabeltext [\s!sl] [\v!hereafter=glej spodaj]
+\setuplabeltext [\s!sl] [\v!see=glej ]
+
+% new
+\setuplabeltext [\s!cs] [\v!page=strana ]
+\setuplabeltext [\s!cs] [\v!atpage=na stran\ecaron\ ]
+\setuplabeltext [\s!cs] [\v!hencefore=viz v\yacute\scaron e ]
+\setuplabeltext [\s!cs] [\v!hereafter=viz n\iacute\zcaron e ]
+\setuplabeltext [\s!cs] [\v!see=viz ]
+
+%D \ShowAllLanguageValues [\s!pl] [polish] {Polish} {furniture}
+%D \ShowAllLanguageValues [\s!cs] [czech] {Czech} {mate}
+%D \ShowAllLanguageValues [\s!sk] [slovak] {Slovakian} {face}
+%D \ShowAllLanguageValues [\s!hr] [croatian] {Croatian} {heartthrob}
+%D \ShowAllLanguageValues [\s!sl] [slovenian] {Slovenian} {mountains}
+
+%D A present from Brooks Moses and Hans Hagen for Mojca Miklavec:
+
+\def\doconvertsloveniancharacters{\dodoconvertcharacters{25}}
+
+\def\sloveniancharacters{\doconvertsloveniancharacters\sloveniancharacter}
+\def\slovenianCharacters{\doconvertsloveniancharacters\slovenianCharacter}
+
+%D Define general-purpose macros for Slovenian character enumerations:
+
+\defineconversion [sloveniancharacter] [\sloveniancharacter]
+\defineconversion [slovenianCharacter] [\slovenianCharacter]
+
+\defineconversion [sloveniancharacters] [\sloveniancharacters]
+\defineconversion [slovenianCharacters] [\slovenianCharacters]
+
+%D Define these as the general character enumeration when
+%D language is Slovenian. If you feel uncomfortable with this,
+%D mail Mojca, since she promised to to take the heat.
+
+\defineconversion [sl] [character] [\sloveniancharacter]
+\defineconversion [sl] [Character] [\slovenianCharacter]
+
+\defineconversion [sl] [characters] [\sloveniancharacters]
+\defineconversion [sl] [Characters] [\slovenianCharacters]
+
+\defineconversion [sl] [a] [\sloveniancharacters]
+\defineconversion [sl] [A] [\slovenianCharacters]
+\defineconversion [sl] [AK] [\smallcapped\sloveniancharacters]
+\defineconversion [sl] [KA] [\smallcapped\sloveniancharacters]
+
+% this will become more generic : \languagecharacters{sl}{..}
+
+\let\sloveniancharacter\gobbleoneargument
+\let\slovenianCharacter\gobbleoneargument
+
+%D Plugins:
+
+\loadmarkfile{lang-sla}
+
+\protect \endinput
diff --git a/tex/context/base/lang-spa.tex b/tex/context/base/lang-spa.tex
new file mode 100644
index 000000000..f6e22aa51
--- /dev/null
+++ b/tex/context/base/lang-spa.tex
@@ -0,0 +1,74 @@
+%D \module
+%D [ file=lang-spa,
+%D version=2002.04.17,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Spacing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Language Macros / Spacing}
+
+%D This module was created in the process of enhancing
+%D support for French (with the help of Daniel Flipo).
+
+\unprotect
+
+\definehspace [\s!fr] [quotation] [\flexiblespaceamount{.8}{.3}{.8}]
+\definehspace [\s!fr] [sentence] [\fixedspaceamount{1}]
+
+%definehspace [\s!fr] [quote] [\flexiblespaceamount{.8}{.3}{.8}]
+%definehspace [\s!fr] [speech] [\flexiblespaceamount{.8}{.3}{.8}]
+
+\definehspace [\s!fr] [interquotation] [\zeropoint]
+\definehspace [\s!fr] [intersentence] [\zeropoint]
+
+\definehspace [\string :] [\zeropoint]
+\definehspace [\string ;] [\zeropoint]
+\definehspace [\string !] [\zeropoint]
+\definehspace [\string ?] [\zeropoint]
+
+\definehspace [\s!fr] [\string :] [\spaceamount]
+\definehspace [\s!fr] [\string ;] [.16667em]
+\definehspace [\s!fr] [\string !] [.16667em]
+\definehspace [\s!fr] [\string ?] [.16667em]
+
+%D Alternative discretionary handlers:
+
+\definetextmodediscretionary :
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{:}:}
+
+\definetextmodediscretionary ;
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{;};}
+
+\definetextmodediscretionary ?
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{?}?}
+
+\definetextmodediscretionary !
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{!}!}
+
+%D \startbuffer
+%D \mainlanguage[en] \quotation{test \quotation{test} test}\par
+%D \mainlanguage[nl] \quotation{test \quotation{test} test}\par
+%D \mainlanguage[fr] \quotation{test \quotation{test} test}\par
+%D
+%D \mainlanguage[en] \quotation{\quotation{test} test}\par
+%D \mainlanguage[nl] \quotation{\quotation{test} test}\par
+%D \mainlanguage[fr] \quotation{\quotation{test} test}\par
+%D
+%D \mainlanguage[en] |<|test |<|test|>| test|>| \par
+%D \mainlanguage[nl] |<|test |<|test|>| test|>| \par
+%D \mainlanguage[fr] |<|test |<|test|>| test|>| \par
+%D
+%D \mainlanguage[en] |<||<|test|>| test|>| \par
+%D \mainlanguage[nl] |<||<|test|>| test|>| \par
+%D \mainlanguage[fr] |<||<|test|>| test|>| \par
+%D \stopbuffer
+%D
+%D \typebuffer {\getbuffer}
+
+\protect \endinput
diff --git a/tex/context/base/lang-spe.mkii b/tex/context/base/lang-spe.mkii
new file mode 100644
index 000000000..7911b0c95
--- /dev/null
+++ b/tex/context/base/lang-spe.mkii
@@ -0,0 +1,244 @@
+%D \module
+%D [ file=lang-spe,
+%D version=2002.05.07, % 1996.01.25,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Specifics,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This code was originally placed in the language
+%D initialization module, but isolating it is clearer. Language
+%D specifics evolved out of user demands for special features,
+%D like the german active quote. After a while I decided to
+%D associate them to languages in a more general way so that we
+%D could associate all kind of things with language switching.
+%D
+%D This is a typical example of functionality that occasionally
+%D gets improved based on user input and experience. Much of the
+%D code is pretty old and could probabbly be done in better ways.
+%D It's probably also the kind of code that has been and will be
+%D written over and over again by \TEX\ users around the world,
+%D so there are probably better implementations of similar
+%D functionality around. Therefore, users are invited to pop in
+%D their own handling as long as it does not interfere with
+%D existing code. Writing the more obscure macros that deal with
+%D this is a good learning experience (catcodes, lccodes, token
+%D lists, expansion, \unknown).
+
+\writestatus{loading}{ConTeXt Language Macros / Specifics}
+
+\unprotect
+
+%D \macros
+%D {everyresetlanguagespecifics,resetlanguagespecifics}
+%D
+%D Cleanup macros.
+
+\newevery \everyresetlanguagespecifics \relax
+
+\def\resetlanguagespecifics
+ {\ifcase\protectionlevel
+ \the\everyresetlanguagespecifics
+ \else % to be translated
+ % \writestatus\m!systems{don't change language in unprotected mode!}%
+ \fi}
+
+\appendtoks
+ \resetlanguagespecifics
+\to \everycleanupfeatures
+
+%D \macros
+%D {startlanguagespecifics,enablelanguagespecifics}
+%D
+%D Each language has its own typographic pecularities. Some of
+%D those can be influenced by parameters, others are handled by
+%D the interface, but as soon as specific commands come into
+%D view we need another mechanism. In the macro that activates
+%D a language, we call \type{\enablelanguagespecifics}. This
+%D macro in return calls for the setup of language specific
+%D macros. Such specifics are defined as:
+%D
+%D \starttyping
+%D \startlanguagespecifics[de]
+%D \installcompoundcharacter "a {\"a}
+%D \installcompoundcharacter "e {\"e}
+%D \installcompoundcharacter "s {\SS}
+%D \stoplanguagespecifics
+%D \stoptyping
+%D
+%D Instead of \type{[du]} we can pass a comma separated
+%D list, like \type{[du,nl]}. Next calls to this macro add the
+%D specifics to the current list.
+%D
+%D Before we actually read the specifics, we first take some
+%D precautions that will prevent spurious spaces to creep into
+%D the list.
+
+% We should use token registers, but alas, we run out of them and
+% \ETEX\ has a bug. Well, let's use a token register now (2006).
+
+\def\startlanguagespecifics% % we use double to
+ {\bgroup
+ \catcode`\^^I=\@@ignore
+ \catcode`\^^M=\@@ignore
+ \catcode`\^^L=\@@ignore
+ \dodoubleempty\dostartlanguagespecifics} % get rid of spaces
+
+%D The main macro looks quite complicated but actually does
+%D nothing special. By embedding \type{\do} we can easily
+%D append to the lists and also execute them at will. Just to
+%D be sure, we check on spurious spaces. The second dummy
+%D argument gobbles spaces.
+
+\def\languageencoding
+ {\ifx\characterencoding\nocharacterencoding \else
+ \characterencoding-%
+ \fi}
+
+\long\def\dostartlanguagespecifics[#1][#2]#3\stoplanguagespecifics
+ {\egroup
+ \processcommalist[#1]{\dosetlanguagespecifics{#3}}}
+
+% \long\def\dosetlanguagespecifics#1#2%
+% {\ifundefined{\??la\languageencoding#2\??la}\forgetlanguagespecifics[#2]\fi
+% % the next line catches the case that specifics are enabled *before* they are defined
+% \expandafter\ifx\csname\??la\languageencoding#2\??la\endcsname\relax\forgetlanguagespecifics[#2]\fi
+% \appendvalue{\??la\languageencoding#2\??la}{#1}%
+% \bgroup
+% \setbox\scratchbox\hbox{\enablelanguagespecifics[#2]}%
+% \ifdim\wd\scratchbox>\zeropoint
+% \showmessage\m!linguals7{\currentencoding-#2,\the\wd\scratchbox\space}\wait
+% \else
+% \showmessage\m!linguals8{\currentencoding-#2}%
+% \fi
+% \egroup
+% \doif{#2}\currentmainlanguage{\enablelanguagespecifics[#2]}}
+
+\def\languagespectag#1{\??la\languageencoding#1\??la}
+
+\long\def\dosetlanguagespecifics#1#2%
+ {\edef\askedlanguagespecificstag{\languagespectag{#2}}%
+ \ifcsname\askedlanguagespecificstag\endcsname \else
+ \expandafter\newtoks\csname\askedlanguagespecificstag\endcsname
+ \fi
+ \csname\askedlanguagespecificstag\endcsname\@EA{\the\csname\askedlanguagespecificstag\endcsname#1}%
+ \bgroup
+ \setbox\scratchbox\hbox{\enablelanguagespecifics[#2]}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \showmessage\m!linguals7{\currentencoding-#2,\the\wd\scratchbox\space}\wait
+ \else
+ \showmessage\m!linguals8{\currentencoding-#2}%
+ \fi
+ \egroup
+ \doif{#2}\currentmainlanguage{\enablelanguagespecifics[#2]}}
+
+\def\forgetlanguagespecifics[#1]%
+ {\csname\languagespectag{#1}\endcsname\emptytoks}
+
+%D Enabling them is rather straightforward. We only have to
+%D define \type{\do} in such a way that \type{{ }} is removed
+%D and the language key is gobbled.
+
+% \def\enablelanguagespecifics[#1]%
+% {\the\executeifdefined{\??la
+% \@EA\ifx\csname\??la#1\c!default\endcsname\relax
+% \languageencoding
+% \else
+% \csname\??la#1\c!default\endcsname
+% \fi
+% \??la}\emptytoks
+% \the\executeifdefined{\??la#1\??la}\emptytoks
+% \the\executeifdefined{\??la\languageencoding#1\??la}\emptytoks} % dup ?
+
+\def\enablelanguagespecifics[#1]%
+ {\edef\askedlanguagespecificslanguage{\defaultlanguage{#1}}%
+ \ifcsname\??la\askedlanguagespecificslanguage\??la\endcsname
+ \the\csname\??la\askedlanguagespecificslanguage\??la\endcsname
+ \fi
+ \ifx\languageencoding\empty\else
+ \ifcsname\??la\languageencoding\askedlanguagespecificslanguage\??la\endcsname
+ \the\csname\??la\languageencoding\askedlanguagespecificslanguage\??la\endcsname
+ \fi
+ \fi}
+
+%D \macros
+%D {deactivatelanguagespecific}
+%D
+%D The next code makes it possible to disable the specifics.
+
+% \def\deactivatelanguagespecific#1%
+% {\ifundefined{l g s \string#1}%
+% \letgvalueempty{l g s \string#1}% signal to prevent dup def
+% \bgroup
+% \catcode`#1=\@@active
+% \uccode`~=`#1
+% \uppercase{\doglobal\appendtoks\dodeactivatetoken{~}\to\everyresetlanguagespecifics}%
+% \egroup
+% \expanded{\doglobal\noexpand\appendtoks{#1}{\the\catcode`#1}}\to\everyresetlanguagespecifics
+% \fi}
+
+% \def\dodeactivatetoken#1#2#3% test needed to avoid clash with \unprotect
+% {\def#1{#2}\ifnum\catcode`#2=\@@active\catcode`#2=#3\relax\fi}
+
+%D We cannot hook this into the installer since language
+%D specifics can be anything. So far, we have the following
+%D potentially active characters.
+
+%D Beware, this should happen under an unprotected regime;
+%D thanks to Giuseppe Oblomov Bilotta, who first noticed
+%D that something was wrong.
+
+\protect
+
+% \deactivatelanguagespecific "
+% \deactivatelanguagespecific /
+% \deactivatelanguagespecific :
+% \deactivatelanguagespecific ;
+% \deactivatelanguagespecific ?
+% \deactivatelanguagespecific !
+
+\unprotect
+
+% yes or no (taco wins: no)
+
+% \startlanguagespecifics[nl,cs,sk,fr]
+% \lccode`\'=`\'
+% \stoplanguagespecifics
+
+%D \macros
+%D {ordinaldaynumber, highordinalstr, ordinalstr}
+%D
+%D Efficient general ordinal number converters are sometimes
+%D difficult to implement. Fortunately dates never exceed the
+%D number~31.
+
+\ifx\high \undefined \let\high \firstofoneargument \fi % todo
+\ifx\notsmallcapped\undefined \let\notsmallcapped\firstofoneargument \fi % todo
+
+\def\highordinalstr#1{\high{\notsmallcapped{#1}}}
+\def\ordinalstr #1{\notsmallcapped{#1}}
+
+\def\ordinaldaynumber#1% \strippedcsname\ordinaldaynumber
+ {\expanded{\executeifdefined{\currentlanguage ordinaldaynumber}%
+ \noexpand\firstofoneargument{\number#1}}}
+
+%D Language specific converters have definitions like:
+%D
+%D \starttyping
+%D \def\enordinaldaynumber#1{...}
+%D \stoptyping
+%D
+%D Examples can be found in the other \type {lang} modules.
+
+% \ifprocessingXML is a nasty dependency
+
+\appendtoks
+ \ifprocessingXML \else \resetlanguagespecifics \fi
+\to \everylanguage
+
+\protect \endinput
diff --git a/tex/context/base/lang-ura.tex b/tex/context/base/lang-ura.tex
new file mode 100644
index 000000000..a2bcd3d2b
--- /dev/null
+++ b/tex/context/base/lang-ura.tex
@@ -0,0 +1,158 @@
+%D \module
+%D [ file=lang-sla,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Uralic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Todo: replace \'.. by \namedglyph
+
+\writestatus{loading}{ConTeXt Language Macros / Uralic Languages}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+%D
+%D \starttabulate[|lB|l|]
+%D \NC Finnish \NC \NC \NR
+%D \NC Hungarian \NC Balazs Nagy \NC \NR
+%D \stoptabulate
+
+% Cheremiss, Estonian, Finnish, Karelian, Laap, Mordvinian,
+% Permian tongues, Hungarian, Ostyak, Vogul, Samoyed
+
+\unprotect
+
+\installlanguage
+ [\s!fi]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\ ,\v!month,\ ,\v!day}]
+
+\installlanguage
+ [\s!hu]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,.,\ ,\v!month,\ ,\v!day,.},
+ \s!mapping=ec,
+ \s!encoding=ec]
+
+\installlanguage [finish] [\s!fi]
+\installlanguage [hungarian] [\s!hu]
+
+\setupheadtext [\s!fi] [\v!content=Sis\"allys]
+\setupheadtext [\s!fi] [\v!tables=Taulukkoj]
+\setupheadtext [\s!fi] [\v!figures=Kuvi]
+\setupheadtext [\s!fi] [\v!graphics=Grafiikkaoi]
+\setupheadtext [\s!fi] [\v!intermezzi=Intermezzos]
+\setupheadtext [\s!fi] [\v!index=Indeksiluku]
+\setupheadtext [\s!fi] [\v!abbreviations=Lyhennyksi]
+\setupheadtext [\s!fi] [\v!logos=Vertauskuva]
+\setupheadtext [\s!fi] [\v!units=Yksik\"ot]
+
+\setupheadtext [\s!hu] [\v!content=Tartalom]
+\setupheadtext [\s!hu] [\v!tables=T\'abl\'azatok]
+\setupheadtext [\s!hu] [\v!figures=\'Abr\'ak]
+\setupheadtext [\s!hu] [\v!graphics=Grafik\'ak]
+\setupheadtext [\s!hu] [\v!intermezzi=Intermezzok]
+\setupheadtext [\s!hu] [\v!index=Index]
+\setupheadtext [\s!hu] [\v!abbreviations=R\"ovid\'it\'esek]
+\setupheadtext [\s!hu] [\v!logos=Fejl\'ecek]
+\setupheadtext [\s!hu] [\v!units=M\'ert\'ekegys\'egek]
+
+\setuplabeltext [\s!fi] [\v!table=Taulukko ]
+\setuplabeltext [\s!fi] [\v!figure=Kuva ]
+\setuplabeltext [\s!fi] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!fi] [\v!graphic=Grafiikka ]
+\setuplabeltext [\s!fi] [\v!chapter=]
+\setuplabeltext [\s!fi] [\v!section=]
+\setuplabeltext [\s!fi] [\v!subsection=]
+\setuplabeltext [\s!fi] [\v!subsubsection=]
+\setuplabeltext [\s!fi] [\v!subsubsubsection=]
+\setuplabeltext [\s!fi] [\v!appendix=]
+\setuplabeltext [\s!fi] [\v!part=Osa ]
+\setuplabeltext [\s!fi] [\v!line=rivi ]
+\setuplabeltext [\s!fi] [\v!lines=rivie ]
+
+\setuplabeltext [\s!hu] [\v!table={,.~t\'abl\'azat:}]
+\setuplabeltext [\s!hu] [\v!figure={,.~\'abra:}]
+\setuplabeltext [\s!hu] [\v!intermezzo={,.~intermezzo:}]
+\setuplabeltext [\s!hu] [\v!graphic={,.~k\'ep:}]
+\setuplabeltext [\s!hu] [\v!chapter={,.~fejezet:}]
+\setuplabeltext [\s!hu] [\v!section={,.}]
+\setuplabeltext [\s!hu] [\v!subsection={,.}]
+\setuplabeltext [\s!hu] [\v!subsubsection={,.}]
+\setuplabeltext [\s!hu] [\v!subsubsubsection={,.}]
+\setuplabeltext [\s!hu] [\v!appendix=]
+\setuplabeltext [\s!hu] [\v!part={,.~r\'esz:}]
+\setuplabeltext [\s!hu] [\v!line={,.~sor:}]
+\setuplabeltext [\s!hu] [\v!lines=sorok]
+
+\setuplabeltext [\s!fi] [\v!january=tammikuu]
+\setuplabeltext [\s!fi] [\v!february=helmikuu]
+\setuplabeltext [\s!fi] [\v!march=maaliskuu]
+\setuplabeltext [\s!fi] [\v!april=huhtikuu]
+\setuplabeltext [\s!fi] [\v!may=toukokuu]
+\setuplabeltext [\s!fi] [\v!june=kes\"akuu]
+\setuplabeltext [\s!fi] [\v!july=hein\"akuu]
+\setuplabeltext [\s!fi] [\v!august=elokuu]
+\setuplabeltext [\s!fi] [\v!september=syyskuu]
+\setuplabeltext [\s!fi] [\v!october=lokakuu]
+\setuplabeltext [\s!fi] [\v!november=marraskuu]
+\setuplabeltext [\s!fi] [\v!december=joulukuu]
+
+\setuplabeltext [\s!hu] [\v!january=janu\'ar]
+\setuplabeltext [\s!hu] [\v!february=febru\'ar]
+\setuplabeltext [\s!hu] [\v!march=m\'arcius]
+\setuplabeltext [\s!hu] [\v!april=\'aprilis]
+\setuplabeltext [\s!hu] [\v!may=m\'ajus]
+\setuplabeltext [\s!hu] [\v!june=j\'unius]
+\setuplabeltext [\s!hu] [\v!july=j\'ulius]
+\setuplabeltext [\s!hu] [\v!august=augusztus]
+\setuplabeltext [\s!hu] [\v!september=szeptember]
+\setuplabeltext [\s!hu] [\v!october=okt\'ober]
+\setuplabeltext [\s!hu] [\v!november=november]
+\setuplabeltext [\s!hu] [\v!december=december]
+
+\setuplabeltext [\s!fi] [\v!sunday=sunnuntai]
+\setuplabeltext [\s!fi] [\v!monday=maanantai]
+\setuplabeltext [\s!fi] [\v!tuesday=tiistai]
+\setuplabeltext [\s!fi] [\v!wednesday=keskiviikko]
+\setuplabeltext [\s!fi] [\v!thursday=torstai]
+\setuplabeltext [\s!fi] [\v!friday=perjantai]
+\setuplabeltext [\s!fi] [\v!saturday=lauantai]
+
+\setuplabeltext [\s!hu] [\v!sunday=vas\'arnap]
+\setuplabeltext [\s!hu] [\v!monday=h\'etf\H{o}]
+\setuplabeltext [\s!hu] [\v!tuesday=kedd]
+\setuplabeltext [\s!hu] [\v!wednesday=szerda]
+\setuplabeltext [\s!hu] [\v!thursday=cs\"ut\"ort\"ok]
+\setuplabeltext [\s!hu] [\v!friday=p\'entek]
+\setuplabeltext [\s!hu] [\v!saturday=szombat]
+
+%D \ShowAllLanguageValues [\s!fi] [finnish] {Finnish} {phone}
+%D \ShowAllLanguageValues [\s!hu] [hungarian] {Hungarian} {rhapsody}
+
+\protect \endinput
diff --git a/tex/context/base/lang-url.lua b/tex/context/base/lang-url.lua
new file mode 100644
index 000000000..b0a71ec67
--- /dev/null
+++ b/tex/context/base/lang-url.lua
@@ -0,0 +1,101 @@
+if not modules then modules = { } end modules ['lang-url'] = {
+ version = 1.001,
+ comment = "companion to lang-url.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local utfbyte, utfgsub = utf.byte, utf.gsub
+
+local ctxcatcodes, texsprint = tex.ctxcatcodes, tex.sprint
+
+commands = commands or { }
+
+--[[
+<p>Hyphenating <l n='url'/>'s is somewhat tricky and a matter of taste. I did
+consider using a dedicated hyphenation pattern or dealing with it by node
+parsing, but the following solution suits as well. After all, we're mostly
+dealing with <l n='ascii'/> characters.</p>
+]]--
+
+commands.hyphenatedurl = commands.hyphenatedurl or { }
+
+local hyphenatedurl = commands.hyphenatedurl
+
+hyphenatedurl.characters = {
+ ["!"] = 1,
+ ["\""] = 1,
+ ["#"] = 1,
+ ["$"] = 1,
+ ["%"] = 1,
+ ["&"] = 1,
+ ["("] = 1,
+ ["*"] = 1,
+ ["+"] = 1,
+ [","] = 1,
+ ["-"] = 1,
+ ["."] = 1,
+ ["/"] = 1,
+ [":"] = 1,
+ [";"] = 1,
+ ["<"] = 1,
+ ["="] = 1,
+ [">"] = 1,
+ ["?"] = 1,
+ ["@"] = 1,
+ ["["] = 1,
+ ["\\"] = 1,
+ ["^"] = 1,
+ ["_"] = 1,
+ ["`"] = 1,
+ ["{"] = 1,
+ ["|"] = 1,
+ ["~"] = 1,
+
+ ["'"] = 2,
+ [")"] = 2,
+ ["]"] = 2,
+ ["}"] = 2
+}
+
+hyphenatedurl.lefthyphenmin = 2
+hyphenatedurl.righthyphenmin = 3
+hyphenatedurl.discretionary = nil
+
+local chars = hyphenatedurl.characters
+
+function hyphenatedurl.action(str, left, right, disc)
+ local n = 0
+ local b = math.max( left or hyphenatedurl.lefthyphenmin, 2)
+ local e = math.min(#str-(right or hyphenatedurl.righthyphenmin)+2,#str)
+ local d = disc or hyphenatedurl.discretionary
+ for s in utfcharacters(str) do
+ n = n + 1
+ if s == d then
+ texsprint(ctxcatcodes,"\\d{",utfbyte(s),"}")
+ else
+ local c = chars[s]
+ if not c or n<=b or n>=e then
+ texsprint(ctxcatcodes,"\\n{",utfbyte(s),"}")
+ elseif c == 1 then
+ texsprint(ctxcatcodes,"\\b{",utfbyte(s),"}")
+ elseif c == 2 then
+ texsprint(ctxcatcodes,"\\a{",utfbyte(s),"}")
+ end
+ end
+ end
+end
+
+-- todo, no interface in mkiv yet
+
+function hyphenatedurl.setcharacters(str,value) -- 1, 2 == before, after
+ for s in utfcharacters(str) do
+ chars[s] = value or 1
+ end
+end
+
+-- .hyphenatedurl.setcharacters("')]}",2)
diff --git a/tex/context/base/lang-url.mkii b/tex/context/base/lang-url.mkii
new file mode 100644
index 000000000..fdf530b45
--- /dev/null
+++ b/tex/context/base/lang-url.mkii
@@ -0,0 +1,306 @@
+%D \module
+%D [ file=lang-url,
+%D version=2008.01.22, % used to be lang-mis
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Language Options,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+%D This is rather old code. The following solution was used
+%D for a long time and is kind of built-up over the years.
+
+\ifx\\\undefined \let\\\crlf \fi
+
+%D \macros
+%D {hyphenatedurl}
+%D
+%D For those who want to put full \URL's in a text, we offer
+%D
+%D \startbuffer
+%D \hyphenatedurl{http://optimist.optimist/optimist/optimist.optimist#optimist}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which breaks at the appropriate places. Watch the \type{#}
+%D hack.
+%D
+%D When passed as argument, like in \type {\goto}, one needs
+%D to substitute a \type {\\} for each \type{#}.
+%D
+%D \startbuffer
+%D \hyphenatedurl{http://this.is.a.rather/strange/reference#indeed}
+%D \stopbuffer
+%D
+%D \typebuffer
+
+\ifx\urlsplitmode\undefined \chardef\urlsplitmode\plusone \fi
+
+% 0 => don't split
+% 1 => . : na, rest voor
+% 2 => alles na
+% 3 => alles voor
+
+% \bgroup \catcode`\~=\active \catcode`\/=\active
+%
+% \unexpanded\gdef\hyphenatedurl#1% {}{} handles accents
+% {\bgroup
+% \ifnum\hyphenpenalty<10000 \else
+% \def\discretionary##1##2##3{##1\allowbreak##2}%
+% \fi
+% \obeyhyphens
+% \def\splitbefore##1%
+% {\setbox\scratchbox=\hbox{##1{}{}}%
+% \ifcase\urlsplitmode
+% \box\scratchbox
+% \or
+% \postwordbreak\box\scratchbox\prewordbreak
+% \or
+% \prewordbreak\discretionary{\box\scratchbox}{}{\box\scratchbox}\prewordbreak
+% \else
+% \postwordbreak\box\scratchbox\prewordbreak
+% \fi}%
+% \def\splitafter##1%
+% {\ifcase\urlsplitmode
+% ##1{}{}%
+% \or
+% \prewordbreak\discretionary{##1{}{}}{}{##1{}{}}\prewordbreak
+% \or
+% \prewordbreak\discretionary{##1{}{}}{}{##1{}{}}\prewordbreak
+% \else
+% \prewordbreak\discretionary{}{##1{}{}}{##1{}{}}\prewordbreak
+% \fi}%
+% \def\splitanyway##1%
+% {\prewordbreak##1\prewordbreak}%
+% \def\flushurl%
+% {\savedurl\let\savedurl\empty}%
+% \def\\%
+% {\spliturl\#}%
+% \let\~=\lettertilde\let~=\~%
+% \let\/=\letterslash\let/=\/%
+% \let\savedurl\empty
+% \scratchcounter\zerocount % used for hyphenmethod
+% \handletokens#1\with\scanurl\savedurl
+% \egroup}
+%
+% \egroup
+
+% \chardef\urlhyphenmethod=0
+
+% \def\scanurl#1%
+% {\advance\scratchcounter\plusone
+% \ifx#1\blankspace
+% \flushurl\splitanyway\normalspace
+% \else\ifx#1\ %
+% \flushurl\splitanyway\normalspace
+% \else\ifx#1\space
+% \flushurl\splitanyway\normalspace
+% \else\ifx#1\~%
+% \flushurl\splitbefore\~%
+% \else\ifx#1\#%
+% \flushurl\splitbefore\#%
+% \else\ifx#1\&%
+% \flushurl\splitbefore\&%
+% \else\ifx#1\%%
+% \flushurl\splitbefore\%%
+% \else\ifx#1\_%
+% \flushurl\splitbefore\_%
+% \else\if\noexpand#1\relax
+% #1%
+% \else\ifnum\catcode`#1=8
+% \flushurl\splitbefore\_%
+% \else\ifnum\catcode`#1=6
+% \flushurl\splitbefore\#%
+% \else\ifnum\catcode`#1=4
+% \flushurl\splitbefore\&%
+% \else\expandafter\if\string#1\lettertilde
+% \flushurl\splitbefore\~%
+% \else\expandafter\if\string#1\letterpercent
+% \flushurl\splitbefore\%%
+% \else\expandafter\if\string#1\letterunderscore
+% \flushurl\splitbefore\_%
+% \else\expandafter\if\string#1\letterquestionmark
+% \flushurl\splitafter\letterquestionmark
+% \else\expandafter\if\string#1\letterat
+% \flushurl\splitafter\letterat
+% \else\expandafter\if\string#1\letterslash
+% \edef\savedurl{\savedurl\letterslash}%
+% \else\expandafter\if\string#1+%
+% \flushurl\splitafter+%
+% \else\expandafter\if\string#1:%
+% \flushurl\splitafter:%
+% \else\expandafter\if\string#1.%
+% \flushurl\splitafter.%
+% \else\expandafter\if\string#1(%
+% \flushurl\splitbefore(%
+% \else\expandafter\if\string#1)%
+% \flushurl\splitafter)%
+% \else
+% \ifx\savedurl\empty\else
+% \splitbefore\savedurl
+% \let\savedurl\empty
+% \fi
+% \ifcase\urlhyphenmethod
+% \string#1%
+% \else
+% \ifnum\scratchcounter>\plusthree % so, \http: will not break
+% \edef\savedurl{\string#1}%
+% \else
+% \string#1%
+% \fi
+% \fi
+% \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+%D The following approach takes more resources but is cleaner (after all, we now
+%D have huge \TEX's. It's is basically a \TEX\ version of the \MKIV\ variant.
+
+\newtoks\everyhyphenatedurl
+
+\appendtoks
+ \let\&\letterampersand
+ \let\#\letterhash
+ \let\~\lettertilde
+ \let\\\letterbackslash
+ \let\$\letterdollar
+ \let\^\letterhat
+ \let\_\letterunderscore
+ \let\{\letterleftbrace
+ \let\}\letterrightbrace
+ \let\|\letterbar
+ \let~=\lettertilde
+ \let|=\letterbar
+\to \everyhyphenatedurl
+
+\def\hyphenatedurlseparator{} % \periodcentered
+
+\def\dohyphenatedurlnormal#1{\char#1\relax}%
+\def\dohyphenatedurlafter #1{\char#1\discretionary{}{\hyphenatedurlseparator}{}}%
+\def\dohyphenatedurlbefore#1{\discretionary{\hyphenatedurlseparator}{}{}\char#1\relax}%
+
+% 0=normal 1=before 2=after
+
+\def\sethyphenatedurlnormal#1{\expandafter\chardef\csname url @ #1\endcsname\zerocount}
+\def\sethyphenatedurlbefore#1{\expandafter\chardef\csname url @ #1\endcsname\plusone }
+\def\sethyphenatedurlafter #1{\expandafter\chardef\csname url @ #1\endcsname\plustwo }
+
+\sethyphenatedurlbefore !
+\sethyphenatedurlbefore "
+\sethyphenatedurlbefore \letterhash
+\sethyphenatedurlbefore \letterdollar
+\sethyphenatedurlbefore \letterpercent
+\sethyphenatedurlbefore \letterampersand
+\sethyphenatedurlbefore (
+\sethyphenatedurlbefore *
+\sethyphenatedurlbefore +
+\sethyphenatedurlbefore ,
+\sethyphenatedurlbefore -
+\sethyphenatedurlbefore .
+\sethyphenatedurlbefore /
+\sethyphenatedurlbefore :
+\sethyphenatedurlbefore ;
+\sethyphenatedurlbefore <
+\sethyphenatedurlbefore =
+\sethyphenatedurlbefore >
+\sethyphenatedurlbefore ?
+\sethyphenatedurlbefore @
+\sethyphenatedurlbefore [
+\sethyphenatedurlbefore \letterbackslash
+\sethyphenatedurlbefore ^
+\sethyphenatedurlbefore _
+\sethyphenatedurlbefore `
+\sethyphenatedurlbefore \letteropenbrace
+\sethyphenatedurlbefore \letterbar
+\sethyphenatedurlbefore \lettertilde
+
+\sethyphenatedurlafter '
+\sethyphenatedurlafter )
+\sethyphenatedurlafter ]
+\sethyphenatedurlafter \letterclosebrace
+
+\unexpanded \def\hyphenatedurl#1%
+ {\dontleavehmode
+ \begingroup
+ \the\everyhyphenatedurl
+ \edef\ascii{#1}%
+ \expanded{\handletokens{\detokenize\expandafter{\ascii}}}\with\dohyphenatedurl
+ \endgroup}
+
+\def\dohyphenatedurl#1%
+ {\ifcase\executeifdefined{url @ #1}\zerocount\relax
+ \expandafter\dohyphenatedurlnormal
+ \or
+ \expandafter\dohyphenatedurlbefore
+ \or
+ \expandafter\dohyphenatedurlafter
+ \fi{\number`#1}}
+
+% maybe ... to be finished
+%
+% \def\hyphenatedstring#1%
+% {\bgroup
+% \nohyphens
+% \def\next##1{##1\doif{##1}{-}{\allowbreak}}%
+% \handletokens#1\with\next
+% \egroup}
+%
+% {\hsize1cm\hyphenatedstring{ABXXXXXXXXXXC-12345-12345}}
+
+%D \macros
+%D {hyphenatedfilename}
+%D
+%D For the moment we treat filenames in a similar way,
+%D
+%D \starttyping
+%D \hyphenatedfilename{here/there/filename.suffix}
+%D \stoptyping
+
+\ifx\hyphenatedfilename\undefined \let\hyphenatedfilename\hyphenatedurl \fi
+
+% \def\test#1%
+% {\dontleavehmode
+% \begingroup
+% \tttf
+% \hyphenatedurl {%
+% \letterampersand #1\letterampersand #1\letterampersand #1\letterampersand #1\letterampersand
+% \letterhash #1\letterhash #1\letterpercent #1\letterslash #1\letterampersand
+% }%
+% \endgroup}
+
+% \dorecurse{100}{\test{a} \test{ab} \test{abc} \test{abcd} \test{abcde} \test{abcdef}}
+
+\protect \endinput
+
+% \bgroup
+
+% \gdef\lettercolon{:}
+
+% \catcode`\:=\active
+% \catcode`\^=\active
+% \catcode`\/=\active
+% \catcode`\~=\active
+
+% \gdef\theurlcolon {\nobreak\hbox{\lettercolon}\allowbreak}
+% \gdef\theurlslash#1{\nobreak\hbox{\letterslash}\ifx#1\relax\else\ifnum`/=\expandafter`\string#1\else\allowbreak\fi#1\fi}
+% \gdef\theurlhat {\allowbreak\hbox{\letterhat}\nobreak}
+% \gdef\theurltilde {\allowbreak\hbox{\lettertilde}\nobreak}
+
+% \gdef\ForMojcaWhoLikesHacks#1%
+% {\dontleavehmode
+% \begingroup
+% \mathcode`\:="8000 \let:\theurlcolon
+% \mathcode`\^="8000 \let^\theurlhat
+% \mathcode`\/="8000 \let/\theurlslash
+% \mathcode`\~="8000 \let~\theurltilde
+% \everymath\emptytoks
+% \mathsurround\zeropoint$\tf#1\relax$%
+% \endgroup}
+% \egroup
+
+% \hsize 1mm \ForMojcaWhoLikesHacks{http://www.sil.org//silesr/}
diff --git a/tex/context/base/lang-url.mkiv b/tex/context/base/lang-url.mkiv
new file mode 100644
index 000000000..0f6b23d05
--- /dev/null
+++ b/tex/context/base/lang-url.mkiv
@@ -0,0 +1,117 @@
+%D \module
+%D [ file=lang-url,
+%D version=2008.01.22, % used to be lang-mis
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Language Options,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{lang-url}{1.001}
+
+\unprotect
+
+%D \macros
+%D {hyphenatedurl}
+%D
+%D For those who want to put full \URL's in a text, we offer
+%D
+%D \startbuffer
+%D \hyphenatedurl{http://optimist.optimist/optimist/optimist.optimist#optimist}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which breaks at the appropriate places. Watch the \type{#}
+%D hack.
+%D
+%D When passed as argument, like in \type {\goto}, one needs
+%D to substitute a \type {\\} for each \type{#}.
+%D
+%D \startbuffer
+%D \hyphenatedurl{http://this.is.a.rather/strange/reference#indeed}
+%D \stopbuffer
+%D
+%D \typebuffer
+
+\ifx\urlsplitmode\undefined \chardef\urlsplitmode\zerocount \fi % not supported in mkiv
+
+\newtoks\everyhyphenatedurl
+
+\appendtoks
+ \let\&\letterampersand
+ \let\#\letterhash
+ \let\~\lettertilde
+ \let\\\letterbackslash
+ \let\$\letterdollar
+ \let\^\letterhat
+ \let\_\letterunderscore
+ \let\{\letterleftbrace
+ \let\}\letterrightbrace
+ \let\|\letterbar
+ \let~=\lettertilde
+ \let|=\letterbar
+\to \everyhyphenatedurl
+
+\def\hyphenatedurlseparator{} % \periodcentered
+
+\def\dohyphenatedurlafter #1{\char#1\discretionary{}{\hyphenatedurlseparator}{}}%
+\def\dohyphenatedurlbefore#1{\discretionary{\hyphenatedurlseparator}{}{}\char#1\relax}%
+\def\dohyphenatedurlnormal#1{\char#1\relax}%
+\def\dohyphenatedurldisc #1{\discretionary{}{}{}}
+
+\def\sethyphenatedurlnormal #1{\ctxlua{commands.hyphenatedurl.setcharacters(\!!bs#1\!!es,0)}}
+\def\sethyphenatedurlbefore #1{\ctxlua{commands.hyphenatedurl.setcharacters(\!!bs#1\!!es,1)}}
+\def\sethyphenatedurlafter #1{\ctxlua{commands.hyphenatedurl.setcharacters(\!!bs#1\!!es,2)}}
+
+\def\hyphenatedurldiscretionary{}
+
+% \sethyphenatedurlafter{ABCDEF}
+
+\chardef\hyphenatedurllefthyphenmin = 3
+\chardef\hyphenatedurlrighthyphenmin = 3
+
+\unexpanded \def\hyphenatedurl#1%
+ {\dontleavehmode
+ \begingroup
+ \the\everyhyphenatedurl
+ \let\n\dohyphenatedurlnormal
+ \let\b\dohyphenatedurlbefore
+ \let\a\dohyphenatedurlafter
+ \let\d\dohyphenatedurldisc
+ \normalexpanded{\noexpand\ctxlua{commands.hyphenatedurl.action(
+ \!!bs\noexpand\detokenize{#1}\!!es,
+ \number\hyphenatedurllefthyphenmin,
+ \number\hyphenatedurlrighthyphenmin,
+ "\hyphenatedurldiscretionary"
+ )}}%
+ \endgroup}
+
+%D \macros
+%D {hyphenatedfilename}
+%D
+%D For the moment we treat filenames in a similar way,
+%D
+%D \starttyping
+%D \hyphenatedfilename{here/there/filename.suffix}
+%D \stoptyping
+
+\ifx\hyphenatedfilename\undefined \let\hyphenatedfilename\hyphenatedurl \fi
+
+% \def\test#1%
+% {\dontleavehmode
+% \begingroup
+% \tttf
+% \hyphenatedurl {%
+% \letterampersand #1\letterampersand #1\letterampersand #1\letterampersand #1\letterampersand
+% \letterhash #1\letterhash #1\letterpercent #1\letterslash #1\letterampersand
+% }%
+% \endgroup}
+
+% \dorecurse{100}{\test{a} \test{ab} \test{abc} \test{abcd} \test{abcde} \test{abcdef}}
+
+\protect \endinput
diff --git a/tex/context/base/lang-vn.tex b/tex/context/base/lang-vn.tex
new file mode 100644
index 000000000..27d2a48a1
--- /dev/null
+++ b/tex/context/base/lang-vn.tex
@@ -0,0 +1,92 @@
+%D \module
+%D [ file=lang-vn,
+%D version=2004.11.22, % 1999.12.12,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Vietnamese,
+%D author={Han The Thanh \& Adam Lindsay \& 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}{ConTeXt Language Macros / Vietnamese Language}
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+%D
+%D \starttabulate[|lB|l|]
+%D \NC Vietnamese \NC \THANH\ \NC \NR
+%D \stoptabulate
+
+\unprotect
+
+\installlanguage
+ [\s!vi]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\quoteleft,
+ \c!rightquote=\quoteright,
+ \c!leftquotation=\quotedblleft,
+ \c!rightquotation=\quotedblright,
+ \c!date={{ },dd,{/},mm,{/},yy},
+ \s!mapping=t5,
+ \s!encoding=t5]
+
+\installlanguage [vietnamese] [\s!vi]
+
+\setupheadtext [\s!vi] [\v!content=M\udotbelow c l\udotbelow c]
+\setupheadtext [\s!vi] [\v!tables=Danh s\aacute ch b\ahook ng]
+\setupheadtext [\s!vi] [\v!figures=Danh s\aacute ch h\igrave nh v\etilde]
+\setupheadtext [\s!vi] [\v!graphics=\Dstroke\ocircumflexgrave\ th\idotbelow]
+\setupheadtext [\s!vi] [\v!intermezzi=Intermezzos]
+\setupheadtext [\s!vi] [\v!index=Ch\ihook\ s\ocircumflexacute]
+\setupheadtext [\s!vi] [\v!abbreviations=Ch\uhorntilde\ vi\ecircumflexacute t t\abreveacute t]
+\setupheadtext [\s!vi] [\v!logos=Bi\ecircumflexhook u t\uhorn \ohorndotbelow ng]
+\setupheadtext [\s!vi] [\v!units=\Dstroke\ohorn n v\idotbelow]
+
+\setuplabeltext [\s!vi] [\v!table=B\ahook ng ]
+\setuplabeltext [\s!vi] [\v!figure=H\igrave nh ]
+\setuplabeltext [\s!vi] [\v!intermezzo=intermezzo]
+\setuplabeltext [\s!vi] [\v!graphic=\Dstroke\ocircumflexgrave\ th\idotbelow]
+\setuplabeltext [\s!vi] [\v!chapter=Ch\uhorn \ohorn ng ]
+\setuplabeltext [\s!vi] [\v!section=] % not set
+\setuplabeltext [\s!vi] [\v!subsection=] % not set
+\setuplabeltext [\s!vi] [\v!subsubsection=] % not set
+\setuplabeltext [\s!vi] [\v!subsubsubsection=] % not set
+\setuplabeltext [\s!vi] [\v!appendix=] % not set
+\setuplabeltext [\s!vi] [\v!part=Ph\acircumflexgrave n ]
+\setuplabeltext [\s!vi] [\v!line=d\ograve ng ]
+\setuplabeltext [\s!vi] [\v!lines=d\ograve ng ]
+
+\setuplabeltext [\s!vi] [\v!sunday=ch\uhook\ nh\acircumflexdotbelow t]
+\setuplabeltext [\s!vi] [\v!monday=th\uhornacute\ hai]
+\setuplabeltext [\s!vi] [\v!tuesday=th\uhornacute\ ba]
+\setuplabeltext [\s!vi] [\v!wednesday=th\uhornacute\ t\uhorn]
+\setuplabeltext [\s!vi] [\v!thursday=th\uhornacute\ n\abreve m]
+\setuplabeltext [\s!vi] [\v!friday=th\uhornacute\ s\aacute u]
+\setuplabeltext [\s!vi] [\v!saturday=th\uhornacute\ b\ahook y]
+
+\setuplabeltext [\s!vi] [\v!january=th\aacute ng gi\ecircumflex ng]
+\setuplabeltext [\s!vi] [\v!february=th\aacute ng hai]
+\setuplabeltext [\s!vi] [\v!march=th\aacute ng ba]
+\setuplabeltext [\s!vi] [\v!april=th\aacute ng t\uhorn]
+\setuplabeltext [\s!vi] [\v!may=th\aacute ng n\abreve m]
+\setuplabeltext [\s!vi] [\v!june=th\aacute ng s\aacute u]
+\setuplabeltext [\s!vi] [\v!july=th\aacute ng b\ahook y]
+\setuplabeltext [\s!vi] [\v!august=th\aacute ng t\aacute m]
+\setuplabeltext [\s!vi] [\v!september=th\aacute ng ch\iacute n]
+\setuplabeltext [\s!vi] [\v!october=th\aacute ng m\uhorn\ohorngrave i]
+\setuplabeltext [\s!vi] [\v!november=th\aacute ng m\uhorn\ohorngrave i m\ocircumflexdotbelow t]
+\setuplabeltext [\s!vi] [\v!december=th\aacute ng m\uhorn\ohorngrave i hai]
+
+%D \ShowAllLanguageValues [\s!vi] [vietnamese] {Vietnamese} {water||puppets}
+
+\protect \endinput
diff --git a/tex/context/base/lang-wrd.lua b/tex/context/base/lang-wrd.lua
new file mode 100644
index 000000000..095e44443
--- /dev/null
+++ b/tex/context/base/lang-wrd.lua
@@ -0,0 +1,225 @@
+if not modules then modules = { } end modules ['lang-ini'] = {
+ version = 1.001,
+ comment = "companion to lang-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local lower, utfchar = string.lower, utf.char
+local lpegmatch = lpeg.match
+
+languages.words = languages.words or { }
+
+local words = languages.words
+
+words.data = words.data or { }
+words.enables = false
+words.threshold = 4
+
+local set_attribute = node.set_attribute
+local unset_attribute = node.unset_attribute
+local traverse_nodes = node.traverse
+local node_id = node.id
+local wordsdata = words.data
+local chardata = characters.data
+
+local glyph_node = node_id('glyph')
+local disc_node = node_id('disc')
+local kern_node = node_id('kern')
+
+words.colors = {
+ ["known"] = "green",
+ ["unknown"] = "red",
+}
+
+local spacing = lpeg.S(" \n\r\t")
+local markup = lpeg.S("-=")
+local lbrace = lpeg.P("{")
+local rbrace = lpeg.P("}")
+local disc = (lbrace * (1-rbrace)^0 * rbrace)^1 -- or just 3 times, time this
+local word = lpeg.Cs((markup/"" + disc/"" + (1-spacing))^1)
+
+local loaded = { } -- we share lists
+
+function words.load(tag,filename)
+ local fullname = resolvers.find_file(filename,'other text file') or ""
+ if fullname ~= "" then
+ statistics.starttiming(languages)
+ local list = loaded[fullname]
+ if not list then
+ list = wordsdata[tag] or { }
+ local parser = (spacing + word/function(s) list[s] = true end)^0
+ lpegmatch(parser,io.loaddata(fullname) or "")
+ loaded[fullname] = list
+ end
+ wordsdata[tag] = list
+ statistics.stoptiming(languages)
+ else
+ logs.report("languages","missing words file '%s'",filename)
+ end
+end
+
+function words.found(id, str)
+ local tag = languages.numbers[id]
+ if tag then
+ local data = wordsdata[tag]
+ return data and (data[str] or data[lower(str)])
+ else
+ return false
+ end
+end
+
+-- The following code is an adaption of experimental code for
+-- hyphenating and spell checking.
+
+local function mark_words(head,whenfound) -- can be optimized
+ local current, start, str, language, n = head, nil, "", nil, 0
+ local function action()
+ if #str > 0 then
+ local f = whenfound(language,str)
+ if f then
+ for i=1,n do
+ f(start)
+ start = start.next
+ end
+ end
+ end
+ str, start, n = "", nil, 0
+ end
+ while current do
+ local id = current.id
+ if id == glyph_node then
+ local a = current.lang
+ if a then
+ if a ~= language then
+ if start then
+ action()
+ end
+ language = a
+ end
+ elseif start then
+ action()
+ language = a
+ end
+ local components = current.components
+ if components then
+ start = start or current
+ n = n + 1
+ for g in traverse_nodes(components) do
+ str = str .. utfchar(g.char)
+ end
+ else
+ local code = current.char
+ if chardata[code].uccode or chardata[code].lccode then
+ start = start or current
+ n = n + 1
+ str = str .. utfchar(code)
+ elseif start then
+ action()
+ end
+ end
+ elseif id == disc_node then
+ if n > 0 then
+ n = n + 1
+ end
+ elseif id == kern_node and current.subtype == 0 and start then
+ -- ok
+ elseif start then
+ action()
+ end
+ current = current.next
+ end
+ if start then
+ action()
+ end
+ return head
+end
+
+words.methods = { }
+words.method = 1
+
+local methods = words.methods
+
+methods[1] = function(head, attribute, yes, nop)
+ local right, wrong = false, false
+ if yes then right = function(n) set_attribute(n,attribute,yes) end end
+ if nop then wrong = function(n) set_attribute(n,attribute,nop) end end
+ for n in traverse_nodes(head) do
+ unset_attribute(n,attribute) -- hm, not that selective (reset color)
+ end
+ local found, done = words.found, false
+ mark_words(head, function(language,str)
+ if #str < words.threshold then
+ return false
+ elseif found(language,str) then
+ done = true
+ return right
+ else
+ done = true
+ return wrong
+ end
+ end)
+ return head, done
+end
+
+local list, dump = { }, false -- todo: per language
+
+local lower = characters.lower
+
+methods[2] = function(head, attribute)
+ dump = true
+ mark_words(head, function(language,str)
+ if #str >= words.threshold then
+ str = lower(str)
+ list[str] = (list[str] or 0) + 1
+ end
+ end)
+ return head, true
+end
+
+words.used = list
+
+function words.dump_used_words(name)
+ if dump then
+ logs.report("languages","saving list of used words in '%s'",name)
+ io.savedata(name,table.serialize(list))
+ end
+end
+
+local color = attributes.private('color')
+
+function words.check(head)
+ if words.enabled and head.next then
+ local colors = words.colors
+ local alc = attributes.list[color]
+ return methods[words.method](head, color, alc[colors.known], alc[colors.unknown])
+ else
+ return head, false
+ end
+end
+
+function words.enable(method)
+ tasks.enableaction("processors","languages.words.check")
+ words.method = method or words.method or 1
+ words.enabled = true
+end
+
+function words.disable()
+ words.enabled = false
+end
+
+-- for the moment we hook it into the attribute handler
+
+--~ languagehacks = { }
+
+--~ function languagehacks.process(namespace,attribute,head)
+--~ return languages.check(head)
+--~ end
+
+--~ chars.plugins[chars.plugins+1] = {
+--~ name = "language",
+--~ namespace = languagehacks,
+--~ processor = languagehacks.process
+--~ }
diff --git a/tex/context/base/lang-wrd.mkiv b/tex/context/base/lang-wrd.mkiv
new file mode 100644
index 000000000..b6fc6a9d3
--- /dev/null
+++ b/tex/context/base/lang-wrd.mkiv
@@ -0,0 +1,54 @@
+%D \module
+%D [ file=lang-wrd,
+%D version=2006.XX.XX,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Checking,
+%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 Experimental.
+
+\writestatus{loading}{ConTeXt Language Macros / Checking}
+
+\registerctxluafile{lang-wrd}{1.001}
+
+\unprotect
+
+% \loadspellchecklist[en][words-en.txt]
+% \loadspellchecklist[us][words-en.txt]
+% \loadspellchecklist[nl][words-nl.txt]
+% \setupspellchecking[state=start,method=1]
+%
+% \setupspellchecking[state=start,method=2]
+% ...
+% \typefile{\jobname.words}
+
+\def\loadspellchecklist
+ {\dodoubleempty\doloadspellchecklist}
+
+\def\doloadspellchecklist[#1][#2]%
+ {\ctxlua{languages.words.load("#1","#2")}}
+
+\unexpanded\def\setupspellchecking
+ {\dosingleargument\dosetupspellchecking}
+
+\unexpanded\def\setupspellchecking[#1]% todo colors
+ {\getparameters[\??wl][#1]%
+ \doifelse\@@wlstate\v!start
+ {\ctxlua{languages.words.enable(\@@wlmethod)}}
+ {\ctxlua{languages.words.disable()}}}
+
+\setupspellchecking
+ [\c!state=\v!stop,
+ \c!method=1]
+
+\appendtoks
+ \ctxlua{languages.words.dump_used_words("\jobname.words")}%
+\to \everybye
+
+\protect \endinput
diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua
new file mode 100644
index 000000000..e9e67e163
--- /dev/null
+++ b/tex/context/base/lpdf-ano.lua
@@ -0,0 +1,589 @@
+if not modules then modules = { } end modules ['lpdf-ano'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local tostring, format, rep = tostring, string.rep, string.format
+local texcount = tex.count
+
+local trace_references = false trackers.register("references.references", function(v) trace_references = v end)
+local trace_destinations = false trackers.register("references.destinations", function(v) trace_destinations = v end)
+local trace_bookmarks = false trackers.register("references.bookmarks", function(v) trace_bookmarks = v end)
+
+local variables = interfaces.variables
+local constants = interfaces.constants
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+jobreferences = jobreferences or { }
+jobreferences.runners = jobreferences.runners or { }
+jobreferences.specials = jobreferences.specials or { }
+jobreferences.handlers = jobreferences.handlers or { }
+jobreferences.executers = jobreferences.executers or { }
+
+local runners = jobreferences.runners
+local specials = jobreferences.specials
+local handlers = jobreferences.handlers
+local executers = jobreferences.executers
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfconstant = lpdf.constant
+local pdfflushobject = lpdf.flushobject
+local pdfreserveobject = lpdf.reserveobject
+local pdfannotation = nodes.pdfannotation
+local pdfdestination = nodes.pdfdestination
+
+local pdfpagereference = tex.pdfpageref
+
+local pdf_uri = pdfconstant("URI")
+local pdf_gotor = pdfconstant("GoToR")
+local pdf_goto = pdfconstant("GoTo")
+local pdf_launch = pdfconstant("Launch")
+local pdf_javascript = pdfconstant("JavaScript")
+local pdf_link = pdfconstant("Link")
+local pdf_n = pdfconstant("N")
+local pdf_t = pdfconstant("T")
+local pdf_border = pdfarray { 0, 0, 0 }
+
+local cache = { }
+
+local function pagedest(n)
+ local pd = cache[n]
+ if not pd then
+ local a = pdfarray {
+ pdfreference(pdfpagereference(n)),
+ pdfconstant("Fit")
+ }
+ pd = pdfreference(pdfflushobject(a))
+ cache[n] = pd
+ end
+ return pd
+end
+
+lpdf.pagedest = pagedest
+
+local defaultdestination = pdfarray { 0, pdfconstant("Fit") }
+
+local function link(url,filename,destination,page,actions)
+ if filename and filename ~= "" then
+ if file.basename(filename) == tex.jobname then
+ return false
+ else
+ filename = file.addsuffix(filename,"pdf")
+ end
+ end
+ if url and url ~= "" then
+ if filename and filename ~= "" then
+ if destination and destination ~= "" then
+ url = file.join(url,filename).."#"..destination
+ else
+ url = file.join(url,filename)
+ end
+ end
+ return pdfdictionary {
+ S = pdf_uri,
+ URI = url,
+ }
+ elseif filename and filename ~= "" then
+ return pdfdictionary {
+ S = pdf_gotor, -- can also be pdf_launch
+ F = filename,
+ D = (destination and destination ~= "" and destination), -- or defaultdestination,
+ NewWindow = (actions.newwindow and true) or nil,
+ }
+ elseif destination and destination ~= "" then
+ local realpage, p = texcount.realpageno, tonumber(page)
+ if not p then
+ -- sorry
+ elseif p > realpage then
+ texcount.referencepagestate = 3
+ elseif p < realpage then
+ texcount.referencepagestate = 2
+ else
+ texcount.referencepagestate = 1
+ end
+ return pdfdictionary {
+ S = pdf_goto,
+ D = destination,
+ }
+ elseif page and page ~= "" then
+ local realpage, p = texcount.realpageno, tonumber(page)
+ if p then
+ if p > realpage then
+ texcount.referencepagestate = 3
+ elseif p < realpage then
+ texcount.referencepagestate = 2
+ else
+ texcount.referencepagestate = 1
+ end
+ return pdfdictionary {
+ S = pdf_goto,
+ D = pagedest(p),
+ }
+ else
+ commands.writestatus("references","invalid page reference: %s",page or "?")
+ end
+ end
+ return false
+end
+
+lpdf.link = link
+
+function lpdf.launch(program,parameters)
+ if program and program ~= "" then
+ local d = pdfdictionary {
+ S = pdf_launch,
+ F = program,
+ D = ".",
+ }
+ if parameters and parameters ~= "" then
+ d.P = parameters
+ end
+ return d
+ end
+end
+
+function lpdf.javascript(name,arguments)
+ local script = javascripts.code(name,arguments) -- make into object (hash)
+ if script then
+ return pdfdictionary {
+ S = pdf_javascript,
+ JS = script,
+ }
+ end
+end
+
+local function pdfaction(actions)
+ local nofactions = #actions
+ texcount.referencepagestate = 0 -- goodie, as we do all in the backend, we need to set it here too
+ if nofactions > 0 then
+ local a = actions[1]
+ local action = runners[a.kind]
+ if action then
+ action = action(a,actions)
+ end
+ if action then
+ local first = action
+ for i=2,nofactions do
+ local a = actions[i]
+ local what = runners[a.kind]
+ if what then
+ what = what(a,actions)
+ end
+ if what then
+ action.next = what
+ action = what
+ else
+ -- error
+ return nil
+ end
+ end
+ return first
+ end
+ end
+end
+
+lpdf.pdfaction = pdfaction
+
+function codeinjections.prerollreference(actions)
+ local main = actions and pdfaction(actions)
+ if main then
+ main = pdfdictionary {
+ Subtype = pdf_link,
+ Border = pdf_border,
+ H = (not actions.highlight and pdf_n) or nil,
+ A = main,
+ -- does not work at all in spite of specification
+ -- OC = (actions.layer and lpdf.layerreferences[actions.layer]) or nil,
+ -- OC = backends.pdf.layerreference(actions.layer),
+ }
+ return main("A") -- todo: cache this, maybe weak
+ end
+end
+
+-- local cache = { } -- no real gain in thsi
+--
+-- function codeinjections.prerollreference(actions)
+-- local main = actions and pdfaction(actions)
+-- if main then
+-- main = pdfdictionary {
+-- Subtype = pdf_link,
+-- Border = pdf_border,
+-- H = (not actions.highlight and pdf_n) or nil,
+-- A = main,
+-- }
+-- local cm = cache[main]
+-- if not cm then
+-- cm = "/A ".. tostring(pdfreference(pdfflushobject(main))
+-- cache[main] = cm
+-- end
+-- return cm
+-- end
+-- end
+
+function nodeinjections.reference(width,height,depth,prerolled)
+ if prerolled then
+ if swapdir then
+ width = - width
+ end
+ if trace_references then
+ logs.report("references","w=%s, h=%s, d=%s, a=%s",width,height,depth,prerolled)
+ end
+ return pdfannotation(width,height,depth,prerolled)
+ end
+end
+
+function nodeinjections.destination(width,height,depth,name,view)
+ if swapdir then
+ width = - width
+ end
+ if trace_destinations then
+ logs.report("destinations","w=%s, h=%s, d=%s, n=%s, v=%s",width,height,depth,name,view or "no view")
+ end
+ return pdfdestination(width,height,depth,name,view)
+end
+
+-- runners and specials
+
+local method = "internal"
+
+runners["inner"] = function(var,actions)
+ if method == "internal" then
+ local vir = var.i.references
+ local internal = vir and vir.internal
+ if internal then
+ var.inner = "aut:"..internal
+ end
+ end
+ return link(nil,nil,var.inner,var.r,actions)
+end
+
+runners["inner with arguments"] = function(var,actions)
+ logs.report("references","todo: inner with arguments")
+ return false
+end
+
+runners["outer"] = function(var,actions)
+ local file, url = jobreferences.checkedfileorurl(var.outer,var.outer)
+ return link(url,file,var.arguments,nil,actions)
+end
+
+runners["outer with inner"] = function(var,actions)
+ local file = jobreferences.checkedfile(var.f)
+ return link(nil,file,var.inner,var.r,actions)
+end
+
+runners["special outer with operation"] = function(var,actions)
+ local handler = specials[var.special]
+ return handler and handler(var,actions)
+end
+
+runners["special outer"] = function(var,actions)
+ logs.report("references","todo: special outer")
+ return false
+end
+
+runners["special"] = function(var,actions)
+ local handler = specials[var.special]
+ return handler and handler(var,actions)
+end
+
+runners["outer with inner with arguments"] = function(var,actions)
+ logs.report("references","todo: outer with inner with arguments")
+ return false
+end
+
+runners["outer with special and operation and arguments"] = function(var,actions)
+ logs.report("references","todo: outer with special and operation and arguments")
+ return false
+end
+
+runners["outer with special"] = function(var,actions)
+ logs.report("references","todo: outer with special")
+ return false
+end
+
+runners["outer with special and operation"] = function(var,actions)
+ logs.report("references","todo: outer with special and operation")
+ return false
+end
+
+runners["special operation"] = runners["special"]
+runners["special operation with arguments"] = runners["special"]
+
+function specials.internal(var,actions) -- better resolve in strc-ref
+ local i = tonumber(var.operation)
+ local v = jobreferences.internals[i]
+ if not v then
+ -- error
+ elseif method == "internal" then
+ -- named
+ return link(nil,nil,"aut:"..i,v.references.realpage,actions)
+ else
+ -- page
+ return link(nil,nil,nil,v.references.realpage,actions)
+ end
+end
+
+specials.i = specials.internal
+
+function specials.page(var,actions) -- better resolve in strc-ref
+ local file = var.f
+ if file then
+ file = jobreferences.checkedfile(file)
+ return link(nil,file,nil,p or var.operation,actions)
+ else
+ local p = jobreferences.pages[var.operation]
+ if type(p) == "function" then
+ p = p()
+ end
+ return link(nil,nil,nil,p or var.operation,actions)
+ end
+end
+
+-- todo, do this in references namespace ordered instead (this is an experiment)
+
+local splitter = lpeg.splitat(":")
+
+function specials.order(var,actions) -- jobreferences.specials !
+ local operation = var.operation
+ if operation then
+ local kind, name, n = lpegmatch(splitter,operation)
+ local order = lists.ordered[kind]
+ order = order and order[name]
+ local v = order[tonumber(n)]
+ local r = v and v.references.realpage
+ if r then
+ var.operation = r -- brrr, but test anyway
+ return specials.page(var,actions)
+ end
+ end
+end
+
+function specials.url(var,actions)
+ local url = jobreferences.checkedurl(var.operation)
+ return link(url,nil,var.arguments,nil,actions)
+end
+
+function specials.file(var,actions)
+ local file = jobreferences.checkedfile(var.operation)
+ return link(nil,file,var.arguments,nil,actions)
+end
+
+function specials.fileorurl(var,actions)
+ local file, url = jobreferences.checkedfileorurl(var.operation,var.operation)
+ return link(url,file,var.arguments,nil,actions)
+end
+
+function specials.program(var,content)
+ local program = jobreferences.checkedprogram(var.operation)
+ return lpdf.launch(program,var.arguments)
+end
+
+function specials.javascript(var)
+ return lpdf.javascript(var.operation,var.arguments)
+end
+
+specials.JS = specials.javascript
+
+local pdf_named = pdfconstant("Named")
+
+executers.importform = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ImportFDF") }
+executers.exportform = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ExportFDF") }
+executers.first = pdfdictionary { S = pdf_named, N = pdfconstant("FirstPage") }
+executers.previous = pdfdictionary { S = pdf_named, N = pdfconstant("PrevPage") }
+executers.next = pdfdictionary { S = pdf_named, N = pdfconstant("NextPage") }
+executers.last = pdfdictionary { S = pdf_named, N = pdfconstant("LastPage") }
+executers.backward = pdfdictionary { S = pdf_named, N = pdfconstant("GoBack") }
+executers.forward = pdfdictionary { S = pdf_named, N = pdfconstant("GoForward") }
+executers.print = pdfdictionary { S = pdf_named, N = pdfconstant("Print") }
+executers.exit = pdfdictionary { S = pdf_named, N = pdfconstant("Quit") }
+executers.close = pdfdictionary { S = pdf_named, N = pdfconstant("Close") }
+executers.save = pdfdictionary { S = pdf_named, N = pdfconstant("Save") }
+executers.savenamed = pdfdictionary { S = pdf_named, N = pdfconstant("SaveAs") }
+executers.opennamed = pdfdictionary { S = pdf_named, N = pdfconstant("Open") }
+executers.help = pdfdictionary { S = pdf_named, N = pdfconstant("HelpUserGuide") }
+executers.toggle = pdfdictionary { S = pdf_named, N = pdfconstant("FullScreen") }
+executers.search = pdfdictionary { S = pdf_named, N = pdfconstant("Find") }
+executers.searchagain = pdfdictionary { S = pdf_named, N = pdfconstant("FindAgain") }
+executers.gotopage = pdfdictionary { S = pdf_named, N = pdfconstant("GoToPage") }
+executers.query = pdfdictionary { S = pdf_named, N = pdfconstant("AcroSrch:Query") }
+executers.queryagain = pdfdictionary { S = pdf_named, N = pdfconstant("AcroSrch:NextHit") }
+executers.fitwidth = pdfdictionary { S = pdf_named, N = pdfconstant("FitWidth") }
+executers.fitheight = pdfdictionary { S = pdf_named, N = pdfconstant("FitHeight") }
+
+local function fieldset(arguments)
+ -- [\dogetfieldset{#1}]
+ return nil
+end
+
+function executers.resetform(arguments)
+ arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ return pdfdictionary {
+ S = pdfconstant("ResetForm"),
+ Field = fieldset(arguments[1])
+ }
+end
+
+local formmethod = "post" -- "get" "post"
+local formformat = "xml" -- "xml" "html" "fdf"
+
+-- bit 3 = html bit 6 = xml bit 4 = get
+
+local flags = {
+ get = {
+ html = 12, fdf = 8, xml = 40,
+ },
+ post = {
+ html = 4, fdf = 0, xml = 32,
+ }
+}
+
+function executers.submitform(arguments)
+ arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ local flag = flags[formmethod] or flags.post
+ flag = (flag and (flag[formformat] or flag.xml)) or 32 -- default: post, xml
+ return pdfdictionary {
+ S = pdfconstant("ResetForm"),
+ F = fieldset(arguments[1]),
+ Field = fieldset(arguments[2]),
+ Flags = flag,
+ -- \PDFsubmitfiller
+ }
+end
+
+function executers.hide(arguments)
+ return pdfdictionary {
+ S = pdfconstant("Hide"),
+ H = true,
+ T = arguments,
+ }
+end
+
+function executers.show(arguments)
+ return pdfdictionary {
+ S = pdfconstant("Hide"),
+ H = false,
+ T = arguments,
+ }
+end
+
+local pdf_movie = pdfconstant("Movie")
+local pdf_start = pdfconstant("Start")
+local pdf_stop = pdfconstant("Stop")
+local pdf_resume = pdfconstant("Resume")
+local pdf_pause = pdfconstant("Pause")
+
+local function movie_or_sound(operation,arguments)
+ arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ return pdfdictionary {
+ S = pdf_movie,
+ T = format("movie %s",arguments[1] or "noname"),
+ Operation = operation,
+ }
+end
+
+function executers.startmovie (arguments) return movie_or_sound(pdf_start ,arguments) end
+function executers.stopmovie (arguments) return movie_or_sound(pdf_stop ,arguments) end
+function executers.resumemovie(arguments) return movie_or_sound(pdf_resume,arguments) end
+function executers.pausemovie (arguments) return movie_or_sound(pdf_pause ,arguments) end
+
+function executers.startsound (arguments) return movie_or_sound(pdf_start ,arguments) end
+function executers.stopsound (arguments) return movie_or_sound(pdf_stop ,arguments) end
+function executers.resumesound(arguments) return movie_or_sound(pdf_resume,arguments) end
+function executers.pausesound (arguments) return movie_or_sound(pdf_pause ,arguments) end
+
+function specials.action(var)
+ local operation = var.operation
+ if var.operation and operation ~= "" then
+ local e = executers[operation]
+ if type(e) == "table" then
+ return e
+ elseif type(e) == "function" then
+ return e(var.arguments)
+ end
+ end
+end
+
+--~ entry.A = pdfdictionary {
+--~ S = pdfconstant("GoTo"),
+--~ D = ....
+--~ }
+
+local function build(levels,start,parent,method)
+ local startlevel = levels[start][1]
+ local i, n = start, 0
+ local child, entry, m, prev, first, last, f, l
+-- to be tested: i can be nil
+ while i and i <= #levels do
+ local li = levels[i]
+ local level, title, reference, open = li[1], li[2], li[3], li[4]
+ if level == startlevel then
+ if trace_bookmarks then
+ logs.report("bookmark","%3i %s%s %s",reference.realpage,rep(" ",level-1),(open and "+") or "-",title)
+ end
+ local prev = child
+ child = pdfreserveobject()
+ if entry then
+ entry.Next = child and pdfreference(child)
+ pdfflushobject(prev,entry)
+ end
+ entry = pdfdictionary {
+ Title = pdfunicode(title),
+ Parent = parent,
+ Prev = prev and pdfreference(prev),
+ }
+ if method == "internal" then
+ entry.Dest = "aut:" .. reference.internal
+ else -- if method == "page" then
+ entry.Dest = pagedest(reference.realpage)
+ end
+ if not first then first, last = child, child end
+ prev = child
+ last = prev
+ n = n + 1
+ i = i + 1
+ elseif level < startlevel then
+ pdfflushobject(child,entry)
+ return i, n, first, last
+ elseif i < #levels and level > startlevel then
+ i, m, f, l = build(levels,i,pdfreference(child),method)
+ entry.Count = (open and m) or -m
+ if m > 0 then
+ entry.First, entry.Last = pdfreference(f), pdfreference(l)
+ end
+ else
+ -- missing intermediate level but ok
+ i, m, f, l = build(levels,i,pdfreference(child),method)
+ entry.Count = (open and m) or -m
+ if m > 0 then
+ entry.First, entry.Last = pdfreference(f), pdfreference(l)
+ end
+ pdfflushobject(child,entry)
+ return i, n, first, last
+ end
+ end
+ pdfflushobject(child,entry)
+ return nil, n, first, last
+end
+
+function codeinjections.addbookmarks(levels,method)
+ local parent = pdfreserveobject()
+ local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal")
+ local dict = pdfdictionary {
+ Type = pdfconstant("Outlines"),
+ First = pdfreference(first),
+ Last = pdfreference(last),
+ Count = m,
+ }
+ pdfflushobject(parent,dict)
+ lpdf.addtocatalog("Outlines",lpdf.reference(parent))
+end
diff --git a/tex/context/base/lpdf-col.lua b/tex/context/base/lpdf-col.lua
new file mode 100644
index 000000000..18aa848ff
--- /dev/null
+++ b/tex/context/base/lpdf-col.lua
@@ -0,0 +1,150 @@
+if not modules then modules = { } end modules ['lpdf-mis'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type = type
+local format, gsub = string.format, string.gsub
+
+-- colors = colors or { }
+-- transparencies = transparencies or { }
+
+local registercolor = colors.register
+local registertransparancy = transparencies.register
+local colorsvalue = colors.value
+local transparenciesvalue = transparencies.value
+
+-- Literals needed to inject code in the mp stream, we cannot use attributes there
+-- since literals may have qQ's, much may go away once we have mplib code in place.
+--
+-- This module assumes that some functions are defined in the colors namespace
+-- which mostlikely will be loaded later.
+
+function lpdf.color(model,ca,default) -- todo: use gray when no color
+ local cv = colorsvalue(ca)
+ if cv then
+ if model == 1 then
+ model = cv[1]
+ end
+ if model == 2 then
+ local s = cv[2]
+ return format("%s g %s G",s,s)
+ elseif model == 3 then
+ local r, g, b = cv[3], cv[4], cv[5]
+ return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)
+ elseif model == 4 then
+ local c, m, y, k = cv[6],cv[7],cv[8],cv[9]
+ return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)
+ else
+ local n,f,d,p = cv[10],cv[11],cv[12],cv[13]
+ if type(p) == "string" then
+ p = gsub(p,","," ") -- brr misuse of spot
+ end
+ return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p)
+ end
+ else
+ return format("%s g %s G",default or 0,default or 0)
+ end
+end
+
+function lpdf.transparency(ct,default) -- kind of overlaps with transparencycode
+ -- beware, we need this hack because normally transparencies are not
+ -- yet registered and therefore the number is not not known ... we
+ -- might use the attribute number itself in the future
+ local ct = transparenciesvalue(ct)
+ if ct then
+ return format("/Tr%s gs",registertransparancy(nil,ct[1],ct[2],true))
+ else
+ return "/Tr0 gs"
+ end
+end
+
+function lpdf.colorvalue(model,ca,default)
+ local cv = colorsvalue(ca)
+ if cv then
+ if model == 1 then
+ model = cv[1]
+ end
+ if model == 2 then
+ return format("%s",cv[2])
+ elseif model == 3 then
+ return format("%s %s %s",cv[3],cv[4],cv[5])
+ elseif model == 4 then
+ return format("%s %s %s %s",cv[6],cv[7],cv[8],cv[9])
+ else
+ return format("%s",cv[13])
+ end
+ else
+ return format("%s",default or 0)
+ end
+end
+
+function lpdf.fdfcolor(model,ca,default)
+ local cv = colorsvalue(ca)
+ if cv then
+ if model == 1 then
+ model = cv[1]
+ end
+ if model == 2 then
+ return format("[%s]",cv[2])
+ elseif model == 3 then
+ return format("[%s %s %s]",cv[3],cv[4],cv[5])
+ elseif model == 4 then
+ return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9])
+ elseif model == 4 then
+ return format("[%s]",cv[13])
+ end
+ else
+ return format("[%s]",default or 0)
+ end
+end
+
+function lpdf.colorspace(model,ca)
+ local cv = colorsvalue(ca)
+ if cv then
+ if model == 1 then
+ model = cv[1]
+ end
+ if model == 2 then
+ return "DeviceGray"
+ elseif model == 3 then
+ return "DeviceRGB"
+ elseif model == 4 then
+ return "DeviceCMYK"
+ end
+ end
+ return "DeviceGRAY"
+end
+
+-- by registering we getconversion for free (ok, at the cost of overhead)
+
+local intransparency = false
+local pdfcolor = lpdf.color
+
+function lpdf.rgbcode(model,r,g,b)
+ return pdfcolor(model,registercolor(nil,'rgb',r,g,b))
+end
+function lpdf.cmykcode(model,c,m,y,k)
+ return pdfcolor(model,registercolor(nil,'cmyk',c,m,y,k))
+end
+function lpdf.graycode(model,s)
+ return pdfcolor(model,registercolor(nil,'gray',s))
+end
+function lpdf.spotcode(model,n,f,d,p)
+ return pdfcolor(model,registercolor(nil,'spot',n,f,d,p)) -- incorrect
+end
+function lpdf.transparencycode(a,t)
+ intransparency = true
+ return format("/Tr%s gs",registertransparancy(nil,a,t,true)) -- true forces resource
+end
+function lpdf.finishtransparencycode()
+ if intransparency then
+ intransparency = false
+ return "/Tr0 gs" -- we happen to know this -)
+ else
+ return ""
+ end
+end
diff --git a/tex/context/base/lpdf-fld.lua b/tex/context/base/lpdf-fld.lua
new file mode 100644
index 000000000..c034aec6c
--- /dev/null
+++ b/tex/context/base/lpdf-fld.lua
@@ -0,0 +1,885 @@
+if not modules then modules = { } end modules ['lpdf-fld'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- cleaned up, e.g. no longer older viewers
+-- always kids so no longer explicit main / clone / copy
+-- some optimizations removed (will come bakc if needed)
+
+local gmatch, lower, format = string.gmatch, string.lower, string.format
+local lpegmatch = lpeg.match
+
+local trace_fields = false trackers.register("widgets.fields", function(v) trace_fields = v end)
+
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+local variables = interfaces.variables
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+local registeredsymbol = codeinjections.registeredsymbol
+
+local pdfstream = lpdf.stream
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfstring = lpdf.string
+local pdfconstant = lpdf.constant
+local pdftoeight = lpdf.toeight
+local pdfflushobject = lpdf.flushobject
+local pdfreserveobject = lpdf.reserveobject
+local pdfannotation = nodes.pdfannotation
+
+local submitoutputformat = 0 -- 0=unknown 1=HTML 2=FDF 3=XML => not yet used, needs to be checked
+
+local splitter = lpeg.splitat("=>")
+
+local formats = {
+ html = 1, fdf = 2, xml = 3,
+}
+
+function codeinjections.setformsmethod(name)
+ submitoutputformat = formats[lower(name)] or 3
+end
+
+local flag = {
+ MultiLine = 4096, -- 13
+ NoToggleToOff = 16384, -- 15
+ Radio = 32768, -- 16
+ PushButton = 65536, -- 17
+ PopUp = 131072, -- 18
+ Edit = 262144, -- 19
+ RadiosInUnison = 33554432, -- 26
+ DoNotSpellCheck = 4194304, -- 23
+ DoNotScroll = 8388608, -- 24
+ ReadOnly = 1, -- 1
+ Required = 2, -- 2
+ NoExport = 4, -- 3
+ Password = 8192, -- 14
+ Sort = 524288, -- 20
+ FileSelect = 1048576, -- 21
+}
+
+local plus = {
+ Invisible = 1, -- 1
+ Hidden = 2, -- 2
+ Printable = 4, -- 3
+ NoView = 32, -- 6
+ ToggleNoView = 256, -- 9
+ AutoView = 256, -- 288 (6+9)
+}
+
+-- todo: check what is interfaced
+
+flag.readonly = flag.ReadOnly
+flag.required = flag.Required
+flag.protected = flag.Password
+flag.sorted = flag.Sort
+flag.unavailable = flag.NoExport
+flag.nocheck = flag.DoNotSpellCheck
+flag.fixed = flag.DoNotScroll
+flag.file = flag.FileSelect
+
+plus.hidden = plus.Hidden
+plus.printable = plus.Printable
+plus.auto = plus.AutoView
+
+-- some day .. lpeg with function or table
+
+local function fieldflag(specification)
+ local o, n = specification.options, 0
+ if o and o ~= "" then
+ for f in gmatch(o,"[^, ]+") do
+ n = n + (flag[f] or 0)
+ end
+ end
+ return n
+end
+
+local function fieldplus(specification)
+ local o, n = specification.options, 0
+ if o and o ~= "" then
+ for p in gmatch(o,"[^, ]+") do
+ n = n + (plus[p] or 0)
+ end
+ end
+ return n
+end
+
+
+local function checked(what)
+ if what and what ~= "" then
+ local set, bug = jobreferences.identify("",what)
+ return not bug and #set > 0 and lpdf.pdfaction(set)
+ end
+end
+
+local function fieldactions(specification) -- share actions
+--~ print(table.serialize(specification))
+ local d, a = { }, nil
+ a = specification.mousedown if a and a ~= "" then d.D = checked(a) end
+ a = specification.mouseup if a and a ~= "" then d.U = checked(a) end
+ a = specification.regionin if a and a ~= "" then d.E = checked(a) end -- Enter
+ a = specification.regionout if a and a ~= "" then d.X = checked(a) end -- eXit
+ a = specification.afterkeystroke if a and a ~= "" then d.K = checked(a) end
+ a = specification.formatresult if a and a ~= "" then d.F = checked(a) end
+ a = specification.validateresult if a and a ~= "" then d.V = checked(a) end
+ a = specification.calculatewhatever if a and a ~= "" then d.C = checked(a) end
+ a = specification.focusin if a and a ~= "" then d.Fo = checked(a) end
+ a = specification.focusout if a and a ~= "" then d.Bl = checked(a) end
+ -- a = specification.openpage if a and a ~= "" then d.PO = checked(a) end
+ -- a = specification.closepage if a and a ~= "" then d.PC = checked(a) end
+ -- a = specification.visiblepage if a and a ~= "" then d.PV = checked(a) end
+ -- a = specification.invisiblepage if a and a ~= "" then d.PI = checked(a) end
+ return next(d) and pdfdictionary(d)
+end
+
+-- fonts and color
+
+local fontnames = {
+ rm = {
+ tf = "Times-Roman",
+ bf = "Times-Bold",
+ it = "Times-Italic",
+ sl = "Times-Italic",
+ bi = "Times-BoldItalic",
+ bs = "Times-BoldItalic",
+ },
+ ss = {
+ tf = "Helvetica",
+ bf = "Helvetica-Bold",
+ it = "Helvetica-Oblique",
+ sl = "Helvetica-Oblique",
+ bi = "Helvetica-BoldOblique",
+ bs = "Helvetica-BoldOblique",
+ },
+ tt = {
+ tf = "Courier",
+ bf = "Courier-Bold",
+ it = "Courier-Oblique",
+ sl = "Courier-Oblique",
+ bi = "Courier-BoldOblique",
+ bs = "Courier-BoldOblique",
+ }
+}
+
+local usedfonts = { }
+
+local function fieldsurrounding(specification)
+ local size = specification.fontsize or "12pt"
+ local style = specification.fontstyle or "rm"
+ local alternative = specification.fontalternative or "tf"
+ local s = fontnames[style]
+ if not s then
+ style, s = "rm", fontnames.rm
+ end
+ local a = s[alternative]
+ if not a then
+ alternative, a = "tf", s.tf
+ end
+ local tag = style .. alternative
+ size = string.todimen(size)
+ local stream = pdfstream {
+ pdfconstant(tag),
+ format("%0.4f Tf",(size and (number.dimenfactors.bp * size)) or 12),
+ }
+ usedfonts[tag] = a -- the name
+ -- add color to stream: 0 g
+ -- move up with "x.y Ts"
+ return tostring(stream)
+end
+
+local function registerfonts()
+ if next(usedfonts) then
+ local d = pdfdictionary()
+ for tag, name in next, usedfonts do
+ local f = pdfdictionary {
+ Type = pdfconstant("Font"),
+ Subtype = pdfconstant("Type1"), -- todo
+ Name = pdfconstant(tag),
+ BaseFont = pdfconstant(name),
+ }
+ d[tag] = pdfreference(pdfflushobject(f))
+ end
+ return d
+ end
+end
+
+-- cache
+
+local function fieldattributes(specification)
+--~ return pdfarray {
+--~ -- BG = -- backgroundcolor
+--~ -- BC = -- framecolor
+--~ }
+ return nil
+end
+
+-- symbols
+
+local function fieldappearances(specification)
+ -- todo: caching
+ local values = specification.values
+ local default = specification.default -- todo
+ if not values then
+ -- error
+ return
+ end
+ local v = aux.settings_to_array(values)
+ local n, r, d
+ if #v == 1 then
+ n, r, d = v[1], v[1], v[1]
+ elseif #v == 2 then
+ n, r, d = v[1], v[1], v[2]
+ else
+ n, r, d = v[1], v[2], v[3]
+ end
+ local appearance = pdfdictionary { -- cache this one
+ N = registeredsymbol(n), R = registeredsymbol(r), D = registeredsymbol(d),
+ }
+ return lpdf.sharedobj(tostring(appearance))
+end
+
+local function fieldstates(specification,forceyes,values,default)
+ -- we don't use Opt here (too messy for radio buttons)
+ local values, default = values or specification.values, default or specification.default
+ if not values then
+ -- error
+ return
+ end
+ local v = aux.settings_to_array(values)
+ local yes, off
+ if #v == 1 then
+ yes, off = v[1], v[1]
+ else
+ yes, off = v[1], v[2]
+ end
+ local yesshown, yesvalue = lpegmatch(splitter,yes)
+ if not (yesshown and yesvalue) then
+ yesshown = yes, yes
+ end
+ yes = aux.settings_to_array(yesshown)
+ local offshown, offvalue = lpegmatch(splitter,off)
+ if not (offshown and offvalue) then
+ offshown = off, off
+ end
+ off = aux.settings_to_array(offshown)
+ if #yes == 1 then
+ yesn, yesr, yesd = yes[1], yes[1], yes[1]
+ elseif #yes == 2 then
+ yesn, yesr, yesd = yes[1], yes[1], yes[2]
+ else
+ yesn, yesr, yesd = yes[1], yes[2], yes[3]
+ end
+ if #off == 1 then
+ offn, offr, offd = off[1], off[1], off[1]
+ elseif #off == 2 then
+ offn, offr, offd = off[1], off[1], off[2]
+ else
+ offn, offr, offd = off[1], off[2], off[3]
+ end
+ if not yesvalue then
+ yesvalue = yesn
+ end
+ if not offvalue then
+ offvalue = offn
+ end
+ if forceyes == true then
+ forceyes = forceyes and "On" -- spec likes Yes more but we've used On for ages now
+ else
+ -- false or string
+ end
+ if default == yesn then
+ default = pdfconstant(forceyes or yesn)
+ else
+ default = pdfconstant("Off")
+ end
+ local appearance = pdfdictionary { -- maybe also cache components
+ N = pdfdictionary { [forceyes or yesn] = registeredsymbol(yesn), Off = registeredsymbol(offn) },
+ R = pdfdictionary { [forceyes or yesr] = registeredsymbol(yesr), Off = registeredsymbol(offr) },
+ D = pdfdictionary { [forceyes or yesd] = registeredsymbol(yesd), Off = registeredsymbol(offd) }
+ }
+ local appearanceref = lpdf.sharedobj(tostring(appearance))
+ return appearanceref, default
+end
+
+local function fieldoptions(specification)
+ local values = specification.values
+ local default = specification.default
+ if values then
+ local v = aux.settings_to_array(values)
+ for i=1,#v do
+ local vi = v[i]
+ local shown, value = lpegmatch(splitter,vi)
+ if shown and value then
+ v[i] = pdfarray { pdfunicode(value), shown }
+ else
+ v[i] = pdfunicode(v[i])
+ end
+ end
+ return pdfarray(v)
+ end
+end
+
+local function radiodefault(parent,field,forceyes)
+ local default, values = parent.default, parent.values
+ if not default or default == "" then
+ values = aux.settings_to_array(values)
+ default = values[1]
+ end
+ local name = field.name
+ local fieldvalues = aux.settings_to_array(field.values)
+ local yes, off = fieldvalues[1], fieldvalues[2] or fieldvalues[1]
+ if not default then
+ return pdfconstant((forceyes and "On") or yes)
+ elseif default == name then
+ return pdfconstant((forceyes and "On") or default)
+ else
+ return pdfconstant("Off")
+ end
+end
+
+-- layers
+
+local function fieldlayer(specification) -- we can move this in line
+ local layer = specification.layer
+ return (layer and lpdf.layerreferences[layer]) or nil
+end
+
+-- defining
+
+local fields, radios, clones, fieldsets, calculationset = { }, { }, { }, { }, nil
+
+function codeinjections.definefieldset(tag,list)
+ fieldsets[tag] = list
+end
+
+function codeinjections.getfieldset(tag)
+ return fieldsets[tag]
+end
+
+local function fieldsetlist(tag)
+ if tag then
+ local ft = fieldsets[tag]
+ if ft then
+ local a = pdfarray()
+ for name in gmatch(list,"[^, ]+") do
+ local f = field[name]
+ if f and f.pobj then
+ a[#a+1] = pdfreference(f.pobj)
+ end
+ end
+ return a
+ end
+ end
+end
+
+function codeinjections.setfieldcalculationset(tag)
+ calculationset = tag
+end
+
+local function predefinesymbols(specification)
+ local values = specification.values
+ if values then
+ local symbols = aux.settings_to_array(values)
+ for i=1,#symbols do
+ local symbol = symbols[i]
+ local a, b = lpegmatch(splitter,symbol)
+ codeinjections.presetsymbol(a or symbol)
+ end
+ end
+end
+
+function codeinjections.getdefaultfieldvalue(name)
+ local f = fields[name]
+ if f then
+ local values = f.values
+ local default = f.default
+ if not default or default == "" then
+ local symbols = aux.settings_to_array(values)
+ local symbol = symbols[1]
+ if symbol then
+ local a, b = lpegmatch(splitter,symbol) -- splits at =>
+ default = a or symbol
+ end
+ end
+ if default then
+ tex.sprint(ctxcatcodes,default)
+ end
+ end
+end
+
+function codeinjections.definefield(specification)
+ local n = specification.name
+ local f = fields[n]
+ if not f then
+ local kind = specification.kind
+ if not kind then
+ if trace_fields then
+ logs.report("fields","invalid definition of '%s': unknown type",n)
+ end
+ elseif kind == "radio" then
+ local values = specification.values
+ if values and values ~= "" then
+ values = aux.settings_to_array(values)
+ for v=1,#values do
+ radios[values[v]] = { parent = n }
+ end
+ fields[n] = specification
+ if trace_fields then
+ logs.report("fields","defining '%s' as radio",n or "?")
+ end
+ elseif trace_fields then
+ logs.report("fields","invalid definition of radio '%s': missing values",n)
+ end
+ elseif kind == "sub" then
+ -- not in main field list !
+ local radio = radios[n]
+ if radio then
+ -- merge specification
+ for key, value in next, specification do
+ radio[key] = value
+ end
+ if trace_fields then
+ local p = radios[n] and radios[n].parent
+ logs.report("fields","defining '%s' as sub of radio '%s'",n or "?",p or "?")
+ end
+ elseif trace_fields then
+ logs.report("fields","invalid definition of radio sub '%s': no parent",n)
+ end
+ predefinesymbols(specification)
+ elseif kind == "text" or kind == "line" then
+ fields[n] = specification
+ if trace_fields then
+ logs.report("fields","defining '%s' as %s",n,kind)
+ end
+ if specification.values ~= "" and specification.default == "" then
+ specification.default, specification.values = specification.values, nil
+ end
+ else
+ fields[n] = specification
+ if trace_fields then
+ logs.report("fields","defining '%s' as %s",n,kind)
+ end
+ predefinesymbols(specification)
+ end
+ elseif trace_fields then
+ logs.report("fields","invalid definition of '%s': already defined",n)
+ end
+end
+
+function codeinjections.clonefield(specification)
+ local p, c, v = specification.parent, specification.children, specification.variant
+ if not p or not c then
+ if trace_fields then
+ logs.report("fields","invalid clone: children: '%s', parent '%s', variant: '%s'",p or "?",c or "?", v or "?")
+ end
+ else
+ for n in gmatch(c,"[^, ]+") do
+ local f, r, c, x = fields[n], radios[n], clones[n], fields[p]
+ if f or r or c then
+ if trace_fields then
+ logs.report("fields","already cloned: child: '%s', parent '%s', variant: '%s'",p or "?",n or "?", v or "?")
+ end
+ elseif x then
+ if trace_fields then
+ logs.report("fields","invalid clone: child: '%s', variant: '%s', no parent",n or "?", v or "?")
+ end
+ else
+ if trace_fields then
+ logs.report("fields","cloning: child: '%s', parent '%s', variant: '%s'",p or "?",n or "?", v or "?")
+ end
+ clones[n] = specification
+ predefinesymbols(specification)
+ end
+ end
+ end
+end
+
+function codeinjections.getfieldgroup(name)
+ local f = fields[name] or radios[name] or clones[name]
+ local g = f and f.group
+ if not g or g == "" then
+ local v, p, k = f.variant, f.parent, f.kind
+ if v == "clone" or v == "copy" then
+ f = fields[p] or radios[p]
+ g = f and f.group
+ elseif k == "sub" then
+ f = fields[p]
+ g = f and f.group
+ end
+ end
+ if g then
+ texsprint(ctxcatcodes,g)
+ end
+end
+
+--
+
+function codeinjections.doiffieldset(tag)
+ commands.testcase(fieldsets[tag])
+end
+
+function codeinjections.doiffieldelse(name)
+ commands.testcase(fields[name])
+end
+
+--
+
+local alignments = {
+ flushleft = 0, right = 0,
+ center = 1, middle = 1,
+ flushright = 2, left = 2,
+}
+
+local function fieldalignment(specification)
+ return alignments[specification.align] or 0
+end
+
+local function enhance(specification,option)
+ local so = specification.options
+ if so and so ~= "" then
+ specification.options = so .. "," .. option
+ else
+ specification.options = option
+ end
+ return specification
+end
+
+-- finish
+
+local collected = pdfarray()
+
+local function finishfields()
+ for name, field in next, fields do
+ local kids = field.kids
+ if kids then
+ pdfflushobject(field.kobj,kids)
+ end
+ local pobj = field.pobj
+ end
+ for name, field in next, radios do
+ local kids = field.kids
+ if kids then
+ pdfflushobject(field.kobj,kids)
+ end
+ end
+ if #collected > 0 then
+ usedfonts.tttf = fontnames.tt.tf
+ local acroform = pdfdictionary {
+ NeedAppearances = true,
+ Fields = pdfreference(pdfflushobject(collected)),
+ DR = pdfdictionary { Font = registerfonts() },
+ CO = fieldsetlist(calculationset),
+ DA = "/tttf 12 Tf 0 g",
+ }
+ lpdf.addtocatalog("AcroForm",pdfreference(pdfflushobject(acroform)))
+ end
+end
+
+lpdf.registerdocumentfinalizer(finishfields)
+
+local pdf_widget = pdfconstant("Widget")
+local pdf_tx = pdfconstant("Tx")
+local pdf_ch = pdfconstant("Ch")
+local pdf_btn = pdfconstant("Btn")
+local pdf_yes = pdfconstant("Yes")
+local pdf_p = pdfconstant("P") -- None Invert Outline Push
+local pdf_n = pdfconstant("N") -- None Invert Outline Push
+--
+local pdf_no_rect = pdfarray { 0, 0, 0, 0 }
+
+local methods = { }
+
+function codeinjections.typesetfield(name,specification)
+ local field = fields[name] or radios[name] or clones[name]
+ if not field then
+ logs.report("fields", "unknown child '%s'",name)
+ -- unknown field
+ return
+ end
+ local variant, parent = field.variant, field.parent
+ if variant == "copy" or variant == "clone" then -- only in clones
+ field = fields[parent] or radios[parent]
+ end
+ local method = methods[field.kind]
+ if method then
+ method(name,specification,variant)
+ else
+ logs.report("fields", "unknown method '%s' for child '%s'",field.kind,name)
+ end
+end
+
+-- can be optional multipass optimization (share objects)
+
+local function save_parent(field,specification,d)
+ local kn = pdfreserveobject()
+ d.Kids = pdfreference(kn)
+ field.kobj = kn
+ field.kids = pdfarray()
+ local pn = pdfflushobject(d)
+ field.pobj = pn
+ collected[#collected+1] = pdfreference(pn)
+end
+
+local function save_kid(field,specification,d)
+ local kn = pdfreserveobject()
+ field.kids[#field.kids+1] = pdfreference(kn)
+ node.write(pdfannotation(specification.width,specification.height,0,d(),kn))
+end
+
+function methods.line(name,specification,variant,extras)
+ local field = fields[name]
+ if variant == "copy" or variant == "clone" then
+ logs.report("fields","todo: clones of text fields")
+ end
+ local kind = field.kind
+ if not field.pobj then
+ if trace_fields then
+ logs.report("fields","using parent text '%s'",name)
+ end
+ if extras then
+ enhance(specification,extras)
+ end
+ local text = pdfunicode(field.default)
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ MK = fieldsurrounding(specification), -- needed ?
+ DA = fieldsurrounding(specification),
+ AA = fieldactions(specification),
+ FT = pdf_tx,
+ Q = fieldalignment(specification),
+ MaxLen = (specification.length == 0 and 1000) or specification.length,
+ DV = text,
+ V = text,
+ }
+ save_parent(field,specification,d)
+ field.specification = specification
+ end
+ specification = field.specification or { } -- todo: radio spec
+ if trace_fields then
+ logs.report("fields","using child text '%s'",name)
+ end
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ Parent = pdfreference(field.pobj),
+ F = fieldplus(specification),
+ DA = fieldattributes(specification),
+ OC = fieldlayer(specification),
+ MK = fieldsurrounding(specification),
+ DA = fieldsurrounding(specification),
+ AA = fieldactions(specification),
+ Q = fieldalignment(specification),
+ }
+ save_kid(field,specification,d)
+end
+
+function methods.text(name,specification,variant)
+ methods.line(name,specification,variant,"MultiLine")
+end
+
+function methods.choice(name,specification,variant,extras)
+ local field = fields[name]
+ if variant == "copy" or variant == "clone" then
+ logs.report("fields","todo: clones of choice fields")
+ end
+ local kind = field.kind
+ local d
+ if not field.pobj then
+ if trace_fields then
+ logs.report("fields","using parent choice '%s'",name)
+ end
+ if extras then
+ enhance(specification,extras)
+ end
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ FT = pdf_ch,
+ Opt = fieldoptions(field),
+ }
+ save_parent(field,specification,d)
+ field.specification = specification
+ end
+ specification = field.specification or { }
+ if trace_fields then
+ logs.report("fields","using child choice '%s'",name)
+ end
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ Parent = pdfreference(field.pobj),
+ F = fieldplus(specification),
+ DA = fieldattributes(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ }
+ save_kid(field,specification,d)
+end
+
+function methods.popup(name,specification,variant)
+ methods.choice(name,specification,variant,"PopUp")
+end
+function methods.combo(name,specification,variant)
+ methods.choice(name,specification,variant,"PopUp,Edit")
+end
+
+-- Probably no default appearance needed for first kid and no javascripts for the
+-- parent ... I will look into it when I have to make a complex document.
+
+function methods.check(name,specification,variant)
+ -- no /Opt because (1) it's messy - see pdf spec, (2) it discouples kids and
+ -- contrary to radio there is no way to associate then
+ local field = fields[name]
+ if variant == "copy" or variant == "clone" then
+ logs.report("fields","todo: clones of check fields")
+ end
+ local kind = field.kind
+ local appearance, default = fieldstates(field,true)
+ if not field.pobj then
+ if trace_fields then
+ logs.report("fields","using parent check '%s'",name)
+ end
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ FT = pdf_btn,
+ DV = default,
+ V = default,
+ AS = default,
+ AP = appearance,
+ H = pdf_n,
+ }
+ save_parent(field,specification,d)
+ field.specification = specification
+ end
+ specification = field.specification or { } -- todo: radio spec
+ if trace_fields then
+ logs.report("fields","using child check '%s'",name)
+ end
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ Parent = pdfreference(field.pobj),
+ F = fieldplus(specification),
+ DA = fieldattributes(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ DV = default,
+ V = default,
+ AS = default,
+ AP = appearance,
+ H = pdf_n,
+ }
+ save_kid(field,specification,d)
+end
+
+function methods.push(name,specification,variant)
+ local field = fields[name]
+ if variant == "copy" or variant == "clone" then
+ logs.report("fields","todo: clones of push fields")
+ end
+ local kind = field.kind
+ if not field.pobj then
+ if trace_fields then
+ logs.report("fields","using parent push '%s'",name)
+ end
+ enhance(specification,"PushButton")
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ FT = pdf_btn,
+ AP = fieldappearances(field),
+ H = pdf_p,
+ }
+ save_parent(field,specification,d)
+ field.specification = specification
+ end
+ specification = field.specification or { } -- todo: radio spec
+ if trace_fields then
+ logs.report("fields","using child push '%s'",name)
+ end
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ Parent = pdfreference(field.pobj),
+ F = fieldplus(specification),
+ DA = fieldattributes(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ AP = fieldappearances(field),
+ H = pdf_p,
+ }
+ save_kid(field,specification,d)
+end
+
+function methods.sub(name,specification,variant)
+ local field = radios[name] or fields[name] or clones[name] -- fields in case of a clone, maybe use dedicated clones
+ local values
+ if variant == "copy" or variant == "clone" then
+ name = field.parent
+ values = field.values -- clone only, copy has nil so same as parent
+ field = radios[name]
+ else
+ values = field.values
+ end
+ local parent = fields[field.parent]
+ if not parent then
+ return
+ end
+ local appearance = fieldstates(field,name,values) -- we need to force the 'On' name
+ local default = radiodefault(parent,field)
+ if not parent.pobj then
+ if trace_fields then
+ logs.report("fields","using parent '%s' of radio '%s' with values '%s' and default '%s'",parent.name,name,parent.values or "?",parent.default or "?")
+ end
+ local specification = parent.specification or { }
+ -- enhance(specification,"Radio,RadiosInUnison")
+ enhance(specification,"RadiosInUnison") -- maybe also PushButton as acrobat does
+ local d = pdfdictionary {
+ T = parent.name,
+ FT = pdf_btn,
+ Rect = pdf_no_rect,
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ H = pdf_n,
+ V = default,
+ }
+ save_parent(parent,specification,d)
+ end
+ if trace_fields then
+ logs.report("fields","using child radio '%s' with values '%s'",name,values or "?")
+ end
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ Parent = pdfreference(parent.pobj),
+ F = fieldplus(specification),
+ DA = fieldattributes(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ AS = default,
+ AP = appearance,
+ H = pdf_n,
+ }
+ save_kid(parent,specification,d)
+end
diff --git a/tex/context/base/lpdf-grp.lua b/tex/context/base/lpdf-grp.lua
new file mode 100644
index 000000000..ad01e4d4f
--- /dev/null
+++ b/tex/context/base/lpdf-grp.lua
@@ -0,0 +1,68 @@
+if not modules then modules = { } end modules ['lpdf-grp'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfconstant = lpdf.constant
+local pdfreference = lpdf.reference
+local pdfflushobject = lpdf.flushobject
+
+local function shade(stype,name,domain,color_a,color_b,n,colorspace,coordinates)
+ local f = pdfdictionary {
+ FunctionType = 2,
+ Domain = pdfarray(domain), -- domain is actually a string
+ C0 = pdfarray(color_a),
+ C1 = pdfarray(color_b),
+ N = tonumber(n),
+ }
+ local s = pdfdictionary {
+ ShadingType = stype,
+ ColorSpace = pdfconstant(colorspace),
+ Function = pdfreference(pdfflushobject(f)),
+ Coords = pdfarray(coordinates),
+ Extend = pdfarray { true, true },
+ }
+ lpdf.adddocumentshade(name,pdfreference(pdfflushobject(s)))
+end
+
+function lpdf.circularshade(name,domain,color_a,color_b,n,colorspace,coordinates)
+ shade(3,name,domain,color_a,color_b,n,colorspace,coordinates)
+end
+
+function lpdf.linearshade(name,domain,color_a,color_b,n,colorspace,coordinates)
+ shade(2,name,domain,color_a,color_b,n,colorspace,coordinates)
+end
+
+function lpdf.colorspec(model,ca,default)
+ if ca and ca > 0 then
+ local cv = colors.value(ca)
+ if cv then
+ if model == 1 then
+ model = cv[1]
+ end
+ if model == 2 then
+ return pdfarray { cv[2] }
+ elseif model == 3 then
+ return pdfarray { cv[3],cv[4],cv[5] }
+ elseif model == 4 then
+ return pdfarray { cv[6],cv[7],cv[8],cv[9] }
+ elseif model == 5 then
+ return pdfarray { cv[13] }
+ end
+ end
+ end
+ if default then
+ return default
+ end
+end
diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua
new file mode 100644
index 000000000..e0ffd4052
--- /dev/null
+++ b/tex/context/base/lpdf-ini.lua
@@ -0,0 +1,670 @@
+if not modules then modules = { } end modules ['lpdf-ini'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setmetatable, getmetatable, type, next, tostring, tonumber, rawset
+local char, byte, format, gsub, concat, match, sub, gmatch = string.char, string.byte, string.format, string.gsub, table.concat, string.match, string.sub, string.gmatch
+local utfvalues = string.utfvalues
+local texwrite, texset, texsprint, ctxcatcodes = tex.write, tex.set, tex.sprint, tex.ctxcatcodes
+local sind, cosd = math.sind, math.cosd
+local lpegmatch = lpeg.match
+
+local pdfreserveobj = pdf and pdf.reserveobj or function() return 1 end -- for testing
+local pdfimmediateobj = pdf and pdf.immediateobj or function() return 2 end -- for testing
+
+local trace_finalizers = false trackers.register("backend.finalizers", function(v) trace_finalizers = v end)
+local trace_resources = false trackers.register("backend.resources", function(v) trace_resources = v end)
+local trace_objects = false trackers.register("backend.objects", function(v) trace_objects = v end)
+local trace_detail = false trackers.register("backend.detail", function(v) trace_detail = v end)
+
+lpdf = lpdf or { }
+
+local function tosixteen(str)
+ if not str or str == "" then
+ return "()"
+ else
+ local r = { "<feff" }
+ for b in utfvalues(str) do
+ if b < 0x10000 then
+ r[#r+1] = format("%04x",b)
+ else
+ r[#r+1] = format("%04x%04x",b/1024+0xD800,b%1024+0xDC00)
+ end
+ end
+ r[#r+1] = ">"
+ return concat(r)
+ end
+end
+
+lpdf.tosixteen = tosixteen
+
+-- lpeg is some 5 times faster than gsub (in test) on escaping
+
+-- local escapes = {
+-- ["\\"] = "\\\\",
+-- ["/"] = "\\/", ["#"] = "\\#",
+-- ["<"] = "\\<", [">"] = "\\>",
+-- ["["] = "\\[", ["]"] = "\\]",
+-- ["("] = "\\(", [")"] = "\\)",
+-- }
+--
+-- local escaped = lpeg.Cs(lpeg.Cc("(") * (lpeg.S("\\/#<>[]()")/escapes + lpeg.P(1))^0 * lpeg.Cc(")"))
+--
+-- local function toeight(str)
+-- if not str or str == "" then
+-- return "()"
+-- else
+-- return lpegmatch(escaped,str)
+-- end
+-- end
+--
+-- -- no need for escaping .. just use unicode instead
+
+-- \0 \t \n \r \f <space> ( ) [ ] { } / %
+
+local function toeight(str)
+ return "(" .. str .. ")"
+end
+
+lpdf.toeight = toeight
+
+--~ local escaped = lpeg.Cs((lpeg.S("\0\t\n\r\f ()[]{}/%")/"#" + lpeg.P(1))^0)
+--~
+--~ local function cleaned(str)
+--~ return (str and str ~= "" and lpegmatch(escaped,str)) or ""
+--~ end
+--~
+--~ lpdf.cleaned = cleaned -- not public yet
+
+local function merge_t(a,b)
+ local t = { }
+ for k,v in next, a do t[k] = v end
+ for k,v in next, b do t[k] = v end
+ return setmetatable(t,getmetatable(a))
+end
+
+local tostring_a, tostring_d
+
+tostring_d = function(t,contentonly,key)
+ if not next(t) then
+ if contentonly then
+ return ""
+ else
+ return "<< >>"
+ end
+ else
+ local r = { }
+ for k, v in next, t do
+ local tv = type(v)
+ if tv == "string" then
+ r[#r+1] = format("/%s %s",k,toeight(v))
+ elseif tv == "unicode" then
+ r[#r+1] = format("/%s %s",k,tosixteen(v))
+ elseif tv == "table" then
+ local mv = getmetatable(v)
+ if mv and mv.__lpdftype then
+ r[#r+1] = format("/%s %s",k,tostring(v))
+ elseif v[1] then
+ r[#r+1] = format("/%s %s",k,tostring_a(v))
+ else
+ r[#r+1] = format("/%s %s",k,tostring_d(v))
+ end
+ else
+ r[#r+1] = format("/%s %s",k,tostring(v))
+ end
+ end
+ if contentonly then
+ return concat(r, " ")
+ elseif key then
+ return format("/%s << %s >>", key, concat(r, " "))
+ else
+ return format("<< %s >>", concat(r, " "))
+ end
+ end
+end
+
+tostring_a = function(t,contentonly,key)
+ if #t == 0 then
+ if contentonly then
+ return ""
+ else
+ return "[ ]"
+ end
+ else
+ local r = { }
+ for k, v in next, t do
+ local tv = type(v)
+ if tv == "string" then
+ r[#r+1] = toeight(v)
+ elseif tv == "unicode" then
+ r[#r+1] = tosixteen(v)
+ elseif tv == "table" then
+ local mv = getmetatable(v)
+ local mt = mv and mv.__lpdftype
+ if mt then
+ r[#r+1] = tostring(v)
+ elseif v[1] then
+ r[#r+1] = tostring_a(v)
+ else
+ r[#r+1] = tostring_d(v)
+ end
+ else
+ r[#r+1] = tostring(v)
+ end
+ end
+ if contentonly then
+ return concat(r, " ")
+ elseif key then
+ return format("/%s [ %s ]", key, concat(r, " "))
+ else
+ return format("[ %s ]", concat(r, " "))
+ end
+ end
+end
+
+local tostring_x = function(t) return concat(t, " ") end
+local tostring_s = function(t) return toeight(t[1]) end
+local tostring_u = function(t) return tosixteen(t[1]) end
+local tostring_n = function(t) return tostring(t[1]) end -- tostring not needed
+local tostring_c = function(t) return t[1] end -- already prefixed (hashed)
+local tostring_z = function() return "null" end
+local tostring_t = function() return "true" end
+local tostring_f = function() return "false" end
+local tostring_r = function(t) return t[1] .. " 0 R" end
+
+local tostring_v = function(t)
+ local s = t[1]
+ if type(s) == "table" then
+ return concat(s,"")
+ else
+ return s
+ end
+end
+
+local function value_x(t) return t end -- the call is experimental
+local function value_s(t,key) return t[1] end -- the call is experimental
+local function value_u(t,key) return t[1] end -- the call is experimental
+local function value_n(t,key) return t[1] end -- the call is experimental
+local function value_c(t) return sub(t[1],2) end -- the call is experimental
+local function value_d(t) return tostring_d(t,true,key) end -- the call is experimental
+local function value_a(t) return tostring_a(t,true,key) end -- the call is experimental
+local function value_z() return nil end -- the call is experimental
+local function value_t(t) return t.value or true end -- the call is experimental
+local function value_f(t) return t.value or false end -- the call is experimental
+local function value_r() return t[1] end -- the call is experimental
+local function value_v() return t[1] end -- the call is experimental
+
+local function add_x(t,k,v) rawset(t,k,tostring(v)) end
+
+local mt_x = { __lpdftype = "stream", __tostring = tostring_x, __call = value_x, __newindex = add_x }
+local mt_d = { __lpdftype = "dictionary", __tostring = tostring_d, __call = value_d }
+local mt_a = { __lpdftype = "array", __tostring = tostring_a, __call = value_a }
+local mt_u = { __lpdftype = "unicode", __tostring = tostring_u, __call = value_u }
+local mt_s = { __lpdftype = "string", __tostring = tostring_s, __call = value_s }
+local mt_n = { __lpdftype = "number", __tostring = tostring_n, __call = value_n }
+local mt_c = { __lpdftype = "constant", __tostring = tostring_c, __call = value_c }
+local mt_z = { __lpdftype = "null", __tostring = tostring_z, __call = value_z }
+local mt_t = { __lpdftype = "true", __tostring = tostring_t, __call = value_t }
+local mt_f = { __lpdftype = "false", __tostring = tostring_f, __call = value_f }
+local mt_r = { __lpdftype = "reference", __tostring = tostring_r, __call = value_r }
+local mt_v = { __lpdftype = "verbose", __tostring = tostring_v, __call = value_v }
+
+local function pdfstream(t) -- we need to add attrbutes
+ if t then
+ for i=1,#t do
+ t[i] = tostring(t[i])
+ end
+ end
+ return setmetatable(t or { },mt_x)
+end
+
+local function pdfdictionary(t)
+ return setmetatable(t or { },mt_d)
+end
+
+local function pdfarray(t)
+ if type(t) == "string" then
+ return setmetatable({ t },mt_a)
+ else
+ return setmetatable(t or { },mt_a)
+ end
+end
+
+local function pdfstring(str,default)
+ return setmetatable({ str or default or "" },mt_s)
+end
+
+local function pdfunicode(str,default)
+ return setmetatable({ str or default or "" },mt_u)
+end
+
+local cache = { } -- can be weak
+
+local function pdfnumber(n,default) -- 0-10
+ n = n or default
+ local c = cache[n]
+ if not c then
+ c = setmetatable({ n },mt_n)
+ -- cache[n] = c -- too many numbers
+ end
+ return c
+end
+
+for i=-1,9 do cache[i] = pdfnumber(i) end
+
+local cache = { } -- can be weak
+
+local forbidden, replacements = "\0\t\n\r\f ()[]{}/%%#\\", { } -- table faster than function
+
+for s in gmatch(forbidden,".") do
+ replacements[s] = format("#%02x",byte(s))
+end
+
+local escaped = lpeg.Cs(lpeg.Cc("/") * (lpeg.S(forbidden)/replacements + lpeg.P(1))^0)
+
+local function pdfconstant(str,default)
+ str = str or default or ""
+ local c = cache[str]
+ if not c then
+ -- c = setmetatable({ "/" .. str },mt_c)
+ c = setmetatable({ lpegmatch(escaped,str) },mt_c)
+ cache[str] = c
+ end
+ return c
+end
+
+local p_null = { } setmetatable(p_null, mt_z)
+local p_true = { } setmetatable(p_true, mt_t)
+local p_false = { } setmetatable(p_false,mt_f)
+
+local function pdfnull()
+ return p_null
+end
+
+--~ print(pdfboolean(false),pdfboolean(false,false),pdfboolean(false,true))
+--~ print(pdfboolean(true),pdfboolean(true,false),pdfboolean(true,true))
+--~ print(pdfboolean(nil,true),pdfboolean(nil,false))
+
+local function pdfboolean(b,default)
+ if type(b) == "boolean" then
+ return b and p_true or p_false
+ else
+ return default and p_true or p_false
+ end
+end
+
+local function pdfreference(r)
+ return setmetatable({ r or 0 },mt_r)
+end
+
+local function pdfverbose(t) -- maybe check for type
+ return setmetatable({ t or "" },mt_v)
+end
+
+lpdf.stream = pdfstream
+lpdf.dictionary = pdfdictionary
+lpdf.array = pdfarray
+lpdf.string = pdfstring
+lpdf.unicode = pdfunicode
+lpdf.number = pdfnumber
+lpdf.constant = pdfconstant
+lpdf.null = pdfnull
+lpdf.boolean = pdfboolean
+lpdf.reference = pdfreference
+lpdf.verbose = pdfverbose
+
+-- n = pdf.obj(n, str)
+-- n = pdf.obj(n, "file", filename)
+-- n = pdf.obj(n, "stream", streamtext, attrtext)
+-- n = pdf.obj(n, "streamfile", filename, attrtext)
+
+-- we only use immediate objects
+
+-- todo: tracing
+
+local names, cache = { }, { }
+
+function lpdf.reserveobject(name)
+ local r = pdfreserveobj()
+ if name then
+ names[name] = r
+ if trace_objects then
+ logs.report("backends", "reserving object number %s under name '%s'",r,name)
+ end
+ elseif trace_objects then
+ logs.report("backends", "reserving object number %s",r)
+ end
+ return r
+end
+
+--~ local pdfreserveobject = lpdf.reserveobject
+
+function lpdf.flushobject(name,data)
+ if data then
+ name = names[name] or name
+ if name then
+ if trace_objects then
+ if trace_detail then
+ logs.report("backends", "flushing object data to reserved object with name '%s' -> %s",name,tostring(data))
+ else
+ logs.report("backends", "flushing object data to reserved object with name '%s'",name)
+ end
+ end
+ return pdfimmediateobj(name,tostring(data))
+ else
+ if trace_objects then
+ if trace_detail then
+ logs.report("backends", "flushing object data to reserved object with number %s -> %s",name,tostring(data))
+ else
+ logs.report("backends", "flushing object data to reserved object with number %s",name)
+ end
+ end
+ return pdfimmediateobj(tostring(data))
+ end
+ else
+ if trace_objects and trace_detail then
+ logs.report("backends", "flushing object data -> %s",tostring(name))
+ end
+ return pdfimmediateobj(tostring(name))
+ end
+end
+
+function lpdf.sharedobj(content)
+ local r = cache[content]
+ if not r then
+ r = pdfreference(pdfimmediateobj(content))
+ cache[content] = r
+ end
+ return r
+end
+
+--~ local d = lpdf.dictionary()
+--~ local e = lpdf.dictionary { ["e"] = "abc", x = lpdf.dictionary { ["f"] = "ABC" } }
+--~ local f = lpdf.dictionary { ["f"] = "ABC" }
+--~ local a = lpdf.array { lpdf.array { lpdf.string("xxx") } }
+
+--~ print(a)
+--~ os.exit()
+
+--~ d["test"] = lpdf.string ("test")
+--~ d["more"] = "more"
+--~ d["bool"] = true
+--~ d["numb"] = 1234
+--~ d["oeps"] = lpdf.dictionary { ["hans"] = "ton" }
+--~ d["whow"] = lpdf.array { lpdf.string("ton") }
+
+--~ a[#a+1] = lpdf.string("xxx")
+--~ a[#a+1] = lpdf.string("yyy")
+
+--~ d.what = a
+
+--~ print(e)
+
+--~ local d = lpdf.dictionary()
+--~ d["abcd"] = { 1, 2, 3, "test" }
+--~ print(d)
+--~ print(d())
+
+--~ local d = lpdf.array()
+--~ d[#d+1] = 1
+--~ d[#d+1] = 2
+--~ d[#d+1] = 3
+--~ d[#d+1] = "test"
+--~ print(d)
+
+--~ local d = lpdf.array()
+--~ d[#d+1] = { 1, 2, 3, "test" }
+--~ print(d)
+
+--~ local d = lpdf.array()
+--~ d[#d+1] = { a=1, b=2, c=3, d="test" }
+--~ print(d)
+
+--~ local s = lpdf.constant("xx")
+--~ print(s) -- fails somehow
+--~ print(s()) -- fails somehow
+
+--~ local s = lpdf.boolean(false)
+--~ s.value = true
+--~ print(s)
+--~ print(s())
+
+-- three priority levels, default=2
+
+local pagefinalizers, documentfinalizers = { { }, { }, { } }, { { }, { }, { } }
+
+local pageresources, pageattributes, pagesattributes
+
+local function resetpageproperties()
+ pageresources = pdfdictionary()
+ pageattributes = pdfdictionary()
+ pagesattributes = pdfdictionary()
+end
+
+local function setpageproperties()
+--~ texset("global", "pdfpageresources", pageresources ())
+--~ texset("global", "pdfpageattr", pageattributes ())
+--~ texset("global", "pdfpagesattr", pagesattributes())
+ pdf.pageresources = pageresources ()
+ pdf.pageattributes = pageattributes ()
+ pdf.pagesattributes = pagesattributes()
+end
+
+function lpdf.addtopageresources (k,v) pageresources [k] = v end
+function lpdf.addtopageattributes (k,v) pageattributes [k] = v end
+function lpdf.addtopagesattributes(k,v) pagesattributes[k] = v end
+
+local function set(where,f,when,what)
+ when = when or 2
+ local w = where[when]
+ w[#w+1] = f
+ if trace_finalizers then
+ logs.report("backend","%s set: [%s,%s]",what,when,#w)
+ end
+end
+
+local function run(where,what)
+ for i=1,#where do
+ local w = where[i]
+ for j=1,#w do
+ if trace_finalizers then
+ logs.report("backend","%s finalizer: [%s,%s]",what,i,j)
+ end
+ w[j]()
+ end
+ end
+end
+
+function lpdf.registerpagefinalizer(f,when)
+ set(pagefinalizers,f,when,"page")
+end
+
+function lpdf.registerdocumentfinalizer(f,when)
+ set(documentfinalizers,f,when,"document")
+end
+
+function lpdf.finalizepage()
+ if not environment.initex then
+ resetpageproperties()
+ run(pagefinalizers,"page")
+ setpageproperties()
+ end
+end
+
+function lpdf.finalizedocument()
+ if not environment.initex then
+ run(documentfinalizers,"document")
+ function lpdf.finalizedocument()
+ logs.report("backend","serious error: the document is finalized multiple times")
+ function lpdf.finalizedocument() end
+ end
+ end
+end
+
+-- some minimal tracing, handy for checking the order
+
+local function trace_set(what,key)
+ if trace_resources then
+ logs.report("backend", "setting key '%s' in '%s'",key,what)
+ end
+end
+local function trace_flush(what)
+ if trace_resources then
+ logs.report("backend", "flushing '%s'",what)
+ end
+end
+
+lpdf.protectresources = true
+
+local catalog, info, names = pdfdictionary(), pdfdictionary(), pdfdictionary()
+
+local function flushcatalog() if not environment.initex then trace_flush("catalog") pdf.catalog = catalog() end end
+local function flushinfo () if not environment.initex then trace_flush("info") pdf.info = info () end end
+local function flushnames () if not environment.initex then trace_flush("names") pdf.names = names () end end
+
+function lpdf.addtocatalog(k,v) if not (lpdf.protectresources and catalog[k]) then trace_set("catalog",k) catalog[k] = v end end
+function lpdf.addtoinfo (k,v) if not (lpdf.protectresources and info [k]) then trace_set("info", k) info [k] = v end end
+function lpdf.addtonames (k,v) if not (lpdf.protectresources and names [k]) then trace_set("names", k) names [k] = v end end
+
+local dummy = pdfreserveobj() -- else bug in hvmd due so some internal luatex conflict
+
+local r_extgstates, d_extgstates = pdfreserveobj(), pdfdictionary() local p_extgstates = pdfreference(r_extgstates)
+local r_colorspaces, d_colorspaces = pdfreserveobj(), pdfdictionary() local p_colorspaces = pdfreference(r_colorspaces)
+local r_patterns, d_patterns = pdfreserveobj(), pdfdictionary() local p_patterns = pdfreference(r_patterns)
+local r_shades, d_shades = pdfreserveobj(), pdfdictionary() local p_shades = pdfreference(r_shades)
+
+local function checkextgstates () if next(d_extgstates ) then lpdf.addtopageresources("ExtGState", p_extgstates ) end end
+local function checkcolorspaces() if next(d_colorspaces) then lpdf.addtopageresources("ColorSpace",p_colorspaces) end end
+local function checkpatterns () if next(d_patterns ) then lpdf.addtopageresources("Pattern", p_patterns ) end end
+local function checkshades () if next(d_shades ) then lpdf.addtopageresources("Shading", p_shades ) end end
+
+local function flushextgstates () if next(d_extgstates ) then trace_flush("extgstates") pdfimmediateobj(r_extgstates, tostring(d_extgstates )) end end
+local function flushcolorspaces() if next(d_colorspaces) then trace_flush("colorspaces") pdfimmediateobj(r_colorspaces,tostring(d_colorspaces)) end end
+local function flushpatterns () if next(d_patterns ) then trace_flush("patterns") pdfimmediateobj(r_patterns, tostring(d_patterns )) end end
+local function flushshades () if next(d_shades ) then trace_flush("shades") pdfimmediateobj(r_shades, tostring(d_shades )) end end
+
+local collected = pdfdictionary {
+ ExtGState = p_extgstates,
+ ColorSpace = p_colorspaces,
+ Pattern = p_patterns,
+ Shading = p_shades,
+} ; collected = collected()
+
+function lpdf.collectedresources()
+ tex.sprint(tex.ctxcatcodes,collected)
+end
+
+function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end
+function lpdf.adddocumentcolorspace(k,v) d_colorspaces[k] = v end
+function lpdf.adddocumentpattern (k,v) d_patterns [k] = v end
+function lpdf.adddocumentshade (k,v) d_shades [k] = v end
+
+lpdf.registerdocumentfinalizer(flushextgstates,3)
+lpdf.registerdocumentfinalizer(flushcolorspaces,3)
+lpdf.registerdocumentfinalizer(flushpatterns,3)
+lpdf.registerdocumentfinalizer(flushshades,3)
+
+lpdf.registerdocumentfinalizer(flushcatalog,3)
+lpdf.registerdocumentfinalizer(flushinfo,3)
+lpdf.registerdocumentfinalizer(flushnames,3)
+
+lpdf.registerpagefinalizer(checkextgstates,3)
+lpdf.registerpagefinalizer(checkcolorspaces,3)
+lpdf.registerpagefinalizer(checkpatterns,3)
+lpdf.registerpagefinalizer(checkshades,3)
+
+-- in strc-bkm: lpdf.registerdocumentfinalizer(function() structure.bookmarks.place() end,1)
+
+function lpdf.rotationcm(a)
+ local s, c = sind(a), cosd(a)
+ texwrite(format("%s %s %s %s 0 0 cm",c,s,-s,c))
+end
+
+-- ! -> universaltime
+
+local timestamp = os.date("%Y-%m-%dT%X") .. os.timezone(true)
+
+function lpdf.timestamp()
+ return timestamp
+end
+
+function lpdf.pdftimestamp(str)
+ local Y, M, D, h, m, s, Zs, Zh, Zm = match(str,"^(%d%d%d%d)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)([%+%-])(%d%d):(%d%d)$")
+ return Y and format("D:%s%s%s%s%s%s%s%s'%s'",Y,M,D,h,m,s,Zs,Zh,Zm)
+end
+
+function lpdf.id()
+ return format("%s.%s",tex.jobname,timestamp)
+end
+
+function lpdf.checkedkey(t,key,kind)
+ local pn = t[key]
+ if pn then
+ local tn = type(pn)
+ if tn == kind then
+ if kind == "string" then
+ return pn ~= "" and pn
+ elseif kind == "table" then
+ return next(pn) and pn
+ else
+ return pn
+ end
+ elseif tn == "string" and kind == "number" then
+ return tonumber(pn)
+ end
+ end
+end
+
+function lpdf.checkedvalue(value,kind) -- code not shared
+ if value then
+ local tv = type(value)
+ if tv == kind then
+ if kind == "string" then
+ return value ~= "" and value
+ elseif kind == "table" then
+ return next(value) and value
+ else
+ return value
+ end
+ elseif tv == "string" and kind == "number" then
+ return tonumber(value)
+ end
+ end
+end
+
+function lpdf.limited(n,min,max,default)
+ if not n then
+ return default
+ else
+ n = tonumber(n)
+ if not n then
+ return default
+ elseif n > max then
+ return max
+ elseif n < min then
+ return min
+ else
+ return n
+ end
+ end
+end
+
+-- lpdf.addtoinfo("ConTeXt.Version", tex.contextversiontoks)
+-- lpdf.addtoinfo("ConTeXt.Time", os.date("%Y.%m.%d %H:%M")) -- :%S
+-- lpdf.addtoinfo("ConTeXt.Jobname", tex.jobname)
+-- lpdf.addtoinfo("ConTeXt.Url", "www.pragma-ade.com")
+
+-- saves definitions later on
+
+backends = backends or { }
+backends.pdf = backends.pdf or {
+ comment = "backend for directly generating pdf output",
+ nodeinjections = { },
+ codeinjections = { },
+ registrations = { },
+ helpers = { },
+}
diff --git a/tex/context/base/lpdf-ini.mkiv b/tex/context/base/lpdf-ini.mkiv
new file mode 100644
index 000000000..7c7dce3ef
--- /dev/null
+++ b/tex/context/base/lpdf-ini.mkiv
@@ -0,0 +1,271 @@
+%D \module
+%D [ file=lpdf-ini,
+%D version=2009.04.15,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=PDF,
+%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}{ConTeXt Backend Macros / PDF}
+
+\registerctxluafile{lpdf-ini}{1.001}
+\registerctxluafile{lpdf-xmp}{1.001}
+\registerctxluafile{lpdf-nod}{1.001}
+%registerctxluafile{lpdf-col}{1.001} % will be loaded later
+\registerctxluafile{lpdf-mis}{1.001}
+\registerctxluafile{lpdf-ano}{1.001}
+\registerctxluafile{lpdf-ren}{1.001}
+\registerctxluafile{lpdf-grp}{1.001}
+\registerctxluafile{lpdf-wid}{1.001}
+\registerctxluafile{lpdf-fld}{1.001}
+\registerctxluafile{lpdf-u3d}{1.001}
+\registerctxluafile{lpdf-swf}{1.001}
+
+\unprotect
+
+% for the moment here
+
+%D \macros
+%D {doovalbox}
+%D
+%D Drawing frames with round corners is inherited from the
+%D main module.
+%D
+%D For drawing ovals we use quite raw \PDF\ code. The next
+%D implementation does not differ that much from the one
+%D implemented in the \POSTSCRIPT\ driver. This code is
+%D somewhat obsolete as we now have metapost embedded.
+
+\def\doPDFovalcalc#1#2#3%
+ {\PointsToBigPoints{\dimexpr#1+#2\relax}#3}
+
+\def\doovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox
+ {\forcecolorhack
+ \bgroup
+ \dimen0=#4\divide\dimen0 \plustwo
+ \doPDFovalcalc{0pt}{+\dimen0}\xmin
+ \doPDFovalcalc{#1}{-\dimen0}\xmax
+ \doPDFovalcalc{#2}{-\dimen0}\ymax
+ \doPDFovalcalc{-#3}{+\dimen0}\ymin
+ \advance\dimen0 by #5%
+ \doPDFovalcalc{0pt}{+\dimen0}\xxmin
+ \doPDFovalcalc{#1}{-\dimen0}\xxmax
+ \doPDFovalcalc{#2}{-\dimen0}\yymax
+ \doPDFovalcalc{-#3}{+\dimen0}\yymin
+ \doPDFovalcalc{#4}{\zeropoint}\stroke
+ \doPDFovalcalc{#5}{\zeropoint}\radius
+ \edef\dostroke{#6}%
+ \edef\dofill{#7}%
+ \edef\mode{\number#8 \space}%
+ % no \ifcase, else \relax in pdfcode
+ \setbox\scratchbox\hbox
+ {\ifnum\dostroke\dofill>\zerocount
+ \pdfliteral
+ {q
+ \stroke\space w
+ \ifcase\mode
+ \xxmin\space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 1
+ \xxmin\space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 2
+ \xxmin\space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 3
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ h
+ \or % 4
+ \xmin \space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xmin \space \ymax \space l
+ \xmin \space \ymin\space l
+ h
+ \or % 5
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xmin \space \ymax \space l
+ \xmin \space \ymin \space l
+ h
+ \or % 6
+ \xmin \space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \ymin \space l
+ h
+ \or
+ \xxmin\space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ h
+ \or % 9 top open
+ \xmin \space \ymax \space m
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \or % 10 right open
+ \xmax \space \ymax \space m
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ \xmax\space \ymin \space l
+ \or % 11 bottom open
+ \xmax \space \ymin \space m
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax \space \ymax\space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ \or % 12 left open
+ \xmin \space \ymax \space m
+ \xxmax\space \ymax \space l
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space l
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \ymin \space l
+ \or % 13
+ \xmin \space \ymax \space m
+ \xxmax\space \ymax \space l
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax\space \ymin \space l
+ \or % 14
+ \xmax \space \ymax \space m
+ \xmax \space \yymin\space l
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \ymin \space l
+ \or % 15
+ \xmax \space \ymin \space m
+ \xxmin\space \ymin \space l
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \ymax \space l
+ \or % 16
+ \xmin \space \ymin \space m
+ \xmin \space \yymax\space l
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \xmax \space \ymax \space l
+ \or % 17
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \or % 18
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \or % 19
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 20
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 21
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 22
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \or % 23
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 24
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 25
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 26
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 27
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 28
+ \fi
+ \ifnum\mode>8
+ S
+ \else
+ \ifnum\dostroke=\plusone S \fi
+ \ifnum\dofill =\plusone f \fi
+ \fi
+ Q}%
+ \fi}%
+ \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox
+ \egroup}
+
+\unexpanded\def\pdfactualtext#1#2%
+ {\pdfliteral direct{/Span <</ActualText \ctxlua{tex.write(lpdf.tosixteen("#2"))} >> BDC}%
+ #1%
+ \pdfliteral direct{EMC}}
+
+% \starttext
+% text \pdfactualtext{Meier}{Müller} text
+% \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/lpdf-mis.lua b/tex/context/base/lpdf-mis.lua
new file mode 100644
index 000000000..a68c7b487
--- /dev/null
+++ b/tex/context/base/lpdf-mis.lua
@@ -0,0 +1,292 @@
+if not modules then modules = { } end modules ['lpdf-mis'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Although we moved most pdf handling to the lua end, we didn't change
+-- the overall approach. For instance we share all resources i.e. we
+-- don't make subsets for each xform or page. The current approach is
+-- quite efficient. A big difference between MkII and MkIV is that we
+-- now use forward references. In this respect the MkII code shows that
+-- it evolved over a long period, when backends didn't provide forward
+-- referencing and references had to be tracked in multiple passes. Of
+-- course there are a couple of more changes.
+
+local next, tostring = next, tostring
+local format = string.format
+local texsprint, texset = tex.sprint, tex.set
+local ctxcatcodes = tex.ctxcatcodes
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+local copy_node = node.copy
+
+local pdfliteral, register = nodes.pdfliteral, nodes.register
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfboolean = lpdf.boolean
+local pdfconstant = lpdf.constant
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfverbose = lpdf.verbose
+local pdfstring = lpdf.string
+local pdfflushobject = lpdf.flushobject
+
+local pdfimmediateobj = pdf.immediateobj
+
+local tobasepoints = number.tobasepoints
+local variables = interfaces.variables
+
+--
+
+local positive = register(pdfliteral("/GSpositive gs"))
+local negative = register(pdfliteral("/GSnegative gs"))
+local overprint = register(pdfliteral("/GSoverprint gs"))
+local knockout = register(pdfliteral("/GSknockout gs"))
+
+local function initializenegative()
+ local a = pdfarray { 0, 1 }
+ local g = pdfconstant("ExtGState")
+ local d = pdfdictionary {
+ FunctionType = 4,
+ Range = a,
+ Domain = a,
+ }
+ local negative = pdfdictionary { Type = g, TR = pdfreference(pdf.immediateobj("stream","1 exch sub",d())) }
+ local positive = pdfdictionary { Type = g, TR = pdfconstant("Identity") }
+ lpdf.adddocumentextgstate("GSnegative", pdfreference(pdfflushobject(negative)))
+ lpdf.adddocumentextgstate("GSPositive", pdfreference(pdfflushobject(positive)))
+ initializenegative = nil
+end
+
+local function initializeoverprint()
+ local g = pdfconstant("ExtGState")
+ local knockout = pdfdictionary { Type = g, OP = false, OPM = 0 }
+ local overprint = pdfdictionary { Type = g, OP = true, OPM = 1 }
+ lpdf.adddocumentextgstate("GSknockout", pdfreference(pdfflushobject(knockout)))
+ lpdf.adddocumentextgstate("GSoverprint", pdfreference(pdfflushobject(overprint)))
+ initializeoverprint = nil
+end
+
+function nodeinjections.overprint()
+ if initializeoverprint then initializeoverprint() end
+ return copy_node(overprint)
+end
+function nodeinjections.knockout ()
+ if initializeoverprint then initializeoverprint() end
+ return copy_node(knockout)
+end
+
+function nodeinjections.positive()
+ if initializenegative then initializenegative() end
+ return copy_node(positive)
+end
+function nodeinjections.negative()
+ if initializenegative then initializenegative() end
+ return copy_node(negative)
+end
+
+--
+
+function codeinjections.addtransparencygroup()
+ -- png: /CS /DeviceRGB /I true
+ local d = pdfdictionary {
+ S = pdfconstant("Transparency"),
+ I = true,
+ K = true,
+ }
+ lpdf.registerpagefinalizer(function() lpdf.addtopageattributes("Group",d) end) -- hm
+end
+
+-- actions (todo: store and update when changed)
+
+local openpage, closepage, opendocument, closedocument
+
+function codeinjections.flushdocumentactions(open,close)
+ opendocument, closedocument = open, close
+end
+
+function codeinjections.flushpageactions(open,close)
+ openpage, closepage = open, close
+end
+
+local function flushdocumentactions()
+ if opendocument then
+ lpdf.addtocatalog("OpenAction",lpdf.pdfaction(opendocument))
+ end
+ if closedocument then
+ lpdf.addtocatalog("CloseAction",lpdf.pdfaction(closedocument))
+ end
+end
+
+local function flushpageactions()
+ if openpage or closepage then
+ local d = pdfdictionary()
+ if openpage then
+ d.O = lpdf.pdfaction(openpage)
+ end
+ if closepage then
+ d.C = lpdf.pdfaction(closepage)
+ end
+ lpdf.addtopageattributes("AA",d)
+ end
+end
+
+lpdf.registerpagefinalizer(flushpageactions)
+lpdf.registerdocumentfinalizer(flushdocumentactions)
+
+--- info
+
+function codeinjections.setupidentity(specification)
+ local title = specification.title or ""
+ if title ~= "" then
+ lpdf.addtoinfo("Title", pdfunicode(title), title)
+ end
+ local subject = specification.subject or ""
+ if subject ~= "" then
+ lpdf.addtoinfo("Subject", pdfunicode(subject), subject)
+ end
+ local author = specification.author or ""
+ if author ~= "" then
+ lpdf.addtoinfo("Author", pdfunicode(author), author) -- '/Author' in /Info, 'Creator' in XMP
+ end
+ local creator = specification.creator or ""
+ if creator ~= "" then
+ lpdf.addtoinfo("Creator", pdfunicode(creator), creator) -- '/Creator' in /Info, 'CreatorTool' in XMP
+ end
+ lpdf.addtoinfo("CreationDate", pdfstring(lpdf.pdftimestamp(lpdf.timestamp())))
+ local date = specification.date or ""
+ local pdfdate = lpdf.pdftimestamp(date)
+ if pdfdate then
+ lpdf.addtoinfo("ModDate", pdfstring(pdfdate), date)
+ else
+ -- users should enter the date in 2010-01-19T23:27:50+01:00 format
+ -- and if not provided that way we use the creation time instead
+ date = lpdf.timestamp()
+ lpdf.addtoinfo("ModDate", pdfstring(lpdf.pdftimestamp(date)), date)
+ end
+ local keywords = specification.keywords or ""
+ if keywords ~= "" then
+ keywords = string.gsub(keywords, "[%s,]+", " ")
+ lpdf.addtoinfo("Keywords",pdfunicode(keywords), keywords)
+ end
+ local id = lpdf.id()
+ lpdf.addtoinfo("ID", pdfstring(id), id) -- needed for pdf/x
+end
+
+local function flushjavascripts()
+ local t = javascripts.flushpreambles()
+ if #t > 0 then
+ local a = pdfarray()
+ local pdf_javascript = pdfconstant("JavaScript")
+ for i=1,#t do
+ local name, script = t[i][1], t[i][2]
+ local j = pdfdictionary {
+ S = pdf_javascript,
+ JS = pdfreference(pdfimmediateobj("stream",script)),
+ }
+ a[#a+1] = pdfstring(name)
+ a[#a+1] = pdfreference(pdfflushobject(j))
+ end
+ lpdf.addtonames("JavaScript",pdfreference(pdfflushobject(pdfdictionary{ Names = a })))
+ end
+end
+
+lpdf.registerdocumentfinalizer(flushjavascripts)
+
+-- -- --
+
+local pagespecs = {
+ [variables.max] = { "FullScreen", false, false },
+ [variables.bookmark] = { "UseOutlines", false, false },
+ [variables.fit] = { "UseNone", false, true },
+ [variables.doublesided] = { "UseNone", "TwoColumnRight", true },
+ [variables.singlesided] = { "UseNone", false, false },
+ [variables.default] = { "UseNone", "auto", false },
+ [variables.auto] = { "UseNone", "auto", false },
+ [variables.none] = { false, false, false },
+}
+
+local pagespec, topoffset, leftoffset, height, width, doublesided = "default", 0, 0, 0, 0, false
+
+function codeinjections.setupcanvas(specification)
+ local paperheight = specification.paperheight
+ local paperwidth = specification.paperwidth
+ local paperdouble = specification.doublesided
+ if paperheight then
+ texset('global','pdfpageheight',paperheight)
+ end
+ if paperwidth then
+ texset('global','pdfpagewidth',paperwidth)
+ end
+ pagespec = specification.mode or pagespec
+ topoffset = specification.topoffset or 0
+ leftoffset = specification.leftoffset or 0
+ height = specification.height or tex.pdfpageheight
+ width = specification.width or tex.pdfpagewidth
+ if paperdouble ~= nil then
+ doublesided = paperdouble
+ end
+end
+
+local function documentspecification()
+ local spec = pagespecs[pagespec] or pagespecs[variables.default]
+ if spec then
+ local mode, layout, fit = spec[1], spec[2], spec[3]
+ if layout == variables.auto then
+ if doublesided then
+ spec = pagespecs[variables.doublesided] -- to be checked voor interfaces
+ if spec then
+ mode, layout, fit = spec[1], spec[2], spec[3]
+ end
+ else
+ layout = false
+ end
+ end
+ mode = mode and pdfconstant(mode)
+ layout = layout and pdfconstant(layout)
+ fit = fit and pdfdictionary { FitWindow = true }
+ if layout then
+ lpdf.addtocatalog("PageLayout",layout)
+ end
+ if mode then
+ lpdf.addtocatalog("PageMode",mode)
+ end
+ if fit then
+ lpdf.addtocatalog("ViewerPreferences",fit)
+ end
+ lpdf.addtoinfo ("Trapped", pdfconstant("False")) -- '/Trapped' in /Info, 'Trapped' in XMP
+ lpdf.addtocatalog("Version", pdfconstant(format("1.%s",tex.pdfminorversion)))
+ end
+end
+
+-- temp hack: the mediabox is not under our control and has a precision of 4 digits
+
+local factor = number.dimenfactors.bp
+
+local function boxvalue(n) -- we could share them
+ return pdfverbose(format("%0.4f",factor * n))
+end
+
+local function pagespecification()
+ local pageheight = tex.pdfpageheight
+ local box = pdfarray { -- can be cached
+ boxvalue(leftoffset),
+ boxvalue(pageheight-topoffset-height),
+ boxvalue(width-leftoffset),
+ boxvalue(pageheight-topoffset),
+ }
+ lpdf.addtopageattributes("CropBox",box) -- mandate for rendering
+ lpdf.addtopageattributes("TrimBox",box) -- mandate for pdf/x
+ -- lpdf.addtopageattributes("BleedBox",box)
+ -- lpdf.addtopageattributes("ArtBox",box)
+end
+
+lpdf.registerpagefinalizer(pagespecification)
+lpdf.registerdocumentfinalizer(documentspecification)
diff --git a/tex/context/base/lpdf-nod.lua b/tex/context/base/lpdf-nod.lua
new file mode 100644
index 000000000..0ae900123
--- /dev/null
+++ b/tex/context/base/lpdf-nod.lua
@@ -0,0 +1,53 @@
+if not modules then modules = { } end modules ['lpdf-nod'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local copy_node, new_node = node.copy, node.new
+
+local pdfliteral = nodes.register(new_node("whatsit", 8)) pdfliteral.mode = 1
+local pdfdest = nodes.register(new_node("whatsit",19)) pdfdest.named_id = 1 -- xyz_zoom untouched
+local pdfannot = nodes.register(new_node("whatsit",15))
+
+local variables = interfaces.variables
+
+local views = { -- beware, we do support the pdf keys but this is *not* official
+ xyz = 0, [variables.standard] = 0,
+ fit = 1, [variables.fit] = 1,
+ fith = 2, [variables.width] = 2,
+ fitv = 3, [variables.height] = 3,
+ fitb = 4,
+ fitbh = 5, [variables.minwidth] = 5,
+ fitbv = 6, [variables.minheight] = 6,
+ fitr = 7,
+}
+
+function nodes.pdfliteral(str)
+ local t = copy_node(pdfliteral)
+ t.data = str
+ return t
+end
+
+function nodes.pdfannotation(w,h,d,data,n)
+ local t = copy_node(pdfannot)
+ if w and w ~= 0 then t.width = w end
+ if h and h ~= 0 then t.height = h end
+ if d and d ~= 0 then t.depth = d end
+ if n then t.objnum = n end
+ if data and data ~= "" then t.data = data end
+ return t
+end
+
+function nodes.pdfdestination(w,h,d,name,view,n)
+ local t = copy_node(pdfdest)
+ if w and w ~= 0 then t.width = w end
+ if h and h ~= 0 then t.height = h end
+ if d and d ~= 0 then t.depth = d end
+ if n then t.objnum = n end
+ t.dest_id = name
+ t.dest_type = views[view] or view or 1 -- fit is default
+ return t
+end
diff --git a/tex/context/base/lpdf-pdx.lua b/tex/context/base/lpdf-pdx.lua
new file mode 100644
index 000000000..0a440c1e6
--- /dev/null
+++ b/tex/context/base/lpdf-pdx.lua
@@ -0,0 +1,139 @@
+if not modules then modules = { } end modules ['lpdf-pdx'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Peter Rold and Hans Hagen",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local codeinjections = backends.codeinjections -- normally it is registered
+local variables = interfaces.variables
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfconstant = lpdf.constant
+local pdfreference = lpdf.reference
+local pdfflushobject = lpdf.flushobject
+local pdfstring = lpdf.string
+local pdfverbose = lpdf.verbose
+
+local lower, gmatch = string.lower, string.gmatch
+
+local channels = {
+ gray = 1,
+ grey = 1,
+ rgb = 3,
+ cmyk = 4,
+}
+
+local prefixes = {
+ gray = "DefaultGray",
+ grey = "DefaultGray",
+ rgb = "DefaultRGB",
+ cmyk = "DefaultCMYK",
+}
+
+local profiles = { }
+local defaults = { }
+local intents = pdfarray()
+local lastprofile = nil
+
+function codeinjections.useinternalICCprofile(colorspace,filename)
+ local name = lower(file.basename(filename))
+ local profile = profiles[name]
+ if not profile then
+ local colorspace = lower(colorspace)
+ local filename = resolvers.findctxfile(filename) or ""
+ local channel = channels[colorspace]
+ if channel and filename ~= "" then
+ local a = pdfdictionary { N = channel }
+ profile = pdf.obj {
+ compresslevel = 0,
+ immediate = true,
+ type = "stream",
+ file = filename,
+ attr = a(),
+ }
+ profiles[name] = profile
+ end
+ end
+ lastprofile = profile
+ return profile
+end
+
+function codeinjections.useexternalICCprofile(colorspace,name,urls,checksum,version)
+ local profile = profiles[name]
+ if not profile then
+ local u = pdfarray()
+ for url in gmatch(urls,"([^, ]+)") do
+ u[#u+1] = pdfdictionary {
+ FS = pdfconstant("URL"),
+ F = pdfstring(url),
+ }
+ end
+ local d = pdfdictionary {
+ ProfileName = name, -- not file name!
+ ProfileCS = colorspace,
+ URLs = u, -- array containing at least one URL
+ CheckSum = pdfverbose { "<", checksum, ">" }, -- 16byte MD5 hash
+ ICCVersion = pdfverbose { "<", version, ">" }, -- bytes 8..11 from the header of the ICC profile, as a hex string
+ }
+ local n = pdfflushobject(d)
+ profiles[name] = n
+ lastprofile = n
+ return n
+ end
+end
+
+local function embedprofile(colorspace,filename)
+ local colorspace = lower(colorspace)
+ local n = codeinjections.useinternaliccprofile(colorspace,filename)
+ if n then
+ local a = pdfarray {
+ pdfconstant("ICCBased"),
+ pdfreference(n),
+ }
+ lpdf.adddocumentcolorspace(prefixes[colorspace],pdfreference(pdfflushobject(a))) -- part of page /Resources
+ defaults[lower(colorspace)] = filename
+ end
+end
+
+
+function codeinjections.useICCdefaultprofile(colorspace,filename)
+ defaults[lower(colorspace)] = filename
+end
+
+local function flushembeddedprofiles()
+ for colorspace, filename in next, defaults do
+ embedprofile(colorspace,filename)
+ end
+end
+
+function codeinjections.usePDFXoutputintent(id,name,reference,outputcondition,info)
+ local d = {
+ Type = pdfconstant("OutputIntent"),
+ S = pdfconstant("GTS_PDFX"),
+ OutputConditionIdentifier = id,
+ RegistryName = name,
+ OutputCondition = outputcondition,
+ Info = info,
+ }
+ local icc = lastprofile
+ if reference == variables.yes then
+ d["DestOutputProfileRef"] = pdfreference(icc)
+ else
+ d["DestOutputProfile"] = pdfreference(icc)
+ end
+ -- intents[#intents+1] = pdfdictionary(d)
+ intents[#intents+1] = pdfreference(pdfflushobject(pdfdictionary(d))) -- nicer as separate object
+end
+
+local function flushoutputintents()
+ if #intents > 0 then
+ lpdf.addtocatalog("OutputIntents",pdfreference(pdfflushobject(intents)))
+ end
+end
+
+
+lpdf.registerdocumentfinalizer(flushoutputintents,1)
+lpdf.registerdocumentfinalizer(flushembeddedprofiles,1)
diff --git a/tex/context/base/lpdf-pdx.mkiv b/tex/context/base/lpdf-pdx.mkiv
new file mode 100644
index 000000000..ffb7f5269
--- /dev/null
+++ b/tex/context/base/lpdf-pdx.mkiv
@@ -0,0 +1,71 @@
+%D \module
+%D [ file=lpdf-pdx,
+%D version=2010.02.11,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=PDF-X,
+%D author=Peter Rolf \& Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA] % and peter
+%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 Backend Macros / PDF-X}
+
+\unprotect
+
+% declare default color space
+% all device based entries of the same CS are mapped to the defined ICCprofile then;
+% i.e. /DeviceRGB --> /ICCBased RGB profile
+% TODO: allow multiple default profiles (one per CS)
+%
+% external ICC profile dictionary (PDF/X-4p and PDF/X-5p)
+%
+% - ProfileName (not file name!)
+% - URLs (array containing at least one URL); the keyword FSA is wrong!
+% - CheckSum (16byte MD5 hash)
+% - ProfileCS (GRAY,RGB,CMYK)
+% - ICCVersion (bytes 8..11 from the header of the ICC profile, as a hex string)
+
+\registerctxluafile{lpdf-pdx} {}
+
+% \def\embedICCprofile#1#2% colorspace, name
+% {\ctxlua{backends.codeinjections.addiccprofile("#1","#2")}}
+
+\def\douseinternalICCprofile[#1]%
+ {\getparameters[\??ic][colorspace=,filename=,#1]%
+ \ctxlua{backends.codeinjections.useinternalICCprofile(
+ "\@@iccolorspace","\@@icfilename")}}
+
+% create a dictionary for an external ICC profile (PDF/X-4p and PDF/X-5pg only)
+% the referenced ICC profile is not embedded
+
+\def\douseexternalICCprofile[#1]%
+ {\getparameters[\??ic][colorspace=,name=,url=,checksum=,version=,#1]%
+ \ctxlua{backends.codeinjections.useexternalICCprofile(
+ "\@@iccolorspace","\@@icname","\@@icurl","\@@icchecksum","\@@icversion")}}
+
+% use an ICC profile as default colorspace for all device dependend colors;
+% all device based entries of the same CS are mapped to the defined ICCprofile then;
+% i.e. /DeviceRGB --> /ICCBased RGB profile always embed the profile!
+
+\def\douseICCdefaultprofile[#1]%
+ {\getparameters[\??ic][colorspace=,filename=,#1]%
+ \ctxlua{backends.codeinjections.useICCdefaultprofile(
+ "\@@iccolorspace","\@@icfilename")}}
+
+% embedding rules for output intent profile differ for the PDF/X versions
+
+\def\dousePDFXoutputintent[#1]%
+ {\getparameters[\??ic][reference=\v!yes,outputcondition=,info=,id=,name=,#1]%
+ \ctxlua{backends.codeinjections.usePDFXoutputintent(
+ "\@@icid","\@@icname","\@@icreference","\@@icoutputcondition","\@@icinfo")}}
+
+\def\useinternalICCprofile{\dosingleempty\douseinternalICCprofile}
+\def\useexternalICCprofile{\dosingleempty\douseexternalICCprofile}
+\def\useICCdefaultprofile {\dosingleempty\douseICCdefaultprofile }
+\def\usePDFXoutputintent {\dosingleempty\dousePDFXoutputintent }
+
+\protect \endinput
+
diff --git a/tex/context/base/lpdf-ren.lua b/tex/context/base/lpdf-ren.lua
new file mode 100644
index 000000000..e6bbd67fe
--- /dev/null
+++ b/tex/context/base/lpdf-ren.lua
@@ -0,0 +1,207 @@
+if not modules then modules = { } end modules ['lpdf-ren'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- rendering
+
+local tostring, tonumber, next = tostring, tonumber, next
+local format = string.format
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+jobreferences = jobreferences or { }
+--~ jobreferences.runners = jobreferences.runners or { }
+--~ jobreferences.specials = jobreferences.specials or { }
+--~ jobreferences.handlers = jobreferences.handlers or { }
+jobreferences.executers = jobreferences.executers or { }
+
+--~ local runners = jobreferences.runners
+--~ local specials = jobreferences.specials
+--~ local handlers = jobreferences.handlers
+local executers = jobreferences.executers
+
+local variables = interfaces.variables
+
+local pdfconstant = lpdf.constant
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfflushobject = lpdf.flushobject
+
+local pdf_ocg = pdfconstant("OCG")
+local pdf_ocmd = pdfconstant("OCMD")
+local pdf_off = pdfconstant("OFF")
+local pdf_on = pdfconstant("ON")
+local pdf_toggle = pdfconstant("Toggle")
+local pdf_setocgstate = pdfconstant("SetOCGState")
+
+local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = pdfconstant("OFF") } }
+
+local pdfln, pdfld = { }, { }
+local textlayers, hidelayers, videlayers = pdfarray(), pdfarray(), pdfarray()
+local pagelayers = pdfdictionary()
+
+lpdf.layerreferences = pdfln
+
+function backends.pdf.layerreference(name)
+ return pdfln[name]
+end
+
+function codeinjections.defineviewerlayer(specification)
+ if textlayers then
+ local tag = specification.tag
+ -- todo: reserve
+ local n = pdfdictionary {
+ Type = pdf_ocg,
+ Name = specification.title or "unknown",
+ Intent = ((specification.kind > 0) and pdf_design) or nil, -- disable layer hiding by user
+ Usage = ((specification.printable == variables.no) and lpdf_usage) or nil , -- printable or not
+ }
+ local nr = pdfreference(pdfflushobject(n))
+ pdfln[tag] = nr -- was n
+ local d = pdfdictionary {
+ Type = pdf_ocmd,
+ OCGs = pdfarray { nr },
+ }
+ local dr = pdfreference(pdfflushobject(d))
+ pdfld[tag] = dr
+ textlayers[#textlayers+1] = nr
+ if specification.visible == variables.start then
+ videlayers[#videlayers+1] = nr
+ else
+ hidelayers[#hidelayers+1] = nr
+ end
+ pagelayers[tag] = dr -- check
+ end
+end
+
+local function flushtextlayers()
+ if textlayers and #textlayers > 0 then
+ local d = pdfdictionary {
+ OCGs = textlayers,
+ D = pdfdictionary {
+ Order = textlayers,
+ ON = videlayers,
+ OFF = hidelayers,
+ },
+ }
+ lpdf.addtocatalog("OCProperties",d)
+ textlayers = nil
+ end
+end
+
+local function flushpagelayers()
+ if next(pagelayers) then
+ lpdf.addtopageresources("Properties",pagelayers)
+ end
+end
+
+lpdf.registerpagefinalizer (flushpagelayers)
+lpdf.registerdocumentfinalizer(flushtextlayers)
+
+local function setlayer(what,arguments)
+ -- maybe just a gmatch of even better, earlier in lpeg
+ arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ local state = pdfarray { what }
+ for i=1,#arguments do
+ local p = pdfln[arguments[i]]
+ if p then
+ state[#state+1] = p
+ end
+ end
+ return pdfdictionary {
+ S = pdf_setocgstate,
+ State = state,
+ }
+end
+
+function executers.hidelayer (arguments) setlayer(pdf_off, arguments) end
+function executers.videlayer (arguments) setlayer(pdf_on, arguments) end
+function executers.togglelayer(arguments) setlayer(pdf_toggle,arguments) end
+
+-- transitions
+
+local pagetransitions = {
+ {"split","in","vertical"}, {"split","in","horizontal"},
+ {"split","out","vertical"}, {"split","out","horizontal"},
+ {"blinds","horizontal"}, {"blinds","vertical"},
+ {"box","in"}, {"box","out"},
+ {"wipe","east"}, {"wipe","west"}, {"wipe","north"}, {"wipe","south"},
+ {"dissolve"},
+ {"glitter","east"}, {"glitter","south"},
+ {"fly","in","east"}, {"fly","in","west"}, {"fly","in","north"}, {"fly","in","south"},
+ {"fly","out","east"}, {"fly","out","west"}, {"fly","out","north"}, {"fly","out","south"},
+ {"push","east"}, {"push","west"}, {"push","north"}, {"push","south"},
+ {"cover","east"}, {"cover","west"}, {"cover","north"}, {"cover","south"},
+ {"uncover","east"}, {"uncover","west"}, {"uncover","north"}, {"uncover","south"},
+ {"fade"},
+}
+
+local mapping = {
+ split = { "S" , pdfconstant("Split") },
+ blinds = { "S" , pdfconstant("Blinds") },
+ box = { "S" , pdfconstant("Box") },
+ wipe = { "S" , pdfconstant("Wipe") },
+ dissolve = { "S" , pdfconstant("Dissolve") },
+ glitter = { "S" , pdfconstant("Glitter") },
+ replace = { "S" , pdfconstant("R") },
+ fly = { "S" , pdfconstant("Fly") },
+ push = { "S" , pdfconstant("Push") },
+ cover = { "S" , pdfconstant("Cover") },
+ uncover = { "S" , pdfconstant("Uncover") },
+ fade = { "S" , pdfconstant("Fade") },
+ horizontal = { "Dm" , pdfconstant("H") },
+ vertical = { "Dm" , pdfconstant("V") },
+ ["in"] = { "M" , pdfconstant("I") },
+ out = { "M" , pdfconstant("O") },
+ east = { "Di" , 0 },
+ north = { "Di" , 90 },
+ west = { "Di" , 180 },
+ south = { "Di" , 270 },
+}
+
+local last = 0
+
+-- n: number, "stop", "reset", "random", "a,b,c" delay: number, "none"
+
+function codeinjections.setpagetransition(specification)
+ local n, delay = specification.n, specification.delay
+ if n == variables.auto then
+ if last >= #pagetransitions then
+ last = 0
+ end
+ n = last + 1
+ elseif n == variables.stop then
+ return
+ elseif n == variables.reset then
+ last = 0
+ return
+ elseif n == variables.random then
+ n = math.random(1,#pagetransitions)
+ else
+ n = tonumber(n)
+ end
+ local t = n and pagetransitions[n] or pagetransitions[1]
+ if not t then
+ t = aux.settings_to_array(n)
+ end
+ if t and #t > 0 then
+ local d = pdfdictionary()
+ for i=1,#t do
+ local m = mapping[t[i]]
+ d[m[1]] = m[2]
+ end
+ delay = tonumber(delay)
+ if delay and delay > 0 then
+ lpdf.addtopageattributes("Dur",delay)
+ end
+ lpdf.addtopageattributes("Trans",d)
+ end
+end
diff --git a/tex/context/base/lpdf-swf.lua b/tex/context/base/lpdf-swf.lua
new file mode 100644
index 000000000..9fe0cd09f
--- /dev/null
+++ b/tex/context/base/lpdf-swf.lua
@@ -0,0 +1,109 @@
+if not modules then modules = { } end modules ['lpdf-swf'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The following code is based on tests by Luigi Scarso. His prototype
+-- was using tex code. This is the official implementation.
+
+local format = string.format
+
+local pdfconstant = lpdf.constant
+local pdfboolean = lpdf.boolean
+local pdfstring = lpdf.string
+local pdfunicode = lpdf.unicode
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfnull = lpdf.null
+local pdfreference = lpdf.reference
+
+function backends.pdf.helpers.insertswf(spec)
+
+ local width, height, filename = spec.width, spec.height, spec.foundname
+
+ local eref = backends.codeinjections.embedfile(filename)
+
+ local flash = pdfdictionary {
+ Subtype = pdfconstant("Flash"),
+ Instances = pdfarray {
+ pdfdictionary {
+ Asset = eref,
+ Params = pdfdictionary {
+ Binding = pdfconstant("Foreground")
+ }
+ },
+ },
+ }
+
+ local fref = pdfreference(pdf.immediateobj(tostring(flash)))
+
+ local configuration = pdfdictionary {
+ Configurations = pdfarray { fref },
+ Assets = pdfdictionary {
+ Names = pdfarray {
+ pdfstring(filename),
+ eref,
+ }
+ },
+ }
+
+ local cref = pdfreference(pdf.immediateobj(tostring(configuration)))
+
+ local activation = pdfdictionary {
+ Activation = pdfdictionary {
+ Type = pdfconstant("RichMediaActivation"),
+ Condition = pdfconstant("PO"),
+ Configuration = fref,
+ Animation = pdfdictionary {
+ Subtype = pdfconstant("Linear"),
+ Speed = 1,
+ Playcount = 1,
+ },
+ Deactivation = pdfdictionary {
+ Type = pdfconstant("RichMediaDeactivation"),
+ Condition = pdfconstant("XD"),
+ },
+ Presentation = pdfdictionary {
+ PassContextClick = false,
+ Style = pdfconstant("Embedded"),
+ Toolbar = false,
+ NavigationPane = false,
+ Transparent = true,
+ Window = pdfdictionary {
+ Type = pdfconstant("RichMediaWindow"),
+ Width = pdfdictionary {
+ Default = 100,
+ Min = 100,
+ Max = 100,
+ },
+ Height = pdfdictionary {
+ Default = 100,
+ Min = 100,
+ Max = 100,
+ },
+ Position = pdfdictionary {
+ Type = pdfconstant("RichMediaPosition"),
+ HAlign = pdfconstant("Near"),
+ VAlign = pdfconstant("Near"),
+ HOffset = 0,
+ VOffset = 0,
+ }
+ }
+ }
+ }
+ }
+
+ local aref = pdfreference(pdf.immediateobj(tostring(activation)))
+
+ local annotation = pdfdictionary {
+ Subtype = pdfconstant("RichMedia"),
+ RichMediaContent = cref,
+ RichMediaSettings = aref,
+ }
+
+ return annotation, nil, nil
+
+end
diff --git a/tex/context/base/lpdf-u3d.lua b/tex/context/base/lpdf-u3d.lua
new file mode 100644
index 000000000..f7a62c6c9
--- /dev/null
+++ b/tex/context/base/lpdf-u3d.lua
@@ -0,0 +1,474 @@
+if not modules then modules = { } end modules ['lpdf-u3d'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The following code is based on a working prototype provided
+-- by Michael Vidiassov. It is rewritten using the lpdf library
+-- and different checking is used. The macro calls are adapted
+-- (and will eventually be removed). The user interface needs
+-- an overhaul. There are some messy leftovers that will be
+-- removed in future versions.
+
+local format, find = string.format, string.find
+local cos, sin, sqrt, pi, atan2, abs = math.cos, math.sin, math.sqrt, math.pi, math.atan2, math.abs
+
+local pdfconstant = lpdf.constant
+local pdfboolean = lpdf.boolean
+local pdfnumber = lpdf.number
+local pdfunicode = lpdf.unicode
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfnull = lpdf.null
+local pdfreference = lpdf.reference
+
+local pdfimmediateobj = pdf.immediateobj
+
+local checkedkey = lpdf.checkedkey
+local limited = lpdf.limited
+
+local schemes = table.tohash {
+ "Artwork", "None", "White", "Day", "Night", "Hard",
+ "Primary", "Blue", "Red", "Cube", "CAD", "Headlamp",
+}
+
+local modes = table.tohash {
+ "Solid", "SolidWireframe", "Transparent", "TransparentWireframe", "BoundingBox",
+ "TransparentBoundingBox", "TransparentBoundingBoxOutline", "Wireframe",
+ "ShadedWireframe", "HiddenWireframe", "Vertices", "ShadedVertices", "Illustration",
+ "SolidOutline", "ShadedIllustration",
+}
+
+local function normalize(x, y, z)
+ local modulo = sqrt(x*x + y*y + z*z);
+ if modulo ~= 0 then
+ return x/modulo, y/modulo, z/modulo
+ else
+ return x, y, z
+ end
+end
+
+local function rotate(vect_x,vect_y,vect_z, tet, axis_x,axis_y,axis_z)
+ -- rotate vect by tet about axis counterclockwise
+ local c, s = cos(tet*pi/180), sin(tet*pi/180)
+ local r = 1 - c
+ local n = sqrt(axis_x*axis_x+axis_y*axis_y+axis_z*axis_z)
+ axis_x, axis_y, axis_z = axis_x/n, axis_y/n, axis_z/n
+ return
+ (axis_x*axis_x*r+c )*vect_x + (axis_x*axis_y*r-axis_z*s)*vect_y + (axis_x*axis_z*r+axis_y*s)*vect_z,
+ (axis_x*axis_y*r+axis_z*s)*vect_x + (axis_y*axis_y*r+c )*vect_y + (axis_y*axis_z*r-axis_x*s)*vect_z,
+ (axis_x*axis_z*r-axis_y*s)*vect_x + (axis_y*axis_z*r+axis_x*s)*vect_y + (axis_z*axis_z*r+c )*vect_z
+end
+
+local function make3dview(view)
+
+ local name = view.name
+ local name = pdfunicode(name ~= "" and name or "unknown view")
+
+ local viewdict = pdfdictionary {
+ Type = pdfconstant("3DView"),
+ XN = name,
+ IN = name,
+ NR = true,
+ }
+
+ local bg = checkedkey(view,"bg","table")
+ if bg then
+ viewdict.BG = pdfdictionary {
+ Type = pdfconstant("3DBG"),
+ C = pdfarray { limited(bg[1],1,1,1), limited(bg[2],1,1,1), limited(bg[3],1,1,1) },
+ }
+ end
+
+ local lights = checkedkey(view,"lights","string")
+ if lights and schemes[lights] then
+ viewdict.LS = pdfdictionary {
+ Type = pdfconstant("3DLightingScheme"),
+ Subtype = pdfconstant(lights),
+ }
+ end
+
+ -- camera position is taken from 3d model
+
+ local u3dview = checkedkey(view, "u3dview", "string")
+ if u3dview then
+ viewdict.MS = pdfconstant("U3D")
+ viewdict.U3DPath = u3dview
+ end
+
+ -- position the camera as given
+
+ local c2c = checkedkey(view, "c2c", "table")
+ local coo = checkedkey(view, "coo", "table")
+ local roo = checkedkey(view, "roo", "number")
+ local azimuth = checkedkey(view, "azimuth", "number")
+ local altitude = checkedkey(view, "altitude", "number")
+
+ if c2c or coo or roo or azimuth or altitude then
+
+ local pos = checkedkey(view, "pos", "table")
+ local dir = checkedkey(view, "dir", "table")
+ local upv = checkedkey(view, "upv", "table")
+ local roll = checkedkey(view, "roll", "table")
+
+ local coo_x, coo_y, coo_z = 0, 0, 0
+ local dir_x, dir_y, dir_z = 0, 0, 0
+ local trans_x, trans_y, trans_z = 0, 0, 0
+ local left_x, left_y, left_z = 0, 0, 0
+ local up_x, up_y, up_z = 0, 0, 0
+
+ -- point camera is aimed at
+
+ if coo then
+ coo_x, coo_y, coo_z = tonumber(coo[1]) or 0, tonumber(coo[2]) or 0, tonumber(coo[3]) or 0
+ end
+
+ -- distance from camera to target
+
+ if roo then
+ roo = abs(roo)
+ end
+ if not roo or roo == 0 then
+ roo = 0.000000000000000001
+ end
+
+ -- set it via camera position
+
+ if pos then
+ dir_x = coo_x - (tonumber(pos[1]) or 0)
+ dir_y = coo_y - (tonumber(pos[2]) or 0)
+ dir_z = coo_z - (tonumber(pos[3]) or 0)
+ if not roo then
+ roo = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z)
+ end
+ if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+ dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z)
+ end
+
+ -- set it directly
+
+ if dir then
+ dir_x, dir_y, dir_z = tonumber(dir[1] or 0), tonumber(dir[2] or 0), tonumber(dir[3] or 0)
+ if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+ dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z)
+ end
+
+ -- set it movie15 style with vector from target to camera
+
+ if c2c then
+ dir_x, dir_y, dir_z = - tonumber(c2c[1] or 0), - tonumber(c2c[2] or 0), - tonumber(c2c[3] or 0)
+ if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+ dir_x, dir_y, dir_z = normalize(dir_x,dir_y,dir_z)
+ end
+
+ -- set it with azimuth and altitutde
+
+ if altitude or azimuth then
+ dir_x, dir_y, dir_z = -1, 0, 0
+ if altitude then dir_x, dir_y, dir_z = rotate(dir_x,dir_y,dir_z, -altitude, 0,1,0) end
+ if azimuth then dir_x, dir_y, dir_z = rotate(dir_x,dir_y,dir_z, azimuth, 0,0,1) end
+ end
+
+ -- set it with rotation like in MathGL
+
+ if rot then
+ if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_z = -1 end
+ dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[1]) or 0, 1,0,0)
+ dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[2]) or 0, 0,1,0)
+ dir_x,dir_y,dir_z = rotate(dir_x,dir_y,dir_z, tonumber(rot[3]) or 0, 0,0,1)
+ end
+
+ -- set it with default movie15 orientation looking up y axis
+
+ if dir_x == 0 and dir_y == 0 and dir_z == 0 then dir_y = 1 end
+
+ -- left-vector
+ -- up-vector
+
+ if upv then
+ up_x, up_y, up_z = tonumber(upv[1]) or 0, tonumber(upv[2]) or 0, tonumber(upv[3]) or 0
+ else
+ -- set default up-vector
+ if abs(dir_x) == 0 and abs(dir_y) == 0 then
+ if dir_z < 0 then
+ up_y = 1 -- top view
+ else
+ up_y = -1 -- bottom view
+ end
+ else
+ -- other camera positions than top and bottom, up-vector = up_world - (up_world dot dir) dir
+ up_x, up_y, up_z = - dir_z*dir_x, - dir_z*dir_y, - dir_z*dir_z + 1
+ end
+ end
+
+ -- normalize up-vector
+
+ up_x, up_y, up_z = normalize(up_x,up_y,up_z)
+
+ -- left vector = up x dir
+
+ left_x, left_y, left_z = dir_z*up_y - dir_y*up_z, dir_x*up_z - dir_z*up_x, dir_y*up_x - dir_x*up_y
+
+ -- normalize left vector
+
+ left_x, left_y, left_z = normalize(left_x,left_y,left_z)
+
+ -- apply camera roll
+
+ if roll then
+ local sinroll = sin((roll/180.0)*pi)
+ local cosroll = cos((roll/180.0)*pi)
+ left_x = left_x*cosroll + up_x*sinroll
+ left_y = left_y*cosroll + up_y*sinroll
+ left_z = left_z*cosroll + up_z*sinroll
+ up_x = up_x*cosroll + left_x*sinroll
+ up_y = up_y*cosroll + left_y*sinroll
+ up_z = up_z*cosroll + left_z*sinroll
+ end
+
+ -- translation vector
+
+ trans_x, trans_y, trans_z = coo_x - roo*dir_x, coo_y - roo*dir_y, coo_z - roo*dir_z
+
+ viewdict.MS = pdfconstant("M")
+ viewdict.CO = roo
+ viewdict.C2W = pdfarray {
+ left_x, left_y, left_z,
+ up_x, up_y, up_z,
+ dir_x, dir_y, dir_z,
+ trans_x, trans_y, trans_z,
+ }
+
+ end
+
+ local aac = tonumber(view.aac) -- perspective projection
+ local mag = tonumber(view.mag) -- ortho projection
+
+ if aac and aac > 0 and aac < 180 then
+ viewdict.P = pdfdictionary {
+ Subtype = pdfconstant("P"),
+ PS = pdfconstant("Min"),
+ FOV = aac,
+ }
+ elseif mag and mag > 0 then
+ viewdict.P = pdfdictionary {
+ Subtype = pdfconstant("O"),
+ OS = mag,
+ }
+ end
+
+ local mode = modes[view.rendermode]
+ if mode then
+ pdfdictionary {
+ Type = pdfconstant("3DRenderMode"),
+ Subtype = pdfconstant(mode),
+ }
+ end
+
+ -- crosssection
+
+ local crosssection = checkedkey(view,"crosssection","table")
+ if crosssection then
+ local crossdict = pdfdictionary {
+ Type = pdfconstant("3DCrossSection")
+ }
+
+ local c = checkedkey(crosssection,"point","table") or checkedkey(crosssection,"center","table")
+ if c then
+ crossdict.C = pdfarray { tonumber(c[1]) or 0, tonumber(c[2]) or 0, tonumber(c[3]) or 0 }
+ end
+
+ local normal = checkedkey(crosssection,"normal","table")
+ if normal then
+ local x, y, z = tonumber(normal[1] or 0), tonumber(normal[2] or 0), tonumber(normal[3] or 0)
+ if sqrt(x*x + y*y + z*z) == 0 then
+ x, y, z = 1, 0, 0
+ end
+ crossdict.O = pdfarray {
+ pdfnull,
+ atan2(-z,sqrt(x*x + y*y))*180/pi,
+ atan2(y,x)*180/pi,
+ }
+ end
+
+ local orient = checkedkey(crosssection,"orient","table")
+ if orient then
+ crossdict.O = pdfarray {
+ tonumber(orient[1]) or 1,
+ tonumber(orient[2]) or 0,
+ tonumber(orient[3]) or 0,
+ }
+ end
+
+ crossdict.IV = cross.intersection or false
+ crossdict.ST = cross.transparent or false
+
+ viewdict.SA = next(crossdict) and pdfarray { crossdict } -- maybe test if # > 1
+ end
+
+ local nodes = checkedkey(view,"nodes","table")
+ if nodes then
+ local nodelist = pdfarray()
+ for i=1,#nodes do
+ local node = checkedkey(nodes,i,"table")
+ if node then
+ local position = checkedkey(node,"position","table")
+ nodelist[#nodelist+1] = pdfdictionary {
+ Type = pdfconstant("3DNode"),
+ N = node.name or ("node_" .. i), -- pdfunicode ?
+ M = position and #position == 12 and pdfarray(position),
+ V = node.visible or true,
+ O = node.opacity or 0,
+ RM = pdfdictionary {
+ Type = pdfconstant("3DRenderMode"),
+ Subtype = pdfconstant(node.rendermode or "Solid"),
+ },
+ }
+ end
+ end
+ viewdict.NA = nodelist
+ end
+
+ return viewdict
+
+end
+
+local stored_js, stored_3d, stored_pr, streams = { }, { }, { }, { }
+
+function backends.pdf.helpers.insert3d(spec) -- width, height, factor, display, controls, label, foundname
+
+ local width, height, factor = spec.width, spec.height, spec.factor or number.dimenfactors.bp
+ local display, controls, label, foundname = spec.display, spec.controls, spec.label, spec.foundname
+
+ local param = (display and parametersets[display]) or { }
+ local streamparam = (controls and parametersets[controls]) or { }
+ local name = "3D Artwork " .. (param.name or label or "Unknown")
+
+ local activationdict = pdfdictionary {
+ TB = pdfboolean(param.toolbar,true),
+ NP = pdfboolean(param.tree,false),
+ }
+
+ local stream = streams[label]
+ if not stream then
+
+ local subtype, subdata = "U3D", io.loaddata(foundname) or ""
+ if find(subdata,"^PRC") then
+ subtype = "PRC"
+ elseif find(subdata,"^U3D") then
+ subtype = "U3D"
+ elseif file.extname(foundname) == "prc" then
+ subtype = "PRC"
+ end
+
+ local attr = pdfdictionary {
+ Type = pdfconstant("3D"),
+ Subtype = pdfconstant(subtype),
+ }
+ local streamviews = checkedkey(streamparam, "views", "table")
+ if streamviews then
+ local list = pdfarray()
+ for i=1,#streamviews do
+ local v = checkedkey(streamviews, i, "table")
+ if v then
+ list[#list+1] = make3dview(v)
+ end
+ end
+ attr.VA = list
+ end
+ if checkedkey(streamparam, "view", "table") then
+ attr.DV = make3dview(streamparam.view)
+ elseif checkedkey(streamparam, "view", "string") then
+ attr.DV = streamparam.view
+ end
+ local js = checkedkey(streamparam, "js", "string")
+ if js then
+ local jsref = stored_js[js]
+ if not jsref then
+ jsref = pdfimmediateobj("streamfile",js)
+ stored_js[js] = jsref
+ end
+ attr.OnInstantiate = pdfreference(jsref)
+ end
+ stored_3d[label] = pdfimmediateobj("streamfile",foundname,attr())
+ stream = 1
+ else
+ stream = stream + 1
+ end
+ streams[label] = stream
+
+ local name = pdfunicode(name)
+
+ local annot = pdfdictionary {
+ Subtype = pdfconstant("3D"),
+ T = name,
+ Contents = name,
+ NM = name,
+ ["3DD"] = pdfreference(stored_3d[label]),
+ ["3DA"] = activationdict,
+ }
+ if checkedkey(param,"view","table") then
+ annot["3DV"] = make3dview(param.view)
+ elseif checkedkey(param,"view","string") then
+ annot["3DV"] = param.view
+ end
+
+ local preview = checkedkey(param,"preview","string")
+ if preview then
+ activationdict.A = pdfconstant("XA")
+ local tag = format("%s:%s:%s",label,stream,preview)
+ local ref = stored_pr[tag]
+ if not ref then
+ local figure = img.immediatewrite {
+ filename = preview,
+ width = width,
+ height = height
+ }
+ -- local figure = img.immediatewrite {
+ -- stream = ".5 .75 .75 rg 0 0 20 10 re f",
+ -- bbox = { 0, 0, 20, 10 }
+ -- }
+ ref = figure.objnum
+ stored_pr[tag] = ref
+ end
+ if ref then
+ local zero, one = pdfnumber(0), pdfnumber(1) -- not really needed
+ local pw = pdfdictionary {
+ Type = pdfconstant("XObject"),
+ Subtype = pdfconstant("Form"),
+ FormType = one,
+ BBox = pdfarray { zero, zero, pdfnumber(factor*width), pdfnumber(factor*height) },
+ Matrix = pdfarray { one, zero, zero, one, zero, zero },
+ Resources = pdfdictionary {
+ XObject = pdfdictionary {
+ IM = pdfreference(ref)
+ }
+ },
+ ExtGState = pdfdictionary {
+ GS = pdfdictionary {
+ Type = pdfconstant("ExtGState"),
+ CA = one,
+ ca = one,
+ }
+ },
+ ProcSet = pdfarray { pdfconstant("PDF"), pdfconstant("ImageC") },
+ }
+ local pwd = pdfimmediateobj(
+ "stream",
+ format("q /GS gs %s 0 0 %s 0 0 cm /IM Do Q",
+ factor*width,factor*height),
+ pw()
+ )
+ annot.AP = pdfdictionary {
+ N = pdfreference(pwd)
+ }
+ end
+ return annot, figure, ref
+ else
+ activationdict.A = pdfconstant("PV")
+ return annot, nil, nil
+ end
+end
diff --git a/tex/context/base/lpdf-wid.lua b/tex/context/base/lpdf-wid.lua
new file mode 100644
index 000000000..40a81e7d4
--- /dev/null
+++ b/tex/context/base/lpdf-wid.lua
@@ -0,0 +1,355 @@
+if not modules then modules = { } end modules ['lpdf-wid'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, gmatch, gsub, find = string.format, string.gmatch, string.gsub, string.find
+local texsprint, ctxcatcodes, texbox, texcount = tex.sprint, tex.ctxcatcodes, tex.box, tex.count
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+local executers = jobreferences.executers
+local variables = interfaces.variables
+
+local pdfconstant = lpdf.constant
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfstring = lpdf.string
+local pdfcolorspec = lpdf.colorspec
+local pdfflushobject = lpdf.flushobject
+local pdfreserveobject = lpdf.reserveobject
+
+local pdfreserveobj = pdf.reserveobj
+local pdfimmediateobj = pdf.immediateobj
+
+local pdfannotation = nodes.pdfannotation
+
+local hpack_node, write_node = node.hpack, node.write
+
+-- symbols
+
+local presets = { } -- xforms
+
+function codeinjections.registersymbol(name,n)
+ presets[name] = pdfreference(n)
+end
+
+function codeinjections.registeredsymbol(name)
+ return presets[name]
+end
+
+function codeinjections.presetsymbol(symbol)
+ if not presets[symbol] then
+ texsprint(ctxcatcodes,format("\\predefinesymbol[%s]",symbol))
+ end
+end
+
+function codeinjections.presetsymbollist(list)
+ if list then
+ for symbol in gmatch(list,"[^, ]+") do
+ codeinjections.presetsymbol(symbol)
+ end
+ end
+end
+
+-- comments
+
+local symbols = {
+ New = pdfconstant("Insert"),
+ Insert = pdfconstant("Insert"),
+ Balloon = pdfconstant("Comment"),
+ Comment = pdfconstant("Comment"),
+ Text = pdfconstant("Note"),
+ Addition = pdfconstant("NewParagraph"),
+ NewParagraph = pdfconstant("NewParagraph"),
+ Help = pdfconstant("Help"),
+ Paragraph = pdfconstant("Paragraph"),
+ Key = pdfconstant("Key"),
+ Graph = pdfconstant("Graph"),
+ Paperclip = pdfconstant("Paperclip"),
+ Attachment = pdfconstant("Attachment"),
+ Tag = pdfconstant("Tag"),
+}
+
+symbols[variables.normal] = pdfconstant("Note")
+
+local nofcomments, usepopupcomments, stripleading = 0, true, true
+
+local function analyzesymbol(symbol)
+ if not symbol or symbol == "" then
+ return symbols.normal, nil
+ elseif symbols[symbol] then
+ return symbols[symbol], nil
+ else
+ local set = aux.settings_to_array(symbol)
+ local normal, down = set[1], set[2]
+ if normal then
+ normal = codeinjections.registeredsymbol(down or normal)
+ end
+ if down then
+ down = codeinjections.registeredsymbol(normal)
+ end
+ if down or normal then
+ return nil, pdfdictionary {
+ N = normal,
+ D = down,
+ }
+ end
+ end
+end
+
+local function analyzelayer(layer)
+ -- todo: (specification.layer ~= "" and pdfreference(specification.layer)) or nil, -- todo: ref to layer
+end
+
+function codeinjections.registercomment(specification)
+ nofcomments = nofcomments + 1
+ local text = buffers.collect(specification.buffer)
+ if stripleading then
+ text = gsub(text,"[\n\r] *","\n")
+ end
+ local name, appearance = analyzesymbol(specification.symbol)
+ local d = pdfdictionary {
+ Subtype = pdfconstant("Text"),
+ Open = specification.open,
+ Contents = pdfunicode(text),
+ T = (specification.title ~= "" and pdfunicode(specification.title)) or nil,
+ C = pdfcolorspec(specification.colormodel,specification.colorvalue),
+ OC = analyzelayer(specification.layer),
+ Name = name,
+ AP = appearance,
+ }
+ -- watch the nice feed back to tex hack
+ if usepopupcomments then
+ local nd = pdfreserveobject()
+ local nc = pdfreserveobject()
+ local c = pdfdictionary {
+ Subtype = pdfconstant("Popup"),
+ Parent = pdfreference(nd),
+ }
+ d.Popup = pdfreference(nc)
+ texbox["commentboxone"] = hpack_node(pdfannotation(0,0,0,d(),nd)) -- current dir
+ texbox["commentboxtwo"] = hpack_node(pdfannotation(specification.width,specification.height,0,c(),nc)) -- current dir
+ else
+ texbox["commentboxone"] = hpack_node(pdfannotation(0,0,0,d())) -- current dir
+ texbox["commentboxtwo"] = nil
+ end
+end
+
+--
+
+local nofattachments, attachments, filestreams = 0, { }, { }
+
+function codeinjections.embedfile(filename)
+ local r = filestreams[filename]
+ if r == false then
+ return nil
+ elseif r then
+ return r
+ elseif not lfs.isfile(filename) then
+ interfaces.showmessage("interactions",5,filename)
+ filestreams[filename] = false
+ return nil
+ else
+ local basename = file.basename(filename)
+ local a = pdfdictionary { Type = pdfconstant("EmbeddedFile") }
+ local f = pdfimmediateobj("streamfile",filename,a())
+ local d = pdfdictionary {
+ Type = pdfconstant("Filespec"),
+ F = pdfstring(newname or basename),
+ UF = pdfstring(newname or basename),
+ EF = pdfdictionary { F = pdfreference(f) },
+ }
+ local r = pdfreference(pdfflushobject(d))
+ filestreams[filename] = r
+ return r
+ end
+end
+
+function codeinjections.attachfile(specification)
+ local attachment = interactions.attachment(specification.label)
+ if not attachment then
+ -- todo: message
+ return
+ end
+ local filename = attachment.filename
+ if not filename or filename == "" then
+ -- todo: message
+ return
+ end
+ nofattachments = nofattachments + 1
+ local label = attachment.label or ""
+ local title = attachment.title or ""
+ local newname = attachment.newname or ""
+ if label == "" then label = filename end
+ if title == "" then title = label end
+ if newname == "" then newname = filename end
+ local aref = attachments[label]
+ if not aref then
+ aref = codeinjections.embedfile(filename,newname)
+ attachments[label] = aref
+ end
+ local name, appearance = analyzesymbol(specification.symbol)
+ local d = pdfdictionary {
+ Subtype = pdfconstant("FileAttachment"),
+ FS = aref,
+ Contents = pdfunicode(title),
+ Name = name,
+ AP = appearance,
+ OC = analyzelayer(specification.layer),
+ C = pdfcolorspec(specification.colormodel,specification.colorvalue),
+ }
+ -- as soon as we can ask for the dimensions of an xform we can
+ -- use them here
+ local width = specification.width or 0
+ local height = specification.height or 0
+ local depth = specification.depth or 0
+ write_node(pdfannotation(width,height,depth,d()))
+end
+
+function codeinjections.attachmentid(filename)
+ return filestreams[filename]
+end
+
+-- rendering stuff
+--
+-- object_1 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >>
+-- object_2 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >>
+-- rendering -> <</Type /Rendition /S /MS [objref_1 objref_2]>>
+--
+-- we only work foreward here
+-- annotation is to be packed at the tex end
+
+-- aiff audio/aiff
+-- au audio/basic
+-- avi video/avi
+-- mid audio/midi
+-- mov video/quicktime
+-- mp3 audio/x-mp3 (mpeg)
+-- mp4 audio/mp4
+-- mp4 video/mp4
+-- mpeg video/mpeg
+-- smil application/smil
+-- swf application/x-shockwave-flash
+
+local ms, mu, mf = { }, { }, { }
+
+local delayed = { }
+
+local function insertrenderingwindow(label,width,height,specification)
+ if options == variables.auto then
+ if openpageaction then
+ -- \handlereferenceactions{\v!StartRendering{#2}}
+ end
+ if closepageaction then
+ -- \handlereferenceactions{\v!StopRendering {#2}}
+ end
+ end
+ local actions = nil
+ if openpage or closepage then
+ actions = pdfdictionary {
+ PO = (openpage and lpdf.pdfaction(openpage )) or nil,
+ PC = (closepage and lpdf.pdfaction(closepage)) or nil,
+ }
+ end
+ local page = tonumber(specification.page) or texcount.realpageno
+ local d = pdfdictionary {
+ Subtype = pdfconstant("Screen"),
+ P = pdfreference(tex.pdfpageref(page)),
+ A = mf[label],
+ Border = pdfarray { 0, 0, 0 } ,
+ AA = actions,
+ }
+ local r = pdfreserveobj("annot")
+ write_node(pdfannotation(width,height,0,d(),r)) -- save ref
+ return pdfreference(r)
+end
+
+local function insertrendering(specification)
+ local label = specification.label
+ if not mf[label] then
+ local filename = specification.filename
+ local isurl = find(filename,"://")
+ local d = pdfdictionary {
+ Type = pdfconstant("Rendition"),
+ S = pdfconstant("MR"),
+ C = pdfdictionary {
+ Type = pdfconstant("MediaClip"),
+ S = pdfconstant("MCD"),
+ N = label,
+ CT = specification.mime,
+ Alt = pdfarray {
+ "", "file not found", -- language id + message
+ },
+ D = pdfdictionary {
+ Type = pdfconstant("Filespec"),
+ F = filename,
+ FS = (isurl and pdfconstant("URL")) or nil,
+ }
+ }
+ }
+ mf[label] = pdfreference(pdfflushobject(d))
+ if not ms[label] then
+ mu[label] = insertrenderingwindow(label,0,0,specification.options)
+ end
+ end
+end
+
+local function insertrenderingobject(specification)
+ local label = specification.label
+ if not mf[label] then
+ local d = pdfdictionary {
+ Type = pdfconstant("Rendition"),
+ S = pdfconstant("MR"),
+ C = pdfdictionary {
+ Type = pdfconstant("MediaClip"),
+ S = pdfconstant("MCD"),
+ N = label,
+ D = pdfreference(unknown), -- not label but objectname, hm
+ }
+ }
+ mf[label] = pdfreference(pdfflushobject(d))
+ if ms[label] then
+ insertrenderingwindow(label,0,0,specification)
+ end
+ end
+end
+
+function codeinjections.insertrenderingwindow(specification)
+ local label = specification.label
+ codeinjections.processrendering(label) -- was check at tex end
+ ms[label] = insertrenderingwindow(label,specification.width,specification.height,specification)
+end
+
+function codeinjections.processrendering(label)
+ local specification = interactions.rendering(label)
+ if specification then
+ if specification.kind == "external" then
+ insertrendering(specification)
+ else
+ insertrenderingobject(specification)
+ end
+ end
+end
+
+local function set(operation,arguments)
+ codeinjections.processrendering(arguments) -- was check at the tex end
+ return pdfdictionary {
+ S = pdfconstant("Rendition"),
+ OP = operation,
+ R = mf[arguments],
+ AN = ms[arguments] or mu[arguments],
+ }
+end
+
+function executers.startrendering (arguments) return set(0,arguments) end
+function executers.stoprendering (arguments) return set(1,arguments) end
+function executers.pauserendering (arguments) return set(2,arguments) end
+function executers.resumerendering(arguments) return set(3,arguments) end
diff --git a/tex/context/base/lpdf-xmp.lua b/tex/context/base/lpdf-xmp.lua
new file mode 100644
index 000000000..c8e7b2b57
--- /dev/null
+++ b/tex/context/base/lpdf-xmp.lua
@@ -0,0 +1,165 @@
+if not modules then modules = { } end modules ['lpdf-xmp'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+ comment = "with help from Peter Rolf",
+}
+
+local format, random, char, gsub, concat = string.format, math.random, string.char, string.gsub, table.concat
+local xmlfillin = xml.fillin
+
+local trace_xmp = false trackers.register("backend.xmp", function(v) trace_xmp = v end)
+
+local pdfdictionary = lpdf.dictionary
+local pdfconstant = lpdf.constant
+
+-- i wonder why this begin end is empty / w (no time now to look into it)
+
+local xpacket = [[
+<?xpacket begin="" id="%s"?>
+
+%s
+
+<?xpacket end="w"?>]]
+
+local mapping = {
+ -- user defined keys (pdfx:)
+ ["ConTeXt.Jobname"] = "rdf:Description/pdfx:ConTeXt.Jobname",
+ ["ConTeXt.Time"] = "rdf:Description/pdfx:ConTeXt.Time",
+ ["ConTeXt.Url"] = "rdf:Description/pdfx:ConTeXt.Url",
+ ["ConTeXt.Version"] = "rdf:Description/pdfx:ConTeXt.Version",
+ ["ID"] = "rdf:Description/pdfx:ID",
+ ["PTEX.Fullbanner"] = "rdf:Description/pdfx:PTEX.Fullbanner",
+ -- Adobe PDF schema
+ ["Keywords"] = "rdf:Description/pdf:Keywords",
+ ["Producer"] = "rdf:Description/pdf:Producer",
+ -- ["Trapped"] = "rdf:Description/pdf:Trapped", -- '/False' in /Info, but 'False' in XMP
+ -- Dublin Core schema
+ ["Author"] = "rdf:Description/dc:creator/rdf:Seq/rdf:li",
+ ["Format"] = "rdf:Description/dc:format", -- optional, but nice to have
+ ["Subject"] = "rdf:Description/dc:description",
+ ["Title"] = "rdf:Description/dc:title/rdf:Alt/rdf:li",
+ -- XMP Basic schema
+ ["CreateDate"] = "rdf:Description/xmp:CreateDate",
+ ["Creator"] = "rdf:Description/xmp:CreatorTool",
+ ["MetadataDate"] = "rdf:Description/xmp:MetadataDate",
+ ["ModifyDate"] = "rdf:Description/xmp:ModifyDate",
+ -- XMP Media Management schema
+ ["DocumentID"] = "rdf:Description/xmpMM:DocumentID",
+ ["InstanceID"] = "rdf:Description/xmpMM:InstanceID",
+ ["RenditionClass"] = "rdf:Description/xmpMM:RenditionClass", -- PDF/X-4
+ ["VersionID"] = "rdf:Description/xmpMM:VersionID", -- PDF/X-4
+ -- additional entries
+ -- PDF/X
+ ["GTS_PDFXVersion"] = "rdf:Description/pdfxid:GTS_PDFXVersion",
+ -- optional entries
+ -- all what is visible in the 'document properties --> additional metadata' window
+ -- XMP Rights Management schema (optional)
+ ["Marked"] = "rdf:Description/xmpRights:Marked",
+ -- ["Owner"] = "rdf:Description/xmpRights:Owner/rdf:Bag/rdf:li", -- maybe useful (not visible)
+ -- ["UsageTerms"] = "rdf:Description/xmpRights:UsageTerms", -- maybe useful (not visible)
+ ["WebStatement"] = "rdf:Description/xmpRights:WebStatement",
+ -- Photoshop PDF schema (optional)
+ ["AuthorsPosition"] = "rdf:Description/photoshop:AuthorsPosition",
+ ["Copyright"] = "rdf:Description/photoshop:Copyright",
+ ["CaptionWriter"] = "rdf:Description/photoshop:CaptionWriter",
+}
+
+-- maybe some day we will load the xmp file at runtime
+
+local xmp, xmpfile, xmpname = nil, nil, "lpdf-xmp.xml"
+
+function lpdf.setxmpfile(name)
+ xmpfile = resolvers.findctxfile(name) or ""
+ if xmpfile == "" then
+ xmpfile = nil
+ end
+end
+
+local function valid_xmp()
+ if not xmp then
+ local xmpfile = xmpfile or resolvers.find_file(xmpname) or ""
+ local xmpdata = (xmpfile ~= "" and io.loaddata(xmpfile)) or ""
+ xmp = xml.convert(xmpdata)
+ end
+ return xmp
+end
+
+function lpdf.addxmpinfo(tag,value,check)
+ local pattern = mapping[tag]
+ if pattern then
+ xmlfillin(xmp or valid_xmp(),pattern,value,check)
+ end
+end
+
+-- redefined
+
+local addtoinfo = lpdf.addtoinfo
+local addxmpinfo = lpdf.addxmpinfo
+
+function lpdf.addtoinfo(tag,pdfvalue,strvalue)
+ addtoinfo(tag,pdfvalue)
+ addxmpinfo(tag,strvalue or gsub(tostring(pdfvalue),"^%((.*)%)$","%1")) -- hack
+end
+
+-- for the do-it-yourselvers
+
+function lpdf.insertxmpinfo(pattern,whatever,prepend)
+ xml.insert(xmp or valid_xmp(),pattern,whatever,prepend)
+end
+
+function lpdf.injectxmpinfo(pattern,whatever,prepend)
+ xml.inject(xmp or valid_xmp(),pattern,whatever,prepend)
+end
+
+-- flushing
+
+local t = { } for i=1,24 do t[i] = random() end
+
+local function flushxmpinfo()
+
+ commands.freezerandomseed(os.clock()) -- hack
+
+ local t = { } for i=1,24 do t[i] = char(96 + random(26)) end
+ local packetid = concat(t)
+ local time = lpdf.timestamp()
+ addxmpinfo("Producer",format("LuaTeX-%0.2f.%s",tex.luatexversion/100,tex.luatexrevision))
+ addxmpinfo("DocumentID",format("uuid:%s",os.uuid()))
+ addxmpinfo("InstanceID",format("uuid:%s",os.uuid()))
+ addxmpinfo("CreatorTool","LuaTeX + ConTeXt MkIV")
+ addxmpinfo("CreateDate",time)
+ addxmpinfo("ModifyDate",time)
+ addxmpinfo("MetadataDate",time)
+ addxmpinfo("PTEX.Fullbanner", tex.pdftexbanner)
+ local blob = xml.tostring(xml.first(xmp or valid_xmp(),"/x:xmpmeta"))
+ local md = pdfdictionary {
+ Subtype = pdfconstant("XML"),
+ Type = pdfconstant("Metadata"),
+ }
+ if trace_xmp then
+ commands.writestatus("system","xmp data flushed (see log file)")
+ texio.write_nl("log","")
+ texio.write("log","\n% ",(gsub(blob,"[\r\n]","\n%% ")),"\n")
+ end
+ blob = format(xpacket,packetid,blob)
+ if tex.pdfcompresslevel > 0 then
+ blob = gsub(blob,">%s+<","><")
+ end
+ local r = pdf.obj {
+ immediate = true,
+ compresslevel = 0,
+ type = "stream",
+ string = blob,
+ attr = md(),
+ }
+ lpdf.addtocatalog("Metadata",lpdf.reference(r))
+
+ commands.defrostrandomseed() -- hack
+
+end
+
+-- his will be enabled when we can inhibit compression for a stream at the lua end
+
+lpdf.registerdocumentfinalizer(flushxmpinfo,1)
diff --git a/tex/context/base/lpdf-xmp.xml b/tex/context/base/lpdf-xmp.xml
new file mode 100644
index 000000000..2947211bd
--- /dev/null
+++ b/tex/context/base/lpdf-xmp.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:creator>
+ <rdf:Seq>
+ <rdf:li/>
+ </rdf:Seq>
+ </dc:creator>
+ <dc:description/>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default"/>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
+ <pdfx:ConTeXt.Jobname/>
+ <pdfx:ConTeXt.Time/>
+ <pdfx:ConTeXt.Url/>
+ <pdfx:ConTeXt.Version/>
+ <pdfx:ID/>
+ <pdfx:PTEX.Fullbanner/>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
+ <xmp:CreateDate/>
+ <xmp:CreatorTool/>
+ <xmp:ModifyDate/>
+ <xmp:MetadataDate/>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Keywords/>
+ <pdf:Producer/>
+ <pdf:Trapped>False</pdf:Trapped>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
+ <xmpMM:DocumentID/>
+ <xmpMM:InstanceID/>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
diff --git a/tex/context/base/luat-bas.mkiv b/tex/context/base/luat-bas.mkiv
new file mode 100644
index 000000000..581a5d95a
--- /dev/null
+++ b/tex/context/base/luat-bas.mkiv
@@ -0,0 +1,65 @@
+%D \module
+%D [ file=luat-bas, % moved from luat-lib,
+%D version=2006.09.11,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Basic \LUA\ Libraries,
+%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}{ConTeXt Lua Macros / Basic Lua Libraries}
+
+%D This will move cq. become configurable. The XML like output is just
+%D an example.
+
+% todo \let\normaleverytoks\everytoks \newtoks\everytoke \normaleverytoks{\the\everytoks}
+
+\chardef\statuswidth=15
+\chardef\statuswrite=16
+
+\newtoks\everywritestring
+
+\def\writedirect {\immediate\write\statuswrite}
+\def\writeline {\writedirect{}}
+\def\writestring#1{\begingroup\the\everywritestring\writedirect{#1}\endgroup}
+
+\ifx\normalwritestatus\undefined \def\normalwritestatus#1#2{\writedirect{#1 : #2}} \fi
+
+% Because all libs are also on bytecodes we can start without stub. However,
+% some initializations need to take place before the \TEX\ engine itself
+% kicks in, especially memory settings and so. In due time we might make the
+% stub smaller and just create a configuration startup file.
+
+\registerctxluafile{l-string} {1.001}
+\registerctxluafile{l-lpeg} {1.001}
+\registerctxluafile{l-boolean}{1.001}
+\registerctxluafile{l-number} {1.001}
+\registerctxluafile{l-math} {1.001}
+\registerctxluafile{l-table} {1.001}
+\registerctxluafile{l-aux} {1.001}
+\registerctxluafile{l-io} {1.001}
+\registerctxluafile{l-os} {1.001}
+\registerctxluafile{l-file} {1.001}
+\registerctxluafile{l-md5} {1.001}
+\registerctxluafile{l-dir} {1.001}
+\registerctxluafile{l-unicode}{1.001}
+\registerctxluafile{l-utils} {1.001}
+\registerctxluafile{l-dimen} {1.001}
+\registerctxluafile{l-url} {1.001}
+\registerctxluafile{l-set} {1.001}
+\registerctxluafile{l-dimen} {1.001}
+
+% \registerctxluafile{socket.lua}{}
+% \registerctxluafile{ltn12.lua} {}
+% \registerctxluafile{mime.lua} {}
+% \registerctxluafile{http.lua} {}
+% \registerctxluafile{url.lua} {}
+% \registerctxluafile{tp.lua} {}
+% \registerctxluafile{ftp.lua} {}
+% %registerctxluafile{smtp.lua} {}
+
+\endinput
diff --git a/tex/context/base/luat-cbk.lua b/tex/context/base/luat-cbk.lua
new file mode 100644
index 000000000..3cb63ad6e
--- /dev/null
+++ b/tex/context/base/luat-cbk.lua
@@ -0,0 +1,247 @@
+if not modules then modules = { } end modules ['luat-cbk'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local insert, remove, find = table.insert, table.remove, string.find
+local collectgarbage, type, next = collectgarbage, type, next
+local round = math.round
+
+local trace_checking = false trackers.register("memory.checking", function(v) trace_checking = v end)
+
+--[[ldx--
+<p>Callbacks are the real asset of <l n='luatex'/>. They permit you to hook
+your own code into the <l n='tex'/> engine. Here we implement a few handy
+auxiliary functions.</p>
+--ldx]]--
+
+callbacks = callbacks or { }
+
+--[[ldx--
+<p>When you (temporarily) want to install a callback function, and after a
+while wants to revert to the original one, you can use the following two
+functions.</p>
+--ldx]]--
+
+local trace_callbacks = false trackers.register("system.callbacks", function(v) trace_callbacks = v end)
+
+local register_callback, find_callback = callback.register, callback.find
+local frozen, stack = { }, { }
+
+callback.original_register_callback = register_callback
+
+local function frozen_message(what,name)
+ logs.report("callbacks","not %s frozen '%s' (%s)",what,name,frozen[name])
+end
+
+local function frozen_callback(name)
+ return nil, format("callback '%s' is frozen (%s)",name,frozen[name])
+end
+
+local function state(name)
+ local f = find_callback(name)
+ if f == false then
+ return "disabled"
+ elseif f then
+ return "enabled"
+ else
+ return "undefined"
+ end
+end
+
+function callbacks.report()
+ local list = callback.list()
+ for name, func in table.sortedhash(list) do
+ local str = frozen[name]
+ if str then
+ logs.report("callbacks","%s: %s -> %s",state(name),name,str)
+ else
+ logs.report("callbacks","%s: %s",state(name),name)
+ end
+ end
+end
+
+function callbacks.table()
+ local NC, NR, verbatim = context.NC, context.NR, context.type
+ context.starttabulate { "|l|l|p|" }
+ for name, func in table.sortedhash(callback.list()) do
+ NC() verbatim(name) NC() verbatim(state(name)) NC() context(frozen[name] or "") NC() NR()
+ end
+ context.stoptabulate()
+end
+
+function callbacks.freeze(name,freeze)
+ freeze = type(freeze) == "string" and freeze
+--~ print(name)
+ if find(name,"%*") then
+ local pattern = name -- string.simpleesc(name)
+ local list = callback.list()
+ for name, func in next, list do
+ if find(name,pattern) then
+ frozen[name] = freeze or frozen[name] or "frozen"
+ end
+ end
+ else
+ frozen[name] = freeze or frozen[name] or "frozen"
+ end
+end
+
+function callbacks.register(name,func,freeze)
+ if frozen[name] then
+ if trace_callbacks then
+ frozen_message("registering",name)
+ end
+ return frozen_callback(name)
+ elseif freeze then
+ frozen[name] = (type(freeze) == "string" and freeze) or "registered"
+ end
+ return register_callback(name,func)
+end
+
+function callback.register(name,func) -- original
+ if not frozen[name] then
+ return register_callback(name,func)
+ elseif trace_callbacks then
+ frozen_message("registering",name)
+ end
+ return frozen_callback(name)
+end
+
+function callbacks.push(name, func)
+ if not frozen[name] then
+ local sn = stack[name]
+ if not sn then
+ sn = { }
+ stack[name] = sn
+ end
+ insert(sn,find_callback(name))
+ register_callback(name, func)
+ elseif trace_callbacks then
+ frozen_message("pushing",name)
+ end
+end
+
+function callbacks.pop(name)
+ if not frozen[name] then
+ local sn = stack[name]
+ if not sn or #sn == 0 then
+ -- some error
+ register_callback(name, nil) -- ! really needed
+ else
+ -- this fails: register_callback(name, remove(stack[name]))
+ local func = remove(sn)
+ register_callback(name, func)
+ end
+ end
+end
+
+--~ -- somehow crashes later on
+--~
+--~ callbacks.freeze("find_.*_file","finding file")
+--~ callbacks.freeze("read_.*_file","reading file")
+--~ callbacks.freeze("open_.*_file","opening file")
+
+--[[ldx--
+<p>The simple case is to remove the callback:</p>
+
+<code>
+callbacks.push('linebreak_filter')
+... some actions ...
+callbacks.pop('linebreak_filter')
+</code>
+
+<p>Often, in such case, another callback or a macro call will pop
+the original.</p>
+
+<p>In practice one will install a new handler, like in:</p>
+
+<code>
+callbacks.push('linebreak_filter', function(...)
+ return something_done(...)
+end)
+</code>
+
+<p>Even more interesting is:</p>
+
+<code>
+callbacks.push('linebreak_filter', function(...)
+ callbacks.pop('linebreak_filter')
+ return something_done(...)
+end)
+</code>
+
+<p>This does a one-shot.</p>
+--ldx]]--
+
+--[[ldx--
+<p>Callbacks may result in <l n='lua'/> doing some hard work
+which takes time and above all resourses. Sometimes it makes
+sense to disable or tune the garbage collector in order to
+keep the use of resources acceptable.</p>
+
+<p>At some point in the development we did some tests with counting
+nodes (in this case 121049).</p>
+
+<table>
+<tr><td>setstepmul</td><td>seconds</td><td>megabytes</td></tr>
+<tr><td>200</td><td>24.0</td><td>80.5</td></tr>
+<tr><td>175</td><td>21.0</td><td>78.2</td></tr>
+<tr><td>150</td><td>22.0</td><td>74.6</td></tr>
+<tr><td>160</td><td>22.0</td><td>74.6</td></tr>
+<tr><td>165</td><td>21.0</td><td>77.6</td></tr>
+<tr><td>125</td><td>21.5</td><td>89.2</td></tr>
+<tr><td>100</td><td>21.5</td><td>88.4</td></tr>
+</table>
+
+<p>The following code is kind of experimental. In the documents
+that describe the development of <l n='luatex'/> we report
+on speed tests. One observation is thta it sometimes helps to
+restart the collector. Okay, experimental code has been removed,
+because messing aroudn with the gc is too unpredictable.</p>
+--ldx]]--
+
+garbagecollector = garbagecollector or { }
+
+garbagecollector.enabled = false
+garbagecollector.criterium = 4*1024*1024
+
+-- 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.
+
+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 trace_checking then
+ 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
+ end
+ end
+end
diff --git a/tex/context/base/luat-cnf.lua b/tex/context/base/luat-cnf.lua
new file mode 100644
index 000000000..e45aceb79
--- /dev/null
+++ b/tex/context/base/luat-cnf.lua
@@ -0,0 +1,115 @@
+if not modules then modules = { } end modules ['luat-cnf'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, concat, find = string.format, table.concat, string.find
+
+luatex = luatex or { }
+
+luatex.variablenames = {
+ 'main_memory', 'extra_mem_bot', 'extra_mem_top',
+ 'buf_size','expand_depth',
+ 'font_max', 'font_mem_size',
+ 'hash_extra', 'max_strings', 'pool_free', 'pool_size', 'string_vacancies',
+ 'obj_tab_size', 'pdf_mem_size', 'dest_names_size',
+ 'nest_size', 'param_size', 'save_size', 'stack_size','expand_depth',
+ 'trie_size', 'hyph_size', 'max_in_open',
+ 'ocp_stack_size', 'ocp_list_size', 'ocp_buf_size',
+ 'max_print_line',
+}
+
+function luatex.variables()
+ local t, x = { }, nil
+ for _,v in next, luatex.variablenames do
+ x = resolvers.var_value(v)
+ if x and find(x,"^%d+$") then
+ t[v] = tonumber(x)
+ end
+ end
+ return t
+end
+
+if not luatex.variables_set then
+ for k, v in next, luatex.variables() do
+ texconfig[k] = v
+ end
+ luatex.variables_set = true
+end
+
+local stub = [[
+-- checking
+
+storage = storage or { }
+luatex = luatex or { }
+
+-- we provide our own file handling
+
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
+
+-- as soon as possible
+
+luatex.starttime = os.gettimeofday()
+
+-- this will happen after the format is loaded
+
+function texconfig.init()
+
+ -- shortcut and helper
+
+ local b = lua.bytecode
+
+ local function init(start)
+ local i = start
+ while b[i] do
+ b[i]() ; b[i] = nil ; i = i + 1
+ -- collectgarbage('step')
+ end
+ return i - start
+ end
+
+ -- the stored tables and modules
+
+ storage.noftables = init(0)
+ storage.nofmodules = init(%s)
+
+end
+
+-- we provide a qualified path
+
+callback.register('find_format_file',function(name)
+ texconfig.formatname = name
+ return name
+end)
+
+-- done, from now on input and callbacks are internal
+]]
+
+function luatex.dumpstate(name,firsttable)
+ if tex and tex.luatexversion < 38 then
+ os.remove(name)
+ elseif true then
+ local t = {
+ "-- this file is generated, don't change it\n",
+ "-- configuration (can be overloaded later)\n"
+ }
+ for _,v in next, luatex.variablenames do
+ local tv = texconfig[v]
+ if tv then
+ t[#t+1] = format("texconfig.%s=%s",v,tv)
+ end
+ end
+ io.savedata(name,format("%s\n\n%s",concat(t,"\n"),format(stub,firsttable or 501)))
+ else
+ io.savedata(name,format(stub,firsttable or 501))
+ end
+end
+
+texconfig.kpse_init = false
+texconfig.max_print_line = 100000
+texconfig.max_in_open = 127
+texconfig.shell_escape = 't'
diff --git a/tex/context/base/luat-cod.mkiv b/tex/context/base/luat-cod.mkiv
new file mode 100644
index 000000000..d3b37d0e1
--- /dev/null
+++ b/tex/context/base/luat-cod.mkiv
@@ -0,0 +1,161 @@
+%D \module
+%D [ file=luat-cod,
+%D version=2005.05.26,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Code,
+%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}{ConTeXt Lua Macros / Code}
+
+%D Originally we compiled the lua files externally and loaded
+%D then at runtime, but when the amount grew, we realized that
+%D we needed away to store them in the format, which is what
+%D bytecode arrays do. And so the following is obsolete:
+%D
+%D \starttyping
+%D \chardef\ctxluaembeddingmode \plusone
+%D
+%D 0 = external compilation and loading
+%D 1 = runtime compilation and embedding
+%D \stoptyping
+%D
+%D Allocation of \LUA\ engines has changed too. The original idea
+%D was to have multiple \LUA\ instances and it worked that way for
+%D several years. Hoewver in practice we used only one engine because
+%D scripts need to share data anyway. So eventually \LUATEX\ got only
+%D one instance. Because each call is reentrant there is not much
+%D danger for crashes.
+
+\def\ctxdirectlua{\directlua\zerocount}
+\def\ctxlatelua {\latelua \zerocount}
+
+%D Take your choice \unknown
+
+\let\ctxlua \ctxdirectlua
+\let\luacode \ctxdirectlua
+\let\lateluacode \ctxlatelua
+\let\directluacode\ctxdirectlua
+
+%D Reporting the version of \LUA\ that we use is done as follows:
+
+\edef\luaversion{\ctxlua{tex.print(_VERSION)}}
+
+%D We want to define \LUA\ related things in the format but
+%D need to reload code because \LUA\ instances themselves are
+%D not dumped into the format.
+
+\newtoks\everyloadluacode
+\newtoks\everyfinalizeluacode
+
+\normaleveryjob{\the\everyloadluacode\the\everyfinalizeluacode\the\everyjob}
+
+\newif\ifproductionrun
+
+%D Here we operate in the \TEX\ catcode regime as we haven't yet defined
+%D catcode regimes. A chicken or egg problem.
+
+\normalprotected\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init)
+ {\ifproductionrun
+ \global\let\startruntimeluacode\relax
+ \global\let\stopruntimeluacode \relax
+ \else
+ \global\everyloadluacode\expandafter{\the\everyloadluacode#1}%
+ \fi
+ #1} % maybe no interference
+
+\normalprotected\long\def\startruntimectxluacode#1\stopruntimectxluacode
+ {\startruntimeluacode\ctxlua{#1}\stopruntimeluacode}
+
+%D Next we load the initialization code.
+
+\startruntimectxluacode
+ environment = environment or { }
+ environment.jobname = "\jobname" % tex.jobname
+ environment.initex = \ifproductionrun false \else true \fi % tex.formatname == ""
+ environment.version = "\fmtversion"
+\stopruntimectxluacode
+
+% we start at 500, below this, we store predefined data (dumps)
+
+\newcount\luabytecodecounter \luabytecodecounter=500
+
+\startruntimectxluacode
+ lua.bytedata = lua.bytedata or { }
+\stopruntimectxluacode
+
+%D Handy when we expand:
+
+\let\stopruntimeluacode \relax
+\let\stopruntimectxluacode\relax
+
+\long\def\lastexpanded{} % todo: elsewhere we use \@@expanded
+
+\long\def\expanded#1{\long\xdef\lastexpanded{\noexpand#1}\lastexpanded}
+
+%D More code:
+
+% \def\ctxluabytecode#1% executes an already loaded chunk
+% {\ctxlua {
+% local str = ''
+% if lua.bytedata[#1] then
+% str = " from file " .. lua.bytedata[#1][1] .. " version " .. lua.bytedata[#1][2]
+% end
+% if lua.bytecode[#1] then
+% if environment.initex then
+% texio.write_nl("bytecode: executing blob " .. "#1" .. str)
+% assert(lua.bytecode[#1])()
+% else
+% texio.write_nl("bytecode: initializing blob " .. "#1" .. str)
+% assert(lua.bytecode[#1])()
+% lua.bytecode[#1] = nil
+% end
+% else
+% texio.write_nl("bytecode: invalid blob " .. "#1" .. str)
+% end
+% }}
+
+\def\ctxluabytecode#1% executes an already loaded chunk
+ {\ctxlua {
+ local lbc = lua.bytecode
+ if lbc[#1] then
+ assert(lbc[#1])()
+ if not environment.initex then
+ lbc[#1] = nil
+ end
+ end
+ }}
+
+\def\ctxluabyteload#1#2% registers and compiles chunk
+ {\global\advance\luabytecodecounter \plusone
+ \normalexpanded{\startruntimectxluacode
+ lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" }
+ \stopruntimectxluacode}%
+ \ctxlua {
+ lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" }
+ lua.bytecode[\the\luabytecodecounter] = environment.luafilechunk("#1")
+ }}
+
+\def\ctxloadluafile#1#2% load a (either not compiled) chunk at runtime
+ {\doifelsenothing{#2}
+ {\ctxlua{environment.loadluafile("#1")}}
+ {\ctxlua{environment.loadluafile("#1",#2)}}}
+
+\def\registerctxluafile#1#2% name version (modules and core code)
+ {\ifproductionrun
+ \ctxloadluafile{#1}{#2}%
+ \else
+ \ctxluabyteload{#1}{#2}% can go away
+ \fi
+ \global\everyloadluacode\expandafter\expandafter\expandafter{\expandafter\the\expandafter\everyloadluacode
+ \expandafter\ctxluabytecode\expandafter{\the\luabytecodecounter}}%
+ \ctxluabytecode{\the\luabytecodecounter}}
+
+\everydump\expandafter{\the\everydump\ctxlua{luatex.dumpstate(environment.jobname..".lui",501)}}
+
+\endinput
diff --git a/tex/context/base/luat-dum.lua b/tex/context/base/luat-dum.lua
new file mode 100644
index 000000000..4530c2ef3
--- /dev/null
+++ b/tex/context/base/luat-dum.lua
@@ -0,0 +1,126 @@
+if not modules then modules = { } end modules ['luat-dum'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local dummyfunction = function() end
+
+statistics = {
+ register = dummyfunction,
+ starttiming = dummyfunction,
+ stoptiming = dummyfunction,
+}
+directives = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+trackers = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+experiments = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+storage = {
+ register = dummyfunction,
+ shared = { },
+}
+logs = {
+ report = dummyfunction,
+ simple = dummyfunction,
+}
+tasks = {
+ new = dummyfunction,
+ actions = dummyfunction,
+ appendaction = dummyfunction,
+ prependaction = dummyfunction,
+}
+callbacks = {
+ register = function(n,f) return callback.register(n,f) end,
+}
+
+-- we need to cheat a bit here
+
+texconfig.kpse_init = true
+
+resolvers = resolvers or { } -- no fancy file helpers used
+
+local remapper = {
+ otf = "opentype fonts",
+ ttf = "truetype fonts",
+ ttc = "truetype fonts",
+ dfont = "truetype dictionary",
+ cid = "cid maps",
+ fea = "font feature files",
+}
+
+function resolvers.find_file(name,kind)
+ name = string.gsub(name,"\\","\/")
+ kind = string.lower(kind)
+ return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or file.extname(name,"tex"))
+end
+
+function resolvers.findbinfile(name,kind)
+ if not kind or kind == "" then
+ kind = file.extname(name) -- string.match(name,"%.([^%.]-)$")
+ end
+ return resolvers.find_file(name,(kind and remapper[kind]) or kind)
+end
+
+-- Caches ... I will make a real stupid version some day when I'm in the
+-- mood. After all, the generic code does not need the more advanced
+-- ConTeXt features. Cached data is not shared between ConTeXt and other
+-- usage as I don't want any dependency at all. Also, ConTeXt might have
+-- different needs and tricks added.
+
+caches = { }
+
+--~ containers.usecache = true
+
+function caches.setpath(category,subcategory)
+ local root = kpse.var_value("TEXMFCACHE") or ""
+ if root == "" then
+ root = kpse.var_value("VARTEXMF") or ""
+ end
+ if root ~= "" then
+ root = file.join(root,category)
+ lfs.mkdir(root)
+ root = file.join(root,subcategory)
+ lfs.mkdir(root)
+ return lfs.isdir(root) and root
+ end
+end
+
+local function makefullname(path,name)
+ if path and path ~= "" then
+ name = "temp-" and name -- clash prevention
+ return file.addsuffix(file.join(path,name),"lua")
+ end
+end
+
+function caches.iswritable(path,name)
+ local fullname = makefullname(path,name)
+ return fullname and file.iswritable(fullname)
+end
+
+function caches.loaddata(path,name)
+ local fullname = makefullname(path,name)
+ if fullname then
+ local data = loadfile(fullname)
+ return data and data()
+ end
+end
+
+function caches.savedata(path,name,data)
+ local fullname = makefullname(path,name)
+ if fullname then
+ table.tofile(fullname,data,'return',false,true,false)
+ end
+end
diff --git a/tex/context/base/luat-env.lua b/tex/context/base/luat-env.lua
new file mode 100644
index 000000000..0e21fca31
--- /dev/null
+++ b/tex/context/base/luat-env.lua
@@ -0,0 +1,283 @@
+if not modules then modules = { } end modules ['luat-env'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- A former version provided functionality for non embeded core
+-- scripts i.e. runtime library loading. Given the amount of
+-- Lua code we use now, this no longer makes sense. Much of this
+-- evolved before bytecode arrays were available and so a lot of
+-- code has disappeared already.
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find
+local unquote, quote = string.unquote, string.quote
+
+-- precautions
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+function os.setlocale()
+ -- no way you can mess with it
+end
+
+-- dirty tricks
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
+end
+
+if profiler and os.env["MTX_PROFILE_RUN"] == "YES" then
+ profiler.start("luatex-profile.log")
+end
+
+-- environment
+
+environment = environment or { }
+environment.arguments = { }
+environment.files = { }
+environment.sortedflags = nil
+
+if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end
+if not environment.version or environment.version == "" then environment.version = "unknown" end
+if not environment.jobname then environment.jobname = "unknown" end
+
+function environment.initialize_arguments(arg)
+ local arguments, files = { }, { }
+ environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
+ for index=1,#arg do
+ local argument = arg[index]
+ if index > 0 then
+ local flag, value = match(argument,"^%-+(.-)=(.-)$")
+ if flag then
+ arguments[flag] = unquote(value or "")
+ else
+ flag = match(argument,"^%-+(.+)")
+ if flag then
+ arguments[flag] = true
+ else
+ files[#files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.setargument(name,value)
+ environment.arguments[name] = value
+end
+
+-- todo: defaults, better checks e.g on type (boolean versus string)
+--
+-- tricky: too many hits when we support partials unless we add
+-- a registration of arguments so from now on we have 'partial'
+
+function environment.argument(name,partial)
+ local arguments, sortedflags = environment.arguments, environment.sortedflags
+ if arguments[name] then
+ return arguments[name]
+ elseif partial then
+ if not sortedflags then
+ sortedflags = table.sortedkeys(arguments)
+ for k=1,#sortedflags do
+ sortedflags[k] = "^" .. sortedflags[k]
+ end
+ environment.sortedflags = sortedflags
+ end
+ -- example of potential clash: ^mode ^modefile
+ for k=1,#sortedflags do
+ local v = sortedflags[k]
+ if find(name,v) then
+ return arguments[sub(v,2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+environment.argument("x",true)
+
+function environment.split_arguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ local original_arguments = environment.original_arguments
+ for k=1,#original_arguments do
+ local v = original_arguments[k]
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstruct_commandline(arg,noquote)
+ arg = arg or environment.original_arguments
+ if noquote and #arg == 1 then
+ local a = arg[1]
+ a = resolvers.resolve(a)
+ a = unquote(a)
+ return a
+ elseif #arg > 0 then
+ local result = { }
+ for i=1,#arg do
+ local a = arg[i]
+ a = resolvers.resolve(a)
+ a = unquote(a)
+ a = gsub(a,'"','\\"') -- tricky
+ if find(a," ") then
+ result[#result+1] = quote(a)
+ else
+ result[#result+1] = a
+ end
+ end
+ return table.join(result," ")
+ else
+ return ""
+ end
+end
+
+if arg then
+
+ -- new, reconstruct quoted snippets (maybe better just remove the " then and add them later)
+ local newarg, instring = { }, false
+
+ for index=1,#arg do
+ local argument = arg[index]
+ if find(argument,"^\"") then
+ newarg[#newarg+1] = gsub(argument,"^\"","")
+ if not find(argument,"\"$") then
+ instring = true
+ end
+ elseif find(argument,"\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
+ 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
+
+-- weird place ... depends on a not yet loaded module
+
+function environment.texfile(filename)
+ return resolvers.find_file(filename,'tex')
+end
+
+function environment.luafile(filename)
+ local resolved = resolvers.find_file(filename,'tex') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ resolved = resolvers.find_file(filename,'texmfscripts') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ return resolvers.find_file(filename,'luatexlibs') or ""
+end
+
+environment.loadedluacode = loadfile -- can be overloaded
+
+--~ function environment.loadedluacode(name)
+--~ if os.spawn("texluac -s -o texluac.luc " .. name) == 0 then
+--~ local chunk = loadstring(io.loaddata("texluac.luc"))
+--~ os.remove("texluac.luc")
+--~ return chunk
+--~ else
+--~ environment.loadedluacode = loadfile -- can be overloaded
+--~ return loadfile(name)
+--~ end
+--~ end
+
+function environment.luafilechunk(filename) -- used for loading lua bytecode in the format
+ filename = file.replacesuffix(filename, "lua")
+ local fullname = environment.luafile(filename)
+ if fullname and fullname ~= "" then
+ if trace_locating then
+ logs.report("fileio","loading file %s", fullname)
+ end
+ return environment.loadedluacode(fullname)
+ else
+ if trace_locating then
+ logs.report("fileio","unknown file %s", filename)
+ end
+ return nil
+ end
+end
+
+-- the next ones can use the previous ones / combine
+
+function environment.loadluafile(filename, version)
+ local lucname, luaname, chunk
+ local basename = file.removesuffix(filename)
+ if basename == filename then
+ lucname, luaname = basename .. ".luc", basename .. ".lua"
+ else
+ lucname, luaname = nil, basename -- forced suffix
+ end
+ -- when not overloaded by explicit suffix we look for a luc file first
+ local fullname = (lucname and environment.luafile(lucname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ logs.report("fileio","loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ end
+ if chunk then
+ assert(chunk)()
+ if version then
+ -- we check of the version number of this chunk matches
+ local v = version -- can be nil
+ if modules and modules[filename] then
+ v = modules[filename].version -- new method
+ elseif versions and versions[filename] then
+ v = versions[filename] -- old method
+ end
+ if v == version then
+ return true
+ else
+ if trace_locating then
+ logs.report("fileio","version mismatch for %s: lua=%s, luc=%s", filename, v, version)
+ end
+ environment.loadluafile(filename)
+ end
+ else
+ return true
+ end
+ end
+ fullname = (luaname and environment.luafile(luaname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ logs.report("fileio","loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ if not chunk then
+ if trace_locating then
+ logs.report("fileio","unknown file %s", filename)
+ end
+ else
+ assert(chunk)()
+ return true
+ end
+ end
+ return false
+end
diff --git a/tex/context/base/luat-exe.lua b/tex/context/base/luat-exe.lua
new file mode 100644
index 000000000..ca3b75162
--- /dev/null
+++ b/tex/context/base/luat-exe.lua
@@ -0,0 +1,71 @@
+if not modules then modules = { } end modules ['luat-exe'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local match, find = string.match, string.find
+local concat = table.concat
+
+if not executer then executer = { } end
+
+executer.permitted = { }
+executer.execute = os.execute
+
+function executer.register(...)
+ local ep = executer.permitted
+ local t = { ... }
+ for k=1,#t do
+ local v = t[k]
+ ep[#ep+1] = (v == "*" and ".*") or v
+ end
+end
+
+function executer.finalize() -- todo: os.exec, todo: report ipv print
+ local execute = os.execute
+ function executer.execute(...)
+ local t, name, arguments = {...}, "", ""
+ if #t == 1 then
+ if type(t[1]) == 'table' then
+ name, arguments = t[1], concat(t," ",2,#t)
+ else
+ name, arguments = match(t[1],"^(.-)%s+(.+)$")
+ if not (name and arguments) then
+ name, arguments = t[1], ""
+ end
+ end
+ else
+ name, arguments = t[1], concat(t," ",2,#t)
+ end
+ local permitted = executer.permitted
+ for k=1,#permitted do
+ local v = permitted[k]
+ if find(name,v) then
+ execute(name .. " " .. arguments)
+ -- print("executed: " .. name .. " " .. arguments)
+ else
+ print("not permitted: " .. name .. " " .. arguments)
+ end
+ end
+ end
+ function executer.finalize()
+ print("executer is already finalized")
+ end
+ function executer.register(name)
+ print("executer is already finalized")
+ end
+ os.execute = executer.execute
+end
+
+--~ executer.register('.*')
+--~ executer.register('*')
+--~ executer.register('dir','ls')
+--~ executer.register('dir')
+
+--~ executer.finalize()
+--~ executer.execute('dir',"*.tex")
+--~ executer.execute("dir *.tex")
+--~ executer.execute("ls *.tex")
+--~ os.execute('ls')
diff --git a/tex/context/base/luat-fio.lua b/tex/context/base/luat-fio.lua
new file mode 100644
index 000000000..0d1bd1808
--- /dev/null
+++ b/tex/context/base/luat-fio.lua
@@ -0,0 +1,83 @@
+if not modules then modules = { } end modules ['luat-fio'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local texiowrite_nl = (texio and texio.write_nl) or print
+local texiowrite = (texio and texio.write) or print
+
+local format = string.format
+
+texconfig.kpse_init = false
+texconfig.trace_file_names = true -- also influences pdf fonts reporting .. todo
+texconfig.max_print_line = 100000
+
+kpse = { } setmetatable(kpse, { __index = function(k,v) return input[v] end } )
+
+-- if still present, we overload kpse (put it off-line so to say)
+
+if not resolvers.instance then
+
+ resolvers.reset()
+
+ resolvers.instance.progname = 'context'
+ resolvers.instance.engine = 'luatex'
+ resolvers.instance.validfile = resolvers.validctxfile
+
+ resolvers.load()
+
+ if callback then
+
+ callback.register('find_read_file' , function(id,name) return resolvers.findtexfile(name) end)
+ callback.register('open_read_file' , function( name) return resolvers.opentexfile(name) end)
+
+ callback.register('find_data_file' , function(name) return resolvers.findbinfile(name,"tex") end)
+ callback.register('find_enc_file' , function(name) return resolvers.findbinfile(name,"enc") end)
+ callback.register('find_font_file' , function(name) return resolvers.findbinfile(name,"tfm") end)
+ callback.register('find_format_file' , function(name) return resolvers.findbinfile(name,"fmt") end)
+ callback.register('find_image_file' , function(name) return resolvers.findbinfile(name,"tex") end)
+ callback.register('find_map_file' , function(name) return resolvers.findbinfile(name,"map") end)
+ callback.register('find_ocp_file' , function(name) return resolvers.findbinfile(name,"ocp") end)
+ callback.register('find_opentype_file' , function(name) return resolvers.findbinfile(name,"otf") end)
+ callback.register('find_output_file' , function(name) return name end)
+ callback.register('find_pk_file' , function(name) return resolvers.findbinfile(name,"pk") end)
+ callback.register('find_sfd_file' , function(name) return resolvers.findbinfile(name,"sfd") end)
+ callback.register('find_truetype_file' , function(name) return resolvers.findbinfile(name,"ttf") end)
+ callback.register('find_type1_file' , function(name) return resolvers.findbinfile(name,"pfb") end)
+ callback.register('find_vf_file' , function(name) return resolvers.findbinfile(name,"vf") end)
+
+ callback.register('read_data_file' , function(file) return resolvers.loadbinfile(file,"tex") end)
+ callback.register('read_enc_file' , function(file) return resolvers.loadbinfile(file,"enc") end)
+ callback.register('read_font_file' , function(file) return resolvers.loadbinfile(file,"tfm") end)
+ -- format
+ -- image
+ callback.register('read_map_file' , function(file) return resolvers.loadbinfile(file,"map") end)
+ callback.register('read_ocp_file' , function(file) return resolvers.loadbinfile(file,"ocp") end)
+ -- output
+ callback.register('read_pk_file' , function(file) return resolvers.loadbinfile(file,"pk") end) -- 600dpi/manfnt.720pk
+ callback.register('read_sfd_file' , function(file) return resolvers.loadbinfile(file,"sfd") end)
+ callback.register('read_vf_file' , function(file) return resolvers.loadbinfile(file,"vf" ) end)
+
+ callback.register('find_font_file' , function(name) return resolvers.findbinfile(name,"ofm") end)
+ callback.register('find_vf_file' , function(name) return resolvers.findbinfile(name,"ovf") end)
+
+ callback.register('read_font_file' , function(file) return resolvers.loadbinfile(file,"ofm") end)
+ callback.register('read_vf_file' , function(file) return resolvers.loadbinfile(file,"ovf") end)
+
+ -- callback.register('read_opentype_file' , function(file) return resolvers.loadbinfile(file,"otf") end)
+ -- callback.register('read_truetype_file' , function(file) return resolvers.loadbinfile(file,"ttf") end)
+ -- callback.register('read_type1_file' , function(file) return resolvers.loadbinfile(file,"pfb") end)
+
+ callback.register('find_write_file' , function(id,name) return name end)
+ callback.register('find_format_file' , function(name) return name end)
+
+ end
+
+end
+
+statistics.register("input load time", function()
+ return format("%s seconds", statistics.elapsedtime(resolvers.instance))
+end)
diff --git a/tex/context/base/luat-ini.lua b/tex/context/base/luat-ini.lua
new file mode 100644
index 000000000..e6a715c07
--- /dev/null
+++ b/tex/context/base/luat-ini.lua
@@ -0,0 +1,162 @@
+if not modules then modules = { } end modules ['luat-ini'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--~ local ctxcatcodes = tex.ctxcatcodes
+
+--[[ldx--
+<p>We cannot load anything yet. However what we will do us reserve a fewtables.
+These can be used for runtime user data or third party modules and will not be
+cluttered by macro package code.</p>
+--ldx]]--
+
+userdata = userdata or { } -- might be used
+thirddata = thirddata or { } -- might be used
+moduledata = moduledata or { } -- might be used
+document = document or { }
+parametersets = parametersets or { } -- experimental
+
+--[[ldx--
+<p>These can be used/set by the caller program; <t>mtx-context.lua</t> does it.</p>
+--ldx]]--
+
+document.arguments = document.arguments or { }
+document.files = document.files or { }
+
+--[[ldx--
+<p>Please create a namespace within these tables before using them!</p>
+
+<typing>
+userdata ['my.name'] = { }
+thirddata['tricks' ] = { }
+</typing>
+--ldx]]--
+
+--[[ldx--
+<p>We could cook up a readonly model for global tables but it
+makes more sense to invite users to use one of the predefined
+namespaces. One can redefine the protector. After all, it's
+just a lightweight suggestive system, not a watertight
+one.</p>
+--ldx]]--
+
+local debug = require "debug"
+
+local string, table, lpeg, math, io, system = string, table, lpeg, math, io, system
+local next, setfenv = next, setfenv or debug.setfenv
+local format = string.format
+
+local global = _G
+
+global.global = global
+
+local dummy = function() end
+
+local protected = {
+ -- global table
+ global = global,
+ -- user tables
+ userdata = userdata,
+ moduledata = moduledata,
+ thirddata = thirddata,
+ document = document,
+ -- reserved
+ protect = dummy,
+ unprotect = dummy,
+ -- luatex
+ tex = tex,
+ -- lua
+ string = string,
+ table = table,
+ lpeg = lpeg,
+ math = math,
+ io = io,
+ system = system,
+}
+
+userdata, thirddata, moduledata = nil, nil, nil
+
+if not setfenv then
+ texio.write_nl("warning: we need to fix setfenv by using 'load in' or '_ENV'")
+end
+
+function protect(name)
+ if name == "isolateddata" then
+ local t = { }
+ for k, v in next, protected do
+ t[k] = v
+ end
+ setfenv(2,t)
+ else
+ if not name then
+ name = "shareddata"
+ end
+ local t = global[name]
+ if not t then
+ t = { }
+ for k, v in next, protected do
+ t[k] = v
+ end
+ global[name] = t
+ end
+ setfenv(2,t)
+ end
+end
+
+lua.numbers = { }
+lua.messages = { }
+
+function lua.registername(name,message)
+ local lnn = lua.numbers[name]
+ if not lnn then
+ lnn = #lua.messages + 1
+ lua.messages[lnn] = message
+ lua.numbers[name] = lnn
+ end
+ lua.name[lnn] = message
+ tex.write(lnn)
+end
+
+--~ function lua.checknames()
+--~ lua.name[0] = "ctx"
+--~ for k, v in next, lua.messages do
+--~ lua.name[k] = v
+--~ end
+--~ end
+
+storage.register("lua/numbers", lua.numbers, "lua.numbers")
+storage.register("lua/messages", lua.messages, "lua.messages")
+
+--~ local arguments, files = document.arguments, document.files -- set later
+
+function document.setargument(key,value)
+ document.arguments[key] = value
+end
+
+function document.setdefaultargument(key,default)
+ local v = document.arguments[key]
+ if v == nil or v == "" then
+ document.arguments[key] = default
+ end
+end
+
+function document.getargument(key,default)
+ local v = document.arguments[key]
+ if type(v) == "boolean" then
+ v = (v and "yes") or "no"
+ document.arguments[key] = v
+ end
+ tex.sprint(tex.ctxcatcodes,v or default or "")
+end
+
+function document.setfilename(i,name)
+ document.files[tonumber(i)] = name
+end
+
+function document.getfilename(i)
+ tex.sprint(tex.ctxcatcodes,document.files[i] or "")
+end
diff --git a/tex/context/base/luat-ini.mkiv b/tex/context/base/luat-ini.mkiv
new file mode 100644
index 000000000..c9d88bf4f
--- /dev/null
+++ b/tex/context/base/luat-ini.mkiv
@@ -0,0 +1,243 @@
+%D \module
+%D [ file=luat-ini,
+%D version=2005.08.11,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Initialization,
+%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}{ConTeXt Lua Macros / Initialization}
+
+\unprotect
+
+%D Loading lua code can be done using \type {startup.lua}. The following
+%D method uses the \TEX\ input file locator of kpse. At least we need to
+%D use that way of loading when we haven't yet define our own code, which
+%D we keep outside the format. We will keep code outside \TEX\ files as
+%D much as possible.
+
+\ifx\setnaturalcatcodes\undefined \let\setnaturalcatcodes\relax \fi
+\ifx\obeylualines \undefined \let\obeylualines \relax \fi
+\ifx\obeyluatokens \undefined \let\obeyluatokens \relax \fi
+
+%D A few more goodies:
+
+\long\def\dostartlua
+ {\begingroup
+ \obeylualines
+ \dodostartlua}
+
+\long\def\dodostartlua#1\stoplua
+ {\normalexpanded{\endgroup\noexpand\directlua\zerocount{#1}}}
+
+\long\def\dostartluacode
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \dodostartluacode}
+
+\long\def\dodostartluacode#1\stopluacode
+ {\normalexpanded{\endgroup\noexpand\directlua\zerocount{#1}}}
+
+\unexpanded\def\startlua {\dostartlua } % tex catcodes
+\unexpanded\def\startluacode{\dostartluacode} % lua catcodes
+
+%D Some delayed definitions:
+
+\ifx\obeylines \undefined \let\obeylines \relax \fi
+\ifx\obeyedline \undefined \let\obeyedline \relax \fi
+\ifx\obeyspaces \undefined \let\obeyspaces \relax \fi
+\ifx\obeyedspace \undefined \let\obeyedspace \relax \fi
+\ifx\outputnewlinechar\undefined \let\outputnewlinechar\relax \fi
+
+%D A previous version used a bit less code and no catcode table,
+%D simply becaus ethey were not around at the time of writing.
+%
+% we keep it around for archival purposes
+%
+% \def\obeylualines
+% {\obeylines \let\obeyedline \outputnewlinechar
+% \obeyspaces \let\obeyedspace\space}
+%
+% \def\obeyluatokens % todo: make this a proper catcode table, use let's
+% {\catcode`\%=12 \catcode`\#=12
+% \catcode`\_=12 \catcode`\^=12
+% \catcode`\&=12 \catcode`\|=12
+% \catcode`\{=12 \catcode`\}=12
+% \catcode`\~=12 \catcode`\$=12
+% \def\\{\string\\}\def\|{\string\|}\def\-{\string\-}%
+% \def\({\string\(}\def\){\string\)}\def\{{\string\{}\def\}{\string\}}%
+% \def\'{\string\'}\def\"{\string\"}%
+% \def\n{\string\n}\def\r{\string\r}\def\f{\string\f}\def\t{\string\t}%
+% \def\a{\string\a}\def\b{\string\b}\def\v{\string\v}\def\s{\string\s}%
+% \def\1{\string\1}\def\2{\string\2}\def\3{\string\3}\def\4{\string\4}\def\5{\string\5}%
+% \def\6{\string\6}\def\7{\string\7}\def\8{\string\8}\def\9{\string\9}\def\0{\string\0}}
+
+\let\obeylualines\relax
+
+\newtoks\everyluacode
+
+\edef\lualetterbackslash{\string\\}
+\edef\lualetterbar {\string\|} \edef\lualetterdash {\string\-}
+\edef\lualetterlparent {\string\(} \edef\lualetterrparent {\string\)}
+\edef\lualetterlbrace {\string\{} \edef\lualetterrbrace {\string\}}
+\edef\lualettersquote {\string\'} \edef\lualetterdquote {\string\"}
+\edef\lualettern {\string\n} \edef\lualetterr {\string\r}
+\edef\lualetterf {\string\f} \edef\lualettert {\string\t}
+\edef\lualettera {\string\a} \edef\lualetterb {\string\b}
+\edef\lualetterv {\string\v} \edef\lualetters {\string\s}
+\edef\lualetterone {\string\1} \edef\lualettertwo {\string\2}
+\edef\lualetterthree {\string\3} \edef\lualetterfour {\string\4}
+\edef\lualetterfive {\string\5} \edef\lualettersix {\string\6}
+\edef\lualetterseven {\string\7} \edef\lualettereight {\string\8}
+\edef\lualetternine {\string\9} \edef\lualetterzero {\string\0}
+
+\appendtoks
+ \let\\\lualetterbackslash
+ \let\|\lualetterbar \let\-\lualetterdash
+ \let\(\lualetterlparent \let\)\lualetterrparent
+ \let\{\lualetterlbrace \let\}\lualetterrbrace
+ \let\'\lualettersquote \let\"\lualetterdquote
+ \let\n\lualettern \let\r\lualetterr
+ \let\f\lualetterf \let\t\lualettert
+ \let\a\lualettera \let\b\lualetterb
+ \let\v\lualetterv \let\s\lualetters
+ \let\1\lualetterone \let\2\lualettertwo
+ \let\3\lualetterthree \let\4\lualetterfour
+ \let\5\lualetterfive \let\6\lualettersix
+ \let\7\lualetterseven \let\8\lualettereight
+ \let\9\lualetternine \let\0\lualetterzero
+\to \everyluacode
+
+\def\obeyluatokens
+ {\setcatcodetable \luacatcodes
+ \the\everyluacode}
+
+%D \macros
+%D {definenamedlua}
+%D
+%D We provide an interface for defining instances:
+
+\def\s!lua{lua} \def\v!code{code} \def\!!name{name} \def\s!data{data}
+
+%D Beware: because \type {\expanded} is een convert command, the error
+%D message will show \type{<inserted text>} as part of the message.
+
+\long\def\dostartnamedluacode#1%
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \csname dodostartnamed#1\v!code\endcsname}
+
+\unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet
+ {\scratchcounter\ctxlua{lua.registername("#1","#3")}%
+ \normalexpanded{\long\edef\csname dodostartnamed#1\v!code\endcsname##1\csname\e!stop#1\v!code\endcsname}%
+ {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
+ \long\expandafter\def \csname\e!start#1\v!code\endcsname {\dostartnamedluacode{#1}}%
+ \long\expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}}
+
+%D We predefine a few.
+
+\definenamedlua[user] [private user instance]
+\definenamedlua[third] [third party module instance]
+\definenamedlua[module] [module instance]
+\definenamedlua[isolated][isolated instance]
+
+%D In practice this works out as follows:
+%D
+%D \startbuffer
+%D \startluacode
+%D tex.print("LUA")
+%D \stopluacode
+%D
+%D \startusercode
+%D global.tex.print("USER 1")
+%D tex.print("USER 2")
+%D if characters then
+%D tex.print("ACCESS")
+%D else
+%D tex.print("NO ACCESS")
+%D end
+%D \stopusercode
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D We need a way to pass strings safely to \LUA\ without the
+%D need for tricky escaping. Compare:
+%D
+%D \starttyping
+%D \ctxlua {something("anything tricky can go here")}
+%D \ctxlua {something([\luastringsep[anything tricky can go here]\luastringsep])}
+%D \stoptyping
+
+\def\luastringsep{===} % this permits \typefile{self} otherwise nested b/e sep problems
+
+\edef\!!bs{[\luastringsep[}
+\edef\!!es{]\luastringsep]}
+
+%D We have a the following available as primitive so there is no need
+%D for it:
+%D
+%D \starttyping
+%D \long\edef\luaescapestring#1{\!!bs#1\!!es}
+%D \stoptyping
+
+\def\setdocumentfilename #1#2{\ctxlua{document.setfilename(#1,"#2")}}
+\def\setdocumentargument #1#2{\ctxlua{document.setargument("#1","#2")}}
+\def\setdocumentargumentdefault#1#2{\ctxlua{document.setdefaultargument("#1","#2")}}
+\def\getdocumentfilename #1{\ctxlua{document.getfilename("#1")}}
+\def\getdocumentargument #1{\ctxlua{document.getargument("#1")}}
+\def\getdocumentargumentdefault#1#2{\ctxlua{document.getargument("#1","#2")}}
+\def\doifdocumentargumentelse #1{\doifsomethingelse{\getdocumentargument{#1}}}
+\def\doifdocumentargument #1{\doifsomething {\getdocumentargument{#1}}}
+\def\doifnotdocumentargument #1{\doifnothing {\getdocumentargument{#1}}}
+\def\doifdocumentfilenameelse #1{\doifsomethingelse{\getdocumentfilename{#1}}}
+\def\doifdocumentfilename #1{\doifsomething {\getdocumentfilename{#1}}}
+\def\doifnotdocumentfilename #1{\doifnothing {\getdocumentfilename{#1}}}
+
+\let\doifelsedocumentargument\doifdocumentargumentelse
+
+%D A handy helper:
+
+\def\luaexpanded#1{\luaescapestring\expandafter{\normalexpanded{#1}}}
+
+%D Experimental:
+
+\unexpanded\def\startluaparameterset[#1]%
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \dostartluaparameterset{#1}}
+
+\long\def\dostartluaparameterset#1#2\stopluaparameterset
+ {\ctxlua{parametersets["#1"]={#2}}%
+ \endgroup}
+
+\def\luaparameterset#1#2{\ctxlua{parametersets["#1"]={#2} tex.sprint("#1")}}
+
+% todo: \mergeparameterset
+
+% usage:
+%
+% \startluaparameterset [u3d:myset:display:1]
+% toolbar=false,
+% tree=true
+% \stopluaparameterset
+%
+% options=u3d:myset:display:1
+%
+% or:
+%
+% options=\luaparameterset{u3d:myset:display:1}{toolbar=false,tree=true}
+
+%D A Handy helper:
+
+\def\luaconditional#1{\ifcase#1tru\else fals\fi e}
+
+\protect \endinput
diff --git a/tex/context/base/luat-iop.lua b/tex/context/base/luat-iop.lua
new file mode 100644
index 000000000..e5722d2bd
--- /dev/null
+++ b/tex/context/base/luat-iop.lua
@@ -0,0 +1,148 @@
+if not modules then modules = { } end modules ['luat-iop'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this paranoid stuff in web2c ... we cannot hook checks into the
+-- input functions because one can always change the callback but
+-- we can feed back specific patterns and paths into the next
+-- mechanism
+
+local lower, find, sub = string.lower, string.find, string.sub
+
+local ioinp = io.inp if not ioinp then ioinp = { } io.inp = ioinp end
+local ioout = io.out if not ioout then ioout = { } io.out = ioout end
+
+ioinp.modes, ioout.modes = { }, { } -- functions
+
+local inp_blocked, inp_permitted = { }, { }
+local out_blocked, out_permitted = { }, { }
+
+local function i_inhibit(name) inp_blocked [#inp_blocked +1] = name end
+local function o_inhibit(name) out_blocked [#out_blocked +1] = name end
+local function i_permit (name) inp_permitted[#inp_permitted+1] = name end
+local function o_permit (name) out_permitted[#out_permitted+1] = name end
+
+ioinp.inhibit, ioinp.permit = i_inhibit, o_permit
+ioout.inhibit, ioout.permit = o_inhibit, o_permit
+
+local blocked_openers = { } -- *.open(name,method)
+
+function io.register_opener(func)
+ blocked_openers[#blocked_openers+1] = func
+end
+
+local function checked(name,blocked,permitted)
+ local n = lower(name)
+ for _,b in next, blocked do
+ if find(n,b) then
+ for _,p in next, permitted do
+ if find(n,p) then
+ return true
+ end
+ end
+ return false
+ end
+ end
+ return true
+end
+
+function io.finalize_openers(func)
+ if #out_blocked > 0 or #inp_blocked > 0 then
+ local open = func -- why not directly?
+ return function(name,method)
+ if method and find(method,'[wa]') then
+ if #out_blocked > 0 and not checked(name,out_blocked,out_permitted) then
+ -- print("writing to " .. name .. " is not permitted")
+ return nil
+ end
+ else
+ if #inp_blocked > 0 and not checked(name,inp_blocked,inp_permitted) then
+ -- print("reading from " .. name .. " is not permitted")
+ return nil
+ end
+ end
+ return open(name,method)
+ end
+ else
+ return func
+ end
+end
+
+--~ io.inp.inhibit('^%.')
+--~ io.inp.inhibit('^/etc')
+--~ io.inp.inhibit('/windows/')
+--~ io.inp.inhibit('/winnt/')
+--~ io.inp.permit('c:/windows/wmsetup.log')
+
+--~ io.open = io.finalize_openers(io.open)
+
+--~ f = io.open('.tex') print(f)
+--~ f = io.open('tufte.tex') print(f)
+--~ f = io.open('t:/sources/tufte.tex') print(f)
+--~ f = io.open('/etc/passwd') print(f)
+--~ f = io.open('c:/windows/crap.log') print(f)
+--~ f = io.open('c:/windows/wmsetup.log') print(f)
+
+local inpout = { 'inp', 'out' }
+
+function io.set_opener_modes(i,o)
+ local first = sub(i,1,1)
+ for k=1,#inpout do
+ local iov = io[inpout[k]]
+ local f = iov[i] or iov[first]
+ if f then f() end
+ end
+ io.open = io.finalize_openers(io.open)
+end
+
+-- restricted
+
+function ioinp.modes.restricted()
+ i_inhibit('^%.[%a]')
+end
+
+function ioout.modes.restricted()
+ o_inhibit('^%.[%a]')
+end
+
+-- paranoid
+
+function ioinp.modes.paranoid()
+ i_inhibit('.*')
+ i_inhibit('%.%.')
+ i_permit('^%./')
+ i_permit('[^/]')
+ resolvers.do_with_path('TEXMF',i_permit)
+end
+
+function ioout.modes.paranoid()
+ o_inhibit('.*')
+ resolvers.do_with_path('TEXMFOUTPUT',o_permit)
+end
+
+-- handy
+
+function ioinp.modes.handy()
+ i_inhibit('%.%.')
+ if os.type == 'windows' then
+ i_inhibit('/windows/')
+ i_inhibit('/winnt/')
+ else
+ i_inhibit('^/etc')
+ end
+end
+
+function ioout.modes.handy()
+ o_inhibit('.*')
+ o_permit('%./')
+ o_permit('^%./')
+ o_permit('[^/]')
+end
+
+--~ io.set_opener_modes('p','p')
+--~ io.set_opener_modes('r','r')
+--~ io.set_opener_modes('h','h')
diff --git a/tex/context/base/luat-lib.mkiv b/tex/context/base/luat-lib.mkiv
new file mode 100644
index 000000000..91ddec0aa
--- /dev/null
+++ b/tex/context/base/luat-lib.mkiv
@@ -0,0 +1,70 @@
+%D \module
+%D [ file=luat-lib,
+%D version=2006.09.11,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Libraries,
+%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}{ConTeXt Lua Macros / Libraries}
+
+\registerctxluafile{trac-inf} {1.001}
+\registerctxluafile{trac-tra} {1.001}
+\registerctxluafile{trac-log} {1.001}
+
+\registerctxluafile{luat-cbk} {1.001}
+
+\registerctxluafile{data-res} {1.001}
+\registerctxluafile{data-tmp} {1.001}
+\registerctxluafile{data-pre} {1.001}
+\registerctxluafile{data-inp} {1.001}
+\registerctxluafile{data-out} {1.001}
+\registerctxluafile{data-tex} {1.001}
+\registerctxluafile{data-bin} {1.001}
+\registerctxluafile{data-zip} {1.001}
+%registerctxluafile{data-crl} {1.001}
+\registerctxluafile{data-sch} {1.001}
+\registerctxluafile{data-tre} {1.001}
+\registerctxluafile{data-lua} {1.001}
+\registerctxluafile{data-ctx} {1.001}
+\registerctxluafile{data-con} {1.001}
+\registerctxluafile{data-use} {1.001}
+
+\registerctxluafile{luat-run} {1.001}
+\registerctxluafile{luat-fio} {1.001} % not needed, part of startup file
+\registerctxluafile{luat-cnf} {1.001} % not needed, part of startup file
+\registerctxluafile{luat-lua} {1.001}
+\registerctxluafile{luat-sto} {1.001}
+\registerctxluafile{luat-ini} {1.001}
+\registerctxluafile{luat-env} {1.001}
+
+\registerctxluafile{lxml-tab} {1.001}
+\registerctxluafile{lxml-lpt} {1.001}
+\registerctxluafile{lxml-xml} {1.001}
+\registerctxluafile{lxml-aux} {1.001}
+\registerctxluafile{lxml-mis} {1.001}
+
+\startruntimeluacode
+ \edef\asciia{\ctxlua{tex.sprint(logs.mode)}}
+ \edef\asciib{xml}
+ \ifx\asciia\asciib % brrr
+ \long\def\writebanner #1{\writestring {<m t='banner'>#1</m>}}
+ \long\def\writestatus#1#2{\writestring {<m t='#1'>#2</m>}}
+ \long\def\message #1{\normalmessage{<m t='message'>#1</m>}}
+ \else
+ \let\writebanner\writestring
+ %\let\writestatus\normalwritestatus
+ \let\message \normalmessage
+ \fi
+\stopruntimeluacode
+
+%registerctxluafile{luat-tmp}{1.001}
+\registerctxluafile{luat-exe}{1.001}
+\registerctxluafile{luat-iop}{1.001}
+
+\endinput
diff --git a/tex/context/base/luat-lua.lua b/tex/context/base/luat-lua.lua
new file mode 100644
index 000000000..b964bf8e8
--- /dev/null
+++ b/tex/context/base/luat-lua.lua
@@ -0,0 +1,43 @@
+if not modules then modules = { } end modules ['luat-lua'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if lua then do
+
+ local delayed = { }
+
+ function lua.delay(f)
+ delayed[#delayed+1] = f
+ end
+
+ function lua.flush_delayed(...)
+ local t = delayed
+ delayed = { }
+ for i=1, #t do
+ t[i](...)
+ end
+ end
+
+ function lua.flush(...)
+ tex.sprint("\\directlua0{lua.flush_delayed(",table.concat({...},','),")}")
+ end
+
+end end
+
+--~ See mk.pdf for an explanation of the following code:
+--~
+--~ function test(n)
+--~ lua.delay(function(...)
+--~ tex.sprint(string.format("pi: %s %s %s\\par",...))
+--~ end)
+--~ lua.delay(function(...)
+--~ tex.sprint(string.format("more pi: %s %s %s\\par",...))
+--~ end)
+--~ tex.sprint(string.format("\\setbox0=\\hbox{%s}",math.pi*n))
+--~ local box = tex.box[0]
+--~ lua.flush(box.width,box.height,box.depth)
+--~ end
diff --git a/tex/context/base/luat-run.lua b/tex/context/base/luat-run.lua
new file mode 100644
index 000000000..b64a99fc6
--- /dev/null
+++ b/tex/context/base/luat-run.lua
@@ -0,0 +1,74 @@
+if not modules then modules = { } end modules ['luat-run'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, rpadd = string.format, string.rpadd
+
+main = main or { }
+
+local start_actions = { }
+local stop_actions = { }
+
+function main.register_start_actions(...) table.insert(start_actions, ...) end
+function main.register_stop_actions (...) table.insert(stop_actions, ...) end
+
+main.show_tex_stat = main.show_tex_stat or function() end
+main.show_job_stat = main.show_job_stat or statistics.show_job_stat
+
+function main.start()
+ if logs.start_run then
+ logs.start_run()
+ end
+ for _, action in next, start_actions do
+ action()
+ end
+end
+
+function main.stop()
+ for _, action in next, stop_actions do
+ action()
+ end
+ if main.show_job_stat then
+ statistics.show(logs.report_job_stat)
+ end
+ if main.show_tex_stat then
+ for k,v in next, status.list() do
+ logs.report_tex_stat(k,v)
+ end
+ end
+ if logs.stop_run then
+ logs.stop_run()
+ end
+end
+
+function main.start_shipout_page()
+ logs.start_page_number()
+end
+
+function main.stop_shipout_page()
+ logs.stop_page_number()
+end
+
+function main.report_output_pages()
+end
+
+function main.report_output_log()
+end
+
+-- this can be done later
+
+callbacks.register('start_run', main.start, "actions performed at the beginning of a run")
+callbacks.register('stop_run', main.stop, "actions performed at the end of a run")
+
+callbacks.register('report_output_pages', main.report_output_pages, "actions performed when reporting pages")
+callbacks.register('report_output_log', main.report_output_log, "actions performed when reporting log file")
+
+callbacks.register('start_page_number', main.start_shipout_page, "actions performed at the beginning of a shipout")
+callbacks.register('stop_page_number', main.stop_shipout_page, "actions performed at the end of a shipout")
+
+callbacks.register('process_input_buffer', false, "actions performed when reading data")
+callbacks.register('process_output_buffer', false, "actions performed when writing data")
diff --git a/tex/context/base/luat-soc.lua b/tex/context/base/luat-soc.lua
new file mode 100644
index 000000000..1095ed087
--- /dev/null
+++ b/tex/context/base/luat-soc.lua
@@ -0,0 +1,11 @@
+-- This is just a loader. The package handler knows about the TEX tree.
+
+--~ require "luatex/lua/socket.lua"
+--~ require "luatex/lua/ltn12.lua"
+--~ require "luatex/lua/mime.lua"
+--~ require "luatex/lua/socket/http.lua"
+--~ require "luatex/lua/socket/url.lua"
+--~ require "luatex/lua/socket/tp.lua"
+--~ require "luatex/lua/socket/ftp.lua"
+
+-- "luatex/lua/socket/smtp.lua"
diff --git a/tex/context/base/luat-sta.lua b/tex/context/base/luat-sta.lua
new file mode 100644
index 000000000..a81b0c206
--- /dev/null
+++ b/tex/context/base/luat-sta.lua
@@ -0,0 +1,196 @@
+if not modules then modules = { } end modules ['luat-sta'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this code is used in the updater
+
+local gmatch, match = string.gmatch, string.match
+local type = type
+
+states = states or { }
+states.data = states.data or { }
+states.hash = states.hash or { }
+states.tag = states.tag or ""
+states.filename = states.filename or ""
+
+function states.save(filename,tag)
+ tag = tag or states.tag
+ filename = file.addsuffix(filename or states.filename,'lus')
+ io.savedata(filename,
+ "-- generator : luat-sta.lua\n" ..
+ "-- state tag : " .. tag .. "\n\n" ..
+ table.serialize(states.data[tag or states.tag] or {},true)
+ )
+end
+
+function states.load(filename,tag)
+ states.filename = filename
+ states.tag = tag or "whatever"
+ states.filename = file.addsuffix(states.filename,'lus')
+ states.data[states.tag], states.hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
+end
+
+function states.set_by_tag(tag,key,value,default,persistent)
+ local d, h = states.data[tag], states.hash[tag]
+ if d then
+ if type(d) == "table" then
+ local dkey, hkey = key, key
+ local pre, post = match(key,"(.+)%.([^%.]+)$")
+ if pre and post then
+ for k in gmatch(pre,"[^%.]+") do
+ local dk = d[k]
+ if not dk then
+ dk = { }
+ d[k] = dk
+ elseif type(dk) == "string" then
+ -- invalid table, unable to upgrade structure
+ -- hope for the best or delete the state file
+ break
+ end
+ d = dk
+ end
+ dkey, hkey = post, key
+ end
+ if type(value) == nil then
+ value = value or default
+ elseif persistent then
+ value = value or d[dkey] or default
+ else
+ value = value or default
+ end
+ d[dkey], h[hkey] = value, value
+ elseif type(d) == "string" then
+ -- weird
+ states.data[tag], states.hash[tag] = value, value
+ end
+ end
+end
+
+function states.get_by_tag(tag,key,default)
+ local h = states.hash[tag]
+ if h and h[key] then
+ return h[key]
+ else
+ local d = states.data[tag]
+ if d then
+ for k in gmatch(key,"[^%.]+") do
+ local dk = d[k]
+ if dk then
+ d = dk
+ else
+ return default
+ end
+ end
+ return d or default
+ end
+ end
+end
+
+function states.set(key,value,default,persistent)
+ states.set_by_tag(states.tag,key,value,default,persistent)
+end
+
+function states.get(key,default)
+ return states.get_by_tag(states.tag,key,default)
+end
+
+--~ states.data.update = {
+--~ ["version"] = {
+--~ ["major"] = 0,
+--~ ["minor"] = 1,
+--~ },
+--~ ["rsync"] = {
+--~ ["server"] = "contextgarden.net",
+--~ ["module"] = "minimals",
+--~ ["repository"] = "current",
+--~ ["flags"] = "-rpztlv --stats",
+--~ },
+--~ ["tasks"] = {
+--~ ["update"] = true,
+--~ ["make"] = true,
+--~ ["delete"] = false,
+--~ },
+--~ ["platform"] = {
+--~ ["host"] = true,
+--~ ["other"] = {
+--~ ["mswin"] = false,
+--~ ["linux"] = false,
+--~ ["linux-64"] = false,
+--~ ["osx-intel"] = false,
+--~ ["osx-ppc"] = false,
+--~ ["sun"] = false,
+--~ },
+--~ },
+--~ ["context"] = {
+--~ ["available"] = {"current", "beta", "alpha", "experimental"},
+--~ ["selected"] = "current",
+--~ },
+--~ ["formats"] = {
+--~ ["cont-en"] = true,
+--~ ["cont-nl"] = true,
+--~ ["cont-de"] = false,
+--~ ["cont-cz"] = false,
+--~ ["cont-fr"] = false,
+--~ ["cont-ro"] = false,
+--~ },
+--~ ["engine"] = {
+--~ ["pdftex"] = {
+--~ ["install"] = true,
+--~ ["formats"] = {
+--~ ["pdftex"] = true,
+--~ },
+--~ },
+--~ ["luatex"] = {
+--~ ["install"] = true,
+--~ ["formats"] = {
+--~ },
+--~ },
+--~ ["xetex"] = {
+--~ ["install"] = true,
+--~ ["formats"] = {
+--~ ["xetex"] = false,
+--~ },
+--~ },
+--~ ["metapost"] = {
+--~ ["install"] = true,
+--~ ["formats"] = {
+--~ ["mpost"] = true,
+--~ ["metafun"] = true,
+--~ },
+--~ },
+--~ },
+--~ ["fonts"] = {
+--~ },
+--~ ["doc"] = {
+--~ },
+--~ ["modules"] = {
+--~ ["f-urwgaramond"] = false,
+--~ ["f-urwgothic"] = false,
+--~ ["t-bnf"] = false,
+--~ ["t-chromato"] = false,
+--~ ["t-cmscbf"] = false,
+--~ ["t-cmttbf"] = false,
+--~ ["t-construction-plan"] = false,
+--~ ["t-degrade"] = false,
+--~ ["t-french"] = false,
+--~ ["t-lettrine"] = false,
+--~ ["t-lilypond"] = false,
+--~ ["t-mathsets"] = false,
+--~ ["t-tikz"] = false,
+--~ ["t-typearea"] = false,
+--~ ["t-vim"] = false,
+--~ },
+--~ }
+
+--~ states.save("teststate", "update")
+--~ states.load("teststate", "update")
+
+--~ print(states.get_by_tag("update","rsync.server","unknown"))
+--~ states.set_by_tag("update","rsync.server","oeps")
+--~ print(states.get_by_tag("update","rsync.server","unknown"))
+--~ states.save("teststate", "update")
+--~ states.load("teststate", "update")
+--~ print(states.get_by_tag("update","rsync.server","unknown"))
diff --git a/tex/context/base/luat-sto.lua b/tex/context/base/luat-sto.lua
new file mode 100644
index 000000000..08da735db
--- /dev/null
+++ b/tex/context/base/luat-sto.lua
@@ -0,0 +1,135 @@
+if not modules then modules = { } end modules ['luat-sto'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type, next = type, next
+local gmatch, format, write_nl = string.gmatch, string.format, texio.write_nl
+
+storage = storage or { }
+storage.min = 0 -- 500
+storage.max = storage.min - 1
+storage.noftables = storage.noftables or 0
+storage.nofmodules = storage.nofmodules or 0
+storage.data = { }
+storage.evaluators = { }
+
+local evaluators = storage.evaluators -- (evaluate,message,names)
+local data = storage.data
+
+function storage.register(...)
+ data[#data+1] = { ... }
+end
+
+-- evaluators .. messy .. to be redone
+
+function storage.evaluate(name)
+ evaluators[#evaluators+1] = name
+end
+
+function storage.finalize() -- we can prepend the string with "evaluate:"
+ for i=1,#evaluators do
+ local t = evaluators[i]
+ for i, v in next, t do
+ local tv = type(v)
+ if tv == "string" then
+ t[i] = loadstring(v)()
+ elseif tv == "table" then
+ for _, vv in next, v do
+ if type(vv) == "string" then
+ t[i] = loadstring(vv)()
+ end
+ end
+ elseif tv == "function" then
+ t[i] = v()
+ end
+ end
+ end
+end
+
+function storage.dump()
+ for i=1,#data do
+ local d = data[i]
+ local message, original, target, evaluate = d[1], d[2] ,d[3] ,d[4]
+ local name, initialize, finalize, code = nil, "", "", ""
+ for str in gmatch(target,"([^%.]+)") do
+ if name then
+ name = name .. "." .. str
+ else
+ name = str
+ end
+ initialize = format("%s %s = %s or {} ", initialize, name, name)
+ end
+ if evaluate then
+ finalize = "storage.evaluate(" .. name .. ")"
+ end
+ storage.max = storage.max + 1
+ if trace_storage then
+ logs.report('storage','saving %s in slot %s',message,storage.max)
+ code =
+ initialize ..
+ format("logs.report('storage','restoring %s from slot %s') ",message,storage.max) ..
+ table.serialize(original,name) ..
+ finalize
+ else
+ code = initialize .. table.serialize(original,name) .. finalize
+ end
+ lua.bytecode[storage.max] = loadstring(code)
+ collectgarbage("step")
+ end
+end
+
+-- we also need to count at generation time (nicer for message)
+
+if lua.bytecode then -- from 0 upwards
+ local i, b = storage.min, lua.bytecode
+ while b[i] do
+ storage.noftables = i
+ b[i]()
+ b[i] = nil
+ i = i + 1
+ end
+end
+
+statistics.register("stored bytecode data", function()
+ local modules = (storage.nofmodules > 0 and storage.nofmodules) or (status.luabytecodes - 500)
+ local dumps = (storage.noftables > 0 and storage.noftables) or storage.max-storage.min + 1
+ return format("%s modules, %s tables, %s chunks",modules,dumps,modules+dumps)
+end)
+
+if lua.bytedata then
+ storage.register("lua/bytedata",lua.bytedata,"lua.bytedata")
+end
+
+-- wrong place, kind of forward reference
+
+function statistics.report_storage(whereto)
+ whereto = whereto or "term and log"
+ write_nl(whereto," ","stored tables:"," ")
+ for k,v in table.sortedhash(storage.data) do
+ write_nl(whereto,format("%03i %s",k,v[1]))
+ end
+ write_nl(whereto," ","stored modules:"," ")
+ for k,v in table.sortedhash(lua.bytedata) do
+ write_nl(whereto,format("%03i %s %s",k,v[2],v[1]))
+ end
+ write_nl(whereto," ","stored attributes:"," ")
+ for k,v in table.sortedhash(attributes.names) do
+ write_nl(whereto,format("%03i %s",k,v))
+ end
+ write_nl(whereto," ","stored catcodetables:"," ")
+ for k,v in table.sortedhash(catcodes.names) do
+ write_nl(whereto,format("%03i %s",k,table.concat(v," ")))
+ end
+ write_nl(whereto," ")
+end
+
+storage.shared = storage.shared or { }
+
+-- Because the storage mechanism assumes tables, we define a table for storing
+-- (non table) values.
+
+storage.register("storage/shared", storage.shared, "storage.shared")
diff --git a/tex/context/base/lxml-aux.lua b/tex/context/base/lxml-aux.lua
new file mode 100644
index 000000000..00f791909
--- /dev/null
+++ b/tex/context/base/lxml-aux.lua
@@ -0,0 +1,543 @@
+if not modules then modules = { } end modules ['lxml-aux'] = {
+ 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"
+}
+
+-- not all functions here make sense anymore vbut we keep them for
+-- compatibility reasons
+
+local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end)
+
+local xmlparseapply, xmlconvert, xmlcopy, xmlname = xml.parse_apply, xml.convert, xml.copy, xml.name
+local xmlinheritedconvert = xml.inheritedconvert
+
+local type = type
+local insert, remove = table.insert, table.remove
+local gmatch, gsub = string.gmatch, string.gsub
+
+local function report(what,pattern,c,e)
+ logs.report("xml","%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
+end
+
+local function withelements(e,handle,depth)
+ if e and handle then
+ local edt = e.dt
+ if edt then
+ depth = depth or 0
+ for i=1,#edt do
+ local e = edt[i]
+ if type(e) == "table" then
+ handle(e,depth)
+ withelements(e,handle,depth+1)
+ end
+ end
+ end
+ end
+end
+
+xml.withelements = withelements
+
+function xml.withelement(e,n,handle) -- slow
+ if e and n ~= 0 and handle 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
+ handle(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
+ handle(ei)
+ return
+ else
+ n = n + 1
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+xml.elements_only = xml.collected
+
+function xml.each_element(root,pattern,handle,reverse)
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ if reverse then
+ for c=#collected,1,-1 do
+ handle(collected[c])
+ end
+ else
+ for c=1,#collected do
+ handle(collected[c])
+ end
+ end
+ return collected
+ end
+end
+
+xml.process_elements = xml.each_element
+
+function xml.process_attributes(root,pattern,handle)
+ local collected = xmlparseapply({ root },pattern)
+ if collected and handle then
+ for c=1,#collected do
+ handle(collected[c].at)
+ end
+ end
+ return collected
+end
+
+--[[ldx--
+<p>The following functions collect elements and texts.</p>
+--ldx]]--
+
+-- are these still needed -> lxml-cmp.lua
+
+function xml.collect_elements(root, pattern)
+ return xmlparseapply({ root },pattern)
+end
+
+function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
+ local collected = xmlparseapply({ root },pattern)
+ if collected and flatten then
+ local xmltostring = xml.tostring
+ for c=1,#collected do
+ collected[c] = xmltostring(collected[c].dt)
+ end
+ end
+ return collected or { }
+end
+
+function xml.collect_tags(root, pattern, nonamespace)
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ local t = { }
+ for c=1,#collected do
+ local e = collected[c]
+ local ns, tg = e.ns, e.tg
+ if nonamespace then
+ t[#t+1] = tg
+ elseif ns == "" then
+ t[#t+1] = tg
+ else
+ t[#t+1] = ns .. ":" .. tg
+ end
+ end
+ return t
+ end
+end
+
+--[[ldx--
+<p>We've now arrived at the functions that manipulate the tree.</p>
+--ldx]]--
+
+local no_root = { no_root = true }
+
+function xml.redo_ni(d)
+ for k=1,#d do
+ local dk = d[k]
+ if type(dk) == "table" then
+ dk.ni = k
+ end
+ end
+end
+
+local function xmltoelement(whatever,root)
+ if not whatever then
+ return nil
+ end
+ local element
+ if type(whatever) == "string" then
+ element = xmlinheritedconvert(whatever,root)
+ else
+ element = whatever -- we assume a table
+ end
+ if element.error then
+ return whatever -- string
+ end
+ if element then
+ --~ if element.ri then
+ --~ element = element.dt[element.ri].dt
+ --~ else
+ --~ element = element.dt
+ --~ end
+ end
+ return element
+end
+
+xml.toelement = xmltoelement
+
+local function copiedelement(element,newparent)
+ if type(element) == "string" then
+ return element
+ else
+ element = xmlcopy(element).dt
+ if newparent and type(element) == "table" then
+ element.__p__ = newparent
+ end
+ return element
+ end
+end
+
+function xml.delete_element(root,pattern)
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ local p = e.__p__
+ if p then
+ if trace_manipulations then
+ report('deleting',pattern,c,e)
+ end
+ local d = p.dt
+ remove(d,e.ni)
+ xml.redo_ni(d) -- can be made faster and inlined
+ end
+ end
+ end
+end
+
+function xml.replace_element(root,pattern,whatever)
+ local element = root and xmltoelement(whatever,root)
+ local collected = element and xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ local p = e.__p__
+ if p then
+ if trace_manipulations then
+ report('replacing',pattern,c,e)
+ end
+ local d = p.dt
+ d[e.ni] = copiedelement(element,p)
+ xml.redo_ni(d) -- probably not needed
+ end
+ end
+ end
+end
+
+local function inject_element(root,pattern,whatever,prepend)
+ local element = root and xmltoelement(whatever,root)
+ local collected = element and xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ local r = e.__p__
+ local d, k, rri = r.dt, e.ni, r.ri
+ local edt = (rri and d[rri].dt) or (d and d[k] and d[k].dt)
+ if edt then
+ local be, af
+ local cp = copiedelement(element,e)
+ if prepend then
+ be, af = cp, edt
+ else
+ be, af = edt, cp
+ end
+ for i=1,#af do
+ be[#be+1] = af[i]
+ end
+ if rri then
+ r.dt[rri].dt = be
+ else
+ d[k].dt = be
+ end
+ xml.redo_ni(d)
+ end
+ end
+ end
+end
+
+local function insert_element(root,pattern,whatever,before) -- todo: element als functie
+ local element = root and xmltoelement(whatever,root)
+ local collected = element and xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ local r = e.__p__
+ local d, k = r.dt, e.ni
+ if not before then
+ k = k + 1
+ end
+ insert(d,k,copiedelement(element,r))
+ xml.redo_ni(d)
+ end
+ end
+end
+
+xml.insert_element = insert_element
+xml.insert_element_after = insert_element
+xml.insert_element_before = function(r,p,e) insert_element(r,p,e,true) end
+xml.inject_element = inject_element
+xml.inject_element_after = inject_element
+xml.inject_element_before = function(r,p,e) inject_element(r,p,e,true) end
+
+local function include(xmldata,pattern,attribute,recursive,loaddata)
+ -- parse="text" (default: xml), encoding="" (todo)
+ -- attribute = attribute or 'href'
+ pattern = pattern or 'include'
+ loaddata = loaddata or io.loaddata
+ local collected = xmlparseapply({ xmldata },pattern)
+ if collected then
+ for c=1,#collected do
+ local ek = collected[c]
+ local name = nil
+ local ekdt = ek.dt
+ local ekat = ek.at
+ local epdt = ek.__p__.dt
+ if not attribute or attribute == "" then
+ name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- ckeck, probably always tab or str
+ end
+ if not name then
+ for a in gmatch(attribute or "href","([^|]+)") do
+ name = ekat[a]
+ if name then break end
+ end
+ end
+ local data = (name and name ~= "" and loaddata(name)) or ""
+ if data == "" then
+ epdt[ek.ni] = "" -- xml.empty(d,k)
+ elseif ekat["parse"] == "text" then
+ -- for the moment hard coded
+ epdt[ek.ni] = xml.escaped(data) -- d[k] = xml.escaped(data)
+ else
+--~ local settings = xmldata.settings
+--~ settings.parent_root = xmldata -- to be tested
+--~ local xi = xmlconvert(data,settings)
+ local xi = xmlinheritedconvert(data,xmldata)
+ if not xi then
+ epdt[ek.ni] = "" -- xml.empty(d,k)
+ else
+ if recursive then
+ include(xi,pattern,attribute,recursive,loaddata)
+ end
+ epdt[ek.ni] = xml.body(xi) -- xml.assign(d,k,xi)
+ end
+ end
+ end
+ end
+end
+
+xml.include = include
+
+--~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
+--~ local collected = xmlparseapply({ xmldata },pattern)
+--~ if collected then
+--~ local xmltostring = xml.tostring
+--~ for c=1,#collected do
+--~ local e = collected[c]
+--~ local data = manipulator(xmltostring(e))
+--~ if data == "" then
+--~ epdt[e.ni] = ""
+--~ else
+--~ local xi = xmlinheritedconvert(data,xmldata)
+--~ if not xi then
+--~ epdt[e.ni] = ""
+--~ else
+--~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+--~ xml.manipulate = manipulate
+
+function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ for i=1,#collected do
+ local e = collected[i]
+ local edt = e.dt
+ if edt then
+ local t = { }
+ for i=1,#edt do
+ local str = edt[i]
+ if type(str) == "string" then
+ if str == "" then
+ -- stripped
+ else
+ if nolines then
+ str = gsub(str,"[ \n\r\t]+"," ")
+ end
+ if str == "" then
+ -- stripped
+ else
+ t[#t+1] = str
+ end
+ end
+ else
+ --~ str.ni = i
+ t[#t+1] = str
+ end
+ end
+ e.dt = t
+ end
+ end
+ end
+end
+
+function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing
+ local collected = xmlparseapply({ root },pattern) -- beware, indices no longer are valid now
+ if collected then
+ for i=1,#collected do
+ local e = collected[i]
+ local edt = e.dt
+ if edt then
+ if anywhere then
+ local t = { }
+ for e=1,#edt do
+ local str = edt[e]
+ if type(str) ~= "string" then
+ t[#t+1] = str
+ elseif str ~= "" then
+ -- todo: lpeg for each case
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"^%s*(.-)%s*$","%1")
+ if str ~= "" then
+ t[#t+1] = str
+ end
+ end
+ end
+ e.dt = t
+ else
+ -- we can assume a regular sparse xml table with no successive strings
+ -- otherwise we should use a while loop
+ if #edt > 0 then
+ -- strip front
+ local str = edt[1]
+ if type(str) ~= "string" then
+ -- nothing
+ elseif str == "" then
+ remove(edt,1)
+ else
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"^%s+","")
+ if str == "" then
+ remove(edt,1)
+ else
+ edt[1] = str
+ end
+ end
+ end
+ if #edt > 1 then
+ -- strip end
+ local str = edt[#edt]
+ if type(str) ~= "string" then
+ -- nothing
+ elseif str == "" then
+ remove(edt)
+ else
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"%s+$","")
+ if str == "" then
+ remove(edt)
+ else
+ edt[#edt] = str
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+local function rename_space(root, oldspace, newspace) -- fast variant
+ local ndt = #root.dt
+ for i=1,ndt or 0 do
+ local e = root[i]
+ if type(e) == "table" then
+ if e.ns == oldspace then
+ e.ns = newspace
+ if e.rn then
+ e.rn = newspace
+ end
+ end
+ local edt = e.dt
+ if edt then
+ rename_space(edt, oldspace, newspace)
+ end
+ end
+ end
+end
+
+xml.rename_space = rename_space
+
+function xml.remap_tag(root, pattern, newtg)
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ collected[c].tg = newtg
+ end
+ end
+end
+
+function xml.remap_namespace(root, pattern, newns)
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ collected[c].ns = newns
+ end
+ end
+end
+
+function xml.check_namespace(root, pattern, newns)
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ if (not e.rn or e.rn == "") and e.ns == "" then
+ e.rn = newns
+ end
+ end
+ end
+end
+
+function xml.remap_name(root, pattern, newtg, newns, newrn)
+ local collected = xmlparseapply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ e.tg, e.ns, e.rn = newtg, newns, newrn
+ end
+ end
+end
+
+--[[ldx--
+<p>Here are a few synonyms.</p>
+--ldx]]--
+
+xml.each = xml.each_element
+xml.process = xml.process_element
+xml.strip = xml.strip_whitespace
+xml.collect = xml.collect_elements
+xml.all = xml.collect_elements
+
+xml.insert = xml.insert_element_after
+xml.inject = xml.inject_element_after
+xml.after = xml.insert_element_after
+xml.before = xml.insert_element_before
+xml.delete = xml.delete_element
+xml.replace = xml.replace_element
diff --git a/tex/context/base/lxml-ctx.lua b/tex/context/base/lxml-ctx.lua
new file mode 100644
index 000000000..765754953
--- /dev/null
+++ b/tex/context/base/lxml-ctx.lua
@@ -0,0 +1,131 @@
+if not modules then modules = { } end modules ['lxml-ctx'] = {
+ version = 1.001,
+ comment = "companion to lxml-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- is this still used?
+
+xml.ctx = { }
+xml.ctx.enhancers = { }
+
+-- hashen
+
+function xml.ctx.enhancers.compound(root,lpath,before,tokens,after) -- todo lpeg
+ local before = before or "[%a%d][%a%d][%a%d]"
+ local tokens = tokens or "[%/%-]"
+ local after = after or "[%a%d][%a%d][%a%d]"
+ local pattern = "(" .. before .. ")(" .. tokens .. ")(" .. after .. ")"
+ local action = function(a,b,c)
+ return a .. "<compound token=" .. string.format("%q",b) .. "/>" .. c
+ end
+ xml.enhance(root,lpath,pattern,action) -- still present?
+end
+
+local loaded = { }
+
+local nodesettostring = xml.nodesettostring
+
+-- maybe use detokenize instead of \type
+
+function xml.ctx.tshow(specification)
+ local pattern = specification.pattern
+ local xmlroot = specification.xmlroot
+ local attribute = specification.attribute
+ if context then
+ local xmlpattern = pattern
+ if not string.find(xmlpattern,"^[%a]+://") then
+ xmlpattern = "xml://" .. pattern
+ end
+ parsed = xml.parse_pattern(xmlpattern)
+ titlecommand = specification.title or "type"
+ if parsed.state then
+ context[titlecommand]("pattern: " .. pattern .. " (".. parsed.state .. ")")
+ else
+ context[titlecommand]("pattern: " .. pattern)
+ end
+ context.starttabulate({ "|Tr|Tl|Tp|" } )
+ if specification.warning then
+ local comment = parsed.comment
+ if comment then
+ for k=1,#comment do
+ context.NC()
+ context("!")
+ context.NC()
+ context.rlap(comment[k])
+ context.NR()
+ end
+ context.TB()
+ end
+ end
+ for p=1,#parsed do
+ local pp = parsed[p]
+ local kind = pp.kind
+ context.NC()
+ context(p)
+ context.NC()
+ context(kind)
+ context.NC()
+ if kind == "axis" then
+ context(pp.axis)
+ elseif kind == "nodes" then
+ context(nodesettostring(pp.nodes,pp.nodetest))
+ elseif kind == "expression" then
+--~ context("%s => %s",pp.expression,pp.converted)
+ context(pp.expression)
+ elseif kind == "finalizer" then
+ context("%s(%s)",pp.name,pp.arguments)
+ elseif kind == "error" and pp.error then
+ context(pp.error)
+ end
+ context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+ if xmlroot and xmlroot ~= "" then
+ if not loaded[xmlroot] then
+ loaded[xmlroot] = { xml.convert(buffers.content(xmlroot) or "") }
+ end
+ local collected = xml.parse_apply(loaded[xmlroot],xmlpattern)
+ if collected then
+ local tc = type(collected)
+ if not tc then
+ -- skip
+ else
+ context.blank()
+ context.type("result : ")
+ if tc == "string" then
+ context.type(collected)
+ elseif tc == "table" then
+ if collected.tg then
+ collected = { collected }
+ end
+ for c=1,#collected do
+ local cc = collected[c]
+ if attribute and attribute ~= "" then
+ local ccat = cc.at
+ local a = ccat and ccat[attribute]
+ if a and a ~= "" then
+ context.type(a)
+ context.type(">")
+ end
+ end
+ local ccns = cc.ns
+ if ccns == "" then
+ context.type(cc.tg)
+ else
+ context.type(ccns .. ":" .. cc.tg)
+ end
+ context.space()
+ end
+ else
+ context.type(tostring(tc))
+ end
+ context.blank()
+ end
+ end
+ end
+ end
+end
diff --git a/tex/context/base/lxml-ctx.mkiv b/tex/context/base/lxml-ctx.mkiv
new file mode 100644
index 000000000..73d082d0d
--- /dev/null
+++ b/tex/context/base/lxml-ctx.mkiv
@@ -0,0 +1,64 @@
+%D \module
+%D [ file=lxml-ini,
+%D version=2007.08.17,
+%D title=\CONTEXT\ \XML\ Support,
+%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 Experimental. This might change! Also, it might become a module
+%D instead if core code.
+
+\writestatus{loading}{ConTeXt XML Support / Goodies}
+
+\registerctxluafile{lxml-ctx}{1.001}
+
+\unprotect
+
+% the letterbar is a messy hack and is needed for the tabulate
+
+\settrue \xmllshowbuffer
+\setfalse\xmllshowtitle
+\settrue \xmllshowwarning
+
+\definehead[lshowtitle][subsubsubsubsubject]
+\setuphead[lshowtitle][style=\tta]
+
+% \unexpanded\def\setuplxmlshow[#1]%
+% {\dodoubleargument\getparameters[\??xl]}
+
+\def\xmllshow#1%
+ {\begingroup
+ \let|=\letterbar
+ \ctxlua{xml.ctx.tshow {
+ pattern = \!!bs#1\!!es,
+ \ifconditional\xmllshowtitle
+ title = "lshowtitle",
+ \fi
+ \ifconditional\xmllshowwarning
+ warning = true,
+ \fi
+ } }%
+ \endgroup}
+
+\def\xmllshowbuffer#1#2#3%
+ {\begingroup
+ \let|=\letterbar
+ \ctxlua{xml.ctx.tshow {
+ pattern = \!!bs#2\!!es,
+ \ifconditional\xmllshowbuffer
+ xmlroot = "#1",
+ attribute = "#3",
+ \fi
+ \ifconditional\xmllshowwarning
+ warning = true,
+ \fi
+ } }%
+ \endgroup}
+
+\protect
diff --git a/tex/context/base/lxml-dir.lua b/tex/context/base/lxml-dir.lua
new file mode 100644
index 000000000..617ce3e20
--- /dev/null
+++ b/tex/context/base/lxml-dir.lua
@@ -0,0 +1,112 @@
+if not modules then modules = { } end modules ['lxml-dir'] = {
+ 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"
+}
+
+local format, gsub = string.format, string.gsub
+local get_id = lxml.id
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local xmlparseapply = xml.parse_apply
+
+--~ <?xml version="1.0" standalone="yes"?>
+--~ <!-- demo.cdx -->
+--~ <directives>
+--~ <!--
+--~ <directive attribute='id' value="100" setup="cdx:100"/>
+--~ <directive attribute='id' value="101" setup="cdx:101"/>
+--~ -->
+--~ <!--
+--~ <directive attribute='cdx' value="colors" element="cals:table" setup="cdx:cals:table:colors"/>
+--~ <directive attribute='cdx' value="vertical" element="cals:table" setup="cdx:cals:table:vertical"/>
+--~ <directive attribute='cdx' value="noframe" element="cals:table" setup="cdx:cals:table:noframe"/>
+--~ -->
+--~ <directive attribute='cdx' value="*" element="cals:table" setup="cdx:cals:table:*"/>
+--~ </directives>
+
+
+
+lxml.directives = lxml.directives or { }
+
+local directives = lxml.directives
+
+local data = {
+ setup = { },
+ before = { },
+ after = { }
+}
+
+local function load_setup(filename)
+ local fullname = resolvers.findtexfile(filename) or ""
+ if fullname ~= "" then
+ filename = fullname
+ end
+ local collection = xmlparseapply({ get_id(xml.load(filename)) },"directive")
+ if collection then
+ local valid = 0
+ for i=1,#collection do
+ local at = collection[i].at
+ local attribute, value, element = at.attribute or "", at.value or "", at.element or '*'
+ local setup, before, after = at.setup or "", at.before or "", at.after or ""
+ if attribute ~= "" and value ~= "" then
+ local key = format("%s::%s::%s",element,attribute,value)
+ local t = data[key] or { }
+ if setup ~= "" then t.setup = setup end
+ if before ~= "" then t.before = before end
+ if after ~= "" then t.after = after end
+ data[key] = t
+ valid = valid + 1
+ end
+ end
+ commands.writestatus("lxml","%s directives found in '%s', %s valid",#collection,filename,valid)
+ else
+ commands.writestatus("lxml","no directives found in '%s'",filename)
+ end
+end
+
+local function handle_setup(category,root,attribute,element)
+ root = get_id(root)
+ if attribute then
+ local value = root.at[attribute]
+ if value then
+ if not element then
+ local ns, tg = root.rn or root.ns, root.tg
+ if ns == "" then
+ element = tg
+ else
+ element = ns .. ':' .. tg
+ end
+ end
+ local setup = data[format("%s::%s::%s",element,attribute,value)]
+ if setup then
+ setup = setup[category]
+ end
+ if setup then
+ texsprint(ctxcatcodes,"\\directsetup{",setup,"}")
+ else
+ setup = data[format("%s::%s::*",element,attribute)]
+ if setup then
+ setup = setup[category]
+ end
+ if setup then
+ texsprint(ctxcatcodes,"\\directsetup{",gsub(setup,'%*',value),"}")
+ end
+ end
+ end
+ end
+end
+
+directives.load = load_setup
+directives.handle = handle_setup
+
+function directives.setup(root,attribute,element)
+ handle_setup('setup',root,attribute,element)
+end
+function directives.before(root,attribute,element)
+ handle_setup('before',root,attribute,element)
+end
+function directives.after(root,attribute,element)
+ handle_setup('after',root,attribute,element)
+end
diff --git a/tex/context/base/lxml-ent.lua b/tex/context/base/lxml-ent.lua
new file mode 100644
index 000000000..193611937
--- /dev/null
+++ b/tex/context/base/lxml-ent.lua
@@ -0,0 +1,69 @@
+if not modules then modules = { } end modules ['lxml-ent'] = {
+ 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"
+}
+
+local type, next, tonumber = type, next, tonumber
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local utf = unicode.utf8
+local byte, format = string.byte, string.format
+local utfupper, utfchar = utf.upper, utf.char
+local lpegmatch = lpeg.match
+
+--[[ldx--
+<p>We provide (at least here) two entity handlers. The more extensive
+resolver consults a hash first, tries to convert to <l n='utf'/> next,
+and finaly calls a handler when defines. When this all fails, the
+original entity is returned.</p>
+
+<p>We do things different now but it's still somewhat experimental</p>
+--ldx]]--
+
+local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+
+xml.entities = xml.entities or { } -- xml.entity_handler == function
+
+storage.register("xml/entities",xml.entities,"xml.entities") -- this will move to lxml
+
+local entities = xml.entities -- this is a shared hash
+
+xml.unknown_any_entity_format = nil -- has to be per xml
+
+local parsedentity = xml.parsedentitylpeg
+
+function xml.register_entity(key,value)
+ entities[key] = value
+ if trace_entities then
+ logs.report("xml","registering entity '%s' as: %s",key,value)
+ end
+end
+
+function xml.resolved_entity(str)
+ local e = entities[str]
+ if e then
+ local te = type(e)
+ if te == "function" then
+ e(str)
+ elseif e then
+ texsprint(ctxcatcodes,e)
+ end
+ else
+ -- resolve hex and dec, todo: escape # & etc for ctxcatcodes
+ -- normally this is already solved while loading the file
+ local chr, err = lpegmatch(parsedentity,str)
+ if chr then
+ texsprint(ctxcatcodes,chr)
+ elseif err then
+ texsprint(ctxcatcodes,err)
+ else
+ texsprint(ctxcatcodes,"\\xmle{",str,"}{",utfupper(str),"}") -- we need to use our own upper
+ end
+ end
+end
+
+entities.amp = function() tex.write("&") end
+entities.lt = function() tex.write("<") end
+entities.gt = function() tex.write(">") end
diff --git a/tex/context/base/lxml-inf.lua b/tex/context/base/lxml-inf.lua
new file mode 100644
index 000000000..629c869ec
--- /dev/null
+++ b/tex/context/base/lxml-inf.lua
@@ -0,0 +1,53 @@
+if not modules then modules = { } end modules ['lxml-inf'] = {
+ 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"
+}
+
+-- This file will be loaded runtime by x-pending.tex.
+
+local status, stack
+
+local function get(e,d)
+ local ns, tg = e.ns, e.tg
+ local name = tg
+ if ns ~= "" then name = ns .. ":" .. tg end
+ stack[d] = name
+ local ec = e.command
+ if ec == true then
+ ec = "system: text"
+ elseif ec == false then
+ ec = "system: skip"
+ elseif ec == nil then
+ ec = "system: not set"
+ elseif type(ec) == "string" then
+ ec = "setup: " .. ec
+ else -- function
+ ec = tostring(ec)
+ end
+ local tag = concat(stack," => ",1,d)
+ local s = status[tag]
+ if not s then
+ s = { }
+ status[tag] = s
+ end
+ s[ec] = (s[ec] or 0) + 1
+end
+
+local function get_command_status(id)
+ status, stack = {}, {}
+ if id then
+ xmlwithelements(get_id(id),get)
+ return status
+ else
+ local t = { }
+ for id, _ in next, loaded do
+ t[id] = get_command_status(id)
+ end
+ return t
+ end
+end
+
+lxml.get_command_status = get_command_status
diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv
new file mode 100644
index 000000000..0f04d0488
--- /dev/null
+++ b/tex/context/base/lxml-ini.mkiv
@@ -0,0 +1,414 @@
+%D \module
+%D [ file=lxml-ini,
+%D version=2007.08.17,
+%D title=\CONTEXT\ \XML\ Support,
+%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 Todo: auto apply setups (manage at lua end)
+
+\writestatus{loading}{ConTeXt XML Support / Initialization}
+
+%registerctxluafile{lxml-tab}{1.001} % loader
+%registerctxluafile{lxml-lpt}{1.001} % parser
+%registerctxluafile{lxml-xml}{1.001} % xml finalizers
+%registerctxluafile{lxml-aux}{1.001} % extras using parser
+%registerctxluafile{lxml-mis}{1.001} % extras independent of parser
+\registerctxluafile{lxml-ent}{1.001} % entity hacks
+\registerctxluafile{lxml-tex}{1.001} % tex finalizers
+\registerctxluafile{lxml-dir}{1.001} % ctx hacks
+
+\unprotect
+
+\def\c!entities{entities} % to be internationalized
+
+\def\xmlmain #1{\ctxlua{lxml.main("#1")}}
+\def\xmlmatch #1{\ctxlua{lxml.match("#1")}}
+\def\xmlall #1#2{\ctxlua{lxml.all("#1","#2")}}
+\def\xmlatt #1#2{\ctxlua{lxml.att("#1","#2")}}
+\def\xmlattdef #1#2#3{\ctxlua{lxml.att("#1","#2","#3")}}
+\def\xmlchainatt #1#2{\ctxlua{lxml.chainattribute("#1","/","#2")}}
+\def\xmlchainattdef #1#2#3{\ctxlua{lxml.chainattribute("#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\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\xmlcount #1#2{\ctxlua{lxml.count("#1","#2")}}
+\def\xmldelete #1#2{\ctxlua{lxml.delete("#1","#2")}}
+\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",\!!bs#2\!!es)}}
+\def\xmlfilterlist #1#2{\ctxlua{lxml.filterlist("#1",\!!bs#2\!!es)}}
+\def\xmlfunction #1#2{\ctxlua{lxml["function"]("#1",\!!bs#2\!!es)}}
+\def\xmlfirst #1#2{\ctxlua{lxml.first("#1","#2")}}
+\def\xmlflush #1{\ctxlua{lxml.flush("#1")}}
+%def\xmlcontent #1{\ctxlua{lxml.content("#1")}}
+%def\xmlflushstripped #1{\ctxlua{lxml.strip("#1",true)}}
+\def\xmldirect #1{\ctxlua{lxml.direct("#1")}} % in loops, not dt but root
+\def\xmlidx #1#2#3{\ctxlua{lxml.idx("#1","#2",\number#3)}}
+\def\xmlinclude #1#2#3{\ctxlua{lxml.include("#1","#2","#3",true)}}
+\def\xmlindex #1#2#3{\ctxlua{lxml.index("#1","#2",\number#3)}}
+\def\xmlinfo #1{\hbox{\ttxx[\ctxlua{lxml.info("#1")}]}}
+\def\xmlshow #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked}
+\def\xmllast #1#2{\ctxlua{lxml.last("#1","#2")}}
+\def\xmlname #1{\ctxlua{lxml.name("#1")}}
+\def\xmlnamespace #1{\ctxlua{lxml.namespace("#1")}}
+\def\xmlnonspace #1#2{\ctxlua{lxml.nonspace("#1","#2")}}
+\def\xmlraw #1#2{\ctxlua{lxml.raw("#1","#2")}}
+\def\xmlcontext #1#2{\ctxlua{lxml.context("#1","#2")}}
+\def\xmlflushcontext #1{\ctxlua{lxml.context("#1")}}
+\def\xmlsnippet #1#2{\ctxlua{lxml.snippet("#1",#2)}}
+\def\xmlelement #1#2{\ctxlua{lxml.element("#1",#2)}}
+\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")}}
+\def\xmlstripnolines #1#2{\ctxlua{lxml.strip("#1","#2",true)}}
+\def\xmlstripanywhere #1#2{\ctxlua{lxml.strip("#1","#2",true,true)}}
+\def\xmlstripped #1#2{\ctxlua{lxml.stripped("#1","#2")}}
+\def\xmlstrippednolines #1#2{\ctxlua{lxml.stripped("#1","#2",true)}}
+\def\xmltag #1{\ctxlua{lxml.tag("#1")}}
+\def\xmltext #1#2{\ctxlua{lxml.text("#1","#2")}}
+\def\xmlverbatim #1{\ctxlua{lxml.verbatim("#1")}}
+\def\xmldisplayverbatim #1{\ctxlua{lxml.displayverbatim("#1")}}
+\def\xmlinlineverbatim #1{\ctxlua{lxml.inlineverbatim("#1")}}
+
+\def\xmlload #1#2{\ctxlua{lxml.load("#1","#2","\@@xmentities","\@@xmcompress")}}
+\def\xmlloadbuffer #1#2{\ctxlua{lxml.loadbuffer("#1","#2","\@@xmentities","\@@xmcompress")}}
+\def\xmlloaddata #1#2{\ctxlua{lxml.loaddata("#1",\!!bs#2\!!es,"\@@xmentities","\@@xmcompress")}}
+\def\xmlloadregistered #1#2{\ctxlua{lxml.loadregistered("#1","\@@xmentities","\@@xmcompress")}}
+\def\xmlloaddirectives #1{\ctxlua{lxml.directives.load("any:///#1")}}
+\def\xmlpos #1{\ctxlua{lxml.pos("#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 (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifnot #1#2{\ctxlua{lxml.doifnot (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifelse #1#2{\ctxlua{lxml.doifelse (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoiftext #1#2{\ctxlua{lxml.doiftext (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifnottext #1#2{\ctxlua{lxml.doifnottext (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifelsetext #1#2{\ctxlua{lxml.doifelsetext(\!!bs#1\!!es,\!!bs#2\!!es)}}
+
+%def\xmldoifelseempty #1#2{\ctxlua{lxml.doifelseempty("#1","#2")}} % #2, "*" or "" == self not yet implemented
+%def\xmldoifelseselfempty #1{\ctxlua{lxml.doifelseempty("#1")}}
+
+% \startxmlsetups xml:include
+% \xmlinclude{main}{include}{filename|href}
+% \stopxmlsetups
+%
+% \xmlprependsetup{xml:include}
+
+\let\xmlgrab\xmlsetsetup % obsolete
+\let\xmlself\s!unknown % obsolete
+
+\def\xmlsetup#1#2{\setupwithargument{#2}{#1}}
+
+\let\xmls\xmlsetup
+\let\xmlw\setupwithargument
+
+\newtoks \registeredxmlsetups
+
+% todo: 1:xml:whatever always before 3:xml:something
+
+\def\xmlprependsetup #1{\ctxlua{lxml.installsetup(1,"*","#1")}}
+\def\xmlappendsetup #1{\ctxlua{lxml.installsetup(2,"*","#1")}}
+\def\xmlbeforesetup #1#2{\ctxlua{lxml.installsetup(3,"*","#1","#2"))}}
+\def\xmlaftersetup #1#2{\ctxlua{lxml.installsetup(4,"*","#1","#2"))}}
+
+\def\xmlprependdocumentsetup #1#2{\ctxlua{lxml.installsetup(1,"#1","#2")}}
+\def\xmlappenddocumentsetup #1#2{\ctxlua{lxml.installsetup(2,"#1","#2")}}
+\def\xmlbeforedocumentsetup#1#2#3{\ctxlua{lxml.installsetup(3,"#1","#2","#3"))}}
+\def\xmlafterdocumentsetup #1#2#3{\ctxlua{lxml.installsetup(4,"#1","#2","#3"))}}
+
+\def\xmlremovesetup #1{\ctxlua{lxml.removesetup("*","#1")}}
+\def\xmlremovedocumentsetup #1#2{\ctxlua{lxml.removesetup("#1","#2")}}
+
+\def\xmlflushdocumentsetups #1#2{\ctxlua{lxml.flushsetups("#1","*","#2")}} % #1 == id where to apply * and #2
+\def\xmlresetdocumentsetups #1{\ctxlua{lxml.resetsetups("#1")}}
+
+\let\xmlregistersetup \xmlappendsetup
+\let\xmlregisterdocumentsetup\xmlappenddocumentsetup
+
+\def\xmldocument{main}
+
+\def\xmlregisteredsetups
+ {\xmlstarttiming
+ \xmlflushsetups
+ \xmldefaulttotext\xmldocument % after include
+ \xmlstoptiming}
+
+\def\xmlregistereddocumentsetups#1#2% id setups
+ {\xmlstarttiming
+ % todo: test for duplicates !
+ \xmlflushdocumentsetups{#1}{#2}%
+ \xmldefaulttotext{#1}% after include
+ \xmlstoptiming}
+
+\def\xmlstarttiming{\ctxlua{statistics.starttiming(lxml)}}
+\def\xmlstoptiming {\ctxlua{statistics.stoptiming (lxml)}}
+
+\def\doxmlprocess#1#2#3#4#5% flag \loader id name what initializersetup
+ {\begingroup
+ \edef\xmldocument{#3}% #2 can be \xmldocument and set as such
+ %xmlpushdocument{#3}%
+ #2{#3}{#4}%
+ \setcatcodetable\notcatcodes
+ \doifelsenothing{#5}
+ {\xmlsetup{#3}{xml:process}}
+ {\xmlsetup{#3}{#5}}%
+ %xmlpopdocument
+ \endgroup}
+
+\def\xmlprocessfile {\doxmlprocess\plusone \xmlload}
+\def\xmlprocessdata {\doxmlprocess\zerocount\xmlloaddata}
+\def\xmlprocessbuffer {\doxmlprocess\zerocount\xmlloadbuffer}
+\def\xmlprocessregistered{\doxmlprocess\zerocount\xmlloadregistered}
+\let\xmlprocess \xmlprocessfile
+
+\startxmlsetups xml:flush
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:process
+ \xmlregistereddocumentsetups{#1}{#1}
+ \xmlmain{#1}
+\stopxmlsetups
+
+\def\xmlloadonly#1#2#3%
+ {\xmlload{#1}{#2}%
+ \xmlregistereddocumentsetups{#1}{#3}}
+
+% beware: \xmlmain takes the real root, so also processing
+% instructions preceding the root element; well, in some
+% sense that is the root
+
+\long\def\xmlconnect#1#2#3% inefficient
+ {\scratchcounter\xmlcount{#1}{#2}\relax
+ \ifcase\scratchcounter \or
+ \xmlall{#1}{#2}%
+ \else
+ \dorecurse \scratchcounter
+ {\ifnum\recurselevel>\plusone#3\fi
+ \xmlidx{#1}{#2}\recurselevel}%
+ \fi}
+
+\def\xmlcdataobeyedline {\obeyedline}
+\def\xmlcdataobeyedspace{\strut\obeyedspace}
+\def\xmlcdatabefore {\bgroup\tt}
+\def\xmlcdataafter {\egroup}
+
+% verbatim (dodo:pre/post whitespace, maybe splot verbatim and
+% cdata commands), experimental:
+%
+% \xmlsetfunction{main}{verbatim}{lxml.displayverbatim}
+% \xmlsetfunction{main}{verb} {lxml.inlineverbatim}
+
+% \unexpanded\def\startxmldisplayverbatim[#1]{}
+% \unexpanded\def\stopxmldisplayverbatim {}
+% \unexpanded\def\startxmlinlineverbatim [#1]{}
+% \unexpanded\def\stopxmlinlineverbatim {}
+
+% we use an xml: namespace so one has to define a suitable verbatim, say
+%
+% \definetyping[xml:verbatim][typing]
+%
+% this is experimental!
+
+\unexpanded\def\startxmldisplayverbatim[#1]%
+ {\startpacked % \begingroup
+ \let\currenttypingclass\??tp
+ \edef\currenttyping{xml:#1}%
+ \unexpanded\def\stopxmldisplayverbatim
+ {\endofverbatimlines
+ \stoppacked} % \endgroup
+ \doinitializeverbatim
+ \beginofverbatimlines}
+
+\unexpanded\def\startxmlinlineverbatim[#1]%
+ {\begingroup
+ \let\currenttypingclass\??ty
+ \edef\currenttyping{xml:#1}%
+ \let\stopxmldisplayverbatim\endgroup
+ \doinitializeverbatim}
+
+% will move but is developed for xml
+
+\newtoks \collectingtoks
+
+\unexpanded\def\startcollect#1\stopcollect
+ {\collectingtoks\@EA{\the\collectingtoks#1}}
+
+\unexpanded\def\startexpandedcollect#1\stopexpandedcollect
+ {\normalexpanded{\collectingtoks{\the\collectingtoks#1}}}
+
+\unexpanded\def\startcollecting{\collectingtoks\emptytoks}
+\unexpanded\def\stopcollecting {\the\collectingtoks}
+
+\def\inlinemessage #1{\dontleavehmode{\tttf#1}}
+\def\displaymessage#1{\blank\inlinemessage{#1}\blank}
+
+\def\xmltraceentities
+ {\ctxlua{xml.set_text_cleanup(lxml.trace_text_entities)}%
+ \appendtoks\ctxlua{lxml.show_text_entities()}\to\everygoodbye}
+
+% processing instructions
+
+\def\xmlcontextdirective#1% kind class key value
+ {\executeifdefined{xml#1directive}\gobblethreearguments}
+
+% setting up xml:
+%
+% \setupxml[\c!default=] % mkiv only == text
+% \setupxml[\c!default=\v!none] % mkiv only, undefined -> hidden
+% \setupxml[\c!default=\v!text] % mkiv only, undefined -> text
+
+% \def\xmlctxdirective#1#2#3{\doif{#1}{clue}{\doif{#2}{page}}{\page[#3]}}
+
+\chardef\xmlprocessingmode=0 % 0=unset, 1=text, 2=hidden
+
+\newtoks\everysetupxml
+
+\unexpanded\def\setupxml[#1]{\getparameters[\??xm][#1]\the\everysetupxml}
+
+
+\letvalue{\??xm:\s!default:\v!normal}\zerocount
+\letvalue{\??xm:\s!default:\v!none }\zerocount
+\letvalue{\??xm:\s!default:\v!text }\plusone
+\letvalue{\??xm:\s!default:\v!hidden}\plustwo
+
+\def\xmldefaulttotext#1%
+ {\ifcase\xmlprocessingmode
+ % unset
+ \or
+ \ctxlua{lxml.set_command_to_text("#1")}% 1
+ \or
+ \ctxlua{lxml.set_command_to_none("#1")}% 2
+ \else
+ % unset
+ \fi}
+
+\appendtoks
+ \chardef\xmlprocessingmode\executeifdefined{\??xm:\s!default:\@@xmdefault}\plusone
+\to \everysetupxml
+
+\def\xmlinitialize{\the\everysetupxml}
+
+\setupxml
+ [\c!default=, % flush all
+ \c!compress=\v!no, % strip comment
+ \c!entities=\v!yes] % replace entities
+
+% \defineXMLenvironment[y]{(}{)}
+%
+% \startxmlsetups x
+% /\xmlflush{#1}/
+% \stopxmlsetups
+%
+% \startxmlsetups xx
+% \xmlsetsetup{main}{x}{*}
+% \stopxmlsetups
+%
+% \xmlregistersetup{xx}
+%
+% \startbuffer
+% <x>a &lt;&amp;&gt;<y>{b}</y> c</x>
+% \stopbuffer
+%
+% mkii: [\processXMLbuffer]\quad mkiv: [\xmlprocessbuffer{main}{}{}]
+
+\def\xmlmapvalue #1#2#3{\setvalue{\??xm:v:#1:#2}{#3}} % keep #3 to grab spaces
+\def\xmlvalue #1#2#3{\executeifdefined{\??xm:v:#1:#2}{#3}}
+%def\xmlvalue #1#2{\ifcsname\??xm:v:#1:#2\endcsname\csname\??xm:v:#1:#2\expandafter\expandafter\gobbleoneargument\expandafter\endcsname\else\expandafter\firstofoneargument\fi}
+\def\xmldoifelsevalue #1#2{\ifcsname\??xm:v:#1:#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+
+\let\xmlmapval\xmlmapvalue
+\let\xmlval \xmlvalue
+
+%D Experimental:
+
+\def\xmlgetindex #1{\ctxlua{lxml.getindex("\xmldocument","#1")}}
+\def\xmlrawindex #1{\ctxlua{lxml.rawindex("#1")}}
+\def\xmlwithindex #1#2{\ctxlua{lxml.withindex("\xmldocument","#1","#2")}}
+\def\xmlreference #1#2{\string\xmlwithindex{#1}{#2}}
+
+%D Entities:
+
+\chardef\xmlautoentities=1 % 0=off, 1=upper, 2=upper,lower
+
+\let\isolatedentity\firstofoneargument
+
+\def\xmlsetentity#1#2{\ctxlua{xml.register_entity('#1',\!!bs\detokenize{#2}\!!es)}}
+\def\xmltexentity#1#2{\ctxlua{xml.register_entity('#1',\!!bs\detokenize{\isolatedentity{#2}}\!!es)}}
+
+% \xmlsetentity{tex}{\TEX{}} % {} needed
+
+\unexpanded\def\xmle
+ {\ifcase\xmlautoentities
+ \expandafter\xmle@none
+ \or
+ \expandafter\xmle@upper
+ \or
+ \expandafter\xmle@upperlower
+ \else
+ \expandafter\xmle@none
+ \fi}
+
+\def\xmle@none#1#2% safe
+ {#1}
+
+\def\xmle@upper#1#2% can be abbreviation
+ {\ifcsname#2\endcsname
+ \csname#2\expandafter\endcsname
+ \else
+ #1%
+ \fi}
+
+\def\xmle@upperlower#1#2% can be anything, so unsafe
+ {\ifcsname#2\endcsname
+ \csname#2\expandafter\endcsname
+ \else\ifcsname#1\endcsname
+ \csname#1\expandafter\expandafter\expandafter\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+\protect \endinput
+
+% \newcount\charactersactiveoffset \charactersactiveoffset="10000
+%
+% \startextendcatcodetable\ctxcatcodes
+% \catcode\numexpr\charactersactiveoffset+`<\relax=13
+% \catcode\numexpr\charactersactiveoffset+`&\relax=13
+% \catcode\numexpr\charactersactiveoffset+`>\relax=13
+% \stopextendcatcodetable
+%
+% \startextendcatcodetable\xmlcatcodes % not needed
+% \catcode\numexpr\charactersactiveoffset+`<\relax=13
+% \catcode\numexpr\charactersactiveoffset+`&\relax=13
+% \catcode\numexpr\charactersactiveoffset+`>\relax=13
+% \stopextendcatcodetable
+%
+% \ctxlua { % entities are remembered in the format
+% characters.remapentity("<",characters.active_offset + utf.byte("<"))
+% characters.remapentity("&",characters.active_offset + utf.byte("&"))
+% characters.remapentity(">",characters.active_offset + utf.byte(">"))
+% }
diff --git a/tex/context/base/lxml-lpt.lua b/tex/context/base/lxml-lpt.lua
new file mode 100644
index 000000000..bddbe4868
--- /dev/null
+++ b/tex/context/base/lxml-lpt.lua
@@ -0,0 +1,1259 @@
+if not modules then modules = { } end modules ['lxml-pth'] = {
+ 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"
+}
+
+-- e.ni is only valid after a filter run
+
+local concat, remove, insert = table.concat, table.remove, table.insert
+local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
+local format, upper, lower, gmatch, gsub, find, rep = string.format, string.upper, string.lower, string.gmatch, string.gsub, string.find, string.rep
+local lpegmatch = lpeg.match
+
+-- beware, this is not xpath ... e.g. position is different (currently) and
+-- we have reverse-sibling as reversed preceding sibling
+
+--[[ldx--
+<p>This module can be used stand alone but also inside <l n='mkiv'/> in
+which case it hooks into the tracker code. Therefore we provide a few
+functions that set the tracers. Here we overload a previously defined
+function.</p>
+<p>If I can get in the mood I will make a variant that is XSLT compliant
+but I wonder if it makes sense.</P>
+--ldx]]--
+
+--[[ldx--
+<p>Expecially the lpath code is experimental, we will support some of xpath, but
+only things that make sense for us; as compensation it is possible to hook in your
+own functions. Apart from preprocessing content for <l n='context'/> we also need
+this module for process management, like handling <l n='ctx'/> and <l n='rlx'/>
+files.</p>
+
+<typing>
+a/b/c /*/c
+a/b/c/first() a/b/c/last() a/b/c/index(n) a/b/c/index(-n)
+a/b/c/text() a/b/c/text(1) a/b/c/text(-1) a/b/c/text(n)
+</typing>
+--ldx]]--
+
+local trace_lpath = false if trackers then trackers.register("xml.path", function(v) trace_lpath = v end) end
+local trace_lparse = false if trackers then trackers.register("xml.parse", function(v) trace_lparse = v end) end
+local trace_lprofile = false if trackers then trackers.register("xml.profile", function(v) trace_lpath = v trace_lparse = v trace_lprofile = v end) end
+
+--[[ldx--
+<p>We've now arrived at an interesting part: accessing the tree using a subset
+of <l n='xpath'/> and since we're not compatible we call it <l n='lpath'/>. We
+will explain more about its usage in other documents.</p>
+--ldx]]--
+
+local lpathcalls = 0 function xml.lpathcalls () return lpathcalls end
+local lpathcached = 0 function xml.lpathcached() return lpathcached end
+
+xml.functions = xml.functions or { } -- internal
+xml.expressions = xml.expressions or { } -- in expressions
+xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
+xml.specialhandler = xml.specialhandler or { }
+
+local functions = xml.functions
+local expressions = xml.expressions
+local finalizers = xml.finalizers
+
+finalizers.xml = finalizers.xml or { }
+finalizers.tex = finalizers.tex or { }
+
+local function fallback (t, name)
+ local fn = finalizers[name]
+ if fn then
+ t[name] = fn
+ else
+ logs.report("xml","unknown sub finalizer '%s'",tostring(name))
+ fn = function() end
+ end
+ return fn
+end
+
+setmetatable(finalizers.xml, { __index = fallback })
+setmetatable(finalizers.tex, { __index = fallback })
+
+xml.defaultprotocol = "xml"
+
+-- as xsl does not follow xpath completely here we will also
+-- be more liberal especially with regards to the use of | and
+-- the rootpath:
+--
+-- test : all 'test' under current
+-- /test : 'test' relative to current
+-- a|b|c : set of names
+-- (a|b|c) : idem
+-- ! : not
+--
+-- after all, we're not doing transformations but filtering. in
+-- addition we provide filter functions (last bit)
+--
+-- todo: optimizer
+--
+-- .. : parent
+-- * : all kids
+-- / : anchor here
+-- // : /**/
+-- ** : all in between
+--
+-- so far we had (more practical as we don't transform)
+--
+-- {/test} : kids 'test' under current node
+-- {test} : any kid with tag 'test'
+-- {//test} : same as above
+
+-- evaluator (needs to be redone, for the moment copied)
+
+-- todo: apply_axis(list,notable) and collection vs single
+
+local apply_axis = { }
+
+apply_axis['root'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ local rt = ll
+ while ll do
+ ll = ll.__p__
+ if ll then
+ rt = ll
+ end
+ end
+ collected[#collected+1] = rt
+ end
+ return collected
+end
+
+apply_axis['self'] = function(list)
+--~ local collected = { }
+--~ for l=1,#list do
+--~ collected[#collected+1] = list[l]
+--~ end
+--~ return collected
+ return list
+end
+
+apply_axis['child'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ local dt = ll.dt
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ collected[#collected+1] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ end
+ end
+ ll.en = en
+ end
+ return collected
+end
+
+local function collect(list,collected)
+ local dt = list.dt
+ if dt then
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ collected[#collected+1] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ collect(dk,collected)
+ end
+ end
+ list.en = en
+ end
+end
+apply_axis['descendant'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ collect(list[l],collected)
+ end
+ return collected
+end
+
+local function collect(list,collected)
+ local dt = list.dt
+ if dt then
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ collected[#collected+1] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ collect(dk,collected)
+ end
+ end
+ list.en = en
+ end
+end
+apply_axis['descendant-or-self'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ if ll.special ~= true then -- catch double root
+ collected[#collected+1] = ll
+ end
+ collect(ll,collected)
+ end
+ return collected
+end
+
+apply_axis['ancestor'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ while ll do
+ ll = ll.__p__
+ if ll then
+ collected[#collected+1] = ll
+ end
+ end
+ end
+ return collected
+end
+
+apply_axis['ancestor-or-self'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ collected[#collected+1] = ll
+ while ll do
+ ll = ll.__p__
+ if ll then
+ collected[#collected+1] = ll
+ end
+ end
+ end
+ return collected
+end
+
+apply_axis['parent'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local pl = list[l].__p__
+ if pl then
+ collected[#collected+1] = pl
+ end
+ end
+ return collected
+end
+
+apply_axis['attribute'] = function(list)
+ return { }
+end
+
+apply_axis['namespace'] = function(list)
+ return { }
+end
+
+apply_axis['following'] = function(list) -- incomplete
+--~ local collected = { }
+--~ for l=1,#list do
+--~ local ll = list[l]
+--~ local p = ll.__p__
+--~ local d = p.dt
+--~ for i=ll.ni+1,#d do
+--~ local di = d[i]
+--~ if type(di) == "table" then
+--~ collected[#collected+1] = di
+--~ break
+--~ end
+--~ end
+--~ end
+--~ return collected
+ return { }
+end
+
+apply_axis['preceding'] = function(list) -- incomplete
+--~ local collected = { }
+--~ for l=1,#list do
+--~ local ll = list[l]
+--~ local p = ll.__p__
+--~ local d = p.dt
+--~ for i=ll.ni-1,1,-1 do
+--~ local di = d[i]
+--~ if type(di) == "table" then
+--~ collected[#collected+1] = di
+--~ break
+--~ end
+--~ end
+--~ end
+--~ return collected
+ return { }
+end
+
+apply_axis['following-sibling'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ local p = ll.__p__
+ local d = p.dt
+ for i=ll.ni+1,#d do
+ local di = d[i]
+ if type(di) == "table" then
+ collected[#collected+1] = di
+ end
+ end
+ end
+ return collected
+end
+
+apply_axis['preceding-sibling'] = function(list)
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ local p = ll.__p__
+ local d = p.dt
+ for i=1,ll.ni-1 do
+ local di = d[i]
+ if type(di) == "table" then
+ collected[#collected+1] = di
+ end
+ end
+ end
+ return collected
+end
+
+apply_axis['reverse-sibling'] = function(list) -- reverse preceding
+ local collected = { }
+ for l=1,#list do
+ local ll = list[l]
+ local p = ll.__p__
+ local d = p.dt
+ for i=ll.ni-1,1,-1 do
+ local di = d[i]
+ if type(di) == "table" then
+ collected[#collected+1] = di
+ end
+ end
+ end
+ return collected
+end
+
+apply_axis['auto-descendant-or-self'] = apply_axis['descendant-or-self']
+apply_axis['auto-descendant'] = apply_axis['descendant']
+apply_axis['auto-child'] = apply_axis['child']
+apply_axis['auto-self'] = apply_axis['self']
+apply_axis['initial-child'] = apply_axis['child']
+
+local function apply_nodes(list,directive,nodes)
+ -- todo: nodes[1] etc ... negated node name in set ... when needed
+ -- ... currently ignored
+ local maxn = #nodes
+ if maxn == 3 then --optimized loop
+ local nns, ntg = nodes[2], nodes[3]
+ if not nns and not ntg then -- wildcard
+ if directive then
+ return list
+ else
+ return { }
+ end
+ else
+ local collected, m, p = { }, 0, nil
+ if not nns then -- only check tag
+ for l=1,#list do
+ local ll = list[l]
+ local ltg = ll.tg
+ if ltg then
+ if directive then
+ if ntg == ltg then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ elseif ntg ~= ltg then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ end
+ end
+ elseif not ntg then -- only check namespace
+ for l=1,#list do
+ local ll = list[l]
+ local lns = ll.rn or ll.ns
+ if lns then
+ if directive then
+ if lns == nns then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ elseif lns ~= nns then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ end
+ end
+ else -- check both
+ for l=1,#list do
+ local ll = list[l]
+ local ltg = ll.tg
+ if ltg then
+ local lns = ll.rn or ll.ns
+ local ok = ltg == ntg and lns == nns
+ if directive then
+ if ok then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ elseif not ok then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ end
+ end
+ end
+ return collected
+ end
+ else
+ local collected, m, p = { }, 0, nil
+ for l=1,#list do
+ local ll = list[l]
+ local ltg = ll.tg
+ if ltg then
+ local lns = ll.rn or ll.ns
+ local ok = false
+ for n=1,maxn,3 do
+ local nns, ntg = nodes[n+1], nodes[n+2]
+ ok = (not ntg or ltg == ntg) and (not nns or lns == nns)
+ if ok then
+ break
+ end
+ end
+ if directive then
+ if ok then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ elseif not ok then
+ local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
+ collected[#collected+1], ll.mi = ll, m
+ end
+ end
+ end
+ return collected
+ end
+end
+
+local quit_expression = false
+
+local function apply_expression(list,expression,order)
+ local collected = { }
+ quit_expression = false
+ for l=1,#list do
+ local ll = list[l]
+ if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
+ collected[#collected+1] = ll
+ end
+ if quit_expression then
+ break
+ end
+ end
+ return collected
+end
+
+local P, V, C, Cs, Cc, Ct, R, S, Cg, Cb = lpeg.P, lpeg.V, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.R, lpeg.S, lpeg.Cg, lpeg.Cb
+
+local spaces = S(" \n\r\t\f")^0
+local lp_space = S(" \n\r\t\f")
+local lp_any = P(1)
+local lp_noequal = P("!=") / "~=" + P("<=") + P(">=") + P("==")
+local lp_doequal = P("=") / "=="
+local lp_or = P("|") / " or "
+local lp_and = P("&") / " and "
+
+local lp_builtin = P (
+ P("firstindex") / "1" +
+ P("lastindex") / "(#ll.__p__.dt or 1)" +
+ P("firstelement") / "1" +
+ P("lastelement") / "(ll.__p__.en or 1)" +
+ P("first") / "1" +
+ P("last") / "#list" +
+ P("rootposition") / "order" +
+ P("position") / "l" + -- is element in finalizer
+ P("order") / "order" +
+ P("element") / "(ll.ei or 1)" +
+ P("index") / "(ll.ni or 1)" +
+ P("match") / "(ll.mi or 1)" +
+ P("text") / "(ll.dt[1] or '')" +
+ -- P("name") / "(ll.ns~='' and ll.ns..':'..ll.tg)" +
+ P("name") / "((ll.ns~='' and ll.ns..':'..ll.tg) or ll.tg)" +
+ P("tag") / "ll.tg" +
+ P("ns") / "ll.ns"
+ ) * ((spaces * P("(") * spaces * P(")"))/"")
+
+local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * R("az","AZ","--","__")^1 * Cc("'])")
+local lp_fastpos_p = ((P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end)
+local lp_fastpos_n = ((P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end)
+local lp_fastpos = lp_fastpos_n + lp_fastpos_p
+local lp_reserved = C("and") + C("or") + C("not") + C("div") + C("mod") + C("true") + C("false")
+
+local lp_lua_function = C(R("az","AZ","__")^1 * (P(".") * R("az","AZ","__")^1)^1) * ("(") / 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 "expr." .. t .. "("
+ else
+ return "expr.error("
+ end
+end
+
+local lparent = lpeg.P("(")
+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) -- lpeg.P{"("*C(((1-S("()"))+V(1))^0)*")"}
+
+local lp_child = Cc("expr.child(ll,'") * R("az","AZ","--","__")^1 * Cc("')")
+local lp_number = S("+-") * R("09")^1
+local lp_string = Cc("'") * R("az","AZ","--","__")^1 * Cc("'")
+local lp_content = (P("'") * (1-P("'"))^0 * P("'") + P('"') * (1-P('"'))^0 * P('"'))
+
+local cleaner
+
+local lp_special = (C(P("name")+P("text")+P("tag")+P("count")+P("child"))) * value / function(t,s)
+ if expressions[t] then
+ s = s and s ~= "" and lpegmatch(cleaner,s)
+ if s and s ~= "" then
+ return "expr." .. t .. "(ll," .. s ..")"
+ else
+ return "expr." .. t .. "(ll)"
+ end
+ else
+ return "expr.error(" .. t .. ")"
+ end
+end
+
+local content =
+ lp_builtin +
+ lp_attribute +
+ lp_special +
+ lp_noequal + lp_doequal +
+ lp_or + lp_and +
+ lp_reserved +
+ lp_lua_function + lp_function +
+ lp_content + -- too fragile
+ lp_child +
+ lp_any
+
+local converter = Cs (
+ lp_fastpos + (P { lparent * (V(1))^0 * rparent + content } )^0
+)
+
+cleaner = Cs ( (
+--~ lp_fastpos +
+ lp_reserved +
+ lp_number +
+ lp_string +
+1 )^1 )
+
+
+--~ expr
+
+local template_e = [[
+ local expr = xml.expressions
+ return function(list,ll,l,order)
+ return %s
+ end
+]]
+
+local template_f_y = [[
+ local finalizer = xml.finalizers['%s']['%s']
+ return function(collection)
+ return finalizer(collection,%s)
+ end
+]]
+
+local template_f_n = [[
+ return xml.finalizers['%s']['%s']
+]]
+
+--
+
+local register_self = { kind = "axis", axis = "self" } -- , apply = apply_axis["self"] }
+local register_parent = { kind = "axis", axis = "parent" } -- , apply = apply_axis["parent"] }
+local register_descendant = { kind = "axis", axis = "descendant" } -- , apply = apply_axis["descendant"] }
+local register_child = { kind = "axis", axis = "child" } -- , apply = apply_axis["child"] }
+local register_descendant_or_self = { kind = "axis", axis = "descendant-or-self" } -- , apply = apply_axis["descendant-or-self"] }
+local register_root = { kind = "axis", axis = "root" } -- , apply = apply_axis["root"] }
+local register_ancestor = { kind = "axis", axis = "ancestor" } -- , apply = apply_axis["ancestor"] }
+local register_ancestor_or_self = { kind = "axis", axis = "ancestor-or-self" } -- , apply = apply_axis["ancestor-or-self"] }
+local register_attribute = { kind = "axis", axis = "attribute" } -- , apply = apply_axis["attribute"] }
+local register_namespace = { kind = "axis", axis = "namespace" } -- , apply = apply_axis["namespace"] }
+local register_following = { kind = "axis", axis = "following" } -- , apply = apply_axis["following"] }
+local register_following_sibling = { kind = "axis", axis = "following-sibling" } -- , apply = apply_axis["following-sibling"] }
+local register_preceding = { kind = "axis", axis = "preceding" } -- , apply = apply_axis["preceding"] }
+local register_preceding_sibling = { kind = "axis", axis = "preceding-sibling" } -- , apply = apply_axis["preceding-sibling"] }
+local register_reverse_sibling = { kind = "axis", axis = "reverse-sibling" } -- , apply = apply_axis["reverse-sibling"] }
+
+local register_auto_descendant_or_self = { kind = "axis", axis = "auto-descendant-or-self" } -- , apply = apply_axis["auto-descendant-or-self"] }
+local register_auto_descendant = { kind = "axis", axis = "auto-descendant" } -- , apply = apply_axis["auto-descendant"] }
+local register_auto_self = { kind = "axis", axis = "auto-self" } -- , apply = apply_axis["auto-self"] }
+local register_auto_child = { kind = "axis", axis = "auto-child" } -- , apply = apply_axis["auto-child"] }
+
+local register_initial_child = { kind = "axis", axis = "initial-child" } -- , apply = apply_axis["initial-child"] }
+
+local register_all_nodes = { kind = "nodes", nodetest = true, nodes = { true, false, false } }
+
+local skip = { }
+
+local function errorrunner_e(str,cnv)
+ if not skip[str] then
+ logs.report("lpath","error in expression: %s => %s",str,cnv)
+ skip[str] = cnv or str
+ end
+ return false
+end
+local function errorrunner_f(str,arg)
+ logs.report("lpath","error in finalizer: %s(%s)",str,arg or "")
+ return false
+end
+
+local function register_nodes(nodetest,nodes)
+ return { kind = "nodes", nodetest = nodetest, nodes = nodes }
+end
+
+local function register_expression(expression)
+ local converted = lpegmatch(converter,expression)
+ local runner = loadstring(format(template_e,converted))
+ runner = (runner and runner()) or function() errorrunner_e(expression,converted) end
+ return { kind = "expression", expression = expression, converted = converted, evaluator = runner }
+end
+
+local function register_finalizer(protocol,name,arguments)
+ local runner
+ if arguments and arguments ~= "" then
+ runner = loadstring(format(template_f_y,protocol or xml.defaultprotocol,name,arguments))
+ else
+ runner = loadstring(format(template_f_n,protocol or xml.defaultprotocol,name))
+ end
+ runner = (runner and runner()) or function() errorrunner_f(name,arguments) end
+ return { kind = "finalizer", name = name, arguments = arguments, finalizer = runner }
+end
+
+local expression = P { "ex",
+ ex = "[" * C((V("sq") + V("dq") + (1 - S("[]")) + V("ex"))^0) * "]",
+ sq = "'" * (1 - S("'"))^0 * "'",
+ dq = '"' * (1 - S('"'))^0 * '"',
+}
+
+local arguments = P { "ar",
+ ar = "(" * Cs((V("sq") + V("dq") + V("nq") + P(1-P(")")))^0) * ")",
+ nq = ((1 - S("),'\""))^1) / function(s) return format("%q",s) end,
+ sq = P("'") * (1 - P("'"))^0 * P("'"),
+ dq = P('"') * (1 - P('"'))^0 * P('"'),
+}
+
+-- todo: better arg parser
+
+local function register_error(str)
+ return { kind = "error", error = format("unparsed: %s",str) }
+end
+
+-- there is a difference in * and /*/ and so we need to catch a few special cases
+
+local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes) -- last one not needed
+local special_2 = P("/") * Cc(register_auto_self)
+local special_3 = P("") * Cc(register_auto_self)
+
+local parser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
+
+ patterns = spaces * V("protocol") * spaces * (
+ ( V("special") * spaces * P(-1) ) +
+ ( V("initial") * spaces * V("step") * spaces * (P("/") * spaces * V("step") * spaces)^0 )
+ ),
+
+ protocol = Cg(V("letters"),"protocol") * P("://") + Cg(Cc(nil),"protocol"),
+
+ -- the / is needed for // as descendant or self is somewhat special
+ -- step = (V("shortcuts") + V("axis") * spaces * V("nodes")^0 + V("error")) * spaces * V("expressions")^0 * spaces * V("finalizer")^0,
+ step = ((V("shortcuts") + P("/") + V("axis")) * spaces * V("nodes")^0 + V("error")) * spaces * V("expressions")^0 * spaces * V("finalizer")^0,
+
+ axis = V("descendant") + V("child") + V("parent") + V("self") + V("root") + V("ancestor") +
+ V("descendant_or_self") + V("following_sibling") + V("following") +
+ V("reverse_sibling") + V("preceding_sibling") + V("preceding") + V("ancestor_or_self") +
+ #(1-P(-1)) * Cc(register_auto_child),
+
+ special = special_1 + special_2 + special_3,
+
+ initial = (P("/") * spaces * Cc(register_initial_child))^-1,
+
+ error = (P(1)^1) / register_error,
+
+ shortcuts_a = V("s_descendant_or_self") + V("s_descendant") + V("s_child") + V("s_parent") + V("s_self") + V("s_root") + V("s_ancestor"),
+
+ shortcuts = V("shortcuts_a") * (spaces * "/" * spaces * V("shortcuts_a"))^0,
+
+ s_descendant_or_self = (P("***/") + P("/")) * Cc(register_descendant_or_self), --- *** is a bonus
+ -- s_descendant_or_self = P("/") * Cc(register_descendant_or_self),
+ s_descendant = P("**") * Cc(register_descendant),
+ s_child = P("*") * #(1-P(":")) * Cc(register_child ),
+-- s_child = P("*") * #(P("/")+P(-1)) * Cc(register_child ),
+ s_parent = P("..") * Cc(register_parent ),
+ s_self = P("." ) * Cc(register_self ),
+ s_root = P("^^") * Cc(register_root ),
+ s_ancestor = P("^") * Cc(register_ancestor ),
+
+ descendant = P("descendant::") * Cc(register_descendant ),
+ child = P("child::") * Cc(register_child ),
+ parent = P("parent::") * Cc(register_parent ),
+ self = P("self::") * Cc(register_self ),
+ root = P('root::') * Cc(register_root ),
+ ancestor = P('ancestor::') * Cc(register_ancestor ),
+ descendant_or_self = P('descendant-or-self::') * Cc(register_descendant_or_self ),
+ ancestor_or_self = P('ancestor-or-self::') * Cc(register_ancestor_or_self ),
+ -- attribute = P('attribute::') * Cc(register_attribute ),
+ -- namespace = P('namespace::') * Cc(register_namespace ),
+ following = P('following::') * Cc(register_following ),
+ following_sibling = P('following-sibling::') * Cc(register_following_sibling ),
+ preceding = P('preceding::') * Cc(register_preceding ),
+ preceding_sibling = P('preceding-sibling::') * Cc(register_preceding_sibling ),
+ reverse_sibling = P('reverse-sibling::') * Cc(register_reverse_sibling ),
+
+ nodes = (V("nodefunction") * spaces * P("(") * V("nodeset") * P(")") + V("nodetest") * V("nodeset")) / register_nodes,
+
+ expressions = expression / register_expression,
+
+ letters = R("az")^1,
+ name = (1-lpeg.S("/[]()|:*!"))^1,
+ negate = P("!") * Cc(false),
+
+ nodefunction = V("negate") + P("not") * Cc(false) + Cc(true),
+ nodetest = V("negate") + Cc(true),
+ nodename = (V("negate") + Cc(true)) * spaces * ((V("wildnodename") * P(":") * V("wildnodename")) + (Cc(false) * V("wildnodename"))),
+ wildnodename = (C(V("name")) + P("*") * Cc(false)) * #(1-P("(")),
+ nodeset = spaces * Ct(V("nodename") * (spaces * P("|") * spaces * V("nodename"))^0) * spaces,
+
+ finalizer = (Cb("protocol") * P("/")^-1 * C(V("name")) * arguments * P(-1)) / register_finalizer,
+
+}
+
+local cache = { }
+
+local function nodesettostring(set,nodetest)
+ local t = { }
+ for i=1,#set,3 do
+ local directive, ns, tg = set[i], set[i+1], set[i+2]
+ if not ns or ns == "" then ns = "*" end
+ if not tg or tg == "" then tg = "*" end
+ tg = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
+ t[#t+1] = (directive and tg) or format("not(%s)",tg)
+ end
+ if nodetest == false then
+ return format("not(%s)",concat(t,"|"))
+ else
+ return concat(t,"|")
+ end
+end
+
+local function tagstostring(list)
+ if #list == 0 then
+ return "no elements"
+ else
+ local t = { }
+ for i=1, #list do
+ local li = list[i]
+ local ns, tg = li.ns, li.tg
+ if not ns or ns == "" then ns = "*" end
+ if not tg or tg == "" then tg = "*" end
+ t[#t+1] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
+ end
+ return concat(t," ")
+ end
+end
+
+xml.nodesettostring = nodesettostring
+
+local parse_pattern -- we have a harmless kind of circular reference
+
+local function lshow(parsed)
+ if type(parsed) == "string" then
+ parsed = parse_pattern(parsed)
+ end
+ local s = table.serialize_functions -- ugly
+ table.serialize_functions = false -- ugly
+ logs.report("lpath","%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,table.serialize(parsed,false))
+ table.serialize_functions = s -- ugly
+end
+
+xml.lshow = lshow
+
+local function add_comment(p,str)
+ local pc = p.comment
+ if not pc then
+ p.comment = { str }
+ else
+ pc[#pc+1] = str
+ end
+end
+
+parse_pattern = function (pattern) -- the gain of caching is rather minimal
+ lpathcalls = lpathcalls + 1
+ if type(pattern) == "table" then
+ return pattern
+ else
+ local parsed = cache[pattern]
+ if parsed then
+ lpathcached = lpathcached + 1
+ else
+ parsed = lpegmatch(parser,pattern)
+ if parsed then
+ parsed.pattern = pattern
+ local np = #parsed
+ if np == 0 then
+ parsed = { pattern = pattern, register_self, state = "parsing error" }
+ logs.report("lpath","parsing error in '%s'",pattern)
+ lshow(parsed)
+ else
+ -- we could have done this with a more complex parser but this
+ -- is cleaner
+ local pi = parsed[1]
+ if pi.axis == "auto-child" then
+ if false then
+ add_comment(parsed, "auto-child replaced by auto-descendant-or-self")
+ parsed[1] = register_auto_descendant_or_self
+ else
+ add_comment(parsed, "auto-child replaced by auto-descendant")
+ parsed[1] = register_auto_descendant
+ end
+ elseif pi.axis == "initial-child" and np > 1 and parsed[2].axis then
+ add_comment(parsed, "initial-child removed") -- we could also make it a auto-self
+ remove(parsed,1)
+ end
+ local np = #parsed -- can have changed
+ if np > 1 then
+ local pnp = parsed[np]
+ if pnp.kind == "nodes" and pnp.nodetest == true then
+ local nodes = pnp.nodes
+ if nodes[1] == true and nodes[2] == false and nodes[3] == false then
+ add_comment(parsed, "redundant final wildcard filter removed")
+ remove(parsed,np)
+ end
+ end
+ end
+ end
+ else
+ parsed = { pattern = pattern }
+ end
+ cache[pattern] = parsed
+ if trace_lparse and not trace_lprofile then
+ lshow(parsed)
+ end
+ end
+ return parsed
+ end
+end
+
+-- we can move all calls inline and then merge the trace back
+-- technically we can combine axis and the next nodes which is
+-- what we did before but this a bit cleaner (but slower too)
+-- but interesting is that it's not that much faster when we
+-- go inline
+--
+-- beware: we need to return a collection even when we filter
+-- else the (simple) cache gets messed up
+
+-- caching found lookups saves not that much (max .1 sec on a 8 sec run)
+-- and it also messes up finalizers
+
+-- watch out: when there is a finalizer, it's always called as there
+-- can be cases that a finalizer returns (or does) something in case
+-- there is no match; an example of this is count()
+
+local profiled = { } xml.profiled = profiled
+
+local function profiled_apply(list,parsed,nofparsed,order)
+ local p = profiled[parsed.pattern]
+ if p then
+ p.tested = p.tested + 1
+ else
+ p = { tested = 1, matched = 0, finalized = 0 }
+ profiled[parsed.pattern] = p
+ end
+ local collected = list
+ for i=1,nofparsed do
+ local pi = parsed[i]
+ local kind = pi.kind
+ if kind == "axis" then
+ collected = apply_axis[pi.axis](collected)
+ elseif kind == "nodes" then
+ collected = apply_nodes(collected,pi.nodetest,pi.nodes)
+ elseif kind == "expression" then
+ collected = apply_expression(collected,pi.evaluator,order)
+ elseif kind == "finalizer" then
+ collected = pi.finalizer(collected)
+ p.matched = p.matched + 1
+ p.finalized = p.finalized + 1
+ return collected
+ end
+ if not collected or #collected == 0 then
+ local pn = i < nofparsed and parsed[nofparsed]
+ if pn and pn.kind == "finalizer" then
+ collected = pn.finalizer(collected)
+ p.finalized = p.finalized + 1
+ return collected
+ end
+ return nil
+ end
+ end
+ if collected then
+ p.matched = p.matched + 1
+ end
+ return collected
+end
+
+local function traced_apply(list,parsed,nofparsed,order)
+ if trace_lparse then
+ lshow(parsed)
+ end
+ logs.report("lpath", "collecting : %s",parsed.pattern)
+ logs.report("lpath", " root tags : %s",tagstostring(list))
+ logs.report("lpath", " order : %s",order or "unset")
+ local collected = list
+ for i=1,nofparsed do
+ local pi = parsed[i]
+ local kind = pi.kind
+ if kind == "axis" then
+ collected = apply_axis[pi.axis](collected)
+ logs.report("lpath", "% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
+ elseif kind == "nodes" then
+ collected = apply_nodes(collected,pi.nodetest,pi.nodes)
+ logs.report("lpath", "% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
+ elseif kind == "expression" then
+ collected = apply_expression(collected,pi.evaluator,order)
+ logs.report("lpath", "% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
+ elseif kind == "finalizer" then
+ collected = pi.finalizer(collected)
+ logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
+ return collected
+ end
+ if not collected or #collected == 0 then
+ local pn = i < nofparsed and parsed[nofparsed]
+ if pn and pn.kind == "finalizer" then
+ collected = pn.finalizer(collected)
+ logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
+ return collected
+ end
+ return nil
+ end
+ end
+ return collected
+end
+
+local function normal_apply(list,parsed,nofparsed,order)
+ local collected = list
+ for i=1,nofparsed do
+ local pi = parsed[i]
+ local kind = pi.kind
+ if kind == "axis" then
+ local axis = pi.axis
+ if axis ~= "self" then
+ collected = apply_axis[axis](collected)
+ end
+ elseif kind == "nodes" then
+ collected = apply_nodes(collected,pi.nodetest,pi.nodes)
+ elseif kind == "expression" then
+ collected = apply_expression(collected,pi.evaluator,order)
+ elseif kind == "finalizer" then
+ return pi.finalizer(collected)
+ end
+ if not collected or #collected == 0 then
+ local pf = i < nofparsed and parsed[nofparsed].finalizer
+ if pf then
+ return pf(collected) -- can be anything
+ end
+ return nil
+ end
+ end
+ return collected
+end
+
+local function parse_apply(list,pattern)
+ -- we avoid an extra call
+ local parsed = cache[pattern]
+ if parsed then
+ lpathcalls = lpathcalls + 1
+ lpathcached = lpathcached + 1
+ elseif type(pattern) == "table" then
+ lpathcalls = lpathcalls + 1
+ parsed = pattern
+ else
+ parsed = parse_pattern(pattern) or pattern
+ end
+ if not parsed then
+ return
+ end
+ local nofparsed = #parsed
+ if nofparsed == 0 then
+ return -- something is wrong
+ end
+ local one = list[1]
+ if not one then
+ return -- something is wrong
+ elseif not trace_lpath then
+ return normal_apply(list,parsed,nofparsed,one.mi)
+ elseif trace_lprofile then
+ return profiled_apply(list,parsed,nofparsed,one.mi)
+ else
+ return traced_apply(list,parsed,nofparsed,one.mi)
+ end
+end
+
+-- internal (parsed)
+
+expressions.child = function(e,pattern)
+ return parse_apply({ e },pattern) -- todo: cache
+end
+expressions.count = function(e,pattern)
+ local collected = parse_apply({ e },pattern) -- todo: cache
+ return (collected and #collected) or 0
+end
+
+-- external
+
+expressions.oneof = function(s,...) -- slow
+ local t = {...} for i=1,#t do if s == t[i] then return true end end return false
+end
+expressions.error = function(str)
+ xml.error_handler("unknown function in lpath expression",tostring(str or "?"))
+ return false
+end
+expressions.undefined = function(s)
+ return s == nil
+end
+
+expressions.quit = function(s)
+ if s or s == nil then
+ quit_expression = true
+ end
+ return true
+end
+
+expressions.print = function(...)
+ print(...)
+ return true
+end
+
+expressions.contains = find
+expressions.find = find
+expressions.upper = upper
+expressions.lower = lower
+expressions.number = tonumber
+expressions.boolean = toboolean
+
+-- user interface
+
+local function traverse(root,pattern,handle)
+ logs.report("xml","use 'xml.selection' instead for '%s'",pattern)
+ local collected = parse_apply({ root },pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ local r = e.__p__
+ handle(r,r.dt,e.ni)
+ end
+ end
+end
+
+local function selection(root,pattern,handle)
+ local collected = parse_apply({ root },pattern)
+ if collected then
+ if handle then
+ for c=1,#collected do
+ handle(collected[c])
+ end
+ else
+ return collected
+ end
+ end
+end
+
+xml.parse_parser = parser
+xml.parse_pattern = parse_pattern
+xml.parse_apply = parse_apply
+xml.traverse = traverse -- old method, r, d, k
+xml.selection = selection -- new method, simple handle
+
+local lpath = parse_pattern
+
+xml.lpath = lpath
+
+function xml.cached_patterns()
+ return cache
+end
+
+-- generic function finalizer (independant namespace)
+
+local function dofunction(collected,fnc)
+ if collected then
+ local f = functions[fnc]
+ if f then
+ for c=1,#collected do
+ f(collected[c])
+ end
+ else
+ logs.report("xml","unknown function '%s'",fnc)
+ end
+ end
+end
+
+xml.finalizers.xml["function"] = dofunction
+xml.finalizers.tex["function"] = dofunction
+
+-- functions
+
+expressions.text = function(e,n)
+ local rdt = e.__p__.dt
+ return (rdt and rdt[n]) or ""
+end
+
+expressions.name = function(e,n) -- ns + tg
+ local found = false
+ n = tonumber(n) or 0
+ if n == 0 then
+ found = type(e) == "table" and e
+ elseif n < 0 then
+ local d, k = e.__p__.dt, e.ni
+ for i=k-1,1,-1 do
+ local di = d[i]
+ if type(di) == "table" then
+ if n == -1 then
+ found = di
+ break
+ else
+ n = n + 1
+ end
+ end
+ end
+ else
+ local d, k = e.__p__.dt, e.ni
+ for i=k+1,#d,1 do
+ local di = d[i]
+ if type(di) == "table" then
+ if n == 1 then
+ found = di
+ break
+ else
+ n = n - 1
+ end
+ end
+ end
+ end
+ if found then
+ local ns, tg = found.rn or found.ns or "", found.tg
+ if ns ~= "" then
+ return ns .. ":" .. tg
+ else
+ return tg
+ end
+ else
+ return ""
+ end
+end
+
+expressions.tag = function(e,n) -- only tg
+ if not e then
+ return ""
+ else
+ local found = false
+ n = tonumber(n) or 0
+ if n == 0 then
+ found = (type(e) == "table") and e -- seems to fail
+ elseif n < 0 then
+ local d, k = e.__p__.dt, e.ni
+ for i=k-1,1,-1 do
+ local di = d[i]
+ if type(di) == "table" then
+ if n == -1 then
+ found = di
+ break
+ else
+ n = n + 1
+ end
+ end
+ end
+ else
+ local d, k = e.__p__.dt, e.ni
+ for i=k+1,#d,1 do
+ local di = d[i]
+ if type(di) == "table" then
+ if n == 1 then
+ found = di
+ break
+ else
+ n = n - 1
+ end
+ end
+ end
+ end
+ return (found and found.tg) or ""
+ end
+end
+
+--[[ldx--
+<p>This is the main filter function. It returns whatever is asked for.</p>
+--ldx]]--
+
+function xml.filter(root,pattern) -- no longer funny attribute handling here
+ return parse_apply({ root },pattern)
+end
+
+--[[ldx--
+<p>Often using an iterators looks nicer in the code than passing handler
+functions. The <l n='lua'/> book describes how to use coroutines for that
+purpose (<url href='http://www.lua.org/pil/9.3.html'/>). This permits
+code like:</p>
+
+<typing>
+for r, d, k in xml.elements(xml.load('text.xml'),"title") do
+ print(d[k]) -- old method
+end
+for e in xml.collected(xml.load('text.xml'),"title") do
+ print(e) -- new one
+end
+</typing>
+--ldx]]--
+
+local wrap, yield = coroutine.wrap, coroutine.yield
+
+function xml.elements(root,pattern,reverse) -- r, d, k
+ local collected = parse_apply({ root },pattern)
+ if collected then
+ if reverse then
+ return wrap(function() for c=#collected,1,-1 do
+ local e = collected[c] local r = e.__p__ yield(r,r.dt,e.ni)
+ end end)
+ else
+ return wrap(function() for c=1,#collected do
+ local e = collected[c] local r = e.__p__ yield(r,r.dt,e.ni)
+ end end)
+ end
+ end
+ return wrap(function() end)
+end
+
+function xml.collected(root,pattern,reverse) -- e
+ local collected = parse_apply({ root },pattern)
+ if collected then
+ if reverse then
+ return wrap(function() for c=#collected,1,-1 do yield(collected[c]) end end)
+ else
+ return wrap(function() for c=1,#collected do yield(collected[c]) end end)
+ end
+ end
+ return wrap(function() end)
+end
diff --git a/tex/context/base/lxml-mis.lua b/tex/context/base/lxml-mis.lua
new file mode 100644
index 000000000..9fd4270af
--- /dev/null
+++ b/tex/context/base/lxml-mis.lua
@@ -0,0 +1,99 @@
+if not modules then modules = { } end modules ['lxml-mis'] = {
+ 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"
+}
+
+local concat = table.concat
+local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
+local format, gsub, match = string.format, string.gsub, string.match
+local lpegmatch = lpeg.match
+
+--[[ldx--
+<p>The following helper functions best belong to the <t>lxml-ini</t>
+module. Some are here because we need then in the <t>mk</t>
+document and other manuals, others came up when playing with
+this module. Since this module is also used in <l n='mtxrun'/> we've
+put them here instead of loading mode modules there then needed.</p>
+--ldx]]--
+
+local function xmlgsub(t,old,new) -- will be replaced
+ local dt = t.dt
+ if dt then
+ for k=1,#dt do
+ local v = dt[k]
+ if type(v) == "string" then
+ dt[k] = gsub(v,old,new)
+ else
+ xmlgsub(v,old,new)
+ end
+ end
+ end
+end
+
+--~ xml.gsub = xmlgsub
+
+function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
+ if d and k then
+ local dkm = d[k-1]
+ if dkm and type(dkm) == "string" then
+ local s = match(dkm,"\n(%s+)")
+ xmlgsub(dk,"\n"..rep(" ",#s),"\n")
+ end
+ end
+end
+
+--~ xml.escapes = { ['&'] = '&amp;', ['<'] = '&lt;', ['>'] = '&gt;', ['"'] = '&quot;' }
+--~ xml.unescapes = { } for k,v in next, xml.escapes do xml.unescapes[v] = k end
+
+--~ function xml.escaped (str) return (gsub(str,"(.)" , xml.escapes )) end
+--~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end
+--~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>"
+
+local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
+
+-- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg
+--
+-- 1021:0335:0287:0247
+
+-- 10 * 1000 * "oeps< oeps> oeps& asfjhalskfjh alskfjh alskfjh alskfjh ;al J;LSFDJ"
+--
+-- 1559:0257:0288:0190 (last one suggested by roberto)
+
+-- escaped = Cs((S("<&>") / xml.escapes + 1)^0)
+-- escaped = Cs((S("<")/"&lt;" + S(">")/"&gt;" + S("&")/"&amp;" + 1)^0)
+local normal = (1 - S("<&>"))^0
+local special = P("<")/"&lt;" + P(">")/"&gt;" + P("&")/"&amp;"
+local escaped = Cs(normal * (special * normal)^0)
+
+-- 100 * 1000 * "oeps&lt; oeps&gt; oeps&amp;" : gsub:lpeg == 0153:0280:0151:0080 (last one by roberto)
+
+local normal = (1 - S"&")^0
+local special = P("&lt;")/"<" + P("&gt;")/">" + P("&amp;")/"&"
+local unescaped = Cs(normal * (special * normal)^0)
+
+-- 100 * 5000 * "oeps <oeps bla='oeps' foo='bar'> oeps </oeps> oeps " : gsub:lpeg == 623:501 msec (short tags, less difference)
+
+local cleansed = Cs(((P("<") * (1-P(">"))^0 * P(">"))/"" + 1)^0)
+
+xml.escaped_pattern = escaped
+xml.unescaped_pattern = unescaped
+xml.cleansed_pattern = cleansed
+
+function xml.escaped (str) return lpegmatch(escaped,str) end
+function xml.unescaped(str) return lpegmatch(unescaped,str) end
+function xml.cleansed (str) return lpegmatch(cleansed,str) end
+
+-- this might move
+
+function xml.fillin(root,pattern,str,check)
+ local e = xml.first(root,pattern)
+ if e then
+ local n = #e.dt
+ if not check or n == 0 or (n == 1 and e.dt[1] == "") then
+ e.dt = { str }
+ end
+ end
+end
diff --git a/tex/context/base/lxml-sor.lua b/tex/context/base/lxml-sor.lua
new file mode 100644
index 000000000..e220bfad6
--- /dev/null
+++ b/tex/context/base/lxml-sor.lua
@@ -0,0 +1,158 @@
+if not modules then modules = { } end modules ['lxml-sor'] = {
+ version = 1.001,
+ comment = "companion to lxml-sor.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, concat = string.format, table.concat
+local lpegmatch = lpeg.match
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+lxml.sorters = lxml.sorters or { }
+
+if not lxml.splitid then
+ local splitter = lpeg.C((1-lpeg.P(":"))^1) * lpeg.P("::") * lpeg.C(lpeg.P(1)^1)
+ function lxml.splitid(id)
+ local d, i = lpegmatch(splitter,id)
+ if d then
+ return d, i
+ else
+ return "", id
+ end
+ end
+end
+
+local lists = { }
+
+function lxml.sorters.reset(name)
+ lists[name] = {
+ sorted = false,
+ entries = { },
+ reverse = { },
+ results = { },
+ }
+end
+
+function lxml.sorters.add(name,n,key)
+ local list = lists[name]
+ if list.sorted then
+ -- reverse is messed up, we could regenerate it and go on
+ else
+ local entries = list and list.entries
+ if entries then
+ local reverse = list.reverse
+ local e = reverse[n]
+ if e then
+ local keys = entries[e][2]
+ keys[#keys+1] = key
+ else
+ entries[#entries+1] = { n, { key } }
+ reverse[n] = #entries
+ end
+ end
+ end
+end
+
+function lxml.sorters.show(name)
+ local list = lists[name]
+ local entries = list and list.entries
+ local NC, NR, bold = context.NC, context.NR, context.bold -- somehow bold is not working
+ if entries then
+ local maxn = 1
+ for i=1,#entries do
+ if #entries[i][2] > maxn then maxn = #entries[i][2] end
+ end
+ context.starttabulate { "|Tr|Tr|" .. string.rep("Tlp|",maxn) }
+ NC() bold("n")
+ NC() bold("id")
+ if maxn > 1 then
+ for i=1,maxn do
+ NC() bold("entry " .. i)
+ end
+ else
+ NC() bold("entry")
+ end
+ NC() NR()
+ context.HL()
+ for i=1,#entries do
+ local entry = entries[i]
+ local document, node = lxml.splitid(entry[1])
+ NC() context(i)
+ NC() context(node)
+ local e = entry[2]
+ for i=1,#e do
+ NC() context.detokenize(e[i])
+ end
+ NC() NR()
+ end
+ context.stoptabulate()
+ end
+end
+
+lxml.sorters.compare = sorters.comparers.basic -- (a,b)
+
+function lxml.sorters.sort(name)
+ local list = lists[name]
+ local entries = list and list.entries
+ if entries then
+ -- filtering
+ local results = { }
+ list.results = results
+ for i=1,#entries do
+ local entry = entries[i]
+ results[i] = {
+ entry = entry[1],
+ key = concat(entry[2], " "),
+ }
+ end
+ -- preparation
+ local strip = sorters.strip
+ local splitter = sorters.splitters.utf
+ local firstofsplit = sorters.firstofsplit
+ for i=1, #results do
+ local r = results[i]
+ r.split = splitter(strip(r.key))
+ end
+ -- sorting
+ sorters.sort(results,lxml.sorters.compare)
+ -- finalizing
+ list.nofsorted = #results
+ local split = { }
+ for k=1,#results do -- rather generic so maybe we need a function
+ local v = results[k]
+ local entry, tag = firstofsplit(v)
+ local s = split[entry] -- keeps track of change
+ if not s then
+ s = { tag = tag, data = { } }
+ split[entry] = s
+ end
+ s.data[#s.data+1] = v
+ end
+ list.results = split
+ -- done
+ list.sorted = true
+ end
+end
+
+function lxml.sorters.flush(name,setup)
+ local list = lists[name]
+ local results = list and list.results
+ local xmlw = context.xmlw
+ if results and next(results) then
+ for key, result in next, results do
+ local tag, data = result.tag, result.data
+ for d=1,#data do
+ xmlw(setup,data[d].entry)
+ end
+ end
+ else
+ local entries = list and list.entries
+ if entries then
+ for i=1,#entries do
+ xmlw(setup,entries[i][1])
+ end
+ end
+ end
+end
diff --git a/tex/context/base/lxml-sor.mkiv b/tex/context/base/lxml-sor.mkiv
new file mode 100644
index 000000000..14425967b
--- /dev/null
+++ b/tex/context/base/lxml-sor.mkiv
@@ -0,0 +1,94 @@
+%D \module
+%D [ file=lxml-sor,
+%D version=2009.08.24,
+%D title=\CONTEXT\ \XML\ Support,
+%D subtitle=Sorting,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D THIS IS VERY EXPERIMENTAL!
+
+\writestatus{loading}{ConTeXt XML Support / Sorting}
+
+\registerctxluafile{lxml-sor}{1.001}
+
+\unprotect
+
+\def\xmlresetsorter #1{\ctxlua{lxml.sorters.reset("#1")}}
+\def\xmladdsortentry#1#2#3{\ctxlua{lxml.sorters.add("#1","#2",\!!bs#3\!!es)}}
+\def\xmlshowsorter #1{\ctxlua{lxml.sorters.show("#1")}}
+\def\xmlflushsorter #1#2{\ctxlua{lxml.sorters.flush("#1","#2")}}
+\def\xmlsortentries #1{\ctxlua{lxml.sorters.sort("#1")}}
+
+\protect \endinput
+
+\startbuffer[test]
+<demo>
+ <entry>
+ <category>one</category>
+ <key>alpha</key>
+ <content>alpha indeed</content>
+ </entry>
+ <entry>
+ <category>one</category>
+ <key>gamma</key>
+ <content>gamma indeed</content>
+ </entry>
+ <entry>
+ <category>one</category>
+ <key>beta</key>
+ <content>beta indeed</content>
+ </entry>
+ <entry>
+ <category>two</category>
+ <key>alpha</key>
+ <content>alpha again</content>
+ </entry>
+ <entry>
+ <category>two</category>
+ <key>gamma</key>
+ <content>gamma again</content>
+ </entry>
+ <entry>
+ <category>two</category>
+ <key>beta</key>
+ <content>beta again</content>
+ </entry>
+</demo>
+\stopbuffer
+
+\startxmlsetups xml:mysetups
+ \xmlsetsetup{\xmldocument}{demo|entry|content}{xml:*}
+\stopxmlsetups
+
+\xmlregistersetup{xml:mysetups}
+
+\startxmlsetups xml:demo
+ \xmlresetsorter{demo}
+ \xmlfilter{#1}{entry/command(xml:entry:getkeys)}
+ \blank sortkeys: \blank\xmlshowsorter{demo}\blank
+ \xmlsortentries{demo}
+ \xmlflushsorter{demo}{xml:entry:flush}
+\stopxmlsetups
+
+\startxmlsetups xml:entry:getkeys
+ \xmladdsortentry{demo}{#1}{\xmltext{#1}{category}}
+ \xmladdsortentry{demo}{#1}{\xmltext{#1}{key|entry}}
+\stopxmlsetups
+
+\startxmlsetups xml:entry:flush
+ \xmltext{#1}{content}\par
+\stopxmlsetups
+
+\startxmlsetups xml:entry
+ \xmltext{#1}{content}\par
+\stopxmlsetups
+
+\starttext
+ \xmlprocessbuffer{main}{test}{}
+\stoptext
diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua
new file mode 100644
index 000000000..23cd1cf04
--- /dev/null
+++ b/tex/context/base/lxml-tab.lua
@@ -0,0 +1,1174 @@
+if not modules then modules = { } end modules ['lxml-tab'] = {
+ 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"
+}
+
+-- this module needs a cleanup: check latest lpeg, passing args, (sub)grammar, etc etc
+-- stripping spaces from e.g. cont-en.xml saves .2 sec runtime so it's not worth the
+-- trouble
+
+local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+
+--[[ldx--
+<p>The parser used here is inspired by the variant discussed in the lua book, but
+handles comment and processing instructions, has a different structure, provides
+parent access; a first version used different trickery but was less optimized to we
+went this route. First we had a find based parser, now we have an <l n='lpeg'/> based one.
+The find based parser can be found in l-xml-edu.lua along with other older code.</p>
+
+<p>Beware, the interface may change. For instance at, ns, tg, dt may get more
+verbose names. Once the code is stable we will also remove some tracing and
+optimize the code.</p>
+--ldx]]--
+
+xml = xml or { }
+
+--~ local xml = xml
+
+local concat, remove, insert = table.concat, table.remove, table.insert
+local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatable, getmetatable, tonumber
+local format, lower, find, match, gsub = string.format, string.lower, string.find, string.match, string.gsub
+local utfchar = unicode.utf8.char
+local lpegmatch = lpeg.match
+local P, S, R, C, V, C, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.C, lpeg.Cs
+
+--[[ldx--
+<p>First a hack to enable namespace resolving. A namespace is characterized by
+a <l n='url'/>. The following function associates a namespace prefix with a
+pattern. We use <l n='lpeg'/>, which in this case is more than twice as fast as a
+find based solution where we loop over an array of patterns. Less code and
+much cleaner.</p>
+--ldx]]--
+
+xml.xmlns = xml.xmlns or { }
+
+local check = P(false)
+local parse = check
+
+--[[ldx--
+<p>The next function associates a namespace prefix with an <l n='url'/>. This
+normally happens independent of parsing.</p>
+
+<typing>
+xml.registerns("mml","mathml")
+</typing>
+--ldx]]--
+
+function xml.registerns(namespace, pattern) -- pattern can be an lpeg
+ check = check + C(P(lower(pattern))) / namespace
+ parse = P { P(check) + 1 * V(1) }
+end
+
+--[[ldx--
+<p>The next function also registers a namespace, but this time we map a
+given namespace prefix onto a registered one, using the given
+<l n='url'/>. This used for attributes like <t>xmlns:m</t>.</p>
+
+<typing>
+xml.checkns("m","http://www.w3.org/mathml")
+</typing>
+--ldx]]--
+
+function xml.checkns(namespace,url)
+ local ns = lpegmatch(parse,lower(url))
+ if ns and namespace ~= ns then
+ xml.xmlns[namespace] = ns
+ end
+end
+
+--[[ldx--
+<p>Next we provide a way to turn an <l n='url'/> into a registered
+namespace. This used for the <t>xmlns</t> attribute.</p>
+
+<typing>
+resolvedns = xml.resolvens("http://www.w3.org/mathml")
+</typing>
+
+This returns <t>mml</t>.
+--ldx]]--
+
+function xml.resolvens(url)
+ return lpegmatch(parse,lower(url)) or ""
+end
+
+--[[ldx--
+<p>A namespace in an element can be remapped onto the registered
+one efficiently by using the <t>xml.xmlns</t> table.</p>
+--ldx]]--
+
+--[[ldx--
+<p>This version uses <l n='lpeg'/>. We follow the same approach as before, stack and top and
+such. This version is about twice as fast which is mostly due to the fact that
+we don't have to prepare the stream for cdata, doctype etc etc. This variant is
+is dedicated to Luigi Scarso, who challenged me with 40 megabyte <l n='xml'/> files that
+took 12.5 seconds to load (1.5 for file io and the rest for tree building). With
+the <l n='lpeg'/> implementation we got that down to less 7.3 seconds. Loading the 14
+<l n='context'/> interface definition files (2.6 meg) went down from 1.05 seconds to 0.55.</p>
+
+<p>Next comes the parser. The rather messy doctype definition comes in many
+disguises so it is no surprice that later on have to dedicate quite some
+<l n='lpeg'/> code to it.</p>
+
+<typing>
+<!DOCTYPE Something PUBLIC "... ..." "..." [ ... ] >
+<!DOCTYPE Something PUBLIC "... ..." "..." >
+<!DOCTYPE Something SYSTEM "... ..." [ ... ] >
+<!DOCTYPE Something SYSTEM "... ..." >
+<!DOCTYPE Something [ ... ] >
+<!DOCTYPE Something >
+</typing>
+
+<p>The code may look a bit complex but this is mostly due to the fact that we
+resolve namespaces and attach metatables. There is only one public function:</p>
+
+<typing>
+local x = xml.convert(somestring)
+</typing>
+
+<p>An optional second boolean argument tells this function not to create a root
+element.</p>
+
+<p>Valid entities are:</p>
+
+<typing>
+<!ENTITY xxxx SYSTEM "yyyy" NDATA zzzz>
+<!ENTITY xxxx PUBLIC "yyyy" >
+<!ENTITY xxxx "yyyy" >
+</typing>
+--ldx]]--
+
+-- not just one big nested table capture (lpeg overflow)
+
+local nsremap, resolvens = xml.xmlns, xml.resolvens
+
+local stack, top, dt, at, xmlns, errorstr, entities = { }, { }, { }, { }, { }, nil, { }
+local strip, cleanup, utfize, resolve, resolve_predefined, unify_predefined = false, false, false, false, false, false
+local dcache, hcache, acache = { }, { }, { }
+
+local mt = { }
+
+function initialize_mt(root)
+ mt = { __index = root } -- will be redefined later
+end
+
+function xml.setproperty(root,k,v)
+ getmetatable(root).__index[k] = v
+end
+
+function xml.check_error(top,toclose)
+ return ""
+end
+
+local function add_attribute(namespace,tag,value)
+ if cleanup and #value > 0 then
+ value = cleanup(value) -- new
+ end
+ if tag == "xmlns" then
+ xmlns[#xmlns+1] = resolvens(value)
+ at[tag] = value
+ elseif namespace == "" then
+ at[tag] = value
+ elseif namespace == "xmlns" then
+ xml.checkns(tag,value)
+ at["xmlns:" .. tag] = value
+ else
+ -- for the moment this way:
+ at[namespace .. ":" .. tag] = value
+ end
+end
+
+local function add_empty(spacing, namespace, tag)
+ if #spacing > 0 then
+ dt[#dt+1] = spacing
+ end
+ local resolved = (namespace == "" and xmlns[#xmlns]) or nsremap[namespace] or namespace
+ top = stack[#stack]
+ dt = top.dt
+ local t = { ns=namespace or "", rn=resolved, tg=tag, at=at, dt={}, __p__ = top }
+ dt[#dt+1] = t
+ setmetatable(t, mt)
+ if at.xmlns then
+ remove(xmlns)
+ end
+ at = { }
+end
+
+local function add_begin(spacing, namespace, tag)
+ if #spacing > 0 then
+ dt[#dt+1] = spacing
+ end
+ local resolved = (namespace == "" and xmlns[#xmlns]) or nsremap[namespace] or namespace
+ top = { ns=namespace or "", rn=resolved, tg=tag, at=at, dt={}, __p__ = stack[#stack] }
+ setmetatable(top, mt)
+ dt = top.dt
+ stack[#stack+1] = top
+ at = { }
+end
+
+local function add_end(spacing, namespace, tag)
+ if #spacing > 0 then
+ dt[#dt+1] = spacing
+ end
+ local toclose = remove(stack)
+ top = stack[#stack]
+ if #stack < 1 then
+ errorstr = format("nothing to close with %s %s", tag, xml.check_error(top,toclose) or "")
+ elseif toclose.tg ~= tag then -- no namespace check
+ errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.check_error(top,toclose) or "")
+ end
+ dt = top.dt
+ dt[#dt+1] = toclose
+ -- dt[0] = top -- nasty circular reference when serializing table
+ if toclose.at.xmlns then
+ remove(xmlns)
+ end
+end
+
+local function add_text(text)
+ if cleanup and #text > 0 then
+ dt[#dt+1] = cleanup(text)
+ else
+ dt[#dt+1] = text
+ end
+end
+
+local function add_special(what, spacing, text)
+ if #spacing > 0 then
+ dt[#dt+1] = spacing
+ end
+ if strip and (what == "@cm@" or what == "@dt@") then
+ -- forget it
+ else
+ dt[#dt+1] = { special=true, ns="", tg=what, dt={ text } }
+ end
+end
+
+local function set_message(txt)
+ errorstr = "garbage at the end of the file: " .. gsub(txt,"([ \n\r\t]*)","")
+end
+
+local reported_attribute_errors = { }
+
+local function attribute_value_error(str)
+ if not reported_attribute_errors[str] then
+ logs.report("xml","invalid attribute value: %q",str)
+ reported_attribute_errors[str] = true
+ at._error_ = str
+ end
+ return str
+end
+local function attribute_specification_error(str)
+ if not reported_attribute_errors[str] then
+ logs.report("xml","invalid attribute specification: %q",str)
+ reported_attribute_errors[str] = true
+ at._error_ = str
+ end
+ return str
+end
+
+function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end
+function xml.unknown_hex_entity_format(str) return format("&#x%s;",str) end
+function xml.unknown_any_entity_format(str) return format("&#x%s;",str) end
+
+local function fromhex(s)
+ local n = tonumber(s,16)
+ if n then
+ return utfchar(n)
+ else
+ return format("h:%s",s), true
+ end
+end
+
+local function fromdec(s)
+ local n = tonumber(s)
+ if n then
+ return utfchar(n)
+ else
+ return format("d:%s",s), true
+ end
+end
+
+-- one level expansion (simple case), no checking done
+
+local rest = (1-P(";"))^0
+local many = P(1)^0
+
+local parsedentity =
+ P("&") * (P("#x")*(rest/fromhex) + P("#")*(rest/fromdec)) * P(";") * P(-1) +
+ (P("#x")*(many/fromhex) + P("#")*(many/fromdec))
+
+-- parsing in the xml file
+
+local predefined_unified = {
+ [38] = "&amp;",
+ [42] = "&quot;",
+ [47] = "&apos;",
+ [74] = "&lt;",
+ [76] = "&gr;",
+}
+
+local predefined_simplified = {
+ [38] = "&", amp = "&",
+ [42] = '"', quot = '"',
+ [47] = "'", apos = "'",
+ [74] = "<", lt = "<",
+ [76] = ">", gt = ">",
+}
+
+local function handle_hex_entity(str)
+ local h = hcache[str]
+ if not h then
+ local n = tonumber(str,16)
+ h = unify_predefined and predefined_unified[n]
+ if h then
+ if trace_entities then
+ logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ end
+ elseif utfize then
+ h = (n and utfchar(n)) or xml.unknown_hex_entity_format(str) or ""
+ if not n then
+ logs.report("xml","utfize, ignoring hex entity &#x%s;",str)
+ elseif trace_entities then
+ logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ end
+ else
+ if trace_entities then
+ logs.report("xml","found entity &#x%s;",str)
+ end
+ h = "&#x" .. str .. ";"
+ end
+ hcache[str] = h
+ end
+ return h
+end
+
+local function handle_dec_entity(str)
+ local d = dcache[str]
+ if not d then
+ local n = tonumber(str)
+ d = unify_predefined and predefined_unified[n]
+ if d then
+ if trace_entities then
+ logs.report("xml","utfize, converting dec entity &#%s; into %s",str,d)
+ end
+ elseif utfize then
+ d = (n and utfchar(n)) or xml.unknown_dec_entity_format(str) or ""
+ if not n then
+ logs.report("xml","utfize, ignoring dec entity &#%s;",str)
+ elseif trace_entities then
+ logs.report("xml","utfize, converting dec entity &#%s; into %s",str,h)
+ end
+ else
+ if trace_entities then
+ logs.report("xml","found entity &#%s;",str)
+ end
+ d = "&#" .. str .. ";"
+ end
+ dcache[str] = d
+ end
+ return d
+end
+
+xml.parsedentitylpeg = parsedentity
+
+local function handle_any_entity(str)
+ if resolve then
+ local a = acache[str] -- per instance ! todo
+ if not a then
+ a = resolve_predefined and predefined_simplified[str]
+ if a then
+ -- one of the predefined
+ elseif type(resolve) == "function" then
+ a = resolve(str) or entities[str]
+ else
+ a = entities[str]
+ end
+ if a then
+ if trace_entities then
+ logs.report("xml","resolved entity &%s; -> %s (internal)",str,a)
+ end
+ a = lpegmatch(parsedentity,a) or a
+ else
+ if xml.unknown_any_entity_format then
+ a = xml.unknown_any_entity_format(str) or ""
+ end
+ if a then
+ if trace_entities then
+ logs.report("xml","resolved entity &%s; -> %s (external)",str,a)
+ end
+ else
+ if trace_entities then
+ logs.report("xml","keeping entity &%s;",str)
+ end
+ if str == "" then
+ a = "&error;"
+ else
+ a = "&" .. str .. ";"
+ end
+ end
+ end
+ acache[str] = a
+ elseif trace_entities then
+ if not acache[str] then
+ logs.report("xml","converting entity &%s; into %s",str,a)
+ acache[str] = a
+ end
+ end
+ return a
+ else
+ local a = acache[str]
+ if not a then
+ if trace_entities then
+ logs.report("xml","found entity &%s;",str)
+ end
+ a = resolve_predefined and predefined_simplified[str]
+ if a then
+ -- one of the predefined
+ acache[str] = a
+ elseif str == "" then
+ a = "&error;"
+ acache[str] = a
+ else
+ a = "&" .. str .. ";"
+ acache[str] = a
+ end
+ end
+ return a
+ end
+end
+
+local function handle_end_entity(chr)
+ logs.report("xml","error in entity, %q found instead of ';'",chr)
+end
+
+local space = S(' \r\n\t')
+local open = P('<')
+local close = P('>')
+local squote = S("'")
+local dquote = S('"')
+local equal = P('=')
+local slash = P('/')
+local colon = P(':')
+local semicolon = P(';')
+local ampersand = P('&')
+local valid = R('az', 'AZ', '09') + S('_-.')
+local name_yes = C(valid^1) * colon * C(valid^1)
+local name_nop = C(P(true)) * C(valid^1)
+local name = name_yes + name_nop
+local utfbom = lpeg.patterns.utfbom -- no capture
+local spacing = C(space^0)
+
+----- entitycontent = (1-open-semicolon)^0
+local anyentitycontent = (1-open-semicolon-space-close)^0
+local hexentitycontent = R("AF","af","09")^0
+local decentitycontent = R("09")^0
+local parsedentity = P("#")/"" * (
+ P("x")/"" * (hexentitycontent/handle_hex_entity) +
+ (decentitycontent/handle_dec_entity)
+ ) + (anyentitycontent/handle_any_entity)
+local entity = ampersand/"" * parsedentity * ( (semicolon/"") + #(P(1)/handle_end_entity))
+
+local text_unparsed = C((1-open)^1)
+local text_parsed = Cs(((1-open-ampersand)^1 + entity)^1)
+
+local somespace = space^1
+local optionalspace = space^0
+
+----- value = (squote * C((1 - squote)^0) * squote) + (dquote * C((1 - dquote)^0) * dquote) -- ampersand and < also invalid in value
+local value = (squote * Cs((entity + (1 - squote))^0) * squote) + (dquote * Cs((entity + (1 - dquote))^0) * dquote) -- ampersand and < also invalid in value
+
+local endofattributes = slash * close + close -- recovery of flacky html
+local whatever = space * name * optionalspace * equal
+local wrongvalue = C(P(1-whatever-close)^1 + P(1-close)^1) / attribute_value_error
+----- wrongvalue = C(P(1-whatever-endofattributes)^1 + P(1-endofattributes)^1) / attribute_value_error
+----- wrongvalue = C(P(1-space-endofattributes)^1) / attribute_value_error
+local wrongvalue = Cs(P(entity + (1-space-endofattributes))^1) / attribute_value_error
+
+local attributevalue = value + wrongvalue
+
+local attribute = (somespace * name * optionalspace * equal * optionalspace * attributevalue) / add_attribute
+----- attributes = (attribute)^0
+
+local attributes = (attribute + somespace^-1 * (((1-endofattributes)^1)/attribute_specification_error))^0
+
+local parsedtext = text_parsed / add_text
+local unparsedtext = text_unparsed / add_text
+local balanced = P { "[" * ((1 - S"[]") + V(1))^0 * "]" } -- taken from lpeg manual, () example
+
+local emptyelement = (spacing * open * name * attributes * optionalspace * slash * close) / add_empty
+local beginelement = (spacing * open * name * attributes * optionalspace * close) / add_begin
+local endelement = (spacing * open * slash * name * optionalspace * close) / add_end
+
+local begincomment = open * P("!--")
+local endcomment = P("--") * close
+local begininstruction = open * P("?")
+local endinstruction = P("?") * close
+local begincdata = open * P("![CDATA[")
+local endcdata = P("]]") * close
+
+local someinstruction = C((1 - endinstruction)^0)
+local somecomment = C((1 - endcomment )^0)
+local somecdata = C((1 - endcdata )^0)
+
+local function normalentity(k,v ) entities[k] = v end
+local function systementity(k,v,n) entities[k] = v end
+local function publicentity(k,v,n) entities[k] = v end
+
+local begindoctype = open * P("!DOCTYPE")
+local enddoctype = close
+local beginset = P("[")
+local endset = P("]")
+local doctypename = C((1-somespace-close)^0)
+local elementdoctype = optionalspace * P("<!ELEMENT") * (1-close)^0 * close
+
+local normalentitytype = (doctypename * somespace * value)/normalentity
+local publicentitytype = (doctypename * somespace * P("PUBLIC") * somespace * value)/publicentity
+local systementitytype = (doctypename * somespace * P("SYSTEM") * somespace * value * somespace * P("NDATA") * somespace * doctypename)/systementity
+local entitydoctype = optionalspace * P("<!ENTITY") * somespace * (systementitytype + publicentitytype + normalentitytype) * optionalspace * close
+
+local doctypeset = beginset * optionalspace * P(elementdoctype + entitydoctype + space)^0 * optionalspace * endset
+local definitiondoctype= doctypename * somespace * doctypeset
+local publicdoctype = doctypename * somespace * P("PUBLIC") * somespace * value * somespace * value * somespace * doctypeset
+local systemdoctype = doctypename * somespace * P("SYSTEM") * somespace * value * somespace * doctypeset
+local simpledoctype = (1-close)^1 -- * balanced^0
+local somedoctype = C((somespace * (publicdoctype + systemdoctype + definitiondoctype + simpledoctype) * optionalspace)^0)
+
+local instruction = (spacing * begininstruction * someinstruction * endinstruction) / function(...) add_special("@pi@",...) end
+local comment = (spacing * begincomment * somecomment * endcomment ) / function(...) add_special("@cm@",...) end
+local cdata = (spacing * begincdata * somecdata * endcdata ) / function(...) add_special("@cd@",...) end
+local doctype = (spacing * begindoctype * somedoctype * enddoctype ) / function(...) add_special("@dt@",...) end
+
+-- nicer but slower:
+--
+-- local instruction = (Cc("@pi@") * spacing * begininstruction * someinstruction * endinstruction) / add_special
+-- local comment = (Cc("@cm@") * spacing * begincomment * somecomment * endcomment ) / add_special
+-- local cdata = (Cc("@cd@") * spacing * begincdata * somecdata * endcdata ) / add_special
+-- local doctype = (Cc("@dt@") * spacing * begindoctype * somedoctype * enddoctype ) / add_special
+
+local trailer = space^0 * (text_unparsed/set_message)^0
+
+-- comment + emptyelement + text + cdata + instruction + V("parent"), -- 6.5 seconds on 40 MB database file
+-- text + comment + emptyelement + cdata + instruction + V("parent"), -- 5.8
+-- text + V("parent") + emptyelement + comment + cdata + instruction, -- 5.5
+
+local grammar_parsed_text = P { "preamble",
+ preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0 * V("parent") * trailer,
+ parent = beginelement * V("children")^0 * endelement,
+ children = parsedtext + V("parent") + emptyelement + comment + cdata + instruction,
+}
+
+local grammar_unparsed_text = P { "preamble",
+ preamble = utfbom^0 * instruction^0 * (doctype + comment + instruction)^0 * V("parent") * trailer,
+ parent = beginelement * V("children")^0 * endelement,
+ children = unparsedtext + V("parent") + emptyelement + comment + cdata + instruction,
+}
+
+-- maybe we will add settinsg to result as well
+
+local function xmlconvert(data, settings)
+ settings = settings or { } -- no_root strip_cm_and_dt given_entities parent_root error_handler
+ strip = settings.strip_cm_and_dt
+ utfize = settings.utfize_entities
+ resolve = settings.resolve_entities
+ resolve_predefined = settings.resolve_predefined_entities -- in case we have escaped entities
+ unify_predefined = settings.unify_predefined_entities -- &#038; -> &amp;
+ cleanup = settings.text_cleanup
+ stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
+ acache, hcache, dcache = { }, { }, { } -- not stored
+ reported_attribute_errors = { }
+ if settings.parent_root then
+ mt = getmetatable(settings.parent_root)
+ else
+ initialize_mt(top)
+ end
+ stack[#stack+1] = top
+ top.dt = { }
+ dt = top.dt
+ if not data or data == "" then
+ errorstr = "empty xml file"
+ elseif utfize or resolve then
+ if lpegmatch(grammar_parsed_text,data) then
+ errorstr = ""
+ else
+ errorstr = "invalid xml file - parsed text"
+ end
+ elseif type(data) == "string" then
+ if lpegmatch(grammar_unparsed_text,data) then
+ errorstr = ""
+ else
+ errorstr = "invalid xml file - unparsed text"
+ end
+ else
+ errorstr = "invalid xml file - no text at all"
+ end
+ if errorstr and errorstr ~= "" then
+ result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
+ setmetatable(stack, mt)
+ local error_handler = settings.error_handler
+ if error_handler == false then
+ -- no error message
+ else
+ error_handler = error_handler or xml.error_handler
+ if error_handler then
+ xml.error_handler("load",errorstr)
+ end
+ end
+ else
+ result = stack[1]
+ end
+ if not settings.no_root then
+ result = { special = true, ns = "", tg = '@rt@', dt = result.dt, at={ }, entities = entities, settings = settings }
+ setmetatable(result, mt)
+ local rdt = result.dt
+ for k=1,#rdt do
+ local v = rdt[k]
+ if type(v) == "table" and not v.special then -- always table -)
+ result.ri = k -- rootindex
+v.__p__ = result -- new, experiment, else we cannot go back to settings, we need to test this !
+ break
+ end
+ end
+ end
+ if errorstr and errorstr ~= "" then
+ result.error = true
+ end
+ return result
+end
+
+xml.convert = xmlconvert
+
+function xml.inheritedconvert(data,xmldata)
+ local settings = xmldata.settings
+ settings.parent_root = xmldata -- to be tested
+ -- settings.no_root = true
+ local xc = xmlconvert(data,settings)
+ -- xc.settings = nil
+ -- xc.entities = nil
+ -- xc.special = nil
+ -- xc.ri = nil
+ -- print(xc.tg)
+ return xc
+end
+
+--[[ldx--
+<p>Packaging data in an xml like table is done with the following
+function. Maybe it will go away (when not used).</p>
+--ldx]]--
+
+function xml.is_valid(root)
+ return root and root.dt and root.dt[1] and type(root.dt[1]) == "table" and not root.dt[1].er
+end
+
+function xml.package(tag,attributes,data)
+ local ns, tg = match(tag,"^(.-):?([^:]+)$")
+ local t = { ns = ns, tg = tg, dt = data or "", at = attributes or {} }
+ setmetatable(t, mt)
+ return t
+end
+
+function xml.is_valid(root)
+ return root and not root.error
+end
+
+xml.error_handler = (logs and logs.report) or (input and logs.report) or print
+
+--[[ldx--
+<p>We cannot load an <l n='lpeg'/> from a filehandle so we need to load
+the whole file first. The function accepts a string representing
+a filename or a file handle.</p>
+--ldx]]--
+
+function xml.load(filename,settings)
+ local data = ""
+ if type(filename) == "string" then
+ -- local data = io.loaddata(filename) - -todo: check type in io.loaddata
+ local f = io.open(filename,'r')
+ if f then
+ data = f:read("*all")
+ f:close()
+ end
+ elseif filename then -- filehandle
+ data = filename:read("*all")
+ end
+ return xmlconvert(data,settings)
+end
+
+--[[ldx--
+<p>When we inject new elements, we need to convert strings to
+valid trees, which is what the next function does.</p>
+--ldx]]--
+
+local no_root = { no_root = true }
+
+function xml.toxml(data)
+ if type(data) == "string" then
+ local root = { xmlconvert(data,no_root) }
+ return (#root > 1 and root) or root[1]
+ else
+ return data
+ end
+end
+
+--[[ldx--
+<p>For copying a tree we use a dedicated function instead of the
+generic table copier. Since we know what we're dealing with we
+can speed up things a bit. The second argument is not to be used!</p>
+--ldx]]--
+
+local function copy(old,tables)
+ if old then
+ tables = tables or { }
+ local new = { }
+ if not tables[old] then
+ tables[old] = new
+ end
+ for k,v in next, old do
+ new[k] = (type(v) == "table" and (tables[v] or copy(v, tables))) or v
+ end
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
+ return new
+ else
+ return { }
+ end
+end
+
+xml.copy = copy
+
+--[[ldx--
+<p>In <l n='context'/> serializing the tree or parts of the tree is a major
+actitivity which is why the following function is pretty optimized resulting
+in a few more lines of code than needed. The variant that uses the formatting
+function for all components is about 15% slower than the concatinating
+alternative.</p>
+--ldx]]--
+
+-- todo: add <?xml version='1.0' standalone='yes'?> when not present
+
+function xml.checkbom(root) -- can be made faster
+ if root.ri then
+ local dt, found = root.dt, false
+ for k=1,#dt do
+ local v = dt[k]
+ if type(v) == "table" and v.special and v.tg == "@pi@" and find(v.dt[1],"xml.*version=") then
+ found = true
+ break
+ end
+ end
+ if not found then
+ insert(dt, 1, { special=true, ns="", tg="@pi@", dt = { "xml version='1.0' standalone='yes'"} } )
+ insert(dt, 2, "\n" )
+ end
+ end
+end
+
+--[[ldx--
+<p>At the cost of some 25% runtime overhead you can first convert the tree to a string
+and then handle the lot.</p>
+--ldx]]--
+
+-- new experimental reorganized serialize
+
+local function verbose_element(e,handlers)
+ local handle = handlers.handle
+ local serialize = handlers.serialize
+ local ens, etg, eat, edt, ern = e.ns, e.tg, e.at, e.dt, e.rn
+ local ats = eat and next(eat) and { }
+ if ats then
+ for k,v in next, eat do
+ ats[#ats+1] = format('%s=%q',k,v)
+ end
+ end
+ if ern and trace_remap and ern ~= ens then
+ ens = ern
+ end
+ if ens ~= "" then
+ if edt and #edt > 0 then
+ if ats then
+ handle("<",ens,":",etg," ",concat(ats," "),">")
+ else
+ handle("<",ens,":",etg,">")
+ end
+ for i=1,#edt do
+ local e = edt[i]
+ if type(e) == "string" then
+ handle(e)
+ else
+ serialize(e,handlers)
+ end
+ end
+ handle("</",ens,":",etg,">")
+ else
+ if ats then
+ handle("<",ens,":",etg," ",concat(ats," "),"/>")
+ else
+ handle("<",ens,":",etg,"/>")
+ end
+ end
+ else
+ if edt and #edt > 0 then
+ if ats then
+ handle("<",etg," ",concat(ats," "),">")
+ else
+ handle("<",etg,">")
+ end
+ for i=1,#edt do
+ local ei = edt[i]
+ if type(ei) == "string" then
+ handle(ei)
+ else
+ serialize(ei,handlers)
+ end
+ end
+ handle("</",etg,">")
+ else
+ if ats then
+ handle("<",etg," ",concat(ats," "),"/>")
+ else
+ handle("<",etg,"/>")
+ end
+ end
+ end
+end
+
+local function verbose_pi(e,handlers)
+ handlers.handle("<?",e.dt[1],"?>")
+end
+
+local function verbose_comment(e,handlers)
+ handlers.handle("<!--",e.dt[1],"-->")
+end
+
+local function verbose_cdata(e,handlers)
+ handlers.handle("<![CDATA[", e.dt[1],"]]>")
+end
+
+local function verbose_doctype(e,handlers)
+ handlers.handle("<!DOCTYPE ",e.dt[1],">")
+end
+
+local function verbose_root(e,handlers)
+ handlers.serialize(e.dt,handlers)
+end
+
+local function verbose_text(e,handlers)
+ handlers.handle(e)
+end
+
+local function verbose_document(e,handlers)
+ local serialize = handlers.serialize
+ local functions = handlers.functions
+ for i=1,#e do
+ local ei = e[i]
+ if type(ei) == "string" then
+ functions["@tx@"](ei,handlers)
+ else
+ serialize(ei,handlers)
+ end
+ end
+end
+
+local function serialize(e,handlers,...)
+ local initialize = handlers.initialize
+ local finalize = handlers.finalize
+ local functions = handlers.functions
+ if initialize then
+ local state = initialize(...)
+ if not state == true then
+ return state
+ end
+ end
+ local etg = e.tg
+ if etg then
+ (functions[etg] or functions["@el@"])(e,handlers)
+ -- elseif type(e) == "string" then
+ -- functions["@tx@"](e,handlers)
+ else
+ functions["@dc@"](e,handlers)
+ end
+ if finalize then
+ return finalize()
+ end
+end
+
+local function xserialize(e,handlers)
+ local functions = handlers.functions
+ local etg = e.tg
+ if etg then
+ (functions[etg] or functions["@el@"])(e,handlers)
+ -- elseif type(e) == "string" then
+ -- functions["@tx@"](e,handlers)
+ else
+ functions["@dc@"](e,handlers)
+ end
+end
+
+local handlers = { }
+
+local function newhandlers(settings)
+ local t = table.copy(handlers.verbose or { }) -- merge
+ if settings then
+ for k,v in next, settings do
+ if type(v) == "table" then
+ tk = t[k] if not tk then tk = { } t[k] = tk end
+ for kk,vv in next, v do
+ tk[kk] = vv
+ end
+ else
+ t[k] = v
+ end
+ end
+ if settings.name then
+ handlers[settings.name] = t
+ end
+ end
+ return t
+end
+
+local nofunction = function() end
+
+function xml.sethandlersfunction(handler,name,fnc)
+ handler.functions[name] = fnc or nofunction
+end
+
+function xml.gethandlersfunction(handler,name)
+ return handler.functions[name]
+end
+
+function xml.gethandlers(name)
+ return handlers[name]
+end
+
+newhandlers {
+ name = "verbose",
+ initialize = false, -- faster than nil and mt lookup
+ finalize = false, -- faster than nil and mt lookup
+ serialize = xserialize,
+ handle = print,
+ functions = {
+ ["@dc@"] = verbose_document,
+ ["@dt@"] = verbose_doctype,
+ ["@rt@"] = verbose_root,
+ ["@el@"] = verbose_element,
+ ["@pi@"] = verbose_pi,
+ ["@cm@"] = verbose_comment,
+ ["@cd@"] = verbose_cdata,
+ ["@tx@"] = verbose_text,
+ }
+}
+
+--[[ldx--
+<p>How you deal with saving data depends on your preferences. For a 40 MB database
+file the timing on a 2.3 Core Duo are as follows (time in seconds):</p>
+
+<lines>
+1.3 : load data from file to string
+6.1 : convert string into tree
+5.3 : saving in file using xmlsave
+6.8 : converting to string using xml.tostring
+3.6 : saving converted string in file
+</lines>
+
+<p>Beware, these were timing with the old routine but measurements will not be that
+much different I guess.</p>
+--ldx]]--
+
+-- maybe this will move to lxml-xml
+
+local result
+
+local xmlfilehandler = newhandlers {
+ name = "file",
+ initialize = function(name) result = io.open(name,"wb") return result end,
+ finalize = function() result:close() return true end,
+ handle = function(...) result:write(...) end,
+}
+
+-- no checking on writeability here but not faster either
+--
+-- local xmlfilehandler = newhandlers {
+-- initialize = function(name) io.output(name,"wb") return true end,
+-- finalize = function() io.close() return true end,
+-- handle = io.write,
+-- }
+
+
+function xml.save(root,name)
+ serialize(root,xmlfilehandler,name)
+end
+
+local result
+
+local xmlstringhandler = newhandlers {
+ name = "string",
+ initialize = function() result = { } return result end,
+ finalize = function() return concat(result) end,
+ handle = function(...) result[#result+1] = concat { ... } end
+}
+
+local function xmltostring(root) -- 25% overhead due to collecting
+ if root then
+ if type(root) == 'string' then
+ return root
+ else -- if next(root) then -- next is faster than type (and >0 test)
+ return serialize(root,xmlstringhandler) or ""
+ end
+ end
+ return ""
+end
+
+local function xmltext(root) -- inline
+ return (root and xmltostring(root)) or ""
+end
+
+function initialize_mt(root)
+ mt = { __tostring = xmltext, __index = root }
+end
+
+xml.defaulthandlers = handlers
+xml.newhandlers = newhandlers
+xml.serialize = serialize
+xml.tostring = xmltostring
+
+--[[ldx--
+<p>The next function operated on the content only and needs a handle function
+that accepts a string.</p>
+--ldx]]--
+
+local function xmlstring(e,handle)
+ if not handle or (e.special and e.tg ~= "@rt@") then
+ -- nothing
+ elseif e.tg then
+ local edt = e.dt
+ if edt then
+ for i=1,#edt do
+ xmlstring(edt[i],handle)
+ end
+ end
+ else
+ handle(e)
+ end
+end
+
+xml.string = xmlstring
+
+--[[ldx--
+<p>A few helpers:</p>
+--ldx]]--
+
+--~ xmlsetproperty(root,"settings",settings)
+
+function xml.settings(e)
+ while e do
+ local s = e.settings
+ if s then
+ return s
+ else
+ e = e.__p__
+ end
+ end
+ return nil
+end
+
+function xml.root(e)
+ local r = e
+ while e do
+ e = e.__p__
+ if e then
+ r = e
+ end
+ end
+ return r
+end
+
+function xml.parent(root)
+ return root.__p__
+end
+
+function xml.body(root)
+ return (root.ri and root.dt[root.ri]) or root -- not ok yet
+end
+
+function xml.name(root)
+ if not root then
+ return ""
+ elseif root.ns == "" then
+ return root.tg
+ else
+ return root.ns .. ":" .. root.tg
+ end
+end
+
+--[[ldx--
+<p>The next helper erases an element but keeps the table as it is,
+and since empty strings are not serialized (effectively) it does
+not harm. Copying the table would take more time. Usage:</p>
+--ldx]]--
+
+function xml.erase(dt,k)
+ if dt then
+ if k then
+ dt[k] = ""
+ else for k=1,#dt do
+ dt[1] = { "" }
+ end end
+ end
+end
+
+--[[ldx--
+<p>The next helper assigns a tree (or string). Usage:</p>
+
+<typing>
+dt[k] = xml.assign(root) or xml.assign(dt,k,root)
+</typing>
+--ldx]]--
+
+function xml.assign(dt,k,root)
+ if dt and k then
+ dt[k] = (type(root) == "table" and xml.body(root)) or root
+ return dt[k]
+ else
+ return xml.body(root)
+ end
+end
+
+-- the following helpers may move
+
+--[[ldx--
+<p>The next helper assigns a tree (or string). Usage:</p>
+<typing>
+xml.tocdata(e)
+xml.tocdata(e,"error")
+</typing>
+--ldx]]--
+
+function xml.tocdata(e,wrapper)
+ local whatever = xmltostring(e.dt)
+ if wrapper then
+ whatever = format("<%s>%s</%s>",wrapper,whatever,wrapper)
+ end
+ local t = { special = true, ns = "", tg = "@cd@", at = {}, rn = "", dt = { whatever }, __p__ = e }
+ setmetatable(t,getmetatable(e))
+ e.dt = { t }
+end
+
+function xml.makestandalone(root)
+ if root.ri then
+ local dt = root.dt
+ for k=1,#dt do
+ local v = dt[k]
+ if type(v) == "table" and v.special and v.tg == "@pi@" then
+ local txt = v.dt[1]
+ if find(txt,"xml.*version=") then
+ v.dt[1] = txt .. " standalone='yes'"
+ break
+ end
+ end
+ end
+ end
+end
diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua
new file mode 100644
index 000000000..aaa90217f
--- /dev/null
+++ b/tex/context/base/lxml-tex.lua
@@ -0,0 +1,1410 @@
+if not modules then modules = { } end modules ['lxml-tst'] = {
+ version = 1.001,
+ comment = "companion to lxml-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local utfchar = utf.char
+local concat, insert, remove, gsub, find = table.concat, table.insert, table.remove
+local format, sub, gsub, find, gmatch, match = string.format, string.sub, string.gsub, string.find, string.gmatch, string.match
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local lpegmatch = lpeg.match
+local P, S, C, Cc = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc
+
+if not tex and not tex.sprint then
+ tex = {
+ sprint = function(catcodes,...) texio.write(table.concat{...}) end,
+ print = function(catcodes,...) texio.write(table.concat{...}) end,
+ write = function( ...) texio.write(table.concat{...}) end,
+ }
+ commands = {
+ writestatus = logs.report
+ }
+ resolvers.loadbinfile = function(filename) return true, io.loaddata(filename) end
+end
+
+local texsprint, texprint, texwrite = tex.sprint, tex.print, tex.write
+local texcatcodes, ctxcatcodes, vrbcatcodes, notcatcodes = tex.texcatcodes, tex.ctxcatcodes, tex.vrbcatcodes, tex.notcatcodes
+
+local xmlelements, xmlcollected, xmlsetproperty = xml.elements, xml.collected, xml.setproperty
+local xmlparseapply, xmlwithelements = xml.parse_apply, xml.withelements
+local xmlserialize, xmlcollect, xmltext, xmltostring = xml.serialize, xml.collect, xml.text, xml.tostring
+
+local variables = (interfaces and interfaces.variables) or { }
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end)
+local trace_loading = false trackers.register("lxml.loading", function(v) trace_loading = v end)
+local trace_access = false trackers.register("lxml.access", function(v) trace_access = v end)
+local trace_comments = false trackers.register("lxml.comments", function(v) trace_comments = v end)
+
+lxml = lxml or { }
+lxml.loaded = lxml.loaded or { }
+
+local loaded = lxml.loaded
+
+-- print(contextdirective("context-mathml-directive function reduction yes "))
+-- print(contextdirective("context-mathml-directive function "))
+
+xml.defaultprotocol = "tex"
+
+local finalizers = xml.finalizers
+
+finalizers.xml = finalizers.xml or { }
+finalizers.tex = finalizers.tex or { }
+
+-- this might look inefficient but it's actually rather efficient
+-- because we avoid tokenization of leading spaces and xml can be
+-- rather verbose (indented)
+
+local newline = lpeg.patterns.newline
+local space = lpeg.patterns.spacer
+local ampersand = P("&")
+local semicolon = P(";")
+local spacing = newline * space^0
+local content = C((1-spacing-ampersand)^1)
+local verbose = C((1-(space+newline))^1)
+local entity = ampersand * C((1-semicolon)^1) * semicolon
+
+local xmltextcapture = (
+ space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ?
+ space^0 * newline * space^0 * Cc(" ") / texsprint +
+ content / function(str) return texsprint(notcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
+ entity / xml.resolved_entity
+)^0
+
+local ctxtextcapture = (
+ space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ?
+ space^0 * newline * space^0 * Cc(" ") / texsprint +
+ content / function(str) return texsprint(ctxcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
+ entity / xml.resolved_entity
+)^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
+
+-- cdata
+
+local linecommand = "\\obeyedline"
+local spacecommand = "\\obeyedspace" -- "\\strut\\obeyedspace"
+local beforecommand = ""
+local aftercommand = ""
+
+local xmlverbosecapture = (
+ newline / function( ) texsprint(texcatcodes,linecommand,"{}") end +
+ verbose / function(s) texsprint(vrbcatcodes,s) end +
+ space / function( ) texsprint(texcatcodes,spacecommand,"{}") end
+)^0
+
+local function toverbatim(str)
+ if beforecommand then texsprint(texcatcodes,beforecommand,"{}") end
+ lpegmatch(xmlverbosecapture,str)
+ if aftercommand then texsprint(texcatcodes,aftercommand,"{}") end
+end
+
+function lxml.set_verbatim(before,after,obeyedline,obeyedspace)
+ beforecommand, aftercommand, linecommand, spacecommand = before, after, obeyedline, obeyedspace
+end
+
+local obeycdata = true
+
+function lxml.set_cdata()
+ obeycdata = true
+end
+
+function lxml.reset_cdata()
+ obeycdata = false
+end
+
+-- cdata and verbatim
+
+lxml.set_verbatim("\\xmlcdatabefore", "\\xmlcdataafter", "\\xmlcdataobeyedline", "\\xmlcdataobeyedspace")
+
+-- local capture = (space^0*newline)^0 * capture * (space+newline)^0 * -1
+
+function lxml.toverbatim(str)
+ if beforecommand then texsprint(texcatcodes,beforecommand,"{}") end
+ -- todo: add this to capture
+ str = gsub(str,"^[ \t]+[\n\r]+","")
+ str = gsub(str,"[ \t\n\r]+$","")
+ lpegmatch(xmlverbosecapture,str)
+ if aftercommand then texsprint(texcatcodes,aftercommand,"{}") end
+end
+
+-- storage
+
+function lxml.store(id,root,filename)
+ loaded[id] = root
+ xmlsetproperty(root,"name",id)
+ if filename then
+ xmlsetproperty(root,"filename",filename)
+ end
+end
+
+local splitter = lpeg.splitat("::")
+
+lxml.idsplitter = splitter
+
+function lxml.splitid(id)
+ local d, i = lpegmatch(splitter,id)
+ if d then
+ return d, i
+ else
+ return "", id
+ end
+end
+
+local function get_id(id, qualified)
+ if id then
+ local lid = loaded[id]
+ if lid then
+ return lid
+ elseif type(id) == "table" then
+ return id
+ else
+ local d, i = lpegmatch(splitter,id)
+ if d then
+ local ld = loaded[d]
+ if ld then
+ local ldi = ld.index
+ if ldi then
+ local root = ldi[tonumber(i)]
+ if root then
+ if qualified then -- we need this else two args that confuse others
+ return root, d
+ else
+ return root
+ end
+ elseif trace_access then
+ logs.report("lxml","'%s' has no index entry '%s'",d,i)
+ end
+ elseif trace_access then
+ logs.report("lxml","'%s' has no index",d)
+ end
+ elseif trace_access then
+ logs.report("lxml","'%s' is not loaded",d)
+ end
+ elseif trace_access then
+ logs.report("lxml","'%s' is not loaded",i)
+ end
+ end
+ elseif trace_access then
+ logs.report("lxml","invalid id (nil)")
+ end
+end
+
+lxml.id = get_id
+lxml.get_id = get_id
+
+function lxml.root(id)
+ return loaded[id]
+end
+
+-- index
+
+local nofindices = 0
+
+local function addindex(name,check_sum,force)
+ local root = get_id(name)
+ if root and (not root.index or force) then -- weird, only called once
+ local n, index, maxindex, check = 0, root.index or { }, root.maxindex or 0, root.check or { }
+ local function nest(root)
+ local dt = root.dt
+ if not root.ix then
+ maxindex = maxindex + 1
+ root.ix = maxindex
+ check[maxindex] = root.tg -- still needed ?
+ index[maxindex] = root
+ n = n + 1
+ end
+ if dt then
+ for k=1,#dt do
+ local dk = dt[k]
+ if type(dk) == "table" then
+ nest(dk)
+ end
+ end
+ end
+ end
+ nest(root)
+ nofindices = nofindices + n
+ --
+ if type(name) ~= "string" then
+ name = "unknown"
+ end
+ root.index = index
+ root.maxindex = maxindex
+ if trace_access then
+ logs.report("lxml","%s indexed, %s nodes",tostring(name),maxindex)
+ end
+ end
+end
+
+lxml.addindex = addindex
+
+-- another cache
+
+local function lxmlparseapply(id,pattern) -- better inline, saves call
+ return xmlparseapply({ get_id(id) }, pattern)
+end
+
+lxml.filter = lxmlparseapply
+
+function lxml.filterlist(list,pattern)
+ for s in gmatch(list,"[^, ]+") do -- we could cache a table
+ lxmlparseapply(s,pattern)
+ end
+end
+
+lxml["function"] = function(id,name)
+ local f = xml.functions[name]
+ return f and f(get_id(id))
+end
+
+-- rather new, indexed storage (backward refs), maybe i will merge this
+
+function lxml.checkindex(name)
+ local root = get_id(name)
+ return (root and root.index) or 0
+end
+
+function lxml.withindex(name,n,command) -- will change as name is always there now
+ local i, p = lpegmatch(splitter,n)
+ if p then
+ texsprint(ctxcatcodes,"\\xmlw{",command,"}{",n,"}")
+ else
+ texsprint(ctxcatcodes,"\\xmlw{",command,"}{",name,"::",n,"}")
+ end
+end
+
+function lxml.getindex(name,n) -- will change as name is always there now
+ local i, p = lpegmatch(splitter,n)
+ if p then
+ texsprint(ctxcatcodes,n)
+ else
+ texsprint(ctxcatcodes,name,"::",n)
+ end
+end
+
+-- loading (to be redone, no overload)
+
+xml.originalload = xml.originalload or xml.load
+
+local noffiles, nofconverted = 0, 0
+
+function xml.load(filename,settings)
+ noffiles, nofconverted = noffiles + 1, nofconverted + 1
+ starttiming(xml)
+ local ok, data = resolvers.loadbinfile(filename)
+ local xmltable = xml.convert((ok and data) or "",settings)
+ stoptiming(xml)
+ return xmltable
+end
+
+local entities = xml.entities
+
+local function entityconverter(id,str)
+ return entities[str] and "&"..str..";" -- feed back into tex end later
+end
+
+function lxml.convert(id,data,entities,compress)
+ local settings = {
+ unify_predefined_entities = true,
+ }
+ if compress and compress == variables.yes then
+ settings.strip_cm_and_dt = true
+ end
+ if entities and entities == variables.yes then
+ settings.utfize_entities = true
+ settings.resolve_entities = function (str) return entityconverter(id,str) end
+ end
+ return xml.convert(data,settings)
+end
+
+function lxml.load(id,filename,compress,entities)
+ filename = commands.preparedfile(filename)
+ if trace_loading then
+ commands.writestatus("lxml","loading file '%s' as '%s'",filename,id)
+ end
+ noffiles, nofconverted = noffiles + 1, nofconverted + 1
+ -- local xmltable = xml.load(filename)
+ local ok, data = resolvers.loadbinfile(filename)
+ local xmltable = lxml.convert(id,(ok and data) or "",compress,entities)
+ lxml.store(id,xmltable,filename)
+ return xmltable, filename
+end
+
+function lxml.register(id,xmltable,filename)
+ lxml.store(id,xmltable,filename)
+ return xmltable
+end
+
+function lxml.include(id,pattern,attribute,recurse)
+ starttiming(xml)
+ local root = get_id(id)
+ xml.include(root,pattern,attribute,recurse,function(filename)
+ if filename then
+ filename = commands.preparedfile(filename)
+ if file.dirname(filename) == "" and root.filename then
+ local dn = file.dirname(root.filename)
+ if dn ~= "" then
+ filename = file.join(dn,filename)
+ end
+ end
+ if trace_loading then
+ commands.writestatus("lxml","including file: %s",filename)
+ end
+ noffiles, nofconverted = noffiles + 1, nofconverted + 1
+ return resolvers.loadtexfile(filename) or ""
+ else
+ return ""
+ end
+ end)
+ stoptiming(xml)
+end
+
+function xml.getbuffer(name,compress,entities) -- we need to make sure that commands are processed
+ if not name or name == "" then
+ name = tex.jobname
+ end
+ nofconverted = nofconverted + 1
+ xmltostring(lxml.convert(name,concat(buffers.data[name] or {},""),compress,entities))
+end
+
+function lxml.loadbuffer(id,name,compress,entities)
+ if not name or name == "" then
+ name = tex.jobname
+ end
+ starttiming(xml)
+ nofconverted = nofconverted + 1
+ local xmltable = lxml.convert(id,buffers.collect(name or id,"\n"),compress,entities)
+ lxml.store(id,xmltable)
+ stoptiming(xml)
+ return xmltable, name or id
+end
+
+function lxml.loaddata(id,str,compress,entities)
+ starttiming(xml)
+ nofconverted = nofconverted + 1
+ local xmltable = lxml.convert(id,str or "",compress,entities)
+ lxml.store(id,xmltable)
+ stoptiming(xml)
+ return xmltable, id
+end
+
+function lxml.loadregistered(id)
+ return loaded[id], id
+end
+
+-- e.command:
+--
+-- string : setup
+-- true : text (no <self></self>)
+-- false : ignore
+-- function : call
+
+local function tex_doctype(e,handlers)
+ -- ignore
+end
+
+local function tex_comment(e,handlers)
+ if trace_comments then
+ logs.report("lxml","comment: %s",e.dt[1])
+ end
+end
+
+local default_element_handler = xml.gethandlers("verbose").functions["@el@"]
+
+local function tex_element(e,handlers)
+ local command = e.command
+ if command == nil then
+ default_element_handler(e,handlers)
+ elseif command == true then
+ -- text (no <self></self>) / so, no mkii fallback then
+ handlers.serialize(e.dt,handlers)
+ elseif command == false then
+ -- ignore
+ else
+ local tc = type(command)
+ if tc == "string" then
+ local rootname, ix = e.name, e.ix
+ if rootname then
+ if not ix then
+ addindex(rootname,false,true)
+ ix = e.ix
+ end
+ texsprint(ctxcatcodes,"\\xmlw{",command,"}{",rootname,"::",ix,"}")
+ else
+ logs.report("lxml", "fatal error: no index for '%s'",command)
+ texsprint(ctxcatcodes,"\\xmlw{",command,"}{",ix or 0,"}")
+ end
+ elseif tc == "function" then
+ command(e)
+ end
+ end
+end
+
+local pihandlers = { } xml.pihandlers = pihandlers
+
+local kind = P("context-") * C((1-P("-"))^1) * P("-directive")
+local space = S(" \n\r")
+local spaces = space^0
+local class = C((1-space)^0)
+local key = class
+local value = C(P(1-(space * -1))^0)
+
+local parser = kind * spaces * class * spaces * key * spaces * value
+
+pihandlers[#pihandlers+1] = function(str)
+-- local kind, class, key, value = lpegmatch(parser,str)
+ if str then
+ local a, b, c, d = lpegmatch(parser,str)
+ if d then
+ texsprint(ctxcatcodes,"\\xmlcontextdirective{",a",}{",b,"}{",c,"}{",d,"}")
+ end
+ end
+end
+
+local function tex_pi(e,handlers)
+ local str = e.dt[1]
+ for i=1,#pihandlers do
+ pihandlers[i](str)
+ end
+end
+
+local function tex_cdata(e,handlers)
+ if obeycdata then
+ toverbatim(e.dt[1])
+ end
+end
+
+local function tex_text(e)
+ lpegmatch(xmltextcapture,e)
+end
+
+local function ctx_text(e)
+ lpegmatch(ctxtextcapture,e)
+end
+
+local function tex_handle(...)
+-- logs.report("lxml", "error while flushing: %s", concat { ... })
+ texsprint(...) -- notcatcodes is active anyway
+end
+
+local xmltexhandler = xml.newhandlers {
+ name = "tex",
+ handle = tex_handle,
+ functions = {
+ -- ["@dc@"] = tex_document,
+ ["@dt@"] = tex_doctype,
+ -- ["@rt@"] = tex_root,
+ ["@el@"] = tex_element,
+ ["@pi@"] = tex_pi,
+ ["@cm@"] = tex_comment,
+ ["@cd@"] = tex_cdata,
+ ["@tx@"] = tex_text,
+ }
+}
+
+lxml.xmltexhandler = xmltexhandler
+
+function lxml.serialize(root)
+ xmlserialize(root,xmltexhandler)
+end
+
+function lxml.setaction(id,pattern,action)
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ for c=1,#collected do
+ collected[c].command = action
+ end
+ end
+end
+
+local function sprint(root)
+ if root then
+ local tr = type(root)
+ if tr == "string" then -- can also be result of lpath
+ -- rawroot = false
+ lpegmatch(xmltextcapture,root)
+ elseif tr == "table" then
+ if forceraw then
+ rawroot = root
+ texwrite(xmltostring(root))
+ else
+ xmlserialize(root,xmltexhandler)
+ end
+ end
+ end
+end
+
+local function tprint(root) -- we can move sprint inline
+ local tr = type(root)
+ if tr == "table" then
+ local n = #root
+ if n == 0 then
+ -- skip
+ else
+ for i=1,n do
+ sprint(root[i])
+ end
+ end
+ elseif tr == "string" then
+ lpegmatch(xmltextcapture,root)
+ end
+end
+
+local function cprint(root) -- content
+ if not root then
+ -- rawroot = false
+ -- quit
+ elseif type(root) == 'string' then
+ -- rawroot = false
+ lpegmatch(xmltextcapture,root)
+ else
+ local rootdt = root.dt
+ if forceraw then
+ rawroot = root
+ texwrite(xmltostring(rootdt or root))
+ else
+ xmlserialize(rootdt or root,xmltexhandler)
+ end
+ end
+end
+
+xml.sprint = sprint local xmlsprint = sprint -- redo these names
+xml.tprint = tprint local xmltprint = tprint
+xml.cprint = cprint local xmlcprint = cprint
+
+-- now we can flush
+
+function lxml.main(id)
+ xmlserialize(get_id(id),xmltexhandler) -- the real root (@rt@)
+end
+
+--~ -- lines (untested)
+--~
+--~ local buffer = { }
+--~
+--~ local xmllinescapture = (
+--~ newline^2 / function() buffer[#buffer+1] = "" end +
+--~ newline / function() buffer[#buffer] = buffer[#buffer] .. " " end +
+--~ content / function(s) buffer[#buffer] = buffer[#buffer] .. s end
+--~ )^0
+--~
+--~ local xmllineshandler = table.copy(xmltexhandler)
+--~
+--~ xmllineshandler.handle = function(...) lpegmatch(xmllinescapture,concat{ ... }) end
+--~
+--~ function lines(root)
+--~ if not root then
+--~ -- rawroot = false
+--~ -- quit
+--~ elseif type(root) == 'string' then
+--~ -- rawroot = false
+--~ lpegmatch(xmllinescapture,root)
+--~ elseif next(root) then -- tr == 'table'
+--~ xmlserialize(root,xmllineshandler)
+--~ end
+--~ end
+--~
+--~ function xml.lines(root) -- used at all?
+--~ buffer = { "" }
+--~ lines(root)
+--~ return result
+--~ end
+
+local function to_text(e)
+ if e.command == nil then
+ local etg = e.tg
+ if etg and e.special and etg ~= "@rt@" then
+ e.command = false -- i.e. skip
+ else
+ e.command = true -- i.e. no <self></self>
+ end
+ end
+end
+
+local function to_none(e)
+ if e.command == nil then
+ e.command = false -- i.e. skip
+ end
+end
+
+-- setups
+
+local setups = { }
+
+function lxml.set_command_to_text(id)
+ xmlwithelements(get_id(id),to_text)
+end
+
+function lxml.set_command_to_none(id)
+ xmlwithelements(get_id(id),to_none)
+end
+
+function lxml.installsetup(what,document,setup,where)
+ document = document or "*"
+ local sd = setups[document]
+ if not sd then sd = { } setups[document] = sd end
+ for k=1,#sd do
+ if sd[k] == setup then sd[k] = nil break end
+ end
+ if what == 1 then
+ if trace_loading then
+ commands.writestatus("lxml","prepending setup %s for %s",setup,document)
+ end
+ insert(sd,1,setup)
+ elseif what == 2 then
+ if trace_loading then
+ commands.writestatus("lxml","appending setup %s for %s",setup,document)
+ end
+ insert(sd,setup)
+ elseif what == 3 then
+ if trace_loading then
+ commands.writestatus("lxml","inserting setup %s for %s before %s",setup,document,where)
+ end
+ table.insert_before_value(sd,setup,where)
+ elseif what == 4 then
+ if trace_loading then
+ commands.writestatus("lxml","inserting setup %s for %s after %s",setup,document,where)
+ end
+ table.insert_after_value(sd,setup,where)
+ end
+end
+
+function lxml.flushsetups(id,...)
+ local done, list = { }, { ... }
+ for i=1,#list do
+ local document = list[i]
+ local sd = setups[document]
+ if sd then
+ for k=1,#sd do
+ local v= sd[k]
+ if not done[v] then
+ if trace_loading then
+ commands.writestatus("lxml","applying setup %02i = %s to %s",k,v,document)
+ end
+ texsprint(ctxcatcodes,"\\xmlsetup{",id,"}{",v,"}")
+ done[v] = true
+ end
+ end
+ elseif trace_loading then
+ commands.writestatus("lxml","no setups for %s",document)
+ end
+ end
+end
+
+function lxml.resetsetups(document)
+ if trace_loading then
+ commands.writestatus("lxml","resetting all setups for %s",document)
+ end
+ setups[document] = { }
+end
+
+function lxml.removesetup(document,setup)
+ local s = setups[document]
+ if s then
+ for i=1,#s do
+ if s[i] == setup then
+ if trace_loading then
+ commands.writestatus("lxml","removing setup %s for %s",setup,document)
+ end
+ remove(t,i)
+ break
+ end
+ end
+ end
+end
+
+function lxml.setsetup(id,pattern,setup)
+ if not setup or setup == "" or setup == "*" or setup == "-" or setup == "+" then
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ if trace_setups then
+ for c=1, #collected do
+ local e = collected[c]
+ local ix = e.ix or 0
+ if setup == "-" then
+ e.command = false
+ logs.report("lxml","lpath matched (a) %5i: %s = %s -> skipped",c,ix,setup)
+ elseif setup == "+" then
+ e.command = true
+ logs.report("lxml","lpath matched (b) %5i: %s = %s -> text",c,ix,setup)
+ else
+ local tg = e.tg
+ if tg then -- to be sure
+ e.command = tg
+ local ns = e.rn or e.ns
+ if ns == "" then
+ logs.report("lxml","lpath matched (c) %5i: %s = %s -> %s",c,ix,tg,tg)
+ else
+ logs.report("lxml","lpath matched (d) %5i: %s = %s:%s -> %s",c,ix,ns,tg,tg)
+ end
+ end
+ end
+ end
+ else
+ for c=1, #collected do
+ local e = collected[c]
+ if setup == "-" then
+ e.command = false
+ elseif setup == "+" then
+ e.command = true
+ else
+ e.command = e.tg
+ end
+ end
+ end
+ elseif trace_setups then
+ logs.report("lxml","no lpath matches for %s",pattern)
+ end
+ else
+ local a, b = match(setup,"^(.+:)([%*%-])$")
+ if a and b then
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ if trace_setups then
+ for c=1, #collected do
+ local e = collected[c]
+ local ns, tg, ix = e.rn or e.ns, e.tg, e.ix or 0
+ if b == "-" then
+ e.command = false
+ if ns == "" then
+ logs.report("lxml","lpath matched (e) %5i: %s = %s -> skipped",c,ix,tg)
+ else
+ logs.report("lxml","lpath matched (f) %5i: %s = %s:%s -> skipped",c,ix,ns,tg)
+ end
+ elseif b == "+" then
+ e.command = true
+ if ns == "" then
+ logs.report("lxml","lpath matched (g) %5i: %s = %s -> text",c,ix,tg)
+ else
+ logs.report("lxml","lpath matched (h) %5i: %s = %s:%s -> text",c,ix,ns,tg)
+ end
+ else
+ e.command = a .. tg
+ if ns == "" then
+ logs.report("lxml","lpath matched (i) %5i: %s = %s -> %s",c,ix,tg,e.command)
+ else
+ logs.report("lxml","lpath matched (j) %5i: %s = %s:%s -> %s",c,ix,ns,tg,e.command)
+ end
+ end
+ end
+ else
+ for c=1, #collected do
+ local e = collected[c]
+ if b == "-" then
+ e.command = false
+ elseif b == "+" then
+ e.command = true
+ else
+ e.command = a .. e.tg
+ end
+ end
+ end
+ elseif trace_setups then
+ logs.report("lxml","no lpath matches for %s",pattern)
+ end
+ else
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ if trace_setups then
+ for c=1, #collected do
+ local e = collected[c]
+ e.command = setup
+ local ns, tg, ix = e.rn or e.ns, e.tg, e.ix or 0
+ if ns == "" then
+ logs.report("lxml","lpath matched (k) %5i: %s = %s -> %s",c,ix,tg,setup)
+ else
+ logs.report("lxml","lpath matched (l) %5i: %s = %s:%s -> %s",c,ix,ns,tg,setup)
+ end
+ end
+ else
+ for c=1, #collected do
+ collected[c].command = setup
+ end
+ end
+ elseif trace_setups then
+ logs.report("lxml","no lpath matches for %s",pattern)
+ end
+ end
+ end
+end
+
+-- finalizers
+
+local finalizers = xml.finalizers.tex
+
+local function first(collected)
+ if collected then
+ xmlsprint(collected[1])
+ end
+end
+
+local function last(collected)
+ if collected then
+ xmlsprint(collected[#collected])
+ end
+end
+
+local function all(collected)
+ if collected then
+ for c=1,#collected do
+ xmlsprint(collected[c])
+ end
+ end
+end
+
+local function reverse(collected)
+ if collected then
+ for c=#collected,1,-1 do
+ xmlsprint(collected[c])
+ end
+ end
+end
+
+local function count(collected)
+ texwrite((collected and #collected) or 0)
+end
+
+local function position(collected,n)
+ -- todo: if not n then == match
+ if collected then
+ n = tonumber(n) or 0
+ if n < 0 then
+ n = #collected + n + 1
+ end
+ if n > 0 then
+ xmlsprint(collected[n])
+ end
+ end
+end
+
+local function match(collected) -- is match in preceding collected, never change, see bibxml
+ texwrite((collected and collected[1].mi) or 0)
+end
+
+local function index(collected,n)
+ if collected then
+ n = tonumber(n) or 0
+ if n < 0 then
+ n = #collected + n + 1
+ end
+ if n > 0 then
+ texwrite(collected[n].ni or 0)
+ end
+ end
+end
+
+local function command(collected,cmd)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ local ix = e.ix
+ if not ix then
+ lxml.addindex(e.name,false,true)
+ ix = e.ix
+ end
+ texsprint(ctxcatcodes,"\\xmlw{",cmd,"}{",e.name,"::",ix,"}")
+ end
+ end
+end
+
+local function attribute(collected,a,default)
+ if collected and #collected > 0 then
+ local at = collected[1].at
+ local str = (at and at[a]) or default
+ if str and str ~= "" then
+ texsprint(notcatcodes,str)
+ end
+ elseif default then
+ texsprint(notcatcodes,default)
+ end
+end
+
+local function chainattribute(collected,arguments) -- todo: optional levels
+ if collected then
+ local e = collected[1]
+ while e do
+ local at = e.at
+ if at then
+ local a = at[arguments]
+ if a then
+ texsprint(notcatcodes,a)
+ end
+ else
+ break -- error
+ end
+ e = e.__p__
+ end
+ end
+end
+
+local function text(collected)
+ if collected then
+ local nc = #collected
+ if nc == 1 then -- hardly any gain so this will go
+ cprint(collected[1])
+ else for c=1,nc do
+ cprint(collected[c])
+ end end
+ end
+end
+
+local function ctxtext(collected)
+ if collected then
+ for c=1,#collected do
+ texsprint(ctxcatcodes,collected[1].dt)
+ end
+ end
+end
+
+local lowerchars, upperchars = characters.lower, characters.upper
+
+local function lower(collected)
+ if collected then
+ for c=1,#collected do
+ texsprint(ctxcatcodes,lowerchars(collected[1].dt[1]))
+ end
+ end
+end
+
+local function upper(collected)
+ if collected then
+ for c=1,#collected do
+ texsprint(ctxcatcodes,upperchars(collected[1].dt[1]))
+ end
+ end
+end
+
+local function number(collected)
+ if collected then
+ local n = 0
+ for c=1,#collected do
+ n = n + tonumber(collected[c].dt[1] or 0)
+ end
+ texwrite(n)
+ end
+end
+
+local function concatrange(collected,start,stop,separator,lastseparator,textonly) -- test this on mml
+ if collected then
+ local nofcollected = #collected
+ local separator = separator or ""
+ local lastseparator = lastseparator or separator or ""
+ start, stop = (start == "" and 1) or tonumber(start) or 1, (stop == "" and nofcollected) or tonumber(stop) or nofcollected
+ if stop < 0 then stop = nofcollected + stop end -- -1 == last-1
+ for i=start,stop do
+ if textonly then
+ xmlcprint(collected[i])
+ else
+ xmlsprint(collected[i])
+ end
+ if i == nofcollected then
+ -- nothing
+ elseif i == nofcollected-1 and lastseparator ~= "" then
+ texsprint(ctxcatcodes,lastseparator)
+ elseif separator ~= "" then
+ texsprint(ctxcatcodes,separator)
+ end
+ end
+ end
+end
+
+local function concat(collected,separator,lastseparator,textonly) -- test this on mml
+ concatrange(collected,false,false,separator,lastseparator,textonly)
+end
+
+finalizers.first = first
+finalizers.last = last
+finalizers.all = all
+finalizers.reverse = reverse
+finalizers.count = count
+finalizers.command = command
+finalizers.attribute = attribute
+finalizers.text = text
+finalizers.lower = lower
+finalizers.upper = upper
+finalizers.ctxtext = ctxtext
+finalizers.context = ctxtext
+finalizers.position = position
+finalizers.match = match
+finalizers.index = index
+finalizers.concat = concat
+finalizers.concatrange = concatrange
+finalizers.chainattribute = chainattribute
+finalizers.default = all -- !!
+
+local concat = table.concat
+
+function finalizers.tag(collected)
+ if collected then
+ local c
+ if n == 0 or not n then
+ c = collected[1]
+ elseif n > 1 then
+ c = collected[n]
+ else
+ c = collected[#collected-n+1]
+ end
+ if c then
+ texsprint(c.tg)
+ end
+ end
+end
+
+function finalizers.name(collected)
+ if collected then
+ local c
+ if n == 0 or not n then
+ c = collected[1]
+ elseif n > 1 then
+ c = collected[n]
+ else
+ c = collected[#collected-n+1]
+ end
+ if c then
+ if c.ns == "" then
+ texsprint(c.tg)
+ else
+ texsprint(c.ns,":",c.tg)
+ end
+ end
+ end
+end
+
+function finalizers.tags(collected,nonamespace)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ local ns, tg = e.ns, e.tg
+ if nonamespace or ns == "" then
+ texsprint(tg)
+ else
+ texsprint(ns,":",tg)
+ end
+ end
+ end
+end
+
+--
+
+local function verbatim(id,before,after)
+ local root = get_id(id)
+ if root then
+ if before then texsprint(ctxcatcodes,before,"[",root.tg or "?","]") end
+ lxml.toverbatim(xmltostring(root.dt))
+ if after then texsprint(ctxcatcodes,after) end
+ end
+end
+function lxml.inlineverbatim(id)
+ verbatim(id,"\\startxmlinlineverbatim","\\stopxmlinlineverbatim")
+end
+function lxml.displayverbatim(id)
+ verbatim(id,"\\startxmldisplayverbatim","\\stopxmldisplayverbatim")
+end
+
+lxml.verbatim = verbatim
+
+-- helpers
+
+function lxml.first(id,pattern)
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ first(collected)
+ end
+end
+
+function lxml.last(id,pattern)
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ last(collected)
+ end
+end
+
+function lxml.all(id,pattern)
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ all(collected)
+ end
+end
+
+function lxml.count(id,pattern)
+ -- always needs to produce a result so no test here
+ count(lxmlparseapply(id,pattern))
+end
+
+function lxml.attribute(id,pattern,a,default)
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ attribute(collected,a,default)
+ end
+end
+
+function lxml.raw(id,pattern) -- the content, untouched by commands
+ local collected = (pattern and lxmlparseapply(id,pattern)) or get_id(id)
+ if collected then
+ texsprint(xmltostring(collected[1].dt))
+ end
+end
+
+function lxml.context(id,pattern) -- the content, untouched by commands
+ if not pattern then
+ local collected = get_id(id)
+ -- texsprint(ctxcatcodes,collected.dt[1])
+ ctx_text(collected.dt[1])
+ else
+ local collected = lxmlparseapply(id,pattern) or get_id(id)
+ if collected and #collected > 0 then
+ texsprint(ctxcatcodes,collected[1].dt)
+ end
+ end
+end
+
+function lxml.text(id,pattern)
+ local collected = (pattern and lxmlparseapply(id,pattern)) or get_id(id)
+ if collected then
+ text(collected)
+ end
+end
+
+lxml.content = text
+
+function lxml.position(id,pattern,n)
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ position(collected,n)
+ end
+end
+
+function lxml.chainattribute(id,pattern,a,default)
+ local collected = lxmlparseapply(id,pattern)
+ if collected then
+ chainattribute(collected,a,default)
+ end
+end
+
+function lxml.concatrange(id,pattern,start,stop,separator,lastseparator,textonly) -- test this on mml
+ concatrange(lxmlparseapply(id,pattern),start,stop,separator,lastseparator,textonly)
+end
+
+function lxml.concat(id,pattern,separator,lastseparator,textonly)
+ concatrange(lxmlparseapply(id,pattern),false,false,separator,lastseparator,textonly)
+end
+
+function lxml.element(id,n)
+ position(lxmlparseapply(id,"/*"),n)
+end
+
+lxml.index = lxml.position
+
+function lxml.pos(id)
+ local root = get_id(id)
+ texwrite((root and root.ni) or 0)
+end
+
+function lxml.att(id,a,default)
+ local root = get_id(id)
+ if root then
+ local at = root.at
+ local str = (at and at[a]) or default
+ if str and str ~= "" then
+ texsprint(notcatcodes,str)
+ end
+ elseif default then
+ texsprint(notcatcodes,default)
+ end
+end
+
+function lxml.name(id) -- or remapped name? -> lxml.info, combine
+ local r = get_id(id)
+ local ns = r.rn or r.ns or ""
+ if ns ~= "" then
+ texsprint(ns,":",r.tg)
+ else
+ texsprint(r.tg)
+ end
+end
+
+function lxml.match(id) -- or remapped name? -> lxml.info, combine
+ texsprint(get_id(id).mi or 0)
+end
+
+function lxml.tag(id) -- tag vs name -> also in l-xml tag->name
+ texsprint(get_id(id).tg or "")
+end
+
+function lxml.namespace(id) -- or remapped name?
+ local root = get_id(id)
+ texsprint(root.rn or root.ns or "")
+end
+
+function lxml.flush(id)
+ id = get_id(id)
+ local dt = id and id.dt
+ if dt then
+ xmlsprint(dt)
+ end
+end
+
+function lxml.snippet(id,i)
+ local e = get_id(id)
+ if e then
+ local edt = e.dt
+ if edt then
+ xmlsprint(edt[i])
+ end
+ end
+end
+
+function lxml.direct(id)
+ xmlsprint(get_id(id))
+end
+
+function lxml.command(id,pattern,cmd)
+ local i, p = get_id(id,true)
+ local collected = lxmlparseapply(i,pattern)
+ if collected then
+ local rootname = p or i.name
+ for c=1,#collected do
+ local e = collected[c]
+ local ix = e.ix
+ if not ix then
+ addindex(rootname,false,true)
+ ix = e.ix
+ end
+ texsprint(ctxcatcodes,"\\xmlw{",cmd,"}{",rootname,"::",ix,"}")
+ end
+ end
+end
+
+-- loops
+
+function lxml.collected(id,pattern,reverse)
+ return xmlcollected(get_id(id),pattern,reverse)
+end
+
+function lxml.elements(id,pattern,reverse)
+ return xmlelements(get_id(id),pattern,reverse)
+end
+
+-- obscure ones
+
+lxml.info = lxml.name
+
+-- testers
+
+local found, empty = xml.found, xml.empty
+
+local doif, doifnot, doifelse = commands.doif, commands.doifnot, commands.doifelse
+
+function lxml.doif (id,pattern) doif (found(get_id(id),pattern)) end
+function lxml.doifnot (id,pattern) doifnot (found(get_id(id),pattern)) end
+function lxml.doifelse (id,pattern) doifelse(found(get_id(id),pattern)) end
+function lxml.doiftext (id,pattern) doif (not empty(get_id(id),pattern)) end
+function lxml.doifnottext (id,pattern) doifnot (not empty(get_id(id),pattern)) end
+function lxml.doifelsetext (id,pattern) doifelse(not empty(get_id(id),pattern)) end
+
+-- special case: "*" and "" -> self else lpath lookup
+
+--~ function lxml.doifelseempty(id,pattern) doifelse(isempty(get_id(id),pattern ~= "" and pattern ~= nil)) end -- not yet done, pattern
+
+-- status info
+
+statistics.register("xml load time", function()
+ if noffiles > 0 or nofconverted > 0 then
+ return format("%s seconds, %s files, %s converted", statistics.elapsedtime(xml), noffiles, nofconverted)
+ else
+ return nil
+ end
+end)
+
+statistics.register("lxml preparation time", function()
+ local calls, cached = xml.lpathcalls(), xml.lpathcached()
+ if calls > 0 or cached > 0 then
+ return format("%s seconds, %s nodes, %s lpath calls, %s cached calls",
+ statistics.elapsedtime(lxml), nofindices, calls, cached)
+ else
+ return nil
+ end
+end)
+
+statistics.register("lxml lpath profile", function()
+ local p = xml.profiled
+ if p and next(p) then
+ local s = table.sortedkeys(p)
+ local tested, matched, finalized = 0, 0, 0
+ texio.write_nl("log","\nbegin of lxml profile\n")
+ texio.write_nl("log","\n tested matched finalized pattern\n\n")
+ for i=1,#s do
+ local pattern = s[i]
+ local pp = p[pattern]
+ local t, m, f = pp.tested, pp.matched, pp.finalized
+ tested, matched, finalized = tested + t, matched + m, finalized + f
+ texio.write_nl("log",format("%9i %9i %9i %s",t,m,f,pattern))
+ end
+ texio.write_nl("log","\nend of lxml profile\n")
+ return format("%s patterns, %s tested, %s matched, %s finalized (see log for details)",#s,tested,matched,finalized)
+ else
+ return nil
+ end
+end)
+
+-- misc
+
+function lxml.nonspace(id,pattern) -- slow, todo loop
+ xmltprint(xmlcollect(get_id(id),pattern,true))
+end
+
+function lxml.strip(id,pattern,nolines,anywhere)
+ xml.strip(get_id(id),pattern,nolines,anywhere)
+end
+
+function lxml.stripped(id,pattern,nolines)
+ local str = xmltext(get_id(id),pattern) or ""
+ str = gsub(str,"^%s*(.-)%s*$","%1")
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ xmlsprint(str)
+end
+
+function lxml.delete(id,pattern)
+ xml.delete(get_id(id),pattern)
+end
diff --git a/tex/context/base/lxml-xml.lua b/tex/context/base/lxml-xml.lua
new file mode 100644
index 000000000..f791ec0f8
--- /dev/null
+++ b/tex/context/base/lxml-xml.lua
@@ -0,0 +1,288 @@
+if not modules then modules = { } end modules ['lxml-xml'] = {
+ 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"
+}
+
+local finalizers = xml.finalizers.xml
+local xmlfilter = xml.filter -- we could inline this one for speed
+local xmltostring = xml.tostring
+local xmlserialize = xml.serialize
+
+local function first(collected) -- wrong ?
+ return collected and collected[1]
+end
+
+local function last(collected)
+ return collected and collected[#collected]
+end
+
+local function all(collected)
+ return collected
+end
+
+local function reverse(collected)
+ if collected then
+ local reversed = { }
+ for c=#collected,1,-1 do
+ reversed[#reversed+1] = collected[c]
+ end
+ return reversed
+ end
+end
+
+local function attribute(collected,name)
+ if collected and #collected > 0 then
+ local at = collected[1].at
+ return at and at[name]
+ end
+end
+
+local function att(id,name)
+ local at = id.at
+ return at and at[name]
+end
+
+local function count(collected)
+ return (collected and #collected) or 0
+end
+
+local function position(collected,n)
+ if collected then
+ n = tonumber(n) or 0
+ if n < 0 then
+ return collected[#collected + n + 1]
+ elseif n > 0 then
+ return collected[n]
+ else
+ return collected[1].mi or 0
+ end
+ end
+end
+
+local function match(collected)
+ return (collected and collected[1].mi) or 0 -- match
+end
+
+local function index(collected)
+ if collected then
+ return collected[1].ni
+ end
+end
+
+local function attributes(collected,arguments)
+ if collected then
+ local at = collected[1].at
+ if arguments then
+ return at[arguments]
+ elseif next(at) then
+ return at -- all of them
+ end
+ end
+end
+
+local function chainattribute(collected,arguments) -- todo: optional levels
+ if collected then
+ local e = collected[1]
+ while e do
+ local at = e.at
+ if at then
+ local a = at[arguments]
+ if a then
+ return a
+ end
+ else
+ break -- error
+ end
+ e = e.__p__
+ end
+ end
+ return ""
+end
+
+local function raw(collected) -- hybrid
+ if collected then
+ local e = collected[1] or collected
+ return (e and xmlserialize(e)) or "" -- only first as we cannot concat function
+ else
+ return ""
+ end
+end
+
+local function text(collected) -- hybrid
+ if collected then
+ local e = collected[1] or collected
+ return (e and xmltostring(e.dt)) or ""
+ else
+ return ""
+ end
+end
+
+local function texts(collected)
+ if collected then
+ local t = { }
+ for c=1,#collected do
+ local e = collection[c]
+ if e and e.dt then
+ t[#t+1] = e.dt
+ end
+ end
+ return t
+ end
+end
+
+local function tag(collected,n)
+ if collected then
+ local c
+ if n == 0 or not n then
+ c = collected[1]
+ elseif n > 1 then
+ c = collected[n]
+ else
+ c = collected[#collected-n+1]
+ end
+ return c and c.tg
+ end
+end
+
+local function name(collected,n)
+ if collected then
+ local c
+ if n == 0 or not n then
+ c = collected[1]
+ elseif n > 1 then
+ c = collected[n]
+ else
+ c = collected[#collected-n+1]
+ end
+ if c then
+ if c.ns == "" then
+ return c.tg
+ else
+ return c.ns .. ":" .. c.tg
+ end
+ end
+ end
+end
+
+local function tags(collected,nonamespace)
+ if collected then
+ local t = { }
+ for c=1,#collected do
+ local e = collected[c]
+ local ns, tg = e.ns, e.tg
+ if nonamespace or ns == "" then
+ t[#t+1] = tg
+ else
+ t[#t+1] = ns .. ":" .. tg
+ end
+ end
+ return t
+ end
+end
+
+local function empty(collected)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ if e then
+ local edt = e.dt
+ if edt then
+ local n = #edt
+ if n == 1 then
+ local edk = edt[1]
+ local typ = type(edk)
+ if typ == "table" then
+ return false
+ elseif edk ~= "" then -- maybe an extra tester for spacing only
+ return false
+ end
+ elseif n > 1 then
+ return false
+ end
+ end
+ end
+ end
+ end
+ return true
+end
+
+finalizers.first = first
+finalizers.last = last
+finalizers.all = all
+finalizers.reverse = reverse
+finalizers.elements = all
+finalizers.default = all
+finalizers.attribute = attribute
+finalizers.att = att
+finalizers.count = count
+finalizers.position = position
+finalizers.match = match
+finalizers.index = index
+finalizers.attributes = attributes
+finalizers.chainattribute = chainattribute
+finalizers.text = text
+finalizers.texts = texts
+finalizers.tag = tag
+finalizers.name = name
+finalizers.tags = tags
+finalizers.empty = empty
+
+-- shortcuts -- we could support xmlfilter(id,pattern,first)
+
+function xml.first(id,pattern)
+ return first(xmlfilter(id,pattern))
+end
+
+function xml.last(id,pattern)
+ return last(xmlfilter(id,pattern))
+end
+
+function xml.count(id,pattern)
+ return count(xmlfilter(id,pattern))
+end
+
+function xml.attribute(id,pattern,a,default)
+ return attribute(xmlfilter(id,pattern),a,default)
+end
+
+function xml.raw(id,pattern)
+ if pattern then
+ return raw(xmlfilter(id,pattern))
+ else
+ return raw(id)
+ end
+end
+
+function xml.text(id,pattern)
+ if pattern then
+ -- return text(xmlfilter(id,pattern))
+ local collected = xmlfilter(id,pattern)
+ return (collected and xmltostring(collected[1].dt)) or ""
+ elseif id then
+ -- return text(id)
+ return xmltostring(id.dt) or ""
+ else
+ return ""
+ end
+end
+
+xml.content = text
+
+function xml.position(id,pattern,n) -- element
+ return position(xmlfilter(id,pattern),n)
+end
+
+function xml.match(id,pattern) -- number
+ return match(xmlfilter(id,pattern))
+end
+
+function xml.empty(id,pattern)
+ return empty(xmlfilter(id,pattern))
+end
+
+xml.all = xml.filter
+xml.index = xml.position
+xml.found = xml.filter
diff --git a/tex/context/base/m-arabtex.tex b/tex/context/base/m-arabtex.tex
new file mode 100644
index 000000000..61e56e93a
--- /dev/null
+++ b/tex/context/base/m-arabtex.tex
@@ -0,0 +1,450 @@
+%D \module
+%D [ file=m-arabtex, % was font-arb,
+%D version=2003.02.22, % 1999.11.06,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Arabic,
+%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.
+
+% I still need to hook in some features into the setup
+% macro. I also have to (re)define farsi etc. in ways
+% similar to arab, so that we have dedicated environments.
+%
+% keywords needed: vocalize transscribe
+%
+% \startarabic[option=vocalize] % or vocalize=yes
+% ......
+% \stoparabic
+
+\writestatus{loading}{ConTeXt Font Macros / ArabTeX support}
+
+%D At the \NTG\ 10\high{th} anniversary meeting Klaus Lagally
+%D introduced the audience to arabic typesetting, and after
+%D that I knew that some day I really had to look into his
+%D generic package. And then, sort of simultaniously Maarten
+%D Wisse and Imran Ahsan Nyazee asked me if \CONTEXT\ could
+%D support \ARABTEX, a package that provides right to left
+%D typesetting of (several variants of) arab and hebrew.
+%D Having implemented support for chinese a few weeks before,
+%D I could not resist to build in support for arab and hebrew
+%D too. Writing support for languages that don't give me any
+%D cue on how to pronounce their script, is kind of special.
+
+%D This is a beta version, since I still have to take care of some
+%D macros that conflict with existing stuff.
+
+\unprotect
+
+\definesystemvariable{ARABTEX}
+
+\def\setupARABTEX
+ {\getparameters[\??ARABTEX]}
+
+\setupARABTEX
+ [\s!rscale=1.2,
+ \c!before=,
+ \c!after=,
+ \c!inner=\setarab,
+ \c!style=\setarabicfont\fontstylesuffix]
+
+%D A few (maybe too) simple hooks into the font mechanism. The
+%D hook into the language module is not yet done.
+
+% \unexpanded\def\setarabicfont#1% rscale
+% {\scratchdimen\@@ARABTEXrscale\bodyfontsize
+% \font\arbfont\truefontname{Arabic#1} at \currentfontscale\scratchdimen
+% \setx@skels
+% \newfonttrue
+% \arbfont}
+%
+% more modern
+%
+% \unexpanded\def\setarabicfont#1% rscale
+% {\definefont[arbfont][Arabic#1 sa \@@ARABTEXrscale]%
+% \setx@skels
+% \newfonttrue
+% \arbfont}
+%
+% more efficient
+
+\unexpanded\def\setarabicfont#1%
+ {\setx@skels
+ \newfonttrue
+ \definedfont[Arabic#1 sa \ARABTEXparameter\s!rscale]}
+
+%D Just to be compatible with Arab\TEX\ we define:
+
+\unexpanded\def\nash {\setarabicfont\s!Regular}
+\unexpanded\def\nashbf {\setarabicfont\s!Bold }
+\unexpanded\def\pnash {\setarabicfont\s!Regular}
+\unexpanded\def\pnashbf{\setarabicfont\s!Bold }
+\unexpanded\def\xnash {\setarabicfont\s!Regular}
+\unexpanded\def\xnashbf{\setarabicfont\s!Bold }
+
+%D The display arabic environment (will be an installable
+%D object) uses a few conditionals. Let's do it the
+%D \CONTEXT\ way and define an anvironment that we later can
+%D adapt.
+
+\newif\if@ignore
+\newif\if@endpe
+
+\def\setupARABTEXalternative[#1]%
+ {\dodoubleempty\getparameters[\??ARABTEX#1]}
+
+\def\defineARABTEXalternative
+ {\dodoubleempty\dodefineARABTEXalternative}
+
+\def\dodefineARABTEXalternative[#1][#2]%
+ {\iffirstargument % \startarab is defined but used already
+ \getparameters
+ [\??ARABTEX#1]
+ [\c!before=\@@ARABTEXbefore,
+ \c!after=\@@ARABTEXafter,
+ \c!inner=\@@ARABTEXinner,
+ \c!style=\@@ARABTEXstyle,
+ \s!rscale=\@@ARABTEXrscale,
+ #2]%
+ \setvalue {\e!start#1}{\displayARABTEXalternative{#1}}%
+ \unexpanded\setvalue{#1}{\inlineARABTEXalternative {#1}}%
+ \unexpanded\def\RL{\getvalue{#1}}%
+ \unexpanded\def\LR{\a@LR}%
+ \let\R=\RL
+ \let\L=\LR
+ \expandafter\all@wcmd\csname\e!stop#1\endcsname
+ \else
+ \defineARABTEXalternative[arabic]%
+ \fi}
+
+\def\initializeARABTEXinternals
+ {\ARABTEXparameter\c!inner
+ \the\everyARABTEXpreset}
+
+\newtoks \everyARABTEXpreset
+
+\let\currentARABTEXalternative\empty
+
+\def\ARABTEXparameter#1%
+ {\csname\??ARABTEX\currentARABTEXalternative#1\endcsname}
+
+\def\inlineARABTEXalternative#1#2%
+ {\bgroup
+ \edef\currentARABTEXalternative{#1}%
+ \initializeARABTEXinternals
+ \a@RL{#2}%
+ \egroup}
+
+\def\displayARABTEXalternative#1%
+ {\dodoubleempty\dostartARABTEXalternative[#1]}
+
+\def\dostartARABTEXalternative[#1][#2]%
+ {\begingroup
+ \edef\currentARABTEXalternative{#1}%
+ \getparameters[\??ARABTEX\currentARABTEXalternative][#2]%
+ \ifnum1<0\ARABTEXparameter\c!n\relax
+ \startcolumns
+ \else
+ \ARABTEXparameter\c!before
+ \fi
+ \initializeARABTEXinternals
+ \initializeARABTEXend
+ \arabtext
+ \initializeARABTEXalternative}
+
+\def\initializeARABTEXalternative
+ {\ARABTEXparameter\c!style}
+
+\def\initializeARABTEXend% \CONTEXT\ does use \end quite differently
+ {\long\def\end##1%
+ {\endarabtext
+ \ifnum1<0\ARABTEXparameter\c!n\relax
+ \stopcolumns
+ \else
+ \ARABTEXparameter\c!after
+ \fi
+ \endgroup}%
+ \let\a@l@end\end
+ \letvalue{\e!stop\currentARABTEXalternative}=\end
+ \long\def\end##1%
+ {\endarabtext
+ \endgroup
+ \if@ignore\global\@ignorefalse\expandafter\ignorespaces\fi}}
+
+%D Arabic verbatim.
+
+\def\typearab{\a@@verb}
+
+%D Some \LATEX\ macros.
+
+\def \makeatletter{\unprotect}
+\def \makeatother {\protect}
+\def \typeout {\writestatus{arabtex}}
+
+%D We have to save some macros.
+
+\let\ARABTEXversion=\empty
+
+\def\startloadingARABTEX% ugly hacks
+ {\catcode`!=12
+ \catcode`?=12
+ \pushmacro\output \let \output \scratchtoks
+ \pushmacro\LaTeX \let \LaTeX \undefined
+ \pushmacro\CJK \let \CJK \undefined
+% \pushmacro\peek@token \let \peek@token \undefined
+% \pushmacro\edmacloaded \let \edmacloaded \undefined
+ \pushmacro\year \let \year \normalyear
+ \pushmacro\month \let \month \normalmonth
+ \pushmacro\day \let \day \normalday
+ \pushmacro\input \def \input ##1 {\normalinput ##1 }
+ \pushmacro\linewidth
+ \pushmacro\datum \def\datum {\toks0}
+ \pushmacro\version \def\version {\toks2}
+ \pushmacro\theversion \let\theversion \ARABTEXversion
+ \pushmacro\emphasize
+ \pushmacro\cap}
+
+\def\stoploadingARABTEX
+ {\catcode`!=11
+ \catcode`?=11
+ \popmacro\cap
+ \popmacro\emphasize
+ \popmacro\theversion
+ \popmacro\version
+ \popmacro\datum
+ \popmacro\linewidth
+ \popmacro\input
+ \popmacro\day
+ \popmacro\month
+ \popmacro\year
+% \popmacro\edmacloaded
+% \popmacro\peek@token
+ \popmacro\CJK
+ \popmacro\LaTeX
+ \popmacro\output}
+
+%D We save some macros:
+
+\startloadingARABTEX
+
+%D When loading \ARABTEX\ we have to set back the~! and~?.
+
+\input arabtex.sty
+
+%D Since \ARABTEX\ has its own \type {\cap}, we save the
+%D new meaning. We also redefine some \PLAIN\ macros, which
+%D happen to have a different meaning in \LATEX.
+
+\let\ARABTEXversion\theversion
+\let\ARABTEXcap \cap
+
+\appendtoks
+ \let\cap\ARABTEXcap
+\to \everyARABTEXpreset
+
+\def\ARABTEXsh@ft#1%
+ {\dimen@.00#1ex
+ \multiply\dimen@\slantperpoint
+ \kern-.0156\dimen@}
+
+\appendtoks
+ \let\sh@ft\ARABTEXsh@ft
+\to \everyARABTEXpreset
+
+\def\ARABTEXd#1%
+ {{\o@lign{\relax#1\crcr\hidewidth\sh@ft{10}%
+ .\hidewidth}}}
+
+\def\ARABTEXb#1%
+ {{\o@lign{\relax#1\crcr\hidewidth\sh@ft{29}%
+ \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}}}
+
+\appendtoks
+ \let\b\ARABTEXb
+ \let\d\ARABTEXd
+\to \everyARABTEXpreset
+
+\def \ARABTEXbreakA {\hfill\break}
+\def \ARABTEXbreakB {\break}
+\edef\ARABTEXbar {\string|}
+\def \ARABTEXcomma {\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
+
+\appendtoks
+ \let\\=\ARABTEXbreakA
+ \let\|=\ARABTEXbreakB
+ \let |=\ARABTEXbar
+ \let\,=\ARABTEXcomma
+\to \everyARABTEXpreset
+
+\let\ARABTEXprotect\relax
+
+\appendtoks
+ \let\protect\ARABTEXprotect
+\to \everyARABTEXpreset
+
+%D Now we can pop the saved macros.
+
+\stoploadingARABTEX
+
+%D Ah, we have to get rid of some \type {\protect} stuff but
+%D to permit testing we add it in the \CONTEXT\ way.
+
+% \bgroup
+% \catcode`\<=\@other
+% \unexpanded\gdef\a@ins
+% {\ifmmode
+% \expandafter<%
+% \else
+% \dontleavehmode \bgroup
+% \arab@codes \set@arabfont \@waslafalse \@wasfalse
+% \expandafter\arab@insert
+% \fi}
+% \unexpanded\gdef\<{\a@ins}
+% \catcode`\<=\active
+% \global\let<=\a@ins
+% \egroup
+%
+% cleaner:
+
+\defineactivecharacter < {\a@ins} \unexpanded\gdef\<{\a@ins}%
+
+\def\normal@a@ins
+ {\dontleavehmode % context prefers this instead of \leavevmode
+ \bgroup
+ \arab@codes
+ \set@arabfont
+ \@waslafalse
+ \@wasfalse
+ \arab@insert}
+
+\unexpanded\gdef\a@ins
+ {\mathortext<\normal@a@ins}
+
+%D We also need to register a few macros:
+
+\all@wcmd\initializeARABTEXalternative % no argument, internal command
+\all@wcmd\tx % no argument, small font
+\all@wcmd\txx % no argument, smaller font
+
+%D We also hook it into the presetter.
+
+\appendtoks
+ \let\normaltx \tx \def\tx {\normaltx \setarabicfont\fontstylesuffix}%
+ \let\normaltxx\txx\def\txx{\normaltxx\setarabicfont\fontstylesuffix}%
+\to \everyARABTEXpreset
+
+%D The main definitions are:
+
+\definefontsynonym [ArabicRegular] [xnsh14]
+\definefontsynonym [ArabicBold] [xnsh14bf]
+
+\defineARABTEXalternative
+ [arabic]
+ [\c!inner=\setarab,
+ \c!style=\setarabicfont\fontstylesuffix]
+
+\defineARABTEXalternative
+ [farsi]
+ [\c!inner=\setfarsi,
+ \c!style=\setarabicfont\fontstylesuffix]
+
+\defineARABTEXalternative
+ [urdu]
+ [\c!inner=\seturdu,
+ \c!style=\setarabicfont\fontstylesuffix]
+
+\defineARABTEXalternative
+ [maghribi]
+ [\c!inner=\setmaghribi,
+ \c!style=\setarabicfont\fontstylesuffix]
+
+%D Apart from such definitions, one can adapt the settings
+%D using \type {\setupARABTEXalternative}.
+%D
+%D A few years ago at the Holland Festivities, I attended {\em
+%D The Cave}, one of the most impressive combinations of music
+%D and video I know. This composition of Steve Reich (music)
+%D and .. (video) concentrates on the common grounds of arabs
+%D and jews: their ancestor Abram. Listening to the \CDROM's
+%D of {\em The Cave}, provided me the right ambiance for
+%D filling in the details of this module. In {\em The Cave},
+%D interviews, music, and |<|believe it or not|>| rhythmic
+%D typography are the cornerstones. Remembering those big
+%D screens, it strikes me that like music, \TEX\ too is a
+%D perfect instrument to cross cultural and linguistic
+%D borders. So, let's load Hebrew support as well:
+
+\unexpanded\def\sethebrewfont#1%
+ {\setx@skels
+ \newfonttrue
+ \definedfont[Hebrew#1 sa \ARABTEXparameter\s!rscale]}
+
+% \let \setheb \sethebrew
+
+\unexpanded\def\pheb {\sethebrewfont\s!Regular}
+\unexpanded\def\phebbf{\sethebrewfont\s!Bold}
+
+% \startloadingARABTEX
+
+% \ReadFile{hebtex.sty}
+% \ReadFile{apatch.sty}
+% \ReadFile{hepatch.sty}
+
+% \stoploadingARABTEX
+
+\definefontsynonym [HebrewRegular] [hclassic]
+\definefontsynonym [HebrewBold] [hcaption]
+
+\defineARABTEXalternative
+ [hebrew]
+ [\c!inner=\sethebrew,
+ \c!style=\sethebrewfont\fontstylesuffix]
+
+%D Now we're done:
+
+\protect \endinput
+
+% everyoutput : \charsubdefmax \arab@charsubdefmax
+
+% \defineconversion [abjad] [\abj@d]
+%
+% voetnoten verbatim lijsten indexen tabellen uitlijnen
+%
+% \v!hoofdstuk=al-fa.slu
+% \v!inhoud=al-mu.htawayAtu
+% \v!figuren=qA'imaTu al-.suwaru
+% \v!tabellen=qA'imaTu al-^gadAwilu
+% \v!grafieken=qA'imaTu al-rusUmu
+% \v!index=al-fihrisu
+% \v!bijlage=al-mul.haqu
+
+% \usemodule[arabtex]
+%
+% \usetypescript[postscript] \switchtotypeface[postscript]
+%
+% \setarab \novocalize
+%
+% \starttext
+%
+% \placecontent
+%
+% \section{\<mu.hammad>} % short arabic use \< .. >
+% \section{\<mu.hammad>} % short arabic use \< .. >
+%
+% \startarabic
+% mu.hammad 'i_d q"aAm zay"d" + i_d yaqUm zyd + A_d zyd q"aAm
+%
+% mu.hammad 'i_d q"aAm zay"d" + i_d yaqUm zyd + A_d zyd q"aAm
+% \stoparabic
+%
+% \section{\<al-maq.sad>}
+%
+% \startarabic
+% mu.hammad 'i_d q"aAm zay"d" + i_d yaqUm zyd + A_d zyd q"aAm
+% \stoparabic
+%
+% \stoptext
diff --git a/tex/context/base/m-barcodes.mkiv b/tex/context/base/m-barcodes.mkiv
new file mode 100644
index 000000000..b0eae1485
--- /dev/null
+++ b/tex/context/base/m-barcodes.mkiv
@@ -0,0 +1,122 @@
+%D \module
+%D [ file=m-pstricks,
+%D version=2010.03.14,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Barcodes,
+%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.
+
+% \startTEXpage
+% \startPSTRICKS
+% \pspicture(-4mm,-1mm)(38mm,26mm)
+% \psbarcode{9781860742712}{includetext guardwhitespace}{ean13}%
+% \endpspicture
+% \stopPSTRICKS
+% \stopTEXpage
+
+% 978-94-90688-01-1
+%
+% 978 = ean isbn identifier (979 also)
+% 94 = country code
+% 90688 = publisher code
+% 01 = title 1
+% 1 = checksum
+
+\usemodule[pstricks]
+
+\usePSTRICKSmodule[pst-barcode]
+
+\definefont[barcodefont][file:ocrb10]
+% \definefont[barcodefont][file:texgyreheros-regular]
+
+\startluacode
+plugins.barcodes = { }
+
+local function split(code)
+ local t = { string.byte(code,1,#code) }
+ if #t >= 12 then
+ local s = 0
+ for i=1,11,2 do
+ s = s + (t[i]-48)
+ end
+ for i=2,12,2 do
+ s = s + 3 * (t[i]-48)
+ end
+ local m = s % 10
+ local c = (m > 0 and (10 - m)) or 0
+ return t, s, m, c
+ end
+end
+
+function plugins.barcodes.isbn_1(original)
+ local code = string.gsub(original,"%-","")
+ local t, s, m, c = split(code)
+ if t then
+ if #t == 13 then
+ local e = ((c == t[13] - 48) and "correct") or "wrong"
+ logs.report("isbn code","code=%s, sum=%s, checksum=%s, modulo=%s, status=%s",original,s,m,c,e)
+ else
+ logs.report("isbn code","code=%s, sum=%s, checksum=%s, modulo=%s",original,s,m,c)
+ code= code .. c
+ end
+ end
+ tex.sprint(code)
+end
+
+function plugins.barcodes.isbn_2(original)
+ local code = string.gsub(original,"%-","")
+ local t, s, m, c = split(code)
+ if t and #t == 12 then
+ original = original .. "-" .. c
+ end
+ tex.sprint(original)
+end
+\stopluacode
+
+\startsetups barcode:isbn
+ \scale
+ [width=5cm]
+ {
+ \vbox {
+ \hbox {
+ \hskip3.7mm
+ \scale[width=34mm]{\barcodefont ISBN \ctxlua{plugins.barcodes.isbn_2("\getvariable{barcode}{code}")}}
+ }
+ \par
+ \normalexpanded { \noexpand \setPSTRICKS {
+ \noexpand \pspicture(-4mm,-1mm)(38mm,26mm)
+ \noexpand \psbarcode {
+ \ctxlua{plugins.barcodes.isbn_1("\getvariable{barcode}{code}")}
+ } {
+ includetext guardwhitespace
+ } {
+ ean13
+ }
+ \noexpand \endpspicture
+ }
+ \noexpand \processPSTRICKS }
+ }
+ }
+\stopsetups
+
+\def\barcode[#1]%
+ {\bgroup
+ \setvariables[barcode][type=isbn,#1]%
+ \directsetup{barcode:\getvariable{barcode}{type}}%
+ \egroup}
+
+% \usemodule[barcodes]
+%
+% \starttext
+% \startTEXpage
+% \barcode[type=isbn,code=978-94-90688-01-1]
+% \stopTEXpage
+% \stoptext
+
+\endinput
+
diff --git a/tex/context/base/m-chart.mkii b/tex/context/base/m-chart.mkii
new file mode 100644
index 000000000..2554fa2d4
--- /dev/null
+++ b/tex/context/base/m-chart.mkii
@@ -0,0 +1,48 @@
+%D \module
+%D [ file=m-chart,
+%D version=1998.10.10,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Flow Charts,
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The \XML\ interface:
+
+\unprotect
+
+\startXMLdefinitions flowchart
+
+\defineXMLargument [flowchartdefinition]
+ {\defineFLOWchart[\XMLpar{flowchartdefinition}{identifier}{unknown}]}
+
+\defineXMLpickup [flowcell]
+ {\startFLOWcell
+ \defineXMLargument[name]{\unspaceafter\name}%
+ \defineXMLargument[shape]{\unspaceafter\shape}%
+ \defineXMLnestedargument[text]{\text}}
+ {\stopFLOWcell}
+
+\defineXMLenvironment [location] % global unspace/store
+ {\bgroup\defineXMLpush[x]\defineXMLpush[y]}
+ {\XMLunspace{x}\XMLunspace{y}%
+ \expanded{\egroup\noexpand\location{\XMLpop{x},\XMLpop{y}}}}
+
+\defineXMLenvironment [connection]
+ {\bgroup\defineXMLpush[type]\defineXMLpush[name]}%
+ {\XMLunspace{type}\XMLunspace{name}%
+ \expanded{\egroup\noexpand\connection[\XMLpop{type}]{\XMLpop{name}}}}
+
+\defineXMLsingular [flowchart]
+ {\expanded{\FLOWchart[\XMLpar{flowchart}{identifier}{unknown}]}}
+
+\defineXMLdirective [flowchart] [shapes] \setupFLOWshapes
+\defineXMLdirective [flowchart] [lines] \setupFLOWlines
+
+\stopXMLdefinitions
+
+\protect \endinput
diff --git a/tex/context/base/m-chart.mkiv b/tex/context/base/m-chart.mkiv
new file mode 100644
index 000000000..4c008a5ee
--- /dev/null
+++ b/tex/context/base/m-chart.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=m-chart,
+%D version=1998.10.10,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Flow Charts,
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The \XML\ interface:
+
+\unprotect
+
+\writestatus\m!systems{The chart mkiv xml interface is not yet defined!}
+
+\protect \endinput
diff --git a/tex/context/base/m-chart.tex b/tex/context/base/m-chart.tex
new file mode 100644
index 000000000..5ccf4c2ad
--- /dev/null
+++ b/tex/context/base/m-chart.tex
@@ -0,0 +1,1285 @@
+%D \module
+%D [ file=m-chart,
+%D version=1998.10.10,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Flow Charts,
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA / 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.
+
+% todo: \localpushmacro/\localpopmacro (dohandleflowchart etc)
+% todo: make mkiv variant
+% todo: use dimexpr/numspr
+
+% will be redone with layers and dimexpr or even better, by just using
+% textext .. a nice example of old code
+
+%D This is an experimental module. Pieces of code will be moved
+%D to other modules. More features are possible but will be
+%D interfaces later.
+%D
+%D When finished this module will be documented. The main macro
+%D is still a rather big one and there is some redundant and
+%D slow code that needs a clean up.
+
+% arrow, dash
+% crossing
+% \goto -> \normalgoto
+% class -> class:name (ref prefix)
+% c, automatisch geen overlap zoeken
+% eind eerder chart connecties
+% relateren aan korps
+% check op bestaan naam, bestaan shape
+% auto als extern figuur
+% subchart
+% pijlen
+% focus
+% ook nog \MPmessage
+% areapath -> krappe vlak
+% clippath -> gehele vlak
+%
+% offset : clip offset
+% breedte : breedte cel
+% hoogte : hoogte cel
+% dx : halve afstand in breedte (grid breedte = breedte + 2dx)
+% dy : halve afstand in hoogte (grid hoogte = hoogte + 2dy)
+% x : x offset (clipping)
+% y : y offset (clipping)
+% nx : minimaal aantal cellen horizontaal
+% ny : minimaal aantal cellen vertikaal
+%
+% shape none en geen equivalent maken
+%
+% kaderkleur achtergrondkleur
+% lijnkleur lijndikte
+% focus focuskaderkleur focusachtergrondkleur
+% richting
+%
+% focus koppelen aan kleur
+
+\unprotect
+
+\definesorting [flowchart] [flowcharts] [\v!none] % no access
+\setupsorting [flowchart] [\c!state=\v!stop] % off by default
+
+\def\@FLOW@{@FLOW@}
+\def\@FLOC@{@FLOC@}
+\def\@FLOX@{@FLOX@}
+
+\def\@@FLOW{@@FLOW}
+\def\@@FLOL{@@FLOL}
+\def\@@FLOS{@@FLOS}
+\def\@@FLOF{@@FLOF}
+\def\@@FLOT{@@FLOT}
+\def\@@FLOX{@@FLOX}
+
+\def\@@MPx {@@MPx}
+\def\@@MPy {@@MPy}
+
+\def\FLOWbufferprefix{flw-}
+
+\def\processFLOWbuffer#1{\getbuffer[\FLOWbufferprefix#1]}
+\def\typeFLOWbuffer #1{\typebuffer[\FLOWbufferprefix#1]}
+
+\def\setFLOWname#1#2% funny hack that makes sure that we get
+ {\bgroup % names that are acceptable for METAPOST
+ \lccode`0=`a\lccode`1=`b\lccode`2=`c\lccode`3=`d\lccode`4=`e%
+ \lccode`5=`f\lccode`6=`g\lccode`7=`h\lccode`8=`i\lccode`9=`j%
+ \lccode` =`\_\lccode`-=`\_\lccode`_=`\_%
+ \lowercase{\gdef#1{#2}}%
+ \egroup}
+
+% een gobble als default is sneller, en dan alleen setten als
+% nodig
+
+\def\resetFLOWcell
+ {% variables
+ \global\let\FLOWname \empty
+ \global\let\FLOWalign \empty
+ \global\let\FLOWshape \empty
+ \global\let\FLOWlocation \empty
+ \global\let\FLOWtext \empty
+ \global\let\FLOWhelp \empty
+ \global\let\FLOWdestination\empty
+ \global\let\FLOWoverlay \empty
+ \global\let\FLOWfocus \empty
+ \global\let\tFLOWlabel \empty
+ \global\let\bFLOWlabel \empty
+ \global\let\lFLOWlabel \empty
+ \global\let\rFLOWlabel \empty
+ \global\let\bcFLOWlabel \empty
+ \global\let\tcFLOWlabel \empty
+ \global\let\lcFLOWlabel \empty
+ \global\let\rcFLOWlabel \empty
+ \global\let\tFLOWexit \empty
+ \global\let\bFLOWexit \empty
+ \global\let\lFLOWexit \empty
+ \global\let\rFLOWexit \empty
+ % commands
+ \let\name \doFLOWname
+ \let\shape \doFLOWshape
+ \let\destination\doFLOWdestination
+ \let\location \doFLOWlocation
+ \let\focus \doFLOWfocus
+ \let\overlay \doFLOWoverlay
+ \let\figure \doFLOWfigure
+ \let\text \doFLOWtext
+ \let\comment \doFLOWcomment
+ \let\label \doFLOWlabel
+ \let\help \doFLOWhelp
+ \let\connection \doFLOWconnection
+ \let\exit \doFLOWexit
+ % convenience commands
+ \let\locate \doFLOWlocate
+ \let\connect \doFLOWconnect}
+
+\let\FLOWcell \s!unknown
+\let\FLOWshape \s!unknown
+\let\FLOWdestination\s!unknown
+\let\FLOWfocus \s!unknown
+\let\FLOWoverlay \empty
+\let\FLOWtext \empty
+
+\def\doFLOWname#1%
+ {\def\FLOWcell{#1}\setFLOWname\FLOWname{name_#1}\ignorespaces}
+
+\def\doFLOWshape#1%
+ {\gdef\FLOWshape{#1}\ignorespaces}
+
+\def\doFLOWdestination#1%
+ {\gdef\FLOWdestination{#1}\ignorespaces}
+
+\def\doFLOWlocation#1%
+ {\setFLOWlocation#1\end\ignorespaces}
+
+\def\doFLOWfocus#1%
+ {\gdef\FLOWfocus{#1}\ignorespaces}
+
+\def\doFLOWoverlay#1%
+ {\gdef\FLOWoverlay{#1}\ignorespaces}
+
+\def\doFLOWfigure#1%
+ {\defineoverlay[\s!dummy][\overlayfigure{#1}]%
+ \overlay\s!dummy}
+
+\def\doFLOWtext
+ {\dosingleempty\dodoFLOWtext}
+
+\def\dodoFLOWtext[#1]% % #2%
+ {\gdef\FLOWalign{#1}\gdef\FLOWtext}% {#2}}
+
+\def\doFLOWcomment[#1]#2%
+ {\ignorespaces\dogobblesingleempty}
+
+\def\doFLOWlabel[#1]#2% wordt dit gebruikt ?
+ {\setgvalue{#1FLOWlabel}{#2}\ignorespaces}
+
+\def\doFLOWhelp#1%
+ {\gdef\FLOWhelp{#1}\ignorespaces}
+
+\def\doFLOWconnection
+ {\dodoubleempty\dodoFLOWconnection}
+
+\def\dodoFLOWconnection[#1][#2]#3%
+ {\ignorespaces}
+
+\def\doFLOWconnect
+ {\connection}
+
+\def\doFLOWlocate
+ {\location}
+
+\def\doFLOWexit[#1]#2%
+ {\setgvalue{#1FLOWexit}{#2}\ignorespaces}
+
+\def\startFLOWchart
+ {\bgroup
+ \let\stopFLOWchart\egroup
+ \obeylines % lelijk, buffers nog eens fatsoeneren
+ \dodoubleempty\dostartFLOWchart}
+
+\def\dostartFLOWchart[#1][#2]%
+ {\preparenextFLOWchart{#1}{#2}%
+ \dostartbuffer[\FLOWbufferprefix\nofFLOWcharts][startFLOWchart][stopFLOWchart]}
+
+\def\defineFLOWchart%
+ {\dodoubleempty\dodefineFLOWchart}
+
+\long\def\dodefineFLOWchart[#1][#2]#3%
+ {\preparenextFLOWchart{#1}{#2}%
+ \setbuffer[\FLOWbufferprefix\nofFLOWcharts]#3\endbuffer}
+
+\def\preparenextFLOWchart#1#2%
+ {\doglobal\increment\nofFLOWcharts
+ \flowchart{#1}%
+ \setxvalue{\@FLOW@-#1}{\noexpand\dohandleflowchart[\nofFLOWcharts][#2]}}
+
+\def\setupFLOWcharts{\dodoubleargument\getparameters[\@@FLOW]}
+\def\setupFLOWlines {\dodoubleargument\getparameters[\@@FLOL]}
+\def\setupFLOWshapes{\dodoubleargument\getparameters[\@@FLOS]}
+\def\setupFLOWfocus {\dodoubleargument\getparameters[\@@FLOF]}
+\def\setupFLOWsets {\dodoubleargument\getparameters[\@@FLOX]}
+
+\setupFLOWcharts
+ [\c!option=,
+ \c!bodyfont=,
+ \c!dot=, % private option
+ \c!width=12\bodyfontsize,
+ \c!height=7\bodyfontsize,
+ \c!maxwidth=,
+ \c!maxheight=,
+ \c!offset=\v!standard, % == auto offset
+ \c!dx=2\bodyfontsize,
+ \c!dy=2\bodyfontsize,
+ \c!nx=0, % 1,
+ \c!ny=0, % 1,
+ \c!x=1,
+ \c!y=1,
+ \c!autofocus=,
+ \c!focus=,
+ \c!background=, % \v!color,
+ \c!backgroundcolor=\s!white,
+ \c!rulethickness=\linewidth,
+ \c!frame=\v!off,
+ \c!framecolor=]
+
+\setupFLOWlines
+ [\c!corner=\v!round,
+ \c!arrow=\v!yes,
+ \c!dash=\v!no,
+ \c!radius=.375\bodyfontsize, % 2.5\c!rulethickness
+ \c!color=FLOWlinecolor,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=\v!none]
+
+\setupFLOWshapes
+ [\c!default=action,
+ \c!framecolor=FLOWframecolor,
+ \c!background=\v!color,
+ \c!backgroundcolor=FLOWbackgroundcolor,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=.5\bodyfontsize]
+
+\setupFLOWfocus
+ [\c!framecolor=FLOWfocuscolor,
+ \c!background=\@@FLOSbackground,
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!backgroundscreen=\@@FLOSbackgroundscreen,
+ \c!rulethickness=\@@FLOSrulethickness,
+ \c!offset=\@@FLOSoffset]
+
+\definecolor [FLOWfocuscolor] [s=.2]
+\definecolor [FLOWlinecolor] [s=.5]
+\definecolor [FLOWframecolor] [s=.7]
+\definecolor [FLOWbackgroundcolor] [s=.9]
+
+\newcounter\includeFLOWx
+\newcounter\includeFLOWy
+
+\def\includeFLOWchart
+ {\dodoubleempty\doincludeFLOWchart}
+
+\def\doincludeFLOWchart[#1][#2]%
+ {\pushmacro\includeFLOWx
+ \pushmacro\includeFLOWy
+ \getparameters[FLOWi][x=1,y=1,#2]%
+ \increment(\includeFLOWx,0\FLOWix)\decrement\includeFLOWx
+ \increment(\includeFLOWy,0\FLOWiy)\decrement\includeFLOWy
+ \def\dodoincludeFLOWchart##1%
+ {\doifdefined{\@FLOW@-##1}
+ {\globalpushmacro\dohandleflowchart % was local
+ \gdef\dohandleflowchart[####1][####2]%
+ {\globalpopmacro\dohandleflowchart % was local
+ \resetFLOWlocation
+ \processFLOWbuffer{####1}}%
+ \getvalue{\@FLOW@-##1}}}%
+ \processcommalist[#1]\dodoincludeFLOWchart
+ \popmacro\includeFLOWx
+ \popmacro\includeFLOWy}
+
+\def\resetFLOWlocation
+ {\globallet\lastFLOWx\!!zerocount
+ \globallet\lastFLOWy\!!zerocount}
+
+\def\dosetFLOWlocation[#1#2]#3#4%
+ {\processaction
+ [#1#2]
+ [ +=>\scratchcounter\numexpr#4+ 1+#3\relax,
+ -=>\scratchcounter\numexpr#4- 1+#3\relax,
+ +#2=>\scratchcounter\numexpr#4+#2+#3\relax,
+ -#2=>\scratchcounter\numexpr#4-#2+#3\relax,
+ \s!default=>\scratchcounter\numexpr#4 +#3\relax,
+ \s!unknown=>\scratchcounter\numexpr0#1#2+#3\relax]%
+ \xdef#4{\the\scratchcounter}}
+
+\def\setFLOWlocation#1,#2\end
+ {\dosetFLOWlocation[#1\empty]\includeFLOWx\lastFLOWx
+ \dosetFLOWlocation[#2\empty]\includeFLOWy\lastFLOWy
+ \xdef\FLOWlocation{\lastFLOWx,\lastFLOWy}}
+
+\def\FLOWshapes
+ {node, action, procedure, product, decision, archive,
+ loop, wait, subprocedure, singledocument, multidocument,
+ sub procedure, single document, multi document, up, down,
+ left, right}
+
+\def\FLOWlines
+ {up, down, left, right}
+
+\def\FLOWsetconnect#1%
+ {\donefalse
+ \let\cFLOWfrom\empty
+ \let\cFLOWto\empty
+ \let\zFLOWfrom\!!zerocount
+ \let\zFLOWto\!!zerocount
+ \handletokens#1\with\doFLOWsetconnect
+ \ifx\cFLOWto\empty\let\cFLOWfrom\empty\fi}
+
+\def\doFLOWsetconnect#1%
+ {\ifx #1p%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1+%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1n%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifx#1-%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifdone
+ \edef\cFLOWto{\FLOWconnector#1}%
+ \else
+ \edef\cFLOWfrom{\FLOWconnector#1}%
+ \donetrue
+ \fi\fi\fi\fi\fi}
+
+\def\FLOWconnector#1%
+ {\if#1bbottom\else\if#1ttop\else\if#1lleft\else\if#1rright\fi\fi\fi\fi}
+
+\newif\ifFLOWscaling \FLOWscalingtrue
+
+\def\@@FLOW@@offset{\@@FLOWoffset}
+
+\def\getFLOWchart
+ {\dodoubleempty\dogetFLOWchart}
+
+\def\dogetFLOWchart[#1][#2]%
+ {\doifundefinedelse{\@FLOW@-#1}
+ {\writestatus{FLOW}{unknown chart #1}%
+ \framed
+ [\c!width=12\bodyfontsize,\c!height=8\bodyfontsize]
+ {\tttf [chart #1]}}
+ {\dodogetFLOWchart[#1][#2]}}
+
+\def\dodogetFLOWchart[#1][#2]% to be split a bit more
+ {\vbox\bgroup
+ \insidefloattrue
+ \forgetall
+ \dontcomplain
+ % \offinterlineskip % we now explicitly use \nointerlineskip later on
+ \def\dohandleflowchart[##1][##2]%
+ {\def\currentFLOWnumber{##1}%
+ \getparameters[\@@FLOW][##2]}%
+ \getvalue{\@FLOW@-#1}%
+ \getparameters[\@@FLOW][#2]% dubbelop ?
+ \doifsomething{\@@FLOWautofocus}
+ {\checkFLOWautofocus}%
+ %\message{AUTOSHAPE 3: (\@@FLOWx,\@@FLOWy)->(\@@FLOWnx,\@@FLOWny)}\wait
+ \global\let\FLOWwidth \@@FLOWnx
+ \global\let\FLOWheight\@@FLOWny
+ \let\startFLOWcell\startFLOWcellA
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \ifcase\@@FLOWnx\relax \let\@@FLOWnx\FLOWwidth \fi
+ \ifcase\@@FLOWny\relax \let\@@FLOWny\FLOWheight \fi
+ \doifnothing{\@@FLOWmaxwidth\@@FLOWmaxheight}{\FLOWscalingfalse}%
+ \ifFLOWscaling
+ \doifnothing{\@@FLOWmaxwidth }{\let\@@FLOWmaxwidth \maxdimen}%
+ \doifnothing{\@@FLOWmaxheight}{\let\@@FLOWmaxheight\maxdimen}%
+ \scratchcounter\bodyfontpoints
+ \doloop % NOG FONTSWITCH OM EX EN EM TE LATEN WERKEN
+ {\ifnum\scratchcounter>1 % NU DIMENSIONS IN TERMS OF BODYFONTSIZE
+ \bodyfontsize=\the\scratchcounter pt
+ \dimen0=\@@FLOWmaxwidth
+ \dimen2=\@@FLOWwidth
+ \dimen4=\@@FLOWdx
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWnx\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \dimen0=\@@FLOWmaxheight
+ \dimen2=\@@FLOWheight
+ \dimen4=\@@FLOWdy
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWny\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \exitloop
+ \fi
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \expanded{\switchtobodyfont[\the\scratchcounter pt]}%
+ \forgetall
+ % \offinterlineskip % needed ?
+ \else\ifx\@@FLOWbodyfont\empty\else
+ \expanded{\switchtobodyfont[\@@FLOWbodyfont]}% \expanded ?
+ \fi\fi
+ \global\let\FLOWcells\empty
+ \dimen0=\@@FLOWwidth
+ \edef\FLOWshapewidth{\the\dimen0}%
+ \dimen2=\@@FLOWdx
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridwidth{\the\dimen0}%
+ \dimen0=\@@FLOWheight
+ \edef\FLOWshapeheight{\the\dimen0}%
+ \dimen2=\@@FLOWdy
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridheight{\the\dimen0}%
+ \scratchdimen=\@@FLOSrulethickness
+ \edef\@@FLOSrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOFrulethickness
+ \edef\@@FLOFrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOLrulethickness
+ \edef\@@FLOLrulethickness{\the\scratchdimen}%
+ \ifdim\@@FLOLradius<2.5\scratchdimen
+ \scratchdimen=2.5\scratchdimen
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \ifdim\@@FLOLradius>\@@FLOWdx
+ \scratchdimen=\@@FLOWdx
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \ifdim\@@FLOLradius>\@@FLOWdy
+ \scratchdimen=\@@FLOWdy
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \else
+ \scratchdimen=\@@FLOLradius
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \processaction % magic 2.5
+ [\@@FLOWoffset]
+ [ \v!none=>\scratchdimen=-2.5\scratchdimen,
+ \v!overlay=>\scratchdimen=-2.5\scratchdimen,
+ \v!standard=>\scratchdimen=\scratchdimen,
+ \s!unknown=>\scratchdimen=\@@FLOWoffset,
+ \s!default=>\scratchdimen=-2.5\scratchdimen]%
+ \edef\@@FLOW@@offset{\the\scratchdimen}%
+ \forgetall
+ \offinterlineskip
+ \resetMPdrawing
+ \doglobal\newcounter\FLOWcomment
+ \startMPdrawing
+ if unknown context_char : input mp-char.mp ; fi ;
+ grid_width := \FLOWgridwidth ;
+ grid_height := \FLOWgridheight ;
+ shape_width := \FLOWshapewidth ;
+ shape_height := \FLOWshapeheight ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connection_smooth_size := \@@FLOLradius ;
+ connection_arrow_size := \@@FLOLradius ;
+ connection_dash_size := \@@FLOLradius ;
+ currentpicture := nullpicture ;
+ begin_chart(0,\FLOWwidth,\FLOWheight);
+ reverse_y := true ;
+ chart_offset := \@@FLOW@@offset ;
+ \stopMPdrawing
+ \doifelsenothing\@@FLOWbackgroundcolor
+ {\startMPdrawing
+ chart_background_color := white ;
+ \stopMPdrawing}
+ {\startMPdrawing
+ chart_background_color := \MPcolor{\@@FLOWbackgroundcolor} ;
+ \stopMPdrawing}%
+ \doif\@@FLOWoption\v!test
+ {\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing}%
+ \processaction % private
+ [\@@FLOWdot]
+ [ \v!yes=>\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing,
+ \s!unknown=>\startMPdrawing
+ show_\@@FLOWdot_points := true ;
+ \stopMPdrawing]%
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellB
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellC
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \startMPdrawing
+ clip_chart(\@@FLOWx,\@@FLOWy,\@@FLOWnx,\@@FLOWny) ;
+ end_chart ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \setbox0\hbox
+ {\MPstaticgraphictrue
+ \MPshiftdrawingfalse
+ \getMPdrawing}%
+ \def\MPmessage##1%
+ {\writestatus{MP charts}{##1}}%
+ \def\MPposition##1##2##3%
+ {\setvalue{\@@MPx##1}{##2}\setvalue{\@@MPy##1}{##3}}%
+ \def\MPclippath##1##2##3##4%
+ {\def\clipMPllx{##1bp}\def\clipMPlly{##2bp}%
+ \def\clipMPurx{##3bp}\def\clipMPury{##4bp}}%
+ \def\MPareapath##1##2##3##4%
+ {\def\areaMPllx{##1bp}\def\areaMPlly{##2bp}%
+ \def\areaMPurx{##3bp}\def\areaMPury{##4bp}}%
+ \getMPdata
+ \doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellD
+ \setbox2\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox2\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box2}%
+ \wd2\wd0\ht2\ht0\dp2\dp0
+ \let\startFLOWcell\startFLOWcellE
+ \setbox4\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox4\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box4}%
+ \wd4\wd0\ht4\ht0\dp4\dp0
+ \doifelse\@@FLOWoption\v!test
+ {\setbox6\vbox
+ {\forgetall
+ \vskip\@@FLOW@@offset
+ \hskip\@@FLOW@@offset
+ \basegrid
+ [\c!x=\@@FLOWx,\c!nx=\@@FLOWnx,\c!dx=\withoutpt\FLOWgridwidth,
+ \c!y=\@@FLOWy,\c!ny=\@@FLOWny,\c!dy=\withoutpt\FLOWgridheight,
+ \c!xstep=1,\c!ystep=1,
+ \c!unit=pt,\c!location=\v!middle]}%
+ \wd6\wd0\ht6\ht0\dp6\dp0
+ \setbox8\vbox
+ {\forgetall
+ \offinterlineskip
+ \vskip\@@FLOW@@offset
+ \dostepwiserecurse\@@FLOWy\@@FLOWny\plusone
+ {\vbox to \FLOWgridheight
+ {\vfill
+ \hskip\@@FLOW@@offset
+ \hbox
+ {\dostepwiserecurse\@@FLOWx\@@FLOWnx\plusone
+ {\hbox to \FLOWgridwidth
+ {\hfill
+ \framed
+ [\c!framecolor=red,
+ \c!width=\FLOWshapewidth,
+ \c!height=\FLOWshapeheight]
+ {}%
+ \hfill}}}
+ \vfill}}}%
+ \wd8\wd0\ht8\ht0\dp8\dp0
+ \framed
+ [\c!offset=\v!overlay,\c!framecolor=green]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2\hskip-\wd6\box6\hskip-\wd8\box8}}}
+ {\framed
+ [\c!offset=\v!overlay,
+ \c!frame=\@@FLOWframe,
+ \c!rulethickness=\@@FLOWrulethickness,
+ \c!framecolor=\@@FLOWframecolor,
+ \c!background=\@@FLOWbackground,
+ \c!backgroundcolor=\@@FLOWbackgroundcolor]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2}}}%
+ %\message{[\FLOWcells]}\wait
+ \egroup}
+
+% Pass A
+
+\long\def\startFLOWcellA#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\getFLOWlocationA\FLOWlocation\end
+ \ignorespaces}
+
+\def\getFLOWlocationA#1,#2\end
+ {\ifnum0#1>\FLOWwidth \xdef\FLOWwidth {#1}\fi
+ \ifnum0#2>\FLOWheight\xdef\FLOWheight{#2}\fi}
+
+% Pass B
+%
+% beware: the - after \@FLOC@ is needed since name can be
+% empty and we don't want to redefine \@FLOC@ itself by
+% mistake
+
+\long\def\startFLOWcellB#1\stopFLOWcell
+ {\resetFLOWcell\ignorespaces#1\unskip
+ \setxvalue{\@FLOC@-\FLOWname}{\FLOWlocation}% kost veel cs's
+ \ifx\FLOWshape\empty
+ \global\let\FLOWshape\@@FLOSdefault
+ \fi
+ \doifnot\FLOWshape{none} % {\v!none}
+ {\ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWshapes}
+ {\edef\FLOWshapetag{shape_\FLOWshape}% beter \expanded
+ \@EA\setFLOWname\@EA\FLOWshapetag\@EA{\FLOWshapetag}}
+ {\doifnumberelse\FLOWshape
+ {\let\FLOWshapetag\FLOWshape}
+ {\let\FLOWshapetag\empty}}%
+ \ifx\FLOWshapetag\empty \else
+ \ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWlines}
+ {\chardef\FLOWstate0 }
+ {\ExpandBothAfter\doifcommonelse{\FLOWcell,\FLOWfocus}{\@@FLOWfocus}
+ {\chardef\FLOWstate1 }
+ {\chardef\FLOWstate2 }}%
+ \startMPdrawing
+ begin_sub_chart ;
+ \ifcase\FLOWstate
+ shape_line_color := \MPcolor{\@@FLOLcolor} ;
+ shape_fill_color := \MPcolor{\@@FLOLcolor} ;
+ shape_line_width := \@@FLOLrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOFframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOFbackgroundcolor} ;
+ shape_line_width := \@@FLOFrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOSframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOSbackgroundcolor} ;
+ shape_line_width := \@@FLOSrulethickness ;
+ \fi
+ %\ifx\FLOWoverlay\empty
+ % peepshape := false ;
+ %\else
+ % peepshape := true ;
+ %\fi
+ peepshape := \ifx\FLOWoverlay\empty false \else true \fi ;
+ new_shape(\FLOWlocation,\FLOWshapetag) ;
+ end_sub_chart ;
+ \stopMPdrawing
+ \fi}%
+ \ignorespaces}
+
+% Pass C
+
+\long\def\startFLOWcellC#1\stopFLOWcell%
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % makes sure that vars are set
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\connection\doFLOWconnectionC
+ \ignorespaces#1\unskip}
+
+\def\FLOWorigin{0,0}
+
+\def\doFLOWdisplace[#1,#2,#3]% experiment
+ {dsp_x := #1 ; dsp_y := #2 ;}
+
+\def\doFLOWconnectionC
+ {\dodoubleempty\dodoFLOWconnectionC}
+
+\def\dodoFLOWconnectionC[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \setFLOWname\otherFLOWname{name_#3}%
+ \doifdefinedelse{\@FLOC@-\FLOWname}
+ {\edef\FLOWfrom{\getvalue{\@FLOC@-\FLOWname}}}
+ {\let \FLOWfrom \FLOWorigin}%
+ \ifx\FLOWfrom\FLOWorigin \else
+ \doifdefinedelse{\@FLOC@-\otherFLOWname}
+ {\edef\FLOWto {\getvalue{\@FLOC@-\otherFLOWname}}}
+ {\let \FLOWto \FLOWorigin}%
+ \ifx\FLOWto\FLOWorigin \else
+ \FLOWsetconnect{#1}%
+ \ifx\cFLOWfrom\empty \else
+ \doifelse\@@FLOLcorner\v!round
+ {\startMPdrawing smooth := true ; \stopMPdrawing}
+ {\startMPdrawing smooth := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLdash\v!yes
+ {\startMPdrawing dashline := true ; \stopMPdrawing}
+ {\startMPdrawing dashline := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLarrow\v!yes
+ {\startMPdrawing arrowtip := true ; \stopMPdrawing}
+ {\startMPdrawing arrowtip := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLoffset\v!none
+ {\startMPdrawing touchshape := true ; \stopMPdrawing}
+ {\startMPdrawing touchshape := false ; \stopMPdrawing}%
+%\doifsomething{#2}
+% {\startMPdrawing
+% \doFLOWdisplace[0#2,0,0]%
+% \stopMPdrawing}%
+ \startMPdrawing
+\doFLOWdisplace[0#2,0,0]%
+ connection_line_color := \MPcolor{\@@FLOLcolor} ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connect_\cFLOWfrom_\cFLOWto (\FLOWfrom,\zFLOWfrom) (\FLOWto,\zFLOWto) ;
+\doFLOWdisplace[0,0,0]%
+ \stopMPdrawing
+ \fi
+ \fi
+ \fi
+ \ignorespaces}
+
+% Pass D
+
+\long\def\startFLOWcellD#1\stopFLOWcell
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % presets vars
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\doprocessFLOWcell\doprocessFLOWcellD
+ \expandafter\doprocessFLOWcellD\FLOWlocation\end
+ \let\connection\doFLOWconnectionD
+ \let\comment\doFLOWcommentD
+ \ignorespaces#1\unskip\ignorespaces}
+
+\def\doFLOWconnectionD
+ {\dodoubleempty\dodoFLOWconnectionD}
+
+\def\dodoFLOWconnectionD[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \ignorespaces}
+
+\def\doFLOWcommentD[#1]#2%
+ {\bgroup
+ \let\FLOW \middlebox
+ \let\FLOWb \bottombox
+ \let\FLOWbl\bottomleftbox
+ \let\FLOWbr\bottomrightbox
+ \let\FLOWt \topbox
+ \let\FLOWtl\topleftbox
+ \let\FLOWtr\toprightbox
+ \let\FLOWl \leftbox
+ \let\FLOWlt\lefttopbox
+ \let\FLOWlb\leftbottombox
+ \let\FLOWr \rightbox
+ \let\FLOWrt\righttopbox
+ \let\FLOWrb\rightbottombox
+ \let\FLOWc \middlebox
+%\ifdefined{FLOW#1}%
+ \ifcase0\getvalue{\@@MPx\FLOWcomment}\getvalue{\@@MPy\FLOWcomment}\relax
+ \else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp<\areaMPllx\relax\else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp>\areaMPurx\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp<\areaMPlly\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp>\areaMPury\relax\else
+ \dimen0=\getvalue{\@@MPx\FLOWcomment}\s!bp
+ \advance\dimen0 -\@@FLOW@@offset
+ \advance\dimen0 -\clipMPllx
+ \dimen2=\clipMPury
+ \advance\dimen2 -\@@FLOW@@offset
+ \advance\dimen2 -\getvalue{\@@MPy\FLOWcomment}\s!bp
+ \setbox\scratchbox\hbox{\strut#2}%
+ \boxoffset.5\bodyfontsize
+ \setbox\scratchbox\hbox{\hskip\dimen0\lower\dimen2\getvalue{FLOW#1}{\box\scratchbox}}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \boxoffset\zeropoint
+ \nointerlineskip % really needed
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+%\fi
+ \egroup
+ \ignorespaces}
+
+% pass D
+
+\def\dophaseoneFLOWcellX#1#2%
+ {\!!counta#1\relax
+ \!!countb#2\relax
+ \!!countc\@@FLOWx
+ \!!countd\@@FLOWy
+ \advance\!!countc \@@FLOWnx
+ \advance\!!countd \@@FLOWny
+ \advance\!!countc \minusone
+ \advance\!!countd \minusone
+ \ifnum\!!counta<\@@FLOWx\relax \donefalse
+ \else\ifnum\!!counta>\!!countc \donefalse
+ \else\ifnum\!!countb<\@@FLOWy\relax \donefalse
+ \else\ifnum\!!countb>\!!countd \donefalse
+ \else \donetrue
+ \fi\fi\fi\fi}
+
+\def\dophasetwoFLOWcellX
+ {\advance\!!counta -\@@FLOWx
+ \advance\!!counta \plusone
+ \advance\!!countb -\@@FLOWy
+ \advance\!!countb \plusone
+ \dimen0=\FLOWgridwidth
+ \dimen0=\!!counta\dimen0
+ \advance\dimen0 -\FLOWgridwidth
+ \dimen4=\FLOWgridwidth
+ \advance\dimen4 -\FLOWshapewidth
+ \advance\dimen0 .5\dimen4
+ \dimen2=\FLOWgridheight
+ \dimen2=\!!countb\dimen2
+ \dimen4=\FLOWgridheight
+ \advance\dimen4 -\FLOWshapeheight
+ \advance\dimen2 -.5\dimen4
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}}
+
+\def\positionFLOWzero% assumes \FLOWdx and \FLOWdy are set
+ {\setbox0\hbox{\hskip\FLOWdx\lower\FLOWdy\box0}%
+ \smashbox0\box0
+ \nointerlineskip} % new, needed since we somehow reset that
+
+\def\doFLOWtlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise\scratchdimen
+ \hbox{\raise\dimen4\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWblabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise-\scratchdimen
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWllabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip-\scratchdimen\raise\dimen6
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWrlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip\dimen0\hskip\scratchdimen
+ \hbox{\raise\dimen6\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}
+
+\def\doprocessFLOWcellD#1,#2\end
+ {\dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \doglobal\addtocommalist\FLOWcell\FLOWcells
+ \def\FLOWx{#1}%
+ \def\FLOWy{#2}%
+ \directsetup{flowcell}%
+ \setbox0\hbox
+ {\ifx\FLOWalign\empty\else
+ \setupframed
+ [\c!align=\v!normal,\c!bottom=\vfill,\c!top=\vfill]%
+ \@EA\processallactionsinset\@EA
+ [\FLOWalign]
+ [t=>{\setupframed[\c!bottom=\vfill,\c!top=]},
+ b=>{\setupframed[\c!bottom=,\c!top=\vfill]},
+ l=>{\setupframed[\c!align=\v!right]},
+ r=>{\setupframed[\c!align=\v!left]},
+ m=>{\setupframed[\c!align=\v!middle]},
+ c=>{\setupframed[\c!align=\v!middle]}]%
+ \fi
+ \doifelse\FLOWshape{none} % {\v!none}
+ {\setupframed[\c!offset=\v!overlay]}
+ {\setupframed[\c!offset=\@@FLOSoffset]}%
+ \framed
+ [\c!frame=\v!off,\c!background=flowcell,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {\FLOWtext}}%
+ \showFLOWhelp0
+ \ifx\FLOWdestination\empty\else
+ \setbox0\hbox
+ {\setupinteraction[\c!color=,\c!contrastcolor=]%
+ \gotobox{\box0}[\FLOWdestination]}%
+ \fi
+ \positionFLOWzero
+ \dimen0=\FLOWshapewidth \dimen2=.5\dimen0
+ \dimen4=\FLOWshapeheight\dimen6=.5\dimen4
+ \boxoffset.5\bodyfontsize
+ \doFLOWtlabel \righttopbox0\tFLOWlabel
+ \doFLOWblabel\rightbottombox0\bFLOWlabel
+ \doFLOWllabel \lefttopbox0\lFLOWlabel
+ \doFLOWrlabel \righttopbox0\rFLOWlabel
+ \doFLOWtlabel \topbox0\tcFLOWlabel % for me only
+ \doFLOWblabel \bottombox0\bcFLOWlabel % for me only
+ \doFLOWllabel \leftbox0\lcFLOWlabel % for me only
+ \doFLOWrlabel \rightbox0\rcFLOWlabel % for me only
+ \ifnum#1=\@@FLOWx\relax \doFLOWllabel \leftbox1\lFLOWexit \fi
+ \ifnum#1=\!!countc \doFLOWrlabel \rightbox1\rFLOWexit \fi
+ \ifnum#2=\@@FLOWy\relax \doFLOWtlabel \topbox1\tFLOWexit \fi
+ \ifnum#2=\!!countd \doFLOWblabel \bottombox1\bFLOWexit \fi
+ \boxoffset\zeropoint
+ \fi}
+
+% For Willy Egger:
+%
+% \startsetups flowcell
+% \definelayer
+% [flowcell]
+% [width=\FLOWshapewidth,
+% height=\FLOWshapeheight]
+% \setlayerframed
+% [flowcell]
+% [preset=rightbottom,offset=1ex]
+% [frame=off]
+% {\tx(\FLOWx,\FLOWy)}
+% \stopsetups
+
+% Pass E
+
+\long\def\startFLOWcellE#1\stopFLOWcell
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \let\doprocessFLOWcell\doprocessFLOWcellE
+ \expandafter\doprocessFLOWcell\FLOWlocation\end}
+
+\def\doprocessFLOWcellE#1,#2\end % redundant
+ {\ifx\FLOWoverlay\empty \else
+ \dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}%
+ \setbox0\hbox
+ {\framed
+ [%\c!frame=\v!off,
+ \c!background={\@@FLOWbackground,\FLOWoverlay},
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {}}%
+ \positionFLOWzero
+ \fi
+ \fi}
+
+% Pass F
+
+\def\checkFLOWautofocus
+ {\def\@@FLOWminx{100}\let\@@FLOWminy\@@FLOWminx
+ \def\@@FLOWmaxx {0}\let\@@FLOWmaxy\@@FLOWmaxx
+ \def\@@FLOWabsx {0}\let\@@FLOWabsy\@@FLOWabsx
+ \let\startFLOWcell\startFLOWcellF
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ %\message{AUTOSHAPE 1: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \ifnum\@@FLOWabsx<\@@FLOWmaxx\let\@@FLOWmaxx\@@FLOWabsx\fi
+ \ifnum\@@FLOWabsy<\@@FLOWmaxy\let\@@FLOWmaxy\@@FLOWabsy\fi
+ %\message{AUTOSHAPE 2: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \donetrue
+ \ifnum\@@FLOWminx=100 \donefalse\fi
+ \ifnum\@@FLOWminy=100 \donefalse\fi
+ \ifnum\@@FLOWmaxx=0 \donefalse\fi
+ \ifnum\@@FLOWmaxy=0 \donefalse\fi
+ \doFLOWcheckF\@@FLOWx\@@FLOWminx\@@FLOWmaxx\@@FLOWnx
+ \doFLOWcheckF\@@FLOWy\@@FLOWminy\@@FLOWmaxy\@@FLOWny}
+
+\def\startFLOWcellF#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\doFLOWlocationF\FLOWlocation\end}%
+
+\def\doFLOWlocationF#1,#2\end%
+ {\ifnum#1>\@@FLOWabsx\def\@@FLOWabsx{#1}\fi
+ \ifnum#2>\@@FLOWabsy\def\@@FLOWabsy{#2}\fi
+ \ExpandBothAfter\doifinset{\FLOWcell}{\@@FLOWautofocus}
+ {\dodoFLOWlocationF{#1}<-\@@FLOWminx
+ \dodoFLOWlocationF{#1}>+\@@FLOWmaxx
+ \dodoFLOWlocationF{#2}<-\@@FLOWminy
+ \dodoFLOWlocationF{#2}>+\@@FLOWmaxy}}
+
+\def\dodoFLOWlocationF#1#2#3#4%
+ {\ifnum#1#2#4\relax
+ \!!counta=#1\advance\!!counta #31\relax
+ \edef#4{\ifnum\!!counta<1 1\else\the\!!counta\fi}%
+ \fi}
+
+\def\doFLOWcheckF#1#2#3#4%
+ {\ifdone
+ \let#1=#2%
+ \!!counta=#3%
+ \advance\!!counta \plusone\advance\!!counta -#2\relax
+ \ifnum\!!counta<1 \!!counta=1 \fi
+ \edef#4{\the\!!counta}%
+ \else
+ \let#1\!!plusone
+ \let#4\!!zerocount % no {1}
+ \fi}
+
+% \useFLOWchart[name][parent][setting,setting][additional settings]
+% \useFLOWchart[name][parent][additional settings]
+
+\let\currentFLOWchart\empty
+
+\def\useFLOWchart
+ {\doquadrupleempty\douseFLOWchart}
+
+\def\douseFLOWchart[#1][#2][#3][#4]% name parent sets mainsettings
+ {\iffourthargument
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][#4,##1]}%
+ \else
+ \checkparameters[#3]%
+ \ifparameters
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][][#3,##1]}%
+ \else
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][##1]}%
+ \fi
+ \fi}
+
+\def\setgetFLOWchart[#1][#2][#3]%
+ {\def\docommand##1{}% cell line focus ?
+ \processcommalist[#2]\docommand
+ \getFLOWchart[#1][#3]}
+
+\def\doFLOWchart[#1][#2]%
+ {\hbox\bgroup\vbox\bgroup % vmode suppresses spaces
+\def\currentFLOWchart{#1}%
+ \doifundefinedelse{\@FLOW@--#1}
+ {\getFLOWchart[#1][#2]}
+ {\getvalue{\@FLOW@--#1}[#2]}%
+ \egroup\egroup}
+
+\def\FLOWchart%
+ {\dodoubleempty\doFLOWchart}
+
+%D A hook into the help system.
+
+\def\showFLOWhelp#1%
+ {\doifhelpinfo\FLOWhelp
+ {\setbox#1=\hbox
+ {\setbox\scratchbox=\hbox{\lower\@@FLOWdy\hbox
+ {\helpbutton
+ [\c!width=\wd0,\c!color=,\c!height=\@@FLOWdy,\c!frame=\v!no]%
+ [\FLOWhelp]}}%
+ \smashbox\scratchbox
+ \setbox#1=\vbox
+ {\forgetall\offinterlineskip\box#1\box\scratchbox}%
+ \box#1}}}
+
+%D The next section is dedicated to splitting up charts.
+
+\def\getFLOWsize[#1]%
+ {\bgroup\let\dodogetFLOWchart\dogetFLOWsize\FLOWchart[#1]\egroup}
+
+\def\dogetFLOWsize[#1][#2]%
+ {\setbox\scratchbox=\vbox
+ {\globallet\FLOWmaxwidth \!!zerocount
+ \globallet\FLOWmaxheight\!!zerocount
+ \def\getFLOWlocation##1,##2\end
+ {\ifnum0##1>\FLOWmaxwidth \xdef\FLOWmaxwidth {##1}\fi
+ \ifnum0##2>\FLOWmaxheight\xdef\FLOWmaxheight{##2}\fi}%
+ \resetFLOWcell
+ \long\def\startFLOWcell##1\stopFLOWcell
+ {{##1\expandafter\getFLOWlocation\FLOWlocation\end}}%
+ \def\dohandleflowchart[##1][##2]%
+ {\resetFLOWlocation
+ \processFLOWbuffer{##1}}%
+ \getvalue{\@FLOW@-#1}}}
+
+\def\setupFLOWsplit%
+ {\dodoubleargument\getparameters[\@@FLOT]}
+
+\setupFLOWsplit%
+ [\c!nx=3,\c!ny=3,
+ \c!dx=1,\c!dy=1,
+ \c!command=,
+ \c!marking=\v!on,
+ \c!before=,\c!after=]
+
+\def\FLOWsplitx {1}
+\def\FLOWsplity {1}
+\def\FLOWsplitnx{1}
+\def\FLOWsplitny{1}
+
+\def\FLOWcharts%
+ {\dodoubleempty\doFLOWcharts}
+
+%D While splitting, the following variables are available:
+%D
+%D \starttyping
+%D \FLOWsplitnx \FLOWsplitny \FLOWsplitx \FLOWsplity
+%D \stoptyping
+
+\def\doFLOWcharts[#1][#2]%
+ {\bgroup
+ \getFLOWsize[#1]%
+ \dodoFLOWcharts\relax
+ \global\let\FLOWsplitnx\FLOWsplitx
+ \global\let\FLOWsplitny\FLOWsplity
+ \dodoFLOWcharts{\dododoFLOWcharts[#1][#2]}%
+ \egroup}
+
+\def\dodoFLOWcharts#1%
+ {\def\@@FLOTx{1}%
+ \global\let\FLOWsplitx\@@FLOTx
+ \doloop
+ {\def\@@FLOTy{1}%
+ \global\let\FLOWsplity\@@FLOTy
+ \doloop
+ {\bgroup
+ \scratchcounter\FLOWmaxwidth
+ \advance\scratchcounter -\@@FLOTx
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTnx\edef\@@FLOTnx{\the\scratchcounter}\fi
+ \scratchcounter\FLOWmaxheight
+ \advance\scratchcounter -\@@FLOTy
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTny\edef\@@FLOTny{\the\scratchcounter}\fi
+ #1% does something with the float, or not
+ \egroup
+ \increment(\@@FLOTy,\@@FLOTny)%
+ \ifnum\@@FLOTy>\FLOWmaxheight
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplity
+ \decrement(\@@FLOTy,\@@FLOTdy)%
+ \fi}%
+ \increment(\@@FLOTx,\@@FLOTnx)%
+ \ifnum\@@FLOTx>\FLOWmaxwidth
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplitx
+ \decrement(\@@FLOTx,\@@FLOTdx)%
+ \fi}}
+
+\def\dododoFLOWcharts[#1][#2]%
+ {\bgroup
+ \@@FLOTbefore
+ \doifnot\@@FLOTmarking\v!on{\let\cuthbox\hbox}%
+ \cuthbox
+ {\@@FLOTcommand
+ {\FLOWchart[#1][#2,
+ \c!x=\@@FLOTx,\c!nx=\@@FLOTnx,
+ \c!y=\@@FLOTy,\c!ny=\@@FLOTny]}}%
+ \@@FLOTafter
+ \egroup}
+
+%D An example of splitting is given below:
+%D
+%D \starttyping
+%D \setupFLOWsplit
+%D [nx=5,ny=10,
+%D dx=0,dy=0,
+%D before=,
+%D after=\page]
+%D
+%D \FLOWcharts[mybigflow]
+%D \stoptyping
+%D
+%D Or, one can say:
+%D
+%D \starttyping
+%D \splitfloat
+%D {\placefigure{What a big flowchart this is!}}
+%D {\FLOWcharts[mybigflow]}
+%D \stoptyping
+
+%D \macros
+%D {typeFLOWchart}
+%D
+%D For documentation purposes the following macro is
+%D provided. Watch the use of the first and last line hooks,
+%D which is needed because the start and stop commands are
+%D not part of the buffer.
+
+\def\typeFLOWchart[#1]%
+ {\bgroup
+ \def\dohandleflowchart[##1][##2]{\typeFLOWbuffer{##1}}%
+ \defconvertedargument\firstverbatimfileline{\startFLOWchart[#1]}%
+ \defconvertedargument\lastverbatimfileline {\stopFLOWchart}%
+ \getvalue{\@FLOW@-#1}
+ \egroup}
+
+%D New:
+%D
+%D \starttyping
+%D \setupFLOWcharts[command=\Whow]
+%D
+%D \startFLOWset[convert-en] % [tag][convert-en]
+%D \subFLOWchart[a][x=1,y=1,nx=3,ny=3]
+%D \subFLOWchart[b][x=1,y=2,nx=3,ny=3]
+%D \subFLOWchart[c][x=2,y=1,nx=3,ny=3]
+%D \stopFLOWset
+%D
+%D \def\Whow#1%
+%D {\ifnum\currentFLOWset=1 \framed{Some Chart}\fi}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D
+%D \def\Whow#1%
+%D {\setuphead[state=high]
+%D \startstandardmakeup
+%D \centerbox{#1}
+%D \stopstandardmakeup}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D \stoptyping
+
+\def\startFLOWset
+ {\dodoubleempty\dostartFLOWset}
+
+\def\dostartFLOWset[#1][#2]#3\stopFLOWset % tag name data
+ {\ifsecondargument
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#2}{#3}}%
+ \else
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#1}{#3}}%
+ \fi}
+
+\long\def\dohandleFLOWset#1#2#3% tag name data
+ {\bgroup
+ \def\subFLOWchart
+ {\dodoubleempty\dosubFLOWchart}%
+ \def\dosubFLOWchart[##1][##2]% subtag settings
+ {\ifsecondargument
+ \dodohandleFLOWset{#1}{##1}{#2}{##2}%
+ \else
+ \subFLOWchart[][##1]%
+ \fi}%
+ #3%
+ \egroup}
+
+\def\dodohandleFLOWset#1#2#3#4% tag subtag name settings
+ {\increment\currentFLOWset
+ \bgroup
+ \@@FLOXcommand
+ {\ifnum\currentFLOWset=1 \pagereference[#1]\fi
+ \doifsomething{#2}
+ {\setupreferencing[\c!prefix=]%
+ \pagereference[#1:#2]% -:#1:#2
+ \setupreferencing[\c!prefix=#1:#2]}%
+ \FLOWchart[#3][#4]}%
+ \egroup}
+
+\def\FLOWset[#1]%
+ {\newcounter\currentFLOWset
+ \doifdefinedelse{\@FLOX@#1}
+ {\getvalue{\@FLOX@#1}}
+ {\dodohandleFLOWset{#1}{}{#1}{}}}
+
+\newcounter\currentFLOWset
+
+\setupFLOWsets
+ [\c!command=]
+
+%D This will be an option:
+
+% \def\startFLOWchart%
+% {\dodoubleempty\dostartFLOWchart}
+%
+% \long\def\dostartFLOWchart[#1][#2]#3\stopFLOWchart
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \long\def\dodefineFLOWchart[#1][#2]#3%
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \def\processFLOWbuffer#1{\getvalue{\FLOWbufferprefix#1}}
+% \def\typeFLOWbuffer #1{[Sorry, no verbatim chart #1 available.]}
+
+\loadmarkfile{m-chart}
+
+\protect \endinput
diff --git a/tex/context/base/m-chemic.mkii b/tex/context/base/m-chemic.mkii
new file mode 100644
index 000000000..e6980e1ff
--- /dev/null
+++ b/tex/context/base/m-chemic.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=ppchtex (m-chemic),
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten},
+%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\psaxes\undefined \ifx\beginpicture\undefined
+ \usemodule[pictex]
+\fi \fi
+
+\input ppchtex.mkii \relax
+
+\endinput
diff --git a/tex/context/base/m-chemic.mkiv b/tex/context/base/m-chemic.mkiv
new file mode 100644
index 000000000..bd4cb093e
--- /dev/null
+++ b/tex/context/base/m-chemic.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=ppchtex (m-chemic),
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten},
+%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{ppchtex}{not loaded as support for chemistry in now built in}
+
+% \usemodule[pictex] % we will get rid of this
+% \input ppchtex.mkiv \relax
+
+\endinput
diff --git a/tex/context/base/m-chemic.tex b/tex/context/base/m-chemic.tex
new file mode 100644
index 000000000..7bacf4a90
--- /dev/null
+++ b/tex/context/base/m-chemic.tex
@@ -0,0 +1,17 @@
+%D \module
+%D [ file=ppchtex (m-chemic),
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten},
+%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{m-chemic}
+
+\endinput
diff --git a/tex/context/base/m-cweb.tex b/tex/context/base/m-cweb.tex
new file mode 100644
index 000000000..c416c9b36
--- /dev/null
+++ b/tex/context/base/m-cweb.tex
@@ -0,0 +1,1371 @@
+%D \module
+%D [ file=m-cweb,
+%D version=1997.01.15,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\CWEB\ Pretty Printing Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D First some auxiliary stuff, to be moved to system module.
+
+\def\dodofindfirstcharacter#1%
+ {\ifx#1\relax
+ \let\next=\egroup
+ \else
+ \handlecase
+ {\expandafter\ifnum\expandafter\catcode\expandafter`#1=11
+ \def\next##1\relax{\egroup\def\firstcharacter{#1}}%
+ \fi}%
+ \fi
+ \next}
+
+\def\dofindfirstcharacter#1#2%
+ {\def\firstcharacter{}%
+ \bgroup
+ \defconvertedargument\ascii{#2}%
+ \let\next\dodofindfirstcharacter
+ \let\handlecase#1%
+ \expandafter\next\ascii\relax}
+
+\def\normalcase#1%
+ {#1}
+
+\def\findfirstcharacter%
+ {\dofindfirstcharacter\lowercase}
+
+\def\FindFirstCharacter%
+ {\dofindfirstcharacter\normalcase}
+
+\def\FINDFIRSTCHARACTER%
+ {\dofindfirstcharacter\uppercase}
+
+% nog doen:
+%
+% \deactivateCWEB in output routine
+% status info
+% gelinkte entries
+% parskip en parindent
+
+%D \gdef\CWEBquote#1.{{\em Quote :}\ #1.} % checks the .
+
+%D This module (re)implements the \CWEB\ macros as defined in
+%D the file \type{cwebmac.tex}.
+%D
+%D \CWEB\ uses short, often one character long, names for
+%D macros. This is no real problem because no one is supposed
+%D to read and understand the files generated by \CWEB. The
+%D standard macros are meant for \PLAIN\ \TEX\ users. In
+%D \CONTEXT\ and other macro packages however, there is a
+%D potential conflict with format specific or user defined
+%D commands. Furthermore, the \CWEB\ macros implement their own
+%D output routines. When integrating \CWEB\ documents in
+%D another environment, the \CWEB\ specific macros have to be
+%D made local. The first part of this module is dedicated to
+%D this feature.
+%D
+%D Instead of using \type{\def} and \type{\let} for defining
+%D macros, we use:
+%D
+%D \starttyping
+%D \defCEBmacro arguments {meaning}
+%D \letCEBmacro arguments {meaning}
+%D \stoptyping
+%D
+%D \CWEB files contain implicit calls to macros that generate
+%D the table of contents, the lists of sections and the index.
+%D Because we want to be much more flexible, we implemented our
+%D own alternatives, and therefore have to bypass the original
+%D ones. The next macro is used for defining these obsolete
+%D \CWEB\ macros. The dummies take care of arguments.
+%D
+%D \starttyping
+%D \defCEBdummy arguments {meaning}
+%D \stoptyping
+%D
+%D The list of \CWEB\ specific macro names is saved in a
+%D \TOKENLIST. This serves two purposes. First it enables us to
+%D activate the \CWEB\ macros, which are saved under a
+%D different name, second it can be used to temporary restore
+%D the meanings, for instance when the output routine builds
+%D the page.
+
+\newtoks\CWEBmacros
+
+%D Activating and deactivating is done by means of:
+%D
+%D \starttyping
+%D \activateCWEB
+%D \deactivateCWEB
+%D \stoptyping
+%D
+%D Which are implemented as:
+
+\def\activateCWEB%
+ {\let\doCWEB=\activateCWEBmacro
+ \the\CWEBmacros}
+
+\def\deactivateCWEB%
+ {\let\doCWEB=\deactivateCWEBmacro
+ \the\CWEBmacros}
+
+%D The three definition macros append the name of the macro to
+%D the list. The first two macros save the meaning, the last one
+%D assigns \type{{}} to the macro and gobbles original meaning.
+
+\long\def\defCWEBmacro#1%
+ {\appendtoks\doCWEB#1\to\CWEBmacros
+ \setvalue{newCWEB\string#1}}
+
+\long\def\letCWEBmacro#1%
+ {\appendtoks\doCWEB#1\to\CWEBmacros
+ \letvalue{newCWEB\string#1}}
+
+\long\def\defCWEBdummy#1#2#%
+ {\appendtoks\doCWEB#1\to\CWEBmacros
+ \setvalue{newCWEB\string#1}#2{}%
+ \gobbleoneargument}
+
+%D The macro \type{\defCWEBdummy} of course takes care of the
+%D argument. This leaves the two (de|)|activating macros:
+
+\def\CWEBmacro#1%
+ {\getvalue{newCWEB\string#1}}
+
+\def\activateCWEBmacro#1%
+ {\letvalue{oldCWEB\string#1}=#1%
+ \def#1{\CWEBmacro#1}}
+
+\def\deactivateCWEBmacro#1%
+ {\expandafter\let\expandafter#1\expandafter=\csname oldCWEB\string#1\endcsname}
+
+%D I did consider loading the \CWEB\ macros using temporary
+%D substitutes of \type{\def}, \type{\font}, \type{\newbox} etc.
+%D The main problem is that the file contains more than
+%D definitions and taking all kind of assignments into account
+%D too would not make things easier. So I decided to stick to
+%D the method as just described.
+
+%D Now we're ready for the real job. What follows is a partial
+%D adaption of the file \type{cwebmac.tex}, version 3.1, dated
+%D September 1994 and written by Levy and Knuth. When possible
+%D we kept the original meaning, but we've granted ourselves
+%D the freedom to reformat the macro's for readibility.
+%D
+%D We'll only present the macros we actually use. The source
+%D however contains the original implementation.
+
+% standard macros for CWEB listings (in addition to plain.tex)
+% Version 3.1 --- September 1994.
+%
+% \ifx\documentstyle\undefined\else\endinput\fi % LaTeX will use other macros
+%
+% \xdef\fmtversion{\fmtversion+CWEB3.1}
+
+%D \macros{.}{}
+%D
+%D \CWEBquote preserve a way to get the dot accent (all
+%D other accents will still work as usual).
+
+\letCWEBmacro\: = \.
+
+% \parskip = 0pt % no stretch between paragraphs
+% \parindent = 1em % for paragraphs and for the first line of C text
+
+% \font\ninerm = cmr9
+% \let\mc = \ninerm % medium caps
+% \font\eightrm = cmr8
+% \let\sc = \eightrm % small caps (NOT a caps-and-small-caps font)
+% \let\mainfont = \tenrm
+% \let\cmntfont = \tenrm
+% \font\tenss = cmss10
+% \let\cmntfont = \tenss % alternative comment font
+% \font\titlefont = cmr7 scaled \magstep4 % title on the contents page
+% \font\ttitlefont = cmtt10 scaled \magstep2 % typewriter type in title
+% \font\tentex = cmtex10 % TeX extended character set (used in strings)
+% \fontextraspace\tentex = 0pt % no double space after sentences
+
+%D \macros{mc,sc,cmntfont,eightrm}{}
+%D
+%D The naming of the fonts in in line with those in \PLAIN\
+%D \TEX. Although \CONTEXT\ implements its own scheme, there is
+%D still support for the \PLAIN\ ones. We keep the original
+%D names, but change their meaning. That way the macros obey
+%D switching to other sizes or styles.
+
+\defCWEBmacro\mc {\tx}
+\defCWEBmacro\sc {\txx}
+\defCWEBmacro\cmntfont {\ss}
+\defCWEBmacro\eightrm {\tx}
+
+%D \macros{tentex,sevenrm,sevensy,teni}{}
+%D
+%D The next one uses a temporary solution. The \type{cmtex10}
+%D font is not part of the default mechanism. We make use of
+%D the \CONTEXT\ variables \type{\textface}, \type{\scriptface}
+%D and \type{\scriptscriptface}, which hold the current
+%D sizes.
+
+\defCWEBmacro\tentex%
+ {\font\next=cmtex10 at \textface
+ \fontextraspace\next\zeropoint
+ \next}
+
+\defCWEBmacro\sevenrm {\getvalue{\scriptface rmtf}}
+\defCWEBmacro\sevensy {\getvalue{\scriptface mmsy}}
+\defCWEBmacro\teni {\getvalue{\textface mmmi}}
+
+%D \macros{CWEBpt}{}
+%D
+%D The original macros are based on a 10~point bodyfont size. We
+%D therefore have to specify dimension in points a bit
+%D different. Specifications like .6pt are changed to
+%D \type{.06} times \type{\bodyfontsize}.
+
+\defCWEBmacro\CWEBpt {\bodyfontsize} % still dutch
+
+%D \macros{CEE,UNIX,TEX,CPLUSPLUS}{}
+%D
+%D Next come some logo's. It does not make much sense to use
+%D the \CONTEXT\ logo mechanism here, so we simply say:
+
+\defCWEBmacro \CEE/{{\mc C\spacefactor1000}}
+\defCWEBmacro \UNIX/{{\mc U\kern-.05emNIX\spacefactor1000}}
+\defCWEBmacro \TEX/{\TeX}
+\defCWEBmacro\CPLUSPLUS/{{\mc C\PP\spacefactor1000}}
+\defCWEBmacro \Cee{\CEE/} % for backward compatibility
+
+%D \macros{\ }{}
+%D
+%D Now we come to the real work: the short commands that make
+%D up the typography.
+%D
+%D \CWEBquote italic type for identifiers.
+
+\defCWEBmacro\\#1%
+ {\leavevmode\hbox{\it#1\/\kern.05em}}
+
+%D \macros{\string|}{}
+%D
+%D \CWEBquote one letter identifiers look better this way.
+
+\defCWEBmacro\|#1%
+ {\leavevmode\hbox{$#1$}}
+
+%D \macros{\string\&}{}
+%D
+%D \CWEBquote boldface type for reserved words.
+
+\defCWEBmacro\&#1%
+ {\leavevmode
+ \hbox
+ {\def\_%
+ {\kern.04em
+ \vbox{\hrule width.3em height .06\CWEBpt}% .6pt}%
+ \kern.08em}%
+ \bf#1\/\kern.05em}}
+
+%D \macros{.}{}
+%D
+%D Here we use the previously saved period. This macro
+%D takes care of special characters in strings.
+
+\defCWEBmacro\.#1%
+ {\leavevmode
+ \hbox
+ {\tentex % typewriter type for strings
+ \let\\=\BS % backslash in a string
+ \let\{=\LB % left brace in a string
+ \let\}=\RB % right brace in a string
+ \let\~=\TL % tilde in a string
+ \let\ =\SP % space in a string
+ \let\_=\UL % underline in a string
+ \let\&=\AM % ampersand in a string
+ \let\^=\CF % circumflex in a string
+ #1\kern.05em}}
+
+%D \macros{)}{}
+%D
+%D Some discretionary hack.
+
+\defCWEBmacro\)%
+ {\discretionary{\hbox{\tentex\BS}}{}{}}
+
+%D \macros{AT}{}
+%D
+%D \CWEBquote at sign for control text (not needed in versions
+%D $>=$ 2.9).
+
+\defCWEBmacro\AT{@}
+
+%D \macros{ATL,postATL,NOATL}{}
+%D
+%D A two step macro that handles whatever.
+
+\defCWEBmacro\ATL%
+ {\par
+ \noindent
+ \bgroup
+ \catcode`\_=12
+ \postATL}
+
+\defCWEBmacro\postATL#1 #2 %
+ {\bf letter \\{\uppercase{\char"#1}} tangles as \tentex "#2"%
+ \egroup
+ \par}
+
+\defCWEBmacro\noATL#1 #2 %
+ {}
+
+%D \macros{noatl}{}
+%D
+%D \CWEBquote suppress output from \type{@l}.
+
+\defCWEBmacro\noatl%
+ {\let\ATL=\noATL}
+
+% \defCWEBmacro\ATH%
+% {\X\kern-.5em:Preprocessor definitions\X}
+
+%D \macros{PB}
+%D
+%D \CWEBquote hook for program brackets {\tttf\string|...\string|}
+%D in TeX part or section name.
+
+\defCWEBmacro\PB%
+ {\relax}
+
+% \chardef\AM = `\& % ampersand character in a string
+% \chardef\BS = `\\ % backslash in a string
+% \chardef\LB = `\{ % left brace in a string
+% \chardef\RB = `\} % right brace in a string
+% \chardef\TL = `\~ % tilde in a string
+% \chardef\UL = `\_ % underline character in a string
+% \chardef\CF = `\^ % circumflex character in a string
+
+\defCWEBmacro\AM {\char`\&} % ampersand character in a string
+\defCWEBmacro\BS {\char`\\} % backslash in a string
+\defCWEBmacro\LB {\char`\{} % left brace in a string
+\defCWEBmacro\RB {\char`\}} % right brace in a string
+\defCWEBmacro\TL {\char`\~} % tilde in a string
+\defCWEBmacro\UL {\char`\_} % underline character in a string
+\defCWEBmacro\CF {\char`\^} % circumflex character in a string
+
+\defCWEBmacro\SP {{\tt\char`\ }} % (visible) space in a string
+
+% \newbox\PPbox \setbox\PPbox=\hbox
+% {\kern.5pt\raise1pt\hbox{\sevenrm+\kern-1pt+}\kern.5pt}
+% \newbox\MMbox \setbox\MMbox=\hbox
+% {\kern.5pt\raise1pt\hbox{\sevensy\char0\kern-1pt\char0}\kern.5pt}
+% \newbox\MGbox \setbox\MGbox=\hbox % symbol for ->
+% {\kern-2pt\lower3pt\hbox{\teni\char'176}\kern1pt}
+% \newbox\MODbox \setbox\MODbox=\hbox
+% {\eightrm\%}
+%
+% \def\PP {\copy\PPbox}
+% \def\MM {\copy\MMbox}
+% \def\MG {\copy\MGbox}
+% \def\MOD {\mathbin{\copy\MODbox}}
+
+\defCWEBmacro\PP% symbol for ++
+ {\kern.05\CWEBpt
+ \raise.1\CWEBpt\hbox{\sevenrm+\kern-.1\CWEBpt+}%
+ \kern.05\CWEBpt}
+
+\defCWEBmacro\MM%
+ {\kern.05\CWEBpt
+ \raise.1\CWEBpt\hbox{\sevensy\char0\kern-.1\CWEBpt\char0}%
+ \kern.05\CWEBpt}
+
+\defCWEBmacro\MG%
+ {\kern-.2\CWEBpt
+ \lower.3\CWEBpt\hbox{\teni\char'176}%
+ \kern .1\CWEBpt}
+
+\defCWEBmacro\MRL#1%
+ {\mathrel{\let\K==#1}}
+
+% \def\MRL#1%
+% {\KK#1}
+% \def\KK#1#2%
+% {\buildrel\;#1\over{#2}}
+
+\letCWEBmacro\GG = \gg
+\letCWEBmacro\LL = \ll
+\letCWEBmacro\NULL = \Lambda
+
+% \mathchardef\AND = "2026 % bitwise and; also \& (unary operator)
+
+\defCWEBmacro\AND% redefines itself (funny)
+ {\mathchardef\AND="2026 \AND} % bitwise and; also \& (unary operator)
+
+\letCWEBmacro\OR = \mid % bitwise or
+\letCWEBmacro\XOR = \oplus % bitwise exclusive or
+\defCWEBmacro\CM {{\sim}} % bitwise complement
+\defCWEBmacro\MOD {\mathbin{\eightrm\%}}
+\defCWEBmacro\DC {\kern.1em{::}\kern.1em} % symbol for ::
+\defCWEBmacro\PA {\mathbin{.*}} % symbol for .*
+\defCWEBmacro\MGA {\mathbin{\MG*}} % symbol for ->*
+\defCWEBmacro\this {\&{this}}
+
+% \newbox \bak % backspace one em
+% \newbox \bakk % backspace two ems
+%
+% \setbox\bak =\hbox to -1em{}
+% \setbox\bakk=\hbox to -2em{}
+
+\newcount\CWEBind % current indentation in ems
+
+\defCWEBmacro\1% indent one more notch
+ {\global\advance\CWEBind by 1
+ \hangindent\CWEBind em}
+
+\defCWEBmacro\2% indent one less notch
+ {\global\advance\CWEBind by -1 }
+
+\defCWEBmacro\3#1% optional break within a statement
+ {\hfil
+ \penalty#10
+ \hfilneg}
+
+\defCWEBmacro\4% backspace one notch
+ {\hbox to -1em{}}
+
+\defCWEBmacro\5% optional break
+ {\hfil
+ \penalty-1
+ \hfilneg
+ \kern2.5em
+ \hbox to -2em{}%
+ \ignorespaces}
+
+\defCWEBmacro\6% forced break
+ {\ifmmode
+ \else
+ \par
+ \hangindent\CWEBind em
+ \noindent
+ \kern\CWEBind em
+ \hbox to -2em{}%
+ \ignorespaces
+ \fi}
+
+\defCWEBmacro\7% forced break and a little extra space
+ {\Y
+ \6}
+
+\defCWEBmacro\8% no indentation
+ {\hskip-\CWEBind em
+ \hskip 2em}
+
+\defCWEBmacro\9#1%
+ {}
+
+\newcount\gdepth % depth of current major group, plus one
+\newcount\secpagedepth
+\secpagedepth=3 % page breaks will occur for depths -1, 0, and 1
+
+% \newtoks\gtitle % title of current major group
+% \newskip\intersecskip
+% \intersecskip=12pt minus 3pt % space between sections
+
+% \let\yskip=\smallskip
+
+\defCWEBmacro\?%
+ {\mathrel?}
+
+% \def\note#1#2.%
+% {\Y\noindent
+% {\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}}
+
+\defCWEBmacro\lapstar%
+ {\rlap{*}}
+
+% \def\stsec%
+% {\rightskip=0pt % get out of C mode (cf. \B)
+% \sfcode`;=1500
+% \pretolerance 200
+% \hyphenpenalty 50
+% \exhyphenpenalty 50
+% \noindent{\let\*=\lapstar\bf\secstar.\quad}}
+%
+% \let\startsection=\stsec
+
+\defCWEBmacro\defin#1%
+ {\global\advance\CWEBind by 2 \1\&{#1 } } % begin `define' or `format'
+
+% \def\A% xref for doubly defined section name
+% {\note{See also section}}
+%
+% \def\As% xref for multiply defined section name
+% {\note{See also sections}}
+
+\defCWEBmacro\B%
+ {\rightskip=0pt plus 100pt minus 10pt % go into C mode
+ \sfcode`;=3000
+ \pretolerance 10000
+ \hyphenpenalty 1000 % so strings can be broken (discretionary \ is inserted)
+ \exhyphenpenalty 10000
+ \global\CWEBind=2 \1\ \unskip}
+
+\defCWEBmacro\C#1%
+ {\5\5\quad$/\ast\,${\cmntfont #1}$\,\ast/$}
+
+% \let\SHC\C % "// short comments" treated like "/* ordinary comments */"
+
+\defCWEBmacro\SHC#1%
+ {\5\5\quad$//\,${\cmntfont#1}}
+
+% \def\C#1{\5\5\quad$\triangleright\,${\cmntfont#1}$\,\triangleleft$}
+% \def\SHC#1{\5\5\quad$\diamond\,${\cmntfont#1}}
+
+\defCWEBmacro\D% macro definition
+ {\defin{\#define}}
+
+\letCWEBmacro\E=\equiv % equivalence sign
+
+% \def\ET% conjunction between two section numbers
+% { and~}
+%
+% \def\ETs% conjunction between the last two of several section numbers
+% {, and~}
+
+\defCWEBmacro\F% format definition
+ {\defin{format}}
+
+\letCWEBmacro\G = \ge % greater than or equal sign
+
+% \H is long Hungarian umlaut accent
+
+\letCWEBmacro\I = \ne % unequal sign
+
+\defCWEBmacro\J% TANGLE's join operation
+ {\.{@\&}}
+
+% \let\K== % assignment operator
+
+\letCWEBmacro\K = \leftarrow % "honest" alternative to standard assignment operator
+
+% \L is Polish letter suppressed-L
+
+% \outer\def\M#1%
+% {\MN{#1}%
+% \ifon
+% \vfil
+% \penalty-100
+% \vfilneg % beginning of section
+% \vskip\intersecskip
+% \startsection
+% \ignorespaces}
+%
+% \outer\def\N#1#2#3.%
+% {\gdepth=#1%
+% \gtitle={#3}%
+% \MN{#2}% beginning of starred section
+% \ifon
+% \ifnum#1<\secpagedepth
+% \vfil
+% \eject % force page break if depth is small
+% \else
+% \vfil
+% \penalty-100
+% \vfilneg
+% \vskip\intersecskip
+% \fi
+% \fi
+% \message{*\secno}% progress report
+% \edef\next%
+% {\write\cont % write to contents file
+% {\ZZ{#3}{#1}{\secno}{\noexpand\the\pageno}}}%
+% \next % \ZZ{title}{depth}{sec}{page}
+% \ifon
+% \startsection
+% {\bf#3.\quad}%
+% \ignorespaces}
+%
+% \def\MN#1%
+% {\par % common code for \M, \N
+% {\xdef\secstar{#1}%
+% \let\*=\empty
+% \xdef\secno{#1}}% remove \* from section name
+% \ifx\secno\secstar
+% \onmaybe
+% \else
+% \ontrue
+% \fi
+% \mark{{{\tensy x}\secno}{\the\gdepth}{\the\gtitle}}}
+%
+% each \mark is {section reference or null}{depth plus 1}{group title}
+
+% \O is Scandinavian letter O-with-slash
+% \P is paragraph sign
+
+\defCWEBmacro\Q {\note{This code is cited in section}} % xref for mention of a section
+\defCWEBmacro\Qs {\note{This code is cited in sections}} % xref for mentions of a section
+
+% \S is section sign
+
+\defCWEBmacro\T#1%
+ {\leavevmode % octal, hex or decimal constant
+ \hbox
+ {$\def\?{\kern.2em}%
+ \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant
+ \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick)
+ \let\~=\oct
+ \let\^=\hex
+ {#1}$}}
+
+\defCWEBmacro\U {\note{This code is used in section}} % xref for use of a section
+\defCWEBmacro\Us {\note{This code is used in sections}} % xref for uses of a section
+
+\letCWEBmacro\R = \lnot % logical not
+\letCWEBmacro\V = \lor % logical or
+\letCWEBmacro\W = \land % logical and
+
+% defined later on
+%
+% \def\X#1:#2\X%
+% {\ifmmode
+% \gdef\XX{\null$\null}%
+% \else
+% \gdef\XX{}%
+% \fi % section name
+% \XX$\langle\,${#2\eightrm\kern.5em#1}$\,\rangle$\XX}
+
+\unprotect
+
+\def\theCWEByskip {\blank[\v!small]}
+\def\theCWEBvskip {\blank[\v!big]}
+
+\protect
+
+\defCWEBmacro\Y%
+ {\par
+ \yskip}
+
+\defCWEBmacro\yskip%
+ {\theCWEByskip}
+
+\letCWEBmacro\Z = \le
+% \letCWEBmacro\ZZ = \let % now you can \write the control sequence \ZZ
+\letCWEBmacro\* = *
+
+\defCWEBmacro\oct%
+ {\hbox{$^\circ$\kern-.1em\it\aftergroup\?\aftergroup}}
+
+\defCWEBmacro\hex%
+ {\hbox{$^{\scriptscriptstyle\#}$\tt\aftergroup}}
+
+\defCWEBmacro\vb#1%
+ {\leavevmode
+ \hbox
+ {\kern.2\CWEBpt
+ \vrule
+ \vtop
+ {\vbox
+ {\hrule
+ \hbox{\strut\kern.2\CWEBpt\.{#1}\kern.2\CWEBpt}}
+ \hrule}%
+ \vrule
+ \kern.2\CWEBpt}} % verbatim string
+
+\def\onmaybe%
+ {\let\ifon=\maybe}
+
+\let\maybe=\iftrue
+
+\newif\ifon
+
+% \newif\iftitle
+% \newif\ifpagesaved
+%
+% \def\lheader%
+% {\mainfont
+% \the\pageno
+% \eightrm
+% \qquad
+% \grouptitle
+% \hfill
+% \title
+% \qquad
+% \mainfont
+% \topsecno} % top line on left-hand pages
+%
+% \def\rheader%
+% {\mainfont
+% \topsecno
+% \eightrm
+% \qquad
+% \title
+% \hfill
+% \grouptitle
+% \qquad
+% \mainfont
+% \the\pageno} % top line on right-hand pages
+%
+% \def\grouptitle
+% {\let\i=I
+% \let\j=J
+% \uppercase\expandafter{\expandafter\takethree\topmark}}
+%
+% \def\topsecno%
+% {\expandafter\takeone\topmark}
+%
+% \def\takeone #1#2#3{#1}
+% \def\taketwo #1#2#3{#2}
+% \def\takethree #1#2#3{#3}
+%
+% \def\nullsec%
+% {\eightrm
+% \kern-2em} % the \kern-2em cancels \qquad in headers
+%
+% \let\page=\pagebody % \def\page {\box255 }
+% \raggedbottom % \normalbottom % faster, but loses plain TeX footnotes
+%
+% \def\normaloutput#1#2#3%
+% {\shipout\vbox
+% {\ifodd
+% \pageno
+% \hoffset=\pageshift
+% \fi
+% \vbox to \fullpageheight
+% {\iftitle
+% \global\titlefalse
+% \else
+% \hbox to \pagewidth
+% {\vbox to 10pt{}%
+% \ifodd\pageno #3\else#2\fi}
+% \fi
+% \vfill#1}} % parameter #1 is the page itself
+% \global\advance\pageno by 1}
+%
+% \gtitle={\.{CWEB} output} % this running head is reset by starred sections
+%
+% \mark{\noexpand\nullsec0{\the\gtitle}}
+%
+% \def\title%
+% {\expandafter\uppercase\expandafter{\jobname}}
+%
+% \def\topofcontents%
+% {\centerline{\titlefont\title}
+% \vskip.7in
+% \vfill} % this material will start the table of contents page
+
+\def\botofcontents%
+ {\vfill
+ \centerline{\covernote}} % this material will end the table of contents page
+
+\def\covernote%
+ {}
+
+% some leftover
+
+\defCWEBmacro\contentspagenumber{0} % default page number for table of contents
+
+% \newdimen\pagewidth \pagewidth = 158mm % the width of each page
+% \newdimen\pageheight \pageheight = 223mm % the height of each page
+% \newdimen\fullpageheight \fullpageheight = 240mm % page height including headlines
+% \newdimen\pageshift \pageshift = 0in % shift righthand pages wrt lefthand ones
+%
+% \def\magnify#1%
+% {\mag=#1
+% \pagewidth=6.5truein
+% \pageheight=8.7truein
+% \fullpageheight=9truein
+% \setpage}
+%
+% \def\setpage%
+% {\hsize\pagewidth
+% \vsize\pageheight} % use after changing page size
+%
+% \def\contentsfile {\jobname.toc} % file that gets table of contents info
+% \def\readcontents {\input \contentsfile}
+% \def\readindex {\input \jobname.idx}
+% \def\readsections {\input \jobname.scn}
+%
+% \newwrite\cont
+% \output{\setbox0=\page % the first page is garbage
+% \openout\cont=\contentsfile
+% \write\cont{\catcode `\noexpand\@=11\relax} % \makeatletter
+% \global\output{\normaloutput\page\lheader\rheader}}
+% \setpage
+% \vbox to \vsize{} % the first \topmark won't be null
+
+\defCWEBdummy\magnify#1% magnify the page
+ {}
+
+\defCWEBmacro\ch%
+ {\note{The following sections were changed by the change file:}
+ \let\*=\relax}
+
+% \newbox\sbox % saved box preceding the index
+% \newbox\lbox % lefthand column in the index
+%
+% \def\inx%
+% {\par\vskip6pt plus 1fil % we are beginning the index
+% \def\page{\box255 }
+% \normalbottom
+% \write\cont{} % ensure that the contents file isn't empty
+% \write\cont{\catcode `\noexpand\@=12\relax} % \makeatother
+% \closeout\cont % the contents information has been fully gathered
+% \output
+% {\ifpagesaved
+% \normaloutput{\box\sbox}\lheader\rheader
+% \fi
+% \global\setbox\sbox=\page
+% \global\pagesavedtrue}
+% \pagesavedfalse
+% \eject % eject the page-so-far and predecessors
+% \setbox\sbox\vbox{\unvbox\sbox} % take it out of its box
+% \vsize=\pageheight
+% \advance\vsize by -\ht\sbox % the remaining height
+% \hsize=.5\pagewidth
+% \advance\hsize by -10pt
+% % column width for the index (20pt between cols)
+% \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines
+% \def\lr{L} % this tells whether the left or right column is next
+% \output
+% {\if L\lr
+% \global\setbox\lbox=\page
+% \gdef\lr{R}
+% \else
+% \normaloutput
+% {\vbox to\pageheight
+% {\box\sbox
+% \vss
+% \hbox to\pagewidth{\box\lbox\hfil\page}}}
+% \lheader
+% \rheader
+% \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi}
+% \message{Index:}
+% \parskip 0pt plus .5pt
+% \outer\def\I##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry
+% \def\[##1]{$\underline{##1}$} % underlined index item
+% \rm
+% \rightskip0pt plus 2.5em
+% \tolerance 10000
+% \let\*=\lapstar
+% \hyphenpenalty 10000
+% \parindent0pt
+% \readindex}
+%
+% \def\fin%
+% {\par\vfill\eject % this is done when we are ending the index
+% \ifpagesaved\null\vfill\eject\fi % output a null index column
+% \if L\lr\else\null\vfill\eject\fi % finish the current page
+% \parfillskip 0pt plus 1fil
+% \def\grouptitle{NAMES OF THE SECTIONS}
+% \let\topsecno=\nullsec
+% \message{Section names:}
+% \output={\normaloutput\page\lheader\rheader}
+% \setpage
+% \def\note##1##2.{\quad{\eightrm##1~##2.}}
+% \def\Q{\note{Cited in section}} % crossref for mention of a section
+% \def\Qs{\note{Cited in sections}} % crossref for mentions of a section
+% \def\U{\note{Used in section}} % crossref for use of a section
+% \def\Us{\note{Used in sections}} % crossref for uses of a section
+% \def\I{\par\hangindent 2em}\let\*=*
+% \readsections}
+%
+% \def\con%
+% {\par\vfill\eject % finish the section names
+% %\ifodd\pageno\else\titletrue\null\vfill\eject\fi % for duplex printers
+% \rightskip = 0pt
+% \hyphenpenalty = 50
+% \tolerance = 200
+% \setpage
+% \output={\normaloutput\page\lheader\rheader}
+% \titletrue % prepare to output the table of contents
+% \pageno=\contentspagenumber
+% \def\grouptitle{TABLE OF CONTENTS}
+% \message{Table of contents:}
+% \topofcontents
+% \line{\hfil Section\hbox to3em{\hss Page}}
+% \let\ZZ=\contentsline
+% \readcontents\relax % read the contents info
+% \botofcontents
+% \end} % print the contents page(s) and terminate
+%
+% \def\contentsline#1#2#3#4%
+% {\ifnum#2=0
+% \smallbreak
+% \fi
+% \line{\consetup{#2}#1
+% \rm\leaders\hbox to .5em{.\hfil}\hfil\ #3\hbox to3em{\hss#4}}}
+%
+
+\defCWEBmacro\consetup#1%
+ {\ifcase#1 \bf % depth -1 (@**)
+ \or % depth 0 (@*)
+ \or \hskip2em % depth 1 (@*1)
+ \or \hskip4em % depth 2 (@*2)
+ \or \hskip6em % depth 3 (@*3)
+ \or \hskip8em % depth 4 (@*4)
+ \or \hskip10em % depth 5 (@*5)
+ \else \hskip12em
+ \fi} % depth 6 or more
+
+\defCWEBdummy \inx {} % index
+\defCWEBdummy \fin {} % finish
+\defCWEBdummy \con {} % table of contents and finish
+
+\defCWEBdummy \noinx {} % no indexes or table of contents
+\defCWEBdummy \nosecs {} % no index of section names or table of contents
+\defCWEBdummy \nocon {} % no table of contents
+
+\defCWEBmacro\,%
+ {\relax
+ \ifmmode
+ \mskip\thinmuskip
+ \else
+ \thinspace
+ \fi}
+
+% \def\noinx%
+% {\let\inx=\end}
+%
+% \def\nosecs%
+% {\let\FIN=\fin
+% \def\fin%
+% {\let\parfillskip=\end
+% \FIN}}
+%
+% \def\nocon%
+% {\let\con=\end}
+%
+% \newcount\twodigits
+%
+% \def\hours%
+% {\twodigits=\time
+% \divide\twodigits by 60
+% \printtwodigits
+% \multiply\twodigits by -60
+% \advance\twodigits by \time
+% :\printtwodigits}
+%
+% \def\gobbleone1{}
+%
+% \def\printtwodigits%
+% {\advance\twodigits by 100
+% \expandafter\gobbleone\number\twodigits
+% \advance\twodigits by -100 }
+%
+% \def\today%
+% {\ifcase\month
+% \or January\or February\or March\or April\or May\or June%
+% \or July\or August\or September\or October\or November\or December%
+% \fi
+% \space
+% \number\day, \number\year}
+%
+% \def\datethis%
+% {\def\startsection%
+% {\leftline{\sc\today\ at \hours}
+% \bigskip
+% \let\startsection=\stsec
+% \stsec}}
+%
+% \def\datecontentspage%
+% {\def\topofcontents%
+% {\leftline{\sc\today\ at \hours}
+% \bigskip
+% \centerline{\titlefont\title}
+% \vfill}}
+
+\defCWEBdummy\datethis {} % say `\datethis' in limbo, to get your listing timestamped before section 1
+\defCWEBdummy\datecontentspage {} % timestamps the contents page
+
+\defCWEBmacro\TeX%
+ {{\ifmmode\it\fi
+ \leavevmode
+ \hbox{T\kern-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}}
+
+% alternative implementation
+
+\newif\ifCWEBnotes
+
+\defCWEBmacro\Q {\CWEBnotesfalse \note{This code is cited in section}} % xref for mention of a section
+\defCWEBmacro\Qs {\CWEBnotestrue \note{This code is cited in sections}} % xref for mentions of a section
+
+\defCWEBmacro\U {\CWEBnotesfalse \note{This code is used in section}} % xref for use of a section
+\defCWEBmacro\Us {\CWEBnotestrue \note{This code is used in sections}} % xref for uses of a section
+
+\defCWEBmacro\A {\CWEBnotesfalse \note{See also section}} % xref for doubly defined section name
+\defCWEBmacro\As {\CWEBnotestrue \note{See also sections}} % xref for multiply defined section name
+
+\defCWEBmacro\ET% conjunction between two section numbers
+ { and~}
+
+\defCWEBmacro\ETs% conjunction between the last two of several section numbers
+ {, and~}
+
+%\def\processCWEBsectionnumbers[#1]%
+% {\bgroup
+% \def\CWEBcomma%
+% {\def\CWEBcomma{, }}%
+% \def\docommand##1%
+% {\bgroup
+% \def\[####1]{####1}%
+% \xdef\CWEBreference{##1}%
+% \egroup
+% \CWEBcomma{\naar{\donottest{##1}}[web:\CWEBreference]}}%
+% \processcommalist[{#1}]\docommand
+% \egroup}
+
+% \def\processCWEBsectionnumbers[#1]%
+% {\bgroup
+% \def\CWEBcomma%
+% {\def\CWEBcomma{, }}%
+% \def\docommand##1%
+% {\bgroup
+% \def\(####1){####1}%
+% \xdef\CWEBreference{##1}%
+% \egroup
+% \CWEBcomma
+% {\localcolortrue\naar{\donottest{##1}}[web:\CWEBreference]}}%
+% \bgroup
+% \def\[##1]{\(##1)}\let\(=\relax\xdef\CWEBreferences{#1}%
+% \egroup
+% \unexpanded\def\(##1){\[##1]}%
+% \processcommacommand[\CWEBreferences]\docommand
+% \egroup}
+
+\def\processCWEBsectionnumbers[#1]%
+ {\bgroup
+ \def\CWEBcomma%
+ {\def\CWEBcomma{, }}%
+ \def\docommand##1%
+ {\bgroup
+ \def\[####1]{####1}%
+ \xdef\CWEBreference{##1}%
+ \egroup
+ \CWEBcomma{\localcolortrue\goto{\donottest{##1}}[web:\CWEBreference]}}%
+ \processlist{(}{)}{,}\docommand(#1)
+ \egroup}
+
+\def\processCWEBsectionnotes%
+ {\catcode`\s=12
+ \doprocessCWEBsectionnotes}
+
+\def\doprocessCWEBsectionnotes#1.%
+ {\ifCWEBnotes
+ \def\next##1\ET##2##3.%
+ {\processCWEBsectionnumbers[##1]%
+ \if##2s%
+ {, and~\goto{##3}[web:##3]}%
+ \else
+ { and~\goto{##2##3}[web:##2##3]}%
+ \fi}%
+ \next#1.%
+ \else
+ \goto{#1}[web:#1]%
+ \fi
+ \afterCWEBnote % inside group!
+ \egroup}
+
+\let\afterCWEBnote=\relax
+
+\defCWEBmacro\note#1%
+ {\bgroup
+ \Y\noindent
+ \def\afterCWEBnote{\par}%
+ \hangindent2em
+ %\baselineskip10pt
+ \eightrm#1~\processCWEBsectionnotes}
+
+\def\oldCWEBmacroX#1:#2\X% original
+ {\ifmmode
+ \gdef\XX{\null$\null}%
+ \else
+ \gdef\XX{}%
+ \fi % section name
+ \XX$\langle\,${#2\eightrm\kern.5em#1}$\,\rangle$\XX}
+
+\defCWEBmacro\ATH%
+ {\oldCWEBmacroX\kern-.5em:Preprocessor definitions\X}
+
+\def\newCWEBmacroX#1:#2\X% original
+ {\ifmmode
+ \gdef\XX{\null$\null}%
+ \else
+ \gdef\XX{}%
+ \fi % section name
+ \XX$\langle\,$%
+ {#2\eightrm\kern.5em\processCWEBsectionnumbers[{#1}]}%
+ $\,\rangle$\XX}
+
+\defCWEBmacro\X#1:#2\X%
+ {\newCWEBmacroX#1:#2\X}
+
+\definemarking[CWEBfilename]
+\definemarking[CWEBsectiontitle]
+\definemarking[CWEBsectionnumber]
+\definemarking[CWEBsectiondepth]
+
+\defCWEBmacro\M#1%
+ {\MN{#1}%
+ \ifon
+ \vfil
+ \penalty-100
+ \vfilneg % beginning of section
+ \theCWEBvskip
+ \startsection
+ \pagereference[web:#1]%
+ \expanded{\marking[CWEBsectionnumber]{\secno}}%
+ \expanded{\marking[CWEBsectiondepth]{\the\gdepth}}%
+ \ignorespaces}
+
+\defCWEBmacro\N#1#2#3.%
+ {\gdepth=#1%
+ \MN{#2}% beginning of starred section
+ \ifon
+ \ifnum#1<\secpagedepth
+ \vfil
+ \eject % force page break if depth is small
+ \else
+ \vfil
+ \penalty-100
+ \vfilneg
+ \theCWEBvskip
+ \fi
+ \fi
+ \message{*\secno}% progress report
+ \makesectionformat % context
+ \defconvertedargument\ascii{#3}%
+ \edef\next%
+ {\write\CWEBcont % write to contents file
+ {\string\ZZ{\ascii}{#1}{\secno}%
+ {\sectionformat::\noexpand\userfolio}{\noexpand\realfolio}}}%
+ \next % \ZZ{title}{depth}{sec}{page}
+ \ifon
+ \startsection
+ \pagereference[web:#2]%
+ \marking[CWEBsectiontitle] {#3}%
+ \expanded{\marking[CWEBsectionnumber]{\secno}}%
+ \expanded{\marking[CWEBsectiondepth]{\the\gdepth}}%
+ {\bf#3.\quad}%
+ \ignorespaces}
+
+\defCWEBmacro\MN#1%
+ {\par % common code for \M, \N
+ {\xdef\secstar{#1}%
+ \let\*=\empty
+ \xdef\secno{#1}}% remove \* from section name
+ \ifx\secno\secstar
+ \onmaybe
+ \else
+ \ontrue
+ \fi}
+
+\newif\iflinktoCWEBfile
+
+\def\setCWEBlinkfile#1%
+ {\linktoCWEBfiletrue
+ \def\otherCWEBfile{#1}}
+
+\unprotect
+
+\def\gotoCWEBsection#1[#2]%
+ {\iflinktoCWEBfile
+ \bgroup
+ \setupinteraction[\c!color=,\c!style=]%
+ \let\savedreferenceprefix=\referenceprefix
+ \localcolortrue
+ \goto{#1}[\otherCWEBfile::\savedreferenceprefix web:#2]%
+ \egroup
+ \else
+ #1%
+ \fi}
+
+\protect
+
+\defCWEBmacro\startsection%
+ {\rightskip=0pt % get out of C mode (cf. \B)
+ \sfcode`;=1500
+ \pretolerance 200
+ \hyphenpenalty 50
+ \exhyphenpenalty 50
+ \noindent
+ \bgroup
+ \let\*=\lapstar
+ \gotoCWEBsection{\bf\secstar.\quad}[\secno]%
+ \egroup}
+
+\def\ignoreCWEBinput%
+ {\let\normalinput=\input
+ \def\input ##1 %
+ {\let\input=\normalinput}}
+
+\def\loadCWEBmacros#1%
+ {\let\oldN=\N
+ \def\N{\bgroup\setbox0=\vbox\bgroup\endinput}%
+ \ignoreCWEBinput
+ \ReadFile{#1.tex}%
+ \egroup\egroup
+ \let\N=\oldN}
+
+\def\resetCWEBcontext%
+ {\catcode`\|=12 % used in context discretionaries
+ \everypar{} % used for context indentation and floats
+ \parskip=0pt % no stretch between cweb paragraphs
+ \parindent=1em} % is related to cweb backspace etc
+
+\newwrite\CWEBcont
+
+\def\processCWEBsource #1 %
+ {\bgroup
+ \resetCWEBcontext
+ \activateCWEB
+ \ignoreCWEBinput
+ \immediate\openout\CWEBcont=#1.toc
+ \write\CWEBcont{\noexpand\unprotect}
+ \message{Source:}
+ \marking[CWEBfilename]{#1}
+ \ReadFile{#1.tex}\relax
+ \write\CWEBcont{\noexpand\protect}
+ \closeout\CWEBcont
+ \par
+ \egroup}
+
+\def\resetCWEBindexentry%
+ {\xdef\currentCWEBindexentry{}}
+
+\def\showCWEBindexentry#1% can be redefined
+ {\theCWEBvskip
+ \vskip3\lineheight
+ \goodbreak
+ \vskip-3\lineheight
+ {\pagereference[web:#1]\bf#1}%
+ \theCWEBvskip}
+
+\def\checkCWEBindexentry#1%
+ {\bgroup
+ \def\\##1{##1}% a dummy that also removes the {}
+ \def\|##1{##1}% another dummy
+ \def\.##1{*##1}% and another (the typewriter one)
+ \def\&##1{##1}% and a last one
+ \def\9##1{##1}% hold this one
+ \catcode`*=11
+ \expandafter\def\expandafter\entry\expandafter{#1}%
+ \defconvertedcommand\ascii\entry
+ \expanded{\FINDFIRSTCHARACTER{\ascii}}%
+ \doifnot{\currentCWEBindexentry}{\firstcharacter}
+ {\doifnot{\firstcharacter}{*} % signal for \firstbunch
+ {\global\let\currentCWEBindexentry=\firstcharacter
+ \showCWEBindexentry{\currentCWEBindexentry}}}%
+ \egroup}
+
+\def\theCWEBbeforeindex {\startcolumns}
+\def\theCWEBafterindex {\stopcolumns}
+
+\def\processCWEBindex #1 %
+ {\bgroup
+ \resetCWEBcontext
+ \activateCWEB
+ \resetCWEBindexentry
+ \def\I##1, %
+ {\par
+ \checkCWEBindexentry{##1}%
+ \hangindent2em
+ \noindent##1:\kern1em%
+ \def\next####1.%
+ {\processCWEBsectionnumbers[{####1}]}%
+ \next}%
+ \def\[##1]%
+ {$\underline{##1}$}%
+ \let\*=\lapstar
+ \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines
+% \parskip 0pt plus .5pt
+ \rightskip0pt plus 2.5em
+ \tolerance 10000
+ \hyphenpenalty 10000
+ \parindent0pt
+ \message{Index:}
+ \marking[CWEBfilename] {#1}
+ \marking[CWEBsectiontitle] {index}
+ \marking[CWEBsectionnumber]{}
+ \marking[CWEBsectiondepth]{}
+ \loadCWEBmacros{#1}
+ \theCWEBbeforeindex
+ \ReadFile{#1.idx}\relax
+ \theCWEBafterindex
+ \par
+ \egroup}
+
+\def\processCWEBsections #1 %
+ {\bgroup
+ \resetCWEBcontext
+ \activateCWEB
+ \loadCWEBmacros{#1}
+ \parfillskip = 0pt plus 1fil
+ \parindent = 0pt
+ \let\topsecno=\nullsec
+ \def\note##1%
+ {\quad
+ \bgroup
+ \eightrm
+ ##1~\processCWEBsectionnotes}
+ \def\Q {\CWEBnotesfalse \note{Cited in section}} % crossref for mention of a section
+ \def\Qs{\CWEBnotestrue \note{Cited in sections}} % crossref for mentions of a section
+ \def\U {\CWEBnotesfalse \note{Used in section}} % crossref for use of a section
+ \def\Us{\CWEBnotestrue \note{Used in sections}} % crossref for uses of a section
+ \def\I {\par\hangindent 2em}%
+ \let\*=*
+ \message{Section names:}
+ \marking[CWEBfilename] {#1}
+ \marking[CWEBsectiontitle] {sections}
+ \marking[CWEBsectionnumber]{}
+ \marking[CWEBsectiondepth]{}
+ \loadCWEBmacros{#1}
+ \ReadFile{#1.scn}\relax
+ \par
+ \botofcontents
+ \par
+ \egroup}
+
+\def\processCWEBcontents #1 %
+ {\bgroup
+ \resetCWEBcontext
+ \activateCWEB
+ \loadCWEBmacros{#1}
+ \rightskip = 0pt
+ \hyphenpenalty = 50
+ \tolerance = 200
+ \parindent = 0pt
+ \line{\hfil Section\hbox to3em{\hss Page}}
+ \let\ZZ=\contentsline
+ \message{Table of contents:}
+ \marking[CWEBfilename] {#1}
+ \marking[CWEBsectiontitle] {table of contents}
+ \marking[CWEBsectionnumber]{}
+ \marking[CWEBsectiondepth]{}
+ \loadCWEBmacros{#1}
+ \ReadFile{#1.toc}\relax
+ \par
+ \egroup}
+
+\defCWEBmacro\contentsline#1#2#3#4#5%
+ {\ifnum#2=0
+ \smallbreak
+ \fi
+ \line{\consetup{#2}#1
+ \rm
+ \leaders\hbox to .5em{.\hfil}\hfil\
+ {\localcolortrue\goto{#3}[web:#3]}% below: \gotorealpage ? should be changed
+ \hbox to3em{\localcolortrue\hss\gotorealpage{}{}{#5}{\translatednumber[#4]\presetgoto}}}}
+
+%D A last hack, needed because a file can overload of the
+%D above. (Some day: a check like \type{\ifx#1\CWEBdefined}.)
+
+\def\outer#1#2%
+ {\ifx#2\undefined
+ \expandafter#1\expandafter#2%
+ \else
+ \expandafter#1\expandafter\ThrowAway
+ \fi}
+
+\endinput
diff --git a/tex/context/base/m-database.tex b/tex/context/base/m-database.tex
new file mode 100644
index 000000000..3bb050f14
--- /dev/null
+++ b/tex/context/base/m-database.tex
@@ -0,0 +1,421 @@
+%D \module
+%D [ file=m-database,
+%D version=2006.04.23,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Database Thingies,
+%D author=Hans Hagen\& Taco Hoekwater,
+%D date=\currentdate,
+%D copyright=PRAGMA
+%D ]
+
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+% % % to be added to mult-* files
+%
+% % % todo: \dontcollectseparatedlist via k/v
+
+\definesystemvariable{ls}
+
+\def\c!first {first}
+\def\c!last {last}
+\def\c!quotechar {quotechar}
+
+\let\@NX\noexpand
+
+%D {processquotedlist}
+%D
+%D An even more general list processing macro is the
+%D following one:
+%D
+%D \starttyping
+%D \processquotedlist{beginsym}{endsym}{separator}\docommand list
+%D \stoptyping
+%D
+%D This one supports arbitrary open and close symbols as well
+%D as user defined separators.
+%D
+%D \starttyping
+%D \processquotedlist(){,}{"}\docommand(a=>b=>c=>d)
+%D \stoptyping
+
+\def\processquotedlist#1#2#3#4#5%
+ {\def\csvquotechar{#4}%
+ \edef\doconvertcsvquoteditem#4##1#4##2%
+ {\@NX\ifx##2#3%
+ \let\@NX\next\@NX\doconvertcsvlist
+ \def\@NX\arg{#3}%
+ \edef\@NX\temp{##1}%
+ \@NX\expanded{\@NX#5{\@NX\temp}}%
+ \@NX\else
+ \let\@NX\next\@NX\redoconvertcsvquoteditem
+ \def\@NX\arg{##1\@NX\csvquotechar}%
+ \@NX\fi
+ \@NX\expandafter\@NX\next\@NX\arg}%
+ \edef\redoconvertcsvquoteditem##1#4##2%
+ {\@NX\ifx##2#3%
+ \let\@NX\next\@NX\doconvertcsvlist
+ \def\@NX\arg{#3}%
+ \edef\@NX\temp{##1}%
+ \@NX\expanded{\@NX#5{\@NX\temp}}%
+ \@NX\else
+ \let\@NX\next\@NX\redoconvertcsvquoteditem
+ \def\@NX\arg{##1\@NX\csvquotechar}%
+ \@NX\fi
+ \@NX\expandafter\@NX\next\@NX\arg}%
+ \edef\doconvertcsvitem##1#3%
+ {\edef\@NX\temp{##1}%
+ \@NX\expanded{\@NX#5{\@NX\temp}}%
+ \@NX\doconvertcsvlist#3}%
+ \edef\doconvertcsvlist#3##1%
+ {\@NX\ifx##1\@NX#2%
+ \let\@NX\next \@NX\gobbleoneargument
+ \@NX\else\@NX\ifx##1#4%
+ \let\@NX\next \@NX\doconvertcsvquoteditem
+ \@NX\else
+ \let\@NX\next \@NX\doconvertcsvitem
+ \@NX\fi\@NX\fi \@NX\next##1}%
+ \doconvertcsvitem}
+
+\gdef\doprocessseparatedquoteditem#1%
+ {\appendseparatedlistparameter\c!left%
+ \appendseparatedlistcontent{#1}%
+ \appendseparatedlistparameter\c!right}
+
+% a version more robust with regard to {a a} b c d situations:
+
+\edef\detokenizedrelax{\detokenize{\relax}}
+
+\edef\processseplistseparator{\detokenize{,}}%
+
+\def\dodefineprocessseplist#1#2% separator \docommand
+ {\edef\processseplistseparator{\detokenize{#1}}%
+ \def\dodoprocessseplist##1##2#1%
+ {\edef\!!stringa{\detokenize{##1}}%
+ \ifx\detokenizedrelax\!!stringa
+ \expandafter\nodoprocessseplist
+ % \else\ifx\!!stringa#1%
+ \else\ifx\!!stringa\processseplistseparator
+ #2{}%
+ #2{##2}%
+ \expandafter\expandafter\expandafter\dodoprocessseplist
+ \else
+ #2{##1##2}%
+ \expandafter\expandafter\expandafter\dodoprocessseplist
+ \fi\fi}%
+ \def\doprocessseplist##1\relax
+ {\dodoprocessseplist##1#1\relax#1\relax\relax\end}}
+
+\def\nodoprocessseplist#1\end
+ {}
+
+\long\def\processseplist#1#2#3\relax raw version
+ {\dodefineprocessseplist{#1}{#2}%
+ \dodoprocessseplist#3#1\relax#1\relax\relax\end}
+
+% \dodefineprocessseplist{,}\test
+% \dodoprocessseplist{,}a,b,c\relax,\relax\relax\end
+% \doprocessseplista,b,c\relax
+
+% \def\test#1{[#1]}
+% \startlines
+% \processseplist{,}\test ,2,,\relax
+% \processseplist{,}\test ,,,44\relax
+% \processseplist{,}\test ,,33,44\relax
+% \processseplist{,}\test 11,,33,44\relax
+% \processseplist{,}\test 1,2,3,4\relax
+% \stoplines
+
+\newtoks\separatedlistdata
+
+\def\appendseparatedlistparameter#1%
+ {\@EAEAEA\appendtoks\csname\??ls\currentseparatedlist#1\endcsname\to\separatedlistdata}
+
+\def\appendseparatedlistcontent#1%
+ {\appendtoks#1\to\separatedlistdata}
+
+\def\flushseparatedlistdata
+ {\the\separatedlistdata
+ \separatedlistdata\emptytoks}
+
+\def\initializeseparatedlistdata
+ {\separatedlistdata{\egroup}}
+
+\def\dontcollectseparatedlist
+ {\def\dodoprocessseparatedfileline
+ {\the\separatedlistdata
+ \separatedlistdata\emptytoks
+ \doprocessseparatedfileline}%
+ \def\dodoprocessseparatedline
+ {\the\separatedlistdata
+ \separatedlistdata\emptytoks
+ \doprocessseparatedline}%
+ \let\flushseparatedlistdata\egroup
+ \let\initializeseparatedlistdata\donothing}
+
+\chardef\separatedlistmode\zerocount
+
+\def\setcurrentlistseparator
+ {\edef\currentlistseparator
+ {\executeifdefined
+ {\??ls::\csname\??ls\currentseparatedlist\c!separator\endcsname}%
+ {\csname\??ls\currentseparatedlist\c!separator\endcsname}}%
+ \doifvalue{\??ls\currentseparatedlist\c!separator}{tab}
+ {\catcode`\^^I=12\relax}%
+ \ifx\currentlistseparator\empty\def\currentlistseparator{,}\fi}
+
+\bgroup \catcode`\^^I=12
+ \setgvalue{\??ls::tab}{ }
+ \setgvalue{\??ls::space}{ }
+ \setgvalue{\??ls::comma}{,}
+\egroup
+
+\def\doprocessseparatedfileline
+ {\ifeof\scratchread
+ \ifcase\separatedlistmode\appendseparatedlistparameter\c!after\fi
+ \immediate\closein\scratchread
+ \expandafter\flushseparatedlistdata
+ \else\ifx\line\empty
+ % skip, can be comment
+ \read\scratchread to\line
+ \@EA\dodoprocessseparatedfileline
+ \else
+ \appendseparatedlistparameter{\ifcase\separatedlistmode\c!first\else\c!command\fi}%
+ \ifx\currentlistquotechar\empty%
+ \expandafter\doprocessseplist\line\relax
+ \else
+ \expanded{\processquotedlist{}{\noexpand\end}%
+ {\currentlistseparator}{\currentlistquotechar}%
+ \noexpand\doprocessseparatedquoteditem \line\currentlistseparator\noexpand\end}%
+ \fi
+ \ifcase\separatedlistmode\appendseparatedlistparameter\c!last\fi
+ \read\scratchread to\line
+ \@EAEAEA\dodoprocessseparatedfileline
+ \fi\fi}
+
+\def\dodoprocessseparatedfileline
+ {\doprocessseparatedfileline}
+
+\def\doprocessseparatedfile[#1][#2]%
+ {\bgroup
+ \edef\currentseparatedlist{#1}%
+ \doifdefined{\??ls\currentseparatedlist\c!command}{\chardef\separatedlistmode\plusone}%
+ \setcurrentlistseparator
+ \edef\currentlistquotechar{\csname\??ls\currentseparatedlist\c!quotechar\endcsname}%
+ \expandafter\dodefineprocessseplist\expandafter{\currentlistseparator}\doprocessseparateditem
+ \initializeseparatedlistdata
+ \directsetup{\currentseparatedlist:\executeifdefined{\??ls\currentseparatedlist\c!setups}\s!default}%
+ \ifcase\separatedlistmode\appendseparatedlistparameter\c!before\fi
+ \endlinechar\minusone
+ \ignorelines
+ \catcode`\#\@@comment
+ \immediate\openin\scratchread=#2\relax % todo: \doopenin
+ \read\scratchread to\line
+ \doprocessseparatedfileline}
+
+\def\dostartseparatedlist#1[#2]%
+ {\bgroup
+ \edef\currentseparatedlist{#2}%
+ \doifdefined{\??ls\currentseparatedlist\c!command}{\chardef\separatedlistmode\plusone}%
+ \obeylines
+ \let#1\relax
+ \def\separateslistend{#1}%
+ \setcurrentlistseparator
+ \edef\currentlistquotechar{\csname\??ls\currentseparatedlist\c!quotechar\endcsname}%
+ \expandafter\dodefineprocessseplist\expandafter{\currentlistseparator}\doprocessseparateditem
+ \directsetup{\currentseparatedlist:\executeifdefined{\??ls\currentseparatedlist\c!setups}\s!default}%
+ \initializeseparatedlistdata
+ \ifcase\separatedlistmode\appendseparatedlistparameter\c!before\fi
+ \dodostartseparatedlist}
+
+\def\redoprocessseparatedline#1%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\separateslistend
+ \ifcase\separatedlistmode\appendseparatedlistparameter\c!after\fi
+ \expandafter\flushseparatedlistdata
+ \else%
+ \appendseparatedlistparameter{\ifcase\separatedlistmode\c!first\else\c!command\fi}%
+ \ifx\currentlistquotechar\empty%
+ \doprocessseplist#1\relax
+ \else%
+ \defconvertedargument\csvdata{#1}%
+ \expanded{\processquotedlist{}{\noexpand\end}%
+ {\currentlistseparator}{\currentlistquotechar}%
+ \noexpand\doprocessseparatedquoteditem \csvdata\currentlistseparator\noexpand\end}%
+ \fi
+ \ifcase\separatedlistmode\appendseparatedlistparameter\c!last\fi
+ \expandafter\dodoprocessseparatedline
+ \fi}
+
+\def\doprocessseparatedline
+ {\doifnextbgroupelse\xdoprocessseparatedline\ydoprocessseparatedline}
+
+\def\dodoprocessseparatedline
+ {\doprocessseparatedline}
+
+\def\doprocessseparateditem#1%
+ {\ifcase\separatedlistmode
+ \appendseparatedlistparameter\c!left
+ \appendseparatedlistcontent{#1}%
+ \appendseparatedlistparameter\c!right
+ \else
+ \appendseparatedlistcontent{{#1}}%
+ \fi}
+
+
+\bgroup \obeylines
+
+ \gdef\dodostartseparatedlist#1
+ {\doprocessseparatedline}
+
+ \gdef\xdoprocessseparatedline#1#2
+ {\redoprocessseparatedline{{{#1}}#2}}
+
+ \gdef\ydoprocessseparatedline#1
+ {\redoprocessseparatedline{#1}}
+
+\egroup
+
+\startsetups CSV:unix
+ \catcode`\#=\@@comment
+\stopsetups
+
+\def\defineseparatedlist
+ {\dodoubleempty\dodefineseparatedlist}
+
+\def\dodefineseparatedlist[#1][#2]%
+ {\setvalue{\e!start#1}{\expandafter\dostartseparatedlist\csname\e!stop#1\endcsname[#1]}%
+ \getparameters
+ [\??ls#1]
+ [\c!separator=,
+ \c!quotechar=,
+ \c!first=,
+ \c!left=,
+ \c!before=,
+ \c!right=,
+ \c!last=,
+ \c!after=,
+% \c!command=,
+ #2]}
+
+\def\setupseparatedlist
+ {\dodoubleempty\dosetupseparatedlist}
+
+\def\dosetupseparatedlist[#1]% [#2]
+ {\getparameter[\??ls#1]} % [#2]
+
+\def\startseparatedlist[#1]%
+ {\dostartseparatedlist\stopseparatedlist[#1]}
+
+\def\processseparatedfile
+ {\dodoubleargument\doprocessseparatedfile}
+
+\protect \doifnotmode{demo}{\endinput}
+
+\defineseparatedlist
+ [CSV]
+ [separator={,},
+ first=\bTR,last=\eTR,
+ left=\bTD,right=\eTD,
+ before=\bTABLE,after=\eTABLE]
+
+\startseparatedlist[CSV]
+a,b,c
+d,e,f
+\stopseparatedlist
+
+\startCSV
+a,b,c
+d,e,f
+\stopCSV
+
+\defineseparatedlist
+ [CSV]
+ [separator={,},
+ quotechar={"},
+ first=\NC,last=\NR,
+ left=,right=\NC,
+ before={\starttabulate[|l|l|l|]},after=\stoptabulate]
+
+\startCSV
+a,b,"c,d"
+d,"""",f
+\stopCSV
+
+\defineseparatedlist
+ [CSV]
+ [separator={ },
+ first=\NC,last=\NR,
+ left=,right=\NC,
+ before={\starttabulate[|l|l|l|]},after=\stoptabulate]
+
+\startCSV
+a b c
+d e f
+\stopCSV
+
+\defineseparatedlist
+ [CSV]
+ [setups=unix,
+ first=\NC,last=\NR,
+ left=,right=\NC,
+ before={\starttabulate[|l|l|l|]},after=\stoptabulate]
+
+% \startsetups CSV:unix
+% \catcode`\#=\@@comment
+% \stopsetups
+
+% %1,2,3
+% 1,2,3
+% # 4,5,6
+% 4,5,6
+
+\processseparatedfile[CSV][test.dat]
+
+\defineseparatedlist
+ [CSVX]
+ [command=\Whatever,
+ separator={,},
+ first=\bTR,last=\eTR,
+ left=\bTD,right=\eTD,
+ before=\bTABLE,after=\eTABLE]
+
+\def\Whatever#1#2#3{[#1][#2][#3]\endgraf}
+
+\startseparatedlist[CSVX]
+a,b,c
+d,e,f
+\stopseparatedlist
+
+\defineseparatedlist[CSV]
+ [separator=comma,
+ before=\bTABLE, after=\eTABLE,
+ first=\bTR, last=\eTR,
+ left=\bTD, right=\eTD]
+
+\startCSV
+a,b,c,č
+d,e,f,š
+\stopCSV
+
+\enableregime[utf]
+
+\defineseparatedlist[X][separator=X,left=(,right=),first=\endgraf,last=\endgraf]
+\defineseparatedlist[Y][separator=Y,left=(,right=),first=\endgraf,last=\endgraf]
+
+\startX
+aXb
+Xc
+čXš
+\stopX
+
+\startY
+aYb
+Yc
+čYš
+\stopY
+
+\stoptext
diff --git a/tex/context/base/m-datastrc.tex b/tex/context/base/m-datastrc.tex
new file mode 100644
index 000000000..4a6faa66b
--- /dev/null
+++ b/tex/context/base/m-datastrc.tex
@@ -0,0 +1,228 @@
+%D \module
+%D [ file=m-datastrc, % was: core-dat % was core-02a
+%D version=1999.08.10, % 1997.03.31,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Database Support, % 2A
+%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 / Database Support}
+
+\unprotect
+
+%D This module is a (limited) rewrite of the original \type
+%D {core-02a} module, the module that dealt with managing a
+%D database of addresses. The principles and methods have not
+%D changed; they are only generalized.
+%D
+%D A database file |<|in most cases such a base is generated
+%D from another one|>| is structured as follows:
+%D
+%D \starttyping
+%D \startrecord{tag}
+%D \memberofgroup{grouplist}
+%D \setrecordentry{name}{...}
+%D ....
+%D \stoprecord
+%D \stoptyping
+%D
+%D The interface to such a database is defined as follows:
+%D
+%D \starttyping
+%D \definerecord[class][settings]
+%D \setuprecord[class][settings]
+%D \definerecordentry[class][name]
+%D \stoptyping
+%D
+%D and processed by
+%D
+%D \starttyping
+%D \processrecords[file list][tag and/or group list]
+%D \stoptyping
+%D
+%D The actual processing is done by a macro assigned to \type
+%D {command}:
+%D
+%D \starttyping
+%D \setuprecord[class][command=\DoWithRecord]
+%D \stoptyping
+%D
+%D Given that one can ask for a field with
+%D
+%D \starttyping
+%D \getrecordentry{name}
+%D \stoptyping
+%D
+%D such a command can look like:
+%D
+%D \starttyping
+%D \def\DoWithRecord#1%
+%D {\startpacked
+%D \let\\=\quad
+%D name: \getrecordentry{name}~\getrecordentry{family name}\par
+%D address: \getrecordentry{postal address}\par
+%D \stoppacked}
+%D \stoptyping
+%D
+%D The argument passed is the tag. The database can look like:
+%D
+%D \starttyping
+%D \startrecord{hagenj}
+%D \memberofgroup{a,b}
+%D \setrecordentry{naam}{Hans}
+%D \setrecordentry{family name}{Hagen}
+%D \setrecordentry{postal address}{J. Hagen\\Ridderstraat 29\\Hasselt NL}
+%D \stoprecord
+%D
+%D \startrecord{ottenaf}
+%D \memberofgroup{a}
+%D \setrecordentry{name}{Ton}
+%D \setrecordentry{family name}{Otten}
+%D \setrecordentry{postal address}{A.F. Otten\\Prinsengracht 17\\Hasselt NL}
+%D \stoprecord
+%D \stoptyping
+%D
+%D The definition of this database looks like:
+%D
+%D \starttyping
+%D \definerecord[address][command=\DoWithRecord]
+%D
+%D \definerecordentry[address][name]
+%D \definerecordentry[address][family name]
+%D \definerecordentry[address][postal address]
+%D \stoptyping
+%D
+%D The actual processing is now done by (for instance):
+%D
+%D \starttyping
+%D \processrecords[datafile][hagenj]
+%D \processrecords[datafile][hagenj,offenaf]
+%D \processrecords[datafile][all]
+%D \processrecords[datafile][a]
+%D \processrecords[datafile][b]
+%D \stoptyping
+%D
+%D Of course one can reassign the command used to handle the
+%D records in between.
+
+% \??kt ->
+% \??kw ->
+
+\def\??db {@@db}
+\def\c!velden{velden}
+
+%\newevery \everyrecord \EveryRecord
+
+\def\definerecord
+ {\dodoubleempty\dodefinerecord}
+
+\def\dodefinerecord[#1][#2]%
+ {\getparameters
+ [\??db#1]
+ [\c!velden=,
+ \c!command=\gobbleoneargument,
+ #2]}
+
+\def\setuprecord
+ {\dodoubleargument\dosetuprecord}
+
+\def\dosetuprecord[#1][#2]%
+ {\getparameters[\??db#1][#2]}%
+
+\def\definerecordentry[#1][#2]%
+ {\edef\recordentries{\getvalue{\??db#1\c!velden}}%
+ \addtocommalist{#2}\recordentries
+ \letvalue{\??db#1\c!velden}\recordentries}
+
+%D Watch out: the entries are defined global! While
+%D processing a record, no grouping is applied.
+
+\def\getrecordentry #1{\getvalue {\??db:#1}}
+\def\resetrecordentry #1{\letgvalueempty{\??db:#1}}
+\def\assignrecordentry#1{\setgvalue {\??db:#1}}
+
+\long\def\skiprecord#1\stoprecord
+ {\egroup}
+
+\newif\ifrecordok
+
+\newtoks\resetrecordlist
+
+\def\processrecords
+ {\dotripleargument\doprocessrecords}
+
+\def\doprocessrecords[#1][#2][#3]%
+ {\bgroup
+ \ifx\\\undefined\let\\\relax\fi
+ \def\docommand##1%
+ {\resetrecordentry{##1}%
+ \appendtoks\resetrecordentry{##1}\to\resetrecordlist}%
+ \processcommacommand[\getvalue{\??db#1\c!velden}]\docommand
+ \let\setrecordentry\skiprecord
+ \the\resetrecordlist
+ \doifelse{#2}\v!all % 't Is nu eenmaal alles
+ \recordoktrue
+ {\doifelsenothing{#2} % of niets
+ \recordoktrue
+ \recordokfalse}% % zullen we maar zeggen.
+ \ifrecordok
+ \let\askedrecords\v!all
+ \else
+ \makerawcommalist[#2]\askedrecords
+ \fi
+ \def\checkrecord##1%
+ {\rawdoifinsetelse{##1}{\askedrecords}{\recordoktrue}{}}%
+ \def\presetrecord##1%
+ {\let\setrecordentry\assignrecordentry
+ \let\memberofgroup\gobbleoneargument
+ \the\resetrecordlist
+ \def\stoprecord{\dostoprecord{##1}}}%
+ \def\memberofgroup##1%
+ {\doifsomething{##1}
+ {\rawprocesscommalist[##1]\checkrecord}%
+ \ifrecordok
+ \presetrecord{##1}%
+ \else
+ \expandafter\skiprecord
+ \fi}%
+ \def\startrecord##1%
+ {\bgroup
+ \ifrecordok
+ \presetrecord{##1}%
+ \else
+ \checkrecord{##1}%
+ \ifrecordok
+ \presetrecord{##1}%
+ \fi
+ \fi}%
+ \def\dostoprecord##1%
+ {\relax
+ \egroup
+ %\the\everyrecord
+ \getvalue{\??db#1\c!command}{##1}}%
+ \showmessage\m!databases1\askedrecords
+ \def\doprocessrecords##1%
+ {\readjobfile{##1}
+ {\showmessage\m!databases2{(job)}}
+ {\readsysfile{##1}
+ {\showmessage\m!databases3{(sys)}}
+ {\showmessage\m!databases4{}}}}%
+ \processcommalist[#3]\doprocessrecords
+ \egroup}
+
+%D While writing the original implementation, I did some
+%D experiments with \type {%} before each entry and changing
+%D the category code of the comment char. Because \TEX\ scans
+%D the line anyway |<|this is needed because the end of line
+%D character can be non standard|>| this is not faster.
+%D
+%D Although this mechanism could have been combined with the
+%D block moving mechanism, the current implementation is
+%D prefered out of speed reasons.
+
+\protect \endinput
diff --git a/tex/context/base/m-directives.tex b/tex/context/base/m-directives.tex
new file mode 100644
index 000000000..c958f6cad
--- /dev/null
+++ b/tex/context/base/m-directives.tex
@@ -0,0 +1,5 @@
+\doifnotmode{mkiv} {\endinput}
+
+\starttext
+ \showdirectives
+\stoptext
diff --git a/tex/context/base/m-dratex.tex b/tex/context/base/m-dratex.tex
new file mode 100644
index 000000000..6c088daf9
--- /dev/null
+++ b/tex/context/base/m-dratex.tex
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=m-dratex,
+%D version=2005.11.25,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\DRATEX\ Loading Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details
+
+\readfile{DraTex.sty}{}{\readfile{dratex.sty}{}{\endinput}}
+
+\letvalue{:NewCount}\newcount
+\letvalue{:NewDimen}\newdimen
+
+\readfile{AlDraTex.sty}{}{\readfile{aldratex.sty}{}{\endinput}}
+
+\endinput
diff --git a/tex/context/base/m-edtsnc.tex b/tex/context/base/m-edtsnc.tex
new file mode 100644
index 000000000..0926f4488
--- /dev/null
+++ b/tex/context/base/m-edtsnc.tex
@@ -0,0 +1,207 @@
+%D \module
+%D [ file=m-editsnc,
+%D version=2003.12.23,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Editor Synchronization,
+%D author={Hans Hagen \& Ton Otten},
+%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.edit for
+%C details.
+
+% \enablemode[demo]
+
+% This file is a variation of the file m-pdfsync. This time we do it
+% in a more abstract way and prepare ourselves for support in dvi
+% output.
+
+% \enableeditsync
+% \disableeditsync
+% \editsync
+% \editsynctext {string}
+% \editsyncnode {char}
+% \editsynctracemode [chardef: 0-4]
+
+\writestatus{editsync}{loading and enabling editor synchronization support}
+
+\unprotect % not really needed
+
+\ifx\pdfoutput\undefined
+ \donefalse
+\else\ifcase\pdfoutput
+ \donefalse
+\else\ifx\pdfsavepos\undefined
+ \donefalse
+\else
+ \donetrue
+\fi\fi\fi
+
+\chardef \editsyncstate \zerocount
+\chardef \editsynctracemode \zerocount
+\newcount \editsynccounter
+\newwrite \editsyncwrite
+
+\def\enableeditsync {\chardef\editsyncstate\plusone}
+\def\disableeditsync{\chardef\editsyncstate\zerocount}
+
+% The following definitions can go into the special drivers, but
+% for the moment we do it this way.
+
+\ifdone
+
+ \def\dostarteditsync
+ {\immediate\openout\editsyncwrite\jobname.pdfsync
+ \immediate\write\editsyncwrite{\jobname}%
+ \immediate\write\editsyncwrite{version 0}}
+
+ \def\dostopeditsync
+ {\closeout\editsyncwrite}
+
+ \def\doeditsyncregisterpage#1{\immediate\write\editsyncwrite{s\space\number#1}}
+ \def\doeditsyncopenfile #1{\immediate\write\editsyncwrite{(\space#1}}
+ \def\doeditsyncclosefile #1{\immediate\write\editsyncwrite{)}}
+
+ \def\doregistereditsyncnode#1#2#3% tag counter linenumber
+ {\pdfsavepos
+ \immediate\write\editsyncwrite{l\space\number#2\space\number#3}%
+ \expanded{\write\editsyncwrite{p\ifnum#1=\plusone*\fi\space\number#2\space\noexpand\the\pdflastxpos\space\noexpand\the\pdflastypos}}}
+
+\else
+
+ \let\dostarteditsync \relax
+ \let\dostopeditsync \relax
+
+ \let\doeditsyncregisterpage\gobbleoneargument
+ \let\doeditsyncopenfile \gobbleoneargument
+ \let\doeditsyncclosefile \gobbleoneargument
+ \let\doregistereditsyncnode\gobblethreearguments
+
+ % These specials could be filtered by a dvitopdf backend and
+ % written to a jobname.pdfsync file. In that case, the x and
+ % y coordinates have to be to be resolved by driver.
+
+ % \def\doeditsyncregisterpage#1{\special{pdfsync: s\space\number#1}}
+ % \def\doeditsyncopenfile #1{\special{pdfsync: ( #1}}
+ % \def\doeditsyncclosefile #1{\special{pdfsync: )}}
+
+ % \def\doregistereditsyncnode#1#2#3%
+ % {\special{pdfsync: l the\editsynccounter\space\number#3}%
+ % \special{pdfsync: p\ifnum#1=\plusone*\fi\space\number#2}}
+
+\fi
+
+\let\editsynctracer\gobbleoneargument
+
+\editsynccounter\minusone % counting starts at zero and we increment beforehand
+
+\def\registereditsyncnode#1% we assume #1 is one token
+ {\ifcase\editsyncstate
+ \expandafter\gobbleoneargument
+ \else
+ \global\advance\editsynccounter\plusone
+ \doregistereditsyncnode#1\editsynccounter\inputlineno
+ \expandafter\editsynctracer
+ \fi}
+
+\def\editsync {\registereditsyncnode\plusone *}
+\def\editsyncnode{\registereditsyncnode\zerocount}
+\def\editsynctext{\registereditsyncnode\plusone }
+
+\appendtoks \dostarteditsync \to \everystarttext
+%appendtoks \dostopeditsync \to \everystoptext
+\appendtoks \doeditsyncregisterpage\realfolio \to \everyshipout
+\appendtoks \doeditsyncopenfile\readfilename \to \everybeforereadfile
+\appendtoks \doeditsyncclosefile\readfilename \to \everyafterreadfile
+
+\appendtoks \enableeditsync \to \everystarttext
+\appendtoks \disableeditsync \to \everypagebody
+
+\def\editsynctracer#1%
+ {\ifcase\editsynctracemode\else
+ \begingroup
+ \forgetall
+ \disableeditsync
+ \ifcase\editsynctracemode\or % could be done more efficient, box around ifcase
+ \setbox\scratchbox\hbox to \zeropoint{\hss\infofont#1\hss}% 1
+ \else
+ \setbox\scratchbox\hbox to \zeropoint{\hss\traceboxplacementtrue\boxcursor\hss}% 2/3/4
+ \fi
+ \smashbox\scratchbox\box\scratchbox
+ \ifcase\editsynctracemode\or\or\or
+ \setbox\scratchbox\hbox to \zeropoint{\hss\raise1.25ex\hbox{\infofont#1}\hss}% 3
+ \smashbox\scratchbox\box\scratchbox
+ \or
+ \setbox\scratchbox\hbox to \zeropoint{\hss\lower1.25ex\hbox{\infofont#1}\hss}% 4
+ \smashbox\scratchbox\box\scratchbox
+ \fi
+ \endgroup
+ \fi}
+
+% \def\editsynctracer#1% more efficient but unreadable
+% {\ifcase\editsynctracemode\else
+% \ifcase\editsyncstate\else
+% \begingroup
+% \forgetall
+% \disableeditsync
+% \setbox\scratchbox\hbox to \zeropoint
+% {\hss
+% \ifcase\editsynctracemode\or
+% \infofont#1% 1
+% \else
+% \traceboxplacementtrue\boxcursor% 2/3/4
+% \fi
+% \hss}%
+% \smashbox\scratchbox\box\scratchbox
+% \setbox\scratchbox\hbox to \zeropoint
+% {\hss
+% \ifcase\editsynctracemode\or\or\or
+% \raise1.25ex\hbox{\infofont#1}% 3
+% \or
+% \lower1.25ex\hbox{\infofont#1}% 4
+% \fi
+% \hss}%
+% \smashbox\scratchbox\box\scratchbox
+% \endgroup
+% \fi
+% \fi}
+
+% beware, adding nodes this way will interfere with the typesetting
+
+\appendtoks \editsyncnode p\to \everypar
+\appendtoks \editsyncnode m\to \everymath
+\appendtoks \editsyncnode d\to \everydisplay
+\appendtoks \editsyncnode h\to \everyhbox
+
+% For compatibility with 'pdfsync4context' we provide:
+
+\let\pdfsyncstart\enableeditsync
+\let\pdfsyncstop \disablepdfsync
+\let\pdfsync \editsync
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\chardef\editsynctracemode=3
+
+\starttext
+
+\chapter{Test}
+
+\processfile{tufte}
+
+\startitemize
+\item first
+\item second
+\stopitemize
+
+\processfile{tufte}
+
+\startlines
+some local \editsync sync and \editsynctext{here}a marked point
+some local \editsync sync and \editsyncnode{here}a marked point
+\stoplines
+
+\stoptext
diff --git a/tex/context/base/m-educat.tex b/tex/context/base/m-educat.tex
new file mode 100644
index 000000000..ddfb72ff4
--- /dev/null
+++ b/tex/context/base/m-educat.tex
@@ -0,0 +1,217 @@
+%D \module
+%D [ file=m-educat,
+%D version=2003.03.05,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Educational Extras,
+%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 will collect a few macros cq.\ definitions
+%D meant for educational use. Most of the code has been laying
+%D around for some time and has been (or is still) used in
+%D \PRAGMA\ projects.
+
+\unprotect
+
+\definesystemvariable{iv}
+
+\definecolor [answerareacolor] [s=.90]
+\definecolor [answerlinecolor] [white]
+
+\definetextbackground
+ [\v!answerarea]
+ [\c!location=\v!text,
+ \c!n=0,
+ \c!frame=\v!off,
+ \c!framecolor=answerlinecolor,
+ \c!rulethickness=2pt,
+ \c!background=\v!color,
+ \c!backgroundcolor=answerareacolor,
+ \c!alternative=2] % betweenline
+
+% n=gedwongen
+% m=extra auto
+
+\def\setupanswerarea
+ {\setuptextbackground[\v!answerarea]}
+
+\setvalue\e!answerspace
+ {\dosingleempty\doanswerspace}
+
+\def\doanswerspace[#1]%
+ {\begingroup
+ \dontcomplain
+ \setupanswerarea
+ [\c!n=0,\c!m=,#1,\c!location=\v!text]%
+ \doifelsenothing{\backgroundvariable\c!m}
+ {\expandafter\donoanswerspace}
+ {\expandafter\dodoanswerspace}%
+ [#1]}
+
+\def\donoanswerspace[#1]#2%
+ {\setupthinrules
+ [\c!alternative=\backgroundvariable\c!alternative,
+ \c!color=\backgroundvariable\c!framecolor,
+ \c!background=\backgroundvariable\c!background,
+ \c!backgroundcolor=\backgroundvariable\c!backgroundcolor,
+ \c!rulethickness=\backgroundvariable\c!rulethickness]%
+ \doifelse{\backgroundvariable\c!n}{*}
+ {\thinrule
+ \par}
+ {\scratchcounter0\backgroundvariable\c!n\relax
+ % tricky, guess
+ \def\processisolatedword##1%
+ {\setbox\scratchbox=\hbox{##1}%
+ \vbox{\hsize\wd\scratchbox\thinrule
+ \ifcase\scratchcounter\else
+ \setbox\scratchbox=\hbox{\space}%
+ \nobreak\hskip\zeropoint \!!minus \wd\scratchbox
+ \vbox{\hsize\wd\scratchbox\thinrule}%
+ \fi}}%
+ \processisolatedwords{#2}\processisolatedword
+ % so far
+ \ifcase\scratchcounter \else \ifnum\scratchcounter<3
+ \nobreak \vbox{\hsize\scratchcounter em\thinrule}%
+ \else % more
+ \advance \scratchcounter -2
+ \dorecurse\scratchcounter{\allowbreak\vbox{\hsize1em\thinrule}}%
+ \nobreak \vbox{\hsize2em\thinrule}%
+ \fi \fi}%
+ \endgroup}
+
+\def\dodoanswerspace[#1]#2% m case
+ {\getvalue{\e!start\v!answerarea}%
+ #2%
+ \doifelse{\backgroundvariable\c!m}{*}
+ {\hfill\strut
+ \getvalue{\e!stop\v!answerarea}%
+ \par}
+ {\scratchcounter0\backgroundvariable\c!m\relax
+ \ifcase\scratchcounter \else \ifnum\scratchcounter<3
+ \nobreak \hbox to \scratchcounter em{\strut\hss}%
+ \else % more
+ \advance \scratchcounter -2
+ \dorecurse\scratchcounter{\allowbreak\hbox to 1em{\strut\hss}}%
+ \nobreak \hbox to 2em{\strut\hss}%
+ \fi \fi
+ \getvalue{\e!stop\v!answerarea}}%
+ \endgroup}
+
+\setvalue{\e!start\e!answerlines}%
+ {\dosingleempty\dostartanswerlines}
+
+\def\dostartanswerlines[#1]%
+ {\begingroup
+ \dontcomplain
+ \setupanswerarea
+ [\c!n=0,\c!m=,#1,\c!location=\v!text]%
+ \doifnot{\backgroundvariable\c!option}\v!joinedup\softbreak
+ \doifelsenothing{\backgroundvariable\c!m}
+ {\expandafter\donostartanswerlines}
+ {\expandafter\dodostartanswerlines}%
+ [#1]}
+
+\def\donostartanswerlines[#1]%
+ {\setupthinrules
+ [\c!alternative=\backgroundvariable\c!alternative,
+ \c!color=\backgroundvariable\c!framecolor,
+ \c!background=\backgroundvariable\c!background,
+ \c!backgroundcolor=\backgroundvariable\c!backgroundcolor,
+ \c!rulethickness=\backgroundvariable\c!rulethickness]%
+ \thinrules[\c!n=\backgroundvariable\c!n]\par
+ \endgroup
+ \grabuntil{\e!stop\e!answerlines}}
+
+\def\dodostartanswerlines[#1]%
+ {\begingroup
+ \getvalue{\e!start\v!answerarea}%
+ \ignorespaces}
+
+\setvalue{\e!stop\e!answerlines}%
+ {\scratchcounter0\backgroundvariable\c!m\relax
+ % a \softbreak is more efficient in pos dan \par
+ \ifcase\scratchcounter
+ % nothing
+ \or
+ \softbreak
+ \else
+ \softbreak
+ \advance \scratchcounter \minusone
+ \dorecurse\scratchcounter{\strut\hfill\strut\softbreak}%
+ \fi
+ \strut\hfill\strut
+ \getvalue{\e!stop\v!answerarea}%
+ \par\endgroup\endgroup}
+
+\setvalue\e!answerlines
+ {\dosingleempty\doanswerlines}
+
+\def\doanswerlines[#1]#2%
+ {\getvalue{\e!start\e!answerlines}[#1]%
+ #2%
+ \getvalue{\e!stop\e!answerlines}}
+
+\protect \doifnotmode{demo}{\endinput}
+
+%D Test materiaal.
+
+\starttext
+
+\startnotmode[answers]
+
+ \setupanswerarea[level=+1]
+
+\stopnotmode
+
+\setupcolors[state=start]
+
+test test test \answerspace [n=10] {Whow}. test test test
+test tets test test \answerspace [n=10] {Whow}. test test
+test test tets test test \answerspace [n=10] {Whow}. test
+test test test tets test test \answerspace [n=10] {Whow}.
+test test test test test test \answerspace [n=*] {Whow.}
+
+test test test test test test test \startanswerlines
+[n=3] What A Junk Answer \stopanswerlines
+
+test test test test test test test \startanswerlines
+[n=3,alternative=0] What A Junk Answer \stopanswerlines
+
+test test test test test test test \startanswerlines
+[n=3,alternative=1] What A Junk Answer \stopanswerlines
+
+test test test test test test test \startanswerlines
+[n=3,alternative=2] What A Junk Answer \stopanswerlines
+
+\startitemize[paragraph]
+\item \startanswerlines [option=seried,n=2] xxx \stopanswerlines
+\stopitemize
+
+test test test \answerspace [m=10] {Whow}. test test test
+test tets test test \answerspace [m=10] {Whow}. test test
+test test tets test test \answerspace [m=10] {Whow}. test
+test test test tets test test \answerspace [m=10] {Whow}.
+test test test test test test \answerspace [m=*] {Whow.}
+
+test test test test test test test \startanswerlines
+[m=2] What A Junk Answer \stopanswerlines
+
+test test test test test test test \startanswerlines
+[m=2,alternative=0] What A Junk Answer \stopanswerlines
+
+test test test test test test test \startanswerlines
+[m=2,alternative=1] What A Junk Answer \stopanswerlines
+
+test test test test test test test \startanswerlines
+[m=2,alternative=2] What A Junk Answer \stopanswerlines
+
+\startitemize[paragraph]
+\item \startanswerlines [option=seried,m=2] xxx \stopanswerlines
+\stopitemize
+
+\stoptext
diff --git a/tex/context/base/m-format.tex b/tex/context/base/m-format.tex
new file mode 100644
index 000000000..0f274b236
--- /dev/null
+++ b/tex/context/base/m-format.tex
@@ -0,0 +1,409 @@
+%D \module
+%D [ file=m-formay,
+%D version=ancient,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Ancient Formatting Code,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Here is some code that I had laying around and had forgotten
+%D about. Let's make it a module and see if there is interest in
+%D such things.
+
+% \defineformatblock [poem]
+% \defineformatsegment [verse] % [poem]
+% \defineformatline [line] % [verse]
+%
+% \startpoem [title] [author]
+% \startverse [ref]
+% \startline [ref]
+%
+% block : voor na tussen *tekstletter *tekstkleur
+%
+% segment : voor na tussen *tekstletter *tekstkleur
+% : links rechts linkeroffset rechteroffset
+% : ?marge *evenmarge *onevenmarge breedte
+% : nummer *nummercommando *conversie
+% : nummerletter nummerkleur *label
+%
+% line : voor na tussen *tekstletter *tekstkleur
+% : nummer *nummercommando *conversie
+% : nummerletter nummerkleur *label
+%
+% * = todo
+
+\unprotect
+
+\definesystemvariable {fx} % format block
+\definesystemvariable {fy} % format segment
+\definesystemvariable {fz} % format line
+
+\def\defineformatblock
+ {\dodoubleempty\dodefineformatblock}
+
+\def\dodefineformatblock[#1][#2]%
+ {\setupformatblock
+ [#1]
+ [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
+ \c!textstyle=,\c!textcolor=,#2]%
+ \setvalue{\e!start#1}{\startformatblock[#1]}%
+ \setvalue{\e!stop #1}{\stopformatblock}}
+
+\def\setupformatblock
+ {\dodoubleempty\dosetupformatblock}
+
+\def\setupformatblock[#1]%
+ {\getparameters[\??fx#1]}
+
+\def\startformatblock[#1]%
+ {\dotriplegroupempty\dostartformatblock{#1}}
+
+\def\dostartformatblock#1#2#3
+ {\bgroup
+ \getvalue{\??fx#1\c!before}
+ \doglobal\newcounter\formatsegmentcounter
+ \doglobal\newcounter\formatlinecounter
+ \doglobal\newcounter\formatlinesubcounter
+ \doglobal\newcounter\formatlinemaxcounter
+ \doifsomething{#2}{\leftaligned{#2}\getvalue{\??fx#1\c!inbetween}}
+ \def\stopformatblock%
+ {\doifsomething{#3}{\getvalue{\??fx#1\c!inbetween}\leftaligned{#3}}
+ \getvalue{\??fx#1\c!after}
+ \egroup}}
+
+\def\defineformatsegment
+ {\dodoubleempty\dodefineformatsegment}
+
+\def\dodefineformatsegment[#1][#2]%
+ {\setupformatsegment
+ [#1]
+ [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
+ \c!textstyle=,\c!textcolor=,\c!left=,\c!right=,
+ \c!leftoffset=\!!zeropoint,\c!rightoffset=\!!zeropoint,
+ %\c!margin=\!!zeropoint,\c!evenmargin=\!!zeropoint,\c!oddmargin=\hsize,
+ \c!width=\hsize,\c!numberstyle=,\c!numbercolor=,\c!number=\v!no,
+ \c!numbercommand=,\c!conversion=,\c!label=,
+ #2]%
+ \setvalue{\e!start#1}{\startformatsegment[#1]}%
+ \setvalue{\e!stop #1}{\stopformatsegment}}
+
+\def\setupformatsegment
+ {\dodoubleempty\dosetupformatsegment}
+
+\def\setupformatsegment[#1]%
+ {\getparameters[\??fy#1]}
+
+\def\placeformatsegmentcounter
+ {\formatsegmentcounter\quad\hphantom{\placeformatlinecounter}}
+
+\def\placeformatlinecounter
+ {\formatlinecounter}
+
+\def\startformatsegment[#1]%
+ {\bgroup
+ \doifelsevalue{\??fy#1\c!number}\v!yes
+ {\def\doplaceformatsegmentcounter
+ {\inleftmargin
+ {\doattributes{\??fy#1}\c!numberstyle\c!numbercolor
+ {\placeformatsegmentcounter}}}}
+ {\let\doplaceformatsegmentcounter\relax}%
+ \getvalue{\??fy#1\c!before}
+ \doglobal\increment\formatsegmentcounter
+ \def\formatrightoffset{\getvalue{\??fy#1\c!rightoffset}}
+ \def\formatleftoffset {\getvalue{\??fy#1\c!leftoffset}}
+ \def\formatminwidth {\getvalue{\??fy#1\c!minwidth}}
+ \def\formatwidth {\getvalue{\??fy#1\c!width}}
+ %\def\formatmargin {\getvalue{\??fy#1\c!margin}}
+ \def\formatbefore {\getvalue{\??fy#1\c!before}}
+ \def\formatinbetween {\getvalue{\??fy#1\c!inbetween}}
+ \def\formatafter {\getvalue{\??fy#1\c!after}}
+ \def\formatleft {\getvalue{\??fy#1\c!left}}
+ \def\formatright {\getvalue{\??fy#1\c!right}}
+ \@@segmentvarianta
+ \getvalue{@@segmentvariant\getvalue{\??fy#1\c!alternative}}
+ \def\stopformatsegment
+ {\getvalue{\??fy#1\c!after}
+ \egroup}}
+
+\newif\iftraceformatblock
+
+\def\@@segmentvarianta % ragged right, symbols
+ {\let\formatraggedness\raggedright
+ \let\dostartformatline\dostartformatlineab
+ \let\formatleftfirst\relax \let\formatrightfirst\hfill
+ \let\formatleftnext \hfill \let\formatrightnext \relax}
+
+\def\@@segmentvariantb % ragged right, equal parts, symbols
+ {\let\formatraggedness\raggedcenter
+ \let\dostartformatline\dostartformatlineab
+ \let\formatleftfirst\relax \let\formatrightfirst\hfill
+ \let\formatleftnext \hfill \let\formatrightnext \relax}
+
+\def\@@segmentvariantc % ragged right
+ {\let\formatraggedness\veryraggedright
+ \let\dostartformatline\dostartformatlinecde
+ \let\formatleftnext\relax \let\formatrightnext\hfill}
+
+\def\@@segmentvariantd % ragged center
+ {\let\formatraggedness\veryraggedcenter
+ \let\dostartformatline\dostartformatlinecde
+ \let\formatleftnext\hfill \let\formatrightnext\hfill}
+
+\def\@@segmentvariante % ragged left
+ {\let\formatraggedness\veryraggedleft
+ \let\dostartformatline\dostartformatlinecde
+ \let\formatleftnext\hfill \let\formatrightnext\relax}
+
+\def\defineformatline
+ {\dodoubleempty\dodefineformatline}
+
+\def\dodefineformatline[#1][#2]%
+ {\setupformatline
+ [#1]
+ [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
+ \c!textstyle=,\c!textcolor=,
+ \c!number=\v!no,\c!numbercommand=,\c!conversion=,
+ \c!numberstyle=,\c!numbercolor=,\c!label=,
+ #2]%
+ \setvalue{\e!start#1}{\startformatline[#1]}%
+ \setvalue{\e!stop #1}{\stopformatline}}
+
+\def\setupformatline
+ {\dodoubleempty\dosetupformatline}
+
+\def\setupformatline[#1]%
+ {\getparameters[\??fz#1]}
+
+\newconditional\formatforcedbreak
+
+\def\startformatline[#1]%
+ {\bgroup
+ \doifelsevalue{\??fz#1\c!number}\v!yes
+ {\def\doplaceformatlinecounter
+ {\inleftmargin
+ {\doattributes{\??fz#1}\c!numberstyle\c!numbercolor
+ {\placeformatlinecounter}}}}
+ {\let\doplaceformatlinecounter\relax}%
+ \global\setfalse\formatforcedbreak
+ \def\\{\break\global\settrue\formatforcedbreak}%
+ \hsize\formatwidth
+ \doglobal\increment\formatlinecounter
+ \par
+ \nobreak
+ \def\stopformatline
+ {\unskip\unskip\unskip\unskip\unskip\egroup
+ \let\doplaceformatsegmentcounter\relax}
+ \postponenotes
+ \dowithnextbox{\dostartformatline}\hbox\bgroup\ignorespaces}
+
+\def\dostartformatlineab
+ {%\dosetleftskipadaption\formatmargin
+ %\advance\hsize-\leftskipadaption\relax
+ \ifdim\nextboxwd>\hsize
+ \beginofshapebox
+ \forgetall
+ \hangafter\plusone
+ \hangindent\formatleftoffset
+ \formatraggedness
+ \hskip\formatrightoffset
+ \unhbox\nextbox\par
+ \endofshapebox
+ %\advance\hsize \leftskipadaption
+ \doglobal\newcounter\formatlinesubcounter
+ \reshapebox
+ {\doglobal\increment\formatlinesubcounter}
+ \global\let\formatlinemaxcounter\formatlinesubcounter
+ \reshapebox
+ {\doglobal\decrement\formatlinesubcounter
+ \ifnum\formatlinesubcounter=\zerocount
+ \doplaceformatsegmentcounter
+ \doplaceformatlinecounter
+ \hskip-\formatrightoffset
+ %\hskip\leftskipadaption
+ \formatleftfirst
+ \unhbox\shapebox
+ \ifnum\formatlinemaxcounter>\plusone
+ \ifx\formatright\empty\else
+ \shapedhbox to \zeropoint{\formatright\hss}%
+ \fi
+ \fi
+ \formatrightfirst
+ \iftraceformatblock
+ \ruledhskip\formatrightoffset\hskip-\formatrightoffset
+ \fi
+ \else
+ %\hskip\leftskipadaption
+ \iftraceformatblock
+ \ruledhskip\formatleftoffset\hskip-\formatleftoffset
+ \fi
+ \formatleftnext
+ \ifx\formatleft\empty\else
+ \shapedhbox to \zeropoint{\hss\formatleft}%
+ \fi
+ \unhbox\shapebox
+ \formatrightnext
+ \fi}
+ \flushshapebox
+ \else
+ \dontleavehmode\hbox
+ {\doplaceformatsegmentcounter
+ \doplaceformatlinecounter
+ %\hskip\leftskipadaption
+ \formatleftfirst
+ \unhbox\nextbox
+ \formatrightfirst}
+ \fi
+ \par
+ \egroup}
+
+\def\dostartformatlinecde
+ {%\dosetleftskipadaption\formatmargin
+ %\advance\hsize -\leftskipadaption\relax
+ \dimen0=\hsize
+ \ifconditional\formatforcedbreak\else
+ \ifdim\formatminwidth>\zeropoint\relax
+ \ifdim\nextboxwd>\hsize
+ \doloop
+ {\global\dimen1=\dimen0
+ \beginofshapebox
+ \hsize\dimen0
+ \forgetall
+ \formatraggedness
+ \unhcopy\nextbox\par
+ \endofshapebox
+ \reshapebox
+ {\setbox\scratchbox=\hbox{\unhbox\shapebox}%
+ \ifdim\wd\scratchbox<\dimen1
+ \global\dimen1=\wd\scratchbox
+ \fi}
+ \ifdim\dimen1<\formatminwidth\relax
+ \advance\dimen0 by -.25em
+ \else
+ \exitloop
+ \fi
+ \ifdim\dimen0<10em
+ \dimen0=\hsize
+ \exitloop
+ \fi}
+ \fi
+ \fi
+ \fi
+ \beginofshapebox
+ \hsize\dimen0
+ \forgetall
+ \formatraggedness
+ \unhcopy\nextbox\par
+ \endofshapebox
+ %\advance\hsize \leftskipadaption
+ \doglobal\newcounter\formatlinesubcounter
+ \reshapebox
+ {\doglobal\increment\formatlinesubcounter}%
+ \global\let\formatlinemaxcounter\formatlinesubcounter
+ \reshapebox
+ {\doglobal\decrement\formatlinesubcounter
+ \ifnum\formatlinesubcounter=\zerocount
+ \doplaceformatsegmentcounter
+ \doplaceformatlinecounter
+ \fi
+ %\hskip\leftskipadaption
+ \formatleftnext
+ \unhbox\shapebox
+ \formatrightnext\strut}% strut prevents unskip
+ \flushshapebox
+ \par
+ \egroup}
+
+\defineformatblock[poem]
+ [\c!before=\blank,
+ \c!inbetween={\blank[\v!medium]},
+ \c!after=\blank]
+
+\defineformatsegment[verse]
+ [\c!alternative=\v!left,
+ \c!width=\hsize,
+ %\c!margin=\!!zeropoint,
+ \c!before={\blank[\v!medium]},
+ \c!after={\blank[\v!medium]},
+ \c!inbetween={\blank[\v!medium]},
+ \c!leftoffset=3em,
+ \c!rightoffset=2em,
+ \c!minwidth=5em,
+ \c!left={$[$\enspace},
+ \c!right={\enspace$]$}]
+
+\defineformatline[line]
+ []
+
+\protect \doifnotmode{demo} {\endinput}
+
+% evt defineblank[formatbefore,formatinbetween,formatafter]
+
+%\showframe \traceformatblocktrue
+
+\usemodule[visual]
+
+\setuplayout[height=middle,topspace=1cm,header=0pt,footer=0pt]
+\setupbodyfont[10pt]
+
+% All interfaces supported, but testing with english; todo:
+% more options, more alternatives, inheritance and mixed
+% definitions, and so.
+
+\starttext
+
+\startbuffer
+\startbuffer[poem]
+\startpoem{A Random Poem}{Hans Hagen}
+ \startverse
+ \startline \fakewords{4}{8} \stopline
+ \startline \fakewords{4}{8} \stopline
+ \startline \fakewords{4}{8} \stopline
+ \startline \fakewords{4}{8} \stopline
+ \stopverse
+ \startverse
+ \startline \fakewords{4}{8} \stopline
+ \startline \fakewords{4}{8} \stopline
+ \startline \fakewords{4}{8} \stopline
+ \startline \fakewords{4}{8} \stopline
+ \stopverse
+\stoppoem
+\stopbuffer
+
+\setupformatsegment[verse][width=.4\hsize,number=yes,numberstyle=slanted]
+\setupformatline [line] [number=yes,numberstyle=smallslanted]
+
+\startbuffer[x]
+\setupformatsegment[verse][leftoffset=0pt,rightoffset=0pt,left=,right=]
+\stopbuffer
+
+\section{Alternative A}
+
+\setupformatsegment[verse][alternative=a] {\getbuffer[poem]}
+\setupformatsegment[verse][alternative=a] {\getbuffer[x,poem]}
+
+\section{Alternative B}
+
+\setupformatsegment[verse][alternative=b] {\getbuffer[poem]}
+\setupformatsegment[verse][alternative=b] {\getbuffer[x,poem]}
+
+\section{Alternative C}
+
+\setupformatsegment[verse][alternative=c] {\getbuffer[poem]}
+
+\section{Alternative D}
+
+\setupformatsegment[verse][alternative=d] {\getbuffer[poem]}
+
+\section{Alternative E}
+
+\setupformatsegment[verse][alternative=e] {\getbuffer[poem]}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stoptext
diff --git a/tex/context/base/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..c92234884
--- /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
new file mode 100644
index 000000000..6f71cca3c
--- /dev/null
+++ b/tex/context/base/m-graph.tex
@@ -0,0 +1,175 @@
+%D \module
+%D [ file=m-graph,
+%D version=2000.08.06,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\METAPOST\ graph module support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{m-graph}
+
+\doifnotmode {demo} {\endinput}
+
+%D You need to have the data files in your path,
+%D otherwise the run is aborted.
+
+\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end}
+
+%D The test:
+
+\starttext
+
+\startMPpage
+draw begingraph(3in,2in);
+ gdraw "agepop91.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ gdraw "agepop91.d" plot btex$\bullet$etex;
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ gdraw "agepopm.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ setrange(origin, whatever,whatever);
+ gdraw "agepopm.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(2.3in,2in);
+ setcoords(log,log);
+ glabel.lft(btex Seconds etex,OUT);
+ glabel.bot(btex Matrix size etex,
+ OUT);
+ gdraw "matmul.d" dashed evenly;
+ glabel.ulft(btex Standard etex,8);
+ gdraw "matmul.d";
+ glabel.lrt(btex Strassen etex,7);
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(6.5cm,4.5cm);
+ setrange(80,0, 90,whatever);
+ glabel.bot(btex Year etex, OUT);
+ glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+ \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+ gdraw "lead.d" withpen pencircle scaled 1.5pt;
+ autogrid(,otick.lft);
+ setcoords(linear,linear);
+ setrange(80,0, 90,whatever);
+ glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+ \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+ gdraw "lead.d";
+ autogrid(otick.bot,otick.rt);
+ endgraph;
+\stopMPpage
+
+\stoptext
+
+% No longer needed, since John will fix it.
+%
+% %D For the moment we need the following patch. Adam T. Lindsay
+% %D found out that the following code produced an error:
+% %D
+% %D \starttyping
+% %D \startMPcode
+% %D draw begingraph(130mm,35mm);
+% %D setrange(0,0,10,22000);
+% %D glabel.lft(btex {correct 0--22000} etex rotated 90, OUT);
+% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
+% %D endgraph;
+% %D \stopMPcode
+% %D
+% %D \startMPcode
+% %D draw begingraph(130mm,35mm);
+% %D setrange(0,50,10,22000);
+% %D glabel.lft(btex {wrong 50--22000} etex rotated 90, OUT);
+% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
+% %D endgraph;
+% %D \stopMPcode
+% %D
+% %D \startMPcode
+% %D draw begingraph(130mm,35mm);
+% %D setrange(0,110,10,30000);
+% %D glabel.lft(btex {failed 110--22000} etex rotated 90, OUT);
+% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
+% %D endgraph;
+% %D \stopMPcode
+% %D \stoptyping
+% %D
+% %D The bug is a rather nasty one and needs some tweaking in
+% %D the low level graph code. John Hobby suggested for the
+% %D moment to initialize \type {setrange} as follows:
+% %D
+% %D \starttyping
+% %D setrange(0,0,"22000","22000")
+% %D \stoptyping
+% %D
+% %D Folowing this suggesion, I provide the following
+% %D extension:
+
+% def begingraph(expr w, h) =
+% begingroup
+% save X_, Y_, Gfin_, Gcur_, Gcbb_, Gneedgr_, Gneedfr_, Gdidsc_;
+% save Gdpic_, Gppic_, Ggl_, Garw_;
+% picture Gfin_, Gcur_, Gcbb_, Gdpic_, Gppic_, Ggl_[];
+% boolean Gneedgr_, Gneedfr_, Gdidsc_;
+% Gfin_ = nullpicture;
+% Gcur_ = nullpicture;
+% Gcbb_ = nullpicture;
+% X_.ctyp = Y_.ctyp = linear;
+% Z_.gdim = (w,h);
+% X_.sc = Y_.sc = 0;
+% Gneedgr_ = true;
+% Gneedfr_ = true;
+% Gdidsc_ = false;
+% Gdpic_ = nullpicture;
+% Garw_ = 0;
+% scantokens everybegingraph ;
+% enddef;
+%
+% boolean fixsetrange ; fixsetrange := true ;
+%
+% vardef dosetrange(text t) =
+% interim warningcheck:=0;
+% save r_; r_=0;
+% string r_[]s;
+% for x_=
+% for p_=t: if pair p_: xpart p_, ypart fi p_, endfor:
+% r_[incr r_] if string x_: s fi = x_;
+% if r_>2:
+% Gsetr_ if r_=3: X_(Gxcvlin_) else: Y_(Gycvlin_) fi(
+% r_[r_-2] if unknown r_[r_-2]: s fi, x_);
+% fi
+% exitif r_=4;
+% endfor
+% enddef;
+%
+% vardef setrange(text t) =
+% if fixsetrange : dosetrange(0,0,20000,20000) ; fi ;
+% dosetrange(t) ;
+% enddef ;
+%
+% if unknown everybegingraph :
+% string everybegingraph ;
+% % everybegingraph := "setrange(0,0,20000,20000)" ;
+% fi ;
diff --git a/tex/context/base/m-layout.tex b/tex/context/base/m-layout.tex
new file mode 100644
index 000000000..0ee71da47
--- /dev/null
+++ b/tex/context/base/m-layout.tex
@@ -0,0 +1,102 @@
+%D \module
+%D [ file=m-layout,
+%D version=2004.01.16,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Additional Layouts,
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA ADE/ Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% layout-preset - thf th tf
+
+%D This is a preliminary module, don't depend on these dimensions yet.
+
+\readsysfile{lang-frq}\donothing\donothing
+\readsysfile{lang-frd}\donothing\donothing
+
+\unprotect
+
+% \def\layouthwratio{\withoutpt\the\dimexpr8\paperheight/\dimexpr(\paperwidth/ 8192)\relax}
+% \def\layouthwratio{\withoutpt\the\dimexpr4\paperheight/\dimexpr(\paperwidth/16384)\relax}
+% \def\layouthwratio{\withoutpt\the\dimexpr2\paperheight/\dimexpr(\paperwidth/32768)\relax}
+
+\def\layouthwratio
+ {\withoutpt\the\dimexpr2\paperheight/(\paperwidth/32768)\relax}
+
+\def\layouthfheight
+ {\dimexpr\layoutparameter\c!header+\layoutparameter\c!headerdistance+
+ \layoutparameter\c!footer+\layoutparameter\c!footerdistance\relax}
+
+\startsetups[preset-1]
+
+ \xdef\layoutwidth {\dimexpr\layoutparameter\c!width\relax}
+ \gdef\layoutheight{\dimexpr\layouthwratio\dimexpr\layoutwidth\relax+\layouthfheight\relax}
+
+\stopsetups
+
+\definelayout
+ [preset-1-1]
+ [\c!preset=preset-1,
+ \c!backspace=\dimexpr(\paperwidth-\layoutwidth)/2\relax,
+ \c!width=\dimexpr2\paperwidth/3\relax,
+ \c!cutspace=\dimexpr(\paperwidth-\layoutwidth)/2\relax,
+ \c!margin=\dimexpr(\paperwidth-\layoutwidth)/3\relax,
+ \c!header=2\lineheight,
+ \c!headerdistance=\lineheight,
+ \c!height=\v!middle, % \layoutheight
+ \c!footerdistance=\layoutparameter\c!headerdistance, % \lineheight,
+ \c!footer=\layoutparameter\c!header, % 2\lineheight,
+ \c!topspace=\dimexpr1\dimexpr\paperheight-(\layoutheight+\layouthfheight)\relax/3\relax,
+ \c!bottomspace=\dimexpr2\dimexpr\paperheight-(\layoutheight+\layouthfheight)\relax/3\relax]
+
+\startsetups[preset-2]
+
+ \gdef\layouthstep{\dimexpr\paperwidth /\layoutparameter\c!columns\relax}
+ \gdef\layoutvstep{\dimexpr\paperheight/\layoutparameter\c!columns\relax}
+
+\stopsetups
+
+\definelayout
+ [preset-2-1]
+ [\c!preset=preset-2,
+ \c!columns=12,
+ \c!backspace=\layouthstep,
+ \c!width=\v!middle,
+ \c!cutspace=2\layouthstep,
+ \c!margin=\layouthstep,
+ \c!header=2\lineheight,
+ \c!headerdistance=\lineheight,
+ \c!height=\v!middle, % \layoutheight
+ \c!footerdistance=\layoutparameter\c!headerdistance,
+ \c!footer=\layoutparameter\c!header,
+ \c!topspace=\dimexpr\layoutvstep-\layoutparameter\c!header-\layoutparameter\c!headerdistance\relax,
+ \c!bottomspace=\dimexpr(2\layoutvstep)-\layoutparameter\c!header-\layoutparameter\c!headerdistance\relax]
+
+\definelayout
+ [preset-2-2]
+ [\c!preset=preset-2,
+ \c!columns=12,
+ \c!backspace=\layouthstep,
+ \c!width=\v!middle,
+ \c!cutspace=2\layouthstep,
+ \c!margin=\layouthstep,
+ \c!header=2\lineheight,
+ \c!headerdistance=\lineheight,
+ \c!height=\v!middle, % \layoutheight
+ \c!footerdistance=\layoutparameter\c!headerdistance,
+ \c!footer=\layoutparameter\c!header,
+ \c!topspace=\layoutvstep,
+ \c!bottomspace=\layoutvstep] % maybe 1.5
+
+% \setuplayout[preset-1-1] test \showframe \page
+% \setuplayout[preset-1-1][width=65\averagecharwidth] \setuplayout[preset-1-1] test \showframe \page
+% \setuplayout[preset-2-1] test \showframe \page
+% \setuplayout[preset-2-1][columns=10] \setuplayout[preset-2-1] test \showframe \page
+% \setuplayout[preset-2-2] test \showframe \page
+% \setuplayout[preset-2-2][columns=10] \setuplayout[preset-2-2] test \showframe \page
+
+\protect \endinput
diff --git a/tex/context/base/m-level.tex b/tex/context/base/m-level.tex
new file mode 100644
index 000000000..67d598733
--- /dev/null
+++ b/tex/context/base/m-level.tex
@@ -0,0 +1,94 @@
+%D \module
+%D [ file=level,
+%D version=2002.10.20,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Catching Nesting Errors,
+%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.
+
+\unprotect
+
+\newcount\currentnesting
+
+\def\startnesting#1%
+ {\global\advance\currentnesting\plusone
+ \setxvalue{level::\number\currentnesting}{#1}}
+
+\def\stopnesting#1%
+ {\edef\nestingstring{#1}%
+ \relax\ifnum\currentnesting>\zerocount
+ \doifelsevalue{level::\number\currentnesting}\nestingstring
+ {\global\advance\currentnesting\minusone}
+ {\@EA\reportnestingerror\@EA\stoptext}
+ \else
+ \@EA\reportnestingerror\@EA\stoptext
+ \fi}
+
+\def\checknesting
+ {\relax\ifnum\currentnesting>\zerocount
+ \def\nestingstring{end of document}%
+ \@EA\reportnestingerror
+ \fi}
+
+\def\reportnestingerror
+ {\endgraf
+ \global\let\checknesting\relax
+ \bgroup \definedfont[Mono at 18pt]\incolortrue
+ \setupinterlinespace
+ \raggedright
+ \bgroup \red
+ \ifnum\currentnesting>\plusone
+ wrong end level
+ \else
+ too many end levels
+ \fi
+ at \nestingstring\space in line \number\inputlineno
+ \ifnum\currentnesting>\zerocount, stack:\fi\endgraf
+ \egroup
+ \dostepwiserecurse\currentnesting\plusone\minusone
+ {\space\getvalue{level::\recurselevel}}
+ \endgraf
+ \egroup
+ \writestatus\m!systems{quitting due to level error}\wait
+ \batchmode}
+
+\prependtoks
+ \checknesting
+\to \everystoptext
+
+\protect \doifnotmode{demo}{\endinput}
+
+\starttext
+
+% \startnesting{eerste}
+% \startnesting{tweede}
+% \startnesting{derde}
+% \startnesting{vierde}
+% test
+% \stopnesting{vierde}
+% \stopnesting{eerste}
+
+% \startnesting{eerste}
+% \startnesting{tweede}
+% test
+% \stopnesting{vierde}
+% \stopnesting{derde}
+% \stopnesting{tweede}
+% \stopnesting{eerste}
+
+\startnesting{eerste}
+ \startnesting{tweede}
+ \startnesting{derde}
+ \startnesting{vierde}
+ test
+ \stopnesting{vierde}
+ \stopnesting{derde}
+ \stopnesting{tweede}
+\stopnesting{eerste}
+
+\stoptext
diff --git a/tex/context/base/m-mkii.mkiv b/tex/context/base/m-mkii.mkiv
new file mode 100644
index 000000000..cb0da6fcb
--- /dev/null
+++ b/tex/context/base/m-mkii.mkiv
@@ -0,0 +1,21 @@
+% todo
+
+\unprotect
+
+\writestatus\m!systems{loading some mkii compatibility hacks}
+
+% Compatibility for font-ini
+
+\let\normalxi=\xi
+
+\definebodyfontswitch [xii] [\!!twelvepoint]
+\definebodyfontswitch [xi] [\!!elevenpoint]
+\definebodyfontswitch [x] [\!!tenpoint]
+\definebodyfontswitch [ix] [\!!ninepoint]
+\definebodyfontswitch [viii] [\!!eightpoint]
+\definebodyfontswitch [vii] [\!!sevenpoint]
+\definebodyfontswitch [vi] [\!!sixpoint]
+
+\unexpanded\def\xi{\ifmmode\normalxi\else\elevenpoint\fi}
+
+\protect \endinput
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-narrowtt.tex b/tex/context/base/m-narrowtt.tex
new file mode 100644
index 000000000..2e11b99ad
--- /dev/null
+++ b/tex/context/base/m-narrowtt.tex
@@ -0,0 +1,39 @@
+%D \module
+%D [ file=m-narrowtt,
+%D version=2005.09.08,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Narrow Verbatim,
+%D author={Hans Hagen \& Ton Otten},
+%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 Test file
+%D
+%D \starttyping
+%D \startTEX
+%D \usemodule[narrowtt]
+%D \starttext
+%D \starttyping
+%D Test test test.
+%D \stoptyping
+%D test \type {test} test \type{test} test
+%D \starttyping
+%D Test test test.
+%D \stoptyping
+%D \stoptext
+%D \stopTEX
+
+\unprotect
+
+\definetypeface
+ [narrowtt] [tt]
+ [mono] [modern-condensed] [default] [encoding=\defaultencoding]
+
+\definetyping[n\v!typing] \setuptyping[n\v!typing][style=\narrowtt]
+\definetype [n\v!type] \setuptype [n\v!type] [style=\narrowtt]
+
+\protect \endinput
diff --git a/tex/context/base/m-newmat.tex b/tex/context/base/m-newmat.tex
new file mode 100644
index 000000000..08ce33b4c
--- /dev/null
+++ b/tex/context/base/m-newmat.tex
@@ -0,0 +1,337 @@
+%D \module
+%D [ file=m-newmat,
+%D version=2000.11.16,
+%D title=\CONTEXT\ Math Module,
+%D subtitle=AMS-like math extensions,
+%D author={Taco Hoekwater \& Hans Hagen},
+%D date=\currentdate,
+%D copyright={PRAGMA / Taco Hoekwater}]
+%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.
+
+%D This module collects macros that \TEX\ users kind of expect
+%D to be available when typesetting math. Most of them
+%D originate in the \AMS\ macro packages. We have taken the
+%D freedom to adapt them to \CONTEXT. This module is derived
+%D from the \type {m-math} module by Taco Hoekwater (partially
+%D derived from AMS math modules) and adapted|/|extended by
+%D Hans Hagen.
+
+%D Here we will add code on demand. So, just let us know what
+%D should go in here.
+
+%M \usemodule[newmat]
+
+\unprotect
+
+%D \macros
+%D {qedsymbol}
+%D
+%D [HH] The general Quod Erat Domonstrandum symbol is defined
+%D in such a way that we can configure it. Because this symbol
+%D is also used in text mode, we make it a normal text symbol
+%D with special behavior.
+
+\def\qedsymbol#1%
+ {\ifhmode
+ \unskip~\hfill#1\par
+ \else\ifmmode
+ \eqno#1\relax % Do we really need the \eqno here?
+ \else
+ \leavevmode\hbox{}\hfill#1\par
+ \fi\fi}
+
+\definesymbol [qed] [\qedsymbol{\mathematics{\square}}]
+
+%D \macros
+%D {QED}
+%D
+%D [HH] For compatbility reasons we also provide the \type
+%D {\QED} command. In case this command is overloaded, we still
+%D have the symbol available. \symbol[qed]
+
+\def\QED{\symbol[qed]}
+
+%D \macros
+%D {genfrac}
+%D
+%D [TH] The definition of \type {\genfrac} \& co. is not
+%D trivial, because it allows some flexibility. This is
+%D supposed to be a user||level command, but will fail quite
+%D desparately if called outside math mode (\CONTEXT\ redefines
+%D \type {\over})
+%D
+%D [HH] We clean up this macro a bit and (try) to make it
+%D understandable. The expansion is needed for generating
+%D the second argument to \type {\dogenfrac}, which is to
+%D be a control sequence like \type {\over}.
+
+\unexpanded\def\genfrac#1#2#3#4%
+ {\edef\!!stringa
+ {#1#2}%
+ \expanded
+ {\dogenfrac{#4}%
+ \csname
+ \ifx @#3@%
+ \ifx\!!stringa\empty
+ \strippedcsname\normalover
+ \else
+ \strippedcsname\normaloverwithdelims
+ \fi
+ \else
+ \ifx\!!stringa\empty
+ \strippedcsname\normalabove
+ \else
+ \strippedcsname\normalabovewithdelims
+ \fi
+ \fi
+ \endcsname}%
+ {#1#2#3}}
+
+\def\dogenfrac#1#2#3#4#5%
+ {{#1{\begingroup#4\endgroup#2#3\relax#5}}}
+
+%D \macros
+%D {dfrac, tfrac, frac, dbinom, tbinom, binom}
+%D
+%D [TH] No need to make these \type {\unexpanded} as well.
+
+%\def\dfrac {\genfrac\empty\empty\empty\displaystyle}
+%\def\tfrac {\genfrac\empty\empty\empty\textstyle}
+%\def\frac {\genfrac\empty\empty\empty\donothing}
+
+\def\dfrac {\genfrac\empty\empty{}\displaystyle}
+\def\tfrac {\genfrac\empty\empty{}\textstyle}
+\def\frac {\genfrac\empty\empty{}\donothing}
+
+\def\dbinom{\genfrac()\zeropoint\displaystyle}
+\def\tbinom{\genfrac()\zeropoint\textstyle}
+\def\binom {\genfrac()\zeropoint\donothing}
+
+\def\xfrac {\genfrac\empty\empty{}\scriptstyle}
+\def\xxfrac{\genfrac\empty\empty{}\scriptscriptstyle}
+
+%D Better:
+
+\unexpanded\def\frac#1#2{\mathematics{\genfrac\empty\empty{}\donothing{#1}{#2}}}
+
+%D [HH] This shows up as:
+%D
+%D \startbuffer
+%D $\dfrac {1}{2} \tfrac {1}{2} \frac {1}{2}$
+%D $\dbinom{1}{2} \tbinom{1}{2} \binom{1}{2}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+%D \macros
+%D {text}
+%D
+%D [TH] \type {\text} is a command to typeset more or less
+%D ordinary text inside of super- and sub|-|scripts. It has to
+%D do a full font switch to get the sides right, so it will be
+%D quite slow. \type {\text} kind of replaces \CONTEXT's \type
+%D {\mathstyle} command.
+
+%D [HH] This macro is now also moved to the core, but we
+%D keep it here as well for completeness.
+%D
+%D \starttyping
+%D \unexpanded\def\mathtext
+%D {\mathortext\domathtext\hbox} % {\ifmmode\@EA\dotext\else\@EA\hbox\fi}
+%D
+%D \def\domathtext#1%
+%D {\mathchoice
+%D {\dodomathtext\displaystyle\textface {#1}}%
+%D {\dodomathtext\textstyle \textface {#1}}%
+%D {\dodomathtext\textstyle \scriptface {#1}}%
+%D {\dodomathtext\textstyle \scriptscriptface{#1}}}
+%D
+%D \def\dodomathtext#1#2#3% no \everymath !
+%D %{\hbox{\everymath{#1}\switchtobodyfont [#2]#3}} % 15 sec
+%D {\hbox{\everymath{#1}\setcurrentfontbody{#2}#3}} % 3 sec (no math)
+%D \stoptyping
+
+%D [HH] We use the following indirectness because \type {\text}
+%D is a natural candidate for user macros (actually, it is
+%D used in some modules).
+%D
+%D \starttyping
+%D \let\text\mathtext
+%D \stoptyping
+
+%D [HH] Actually, the font switch is not that slow when
+%D typefaces are used. If needed this macro can be sped up.
+%D
+%D \startbuffer
+%D ordinary text $x^{\text{extra ordinary text}}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+%D \macros
+%D {mathhexbox}
+%D
+%D [TH] \type {\mathhexbox} is also user||level (already
+%D defined in Plain \TEX). It allows to get a math character
+%D inserted as if it was a text character.
+
+\gdef\mathhexbox#1#2#3{\mathtext{$\mathsurround\zeropoint\mathchar"#1#2#3$}}
+
+%D \macros
+%D {boxed}
+%D
+%D [HH] Another macro that users expect (slightly adapted):
+
+\def\boxed
+ {\ifmmode\expandafter\mframed\else\expandafter\framed\fi}
+
+%D \macros
+%D {cfrac}
+%D
+%D [HH] Now let us see what this one does:
+%D
+%D \startbuffer
+%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
+%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+\definecomplexorsimple\cfrac
+
+\def\simplecfrac
+ {\complexcfrac[c]}
+
+\def\complexcfrac[#1]#2#3%
+ {{\displaystyle
+ \frac
+ {\strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}%
+ {#3}}%
+ \kern-\nulldelimiterspace}
+
+%D [HH] The next alternative is nicer:
+
+\def\simplecfrac {\docfrac[cc]}
+\def\complexcfrac[#1]{\docfrac[#1cc]}
+
+\def\docfrac[#1#2#3]#4#5%
+ {{\displaystyle
+ \frac
+ {\strut
+ \ifx r#1\hfill\fi#4\ifx l#1\hfill\fi}%
+ {\ifx r#2\hfill\fi#5\ifx l#2\hfill\fi}%
+ \kern-\nulldelimiterspace}}
+
+%D [HH] Now we can align every combination we want:
+%D
+%D \startbuffer
+%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
+%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
+%D $\cfrac[cl]{12}{3} \cfrac[cc]{12}{3} \cfrac[cr]{12}{3}$
+%D $\cfrac[lc]{1}{23} \cfrac[cc]{1}{23} \cfrac[rc]{1}{23}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+%D \macros
+%D {splitfrac, splitdfrac}
+%D
+%D Occasionally one needs to typeset multi||line fractions.
+%D These commands use \tex{genfrac} to create such fractions.
+%D
+%D \startbuffer
+%D \startformula
+%D a=\frac{
+%D \splitfrac{xy + xy + xy + xy + xy}
+%D {+ xy + xy + xy + xy}
+%D }
+%D {z}
+%D =\frac{
+%D \splitdfrac{xy + xy + xy + xy + xy}
+%D {+ xy + xy + xy + xy}
+%D }
+%D {z}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D These macros are based on Michael J.~Downes posting on
+%D comp.text.tex on 2001/12/06
+
+\def\splitfrac#1#2%
+ {\genfrac\empty\empty\zeropoint\textstyle%
+ {\textstyle#1\quad\hfill}%
+ {\textstyle\hfill\quad\mathstrut#2}}
+
+\def\splitdfrac#1#2%
+ {\genfrac\empty\empty\zeropoint\displaystyle%
+ {#1\quad\hfill}
+ {\hfill\quad\mathstrut #2}}
+
+\protect \endinput
+
+%D \macros
+%D {startsubarray,substack,startsmallmatrix}
+%D
+%D [HH] I wonder what these are supposed to do. An example
+%D will be inserted later. Contrary to the original we
+%D support an optional argument between either \type {{}} or
+%D \type {[]}.
+
+\def\startsubarray
+ {\doifnextcharelse\bgroup
+ \simplestartsubarray{\dosingleempty\complexstartsubarray}}
+
+\def\complexstartsubarray[#1]%
+ {\simplestartsubarray{#1}}
+
+\def\simplestartsubarray#1%
+ {\vcenter\bgroup
+ \baselineskip\fontdimen10 \scriptfont\plustwo
+ \advance\baselineskip\fontdimen12 \scriptfont\plustwo
+ \lineskip\plusthree\fontdimen8 \scriptfont\plusthree
+ \lineskiplimit\lineskip
+ \ialign\bgroup\ifx c#1\hfil\fi$\mathsurround\zeropoint\scriptstyle##$\hfil\crcr}
+
+\def\stopsubarray
+ {\crcr\egroup
+ \egroup}
+
+\def\startsubstack
+ {\doifnextcharelse\bgroup
+ \simplestartsubstack{\dosingleempty\complexstartsubstack}}
+
+\def\complexstartsubstack[#1]%
+ {\simplestartsubstack{#1}}
+
+\def\simplesubstack#1%
+ {\startsubarray[c]#1\stopsubarray}
+
+\def\startsmallmatrix
+ {\null
+ \,%
+ \vcenter\bgroup
+ \baselineskip6\ex@
+ \lineskip1.5\ex@
+ \lineskiplimit\lineskip
+ \ialign\bgroup\hfil$\mathsurround\zeropoint\scriptstyle##$\hfil&&\thickspace\hfil
+ $\mathsurround\zeropoint\scriptstyle##$\hfil\crcr}
+
+\def\stopsmallmatrix
+ {\crcr\egroup
+ \egroup
+ \,}
+
+\protect \endinput
diff --git a/tex/context/base/m-obsolete.tex b/tex/context/base/m-obsolete.tex
new file mode 100644
index 000000000..a97002cf6
--- /dev/null
+++ b/tex/context/base/m-obsolete.tex
@@ -0,0 +1,5 @@
+\unprotect
+
+\writestatus\m!systems{skipping obsolete module}
+
+\protect \endinput
diff --git a/tex/context/base/m-pdfsnc.tex b/tex/context/base/m-pdfsnc.tex
new file mode 100644
index 000000000..da59ab5d8
--- /dev/null
+++ b/tex/context/base/m-pdfsnc.tex
@@ -0,0 +1,200 @@
+%D \module
+%D [ file=m-pdfsnc,
+%D version=2003.12.23,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Editor Synchronization,
+%D author={Hans Hagen \& Ton Otten},
+%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.
+
+% \enablemode[demo]
+
+% This file is a variation of the file pdfsync4context.tex that ships
+% with the pdfsync package (used by iTeXMac and TeXShop) by Piero
+% D'Ancona and Jrme Laurens. I made the macros a bit more efficient
+% and added some basic tracing options as well as a few more options.
+% I made this one while playing a bit with the Mac and TeX). Maybe I'll
+% add a bit of support to the kernel in in order to get rid of redundant
+% markers. Also, this had better be rewritten in a bit less \pdf
+% dependent way so that it can also be supported by dvipdfmx. I could
+% write a generic file as well, but since there is already support for
+% other packages I'll not do that (now).
+
+% compatible commands:
+%
+% \pdfsyncstart \pdfsyncstop \pdfsync
+%
+% extra commands:
+%
+% \enablepdfsync \disablepdfsync \pdfsynctext \pdfsyncnode \pdfsynctracemode
+
+\ifx\pdfoutput\undefined
+ \donefalse
+\else\ifcase\pdfoutput
+ \donefalse
+\else\ifx\pdfsavepos\undefined
+ \donefalse
+\else
+ \donetrue
+\fi\fi\fi
+
+\chardef \pdfsyncstate \zerocount
+\chardef \pdfsynctracemode \zerocount
+
+\ifdone
+
+ \writestatus{pdfsync}{loading and enabling synchronization support}
+
+\else
+
+ \writestatus{pdfsync}{synchronization is only available with pdftex}
+
+ \let \pdfsyncstart \relax % brr, not per se symmetrically used, so
+ \let \pdfsyncstop \relax % enable and disable are better names
+ \let \pdfsync \relax
+
+ \let \pdfsynctext \gobbleoneargument
+ \let \pdfsyncnode \gobbleoneargument
+
+ \let \enablepdfsync \pdfsyncstart
+ \let \disablepdfsync \pdfsyncstop
+
+ \expandafter\endinput
+\fi
+
+\unprotect % not really needed
+
+\newcount \pdfsynccounter
+\newwrite \pdfsyncwrite
+
+\def\pdfsyncstart{\chardef\pdfsyncstate\plusone} \let\enablepdfsync \pdfsyncstart
+\def\pdfsyncstop {\chardef\pdfsyncstate\zerocount} \let\disablepdfsync\pdfsyncstop
+
+\def\dostartpdfsync
+ {\immediate\openout\pdfsyncwrite\jobname.pdfsync
+ \immediate\write\pdfsyncwrite{\jobname}%
+ \immediate\write\pdfsyncwrite{version 0}}
+
+\def\dostoppdfsync
+ {\immediate\closeout\pdfsyncwrite}
+
+\def\doregisterpdfsyncpage
+ {\immediate\write\pdfsyncwrite{s\space\realfolio}}
+
+\def\dopdfsyncopenfile
+ {\immediate\write\pdfsyncwrite{(\space\readfilename}}
+
+\def\dopdfsyncclosefile
+ {\immediate\write\pdfsyncwrite{)}}
+
+\def\doregisterpdfsyncnode#1%
+ {\ifcase\pdfsyncstate\else
+ \pdfsavepos
+ \immediate\write\pdfsyncwrite{l\space\the\pdfsynccounter\space\the\inputlineno}%
+ \expanded{\write\pdfsyncwrite{p\ifnum#1=\plusone*\fi\space\the\pdfsynccounter\space\noexpand\the\pdflastxpos\space\noexpand\the\pdflastypos}}%
+ \global\advance\pdfsynccounter\plusone
+ \fi}
+
+\let\pdfsynctracer\gobbleoneargument
+
+\def\pdfsync {\doregisterpdfsyncnode\plusone \pdfsynctracer*}
+\def\pdfsyncnode{\doregisterpdfsyncnode\zerocount\pdfsynctracer}
+\def\pdfsynctext{\doregisterpdfsyncnode\plusone \pdfsynctracer}
+
+\appendtoks \dostartpdfsync \to \everystarttext
+%appendtoks \dostoppdfsync \to \everystoptext
+\appendtoks \doregisterpdfsyncpage \to \everyshipout
+\appendtoks \dopdfsyncopenfile \to \everybeforereadfile
+\appendtoks \dopdfsyncclosefile \to \everyafterreadfile
+
+\appendtoks \enablepdfsync \to \everystarttext
+\appendtoks \disablepdfsync \to \everypagebody
+
+% beware, adding nodes this way will interfere with the typesetting
+
+\appendtoks \pdfsyncnode p\to \everypar
+\appendtoks \pdfsyncnode m\to \everymath
+\appendtoks \pdfsyncnode h\to \everyhbox
+
+% just for fun
+
+\def\pdfsynctracer#1%
+ {\ifcase\pdfsynctracemode\else
+ \ifcase\pdfsyncstate\else
+ \begingroup
+ \forgetall
+ \disablepdfsync
+ \ifcase\pdfsynctracemode\or % could be done more efficient, box around ifcase
+ \setbox\scratchbox\hbox to \zeropoint{\hss\infofont#1\hss}% 1
+ \else
+ \setbox\scratchbox\hbox to \zeropoint{\hss\traceboxplacementtrue\boxcursor\hss}% 2/3/4
+ \fi
+ \smashbox\scratchbox\box\scratchbox
+ \ifcase\pdfsynctracemode\or\or\or
+ \setbox\scratchbox\hbox to \zeropoint{\hss\raise1.25ex\hbox{\infofont#1}\hss}% 3
+ \smashbox\scratchbox\box\scratchbox
+ \or
+ \setbox\scratchbox\hbox to \zeropoint{\hss\lower1.25ex\hbox{\infofont#1}\hss}% 4
+ \smashbox\scratchbox\box\scratchbox
+ \fi
+ \endgroup
+ \fi
+ \fi}
+
+% \def\pdfsynctracer#1% more efficient but unreadable
+% {\ifcase\pdfsynctracemode\else
+% \ifcase\pdfsyncstate\else
+% \begingroup
+% \forgetall
+% \disablepdfsync
+% \setbox\scratchbox\hbox to \zeropoint
+% {\hss
+% \ifcase\pdfsynctracemode\or
+% \infofont#1% 1
+% \else
+% \traceboxplacementtrue\boxcursor% 2/3/4
+% \fi
+% \hss}%
+% \smashbox\scratchbox\box\scratchbox
+% \setbox\scratchbox\hbox to \zeropoint
+% {\hss
+% \ifcase\pdfsynctracemode\or\or\or
+% \raise1.25ex\hbox{\infofont#1}% 3
+% \or
+% \lower1.25ex\hbox{\infofont#1}% 4
+% \fi
+% \hss}%
+% \smashbox\scratchbox\box\scratchbox
+% \endgroup
+% \fi
+% \fi}
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\chardef\pdfsynctracemode=3
+
+\starttext
+
+\chapter{Test}
+
+\processfile{tufte}
+
+\startitemize
+\item first
+\item second
+\stopitemize
+
+\processfile{tufte}
+
+\startlines
+some local \pdfsync sync and \pdfsynctext{here}a marked point
+some local \pdfsync sync and \pdfsyncnode{here}a marked point
+\stoplines
+
+\stoptext
diff --git a/tex/context/base/m-pictex.tex b/tex/context/base/m-pictex.tex
new file mode 100644
index 000000000..abb81b76e
--- /dev/null
+++ b/tex/context/base/m-pictex.tex
@@ -0,0 +1,255 @@
+%D \module
+%D [ file=m-pictex,
+%D version=1997.01.15,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PICTEX\ Loading Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module is one big hack. This hack is not needed when
+%D using \ETEX, so there we simply load \PICTEX\ and quit.
+
+%D Not every package defines \type{\fiverm}, \PICTEX's pixel,
+%D so let's take care of that omision here. The actual loading
+%D of \PICTEX\ depends on the package. For \LATEX\ users we
+%D take care of loading the auxiliary ones too.
+
+\def\loadpictex
+ {\ifx\grid\undefined \else \let\normalgrid\grid \fi
+ \ifx\axis\undefined \else \let\normalaxis\axis \fi
+ \ifx\undefined\fiverm
+ \font\fiverm=cmr5
+ \fi
+ \ifx\beginpicture\undefined
+ \ifx\newenvironment\undefined
+ \readfile{thrd-pic.tex}{}{}
+ \else
+ \input prepictex.tex \relax
+ \input pictex.tex \relax
+ \input postpictex.tex \relax
+ \fi
+ \fi
+ \ifx\normalgrid\undefined \else
+ \let\pictexgrid\grid
+ \let\grid\normalgrid
+ \fi
+ \ifx\normalaxis\undefined \else
+ \let\pictexaxis\axis
+ \let\axis\normalaxis
+ \fi}
+
+\ifx\eTeXversion\undefined \else \loadpictex \expandafter \endinput \fi
+
+%D When not in \ETEX\ and not in \CONTEXT, we load a few
+%D auxiliary macros.
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+\unprotect
+
+%D \TEX\ provides 256 \DIMENSIONS\ and 256 \SKIPS. In \CONTEXT\
+%D this is no problem, but in packages that have many
+%D authors, one can be quite sure that a lot of \DIMENSIONS\ are
+%D allocated. Packages that use \PICTEX\ can therefore run out
+%D of \DIMENSIONS\ quite fast. This module was written as a
+%D reaction to persistent problems with loading \PPCHTEX\ in
+%D \LATEX\ and \PICTEX\ deserves a solution. I therefore
+%D dedicate this module to Tobias Burnus and Dirk Kuypers, who
+%D use \PPCHTEX\ in a \LATEX\ environment and suggested a lot
+%D of extensions to the repertoire of \PPCHTEX\ commands.
+%D
+%D This module presents a solution that is quite effective: all
+%D \DIMENSIONS\ are drawn from the pool of \DIMENSIONS\ and
+%D \SKIPS, depending on the availability. This is possible
+%D because \DIMENSIONS\ are \SKIPS\ without a glue component.
+%D Therefore we can use \SKIPS\ as \DIMENSIONS. However, some
+%D incompatibility can result from assignments that look like:
+%D
+%D \starttyping
+%D \somedimen=\someskip
+%D \stoptyping
+%D
+%D In such cases the \DIMENSION\ equals the fixed part of the
+%D \SKIP\ or in other words: this assignment strips off the
+%D glue. Because \PICTEX\ uses no glue components, I thought
+%D I could interchange both register types without problems,
+%D but alas, this didn't hold for all \DIMENSIONS.
+
+%D In \PLAIN\ \TEX\ the allocation macros are defined with (as)
+%D \type{\outer}. This means that they cannot appear inside
+%D macros, not even in an indirect way. We therefore have to
+%D redefine both \type{\newdimen} and \type{\newskip} to
+%D non||\type{\outer} alternatives. In most macro packages this
+%D redefinition already took place. We save the original
+%D meanings, so we can restores them afterwards.
+
+% \def\temporarynewdimen {\alloc@1\dimen\dimendef\insc@unt}
+% \def\temporarynewskip {\alloc@2\skip \skipdef \insc@unt}
+
+\let\normalnewdimen \newdimen
+\let\normalnewskip \newskip
+
+\let\temporarynewdimen\newdimen
+\let\temporarynewskip \newskip
+
+%D Here comes the trick. Depending on how many \DIMENSIONS\ and
+%D \SKIPS\ are allocated, the \type{\newdimen} assigns a
+%D \DIMENSIONS\ or \SKIP. \PLAIN\ \TEX\ allocates 15 \DIMENSIONS\
+%D and 17 \SKIPS. After loading \PICTEX, 71 \DIMENSIONS\ and
+%D and 71 \SKIPS\ are allocated. Indeed, \PICTEX\ needs 110
+%D \DIMENSIONS !
+%D
+%D \starttyping
+%D \def\newdimen
+%D {\ifnum\count11>\count12
+%D \let\next\temporarynewskip
+%D \else
+%D \let\next\temporarynewdimen
+%D \fi
+%D \next}
+%D \stoptyping
+%D
+%D When I was testing a new version of \PPCHTEX\ in \PLAIN\
+%D \TEX\ I had to find out that this exchange of registers
+%D sometimes leads to unwanted results. It took me some hours
+%D to find out that the source of errors originated in
+%D constructions like:
+%D
+%D \starttyping
+%D \ifdim\DimenOne<\DimenTwo whatever you want \else or not \fi
+%D \stoptyping
+%D
+%D When \type{\DimenOne} is a \SKIP\ and \type{\DimenTwo} is a
+%D \DIMENSION, \TEX\ scans for some optional glue component,
+%D like in:
+%D
+%D \starttyping
+%D \skip0=\dimen0 plus 10pt minus 5pt
+%D \stoptyping
+%D
+%D The most robust solution to this problem is:
+%D
+%D \starttyping
+%D \ifdim\DimenOne<\DimenTwo\relax right \else wrong \fi
+%D \stoptyping
+%D
+%D Some close reading of the \PICTEX\ source however learned me
+%D that this problem could be solved best by just honoring the
+%D allocation of \DIMENSIONS\ when the name of the macro
+%D explictly stated the character sequence \type{dimen}. A next
+%D implementation therefore automatically declared all
+%D \DIMENSIONS\ with this sequence in their names with
+%D \type{\dimen}. Again I was too optimistic, so now we do it
+%D this way (the comments are from \PICTEX, which like \TABLE,
+%D is an example of a well documented package):
+
+\temporarynewdimen\!dimenA %.AW.X.DVEUL..OYQRST
+\temporarynewdimen\!dimenB %....X.DVEU...O.QRS.
+\temporarynewdimen\!dimenC %..W.X.DVEU......RS.
+\temporarynewdimen\!dimenD %..W.X.DVEU....Y.RS.
+\temporarynewdimen\!dimenE %..W........G..YQ.S.
+\temporarynewdimen\!dimenF %...........G..YQ.S.
+\temporarynewdimen\!dimenG %...........G..YQ.S.
+\temporarynewdimen\!dimenH %...........G..Y..S.
+\temporarynewdimen\!dimenI %...BX.........Y....
+\temporarynewdimen\!dxpos %..W......U..P....S.
+\temporarynewdimen\!dypos %..WB.....U..P......
+\temporarynewdimen\!xloc %..WB.....U.......S.
+\temporarynewdimen\!xpos %..........L.P..Q.ST
+\temporarynewdimen\!yloc %..WB.....U.......S.
+\temporarynewdimen\!ypos %..........L.P..Q.ST
+\temporarynewdimen\!zpt %.AWBX.DVEULGP.YQ.ST
+
+%D Tobias tested this module in all kind of \LATEX\ dialects
+%D so we were able to find out that we also needed to declare:
+
+\temporarynewdimen\linethickness
+
+%D After all, the new definition of \type{\newdimen} became:
+
+\def\newdimen#1%
+ {\ifx#1\undefined
+ \ifnum\count11>\count12\relax
+ \temporarynewskip#1\relax
+ \else
+ \temporarynewdimen#1\relax
+ \fi
+ %\edef\ascii{\meaning#1}%
+ %\immediate\write20{\string#1 becomes \ascii}%
+ \else
+ %\edef\ascii{\meaning#1}%
+ %\immediate\write20{\string#1 already is \ascii}%
+ \fi}
+
+% \def\newdimen#1%
+% {\bgroup
+% \escapechar=-1
+% \def\next##1##2%
+% {\def\next####1##1####2####3\next%
+% {\egroup
+% \if####2@
+% \temporarynewdimen#1\relax
+% \ifnum\count11>\count12
+% \temporarynewskip#1\relax
+% \else
+% \temporarynewdimen#1\relax
+% \fi\fi}%
+% \expandafter\next\string##2##1@@\next}%
+% \expandafter\next\expandafter{\string\dimen}#1}
+%
+% This macro is as unreadable, inefficient and as compact as
+% can be, but uses no extra hash entries, which sometimes are
+% scarce too. A more readable alternative, that also takes
+% explicit \SKIPS\ into account, is included in the source.
+%
+% \def\doifregisterpreferenceelse#1#2#3#4%
+% {\def\dodoifregisterpreferenceelse##1#1##2##3\war{\if##2@}%
+% \expandafter\dodoifregisterpreferenceelse\string#2#1@@\war
+% #4%
+% \else
+% #3%
+% \fi}
+%
+% \def\newdimen#1%
+% {\bgroup
+% \escapechar=-1
+% \expandafter\doifregisterpreferenceelse\expandafter{\string\dimen}#1
+% {\egroup
+% \temporarynewdimen#1}
+% {\expandafter\doifregisterpreferenceelse\expandafter{\string\skip}#1
+% {\egroup
+% \temporarynewskip#1}
+% {\egroup
+% \ifnum\count11>\count12
+% \temporarynewskip#1\relax
+% \else
+% \temporarynewdimen#1\relax
+% \fi}}}
+
+%D Curious readers can still find the previous solution in
+%D the source. The next macro is used instead of
+%D \type{\input}. This macro also reports some statistics.
+
+\def\dimeninput#1 %
+ {\message{[before: d=\the\count11,s=\the\count12]}%
+ \input #1 \relax
+ \message{[after: d=\the\count11,s=\the\count12]}}%
+
+%D Now we can load \PICTEX:
+
+\loadpictex
+
+%D Finally we restore the old definitions of \type{\newdimen}
+%D and \type{\newskip}:
+
+\let\newdimen=\normalnewdimen
+\let\newskip =\normalnewskip
+
+%D and just hope for the best.
+
+\protect \endinput
diff --git a/tex/context/base/m-plus.tex b/tex/context/base/m-plus.tex
new file mode 100644
index 000000000..312d9f931
--- /dev/null
+++ b/tex/context/base/m-plus.tex
@@ -0,0 +1,30 @@
+%D \module
+%D [ file=m-plus,
+%D version=2003.03.16,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Loading extra features,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Somewhere in 2001 I started collecting new functionality
+%D in a module \type {m-yesno}. As the name suggests, I was
+%D not entirely sure if this functionality belonged in the
+%D kernel. When (again) on the \CONTEXT\ list a request for
+%D side bars was posted, I decided to move such code to plus
+%D modules. Users who want this additional functionality can
+%D put the following call in their \type {cont-sys.tex} file:
+%D
+%D \starttyping
+%D \usemodule[plus]
+%D \stoptyping
+
+% \readfile {plus-rul} \donothing \donothing
+% \readfile {page-str} \donothing \donothing
+% \readfile {page-plg} \donothing \donothing
+
+\endinput
diff --git a/tex/context/base/m-pstricks.lua b/tex/context/base/m-pstricks.lua
new file mode 100644
index 000000000..35cae93f6
--- /dev/null
+++ b/tex/context/base/m-pstricks.lua
@@ -0,0 +1,73 @@
+if not modules then modules = { } end modules ['m-pstricks'] = {
+ version = 1.001,
+ comment = "companion to m-pstricks.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The following will be done when I need ps tricks figures
+-- in large quantities:
+--
+-- + hash graphics and only process them once
+-- + save md5 checksums in tuc file
+--
+-- It's no big deal but has a low priority.
+
+local format, lower, concat, gmatch = string.format, string.lower, table.concat, string.gmatch
+local variables = interfaces.variables
+
+plugins = plugins or { }
+plugins.pstricks = plugins.pstricks or { }
+
+local template = [[
+\starttext
+ \pushcatcodetable
+ \setcatcodetable\texcatcodes
+ \usemodule[pstric]
+ %s
+ \popcatcodetable
+ \startTEXpage
+ \hbox\bgroup
+ \ignorespaces
+ %s
+ \removeunwantedspaces
+ \egroup
+ \obeydepth %% temp hack as we need to figure this out
+ \stopTEXpage
+\stoptext
+]]
+
+local modules = { }
+local graphics = 0
+
+function plugins.pstricks.usemodule(names)
+ for name in gmatch(names,"([^%s,]+)") do
+ modules[#modules+1] = format([[\readfile{%s}{}{}]],name)
+ end
+end
+
+function plugins.pstricks.process(n)
+ graphics = graphics + 1
+ local name = string.format("%s-pstricks-%04i",tex.jobname,graphics)
+ local data = buffers.collect("def-"..n)
+ local tmpfile = name .. ".tmp"
+ local epsfile = name .. ".ps"
+ local pdffile = name .. ".pdf"
+ local modules = concat(modules,"\n")
+ os.remove(epsfile)
+ os.remove(pdffile)
+ io.savedata(tmpfile,format(template,modules,data))
+ os.execute(format("mtxrun --script texexec %s --once --dvips",tmpfile))
+ if lfs.isfile(epsfile) then
+ os.execute(format("ps2pdf %s %s",epsfile,pdffile))
+ -- todo: direct call but not now
+ if lfs.isfile(pdffile) then
+ context.externalfigure( { pdffile }, { object = variables.no } )
+ else
+ logs.report("plugins","pstricks run failed, no pdf file")
+ end
+ else
+ logs.report("plugins","pstricks run failed, no ps file")
+ end
+end
diff --git a/tex/context/base/m-pstricks.mkii b/tex/context/base/m-pstricks.mkii
new file mode 100644
index 000000000..3ada9e07e
--- /dev/null
+++ b/tex/context/base/m-pstricks.mkii
@@ -0,0 +1,127 @@
+%D \module
+%D [ file=m-pstricks,
+%D version=1997.01.15,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PSTRICKS\ Connections,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% pstricks is not supported in context mkii (it's no problem doing that
+% but as we also need to support latex it would become quite messy so for
+% context we use metapost and for latex pstricks)
+
+%M \usemodule[pstric]
+
+\letvalue{@unused}\plussixteen
+\letvalue{alloc@}\gobblefivearguments
+
+\chardef\oldbarcode\the\catcode`\| \catcode`\|=12
+
+\def\loadpstrickscolors#1%
+ {\pushmacro\dodefinecolor
+ \pushmacro\dodefinepalet
+ \pushmacro\dodefinecolorgroup
+ \def\dodefinecolor[##1][##2]%
+ {\doifassignmentelse{##2}
+ {\getparameters[pstricks][r=0,g=0,b=0,##2]%
+ \expanded{\newrgbcolor{##1}{{\pstricksr} {\pstricksg} {\pstricksb}}}}%
+ {}}%
+ \def\dodefinepalet [##1][##2]{}%
+ \def\dodefinecolorgroup[##1][##2][##3]{}%
+ \writestatus{pstricks}{loading colors from #1}%
+ \input #1 \relax
+ \popmacro\dodefinecolorgroup
+ \popmacro\dodefinepalet
+ \popmacro\dodefinecolor}
+
+\doifelse{\jobsuffix}{dvi}
+ {\input multido \relax
+ \input pstricks \relax
+ \input pst-plot \relax
+ \loadpstrickscolors{colo-rgb}}
+ {\writestatus{pstricks}{using indirect method; enable write18}}
+
+\catcode`\|=\oldbarcode
+
+\def\loadpstricksmodule[#1]%
+ {\chardef\oldbarcode\the\catcode`\|
+ \catcode`\|=12
+ \readfile{#1}{}{}%
+ \catcode`\|=\oldbarcode}
+
+%D The next piece of code is for John Culleton who suggested to
+%D handle \PSTRICKS\ in a similar fashion as \METAPOST, i.e.\
+%D using a child process. For the moment there is no support
+%D for passing environments, so these should be called
+%D explicitly inside this environment.
+
+\unprotect
+
+%D \startPSTRICKS[offset=2pt] ... \stopPSTRICKS
+%D
+%D works in both dvi and pdf mode
+%D
+%D % \usemodule[pstric]
+%D
+%D \startPSTRICKS
+%D \pspicture(0,0)(10,10)
+%D \dorecurse{10}{\psline(0,0)(\recurselevel,10)}
+%D \dorecurse{10}{\psline(0,0)(10,\recurselevel)}
+%D \endpspicture
+%D \stopPSTRICKS
+
+\def\startPSTRICKS
+ {\dosingleempty\dostartPSTRICKS}
+
+% \ifx\startTEXapplication\undefined
+%
+% \long\def\dostartPSTRICKS[#1]#2\stopPSTRICKS
+% {\doifelse{\jobsuffix}{dvi}
+% {#2}
+% {\bgroup
+% \setbuffer[pstricks]%
+% \usemodule[pstric]%
+% \setbox\scratchbox\hbox{#2}%
+% % There is probably a nicer way to handle this
+% \immediate\openout\scratchwrite=\bufferprefix dim.tmp
+% \immediate\write\scratchwrite{\dimen0=\the\ht\scratchbox}%
+% \immediate\write\scratchwrite{\dimen2=\the\wd\scratchbox}%
+% \immediate\closeout\scratchwrite
+% % Quick and dirty
+% \startTEXpage[#1]\box\scratchbox\stopTEXpage
+% \endbuffer
+% % Here we go!
+% %\immediate\write18{texexec \bufferprefix pstricks.tmp --once --batch}%
+% %\immediate\write18{dvips -G0 -Ppdf \bufferprefix pstricks -o}%
+% %\immediate\write18{ps2pdf \bufferprefix pstricks.ps \bufferprefix pstricks.pdf}%
+% \executesystemcommand{texexec \bufferprefix pstricks.tmp --once --batch}%
+% \executesystemcommand{dvips -G0 -Ppdf \bufferprefix pstricks -o}%
+% \executesystemcommand{texmfstart pstopdf \bufferprefix pstricks.ps \bufferprefix pstricks.pdf}%
+% % We pick up the dimensions from the scratch file.
+% \readlocfile{\bufferprefix pstricks-dim.tmp}{}{}%
+% % Since the graphic is put on a page (sigh) by dvips/gs
+% % we need to shift it around a bit.
+% \setbox\scratchbox\hbox
+% {\externalfigure[\bufferprefix pstricks.pdf][\c!object=\v!no]}%
+% \setbox\scratchbox\hbox
+% {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}%
+% \wd\scratchbox\dimen0
+% \ht\scratchbox\dimen2
+% \dp\scratchbox\zeropoint
+% \box\scratchbox
+% \egroup}}
+%
+% \fi
+
+\long\def\dostartPSTRICKS[#1]#2\stopPSTRICKS
+ {\doifelse{\jobsuffix}{dvi} % will some day move to app as switch
+ {\hbox{#2}}
+% {\startTEXapplication[#1]{\usemodule[pstric]}#2\stopTEXapplication}}
+ {\startTEXapplication[#1]{}#2\stopTEXapplication}}
+
+\protect \endinput
diff --git a/tex/context/base/m-pstricks.mkiv b/tex/context/base/m-pstricks.mkiv
new file mode 100644
index 000000000..c800ec199
--- /dev/null
+++ b/tex/context/base/m-pstricks.mkiv
@@ -0,0 +1,66 @@
+%D \module
+%D [ file=m-pstricks,
+%D version=2010.03.14,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PSTRICKS\ Connections,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ctxloadluafile{m-pstricks}{}
+
+%D \startbuffer
+%D \usePSTRICKSmodule[pst-barcode]
+%D
+%D \startPSTRICKS
+%D \pspicture(-4mm,-1mm)(38mm,26mm)
+%D \psbarcode{9781860742712}{includetext guardwhitespace}{ean13}%
+%D \endpspicture
+%D \stopPSTRICKS
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+\unprotect
+
+% best we can make a special colors module
+%
+% \let\@unused\plussixteen
+% \let\alloc@ \gobblefivearguments
+%
+% \def\loadpstrickscolors#1%
+% {\pushmacro\dodefinecolor
+% \pushmacro\dodefinepalet
+% \pushmacro\dodefinecolorgroup
+% \def\dodefinecolor[##1][##2]%
+% {\doifassignmentelse{##2}
+% {\getparameters[pstricks][r=0,g=0,b=0,##2]%
+% \expanded{\newrgbcolor{##1}{{\pstricksr} {\pstricksg} {\pstricksb}}}}%
+% {}}%
+% \def\dodefinepalet [##1][##2]{}%
+% \def\dodefinecolorgroup[##1][##2][##3]{}%
+% \writestatus{pstricks}{loading colors from #1}%
+% \input #1 \relax
+% \popmacro\dodefinecolorgroup
+% \popmacro\dodefinepalet
+% \popmacro\dodefinecolor}
+%
+% \input multido \relax
+% \input pstricks \relax
+% \input pst-plot \relax
+%
+% \loadpstrickscolors{colo-rgb}
+
+\definebuffer[PSTRICKS]
+
+\unexpanded\def\processPSTRICKS {\ctxlua{plugins.pstricks.process(\thebuffernumber{PSTRICKS})}}
+\unexpanded\def\usePSTRICKSmodule[#1]{\ctxlua{plugins.pstricks.usemodule("#1")}}
+\unexpanded\def\setPSTRICKS #1{\setbuffer[def-\thebuffernumber{PSTRICKS}]#1\endbuffer}
+
+\let\stopPSTRICKS\processPSTRICKS
+
+\protect \endinput
diff --git a/tex/context/base/m-pstricks.tex b/tex/context/base/m-pstricks.tex
new file mode 100644
index 000000000..28bc9f30f
--- /dev/null
+++ b/tex/context/base/m-pstricks.tex
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=m-pstricks,
+%D version=1997.01.15,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PSTRICKS\ Connections,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{m-pstricks}
+
+\endinput
diff --git a/tex/context/base/m-punk.mkiv b/tex/context/base/m-punk.mkiv
new file mode 100644
index 000000000..65bf03974
--- /dev/null
+++ b/tex/context/base/m-punk.mkiv
@@ -0,0 +1,243 @@
+%D \module
+%D [ file=m-punk,
+%D version=2008.04.15,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Punk 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.
+
+\ifx\luaversion\undefined \endinput \fi
+
+% At some point the font generation code will move into the
+% ConTeXt MkIV kernel.
+
+\startluacode
+do
+ local concat = table.concat
+ local chardata = characters.data
+ local fontdata = fonts.ids
+
+ fonts.mp = fonts.mp or { }
+
+ fonts.mp.version = fonts.mp.version or 1.11
+ fonts.mp.inline = true
+ fonts.mp.cache = containers.define("fonts", "mp", fonts.mp.version, true)
+
+ metapost.characters = metapost.characters or { }
+
+-- todo: use table share as in otf
+
+ local characters, descriptions = { }, { }
+ local factor, l, n, w, h, d, total, variants = 100, { }, 0, 0, 0, 0, 0, 0, true
+
+ -- A next version of mplib will provide the tfm font information which
+ -- gives better glyph dimensions, plus additional kerning information.
+
+ local flusher = {
+ startfigure = function(chrnum,llx,lly,urx,ury)
+ l, n = { }, chrnum
+ w, h, d = urx - llx, ury, -lly
+ total = total + 1
+ inline = fonts.mp.inline
+ end,
+ flushfigure = function(t)
+ for i=1, #t do
+ l[#l+1] = t[i]
+ end
+ end,
+ stopfigure = function()
+ local cd = chardata[n]
+ if inline then
+ descriptions[n] = {
+ -- unicode = n,
+ name = cd and cd.adobename,
+ width = w*100,
+ height = h*100,
+ depth = d*100,
+ boundingbox = { 0, -d, w, h },
+ }
+ characters[n] = {
+ commands = { -- todo: xforms, should happen in backend
+ { "special", "pdf: " .. concat(l," ") },
+ }
+ }
+ else
+ descriptions[n] = {
+ -- unicode = n,
+ name = cd and cd.adobename,
+ width = w*100,
+ height = h*100,
+ depth = d*100,
+ boundingbox = { 0, -d, w, h },
+ }
+ characters[n] = {
+ commands = {
+ { "image", { stream = concat(l," "), bbox = { 0, -d*65536, w*65536, h*65536 } } },
+ }
+ }
+ end
+ end
+ }
+
+ metapost.characters.instances = metapost.characters.instances or 10
+
+ function metapost.characters.process(mpxformat, name, instances, scalefactor)
+ statistics.starttiming(metapost.characters)
+ scalefactor = scalefactor or 1
+ instances = instances or metapost.characters.instances or 10
+ local fontname = file.removesuffix(file.basename(name))
+ local hash = file.robustname(string.format("%s %05i %03i", fontname, scalefactor*1000, instances))
+ local lists = containers.read(fonts.mp.cache(), hash)
+ if not lists then
+ statistics.starttiming(flusher)
+ -- we can use a format per font
+ local data = io.loaddata(resolvers.find_file(name))
+ metapost.reset(mpxformat)
+ metapost.set_outer_color(2) -- no outer color and no reset either
+ lists = { }
+ for i=1,instances do
+ list = { }
+ characters, descriptions = { }, { }
+ metapost.process(
+ mpxformat,
+ {
+ "randomseed := " .. i*10 .. ";",
+ "scale_factor := " .. scalefactor .. " ;",
+ data
+ },
+ false,
+ flusher
+ )
+ lists[i] = {
+ designsize = 655360,
+ name = string.format("%s-%03i",hash,i),
+ parameters = {
+ slant = 0,
+ space = 333 * scalefactor,
+ space_stretch = 166.5 * scalefactor,
+ space_shrink = 111 * scalefactor,
+ x_height = 431 * scalefactor,
+ quad =1000 * scalefactor,
+ extra_space = 0
+ },
+ ["type"] = "virtual",
+ characters = characters,
+ descriptions = descriptions,
+ -- embedding = "subset",
+ -- mkiv:
+ spacer = "space",
+ unit = 1000,
+ shared = { },
+ unique = { },
+ }
+ end
+ metapost.reset(mpxformat) -- saves memory
+ lists = containers.write(fonts.mp.cache(), hash, lists)
+ statistics.stoptiming(flusher)
+ end
+ variants = variants + #lists
+ statistics.stoptiming(metapost.characters)
+ return lists
+ end
+
+ function fonts.vf.aux.combine.commands.metafont(g,v)
+ local size = g.specification.size
+ local data = metapost.characters.process(v[2],v[3],v[4],size/655360)
+ local list, t = { }, { }
+ for d=1,#data do
+ t = data[d]
+ t = fonts.tfm.scale(t, -1000)
+ local id = font.nextid()
+ t.fonts = { { id = id } }
+ fontdata[id] = t
+ fonts.vf.aux.compose_characters(t)
+ list[d] = font.define(t)
+ end
+ for k=1,#t do
+ g[k] = t[k] -- kind of replace, when not present, make nil
+ end
+ g.virtualized = true
+ g.variants = list
+ end
+
+ fonts.define.methods.install( "punk", {
+ { "metafont", "mfplain", "punkfont.mp", 10 },
+ } )
+
+ cases.actions[99] = function(current)
+ local used = fontdata[current.font].variants
+ if used then
+ local f = math.random(1,#used)
+ current.font = used[f]
+ return current, true
+ else
+ return current, false
+ end
+ end
+
+ metapost.characters.flusher = flusher
+
+ statistics.register("metapost font generation", function()
+ local time = statistics.elapsedtime(flusher)
+ if total > 0 then
+ return string.format("%i glyphs, %.3f seconds runtime, %i glyphs/second", total, time, total/time)
+ else
+ return string.format("%i glyphs, %.3f seconds runtime", total, time)
+ end
+ end)
+
+ statistics.register("metapost font loading",function()
+ local time = statistics.elapsedtime(metapost.characters)
+ if variants > 0 then
+ return string.format("%.3f seconds, %i instances, %0.3f instances/second", time, variants, variants/time)
+ else
+ return string.format("%.3f seconds, %i instances", time, variants)
+ end
+ end)
+
+end
+\stopluacode
+
+\unexpanded\def\EnableRandomPunk {\setcharactercasing[99]}
+\unexpanded\def\RandomPunk {\groupedcommand\EnableRandomPunk\donothing}
+\unexpanded\def\StartRandomPunk {\begingroup\EnableRandomPunk}
+\unexpanded\def\StopRandomPunk {\endgroup}
+
+\starttypescript [serif] [punk] [default]
+ \setups[font:fallback:serif] % no style variants yet
+ \definefontsynonym [Serif] [demo@punk]
+\stoptypescript
+
+\starttypescript [punk]
+ \definetypeface [punk] [rm] [serif] [punk] [default]
+\stoptypescript
+
+\definefontfeature[punknova][mode=node,script=latn,rand=yes,kern=yes,liga=yes,tlig=yes]
+
+\starttypescript [serif] [punknova]
+ \setups[font:fallback:serif] % no style variants yet, actually it's a sans
+ \definefontsynonym [Serif] [file:punknova] [features=punknova]
+\stoptypescript
+
+\starttypescript [punknova]
+ \definetypeface [punknova] [rm] [serif] [punknova] [default]
+\stoptypescript
+
+\endinput
+
+\usetypescript[punk]
+
+\setupbodyfont[punk,14pt]
+
+\starttext
+ \definedfont[demo@punk at 10pt]hello world\par
+ \definedfont[demo@punk at 12pt]hello world\par
+ \definedfont[demo@punk at 16pt]hello world\par
+ \definedfont[demo@punk at 20pt]hello world\par
+\stoptext
+
diff --git a/tex/context/base/m-punk.tex b/tex/context/base/m-punk.tex
new file mode 100644
index 000000000..fe7ec85cc
--- /dev/null
+++ b/tex/context/base/m-punk.tex
@@ -0,0 +1,3 @@
+% this file will disasppear but we need it as it is still in tex live
+
+\loadmarkfile{m-punk}
diff --git a/tex/context/base/m-quest.tex b/tex/context/base/m-quest.tex
new file mode 100644
index 000000000..d20c86c93
--- /dev/null
+++ b/tex/context/base/m-quest.tex
@@ -0,0 +1,232 @@
+%D \module
+%D [ file=m-invull,
+%D version=1995.01.10,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Exercise,
+%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.
+
+%I Invuloefeningen kunnen worden vormgegeven met het
+%I de commando's:
+%I
+%I \definieerinvulwoord[trefwoord]{woord,woord}
+%I \invulwoord[trefwoord]
+%I \invulwoord{woord,woord,...}
+%I
+%I Daarbij kan het een en ander worden ingesteld met
+%I
+%I \stelinvullenin[status=,nummer=,links=,rechts=,letter=]
+%P
+%I Er zijn drie manieren om woorden in te vullen. De meest
+%I eenvoudige is die waarbij de in te vullen woorden in de
+%I tekst staan.
+%I
+%I bla bla \invulwoord{een,alfa} bla bla bla bla bla bla
+%I bla bla bla bla bla bla bla bla \invulwoord{twee,beta}.
+%I
+%I De gezette tekst hangt af van de instellingen:
+%I
+%I [status=leeg] ________
+%I [status=vol,nummer=1] 'een' respectievelijk 'twee'
+%I [status=vol,nummer=2] 'alfa' respectievelijk 'beta'
+%I
+%I Het nummer heeft dus betrekking op het volgnummer in de
+%I opgegeven reeks.
+%P
+%I Bij de tweede manier worden eerste de alternatieven
+%I gedefinieerd:
+%I
+%I \definieerinvulwoord{een,alfa}
+%I \definieerinvulwoord{twee,beta}
+%I
+%I die vervolgens worden opgeroepen:
+%I
+%I bla \invulwoord[+] bla bla bla bla bla bla bla bla bla
+%I bla bla bla bla bla bla bla bla bla bla \invulwoord[+].
+%I
+%I De mogelijke instellingen komen overeen met die van de
+%I eerste manier.
+%P
+%I De derde manier is een variant op de tweede. Bij grote
+%I teksten kan men het overzicht kwijtraken. Het is daarom
+%I mogelijk 'logische' namen toe te kennen aan woorden.
+%I
+%I \definieerinvulwoord[a]{een,alfa}
+%I \definieerinvulwoord[b]{twee,beta}
+%I
+%I die vervolgens worden opgeroepen:
+%I
+%I bla \invulwoord[a] bla bla bla bla bla bla bla bla bla
+%I bla bla bla bla bla bla bla bla bla bla \invulwoord[b].
+%I
+%I Dit maakt het bovendien mogelijk woorden meerdere malen
+%I (in een willekeurige volgorde op te roepen:
+%I
+%I bla \invulwoord[a] bla \invulwoord[b] bla bla bla bla
+%I bla bla bla bla \invulwoord[b] bla bla \invulwoord[a].
+%P
+%I Bij [status=leeg] wordt een streep gezet die in breedte
+%I overeenkomt met het woord dat er eigenlijk hoort te
+%I staan. De ingevulde tekst komt visueel daardoor overeen
+%I met de in te vullen tekst, wat vergelijken vereenvoudigd.
+%I
+%I Met [status=reset] worden enkele tellers weer op 0 gezet.
+%I Dit kan nodig zijn als meerdere invuloefeningen in een
+%I tekst worden gezet.
+%I
+%I Als \versie[voorlopig] is ingesteld, worden bij invullers
+%I zonder logische namen tussen haakjes de volgnummers
+%I getoond.
+
+%S \startsetup
+%S \command
+%S [stelinvullenin]
+%S \type
+%S [\c!vars!]
+%S \variable
+%S [\c!letter]
+%S [\v!normaal,\v!vet,\v!schuin,\v!vetschuin,\v!type,\v!kap,
+%S \v!klein...,\c!command!]
+%S [\v!vet]
+%S \variable
+%S [\c!links]
+%S [\c!text!]
+%S []
+%S \variable
+%S [\c!rechts]
+%S [\c!text!]
+%S []
+%S \variable
+%S [\c!status]
+%S [\v!leeg,\v!vol,\v!reset]
+%S [\v!vol]
+%S \variable
+%S [\c!nummer]
+%S [\c!number!]
+%S [1]
+%S \variable
+%S [\c!lijn]
+%S [\v!aan,\v!uit]
+%S [\v!aan]
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [invulwoord]
+%S \type
+%S [\c!ref!,\c!opt!\c!val!\c!opt!\c!args!]
+%S \value
+%S [\c!text!]
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [definieerinvulwoord]
+%S \type
+%S [\c!ref!,\c!opt!\c!val!\c!args!]
+%S \value
+%S [\c!text!]
+%S \stopsetup
+
+% Mogelijke uitbreidingen
+%
+% - [breedte=<maat>,passend,ruim]
+% - invullijst met nummers
+% - weergeven lijst tijdens definitie blokkeren
+% - door elkaar definieren
+
+\unprotect
+
+\definesystemvariable {iv}
+
+\definereferenceconstant {fillin} {:iv:}
+
+\newcount\invulteller \newcount\invulput \newcount\invulget
+
+\def\stelinvullenin
+ {\dosingleargument\dostelinvullenin}
+
+\def\dostelinvullenin[#1]%
+ {\getparameters[\??iv][#1]%
+ \doif\@@ivstate\v!reset
+ {\global\invulput\zerocount
+ \global\invulget\zerocount
+ \let\@@ivstate\empty}}
+
+\def\definieerinvulwoord
+ {\dosingleempty\dodefinieerinvulwoord}
+
+\def\dodefinieerinvulwoord[#1]#2%
+ {\iffirstargument
+ \setgvalue{\r!fillin#1}{\simpleinvulwoord{#2}}%
+ \else
+ \global\advance\invulput \plusone
+ \setgvalue{\r!fillin\the\invulput}{\simpleinvulwoord{#2}}%
+ \fi
+ \doifconcepttracing
+ {\ifnum\invulput>\zerocount
+ \setbox\scratchbox\hbox{~\ttx(\the\invulput)}%
+ \wd\scratchbox\zeropoint
+ \box\scratchbox
+ \par
+ \fi}}
+
+\def\dosimpleinvulwoord#1%
+ {\ifnum\@@ivnumber>\zerocount \advance\invulteller \plusone \fi
+ \ifnum\invulteller=\@@ivnumber\relax
+ \bgroup
+ \doconvertfont\@@ivstyle
+ {\@@ivleft
+ \doifelse\@@ivstate\v!empty
+ {\doifelse\@@ivrule\v!on\leeginvulwoord\geeninvulwoord}
+ {\doifelse\@@ivrule\v!on\underbar \firstofoneargument}%
+ {#1}%
+ \@@ivright}%
+ \egroup
+ \fi}%
+
+\def\simpleinvulwoord#1%
+ {\ifnum\@@ivnumber>0
+ \invulteller\zerocount
+ \processcommalist[#1]\dosimpleinvulwoord
+ \else
+ \dosimpleinvulwoord{#1}%
+ \fi}
+
+\def\complexinvulwoord[#1]%
+ {\bgroup
+ \doifsomething{#1}
+ {\global\advance\invulget \plusone
+ \doconvertfont\@@ivstyle
+ {\@@ivleft\getvalue{\r!fillin\the\invulget}\@@ivright}}
+ {\doconvertfont\@@ivstyle
+ {\@@ivleft\getvalue{\r!fillin #1}\@@ivright}}%
+ \egroup}
+
+\definecomplexorsimple\invulwoord
+
+\def\leeginvulwoord#1%
+ {{\let\redounderbar\dodounderbar
+ \def\dodounderbar##1{\redounderbar{\hphantom{##1}}}%
+ \underbar{#1}}}
+
+\def\geeninvulwoord#1%
+ {{\def\dodounderbar##1{\hphantom{##1}}%
+ \underbar{#1}}}
+
+% when nummer > 0, then commalist processing; beware of $(1,2)$, use { } there
+
+\stelinvullenin
+ [\c!number=0,
+ \c!style=\v!bold,
+ \c!rule=\v!on,
+ \c!left=,
+ \c!right=,
+ \c!state=]
+
+\protect \endinput
diff --git a/tex/context/base/m-r.tex b/tex/context/base/m-r.tex
new file mode 100644
index 000000000..bf7b07a14
--- /dev/null
+++ b/tex/context/base/m-r.tex
@@ -0,0 +1,174 @@
+%D \module
+%D [ file=m-r,
+%D version=2006.06.06,
+%D title=\CONTEXT\ Modules,
+%D subtitle=R Support,
+%D author={Johan Sandblom \& Hans Hagen},
+%D date=\currentdate,
+%D copyright={PRAGMA / Johan Sandblom}]
+%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
+
+%D The following R-processor is a variation on Johan Sandblom's
+%D prototype.
+%D
+%D We can combine both variants in one macro definition. Also, we
+%D can minimize the number of runs by checking for a change.
+
+%D JS: The call to R has \type {-q} in order to prevent banner,
+%D \type {--save} to make sure it saves the workspace after the run,
+%D \type {--restore} to make sure it reads any workspace from a
+%D previous session.
+
+%D An easier and better solution is to use the buffering mechanisms:
+
+\def\Rbufferprefix{r-}
+
+\newcounter\nofRfiles
+
+\def\Rfile{\TEXbufferfile{\Rbufferprefix\nofRfiles}}%
+
+\def\startR
+ {\doglobal\increment\nofRfiles
+ \dostartbuffer[\Rbufferprefix\nofRfiles][startR][stopR]}
+
+\def\stopR
+ {\doifmode{*\v!first}\runR
+ \typefile{\Rfile.out}}
+
+\def\startRhidden
+ {\doglobal\increment\nofRfiles
+ \dostartbuffer[\Rbufferprefix\nofRfiles][startRhidden][stopRhidden]}
+
+\def\stopRhidden
+ {\doifmode{*\v!first}\runR}
+
+\def\runR
+ {\executesystemcommand{texmfstart
+ --ifchanged=\Rfile\space --direct R
+ CMD BATCH -q --save --restore \Rfile\space \Rfile.out}}
+
+\protect \doifnotmode{demo}{\endinput}
+
+% Johan's test file:
+
+\usemodule[r]
+
+\def\R{R}
+
+\setupcolors[state=start]
+
+\setuptyping
+ [Rtype]
+ [color=darkgreen]
+
+\starttext
+
+First a test of whether the workspace is persistent:
+bla
+
+\startR
+a <- "bla"
+b <- "blabla"
+ls()
+\stopR
+
+One \R run ends, another begins.
+
+\startR
+ls()
+\stopR
+
+Now follows a hidden \R run which cleans the R workspace
+
+\startRhidden
+rm(list=ls())
+save.image()
+\stopRhidden
+
+What is in the workspace now?
+
+\startR
+ls()
+\stopR
+
+Then a small test of generating a graphic, in this case a pdf
+\startR
+ushape <- c(rexp(500000), 12-rexp(500000))
+pdf("ushape.pdf")
+par(mfrow=c(1,2))
+hist(ushape)
+plot(density(ushape), main="Density")
+dev.off()
+\stopR
+
+The graphic \type{ushape.pdf} can be included in the standard \CONTEXT\ way
+\startbuffer
+\placefigure{An ugly distribution}{\externalfigure[ushape]}
+\stopbuffer
+\typebuffer
+\getbuffer
+
+\startR
+x <- rnorm(900)
+y <- rexp(900)
+# test comment
+f <- gl(9,9,900)
+summary(aov(y~x+Error(f)))
+library(lattice)
+pdf("lattice.pdf")
+xyplot(y~x|f)
+dev.off()
+\stopR
+
+With \type{Sweave} lattice graphics calls must be enclosed in
+\type{print()} statements but that is not necessary here.
+
+\startbuffer
+\placefigure[here]{Lattice graphics}{\externalfigure[lattice]}
+\stopbuffer
+\typebuffer
+\getbuffer
+
+A test string with nasty characters. In \R, the result of a statement
+is not printed by default. Enclosing the statement in parentheses,
+however causes the parser to see only the value of the statement and
+applying the \type{print()} method.
+\startR
+(test <- ".*\\\\ [[{[{]{[{[{}\]\}=?!+%#|<|>@$")
+cat(test)
+\stopR
+
+A combination
+\startbuffer
+\placefigure{A combination of two previously used graphics}{
+\startcombination[2*1]
+ {\externalfigure[ushape][width=.4\textwidth]}{The first graphic, rescaled}
+ {\externalfigure[lattice][width=.4\textwidth]}{The second graphic, rescaled}}
+\stopcombination
+\stopbuffer
+\typebuffer
+\getbuffer
+
+Testing a function definition.
+
+\startR
+a.df <- data.frame(a=1:2, b=rnorm(2))
+a.df$a
+testfunction <- function(a=NULL, ...) {
+ for(i in 1:length(a)) {
+ gsub(a[[i]], "([a-r]|[A-R])", "bla")}
+ print(a)}
+\stopR
+
+What is in the workspace now?
+
+\startR
+ls()
+\stopR
+
+\stoptext
diff --git a/tex/context/base/m-steps.mkii b/tex/context/base/m-steps.mkii
new file mode 100644
index 000000000..3e1f86312
--- /dev/null
+++ b/tex/context/base/m-steps.mkii
@@ -0,0 +1,83 @@
+%D \module
+%D [ file=m-steps,
+%D version=2001.05.28,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Step Charts \& Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The \XML\ interface:
+
+\unprotect
+
+\defineXMLdirective [stepchart] [charts] \setupSTEPcharts
+\defineXMLdirective [stepchart] [cells] \setupSTEPcells
+\defineXMLdirective [stepchart] [texts] \setupSTEPtexts
+\defineXMLdirective [stepchart] [lines] \setupSTEPlines
+
+\defineXMLdirective [steptable] [tables] \setupSTEPtables
+\defineXMLdirective [steptable] [cells] \setupSTEPcells
+\defineXMLdirective [steptable] [texts] \setupSTEPtexts
+\defineXMLdirective [steptable] [lines] \setupSTEPlines
+
+\defineXMLpickup[stepchart][@@STPC]
+ {\bgroup
+ \defineXMLpush[top]%
+ \defineXMLpush[bot]%
+ \defineXMLenvironment[lines][@@STEL]
+ {\expanded{\startlines[\theXMLarguments{@@STEL}]}}
+ {\stoplines}%
+ \defineXMLenvironment[cells][@@STEC]
+ {\XMLerase{top}\XMLerase{bot}}
+ {\expanded{\cells[\theXMLarguments{@@STEC}]{\XMLpop{top}}{\XMLpop{bot}}}}%
+ \defineXMLenvironment[texts][@@STET]
+ {\XMLerase{top}\XMLerase{bot}}
+ {\expanded{\texts[\theXMLarguments{@@STET}]{\XMLpop{top}}{\XMLpop{bot}}}}%
+ \defineXMLenvironmentpush[cell][@@STEC]
+ {\XMLerase{cell}}
+ {\expanded{\cell [\theXMLarguments{@@STEC}]{\XMLpop{cell}}}}%
+ \defineXMLenvironmentpush [text] [@@STET]
+ {\XMLerase{text}}
+ {\expanded{\text [\theXMLarguments{@@STET}]{\XMLpop{text}}}}%
+ \expanded{\startSTEPchart[\theXMLarguments{@@STPC}]}}
+ {\stopSTEPchart
+ \egroup}
+
+\defineXMLpickup[steptable][@@STPT]
+ {\bgroup
+ \defineXMLenvironment[lines][@@STEL]
+ {\expanded{\startlines[\theXMLarguments{@@STEL}]}}
+ {\stoplines}%
+ \defineXMLargument[cell][@@STEC]
+ {\expanded{\cell[\theXMLarguments{@@STEC}]}}%
+ \defineXMLargument[text][@@STET]
+ {\expanded{\text[\theXMLarguments{@@STET}]}}%
+ \defineXMLargument[prep]
+ {\prep}%
+ \expanded{\startSTEPtable[\theXMLarguments{@@STPT}]}}
+ {\stopSTEPtable
+ \egroup}
+
+\defineXMLpickup[stepaligntable][@@STPT]
+ {\bgroup
+ \defineXMLenvironment[lines][@@STEL]
+ {\expanded{\setupSTEPlines[\theXMLarguments{@@STEL}]}}
+ {}%
+ \defineXMLpush[c1]\defineXMLpush[c2]\defineXMLpush[c3]%
+ \defineXMLenvironment[cells][@@STEC]
+ {\XMLerase{c1}\XMLerase{c1}\XMLerase{c3}}
+ {\expanded{\cells[\theXMLarguments{@@STEC}]{\XMLpop{c1}}{\XMLpop{c2}}{\XMLpop{c3}}}}%
+ \defineXMLargument[text][@@STET]
+ {\expanded{\text[\theXMLarguments{@@STET}]}}%
+ \defineXMLargument[prep]
+ {\prep}%
+ \expanded{\startSTEPaligntable[\theXMLarguments{@@STPT}]}}
+ {\stopSTEPaligntable
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/m-steps.mkiv b/tex/context/base/m-steps.mkiv
new file mode 100644
index 000000000..9bb56c532
--- /dev/null
+++ b/tex/context/base/m-steps.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=m-steps,
+%D version=2001.05.28,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Step Charts \& Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The \XML\ interface:
+
+\unprotect
+
+\writestatus\m!systems{The steps mkiv xml interface is not yet defined!}
+
+\protect \endinput
diff --git a/tex/context/base/m-steps.tex b/tex/context/base/m-steps.tex
new file mode 100644
index 000000000..1f6a37403
--- /dev/null
+++ b/tex/context/base/m-steps.tex
@@ -0,0 +1,835 @@
+%D \module
+%D [ file=m-steps,
+%D version=2001.05.28,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Step Charts \& Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D When I need this module, I will reimplement it by using the new
+%D sometxt macro. Anyhow, it reflects the state of 2001.
+
+\unprotect
+
+% temp hack :
+
+% \ifx\v!kleinkorps\undefined \let\v!kleinkorps\setsmallbodyfont \fi
+
+% end of hack
+
+\definecolor [STEPlinecolor] [s=.5]
+\definecolor [STEPframecolor] [s=.7]
+\definecolor [STEPbackgroundcolor] [s=.9]
+
+\def\@@STPF{@@STPF} % frames
+
+\def\@@STPC{@@STPC} % charts
+\def\@@STPT{@@STPT} % tables
+
+\def\@@STEC{@@STEC} % cells
+\def\@@STET{@@STET} % tables
+\def\@@STEL{@@STEL} % lines
+
+\def\setupSTEPcharts{\dodoubleargument\getparameters[\@@STPC]}
+\def\setupSTEPtables{\dodoubleargument\getparameters[\@@STPT]}
+\def\setupSTEPcells {\dodoubleargument\getparameters[\@@STEC]}
+\def\setupSTEPtexts {\dodoubleargument\getparameters[\@@STET]}
+\def\setupSTEPlines {\dodoubleargument\getparameters[\@@STEL]}
+
+\setupSTEPcharts
+ [\c!before=\blank,
+ \c!after=\blank,
+ %\c!distance=.25em, % nvt
+ \c!hoffset=1em,
+ \c!voffset=1ex,
+ \c!method=1,
+ \c!height=2ex,
+ \c!offset=.15\bodyfontsize]
+
+\setupSTEPtables
+ [\c!before=\blank,
+ \c!after=\blank,
+ \c!distance=.25em,
+ %\c!hoffset=1em, % nvt
+ \c!voffset=1ex,
+ \c!method=1,
+ \c!width=4em,
+ \c!offset=.15\bodyfontsize]
+
+\setupSTEPcells
+ [\c!alternative=24,
+ \c!background=\v!color,
+ \c!backgroundcolor=STEPbackgroundcolor,
+ \c!rulethickness=.1\bodyfontsize,
+ \c!framecolor=STEPframecolor,
+ \c!offset=.25\bodyfontsize,
+ \c!style=,
+ \c!color=]
+
+\setupSTEPtexts
+ [\c!alternative=24,
+ \c!background=\v!color,
+ \c!backgroundcolor=STEPbackgroundcolor,
+ \c!rulethickness=.1\bodyfontsize,
+ \c!framecolor=STEPframecolor,
+ \c!offset=.25\bodyfontsize,
+ \c!style=\v!smallbodyfont,
+ \c!color=]
+
+\setupSTEPlines
+ [\c!alternative=1,
+ \c!rulethickness=.15\bodyfontsize,
+ \c!color=STEPlinecolor]
+
+\def\initializeSTEP
+ {\initializeSTET \initializeSTEC \initializeSTEL}
+
+\def\initializeSTPC
+ {\freezedimenmacro\@@STPCoffset
+ \startMPdrawing
+ line_v_offset := \@@STPCoffset ;
+ line_method := \@@STPCmethod ; % only charts
+ \stopMPdrawing}
+
+\def\initializeSTPT
+ {\freezedimenmacro\@@STPToffset
+ \startMPdrawing
+ line_h_offset := \@@STPToffset ;
+ line_method := \@@STPTmethod ; % only charts
+ \stopMPdrawing}
+
+\def\initializeSTET
+ {\freezedimenmacro\@@STETrulethickness
+ \freezedimenmacro\@@STEToffset}
+
+\def\initializeSTEC
+ {\freezedimenmacro\@@STECrulethickness
+ \freezedimenmacro\@@STECoffset}
+
+\def\initializeSTEL
+ {\freezedimenmacro\@@STELrulethickness}
+
+%D ...
+
+\presetlocalframed[\@@STPF]
+
+\def\@@stepcell#1%
+ {\doattributes\@@STEC\c!style\c!color
+ {\localframed
+ [\@@STPF][\c!offset=\@@STECoffset,\c!frame=\v!off]
+ {\ignorespaces#1\unskip}}}
+
+\def\@@stepfake#1%
+ {\doattributes\@@STEC\c!style\c!color
+ {\ignorespaces#1\unskip}}
+
+\def\@@steptext#1%
+ {\doattributes\@@STET\c!style\c!color
+ {\localframed
+ [\@@STPF][\c!offset=\@@STEToffset,\c!frame=\v!off]
+ {\ignorespaces#1\unskip}}}
+
+%D The first attempt was purely \METAPOST\ based and spawned
+%D the typesetting to the \METAFUN\ handler. This method
+%D collects the cells, and directly passes them on to
+%D \METAPOST. This method is the cleanest, but has the
+%D disadvantage that one cannot embed hyperlinks or document
+%D dependent definitions in the cells. The implementation
+%D roughly looks as follows:
+%D
+%D \starttyping
+%D \def\startSTEPchart%
+%D {\bgroup
+%D \startMPdrawing
+%D input mp-step ; begin_step_chart ;
+%D \stopMPdrawing
+%D \initializeSTEP
+%D \let\cells\stepchartcells \def\cell{\cells{}}%
+%D \let\texts\stepcharttexts \def\text{\texts{}}}
+%D
+%D \def\stepchartcells#1#2%
+%D {\setMPtext{tdummy}{\strut\ignorespaces#1\unskip}% beter etex/btex
+%D \setMPtext{bdummy}{\strut\ignorespaces#2\unskip}% beter etex/btex
+%D \startMPdrawing
+%D set_step_chart_cells(\MPstring{tdummy},\MPstring{bdummy}) ;
+%D \stopMPdrawing}
+%D
+%D \def\stepcharttexts#1#2%
+%D {\setMPtext{tdummy}{\strut\ignorespaces#1\unskip}% beter etex/btex
+%D \setMPtext{bdummy}{\strut\ignorespaces#2\unskip}% beter etex/btex
+%D \startMPdrawing
+%D set_step_chart_texts(\MPstring{tdummy},\MPstring{bdummy}) ;
+%D \stopMPdrawing}
+%D
+%D \def\stopSTEPchart
+%D {\startMPdrawing
+%D end_step_chart ;
+%D \stopMPdrawing
+%D \MPdrawingdonetrue
+%D \getMPdrawing
+%D \resetMPdrawing
+%D \egroup}
+%D \stoptyping
+%D
+%D This method has the advantage that it does the job in
+%D (virtually) one pass, while the next methods need multiple
+%D passes: one to build the table, another to synchronize the
+%D positions, and a third one beause the dimensions may have
+%D changed. The last pass is a result from the fact that
+%D positions are related to the page.
+%D
+%D The second attempt was based on tabulations and used the
+%D build in position tracking mechanism, which uses two
+%D position nodes per cell.
+%D
+%D This method collects the content in token list registers
+%D and build a table from them. In the collecting pass, the
+%D graphics are build stepwise. We need to collect because the
+%D order of definitions is not the same as the order of
+%D typesetting. We show this alternative too because it
+%D demonstrates how to apply backgrounds to table cells.
+%D
+%D \starttyping
+%D \newtoks\stepsonetop \newtoks\stepstwotop
+%D \newtoks\stepsonebot \newtoks\stepstwobot
+%D \stoptyping
+%D
+%D During the collecting phase, we temporarily have to
+%D increment the name space counter.
+%D
+%D \starttyping
+%D \def\startSTEPchart%
+%D {\bgroup
+%D \resetMPdrawing
+%D \advance\noftabpositions\plusone % begin of preroll
+%D \startMPdrawing
+%D input mp-step ;
+%D begin_step_chart ;
+%D \stopMPdrawing
+%D \initializeSTEP
+%D \newcounter\cellcounter
+%D \stepsonetop\emptytoks \chardef\somesteponetop=1
+%D \stepsonebot\emptytoks \chardef\somesteponebot=1
+%D \stepstwotop\emptytoks \chardef\somesteptwotop=1
+%D \stepstwobot\emptytoks \chardef\somesteptwobot=1
+%D \let\cells\stepchartcells \def\cell{\cells{}}%
+%D \let\texts\stepcharttexts \def\text{\texts{}}}
+%D \stoptyping
+%D
+%D Now we collect the steps and texts, and in the process the
+%D graphic is built. Then we continue with building the table.
+%D
+%D Watch how we anchor the graphic to the main table box. This
+%D is needed since the graphic may be larger than the table
+%D itself. Actually, these small point took me the most time to
+%D digest, even with the right tools (anchors) already in
+%D place.
+%D
+%D \starttyping
+%D \def\stopSTEPchart
+%D {\splittabulatefalse
+%D \insidefloattrue
+%D \startMPdrawing
+%D nofcells := \cellcounter ;
+%D end_step_chart ;
+%D anchor_box(\MPpos{\tbPOSprefix origin}) ;
+%D \stopMPdrawing
+%D \MPdrawingdonetrue
+%D \advance\noftabpositions\minusone % end of preroll
+%D \setbox0=\vbox
+%D {\getMPdrawing}
+%D \resetMPdrawing
+%D \increment(\cellcounter,\cellcounter)\decrement\cellcounter
+%D \setbox2=\vbox
+%D {\definetabulate[chart][|*{\cellcounter}{ck0|}] % k0 nills space
+%D \startchart
+%D \ifcase\somesteptwotop \the\stepstwotop \NC \NR \noalign{\kern2ex} \fi
+%D \ifcase\somesteponetop \the\stepsonetop \NC \NR \noalign{\kern2ex} \fi
+%D \ifcase\somesteponebot \the\stepsonebot \NC \NR \noalign{\kern2ex} \fi
+%D \ifcase\somesteptwobot \the\stepstwobot \NC \NR \noalign{\kern2ex} \fi
+%D \noalign{\kern-2ex}%
+%D \stopchart}
+%D \hbox
+%D {\scratchdimen\wd0
+%D \advance\scratchdimen \MPllx bp
+%D \raise\MPlly bp\box0
+%D \hskip-\scratchdimen
+%D \hpos{\tbPOSprefix origin}{\box2}}
+%D \egroup}
+%D \stoptyping
+%D
+%D The steps and texts fill the (at most 4) lines that make up
+%D the table. We also feed the (automatically registerd) cell
+%D dimensions to the graphic backend.
+%D
+%D \starttyping
+%D \newcounter\cellcounter
+%D \newcounter\textcounter
+%D
+%D \def\stepchartcells#1#2%
+%D {\doloop
+%D {\ifnum\cellcounter>\textcounter
+%D \stepcharttexts{}{}%
+%D \else
+%D \exitloop
+%D \fi}%
+%D \increment\cellcounter
+%D \doifelsenothing{#1}
+%D {\startMPdrawing
+%D cells[t][\cellcounter] := origin ;
+%D \stopMPdrawing
+%D \appendtoks\NC\NC\to\stepsonetop}
+%D {\chardef\somesteponetop=0
+%D \edef\stepidentifier{\cellcounter-t-c}%
+%D \startMPdrawing
+%D initialize_area(\MPpos{b:\tbPOSprefix\stepidentifier},
+%D \MPpos{e:\tbPOSprefix\stepidentifier}) ;
+%D cells[t][\cellcounter] := pxy ;
+%D \stopMPdrawing
+%D \@EA\appendtoks\@EA\stepidentifierposition\@EA{\stepidentifier}#1\NC\to\stepsonetop}%
+%D \doifelsenothing{#2}
+%D {\startMPdrawing
+%D cells[b][\cellcounter] := origin ;
+%D \stopMPdrawing
+%D \appendtoks\NC\NC\to\stepsonebot}
+%D {\chardef\somesteponebot=0
+%D \edef\stepidentifier{\cellcounter-b-c}%
+%D \startMPdrawing
+%D initialize_area(\MPpos{b:\tbPOSprefix\stepidentifier},
+%D \MPpos{e:\tbPOSprefix\stepidentifier}) ;
+%D cells[b][\cellcounter] := pxy ;
+%D \stopMPdrawing
+%D \@EA\appendtoks\@EA\stepidentifierposition\@EA{\stepidentifier}#2\NC\to\stepsonebot}}
+%D
+%D \def\stepcharttexts#1#2% \cellcounter = nofcells
+%D {\increment\textcounter
+%D \doifelsenothing{#1}
+%D {\startMPdrawing
+%D texts[t][\cellcounter][\textcounter] := origin ;
+%D \stopMPdrawing
+%D \appendtoks\NC\NC\to\stepstwotop}
+%D {\chardef\somesteptwotop=0
+%D \edef\stepidentifier{\cellcounter-\textcounter-t-t}%
+%D \startMPdrawing
+%D initialize_area(\MPpos{b:\tbPOSprefix\stepidentifier},
+%D \MPpos{e:\tbPOSprefix\stepidentifier}) ;
+%D texts[t][\cellcounter][\textcounter] := pxy ;
+%D \stopMPdrawing
+%D \@EA\appendtoks\@EA\NC\@EA\textcellposition\@EA{\stepidentifier}#1\to\stepstwotop}%
+%D \doifelsenothing{#2}
+%D {\startMPdrawing
+%D texts[b][\cellcounter][\textcounter] := origin ;
+%D \stopMPdrawing
+%D \appendtoks\NC\NC\to\stepstwobot}
+%D {\chardef\somesteptwobot=0
+%D \edef\stepidentifier{\cellcounter-\textcounter-b-t}%
+%D \startMPdrawing
+%D initialize_area(\MPpos{b:\tbPOSprefix\stepidentifier},
+%D \MPpos{e:\tbPOSprefix\stepidentifier}) ;
+%D texts[b][\cellcounter][\textcounter] := pxy ;
+%D \stopMPdrawing
+%D \@EA\appendtoks\@EA\NC\@EA\textcellposition\@EA{\stepidentifier}#2\to\stepstwobot}}
+%D \stoptyping
+%D
+%D Here are the hooks that take care of calculating the cell
+%D dimensions.
+%D
+%D \starttyping
+%D \def\textcellposition#1{\GSC[#1:text]}
+%D \def\stepidentifierposition#1{\GSC[#1:step]}
+%D \stoptyping
+%D
+%D We abandoned this method after some testing and went for
+%D a third one. It was this third method that evolved into the
+%D current mechanism.
+%D
+%D Since this method was not that efficient, a third one was
+%D implemented, which used one position per cell. So,
+%D
+%D \blank {\bf Here starts the real implementation!} \blank
+%D
+%D Because we want to build one graphic only we need to store
+%D the graphic directives. We also need to collect the cells,
+%D which are not defined in the order they show up. This
+%D solution uses multiple passes over the definitions. First
+%D the cells and texts are processed and the associated
+%D graphics are defined in the \METAPOST\ file. Next the
+%D lines are flushed. We need to do that in a second pass,
+%D because in order to determine the nature of the line,
+%D \METAPOST\ needs to know if the start and end cells exist.
+%D This need comes from the fact that we store the shapes
+%D and lines kind of directly with their associated colors and
+%D types, so that we can change the settings in between. So,
+%D changing for instance the line color, can take place
+%D locally.
+
+\newbox\stepboxone \newbox\stepboxtwo
+\newbox\textboxone \newbox\textboxtwo
+
+%D We need to define a dedicated name space counter.
+
+\newcounter\currentstepchart
+
+\def\stepchartprefix{@sc@-\currentstepchart-}
+
+%D Next we define the initialization part of the macros.
+
+\newcounter\cellcounter
+\newcounter\textcounter
+
+\def\startSTEPchart
+ {\dosingleempty\dostartSTEPchart}
+
+\long\def\dostartSTEPchart[#1]#2\stopSTEPchart
+ {\ifinsidefloat
+ \else
+ \whitespace
+ \@@STPCbefore
+ \startbaselinecorrection
+ \setlocalhsize
+ \noindent
+ \fi
+ \vbox\bgroup
+ \setupSTEPcharts[#1]%
+ \forgetall
+ \pushMPdrawing
+ \resetMPdrawing
+ \doglobal\increment\currentstepchart
+ \startMPdrawing
+ input mp-step ;
+ begin_step_chart ;
+ \stopMPdrawing
+ \initializeSTEP
+ \initializeSTPC
+ \global\chardef\somestepboxone\plusone
+ \global\chardef\sometextboxone\plusone
+ \global\chardef\somestepboxtwo\somestepboxone
+ \global\chardef\sometextboxtwo\sometextboxone
+ \def\startlines{\bgroup\setupSTEPlines}%
+ \def\stoplines {\egroup}%
+ \def\cells{\dosingleempty\dostepchartcells}
+ \def\texts{\dosingleempty\dostepcharttexts}
+ \def\cell {\dosingleempty\docell}%
+ \def\text {\dosingleempty\dotext}%
+ \def\docell[##1]{\dostepchartcells[##1]{}}%
+ \def\dotext[##1]{\dostepcharttexts[##1]{}}
+ \doglobal\newcounter\cellcounter
+ \doglobal\newcounter\textcounter
+ \let\dostepchartcells\doSTEPchartcellsA
+ \let\dostepcharttexts\doSTEPcharttextsA
+ {#2} % pass one: cells and texts {} keeps setting local
+ \startMPdrawing
+ nofcells := \cellcounter ;
+ analyze_step_chart ;
+ \stopMPdrawing
+ \doglobal\newcounter\cellcounter
+ \doglobal\newcounter\textcounter
+ \let\dostepchartcells\doSTEPchartcellsB
+ \let\dostepcharttexts\doSTEPcharttextsB
+ {#2} % pass two: lines
+ \startMPdrawing
+ end_step_chart ;
+ % if box_found(\MPpos{\stepchartprefix origin}) :
+ % initialize_box(\MPpos{\stepchartprefix origin}) ;
+ % draw pxy ;
+ % fi ;
+ anchor_box(\MPpos{\stepchartprefix origin}) ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \doifelse\@@STPCmethod{0}
+ {\setbox0\null}
+ {\setbox0\vbox{\MPstaticgraphictrue\getMPdrawing}}%
+ \resetMPdrawing
+ \setbox2\vbox
+ {\offinterlineskip
+ \scratchdimen\@@STPCheight
+ \advance\scratchdimen\@@STPCoffset
+ \advance\scratchdimen\@@STPCoffset
+ \ifcase\sometextboxone \box\textboxone \vskip\scratchdimen \fi
+ \ifcase\somestepboxone \box\stepboxone \vskip\@@STPCvoffset \fi
+ \ifcase\somestepboxtwo \box\stepboxtwo \vskip\scratchdimen \fi
+ \ifcase\sometextboxtwo \box\textboxtwo \vskip\@@STPCvoffset \fi
+ \global\resetbox\stepboxone \global\resetbox\stepboxtwo % needed indeed
+ \global\resetbox\textboxone \global\resetbox\textboxtwo % needed indeed
+ %\kern-\scratchdimen % no, instead:
+ \vskip-\lastskip}
+ \hbox
+ {\scratchdimen\wd0
+ \advance\scratchdimen \MPllx bp
+ \raise\MPlly bp\box0
+ \hskip-\scratchdimen
+ \hpos{\stepchartprefix origin}{\box2}}%
+ \popMPdrawing
+ \egroup
+ \ifinsidefloat \else \stopbaselinecorrection \@@STPCafter \fi}
+
+%D The next macro looks more complicated than it is. We collect
+%D the cells in boxes. Before adding a new step cell, we padd
+%D the text rows. After adding the step cells, we flush text
+%D cells that are defined but not yet processed.
+
+\def\doSTEPchartcellsA[#1]#2#3%
+ {% synchronize texts
+ \doSTEPchartcellsAB[#1]{#2}{#3}%
+ % package steps
+ \setbox0\hbox{\doifsomething{#2}{\@@stepcell{#2}}}%
+ \setbox2\hbox{\doifsomething{#3}{\@@stepcell{#3}}}%
+ \ifdim\wd0>\zeropoint \!!doneafalse \else \!!doneatrue \fi
+ \ifdim\wd2>\zeropoint \!!donebfalse \else \!!donebtrue \fi
+ \ifdim\wd0>\wd2
+ \setbox2\hbox to \wd0{\hss\box2\hss}%
+ \else
+ \setbox0\hbox to \wd2{\hss\box0\hss}%
+ \fi
+ \if!!donea
+ \startMPdrawing
+ cells[t][\cellcounter] := nullpicture ;
+ \stopMPdrawing
+ \else
+ \global\chardef\somestepboxone\zerocount
+ \edef\stepidentifier{\stepchartprefix\cellcounter-t-c}%
+ \setbox0\hbox{\hpos{\stepidentifier}{\box0}}%
+ \bgroup
+ \iffirstargument\setupSTEPcells[#1]\fi\initializeSTEC
+ \startMPdrawing
+ initialize_box(\MPpos{\stepidentifier}) ;
+ cells[t][\cellcounter] := \MPcellsgraphic ;
+ \stopMPdrawing
+ \egroup
+ \fi
+ \if!!doneb
+ \startMPdrawing
+ cells[b][\cellcounter] := nullpicture ;
+ \stopMPdrawing
+ \else
+ \global\chardef\somestepboxtwo\zerocount
+ \edef\stepidentifier{\stepchartprefix\cellcounter-b-c}%
+ \setbox2\hbox{\hpos{\stepidentifier}{\box2}}%
+ \bgroup
+ \iffirstargument\setupSTEPcells[#1]\fi\initializeSTEC
+ \startMPdrawing
+ initialize_box(\MPpos{\stepidentifier}) ;
+ cells[b][\cellcounter] := \MPcellsgraphic ;
+ \stopMPdrawing
+ \egroup
+ \fi
+ \global\setbox\stepboxone\hbox
+ {\ifdim\wd\stepboxone>\zeropoint
+ \box\stepboxone\hskip\@@STPChoffset\else
+ \fi\box0}%
+ \global\setbox\stepboxtwo\hbox
+ {\ifdim\wd\stepboxtwo>\zeropoint
+ \box\stepboxtwo\hskip\@@STPChoffset\else
+ \fi\box2}%
+ % flush saved texts
+ \doSTEPchartcellsBA}
+
+\def\doSTEPchartcellsB[#1]#2#3%
+ {\doSTEPchartcellsAB[#1]{#2}{#3}%
+ \doSTEPchartcellsBA}
+
+\def\doSTEPchartcellsAB[#1]#2#3%
+ {\doloop
+ {\ifnum\cellcounter>\textcounter
+ \texts{}{}\else\exitloop
+ \fi}%
+ \doglobal\increment\cellcounter}
+
+\def\doSTEPchartcellsBA
+ {\scratchtoks\stepchartbuffer
+ \stepchartbuffer\emptytoks
+ \the\scratchtoks}
+
+\def\MPcellsgraphic
+ {image ( drawshape (
+ \@@STECalternative, pxy enlarged (-.5*\@@STECoffset),
+ \@@STECrulethickness, \MPcolor{\@@STECframecolor},
+ \MPcolor{\@@STECbackgroundcolor} ) )}
+
+%D Although each step can have only one associated text, the
+%D place where the text is defined determines the starting
+%D point of the connecting arrow. Although several methods are
+%D possible, we've chosen a funny collector that flushes one
+%D step text at a time.
+
+\newtoks\stepchartbuffer
+
+\def\doSTEPcharttextsA[#1]% #2 #3
+ {\dodoSTEPcharttextsA{\cellcounter}{#1}}
+
+\def\dodoSTEPcharttextsA#1#2#3#4% #1=number #2=setup
+ {\dodoSTEPcharttextsAB{#1}{#2}{#3}{#4}\dodoSTEPcharttextsA
+ \ifnum\textcounter>\cellcounter\relax
+ \doglobal\decrement\textcounter\relax
+ \else
+ \setbox0\hbox{\doifsomething{#3}{\@@steptext{#3}}}%
+ \setbox2\hbox{\doifsomething{#4}{\@@steptext{#4}}}%
+ \ifdim\wd0>\zeropoint \!!doneafalse \else \!!doneatrue \fi
+ \ifdim\wd2>\zeropoint \!!donebfalse \else \!!donebtrue \fi
+ \if!!donea
+ \setbox0\hbox to \@@STPChoffset{\hss}%
+ \startMPdrawing
+ texts[t][#1][\textcounter] := nullpicture ;
+ \stopMPdrawing
+ \else
+ \global\chardef\sometextboxone\zerocount
+ \edef\stepidentifier{\stepchartprefix#1-\textcounter-t-t}%
+ \setbox0\hbox to \@@STPChoffset
+ {\hss\hpos{\stepidentifier}{\box0}\hss}%
+ \bgroup
+ \setupSTEPtexts[#2]\initializeSTET
+ \startMPdrawing
+ initialize_box(\MPpos{\stepidentifier}) ;
+ texts[t][#1][\textcounter] := \MPtextsgraphic ;
+ \stopMPdrawing
+ \egroup
+ \fi
+ \if!!doneb
+ \setbox2\hbox to \@@STPChoffset{\hss}%
+ \startMPdrawing
+ texts[b][#1][\textcounter] := nullpicture ;
+ \stopMPdrawing
+ \else
+ \global\chardef\sometextboxtwo\zerocount
+ \edef\stepidentifier{\stepchartprefix#1-\textcounter-b-t}%
+ \setbox2\hbox to \@@STPChoffset
+ {\hss\hpos{\stepidentifier}{\box2}\hss}%
+ \bgroup
+ \setupSTEPtexts[#2]\initializeSTET
+ \startMPdrawing
+ initialize_box(\MPpos{\stepidentifier}) ;
+ texts[b][#1][\textcounter] := \MPtextsgraphic ;
+ \stopMPdrawing
+ \egroup
+ \fi
+ \global\setbox\textboxone\hbox
+ {\hbox to \wd\stepboxone{\box\textboxone\hss}\box0}
+ \global\setbox\textboxtwo\hbox
+ {\hbox to \wd\stepboxtwo{\box\textboxtwo\hss}\box2}
+ \fi}
+
+\def\doSTEPcharttextsB[#1]% #2 #3
+ {\dodoSTEPcharttextsB{\cellcounter}{#1}}
+
+\def\dodoSTEPcharttextsB#1#2#3#4% #1=number #2=setup
+ {\dodoSTEPcharttextsAB{#1}{#2}{#3}{#4}\dodoSTEPcharttextsB
+ \ifnum\textcounter>\cellcounter\relax
+ \doglobal\decrement\textcounter\relax
+ \else
+ \bgroup
+ \initializeSTEL
+ \startMPdrawing
+ lines[t][#1][\textcounter] := \MPcharttoplinesgraphic{#1}\textcounter ;
+ lines[b][#1][\textcounter] := \MPchartbotlinesgraphic{#1}\textcounter ;
+ \stopMPdrawing
+ \egroup
+ \fi}
+
+\def\dodoSTEPcharttextsAB#1#2#3#4#5% #1=number #2=setup
+ {\doglobal\increment\textcounter\relax
+ \ifnum\textcounter>\cellcounter\relax
+ \@EA\appendtoks\@EA#5\@EA{#1}{#2}{#3}{#4}\to\stepchartbuffer
+ \fi}
+
+\def\MPtextsgraphic
+ {image(drawshape(
+ \@@STETalternative, pxy enlarged (-.5*\@@STEToffset),
+ \@@STETrulethickness, \MPcolor{\@@STETframecolor},
+ \MPcolor{\@@STETbackgroundcolor} ) )}
+
+\def\MPcharttoplinesgraphic#1#2%
+ {image(drawline(
+ \@@STELalternative, get_step_chart_top_line(#1,#2),
+ \@@STELrulethickness, \MPcolor{\@@STELcolor} ) )}
+
+\def\MPchartbotlinesgraphic#1#2%
+ {image(drawline(
+ \@@STELalternative, get_step_chart_bot_line(#1,#2),
+ \@@STELrulethickness, \MPcolor{\@@STELcolor} ) )}
+
+%D Step tables are the vertical counterpart of stepcharts.
+
+\newcounter\currentsteptable
+
+\def\steptableprefix{@st@-\currentsteptable-}
+
+\def\startSTEPtable
+ {\dosingleempty\dostartSTEPtable}
+
+\def\dostartSTEPtable[#1]#2\stopSTEPtable
+ {\dostartSTEPaligntable[0][#1]#2\stopSTEPaligntable}
+
+\def\startSTEPaligntable
+ {\dodoubleempty\dostartSTEPaligntable[1]}
+
+\def\dostartSTEPaligntable[#1][#2]#3\stopSTEPaligntable % flag settings data
+ {\ifinsidefloat
+ \else
+ \whitespace
+ \@@STPTbefore
+ \startbaselinecorrection
+ \setlocalhsize
+ \noindent
+ \fi
+ \vbox\bgroup
+ \setupSTEPtables[#2]%
+ \forgetall
+ \pushMPdrawing
+ \doglobal\increment\currentsteptable
+ \startMPdrawing
+ input mp-step ;
+ begin_step_table ;
+ \stopMPdrawing
+ \initializeSTEP
+ \initializeSTPT
+ \def\startlines{\bgroup\setupSTEPlines}%
+ \def\stoplines {\egroup}%
+ \def\prep##1{\ignorespaces##1\unskip\enspace\ignorespaces}%
+ \def\cell {\dosingleempty\docell}%
+ \def\cells {\dosingleempty\docells}%
+ \def\text {\dosingleempty\dotext}%
+ % first graphic pass, also trial pass
+ \global\dimen1\zeropoint
+ \global\dimen3\zeropoint
+ \global\dimen5\zeropoint
+ \def\docell[##1]%
+ {\docells[##1]{}{}}%
+ \def\docells[##1]##2##3##4%
+ {\doglobal\increment\cellcounter
+ \bgroup
+ \iffirstargument\setupSTEPcells[##1]\fi
+ \initializeSTEC
+ \startMPdrawing
+ if box_found(\MPpos{\steptableprefix\cellcounter-c}) :
+ initialize_box(\MPpos{\steptableprefix\cellcounter-c}) ;
+ cells[\cellcounter] := \MPcellsgraphic ;
+ fi ;
+ \stopMPdrawing
+ \egroup
+ \def\do####1####2%
+ {\setbox\scratchbox\hbox{\@@stepfake{####2}}%
+ \ifdim\wd\scratchbox>\dimen####1\global\dimen####1=\wd\scratchbox\fi}%
+ \ifcase#1\else\do1{##2}\do3{##3}\fi\do5{##4}}%
+ \def\dotext[##1]##2%
+ {\bgroup
+ \iffirstargument\setupSTEPtexts[##1]\fi
+ \initializeSTET
+ \startMPdrawing
+ if box_found(\MPpos{\steptableprefix\cellcounter-t}) :
+ initialize_box(\MPpos{\steptableprefix\cellcounter-t}) ;
+ texts[\cellcounter] := \MPtextsgraphic ;
+ fi ;
+ \stopMPdrawing
+ \egroup}
+ \doglobal\newcounter\cellcounter#3
+ % second graphic pass pass, drawing lines
+ \def\docells[##1]##2##3##4%
+ {\doglobal\increment\cellcounter}
+ \def\dotext[##1]##2%
+ {\bgroup
+ \initializeSTEL
+ \startMPdrawing
+ lines[\cellcounter] := \MPtablelinesgraphic ;
+ \stopMPdrawing
+ \egroup}
+ \doglobal\newcounter\cellcounter#3
+ % finishing graphic touch
+ \startMPdrawing
+ nofcells := \cellcounter ;
+ end_step_table ;
+ anchor_box(\MPpos{\steptableprefix origin}) ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \doifelse\@@STPTmethod{0}
+ {\setbox0\null}
+ {\setbox0\vbox{\MPstaticgraphictrue\getMPdrawing}}%
+ \resetMPdrawing
+ % typesetting pass
+ \dimen6=\@@STPTdistance \dimen6=2\dimen6
+ % cell width
+ \dimen8=\dimen1
+ \advance\dimen8\dimen3
+ \advance\dimen8\dimen5
+ % offset width
+ \ifcase#1\else \advance\dimen8 \dimen6 \fi
+ % arrow width
+ \advance\dimen8 \@@STPTwidth
+ \advance\dimen8 \@@STPToffset
+ \advance\dimen8 \@@STPToffset
+ \def\docells[##1]##2##3##4%
+ {\doglobal\increment\cellcounter
+ \def\do####1####2####3####4% % strut really needed there !
+ {\hbox to \dimen####1{####2\@@stepfake{####3}\strut####4}}%
+ \setbox8\hbox
+ {\ifcase#1\else
+ \do1\hss{##2}\relax \hskip\@@STPTdistance
+ \do3\hss{##3}\hss \hskip\@@STPTdistance
+ \fi
+ \do5\relax{##4}\hss}%
+ \hpos{\steptableprefix\cellcounter-c}{\@@stepcell{\box8}}
+ \endgraf
+ \nointerlineskip
+ \kern\@@STPTvoffset}
+ \def\dotext[##1]##2%
+ {\bgroup
+ \hskip\dimen8
+ \advance\hsize-\dimen8
+ \advance\hsize-\dimen6 % twice the offset
+ \setbox0\hbox{\@@steptext{##2}}%
+% to do
+% \ifdim\wd0>\hsize
+% \setbox0=\vbox{\@@steptext{##2}}%
+% \fi
+% align
+ \hpos{\steptableprefix\cellcounter-t}{\box0}%
+ \endgraf
+ \egroup
+ \nointerlineskip
+ \kern\@@STPTvoffset}
+ \setbox2\vbox
+ {\doglobal\newcounter\cellcounter
+ #3\kern-\@@STPTvoffset}
+ \hbox
+ {\scratchdimen\wd0
+ \advance\scratchdimen \MPllx bp
+ \raise\MPlly bp\box0
+ \hskip-\scratchdimen
+ \hpos{\steptableprefix origin}{\box2}}
+ \popMPdrawing
+ \egroup
+ \ifinsidefloat \else \stopbaselinecorrection \@@STPTafter \fi}
+
+\def\MPtablelinesgraphic
+ {image ( drawline (
+ \@@STELalternative, get_step_table_line(\cellcounter),
+ \@@STELrulethickness, \MPcolor{\@@STELcolor} ) )}
+
+\protect \endinput
+
+% A simple paragraph-flow test:
+
+\starttext
+
+\startbuffer
+\startSTEPchart
+\cells {A} {B}
+\cells {one} {five} \texts{$+2$}{$-2$}
+\cells {two} {four} \texts{$+3$}{$-3$}
+\cells {three} {three} \texts{$+4$}{$-4$}
+\cells {four} {two} \texts{$+5$}{$-5$}
+\cells {five} {one}
+\stopSTEPchart
+\stopbuffer
+
+\getbuffer
+
+\startnarrower \getbuffer \stopnarrower
+
+\placefigure[left]{}{} \getbuffer
+
+\stoptext
diff --git a/tex/context/base/m-streams.tex b/tex/context/base/m-streams.tex
new file mode 100644
index 000000000..9d7e8d7dd
--- /dev/null
+++ b/tex/context/base/m-streams.tex
@@ -0,0 +1,446 @@
+%D \module
+%D [ file=m-streams,
+%D version=2006.03.21,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Streams,
+%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.
+
+%D First we implement a simple left||right synchronization
+%D mechanism, which we may perfect and extend over time.
+
+\unprotect
+
+\defineoutputstream [\v!left]
+\defineoutputstream [\v!right]
+
+\definemarknote[\v!left]
+\definemarknote[\v!right]
+
+\startsetups stream:\v!left:bottom
+ \flushmarknotes[\v!left]
+\stopsetups
+\startsetups stream:\v!right:bottom
+ \flushmarknotes[\v!right]
+\stopsetups
+\startsetups stream:\v!left:reset
+ \erasemarknotes[\v!left]
+\stopsetups
+\startsetups stream:\v!right:reset
+ \erasemarknotes[\v!right]
+\stopsetups
+
+\def\LeftNote {\setmarknote [\v!left]} % {#1}
+\def\RightNote {\setmarknote [\v!right]} % {#1}
+\def\SwitchToLeft {\enableoutputstream [\v!left]}
+\def\SwitchToRight {\enableoutputstream [\v!right]}
+\def\SwitchToNormal {\enableoutputstream [\s!default]}
+\def\SynchronizeLeftAndRight{\synchronizeoutputstreams[\v!left,\v!right]}
+\def\FlushLeftAndRight {\flushoutputstreampages [\v!left,\v!right]}
+
+\protect
+
+% \topskip \strutheight
+% \splittopskip\strutheight
+
+%D Example of usage:
+%D
+%D \starttyping
+%D \nopenalties \setupinterlinespace[top=height] \setupcolors[state=start]
+%D
+%D \showgrid \showstruts
+%D
+%D \starttext
+%D
+%D \title{Whatever} \page
+%D
+%D \dorecurse {5} {
+%D \let\RecurseLevel\recurselevel
+%D \SwitchToLeft \dorecurse{10}{\dontleavehmode{\tf\RecurseLevel:l \begstrut \input tufte \endstrut \endgraf}}
+%D \SwitchToRight \dorecurse{10}{\dontleavehmode{\sl\RecurseLevel:r \begstrut \input knuth \endstrut \endgraf}}
+%D \SwitchToNormal \SynchronizeLeftAndRight
+%D \SwitchToLeft \dorecurse{10}{\dontleavehmode{\bf\RecurseLevel:l \begstrut \input zapf \endstrut \endgraf}}
+%D \SwitchToRight \dorecurse{10}{\dontleavehmode{\bs\RecurseLevel:r \begstrut \input davis \endstrut \endgraf}}
+%D \SwitchToNormal \SynchronizeLeftAndRight
+%D }
+%D
+%D \FlushLeftAndRight
+%D
+%D \stoptext
+%D \stoptyping
+%D
+%D Another example:
+%D
+%D \starttyping
+%D \nopenalties \setupinterlinespace[top=height] \setupcolors[state=start]
+%D
+%D \showgrid \showstruts
+%D
+%D \starttext
+%D
+%D \SwitchToNormal \FlushLeftAndRight \page
+%D
+%D \def\StartCouple{\page\SwitchToNormal}
+%D \def\StopCouple {\SwitchToNormal \SynchronizeLeftAndRight \FlushLeftAndRight}
+%D
+%D \def\Original {\SwitchToNormal\SynchronizeLeftAndRight\SwitchToLeft}
+%D \def\Translation{\SwitchToRight}
+%D
+%D \StartCouple
+%D \dorecurse{10} {
+%D \Original o: \begstrut \inright{\blackrule}\input tufte \endstrut \LeftNote {tufte} \endgraf
+%D \Translation t: \begstrut \inleft {\blackrule}\input zapf \endstrut \RightNote{zapf} \endgraf
+%D \Original o: \begstrut \inright{\blackrule}\input knuth \endstrut \LeftNote {knuth} \endgraf
+%D \Translation t: \begstrut \inleft {\blackrule}\input davis \endstrut \RightNote{davis} \endgraf
+%D \Original o: \begstrut \inright{\blackrule}\input douglas \endstrut \LeftNote {douglas} \endgraf
+%D \Translation t: \begstrut \inleft {\blackrule}\input bryson \endstrut \RightNote{bryson} \endgraf
+%D }
+%D \StopCouple
+%D \stoptext
+%D \stoptyping
+
+%D Next we implement stream layers.
+
+\unprotect
+
+\def\overloadtextwidth#1%
+ {\makeupwidth#1\relax
+ \textwidth\makeupwidth
+ \hsize\makeupwidth}
+
+\startsetups streamlayer:default:settings
+ % set hsize etc, like \overloadtextwidth{12cm}
+\stopsetups
+
+\startsetups streamlayer:default:extras
+ % flush goodies, like local floats
+\stopsetups
+
+\startsetups streamlayer:default:place
+ \setlayer
+ [\currentstreamlayer]
+ [\c!preset=\v!left\v!top]
+ {\outputstreambox[\currentstreamlayer]}%
+\stopsetups
+
+\startsetups streamlayer:default:copy
+ \setlayer
+ [\currentstreamlayer]
+ [\c!preset=\v!left\v!top]
+ {\outputstreamcopy[\currentstreamlayer]}%
+\stopsetups
+
+\startsetups streamlayer:default:reset
+ \outputstreambox[\currentstreamlayer]
+\stopsetups
+
+\startsetups streamlayer:default:flush
+ \tightlayer[\currentstreamlayer]
+\stopsetups
+
+\def\definestreamlayer
+ {\dodoubleempty\dodefinestreamlayer}
+
+\def\dodefinestreamlayer[#1][#2]%
+ {\defineoutputstream[#1]%
+ \defineoutputstream[main]%
+ \definelayer[#1][\c!method=\v!fit,\c!width=\textwidth,#2]}
+
+\def\dostreamsetups#1%
+ {\doifsetupselse{streamlayer:\currentstreamlayer:#1}
+ {\directsetup{streamlayer:\currentstreamlayer:#1}}
+ {\directsetup{streamlayer:\s!default:#1}}}
+
+\def\startstreamlayer[#1]%
+ {\bgroup
+% \def\startstreamlayer[##1]{\bgroup\let\stopstreamlayer\egroup}%
+ \edef\currentstreamlayer{#1}%
+ \enableoutputstream[main]%
+ \synchronizeoutput
+ \enableoutputstream[\currentstreamlayer]%
+ \bgroup
+ \dostreamsetups{settings}}
+
+\def\stopstreamlayer
+ {\endgraf
+ \egroup
+ \disableoutputstream % \enableoutputstream[\s!default]%
+ \outputstreambox[main]%
+% \dostreamsetups{place}%
+% \dostreamsetups{extras}%
+% \dostreamsetups{flush}%
+ \egroup}
+
+\def\preparestreamlayer{\dosingleempty\dopreparestreamlayer}
+\def\flushstreamlayer {\dosingleempty\doflushstreamlayer }
+\def\placestreamlayer {\dosingleempty\doplacestreamlayer }
+
+\def\dopreparestreamlayer[#1]%
+ {\bgroup
+ \edef\currentstreamlayer{\iffirstargument#1\else\currentstreamlayer\fi}%
+ \dostreamsetups{place}%
+ \dostreamsetups{extras}%
+% \dostreamsetups{flush}%
+ \egroup}
+
+\def\doflushstreamlayer[#1]%
+ {\bgroup
+ \edef\currentstreamlayer{\iffirstargument#1\else\currentstreamlayer\fi}%
+ \dostreamsetups{flush}%
+ \egroup}
+
+\def\doplacestreamlayer[#1]%
+ {\preparestreamlayer[#1]%
+ \flushstreamlayer[#1]}
+
+\protect
+
+%D Usage:
+
+%D \starttyping
+%D \setupinterlinespace[top=height]
+%D
+%D \setupcolors[state=start]
+%D
+%D \definestreamlayer[block]
+%D
+%D \definemeasure[localtextwidth] [\dimexpr.7\textwidth\relax]
+%D \definemeasure[localfloatwidth][\dimexpr.3\textwidth-2\bodyfontsize\relax]
+%D
+%D \startsetups streamlayer:block:settings
+%D \hsize=\measure{localtextwidth}
+%D \setupfloat[figure][maxwidth=\measure{localfloatwidth}]
+%D \stopsetups
+%D
+%D \startsetups streamlayer:block:extras
+%D \setuplocalfloats
+%D [before=\blank,
+%D after=\blank,
+%D inbetween=\blank]
+%D \setbox\scratchbox\vbox{\hsize\measure{localfloatwidth}\getlocalfloats}
+%D \ifdim\ht\scratchbox>\thelayerheight\currentstreamlayer\relax
+%D % more float than text
+%D \setlayerframed
+%D [\currentstreamlayer]
+%D [preset=righttop]
+%D [frame=off,
+%D offset=overlay]
+%D {\box\scratchbox}
+%D \else
+%D % more text than float
+%D \setuplocalfloats
+%D [before=\vfill,
+%D after=\removedepth\vfill,
+%D inbetween=\removedepth\vfill]
+%D \setlayerframed
+%D [\currentstreamlayer]
+%D [preset=righttop]
+%D [frame=off,
+%D offset=overlay]
+%D {\vbox to \thelayerheight\currentstreamlayer {\hsize\measure{localfloatwidth}\getlocalfloats}}
+%D \fi
+%D \resetlocalfloats
+%D \stopsetups
+%D
+%D \startsetups streamlayer:block:place
+%D \setlayerframed
+%D [\currentstreamlayer]
+%D [preset=lefttop]
+%D [frame=off,
+%D offset=overlay]
+%D {\outputstreambox[\currentstreamlayer]}%
+%D \stopsetups
+%D
+%D \startsetups streamlayer:block:flush
+%D \framed
+%D [offset=overlay,
+%D frame=off,
+%D background=color,
+%D backgroundcolor=red]
+%D {\tightlayer[\currentstreamlayer]}
+%D \stopsetups
+%D
+%D \setupbodyfont[small]
+%D
+%D \starttext
+%D
+%D \dorecurse {10} {
+%D \startstreamlayer[block]
+%D \title{Sample \recurselevel}
+%D \input tufte \endgraf
+%D \placefigure[local]{}{}
+%D \placefigure[local]{}{}
+%D \ifodd\recurselevel\relax \placefigure[local]{}{} \fi
+%D \startitemize[columns]
+%D \item xxx
+%D \item xxx
+%D \item xxx
+%D \item xxx
+%D \item xxx
+%D \stopitemize
+%D \stopstreamlayer
+%D \placestreamlayer[block]
+%D }
+%D
+%D \dorecurse {10} {
+%D \startstreamlayer[block]
+%D \title{Sample \recurselevel}
+%D \startcolumns
+%D \input tufte
+%D \stopcolumns
+%D \stopstreamlayer
+%D \placestreamlayer[block]
+%D }
+%D
+%D \stoptext
+%D \stoptyping
+
+\def\starttextstreamlayer
+ {\startstreamlayer}
+
+\def\stoptextstreamlayer
+ {\endgraf
+ % maybe depth if no proper depth and no skip
+ \removelastskip
+ \stopstreamlayer}
+
+\def\placetextstreamlayer{\placestreamlayer}
+
+%D \starttyping
+%D \definestreamlayer[whatever][width=12cm]
+%D
+%D \startstreamlayer[whatever]
+%D \startitemize[columns,two][after=]
+%D \item one
+%D \item two
+%D \item three
+%D \item four
+%D \stopitemize
+%D \stopstreamlayer
+%D
+%D \framed[strut=no,align=normal]{\placestreamlayer[whatever]\obeydepth}
+%D
+%D \starttextstreamlayer[whatever]
+%D \startitemize[columns,two]
+%D \item one
+%D \item two
+%D \item three
+%D \item four
+%D \stopitemize
+%D \stoptextstreamlayer
+%D
+%D \framed[strut=no]{\placetextstreamlayer[whatever]}
+%D \stoptyping
+
+\endinput
+
+\setupinterlinespace[top=height]
+
+\setupcolors[state=start]
+
+\definestreamlayer[block]
+
+\definemeasure[localtextwidth] [\dimexpr.7\textwidth\relax]
+\definemeasure[localfloatwidth][\dimexpr.3\textwidth-2\bodyfontsize\relax]
+
+\startsetups streamlayer:block:settings
+ \hsize=\measure{localtextwidth}
+ \setupfloat[figure][maxwidth=\measure{localfloatwidth}]
+\stopsetups
+
+\startsetups streamlayer:block:extras
+ \setuplocalfloats
+ [before=\whitespace\blank,
+ after=\whitespace\blank,
+ inbetween=\whitespace\blank]
+ \setbox\scratchbox\vbox{\hsize\measure{localfloatwidth}\getlocalfloats}
+ \ifdim\ht\scratchbox>\thelayerheight\currentstreamlayer\relax
+ % more float than text
+ \setlayerframed
+ [\currentstreamlayer]
+ [preset=righttop]
+ [frame=off,
+ offset=overlay]
+ {\box\scratchbox}
+ \else
+ % more text than float
+ \setuplocalfloats
+ [before=\vfill,
+ after=\removedepth\vfill,
+ inbetween=\removedepth\vfill]
+ \setlayerframed
+ [\currentstreamlayer]
+ [preset=righttop]
+ [frame=off,
+ offset=overlay]
+ {\vbox to \thelayerheight\currentstreamlayer {\hsize\measure{localfloatwidth}\getlocalfloats}}
+ \fi
+ \resetlocalfloats
+\stopsetups
+
+\startsetups streamlayer:block:place
+ \setlayerframed
+ [\currentstreamlayer]
+ [preset=lefttop]
+ [frame=off,
+ offset=overlay]
+ {\outputstreambox[\currentstreamlayer]}%
+\stopsetups
+
+\startsetups streamlayer:block:flush
+ \framed
+ [offset=overlay,
+ frame=off,
+ background=color,
+ backgroundcolor=red]
+ {\tightlayer[\currentstreamlayer]}
+\stopsetups
+
+\setupbodyfont[small]
+
+\starttext
+
+% \definestreamlayer[block]
+%
+% \startstreamlayer[block]
+% \title{Sample \recurselevel}
+% \startcolumns
+% \dorecurse{4}{\input tufte \par}
+% \stopcolumns
+% \stopstreamlayer
+% \placestreamlayer[block]
+
+\dorecurse {10} {
+ \startstreamlayer[block]
+ \title{Sample \recurselevel}
+ \input tufte \endgraf
+ \placefigure[local]{}{}
+ \placefigure[local]{}{}
+ \ifodd\recurselevel\relax \placefigure[local]{}{} \fi
+ \startitemize[columns]
+ \item xxx
+ \item xxx
+ \item xxx
+ \item xxx
+ \item xxx
+ \stopitemize
+ \stopstreamlayer
+ \placestreamlayer[block]
+}
+
+\dorecurse {10} {
+ \startstreamlayer[block]
+ \title{Sample \recurselevel}
+ \startcolumns
+ \input tufte
+ \stopcolumns
+ \stopstreamlayer
+ \placestreamlayer[block]
+}
+
+\stoptext
diff --git a/tex/context/base/m-subsub.tex b/tex/context/base/m-subsub.tex
new file mode 100644
index 000000000..4395ded8a
--- /dev/null
+++ b/tex/context/base/m-subsub.tex
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=m-subsub,
+%D version=2000.12.14,
+%D title=\CONTEXT\ Private Modules,
+%D subtitle=More Section Levels,
+%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. This module is not public.
+
+\unprotect
+
+\definesection[\s!section-8]
+\definesection[\s!section-9]
+\definesection[\s!section-10]
+\definesection[\s!section-11]
+\definesection[\s!section-12]
+
+\definehead
+ [\v!subsubsubsubsubsection]
+ [\c!section=\s!section-8,
+ \c!default=\v!subsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsection]
+ [\c!section=\s!section-9,
+ \c!default=\v!subsubsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsection]
+ [\c!section=\s!section-10,
+ \c!default=\v!subsubsubsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsubsection]
+ [\c!section=\s!section-11,
+ \c!default=\v!subsubsubsubsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsubsubsection]
+ [\c!section=\s!section-12,
+ \c!default=\v!subsubsubsubsubsubsubsubsection]
+
+\definehead
+ [\v!subsubsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsubsection,
+ \c!default=\v!subsubsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsubsubsection,
+ \c!default=\v!subsubsubsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsubsubsubsection,
+ \c!default=\v!subsubsubsubsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsubsubsubsubsection,
+ \c!default=\v!subsubsubsubsubsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsubsubsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsubsubsubsubsubsection,
+ \c!default=\v!subsubsubsubsubsubsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/m-tex4ht.tex b/tex/context/base/m-tex4ht.tex
new file mode 100644
index 000000000..8a3dc9dbb
--- /dev/null
+++ b/tex/context/base/m-tex4ht.tex
@@ -0,0 +1,9 @@
+%D Preliminaty module
+
+\input tex4ht.sty
+
+\appendtoks
+ \Preamble{\env{ht-1},\env{ht-2},html}\EndPreamble
+\to \everystarttext
+
+\endinput \ No newline at end of file
diff --git a/tex/context/base/m-timing.tex b/tex/context/base/m-timing.tex
new file mode 100644
index 000000000..f02a90087
--- /dev/null
+++ b/tex/context/base/m-timing.tex
@@ -0,0 +1,102 @@
+%D \module
+%D [ file=m-timing,
+%D version=2007.12.23,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Timing,
+%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}
+
+\ifx\ShowNamedUsage\undefined \else \endinput \fi
+
+%D Written at the end of 2007, this module is dedicated to Taco. Reaching this
+%D point in \LUATEX\ was a non trivial effort. By visualizing a bit what happens
+%D when pages come out of \LUATEX, you may get an idea what is involved. It took
+%D much time an dedication to reach this point in the development. Add to that
+%D those daily Skype intense discussion, testing and debugging moments. Time flies
+%D but progress is impressive. The motto of this module could be: what you see
+%D is what you get. An there is much more to come \unknown.
+
+% \usemodule[timing]
+% \setupcolors[state=start]
+% \starttext
+% \dorecurse{200}{\input tufte \par} \ShowUsage{}
+% \stoptext
+
+\definecolor[usage:line] [darkred]
+\definecolor[usage:time] [darkblue]
+\definecolor[usage:frame][darkgray]
+
+\ctxloadluafile{trac-tim}{}
+
+\startluacode
+local progress = plugins.progress
+
+function progress.show(filename,parameters,nodes,other)
+ for n, name in pairs(parameters or progress.parameters(filename)) do
+ tex.sprint(tex.ctxcatcodes,string.format("\\ShowNamedUsage{%s}{%s}{%s}",filename or progress.defaultfilename,name,other or ""))
+ end
+ for n, name in pairs(nodes or progress.nodes(filename)) do
+ tex.sprint(tex.ctxcatcodes,string.format("\\ShowNamedUsage{%s}{%s}{%s}",filename or progress.defaultfilename,name,other or ""))
+ end
+end
+\stopluacode
+
+% \everyfirstshipout
+
+\startnotmode[no-timing]
+ \appendtoks\ctxlua{plugins.progress.store()}\to\everystarttext
+ \appendtoks\ctxlua{plugins.progress.store()}\to\everyshipout
+ \ctxlua{main.register_stop_actions(function() plugins.progress.save() end)}
+\stopnotmode
+
+\def\ShowNamedUsage#1#2#3%
+ {\setbox\scratchbox\vbox\bgroup\startMPcode
+ begingroup ; save p, q, b, h, w ;
+ path p, q, b ; numeric h, w ;
+ p := \ctxlua{tex.sprint(plugins.progress.path("#1","#2"))} ;
+% p := p shifted -llcorner p ;
+ if bbwidth(p) > 1 :
+ h := 100 ; w := 2 * h ;
+ w := \the\textwidth-3pt ; % correct for pen
+ p := p xstretched w ;
+ b := boundingbox (llcorner p -- llcorner p shifted (w,h)) ;
+ pickup pencircle scaled 3pt ; linecap := butt ;
+ draw b withcolor \MPcolor{usage:frame} ;
+ draw p withcolor \MPcolor{usage:line} ;
+ if ("#3" <> "") and ("#3" <> "#2") :
+ q := \ctxlua{tex.sprint(plugins.progress.path("#1","#3"))} ;
+% q := q shifted -llcorner q ;
+ if bbwidth(q) > 1 :
+ q := q xstretched w ;
+ pickup pencircle scaled 1.5pt ; linecap := butt ;
+ draw q withcolor \MPcolor{usage:time} ;
+ fi ;
+ fi ;
+ fi ;
+ endgroup ;
+ \stopMPcode\egroup
+ \scratchdimen\wd\scratchbox
+ \ifdim\scratchdimen>\zeropoint
+ \startlinecorrection
+ \box\scratchbox \endgraf
+ \hbox to \scratchdimen{\tttf\strut\detokenize{#2}\hss
+ min:\ctxlua{tex.sprint(plugins.progress.bot("#1","\detokenize{#2}"))}, %
+ max:\ctxlua{tex.sprint(plugins.progress.top("#1","\detokenize{#2}"))}, %
+ pages:\ctxlua{tex.sprint(plugins.progress.pages("#1"))}%
+ }%
+ \stoplinecorrection
+ \fi}
+
+\def\LoadUsage #1{\ctxlua{plugins.progress.convert("#1")}}
+\def\ShowUsage #1{\ctxlua{plugins.progress.show("#1",nil,nil,"elapsed_time")}}
+\def\ShowMemoryUsage#1{\ctxlua{plugins.progress.show("#1",nil,{}, "elapsed_time")}}
+\def\ShowNodeUsage #1{\ctxlua{plugins.progress.show("#1",{},nil, "elapsed_time")}}
+
+\endinput
diff --git a/tex/context/base/m-trackers.tex b/tex/context/base/m-trackers.tex
new file mode 100644
index 000000000..cfcbbabff
--- /dev/null
+++ b/tex/context/base/m-trackers.tex
@@ -0,0 +1,5 @@
+\doifnotmode{mkiv} {\endinput}
+
+\starttext
+ \showtrackers
+\stoptext
diff --git a/tex/context/base/m-translate.tex b/tex/context/base/m-translate.tex
new file mode 100644
index 000000000..9c550eca7
--- /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)
+ resolvers.install_text_filter("user",nil)
+ list, compiled = nil, nil
+ end
+ function translators.enable(s)
+ resolvers.install_text_filter("user",translators.translate)
+ end
+ function translators.disable(s)
+ resolvers.install_text_filter("user",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/m-tryout.tex b/tex/context/base/m-tryout.tex
new file mode 100644
index 000000000..4aa50376d
--- /dev/null
+++ b/tex/context/base/m-tryout.tex
@@ -0,0 +1,55 @@
+%D \module
+%D [ file=m-tryout,
+%D version=2002.05.10,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Tryout Features,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\endinput
+
+\unprotect
+
+%D The following macros make sure that active colons work well
+%D in French, a feature enabled with:
+%D
+%D \starttyping
+%D \useencoding[ffr] \mainlanguage[fr]
+%D \stoptyping
+%D
+%D This trick will disappear when proved robust.
+
+\startmode[activecolon]
+
+% this is now default
+
+\gdef\sectionseparator{-}
+
+\gdef\@@filterfirstpart [#1--#2]{#1}
+\gdef\@@filtersecondpart [#1--#2]{#2}
+
+\gdef\@@filterblockpart [#1--#2--#3]{#1}
+\gdef\@@filternumberpart [#1--#2--#3]{#2}
+\gdef\@@filterpagepart [#1--#2--#3]{#3}
+\gdef\@@filterblocknumberpart[#1--#2--#3]{#1--#2}
+
+\gdef\@@filterheadpart[#1]{\@EA\@@dofilterheadpart\@EA[#1-0]}
+\gdef\@@filtertailpart[#1]{\@EA\@@dofiltertailpart\@EA[#1-0]}
+
+\gdef\@@dofilterheadpart[#1-#2]{#1}
+\gdef\@@dofiltertailpart[#1-#2]{#2}
+
+\gdef\@@filterlevelpart[#1--#2--#3]{\@@dofilterlevelpart[#2-0-0-0-0]}
+
+\gdef\@@dofilterlevelpart[#1-0-0-0-#2]{#1}
+
+\reopenutilities
+
+\stopmode
+
+\protect \endinput
diff --git a/tex/context/base/m-units.tex b/tex/context/base/m-units.tex
new file mode 100644
index 000000000..d186c542b
--- /dev/null
+++ b/tex/context/base/m-units.tex
@@ -0,0 +1,825 @@
+%D \module
+%D [ file=m-units,
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Scientific Units,
+%D author={Hans Hagen \& Ton Otten},
+%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 Scientific units can be typeset in math mode pretty well,
+%D but occasionally one has to take care of spacing.
+%D Furthermore, entering these units is not that natural as
+%D wanted. Therefore this module presents a more natural way of
+%D doing things, like:
+%D
+%D \starttyping
+%D 1.23 \Cubic \Meter \Per \Second
+%D \stoptyping
+%D
+%D This example shows that we use the order in which we say
+%D things, instead of typeset things. There is a separate
+%D manual for this module.
+
+%D Message number~1 deals with overruling the \type {\Degrees}
+%D macro defined in the core modules. Let's say that this is
+%D an upward compatibility issue.
+
+\startmessages dutch library: units
+ title: eenheden
+ 1: gebruik \string\Degrees\space\string\Celsius\space in plaats van \string\Celsius !
+\stopmessages
+
+\startmessages english library: units
+ title: units
+ 1: use \string\Degrees\space\string\Celsius\space instead of \string\Celsius !
+\stopmessages
+
+\startmessages german library: units
+ title: Einheiten
+ 1: Verwende \string\Degrees\space\string\Celsius\space statt \string\Celsius !
+\stopmessages
+
+\startmessages italian library: units
+ title: unita
+ 1: usare \string\Degrees\space\string\Celsius\space invece di \string\Celsius !
+\stopmessages
+
+\startmessages norwegian library: units
+ title: enheter
+ 1: bruk \string\Degrees\space\string\Celsius\space istedenfor \string\Celsius !
+\stopmessages
+
+\startmessages romanian library: units
+ title: unitati
+ 1: folositi \string\Degrees\space\string\Celsius\space in locul \string\Celsius !
+\stopmessages
+
+\startmessages french library: units
+ title: unitas
+ 1: utilisez \string\Degrees\space\string\Celsius\space A la place de \string\Celsius !
+\stopmessages
+
+\unprotect
+
+%D This runtime loadable module implements a way of defining
+%D units. The core macro is \type {\dimension}, a rather clever
+%D one that is able to cooperate with some other dimension
+%D related macros. As said, this module enables user to enter:
+%D
+%D \startbuffer
+%D some 10 \Square \Meter \Per \Second or more
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D as:
+%D
+%D \typebuffer
+%D
+%D The units itself are implemented as synonyms.
+%D
+%D \starttyping
+%D \definesynonyms [unit] [units] [\unitmeaning]
+%D \setupsynonyms [unit] [textstyle=\dimension]
+%D \stoptyping
+%D
+%D This definition means that we can ask for the meaning of a
+%D unit using \type {\unitmeaning} and get a list of used
+%D units by saying \type {\placelistofunits}
+%D
+%D We have to use the command \type {\unitmeaning} instead
+%D of \type {\meaning}, simply because the latter is a \TEX\
+%D primitive we don't want to loose. We use the label text
+%D mechanism for translations.
+
+%D \macros
+%D {dimension}
+%D
+%D The core of this module is the low level macro \type
+%D {\dimension}. Before presenting this macro, it's best to
+%D look at some applications, because it's supposed to show
+%D some intelligence that can beter be understood from the
+%D context.
+%D
+%D The next useless examples show some of the cases we want
+%D to handle in a proper way.
+%D
+%D \startbuffer
+%D ... 10 \Square \Meter \Per \Volt \
+%D ... 10 \Square \Meter \Volt \
+%D ... 10 \Meter \Volt \
+%D ... 10 \Milli \Square \Meter \Per \Volt \
+%D ... 10 \Square \Milli \Meter \Per \Volt \
+%D ... 10 \Meter \Times \Meter \
+%D ... 10 \Square \Meter \Times \Meter \
+%D ... 10 \Square \Milli \Meter \Times \Meter \
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Becomes:
+%D
+%D \getbuffer
+
+%D \macros
+%D {mathematicstypeface, dimensiontypeface,
+%D dimensionhalfspace, dimensionbackspace}
+%D
+%D There are some low level constants, that can be changed
+%D when needed. Some day I will write a decent setup command.
+
+\def\mathematicstypeface{\rm}
+\def\dimensiontypeface {\tf}
+
+\def\dimensionhalfspace {\ifmmode\,\else\hskip+.1em\relax\fi}
+\def\dimensionbackspace {\ifmmode\!\else\hskip-.1em\relax\fi}
+
+%D \macros
+%D {smashdimensionpower}
+%D
+%D Sometimes the baseline distance is not enough to provide
+%D for superscripts, so we smash their height by default.
+
+\newif\ifsmashdimensionpower \smashdimensionpowertrue
+
+%D The dimension mechanism uses a lot of signals to keep
+%D track if the current state.
+
+\newsignal\dimensionsignal
+\newsignal\dimensionpowersignal
+\newsignal\dimensionmidfixsignal
+\newsignal\dimensionaddfixsignal
+
+\let\thedimensionprefix = \empty
+\let\thedimensionpower = \empty
+
+%D \macros
+%D {spaceddimensions,textdimensions}
+%D
+%D The actual definition of \type {\dimension} overruled the
+%D one in the core modules. The boolean can be used to
+%D force spacing between units. Vergelijk {\Newton \Meter}
+%D eens met {\spaceddimensionstrue \Newton \Meter}. The
+%D rather ugly test prevents problems with nested dimensions.
+
+\newif\ifspaceddimensions \spaceddimensionsfalse % user switch
+\newif\iftextdimensions \textdimensionsfalse % user switch
+
+%D You can see the consequence of forcing text dimensions
+%D when you compare the following code:
+%D
+%D \starttyping
+%D {\rm test \Square \Meter \Per \Second\ ziezo\Degrees} \par
+%D {\ss test \Square \Meter \Per \Second\ ziezo} \par
+%D {\tt test \Square \Meter \Per \Second\ ziezo}
+%D
+%D \textdimensionstrue
+%D
+%D {\rm test \Square \Meter \Per \Second\ ziezo} \par
+%D {\ss test \Square \Meter \Per \Second\ ziezo} \par
+%D {\tt test \Square \Meter \Per \Second\ ziezo}
+%D \stoptyping
+
+\newif\ifnesteddimension \nesteddimensionfalse % local switch
+
+\def\dodimensionpower#1%
+ {\iftextdimensions\expandafter\high\else\expandafter^\fi{#1}}
+
+\def\ustartmathmode {\iftextdimensions\else\expandafter\startmathmode \fi}
+\def\ustopmathmode {\iftextdimensions\else\expandafter\stopmathmode \fi}
+\def\umathematicstypeface{\iftextdimensions\else\expandafter\mathematicstypeface\fi}
+
+%D In forced text mode, we ignore spacing in monospaced fonts.
+
+\def\udimensionhalfspace {\dodimensionspace\dimensionhalfspace}
+\def\udimensionbackspace {\dodimensionspace\dimensionbackspace}
+
+\def\dodimensionspace
+ {\iftextdimensions
+ \begingroup
+ \setbox0\hbox{i}%
+ \setbox2\hbox{m}%
+ \ifdim\wd0=\wd2
+ \endgroup
+ \@EAEAEA\gobbleoneargument
+ \else
+ \endgroup
+ \fi
+ \fi}
+
+\unexpanded\def\dimension#1%
+ {\begingroup
+ \global\let\savedthedimensionprefix\thedimensionprefix
+ \global\let\savedthedimensionpower\thedimensionpower
+ \unexpanded\def\dimension##1{\global\nesteddimensiontrue}%
+ \let\dimensionprefix\dimension
+ \let\dimensionmidfix\dimension
+ \let\dimensionsuffix\dimension
+ \let\dimensionpower \dimension
+ \global\nesteddimensionfalse
+ \setbox\scratchbox\hbox{\ustartmathmode#1\ustopmathmode}% pre-roll
+ \global\let\thedimensionprefix\savedthedimensionprefix
+ \global\let\thedimensionpower \savedthedimensionpower
+ \endgroup
+ \ifnesteddimension#1\else\dodimension{#1}\fi}
+
+\def\dodimension#1%
+ {\dontbreakdimension
+ \ifdim\scratchdimen=\zeropoint\relax
+ \ifmmode
+ \udimensionhalfspace
+ \udimensionhalfspace
+ \fi
+ \ustartmathmode\dimensiontypeface
+ \else
+ \ustartmathmode\dimensiontypeface
+ \ifspaceddimensions
+ \ifdim\scratchdimen=\dimensionsignal\relax
+ \udimensionhalfspace
+ \else\ifdim\scratchdimen=\dimensionpowersignal\relax
+ \udimensionhalfspace
+ \fi
+ \fi
+ \fi
+ \fi
+ \umathematicstypeface\thedimensionprefix#1%
+ \ifx\thedimensionpower\empty
+ \else\ifsmashdimensionpower
+ \setbox\scratchbox=\hbox
+ {\iftextdimensions
+ \tx\thedimensionpower
+ \else
+ $\scriptstyle\thedimensionpower$%
+ \fi}%
+ \ht\scratchbox=\zeropoint
+ \dodimensionpower{\box\scratchbox}%
+ \else
+ \dodimensionpower{\thedimensionpower}%
+ \fi\fi
+ \ustopmathmode
+ % otherwise nobreak before space in 2 \Milli \Meter\ blabla
+ \doifnotmode{atpragma}{\nobreak}% this was always \nobreak
+ % only test this at pragma
+ \ifx\thedimensionpower\empty
+ \hskip\dimensionsignal
+ \else
+ \hskip\dimensionpowersignal
+ \fi
+ \global\let\thedimensionprefix\empty
+ \global\let\thedimensionpower\empty}
+
+%D \macros
+%D {dontbreakdimension,
+%D dimensionprefix, dimensionaddfix,
+%D dimensionnopfix, dimensionmidfix,
+%D dimensionpower}
+%D
+%D Here are some auxilliary macros.
+
+\def\dontbreakdimension
+ {\scratchdimen\lastskip
+ \unskip
+ \nobreak
+ \hskip\scratchdimen
+ \nobreak}
+
+\def\dimensionprefix#1%
+ {\gdef\thedimensionprefix{#1}}
+
+\def\dimensionaddfix#1%
+ {\unskip
+ %\mathematics{\umathematicstypeface#1}%
+ \ustartmathmode\umathematicstypeface#1\ustopmathmode
+ \nobreak
+ \hskip\dimensionaddfixsignal}
+
+\def\dimensionnopfix#1%
+ {\dontbreakdimension
+ \ifdim\scratchdimen=\dimensionpowersignal\relax
+ \ustartmathmode
+ \else
+ \ustartmathmode
+ \udimensionhalfspace
+ \nobreak
+ \fi
+ \umathematicstypeface#1%
+ \ustopmathmode
+ \nobreak
+ \hskip\dimensionsignal}
+
+\def\dimensionmidfix#1%
+ {\dontbreakdimension
+ \ifdim\scratchdimen=\dimensionpowersignal\relax
+ \ustartmathmode
+ \udimensionbackspace
+ \nobreak
+ \else
+ \ustartmathmode
+ \fi
+ \umathematicstypeface#1%
+ \ustopmathmode
+ \nobreak
+ \hskip\dimensionmidfixsignal}
+
+\def\dimensionpower#1%
+ {\gdef\thedimensionpower{#1}}
+
+%D \macros
+%D {SIunits, noSI, doSI}
+%D
+%D Some low level unit switching macros:
+
+\newif\ifSIunits \SIunitstrue
+
+\def\noSI#1{\begingroup\SIunitsfalse#1\endgroup}
+\def\doSI#1{\begingroup\SIunitstrue #1\endgroup}
+
+%D \macros
+%D {Degrees}
+%D
+%D We can fake the degrees symbol with:
+
+\def\Degrees{\dimensionaddfix{\mathematics{^\circ}}}
+
+%D \macros
+%D {Unit, NoUnit}
+%D
+%D When a dimension has no leading number, we can use \type
+%D {\Unit}, and when no unit is appended, \type {\NoUnit} is
+%D to be used, just to prevent the prefix migrating to the
+%D next occasion.
+
+\def\Unit {\hskip\dimensionsignal}
+\def\NoUnit {\dimension{}}
+
+%D The mechanism described at the top of this module, depends
+%D on several dimensional components, like prefixes:
+
+\def\Atto {\dimensionprefix{a}}
+\def\Femto {\dimensionprefix{f}}
+\def\Pico {\dimensionprefix{p}}
+\def\Nano {\dimensionprefix{n}}
+\def\Micro {\dimensionprefix{\iftextdimensions u\else\mu\fi}}
+\def\Milli {\dimensionprefix{m}}
+\def\Centi {\dimensionprefix{c}}
+\def\Deci {\dimensionprefix{d}}
+\def\Hecto {\dimensionprefix{h}}
+\def\Kilo {\dimensionprefix{k}}
+\def\Mega {\dimensionprefix{M}}
+\def\Giga {\dimensionprefix{G}}
+\def\Terra {\dimensionprefix{T}} % for old times sake
+\def\Tera {\dimensionprefix{T}}
+\def\Peta {\dimensionprefix{P}}
+\def\Exa {\dimensionprefix{E}}
+
+%D and operators:
+
+\def\Times {\dimensionnopfix{\iftextdimensions.\else\cdot\fi}}
+\def\Solidus {\dimensionmidfix{/}}
+\def\Per {\dimensionmidfix{/}}
+\def\OutOf {\dimensionnopfix{:}}
+
+%D and suffixes:
+
+\def\Linear {\dimensionpower{1}}
+\def\Square {\dimensionpower{2}}
+\def\Cubic {\dimensionpower{3}}
+
+\def\Inverse {\dimensionpower{-1}}
+\def\ILinear {\dimensionpower{-1}}
+\def\ISquare {\dimensionpower{-2}}
+\def\ICubic {\dimensionpower{-3}}
+
+%D Apart from these components, the units themselves are
+%D defined using the synonym mechanism. First we define some
+%D length and volume related units.
+
+\getvalue{\v!unit} [Meter] {m} {meter}
+\getvalue{\v!unit} [pMeter] {\Pico \Meter} {picometer}
+\getvalue{\v!unit} [nMeter] {\Nano \Meter} {nanometer}
+\getvalue{\v!unit} [uMeter] {\Micro \Meter} {micrometer}
+\getvalue{\v!unit} [mMeter] {\Milli \Meter} {millimeter}
+\getvalue{\v!unit} [cMeter] {\Centi \Meter} {centimeter}
+\getvalue{\v!unit} [dMeter] {\Deci \Meter} {decimeter}
+\getvalue{\v!unit} [hMeter] {\Hecto \Meter} {hectometer}
+\getvalue{\v!unit} [kMeter] {\Kilo \Meter} {kilometer}
+
+%D After some discussion on the \CONTEXT\ mailing list in
+%D february 2002 it was decided to go from L to l for liters
+%D (Karel Wesselings alternative: \mathematics{\ell}).
+
+\getvalue{\v!unit} [Liter] {l} {liter}
+\getvalue{\v!unit} [mLiter] {\Milli \Liter} {milliliter}
+\getvalue{\v!unit} [cLiter] {\Centi \Liter} {centiliter}
+\getvalue{\v!unit} [dLiter] {\Deci \Liter} {deciliter}
+
+%D Next we define time related units (\type {\ifSI} still dutch only).
+
+\getvalue{\v!unit} [Sec] {s} {\labeltext{u:sec}}
+\getvalue{\v!unit} [fSec] {\Femto \Sec} {\labeltext{u:fsec}}
+\getvalue{\v!unit} [pSec] {\Pico \Sec} {\labeltext{u:psec}}
+\getvalue{\v!unit} [nSec] {\Nano \Sec} {\labeltext{u:nsec}}
+\getvalue{\v!unit} [uSec] {\Micro \Sec} {\labeltext{u:usec}}
+\getvalue{\v!unit} [mSec] {\Milli \Sec} {\labeltext{u:msec}}
+\getvalue{\v!unit} [Year] {\ifSIunits a \else j\fi} {\labeltext{u:year}}
+\getvalue{\v!unit} [Month] {m} {\labeltext{u:month}}
+\getvalue{\v!unit} [Week] {w} {\labeltext{u:week}}
+\getvalue{\v!unit} [Day] {d} {\labeltext{u:day}}
+\getvalue{\v!unit} [Hour] {\ifSIunits h \else u\fi} {\labeltext{u:hour}}
+\getvalue{\v!unit} [Min] {min} {\labeltext{u:min}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:sec=seconde,
+ u:psec=picoseconde,
+ u:fsec=femtoseconde,
+ u:nsec=nanoseconde,
+ u:usec=microseconde,
+ u:msec=milliseconde,
+ u:year=jaar,
+ u:month=maand,
+ u:week=week,
+ u:day=dag,
+ u:hour=uur,
+ u:min=minuten]
+
+\setuplabeltext
+ [\s!en]
+ [u:sec=second,
+ u:fsec=femtosecond,
+ u:psec=picosecond,
+ u:nsec=nanosecond,
+ u:usec=microsecond,
+ u:msec=millisecond,
+ u:year=year,
+ u:month=month,
+ u:week=week,
+ u:day=day,
+ u:hour=hour,
+ u:min=minutes]
+
+\setuplabeltext
+ [\s!de]
+ [u:sec=Sekunde,
+ u:fsec=Femtosekunde,
+ u:psec=Picosekunde,
+ u:nsec=Nanosekunde,
+ u:usec=Microsekunde,
+ u:msec=Millisekunde,
+ u:year=Jahr,
+ u:month=Monat,
+ u:week=Woche,
+ u:day=Tag,
+ u:hour=Stunde,
+ u:min=Minuten]
+
+\setuplabeltext
+ [\s!it]
+ [u:sec=secondo,
+ u:fsec=femtosecondo,
+ u:psec=picosecondo,
+ u:nsec=nanosecondo,
+ u:usec=microsecondo,
+ u:msec=millisecondo,
+ u:year=anno,
+ u:month=mese,
+ u:week=settimana,
+ u:day=giorno,
+ u:hour=ora,
+ u:min=minuti]
+
+%D Then we define some angles.
+
+\getvalue{\v!unit} [Rad] {rad} {\labeltext{u:rad}}
+\getvalue{\v!unit} [Deg] {{\mathematics{^\circ}}} {\labeltext{u:deg}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:rad=hoek radialen,
+ u:deg=hoek graden]
+
+\setuplabeltext
+ [\s!en]
+ [u:rad=angle radians,
+ u:deg=angle degrees]
+
+\setuplabeltext
+ [\s!de]
+ [u:rad=Bogenma\SS,
+ u:deg=Gradma\SS]
+
+\setuplabeltext
+ [\s!it]
+ [u:rad=radianti,
+ u:deg=angoli sessagesimali]
+
+%D Rotation and frequency related units are defined by:
+
+\getvalue{\v!unit} [Hertz] {Hz} {Hertz}
+\getvalue{\v!unit} [kHertz] {\Kilo \Hertz} {kilo Hertz}
+\getvalue{\v!unit} [MHertz] {\Mega \Hertz} {mega Hertz}
+\getvalue{\v!unit} [GHertz] {\Giga \Hertz} {giga Hertz}
+\getvalue{\v!unit} [THertz] {\Tera \Hertz} {tera Hertz}
+\getvalue{\v!unit} [mHertz] {\Milli \Hertz} {milli Hertz}
+
+\getvalue{\v!unit} [RevPerSec] {RPS} {\labeltext{u:rps}}
+\getvalue{\v!unit} [RevPerMin] {RPM} {\labeltext{u:rpm}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:rps=omwentelingen per seconde,
+ u:rpm=omwentelingen per minuut]
+
+\setuplabeltext
+ [\s!en]
+ [u:rps=revolutions per second,
+ u:rpm=revolutions per minute]
+
+\setuplabeltext
+ [\s!de]
+ [u:rps=Umdrehungen pro Sekunde,
+ u:rpm=Umdrehungen pro Minute]
+
+\setuplabeltext
+ [\s!it]
+ [u:rps=giri al secondo,
+ u:rpm=giri al minuto]
+
+%D Mass and force:
+
+\getvalue{\v!unit} [Gram] {g} {gram}
+\getvalue{\v!unit} [uGram] {\Micro \Gram} {microgram}
+\getvalue{\v!unit} [mGram] {\Milli \Gram} {milligram}
+\getvalue{\v!unit} [kGram] {\Kilo \Gram} {kilogram}
+\getvalue{\v!unit} [Atom] {u} {\labeltext{u:u}}
+
+\getvalue{\v!unit} [Newton] {N} {Newton}
+\getvalue{\v!unit} [kNewton] {\Kilo \Newton} {kilo Newton}
+
+\getvalue{\v!unit} [Pascal] {Pa} {Pascal}
+\getvalue{\v!unit} [mPascal] {\Milli \Pascal} {milli Pascal}
+\getvalue{\v!unit} [kPascal] {\Kilo \Pascal} {kilo Pascal}
+
+\setuplabeltext
+ [\s!nl]
+ [u:u=atomaire massa eenheid]
+
+\setuplabeltext
+ [\s!en]
+ [u:u=atom mass unit]
+
+\setuplabeltext
+ [\s!de]
+ [u:u=Atomare Masseneinheit]
+
+\setuplabeltext
+ [\s!it]
+ [u:u=unit\`a di massa atomica]
+
+%D Energy units comes in two alternatives:
+
+\getvalue{\v!unit} [Joule] {J} {Joule}
+\getvalue{\v!unit} [mJoule] {\Milli \Joule} {milli Joule}
+\getvalue{\v!unit} [kJoule] {\Kilo \Joule} {kilo Joule}
+\getvalue{\v!unit} [MJoule] {\Mega \Joule} {mega Joule}
+\getvalue{\v!unit} [GJoule] {\Giga \Joule} {giga Joule}
+
+\getvalue{\v!unit} [Watt] {W} {Watt}
+\getvalue{\v!unit} [mWatt] {\Milli \Watt} {milli Watt}
+\getvalue{\v!unit} [kWatt] {\Kilo \Watt} {kilo Watt}
+\getvalue{\v!unit} [MWatt] {\Mega \Watt} {mega Watt}
+\getvalue{\v!unit} [GWatt] {\Giga \Watt} {giga Watt}
+\getvalue{\v!unit} [TWatt] {\Tera \Watt} {tera Watt}
+
+%D Although Celsius is no longer permitted, we define it by
+%D saying:
+
+\getvalue{\v!unit} [Celsius] {C} {Celsius}
+\getvalue{\v!unit} [Kelvin] {K} {Kelvin}
+\getvalue{\v!unit} [Fahrenheit] {F} {Fahrenheit}
+
+%D Some chemic related units are:
+
+\getvalue{\v!unit} [Mol] {mol} {mol}
+\getvalue{\v!unit} [mMol] {\Milli \Mol} {millimol}
+\getvalue{\v!unit} [kMol] {\Kilo \Mol} {kilomol}
+\getvalue{\v!unit} [Molair] {M} {molair (\Mol \Per \Liter)}
+\getvalue{\v!unit} [Equivalent] {eq} {equivalent}
+\getvalue{\v!unit} [mEquivalent] {\Milli \Equivalent} {milli equivalent}
+
+%D There are quite a lot units related to electricity and
+%D magnetism:
+
+\getvalue{\v!unit} [Farad] {F} {Farad}
+\getvalue{\v!unit} [pFarad] {\Pico \Farad} {pico Farad}
+\getvalue{\v!unit} [nFarad] {\Nano \Farad} {nano Farad}
+\getvalue{\v!unit} [uFarad] {\Micro \Farad} {micro Farad}
+\getvalue{\v!unit} [mFarad] {\Milli \Farad} {milli Farad}
+
+\getvalue{\v!unit} [Ohm] {\Omega} {Ohm}
+\getvalue{\v!unit} [kOhm] {\Kilo \Ohm} {kilo Ohm}
+
+\getvalue{\v!unit} [Siemens] {S} {Siemens}
+
+\getvalue{\v!unit} [Ampere] {A} {Amp\`ere}
+\getvalue{\v!unit} [mAmpere] {\Milli \Ampere} {milli Amp\`ere}
+
+\getvalue{\v!unit} [Coulomb] {C} {Coulomb}
+
+\getvalue{\v!unit} [Volt] {V} {Volt}
+\getvalue{\v!unit} [mVolt] {\Milli \Volt} {milli Volt}
+\getvalue{\v!unit} [kVolt] {\Kilo \Volt} {kilo Volt}
+\getvalue{\v!unit} [eVolt] {eV} {electronvolt}
+\getvalue{\v!unit} [keVolt] {\Kilo \eVolt} {kilo electronvolt}
+\getvalue{\v!unit} [MeVolt] {\Mega \eVolt} {mega electronvolt}
+
+\getvalue{\v!unit} [Tesla] {T} {Tesla}
+
+\getvalue{\v!unit} [VoltAC] {V_{\xbox{ac}}} {\labeltext{u:vac}}
+\getvalue{\v!unit} [VoltDC] {V_{\xbox{dc}}} {\labeltext{u:vdc}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:vac=wisselspanning,
+ u:vdc=gelijkspanning]
+
+\setuplabeltext
+ [\s!en]
+ [u:vac=alternating current,
+ u:vdc=direct current]
+
+\setuplabeltext
+ [\s!de]
+ [u:vac=Wechselspannung,
+ u:vdc=Gleichspannung]
+
+\setuplabeltext
+ [\s!it]
+ [u:vac=corrente alternata,
+ u:vdc=corrente continua]
+
+%D Computer memory is specified in Bytes:
+
+\getvalue{\v!unit} [Baud] {Baud} {Baud (Bit/s)}
+\getvalue{\v!unit} [Bit] {Bit} {Bit}
+
+\getvalue{\v!unit} [Byte] {Byte} {Byte}
+\getvalue{\v!unit} [kByte] {\Kilo \Byte} {kilo Byte}
+\getvalue{\v!unit} [MByte] {\Mega \Byte} {mega Byte}
+\getvalue{\v!unit} [GByte] {\Giga \Byte} {giga Byte}
+\getvalue{\v!unit} [TByte] {\Tera \Byte} {tera Byte}
+
+%D Some radiation related units:
+
+\getvalue{\v!unit} [Bequerel] {Bq} {Bequerel}
+\getvalue{\v!unit} [MBequerel] {\Mega \Bequerel} {Bequerel}
+\getvalue{\v!unit} [Sievert] {Sv} {Sievert}
+\getvalue{\v!unit} [mSievert] {\Milli \Sievert} {milli Sievert}
+
+%D Light:
+
+\getvalue{\v!unit} [Candela] {cd} {Candela}
+
+%D and some sound ones:
+
+\getvalue{\v!unit} [Bell] {B} {Bell}
+\getvalue{\v!unit} [dBell] {\Deci \Bell} {decibel}
+
+%D We also define some non||regular, sometimes even forbidden,
+%D units:
+
+\getvalue{\v!unit} [At] {at} {\labeltext{u:at}}
+\getvalue{\v!unit} [Atm] {atm} {\labeltext{u:atm}}
+\getvalue{\v!unit} [Bar] {bar} {bar (100 \Kilo \Pascal)}
+\getvalue{\v!unit} [EVolt] {eV} {electronvolt}
+\getvalue{\v!unit} [Foot] {ft} {\labeltext{u:ft}}
+\getvalue{\v!unit} [Inch] {inch} {inch}
+\getvalue{\v!unit} [Cal] {cal} {\labeltext{u:cal}}
+\getvalue{\v!unit} [Force] {f} {\labeltext{u:f}}
+\getvalue{\v!unit} [kCal] {\Kilo \Cal} {\labeltext{u:kcal}}
+\getvalue{\v!unit} [Lux] {lux} {lux}
+
+
+\def\xPercent {\dimensionaddfix{\percent }}
+\def\xPromille{\dimensionaddfix{\promille}}
+
+\getvalue{\v!unit} [Percent] {\xPercent } {percent}
+\getvalue{\v!unit} [Permille] {\xPromille} {promille}
+\getvalue{\v!unit} [Promille] {\xPromille} {promille}
+
+%D Some more, thanks to Tobias:
+
+\getvalue{\v!unit} [Gray] {Gr} {Gray}
+\getvalue{\v!unit} [Weber] {Wb} {Weber}
+\getvalue{\v!unit} [Henry] {H} {Henry}
+\getvalue{\v!unit} [Sterant] {sr} {Sterant}
+\getvalue{\v!unit} [Angstrom] {\hbox{\Aring}} {\Aring ngstr\"om}
+\getvalue{\v!unit} [Gauss] {G} {Gauss}
+
+\setuplabeltext
+ [\s!nl]
+ [u:at=technische atmosfeer,
+ u:atm=fysische atmosfeer,
+ u:ft=voet,
+ u:cal=calorie,
+ u:f=kracht (force),
+ u:kcal=kilocalorie]
+
+\setuplabeltext
+ [\s!en]
+ [u:at=technical atmosferic pressure,
+ u:atm=physical atmosferic pressure,
+ u:ft=foot,
+ u:cal=calory,
+ u:f=force,
+ u:kcal=kilocalory]
+
+\setuplabeltext
+ [\s!de]
+ [u:at=Technischer atmosph\"arischer Druck,
+ u:atm=physkalischer atmosph\"arischer Druck
+ u:ft=Fu\SS,
+ u:cal=Kalorien,
+ u:f=Force,
+ u:kcal=Kilokalorien]
+
+\setuplabeltext
+ [\s!it]
+ [u:at=pressione atmosferica tecnica,
+ u:atm=pressione atmosfera fisica,
+ u:ft=piede,
+ u:cal=caloria,
+ u:f=forza,
+ u:kcal=chilocaloria]
+
+%D Here are some old ones, still there for compatibility
+%D reasons. These will probably be obsolete in a few years.
+
+\def\MeterTwee {\Square \Meter}
+\def\mMeterTwee {\Square \Milli \Meter}
+\def\cMeterTwee {\Square \Centi \Meter}
+\def\dMeterTwee {\Square \Deci \Meter}
+\def\kMeterTwee {\Square \Kilo \Meter}
+
+\def\MeterDrie {\Cubic \Meter}
+\def\mMeterDrie {\Cubic \Milli \Meter}
+\def\cMeterDrie {\Kubic \Centi \Meter}
+\def\dMeterDrie {\Cubic \Deci \Meter}
+\def\kMeterDrie {\Cubic \Kilo \Meter}
+
+\def\LiterTwee {\Square \Liter}
+\def\SecTwee {\Square \Sec}
+\def\SecMinEen {\Inverse \Sec}
+
+%D To make ourselves happy, we define some dutch specific
+%D units:
+
+\startinterface dutch
+
+ \getvalue{\v!unit} [PaardenKracht] {pk} {paardenkracht}
+ \getvalue{\v!unit} [Duits] {D} {duits}
+ \getvalue{\v!unit} [Kwik] {Hg} {kwikkolom}
+ \getvalue{\v!unit} [Hectare] {ha} {hectare}
+ \getvalue{\v!unit} [kGramForce] {\Kilo \Gram \Force} {kilogramforce}
+ \getvalue{\v!unit} [kWattUur] {\Kilo \Watt \Uur} {kilowattuur}
+ \getvalue{\v!unit} [MeterKwik] {\Meter \Kwik} {meter kwikkolom}
+ \getvalue{\v!unit} [Waterkolom] {WK} {waterkolom}
+ \getvalue{\v!unit} [MeterWater] {\Meter \Waterkolom} {meter waterkolom}
+ \getvalue{\v!unit} [DrogeStof] {ds} {droge stof}
+ \getvalue{\v!unit} [Normaal] {N} {normaal}
+
+ \getvalue{\v!unit} [Ton] {t} {ton}
+ \getvalue{\v!unit} [kTon] {\Kilo \Ton} {kiloton}
+
+ \let \OmwPerSec \RevPerSec
+ \let \OmwPerMin \RevPerMin
+ \let \Graden \Deg
+ \let \PaardeKracht \PaardenKracht
+ \let \Atoom \Atom
+ \let \Heure \Hour
+ \let \Jaar \Year
+ \let \Maand \Month
+ \let \Dag \Day
+ \let \Uur \Hour
+
+\stopinterface
+
+%D Finally we define some equivalents. By using \type {\let}
+%D we can be sure that they don't end up double in the lists of
+%D units.
+
+\let \Second \Sec
+\let \Kubic \Cubic
+\let \IKubic \ICubic
+
+%D Option:
+
+% \def\Micro{\dimensionprefix{\iftextdimensions\mathematics\mu \else\mu \fi}}
+% \def\Times{\dimensionnopfix{\iftextdimensions\mathematics\cdot\else\cdot\fi}}
+
+\protect \endinput
diff --git a/tex/context/base/m-visual.tex b/tex/context/base/m-visual.tex
new file mode 100644
index 000000000..d78455190
--- /dev/null
+++ b/tex/context/base/m-visual.tex
@@ -0,0 +1,316 @@
+%D \module
+%D [ file=m-visual,
+%D version=2000.01.10,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Visualization and Faking,
+%D author={Hans Hagen \& Ton Otten},
+%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
+
+%D This module collect a few more visual debugger features. I
+%D needed them for manuals and styles. The macros are documented
+%D in a my way document.
+
+%D For Mojca:
+%D
+%D \starttyping
+%D \def\simplethesis
+%D {\setupsystem[random=1234]
+%D \title{\fakewords{3}{4}}
+%D \placelist[chapter,section]
+%D \dorecurse{6}
+%D {\chapter{\fakewords{5}{10}}
+%D \dorecurse{5}
+%D {\section{\fakewords{2}{5}}
+%D \dorecurse{2}
+%D {\dorecurse{3}{\fakewords{100}{200}\endgraf}
+%D \placefigure{\fakewords{8}{15}}{\fakefigure{5cm}{3cm}{10cm}{5cm}}
+%D \dorecurse{2}{\fakewords{100}{200}\endgraf}}}}}
+%D
+%D \starttext
+%D \simplethesis
+%D \stoptext
+%D \stoptyping
+
+\definecolor[fakerulecolor] [black]
+\definecolor[fakebaselinecolor] [green]
+\definecolor[fakeparindentcolor][blue]
+
+\newif\iffakebaseline \fakebaselinetrue
+
+\def\fakerule#1%
+ {\strut
+ \startcolor[fakerulecolor]%
+ \iffakebaseline
+ \vrule\!!height1.25ex\!!depth-.05ex\!!width#1%
+ \kern-#1%
+ \vrule\!!height-.05ex\!!depth .25ex\!!width#1%
+ \else
+ \vrule\!!height1.25ex\!!depth .25ex\!!width#1%
+ \fi
+ \stopcolor
+ \allowbreak}
+
+\def\dorandomrecurse#1%
+ {\getrandomcount\scratchcounter{1}{#1}%
+ \dorecurse\scratchcounter}
+
+% can be used in hbox, so %'s are really needed
+
+\unexpanded\def\fakelines#1#2% min max / 3 10
+ {\fakeparindent
+ \scratchdimen\hsize
+ \ifindentation
+ \advance\scratchdimen -\parindent
+ \fi
+ \fakerule\scratchdimen\break
+ \getrandomcount\scratchcounter{\ifcase0#1 3\else#1\fi}{\ifcase0#2 10\else#2\fi}%
+ \dorecurse\scratchcounter{\fakerule\hsize}%
+ \getrandomdimen\scratchdimen{.25\hsize}\hsize
+ \fakerule\scratchdimen
+ \par} % indeed
+
+\unexpanded\def\fakewords
+ {\ifvmode\fakeparindent\fi\onlyfakewords}
+
+\definepalet
+ [fakerule]
+ [fr1c=darkred,
+ fr2c=darkgreen,
+ fr3c=darkblue,
+ fr4c=darkyellow,
+ fr5c=darkgray]
+
+\unexpanded\def\onlyfakewords#1#2% min max / 10 40
+ {\getrandomcount\scratchcounter{\ifcase0#1 10\else#1\fi}{\ifcase0#2 40\else#2\fi}%
+ \dofakewords\scratchcounter
+ } % no \par
+
+\unexpanded\def\fakenwords#1#2% words seed
+ {\fakeparindent
+ \getrandomseed\fakedwordseed
+ \setrandomseed{\ifcase0#2 #1\else#2\fi}%
+ \dofakewords{#1}%
+ \setrandomseed\fakedwordseed
+ } % no \par
+
+\def\dofakewords#1%
+ {\bgroup
+ \dorecurse{#1}
+ {\getrandomcount\scratchcounter{1}{5}%
+ \dorecurse\scratchcounter
+ {\getrandomdimen\scratchdimen{.5em}{1.25em}%
+ \fakerule\scratchdimen}%
+ \space}%
+ \removeunwantedspaces
+ \egroup}
+
+\def\doshowfakewords#1%
+ {\bgroup
+ \setuppalet[fakerule]%
+ \definecolor[fakerulecolor]%
+ \dorecurse{#1}
+ {\getrandomcount\scratchcounter{1}{5}%
+ \dorecurse\scratchcounter
+ {\getrandomdimen\scratchdimen{.5em}{1.25em}%
+ \color[fr\recurselevel c]{\fakerule\scratchdimen}}%
+ \space}%
+ \removeunwantedspaces
+ \egroup}
+
+\def\showfakewords{\let\dofakewords\doshowfakewords}
+
+\def\fakeword
+ {\fakewords{1}{1}} % no \plusone
+
+\def\fakeparindent
+ {\noindent
+ \ifindentation
+ \ifx\dofakedroppedcaps\relax
+ {\fakeparindentcolor
+ \vrule
+ \!!height \strutheight % not longer .5ex
+ \!!depth \strutdepth % not longer 0pt
+ \!!width \parindent}%
+ \else
+ \dofakedroppedcaps \let\dofakedroppedcaps\relax
+ \fi
+% \else
+% \dontleavehmode
+ \fi}
+
+\let\dofakedroppedcaps\relax
+
+\unexpanded\def\fakedroppedcaps#1%
+ {\ifnum#1>0
+ \def\dofakedroppedcaps
+ {\setbox\scratchbox\hbox
+ {\setbox\scratchbox\hbox{W}%
+ \scratchdimen#1\lineheight
+ \advance\scratchdimen -\lineheight
+ \advance\scratchdimen \dp\strutbox
+ \vrule
+ \!!width#1\wd\scratchbox
+ \!!height\ht\scratchbox
+ \!!depth\scratchdimen}%
+ \ht\scratchbox\ht\strutbox
+ \dp\scratchbox\dp\strutbox
+ \hangindent\wd\scratchbox
+ \advance\hangindent .5em
+ \wd\scratchbox\hangindent
+ \hangafter-#1\noindent
+ \llap{\fakeparindentcolor\box\scratchbox}}%
+ \fi}
+
+\newcounter\noffakedfigures
+
+\unexpanded\def\showfakefigure
+ {\donetrue\dodoubleempty\dofakefigure}
+
+\unexpanded\def\fakefigure
+ {\donefalse\dodoubleempty\dofakefigure}
+
+\def\dofakefigure[#1][#2]#3#4#5#6% [] [] minwidth maxwidth minheight maxheight
+ {\doglobal\increment\noffakedfigures
+ \ifdone
+ \endgraf
+ \hbox to \hsize
+ {\hss\fakeparindentcolor
+ \strut\bf Figure \noffakedfigures
+ \doifsomething{#1}{\space(#1)}%
+ \hss}
+ \endgraf
+ \fi
+ \getvalue{\e!place\v!figure}
+ [#1][#2]%
+ {\freezerandomseed
+ \let\endstrut\relax
+ \let\begstrut\relax
+ \doifinsetelse{#1}{\v!left,\v!right}
+ {\fakewords{2}{4}}
+ {\fakewords{4}{10}}}%
+ {\getrandomdimen{\dimen0}{#3}{#4}%
+ \getrandomdimen{\dimen2}{#5}{#6}%
+ \doifinset{#1}{\v!left,\v!right}
+ {\dimen0=.75\dimen0
+ \ifdim\dimen0>.6\hsize \dimen0=.5\hsize\fi
+ \ifdim\dimen0<.3\hsize \dimen0=.3\hsize\fi}%
+ \framed
+ [\c!width=\dimen0,
+ \c!height=\dimen2,
+ \c!frame=\ifincolor\v!off\else\v!on\fi,
+ \c!background=\v!color,
+ \c!backgroundcolor=fakeparindentcolor]
+ {\bf\white#1}}%
+ \defrostrandomseed}
+
+\def\fakeformula
+ {\dimen0\zeropoint
+ \getrandomcount\scratchcounter{3}{6}%
+ \dorecurse\scratchcounter
+ {\getrandomdimen\scratchdimen{1em}{3em}%
+ \mathinner{\red\fakerule\scratchdimen}%
+ \ifnum\recurselevel<\scratchcounter+\fi
+ \advance\scratchdimen\dimen0}%
+ =\mathinner{\red\fakerule\scratchdimen}}
+
+\def\fakespacingformula
+ {\color[fakebaselinecolor]{\ruledbaseline}\fakeformula}
+
+%D test \type{\bodyfontgrid}\space test
+%D test \type{\emexgrid} \space test
+
+
+\def\smashedgrid
+ {\dosingleempty\dosmashedgrid}
+
+\def\dosmashedgrid[#1]%
+ {\hsmashed
+ {\setbox\scratchbox=\hbox
+ {\basegrid
+ [\c!nx=10,\c!ny=10,\c!dx=1,\c!dy=1,
+ \c!unit=\bodyfontsize,#1]}%
+ \hbox to \zeropoint
+ {\hss\lower.5\ht\scratchbox\box\scratchbox\hss}%
+ \hbox to \zeropoint
+ {\hss
+ \black\vrule\!!width6\linewidth\!!height3\linewidth\!!depth3\linewidth
+ \hss}}}
+
+\def\bodyfontgrid
+ {\hbox
+ {{\linewidth.1pt\yellow\smashedgrid[\c!nx=30,\c!ny=30,\c!scale=.3333]}%
+ {\linewidth.2pt\green \smashedgrid[\c!nx=20,\c!ny=20,\c!scale=.5]}%
+ {\linewidth.3pt\red \smashedgrid[\c!nx=10,\c!ny=10,\c!scale=1]}}}
+
+\def\emexgrid
+ {\hbox
+ {{\linewidth.15pt\green\smashedgrid[\c!nx=20,\c!ny=20,\c!unit=ex]}%
+ {\linewidth.15pt\red \smashedgrid[\c!nx=10,\c!ny=10,\c!unit=em]}}}
+
+%D The next few macros are not really public and kind of low
+%D level. They are obscure and a bit perverse.
+
+\definecolor[llblack][s=0.01]
+
+\def\lowlevelstream#1#2#3%
+ {\ifinotr \else
+ \dontleavehmode
+ \prewordbreak
+ \bgroup\bgroup % make sure aftergroup stuff is handled
+ %\let#1#2\optimizetransparencyfalse\black
+ \infofont\clap{\vl}\ignorespaces#3\unskip\clap{\vl}%
+ \egroup\egroup
+ \prewordbreak
+ \fi
+ #2{#3}}
+
+\let\normalPDFcode\PDFcode
+
+\def\showlowlevelstream
+ {\def\PDFcode{\lowlevelstream\PDFcode\normalPDFcode}%
+ \def\special{\lowlevelstream\special\normalspecial}}
+
+\def\showlowlevelstreamonly
+ {\def\PDFcode{\lowlevelstream\PDFcode\gobbleoneargument}%
+ \def\special{\lowlevelstream\special\gobbleoneargument}}
+
+\startnotmode[mkiv]
+
+ \let\normaldostartgraymode \dostartgraymode
+ \let\normaldostartgraycolormode\dostartgraycolormode
+ \let\normaldostartrgbcolormode \dostartrgbcolormode
+ \let\normaldostartcmykcolormode\dostartcmykcolormode
+ \let\normaldostartspotcolormode\dostartspotcolormode
+
+ \def\traceddostartgraymode#1%
+ {#1\normaldostartgraymode{#1}}
+
+ \def\traceddostartgraycolormode#1%
+ {#1\normaldostartgraycolormode{#1}}
+
+ \def\traceddostartrgbcolormode#1#2#3%
+ {#1 #2 #3\normaldostartrgbcolormode{#1}{#2}{#3}}
+
+ \def\traceddostartcmykcolormode#1#2#3#4%
+ {#1 #2 #3 #4\normaldostartcmykcolormode{#1}{#2}{#3}{#4}}
+
+ \def\traceddostartspotcolormode#1#2%
+ {#1 #2\normaldostartspotcolormode{#1}{#2}}
+
+ \def\showcolormodes
+ {\let\dostartgraymode \traceddostartgraymode
+ \let\dostartgraycolormode\traceddostartgraycolormode
+ \let\dostartrgbcolormode \traceddostartrgbcolormode
+ \let\dostartcmykcolormode\traceddostartcmykcolormode
+ \let\dostartspotcolormode\traceddostartspotcolormode}
+
+\stopnotmode
+
+\protect \endinput
diff --git a/tex/context/base/math-ali.mkiv b/tex/context/base/math-ali.mkiv
new file mode 100644
index 000000000..31f71219a
--- /dev/null
+++ b/tex/context/base/math-ali.mkiv
@@ -0,0 +1,1296 @@
+%D \module
+%D [ file=math-ali,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Math Alignments,
+%D author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Math Macros / Math Alignments}
+
+\unprotect
+
+%D The code here has been moved from other files. Beware: the \MKII\ and
+%D \MKIV\ code is not gathered in files with the same name.
+
+%D \macros
+%D {definemathalignment, setupmathalignment, startmathalignment}
+%D
+%D Modules may provide additional alignment features. The following
+%D mechanisms are provided by the core.
+
+% n>1 #### needed, strange # interaction in recurse
+
+\def\presetdisplaymath{\displ@y} % some day i will relocate the plain stuff
+
+\def\buildeqalign
+ {\scratchtoks\emptytoks
+ \dorecurse{\mathalignmentparameter\c!m}
+ {\ifnum\recurselevel>\plusone
+ \appendtoks
+ \tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint
+ \to\scratchtoks
+ \fi
+ \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}%
+ \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax}
+ {\normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}}%
+ \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}}
+
+\def\forgetalign
+ {\tabskip\zeropoint\everycr\emptytoks}
+
+\let\firstineqalign\empty
+\let\nextineqalign \empty
+\let\leftofeqalign \empty
+\let\rightofeqalign\empty
+
+\def\mathineqalign#1{$\forgetalign\displaystyle{{}#1{}}$}
+\def\textineqalign#1{$\forgetalign#1$}
+
+\def\eqalign#1% why no halign here, probably because of displaywidth
+ {\null\,\vcenter
+ {\openup.25\bodyfontsize% was: \openup\jot
+ \mathsurround\zeropoint
+ \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##{}}$\hfil\crcr#1\crcr}%
+ }\,}
+
+% preamble is scanned for tabskips so we need the span to prevent an error message
+
+\chardef\eqalignmode\plusone
+
+\def\preparereqalignno
+ {\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ \ifnum\mathraggedstatus=\plusone
+ \!!toksc{\hfil&\span\textineqalign{##}\tabskip\zeropoint}%
+ \else\ifnum\mathraggedstatus=\plusthree
+ \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\span\textineqalign{##}\tabskip\zeropoint}%
+ \else
+ \!!toksc{\hfil\tabskip\centering&\llap{\span\textineqalign{##}}\tabskip\zeropoint}%
+ \fi\fi
+ \global\chardef\mathnumberstatus\zerocount
+ \buildeqalign
+ \presetdisplaymath
+ \tabskip\centering}
+
+\def\prepareleqalignno
+ {\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ % problem: number is handled after rest and so ends up in the margin
+ \ifnum\mathraggedstatus=\plusone
+ \!!toksc{\hfil&\kern-\displaywidth\rlap{\span\textineqalign{##}}\tabskip\displaywidth}%
+ \else\ifnum\mathraggedstatus=\plusthree
+ \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\kern-\displaywidth\span\mrlap{\span\textineqalign{##}}\tabskip\displaywidth}%
+ \else
+ \!!toksc{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span\textineqalign{##}}\tabskip\displaywidth}%
+ \fi\fi
+ \global\chardef\mathnumberstatus\zerocount
+ \buildeqalign
+ \presetdisplaymath
+ \tabskip\centering}
+
+\def\dobotheqalignno#1#2%
+ {\ifmmode
+ \displ@y % \let\doplaceformulanumber\relax % strange hack
+ \vcenter\bgroup
+ \let\finishalignno\egroup
+ \else
+ \let\finishalignno\relax
+ \fi
+ #1%
+ \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA {\the\scratchtoks\crcr#2\crcr}%
+ \finishalignno}
+
+\def\dobothaligneqalignno#1%
+ {\ifmmode
+ \displ@y
+ \global\chardef\mathnumberstatus\plusone
+ \ifcase\mathraggedstatus
+ \def\finishalignno{\crcr\egroup}%
+ \else
+ % we're in a mathbox
+ \vcenter\bgroup
+ \def\finishalignno{\crcr\egroup\egroup}%
+ \fi
+ \fi
+ #1%
+ \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA \bgroup\the\scratchtoks\crcr}
+
+\def\mrlap#1%
+ {\setbox\scratchbox\hbox{#1}%
+ \ifdim\wd\scratchbox>\mathnumbercorrection
+ \xdef\mathnumbercorrection{\the\wd\scratchbox}%
+ \fi
+ \box\scratchbox
+ \global\chardef\mathnumberstatus\plustwo}
+
+% \def\dobothaligneqalignno#1%
+% {\ifmmode
+% \displ@y
+% \global\chardef\mathnumberstatus\plusone
+% we're in a mathbox
+% \vcenter\bgroup
+% \def\finishalignno{\crcr\egroup\egroup}%
+% \else
+% \def\finishalignno{\crcr\egroup}%
+% \fi
+% #1%
+% \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA \bgroup\the\scratchtoks\crcr}
+
+\def\reqalignno {\dobotheqalignno \preparereqalignno}
+\def\leqalignno {\dobotheqalignno \prepareleqalignno}
+\def\alignreqalignno{\dobothaligneqalignno\preparereqalignno}
+\def\alignleqalignno{\dobothaligneqalignno\prepareleqalignno}
+\def\finishalignno {\crcr\egroup}
+
+\let \equalignno \reqalignno
+\let\aligneqalignno\alignreqalignno
+
+%D Here we implement the user interface part.
+
+\unexpanded\def\setupmathalignment
+ {\dodoubleempty\dosetupmathalignment}
+
+\def\dosetupmathalignment[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??eq#1][#2]%
+ \else
+ \getparameters[\??eq][#1]%
+ \fi}
+
+\let\currentmathalignment\empty
+
+\def\mathalignmentparameter#1%
+ {\executeifdefined{\??eq\currentmathalignment#1}{\executeifdefined{\??eq#1}\empty}}
+
+\setupmathalignment
+ [\c!n=2,
+ \c!m=1,
+ \c!distance=1em]
+
+\def\numberedeqalign
+ {\doifelse{\formulaparameter\c!location}\v!left\alignleqalignno\alignreqalignno}
+
+\def\doxxdoubleempty#1#2%
+ {\ifx#2[\expandafter\dodoxxdoubleempty\else\expandafter\noxxdoubleempty\fi#1#2}
+
+\def\dodoxxdoubleempty#1[#2]#3%
+ {\ifx#3[\else\expandafter\nonoxxdoubleempty\fi#1[#2]#3}
+
+\def\noxxdoubleempty #1{#1[][]}
+\def\nonoxxdoubleempty#1[#2]{#1[#2][]}
+
+\newcount\eqaligncolumn
+
+\def\firstineqalign{\global\eqaligncolumn\plusone}
+\def\nextineqalign {\global\advance\eqaligncolumn\plusone}
+\def\leftofeqalign {\getvalue{\??eq:\v!left :\number\eqaligncolumn}}
+\def\rightofeqalign{\getvalue{\??eq:\v!right:\number\eqaligncolumn}}
+
+\def\doseteqaligncolumn#1%
+ {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\empty
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\empty
+ \doif{#1}\v!left {\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill}%
+ \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}%
+ \doif{#1}\v!middle{\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill
+ \letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}}
+
+\def\dodoalignNC
+ {\gdef\doalignNC##1{&##1}}
+
+\def\doalignNR[#1][#2]%
+ {\donestedformulanumber{#1}{#2}\crcr}
+
+%D \starttyping
+%D \placeformula[eqn0]\startformula \startalign[n=1] a\NR \stopalign \stopformula See \in[eqn0]
+%D \placeformula[eqn1]\startformula \startalign[n=1] a\NR \stopalign \stopformula See \in[eqn1]
+%D \placeformula \startformula \startalign[n=1] a\NR[eqn2] \stopalign \stopformula See \in[eqn2]
+%D \placeformula[eqn3]\startformula \startalign[n=1] a\NR[+] \stopalign \stopformula See \in[eqn3]
+%D \stoptyping
+
+% todo: pop in cell
+
+\def\dostartmathalignment[#1][#2]%
+ {% \begingroup not permitted ($$...assignments...\halign... )
+ \pushmacro\doalignNC
+ \edef\currentmathalignment{#1}%
+ \doifassignmentelse{#2}{\setupmathalignment[#1][#2]}\donothing
+ \def\NC{\doalignNC}%
+ \global\let\doalignNC\dodoalignNC
+ \def\EQ{&=}%
+ \def\NR{&\global\let\doalignNC\dodoalignNC\doxxdoubleempty\doalignNR}%
+ % amstex compatibility mode: (ugly, will disappear)
+ \def\notag{\def\\{&\crcr}}%
+ \doifelse{#2}{*}{\def\\{&\crcr}}{\def\\{&\doalignNR[+][]\crcr}}%
+ % end of compatibility mode
+ \eqaligncolumn\zerocount
+ \processcommacommand
+ [\mathalignmentparameter\c!align]
+ {\advance\eqaligncolumn\plusone\doseteqaligncolumn}% takes argument
+ % the real action
+ \global\eqaligncolumn\plusone
+ \numberedeqalign}
+
+\def\dostopmathalignment
+ {\finishalignno
+ \popmacro\doalignNC}
+
+\unexpanded\def\definemathalignment
+ {\dodoubleempty\dodefinemathalignment}
+
+\def\dodefinemathalignment[#1]% [#2]%
+ {\setvalue{\e!start#1}{\dodoubleempty\dostartmathalignment[#1]}%
+ \setvalue{\e!stop #1}{\dostopmathalignment}%
+ \setupmathalignment[#1]}% [#2]
+
+%D For the moment we only provide english commands.
+
+\definemathalignment[align] % default case (this is what amstex users expect)
+\definemathalignment[\v!mathalignment] % prefered case (this is cleaner, less clashing)
+
+%D \startbuffer
+%D \placeformula \startformula \eqalignno {
+%D a &= b & \formulanumber \cr
+%D c &= d \cr
+%D &= e \cr
+%D &= f & \formulanumber
+%D } \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D \NC a \EQ b \NR[+]
+%D \NC c \EQ d \NR
+%D \NC \EQ f \NR[for:demo-a-1]
+%D \NC \EQ g \NR[for:demo-a-2][a]
+%D \NC \EQ h \NR[for:demo-a-3][b]
+%D \NC \EQ i \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D \NC a \EQ b \NR[+]
+%D \NC c \EQ d \NR
+%D \NC \EQ f \NR
+%D \NC \EQ g \NR
+%D \NC \EQ h \NR
+%D \NC \EQ i \NR[+]
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D a &= b \\
+%D c &= d \notag \\
+%D &= e \notag \\
+%D &= f \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D \NC a \NC \eq b \NR[+]
+%D \NC c \NC \neq d \NR
+%D \NC \NC \neq f \NR[for:demo-b-1]
+%D \NC \NC \geq g \NR[for:demo-b-2][a]
+%D \NC \NC \leq h \NR[for:demo-b-3][b]
+%D \NC \NC \neq i \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[*]
+%D a &= b \\
+%D c &= d \\
+%D &= e \\
+%D &= f \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D x &= y \\
+%D a &= b \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[m=3]
+%D x &= y & x &= y & z &= t \\
+%D a &= b & p &= q & w &= s \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[m=3,distance=0pt]
+%D x &= y &= x &= y &= z &= t \\
+%D a &= b &= p &= q &= w &= s \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=5,distance=0pt]
+%D x &= yy &= xx &= yy &= zz \\
+%D a &= b &= p &= q &= w \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=3,align={left,middle,right}]
+%D \NC l \NC = \NC r \NR
+%D \NC left \NC = \NC right \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=3,align={right,middle,left}]
+%D \NC l \NC = \NC r \NR
+%D \NC left \NC = \NC right \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=3,align={middle,middle,middle}]
+%D \NC l \NC = \NC r \NR
+%D \NC left \NC = \NC right \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula
+%D \startformula
+%D \startalign[n=3,align={middle,middle,middle}]
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula
+%D \startformulas
+%D \setupmathalignment[n=3,align={middle,middle,middle}]%
+%D \startformula
+%D \startalign
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula
+%D \startformula
+%D \startalign
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula
+%D \stopformulas
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula
+%D \startformulas
+%D \dorecurse{5}{\startformula
+%D \startalign[n=3,align={middle,middle,middle}]
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula}
+%D \stopformulas
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {definemathcases, setupmathcases, startmathcases}
+%D
+%D Another wish \unknown
+
+\unexpanded\def\setupmathcases
+ {\dodoubleempty\dosetupmathcases}
+
+\def\dosetupmathcases[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??ce#1][#2]%
+ \else
+ \getparameters[\??ce][#1]%
+ \fi}
+
+\let\currentmathcases\empty
+
+\def\mathcasesparameter#1%
+ {\executeifdefined{\??ce\currentmathcases#1}{\executeifdefined{\??ce#1}\empty}}
+
+\setupmathcases
+ [\c!distance=1em,
+ \c!numberdistance=2.5em,
+ \c!left={\left\{\,},
+ \c!right={\right.}]
+
+\def\dodocasesNC
+ {\gdef\docasesNC{\endmath&}}
+
+\let\docasesNR\doalignNR
+
+\def\dostartmathcases[#1][#2]%
+ {\begingroup
+ \edef\currentmathcases{#1}%
+ \doifassignmentelse{#2}{\setupmathcases[#1][#2]}\donothing
+ \mathcasesparameter\c!left
+ \vcenter\bgroup
+ \pushmacro\docasesNC
+ \let\endmath\relax
+ \def\NC{\docasesNC}%
+ \def\MC{\docasesNC\ifmmode\else$\def\endmath{$}\fi}%
+ \global\let\docasesNC\dodocasesNC
+ \def\NR{\unskip\endmath&\global\let\docasesNC\dodocasesNC\doxxdoubleempty\docasesNR}%
+ \normalbaselines
+ \mathsurround\zeropoint
+ \everycr\emptytoks
+ \tabskip\zeropoint
+ \global\eqaligncolumn\plusone
+ \halign\bgroup
+ $\mathcasesparameter\c!style##$\hfil
+ &\hskip\mathcasesparameter\c!distance\relax
+ \popmacro\docasesNC##\hfil
+ &\hskip\mathcasesparameter\c!numberdistance\relax
+ \let\formuladistance\!!zeropoint
+ \span\textineqalign{##}%
+ \crcr} % todo: number
+
+\def\dostopmathcases
+ {\crcr
+ \egroup
+ \popmacro\docasesNC
+ \egroup
+ \mathcasesparameter\c!right
+ \endgroup}
+
+\unexpanded\def\definemathcases
+ {\dodoubleempty\dodefinemathcases}
+
+\def\dodefinemathcases[#1]% [#2]%
+ {\setvalue{\e!start#1}{\dodoubleempty\dostartmathcases[#1]}%
+ \setvalue{\e!stop #1}{\dostopmathcases}%
+ \setupmathcases[#1]}% [#2]
+
+\definemathcases[cases]
+\definemathcases[\v!mathcases]
+
+%D \startbuffer
+%D \placeformula \startformula \startcases
+%D \NC 2 \NC $ y > 0 $ \NR
+%D \NC 7 \NC $ x = 7 $ \NR[+]
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula x \startcases
+%D \NC 2 \NC $ y > 0 $ \NR[+]
+%D \NC 7 \NC $ x = 7 $ \NR
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startcases
+%D \NC 2 \NC $ y > 0 $ \NR
+%D \NC 7 \NC $ x = 7 $ \NR
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula x \startcases
+%D \NC 2 \NC $ y > 0 $ \NR
+%D \NC 7 \NC $ x = 7 $ \NR
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {definemathmatrix, setupmathmatrix, startmathmatrix}
+%D
+%D Yet another one \unknown
+
+\unexpanded\def\setupmathmatrix
+ {\dodoubleempty\dosetupmathmatrix}
+
+\def\dosetupmathmatrix[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??mx#1][#2]%
+ \else
+ \getparameters[\??mx][#1]%
+ \fi}
+
+\let\currentmathmatrix\empty
+
+\def\mathmatrixparameter#1%
+ {\executeifdefined{\??mx\currentmathmatrix#1}{\executeifdefined{\??mx#1}\empty}}
+
+\setupmathmatrix
+ [\c!distance=1em,
+ \c!left=,
+ \c!right=,
+ \c!align=\v!middle]
+
+\def\dosetmatrixcolumn#1% hh: todo: \definematrixalign
+ {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil
+ \doif{#1}\v!left {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\relax
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil}%
+ \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\relax }%
+ \doif{#1}\v!middle{\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil}}
+
+\def\buildmathmatrix % beware: etex only
+ {\scratchtoks\emptytoks
+ \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}%
+ \dorecurse{\numexpr\scratchcounter-\plusone\relax}
+ {\normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}%
+ \normalexpanded{\scratchtoks{\the\scratchtoks\the\!!toksc }}}
+
+\def\preparemathmatrix
+ {\!!toksa{\strut \firstineqalign\leftofeqalign \span
+ \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}%
+ \!!toksb{&\hskip\mathmatrixparameter\c!distance
+ \nextineqalign\leftofeqalign \span
+ \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}%
+ \!!toksc{&&\hskip\mathmatrixparameter\c!distance
+ \leftofeqalign \span
+ \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}%
+ \buildmathmatrix
+ \halign \@EA \bgroup\the\scratchtoks \crcr}
+
+\unexpanded\def\definemathmatrix
+ {\dodoubleempty\dodefinemathmatrix}
+
+\def\dodefinemathmatrix[#1]% [#2]%
+ {\setuvalue{\e!start#1}{\dodoubleempty\dostartmathmatrix[#1]}%
+ \setuvalue{\e!stop #1}{\dostopmathmatrix}%
+ \setupmathmatrix[#1]}% [#2]
+
+\definemathmatrix[matrix]
+\definemathmatrix[\v!mathmatrix]
+
+\unexpanded\def\dodomatrixNC
+ {\gdef\domatrixNC{\endmath&}}
+
+\def\installmathmatrixhandler#1#2%
+ {\setvalue{\??mx:#1}{#2}}
+
+% First alternative:
+%
+% \def\processlowhighmathmatrix#1%
+% {\def\mathmatrixleft
+% {\setbox\nextbox}
+% \def\mathmatrixright
+% {#1.5\dimexpr\nextboxdp-\nextboxht\relax
+% \hbox{$\mathmatrixparameter\c!left
+% \vcenter{\unvbox\nextbox}%
+% \mathmatrixparameter\c!right$}}%
+% \let\mathmatrixbox\vbox}
+%
+% \installmathmatrixhandler\v!high {\processlowhighmathmatrix\raise}
+% \installmathmatrixhandler\v!low {\processlowhighmathmatrix\lower}
+%
+% \installmathmatrixhandler\v!top {\processlowhighmathmatrix\raise}
+% \installmathmatrixhandler\v!bottom{\processlowhighmathmatrix\lower}
+%
+% \installmathmatrixhandler\v!lohi
+% {\def\mathmatrixleft {\mathmatrixparameter\c!left}%
+% \def\mathmatrixright{\mathmatrixparameter\c!right}%
+% \let\mathmatrixbox\vcenter}
+%
+% An alternative
+%
+% \let\mathmatrixleft \empty
+% \let\mathmatrixright\empty
+%
+% \def\processlowhighmathmatrix#1%
+% {\dowithnextbox
+% {#1.5\dimexpr\nextboxdp-\nextboxht\relax
+% \hbox{$\mathmatrixparameter\c!left
+% \vcenter{\unvbox\nextbox}%
+% \mathmatrixparameter\c!right$}}%
+% \vbox}
+%
+% \def\processlohimathmatrix
+% {\dowithnextbox
+% {\mathmatrixparameter\c!left
+% \vcenter{\unvbox\nextbox}%
+% \mathmatrixparameter\c!right}%
+% \vbox}
+%
+% \installmathmatrixhandler\v!high {\def\mathmatrixbox{\processlowhighmathmatrix\raise}}
+% \installmathmatrixhandler\v!low {\def\mathmatrixbox{\processlowhighmathmatrix\lower}}
+% \installmathmatrixhandler\v!top {\def\mathmatrixbox{\processlowhighmathmatrix\raise}}
+% \installmathmatrixhandler\v!bottom{\def\mathmatrixbox{\processlowhighmathmatrix\lower}}
+% \installmathmatrixhandler\v!lohi {\let\mathmatrixbox \processlohimathmatrix}
+%
+% Final version
+
+\let\mathmatrixleft \empty % experimental hook
+\let\mathmatrixright\empty % experimental hook
+
+\def\processlowhighmathmatrix#1#2%
+ {\dowithnextbox
+ {\scratchdimen\dimexpr(\nextboxdp-\nextboxht)/2 \ifcase#2\or+\mathaxisheight\textfont2\fi\relax
+ \ifcase#1\relax\or\lower\scratchdimen\or\or\raise\scratchdimen\fi
+ \hbox{$\mathmatrixparameter\c!left
+ \vcenter{\unvbox\nextbox}%
+ \mathmatrixparameter\c!right$}}%
+ \vbox}
+
+\installmathmatrixhandler\v!top {\def\mathmatrixbox{\processlowhighmathmatrix\plusthree\plusone }}
+\installmathmatrixhandler\v!high {\def\mathmatrixbox{\processlowhighmathmatrix\plusthree\zerocount}}
+\installmathmatrixhandler\v!lohi {\def\mathmatrixbox{\processlowhighmathmatrix\plustwo \zerocount}}
+\installmathmatrixhandler\v!low {\def\mathmatrixbox{\processlowhighmathmatrix\plusone \zerocount}}
+\installmathmatrixhandler\v!bottom{\def\mathmatrixbox{\processlowhighmathmatrix\plusone \plusone }}
+
+\def\dostartmathmatrix[#1][#2]%
+ {\begingroup
+ \edef\currentmathmatrix{#1}%
+ \doifassignmentelse{#2}{\setupmathmatrix[#1][#2]}\donothing
+ \null
+ \executeifdefined{\??mx:\mathmatrixparameter\c!location}{\getvalue{\??mx:\v!lohi}}%
+ \mathmatrixleft
+ \mathmatrixbox\bgroup
+ \pushmacro\domatrixNC
+ \let\endmath\relax
+ \def\NC{\domatrixNC}%
+ \def\MC{\domatrixNC\ifmmode\else$\def\endmath{$}\fi}%
+ \global\let\domatrixNC\dodomatrixNC
+ \def\NR{\endmath\global\let\domatrixNC\dodomatrixNC\crcr}%
+ \normalbaselines
+ \mathsurround\zeropoint
+ \everycr\emptytoks
+ \tabskip\zeropoint
+ \eqaligncolumn\zerocount % could be \scratchcounter
+ \processcommacommand[\mathmatrixparameter\c!align]{\advance\eqaligncolumn\plusone\dosetmatrixcolumn}%
+ \scratchcounter=\ifnum\eqaligncolumn>\zerocount \eqaligncolumn \else \plusone \fi
+ \global\eqaligncolumn\plusone
+ \preparemathmatrix } % uses scratchcounter
+
+\def\dostopmathmatrix
+ {\crcr
+ \mathstrut\crcr
+ \noalign{\kern-\baselineskip}%
+ \egroup
+ \popmacro\domatrixNC
+ \egroup
+ \mathmatrixright
+ \endgroup}
+
+%D \startbuffer
+%D \placeformula \startformula[-] \startmatrix
+%D \NC 1 \NC x \NC a \NR
+%D \NC 2 \NC y \NC b \NR
+%D \NC 3 \NC z \NC c \NR
+%D \stopmatrix \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \definemathmatrix[bmatrix][left={\left[\,},right={\,\right]}]
+%D
+%D \startbuffer
+%D \placeformula \startformula[-] \startbmatrix
+%D \NC 1 \NC x \NC a \NR
+%D \NC 2 \NC y \NC b \NR
+%D \NC 3 \NC z \NC c \NR
+%D \stopbmatrix \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D Taco added some code (dedicated to Aditya Mahajan) that gives more
+%D control over aligments:
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix
+%D \NC a + x \NC = \NC a + d \NR
+%D \NC y \NC = \NC d \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix [distance=3pt,align={right,left}]
+%D \NC a + x \NC = a + d \NR
+%D \NC y \NC = d \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix [left=\left(,right=\right)]
+%D \NC a + x \NR
+%D \NC y \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D A bit more complex code:
+%D
+%D \startbuffer
+%D \startformula
+%D \text{Let }{\cal R} = \bigcup_{P_{X_1},P_{X_2}}
+%D \left\{ (R_1, R_2) :
+%D \startmatrix[distance=1em,align={left,left,right}]
+%D \NC R_1 \NC < I(X_1 ; Y \mid X_2) \NC R_1 \NR
+%D \NC \hfill Q_2 \NC < I(X_2 ; Y \mid X_1) \NC R_2 \NR
+%D \NC R_1 + R_2 \NC < I(X_1 ; Y) \NC R_1 + R_2 \NR
+%D \stopmatrix
+%D \right\}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {startmatrices}
+%D
+%D Just a handy keystroke safer:
+
+\unexpanded\def\startmatrices
+ {\begingroup
+ \setupmathmatrix}
+
+\unexpanded\def\stopmatrices
+ {\endgroup}
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix[left={\left(},right={\right)}]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[left={\left(},right={\right)},location=low]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[left={\left(},right={\right)},location=high]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \startformula
+%D \startmatrices[left={\left(},right={\right)}]
+%D \startmatrix
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[location=bottom]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[location=top]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D \stopmatrices
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % does not run well: \getbuffer
+
+%D \macros
+%D {startintertext}
+%D
+%D Preliminary feature:
+%D
+%D {\em example code}
+
+\unexpanded\def\startintertext#1\stopintertext
+ {\noalign{\dointertext{#1}}}
+
+\def\intertext#1%
+ {\noalign{\dointertext{#1}}}
+
+\unexpanded\def\dointertext#1%
+ {\penalty\postdisplaypenalty
+ \afterdisplayspace
+ \vbox{\forgetall\noindent#1\par}%
+ \penalty\predisplaypenalty
+ \beforedisplayspace}
+
+% %D \macros
+% %D {substack}
+% %D
+% %D Preliminary code:
+% %D
+% %D \starttyping
+% %D \startformula
+% %D \sum_{%
+% %D \startsubstack
+% %D i = 1 \NR
+% %D i \neq n \NR
+% %D i \neq m
+% %D \stopsubstack
+% %D }a_i
+% %D \stopformula
+% %D \stoptyping
+
+% \unexpanded\def\startsubstack
+% {\begingroup
+% \null
+% \vcenter\bgroup
+% \pushmacro\domatrixNC
+% \let\stopmathmode\relax
+% \def\NC{\domatrixNC}%
+% \def\MC{\domatrixNC\startmathmode}%
+% \global\let\domatrixNC\dodomatrixNC
+% \def\NR
+% {\stopmathmode
+% \global\let\domatrixNC\dodomatrixNC
+% \crcr\noalign{\nointerlineskip}}%
+% \mathsurround\zeropoint
+% \everycr\emptytoks
+% \halign\bgroup\hfil$\scriptstyle\mathstrut##$\hfil\crcr}
+
+% \unexpanded\def\stopsubstack
+% {\crcr
+% \egroup
+% \popmacro\domatrixNC
+% \egroup
+% \endgroup}
+
+%D \macros
+%D {substack}
+%D
+%D Preliminary code:
+%D
+%D \startbuffer
+%D \startformula
+%D \sum_{%
+%D \startsubstack
+%D i = 1 \NR
+%D i \neq n \NR
+%D i \neq m
+%D \stopsubstack
+%D }a_i
+%D \stopformula
+%D \stopbuffer
+%D
+%D \getbuffer which was typed as \typebuffer
+%D
+%D Notice that these macros give the correct spacing for
+%D subscripts. Compare for example
+%D
+%D \startbuffer
+%D \startformula
+%D \sum_{\startsubstack a \NR b \NR \stopsubstack}
+%D \text{ and }
+%D \sum_{\scriptstyle a \atop \scriptstyle}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer which gives \getbuffer
+
+\unexpanded\def\startsubstack
+ {\begingroup
+ \vcenter\bgroup
+ \baselineskip\mathstacktotal
+ \lineskip\mathstackvgap
+ \lineskiplimit\lineskip
+ \let\stopmathmode\relax
+ \def\NC{\domatrixNC}%
+ \def\MC{\domatrixNC\startmathmode}%
+ \global\let\domatrixNC\dodomatrixNC
+ \def\NR
+ {\stopmathmode
+ \global\let\domatrixNC\dodomatrixNC
+ \crcr}%
+ \mathsurround\zeropoint
+ \everycr\emptytoks
+ \halign\bgroup\hfil$\scriptstyle##$\hfil\crcr}
+
+\unexpanded\def\stopsubstack
+ {\crcr
+ \egroup
+ \egroup
+ \endgroup}
+
+%D \macros
+%D {bordermatrix}
+%D
+%D In \PLAIN\ \TEX\ the width of a parenthesis is stored in
+%D the \DIMENSION\ \type{\mathparentwd}. This value is derived from
+%D the width of \type{\tenrm B}, so let's take care of it now:
+
+\ifx\mathparentwd\undefined \newdimen\mathparentwd \fi
+
+\let\normalbordermatrix\bordermatrix
+
+\def\bordermatrix
+ {\begingroup
+ \setbox\scratchbox\hbox{\mr\char"239C}%
+ \global\mathparentwd\wd\scratchbox\relax
+ \endgroup
+ \normalbordermatrix}
+
+% to be tested
+%
+% \def\bordermatrix
+% {\begingroup\mr\global\mathparentwd\fontcharwd\font"239C\relax\endgroup
+% \normalbordermatrix}
+
+%D \macros{overset, underset}
+%D
+%D The macros \type{\overset} and \type{\underset} are provided by
+%D \AMS\ packages in \LATEX. These macro allows you to place a symbol
+%D above or below another symbol, irrespective of whether the other
+%D symbol is a relation or something else, and without influencing the
+%D spacing. For most cases there is a better way to do such things
+%D (declaring a math command with limop option, or using accents), but
+%D occasionally these macros can be useful, for example:
+%D
+%D \startbuffer
+%D \startformula
+%D \overset{*}{X} \underset{*}{X}
+%D \stopformula
+%D \stopbuffer
+%D \typebuffer \getbuffer
+%D
+%D Use these macros sparingly. Remember, \TEX\ was designed for
+%D mathematics, so there is usually a proper method for typesetting
+%D common math notation.
+
+%D These macros are a clearer version of \type{\binrel@} and
+%D \type{\binrel@@} macros in \AMSTEX\ packages.
+
+\def\preparebinrel#1%
+ {\begingroup
+ \setbox\scratchbox\hbox
+ {\thinmuskip 0mu
+ \medmuskip -1mu
+ \thickmuskip -1mu
+ \setbox\scratchbox\hbox{$#1\mathsurround\zeropoint$}%
+ \kern-\wd\scratchbox
+ ${}#1{}\mathsurround\zeropoint$}%
+ \normalexpanded
+ {\endgroup
+ \let\noexpand\currentbinrel
+ \ifdim\wd\scratchbox<\zeropoint
+ \mathbin
+ \else\ifdim\wd\scratchbox>\zeropoint
+ \mathrel
+ \else
+ \relax
+ \fi\fi}}
+
+\unexpanded\def\overset#1#2%
+ {\preparebinrel{#2}%
+ \currentbinrel{\mathop{\kern\zeropoint#2}\limits^{#1}}}
+
+\unexpanded\def\underset#1#2%
+ {\preparebinrel{#2}%
+ \currentbinrel{\mathop{\kern\zeropoint#2}\limits_{#1}}}
+
+%D The following code comes from \type {math-str.mkiv}.
+
+%D Here we implement a basic math alignment mechanism. Numbers
+%D are also handled. The macros \type {\startinnermath} and
+%D \type {\stopinnermath} can be overloaded in specialized
+%D modules.
+
+\unexpanded\def\startinnermath
+ {\getvalue{\e!start\??fm\formulaparameter\c!align}}
+
+\unexpanded\def\stopinnermath
+ {\getvalue{\e!stop \??fm\formulaparameter\c!align}}
+
+\def\mathinnerstrut
+ {\doif{\formulaparameter\c!strut}\v!yes\strut}
+
+\long\unexpanded\def\defineinnermathhandler#1#2#3%
+ {\setvalue{\e!start\??fm#1}{#2}%
+ \setvalue{\e!stop \??fm#1}{#3}}
+
+\newif\iftracemath
+
+\def\mathhbox
+ {\iftracemath\ruledhbox\else\hbox\fi}
+
+\chardef\mathraggedstatus=0 % normal left center right
+\chardef\mathnumberstatus=0 % nothing normal shift_right
+\let\mathnumbercorrection\!!zeropoint
+
+\unexpanded\def\startmathbox#1%
+ {\hsize\displaywidth
+ \global\chardef\mathnumberstatus\plusone
+ \chardef\mathraggedstatus#1\relax
+ \let\mathnumbercorrection\!!zeropoint
+ \global\let\@eqno \empty \def\eqno {\gdef\@eqno }%
+ \global\let\@leqno\empty \def\leqno{\gdef\@leqno}%
+ % added
+ \let\normalreqno\eqno
+ \let\normalleqno\leqno
+ % added
+ \doplaceformulanumber
+ \setbox\scratchbox\mathhbox to \displaywidth\bgroup
+ \mathinnerstrut
+ $%
+ \displaystyle
+ \ifcase\mathraggedstatus\or\hfill\or\hfill\fi}
+
+\def\llappedmathno
+ {\ifcase\mathraggedstatus\or
+ \@eqno
+ \or
+ \llap{\@eqno}%
+ \or
+ \llap{\@eqno}%
+ \fi}
+
+\def\rlappedmathno
+ {\ifcase\mathraggedstatus\or
+ \rlap{\@leqno}%
+ \or
+ \rlap{\@leqno}%
+ \or
+ \@leqno
+ \fi}
+
+\unexpanded\def\stopmathbox
+ {$%
+ \ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi
+ \egroup
+ \setbox0\hbox{\unhcopy\scratchbox}%
+ \scratchdimen\wd0
+ \ifdim\scratchdimen>\displaywidth
+ \donetrue
+ \else
+ \donefalse
+ \fi
+ \hbox to \displaywidth\bgroup
+ \ifcase\mathnumberstatus
+ \box\scratchbox
+ \or
+ \ifx\@leqno\empty
+ \ifx\@eqno\empty
+ \box\scratchbox
+ \else
+ \ifdone
+ \vbox{\box\scratchbox\hbox to \displaywidth{\hss\llappedmathno}}%
+ \else
+ \hss\box\scratchbox\llappedmathno % hss makes room for number
+ \fi
+ \fi
+ \else
+ \ifdone
+ \vbox{\hbox to \displaywidth{\rlappedmathno\hss}\box\scratchbox}%
+ \else
+ \rlappedmathno\box\scratchbox\hss % hss makes room for number
+ \fi
+ \fi
+ \or
+ \hskip\mathnumbercorrection
+ \box\scratchbox
+ \hss
+ \else
+ \box\scratchbox
+ \fi
+ \egroup}
+
+\defineinnermathhandler\v!left {\startmathbox\plusone }{\stopmathbox}
+\defineinnermathhandler\v!middle {\startmathbox\plustwo }{\stopmathbox}
+\defineinnermathhandler\v!right {\startmathbox\plusthree}{\stopmathbox}
+\defineinnermathhandler\v!flushleft {\startmathbox\plusthree}{\stopmathbox}
+\defineinnermathhandler\v!center {\startmathbox\plustwo }{\stopmathbox}
+\defineinnermathhandler\v!flushright{\startmathbox\plusone }{\stopmathbox}
+
+%D [The examples below are in english and don't process in the
+%D documentation style, which will be english some day.]
+%D
+%D Normally a formula is centered, but in case you want to
+%D align it left or right, you can set up formulas to behave
+%D that way. Normally a formula will adapt is left indentation
+%D to the environment:
+%D
+%D \startbuffer
+%D \fakewords{20}{40}\epar
+%D \startitemize
+%D \item \fakewords{20}{40}\epar
+%D \placeformula \startformula \fakeformula \stopformula
+%D \item \fakewords{20}{40}\epar
+%D \stopitemize
+%D \fakewords{20}{40}\epar
+%D \stopbuffer
+%D
+%D % \getbuffer
+%D
+%D In the next examples we explicitly align formulas to the
+%D left (\type {\raggedleft}), center and right (\type
+%D {\raggedright}):
+%D
+%D \startbuffer
+%D \setupformulas[align=left]
+%D \startformula\fakeformula\stopformula
+%D \setupformulas[align=middle]
+%D \startformula\fakeformula\stopformula
+%D \setupformulas[align=right]
+%D \startformula\fakeformula\stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Or in print:
+%D
+%D % {\getbuffer}
+%D
+%D With formula numbers these formulas look as follows:
+%D
+%D \startbuffer
+%D \setupformulas[align=left]
+%D \placeformula \startformula\fakeformula\stopformula
+%D \setupformulas[align=middle]
+%D \placeformula \startformula\fakeformula\stopformula
+%D \setupformulas[align=right]
+%D \placeformula \startformula\fakeformula\stopformula
+%D \stopbuffer
+%D
+%D % {\getbuffer}
+%D
+%D This was keyed in as:
+%D
+%D \typebuffer
+%D
+%D When tracing is turned on (\type {\tracemathtrue}) you can
+%D visualize the bounding box of the formula,
+%D
+%D % {\tracemathtrue\getbuffer}
+%D
+%D As you can see, the dimensions are the natural ones, but if
+%D needed you can force a normalized line:
+%D
+%D \startbuffer
+%D \setupformulas[strut=yes]
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This time we get a more spacy result.
+%D
+%D % {\tracemathtrue\getbuffer}
+%D
+%D We will now show a couple of more settings and combinations
+%D of settings. In centered formulas, the number takes no space
+%D
+%D \startbuffer
+%D \setupformulas[align=middle]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+%D
+%D You can influence the placement of the whole box with the
+%D parameters \type {leftmargin} and \type {rightmargin}.
+%D
+%D \startbuffer
+%D \setupformulas[align=right,leftmargin=3em]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D
+%D \setupformulas[align=left,rightmargin=1em]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+%D
+%D You can also inherit the margin from the environment.
+%D
+%D \startbuffer
+%D \setupformulas[align=right,margin=standard]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+%D
+%D The distance between the formula and the number is only
+%D applied when the formula is left or right aligned.
+%D
+%D \startbuffer
+%D \setupformulas[align=left,distance=2em]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+
+\protect \endinput
+
+% \placeformula \startformula[-] \startmatrix
+% \NC 1 \NC x \NC a \NR
+% \NC 2 \NC y \NC b \NR
+% \NC 3 \NC z \NC c \NR
+% \stopmatrix \stopformula
+
+% \definemathmatrix[bordermatrix][left={\left[\,},right={\,\right]}]
+
+% \placeformula \startformula[-] \startbordermatrix
+% \NC 1 \NC x \NC a \NR
+% \NC 2 \NC y \NC b \NR
+% \NC 3 \NC z \NC c \NR
+% \stopbordermatrix \stopformula
diff --git a/tex/context/base/math-ams.mkii b/tex/context/base/math-ams.mkii
new file mode 100644
index 000000000..83070d01a
--- /dev/null
+++ b/tex/context/base/math-ams.mkii
@@ -0,0 +1,336 @@
+%D \module
+%D [ file=math-ams,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=AMS Specials,
+%D author={Hans Hagen \& Taco Hoekwater},
+%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.
+
+\unprotect
+
+% maybe we should just include these into the default tex one
+
+\definefamilysynonym [default] [blackboard] [mb]
+
+\startmathcollection [default]
+
+\definemathsymbol [varGamma] [ord] [letters] ["00]
+\definemathsymbol [varDelta] [ord] [letters] ["01]
+\definemathsymbol [varTheta] [ord] [letters] ["02]
+\definemathsymbol [varLambda] [ord] [letters] ["03]
+\definemathsymbol [varXi] [ord] [letters] ["04]
+\definemathsymbol [varPi] [ord] [letters] ["05]
+\definemathsymbol [varSigma] [ord] [letters] ["06]
+\definemathsymbol [varUpsilon] [ord] [letters] ["07]
+\definemathsymbol [varPhi] [ord] [letters] ["08]
+\definemathsymbol [varPsi] [ord] [letters] ["09]
+\definemathsymbol [varOmega] [ord] [letters] ["0A]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [internalAnd] [rel] [operators] ["26]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [boxdot] [bin] [ma] ["00]
+\definemathsymbol [boxplus] [bin] [ma] ["01]
+\definemathsymbol [boxtimes] [bin] [ma] ["02]
+\definemathsymbol [square] [ord] [ma] ["03]
+\definemathsymbol [Box] [ord] [ma] ["03] % square
+\definemathsymbol [blacksquare] [ord] [ma] ["04]
+\definemathsymbol [centerdot] [bin] [ma] ["05]
+\definemathsymbol [Diamond] [ord] [ma] ["06]
+\definemathsymbol [lozenge] [ord] [ma] ["06] % Diamond
+\definemathsymbol [blacklozenge] [ord] [ma] ["07]
+\definemathsymbol [circlearrowright] [rel] [ma] ["08]
+\definemathsymbol [circlearrowleft] [rel] [ma] ["09]
+\definemathsymbol [rightleftharpoons] [rel] [ma] ["0A]
+\definemathsymbol [leftrightharpoons] [rel] [ma] ["0B]
+\definemathsymbol [boxminus] [bin] [ma] ["0C]
+\definemathsymbol [Vdash] [rel] [ma] ["0D]
+\definemathsymbol [Vvdash] [rel] [ma] ["0E]
+\definemathsymbol [vDash] [rel] [ma] ["0F]
+\definemathsymbol [twoheadrightarrow] [rel] [ma] ["10]
+\definemathsymbol [twoheadleftarrow] [rel] [ma] ["11]
+\definemathsymbol [leftleftarrows] [rel] [ma] ["12]
+\definemathsymbol [rightrightarrows] [rel] [ma] ["13]
+\definemathsymbol [upuparrows] [rel] [ma] ["14]
+\definemathsymbol [downdownarrows] [rel] [ma] ["15]
+\definemathsymbol [upharpoonright] [rel] [ma] ["16]
+\definemathsymbol [restriction] [rel] [ma] ["16]
+\definemathsymbol [downharpoonright] [rel] [ma] ["17]
+\definemathsymbol [upharpoonleft] [rel] [ma] ["18]
+\definemathsymbol [downharpoonleft] [rel] [ma] ["19]
+\definemathsymbol [rightarrowtail] [rel] [ma] ["1A]
+\definemathsymbol [leftarrowtail] [rel] [ma] ["1B]
+\definemathsymbol [leftrightarrows] [rel] [ma] ["1C]
+\definemathsymbol [rightleftarrows] [rel] [ma] ["1D]
+\definemathsymbol [Lsh] [rel] [ma] ["1E]
+\definemathsymbol [Rsh] [rel] [ma] ["1F]
+\definemathsymbol [rightsquigarrow] [rel] [ma] ["20]
+\definemathsymbol [leadsto] [rel] [ma] ["20] % rightsquigarrow
+\definemathsymbol [leftrightsquigarrow] [rel] [ma] ["21]
+\definemathsymbol [looparrowleft] [rel] [ma] ["22]
+\definemathsymbol [looparrowright] [rel] [ma] ["23]
+\definemathsymbol [circeq] [rel] [ma] ["24]
+\definemathsymbol [succsim] [rel] [ma] ["25]
+\definemathsymbol [gtrsim] [rel] [ma] ["26]
+\definemathsymbol [gtrapprox] [rel] [ma] ["27]
+\definemathsymbol [multimap] [rel] [ma] ["28]
+\definemathsymbol [therefore] [rel] [ma] ["29]
+\definemathsymbol [because] [rel] [ma] ["2A]
+\definemathsymbol [doteqdot] [rel] [ma] ["2B]
+\definemathsymbol [Doteq] [rel] [ma] ["2B] % doteqdot
+\definemathsymbol [triangleq] [rel] [ma] ["2C]
+\definemathsymbol [precsim] [rel] [ma] ["2D]
+\definemathsymbol [lesssim] [rel] [ma] ["2E]
+\definemathsymbol [lessapprox] [rel] [ma] ["2F]
+\definemathsymbol [eqslantless] [rel] [ma] ["30]
+\definemathsymbol [eqslantgtr] [rel] [ma] ["31]
+\definemathsymbol [curlyeqprec] [rel] [ma] ["32]
+\definemathsymbol [curlyeqsucc] [rel] [ma] ["33]
+\definemathsymbol [preccurlyeq] [rel] [ma] ["34]
+\definemathsymbol [leqq] [rel] [ma] ["35]
+\definemathsymbol [leqslant] [rel] [ma] ["36]
+\definemathsymbol [lessgtr] [rel] [ma] ["37]
+\definemathsymbol [backprime] [ord] [ma] ["38]
+\definemathsymbol [dabar@] [ord] [ma] ["39] % @
+\definemathsymbol [risingdotseq] [rel] [ma] ["3A]
+\definemathsymbol [fallingdotseq] [rel] [ma] ["3B]
+\definemathsymbol [succcurlyeq] [rel] [ma] ["3C]
+\definemathsymbol [geqq] [rel] [ma] ["3D]
+\definemathsymbol [geqslant] [rel] [ma] ["3E]
+\definemathsymbol [gtrless] [rel] [ma] ["3F]
+\definemathsymbol [sqsubset] [rel] [ma] ["40]
+\definemathsymbol [sqsupset] [rel] [ma] ["41]
+\definemathsymbol [vartriangleright] [rel] [ma] ["42]
+\definemathsymbol [rhd] [bin] [ma] ["42]
+\definemathsymbol [lhd] [bin] [ma] ["43]
+\definemathsymbol [vartriangleleft] [rel] [ma] ["43]
+\definemathsymbol [trianglerighteq] [rel] [ma] ["44]
+\definemathsymbol [unrhd] [bin] [ma] ["44] % trianglerighteq
+\definemathsymbol [trianglelefteq] [rel] [ma] ["45]
+\definemathsymbol [unlhd] [bin] [ma] ["45] % trianglelefteq
+\definemathsymbol [bigstar] [ord] [ma] ["46]
+\definemathsymbol [between] [rel] [ma] ["47]
+\definemathsymbol [blacktriangledown] [ord] [ma] ["48]
+\definemathsymbol [blacktriangleright] [rel] [ma] ["49]
+\definemathsymbol [blacktriangleleft] [rel] [ma] ["4A]
+\definemathsymbol [vartriangle] [rel] [ma] ["4D]
+\definemathsymbol [triangleup] [ord] [ma] ["4D] % vartriangle
+\definemathsymbol [blacktriangle] [ord] [ma] ["4E]
+\definemathsymbol [triangledown] [ord] [ma] ["4F]
+\definemathsymbol [eqcirc] [rel] [ma] ["50]
+\definemathsymbol [lesseqgtr] [rel] [ma] ["51]
+\definemathsymbol [gtreqless] [rel] [ma] ["52]
+\definemathsymbol [lesseqqgtr] [rel] [ma] ["53]
+\definemathsymbol [gtreqqless] [rel] [ma] ["54]
+\definemathsymbol [Rrightarrow] [rel] [ma] ["56]
+\definemathsymbol [Lleftarrow] [rel] [ma] ["57]
+\definemathsymbol [veebar] [bin] [ma] ["59]
+\definemathsymbol [barwedge] [bin] [ma] ["5A]
+\definemathsymbol [doublebarwedge] [bin] [ma] ["5B]
+\definemathsymbol [angle] [ord] [ma] ["5C]
+\definemathsymbol [measuredangle] [ord] [ma] ["5D]
+\definemathsymbol [sphericalangle] [ord] [ma] ["5E]
+\definemathsymbol [varpropto] [rel] [ma] ["5F]
+\definemathsymbol [smallsmile] [rel] [ma] ["60]
+\definemathsymbol [smallfrown] [rel] [ma] ["61]
+\definemathsymbol [Subset] [rel] [ma] ["62]
+\definemathsymbol [Supset] [rel] [ma] ["63]
+\definemathsymbol [Cup] [bin] [ma] ["64]
+\definemathsymbol [doublecup] [bin] [ma] ["64] % Cup
+\definemathsymbol [Cap] [bin] [ma] ["65]
+\definemathsymbol [doublecap] [bin] [ma] ["65]
+\definemathsymbol [curlywedge] [bin] [ma] ["66]
+\definemathsymbol [curlyvee] [bin] [ma] ["67]
+\definemathsymbol [leftthreetimes] [bin] [ma] ["68]
+\definemathsymbol [rightthreetimes] [bin] [ma] ["69]
+\definemathsymbol [subseteqq] [rel] [ma] ["6A]
+\definemathsymbol [supseteqq] [rel] [ma] ["6B]
+\definemathsymbol [bumpeq] [rel] [ma] ["6C]
+\definemathsymbol [Bumpeq] [rel] [ma] ["6D]
+\definemathsymbol [llless] [rel] [ma] ["6E]
+\definemathsymbol [lll] [rel] [ma] ["6E] % llless
+\definemathsymbol [gggtr] [rel] [ma] ["6F]
+\definemathsymbol [ggg] [rel] [ma] ["6F] % gggtr
+\definemathsymbol [ulcorner] [open] [ma] ["70] [ma] ["70]
+\definemathsymbol [urcorner] [close] [ma] ["71] [ma] ["71]
+\definemathsymbol [circledS] [ord] [ma] ["73]
+\definemathsymbol [pitchfork] [rel] [ma] ["74]
+\definemathsymbol [dotplus] [bin] [ma] ["75]
+\definemathsymbol [backsim] [rel] [ma] ["76]
+\definemathsymbol [backsimeq] [rel] [ma] ["77]
+\definemathsymbol [llcorner] [open] [ma] ["78] [ma] ["78]
+\definemathsymbol [lrcorner] [close] [ma] ["79] [ma] ["79]
+\definemathsymbol [complement] [ord] [ma] ["7B]
+\definemathsymbol [intercal] [bin] [ma] ["7C]
+\definemathsymbol [circledcirc] [bin] [ma] ["7D]
+\definemathsymbol [circledast] [bin] [ma] ["7E]
+\definemathsymbol [circleddash] [bin] [ma] ["7F]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathcommand [integers] {\blackboard{Z}}
+\definemathcommand [reals] {\blackboard{R}}
+\definemathcommand [rationals] {\blackboard{Q}}
+\definemathcommand [naturalnumbers] {\blackboard{N}}
+\definemathcommand [complexes] {\blackboard{C}}
+\definemathcommand [primes] {\blackboard{P}}
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [lvertneqq] [rel] [mb] ["00]
+\definemathsymbol [gvertneqq] [rel] [mb] ["01]
+\definemathsymbol [nleq] [rel] [mb] ["02]
+\definemathsymbol [ngeq] [rel] [mb] ["03]
+\definemathsymbol [nless] [rel] [mb] ["04]
+\definemathsymbol [ngtr] [rel] [mb] ["05]
+\definemathsymbol [nprec] [rel] [mb] ["06]
+\definemathsymbol [nsucc] [rel] [mb] ["07]
+\definemathsymbol [lneqq] [rel] [mb] ["08]
+\definemathsymbol [gneqq] [rel] [mb] ["09]
+\definemathsymbol [nleqslant] [rel] [mb] ["0A]
+\definemathsymbol [ngeqslant] [rel] [mb] ["0B]
+\definemathsymbol [lneq] [rel] [mb] ["0C]
+\definemathsymbol [gneq] [rel] [mb] ["0D]
+\definemathsymbol [npreceq] [rel] [mb] ["0E]
+\definemathsymbol [nsucceq] [rel] [mb] ["0F]
+\definemathsymbol [precnsim] [rel] [mb] ["10]
+\definemathsymbol [succnsim] [rel] [mb] ["11]
+\definemathsymbol [lnsim] [rel] [mb] ["12]
+\definemathsymbol [gnsim] [rel] [mb] ["13]
+\definemathsymbol [nleqq] [rel] [mb] ["14]
+\definemathsymbol [ngeqq] [rel] [mb] ["15]
+\definemathsymbol [precneqq] [rel] [mb] ["16]
+\definemathsymbol [succneqq] [rel] [mb] ["17]
+\definemathsymbol [precnapprox] [rel] [mb] ["18]
+\definemathsymbol [succnapprox] [rel] [mb] ["19]
+\definemathsymbol [lnapprox] [rel] [mb] ["1A]
+\definemathsymbol [gnapprox] [rel] [mb] ["1B]
+\definemathsymbol [nsim] [rel] [mb] ["1C]
+\definemathsymbol [ncong] [rel] [mb] ["1D]
+\definemathsymbol [diagup] [ord] [mb] ["1E]
+\definemathsymbol [diagdown] [ord] [mb] ["1F]
+\definemathsymbol [varsubsetneq] [rel] [mb] ["20]
+\definemathsymbol [varsupsetneq] [rel] [mb] ["21]
+\definemathsymbol [nsubseteqq] [rel] [mb] ["22]
+\definemathsymbol [nsupseteqq] [rel] [mb] ["23]
+\definemathsymbol [subsetneqq] [rel] [mb] ["24]
+\definemathsymbol [supsetneqq] [rel] [mb] ["25]
+\definemathsymbol [varsubsetneqq] [rel] [mb] ["26]
+\definemathsymbol [varsupsetneqq] [rel] [mb] ["27]
+\definemathsymbol [subsetneq] [rel] [mb] ["28]
+\definemathsymbol [supsetneq] [rel] [mb] ["29]
+\definemathsymbol [nsubseteq] [rel] [mb] ["2A]
+\definemathsymbol [nsupseteq] [rel] [mb] ["2B]
+\definemathsymbol [nparallel] [rel] [mb] ["2C]
+\definemathsymbol [nmid] [rel] [mb] ["2D]
+\definemathsymbol [nshortmid] [rel] [mb] ["2E]
+\definemathsymbol [nshortparallel] [rel] [mb] ["2F]
+\definemathsymbol [nvdash] [rel] [mb] ["30]
+\definemathsymbol [nVdash] [rel] [mb] ["31]
+\definemathsymbol [nvDash] [rel] [mb] ["32]
+\definemathsymbol [nVDash] [rel] [mb] ["33]
+\definemathsymbol [ntrianglerighteq] [rel] [mb] ["34]
+\definemathsymbol [ntrianglelefteq] [rel] [mb] ["35]
+\definemathsymbol [ntriangleleft] [rel] [mb] ["36]
+\definemathsymbol [ntriangleright] [rel] [mb] ["37]
+\definemathsymbol [nleftarrow] [rel] [mb] ["38]
+\definemathsymbol [nrightarrow] [rel] [mb] ["39]
+\definemathsymbol [nLeftarrow] [rel] [mb] ["3A]
+\definemathsymbol [nRightarrow] [rel] [mb] ["3B]
+\definemathsymbol [nLeftrightarrow] [rel] [mb] ["3C]
+\definemathsymbol [nleftrightarrow] [rel] [mb] ["3D]
+\definemathsymbol [divideontimes] [bin] [mb] ["3E]
+\definemathsymbol [varnothing] [ord] [mb] ["3F]
+\definemathsymbol [nexists] [ord] [mb] ["40]
+\definemathsymbol [Finv] [ord] [mb] ["60]
+\definemathsymbol [Game] [ord] [mb] ["61]
+\definemathsymbol [mho] [ord] [mb] ["66]
+\definemathsymbol [eth] [ord] [mb] ["67]
+\definemathsymbol [eqsim] [rel] [mb] ["68]
+\definemathsymbol [beth] [ord] [mb] ["69]
+\definemathsymbol [gimel] [ord] [mb] ["6A]
+\definemathsymbol [daleth] [ord] [mb] ["6B]
+\definemathsymbol [lessdot] [bin] [mb] ["6C]
+\definemathsymbol [gtrdot] [bin] [mb] ["6D]
+\definemathsymbol [ltimes] [bin] [mb] ["6E]
+\definemathsymbol [rtimes] [bin] [mb] ["6F]
+\definemathsymbol [shortmid] [rel] [mb] ["70]
+\definemathsymbol [shortparallel] [rel] [mb] ["71]
+\definemathsymbol [smallsetminus] [bin] [mb] ["72]
+\definemathsymbol [thicksim] [rel] [mb] ["73]
+\definemathsymbol [thickapprox] [rel] [mb] ["74]
+\definemathsymbol [approxeq] [rel] [mb] ["75]
+\definemathsymbol [succapprox] [rel] [mb] ["76]
+\definemathsymbol [precapprox] [rel] [mb] ["77]
+\definemathsymbol [curvearrowleft] [rel] [mb] ["78]
+\definemathsymbol [curvearrowright] [rel] [mb] ["79]
+\definemathsymbol [digamma] [ord] [mb] ["7A]
+\definemathsymbol [varkappa] [ord] [mb] ["7B]
+\definemathsymbol [Bbbk] [ord] [mb] ["7C]
+\definemathsymbol [hslash] [ord] [mb] ["7D]
+\definemathsymbol [hbar] [ord] [mb] ["7E]
+\definemathsymbol [backepsilon] [rel] [mb] ["7F]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathcommand [yen] [nothing] {\mathhexbox{\hexmafam}55}
+\definemathcommand [checkmark] [nothing] {\mathhexbox{\hexmafam}58}
+\definemathcommand [circledR] [nothing] {\mathhexbox{\hexmafam}72}
+\definemathcommand [maltese] [nothing] {\mathhexbox{\hexmafam}7A}
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathcommand [dashrightarrow] [rel] {\dabar@\dabar@ \mathchar"0C4B}
+\definemathcommand [dashleftarrow] [rel] {\mathchar"0C4C\dabar@ \dabar@}
+\definemathcommand [dasharrow] [rel] {\dabar@\dabar@ \mathchar"0C4B}
+\definemathcommand [Join] [rel] {\mathchar"0D6F\mkern-13.8mu\mathchar"0D6E}
+\definemathcommand [implies] [rel] {\;\Longrightarrow\;}
+\definemathcommand [impliedby] [rel] {\;\Longleftarrow\;}
+\definemathcommand [And] [rel] {\;\internalAnd\;}
+
+\stopmathcollection
+
+\def\AMSwidehat#1%
+ {\setbox\scratchbox\hbox{$\mathsurround\zeropoint#1$}%
+ \ifdim\wd\scratchbox>2em
+ \mathaccent"0\purefamilyhex{mb}5B{#1}%
+ \else
+ \mathaccent"0\purefamilyhex{ex}62{#1}%
+ \fi}
+
+\def\AMSwidetilde#1%
+ {\setbox\scratchbox\hbox{$\mathsurround\zeropoint#1$}%
+ \ifdim\wd\scratchbox>2em
+ \mathaccent"0\purefamilyhex{mb}5D{#1}%
+ \else
+ \mathaccent"0\purefamilyhex{ex}65{#1}%
+ \fi}
+
+\startmathcollection [default]
+
+\definemathcommand [widehat] {\AMSwidehat}
+\definemathcommand [widetilde] {\AMSwidetilde}
+
+\stopmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-arr.mkii b/tex/context/base/math-arr.mkii
new file mode 100644
index 000000000..3b9abaa91
--- /dev/null
+++ b/tex/context/base/math-arr.mkii
@@ -0,0 +1,391 @@
+%D \module
+%D [ file=math-ext,
+%D version=2007.07.19,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Arrows,
+%D author={Hans Hagen \& Taco Hoekwater \& Aditya Mahajan},
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Arrows}
+
+\unprotect
+
+%D These will be generalized! Is it still needed in \MKIV?
+
+%D We next define extensible arrows. Extensible arrows are arrows that
+%D change their length according to the width of the text to be placed
+%D above and below the arrow. Since we need to define a lot of arrows,
+%D we first define some helper macros. The basic idea is to measure
+%D the width of the box to be placed above and below the arrow, and
+%D make the \quotation{body} of the arrow as long as the bigger of the
+%D two widths.
+
+\def\mtharrfactor{1}
+\def\mtharrextra {0}
+
+\def\domthxarr#1#2#3#4#5% hm, looks like we do a double mathrel
+ {\begingroup
+ \def\mtharrfactor{1}%
+ \def\mtharrextra {0}%
+ \processaction[#1] % will be sped up
+ [ \v!none=>\def\mtharrfactor{0},
+ \v!small=>\def\mtharrextra{10},
+ \v!medium=>\def\mtharrextra{15},
+ \v!big=>\def\mtharrextra{20},
+ \v!normal=>,
+ \v!default=>,
+ \v!unknown=>\doifnumberelse{#1}{\def\mtharrextra{#1}}\donothing]%
+ \mathsurround\zeropoint
+ \muskip0=\thirdoffourarguments #2mu
+ \muskip2=\fourthoffourarguments #2mu
+ \muskip4=\firstoffourarguments #2mu
+ \muskip6=\secondoffourarguments #2mu
+ \muskip0=\mtharrfactor\muskip0 \advance\muskip0 \mtharrextra mu
+ \muskip2=\mtharrfactor\muskip2 \advance\muskip2 \mtharrextra mu
+ \setbox0\hbox{$\scriptstyle
+ \mkern\muskip4\relax
+ \mkern\muskip0\relax
+ #5\relax
+ \mkern\muskip2\relax
+ \mkern\muskip6\relax
+ $}%
+ \setbox4\hbox{#3\displaystyle}%
+ \dimen0\wd0
+ \ifdim\wd4>\dimen0 \dimen0\wd4 \fi
+ \setbox2\hbox{$\scriptstyle
+ \mkern\muskip4\relax
+ \mkern\muskip0\relax
+ #4\relax
+ \mkern\muskip2\relax
+ \mkern\muskip6\relax
+ $}%
+ \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
+ \setbox4\hbox to \dimen0{#3\displaystyle}%
+ \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits^{\box0}_{\box2}}
+ \endgroup}
+
+\let\domthxarrsingle\domthxarr
+
+%D There are some arrows which are created by stacking two arrows. The next
+%D macro helps in defining such \quotation{double arrows}.
+
+\def\domthxarrdouble#1#2#3#4#5#6#7% opt l r sp rs top bot
+ {\mathrel
+ {\scratchdimen.32ex\relax % was .22, todo: make configurable
+ \setbox0\hbox{$\domthxarr{#1}{#2}{#4}{\phantom{#6}}{#7}$}%
+ \setbox2\hbox{$\domthxarr{#1}{#3}{#5}{#6}{\phantom{#7}}$}%
+ \raise\scratchdimen\box0
+ \kern-\wd2
+ \lower\scratchdimen\box2}}
+
+%D \macros{definematharrow}
+%D
+%D Macro for defining new arrows. We can define two types of
+%D arrows|<|single arrows and double arrows. Single arrows are defined
+%D as
+%D
+%D \starttyping
+%D \definematharrow [xrightarrow] [0359] [\rightarrowfill]
+%D \stoptyping
+%D
+%D The first argument is the name of the arrow (\tex{xrightarrow} in
+%D this case.) The second argument consists of a set of 4 numbers and
+%D specify the spacing correction in math units~\type{mu}. These
+%D numbers define:
+%D
+%D \startlines
+%D 1st number: arrow||tip correction
+%D 2nd number: arrow||tip correction
+%D 3rd number: space (multiplied by \tex{matharrfactor} and advanced by \tex{matharrextra})
+%D 4th number: space (multiplied by \tex{matharrfactor} and advanced by \tex{matharrextra})
+%D \stoplines
+%D
+%D The third argument is the name of the extensible fill. The third
+%D argument is optional when the arrow is redefined later (this is
+%D useful for font specific tweaking of the skips.) For example,
+%D
+%D \startbuffer
+%D \math{\xrightarrow{above}}
+%D \definematharrow[xrightarrow][0000]
+%D \math{\xrightarrow{above}}
+%D \definematharrow[xrightarrow][55{50}{50}]
+%D \math{\xrightarrow{above}}
+%D \stopbuffer
+%D \typebuffer gives {\getbuffer}
+%D
+%D The double arrows are defined as follows
+%D
+%D \starttyping
+%D \definematharrow [xrightleftharpoons] [3095,0359]
+%D [\rightharpoonupfill,\leftharpoondownfill]
+%D \stoptyping
+%D
+%D The second and the third set of arguments consist of comma
+%D separated values. The first element of the second argument
+%D (\type{3095}) corresponds to the spacing correction of top arrow
+%D fill (\tex{rightarrowupfill}). Similarly, \type{0359} corresponds
+%D to bottom arrow fill \tex{leftharpoondownfill}). Stacking them on
+%D top of each other we get $\xrightleftharpoons[big]{above}{below}$.
+%D The following math arrows are defined
+%D
+%D \placetable[none]{}{\starttable[|l|m|]
+%D \NC \tex{xrightarrow } \NC \xrightarrow [big] \NC \NR
+%D \NC \tex{xleftarrow } \NC \xleftarrow [big] \NC \NR
+%D \NC \tex{xequal } \NC \xequal [big] \NC \NR
+%D \NC \tex{xRightarrow } \NC \xRightarrow [big] \NC \NR
+%D \NC \tex{xLeftarrow } \NC \xLeftarrow [big] \NC \NR
+%D \NC \tex{xLeftrightarrow } \NC \xLeftrightarrow [big] \NC \NR
+%D \NC \tex{xleftrightarrow } \NC \xleftrightarrow [big] \NC \NR
+%D \NC \tex{xmapsto } \NC \xmapsto [big] \NC \NR
+%D \NC \tex{xtwoheadrightarrow } \NC \xtwoheadrightarrow [big] \NC \NR
+%D \NC \tex{xtwoheadleftarrow } \NC \xtwoheadleftarrow [big] \NC \NR
+%D \NC \tex{xrightharpoondown } \NC \xrightharpoondown [big] \NC \NR
+%D \NC \tex{xrightharpoonup } \NC \xrightharpoonup [big] \NC \NR
+%D \NC \tex{xleftharpoondown } \NC \xleftharpoondown [big] \NC \NR
+%D \NC \tex{xleftharpoonup } \NC \xleftharpoonup [big] \NC \NR
+%D \NC \tex{xhookleftarrow } \NC \xhookleftarrow [big] \NC \NR
+%D \NC \tex{xhookrightarrow } \NC \xhookrightarrow [big] \NC \NR
+%D \NC \tex{xleftrightharpoons } \NC \xleftrightharpoons [big] \NC \NR
+%D \NC \tex{xrightleftharpoons } \NC \xrightleftharpoons [big] \NC \NR
+%D \stoptable}
+
+\def\definematharrow
+ {\doquadrupleargument\dodefinematharrow}
+
+\def\dodefinematharrow[#1][#2][#3][#4]% name type[none|both] template command
+ {\iffourthargument
+ \executeifdefined{dodefine#2arrow}\gobblethreearguments{#1}{#3}{#4}%
+ \else\ifthirdargument
+ \dodefinebotharrow{#1}{#2}{#3}%
+ \else\ifsecondargument
+ \redefinebotharrow{#1}{#2}{#3}%
+ \fi\fi\fi}
+
+\def\redefinebotharrow#1#2#3% real dirty, this overload!
+ {\doifdefined{#1}
+ {\pushmacro\dohandlemtharrow
+ \def\dohandlemtharrow[##1][##2]{\setvalue{#1}{\dohandlemtharrow[#2][##2]}}%
+ % == \def\dohandlemtharrow[##1][##2]{\dodefinebotharrow{#1}{#2}{##2}}%
+ \getvalue{#1}%
+ \popmacro\dohandlemtharrow}}
+
+\def\dodefinebotharrow#1#2#3%
+ {\setvalue{#1}{\dohandlemtharrow[#2][#3]}}
+
+\def\dohandlemtharrow
+ {\dotripleempty\doxmtharrow}
+
+\def\doxmtharrow[#1][#2][#3]% #3 == optional arg
+ {\def\dodoxmtharrow{\dododoxmtharrow[#1,\empty,\empty][#2,\empty,\empty][#3]}% {##1}{##2}
+ \dodoublegroupempty\dodoxmtharrow}
+
+\def\dododoxmtharrow[#1,#2,#3][#4,#5,#6][#7]#8#9% [3] is the optional arg
+ {\edef\!!stringa{#2}%
+ \ifx\!!stringa\empty
+ \ifsecondargument
+ \mathrel{\domthxarrsingle{#7}{#1}{#4}{#8}{#9}}%
+ \else
+ \mathrel{\domthxarrsingle{#7}{#1}{#4}{}{#8}}%
+ \fi
+ \else
+ \ifsecondargument
+ \mathrel{\domthxarrdouble{#7}{#1}{#2}{#4}{#5}{#8}{#9}}%
+ \else
+ \mathrel{\domthxarrdouble{#7}{#1}{#2}{#4}{#5}{}{#8}}%
+ \fi
+ \fi}
+
+% Adapted from amsmath.
+
+%D \macros{mtharrowfill,defaultmtharrowfill}
+%D
+%D To extend the arrows we need to define a \quotation{math arrow
+%D fill}. This command takes 8 arguments: the first four correspond
+%D the second argument of \tex{definematharrow} explained above. The
+%D other three specify the tail, body and head of the arrow. The last
+%D argument specifies the math-mode in which the arrow is drawn.
+%D \tex{defaultmtharrowfill} has values tweaked to match Latin Modern
+%D fonts. For fonts that are significantly different (e.g. cows) a
+%D different set of values need to be determined.
+
+\def\mtharrowfill#1#2#3#4#5#6#7#8%
+ {$\mathsurround 0pt
+ \thickmuskip0mu\medmuskip\thickmuskip\thinmuskip\thickmuskip
+ \relax#8#5%
+ \mkern-#1mu
+ \cleaders\hbox{$#8\mkern -#2mu#6\mkern -#3mu$}\hfill
+ \mkern-#4mu#7$}
+
+\def\defaultmtharrowfill{\mtharrowfill 7227}
+
+%D We now define some arrow fills that will be used for defining the
+%D arrows. Plain \TEX\ already defines \tex{leftarrowfill} and
+%D \tex{rightarrowfill}. The \tex{defaultmtharrowfill} command defines an
+%D arrowfill that takes an argument (so that it can also be used
+%D with over and under arrows). However the Plain \TEX\ definitions of
+%D \tex{leftarrowfill} and \tex{rightarrowfill} do not take this extra
+%D argument. To be backward compatible with Plain \TEX, we define two
+%D arrowfills: \tex{specrightarrowfill} which takes an extra argument, and
+%D \tex{rightarrowfill} which does not.
+
+\def\specrightarrowfill {\defaultmtharrowfill \relbar \relbar \rightarrow}
+\def\specleftarrowfill {\defaultmtharrowfill \leftarrow \relbar \relbar}
+
+\def\rightarrowfill {\specrightarrowfill \textstyle}
+\def\leftarrowfill {\specleftarrowfill \textstyle}
+
+\def\equalfill {\defaultmtharrowfill \Relbar \Relbar \Relbar}
+\def\Rightarrowfill {\defaultmtharrowfill \Relbar \Relbar \Rightarrow}
+\def\Leftarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Relbar}
+\def\Leftrightarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Rightarrow}
+\def\leftrightarrowfill {\defaultmtharrowfill \leftarrow \relbar \rightarrow}
+\def\mapstofill {\defaultmtharrowfill{\mapstochar\relbar} \relbar \rightarrow}
+\def\twoheadrightarrowfill{\defaultmtharrowfill \relbar \relbar \twoheadrightarrow}
+\def\twoheadleftarrowfill {\defaultmtharrowfill \twoheadleftarrow \relbar \relbar}
+\def\rightharpoondownfill {\defaultmtharrowfill \relbar \relbar \rightharpoondown}
+\def\rightharpoonupfill {\defaultmtharrowfill \relbar \relbar \rightharpoonup}
+\def\leftharpoondownfill {\defaultmtharrowfill \leftharpoondown \relbar \relbar}
+\def\leftharpoonupfill {\defaultmtharrowfill \leftharpoonup \relbar \relbar}
+\def\hookleftfill {\defaultmtharrowfill \leftarrow \relbar{\relbar\joinrel\rhook}}
+\def\hookrightfill {\defaultmtharrowfill{\lhook\joinrel\relbar}\relbar \rightarrow}
+\def\relfill {\defaultmtharrowfill \relbar \relbar \relbar}
+
+\def\triplerelbar {\mathrel\equiv}
+\def\triplerelfill{\defaultmtharrowfill\triplerelbar\triplerelbar\triplerelbar}
+
+\def\singlebond{{\xrel}} % or \def\singlebond{{\xrel[2]}}
+\def\doublebond{{\xequal}}
+\def\triplebond{{\xtriplerel}}
+
+%D Now we define most commonly used arrows. These include arrows
+%D defined in \filename{amsmath.sty}, \filename{extarrows.sty},
+%D \filename{extpfel.sty} and \filename{mathtools.sty} packages for
+%D \LATEX\ (plus a few more).
+
+\definematharrow [xrightarrow] [0359] [\specrightarrowfill]
+\definematharrow [xleftarrow] [3095] [\specleftarrowfill]
+\definematharrow [xequal] [0099] [\equalfill]
+\definematharrow [xRightarrow] [0359] [\Rightarrowfill]
+\definematharrow [xLeftarrow] [3095] [\Leftarrowfill]
+\definematharrow [xLeftrightarrow] [0099] [\Leftrightarrowfill]
+\definematharrow [xleftrightarrow] [0099] [\leftrightarrowfill]
+\definematharrow [xmapsto] [3599] [\mapstofill]
+\definematharrow [xtwoheadrightarrow] [5009] [\twoheadrightarrowfill]
+\definematharrow [xtwoheadleftarrow] [0590] [\twoheadleftarrowfill]
+\definematharrow [xrightharpoondown] [0359] [\rightharpoondownfill]
+\definematharrow [xrightharpoonup] [0359] [\rightharpoonupfill]
+\definematharrow [xleftharpoondown] [3095] [\leftharpoondownfill]
+\definematharrow [xleftharpoonup] [3095] [\leftharpoonupfill]
+\definematharrow [xhookleftarrow] [3095] [\hookleftfill]
+\definematharrow [xhookrightarrow] [0395] [\hookrightfill]
+\definematharrow [xrel] [0099] [\relfill]
+\definematharrow [xtriplerel] [0099] [\triplerelfill]
+\definematharrow [xrightoverleftarrow] [0359,3095] [\specrightarrowfill,\specleftarrowfill]
+\definematharrow [xleftrightharpoons] [3399,3399] [\leftharpoonupfill,\rightharpoondownfill]
+\definematharrow [xrightleftharpoons] [3399,3399] [\rightharpoonupfill,\leftharpoondownfill]
+
+%D These arrows can be used as follows:
+%D
+%D \startbuffer
+%D \startformula \xrightarrow{stuff on top}\stopformula
+%D \startformula \xrightarrow{}{stuff on top}\stopformula
+%D \startformula \xrightarrow{stuff below}{}\stopformula
+%D \startformula \xrightarrow{stuff below}{stuff on top}\stopformula
+%D
+%D \startformula \xleftarrow [none]{stuff below}{stuff on top}\stopformula
+%D \startformula \xleftarrow [small]{stuff below}{stuff on top}\stopformula
+%D \startformula \xleftarrow [medium]{stuff below}{stuff on top}\stopformula
+%D \startformula \xleftarrow [big]{stuff below}{stuff on top}\stopformula
+%D \stopbuffer
+%D
+%D \typebuffer which gives \getbuffer
+
+%D \macros{definemathoverarrow,defineunderarrow}
+%D
+%D These macros for define math-overarrows are adapted from
+%D \filename{amsmath.sty}
+
+\def\definemathoverarrow
+ {\dotripleargument\dodefinemathoverarrow}
+
+\def\dodefinemathoverarrow[#1][#2][#3]%
+ {\ifthirdargument
+ \setvalue{#1}{\dohandlemathoverarrow[#2][#3]}%
+ \else
+ \setvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}%
+ \fi}
+
+\def\dohandlemathoverarrow[#1][#2]%
+ {\mathpalette{\dodohandlemathoverarrow{#1}{#2}}}
+
+%D Note: \filename{math-pln.tex} has \type{\kern-\onepoint} and
+%D \filename{amsmath.sty} does not. We keep the kern amount
+%D configurable. This is useful for harpoons.
+
+\def\dodohandlemathoverarrow#1#2#3#4%
+ {\vbox{\ialign{##\crcr
+ #2#3\crcr
+ \noalign{\kern#1\nointerlineskip}%
+ $\mathsurround\zeropoint\hfil#3#4\hfil$\crcr}}}
+
+%D Now the under arrows
+
+\def\definemathunderarrow
+ {\dotripleargument\dodefinemathunderarrow}
+
+%D For underarrows the default kern is 0.3ex
+
+\def\dodefinemathunderarrow[#1][#2][#3]%
+ {\ifthirdargument
+ \setvalue{#1}{\dohandlemathunderarrow[#2][#3]}%
+ \else
+ \setvalue{#1}{\dohandlemathunderarrow[0.3ex][#2]}%
+ \fi}
+
+\def\dohandlemathunderarrow[#1][#2]%
+ {\mathpalette{\dodohandlemathunderarrow{#1}{#2}}}
+
+\def\dodohandlemathunderarrow#1#2#3#4%
+ {\vtop{\ialign{##\crcr
+ $\mathsurround\zeropoint\hfil#3#4\hfil$\crcr
+ \noalign{\nointerlineskip\kern#1}%
+ #2#3\crcr}}}
+
+%D Now we define the arrows
+
+\definemathoverarrow [overleftarrow] [\specleftarrowfill]
+\definemathoverarrow [overrightarrow] [\specrightarrowfill]
+\definemathoverarrow [overleftrightarrow] [\leftrightarrowfill]
+\definemathoverarrow [overtwoheadrightarrow] [\twoheadrightarrowfill]
+\definemathoverarrow [overtwoheadleftarrow] [\twoheadleftarrowfill]
+\definemathoverarrow [overrightharpoondown] [1pt] [\rightharpoondownfill]
+\definemathoverarrow [overrightharpoonup] [\rightharpoonupfill]
+\definemathoverarrow [overleftharpoondown] [1pt] [\leftharpoondownfill]
+\definemathoverarrow [overleftharpoonup] [\leftharpoonupfill]
+
+\definemathunderarrow [underleftarrow] [\specleftarrowfill]
+\definemathunderarrow [underrightarrow] [\specrightarrowfill]
+\definemathunderarrow [underleftrightarrow] [\leftrightarrowfill]
+\definemathunderarrow [undertwoheadrightarrow][\twoheadrightarrowfill]
+\definemathunderarrow [undertwoheadleftarrow] [\twoheadleftarrowfill]
+\definemathunderarrow [underrightharpoondown] [\rightharpoondownfill]
+\definemathunderarrow [underrightharpoonup] [\rightharpoonupfill]
+\definemathunderarrow [underleftharpoondown] [\leftharpoondownfill]
+\definemathunderarrow [underleftharpoonup] [\leftharpoonupfill]
+
+%D These can be used as follows:
+%D
+%D \startbuffer
+%D $\overleftarrow{A}$ $\overleftarrow{ABC}$
+%D $a_{\overleftarrow{A}}$ $b_{\overleftarrow{ABC}}$
+%D \stopbuffer
+%D \typebuffer which gives \getbuffer
+
+%D TODO: Possibly have a single arrow command define all the arrows.
+
+\protect \endinput
diff --git a/tex/context/base/math-arr.mkiv b/tex/context/base/math-arr.mkiv
new file mode 100644
index 000000000..389112b16
--- /dev/null
+++ b/tex/context/base/math-arr.mkiv
@@ -0,0 +1,439 @@
+%D \module
+%D [ file=math-arr,
+%D version=2007.07.19,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Arrows,
+%D author={Hans Hagen \& Taco Hoekwater \& Aditya Mahajan},
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Arrows}
+
+\unprotect
+
+%D These will be generalized! Is it still needed in \MKIV?
+
+\def\exmthfont#1{\symbolicsizedfont#1\plusone{MathExtension}}
+
+\def\domthfrac#1#2#3#4#5#6#7%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox0\hbox{$#1 #6$}%
+ \setbox2\hbox{$#1 #7$}%
+ \dimen0\wd0
+ \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
+ \setbox4\hbox to \dimen0{\exmthfont#2#3\leaders\hbox{#4}\hss#5}%
+ \mathord{\vcenter{{\offinterlineskip
+ \hbox to \dimen0{\hss\box0\hss}%
+ \kern \ht4%
+ \hbox to \dimen0{\hss\copy4\hss}%
+ \kern \ht4%
+ \hbox to \dimen0{\hss\box2\hss}}}}%
+ \endgroup}
+
+\def\domthsqrt#1#2#3#4#5%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox0\hbox{$#1 #5$}%
+ \dimen0=1.05\ht0 \advance\dimen0 1pt \ht0 \dimen0
+ \dimen0=1.05\dp0 \advance\dimen0 1pt \dp0 \dimen0
+ \dimen0\wd0
+ \setbox4\hbox to \dimen0{\exmthfont#2\leaders\hbox{#3}\hfill#4}%
+ \delimitershortfall=0pt
+ \nulldelimiterspace=0pt
+ \setbox2\hbox{$\left\delimiter"0270370 \vrule height\ht0 depth \dp0 width0pt
+ \right.$}%
+ \mathord{\vcenter{\hbox{\copy2
+ \rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
+ \endgroup}
+
+\def\mthfrac#1#2#3#4#5{\mathchoice
+ {\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
+
+\def\mthsqrt#1#2#3{\mathchoice
+ {\domthsqrt\displaystyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\textstyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\scriptstyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\scriptscriptstyle\textface {#1}{#2}{#3}}}
+
+% temp here
+
+%D We next define extensible arrows. Extensible arrows are arrows that
+%D change their length according to the width of the text to be placed
+%D above and below the arrow. Since we need to define a lot of arrows,
+%D we first define some helper macros. The basic idea is to measure
+%D the width of the box to be placed above and below the arrow, and
+%D make the \quotation{body} of the arrow as long as the bigger of the
+%D two widths.
+
+\def\mtharrfactor{1}
+\def\mtharrextra {0}
+
+\def\domthxarr#1#2#3#4#5% hm, looks like we do a double mathrel
+ {\begingroup
+ \def\mtharrfactor{1}%
+ \def\mtharrextra {0}%
+ \processaction[#1] % will be sped up
+ [ \v!none=>\def\mtharrfactor{0},
+ \v!small=>\def\mtharrextra{10},
+ \v!medium=>\def\mtharrextra{15},
+ \v!big=>\def\mtharrextra{20},
+ \v!normal=>,
+ \v!default=>,
+ \v!unknown=>\doifnumberelse{#1}{\def\mtharrextra{#1}}\donothing]%
+ \mathsurround\zeropoint
+ \muskip0=\thirdoffourarguments #2mu
+ \muskip2=\fourthoffourarguments #2mu
+ \muskip4=\firstoffourarguments #2mu
+ \muskip6=\secondoffourarguments #2mu
+ \muskip0=\mtharrfactor\muskip0 \advance\muskip0 \mtharrextra mu
+ \muskip2=\mtharrfactor\muskip2 \advance\muskip2 \mtharrextra mu
+ \setbox0\hbox{$\scriptstyle
+ \mkern\muskip4\relax
+ \mkern\muskip0\relax
+ #5\relax
+ \mkern\muskip2\relax
+ \mkern\muskip6\relax
+ $}%
+ \setbox4\hbox{#3\displaystyle}%
+ \dimen0\wd0
+ \ifdim\wd4>\dimen0 \dimen0\wd4 \fi
+ \setbox2\hbox{$\scriptstyle
+ \mkern\muskip4\relax
+ \mkern\muskip0\relax
+ #4\relax
+ \mkern\muskip2\relax
+ \mkern\muskip6\relax
+ $}%
+ \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
+ \setbox4\hbox to \dimen0{#3\displaystyle}%
+ \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits^{\box0}_{\box2}}
+ \endgroup}
+
+\let\domthxarrsingle\domthxarr
+
+%D There are some arrows which are created by stacking two arrows. The next
+%D macro helps in defining such \quotation{double arrows}.
+
+\def\domthxarrdouble#1#2#3#4#5#6#7% opt l r sp rs top bot
+ {\mathrel
+ {\scratchdimen.32ex\relax % was .22, todo: make configurable
+ \setbox0\hbox{$\domthxarr{#1}{#2}{#4}{\phantom{#6}}{#7}$}%
+ \setbox2\hbox{$\domthxarr{#1}{#3}{#5}{#6}{\phantom{#7}}$}%
+ \raise\scratchdimen\box0
+ \kern-\wd2
+ \lower\scratchdimen\box2}}
+
+%D \macros{definematharrow}
+%D
+%D Macro for defining new arrows. We can define two types of
+%D arrows|<|single arrows and double arrows. Single arrows are defined
+%D as
+%D
+%D \starttyping
+%D \definematharrow [xrightarrow] [0359] [\rightarrowfill]
+%D \stoptyping
+%D
+%D The first argument is the name of the arrow (\tex{xrightarrow} in
+%D this case.) The second argument consists of a set of 4 numbers and
+%D specify the spacing correction in math units~\type{mu}. These
+%D numbers define:
+%D
+%D \startlines
+%D 1st number: arrow||tip correction
+%D 2nd number: arrow||tip correction
+%D 3rd number: space (multiplied by \tex{matharrfactor} and advanced by \tex{matharrextra})
+%D 4th number: space (multiplied by \tex{matharrfactor} and advanced by \tex{matharrextra})
+%D \stoplines
+%D
+%D The third argument is the name of the extensible fill. The third
+%D argument is optional when the arrow is redefined later (this is
+%D useful for font specific tweaking of the skips.) For example,
+%D
+%D \startbuffer
+%D \math{\xrightarrow{above}}
+%D \definematharrow[xrightarrow][0000]
+%D \math{\xrightarrow{above}}
+%D \definematharrow[xrightarrow][55{50}{50}]
+%D \math{\xrightarrow{above}}
+%D \stopbuffer
+%D \typebuffer gives {\getbuffer}
+%D
+%D The double arrows are defined as follows
+%D
+%D \starttyping
+%D \definematharrow [xrightleftharpoons] [3095,0359]
+%D [\rightharpoonupfill,\leftharpoondownfill]
+%D \stoptyping
+%D
+%D The second and the third set of arguments consist of comma
+%D separated values. The first element of the second argument
+%D (\type{3095}) corresponds to the spacing correction of top arrow
+%D fill (\tex{rightarrowupfill}). Similarly, \type{0359} corresponds
+%D to bottom arrow fill \tex{leftharpoondownfill}). Stacking them on
+%D top of each other we get $\xrightleftharpoons[big]{above}{below}$.
+%D The following math arrows are defined
+%D
+%D \placetable[none]{}{\starttable[|l|m|]
+%D \NC \tex{xrightarrow } \NC \xrightarrow [big] \NC \NR
+%D \NC \tex{xleftarrow } \NC \xleftarrow [big] \NC \NR
+%D \NC \tex{xequal } \NC \xequal [big] \NC \NR
+%D \NC \tex{xRightarrow } \NC \xRightarrow [big] \NC \NR
+%D \NC \tex{xLeftarrow } \NC \xLeftarrow [big] \NC \NR
+%D \NC \tex{xLeftrightarrow } \NC \xLeftrightarrow [big] \NC \NR
+%D \NC \tex{xleftrightarrow } \NC \xleftrightarrow [big] \NC \NR
+%D \NC \tex{xmapsto } \NC \xmapsto [big] \NC \NR
+%D \NC \tex{xtwoheadrightarrow } \NC \xtwoheadrightarrow [big] \NC \NR
+%D \NC \tex{xtwoheadleftarrow } \NC \xtwoheadleftarrow [big] \NC \NR
+%D \NC \tex{xrightharpoondown } \NC \xrightharpoondown [big] \NC \NR
+%D \NC \tex{xrightharpoonup } \NC \xrightharpoonup [big] \NC \NR
+%D \NC \tex{xleftharpoondown } \NC \xleftharpoondown [big] \NC \NR
+%D \NC \tex{xleftharpoonup } \NC \xleftharpoonup [big] \NC \NR
+%D \NC \tex{xhookleftarrow } \NC \xhookleftarrow [big] \NC \NR
+%D \NC \tex{xhookrightarrow } \NC \xhookrightarrow [big] \NC \NR
+%D \NC \tex{xleftrightharpoons } \NC \xleftrightharpoons [big] \NC \NR
+%D \NC \tex{xrightleftharpoons } \NC \xrightleftharpoons [big] \NC \NR
+%D \stoptable}
+
+\unexpanded\def\definematharrow
+ {\doquadrupleargument\dodefinematharrow}
+
+\def\dodefinematharrow[#1][#2][#3][#4]% name type[none|both] template command
+ {\iffourthargument
+ \executeifdefined{dodefine#2arrow}\gobblethreearguments{#1}{#3}{#4}%
+ \else\ifthirdargument
+ \dodefinebotharrow{#1}{#2}{#3}%
+ \else\ifsecondargument
+ \redefinebotharrow{#1}{#2}{#3}%
+ \fi\fi\fi}
+
+\def\redefinebotharrow#1#2#3% real dirty, this overload!
+ {\doifdefined{#1}
+ {\pushmacro\dohandlemtharrow
+ \def\dohandlemtharrow[##1][##2]{\setuvalue{#1}{\dohandlemtharrow[#2][##2]}}%
+ % == \def\dohandlemtharrow[##1][##2]{\dodefinebotharrow{#1}{#2}{##2}}%
+ \getvalue{#1}%
+ \popmacro\dohandlemtharrow}}
+
+\def\dodefinebotharrow#1#2#3%
+ {\setuvalue{#1}{\dohandlemtharrow[#2][#3]}}
+
+\def\dohandlemtharrow
+ {\dotripleempty\doxmtharrow}
+
+\def\doxmtharrow[#1][#2][#3]% #3 == optional arg
+ {\def\dodoxmtharrow{\dododoxmtharrow[#1,\empty,\empty][#2,\empty,\empty][#3]}% {##1}{##2}
+ \dodoublegroupempty\dodoxmtharrow}
+
+\def\dododoxmtharrow[#1,#2,#3][#4,#5,#6][#7]#8#9% [3] is the optional arg
+ {\edef\!!stringa{#2}%
+ \ifx\!!stringa\empty
+ \ifsecondargument
+ \mathrel{\domthxarrsingle{#7}{#1}{#4}{#8}{#9}}%
+ \else
+ \mathrel{\domthxarrsingle{#7}{#1}{#4}{}{#8}}%
+ \fi
+ \else
+ \ifsecondargument
+ \mathrel{\domthxarrdouble{#7}{#1}{#2}{#4}{#5}{#8}{#9}}%
+ \else
+ \mathrel{\domthxarrdouble{#7}{#1}{#2}{#4}{#5}{}{#8}}%
+ \fi
+ \fi}
+
+% Adapted from amsmath.
+
+%D \macros{mtharrowfill,defaultmtharrowfill}
+%D
+%D To extend the arrows we need to define a \quotation{math arrow
+%D fill}. This command takes 8 arguments: the first four correspond
+%D the second argument of \tex{definematharrow} explained above. The
+%D other three specify the tail, body and head of the arrow. The last
+%D argument specifies the math-mode in which the arrow is drawn.
+%D \tex{defaultmtharrowfill} has values tweaked to match Latin Modern
+%D fonts. For fonts that are significantly different (e.g. cows) a
+%D different set of values need to be determined.
+
+\def\mtharrowfill#1#2#3#4#5#6#7#8%
+ {$\mathsurround 0pt
+ \thickmuskip0mu\medmuskip\thickmuskip\thinmuskip\thickmuskip
+ \relax#8#5%
+ \mkern-#1mu
+ \cleaders\hbox{$#8\mkern -#2mu#6\mkern -#3mu$}\hfill
+ \mkern-#4mu#7$}
+
+\def\defaultmtharrowfill{\mtharrowfill 7227}
+
+%D We now define some arrow fills that will be used for defining the
+%D arrows. Plain \TEX\ already defines \tex{leftarrowfill} and
+%D \tex{rightarrowfill}. The \tex{defaultmtharrowfill} command defines an
+%D arrowfill that takes an argument (so that it can also be used
+%D with over and under arrows). However the Plain \TEX\ definitions of
+%D \tex{leftarrowfill} and \tex{rightarrowfill} do not take this extra
+%D argument. To be backward compatible with Plain \TEX, we define two
+%D arrowfills: \tex{specrightarrowfill} which takes an extra argument, and
+%D \tex{rightarrowfill} which does not.
+
+\unexpanded\def\specrightarrowfill {\defaultmtharrowfill \relbar \relbar \rightarrow}
+\unexpanded\def\specleftarrowfill {\defaultmtharrowfill \leftarrow \relbar \relbar}
+
+\unexpanded\def\rightarrowfill {\specrightarrowfill \textstyle}
+\unexpanded\def\leftarrowfill {\specleftarrowfill \textstyle}
+
+\unexpanded\def\equalfill {\defaultmtharrowfill \Relbar \Relbar \Relbar}
+\unexpanded\def\Rightarrowfill {\defaultmtharrowfill \Relbar \Relbar \Rightarrow}
+\unexpanded\def\Leftarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Relbar}
+\unexpanded\def\Leftrightarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Rightarrow}
+\unexpanded\def\leftrightarrowfill {\defaultmtharrowfill \leftarrow \relbar \rightarrow}
+\unexpanded\def\mapstofill {\defaultmtharrowfill{\mapstochar\relbar} \relbar \rightarrow}
+\unexpanded\def\twoheadrightarrowfill{\defaultmtharrowfill \relbar \relbar \twoheadrightarrow}
+\unexpanded\def\twoheadleftarrowfill {\defaultmtharrowfill \twoheadleftarrow \relbar \relbar}
+\unexpanded\def\rightharpoondownfill {\defaultmtharrowfill \relbar \relbar \rightharpoondown}
+\unexpanded\def\rightharpoonupfill {\defaultmtharrowfill \relbar \relbar \rightharpoonup}
+\unexpanded\def\leftharpoondownfill {\defaultmtharrowfill \leftharpoondown \relbar \relbar}
+\unexpanded\def\leftharpoonupfill {\defaultmtharrowfill \leftharpoonup \relbar \relbar}
+\unexpanded\def\hookleftfill {\defaultmtharrowfill \leftarrow \relbar{\relbar\joinrel\rhook}}
+\unexpanded\def\hookrightfill {\defaultmtharrowfill{\lhook\joinrel\relbar}\relbar \rightarrow}
+\unexpanded\def\relfill {\defaultmtharrowfill \relbar \relbar \relbar}
+
+\unexpanded\def\triplerelbar {\mathrel\equiv}
+\unexpanded\def\triplerelfill{\defaultmtharrowfill\triplerelbar\triplerelbar\triplerelbar}
+
+\unexpanded\def\singlebond{{\xrel}} % or \def\singlebond{{\xrel[2]}}
+\unexpanded\def\doublebond{{\xequal}}
+\unexpanded\def\triplebond{{\xtriplerel}}
+
+%D Now we define most commonly used arrows. These include arrows
+%D defined in \filename{amsmath.sty}, \filename{extarrows.sty},
+%D \filename{extpfel.sty} and \filename{mathtools.sty} packages for
+%D \LATEX\ (plus a few more).
+
+\definematharrow [xrightarrow] [0359] [\specrightarrowfill]
+\definematharrow [xleftarrow] [3095] [\specleftarrowfill]
+\definematharrow [xequal] [0099] [\equalfill]
+\definematharrow [xRightarrow] [0359] [\Rightarrowfill]
+\definematharrow [xLeftarrow] [3095] [\Leftarrowfill]
+\definematharrow [xLeftrightarrow] [0099] [\Leftrightarrowfill]
+\definematharrow [xleftrightarrow] [0099] [\leftrightarrowfill]
+\definematharrow [xmapsto] [3599] [\mapstofill]
+\definematharrow [xtwoheadrightarrow] [5009] [\twoheadrightarrowfill]
+\definematharrow [xtwoheadleftarrow] [0590] [\twoheadleftarrowfill]
+\definematharrow [xrightharpoondown] [0359] [\rightharpoondownfill]
+\definematharrow [xrightharpoonup] [0359] [\rightharpoonupfill]
+\definematharrow [xleftharpoondown] [3095] [\leftharpoondownfill]
+\definematharrow [xleftharpoonup] [3095] [\leftharpoonupfill]
+\definematharrow [xhookleftarrow] [3095] [\hookleftfill]
+\definematharrow [xhookrightarrow] [0395] [\hookrightfill]
+\definematharrow [xrel] [0099] [\relfill]
+\definematharrow [xtriplerel] [0099] [\triplerelfill]
+\definematharrow [xrightoverleftarrow] [0359,3095] [\specrightarrowfill,\specleftarrowfill]
+\definematharrow [xleftrightharpoons] [3399,3399] [\leftharpoonupfill,\rightharpoondownfill]
+\definematharrow [xrightleftharpoons] [3399,3399] [\rightharpoonupfill,\leftharpoondownfill]
+
+%D These arrows can be used as follows:
+%D
+%D \startbuffer
+%D \startformula \xrightarrow{stuff on top}\stopformula
+%D \startformula \xrightarrow{}{stuff on top}\stopformula
+%D \startformula \xrightarrow{stuff below}{}\stopformula
+%D \startformula \xrightarrow{stuff below}{stuff on top}\stopformula
+%D
+%D \startformula \xleftarrow [none]{stuff below}{stuff on top}\stopformula
+%D \startformula \xleftarrow [small]{stuff below}{stuff on top}\stopformula
+%D \startformula \xleftarrow [medium]{stuff below}{stuff on top}\stopformula
+%D \startformula \xleftarrow [big]{stuff below}{stuff on top}\stopformula
+%D \stopbuffer
+%D
+%D \typebuffer which gives \getbuffer
+
+%D \macros{definemathoverarrow,defineunderarrow}
+%D
+%D These macros for define math-overarrows are adapted from
+%D \filename{amsmath.sty}
+
+\unexpanded\def\definemathoverarrow
+ {\dotripleargument\dodefinemathoverarrow}
+
+\def\dodefinemathoverarrow[#1][#2][#3]%
+ {\ifthirdargument
+ \setuvalue{#1}{\dohandlemathoverarrow[#2][#3]}%
+ \else
+ \setuvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}%
+ \fi}
+
+\def\dohandlemathoverarrow[#1][#2]%
+ {\mathpalette{\dodohandlemathoverarrow{#1}{#2}}}
+
+%D Note: \filename{math-pln.tex} has \type{\kern-\onepoint} and
+%D \filename{amsmath.sty} does not. We keep the kern amount
+%D configurable. This is useful for harpoons.
+
+\def\dodohandlemathoverarrow#1#2#3#4%
+ {\vbox{\ialign{##\crcr
+ #2#3\crcr
+ \noalign{\kern#1\nointerlineskip}%
+ $\mathsurround\zeropoint\hfil#3#4\hfil$\crcr}}}
+
+%D Now the under arrows
+
+\unexpanded\def\definemathunderarrow
+ {\dotripleargument\dodefinemathunderarrow}
+
+%D For underarrows the default kern is 0.3ex
+
+\def\dodefinemathunderarrow[#1][#2][#3]%
+ {\ifthirdargument
+ \setuvalue{#1}{\dohandlemathunderarrow[#2][#3]}%
+ \else
+ \setuvalue{#1}{\dohandlemathunderarrow[0.3ex][#2]}%
+ \fi}
+
+\def\dohandlemathunderarrow[#1][#2]%
+ {\mathpalette{\dodohandlemathunderarrow{#1}{#2}}}
+
+\def\dodohandlemathunderarrow#1#2#3#4%
+ {\vtop{\ialign{##\crcr
+ $\mathsurround\zeropoint\hfil#3#4\hfil$\crcr
+ \noalign{\nointerlineskip\kern#1}%
+ #2#3\crcr}}}
+
+%D Now we define the arrows
+
+\definemathoverarrow [overleftarrow] [\specleftarrowfill]
+\definemathoverarrow [overrightarrow] [\specrightarrowfill]
+\definemathoverarrow [overleftrightarrow] [\leftrightarrowfill]
+\definemathoverarrow [overtwoheadrightarrow] [\twoheadrightarrowfill]
+\definemathoverarrow [overtwoheadleftarrow] [\twoheadleftarrowfill]
+\definemathoverarrow [overrightharpoondown] [1pt] [\rightharpoondownfill]
+\definemathoverarrow [overrightharpoonup] [\rightharpoonupfill]
+\definemathoverarrow [overleftharpoondown] [1pt] [\leftharpoondownfill]
+\definemathoverarrow [overleftharpoonup] [\leftharpoonupfill]
+
+\definemathunderarrow [underleftarrow] [\specleftarrowfill]
+\definemathunderarrow [underrightarrow] [\specrightarrowfill]
+\definemathunderarrow [underleftrightarrow] [\leftrightarrowfill]
+\definemathunderarrow [undertwoheadrightarrow][\twoheadrightarrowfill]
+\definemathunderarrow [undertwoheadleftarrow] [\twoheadleftarrowfill]
+\definemathunderarrow [underrightharpoondown] [\rightharpoondownfill]
+\definemathunderarrow [underrightharpoonup] [\rightharpoonupfill]
+\definemathunderarrow [underleftharpoondown] [\leftharpoondownfill]
+\definemathunderarrow [underleftharpoonup] [\leftharpoonupfill]
+
+%D These can be used as follows:
+%D
+%D \startbuffer
+%D $\overleftarrow{A}$ $\overleftarrow{ABC}$
+%D $a_{\overleftarrow{A}}$ $b_{\overleftarrow{ABC}}$
+%D \stopbuffer
+%D \typebuffer which gives \getbuffer
+
+%D TODO: Possibly have a single arrow command define all the arrows.
+
+\protect \endinput
diff --git a/tex/context/base/math-cow.mkii b/tex/context/base/math-cow.mkii
new file mode 100644
index 000000000..f0fc811c8
--- /dev/null
+++ b/tex/context/base/math-cow.mkii
@@ -0,0 +1,31 @@
+%D \module
+%D [ file=math-cow,
+%D version=2006.06.23,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Cow Math,
+%D author={Hans Hagen \& Taco Hoekwater},
+%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.
+
+\unprotect
+
+\def\COWsqrt {\mthsqrt{\char"7A}{\char"7B}}
+\def\COWfrac {\mthfrac{\char"7C}{\char"7A}{\char"7B}}
+\def\COWarrowfill{\mtharrowfill 1001}
+
+\startmathcollection [cow]
+ % todo
+\stopmathcollection
+
+\startrawmathcollection[cow]
+ \definemathcommand [frac] {\COWfrac}
+ \definemathcommand [sqrt] {\COWsqrt}
+ %definemathcommand [r@@t] {\COWroot}
+ %definemathcommand [matrix] {\COWmatrix}
+\stoprawmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-def.mkiv b/tex/context/base/math-def.mkiv
new file mode 100644
index 000000000..50c9902dd
--- /dev/null
+++ b/tex/context/base/math-def.mkiv
@@ -0,0 +1,374 @@
+%D \module
+%D [ file=math-tex,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Definitions,
+%D author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan},
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Definitions}
+
+\unprotect
+
+\ifx\mrfam\undefined \chardef\mrfam\plusone \fi
+
+\startluacode
+ mathematics.define()
+ mathematics.register_xml_entities()
+\stopluacode
+
+% special .. todo
+
+\mathcode`\ ="8000 \mathcode`\_="8000 \mathcode`\'="8000
+
+% will be attributes
+
+\setfalse \automathpunctuation
+
+\def\enablemathpunctuation {\settrue \automathpunctuation}
+\def\disablemathpunctuation{\setfalse\automathpunctuation}
+
+\def\v!autopunctuation{autopunctuation}
+
+\appendtoks
+ \doifelse{\mathematicsparameter\v!autopunctuation}\v!yes\enablemathpunctuation\disablemathpunctuation
+\to \everysetupmathematics
+
+% \appendtoks
+% \ifconditional\automathpunctuation\attribute\mathpunctuationattribute\plusone\fi
+% \to \everymathematics
+
+\setupmathematics[\v!autopunctuation=\v!yes]
+
+% will go to math-ext
+
+\Umathchardef\braceld=0 \mrfam "FF07A
+\Umathchardef\bracerd=0 \mrfam "FF07B
+\Umathchardef\bracelu=0 \mrfam "FF07C
+\Umathchardef\braceru=0 \mrfam "FF07D
+
+% ctx specific
+
+\def\|{|} % still letter
+
+% The \mfunction macro is an alternative for \hbox with a
+% controlable font switch.
+
+\definemathcommand [arccos] [nolop] {\mfunctionlabeltext{arccos}}
+\definemathcommand [arcsin] [nolop] {\mfunctionlabeltext{arcsin}}
+\definemathcommand [arctan] [nolop] {\mfunctionlabeltext{arctan}}
+\definemathcommand [arg] [nolop] {\mfunctionlabeltext{arg}}
+\definemathcommand [cosh] [nolop] {\mfunctionlabeltext{cosh}}
+\definemathcommand [cos] [nolop] {\mfunctionlabeltext{cos}}
+\definemathcommand [coth] [nolop] {\mfunctionlabeltext{coth}}
+\definemathcommand [cot] [nolop] {\mfunctionlabeltext{cot}}
+\definemathcommand [csc] [nolop] {\mfunctionlabeltext{csc}}
+\definemathcommand [deg] [nolop] {\mfunctionlabeltext{deg}}
+\definemathcommand [det] [limop] {\mfunctionlabeltext{det}}
+\definemathcommand [dim] [nolop] {\mfunctionlabeltext{dim}}
+\definemathcommand [exp] [nolop] {\mfunctionlabeltext{exp}}
+\definemathcommand [gcd] [limop] {\mfunctionlabeltext{gcd}}
+\definemathcommand [hom] [nolop] {\mfunctionlabeltext{hom}}
+\definemathcommand [inf] [limop] {\mfunctionlabeltext{inf}}
+\definemathcommand [injlim] [limop] {\mfunctionlabeltext{injlim}}
+\definemathcommand [ker] [nolop] {\mfunctionlabeltext{ker}}
+\definemathcommand [lg] [nolop] {\mfunctionlabeltext{lg}}
+\definemathcommand [liminf] [limop] {\mfunctionlabeltext{liminf}}
+\definemathcommand [limsup] [limop] {\mfunctionlabeltext{limsup}}
+\definemathcommand [lim] [limop] {\mfunctionlabeltext{lim}}
+\definemathcommand [ln] [nolop] {\mfunctionlabeltext{ln}}
+\definemathcommand [log] [nolop] {\mfunctionlabeltext{log}}
+\definemathcommand [median] [limop] {\mfunctionlabeltext{median}}
+\definemathcommand [max] [limop] {\mfunctionlabeltext{max}}
+\definemathcommand [min] [limop] {\mfunctionlabeltext{min}}
+\definemathcommand [mod] [limop] {\mfunctionlabeltext{mod}}
+%definemathcommand [div] [limop] {\mfunctionlabeltext{div}} % overloads \div symbol
+\definemathcommand [projlim] [limop] {\mfunctionlabeltext{projlim}}
+\definemathcommand [Pr] [limop] {\mfunctionlabeltext{Pr}}
+\definemathcommand [sec] [nolop] {\mfunctionlabeltext{sec}}
+\definemathcommand [sinh] [nolop] {\mfunctionlabeltext{sinh}}
+\definemathcommand [sin] [nolop] {\mfunctionlabeltext{sin}}
+\definemathcommand [sup] [limop] {\mfunctionlabeltext{sup}}
+\definemathcommand [tanh] [nolop] {\mfunctionlabeltext{tanh}}
+\definemathcommand [tan] [nolop] {\mfunctionlabeltext{tan}}
+
+\definemathcommand [integers] {{\mathblackboard Z}}
+\definemathcommand [reals] {{\mathblackboard R}}
+\definemathcommand [rationals] {{\mathblackboard Q}}
+\definemathcommand [naturalnumbers]{{\mathblackboard N}}
+\definemathcommand [complexes] {{\mathblackboard C}}
+\definemathcommand [primes] {{\mathblackboard P}}
+
+\let\normalmatharg\arg % todo: maybe automatically
+
+% using attributes
+
+\chardef\bigmathdelimitermethod\plusone
+
+\def\plainbigdelimiters % traditional method
+ {\chardef\bigmathdelimitermethod\plustwo}
+
+\def\doplainbigmath#1#2%
+ {{\hbox{$%
+ \nulldelimiterspace\zeropoint\relax
+ \mathsurround\zeropoint
+ $}}}
+
+\def\doleftbigmath #1{\ifx#1\relax\else\left#1\expandafter\doleftbigmath \fi}
+\def\dorightbigmath#1{\ifx#1\relax\else\right.\expandafter\dorightbigmath\fi}
+
+\def\choosemathbig#1#2% so we accent \big{||} as well
+ {{\hbox{$%
+ \ifcase\bigmathdelimitermethod
+ \doleftbigmath#2\relax
+ \dorightbigmath#2\relax
+ \or
+ \attribute\mathsizeattribute#1\relax
+ \doleftbigmath#2\relax
+ \dorightbigmath#2\relax
+ \else
+ \doleftbigmath#2\relax
+ \vbox\!!to\getvalue{\??mm:b:\number#1}\bodyfontsize{}%
+ \dorightbigmath#2\relax
+ \fi
+ \nulldelimiterspace\zeropoint\relax
+ \mathsurround\zeropoint
+ $}}}
+
+\definemathcommand [big] {\choosemathbig\plusone } \setvalue{\??mm:b:1}{0.85}
+\definemathcommand [Big] {\choosemathbig\plustwo } \setvalue{\??mm:b:2}{1.15}
+\definemathcommand [bigg] {\choosemathbig\plusthree} \setvalue{\??mm:b:3}{1.45}
+\definemathcommand [Bigg] {\choosemathbig\plusfour } \setvalue{\??mm:b:4}{1.75}
+
+\definemathcommand [bigl] [open] [one] {\big}
+\definemathcommand [bigm] [rel] [one] {\big}
+\definemathcommand [bigr] [close] [one] {\big}
+\definemathcommand [Bigl] [open] [one] {\Big}
+\definemathcommand [Bigm] [rel] [one] {\Big}
+\definemathcommand [Bigr] [close] [one] {\Big}
+\definemathcommand [biggl] [open] [one] {\bigg}
+\definemathcommand [biggm] [rel] [one] {\bigg}
+\definemathcommand [biggr] [close] [one] {\bigg}
+\definemathcommand [Biggl] [open] [one] {\Bigg}
+\definemathcommand [Biggm] [rel] [one] {\Bigg}
+\definemathcommand [Biggr] [close] [one] {\Bigg}
+
+% special
+
+%AM: Optimize this! Add similar options for sums.
+
+\def\setoperatorlimits#1#2% operator limits
+ {\savenormalmeaning{#1}%
+ \def#1{\csname normal\strippedcsname#1\endcsname#2}}
+
+\setoperatorlimits\int \intlimits
+\setoperatorlimits\iint \intlimits
+\setoperatorlimits\iiint \intlimits
+\setoperatorlimits\oint \intlimits
+\setoperatorlimits\oiint \intlimits
+\setoperatorlimits\oiiint \intlimits
+\setoperatorlimits\intclockwise \intlimits
+\setoperatorlimits\ointclockwise \intlimits
+\setoperatorlimits\ointctrclockwise \intlimits
+
+%D This is a temporary hack until we figure out how to do this correctly.
+
+\unexpanded\def\implies {\mathrel{\;\Longrightarrow\;}}
+\unexpanded\def\impliedby{\mathrel{\;\Longleftarrow\;}}
+\unexpanded\def\And {\mathrel{\;\internalAnd\;}}
+\unexpanded\def\iff {\;\Longleftrightarrow\;}
+
+% todo: virtual in math-vfu
+
+% \definemathcommand [mapsto] {\mapstochar\rightarrow}
+% \definemathcommand [hookrightarrow] {\lhook\joinrel\rightarrow}
+% \definemathcommand [hookleftarrow] {\leftarrow\joinrel\rhook}
+% \definemathcommand [bowtie] {\mathrel\triangleright\joinrel\mathrel\triangleleft}
+% \definemathcommand [models] {\mathrel|\joinrel=}
+% \definemathcommand [iff] {\;\Longleftrightarrow\;}
+
+% hm
+
+% ldots = 2026
+% vdots = 22EE
+% cdots = 22EF
+% ddots = 22F1
+% udots = 22F0
+
+% \def\PLAINldots{\ldotp\ldotp\ldotp}
+% \def\PLAINcdots{\cdotp\cdotp\cdotp}
+
+% \def\PLAINvdots
+% {\vbox{\baselineskip.4\bodyfontsize\lineskiplimit\zeropoint\kern.6\bodyfontsize\hbox{.}\hbox{.}\hbox{.}}}
+
+% \def\PLAINddots
+% {\mkern1mu%
+% \raise.7\bodyfontsize\vbox{\kern.7\bodyfontsize\hbox{.}}%
+% \mkern2mu%
+% \raise.4\bodyfontsize\relax\hbox{.}%
+% \mkern2mu%
+% \raise.1\bodyfontsize\hbox{.}%
+% \mkern1mu}
+
+% \definemathcommand [ldots] [inner] {\PLAINldots}
+% \definemathcommand [cdots] [inner] {\PLAINcdots}
+% \definemathcommand [vdots] [nothing] {\PLAINvdots}
+% \definemathcommand [ddots] [inner] {\PLAINddots}
+
+%D \starttyping
+%D $\sqrt[3]{10}$
+%D \stoptyping
+
+\def\rootradical{\Uroot 0 "221A } % can be done in char-def
+
+\def\root#1\of{\rootradical{#1}} % #2
+
+\unexpanded\def\sqrt{\doifnextoptionalelse\rootwithdegree\rootwithoutdegree}
+
+\def\rootwithdegree [#1]{\rootradical{#1}}
+\def\rootwithoutdegree {\rootradical {}}
+
+\def\PLAINmatrix#1%
+ {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+
+\definemathcommand [mathstrut] {\vphantom{(}}
+\definemathcommand [joinrel] {\mathrel{\mkern-3mu}}
+
+% \definemathcommand [matrix] {\PLAINmatrix}
+% \definemathcommand [over] {\normalover} % hack, to do
+
+\unexpanded\def\{{\mathortext\lbrace\letterleftbrace }
+\unexpanded\def\}{\mathortext\rbrace\letterrightbrace}
+
+%D The following colon related definitions are provided by Aditya
+%D Mahajan who derived them from \type {mathtools.sty} and \type
+%D {colonequals.sty}.
+
+%D \macros
+%D {centercolon, colonminus, minuscolon, colonequals, equalscolon,
+%D colonapprox, approxcolon, colonsim, simcolon, coloncolon,
+%D coloncolonminus, minuscoloncolon, coloncolonequals,
+%D equalscoloncolon, coloncolonapprox, approxcoloncolon,
+%D colonsim, simcoloncolon}
+%D
+%D In $a := b$ the colon is not vertically centered with the equal
+%D to. Also the distance between colon and equal to is a bit large.
+%D So, we define a vertically centered colon \tex {centercolon} and
+%D a few macros for colon and double colon relation symbols.
+%D
+%D \startlines
+%D \formula {A \centercolon B}
+%D \formula {A \colonminus B}
+%D \formula {A \minuscolon B}
+%D \formula {A \colonequals B}
+%D \formula {A \equalscolon B}
+%D \formula {A \colonapprox B}
+%D \formula {A \approxcolon B}
+%D \formula {A \colonsim B}
+%D \formula {A \simcolon B}
+%D \formula {A \coloncolon B}
+%D \formula {A \coloncolonminus B}
+%D \formula {A \minuscoloncolon B}
+%D \formula {A \coloncolonequals B}
+%D \formula {A \equalscoloncolon B}
+%D \formula {A \coloncolonapprox B}
+%D \formula {A \approxcoloncolon B}
+%D \formula {A \colonsim B}
+%D \formula {A \simcoloncolon B}
+%D \stoplines
+
+%D The next macros take care of the space between the colon and the
+%D relation symbol.
+
+\definemathcommand [colonsep] {\mkern-1.2mu}
+\definemathcommand [doublecolonsep] {\mkern-0.9mu}
+
+%D The next macro vertically centeres its contents.
+
+\def\@center@math#1%
+ {\vcenter{\hbox{$\mathsurround\zeropoint#1$}}}
+
+\def\@center@colon
+ {\mathpalette\@center@math{\colon}}
+
+%D Now we define all the colon relations.
+
+\definemathcommand [centercolon] [rel] {\@center@colon}
+\definemathcommand [colonminus] [rel] {\centercolon\colonsep\mathrel{-}}
+\definemathcommand [minuscolon] [rel] {\mathrel{-}\colonsep\centercolon}
+\definemathcommand [colonequals] [rel] {\centercolon\colonsep=}
+\definemathcommand [equalscolon] [rel] {=\centercolon\colonsep}
+\definemathcommand [colonapprox] [rel] {\centercolon\colonsep\approx}
+\definemathcommand [approxcolon] [rel] {\approx\centercolon\colonsep}
+\definemathcommand [colonsim] [rel] {\centercolon\colonsep\sim}
+\definemathcommand [simcolon] [rel] {\sim\centercolon\colonsep}
+
+\definemathcommand [coloncolon] [rel] {\centercolon\doublecolonsep\centercolon}
+\definemathcommand [coloncolonminus] [rel] {\coloncolon\colonsep\mathrel{-}}
+\definemathcommand [minuscoloncolon] [rel] {\mathrel{-}\colonsep\coloncolon}
+\definemathcommand [coloncolonequals] [rel] {\coloncolon\colonsep=}
+\definemathcommand [equalscoloncolon] [rel] {=\coloncolon\colonsep}
+\definemathcommand [coloncolonapprox] [rel] {\coloncolon\colonsep\approx}
+\definemathcommand [approxcoloncolon] [rel] {\approx\coloncolon\colonsep}
+\definemathcommand [colonsim] [rel] {\coloncolon\colonsep\sim}
+\definemathcommand [simcoloncolon] [rel] {\sim\coloncolon\colonsep}
+
+%D Goodies. We might move this elsewhere.
+
+\def\underleftarrow #1{\mathop{\Uunderdelimiter 0 "2190 {#1}}}
+\def\overleftarrow #1{\mathop{\Uoverdelimiter 0 "2190 {#1}}}
+\def\underrightarrow#1{\mathop{\Uunderdelimiter 0 "2192 {#1}}}
+\def\overrightarrow #1{\mathop{\Uoverdelimiter 0 "2192 {#1}}}
+
+% todo: \Udelimiterover, \Udelimiterunder
+
+\def\normaldoublebrace {\Umathaccents 0 0 "23DE 0 0 "23DF }
+\def\normaldoubleparent{\Umathaccents 0 0 "23DC 0 0 "23DD }
+
+\let\normaloverbrace \overbrace
+\let\normalunderbrace \underbrace
+\let\normaloverparent \overparent
+\let\normalunderparent \underparent
+\let\normalunderleftarrow \underleftarrow
+\let\normaloverleftarrow \overleftarrow
+\let\normalunderrightarrow\underrightarrow
+\let\normaloverrightarrow \overrightarrow
+
+\unexpanded\def\mathopwithlimits#1#2{\mathop{#1{#2}}\limits}
+\unexpanded\def\stackrel #1#2{\mathrel{\mathop{#2}\limits^{#1}}}
+
+\unexpanded\def\overbrace {\mathopwithlimits\normaloverbrace }
+\unexpanded\def\underbrace {\mathopwithlimits\normalunderbrace }
+\unexpanded\def\doublebrace {\mathopwithlimits\normaldoublebrace }
+\unexpanded\def\overparent {\mathopwithlimits\normaloverparent }
+\unexpanded\def\underparent {\mathopwithlimits\normalunderparent }
+\unexpanded\def\doubleparent {\mathopwithlimits\normaldoubleparent }
+\unexpanded\def\underleftarrow {\mathopwithlimits\normalunderleftarrow }
+\unexpanded\def\overleftarrow {\mathopwithlimits\normaloverleftarrow }
+\unexpanded\def\underrightarrow{\mathopwithlimits\normalunderrightarrow}
+\unexpanded\def\overrightarrow {\mathopwithlimits\normaloverrightarrow }
+
+\let\normalsurd\surd
+
+\unexpanded\def\surd{\normalsurd{}}
+
+% todo mathclass=punctuation ord
+
+% \Umathcode"02C="6 "0 "02C
+% \Umathcode"02E="0 "0 "02E
+
+% tricky .. todo
+
+% \appendtoks
+% \def\over{\primitive\over}%
+% \to \everymathematics
+
+\protect \endinput
diff --git a/tex/context/base/math-del.mkiv b/tex/context/base/math-del.mkiv
new file mode 100644
index 000000000..5ffda1919
--- /dev/null
+++ b/tex/context/base/math-del.mkiv
@@ -0,0 +1,63 @@
+%D \module
+%D [ file=math-del,
+%D version=2007.07.19,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Delimiters,
+%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}{ConTeXt Math Macros / Delimiters}
+
+\unprotect
+
+%D \macros
+%D {checkdelimiters, fakeleftdelimiter, fakerightdelimiter}
+%D
+%D Handy for non matching situations (as with mathml):
+%D
+%D \starttyping
+%D \checkdelimiters{... bla bla ...}
+%D \fakeleftdelimiter
+%D ... bla bla ...
+%D \fakerightdelimiter
+%D \stoptyping
+
+\newcount\delimitercount
+
+\def\leftfakedelimiter {\advance\delimitercount\minusone\gobbleoneargument}%
+\def\rightfakedelimiter{\advance\delimitercount\plusone \gobbleoneargument}%
+
+\def\checkdelimiters#1%
+ {\delimitercount\zerocount
+ \setbox\scratchbox\hbox\bgroup
+ \let\left \leftfakedelimiter
+ \let\right\rightfakedelimiter
+ $#1\expandafter$\expandafter
+ \egroup
+ \expandafter\delimitercount\the\delimitercount\relax}
+
+\def\fakeleftdelimiter {\ifnum\delimitercount>\zerocount\left .\fi}
+\def\fakerightdelimiter{\ifnum\delimitercount<\zerocount\right.\fi}
+
+%D The following macros are used in the MathML interpreter, so
+%D there is a good change of them never being documented for
+%D other usage.
+
+\let\normalordelimiter\secondoftwoarguments
+\let\normalorfiller \firstoftwoarguments
+
+\def\enabledelimiter {\let\normalordelimiter\secondoftwoarguments}
+\def\disabledelimiter{\let\normalordelimiter\firstoftwoarguments}
+
+\def\enablefiller {\let\normalorfiller\secondoftwoarguments}
+\def\disablefiller {\let\normalorfiller\firstoftwoarguments}
+
+\def\mathopnolimits#1{\mathop{\mr#1}\nolimits} % was \rm, which follows text fonts (used in mml parser)
+\def\mathopdolimits#1{\mathop{\mr#1}} % was \rm, which follows text fonts (used in mml parser)
+
+\protect \endinput
diff --git a/tex/context/base/math-dim.lua b/tex/context/base/math-dim.lua
new file mode 100644
index 000000000..62d805126
--- /dev/null
+++ b/tex/context/base/math-dim.lua
@@ -0,0 +1,313 @@
+if not modules then modules = { } end modules ['math-dim'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Beware: only Taco really understands in depth what these dimensions do so
+-- if you run into problems ...
+
+local abs, next = math.abs, next
+
+mathematics = mathematics or { }
+
+local defaults = {
+ ['axis']={
+ ['default']={ "AxisHeight", "axis_height" },
+ },
+ ['accent_base_height']={
+ ['default']={ "AccentBaseHeight", "x_height" },
+ },
+ ['fraction_del_size']={
+ ['default']={ "FractionDelimiterSize", "delim2" },
+ ['cramped_display_style']={ "FractionDelimiterDisplayStyleSize", "delim1" },
+ ['display_style']={ "FractionDelimiterDisplayStyleSize", "delim1" },
+ },
+ ['fraction_denom_down']={
+ ['default']={ "FractionDenominatorShiftDown", "denom2" },
+ ['cramped_display_style']={ "FractionDenominatorDisplayStyleShiftDown", "denom1" },
+ ['display_style']={ "FractionDenominatorDisplayStyleShiftDown", "denom1" },
+ },
+ ['fraction_denom_vgap']={
+ ['default']={ "FractionDenominatorGapMin", "default_rule_thickness" },
+ ['cramped_display_style']={ "FractionDenominatorDisplayStyleGapMin", "3*default_rule_thickness" },
+ ['display_style']={ "FractionDenominatorDisplayStyleGapMin", "3*default_rule_thickness" },
+ },
+ ['fraction_num_up']={
+ ['default']={ "FractionNumeratorShiftUp", "num2" },
+ ['cramped_display_style']={ "FractionNumeratorDisplayStyleShiftUp", "num1" },
+ ['display_style']={ "FractionNumeratorDisplayStyleShiftUp", "num1" },
+ },
+ ['fraction_num_vgap']={
+ ['default']={ "FractionNumeratorGapMin", "default_rule_thickness" },
+ ['cramped_display_style']={ "FractionNumeratorDisplayStyleGapMin", "3*default_rule_thickness" },
+ ['display_style']={ "FractionNumeratorDisplayStyleGapMin", "3*default_rule_thickness" },
+ },
+ ['fraction_rule']={
+ ['default']={ "FractionRuleThickness", "default_rule_thickness" },
+ },
+ ['limit_above_bgap']={
+ ['default']={ "UpperLimitBaselineRiseMin", "big_op_spacing3" },
+ },
+ ['limit_above_kern']={
+ ['default']={ "0", "big_op_spacing5" },
+ },
+ ['limit_above_vgap']={
+ ['default']={ "UpperLimitGapMin", "big_op_spacing1" },
+ },
+ ['limit_below_bgap']={
+ ['default']={ "LowerLimitBaselineDropMin", "big_op_spacing4" },
+ },
+ ['limit_below_kern']={
+ ['default']={ "0", "big_op_spacing5" },
+ },
+ ['limit_below_vgap']={
+ ['default']={ "LowerLimitGapMin", "big_op_spacing2" },
+ },
+
+--~ ['....']={
+--~ ['default']={ "DisplayOperatorMinHeight", "....." },
+--~ },
+
+ ['overbar_kern']={
+ ['default']={ "OverbarExtraAscender", "default_rule_thickness" },
+ },
+ ['overbar_rule']={
+ ['default']={ "OverbarRuleThickness", "default_rule_thickness" },
+ },
+ ['overbar_vgap']={
+ ['default']={ "OverbarVerticalGap", "3*default_rule_thickness" },
+ },
+ ['quad']={
+ ['default']={ "font_size(f)", "math_quad" },
+ },
+ ['radical_kern']={
+ ['default']={ "RadicalExtraAscender", "default_rule_thickness" },
+ },
+ ['radical_rule']={
+ ['default']={ "RadicalRuleThickness", "<not set>" },
+ },
+ ['radical_vgap']={
+ ['default']={ "RadicalVerticalGap", "default_rule_thickness+(abs(default_rule_thickness)/4)" },
+ ['display_style']={ "RadicalDisplayStyleVerticalGap", "default_rule_thickness+(abs(math_x_height)/4)" },
+ },
+ ['space_after_script']={
+ ['default']={ "SpaceAfterScript", "script_space" },
+ },
+ ['stack_denom_down']={
+ ['default']={ "StackBottomShiftDown", "denom2" },
+ ['cramped_display_style']={ "StackBottomDisplayStyleShiftDown", "denom1" },
+ ['display_style']={ "StackBottomDisplayStyleShiftDown", "denom1" },
+ },
+ ['stack_num_up']={
+ ['default']={ "StackTopShiftUp", "num3" },
+ ['cramped_display_style']={ "StackTopDisplayStyleShiftUp", "num1" },
+ ['display_style']={ "StackTopDisplayStyleShiftUp", "num1" },
+ },
+ ['stack_vgap']={
+ ['default']={ "StackGapMin", "3*default_rule_thickness" },
+ ['cramped_display_style']={ "StackDisplayStyleGapMin", "7*default_rule_thickness" },
+ ['display_style']={ "StackDisplayStyleGapMin", "7*default_rule_thickness" },
+ },
+ ['sub_shift_down']={
+ ['default']={ "SubscriptShiftDown", "sub1" },
+ },
+ ['sub_shift_drop']={
+ ['default']={ "SubscriptBaselineDropMin", "sub_drop" },
+ },
+ ['sub_sup_shift_down']={
+ ['default']={ "SubscriptShiftDown", "sub2" }, -- todo
+ },
+ ['sub_top_max']={
+ ['default']={ "SubscriptTopMax", "abs(math_x_height*4)/5" },
+ },
+ ['subsup_vgap']={
+ ['default']={ "SubSuperscriptGapMin", "4*default_rule_thickness" },
+ },
+ ['sup_bottom_min']={
+ ['default']={ "SuperscriptBottomMin", "abs(math_x_height)/4" },
+ },
+ ['sup_shift_drop']={
+ ['default']={ "SuperscriptBaselineDropMax", "sup_drop" },
+ },
+ ['sup_shift_up']={
+ ['cramped_display_style']={ "SuperscriptShiftUpCramped", "sup3" },
+ ['cramped_script_script_style']={ "SuperscriptShiftUpCramped", "sup3" },
+ ['cramped_script_style']={ "SuperscriptShiftUpCramped", "sup3" },
+ ['cramped_text_style']={ "SuperscriptShiftUpCramped", "sup3" },
+ ['display_style']={ "SuperscriptShiftUp", "sup1" },
+ ['script_script_style']={ "SuperscriptShiftUp", "sup2" },
+ ['script_style']={ "SuperscriptShiftUp", "sup2" },
+ ['text_style']={ "SuperscriptShiftUp", "sup2" },
+ },
+ ['sup_sub_bottom_max']={
+ ['default']={ "SuperscriptBottomMaxWithSubscript", "abs(math_x_height*4)/5" },
+ },
+ ['underbar_kern']={
+ ['default']={ "UnderbarExtraDescender", "0" },
+ },
+ ['underbar_rule']={
+ ['default']={ "UnderbarRuleThickness", "default_rule_thickness" },
+ },
+ ['underbar_vgap']={
+ ['default']={ "UnderbarVerticalGap", "3*default_rule_thickness" },
+ },
+ ['connector_overlap_min']={
+ ['default']={ "MinConnectorOverlap", "0.25*default_rule_thickness" },
+ },
+ ['over_delimiter_vgap']={
+ ['default']={ "StretchStackGapBelowMin", "big_op_spacing1" },
+ },
+ ['over_delimiter_bgap']={
+ ['default']={ "StretchStackTopShiftUp", "big_op_spacing3" },
+ },
+ ['under_delimiter_vgap']={
+ ['default']={ "StretchStackGapAboveMin", "big_op_spacing2" },
+ },
+ ['under_delimiter_bgap']={
+ ['default']={ "StretchStackBottomShiftDown", "big_op_spacing4" },
+ },
+ ['radical_degree_before']={
+ ['default']={ "RadicalKernBeforeDegree", "(5/18)*quad" },
+ },
+ ['radical_degree_after']={
+ ['default']={ "RadicalKernAfterDegree", "(-10/18)*quad" },
+ },
+ ['radical_degree_raise']={
+ ['default']={ "RadicalDegreeBottomRaisePercent", "60" },
+ },
+}
+
+local styles = {
+ 'cramped_display_style',
+ 'cramped_script_script_style',
+ 'cramped_script_style',
+ 'cramped_text_style',
+ 'display_style',
+ 'script_script_style',
+ 'script_style',
+ 'text_style',
+}
+
+for k, v in next, defaults do
+ for _, s in next, styles do
+ if not v[s] then
+ v[s] = v.default
+ end
+ end
+end
+
+-- we cannot use a metatable because we do a copy (takes a bit more work)
+--
+-- local mt = { } setmetatable(defaults,mt)
+--
+-- mt.__index = function(t,s)
+-- return t.default or t.text_style or 0
+-- end
+
+function mathematics.dimensions(dimens)
+ if dimens.SpaceAfterScript then
+ dimens.SubscriptShiftDownWithSuperscript = dimens.SubscriptShiftDown * 1.5
+ return { }, table.fastcopy(dimens)
+ elseif dimens.AxisHeight or dimens.axis_height then
+ local t = { }
+ local math_x_height = dimens.x_height or 10*65526
+ local math_quad = dimens.quad or 10*65526
+ local default_rule_thickness = dimens.FractionDenominatorGapMin or dimens.default_rule_thickness or 0.4*65526
+ dimens["0"] = 0
+ dimens["60"] = 60
+ dimens["0.25*default_rule_thickness"] = default_rule_thickness / 4
+ dimens["3*default_rule_thickness"] = 3 * default_rule_thickness
+ dimens["4*default_rule_thickness"] = 4 * default_rule_thickness
+ dimens["7*default_rule_thickness"] = 7 * default_rule_thickness
+ dimens["(5/18)*quad"] = (math_quad * 5) / 18
+ dimens["(-10/18)*quad"] = - (math_quad * 10) / 18
+ dimens["abs(math_x_height*4)/5"] = abs(math_x_height * 4) / 5
+ dimens["default_rule_thickness+(abs(default_rule_thickness)/4)"] = default_rule_thickness+(abs(default_rule_thickness) / 4)
+ dimens["default_rule_thickness+(abs(math_x_height)/4)"] = default_rule_thickness+(abs(math_x_height) / 4)
+ dimens["abs(math_x_height)/4"] = abs(math_x_height) / 4
+ dimens["abs(math_x_height*4)/5"] = abs(math_x_height * 4) / 5
+ dimens["<not set>"] = false
+ dimens["script_space"] = false -- at macro level
+ for variable, styles in next, defaults do
+ local tt = { }
+ for style, default in next, styles do
+ local one, two = default[1], default[2]
+ local value = dimens[one]
+ if value then
+ tt[style] = value
+ else
+ value = dimens[two]
+ if value == false then
+ tt[style] = nil
+ else
+ tt[style] = value or 0
+ end
+ end
+ end
+ t[variable] = tt
+ end
+--~ logs.report("warning", "version 0.47 is needed for proper delimited math")
+ local d = {
+ AxisHeight = t . axis . text_style,
+ AccentBaseHeight = t . accent_base_height . text_style,
+ FractionDenominatorDisplayStyleGapMin = t . fraction_denom_vgap . display_style,
+ FractionDenominatorDisplayStyleShiftDown = t . fraction_denom_down . display_style,
+ FractionDenominatorGapMin = t . fraction_denom_vgap . text_style,
+ FractionDenominatorShiftDown = t . fraction_denom_down . text_style,
+ FractionNumeratorDisplayStyleGapMin = t . fraction_num_vgap . display_style,
+ FractionNumeratorDisplayStyleShiftUp = t . fraction_num_up . display_style,
+ FractionNumeratorGapMin = t . fraction_num_vgap . text_style,
+ FractionNumeratorShiftUp = t . fraction_num_up . text_style,
+ FractionRuleThickness = t . fraction_rule . text_style,
+ FractionDelimiterSize = t . fraction_del_size . text_style,
+ FractionDelimiterDisplayStyleSize = t . fraction_del_size . display_style,
+ LowerLimitBaselineDropMin = t . limit_below_bgap . text_style,
+ LowerLimitGapMin = t . limit_below_vgap . text_style,
+ OverbarExtraAscender = t . overbar_kern . text_style,
+ OverbarRuleThickness = t . overbar_rule . text_style,
+ OverbarVerticalGap = t . overbar_vgap . text_style,
+ RadicalDisplayStyleVerticalGap = t . radical_vgap . display_style,
+ RadicalExtraAscender = t . radical_kern . text_style,
+ RadicalRuleThickness = t . radical_rule . text_style,
+ RadicalVerticalGap = t . radical_vgap . text_style,
+ RadicalKernBeforeDegree = t . radical_degree_before . display_style,
+ RadicalKernAfterDegree = t . radical_degree_after . display_style,
+ RadicalDegreeBottomRaisePercent = t . radical_degree_raise . display_style,
+ SpaceAfterScript = t . space_after_script . text_style,
+ StackBottomDisplayStyleShiftDown = t . stack_denom_down . display_style,
+ StackBottomShiftDown = t . stack_denom_down . text_style,
+ StackDisplayStyleGapMin = t . stack_vgap . display_style,
+ StackGapMin = t . stack_vgap . text_style,
+ StackTopDisplayStyleShiftUp = t . stack_num_up . display_style,
+ StackTopShiftUp = t . stack_num_up . text_style,
+ SubscriptBaselineDropMin = t . sub_shift_drop . text_style,
+ SubscriptShiftDown = t . sub_shift_down . text_style,
+ SubscriptShiftDownWithSuperscript = t . sub_sup_shift_down . text_style,
+ SubscriptTopMax = t . sub_top_max . text_style,
+ SubSuperscriptGapMin = t . subsup_vgap . text_style,
+ SuperscriptBaselineDropMax = t . sup_shift_drop . text_style,
+ SuperscriptBottomMaxWithSubscript = t . sup_sub_bottom_max . text_style,
+ SuperscriptBottomMin = t . sup_bottom_min . text_style,
+ SuperscriptShiftUp = t . sup_shift_up . text_style,
+ SuperscriptShiftUpCramped = t . sup_shift_up . cramped_text_style,
+ UnderbarExtraDescender = t . underbar_kern . text_style,
+ UnderbarRuleThickness = t . underbar_rule . text_style,
+ UnderbarVerticalGap = t . underbar_vgap . text_style,
+ UpperLimitBaselineRiseMin = t . limit_above_bgap . text_style,
+ UpperLimitGapMin = t . limit_above_vgap . text_style,
+ MinConnectorOverlap = t . connector_overlap_min . text_style,
+ StretchStackGapBelowMin = t . over_delimiter_vgap . text_style,
+ StretchStackTopShiftUp = t . over_delimiter_bgap . text_style,
+ StretchStackGapAboveMin = t . under_delimiter_vgap . text_style,
+ StretchStackBottomShiftDown = t . under_delimiter_bgap . text_style,
+ }
+ d.AccentBaseHeight = 0
+ return t, d -- this might change
+ else
+ return { }, { }
+ end
+end
+
diff --git a/tex/context/base/math-dis.mkiv b/tex/context/base/math-dis.mkiv
new file mode 100644
index 000000000..3eed2b162
--- /dev/null
+++ b/tex/context/base/math-dis.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=math-ali,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Display,
+%D author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Math Macros / Display}
+
+\unprotect
+
+% display spacing code will move here
+
+\protect \endinput
diff --git a/tex/context/base/math-ent.lua b/tex/context/base/math-ent.lua
new file mode 100644
index 000000000..e5e5b98f0
--- /dev/null
+++ b/tex/context/base/math-ent.lua
@@ -0,0 +1,2102 @@
+if not modules then modules = { } end modules ['math-ent'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "derived from the mathml 2.0 specification",
+}
+
+mathematics.entities={
+ ["Aacute"]=0x000C1,
+ ["aacute"]=0x000E1,
+ ["Abreve"]=0x00102,
+ ["abreve"]=0x00103,
+ ["ac"]=0x0223E,
+ ["acd"]=0x0223F,
+ ["acE"]=0x0223E,
+ ["Acirc"]=0x000C2,
+ ["acirc"]=0x000E2,
+ ["acute"]=0x000B4,
+ ["Acy"]=0x00410,
+ ["acy"]=0x00430,
+ ["AElig"]=0x000C6,
+ ["aelig"]=0x000E6,
+ ["af"]=0x02061,
+ ["Afr"]=0x1D504,
+ ["afr"]=0x1D51E,
+ ["Agrave"]=0x000C0,
+ ["agrave"]=0x000E0,
+ ["aleph"]=0x02135,
+ ["alpha"]=0x003B1,
+ ["Amacr"]=0x00100,
+ ["amacr"]=0x00101,
+ ["amalg"]=0x02A3F,
+ ["amp"]=0x00026,
+ ["And"]=0x02A53,
+ ["and"]=0x02227,
+ ["andand"]=0x02A55,
+ ["andd"]=0x02A5C,
+ ["andslope"]=0x02A58,
+ ["andv"]=0x02A5A,
+ ["ang"]=0x02220,
+ ["ange"]=0x029A4,
+ ["angle"]=0x02220,
+ ["angmsd"]=0x02221,
+ ["angmsdaa"]=0x029A8,
+ ["angmsdab"]=0x029A9,
+ ["angmsdac"]=0x029AA,
+ ["angmsdad"]=0x029AB,
+ ["angmsdae"]=0x029AC,
+ ["angmsdaf"]=0x029AD,
+ ["angmsdag"]=0x029AE,
+ ["angmsdah"]=0x029AF,
+ ["angrt"]=0x0221F,
+ ["angrtvb"]=0x022BE,
+ ["angrtvbd"]=0x0299D,
+ ["angsph"]=0x02222,
+ ["angst"]=0x0212B,
+ ["angzarr"]=0x0237C,
+ ["Aogon"]=0x00104,
+ ["aogon"]=0x00105,
+ ["Aopf"]=0x1D538,
+ ["aopf"]=0x1D552,
+ ["ap"]=0x02248,
+ ["apacir"]=0x02A6F,
+ ["apE"]=0x02A70,
+ ["ape"]=0x0224A,
+ ["apid"]=0x0224B,
+ ["apos"]=0x00027,
+ ["ApplyFunction"]=0x02061,
+ ["approx"]=0x02248,
+ ["approxeq"]=0x0224A,
+ ["Aring"]=0x000C5,
+ ["aring"]=0x000E5,
+ ["Ascr"]=0x1D49C,
+ ["ascr"]=0x1D4B6,
+ ["Assign"]=0x02254,
+ ["ast"]=0x0002A,
+ ["asymp"]=0x02248,
+ ["asympeq"]=0x0224D,
+ ["Atilde"]=0x000C3,
+ ["atilde"]=0x000E3,
+ ["Auml"]=0x000C4,
+ ["auml"]=0x000E4,
+ ["awconint"]=0x02233,
+ ["awint"]=0x02A11,
+ ["backcong"]=0x0224C,
+ ["backepsilon"]=0x003F6,
+ ["backprime"]=0x02035,
+ ["backsim"]=0x0223D,
+ ["backsimeq"]=0x022CD,
+ ["Backslash"]=0x02216,
+ ["Barv"]=0x02AE7,
+ ["barvee"]=0x022BD,
+ ["Barwed"]=0x02306,
+ ["barwed"]=0x02305,
+ ["barwedge"]=0x02305,
+ ["bbrk"]=0x023B5,
+ ["bbrktbrk"]=0x023B6,
+ ["bcong"]=0x0224C,
+ ["Bcy"]=0x00411,
+ ["bcy"]=0x00431,
+ ["becaus"]=0x02235,
+ ["Because"]=0x02235,
+ ["because"]=0x02235,
+ ["bemptyv"]=0x029B0,
+ ["bepsi"]=0x003F6,
+ ["bernou"]=0x0212C,
+ ["Bernoullis"]=0x0212C,
+ ["beta"]=0x003B2,
+ ["beth"]=0x02136,
+ ["between"]=0x0226C,
+ ["Bfr"]=0x1D505,
+ ["bfr"]=0x1D51F,
+ ["bigcap"]=0x022C2,
+ ["bigcirc"]=0x025EF,
+ ["bigcup"]=0x022C3,
+ ["bigodot"]=0x02A00,
+ ["bigoplus"]=0x02A01,
+ ["bigotimes"]=0x02A02,
+ ["bigsqcup"]=0x02A06,
+ ["bigstar"]=0x02605,
+ ["bigtriangledown"]=0x025BD,
+ ["bigtriangleup"]=0x025B3,
+ ["biguplus"]=0x02A04,
+ ["bigvee"]=0x022C1,
+ ["bigwedge"]=0x022C0,
+ ["bkarow"]=0x0290D,
+ ["blacklozenge"]=0x029EB,
+ ["blacksquare"]=0x025AA,
+ ["blacktriangle"]=0x025B4,
+ ["blacktriangledown"]=0x025BE,
+ ["blacktriangleleft"]=0x025C2,
+ ["blacktriangleright"]=0x025B8,
+ ["blank"]=0x02423,
+ ["blk12"]=0x02592,
+ ["blk14"]=0x02591,
+ ["blk34"]=0x02593,
+ ["block"]=0x02588,
+ ["bne"]=0x0003D,
+ ["bnequiv"]=0x02261,
+ ["bNot"]=0x02AED,
+ ["bnot"]=0x02310,
+ ["Bopf"]=0x1D539,
+ ["bopf"]=0x1D553,
+ ["bot"]=0x022A5,
+ ["bottom"]=0x022A5,
+ ["bowtie"]=0x022C8,
+ ["boxbox"]=0x029C9,
+ ["boxDL"]=0x02557,
+ ["boxDl"]=0x02556,
+ ["boxdL"]=0x02555,
+ ["boxdl"]=0x02510,
+ ["boxDR"]=0x02554,
+ ["boxDr"]=0x02553,
+ ["boxdR"]=0x02552,
+ ["boxdr"]=0x0250C,
+ ["boxH"]=0x02550,
+ ["boxh"]=0x02500,
+ ["boxHD"]=0x02566,
+ ["boxHd"]=0x02564,
+ ["boxhD"]=0x02565,
+ ["boxhd"]=0x0252C,
+ ["boxHU"]=0x02569,
+ ["boxHu"]=0x02567,
+ ["boxhU"]=0x02568,
+ ["boxhu"]=0x02534,
+ ["boxminus"]=0x0229F,
+ ["boxplus"]=0x0229E,
+ ["boxtimes"]=0x022A0,
+ ["boxUL"]=0x0255D,
+ ["boxUl"]=0x0255C,
+ ["boxuL"]=0x0255B,
+ ["boxul"]=0x02518,
+ ["boxUR"]=0x0255A,
+ ["boxUr"]=0x02559,
+ ["boxuR"]=0x02558,
+ ["boxur"]=0x02514,
+ ["boxV"]=0x02551,
+ ["boxv"]=0x02502,
+ ["boxVH"]=0x0256C,
+ ["boxVh"]=0x0256B,
+ ["boxvH"]=0x0256A,
+ ["boxvh"]=0x0253C,
+ ["boxVL"]=0x02563,
+ ["boxVl"]=0x02562,
+ ["boxvL"]=0x02561,
+ ["boxvl"]=0x02524,
+ ["boxVR"]=0x02560,
+ ["boxVr"]=0x0255F,
+ ["boxvR"]=0x0255E,
+ ["boxvr"]=0x0251C,
+ ["bprime"]=0x02035,
+ ["Breve"]=0x002D8,
+ ["breve"]=0x002D8,
+ ["brvbar"]=0x000A6,
+ ["Bscr"]=0x0212C,
+ ["bscr"]=0x1D4B7,
+ ["bsemi"]=0x0204F,
+ ["bsim"]=0x0223D,
+ ["bsime"]=0x022CD,
+ ["bsol"]=0x0005C,
+ ["bsolb"]=0x029C5,
+ ["bsolhsub"]=0x0005C,
+ ["bull"]=0x02022,
+ ["bullet"]=0x02022,
+ ["bump"]=0x0224E,
+ ["bumpE"]=0x02AAE,
+ ["bumpe"]=0x0224F,
+ ["Bumpeq"]=0x0224E,
+ ["bumpeq"]=0x0224F,
+ ["Cacute"]=0x00106,
+ ["cacute"]=0x00107,
+ ["Cap"]=0x022D2,
+ ["cap"]=0x02229,
+ ["capand"]=0x02A44,
+ ["capbrcup"]=0x02A49,
+ ["capcap"]=0x02A4B,
+ ["capcup"]=0x02A47,
+ ["capdot"]=0x02A40,
+ ["CapitalDifferentialD"]=0x02145,
+ ["caps"]=0x02229,
+ ["caret"]=0x02041,
+ ["caron"]=0x002C7,
+ ["Cayleys"]=0x0212D,
+ ["ccaps"]=0x02A4D,
+ ["Ccaron"]=0x0010C,
+ ["ccaron"]=0x0010D,
+ ["Ccedil"]=0x000C7,
+ ["ccedil"]=0x000E7,
+ ["Ccirc"]=0x00108,
+ ["ccirc"]=0x00109,
+ ["Cconint"]=0x02230,
+ ["ccups"]=0x02A4C,
+ ["ccupssm"]=0x02A50,
+ ["Cdot"]=0x0010A,
+ ["cdot"]=0x0010B,
+ ["cedil"]=0x000B8,
+ ["Cedilla"]=0x000B8,
+ ["cemptyv"]=0x029B2,
+ ["cent"]=0x000A2,
+ ["CenterDot"]=0x000B7,
+ ["centerdot"]=0x000B7,
+ ["Cfr"]=0x0212D,
+ ["cfr"]=0x1D520,
+ ["CHcy"]=0x00427,
+ ["chcy"]=0x00447,
+ ["check"]=0x02713,
+ ["checkmark"]=0x02713,
+ ["chi"]=0x003C7,
+ ["cir"]=0x025CB,
+ ["circ"]=0x002C6,
+ ["circeq"]=0x02257,
+ ["circlearrowleft"]=0x021BA,
+ ["circlearrowright"]=0x021BB,
+ ["circledast"]=0x0229B,
+ ["circledcirc"]=0x0229A,
+ ["circleddash"]=0x0229D,
+ ["CircleDot"]=0x02299,
+ ["circledR"]=0x000AE,
+ ["circledS"]=0x024C8,
+ ["CircleMinus"]=0x02296,
+ ["CirclePlus"]=0x02295,
+ ["CircleTimes"]=0x02297,
+ ["cirE"]=0x029C3,
+ ["cire"]=0x02257,
+ ["cirfnint"]=0x02A10,
+ ["cirmid"]=0x02AEF,
+ ["cirscir"]=0x029C2,
+ ["ClockwiseContourIntegral"]=0x02232,
+ ["CloseCurlyDoubleQuote"]=0x0201D,
+ ["CloseCurlyQuote"]=0x02019,
+ ["clubs"]=0x02663,
+ ["clubsuit"]=0x02663,
+ ["Colon"]=0x02237,
+ ["colon"]=0x0003A,
+ ["Colone"]=0x02A74,
+ ["colone"]=0x02254,
+ ["coloneq"]=0x02254,
+ ["comma"]=0x0002C,
+ ["commat"]=0x00040,
+ ["comp"]=0x02201,
+ ["compfn"]=0x02218,
+ ["complement"]=0x02201,
+ ["complexes"]=0x02102,
+ ["cong"]=0x02245,
+ ["congdot"]=0x02A6D,
+ ["Congruent"]=0x02261,
+ ["Conint"]=0x0222F,
+ ["conint"]=0x0222E,
+ ["ContourIntegral"]=0x0222E,
+ ["Copf"]=0x02102,
+ ["copf"]=0x1D554,
+ ["coprod"]=0x02210,
+ ["Coproduct"]=0x02210,
+ ["copy"]=0x000A9,
+ ["copysr"]=0x02117,
+ ["CounterClockwiseContourIntegral"]=0x02233,
+ ["Cross"]=0x02A2F,
+ ["cross"]=0x02717,
+ ["Cscr"]=0x1D49E,
+ ["cscr"]=0x1D4B8,
+ ["csub"]=0x02ACF,
+ ["csube"]=0x02AD1,
+ ["csup"]=0x02AD0,
+ ["csupe"]=0x02AD2,
+ ["ctdot"]=0x022EF,
+ ["cudarrl"]=0x02938,
+ ["cudarrr"]=0x02935,
+ ["cuepr"]=0x022DE,
+ ["cuesc"]=0x022DF,
+ ["cularr"]=0x021B6,
+ ["cularrp"]=0x0293D,
+ ["Cup"]=0x022D3,
+ ["cup"]=0x0222A,
+ ["cupbrcap"]=0x02A48,
+ ["CupCap"]=0x0224D,
+ ["cupcap"]=0x02A46,
+ ["cupcup"]=0x02A4A,
+ ["cupdot"]=0x0228D,
+ ["cupor"]=0x02A45,
+ ["cups"]=0x0222A,
+ ["curarr"]=0x021B7,
+ ["curarrm"]=0x0293C,
+ ["curlyeqprec"]=0x022DE,
+ ["curlyeqsucc"]=0x022DF,
+ ["curlyvee"]=0x022CE,
+ ["curlywedge"]=0x022CF,
+ ["curren"]=0x000A4,
+ ["curvearrowleft"]=0x021B6,
+ ["curvearrowright"]=0x021B7,
+ ["cuvee"]=0x022CE,
+ ["cuwed"]=0x022CF,
+ ["cwconint"]=0x02232,
+ ["cwint"]=0x02231,
+ ["cylcty"]=0x0232D,
+ ["Dagger"]=0x02021,
+ ["Dagger"]=0x02021,
+ ["dagger"]=0x02020,
+ ["dagger"]=0x02020,
+ ["daleth"]=0x02138,
+ ["Darr"]=0x021A1,
+ ["dArr"]=0x021D3,
+ ["darr"]=0x02193,
+ ["dash"]=0x02010,
+ ["Dashv"]=0x02AE4,
+ ["dashv"]=0x022A3,
+ ["dbkarow"]=0x0290F,
+ ["dblac"]=0x002DD,
+ ["Dcaron"]=0x0010E,
+ ["dcaron"]=0x0010F,
+ ["Dcy"]=0x00414,
+ ["dcy"]=0x00434,
+ ["DD"]=0x02145,
+ ["dd"]=0x02146,
+ ["ddagger"]=0x02021,
+ ["ddarr"]=0x021CA,
+ ["DDotrahd"]=0x02911,
+ ["ddotseq"]=0x02A77,
+ ["deg"]=0x000B0,
+ ["Del"]=0x02207,
+ ["Delta"]=0x00394,
+ ["delta"]=0x003B4,
+ ["demptyv"]=0x029B1,
+ ["dfisht"]=0x0297F,
+ ["Dfr"]=0x1D507,
+ ["dfr"]=0x1D521,
+ ["dHar"]=0x02965,
+ ["dharl"]=0x021C3,
+ ["dharr"]=0x021C2,
+ ["DiacriticalAcute"]=0x000B4,
+ ["DiacriticalDot"]=0x002D9,
+ ["DiacriticalDoubleAcute"]=0x002DD,
+ ["DiacriticalGrave"]=0x00060,
+ ["DiacriticalTilde"]=0x002DC,
+ ["diam"]=0x022C4,
+ ["Diamond"]=0x022C4,
+ ["diamond"]=0x022C4,
+ ["diamondsuit"]=0x02666,
+ ["diams"]=0x02666,
+ ["die"]=0x000A8,
+ ["DifferentialD"]=0x02146,
+ ["digamma"]=0x003DD,
+ ["disin"]=0x022F2,
+ ["div"]=0x000F7,
+ ["divide"]=0x000F7,
+ ["divideontimes"]=0x022C7,
+ ["divonx"]=0x022C7,
+ ["DJcy"]=0x00402,
+ ["djcy"]=0x00452,
+ ["dlcorn"]=0x0231E,
+ ["dlcrop"]=0x0230D,
+ ["dollar"]=0x00024,
+ ["Dopf"]=0x1D53B,
+ ["dopf"]=0x1D555,
+ ["Dot"]=0x000A8,
+ ["dot"]=0x002D9,
+ ["DotDot"]=0x020DC,
+ ["doteq"]=0x02250,
+ ["doteqdot"]=0x02251,
+ ["DotEqual"]=0x02250,
+ ["dotminus"]=0x02238,
+ ["dotplus"]=0x02214,
+ ["dotsquare"]=0x022A1,
+ ["doublebarwedge"]=0x02306,
+ ["DoubleContourIntegral"]=0x0222F,
+ ["DoubleDot"]=0x000A8,
+ ["DoubleDownArrow"]=0x021D3,
+ ["DoubleLeftArrow"]=0x021D0,
+ ["DoubleLeftRightArrow"]=0x021D4,
+ ["DoubleLeftTee"]=0x02AE4,
+ ["DoubleLongLeftArrow"]=0x027F8,
+ ["DoubleLongLeftRightArrow"]=0x027FA,
+ ["DoubleLongRightArrow"]=0x027F9,
+ ["DoubleRightArrow"]=0x021D2,
+ ["DoubleRightTee"]=0x022A8,
+ ["DoubleUpArrow"]=0x021D1,
+ ["DoubleUpDownArrow"]=0x021D5,
+ ["DoubleVerticalBar"]=0x02225,
+ ["DownArrow"]=0x02193,
+ ["Downarrow"]=0x021D3,
+ ["downarrow"]=0x02193,
+ ["DownArrowBar"]=0x02913,
+ ["DownArrowUpArrow"]=0x021F5,
+ ["DownBreve"]=0x00311,
+ ["downdownarrows"]=0x021CA,
+ ["downharpoonleft"]=0x021C3,
+ ["downharpoonright"]=0x021C2,
+ ["DownLeftRightVector"]=0x02950,
+ ["DownLeftTeeVector"]=0x0295E,
+ ["DownLeftVector"]=0x021BD,
+ ["DownLeftVectorBar"]=0x02956,
+ ["DownRightTeeVector"]=0x0295F,
+ ["DownRightVector"]=0x021C1,
+ ["DownRightVectorBar"]=0x02957,
+ ["DownTee"]=0x022A4,
+ ["DownTeeArrow"]=0x021A7,
+ ["drbkarow"]=0x02910,
+ ["drcorn"]=0x0231F,
+ ["drcrop"]=0x0230C,
+ ["Dscr"]=0x1D49F,
+ ["dscr"]=0x1D4B9,
+ ["DScy"]=0x00405,
+ ["dscy"]=0x00455,
+ ["dsol"]=0x029F6,
+ ["Dstrok"]=0x00110,
+ ["dstrok"]=0x00111,
+ ["dtdot"]=0x022F1,
+ ["dtri"]=0x025BF,
+ ["dtrif"]=0x025BE,
+ ["duarr"]=0x021F5,
+ ["duhar"]=0x0296F,
+ ["dwangle"]=0x029A6,
+ ["DZcy"]=0x0040F,
+ ["dzcy"]=0x0045F,
+ ["dzigrarr"]=0x027FF,
+ ["Eacute"]=0x000C9,
+ ["eacute"]=0x000E9,
+ ["easter"]=0x02A6E,
+ ["Ecaron"]=0x0011A,
+ ["ecaron"]=0x0011B,
+ ["ecir"]=0x02256,
+ ["Ecirc"]=0x000CA,
+ ["ecirc"]=0x000EA,
+ ["ecolon"]=0x02255,
+ ["Ecy"]=0x0042D,
+ ["ecy"]=0x0044D,
+ ["eDDot"]=0x02A77,
+ ["Edot"]=0x00116,
+ ["eDot"]=0x02251,
+ ["edot"]=0x00117,
+ ["ee"]=0x02147,
+ ["efDot"]=0x02252,
+ ["Efr"]=0x1D508,
+ ["efr"]=0x1D522,
+ ["eg"]=0x02A9A,
+ ["Egrave"]=0x000C8,
+ ["egrave"]=0x000E8,
+ ["egs"]=0x02A96,
+ ["egsdot"]=0x02A98,
+ ["el"]=0x02A99,
+ ["Element"]=0x02208,
+ ["elinters"]=0x0FFFD,
+ ["ell"]=0x02113,
+ ["els"]=0x02A95,
+ ["elsdot"]=0x02A97,
+ ["Emacr"]=0x00112,
+ ["emacr"]=0x00113,
+ ["empty"]=0x02205,
+ ["emptyset"]=0x02205,
+ ["EmptySmallSquare"]=0x025FB,
+ ["emptyv"]=0x02205,
+ ["EmptyVerySmallSquare"]=0x025AB,
+ ["emsp"]=0x02003,
+ ["emsp13"]=0x02004,
+ ["emsp14"]=0x02005,
+ ["ENG"]=0x0014A,
+ ["eng"]=0x0014B,
+ ["ensp"]=0x02002,
+ ["Eogon"]=0x00118,
+ ["eogon"]=0x00119,
+ ["Eopf"]=0x1D53C,
+ ["eopf"]=0x1D556,
+ ["epar"]=0x022D5,
+ ["eparsl"]=0x029E3,
+ ["eplus"]=0x02A71,
+ ["epsi"]=0x003F5,
+ ["epsiv"]=0x003B5,
+ ["eqcirc"]=0x02256,
+ ["eqcolon"]=0x02255,
+ ["eqsim"]=0x02242,
+ ["eqslantgtr"]=0x02A96,
+ ["eqslantless"]=0x02A95,
+ ["Equal"]=0x02A75,
+ ["equals"]=0x0003D,
+ ["EqualTilde"]=0x02242,
+ ["equest"]=0x0225F,
+ ["Equilibrium"]=0x021CC,
+ ["equiv"]=0x02261,
+ ["equivDD"]=0x02A78,
+ ["eqvparsl"]=0x029E5,
+ ["erarr"]=0x02971,
+ ["erDot"]=0x02253,
+ ["Escr"]=0x02130,
+ ["escr"]=0x0212F,
+ ["esdot"]=0x02250,
+ ["Esim"]=0x02A73,
+ ["esim"]=0x02242,
+ ["eta"]=0x003B7,
+ ["ETH"]=0x000D0,
+ ["eth"]=0x000F0,
+ ["Euml"]=0x000CB,
+ ["euml"]=0x000EB,
+ ["excl"]=0x00021,
+ ["exist"]=0x02203,
+ ["Exists"]=0x02203,
+ ["expectation"]=0x02130,
+ ["ExponentialE"]=0x02147,
+ ["exponentiale"]=0x02147,
+ ["fallingdotseq"]=0x02252,
+ ["Fcy"]=0x00424,
+ ["fcy"]=0x00444,
+ ["female"]=0x02640,
+ ["ffilig"]=0x0FB03,
+ ["fflig"]=0x0FB00,
+ ["ffllig"]=0x0FB04,
+ ["Ffr"]=0x1D509,
+ ["ffr"]=0x1D523,
+ ["filig"]=0x0FB01,
+ ["FilledSmallSquare"]=0x025FC,
+ ["FilledVerySmallSquare"]=0x025AA,
+ ["flat"]=0x0266D,
+ ["fllig"]=0x0FB02,
+ ["fltns"]=0x025B1,
+ ["fnof"]=0x00192,
+ ["Fopf"]=0x1D53D,
+ ["fopf"]=0x1D557,
+ ["ForAll"]=0x02200,
+ ["forall"]=0x02200,
+ ["fork"]=0x022D4,
+ ["forkv"]=0x02AD9,
+ ["Fouriertrf"]=0x02131,
+ ["fpartint"]=0x02A0D,
+ ["frac12"]=0x000BD,
+ ["frac13"]=0x02153,
+ ["frac14"]=0x000BC,
+ ["frac15"]=0x02155,
+ ["frac16"]=0x02159,
+ ["frac18"]=0x0215B,
+ ["frac23"]=0x02154,
+ ["frac25"]=0x02156,
+ ["frac34"]=0x000BE,
+ ["frac35"]=0x02157,
+ ["frac38"]=0x0215C,
+ ["frac45"]=0x02158,
+ ["frac56"]=0x0215A,
+ ["frac58"]=0x0215D,
+ ["frac78"]=0x0215E,
+ ["frown"]=0x02322,
+ ["Fscr"]=0x02131,
+ ["fscr"]=0x1D4BB,
+ ["gacute"]=0x001F5,
+ ["Gamma"]=0x00393,
+ ["gamma"]=0x003B3,
+ ["Gammad"]=0x003DC,
+ ["gammad"]=0x003DD,
+ ["gap"]=0x02A86,
+ ["Gbreve"]=0x0011E,
+ ["gbreve"]=0x0011F,
+ ["Gcedil"]=0x00122,
+ ["Gcirc"]=0x0011C,
+ ["gcirc"]=0x0011D,
+ ["Gcy"]=0x00413,
+ ["gcy"]=0x00433,
+ ["Gdot"]=0x00120,
+ ["gdot"]=0x00121,
+ ["gE"]=0x02267,
+ ["ge"]=0x02265,
+ ["gEl"]=0x02A8C,
+ ["gel"]=0x022DB,
+ ["geq"]=0x02265,
+ ["geqq"]=0x02267,
+ ["geqslant"]=0x02A7E,
+ ["ges"]=0x02A7E,
+ ["gescc"]=0x02AA9,
+ ["gesdot"]=0x02A80,
+ ["gesdoto"]=0x02A82,
+ ["gesdotol"]=0x02A84,
+ ["gesl"]=0x022DB,
+ ["gesles"]=0x02A94,
+ ["Gfr"]=0x1D50A,
+ ["gfr"]=0x1D524,
+ ["Gg"]=0x022D9,
+ ["gg"]=0x0226B,
+ ["ggg"]=0x022D9,
+ ["gimel"]=0x02137,
+ ["GJcy"]=0x00403,
+ ["gjcy"]=0x00453,
+ ["gl"]=0x02277,
+ ["gla"]=0x02AA5,
+ ["glE"]=0x02A92,
+ ["glj"]=0x02AA4,
+ ["gnap"]=0x02A8A,
+ ["gnapprox"]=0x02A8A,
+ ["gnE"]=0x02269,
+ ["gne"]=0x02A88,
+ ["gneq"]=0x02A88,
+ ["gneqq"]=0x02269,
+ ["gnsim"]=0x022E7,
+ ["Gopf"]=0x1D53E,
+ ["gopf"]=0x1D558,
+ ["grave"]=0x00060,
+ ["GreaterEqual"]=0x02265,
+ ["GreaterEqualLess"]=0x022DB,
+ ["GreaterFullEqual"]=0x02267,
+ ["GreaterGreater"]=0x02AA2,
+ ["GreaterLess"]=0x02277,
+ ["GreaterSlantEqual"]=0x02A7E,
+ ["GreaterTilde"]=0x02273,
+ ["Gscr"]=0x1D4A2,
+ ["gscr"]=0x0210A,
+ ["gsim"]=0x02273,
+ ["gsime"]=0x02A8E,
+ ["gsiml"]=0x02A90,
+ ["Gt"]=0x0226B,
+ ["gt"]=0x0003E,
+ ["gtcc"]=0x02AA7,
+ ["gtcir"]=0x02A7A,
+ ["gtdot"]=0x022D7,
+ ["gtlPar"]=0x02995,
+ ["gtquest"]=0x02A7C,
+ ["gtrapprox"]=0x02A86,
+ ["gtrarr"]=0x02978,
+ ["gtrdot"]=0x022D7,
+ ["gtreqless"]=0x022DB,
+ ["gtreqqless"]=0x02A8C,
+ ["gtrless"]=0x02277,
+ ["gtrsim"]=0x02273,
+ ["gvertneqq"]=0x02269,
+ ["gvnE"]=0x02269,
+ ["Hacek"]=0x002C7,
+ ["hairsp"]=0x0200A,
+ ["half"]=0x000BD,
+ ["hamilt"]=0x0210B,
+ ["HARDcy"]=0x0042A,
+ ["hardcy"]=0x0044A,
+ ["hArr"]=0x021D4,
+ ["harr"]=0x02194,
+ ["harrcir"]=0x02948,
+ ["harrw"]=0x021AD,
+ ["Hat"]=0x0005E,
+ ["hbar"]=0x0210F,
+ ["Hcirc"]=0x00124,
+ ["hcirc"]=0x00125,
+ ["hearts"]=0x02665,
+ ["heartsuit"]=0x02665,
+ ["hellip"]=0x02026,
+ ["hercon"]=0x022B9,
+ ["Hfr"]=0x0210C,
+ ["hfr"]=0x1D525,
+ ["HilbertSpace"]=0x0210B,
+ ["hksearow"]=0x02925,
+ ["hkswarow"]=0x02926,
+ ["hoarr"]=0x021FF,
+ ["homtht"]=0x0223B,
+ ["hookleftarrow"]=0x021A9,
+ ["hookrightarrow"]=0x021AA,
+ ["Hopf"]=0x0210D,
+ ["hopf"]=0x1D559,
+ ["horbar"]=0x02015,
+ ["HorizontalLine"]=0x02500,
+ ["Hscr"]=0x0210B,
+ ["hscr"]=0x1D4BD,
+ ["hslash"]=0x0210F,
+ ["Hstrok"]=0x00126,
+ ["hstrok"]=0x00127,
+ ["HumpDownHump"]=0x0224E,
+ ["HumpEqual"]=0x0224F,
+ ["hybull"]=0x02043,
+ ["hyphen"]=0x02010,
+ ["Iacute"]=0x000CD,
+ ["iacute"]=0x000ED,
+ ["ic"]=0x02063,
+ ["Icirc"]=0x000CE,
+ ["icirc"]=0x000EE,
+ ["Icy"]=0x00418,
+ ["icy"]=0x00438,
+ ["Idot"]=0x00130,
+ ["IEcy"]=0x00415,
+ ["iecy"]=0x00435,
+ ["iexcl"]=0x000A1,
+ ["iff"]=0x021D4,
+ ["Ifr"]=0x02111,
+ ["ifr"]=0x1D526,
+ ["Igrave"]=0x000CC,
+ ["igrave"]=0x000EC,
+ ["ii"]=0x02148,
+ ["iiiint"]=0x02A0C,
+ ["iiint"]=0x0222D,
+ ["iinfin"]=0x029DC,
+ ["iiota"]=0x02129,
+ ["IJlig"]=0x00132,
+ ["ijlig"]=0x00133,
+ ["Im"]=0x02111,
+ ["Imacr"]=0x0012A,
+ ["imacr"]=0x0012B,
+ ["image"]=0x02111,
+ ["ImaginaryI"]=0x02148,
+ ["imagline"]=0x02110,
+ ["imagpart"]=0x02111,
+ ["imath"]=0x00131,
+ ["imof"]=0x022B7,
+ ["imped"]=0x001B5,
+ ["Implies"]=0x021D2,
+ ["in"]=0x02208,
+ ["incare"]=0x02105,
+ ["infin"]=0x0221E,
+ ["infintie"]=0x029DD,
+ ["inodot"]=0x00131,
+ ["Int"]=0x0222C,
+ ["int"]=0x0222B,
+ ["intcal"]=0x022BA,
+ ["integers"]=0x02124,
+ ["Integral"]=0x0222B,
+ ["intercal"]=0x022BA,
+ ["Intersection"]=0x022C2,
+ ["intlarhk"]=0x02A17,
+ ["intprod"]=0x02A3C,
+ ["InvisibleComma"]=0x02063,
+ ["InvisibleTimes"]=0x02062,
+ ["IOcy"]=0x00401,
+ ["iocy"]=0x00451,
+ ["Iogon"]=0x0012E,
+ ["iogon"]=0x0012F,
+ ["Iopf"]=0x1D540,
+ ["iopf"]=0x1D55A,
+ ["iota"]=0x003B9,
+ ["iprod"]=0x02A3C,
+ ["iquest"]=0x000BF,
+ ["Iscr"]=0x02110,
+ ["iscr"]=0x1D4BE,
+ ["isin"]=0x02208,
+ ["isindot"]=0x022F5,
+ ["isinE"]=0x022F9,
+ ["isins"]=0x022F4,
+ ["isinsv"]=0x022F3,
+ ["isinv"]=0x02208,
+ ["it"]=0x02062,
+ ["Itilde"]=0x00128,
+ ["itilde"]=0x00129,
+ ["Iukcy"]=0x00406,
+ ["iukcy"]=0x00456,
+ ["Iuml"]=0x000CF,
+ ["iuml"]=0x000EF,
+ ["Jcirc"]=0x00134,
+ ["jcirc"]=0x00135,
+ ["Jcy"]=0x00419,
+ ["jcy"]=0x00439,
+ ["Jfr"]=0x1D50D,
+ ["jfr"]=0x1D527,
+ ["jmath"]=0x0006A,
+ ["Jopf"]=0x1D541,
+ ["jopf"]=0x1D55B,
+ ["Jscr"]=0x1D4A5,
+ ["jscr"]=0x1D4BF,
+ ["Jsercy"]=0x00408,
+ ["jsercy"]=0x00458,
+ ["Jukcy"]=0x00404,
+ ["jukcy"]=0x00454,
+ ["kappa"]=0x003BA,
+ ["kappav"]=0x003F0,
+ ["Kcedil"]=0x00136,
+ ["kcedil"]=0x00137,
+ ["Kcy"]=0x0041A,
+ ["kcy"]=0x0043A,
+ ["Kfr"]=0x1D50E,
+ ["kfr"]=0x1D528,
+ ["kgreen"]=0x00138,
+ ["KHcy"]=0x00425,
+ ["khcy"]=0x00445,
+ ["KJcy"]=0x0040C,
+ ["kjcy"]=0x0045C,
+ ["Kopf"]=0x1D542,
+ ["kopf"]=0x1D55C,
+ ["Kscr"]=0x1D4A6,
+ ["kscr"]=0x1D4C0,
+ ["lAarr"]=0x021DA,
+ ["Lacute"]=0x00139,
+ ["lacute"]=0x0013A,
+ ["laemptyv"]=0x029B4,
+ ["lagran"]=0x02112,
+ ["Lambda"]=0x0039B,
+ ["lambda"]=0x003BB,
+ ["Lang"]=0x0300A,
+ ["lang"]=0x02329,
+ ["langd"]=0x02991,
+ ["langle"]=0x02329,
+ ["lap"]=0x02A85,
+ ["Laplacetrf"]=0x02112,
+ ["laquo"]=0x000AB,
+ ["Larr"]=0x0219E,
+ ["lArr"]=0x021D0,
+ ["larr"]=0x02190,
+ ["larrb"]=0x021E4,
+ ["larrbfs"]=0x0291F,
+ ["larrfs"]=0x0291D,
+ ["larrhk"]=0x021A9,
+ ["larrlp"]=0x021AB,
+ ["larrpl"]=0x02939,
+ ["larrsim"]=0x02973,
+ ["larrtl"]=0x021A2,
+ ["lat"]=0x02AAB,
+ ["lAtail"]=0x0291B,
+ ["latail"]=0x02919,
+ ["late"]=0x02AAD,
+ ["lates"]=0x02AAD,
+ ["lBarr"]=0x0290E,
+ ["lbarr"]=0x0290C,
+ ["lbbrk"]=0x03014,
+ ["lbrace"]=0x0007B,
+ ["lbrack"]=0x0005B,
+ ["lbrke"]=0x0298B,
+ ["lbrksld"]=0x0298F,
+ ["lbrkslu"]=0x0298D,
+ ["Lcaron"]=0x0013D,
+ ["lcaron"]=0x0013E,
+ ["Lcedil"]=0x0013B,
+ ["lcedil"]=0x0013C,
+ ["lceil"]=0x02308,
+ ["lcub"]=0x0007B,
+ ["Lcy"]=0x0041B,
+ ["lcy"]=0x0043B,
+ ["ldca"]=0x02936,
+ ["ldquo"]=0x0201C,
+ ["ldquor"]=0x0201E,
+ ["ldrdhar"]=0x02967,
+ ["ldrushar"]=0x0294B,
+ ["ldsh"]=0x021B2,
+ ["lE"]=0x02266,
+ ["le"]=0x02264,
+ ["LeftAngleBracket"]=0x02329,
+ ["LeftArrow"]=0x02190,
+ ["Leftarrow"]=0x021D0,
+ ["leftarrow"]=0x02190,
+ ["LeftArrowBar"]=0x021E4,
+ ["LeftArrowRightArrow"]=0x021C6,
+ ["leftarrowtail"]=0x021A2,
+ ["LeftCeiling"]=0x02308,
+ ["LeftDoubleBracket"]=0x0301A,
+ ["LeftDownTeeVector"]=0x02961,
+ ["LeftDownVector"]=0x021C3,
+ ["LeftDownVectorBar"]=0x02959,
+ ["LeftFloor"]=0x0230A,
+ ["leftharpoondown"]=0x021BD,
+ ["leftharpoonup"]=0x021BC,
+ ["leftleftarrows"]=0x021C7,
+ ["LeftRightArrow"]=0x02194,
+ ["Leftrightarrow"]=0x021D4,
+ ["leftrightarrow"]=0x02194,
+ ["leftrightarrows"]=0x021C6,
+ ["leftrightharpoons"]=0x021CB,
+ ["leftrightsquigarrow"]=0x021AD,
+ ["LeftRightVector"]=0x0294E,
+ ["LeftTee"]=0x022A3,
+ ["LeftTeeArrow"]=0x021A4,
+ ["LeftTeeVector"]=0x0295A,
+ ["leftthreetimes"]=0x022CB,
+ ["LeftTriangle"]=0x022B2,
+ ["LeftTriangleBar"]=0x029CF,
+ ["LeftTriangleEqual"]=0x022B4,
+ ["LeftUpDownVector"]=0x02951,
+ ["LeftUpTeeVector"]=0x02960,
+ ["LeftUpVector"]=0x021BF,
+ ["LeftUpVectorBar"]=0x02958,
+ ["LeftVector"]=0x021BC,
+ ["LeftVectorBar"]=0x02952,
+ ["lEg"]=0x02A8B,
+ ["leg"]=0x022DA,
+ ["leq"]=0x02264,
+ ["leqq"]=0x02266,
+ ["leqslant"]=0x02A7D,
+ ["les"]=0x02A7D,
+ ["lescc"]=0x02AA8,
+ ["lesdot"]=0x02A7F,
+ ["lesdoto"]=0x02A81,
+ ["lesdotor"]=0x02A83,
+ ["lesg"]=0x022DA,
+ ["lesges"]=0x02A93,
+ ["lessapprox"]=0x02A85,
+ ["lessdot"]=0x022D6,
+ ["lesseqgtr"]=0x022DA,
+ ["lesseqqgtr"]=0x02A8B,
+ ["LessEqualGreater"]=0x022DA,
+ ["LessFullEqual"]=0x02266,
+ ["LessGreater"]=0x02276,
+ ["lessgtr"]=0x02276,
+ ["LessLess"]=0x02AA1,
+ ["lesssim"]=0x02272,
+ ["LessSlantEqual"]=0x02A7D,
+ ["LessTilde"]=0x02272,
+ ["lfisht"]=0x0297C,
+ ["lfloor"]=0x0230A,
+ ["Lfr"]=0x1D50F,
+ ["lfr"]=0x1D529,
+ ["lg"]=0x02276,
+ ["lgE"]=0x02A91,
+ ["lHar"]=0x02962,
+ ["lhard"]=0x021BD,
+ ["lharu"]=0x021BC,
+ ["lharul"]=0x0296A,
+ ["lhblk"]=0x02584,
+ ["LJcy"]=0x00409,
+ ["ljcy"]=0x00459,
+ ["Ll"]=0x022D8,
+ ["ll"]=0x0226A,
+ ["llarr"]=0x021C7,
+ ["llcorner"]=0x0231E,
+ ["Lleftarrow"]=0x021DA,
+ ["llhard"]=0x0296B,
+ ["lltri"]=0x025FA,
+ ["Lmidot"]=0x0013F,
+ ["lmidot"]=0x00140,
+ ["lmoust"]=0x023B0,
+ ["lmoustache"]=0x023B0,
+ ["lnap"]=0x02A89,
+ ["lnapprox"]=0x02A89,
+ ["lnE"]=0x02268,
+ ["lne"]=0x02A87,
+ ["lneq"]=0x02A87,
+ ["lneqq"]=0x02268,
+ ["lnsim"]=0x022E6,
+ ["loang"]=0x03018,
+ ["loarr"]=0x021FD,
+ ["lobrk"]=0x0301A,
+ ["LongLeftArrow"]=0x027F5,
+ ["Longleftarrow"]=0x027F8,
+ ["longleftarrow"]=0x027F5,
+ ["LongLeftRightArrow"]=0x027F7,
+ ["Longleftrightarrow"]=0x027FA,
+ ["longleftrightarrow"]=0x027F7,
+ ["longmapsto"]=0x027FC,
+ ["LongRightArrow"]=0x027F6,
+ ["Longrightarrow"]=0x027F9,
+ ["longrightarrow"]=0x027F6,
+ ["looparrowleft"]=0x021AB,
+ ["looparrowright"]=0x021AC,
+ ["lopar"]=0x02985,
+ ["Lopf"]=0x1D543,
+ ["lopf"]=0x1D55D,
+ ["loplus"]=0x02A2D,
+ ["lotimes"]=0x02A34,
+ ["lowast"]=0x02217,
+ ["lowbar"]=0x0005F,
+ ["LowerLeftArrow"]=0x02199,
+ ["LowerRightArrow"]=0x02198,
+ ["loz"]=0x025CA,
+ ["lozenge"]=0x025CA,
+ ["lozf"]=0x029EB,
+ ["lpar"]=0x00028,
+ ["lparlt"]=0x02993,
+ ["lrarr"]=0x021C6,
+ ["lrcorner"]=0x0231F,
+ ["lrhar"]=0x021CB,
+ ["lrhard"]=0x0296D,
+ ["lrtri"]=0x022BF,
+ ["Lscr"]=0x02112,
+ ["lscr"]=0x1D4C1,
+ ["Lsh"]=0x021B0,
+ ["lsh"]=0x021B0,
+ ["lsim"]=0x02272,
+ ["lsime"]=0x02A8D,
+ ["lsimg"]=0x02A8F,
+ ["lsqb"]=0x0005B,
+ ["lsquo"]=0x02018,
+ ["lsquor"]=0x0201A,
+ ["Lstrok"]=0x00141,
+ ["lstrok"]=0x00142,
+ ["Lt"]=0x0226A,
+ ["lt"]=0x0003C,
+ ["ltcc"]=0x02AA6,
+ ["ltcir"]=0x02A79,
+ ["ltdot"]=0x022D6,
+ ["lthree"]=0x022CB,
+ ["ltimes"]=0x022C9,
+ ["ltlarr"]=0x02976,
+ ["ltquest"]=0x02A7B,
+ ["ltri"]=0x025C3,
+ ["ltrie"]=0x022B4,
+ ["ltrif"]=0x025C2,
+ ["ltrPar"]=0x02996,
+ ["lurdshar"]=0x0294A,
+ ["luruhar"]=0x02966,
+ ["lvertneqq"]=0x02268,
+ ["lvnE"]=0x02268,
+ ["macr"]=0x000AF,
+ ["male"]=0x02642,
+ ["malt"]=0x02720,
+ ["maltese"]=0x02720,
+ ["Map"]=0x02905,
+ ["map"]=0x021A6,
+ ["mapsto"]=0x021A6,
+ ["mapstodown"]=0x021A7,
+ ["mapstoleft"]=0x021A4,
+ ["mapstoup"]=0x021A5,
+ ["marker"]=0x025AE,
+ ["mcomma"]=0x02A29,
+ ["Mcy"]=0x0041C,
+ ["mcy"]=0x0043C,
+ ["mdash"]=0x02014,
+ ["mDDot"]=0x0223A,
+ ["measuredangle"]=0x02221,
+ ["MediumSpace"]=0x0205F,
+ ["Mellintrf"]=0x02133,
+ ["Mfr"]=0x1D510,
+ ["mfr"]=0x1D52A,
+ ["mho"]=0x02127,
+ ["micro"]=0x000B5,
+ ["mid"]=0x02223,
+ ["midast"]=0x0002A,
+ ["midcir"]=0x02AF0,
+ ["middot"]=0x000B7,
+ ["minus"]=0x02212,
+ ["minusb"]=0x0229F,
+ ["minusd"]=0x02238,
+ ["minusdu"]=0x02A2A,
+ ["MinusPlus"]=0x02213,
+ ["mlcp"]=0x02ADB,
+ ["mldr"]=0x02026,
+ ["mnplus"]=0x02213,
+ ["models"]=0x022A7,
+ ["Mopf"]=0x1D544,
+ ["mopf"]=0x1D55E,
+ ["mp"]=0x02213,
+ ["Mscr"]=0x02133,
+ ["mscr"]=0x1D4C2,
+ ["mstpos"]=0x0223E,
+ ["mu"]=0x003BC,
+ ["multimap"]=0x022B8,
+ ["mumap"]=0x022B8,
+ ["nabla"]=0x02207,
+ ["Nacute"]=0x00143,
+ ["nacute"]=0x00144,
+ ["nang"]=0x02220,
+ ["nap"]=0x02249,
+ ["napE"]=0x02A70,
+ ["napid"]=0x0224B,
+ ["napos"]=0x00149,
+ ["napprox"]=0x02249,
+ ["natur"]=0x0266E,
+ ["natural"]=0x0266E,
+ ["naturals"]=0x02115,
+ ["nbsp"]=0x000A0,
+ ["nbump"]=0x0224E,
+ ["nbumpe"]=0x0224F,
+ ["ncap"]=0x02A43,
+ ["Ncaron"]=0x00147,
+ ["ncaron"]=0x00148,
+ ["Ncedil"]=0x00145,
+ ["ncedil"]=0x00146,
+ ["ncong"]=0x02247,
+ ["ncongdot"]=0x02A6D,
+ ["ncup"]=0x02A42,
+ ["Ncy"]=0x0041D,
+ ["ncy"]=0x0043D,
+ ["ndash"]=0x02013,
+ ["ne"]=0x02260,
+ ["nearhk"]=0x02924,
+ ["neArr"]=0x021D7,
+ ["nearr"]=0x02197,
+ ["nearrow"]=0x02197,
+ ["nedot"]=0x02250,
+ ["NegativeMediumSpace"]=0x0200B,
+ ["NegativeThickSpace"]=0x0200B,
+ ["NegativeThinSpace"]=0x0200B,
+ ["NegativeVeryThinSpace"]=0x0200B,
+ ["nequiv"]=0x02262,
+ ["nesear"]=0x02928,
+ ["nesim"]=0x02242,
+ ["NestedGreaterGreater"]=0x0226B,
+ ["NestedLessLess"]=0x0226A,
+ ["NewLine"]=0x0000A,
+ ["nexist"]=0x02204,
+ ["nexists"]=0x02204,
+ ["Nfr"]=0x1D511,
+ ["nfr"]=0x1D52B,
+ ["ngE"]=0x02267,
+ ["nge"]=0x02271,
+ ["ngeq"]=0x02271,
+ ["ngeqq"]=0x02267,
+ ["ngeqslant"]=0x02A7E,
+ ["nges"]=0x02A7E,
+ ["nGg"]=0x022D9,
+ ["ngsim"]=0x02275,
+ ["nGt"]=0x0226B,
+ ["ngt"]=0x0226F,
+ ["ngtr"]=0x0226F,
+ ["nGtv"]=0x0226B,
+ ["nhArr"]=0x021CE,
+ ["nharr"]=0x021AE,
+ ["nhpar"]=0x02AF2,
+ ["ni"]=0x0220B,
+ ["nis"]=0x022FC,
+ ["nisd"]=0x022FA,
+ ["niv"]=0x0220B,
+ ["NJcy"]=0x0040A,
+ ["njcy"]=0x0045A,
+ ["nlArr"]=0x021CD,
+ ["nlarr"]=0x0219A,
+ ["nldr"]=0x02025,
+ ["nlE"]=0x02266,
+ ["nle"]=0x02270,
+ ["nLeftarrow"]=0x021CD,
+ ["nleftarrow"]=0x0219A,
+ ["nLeftrightarrow"]=0x021CE,
+ ["nleftrightarrow"]=0x021AE,
+ ["nleq"]=0x02270,
+ ["nleqq"]=0x02266,
+ ["nleqslant"]=0x02A7D,
+ ["nles"]=0x02A7D,
+ ["nless"]=0x0226E,
+ ["nLl"]=0x022D8,
+ ["nlsim"]=0x02274,
+ ["nLt"]=0x0226A,
+ ["nlt"]=0x0226E,
+ ["nltri"]=0x022EA,
+ ["nltrie"]=0x022EC,
+ ["nLtv"]=0x0226A,
+ ["nmid"]=0x02224,
+ ["NoBreak"]=0x02060,
+ ["NonBreakingSpace"]=0x000A0,
+ ["Nopf"]=0x02115,
+ ["nopf"]=0x1D55F,
+ ["Not"]=0x02AEC,
+ ["not"]=0x000AC,
+ ["NotCongruent"]=0x02262,
+ ["NotCupCap"]=0x0226D,
+ ["NotDoubleVerticalBar"]=0x02226,
+ ["NotElement"]=0x02209,
+ ["NotEqual"]=0x02260,
+ ["NotEqualTilde"]=0x02242,
+ ["NotExists"]=0x02204,
+ ["NotGreater"]=0x0226F,
+ ["NotGreaterEqual"]=0x02271,
+ ["NotGreaterFullEqual"]=0x02266,
+ ["NotGreaterGreater"]=0x0226B,
+ ["NotGreaterLess"]=0x02279,
+ ["NotGreaterSlantEqual"]=0x02A7E,
+ ["NotGreaterTilde"]=0x02275,
+ ["NotHumpDownHump"]=0x0224E,
+ ["NotHumpEqual"]=0x0224F,
+ ["notin"]=0x02209,
+ ["notindot"]=0x022F5,
+ ["notinE"]=0x022F9,
+ ["notinva"]=0x02209,
+ ["notinvb"]=0x022F7,
+ ["notinvc"]=0x022F6,
+ ["NotLeftTriangle"]=0x022EA,
+ ["NotLeftTriangleBar"]=0x029CF,
+ ["NotLeftTriangleEqual"]=0x022EC,
+ ["NotLess"]=0x0226E,
+ ["NotLessEqual"]=0x02270,
+ ["NotLessGreater"]=0x02278,
+ ["NotLessLess"]=0x0226A,
+ ["NotLessSlantEqual"]=0x02A7D,
+ ["NotLessTilde"]=0x02274,
+ ["NotNestedGreaterGreater"]=0x02AA2,
+ ["NotNestedLessLess"]=0x02AA1,
+ ["notni"]=0x0220C,
+ ["notniva"]=0x0220C,
+ ["notnivb"]=0x022FE,
+ ["notnivc"]=0x022FD,
+ ["NotPrecedes"]=0x02280,
+ ["NotPrecedesEqual"]=0x02AAF,
+ ["NotPrecedesSlantEqual"]=0x022E0,
+ ["NotReverseElement"]=0x0220C,
+ ["NotRightTriangle"]=0x022EB,
+ ["NotRightTriangleBar"]=0x029D0,
+ ["NotRightTriangleEqual"]=0x022ED,
+ ["NotSquareSubset"]=0x0228F,
+ ["NotSquareSubsetEqual"]=0x022E2,
+ ["NotSquareSuperset"]=0x02290,
+ ["NotSquareSupersetEqual"]=0x022E3,
+ ["NotSubset"]=0x02282,
+ ["NotSubsetEqual"]=0x02288,
+ ["NotSucceeds"]=0x02281,
+ ["NotSucceedsEqual"]=0x02AB0,
+ ["NotSucceedsSlantEqual"]=0x022E1,
+ ["NotSucceedsTilde"]=0x0227F,
+ ["NotSuperset"]=0x02283,
+ ["NotSupersetEqual"]=0x02289,
+ ["NotTilde"]=0x02241,
+ ["NotTildeEqual"]=0x02244,
+ ["NotTildeFullEqual"]=0x02247,
+ ["NotTildeTilde"]=0x02249,
+ ["NotVerticalBar"]=0x02224,
+ ["npar"]=0x02226,
+ ["nparallel"]=0x02226,
+ ["nparsl"]=0x02AFD,
+ ["npart"]=0x02202,
+ ["npolint"]=0x02A14,
+ ["npr"]=0x02280,
+ ["nprcue"]=0x022E0,
+ ["npre"]=0x02AAF,
+ ["nprec"]=0x02280,
+ ["npreceq"]=0x02AAF,
+ ["nrArr"]=0x021CF,
+ ["nrarr"]=0x0219B,
+ ["nrarrc"]=0x02933,
+ ["nrarrw"]=0x0219D,
+ ["nRightarrow"]=0x021CF,
+ ["nrightarrow"]=0x0219B,
+ ["nrtri"]=0x022EB,
+ ["nrtrie"]=0x022ED,
+ ["nsc"]=0x02281,
+ ["nsccue"]=0x022E1,
+ ["nsce"]=0x02AB0,
+ ["Nscr"]=0x1D4A9,
+ ["nscr"]=0x1D4C3,
+ ["nshortmid"]=0x02224,
+ ["nshortparallel"]=0x02226,
+ ["nsim"]=0x02241,
+ ["nsime"]=0x02244,
+ ["nsimeq"]=0x02244,
+ ["nsmid"]=0x02224,
+ ["nspar"]=0x02226,
+ ["nsqsube"]=0x022E2,
+ ["nsqsupe"]=0x022E3,
+ ["nsub"]=0x02284,
+ ["nsubE"]=0x02AC5,
+ ["nsube"]=0x02288,
+ ["nsubset"]=0x02282,
+ ["nsubseteq"]=0x02288,
+ ["nsubseteqq"]=0x02AC5,
+ ["nsucc"]=0x02281,
+ ["nsucceq"]=0x02AB0,
+ ["nsup"]=0x02285,
+ ["nsupE"]=0x02AC6,
+ ["nsupe"]=0x02289,
+ ["nsupset"]=0x02283,
+ ["nsupseteq"]=0x02289,
+ ["nsupseteqq"]=0x02AC6,
+ ["ntgl"]=0x02279,
+ ["Ntilde"]=0x000D1,
+ ["ntilde"]=0x000F1,
+ ["ntlg"]=0x02278,
+ ["ntriangleleft"]=0x022EA,
+ ["ntrianglelefteq"]=0x022EC,
+ ["ntriangleright"]=0x022EB,
+ ["ntrianglerighteq"]=0x022ED,
+ ["nu"]=0x003BD,
+ ["num"]=0x00023,
+ ["numero"]=0x02116,
+ ["numsp"]=0x02007,
+ ["nvap"]=0x0224D,
+ ["nVDash"]=0x022AF,
+ ["nVdash"]=0x022AE,
+ ["nvDash"]=0x022AD,
+ ["nvdash"]=0x022AC,
+ ["nvge"]=0x02265,
+ ["nvgt"]=0x0003E,
+ ["nvHarr"]=0x02904,
+ ["nvinfin"]=0x029DE,
+ ["nvlArr"]=0x02902,
+ ["nvle"]=0x02264,
+ ["nvlt"]=0x0003C,
+ ["nvltrie"]=0x022B4,
+ ["nvrArr"]=0x02903,
+ ["nvrtrie"]=0x022B5,
+ ["nvsim"]=0x0223C,
+ ["nwarhk"]=0x02923,
+ ["nwArr"]=0x021D6,
+ ["nwarr"]=0x02196,
+ ["nwarrow"]=0x02196,
+ ["nwnear"]=0x02927,
+ ["Oacute"]=0x000D3,
+ ["oacute"]=0x000F3,
+ ["oast"]=0x0229B,
+ ["ocir"]=0x0229A,
+ ["Ocirc"]=0x000D4,
+ ["ocirc"]=0x000F4,
+ ["Ocy"]=0x0041E,
+ ["ocy"]=0x0043E,
+ ["odash"]=0x0229D,
+ ["Odblac"]=0x00150,
+ ["odblac"]=0x00151,
+ ["odiv"]=0x02A38,
+ ["odot"]=0x02299,
+ ["odsold"]=0x029BC,
+ ["OElig"]=0x00152,
+ ["oelig"]=0x00153,
+ ["ofcir"]=0x029BF,
+ ["Ofr"]=0x1D512,
+ ["ofr"]=0x1D52C,
+ ["ogon"]=0x002DB,
+ ["Ograve"]=0x000D2,
+ ["ograve"]=0x000F2,
+ ["ogt"]=0x029C1,
+ ["ohbar"]=0x029B5,
+ ["ohm"]=0x02126,
+ ["oint"]=0x0222E,
+ ["olarr"]=0x021BA,
+ ["olcir"]=0x029BE,
+ ["olcross"]=0x029BB,
+ ["olt"]=0x029C0,
+ ["Omacr"]=0x0014C,
+ ["omacr"]=0x0014D,
+ ["Omega"]=0x003A9,
+ ["omega"]=0x003C9,
+ ["omid"]=0x029B6,
+ ["ominus"]=0x02296,
+ ["Oopf"]=0x1D546,
+ ["oopf"]=0x1D560,
+ ["opar"]=0x029B7,
+ ["OpenCurlyDoubleQuote"]=0x0201C,
+ ["OpenCurlyQuote"]=0x02018,
+ ["operp"]=0x029B9,
+ ["oplus"]=0x02295,
+ ["Or"]=0x02A54,
+ ["or"]=0x02228,
+ ["orarr"]=0x021BB,
+ ["ord"]=0x02A5D,
+ ["order"]=0x02134,
+ ["orderof"]=0x02134,
+ ["ordf"]=0x000AA,
+ ["ordm"]=0x000BA,
+ ["origof"]=0x022B6,
+ ["oror"]=0x02A56,
+ ["orslope"]=0x02A57,
+ ["orv"]=0x02A5B,
+ ["oS"]=0x024C8,
+ ["Oscr"]=0x1D4AA,
+ ["oscr"]=0x02134,
+ ["Oslash"]=0x000D8,
+ ["oslash"]=0x000F8,
+ ["osol"]=0x02298,
+ ["Otilde"]=0x000D5,
+ ["otilde"]=0x000F5,
+ ["Otimes"]=0x02A37,
+ ["otimes"]=0x02297,
+ ["otimesas"]=0x02A36,
+ ["Ouml"]=0x000D6,
+ ["ouml"]=0x000F6,
+ ["ovbar"]=0x0233D,
+ ["OverBar"]=0x000AF,
+ ["OverBrace"]=0x0FE37,
+ ["OverBracket"]=0x023B4,
+ ["OverParenthesis"]=0x0FE35,
+ ["par"]=0x02225,
+ ["para"]=0x000B6,
+ ["parallel"]=0x02225,
+ ["parsim"]=0x02AF3,
+ ["parsl"]=0x02AFD,
+ ["part"]=0x02202,
+ ["PartialD"]=0x02202,
+ ["Pcy"]=0x0041F,
+ ["pcy"]=0x0043F,
+ ["percnt"]=0x00025,
+ ["period"]=0x0002E,
+ ["permil"]=0x02030,
+ ["perp"]=0x022A5,
+ ["pertenk"]=0x02031,
+ ["Pfr"]=0x1D513,
+ ["pfr"]=0x1D52D,
+ ["Phi"]=0x003A6,
+ ["phi"]=0x003D5,
+ ["phiv"]=0x003C6,
+ ["phmmat"]=0x02133,
+ ["phone"]=0x0260E,
+ ["Pi"]=0x003A0,
+ ["pi"]=0x003C0,
+ ["pitchfork"]=0x022D4,
+ ["piv"]=0x003D6,
+ ["planck"]=0x0210F,
+ ["planckh"]=0x0210E,
+ ["plankv"]=0x0210F,
+ ["plus"]=0x0002B,
+ ["plusacir"]=0x02A23,
+ ["plusb"]=0x0229E,
+ ["pluscir"]=0x02A22,
+ ["plusdo"]=0x02214,
+ ["plusdu"]=0x02A25,
+ ["pluse"]=0x02A72,
+ ["PlusMinus"]=0x000B1,
+ ["plusmn"]=0x000B1,
+ ["plussim"]=0x02A26,
+ ["plustwo"]=0x02A27,
+ ["pm"]=0x000B1,
+ ["Poincareplane"]=0x0210C,
+ ["pointint"]=0x02A15,
+ ["Popf"]=0x02119,
+ ["popf"]=0x1D561,
+ ["pound"]=0x000A3,
+ ["Pr"]=0x02ABB,
+ ["pr"]=0x0227A,
+ ["prap"]=0x02AB7,
+ ["prcue"]=0x0227C,
+ ["prE"]=0x02AB3,
+ ["pre"]=0x02AAF,
+ ["prec"]=0x0227A,
+ ["precapprox"]=0x02AB7,
+ ["preccurlyeq"]=0x0227C,
+ ["Precedes"]=0x0227A,
+ ["PrecedesEqual"]=0x02AAF,
+ ["PrecedesSlantEqual"]=0x0227C,
+ ["PrecedesTilde"]=0x0227E,
+ ["preceq"]=0x02AAF,
+ ["precnapprox"]=0x02AB9,
+ ["precneqq"]=0x02AB5,
+ ["precnsim"]=0x022E8,
+ ["precsim"]=0x0227E,
+ ["Prime"]=0x02033,
+ ["prime"]=0x02032,
+ ["primes"]=0x02119,
+ ["prnap"]=0x02AB9,
+ ["prnE"]=0x02AB5,
+ ["prnsim"]=0x022E8,
+ ["prod"]=0x0220F,
+ ["Product"]=0x0220F,
+ ["profalar"]=0x0232E,
+ ["profline"]=0x02312,
+ ["profsurf"]=0x02313,
+ ["prop"]=0x0221D,
+ ["Proportion"]=0x02237,
+ ["Proportional"]=0x0221D,
+ ["propto"]=0x0221D,
+ ["prsim"]=0x0227E,
+ ["prurel"]=0x022B0,
+ ["Pscr"]=0x1D4AB,
+ ["pscr"]=0x1D4C5,
+ ["Psi"]=0x003A8,
+ ["psi"]=0x003C8,
+ ["puncsp"]=0x02008,
+ ["Qfr"]=0x1D514,
+ ["qfr"]=0x1D52E,
+ ["qint"]=0x02A0C,
+ ["Qopf"]=0x0211A,
+ ["qopf"]=0x1D562,
+ ["qprime"]=0x02057,
+ ["Qscr"]=0x1D4AC,
+ ["qscr"]=0x1D4C6,
+ ["quaternions"]=0x0210D,
+ ["quatint"]=0x02A16,
+ ["quest"]=0x0003F,
+ ["questeq"]=0x0225F,
+ ["quot"]=0x00022,
+ ["rAarr"]=0x021DB,
+ ["race"]=0x029DA,
+ ["Racute"]=0x00154,
+ ["racute"]=0x00155,
+ ["radic"]=0x0221A,
+ ["raemptyv"]=0x029B3,
+ ["Rang"]=0x0300B,
+ ["rang"]=0x0232A,
+ ["rangd"]=0x02992,
+ ["range"]=0x029A5,
+ ["rangle"]=0x0232A,
+ ["raquo"]=0x000BB,
+ ["Rarr"]=0x021A0,
+ ["rArr"]=0x021D2,
+ ["rarr"]=0x02192,
+ ["rarrap"]=0x02975,
+ ["rarrb"]=0x021E5,
+ ["rarrbfs"]=0x02920,
+ ["rarrc"]=0x02933,
+ ["rarrfs"]=0x0291E,
+ ["rarrhk"]=0x021AA,
+ ["rarrlp"]=0x021AC,
+ ["rarrpl"]=0x02945,
+ ["rarrsim"]=0x02974,
+ ["Rarrtl"]=0x02916,
+ ["rarrtl"]=0x021A3,
+ ["rarrw"]=0x0219D,
+ ["rAtail"]=0x0291C,
+ ["ratail"]=0x0291A,
+ ["ratio"]=0x02236,
+ ["rationals"]=0x0211A,
+ ["RBarr"]=0x02910,
+ ["rBarr"]=0x0290F,
+ ["rbarr"]=0x0290D,
+ ["rbbrk"]=0x03015,
+ ["rbrace"]=0x0007D,
+ ["rbrack"]=0x0005D,
+ ["rbrke"]=0x0298C,
+ ["rbrksld"]=0x0298E,
+ ["rbrkslu"]=0x02990,
+ ["Rcaron"]=0x00158,
+ ["rcaron"]=0x00159,
+ ["Rcedil"]=0x00156,
+ ["rcedil"]=0x00157,
+ ["rceil"]=0x02309,
+ ["rcub"]=0x0007D,
+ ["Rcy"]=0x00420,
+ ["rcy"]=0x00440,
+ ["rdca"]=0x02937,
+ ["rdldhar"]=0x02969,
+ ["rdquo"]=0x0201D,
+ ["rdquor"]=0x0201D,
+ ["rdsh"]=0x021B3,
+ ["Re"]=0x0211C,
+ ["real"]=0x0211C,
+ ["realine"]=0x0211B,
+ ["realpart"]=0x0211C,
+ ["reals"]=0x0211D,
+ ["rect"]=0x025AD,
+ ["reg"]=0x000AE,
+ ["ReverseElement"]=0x0220B,
+ ["ReverseEquilibrium"]=0x021CB,
+ ["ReverseUpEquilibrium"]=0x0296F,
+ ["rfisht"]=0x0297D,
+ ["rfloor"]=0x0230B,
+ ["Rfr"]=0x0211C,
+ ["rfr"]=0x1D52F,
+ ["rHar"]=0x02964,
+ ["rhard"]=0x021C1,
+ ["rharu"]=0x021C0,
+ ["rharul"]=0x0296C,
+ ["rho"]=0x003C1,
+ ["rhov"]=0x003F1,
+ ["RightAngleBracket"]=0x0232A,
+ ["RightArrow"]=0x02192,
+ ["Rightarrow"]=0x021D2,
+ ["rightarrow"]=0x02192,
+ ["RightArrowBar"]=0x021E5,
+ ["RightArrowLeftArrow"]=0x021C4,
+ ["rightarrowtail"]=0x021A3,
+ ["RightCeiling"]=0x02309,
+ ["RightDoubleBracket"]=0x0301B,
+ ["RightDownTeeVector"]=0x0295D,
+ ["RightDownVector"]=0x021C2,
+ ["RightDownVectorBar"]=0x02955,
+ ["RightFloor"]=0x0230B,
+ ["rightharpoondown"]=0x021C1,
+ ["rightharpoonup"]=0x021C0,
+ ["rightleftarrows"]=0x021C4,
+ ["rightleftharpoons"]=0x021CC,
+ ["rightrightarrows"]=0x021C9,
+ ["rightsquigarrow"]=0x0219D,
+ ["RightTee"]=0x022A2,
+ ["RightTeeArrow"]=0x021A6,
+ ["RightTeeVector"]=0x0295B,
+ ["rightthreetimes"]=0x022CC,
+ ["RightTriangle"]=0x022B3,
+ ["RightTriangleBar"]=0x029D0,
+ ["RightTriangleEqual"]=0x022B5,
+ ["RightUpDownVector"]=0x0294F,
+ ["RightUpTeeVector"]=0x0295C,
+ ["RightUpVector"]=0x021BE,
+ ["RightUpVectorBar"]=0x02954,
+ ["RightVector"]=0x021C0,
+ ["RightVectorBar"]=0x02953,
+ ["ring"]=0x002DA,
+ ["risingdotseq"]=0x02253,
+ ["rlarr"]=0x021C4,
+ ["rlhar"]=0x021CC,
+ ["rmoust"]=0x023B1,
+ ["rmoustache"]=0x023B1,
+ ["rnmid"]=0x02AEE,
+ ["roang"]=0x03019,
+ ["roarr"]=0x021FE,
+ ["robrk"]=0x0301B,
+ ["ropar"]=0x02986,
+ ["Ropf"]=0x0211D,
+ ["ropf"]=0x1D563,
+ ["roplus"]=0x02A2E,
+ ["rotimes"]=0x02A35,
+ ["RoundImplies"]=0x02970,
+ ["rpar"]=0x00029,
+ ["rpargt"]=0x02994,
+ ["rppolint"]=0x02A12,
+ ["rrarr"]=0x021C9,
+ ["Rrightarrow"]=0x021DB,
+ ["Rscr"]=0x0211B,
+ ["rscr"]=0x1D4C7,
+ ["Rsh"]=0x021B1,
+ ["rsh"]=0x021B1,
+ ["rsqb"]=0x0005D,
+ ["rsquo"]=0x02019,
+ ["rsquor"]=0x02019,
+ ["rthree"]=0x022CC,
+ ["rtimes"]=0x022CA,
+ ["rtri"]=0x025B9,
+ ["rtrie"]=0x022B5,
+ ["rtrif"]=0x025B8,
+ ["rtriltri"]=0x029CE,
+ ["RuleDelayed"]=0x029F4,
+ ["ruluhar"]=0x02968,
+ ["rx"]=0x0211E,
+ ["Sacute"]=0x0015A,
+ ["sacute"]=0x0015B,
+ ["Sc"]=0x02ABC,
+ ["sc"]=0x0227B,
+ ["scap"]=0x02AB8,
+ ["Scaron"]=0x00160,
+ ["scaron"]=0x00161,
+ ["sccue"]=0x0227D,
+ ["scE"]=0x02AB4,
+ ["sce"]=0x02AB0,
+ ["Scedil"]=0x0015E,
+ ["scedil"]=0x0015F,
+ ["Scirc"]=0x0015C,
+ ["scirc"]=0x0015D,
+ ["scnap"]=0x02ABA,
+ ["scnE"]=0x02AB6,
+ ["scnsim"]=0x022E9,
+ ["scpolint"]=0x02A13,
+ ["scsim"]=0x0227F,
+ ["Scy"]=0x00421,
+ ["scy"]=0x00441,
+ ["sdot"]=0x022C5,
+ ["sdotb"]=0x022A1,
+ ["sdote"]=0x02A66,
+ ["searhk"]=0x02925,
+ ["seArr"]=0x021D8,
+ ["searr"]=0x02198,
+ ["searrow"]=0x02198,
+ ["sect"]=0x000A7,
+ ["semi"]=0x0003B,
+ ["seswar"]=0x02929,
+ ["setminus"]=0x02216,
+ ["setmn"]=0x02216,
+ ["sext"]=0x02736,
+ ["Sfr"]=0x1D516,
+ ["sfr"]=0x1D530,
+ ["sfrown"]=0x02322,
+ ["sharp"]=0x0266F,
+ ["SHCHcy"]=0x00429,
+ ["shchcy"]=0x00449,
+ ["SHcy"]=0x00428,
+ ["shcy"]=0x00448,
+ ["ShortDownArrow"]=0x02193,
+ ["ShortLeftArrow"]=0x02190,
+ ["shortmid"]=0x02223,
+ ["shortparallel"]=0x02225,
+ ["ShortRightArrow"]=0x02192,
+ ["ShortUpArrow"]=0x02191,
+ ["shy"]=0x000AD,
+ ["Sigma"]=0x003A3,
+ ["sigma"]=0x003C3,
+ ["sigmav"]=0x003C2,
+ ["sim"]=0x0223C,
+ ["simdot"]=0x02A6A,
+ ["sime"]=0x02243,
+ ["simeq"]=0x02243,
+ ["simg"]=0x02A9E,
+ ["simgE"]=0x02AA0,
+ ["siml"]=0x02A9D,
+ ["simlE"]=0x02A9F,
+ ["simne"]=0x02246,
+ ["simplus"]=0x02A24,
+ ["simrarr"]=0x02972,
+ ["slarr"]=0x02190,
+ ["SmallCircle"]=0x02218,
+ ["smallsetminus"]=0x02216,
+ ["smashp"]=0x02A33,
+ ["smeparsl"]=0x029E4,
+ ["smid"]=0x02223,
+ ["smile"]=0x02323,
+ ["smt"]=0x02AAA,
+ ["smte"]=0x02AAC,
+ ["smtes"]=0x02AAC,
+ ["SOFTcy"]=0x0042C,
+ ["softcy"]=0x0044C,
+ ["sol"]=0x0002F,
+ ["solb"]=0x029C4,
+ ["solbar"]=0x0233F,
+ ["Sopf"]=0x1D54A,
+ ["sopf"]=0x1D564,
+ ["spades"]=0x02660,
+ ["spadesuit"]=0x02660,
+ ["spar"]=0x02225,
+ ["sqcap"]=0x02293,
+ ["sqcaps"]=0x02293,
+ ["sqcup"]=0x02294,
+ ["sqcups"]=0x02294,
+ ["Sqrt"]=0x0221A,
+ ["sqsub"]=0x0228F,
+ ["sqsube"]=0x02291,
+ ["sqsubset"]=0x0228F,
+ ["sqsubseteq"]=0x02291,
+ ["sqsup"]=0x02290,
+ ["sqsupe"]=0x02292,
+ ["sqsupset"]=0x02290,
+ ["sqsupseteq"]=0x02292,
+ ["squ"]=0x025A1,
+ ["Square"]=0x025A1,
+ ["square"]=0x025A1,
+ ["SquareIntersection"]=0x02293,
+ ["SquareSubset"]=0x0228F,
+ ["SquareSubsetEqual"]=0x02291,
+ ["SquareSuperset"]=0x02290,
+ ["SquareSupersetEqual"]=0x02292,
+ ["SquareUnion"]=0x02294,
+ ["squarf"]=0x025AA,
+ ["squf"]=0x025AA,
+ ["srarr"]=0x02192,
+ ["Sscr"]=0x1D4AE,
+ ["sscr"]=0x1D4C8,
+ ["ssetmn"]=0x02216,
+ ["ssmile"]=0x02323,
+ ["sstarf"]=0x022C6,
+ ["Star"]=0x022C6,
+ ["star"]=0x02606,
+ ["starf"]=0x02605,
+ ["straightepsilon"]=0x003F5,
+ ["straightphi"]=0x003D5,
+ ["strns"]=0x000AF,
+ ["Sub"]=0x022D0,
+ ["sub"]=0x02282,
+ ["subdot"]=0x02ABD,
+ ["subE"]=0x02AC5,
+ ["sube"]=0x02286,
+ ["subedot"]=0x02AC3,
+ ["submult"]=0x02AC1,
+ ["subnE"]=0x02ACB,
+ ["subne"]=0x0228A,
+ ["subplus"]=0x02ABF,
+ ["subrarr"]=0x02979,
+ ["Subset"]=0x022D0,
+ ["subset"]=0x02282,
+ ["subseteq"]=0x02286,
+ ["subseteqq"]=0x02AC5,
+ ["SubsetEqual"]=0x02286,
+ ["subsetneq"]=0x0228A,
+ ["subsetneqq"]=0x02ACB,
+ ["subsim"]=0x02AC7,
+ ["subsub"]=0x02AD5,
+ ["subsup"]=0x02AD3,
+ ["succ"]=0x0227B,
+ ["succapprox"]=0x02AB8,
+ ["succcurlyeq"]=0x0227D,
+ ["Succeeds"]=0x0227B,
+ ["SucceedsEqual"]=0x02AB0,
+ ["SucceedsSlantEqual"]=0x0227D,
+ ["SucceedsTilde"]=0x0227F,
+ ["succeq"]=0x02AB0,
+ ["succnapprox"]=0x02ABA,
+ ["succneqq"]=0x02AB6,
+ ["succnsim"]=0x022E9,
+ ["succsim"]=0x0227F,
+ ["SuchThat"]=0x0220B,
+ ["Sum"]=0x02211,
+ ["sum"]=0x02211,
+ ["sung"]=0x0266A,
+ ["Sup"]=0x022D1,
+ ["sup"]=0x02283,
+ ["sup1"]=0x000B9,
+ ["sup2"]=0x000B2,
+ ["sup3"]=0x000B3,
+ ["supdot"]=0x02ABE,
+ ["supdsub"]=0x02AD8,
+ ["supE"]=0x02AC6,
+ ["supe"]=0x02287,
+ ["supedot"]=0x02AC4,
+ ["Superset"]=0x02283,
+ ["SupersetEqual"]=0x02287,
+ ["suphsol"]=0x02283,
+ ["suphsub"]=0x02AD7,
+ ["suplarr"]=0x0297B,
+ ["supmult"]=0x02AC2,
+ ["supnE"]=0x02ACC,
+ ["supne"]=0x0228B,
+ ["supplus"]=0x02AC0,
+ ["Supset"]=0x022D1,
+ ["supset"]=0x02283,
+ ["supseteq"]=0x02287,
+ ["supseteqq"]=0x02AC6,
+ ["supsetneq"]=0x0228B,
+ ["supsetneqq"]=0x02ACC,
+ ["supsim"]=0x02AC8,
+ ["supsub"]=0x02AD4,
+ ["supsup"]=0x02AD6,
+ ["swarhk"]=0x02926,
+ ["swArr"]=0x021D9,
+ ["swarr"]=0x02199,
+ ["swarrow"]=0x02199,
+ ["swnwar"]=0x0292A,
+ ["szlig"]=0x000DF,
+ ["Tab"]=0x00009,
+ ["target"]=0x02316,
+ ["tau"]=0x003C4,
+ ["tbrk"]=0x023B4,
+ ["Tcaron"]=0x00164,
+ ["tcaron"]=0x00165,
+ ["Tcedil"]=0x00162,
+ ["tcedil"]=0x00163,
+ ["Tcy"]=0x00422,
+ ["tcy"]=0x00442,
+ ["tdot"]=0x020DB,
+ ["telrec"]=0x02315,
+ ["Tfr"]=0x1D517,
+ ["tfr"]=0x1D531,
+ ["there4"]=0x02234,
+ ["Therefore"]=0x02234,
+ ["therefore"]=0x02234,
+ ["Theta"]=0x00398,
+ ["theta"]=0x003B8,
+ ["thetav"]=0x003D1,
+ ["thickapprox"]=0x02248,
+ ["thicksim"]=0x0223C,
+ ["ThickSpace"]=0x02009,
+ ["thinsp"]=0x02009,
+ ["ThinSpace"]=0x02009,
+ ["thkap"]=0x02248,
+ ["thksim"]=0x0223C,
+ ["THORN"]=0x000DE,
+ ["thorn"]=0x000FE,
+ ["Tilde"]=0x0223C,
+ ["tilde"]=0x002DC,
+ ["TildeEqual"]=0x02243,
+ ["TildeFullEqual"]=0x02245,
+ ["TildeTilde"]=0x02248,
+ ["times"]=0x000D7,
+ ["timesb"]=0x022A0,
+ ["timesbar"]=0x02A31,
+ ["timesd"]=0x02A30,
+ ["tint"]=0x0222D,
+ ["toea"]=0x02928,
+ ["top"]=0x022A4,
+ ["topbot"]=0x02336,
+ ["topcir"]=0x02AF1,
+ ["Topf"]=0x1D54B,
+ ["topf"]=0x1D565,
+ ["topfork"]=0x02ADA,
+ ["tosa"]=0x02929,
+ ["tprime"]=0x02034,
+ ["trade"]=0x02122,
+ ["triangle"]=0x025B5,
+ ["triangledown"]=0x025BF,
+ ["triangleleft"]=0x025C3,
+ ["trianglelefteq"]=0x022B4,
+ ["triangleq"]=0x0225C,
+ ["triangleright"]=0x025B9,
+ ["trianglerighteq"]=0x022B5,
+ ["tridot"]=0x025EC,
+ ["trie"]=0x0225C,
+ ["triminus"]=0x02A3A,
+ ["TripleDot"]=0x020DB,
+ ["triplus"]=0x02A39,
+ ["trisb"]=0x029CD,
+ ["tritime"]=0x02A3B,
+ ["trpezium"]=0x0FFFD,
+ ["Tscr"]=0x1D4AF,
+ ["tscr"]=0x1D4C9,
+ ["TScy"]=0x00426,
+ ["tscy"]=0x00446,
+ ["TSHcy"]=0x0040B,
+ ["tshcy"]=0x0045B,
+ ["Tstrok"]=0x00166,
+ ["tstrok"]=0x00167,
+ ["twixt"]=0x0226C,
+ ["twoheadleftarrow"]=0x0219E,
+ ["twoheadrightarrow"]=0x021A0,
+ ["Uacute"]=0x000DA,
+ ["uacute"]=0x000FA,
+ ["Uarr"]=0x0219F,
+ ["uArr"]=0x021D1,
+ ["uarr"]=0x02191,
+ ["Uarrocir"]=0x02949,
+ ["Ubrcy"]=0x0040E,
+ ["ubrcy"]=0x0045E,
+ ["Ubreve"]=0x0016C,
+ ["ubreve"]=0x0016D,
+ ["Ucirc"]=0x000DB,
+ ["ucirc"]=0x000FB,
+ ["Ucy"]=0x00423,
+ ["ucy"]=0x00443,
+ ["udarr"]=0x021C5,
+ ["Udblac"]=0x00170,
+ ["udblac"]=0x00171,
+ ["udhar"]=0x0296E,
+ ["ufisht"]=0x0297E,
+ ["Ufr"]=0x1D518,
+ ["ufr"]=0x1D532,
+ ["Ugrave"]=0x000D9,
+ ["ugrave"]=0x000F9,
+ ["uHar"]=0x02963,
+ ["uharl"]=0x021BF,
+ ["uharr"]=0x021BE,
+ ["uhblk"]=0x02580,
+ ["ulcorn"]=0x0231C,
+ ["ulcorner"]=0x0231C,
+ ["ulcrop"]=0x0230F,
+ ["ultri"]=0x025F8,
+ ["Umacr"]=0x0016A,
+ ["umacr"]=0x0016B,
+ ["uml"]=0x000A8,
+ ["UnderBar"]=0x00332,
+ ["UnderBrace"]=0x0FE38,
+ ["UnderBracket"]=0x023B5,
+ ["UnderParenthesis"]=0x0FE36,
+ ["Union"]=0x022C3,
+ ["UnionPlus"]=0x0228E,
+ ["Uogon"]=0x00172,
+ ["uogon"]=0x00173,
+ ["Uopf"]=0x1D54C,
+ ["uopf"]=0x1D566,
+ ["UpArrow"]=0x02191,
+ ["Uparrow"]=0x021D1,
+ ["uparrow"]=0x02191,
+ ["UpArrowBar"]=0x02912,
+ ["UpArrowDownArrow"]=0x021C5,
+ ["UpDownArrow"]=0x02195,
+ ["Updownarrow"]=0x021D5,
+ ["updownarrow"]=0x02195,
+ ["UpEquilibrium"]=0x0296E,
+ ["upharpoonleft"]=0x021BF,
+ ["upharpoonright"]=0x021BE,
+ ["uplus"]=0x0228E,
+ ["UpperLeftArrow"]=0x02196,
+ ["UpperRightArrow"]=0x02197,
+ ["Upsi"]=0x003D2,
+ ["upsi"]=0x003C5,
+ ["Upsilon"]=0x003A5,
+ ["upsilon"]=0x003C5,
+ ["UpTee"]=0x022A5,
+ ["UpTeeArrow"]=0x021A5,
+ ["upuparrows"]=0x021C8,
+ ["urcorn"]=0x0231D,
+ ["urcorner"]=0x0231D,
+ ["urcrop"]=0x0230E,
+ ["Uring"]=0x0016E,
+ ["uring"]=0x0016F,
+ ["urtri"]=0x025F9,
+ ["Uscr"]=0x1D4B0,
+ ["uscr"]=0x1D4CA,
+ ["utdot"]=0x022F0,
+ ["Utilde"]=0x00168,
+ ["utilde"]=0x00169,
+ ["utri"]=0x025B5,
+ ["utrif"]=0x025B4,
+ ["uuarr"]=0x021C8,
+ ["Uuml"]=0x000DC,
+ ["uuml"]=0x000FC,
+ ["uwangle"]=0x029A7,
+ ["vangrt"]=0x0299C,
+ ["varepsilon"]=0x003B5,
+ ["varkappa"]=0x003F0,
+ ["varnothing"]=0x02205,
+ ["varphi"]=0x003C6,
+ ["varpi"]=0x003D6,
+ ["varpropto"]=0x0221D,
+ ["vArr"]=0x021D5,
+ ["varr"]=0x02195,
+ ["varrho"]=0x003F1,
+ ["varsigma"]=0x003C2,
+ ["varsubsetneq"]=0x0228A,
+ ["varsubsetneqq"]=0x02ACB,
+ ["varsupsetneq"]=0x0228B,
+ ["varsupsetneqq"]=0x02ACC,
+ ["vartheta"]=0x003D1,
+ ["vartriangleleft"]=0x022B2,
+ ["vartriangleright"]=0x022B3,
+ ["Vbar"]=0x02AEB,
+ ["vBar"]=0x02AE8,
+ ["vBarv"]=0x02AE9,
+ ["Vcy"]=0x00412,
+ ["vcy"]=0x00432,
+ ["VDash"]=0x022AB,
+ ["Vdash"]=0x022A9,
+ ["vDash"]=0x022A8,
+ ["vdash"]=0x022A2,
+ ["Vdashl"]=0x02AE6,
+ ["Vee"]=0x022C1,
+ ["vee"]=0x02228,
+ ["veebar"]=0x022BB,
+ ["veeeq"]=0x0225A,
+ ["vellip"]=0x022EE,
+ ["Verbar"]=0x02016,
+ ["verbar"]=0x0007C,
+ ["Vert"]=0x02016,
+ ["vert"]=0x0007C,
+ ["VerticalBar"]=0x02223,
+ ["VerticalLine"]=0x0007C,
+ ["VerticalSeparator"]=0x02758,
+ ["VerticalTilde"]=0x02240,
+ ["VeryThinSpace"]=0x0200A,
+ ["Vfr"]=0x1D519,
+ ["vfr"]=0x1D533,
+ ["vltri"]=0x022B2,
+ ["vnsub"]=0x02282,
+ ["vnsup"]=0x02283,
+ ["Vopf"]=0x1D54D,
+ ["vopf"]=0x1D567,
+ ["vprop"]=0x0221D,
+ ["vrtri"]=0x022B3,
+ ["Vscr"]=0x1D4B1,
+ ["vscr"]=0x1D4CB,
+ ["vsubnE"]=0x02ACB,
+ ["vsubne"]=0x0228A,
+ ["vsupnE"]=0x02ACC,
+ ["vsupne"]=0x0228B,
+ ["Vvdash"]=0x022AA,
+ ["vzigzag"]=0x0299A,
+ ["Wcirc"]=0x00174,
+ ["wcirc"]=0x00175,
+ ["wedbar"]=0x02A5F,
+ ["Wedge"]=0x022C0,
+ ["wedge"]=0x02227,
+ ["wedgeq"]=0x02259,
+ ["weierp"]=0x02118,
+ ["Wfr"]=0x1D51A,
+ ["wfr"]=0x1D534,
+ ["Wopf"]=0x1D54E,
+ ["wopf"]=0x1D568,
+ ["wp"]=0x02118,
+ ["wr"]=0x02240,
+ ["wreath"]=0x02240,
+ ["Wscr"]=0x1D4B2,
+ ["wscr"]=0x1D4CC,
+ ["xcap"]=0x022C2,
+ ["xcirc"]=0x025EF,
+ ["xcup"]=0x022C3,
+ ["xdtri"]=0x025BD,
+ ["Xfr"]=0x1D51B,
+ ["xfr"]=0x1D535,
+ ["xhArr"]=0x027FA,
+ ["xharr"]=0x027F7,
+ ["Xi"]=0x0039E,
+ ["xi"]=0x003BE,
+ ["xlArr"]=0x027F8,
+ ["xlarr"]=0x027F5,
+ ["xmap"]=0x027FC,
+ ["xnis"]=0x022FB,
+ ["xodot"]=0x02A00,
+ ["Xopf"]=0x1D54F,
+ ["xopf"]=0x1D569,
+ ["xoplus"]=0x02A01,
+ ["xotime"]=0x02A02,
+ ["xrArr"]=0x027F9,
+ ["xrarr"]=0x027F6,
+ ["Xscr"]=0x1D4B3,
+ ["xscr"]=0x1D4CD,
+ ["xsqcup"]=0x02A06,
+ ["xuplus"]=0x02A04,
+ ["xutri"]=0x025B3,
+ ["xvee"]=0x022C1,
+ ["xwedge"]=0x022C0,
+ ["Yacute"]=0x000DD,
+ ["yacute"]=0x000FD,
+ ["YAcy"]=0x0042F,
+ ["yacy"]=0x0044F,
+ ["Ycirc"]=0x00176,
+ ["ycirc"]=0x00177,
+ ["Ycy"]=0x0042B,
+ ["ycy"]=0x0044B,
+ ["yen"]=0x000A5,
+ ["Yfr"]=0x1D51C,
+ ["yfr"]=0x1D536,
+ ["YIcy"]=0x00407,
+ ["yicy"]=0x00457,
+ ["Yopf"]=0x1D550,
+ ["yopf"]=0x1D56A,
+ ["Yscr"]=0x1D4B4,
+ ["yscr"]=0x1D4CE,
+ ["YUcy"]=0x0042E,
+ ["yucy"]=0x0044E,
+ ["Yuml"]=0x00178,
+ ["yuml"]=0x000FF,
+ ["Zacute"]=0x00179,
+ ["zacute"]=0x0017A,
+ ["Zcaron"]=0x0017D,
+ ["zcaron"]=0x0017E,
+ ["Zcy"]=0x00417,
+ ["zcy"]=0x00437,
+ ["Zdot"]=0x0017B,
+ ["zdot"]=0x0017C,
+ ["zeetrf"]=0x02128,
+ ["ZeroWidthSpace"]=0x0200B,
+ ["zeta"]=0x003B6,
+ ["Zfr"]=0x02128,
+ ["zfr"]=0x1D537,
+ ["ZHcy"]=0x00416,
+ ["zhcy"]=0x00436,
+ ["zigrarr"]=0x021DD,
+ ["Zopf"]=0x02124,
+ ["zopf"]=0x1D56B,
+ ["Zscr"]=0x1D4B5,
+ ["zscr"]=0x1D4CF,
+
+ ["plusminus"]=0x000B1,
+ ["minusplus"]=0x02213,
+ ["cdots"]=0x2026,
+
+}
diff --git a/tex/context/base/math-eul.mkii b/tex/context/base/math-eul.mkii
new file mode 100644
index 000000000..7552957a8
--- /dev/null
+++ b/tex/context/base/math-eul.mkii
@@ -0,0 +1,277 @@
+%D \module
+%D [ file=math-eul,
+%D version=2003.02.03,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Virtual Euler Specials,
+%D author={Hans Hagen \& Taco Hoekwater \& Adam Lindsay},
+%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. Further modified by Adam Lindsay.
+
+\unprotect
+
+%D We follow the following mappings from type-eul:
+%D
+%D mr [MathRoman] [Euler-Roman] [zeurm10]
+
+%D mi [MathItalic] [Euler-Italic] [eufm10]
+
+%D ex [MathExtension] [Euler-Extension] [zeuex10]
+%D sy [MathSymbol] [Euler-Symbol] [zeusm10]
+
+%D mb [MathBeta] [Charter-Roman] [bchr8r] XXX
+%D mc [MathGamma] [Euler-Fraktur] [eufm10] XXX
+%D
+%D The inclusion of Bitstream Charter was originally for the text accents.
+%D Obviously, it's not a proper ``MathBeta'' font.
+
+%D The varrho and varsigma characters don't exist in eulervm,
+%D so we point at the normal types.
+
+\definefamilysynonym [eul] [calligraphic] [sy]
+\definefamilysynonym [eul] [oldstyle] [mi]
+\definefamilysynonym [eul] [gothic] [mi]
+\definefamilysynonym [eul] [fraktur] [mi]
+
+\definefamilysynonym [eul] [lcgreek] [mr]
+\definefamilysynonym [eul] [ucgreek] [mr]
+\definefamilysynonym [eul] [vargreek] [mr]
+
+%% Well, you don't know until you try!
+%\definefamilysynonym [eul] [accents] [Serif]
+
+\startmathcollection [eul]
+
+\definemathsymbol [varrho] [nothing] [vargreek] ["1A]
+\definemathsymbol [varsigma] [nothing] [vargreek] ["1B]
+
+%D Changes necessitated by collapsing mr \& mi into one:
+\definemathsymbol [imath] [nothing] [mr] ["7B]
+\definemathsymbol [jmath] [nothing] [mr] ["7C]
+\definemathsymbol [ell] [nothing] [mr] ["60]
+\definemathsymbol [wp] [nothing] [mr] ["7D]
+\definemathsymbol [partial] [nothing] [mr] ["40]
+
+\definemathsymbol [flat] [ord] [mr] ["5B]
+\definemathsymbol [natural] [ord] [mr] ["5C]
+\definemathsymbol [sharp] [ord] [mr] ["5D]
+
+\definemathsymbol [triangleleft] [bin] [mr] ["2F]
+\definemathsymbol [triangleright][bin] [mr] ["2E]
+
+\definemathsymbol [star] [bin] [mr] ["3F]
+
+\definemathsymbol [smile] [rel] [mr] ["5E]
+\definemathsymbol [frown] [rel] [mr] ["5F]
+\definemathsymbol [leftharpoonup] [rel] [mr] ["28]
+\definemathsymbol [leftharpoondown] [rel] [mr] ["29]
+\definemathsymbol [rightharpoonup] [rel] [mr] ["2A]
+\definemathsymbol [rightharpoondown] [rel] [mr] ["2B]
+\definemathsymbol [lhook] [rel] [mr] ["2C]
+\definemathsymbol [rhook] [rel] [mr] ["2D]
+
+\definemathsymbol [mathperiod] [ord] [mr] ["3A]
+\definemathsymbol [textperiod] [punct] [mr] ["3A]
+
+\definemathsymbol [mathcomma] [ord] [mr] ["3B]
+\definemathsymbol [textcomma] [punct] [mr] ["3B]
+
+\definemathsymbol [ldotp] [punct] [mr] ["3A]
+
+% extras from AMS:
+\definemathsymbol [hslash] [ord] [mr] ["80] %beauty over truth
+
+\stopmathcollection
+
+\startmathcollection [eul]
+% Ugh. no way around this to keep it compact in the font defs.
+
+\definemathcharacter [a] [alpha] [mr] ["61]
+\definemathcharacter [b] [alpha] [mr] ["62]
+\definemathcharacter [c] [alpha] [mr] ["63]
+\definemathcharacter [d] [alpha] [mr] ["64]
+\definemathcharacter [e] [alpha] [mr] ["65]
+\definemathcharacter [f] [alpha] [mr] ["66]
+\definemathcharacter [g] [alpha] [mr] ["67]
+\definemathcharacter [h] [alpha] [mr] ["68]
+\definemathcharacter [i] [alpha] [mr] ["69]
+\definemathcharacter [j] [alpha] [mr] ["6A]
+\definemathcharacter [k] [alpha] [mr] ["6B]
+\definemathcharacter [l] [alpha] [mr] ["6C]
+\definemathcharacter [m] [alpha] [mr] ["6D]
+\definemathcharacter [n] [alpha] [mr] ["6E]
+\definemathcharacter [o] [alpha] [mr] ["6F]
+\definemathcharacter [p] [alpha] [mr] ["70]
+\definemathcharacter [q] [alpha] [mr] ["71]
+\definemathcharacter [r] [alpha] [mr] ["72]
+\definemathcharacter [s] [alpha] [mr] ["73]
+\definemathcharacter [t] [alpha] [mr] ["74]
+\definemathcharacter [u] [alpha] [mr] ["75]
+\definemathcharacter [v] [alpha] [mr] ["76]
+\definemathcharacter [w] [alpha] [mr] ["77]
+\definemathcharacter [x] [alpha] [mr] ["78]
+\definemathcharacter [y] [alpha] [mr] ["79]
+\definemathcharacter [z] [alpha] [mr] ["7A]
+
+\definemathcharacter [A] [alpha] [mr] ["41]
+\definemathcharacter [B] [alpha] [mr] ["42]
+\definemathcharacter [C] [alpha] [mr] ["43]
+\definemathcharacter [D] [alpha] [mr] ["44]
+\definemathcharacter [E] [alpha] [mr] ["45]
+\definemathcharacter [F] [alpha] [mr] ["46]
+\definemathcharacter [G] [alpha] [mr] ["47]
+\definemathcharacter [H] [alpha] [mr] ["48]
+\definemathcharacter [I] [alpha] [mr] ["49]
+\definemathcharacter [J] [alpha] [mr] ["4A]
+\definemathcharacter [K] [alpha] [mr] ["4B]
+\definemathcharacter [L] [alpha] [mr] ["4C]
+\definemathcharacter [M] [alpha] [mr] ["4D]
+\definemathcharacter [N] [alpha] [mr] ["4E]
+\definemathcharacter [O] [alpha] [mr] ["4F]
+\definemathcharacter [P] [alpha] [mr] ["50]
+\definemathcharacter [Q] [alpha] [mr] ["51]
+\definemathcharacter [R] [alpha] [mr] ["52]
+\definemathcharacter [S] [alpha] [mr] ["53]
+\definemathcharacter [T] [alpha] [mr] ["54]
+\definemathcharacter [U] [alpha] [mr] ["55]
+\definemathcharacter [V] [alpha] [mr] ["56]
+\definemathcharacter [W] [alpha] [mr] ["57]
+\definemathcharacter [X] [alpha] [mr] ["58]
+\definemathcharacter [Y] [alpha] [mr] ["59]
+\definemathcharacter [Z] [alpha] [mr] ["5A]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathcharacter [!] [close] [sy] ["A1]
+\definemathcharacter [(] [open] [sy] ["A8]
+\definemathcharacter [)] [close] [sy] ["A9]
+\definemathcharacter [+] [bin] [sy] ["AB]
+\definemathcharacter [:] [rel] [sy] ["BA]
+\definemathcharacter [;] [punct] [sy] ["BB]
+\definemathcharacter [=] [rel] [sy] ["BD]
+\definemathcharacter [?] [close] [sy] ["BF]
+\definemathcharacter [91] [open] [sy] ["DB] % [
+\definemathcharacter [93] [close] [sy] ["DD] % ]
+
+\definemathcharacter [,] [punct] [mr] ["3B]
+\definemathcharacter [.] [ord] [mr] ["3A]
+\definemathcharacter [/] [ord] [mr] ["3D]
+\definemathcharacter [<] [rel] [mr] ["3C]
+\definemathcharacter [>] [rel] [mr] ["3E]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathcharacter [(] [nothing] [sy] ["A8] [ex] ["00]
+\definemathcharacter [)] [nothing] [sy] ["A9] [ex] ["01]
+\definemathcharacter [91] [nothing] [sy] ["DB] [ex] ["02] % [
+\definemathcharacter [93] [nothing] [sy] ["DD] [ex] ["03] % ]
+\definemathcharacter [/] [nothing] [mr] ["3D] [ex] ["0E]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [hbar] [nothing] [mr] ["80]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [ddagger] [bin] [sy] ["7A]
+\definemathsymbol [dagger] [bin] [sy] ["79]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [colon] [punct] [sy] ["BA]
+
+\stopmathcollection
+
+%D This used to be very hackish; it brought in text
+%D accents from the well-matched Bitstream Charter.
+
+%D But now, these characters don't exist. I would prefer to pull
+%D them from the text font, but I don't know how.
+%D Instead, I'm just pointing to null characters!
+
+\startmathcollection [eul]
+
+\definemathsymbol [acute] [accent] [mr] ["90]
+\definemathsymbol [grave] [accent] [mr] ["91]
+\definemathsymbol [ddot] [accent] [mr] ["92]
+\definemathsymbol [tilde] [accent] [mr] ["93]
+\definemathsymbol [bar] [accent] [mr] ["94]
+\definemathsymbol [breve] [accent] [mr] ["95]
+\definemathsymbol [check] [accent] [mr] ["96]
+\definemathsymbol [hat] [accent] [mr] ["97]
+\definemathsymbol [dot] [accent] [mr] ["98]
+%\definemathsymbol [acute] [accent] [accents] ["B4]
+%\definemathsymbol [grave] [accent] [accents] ["1E]
+%\definemathsymbol [ddot] [accent] [accents] ["A8]
+%\definemathsymbol [tilde] [accent] [accents] ["98]
+%\definemathsymbol [bar] [accent] [accents] ["AF]
+%\definemathsymbol [breve] [accent] [accents] ["0B]
+%\definemathsymbol [check] [accent] [accents] ["10]
+%\definemathsymbol [hat] [accent] [accents] ["5E]
+%\definemathsymbol [dot] [accent] [accents] ["01]
+
+\definemathsymbol [vec] [accent] [mr] ["7E] % [ord]
+\definemathsymbol [hat] [accent] [sy] ["DE]
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [lgroup] [open] [sy] ["A8] [ex] ["3A] % ?
+\definemathsymbol [rgroup] [close] [sy] ["A9] [ex] ["3B] % ?
+
+\stopmathcollection
+
+\startmathcollection [eul]
+
+\definemathsymbol [dag] [box] [sy] ["79]
+\definemathsymbol [ddag] [box] [sy] ["7A]
+\definemathsymbol [S] [box] [sy] ["78]
+\definemathsymbol [P] [box] [sy] ["7B]
+
+\stopmathcollection
+
+%D Aditya's additionl definitions:
+
+\startmathcollection[eul:texnansi]
+ \definemathsymbol [acute] [accent] [tf] ["13]
+ \definemathsymbol [grave] [accent] [tf] ["12]
+ \definemathsymbol [ddot] [accent] [tf] ["A8]
+ \definemathsymbol [tilde] [accent] [tf] ["98]
+ \definemathsymbol [bar] [accent] [tf] ["16]
+ \definemathsymbol [breve] [accent] [tf] ["15]
+ \definemathsymbol [check] [accent] [tf] ["14]
+ \definemathsymbol [hat] [accent] [tf] ["88]
+ \definemathsymbol [dot] [accent] [tf] ["5]
+ % Why is mathring not defined??
+ \definemathsymbol [mathring] [accent] [tf] ["17]
+\stopmathcollection
+
+\startmathcollection[eul:ec]
+ \definemathsymbol [acute] [accent] [tf] ["1]
+ \definemathsymbol [grave] [accent] [tf] ["0]
+ \definemathsymbol [ddot] [accent] [tf] ["4]
+ \definemathsymbol [tilde] [accent] [tf] ["3]
+ \definemathsymbol [bar] [accent] [tf] ["9]
+ \definemathsymbol [breve] [accent] [tf] ["8]
+ \definemathsymbol [check] [accent] [tf] ["7]
+ \definemathsymbol [hat] [accent] [tf] ["2]
+ \definemathsymbol [dot] [accent] [tf] ["A]
+ % Why is mathring not defined??
+ \definemathsymbol [mathring] [accent] [tf] ["6]
+\stopmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-ext.lua b/tex/context/base/math-ext.lua
new file mode 100644
index 000000000..673103677
--- /dev/null
+++ b/tex/context/base/math-ext.lua
@@ -0,0 +1,154 @@
+if not modules then modules = { } end modules ['math-ext'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_virtual = false trackers.register("math.virtual", function(v) trace_virtual = v end)
+
+mathematics = mathematics or { }
+characters = characters or { }
+
+mathematics.extras = mathematics.extras or { }
+characters.math = characters.math or { }
+
+local chardata = characters.data
+local mathdata = characters.math
+
+function mathematics.extras.add(unicode,t)
+ local min, max = mathematics.extrabase, mathematics.privatebase - 1
+ if unicode >= min and unicode <= max then
+ mathdata[unicode], chardata[unicode] = t, t
+ else
+ logs.report("math extra","extra U+%04X should be in range U+%04X - U+%04X",unicode,min,max)
+ end
+end
+
+function mathematics.extras.copy(tfmdata)
+ local math_parameters = tfmdata.math_parameters
+ local MathConstants = tfmdata.MathConstants
+ if (math_parameters and next(math_parameters)) or (MathConstants and next(MathConstants)) then
+ local characters = tfmdata.characters
+ for unicode, extradesc in next, mathdata do
+ -- always, because in an intermediate step we can have a non math font
+ local extrachar = characters[unicode]
+ local nextinsize = extradesc.nextinsize
+ if nextinsize then
+ for i=1,#nextinsize do
+ local nextslot = nextinsize[i]
+ local nextbase = characters[nextslot]
+ if nextbase then
+ local nextnext = nextbase and nextbase.next
+ if nextnext then
+ local nextchar = characters[nextnext]
+ if nextchar then
+ if trace_virtual then
+ logs.report("math extra","extra U+%04X in %s at %s maps on U+%04X (class: %s, name: %s)",unicode,file.basename(tfmdata.fullname),tfmdata.size,nextslot,extradesc.mathclass or "?",extradesc.mathname or "?")
+ end
+ characters[unicode] = nextchar
+ break
+ end
+ end
+ end
+ end
+ if not characters[unicode] then
+ for i=1,#nextinsize do
+ local nextbase = characters[nextinsize[i]]
+ if nextbase then
+ characters[unicode] = nextchar
+ break
+ end
+ end
+ end
+ end
+ end
+ else
+ -- let's not waste time on non-math
+ end
+end
+
+table.insert(fonts.tfm.mathactions,mathematics.extras.copy)
+
+-- 0xFE302 -- 0xFE320 for accents
+
+mathematics.extras.add(0xFE302, {
+ category="mn",
+ description="WIDE MATHEMATICAL HAT",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="accent",
+ mathname="widehat",
+ mathstretch="h",
+ unicodeslot=0xFE302,
+ nextinsize={ 0x00302, 0x0005E },
+} )
+
+mathematics.extras.add(0xFE303, {
+ category="mn",
+ cjkwd="a",
+ description="WIDE MATHEMATICAL TILDE",
+ direction="nsm",
+ linebreak="cm",
+ mathclass="accent",
+ mathname="widetilde",
+ mathstretch="h",
+ unicodeslot=0xFE303,
+ nextinsize={ 0x00303, 0x0007E },
+} )
+
+-- 0xFE321 -- 0xFE340 for missing characters
+
+mathematics.extras.add(0xFE321, {
+ category="sm",
+ description="MATHEMATICAL SHORT BAR",
+-- direction="on",
+-- linebreak="nu",
+ mathclass="relation",
+ mathname="mapstochar",
+ unicodeslot=0xFE321,
+} )
+
+mathematics.extras.add(0xFE322, {
+ category="sm",
+ description="MATHEMATICAL LEFT HOOK",
+ mathclass="relation",
+ mathname="lhook",
+ unicodeslot=0xFE322,
+} )
+
+mathematics.extras.add(0xFE323, {
+ category="sm",
+ description="MATHEMATICAL RIGHT HOOK",
+ mathclass="relation",
+ mathname="rhook",
+ unicodeslot=0xFE323,
+} )
+
+--~ mathematics.extras.add(0xFE304, {
+--~ category="sm",
+--~ description="TOP AND BOTTOM PARENTHESES",
+--~ direction="on",
+--~ linebreak="al",
+--~ mathclass="doubleaccent",
+--~ mathname="doubleparent",
+--~ unicodeslot=0xFE304,
+--~ accents={ 0x023DC, 0x023DD },
+--~ } )
+
+--~ mathematics.extras.add(0xFE305, {
+--~ category="sm",
+--~ description="TOP AND BOTTOM BRACES",
+--~ direction="on",
+--~ linebreak="al",
+--~ mathclass="doubleaccent",
+--~ mathname="doublebrace",
+--~ unicodeslot=0xFE305,
+--~ accents={ 0x023DE, 0x023DF },
+--~ } )
+
+--~ \Umathchardef\braceld="0 "1 "FF07A
+--~ \Umathchardef\bracerd="0 "1 "FF07B
+--~ \Umathchardef\bracelu="0 "1 "FF07C
+--~ \Umathchardef\braceru="0 "1 "FF07D
diff --git a/tex/context/base/math-for.mkiv b/tex/context/base/math-for.mkiv
new file mode 100644
index 000000000..e33276d53
--- /dev/null
+++ b/tex/context/base/math-for.mkiv
@@ -0,0 +1,79 @@
+%D \module
+%D [ file=strc-mat,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Math Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Math Formulas}
+
+%D This module only provides the code for defining formulas and
+%D fetching parameters. The action takes place later.
+
+\unprotect
+
+\let\currentformula\s!unknown
+
+\def\formulaparameter #1{\csname\doformulaparameter{\??fm\currentformula}#1\endcsname}
+\def\formulaparameterhash#1{\doformulaparameterhash {\??fm\currentformula}#1}
+
+\def\doformulaparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doformulaparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\doformulaparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doformulaparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\detokenizedformulaparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??fm\currentformula#1\endcsname}}
+
+\def\doformulaparentparameter #1#2{\ifx#1\relax\s!empty\else\doformulaparameter #1#2\fi}
+\def\doformulaparentparameterhash#1#2{\ifx#1\relax \else\doformulaparameterhash#1#2\fi}
+
+\def\dosetformulaattributes#1#2% style color
+ {\edef\fontattributehash {\formulaparameterhash#1}%
+ \edef\colorattributehash{\formulaparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\def\getformulaparameters{\getparameters[\??fm]}
+
+%D \macros
+%D {setupformulas}
+
+\newtoks \everysetupformulas
+
+\unexpanded\def\setupformulas
+ {\dodoubleempty\dosetupformulas}
+
+\def\dosetupformulas[#1][#2]%
+ {\ifsecondargument
+ \edef\currentformula{#1}%
+ \getparameters[\??fm#1][#2]%
+ \else
+% \let\currentformula\v!formula % hm
+ \let\currentformula\empty
+ \getparameters[\??fm][#1]%
+ \fi
+ \the\everysetupformulas
+ \let\currentformula\empty}
+
+%D Not yet cleanup up:
+
+%D \macros
+%D {setuptextformulas}
+%D
+%D This command sets up in||line math. Most features deals
+%D with grid snapping and are experimental.
+
+\newtoks \everysetuptextformulas
+
+\unexpanded\def\setuptextformulas
+ {\dosingleempty\dosetuptextformulas}
+
+\def\dosetuptextformulas[#1]%
+ {\getparameters[\??mt][#1]%
+ \the\everysetuptextformulas}
+
+\protect \endinput
diff --git a/tex/context/base/math-fou.mkii b/tex/context/base/math-fou.mkii
new file mode 100644
index 000000000..8a72f1288
--- /dev/null
+++ b/tex/context/base/math-fou.mkii
@@ -0,0 +1,196 @@
+%D \module
+%D [ file=math-fou,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Fourier Specials,
+%D author={Michel Biovani \& 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.
+
+% see end of file for todo
+
+\unprotect
+
+\startmathcollection [fou]
+
+ \definemathsymbol [Gamma] [alpha] [mi] ["00]
+ \definemathsymbol [Delta] [alpha] [mi] ["01]
+ \definemathsymbol [Theta] [alpha] [mi] ["02]
+ \definemathsymbol [Lambda] [alpha] [mi] ["03]
+ \definemathsymbol [Xi] [alpha] [mi] ["04]
+ \definemathsymbol [Pi] [alpha] [mi] ["05]
+ \definemathsymbol [Sigma] [alpha] [mi] ["06]
+ \definemathsymbol [Upsilon] [alpha] [mi] ["07]
+ \definemathsymbol [Phi] [alpha] [mi] ["08]
+ \definemathsymbol [Psi] [alpha] [mi] ["09]
+ \definemathsymbol [Omega] [alpha] [mi] ["0A]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathcharacter [+] [bin] [sy] ["80]
+ \definemathcharacter [=] [rel] [sy] ["81]
+ \definemathcharacter [<] [rel] [sy] ["82]
+ \definemathcharacter [>] [rel] [sy] ["83]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathsymbol [leqslant] [rel] [sy] ["84]
+ \definemathsymbol [geqslant] [rel] [sy] ["85]
+ \definemathsymbol [parallelslant] [rel] [sy] ["86]
+ \definemathsymbol [thething] [ord] [sy] ["87]
+ \definemathsymbol [vDash] [rel] [sy] ["88]
+ \definemathsymbol [blacktriangleleft] [rel] [sy] ["89]
+ \definemathsymbol [blacktriangleright] [rel] [sy] ["8A]
+ \definemathsymbol [nleqslant] [rel] [sy] ["8B]
+ \definemathsymbol [ngeqslant] [rel] [sy] ["8C]
+ \definemathsymbol [parallel] [rel] [sy] ["8D]
+ \definemathsymbol [nparallel] [rel] [sy] ["8E]
+ \definemathsymbol [nparallelslant] [rel] [sy] ["8F]
+ \definemathsymbol [nvDash] [rel] [sy] ["90]
+ \definemathsymbol [intercal] [bin] [sy] ["91]
+ \definemathsymbol [hslash] [ord] [sy] ["92]
+ \definemathsymbol [nexists] [ord] [sy] ["93]
+ \definemathsymbol [varsubsetneq] [rel] [sy] ["93]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathcharacter [(] [nothing] [mr] ["28] [ex] ["A1]
+ \definemathcharacter [)] [nothing] [mr] ["29] [ex] ["A2]
+ \definemathcharacter [91] [nothing] [mr] ["5B] [ex] ["A3] % [
+ \definemathcharacter [93] [nothing] [mr] ["5D] [ex] ["A4] % ]
+ \definemathcharacter [/] [nothing] [mr] ["2F] [ex] ["B1]
+
+ \definemathcharacter [124] [nothing] [sy] ["6A] [ex] ["AF] % |
+ \definemathcharacter [92] [nothing] [sy] ["6E] [ex] ["B2] % \
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathsymbol [Vert] [nothing] [sy] ["6B] [ex] ["B0]
+ \definemathsymbol [vert] [nothing] [sy] ["6A] [ex] ["AF]
+ \definemathsymbol [VERT] [nothing] [sy] ["98] [ex] ["93]
+ \definemathsymbol [Downarrow] [rel] [sy] ["2B] [ex] ["C4]
+ \definemathsymbol [backslash] [nothing] [sy] ["6E] [ex] ["B2]
+ \definemathsymbol [rangle] [close] [sy] ["69] [ex] ["AE]
+ \definemathsymbol [langle] [open] [sy] ["68] [ex] ["AD]
+ \definemathsymbol [rbrace] [close] [sy] ["67] [ex] ["AA]
+ \definemathsymbol [lbrace] [open] [sy] ["66] [ex] ["A9]
+ \definemathsymbol [rceil] [close] [sy] ["65] [ex] ["A8]
+ \definemathsymbol [lceil] [open] [sy] ["64] [ex] ["A7]
+ \definemathsymbol [rfloor] [close] [sy] ["63] [ex] ["A6]
+ \definemathsymbol [lfloor] [open] [sy] ["62] [ex] ["A5]
+ \definemathsymbol [dblbrackleft] [open] [sy] ["99] [ex] ["85]
+ \definemathsymbol [dblbrackright] [close] [sy] ["9A] [ex] ["86]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathsymbol [varkappa] [ord] [mi] ["80] % check this
+ \definemathsymbol [varvarrho] [ord] [mi] ["81] % check this
+ \definemathsymbol [xswordsup] [ord] [sy] ["96]
+ \definemathsymbol [xswordsdown] [ord] [sy] ["97]
+ \definemathsymbol [notowns] [rel] [sy] ["9C]
+ \definemathsymbol [hbar] [ord] [sy] ["9D]
+ \definemathsymbol [smallsetminus] [bin] [sy] ["9E]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathsymbol [notin] [rel] [sy] ["9B]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathsymbol [iintop] [op] [ex] ["CE]
+ \definemathsymbol [iiintop] [op] [ex] ["D0]
+ \definemathsymbol [oiintop] [op] [ex] ["D2]
+ \definemathsymbol [oiiintop] [op] [ex] ["D4]
+ \definemathsymbol [slashintop] [op] [ex] ["D6]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathcommand [iint] {\iintop \nolimits}
+ \definemathcommand [iiint] {\iiintop \nolimits}
+ \definemathcommand [oiint] {\oiintop \nolimits}
+ \definemathcommand [oiiint] {\oiiintop \nolimits}
+ \definemathcommand [slashint] {\slashintop\nolimits}
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathsymbol [acute] [accent] [mr] ["1]
+ \definemathsymbol [grave] [accent] [mr] ["0]
+ \definemathsymbol [ddot] [accent] [mr] ["4]
+ \definemathsymbol [tilde] [accent] [mr] ["3]
+ \definemathsymbol [bar] [accent] [mr] ["9]
+ \definemathsymbol [breve] [accent] [mr] ["8]
+ \definemathsymbol [check] [accent] [mr] ["7]
+ \definemathsymbol [hat] [accent] [mr] ["2]
+ \definemathsymbol [dot] [accent] [mr] ["A]
+ \definemathsymbol [mathring] [accent] [mr] ["6]
+
+\stopmathcollection
+
+\startmathcollection [fou]
+
+ \definemathsymbol [otheralpha] [ord] [mi] ["0B]
+ \definemathsymbol [otherbeta] [ord] [mi] ["0C]
+ \definemathsymbol [othergamma] [ord] [mi] ["0D]
+ \definemathsymbol [otherdelta] [ord] [mi] ["0E]
+ \definemathsymbol [otherepsilon] [ord] [mi] ["0F]
+ \definemathsymbol [otherzeta] [ord] [mi] ["10]
+
+\stopmathcollection
+
+\protect \endinput
+
+% from a mail of Michel B / todo
+
+% \definemathsymbol [acute] [accent] [operators] ["1]
+% \definemathsymbol [grave] [accent] [operators] ["0]
+% \definemathsymbol [ddot] [accent] [operators] ["4]
+% \definemathsymbol [tilde] [accent] [operators] ["3]
+% \definemathsymbol [bar] [accent] [operators] ["9]
+% \definemathsymbol [breve] [accent] [operators] ["8]
+% \definemathsymbol [check] [accent] [operators] ["7]
+% \definemathsymbol [hat] [accent] [operators] ["2]
+% \definemathsymbol [dot] [accent] [operators] ["A]
+% \definemathsymbol [mathring] [accent] [operators] ["6]
+
+% \definemathsymbol [wideparen] [ord] [largesymbols] ["94]
+% \definemathsymbol [widearc] [accent] [largesymbols] ["D8]
+
+% check for definition of \overset (ams)
+
+% \def\FOUwidering#1%
+% {\overset{\smash{\vbox to .2ex{\hbox{$\mathring{}$}}}}{\wideparen{#1}}}
+
+% \startmathcollection [default] % [ams]
+%
+% \definemathcommand [widering] {\FOUwidering}
+%
+% \stopmathcollection
+
+% \definemathsymbol [otheralpha] [ord] [otherletters] ["0B]
+% \definemathsymbol [otherbeta] [ord] [otherletters] ["0C]
+% \definemathsymbol [othergamma] [ord] [otherletters] ["0D]
+% \definemathsymbol [otherdelta] [ord] [otherletters] ["0E]
+% \definemathsymbol [otherepsilon] [ord] [otherletters] ["0F]
+% \definemathsymbol [otherzeta] [ord] [otherletters] ["10]
diff --git a/tex/context/base/math-frc.mkii b/tex/context/base/math-frc.mkii
new file mode 100644
index 000000000..fa319bc4a
--- /dev/null
+++ b/tex/context/base/math-frc.mkii
@@ -0,0 +1,66 @@
+%D \module
+%D [ file=math-frc,
+%D version=2007.07.19,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Fractions,
+%D author={Hans Hagen \& Taco Hoekwater \& Aditya Mahajan},
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Fractions}
+
+\unprotect
+
+\def\exmthfont#1{\symbolicsizedfont#1\plusone{MathExtension}}
+
+\def\domthfrac#1#2#3#4#5#6#7%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox0\hbox{$#1 #6$}%
+ \setbox2\hbox{$#1 #7$}%
+ \dimen0\wd0
+ \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
+ \setbox4\hbox to \dimen0{\exmthfont#2#3\leaders\hbox{#4}\hss#5}%
+ \mathord{\vcenter{{\offinterlineskip
+ \hbox to \dimen0{\hss\box0\hss}%
+ \kern \ht4%
+ \hbox to \dimen0{\hss\copy4\hss}%
+ \kern \ht4%
+ \hbox to \dimen0{\hss\box2\hss}}}}%
+ \endgroup}
+
+\def\domthsqrt#1#2#3#4#5%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox0\hbox{$#1 #5$}%
+ \dimen0=1.05\ht0 \advance\dimen0 1pt \ht0 \dimen0
+ \dimen0=1.05\dp0 \advance\dimen0 1pt \dp0 \dimen0
+ \dimen0\wd0
+ \setbox4\hbox to \dimen0{\exmthfont#2\leaders\hbox{#3}\hfill#4}%
+ \delimitershortfall=0pt
+ \nulldelimiterspace=0pt
+ \setbox2\hbox{$\left\delimiter"0270370 \vrule height\ht0 depth \dp0 width0pt
+ \right.$}%
+ \mathord{\vcenter{\hbox{\copy2
+ \rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
+ \endgroup}
+
+\def\mthfrac#1#2#3#4#5{\mathchoice
+ {\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
+
+\def\mthsqrt#1#2#3{\mathchoice
+ {\domthsqrt\displaystyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\textstyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\scriptstyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\scriptscriptstyle\textface {#1}{#2}{#3}}}
+
+% temp here
+
+\protect \endinput
diff --git a/tex/context/base/math-frc.mkiv b/tex/context/base/math-frc.mkiv
new file mode 100644
index 000000000..2305cec30
--- /dev/null
+++ b/tex/context/base/math-frc.mkiv
@@ -0,0 +1,209 @@
+%D \module
+%D [ file=math-frc,
+%D version=2007.07.19,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Fractions,
+%D author={Hans Hagen \& Taco Hoekwater},
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Fractions}
+
+\unprotect
+
+%D \macros
+%D {frac, xfrac, xxfrac}
+%D
+%D This is another one Tobias asked for. It replaces the
+%D primitive \type {\over}. We also take the opportunity to
+%D handle math style restoring, which makes sure units and
+%D chemicals come out ok.
+%D The \type {\frac} macro kind of replaces the awkward \type
+%D {\over} primitive. Say that we have the following formulas:
+%D
+%D \startbuffer[sample]
+%D test $\frac {1}{2}$ test $$1 + \frac {1}{2} = 1.5$$
+%D test $\xfrac {1}{2}$ test $$1 + \xfrac {1}{2} = 1.5$$
+%D test $\xxfrac{1}{2}$ test $$1 + \xxfrac{1}{2} = 1.5$$
+%D \stopbuffer
+%D
+%D \typebuffer[sample]
+%D
+%D With the most straightforward definitions, we get:
+%D
+%D \startbuffer[code]
+%D \def\dofrac#1#2#3{\relax\mathematics{{{#1{#2}}\over{#1{#3}}}}}
+%D
+%D \def\frac {\dofrac\mathstyle}
+%D \def\xfrac {\dofrac\scriptstyle}
+%D \def\xxfrac{\dofrac\scriptscriptstyle}
+%D \stopbuffer
+%D
+%D \typebuffer[code] \getbuffer[code,sample]
+%D
+%D Since this does not work well, we can try:
+%D
+%D \startbuffer[code]
+%D \def\xfrac #1#2{\hbox{$\dofrac\scriptstyle {#1}{#2}$}}
+%D \def\xxfrac#1#2{\hbox{$\dofrac\scriptscriptstyle{#1}{#2}$}}
+%D \stopbuffer
+%D
+%D \typebuffer[code] \getbuffer[code,sample]
+%D
+%D This for sure looks better than:
+%D
+%D \startbuffer[code]
+%D \def\xfrac #1#2{{\scriptstyle \dofrac\relax{#1}{#2}}}
+%D \def\xxfrac#1#2{{\scriptscriptstyle\dofrac\relax{#1}{#2}}}
+%D \stopbuffer
+%D
+%D \typebuffer[code] \getbuffer[code,sample]
+%D
+%D So we stick to the next definitions (watch the local
+%D overloading of \type {\xfrac}).
+
+% \def\dofrac#1#2#3{\relax\mathematics{{{#1{#2}}\over{#1{#3}}}}}
+
+\def\dofrac#1#2#3{\relax\mathematics{\Ustack{{#1{#2}}\normalover{#1{#3}}}}}
+\def\nofrac #1#2{\relax\mathematics{\Ustack{{#1}\normalover{#2}}}}
+
+% \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=auto, 1=displaystyle, 2=textstyle, 3=scriptstyle, 4=scriptscriptstyle, 5=mathstyle
+
+\unexpanded\def\frac
+ {\ifcase\mathfracmode
+ \expandafter\nofrac
+ \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
+ \let\xfrac\xxfrac
+ \dofrac\scriptstyle{#1}{#2}%
+ \endgroup}
+
+\unexpanded\def\xxfrac#1#2%
+ {\begingroup
+ \dofrac\scriptscriptstyle{#1}{#2}%
+ \endgroup}
+
+%D The \type {xx} variant looks still ugly, so maybe it's
+%D best to say:
+
+\unexpanded\def\xxfrac#1#2%
+ {\begingroup
+ \dofrac\scriptscriptstyle{#1}{\raise.25ex\hbox{$\scriptscriptstyle#2$}}%
+ \endgroup}
+
+%D Something low level for scientific calculator notation:
+
+\unexpanded\def\scinot#1#2%
+ {#1\times10^{#2}}
+
+%D The next macro, \type {\ch}, is \PPCHTEX\ aware. In
+%D formulas one can therefore best use \type {\ch} instead of
+%D \type {\chemical}, especially in fractions.
+
+% let's see who complains ... \mathstyle is now a primitive
+%
+% \unexpanded\def\ch#1%
+% {\ifdefined\@@chemicalletter
+% \dosetsubscripts
+% \mathstyle{\@@chemicalletter{#1}}%
+% \doresetsubscripts
+% \else
+% \mathstyle{\rm#1}%
+% \fi}
+
+% \unexpanded\def\ch#1%
+% {\ifdefined\@@chemicalletter
+% \dosetsubscripts
+% \mathematics{\@@chemicalletter{#1}}%
+% \doresetsubscripts
+% \else
+% \mathematics{\rm#1}%
+% \fi}
+
+%D \macros
+%D {/}
+%D
+%D Just to be sure, we restore the behavior of some typical
+%D math characters.
+
+\bgroup
+
+\catcode`\/=\@@other \global \let\normalforwardslash/
+\catcode`\/=\@@active \doglobal\appendtoks\let/\normalforwardslash\to\everymathematics
+
+\egroup
+
+% to be checked:
+
+\def\exmthfont#1{\symbolicsizedfont#1\plusone{MathExtension}}
+
+\def\domthfrac#1#2#3#4#5#6#7%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox0\hbox{$#1 #6$}%
+ \setbox2\hbox{$#1 #7$}%
+ \dimen0\wd0
+ \ifdim\wd2>\dimen0 \dimen0\wd2 \fi
+ \setbox4\hbox to \dimen0{\exmthfont#2#3\leaders\hbox{#4}\hss#5}%
+ \mathord{\vcenter{{\offinterlineskip
+ \hbox to \dimen0{\hss\box0\hss}%
+ \kern \ht4%
+ \hbox to \dimen0{\hss\copy4\hss}%
+ \kern \ht4%
+ \hbox to \dimen0{\hss\box2\hss}}}}%
+ \endgroup}
+
+\def\domthsqrt#1#2#3#4#5%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox0\hbox{$#1 #5$}%
+ \dimen0=1.05\ht0 \advance\dimen0 1pt \ht0 \dimen0
+ \dimen0=1.05\dp0 \advance\dimen0 1pt \dp0 \dimen0
+ \dimen0\wd0
+ \setbox4\hbox to \dimen0{\exmthfont#2\leaders\hbox{#3}\hfill#4}%
+ \delimitershortfall=0pt
+ \nulldelimiterspace=0pt
+ \setbox2\hbox{$\left\delimiter"0270370 \vrule height\ht0 depth \dp0 width0pt
+ \right.$}%
+ \mathord{\vcenter{\hbox{\copy2
+ \rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
+ \endgroup}
+
+\def\mthfrac#1#2#3#4#5{\mathchoice
+ {\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
+
+\def\mthsqrt#1#2#3{\mathchoice
+ {\domthsqrt\displaystyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\textstyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\scriptstyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\scriptscriptstyle\textface {#1}{#2}{#3}}}
+
+% temp here
+
+\protect \endinput
diff --git a/tex/context/base/math-ini.lua b/tex/context/base/math-ini.lua
new file mode 100644
index 000000000..63d7cad38
--- /dev/null
+++ b/tex/context/base/math-ini.lua
@@ -0,0 +1,340 @@
+if not modules then modules = { } end modules ['math-ext'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- if needed we can use the info here to set up xetex definition files
+-- the "8000 hackery influences direct characters (utf) as indirect \char's
+
+local utf = unicode.utf8
+
+local texsprint, format, utfchar, utfbyte = tex.sprint, string.format, utf.char, utf.byte
+
+local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
+
+mathematics = mathematics or { }
+
+mathematics.extrabase = 0xFE000 -- here we push some virtuals
+mathematics.privatebase = 0xFF000 -- here we push the ex
+
+local families = {
+ tf = 0, it = 1, sl = 2, bf = 3, bi = 4, bs = 5, -- virtual fonts or unicode otf
+}
+
+local classes = {
+ ord = 0, -- mathordcomm mathord
+ op = 1, -- mathopcomm mathop
+ bin = 2, -- mathbincomm mathbin
+ rel = 3, -- mathrelcomm mathrel
+ open = 4, -- mathopencomm mathopen
+ close = 5, -- mathclosecomm mathclose
+ punct = 6, -- mathpunctcomm mathpunct
+ alpha = 7, -- mathalphacomm firstofoneargument
+ accent = 8, -- class 0
+ radical = 9,
+ xaccent = 10, -- class 3
+ topaccent = 11, -- class 0
+ botaccent = 12, -- class 0
+ under = 13,
+ over = 14,
+ delimiter = 15,
+ inner = 0, -- mathinnercomm mathinner
+ nothing = 0, -- mathnothingcomm firstofoneargument
+ choice = 0, -- mathchoicecomm @@mathchoicecomm
+ box = 0, -- mathboxcomm @@mathboxcomm
+ limop = 1, -- mathlimopcomm @@mathlimopcomm
+ nolop = 1, -- mathnolopcomm @@mathnolopcomm
+}
+
+mathematics.families = families
+mathematics.classes = classes
+
+classes.alphabetic = classes.alpha
+classes.unknown = classes.nothing
+classes.default = classes.nothing
+classes.punctuation = classes.punct
+classes.normal = classes.nothing
+classes.opening = classes.open
+classes.closing = classes.close
+classes.binary = classes.bin
+classes.relation = classes.rel
+classes.fence = classes.unknown
+classes.diacritic = classes.accent
+classes.large = classes.op
+classes.variable = classes.alphabetic
+classes.number = classes.alphabetic
+
+-- there will be proper functions soon (and we will move this code in-line)
+-- no need for " in class and family (saves space)
+
+local function delcode(target,family,slot)
+ return format('\\Udelcode%s="%X "%X ',target,family,slot)
+end
+local function mathchar(class,family,slot)
+ return format('\\Umathchar "%X "%X "%X ',class,family,slot)
+end
+local function mathaccent(class,family,slot)
+ return format('\\Umathaccent "%X "%X "%X ',0,family,slot) -- no class
+end
+local function delimiter(class,family,slot)
+ return format('\\Udelimiter "%X "%X "%X ',class,family,slot)
+end
+local function radical(family,slot)
+ return format('\\Uradical "%X "%X ',family,slot)
+end
+local function mathchardef(name,class,family,slot)
+ return format('\\Umathchardef\\%s "%X "%X "%X ',name,class,family,slot)
+end
+local function mathcode(target,class,family,slot)
+ return format('\\Umathcode%s="%X "%X "%X ',target,class,family,slot)
+end
+local function mathtopaccent(class,family,slot)
+ return format('\\Umathaccent "%X "%X "%X ',0,family,slot) -- no class
+end
+local function mathbotaccent(class,family,slot)
+ return format('\\Umathbotaccent "%X "%X "%X ',0,family,slot) -- no class
+end
+local function mathtopdelimiter(class,family,slot)
+ return format('\\Uoverdelimiter "%X "%X ',0,family,slot) -- no class
+end
+local function mathbotdelimiter(class,family,slot)
+ return format('\\Uunderdelimiter "%X "%X ',0,family,slot) -- no class
+end
+
+local escapes = characters.filters.utf.private.escapes
+
+local function setmathsymbol(name,class,family,slot)
+ if class == classes.accent then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathaccent(class,family,slot)))
+ elseif class == classes.topaccent then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathtopaccent(class,family,slot)))
+ elseif class == classes.botaccent then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathbotaccent(class,family,slot)))
+ elseif class == classes.over then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathtopdelimiter(class,family,slot)))
+ elseif class == classes.under then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathbotdelimiter(class,family,slot)))
+ elseif class == classes.open or class == classes.close then
+ texsprint(delcode(slot,family,slot))
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,delimiter(class,family,slot)))
+ elseif class == classes.delimiter then
+ texsprint(delcode(slot,family,slot))
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,delimiter(0,family,slot)))
+ elseif class == classes.radical then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,radical(family,slot)))
+ else
+ -- beware, open/close and other specials should not end up here
+--~ local ch = utfchar(slot)
+--~ if escapes[ch] then
+--~ texsprint(format("\\xdef\\%s{\\char%s }",name,slot))
+--~ else
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathchar(class,family,slot)))
+--~ end
+ end
+end
+
+local function setmathcharacter(class,family,slot,unicode,firsttime)
+ if not firsttime and class <= 7 then
+ texsprint(mathcode(slot,class,family,unicode or slot))
+ end
+end
+
+local function setmathsynonym(class,family,slot,unicode,firsttime)
+ if not firsttime and class <= 7 then
+ texsprint(mathcode(slot,class,family,unicode))
+ end
+ if class == classes.open or class == classes.close then
+ texsprint(delcode(slot,family,unicode))
+ end
+end
+
+local function report(class,family,unicode,name)
+ local nametype = type(name)
+ if nametype == "string" then
+ logs.report("mathematics","%s:%s %s U+%05X (%s) => %s",classname,class,family,unicode,utfchar(unicode),name)
+ elseif nametype == "number" then
+ logs.report("mathematics","%s:%s %s U+%05X (%s) => U+%05X",classname,class,family,unicode,utfchar(unicode),name)
+ else
+ logs.report("mathematics","%s:%s %s U+%05X (%s)", classname,class,family,unicode,utfchar(unicode))
+ end
+end
+
+-- there will be a combined \(math)chardef
+
+function mathematics.define(slots,family)
+ family = family or 0
+ family = families[family] or family
+ local data = characters.data
+ for unicode, character in next, data do
+ local symbol = character.mathsymbol
+ if symbol then
+ local other = data[symbol]
+ local class = other.mathclass
+ if class then
+ class = classes[class] or class -- no real checks needed
+ if trace_defining then
+ report(class,family,unicode,symbol)
+ end
+ setmathsynonym(class,family,unicode,symbol)
+ end
+ local spec = other.mathspec
+ if spec then
+ for i, m in next, spec do
+ local class = m.class
+ if class then
+ class = classes[class] or class -- no real checks needed
+ setmathsynonym(class,family,unicode,symbol,i)
+ end
+ end
+ end
+ end
+ local mathclass = character.mathclass
+ local mathspec = character.mathspec
+ if mathspec then
+ for i, m in next, mathspec do
+ local name = m.name
+ local class = m.class
+ if not class then
+ class = mathclass
+ elseif not mathclass then
+ mathclass = class
+ end
+ if class then
+ class = classes[class] or class -- no real checks needed
+ if name then
+ if trace_defining then
+ report(class,family,unicode,name)
+ end
+ setmathsymbol(name,class,family,unicode)
+ -- setmathcharacter(class,family,unicode,unicode,i)
+ else
+ name = class == classes.variable or class == classes.number and character.adobename
+ if name then
+ if trace_defining then
+ report(class,family,unicode,name)
+ end
+ -- setmathcharacter(class,family,unicode,unicode,i)
+ end
+ end
+ setmathcharacter(class,family,unicode,unicode,i)
+ end
+ end
+ end
+ if mathclass then
+ local name = character.mathname
+ local class = classes[mathclass] or mathclass -- no real checks needed
+ if name == false then
+ if trace_defining then
+ report(class,family,unicode,name)
+ end
+ setmathcharacter(class,family,unicode)
+ else
+ name = name or character.contextname
+ if name then
+ if trace_defining then
+ report(class,family,unicode,name)
+ end
+ setmathsymbol(name,class,family,unicode)
+ else
+ if trace_defining then
+ report(class,family,unicode,character.adobename)
+ end
+ end
+ setmathcharacter(class,family,unicode,unicode)
+ end
+ end
+ end
+end
+
+-- needed for mathml analysis
+
+function mathematics.utfmathclass(chr, default)
+ local cd = characters.data[utfbyte(chr)]
+ return (cd and cd.mathclass) or default or "unknown"
+end
+function mathematics.utfmathstretch(chr, default) -- "h", "v", "b", ""
+ local cd = characters.data[utfbyte(chr)]
+ return (cd and cd.mathstretch) or default or ""
+end
+function mathematics.utfmathcommand(chr, default)
+ local cd = characters.data[utfbyte(chr)]
+ local cmd = cd and cd.mathname
+ tex.sprint(cmd or default or "")
+end
+function mathematics.utfmathfiller(chr, default)
+ local cd = characters.data[utfbyte(chr)]
+ local cmd = cd and (cd.mathfiller or cd.mathname)
+ tex.sprint(cmd or default or "")
+end
+
+mathematics.entities = mathematics.entities or { }
+
+function mathematics.register_xml_entities()
+ local entities = xml.entities
+ for name, unicode in next, mathematics.entities do
+ if not entities[name] then
+ entities[name] = utfchar(unicode)
+ end
+ end
+end
+
+-- helpers
+
+function mathematics.big(tfmdata,unicode,n)
+ local t = tfmdata.characters
+ local c = t[unicode]
+ if c then
+ local vv = c.vert_variants or c.next and t[c.next].vert_variants
+ if vv then
+ local vvn = vv[n]
+ return vvn and vvn.glyph or vv[#vv].glyph or unicode
+ else
+ local next = c.next
+ while next do
+ if n <= 1 then
+ return next
+ else
+ n = n - 1
+ local tn = t[next].next
+ if tn then
+ next = tn
+ else
+ return next
+ end
+ end
+ end
+ end
+ end
+ return unicode
+end
+
+-- plugins
+
+local hvars = table.tohash {
+ --~ "RadicalKernBeforeDegree",
+ --~ "RadicalKernAfterDegree",
+}
+
+function mathematics.scaleparameters(t,tfmtable,delta,hdelta,vdelta)
+ local math_parameters = tfmtable.math_parameters
+ if math_parameters and next(math_parameters) then
+ delta = delta or 1
+ hdelta, vdelta = hdelta or delta, vdelta or delta
+ local _, mp = mathematics.dimensions(math_parameters)
+ for name, value in next, mp do
+ if name == "RadicalDegreeBottomRaisePercent" then
+ mp[name] = value
+ elseif hvars[name] then
+ mp[name] = hdelta * value
+ else
+ mp[name] = vdelta * value
+ end
+ end
+ t.MathConstants = mp
+ end
+end
+
+table.insert(fonts.tfm.mathactions,mathematics.scaleparameters)
diff --git a/tex/context/base/math-ini.mkii b/tex/context/base/math-ini.mkii
new file mode 100644
index 000000000..f9dd859c4
--- /dev/null
+++ b/tex/context/base/math-ini.mkii
@@ -0,0 +1,684 @@
+%D \module
+%D [ file=math-ini,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Initializations,
+%D author={Hans Hagen \& Taco Hoekwater},
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Initializations}
+
+% todo: make all definitions global since file loaded only once
+
+%D This module provides namespaces for math fonts, thereby
+%D permitting mixed usage of math fonts. Although not strictly
+%D needed, we also provide a family name mapping mechanism as
+%D used in the (original) AMS math definition files, but here
+%D these names can recursively be remapped and if needed,
+%D dynamically be changed. We've tried to minimize the number
+%D of definition commands and use plain \TEX\ definitions as
+%D fallback. We've tried to follow a couple of conventions
+%D from plain and AMS math in order to achieve backward
+%D compatinility. We also kept an eye on future usage of these
+%D modules in the perspective of MathML and unicode fonts.
+
+\unprotect
+
+\def\@ml@{@ml@} % math list (used for collection)
+\def\@mf@{@mf@} % math family
+%def\@mh@{@mh@} % math handler (not used)
+\def\@mt@{@mt@} % math token
+\def\@mc@{@mc@} % math collection
+
+\def\@@mathlimopcomm#1{\mathop{#1}} %no \limits
+\def\@@mathnolopcomm#1{\mathop{#1}\nolimits}
+\def\@@mathboxcomm #1{\dontleavehmode\hbox{$\mathsurround\zeropoint#1$}}
+
+\chardef\mathordcode = 0 \let\mathordcomm \mathord
+\chardef\mathopcode = 1 \let\mathopcomm \mathop
+\chardef\mathbincode = 2 \let\mathbincomm \mathbin
+\chardef\mathrelcode = 3 \let\mathrelcomm \mathrel
+\chardef\mathopencode = 4 \let\mathopencomm \mathopen
+\chardef\mathclosecode = 5 \let\mathclosecomm \mathclose
+\chardef\mathpunctcode = 6 \let\mathpunctcomm \mathpunct
+\chardef\mathalphacode = 7 \let\mathalphacomm \firstofoneargument
+\chardef\mathinnercode = 0 \let\mathinnercomm \mathinner
+\chardef\mathnothingcode= 0 \let\mathnothingcomm \firstofoneargument
+\chardef\mathlimopcode = 1 \let\mathlimopcomm \@@mathlimopcomm
+\chardef\mathnolopcode = 1 \let\mathnolopcomm \@@mathnolopcomm
+\chardef\mathchoicecode = 0 \let\mathchoicecomm \@@mathchoicecomm
+\chardef\mathboxcode = 0 \let\mathboxcomm \@@mathboxcomm
+
+\chardef\mathaccentcode = 8
+\chardef\mathradicalcode= 9
+
+\def\@@mathchoicecomm#1{[todo #1]}
+
+\def\puremathcode#1{\the\csname math#1code\endcsname}
+\def\puremathcomm#1{\csname math#1comm\endcsname}
+
+\newif\iftracemathcollection
+
+% Simple variant:
+%
+% \def\dohandlemathtoken#1%
+% {\csname\@mt@
+% \ifcsname\@mt@\mathcollection#1\endcsname
+% \mathcollection
+% \else\ifcsname\@mt@\nomathcollection#1\endcsname
+% \nomathcollection
+% \fi\fi
+% #1\endcsname}
+
+%D Because a command can have a different meaning in math
+%D and in text mode, we provide a selector. We also provide
+%D the pure alternatives as \type {\mathcharacter} and \type
+%D {\textcharacter}.
+
+% \ifx\dohandlecommand\undefined \wait \fi % troubles ! but not in mkiv so ...
+
+\let\mathcharacter\dohandlemathtoken
+\let\textcharacter\dohandlecommand % better \dohandletexttoken
+
+% More clever layout:
+%
+% \def\dohandlemathtoken#1%
+% {\csname
+% \ifmmode
+% \ifcsname\@mt@\mathcollection#1\endcsname
+% \@mt@\mathcollection
+% \else\ifcsname\@mt@\nomathcollection#1\endcsname
+% \@mt@\nomathcollection
+% \else\ifcsname\characterencoding#1\endcsname
+% \characterencoding
+% \else
+% \nocharacterencoding
+% \fi\fi\fi
+% \else
+% \ifcsname\characterencoding#1\endcsname
+% \characterencoding
+% \else
+% \nocharacterencoding
+% \fi
+% \fi
+% #1\endcsname}
+%
+% fallback to math when in text mode (handy for unicode vectors)
+
+\def\dohandlemathtoken#1%
+ {\csname
+ \ifmmode
+ \ifcsname\@mt@\mathcollection#1\endcsname
+ \@mt@\mathcollection
+ \else\ifcsname\@mt@\nomathcollection#1\endcsname
+ \@mt@\nomathcollection
+ \else\ifcsname\characterencoding#1\endcsname
+ \characterencoding
+ \else
+ \nocharacterencoding
+ \fi\fi\fi
+ \else
+ \ifcsname\characterencoding#1\endcsname
+ \characterencoding
+ \else\ifcsname\nocharacterencoding#1\endcsname
+ \nocharacterencoding
+ \else\ifcsname\@mt@\mathcollection#1\endcsname
+ \strippedcsname\mathematics\expandafter\endcsname\csname\@mt@\mathcollection
+ \else\ifcsname\@mt@\nomathcollection#1\endcsname
+ \strippedcsname\mathematics\expandafter\endcsname\csname\@mt@\nomathcollection
+ \else
+ \nocharacterencoding
+ \fi\fi\fi\fi
+ \fi
+ #1\endcsname}
+
+%D Now we redefine the text encoding handler.
+
+%D A better fallback:
+
+% Just ETEX which is the default nowadays.
+
+\def\dohandlemathtoken#1%
+ {\csname
+ \ifmmode
+ \ifcsname\@mt@\mathcollection:\outerencoding#1\endcsname
+ \@mt@\mathcollection:\outerencoding
+ \else\ifcsname\@mt@\mathcollection#1\endcsname
+ \@mt@\mathcollection
+ \else\ifcsname\@mt@\nomathcollection#1\endcsname
+ \@mt@\nomathcollection
+ \else\ifcsname\characterencoding#1\endcsname
+ \characterencoding
+ \else
+ \nocharacterencoding
+ \fi\fi\fi\fi
+ \else
+ \ifcsname\characterencoding#1\endcsname
+ \characterencoding
+ \else\ifcsname\nocharacterencoding#1\endcsname
+ \nocharacterencoding
+ \else\ifcsname\@mt@\mathcollection:\outerencoding#1\endcsname
+ \@mt@\mathcollection:\outerencoding
+ \else\ifcsname\@mt@\mathcollection#1\endcsname
+ \strippedcsname\mathematics\expandafter\endcsname\csname\@mt@\mathcollection
+ \else\ifcsname\@mt@\nomathcollection#1\endcsname
+ \strippedcsname\mathematics\expandafter\endcsname\csname\@mt@\nomathcollection
+ \else
+ \nocharacterencoding
+ \fi\fi\fi\fi\fi
+ \fi
+ #1\endcsname}
+
+\let\dohandlecommand\dohandlemathtoken
+
+\def\definefamilysynonym
+ {\dotripleempty\dodefinefamilysynonym}
+
+\def\dodefinefamilysynonym[#1][#2][#3]% [mathcollection] [] []
+ {\ifthirdargument
+ \setvalue{\@mf@#1#2}{#3}%
+ \else
+ \setvalue{\@mf@ #1}{#2}%
+ \fi}
+
+\let\mathsubfamily\empty
+
+\def\purefamily #1{\csname \truefamily{#1}\mathsubfamily\s!fam\endcsname}
+\def\purefamilyhex#1{\csname hex\truefamily{#1}\mathsubfamily\s!fam\endcsname}
+
+\def\truefamily#1%
+ {\ifcsname\@mf@\mathcollection#1\endcsname
+ \@EA\truefamily\csname\@mf@\mathcollection#1\endcsname
+ \else\ifcsname\@mf@#1\endcsname
+ \@EA\truefamily\csname\@mf@#1\endcsname
+ \else\ifcsname\@mf@\nomathcollection#1\endcsname
+ \@EA\truefamily\csname\@mf@\nomathcollection#1\endcsname
+ \else
+ #1%
+ \fi\fi\fi}
+
+\newif\ifdynamicmathfamilies \dynamicmathfamiliestrue % true per 2003.11.25; needed for mixed bold math
+
+\let\normalpurefamilyhex\purefamilyhex
+
+% todo: reset collection (tok legen) en opnieuw laden met true
+
+\def\definemathsymbol
+ {\dosixtupleempty\dodefinemathsymbol}
+
+\def\dodefinemathsymbol[#1][#2][#3][#4][#5][#6]%
+ {\unexpanded\setgvalue{#1}{\dohandlemathtoken{#1}}%
+ \ifdynamicmathfamilies \let\purefamilyhex\relax \fi
+ \setevalue{\@mt@\mathcollection#1}%
+ {\ifsixthargument
+ \ifnum\puremathcode{#2}=\mathradicalcode
+ \radical"%
+ \else
+ \delimiter"%
+ \ifnum\puremathcode{#2}>7 0\else\puremathcode{#2}\fi
+ \fi
+ \purefamilyhex{#3}\uchexnumbers{#4}%
+ \purefamilyhex{#5}\uchexnumbers{#6}\space
+ \else\iffourthargument
+ \ifnum\puremathcode{#2}=\mathaccentcode
+ \mathaccent\else\mathchar
+ \fi
+ "\ifnum\puremathcode{#2}>7 0\else\puremathcode{#2}\fi
+ \purefamilyhex{#3}\uchexnumbers{#4}\space
+ \fi\fi}%
+ \let\purefamilyhex\normalpurefamilyhex
+ \tracemathsymbol{#1}}
+
+\def\tracemathsymbol#1%
+ {\iftracemathcollection
+ {\endgraf
+ \hbox{\tex{#1}~:~{\mathematics{\getvalue{#1}{}}}}
+ \endgraf}%
+ \fi}
+
+\def\definemathcharacter
+ {\dosixtupleempty\dodefinemathcharacter}
+
+% \def\dodefinemathcharacter[#1][#2][#3][#4][#5][#6]%
+% {\setmathtoks
+% \ifdynamicmathfamilies \let\purefamilyhex\relax \fi
+% \doifnumberelse{#1}
+% {\scratchcounter#1}
+% {\scratchcounter\@EA`\string#1}%
+% \appendetoks
+% \ifsixthargument
+% \delcode\the\scratchcounter="%
+% \ifnum\puremathcode{#2}>7 0\else\puremathcode{#2}\fi
+% \purefamilyhex{#3}\uchexnumbers{#4}%
+% \purefamilyhex{#5}\uchexnumbers{#6}\space
+% \else\iffourthargument
+% \mathcode\the\scratchcounter="%
+% \ifnum\puremathcode{#2}>7 0\else\puremathcode{#2}\fi
+% \purefamilyhex{#3}\uchexnumbers{#4}\space
+% \fi\fi\to\mathtoks
+% \let\purefamilyhex\normalpurefamilyhex
+% \tracemathcharacter{#1}}
+
+\newtoks\mathscratchtoks
+
+\def\definemathcharacter
+ {\chardef\mathcharactermode\zerocount
+ \dosixtupleempty\dodefinemathcharacter}
+
+\def\redefinemathcharacter
+ {\chardef\mathcharactermode\plusone
+ \dosixtupleempty\dodefinemathcharacter}
+
+\def\dodefinemathcharacter[#1][#2][#3][#4][#5][#6]%
+ {\ifcase\mathcharactermode
+ \setmathtoks
+ \or
+ \let\mathtoks\mathscratchtoks \mathtoks\emptytoks
+ \fi
+ \ifdynamicmathfamilies \let\purefamilyhex\relax \fi
+ \doifnumberelse{#1}
+ {\scratchcounter#1}
+ {\scratchcounter\@EA`\string#1}%
+ \appendetoks
+ \ifsixthargument
+ \delcode\the\scratchcounter="%
+ \ifnum\puremathcode{#2}>7 0\else\puremathcode{#2}\fi
+ \purefamilyhex{#3}\uchexnumbers{#4}%
+ \purefamilyhex{#5}\uchexnumbers{#6}\space
+ \else\iffourthargument
+ \mathcode\the\scratchcounter="%
+ \ifnum\puremathcode{#2}>7 0\else\puremathcode{#2}\fi
+ \purefamilyhex{#3}\uchexnumbers{#4}\space
+ \fi\fi
+ \to \mathtoks
+ \let\purefamilyhex\normalpurefamilyhex
+ \ifcase\mathcharactermode
+ \expandafter\tracemathcharacter
+ \or
+ \the\mathtoks
+ \mathtoks\emptytoks
+ \expandafter\gobbleoneargument
+ \fi{#1}} % maybe lookahead
+
+\def\tracemathcharacter#1%
+ {\iftracemathcollection
+ {\endgraf
+ \doifnumberelse{#1}
+ {\hbox{\tttf\rawcharacter{#1}~:~{\mathematics{\rawcharacter{#1}}}}}
+ {\hbox{\type{#1}~:~{\mathematics{#1}}}}
+ \endgraf}%
+ \fi}
+
+\def\definemathcommand
+ {\dotripleempty\dodefinemathcommand}
+
+\def\dodefinemathcommand[#1][#2][#3]#4% command class args meaning
+ {\unexpanded\setgvalue{#1}{\dohandlemathtoken{#1}}%
+ \ifthirdargument
+ \processaction
+ [#3]
+ [one=>\setvalue{\@mt@\mathcollection#1}##1{\puremathcomm{#2}{#4{##1}}},
+ two=>\setvalue{\@mt@\mathcollection#1}##1##2{\puremathcomm{#2}{#4{##1}{##2}}}]%
+ \else\ifsecondargument
+ \setvalue{\@mt@\mathcollection#1}{\puremathcomm{#2}{#4}}%
+ \else
+ \setvalue{\@mt@\mathcollection#1}{\puremathcomm{nothing}{#4}}%
+ \fi\fi
+ \tracemathcommand{#1}}
+
+\def\tracemathcommand#1%
+ {\iftracemathcollection
+ \endgraf\hbox{\tex{#1}~:~{\mathematics{\getvalue{#1}{}}}}\endgraf
+ \fi}
+
+\def\startmathcollection[#1]%
+ {\pushmacro\mathcollection
+ \setmathcollection{#1}}
+
+\def\setmathcollection#1%
+ {\edef\mathcollection{#1}%
+ \doifundefined{\@ml@\mathcollection}
+ {\expandafter\newtoks\csname\@ml@\mathcollection\endcsname}}
+
+\def\stopmathcollection
+ {\popmacro\mathcollection}
+
+\def\startrawmathcollection
+ {\startmathcollection}
+
+\def\stoprawmathcollection
+ {\stopmathcollection}
+
+\newtoks\mathtoks
+
+\def\setmathtoks
+ {\@EA\let\@EA\mathtoks\csname\@ml@\mathcollection\endcsname}
+
+\def\currentmathcollection{\mathcollection}
+
+\let\nomathcollection\s!default
+
+\def\enablemathcollection[#1]%
+ {\doifnot{#1}\s!default
+ {\setmathcollection\s!default
+ \the\csname\@ml@\mathcollection\endcsname}%
+ \setmathcollection{#1}%
+ \the\csname\@ml@\mathcollection\endcsname}
+
+% hook 'm into the font mechanism
+
+\definefilesynonym[\f!mathprefix\s!default][\f!mathprefix tex]
+
+\def\usemathcollection
+ {\dodoubleempty\dousemathcollection}
+
+\def\dousemathcollection[#1][#2]%
+ {\pushmacro\fontclass
+ \pushmacro\mathclass
+ \ifsecondargument
+ \edef\fontclass{#1}%
+ \edef\mathclass{#2}%
+ \else
+ \edef\mathclass{#1}%
+ \fi
+ \doinputonce{\truefilename{\f!mathprefix\mathclass}.mkii}%
+ \doifsomething\fontclass{\setevalue{\@mc@\fontclass\@mc@}{\mathclass}}%
+ \popmacro\mathclass
+ \popmacro\fontclass}
+
+\let\mathclass\nomathcollection
+
+\letvalue{\@mc@\@mc@}\nomathcollection
+
+% \def\autoenablemathcollection
+% {\doifdefinedelse{\@mc@\fontclass\@mc@}
+% {\enablemathcollection[\getvalue{\@mc@\fontclass\@mc@}]}
+% {\enablemathcollection[\s!default]}} % ? ? ?
+
+\def\autoenablemathcollection
+ {\expanded{\enablemathcollection[\executeifdefined{\@mc@\fontclass\@mc@}\nomathcollection]}}
+
+\appendtoks\autoenablemathcollection\to\mathstrategies
+
+\fetchruntimecommand \showmathcharacters {\f!mathprefix\s!run.mkii}
+\fetchruntimecommand \showmathtoken {\f!mathprefix\s!run.mkii}
+
+\def\resetmathcollection[#1]%
+ {\def\mathcollection{#1}%
+ \forgetdoingonce{\f!mathprefix\mathcollection.mkii}%
+ \setmathtoks
+ \ifx\mathtoks\relax\else\mathtoks\emptytoks\fi}
+
+%D \macros
+%D {ifmathpunctuation, enablemathpunctuation,
+%D definemathpunctuation}
+%D
+%D This will replace periods by comma's:
+%D
+%D \starttyping
+%D \definemathpunctuation . textcomma textperiod
+%D \definemathpunctuation , textcomma textcomma
+%D
+%D \appendtoks
+%D \redefinemathcharacter [.] [ord] [mi] ["3B]%
+%D \to \everymathpunctuation
+%D \stoptyping
+
+% \newif\ifmathpunctuation
+%
+% \def\enablemathpunctuation{\mathpunctuationtrue}
+%
+% \def\definemathpunctuation #1 #2 #3 %
+% {\appendtoks
+% \initializemathpunctuation{#1}{#2}{#3}%
+% \to\everymathematics}
+%
+% \def\initializemathpunctuation#1#2#3% sloowww
+% {\ifmathpunctuation % hm move this test to everymath, or better a separate token list
+% \mathcode`#1="8000
+% \defineactivecharacter #1 {\dohandlemathpunctuation{#2}{#3}}%
+% \fi}
+%
+% \unexpanded\def\dohandlemathpunctuation#1#2% \if fails in mathml interval
+% {\def\next{\csname\ifx\space\nexttoken#2\else#1\fi\endcsname}%
+% \futurelet\nexttoken\next}
+
+\newtoks\everymathpunctuation
+
+\def\enablemathpunctuation % can be called inside math, so after \everymathematics
+ {\relax
+ \ifmmode
+ \the\everymathpunctuation
+ \fi
+ \appendtoksonce
+ \the\everymathpunctuation
+ \to\everymathematics}
+
+\def\definemathpunctuation #1 #2 #3 %
+ {\appendtoks
+ \initializemathpunctuation{#1}{#2}{#3}%
+ \to\everymathpunctuation}
+
+\def\initializemathpunctuation#1#2#3% sloowww
+ {\mathcode`#1="8000
+ \defineactivecharacter #1 {\dohandlemathpunctuation{#2}{#3}}}
+
+\unexpanded\def\dohandlemathpunctuation#1#2% \if fails in mathml interval
+ {\def\next{\csname\ifx\space\nexttoken#2\else#1\fi\endcsname}%
+ \futurelet\nexttoken\next}
+
+%D \startbuffer
+%D \enablemathpunctuation$(1,2) (1, 2) (1{,}2) \hbox{foo, not bar}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \blank{\getbuffer}\blank
+
+%D needed for sin, cos etc
+
+\def\mfunction #1{{\mr#1}}
+
+% \def\mlimitsfunction #1{\mathlimopcomm{{\mr#1}}
+% \def\mnolimitsfunction#1{\mathnolopcomm{{\mr#1}}
+
+%D Taco posted this solution as response to a mail by Olivier, so
+%D let's integrate it here.
+
+% \def\setmathfunctionstyle#1% rm ss tt
+% {\def\mfunction##1% no families, just scaling a la text
+% {\mathchoice
+% {\hbox{\csname#1\endcsname\tf ##1}}
+% {\hbox{\csname#1\endcsname\tf ##1}}
+% {\hbox{\csname#1\endcsname\tfx ##1}}
+% {\hbox{\csname#1\endcsname\tfxx##1}}}}
+
+\def\currentmscaledstyle{rm} % will be plugged into the typeface text=ss option
+
+\def\setmathfunctionstyle#1% rm ss tt
+ {\doifsomething{#1}
+ {\def\currentmscaledstyle{#1}%
+ \def\mathopnolimits##1{\mathop{\mscaledtext{##1}}\nolimits}%
+ \def\mfunction##1{\mscaledtext{##1}}}}
+
+\def\mscaledtext#1%
+ {\mathchoice
+ {\hbox{\csname\currentmscaledstyle\endcsname\tf #1}}
+ {\hbox{\csname\currentmscaledstyle\endcsname\tf #1}}
+ {\hbox{\csname\currentmscaledstyle\endcsname\tfx #1}}
+ {\hbox{\csname\currentmscaledstyle\endcsname\tfxx#1}}}
+
+%D We can force the way functions are typeset by manipulating the text
+%D option:
+%D
+%D \starttyping
+%D \definetypeface[iwona][ss][sans][iwona][default][encoding=texnansi]
+%D \definetypeface[iwona][mm][math][iwona][default][encoding=texnansi,text=ss]
+%D \stoptyping
+%D
+%D This hooks into the math handler with:
+
+\appendtoks
+ \setmathfunctionstyle\currentmathtextstyle
+\to \everybodyfont
+
+%D Usage:
+%D
+%D \starttyping
+%D \setmathfunctionstyle\fontstyle % or {rm} or {ss} or ..
+%D \rm test $\sin{(x^{\sin(x^{\sin(x)})})}$ test
+%D \ss test $\sin{(x^{\sin(x^{\sin(x)})})}$ test
+%D \tt test $\sin{(x^{\sin(x^{\sin(x)})})}$ test
+%D \stoptyping
+
+\edef\hexmrfam {0} \edef\hexbsfam {8}
+\edef\hexmifam {1} \edef\hexbifam {9}
+\edef\hexsyfam {2} \edef\hexscfam {A}
+\edef\hexexfam {3} \edef\hextffam {B}
+\edef\hexitfam {4} \edef\hexmafam {C}
+\edef\hexslfam {5} \edef\hexmbfam {D}
+\edef\hexbffam {6} \edef\hexmcfam {E}
+\edef\hexnnfam {7} \edef\hexmdfam {F}
+
+\definefamilysynonym [default] [letters] [mr]
+\definefamilysynonym [default] [operators] [sy]
+\definefamilysynonym [default] [lcgreek] [mi]
+\definefamilysynonym [default] [ucgreek] [mr]
+\definefamilysynonym [default] [vargreek] [mi]
+\definefamilysynonym [default] [mitfamily] [mi]
+\definefamilysynonym [default] [calfamily] [sy]
+
+\definefamilysynonym [default] [0] [mr]
+\definefamilysynonym [default] [1] [mi]
+\definefamilysynonym [default] [2] [sy]
+\definefamilysynonym [default] [3] [ex]
+
+\enablemathcollection[default]
+
+\usemathcollection [default] [tex]
+\usemathcollection [default] [ams]
+\usemathcollection [default] [uni]
+
+\enablemathcollection[default]
+
+%D Some goodies:
+
+\def\Angstrom{\nomathematics{\Aring}}
+
+%D Bold math:
+%D
+%D \starttyping
+%D \usetypescript [lucida] [texnansi]
+%D
+%D \definetypeface [boldmath] [rm] [serif]
+%D [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [tt] [mono]
+%D [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [ss] [sans]
+%D [lucida] [default] [encoding=texnansi]
+%D \definetypeface [boldmath] [mm] [boldmath]
+%D [lucida] [default] [encoding=texnansi]
+%D
+%D \switchtobodyfont[lucida,10pt]
+%D
+%D \showmathtoken{Gamma} $\Gamma \Delta \alpha \delta \zeta$
+%D
+%D \switchtobodyfont[boldmath,10pt]
+%D
+%D \showmathtoken{Gamma} $\Gamma \Delta \alpha \delta \zeta$
+%D \stoptyping
+
+%D \macros
+%D {nonknuthmode, donknuthmode}
+%D
+%D The underscore is frequently used in manuals but unfortunately \TEX\ prefers
+%D it to be a math specific character. And since computer modern fonts didn't
+%D have an underscore, one had to use commands to fake one. Nowadays we do
+%D have underscores in latin modern, and since all other fonts have them, we
+%D decided to get away from the restriction to use the underscore character in
+%D text mode.
+%D
+%D \starttyping
+%D \def\test#1{#1}
+%D
+%D \nonknuthmode $x_2$ x_2 \test{$x_2$} \test{x_2}
+%D
+%D \donknuthmode $x_2$ x_2 \test{$x_2$} \test{x_2}
+%D \stoptyping
+%D
+%D The result is as expected: the first line typesets ok, while the second
+%D one triggers an error message.
+
+\bgroup
+
+ \ifx\normalsuber\undefined \def\normalsuber{_} \fi
+ \ifx\normalsuper\undefined \def\normalsuper{^} \fi
+
+ \catcode`_=\active
+ \catcode`^=\active
+
+ \gdef\nonknuthmode
+ {\appendtoks\let_\normalsuber\let^\normalsuper\to\everymathematics
+ \mathcode`_="8000
+ \mathcode`^="8000
+ \catcode`_=\@@other
+ \catcode`^=\@@other
+ \let\nonknuthmode\relax}
+
+ \gdef\donknuthmode
+ {\catcode`_=\@@subscript
+ \catcode`^=\@@superscript}
+
+\egroup
+
+%D \macros
+%D {checkdelimiters, fakeleftdelimiter, fakerightdelimiter}
+%D
+%D Handy for non matching situations (as with mathml):
+%D
+%D \starttyping
+%D \checkdelimiters{... bla bla ...}
+%D \fakeleftdelimiter
+%D ... bla bla ...
+%D \fakerightdelimiter
+%D \stoptyping
+
+\newcount\delimitercount
+
+\def\leftfakedelimiter {\advance\delimitercount\minusone\gobbleoneargument}%
+\def\rightfakedelimiter{\advance\delimitercount\plusone \gobbleoneargument}%
+
+\def\checkdelimiters#1%
+ {\delimitercount\zerocount
+ \setbox\scratchbox\hbox\bgroup
+ \let\left \leftfakedelimiter
+ \let\right\rightfakedelimiter
+ $#1\expandafter$\expandafter
+ \egroup
+ \expandafter\delimitercount\the\delimitercount\relax}
+
+\def\fakeleftdelimiter {\ifnum\delimitercount>\zerocount\left .\fi}
+\def\fakerightdelimiter{\ifnum\delimitercount<\zerocount\right.\fi}
+
+%D Needed for unicode:
+
+\def\nulloperator{\mathortext{\mathop{\null}}{\null}}
+
+%D To be dealt with ...
+
+\mathcode`\ ="8000 % \space
+\mathcode`\'="8000 % ^\prime
+\mathcode`\_="8000 % \_
+
+\protect \endinput
+
+\tracemathcollectiontrue
+ \input math-tex \page
+\setupbodyfont[ams] \enablemathcollection[default] \input math-ams \page
+\setupbodyfont[lbr] \enablemathcollection[lbr] \input math-lbr \page
+\setupbodyfont[eul] \enablemathcollection[eul] \input math-eul \stoptext
diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv
new file mode 100644
index 000000000..828a6eccb
--- /dev/null
+++ b/tex/context/base/math-ini.mkiv
@@ -0,0 +1,657 @@
+%D \module
+%D [ file=math-ini,
+%D version=2008.01.02,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Initializations,
+%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}{ConTeXt Math Macros / Initializations}
+
+%D This module provides namespaces for math fonts, thereby
+%D permitting mixed usage of math fonts. Although not strictly
+%D needed, we also provide a family name mapping mechanism as
+%D used in the (original) AMS math definition files, but here
+%D these names can recursively be remapped and if needed,
+%D dynamically be changed. We've tried to minimize the number
+%D of definition commands and use plain \TEX\ definitions as
+%D fallback. We've tried to follow a couple of conventions
+%D from plain and AMS math in order to achieve backward
+%D compatinility. We also kept an eye on future usage of these
+%D modules in the perspective of MathML and unicode fonts.
+
+\unprotect
+
+\ifx\v!compact\undefined \def\v!compact{compact} \fi
+
+%D New:
+
+\let\startimath\Ustartmath \let\stopimath \Ustopmath
+\let\startdmath\Ustartdisplaymath \let\stopdmath \Ustopmath
+
+%D We move these definitions into the format:
+
+% test [[\char948 \ctxlua{tex.sprint(utf.char(948))}]]
+% test $[[\char948 \ctxlua{tex.sprint(utf.char(948))}]]$
+
+\registerctxluafile{math-ini}{1.001}
+\registerctxluafile{math-dim}{1.001}
+\registerctxluafile{math-ent}{1.001}
+\registerctxluafile{math-ext}{1.001}
+\registerctxluafile{math-vfu}{1.001}
+\registerctxluafile{math-map}{1.001}
+\registerctxluafile{math-noa}{1.001}
+
+\definesystemattribute[mathalphabet] \chardef\mathalphabetattribute \dogetattributeid{mathalphabet}
+\definesystemattribute[mathsize] \chardef\mathsizeattribute \dogetattributeid{mathsize}
+\definesystemattribute[mathpunctuation] \chardef\mathpunctuationattribute \dogetattributeid{mathpunctuation}
+\definesystemattribute[mathgreek] \chardef\mathgreekattribute \dogetattributeid{mathgreek}
+
+% todo: only in mmode
+
+\unexpanded\def\mathgreekupright{\attribute\mathgreekattribute11 }
+\unexpanded\def\mathgreekitalic {\attribute\mathgreekattribute22 }
+\unexpanded\def\mathgreekdefault{\attribute\mathgreekattribute\attributeunsetvalue}
+
+\let\mathgreeknormal\mathgreekupright
+\let\mathgreeknone \mathgreekdefault
+
+\def\setmathattribute#1#2{\ifmmode\ctxlua{mathematics.sync_a_both ("#1","#2")}\fi}
+\def\setmathalphabet #1{\ifmmode\ctxlua{mathematics.sync_a_name ("#1")}\fi}
+\def\setmathstyle #1{\ifmmode\ctxlua{mathematics.sync_a_style("#1")}\fi}
+
+\unexpanded\def\mr {\setmathattribute{regular}{tf}}
+
+\unexpanded\def\mathdefault {\setmathattribute{regular}{it}}
+\unexpanded\def\mathscript {\setmathalphabet{script}}
+\unexpanded\def\mathfraktur {\setmathalphabet{fraktur}}
+\unexpanded\def\mathblackboard{\setmathalphabet{blackboard}}
+
+\unexpanded\def\mathrm{\setmathattribute{rm}{tf}}
+\unexpanded\def\mathss{\setmathattribute{ss}{tf}}
+\unexpanded\def\mathtt{\setmathattribute{tt}{tf}}
+
+\unexpanded\def\mathtf{\setmathstyle{tf}}
+\unexpanded\def\mathbf{\setmathstyle{bf}}
+\unexpanded\def\mathsl{\setmathstyle{sl}}
+\unexpanded\def\mathit{\setmathstyle{it}}
+\unexpanded\def\mathbs{\setmathstyle{bs}}
+\unexpanded\def\mathbi{\setmathstyle{bi}}
+
+\let\tfmath\mathtf % maybe a grouped command
+\let\bfmath\mathbf
+\let\slmath\mathsl
+\let\itmath\mathit
+\let\bsmath\mathbs
+\let\bimath\mathbi
+
+\let\Bbb\mathblackboard
+
+\unexpanded\def\frak {\ifmmode\expandafter\mathfraktur \fi}
+\unexpanded\def\cal {\ifmmode\expandafter\mathscript \fi}
+\unexpanded\def\bbd {\ifmmode\expandafter\mathblackboard\fi}
+\unexpanded\def\blackboard{\ifmmode\expandafter\mathblackboard\fi}
+\unexpanded\def\fraktur {\ifmmode\expandafter\mathfraktur \fi}
+\unexpanded\def\gothic {\ifmmode\expandafter\mathfraktur \fi}
+
+\unexpanded\def\mathcal #1{{\mathscript #1}} % for AMS compatibility
+\unexpanded\def\mathfrak#1{{\mathfraktur #1}} % for AMS compatibility
+\unexpanded\def\mathbb #1{{\mathblackboard#1}} % for AMS compatibility
+
+\let\normalmr\mr
+
+% \prependtoks
+% \let\mr\normalmr
+% \let\rm\mathrm \let\ss\mathss \let\tt\mathtt
+% \let\tf\mathtf \let\bf\mathbf \let\it\mathit \let\sl\mathsl \let\bi\mathbi \let\bs\mathbs
+% \let\frak\mathfraktur \let\cal\mathscript \let\bbd\mathblackboard
+% \mathdefault
+% \to \everymathematics
+
+\let\normaltf\tf \unexpanded\def\tf{\ifmmode\mathtf\else\normaltf\fi}
+\let\normalbf\bf \unexpanded\def\bf{\ifmmode\mathbf\else\normalbf\fi}
+\let\normalit\it \unexpanded\def\it{\ifmmode\mathit\else\normalit\fi}
+\let\normalsl\sl \unexpanded\def\sl{\ifmmode\mathsl\else\normalsl\fi}
+\let\normalbi\bi \unexpanded\def\bi{\ifmmode\mathbi\else\normalbi\fi}
+\let\normalbs\bs \unexpanded\def\bs{\ifmmode\mathbs\else\normalbs\fi}
+
+\let\normalrm\rm \unexpanded\def\rm{\ifmmode\mathrm\else\normalrm\fi}
+\let\normalss\ss \unexpanded\def\ss{\ifmmode\mathss\else\normalss\fi}
+\let\normaltt\tt \unexpanded\def\tt{\ifmmode\mathtt\else\normaltt\fi}
+ \unexpanded\def\mr{\ifmmode \normalmr\fi}
+
+\prependtoks
+% \let\mr\normalmr
+% \let\rm\mathrm \let\ss\mathss \let\tt\mathtt
+% \let\tf\mathtf \let\bf\mathbf \let\it\mathit \let\sl\mathsl \let\bi\mathbi \let\bs\mathbs
+% \let\frak\mathfraktur \let\cal\mathscript \let\bbd\mathblackboard
+ \mathdefault
+\to \everymathematics
+
+%D \macros
+%D {boldsymbol}
+%D
+%D To be done.
+
+\let\mathboldsymbol\relax % yet unsupported, will be
+
+\def\boldsymbol
+ {\mathortext\mathboldsymbol\bold}
+
+%D Helpers:
+
+\def\utfmathclass #1{\ctxlua{tex.sprint(mathematics.utfmathclass ("#1"))}}
+\def\utfmathstretch#1{\ctxlua{tex.sprint(mathematics.utfmathstretch("#1"))}}
+\def\utfmathcommand#1{\ctxlua{tex.sprint(mathematics.utfmathcommand("#1"))}}
+\def\utfmathfiller #1{\ctxlua{tex.sprint(mathematics.utfmathfiller ("#1"))}}
+
+% \def\utfmathclassdefault #1#2{\ctxlua{
+% tex.sprint(mathematics.utfmathclass("#1","#2"))
+% }}
+%
+% \def\utfmathcommanddefault#1#2#3{\ctxlua{
+% local cmd = mathematics.utfmathcommand("#1","") or ""
+% if cmd == "" then
+% commands.cs("#2","#3")
+% else
+% commands.cs(cmd)
+% end}}
+
+% % %
+
+\def\@@mathlimopcomm #1{\mathop{#1}} %no \limits
+\def\@@mathnolopcomm #1{\mathop{#1}\nolimits}
+\def\@@mathboxcomm #1{\dontleavehmode\hbox\Ustartmath\mathsurround\zeropoint#1\Ustopmath}
+\def\@@mathchoicecomm#1{[todo #1]}
+
+\chardef\mathordcode = 0 \let\mathordcomm \mathord
+\chardef\mathopcode = 1 \let\mathopcomm \mathop
+\chardef\mathbincode = 2 \let\mathbincomm \mathbin
+\chardef\mathrelcode = 3 \let\mathrelcomm \mathrel
+\chardef\mathopencode = 4 \let\mathopencomm \mathopen
+\chardef\mathclosecode = 5 \let\mathclosecomm \mathclose
+\chardef\mathpunctcode = 6 \let\mathpunctcomm \mathpunct
+\chardef\mathalphacode = 7 \let\mathalphacomm \firstofoneargument
+\chardef\mathinnercode = 0 \let\mathinnercomm \mathinner
+\chardef\mathnothingcode= 0 \let\mathnothingcomm \firstofoneargument
+\chardef\mathlimopcode = 1 \let\mathlimopcomm \@@mathlimopcomm
+\chardef\mathnolopcode = 1 \let\mathnolopcomm \@@mathnolopcomm
+\chardef\mathchoicecode = 0 \let\mathchoicecomm \@@mathchoicecomm
+\chardef\mathboxcode = 0 \let\mathboxcomm \@@mathboxcomm
+
+\chardef\mathaccentcode = 8
+\chardef\mathradicalcode= 9
+
+\def\puremathcode#1{\the\csname math#1code\endcsname}
+\def\puremathcomm#1{\csname math#1comm\endcsname}
+
+% \startlines
+% $\mathopnolimits{\rm d}x$
+% $\mathopnolimits{\kern\zeropoint \rm d}x$
+% $\puremathcomm{nolop}{\rm d}x$
+% $\puremathcomm{nolop}{\kern\zeropoint\rm d}x$
+% \blank
+% $\puremathcomm{nolop}{\mr d}x$
+% $\puremathcomm{nolop}{\kern\zeropoint\mr d}x$
+% $\mathop{\kern\zeropoint\mr d}x$
+% $\mathopnolimits{\kern\zeropoint d}x$
+% \stoplines
+
+% this will be sorted out:
+
+\let\mathcharacter \getvalue
+\let\textcharacter \getvalue
+\unexpanded\def\definefamilysynonym {\dotripleempty\dodefinefamilysynonym}
+\def\dodefinefamilysynonym [#1][#2][#3]{}
+\unexpanded\def\definemathsymbol {\dosixtupleempty\dodefinemathsymbol}
+\def\dodefinemathsymbol [#1][#2][#3][#4][#5][#6]{}
+\unexpanded\def\definemathcharacter {\dosixtupleempty\dodefinemathcharacter}
+\def\dodefinemathcharacter [#1][#2][#3][#4][#5][#6]{}
+
+\unexpanded\def\definemathcommand
+ {\dotripleempty\dodefinemathcommand}
+
+\def\dodefinemathcommand[#1][#2][#3]#4% command class args meaning
+ {\ifthirdargument
+ \processaction
+ [#3]
+ [one=>\setuvalue{#1}##1{\puremathcomm{#2}{#4{##1}}},
+ two=>\setuvalue{#1}##1##2{\puremathcomm{#2}{#4{##1}{##2}}}]%
+ \else\ifsecondargument
+ \setuvalue{#1}{\puremathcomm{#2}{#4}}%
+ \else
+ \setuvalue{#1}{\puremathcomm{nothing}{#4}}%
+ \fi\fi}
+
+%D Moved from font-ini.mkiv:
+%D
+%D \macros
+%D {mf,mbox,enablembox,mathop}
+%D
+%D Todo:
+
+\unexpanded\def\mf
+ {\csname\fontalternative\endcsname}
+
+\let\normalmathop\mathop
+
+\unexpanded\def\mathop
+ {\normalmathop
+ \bgroup
+ \let\rm\mf
+ \let\next=}
+
+\def\normalmbox
+ {\normalhbox\bgroup\mf
+ \dowithnextbox{\flushnextbox\egroup}\normalhbox}
+
+\def\mbox
+ {\ifmmode\normalmbox\else\normalhbox\fi}
+
+\def\enablembox
+ {\appendtoks
+ \ifx\normalhbox\undefined\let\normalhbox\hbox\fi
+ \let\hbox\mbox
+ \to\everymathematics}
+
+%D needed for sin, cos etc
+
+\let\mathfunction\firstofoneargument
+
+\def\mfunction #1{{\mr#1}}
+\def\mfunctionlabeltext#1{{\mr\mathlabeltext{#1}}}
+
+% \def\mlimitsfunction #1{\mathlimopcomm{{\mr#1}}
+% \def\mnolimitsfunction#1{\mathnolopcomm{{\mr#1}}
+
+%D Taco posted this solution as response to a mail by Olivier, so
+%D let's integrate it here.
+
+\def\currentmscaledstyle{rm} % will be plugged into the typeface text=ss option
+
+\unexpanded\def\do@mathopnolimits #1{\mathop{\mscaledtext{#1}}\nolimits}
+\unexpanded\def\do@mfunction #1{\mscaledtext{#1}}
+\unexpanded\def\do@mfunctionlabeltext#1{\mscaledtext{\mathlabeltext{#1}}}
+
+\def\setmathfunctionstyle#1% rm ss tt (can be made faster if needed)
+ {\doifsomething{#1}
+ {\def\currentmscaledstyle{#1}%
+ \let\mathopnolimits \do@mathopnolimits
+ \let\mfunction \do@mfunction
+ \let\mfunctionlabeltext\do@mfunctionlabeltext}}
+
+\def\mscaledtext#1%
+ {\mathchoice
+ {\hbox{\csname\currentmscaledstyle\endcsname\tf #1}}
+ {\hbox{\csname\currentmscaledstyle\endcsname\tf #1}}
+ {\hbox{\csname\currentmscaledstyle\endcsname\tfx #1}}
+ {\hbox{\csname\currentmscaledstyle\endcsname\tfxx#1}}}
+
+%D We can force the way functions are typeset by manipulating the text
+%D option:
+%D
+%D \starttyping
+%D \definetypeface[iwona][ss][sans][iwona][default][encoding=texnansi]
+%D \definetypeface[iwona][mm][math][iwona][default][encoding=texnansi,text=ss]
+%D \stoptyping
+%D
+%D This hooks into the math handler with:
+
+% no longer supported this way, has to be done with \setupmathematics
+%
+% \appendtoks
+% \setmathfunctionstyle\currentmathtextstyle
+% \to \everybodyfont
+
+%D Usage:
+%D
+%D \starttyping
+%D \setmathfunctionstyle\fontstyle % or {rm} or {ss} or ..
+%D \rm test $\sin{(x^{\sin(x^{\sin(x)})})}$ test
+%D \ss test $\sin{(x^{\sin(x^{\sin(x)})})}$ test
+%D \tt test $\sin{(x^{\sin(x^{\sin(x)})})}$ test
+%D \stoptyping
+
+%D Some goodies:
+
+\def\Angstrom{\nomathematics{\Aring}}
+
+%D \macros
+%D {nonknuthmode, donknuthmode}
+%D
+%D The underscore is frequently used in manuals but unfortunately \TEX\ prefers
+%D it to be a math specific character. And since computer modern fonts didn't
+%D have an underscore, one had to use commands to fake one. Nowadays we do
+%D have underscores in latin modern, and since all other fonts have them, we
+%D decided to get away from the restriction to use the underscore character in
+%D text mode.
+%D
+%D \starttyping
+%D \def\test#1{#1}
+%D
+%D \nonknuthmode $x_2$ x_2 \test{$x_2$} \test{x_2}
+%D
+%D \donknuthmode $x_2$ x_2 \test{$x_2$} \test{x_2}
+%D \stoptyping
+%D
+%D The result is as expected: the first line typesets ok, while the second
+%D one triggers an error message.
+
+\newtoks\everydonknuthmode
+\newtoks\everynonknuthmode
+
+\def\nonknuthmode{\the\everynonknuthmode\let\nonknuthmode\relax}
+\def\donknuthmode{\the\everydonknuthmode}
+
+\ifdefined\normalsuber\else \def\normalsuber{_} \fi
+\ifdefined\normalsuper\else \def\normalsuper{^} \fi
+\ifdefined\normalaltab\else \def\normalaltab{&} \fi
+
+\bgroup
+
+ \catcode`_=\active
+ \catcode`^=\active
+ \catcode`&=\active
+
+ \global \everynonknuthmode {\appendtoks
+ \let_\normalsuber
+ \let^\normalsuper
+ \let&\normalaltab
+ \to \everymathematics}
+
+\egroup
+
+\appendtoks
+ \mathcode`_="8000
+ \mathcode`^="8000
+ \mathcode`&="8000
+ \catcode`_=\@@other
+ \catcode`^=\@@other
+ \catcode`&=\@@other
+\to \everynonknuthmode
+
+\appendtoks
+ \catcode`_=\@@subscript
+ \catcode`^=\@@superscript
+ \catcode`&=\@@alignment
+\to \everydonknuthmode
+
+\appendtoks
+ \startextendcatcodetable\ctxcatcodes
+ \catcode`_=\@@other
+ \catcode`^=\@@other
+ \catcode`&=\@@other
+ \stopextendcatcodetable
+\to \everynonknuthmode
+
+\appendtoks
+ \startextendcatcodetable\ctxcatcodes
+ \catcode`_=\@@subscript
+ \catcode`^=\@@superscript
+ \catcode`&=\@@alignment
+ \stopextendcatcodetable
+\to \everydonknuthmode
+
+%D Needed for unicode:
+
+\def\nulloperator{\mathortext{\mathop{\null}}{\null}}
+
+%D To be dealt with ...
+
+\mathcode`\ ="8000 % \space
+\mathcode`\'="8000 % ^\prime
+\mathcode`\_="8000 % \_
+
+%D \macros
+%D {setupmathematics}
+%D
+%D Configuration for integrals. (If needed we can speed this up and make it
+%D installable; no processaction is needed then).
+
+\newtoks\everysetupmathematics
+
+\unexpanded\def\setupmathematics
+ {\dosingleargument\dosetupmathematics}
+
+\def\dosetupmathematics[#1]%
+ {\getparameters[\??mo][#1]%
+ \the\everysetupmathematics}
+
+\def\mathematicsparameter#1{\ifcsname\??mo#1\endcsname\csname\??mo#1\endcsname\fi}
+
+%D Memory saver:
+
+\appendtoks
+ \doifelse{\mathematicsparameter\v!compact}\v!yes
+ {\ctxlua{fonts.vf.math.optional=true}}
+ {\ctxlua{fonts.vf.math.optional=false}}%
+\to \everysetupmathematics
+
+\setupmathematics
+ [\v!compact=no]
+
+%D Delayed: greek.
+%D
+%D \starttyping
+%D \usetypescript[cambria]\setupbodyfont[cambria]
+%D \startTEXpage
+%D $\alpha \mathgreekupright \alpha \mathgreekitalic \alpha$
+%D \stopTEXpage
+%D \stoptyping
+
+% [lc uc] normal (upright) = 2, italic = 3, none = 0/1
+
+\setevalue{\??mo:greek:\v!normal :\v!normal}{\attribute\mathgreekattribute22 }
+\setevalue{\??mo:greek:\v!normal :\v!italic}{\attribute\mathgreekattribute23 }
+\setevalue{\??mo:greek:\v!normal :\v!none }{\attribute\mathgreekattribute21 }
+
+\setevalue{\??mo:greek:\v!italic :\v!normal}{\attribute\mathgreekattribute32 }
+\setevalue{\??mo:greek:\v!italic :\v!italic}{\attribute\mathgreekattribute33 }
+\setevalue{\??mo:greek:\v!italic :\v!none }{\attribute\mathgreekattribute31 }
+
+\setevalue{\??mo:greek:\v!none :\v!normal}{\attribute\mathgreekattribute12 }
+\setevalue{\??mo:greek:\v!none :\v!italic}{\attribute\mathgreekattribute13 }
+\setevalue{\??mo:greek:\v!none :\v!none }{\attribute\mathgreekattribute\attributeunsetvalue}
+
+\appendtoks
+ \csname\??mo:greek:\@@molcgreek:\@@moucgreek\endcsname
+\to \everymathematics
+
+\setupmathematics
+ [lcgreek=\v!italic,
+ ucgreek=\v!normal] % was: none
+
+%D \macros
+%D {enablemathpunctuation,disablemathpunctuation}
+%D
+%D \startbuffer
+%D \enablemathpunctuation$(1,2) (1, 2) (1{,}2) \hbox{foo, not bar}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \blank{\getbuffer}\blank
+
+\setfalse \automathpunctuation
+
+\def\enablemathpunctuation {\settrue \automathpunctuation}
+\def\disablemathpunctuation{\setfalse\automathpunctuation}
+
+\ifx\v!autopunctuation\undefined \def\v!autopunctuation{autopunctuation} \fi
+
+\appendtoks
+ \doifelse{\mathematicsparameter\v!autopunctuation}\v!yes\enablemathpunctuation\disablemathpunctuation
+\to \everysetupmathematics
+
+\appendtoks
+ \ifconditional\automathpunctuation\attribute\mathpunctuationattribute\plusone\fi
+\to \everymathematics
+
+\setupmathematics
+ [\v!autopunctuation=\v!no]
+
+%D \macros
+%D {mathstyle}
+%D
+%D If one want to be sure that something is typeset in the
+%D appropriate style, \type {\mathstyle} can be used:
+%D
+%D \starttyping
+%D \mathstyle{something}
+%D \stoptyping
+
+% \def\mathstyle#1%
+% {\mathchoice
+% {\displaystyle #1}%
+% {\textstyle #1}%
+% {\scriptstyle #1}%
+% {\scriptscriptstyle#1}}
+%
+% We now have a primitive operation for this. As the
+% macro overloads a new primitive introduced in \LUATEX,
+% we need to use \type {\normalmathstyle} when we consult
+% the current math style.
+%
+% \let \mathstyle \Ustack % spoils cramped
+%
+% \let \mathstyle \firstofoneargument
+%
+% 0 = display
+% 1 = crampeddisplay
+% 2 = text
+% 3 = crampedtext
+% 4 = script
+% 5 = crampedscript
+% 6 = scriptscript
+% 7 = crampedscriptscript
+
+\def\uncramped#1%
+ {{\ifcase\normalmathstyle
+ \or \displaystyle \or
+ \or \textstyle \or
+ \or \scriptstyle \or
+ \or \scriptscriptstyle \fi
+ #1}}
+
+\def\cramped#1%
+ {{\ifcase\normalmathstyle
+ \crampeddisplaystyle \or \or % 0 -> 1
+ \crampedtextstyle \or \or % 2 -> 3
+ \crampedscriptstyle \or \or % 4 -> 5
+ \crampedscriptscriptstyle \fi % 6 -> 7
+ #1}}
+
+\def\triggermathstyle#1% #1 is number
+ {\ifcase#1\relax
+ \displaystyle \or
+ \crampeddisplaystyle \or
+ \textstyle \or
+ \crampedtextstyle \or
+ \scriptstyle \or
+ \crampedscriptstyle \or
+ \scriptscriptstyle \or
+ \crampedscriptscriptstyle \else
+ % error
+ \fi}
+
+\def\cramped#1%
+ {{\ifcase\normalmathstyle
+ \crampeddisplaystyle \or \or % 0 -> 1
+ \crampedtextstyle \or \or % 2 -> 3
+ \crampedscriptstyle \or \or % 4 -> 5
+ \crampedscriptscriptstyle \fi % 6 -> 7
+ #1}}
+
+\def\mathstylefont#1% #1 is number (\normalmathstyle)
+ {\ifcase#1\relax
+ \textfont \or
+ \textfont \or
+ \textfont \or
+ \textfont \or
+ \scriptfont \or
+ \scriptfont \or
+ \scriptscriptfont \or
+ \scriptscriptfont \else
+ \textfont
+ \fi\zerocount}
+
+%D Something similar can be used in the (re|)|definition
+%D of \type {\text}. This version is a variation on the one
+%D in the math module (see \type{m-math} and|/|or \type
+%D {m-newmat}).
+
+\unexpanded\def\mathtext
+ {\mathortext\domathtext\hbox}
+
+\def\domathtext#1%
+ {\mathchoice
+ {\dodomathtext\displaystyle\textface {#1}}%
+ {\dodomathtext\textstyle \textface {#1}}%
+ {\dodomathtext\textstyle \scriptface {#1}}%
+ {\dodomathtext\textstyle \scriptscriptface{#1}}}
+
+\def\dodomathtext#1#2#3% no \everymath !
+ %{\hbox{\everymath{#1}\switchtobodyfont [#2]#3}} % 15 sec
+ {\hbox{\everymath{#1}\setcurrentfontbody{#2}#3}} % 3 sec (no math)
+
+%D Safeguard against redefinitions:
+
+\appendtoks
+ \let\_\normalunderscore % is textunderscore or fakeunderscore
+\to \everymathematics
+
+%D Because we may overload \type {\text} in other (structuring)
+%D macros, we say:
+
+\appendtoks \let\text\mathtext \to \everymathematics
+
+%D The next code is derived from plain \TEX.
+
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+
+\newif\ifdt@p
+
+\def\displ@y
+ {\global\dt@ptrue
+ \openup\displayopenupvalue % was \openup\jot
+ \everycr
+ {\noalign
+ {\ifdt@p
+ \global\dt@pfalse
+ \ifdim\prevdepth>-\thousandpoint
+ \vskip-\lineskiplimit
+ \vskip\normallineskiplimit
+ \fi
+ \else
+ \penalty\interdisplaylinepenalty
+ \fi}}}
+
+\let\normaldispl@y\displ@y
+
+\def\displ@y{\resetdisplaymatheq\normaldispl@y}
+
+\def\m@th{\mathsurround\zeropoint} % obsolete
+
+%D Text in math:
+
+\def\mathortext
+ {\ifmmode
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% \defineactivecharacter _ {\mathortext{_}{\_}} text_text $a^2$
+
+% force text mode, will be overloaded later
+
+\ifx\text\undefined \let\text\hbox \fi
+
+\def\mathoptext#1{\mathop{\text{#1}}}
+
+\protect \endinput
diff --git a/tex/context/base/math-inl.mkiv b/tex/context/base/math-inl.mkiv
new file mode 100644
index 000000000..89de0242b
--- /dev/null
+++ b/tex/context/base/math-inl.mkiv
@@ -0,0 +1,26 @@
+%D \module
+%D [ file=math-inl,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Inline,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Math Macros / Inline}
+
+\unprotect
+
+% Obsolete, as we do snapping differently now.
+
+\def\snappedinlineformula {\dosingleempty\dosnappedinlineformula}
+\def\dosnappedinlineformula[#1]#2{\mathematics{#2}}
+\let\tform \mathematics
+\let\gform \snappedinlineformula
+\let\enableautomath \relax
+
+\protect \endinput
diff --git a/tex/context/base/math-int.mkiv b/tex/context/base/math-int.mkiv
new file mode 100644
index 000000000..2af471b5c
--- /dev/null
+++ b/tex/context/base/math-int.mkiv
@@ -0,0 +1,90 @@
+%D \module
+%D [ file=math-int,
+%D version=2007.07.19,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Scripts,
+%D author={Hans Hagen \& Taco Hoekwater \& Aditya Mahajan},
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Integrals}
+
+\unprotect
+
+%D \startbuffer
+%D $\int_a^b f(x) dx$ and also
+%D $\iint_a^b f(x,y) dxdy$, $\iiint_a^b f(x,y) dxdy$,
+%D $\iiiint_a^b f(x) dx$
+%D \startformula
+%D \int_a^b f(x) dx \quad
+%D \iint_a^b f(x) dx \quad
+%D \iiint_a^b f(x) dx \quad
+%D \iiiint_a^b f(x) dx \quad
+%D \stopformula
+%D \stopbuffer
+%D
+%D Default: \getbuffer
+%D
+%D Displaylimits: \setupmathematics[integral=displaylimits] \getbuffer
+%D
+%D Limits: \setupmathematics[integral=limits] \getbuffer
+
+\chardef\intlimitcode\zerocount % 0 nolimits 1 displaylimits 2 limits
+
+\def\intlimits
+ {\ifcase\intlimitcode \nolimits \or \displaylimits \or \limits \fi}
+
+\ifx\v!integral\undefined \def\v!integral{integral} \fi
+
+\appendtoks
+ \processaction
+ [\mathematicsparameter\v!integral]
+ [ nolimits=>\chardef\intlimitcode\zerocount,
+ displaylimits=>\chardef\intlimitcode\plusone,
+ limits=>\chardef\intlimitcode\plustwo]%
+\to \everysetupmathematics
+
+\setupmathematics
+ [\v!integral=nolimits]
+
+%D More integrals (AM):
+
+\definemathcommand [iint] {\repeatintegral\plusone }
+\definemathcommand [iiint] {\repeatintegral\plustwo }
+\definemathcommand [iiiint] {\repeatintegral\plusthree}
+
+%def\integralrepeatsymbol{\intop}
+\def\integralrepeatsymbol{{\int}}
+
+\def\repeatintegral#1%
+ {\scratchtoks\emptytoks
+ \let\dointlimits\donothing
+ \let\dodointlimits\intlimits
+ \dorecurse{#1}{\appendtoks \integralrepeatsymbol \dointkern \to \scratchtoks}
+ \appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
+ \edef\dodorepeatintegral{\the\scratchtoks}%
+ \futurelet\next\dorepeatintegral}
+
+%D If the \type{\limits} option is used after \type{\iint}, use
+%D \type{\mathop} and fudge the left hand space a bit to make the
+%D subscript visually centered.
+
+\def\dointkern
+ {\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}
+
+\def\dorepeatintegral
+ {\ifx\next\limits \dointlimitcorrection \else
+ \ifx\next\displaylimits \dointlimitcorrection \else
+ \ifx\next\nolimits \donothing \else
+ \ifcase\intlimitcode\else \dointlimitcorrection \fi\fi\fi\fi
+ \dodorepeatintegral}
+
+\def\dointlimitcorrection
+ {\mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
+ \mathop\bgroup\mkern7mu\mathchoice{\mkern2mu}{}{}{}\let\dointlimits\egroup}
+
+\protect \endinput
diff --git a/tex/context/base/math-lan.mkiv b/tex/context/base/math-lan.mkiv
new file mode 100644
index 000000000..1d3132578
--- /dev/null
+++ b/tex/context/base/math-lan.mkiv
@@ -0,0 +1,67 @@
+%D \module
+%D [ file=math-lan,
+%D version=2009.03.10,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Language 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}{ConTeXt Math Macros / Language Support}
+
+\unprotect
+
+\setupmathlabeltext [\s!en] [arccos=arccos]
+\setupmathlabeltext [\s!en] [arcsin=arcsin]
+\setupmathlabeltext [\s!en] [arctan=arctan]
+\setupmathlabeltext [\s!en] [arg=arg]
+\setupmathlabeltext [\s!en] [cosh=cosh]
+\setupmathlabeltext [\s!en] [cos=cos]
+\setupmathlabeltext [\s!en] [coth=coth]
+\setupmathlabeltext [\s!en] [cot=cot]
+\setupmathlabeltext [\s!en] [csc=csc]
+\setupmathlabeltext [\s!en] [deg=deg]
+\setupmathlabeltext [\s!en] [det=det]
+\setupmathlabeltext [\s!en] [dim=dim]
+\setupmathlabeltext [\s!en] [exp=exp]
+\setupmathlabeltext [\s!en] [gcd=gcd]
+\setupmathlabeltext [\s!en] [hom=hom]
+\setupmathlabeltext [\s!en] [inf=inf]
+\setupmathlabeltext [\s!en] [injlim=inj\,lim]
+\setupmathlabeltext [\s!en] [ker=ker]
+\setupmathlabeltext [\s!en] [lg=lg]
+\setupmathlabeltext [\s!en] [liminf=lim\,inf]
+\setupmathlabeltext [\s!en] [limsup=lim\,sup]
+\setupmathlabeltext [\s!en] [lim=lim]
+\setupmathlabeltext [\s!en] [ln=ln]
+\setupmathlabeltext [\s!en] [log=log]
+\setupmathlabeltext [\s!en] [median=median]
+\setupmathlabeltext [\s!en] [max=max]
+\setupmathlabeltext [\s!en] [min=min]
+\setupmathlabeltext [\s!en] [mod=mod]
+\setupmathlabeltext [\s!en] [projlim=proj\,lim]
+\setupmathlabeltext [\s!en] [Pr=Pr]
+\setupmathlabeltext [\s!en] [sec=sec]
+\setupmathlabeltext [\s!en] [sinh=sinh]
+\setupmathlabeltext [\s!en] [sin=sin]
+\setupmathlabeltext [\s!en] [sup=sup]
+\setupmathlabeltext [\s!en] [tanh=tanh]
+\setupmathlabeltext [\s!en] [tan=tan]
+
+\setupmathlabeltext [\s!pl] [tg=tg]
+\setupmathlabeltext [\s!pl] [cot=ctg]
+\setupmathlabeltext [\s!pl] [ctg=ctg]
+\setupmathlabeltext [\s!pl] [arcsin=arc\,sin]
+\setupmathlabeltext [\s!pl] [arccos=arc\,cos]
+\setupmathlabeltext [\s!pl] [arctan=arc\,tg]
+\setupmathlabeltext [\s!pl] [arctg=arc\,tg]
+\setupmathlabeltext [\s!pl] [arcctg=arc\,ctg]
+
+\setupmathlabeltext [\s!nl] [gcd=ggd]
+\setupmathlabeltext [\s!nl] [lcm=kgv]
+
+\protect \endinput
diff --git a/tex/context/base/math-lbr.mkii b/tex/context/base/math-lbr.mkii
new file mode 100644
index 000000000..cf69eec1f
--- /dev/null
+++ b/tex/context/base/math-lbr.mkii
@@ -0,0 +1,481 @@
+%D \module
+%D [ file=math-lbr,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Lucida Specials,
+%D author={Hans Hagen \& Taco Hoekwater},
+%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.
+
+\unprotect
+
+\definefamilysynonym [lbr] [calligraphy] [sy]
+\definefamilysynonym [lbr] [oldstyle] [mi]
+
+\definefamilysynonym [lbr] [blackboard] [ma]
+\definefamilysynonym [lbr] [ucgreek] [mb]
+\definefamilysynonym [lbr] [vargreek] [mi]
+
+\startmathcollection[lbr]
+
+\definemathsymbol [boxdot] [bin] [sy] ["ED]
+\definemathsymbol [boxplus] [bin] [sy] ["EA]
+\definemathsymbol [boxtimes] [bin] [sy] ["EC]
+\definemathsymbol [square] [ord] [ma] ["02]
+\definemathsymbol [Box] [ord] [ma] ["02] % square
+\definemathsymbol [blacksquare] [ord] [ma] ["03]
+\definemathsymbol [centerdot] [bin] [ma] ["E1] % [sy] ["01]
+\definemathsymbol [Diamond] [ord] [sy] ["05]
+\definemathsymbol [lozenge] [ord] [sy] ["05] % Diamond
+\definemathsymbol [blacklozenge] [ord] [ma] ["09]
+\definemathsymbol [circlearrowright] [rel] [ma] ["8C]
+\definemathsymbol [circlearrowleft] [rel] [ma] ["8B]
+\definemathsymbol [rightleftharpoons] [rel] [sy] ["8E]
+\definemathsymbol [leftrightharpoons] [rel] [sy] ["8D]
+\definemathsymbol [boxminus] [bin] [sy] ["EB]
+\definemathsymbol [Vdash] [rel] [sy] ["F0]
+\definemathsymbol [Vvdash] [rel] [mb] ["D3]
+\definemathsymbol [vDash] [rel] [mb] ["D6]
+\definemathsymbol [twoheadrightarrow] [rel] [ma] ["25]
+\definemathsymbol [twoheadleftarrow] [rel] [ma] ["23]
+\definemathsymbol [leftleftarrows] [rel] [ma] ["71]
+\definemathsymbol [rightrightarrows] [rel] [ma] ["73]
+\definemathsymbol [upuparrows] [rel] [ma] ["72]
+\definemathsymbol [downdownarrows] [rel] [ma] ["74]
+\definemathsymbol [upharpoonright] [rel] [ma] ["75]
+\definemathsymbol [restriction] [rel] [ma] ["77]
+\definemathsymbol [downharpoonright] [rel] [ma] ["77]
+\definemathsymbol [upharpoonleft] [rel] [ma] ["76]
+\definemathsymbol [downharpoonleft] [rel] [ma] ["78]
+\definemathsymbol [rightarrowtail] [rel] [ma] ["29]
+\definemathsymbol [leftarrowtail] [rel] [ma] ["28]
+\definemathsymbol [leftrightarrows] [rel] [ma] ["6E]
+\definemathsymbol [rightleftarrows] [rel] [ma] ["6D]
+\definemathsymbol [Lsh] [rel] [ma] ["7B]
+\definemathsymbol [Rsh] [rel] [ma] ["7D]
+\definemathsymbol [rightsquigarrow] [rel] [ma] ["8E]
+\definemathsymbol [leadsto] [rel] [ma] ["8E] % rightsquigarrow
+\definemathsymbol [leftrightsquigarrow] [rel] [ma] ["91]
+\definemathsymbol [looparrowleft] [rel] [ma] ["3F]
+\definemathsymbol [looparrowright] [rel] [ma] ["40]
+\definemathsymbol [circeq] [rel] [sy] ["D0]
+\definemathsymbol [succsim] [rel] [sy] ["E1]
+\definemathsymbol [gtrsim] [rel] [sy] ["DD]
+\definemathsymbol [gtrapprox] [rel] [mb] ["DB]
+\definemathsymbol [multimap] [rel] [mb] ["C7]
+\definemathsymbol [therefore] [rel] [sy] ["90]
+\definemathsymbol [because] [rel] [sy] ["91]
+\definemathsymbol [doteqdot] [rel] [sy] ["CA]
+\definemathsymbol [Doteq] [rel] [sy] ["CA] % doteqdot
+\definemathsymbol [triangleq] [rel] [sy] ["D5]
+\definemathsymbol [precsim] [rel] [sy] ["E0]
+\definemathsymbol [lesssim] [rel] [sy] ["DC]
+\definemathsymbol [lessapprox] [rel] [mb] ["DA]
+\definemathsymbol [eqslantless] [rel] [mb] ["E2]
+\definemathsymbol [eqslantgtr] [rel] [mb] ["E3]
+\definemathsymbol [curlyeqprec] [rel] [mb] ["E6]
+\definemathsymbol [curlyeqsucc] [rel] [mb] ["E7]
+\definemathsymbol [preccurlyeq] [rel] [mb] ["E4]
+\definemathsymbol [leqq] [rel] [sy] ["DA]
+\definemathsymbol [leqslant] [rel] [mb] ["E0]
+\definemathsymbol [lessgtr] [rel] [sy] ["DE]
+\definemathsymbol [backprime] [ord] [mb] ["C8]
+\definemathsymbol [dabar@] [ord] [ma] ["03] % !! @
+\definemathsymbol [risingdotseq] [rel] [sy] ["CC]
+\definemathsymbol [fallingdotseq] [rel] [sy] ["CB]
+\definemathsymbol [succcurlyeq] [rel] [mb] ["E5]
+\definemathsymbol [geqq] [rel] [sy] ["DB]
+\definemathsymbol [geqslant] [rel] [mb] ["E1]
+\definemathsymbol [gtrless] [rel] [sy] ["DF]
+\definemathsymbol [sqsubset] [rel] [sy] ["E4]
+\definemathsymbol [sqsupset] [rel] [sy] ["E5]
+\definemathsymbol [vartriangleright] [rel] [mb] ["2E]
+\definemathsymbol [rhd] [bin] [mb] ["2E]
+\definemathsymbol [lhd] [bin] [mb] ["2F]
+\definemathsymbol [vartriangleleft] [rel] [mb] ["2F]
+\definemathsymbol [trianglerighteq] [rel] [sy] ["F5]
+\definemathsymbol [unrhd] [bin] [sy] ["F5] % trianglerighteq
+\definemathsymbol [trianglelefteq] [rel] [sy] ["F4]
+\definemathsymbol [unlhd] [bin] [sy] ["F4] % trianglelefteq
+\definemathsymbol [bigstar] [ord] [ma] ["AB]
+\definemathsymbol [between] [rel] [mb] ["F2]
+\definemathsymbol [blacktriangledown] [ord] [ma] ["07]
+\definemathsymbol [blacktriangleright] [rel] [mb] ["F1]
+\definemathsymbol [blacktriangleleft] [rel] [mb] ["F0]
+\definemathsymbol [vartriangle] [rel] [ma] ["04]
+\definemathsymbol [triangleup] [ord] [ma] ["04] % vartriangle
+\definemathsymbol [blacktriangle] [ord] [ma] ["05]
+\definemathsymbol [triangledown] [ord] [ma] ["06]
+\definemathsymbol [eqcirc] [rel] [sy] ["CF]
+\definemathsymbol [lesseqgtr] [rel] [mb] ["E8]
+\definemathsymbol [gtreqless] [rel] [mb] ["E9]
+\definemathsymbol [lesseqqgtr] [rel] [mb] ["EA]
+\definemathsymbol [gtreqqless] [rel] [mb] ["EB]
+\definemathsymbol [Rrightarrow] [rel] [ma] ["6C]
+\definemathsymbol [Lleftarrow] [rel] [ma] ["6A]
+\definemathsymbol [veebar] [bin] [mb] ["D2]
+\definemathsymbol [barwedge] [bin] [sy] ["F6]
+\definemathsymbol [doublebarwedge] [bin] [sy] ["D4]
+\definemathsymbol [angle] [ord] [sy] ["8B]
+\definemathsymbol [measuredangle] [ord] [sy] ["8C]
+\definemathsymbol [sphericalangle] [ord] [sy] ["8D]
+\definemathsymbol [varpropto] [rel] [sy] ["2F]
+\definemathsymbol [smallsmile] [rel] [mb] ["5E]
+\definemathsymbol [smallfrown] [rel] [mb] ["5F]
+\definemathsymbol [Subset] [rel] [sy] ["F8]
+\definemathsymbol [Supset] [rel] [sy] ["F9]
+\definemathsymbol [Cup] [bin] [sy] ["FA]
+\definemathsymbol [doublecup] [bin] [sy] ["FA] % Cup
+\definemathsymbol [Cap] [bin] [sy] ["FB]
+\definemathsymbol [doublecap] [bin] [sy] ["FB]
+\definemathsymbol [curlywedge] [bin] [sy] ["84]
+\definemathsymbol [curlyvee] [bin] [sy] ["85]
+\definemathsymbol [leftthreetimes] [bin] [mb] ["D0]
+\definemathsymbol [rightthreetimes] [bin] [mb] ["D1]
+\definemathsymbol [subseteqq] [rel] [mb] ["EE]
+\definemathsymbol [supseteqq] [rel] [mb] ["EF]
+\definemathsymbol [bumpeq] [rel] [sy] ["C8]
+\definemathsymbol [Bumpeq] [rel] [sy] ["C7]
+\definemathsymbol [llless] [rel] [mb] ["DE]
+\definemathsymbol [lll] [rel] [mb] ["DE] % llless
+\definemathsymbol [gggtr] [rel] [mb] ["DF]
+\definemathsymbol [ggg] [rel] [mb] ["DF] % gggtr
+\definemathsymbol [ulcorner] [open] [ma] ["5B] [ma] ["5B]
+\definemathsymbol [urcorner] [close] [ma] ["5C] [ma] ["5C]
+\definemathsymbol [circledS] [ord] [mb] ["CA]
+\definemathsymbol [pitchfork] [rel] [ma] ["F3]
+\definemathsymbol [dotplus] [bin] [sy] ["89]
+\definemathsymbol [backsim] [rel] [sy] ["24]
+\definemathsymbol [backsimeq] [rel] [sy] ["27]
+\definemathsymbol [llcorner] [open] [ma] ["5D] [ma] ["5D]
+\definemathsymbol [lrcorner] [close] [ma] ["5E] [ma] ["5E]
+\definemathsymbol [complement] [ord] [mb] ["94]
+\definemathsymbol [intercal] [bin] [ma] ["03] % !!
+\definemathsymbol [circledcirc] [bin] [sy] ["E6]
+\definemathsymbol [circledast] [bin] [sy] ["E7]
+\definemathsymbol [circleddash] [bin] [mb] ["CC]
+
+\stopmathcollection
+
+\startmathcollection [lbr]
+
+\definemathsymbol [lvertneqq] [rel] [ma] ["DE]
+\definemathsymbol [gvertneqq] [rel] [ma] ["DE]
+\definemathsymbol [nleq] [rel] [ma] ["9C]
+\definemathsymbol [ngeq] [rel] [ma] ["9D]
+\definemathsymbol [nless] [rel] [ma] ["9A]
+\definemathsymbol [ngtr] [rel] [ma] ["9B]
+\definemathsymbol [nprec] [rel] [ma] ["E5]
+\definemathsymbol [nsucc] [rel] [ma] ["E6]
+\definemathsymbol [lneqq] [rel] [ma] ["DC]
+\definemathsymbol [gneqq] [rel] [ma] ["DE]
+\definemathsymbol [nleqslant] [rel] [ma] ["D6]
+\definemathsymbol [ngeqslant] [rel] [ma] ["D7]
+\definemathsymbol [lneq] [rel] [ma] ["DA]
+\definemathsymbol [gneq] [rel] [ma] ["DB]
+\definemathsymbol [npreceq] [rel] [ma] ["E7]
+\definemathsymbol [nsucceq] [rel] [ma] ["E8]
+\definemathsymbol [precnsim] [rel] [ma] ["EB]
+\definemathsymbol [succnsim] [rel] [ma] ["EC]
+\definemathsymbol [lnsim] [rel] [ma] ["E0]
+\definemathsymbol [gnsim] [rel] [ma] ["E2]
+\definemathsymbol [nleqq] [rel] [ma] ["D8]
+\definemathsymbol [ngeqq] [rel] [ma] ["D9]
+\definemathsymbol [precneqq] [rel] [ma] ["E9]
+\definemathsymbol [succneqq] [rel] [ma] ["EA]
+\definemathsymbol [precnapprox] [rel] [ma] ["ED]
+\definemathsymbol [succnapprox] [rel] [ma] ["EE]
+\definemathsymbol [lnapprox] [rel] [ma] ["E4]
+\definemathsymbol [gnapprox] [rel] [ma] ["E3]
+\definemathsymbol [nsim] [rel] [ma] ["96]
+\definemathsymbol [ncong] [rel] [ma] ["99]
+\definemathsymbol [diagup] [ord] [mb] ["CD]
+\definemathsymbol [diagdown] [ord] [mb] ["D8]
+\definemathsymbol [varsubsetneq] [rel] [ma] ["D0]
+\definemathsymbol [varsupsetneq] [rel] [ma] ["D1]
+\definemathsymbol [nsubseteqq] [rel] [ma] ["CA]
+\definemathsymbol [nsupseteqq] [rel] [ma] ["CB]
+\definemathsymbol [subsetneqq] [rel] [ma] ["CE]
+\definemathsymbol [supsetneqq] [rel] [ma] ["CF]
+\definemathsymbol [varsubsetneqq] [rel] [ma] ["D2]
+\definemathsymbol [varsupsetneqq] [rel] [ma] ["D3]
+\definemathsymbol [subsetneq] [rel] [ma] ["CC]
+\definemathsymbol [supsetneq] [rel] [ma] ["CD]
+\definemathsymbol [nsubseteq] [rel] [ma] ["C8]
+\definemathsymbol [nsupseteq] [rel] [ma] ["C9]
+\definemathsymbol [nparallel] [rel] [ma] ["F7]
+\definemathsymbol [nmid] [rel] [ma] ["F6]
+\definemathsymbol [nshortmid] [rel] [ma] ["F4]
+\definemathsymbol [nshortparallel] [rel] [ma] ["F5]
+\definemathsymbol [nvdash] [rel] [ma] ["F8]
+\definemathsymbol [nVdash] [rel] [ma] ["F9]
+\definemathsymbol [nvDash] [rel] [ma] ["FA]
+\definemathsymbol [nVDash] [rel] [ma] ["FB]
+\definemathsymbol [ntrianglerighteq] [rel] [ma] ["F2]
+\definemathsymbol [ntrianglelefteq] [rel] [ma] ["F1]
+\definemathsymbol [ntriangleleft] [rel] [ma] ["EF]
+\definemathsymbol [ntriangleright] [rel] [ma] ["F0]
+\definemathsymbol [nleftarrow] [rel] [ma] ["32]
+\definemathsymbol [nrightarrow] [rel] [ma] ["33]
+\definemathsymbol [nLeftarrow] [rel] [ma] ["66]
+\definemathsymbol [nRightarrow] [rel] [ma] ["68]
+\definemathsymbol [nLeftrightarrow] [rel] [ma] ["67]
+\definemathsymbol [nleftrightarrow] [rel] [ma] ["34]
+\definemathsymbol [divideontimes] [bin] [mb] ["F7]
+\definemathsymbol [varnothing] [ord] [sy] ["53]
+\definemathsymbol [nexists] [ord] [ma] ["20]
+\definemathsymbol [Finv] [ord] [mb] ["90]
+\definemathsymbol [Game] [ord] [mb] ["91]
+\definemathsymbol [mho] [ord] [mb] ["92]
+\definemathsymbol [eth] [ord] [ma] ["03] % !!
+\definemathsymbol [eqsim] [rel] [sy] ["99]
+\definemathsymbol [beth] [ord] [mb] ["95]
+\definemathsymbol [gimel] [ord] [mb] ["96]
+\definemathsymbol [daleth] [ord] [mb] ["97]
+\definemathsymbol [lessdot] [bin] [mb] ["DC]
+\definemathsymbol [gtrdot] [bin] [mb] ["DD]
+\definemathsymbol [ltimes] [bin] [mb] ["CF]
+\definemathsymbol [rtimes] [bin] [mb] ["CE]
+\definemathsymbol [shortmid] [rel] [mb] ["F4]
+\definemathsymbol [shortparallel] [rel] [mb] ["F5]
+\definemathsymbol [smallsetminus] [bin] [mb] ["D8]
+\definemathsymbol [thicksim] [rel] [sy] ["18] % not that thick
+\definemathsymbol [thickapprox] [rel] [sy] ["19] % not that thick
+\definemathsymbol [approxeq] [rel] [sy] ["9D]
+\definemathsymbol [succapprox] [rel] [mb] ["ED]
+\definemathsymbol [precapprox] [rel] [mb] ["EC]
+\definemathsymbol [curvearrowleft] [rel] [ma] ["87]
+\definemathsymbol [curvearrowright] [rel] [ma] ["88]
+\definemathsymbol [digamma] [ord] [ma] ["03] % !!
+\definemathsymbol [varkappa] [ord] [mb] ["9B]
+\definemathsymbol [Bbbk] [ord] [ma] ["6B]
+\definemathsymbol [hslash] [ord] [mb] ["9D]
+\definemathsymbol [hbar] [ord] [ma] ["1B]
+\definemathsymbol [backepsilon] [rel] [ma] ["03] % !!
+
+\stopmathcollection
+
+\startmathcollection [lbr]
+
+\definemathsymbol [yen] [nothing] [ma] ["03] % !!
+\definemathsymbol [checkmark] [nothing] [ma] ["AC]
+\definemathsymbol [circledR] [nothing] [mb] ["C9]
+\definemathsymbol [maltese] [nothing] [mb] ["CB]
+
+\stopmathcollection
+
+\startmathcollection [lbr]
+
+\definemathsymbol [dashrightarrow] [rel] [ma] ["3A]
+\definemathsymbol [dashleftarrow] [rel] [ma] ["38]
+\definemathcommand [dasharrow] [rel] {\dashleftarrow\mkern-15.8mu\dashrightarrow}
+%definemathcommand [Join] [rel] {\mathchar"0D6F\mkern-15.8mu\mathchar"0D6E} % !!
+
+\stopmathcollection
+
+\startmathcollection[lbr]
+
+\definemathcharacter [91] [open] [mi] ["86]
+\definemathcharacter [93] [close] [mi] ["87]
+\definemathcharacter [(] [open] [mi] ["84]
+\definemathcharacter [)] [close] [mi] ["85]
+\definemathcharacter [/] [nothing] [mi] ["3D]
+\definemathcharacter [=] [rel] [sy] ["83]
+\definemathcharacter [+] [bin] [sy] ["82]
+
+\definemathcharacter [91] [nothing] [mi] ["86] [ex] ["02]
+\definemathcharacter [93] [nothing] [mi] ["87] [ex] ["03]
+\definemathcharacter [(] [nothing] [mi] ["84] [ex] ["00]
+\definemathcharacter [)] [nothing] [mi] ["85] [ex] ["01]
+\definemathcharacter [/] [nothing] [mi] ["3D] [ex] ["0E]
+
+\stopmathcollection
+
+% \startmathcollection[lbr]
+%
+% \definemathcharacter [:] [punct] [tf] ["3A] % unbelievable
+% \definemathcharacter [;] [punct] [tf] ["3B] % unbelievable
+%
+% \stopmathcollection
+
+\startmathcollection[lbr]
+
+\definemathsymbol [ldbrack] [open] [mi] ["82] [ex] ["82]
+\definemathsymbol [rdbrack] [close] [mi] ["83] [ex] ["83]
+\definemathsymbol [surfintop] [op] [ex] ["90]
+\definemathsymbol [midintop] [op] [ex] ["92]
+\definemathsymbol [midointop] [op] [ex] ["93]
+\definemathsymbol [midsurfintop] [op] [ex] ["94]
+\definemathsymbol [largeint] [op] [ex] ["5A] [ex] ["95]
+
+% \definemathcommand [surfint] [nolop] {\surfintop}
+% \definemathcommand [midint] [nolop] {\midintop}
+% \definemathcommand [midoint] [nolop] {\midointop}
+% \definemathcommand [midsurfint] [nolop] {\midsurfintop}
+
+\definemathsymbol [surfint] [nolop] [ex] ["90]
+\definemathsymbol [midint] [nolop] [ex] ["92]
+\definemathsymbol [midoint] [nolop] [ex] ["93]
+\definemathsymbol [midsurfint] [nolop] [ex] ["94]
+
+\definemathsymbol [dblint] [ord] [mi] ["88]
+\definemathsymbol [trplint] [ord] [mi] ["89]
+\definemathsymbol [contint] [ord] [mi] ["8A]
+\definemathsymbol [surfint] [ord] [mi] ["8B]
+\definemathsymbol [volint] [ord] [mi] ["8C]
+\definemathsymbol [clwint] [ord] [mi] ["8D]
+\definemathsymbol [cclwcint] [ord] [mi] ["8E]
+\definemathsymbol [clwcint] [ord] [mi] ["8F]
+\definemathsymbol [bowtie] [rel] [mi] ["F6]
+\definemathsymbol [models] [rel] [sy] ["EE]
+\definemathsymbol [doteq] [rel] [sy] ["C9]
+\definemathsymbol [cong] [rel] [sy] ["9B]
+\definemathsymbol [hbar] [ord] [mi] ["9D]
+\definemathsymbol [neq] [rel] [ma] ["94]
+\definemathsymbol [rightleftharpoons] [rel] [ma] ["7A]
+\definemathsymbol [leftrightharpoons] [rel] [ma] ["79]
+\definemathsymbol [hookleftarrow] [rel] [ma] ["3C]
+\definemathsymbol [hookrightarrow] [rel] [ma] ["3E]
+\definemathsymbol [mapsto] [rel] [ma] ["2C]
+
+\definemathcommand [longmapsto] {\mapstochar\longrightarrow}
+
+\stopmathcollection
+
+\startmathcollection[lbr]
+
+\definemathsymbol [Gamma] [alpha] [ucgreek] ["00]
+\definemathsymbol [Delta] [alpha] [ucgreek] ["01]
+\definemathsymbol [Theta] [alpha] [ucgreek] ["02]
+\definemathsymbol [Lambda] [alpha] [ucgreek] ["03]
+\definemathsymbol [Xi] [alpha] [ucgreek] ["04]
+\definemathsymbol [Pi] [alpha] [ucgreek] ["05]
+\definemathsymbol [Sigma] [alpha] [ucgreek] ["06]
+\definemathsymbol [Upsilon] [alpha] [ucgreek] ["07]
+\definemathsymbol [Phi] [alpha] [ucgreek] ["08]
+\definemathsymbol [Psi] [alpha] [ucgreek] ["09]
+\definemathsymbol [Omega] [alpha] [ucgreek] ["0A]
+
+\definemathsymbol [varGamma] [ord] [vargreek] ["00]
+\definemathsymbol [varDelta] [ord] [vargreek] ["01]
+\definemathsymbol [varTheta] [ord] [vargreek] ["02]
+\definemathsymbol [varLambda] [ord] [vargreek] ["03]
+\definemathsymbol [varXi] [ord] [vargreek] ["04]
+\definemathsymbol [varPi] [ord] [vargreek] ["05]
+\definemathsymbol [varSigma] [ord] [vargreek] ["06]
+\definemathsymbol [varUpsilon] [ord] [vargreek] ["07]
+\definemathsymbol [varPhi] [ord] [vargreek] ["08]
+\definemathsymbol [varPsi] [ord] [vargreek] ["09]
+\definemathsymbol [varOmega] [ord] [vargreek] ["0A]
+
+\stopmathcollection
+
+% we define the whole lot, although only a few differ (esp dot)
+
+% \startmathcollection[lbr]
+%
+% \definemathsymbol [acute] [accent] [tf] ["13] % mr -> tf
+% \definemathsymbol [grave] [accent] [tf] ["12] % mr -> tf
+% \definemathsymbol [ddot] [accent] [tf] ["7F] % mr -> tf
+% \definemathsymbol [tilde] [accent] [tf] ["7E] % mr -> tf
+% \definemathsymbol [bar] [accent] [tf] ["16] % mr -> tf
+% \definemathsymbol [breve] [accent] [tf] ["15] % mr -> tf
+% \definemathsymbol [check] [accent] [tf] ["14] % mr -> tf
+% \definemathsymbol [hat] [accent] [tf] ["5E] % mr -> tf
+% \definemathsymbol [vec] [accent] [mi] ["7E] % [ord]
+% \definemathsymbol [dot] [accent] [tf] ["05] % mr -> tf, 5F -> 05
+% \definemathsymbol [widetilde] [accent] [ex] ["65] % [ord]
+% \definemathsymbol [widehat] [accent] [ex] ["62] % [ord]
+%
+% \stopmathcollection
+
+\startmathcollection[lbr:texnansi]
+ \definemathsymbol [acute] [accent] [tf] ["13]
+ \definemathsymbol [grave] [accent] [tf] ["12]
+ \definemathsymbol [ddot] [accent] [tf] ["7F]
+ %definemathsymbol [ddot] [accent] [tf] ["A8] % both is OK
+ \definemathsymbol [tilde] [accent] [tf] ["7E]
+ %definemathsymbol [tilde] [accent] [tf] ["98] % both is OK
+ \definemathsymbol [bar] [accent] [tf] ["16]
+ \definemathsymbol [breve] [accent] [tf] ["15]
+ \definemathsymbol [check] [accent] [tf] ["14]
+ \definemathsymbol [hat] [accent] [tf] ["5E]
+ %definemathsymbol [hat] [accent] [tf] ["88] % both is OK
+ \definemathsymbol [dot] [accent] [tf] ["05]
+ % Why is mathring not defined??
+ \definemathsymbol [mathring] [accent] [tf] ["17]
+\stopmathcollection
+
+\startmathcollection[lbr:ec]
+ \definemathsymbol [acute] [accent] [tf] ["01]
+ \definemathsymbol [grave] [accent] [tf] ["00]
+ \definemathsymbol [ddot] [accent] [tf] ["04]
+ \definemathsymbol [tilde] [accent] [tf] ["03]
+ \definemathsymbol [bar] [accent] [tf] ["09]
+ \definemathsymbol [breve] [accent] [tf] ["08]
+ \definemathsymbol [check] [accent] [tf] ["07]
+ \definemathsymbol [hat] [accent] [tf] ["02]
+ \definemathsymbol [dot] [accent] [tf] ["0A]
+ % Why is mathring not defined??
+ \definemathsymbol [mathring] [accent] [tf] ["06]
+\stopmathcollection
+
+\def\LBRroot#1#2%
+ {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1\sqrt{#2}$}
+ \dimen@\ht\zerocount \advance\dimen@-\dp\zerocount
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-7.5mu \box\zerocount}
+
+\def\LBRmatrix#1%
+ {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-0.9\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-0.9\baselineskip}}}\,}
+
+\startrawmathcollection[lbr]
+
+\definemathcommand [mathstrut] {\vphantom{f}}
+\definemathcommand [joinrel] {\mathrel{\mkern-4mu}}
+\definemathcommand [r@@t] {\LBRroot}
+\definemathcommand [matrix] {\LBRmatrix}
+
+\stoprawmathcollection
+
+\def\LBRbig {\@@dobig{8.20}}
+\def\LBRBig {\@@dobig{10.80}}
+\def\LBRbigg {\@@dobig{13.42}}
+\def\LBRBigg {\@@dobig{16.03}}
+\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}
+\definemathcommand [Big] {\LBRBig}
+\definemathcommand [bigg] {\LBRbigg}
+\definemathcommand [Bigg] {\LBRBigg}
+\definemathcommand [biggg] {\LBRbiggg}
+\definemathcommand [Biggg] {\LBRBiggg}
+
+\stoprawmathcollection
+
+\startrawmathcollection[lbr]
+
+\definemathcommand [bigggl] [open] {\biggg}
+\definemathcommand [bigggr] [close] {\biggg}
+\definemathcommand [Bigggl] [open] {\Biggg}
+\definemathcommand [Bigggr] [close] {\Biggg}
+
+\stoprawmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-map.lua b/tex/context/base/math-map.lua
new file mode 100644
index 000000000..2d34dc1c3
--- /dev/null
+++ b/tex/context/base/math-map.lua
@@ -0,0 +1,440 @@
+if not modules then modules = { } end modules ['math-map'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Remapping mathematics alphabets.</p>
+--ldx]]--
+
+-- oldstyle: not really mathematics but happened to be part of
+-- the mathematics fonts in cmr
+--
+-- persian: we will also provide mappers for other
+-- scripts
+
+-- todo: alphabets namespace
+-- maybe: script/scriptscript dynamic,
+
+local type, next = type, next
+local floor = math.floor
+
+local texattribute = tex.attribute
+
+local trace_greek = false trackers.register("math.greek", function(v) trace_greek = v end)
+
+mathematics = mathematics or { }
+
+-- we could use one level less and have tf etc be tables directly but the
+-- following approach permits easier remapping of a-a, A-Z and 0-9 to
+-- fallbacks; symbols is currently mostly greek
+
+mathematics.alphabets = {
+ regular = {
+ tf = {
+ digits = 0x00030,
+ ucletters = 0x00041,
+ lcletters = 0x00061,
+ ucgreek = {
+ [0x0391]=0x0391, [0x0392]=0x0392, [0x0393]=0x0393, [0x0394]=0x0394, [0x0395]=0x0395,
+ [0x0396]=0x0396, [0x0397]=0x0397, [0x0398]=0x0398, [0x0399]=0x0399, [0x039A]=0x039A,
+ [0x039B]=0x039B, [0x039C]=0x039C, [0x039D]=0x039D, [0x039E]=0x039E, [0x039F]=0x039F,
+ [0x03A0]=0x03A0, [0x03A1]=0x03A1, [0x03A3]=0x03A3, [0x03A4]=0x03A4, [0x03A5]=0x03A5,
+ [0x03A6]=0x03A6, [0x03A7]=0x03A7, [0x03A8]=0x03A8, [0x03A9]=0x03A9,
+ },
+ lcgreek = {
+ [0x03B1]=0x03B1, [0x03B2]=0x03B2, [0x03B3]=0x03B3, [0x03B4]=0x03B4, [0x03B5]=0x03B5,
+ [0x03B6]=0x03B6, [0x03B7]=0x03B7, [0x03B8]=0x03B8, [0x03B9]=0x03B9, [0x03BA]=0x03BA,
+ [0x03BB]=0x03BB, [0x03BC]=0x03BC, [0x03BD]=0x03BD, [0x03BE]=0x03BE, [0x03BF]=0x03BF,
+ [0x03C0]=0x03C0, [0x03C1]=0x03C1, [0x03C2]=0x03C2, [0x03C3]=0x03C3, [0x03C4]=0x03C4,
+ [0x03C5]=0x03C5, [0x03C6]=0x03C6, [0x03C7]=0x03C7, [0x03C8]=0x03C8, [0x03C9]=0x03C9,
+ [0x03D1]=0x03D1, [0x03D5]=0x03D5, [0x03D6]=0x03D6, [0x03F0]=0x03F0, [0x03F1]=0x03F1,
+ [0x03F4]=0x03F4, [0x03F5]=0x03F5,
+ },
+ symbols = {
+ [0x2202]=0x2202, [0x2207]=0x2207,
+ },
+ },
+ it = {
+ ucletters = 0x1D434,
+ lcletters = { -- H
+ [0x00061]=0x1D44E, [0x00062]=0x1D44F, [0x00063]=0x1D450, [0x00064]=0x1D451, [0x00065]=0x1D452,
+ [0x00066]=0x1D453, [0x00067]=0x1D454, [0x00068]=0x0210E, [0x00069]=0x1D456, [0x0006A]=0x1D457,
+ [0x0006B]=0x1D458, [0x0006C]=0x1D459, [0x0006D]=0x1D45A, [0x0006E]=0x1D45B, [0x0006F]=0x1D45C,
+ [0x00070]=0x1D45D, [0x00071]=0x1D45E, [0x00072]=0x1D45F, [0x00073]=0x1D460, [0x00074]=0x1D461,
+ [0x00075]=0x1D462, [0x00076]=0x1D463, [0x00077]=0x1D464, [0x00078]=0x1D465, [0x00079]=0x1D466,
+ [0x0007A]=0x1D467,
+ },
+ ucgreek = {
+ [0x0391]=0x1D6E2, [0x0392]=0x1D6E3, [0x0393]=0x1D6E4, [0x0394]=0x1D6E5, [0x0395]=0x1D6E6,
+ [0x0396]=0x1D6E7, [0x0397]=0x1D6E8, [0x0398]=0x1D6E9, [0x0399]=0x1D6EA, [0x039A]=0x1D6EB,
+ [0x039B]=0x1D6EC, [0x039C]=0x1D6ED, [0x039D]=0x1D6EE, [0x039E]=0x1D6EF, [0x039F]=0x1D6F0,
+ [0x03A0]=0x1D6F1, [0x03A1]=0x1D6F2, [0x03A3]=0x1D6F4, [0x03A4]=0x1D6F5, [0x03A5]=0x1D6F6,
+ [0x03A6]=0x1D6F7, [0x03A7]=0x1D6F8, [0x03A8]=0x1D6F9, [0x03A9]=0x1D6FA,
+ },
+ lcgreek = {
+ [0x03B1]=0x1D6FC, [0x03B2]=0x1D6FD, [0x03B3]=0x1D6FE, [0x03B4]=0x1D6FF, [0x03B5]=0x1D700,
+ [0x03B6]=0x1D701, [0x03B7]=0x1D702, [0x03B8]=0x1D703, [0x03B9]=0x1D704, [0x03BA]=0x1D705,
+ [0x03BB]=0x1D706, [0x03BC]=0x1D707, [0x03BD]=0x1D708, [0x03BE]=0x1D709, [0x03BF]=0x1D70A,
+ [0x03C0]=0x1D70B, [0x03C1]=0x1D70C, [0x03C2]=0x1D70D, [0x03C3]=0x1D70E, [0x03C4]=0x1D70F,
+ [0x03C5]=0x1D710, [0x03C6]=0x1D711, [0x03C7]=0x1D712, [0x03C8]=0x1D713, [0x03C9]=0x1D714,
+ [0x03D1]=0x1D717, [0x03D5]=0x1D719, [0x03D6]=0x1D71B, [0x03F0]=0x1D718, [0x03F1]=0x1D71A,
+ [0x03F4]=0x1D6F3, [0x03F5]=0x1D716,
+ },
+ symbols = {
+ [0x2202]=0x1D715, [0x2207]=0x1D6FB,
+ },
+ },
+ bf= {
+ digits = 0x1D7CE,
+ ucletters = 0x1D400,
+ lcletters = 0x1D41A,
+ ucgreek = {
+ [0x0391]=0x1D6A8, [0x0392]=0x1D6A9, [0x0393]=0x1D6AA, [0x0394]=0x1D6AB, [0x0395]=0x1D6AC,
+ [0x0396]=0x1D6AD, [0x0397]=0x1D6AE, [0x0398]=0x1D6AF, [0x0399]=0x1D6B0, [0x039A]=0x1D6B1,
+ [0x039B]=0x1D6B2, [0x039C]=0x1D6B3, [0x039D]=0x1D6B4, [0x039E]=0x1D6B5, [0x039F]=0x1D6B6,
+ [0x03A0]=0x1D6B7, [0x03A1]=0x1D6B8, [0x03A3]=0x1D6BA, [0x03A4]=0x1D6BB, [0x03A5]=0x1D6BC,
+ [0x03A6]=0x1D6BD, [0x03A7]=0x1D6BE, [0x03A8]=0x1D6BF, [0x03A9]=0x1D6C0,
+ },
+ lcgreek = {
+ [0x03B1]=0x1D6C2, [0x03B2]=0x1D6C3, [0x03B3]=0x1D6C4, [0x03B4]=0x1D6C5, [0x03B5]=0x1D6C6,
+ [0x03B6]=0x1D6C7, [0x03B7]=0x1D6C8, [0x03B8]=0x1D6C9, [0x03B9]=0x1D6CA, [0x03BA]=0x1D6CB,
+ [0x03BB]=0x1D6CC, [0x03BC]=0x1D6CD, [0x03BD]=0x1D6CE, [0x03BE]=0x1D6CF, [0x03BF]=0x1D6D0,
+ [0x03C0]=0x1D6D1, [0x03C1]=0x1D6D2, [0x03C2]=0x1D6D3, [0x03C3]=0x1D6D4, [0x03C4]=0x1D6D5,
+ [0x03C5]=0x1D6D6, [0x03C6]=0x1D6D7, [0x03C7]=0x1D6D8, [0x03C8]=0x1D6D9, [0x03C9]=0x1D6DA,
+ [0x03D1]=0x1D6DD, [0x03D5]=0x1D6DF, [0x03D6]=0x1D6E1, [0x03F0]=0x1D6DE, [0x03F1]=0x1D6E0,
+ [0x03F4]=0x1D6B9, [0x03F5]=0x1D6DC,
+ },
+ symbols = {
+ [0x2202]=0x1D6DB, [0x2207]=0x1D6C1,
+ },
+ },
+ bi = {
+ ucletters = 0x1D468,
+ lcletters = 0x1D482,
+ ucgreek = {
+ [0x0391]=0x1D71C, [0x0392]=0x1D71D, [0x0393]=0x1D71E, [0x0394]=0x1D71F, [0x0395]=0x1D720,
+ [0x0396]=0x1D721, [0x0397]=0x1D722, [0x0398]=0x1D723, [0x0399]=0x1D724, [0x039A]=0x1D725,
+ [0x039B]=0x1D726, [0x039C]=0x1D727, [0x039D]=0x1D728, [0x039E]=0x1D729, [0x039F]=0x1D72A,
+ [0x03A0]=0x1D72B, [0x03A1]=0x1D72C, [0x03A3]=0x1D72E, [0x03A4]=0x1D72F, [0x03A5]=0x1D730,
+ [0x03A6]=0x1D731, [0x03A7]=0x1D732, [0x03A8]=0x1D733, [0x03A9]=0x1D734,
+ },
+ lcgreek = {
+ [0x03B1]=0x1D736, [0x03B2]=0x1D737, [0x03B3]=0x1D738, [0x03B4]=0x1D739, [0x03B5]=0x1D73A,
+ [0x03B6]=0x1D73B, [0x03B7]=0x1D73C, [0x03B8]=0x1D73D, [0x03B9]=0x1D73E, [0x03BA]=0x1D73F,
+ [0x03BB]=0x1D740, [0x03BC]=0x1D741, [0x03BD]=0x1D742, [0x03BE]=0x1D743, [0x03BF]=0x1D744,
+ [0x03C0]=0x1D745, [0x03C1]=0x1D746, [0x03C2]=0x1D747, [0x03C3]=0x1D748, [0x03C4]=0x1D749,
+ [0x03C5]=0x1D74A, [0x03C6]=0x1D74B, [0x03C7]=0x1D74C, [0x03C8]=0x1D74D, [0x03C9]=0x1D74E,
+ [0x03D1]=0x1D751, [0x03D5]=0x1D753, [0x03D6]=0x1D755, [0x03F0]=0x1D752, [0x03F1]=0x1D754,
+ [0x03F4]=0x1D72D, [0x03F5]=0x1D750,
+ },
+ symbols = {
+ [0x2202]=0x1D74F, [0x2207]=0x1D735,
+ },
+ },
+ },
+ sansserif = {
+ tf = {
+ digits = 0x1D7E2,
+ ucletters = 0x1D5A0,
+ lcletters = 0x1D5BA,
+ },
+ it = {
+ ucletters = 0x1D608,
+ lcletters = 0x1D622,
+ },
+ bf = {
+ digits = 0x1D7EC,
+ ucletters = 0x1D5D4,
+ lcletters = 0x1D5EE,
+ ucgreek = {
+ [0x0391]=0x1D756, [0x0392]=0x1D757, [0x0393]=0x1D758, [0x0394]=0x1D759, [0x0395]=0x1D75A,
+ [0x0396]=0x1D75B, [0x0397]=0x1D75C, [0x0398]=0x1D75D, [0x0399]=0x1D75E, [0x039A]=0x1D75F,
+ [0x039B]=0x1D760, [0x039C]=0x1D761, [0x039D]=0x1D762, [0x039E]=0x1D763, [0x039F]=0x1D764,
+ [0x03A0]=0x1D765, [0x03A1]=0x1D766, [0x03A3]=0x1D768, [0x03A4]=0x1D769, [0x03A5]=0x1D76A,
+ [0x03A6]=0x1D76B, [0x03A7]=0x1D76C, [0x03A8]=0x1D76D, [0x03A9]=0x1D76E,
+ },
+ lcgreek = {
+ [0x03B1]=0x1D770, [0x03B2]=0x1D771, [0x03B3]=0x1D772, [0x03B4]=0x1D773, [0x03B5]=0x1D774,
+ [0x03B6]=0x1D775, [0x03B7]=0x1D776, [0x03B8]=0x1D777, [0x03B9]=0x1D778, [0x03BA]=0x1D779,
+ [0x03BB]=0x1D77A, [0x03BC]=0x1D77B, [0x03BD]=0x1D77C, [0x03BE]=0x1D77D, [0x03BF]=0x1D77E,
+ [0x03C0]=0x1D77F, [0x03C1]=0x1D780, [0x03C2]=0x1D781, [0x03C3]=0x1D782, [0x03C4]=0x1D783,
+ [0x03C5]=0x1D784, [0x03C6]=0x1D785, [0x03C7]=0x1D786, [0x03C8]=0x1D787, [0x03C9]=0x1D788,
+ [0x03D1]=0x1D78B, [0x03D5]=0x1D78D, [0x03D6]=0x1D78F, [0x03F0]=0x1D78C, [0x03F1]=0x1D78E,
+ [0x03F4]=0x1D767, [0x03F5]=0x1D78A,
+ },
+ symbols = {
+ [0x2202]=0x1D789, [0x2207]=0x1D76F,
+ },
+ },
+ bi = {
+ ucletters = 0x1D63C,
+ lcletters = 0x1D656,
+ ucgreek = {
+ [0x0391]=0x1D790, [0x0392]=0x1D791, [0x0393]=0x1D792, [0x0394]=0x1D793, [0x0395]=0x1D794,
+ [0x0396]=0x1D795, [0x0397]=0x1D796, [0x0398]=0x1D797, [0x0399]=0x1D798, [0x039A]=0x1D799,
+ [0x039B]=0x1D79A, [0x039C]=0x1D79B, [0x039D]=0x1D79C, [0x039E]=0x1D79D, [0x039F]=0x1D79E,
+ [0x03A0]=0x1D79F, [0x03A1]=0x1D7A0, [0x03A3]=0x1D7A2, [0x03A4]=0x1D7A3, [0x03A5]=0x1D7A4,
+ [0x03A6]=0x1D7A5, [0x03A7]=0x1D7A6, [0x03A8]=0x1D7A7, [0x03A9]=0x1D7A8,
+ },
+ lcgreek = {
+ [0x03B1]=0x1D7AA, [0x03B2]=0x1D7AB, [0x03B3]=0x1D7AC, [0x03B4]=0x1D7AD, [0x03B5]=0x1D7AE,
+ [0x03B6]=0x1D7AF, [0x03B7]=0x1D7B0, [0x03B8]=0x1D7B1, [0x03B9]=0x1D7B2, [0x03BA]=0x1D7B3,
+ [0x03BB]=0x1D7B4, [0x03BC]=0x1D7B5, [0x03BD]=0x1D7B6, [0x03BE]=0x1D7B7, [0x03BF]=0x1D7B8,
+ [0x03C0]=0x1D7B9, [0x03C1]=0x1D7BA, [0x03C2]=0x1D7BB, [0x03C3]=0x1D7BC, [0x03C4]=0x1D7BD,
+ [0x03C5]=0x1D7BE, [0x03C6]=0x1D7BF, [0x03C7]=0x1D7C0, [0x03C8]=0x1D7C1, [0x03C9]=0x1D7C2,
+ [0x03D1]=0x1D7C5, [0x03D5]=0x1D7C7, [0x03D6]=0x1D7C9, [0x03F0]=0x1D7C6, [0x03F1]=0x1D7C8,
+ [0x03F4]=0x1D7A1, [0x03F5]=0x1D7C4,
+ },
+ symbols = {
+ [0x2202]=0x1D7C3, [0x2207]=0x1D7A9,
+ },
+ },
+ },
+ monospaced = {
+ tf = {
+ digits = 0x1D7F6,
+ ucletters = 0x1D670,
+ lcletters = 0x1D68A,
+ },
+ },
+ blackboard = { -- ok
+ tf = {
+ digits = 0x1D7D8,
+ ucletters = { -- C H N P Q R Z
+ [0x00041]=0x1D538, [0x00042]=0x1D539, [0x00043]=0x02102, [0x00044]=0x1D53B, [0x00045]=0x1D53C,
+ [0x00046]=0x1D53D, [0x00047]=0x1D53E, [0x00048]=0x0210D, [0x00049]=0x1D540, [0x0004A]=0x1D541,
+ [0x0004B]=0x1D542, [0x0004C]=0x1D543, [0x0004D]=0x1D544, [0x0004E]=0x02115, [0x0004F]=0x1D546,
+ [0x00050]=0x02119, [0x00051]=0x0211A, [0x00052]=0x0211D, [0x00053]=0x1D54A, [0x00054]=0x1D54B,
+ [0x00055]=0x1D54C, [0x00056]=0x1D54D, [0x00057]=0x1D54E, [0x00058]=0x1D54F, [0x00059]=0x1D550,
+ [0x0005A]=0x02124,
+ },
+ lcletters = 0x1D552,
+ lcgreek = { -- gamma pi
+ [0x03B3]=0x0213C, [0x03C0]=0x0213D,
+ },
+ ucgreek = { -- Gamma pi
+ [0x0393]=0x0213E, [0x03A0]=0x0213F,
+ },
+ symbols = { -- sum
+ [0x2211]=0x02140,
+ },
+ },
+ },
+ fraktur = { -- ok
+ tf= {
+ ucletters = { -- C H I R Z
+ [0x00041]=0x1D504, [0x00042]=0x1D505, [0x00043]=0x0212D, [0x00044]=0x1D507, [0x00045]=0x1D508,
+ [0x00046]=0x1D509, [0x00047]=0x1D50A, [0x00048]=0x0210C, [0x00049]=0x02111, [0x0004A]=0x1D50D,
+ [0x0004B]=0x1D50E, [0x0004C]=0x1D50F, [0x0004D]=0x1D510, [0x0004E]=0x1D511, [0x0004F]=0x1D512,
+ [0x00050]=0x1D513, [0x00051]=0x1D514, [0x00052]=0x0211C, [0x00053]=0x1D516, [0x00054]=0x1D517,
+ [0x00055]=0x1D518, [0x00056]=0x1D519, [0x00057]=0x1D51A, [0x00058]=0x1D51B, [0x00059]=0x1D51C,
+ [0x0005A]=0x02128,
+ },
+ lcletters = 0x1D51E,
+ },
+ bf = {
+ ucletters = 0x1D56C,
+ lcletters = 0x1D586,
+ },
+ },
+ script = {
+ tf= {
+ ucletters = { -- B E F H I L M R -- P 2118
+ [0x00041]=0x1D49C, [0x00042]=0x0212C, [0x00043]=0x1D49E, [0x00044]=0x1D49F, [0x00045]=0x02130,
+ [0x00046]=0x02131, [0x00047]=0x1D4A2, [0x00048]=0x0210B, [0x00049]=0x02110, [0x0004A]=0x1D4A5,
+ [0x0004B]=0x1D4A6, [0x0004C]=0x02112, [0x0004D]=0x02133, [0x0004E]=0x1D4A9, [0x0004F]=0x1D4AA,
+ [0x00050]=0x1D4AB, [0x00051]=0x1D4AC, [0x00052]=0x0211B, [0x00053]=0x1D4AE, [0x00054]=0x1D4AF,
+ [0x00055]=0x1D4B0, [0x00056]=0x1D4B1, [0x00057]=0x1D4B2, [0x00058]=0x1D4B3, [0x00059]=0x1D4B4,
+ [0x0005A]=0x1D4B5,
+ },
+ lcletters = { -- E G O -- L 2113
+ [0x00061]=0x1D4B6, [0x00062]=0x1D4B7, [0x00063]=0x1D4B8, [0x00064]=0x1D4B9, [0x00065]=0x0212F,
+ [0x00066]=0x1D4BB, [0x00067]=0x0210A, [0x00068]=0x1D4BD, [0x00069]=0x1D4BE, [0x0006A]=0x1D4BF,
+ [0x0006B]=0x1D4C0, [0x0006C]=0x1D4C1, [0x0006D]=0x1D4C2, [0x0006E]=0x1D4C3, [0x0006F]=0x02134,
+ [0x00070]=0x1D4C5, [0x00071]=0x1D4C6, [0x00072]=0x1D4C7, [0x00073]=0x1D4C8, [0x00074]=0x1D4C9,
+ [0x00075]=0x1D4CA, [0x00076]=0x1D4CB, [0x00077]=0x1D4CC, [0x00078]=0x1D4CD, [0x00079]=0x1D4CE,
+ [0x0007A]=0x1D4CF,
+ }
+ },
+ bf = {
+ ucletters = 0x1D4D0,
+ lcletters = 0x1D4EA,
+ },
+ },
+}
+
+local alphabets = mathematics.alphabets
+local mathremap = { }
+
+for alphabet, styles in next, alphabets do
+ for style, data in next, styles do
+ -- let's keep the long names (for tracing)
+ local n = #mathremap + 1
+ data.attribute = n
+ data.alphabet = alphabet
+ data.style = style
+ mathremap[n] = data
+ end
+end
+
+-- beware, these are shared tables (no problem since they're not
+-- in unicode)
+
+alphabets.regular.it.digits = alphabets.regular.tf.digits
+alphabets.regular.bi.digits = alphabets.regular.bf.digits
+
+alphabets.sansserif.tf.symbols = alphabets.regular.tf.symbols
+alphabets.sansserif.tf.lcgreek = alphabets.regular.tf.lcgreek
+alphabets.sansserif.tf.ucgreek = alphabets.regular.tf.ucgreek
+alphabets.sansserif.tf.digits = alphabets.regular.tf.digits
+alphabets.sansserif.it.symbols = alphabets.regular.tf.symbols
+alphabets.sansserif.it.lcgreek = alphabets.regular.tf.lcgreek
+alphabets.sansserif.it.ucgreek = alphabets.regular.tf.ucgreek
+alphabets.sansserif.bi.digits = alphabets.regular.bf.digits
+
+alphabets.monospaced.tf.symbols = alphabets.sansserif.tf.symbols
+alphabets.monospaced.tf.lcgreek = alphabets.sansserif.tf.lcgreek
+alphabets.monospaced.tf.ucgreek = alphabets.sansserif.tf.ucgreek
+alphabets.monospaced.it = alphabets.sansserif.tf
+alphabets.monospaced.bf = alphabets.sansserif.tf
+alphabets.monospaced.bi = alphabets.sansserif.bf
+
+alphabets.blackboard.tf.symbols = table.merge(alphabets.regular.tf.symbols, alphabets.blackboard.tf.symbols)
+alphabets.blackboard.tf.lcgreek = table.merge(alphabets.regular.tf.lcgreek, alphabets.blackboard.tf.lcgreek)
+alphabets.blackboard.tf.ucgreek = table.merge(alphabets.regular.tf.ucgreek, alphabets.blackboard.tf.ucgreek)
+
+alphabets.blackboard.it = alphabets.blackboard.tf
+alphabets.blackboard.bf = alphabets.blackboard.tf
+alphabets.blackboard.bi = alphabets.blackboard.bf
+
+alphabets.fraktur.tf.digits = alphabets.regular.tf.digits
+alphabets.fraktur.tf.symbols = alphabets.regular.tf.symbols
+alphabets.fraktur.tf.lcgreek = alphabets.regular.tf.lcgreek
+alphabets.fraktur.tf.ucgreek = alphabets.regular.tf.ucgreek
+alphabets.fraktur.bf.digits = alphabets.regular.bf.digits
+alphabets.fraktur.bf.symbols = alphabets.regular.bf.symbols
+alphabets.fraktur.bf.lcgreek = alphabets.regular.bf.lcgreek
+alphabets.fraktur.bf.ucgreek = alphabets.regular.bf.ucgreek
+alphabets.fraktur.it = alphabets.fraktur.tf
+alphabets.fraktur.bi = alphabets.fraktur.bf
+
+alphabets.script.tf.digits = alphabets.regular.tf.digits
+alphabets.script.tf.symbols = alphabets.regular.tf.symbols
+alphabets.script.tf.lcgreek = alphabets.regular.tf.lcgreek
+alphabets.script.tf.ucgreek = alphabets.regular.tf.ucgreek
+alphabets.script.bf.digits = alphabets.regular.bf.digits
+alphabets.script.bf.symbols = alphabets.regular.bf.symbols
+alphabets.script.bf.lcgreek = alphabets.regular.bf.lcgreek
+alphabets.script.bf.ucgreek = alphabets.regular.bf.ucgreek
+alphabets.script.it = alphabets.script.tf
+alphabets.script.bi = alphabets.script.bf
+
+alphabets.tt = alphabets.monospaced
+alphabets.ss = alphabets.sansserif
+alphabets.rm = alphabets.regular
+alphabets.bb = alphabets.blackboard
+alphabets.fr = alphabets.fraktur
+alphabets.sr = alphabets.script
+
+alphabets.serif = alphabets.regular
+alphabets.type = alphabets.monospaced
+alphabets.teletype = alphabets.monospaced
+
+function mathematics.to_a_style(attribute)
+ local r = mathremap[attribute]
+ return r and r.style or "tf"
+end
+
+function mathematics.to_a_name(attribute)
+ local r = mathremap[attribute]
+ return r and r.alphabet or "regular"
+end
+
+-- of course we could do some div/mod trickery instead
+
+local mathalphabet = attributes.private("mathalphabet")
+
+function mathematics.sync_a_both(alphabet,style)
+ local data = alphabets[alphabet or "regular"] or alphabets.regular
+ data = data[style or "tf"] or data.tf
+ texattribute[mathalphabet] = data and data.attribute or texattribute[mathalphabet]
+end
+
+function mathematics.sync_a_style(style)
+--~ local r = mathremap[mathalphabet]
+ local r = mathremap[texattribute[mathalphabet]]
+ local alphabet = r and r.alphabet or "regular"
+ local data = alphabets[alphabet][style]
+ texattribute[mathalphabet] = data and data.attribute or texattribute[mathalphabet]
+end
+
+function mathematics.sync_a_name(alphabet)
+--~ local r = mathremap[mathalphabet]
+ local r = mathremap[texattribute[mathalphabet]]
+ local style = r and r.style or "tf"
+ local data = alphabets[alphabet][style]
+ texattribute[mathalphabet] = data and data.attribute or texattribute[mathalphabet]
+end
+
+local issymbol = mathematics.alphabets.regular.tf.symbols
+local islcgreek = mathematics.alphabets.regular.tf.lcgreek
+local isucgreek = mathematics.alphabets.regular.tf.ucgreek
+
+local remapping = {
+ [1] = { what = "unchanged" }, -- upright
+ [2] = { what = "upright", it = "tf", bi = "bf" }, -- upright
+ [3] = { what = "italic", tf = "it", bf = "bi" }, -- italic
+}
+
+function mathematics.remap_alphabets(char,mathalphabet,mathgreek)
+ if mathgreek > 0 then
+ local lc, uc = floor(mathgreek/10), mathgreek % 10 -- 2 == upright 3 == italic
+ if lc > 1 or uc > 1 then
+ local islc, isuc = islcgreek[char] and lc, isucgreek[char] and uc
+ if islc or isuc then
+ local r = mathremap[mathalphabet] -- what if 0
+ local alphabet = r and r.alphabet or "regular"
+ local style = r and r.style or "tf"
+ if trace_greek then
+ logs.report("math","before: char: %05X, alphabet: %s %s, lcgreek: %s, ucgreek: %s",char,alphabet,style,remapping[lc].what,remapping[uc].what)
+ end
+ local s = remapping[islc or isuc][style]
+ if s then
+ local data = alphabets[alphabet][s]
+ mathalphabet, style = data and data.attribute or mathalphabet, s
+ end
+ if trace_greek then
+ logs.report("math","after : char: %05X, alphabet: %s %s, lcgreek: %s, ucgreek: %s",char,alphabet,style,remapping[lc].what,remapping[uc].what)
+ end
+ end
+ end
+ end
+ if mathalphabet > 0 then
+ local newchar
+ local offset = mathremap[mathalphabet]
+ if not offset then
+ -- nothing to remap
+ elseif char >= 0x030 and char <= 0x039 then
+ local o = offset.digits
+ newchar = (type(o) == "table" and (o[char] or char)) or (char - 0x030 + o)
+ elseif char >= 0x041 and char <= 0x05A then
+ local o = offset.ucletters
+ newchar = (type(o) == "table" and (o[char] or char)) or (char - 0x041 + o)
+ elseif char >= 0x061 and char <= 0x07A then
+ local o = offset.lcletters
+ newchar = (type(o) == "table" and (o[char] or char)) or (char - 0x061 + o)
+ elseif islcgreek[char] then
+ newchar = offset.lcgreek[char]
+ elseif isucgreek[char] then
+ newchar = offset.ucgreek[char]
+ elseif issymbol[char] then
+ newchar = offset.symbols[char]
+ end
+ return newchar ~= char and newchar
+ end
+ return nil
+end
diff --git a/tex/context/base/math-noa.lua b/tex/context/base/math-noa.lua
new file mode 100644
index 000000000..02bbe0a62
--- /dev/null
+++ b/tex/context/base/math-noa.lua
@@ -0,0 +1,369 @@
+if not modules then modules = { } end modules ['math-noa'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- beware: this is experimental code and there will be a more
+-- generic (attribute value driven) interface too but for the
+-- moment this is ok
+
+local utf = unicode.utf8
+
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local mlist_to_hlist = node.mlist_to_hlist
+local font_of_family = node.family_font
+local fontdata = fonts.identifiers
+
+local format, rep = string.format, string.rep
+local utfchar, utfbyte = utf.char, utf.byte
+
+noads = noads or { }
+
+local trace_remapping = false trackers.register("math.remapping", function(v) trace_remapping = v end)
+local trace_processing = false trackers.register("math.processing", function(v) trace_processing = v end)
+local trace_analyzing = false trackers.register("math.analyzing", function(v) trace_analyzing = v end)
+
+local noad_ord = 0
+local noad_op_displaylimits = 1
+local noad_op_limits = 2
+local noad_op_nolimits = 3
+local noad_bin = 4
+local noad_rel = 5
+local noad_open = 6
+local noad_close = 7
+local noad_punct = 8
+local noad_inner = 9
+local noad_under = 10
+local noad_over = 11
+local noad_vcenter = 12
+
+-- obsolete:
+--
+-- math_ord = node.id("ord") -- attr nucleus sub sup
+-- math_op = node.id("op") -- attr nucleus sub sup subtype
+-- math_bin = node.id("bin") -- attr nucleus sub sup
+-- math_rel = node.id("rel") -- attr nucleus sub sup
+-- math_punct = node.id("punct") -- attr nucleus sub sup
+--
+-- math_open = node.id("open") -- attr nucleus sub sup
+-- math_close = node.id("close") -- attr nucleus sub sup
+--
+-- math_inner = node.id("inner") -- attr nucleus sub sup
+-- math_vcenter = node.id("vcenter") -- attr nucleus sub sup
+-- math_under = node.id("under") -- attr nucleus sub sup
+-- math_over = node.id("over") -- attr nucleus sub sup
+
+local math_noad = node.id("noad") -- attr nucleus sub sup
+
+local math_accent = node.id("accent") -- attr nucleus sub sup accent
+local math_radical = node.id("radical") -- attr nucleus sub sup left degree
+local math_fraction = node.id("fraction") -- attr nucleus sub sup left right
+
+local math_box = node.id("sub_box") -- attr list
+local math_sub = node.id("sub_mlist") -- attr list
+local math_char = node.id("math_char") -- attr fam char
+local math_text_char = node.id("math_text_char") -- attr fam char
+local math_delim = node.id("delim") -- attr small_fam small_char large_fam large_char
+local math_style = node.id("style") -- attr style
+local math_choice = node.id("choice") -- attr display text script scriptscript
+local math_fence = node.id("fence") -- attr subtype
+
+local simple_noads = table.tohash {
+ math_noad,
+}
+
+local all_noads = {
+ math_noad,
+ math_box, math_sub,
+ math_char, math_text_char, math_delim, math_style,
+ math_accent, math_radical, math_fraction, math_choice, math_fence,
+}
+
+noads.processors = noads.processors or { }
+
+local function process(start,what,n)
+ if n then n = n + 1 else n = 0 end
+ while start do
+ if trace_processing then
+ logs.report("math","%s%s",rep(" ",n or 0),tostring(start))
+ end
+ local id = start.id
+ local proc = what[id]
+ if proc then
+ proc(start,what,n)
+ elseif id == math_char or id == math_text_char or id == math_delim then
+ break
+ elseif id == math_style then
+ -- has a next
+ elseif id == math_noad then
+ local noad = start.nucleus if noad then process(noad,what,n) end -- list
+ noad = start.sup if noad then process(noad,what,n) end -- list
+ noad = start.sub if noad then process(noad,what,n) end -- list
+ elseif id == math_box or id == math_sub then
+ local noad = start.list if noad then process(noad,what,n) end -- list
+ elseif id == math_fraction then
+ local noad = start.num if noad then process(noad,what,n) end -- list
+ noad = start.denom if noad then process(noad,what,n) end -- list
+ noad = start.left if noad then process(noad,what,n) end -- delimiter
+ noad = start.right if noad then process(noad,what,n) end -- delimiter
+ elseif id == math_choice then
+ local noad = start.display if noad then process(noad,what,n) end -- list
+ noad = start.text if noad then process(noad,what,n) end -- list
+ noad = start.script if noad then process(noad,what,n) end -- list
+ noad = start.scriptscript if noad then process(noad,what,n) end -- list
+ elseif id == math_fence then
+ local noad = start.delim if noad then process(noad,what,n) end -- delimiter
+ elseif id == math_radical then
+ local noad = start.nucleus if noad then process(noad,what,n) end -- list
+ noad = start.sup if noad then process(noad,what,n) end -- list
+ noad = start.sub if noad then process(noad,what,n) end -- list
+ noad = start.left if noad then process(noad,what,n) end -- delimiter
+ noad = start.degree if noad then process(noad,what,n) end -- list
+ elseif id == math_accent then
+ local noad = start.nucleus if noad then process(noad,what,n) end -- list
+ noad = start.sup if noad then process(noad,what,n) end -- list
+ noad = start.sub if noad then process(noad,what,n) end -- list
+ noad = start.accent if noad then process(noad,what,n) end -- list
+ noad = start.bot_accent if noad then process(noad,what,n) end -- list
+ else
+ -- glue, penalty, etc
+ end
+ start = start.next
+ end
+end
+
+noads.process = process
+
+-- character remapping
+
+local mathalphabet = attributes.private("mathalphabet")
+local mathgreek = attributes.private("mathgreek")
+
+noads.processors.relocate = { }
+
+local function report_remap(tag,id,old,new,extra)
+ logs.report("math","remapping %s in font %s from U+%04X (%s) to U+%04X (%s)%s",tag,id,old,utfchar(old),new,utfchar(new),extra or "")
+end
+
+local remap_alphabets = mathematics.remap_alphabets
+local fcs = fonts.color.set
+
+-- we can have a global famdata == fonts.famdata and chrdata == fonts.chrdata
+
+--~ This does not work out well, as there are no fallbacks. Ok, we could
+--~ define a poor mans simplify mechanism.
+--~
+--~ local function checked(pointer)
+--~ local char = pointer.char
+--~ local fam = pointer.fam
+--~ local id = font_of_family(fam)
+--~ local tfmdata = fontdata[id]
+--~ local tc = tfmdata and tfmdata.characters
+--~ if not tc[char] then
+--~ local specials = characters.data[char].specials
+--~ if specials and (specials[1] == "char" or specials[1] == "font") then
+--~ newchar = specials[#specials]
+--~ if trace_remapping then
+--~ report_remap("fallback",id,char,newchar)
+--~ end
+--~ if trace_analyzing then
+--~ fcs(pointer,"font:isol")
+--~ end
+--~ pointer.char = newchar
+--~ return true
+--~ end
+--~ end
+--~ end
+
+noads.processors.relocate[math_char] = function(pointer)
+ local g = has_attribute(pointer,mathgreek) or 0
+ local a = has_attribute(pointer,mathalphabet) or 0
+ if a > 0 or g > 0 then
+ if a > 0 then
+ set_attribute(pointer,mathgreek,0)
+ end
+ if g > 0 then
+ set_attribute(pointer,mathalphabet,0)
+ end
+ local char = pointer.char
+ local newchar = remap_alphabets(char,a,g)
+ if newchar then
+ local fam = pointer.fam
+ local id = font_of_family(fam)
+ local tfmdata = fontdata[id]
+ if tfmdata and tfmdata.characters[newchar] then -- we could probably speed this up
+ if trace_remapping then
+ report_remap("char",id,char,newchar)
+ end
+ if trace_analyzing then
+ fcs(pointer,"font:isol")
+ end
+ pointer.char = newchar
+ return true
+ elseif trace_remapping then
+ report_remap("char",id,char,newchar," fails")
+ end
+ else
+ -- return checked(pointer)
+ end
+ else
+ -- return checked(pointer)
+ end
+ if trace_analyzing then
+ fcs(pointer,"font:medi")
+ end
+end
+
+noads.processors.relocate[math_text_char] = function(pointer)
+ if trace_analyzing then
+ fcs(pointer,"font:init")
+ end
+end
+
+noads.processors.relocate[math_delim] = function(pointer)
+ if trace_analyzing then
+ fcs(pointer,"font:fina")
+ end
+end
+
+function noads.relocate_characters(head,style,penalties)
+ process(head,noads.processors.relocate)
+ return true
+end
+
+-- some resize options (this works ok because the content is
+-- empty and no larger next will be forced)
+--
+-- beware: we don't use \delcode but \Udelcode and as such have
+-- no large_fam; also, we need to check for subtype and/or
+-- small_fam not being 0 because \. sits in 0,0 by default
+--
+-- todo: just replace the character by an ord noad
+-- and remove the right delimiter as well
+
+local mathsize = attributes.private("mathsize")
+
+noads.processors.resize = { }
+
+noads.processors.resize[math_fence] = function(pointer)
+ if pointer.subtype == 1 then -- left
+ local a = has_attribute(pointer,mathsize)
+ if a and a > 0 then
+ set_attribute(pointer,mathsize,0)
+ local d = pointer.delim
+ local df = d.small_fam
+ local id = font_of_family(df)
+ if id > 0 then
+ local ch = d.small_char
+ d.small_char = mathematics.big(fontdata[id],ch,a)
+ end
+ end
+ end
+end
+
+function noads.resize_characters(head,style,penalties)
+ process(head,noads.processors.resize)
+ return true
+end
+
+-- respacing
+
+local mathpunctuation = attributes.private("mathpunctuation")
+
+noads.processors.respace = { }
+
+local chardata = characters.data
+
+-- only [nd,ll,ul][po][nd,ll,ul]
+
+noads.processors.respace[math_noad] = function(pointer)
+ if pointer.subtype == noad_ord then
+ local a = has_attribute(pointer,mathpunctuation)
+ if a and a > 0 then
+ set_attribute(pointer,mathpunctuation,0)
+ local current_nucleus = pointer.nucleus
+ if current_nucleus.id == math_char then
+ local current_char = current_nucleus.char
+ local fc = chardata[current_char]
+ fc = fc and fc.category
+ if fc == "nd" or fc == "ll" or fc == "lu" then
+ local next_noad = pointer.next
+ if next_noad and next_noad.id == math_noad and next_noad.subtype == noad_punct then
+ local next_nucleus = next_noad.nucleus
+ if next_nucleus.id == math_char then
+ local next_char = next_nucleus.char
+ local nc = chardata[next_char]
+ nc = nc and nc.category
+ if nc == "po" then
+ local last_noad = next_noad.next
+ if last_noad and last_noad.id == math_noad and last_noad.subtype == noad_ord then
+ local last_nucleus = last_noad.nucleus
+ if last_nucleus.id == math_char then
+ local last_char = last_nucleus.char
+ local lc = chardata[last_char]
+ lc = lc and lc.category
+ if lc == "nd" or lc == "ll" or lc == "lu" then
+ local ord = node.new(math_noad) -- todo: pool
+ ord.subtype, ord.nucleus, ord.sub, ord.sup, ord.attr = noad_ord, next_noad.nucleus, next_noad.sub, next_noad.sup, next_noad.attr
+ -- next_noad.nucleus, next_noad.sub, next_noad.sup, next_noad.attr = nil, nil, nil, nil
+ next_noad.nucleus, next_noad.sub, next_noad.sup = nil, nil, nil -- else crash with attributes ref count
+ --~ next_noad.attr = nil
+ ord.next = last_noad
+ pointer.next = ord
+ node.free(next_noad)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+
+function noads.respace_characters(head,style,penalties)
+ noads.process(head,noads.processors.respace)
+ return true
+end
+
+-- the normal builder
+
+function noads.mlist_to_hlist(head,style,penalties)
+ return mlist_to_hlist(head,style,penalties), true
+end
+
+tasks.new (
+ "math",
+ {
+ "before",
+ "normalizers",
+ "builders",
+ "after",
+ }
+)
+
+local actions = tasks.actions("math",2) -- head, style, penalties
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+function nodes.processors.mlist_to_hlist(head,style,penalties)
+ starttiming(noads)
+ local head, done = actions(head,style,penalties)
+ stoptiming(noads)
+ return head, done
+end
+
+callbacks.register('mlist_to_hlist',nodes.processors.mlist_to_hlist,"preprocessing math list")
+
+-- tracing
+
+statistics.register("math processing time", function()
+ return statistics.elapsedseconds(noads)
+end)
diff --git a/tex/context/base/math-pln.mkii b/tex/context/base/math-pln.mkii
new file mode 100644
index 000000000..f2f3ff183
--- /dev/null
+++ b/tex/context/base/math-pln.mkii
@@ -0,0 +1,360 @@
+%D \module
+%D [ file=math-pln,
+%D version=2001.11.16,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Plain Helpers,
+%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.
+
+% \points should become \bodyfontsize
+
+%D This is a temporary module, some of this code will move to
+%D the other math modules.
+
+\writestatus{loading}{ConTeXt Math Macros / Plain Helpers}
+
+\unprotect
+
+\ifx\displ@y\undefined \let\displ@y\relax\fi
+
+\newbox\rootbox
+
+\def\root#1\of
+ {\setbox\rootbox\hbox{$\mathsurround\zeropoint\scriptscriptstyle{#1}$}%
+ \mathpalette\r@@t}
+
+\def\r@@t#1#2% will be overloaded
+ {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1\sqrt{#2}$}\dimen@\ht\zerocount
+ \advance\dimen@-\dp\zerocount
+ \mkern5mu\raise.6\dimen@\copy\rootbox
+ \mkern-10mu\box\zerocount}
+
+\def\mathhexbox#1#2#3%
+ {\leavevmode
+ \hbox{$\mathsurround\zeropoint\mathchar"#1#2#3$}}
+
+\def\oalign#1%
+ {\leavevmode
+ \vtop
+ {\baselineskip\zeroskip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}}
+
+\def\o@lign
+ {\lineskiplimit\zeropoint \oalign}
+
+\def\ooalign % chars over each other
+ {\lineskiplimit-\maxdimen
+ \oalign}
+
+\def\sh@ft#1% kern by #1 times the current slant
+ {\dimen@#1%
+ \kern\expandafter\withoutpt\the\slantperpoint
+ \dimen@}
+
+\def\dots
+ {\relax\ifmmode\ldots\else$\mathsurround\zeropoint\ldots\,$\fi}
+
+\def\hrulefill
+ {\leaders\hrule\hfill}
+
+\def\dotfill
+ {\cleaders\hbox{$\mathsurround\zeropoint \mkern1.5mu.\mkern1.5mu$}\hfill}
+
+\def\rightarrowfill
+ {$\mathsurround\zeropoint\smash-\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\mathord\rightarrow$}
+
+\def\leftarrowfill
+ {$\mathsurround\zeropoint\mathord\leftarrow\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\smash-$}
+
+% must go to math-tex
+
+\ifx\braceld\undefined
+ % mkii values
+ \mathchardef\braceld="37A
+ \mathchardef\bracerd="37B
+ \mathchardef\bracelu="37C
+ \mathchardef\braceru="37D
+\fi
+
+\def\downbracefill
+ {$\mathsurround\zeropoint\setbox\zerocount\hbox{$\braceld$}%
+ \braceld\leaders\vrule\!!height\ht\zerocount\!!depth\zeropoint\hfill\braceru
+ \bracelu\leaders\vrule\!!height\ht\zerocount\!!depth\zeropoint\hfill\bracerd$}
+
+\def\upbracefill
+ {$\mathsurround\zeropoint\setbox\zerocount\hbox{$\braceld$}%
+ \bracelu\leaders\vrule\!!height\ht\zerocount\!!depth\zeropoint\hfill\bracerd
+ \braceld\leaders\vrule\!!height\ht\zerocount\!!depth\zeropoint\hfill\braceru$}
+
+% hm, shouldn't that be \kern3\bodyfontsize
+
+\def\overbrace#1%
+ {\mathop{\vbox{\mathsurround\zeropoint\ialign{##\crcr\noalign{\kern3\points}
+ \downbracefill\crcr\noalign{\kern3\points\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+
+\def\underbrace#1%
+ {\mathop{\vtop{\mathsurround\zeropoint\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\points\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\points}}}}\limits}
+
+\let\sp=^ % will become obsolete
+\let\sb=_ % will become obsolete
+
+\ifx\,\undefined \def\,{\mskip \thinmuskip } \fi
+\ifx\>\undefined \def\>{\mskip \medmuskip } \fi
+\ifx\;\undefined \def\;{\mskip \thickmuskip} \fi
+\ifx\!\undefined \def\!{\mskip-\thinmuskip } \fi
+\ifx\*\undefined \def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} \fi
+
+% {\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+
+\def\activemathquote{^\bgroup\prim@s}
+
+\def\prim@s
+ {\prime\futurelet\next\pr@m@s}
+
+\def\pr@m@s
+ {\ifx'\next
+ \@EA\pr@@@s
+ \else\ifx^\next
+ \@EAEAEA\pr@@@t
+ \else
+ \@EAEAEA\egroup
+ \fi\fi}
+
+\def\pr@@@s#1%
+ {\prim@s}
+
+\def\pr@@@t#1#2%
+ {#2\egroup}
+
+% {\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\let\activemathunderscore\_
+
+\def\relbar {\mathrel{\smash-}} % - has the same height as +
+\def\Relbar {\mathrel=}
+
+\def\Longrightarrow {\Relbar\joinrel\Rightarrow}
+\def\longrightarrow {\relbar\joinrel\rightarrow}
+\def\longleftarrow {\leftarrow\joinrel\relbar}
+\def\Longleftarrow {\Leftarrow\joinrel\Relbar}
+\def\longmapsto {\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+
+\def\overrightarrow#1%
+ {\vbox{\mathsurround\zeropoint\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\onepoint\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+
+\def\overleftarrow#1%
+ {\vbox{\mathsurround\zeropoint\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\onepoint\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+
+\def\skew#1#2#3%
+ {{\muskip\zerocount#1mu\divide\muskip\zerocount\plustwo \mkern\muskip\zerocount
+ #2{\mkern-\muskip\zerocount{#3}\mkern\muskip\zerocount}\mkern-\muskip\zerocount}{}}
+
+\def\choose{\atopwithdelims()}
+\def\brack {\atopwithdelims[]}
+\def\brace {\atopwithdelims\{\}}
+
+\def\mathpalette#1#2%
+ {\mathchoice
+ {#1\displaystyle {#2}}%
+ {#1\textstyle {#2}}%
+ {#1\scriptstyle {#2}}%
+ {#1\scriptscriptstyle{#2}}}
+
+\def\cong
+ {\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+
+\def\@vereq#1#2%
+ {\lower.5\points\vbox{\lineskiplimit\maxdimen\lineskip-.5\points
+ \ialign{$\mathsurround\zeropoint#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+
+\def\notin% can be mkiv'd
+ {\mathrel{\mathpalette\c@ncel\in}}
+
+\def\c@ncel#1#2%
+ {\mathsurround\zeropoint\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+
+\def\rightleftharpoons%
+ {\mathrel{\mathpalette\rlh@{}}}
+
+\def\rlh@#1%
+ {\vcenter
+ {\mathsurround\zeropoint
+ \hbox
+ {\ooalign
+ {\raise2pt\hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+
+\def\buildrel#1\over#2%
+ {\mathrel{\mathop{\kern\zeropoint#2}\limits^{#1}}}
+
+\def\doteq
+ {\buildrel\textstyle.\over=}
+
+\ifx\mfunction\undefined \def\mfunction#1{\mathbin{\rm#1}} \fi
+
+\def\bmod
+ {\nonscript
+ \mskip-\medmuskip
+ \mkern5mu
+ \mfunction{mod}%
+ \penalty900
+ \mkern5mu
+ \nonscript
+ \mskip-\medmuskip}
+
+\def\pmod#1%
+ {\allowbreak
+ \mkern18mu
+ (\mfunction{mod}\,\,#1)}
+
+\def\cases#1%
+ {\left\{%
+ \,%
+ \vcenter
+ {\normalbaselines
+ \mathsurround\zeropoint
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}%
+ \right.}
+
+\def\matrix#1%
+ {\null
+ \,%
+ \vcenter
+ {\normalbaselines\mathsurround\zeropoint
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}%
+ \,}
+
+\def\pmatrix#1%
+ {\left(\matrix{#1}\right)}
+
+\newdimen\mathparentwd
+
+% \setbox0=\hbox{\tenex B} \mathparentwd=\wd0 % width of the big left (
+
+\def\bordermatrix#1%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox\zerocount\vbox
+ {\def\cr{\crcr\noalign{\kern2\points\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\points\kern\mathparentwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\plustwo\vbox
+ {\unvcopy\zerocount\global\setbox\plusone\lastbox}%
+ \setbox\plustwo\hbox
+ {\unhbox\plusone\unskip\global\setbox\plusone\lastbox}%
+ \setbox\plustwo\hbox
+ {$\kern\wd\plusone\kern-\mathparentwd\left(\kern-\wd\plusone
+ \global\setbox\plusone\vbox{\box\plusone\kern2\points}%
+ \vcenter{\kern-\ht\plusone\unvbox\zerocount\kern-\baselineskip}\,\right)$}%
+ \null
+ \;%
+ \vbox{\kern\ht\plusone\box\plustwo}%
+ \endgroup}
+
+% \def\openup{\afterassignment\@penup\dimen@=}
+%
+% \def\@penup{\advance\lineskip\dimen@
+% \advance\baselineskip\dimen@
+% \advance\lineskiplimit\dimen@}
+
+\def\openup
+ {\afterassignment\doopenup\scratchdimen=}
+
+\def\doopenup
+ {\advance\lineskip \scratchdimen
+ \advance\baselineskip \scratchdimen
+ \advance\lineskiplimit\scratchdimen}
+
+% \def\jot{.25\bodyfontsize} % plain tex: 3 pt (todo: better name and configurable)
+
+\def\displayopenupvalue{.25\bodyfontsize}
+
+\def\eqalign#1%
+ {\null
+ \,%
+ \vcenter
+ {\openup\displayopenupvalue % was \openup\jot
+ \mathsurround\zeropoint
+ \ialign
+ {\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil\crcr
+ #1\crcr}}%
+ \,}
+
+\def\@lign % restore inside \displ@y
+ {\tabskip\zeroskip
+ \everycr{}}
+
+\def\displaylines#1%
+ {\displ@y
+ \tabskip\zeroskip
+ \halign
+ {\hbox to \displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+
+\def\eqalignno#1%
+ {\displ@y
+ \tabskip\centering
+ \halign to \displaywidth
+ {\hfil$\@lign\displaystyle{##}$\tabskip\zeroskip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip\zeroskip\crcr
+ #1\crcr}}
+
+\def\leqalignno#1%
+ {\displ@y
+ \tabskip\centering
+ \halign to \displaywidth
+ {\hfil$\@lign\displaystyle{##}$\tabskip\zeroskip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+ #1\crcr}}
+
+% temporary here
+
+% \startcatcodetable \mthcatcodes
+% \setcatcodetable\ctxcatcodes
+% \catcode`\_ = 13
+% \catcode`\' = 13
+% \stopcatcodetable
+%
+% \letcatcodecommand \mthcatcodes `\_ \activemathunderscore
+% \letcatcodecommand \mthcatcodes `\' \activemathquote
+
+% \appendtoks \setcatcodetable\mthcatcodes \to \everymath : spoils xml
+
+% tricky, but some day we will reimplement math
+
+\bgroup
+ \catcode`\_ = 13
+ \catcode`\' = 13
+ \doglobal\appendtoks
+ \let_\activemathunderscore
+ \let'\activemathquote
+ \to \everymathematics
+\egroup
+
+% so far
+
+\protect \endinput
diff --git a/tex/context/base/math-pln.mkiv b/tex/context/base/math-pln.mkiv
new file mode 100644
index 000000000..ab584f10a
--- /dev/null
+++ b/tex/context/base/math-pln.mkiv
@@ -0,0 +1,298 @@
+%D \module
+%D [ file=math-pln,
+%D version=2001.11.16,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Plain Helpers,
+%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.
+
+%D This is a temporary module, some of this code will move to
+%D the other math modules. Much is copied from Plain \TEX.
+
+% \points should become \bodyfontsize
+
+\writestatus{loading}{ConTeXt Math Macros / Plain Helpers}
+
+\unprotect
+
+\ifx\displ@y\undefined \let\displ@y\relax\fi
+
+\def\oalign#1%
+ {\leavevmode
+ \vtop
+ {\baselineskip\zeroskip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}}
+
+\def\o@lign
+ {\lineskiplimit\zeropoint \oalign}
+
+\def\ooalign % chars over each other
+ {\lineskiplimit-\maxdimen
+ \oalign}
+
+\def\sh@ft#1% kern by #1 times the current slant
+ {\dimen@#1%
+ \kern\expandafter\withoutpt\the\slantperpoint
+ \dimen@}
+
+\def\dots
+ {\relax\ifmmode\ldots\else$\mathsurround\zeropoint\ldots\,$\fi}
+
+\def\hrulefill
+ {\leaders\hrule\hfill}
+
+\def\dotfill
+ {\cleaders\hbox{$\mathsurround\zeropoint \mkern1.5mu.\mkern1.5mu$}\hfill}
+
+\def\rightarrowfill
+ {$\mathsurround\zeropoint\smash-\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\mathord\rightarrow$}
+
+\def\leftarrowfill
+ {$\mathsurround\zeropoint\mathord\leftarrow\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\smash-$}
+
+\let\sp=^ % will become obsolete
+\let\sb=_ % will become obsolete
+
+\ifx\,\undefined \def\,{\mskip \thinmuskip } \fi
+\ifx\>\undefined \def\>{\mskip \medmuskip } \fi
+\ifx\;\undefined \def\;{\mskip \thickmuskip} \fi
+\ifx\!\undefined \def\!{\mskip-\thinmuskip } \fi
+\ifx\*\undefined \def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} \fi
+
+% {\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+
+\def\activemathquote{^\bgroup\prim@s}
+
+\def\prim@s
+ {\prime\futurelet\next\pr@m@s}
+
+\def\pr@m@s
+ {\ifx'\next
+ \@EA\pr@@@s
+ \else\ifx^\next
+ \@EAEAEA\pr@@@t
+ \else
+ \@EAEAEA\egroup
+ \fi\fi}
+
+\def\pr@@@s#1%
+ {\prim@s}
+
+\def\pr@@@t#1#2%
+ {#2\egroup}
+
+% {\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\let\activemathunderscore\_
+
+\def\relbar {\mathrel{\smash-}} % - has the same height as +
+\def\Relbar {\mathrel=}
+
+\def\Longrightarrow {\Relbar\joinrel\Rightarrow} % beware, this overloades cambria native
+\def\longrightarrow {\relbar\joinrel\rightarrow}
+\def\longleftarrow {\leftarrow\joinrel\relbar}
+\def\Longleftarrow {\Leftarrow\joinrel\Relbar}
+\def\longmapsto {\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+
+\def\choose{\atopwithdelims()}
+\def\brack {\atopwithdelims[]}
+\def\brace {\atopwithdelims\{\}}
+
+\def\mathpalette#1#2%
+ {\mathchoice
+ {#1\displaystyle {#2}}%
+ {#1\textstyle {#2}}%
+ {#1\scriptstyle {#2}}%
+ {#1\scriptscriptstyle{#2}}}
+
+\def\cong
+ {\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+
+\def\@vereq#1#2%
+ {\lower.5\points\vbox{\lineskiplimit\maxdimen\lineskip-.5\points
+ \ialign{$\mathsurround\zeropoint#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+
+\def\notin
+ {\mathrel{\mathpalette\c@ncel\in}}
+
+\def\c@ncel#1#2%
+ {\mathsurround\zeropoint\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+
+\def\rightleftharpoons
+ {\mathrel{\mathpalette\rlh@{}}}
+
+\def\rlh@#1%
+ {\vcenter
+ {\mathsurround\zeropoint
+ \hbox
+ {\ooalign
+ {\raise2pt\hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+
+\def\buildrel#1\over#2%
+ {\mathrel{\mathop{\kern\zeropoint#2}\limits^{#1}}}
+
+\def\doteq
+ {\buildrel\textstyle.\over=}
+
+\ifx\mfunction\undefined \def\mfunction#1{\mathbin{\rm#1}} \fi
+
+\def\bmod
+ {\nonscript
+ \mskip-\medmuskip
+ \mkern5mu
+ \mfunction{mod}%
+ \penalty900
+ \mkern5mu
+ \nonscript
+ \mskip-\medmuskip}
+
+\def\pmod#1%
+ {\allowbreak
+ \mkern18mu
+ (\mfunction{mod}\,\,#1)}
+
+\def\cases#1%
+ {\left\{%
+ \,%
+ \vcenter
+ {\normalbaselines
+ \mathsurround\zeropoint
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}%
+ \right.}
+
+\def\matrix#1%
+ {\null
+ \,%
+ \vcenter
+ {\normalbaselines\mathsurround\zeropoint
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}%
+ \,}
+
+\def\pmatrix#1%
+ {\left(\matrix{#1}\right)}
+
+\newdimen\mathparentwd
+
+% \setbox0=\hbox{\tenex B} \mathparentwd=\wd0 % width of the big left (
+
+\def\bordermatrix#1%
+ {\begingroup
+ \mathsurround\zeropoint
+ \setbox\zerocount\vbox
+ {\def\cr{\crcr\noalign{\kern2\points\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\points\kern\mathparentwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\plustwo\vbox
+ {\unvcopy\zerocount\global\setbox\plusone\lastbox}%
+ \setbox\plustwo\hbox
+ {\unhbox\plusone\unskip\global\setbox\plusone\lastbox}%
+ \setbox\plustwo\hbox
+ {$\kern\wd\plusone\kern-\mathparentwd\left(\kern-\wd\plusone
+ \global\setbox\plusone\vbox{\box\plusone\kern2\points}%
+ \vcenter{\kern-\ht\plusone\unvbox\zerocount\kern-\baselineskip}\,\right)$}%
+ \null
+ \;%
+ \vbox{\kern\ht\plusone\box\plustwo}%
+ \endgroup}
+
+% \def\openup{\afterassignment\@penup\dimen@=}
+%
+% \def\@penup{\advance\lineskip\dimen@
+% \advance\baselineskip\dimen@
+% \advance\lineskiplimit\dimen@}
+
+\def\openup
+ {\afterassignment\doopenup\scratchdimen=}
+
+\def\doopenup
+ {\advance\lineskip \scratchdimen
+ \advance\baselineskip \scratchdimen
+ \advance\lineskiplimit\scratchdimen}
+
+% \def\jot{.25\bodyfontsize} % plain tex: 3 pt (todo: better name and configurable)
+
+\def\displayopenupvalue{.25\bodyfontsize}
+
+\def\eqalign#1%
+ {\null
+ \,%
+ \vcenter
+ {\openup\displayopenupvalue % was \openup\jot
+ \mathsurround\zeropoint
+ \ialign
+ {\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil\crcr
+ #1\crcr}}%
+ \,}
+
+\def\@lign % restore inside \displ@y
+ {\tabskip\zeroskip
+ \everycr{}}
+
+\def\displaylines#1%
+ {\displ@y
+ \tabskip\zeroskip
+ \halign
+ {\hbox to \displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+
+\def\eqalignno#1%
+ {\displ@y
+ \tabskip\centering
+ \halign to \displaywidth
+ {\hfil$\@lign\displaystyle{##}$\tabskip\zeroskip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip\zeroskip\crcr
+ #1\crcr}}
+
+\def\leqalignno#1%
+ {\displ@y
+ \tabskip\centering
+ \halign to \displaywidth
+ {\hfil$\@lign\displaystyle{##}$\tabskip\zeroskip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+ #1\crcr}}
+
+% temporary here (weird code)
+
+% \startcatcodetable \mthcatcodes
+% \setcatcodetable\ctxcatcodes
+% \catcode`\_ = 13
+% \catcode`\' = 13
+% \stopcatcodetable
+%
+% \letcatcodecommand \mthcatcodes `\_ \activemathunderscore
+% \letcatcodecommand \mthcatcodes `\' \activemathquote
+
+% \appendtoks \setcatcodetable\mthcatcodes \to \everymath : spoils xml
+
+% tricky, but some day we will reimplement math
+
+\bgroup
+ \catcode`\_ = 13
+ \catcode`\' = 13
+ \doglobal\appendtoks
+ \let_\activemathunderscore
+ \let'\activemathquote
+ \to \everymathematics
+\egroup
+
+% so far
+
+\protect \endinput
diff --git a/tex/context/base/math-run.mkii b/tex/context/base/math-run.mkii
new file mode 100644
index 000000000..6bc4bf4d5
--- /dev/null
+++ b/tex/context/base/math-run.mkii
@@ -0,0 +1,105 @@
+%D \module
+%D [ file=math-run,
+%D version=2001.23.04,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen \& Ton Otten]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Math Macros / Runtime Macros}
+
+\unprotect
+
+\ifx\showmathmodern\undefined \global\chardef\showmathmodern\zerocount \fi
+
+\gdef\showmathcharacters% nearly \showcharacters
+ {\par
+ \bgroup
+ \ifcase\showmathmodern\or\ifx\modern\undefined\chardef\showmathmodern\zerocount\fi\fi
+ \setuptextrules[\c!bodyfont=,\c!style=]
+ \starttextrule{math characters -- \currentmathcollection}
+ \whitespace
+ \dontcomplain
+ \forgetall
+ \def\startmathcollection[##1]{}
+ \let\stopmathcollection\relax
+ \dimen0\zeropoint
+ \dimen2\zeropoint
+ \def\definemathsymbol {\dosixtupleempty\dodefinemathsymbol}
+ \def\definemathcharacter{\dosixtupleempty\dodefinemathcharacter}
+ \def\definemathcommand {\dotripleempty \dodefinemathcommand}
+ %\newcounter\mathcolor
+ \def\dodefinemathsymbol[##1][##2][##3][##4][##5][##6]%
+ {%\doifcolorelse{math \purefamilyhex{##3}}{}
+ % {\increment\mathcolor
+ % \definecolor[math \purefamilyhex{##3}][\mathcolor]}%
+ \setbox0\hbox spread 1em{\mathematics{\getvalue{##1}{}{}{}}}%
+ \ifdim\wd0>\dimen0 \dimen0=\wd0 \fi
+ \setbox2\hbox spread 1em{\hbox to 1em{\tttf\purefamilyhex{##3}\hss}\box0 ##1}%
+ \ifdim\wd2>\dimen2 \dimen2=\wd2 \fi}
+ \def\dodefinemathcharacter[##1][##2][##3][##4][##5][##6]{}
+ \def\dodefinemathcommand [##1][##2][##3]##4{}
+ \readsysfile{\f!mathprefix tex.mkii}\!!doneatrue\!!doneafalse
+ \readsysfile{\f!mathprefix ams.mkii}\!!donebtrue\!!donebfalse
+ \if!!donea
+ \if!!doneb
+ \edef\encwidth{\the\dimen0}
+ \dimen0=\hsize
+ \advance\dimen0 2em
+ \advance\dimen2 2em
+ \ifcase\showmathmodern\or\advance\dimen2 4em\fi
+ \divide \dimen0 by \dimen2 \advance\dimen0 1sp
+ \edef\enccols{\number\dimen0}
+ \startcolumns[\c!n=\enccols,\c!distance=2em]
+ \def\dodefinemathsymbol[##1][##2][##3][##4][##5][##6]%
+ {%\localcolortrue
+ %\color
+ % [math \purefamilyhex{##3}]
+ {\hbox
+ {\ifcase\showmathmodern\or
+ \hbox to \encwidth{\modern\let\mathcollection\nomathcollection\mathematics{\getvalue{##1}{}{}{}}\hss}%
+ \fi
+ \hbox to \encwidth{\mathematics{\getvalue{##1}{}{}{}}\hss}%
+ \hbox to 1em{\tttf\purefamilyhex{##3}\hss}##1}\par}}
+ \readsysfile{\f!mathprefix tex.mkii}\donothing\donothing
+ \readsysfile{\f!mathprefix ams.mkii}\donothing\donothing
+ \stopcolumns
+ \else
+ \par \tttf no chars in \f!mathprefix ams\par
+ \fi
+ \else
+ \par \tttf no chars in \f!mathprefix tex\par
+ \fi
+ \stoptextrule
+ \egroup}
+
+% \definecolor[math \purefamilyhex{mr}] [darkred]
+% \definecolor[math \purefamilyhex{mi}] [darkgreen]
+% \definecolor[math \purefamilyhex{sy}] [darkblue]
+% \definecolor[math \purefamilyhex{ex}] [darkmagenta]
+% \definecolor[math \purefamilyhex{nn}] [darkyellow]
+% \definecolor[math \purefamilyhex{ma}] [lightred]
+% \definecolor[math \purefamilyhex{mb}] [lightgreen]
+% \definecolor[math \purefamilyhex{mc}] [lightblue]
+% \definecolor[math \purefamilyhex{md}] [lightmagenta]
+
+\gdef\showmathtoken#1%
+ {\starttabulate[|lT|lT|lT|l|]
+ \NC token \NC #1 \NC \NR
+ \NC collection \NC \ifcsname\@mt@\mathcollection#1\endcsname
+ \mathcollection
+ \else\ifcsname\@mt@\nomathcollection#1\endcsname
+ \nomathcollection
+ \else
+ ?%
+ \fi\fi \NC \NR
+ \NC visualization \NC \mathematics{\getvalue{#1}} \NC \NR
+ \NC definition \NC \tttf \@EA\defconvertedcommand\@EA\ascii\csname\@mt@\mathcollection#1\endcsname \ascii \NC \NR
+ \stoptabulate}
+
+\protect \endinput
diff --git a/tex/context/base/math-scr.mkiv b/tex/context/base/math-scr.mkiv
new file mode 100644
index 000000000..eb1db4714
--- /dev/null
+++ b/tex/context/base/math-scr.mkiv
@@ -0,0 +1,135 @@
+%D \module
+%D [ file=math-scr,
+%D version=2007.07.19,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Scripts,
+%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}{ConTeXt Math Macros / Scripts}
+
+\unprotect
+
+%D \macros
+%D {super, sub}
+%D
+%D \TEX\ uses \type{^} and \type{_} for entering super- and
+%D subscript mode. We want however a bit more control than
+%D normally provided, and therefore provide \type {\super}
+%D and \type{sub}.
+%D
+%D The grid snapping has been removed.
+
+\global\let\normalsuper=^
+\global\let\normalsuber=_
+
+\ifdefined\supersubmode \else \newcount\supersubmode \fi
+\ifdefined\newevery \else \everysupersub \EverySuperSub \fi
+
+\appendtoks \advance\supersubmode \plusone \to \everysupersub
+
+\setuptextformulas
+ [\c!size=\v!normal]
+
+\def\normalsupsub#1#2%
+ {^{\the\everysupersub#1}_{\the\everysupersub#2}}
+
+\def\super#1{^{\the\everysupersub#1}}
+\def\suber#1{_{\the\everysupersub#1}}
+\def\supsub#1#2{\super{#1}\suber{#2}}
+\def\subsup#1#2{\suber{#1}\super{#2}}
+
+%D \macros
+%D {enablesupersub,enablesimplesupersub}
+%D
+%D We can let \type {^} and \type {_} act like \type {\super}
+%D and \type {\sub} by saying \type {\enablesupersub}.
+
+\bgroup
+\catcode`\^=\@@active
+\catcode`\_=\@@active
+\gdef\enablesupersub
+ {\catcode`\^=\@@active
+ \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
+ \catcode`\_=\@@active
+ \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
+\egroup
+
+%D \macros
+%D {restoremathstyle}
+%D
+%D We can pick up the current math style by calling \type
+%D {\restoremathstyle}.
+
+\def\restoremathstyle
+ {\ifmmode
+ \ifcase\supersubmode
+ \textstyle
+ \or
+ \scriptstyle
+ \else
+ \scriptscriptstyle
+ \fi
+ \fi}
+
+%D These macros were first needed by Frits Spijker (also
+%D known as Gajes) for typesetting the minus sign that is
+%D keyed into scientific calculators.
+
+% This is the first alternative, which works okay for the
+% minus, but less for the plus.
+%
+% \def\dodoraisedmathord#1#2#3%
+% {\mathord{{#2\raise.#1ex\hbox{#2#3}}}}
+%
+% \def\doraisedmathord#1%
+% {\mathchoice
+% {\dodoraisedmathord5\tf #1}%
+% {\dodoraisedmathord5\tf #1}%
+% {\dodoraisedmathord4\tfx #1}%
+% {\dodoraisedmathord3\tfxx#1}}
+%
+% \def\negative{\doraisedmathord-}
+% \def\positive{\doraisedmathord+}
+%
+% So, now we use the monospaced signs, that we also
+% define as symbol, so that they can be overloaded.
+
+\def\dodoraisedmathord#1#2#3%
+ {\mathord{{#2\raise.#1ex\hbox{#2\symbol[#3]}}}}
+
+\def\doraisedmathord#1%
+ {\mathchoice
+ {\dodoraisedmathord5\tf {#1}}%
+ {\dodoraisedmathord5\tf {#1}}%
+ {\dodoraisedmathord4\tx {#1}}%
+ {\dodoraisedmathord3\txx{#1}}}
+
+\def\dodonumbermathord#1#2%
+ {\setbox\scratchbox\hbox{0}%
+ \mathord{\hbox to \wd\scratchbox{\hss#1\symbol[#2]\hss}}}
+
+\def\donumbermathord#1%
+ {\mathchoice
+ {\dodonumbermathord\tf {#1}}%
+ {\dodonumbermathord\tf {#1}}%
+ {\dodonumbermathord\tx {#1}}%
+ {\dodonumbermathord\txx{#1}}}
+
+\definesymbol[positive] [\getglyph{Mono}{+}]
+\definesymbol[negative] [\getglyph{Mono}{-}]
+\definesymbol[zeroamount][\getglyph{Mono}{-}]
+
+\def\negative {\doraisedmathord{negative}}
+\def\positive {\doraisedmathord{positive}}
+\def\zeroamount{\donumbermathord{zeroamount}}
+
+%D How negative such a symbol looks is demonstrated in:
+%D $\negative 10^{\negative 10^{\negative 10}}$.
+
+\protect \endinput
diff --git a/tex/context/base/math-tex.mkii b/tex/context/base/math-tex.mkii
new file mode 100644
index 000000000..8f34a190e
--- /dev/null
+++ b/tex/context/base/math-tex.mkii
@@ -0,0 +1,720 @@
+%D \module
+%D [ file=math-tex,
+%D version=2001.04.12,
+%D subtitle=Plain Specials,
+%D author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan},
+%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.
+
+% beware: in mkiv we will do it differently
+
+\unprotect
+
+\mathcode`\ ="8000 \mathcode`\_="8000 \mathcode`\'="8000
+
+\definefamilysynonym [default] [calligraphic] [sy]
+\definefamilysynonym [default] [oldstyle] [mi]
+\definefamilysynonym [default] [blackboard] [mr]
+\definefamilysynonym [default] [gothic] [mr]
+\definefamilysynonym [default] [fraktur] [mr]
+
+\definefamilysynonym [default] [lcgreek] [mi]
+\definefamilysynonym [default] [ucgreek] [mr]
+\definefamilysynonym [default] [vargreek] [mi]
+
+
+%D \macros
+%D {\setupmathematics}
+%D
+%D Configuration for integrals. (If needed we can speed this up and make it
+%D installable; no processaction is needed then).
+
+\chardef\intlimitcode\zerocount % 0 nolimits 1 displaylimits 2 limits
+
+\def\intlimits
+ {\ifcase\intlimitcode \nolimits \or \displaylimits \or \limits \fi}
+
+\def\setupmathematics
+ {\dosingleargument\dosetupmathematics}
+
+\def\dosetupmathematics[#1]%
+ {\getparameters[\??mo][#1]
+ \processaction[\@@mointegral]
+ [ nolimits=>\chardef\intlimitcode\zerocount,
+ displaylimits=>\chardef\intlimitcode\plusone,
+ limits=>\chardef\intlimitcode\plustwo]}
+
+%D \startbuffer
+%D $\int_a^b f(x) dx$ and also
+%D $\iint_a^b f(x,y) dxdy$, $\iiint_a^b f(x,y) dxdy$,
+%D $\iiiint_a^b f(x) dx$
+%D \startformula
+%D \int_a^b f(x) dx \quad
+%D \iint_a^b f(x) dx \quad
+%D \iiint_a^b f(x) dx \quad
+%D \iiiint_a^b f(x) dx \quad
+%D \stopformula
+%D \stopbuffer
+%D
+%D Default: \getbuffer
+%D
+%D Displaylimits: \setupmathematics[integral=displaylimits] \getbuffer
+%D
+%D Limits: \setupmathematics[integral=limits] \getbuffer
+
+\startmathcollection [default]
+
+\definemathsymbol [alpha] [nothing] [lcgreek] ["0B]
+\definemathsymbol [beta] [nothing] [lcgreek] ["0C]
+\definemathsymbol [gamma] [nothing] [lcgreek] ["0D]
+\definemathsymbol [delta] [nothing] [lcgreek] ["0E]
+\definemathsymbol [epsilon] [nothing] [lcgreek] ["0F]
+\definemathsymbol [zeta] [nothing] [lcgreek] ["10]
+\definemathsymbol [eta] [nothing] [lcgreek] ["11]
+\definemathsymbol [theta] [nothing] [lcgreek] ["12]
+\definemathsymbol [iota] [nothing] [lcgreek] ["13]
+\definemathsymbol [kappa] [nothing] [lcgreek] ["14]
+\definemathsymbol [lambda] [nothing] [lcgreek] ["15]
+\definemathsymbol [mu] [nothing] [lcgreek] ["16]
+\definemathsymbol [nu] [nothing] [lcgreek] ["17]
+\definemathsymbol [xi] [nothing] [lcgreek] ["18]
+\definemathsymbol [omicron] [nothing] [lcgreek] ["6F]
+\definemathsymbol [pi] [nothing] [lcgreek] ["19]
+\definemathsymbol [rho] [nothing] [lcgreek] ["1A]
+\definemathsymbol [sigma] [nothing] [lcgreek] ["1B]
+\definemathsymbol [tau] [nothing] [lcgreek] ["1C]
+\definemathsymbol [upsilon] [nothing] [lcgreek] ["1D]
+\definemathsymbol [phi] [nothing] [lcgreek] ["1E]
+\definemathsymbol [chi] [nothing] [lcgreek] ["1F]
+\definemathsymbol [psi] [nothing] [lcgreek] ["20]
+\definemathsymbol [omega] [nothing] [lcgreek] ["21]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [varepsilon] [nothing] [vargreek] ["22]
+\definemathsymbol [vartheta] [nothing] [vargreek] ["23]
+\definemathsymbol [varpi] [nothing] [vargreek] ["24]
+\definemathsymbol [varrho] [nothing] [vargreek] ["25]
+\definemathsymbol [varsigma] [nothing] [vargreek] ["26]
+\definemathsymbol [varphi] [nothing] [vargreek] ["27]
+
+\stopmathcollection
+
+\startmathcollection [default]
+
+\definemathsymbol [Alpha] [alpha] [ucgreek] ["41] % A
+\definemathsymbol [Beta] [alpha] [ucgreek] ["42] % B
+\definemathsymbol [Gamma] [alpha] [ucgreek] ["00]
+\definemathsymbol [Delta] [alpha] [ucgreek] ["01]
+\definemathsymbol [Epsilon] [alpha] [ucgreek] ["45] % E
+\definemathsymbol [Zeta] [alpha] [ucgreek] ["5A] % Z
+\definemathsymbol [Eta] [alpha] [ucgreek] ["48] % H
+\definemathsymbol [Theta] [alpha] [ucgreek] ["02]
+\definemathsymbol [Iota] [alpha] [ucgreek] ["49] % I
+\definemathsymbol [Kappa] [alpha] [ucgreek] ["4B] % K
+\definemathsymbol [Lambda] [alpha] [ucgreek] ["03]
+\definemathsymbol [Mu] [alpha] [ucgreek] ["4D] % M
+\definemathsymbol [Nu] [alpha] [ucgreek] ["4E] % N
+\definemathsymbol [Xi] [alpha] [ucgreek] ["04]
+\definemathsymbol [Omicron] [alpha] [ucgreek] ["4F] % O
+\definemathsymbol [Pi] [alpha] [ucgreek] ["05]
+\definemathsymbol [Rho] [alpha] [ucgreek] ["52] % R
+\definemathsymbol [Sigma] [alpha] [ucgreek] ["06]
+\definemathsymbol [Tau] [alpha] [ucgreek] ["54] % T
+\definemathsymbol [Upsilon] [alpha] [ucgreek] ["07]
+\definemathsymbol [Phi] [alpha] [ucgreek] ["08]
+\definemathsymbol [Chi] [alpha] [ucgreek] ["58] % X
+\definemathsymbol [Psi] [alpha] [ucgreek] ["09]
+\definemathsymbol [Omega] [alpha] [ucgreek] ["0A]
+
+\stopmathcollection
+
+% The \mfunction macro is an alternative for \hbox with a
+% controlable font switch.
+
+\startmathcollection[default]
+
+\definemathcommand [arccos] [nolop] {\mfunction{arccos}}
+\definemathcommand [arcsin] [nolop] {\mfunction{arcsin}}
+\definemathcommand [arctan] [nolop] {\mfunction{arctan}}
+\definemathcommand [arg] [nolop] {\mfunction{arg}}
+\definemathcommand [cosh] [nolop] {\mfunction{cosh}}
+\definemathcommand [cos] [nolop] {\mfunction{cos}}
+\definemathcommand [coth] [nolop] {\mfunction{coth}}
+\definemathcommand [cot] [nolop] {\mfunction{cot}}
+\definemathcommand [csc] [nolop] {\mfunction{csc}}
+\definemathcommand [deg] [nolop] {\mfunction{deg}}
+\definemathcommand [det] [limop] {\mfunction{det}}
+\definemathcommand [dim] [nolop] {\mfunction{dim}}
+\definemathcommand [exp] [nolop] {\mfunction{exp}}
+\definemathcommand [gcd] [limop] {\mfunction{gcd}}
+\definemathcommand [hom] [nolop] {\mfunction{hom}}
+\definemathcommand [inf] [limop] {\mfunction{inf}}
+\definemathcommand [injlim] [limop] {\mfunction{inj\,lim}}
+\definemathcommand [ker] [nolop] {\mfunction{ker}}
+\definemathcommand [lg] [nolop] {\mfunction{lg}}
+\definemathcommand [liminf] [limop] {\mfunction{lim\,inf}}
+\definemathcommand [limsup] [limop] {\mfunction{lim\,sup}}
+\definemathcommand [lim] [limop] {\mfunction{lim}}
+\definemathcommand [ln] [nolop] {\mfunction{ln}}
+\definemathcommand [log] [nolop] {\mfunction{log}}
+\definemathcommand [median] [limop] {\mfunction{median}}
+\definemathcommand [max] [limop] {\mfunction{max}}
+\definemathcommand [min] [limop] {\mfunction{min}}
+\definemathcommand [mod] [limop] {\mfunction{mod}}
+\definemathcommand [div] [limop] {\mfunction{div}}
+\definemathcommand [projlim] [limop] {\mfunction{proj\,lim}}
+\definemathcommand [Pr] [limop] {\mfunction{Pr}}
+\definemathcommand [sec] [nolop] {\mfunction{sec}}
+\definemathcommand [sinh] [nolop] {\mfunction{sinh}}
+\definemathcommand [sin] [nolop] {\mfunction{sin}}
+\definemathcommand [sup] [limop] {\mfunction{sup}}
+\definemathcommand [tanh] [nolop] {\mfunction{tanh}}
+\definemathcommand [tan] [nolop] {\mfunction{tan}}
+
+\stopmathcollection
+
+\let\normalmatharg\arg % todo: maybe automatically
+
+\startmathcollection[default]
+
+\definemathcommand [integers] {\mfunction{Z}}
+\definemathcommand [reals] {\mfunction{R}}
+\definemathcommand [rationals] {\mfunction{Q}}
+\definemathcommand [naturalnumbers] {\mfunction{N}}
+\definemathcommand [complexes] {\mfunction{C}}
+\definemathcommand [primes] {\mfunction{P}}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcharacter [!] [close] [mr] ["21]
+\definemathcharacter [(] [open] [mr] ["28]
+\definemathcharacter [)] [close] [mr] ["29]
+\definemathcharacter [*] [bin] [sy] ["03]
+\definemathcharacter [+] [bin] [mr] ["2B]
+\definemathcharacter [,] [punct] [mi] ["3B]
+\definemathcharacter [-] [bin] [sy] ["00]
+\definemathcharacter [.] [ord] [mi] ["3A]
+\definemathcharacter [/] [ord] [mi] ["3D]
+\definemathcharacter [:] [rel] [mr] ["3A]
+\definemathcharacter [;] [punct] [mr] ["3B]
+\definemathcharacter [<] [rel] [mi] ["3C]
+\definemathcharacter [=] [rel] [mr] ["3D]
+\definemathcharacter [>] [rel] [mi] ["3E]
+\definemathcharacter [?] [close] [mr] ["3F]
+\definemathcharacter [91] [open] [mr] ["5B] % [
+\definemathcharacter [92] [ord] [sy] ["6E] % \
+\definemathcharacter [93] [close] [mr] ["5D] % ]
+\definemathcharacter [123] [open] [sy] ["66] % {
+\definemathcharacter [124] [ord] [sy] ["6A] % |
+\definemathcharacter [125] [close] [sy] ["67] % }
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcharacter [(] [nothing] [mr] ["28] [ex] ["00]
+\definemathcharacter [)] [nothing] [mr] ["29] [ex] ["01]
+\definemathcharacter [91] [nothing] [mr] ["5B] [ex] ["02] % [
+\definemathcharacter [93] [nothing] [mr] ["5D] [ex] ["03] % ]
+\definemathcharacter [<] [nothing] [sy] ["68] [ex] ["0A]
+\definemathcharacter [>] [nothing] [sy] ["69] [ex] ["0B]
+\definemathcharacter [/] [nothing] [mr] ["2F] [ex] ["0E]
+\definemathcharacter [124] [nothing] [sy] ["6A] [ex] ["0C] % |
+\definemathcharacter [92] [nothing] [sy] ["6E] [ex] ["0F] % \
+
+\stopmathcollection
+
+\def\PLAINangle
+ {{\vbox{\ialign{$\mathsurround\zeropoint\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+
+\startmathcollection[default]
+
+\definemathsymbol [aleph] [nothing] [sy] ["40]
+\definemathsymbol [imath] [nothing] [mi] ["7B]
+\definemathsymbol [jmath] [nothing] [mi] ["7C]
+\definemathsymbol [ell] [nothing] [mi] ["60]
+\definemathsymbol [wp] [nothing] [mi] ["7D]
+\definemathsymbol [Re] [nothing] [sy] ["3C]
+\definemathsymbol [Im] [nothing] [sy] ["3D]
+\definemathsymbol [partial] [nothing] [mi] ["40]
+\definemathsymbol [infty] [nothing] [sy] ["31]
+\definemathsymbol [prime] [nothing] [sy] ["30]
+\definemathsymbol [emptyset] [nothing] [sy] ["3B]
+\definemathsymbol [nabla] [nothing] [sy] ["72]
+\definemathsymbol [top] [nothing] [sy] ["3E]
+\definemathsymbol [bot] [nothing] [sy] ["3F]
+
+\definemathcommand [hbar] {{\mathchar'26\mkern-9muh}}
+\definemathcommand [surd] {{\mathchar"1270}} % ?
+\definemathcommand [angle] {\PLAINangle}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [triangle] [ord] [sy] ["34]
+\definemathsymbol [forall] [ord] [sy] ["38]
+\definemathsymbol [exists] [ord] [sy] ["39]
+\definemathsymbol [neg] [ord] [sy] ["3A]
+\definemathsymbol [flat] [ord] [mi] ["5B]
+\definemathsymbol [natural] [ord] [mi] ["5C]
+\definemathsymbol [sharp] [ord] [mi] ["5D]
+\definemathsymbol [clubsuit] [ord] [sy] ["7C]
+\definemathsymbol [diamondsuit] [ord] [sy] ["7D]
+\definemathsymbol [heartsuit] [ord] [sy] ["7E]
+\definemathsymbol [spadesuit] [ord] [sy] ["7F]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcommand [square] {\hbox{\hsmash{$\sqcup$}$\sqcap$}}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [coprod] [op] [ex] ["60]
+\definemathsymbol [bigvee] [op] [ex] ["57]
+\definemathsymbol [bigwedge] [op] [ex] ["56]
+\definemathsymbol [biguplus] [op] [ex] ["55]
+\definemathsymbol [bigcap] [op] [ex] ["54]
+\definemathsymbol [bigcup] [op] [ex] ["53]
+\definemathsymbol [intop] [op] [ex] ["52]
+\definemathsymbol [prod] [op] [ex] ["51]
+\definemathsymbol [sum] [op] [ex] ["50]
+\definemathsymbol [bigotimes] [op] [ex] ["4E]
+\definemathsymbol [bigoplus] [op] [ex] ["4C]
+\definemathsymbol [bigodot] [op] [ex] ["4A]
+\definemathsymbol [ointop] [op] [ex] ["48]
+\definemathsymbol [bigsqcup] [op] [ex] ["46]
+\definemathsymbol [smallint] [op] [sy] ["73]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [triangleleft] [bin] [mi] ["2F]
+\definemathsymbol [triangleright] [bin] [mi] ["2E]
+\definemathsymbol [bigtriangleup] [bin] [sy] ["34]
+\definemathsymbol [bigtriangledown] [bin] [sy] ["35]
+\definemathsymbol [wedge] [bin] [sy] ["5E]
+\definemathsymbol [vee] [bin] [sy] ["5F]
+\definemathsymbol [cap] [bin] [sy] ["5C]
+\definemathsymbol [cup] [bin] [sy] ["5B]
+\definemathsymbol [ddagger] [bin] [sy] ["7A]
+\definemathsymbol [dagger] [bin] [sy] ["79]
+\definemathsymbol [sqcap] [bin] [sy] ["75]
+\definemathsymbol [sqcup] [bin] [sy] ["74]
+\definemathsymbol [uplus] [bin] [sy] ["5D]
+\definemathsymbol [amalg] [bin] [sy] ["71]
+\definemathsymbol [diamond] [bin] [sy] ["05]
+\definemathsymbol [bullet] [bin] [sy] ["0F]
+\definemathsymbol [wr] [bin] [sy] ["6F]
+\definemathsymbol [div] [bin] [sy] ["04]
+\definemathsymbol [odot] [bin] [sy] ["0C]
+\definemathsymbol [oslash] [bin] [sy] ["0B]
+\definemathsymbol [otimes] [bin] [sy] ["0A]
+\definemathsymbol [ominus] [bin] [sy] ["09]
+\definemathsymbol [oplus] [bin] [sy] ["08]
+\definemathsymbol [mp] [bin] [sy] ["07]
+\definemathsymbol [pm] [bin] [sy] ["06]
+\definemathsymbol [circ] [bin] [sy] ["0E]
+\definemathsymbol [bigcirc] [bin] [sy] ["0D]
+\definemathsymbol [setminus] [bin] [sy] ["6E]
+\definemathsymbol [cdot] [bin] [sy] ["01]
+\definemathsymbol [ast] [bin] [sy] ["03]
+\definemathsymbol [times] [bin] [sy] ["02]
+\definemathsymbol [star] [bin] [mi] ["3F]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [propto] [rel] [sy] ["2F]
+\definemathsymbol [sqsubseteq] [rel] [sy] ["76]
+\definemathsymbol [sqsupseteq] [rel] [sy] ["77]
+\definemathsymbol [parallel] [rel] [sy] ["6B]
+\definemathsymbol [mid] [rel] [sy] ["6A]
+\definemathsymbol [dashv] [rel] [sy] ["61]
+\definemathsymbol [vdash] [rel] [sy] ["60]
+\definemathsymbol [nearrow] [rel] [sy] ["25]
+\definemathsymbol [searrow] [rel] [sy] ["26]
+\definemathsymbol [nwarrow] [rel] [sy] ["2D]
+\definemathsymbol [swarrow] [rel] [sy] ["2E]
+\definemathsymbol [Leftrightarrow] [rel] [sy] ["2C]
+\definemathsymbol [Leftarrow] [rel] [sy] ["28]
+\definemathsymbol [Rightarrow] [rel] [sy] ["29]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathcommand [lnot] {\neg}
+\definemathcommand [int] {\intop \intlimits}
+\definemathcommand [oint] {\ointop\intlimits}
+\definemathcommand [land] {\wedge}
+\definemathcommand [lor] {\vee}
+\definemathcommand [neq] {\not=}
+\definemathcommand [ne] {\neq}
+\definemathcommand [le] {\leq}
+\definemathcommand [ge] {\geq}
+\definemathcommand [eq] {=}
+\definemathcommand [gt] {>}
+\definemathcommand [lt] {<}
+\definemathcommand [gets] {\leftarrow}
+\definemathcommand [owns] {\ni}
+\definemathcommand [to] {\rightarrow}
+\definemathcommand [mapsto] {\mapstochar\rightarrow}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [leq] [rel] [sy] ["14]
+\definemathsymbol [geq] [rel] [sy] ["15]
+\definemathsymbol [succ] [rel] [sy] ["1F]
+\definemathsymbol [prec] [rel] [sy] ["1E]
+\definemathsymbol [approx] [rel] [sy] ["19]
+\definemathsymbol [succeq] [rel] [sy] ["17]
+\definemathsymbol [preceq] [rel] [sy] ["16]
+\definemathsymbol [supset] [rel] [sy] ["1B]
+\definemathsymbol [subset] [rel] [sy] ["1A]
+\definemathsymbol [supseteq] [rel] [sy] ["13]
+\definemathsymbol [subseteq] [rel] [sy] ["12]
+\definemathsymbol [in] [rel] [sy] ["32]
+\definemathsymbol [ni] [rel] [sy] ["33]
+\definemathsymbol [gg] [rel] [sy] ["1D]
+\definemathsymbol [ll] [rel] [sy] ["1C]
+\definemathsymbol [not] [rel] [sy] ["36]
+\definemathsymbol [leftrightarrow] [rel] [sy] ["24]
+\definemathsymbol [leftarrow] [rel] [sy] ["20]
+\definemathsymbol [rightarrow] [rel] [sy] ["21]
+\definemathsymbol [mapstochar] [rel] [sy] ["37]
+\definemathsymbol [sim] [rel] [sy] ["18]
+\definemathsymbol [simeq] [rel] [sy] ["27]
+\definemathsymbol [perp] [rel] [sy] ["3F]
+\definemathsymbol [equiv] [rel] [sy] ["11]
+\definemathsymbol [asymp] [rel] [sy] ["10]
+\definemathsymbol [smile] [rel] [mi] ["5E]
+\definemathsymbol [frown] [rel] [mi] ["5F]
+\definemathsymbol [leftharpoonup] [rel] [mi] ["28]
+\definemathsymbol [leftharpoondown] [rel] [mi] ["29]
+\definemathsymbol [rightharpoonup] [rel] [mi] ["2A]
+\definemathsymbol [rightharpoondown] [rel] [mi] ["2B]
+\definemathsymbol [lhook] [rel] [mi] ["2C]
+\definemathsymbol [rhook] [rel] [mi] ["2D]
+
+\stopmathcollection
+
+\def\PLAINldots
+ {\ldotp\ldotp\ldotp}
+
+\def\PLAINcdots
+ {\cdotp\cdotp\cdotp}
+
+\def\PLAINvdots
+ {\vbox{\baselineskip.4\bodyfontsize\lineskiplimit\zeropoint
+ \kern.6\bodyfontsize\hbox{.}\hbox{.}\hbox{.}}}
+
+\def\PLAINddots
+ {\mkern1mu\raise.7\bodyfontsize\vbox{\kern.7\bodyfontsize\hbox{.}}\mkern2mu
+ \raise.4\bodyfontsize\hbox{.}\mkern2mu\raise.1\bodyfontsize\hbox{.}\mkern1mu}
+
+\startmathcollection[default]
+
+\definemathcommand [hookrightarrow] {\lhook\joinrel\rightarrow}
+\definemathcommand [hookleftarrow] {\leftarrow\joinrel\rhook}
+\definemathcommand [bowtie] {\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\definemathcommand [models] {\mathrel|\joinrel=}
+\definemathcommand [iff] {\;\Longleftrightarrow\;}
+
+\definemathsymbol [ldotp] [punct] [mi] ["3A]
+\definemathsymbol [cdotp] [punct] [sy] ["01]
+\definemathsymbol [colon] [punct] [mr] ["3A]
+
+\definemathcommand [ldots] [inner] {\PLAINldots}
+\definemathcommand [cdots] [inner] {\PLAINcdots}
+\definemathcommand [vdots] [nothing] {\PLAINvdots}
+\definemathcommand [ddots] [inner] {\PLAINddots}
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [acute] [accent] [mr] ["13]
+\definemathsymbol [grave] [accent] [mr] ["12]
+\definemathsymbol [ddot] [accent] [mr] ["7F]
+\definemathsymbol [tilde] [accent] [mr] ["7E]
+\definemathsymbol [mathring] [accent] [mr] ["17]
+\definemathsymbol [bar] [accent] [mr] ["16]
+\definemathsymbol [breve] [accent] [mr] ["15]
+\definemathsymbol [check] [accent] [mr] ["14]
+\definemathsymbol [hat] [accent] [mr] ["5E]
+\definemathsymbol [vec] [accent] [mi] ["7E] % [ord]
+\definemathsymbol [dot] [accent] [mr] ["5F]
+\definemathsymbol [widetilde] [accent] [ex] ["65] % [ord]
+\definemathsymbol [widehat] [accent] [ex] ["62] % [ord]
+
+\stopmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [lmoustache] [open] [ex] ["7A] [ex] ["40]
+\definemathsymbol [rmoustache] [close] [ex] ["7B] [ex] ["41]
+\definemathsymbol [lgroup] [open] [mr] ["28] [ex] ["3A] % ?
+\definemathsymbol [rgroup] [close] [mr] ["29] [ex] ["3B] % ?
+\definemathsymbol [arrowvert] [nothing] [sy] ["6A] [ex] ["3C]
+\definemathsymbol [Arrowvert] [nothing] [sy] ["6B] [ex] ["3D]
+\definemathsymbol [bracevert] [nothing] [ex] ["3E] % ?
+\definemathsymbol [Vert] [nothing] [sy] ["6B] [ex] ["0D]
+\definemathsymbol [vert] [nothing] [sy] ["6A] [ex] ["0C]
+\definemathsymbol [uparrow] [rel] [sy] ["22] [ex] ["78]
+\definemathsymbol [downarrow] [rel] [sy] ["23] [ex] ["79]
+\definemathsymbol [updownarrow] [rel] [sy] ["6C] [ex] ["3F]
+\definemathsymbol [Uparrow] [rel] [sy] ["2A] [ex] ["7E]
+\definemathsymbol [Downarrow] [rel] [sy] ["2B] [ex] ["7F]
+\definemathsymbol [Updownarrow] [rel] [sy] ["6D] [ex] ["77]
+\definemathsymbol [backslash] [nothing] [sy] ["6E] [ex] ["0F]
+\definemathsymbol [langle] [open] [sy] ["68] [ex] ["0A]
+\definemathsymbol [rangle] [close] [sy] ["69] [ex] ["0B]
+\definemathsymbol [lbrace] [open] [sy] ["66] [ex] ["08]
+\definemathsymbol [rbrace] [close] [sy] ["67] [ex] ["09]
+\definemathsymbol [lceil] [open] [sy] ["64] [ex] ["06]
+\definemathsymbol [rceil] [close] [sy] ["65] [ex] ["07]
+\definemathsymbol [lfloor] [open] [sy] ["62] [ex] ["04]
+\definemathsymbol [rfloor] [close] [sy] ["63] [ex] ["05]
+
+\definemathsymbol [sqrt] [radical] [sy] ["70] [ex] ["70]
+
+\stopmathcollection
+
+%D By request:
+
+\startmathcollection[default]
+
+\definemathsymbol [lvert] [open] [sy] ["6A] [ex] ["0C]
+\definemathsymbol [rvert] [close] [sy] ["6A] [ex] ["0C]
+
+\definemathsymbol [lVert] [open] [sy] ["6B] [ex] ["0D]
+\definemathsymbol [rVert] [close] [sy] ["6B] [ex] ["0D]
+
+\stopmathcollection
+
+%D For brooks:
+%D
+%D \starttyping
+%D $\sqrt[3]{10}$
+%D \stoptyping
+
+\ifx\normalsqrt\undefined \let\normalsqrt\sqrt \fi % just set to: \dohandlemathtoken {sqrt}
+
+\def\notsosqrt[#1]{\root#1\of}
+
+\unexpanded\def\sqrt{\doifnextoptionalelse\notsosqrt\normalsqrt}
+
+\def\PLAINbig {\@@dobig{0.85}}
+\def\PLAINBig {\@@dobig{1.15}}
+\def\PLAINbigg{\@@dobig{1.45}}
+\def\PLAINBigg{\@@dobig{1.75}}
+
+\startrawmathcollection [default]
+
+\definemathcommand [bigl] [open] [one] {\big}
+\definemathcommand [bigm] [rel] [one] {\big}
+\definemathcommand [bigr] [close] [one] {\big}
+\definemathcommand [Bigl] [open] [one] {\Big}
+\definemathcommand [Bigm] [rel] [one] {\Big}
+\definemathcommand [Bigr] [close] [one] {\Big}
+\definemathcommand [biggl] [open] [one] {\bigg}
+\definemathcommand [biggm] [rel] [one] {\bigg}
+\definemathcommand [biggr] [close] [one] {\bigg}
+\definemathcommand [Biggl] [open] [one] {\Bigg}
+\definemathcommand [Biggm] [rel] [one] {\Bigg}
+\definemathcommand [Biggr] [close] [one] {\Bigg}
+
+\definemathcommand [big] {\PLAINbig}
+\definemathcommand [Big] {\PLAINBig}
+\definemathcommand [bigg] {\PLAINbigg}
+\definemathcommand [Bigg] {\PLAINBigg}
+
+\stoprawmathcollection
+
+\startmathcollection[default]
+
+\definemathsymbol [dag] [box] [sy] ["79]
+\definemathsymbol [ddag] [box] [sy] ["7A]
+\definemathsymbol [S] [box] [sy] ["78]
+\definemathsymbol [P] [box] [sy] ["7B]
+\definemathsymbol [Orb] [box] [sy] ["0D]
+
+\stopmathcollection
+
+\def\PLAINroot#1#2%
+ {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1\sqrt{#2}$}\dimen@\ht\zerocount
+ \advance\dimen@-\dp\zerocount
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu\box\zerocount}
+
+\def\PLAINmatrix#1%
+ {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+
+\startrawmathcollection[default]
+
+\definemathcommand [mathstrut] {\vphantom{(}}
+\definemathcommand [joinrel] {\mathrel{\mkern-3mu}}
+\definemathcommand [r@@t] {\PLAINroot}
+\definemathcommand [matrix] {\PLAINmatrix}
+
+\definemathcommand [over] {\normalover} % hack, to do
+
+\stoprawmathcollection
+
+\def\{{\lbrace}
+\def\}{\rbrace}
+
+%def\bbd{\fam\purefamily{blackboard}}
+%def\cal{\fam\purefamily{calfamily}}
+
+\def\mit{\fam\purefamily{mitfamily}}
+
+\def\Bbb{\blackboard} % conforming amstex
+
+\startmathcollection[default]
+
+ \definemathsymbol [mathperiod] [ord] [mi] ["3A]
+ \definemathsymbol [textperiod] [punct] [mi] ["3A]
+
+ \definemathsymbol [mathcomma] [ord] [mi] ["3B]
+ \definemathsymbol [textcomma] [punct] [mi] ["3B]
+
+\stopmathcollection
+
+\definemathpunctuation . mathperiod textperiod
+\definemathpunctuation , mathcomma textcomma
+
+%D The following colon related definitions are provided by Aditya
+%D Mahajan who derived them from \type {mathtools.sty} and \type
+%D {colonequals.sty}.
+
+%D \macros
+%D {centercolon, colonminus, minuscolon, colonequals, equalscolon,
+%D colonapprox, approxcolon, colonsim, simcolon, coloncolon,
+%D coloncolonminus, minuscoloncolon, coloncolonequals,
+%D equalscoloncolon, coloncolonapprox, approxcoloncolon,
+%D colonsim, simcoloncolon}
+%D
+%D In $a := b$ the colon is not vertically centered with the equal
+%D to. Also the distance between colon and equal to is a bit large.
+%D So, we define a vertically centered colon \tex {centercolon} and
+%D a few macros for colon and double colon relation symbols.
+%D
+%D \startlines
+%D \formula {A \centercolon B}
+%D \formula {A \colonminus B}
+%D \formula {A \minuscolon B}
+%D \formula {A \colonequals B}
+%D \formula {A \equalscolon B}
+%D \formula {A \colonapprox B}
+%D \formula {A \approxcolon B}
+%D \formula {A \colonsim B}
+%D \formula {A \simcolon B}
+%D \formula {A \coloncolon B}
+%D \formula {A \coloncolonminus B}
+%D \formula {A \minuscoloncolon B}
+%D \formula {A \coloncolonequals B}
+%D \formula {A \equalscoloncolon B}
+%D \formula {A \coloncolonapprox B}
+%D \formula {A \approxcoloncolon B}
+%D \formula {A \colonsim B}
+%D \formula {A \simcoloncolon B}
+%D \stoplines
+
+%D The next macros take care of the space between the colon and the
+%D relation symbol.
+
+\definemathcommand [colonsep] {\mkern-1.2mu}
+\definemathcommand [doublecolonsep] {\mkern-0.9mu}
+
+%D The next macro vertically centeres its contents.
+
+\def\@center@math#1%
+ {\vcenter{\hbox{$\mathsurround\zeropoint#1$}}}
+
+\def\@center@colon
+ {\mathpalette\@center@math{\colon}}
+
+%D Now we define all the colon relations.
+
+\definemathcommand [centercolon] [rel] {\@center@colon}
+\definemathcommand [colonminus] [rel] {\centercolon\colonsep\mathrel{-}}
+\definemathcommand [minuscolon] [rel] {\mathrel{-}\colonsep\centercolon}
+\definemathcommand [colonequals] [rel] {\centercolon\colonsep=}
+\definemathcommand [equalscolon] [rel] {=\centercolon\colonsep}
+\definemathcommand [colonapprox] [rel] {\centercolon\colonsep\approx}
+\definemathcommand [approxcolon] [rel] {\approx\centercolon\colonsep}
+\definemathcommand [colonsim] [rel] {\centercolon\colonsep\sim}
+\definemathcommand [simcolon] [rel] {\sim\centercolon\colonsep}
+
+\definemathcommand [coloncolon] [rel] {\centercolon\doublecolonsep\centercolon}
+\definemathcommand [coloncolonminus] [rel] {\coloncolon\colonsep\mathrel{-}}
+\definemathcommand [minuscoloncolon] [rel] {\mathrel{-}\colonsep\coloncolon}
+\definemathcommand [coloncolonequals] [rel] {\coloncolon\colonsep=}
+\definemathcommand [equalscoloncolon] [rel] {=\coloncolon\colonsep}
+\definemathcommand [coloncolonapprox] [rel] {\coloncolon\colonsep\approx}
+\definemathcommand [approxcoloncolon] [rel] {\approx\coloncolon\colonsep}
+\definemathcommand [colonsim] [rel] {\coloncolon\colonsep\sim}
+\definemathcommand [simcoloncolon] [rel] {\sim\coloncolon\colonsep}
+
+%D More integrals (AM):
+
+\def\dointkern{\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}
+
+\definemathcommand [iint] {\repeatintegral\plusone }
+\definemathcommand [iiint] {\repeatintegral\plustwo }
+\definemathcommand [iiiint] {\repeatintegral\plusthree}
+
+\def\repeatintegral#1%
+ {\scratchtoks\emptytoks
+ \let\dointlimits\donothing
+ \let\dodointlimits\intlimits
+ \dorecurse{#1}{\appendtoks \intop \dointkern \to \scratchtoks}
+ \appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
+ \edef\dodorepeatintegral{\the\scratchtoks}%
+ \futurelet\next\dorepeatintegral}
+
+%D If the \type{\limits} option is used after \type{\iint}, use
+%D \type{\mathop} and fudge the left hand space a bit to make the
+%D subscript visually centered.
+
+\def\dorepeatintegral
+ {\ifx\next\limits \dointlimitcorrection \else
+ \ifx\next\displaylimits \dointlimitcorrection \else
+ \ifx\next\nolimits \donothing \else
+ \ifcase\intlimitcode\else \dointlimitcorrection \fi\fi\fi\fi
+ \dodorepeatintegral}
+
+\def\dointlimitcorrection
+ {\mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
+ \mathop\bgroup
+ \mkern7mu\mathchoice{\mkern2mu}{}{}{}%
+ \let\dointlimits\egroup}
+
+\setupmathematics
+ [integral=nolimits]
+
+\protect \endinput
diff --git a/tex/context/base/math-tim.mkii b/tex/context/base/math-tim.mkii
new file mode 100644
index 000000000..3b9aea103
--- /dev/null
+++ b/tex/context/base/math-tim.mkii
@@ -0,0 +1,371 @@
+%D \module
+%D [ file=math-tim,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Mathtime Specials,
+%D author={Hans Hagen \& Taco Hoekwater},
+%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.
+
+\endinput % i will clean this up after taco has gone over it
+
+%D With thanks to Berthold Horn from YandY for providing me
+%D evaluation copies of the MathTimePlus fonts.
+
+% version 0 : Michael Spivak
+% version 1 : Taco Hoekwater
+% version 2 : Hans Hagen
+% version 3 : etc etc etc
+
+\unprotect
+
+%D We use the predefined spare families \type {\mcfam} and
+%D \type {\mdfam}.
+
+\let\cafam\mcfam \let\hexcafam\hexmcfam
+\let\gbfam\mdfam \let\hexgbfam\hexmdfam
+\let\gkfam\mdfam \let\hexgkfam\hexmdfam
+
+% Why is this needed?
+
+% \font\tenmd =mtgu at 10pt
+% \font\sevenmd=mtgu at 7.6pt
+% \font\fivemd =mtgu at 6pt
+% \font\tenmc =mtms at 10pt
+% \font\sevenmc=mtms at 7.6pt
+% \font\fivemc =mtms at 6pt
+%
+% \textfont \mcfam\tenmc \textfont \mdfam\tenmd
+% \scriptfont \mcfam\sevenmc \scriptfont \mdfam\sevenmd
+% \scriptscriptfont\mcfam\fivemc \scriptscriptfont\mdfam\fivemd
+
+% \addtocommalist{gk}\familylist
+% \addtocommalist{gb}\familylist
+%
+% \defineinterfaceconstant {ca} {ca} % boohoo!
+% \defineinterfaceconstant {gk} {gk} % boohoo!
+% \defineinterfaceconstant {gb} {gb} % boohoo!
+
+% \definealternativestyle[script] [\ca][\ca]
+% \definealternativestyle[greek] [\gk][\gk]
+% \definealternativestyle[boldgreek][\gb][\gb]
+
+% \definebodyfont
+% [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt] [rm]
+% [ca=mtms sa 1,
+% gk=mtgu sa 1,
+% gb=mtgub sa 1]
+
+%D Since a font size is a rather fuzzy thing, it will be no
+%D surprise that the Math Times fonts have different specs
+%D than the Computer Modern Roman fonts.
+%D
+%D \starttabulate[|Bl|c|c|c|c|c|c|c|c|c|c|]
+%D \NC Computer Modern\NC
+%D 5 \NC6 \NC7 \NC8 \NC9 \NC10 \NC11 \NC12 \NC14 \NC18\NC\NR
+%D \NC Math Times \NC
+%D 6.0\NC6.8\NC7.6\NC8.4\NC9.2\NC10.0\NC10.8\NC11.6\NC13.2\NC--\NC\NR
+%D \stoptabulate
+%D
+%D The following definitions presume the existence of \type
+%D {tio} and \type {tibio} font alternatives. Definitions for
+%D \type {\tf.} etc and \type {\sc} are left as they are.
+
+%D moved code
+
+%D The next lines set up coding dependant versions of math
+%D accents (for \type {texnansi} of course). These are needed
+%D in commands like \type {\bf} and \type {\it} (which use the
+%D text font encoding) a opposed to \type {_no spec_} and
+%D \type {mi} that use the math font encoding. This stuff
+%D should be made more general!
+
+% \daghex, \ddaghex and \dothex were wrong in my version of mtmacs
+
+\def\daghex {86} % to do
+\def\ddaghex {87}
+\def\Shex {A7}
+\def\Phex {B6}
+\def\barhex {16}
+\def\gravehex{12}
+\def\acutehex{13}
+\def\checkhex{14}
+\def\brevehex{15}
+\def\hathex {5E}
+\def\dothex {05}
+\def\tildehex{7E}
+\def\ddothex {7F}
+
+%D The \type {mtex} fonts need a recalculation of \type
+%D {\p@renwd}, which in \CONTEXT\ is done automatically.
+
+%D The following definitions are mostly copied from the file
+%D \type {mtmacs.tex}, which banner said:
+%D
+%D \starttyping
+%D MTMACS.TEX VERSION 1.1.1 (1996 Dec 8)
+%D COPYRIGHT (C) 1992, 1993, 1996 BY THE TEXPLORATORS CORPORATION
+%D ALL RIGHTS RESERVED
+%D \stoptyping
+%D
+%D We reformatted the macros and changed a few bits and
+%D pieces. A further cleanup with regards to the scratch
+%D registers will be done later.
+
+\mathchardef\Gamma = "0130
+\mathchardef\Delta = "0131
+\mathchardef\Theta = "0132
+\mathchardef\Lambda = "0133
+\mathchardef\Xi = "0134
+\mathchardef\Pi = "0135
+\mathchardef\Sigma = "0136
+\mathchardef\Upsilon = "0137
+\mathchardef\Phi = "0138
+\mathchardef\Psi = "0139
+\mathchardef\Omega = "017F
+\mathchardef\varGamma = "0100
+\mathchardef\varDelta = "0101
+\mathchardef\varTheta = "0102
+\mathchardef\varLambda = "0103
+\mathchardef\varXi = "0104
+\mathchardef\varPi = "0105
+\mathchardef\varSigma = "0106
+\mathchardef\varUpsilon = "0107
+\mathchardef\varPhi = "0108
+\mathchardef\varPsi = "0109
+\mathchardef\varOmega = "010A
+\mathchardef\varkappa = "017E
+
+\mathchardef\ldotp = "613A
+
+\mathchardef\triangleleft = "2247
+\mathchardef\triangleright = "2246
+\mathchardef\comp = "2242
+
+\mathchardef\Relbar = "3248
+\mathchardef\dagger = "20\daghex % to do
+\mathchardef\ddagger = "20\ddaghex % to do
+\mathchardef\dotacc = "0250
+
+\mathcode`\( = "412E
+\mathcode`\) = "512F
+\mathcode`\. = "013A
+\mathcode`\, = "613B
+\mathcode`\+ = "2243
+\mathcode`\= = "3244
+\mathcode`\; = "6249
+
+\delcode `\( = "12E300
+\delcode `\) = "12F301
+
+\let\mit=\undefined % to do
+
+\def\vec{\mathaccent"0245 }
+\def\t#1{{\edef\next{\the\font}\the\textfont2\accent"41\next#1}}
+
+% fam equals -1 unless the user has said something
+% like \rm (cf. the texbook page 290)
+
+\def\ifdefaultfamelse#1#2%
+ {\ifnum\fam=\minusone\mathaccent#1\else\mathaccent#2\fi}
+
+\let\noaccents@\relax
+
+\def\grave {\ifdefaultfamelse{"024A}{"70\gravehex}}
+\def\acute {\ifdefaultfamelse{"024B}{"70\acutehex}}
+\def\check {\ifdefaultfamelse{"024C}{"70\checkhex}}
+\def\breve {\ifdefaultfamelse{"024D}{"70\brevehex}}
+\def\bar {\ifdefaultfamelse{"024E}{"70\barhex }}
+\def\hat {\ifdefaultfamelse{"024F}{"70\hathex }}
+\def\dot {\ifdefaultfamelse{"0250}{"70\dothex }}
+\def\tilde {\ifdefaultfamelse{"0251}{"70\tildehex}}
+\def\ddot {\ifdefaultfamelse{"0252}{"70\ddothex }}
+
+\def\widebar{\mathaccent"0253 }
+
+\def\mathhexbox@#1#2#3%
+ {\relax
+ \ifmmode
+ \mathpalette{}{\mathsurround\zeropoint\rm\mathchar"#1#2#3}%
+ \else
+ \leavevmode
+ \hbox{$\mathsurround\zeropoint\rm\mathchar"#1#2#3$}%
+ \fi}
+
+\def\dag {\edef\next@{0\daghex }\expandafter\mathhexbox@\next@}
+\def\ddag{\edef\next@{0\ddaghex}\expandafter\mathhexbox@\next@}
+
+\def\S{\edef\next@{0\Shex}\expandafter\mathhexbox@\next@}
+\def\P{\edef\next@{0\Phex}\expandafter\mathhexbox@\next@}
+
+\def\vdots%
+ {\vbox
+ {\baselineskip4\points
+ \lineskiplimit\zeropoint
+ \kern6\points\hbox{$\mathsurround\zeropoint.$}\hbox{$\mathsurround\zeropoint.$}\hbox{$\mathsurround\zeropoint.$}}}
+
+\def\ddots%
+ {\mathinner
+ {\mkern1mu
+ \raise7\points\vbox{\kern 7\points\hbox{$\mathsurround\zeropoint.$}}\mkern2mu
+ \raise4\points\hbox{$\mathsurround\zeropoint.$}\mkern2mu
+ \raise \points\hbox{$\mathsurround\zeropoint.$}\mkern1mu}}
+
+\def\hbar
+ {{\mathchoice
+ {\hbox{\lower.07em \hbox{$\mathchar"\barhex$}}}
+ {\hbox{\lower.07em \hbox{$\mathchar"\barhex$}}}
+ {\hbox{\lower.049em\hbox{$\scriptstyle\mathchar"\barhex$}}}
+ {\hbox{\lower.035em\hbox{$\scriptscriptstyle\mathchar"\barhex$}}}%
+ \mkern-6.3muh}}
+
+\def\angle%
+ {{\vbox{\ialign{$\mathsurround\zeropoint\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.48\points\hfill\mkern2.5mu\crcr}}}}
+
+\newdimen\amstexex
+
+\amstexex = .2326ex
+
+\def\varinjlim%
+ {\mathop{\vtop{\ialign{##\crcr
+ \hfil\the\textfont\zerocount lim\hfil\crcr
+ \noalign{\nointerlineskip}\rightarrowfill\crcr
+ \noalign{\nointerlineskip\kern-\amstexex}\crcr}}}}
+
+\def\varprojlim%
+ {\mathop{\vtop{\ialign{##\crcr
+ \hfil\the\textfont\zerocount lim\hfil\crcr
+ \noalign{\nointerlineskip}\leftarrowfill\crcr
+ \noalign{\nointerlineskip\kern-\amstexex}\crcr}}}}
+
+\def\varliminf{\mathop{\underbar {lim}}} % context-ified
+\def\varlimsup{\mathop{\overstrike{lim}}} % context-ified
+
+\def\spdot {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount .}}}}
+\def\spddot {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount ..}}}}
+\def\spdddot {^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount ...}}}}
+\def\spddddot{^{\hbox{\raise\amstexex\hbox{\the\textfont\zerocount....}}}}
+
+%D Here some code is merged in order to save strings.
+
+\def\domultidot#1#2%
+ {\setbox0\hbox{$#1#2$}%
+ \setbox2\hbox{$#1\infty$}%
+ \dimen0\ht2
+ \ifdim\ht0<\dimen0 \dimen0\ht0 \fi
+ \setbox2\hbox{$#1#2\mathchar"012D$}%
+ \dimen2\wd2
+ \advance\dimen2-\wd0
+ \setbox0\hbox{$#1\rhook$}%
+ \advance\dimen2-\wd0
+ \vbox
+ {\offinterlineskip
+ \ialign{\hfil$#1##$\hfil\cr
+ \kern\dimen2\dotacc\mkern-2.5mu\dotacc\mkern-2.5mu\dotacc\thirddot\cr
+ \noalign{\vskip-\dimen0}%
+ #2\cr}}}
+
+\def\dddot%
+ {\def\thirddot{}%
+ \mathpalette\domultidot}
+
+\def\ddddot%
+ {\def\thirddot{\mkern-2.5mu\dotacc}%
+ \mathpalette\domultidot}
+
+\newcount\uproot@
+\newcount\leftroot@
+
+\def\nonmatherr#1%
+ {\errmessage{\noexpand#1allowed only in math mode}}
+
+\def\uproot#1%
+ {\relax
+ \ifmmode
+ \uproot@#1\relax
+ \else
+ \nonmatherr\uproot
+ \fi}
+
+\def\leftroot#1%
+ {\relax
+ \ifmmode
+ \leftroot@#1\relax
+ \else
+ \nonmatherr\leftroot
+ \fi}
+
+\def\root#1\of#2%
+ {\setbox\rootbox=\hbox{$\mathsurround\zeropoint\scriptscriptstyle{#1}$}%
+ \mathpalette\r@@t{#2}}
+
+\def\r@@t#1#2%
+ {\setbox\zerocount\hbox{$\uproot@\zerocount\leftroot\zerocount\mathsurround\zeropoint#1\sqrt{#2}$}%
+ \dimen@\ht\zerocount\advance\dimen@-\dp\zerocount
+ \dimen@ii\dimen@
+ \ifdim\dimen@>30\points \advance\dimen@ii-16\points \else
+ \ifdim\dimen@>24\points \advance\dimen@ii -8\points \else
+ \ifdim\dimen@>18\points \advance\dimen@ii -6\points \else
+ \ifdim\dimen@>12\points \advance\dimen@ii -4\points \else
+ \ifdim\dimen@>10\points \advance\dimen@ii -2\points \fi\fi\fi\fi\fi
+ \setbox\plustwo=\hbox{$\mathsurround\zeropoint#1\mskip\uproot@ mu$}%
+ \advance\dimen@ii by1.667\wd\plustwo
+ \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@ii\copy\rootbox
+ \mkern-8mu\mkern\leftroot@ mu\box\zerocount\leftroot\zerocount\uproot\zerocount}
+
+\def\space@.{\futurelet\space@\relax} \space@. % really needed ?
+
+\def\jadjust%
+ {\mkern-\plustwo mu}
+
+%D For the moment the following code is left unchanged. It is
+%D not used anyway.
+
+\newif\ifsubscriptcorrection \subscriptcorrectionfalse
+
+\ifsubscriptcorrection
+
+ \expandafter\let\csname subscript character \string_\endcsname_
+
+ \catcode`\_=\active
+
+ \def_%
+ {\ifmmode
+ \expandafter\sb@
+ \else
+ \expandafter\csname subscript character \string_\endcsname
+ \fi}
+
+ \let\sb_
+
+ \ifnum\catcode`\^^A=8 \catcode`\^^A\active\let^^A_\fi
+
+ \def\sb@#1%
+ {\csname subscript character \string_\endcsname
+ {\futurelet\next\sb@@#1}}
+
+ \def\sb@@%
+ {\ifx\next\space@
+ \def\next@. %
+ {\futurelet\next\sb@@}%
+ \else
+ \def\next@.%
+ {\ifx\next j%
+ \mkern-\plustwo mu\else
+ \ifx\next f%
+ \mkern-\plustwo mu\else
+ \ifx\next p%
+ \mkern-\plusone mu\fi\fi\fi}%
+ \fi
+ \next@.}
+
+\fi
+
+\protect
diff --git a/tex/context/base/math-uni.mkii b/tex/context/base/math-uni.mkii
new file mode 100644
index 000000000..e8fd3f05d
--- /dev/null
+++ b/tex/context/base/math-uni.mkii
@@ -0,0 +1,237 @@
+%D \module
+%D [ file=math-uni,
+%D version=2005.06.11,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=unicode support,
+%D author={Nikolai Weibull \& Taco Hoekwater},
+%D date=\currentdate,
+%D copyright=PRAGMA]
+
+\unprotect
+
+% needed for unic-032 % TH
+
+\startmathcollection[default]
+
+ \definemathcommand [unic@doubleverticalline] {\mathord{\parallel}}
+ \definemathcommand [unic@doublelowline] {\underline{\textunderscore}}
+
+ \definemathcommand [unic@doubleprime] {''}
+ \definemathcommand [unic@tripleprime] {'''}
+
+ \definemathcommand [unic@reverseddoubleprime] {\mathord{\backprime\backprime}}
+ \definemathcommand [unic@reversedtripleprime] {\mathord{\backprime\backprime\backprime}}
+
+ \definemathcommand [unic@fractionslash] {\vulgarfraction{}{}}
+ \definemathcommand [unic@lowasterisk] {\mathord{\lower-.2em\hbox{$\ast$}}}
+
+ \definemathcommand [unic@functionapplication] {\mathop{}}
+ \definemathcommand [unic@invisibletimes] {\mathbin{}}
+ \definemathcommand [unic@invisibleseparator] {\mathpunct{}}
+
+\stopmathcollection
+
+% needed for unic-033 % TH
+
+\def\unic@vulgarfraction#1#2%
+ {\hbox
+ {\high{{\tfx\it #1}\kern -.2em}%
+ \symbol[vulgarfraction]%
+ \kern -.2em\low{{\tfx\it #2}}}}
+
+\startmathcollection[default]
+
+ \definemathcommand [unic@accountof] {\unic@vulgarfraction{a}{c}}
+ \definemathcommand [unic@addressedtothesubject] {\unic@vulgarfraction{a}{s}}
+ \definemathcommand [unic@doublestruckC] {{\Bbb C}}
+ \definemathcommand [unic@degreecelsius] {{\textdegree \tf C}}
+ \definemathcommand [unic@centrelinesymbol] {\unknownchar}
+ \definemathcommand [unic@careof] {\unic@vulgarfraction{c}{o}}
+ \definemathcommand [unic@cadauna] {\unic@vulgarfraction{c}{u}}
+ \definemathcommand [unic@eulerconstant] {{\rm e}}
+ \definemathcommand [unic@scruple] {\unknownchar}
+ \definemathcommand [unic@degreefahrenheit] {{\textdegree \tf F}}
+ \definemathcommand [unic@scriptg] {\unknownchar}
+ \definemathcommand [unic@scriptH] {{\cal H}}
+ \definemathcommand [unic@blackletterH] {{\fraktur H}}
+ \definemathcommand [unic@doublestruckH] {{\Bbb H}}
+ \definemathcommand [unic@planckconstant] {h}
+ \definemathcommand [unic@planckconstantovertwopi] {\hslash}
+ \definemathcommand [unic@scriptI] {{\cal I}}
+ \definemathcommand [unic@blackletterI] {{\fraktur I}}
+ \definemathcommand [unic@scriptL] {{\cal L}}
+ \definemathcommand [unic@scriptl] {\ell}
+ \definemathcommand [unic@lbbarsymbol] {\unknownchar}
+ \definemathcommand [unic@doublestruckN] {{\Bbb N}}
+ \definemathcommand [unic@numerosign] {\hbox{\symbol[numero]}}
+ \definemathcommand [unic@soundrecordingcopyright] {\encircled{{\tfx P}}}
+ \definemathcommand [unic@scriptP] {{\cal P}}
+ \definemathcommand [unic@doublestruckP] {{\Bbb P}}
+ \definemathcommand [unic@doublestruckQ] {{\Bbb Q}}
+ \definemathcommand [unic@scriptR] {{\cal R}}
+ \definemathcommand [unic@blackletterR] {{\fraktur R}}
+ \definemathcommand [unic@doublestruckR] {{\Bbb R}}
+ \definemathcommand [unic@prescriptiontake] {\unknownchar}
+ \definemathcommand [unic@response] {\unknownchar}
+ \definemathcommand [unic@servicemark] {\high{\txx SM}}
+ \definemathcommand [unic@telephonesign] {\high{\txx TEL}}
+ \definemathcommand [unic@trademarksign] {\trademark}
+ \definemathcommand [unic@versickle] {\unknownchar}
+ \definemathcommand [unic@doublestruckZ] {{\Bbb Z}}
+ \definemathcommand [unic@ouncesign] {\unknownchar}
+ \definemathcommand [unic@ohmsign] {\Omega}
+ \definemathcommand [unic@invertedohmsign] {\rotate[\c!rotation=180]{\Omega}}
+ \definemathcommand [unic@blackletterZ] {{\fraktur Z}}
+ \definemathcommand [unic@turnedgreekletteriota] {\rotate[\c!rotation=180]{\iota}}
+ \definemathcommand [unic@kelvinsign] {{\tf K}}
+ \definemathcommand [unic@angstromsign] {\Angstrom}
+ \definemathcommand [unic@scriptB] {{\cal B}}
+ \definemathcommand [unic@blackletterC] {{\fraktur C}}
+ \definemathcommand [unic@estimatedsymbol] {\unknownchar}
+ \definemathcommand [unic@scripte] {\unknownchar}
+ \definemathcommand [unic@scriptE] {{\cal E}}
+ \definemathcommand [unic@scriptF] {{\cal F}}
+ \definemathcommand [unic@turnedF] {\rotate[\c!rotation=180]{{\tf F}}}
+ \definemathcommand [unic@scriptM] {{\cal M}}
+ \definemathcommand [unic@scripto] {\unknownchar}
+
+ \definemathcommand [unic@informationsource] {{\bf i}}
+ \definemathcommand [unic@rotatedQ] {\rotate[\c!rotation=90]{{\tf Q}}}
+ \definemathcommand [unic@facsimilesign] {\unknownchar}
+ \definemathcommand [unic@doublestruckpi] {\pi}%{\unknownchar}
+ \definemathcommand [unic@doublestruckgamma] {\gamma}%{\unknownchar}
+ \definemathcommand [unic@doublestruckGamma] {\Gamma}%{\unknownchar}
+ \definemathcommand [unic@doublestruckPi] {\Pi}%{\unknownchar}
+ \definemathcommand [unic@doublestrucknarysummation] {\unknownchar}
+ \definemathcommand [unic@turnedsansserifG] {\rotate[\c!rotation=180]{{\ss G}}}
+ \definemathcommand [unic@turnedsansserifL] {\rotate[\c!rotation=180]{{\ss L}}}
+ \definemathcommand [unic@reversedsansserifL] {\mirror{{\ss L}}}
+ \definemathcommand [unic@turnedsansserifY] {\rotate[\c!rotation=180]{{\ss Y}}}
+ \definemathcommand [unic@doublestruckitalicD] {D}%{\unknownchar}
+ \definemathcommand [unic@doublestruckitalicd] {d}%{\unknownchar}
+ \definemathcommand [unic@doublestruckitalice] {e}%{\unknownchar}
+ \definemathcommand [unic@doublestruckitalici] {i}%{\unknownchar}
+ \definemathcommand [unic@doublestruckitalicj] {j}%{\unknownchar}
+ \definemathcommand [unic@propertyline] {\unknownchar}
+ \definemathcommand [unic@turnedampersand] {\rotate[\c!rotation=180]{\&}}
+ \definemathcommand [unic@persign] {\unknownchar}
+
+ \definemathcommand [unic@fractiononethird] {\vulgarfraction{1}{3}}
+ \definemathcommand [unic@fractiontwothirds] {\vulgarfraction{2}{3}}
+ \definemathcommand [unic@fractiononefifth] {\vulgarfraction{1}{5}}
+ \definemathcommand [unic@fractiontwofifths] {\vulgarfraction{2}{5}}
+ \definemathcommand [unic@fractionthreefifths] {\vulgarfraction{3}{5}}
+ \definemathcommand [unic@fractionfourfifths] {\vulgarfraction{4}{5}}
+ \definemathcommand [unic@fractiononesixth] {\vulgarfraction{1}{6}}
+ \definemathcommand [unic@fractionfivesixths] {\vulgarfraction{5}{6}}
+ \definemathcommand [unic@fractiononeeighth] {\vulgarfraction{1}{8}}
+ \definemathcommand [unic@fractionthreeeighths] {\vulgarfraction{3}{8}}
+ \definemathcommand [unic@fractionfiveeighths] {\vulgarfraction{5}{8}}
+ \definemathcommand [unic@fractionseveneighths] {\vulgarfraction{7}{8}}
+ \definemathcommand [unic@fractionnumeratorone] {\vulgarfraction{1}{}}
+ \definemathcommand [unic@romannumeralOne] {{\tf I}}
+ \definemathcommand [unic@romannumeralTwo] {{\tf II}}
+ \definemathcommand [unic@romannumeralThree] {{\tf III}}
+ \definemathcommand [unic@romannumeralFour] {{\tf IV}}
+ \definemathcommand [unic@romannumeralFive] {{\tf V}}
+ \definemathcommand [unic@romannumeralSix] {{\tf VI}}
+ \definemathcommand [unic@romannumeralSeven] {{\tf VII}}
+ \definemathcommand [unic@romannumeralEight] {{\tf VIII}}
+ \definemathcommand [unic@romannumeralNine] {{\tf IX}}
+ \definemathcommand [unic@romannumeralTen] {{\tf X}}
+ \definemathcommand [unic@romannumeralEleven] {{\tf XI}}
+ \definemathcommand [unic@romannumeralTwelve] {{\tf XII}}
+ \definemathcommand [unic@romannumeralFifty] {{\tf L}}
+ \definemathcommand [unic@romannumeralOnehundred] {{\tf C}}
+ \definemathcommand [unic@romannumeralFivehundred] {{\tf D}}
+ \definemathcommand [unic@romannumeralOnethousand] {{\tf M}}
+ \definemathcommand [unic@romannumeralone] {{\tf i}}
+ \definemathcommand [unic@romannumeraltwo] {{\tf ii}}
+ \definemathcommand [unic@romannumeralthree] {{\tf iii}}
+ \definemathcommand [unic@romannumeralfour] {{\tf iv}}
+ \definemathcommand [unic@romannumeralfive] {{\tf v}}
+ \definemathcommand [unic@romannumeralsix] {{\tf vi}}
+ \definemathcommand [unic@romannumeralseven] {{\tf vii}}
+ \definemathcommand [unic@romannumeraleight] {{\tf viii}}
+ \definemathcommand [unic@romannumeralnine] {{\tf ix}}
+ \definemathcommand [unic@romannumeralten] {{\tf x}}
+ \definemathcommand [unic@romannumeraleleven] {{\tf xi}}
+ \definemathcommand [unic@romannumeraltwelve] {{\tf xii}}
+ \definemathcommand [unic@romannumeralfifty] {{\tf l}}
+ \definemathcommand [unic@romannumeralonehundred] {{\tf c}}
+ \definemathcommand [unic@romannumeralfivehundred] {{\tf d}}
+ \definemathcommand [unic@romannumeralonethousand] {{\tf m}}
+ \definemathcommand [unic@romannumeralonethousandCD] {\unknownchar}
+ \definemathcommand [unic@romannumeralfivethousand] {\unknownchar}
+ \definemathcommand [unic@romannumeraltenthousand] {\unknownchar}
+ \definemathcommand [unic@romannumeralreversedonehundred] {\mirror{C}}
+
+\stopmathcollection
+
+% needed for unic-033 % NW
+
+\startmathcollection[default]
+
+ \definemathcommand [unic@leftarrowtobar] {\mapstochar\leftarrow}
+
+\stopmathcollection
+
+% needed for unic-034 % NW
+
+\startmathcollection[default]
+
+ \definemathcommand [unic@in] {\in}
+ \definemathcommand [unic@nin] {\not\in}
+ \definemathcommand [unic@nni] {\not\ni}
+ \definemathcommand [unic@minus] {-}
+ \definemathcommand [unic@divisionslash] {/}
+ \definemathcommand [unic@sqrt] {\sqrt{}}
+ \definemathcommand [unic@cubesqrt] {\root 3 \of {}}
+ \definemathcommand [unic@fourthsqrt] {\root 4 \of {}}
+ \definemathcommand [unic@divides] [op] {|} % TODO
+ \definemathcommand [unic@ndivides] [rel] {\mathop{\not|}} % TODO: horrible
+ \definemathcommand [unic@cap] {\cap}
+ \definemathcommand [unic@dblint] {\int\!\!\!\int}
+ \definemathcommand [unic@triint] {\int\!\!\!\int\!\!\!\int}
+ \definemathcommand [unic@ratio] [rel] {:}
+ \definemathcommand [unic@proportion] [rel] {::}
+ \definemathcommand [unic@excess] [op] {-\!\!:}
+ \definemathcommand [unic@geomprop] [op] {:\!\!\!-\!\!\!:}
+ \definemathcommand [unic@homothetic] [op] {\sim\!\!\!:}
+ \definemathcommand [unic@nsimeq] {\not\simeq}
+ \definemathcommand [unic@cong] {\cong}
+ \definemathcommand [unic@napproxeq] {\not\approxeq}
+ \definemathcommand [unic@napprox] {\not\approx}
+ \definemathcommand [unic@doteq] {\doteq}
+ \definemathcommand [unic@correspondsto] {\buildrel \frown \over =}
+ \definemathcommand [unic@estimates] {\buildrel \wedge \over =}
+ \definemathcommand [unic@equiangularto] {\buildrel \vee \over =}
+ \definemathcommand [unic@stareq] {\buildrel \star \over =}
+ \definemathcommand [unic@eqbydef] {\buildrel \rm def \over =}
+ \definemathcommand [unic@measuredby] {\buildrel \rm m \over =}
+ \definemathcommand [unic@questionedeq] {\buildrel \rm ? \over =}
+ \definemathcommand [unic@nequiv] {\not\equiv}
+ \definemathcommand [unic@nasymp] {\not\asymp}
+ \definemathcommand [unic@nlesssim] {\not\lesssim}
+ \definemathcommand [unic@ngtrsim] {\not\gtrsim}
+ \definemathcommand [unic@nlessgtr] {\not\lessgtr}
+ \definemathcommand [unic@ngtrless] {\not\gtrless}
+ \definemathcommand [unic@nsubset] {\not\subset}
+ \definemathcommand [unic@nsupset] {\not\supset}
+ \definemathcommand [unic@nsqsubseteq] {\not\sqsubseteq}
+ \definemathcommand [unic@nsqsupseteq] {\not\sqsupseteq}
+
+\stopmathcollection
+
+% needed for unic-039 % NW
+
+\startmathcollection[default]
+
+ \definemathcommand [unic@Lbracket] [open] {[\![}
+ \definemathcommand [unic@Rbracket] [close] {]\!]}
+ \definemathcommand [unic@Langle] [open] {\langle\!\langle}
+ \definemathcommand [unic@Rangle] [close] {\rangle\!\rangle}
+
+\stopmathcollection
+
+\protect \endinput
diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua
new file mode 100644
index 000000000..5023e6b4d
--- /dev/null
+++ b/tex/context/base/math-vfu.lua
@@ -0,0 +1,1379 @@
+if not modules then modules = { } end modules ['math-vfu'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- All these math vectors .. thanks to Aditya and Mojca they become
+-- better and better. If you have problems with math fonts or miss
+-- characters report it to the ConTeXt mailing list.
+
+local type, next = type, next
+
+local trace_virtual = false trackers.register("math.virtual", function(v) trace_virtual = v end)
+local trace_timings = false trackers.register("math.timings", function(v) trace_timings = v end)
+
+fonts.enc.math = fonts.enc.math or { }
+
+local shared = { }
+
+fonts.vf.math = fonts.vf.math or { }
+fonts.vf.math.optional = false
+
+local push, pop, back = { "push" }, { "pop" }, { "slot", 1, 0x2215 }
+
+local function negate(main,characters,id,size,unicode,basecode)
+ if not characters[unicode] then
+ local basechar = characters[basecode]
+ if basechar then
+ local ht, wd = basechar.height, basechar.width
+ characters[unicode] = {
+ width = wd,
+ height = ht,
+ depth = basechar.depth,
+ italic = basechar.italic,
+ kerns = basechar.kerns,
+ commands = {
+ { "slot", 1, basecode },
+ push,
+ { "down", ht/5},
+ { "right", - wd/2},
+ back,
+ push,
+ }
+ }
+ end
+ end
+end
+
+--~ \Umathchardef\braceld="0 "1 "FF07A
+--~ \Umathchardef\bracerd="0 "1 "FF07B
+--~ \Umathchardef\bracelu="0 "1 "FF07C
+--~ \Umathchardef\braceru="0 "1 "FF07D
+
+local function brace(main,characters,id,size,unicode,first,rule,left,right,rule,last)
+ if not characters[unicode] then
+ characters[unicode] = {
+ horiz_variants = {
+ { extender = 0, glyph = first },
+ { extender = 1, glyph = rule },
+ { extender = 0, glyph = left },
+ { extender = 0, glyph = right },
+ { extender = 1, glyph = rule },
+ { extender = 0, glyph = last },
+ }
+ }
+ end
+end
+
+local function arrow(main,characters,id,size,unicode,arrow,minus,isleft)
+ if characters[unicode] then
+ if isleft then
+ t = {
+ { extender = 0, glyph = arrow },
+ { extender = 1, glyph = minus },
+ }
+ else
+ t = {
+ { extender = 0, glyph = minus },
+ { extender = 1, glyph = arrow },
+ }
+ end
+ --~ main.characters[unicode] = { horiz_variants = t }
+ characters[unicode].horiz_variants = t
+ end
+end
+
+local function parent(main,characters,id,size,unicode,first,rule,last)
+ if not characters[unicode] then
+ characters[unicode] = {
+ horiz_variants = {
+ { extender = 0, glyph = first },
+ { extender = 1, glyph = rule },
+ { extender = 0, glyph = last },
+ }
+ }
+ end
+end
+
+local push, pop, step = { "push" }, { "pop" }, 0.2 -- 0.1 is nicer but gives larger files
+
+local function make(main,characters,id,size,n,m)
+ local old = 0xFF000+n
+ local c = characters[old]
+ if c then
+ local upslot, dnslot, uprule, dnrule = 0xFF100+n, 0xFF200+n, 0xFF300+m, 0xFF400+m
+ local xu = main.parameters.x_height + 0.3*size
+ local xd = 0.3*size
+ local w, h, d = c.width, c.height, c.depth
+ local thickness = h - d
+ local rulewidth = step*size -- we could use an overlap
+ local slot = { "slot", id, old }
+ local rule = { "rule", thickness, rulewidth }
+ local up = { "down", -xu }
+ local dn = { "down", xd }
+ local ht, dp = xu + 3*thickness, 0
+ if not characters[uprule] then
+ characters[uprule] = { width = rulewidth, height = ht, depth = dp, commands = { push, up, rule, pop } }
+ end
+ characters[upslot] = { width = w, height = ht, depth = dp, commands = { push, up, slot, pop } }
+ local ht, dp = 0, xd + 3*thickness
+ if not characters[dnrule] then
+ characters[dnrule] = { width = rulewidth, height = ht, depth = dp, commands = { push, dn, rule, pop } }
+ end
+ characters[dnslot] = { width = w, height = ht, depth = dp, commands = { push, dn, slot, pop } }
+ end
+end
+
+local function minus(main,characters,id,size,unicode)
+ local minus = characters[0x002D]
+ if minus then
+ local mu = size/18
+ local width = minus.width - 5*mu
+ characters[unicode] = {
+ width = width, height = minus.height, depth = minus.depth,
+ commands = { push, { "right", -3*mu }, { "slot", id, 0x002D }, pop }
+ }
+ end
+end
+
+local function dots(main,characters,id,size,unicode)
+ local c = characters[0x002E]
+ if c then
+ local w, h, d = c.width, c.height, c.depth
+ local mu = size/18
+ local right3mu = { "right", 3*mu }
+ local right1mu = { "right", 1*mu }
+ local up1size = { "down", -.1*size }
+ local up4size = { "down", -.4*size }
+ local up7size = { "down", -.7*size }
+ local right2muw = { "right", 2*mu + w }
+ local slot = { "slot", id, 0x002E }
+ if unicode == 0x22EF then
+ local c = characters[0x022C5]
+ if c then
+ local w, h, d = c.width, c.height, c.depth
+ local slot = { "slot", id, 0x022C5 }
+ characters[unicode] = {
+ width = 3*w + 2*3*mu, height = h, depth = d,
+ commands = { push, slot, right3mu, slot, right3mu, slot, pop }
+ }
+ end
+ elseif unicode == 0x22EE then
+ -- weird height !
+ characters[unicode] = {
+ width = w, height = h+(1.4)*size, depth = 0,
+ commands = { push, push, slot, pop, up4size, push, slot, pop, up4size, slot, pop }
+ }
+ elseif unicode == 0x22F1 then
+ characters[unicode] = {
+ width = 3*w + 6*size/18, height = 1.5*size, depth = 0,
+ commands = {
+ push,
+ right1mu,
+ push, up7size, slot, pop,
+ right2muw,
+ push, up4size, slot, pop,
+ right2muw,
+ push, up1size, slot, pop,
+ right1mu,
+ pop
+ }
+ }
+ elseif unicode == 0x22F0 then
+ characters[unicode] = {
+ width = 3*w + 6*size/18, height = 1.5*size, depth = 0,
+ commands = {
+ push,
+ right1mu,
+ push, up1size, slot, pop,
+ right2muw,
+ push, up4size, slot, pop,
+ right2muw,
+ push, up7size, slot, pop,
+ right1mu,
+ pop
+ }
+ }
+ else
+ characters[unicode] = {
+ width = 3*w + 2*3*mu, height = h, depth = d,
+ commands = { push, slot, right3mu, slot, right3mu, slot, pop }
+ }
+ end
+ end
+end
+
+local function vertbar(main,characters,id,size,parent,scale,unicode)
+ local cp = characters[parent]
+ if cp then
+ local sc = scale * size
+ local pc = { "slot", id, parent }
+ characters[unicode] = {
+ width = cp.width,
+ height = cp.height + sc,
+ depth = cp.depth + sc,
+ commands = {
+ push, { "down", -sc }, pc, pop,
+ push, { "down", sc }, pc, pop,
+ pc,
+ },
+ next = cp.next -- can be extensible
+ }
+ cp.next = unicode
+ end
+end
+
+function fonts.vf.math.alas(main,id,size)
+ local characters = main.characters
+ for i=0x7A,0x7D do
+ make(main,characters,id,size,i,1)
+ end
+ brace (main,characters,id,size,0x23DE,0xFF17A,0xFF301,0xFF17D,0xFF17C,0xFF301,0xFF17B)
+ brace (main,characters,id,size,0x23DF,0xFF27C,0xFF401,0xFF27B,0xFF27A,0xFF401,0xFF27D)
+ parent (main,characters,id,size,0x23DC,0xFF17A,0xFF301,0xFF17B)
+ parent (main,characters,id,size,0x23DD,0xFF27C,0xFF401,0xFF27D)
+ negate (main,characters,id,size,0x2260,0x003D)
+ dots (main,characters,id,size,0x2026) -- ldots
+ dots (main,characters,id,size,0x22EE) -- vdots
+ dots (main,characters,id,size,0x22EF) -- cdots
+ dots (main,characters,id,size,0x22F1) -- ddots
+ dots (main,characters,id,size,0x22F0) -- udots
+ minus (main,characters,id,size,0xFF501)
+ arrow (main,characters,id,size,0x2190,0xFE190,0xFF501,true) -- left
+ arrow (main,characters,id,size,0x2192,0xFE192,0xFF501,false) -- right
+ vertbar(main,characters,id,size,0x0007C,0.10,0xFF601) -- big : 0.85 bodyfontsize
+ vertbar(main,characters,id,size,0xFF601,0.30,0xFF602) -- Big : 1.15 bodyfontsize
+ vertbar(main,characters,id,size,0xFF602,0.30,0xFF603) -- bigg : 1.45 bodyfontsize
+ vertbar(main,characters,id,size,0xFF603,0.30,0xFF604) -- Bigg : 1.75 bodyfontsize
+ vertbar(main,characters,id,size,0x02225,0.10,0xFF605)
+ vertbar(main,characters,id,size,0xFF605,0.30,0xFF606)
+ vertbar(main,characters,id,size,0xFF606,0.30,0xFF607)
+ vertbar(main,characters,id,size,0xFF607,0.30,0xFF608)
+end
+
+local unique = 0 -- testcase: \startTEXpage \math{!\text{-}\text{-}\text{-}} \stopTEXpage
+
+function fonts.basecopy(tfmtable,name)
+ local characters, parameters, fullname = tfmtable.characters, tfmtable.parameters, tfmtable.fullname
+ local t, c, p = { }, { }, { }
+ for k, v in next, tfmtable do
+ t[k] = v
+ end
+ if characters then
+ for k, v in next, characters do
+ c[k] = v
+ end
+ t.characters = c
+ else
+ logs.report("math virtual","font %s has no characters",name)
+ end
+ if parameters then
+ for k, v in next, parameters do
+ p[k] = v
+ end
+ t.parameters = p
+ else
+ logs.report("math virtual","font %s has no parameters",name)
+ end
+ -- tricky ... what if fullname does not exist
+ if fullname then
+ unique = unique + 1
+ t.fullname = fullname .. "-" .. unique
+ end
+ return t
+end
+
+local reported = { }
+local reverse -- index -> unicode
+
+function fonts.vf.math.define(specification,set)
+ if not reverse then
+ reverse = { }
+ for k, v in next, fonts.enc.math do
+ local r = { }
+ for u, i in next, v do
+ r[i] = u
+ end
+ reverse[k] = r
+ end
+ end
+ local name = specification.name -- symbolic name
+ local size = specification.size -- given size
+ local fnt, lst, main = { }, { }, nil
+ local start = (trace_virtual or trace_timings) and os.clock()
+ local okset, n = { }, 0
+ for s=1,#set do
+ local ss = set[s]
+ local ssname = ss.name
+ if ss.optional and fonts.vf.math.optional then
+ if trace_virtual then
+ logs.report("math virtual","loading font %s subfont %s with name %s at %s is skipped",name,s,ssname,size)
+ end
+ else
+ if ss.features then ssname = ssname .. "*" .. ss.features end
+ if ss.main then main = s end
+ local f, id = fonts.tfm.read_and_define(ssname,size)
+ if not f then
+ logs.report("math virtual","loading font %s subfont %s with name %s at %s is skipped, not found",name,s,ssname,size)
+ else
+ n = n + 1
+ okset[n] = ss
+ fnt[n] = f
+ lst[n] = { id = id, size = size }
+ if not shared[s] then shared[n] = { } end
+ if trace_virtual then
+ logs.report("math virtual","loading font %s subfont %s with name %s at %s as id %s using encoding %s",name,s,ssname,size,id,ss.vector or "none")
+ end
+ end
+ end
+ end
+ -- beware, fnt[1] is already passed to tex (we need to make a simple copy then .. todo)
+ main = fonts.basecopy(fnt[1],name)
+ main.name, main.fonts, main.virtualized, main.math_parameters = name, lst, true, { }
+ local characters, descriptions = main.characters, main.descriptions
+ local mp = main.parameters
+ if mp then
+ mp.x_height = mp.x_height or 0
+ end
+ local already_reported = false
+ for s=1,n do
+ local ss, fs = okset[s], fnt[s]
+ if not fs then
+ -- skip, error
+ elseif ss.optional and fonts.vf.math.optional then
+ -- skip, redundant
+ else
+ local mm, fp = main.math_parameters, fs.parameters
+ if mm and fp and mp then
+ if ss.extension then
+ mm.math_x_height = fp.x_height or 0 -- math_x_height height of x
+ mm.default_rule_thickness = fp[ 8] or 0 -- default_rule_thickness thickness of \over bars
+ mm.big_op_spacing1 = fp[ 9] or 0 -- big_op_spacing1 minimum clearance above a displayed op
+ mm.big_op_spacing2 = fp[10] or 0 -- big_op_spacing2 minimum clearance below a displayed op
+ mm.big_op_spacing3 = fp[11] or 0 -- big_op_spacing3 minimum baselineskip above displayed op
+ mm.big_op_spacing4 = fp[12] or 0 -- big_op_spacing4 minimum baselineskip below displayed op
+ mm.big_op_spacing5 = fp[13] or 0 -- big_op_spacing5 padding above and below displayed limits
+ -- logs.report("math virtual","loading and virtualizing font %s at size %s, setting ex parameters",name,size)
+ elseif ss.parameters then
+ mp.x_height = fp.x_height or mp.x_height
+ mm.x_height = mm.x_height or fp.x_height or 0 -- x_height height of x
+ mm.num1 = fp[ 8] or 0 -- num1 numerator shift-up in display styles
+ mm.num2 = fp[ 9] or 0 -- num2 numerator shift-up in non-display, non-\atop
+ mm.num3 = fp[10] or 0 -- num3 numerator shift-up in non-display \atop
+ mm.denom1 = fp[11] or 0 -- denom1 denominator shift-down in display styles
+ mm.denom2 = fp[12] or 0 -- denom2 denominator shift-down in non-display styles
+ mm.sup1 = fp[13] or 0 -- sup1 superscript shift-up in uncramped display style
+ mm.sup2 = fp[14] or 0 -- sup2 superscript shift-up in uncramped non-display
+ mm.sup3 = fp[15] or 0 -- sup3 superscript shift-up in cramped styles
+ mm.sub1 = fp[16] or 0 -- sub1 subscript shift-down if superscript is absent
+ mm.sub2 = fp[17] or 0 -- sub2 subscript shift-down if superscript is present
+ mm.sup_drop = fp[18] or 0 -- sup_drop superscript baseline below top of large box
+ mm.sub_drop = fp[19] or 0 -- sub_drop subscript baseline below bottom of large box
+ mm.delim1 = fp[20] or 0 -- delim1 size of \atopwithdelims delimiters in display styles
+ mm.delim2 = fp[21] or 0 -- delim2 size of \atopwithdelims delimiters in non-displays
+ mm.axis_height = fp[22] or 0 -- axis_height height of fraction lines above the baseline
+ -- logs.report("math virtual","loading and virtualizing font %s at size %s, setting sy parameters",name,size)
+ end
+ else
+ logs.report("math virtual","font %s, no parameters set",name)
+ end
+ local vectorname = ss.vector
+ if vectorname then
+ local offset = 0xFF000
+ local vector = fonts.enc.math[vectorname]
+ local rotcev = reverse[vectorname]
+ if vector then
+ local fc, fd, si = fs.characters, fs.descriptions, shared[s]
+ local skewchar = ss.skewchar
+ for unicode, index in next, vector do
+ local fci = fc[index]
+ if not fci then
+ local fontname = fs.name or "unknown"
+ local rf = reported[fontname]
+ if not rf then rf = { } reported[fontname] = rf end
+ local rv = rf[vectorname]
+ if not rv then rv = { } rf[vectorname] = rv end
+ local ru = rv[unicode]
+ if not ru then
+ if trace_virtual then
+ logs.report("math virtual", "unicode point U+%05X has no index %04X in vector %s for font %s",unicode,index,vectorname,fontname)
+ elseif not already_reported then
+ logs.report("math virtual", "the mapping is incomplete for '%s' at %s",name,number.topoints(size))
+ already_reported = true
+ end
+ rv[unicode] = true
+ end
+ else
+ local ref = si[index]
+ if not ref then
+ ref = { { 'slot', s, index } }
+ si[index] = ref
+ end
+ local kerns = fci.kerns
+ if kerns then
+ local width = fci.width
+ local krn = { }
+ for k=1,#kerns do
+ local rk = rotcev[k]
+ if rk then
+ krn[rk] = kerns[k]
+ end
+ end
+ if not next(krn) then
+ krn = nil
+ end
+ local t = {
+ width = width,
+ height = fci.height,
+ depth = fci.depth,
+ italic = fci.italic,
+ kerns = krn,
+ commands = ref,
+ }
+ if skewchar and kerns then
+ local k = kerns[skewchar]
+ if k then
+ t.top_accent = width/2 + k
+ end
+ end
+ characters[unicode] = t
+ else
+ characters[unicode] = {
+ width = fci.width,
+ height = fci.height,
+ depth = fci.depth,
+ italic = fci.italic,
+ commands = ref,
+ }
+ end
+ end
+ end
+ if ss.extension then
+ -- todo: if multiple ex, then 256 offsets per instance
+ local extension = fonts.enc.math["large-to-small"]
+ local variants_done = fs.variants_done
+ for index, fci in next, fc do -- the raw ex file
+ if type(index) == "number" then
+ local ref = si[index]
+ if not ref then
+ ref = { { 'slot', s, index } }
+ si[index] = ref
+ end
+ local t = {
+ width = fci.width,
+ height = fci.height,
+ depth = fci.depth,
+ italic = fci.italic,
+ commands = ref,
+ }
+ local n = fci.next
+ if n then
+ t.next = offset + n
+ elseif variants_done then
+ local vv = fci.vert_variants
+ if vv then
+ t.vert_variants = vv
+ end
+ local hv = fci.horiz_variants
+ if hv then
+ t.horiz_variants = hv
+ end
+ else
+ local vv = fci.vert_variants
+ if vv then
+ for i=1,#vv do
+ local vvi = vv[i]
+ vvi.glyph = vvi.glyph + offset
+ end
+ t.vert_variants = vv
+ end
+ local hv = fci.horiz_variants
+ if hv then
+ for i=1,#hv do
+ local hvi = hv[i]
+ hvi.glyph = hvi.glyph + offset
+ end
+ t.horiz_variants = hv
+ end
+ end
+ characters[offset + index] = t
+ end
+ end
+ fs.variants_done = true
+ for unicode, index in next, extension do
+ local cu = characters[unicode]
+ if cu then
+ cu.next = offset + index
+ --~ local n, c, d = unicode, cu, { }
+ --~ print("START", unicode)
+ --~ while n do
+ --~ n = c.next
+ --~ if n then
+ --~ print("NEXT", n)
+ --~ c = characters[n]
+ --~ if not c then
+ --~ print("EXIT")
+ --~ elseif d[n] then
+ --~ print("LOOP")
+ --~ break
+ --~ end
+ --~ d[n] = true
+ --~ end
+ --~ end
+ else
+ local fci = fc[index]
+ if not fci then
+--~ characters[unicode] = {
+--~ width = 0,
+--~ height = 0,
+--~ depth = 0,
+--~ index = 0,
+--~ }
+ else
+ local ref = si[index]
+ if not ref then
+ ref = { { 'slot', s, index } }
+ si[index] = ref
+ end
+ local kerns = fci.kerns
+ if kerns then
+ local krn = { }
+ for k=1,#kerns do
+ krn[offset + k] = kerns[k]
+ end
+ characters[unicode] = {
+ width = fci.width,
+ height = fci.height,
+ depth = fci.depth,
+ italic = fci.italic,
+ commands = ref,
+ kerns = krn,
+ next = offset + index,
+ }
+ else
+ characters[unicode] = {
+ width = fci.width,
+ height = fci.height,
+ depth = fci.depth,
+ italic = fci.italic,
+ commands = ref,
+ next = offset + index,
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ mathematics.extras.copy(main) --not needed here (yet)
+ end
+ end
+ lst[#lst+1] = { id = font.nextid(), size = size }
+ if mp then -- weak catch
+ fonts.vf.math.alas(main,#lst,size)
+ end
+ if trace_virtual or trace_timings then
+ logs.report("math virtual","loading and virtualizing font %s at size %s took %0.3f seconds",name,size,os.clock()-start)
+ end
+ main.has_italic = true
+ main.type = "virtual" -- not needed
+ mathematics.scaleparameters(main,main,1)
+ main.nomath = false
+--~ print(table.serialize(characters[0x222B]))
+--~ print(main.fontname,table.serialize(main.MathConstants))
+ return main
+end
+
+function mathematics.make_font(name, set)
+ fonts.define.methods[name] = function(specification)
+ return fonts.vf.math.define(specification,set)
+ end
+end
+
+-- varphi is part of the alphabet, contrary to the other var*s'
+
+fonts.enc.math["large-to-small"] = {
+ [0x00028] = 0x00, -- (
+ [0x00029] = 0x01, -- )
+ [0x0005B] = 0x02, -- [
+ [0x0005D] = 0x03, -- ]
+ [0x0230A] = 0x04, -- lfloor
+ [0x0230B] = 0x05, -- rfloor
+ [0x02308] = 0x06, -- lceil
+ [0x02309] = 0x07, -- rceil
+ [0x0007B] = 0x08, -- {
+ [0x0007D] = 0x09, -- }
+ [0x027E8] = 0x0A, -- <
+ [0x027E9] = 0x0B, -- >
+ [0x0007C] = 0x0C, -- |
+--~ [0x0] = 0x0D, -- lVert rVert Vert
+-- [0x0002F] = 0x0E, -- /
+ [0x0005C] = 0x0F, -- \
+--~ [0x0] = 0x3A, -- lgroup
+--~ [0x0] = 0x3B, -- rgroup
+--~ [0x0] = 0x3C, -- arrowvert
+--~ [0x0] = 0x3D, -- Arrowvert
+ [0x02195] = 0x3F, -- updownarrow
+--~ [0x0] = 0x40, -- lmoustache
+--~ [0x0] = 0x41, -- rmoustache
+ [0x0221A] = 0x70, -- sqrt
+ [0x021D5] = 0x77, -- Updownarrow
+ [0x02191] = 0x78, -- uparrow
+ [0x02193] = 0x79, -- downarrow
+ [0x021D1] = 0x7E, -- Uparrow
+ [0x021D3] = 0x7F, -- Downarrow
+ [0x0220F] = 0x59, -- prod
+ [0x02210] = 0x61, -- coprod
+ [0x02211] = 0x58, -- sum
+ [0x0222B] = 0x5A, -- intop
+ [0x0222E] = 0x49, -- ointop
+ [0xFE302] = 0x62, -- widehat
+ [0xFE303] = 0x65, -- widetilde
+ [0x022C0] = 0x5E, -- bigwedge
+ [0x022C1] = 0x5F, -- bigvee
+ [0x022C2] = 0x5C, -- bigcap
+ [0x022C3] = 0x5B, -- bigcup
+ [0x02044] = 0x0E, -- /
+}
+
+fonts.enc.math["tex-ex"] = {
+ [0x0220F] = 0x51, -- prod
+ [0x0222B] = 0x52, -- intop
+ [0x02210] = 0x60, -- coprod
+ [0x02211] = 0x50, -- sum
+ [0x022C0] = 0x56, -- bigwedge
+ [0x022C1] = 0x57, -- bigvee
+ [0x022C2] = 0x54, -- bigcap
+ [0x022C3] = 0x53, -- bigcup
+ [0x02A04] = 0x55, -- biguplus
+ [0x02A02] = 0x4E, -- bigotimes
+ [0x02A01] = 0x4C, -- bigoplus
+ [0x02A03] = 0x4A, -- bigodot
+ [0x0222E] = 0x48, -- ointop
+ [0x02A06] = 0x46, -- bigsqcup
+}
+
+-- only math stuff is needed, since we always use an lm or gyre
+-- font as main font
+
+fonts.enc.math["tex-mr"] = {
+ [0x00393] = 0x00, -- Gamma
+ [0x00394] = 0x01, -- Delta
+ [0x00398] = 0x02, -- Theta
+ [0x0039B] = 0x03, -- Lambda
+ [0x0039E] = 0x04, -- Xi
+ [0x003A0] = 0x05, -- Pi
+ [0x003A3] = 0x06, -- Sigma
+ [0x003A5] = 0x07, -- Upsilon
+ [0x003A6] = 0x08, -- Phi
+ [0x003A8] = 0x09, -- Psi
+ [0x003A9] = 0x0A, -- Omega
+-- [0x00060] = 0x12, -- [math]grave
+-- [0x000B4] = 0x13, -- [math]acute
+-- [0x002C7] = 0x14, -- [math]check
+-- [0x002D8] = 0x15, -- [math]breve
+-- [0x000AF] = 0x16, -- [math]bar
+-- [0x00021] = 0x21, -- !
+-- [0x00028] = 0x28, -- (
+-- [0x00029] = 0x29, -- )
+-- [0x0002B] = 0x2B, -- +
+-- [0x0002F] = 0x2F, -- /
+-- [0x0003A] = 0x3A, -- :
+-- [0x02236] = 0x3A, -- colon
+-- [0x0003B] = 0x3B, -- ;
+-- [0x0003C] = 0x3C, -- <
+-- [0x0003D] = 0x3D, -- =
+-- [0x0003E] = 0x3E, -- >
+-- [0x0003F] = 0x3F, -- ?
+ [0x00391] = 0x41, -- Alpha
+ [0x00392] = 0x42, -- Beta
+ [0x02145] = 0x44,
+ [0x00395] = 0x45, -- Epsilon
+ [0x00397] = 0x48, -- Eta
+ [0x00399] = 0x49, -- Iota
+ [0x0039A] = 0x4B, -- Kappa
+ [0x0039C] = 0x4D, -- Mu
+ [0x0039D] = 0x4E, -- Nu
+ [0x0039F] = 0x4F, -- Omicron
+ [0x003A1] = 0x52, -- Rho
+ [0x003A4] = 0x54, -- Tau
+ [0x003A7] = 0x58, -- Chi
+ [0x00396] = 0x5A, -- Zeta
+-- [0x0005B] = 0x5B, -- [
+-- [0x0005D] = 0x5D, -- ]
+-- [0x0005E] = 0x5E, -- [math]hat -- the text one
+ [0x00302] = 0x5E, -- [math]hat -- the real math one
+-- [0x002D9] = 0x5F, -- [math]dot
+ [0x02146] = 0x64,
+ [0x02147] = 0x65,
+-- [0x002DC] = 0x7E, -- [math]tilde -- the text one
+ [0x00303] = 0x7E, -- [math]tilde -- the real one
+-- [0x000A8] = 0x7F, -- [math]ddot
+}
+
+fonts.enc.math["tex-mr-missing"] = {
+ [0x02236] = 0x3A, -- colon
+}
+
+fonts.enc.math["tex-mi"] = {
+ [0x1D6E4] = 0x00, -- Gamma
+ [0x1D6E5] = 0x01, -- Delta
+ [0x1D6E9] = 0x02, -- Theta
+ [0x1D6F3] = 0x02, -- varTheta (not present in TeX)
+ [0x1D6EC] = 0x03, -- Lambda
+ [0x1D6EF] = 0x04, -- Xi
+ [0x1D6F1] = 0x05, -- Pi
+ [0x1D6F4] = 0x06, -- Sigma
+ [0x1D6F6] = 0x07, -- Upsilon
+ [0x1D6F7] = 0x08, -- Phi
+ [0x1D6F9] = 0x09, -- Psi
+ [0x1D6FA] = 0x0A, -- Omega
+ [0x1D6FC] = 0x0B, -- alpha
+ [0x1D6FD] = 0x0C, -- beta
+ [0x1D6FE] = 0x0D, -- gamma
+ [0x1D6FF] = 0x0E, -- delta
+ [0x1D716] = 0x0F, -- epsilon TODO: 1D716
+ [0x1D701] = 0x10, -- zeta
+ [0x1D702] = 0x11, -- eta
+ [0x1D703] = 0x12, -- theta TODO: 1D703
+ [0x1D704] = 0x13, -- iota
+ [0x1D705] = 0x14, -- kappa
+ [0x1D718] = 0x14, -- varkappa, not in tex fonts
+ [0x1D706] = 0x15, -- lambda
+ [0x1D707] = 0x16, -- mu
+ [0x1D708] = 0x17, -- nu
+ [0x1D709] = 0x18, -- xi
+ [0x1D70B] = 0x19, -- pi
+ [0x1D70C] = 0x1A, -- rho
+ [0x1D70E] = 0x1B, -- sigma
+ [0x1D70F] = 0x1C, -- tau
+ [0x1D710] = 0x1D, -- upsilon
+ [0x1D719] = 0x1E, -- phi
+ [0x1D712] = 0x1F, -- chi
+ [0x1D713] = 0x20, -- psi
+ [0x1D714] = 0x21, -- omega
+ [0x1D700] = 0x22, -- varepsilon (the other way around)
+ [0x1D717] = 0x23, -- vartheta
+ [0x1D71B] = 0x24, -- varpi
+ [0x1D71A] = 0x25, -- varrho
+ [0x1D70D] = 0x26, -- varsigma
+ [0x1D711] = 0x27, -- varphi (the other way around)
+ [0x021BC] = 0x28, -- leftharpoonup
+ [0x021BD] = 0x29, -- leftharpoondown
+ [0x021C0] = 0x2A, -- rightharpoonup
+ [0x021C1] = 0x2B, -- rightharpoondown
+ [0xFE322] = 0x2C, -- lhook (hook for combining arrows)
+ [0xFE323] = 0x2D, -- rhook (hook for combining arrows)
+ [0x022B3] = 0x2E, -- triangleright (TODO: which one is right?)
+ [0x022B2] = 0x2F, -- triangleleft (TODO: which one is right?)
+-- [0x00041] = 0x30, -- 0
+-- [0x00041] = 0x31, -- 1
+-- [0x00041] = 0x32, -- 2
+-- [0x00041] = 0x33, -- 3
+-- [0x00041] = 0x34, -- 4
+-- [0x00041] = 0x35, -- 5
+-- [0x00041] = 0x36, -- 6
+-- [0x00041] = 0x37, -- 7
+-- [0x00041] = 0x38, -- 8
+-- [0x00041] = 0x39, -- 9
+--~ [0x0002E] = 0x3A, -- .
+ [0x0002C] = 0x3B, -- ,
+ [0x0003C] = 0x3C, -- <
+-- [0x0002F] = 0x3D, -- /, slash, solidus
+ [0x02044] = 0x3D, -- / AM: Not sure
+ [0x0003E] = 0x3E, -- >
+ [0x022C6] = 0x3F, -- star
+ [0x02202] = 0x40, -- partial
+--
+ [0x0266D] = 0x5B, -- flat
+ [0x0266E] = 0x5C, -- natural
+ [0x0266F] = 0x5D, -- sharp
+ [0x02323] = 0x5E, -- smile
+ [0x02322] = 0x5F, -- frown
+ [0x02113] = 0x60, -- ell
+--
+ [0x1D6A4] = 0x7B, -- imath (TODO: also 0131)
+ [0x1D6A5] = 0x7C, -- jmath (TODO: also 0237)
+ [0x02118] = 0x7D, -- wp
+ [0x020D7] = 0x7E, -- vec (TODO: not sure)
+-- 0x7F, -- (no idea what that could be)
+}
+
+
+fonts.enc.math["tex-it"] = {
+-- [0x1D434] = 0x41, -- A
+ [0x1D6E2] = 0x41, -- Alpha
+-- [0x1D435] = 0x42, -- B
+ [0x1D6E3] = 0x42, -- Beta
+-- [0x1D436] = 0x43, -- C
+-- [0x1D437] = 0x44, -- D
+-- [0x1D438] = 0x45, -- E
+ [0x1D6E6] = 0x45, -- Epsilon
+-- [0x1D439] = 0x46, -- F
+-- [0x1D43A] = 0x47, -- G
+-- [0x1D43B] = 0x48, -- H
+ [0x1D6E8] = 0x48, -- Eta
+-- [0x1D43C] = 0x49, -- I
+ [0x1D6EA] = 0x49, -- Iota
+-- [0x1D43D] = 0x4A, -- J
+-- [0x1D43E] = 0x4B, -- K
+ [0x1D6EB] = 0x4B, -- Kappa
+-- [0x1D43F] = 0x4C, -- L
+-- [0x1D440] = 0x4D, -- M
+ [0x1D6ED] = 0x4D, -- Mu
+-- [0x1D441] = 0x4E, -- N
+ [0x1D6EE] = 0x4E, -- Nu
+-- [0x1D442] = 0x4F, -- O
+ [0x1D6F0] = 0x4F, -- Omicron
+-- [0x1D443] = 0x50, -- P
+ [0x1D6F2] = 0x50, -- Rho
+-- [0x1D444] = 0x51, -- Q
+-- [0x1D445] = 0x52, -- R
+-- [0x1D446] = 0x53, -- S
+-- [0x1D447] = 0x54, -- T
+ [0x1D6F5] = 0x54, -- Tau
+-- [0x1D448] = 0x55, -- U
+-- [0x1D449] = 0x56, -- V
+-- [0x1D44A] = 0x57, -- W
+-- [0x1D44B] = 0x58, -- X
+ [0x1D6F8] = 0x58, -- Chi
+-- [0x1D44C] = 0x59, -- Y
+-- [0x1D44D] = 0x5A, -- Z
+--
+-- [0x1D44E] = 0x61, -- a
+-- [0x1D44F] = 0x62, -- b
+-- [0x1D450] = 0x63, -- c
+-- [0x1D451] = 0x64, -- d
+-- [0x1D452] = 0x65, -- e
+-- [0x1D453] = 0x66, -- f
+-- [0x1D454] = 0x67, -- g
+-- [0x1D455] = 0x68, -- h
+ [0x0210E] = 0x68, -- Planck constant (h)
+-- [0x1D456] = 0x69, -- i
+-- [0x1D457] = 0x6A, -- j
+-- [0x1D458] = 0x6B, -- k
+-- [0x1D459] = 0x6C, -- l
+-- [0x1D45A] = 0x6D, -- m
+-- [0x1D45B] = 0x6E, -- n
+-- [0x1D45C] = 0x6F, -- o
+ [0x1D70A] = 0x6F, -- omicron
+-- [0x1D45D] = 0x70, -- p
+-- [0x1D45E] = 0x71, -- q
+-- [0x1D45F] = 0x72, -- r
+-- [0x1D460] = 0x73, -- s
+-- [0x1D461] = 0x74, -- t
+-- [0x1D462] = 0x75, -- u
+-- [0x1D463] = 0x76, -- v
+-- [0x1D464] = 0x77, -- w
+-- [0x1D465] = 0x78, -- x
+-- [0x1D466] = 0x79, -- y
+-- [0x1D467] = 0x7A, -- z
+}
+
+fonts.enc.math["tex-ss"] = { }
+fonts.enc.math["tex-tt"] = { }
+fonts.enc.math["tex-bf"] = { }
+fonts.enc.math["tex-bi"] = { }
+fonts.enc.math["tex-fraktur"] = { }
+fonts.enc.math["tex-fraktur-bold"] = { }
+
+function fonts.vf.math.set_letters(font_encoding, name, uppercase, lowercase)
+ local enc = font_encoding[name]
+ for i = 0,25 do
+ enc[uppercase+i] = i + 0x41
+ enc[lowercase+i] = i + 0x61
+ end
+end
+
+function fonts.vf.math.set_digits(font_encoding, name, digits)
+ local enc = font_encoding[name]
+ for i = 0,9 do
+ enc[digits+i] = i + 0x30
+ end
+end
+
+fonts.enc.math["tex-sy"] = {
+ [0x0002D] = 0x00, -- -
+ [0x02212] = 0x00, -- -
+-- [0x02201] = 0x00, -- complement
+-- [0x02206] = 0x00, -- increment
+-- [0x02204] = 0x00, -- not exists
+--~ [0x000B7] = 0x01, -- cdot
+ [0x022C5] = 0x01, -- cdot
+ [0x000D7] = 0x02, -- times
+ [0x0002A] = 0x03, -- *
+ [0x02217] = 0x03, -- *
+ [0x000F7] = 0x04, -- div
+ [0x022C4] = 0x05, -- diamond
+ [0x000B1] = 0x06, -- pm
+ [0x02213] = 0x07, -- mp
+ [0x02295] = 0x08, -- oplus
+ [0x02296] = 0x09, -- ominus
+ [0x02297] = 0x0A, -- otimes
+ [0x02298] = 0x0B, -- oslash
+ [0x02299] = 0x0C, -- odot
+ [0x025EF] = 0x0D, -- bigcirc, Orb (either 25EF or 25CB) -- todo
+ [0x02218] = 0x0E, -- circ
+ [0x02219] = 0x0F, -- bullet
+ [0x02022] = 0x0F, -- bullet
+ [0x0224D] = 0x10, -- asymp
+ [0x02261] = 0x11, -- equiv
+ [0x02286] = 0x12, -- subseteq
+ [0x02287] = 0x13, -- supseteq
+ [0x02264] = 0x14, -- leq
+ [0x02265] = 0x15, -- geq
+ [0x02AAF] = 0x16, -- preceq
+-- [0x0227C] = 0x16, -- preceq, AM:No see 2AAF
+ [0x02AB0] = 0x17, -- succeq
+-- [0x0227D] = 0x17, -- succeq, AM:No see 2AB0
+ [0x0223C] = 0x18, -- sim
+ [0x02248] = 0x19, -- approx
+ [0x02282] = 0x1A, -- subset
+ [0x02283] = 0x1B, -- supset
+ [0x0226A] = 0x1C, -- ll
+ [0x0226B] = 0x1D, -- gg
+ [0x0227A] = 0x1E, -- prec
+ [0x0227B] = 0x1F, -- succ
+ [0x02190] = 0x20, -- leftarrow
+ [0x02192] = 0x21, -- rightarrow
+--~ [0xFE190] = 0x20, -- leftarrow
+--~ [0xFE192] = 0x21, -- rightarrow
+ [0x02191] = 0x22, -- uparrow
+ [0x02193] = 0x23, -- downarrow
+ [0x02194] = 0x24, -- leftrightarrow
+ [0x02197] = 0x25, -- nearrow
+ [0x02198] = 0x26, -- searrow
+ [0x02243] = 0x27, -- simeq
+ [0x021D0] = 0x28, -- Leftarrow
+ [0x021D2] = 0x29, -- Rightarrow
+ [0x021D1] = 0x2A, -- Uparrow
+ [0x021D3] = 0x2B, -- Downarrow
+ [0x021D4] = 0x2C, -- Leftrightarrow
+ [0x02196] = 0x2D, -- nwarrow
+ [0x02199] = 0x2E, -- swarrow
+ [0x0221D] = 0x2F, -- propto
+ [0x02032] = 0x30, -- prime
+ [0x0221E] = 0x31, -- infty
+ [0x02208] = 0x32, -- in
+ [0x0220B] = 0x33, -- ni
+ [0x025B3] = 0x34, -- triangle, bigtriangleup
+ [0x025BD] = 0x35, -- bigtriangledown
+ [0x00338] = 0x36, -- not
+-- 0x37, -- (beginning of arrow)
+ [0x02200] = 0x38, -- forall
+ [0x02203] = 0x39, -- exists
+ [0x000AC] = 0x3A, -- neg, lnot
+ [0x02205] = 0x3B, -- empty set
+ [0x0211C] = 0x3C, -- Re
+ [0x02111] = 0x3D, -- Im
+ [0x022A4] = 0x3E, -- top
+ [0x022A5] = 0x3F, -- bot, perp
+ [0x02135] = 0x40, -- aleph
+ [0x1D49C] = 0x41, -- script A
+ [0x0212C] = 0x42, -- script B
+ [0x1D49E] = 0x43, -- script C
+ [0x1D49F] = 0x44, -- script D
+ [0x02130] = 0x45, -- script E
+ [0x02131] = 0x46, -- script F
+ [0x1D4A2] = 0x47, -- script G
+ [0x0210B] = 0x48, -- script H
+ [0x02110] = 0x49, -- script I
+ [0x1D4A5] = 0x4A, -- script J
+ [0x1D4A6] = 0x4B, -- script K
+ [0x02112] = 0x4C, -- script L
+ [0x02133] = 0x4D, -- script M
+ [0x1D4A9] = 0x4E, -- script N
+ [0x1D4AA] = 0x4F, -- script O
+ [0x1D4AB] = 0x50, -- script P
+ [0x1D4AC] = 0x51, -- script Q
+ [0x0211B] = 0x52, -- script R
+ [0x1D4AE] = 0x53, -- script S
+ [0x1D4AF] = 0x54, -- script T
+ [0x1D4B0] = 0x55, -- script U
+ [0x1D4B1] = 0x56, -- script V
+ [0x1D4B2] = 0x57, -- script W
+ [0x1D4B3] = 0x58, -- script X
+ [0x1D4B4] = 0x59, -- script Y
+ [0x1D4B5] = 0x5A, -- script Z
+ [0x0222A] = 0x5B, -- cup
+ [0x02229] = 0x5C, -- cap
+ [0x0228E] = 0x5D, -- uplus
+ [0x02227] = 0x5E, -- wedge, land
+ [0x02228] = 0x5F, -- vee, lor
+ [0x022A2] = 0x60, -- vdash
+ [0x022A3] = 0x61, -- dashv
+ [0x0230A] = 0x62, -- lfloor
+ [0x0230B] = 0x63, -- rfloor
+ [0x02308] = 0x64, -- lceil
+ [0x02309] = 0x65, -- rceil
+ [0x0007B] = 0x66, -- {, lbrace
+ [0x0007D] = 0x67, -- }, rbrace
+ [0x027E8] = 0x68, -- <, langle
+ [0x027E9] = 0x69, -- >, rangle
+ [0x0007C] = 0x6A, -- |, mid, lvert, rvert
+ [0x02225] = 0x6B, -- parallel, Vert, lVert, rVert, arrowvert
+ [0x02195] = 0x6C, -- updownarrow
+ [0x021D5] = 0x6D, -- Updownarrow
+ [0x0005C] = 0x6E, -- \, backslash, setminus
+ [0x02216] = 0x6E, -- setminus
+ [0x02240] = 0x6F, -- wr
+ [0x0221A] = 0x70, -- sqrt. AM: Check surd??
+ [0x02A3F] = 0x71, -- amalg
+ [0x1D6FB] = 0x72, -- nabla
+-- [0x0222B] = 0x73, -- smallint (TODO: what about intop?)
+ [0x02294] = 0x74, -- sqcup
+ [0x02293] = 0x75, -- sqcap
+ [0x02291] = 0x76, -- sqsubseteq
+ [0x02292] = 0x77, -- sqsupseteq
+ [0x000A7] = 0x78, -- S
+ [0x02020] = 0x79, -- dagger, dag
+ [0x02021] = 0x7A, -- ddagger, ddag
+ [0x000B6] = 0x7B, -- P
+ [0x02663] = 0x7C, -- clubsuit
+ [0x02662] = 0x7D, -- diamondsuit
+ [0x02661] = 0x7E, -- heartsuit
+ [0x02660] = 0x7F, -- spadesuit
+ [0xFE321] = 0x37, -- mapstochar
+}
+
+-- The names in masm10.enc can be trusted best and are shown in the first
+-- column, while in the second column we show the tex/ams names. As usual
+-- it costs hours to figure out such a table.
+
+fonts.enc.math["tex-ma"] = {
+ [0x022A1] = 0x00, -- squaredot \boxdot
+ [0x0229E] = 0x01, -- squareplus \boxplus
+ [0x022A0] = 0x02, -- squaremultiply \boxtimes
+ [0x025A1] = 0x03, -- square \square \Box
+ [0x025A0] = 0x04, -- squaresolid \blacksquare
+ [0x000B7] = 0x05, -- squaresmallsolid \centerdot
+ [0x022C4] = 0x06, -- diamond \Diamond \lozenge
+ [0x029EB] = 0x07, -- diamondsolid \blacklozenge
+ [0x021BA] = 0x08, -- clockwise \circlearrowright
+ [0x021BB] = 0x09, -- anticlockwise \circlearrowleft
+ [0x021CC] = 0x0A, -- harpoonleftright \rightleftharpoons
+ [0x021CB] = 0x0B, -- harpoonrightleft \leftrightharpoons
+ [0x0229F] = 0x0C, -- squareminus \boxminus
+ [0x022A9] = 0x0D, -- forces \Vdash
+ [0x022AA] = 0x0E, -- forcesbar \Vvdash
+ [0x022A8] = 0x0F, -- satisfies \vDash
+ [0x021A0] = 0x10, -- dblarrowheadright \twoheadrightarrow
+ [0x0219E] = 0x11, -- dblarrowheadleft \twoheadleftarrow
+ [0x021C7] = 0x12, -- dblarrowleft \leftleftarrows
+ [0x021C9] = 0x13, -- dblarrowright \rightrightarrows
+ [0x021C8] = 0x14, -- dblarrowup \upuparrows
+ [0x021CA] = 0x15, -- dblarrowdwn \downdownarrows
+ [0x021BE] = 0x16, -- harpoonupright \upharpoonright \restriction
+ [0x021C2] = 0x17, -- harpoondownright \downharpoonright
+ [0x021BF] = 0x18, -- harpoonupleft \upharpoonleft
+ [0x021C3] = 0x19, -- harpoondownleft \downharpoonleft
+ [0x021A3] = 0x1A, -- arrowtailright \rightarrowtail
+ [0x021A2] = 0x1B, -- arrowtailleft \leftarrowtail
+ [0x021C6] = 0x1C, -- arrowparrleftright \leftrightarrows
+-- [0x021C5] = 0x00, -- \updownarrows (missing in lm)
+ [0x021C4] = 0x1D, -- arrowparrrightleft \rightleftarrows
+ [0x021B0] = 0x1E, -- shiftleft \Lsh
+ [0x021B1] = 0x1F, -- shiftright \Rsh
+ [0x021DD] = 0x20, -- squiggleright \leadsto \rightsquigarrow
+ [0x021AD] = 0x21, -- squiggleleftright \leftrightsquigarrow
+ [0x021AB] = 0x22, -- curlyleft \looparrowleft
+ [0x021AC] = 0x23, -- curlyright \looparrowright
+ [0x02257] = 0x24, -- circleequal \circeq
+ [0x0227F] = 0x25, -- followsorequal \succsim
+ [0x02273] = 0x26, -- greaterorsimilar \gtrsim
+ [0x02A86] = 0x27, -- greaterorapproxeql \gtrapprox
+ [0x022B8] = 0x28, -- multimap \multimap
+ [0x02234] = 0x29, -- therefore \therefore
+ [0x02235] = 0x2A, -- because \because
+ [0x02251] = 0x2B, -- equalsdots \Doteq \doteqdot
+ [0x0225C] = 0x2C, -- defines \triangleq
+ [0x0227E] = 0x2D, -- precedesorequal \precsim
+ [0x02272] = 0x2E, -- lessorsimilar \lesssim
+ [0x02A85] = 0x2F, -- lessorapproxeql \lessapprox
+ [0x02A95] = 0x30, -- equalorless \eqslantless
+ [0x02A96] = 0x31, -- equalorgreater \eqslantgtr
+ [0x022DE] = 0x32, -- equalorprecedes \curlyeqprec
+ [0x022DF] = 0x33, -- equalorfollows \curlyeqsucc
+ [0x0227C] = 0x34, -- precedesorcurly \preccurlyeq
+ [0x02266] = 0x35, -- lessdblequal \leqq
+ [0x02A7D] = 0x36, -- lessorequalslant \leqslant
+ [0x02276] = 0x37, -- lessorgreater \lessgtr
+ [0x02035] = 0x38, -- primereverse \backprime
+ -- [0x0] = 0x39, -- axisshort \dabar
+ [0x02253] = 0x3A, -- equaldotrightleft \risingdotseq
+ [0x02252] = 0x3B, -- equaldotleftright \fallingdotseq
+ [0x0227D] = 0x3C, -- followsorcurly \succcurlyeq
+ [0x02267] = 0x3D, -- greaterdblequal \geqq
+ [0x02A7E] = 0x3E, -- greaterorequalslant \geqslant
+ [0x02277] = 0x3F, -- greaterorless \gtrless
+ [0x0228F] = 0x40, -- squareimage \sqsubset
+ [0x02290] = 0x41, -- squareoriginal \sqsupset
+ -- wrong:
+ [0x022B3] = 0x42, -- triangleright \rhd \vartriangleright
+ [0x022B2] = 0x43, -- triangleleft \lhd \vartriangleleft
+ [0x022B5] = 0x44, -- trianglerightequal \unrhd \trianglerighteq
+ [0x022B4] = 0x45, -- triangleleftequal \unlhd \trianglelefteq
+ --
+ [0x02605] = 0x46, -- star \bigstar
+ [0x0226C] = 0x47, -- between \between
+ [0x025BC] = 0x48, -- triangledownsld \blacktriangledown
+ [0x025B6] = 0x49, -- trianglerightsld \blacktriangleright
+ [0x025C0] = 0x4A, -- triangleleftsld \blacktriangleleft
+ -- [0x0] = 0x4B, -- arrowaxisright
+ -- [0x0] = 0x4C, -- arrowaxisleft
+ [0x025B2] = 0x4D, -- triangle \triangleup \vartriangle
+ [0x025B2] = 0x4E, -- trianglesolid \blacktriangle
+ [0x025BC] = 0x4F, -- triangleinv \triangledown
+ [0x02256] = 0x50, -- ringinequal \eqcirc
+ [0x022DA] = 0x51, -- lessequalgreater \lesseqgtr
+ [0x022DB] = 0x52, -- greaterlessequal \gtreqless
+ [0x02A8B] = 0x53, -- lessdbleqlgreater \lesseqqgtr
+ [0x02A8C] = 0x54, -- greaterdbleqlless \gtreqqless
+ [0x000A5] = 0x55, -- Yen \yen
+ [0x021DB] = 0x56, -- arrowtripleright \Rrightarrow
+ [0x021DA] = 0x57, -- arrowtripleleft \Lleftarrow
+ [0x02713] = 0x58, -- check \checkmark
+ [0x022BB] = 0x59, -- orunderscore \veebar
+ [0x022BC] = 0x5A, -- nand \barwedge
+ [0x02306] = 0x5B, -- perpcorrespond \doublebarwedge
+ [0x02220] = 0x5C, -- angle \angle
+ [0x02221] = 0x5D, -- measuredangle \measuredangle
+ [0x02222] = 0x5E, -- sphericalangle \sphericalangle
+ -- [0x0] = 0x5F, -- proportional \varpropto
+ -- [0x0] = 0x60, -- smile \smallsmile
+ -- [0x0] = 0x61, -- frown \smallfrown
+ [0x022D0] = 0x62, -- subsetdbl \Subset
+ [0x022D1] = 0x63, -- supersetdbl \Supset
+ [0x022D3] = 0x64, -- uniondbl \doublecup \Cup
+ [0x00100] = 0x65, -- intersectiondbl \doublecap \Cap
+ [0x022CF] = 0x66, -- uprise \curlywedge
+ [0x022CE] = 0x67, -- downfall \curlyvee
+ [0x022CB] = 0x68, -- multiopenleft \leftthreetimes
+ [0x022CC] = 0x69, -- multiopenright \rightthreetimes
+ [0x02AC5] = 0x6A, -- subsetdblequal \subseteqq
+ [0x02AC6] = 0x6B, -- supersetdblequal \supseteqq
+ [0x0224F] = 0x6C, -- difference \bumpeq
+ [0x0224E] = 0x6D, -- geomequivalent \Bumpeq
+ [0x022D8] = 0x6E, -- muchless \lll \llless
+ [0x022D9] = 0x6F, -- muchgreater \ggg \gggtr
+ [0x0231C] = 0x70, -- rightanglenw \ulcorner
+ [0x0231D] = 0x71, -- rightanglene \urcorner
+ [0x024C7] = 0x72, -- circleR \circledR
+ [0x024C8] = 0x73, -- circleS \circledS
+ [0x022D4] = 0x74, -- fork \pitchfork
+ [0x02245] = 0x75, -- dotplus \dotplus
+ [0x0223D] = 0x76, -- revsimilar \backsim
+ [0x022CD] = 0x77, -- revasymptequal \backsimeq -- AM: Check this! I mapped it to simeq.
+ [0x0231E] = 0x78, -- rightanglesw \llcorner
+ [0x0231F] = 0x79, -- rightanglese \lrcorner
+ [0x02720] = 0x7A, -- maltesecross \maltese
+ [0x02201] = 0x7B, -- complement \complement
+ [0x022BA] = 0x7C, -- intercal \intercal
+ [0x0229A] = 0x7D, -- circlering \circledcirc
+ [0x0229B] = 0x7E, -- circleasterisk \circledast
+ [0x0229D] = 0x7F, -- circleminus \circleddash
+}
+
+fonts.enc.math["tex-mb"] = {
+ -- [0x0] = 0x00, -- lessornotequal \lvertneqq
+ -- [0x0] = 0x01, -- greaterornotequal \gvertneqq
+ [0x02270] = 0x02, -- notlessequal \nleq
+ [0x02271] = 0x03, -- notgreaterequal \ngeq
+ [0x0226E] = 0x04, -- notless \nless
+ [0x0226F] = 0x05, -- notgreater \ngtr
+ [0x02280] = 0x06, -- notprecedes \nprec
+ [0x02281] = 0x07, -- notfollows \nsucc
+ [0x02268] = 0x08, -- lessornotdbleql \lneqq
+ [0x02269] = 0x09, -- greaterornotdbleql \gneqq
+ -- [0x0] = 0x0A, -- notlessorslnteql \nleqslant
+ -- [0x0] = 0x0B, -- notgreaterorslnteql \ngeqslant
+ [0x02A87] = 0x0C, -- lessnotequal \lneq
+ [0x02A88] = 0x0D, -- greaternotequal \gneq
+ -- [0x0] = 0x0E, -- notprecedesoreql \npreceq
+ -- [0x0] = 0x0F, -- notfollowsoreql \nsucceq
+ [0x022E8] = 0x10, -- precedeornoteqvlnt \precnsim
+ [0x022E9] = 0x11, -- followornoteqvlnt \succnsim
+ [0x022E6] = 0x12, -- lessornotsimilar \lnsim
+ [0x022E7] = 0x13, -- greaterornotsimilar \gnsim
+ -- [0x0] = 0x14, -- notlessdblequal \nleqq
+ -- [0x0] = 0x15, -- notgreaterdblequal \ngeqq
+ [0x02AB5] = 0x16, -- precedenotslnteql \precneqq
+ [0x02AB6] = 0x17, -- follownotslnteql \succneqq
+ [0x02AB9] = 0x18, -- precedenotdbleqv \precnapprox
+ [0x02ABA] = 0x19, -- follownotdbleqv \succnapprox
+ [0x02A89] = 0x1A, -- lessnotdblequal \lnapprox
+ [0x02A8A] = 0x1B, -- greaternotdblequal \gnapprox
+ [0x02241] = 0x1C, -- notsimilar \nsim
+ [0x02247] = 0x1D, -- notapproxequal \ncong
+ -- [0x0] = 0x1E, -- upslope \diagup
+ -- [0x0] = 0x1F, -- downslope \diagdown
+ -- [0x0] = 0x20, -- notsubsetoreql \varsubsetneq
+ -- [0x0] = 0x21, -- notsupersetoreql \varsupsetneq
+ -- [0x0] = 0x22, -- notsubsetordbleql \nsubseteqq
+ -- [0x0] = 0x23, -- notsupersetordbleql \nsupseteqq
+ [0x02ACB] = 0x24, -- subsetornotdbleql \subsetneqq
+ [0x02ACC] = 0x25, -- supersetornotdbleql \supsetneqq
+ -- [0x0] = 0x26, -- subsetornoteql \varsubsetneqq
+ -- [0x0] = 0x27, -- supersetornoteql \varsupsetneqq
+ [0x0228A] = 0x28, -- subsetnoteql \subsetneq
+ [0x0228B] = 0x29, -- supersetnoteql \supsetneq
+ [0x02288] = 0x2A, -- notsubseteql \nsubseteq
+ [0x02289] = 0x2B, -- notsuperseteql \nsupseteq
+ [0x02226] = 0x2C, -- notparallel \nparallel
+ [0x02224] = 0x2D, -- notbar \nmid \ndivides
+ -- [0x0] = 0x2E, -- notshortbar \nshortmid
+ -- [0x0] = 0x2F, -- notshortparallel \nshortparallel
+ [0x022AC] = 0x30, -- notturnstile \nvdash
+ [0x022AE] = 0x31, -- notforces \nVdash
+ [0x022AD] = 0x32, -- notsatisfies \nvDash
+ [0x022AF] = 0x33, -- notforcesextra \nVDash
+ [0x022ED] = 0x34, -- nottriangeqlright \ntrianglerighteq
+ [0x022EC] = 0x35, -- nottriangeqlleft \ntrianglelefteq
+ [0x022EA] = 0x36, -- nottriangleleft \ntriangleleft
+ [0x022EB] = 0x37, -- nottriangleright \ntriangleright
+ [0x0219A] = 0x38, -- notarrowleft \nleftarrow
+ [0x0219B] = 0x39, -- notarrowright \nrightarrow
+ [0x021CD] = 0x3A, -- notdblarrowleft \nLeftarrow
+ [0x021CF] = 0x3B, -- notdblarrowright \nRightarrow
+ [0x021CE] = 0x3C, -- notdblarrowboth \nLeftrightarrow
+ [0x021AE] = 0x3D, -- notarrowboth \nleftrightarrow
+ [0x022C7] = 0x3E, -- dividemultiply \divideontimes
+ [0x02300] = 0x3F, -- diametersign \varnothing
+ [0x02204] = 0x40, -- notexistential \nexists
+ [0x1D538] = 0x41, -- A (blackboard A)
+ [0x1D539] = 0x42, -- B
+ [0x02102] = 0x43, -- C
+ [0x1D53B] = 0x44, -- D
+ [0x1D53C] = 0x45, -- E
+ [0x1D53D] = 0x46, -- F
+ [0x1D53E] = 0x47, -- G
+ [0x0210D] = 0x48, -- H
+ [0x1D540] = 0x49, -- I
+ [0x1D541] = 0x4A, -- J
+ [0x1D542] = 0x4B, -- K
+ [0x1D543] = 0x4C, -- L
+ [0x1D544] = 0x4D, -- M
+ [0x02115] = 0x4E, -- N
+ [0x1D546] = 0x4F, -- O
+ [0x02119] = 0x50, -- P
+ [0x0211A] = 0x51, -- Q
+ [0x0211D] = 0x52, -- R
+ [0x1D54A] = 0x53, -- S
+ [0x1D54B] = 0x54, -- T
+ [0x1D54C] = 0x55, -- U
+ [0x1D54D] = 0x56, -- V
+ [0x1D54E] = 0x57, -- W
+ [0x1D54F] = 0x58, -- X
+ [0x1D550] = 0x59, -- Y
+ [0x02124] = 0x5A, -- Z (blackboard Z)
+ [0x02132] = 0x60, -- hatwide \Finv
+ [0x02141] = 0x61, -- hatwider \Game
+ -- [0x0] = 0x62, tildewide
+ -- [0x0] = 0x63, tildewider
+ -- [0x0] = 0x64, Finv
+ -- [0x0] = 0x65, Gmir
+ [0x02127] = 0x66, -- Omegainv \mho
+ [0x000F0] = 0x67, -- eth \eth
+ [0x02242] = 0x68, -- equalorsimilar \eqsim
+ [0x02136] = 0x69, -- beth \beth
+ [0x02137] = 0x6A, -- gimel \gimel
+ [0x02138] = 0x6B, -- daleth \daleth
+ [0x022D6] = 0x6C, -- lessdot \lessdot
+ [0x022D7] = 0x6D, -- greaterdot \gtrdot
+ [0x022C9] = 0x6E, -- multicloseleft \ltimes
+ [0x022CA] = 0x6F, -- multicloseright \rtimes
+ -- [0x0] = 0x70, -- barshort \shortmid
+ -- [0x0] = 0x71, -- parallelshort \shortparallel
+ -- [0x02216] = 0x72, -- integerdivide \smallsetminus (2216 already part of tex-sy
+ -- [0x0] = 0x73, -- similar \thicksim
+ -- [0x0] = 0x74, -- approxequal \thickapprox
+ [0x0224A] = 0x75, -- approxorequal \approxeq
+ [0x02AB8] = 0x76, -- followsorequal \succapprox
+ [0x02AB7] = 0x77, -- precedesorequal \precapprox
+ [0x021B6] = 0x78, -- archleftdown \curvearrowleft
+ [0x021B7] = 0x79, -- archrightdown \curvearrowright
+ [0x003DC] = 0x7A, -- Digamma \digamma
+ [0x003F0] = 0x7B, -- kappa \varkappa
+ [0x1D55C] = 0x7C, -- k \Bbbk (blackboard k)
+ [0x0210F] = 0x7D, -- planckover2pi \hslash
+ [0x00127] = 0x7E, -- planckover2pi1 \hbar
+ [0x003F6] = 0x7F, -- epsiloninv \backepsilon
+}
+
+fonts.enc.math["tex-fraktur"] = {
+-- [0x1D504] = 0x41, -- A (fraktur A)
+-- [0x1D505] = 0x42, -- B
+ [0x0212D] = 0x43, -- C
+-- [0x1D507] = 0x44, -- D
+-- [0x1D508] = 0x45, -- E
+-- [0x1D509] = 0x46, -- F
+-- [0x1D50A] = 0x47, -- G
+ [0x0210C] = 0x48, -- H
+ [0x02111] = 0x49, -- I
+-- [0x1D50D] = 0x4A, -- J
+-- [0x1D50E] = 0x4B, -- K
+-- [0x1D50F] = 0x4C, -- L
+-- [0x1D510] = 0x4D, -- M
+-- [0x1D511] = 0x4E, -- N
+-- [0x1D512] = 0x4F, -- O
+-- [0x1D513] = 0x50, -- P
+-- [0x1D514] = 0x51, -- Q
+ [0x0211C] = 0x52, -- R
+-- [0x1D516] = 0x53, -- S
+-- [0x1D517] = 0x54, -- T
+-- [0x1D518] = 0x55, -- U
+-- [0x1D519] = 0x56, -- V
+-- [0x1D51A] = 0x57, -- W
+-- [0x1D51B] = 0x58, -- X
+-- [0x1D51C] = 0x59, -- Y
+ [0x02128] = 0x5A, -- Z (fraktur Z)
+-- [0x1D51E] = 0x61, -- a (fraktur a)
+-- [0x1D51F] = 0x62, -- b
+-- [0x1D520] = 0x63, -- c
+-- [0x1D521] = 0x64, -- d
+-- [0x1D522] = 0x65, -- e
+-- [0x1D523] = 0x66, -- f
+-- [0x1D524] = 0x67, -- g
+-- [0x1D525] = 0x68, -- h
+-- [0x1D526] = 0x69, -- i
+-- [0x1D527] = 0x6A, -- j
+-- [0x1D528] = 0x6B, -- k
+-- [0x1D529] = 0x6C, -- l
+-- [0x1D52A] = 0x6D, -- m
+-- [0x1D52B] = 0x6E, -- n
+-- [0x1D52C] = 0x6F, -- o
+-- [0x1D52D] = 0x70, -- p
+-- [0x1D52E] = 0x71, -- q
+-- [0x1D52F] = 0x72, -- r
+-- [0x1D530] = 0x73, -- s
+-- [0x1D531] = 0x74, -- t
+-- [0x1D532] = 0x75, -- u
+-- [0x1D533] = 0x76, -- v
+-- [0x1D534] = 0x77, -- w
+-- [0x1D535] = 0x78, -- x
+-- [0x1D536] = 0x79, -- y
+-- [0x1D537] = 0x7A, -- z
+}
+
+-- now that all other vectors are defined ...
+
+fonts.vf.math.set_letters(fonts.enc.math, "tex-it", 0x1D434, 0x1D44E)
+fonts.vf.math.set_letters(fonts.enc.math, "tex-ss", 0x1D5A0, 0x1D5BA)
+fonts.vf.math.set_letters(fonts.enc.math, "tex-tt", 0x1D670, 0x1D68A)
+fonts.vf.math.set_letters(fonts.enc.math, "tex-bf", 0x1D400, 0x1D41A)
+fonts.vf.math.set_letters(fonts.enc.math, "tex-bi", 0x1D468, 0x1D482)
+fonts.vf.math.set_letters(fonts.enc.math, "tex-fraktur", 0x1D504, 0x1D51E)
+fonts.vf.math.set_letters(fonts.enc.math, "tex-fraktur-bold", 0x1D56C, 0x1D586)
+
+fonts.vf.math.set_digits (fonts.enc.math, "tex-ss", 0x1D7E2)
+fonts.vf.math.set_digits (fonts.enc.math, "tex-tt", 0x1D7F6)
+fonts.vf.math.set_digits (fonts.enc.math, "tex-bf", 0x1D7CE)
+
+-- fonts.vf.math.set_digits (fonts.enc.math, "tex-bi", 0x1D7CE)
+
+-- todo: add ss, tt, bf etc vectors
+-- todo: we can make ss tt etc an option
diff --git a/tex/context/base/meta-clp.tex b/tex/context/base/meta-clp.tex
new file mode 100644
index 000000000..be2506b19
--- /dev/null
+++ b/tex/context/base/meta-clp.tex
@@ -0,0 +1,164 @@
+%D \module
+%D [ file=meta-clp,
+%D version=2000.07.06,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Clipping,
+%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 In this library, we define a bunch of clipping paths that
+%D can be fed to \type {\clip}.
+
+\startMPclip{ellipse}
+ clip currentpicture to unitcircle
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{negellipse}
+ clip currentpicture to (unitcircle peepholed unitsquare)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{urellipse}
+ clip currentpicture to urcircle scaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{ulellipse}
+ clip currentpicture to ulcircle scaled 2 shifted (1,0)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{llellipse}
+ clip currentpicture to llcircle scaled 2 shifted (1,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lrellipse}
+ clip currentpicture to lrcircle scaled 2 shifted (0,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{tellipse}
+ clip currentpicture to tcircle shifted (.5,0) yscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{bellipse}
+ clip currentpicture to bcircle shifted (.5,.5) yscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lellipse}
+ clip currentpicture to lcircle shifted (.5,.5) xscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{rellipse}
+ clip currentpicture to rcircle shifted (0,.5) xscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{diamond}
+ clip currentpicture to unitdiamond
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{negdiamond}
+ clip currentpicture to (unitdiamond peepholed unitsquare)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{urtriangle}
+ clip currentpicture to urtriangle scaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{ultriangle}
+ clip currentpicture to ultriangle scaled 2 shifted (1,0)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lltriangle}
+ clip currentpicture to lltriangle scaled 2 shifted (1,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lrtriangle}
+ clip currentpicture to lrtriangle scaled 2 shifted (0,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+% More efficient:
+%
+% \def\dosimpleMPclip#1
+% {clip currentpicture to (#1) xscaled \width yscaled \height ;}
+%
+% \def\simpleMPclip#1#2%
+% {\startMPclip{#1}\dosimpleMPclip{#2}\stopMPclip}
+%
+% \simpleMPclip {ellipse} {unitcircle}
+% \simpleMPclip {diamond} {unitdiamond}
+%
+% \simpleMPclip {negellipse} {unitcircle peepholed unitsquare}
+% \simpleMPclip {negdiamond} {unitdiamond peepholed unitsquare}
+%
+% \simpleMPclip {urellipse} {urcircle scaled 2 shifted (0,0)}
+% \simpleMPclip {ulellipse} {ulcircle scaled 2 shifted (1,0)}
+% \simpleMPclip {llellipse} {llcircle scaled 2 shifted (1,1)}
+% \simpleMPclip {lrellipse} {lrcircle scaled 2 shifted (0,1)}
+%
+% \simpleMPclip {tellipse} {tcircle shifted (.5,0) yscaled 2}
+% \simpleMPclip {bellipse} {bcircle shifted (.5,.5) yscaled 2}
+% \simpleMPclip {lellipse} {lcircle shifted (.5,.5) xscaled 2}
+% \simpleMPclip {rellipse} {rcircle shifted (0,.5) xscaled 2}
+%
+% \simpleMPclip {urtriangle} {urtriangle scaled 2 shifted (0,0)}
+% \simpleMPclip {ultriangle} {ultriangle scaled 2 shifted (1,0)}
+% \simpleMPclip {lltriangle} {lltriangle scaled 2 shifted (1,1)}
+% \simpleMPclip {lrtriangle} {lrtriangle scaled 2 shifted (0,1)}
+
+%D \in {Figure} [fig:clipping paths] shows which paths are
+%D predefined. When applied to a whole picture, their usage
+%D is:
+%D
+%D \starttyping
+%D \clip[nx=1,ny=1,mp=ellipse]{some clippable content}
+%D \stoptyping
+%D
+%D \startbuffer
+%D \setupclipping [nx=1,ny=1,x=1,y=1]
+%D \setupblackrules[width=2cm,height=1cm]
+%D \startcombination[6*3] % \startcombination[6*3]
+%D {\clip[mp=urellipse] {\blackrule}} {urellipse}
+%D {\clip[mp=ulellipse] {\blackrule}} {ulellipse}
+%D {\clip[mp=llellipse] {\blackrule}} {llellipse}
+%D {\clip[mp=lrellipse] {\blackrule}} {lrellipse}
+%D {\clip[mp=ellipse] {\blackrule}} {ellipse}
+%D {\clip[mp=negellipse]{\blackrule}} {negellipse}
+%D {\clip[mp=tellipse] {\blackrule}} {tellipse}
+%D {\clip[mp=bellipse] {\blackrule}} {bellipse}
+%D {\clip[mp=lellipse] {\blackrule}} {lellipse}
+%D {\clip[mp=rellipse] {\blackrule}} {rellipse}
+%D {} {}
+%D {} {}
+%D {\clip[mp=urtriangle]{\blackrule}} {urtriangle}
+%D {\clip[mp=ultriangle]{\blackrule}} {ultriangle}
+%D {\clip[mp=lltriangle]{\blackrule}} {lltriangle}
+%D {\clip[mp=lrtriangle]{\blackrule}} {lrtriangle}
+%D {\clip[mp=diamond] {\blackrule}} {diamond}
+%D {\clip[mp=negdiamond]{\blackrule}} {negdiamond}
+%D \stopcombination % \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure % \placefigure
+%D [here][fig:clipping paths]
+%D {The predefined clipping paths.}
+%D {\getbuffer} % {\getbuffer}
+
+\endinput
diff --git a/tex/context/base/meta-dum.tex b/tex/context/base/meta-dum.tex
new file mode 100644
index 000000000..bc19f3c5f
--- /dev/null
+++ b/tex/context/base/meta-dum.tex
@@ -0,0 +1,123 @@
+%D \module
+%D [ file=meta-dum,
+%D version=2003.03.21,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Dummy (External) Graphics,
+%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
+
+%D This library overloads the normal external figure
+%D placeholder by a nicer one.
+%D
+%D \startbuffer
+%D \useMPlibrary[dum]
+%D
+%D \startlinecorrection
+%D \externalfigure[unknown-a][width=3cm,height=1cm]
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \externalfigure[unknown-b][width=4cm,height=5cm]
+%D \stoplinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% currently preparempvariables is unable to resolve number
+% fractions like reduction
+
+% June 22, 2003, this definition was patched to adapt itself
+% to transparent colors
+
+\startuseMPgraphic{placeholder}{width,height,reduction,color}
+ numeric w, h, d, r ; color c, b, cc ; path p ; boolean t ;
+ t := is_transparent(\MPvar{color}) ;
+ c := not_transparent(\MPvar{color}) ;
+ b := not_transparent(white) ;
+ w := \MPvar{width} ;
+ h := \MPvar{height} ;
+ r := \MPvar{reduction} ;
+ d := max(w,h) ;
+ p := unitsquare xyscaled (w,h) ;
+ cc := r[.5c,b] ;
+ fill p withcolor if t : transparent(1,.5,cc) else : cc fi ;
+ for i := 1 upto 60 :
+ cc := r[c randomized(.3,.9),b] ;
+ fill fullcircle
+ scaled (d/5 randomized (d/5))
+ shifted (center p randomized (d))
+ withcolor if t : transparent(1,.5,cc) else : cc fi ;
+ endfor ;
+ clip currentpicture to p ;
+\stopuseMPgraphic
+
+\definepalet
+ [placeholder]
+ [1=red,2=green,3=blue,4=cyan,5=magenta,6=yellow]
+
+% \newcounter \figurereplacementcycle
+
+\let\figurereplacementcycle\relax
+
+\setupexternalfigures
+ [\c!reduction=0,
+ \c!text=\v!yes]
+
+\let\normalexternalfigurereplacement\externalfigurereplacement
+
+\def\externalfigurereplacement#1#2#3%
+ {\getpaletsize[placeholder]%
+ \ifx\figurereplacementcycle\relax
+ \getrandomnumber \figurereplacementcycle \!!plusone \paletsize
+ \globallet \figurereplacementcycle \figurereplacementcycle
+ \else
+ \doglobal\increment\figurereplacementcycle
+ \fi
+ \ifnum\figurereplacementcycle>\paletsize
+ \globallet\figurereplacementcycle\!!plusone
+ \fi
+ \weightGRAYfalse % monochrome anyway
+ \MPcmykcolorsfalse
+ \MPspotcolorsfalse
+ \defineoverlay
+ [\s!dummy]
+ [\useMPgraphic
+ {placeholder}%
+ {width=\figurewidth,
+ height=\figureheight,
+ reduction=\@@efreduction,
+ color=placeholder:\figurereplacementcycle}]%
+ \expanded{\localframed
+ [\??ef]
+ [\c!width=\figurewidth,
+ \c!height=\figureheight,
+ \c!frame=\v!off,
+ \c!strut=\v!no,
+ \c!background=\s!dummy,
+ \c!foregroundcolor=\s!white]}%
+ {\doif\@@eftext\v!yes
+ {\infofont \setupinterlinespace \dohyphens % \nohyphens
+ \doifelse{#1}\s!dummy \!!doneafalse\!!doneatrue
+ \doifelse{#2}\s!dummy \!!donebfalse\!!donebtrue
+ \doifelse{#3}\s!unknown\!!donecfalse\!!donectrue
+ \if!!donea
+ name: \expanded{\verbatimstring{#1}}\strut\endgraf
+ \fi
+ \if!!doneb
+ \if!!donea file: \else \if!!donec file: \fi \fi
+ \expanded{\verbatimstring{#2}}\strut\endgraf
+ \fi
+ \if!!donec
+ state: \expanded{\verbatimstring{#3}}\strut\endgraf
+ \fi}}}
+
+\def\dummyfigure{\externalfigure[placeholder]}
+
+\protect \endinput
diff --git a/tex/context/base/meta-fig.mkii b/tex/context/base/meta-fig.mkii
new file mode 100644
index 000000000..3edd73b57
--- /dev/null
+++ b/tex/context/base/meta-fig.mkii
@@ -0,0 +1,89 @@
+%D \module
+%D [ file=meta-fig,
+%D version=2000.09.07,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Stand Alone Graphics,
+%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}{MetaPost Graphics / Stand Alone Graphics}
+
+\unprotect
+
+%D This module implements a method for defining
+%D stand||alone||graphics, that is, each graphic gets is own
+%D page. Because graphics are wrapped in a \type {\framed},
+%D you can add overlays to the graphic directly, and since the
+%D whole \CONTEXT\ machinery is available, you can also add
+%D page backgrounds.
+%D
+%D \starttyping
+%D \setupMPpage
+%D [offset=1pt,
+%D background=color,
+%D backgroundcolor=green]
+%D
+%D \startMPpage
+%D fill fullcircle scaled 10cm withcolor red ;
+%D \stopMPpage
+%D
+%D \startMPpage
+%D fill fullsquare rotated 45 scaled 8cm withcolor blue ;
+%D \stopMPpage
+%D \stoptyping
+%D
+%D Although this is hardly of any use, you can mix these
+%D definitions with the text flow, since all settings are
+%D kept local. The page is clipped to the image size.
+
+\presetlocalframed[\??mg]
+
+\def\setupMPpage
+ {\dodoubleargument\getparameters[\??mg]}
+
+\def\startMPpage
+ {\dodoubleempty\dostartMPpage}
+
+\long\def\dostartMPpage[#1][#2]% second arg gobbles space
+ {\dostartfittingpage[\??mg][#1]%
+ \obeyMPlines
+ \dodostartMPpage}
+
+\long\def\dodostartMPpage#1\stopMPpage
+ {\startuseMPgraphic{@@}#1\stopuseMPgraphic
+ \useMPgraphic{@@}%
+ \dostopfittingpage}
+
+\let\stopMPpage \relax % so that we can use it in \expanded
+
+\setupMPpage
+ [\c!scale=1000,
+ \c!strut=\v!no,
+ \c!align=,
+ \c!offset=\v!overlay,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!frame=\v!off]
+
+%D \macros
+%D {MPfigure}
+%D
+%D A bit out of place, here but nevertheless:
+
+\def\MPfigure#1#2% test for dup figure
+ {\bgroup
+ \getfiguredimensionsonly[#1]% [\c!object=\v!no] already set
+ \startMPcode
+ externalfigure "#1"
+ xscaled \figurewidth\space
+ yscaled \figureheight\space
+ #2 ;
+ \stopMPcode
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/meta-fig.mkiv b/tex/context/base/meta-fig.mkiv
new file mode 100644
index 000000000..4738316da
--- /dev/null
+++ b/tex/context/base/meta-fig.mkiv
@@ -0,0 +1,84 @@
+%D \module
+%D [ file=meta-fig,
+%D version=2000.09.07,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Stand Alone Graphics,
+%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}{MetaPost Graphics / Stand Alone Graphics}
+
+\unprotect
+
+%D This module implements a method for defining
+%D stand||alone||graphics, that is, each graphic gets is own
+%D page. Because graphics are wrapped in a \type {\framed},
+%D you can add overlays to the graphic directly, and since the
+%D whole \CONTEXT\ machinery is available, you can also add
+%D page backgrounds.
+%D
+%D \starttyping
+%D \setupMPpage
+%D [offset=1pt,
+%D background=color,
+%D backgroundcolor=green]
+%D
+%D \startMPpage
+%D fill fullcircle scaled 10cm withcolor red ;
+%D \stopMPpage
+%D
+%D \startMPpage
+%D fill fullsquare rotated 45 scaled 8cm withcolor blue ;
+%D \stopMPpage
+%D \stoptyping
+%D
+%D Although this is hardly of any use, you can mix these
+%D definitions with the text flow, since all settings are
+%D kept local. The page is clipped to the image size.
+
+\presetlocalframed[\??mg]
+
+\unexpanded\def\setupMPpage
+ {\dodoubleargument\getparameters[\??mg]}
+
+\def\startMPpage
+ {\dodoubleempty\dostartMPpage}
+
+\long\def\dostartMPpage[#1][#2]#3\stopMPpage % second arg gobbles space
+ {\dostartfittingpage[\??mg][#1]%
+ \processMPgraphic{#3}%
+ \dostopfittingpage}
+
+\let\stopMPpage \relax % so that we can use it in \expanded
+
+\setupMPpage
+ [\c!scale=1000,
+ \c!strut=\v!no,
+ \c!align=,
+ \c!offset=\v!overlay,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!frame=\v!off]
+
+%D \macros
+%D {MPfigure}
+%D
+%D A bit out of place, here but nevertheless:
+
+\def\MPfigure#1#2% test for dup figure, can be replaced by a textext
+ {\bgroup
+ \getfiguredimensionsonly[#1]% [\c!object=\v!no] already set
+ \startMPcode
+ externalfigure "#1"
+ xscaled \the\dimexpr\figurewidth \relax\space % must be points
+ yscaled \the\dimexpr\figureheight\relax\space % must be points
+ #2 ;
+ \stopMPcode
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/meta-fun.lua b/tex/context/base/meta-fun.lua
new file mode 100644
index 000000000..fef2aa12b
--- /dev/null
+++ b/tex/context/base/meta-fun.lua
@@ -0,0 +1,55 @@
+if not modules then modules = { } end modules ['meta-fun'] = {
+ version = 1.001,
+ comment = "companion to meta-fun.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- very experimental, actually a joke ... see metafun manual for usage
+
+local format, loadstring, type = string.format, loadstring, type
+local texwrite = tex.write
+
+metafun = metafun or { }
+
+function metafun.topath(t,connector)
+ tex.write("(")
+ if #t > 0 then
+ for i=1,#t do
+ if i > 1 then
+ texwrite(connector or "..")
+ end
+ local ti = t[i]
+ if type(ti) == "string" then
+ texwrite(ti)
+ else
+ texwrite(format("(%s,%s)",ti.x or ti[1] or 0,ti.y or ti[2] or 0))
+ end
+ end
+ else
+ texwrite("origin")
+ end
+ texwrite(")")
+end
+
+function metafun.interpolate(f,b,e,s,c)
+ local done = false
+ tex.write("(")
+ for i=b,e,(e-b)/s do
+ local d = loadstring(format("return function(x) return %s end",f))
+ if d then
+ d = d()
+ if done then
+ texwrite(c or "...")
+ else
+ done = true
+ end
+ texwrite(format("(%s,%s)",i,d(i)))
+ end
+ end
+ if not done then
+ texwrite("origin")
+ end
+ texwrite(")")
+end
diff --git a/tex/context/base/meta-fun.mkiv b/tex/context/base/meta-fun.mkiv
new file mode 100644
index 000000000..a43ffefff
--- /dev/null
+++ b/tex/context/base/meta-fun.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=meta-fun,
+%D version=2009.06.02,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Goodies,
+%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}{MetaPost Graphics / Goodies}
+
+\registerctxluafile{meta-fun}{1.001}
+
+\unprotect
+
+\protect \endinput
diff --git a/tex/context/base/meta-ini.mkii b/tex/context/base/meta-ini.mkii
new file mode 100644
index 000000000..e7c6d218e
--- /dev/null
+++ b/tex/context/base/meta-ini.mkii
@@ -0,0 +1,1054 @@
+%D \module
+%D [ file=meta-ini,
+%D version=1999.07.10,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% currently the running color influences the mp graphic in
+% pdftex, but this will change [i.e. become optional]; one
+% problem is that pdf has no grouping with regards to the
+% color
+
+\writestatus{loading}{MetaPost Graphics / Initializations}
+
+\unprotect
+
+%D This module extends the functionality of the support module
+%D \type {supp-mps}, the module that is responsible for
+%D \METAPOST\ inclusion in \CONTEXT. Some basic macros will be
+%D extended. Since some support is depends on \METAPOST\
+%D macros. so let's first preload a few auxiliary \METAPOST\
+%D files.
+
+\maxnofMPgraphics = 4000 % metafun disables the 4K boundary
+
+\appendtoks \flushMPgraphics \to \everygoodbye % \everylastshipout
+
+\def\@@MPG{@MPG@}
+
+\startMPextensions
+ if unknown context_tool: input mp-tool; fi;
+ if unknown context_spec: input mp-spec; fi;
+ if unknown context_grph: input mp-grph; fi;
+\stopMPextensions
+
+%D Since we want lables to follow the document settings, we
+%D also set the font related variables.
+
+\ifnum\texengine=\xetexengine
+ \startMPinitializations % scale is not yet ok
+ defaultfont:="rm-lmtt10";
+ defaultscale:=\the\bodyfontsize/10pt;
+ \stopMPinitializations
+\else
+ \startMPinitializations % scale is not yet ok
+ defaultfont:="\truefontname{Regular}";
+ defaultscale:=\the\bodyfontsize/10pt;
+ \stopMPinitializations
+\fi
+
+%D In order to support fancy text features (like outline
+%D fonts), we set:
+
+\startMPextensions
+ graphictextformat:="context";
+ graphictextdirective "\the\everyMPTEXgraphic";
+\stopMPextensions
+
+% \startMPextensions
+% textextdirective "\the\everyMPTEXgraphic";
+% \stopMPextensions
+
+%D A signal that we're in combines \CONTEXT||\METAFUN mode:
+
+\startMPextensions
+ string contextversion;
+ contextversion:="\contextversion";
+\stopMPextensions
+
+%D Some safeguards:
+%D
+%D \starttyping
+%D \appendtoks \cleanupfeatures \to \everyMPgraphic
+%D \stoptyping
+%D
+%D No, we don't want that (else we loose UTF etc).
+
+%D Another one:
+
+\prependtoks \MPstaticgraphictrue \to \everyoverlay
+\prependtoks \MPstaticgraphictrue \to \everypagebody
+
+%D We save the number of graphics for the sake of \TEXEXEC.
+
+\newcounter\totalnofMPgraphics
+
+\def\thenofMPgraphics{\the\nofMPgraphics} % from supp-mps
+
+\appendtoks
+ \savecurrentvalue\totalnofMPgraphics\thenofMPgraphics
+\to \everybye
+
+%D \macros
+%D {setupMPvariables}
+%D
+%D When we build collections of \METAPOST\ graphics, like
+%D background and buttons, the need for passing settings
+%D arises. By (mis|)|using the local prefix that belongs to
+%D \type {\framed}, we get a rather natural interface to
+%D backgrounds. To prevent conflicts, we will use the \type
+%D {-} in \METAPOST\ specific variables, like:
+%D
+%D \starttyping
+%D \setupMPvariables[meta:button][size=20pt]
+%D \stoptyping
+
+\def\@@meta{meta:}
+
+\def\setupMPvariables
+ {\dodoubleempty\dosetupMPvariables}
+
+\def\dosetupMPvariables[#1][#2]%
+ {\ifsecondargument
+ \getrawparameters[#1:][#2]% brr, todo: [\@@meta#1:]
+ \else
+ \getrawparameters[\@@meta][#1]%
+ \fi}
+
+\let\@@framed\s!unknown
+
+\def\MPvariable#1%
+ {\csname
+ \ifcsname\@@framed\@@meta#1\endcsname\@@framed\fi\@@meta#1%
+ \endcsname}
+
+\let\MPvar\MPvariable
+
+\let\setMPvariables\setupMPvariables
+
+\def\MPrawvar#1#2{\csname#1:#2\endcsname}
+
+\def\presetMPvariable
+ {\dodoubleargument\dopresetMPvariable}
+
+\def\dopresetMPvariable[#1][#2=#3]%
+ {\doifundefined{#1:#2}{\setvalue{#1:#2}{#3}}}
+
+\def\useMPvariables
+ {\dodoubleargument\douseMPvariables}
+
+\def\douseMPvariables[#1][#2]%
+ {\def\@@meta{#1:}%
+ \prepareMPvariables{#2}}
+
+%D \macros
+%D {startuniqueMPgraphic, uniqueMPgraphic}
+%D
+%D This macros is probably of most use to myself, since I like
+%D to use graphics that adapt themselves. The next \METAPOST\
+%D kind of graphic is both unique and reused when possible.
+%D
+%D \starttyping
+%D \defineoverlay[example][\uniqueMPgraphic{test}]
+%D
+%D \startuniqueMPgraphic {test}
+%D draw unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D \stopuniqueMPgraphic
+%D \stoptyping
+
+%D For educational purposes, we show the original version
+%D first. This one used a rather simple method for determining
+%D the uniqueness.
+%D
+%D \starttyping
+%D \long\def\startuniqueMPgraphic#1#2\stopuniqueMPgraphic%
+%D {\setvalue{\@@MPG#1}%
+%D {\startreusableMPgraphic{\overlaystamp:#1}#2\stopreusableMPgraphic
+%D \reuseMPgraphic{\overlaystamp:#1}}}
+%D
+%D \def\uniqueMPgraphic#1%
+%D {\getvalue{\@@MPG#1}}
+%D \stoptyping
+
+%\def\overlaystamp % watch the \MPcolor, since colors can be redefined
+% {\overlaywidth:\overlayheight:\overlaydepth
+% :\MPcolor{\overlaycolor}:\MPcolor{\overlaylinecolor}}
+
+\def\overlaystamp % watch the \MPcolor, since colors can be redefined
+ {\overlaywidth:\overlayheight:\overlaydepth
+ :\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
+
+%D A better approach is to let additional variables play a role
+%D in determining the uniqueness. In the next macro, the
+%D second, optional, argument is used to guarantee the
+%D uniqueness, as well as prepare variables for passing them to
+%D \METAPOST.
+%D
+%D \starttyping
+%D \startuniqueMPgraphic{meta:hash}{gap,angle,...}
+%D \stoptyping
+%D
+%D The calling macro also accepts a second argument. For
+%D convenient use in overlay definitions, we use \type {{}}
+%D instead of \type {[]}.
+%D
+%D \starttyping
+%D \uniqueMPgraphic{meta:hash}{gap=10pt,angle=30}
+%D \stoptyping
+
+\long\def\handleuniqueMPgraphic#1#2#3%
+ {\blabelgroup
+ \def\@@meta{#1:}%
+ \extendMPoverlaystamp{#2}% incl prepare
+ \ifundefined{\@@MPG\overlaystamp:#1}%
+ \enableincludeMPgraphics
+ \startMPgraphic#3\stopMPgraphic
+ \doifobjectssupportedelse\donothing\useMPboxfalse
+ \ifuseMPbox
+ \@EA\douseMPbox
+ \else
+ \@EA\nouseMPbox
+ \fi {\@@MPG\overlaystamp:#1}%
+ \fi
+ \getvalue{\@@MPG\overlaystamp:#1}%
+ \elabelgroup}
+
+\long\def\startuniqueMPgraphic
+ {\blabelgroup
+ \dodoublegroupempty\dostartuniqueMPgraphic}
+
+\long\def\dostartuniqueMPgraphic
+ {\obeyMPlines
+ \dodostartuniqueMPgraphic}
+
+\long\def\dodostartuniqueMPgraphic#1#2#3\stopuniqueMPgraphic%
+ {\long\setgvalue{\@@MPG#1}{\handleuniqueMPgraphic{#1}{#2}{#3}}%
+ \elabelgroup}
+
+\unexpanded\def\uniqueMPgraphic
+ {\dodoublegroupempty\douniqueMPgraphic}
+
+\def\douniqueMPgraphic#1#2%
+ {\blabelgroup
+ \setupMPvariables[#1][#2]%
+ \getvalue{\@@MPG#1}{}%
+ \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
+ \def\@@meta{#1:}%
+ \prepareMPvariables{#2}%
+ \enableincludeMPgraphics
+ \startMPgraphic#3\stopMPgraphic
+ \ifMPrun \else % see mfun-004 : processing buffer
+ \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \placeMPgraphic
+ \fi
+ \deallocateMPslot\currentMPgraphic
+ \elabelgroup}
+
+\long\def\startuseMPgraphic
+ {\blabelgroup
+ \dodoublegroupempty\dostartuseMPgraphic}
+
+\long\def\dostartuseMPgraphic
+ {\obeyMPlines
+ \dodostartuseMPgraphic}
+
+\long\def\dodostartuseMPgraphic#1#2#3\stopuseMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}%
+ \elabelgroup}
+
+\long\def\startusableMPgraphic % redundant but handy
+ {\blabelgroup
+ \dodoublegroupempty\dostartusableMPgraphic}
+
+\long\def\dostartusableMPgraphic % redundant but handy
+ {\obeyMPlines
+ \dodostartusableMPgraphic}
+
+\long\def\dodostartusableMPgraphic#1#2#3\stopusableMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}%
+ \elabelgroup}
+
+\long\def\handlereusableMPgraphic#1#2#3%
+ {\blabelgroup
+ \def\@@meta{#1:}%
+ \prepareMPvariables{#2}%
+ \enableincludeMPgraphics
+ \startMPgraphic#3\stopMPgraphic
+ \doifobjectssupportedelse\donothing\useMPboxfalse
+ \ifuseMPbox
+ \@EA\douseMPbox
+ \else
+ \@EA\nouseMPbox
+ \fi {\@@MPG#1}%
+ \getvalue{\@@MPG#1}%
+ \elabelgroup}
+
+\long\def\startreusableMPgraphic
+ {\blabelgroup
+ \dodoublegroupempty\dostartreusableMPgraphic}
+
+\def\dostartreusableMPgraphic
+ {\obeyMPlines
+ \dodostartreusableMPgraphic}
+
+\long\def\dodostartreusableMPgraphic#1#2#3\stopreusableMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}{#3}}%
+ \elabelgroup}
+
+\unexpanded\def\useMPgraphic
+ {\dodoublegroupempty\douseMPgraphic}
+
+\def\douseMPgraphic#1#2%
+ {\blabelgroup
+ \setupMPvariables[#1][#2]%
+ \getvalue{\@@MPG#1}{}%
+ \elabelgroup}
+
+\let\reuseMPgraphic\useMPgraphic
+
+\let\stopuseMPcode \relax % so that we can use it in \expanded
+\let\stopusableMPcode \relax % so that we can use it in \expanded
+\let\stopreusableMPcode \relax % so that we can use it in \expanded
+\let\stopuniqueMPcode \relax % so that we can use it in \expanded
+
+\def\enableincludeMPgraphics
+ {\let\handleuseMPgraphic \thirdofthreearguments
+ \let\handlereusableMPgraphic\thirdofthreearguments}
+
+% todo: each code/page/buffer a var class
+
+%D \macros
+%D {startuniqueMPpagegraphic,uniqueMPpagegraphic}
+%D
+%D Experimental.
+
+\def\MPpageprefix{\doifoddpageelse oe:}
+
+\def\overlaypagestamp
+ {\MPpageprefix\overlaywidth:\overlayheight:\overlaydepth
+ :\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
+
+\long\def\startuniqueMPpagegraphic
+ {\blabelgroup
+ \dodoublegroupempty\dostartuniqueMPpagegraphic}
+
+\long\def\dostartuniqueMPpagegraphic
+ {\obeyMPlines
+ \dodostartuniqueMPpagegraphic}
+
+\long\def\dodostartuniqueMPpagegraphic#1#2#3\stopuniqueMPpagegraphic
+ {\long\setgvalue{\@@MPG o:#1}{\handleuniqueMPgraphic{o:#1}{#2}{#3}}%
+ \long\setgvalue{\@@MPG e:#1}{\handleuniqueMPgraphic{e:#1}{#2}{#3}}%
+ \elabelgroup}
+
+\unexpanded\def\uniqueMPpagegraphic
+ {\dodoublegroupempty\douniqueMPpagegraphic}
+
+% \def\douniqueMPpagegraphic#1#2%
+% {\blabelgroup
+% \let\overlaystamp\overlaypagestamp
+% \setupMPvariables[#1][#2]%
+% \getvalue{\@@MPG\MPpageprefix#1}{}%
+% \elabelgroup}
+
+\def\douniqueMPpagegraphic#1#2%
+ {\blabelgroup
+ \let\overlaystamp\overlaypagestamp
+ \setupMPvariables[\MPpageprefix#1][#2]% prefix is new here
+ \getvalue{\@@MPG\MPpageprefix#1}{}%
+ \elabelgroup}
+
+%D One way of defining a stamp is:
+%D
+%D \starttyping
+%D \def\extendMPoverlaystamp#1%
+%D {\def\docommand##1%
+%D {\edef\overlaystamp{\overlaystamp:\MPvariable{##1}}}%
+%D \processcommalist[#1]\docommand}
+%D \stoptyping
+
+%D Since we need to feed \METAPOST\ with expanded dimensions,
+%D we introduce a dedicated expansion engine.
+
+\def\prepareMPvariable#1%
+ {\ifundefined{\@@framed\@@meta#1}%
+ \doprepareMPvariable{\@@meta#1}%
+ \else
+ \doprepareMPvariable{\@@framed\@@meta#1}%
+ \fi}
+
+% \startlines
+% \def\xxx{\lineheight} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{2pt} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{2} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{\scratchcounter} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{red} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{0.4} \doprepareMPvariable{xxx} \xxx
+% \stoplines
+
+\def\doprepareMPvariable#1%
+ {\edef\theMPvariable{\getvalue{#1}}%
+ \doifelsenothing\theMPvariable
+ {\setevalue{#1}{\MPcolor{black}}}
+ {\defconvertedcommand\ascii\theMPvariable % otherwise problems
+ \doifcolorelse \ascii % with 2\bodyfontsize
+ {\setevalue{#1}{\MPcolor\theMPvariable}}
+ {% can be aux macro
+ \setbox\scratchbox\hbox{\scratchdimen\theMPvariable sp}%
+ \ifdim\wd\scratchbox=\zeropoint
+ % \scratchcounter\theMPvariable
+ % \setevalue{#1}{\the\scratchcounter}%
+ % also accepts 0.number :
+ \setevalue{#1}{\number\theMPvariable}%
+ \else
+ \scratchdimen\theMPvariable
+ \setevalue{#1}{\the\scratchdimen}%
+ \fi}}}
+
+%D We redefine \type {\extendMPoverlaystamp} to preprocess
+%D variables using \type {\prepareMPvariable}.
+
+\def\doextendMPoverlaystamp#1%
+ {\prepareMPvariable{#1}%
+ \edef\overlaystamp{\overlaystamp:\MPvariable{#1}}}
+
+\def\extendMPoverlaystamp#1%
+ {\processcommalist[#1]\doextendMPoverlaystamp}
+
+\def\prepareMPvariables#1%
+ {\processcommalist[#1]\prepareMPvariable}
+
+%D \macros
+%D {MPdatafile}
+%D
+%D We redefine a macro from \type {supp-mps.tex}:
+
+\def\MPdatafile
+ {\bufferprefix mpd-\the\currentMPgraphic.mpd}
+
+%D \macros
+%D {MPrunfile}
+%D
+%D This one is more abstract and does not assume knowledge
+%D of buffer prefixes.
+
+\def\MPrunfile#1%
+ {\bufferprefix mprun.#1}
+
+%D \macros
+%D {getMPdata}
+%D
+%D When we collect graphics in one file, we run into
+%D troubles, since \METAPOST\ has a built in limit (of 4)
+%D on the number of files it can handle. It's therefore
+%D better to collect all data in one file and filter it.
+
+\def\MPdataMPDfile{\jobname-mpgraph.mpd}
+\def\MPdataMPOfile{\jobname-mpgraph.mpo}
+\def\MPdataMPYfile{\jobname-mpgraph.mpy}
+
+\startMPextensions
+ boolean collapse_data; collapse_data:=true;
+ def data_mpd_file = "\MPdataMPDfile" enddef ;
+ def data_mpo_file = "\MPdataMPOfile" enddef ;
+ def data_mpy_file = "\MPdataMPYfile" enddef ;
+\stopMPextensions
+
+\def\getMPdata
+ {\long\def\MPdata##1##2{\ifnum##1=\currentMPgraphic\relax##2\fi}%
+ \startreadingfile
+ % \startnointerference % no, else we need to do all data global
+ \readlocfile\MPdataMPDfile\donothing\donothing
+ % \stopnointerference
+ \stopreadingfile}
+
+%D We have to enable this mechanism with:
+
+\startMPextensions
+\stopMPextensions
+
+%D For the moment, the next one is a private macro:
+
+\def\processMPbuffer
+ {\dosingleempty\doprocessMPbuffer}
+
+\def\doprocessMPbuffer[#1]%
+ {\doifelsenothing{#1}
+ {\doprocessMPbuffer[\jobname]}
+ {\bgroup
+ \setnormalcatcodes
+ \obeyMPlines
+ %\let\par\empty % oeps, this makes dvi mode graphics hang when not found
+ \!!toksa\emptytoks
+ \def\copyMPbufferline{\expandafter\appendtoks\fileline\to\!!toksa}%
+ \def\dodoprocessMPbuffer##1%
+ {\doprocessfile\scratchread{\TEXbufferfile{##1}}\copyMPbufferline}%
+ \processcommalist[#1]\dodoprocessMPbuffer
+ \@EA\startMPcode\the\!!toksa\stopMPcode % more efficient
+ \egroup}}
+
+\def\runMPbuffer
+ {\dosingleempty\dorunMPbuffer}
+
+\def\dorunMPbuffer[#1]% processing only
+ {{\MPruntrue\doprocessMPbuffer[#1]}}
+
+%D \macros
+%D {startMPenvironment, resetMPenvironment}
+%D
+%D In order to synchronize the main \TEX\ run and the runs
+%D local to \METAPOST, environments can be passed.
+
+\ifx\everyMPTEXgraphic\undefined
+ \newtoks\everyMPTEXgraphic
+\fi
+
+%D A more general way of passing environments is:
+
+\def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks
+ {\bgroup
+ \catcode`\^^M=\@@space
+ \dodoubleempty\dostartMPenvironment}
+
+\long\def\dostartMPenvironment[#1][#2]#3\stopMPenvironment
+ {\egroup
+ \doif{#1}\s!reset\resetMPenvironment % reset mp toks
+ \doif{#1}\v!global{#3}% % use in main doc too
+ \doif{#1}+{#3}% % use in main doc too
+ \defconvertedargument\ascii{#3}%
+ \expandafter\appendtoks\ascii\to\everyMPTEXgraphic}
+
+\def\resetMPenvironment
+ {\everyMPTEXgraphic\emptytoks % = is really needed !
+ \startMPenvironment
+ \global\loadfontfileoncetrue
+ \stopMPenvironment}
+
+\resetMPenvironment
+
+\def\useMPenvironmentbuffer[#1]%
+ {\expanded{\startMPenvironment\noexpand\readfile{\TEXbufferfile{\jobname}}{}{}}\stopMPenvironment}
+
+% \useMPenvironmentbuffer[mp] % what was this?
+
+%D This command takes \type {[reset]} as optional
+%D argument.
+%D
+%D \starttyping
+%D \startMPenvironment
+%D \setupbodyfont[pos,14.4pt]
+%D \stopMPenvironment
+%D
+%D \startMPcode
+%D draw btex \sl Hans Hagen etex scaled 5 ;
+%D \stopMPcode
+%D \stoptyping
+%D
+%D The \type {\resetMPenvironment} is a quick way to erase
+%D the token list.
+%D
+%D You should be aware of independencies. For instance, if you use a font
+%D in a graphic that is not used in the main document, you need to load the
+%D typescript at the outer level (either directly or by using the global
+%D option).
+%D
+%D \starttyping
+%D \usetypescript[palatino][texnansi]
+%D
+%D \startMPenvironment
+%D \usetypescript[palatino][texnansi]
+%D \enableregime[utf]
+%D \setupbodyfont[palatino]
+%D \stopMPenvironment
+%D
+%D \startMPpage
+%D draw btex aap‒noot coördinatie – één etex ;
+%D \stopMPpage
+%D \stoptyping
+
+%D We don't want spurious files, do we?
+
+%\def\initializeMPgraphics
+% {%\ifx\bufferprefix\empty \else
+% \immediate\openout\MPwrite\MPgraphicfile.mp
+% \immediate\write\MPwrite{end.}%
+% \immediate\closeout\MPwrite
+% }%\fi}
+
+% strange :
+
+% \def\initializeMPgraphicfile
+% {\bgroup
+% \doinitializeMPgraphicfile
+% \MPruntrue
+% \doinitializeMPgraphicfile
+% \egroup}
+
+% \def\doinitializeMPgraphicfile
+% {\immediate\openout\scratchwrite\MPgraphicfile.mp
+% \immediate\write\scratchwrite{end.}%
+% \immediate\closeout\scratchwrite}
+
+\def\initializeMPgraphicfile
+ {\immediate\openout\scratchwrite\MPgraphicfile.mp
+ \immediate\write\scratchwrite{end.}%
+ \immediate\closeout\scratchwrite}
+
+\def\initializeMPgraphics
+ {\bgroup
+ \initializeMPgraphicfile
+ \ifx\bufferprefix\empty\else
+ \let\bufferprefix\empty
+ \initializeMPgraphicfile
+ \fi
+ \egroup}
+
+%D Loading specific \METAPOST\ related definitions is
+%D accomplished by:
+
+\def\douseMPlibrary#1%
+ {\ifundefined{\c!file\f!metapostprefix#1}%
+ \letvalueempty{\c!file\f!metapostprefix#1}%
+ \makeshortfilename[\truefilename{\f!metapostprefix#1}]%
+ \startreadingfile
+ \readsysfile\shortfilename{\showmessage\m!metapost1{#1}}\donothing
+ \stopreadingfile
+ \fi}
+
+\def\useMPlibrary[#1]%
+ {\processcommalist[#1]\douseMPlibrary}
+
+%D \macros
+%D {setMPtext, MPtext, MPstring, MPbetex}
+%D
+%D To be documented:
+%D
+%D \starttyping
+%D \setMPtext{identifier}{text}
+%D
+%D \MPtext {identifier}
+%D \MPstring{identifier}
+%D \MPbetex {identifier}
+%D \stoptyping
+
+\def\@@MPT{@MPT@}
+
+\def\forceMPTEXgraphic
+ {\long\def\checkMPTEXgraphic##1{\global\MPTEXgraphictrue}}
+
+\def\setMPtext#1#2% todo : #1 must be made : safe
+ {%\forceMPTEXgraphic
+ \defconvertedargument\ascii{#2}%
+ \dodoglobal\letvalue{\@@MPT#1}\ascii}
+
+% \def\MPtext #1{\getvalue{\@@MPT#1}}
+% \def\MPstring #1{"\getvalue{\@@MPT#1}"}
+% \def\MPbetex #1{btex \getvalue{\@@MPT#1} etex}
+
+\def\MPtext #1{\executeifdefined{\@@MPT#1}\empty}
+\def\MPstring #1{"\executeifdefined{\@@MPT#1}\empty"}
+\def\MPbetex #1{btex \executeifdefined{\@@MPT#1}\empty\space etex}
+
+%D Unfortunately \METAPOST\ does not have \CMYK\ support
+%D built in, but by means of specials we can supply the
+%D information needed to handle them naturaly.
+
+\newif\ifMPcmykcolors \MPcmykcolorstrue
+\newif\ifMPspotcolors \MPspotcolorstrue
+
+\startMPinitializations
+ cmykcolors:=\ifMPcmykcolors true\else false\fi;
+ spotcolors:=\ifMPspotcolors true\else false\fi;
+\stopMPinitializations
+
+%D In order to communicate conveniently with the \TEX\
+%D engine, we introduce some typesetting variables.
+
+% todo : backgroundoffsets
+
+\startMPextensions
+ color OverlayColor,OverlayLineColor;
+\stopMPextensions
+
+\startMPinitializations
+ OverlayWidth:=\overlaywidth;
+ OverlayHeight:=\overlayheight;
+ OverlayDepth:=\overlayheight;
+ OverlayColor:=\MPcolor{\overlaycolor};
+ OverlayLineWidth:=\overlaylinewidth;
+ OverlayLineColor:=\MPcolor{\overlaylinecolor};
+ %
+ BaseLineSkip:=\the\baselineskip;
+ LineHeight:=\the\baselineskip;
+ BodyFontSize:=\the\bodyfontsize;
+ %
+ TopSkip:=\the\topskip;
+ StrutHeight:=\strutheight;
+ StrutDepth:=\strutdepth;
+ %
+ CurrentWidth:=\the\hsize;
+ CurrentHeight:=\the\vsize;
+ %
+ EmWidth:=\the\emwidth;
+ ExHeight:=\the\exheight;
+ %
+ PageNumber:=\the\pageno;
+ RealPageNumber:=\the\realpageno;
+ LastPageNumber:= \lastpage;
+\stopMPinitializations
+
+\appendtoks
+ \disablediscretionaries
+ \disablecompoundcharacters
+\to\everyMPgraphic
+
+% New, experimental (if complaints than only in enco-ffr.mkii), well
+% Mojca complained that it does not work with utf-8 and textext, see
+% ** in meta-tex.
+
+\appendtoks
+ \chardef\activecharactermode\zerocount
+\to\everyMPgraphic
+
+\appendtoks
+ \expanded{\definecolor[currentcolor][\currentcolorname]}%
+\to \everyMPgraphic
+
+\appendtoks
+ \baselineskip1\baselineskip
+ \lineheight 1\lineheight
+ \topskip 1\topskip
+\to \everyMPgraphic
+
+%D Alas, the prologue settings differ per driver.
+
+\ifx\undefined\MPprologues \def\MPprologues{0} \fi
+
+\startMPinitializations
+ prologues:=\MPprologues;
+ mpprocset:=1;
+\stopMPinitializations
+
+\appendtoks
+ \def\MPprologues{0}%
+ \def\MPOSTdriver{dvips}%
+\to \everyresetspecials
+
+%D \macros
+%D {PDFMPformoffset}
+%D
+%D In \PDF, forms are clipped and therefore we have to take
+%D precautions to get this right. Since this is related to
+%D objects, we use the same offset as used there.
+
+\def\PDFMPformoffset{\objectoffset}
+
+%D \macros
+%D {insertMPfile}
+%D
+%D Bypassing the special driver and figure mechanism is not
+%D that nice but saves upto 5\% time in embedding \METAPOST\
+%D graphics by using the low level \PDF\ converter directly,
+%D given of course that we use \PDFTEX. As a result we need to
+%D fool around with the object trigger.
+
+\newtoks\everyinsertMPfile
+
+%D First we present the reasonable fast alternative that we
+%D happily used for some time.
+%D
+%D \starttyping
+%D \def\insertMPfile#1#2%
+%D {\ifx\undefined\externalfigure
+%D \message{[insert file #1 here]}%
+%D \else
+%D \bgroup
+%D \the\everyinsertMPfile
+%D \externalfigure
+%D [#1]
+%D [\c!type=\c!mps,\c!object=\v!no,%
+%D \c!symbol=\v!yes,\c!reset=\v!yes,%
+%D \c!maxwidth=,\c!maxheight=,%
+%D \c!frame=\v!off,\c!background=,%
+%D #2]%
+%D \egroup
+%D \fi}
+%D \stoptyping
+%D
+%D However, on a 1 Gig Pentium, the next alternative saves
+%D us 20 seconds run time for the 300 page \METAFUN\ manual:
+
+\let\insertMPfileARG\insertMPfile
+
+\def\insertMPfile#1#2% in context #2 is empty
+ {\doifelsenothing{#2}{\doinsertMPfile{#1}}{\insertMPfileARG{#1}{#2}}}
+
+\def\includeMPasEPS#1% untested !!
+ {\bgroup
+ \message{[MP as EPS #1]}%
+ \the\everyinsertMPfile
+ \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
+ \setbox\scratchbox\vbox to \!!heightb
+ {\vfill
+ \let \@@DriverImageType \c!mps
+ \def \@@DriverImageFile {#1}%
+ \edef\@@DriverImageWidth {\the\!!widthb }%
+ \edef\@@DriverImageHeight{\the\!!heightb}%
+ \doinsertfile}%
+ \wd\scratchbox\!!widthb
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \egroup}
+
+\def\includeMPasPDF#1%
+ {\bgroup
+ \the\everyinsertMPfile
+ \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed
+ \convertMPtoPDF{#1}{1}{1}% no \plusone !
+ \egroup}
+
+%D So, using a low level approach (thereby avoiding the slower
+%D figure analysis macros) pays off. This kind of
+%D optimizations are a bit tricky since we must make sure that
+%D special resources end up in the (PDF) files. Because the
+%D \METAPOST\ to \PDF\ can handle objects itself, it is not
+%D that complicated.
+
+%D We hook a couple of initializations into the graphic
+%D macros.
+
+\appendtoks
+ \let\figuretypes\c!mps
+ \runutilityfilefalse
+ \consultutilityfilefalse
+\to \everyinsertMPfile
+
+%D One more: (still needed?)
+
+\startMPextensions
+ def initialize_form_numbers =
+ do_initialize_numbers;
+ enddef;
+\stopMPextensions
+
+\startMPinitializations
+ HSize:=\the\hsize ;
+ VSize:=\the\vsize ;
+\stopMPinitializations
+
+\startMPextensions
+ vardef ForegroundBox =
+ unitsquare xysized(HSize,VSize)
+ enddef ;
+ vardef PageFraction =
+ if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi
+ enddef ;
+\stopMPextensions
+
+%D And some more. These are not really needed since we
+%D don't use the normal figure inclusion macros any longer.
+
+\appendtoks
+ \externalfigurepostprocessors\emptytoks % safeguard
+\to \everyinsertMPfile
+
+%D We also take care of disabling fancy figure features, that
+%D can terribly interfere when dealing with symbols,
+%D background graphics and running (postponed) graphics.
+%D You won't believe me if I tell you what funny side effects
+%D can occur. One took me over a day to uncover when
+%D processing the screen version of the \METAFUN\ manual.
+
+%D For my eyes only:
+
+\def\doifelseMPgraphic#1{\doifdefinedelse{\@@MPG#1}}
+
+%D \macros
+%D {startMPcolor}
+%D
+%D The following time consuming method uses \METAPOST\ to
+%D calculate a color. This enables a match between colors
+%D resulting from a complex calculation (e.g. for a title
+%D page) and those in the text.
+
+% \startuseMPgraphic{somecolors}
+% color c[] ; c[1] := .7[red,green] ; c[2] := .7[blue,yellow] ;
+% \stopuseMPgraphic
+
+% \startMPcolor[shade-1][t=.2,a=1]
+% \includeMPgraphic{somecolors} ; fill fullcircle withcolor c[1] ;
+% \stopMPcolor
+
+% \startMPcolor[shade-2][t=.2,a=1]
+% \includeMPgraphic{somecolors} ; fill fullcircle withcolor c[2] ;
+% \stopMPcolor
+
+% \blackrule[width=\hsize,height=4cm,color=shade-1]
+% \blackrule[width=\hsize,height=4cm,color=shade-2]
+
+\def\startMPcolor
+ {\dodoubleempty\dostartMPcolor}
+
+\long\def\dostartMPcolor[#1][#2]#3\stopMPcolor % slow but sometimes handy
+ {\startnointerference
+ \def\handleMPgraycolor{\expanded{\defineglobalcolor[#1][s=\!MPgMPa1,#2]}}%
+ \def\handleMPrgbcolor {\expanded{\defineglobalcolor[#1][r=\!MPgMPa1,g=\!MPgMPa2,b=\!MPgMPa3,#2]}}%
+ \def\handleMPcmykcolor{\expanded{\defineglobalcolor[#1][c=\!MPgMPa1,m=\!MPgMPa2,y=\!MPgMPa3,k=\!MPgMPa4,#2]}}%
+ \startMPcode#3\stopMPcode
+ \stopnointerference}
+
+%D New:
+
+\definelayerpreset % no dx,dy - else nasty non-mp placement
+ [mp]
+ [\c!y=-\MPury bp,
+ \c!x=\MPllx bp,
+ \c!method=\v!fit]
+
+\definelayer
+ [mp]
+ [\c!preset=mp]
+
+%D Usage:
+%D
+%D \starttyping
+%D \defineproperty[one][layer][state=start]
+%D \defineproperty[two][layer][state=stop]
+%D
+%D \startuseMPgraphic{step-1}
+%D fill fullcircle scaled 10cm withcolor red ;
+%D \stopuseMPgraphic
+%D
+%D \startuseMPgraphic{step-2}
+%D fill fullcircle scaled 5cm withcolor green ;
+%D \stopuseMPgraphic
+%D
+%D \setlayer[mp]{\property[one]{\useMPgraphic{step-1}}}
+%D \setlayer[mp]{\property[two]{\useMPgraphic{step-2}}}
+%D
+%D \ruledhbox{\flushlayer[mp]}
+%D \stoptyping
+%D
+%D Reusing graphics is also possible (now):
+%D
+%D \starttyping
+%D \startreusableMPgraphic{axis}
+%D tickstep := 1cm ; ticklength := 2mm ;
+%D drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
+%D tickstep := tickstep/2 ; ticklength := ticklength/2 ;
+%D drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
+%D \stopreusableMPgraphic
+%D
+%D \startuseMPgraphic{demo}
+%D drawpoint "1cm,1.5cm" ;
+%D \stopuseMPgraphic
+%D
+%D \definelayer[mp][preset=mp]
+%D \setlayer[mp]{\reuseMPgraphic{axis}}
+%D \setlayer[mp]{\useMPgraphic{demo}}
+%D \ruledhbox{\flushlayer[mp]}
+%D \stoptyping
+
+%D \macros
+%D {startstaticMPfigure,useMPstaticfigure}
+%D
+%D Static figures are processed only when there has been
+%D something changed. Here is Aditya Mahajan's testcase:
+%D
+%D \startbuffer
+%D \startstaticMPfigure{circle}
+%D fill fullcircle scaled 1cm withcolor blue;
+%D \stopstaticMPfigure
+%D
+%D \startstaticMPfigure{axis}
+%D drawarrow (0,0)--(2cm,0) ;
+%D drawarrow (0,0)--(0,2cm) ;
+%D label.llft(textext("(0,0)") ,origin) ;
+%D \stopstaticMPfigure
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\usestaticMPfigure[#1]%
+ {\dodoubleempty\externalfigure[\jobname-#1.pdf]}
+
+\def\startstaticMPfigure
+ {\begingroup
+ \obeyMPlines
+ \dostartstaticMPfigure}
+
+\def\dostartstaticMPfigure#1#2\stopstaticMPfigure
+ {\startstaticMPgraphic{\jobname-#1}#2\stopstaticMPgraphic
+ \endgroup}
+
+% faster, but more tricky
+%
+% \def\startstaticMPfigure
+% {\doifmodeelse{*\v!first}
+% {\begingroup
+% \obeyMPlines
+% \dostartstaticMPfigure}
+% {\gobbleuntil\stopstaticMPfigure}}
+%
+% \def\dostartstaticMPfigure#1#2\stopstaticMPfigure
+% {\startMPstaticgraphic{\jobname-#1}#2\stopMPstaticgraphic
+% % dirty trick, don't register, so no second main run of texexec:
+% \global\advance\nofMPgraphics \minusone
+% \endgroup}}
+
+%D New:
+
+% \appendtoks \closeMPgraphicfiles \to \everystoptext
+
+%D New:
+
+\newconditional\manyMPspecials % when set to true, > 1000 specials can be used
+
+\settrue \manyMPspecials % per 1/4/2006
+
+\prependtoks
+ _special_div_ := 1000\ifconditional\manyMPspecials0\fi ;
+\to \MPextensions
+
+%D Needed (will become default):
+
+\prependtoks
+ \resetlanguagespecifics
+\to \everyMPgraphic
+
+%D Goody for preventing overflows:
+
+\def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}
+
+%D Done.
+
+\protect \endinput
+
+%D Experimental:
+
+\appendtoks
+ \ifrunMPgraphics \ifcase\systemcommandmode \or
+ \runMPgraphicsfalse
+ \fi \fi
+\to \everyjob
+
+% also:
+%
+% linecap := rounded ;
+% linejoin := rounded ;
+% drawoptions () ;
diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv
new file mode 100644
index 000000000..61acbca32
--- /dev/null
+++ b/tex/context/base/meta-ini.mkiv
@@ -0,0 +1,1275 @@
+%D \module
+%D [ file=meta-ini,
+%D version=2008.03.25,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Initialization,
+%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}{MetaPost Graphics / Initializations}
+
+\unprotect
+
+%D Instead of sharing code with \MKII, I decided to copy
+%D the code. Otherwise maintainance becomes a pain and after all,
+%D the \MKII\ code will not change.
+
+\let \useMETAFUNformattrue\relax \let \useMETAFUNformatfalse\relax
+\let \longMPlinestrue\relax \let \longMPlinesfalse\relax
+\let \runMPgraphicstrue\relax \let \runMPgraphicsfalse\relax
+\let \runMPTEXgraphicstrue\relax \let \runMPTEXgraphicsfalse\relax
+\let \MPstaticgraphictrue\relax \let \MPstaticgraphicfalse\relax
+\let\forceMPTEXgraphictrue\relax \let\forceMPTEXgraphicfalse\relax
+
+\let \obeyMPlines\relax
+\let \forceMPTEXcheck\gobbleoneargument
+\let\maxnofMPgraphics\scratchcounter
+
+\newtoks \MPextensions % mp, once
+\newtoks \MPinitializations % tex, each
+\newtoks \MPuserinclusions % mp, user
+\newtoks \MPfinalizations % mp, user
+\newtoks \everyMPgraphic % mp
+\newtoks \everyMPTEXgraphic % tex
+
+\newif\ifMPrun
+\def\MPruntimefile{mprun}
+
+% The next command is, of course, dedicated to Mojca, who
+% needs it for gnuplot. Anyway, the whole multiple engine
+% mechanism is to keep her gnuplot from interfering.
+
+\def\startMPdefinitions
+ {\dosinglegroupempty\dostartMPdefinitions}
+
+\long\def\dostartMPdefinitions#1#2\stopMPdefinitions
+ {\edef\currentMPgraphicinstance{#1}%
+ \ifx\currentMPgraphicinstance\empty
+ \let\currentMPgraphicinstance\defaultMPgraphicinstance
+ \fi
+ \global\MPinstancetoks\expandafter{\the\MPinstancetoks#2}}
+
+\long\def\startMPextensions#1\stopMPextensions
+ {\global\MPextensions\expandafter{\the\MPextensions#1}}
+
+\long\def\startMPinitializations#1\stopMPinitializations
+ {\global\MPinitializations\expandafter{\the\MPinitializations#1}}
+
+\long\def\startMPinclusions
+ {\dosingleempty\dostartMPinclusions}
+
+\long\def\dostartMPinclusions[#1]#2\stopMPinclusions
+ {\doifnot{#1}{+}{\global\MPuserinclusions\emptytoks}%
+ \global\MPuserinclusions\expandafter{\the\MPuserinclusions#2}}
+
+\def\MPinclusions
+ {\dosingleempty\doMPinclusions}
+
+\long\def\doMPinclusions[#1]#2%
+ {\doifnot{#1}{+}{\global\MPuserinclusions\emptytoks}%
+ \global\MPuserinclusions\expandafter{\the\MPuserinclusions#2}}
+
+\def\presetMPdefinitions
+ {\edef\overlaywidth {\overlaywidth \space}%
+ \edef\overlayheight {\overlayheight \space}%
+ \edef\overlaylinewidth{\overlaylinewidth\space}%
+ \edef\currentwidth {\the\hsize \space}%
+ \edef\currentheight {\the\vsize \space}}
+
+\def\currentMPformat{metafun}
+
+\def\@@MPF{@MPF@}
+
+\def\MPinstancetoks{\csname\@@MPF::\currentMPgraphicinstance\endcsname}
+
+\unexpanded\def\defineMPinstance
+ {\dodoubleargument\dodefineMPinstance}
+
+\def\dodefineMPinstance[#1][#2]%
+ {\ifcsname\@@MPF::#1\endcsname\else\expandafter\newtoks\csname\@@MPF::#1\endcsname\fi
+ \MPinstancetoks\emptytoks % in case we redefine
+ \getparameters[\@@MPF#1][\s!format=mpost,\s!extensions=\v!no,\s!initializations=\v!no,#2]}
+
+\def\resetMPinstance[#1]%
+ {\writestatus\m!metapost{reset will be implemented when needed}}
+
+\def\defaultMPgraphicinstance{metafun}
+
+\def\splitMPgraphicname[#1]%
+ {\dosplitMPgraphicname[#1::::]}
+
+\def\dosplitMPgraphicname[#1::#2::#3]% instance ::
+ {\edef\currentMPgraphicname{#2}%
+ \ifx\currentMPgraphicname\empty
+ \edef\currentMPgraphicname{#1}%
+ \let\currentMPgraphicinstance\defaultMPgraphicinstance
+ \else
+ \edef\currentMPgraphicinstance{#1}%
+ \fi
+ \edef\currentMPgraphicformat
+ {\ifcsname\@@MPF\currentMPgraphicinstance\s!format\endcsname
+ \csname\@@MPF\currentMPgraphicinstance\s!format\endcsname
+ \else
+ \defaultMPgraphicinstance
+ \fi}}
+
+\def\currentMPgraphicinstance{\defaultMPgraphicinstance}
+\def\currentMPgraphicformat {\currentMPgraphicinstance}
+
+\defineMPinstance[metafun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[extrafun][\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[mprun] [\s!format=metafun,\s!extensions=\v!yes,\s!initializations=\v!yes]
+\defineMPinstance[metapost][\s!format=mpost]
+\defineMPinstance[nofun] [\s!format=mpost]
+
+\def\beginMPgraphicgroup#1%
+ {\begingroup
+ \splitMPgraphicname[#1]}
+
+\def\endMPgraphicgroup
+ {\endgroup}
+
+\newconditional \METAFUNinitialized
+
+\def\MPaskedfigure{false}
+
+\def\currentMPinitializations
+ {\ifconditional\includeMPinitializations\the\MPinitializations;\fi\theMPrandomseed;}
+
+\def\currentMPpreamble
+ {\ifconditional\includeMPextensions\the\MPextensions;\the\MPuserinclusions;\fi\the\MPinstancetoks;}
+
+\def\dostartcurrentMPgraphic
+ {\begingroup
+ \enableincludeMPgraphics
+ \the\everyMPgraphic
+ \presetMPdefinitions
+ \setMPrandomseed % this has to change
+ % we need to preexpand the token lists
+ \doifelsevalue{\@@MPF\currentMPgraphicinstance\s!extensions}\v!yes
+ {\settrue \includeMPextensions\letgvalue{\@@MPF\currentMPgraphicinstance\s!extensions}\v!no}
+ {\setfalse\includeMPextensions}%
+ \doifelsevalue{\@@MPF\currentMPgraphicinstance\s!initializations}\v!yes
+ {\settrue \includeMPinitializations}%
+ {\setfalse\includeMPinitializations}}
+
+\def\dostopcurrentMPgraphic
+ {\global\MPinstancetoks\emptytoks
+ \global\settrue\METAFUNinitialized % becomes obsolete
+ \endgroup}
+
+\unexpanded\long\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig
+ {\dostartcurrentMPgraphic
+ \forgetall
+ \setbox\MPgraphicbox\hbox\bgroup
+ \normalexpanded{\noexpand\ctxlua{metapost.graphic(
+ "\currentMPgraphicinstance",
+ "\currentMPgraphicformat",
+ \!!bs#1\!!es,
+ \!!bs\currentMPinitializations\!!es,
+ \!!bs\currentMPpreamble\!!es,
+ \MPaskedfigure
+ )}}%
+ \egroup
+ \placeMPgraphic
+ \dostopcurrentMPgraphic}
+
+\newif\ifsetMPrandomseed \setMPrandomseedtrue % false by default
+
+\def\setMPrandomseed
+ {\let\theMPrandomseed\empty
+ \ifsetMPrandomseed \ifx\getrandomnumber\undefined \else
+ \getrandomnumber\localMPseed\zerocount{4095}%
+ \def\theMPrandomseed{randomseed:=\localMPseed}%
+ \fi\fi}
+
+%D To be integrated
+
+\def\@@MPG{@MPG@}
+
+\def\doifMPgraphicelse#1%
+ {\ifcsname\@@MPG#1\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi}
+
+\def\includeMPgraphic#1%
+ {\executeifdefined{\@@MPG#1};} % ; if not found
+
+\def\enableincludeMPgraphics
+ {\let\handleuseMPgraphic \thirdofthreearguments
+ \let\handlereusableMPgraphic\thirdofthreearguments}
+
+\let\MPdrawingdata\empty
+
+\newif\ifMPdrawingdone \MPdrawingdonefalse
+
+\def\resetMPdrawing
+ {\globallet\MPdrawingdata\empty
+ \global\MPdrawingdonefalse}
+
+\def\pushMPdrawing
+ {\globalpushmacro\MPdrawingdata
+ \globallet\MPdrawingdata\empty}
+
+\def\popMPdrawing
+ {\globalpopmacro\MPdrawingdata}
+
+\def\getMPdrawing{\dosinglegroupempty\dogetMPdrawing}
+
+\def\startMPdrawing
+ {\dosingleempty\dostartMPdrawing}
+
+\long\def\dostartMPdrawing[#1]#2\stopMPdrawing
+ {\relax
+ \bgroup
+ \enableincludeMPgraphics
+ \presetMPdefinitions % in case #2 has measures
+ \doifelse{#1}{-}{\convertargument#2\to\asciia}{\long\def\asciia{#2}}%
+ \long\xdef\MPdrawingdata{\MPdrawingdata\asciia}%
+ \egroup}
+
+\let\stopMPdrawing\relax
+
+\let\MPdrawingdata\empty
+
+\newif\ifMPshiftdrawing \MPshiftdrawingfalse
+
+\def\resetMPdrawing
+ {\globallet\MPdrawingdata\empty
+ \global\MPdrawingdonefalse}
+
+\def\pushMPdrawing
+ {\globalpushmacro\MPdrawingdata
+ \globallet\MPdrawingdata\empty}
+
+\def\popMPdrawing
+ {\globalpopmacro\MPdrawingdata}
+
+\def\getMPdrawing
+ {\ifMPdrawingdone
+ \expandafter\processMPgraphic\expandafter{\MPdrawingdata}% is this expansion still needed?
+ \fi}
+
+\def\startMPdrawing
+ {\dosingleempty\dostartMPdrawing}
+
+\long\def\dostartMPdrawing[#1]#2\stopMPdrawing
+ {\relax
+ \bgroup
+ \enableincludeMPgraphics
+ \presetMPdefinitions % in case #2 has measures
+ \doifelse{#1}{-}{\convertargument#2\to\asciia}{\long\def\asciia{#2}}%
+ \long\xdef\MPdrawingdata{\MPdrawingdata\asciia}%
+ \egroup}
+
+\let\stopMPdrawing\relax
+
+\let\stopMPclip\relax
+
+\long\def\startMPclip#1#2\stopMPclip % todo: store at the lua end or just store less
+ {\long\setgvalue{MPC:#1}{#2}}
+
+\def\grabMPclippath#1#2#3#4#5% #5 is alternative
+ {\begingroup
+ \edef\width {#3\space}\let\overlaywidth \width
+ \edef\height{#4\space}\let\overlayheight\height
+ \ifcsname MPC:#1\endcsname
+ \dostartcurrentMPgraphic
+ \xdef\MPclippath{\normalexpanded{\noexpand\ctxlua{metapost.theclippath(
+ "\currentMPgraphicinstance",
+ "\currentMPgraphicformat",
+ \!!bs\getvalue{MPC:#1}\!!es,
+ \!!bs\currentMPinitializations\!!es,
+ \!!bs\currentMPpreamble\!!es
+ )}}}%
+ \dostopcurrentMPgraphic
+ \ifx\MPclippath\empty\xdef\MPclippath{#5}\fi
+ \else
+ \xdef\MPclippath{#5}%
+ \fi
+ % #2 : method is obsolete, only pdf now, we can always
+ % gsub the result to ps
+ \endgroup}
+
+%D Next we will use these support macros.
+
+\startMPextensions
+ if unknown context_tool: input mp-tool; fi;
+ if unknown context_spec: input mp-spec; fi;
+ if unknown context_grph: input mp-grph; fi;
+\stopMPextensions
+
+%D Since we want lables to follow the document settings, we
+%D also set the font related variables.
+
+\startMPinitializations % scale is not yet ok
+ defaultfont:="\truefontname{Regular}";
+ defaultscale:=\the\bodyfontsize/10pt;
+\stopMPinitializations
+
+% watch out, this is a type1 font because mp can only handle 8 bit fonts
+
+\startMPinitializations % scale is not yet ok
+ defaultfont:="rm-lmtt10";
+\stopMPinitializations
+
+%D A signal that we're in combines \CONTEXT||\METAFUN mode:
+
+\startMPextensions
+ string contextversion;
+ contextversion:="\contextversion";
+\stopMPextensions
+
+%D Some safeguards:
+%D
+%D \starttyping
+%D \appendtoks \cleanupfeatures \to \everyMPgraphic
+%D \stoptyping
+%D
+%D No, we don't want that (else we loose UTF etc).
+
+%D Another one:
+
+\prependtoks \MPstaticgraphictrue \to \everyoverlay
+\prependtoks \MPstaticgraphictrue \to \everypagebody
+
+%D \macros
+%D {setupMPvariables}
+%D
+%D When we build collections of \METAPOST\ graphics, like
+%D background and buttons, the need for passing settings
+%D arises. By (mis|)|using the local prefix that belongs to
+%D \type {\framed}, we get a rather natural interface to
+%D backgrounds. To prevent conflicts, we will use the \type
+%D {-} in \METAPOST\ specific variables, like:
+%D
+%D \starttyping
+%D \setupMPvariables[meta:button][size=20pt]
+%D \stoptyping
+
+\def\@@meta{meta:}
+
+\unexpanded\def\setupMPvariables
+ {\dodoubleempty\dosetupMPvariables}
+
+\def\dosetupMPvariables[#1][#2]%
+ {\ifsecondargument
+ \getrawparameters[#1:][#2]% brr, todo: [\@@meta#1:]
+ \else
+ \getrawparameters[\@@meta][#1]%
+ \fi}
+
+\let\@@framed\s!unknown
+
+\def\MPvariable#1%
+ {\csname
+ \ifcsname\@@framed\@@meta#1\endcsname\@@framed\fi\@@meta#1%
+ \endcsname}
+
+\let\MPvar\MPvariable
+
+\let\setMPvariables\setupMPvariables
+
+\def\MPrawvar#1#2{\csname#1:#2\endcsname}
+
+\def\presetMPvariable
+ {\dodoubleargument\dopresetMPvariable}
+
+\def\dopresetMPvariable[#1][#2=#3]%
+ {\ifcsname#1:#2\endcsname\else\setvalue{#1:#2}{#3}\fi}
+
+\def\useMPvariables
+ {\dodoubleargument\douseMPvariables}
+
+\def\douseMPvariables[#1][#2]%
+ {\def\@@meta{#1:}%
+ \prepareMPvariables{#2}}
+
+%D \macros
+%D {startuniqueMPgraphic, uniqueMPgraphic}
+%D
+%D This macros is probably of most use to myself, since I like
+%D to use graphics that adapt themselves. The next \METAPOST\
+%D kind of graphic is both unique and reused when possible.
+%D
+%D \starttyping
+%D \defineoverlay[example][\uniqueMPgraphic{test}]
+%D
+%D \startuniqueMPgraphic {test}
+%D draw unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D \stopuniqueMPgraphic
+%D \stoptyping
+
+\def\overlaystamp % watch the \MPcolor, since colors can be redefined
+ {\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
+
+%D A better approach is to let additional variables play a role
+%D in determining the uniqueness. In the next macro, the
+%D second, optional, argument is used to guarantee the
+%D uniqueness, as well as prepare variables for passing them to
+%D \METAPOST.
+%D
+%D \starttyping
+%D \startuniqueMPgraphic{meta:hash}{gap,angle,...}
+%D \stoptyping
+%D
+%D The calling macro also accepts a second argument. For
+%D convenient use in overlay definitions, we use \type {{}}
+%D instead of \type {[]}.
+%D
+%D \starttyping
+%D \uniqueMPgraphic{meta:hash}{gap=10pt,angle=30}
+%D \stoptyping
+
+\newcount\MPobjectcounter
+\newbox \MPgraphicbox
+
+\chardef\MPboxmode\zerocount
+
+\def\doobeyMPboxdepth % mode = 1
+ {\setbox\MPgraphicbox\hbox{\hskip\MPllx\onebasepoint\raise\MPlly\onebasepoint\box\MPgraphicbox}}
+
+\def\doignoreMPboxdepth % mode = 2
+ {\normalexpanded
+ {\noexpand\doobeyMPboxdepth
+ \wd\MPgraphicbox\the\wd\MPgraphicbox
+ \ht\MPgraphicbox\the\ht\MPgraphicbox
+ \dp\MPgraphicbox\the\dp\MPgraphicbox}}
+
+\def\obeyMPboxdepth {\chardef\MPboxmode\plusone}
+\def\ignoreMPboxdepth{\chardef\MPboxmode\plustwo}
+\def\normalMPboxdepth{\chardef\MPboxmode\zerocount}
+
+% compatibility hack:
+
+\let\MPshiftdrawingtrue \ignoreMPboxdepth
+\let\MPshiftdrawingfalse\normalMPboxdepth
+
+\unexpanded\def\placeMPgraphic
+ {\ifcase\MPboxmode
+ \or % 1
+ \doobeyMPboxdepth
+ \or % 2
+ \doignoreMPboxdepth
+ \fi
+ \box\MPgraphicbox}
+
+\def\reuseMPbox#1#2#3#4#5% space delimiting would save some tokens
+ {\xdef\MPllx{#2}% but it's not worth the effort and looks
+ \xdef\MPlly{#3}% ugly as well
+ \xdef\MPurx{#4}%
+ \xdef\MPury{#5}%
+ \hbox{\forcecolorhack\getobject{MP}{#1}}} % else no proper color intent
+
+\long\def\handleuniqueMPgraphic#1#2#3%
+ {\begingroup
+ \def\@@meta{#1:}%
+ \extendMPoverlaystamp{#2}% incl prepare
+ \ifcsname\@@MPG\overlaystamp:#1\endcsname\else
+ \enableincludeMPgraphics % redundant
+ \global\advance\MPobjectcounter\plusone
+ \setobject{MP}{\number\MPobjectcounter}\hbox{\processMPgraphic{#3}}% was vbox, graphic must end up as hbox
+ \setxvalue{\@@MPG\overlaystamp:#1}{\noexpand\reuseMPbox{\number\MPobjectcounter}{\MPllx}{\MPlly}{\MPurx}{\MPury}}%
+ \fi
+ \getvalue{\@@MPG\overlaystamp:#1}%
+ \endgroup}
+
+\long\unexpanded\def\startuniqueMPgraphic
+ {\dodoublegroupempty\dostartuniqueMPgraphic}
+
+\long\def\dostartuniqueMPgraphic#1#2#3\stopuniqueMPgraphic%
+ {\long\setgvalue{\@@MPG#1}{\handleuniqueMPgraphic{#1}{#2}{#3}}}
+
+\unexpanded\def\uniqueMPgraphic
+ {\dodoublegroupempty\douniqueMPgraphic}
+
+\def\douniqueMPgraphic#1#2%
+ {\beginMPgraphicgroup{#1}%
+ \setupMPvariables[\currentMPgraphicname][#2]%
+ \getvalue{\@@MPG\currentMPgraphicname}\empty
+ \endMPgraphicgroup}
+
+\let\stopuniqueMPcode \relax % so that we can use it in \expanded
+
+\long\def\handleuseMPgraphic#1#2#3%
+ {\begingroup
+ \def\@@meta{#1:}%
+ \prepareMPvariables{#2}%
+ \enableincludeMPgraphics % redundant
+ \processMPgraphic{#3}%
+ \endgroup}
+
+\long\unexpanded\def\startuseMPgraphic
+ {\dodoublegroupempty\dostartuseMPgraphic}
+
+\long\def\dostartuseMPgraphic#1#2#3\stopuseMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}}
+
+\long\unexpanded\def\startusableMPgraphic % redundant but handy
+ {\dodoublegroupempty\dostartusableMPgraphic}
+
+\long\def\dostartusableMPgraphic#1#2#3\stopusableMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}}
+
+\let\stopuseMPgraphic \relax % so that we can use it in \expanded
+\let\stopusableMPgraphic \relax % so that we can use it in \expanded
+
+\long\def\handlereusableMPgraphic#1#2#3%
+ {\begingroup
+ \def\@@meta{#1:}%
+ \prepareMPvariables{#2}%
+ \enableincludeMPgraphics % redundant
+ \global\advance\MPobjectcounter\plusone
+ \setobject{MP}{\number\MPobjectcounter}\hbox{\processMPgraphic{#3}}% was vbox, graphic must end up as hbox
+ \setxvalue{\@@MPG#1}{\noexpand\reuseMPbox{\number\MPobjectcounter}{\MPllx}{\MPlly}{\MPurx}{\MPury}}%
+ \getvalue{\@@MPG#1}%
+ \endgroup}
+
+\long\unexpanded\def\startreusableMPgraphic
+ {\dodoublegroupempty\dostartreusableMPgraphic}
+
+\long\def\dostartreusableMPgraphic#1#2#3\stopreusableMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}{#3}}}
+
+\let\stopreusableMPgraphic \relax % so that we can use it in \expanded
+
+\unexpanded\def\useMPgraphic
+ {\dodoublegroupempty\douseMPgraphic}
+
+\def\douseMPgraphic#1#2%
+ {\beginMPgraphicgroup{#1}%
+ \doifsomething{#2}{\setupMPvariables[\currentMPgraphicname][#2]}%
+ \getvalue{\@@MPG\currentMPgraphicname}\empty
+ \endMPgraphicgroup}
+
+\let\reuseMPgraphic \useMPgraphic % we can save a setup here if needed
+\let\reusableMPgraphic\reuseMPgraphic % we can save a setup here if needed
+
+\let\stopuseMPcode \relax % so that we can use it in \expanded
+\let\stopusableMPcode \relax % so that we can use it in \expanded
+\let\stopreusableMPcode \relax % so that we can use it in \expanded
+\let\stopuniqueMPcode \relax % so that we can use it in \expanded
+
+\def\enableincludeMPgraphics
+ {\let\handleuseMPgraphic \thirdofthreearguments
+ \let\handlereusableMPgraphic\thirdofthreearguments}
+
+%D \macros
+%D {startuniqueMPpagegraphic,uniqueMPpagegraphic}
+%D
+%D Experimental.
+
+\def\MPpageprefix{\doifoddpageelse oe:}
+
+\def\overlaypagestamp
+ {\MPpageprefix\overlaywidth:\overlayheight:\overlaydepth:\MPcolor\overlaycolor:\MPcolor\overlaylinecolor}
+
+\long\unexpanded\def\startuniqueMPpagegraphic
+ {\dodoublegroupempty\dostartuniqueMPpagegraphic}
+
+\long\def\dostartuniqueMPpagegraphic#1#2#3\stopuniqueMPpagegraphic
+ {\long\setgvalue{\@@MPG o:#1}{\handleuniqueMPgraphic{o:#1}{#2}{#3}}%
+ \long\setgvalue{\@@MPG e:#1}{\handleuniqueMPgraphic{e:#1}{#2}{#3}}}
+
+\unexpanded\def\uniqueMPpagegraphic
+ {\dodoublegroupempty\douniqueMPpagegraphic}
+
+\def\douniqueMPpagegraphic#1#2%
+ {\beginMPgraphicgroup{#1}%
+ \let\overlaystamp\overlaypagestamp
+ \setupMPvariables[\MPpageprefix\currentMPgraphicname][#2]% prefix is new here
+ \getvalue{\@@MPG\MPpageprefix\currentMPgraphicname}{}%
+ \endMPgraphicgroup}
+
+%D One way of defining a stamp is:
+%D
+%D \starttyping
+%D \def\extendMPoverlaystamp#1%
+%D {\def\docommand##1%
+%D {\edef\overlaystamp{\overlaystamp:\MPvariable{##1}}}%
+%D \processcommalist[#1]\docommand}
+%D \stoptyping
+
+%D Since we need to feed \METAPOST\ with expanded dimensions,
+%D we introduce a dedicated expansion engine.
+
+\def\prepareMPvariable#1%
+ {\ifcsname\@@framed\@@meta#1\endcsname
+ \doprepareMPvariable{\@@framed\@@meta#1}%
+ \else
+ \doprepareMPvariable{\@@meta#1}%
+ \fi}
+
+% \startlines
+% \def\xxx{\lineheight} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{2pt} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{2} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{\scratchcounter} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{red} \doprepareMPvariable{xxx} \xxx
+% \def\xxx{0.4} \doprepareMPvariable{xxx} \xxx
+% \stoplines
+
+\def\doprepareMPvariable#1%
+ {\edef\theMPvariable{\getvalue{#1}}%
+ \doifelsenothing\theMPvariable
+ {\setevalue{#1}{\MPcolor{black}}}
+ {\defconvertedcommand\ascii\theMPvariable % otherwise problems
+ \doifcolorelse \ascii % with 2\bodyfontsize
+ {\setevalue{#1}{\MPcolor\theMPvariable}}
+ {% can be aux macro
+ \setbox\scratchbox\hbox{\scratchdimen\theMPvariable sp}%
+ \ifdim\wd\scratchbox=\zeropoint
+ % \scratchcounter\theMPvariable
+ % \setevalue{#1}{\the\scratchcounter}%
+ % also accepts 0.number :
+ \setevalue{#1}{\number\theMPvariable}%
+ \else
+ \scratchdimen\theMPvariable
+ \setevalue{#1}{\the\scratchdimen}%
+ \fi}}}
+
+%D We redefine \type {\extendMPoverlaystamp} to preprocess
+%D variables using \type {\prepareMPvariable}.
+
+\def\doextendMPoverlaystamp#1%
+ {\prepareMPvariable{#1}%
+ \edef\overlaystamp{\overlaystamp:\MPvariable{#1}}}
+
+\def\extendMPoverlaystamp#1%
+ {\processcommalist[#1]\doextendMPoverlaystamp}
+
+\def\prepareMPvariables#1%
+ {\processcommalist[#1]\prepareMPvariable}
+
+%D \macros
+%D {MPdatafile}
+%D
+%D We redefine a macro from \type {supp-mps.tex}:
+
+\def\MPdataMPDfile{\jobname-mpgraph.mpd}
+\def\MPdataMPOfile{\jobname-mpgraph.mpo}
+\def\MPdataMPYfile{\jobname-mpgraph.mpy}
+
+\startMPextensions
+ boolean collapse_data; collapse_data:=true;
+ def data_mpd_file = "\MPdataMPDfile" enddef ;
+ def data_mpo_file = "\MPdataMPOfile" enddef ;
+ def data_mpy_file = "\MPdataMPYfile" enddef ;
+\stopMPextensions
+
+\chardef\currentMPgraphic\plusone
+
+\def\getMPdata
+ {\let\MPdata\secondoftwoarguments
+ \startreadingfile
+ % \startnointerference % no, else we need to do all data global
+ \readlocfile\MPdataMPDfile\donothing\donothing
+ % \stopnointerference
+ \stopreadingfile}
+
+%D \macros
+%D {MPrunfile}
+%D
+%D This one is more abstract and does not assume knowledge
+%D of buffer prefixes.
+
+\def\MPrunfile#1%
+ {\bufferprefix mprun.#1}
+
+%D For the moment, the next one is a private macro:
+
+\def\processMPbuffer
+ {\dosingleempty\doprocessMPbuffer}
+
+\def\doprocessMPbuffer[#1]%
+ {\doifelsenothing{#1}
+ {\dodoprocessMPbuffer{\jobname}}
+ {\dodoprocessMPbuffer{#1}}}
+
+% we need to go via a toks because we have no multiline print in
+% luatex (i.e. tex.sprint does not interpret lines) and therefore
+% omits all after a comment token
+
+\newtoks\mpbuffertoks
+
+\def\doprocessMPbuffer[#1]%
+ {\doifelsenothing{#1}
+ {\doprocessMPbuffer[\jobname]}
+ {\beginMPgraphicgroup{#1}%
+ % we need this trick because tex.sprint does not interprets newlines and the scanner
+ % stops at a newline; also, we do need to flush the buffer under a normal catcode
+ % regime in order to expand embedded tex macros; #1 can be a list
+ \processMPgraphic{\ctxlua{buffers.feedback("\currentMPgraphicname")}}%
+ \endMPgraphicgroup}}
+
+\def\runMPbuffer
+ {\dosingleempty\dorunMPbuffer}
+
+\def\dorunMPbuffer[#1]% processing only
+ {\startnointerference\doprocessMPbuffer[#1]\stopnointerference}
+
+%D \macros
+%D {startMPenvironment, resetMPenvironment}
+%D
+%D In order to synchronize the main \TEX\ run and the runs
+%D local to \METAPOST, environments can be passed.
+
+\ifx\everyMPTEXgraphic\undefined
+ \newtoks\everyMPTEXgraphic
+\fi
+
+%D A more general way of passing environments is:
+
+\def\startMPenvironment % second arg gobbles spaces, so that reset gives \emptytoks
+ {\dodoubleempty\dostartMPenvironment}
+
+\long\def\dostartMPenvironment[#1][#2]#3\stopMPenvironment
+ {\doif{#1}\s!reset\resetMPenvironment % reset mp toks
+ \doif{#1}\v!global{#3}% % use in main doc too
+ \doif{#1}+{#3}% % use in main doc too
+ \ctxlua{metapost.tex.set(\!!bs\detokenize{#3}\!!es)}}
+
+\def\resetMPenvironment
+ {\ctxlua{metapost.tex.reset()}}
+
+\resetMPenvironment
+
+\def\useMPenvironmentbuffer[#1]%
+ {\ctxlua{metapost.tex.set(buffers.content("#1"))}}
+
+%D This command takes \type {[reset]} as optional
+%D argument.
+%D
+%D \starttyping
+%D \startMPenvironment
+%D \setupbodyfont[pos,14.4pt]
+%D \stopMPenvironment
+%D
+%D \startMPcode
+%D draw btex \sl Hans Hagen etex scaled 5 ;
+%D \stopMPcode
+%D \stoptyping
+%D
+%D The most simple case:
+
+\def\startMPcode{\dosinglegroupempty\dostartMPcode}
+
+\def\dostartMPcode
+ {\iffirstargument
+ \expandafter\dodostartMPcode
+ \else
+ \expandafter\nodostartMPcode
+ \fi}
+
+\def\dodostartMPcode#1#2\stopMPcode
+ {\beginMPgraphicgroup{#1::\s!dummy}% name does not matter
+ \processMPgraphic{#2}%
+ \endMPgraphicgroup}
+
+\def\nodostartMPcode#1#2\stopMPcode
+ {\processMPgraphic{#2}}
+
+\let\stopMPcode\relax
+
+% a bit nasty (also needed for compatibility:
+
+% \startMPrun input mp-www.mp ; \stopMPrun
+% \externalfigure[mprun.3][width=10cm,height=8cm]
+
+% \startMPrun{mprun} input mp-www.mp ; \stopMPrun % instance
+% \externalfigure[mprun.4][width=10cm,height=8cm]
+
+\let\MPruninstance\defaultMPgraphicinstance
+
+\def\useMPrun#1#2% name n
+ {\begingroup
+ \def\MPaskedfigure{#2}%
+ \doifelsenothing{#1}
+ {\useMPgraphic{mprun}}%
+ {\useMPgraphic{#1}}%
+ \endgroup}
+
+\def\startMPrun
+ {\dosinglegroupempty\dostartMPrun}
+
+\long\def\dostartMPrun#1#2\stopMPrun
+ {\iffirstargument
+ \startuseMPgraphic{#1}#2\stopuseMPgraphic
+ \else
+ \startuseMPgraphic{mprun}#2\stopuseMPgraphic
+ \fi}
+
+% for old time sake
+
+\def\dostartMPgraphic
+ {\iffirstargument
+ \expandafter\dodostartMPgraphic
+ \else
+ \expandafter\nodostartMPgraphic
+ \fi}
+
+\def\dodostartMPgraphic#1#2\stopMPgraphic
+ {\beginMPgraphicgroup{#1::\s!dummy}% name does not matter
+ \processMPgraphic{#2}%
+ \endMPgraphicgroup}
+
+\def\nodostartMPgraphic#1#2\stopMPcode
+ {\processMPgraphic{#2}}
+
+\let\stopMPcode\relax
+
+%D The \type {\resetMPenvironment} is a quick way to erase
+%D the token list.
+%D
+%D You should be aware of independencies. For instance, if you use a font
+%D in a graphic that is not used in the main document, you need to load the
+%D typescript at the outer level (either directly or by using the global
+%D option).
+%D
+%D \starttyping
+%D \usetypescript[palatino][texnansi]
+%D
+%D \startMPenvironment
+%D \usetypescript[palatino][texnansi]
+%D \enableregime[utf]
+%D \setupbodyfont[palatino]
+%D \stopMPenvironment
+%D
+%D \startMPpage
+%D draw btex aap‒noot coördinatie – één etex ;
+%D \stopMPpage
+%D \stoptyping
+
+%D Loading specific \METAPOST\ related definitions is
+%D accomplished by:
+
+\def\douseMPlibrary#1%
+ {\ifcsname\c!file\f!metapostprefix#1\endcsname\else
+ \letvalueempty{\c!file\f!metapostprefix#1}%
+ \makeshortfilename[\truefilename{\f!metapostprefix#1}]%
+ \startreadingfile
+ \readsysfile\shortfilename{\showmessage\m!metapost1{#1}}\donothing
+ \stopreadingfile
+ \fi}
+
+\def\useMPlibrary[#1]%
+ {\processcommalist[#1]\douseMPlibrary}
+
+%D \macros
+%D {setMPtext, MPtext, MPstring, MPbetex}
+%D
+%D To be documented:
+%D
+%D \starttyping
+%D \setMPtext{identifier}{text}
+%D
+%D \MPtext {identifier}
+%D \MPstring{identifier}
+%D \MPbetex {identifier}
+%D \stoptyping
+
+\def\@@MPT{@MPT@}
+
+\def\forceMPTEXgraphic
+ {\long\def\checkMPTEXgraphic##1{\global\MPTEXgraphictrue}}
+
+\def\setMPtext#1#2% todo : #1 must be made : safe
+ {%\forceMPTEXgraphic
+ \defconvertedargument\ascii{#2}%
+ \dodoglobal\letvalue{\@@MPT#1}\ascii}
+
+\def\MPtext #1{\executeifdefined{\@@MPT#1}\empty}
+\def\MPstring #1{"\executeifdefined{\@@MPT#1}\empty"}
+\def\MPbetex #1{btex \executeifdefined{\@@MPT#1}\empty\space etex}
+
+%D Unfortunately \METAPOST\ does not have \CMYK\ support
+%D built in, but by means of specials we can supply the
+%D information needed to handle them naturaly.
+
+% \newif\ifMPcmykcolors \MPcmykcolorstrue
+% \newif\ifMPspotcolors \MPspotcolorstrue
+
+\startMPinitializations
+ cmykcolors:=\ifMPcmykcolors true\else false\fi;
+ spotcolors:=\ifMPspotcolors true\else false\fi;
+\stopMPinitializations
+
+%D In order to communicate conveniently with the \TEX\
+%D engine, we introduce some typesetting variables.
+
+\startMPextensions
+ color OverlayColor,OverlayLineColor;
+\stopMPextensions
+
+\startMPinitializations
+ OverlayWidth:=\overlaywidth;
+ OverlayHeight:=\overlayheight;
+ OverlayDepth:=\overlayheight;
+ OverlayColor:=\MPcolor{\overlaycolor};
+ OverlayLineWidth:=\overlaylinewidth;
+ OverlayLineColor:=\MPcolor{\overlaylinecolor};
+ %
+ BaseLineSkip:=\the\baselineskip;
+ LineHeight:=\the\baselineskip;
+ BodyFontSize:=\the\bodyfontsize;
+ %
+ TopSkip:=\the\topskip;
+ StrutHeight:=\strutheight;
+ StrutDepth:=\strutdepth;
+ %
+ CurrentWidth:=\the\hsize;
+ CurrentHeight:=\the\vsize;
+ %
+ EmWidth:=\the\emwidth;
+ ExHeight:=\the\exheight;
+ %
+ PageNumber:=\the\pageno;
+ RealPageNumber:=\the\realpageno;
+ LastPageNumber:= \lastpage;
+\stopMPinitializations
+
+\appendtoks
+ \disablediscretionaries
+ \disablecompoundcharacters
+\to \everyMPgraphic
+
+\appendtoks % before color
+ %\normalexpanded{\noexpand\definecolor[currentcolor][\currentcolorname]}%
+ \doregistercolor{currentcolor}\currentcolorname
+\to \everyMPgraphic
+
+% \color[green]{abc \startMPcode
+% fill fullcircle scaled 3cm withoutcolor;
+% fill fullcircle scaled 2cm withcolor \MPcolor{currentcolor} ;
+% fill fullcircle scaled 1cm withcolor \MPcolor{red} ;
+% \stopMPcode def}
+
+% \appendtoks
+% \doactivatecolor\s!black\forcecolorhack % we can also move this to the backend
+% \to \everyMPgraphic
+
+\appendtoks
+ \baselineskip1\baselineskip
+ \lineheight 1\lineheight
+ \topskip 1\topskip
+\to \everyMPgraphic
+
+\appendtoks
+ \let \# \letterhash
+ \let \_ \letterunderscore
+ \let \& \letterampersand
+ \let \{ \letteropenbrace
+ \let \} \letterclosebrace
+\to \everyMPgraphic
+
+\startMPinitializations
+ prologues:=0;
+ mpprocset:=1;
+\stopMPinitializations
+
+%D \macros
+%D {PDFMPformoffset}
+%D
+%D In \PDF, forms are clipped and therefore we have to take
+%D precautions to get this right. Since this is related to
+%D objects, we use the same offset as used there.
+
+\def\PDFMPformoffset{\objectoffset}
+
+% %D \macros
+% %D {insertMPfile}
+% %D
+% %D Bypassing the special driver and figure mechanism is not
+% %D that nice but saves upto 5\% time in embedding \METAPOST\
+% %D graphics by using the low level \PDF\ converter directly,
+% %D given of course that we use \PDFTEX. As a result we need to
+% %D fool around with the object trigger.
+
+\newtoks\everyinsertMPfile
+
+% removed in backend:
+%
+% \def\doinsertMPfile#1%
+% {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}}
+%
+% \let\insertMPfileARG\insertMPfile
+%
+% \def\insertMPfile#1#2% in context #2 is empty
+% {\doifelsenothing{#2}{\doinsertMPfile{#1}}{\insertMPfileARG{#1}{#2}}}
+%
+% \def\includeMPasEPS#1% untested !!
+% {\bgroup
+% \message{[MP as EPS #1]}%
+% \the\everyinsertMPfile
+% \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
+% \setbox\scratchbox\vbox to \!!heightb
+% {\vfill
+% \let \@@DriverImageType \c!mps
+% \def \@@DriverImageFile {#1}%
+% \edef\@@DriverImageWidth {\the\!!widthb }%
+% \edef\@@DriverImageHeight{\the\!!heightb}%
+% \doinsertfile}%
+% \wd\scratchbox\!!widthb
+% \dp\scratchbox\zeropoint
+% \box\scratchbox
+% \egroup}
+%
+% \def\includeMPasPDF#1%
+% {\bgroup
+% \the\everyinsertMPfile
+% \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed
+% \convertMPtoPDF{#1}{1}{1}% no \plusone !
+% \egroup}
+%
+% %D So, using a low level approach (thereby avoiding the slower
+% %D figure analysis macros) pays off. This kind of
+% %D optimizations are a bit tricky since we must make sure that
+% %D special resources end up in the (PDF) files. Because the
+% %D \METAPOST\ to \PDF\ can handle objects itself, it is not
+% %D that complicated.
+%
+% %D We hook a couple of initializations into the graphic
+% %D macros.
+%
+% \appendtoks
+% \let\figuretypes\c!mps
+% \runutilityfilefalse
+% \consultutilityfilefalse
+% \to \everyinsertMPfile
+%
+% %D One more: (still needed?)
+
+\startMPextensions
+ def initialize_form_numbers =
+ do_initialize_numbers;
+ enddef;
+\stopMPextensions
+
+\startMPinitializations
+ HSize:=\the\hsize ;
+ VSize:=\the\vsize ;
+\stopMPinitializations
+
+\startMPextensions
+ vardef ForegroundBox =
+ unitsquare xysized(HSize,VSize)
+ enddef ;
+ vardef PageFraction =
+ if \lastpage>1: (\realfolio-1)/(\lastpage-1) else: 1 fi
+ enddef ;
+\stopMPextensions
+
+%D And some more. These are not really needed since we
+%D don't use the normal figure inclusion macros any longer.
+
+\appendtoks
+ \externalfigurepostprocessors\emptytoks % safeguard
+\to \everyinsertMPfile
+
+%D We also take care of disabling fancy figure features, that
+%D can terribly interfere when dealing with symbols,
+%D background graphics and running (postponed) graphics.
+%D You won't believe me if I tell you what funny side effects
+%D can occur. One took me over a day to uncover when
+%D processing the screen version of the \METAFUN\ manual.
+
+%D For my eyes only:
+
+\def\doifelseMPgraphic#1{\doifdefinedelse{\@@MPG#1}}
+
+%D \macros
+%D {startMPcolor}
+
+\long\unexpanded\def\startMPcolor#1\stopMPcolor
+ {\writestatus \m!metapost % eventually this placeholder will go away
+ {\string\startMPcolor...\stopMPcolor\space is obsolete,\space
+ use \string\defineintermediatecolor\space instead}}
+
+\let\stopMPcolor\relax
+
+%D New:
+
+\definelayerpreset % no dx,dy - else nasty non-mp placement
+ [mp]
+ [\c!y=-\MPury bp,
+ \c!x=\MPllx bp,
+ \c!method=\v!fit]
+
+\definelayer
+ [mp]
+ [\c!preset=mp]
+
+%D Usage:
+%D
+%D \starttyping
+%D \defineproperty[one][layer][state=start]
+%D \defineproperty[two][layer][state=stop]
+%D
+%D \startuseMPgraphic{step-1}
+%D fill fullcircle scaled 10cm withcolor red ;
+%D \stopuseMPgraphic
+%D
+%D \startuseMPgraphic{step-2}
+%D fill fullcircle scaled 5cm withcolor green ;
+%D \stopuseMPgraphic
+%D
+%D \setlayer[mp]{\property[one]{\useMPgraphic{step-1}}}
+%D \setlayer[mp]{\property[two]{\useMPgraphic{step-2}}}
+%D
+%D \ruledhbox{\flushlayer[mp]}
+%D \stoptyping
+%D
+%D Reusing graphics is also possible (now):
+%D
+%D \starttyping
+%D \startreusableMPgraphic{axis}
+%D tickstep := 1cm ; ticklength := 2mm ;
+%D drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
+%D tickstep := tickstep/2 ; ticklength := ticklength/2 ;
+%D drawticks unitsquare xscaled 4cm yscaled 3cm shifted (-1cm,-1cm) ;
+%D \stopreusableMPgraphic
+%D
+%D \startuseMPgraphic{demo}
+%D drawpoint "1cm,1.5cm" ;
+%D \stopuseMPgraphic
+%D
+%D \definelayer[mp][preset=mp]
+%D \setlayer[mp]{\reuseMPgraphic{axis}}
+%D \setlayer[mp]{\useMPgraphic{demo}}
+%D \ruledhbox{\flushlayer[mp]}
+%D \stoptyping
+
+%D \macros
+%D {startstaticMPfigure,useMPstaticfigure}
+%D
+%D Static figures are processed only when there has been
+%D something changed. Here is Aditya Mahajan's testcase:
+%D
+%D \startbuffer
+%D \startstaticMPfigure{circle}
+%D fill fullcircle scaled 1cm withcolor blue;
+%D \stopstaticMPfigure
+%D
+%D \startstaticMPfigure{axis}
+%D drawarrow (0,0)--(2cm,0) ;
+%D drawarrow (0,0)--(0,2cm) ;
+%D label.llft(textext("(0,0)") ,origin) ;
+%D \stopstaticMPfigure
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\usestaticMPfigure
+ {\dodoubleempty\dousestaticMPfigure}
+
+\def\dousestaticMPfigure[#1][#2]%
+ {\ifsecondargument
+ \scale[#2]{\reuseMPgraphic{\@@MPG#1@S@}}%
+ \else
+ \reuseMPgraphic{\@@MPG#1@S@}%
+ \fi}
+
+\unexpanded\def\startstaticMPfigure#1#2\stopstaticMPfigure
+ {\startreusableMPgraphic{\@@MPG#1@S@}#2\stopreusableMPgraphic}
+
+\long\unexpanded\def\startstaticMPgraphic
+ {\dodoublegroupempty\dostartstaticMPgraphic}
+
+\long\def\dostartstaticMPgraphic#1#2#3\stopstaticMPgraphic
+ {\long\setgvalue{\@@MPG#1@S@}{\handlereusableMPgraphic{#1}{#2}{#3}}}
+
+%D New:
+
+\newconditional\manyMPspecials % when set to true, > 1000 specials can be used
+
+\settrue \manyMPspecials % per 1/4/2006
+
+\prependtoks
+ _special_div_ := 1000\ifconditional\manyMPspecials0\fi ;
+\to \MPextensions
+
+%D Needed too.
+
+\let\initializeMPgraphics\relax
+
+%D Goody for preventing overflows:
+
+\def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt/10\relax}
+
+%D There is no way to distinguish the black color that you get when
+%D you issue a \type {draw} without color specification from a color
+%D that has an explicit black specification unless you set the
+%D variable \type {defaultcolormodel} to 1. Hoewever, in that case
+%D you cannot distinguish that draw from one with a \type
+%D {withoutcolor} specification. This means that we have to provide
+%D multiple variants of inheritance.
+%D
+%D In any case we need to tell the converter what the inherited color
+%D is to start with. Case~3 is kind of unpredictable as it closely
+%D relates to the order in which paths are flushed. If you want to
+%Dinherit automatically from the surrounding, you can best stick to
+%D variant 1. Variant 0 (an isolated graphic) is the default.
+%D
+%D \startbuffer
+%D \startuseMPgraphic{test}
+%D drawoptions(withpen pencircle scaled 1pt) ;
+%D def shift_cp = currentpicture := currentpicture shifted (-15pt,0) ; enddef ;
+%D draw fullcircle scaled 10pt withoutcolor ; shift_cp ;
+%D fill fullcircle scaled 10pt ; shift_cp ;
+%D draw fullcircle scaled 10pt withoutcolor ; shift_cp ;
+%D fill fullcircle scaled 10pt withcolor red ; shift_cp ;
+%D draw fullcircle scaled 10pt withoutcolor ; shift_cp ;
+%D fill fullcircle scaled 10pt ; shift_cp ;
+%D \stopuseMPgraphic
+%D
+%D \starttabulate
+%D \NC 0\quad \NC \chardef\MPcolormethod0 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 1\quad \NC \chardef\MPcolormethod1 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 2\quad \NC \chardef\MPcolormethod2 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 3\quad \NC \chardef\MPcolormethod3 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\chardef\MPcolormethod\zerocount
+
+% can be faster, just
+
+\appendtoks
+ \ctxlua{metapost.set_outer_color(\number\MPcolormethod,\number\currentcolormodel,\number\dogetattribute{color},\number\dogetattribute{transparency})}%
+\to \everyMPgraphic
+
+\startMPinitializations
+ defaultcolormodel := \ifcase\MPcolormethod1\or1\or3\else3\fi;
+\stopMPinitializations
+
+%D \macros
+%D {setupMPgraphics}
+%D
+%D Here is a generic setup command:
+
+\newtoks \everysetupMPgraphics
+
+\unexpanded\def\setupMPgraphics[#1]%
+ {\getparameters[\??mp][#1]%
+ \the\everysetupMPgraphics}
+
+%D Here we hook in the outer color. When \type {color} is set to \type
+%D {global} we get the outer color automatically. If you change this
+%D setting, you should do it grouped in order not to make other graphics
+%D behave in unexpected ways.
+
+\appendtoks
+ \doifelse\@@mpcolor\v!global{\chardef\MPcolormethod\plusone}{\chardef\MPcolormethod\zerocount}%
+\to \everysetupMPgraphics
+
+\setupMPgraphics
+ [\c!color=\v!local]
+
+%D Done.
+
+\protect \endinput
diff --git a/tex/context/base/meta-mis.tex b/tex/context/base/meta-mis.tex
new file mode 100644
index 000000000..29ab43007
--- /dev/null
+++ b/tex/context/base/meta-mis.tex
@@ -0,0 +1,54 @@
+%D \module
+%D [ file=meta-mis,
+%D version=2006.06.06,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Misc Test Graphics,
+%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
+
+% p/s 1/false 1/true 2/false 2/true
+%
+% MKII 8.5 8.0 8.8 8.5
+% MKIV 16.1 7.2 16.3 7.4
+
+\startuseMPgraphic{mptopdf-test}
+ prologues := 2;
+ mpprocset := 1 ;
+ fill fullcircle scaled 3cm withcolor red ;
+ fill fullcircle scaled 2cm withcolor green ;
+ fill fullcircle scaled 1cm withcolor blue ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ;
+ fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ;
+ fill fullcircle scaled 1cm withcolor cmyk(1,0,0,0) ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ draw fullcircle scaled 3cm dashed evenly ;
+ draw fullcircle scaled 2cm dashed withdots ;
+ draw origin withpen pencircle scaled 3mm;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red);
+ fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red);
+ fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green);
+ fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5));
+ currentpicture := currentpicture shifted (12cm,-4cm) ;
+ draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ % bug: shift
+ draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30 ;
+ draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ;
+ filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ % shade cannot handle shift
+ circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ;
+ circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ;
+ filldraw boundingbox currentpicture enlarged (-bbheight(currentpicture)/2+2.5mm) withpen pencircle scaled 1pt withcolor .5white ;
+\stopuseMPgraphic
+
+\protect \endinput
diff --git a/tex/context/base/meta-nav.tex b/tex/context/base/meta-nav.tex
new file mode 100644
index 000000000..9c1cbb4db
--- /dev/null
+++ b/tex/context/base/meta-nav.tex
@@ -0,0 +1,65 @@
+%D \module
+%D [ file=meta-nav,
+%D version=2003.03.28,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Navigational Graphics,
+%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.
+
+\startuniqueMPgraphic{navplus}{size,color,type,mode}
+ color c ; numeric s, t ; path p ;
+ t := \MPvar{type} ; c := \MPvar{color} ; s := \MPvar{size} ;
+ if \MPvar{mode} = 1 : c := .5[c,white] fi ;
+ if t = 1 :
+ p := ((0,0)--(1/2,0)--(1,1/3)--(1,1)--(0,1)--(0,0)--cycle)
+ xyscaled (3,4) ;
+ elseif t = 2 :
+ p := ((0,0)--(1,0)--(1,1)--(0,1)--(1/2,2/5)--(1,1)--(0,1)--cycle)
+ xyscaled (4,3) ;
+ else :
+ p := fullsquare xyscaled (3,3) ;
+ fi ;
+ draw p withpen pencircle scaled (1/2) withcolor .75white ;
+ fill p withcolor c ;
+ draw p withpen pencircle scaled (1/3) withcolor .5c ;
+ currentpicture := currentpicture scaled s ;
+ currentpicture := currentpicture shifted -center currentpicture ;
+\stopuniqueMPgraphic
+
+\setupMPvariables
+ [navplus]
+ [size=1ex,
+ color=black,
+ type=1,
+ mode=0]
+
+\definepalet
+ [navplus]
+ [attach=darkred,
+ comment=darkblue]
+
+\definesymbol
+ [comment-normal]
+ [\uniqueMPgraphic{navplus}{type=1,color=navplus:comment}]
+\definesymbol
+ [comment-down]
+ [\uniqueMPgraphic{navplus}{type=1,color=navplus:comment,mode=1}]
+
+\definesymbol
+ [attach-normal]
+ [\uniqueMPgraphic{navplus}{type=2,color=navplus:attach}]
+\definesymbol
+ [attach-down]
+ [\uniqueMPgraphic{navplus}{type=2,color=navplus:attach,mode=1}]
+
+\unprotect
+
+\setupcomment [\c!symbol={comment-normal,comment-down}]
+\setupattachments[\c!symbol={attach-normal,attach-down}]
+
+\protect \endinput
diff --git a/tex/context/base/meta-pag.mkii b/tex/context/base/meta-pag.mkii
new file mode 100644
index 000000000..000e56a2e
--- /dev/null
+++ b/tex/context/base/meta-pag.mkii
@@ -0,0 +1,226 @@
+%D \module
+%D [ file=meta-pag,
+%D version=1999.07.10,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D These definitions used to be part of the old \type
+%D {core-mps} file, later changed into \type {meta-ini}, but
+%D keeping them separate is cleaner.
+
+\writestatus{loading}{MetaPost Graphics / Page Data Management}
+
+\unprotect
+
+\startMPextensions
+ if unknown context_page: input mp-page; fi;
+\stopMPextensions
+
+%D The next few macros tell \METAPOST\ how the \CONTEXT\
+%D pagebody looks.
+
+\startMPextensions
+ boolean PageStateAvailable,OnRightPage,InPageBody;
+ PageStateAvailable:=true;
+\stopMPextensions
+
+\startMPinitializations
+ OnRightPage:=true;
+ InPageBody:=\ifinpagebody true \else false \fi;
+\stopMPinitializations
+
+\startMPinitializations
+ def LoadPageState =
+ OnRightPage:=\MPonrightpage;
+ OnOddPage:=\MPonoddpage;
+ RealPageNumber:=\the\realpageno;
+ PageNumber:=\the\pageno;
+ NOfPages:=\lastpage;
+ PaperHeight:=\the\paperheight;
+ PaperWidth:=\the\paperwidth;
+ PrintPaperHeight:=\the\printpaperheight;
+ PrintPaperWidth:=\the\printpaperwidth;
+ TopSpace:=\the\topspace;
+ BottomSpace:=\the\bottomspace;
+ BackSpace:=\the\backspace;
+ CutSpace:=\the\cutspace;
+ MakeupHeight:=\the\makeupheight;
+ MakeupWidth:=\the\makeupwidth;
+ TopHeight:=\the\topheight;
+ TopDistance:=\the\topdistance;
+ HeaderHeight:=\the\headerheight;
+ HeaderDistance:=\the\headerdistance;
+ TextHeight:=\the\textheight;
+ FooterDistance:=\the\footerdistance;
+ FooterHeight:=\the\footerheight;
+ BottomDistance:=\the\bottomdistance;
+ BottomHeight:=\the\bottomheight;
+ LeftEdgeWidth:=\the\leftedgewidth;
+ LeftEdgeDistance:=\the\leftedgedistance;
+ LeftMarginWidth:=\the\leftmarginwidth;
+ LeftMarginDistance:=\the\leftmargindistance;
+ TextWidth:=\the\textwidth ;
+ RightMarginDistance:=\the\rightmargindistance;
+ RightMarginWidth:=\the\rightmarginwidth;
+ RightEdgeDistance:=\the\rightedgedistance;
+ RightEdgeWidth:=\the\rightedgewidth;
+ InnerMarginDistance:=\the\innermargindistance;
+ InnerMarginWidth:=\the\innermarginwidth;
+ OuterMarginDistance:=\the\outermargindistance;
+ OuterMarginWidth:=\the\outermarginwidth;
+ InnerEdgeDistance:=\the\inneredgedistance;
+ InnerEdgeWidth:=\the\inneredgewidth;
+ OuterEdgeDistance:=\the\outeredgedistance;
+ OuterEdgeWidth:=\the\outeredgewidth;
+ PageOffset:=\the\pageoffset;
+ PageDepth:=\the\pagedepth;
+ LayoutColumns:=\the\layoutcolumns;
+ LayoutColumnDistance:=\the\layoutcolumndistance;
+ LayoutColumnWidth:=\the\layoutcolumnwidth;
+ enddef;
+\stopMPinitializations
+
+\def\MPonrightpage{true}
+\def\MPonoddpage {true}
+
+\def\freezeMPpagelayout
+ {\doifbothsides
+ {\def\MPonrightpage{true}}
+ {\def\MPonrightpage{true}}
+ {\def\MPonrightpage{false}}%
+ \edef\MPonoddpage{\doifoddpageelse{true}{false}}}
+
+\let\freezeMPlayout\relax % obsolete
+
+%D We need to freeze the pagelayout before the backgrounds
+%D are build, because the overlay will temporarily become
+%D zero (overlay).
+
+\appendtoks
+ \freezeMPpagelayout
+\to \everybeforepagebody
+
+%D By freezing these value every graphic, we can use layout
+%D variables that change halfways a page, whatever use that
+%D has.
+
+\prependtoks
+ \calculatereducedvsizes % this is really needed
+ \freezeMPpagelayout
+ \freezeMPlayout % to be used grouped
+\to \everyMPgraphic
+
+%D The next feature provides information about for instance
+%D column positions. This is an experimental feature,
+%D introduced when we needed backgrounds in columns (fill||in
+%D questions as implemented in a private module).
+%D
+%D See \type {mp-page.mp} for the definition of the macros:
+%D
+%D \starttabulate[|tl|l|p|]
+%D \NC ResetTextAreas \NC no arguments \NC
+%D reset areas on page \NC \NR
+%D \NC RegisterTextArea \NC x, y, w, h \NC
+%D adds area to the list \NC \NR
+%D \NC TextAreaX,Y,W,H,XY,WH \NC x and/or y \NC
+%D reports offsets and dimensions \NC \NR
+%D \stoptabulate
+%D
+%D The \type {TextArea*} macros can be used to determine
+%D overlap.
+
+\newcount\currentMPtextareadata
+
+\newtoks\MPsavedtextareadata
+\newtoks\MPtextareadata
+\newtoks\MPlocaltextareadata
+
+% optimaliseren voor herhaling
+
+\def\registerMPtextarea#1%
+ {\ifpositioning
+ \bgroup
+ \global\advance\currentMPtextareadata\plusone
+ %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+ \hpos{gbd:\the\currentMPtextareadata}%
+ {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}%
+ \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+ \edef\!!stringa{RegisterTextArea(%
+ \MPx\!!stringa,\MPy\!!stringa,%
+ \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+ \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata
+ \egroup
+ \else
+ \hbox{#1}%
+ \fi}
+
+\def\registerMPlocaltextarea#1%
+ {\ifpositioning
+ \bgroup
+ \global\advance\currentMPtextareadata\plusone
+ %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+ \hpos{gbd:\the\currentMPtextareadata}%
+ {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+ \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+ \edef\!!stringa{RegisterLocalTextArea(%
+ \MPx\!!stringa,\MPy\!!stringa,%
+ \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+ \global\MPlocaltextareadata\@EA{\!!stringa}%
+ \egroup
+ \else
+ \hbox{#1}%
+ \fi}
+
+% better, so that we can force a key and share with e.g. renumbering
+%
+% \let\namedtextarea\empty
+%
+% \def\registerMPlocaltextarea#1%
+% {\ifpositioning
+% \bgroup
+% \ifx\namedtextarea\empty
+% \global\advance\currentMPtextareadata\plusone
+% \edef\namedtextarea{gbd:\the\currentMPtextareadata}%
+% \fi
+% \hpos\namedtextarea{\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+% \edef\ascii{RegisterLocalTextArea(%
+% \MPx\namedtextarea,\MPy\namedtextarea,%
+% \MPw\namedtextarea,\MPh\namedtextarea,\MPd\namedtextarea);}%
+% \global\MPlocaltextareadata\@EA{\ascii}%
+% \egroup
+% \else
+% \hbox{#1}%
+% \fi}
+
+\def\resetMPlocaltextarea
+ {\global\MPlocaltextareadata\emptytoks}
+
+\startMPextensions
+ path PlainTextArea;
+\stopMPextensions
+
+\startMPinitializations
+ ResetTextAreas;
+ \the\MPsavedtextareadata;
+ SaveTextAreas;
+ ResetTextAreas;
+ \the\MPtextareadata;
+ \the\MPlocaltextareadata;
+ PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio}
+ shifted (\MPw{text:\realfolio},\MPh{text:\realfolio}));
+\stopMPinitializations
+
+\appendtoks
+ \global\MPsavedtextareadata\MPtextareadata
+ \global\MPtextareadata \emptytoks
+ \global\MPlocaltextareadata\emptytoks
+\to \everyshipout
+
+\protect \endinput
diff --git a/tex/context/base/meta-pag.mkiv b/tex/context/base/meta-pag.mkiv
new file mode 100644
index 000000000..ef3817721
--- /dev/null
+++ b/tex/context/base/meta-pag.mkiv
@@ -0,0 +1,223 @@
+%D \module
+%D [ file=meta-pag,
+%D version=1999.07.10,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D These definitions used to be part of the old \type
+%D {core-mps} file, later changed into \type {meta-ini}, but
+%D keeping them separate is cleaner.
+
+\writestatus{loading}{MetaPost Graphics / Page Data Management}
+
+\unprotect
+
+\startMPextensions
+ if unknown context_page: input mp-page; fi;
+\stopMPextensions
+
+%D The next few macros tell \METAPOST\ how the \CONTEXT\
+%D pagebody looks.
+
+\startMPextensions
+ boolean PageStateAvailable,OnRightPage,InPageBody;
+ PageStateAvailable:=true;
+\stopMPextensions
+
+\startMPinitializations
+ OnRightPage:=true;
+ InPageBody:=\ifinpagebody true \else false \fi;
+\stopMPinitializations
+
+\startMPinitializations
+ def LoadPageState =
+ OnRightPage:=\MPonrightpage;
+ OnOddPage:=\MPonoddpage;
+ RealPageNumber:=\the\realpageno;
+ PageNumber:=\the\pageno;
+ NOfPages:=\lastpage;
+ PaperHeight:=\the\paperheight;
+ PaperWidth:=\the\paperwidth;
+ PrintPaperHeight:=\the\printpaperheight;
+ PrintPaperWidth:=\the\printpaperwidth;
+ TopSpace:=\the\topspace;
+ BottomSpace:=\the\bottomspace;
+ BackSpace:=\the\backspace;
+ CutSpace:=\the\cutspace;
+ MakeupHeight:=\the\makeupheight;
+ MakeupWidth:=\the\makeupwidth;
+ TopHeight:=\the\topheight;
+ TopDistance:=\the\topdistance;
+ HeaderHeight:=\the\headerheight;
+ HeaderDistance:=\the\headerdistance;
+ TextHeight:=\the\textheight;
+ FooterDistance:=\the\footerdistance;
+ FooterHeight:=\the\footerheight;
+ BottomDistance:=\the\bottomdistance;
+ BottomHeight:=\the\bottomheight;
+ LeftEdgeWidth:=\the\leftedgewidth;
+ LeftEdgeDistance:=\the\leftedgedistance;
+ LeftMarginWidth:=\the\leftmarginwidth;
+ LeftMarginDistance:=\the\leftmargindistance;
+ TextWidth:=\the\textwidth ;
+ RightMarginDistance:=\the\rightmargindistance;
+ RightMarginWidth:=\the\rightmarginwidth;
+ RightEdgeDistance:=\the\rightedgedistance;
+ RightEdgeWidth:=\the\rightedgewidth;
+ InnerMarginDistance:=\the\innermargindistance;
+ InnerMarginWidth:=\the\innermarginwidth;
+ OuterMarginDistance:=\the\outermargindistance;
+ OuterMarginWidth:=\the\outermarginwidth;
+ InnerEdgeDistance:=\the\inneredgedistance;
+ InnerEdgeWidth:=\the\inneredgewidth;
+ OuterEdgeDistance:=\the\outeredgedistance;
+ OuterEdgeWidth:=\the\outeredgewidth;
+ PageOffset:=\the\pageoffset;
+ PageDepth:=\the\pagedepth;
+ LayoutColumns:=\the\layoutcolumns;
+ LayoutColumnDistance:=\the\layoutcolumndistance;
+ LayoutColumnWidth:=\the\layoutcolumnwidth;
+ enddef;
+\stopMPinitializations
+
+\def\MPonrightpage{true}
+\def\MPonoddpage {true}
+
+\def\freezeMPpagelayout
+ {\edef\MPonrightpage{\doifbothsides {tru}{tru}{fals}e}%
+ \edef\MPonoddpage {\doifoddpageelse {tru}{fals}e}}
+
+\let\freezeMPlayout\relax % obsolete
+
+%D We need to freeze the pagelayout before the backgrounds
+%D are build, because the overlay will temporarily become
+%D zero (overlay).
+
+\appendtoks
+ \freezeMPpagelayout
+\to \everybeforepagebody
+
+%D By freezing these value every graphic, we can use layout
+%D variables that change halfways a page, whatever use that
+%D has.
+
+\prependtoks
+ \calculatereducedvsizes % this is really needed
+ \freezeMPpagelayout
+ \freezeMPlayout % to be used grouped
+\to \everyMPgraphic
+
+%D The next feature provides information about for instance
+%D column positions. This is an experimental feature,
+%D introduced when we needed backgrounds in columns (fill||in
+%D questions as implemented in a private module).
+%D
+%D See \type {mp-page.mp} for the definition of the macros:
+%D
+%D \starttabulate[|tl|l|p|]
+%D \NC ResetTextAreas \NC no arguments \NC
+%D reset areas on page \NC \NR
+%D \NC RegisterTextArea \NC x, y, w, h \NC
+%D adds area to the list \NC \NR
+%D \NC TextAreaX,Y,W,H,XY,WH \NC x and/or y \NC
+%D reports offsets and dimensions \NC \NR
+%D \stoptabulate
+%D
+%D The \type {TextArea*} macros can be used to determine
+%D overlap.
+
+\newcount\currentMPtextareadata
+
+\newtoks\MPsavedtextareadata
+\newtoks\MPtextareadata
+\newtoks\MPlocaltextareadata
+
+% optimaliseren voor herhaling
+
+\def\registerMPtextarea#1%
+ {\ifpositioning
+ \bgroup
+ \global\advance\currentMPtextareadata\plusone
+ %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+ \hpos{gbd:\the\currentMPtextareadata}%
+ {\iftracetextareas\boxrulewidth1.5pt\ruledhbox\fi{#1}}%
+ \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+ \edef\!!stringa{RegisterTextArea(%
+ \MPx\!!stringa,\MPy\!!stringa,%
+ \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+ \@EA \doglobal \@EA \appendtoks \!!stringa \to \MPtextareadata
+ \egroup
+ \else
+ \hbox{#1}%
+ \fi}
+
+\def\registerMPlocaltextarea#1%
+ {\ifpositioning
+ \bgroup
+ \global\advance\currentMPtextareadata\plusone
+ %\hpos{gbd:\the\currentMPtextareadata}{#1}%
+ \hpos{gbd:\the\currentMPtextareadata}%
+ {\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+ \edef\!!stringa{gbd:\the\currentMPtextareadata}%
+ \edef\!!stringa{RegisterLocalTextArea(%
+ \MPx\!!stringa,\MPy\!!stringa,%
+ \MPw\!!stringa,\MPh\!!stringa,\MPd\!!stringa);}%
+ \global\MPlocaltextareadata\@EA{\!!stringa}%
+ \egroup
+ \else
+ \hbox{#1}%
+ \fi}
+
+% better, so that we can force a key and share with e.g. renumbering
+%
+% \let\namedtextarea\empty
+%
+% \def\registerMPlocaltextarea#1%
+% {\ifpositioning
+% \bgroup
+% \ifx\namedtextarea\empty
+% \global\advance\currentMPtextareadata\plusone
+% \edef\namedtextarea{gbd:\the\currentMPtextareadata}%
+% \fi
+% \hpos\namedtextarea{\iftracetextareas\boxrulewidth3pt\ruledhbox\fi{#1}}%
+% \edef\ascii{RegisterLocalTextArea(%
+% \MPx\namedtextarea,\MPy\namedtextarea,%
+% \MPw\namedtextarea,\MPh\namedtextarea,\MPd\namedtextarea);}%
+% \global\MPlocaltextareadata\@EA{\ascii}%
+% \egroup
+% \else
+% \hbox{#1}%
+% \fi}
+
+\def\resetMPlocaltextarea
+ {\global\MPlocaltextareadata\emptytoks}
+
+\startMPextensions
+ path PlainTextArea;
+\stopMPextensions
+
+\startMPinitializations
+ ResetTextAreas;
+ \the\MPsavedtextareadata;
+ SaveTextAreas;
+ ResetTextAreas;
+ \the\MPtextareadata;
+ \the\MPlocaltextareadata;
+ PlainTextArea:=boundingbox(\MPxy{text:\realfolio}--\MPxy{text:\realfolio}
+ shifted (\MPw{text:\realfolio},\MPh{text:\realfolio}));
+\stopMPinitializations
+
+\appendtoks
+ \global\MPsavedtextareadata\MPtextareadata
+ \global\MPtextareadata \emptytoks
+ \global\MPlocaltextareadata\emptytoks
+\to \everyshipout
+
+\protect \endinput
diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua
new file mode 100644
index 000000000..23f8d4de0
--- /dev/null
+++ b/tex/context/base/meta-pdf.lua
@@ -0,0 +1,553 @@
+if not modules then modules = { } end modules ['meta-pdf'] = {
+ version = 1.001,
+ comment = "companion to meta-pdf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Finally we used an optimized version. The test code can be found in
+-- meta-pdh.lua but since we no longer want to overload functione we use
+-- more locals now. This module keeps changing as it is also a testbed.
+
+local concat, format, gsub, find, byte, gmatch, match = table.concat, string.format, string.gsub, string.find, string.byte, string.gmatch, string.match
+local lpegmatch = lpeg.match
+local round = math.round
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+local pdfrgbcode = lpdf.rgbcode
+local pdfcmykcode = lpdf.cmykcode
+local pdfgraycode = lpdf.graycode
+local pdfspotcode = lpdf.spotcode
+local pdftransparencycode = lpdf.transparencycode
+local pdffinishtransparencycode = lpdf.finishtransparencycode
+
+mptopdf = { }
+mptopdf.n = 0
+
+local m_path, m_stack, m_texts, m_version, m_date, m_shortcuts = { }, { }, { }, 0, 0, false
+
+local m_stack_close, m_stack_path, m_stack_concat = false, { }, nil
+local extra_path_code, ignore_path = nil, false
+local specials = { }
+
+local function resetpath()
+ m_stack_close, m_stack_path, m_stack_concat = false, { }, nil
+end
+
+local function resetall()
+ m_path, m_stack, m_texts, m_version, m_shortcuts = { }, { }, { }, 0, false
+ extra_path_code, ignore_path = nil, false
+ specials = { }
+ resetpath()
+end
+
+resetall()
+
+-- todo: collect and flush packed using pdfliteral node injection but we're
+-- in no hurry as this kind of conversion does not happen that often in mkiv
+
+local function pdfcode(str) -- could be a node.write instead
+ texsprint(ctxcatcodes,"\\pdfliteral{",str,"}")
+end
+
+local function texcode(str)
+ texsprint(ctxcatcodes,str)
+end
+
+function mpscode(str)
+ if ignore_path then
+ pdfcode("h W n")
+ if extra_path_code then
+ pdfcode(extra_path_code)
+ extra_path_code = nil
+ end
+ ignore_path = false
+ else
+ pdfcode(str)
+ end
+end
+
+-- auxiliary functions
+
+local function flushconcat()
+ if m_stack_concat then
+ mpscode(concat(m_stack_concat," ") .. " cm")
+ m_stack_concat = nil
+ end
+end
+
+local function flushpath(cmd)
+ if #m_stack_path > 0 then
+ local path = { }
+ if m_stack_concat then
+ local sx, sy = m_stack_concat[1], m_stack_concat[4]
+ local rx, ry = m_stack_concat[2], m_stack_concat[3]
+ local tx, ty = m_stack_concat[5], m_stack_concat[6]
+ local d = (sx*sy) - (rx*ry)
+ for k=1,#m_stack_path do
+ local v = m_stack_path[k]
+ local px, py = v[1], v[2] ; v[1], v[2] = (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d -- mpconcat(v[1],v[2])
+ if #v == 7 then
+ local px, py = v[3], v[4] ; v[3], v[4] = (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d -- mpconcat(v[3],v[4])
+ local px, py = v[5], v[6] ; v[5], v[6] = (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d -- mpconcat(v[5],v[6])
+ end
+ path[#path+1] = concat(v," ")
+ end
+ else
+ for k=1,#m_stack_path do
+ path[#path+1] = concat(m_stack_path[k]," ")
+ end
+ end
+ flushconcat()
+ pdfcode(concat(path," "))
+ if m_stack_close then
+ mpscode("h " .. cmd)
+ else
+ mpscode(cmd)
+ end
+ end
+ resetpath()
+end
+
+-- mp interface
+
+mps = mps or { }
+
+function mps.creator(a, b, c)
+ m_version = tonumber(b)
+end
+
+function mps.creationdate(a)
+ m_date = a
+end
+
+function mps.newpath()
+ m_stack_path = { }
+end
+
+function mps.boundingbox(llx, lly, urx, ury)
+ texcode("\\MPSboundingbox{" .. llx .. "}{" .. lly .. "}{" .. urx .. "}{" .. ury .. "}")
+end
+
+function mps.moveto(x,y)
+ m_stack_path[#m_stack_path+1] = {x,y,"m"}
+end
+
+function mps.curveto(ax, ay, bx, by, cx, cy)
+ m_stack_path[#m_stack_path+1] = {ax,ay,bx,by,cx,cy,"c"}
+end
+
+function mps.lineto(x,y)
+ m_stack_path[#m_stack_path+1] = {x,y,"l"}
+end
+
+function mps.rlineto(x,y)
+ local dx, dy = 0, 0
+ if #m_stack_path > 0 then
+ dx, dy = m_stack_path[#m_stack_path][1], m_stack_path[#m_stack_path][2]
+ end
+ m_stack_path[#m_stack_path+1] = {dx,dy,"l"}
+end
+
+function mps.translate(tx,ty)
+ mpscode("1 0 0 0 1 " .. tx .. " " .. ty .. " cm")
+end
+
+function mps.scale(sx,sy)
+ m_stack_concat = {sx,0,0,sy,0,0}
+end
+
+function mps.concat(sx, rx, ry, sy, tx, ty)
+ m_stack_concat = {sx,rx,ry,sy,tx,ty}
+end
+
+function mps.setlinejoin(d)
+ mpscode(d .. " j")
+end
+
+function mps.setlinecap(d)
+ mpscode(d .. " J")
+end
+
+function mps.setmiterlimit(d)
+ mpscode(d .. " M")
+end
+
+function mps.gsave()
+ mpscode("q")
+end
+
+function mps.grestore()
+ mpscode("Q")
+end
+
+function mps.setdash(...) -- can be made faster, operate on t = { ... }
+ local n = select("#",...)
+ mpscode("[" .. concat({...}," ",1,n-1) .. "] " .. select(n,...) .. " d")
+end
+
+function mps.resetdash()
+ mpscode("[ ] 0 d")
+end
+
+function mps.setlinewidth(d)
+ mpscode(d .. " w")
+end
+
+function mps.closepath()
+ m_stack_close = true
+end
+
+function mps.fill()
+ flushpath('f')
+end
+
+function mps.stroke()
+ flushpath('S')
+end
+
+function mps.both()
+ flushpath('B')
+end
+
+function mps.clip()
+ flushpath('W n')
+end
+
+function mps.textext(font, scale, str) -- old parser
+ local dx, dy = 0, 0
+ if #m_stack_path > 0 then
+ dx, dy = m_stack_path[1][1], m_stack_path[1][2]
+ end
+ flushconcat()
+ texcode("\\MPStextext{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}")
+ resetpath()
+end
+
+local handlers = { }
+
+handlers[1] = function(s)
+ pdfcode(pdffinishtransparencycode())
+ pdfcode(pdfcmykcode(mps.colormodel,s[3],s[4],s[5],s[6]))
+end
+handlers[2] = function(s)
+ pdfcode(pdffinishtransparencycode())
+ pdfcode(pdfspotcode(mps.colormodel,s[3],s[4],s[5],s[6]))
+end
+handlers[3] = function(s)
+ pdfcode(pdfrgbcode(mps.colormodel,s[4],s[5],s[6]))
+ pdfcode(pdftransparencycode(s[2],s[3]))
+end
+handlers[4] = function(s)
+ pdfcode(pdfcmykcode(mps.colormodel,s[4],s[5],s[6],s[7]))
+ pdfcode(pdftransparencycode(s[2],s[3]))
+end
+handlers[5] = function(s)
+ pdfcode(pdfspotcode(mps.colormodel,s[4],s[5],s[6],s[7]))
+ pdfcode(pdftransparencycode(s[2],s[3]))
+end
+
+-- todo: color conversion
+
+local nofshades, tn = 0, tonumber
+
+local function linearshade(colorspace,domain,ca,cb,coordinates)
+ pdfcode(pdffinishtransparencycode())
+ nofshades = nofshades + 1
+ local name = format("MpsSh%s",nofshades)
+ lpdf.linearshade(name,domain,ca,cb,1,colorspace,coordinates)
+ extra_path_code, ignore_path = format("/%s sh Q",name), true
+ pdfcode("q /Pattern cs")
+end
+
+local function circularshade(colorspace,domain,ca,cb,coordinates)
+ pdfcode(pdffinishtransparencycode())
+ nofshades = nofshades + 1
+ local name = format("MpsSh%s",nofshades)
+ lpdf.circularshade(name,domain,ca,cb,1,colorspace,coordinates)
+ extra_path_code, ignore_path = format("/%s sh Q",name), true
+ pdfcode("q /Pattern cs")
+end
+
+handlers[30] = function(s)
+ linearshade("DeviceRGB", { tn(s[ 2]), tn(s[ 3]) },
+ { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]) }, { tn(s[10]), tn(s[11]), tn(s[12]) },
+ { tn(s[ 8]), tn(s[ 9]), tn(s[13]), tn(s[14]) } )
+end
+
+handlers[31] = function(s)
+ circularshade("DeviceRGB", { tn(s[ 2]), tn(s[ 3]) },
+ { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]) }, { tn(s[11]), tn(s[12]), tn(s[13]) },
+ { tn(s[ 8]), tn(s[ 9]), tn(s[10]), tn(s[14]), tn(s[15]), tn(s[16]) } )
+end
+
+handlers[32] = function(s)
+ linearshade("DeviceCMYK", { tn(s[ 2]), tn(s[ 3]) },
+ { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]), tn(s[ 8]) }, { tn(s[11]), tn(s[12]), tn(s[13]), tn(s[14]) },
+ { tn(s[ 9]), tn(s[10]), tn(s[15]), tn(s[16]) } )
+end
+
+handlers[33] = function(s)
+ circularshade("DeviceCMYK", { tn(s[ 2]), tn(s[ 3]) },
+ { tn(s[ 5]), tn(s[ 6]), tn(s[ 7]), tn(s[ 8]) }, { tn(s[12]), tn(s[13]), tn(s[14]), tn(s[15]) },
+ { tn(s[ 9]), tn(s[10]), tn(s[11]), tn(s[16]), tn(s[17]), tn(s[18]) } )
+end
+
+handlers[34] = function(s) -- todo (after further cleanup)
+ linearshade("DeviceGray", { tn(s[ 2]), tn(s[ 3]) }, { 0 }, { 1 }, { tn(s[9]), tn(s[10]), tn(s[15]), tn(s[16]) } )
+end
+
+handlers[35] = function(s) -- todo (after further cleanup)
+ circularshade("DeviceGray", { tn(s[ 2]), tn(s[ 3]) }, { 0 }, { 1 }, { tn(s[9]), tn(s[10]), tn(s[15]), tn(s[16]) } )
+end
+
+-- not supported in mkiv , use mplib instead
+
+handlers[10] = function() logs.report("mptopdf","skipping special %s",10) end
+handlers[20] = function() logs.report("mptopdf","skipping special %s",20) end
+handlers[50] = function() logs.report("mptopdf","skipping special %s",50) end
+
+--end of not supported
+
+function mps.setrgbcolor(r,g,b) -- extra check
+ r, g = tonumber(r), tonumber(g) -- needed when we use lpeg
+ if r == 0.0123 and g < 0.1 then
+ g, b = round(g*10000), round(b*10000)
+ local s = specials[b]
+ local h = round(s[#s])
+ local handler = handlers[h]
+ if handler then
+ handler(s)
+ else
+ logs.report("mptopdf","unknown special handler %s (1)",h)
+ end
+ elseif r == 0.123 and g < 0.1 then
+ g, b = round(g*1000), round(b*1000)
+ local s = specials[b]
+ local h = round(s[#s])
+ local handler = handlers[h]
+ if handler then
+ handler(s)
+ else
+ logs.report("mptopdf","unknown special handler %s (2)",h)
+ end
+ else
+ pdfcode(pdffinishtransparencycode())
+ pdfcode(pdfrgbcode(mps.colormodel,r,g,b))
+ end
+end
+
+function mps.setcmykcolor(c,m,y,k)
+ pdfcode(pdffinishtransparencycode())
+ pdfcode(pdfcmykcode(mps.colormodel,c,m,y,k))
+end
+
+function mps.setgray(s)
+ pdfcode(pdffinishtransparencycode())
+ pdfcode(pdfgrayliteral(mps.colormodel,s))
+end
+
+function mps.specials(version,signal,factor) -- 2.0 123 1000
+end
+
+function mps.special(...) -- 7 1 0.5 1 0 0 1 3
+ local t = { ... }
+ local n = tonumber(t[#t-1])
+ specials[n] = t
+end
+
+function mps.begindata()
+end
+
+function mps.enddata()
+end
+
+function mps.showpage()
+end
+
+-- lpeg parser
+
+-- The lpeg based parser is rather optimized for the kind of output
+-- that MetaPost produces. It's my first real lpeg code, which may
+-- show. Because the parser binds to functions, we define it last.
+
+local lpegP, lpegR, lpegS, lpegC, lpegCc, lpegCs = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs
+
+local digit = lpegR("09")
+local eol = lpegS('\r\n')^1
+local sp = lpegP(' ')^1
+local space = lpegS(' \r\n')^1
+local number = lpegS('0123456789.-+')^1
+local nonspace = lpegP(1-lpegS(' \r\n'))^1
+
+local spec = digit^2 * lpegP("::::") * digit^2
+local text = lpegCc("{") * (
+ lpegP("\\") * ( (digit * digit * digit) / function(n) return "c" .. tonumber(n,8) end) +
+ lpegP(" ") / function(n) return "\\c32" end + -- never in new mp
+ lpegP(1) / function(n) return "\\c" .. byte(n) end
+ ) * lpegCc("}")
+local package = lpegCs(spec + text^0)
+
+function mps.fshow(str,font,scale) -- lpeg parser
+ mps.textext(font,scale,lpegmatch(package,str))
+end
+
+local cnumber = lpegC(number)
+local cstring = lpegC(nonspace)
+
+local specials = (lpegP("%%MetaPostSpecials:") * sp * (cstring * sp^0)^0 * eol) / mps.specials
+local special = (lpegP("%%MetaPostSpecial:") * sp * (cstring * sp^0)^0 * eol) / mps.special
+local boundingbox = (lpegP("%%BoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mps.boundingbox
+local highresboundingbox = (lpegP("%%HiResBoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mps.boundingbox
+
+local setup = lpegP("%%BeginSetup") * (1 - lpegP("%%EndSetup") )^1
+local prolog = lpegP("%%BeginProlog") * (1 - lpegP("%%EndProlog"))^1
+local comment = lpegP('%')^1 * (1 - eol)^1
+
+local curveto = ((cnumber * sp)^6 * lpegP("curveto") ) / mps.curveto
+local lineto = ((cnumber * sp)^2 * lpegP("lineto") ) / mps.lineto
+local rlineto = ((cnumber * sp)^2 * lpegP("rlineto") ) / mps.rlineto
+local moveto = ((cnumber * sp)^2 * lpegP("moveto") ) / mps.moveto
+local setrgbcolor = ((cnumber * sp)^3 * lpegP("setrgbcolor") ) / mps.setrgbcolor
+local setcmykcolor = ((cnumber * sp)^4 * lpegP("setcmykcolor") ) / mps.setcmykcolor
+local setgray = ((cnumber * sp)^1 * lpegP("setgray") ) / mps.setgray
+local newpath = ( lpegP("newpath") ) / mps.newpath
+local closepath = ( lpegP("closepath") ) / mps.closepath
+local fill = ( lpegP("fill") ) / mps.fill
+local stroke = ( lpegP("stroke") ) / mps.stroke
+local clip = ( lpegP("clip") ) / mps.clip
+local both = ( lpegP("gsave fill grestore")) / mps.both
+local showpage = ( lpegP("showpage") )
+local setlinejoin = ((cnumber * sp)^1 * lpegP("setlinejoin") ) / mps.setlinejoin
+local setlinecap = ((cnumber * sp)^1 * lpegP("setlinecap") ) / mps.setlinecap
+local setmiterlimit = ((cnumber * sp)^1 * lpegP("setmiterlimit") ) / mps.setmiterlimit
+local gsave = ( lpegP("gsave") ) / mps.gsave
+local grestore = ( lpegP("grestore") ) / mps.grestore
+
+local setdash = (lpegP("[") * (cnumber * sp^0)^0 * lpegP("]") * sp * cnumber * sp * lpegP("setdash")) / mps.setdash
+local concat = (lpegP("[") * (cnumber * sp^0)^6 * lpegP("]") * sp * lpegP("concat") ) / mps.concat
+local scale = ( (cnumber * sp^0)^6 * sp * lpegP("concat") ) / mps.concat
+
+local fshow = (lpegP("(") * lpegC((1-lpegP(")"))^1) * lpegP(")") * space * cstring * space * cnumber * space * lpegP("fshow")) / mps.fshow
+local fshow = (lpegP("(") * lpegCs( ( lpegP("\\(")/"\\050" + lpegP("\\)")/"\\051" + (1-lpegP(")")) )^1 )
+ * lpegP(")") * space * cstring * space * cnumber * space * lpegP("fshow")) / mps.fshow
+
+local setlinewidth_x = (lpegP("0") * sp * cnumber * sp * lpegP("dtransform truncate idtransform setlinewidth pop")) / mps.setlinewidth
+local setlinewidth_y = (cnumber * sp * lpegP("0 dtransform exch truncate exch idtransform pop setlinewidth") ) / mps.setlinewidth
+
+local c = ((cnumber * sp)^6 * lpegP("c") ) / mps.curveto -- ^6 very inefficient, ^1 ok too
+local l = ((cnumber * sp)^2 * lpegP("l") ) / mps.lineto
+local r = ((cnumber * sp)^2 * lpegP("r") ) / mps.rlineto
+local m = ((cnumber * sp)^2 * lpegP("m") ) / mps.moveto
+local vlw = ((cnumber * sp)^1 * lpegP("vlw")) / mps.setlinewidth
+local hlw = ((cnumber * sp)^1 * lpegP("hlw")) / mps.setlinewidth
+
+local R = ((cnumber * sp)^3 * lpegP("R") ) / mps.setrgbcolor
+local C = ((cnumber * sp)^4 * lpegP("C") ) / mps.setcmykcolor
+local G = ((cnumber * sp)^1 * lpegP("G") ) / mps.setgray
+
+local lj = ((cnumber * sp)^1 * lpegP("lj") ) / mps.setlinejoin
+local ml = ((cnumber * sp)^1 * lpegP("ml") ) / mps.setmiterlimit
+local lc = ((cnumber * sp)^1 * lpegP("lc") ) / mps.setlinecap
+
+local n = lpegP("n") / mps.newpath
+local p = lpegP("p") / mps.closepath
+local S = lpegP("S") / mps.stroke
+local F = lpegP("F") / mps.fill
+local B = lpegP("B") / mps.both
+local W = lpegP("W") / mps.clip
+local P = lpegP("P") / mps.showpage
+
+local q = lpegP("q") / mps.gsave
+local Q = lpegP("Q") / mps.grestore
+
+local sd = (lpegP("[") * (cnumber * sp^0)^0 * lpegP("]") * sp * cnumber * sp * lpegP("sd")) / mps.setdash
+local rd = ( lpegP("rd")) / mps.resetdash
+
+local s = ( (cnumber * sp^0)^2 * lpegP("s") ) / mps.scale
+local t = (lpegP("[") * (cnumber * sp^0)^6 * lpegP("]") * sp * lpegP("t") ) / mps.concat
+
+-- experimental
+
+local preamble = (
+ prolog + setup +
+ boundingbox + highresboundingbox + specials + special +
+ comment
+)
+
+local procset = (
+ lj + ml + lc +
+ c + l + m + n + p + r +
+ R + C + G +
+ S + F + B + W +
+ vlw + hlw +
+ Q + q +
+ sd + rd +
+ t + s +
+ fshow +
+ P
+)
+
+local verbose = (
+ curveto + lineto + moveto + newpath + closepath + rlineto +
+ setrgbcolor + setcmykcolor + setgray +
+ setlinejoin + setmiterlimit + setlinecap +
+ stroke + fill + clip + both +
+ setlinewidth_x + setlinewidth_y +
+ gsave + grestore +
+ concat + scale +
+ fshow +
+ setdash + -- no resetdash
+ showpage
+)
+
+-- order matters in terms of speed / we could check for procset first
+
+local captures_old = ( space + verbose + preamble )^0
+--~ local captures_new = ( space + procset + preamble + verbose )^0
+local captures_new = ( space + verbose + procset + preamble )^0
+
+local function parse(m_data)
+ if find(m_data,"%%%%BeginResource: procset mpost") then
+ lpegmatch(captures_new,m_data)
+ else
+ lpegmatch(captures_old,m_data)
+ end
+end
+
+-- main converter
+
+local a_colorspace = attributes.private('colormodel')
+
+function mptopdf.convertmpstopdf(name)
+ resetall()
+ local ok, m_data, n = resolvers.loadbinfile(name, 'tex') -- we need a binary load !
+ if ok then
+ mps.colormodel = tex.attribute[a_colorspace]
+ statistics.starttiming(mptopdf)
+ mptopdf.n = mptopdf.n + 1
+ pdfcode(format("\\letterpercent\\space mptopdf begin: n=%s, file=%s",mptopdf.n,file.basename(name)))
+ pdfcode("q 1 0 0 1 0 0 cm")
+ parse(m_data)
+ pdfcode(pdffinishtransparencycode())
+ pdfcode("Q")
+ pdfcode("\\letterpercent\\space mptopdf end")
+ resetall()
+ statistics.stoptiming(mptopdf)
+ else
+ commands.writestatus("mptopdf","file '%s' not found",name)
+ end
+end
+
+
+-- status info
+
+statistics.register("mps conversion time",function()
+ local n = mptopdf.n
+ if n > 0 then
+ return format("%s seconds, %s conversions", statistics.elapsedtime(mptopdf),n)
+ else
+ return nil
+ end
+end)
diff --git a/tex/context/base/meta-pdf.mkii b/tex/context/base/meta-pdf.mkii
new file mode 100644
index 000000000..2099b0d37
--- /dev/null
+++ b/tex/context/base/meta-pdf.mkii
@@ -0,0 +1,2761 @@
+%D \module
+%D [ file=meta-pdf,
+%D version=2006.06.07,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Conversion to \PDF,
+%D author=Hans Hagen \& others (see text),
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Formerly known as supp-pdf.tex and supp-mpe.tex.
+
+%D We will clean up the color mess later.
+
+%D These macros are written as generic as possible. Some
+%D general support macro's are loaded from a small module
+%D especially made for non \CONTEXT\ use. In this module I
+%D use a matrix transformation macro written by Tanmoy
+%D Bhattacharya. Thanks to extensive testing by Sebastian
+%D Ratz I was able to complete this module within reasonable
+%D time. This module has support for \METAPOST\ extensions
+%D built in.
+%D
+%D Daniel H. Luecking came up with a better (more precise)
+%D transformation method. You can recognize his comment by
+%D his initials. (We keep the old code around because it's a
+%D nice illustration on how a module like this evolves.)
+
+% Beware, we cannot use 0pt here by defaukt since it may be
+% defined in the range \dimen 0 - 20 which we happen to use
+% as scratch registers; for this reason we start allocating
+% scratch registers > 20
+
+%D This module handles some \PDF\ conversion and insertions
+%D topics. By default, the macros use the \PDFTEX\ primitive
+%D \type{\pdfliteral} when available. Since \PDFTEX\ is now the
+%D default engine for \TEX\ distributions, we need a more complex
+%D test.
+
+\writestatus{loading}{MetaPost Graphics / MPS to PDF}
+
+\unprotect
+
+\ifx\PDFcode \undefined \let\PDFcode \gobbleoneargument \fi
+\ifx\PDFcomment\undefined \def\PDFcomment#1{\PDFcode{\letterpercent\space#1}} \fi
+
+%D First we define a handy constant:
+
+\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+%D \macros
+%D {pdfimage,pdfimages,pdfclippedimage}
+%D
+%D Starting with pdftex version 14, images are included more
+%D natural to the form embedding. This enables alternative
+%D images to be embedded.
+%D
+%D \starttyping
+%D \pdfimage <optional dimensions> {file}
+%D \pdfimages <optional dimensions> {high res file} {low res file}
+%D \stoptyping
+%D
+%D The first one replaces the pre||version||14 original,
+%D while the latter provides alternative images.
+%D
+%D The next macro is dedicated to Maarten Gelderman, who
+%D needed to paste prepared \PDF\ pages into conference
+%D proceedings.
+%D
+%D \starttyping
+%D \pdfclippedimage <optional dimensions> {file} {l} {r} {t} {b}
+%D \stoptyping
+
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13 % still relevant?
+
+ \def\pdfimage#1#%
+ {\dopdfimage{#1}}
+
+ \def\dopdfimage#1#2%
+ {\immediate\pdfximage#1{#2}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfimages#1#%
+ {\dopdfimages{#1}}
+
+ \def\dopdfimages#1#2#3%
+ {\immediate\pdfximage#1{#2}%
+ \immediate\pdfobj{[ << /Image \the\pdflastximage\space0 R /DefaultForPrinting true >> ]}%
+ \immediate\pdfximage#1 attr {/Alternates \the\pdflastobj\space0 R}{#3}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfclippedimage#1#% specs {file}{left}{right}{top}{bottom}
+ {\dopdfclippedimage{#1}}
+
+ \def\dopdfclippedimage#1#2#3#4#5#6%
+ {\bgroup
+ \pdfximage#1{#2}%
+ \setbox\scratchbox\hbox{\pdfrefximage\pdflastximage}%
+ \hsize\dimexpr\wd\scratchbox-#3-#4\relax
+ \vsize\dimexpr\ht\scratchbox-#5-#6\relax
+ \setbox\scratchbox\vbox to \vsize
+ {\vskip-#5\hbox to \hsize{\hskip-#3\box\scratchbox\hss}}%
+ \pdfxform\scratchbox
+ \pdfrefxform\pdflastxform
+ \egroup}
+
+\fi \fi
+
+%D \macros
+%D {convertMPtoPDF}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. The traditional method is in the MkII file.
+
+%D The main conversion command is:
+%D
+%D \starttyping
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptyping
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttyping
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptyping
+
+%D \macros
+%D {makeMPintoPDFobject,lastPDFMPobject}
+%D
+%D For experts there are a few more options. When attributes
+%D are to be added, the code must be embedded in an object
+%D accompanied with the appropriate directives. One can
+%D influence this process with \type {\makeMPintoPDFobject}.
+%D
+%D This option defaults to~0, because \CONTEXT\ takes care
+%D of objects at another level, which saves some bytes.
+%D
+%D \starttabulate[|l|l|p|]
+%D \NC 0 \NC never \NC don't use an object \NC\NR
+%D \NC 1 \NC always \NC always use an object \NC\NR
+%D \NC 2 \NC optional \NC use object when needed \NC\NR
+%D \stoptabulate
+%D
+%D The last object number used is avaliable in the macro
+%D \type {\lastPDFMPobject}.
+
+\ifx\makeMPintoPDFobject \undefined \chardef\makeMPintoPDFobject \zerocount \fi
+\ifx\blackoutMPgraphic \undefined \chardef\blackoutMPgraphic \plusone \fi
+\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion \fi
+
+\let\lastPDFMPobject \!!zerocount
+\let\currentPDFresources\empty
+\let\setMPextensions \relax
+
+\def\PDFMPformoffset
+ {\ifx\objectoffset\undefined\zeropoint\else\objectoffset\fi}
+
+\def\resetMPvariables#1#2#3%
+ {\global\let\MPwidth \!!zeropoint
+ \global\let\MPheight\!!zeropoint
+ \global\let\MPllx \!!zerocount
+ \global\let\MPlly \!!zerocount
+ \global\let\MPurx \!!zerocount
+ \global\let\MPury \!!zerocount
+ \xdef\MPxscale {#2}\ifx\MPxscale\empty\let\MPxscale\!!plusone\fi
+ \xdef\MPyscale {#3}\ifx\MPyscale\empty\let\MPyscale\!!plusone\fi
+ \xdef\MPfilename {#1}}
+
+%D The main macro:
+
+\def\convertMPtoPDF#1#2#3%
+ {\resetMPvariables{#1}{#2}{#3}%
+ \vbox\bgroup
+ \forgetall
+ \offinterlineskip
+ \ifx\pdfdecimaldigits\undefined\else \pdfdecimaldigits=5 \fi % new
+ \global\let\MPheight\!!zeropoint
+ \global\let\MPwidth \!!zeropoint
+ \setbox\scratchbox\vbox\bgroup
+ \message{[MP to PDF]}%
+ \startMPresources
+ \PDFcomment{mps begin}%
+ \PDFcode{q}%
+ \PDFcode{1 0 0 1 0 0 cm}%
+ \ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi
+ \doprocessMPtoPDFfile}
+
+\def\processMPtoPDFfile#1#2#3% obsolete
+ {\resetMPvariables{#1}{#2}{#3}%
+ \bgroup
+ \let\finishMPgraphic\egroup
+ \doprocessMPtoPDFfile}
+
+\def\doprocessMPtoPDFfile
+ {\setMPspecials
+ \setMPextensions
+ \the\everyMPtoPDFconversion
+ \catcode`\^^M=\@@endofline
+ \startMPscanning
+ \let\do\empty
+ \donefalse
+ \let\handleMPsequence\dohandleMPsequence
+ \input\MPfilename\relax}
+
+\def\finishMPgraphic
+ {\PDFcode{Q}%
+ \PDFcomment{mps end}%
+ \stopMPresources
+ \egroup
+ \setbox\scratchbox\hbox\bgroup
+ \hskip-\MPllx\onebasepoint
+ \raise-\MPlly\onebasepoint
+ \box\scratchbox
+ \egroup
+ \setbox\scratchbox\vbox to \MPheight\bgroup
+ \vfill
+ \hsize\MPwidth
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup
+ \wd\scratchbox\MPwidth
+ \ht\scratchbox\MPheight
+ \dopackageMPgraphic\scratchbox
+ \egroup
+ \endinput}
+
+%D A common hook.
+
+\let\MPfshowcommand\empty
+
+%D Objects.
+
+\def\dopackageMPgraphic#1% #1 = boxregister
+ {\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
+ % an existing value of 2 signals object support (set elsewhere)
+ \chardef\makeMPintoPDFobject\plusone
+ \fi\fi
+ \ifcase\makeMPintoPDFobject
+ \box#1%
+ \or
+ \scratchdimen\PDFMPformoffset\relax
+ \ifdim\scratchdimen>\zeropoint % compensate for error
+ \setbox#1\vbox spread 2\scratchdimen
+ {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+ \fi
+ \setMPPDFobject{\currentPDFresources}{#1}%
+ \ifdim\scratchdimen>\zeropoint % compensate for error
+ \vbox to \MPheight
+ {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+ \else
+ \getMPPDFobject
+ \fi
+ \global\let\currentPDFresources\empty
+ \else
+ \box#1%
+ \fi}
+
+\def\setMPPDFobject#1#2% resources boxnumber
+ {\ifx\pdfxform\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifx\pdftexversion\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifnum\pdftexversion<14
+ \def\getMPPDFobject{\box#2}%
+ \else
+ \ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi
+ \immediate\pdfxform resources{#1}#2%
+ \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}%
+ \fi\fi\fi}
+
+\let\getMPPDFobject\relax
+
+%D \macros
+%D {deleteMPgraphic,
+%D startMPresources,
+%D stopMPresources}
+
+\ifx\deleteMPgraphic\undefined
+ \def\deleteMPgraphic#1{}
+\fi
+
+\ifx\startMPresources\undefined
+ \let\startMPresources\relax
+ \let\stopMPresources\relax
+\fi
+
+%D We implement extensions by using the \METAPOST\ special
+%D mechanism. Opposite to \TEX's specials, the \METAPOST\ ones
+%D are flushed before or after the graphic data, but thereby
+%D are no longer connected to a position.
+%D
+%D We implement specials by overloading the \type {fill}
+%D operator. By counting the fills, we can let the converter
+%D treat the appropriate fill in a special way. The
+%D specification of the speciality can have two forms,
+%D determined by the setting of a boolean variable:
+%D
+%D \starttyping
+%D _inline_specials_ := false ; % comment like code (default)
+%D _inline_specials_ := true ; % command like code
+%D \stoptyping
+%D
+%D When the specification is embedded as comment, it looks
+%D like:
+%D
+%D \starttyping
+%D %%MetaPostSpecial <size> <data> <number> <identifier>
+%D \stoptyping
+%D
+%D The in||line alternative is more tuned for \POSTSCRIPT,
+%D since it permits us to define a macro \type {special}.
+%D
+%D \starttyping
+%D inline : <data> <number> <identifier> <size> special
+%D \stoptyping
+%D
+%D The \type {identifier} determines what to do, and the data
+%D can be used to accomplish this. A type~2 shading function
+%D has identifier~2. Alltogether, the number of parameters is
+%D specified in \type {size}. The \type {number} is the number
+%D of the fill that needs the special treatment. For a type~2
+%D and~3 shaded fill, the datablock contains the following
+
+%D data:
+%D
+%D \starttyping
+%D from to n inner_r g b x y outer_r g b x y
+%D from to n inner_r g b x y radius outer_r g b x y radius
+%D \stoptyping
+
+\newconditional\manyMPspecials \settrue\manyMPspecials
+
+%D In case of \PDF, we need to prepare resourcs.
+
+\newtoks\MPstartresources
+\newtoks\MPstopresources
+
+\def\startMPresources
+ {\the\MPstartresources}
+
+\def\stopMPresources
+ {\the\MPstopresources}
+
+%D Some day we may consider collecting local resources.
+
+\appendtoks
+ \global\let\currentPDFresources\empty % kind of redundant
+\to \MPstartresources
+
+% \appendtoks
+% \collectPDFresources
+% \global\let\currentPDFresources\collectedPDFresources
+% \to \MPstopresources
+
+\appendtoksonce
+ \the\everyPDFxform
+\to \MPstopresources
+
+%D Since colors are not subjected to transformations, we can
+%D only use colors as signal. In our case, we use a dummy colored
+%D path with a red color component of \type {0.n}, so \type
+%D {0.001} is the first path and \type {0.010} the tenth. Since
+%D \METAPOST strips trailing zeros, we have to padd the string.
+
+\newif\ifMPcmykcolors
+\newif\ifMPspotcolors
+
+\def\dohandleMPrgb #1#2#3{\revokeMPtransparencyspecial\execcolorR #1:#2:#3:0:0\od}
+\def\dohandleMPcmyk#1#2#3#4{\revokeMPtransparencyspecial\execcolorC#1:#2:#3:#4:0:0\od}
+\def\dohandleMPgray #1{\revokeMPtransparencyspecial\execcolorS #1:0:0\od}
+\def\dohandleMPspot#1#2#3#4{\revokeMPtransparencyspecial\execcolorP#1:#2:#3:#4:0:0\od}
+
+%D Specials:
+
+\settrue \manyMPspecials \newcount\nofMParguments \let\extraMPpathcode\empty
+
+\def\@@MP {@@MP}
+\def\@@MPSK{@MPSK@}
+
+\def\MPspecial{\@@MPSK\@@MPSK\gMPs\nofMParguments}
+
+\def\defineMPspecial#1#2%
+ {\setvalue{\@@MPSK\@@MPSK#1}{#2}}
+
+%D Special number~1 is dedicated to \CMYK\ support. If you
+%D want to know why: look at this:
+%D
+%D \startbuffer[mp]
+%D fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ;
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \startcombination[4*1]
+%D {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3}
+%D {\definecolor[test][c=.9,y=.15] \processMPbuffer[mp]} {c=.9 y=.15}
+%D {\definecolor[test][c=.25,y=.8] \processMPbuffer[mp]} {c=.25 y=.8}
+%D {\definecolor[test][c=.45,y=.1] \processMPbuffer[mp]} {c=.45 y=.1}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure
+%D {\CMYK\ support disabled,
+%D conversion to \RGB.}
+%D {\setupcolors[cmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no support in \METAPOST.}
+%D {\setupcolors[cmyk=ja,mpcmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no conversion to \RGB,
+%D support in \METAPOST}
+%D {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]}
+
+\defineMPspecial{1}
+ {\ifMPcmykcolors
+ \setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPcmykcolor{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}}%
+ \fi}
+
+\defineMPspecial{2}
+ {\ifMPspotcolors
+ \setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPspotcolor{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}}%
+% \checkMPspot{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}%
+ \fi}
+
+% \def\checkMPspot#1#2#3#4%
+% {\expanded{\resolveMPspotcolor#1 #2 #3 #4}\end
+% \ifx\MPspotspace\MPresolvedspace
+% \edef\MPspotspacespec{/\MPspotspace\space}%
+% \doifinstringelse\MPspotspacespec\currentMPcolorspaces
+% \donothing\registerMPcolorspace
+% \fi}
+
+\let\revokeMPtransparencyspecial\relax
+
+\def\dohandleMPrgbcolor #1#2#3{\revokeMPtransparencyspecial\execcolorR #1:#2:#3:0:0\od}
+\def\dohandleMPcmykcolor#1#2#3#4{\revokeMPtransparencyspecial\execcolorC#1:#2:#3:#4:0:0\od}
+\def\dohandleMPgraycolor #1{\revokeMPtransparencyspecial\execcolorS #1:0:0\od}
+\def\dohandleMPspotcolor#1#2#3#4{\revokeMPtransparencyspecial\execcolorP#1:#2:#3:#4:0:0\od}
+
+%D Transparency support used specials 60 (rgb) and 61
+%D (cmyk).
+%D
+%D \startbufferFshade
+
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor transparent(1,.5,yellow) ;
+%D fill p rotated 210 withcolor transparent(1,.5,green) ;
+%D fill p rotated 330 withcolor transparent(1,.5,blue) ;
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D One can also communicate colors between \CONTEXT\ and
+%D \METAPOST:
+%D
+%D \startbuffer
+%D \definecolor[tcyan] [c=1,k=.2,t=.5]
+%D \definecolor[tmagenta][m=1,k=.2,t=.5]
+%D \definecolor[tyellow] [y=1,k=.2,t=.5]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor \MPcolor{tcyan} ;
+%D fill p rotated 210 withcolor \MPcolor{tmagenta} ;
+%D fill p rotated 330 withcolor \MPcolor{tyellow} ;
+%D \stopbuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D We save all the three components needed in one macro,
+%D just to save hash space.
+
+\def\dohandleMPrgbtransparency #1#2#3#4#5{\execcolorR #1:#2:#3:#4:#5\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
+\def\dohandleMPcmyktransparency#1#2#3#4#5#6{\execcolorC#1:#2:#3:#4:#5:#6\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
+\def\dohandleMPgraytransparency #1#2#3{\execcolorS #1:#2:#3\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
+\def\dohandleMPspottransparency#1#2#3#4#5#6{\execcolorP#1:#2:#3:#4:#5:#6\od\let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial}
+
+\def\dorevokeMPtransparencyspecial
+ {\PDFcode{\PDFtransparencyresetidentifier\space gs}%
+ \let\revokeMPtransparencyspecial\relax}
+
+\defineMPspecial{3} % rgb
+ {\setxvalue{\@@MPSK\gMPs6}{\noexpand\dohandleMPrgbtransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs1}{\gMPs2}}}
+
+\defineMPspecial{4} % cmyk
+ {\setxvalue{\@@MPSK\gMPs7}{\noexpand\dohandleMPcmyktransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs1}{\gMPs2}}}
+
+\defineMPspecial{5} % spot
+ {\setxvalue{\@@MPSK\gMPs7}{\noexpand\dohandleMPspottransparency{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs1}{\gMPs2}}%
+ }%\checkMPspot{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}
+
+%D Shading is an example of a more advanced graphic feature,
+%D but users will seldom encounter those complications. Here
+%D we only show a few simple examples, but many other
+%D alternatives are possible by setting up the functions built
+%D in \PDF\ in the appropriate way.
+%D
+%D Shading has to do with interpolation between two or more
+%D points or user supplied ranges. In \PDF, the specifications
+%D of a shade has to be encapsulated in objects and passed on
+%D as resources. This is a \PDF\ level 1.3. feature. One can
+%D simulate three dimensional shades as well and define simple
+%D functions using a limited set of \POSTSCRIPT\ primitives.
+%D Given the power of \METAPOST\ and these \PDF\ features, we
+%D can achieve superb graphic effects.
+%D
+%D Since everything is hidden in \TEX\ and \METAPOST\ graphics,
+%D we can stick to high level \CONTEXT\ command, as shown in
+%D the following exmples.
+%D
+%D \startbuffer
+%D \startuniqueMPgraphic{CircularShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D circular_shade(p,0,.2red,.9red) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{LinearShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,0,.2blue,.9blue) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{DuotoneShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,2,.5green,.5red) ;
+%D \stopuniqueMPgraphic
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These graphics can be hooked into the overlay mechanism,
+%D which is available in many commands.
+%D
+%D \startbuffer
+%D \defineoverlay[demo 1][\uniqueMPgraphic{CircularShade}]
+%D \defineoverlay[demo 2][\uniqueMPgraphic {LinearShade}]
+%D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These backgrounds can for instance be applied to \type
+%D {\framed}:
+%D
+%D \startbuffer
+%D \setupframed[width=3cm,height=2cm,frame=off]
+%D \startcombination[3*1]
+%D {\framed[backgroundachtergrond=demo 1]{\bfd \white Demo 1}} {}
+%D {\framed[backgroundachtergrond=demo 2]{\bfd \white Demo 2}} {}
+%D {\framed[backgroundachtergrond=demo 3]{\bfd \white Demo 3}} {}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D There are a few more alternatives, determined by the second
+%D parameter passed to \type {circular_shade} and alike.
+%D
+%D \def\SomeShade#1#2#3#4#5%
+%D {\startuniqueMPgraphic{Shade-#1}
+%D width := \overlaywidth ;
+%D height := \overlayheight ;
+%D path p ; p := unitsquare xscaled width yscaled height ;
+%D #2_shade(p,#3,#4,#5) ;
+%D \stopuniqueMPgraphic
+%D \defineoverlay[Shade-#1][\uniqueMPgraphic{Shade-#1}]%
+%D \framed[backgroundachtergrond=Shade-#1,width=2cm,height=2cm,frame=off]{}}
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{10}{circular}{0}{.3blue}{.9blue}} {circular 0}
+%D {\SomeShade{11}{circular}{1}{.3blue}{.9blue}} {circular 1}
+%D {\SomeShade{12}{circular}{2}{.3blue}{.9blue}} {circular 2}
+%D {\SomeShade{13}{circular}{3}{.3blue}{.9blue}} {circular 3}
+%D {\SomeShade{14}{circular}{4}{.3blue}{.9blue}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0}
+%D {\SomeShade{21}{circular}{1}{.9green}{.3green}} {circular 1}
+%D {\SomeShade{22}{circular}{2}{.9green}{.3green}} {circular 2}
+%D {\SomeShade{23}{circular}{3}{.9green}{.3green}} {circular 3}
+%D {\SomeShade{24}{circular}{4}{.9green}{.3green}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[4*1]
+%D {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0}
+%D {\SomeShade{31}{linear}{1}{.3red}{.9red}} {linear 1}
+%D {\SomeShade{32}{linear}{2}{.3red}{.9red}} {linear 2}
+%D {\SomeShade{33}{linear}{3}{.3red}{.9red}} {linear 3}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D These macros closely cooperate with the \METAPOST\ module
+%D \type {mp-spec.mp}, which is part of the \CONTEXT\
+%D distribution.
+%D
+%D The low level (\PDF) implementation is based on the \TEX\
+%D based \METAPOST\ to \PDF\ converter. Shading is supported
+%D by overloading the \type {fill} operator as implemented
+%D earlier. In \PDF\ type~2 and~3 shading functions are
+%D specified in terms of:
+%D
+%D \starttabulate[|Tl|l|]
+%D \NC /Domain \NC sort of meeting range \NC \NR
+%D \NC /C0 \NC inner shade \NC \NR
+%D \NC /C1 \NC outer shade \NC \NR
+%D \NC /N \NC smaller values, bigger inner circles \NC \NR
+%D \stoptabulate
+
+\newcount\currentPDFshade % 0 % global (document wide) counter
+
+% \def\dosetMPsomePDFshade#1#2% 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
+ {<</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \immediate\pdfobj
+ {<</ShadingType #1
+ /ColorSpace /\MPresolvedspace
+ /Function \the\pdflastobj\space 0 R
+ /Coords [\MPshadeC]
+ /Extend [true true]>>}%
+ \global\advance\currentPDFshade \plusone
+ \appendtoPDFdocumentshades{/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }%
+ \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
+
+\def\dosetMPlinearshade {\dosetMPsomePDFshade2}% #1
+\def\dosetMPcircularshade{\dosetMPsomePDFshade3}% #1
+
+\defineMPspecial{30}
+ {\expanded{\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
+ \expanded{\resolveMPrgbcolor{\gMPs{9}}{\gMPs{10}}{\gMPs{11}}}\to\MPshadeB
+ \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}}%
+ \dosetMPlinearshade{\gMPs{14}}}
+
+\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%
+ {\revokeMPtransparencyspecial
+ \settrue\ignoreMPpath
+ \def\extraMPpathcode{/Sh#1 sh Q}%
+ \chardef\finiMPpath\zerocount
+ \PDFcode{q /Pattern cs}}
+
+%D Figure inclusion is kind of strange to \METAPOST, but when
+%D Santiago Muelas started discussing this with me, I was able
+%D to cook up a solution using specials.
+
+\defineMPspecial{10}
+ {\setxvalue{\@@MPSK\gMPs8}%
+ {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}}
+
+\def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig
+ {\global\letvalue{\@@MPSK#8}\empty
+ \vbox to \zeropoint
+ {\vss
+ \hbox to \zeropoint
+ {\ifcase\pdfoutput\or % will be hooked into the special driver
+ \doiffileelse{#7}
+ {\doifundefinedelse{mps:x:#7}
+ {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}%
+ \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}%
+ {\message{[reusing figure #7]}}%
+ \PDFcode{q #1 #2 #3 #4 #5 #6 cm}%
+ \rlap{\getvalue{mps:x:#7}}%
+ \PDFcode{Q}}
+ {\message{[unknown figure #7]}}%
+ \fi
+ \hss}}}
+
+%D An example of using both special features is the
+%D following.
+%D
+%D \starttyping
+%D \startMPpage
+%D externalfigure "hakker1b.png" scaled 22cm rotated 10 shifted (-2cm,0cm);
+%D externalfigure "hakker1b.png" scaled 10cm rotated -10 ;
+%D externalfigure "hakker1b.png" scaled 7cm rotated 45 shifted (8cm,12cm) ;
+%D path p ; p := unitcircle xscaled 15cm yscaled 20cm;
+%D path q ; q := p rotatedaround(center p,90) ;
+%D path r ; r := buildcycle(p,q) ; clip currentpicture to r ;
+%D path s ; s := boundingbox currentpicture enlarged 5mm ;
+%D picture c ; c := currentpicture ; currentpicture := nullpicture ;
+%D circular_shade(s,0,.2red,.9red) ;
+%D addto currentpicture also c ;
+%D \stopMPpage
+%D \stoptyping
+
+%D This is some experimental hyperlink driver that I wrote
+%D for Mark Wicks.
+
+\defineMPspecial{20}
+ {\setxvalue{\@@MPSK\gMPs6}%
+ {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}}
+
+\def\handleMPhyperlink#1#2#3#4#5#6%
+ {\global\letvalue{\@@MPSK#6}\empty
+ \setbox\scratchbox\hbox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax
+ \ht\scratchbox\dimexpr-#2\onebasepoint+#4\onebasepoint\relax
+ \incolorfalse
+ \gotobox{\box\scratchbox}[#5]}%
+ \setbox\scratchbox\hbox
+ {\hskip\dimexpr\MPxoffset\onebasepoint+#1\onebasepoint\relax
+ \raise\dimexpr\MPyoffset\onebasepoint+#2\onebasepoint\relax
+ \box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox}
+
+%D This special (number 50) passes positions to a tex file.
+%D This method uses a two||pass approach an (mis|)|used the
+%D context positioning macros. In \type {core-pos} we will
+%D implement the low level submacro needed.
+%D
+%D \startbuffer
+%D \definelayer[test]
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-1},y=\MPy{somepos-1}]
+%D {Whatever we want here!}
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-2},y=\MPy{somepos-2}]
+%D {Whatever we need there!}
+%D
+%D \startuseMPgraphic{oeps}
+%D draw fullcircle scaled 6cm withcolor red ;
+%D register ("somepos-1",1cm,2cm,center currentpicture) ;
+%D register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here the width and height are not realy used, but one can
+%D imagine situations where tex has to work with values
+%D calculated by \METAPOST.
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D Later we will implement a more convenient macro:
+%D
+%D \starttyping
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \stoptyping
+
+\defineMPspecial{50} % x y width height label
+ {\dosavepositionwhd
+ {\gMPs5}%
+ {0}%
+ {\the\dimexpr-\MPllx\onebasepoint+\gMPs1\onebasepoint\relax}
+ {\the\dimexpr\gMPs2\onebasepoint-\scratchdimen+\MPury\onebasepoint\relax}%
+ {\the\dimexpr\gMPs3\onebasepoint\relax}%
+ {\the\dimexpr\gMPs4\onebasepoint\relax}%
+ {0pt}}
+
+%D A few auxiliary macros. This will move to colo-ini.
+
+\def\MPgrayspace{DeviceGray}
+\def\MPrgbspace {DeviceRGB}
+\def\MPcmykspace{DeviceCMYK}
+\let\MPspotspace\MPgrayspace
+
+\def\MPcmykBlack{0 0 0 0}
+\def\MPcmykWhite{0 0 0 1}
+
+\def\startMPcolorresolve
+ {\bgroup
+ \def\dostartgraycolormode##1%
+ {\global\let\MPresolvedspace\MPgrayspace
+ \xdef\MPresolvedcolor{##1}}%
+ \def\dostartrgbcolormode ##1##2##3%
+ {\global\let\MPresolvedspace\MPrgbspace
+ \xdef\MPresolvedcolor{##1 ##2 ##3}}%
+ \def\dostartcmykcolormode##1##2##3##4%
+ {\global\let\MPresolvedspace\MPcmykspace
+ \xdef\MPresolvedcolor{##1 ##2 ##3 ##4}}%
+ \def\dostartspotcolormode##1##2%
+ {\global\let\MPspotspace\empty % left over ?
+ \xdef\MPresolvedspace{##1}%
+ \xdef\MPresolvedcolor{##2}%
+ \global\let\MPspotspace\MPresolvedspace}% signal
+ \dostartgraycolormode\!!zerocount} % kind of hackery initialization
+
+\let\stopMPcolorresolve\egroup
+
+\def\resolveMPrgbcolor#1#2#3\to#4%
+ {\startMPcolorresolve
+ \execcolorR#1:#2:#3:0:0\od
+ \stopMPcolorresolve
+ \let#4\MPresolvedcolor}
+
+\def\resolveMPcmykcolor#1#2#3#4\to#5%
+ {\startMPcolorresolve
+ \execcolorC#1:#2:#3:#4:0:0\od
+ \stopMPcolorresolve
+ \let#5\MPresolvedcolor}
+
+\def\resolveMPgraycolor#1\end\to#2%
+ {\startMPcolorresolve
+ \execcolorS#1:0:0\od
+ \stopMPcolorresolve
+ \let#2\MPresolvedcolor}
+
+\def\resolveMPspotcolor#1#2#3#4\end\to#5%
+ {\startMPcolorresolve
+ \ifnum#2>\plusone
+ \checkmultitonecolor{#1}%
+ \fi
+ \execcolorP#1:#2:#3:#4:0:0\od
+ \stopMPcolorresolve
+ \let#5\MPresolvedcolor}
+
+%D \macros
+%D {dogetPDFmediabox}
+%D
+%D The next macro can be used to find the mediabox of a \PDF\
+%D illustration.
+%D
+%D \starttyping
+%D \dogetPDFmediabox
+%D {filename}
+%D {new dimen}{new dimen}{new dimen}{new dimen}
+%D \stoptyping
+%D
+%D Beware of dimen clashes: this macro uses the 5~default
+%D scratch registers! When no file or mediabox is found, the
+%D dimensions are zeroed.
+
+\def\dogetPDFmediabox#1#2#3#4#5%
+ {\bgroup
+ \def\PDFxscale{1}%
+ \def\PDFyscale{1}%
+ \uncatcodespecials
+ \endlinechar\minusone
+ \def\checkPDFtypepage##1/Type /Page##2##3\done%
+ {\ifx##2\relax
+ \else\if##2s% accept /Page and /Pages
+ \let\doprocessPDFline\findPDFmediabox
+ \else
+ \let\doprocessPDFline\findPDFmediabox
+ \fi\fi}%
+ \def\findPDFtypepage
+ {\expandafter\checkPDFtypepage\fileline/Type /Page\relax\done}%
+ \def\checkPDFmediabox##1/MediaBox##2##3\done%
+ {\ifx##2\relax \else
+ \setPDFmediabox##2##3\done
+ \fileprocessedtrue
+ \fi}%
+ \def\findPDFmediabox
+ {\expandafter\checkPDFmediabox\fileline/MediaBox\relax\done}%
+ \let\doprocessPDFline\findPDFtypepage
+ \doprocessfile\scratchread{#1}\doprocessPDFline
+ \egroup
+ \ifx\PDFxoffset\undefined
+ #2=\zeropoint
+ #3=\zeropoint
+ #4=\zeropoint
+ #5=\zeropoint
+ \else
+ #2=\PDFxoffset\onebasepoint
+ #3=\PDFyoffset\onebasepoint
+ #4=\PDFwidth
+ #5=\PDFheight
+ \fi}
+
+\def\setPDFboundingbox#1#2#3#4#5#6%
+ {\dimen0=#1\dimen0=#5\dimen0
+ \ScaledPointsToBigPoints{\number\dimen0}\PDFxoffset
+ \dimen0=#3\dimen0=#5\dimen0
+ \xdef\PDFwidth{\the\dimen0}%
+ \dimen0=#2\dimen0=#6\dimen0
+ \ScaledPointsToBigPoints{\number\dimen0}\PDFyoffset
+ \dimen0=#4\dimen0=#6\dimen0
+ \xdef\PDFheight{\the\dimen0}%
+ \global\let\PDFxoffset\PDFxoffset
+ \global\let\PDFyoffset\PDFyoffset}
+
+\def\setPDFmediabox#1[#2 #3 #4 #5]#6\done
+ {\dimen2=#2\onebasepoint\dimen2=-\dimen2 % \dimen2=-#2\onebasepoint also works since tex handles --
+ \dimen4=#3\onebasepoint\dimen4=-\dimen4 % \dimen4=-#3\onebasepoint also works since tex handles --
+ \dimen6=#4\onebasepoint\advance\dimen6 \dimen2
+ \dimen8=#5\onebasepoint\advance\dimen8 \dimen4
+ \setPDFboundingbox{\dimen2}{\dimen4}{\dimen6}{\dimen8}\PDFxscale\PDFyscale}
+
+%D End of soon obsolete code.
+
+\startMPinitializations
+ mp_shade_version := 2 ;
+\stopMPinitializations
+
+%D Here comes the traditional \MKII\ converter.
+%D
+%D Because we want to test as fast as possible, we first
+%D define the \POSTSCRIPT\ operators that \METAPOST\ uses.
+%D We don't define irrelevant ones, because these are
+%D skipped anyway.
+%D
+%D The converter can be made a bit faster by replacing the
+%D two test macros (the ones with the many \type {\if's}) by
+%D a call to named branch macros (something \typ {\getvalue
+%D {xPSmoveto}}. For everyday documents with relatively
+%D small graphics the gain in speed can be neglected.
+
+\def \PScurveto {curveto}
+\def \PSlineto {lineto}
+\def \PSmoveto {moveto}
+\def \PSshowpage {showpage}
+\def \PSnewpath {newpath}
+\def \PSfshow {fshow}
+\def \PSclosepath {closepath}
+\def \PSfill {fill}
+\def \PSstroke {stroke}
+\def \PSclip {clip}
+\def \PSrlineto {rlineto}
+\def \PSsetlinejoin {setlinejoin}
+\def \PSsetlinecap {setlinecap}
+\def \PSsetmiterlimit {setmiterlimit}
+\def \PSsetgray {setgray}
+\def \PSsetrgbcolor {setrgbcolor}
+\def \PSsetcmykcolor {setcmykcolor}
+\def \PSsetdash {setdash}
+\def \PSgsave {gsave}
+\def \PSgrestore {grestore}
+\def \PStranslate {translate}
+\def \PSscale {scale}
+\def \PSconcat {concat}
+\def \PSdtransform {dtransform}
+\def \PSsetlinewidth {setlinewidth}
+\def \PSpop {pop}
+
+\def \PSnfont {nfont} % was needed for TUG98 proceedings
+\def \PSspecial {special} % extensions to MetaPost
+
+%D A previous version set \type {%} to ignore, which
+%D simplified the following definitions. At the start of
+%D conversion the percent character was made active again.
+%D Because the whole graphic is one paragraph (there are no
+%D empty lines) this does not give the desired effect. This
+%D went unnoticed untill Scott Pakin sent me a test file
+%D percent characters in a string. So, from now on we have
+%D to prefix the following strings with percentages.
+
+%D Some day I'll figure out a better solution (line by line reading
+%D using \ETEX).
+
+\edef \PSBoundingBox {\letterpercent\letterpercent BoundingBox:}
+\edef \PSHiResBoundingBox {\letterpercent\letterpercent HiResBoundingBox:}
+\edef \PSExactBoundingBox {\letterpercent\letterpercent ExactBoundingBox:}
+\edef \PSMetaPostSpecial {\letterpercent\letterpercent MetaPostSpecial:}
+\edef \PSMetaPostSpecials {\letterpercent\letterpercent MetaPostSpecials:}
+\edef \PSPage {\letterpercent\letterpercent Page:}
+\edef \PSBeginProlog {\letterpercent\letterpercent BeginProlog}
+\edef \PSEndProlog {\letterpercent\letterpercent EndProlog}
+\edef \PSEof {\letterpercent\letterpercent EOF}
+
+%D By the way, the \type {setcmykcolor} operator is not
+%D output by \METAPOST\ but can result from converting the
+%D \cap{RGB} color specifications, as implemented in
+%D \type{supp-mps}.
+
+%D In \POSTSCRIPT\ arguments precede the operators. Due to the
+%D fact that in some translations we need access to those
+%D arguments, and also because sometimes we have to skip them,
+%D we stack them up. The stack is one||dimensional for non path
+%D operators and two||dimensional for operators inside a path.
+%D This is because we have to save the whole path for
+%D (optional) postprocessing. Values are pushed onto the stack
+%D by:
+%D
+%D \starttyping
+%D \setMPargument {value}
+%D \stoptyping
+%D
+%D They can be retrieved by the short named macros:
+%D
+%D \starttyping
+%D \gMPa {number}
+%D \gMPs {number}
+%D \stoptyping
+%D
+%D When scanning a path specification, we also save the
+%D operator, using
+%D
+%D \starttyping
+%D \setMPkeyword {n}
+%D \stoptyping
+%D
+%D The path drawing operators are coded for speed: \type{clip},
+%D \type{stroke}, \type{fill} and \type{fillstroke} become
+%D 1, 2, 3 and~4.
+%D
+%D When processing the path this code can be retrieved
+%D using
+%D
+%D \starttyping
+%D \getMPkeyword % {n}
+%D \stoptyping
+%D
+%D When setting an argument, the exact position on the stack
+%D depends on the current value of the \COUNTERS\
+%D \type{\nofMPsegments} and \type{\nofMParguments}.
+
+\newcount\nofMPsegments
+\newcount\nofMParguments
+
+%D These variables hold the coordinates. The argument part of
+%D the stack is reset by:
+%D
+%D \starttyping
+%D \resetMPstack
+%D \stoptyping
+%D
+%D We use the prefix \type{@@MP} to keep the stack from
+%D conflicting with existing macros. To speed up things a bit
+%D more, we use the constant \type{\@@MP}.
+
+\def\@@MP{@@MP}
+
+\def\setMPargument% #1%
+ {\advance\nofMParguments \plusone
+ \expandafter\def\csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname} % {#1}
+
+\def\letMPargument
+ {\advance\nofMParguments \plusone
+ \expandafter\let\csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname}
+
+\def\setMPsequence#1 %
+ {\advance\nofMParguments \plusone
+ \expandafter\def\csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname{#1}%
+ \handleMPsequence}
+
+\def\gMPa#1%
+ {\csname\@@MP0\number#1\endcsname}
+
+\def\gMPs#1%
+ {\csname\@@MP\the\nofMPsegments\number#1\endcsname}
+
+\def\dogMPa#1%
+ {\@EAEAEA\do\csname\@@MP0\number#1\endcsname}
+
+\def\setMPkeyword#1 %
+ {\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}%
+ \advance\nofMPsegments \plusone
+ \nofMParguments\zerocount}
+
+\def\getMPkeyword% #1%
+ {\csname\@@MP\the\nofMPsegments0\endcsname} % {\csname\@@MP#10\endcsname}
+
+\def\docleanupMPargument#1% we need this because args can have [ or ] pre/appended
+ {\expandafter\edef\csname\@@MP\the\nofMPsegments\number#1\endcsname
+ {\csname\@@MP\the\nofMPsegments\number#1\endcsname}}
+
+%D When we reset the stack, we can assume that all further
+%D comment is to be ignored and handled in strings.
+%D By redefining the reset macro after the first call, we
+%D save some run time. Only use this macro after all
+%D comments are processed and use the simple alternative
+%D when dealing with comments.
+
+\def\doresetMPstack
+ {\nofMParguments\zerocount}
+
+\def\resetMPstack
+ {\let\handleMPgraphic\handleMPendgraphic
+ \let\resetMPstack\doresetMPstack
+ \resetMPstack}
+
+%D The arguments are saved with the preceding command
+%D \type{\do}. By default this command expands to nothing, but
+%D when we deal with strings it's used to strip off the
+%D \type{(} and \type{)}.
+%D
+%D Strings are kind of tricky, because characters can be
+%D passed verbatim \type{(hello)}, by octal number
+%D \type{(\005)} or as command \type{(\()}. We therefore
+%D cannot simply ignore \type{(} and \type{)}, the way we do
+%D with \type{[} and \type{]}. Another complication is that
+%D strings may contain characters that normally have a
+%D special meaning in \TEX, like \type{$} and \type{{}}.
+%D
+%D A previous solution made \type{\} an active character and
+%D let it look ahead for a number or characters. We had to
+%D abandon this scheme because of the need for verbatim
+%D support. The next solution involved some \CATCODE\
+%D trickery but works well.
+
+\def\octalMPcharacter#1#2#3%
+ {\char'#1#2#3\relax}
+
+%D curly braces and squarly brackets are stored in the argument stack
+%D as part of strings, for instance in:
+%D
+%D \starttyping
+%D /fshow {exch findfont exch scalefont setfont show}bind def
+%D [3 3 ] 0 setdash
+%D \stoptyping
+%D
+%D but we need to keep them in situation like
+%D
+%D \starttyping
+%D ([bla bla] bla bla) ec-lmr10 9.96265 fshow
+%D ({bla bla} bla bla) ec-lmr10 9.96265 fshow
+%D \stoptyping
+%D
+%D So, when we store the snippets, we keep the special tokens, and
+%D when needed we either ignore or obey them
+
+%D We could use a catcodetable here.
+
+\bgroup
+\catcode`\|=\@@comment
+\catcode`\%=\@@active
+\catcode`\[=\@@active
+\catcode`\]=\@@active
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\catcode`B=\@@begingroup
+\catcode`E=\@@endgroup
+\gdef\keepMPspecials|
+ B\let%\letterpercent|
+ \def[B\noexpand[E|
+ \def]B\noexpand]E|
+ \def{B\noexpand{E|
+ \def}B\noexpand}EE
+\gdef\ignoreMPspecials|
+ B\let%\letterpercent|
+ \def[BE|
+ \def]BE|
+ \def{BE|
+ \def}BEE
+\gdef\obeyMPspecials|
+ B\def%B\char 37\relax E|
+ \def[B\char 91\relax E|
+ \def]B\char 93\relax E|
+ \def{B\char123\relax E|
+ \def}B\char125\relax EE
+\gdef\setMPspecials|
+ B\setnaturalcatcodes
+ \catcode`\\=\@@escape
+ \catcode`\%=\@@active
+ \catcode`\[=\@@active
+ \catcode`\]=\@@active
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \lccode`\-=0 | latex sets this to `\-
+ \lccode`\%=`\%| otherwise it's seen as a number
+ \def\(B\char40\relax E|
+ \def\)B\char41\relax E|
+ \def\\B\char92\relax E|
+ \def\0B\octalMPcharacter0E|
+ \def\1B\octalMPcharacter1E|
+ \def\2B\octalMPcharacter2E|
+ \def\3B\octalMPcharacter3E|
+ \def\4B\octalMPcharacter4E|
+ \def\5B\octalMPcharacter5E|
+ \def\6B\octalMPcharacter6E|
+ \def\7B\octalMPcharacter7E|
+ \def\8B\octalMPcharacter8E|
+ \def\9B\octalMPcharacter9EE
+\egroup
+
+%D We use the comment symbol as a sort of trigger. Beware!
+%D The whole graphic is seen as on eparagraph, which means
+%D that we cannot change the catcodes in between.
+
+\bgroup
+\catcode`\%=\@@active
+\gdef\startMPscanning{\let%=\startMPconversion}
+\egroup
+
+%D In earlier versions we used the sequence
+%D
+%D \starttyping
+%D \expandafter\handleMPsequence\input filename\relax
+%D \stoptyping
+%D
+%D Persistent problems in \LATEX\ however forced us to use a
+%D different scheme. Every \POSTSCRIPT\ file starts with a
+%D \type{%}, so we temporary make this an active character
+%D that starts the scanning and redefines itself. (The problem
+%D originates in the redefinition by \LATEX\ of the
+%D \type{\input} primitive.)
+
+\def\startMPconversion
+ {\keepMPspecials
+ \handleMPsequence}
+
+%D Here comes the main loop. Most arguments are numbers. This
+%D means that they can be recognized by their \type{\lccode}.
+%D This method saves a lot of processing time. We could
+%D speed up the conversion by handling the \type{path}
+%D seperately.
+
+\def\dohandleMPsequence#1%
+ {\ifdone
+ \ifcase\lccode`#1\relax
+ \@EAEAEA\dohandleMPsequenceA
+ \else
+ \@EAEAEA\dohandleMPsequenceB
+ \fi
+ \else
+ \@EA\dohandleMPsequenceC
+ \fi#1}
+
+\let\dohandleMPsequenceA\setMPsequence
+
+\def\installMPSkeywordN#1#2%
+ {\expandafter\def\csname\@@MP:N:#1\endcsname{#2}}
+
+\def\installMPSshortcutN#1#2% todo: \let
+ {\expandafter\let\csname\@@MP:N:#1\expandafter\endcsname\csname\@@MP:N:#2\endcsname}
+
+\def\dohandleMPsequenceB#1 %
+ {\edef\somestring{#1}%
+ \executeifdefined{\@@MP:N:\somestring}\handleMPgraphic
+ \handleMPsequence}
+
+\installMPSkeywordN \PSmoveto
+ {\edef\lastMPmoveX{\gMPa1}%
+ \edef\lastMPmoveY{\gMPa2}%
+ \resetMPstack}
+\installMPSkeywordN \PSnewpath
+ {\let\handleMPsequence\handleMPpath}
+\installMPSkeywordN \PSgsave
+ {\PDFcode{q}%
+ \resetMPstack}
+\installMPSkeywordN \PSgrestore
+ {\PDFcode{Q}%
+ \resetMPstack}
+\installMPSkeywordN \PSdtransform % == setlinewidth
+ {\let\handleMPsequence\handleMPdtransform}
+ % after that we will encounter more tokens until setlinewidth+pop
+ % or pop+setlinewidth which we catch next; we explicitly need to
+ % reset the stack since [] n setdash may follow; a more clever
+ % approach would be to read on till the condition is met, but it's
+ % the only pop / setlinewidth we will encounter so ...
+\installMPSkeywordN \PSsetlinewidth
+ {% already handled in dtransform
+ \resetMPstack}
+\installMPSkeywordN \PSpop
+ {% already handled in dtransform
+ \resetMPstack}
+\installMPSkeywordN \PSconcat
+ {\cleanupMPconcat
+ \PDFcode{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetrgbcolor
+ {\handleMPrgbcolor
+ \resetMPstack}
+\installMPSkeywordN \PSsetcmykcolor
+ {\handleMPcmykcolor
+ \resetMPstack}
+\installMPSkeywordN \PSsetgray
+ {\handleMPgraycolor
+ \resetMPstack}
+\installMPSkeywordN \PStranslate
+ {\PDFcode{1 0 0 1 \gMPa1 \gMPa2 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetdash
+ {\handleMPsetdash
+ \resetMPstack}
+\installMPSkeywordN \PSsetlinejoin
+ {\PDFcode{\gMPa1 j}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetmiterlimit
+ {\PDFcode{\gMPa1 M}%
+ \resetMPstack}
+\installMPSkeywordN \PSfshow
+ {%\PDFcode{n}% removed !
+ \handleMPfshow
+ \resetMPstack}
+\installMPSkeywordN \PSsetlinecap
+ {\PDFcode{\gMPa1 J}%
+ \resetMPstack}
+\installMPSkeywordN \PSrlineto
+ {\flushMPmoveto
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \resetMPmoveto
+ \resetMPstack}
+\installMPSkeywordN \PSscale
+ {\PDFcode{\gMPa1 0 0 \gMPa2 0 0 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSspecial
+ {\handleMPspecialcommand
+ \resetMPstack}
+
+\installMPSshortcutN {n} \PSnewpath
+\installMPSshortcutN {p} \PSclosepath
+\installMPSshortcutN {l} \PSlineto
+\installMPSshortcutN {r} \PSrlineto
+\installMPSshortcutN {m} \PSmoveto
+\installMPSshortcutN {c} \PScurveto
+\installMPSshortcutN {C} \PSsetcmykcolor
+\installMPSshortcutN {G} \PSsetgray
+\installMPSshortcutN {R} \PSsetrgbcolor
+\installMPSshortcutN {lj} \PSsetlinejoin
+\installMPSshortcutN {ml} \PSsetmiterlimit
+\installMPSshortcutN {lc} \PSsetlinecap
+\installMPSshortcutN {sd} \PSsetdash
+\installMPSshortcutN {S} \PSstroke
+\installMPSshortcutN {F} \PSfill
+\installMPSshortcutN {W} \PSclip
+
+\installMPSshortcutN {q} \PSgsave
+\installMPSshortcutN {Q} \PSgrestore
+
+\installMPSshortcutN {s} \PSscale
+\installMPSshortcutN {t} \PSconcat
+\installMPSshortcutN {P} \PSshowpage
+
+\installMPSkeywordN {hlw} {\PDFcode{\gMPa1 w}\resetMPstack}
+\installMPSkeywordN {vlw} {\PDFcode{\gMPa1 w}\resetMPstack}
+\installMPSkeywordN {rd} {\PDFcode{[] 0 d}\resetMPstack}
+
+\def\dohandleMPsequenceC#1 %
+ {\edef\somestring{#1}%
+ \handleMPgraphic
+ \handleMPsequence}
+
+%D Since colors are not sensitive to transformations, they
+%D are sometimes used for signaling. Therefore, we handle them
+%D separately. The next macro can be redefined if needed.
+
+\def\handleMPrgbcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 rg
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 RG}}
+
+\def\handleMPcmykcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 k
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 K}}
+
+\def\handleMPgraycolor
+ {\PDFcode{\!MPgMPa1 g
+ \!MPgMPa1 G}}
+
+\def\handleMPspotcolor
+ {\PDFcode{0 g
+ 0 G}}
+
+%D Beginning and ending the graphics is taken care of by the
+%D macro \type{\handleMPgraphic}, which is redefined when
+%D the first graphics operator is met.
+
+\def\handleMPendgraphic % #1%
+ {\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSEof
+ \let\handleMPsequence\finishMPgraphic
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi\fi}
+
+\def\handleMPbegingraphic % #1%
+ {\ifx\somestring\PSBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox1}%
+ \else\ifx\somestring\PSHiResBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox2}%
+ \else\ifx\somestring\PSExactBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox3}%
+ \else\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSEof
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSPage
+ \let\handleMPsequence\handleMPpage
+ \else\ifx\somestring\PSMetaPostSpecials
+ \let\handleMPsequence\handleMPspecialscomment
+ \else\ifx\somestring\PSMetaPostSpecial
+ \let\handleMPsequence\handleMPspecialcomment
+ \else\ifx\somestring\PSBeginProlog
+ \let\handleMPsequence\handleMPprolog
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\let\handleMPgraphic=\handleMPbegingraphic
+
+%D New: we can best filter the prolog because nowdays it can contain
+%D quite some code.
+
+% hm, catcode mess, so we need to tweak %'s catcode here
+% \long\expandafter\def\expandafter\handleMPprolog\expandafter#\expandafter1\PSEndProlog%
+% but today i'm not in the mood for ugly stuff
+
+\long\def\handleMPprolog#1EndProlog %
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D We check for three kind of bounding boxes: the normal one
+%D and two high precision ones:
+%D
+%D \starttyping
+%D BoundingBox: llx lly ucx ucy
+%D HiResBoundingBox: llx lly ucx ucy
+%D ExactBoundingBox: llx lly ucx ucy
+%D \stoptyping
+%D
+%D The original as well as the recalculated dimensions are
+%D saved for later use.
+
+\newif\ifskipemptyMPgraphic \skipemptyMPgraphicfalse
+
+\chardef\currentMPboundingbox=0
+
+\def\handleMPboundingbox#1#2 #3 #4 #5
+ {\ifnum#1>\currentMPboundingbox
+ \chardef\currentMPboundingbox#1\relax
+ \xdef\MPllx {#2}%
+ \xdef\MPlly {#3}%
+ \xdef\MPurx {#4}%
+ \xdef\MPury {#5}%
+ \xdef\MPwidth {\the\dimexpr\MPurx\onebasepoint-\MPllx\onebasepoint\relax}%
+ \xdef\MPheight{\the\dimexpr\MPury\onebasepoint-\MPlly\onebasepoint\relax}%
+ \fi
+ \doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \let\next\handleMPsequence
+ \ifskipemptyMPgraphic
+ \ifdim\MPheight=\zeropoint\ifdim\MPwidth=\zeropoint
+ \def\next{\endinput\finishMPgraphic}%
+ \fi\fi
+ \fi
+ \next}
+
+%D Unless defined otherwise, we simply ignore specialcomments.
+
+\def\handleMPspecialcomment
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+\let\handleMPspecialscomment\handleMPspecialcomment
+
+%D We use the \type{page} comment as a signal that
+%D stackbuilding can be started.
+
+\def\handleMPpage #1 #2
+ {\doresetMPstack
+ \donetrue
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D The same applies to the special extensions.
+
+\def\handleMPspecialcommand
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D \METAPOST\ draws its dots by moving to a location and
+%D invoking \type{0 0 rlineto}. This operator is not
+%D available in \PDF. Our solution is straightforward: we draw
+%D a line from $(current\_x, current\_y)$ to itself. This
+%D means that the arguments of the preceding \type{moveto} have
+%D to be saved.
+
+%D These saved coordinates are also used when we handle the
+%D texts. Text handling proved to be a bit of a nuisance, but
+%D finally I saw the light. It proved that we also had to
+%D take care of \type{(split arguments)}.
+
+% \startMPcode
+% draw btex Ga toch effe f\kern0ptietsen?{}` etex ;
+% \stopMPcode
+
+\newtoks \everyMPshowfont
+
+\def\setMPfshowfont#1#2%
+ {\font\temp=#1\space at #2\relax\temp
+ \the\everyMPshowfont}
+
+\let\MPfshowcommand\empty
+
+\def\dohandleMPfshow
+ {\setbox\scratchbox\hbox
+ {\obeyMPspecials
+ \edef\MPtextsize{\gMPa\nofMParguments}%
+ \def\do(##1){##1}% only works in latest mp
+ \edef\MPtextdata{\dogMPa1}% beware, stack can have more
+ \handleMPtext}%
+ \setbox\scratchbox\hbox
+ {\hskip\lastMPmoveX\onebasepoint
+ \raise\lastMPmoveY\onebasepoint
+ \box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox}
+
+\def\handleMPtext {\handleMPtextnormal} % so we can overload this one later
+\def\handleMPfshow{\dohandleMPfshow } % so we can overload this one later
+
+\def\handleMPtext
+ {\ifnum\nofMParguments>\plusthree
+ \handleMPtextnormal
+ \else
+ \defconvertedcommand\MPtextdata\MPtextdata
+ \expanded{\splitstring\MPtextdata}\at::::\to\MPtexttag\and\MPtextnumber
+ \executeifdefined{handleMPtext\MPtexttag}\handleMPtextnormal
+ \fi}
+
+% elsewhere we will implement \handleMPtextmptxt
+
+\def\doflushMPtext#1%
+ {\edef\!!stringa{#1}%
+ \@EA\dodoflushMPtext\!!stringa\relax}
+
+\def\dodoflushMPtext
+ {\afterassignment\dododoflushMPtext\let\nexttoken=}
+
+\def\dododoflushMPtext
+ {\ifx\nexttoken\relax
+ % done
+ \else\ifx\nexttoken\char
+ \@EA\@EA\@EA\dodododoflushMPtext
+ \else
+ {\nexttoken}%
+ \@EA\@EA\@EA\dodoflushMPtext
+ \fi\fi}
+
+\def\dodododoflushMPtext
+ {\afterassignment\dododododoflushMPtext\scratchcounter}
+
+\def\dododododoflushMPtext
+ {{\char\scratchcounter}\let\next\dodoflushMPtext}
+
+\def\handleMPtextnormal
+ {\let\ \relax % mp breaks long lines and appends a \
+ \ifx\MPtextsize\PSnfont % round font size (to pt)
+ \advance\nofMParguments \minusone
+ \expandafter\scratchdimen\gMPa\nofMParguments\onepoint\relax
+ \ifdim\scratchdimen<\onepoint
+ \def\MPtextsize{1pt}%
+ \else
+ \advance\scratchdimen .5\onepoint
+ \def\MPtextsize##1.##2\relax{\def\MPtextsize{##1pt}}%
+ \expandafter\MPtextsize\the\scratchdimen\relax
+ \fi
+ \else
+ \edef\MPtextsize{\MPtextsize bp}%
+ \fi
+ \advance\nofMParguments \minusone
+ \setMPfshowfont{\gMPa\nofMParguments}\MPtextsize
+ \advance\nofMParguments \minusone
+ \temp
+ \MPfshowcommand
+ {\ifnum\nofMParguments=\plusone
+ \def\do(##1){##1}%
+ \doflushMPtext{\dogMPa1}%
+ \else % can't happen anymore in mp version 1+
+ % we need to catch ( a ) (a a a) (\123 \123 \123) etc
+ \scratchcounter\plusone
+ \def\dodo##1% Andreas Fieger's bug: (\304...)
+ {\edef\!!stringa{##1\empty\empty}% and another one: ( 11) -> \ifx 11
+ \ifx\!!stringa\MPspacechar\MPspacechar\else\expandafter##1\fi}%
+ \def\do(##1{\dodo{##1}}%
+ \dogMPa\scratchcounter\MPspacechar
+ \let\do\relax
+ \loop
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\nofMParguments\relax
+ \gMPa\scratchcounter\MPspacechar
+ \repeat
+ \def\do##1){\dodo{##1}}%
+ \dogMPa\scratchcounter
+ \fi
+ \unskip}}
+
+%D You could consider the following definition to be the most
+%D natural one.
+
+% \def\MPspacechar{\space} % normal case
+
+\def\MPspacechar{\char32\relax} % old solution does not work with math
+
+%D However, the following implementation is more robust, since
+%D some fonts have funny visible spaces in the space slot. This
+%D gives a mismatch between the space that \METAPOST\ took into
+%D account and the \quote {natural} space. This only happens in
+%D labels, since \type {btex}||\type {etex} thingies don't have
+%D spaces. This phenomena showed up when preparing the
+%D \METAFUN\ manual, where Palatino fonts are used. We can
+%D safely assume that \METAPOST\ considers \type {\char32} to
+%D be the space.
+
+\def\MPspacechar{\setbox\scratchbox\hbox{\char32}\kern\wd\scratchbox}
+
+%D Well, this does not work with math fonts, so:
+
+\def\MPspacechar{\char32\relax}
+
+%D Most operators are just converted and keep their
+%D arguments. Dashes however need a bit different treatment,
+%D otherwise \PDF\ viewers complain loudly. Another
+%D complication is that one argument comes after the \type{]}.
+%D When reading the data, we simply ignore the array boundary
+%D characters. We save ourselves some redundant newlines and
+%D at the same time keep the output readable by packing the
+%D literals.
+
+\def\handleMPsetdash
+ {\bgroup
+ \ignoreMPspecials
+ \let\somestring\empty
+ \scratchcounter\plusone
+ \loop
+ \ifnum\scratchcounter<\nofMParguments
+ \edef\somestring{\somestring\space\gMPa\scratchcounter}%
+ \advance\scratchcounter \plusone
+ \repeat
+ \edef\somestring{[\somestring]\space\gMPa\scratchcounter\space d}%
+ \PDFcode{\somestring}%
+ \egroup}
+
+%D The \type{setlinewidth} commands looks a bit complicated. There are
+%D two alternatives, that result in a similar look in both
+%D $x$- and $y$-dorection. As John Hobby says:
+%D
+%D \startnarrower \switchtobodyfont[ss]
+%D \starttyping
+%D x 0 dtransform exch truncate exch idtransform pop setlinewidth
+%D 0 y dtransform truncate idtransform setlinewidth pop
+%D \stoptyping
+%D
+%D These are just fancy versions of \type{x setlinewidth} and
+%D \type{y setlinewidth}. The \type{x 0 ...} form is used if
+%D the path is {\em primarily vertical}. It rounds the width
+%D so that vertical lines come out an integer number of pixels
+%D wide in device space. The \type{0 y ...} form does the same
+%D for paths that are {\em primarily horizontal}. The reason
+%D why I did this is Knuth insists on getting exactly the
+%D widths \TEX\ intends for the horizontal and vertical rules
+%D in \type{btex...etex} output. (Note that PostScript scan
+%D conversion rules cause a horizontal or vertical line of
+%D integer width $n$ in device space to come out $n+1$ pixels
+%D wide, regardless of the phase relative to the pixel grid.)
+%D \stopnarrower
+%D
+%D The common operator in these sequences is \type{dtransform},
+%D so we can use this one to trigger setting the linewidth.
+
+\def\handleMPdtransform
+ {\ifdim\gMPa1\onepoint>\zeropoint
+ \PDFcode{\gMPa1 w}%
+ \def\next##1 ##2 ##3 ##4 ##5 ##6 {\handleMPsequence}%
+ \else
+ \PDFcode{\gMPa2 w}%
+ \def\next##1 ##2 ##3 ##4 {\handleMPsequence}%
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \next}
+
+%D The most complicated command is \type{concat}. \METAPOST\
+%D applies this operator to \type{stroke}. At that moment the
+%D points set by \type{curveto} and \type{moveto}, are already
+%D fixed. In \PDF\ however the \type{cm} operator affects the
+%D points as well as the pen (stroke). Like more \PDF\
+%D operators, \type{cm} is defined in a bit ambiguous way.
+%D The only save route for non||circular penshapes, is saving
+%D the path, recalculating the points and applying the
+%D transformation matrix in such a way that we can be sure
+%D that its behavior is well defined. This comes down to
+%D inverting the path and applying \type{cm} to that path as
+%D well as the pen. This all means that we have to save the
+%D path.
+
+%D In \METAPOST\ there are three ways to handle a path $p$:
+%D
+%D \starttyping
+%D draw p; fill p; filldraw p;
+%D \stoptyping
+%D
+%D The last case outputs a \type{gsave fill grestore} before
+%D \type{stroke}. Handling the path outside the main loops
+%D saves about 40\% run time.\footnote{We can save some more by
+%D following the \METAPOST\ output routine, but for the moment
+%D we keep things simple.} Switching between the main loop and
+%D the path loop is done by means of the recursely called
+%D macro \type{\handleMPsequence}.
+
+\def\handleMPpath
+ {\chardef\finiMPpath\zerocount
+ \let\closeMPpath\relax
+ \let\flushMPpath\flushnormalMPpath
+ \resetMPstack
+ \nofMPsegments\plusone
+ \let\handleMPsequence\dohandleMPpath
+ \dohandleMPpath}
+
+%D Most paths are drawn with simple round pens. Therefore we've
+%D split up the routine in two.
+
+\def\resetMPmoveto
+ {\let\lastMPmoveX\empty
+ \let\lastMPmoveY\empty}
+
+\resetMPmoveto
+
+\def\flushMPmoveto
+ {\ifx\lastMPmoveX\empty \else
+ \PDFcode{\!MP\lastMPmoveX\space \!MP\lastMPmoveY\space m}%
+ \fi}
+
+\def\flushnormalMPsegment
+ {\ifcase\getMPkeyword\relax
+ \flushMPmoveto
+ \resetMPmoveto
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 l}%
+ \or
+ \flushMPmoveto
+ \resetMPmoveto
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 \!MPgMPs3 \!MPgMPs4 \!MPgMPs5 \!MPgMPs6 c}%
+ \or
+ \ifx\lastMPmoveX\empty \else % we assume 0,0 rlineto
+ \flushMPmoveto
+ \PDFcode{\!MP\lastMPmoveX\space \!MP\lastMPmoveY\space l}%
+ \resetMPmoveto
+ \fi
+ \or
+ % \flushMPmoveto
+ % \resetMPmoveto
+ \fi}
+
+\def\flushMPconcatmoveto
+ {\ifx\lastMPmoveX\empty\else
+ \doMPconcat\lastMPmoveX\lastMPmoveX\lastMPmoveY\lastMPmoveY
+ \flushMPmoveto
+ \fi}
+
+\def\flushconcatMPsegment
+ {\ifcase\getMPkeyword\relax
+ \flushMPconcatmoveto
+ \resetMPmoveto
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \PDFcode{\!MP\a\space\!MP\b\space l}%
+ \or
+ \flushMPconcatmoveto
+ \resetMPmoveto
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \doMPconcat{\gMPs3}\c{\gMPs4}\d%
+ \doMPconcat{\gMPs5}\e{\gMPs6}\f%
+ \PDFcode{\!MP\a\space\!MP\b\space
+ \!MP\c\space\!MP\d\space
+ \!MP\e\space\!MP\f\space c}%
+ \or % rather mp specific ... rline always has 0,0
+ \bgroup
+ \noMPtranslate
+ \flushMPconcatmoveto
+ % next should be \lastMPmoveX+\a,\lastMPmoveY+\b but we know it's 0,0
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \resetMPmoveto
+ \egroup
+ \or
+% \flushMPconcatmoveto
+% \resetMPmoveto
+ \fi}
+
+\def\doflushsomeMPpath
+ {\dodoflushsomeMPpath
+ \advance\nofMPsegments \plusone
+ \ifnum\nofMPsegments<\scratchcounter
+ \expandafter\doflushsomeMPpath
+ \fi}
+
+\def\flushsomeMPpath
+ {\scratchcounter\nofMPsegments
+ \nofMPsegments\plusone
+ \doflushsomeMPpath}
+
+\def\flushnormalMPpath{\let\dodoflushsomeMPpath\flushnormalMPsegment\flushsomeMPpath}
+
+%OLD \def\flushconcatMPpath{\let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%NEW pre-calculate 1/D so it needn't be repeated for each control point.
+
+\def\flushconcatMPpath
+ {\MPreciprocaldeterminant
+ \let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%D The transformation of the coordinates is handled by one of
+%D the macros Tanmoy posted to the \PDFTEX\ mailing list.
+%D I rewrote and optimized the original macro to suit the other
+%D macros in this module.
+%D
+%D \starttyping
+%D \doMPconcat {x position} \xresult {y position} \yresult
+%D \stoptyping
+%D
+%D By setting the auxiliary \DIMENSIONS\ \type{\dimen0} upto
+%D \type{\dimen10} only once per path, we save over 20\% run
+%D time. Some more speed was gained by removing some parameter
+%D passing. These macros can be optimized a bit more by using
+%D more constants. There is however not much need for further
+%D optimization because penshapes usually are round and
+%D therefore need no transformation. Nevertheless we move the
+%D factor to the outer level and use a bit different \type{pt}
+%D removal macro. Although the values represent base points,
+%D we converted them to pure points, simply because those can
+%D be converted back.
+
+%OLD \mathchardef\MPconcatfactor=256 % beware don't remove spaces before it
+
+%OLD \def\doMPreducedimen#1
+%OLD {\count0\MPconcatfactor
+%OLD \advance\dimen#1 \ifdim\dimen#1>\zeropoint .5\else -.5\fi\count0
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD % too inaccurate (see old pragma logo)
+%OLD
+%OLD \def\doMPreducedimen#1
+%OLD {\count0=\MPconcatfactor
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD \def\doMPreducedimen#1
+%OLD {\advance\dimen#1 \ifdim\dimen#1>\zeropoint .5\else -.5\fi\MPconcatfactor
+%OLD \divide\dimen#1 \MPconcatfactor}
+
+%D The transformation code is rewritten by Daniel H. Luecking who
+%D describes his patch as follows:
+%D
+%D We would like to divide 1 by $X$, but all divisions are integer so
+%D for accuracy we want to convert to large integers and make sure the
+%D integer quotient has as many significant digits as possible. Thus we
+%D need to replace $1/X$ with $M/N$ where $N$ is as large as possible
+%D and $M/N$ is as large as possible. Also for simplicity $M$ should be
+%D a power of 2. So we make $M = 2^{30}$ \footnote{$2^{31} - 1$ is the
+%D largest legal integer. Using it (and simply ignoring the inaccuracy
+%D caused by $-1$) turns out to be at least as accurate in all cases,
+%D and more accurate in some.} (largest legal power of 2) and adjust
+%D $X$ downward (if necessary) to the the range $1-2^{16}$. This gives
+%D at least 15 significant binary digits, (almost as accurate as
+%D \METAPOST\ for numbers near 1) or almost 5 significant figures
+%D (decimal).
+
+\newcount\MPscratchCnt
+\newdimen\MPscratchDim % will be assigned global
+
+\def\MPadjustdimen % sets \MPscratchDim and \MPscratchCnt
+ {\MPscratchCnt\zerocount
+ \doMPadjustdimen}
+
+\def\doMPadjustdimen
+ {\ifdim\MPscratchDim>\onepoint
+ \divide \MPscratchDim\plustwo
+ \advance\MPscratchCnt\plusone
+ \expandafter\doMPadjustdimen
+ \fi}
+
+%OLD \def\doMPexpanddimen#1
+%OLD {\multiply\dimen#1 \MPconcatfactor\relax}
+
+%D DHL: When viewed as an integer, $1 \hbox{pt}=2^{16}$ so $2^{32}/X$
+%D is the right way to do $(1 \hbox{pt})/(X \hbox{pt})$ and get the
+%D answer in points. But we are limited to $2^{30}/X$. However, we
+%D actually do $[ 2^{30} / (X/2^K) ]*2^{2-K}$ where $K$ is the number
+%D of halvings it takes to bring $X$ below $1 \hbox{pt}$. If $K$ is 0
+%D or 1 we readjust by multiplying by 4 or 2, otherwise by halving
+%D $(K-2)$ times \type {\MPscratchCnt} holds the value of $K$ from
+%D \type {\MPadjustdimen}.
+
+\def\MPreadjustdimen % acts on \MPscratchDim and MPscratchCnt
+ {\ifcase\MPscratchCnt
+ \multiply\scratchdimen \plusfour
+ \or
+ \multiply\scratchdimen \plustwo
+ \else
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\doMPreadjustdimen
+ {\ifnum\MPscratchCnt>\plustwo
+ \divide \scratchdimen\plustwo
+ \advance\MPscratchCnt\minusone
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\MPreciprocaldeterminant
+ {\scratchdimen\withoutpt\the\dimen0 \dimen6 % s_x*s_y
+ \advance\scratchdimen -\withoutpt\the\dimen2 \dimen4 % s_x*s_y - r_x*r_y
+ \ifdim\scratchdimen<\zeropoint % we need a positive dimension
+ \scratchdimen-\scratchdimen % for \MPadjustdimen (?)
+ \doMPreciprocal
+ \scratchdimen-\scratchdimen
+ \else
+ \doMPreciprocal
+ \fi
+ \edef\MPreciprocal{\withoutpt\the\scratchdimen}}
+
+\newcount\MPnumerator \MPnumerator = 1073741824 % 2^{30}
+
+% todo: dimexpr
+
+\def\doMPreciprocal % replace \scratchdimen with its reciprocal
+ {\ifdim\scratchdimen=\onepoint \else
+ \MPadjustdimen
+ \scratchcounter\MPnumerator
+ \divide\scratchcounter\scratchdimen
+ \scratchdimen1\scratchcounter % 1 needed
+ \MPreadjustdimen
+ \fi}
+
+%OLD \def\presetMPconcat
+%OLD {\dimen 0=\gMPs1\onepoint \doMPreducedimen 0 % r_x
+%OLD \dimen 2=\gMPs2\onepoint \doMPreducedimen 2 % s_x
+%OLD \dimen 4=\gMPs3\onepoint \doMPreducedimen 4 % s_y
+%OLD \dimen 6=\gMPs4\onepoint \doMPreducedimen 6 % r_y
+%OLD \dimen 8=\gMPs5\onepoint \doMPreducedimen 8 % t_x
+%OLD \dimen10=\gMPs6\onepoint \doMPreducedimen10 } % t_y
+%OLD
+%OLD \def\presetMPscale
+%OLD {\dimen 0=\gMPs1\onepoint \doMPreducedimen 0
+%OLD \dimen 2 \zeropoint
+%OLD \dimen 4 \zeropoint
+%OLD \dimen 6=\gMPs2\onepoint \doMPreducedimen 6
+%OLD \dimen 8 \zeropoint
+%OLD \dimen10 \zeropoint}
+
+\def\cleanupMPconcat
+ {\ignoreMPspecials
+ \docleanupMPargument1%
+ \docleanupMPargument6%
+ \keepMPspecials}
+
+\def\presetMPconcat
+ {\dimen 0=\gMPs1\onepoint % s_x
+ \dimen 2=\gMPs2\onepoint % r_x
+ \dimen 4=\gMPs3\onepoint % r_y
+ \dimen 6=\gMPs4\onepoint % s_y
+ \dimen 8=\gMPs5\onepoint % t_x
+ \dimen10=\gMPs6\onepoint} % t_y
+
+\def\presetMPscale
+ {\dimen 0=\gMPs1\onepoint
+ \dimen 2 \zeropoint
+ \dimen 4 \zeropoint
+ \dimen 6=\gMPs2\onepoint
+ \dimen 8 \zeropoint
+ \dimen10 \zeropoint}
+
+\def\noMPtranslate % use this one grouped
+ {\dimen 8 \zeropoint % t_x
+ \dimen10 \zeropoint} % t_y
+
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+
+%D The following optimization resulted from some tests by
+%D and email exchanges with Sanjoy Mahajan.
+%D
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D %\ifdim\dimen16>\onepoint % oeps, can be < 1pt too
+%D \ifdim\dimen16=\onepoint \else
+%D \ifdim\dimen16>\MPconcatfactor pt
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D \else
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+%D \fi
+%D \fi
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+%D
+%D But, this one is still too inaccurate, so we now have:
+
+%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
+%D arithmetic instead of using real factors because it's faster.
+%D However, the actual macros test slower, possibly because I've
+%D omitted three nested loops. In my test files, my approach is more
+%D accurate. It is also far simpler and overflow does not seem to be a
+%D significant concern. The scale factors written by Metapost are (?)
+%D always $<=1$ (it scales coordinates internally) and coordinates are
+%D always likely to be less than \type {\maxdimen}.
+%D
+%D If this should ever cause problems, the scale factors can be reduced.
+
+% the original:
+%
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12=#1\onepoint% p_x % #1\onepoint
+% \dimen14=#3\onepoint% p_y % #3\onepoint
+% \advance\dimen12 -\dimen8 % p_x - t_x
+% \advance\dimen14 -\dimen10 % p_y - t_y
+% \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x)
+% \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y)
+% \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y)
+% \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x)
+% % \MPreciprocal contains precomputed 1/D:
+% \dimen18=\MPreciprocal\dimen18
+% \dimen14=\MPreciprocal\dimen14
+% \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+% \edef#4{\withoutpt\the\dimen14}} % p_y^\prime
+%
+% faster but not that often used
+
+\def\doMPconcat#1#2#3#4%
+ {\dimen12\dimexpr#1\points-\dimen 8\relax % p_x-t_x
+ \dimen14\dimexpr#3\points-\dimen10\relax % p_y-t_y
+ \dimen18\dimexpr\withoutpt\the\dimen6\dimen12-\withoutpt\the\dimen4\dimen14\relax % s_y(p_x-t_x)-r_y(p_y-t_y)
+ \dimen14\dimexpr\withoutpt\the\dimen0\dimen14-\withoutpt\the\dimen2\dimen12\relax % s_x(p_y-t_y)-r_x(p_x-t_x)
+ \edef#2{\withoutpt\the\dimexpr\MPreciprocal\dimen18\relax}% % p_x^\prime
+ \edef#4{\withoutpt\the\dimexpr\MPreciprocal\dimen14\relax}} % p_y^\prime
+
+%D One reason for Daniel to write this patch was that at small sizes
+%D the accuracy was less than optimal. Here is a test that demonstrates
+%D that his alternative is pretty good:
+%D
+%D \startlinecorrection
+%D \startMPcode
+%D for i = 5cm,1cm,5mm,1mm,.5mm,.1mm,.01mm :
+%D draw fullcircle scaled i withpen pencircle xscaled (i/10) yscaled (i/20) rotated 45 ;
+%D endfor ;
+%D \stopMPcode
+%D \stoplinecorrection
+
+%D The following explanation of the conversion process was
+%D posted to the \PDFTEX\ mailing list by Tanmoy. The original
+%D macro was part of a set of macro's that included sinus and
+%D cosinus calculations as well as scaling and translating. The
+%D \METAPOST\ to \PDF\ conversion however only needs
+%D transformation.
+
+%M \start \switchtobodyfont [ss]
+
+%D Given a point $(U_x, U_y)$ in user coordinates, the business
+%D of \POSTSCRIPT\ is to convert it to device space. Let us say
+%D that the device space coordinates are $(D_x, D_y)$. Then, in
+%D \POSTSCRIPT\ $(D_x, D_y)$ can be written in terms of
+%D $(U_x, U_y)$ in matrix notation, either as
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x&D_y&1\cr} = \pmatrix{U_x&U_y&1\cr}
+%D \pmatrix{s_x&r_x&0\cr
+%D r_y&s_y&0\cr
+%D t_x&t_y&1\cr}
+%D \stopformula
+%D
+%D or
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D both of which is a shorthand for the same set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D D_x = s_x U_x + r_y U_y + t_x
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D D_y = r_x U_x + s_y U_y + t_y
+%D \stopformula
+%D
+%D which define what is called an `affine transformation'.
+%D
+%D \POSTSCRIPT\ represents the `transformation matrix' as a
+%D six element matrix instead of a $3\times 3$ array because
+%D three of the elements are always~0, 0 and~1. Thus the above
+%D transformation is written in postscript as $[s_x\, r_x\,
+%D r_y\, s_y\, t_x\, t_y]$. However, when doing any
+%D calculations, it is useful to go back to the original
+%D matrix notation (whichever: I will use the second) and
+%D continue from there.
+%D
+%D As an example, if the current transformation matrix is
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ and you say \typ{[a b
+%D c d e f] concat}, this means:
+%D
+%D \startnarrower
+%D Take the user space coordinates and transform them to an
+%D intermediate set of coordinates using array $[a\, b\, c\, d\,
+%D e\, f]$ as the transformation matrix.
+%D
+%D Take the intermediate set of coordinates and change them to
+%D device coordinates using array $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$
+%D as the transformation matrix.
+%D \stopnarrower
+%D
+%D Well, what is the net effect? In matrix notation, it is
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{I_x\cr I_y\cr 1\cr} = \pmatrix{a&c&e\cr
+%D b&d&f\cr
+%D 0&0&1\cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_y\cr D_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{I_x\cr
+%D I_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where $(I_x, I_y)$ is the intermediate coordinate.
+%D
+%D Now, the beauty of the matrix notation is that when there is
+%D a chain of such matrix equations, one can always compose
+%D them into one matrix equation using the standard matrix
+%D composition law. The composite matrix from two matrices can
+%D be derived very easily: the element in the $i$\high{th}
+%D horizontal row and $j$\high{th} vertical column is
+%D calculated by`multiplying' the $i$\high{th} row of the first
+%D matrix and the $j$\high{th} column of the second matrix (and
+%D summing over the elements). Thus, in the above:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &0 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D with
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {s_x^\prime & = s_x a + r_y b \cr
+%D r_x^\prime & = r_x a + s_y b \cr
+%D r_y^\prime & = s_x c + r_y d \cr
+%D s_y^\prime & = r_x c + s_y d \cr
+%D t_x^\prime & = s_x e + r_y f + t_x \cr
+%D t_y^\prime & = r_x e + s_y f + t_y \cr}
+%D \stopformula
+
+%D In fact, the same rule is true not only when one is going
+%D from user coordinates to device coordinates, but whenever
+%D one is composing two `transformations' together
+%D (transformations are `associative'). Note that the formula
+%D is not symmetric: you have to keep track of which
+%D transformation existed before (i.e.\ the equivalent of
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$) and which was
+%D specified later (i.e.\ the equivalent of $[a\, b\, c\, d\,
+%D e\, f]$). Note also that the language can be rather
+%D confusing: the one specified later `acts earlier',
+%D converting the user space coordinates to intermediate
+%D coordinates, which are then acted upon by the pre||existing
+%D transformation. The important point is that order of
+%D transformation matrices cannot be flipped (transformations
+%D are not `commutative').
+%D
+%D Now what does it mean to move a transformation matrix
+%D before a drawing? What it means is that given a point
+%D $(P_x, P_y)$ we need a different set of coordinates
+%D $(P_x^\prime, P_y^\prime)$ such that if the transformation
+%D acts on $(P_x^\prime, P_y^\prime)$, they produce $(P_x,
+%D P_y)$. That is we need to solve the set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x\cr P_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x^\prime\cr
+%D P_y^\prime\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D Again matrix notation comes in handy (i.e. someone has
+%D already solved the problem for us): we need the inverse
+%D transformation matrix. The inverse transformation matrix can
+%D be calculated very easily:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x^\prime\cr P_y^\prime\cr 1\cr} =
+%D \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x\cr
+%D P_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where, the inverse transformation matrix is given by
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {D & = s_x s_y - r_x r_y \cr
+%D s_x^\prime & = s_y / D \cr
+%D s_y^\prime & = s_x / D \cr
+%D r_x^\prime & = - r_x / D \cr
+%D r_y^\prime & = - r_y / D \cr
+%D t_x^\prime & = ( - s_y t_x + r_y t_y ) / D \cr
+%D t_y^\prime & = ( r_x t_x - s_x t_y ) / D \cr}
+%D \stopformula
+%D
+%D And you can see that when expanded out, this does
+%D give the formulas:
+%D
+%D \placeformula
+%D \startformula
+%D P_x^\prime = { { s_y(p_x-t_x) + r_y(t_y-p_y) } \over
+%D { s_x s_y-r_x r_y } }
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D P_y^\prime = { { s_x(p_y-t_y) + r_x(t_x-p_x) } \over
+%D { s_x*s_y-r_x*r_y } }
+%D \stopformula
+%D
+%D The code works by representing a real number by converting
+%D it to a dimension to be put into a \DIMENSION\ register: 2.3 would
+%D be represented as 2.3pt for example. In this scheme,
+%D multiplying two numbers involves multiplying the \DIMENSION\
+%D registers and dividing by 65536. Accuracy demands that the
+%D division be done as late as possible, but overflow
+%D considerations need early division.
+%D
+%D Division involves dividing the two \DIMENSION\ registers and
+%D multiplying the result by 65536. Again, accuracy would
+%D demand that the numerator be multiplied (and|/|or the
+%D denominator divided) early: but that can lead to overflow
+%D which needs to be avoided.
+%D
+%D If nothing is known about the numbers to start with (in
+%D concat), I have chosen to divide the 65536 as a 256 in each
+%D operand. However, in the series calculating the sine and
+%D cosine, I know that the terms are small (because I never
+%D have an angle greater than 45 degrees), so I chose to
+%D apportion the factor in a different way.
+
+%M \stop
+
+%D The path is output using the values saved on the stack. If
+%D needed, all coordinates are recalculated.
+
+\def\finishMPpath
+ {\PDFcode{\ifcase\finiMPpath W n\or S\or f\or B\fi}}
+
+\def\processMPpath
+ {\checkMPpath
+ \ifcase\nofMPsegments\else
+ \flushMPpath
+ \closeMPpath
+ \finishMPpath
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments\zerocount
+ \handleMPsequence}
+
+%D The following \METAPOST\ code is quite valid but, when
+%D processed and converted to \PDF, will make a file
+%D unprintable on a Hewlett Packard printer (from Acrobat
+%D $v<=5$). Who is to blame, the driver of the OS layer in
+%D between, is hard to determine, so we add an additional
+%D check.
+%D
+%D \starttyping
+%D clip currentpicture to origin -- cycle ;
+%D setbounds currentpicture to fullsquare scaled 5cm ;
+%D \stoptyping
+
+\def\checkMPpath
+ {\ifcase\finiMPpath
+ \ifnum\nofMPsegments<\plusthree % n is one ahead
+ \message{omitting zero clip path}%
+ \nofMPsegments\zerocount
+ \fi
+ \fi}
+
+%D In \PDF\ the \type{cm} operator must precede the path
+%D specification. We therefore can output the \type{cm} at
+%D the moment we encounter it.
+
+\def\handleMPpathconcat
+ {\presetMPconcat
+ \PDFcode{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 cm}%
+ \resetMPstack}
+
+\def\handleMPpathscale
+ {\presetMPscale
+ \PDFcode{\gMPs1 0 0 \gMPs2 0 0 cm}%
+ \resetMPstack}
+
+%D This macro interprets the path and saves it as compact as
+%D possible.
+
+\def\dohandleMPpath#1%
+ {\ifcase\lccode`#1\relax
+ \@EA\dohandleMPpathA
+ \else
+ \@EA\dohandleMPpathB
+ \fi#1}
+
+\let\dohandleMPpathA\setMPsequence
+
+\def\installMPSkeywordP#1#2%
+ {\expandafter\def\csname\@@MP:P:#1\endcsname{#2}}
+
+\def\installMPSshortcutP#1#2% todo: \let
+ {\expandafter\let\csname\@@MP:P:#1\expandafter\endcsname\csname\@@MP:P:#2\endcsname}
+
+\def\dohandleMPpathB#1 %
+ {\def\somestring{#1}%
+ \executeifdefined{\@@MP:P:\somestring}\relax
+ \handleMPsequence}
+
+\installMPSkeywordP \PSlineto
+ {\setMPkeyword0 }
+\installMPSkeywordP \PScurveto
+ {\setMPkeyword1 }
+\installMPSkeywordP \PSrlineto
+ {\setMPkeyword2 }
+\installMPSkeywordP \PSmoveto
+ {\edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \resetMPstack
+ \setMPkeyword3 }
+\installMPSkeywordP \PSclip
+ {% \chardef\finiMPpath\zerocount % already
+ \let\handleMPsequence\processMPpath}
+\installMPSkeywordP \PSgsave
+ {\chardef\finiMPpath\plusthree}
+\installMPSkeywordP \PSgrestore
+ {}
+\installMPSkeywordP \PSfill
+ {\ifcase\finiMPpath
+ \chardef\finiMPpath\plustwo
+ \let\handleMPsequence\processMPpath
+ \fi}
+\installMPSkeywordP \PSstroke
+ {\ifcase\finiMPpath
+ \chardef\finiMPpath\plusone
+ \fi
+ \let\handleMPsequence\processMPpath}
+\installMPSkeywordP \PSclosepath
+ {\def\closeMPpath{\PDFcode{h}}}
+\installMPSkeywordP \PSconcat
+ {\cleanupMPconcat
+ \let\flushMPpath\flushconcatMPpath
+ \handleMPpathconcat}
+\installMPSkeywordP \PSscale
+ {\let\flushMPpath\flushconcatMPpath
+ \handleMPpathscale}
+
+\installMPSshortcutP {l} \PSlineto
+\installMPSshortcutP {r} \PSrlineto
+\installMPSshortcutP {m} \PSmoveto
+\installMPSshortcutP {c} \PScurveto
+
+\installMPSshortcutP {q} \PSgsave
+\installMPSshortcutP {Q} \PSgrestore
+\installMPSshortcutP {S} \PSstroke
+\installMPSshortcutP {F} \PSfill
+\installMPSshortcutP {B} \PSgsave
+\installMPSshortcutP {W} \PSclip
+\installMPSshortcutP {p} \PSclosepath
+
+\installMPSshortcutP {s} \PSscale
+\installMPSshortcutP {t} \PSconcat
+
+%D \macros
+%D {twodigitMPoutput}
+%D
+%D We can limit the precision to two digits after the comma
+%D by saying:
+%D
+%D \starttyping
+%D \twodigitMPoutput
+%D \stoptyping
+%D
+%D This option only works in \CONTEXT\ combined with \ETEX.
+
+\def\twodigitMPoutput
+ {\let\!MP \twodigitrounding
+ \def\!MPgMPs##1{\twodigitrounding{\gMPs##1}}%
+ \def\!MPgMPa##1{\twodigitrounding{\gMPa##1}}}
+
+\let\!MP \empty
+\let\!MPgMPa\gMPa
+\let\!MPgMPs\gMPs
+
+%D Here comes the special-specific code:
+
+\def\setMPextensions
+ {\ifconditional\manyMPspecials
+ \def\MPrgbnumber##1{\expandafter\doMPrgbnumber##10000.00000\relax}%
+ \def\doMPrgbnumber##1.##2##3##4##5##6\relax{##2##3##4##5}%
+ \else
+ \def\MPrgbnumber##1{\expandafter\doMPrgbnumber##1000.0000\relax}%
+ \def\doMPrgbnumber##1.##2##3##4##5\relax{##2##3##4}%
+ \fi}
+
+% \settrue\manyMPspecials \setMPextensions
+
+%D This macro handles the special definitions that are
+%D passed as comment.
+
+%D The implementation below saves the data on the stack in
+%D a way similar to the macros in \type {supp-pdf.tex}, and
+%D just overload a few already defined handlers. That way,
+%D the existing macros are still generic. \footnote {Actually,
+%D the macros here are just as generic.}
+%D
+%D Currently the only extension concerns shading, which is
+%D accomplished by handling yet another value of \type
+%D {\finiMPpath}. The recource disctionary is stored and
+%D later picked up by the general \CONTEXT\ figure inclusion
+%D macros.
+
+%D The \type {%%MetaPostSpecials: version.revision signal} line
+%D triggers this module into handling color specifications kind
+%D of special. We need this safeguard for non||special
+%D usage.
+
+%D When defined inline, we use another macro to handle the
+%D definitions. Actually, this macro is called by the
+%D previous ones.
+
+\chardef\MPspecialversion = 0 % specials when >1
+\chardef\MPspecialrevision = 0 % specials when >1
+\chardef\MPspecialsignal = 0 % passed on by graphic
+
+\chardef\inlineMPspecials = 1 % only needed for stack resetting
+
+\def\dohandleMPspecialcomment#1
+ {\setMPargument{#1}%
+ \advance\scratchcounter \minusone
+ \ifcase\scratchcounter
+ \handleMPspecialcommand
+ \donetrue
+ \doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \expandafter\handleMPsequence
+ \else
+ \expandafter\dohandleMPspecialcomment
+ \fi}
+
+\def\handleMPspecialcomment #1 % number of arguments
+ {\doresetMPstack
+ \scratchcounter#1\relax
+ \ifcase\scratchcounter % when zero, inline shading is used
+ \chardef\inlineMPspecials\plusone
+ \let\handleMPsequence\dohandleMPsequence
+ \expandafter\handleMPsequence
+ \else
+ \chardef\inlineMPspecials\zerocount
+ \expandafter\dohandleMPspecialcomment
+ \fi}
+
+%D When defined inline, we use another macro to handle the
+%D definitions. Actually, this macro is called by the
+%D previous ones.
+
+\def\handleMPspecialcommand
+ {\ifcase\inlineMPspecials\or
+ \advance\nofMParguments \minusone % pop the size
+ \fi
+ \ifundefined\MPspecial % beware, no real \if
+ \message{[unknown \MPspecial]}%
+ \else
+ \csname\MPspecial\endcsname
+ \fi
+ \ifcase\inlineMPspecials
+ \doresetMPstack % 0
+ \else
+ \resetMPstack % 1
+ \fi}
+
+\def\handleMPspecialscomment #1.#2 #3 % version.revision signal #4=div=1000|10000
+ {\doresetMPstack
+ \chardef\MPspecialversion #1%
+ \chardef\MPspecialrevision#2%
+ \chardef\MPspecialsignal #3%
+ \let\handleMPsequence\dohandleMPsequence
+ \ifnum#1=\plusone
+ \expandafter\handleMPsequence
+ \else
+ \expandafter\handleMPspecialscommentx
+ \fi}
+
+\def\handleMPspecialscommentx #1 % version 2
+ {\ifnum10000=0#1\relax
+ \settrue \manyMPspecials
+ \else
+ \setfalse\manyMPspecials
+ \fi
+ \setMPextensions
+ \handleMPsequence}
+
+\def\handleMPrgbcolor
+ {\edef\lastMPrvalue{\csname\@@MP01\endcsname}%{\gMPs1}%
+ \edef\lastMPgvalue{\csname\@@MP02\endcsname}%{\gMPs2}%
+ \edef\lastMPbvalue{\csname\@@MP03\endcsname}%{\gMPs3}%
+ \ifnum\MPrgbnumber\lastMPrvalue=123\relax
+ \csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname
+ \else
+ \dohandleMPrgb\lastMPrvalue\lastMPgvalue\lastMPbvalue
+ \fi}
+
+\def\handleMPgraycolor{\dohandleMPgray{\gMPs1}}
+\def\handleMPcmykcolor{\dohandleMPcmyk{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}}
+\def\handleMPspotcolor{\dohandleMPspot{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}}
+
+% \newcontitional\ignoreMPpath
+
+\def\finishMPpath
+ {\ifconditional\ignoreMPpath
+ \PDFcode{W n\space}%
+ \else
+ \PDFcode{\ifcase\finiMPpath W n\or S\or f\or B\else W n\fi}%
+ \fi
+ \ifx\extraMPpathcode\empty\else
+ \PDFcode{\extraMPpathcode}%
+ \let\extraMPpathcode\empty
+ \fi
+ \setfalse\ignoreMPpath}
+
+\def\processMPpath
+ {\checkMPpath % !
+ \flushMPpath
+ \closeMPpath
+ \finishMPpath
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments\zerocount
+ \handleMPsequence}
+
+\protect \endinput
+
+% When i'm bored ...
+
+% \newcatcodetable\mpscatcodes
+
+% \startcatcodetable \mpscatcodes
+% \catcode`\| \@@comment
+% \catcode`\% \@@active
+% \catcode`\[ \@@active
+% \catcode`\] \@@active
+% \catcode`\{ \@@active
+% \catcode`\} \@@active
+% \stopcatcodetable
+
+% \def\keepMPspecials
+% {\setcatcodecommand \mpscatcodes `\% \letterpercent
+% \setcatcodecommand \mpscatcodes `\[ \letterleftbracket
+% \setcatcodecommand \mpscatcodes `\] \letterrightbracket
+% \setcatcodecommand \mpscatcodes `\{ \letterleftbrace
+% \setcatcodecommand \mpscatcodes `\} \letterrightbrace}
+
+% \def\ignoreMPspecials
+% {\setcatcodecommand \mpscatcodes `\% \letterpercent
+% \setcatcodecommand \mpscatcodes `\[ \empty
+% \setcatcodecommand \mpscatcodes `\] \empty
+% \setcatcodecommand \mpscatcodes `\{ \empty
+% \setcatcodecommand \mpscatcodes `\} \empty}
+
+% \def\obeyMPspecials
+% {\setcatcodecommand \mpscatcodes `\% \letterpercent
+% \setcatcodecommand \mpscatcodes `\[ \letterleftbracket
+% \setcatcodecommand \mpscatcodes `\] \letterrightbracket
+% \setcatcodecommand \mpscatcodes `\{ \letterleftbrace
+% \setcatcodecommand \mpscatcodes `\} \letterrightbrace}
+
+% \gdef\setMPspecials|
+% {\setcatcodetable\mpscatcodes
+% \lccode`\-=\zerocount % to be sure, it could be a letter
+% \lccode`\%=`\%% % otherwise it's seen as a number
+% \def\({\char40\relax }%
+% \def\){\char41\relax }%
+% \def\\{\char92\relax }%
+% \def\0{\octalMPcharacter0}%
+% \def\1{\octalMPcharacter1}%
+% \def\2{\octalMPcharacter2}%
+% \def\3{\octalMPcharacter3}%
+% \def\4{\octalMPcharacter4}%
+% \def\5{\octalMPcharacter5}%
+% \def\6{\octalMPcharacter6}%
+% \def\7{\octalMPcharacter7}%
+% \def\8{\octalMPcharacter8}%
+% \def\9{\octalMPcharacter9}}
diff --git a/tex/context/base/meta-pdf.mkiv b/tex/context/base/meta-pdf.mkiv
new file mode 100644
index 000000000..fa9627fbe
--- /dev/null
+++ b/tex/context/base/meta-pdf.mkiv
@@ -0,0 +1,474 @@
+%D \module
+%D [ file=meta-pdf,
+%D version=2006.06.07,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Conversion to \PDF,
+%D author=Hans Hagen \& others (see text),
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{meta-pdf}{1.003}
+
+%D We will clean up the color mess later.
+
+\writestatus{loading}{MetaPost Graphics / MPS to PDF}
+
+\unprotect
+
+%D \macros
+%D {convertMPtoPDF}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. The traditional method is in the MkII file.
+%D
+%D The main conversion command is:
+%D
+%D \starttyping
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptyping
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttyping
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptyping
+
+\def\PDFMPformoffset
+ {\ifdefined\objectoffset\objectoffset\else\zeropoint\fi}
+
+%D The main macro:
+
+\def\convertMPtoPDF#1#2#3% scaling no longer supported at this level (so #2 & #3 ignored)
+ {\vbox\bgroup
+ \message{[MP to PDF]}%
+ \xdef\MPfilename{#1}%
+ \glet\MPwidth \!!zeropoint
+ \glet\MPheight\!!zeropoint
+ \glet\MPllx \!!zerocount
+ \glet\MPlly \!!zerocount
+ \glet\MPurx \!!zerocount
+ \glet\MPury \!!zerocount
+ \forgetall
+ \offinterlineskip
+ \setbox\scratchbox\vbox\bgroup
+ \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
+ \egroup
+ \setbox\scratchbox\hbox\bgroup
+ \hskip-\MPllx\onebasepoint
+ \raise-\MPlly\onebasepoint
+ \box\scratchbox
+ \egroup
+ \setbox\scratchbox\vbox to \MPheight\bgroup
+ \vfill
+ \hsize\MPwidth
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup
+ \wd\scratchbox\MPwidth
+ \ht\scratchbox\MPheight
+ \dopackageMPgraphic\scratchbox
+ \egroup}
+
+%D Objects (move all to backend)
+
+% \def\dopackageMPgraphic#1% #1 = boxregister
+% {\scratchdimen\PDFMPformoffset\relax
+% \ifdim\scratchdimen>\zeropoint % compensate for error
+% \setbox#1\vbox spread 2\scratchdimen
+% {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+% \fi
+% \setMPPDFobject{#1}%
+% \ifdim\scratchdimen>\zeropoint % compensate for error
+% \vbox to \MPheight
+% {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+% \else
+% \getMPPDFobject
+% \fi}
+%
+% \def\setMPPDFobject#1% boxnumber
+% {\the\pdfbackendeveryxform
+% \finalizeobjectbox{#1}%
+% \immediate\pdfxform resources{\pdfcurrentresources}#1%
+% \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}}
+%
+% \let\getMPPDFobject\relax
+
+% we don't need to package as each page has all resources anyway
+
+\let\dopackageMPgraphic\box
+
+%D \macros
+%D {deleteMPgraphic,
+%D startMPresources,
+%D stopMPresources}
+
+\ifx\deleteMPgraphic\undefined
+ \def\deleteMPgraphic#1{}
+\fi
+
+\ifx\startMPresources\undefined
+ \let\startMPresources\relax
+ \let\stopMPresources\relax
+\fi
+
+%D We implement extensions by using the \METAPOST\ special
+%D mechanism. Opposite to \TEX's specials, the \METAPOST\ ones
+%D are flushed before or after the graphic data, but thereby
+%D are no longer connected to a position.
+%D
+%D We implement specials by overloading the \type {fill}
+%D operator. By counting the fills, we can let the converter
+%D treat the appropriate fill in a special way. The
+%D specification of the speciality can have two forms,
+%D determined by the setting of a boolean variable:
+%D
+%D \starttyping
+%D _inline_specials_ := false ; % comment like code (default)
+%D _inline_specials_ := true ; % command like code
+%D \stoptyping
+%D
+%D When the specification is embedded as comment, it looks
+%D like:
+%D
+%D \starttyping
+%D %%MetaPostSpecial <size> <data> <number> <identifier>
+%D \stoptyping
+%D
+%D The in||line alternative is more tuned for \POSTSCRIPT,
+%D since it permits us to define a macro \type {special}.
+%D
+%D \starttyping
+%D inline : <data> <number> <identifier> <size> special
+%D \stoptyping
+%D
+%D The \type {identifier} determines what to do, and the data
+%D can be used to accomplish this. A type~2 shading function
+%D has identifier~2. Alltogether, the number of parameters is
+%D specified in \type {size}. The \type {number} is the number
+%D of the fill that needs the special treatment. For a type~2
+%D and~3 shaded fill, the datablock contains the following
+
+%D data:
+%D
+%D \starttyping
+%D from to n inner_r g b x y outer_r g b x y
+%D from to n inner_r g b x y radius outer_r g b x y radius
+%D \stoptyping
+
+\newconditional\manyMPspecials \settrue\manyMPspecials
+
+%D Since colors are not subjected to transformations, we can
+%D only use colors as signal. In our case, we use a dummy colored
+%D path with a red color component of \type {0.n}, so \type
+%D {0.001} is the first path and \type {0.010} the tenth. Since
+%D \METAPOST strips trailing zeros, we have to padd the string.
+
+\newif\ifMPcmykcolors
+\newif\ifMPspotcolors
+
+%D We support specials but assume that the files are somewhat simple
+%D ones wo we have dropped a few. The reason is that runtime \METAPOST\
+%D processing now uses \MPLIB\ so we only need to deal with the
+%D conversion here. See meta-pdh.mkiv (and older files) for more
+%D details. Here we just give a few examples.
+%D
+%D \startbuffer[mp]
+%D fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ;
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \startcombination[4*1]
+%D {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3}
+%D {\definecolor[test][c=.9,y=.15] \processMPbuffer[mp]} {c=.9 y=.15}
+%D {\definecolor[test][c=.25,y=.8] \processMPbuffer[mp]} {c=.25 y=.8}
+%D {\definecolor[test][c=.45,y=.1] \processMPbuffer[mp]} {c=.45 y=.1}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure
+%D {\CMYK\ support disabled,
+%D conversion to \RGB.}
+%D {\setupcolors[cmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no support in \METAPOST.}
+%D {\setupcolors[cmyk=ja,mpcmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no conversion to \RGB,
+%D support in \METAPOST}
+%D {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]}
+%D
+%D Transparency support used specials 60 (rgb) and 61
+%D (cmyk).
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor transparent(1,.5,yellow) ;
+%D fill p rotated 210 withcolor transparent(1,.5,green) ;
+%D fill p rotated 330 withcolor transparent(1,.5,blue) ;
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D One can also communicate colors between \CONTEXT\ and
+%D \METAPOST:
+%D
+%D \startbuffer
+%D \definecolor[tcyan] [c=1,k=.2,t=.5]
+%D \definecolor[tmagenta][m=1,k=.2,t=.5]
+%D \definecolor[tyellow] [y=1,k=.2,t=.5]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor \MPcolor{tcyan} ;
+%D fill p rotated 210 withcolor \MPcolor{tmagenta} ;
+%D fill p rotated 330 withcolor \MPcolor{tyellow} ;
+%D \stopbuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D Shading is an example of a more advanced graphic feature,
+%D but users will seldom encounter those complications. Here
+%D we only show a few simple examples, but many other
+%D alternatives are possible by setting up the functions built
+%D in \PDF\ in the appropriate way.
+%D
+%D Shading has to do with interpolation between two or more
+%D points or user supplied ranges. In \PDF, the specifications
+%D of a shade has to be encapsulated in objects and passed on
+%D as resources. This is a \PDF\ level 1.3. feature. One can
+%D simulate three dimensional shades as well and define simple
+%D functions using a limited set of \POSTSCRIPT\ primitives.
+%D Given the power of \METAPOST\ and these \PDF\ features, we
+%D can achieve superb graphic effects.
+%D
+%D Since everything is hidden in \TEX\ and \METAPOST\ graphics,
+%D we can stick to high level \CONTEXT\ command, as shown in
+%D the following exmples.
+%D
+%D \startbuffer
+%D \startuniqueMPgraphic{CircularShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D circular_shade(p,0,.2red,.9red) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{LinearShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,0,.2blue,.9blue) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{DuotoneShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,2,.5green,.5red) ;
+%D \stopuniqueMPgraphic
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D These graphics can be hooked into the overlay mechanism,
+%D which is available in many commands.
+%D
+%D \startbuffer
+%D \defineoverlay[demo 1][\uniqueMPgraphic{CircularShade}]
+%D \defineoverlay[demo 2][\uniqueMPgraphic {LinearShade}]
+%D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D These backgrounds can for instance be applied to \type
+%D {\framed}:
+%D
+%D \startbuffer
+%D \setupframed[width=3cm,height=2cm,frame=off]
+%D \startcombination[3*1]
+%D {\framed[backgroundachtergrond=demo 1]{\bfd \white Demo 1}} {}
+%D {\framed[backgroundachtergrond=demo 2]{\bfd \white Demo 2}} {}
+%D {\framed[backgroundachtergrond=demo 3]{\bfd \white Demo 3}} {}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D There are a few more alternatives, determined by the second
+%D parameter passed to \type {circular_shade} and alike.
+%D
+%D \def\SomeShade#1#2#3#4#5%
+%D {\startuniqueMPgraphic{Shade-#1}
+%D width := \overlaywidth ;
+%D height := \overlayheight ;
+%D path p ; p := unitsquare xscaled width yscaled height ;
+%D #2_shade(p,#3,#4,#5) ;
+%D \stopuniqueMPgraphic
+%D \defineoverlay[Shade-#1][\uniqueMPgraphic{Shade-#1}]%
+%D \framed[backgroundachtergrond=Shade-#1,width=2cm,height=2cm,frame=off]{}}
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{10}{circular}{0}{.3blue}{.9blue}} {circular 0}
+%D {\SomeShade{11}{circular}{1}{.3blue}{.9blue}} {circular 1}
+%D {\SomeShade{12}{circular}{2}{.3blue}{.9blue}} {circular 2}
+%D {\SomeShade{13}{circular}{3}{.3blue}{.9blue}} {circular 3}
+%D {\SomeShade{14}{circular}{4}{.3blue}{.9blue}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0}
+%D {\SomeShade{21}{circular}{1}{.9green}{.3green}} {circular 1}
+%D {\SomeShade{22}{circular}{2}{.9green}{.3green}} {circular 2}
+%D {\SomeShade{23}{circular}{3}{.9green}{.3green}} {circular 3}
+%D {\SomeShade{24}{circular}{4}{.9green}{.3green}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \startcombination[4*1]
+%D {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0}
+%D {\SomeShade{31}{linear}{1}{.3red}{.9red}} {linear 1}
+%D {\SomeShade{32}{linear}{2}{.3red}{.9red}} {linear 2}
+%D {\SomeShade{33}{linear}{3}{.3red}{.9red}} {linear 3}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D These macros closely cooperate with the \METAPOST\ module
+%D \type {mp-spec.mp}, which is part of the \CONTEXT\
+%D distribution.
+%D
+%D The low level (\PDF) implementation is based on the \TEX\
+%D based \METAPOST\ to \PDF\ converter. Shading is supported
+%D by overloading the \type {fill} operator as implemented
+%D earlier. In \PDF\ type~2 and~3 shading functions are
+%D specified in terms of:
+%D
+%D \starttabulate[|Tl|l|]
+%D \NC /Domain \NC sort of meeting range \NC \NR
+%D \NC /C0 \NC inner shade \NC \NR
+%D \NC /C1 \NC outer shade \NC \NR
+%D \NC /N \NC smaller values, bigger inner circles \NC \NR
+%D \stoptabulate
+%D
+%D An example of using both special features is the
+%D following.
+%D
+%D \starttyping
+%D \startMPpage
+%D externalfigure "hakker1b.png" scaled 22cm rotated 10 shifted (-2cm,0cm);
+%D externalfigure "hakker1b.png" scaled 10cm rotated -10 ;
+%D externalfigure "hakker1b.png" scaled 7cm rotated 45 shifted (8cm,12cm) ;
+%D path p ; p := unitcircle xscaled 15cm yscaled 20cm;
+%D path q ; q := p rotatedaround(center p,90) ;
+%D path r ; r := buildcycle(p,q) ; clip currentpicture to r ;
+%D path s ; s := boundingbox currentpicture enlarged 5mm ;
+%D picture c ; c := currentpicture ; currentpicture := nullpicture ;
+%D circular_shade(s,0,.2red,.9red) ;
+%D addto currentpicture also c ;
+%D \stopMPpage
+%D \stoptyping
+
+\startMPinitializations
+ mp_shade_version := 2 ;
+\stopMPinitializations
+
+%D This is done much cleaner in \MPLIB.
+
+% %D A common hook.
+%
+% \let\MPfshowcommand\empty
+%
+% \def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
+% {\def\MPtextdata{#3}% % delegate the splitter to lua + redesign
+% \def\MPtextsize{#2}%
+% \def\lastMPmoveX{#4}%
+% \def\lastMPmoveY{#5}%
+% \defconvertedcommand\MPtextdata\MPtextdata % no edef
+% \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber
+% \executeifdefined{handleMPtext\MPtexttag}
+% {\setbox\scratchbox\hbox
+% {\font\temp=#1\space at #2\onebasepoint
+% \let\c\char
+% \temp
+% \MPfshowcommand{#3}}%
+% \setbox\scratchbox\hbox
+% {\hskip#4\onebasepoint
+% \raise#5\onebasepoint
+% \box\scratchbox}%
+% \smashbox\scratchbox
+% \box\scratchbox}}
+
+\unexpanded\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
+ {\setbox\scratchbox\hbox
+ {\font\temp=#1\space at #2\onebasepoint \let\c\char \temp #3}%
+ \setbox\scratchbox\hbox
+ {\hskip#4\onebasepoint \raise#5\onebasepoint \box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox}
+
+%D The boundingbox.
+
+\def\MPSboundingbox#1#2#3#4%
+ {\xdef\MPllx{#1}\xdef\MPlly{#2}\xdef\MPurx{#3}\xdef\MPury{#4}%
+ \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}%
+ \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}}
+
+\MPSboundingbox0000
+
+%D Test code:
+%D
+%D \startbuffer
+%D \startMPcode
+%D fill fullcircle scaled 3cm withcolor red ;
+%D fill fullcircle scaled 2cm withcolor green ;
+%D fill fullcircle scaled 1cm withcolor blue ;
+%D currentpicture := currentpicture shifted (-4cm,0) ;
+%D fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ;
+%D fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ;
+%D fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ;
+%D currentpicture := currentpicture shifted (-4cm,0) ;
+%D draw fullcircle scaled 3cm dashed evenly ;
+%D draw fullcircle scaled 2cm dashed withdots ;
+%D draw origin withpen pencircle scaled 3mm;
+%D currentpicture := currentpicture shifted (-4cm,0) ;
+%D fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red);
+%D fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red);
+%D fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green);
+%D fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5));
+%D currentpicture := currentpicture shifted (12cm,-4cm) ;
+%D draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ;
+%D currentpicture := currentpicture shifted (-4cm,0) ;
+%D % bug: shift
+%D draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30 ;
+%D draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ;
+%D filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ;
+%D currentpicture := currentpicture shifted (-4cm,0) ;
+%D % shade cannot handle shift
+%D circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ;
+%D circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ;
+%D filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ;
+%D \stopMPcode
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+\protect \endinput
diff --git a/tex/context/base/meta-pdh.lua b/tex/context/base/meta-pdh.lua
new file mode 100644
index 000000000..05cdfc176
--- /dev/null
+++ b/tex/context/base/meta-pdh.lua
@@ -0,0 +1,602 @@
+if not modules then modules = { } end modules ['meta-pdf'] = {
+ version = 1.001,
+ comment = "companion to meta-pdf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This file contains the history of the converter. We keep it around as it
+-- relates to the development of luatex.
+
+-- This is the third version. Version 1 converted to Lua code,
+-- version 2 gsubbed the file into TeX code, and version 3 uses
+-- the new lpeg functionality and streams the result into TeX.
+
+-- We will move old stuff to edu.
+
+--~ old lpeg 0.4 lpeg 0.5
+--~ 100 times test graphic 2.45 (T:1.07) 0.72 (T:0.24) 0.580 (0.560 no table) -- 0.54 optimized for one space (T:0.19)
+--~ 100 times big graphic 10.44 4.30/3.35 nogb 2.914 (2.050 no table) -- 1.99 optimized for one space (T:0.85)
+--~ 500 times test graphic T:1.29 T:1.16 (T:1.10 no table) -- T:1.10
+
+-- only needed for mp output on disk
+
+local concat, format, find, gsub, gmatch = table.concat, string.format, string.find, string.gsub, string.gmatch
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local tostring, tonumber, select = tostring, tonumber, select
+local lpegmatch = lpeg.match
+
+mptopdf = { }
+mptopdf.parsers = { }
+mptopdf.parser = 'none'
+mptopdf.n = 0
+
+function mptopdf.reset()
+ mptopdf.data = ""
+ mptopdf.path = { }
+ mptopdf.stack = { }
+ mptopdf.texts = { }
+ mptopdf.version = 0
+ mptopdf.shortcuts = false
+ mptopdf.resetpath()
+end
+
+function mptopdf.resetpath()
+ mptopdf.stack.close = false
+ mptopdf.stack.path = { }
+ mptopdf.stack.concat = nil
+ mptopdf.stack.special = false
+end
+
+mptopdf.reset()
+
+function mptopdf.parsers.none()
+ -- no parser set
+end
+
+function mptopdf.parse()
+ mptopdf.parsers[mptopdf.parser]()
+end
+
+-- old code
+
+mptopdf.steps = { }
+
+mptopdf.descapes = {
+ ['('] = "\\\\char40 ",
+ [')'] = "\\\\char41 ",
+ ['"'] = "\\\\char92 "
+}
+
+function mptopdf.descape(str)
+ str = gsub(str,"\\(%d%d%d)",function(n)
+ return "\\char" .. tonumber(n,8) .. " "
+ end)
+ return gsub(str,"\\([%(%)\\])",mptopdf.descapes)
+end
+
+function mptopdf.steps.descape(str)
+ str = gsub(str,"\\(%d%d%d)",function(n)
+ return "\\\\char" .. tonumber(n,8) .. " "
+ end)
+ return gsub(str,"\\([%(%)\\])",mptopdf.descapes)
+end
+
+function mptopdf.steps.strip() -- .3 per expr
+ mptopdf.data = gsub(mptopdf.data,"^(.-)%%+Page:.-%c+(.*)%s+%a+%s+%%+EOF.*$", function(preamble, graphic)
+ local bbox = "0 0 0 0"
+ for b in gmatch(preamble,"%%%%%a+oundingBox: +(.-)%c+") do
+ bbox = b
+ end
+ local name, version = gmatch(preamble,"%%%%Creator: +(.-) +(.-) ")
+ mptopdf.version = tostring(version or "0")
+ if find(preamble,"/hlw{0 dtransform") then
+ mptopdf.shortcuts = true
+ end
+ -- the boundingbox specification needs to come before data, well, not really
+ return bbox .. " boundingbox\n" .. "\nbegindata\n" .. graphic .. "\nenddata\n"
+ end, 1)
+ mptopdf.data = gsub(mptopdf.data,"%%%%MetaPostSpecials: +(.-)%c+", "%1 specials\n", 1)
+ mptopdf.data = gsub(mptopdf.data,"%%%%MetaPostSpecial: +(.-)%c+", "%1 special\n")
+ mptopdf.data = gsub(mptopdf.data,"%%.-%c+", "")
+end
+
+function mptopdf.steps.cleanup()
+ if not mptopdf.shortcuts then
+ mptopdf.data = gsub(mptopdf.data,"gsave%s+fill%s+grestore%s+stroke", "both")
+ mptopdf.data = gsub(mptopdf.data,"([%d%.]+)%s+([%d%.]+)%s+dtransform%s+exch%s+truncate%s+exch%s+idtransform%s+pop%s+setlinewidth", function(wx,wy)
+ if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end
+ end)
+ mptopdf.data = gsub(mptopdf.data,"([%d%.]+)%s+([%d%.]+)%s+dtransform%s+truncate%s+idtransform%s+setlinewidth%s+pop", function(wx,wy)
+ if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end
+ end)
+ end
+end
+
+function mptopdf.steps.convert()
+ mptopdf.data = gsub(mptopdf.data,"%c%((.-)%) (.-) (.-) fshow", function(str,font,scale)
+ mptopdf.texts[mptopdf.texts+1] = {mptopdf.steps.descape(str), font, scale}
+ return "\n" .. #mptopdf.texts .. " textext"
+ end)
+ mptopdf.data = gsub(mptopdf.data,"%[%s*(.-)%s*%]", function(str)
+ return gsub(str,"%s+"," ")
+ end)
+ local t
+ mptopdf.data = gsub(mptopdf.data,"%s*([^%a]-)%s*(%a+)", function(args,cmd)
+ if cmd == "textext" then
+ t = mptopdf.texts[tonumber(args)]
+ return "mps.textext(" .. "\"" .. t[2] .. "\"," .. t[3] .. ",\"" .. t[1] .. "\")\n"
+ else
+ return "mps." .. cmd .. "(" .. gsub(args," +",",") .. ")\n"
+ end
+ end)
+end
+
+function mptopdf.steps.process()
+ assert(loadstring(mptopdf.data))() -- () runs the loaded chunk
+end
+
+function mptopdf.parsers.gsub()
+ mptopdf.steps.strip()
+ mptopdf.steps.cleanup()
+ mptopdf.steps.convert()
+ mptopdf.steps.process()
+end
+
+-- end of old code
+
+-- from lua to tex
+
+function mptopdf.pdfcode(str)
+ texsprint(ctxcatcodes,"\\pdfliteral{" .. str .. "}") -- \\MPScode
+end
+
+function mptopdf.texcode(str)
+ texsprint(ctxcatcodes,str)
+end
+
+-- auxiliary functions
+
+function mptopdf.flushconcat()
+ if mptopdf.stack.concat then
+ mptopdf.pdfcode(concat(mptopdf.stack.concat," ") .. " cm")
+ mptopdf.stack.concat = nil
+ end
+end
+
+function mptopdf.flushpath(cmd)
+ -- faster: no local function and loop
+ if #mptopdf.stack.path > 0 then
+ local path = { }
+ if mptopdf.stack.concat then
+ local sx, sy = mptopdf.stack.concat[1], mptopdf.stack.concat[4]
+ local rx, ry = mptopdf.stack.concat[2], mptopdf.stack.concat[3]
+ local tx, ty = mptopdf.stack.concat[5], mptopdf.stack.concat[6]
+ local d = (sx*sy) - (rx*ry)
+ local function mpconcat(px, py)
+ return (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d
+ end
+ local stackpath = mptopdf.stack.path
+ for k=1,#stackpath do
+ local v = stackpath[k]
+ v[1],v[2] = mpconcat(v[1],v[2])
+ if #v == 7 then
+ v[3],v[4] = mpconcat(v[3],v[4])
+ v[5],v[6] = mpconcat(v[5],v[6])
+ end
+ path[#path+1] = concat(v," ")
+ end
+ else
+ local stackpath = mptopdf.stack.path
+ for k=1,#stackpath do
+ path[#path+1] = concat(stackpath[k]," ")
+ end
+ end
+ mptopdf.flushconcat()
+ mptopdf.texcode("\\MPSpath{" .. concat(path," ") .. "}")
+ if mptopdf.stack.close then
+ mptopdf.texcode("\\MPScode{h " .. cmd .. "}")
+ else
+ mptopdf.texcode("\\MPScode{" .. cmd .."}")
+ end
+ end
+ mptopdf.resetpath()
+end
+
+function mptopdf.loaded(name)
+ local ok, n
+ mptopdf.reset()
+ ok, mptopdf.data, n = resolvers.loadbinfile(name, 'tex') -- we need a binary load !
+ return ok
+end
+
+if not mptopdf.parse then
+ function mptopdf.parse() end -- forward declaration
+end
+
+function mptopdf.convertmpstopdf(name)
+ if mptopdf.loaded(name) then
+ mptopdf.n = mptopdf.n + 1
+ statistics.starttiming(mptopdf)
+ mptopdf.parse()
+ mptopdf.reset()
+ statistics.stoptiming(mptopdf)
+ else
+ tex.print("file " .. name .. " not found")
+ end
+end
+
+-- mp interface
+
+mps = mps or { }
+
+function mps.creator(a, b, c)
+ mptopdf.version = tonumber(b)
+end
+
+function mps.creationdate(a)
+ mptopdf.date= a
+end
+
+function mps.newpath()
+ mptopdf.stack.path = { }
+end
+
+function mps.boundingbox(llx, lly, urx, ury)
+ mptopdf.texcode("\\MPSboundingbox{" .. llx .. "}{" .. lly .. "}{" .. urx .. "}{" .. ury .. "}")
+end
+
+function mps.moveto(x,y)
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {x,y,"m"}
+end
+
+function mps.curveto(ax, ay, bx, by, cx, cy)
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {ax,ay,bx,by,cx,cy,"c"}
+end
+
+function mps.lineto(x,y)
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {x,y,"l"}
+end
+
+function mps.rlineto(x,y)
+ local dx, dy = 0, 0
+ if #mptopdf.stack.path > 0 then
+ dx, dy = mptopdf.stack.path[#mptopdf.stack.path][1], mptopdf.stack.path[#mptopdf.stack.path][2]
+ end
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {dx,dy,"l"}
+end
+
+function mps.translate(tx,ty)
+ mptopdf.pdfcode("1 0 0 0 1 " .. tx .. " " .. ty .. " cm")
+end
+
+function mps.scale(sx,sy)
+ mptopdf.stack.concat = {sx,0,0,sy,0,0}
+end
+
+function mps.concat(sx, rx, ry, sy, tx, ty)
+ mptopdf.stack.concat = {sx,rx,ry,sy,tx,ty}
+end
+
+function mps.setlinejoin(d)
+ mptopdf.pdfcode(d .. " j")
+end
+
+function mps.setlinecap(d)
+ mptopdf.pdfcode(d .. " J")
+end
+
+function mps.setmiterlimit(d)
+ mptopdf.pdfcode(d .. " M")
+end
+
+function mps.gsave()
+ mptopdf.pdfcode("q")
+end
+
+function mps.grestore()
+ mptopdf.pdfcode("Q")
+end
+
+function mps.setdash(...)
+ local n = select("#",...)
+ mptopdf.pdfcode("[" .. concat({...}," ",1,n-1) .. "] " .. select(n,...) .. " d")
+end
+
+function mps.resetdash()
+ mptopdf.pdfcode("[ ] 0 d")
+end
+
+function mps.setlinewidth(d)
+ mptopdf.pdfcode(d .. " w")
+end
+
+function mps.closepath()
+ mptopdf.stack.close = true
+end
+
+function mps.fill()
+ mptopdf.flushpath('f')
+end
+
+function mps.stroke()
+ mptopdf.flushpath('S')
+end
+
+function mps.both()
+ mptopdf.flushpath('B')
+end
+
+function mps.clip()
+ mptopdf.flushpath('W n')
+end
+
+function mps.textext(font, scale, str) -- old parser
+ local dx, dy = 0, 0
+ if #mptopdf.stack.path > 0 then
+ dx, dy = mptopdf.stack.path[1][1], mptopdf.stack.path[1][2]
+ end
+ mptopdf.flushconcat()
+ mptopdf.texcode("\\MPStextext{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}")
+ mptopdf.resetpath()
+end
+
+--~ function mps.handletext(font,scale.str,dx,dy)
+--~ local one, two = string.match(str, "^(%d+)::::(%d+)")
+--~ if one and two then
+--~ mptopdf.texcode("\\MPTOPDFtextext{"..font.."}{"..scale.."}{"..one.."}{"..two.."}{"..dx.."}{"..dy.."}")
+--~ else
+--~ mptopdf.texcode("\\MPTOPDFtexcode{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}")
+--~ end
+--~ end
+
+function mps.setrgbcolor(r,g,b) -- extra check
+ r, g = tonumber(r), tonumber(g) -- needed when we use lpeg
+ if r == 0.0123 and g < 0.1 then
+ mptopdf.texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}")
+ elseif r == 0.123 and g < 0.1 then
+ mptopdf.texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}")
+ else
+ mptopdf.texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}")
+ end
+end
+
+function mps.setcmykcolor(c,m,y,k)
+ mptopdf.texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}")
+end
+
+function mps.setgray(s)
+ mptopdf.texcode("\\MPSgray{" .. s .. "}")
+end
+
+function mps.specials(version,signal,factor) -- 2.0 123 1000
+end
+
+function mps.special(...) -- 7 1 0.5 1 0 0 1 3
+ local n = select("#",...)
+ mptopdf.texcode("\\MPSbegin\\MPSset{" .. concat({...},"}\\MPSset{",2,n) .. "}\\MPSend")
+end
+
+function mps.begindata()
+end
+
+function mps.enddata()
+end
+
+function mps.showpage()
+end
+
+mps.n = mps.newpath -- n
+mps.p = mps.closepath -- h
+mps.l = mps.lineto -- l
+mps.r = mps.rlineto -- r
+mps.m = mps.moveto -- m
+mps.c = mps.curveto -- c
+mps.hlw = mps.setlinewidth
+mps.vlw = mps.setlinewidth
+
+mps.C = mps.setcmykcolor -- k
+mps.G = mps.setgray -- g
+mps.R = mps.setrgbcolor -- rg
+
+mps.lj = mps.setlinejoin -- j
+mps.ml = mps.setmiterlimit -- M
+mps.lc = mps.setlinecap -- J
+mps.sd = mps.setdash -- d
+mps.rd = mps.resetdash
+
+mps.S = mps.stroke -- S
+mps.F = mps.fill -- f
+mps.B = mps.both -- B
+mps.W = mps.clip -- W
+
+mps.q = mps.gsave -- q
+mps.Q = mps.grestore -- Q
+
+mps.s = mps.scale -- (not in pdf)
+mps.t = mps.concat -- (not the same as pdf anyway)
+
+mps.P = mps.showpage
+
+-- experimental
+
+function mps.attribute(id,value)
+ mptopdf.texcode("\\attribute " .. id .. "=" .. value .. " ")
+-- mptopdf.texcode("\\dompattribute{" .. id .. "}{" .. value .. "}")
+end
+
+-- lpeg parser
+
+-- The lpeg based parser is rather optimized for the kind of output
+-- that MetaPost produces. It's my first real lpeg code, which may
+-- show. Because the parser binds to functions, we define it last.
+
+do -- assumes \let\c\char
+
+ local byte = string.byte
+ local digit = lpeg.R("09")
+ local spec = digit^2 * lpeg.P("::::") * digit^2
+ local text = lpeg.Cc("{") * (
+ lpeg.P("\\") * ( (digit * digit * digit) / function(n) return "c" .. tonumber(n,8) end) +
+ lpeg.P(" ") / function(n) return "\\c32" end + -- never in new mp
+ lpeg.P(1) / function(n) return "\\c" .. byte(n) end
+ ) * lpeg.Cc("}")
+ local package = lpeg.Cs(spec + text^0)
+
+ function mps.fshow(str,font,scale) -- lpeg parser
+ mps.textext(font,scale,lpegmatch(package,str))
+ end
+
+end
+
+do
+
+ local eol = lpeg.S('\r\n')^1
+ local sp = lpeg.P(' ')^1
+ local space = lpeg.S(' \r\n')^1
+ local number = lpeg.S('0123456789.-+')^1
+ local nonspace = lpeg.P(1-lpeg.S(' \r\n'))^1
+
+ local cnumber = lpeg.C(number)
+ local cstring = lpeg.C(nonspace)
+
+ local specials = (lpeg.P("%%MetaPostSpecials:") * sp * (cstring * sp^0)^0 * eol) / mps.specials
+ local special = (lpeg.P("%%MetaPostSpecial:") * sp * (cstring * sp^0)^0 * eol) / mps.special
+ local boundingbox = (lpeg.P("%%BoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mps.boundingbox
+ local highresboundingbox = (lpeg.P("%%HiResBoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mps.boundingbox
+
+ local setup = lpeg.P("%%BeginSetup") * (1 - lpeg.P("%%EndSetup") )^1
+ local prolog = lpeg.P("%%BeginProlog") * (1 - lpeg.P("%%EndProlog"))^1
+ local comment = lpeg.P('%')^1 * (1 - eol)^1
+
+ local curveto = ((cnumber * sp)^6 * lpeg.P("curveto") ) / mps.curveto
+ local lineto = ((cnumber * sp)^2 * lpeg.P("lineto") ) / mps.lineto
+ local rlineto = ((cnumber * sp)^2 * lpeg.P("rlineto") ) / mps.rlineto
+ local moveto = ((cnumber * sp)^2 * lpeg.P("moveto") ) / mps.moveto
+ local setrgbcolor = ((cnumber * sp)^3 * lpeg.P("setrgbcolor") ) / mps.setrgbcolor
+ local setcmykcolor = ((cnumber * sp)^4 * lpeg.P("setcmykcolor") ) / mps.setcmykcolor
+ local setgray = ((cnumber * sp)^1 * lpeg.P("setgray") ) / mps.setgray
+ local newpath = ( lpeg.P("newpath") ) / mps.newpath
+ local closepath = ( lpeg.P("closepath") ) / mps.closepath
+ local fill = ( lpeg.P("fill") ) / mps.fill
+ local stroke = ( lpeg.P("stroke") ) / mps.stroke
+ local clip = ( lpeg.P("clip") ) / mps.clip
+ local both = ( lpeg.P("gsave fill grestore")) / mps.both
+ local showpage = ( lpeg.P("showpage") )
+ local setlinejoin = ((cnumber * sp)^1 * lpeg.P("setlinejoin") ) / mps.setlinejoin
+ local setlinecap = ((cnumber * sp)^1 * lpeg.P("setlinecap") ) / mps.setlinecap
+ local setmiterlimit = ((cnumber * sp)^1 * lpeg.P("setmiterlimit") ) / mps.setmiterlimit
+ local gsave = ( lpeg.P("gsave") ) / mps.gsave
+ local grestore = ( lpeg.P("grestore") ) / mps.grestore
+
+ local setdash = (lpeg.P("[") * (cnumber * sp^0)^0 * lpeg.P("]") * sp * cnumber * sp * lpeg.P("setdash")) / mps.setdash
+ local concat = (lpeg.P("[") * (cnumber * sp^0)^6 * lpeg.P("]") * sp * lpeg.P("concat") ) / mps.concat
+ local scale = ( (cnumber * sp^0)^6 * sp * lpeg.P("concat") ) / mps.concat
+
+ local fshow = (lpeg.P("(") * lpeg.C((1-lpeg.P(")"))^1) * lpeg.P(")") * space * cstring * space * cnumber * space * lpeg.P("fshow")) / mps.fshow
+ local fshow = (lpeg.P("(") *
+ lpeg.Cs( ( lpeg.P("\\(")/"\\050" + lpeg.P("\\)")/"\\051" + (1-lpeg.P(")")) )^1 )
+ * lpeg.P(")") * space * cstring * space * cnumber * space * lpeg.P("fshow")) / mps.fshow
+
+ local setlinewidth_x = (lpeg.P("0") * sp * cnumber * sp * lpeg.P("dtransform truncate idtransform setlinewidth pop")) / mps.setlinewidth
+ local setlinewidth_y = (cnumber * sp * lpeg.P("0 dtransform exch truncate exch idtransform pop setlinewidth") ) / mps.setlinewidth
+
+ local c = ((cnumber * sp)^6 * lpeg.P("c") ) / mps.curveto -- ^6 very inefficient, ^1 ok too
+ local l = ((cnumber * sp)^2 * lpeg.P("l") ) / mps.lineto
+ local r = ((cnumber * sp)^2 * lpeg.P("r") ) / mps.rlineto
+ local m = ((cnumber * sp)^2 * lpeg.P("m") ) / mps.moveto
+ local vlw = ((cnumber * sp)^1 * lpeg.P("vlw")) / mps.setlinewidth
+ local hlw = ((cnumber * sp)^1 * lpeg.P("hlw")) / mps.setlinewidth
+
+ local R = ((cnumber * sp)^3 * lpeg.P("R") ) / mps.setrgbcolor
+ local C = ((cnumber * sp)^4 * lpeg.P("C") ) / mps.setcmykcolor
+ local G = ((cnumber * sp)^1 * lpeg.P("G") ) / mps.setgray
+
+ local lj = ((cnumber * sp)^1 * lpeg.P("lj") ) / mps.setlinejoin
+ local ml = ((cnumber * sp)^1 * lpeg.P("ml") ) / mps.setmiterlimit
+ local lc = ((cnumber * sp)^1 * lpeg.P("lc") ) / mps.setlinecap
+
+ local n = lpeg.P("n") / mps.newpath
+ local p = lpeg.P("p") / mps.closepath
+ local S = lpeg.P("S") / mps.stroke
+ local F = lpeg.P("F") / mps.fill
+ local B = lpeg.P("B") / mps.both
+ local W = lpeg.P("W") / mps.clip
+ local P = lpeg.P("P") / mps.showpage
+
+ local q = lpeg.P("q") / mps.gsave
+ local Q = lpeg.P("Q") / mps.grestore
+
+ local sd = (lpeg.P("[") * (cnumber * sp^0)^0 * lpeg.P("]") * sp * cnumber * sp * lpeg.P("sd")) / mps.setdash
+ local rd = ( lpeg.P("rd")) / mps.resetdash
+
+ local s = ( (cnumber * sp^0)^2 * lpeg.P("s") ) / mps.scale
+ local t = (lpeg.P("[") * (cnumber * sp^0)^6 * lpeg.P("]") * sp * lpeg.P("t") ) / mps.concat
+
+ -- experimental
+
+ local attribute = ((cnumber * sp)^2 * lpeg.P("attribute")) / mps.attribute
+ local A = ((cnumber * sp)^2 * lpeg.P("A")) / mps.attribute
+
+ local preamble = (
+ prolog + setup +
+ boundingbox + highresboundingbox + specials + special +
+ comment
+ )
+
+ local procset = (
+ lj + ml + lc +
+ c + l + m + n + p + r +
+ A +
+ R + C + G +
+ S + F + B + W +
+ vlw + hlw +
+ Q + q +
+ sd + rd +
+ t + s +
+ fshow +
+ P
+ )
+
+ local verbose = (
+ curveto + lineto + moveto + newpath + closepath + rlineto +
+ setrgbcolor + setcmykcolor + setgray +
+ attribute +
+ setlinejoin + setmiterlimit + setlinecap +
+ stroke + fill + clip + both +
+ setlinewidth_x + setlinewidth_y +
+ gsave + grestore +
+ concat + scale +
+ fshow +
+ setdash + -- no resetdash
+ showpage
+ )
+
+ -- order matters in terms of speed / we could check for procset first
+
+ local captures_old = ( space + verbose + preamble )^0
+ local captures_new = ( space + procset + preamble + verbose )^0
+
+ function mptopdf.parsers.lpeg()
+ if find(mptopdf.data,"%%%%BeginResource: procset mpost") then
+ lpegmatch(captures_new,mptopdf.data)
+ else
+ lpegmatch(captures_old,mptopdf.data)
+ end
+ end
+
+end
+
+mptopdf.parser = 'lpeg'
+
+-- status info
+
+statistics.register("mps conversion time",function()
+ local n = mptopdf.n
+ if n > 0 then
+ return format("%s seconds, %s conversions", statistics.elapsedtime(mptopdf),n)
+ else
+ return nil
+ end
+end)
diff --git a/tex/context/base/meta-pdh.mkiv b/tex/context/base/meta-pdh.mkiv
new file mode 100644
index 000000000..7cdd1471f
--- /dev/null
+++ b/tex/context/base/meta-pdh.mkiv
@@ -0,0 +1,780 @@
+%D \module
+%D [ file=meta-pdf,
+%D version=2006.06.07,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Conversion to \PDF,
+%D author=Hans Hagen \& others (see text),
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Formerly known as supp-pdf.tex and supp-mpe.tex and meta-pdf.mkiv.
+%D
+%D Beware: this file is not used but kept for historic purposed!
+
+% \useMPgraphic{1}
+% \testfeatureonce{250}{\setbox0\hbox{\convertMPtoPDF{test-mps-mpgraph.1}{1}{1}}}
+%
+% 8.4 : mkii, direct parsing by tex
+% 11.8 : mkiv, dirty conversion (10.8 with dirty tricks)
+% 14.5 : mkiv, clean conversion
+% 7.4 : mkiv, simulated clean direct lua from mp
+% 0.3 : time taken by tex to handle converted code
+%
+% timings may differ now that we revamped the backend
+
+\registerctxluafile{meta-pdf}{1.003}
+
+%D We will clean up the color mess later.
+
+\writestatus{loading}{MetaPost Graphics / MPS to PDF}
+
+\unprotect
+
+%D First we define a handy constant:
+
+\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+%D \macros
+%D {convertMPtoPDF}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. The traditional method is in the MkII file.
+%D
+%D The main conversion command is:
+%D
+%D \starttyping
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptyping
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttyping
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptyping
+
+%D \macros
+%D {makeMPintoPDFobject,lastPDFMPobject}
+%D
+%D For experts there are a few more options. When attributes
+%D are to be added, the code must be embedded in an object
+%D accompanied with the appropriate directives. One can
+%D influence this process with \type {\makeMPintoPDFobject}.
+%D
+%D This option defaults to~0, because \CONTEXT\ takes care
+%D of objects at another level, which saves some bytes.
+%D
+%D \starttabulate[|l|l|p|]
+%D \NC 0 \NC never \NC don't use an object \NC\NR
+%D \NC 1 \NC always \NC always use an object \NC\NR
+%D \NC 2 \NC optional \NC use object when needed \NC\NR
+%D \stoptabulate
+%D
+%D The last object number used is avaliable in the macro
+%D \type {\lastPDFMPobject}.
+
+\ifx\makeMPintoPDFobject \undefined \chardef\makeMPintoPDFobject \zerocount \fi
+\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion \fi
+
+\let\lastPDFMPobject \!!zerocount
+\let\currentPDFresources\empty
+\let\setMPextensions \relax
+
+\def\PDFMPformoffset
+ {\ifx\objectoffset\undefined\zeropoint\else\objectoffset\fi}
+
+\def\resetMPvariables#1#2#3%
+ {\global\let\MPwidth \!!zeropoint
+ \global\let\MPheight\!!zeropoint
+ \global\let\MPllx \!!zerocount
+ \global\let\MPlly \!!zerocount
+ \global\let\MPurx \!!zerocount
+ \global\let\MPury \!!zerocount
+ \xdef\MPxscale {#2}\ifx\MPxscale\empty\let\MPxscale\!!plusone\fi
+ \xdef\MPyscale {#3}\ifx\MPyscale\empty\let\MPyscale\!!plusone\fi
+ \xdef\MPfilename {#1}}
+
+%D The main macro:
+
+\def\convertMPtoPDF#1#2#3% watch the transparency reset
+ {\resetMPvariables{#1}{#2}{#3}%
+ \vbox\bgroup
+ \forgetall
+ \offinterlineskip
+ \setbox\scratchbox\vbox\bgroup
+ \setnormalcatcodes % we can be in verbatim or so
+ \message{[MP to PDF]}%
+ \startMPresources
+ \pdfliteral{\letterpercent\space mps begin}%
+ \pdfliteral{q 1 0 0 1 0 0 cm}%
+ \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
+ \pdfliteral{Q}%
+ \pdfliteral{\letterpercent\space mps end}%
+ \stopMPresources
+ \egroup
+ \setbox\scratchbox\hbox\bgroup
+ \hskip-\MPllx\onebasepoint
+ \raise-\MPlly\onebasepoint
+ \box\scratchbox
+ \egroup
+ \setbox\scratchbox\vbox to \MPheight\bgroup
+ \vfill
+ \hsize\MPwidth
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup
+ \wd\scratchbox\MPwidth
+ \ht\scratchbox\MPheight
+ \dopackageMPgraphic\scratchbox
+ \egroup}
+
+\let\processMPtoPDFfile\convertMPtoPDF
+
+%D A common hook.
+
+\let\MPfshowcommand\empty
+
+%D Objects.
+
+\def\dopackageMPgraphic#1% #1 = boxregister
+ {\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
+ % an existing value of 2 signals object support (set elsewhere)
+ \chardef\makeMPintoPDFobject\plusone
+ \fi\fi
+ \ifcase\makeMPintoPDFobject
+ \box#1%
+ \or
+ \scratchdimen\PDFMPformoffset\relax
+ \ifdim\scratchdimen>\zeropoint % compensate for error
+ \setbox#1\vbox spread 2\scratchdimen
+ {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+ \fi
+ \setMPPDFobject{\currentPDFresources}{#1}%
+ \ifdim\scratchdimen>\zeropoint % compensate for error
+ \vbox to \MPheight
+ {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+ \else
+ \getMPPDFobject
+ \fi
+ \global\let\currentPDFresources\empty
+ \else
+ \box#1%
+ \fi}
+
+\def\setMPPDFobject#1#2% resources boxnumber
+ {\ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi
+ \immediate\pdfxform resources{#1}#2%
+ \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}}
+
+\let\getMPPDFobject\relax
+
+%D \macros
+%D {deleteMPgraphic,
+%D startMPresources,
+%D stopMPresources}
+
+\ifx\deleteMPgraphic\undefined
+ \def\deleteMPgraphic#1{}
+\fi
+
+\ifx\startMPresources\undefined
+ \let\startMPresources\relax
+ \let\stopMPresources\relax
+\fi
+
+%D We implement extensions by using the \METAPOST\ special
+%D mechanism. Opposite to \TEX's specials, the \METAPOST\ ones
+%D are flushed before or after the graphic data, but thereby
+%D are no longer connected to a position.
+%D
+%D We implement specials by overloading the \type {fill}
+%D operator. By counting the fills, we can let the converter
+%D treat the appropriate fill in a special way. The
+%D specification of the speciality can have two forms,
+%D determined by the setting of a boolean variable:
+%D
+%D \starttyping
+%D _inline_specials_ := false ; % comment like code (default)
+%D _inline_specials_ := true ; % command like code
+%D \stoptyping
+%D
+%D When the specification is embedded as comment, it looks
+%D like:
+%D
+%D \starttyping
+%D %%MetaPostSpecial <size> <data> <number> <identifier>
+%D \stoptyping
+%D
+%D The in||line alternative is more tuned for \POSTSCRIPT,
+%D since it permits us to define a macro \type {special}.
+%D
+%D \starttyping
+%D inline : <data> <number> <identifier> <size> special
+%D \stoptyping
+%D
+%D The \type {identifier} determines what to do, and the data
+%D can be used to accomplish this. A type~2 shading function
+%D has identifier~2. Alltogether, the number of parameters is
+%D specified in \type {size}. The \type {number} is the number
+%D of the fill that needs the special treatment. For a type~2
+%D and~3 shaded fill, the datablock contains the following
+
+%D data:
+%D
+%D \starttyping
+%D from to n inner_r g b x y outer_r g b x y
+%D from to n inner_r g b x y radius outer_r g b x y radius
+%D \stoptyping
+
+\newconditional\manyMPspecials \settrue\manyMPspecials
+
+%D In case of \PDF, we need to prepare resourcs.
+
+\newtoks\MPstartresources
+\newtoks\MPstopresources
+
+\def\startMPresources
+ {\the\MPstartresources}
+
+\def\stopMPresources
+ {\the\MPstopresources}
+
+%D Some day we may consider collecting local resources.
+
+\appendtoks
+ \global\let\currentPDFresources\empty % kind of redundant
+\to \MPstartresources
+
+% \appendtoks
+% \collectPDFresources
+% \global\let\currentPDFresources\collectedPDFresources
+% \to \MPstopresources
+
+\appendtoksonce
+ \the\everyPDFxform
+\to \MPstopresources
+
+%D Since colors are not subjected to transformations, we can
+%D only use colors as signal. In our case, we use a dummy colored
+%D path with a red color component of \type {0.n}, so \type
+%D {0.001} is the first path and \type {0.010} the tenth. Since
+%D \METAPOST strips trailing zeros, we have to padd the string.
+
+\newif\ifMPcmykcolors
+\newif\ifMPspotcolors
+
+%D Specials:
+
+% \settrue \manyMPspecials \newcount\nofMParguments \let\extraMPpathcode\empty
+%
+% \def\@@MP {@@MP}
+% \def\@@MPSK{@MPSK@}
+%
+% \def\MPspecial{\@@MPSK\@@MPSK\gMPs\nofMParguments}
+%
+% \unexpanded\def\defineMPspecial#1#2%
+% {\setvalue{\@@MPSK\@@MPSK#1}{#2}}
+
+%D Special number~1 is dedicated to \CMYK\ support. If you
+%D want to know why: look at this:
+%D
+%D \startbuffer[mp]
+%D fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ;
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \startcombination[4*1]
+%D {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3}
+%D {\definecolor[test][c=.9,y=.15] \processMPbuffer[mp]} {c=.9 y=.15}
+%D {\definecolor[test][c=.25,y=.8] \processMPbuffer[mp]} {c=.25 y=.8}
+%D {\definecolor[test][c=.45,y=.1] \processMPbuffer[mp]} {c=.45 y=.1}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure
+%D {\CMYK\ support disabled,
+%D conversion to \RGB.}
+%D {\setupcolors[cmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no support in \METAPOST.}
+%D {\setupcolors[cmyk=ja,mpcmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no conversion to \RGB,
+%D support in \METAPOST}
+%D {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]}
+
+% \let\revokeMPtransparencyspecial\relax
+
+%D Transparency support used specials 60 (rgb) and 61
+%D (cmyk).
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor transparent(1,.5,yellow) ;
+%D fill p rotated 210 withcolor transparent(1,.5,green) ;
+%D fill p rotated 330 withcolor transparent(1,.5,blue) ;
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D One can also communicate colors between \CONTEXT\ and
+%D \METAPOST:
+%D
+%D \startbuffer
+%D \definecolor[tcyan] [c=1,k=.2,t=.5]
+%D \definecolor[tmagenta][m=1,k=.2,t=.5]
+%D \definecolor[tyellow] [y=1,k=.2,t=.5]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor \MPcolor{tcyan} ;
+%D fill p rotated 210 withcolor \MPcolor{tmagenta} ;
+%D fill p rotated 330 withcolor \MPcolor{tyellow} ;
+%D \stopbuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+
+%D Shading is an example of a more advanced graphic feature,
+%D but users will seldom encounter those complications. Here
+%D we only show a few simple examples, but many other
+%D alternatives are possible by setting up the functions built
+%D in \PDF\ in the appropriate way.
+%D
+%D Shading has to do with interpolation between two or more
+%D points or user supplied ranges. In \PDF, the specifications
+%D of a shade has to be encapsulated in objects and passed on
+%D as resources. This is a \PDF\ level 1.3. feature. One can
+%D simulate three dimensional shades as well and define simple
+%D functions using a limited set of \POSTSCRIPT\ primitives.
+%D Given the power of \METAPOST\ and these \PDF\ features, we
+%D can achieve superb graphic effects.
+%D
+%D Since everything is hidden in \TEX\ and \METAPOST\ graphics,
+%D we can stick to high level \CONTEXT\ command, as shown in
+%D the following exmples.
+%D
+%D \startbuffer
+%D \startuniqueMPgraphic{CircularShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D circular_shade(p,0,.2red,.9red) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{LinearShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,0,.2blue,.9blue) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{DuotoneShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,2,.5green,.5red) ;
+%D \stopuniqueMPgraphic
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These graphics can be hooked into the overlay mechanism,
+%D which is available in many commands.
+%D
+%D \startbuffer
+%D \defineoverlay[demo 1][\uniqueMPgraphic{CircularShade}]
+%D \defineoverlay[demo 2][\uniqueMPgraphic {LinearShade}]
+%D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These backgrounds can for instance be applied to \type
+%D {\framed}:
+%D
+%D \startbuffer
+%D \setupframed[width=3cm,height=2cm,frame=off]
+%D \startcombination[3*1]
+%D {\framed[backgroundachtergrond=demo 1]{\bfd \white Demo 1}} {}
+%D {\framed[backgroundachtergrond=demo 2]{\bfd \white Demo 2}} {}
+%D {\framed[backgroundachtergrond=demo 3]{\bfd \white Demo 3}} {}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D There are a few more alternatives, determined by the second
+%D parameter passed to \type {circular_shade} and alike.
+%D
+%D \def\SomeShade#1#2#3#4#5%
+%D {\startuniqueMPgraphic{Shade-#1}
+%D width := \overlaywidth ;
+%D height := \overlayheight ;
+%D path p ; p := unitsquare xscaled width yscaled height ;
+%D #2_shade(p,#3,#4,#5) ;
+%D \stopuniqueMPgraphic
+%D \defineoverlay[Shade-#1][\uniqueMPgraphic{Shade-#1}]%
+%D \framed[backgroundachtergrond=Shade-#1,width=2cm,height=2cm,frame=off]{}}
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{10}{circular}{0}{.3blue}{.9blue}} {circular 0}
+%D {\SomeShade{11}{circular}{1}{.3blue}{.9blue}} {circular 1}
+%D {\SomeShade{12}{circular}{2}{.3blue}{.9blue}} {circular 2}
+%D {\SomeShade{13}{circular}{3}{.3blue}{.9blue}} {circular 3}
+%D {\SomeShade{14}{circular}{4}{.3blue}{.9blue}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0}
+%D {\SomeShade{21}{circular}{1}{.9green}{.3green}} {circular 1}
+%D {\SomeShade{22}{circular}{2}{.9green}{.3green}} {circular 2}
+%D {\SomeShade{23}{circular}{3}{.9green}{.3green}} {circular 3}
+%D {\SomeShade{24}{circular}{4}{.9green}{.3green}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[4*1]
+%D {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0}
+%D {\SomeShade{31}{linear}{1}{.3red}{.9red}} {linear 1}
+%D {\SomeShade{32}{linear}{2}{.3red}{.9red}} {linear 2}
+%D {\SomeShade{33}{linear}{3}{.3red}{.9red}} {linear 3}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D These macros closely cooperate with the \METAPOST\ module
+%D \type {mp-spec.mp}, which is part of the \CONTEXT\
+%D distribution.
+%D
+%D The low level (\PDF) implementation is based on the \TEX\
+%D based \METAPOST\ to \PDF\ converter. Shading is supported
+%D by overloading the \type {fill} operator as implemented
+%D earlier. In \PDF\ type~2 and~3 shading functions are
+%D specified in terms of:
+%D
+%D \starttabulate[|Tl|l|]
+%D \NC /Domain \NC sort of meeting range \NC \NR
+%D \NC /C0 \NC inner shade \NC \NR
+%D \NC /C1 \NC outer shade \NC \NR
+%D \NC /N \NC smaller values, bigger inner circles \NC \NR
+%D \stoptabulate
+
+% \newcount\currentPDFshade % 0 % global (document wide) counter
+%
+% \def\dosetMPsomePDFshade#1#2%
+% {\immediate\pdfobj
+% {<</FunctionType 2
+% /Domain [\gMPs1 \gMPs2]
+% /C0 [\MPshadeA]
+% /C1 [\MPshadeB]
+% /N \gMPs3>>}%
+% \immediate\pdfobj
+% {<</ShadingType #1
+% /ColorSpace /\MPresolvedspace
+% /Function \the\pdflastobj\space 0 R
+% /Coords [\MPshadeC]
+% /Extend [true true]>>}%
+% \global\advance\currentPDFshade \plusone
+% \ctxlua{lpdf.adddocumentshade("Sh\the\currentPDFshade",lpdf.reference(\the\pdflastobj))}%
+% \setxvalue{\@@MPSK#2}{\noexpand\dohandleMPshade{\the\currentPDFshade}}}
+%
+% \def\dosetMPlinearshade {\dosetMPsomePDFshade2}% #1
+% \def\dosetMPcircularshade{\dosetMPsomePDFshade3}% #1
+%
+% \defineMPspecial{30}
+% {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
+% \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{9}}{\gMPs{10}}{\gMPs{11}}}\to\MPshadeB
+% \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}}%
+% \dosetMPlinearshade{\gMPs{14}}}
+%
+% \defineMPspecial{31}
+% {\normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs4}{\gMPs5}{\gMPs6}}\to\MPshadeA
+% \normalexpanded{\noexpand\resolveMPrgbcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}}\to\MPshadeB
+% \edef\MPshadeC{\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}}%
+% \dosetMPcircularshade{\gMPs{16}}}
+%
+% \defineMPspecial{32}
+% {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+% \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
+% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
+% \dosetMPlinearshade{\gMPs{16}}}
+%
+% \defineMPspecial{33}
+% {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+% \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB
+% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}%
+% \dosetMPcircularshade{\gMPs{18}}}
+%
+% \defineMPspecial{34}
+% {\normalexpanded{\noexpand\resolveMPspotcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+% \normalexpanded{\noexpand\resolveMPspotcolor{\gMPs{10}}{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}}\to\MPshadeB
+% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{14} \gMPs{15}}%
+% \dosetMPlinearshade{\gMPs{16}}}
+%
+% \defineMPspecial{35}
+% {\normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}}\to\MPshadeA
+% \normalexpanded{\noexpand\resolveMPcmykcolor{\gMPs{11}}{\gMPs{12}}{\gMPs{13}}{\gMPs{14}}}\to\MPshadeB
+% \edef\MPshadeC{\gMPs8 \gMPs9 \gMPs{10} \gMPs{15} \gMPs{16} \gMPs{17}}%
+% \dosetMPcircularshade{\gMPs{18}}}
+%
+% \newconditional\ignoreMPpath
+%
+% \def\dohandleMPshade#1%
+% {\revokeMPtransparencyspecial
+% \settrue\ignoreMPpath
+% \def\extraMPpathcode{/Sh#1 sh Q}%
+% \pdfliteral{q /Pattern cs}}
+%
+% \defineMPspecial{10}
+% {\setxvalue{\@@MPSK\gMPs8}%
+% {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}}
+%
+% \def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig
+% {\global\letvalue{\@@MPSK#8}\empty
+% \vbox to \zeropoint
+% {\vss
+% \hbox to \zeropoint
+% {\ifcase\pdfoutput\or % will be hooked into the special driver
+% \doiffileelse{#7}
+% {\doifundefinedelse{mps:x:#7}
+% {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}%
+% \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}%
+% {\message{[reusing figure #7]}}%
+% \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%
+% \rlap{\getvalue{mps:x:#7}}%
+% \pdfliteral{Q}}
+% {\message{[unknown figure #7]}}%
+% \fi
+% \hss}}}
+
+%D An example of using both special features is the
+%D following.
+%D
+%D \starttyping
+%D \startMPpage
+%D externalfigure "hakker1b.png" scaled 22cm rotated 10 shifted (-2cm,0cm);
+%D externalfigure "hakker1b.png" scaled 10cm rotated -10 ;
+%D externalfigure "hakker1b.png" scaled 7cm rotated 45 shifted (8cm,12cm) ;
+%D path p ; p := unitcircle xscaled 15cm yscaled 20cm;
+%D path q ; q := p rotatedaround(center p,90) ;
+%D path r ; r := buildcycle(p,q) ; clip currentpicture to r ;
+%D path s ; s := boundingbox currentpicture enlarged 5mm ;
+%D picture c ; c := currentpicture ; currentpicture := nullpicture ;
+%D circular_shade(s,0,.2red,.9red) ;
+%D addto currentpicture also c ;
+%D \stopMPpage
+%D \stoptyping
+
+% \defineMPspecial{20}
+% {\setxvalue{\@@MPSK\gMPs6}%
+% {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}}
+%
+% \def\handleMPhyperlink#1#2#3#4#5#6%
+% {\global\letvalue{\@@MPSK#6}\empty
+% \setbox\scratchbox\hbox
+% {\setbox\scratchbox\null
+% \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax
+% \ht\scratchbox\dimexpr-#2\onebasepoint+#4\onebasepoint\relax
+% \gotobox{\box\scratchbox}[#5]}%
+% \setbox\scratchbox\hbox
+% {\hskip\dimexpr\MPxoffset\onebasepoint+#1\onebasepoint\relax
+% \raise\dimexpr\MPyoffset\onebasepoint+#2\onebasepoint\relax
+% \box\scratchbox}%
+% \smashbox\scratchbox
+% \box\scratchbox}
+
+%D This special (number 50) passes positions to a tex file.
+%D This method uses a two||pass approach an (mis|)|used the
+%D context positioning macros. In \type {core-pos} we will
+%D implement the low level submacro needed.
+%D
+%D \startbuffer
+%D \definelayer[test]
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-1},y=\MPy{somepos-1}]
+%D {Whatever we want here!}
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-2},y=\MPy{somepos-2}]
+%D {Whatever we need there!}
+%D
+%D \startuseMPgraphic{oeps}
+%D draw fullcircle scaled 6cm withcolor red ;
+%D register ("somepos-1",1cm,2cm,center currentpicture) ;
+%D register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here the width and height are not realy used, but one can
+%D imagine situations where tex has to work with values
+%D calculated by \METAPOST.
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D Later we will implement a more convenient macro:
+%D
+%D \starttyping
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \stoptyping
+
+% \defineMPspecial{50} % x y width height label
+% {\dosavepositionwhd
+% {\gMPs5}%
+% {0}%
+% {\the\dimexpr-\MPllx\onebasepoint+\gMPs1\onebasepoint\relax}
+% {\the\dimexpr\gMPs2\onebasepoint-\scratchdimen+\MPury\onebasepoint\relax}% scratchdimen ?
+% {\the\dimexpr\gMPs3\onebasepoint\relax}%
+% {\the\dimexpr\gMPs4\onebasepoint\relax}%
+% {0pt}}
+
+\startMPinitializations
+ mp_shade_version := 2 ;
+\stopMPinitializations
+
+%D This is done much cleaner in \MPLIB.
+
+\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
+ {\def\MPtextdata{#3}% % delegate the splitter to lua + redesign
+ \def\MPtextsize{#2}%
+ \def\lastMPmoveX{#4}%
+ \def\lastMPmoveY{#5}%
+ \defconvertedcommand\MPtextdata\MPtextdata % no edef
+ \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber
+ \executeifdefined{handleMPtext\MPtexttag}
+ {\setbox\scratchbox\hbox
+ {\font\temp=#1\space at #2\onebasepoint
+ \let\c\char
+ \temp
+ \MPfshowcommand{#3}}%
+ \setbox\scratchbox\hbox
+ {\hskip#4\onebasepoint
+ \raise#5\onebasepoint
+ \box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox}}
+
+%D We save the special variables on a stack. It's not that
+%D fast, but it make implementing the special more convenient.
+
+% \def\MPSbegin
+% {\nofMParguments\zerocount}
+%
+% \def\MPSend
+% {\csname\MPspecial\endcsname}
+%
+% \def\MPSset
+% {\advance\nofMParguments\plusone
+% \expandafter\def\csname\@@MP\number\nofMParguments\endcsname}
+%
+% \def\gMPs#1{\csname\@@MP\number#1\endcsname}
+
+%D The boundingbox.
+
+\def\MPSboundingbox#1#2#3#4%
+ {\xdef\MPllx{#1}\xdef\MPlly{#2}\xdef\MPurx{#3}\xdef\MPury{#4}%
+ \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}%
+ \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}}
+
+\MPSboundingbox0000
+
+% \def\MPSspecial#1#2%
+% {\csname\@@MPSK#2\endcsname}
+
+%D A path is (in most cases) just a sequence of \PDF\ commands.
+
+% \newconditional\ignoreMPpath
+
+% \def\MPSpath
+% {\pdfliteral}
+
+% \def\MPScode % hack, will be improved
+% {\ifconditional\ignoreMPpath
+% \pdfliteral{h W n}%
+% \ifx\extraMPpathcode\empty\else
+% \pdfliteral{\extraMPpathcode}%
+% \let\extraMPpathcode\empty
+% \fi
+% \setfalse\ignoreMPpath
+% \expandafter\gobbleoneargument
+% \else
+% \expandafter\pdfliteral
+% \fi}
+
+%D Test code:
+
+% \startMPcode
+% fill fullcircle scaled 3cm withcolor red ;
+% fill fullcircle scaled 2cm withcolor green ;
+% fill fullcircle scaled 1cm withcolor blue ;
+% currentpicture := currentpicture shifted (-4cm,0) ;
+% fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ;
+% fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ;
+% fill fullcircle scaled 1cm withcolor cmyk(0,0,1,0) ;
+% currentpicture := currentpicture shifted (-4cm,0) ;
+% draw fullcircle scaled 3cm dashed evenly ;
+% draw fullcircle scaled 2cm dashed withdots ;
+% draw origin withpen pencircle scaled 3mm;
+% currentpicture := currentpicture shifted (-4cm,0) ;
+% fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red);
+% fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red);
+% fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green);
+% fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5));
+% currentpicture := currentpicture shifted (12cm,-4cm) ;
+% draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ;
+% currentpicture := currentpicture shifted (-4cm,0) ;
+% % bug: shift
+% draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30 ;
+% draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ;
+% filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ;
+% currentpicture := currentpicture shifted (-4cm,0) ;
+% % shade cannot handle shift
+% circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ;
+% circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ;
+% filldraw boundingbox currentpicture enlarged -3cm withpen pencircle scaled 1pt withcolor .5white ;
+% \stopMPcode
+
+% We cannot use attributes for switching colors in mp literals because
+% grouping (qQ) interferes.
+
+% \def\dohandleMPshade#1%
+% {\revokeMPtransparencyspecial
+% \settrue\ignoreMPpath
+% \def\extraMPpathcode{/#1 sh Q}%
+% \pdfliteral{q /Pattern cs}}
+
+\protect \endinput
diff --git a/tex/context/base/meta-pre.tex b/tex/context/base/meta-pre.tex
new file mode 100644
index 000000000..cb861ff20
--- /dev/null
+++ b/tex/context/base/meta-pre.tex
@@ -0,0 +1,68 @@
+%D \module
+%D [ file=meta-pre,
+%D version=2001.03.21,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Predefined Goodies,
+%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 In this library, we define a couple of handy graphics.
+
+% todo: use the predefine grid macros, mp code will move to
+% mp-* file
+
+\startuseMPgraphic{pagegrid}
+ StartPage ;
+ drawoptions(withcolor .8white) ;
+ fill Field[Text][Text] ;
+ drawoptions(withcolor .65white) ;
+ fill Field[Footer][Text] ;
+ fill Field[Header][Text] ;
+ fill Field[LeftMargin][Text] ;
+ fill Field[RightMargin][Text] ;
+ drawoptions(withcolor .65yellow) ;
+ fill Field[LeftEdge][Text] ;
+ fill Field[RightEdge][Text] ;
+ fill Field[Bottom][Text] ;
+ fill Field[Top][Text] ;
+ drawoptions(withpen pencircle scaled .3pt withcolor .65white) ;
+ for i=-3cm step 1cm until PaperWidth+3cm :
+ draw (i,-3cm)--(i,PaperHeight+3cm) ;
+ endfor ;
+ for i=PaperHeight+3cm step -1cm until -3cm :
+ draw (-3cm,i)--(PaperWidth+3cm,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled .15pt) ;
+ for i=.5cm-3cm step 1cm until PaperWidth+3cm :
+ draw (i,-3cm)--(i,PaperHeight+3cm) ;
+ endfor ;
+ for i=PaperHeight-.5cm+3cm step -1cm until -3cm :
+ draw (-3cm,i)--(PaperWidth+3cm,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled .3pt withcolor .65red) ;
+ for i=0 step 1cm until PaperWidth :
+ draw (i,0)--(i,PaperHeight) ;
+ endfor ;
+ for i=PaperHeight step -1cm until 0 :
+ draw (0,i)--(PaperWidth,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled .15pt withcolor .65red) ;
+ for i=.5cm step 1cm until PaperWidth :
+ draw (i,0)--(i,PaperHeight) ;
+ endfor ;
+ for i=PaperHeight-.5cm step -1cm until 0 :
+ draw (0,i)--(PaperWidth,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled 5pt withcolor .65red) ;
+ draw ulcorner Page ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay[pagegrid][\useMPgraphic{pagegrid}]
+
+\endinput
diff --git a/tex/context/base/meta-tex.mkii b/tex/context/base/meta-tex.mkii
new file mode 100644
index 000000000..190a694d9
--- /dev/null
+++ b/tex/context/base/meta-tex.mkii
@@ -0,0 +1,350 @@
+%D \module
+%D [ file=meta-tex,
+%D version=2006.06.07,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ fast text insertion,
+%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.
+
+%D Many thanks to Fabrice Popineau and Taco Hoekwater in helping me
+%D figure out some aspects of the text inclusion method implemented
+%D here. The following code is derived from a more advanced (and to
+%D be used) mechanism where \TEX, \METAPOST\ and \LUA\ play together.
+
+%D Much of this mechanism was written with running live DVD's of
+%D the Dave Matthews band in the background (or the corner of my
+%D screen).
+
+% todo: testmacro for empty pic
+
+\unprotect
+
+\newwrite\TeXtextwrite
+
+\def\openTeXtexts {\immediate\openout \TeXtextwrite\currentTeXtext.mpb\relax}
+\def\closeTeXtexts{\immediate\closeout\TeXtextwrite}
+
+\def\currentTeXtext {\jobname-mpgraph}
+\def\currentTeXstack{mpgtxt}
+
+\initializeboxstack\currentTeXstack
+
+\newtoks\collectedmptexts
+\newtoks\everyTeXtexts
+
+\chardef\TeXtextsmode\zerocount % no inheritance
+
+\long\def\startTeXtexts#1\stopTeXtexts
+ {\global\collectedmptexts\expandafter{\the\collectedmptexts#1}}
+
+\def\dostartTeXtexts
+ {\global\setfalse\TeXtextdone
+ \startnointerference
+ \openTeXtexts
+ \ifcase\TeXtextsmode
+ % normally there is no need for this (faster anyway)
+ \or
+ \scantokens\expandafter{\the\everyMPTEXgraphic}% brr
+ \or
+ \the\everyTeXtexts
+ \fi
+ \ifrunMPgraphics
+ \initializeboxstack\currentTeXstack
+ \else
+ \global\let\openTeXtexts\relax
+ \global\let\finishTeXtexts\closeTeXtexts
+ \fi}
+
+\def\dostopTeXtexts
+ {\ifrunMPgraphics
+ \closeTeXtexts
+ \fi
+ \stopnointerference}
+
+\let\finishTeXtexts\relax
+
+\appendtoks
+ \finishTeXtexts
+\to \everystoptext
+
+\newconditional\TeXtextdone
+
+% \long\def\TeXtext#1%
+% {\dowithnextboxcontent
+% {\setnormalcatcodes}
+% {\global\settrue\TeXtextdone
+% \immediate\write\TeXtextwrite{savetxt(#1,\the\wd\nextbox,\the\ht\nextbox,\the\dp\nextbox);}%
+% \savebox\currentTeXstack{#1}{\box\nextbox}}
+% \hbox}
+
+\long\def\TeXtext
+ {\dosingleempty\doTeXtext}
+
+% currently, colors in the converter don't use the color stack
+%
+% 0 = nothing, withcolor works ok, but nested colors fail
+% 1 = local color stack ok
+% 2 = obey color stack (not yet supported)
+
+\chardef\TeXtextcolormode\plusone
+
+\def\definetextext[#1]#2{\setvalue{textext@@#1}{#2}}
+
+% \definetextext[framed]{\framed}
+%
+% \startMPcode
+% draw \sometxt[framed]{black} rotated 45 ;
+% \stopMPcode
+
+\long\def\doTeXtext[#1]#2#3%
+ {\begingroup
+ \setnormalcatcodes
+ \chardef\activecharactermode\plusone % compensates ** in meta-ini.mkii
+ \endlinechar\minusone
+ \everyeof\emptytoks
+ %\def\ascii{#3}\scantokens\expandafter{\ascii}}%
+ \setbox\nextbox\hbox
+ {\ifcase\TeXtextcolormode
+ \scantokens{\executeifdefined{textext@@#1}\firstofoneargument{#3}}%
+ \else
+ \localcolortrue
+ \startcurrentcolor
+ \scantokens{\executeifdefined{textext@@#1}\firstofoneargument{#3}}%
+ \stopcurrentcolor
+ \fi}%
+ \global\settrue\TeXtextdone
+ \edef\currenttextxt{\number#2}%
+ \executeifdefined{textext::#1}{\getvalue{textext::depth}}%
+ \savebox\currentTeXstack\currenttextxt{\box\nextbox}%
+ \endgroup}
+
+\setvalue{textext::depth}{\immediate\write\TeXtextwrite{savetxt(\currenttextxt,\the\nextboxwd,\the\nextboxht,\the\nextboxdp) shifted (0,-\the\nextboxdp);}}
+\setvalue{textext::nodepth}{\immediate\write\TeXtextwrite{savetxt(\currenttextxt,\the\nextboxwd,\the\nextboxht,\the\nextboxdp);}}
+
+\setvalue{textext::d}{\getvalue{textext::depth}}
+\setvalue{textext::n}{\getvalue{textext::nodepth}}
+
+\newbox\mptextbox
+
+% \loadmapfile[lm-texnansi.map] % the font is not really used, i.e. nothing ends up in the file
+\definefontsynonym[MPtxtfont][texnansi-lmtt10]
+\definefont[localMPtxtfont][MPtxtfont at 10bp]
+
+\ifx\getTeXtext\undefined
+
+ % this took a while to figure out
+
+ \let\MPtextdata\empty
+
+ \def\getTeXtext
+ {\ifx\MPtextdata\empty\else
+ \localMPtxtfont
+ \setbox\mptextbox\hbox{\foundbox\currentTeXstack{\number\nofTeXtexts}}%
+ \setbox\scratchbox\hbox{\MPtextdata}% set in meta-pdf.mkii/mkiv
+ \edef\mpwd{\the\dimexpr\MPtextsize\dimexpr\wd\scratchbox/10\relax\relax}%
+ \edef\mpht{\the\dimexpr\MPtextsize\dimexpr\ht\scratchbox/10\relax\relax}%
+ \setbox\mptextbox\hbox{\raise\dp\mptextbox\box\mptextbox}%
+ \dp\mptextbox\zeropoint
+ \scale[\c!width=\mpwd,\c!height=\mpht]{\box\mptextbox}%
+ \fi}
+
+\fi
+
+\let\nofTeXtexts\!!zerocount
+
+\setvalue{handleMPtext00001}% only height in tag (00001)
+ {\setbox\scratchbox\hbox
+ {\obeyMPspecials
+ \edef\nofTeXtexts{\number\MPtextnumber}%
+ \getTeXtext}%
+ \setbox\scratchbox\hbox
+ {\hskip\lastMPmoveX\onebasepoint\raise\lastMPmoveY\onebasepoint
+ \box\scratchbox}%
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\zeropoint
+ \box\scratchbox}
+
+\startMPextensions
+ string txtfile ; txtfile := "\currentTeXtext.mpb" ;
+ string txtfont ; txtfont := "\truefontname{MPtxtfont}" ;
+ string txtpref ; txtpref := "00001::::" ;
+\stopMPextensions
+
+\newcount\metatxtcounter
+
+\long\def\dodofiltersometxt#1#2#3%
+ {\ifx#2\empty
+ \else
+ \advance\metatxtcounter\plusone
+ \TeXtext{\the\metatxtcounter}{#1}%
+ \expandafter\filtersometxt
+ \fi#2#3}
+
+\long\def\redofiltersometxt[#1]#2%
+ {\advance\metatxtcounter\plusone
+ \TeXtext[#1]{\the\metatxtcounter}{#2}%
+ \filtersometxt}
+
+\long\def\filtersometxt#1\sometxt
+ {\doifnextoptionalelse\redofiltersometxt\dodofiltersometxt}
+
+% cleaner in mkiv
+%
+% \filtersometxt abc\sometxt{def};hij\sometxt{klm};\sometxt{}\empty\relax
+
+\long\def\flushTeXtexts#1%
+ {\metatxtcounter\zerocount
+ \dostartTeXtexts
+ \the\collectedmptexts
+ \filtersometxt#1\sometxt{}\empty\relax
+ \dostopTeXtexts
+ \ifconditional\TeXtextdone
+ \immediate\write\MPwrite{loadtxts ; txtnext := 0 ;}%
+ \global\collectedmptexts\emptytoks
+ \fi
+ \metatxtcounter\zerocount}
+
+% \long\def\sometxt#1{sometxt(nexttxt)} % to be used in mp definitions, no ; here
+
+\long\def\sometxt #1#{\dosometxt} % grab optional [args]
+\long\def\dosometxt#1{sometxt(nexttxt)} % to be used in mp definitions, no ; here
+
+% we redefine the writer:
+
+\long\def\writecheckedMPgraphic#1%
+ {\ifforceMPTEXgraphic
+ \global\MPTEXgraphictrue
+ \else
+ \global\MPTEXgraphicfalse
+ \edef\ascii{#1}\defconvertedcommand\MPascii\ascii
+ \the\MPTEXgraphicchecks\relax % \relax is end condition!
+ \fi
+ \flushMPTEXgraphic% % verbatimtex etc
+ \flushTeXtexts{#1}% added
+ \writeMPgraphic{#1}} % potential optimization: pass \ascii
+
+\protect \endinput
+
+% torture test (will move)
+
+\startMPpage
+ numeric a_b_c ;
+ picture p ; pickup pencircle scaled .1pt ;
+ p := \sometxt{Just a \color[blue]{simple} example text.} ;
+ p := image(draw p; draw boundingbox p withcolor red; ) ;
+ p := p rotatedaround(center p, 360*(5/100)) ;
+ draw p ; draw boundingbox p withcolor blue ;
+ currentpicture := currentpicture scaled 20 ;
+ draw boundingbox currentpicture withcolor .5white ;
+ setbounds currentpicture to boundingbox currentpicture enlarged 10pt ;
+\stopMPpage
+
+\startMPpage
+ picture p ;
+ p := \sometxt{\framed[width=fit,align=middle]{\input tufte\relax}} ;
+ draw p rotatedaround(center p, 30) ;
+\stopMPpage
+
+\startMPpage
+ picture p ;
+ p := \sometxt{\framed[width=fit,align=middle]{\input tufte\relax}} ;
+ draw p slanted .5 ;
+\stopMPpage
+
+\dorecurse{10} {
+ \startTeXtexts
+ \TeXtext{\recurselevel}{\ruledhbox{I must be {\green crazy} to implement this}}
+ \stopTeXtexts
+ \startMPpage
+ picture p ; pickup pencircle scaled .1pt ;
+ numeric i ; i := \recurselevel ;
+ p := sometxt(i) ;
+ p := p rotatedaround(center p, 360*(i*5/100)) ;
+ draw p ; draw boundingbox p withcolor blue ;
+ currentpicture := currentpicture scaled 20 ;
+ draw boundingbox currentpicture withcolor .5white ;
+ \stopMPpage
+}
+
+\startTeXtexts
+ \dorecurse{100}{\TeXtext{\recurselevel}{\ruledhbox{\strut interesting \recurselevel}}}
+\stopTeXtexts
+
+\startMPpage
+ picture p ; pickup pencircle scaled .1pt ;
+ for i = 1 upto 100:
+ p := sometxt(i) ;
+ p := p rotatedaround(center p, 360*(i*5/100)) ;
+ draw p ; draw boundingbox p withcolor blue ;
+ endfor ;
+ currentpicture := currentpicture scaled 20 ;
+ draw boundingbox currentpicture withcolor .5white ;
+\stopMPpage
+
+\startTeXtexts
+ \dorecurse{100}{\TeXtext{\recurselevel}{\ruledhbox{\strut interesting \recurselevel}}}
+\stopTeXtexts
+
+\startMPpage
+ picture p ; pickup pencircle scaled .1pt ;
+ for i = 1 step 5 until 100 :
+ p := sometxt(i) ;
+ p := p rotatedaround(center p, 360*(i/100)) ;
+ draw p ; draw boundingbox p withcolor blue ;
+ endfor ;
+ currentpicture := currentpicture scaled 20 ;
+ draw boundingbox currentpicture withcolor .5white ;
+\stopMPpage
+
+\startTeXtexts
+ \dorecurse{20}{\TeXtext{\recurselevel}{\externalfigure[t:/sources/cow.pdf][width=1cm]}}
+\stopTeXtexts
+
+\startMPpage
+ picture p ; pickup pencircle scaled .1pt ;
+ for i = 1 upto 20 :
+ p := sometxt(i) ;
+ p := p shifted (2.5cm,0) rotated (360*(i/20)) ;
+ draw p ; draw boundingbox p withcolor blue ;
+ endfor ;
+ currentpicture := currentpicture scaled 10 ;
+ draw boundingbox currentpicture withcolor .5white ;
+\stopMPpage
+
+\startTeXtexts
+ \dorecurse{200}{\TeXtext{\recurselevel}{\ruledhbox{\strut I must be {\green crazy} \recurselevel}}}
+\stopTeXtexts
+
+\startMPpage
+ picture p ; pickup pencircle scaled .1pt ;
+ numeric i ; i := 100 ;
+ p := sometxt(i) ;
+ p := p rotatedaround(center p, 360*(i*36/100)) ;
+ draw p ; draw boundingbox p withcolor blue ;
+ currentpicture := currentpicture scaled 20 ;
+ draw boundingbox currentpicture withcolor .5white ;
+\stopMPpage
+
+\dorecurse{10}{
+ \startTeXtexts
+ \dorecurse{200}{\TeXtext{\recurselevel}{\ruledhbox{\strut I must be {\green crazy} \recurselevel}}}
+ \stopTeXtexts
+ \startMPpage
+ picture p ; pickup pencircle scaled .1pt ;
+ j := 10*\recurselevel-9;
+ k := 10*\recurselevel;
+ for i = j upto k:
+ p := sometxt(i) ;
+ p := p rotatedaround(center p, 360*(i/100)) ;
+ draw p ; draw boundingbox p withcolor blue ;
+ endfor ;
+ currentpicture := currentpicture scaled 20 ;
+ draw boundingbox currentpicture withcolor red ;
+ \stopMPpage
+}
diff --git a/tex/context/base/meta-tex.mkiv b/tex/context/base/meta-tex.mkiv
new file mode 100644
index 000000000..e35f95385
--- /dev/null
+++ b/tex/context/base/meta-tex.mkiv
@@ -0,0 +1,72 @@
+%D \module
+%D [ file=meta-tex,
+%D version=2006.06.07,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ fast text insertion,
+%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.
+
+\unprotect
+
+% Ok, we support this in MkIV because Mojca kept the pressure on. It
+% looks a bit like a hack.
+
+\long\def\startTeXtexts#1\stopTeXtexts
+ {#1}
+
+\long\def\TeXtext
+ {\dosingleempty\doTeXtext}
+
+\long\def\doTeXtext[#1]#2#3% contrary to mkii we don't process yet but we do expand
+ {\long\setxvalue{@@st@@::#2}{\noexpand\dodoTeXtext{#1}{#3}}}
+
+\long\def\dodoTeXtext#1#2%
+ {\begingroup
+ \setbox\nextbox\hbox{\executeifdefined{textext@@#1}\firstofoneargument{#2}}%
+ \executeifdefined{textext::#1}{\getvalue{textext::depth}}%
+ \box\nextbox
+ \endgroup}
+
+\def\getTeXtext#1%
+ {\getvalue{@@st@@::#1}}
+
+\setvalue{textext::d}{\setbox\nextbox\hbox{\lower\dp\nextbox\box\nextbox}} % unchecked
+\setvalue{textext::n}{} % unchecked
+
+\setvalue {textext::depth}{\getvalue{textext::d}}
+\setvalue{textext::nodepth}{\getvalue{textext::n}}
+
+% \definetextext[framed]{\framed}
+%
+% \startMPcode
+% draw \sometxt[framed]{black} rotated 45 ;
+% \stopMPcode
+
+\unexpanded\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.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/meta-txt.tex b/tex/context/base/meta-txt.tex
new file mode 100644
index 000000000..474253a40
--- /dev/null
+++ b/tex/context/base/meta-txt.tex
@@ -0,0 +1,304 @@
+%D \module
+%D [ file=meta-txt,
+%D version=2000.07.06,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Text Tricks,
+%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 In this library some handy text manipulations are
+%D defined. Some can and will be improved as soon as the
+%D \TEX||\METAPOST\ interface is stable. Some of the
+%D solutions may look weird, which is entirely my fault,
+%D since I implemented them in the process of getting grip
+%D on this kind of manipulations. Undoubtly better
+%D \METAPOST\ code is possible, but my way of learning
+%D this kind of trickery happens to be by \quote {trial
+%D and error} and \quote {look and feel} (as well as
+%D identifying tricks in Hobby's code).
+
+% textext ipv btex ... etex
+
+% we need a proper prefix here
+
+\unprotect
+
+\startMPextensions
+ if unknown context_text: input mp-text; fi;
+\stopMPextensions
+
+%%%%%%%
+
+% \def\newchar#1{\chardef#1=0 }
+
+\ifdefined\MPtoks \else \newtoks\MPtoks \fi
+\ifdefined\MPbox \else \newbox \MPbox \fi
+
+\ifdefined\parwidth \else \newdimen\parwidth \fi
+\ifdefined\parheight \else \newdimen\parheight \fi
+\ifdefined\parvoffset \else \newdimen\parvoffset \fi
+\ifdefined\parhoffset \else \newdimen\parhoffset \fi
+\ifdefined\parlines \else \newcount\parlines \fi
+\ifdefined\partoks \else \newtoks \partoks \fi
+\ifdefined\shapetextbox \else \newbox \shapetextbox \fi
+ \newif \ifparseries
+\ifdefined\parfirst \else \chardef \parfirst=0 \fi
+
+\def\startshapetext[#1]%
+ {\global\newcounter\currentshapetext
+ \global\setbox\shapetextbox\vbox\bgroup
+ \expanded{\switchtobodyfont[\@@shbodyfont]}%
+ \dontcomplain
+ \hsize\parwidth
+ \setuptolerance[\v!verytolerant,\v!stretch]%
+ \!!counta\zerocount
+ \!!toksa\emptytoks
+ \def\docommand##1%
+ {\setbox\scratchbox\hbox{\useMPgraphic{##1}}%
+ \global\chardef\parfirst\zerocount
+ \getMPdata % \readlocfile{\MPdatafile}{}{}%
+ \setshapecharacteristics
+ \advance\!!counta by \parlines
+ \expandafter\appendtoks\the\partoks\to\!!toksa}%
+ \processcommalist[#1]\docommand
+ \global\parseriestrue
+ \xdef\totalparlines{\the\!!counta}%
+ \global\partoks\!!toksa
+ %\ifx\partoks\emptytoks\else % safeguard
+ \expanded{\parshape \the\!!counta \the\!!toksa}%
+ %\fi
+ \setshapecharacteristics % extra dummy
+ \ifparseries\def\par{\endgraf\adaptparshape}\fi
+ \EveryPar{\begstrut}}
+
+\def\stopshapetext
+ {\endstrut
+ %\removebottomthings
+ \egroup
+ \global\newcounter\currentshapetext
+ \getshapecharacteristics}
+
+\def\adaptparshape%
+ {\def\docommand##1%
+ {\ifcase\!!counta
+ \expandafter\appendtoks\space##1 \to\!!toksa
+ \else
+ \advance\!!counta \minusone
+ \fi}%
+ \!!counta\prevgraf
+ \doglobal\decrement(\totalparlines,\!!counta)%
+ \multiply\!!counta \plustwo
+ \!!toksa\emptytoks
+ \expanded{\processseparatedlist[\the\partoks][\space]}\docommand
+ \global\partoks\!!toksa
+ %\ifx\partoks\emptytoks\else % safeguard
+ \expanded{\parshape\totalparlines\the\partoks}%
+ }%\fi}
+
+\def\getshapecharacteristics%
+ {\doglobal\increment\currentshapetext
+ \doifdefinedelse{parlines:\currentshapetext}
+ {\global\parlines \getvalue{parlines:\currentshapetext}%
+ \global\chardef\parfirst \getvalue{parfirst:\currentshapetext}%
+ \global\parvoffset \getvalue{parvoffset:\currentshapetext}%
+ \global\parhoffset \getvalue{parhoffset:\currentshapetext}%
+ \global\parwidth \getvalue{parwidth:\currentshapetext}%
+ \global\parheight \getvalue{parheight:\currentshapetext}}
+ {\global\parlines \plusone
+ \global\chardef\parfirst \zerocount
+ \global\parvoffset \zeropoint
+ \global\parhoffset \zeropoint
+ \global\parwidth \hsize
+ \global\parheight \vsize}}
+
+\def\setshapecharacteristics%
+ {\doglobal\increment\currentshapetext
+ \setxvalue{parlines:\currentshapetext }{\the\parlines}%
+ \setxvalue{parfirst:\currentshapetext }{\the\parfirst}%
+ \setxvalue{parvoffset:\currentshapetext}{\the\parvoffset}%
+ \setxvalue{parhoffset:\currentshapetext}{\the\parhoffset}%
+ \setxvalue{parwidth:\currentshapetext }{\the\parwidth}%
+ \setxvalue{parheight:\currentshapetext }{\the\parheight}}
+
+\def\getshapetext% option: unvbox
+ {\vbox\bgroup
+ \forgetall
+ \setbox\scratchbox\vbox to \parheight
+ {\expanded{\switchtobodyfont[\@@shbodyfont]}% evt strutheight en
+ \splittopskip\strutheight % lineheight opslaan
+ \vskip\parvoffset % scheelt switch en
+ \ifcase\parfirst\or\vskip\lineheight\fi % is ook veiliger
+ \hskip\parhoffset
+ \hbox{\vsplit\shapetextbox to \parlines\lineheight}}%
+ \wd\scratchbox\parwidth
+ \ht\scratchbox\parheight
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \getshapecharacteristics
+ \egroup}
+
+\def\setupshapetexts%
+ {\dodoubleempty\getparameters[\??sh]}
+
+\setupshapetexts%
+ [\c!bodyfont=]
+
+%%%%%%% rotfont nog definieren
+
+\doifundefined{RotFont}{\definefont[RotFont][RegularBold]}
+
+\def\processfollowingtoken#1% strut toegevoegd
+ {\appendtoks#1\to\MPtoks
+ \setbox\MPbox=\hbox{\RotFont\setstrut\strut\the\MPtoks}%
+ \startMPdrawing
+ n := n + 1 ; len[n] := \the\wd\MPbox ;
+ \stopMPdrawing
+ \startMPdrawing[-]
+ % pic[n] := textext{\RotFont\setstrut\strut#1} ; % btex \RotFont\setstrut\strut#1 etex ;
+ pic[n] := btex \RotFont\setstrut\strut#1 etex ;
+ pic[n] := pic[n] shifted - llcorner pic[n] ;
+ \stopMPdrawing}
+
+\startuseMPgraphic{followtokens}
+ % we default to nothing
+\stopuseMPgraphic
+
+\def\followtokens#1%
+ {\vbox\bgroup
+ \forgetall
+ \dontcomplain
+ \startMPenvironment
+ \doifundefined{RotFont}{\definefont[RotFont][RegularBold]}
+ \stopMPenvironment
+ \MPtoks\emptytoks
+ \resetMPdrawing
+ \startMPdrawing
+ \includeMPgraphic{followtokens} ;
+ picture pic[] ; numeric len[], n ; n := 0 ;
+ \stopMPdrawing
+ \handletokens#1\with\processfollowingtoken
+ \startMPdrawing
+ if unknown RotPath : path RotPath ; RotPath := origin ; fi ;
+ if unknown RotColor : color RotColor ; RotColor := black ; fi ;
+ if unknown TraceRot : boolean TraceRot ; TraceRot := false ; fi ;
+ if unknown ExtraRot : numeric ExtraRot ; ExtraRot := 0 ; fi ;
+ numeric al, at, pl, wid, pos ; pair ap, ad ;
+ al := arclength RotPath ;
+ if al=0 :
+ al := len[n] + ExtraRot ;
+ RotPath := origin -- (al,0) ;
+ fi ;
+ if al<len[n]:
+ RotPath := RotPath scaled ((len[n]+ExtraRot)/al) ;
+ al := arclength RotPath ;
+ fi ;
+ pl := (al-len[n])/(if n>1 : (n-1) else : 1 fi) ;
+ if TraceRot :
+ draw RotPath withpen pencircle scaled 1pt withcolor blue ;
+ fi ;
+ for i=1 upto n :
+ wid := abs(xpart urcorner pic[i] - xpart llcorner pic[i]) ;
+ pos := len[i]-wid/2 + (i-1)*pl ;
+ at := arctime pos of RotPath ;
+ ap := point at of RotPath ;
+ ad := direction at of RotPath ;
+ draw pic[i] shifted (-wid/2,0) rotated(angle(ad)) shifted ap
+ withcolor RotColor ;
+ if TraceRot :
+ draw boundingbox
+ pic[i] shifted (-wid/2,0) rotated(angle(ad)) shifted ap
+ withpen pencircle scaled .25pt withcolor red ;
+ draw ap
+ withpen pencircle scaled .50pt withcolor green ;
+ fi ;
+ endfor ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \getMPdrawing
+ \resetMPdrawing
+ \egroup}
+
+% \followtokens
+% {This is just a dummy text, kerned by T{\kern
+% -.1667em\lower .5ex\hbox {E}}{\kern -.125emX} and typeset
+% in a circle using {\setMFPfont M}{\setMFPfont
+% E}{\setMFPfont T}{\setMFPfont A}{\setMFPfont
+% P}{\setMFPfont O}{\setMFPfont S}{\setMFPfont T}.\quad}
+
+\startuseMPgraphic{fuzzycount}
+ begingroup
+ save height, span, drift, d, cp ;
+ height := 3/ 5 * \baselinedistance ;
+ span := 1/ 3 * height ;
+ drift := 1/10 * height ;
+ pickup pencircle scaled (1/12 * height) ;
+ def d = (uniformdeviate drift) enddef ;
+ for i := 1 upto \MPvar{n} :
+ draw
+ if (i mod 5)=0 : ((-d-4.5span,d)--(+d-0.5span,height-d))
+ else : ((-d,+d)--(+d,height-d)) fi
+ shifted (span*i,d-drift) ;
+ endfor;
+ picture cp ; cp := currentpicture ; % for readability
+ setbounds currentpicture to
+ (llcorner cp shifted (0,-ypart llcorner cp) --
+ lrcorner cp shifted (0,-ypart lrcorner cp) --
+ urcorner cp -- ulcorner cp -- cycle) ;
+ endgroup ;
+\stopuseMPgraphic
+
+\setupMPvariables
+ [fuzzycount]
+ [n=10]
+
+\def\fuzzycount#1%
+ {{\tx\useMPgraphic{fuzzycount}{n=#1}}}
+
+\defineconversion[fuzzy][\fuzzycount]
+
+%%%%%%%
+
+\setupMPvariables
+ [EnglishRule]
+ [height=1ex,
+ width=\the\localhsize, % without \the, problems in non e-tex
+ color=darkgray]
+
+\defineblank
+ [EnglishRule]
+ [medium]
+
+\startuniqueMPgraphic{EnglishRule}{height,width,color}
+ height = \MPvar{height} ;
+ x1 = 0 ; x3 = \MPvar{width} ; x2 = x4 = .5x3 ;
+ y1 = y3 = 0 ; y2 = -y4 = height/2 ;
+ fill z1..z2..z3 & z3..z4..z1 & cycle withcolor \MPvar{color} ;
+\stopuniqueMPgraphic
+
+\def\EnglishRule%
+ {\startlinecorrection[EnglishRule]
+ \setlocalhsize \noindent \reuseMPgraphic{EnglishRule}
+ \stoplinecorrection}
+
+%D The following macro returns a tight bound character
+%D sequence.
+%D
+%D \useMPlibrary[txt]
+%D
+%D \startlinecorrection
+%D \TightText{\ss\bf 123}{0cm}{3cm}{red}
+%D \stoplinecorrection
+
+\def\TightText#1#2#3#4%
+ {\hbox % \ruledhbox
+ {\startMPcode
+ picture p ; p := image (graphictext "#1" withfillcolor red) ;
+ draw p xsized #2 ysized #3 withcolor \MPcolor{#4} ;
+ \stopMPcode}}
+
+\protect \endinput
diff --git a/tex/context/base/meta-xml.tex b/tex/context/base/meta-xml.tex
new file mode 100644
index 000000000..f6f81f767
--- /dev/null
+++ b/tex/context/base/meta-xml.tex
@@ -0,0 +1,29 @@
+%D \module
+%D [ file=meta-xml,
+%D version=2002.11.27,
+%D title=\METAPOST\ Graphics,
+%D subtitle=XML 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.
+
+\writestatus{loading}{MetaPost Graphics / XML Hacks}
+
+%D When we are dealing with XML, we need to make sure that
+%D \METAPOST\ knows about it. The next macro expands its
+%D argument (think of widget XFDF) into \type {\getXMLentity}
+%D calls.
+
+\unprotect
+
+\def\setMPtextXML#1#2%
+ {\bgroup
+ \enableXML
+ \expanded{\defconvertedcommand\noexpand\ascii{#2}}%
+ \expanded{\egroup\noexpand\dodoglobal\noexpand\setvalue{\@@MPT#1}{\ascii}}}
+
+\protect \endinput
diff --git a/tex/context/base/metatex.tex b/tex/context/base/metatex.tex
new file mode 100644
index 000000000..e90af709c
--- /dev/null
+++ b/tex/context/base/metatex.tex
@@ -0,0 +1,154 @@
+%D \module
+%D [ file=metatex,
+%D version=2008.10.10,
+%D title=\METATEX,
+%D subtitle=\METATEX\ Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen / \CONTEXT\ Development Team]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We can experiment here with runtime loading, id est no longer
+%D use a format. However, we still need a stub then but it could
+%D as well be luatools (mtxrun) itself then.
+
+%D This format is just a minimal layer on top of the \LUATEX\
+%D engine and will not provide high level functionality. It can
+%D be used as basis for dedicated (specialized) macro packages.
+%D
+%D A format is generated with the command;
+%D
+%D \starttyping
+%D luatools --make --compile metatex
+%D \stoptyping
+%D
+%D Remark: this is far from complete. We will gradually add
+%D more. Also, it's not yet clean what exactly will be part
+%D of it. This is a prelude to a configureable macro package.
+
+\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
+
+\edef\metatexformat {\jobname}
+\edef\metatexversion{2007.04.03 13:01}
+
+\let\fmtname \metatexformat
+\let\fmtversion\metatexversion
+
+\ifx\normalinput\undefined \let\normalinput\input \fi
+
+\def\loadcorefile#1{\normalinput#1.tex \relax}
+\def\loadmarkfile#1{\normalinput#1.mkiv\relax}
+
+\loadcorefile{syst-ini}
+
+\ifnum\luatexversion<60 % also change message
+ \writestatus{!!!!}{Your luatex binary is too old, you need at least version 0.60!}
+ \expandafter\end
+\fi
+
+\newtoks\metatexversiontoks \metatexversiontoks\expandafter{\metatexversion} % at the lua end
+
+\loadcorefile{syst-pln} % plain tex initializations of internal registers (no further code)
+
+\loadmarkfile{luat-cod} %
+\loadmarkfile{luat-bas} %
+\loadmarkfile{luat-lib} %
+
+% needs stripping:
+
+\loadmarkfile{catc-ini} % catcode table management
+\loadcorefile{catc-act} % active character definition mechanisms
+\loadcorefile{catc-def} % some generic catcode tables
+\loadcorefile{catc-ctx} % a couple of context specific tables but expected by later modules
+\loadcorefile{catc-sym} % some definitions related to \letter<tokens>
+
+% helpers, maybe less
+
+\loadmarkfile{syst-aux} % a whole lot of auxiliary macros
+%loadmarkfile{syst-lua} % some helpers using lua instead
+%loadmarkfile{syst-con} % some rather basic conversions
+%loadmarkfile{syst-fnt}
+%loadmarkfile{syst-str}
+%loadmarkfile{syst-rtp}
+
+% not needed
+
+% \loadmarkfile{supp-fil}
+% \loadmarkfile{supp-dir}
+
+% characters
+
+\loadmarkfile{char-utf}
+\loadmarkfile{char-ini}
+\loadmarkfile{char-enc} % \registerctxluafile{char-enc}{1.001}
+
+% nodes
+
+\loadmarkfile{node-ini}
+%loadmarkfile{node-fin}
+%loadmarkfile{node-par}
+
+% attributes, not needed:
+
+%loadmarkfile{attr-ini}
+
+% regimes
+
+% \loadmarkfile{regi-ini}
+% \loadcorefile{regi-syn}
+
+% languages
+
+% fonts
+
+% \loadcorefile{enco-ini.mkiv}
+% \loadcorefile{hand-ini.mkiv}
+
+\registerctxluafile{font-ini}{1.001}
+
+\registerctxluafile{node-fnt}{1.001}
+
+\registerctxluafile{font-enc}{1.001}
+\registerctxluafile{font-map}{1.001}
+\registerctxluafile{font-syn}{1.001}
+\registerctxluafile{font-tfm}{1.001}
+\registerctxluafile{font-afm}{1.001}
+\registerctxluafile{font-cid}{1.001}
+\registerctxluafile{font-ott}{1.001}
+\registerctxluafile{font-otf}{1.001}
+\registerctxluafile{font-otb}{1.001}
+\registerctxluafile{font-otn}{1.001}
+\registerctxluafile{font-ota}{1.001}
+\registerctxluafile{font-otp}{1.001}
+\registerctxluafile{font-otc}{1.001}
+%registerctxluafile{font-vf} {1.001}
+\registerctxluafile{font-def}{1.001}
+%registerctxluafile{font-ctx}{1.001}
+\registerctxluafile{font-xtx}{1.001}
+%registerctxluafile{font-fbk}{1.001}
+%registerctxluafile{font-ext}{1.001}
+\registerctxluafile{font-pat}{1.001}
+%registerctxluafile{font-chk}{1.001}
+
+%registerctxluafile{math-ini}{1.001}
+%registerctxluafile{math-dim}{1.001}
+%registerctxluafile{math-ent}{1.001}
+%registerctxluafile{math-ext}{1.001}
+%registerctxluafile{math-vfu}{1.001}
+%registerctxluafile{math-map}{1.001}
+%registerctxluafile{math-noa}{1.001}
+
+\registerctxluafile{task-ini}{1.001}
+
+%registerctxluafile{l-xml}{1.001} % needed for font database
+
+% why not ...
+
+\pdfoutput\plusone
+
+% done
+
+\errorstopmode \dump \endinput
diff --git a/tex/context/base/mlib-ctx.lua b/tex/context/base/mlib-ctx.lua
new file mode 100644
index 000000000..cc5682e6f
--- /dev/null
+++ b/tex/context/base/mlib-ctx.lua
@@ -0,0 +1,84 @@
+if not modules then modules = { } end modules ['mlib-ctx'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- todo
+
+local format, join = string.format, table.concat
+local sprint = tex.sprint
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+metapost = metapost or {}
+metapost.defaultformat = "metafun"
+
+function metapost.graphic(instance,mpsformat,str,initializations,preamble,askedfig)
+ local mpx = metapost.format(instance,mpsformat or metapost.defaultformat)
+ metapost.graphic_base_pass(mpx,str,initializations,preamble,askedfig)
+end
+
+function metapost.getclippath(instance,mpsformat,data,initializations,preamble)
+ local mpx = metapost.format(instance,mpsformat or metapost.defaultformat)
+ if mpx and data then
+ starttiming(metapost)
+ starttiming(metapost.exectime)
+ local result = mpx:execute(format("%s;beginfig(1);%s;%s;endfig;",preamble or "",initializations or "",data))
+ stoptiming(metapost.exectime)
+ if result.status > 0 then
+ logs.report("metafun", "%s: %s", result.status, result.error or result.term or result.log)
+ result = nil
+ else
+ result = metapost.filterclippath(result)
+ end
+ stoptiming(metapost)
+ return result
+ end
+end
+
+function metapost.filterclippath(result)
+ if result then
+ local figures = result.fig
+ if figures and #figures > 0 then
+ local figure = figures[1]
+ local objects = figure:objects()
+ if objects then
+ local lastclippath
+ for o=1,#objects do
+ local object = objects[o]
+ if object.type == "start_clip" then
+ lastclippath = object.path
+ end
+ end
+ return lastclippath
+ end
+ end
+ end
+end
+
+function metapost.theclippath(...)
+ local result = metapost.getclippath(...)
+ if result then -- we could just print the table
+ result = join(metapost.flushnormalpath(result),"\n")
+ sprint(result)
+ end
+end
+
+statistics.register("metapost processing time", function()
+ local n = metapost.n
+ if n > 0 then
+ local e, t = metapost.externals.n, statistics.elapsedtime
+ local str = format("%s seconds, loading: %s seconds, execution: %s seconds, n: %s",
+ t(metapost), t(mplib), t(metapost.exectime), n)
+ if e > 0 then
+ return format("%s, external: %s seconds (%s calls)", str, t(metapost.externals), e)
+ else
+ return str
+ end
+ else
+ return nil
+ end
+end)
diff --git a/tex/context/base/mlib-ctx.mkiv b/tex/context/base/mlib-ctx.mkiv
new file mode 100644
index 000000000..6f56b7e68
--- /dev/null
+++ b/tex/context/base/mlib-ctx.mkiv
@@ -0,0 +1,81 @@
+%D \module
+%D [ file=mlib-ctx,
+%D version=2008.03.25,
+%D title=\METAPOST\ Integrated Graphics,
+%D subtitle=Basics,
+%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.
+
+%D This file contains the \MPLIB\ variants of the by now ancient
+%D \MPTOPDF\ code.
+
+\writestatus{loading}{MetaPost Library Graphics / Initializations}
+
+\registerctxluafile{mlib-run}{1.001}
+\registerctxluafile{mlib-ctx}{1.001}
+
+\unprotect
+
+\protect \endinput
+
+% local mpgraphic = [[
+% for i=1 upto 1000 :
+% beginfig(0);
+% draw halfcircle scaled 1cm withcolor green ;
+% picture p ; p := "oeps" infont defaultfont scaled .75 rotated 45 ;
+% p := p shifted - (xpart center p,0) ;
+% draw p ; draw boundingbox p ;
+% endfig ;
+% beginfig(0);
+% draw halfcircle scaled 1cm dashed evenly withcolor green ;
+% endfig ;
+% beginfig(0);
+% pickup pencircle xscaled .5mm yscaled .25mm rotated 45 ;
+% draw halfcircle scaled 1cm withcolor red ;
+% endfig ;
+% beginfig(0);
+% draw halfcircle scaled 1cm ;
+% endfig ;
+% beginfig(0);
+% pickup pencircle xscaled .5mm yscaled .25mm rotated 45 ;
+% for k:=1 upto 10 :
+% draw halfcircle scaled uniformdeviate(1cm) withcolor (red/(k/4)) ;
+% endfor ;
+% endfig ;
+% endfor ;
+% ]]
+% -- local mpx = metapost.format("metafun")
+% metapost.process(metapost.format("metafun"),mpgraphic)
+
+% \starttext
+% \setupcolors[state=start]
+% \definecolor[red] [r=1]
+% \definecolor[cyan][c=1]
+% \setbox\scratchbox\hbox{\startMPcode\stopMPcode} % first specials are forgotten
+% \definecolor[sss][t=.5,a=1,r=1]
+% \definespotcolor[oeps1][green][p=.5]
+% \definespotcolor[oeps2][green][p=.25]
+% \definespotcolor[oeps3][green][p=.25,t=.5,a=1]
+% \startMPpage
+% fill fullcircle scaled 10cm withcolor \MPcolor{red} ;
+% fill fullcircle scaled 8cm withcolor cmyk(1,0,0,0) ;
+% fill fullcircle scaled 6cm withcolor cmyk(0,1,0,0) ;
+% fill fullcircle scaled 4cm withcolor cmyk(0,0,1,0) ;
+% fill fullcircle scaled 2cm withcolor cmyk(0,0,0,1) ;
+% currentpicture := currentpicture shifted (-7.5cm,0) ;
+% fill fullcircle scaled 10cm withcolor transparent(1,0.75,cmyk(0,0,1,0)) ;
+% fill fullcircle scaled 8cm withcolor \MPcolor{sss} ;
+% fill fullcircle scaled 6cm withcolor \MPcolor{oeps1} ;
+% fill fullcircle scaled 4cm withcolor \MPcolor{oeps2} ;
+% currentpicture := currentpicture shifted (-7.5cm,0) ;
+% fill fullcircle scaled 10cm withcolor \MPcolor{oeps3} ;
+% circular_shade(fullcircle scaled 8cm, 1, red, blue) ;
+% circular_shade(fullcircle scaled 6cm, 1, (1,0,0,0), (0,1,0,0)) ;
+% circular_shade(fullcircle scaled 4cm, 1, cmyk(.5,.5,1,0), (0,1,0,0)) ;
+% \stopMPpage
+% \stoptext
diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua
new file mode 100644
index 000000000..352070408
--- /dev/null
+++ b/tex/context/base/mlib-pdf.lua
@@ -0,0 +1,530 @@
+if not modules then modules = { } end modules ['mlib-pdf'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+local format, concat, gsub = string.format, table.concat, string.gsub
+local texsprint = tex.sprint
+local abs, sqrt, round = math.abs, math.sqrt, math.round
+
+local copy_node, write_node = node.copy, node.write
+
+local ctxcatcodes = tex.ctxcatcodes
+
+metapost = metapost or { }
+metapost.multipass = false
+metapost.n = 0
+metapost.optimize = true -- false
+
+--~ Because in MKiV we always have two passes, we save the objects. When an extra
+--~ mp run is done (due to for instance texts identifier in the parse pass), we
+--~ get a new result table and the stored objects are forgotten. Otherwise they
+--~ are reused.
+
+local function getobjects(result,figure,f)
+ if metapost.optimize then
+ local objects = result.objects
+ if not objects then
+ result.objects = { }
+ end
+ objects = result.objects[f]
+ if not objects then
+ objects = figure:objects()
+ result.objects[f] = objects
+ end
+ return objects
+ else
+ return figure:objects()
+ end
+end
+
+function metapost.convert(result, trialrun, flusher, multipass, askedfig)
+ if trialrun then
+ metapost.multipass = false
+ metapost.parse(result, askedfig)
+ if multipass and not metapost.multipass and metapost.optimize then
+ metapost.flush(result, flusher, askedfig) -- saves a run
+ else
+ return false
+ end
+ else
+ metapost.flush(result, flusher, askedfig)
+ end
+ return true -- done
+end
+
+metapost.flushers = { }
+metapost.flushers.pdf = { }
+
+local savedliterals = nil
+
+local mpsliteral = nodes.register(node.new("whatsit",8))
+
+function metapost.flush_literal(d) -- \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}}
+ if savedliterals then
+ local literal = copy_node(mpsliteral)
+ literal.data = savedliterals[d]
+ write_node(literal)
+ else
+ logs.report("metapost","problem flushing literal %s",d)
+ end
+end
+
+function metapost.flush_reset()
+ savedliterals = nil
+end
+
+function metapost.flushers.pdf.comment(message)
+ if message then
+ message = format("%% mps graphic %s: %s", metapost.n, message)
+ if savedliterals then
+ local last = #savedliterals + 1
+ savedliterals[last] = message
+ texsprint(ctxcatcodes,"\\MPLIBtoPDF{",last,"}")
+ else
+ savedliterals = { message }
+ texsprint(ctxcatcodes,"\\MPLIBtoPDF{1}")
+ end
+ end
+end
+
+function metapost.flushers.pdf.startfigure(n,llx,lly,urx,ury,message)
+ savedliterals = nil
+ metapost.n = metapost.n + 1
+ texsprint(ctxcatcodes,format("\\startMPLIBtoPDF{%s}{%s}{%s}{%s}",llx,lly,urx,ury))
+ if message then metapost.flushers.pdf.comment(message) end
+end
+
+function metapost.flushers.pdf.stopfigure(message)
+ if message then metapost.flushers.pdf.comment(message) end
+ texsprint(ctxcatcodes,"\\stopMPLIBtoPDF")
+ texsprint(ctxcatcodes,"\\ctxlua{metapost.flush_reset()}") -- maybe just at the beginning
+end
+
+function metapost.flushers.pdf.flushfigure(pdfliterals) -- table
+ if #pdfliterals > 0 then
+ pdfliterals = concat(pdfliterals,"\n")
+ if savedliterals then
+ local last = #savedliterals + 1
+ savedliterals[last] = pdfliterals
+ texsprint(ctxcatcodes,"\\MPLIBtoPDF{",last,"}")
+ else
+ savedliterals = { pdfliterals }
+ texsprint(ctxcatcodes,"\\MPLIBtoPDF{1}")
+ end
+ end
+end
+
+function metapost.flushers.pdf.textfigure(font,size,text,width,height,depth) -- we could save the factor
+ text = gsub(text,".","\\hbox{%1}") -- kerning happens in metapost (i have to check if this is true for mplib)
+ texsprint(ctxcatcodes,format("\\MPLIBtextext{%s}{%s}{%s}{%s}{%s}",font,size,text,0,-number.dimenfactors.bp*depth))
+end
+
+local bend_tolerance = 131/65536
+
+local rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
+
+local function pen_characteristics(object)
+ if mplib.pen_info then
+ local t = mplib.pen_info(object)
+ rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
+ divider = sx*sy - rx*ry
+ return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
+ else
+ rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
+ return false, 1
+ end
+end
+
+local function mpconcat(px, py) -- no tx, ty here / we can move this one inline if needed
+ return (sy*px-ry*py)/divider,(sx*py-rx*px)/divider
+end
+
+local function curved(ith,pth)
+ local d = pth.left_x - ith.right_x
+ if abs(ith.right_x - ith.x_coord - d) <= bend_tolerance and abs(pth.x_coord - pth.left_x - d) <= bend_tolerance then
+ d = pth.left_y - ith.right_y
+ if abs(ith.right_y - ith.y_coord - d) <= bend_tolerance and abs(pth.y_coord - pth.left_y - d) <= bend_tolerance then
+ return false
+ end
+ end
+ return true
+end
+
+local function flushnormalpath(path, t, open)
+ t = t or { }
+ local pth, ith
+ for i=1,#path do
+ pth = path[i]
+ if not ith then
+ t[#t+1] = format("%f %f m",pth.x_coord,pth.y_coord)
+ elseif curved(ith,pth) then
+ t[#t+1] = format("%f %f %f %f %f %f c",ith.right_x,ith.right_y,pth.left_x,pth.left_y,pth.x_coord,pth.y_coord)
+ else
+ t[#t+1] = format("%f %f l",pth.x_coord,pth.y_coord)
+ end
+ ith = pth
+ end
+ if not open then
+ local one = path[1]
+ if curved(pth,one) then
+ t[#t+1] = format("%f %f %f %f %f %f c",pth.right_x,pth.right_y,one.left_x,one.left_y,one.x_coord,one.y_coord )
+ else
+ t[#t+1] = format("%f %f l",one.x_coord,one.y_coord)
+ end
+ elseif #path == 1 then
+ -- special case .. draw point
+ local one = path[1]
+ t[#t+1] = format("%f %f l",one.x_coord,one.y_coord)
+ end
+ return t
+end
+
+local function flushconcatpath(path, t, open)
+ t = t or { }
+ t[#t+1] = format("%f %f %f %f %f %f cm", sx, rx, ry, sy, tx ,ty)
+ local pth, ith
+ for i=1,#path do
+ pth = path[i]
+ if not ith then
+ t[#t+1] = format("%f %f m",mpconcat(pth.x_coord,pth.y_coord))
+ elseif curved(ith,pth) then
+ local a, b = mpconcat(ith.right_x,ith.right_y)
+ local c, d = mpconcat(pth.left_x,pth.left_y)
+ t[#t+1] = format("%f %f %f %f %f %f c",a,b,c,d,mpconcat(pth.x_coord,pth.y_coord))
+ else
+ t[#t+1] = format("%f %f l",mpconcat(pth.x_coord, pth.y_coord))
+ end
+ ith = pth
+ end
+ if not open then
+ local one = path[1]
+ if curved(pth,one) then
+ local a, b = mpconcat(pth.right_x,pth.right_y)
+ local c, d = mpconcat(one.left_x,one.left_y)
+ t[#t+1] = format("%f %f %f %f %f %f c",a,b,c,d,mpconcat(one.x_coord, one.y_coord))
+ else
+ t[#t+1] = format("%f %f l",mpconcat(one.x_coord,one.y_coord))
+ end
+ elseif #path == 1 then
+ -- special case .. draw point
+ local one = path[1]
+ t[#t+1] = format("%f %f l",mpconcat(one.x_coord,one.y_coord))
+ end
+ return t
+end
+
+metapost.flushnormalpath = flushnormalpath
+
+metapost.specials = metapost.specials or { }
+
+-- we have two extension handlers, one for pre and postscripts, and one for colors
+
+-- the flusher is pdf based, if another backend is used, we need to overload the
+-- flusher; this is beta code, the organization will change
+
+function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan concat is sneller, 1 literal
+ if result then
+ local figures = result.fig
+ if figures then
+ flusher = flusher or metapost.flushers.pdf
+ local colorconverter = metapost.colorconverter() -- function !
+ local colorhandler = metapost.colorhandler
+ for f=1, #figures do
+ local figure = figures[f]
+ local objects = getobjects(result,figure,f)
+ local fignum = figure:charcode() or 0
+ if not askedfig or (askedfig == fignum) then
+ local t = { }
+ local miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
+ local bbox = figure:boundingbox()
+ local llx, lly, urx, ury = bbox[1], bbox[2], bbox[3], bbox[4] -- faster than unpack
+ metapost.llx = llx
+ metapost.lly = lly
+ metapost.urx = urx
+ metapost.ury = ury
+ if urx < llx then
+ -- invalid
+ flusher.startfigure(fignum,0,0,0,0,"invalid",figure)
+ flusher.stopfigure()
+ else
+ flusher.startfigure(fignum,llx,lly,urx,ury,"begin",figure)
+ t[#t+1] = "q"
+ if objects then
+ t[#t+1] = metapost.colorinitializer()
+ -- 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
+ if objecttype == "start_bounds" or objecttype == "stop_bounds" then
+ -- skip
+ elseif objecttype == "start_clip" then
+ t[#t+1] = "q"
+ flushnormalpath(object.path,t,false)
+ t[#t+1] = "W n"
+ elseif objecttype == "stop_clip" then
+ t[#t+1] = "Q"
+ miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
+ elseif objecttype == "special" then
+ metapost.specials.register(object.prescript)
+ elseif objecttype == "text" then
+ t[#t+1] = "q"
+ local ot = object.transform -- 3,4,5,6,1,2
+ t[#t+1] = format("%f %f %f %f %f %f cm",ot[3],ot[4],ot[5],ot[6],ot[1],ot[2]) -- TH: format("%f %f m %f %f %f %f 0 0 cm",unpack(ot))
+ flusher.flushfigure(t) -- flush accumulated literals
+ t = { }
+ flusher.textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth)
+ t[#t+1] = "Q"
+ else
+ -- alternatively we can pass on the stack, could be a helper
+ -- can be optimized with locals
+ local currentobject = { -- not needed when no extensions
+ type = object.type,
+ miterlimit = object.miterlimit,
+ linejoin = object.linejoin,
+ linecap = object.linecap,
+ color = object.color,
+ dash = object.dash,
+ path = object.path,
+ htap = object.htap,
+ pen = object.pen,
+ prescript = object.prescript,
+ postscript = object.postscript,
+ }
+ --
+ local before, inbetween, after = nil, nil, nil
+ --
+ local cs, cr = currentobject.color, nil
+ -- todo document why ...
+ if cs and colorhandler and #cs > 0 and round(cs[1]*10000) == 123 then -- test in function
+ currentobject, cr = colorhandler(cs,currentobject,t,colorconverter)
+ objecttype = currentobject.type
+ end
+ --
+ local prescript = currentobject.prescript
+ if prescript and prescript ~= "" then
+ -- move test to function
+ local special = metapost.specials[prescript]
+ if special then
+ currentobject, before, inbetween, after = special(currentobject.postscript,currentobject,t,flusher)
+ objecttype = currentobject.type
+ end
+ end
+ --
+ cs = currentobject.color
+ if cs and #cs > 0 then
+ t[#t+1], cr = colorconverter(cs)
+ end
+ --
+ if before then currentobject, t = before() end
+ local ml = currentobject.miterlimit
+ if ml and ml ~= miterlimit then
+ miterlimit = ml
+ t[#t+1] = format("%f M",ml)
+ end
+ local lj = currentobject.linejoin
+ if lj and lj ~= linejoin then
+ linejoin = lj
+ t[#t+1] = format("%i j",lj)
+ end
+ local lc = currentobject.linecap
+ if lc and lc ~= linecap then
+ linecap = lc
+ t[#t+1] = format("%i J",lc)
+ end
+ local dl = currentobject.dash
+ if dl then
+ local d = format("[%s] %i d",concat(dl.dashes or {}," "),dl.offset)
+ if d ~= dashed then
+ dashed = d
+ t[#t+1] = dashed
+ end
+ elseif dashed then
+ t[#t+1] = "[] 0 d"
+ dashed = false
+ end
+ if inbetween then currentobject, t = inbetween() end
+ local path = currentobject.path
+ local transformed, penwidth = false, 1
+ local open = path and path[1].left_type and path[#path].right_type -- at this moment only "end_point"
+ local pen = currentobject.pen
+ if pen then
+ if pen.type == 'elliptical' then
+ transformed, penwidth = pen_characteristics(object) -- boolean, value
+ t[#t+1] = format("%f w",penwidth) -- todo: only if changed
+ if objecttype == 'fill' then
+ objecttype = 'both'
+ end
+ else -- calculated by mplib itself
+ objecttype = 'fill'
+ end
+ end
+ if transformed then
+ t[#t+1] = "q"
+ end
+ if path then
+ if transformed then
+ flushconcatpath(path,t,open)
+ else
+ flushnormalpath(path,t,open)
+ end
+ if objecttype == "fill" then
+ t[#t+1] = "h f"
+ elseif objecttype == "outline" then
+ t[#t+1] = (open and "S") or "h S"
+ elseif objecttype == "both" then
+ t[#t+1] = "h B"
+ end
+ end
+ if transformed then
+ t[#t+1] = "Q"
+ end
+ local path = currentobject.htap
+ if path then
+ if transformed then
+ t[#t+1] = "q"
+ end
+ if transformed then
+ flushconcatpath(path,t,open)
+ else
+ flushnormalpath(path,t,open)
+ end
+ if objecttype == "fill" then
+ t[#t+1] = "h f"
+ elseif objecttype == "outline" then
+ t[#t+1] = (open and "S") or "h S"
+ elseif objecttype == "both" then
+ t[#t+1] = "h B"
+ end
+ if transformed then
+ t[#t+1] = "Q"
+ end
+ end
+ if cr then
+ t[#t+1] = cr
+ end
+ if after then currentobject, t = after() end
+ end
+ end
+ end
+ t[#t+1] = "Q"
+ flusher.flushfigure(t)
+ flusher.stopfigure("end")
+ end
+ if askedfig then
+ break
+ end
+ end
+ end
+ end
+ end
+end
+
+function metapost.parse(result,askedfig)
+ if result then
+ local figures = result.fig
+ if figures then
+ for f=1, #figures do
+ local figure = figures[f]
+ local fignum = figure:charcode() or 0
+ if not askedfig or (askedfig == fignum) then
+ local bbox = figure:boundingbox()
+ local llx, lly, urx, ury = bbox[1], bbox[2], bbox[3], bbox[4] -- faster than unpack
+ metapost.llx = llx
+ metapost.lly = lly
+ metapost.urx = urx
+ metapost.ury = ury
+ local objects = getobjects(result,figure,f)
+ if objects then
+ for o=1,#objects do
+ local object = objects[o]
+ if object.type == "outline" then
+ local prescript = object.prescript
+ if prescript then
+ local special = metapost.specials[prescript]
+ if special then
+ special(object.postscript,object)
+ end
+ end
+ end
+ end
+ end
+ break
+ end
+ end
+ end
+ end
+end
+
+-- tracing:
+
+local t = { }
+
+local flusher = {
+ startfigure = function()
+ t = { }
+ texsprint(ctxcatcodes,"\\startnointerference")
+ end,
+ flushfigure = function(literals)
+ for i=1, #literals do
+ t[#t+1] = literals[i]
+ end
+ end,
+ stopfigure = function()
+ texsprint(ctxcatcodes,"\\stopnointerference")
+ end
+}
+
+function metapost.pdfliterals(result)
+ metapost.flush(result,flusher)
+ return t
+end
+
+-- so far
+
+function metapost.totable(result)
+ local figure = result and result.fig and result.fig[1]
+ if figure then
+ local t = { }
+ local objects = figure:objects()
+ for o=1,#objects do
+ local object = objects[o]
+ local tt = { }
+ local fields = mplib.fields(object)
+ for f=1,#fields do
+ local field = fields[f]
+ tt[field] = object[field]
+ end
+ t[#t+1] = tt
+ end
+ local b = figure:boundingbox()
+ return {
+ boundingbox = { llx = b[1], lly = b[2], urx = b[3], ury = b[4] },
+ objects = t
+ }
+ else
+ return nil
+ end
+end
+
+-- will be overloaded later
+
+function metapost.colorconverter()
+ return function(cr)
+ local n = #cr
+ if n == 4 then
+ local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+ return format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k), "0 g 0 G"
+ elseif n == 3 then
+ local r, g, b = cr[1], cr[2], cr[3]
+ return format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b), "0 g 0 G"
+ else
+ local s = cr[1]
+ return format("%.3f g %.3f G",s,s), "0 g 0 G"
+ end
+ end
+end
diff --git a/tex/context/base/mlib-pdf.mkiv b/tex/context/base/mlib-pdf.mkiv
new file mode 100644
index 000000000..2681b0810
--- /dev/null
+++ b/tex/context/base/mlib-pdf.mkiv
@@ -0,0 +1,91 @@
+%D \module
+%D [ file=mlib-pdf,
+%D version=2008.03.25,
+%D title=\METAPOST\ Integrated Graphics,
+%D subtitle=Conversion to PDF,
+%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.
+
+\unprotect
+
+\registerctxluafile{mlib-pdf}{1.001}
+
+\def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}}
+
+\def\MPLIBboundingbox#1#2#3#4%
+ {\xdef\MPllx{#1}%
+ \xdef\MPlly{#2}%
+ \xdef\MPurx{#3}%
+ \xdef\MPury{#4}%
+ \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}%
+ \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}}
+
+\def\startMPLIBtoPDF#1#2#3#4% watch the transparency reset
+ {\naturalhbox\bgroup
+ \doactivatecolor\s!black\forcecolorhack
+ \MPLIBboundingbox{#1}{#2}{#3}{#4}%
+ %\forgetall % done already elsewhere
+ \setbox\scratchbox\vbox\bgroup
+ \noindent % this is really needed in order to force tex into proper cm's
+ \startMPresources}
+
+\def\stopMPLIBtoPDF % watch the transparency reset
+ {%\dohandleMPresettransparency % not needed
+ \stopMPresources
+ \egroup
+ \setbox\scratchbox\hbox\bgroup
+ \hskip-\MPllx\onebasepoint
+ \raise-\MPlly\onebasepoint
+ \box\scratchbox
+ \egroup
+ \setbox\scratchbox\vbox to \MPheight\bgroup
+ \vfill
+ \hsize\MPwidth
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup
+ \wd\scratchbox\MPwidth
+ \ht\scratchbox\MPheight
+ \dopackageMPgraphic\scratchbox
+ \egroup}
+
+% \def\MPLIBtextext#1#2#3#4#5%
+% {\begingroup
+% \def\MPtextdata{#3}% delegate the splitter to lua
+% \defconvertedcommand\MPtextdata\MPtextdata % no edef
+% \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber
+% \executeifdefined{handleMPtext\MPtexttag}
+% {\setbox\scratchbox\hbox
+% {\font\temp=#1\space at #2\onebasepoint
+% \let\c\char
+% \temp
+% \MPfshowcommand{#3}}%
+% \setbox\scratchbox\hbox
+% {\hskip#4\onebasepoint
+% \raise#5\onebasepoint
+% \box\scratchbox}%
+% \smashbox\scratchbox
+% \box\scratchbox}%
+% \endgroup}
+
+\def\MPLIBtextext#1#2#3#4#5%
+ {\begingroup
+ \setbox\scratchbox\hbox
+ {\font\temp=#1\space at #2\onebasepoint
+ \let\c\char
+ \temp
+ #3}%
+ \setbox\scratchbox\hbox
+ {\hskip#4\onebasepoint
+ \raise#5\onebasepoint
+ \box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \endgroup}
+
+\protect \endinput
diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua
new file mode 100644
index 000000000..8b36660d3
--- /dev/null
+++ b/tex/context/base/mlib-pps.lua
@@ -0,0 +1,897 @@
+if not modules then modules = { } end modules ['mlib-pps'] = { -- prescript, postscripts and specials
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ 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
+--
+-- todo: report max textexts
+
+local format, gmatch, concat, round, match = string.format, string.gmatch, table.concat, math.round, string.match
+local sprint = tex.sprint
+local tonumber, type = tonumber, type
+local lpegmatch = lpeg.match
+local texbox = tex.box
+local copy_list = node.copy_list
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local trace_textexts = false trackers.register("metapost.textexts", function(v) trace_textexts = v end)
+
+colors = colors or { }
+
+local rgbtocmyk = colors.rgbtocmyk or function() return 0,0,0,1 end
+local cmyktorgb = colors.cmyktorgb or function() return 0,0,0 end
+local rgbtogray = colors.rgbtogray or function() return 0 end
+local cmyktogray = colors.cmyktogray or function() return 0 end
+
+metapost = metapost or { }
+metapost.specials = metapost.specials or { }
+metapost.specials.data = metapost.specials.data or { }
+metapost.externals = metapost.externals or { n = 0 }
+
+local data = metapost.specials.data
+
+local colordata = { {}, {}, {}, {}, {} }
+
+--~ (r,g,b) => cmyk : r=123 g= 1 b=hash
+--~ => spot : r=123 g= 2 b=hash
+--~ => transparent rgb : r=123 g= 3 b=hash
+--~ => transparent cmyk : r=123 g= 4 b=hash
+--~ => transparent spot : r=123 g= 5 b=hash
+--~ => rest : r=123 g=n>10 b=whatever
+
+local nooutercolor = "0 g 0 G"
+local nooutertransparency = "/Tr0 gs" -- only when set
+local outercolormode = 0
+local outercolor = nooutercolor
+local outertransparency = nooutertransparency
+local innercolor = nooutercolor
+local innertransparency = nooutertransparency
+
+local pdfcolor, pdftransparency = lpdf.color, lpdf.transparency
+local registercolor, registerspotcolor = colors.register, colors.registerspotcolor
+local registertransparency = transparencies.register
+
+function metapost.set_outer_color(mode,colormodel,colorattribute,transparencyattribute)
+ -- has always to be called before conversion
+ -- todo: transparency (not in the mood now)
+ outercolormode = mode
+ if mode == 1 or mode == 3 then
+ -- inherit from outer (registered color)
+ outercolor = pdfcolor(colormodel,colorattribute) or nooutercolor
+ outertransparency = pdftransparency(transparencyattribute) or nooutertransparency
+ elseif mode == 2 then
+ -- stand alone (see m-punk.tex)
+ outercolor = ""
+ outertransparency = ""
+ else -- 0
+ outercolor = nooutercolor
+ outertransparency = nooutertransparency
+ end
+ innercolor = outercolor
+ innertransparency = outertransparency -- not yet used
+end
+
+local function checked_color_pair(color)
+ if not color then
+ return innercolor, outercolor
+ elseif outercolormode == 3 then
+ innercolor = color
+ return innercolor, innercolor
+ else
+ return color, outercolor
+ end
+end
+
+metapost.checked_color_pair = checked_color_pair
+
+function metapost.colorinitializer()
+ innercolor = outercolor
+ innertransparency = outertransparency
+ return outercolor, outertransparency
+end
+
+function metapost.specials.register(str) -- only colors
+ local size, content, n, class = match(str,"^%%%%MetaPostSpecial: (%d+) (.*) (%d+) (%d+)$")
+ if class then
+ -- use lpeg splitter
+ local data = { }
+ for s in gmatch(content,"[^ ]+") do
+ data[#data+1] = s
+ end
+ class, n = tonumber(class), tonumber(n)
+ if class == 3 or class == 4 or class == 5 then
+ -- hm, weird
+ else
+ n = tonumber(data[1])
+ end
+ if n then
+ local cc = colordata[class]
+ if cc then
+ cc[n] = data
+ else
+ logs.report("mplib","problematic special: %s (no colordata class %s)", str or "?",class)
+ end
+ else
+ -- there is some bug to be solved, so we issue a message
+ logs.report("mplib","problematic special: %s", str or "?")
+ end
+ end
+--~ if match(str,"^%%%%MetaPostOption: multipass") then
+--~ metapost.multipass = true
+--~ end
+end
+
+local function spotcolorconverter(parent, n, d, p)
+ registerspotcolor(parent)
+ return pdfcolor(colors.model,registercolor(nil,'spot',parent,n,d,p))
+end
+
+function metapost.colorhandler(cs, object, result, colorconverter) -- handles specials
+ local cr = outercolor
+ local what = round(cs[2]*10000)
+ local data = colordata[what]
+ if data then
+ data = data[round(cs[3]*10000)]
+ end
+ if not data then
+ --
+ elseif what == 1 then
+ result[#result+1], cr = colorconverter({ data[2], data[3], data[4], data[5] })
+ elseif what == 2 then
+ result[#result+1] = spotcolorconverter(data[2],data[3],data[4],data[5])
+ else
+ if what == 3 then
+ result[#result+1], cr = colorconverter({ data[3], data[4], data[5]})
+ elseif what == 4 then
+ result[#result+1], cr = colorconverter({ data[3], data[4], data[5], data[6]})
+ elseif what == 5 then
+ result[#result+1] = spotcolorconverter(data[3],data[4],data[5],data[6])
+ end
+ object.prescript = "tr"
+ object.postscript = data[1] .. "," .. data[2]
+ end
+ object.color = nil
+ return object, cr
+end
+
+function metapost.colorspec(cs) -- used for shades ... returns table (for checking) or string (spot)
+ local what = round(cs[2]*10000)
+ local data = colordata[what][round(cs[3]*10000)]
+ if not data then
+ return { 0 }
+ elseif what == 1 then
+ return { tonumber(data[2]), tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) }
+ elseif what == 2 then
+ return spotcolorconverter(data[2],data[3],data[4],data[5])
+ elseif what == 3 then
+ return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) }
+ elseif what == 4 then
+ return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]), tonumber(data[6]) }
+ elseif what == 5 then
+ return spotcolorconverter(data[3],data[4],data[5],data[6])
+ end
+end
+
+function metapost.specials.tr(specification,object,result)
+ local a, t = match(specification,"^(.+),(.+)$")
+ local before = a and t and function()
+ result[#result+1] = format("/Tr%s gs",registertransparency(nil,a,t,true)) -- maybe nil instead of 'mp'
+ return object, result
+ end
+ local after = before and function()
+ result[#result+1] = outertransparency -- here we could revert to the outer color
+ return object, result
+ end
+ return object, before, nil, after
+end
+
+local specificationsplitter = lpeg.Ct(lpeg.splitat(" "))
+local colorsplitter = lpeg.Ct(lpeg.splitat(":"))
+local colorsplitter = lpeg.Ct(lpeg.splitter(":",tonumber))
+
+-- Unfortunately we cannot use cmyk colors natively because there is no
+-- generic color allocation primitive ... it's just an rgbcolor color.. This
+-- means that we cannot pass colors in either cmyk or rgb form.
+--
+-- def cmyk(expr c,m,y,k) =
+-- 1 withprescript "cc" withpostscript ddddecimal (c,m,y,k)
+-- enddef ;
+--
+-- This is also an example of a simple plugin.
+
+--~ function metapost.specials.cc(specification,object,result)
+--~ object.color = lpegmatch(specificationsplitter,specification)
+--~ return object, nil, nil, nil
+--~ end
+--~ function metapost.specials.cc(specification,object,result)
+--~ local c = lpegmatch(specificationsplitter,specification)
+--~ local o = object.color[1]
+--~ c[1],c[2],c[3],c[4] = o*c[1],o*c[2],o*c[3],o*c[4]
+--~ return object, nil, nil, nil
+--~ end
+
+-- thanks to taco's reading of the postscript manual:
+--
+-- x' = sx * x + ry * y + tx
+-- y' = rx * x + sy * y + ty
+
+function metapost.specials.fg(specification,object,result,flusher) -- graphics
+ local op = object.path
+ 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
+ if sx == 0 then sx = 0.00001 end
+ if sy == 0 then sy = 0.00001 end
+ local before = specification and function()
+ flusher.flushfigure(result)
+ sprint(ctxcatcodes,format("\\MPLIBfigure{%f}{%f}{%f}{%f}{%f}{%f}{%s}",sx,rx,ry,sy,tx,ty,specification))
+ object.path = nil
+ return object, { }
+ end
+ return { } , before, nil, nil -- replace { } by object for tracing
+end
+
+function metapost.specials.ps(specification,object,result) -- positions
+ local op = object.path
+ local first, third = op[1], op[3]
+ local x, y = first.x_coord, first.y_coord
+ local w, h = third.x_coord - x, third.y_coord - y
+ local label = specification
+ x = x - metapost.llx
+ y = metapost.ury - y
+ -- logs.report("mplib", "todo: position '%s' at (%s,%s) with (%s,%s)",label,x,y,w,h)
+ sprint(ctxcatcodes,format("\\dosavepositionwhd{%s}{0}{%sbp}{%sbp}{%sbp}{%sbp}{0pt}",label,x,y,w,h))
+ return { }, nil, nil, nil
+end
+
+local nofshades = 0 -- todo: hash resources, start at 1000 in order not to clash with older
+
+local function normalize(ca,cb)
+ if #cb == 1 then
+ if #ca == 4 then
+ cb[1], cb[2], cb[3], cb[4] = 0, 0, 0, 1-cb[1]
+ else
+ cb[1], cb[2], cb[3] = cb[1], cb[1], cb[1]
+ end
+ elseif #cb == 3 then
+ if #ca == 4 then
+ cb[1], cb[2], cb[3], cb[4] = rgbtocmyk(cb[1],cb[2],cb[3])
+ else
+ cb[1], cb[2], cb[3] = cmyktorgb(cb[1],cb[2],cb[3],cb[4])
+ end
+ 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 = { }
+ local t = lpegmatch(specificationsplitter,specification)
+ -- we need a way to move/scale
+ local ca = lpegmatch(colorsplitter,t[4])
+ local cb = lpegmatch(colorsplitter,t[8])
+ if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end
+ if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end
+ local name = format("MplSh%s",nofshades)
+ local domain = { tonumber(t[1]), tonumber(t[2]) }
+ local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[7]), tonumber(t[9]), tonumber(t[10]), tonumber(t[11]) }
+ if type(ca) == "string" then
+ -- backend specific (will be renamed)
+ lpdf.circularshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates)
+ else
+ if #ca > #cb then
+ normalize(ca,cb)
+ elseif #ca < #cb then
+ normalize(cb,ca)
+ end
+ local model = colors.model
+ if model == "all" then
+ model= (#ca == 4 and "cmyk") or (#ca == 3 and "rgb") or "gray"
+ end
+ if model == "rgb" then
+ 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
+ cb[1], cb[2], cb[3] = b, b, b
+ end
+ -- backend specific (will be renamed)
+ lpdf.circularshade(name,domain,ca,cb,1,"DeviceRGB",coordinates)
+ elseif model == "cmyk" then
+ if #ca == 3 then
+ ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3])
+ cb[1], cb[2], cb[3], ca[4] = rgbtocmyk(cb[1],cb[2],cb[3])
+ elseif #ca == 1 then
+ ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1]
+ cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1]
+ end
+ -- backend specific (will be renamed)
+ lpdf.circularshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates)
+ else
+ if #ca == 4 then
+ ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4])
+ cb[1] = cmyktogray(cb[1],cb[2],cb[3],cb[4])
+ elseif #ca == 3 then
+ ca[1] = rgbtogray(ca[1],ca[2],ca[3])
+ cb[1] = rgbtogray(cb[1],cb[2],cb[3])
+ end
+ -- backend specific (will be renamed)
+ lpdf.circularshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates)
+ end
+ end
+ local before = function()
+ result[#result+1] = "q /Pattern cs"
+ return object, result
+ end
+ local after = function()
+ result[#result+1] = format("W n /%s sh Q", name)
+ return object, result
+ end
+ object.color, object.type = nil, nil
+ return object, before, nil, after
+end
+
+function metapost.specials.ls(specification,object,result,flusher)
+ nofshades = nofshades + 1
+ flusher.flushfigure(result)
+ result = { }
+ local t = lpegmatch(specificationsplitter,specification)
+ -- we need a way to move/scale
+ local ca = lpegmatch(colorsplitter,t[4])
+ local cb = lpegmatch(colorsplitter,t[7])
+ if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end
+ if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end
+ local name = format("MpSh%s",nofshades)
+ local domain = { tonumber(t[1]), tonumber(t[2]) }
+ local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[8]), tonumber(t[9]) }
+ if type(ca) == "string" then
+ -- backend specific (will be renamed)
+ lpdf.linearshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates)
+ else
+ if #ca > #cb then
+ normalize(ca,cb)
+ elseif #ca < #cb then
+ normalize(cb,ca)
+ end
+ local model = colors.model
+ if model == "all" then
+ model= (#ca == 4 and "cmyk") or (#ca == 3 and "rgb") or "gray"
+ end
+ if model == "rgb" then
+ 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])
+ elseif #ca == 1 then
+ local a, b = 1-ca[1], 1-cb[1]
+ ca[1], ca[2], ca[3] = a, a, a
+ cb[1], cb[2], cb[3] = b, b, b
+ end
+ -- backend specific (will be renamed)
+ lpdf.linearshade(name,domain,ca,cb,1,"DeviceRGB",coordinates)
+ elseif model == "cmyk" then
+ if #ca == 3 then
+ ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3])
+ cb[1], cb[2], cb[3], ca[4] = rgbtocmyk(cb[1],cb[2],cb[3])
+ elseif #ca == 1 then
+ ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1]
+ cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1]
+ end
+ -- backend specific (will be renamed)
+ lpdf.linearshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates)
+ else
+ if #ca == 4 then
+ ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4])
+ cb[1] = cmyktogray(cb[1],cb[2],cb[3],cb[4])
+ elseif #ca == 3 then
+ ca[1] = rgbtogray(ca[1],ca[2],ca[3])
+ cb[1] = rgbtogray(cb[1],cb[2],cb[3])
+ end
+ -- backend specific (will be renamed)
+ lpdf.linearshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates)
+ end
+ end
+ local before = function()
+ result[#result+1] = "q /Pattern cs"
+ return object, result
+ end
+ local after = function()
+ result[#result+1] = format("W n /%s sh Q", name)
+ return object, result
+ end
+ object.color, object.type = nil, nil
+ return object, before, nil, after
+end
+
+-- no need for a before here
+
+local current_format, current_graphic, current_initializations
+
+-- metapost.first_box = metapost.first_box or 1000
+-- metapost.last_box = metapost.last_box or 1100
+--~ metapost.textext_current = metapost.first_box
+metapost.multipass = false
+
+local textexts = { }
+
+function metapost.free_boxes() -- todo: mp direct list ipv box
+ -- for i = metapost.first_box,metapost.last_box do
+ -- local b = texbox[i]
+ -- if b then
+ -- texbox[i] = nil -- no node.flush_list(b) needed, else double free error
+ -- else
+ -- break
+ -- end
+ -- end
+ for n, box in next, textexts do
+ local tn = textexts[n]
+ if tn then
+ -- somehow not flushed (used)
+ textexts[n] = nil
+ end
+ end
+ textexts = { }
+end
+
+function metapost.settext(box,slot)
+ textexts[slot] = copy_list(texbox[box])
+ texbox[box] = nil
+ -- this will become
+ -- textexts[slot] = texbox[box]
+ -- unsetbox(box)
+end
+
+function metapost.gettext(box,slot)
+ texbox[box] = copy_list(textexts[slot])
+-- textexts[slot] = nil -- no, pictures can be placed several times
+end
+
+function metapost.specials.tf(specification,object)
+--~ print("setting", metapost.textext_current)
+ local n, str = match(specification,"^(%d+):(.+)$")
+ if n and str then
+ n = tonumber(n)
+ -- if metapost.textext_current < metapost.last_box then
+ -- metapost.textext_current = metapost.first_box + n - 1
+ -- end
+ if trace_textexts then
+ -- logs.report("metapost","first pass: order %s, box %s",n,metapost.textext_current)
+ logs.report("metapost","first pass: order %s",n)
+ end
+ -- sprint(ctxcatcodes,format("\\MPLIBsettext{%s}{%s}",metapost.textext_current,str))
+ sprint(ctxcatcodes,format("\\MPLIBsettext{%s}{%s}",n,str))
+ metapost.multipass = true
+ end
+ return { }, nil, nil, nil
+end
+
+function metapost.specials.ts(specification,object,result,flusher)
+ -- print("getting", metapost.textext_current)
+ local n, str = match(specification,"^(%d+):(.+)$")
+ if n and str then
+ n = tonumber(n)
+ if trace_textexts then
+ -- logs.report("metapost","second pass: order %s, box %s",n,metapost.textext_current)
+ logs.report("metapost","second pass: order %s",n)
+ end
+ local op = object.path
+ 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
+ if sx == 0 then sx = 0.00001 end
+ if sy == 0 then sy = 0.00001 end
+ if not trace_textexts then
+ object.path = nil
+ end
+ local before = function() -- no need for before function (just do it directly)
+ --~ flusher.flushfigure(result)
+ --~ sprint(ctxcatcodes,format("\\MPLIBgettext{%f}{%f}{%f}{%f}{%f}{%f}{%s}",sx,rx,ry,sy,tx,ty,metapost.textext_current))
+ --~ result = { }
+ result[#result+1] = format("q %f %f %f %f %f %f cm", sx,rx,ry,sy,tx,ty)
+ flusher.flushfigure(result)
+ -- if metapost.textext_current < metapost.last_box then
+ -- metapost.textext_current = metapost.first_box + n - 1
+ -- end
+ -- local b = metapost.textext_current
+ -- local box = texbox[b]
+ local box = textexts[n]
+ if box then
+ -- sprint(ctxcatcodes,format("\\MPLIBgettextscaled{%s}{%s}{%s}",b,metapost.sxsy(box.width,box.height,box.depth)))
+ sprint(ctxcatcodes,format("\\MPLIBgettextscaled{%s}{%s}{%s}",n,metapost.sxsy(box.width,box.height,box.depth)))
+ else
+ -- error
+ end
+ result = { "Q" }
+ return object, result
+ end
+ return { }, before, nil, nil -- replace { } by object for tracing
+ else
+ return { }, nil, nil, nil -- replace { } by object for tracing
+ end
+end
+
+-- rather generic pdf, so use this elsewhere too it no longer pays
+-- off to distinguish between outline and fill (we now have both
+-- too, e.g. in arrows)
+
+metapost.reducetogray = true
+
+local models = { }
+
+function models.all(cr)
+ local n = #cr
+ if n == 0 then
+ return checked_color_pair()
+ elseif metapost.reducetogray then
+ if n == 1 then
+ local s = cr[1]
+ return checked_color_pair(format("%.3f g %.3f G",s,s))
+ elseif n == 3 then
+ local r, g, b = cr[1], cr[2], cr[3]
+ if r == g and g == b then
+ return checked_color_pair(format("%.3f g %.3f G",r,r))
+ else
+ return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+ end
+ else
+ local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+ if c == m and m == y and y == 0 then
+ k = 1 - k
+ return checked_color_pair(format("%.3f g %.3f G",k,k))
+ else
+ return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+ end
+ end
+ elseif n == 1 then
+ local s = cr[1]
+ return checked_color_pair(format("%.3f g %.3f G",s,s))
+ elseif n == 3 then
+ local r, g, b = cr[1], cr[2], cr[3]
+ return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+ else
+ local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+ return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+ end
+end
+
+function models.rgb(cr)
+ local n = #cr
+ if n == 0 then
+ return checked_color_pair()
+ elseif metapost.reducetogray then
+ if n == 1 then
+ local s = cr[1]
+ checked_color_pair(format("%.3f g %.3f G",s,s))
+ elseif n == 3 then
+ local r, g, b = cr[1], cr[2], cr[3]
+ if r == g and g == b then
+ return checked_color_pair(format("%.3f g %.3f G",r,r))
+ else
+ return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+ end
+ else
+ local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+ if c == m and m == y and y == 0 then
+ k = 1 - k
+ return checked_color_pair(format("%.3f g %.3f G",k,k))
+ else
+ local r, g, b = cmyktorgb(c,m,y,k)
+ return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+ end
+ end
+ elseif n == 1 then
+ local s = cr[1]
+ return checked_color_pair(format("%.3f g %.3f G",s,s))
+ else
+ local r, g, b
+ if n == 3 then
+ r, g, b = cmyktorgb(cr[1],cr[2],cr[3],cr[4])
+ else
+ r, g, b = cr[1], cr[2], cr[3]
+ end
+ return checked_color_pair(format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b))
+ end
+end
+
+function models.cmyk(cr)
+ local n = #cr
+ if n == 0 then
+ return checked_color_pair()
+ elseif metapost.reducetogray then
+ if n == 1 then
+ local s = cr[1]
+ return checked_color_pair(format("%.3f g %.3f G",s,s))
+ elseif n == 3 then
+ local r, g, b = cr[1], cr[2], cr[3]
+ if r == g and g == b then
+ return checked_color_pair(format("%.3f g %.3f G",r,r))
+ else
+ local c, m, y, k = rgbtocmyk(r,g,b)
+ return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+ end
+ else
+ local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+ if c == m and m == y and y == 0 then
+ k = 1 - k
+ return checked_color_pair(format("%.3f g %.3f G",k,k))
+ else
+ return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+ end
+ end
+ elseif n == 1 then
+ local s = cr[1]
+ return checked_color_pair(format("%.3f g %.3f G",s,s))
+ else
+ local c, m, y, k
+ if n == 3 then
+ c, m, y, k = rgbtocmyk(cr[1],cr[2],cr[3])
+ else
+ c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+ end
+ return checked_color_pair(format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k))
+ end
+end
+
+function models.gray(cr)
+ local n, s = #cr, 0
+ if n == 0 then
+ return checked_color_pair()
+ elseif n == 4 then
+ s = cmyktogray(cr[1],cr[2],cr[3],cr[4])
+ elseif n == 3 then
+ s = rgbtogray(cr[1],cr[2],cr[3])
+ else
+ s = cr[1]
+ end
+ return checked_color_pair(format("%.3f g %.3f G",s,s))
+end
+
+function metapost.colorconverter()
+ return models[colors.model] or gray
+end
+
+do
+
+ local P, S, V, Cs = lpeg.P, lpeg.S, lpeg.V, lpeg.Cs
+
+ 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, forced = false, false
+
+ local function convert(str)
+ found = true
+ return "rawtextext(\"" .. str .. "\")" -- centered
+ end
+ local function ditto(str)
+ return "\" & ditto & \""
+ end
+ local function register()
+ found = true
+ end
+ local function force()
+ forced = true
+ end
+
+ local texmess = (dquote/ditto + (1 - etex))^0
+
+ local function ignore(s)
+ logs.report("mplib","ignoring verbatim tex: %s",s)
+ return ""
+ end
+
+ local parser = P {
+ [1] = Cs((V(2)/register + V(4)/ignore + V(3)/convert + V(5)/force + 1)^0),
+ [2] = ttex + gtex,
+ [3] = btex * spacing * Cs(texmess) * etex,
+ [4] = vtex * spacing * Cs(texmess) * etex,
+ [5] = multipass, -- experimental, only for testing
+ }
+
+ -- currently a a one-liner produces less code
+
+ local parser = Cs((
+ (ttex + gtex)/register
+ + (btex * spacing * Cs(texmess) * etex)/convert
+ + (vtex * spacing * Cs(texmess) * etex)/ignore
+ + 1
+ )^0)
+
+ function metapost.check_texts(str)
+ found, forced = false, false
+ return lpegmatch(parser,str), found, forced
+ end
+
+end
+
+local factor = 65536*(7227/7200)
+
+function metapost.edefsxsy(wd,ht,dp) -- helper for figure
+ local hd = ht + dp
+ commands.edef("sx",(wd ~= 0 and factor/wd) or 0)
+ commands.edef("sy",(hd ~= 0 and factor/hd) or 0)
+end
+
+function metapost.sxsy(wd,ht,dp) -- helper for text
+ local hd = ht + dp
+ return (wd ~= 0 and factor/wd) or 0, (hd ~= 0 and factor/hd) or 0
+end
+
+local no_trial_run = "_trial_run_ := false ;"
+local do_trial_run = "if unknown _trial_run_ : boolean _trial_run_ fi ; _trial_run_ := true ;"
+local text_data_template = "_tt_w_[%i]:=%f;_tt_h_[%i]:=%f;_tt_d_[%i]:=%f;"
+local do_begin_fig = "; beginfig(1); "
+local do_end_fig = "; endfig ;"
+local do_safeguard = ";"
+
+function metapost.text_texts_data()
+ local t, n = { }, 0
+--~ for i = metapost.first_box, metapost.last_box do
+--~ n = n + 1
+--~ local box = texbox[i]
+ for n, box in next, textexts do
+ if trace_textexts then
+ logs.report("metapost","passed data: order %s, box %s",n,i)
+ end
+ if box then
+ t[#t+1] = format(text_data_template,n,box.width/factor,n,box.height/factor,n,box.depth/factor)
+ else
+ break
+ end
+ end
+--~ print(table.serialize(t))
+ return t
+end
+
+metapost.intermediate = metapost.intermediate or {}
+metapost.intermediate.actions = metapost.intermediate.actions or {}
+metapost.intermediate.needed = false
+
+metapost.method = 1 -- 1:dumb 2:clever
+
+function metapost.graphic_base_pass(mpsformat,str,initializations,preamble,askedfig)
+ local nofig = (askedfig and "") or false
+ local done_1, done_2, forced_1, forced_2
+ str, done_1, forced_1 = metapost.check_texts(str)
+ if not preamble or preamble == "" then
+ preamble, done_2, forced_2 = "", false, false
+ else
+ preamble, done_2, forced_2 = metapost.check_texts(preamble)
+ end
+ -- metapost.textext_current = metapost.first_box
+ metapost.intermediate.needed = false
+ metapost.multipass = false -- no needed here
+ current_format, current_graphic, current_initializations = mpsformat, str, initializations or ""
+ 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,
+ nofig or do_begin_fig,
+ do_trial_run,
+ current_initializations,
+ do_safeguard,
+ current_graphic,
+ nofig or do_end_fig
+ -- }, true, nil, true )
+ }, true, nil, not (forced_1 or forced_2), false, askedfig)
+ if metapost.intermediate.needed then
+ for _, action in next, metapost.intermediate.actions do
+ action()
+ end
+ end
+ if not flushed or not metapost.optimize then
+ -- tricky, we can only ask once for objects and therefore
+ -- we really need a second run when not optimized
+ sprint(ctxcatcodes,format("\\ctxlua{metapost.graphic_extra_pass(%s)}",askedfig or "false"))
+ end
+ else
+ metapost.process(mpsformat, {
+ preamble,
+ nofig or do_begin_fig,
+ no_trial_run,
+ current_initializations,
+ do_safeguard,
+ current_graphic,
+ nofig or do_end_fig
+ }, false, nil, false, false, askedfig )
+ end
+ -- here we could free the textext boxes
+ metapost.free_boxes()
+end
+
+function metapost.graphic_extra_pass(askedfig)
+ local nofig = (askedfig and "") or false
+ -- metapost.textext_current = metapost.first_box
+ metapost.process(current_format, {
+ nofig or do_begin_fig,
+ no_trial_run,
+ concat(metapost.text_texts_data()," ;\n"),
+ current_initializations,
+ do_safeguard,
+ current_graphic,
+ nofig or do_end_fig
+ }, false, nil, false, true, askedfig )
+end
+
+metapost.tex = metapost.tex or { }
+
+do -- only used in graphictexts
+
+ local environments = { }
+
+ function metapost.tex.set(str)
+ environments[#environments+1] = str
+ end
+ function metapost.tex.reset()
+ environments = { }
+ end
+ function metapost.tex.get()
+ return concat(environments,"\n")
+ end
+
+end
+
+local graphics = { }
+local start = [[\starttext]]
+local preamble = [[\long\def\MPLIBgraphictext#1{\startTEXpage[scale=10000]#1\stopTEXpage}]]
+local stop = [[\stoptext]]
+
+function metapost.specials.gt(specification,object) -- number, so that we can reorder
+ graphics[#graphics+1] = format("\\MPLIBgraphictext{%s}",specification)
+ metapost.intermediate.needed = true
+ metapost.multipass = true
+ return { }, nil, nil, nil
+end
+
+function metapost.intermediate.actions.makempy()
+ if #graphics > 0 then
+ local externals = metapost.externals
+ externals.n = externals.n + 1
+ starttiming(externals)
+ local mpofile = tex.jobname .. "-mpgraph"
+ local mpyfile = file.replacesuffix(mpofile,"mpy")
+ local pdffile = file.replacesuffix(mpofile,"pdf")
+ local texfile = file.replacesuffix(mpofile,"tex")
+ io.savedata(texfile, { start, preamble, metapost.tex.get(), concat(graphics,"\n"), stop }, "\n")
+ local command = format("context --once %s %s", (tex.interactionmode == 0 and "--batchmode") or "", texfile)
+ os.execute(command)
+ if io.exists(pdffile) then
+ command = format("pstoedit -ssp -dt -f mpost %s %s", pdffile, mpyfile)
+ os.execute(command)
+ local result = { }
+ if io.exists(mpyfile) then
+ local data = io.loaddata(mpyfile)
+ for figure in gmatch(data,"beginfig(.-)endfig") do
+ result[#result+1] = format("begingraphictextfig%sendgraphictextfig ;\n", figure)
+ end
+ io.savedata(mpyfile,concat(result,""))
+ end
+ end
+ stoptiming(externals)
+ graphics = { } -- ?
+ end
+end
diff --git a/tex/context/base/mlib-pps.mkiv b/tex/context/base/mlib-pps.mkiv
new file mode 100644
index 000000000..0a78a8704
--- /dev/null
+++ b/tex/context/base/mlib-pps.mkiv
@@ -0,0 +1,70 @@
+%D \module
+%D [ file=mlib-pps,
+%D version=2008.03.25,
+%D title=\METAPOST\ Integrated Graphics,
+%D subtitle=Basics,
+%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.
+
+\unprotect
+
+\registerctxluafile{mlib-pps}{1.001}
+
+%D Todo: catch nested graphics like external figures with dummies.
+
+% \newtoks\everyMPLIBtext % not yet used
+
+% \appendtoks
+% \let\handleuseMPgraphic \thirdofthreearguments
+% \let\handlereusableMPgraphic\thirdofthreearguments
+% \to \everyMPLIBtext
+
+% this will move !
+
+% Instead of preallocated boxes we now use a table of lists so that we
+% have no limitation. Typically an example of a next version solution
+% due to \LUATEX\ evolving.
+
+\newbox \MPtextbox
+\newtoks\everyMPLIBsettext
+
+\def\MPLIBfigure#1#2#3#4#5#6#7% todo: move Q q to lua
+ {\setbox\scratchbox\hbox{\externalfigure[#7]}%
+ \ctxlua{metapost.edefsxsy(\number\wd\scratchbox,\number\ht\scratchbox,0)}%
+ \pdfliteral direct{q #1 #2 #3 #4 #5 #6 cm}% no direct
+ \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[sx=\sx,sy=\sy]{\box\scratchbox}\hss}}%
+ \pdfliteral direct{Q}}
+
+\def\MPLIBsettext#1% #2%
+ {\dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox}
+
+\def\MPLIBgettextscaled#1#2#3% why a copy
+ {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}%
+ \vbox to \zeropoint{\vss\hbox to \zeropoint{\black\scale[sx=#2,sy=#3]{\raise\dp\MPtextbox\box\MPtextbox}\hss}}}
+
+\def\MPLIBgraphictext#1%
+ {\startTEXpage[\c!scale=10000]#1\stopTEXpage}
+
+\protect \endinput
+
+% \def\MPLIBsettext#1% #2% we could as well store in hlists at the lua end i.e. just one box
+% {\global\setbox#1\hbox}
+%
+% \def\MPLIBfreetext#1%
+% {\global\setbox#1\emptybox}
+%
+% \def\MPLIBgettextscaled#1#2#3% why a copy
+% {\vbox to \zeropoint{\vss\hbox to \zeropoint{\black\scale[sx=#2,sy=#3]{\raise\dp#1\copy#1}\hss}}}
+%
+% \def\MPLIBallocate#1%
+% {\newbox\MPLIBfirst
+% \dorecurse{\numexpr#1-1\relax}{\let\MPLIBlast\relax\newbox\MPLIBlast}%
+% \MPLIBregister}
+%
+% \def\MPLIBregister % after allocate!
+% {\ctxlua{metapost.first_box, metapost.last_box = \number\MPLIBfirst, \number\MPLIBlast}}
diff --git a/tex/context/base/mlib-run.lua b/tex/context/base/mlib-run.lua
new file mode 100644
index 000000000..f352e1db1
--- /dev/null
+++ b/tex/context/base/mlib-run.lua
@@ -0,0 +1,379 @@
+if not modules then modules = { } end modules ['mlib-run'] = {
+ version = 1.001,
+ comment = "companion to mlib-ctx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+--~ cmyk -> done, native
+--~ spot -> done, but needs reworking (simpler)
+--~ multitone ->
+--~ shade -> partly done, todo: cm
+--~ figure -> done
+--~ hyperlink -> low priority, easy
+
+-- new * run
+-- or
+-- new * execute^1 * finish
+
+-- a*[b,c] == b + a * (c-b)
+
+--[[ldx--
+<p>The directional helpers and pen analysis are more or less translated from the
+<l n='c'/> code. It really helps that Taco know that source so well. Taco and I spent
+quite some time on speeding up the <l n='lua'/> and <l n='c'/> code. There is not
+much to gain, especially if one keeps in mind that when integrated in <l n='tex'/>
+only a part of the time is spent in <l n='metapost'/>. Of course an integrated
+approach is way faster than an external <l n='metapost'/> and processing time
+nears zero.</p>
+--ldx]]--
+
+local trace_graphics = false trackers.register("metapost.graphics", function(v) trace_graphics = v end)
+
+local format, gsub, match = string.format, string.gsub, string.match
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+metapost = metapost or { }
+
+metapost.showlog = false
+metapost.lastlog = ""
+
+function metapost.resetlastlog()
+ metapost.lastlog = ""
+end
+
+local function finder(name, mode, ftype)
+ if mode=="w" then
+ return name
+ elseif file.is_qualified_path(name) then
+ return name
+ else
+ return resolvers.find_file(name,ftype)
+ end
+end
+
+metapost.finder = finder
+
+metapost.parameters = {
+ hash_size = 100000,
+ main_memory = 4000000,
+ max_in_open = 50,
+ param_size = 100000,
+}
+
+metapost.exectime = metapost.exectime or { } -- hack
+
+local preamble = [[
+boolean mplib; string mp_parent_version;
+mplib := true;
+mp_parent_version := "%s";
+input %s ; dump ;
+]]
+
+function metapost.make(name, target, version)
+ starttiming(mplib)
+ target = file.replacesuffix(target or name, "mem")
+ local mpx = mplib.new ( table.merged (
+ metapost.parameters,
+ {
+ ini_version = true,
+ find_file = finder,
+ job_name = file.removesuffix(target),
+ }
+ ) )
+ if mpx then
+ starttiming(metapost.exectime)
+ local result = mpx:execute(format(preamble,version or "unknown",name))
+ stoptiming(metapost.exectime)
+ mpx:finish()
+ end
+ stoptiming(mplib)
+end
+
+function metapost.load(name)
+ starttiming(mplib)
+ local mpx = mplib.new ( table.merged (
+ metapost.parameters,
+ {
+ ini_version = false,
+ mem_name = file.replacesuffix(name,"mem"),
+ find_file = finder,
+ -- job_name = "mplib",
+ }
+ ) )
+ local result
+ if not mpx then
+ result = { status = 99, error = "out of memory"}
+ end
+ stoptiming(mplib)
+ return mpx, result
+end
+
+function metapost.unload(mpx)
+ starttiming(mplib)
+ if mpx then
+ mpx:finish()
+ end
+ stoptiming(mplib)
+end
+
+function metapost.reporterror(result)
+ if not result then
+ metapost.report("mp error: no result object returned")
+ elseif result.status > 0 then
+ local t, e, l = result.term, result.error, result.log
+ if t and t ~= "" then
+ metapost.report("mp terminal: %s",t)
+ end
+ if e then
+ metapost.report("mp error: %s",(e=="" and "?") or e)
+ end
+ if not t and not e and l then
+ metapost.lastlog = metapost.lastlog .. "\n" .. l
+ metapost.report("mp log: %s",l)
+ else
+ metapost.report("mp error: unknown, no error, terminal or log messages")
+ end
+ else
+ return false
+ end
+ return true
+end
+
+function metapost.checkformat(mpsinput, mpsformat, dirname)
+ mpsinput = file.addsuffix(mpsinput or "metafun", "mp")
+ mpsformat = file.removesuffix(file.basename(mpsformat or texconfig.formatname or (tex and tex.formatname) or mpsinput))
+ local mpsbase = file.removesuffix(file.basename(mpsinput))
+ if mpsbase ~= mpsformat then
+ mpsformat = mpsformat .. "-" .. mpsbase
+ end
+ mpsformat = file.addsuffix(mpsformat, "mem")
+ local pth = dirname or file.dirname(texconfig.formatname or "")
+ if pth ~= "" then
+ mpsformat = file.join(pth,mpsformat)
+ end
+ local the_version = environment.version or "unset version"
+ if lfs.isfile(mpsformat) then
+ commands.writestatus("mplib","loading '%s' from '%s'", mpsinput, mpsformat)
+ local mpx, result = metapost.load(mpsformat)
+ if mpx then
+ local result = mpx:execute("show mp_parent_version ;")
+ if not result.log then
+ metapost.reporterror(result)
+ else
+ local version = match(result.log,">> *(.-)[\n\r]") or "unknown"
+ version = gsub(version,"[\'\"]","")
+ if version ~= the_version then
+ commands.writestatus("mplib","version mismatch: %s <> %s", version or "unknown", the_version)
+ else
+ return mpx
+ end
+ end
+ else
+ commands.writestatus("mplib","error in loading '%s' from '%s'", mpsinput, mpsformat)
+ metapost.reporterror(result)
+ end
+ end
+ commands.writestatus("mplib","making '%s' into '%s'", mpsinput, mpsformat)
+ metapost.make(mpsinput,mpsformat,the_version) -- somehow return ... fails here
+ if lfs.isfile(mpsformat) then
+ commands.writestatus("mplib","loading '%s' from '%s'", mpsinput, mpsformat)
+ return metapost.load(mpsformat)
+ else
+ commands.writestatus("mplib","problems with '%s' from '%s'", mpsinput, mpsformat)
+ end
+end
+
+local mpxformats = { }
+
+function metapost.format(instance,name)
+ name = name or instance
+ local mpx = mpxformats[instance]
+ if not mpx then
+ commands.writestatus("mplib","initializing instance '%s' using format '%s'",instance,name)
+ mpx = metapost.checkformat(name)
+ mpxformats[instance] = mpx
+ end
+ return mpx
+end
+
+function metapost.reset(mpx)
+ if not mpx then
+ -- nothing
+ elseif type(mpx) == "string" then
+ if mpxformats[mpx] then
+ mpxformats[mpx]:finish()
+ mpxformats[mpx] = nil
+ end
+ else
+ for name, instance in next, mpxformats do
+ if instance == mpx then
+ mpx:finish()
+ mpxformats[name] = nil
+ break
+ end
+ end
+ end
+end
+
+local mp_inp, mp_log, mp_tag = { }, { }, 0
+
+function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, askedfig)
+ local converted, result = false, {}
+ if type(mpx) == "string" then
+ mpx = metapost.format(mpx) -- goody
+ end
+ if mpx and data then
+ starttiming(metapost)
+ if trace_graphics then
+ if not mp_inp[mpx] then
+ mp_tag = mp_tag + 1
+ mp_inp[mpx] = io.open(format("%s-mplib-run-%03i.mp", tex.jobname,mp_tag),"w")
+ mp_log[mpx] = io.open(format("%s-mplib-run-%03i.log",tex.jobname,mp_tag),"w")
+ end
+ local banner = format("%% begin graphic: n=%s, trialrun=%s, multipass=%s, isextrapass=%s\n\n", metapost.n, tostring(trialrun), tostring(multipass), tostring(isextrapass))
+ mp_inp[mpx]:write(banner)
+ mp_log[mpx]:write(banner)
+ end
+ if type(data) == "table" then
+ for i=1,#data do
+ local d = data[i]
+ if d then
+ if trace_graphics then
+ mp_inp[mpx]:write(d)
+ end
+ starttiming(metapost.exectime)
+ result = mpx:execute(d)
+ stoptiming(metapost.exectime)
+ if trace_graphics and result then
+ local str = result.log or result.error
+ if str and str ~= "" then
+ mp_log[mpx]:write(str)
+ end
+ end
+ if not metapost.reporterror(result) then
+ if metapost.showlog then
+ local str = (result.term ~= "" and result.term) or "no terminal output"
+ if not str:is_empty() then
+ metapost.lastlog = metapost.lastlog .. "\n" .. str
+ metapost.report("mp log: %s",str)
+ end
+ end
+ if result.fig then
+ converted = metapost.convert(result, trialrun, flusher, multipass, askedfig)
+ end
+ end
+ else
+ metapost.report("mp error: invalid graphic component %s",i)
+ end
+ end
+ else
+ if trace_graphics then
+ mp_inp:write(data)
+ end
+ starttiming(metapost.exectime)
+ result = mpx[mpx]:execute(data)
+ stoptiming(metapost.exectime)
+ if trace_graphics and result then
+ local str = result.log or result.error
+ if str and str ~= "" then
+ mp_log[mpx]:write(str)
+ end
+ end
+ -- todo: error message
+ if not result then
+ metapost.report("mp error: no result object returned")
+ elseif result.status > 0 then
+ metapost.report("mp error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
+ else
+ if metapost.showlog then
+ metapost.lastlog = metapost.lastlog .. "\n" .. result.term
+ metapost.report("mp info: %s",result.term or "no-term")
+ end
+ if result.fig then
+ converted = metapost.convert(result, trialrun, flusher, multipass, askedfig)
+ end
+ end
+ end
+ if trace_graphics then
+ local banner = "\n% end graphic\n\n"
+ mp_inp[mpx]:write(banner)
+ mp_log[mpx]:write(banner)
+ end
+ stoptiming(metapost)
+ end
+ return converted, result
+end
+
+function metapost.convert()
+ metapost.report('mp warning: no converter set')
+end
+
+function metapost.report(...)
+ logs.report("mplib",...)
+end
+
+-- handy
+
+function metapost.directrun(formatname,filename,outputformat,astable,mpdata)
+ local fullname = file.addsuffix(filename,"mp")
+ local data = mpdata or io.loaddata(fullname)
+ if outputformat ~= "svg" then
+ outputformat = "mps"
+ end
+ if not data then
+ logs.simple("unknown file '%s'",filename or "?")
+ else
+ local mpx = metapost.checkformat(formatname,formatname,caches.setpath("formats"))
+ if not mpx then
+ logs.simple("unknown format '%s'",formatname or "?")
+ else
+ logs.simple("processing '%s'",(mpdata and (filename or "data")) or fullname)
+ local result = mpx:execute(data)
+ if not result then
+ logs.simple("error: no result object returned")
+ elseif result.status > 0 then
+ logs.simple("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
+ else
+ if metapost.showlog then
+ metapost.lastlog = metapost.lastlog .. "\n" .. result.term
+ logs.simple("info: %s",result.term or "no-term")
+ end
+ local figures = result.fig
+ if figures then
+ local sorted = table.sortedkeys(figures)
+ if astable then
+ local result = { }
+ logs.simple("storing %s figures in table",#sorted)
+ for k=1,#sorted do
+ local v = sorted[k]
+ if outputformat == "mps" then
+ result[v] = figures[v]:postscript()
+ else
+ result[v] = figures[v]:svg() -- (3) for prologues
+ end
+ end
+ return result
+ else
+ local basename = file.removesuffix(file.basename(filename))
+ for k=1,#sorted do
+ local v = sorted[k]
+ local output
+ if outputformat == "mps" then
+ output = figures[v]:postscript()
+ else
+ output = figures[v]:svg() -- (3) for prologues
+ end
+ local outname = format("%s-%s.%s",basename,v,outputformat)
+ logs.simple("saving %s bytes in '%s'",#output,outname)
+ io.savedata(outname,output)
+ end
+ return #sorted
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/tex/context/base/mtx-context-arrange.tex b/tex/context/base/mtx-context-arrange.tex
new file mode 100644
index 000000000..73431567d
--- /dev/null
+++ b/tex/context/base/mtx-context-arrange.tex
@@ -0,0 +1,111 @@
+% engine=luatex
+
+%D \module
+%D [ file=mtx-context-arrange,
+%D version=2009.03.21,
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Arrange Files,
+%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.
+
+%D This is a \TEXEXEC\ features that has been moved to \MKIV.
+
+% begin help
+%
+% usage: context --extra=arrange [options] list-of-files
+%
+% --sort : sort filenames first
+% --paperoffset=dimension : left-top-offset
+% --noduplex : singlesided (doublesided is default)
+% --backspace=dimension : extra left offset
+% --topspace=dimension : extra top offset
+% --marking : add cutmarks
+% --addempty=list : add empty pages at/after (comma separated list)
+% --printformat : 2UP, etc
+%
+% end help
+
+\doifdocumentargument {paperoffset} {
+ \definepapersize
+ [offset=\getdocumentargument{paperoffset}]
+}
+
+\doifdocumentargumentelse {noduplex} {yes} {
+ \setuppagenumbering
+ [alternative=doublesided]
+ \setdocumentargument{sided}{doublesided}
+} {
+ \setdocumentargument{sided}{singlesided}
+}
+
+\setdefaultdocumentargument {textwidth} {0cm}
+\setdefaultdocumentargument {backspace} {0cm}
+\setdefaultdocumentargument {topspace} {0cm}
+
+\setuplayout
+ [backspace=\getdocumentargument{backspace},
+ topspace=\getdocumentargument{topspace},
+ width=middle,
+ height=middle,
+ location=middle,
+ header=0pt,
+ footer=0pt]
+
+\doifdocumentargument {marking} {yes} {
+ \setuplayout
+ [marking=on]
+}
+
+\startluacode
+ local printformat = document.arguments.printformat or ""
+ if printformat == "" then
+ printformat = "normal"
+ elseif string.find(printformat,".*up") then
+ printformat = "2UP,\\v!rotated"
+ elseif string.find(printformat,".*down") then
+ printformat = "2DOWN,\\v!rotated"
+ elseif string.find(printformat,".*side") then
+ printformat = "2SIDE,\\v!rotated"
+ end
+ document.setargument("printformat",printformat)
+\stopluacode
+
+\setuparranging
+ [\getdocumentargument{sided},
+ \getdocumentargument{printformat}]
+
+\starttext
+
+\startluacode
+ local format = string.format
+ local fprint = function(...) tex.sprint(tex.ctxcatcodes,format(...)) end
+
+ if #document.files > 0 then
+ if document.arguments.sort then
+ table.sort(document.files)
+ end
+ local emptypages = document.arguments.addempty or ""
+ local textwidth = document.arguments.textwidth or "0cm"
+ for _, filename in ipairs(document.files) do
+ if not string.find(filename,"^mtx%-context%-") then
+ context.insertpages (
+ { filename },
+ { emptypages },
+ { width = textwidth }
+ )
+ end
+ end
+ else
+ fprint("no files given")
+ end
+\stopluacode
+
+\stoptext
+
+
+
diff --git a/tex/context/base/mtx-context-combine.tex b/tex/context/base/mtx-context-combine.tex
new file mode 100644
index 000000000..8a861ab83
--- /dev/null
+++ b/tex/context/base/mtx-context-combine.tex
@@ -0,0 +1,116 @@
+%D \module
+%D [ file=mtx-context-combine,
+%D version=2009.03.21,
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Combine Files,
+%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.
+
+%D This is a \TEXEXEC\ features that has been moved to \MKIV.
+
+% begin help
+%
+% usage: context --extra=combine [options] list-of-files
+%
+% --sort : sort filenames first
+% --paperoffset=dimension : left-top-offset
+% --nobanner : no footer etc
+% --combination : h*v or hxv
+% --paperformat=spec : paper*print or paperxprint
+% --nobanner : no footerlines
+% --bannerheight=dimension : height of banner
+% --bannerstring=dimension : height of bannerstring
+%
+% end help
+
+\input mtx-context-common.tex
+
+\doifdocumentargumentelse {paperoffset} {
+
+ \setuplayout
+ [topspace=\getdocumentargument{paperoffset},
+ backspace=\getdocumentargument{paperoffset}]
+
+} {
+
+ \setuplayout
+ [topspace=0pt,
+ backspace=0pt]
+
+}
+
+\setuplayout
+ [header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setuppapersize
+ [\getdocumentargument{paperformat_paper}]
+ [\getdocumentargument{paperformat_print}]
+
+\doifnotdocumentargument {bannerheight} {
+ \setuplayout
+ [footer=1cm]
+}
+
+\doifelse {\getdocumentargument{nobanner}} {yes} {
+ \setuplayout
+ [footer=0cm]
+ \setupbackgrounds
+ [page]
+ [background=]
+} {
+ \definelayer
+ [page]
+ [width=\paperwidth,
+ height=\paperheight]
+
+ \setupbackgrounds
+ [page]
+ [background=page]
+}
+
+\setupexternalfigures
+ [directory=]
+
+\starttext
+
+\startluacode
+ local format = string.format
+
+ if #document.files > 0 then
+ if document.arguments["sort"] then
+ table.sort(document.files)
+ end
+ local dobanner = not document.arguments["nobanner"]
+ local bannerheight = document.arguments["bannerheight"]
+ local nx = document.arguments.combination_nx or 2
+ local ny = document.arguments.combination_ny or 2
+ for _, filename in ipairs(document.files) do
+ if not string.find(filename,"^mtx%-context%-") then
+ -- could be a macro
+ local bannerstring = format("\\tttf\\detokenize{%s}\\quad\\quad\\currentdate\\quad\\quad\\pagenumber",file.basename(filename))
+ if dobanner then
+ if bannerheight then
+ context("\\setuptexttexts[{\\setlayerframed[page][preset=middlebottom][frame=off,height=%s]{%s}}]",bannerheight,bannerstring)
+ else
+ context("\\setupfootertexts[{%s}]",bannerstring)
+ end
+ end
+ context("\\combinepages[%s][nx=%s,ny=%s]",filename,nx,ny)
+ context("\\page")
+ end
+ end
+ else
+ context("no files given")
+ end
+\stopluacode
+
+\stoptext
+
diff --git a/tex/context/base/mtx-context-common.tex b/tex/context/base/mtx-context-common.tex
new file mode 100644
index 000000000..8327dd28d
--- /dev/null
+++ b/tex/context/base/mtx-context-common.tex
@@ -0,0 +1,43 @@
+%D \module
+%D [ file=mtx-context-common,
+%D version=2009.03.21,
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Common Stuff,
+%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.
+
+\startluacode
+ local combination = document.arguments['combination'] or '2*2'
+ local nx, ny = string.match(combination,"^(%d+)%s*[%*x]%s*(%d+)$")
+ if not nx then
+ nx, ny = 2, 2
+ elseif not ny then
+ nx = tonumber(combination) or 2
+ ny = nx
+ else
+ nx = tonumber(nx) or 2
+ ny = tonumber(ny) or nx or 2
+ end
+ document.setargument("combination_nx",nx)
+ document.setargument("combination_ny",ny)
+\stopluacode
+
+\startluacode
+ local paperformat = document.arguments['paperformat'] or 'A4*A4'
+ paperformat = string.upper(paperformat)
+ local f, t = string.match(paperformat,"^(.-)%s*[%*xX]%s*(.-)$")
+ if not f then
+ f, t = "A4", "A4"
+ elseif not t then
+ t = f
+ end
+ document.setargument("paperformat_paper",f)
+ document.setargument("paperformat_print",t)
+\stopluacode
+
+\endinput
diff --git a/tex/context/base/mtx-context-ideas.tex b/tex/context/base/mtx-context-ideas.tex
new file mode 100644
index 000000000..24d11a5b5
--- /dev/null
+++ b/tex/context/base/mtx-context-ideas.tex
@@ -0,0 +1,52 @@
+%D \module
+%D [ file=mtx-context-ideas,
+%D version=2009.03.21,
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Placeholder File,
+%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.
+
+% The hard coded goodies in texexec are now external. We also use this
+% opportunity to explore mixed tex/lua user interfacing so you will see
+% some old and new tricks here that might disappear or become extended.
+%
+% if users want to add their own ... go ahead but use a different
+% namespace:
+%
+% mtx-context-third-somename.tex
+% mtx-context-user-somename.tex
+
+% \startluacode
+% -- some day we might move the whole ui to lua
+% context = context or { }
+% function interfaces.tosetups(setups)
+% if not setups then
+% return ""
+% elseif type(setups) == "table" then
+% local t = { }
+% for k,v in next, setups do
+% t[k] = "{" .. v .. "}"
+% end
+% return table.concat(t,",")
+% else
+% return setups
+% end
+% end
+% function context.setuplayout(category,setups)
+% setups = setups or category
+% tex.sprint(string.format("\\setuplayout[%s]",interfaces.tosetups(setups))
+% end
+% local topspace = document.arguments["topspace"] or 0
+% if dimen(topspace) > dimen(0) then
+% context.setuplayout { topspace = dimen(topspace) }
+% end
+% local backspace = document.arguments["backspace"] or 0
+% if dimen(topspace) > dimen(0) then
+% context.setuplayout { backspace = dimen(backspace) }
+% end
+% \stopluacode
diff --git a/tex/context/base/mtx-context-listing.tex b/tex/context/base/mtx-context-listing.tex
new file mode 100644
index 000000000..d0dbcbba0
--- /dev/null
+++ b/tex/context/base/mtx-context-listing.tex
@@ -0,0 +1,100 @@
+%D \module
+%D [ file=mtx-context-listing,
+%D version=2008.11.10, % about that time i started playing with this
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Listing Files,
+%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.
+
+%D This is a \TEXEXEC\ features that has been moved to \MKIV.
+
+% begin help
+%
+% usage: context --extra=listing [options] list-of-files
+%
+% --sort : sort filenames first
+% --topspace=dimension : distance above first line
+% --backspace=dimension : distance before left margin
+% --pretty : pretty print comform suffix (temporarily disabled)
+% --bodyfont=list : additional bodyfont settings
+% --paperformat=spec : paper*print or paperxprint
+%
+% end help
+
+\input mtx-context-common.tex
+
+\setupbodyfont
+ [11pt,tt,\getdocumentargument{bodyfont}]
+
+\setuptyping
+ [lines=yes]
+
+\setuplayout
+ [header=0cm,
+ footer=1.5cm,
+ topspace=\getdocumentargumentdefault{topspace}{1.5cm},
+ backspace=\getdocumentargumentdefault{backspace}{1.5cm},
+ width=middle,
+ height=middle]
+
+\setuppapersize
+ [\getdocumentargument{paperformat_paper}]
+ [\getdocumentargument{paperformat_print}]
+
+% \startluacode
+% -- syntax check
+% local topspace = dimen(document.arguments.topspace or 0)
+% local backspace = dimen(document.arguments.backspace or 0)
+% local zeropoint = dimen(0)
+% if topspace > zeropoint then
+% context.setuplayout { topspace = tostring(topspace) }
+% end
+% if backspace > zeropoint then
+% context.setuplayout { backspace = tostring(backspace) }
+% end
+% \stopluacode
+
+\starttext
+
+\startluacode
+ local types = {
+ mkiv = "tex",
+ mkii = "tex",
+ cld = "lua",
+ lfg = "lua",
+ }
+
+ if #document.files > 0 then
+ if document.arguments.sort then
+ table.sort(document.files)
+ end
+ for _, filename in ipairs(document.files) do
+ if not string.find(filename,"^mtx%-context%-") then
+ local pretty = document.arguments.pretty
+ if pretty == true then
+ pretty = file.extname(filename) or ""
+ elseif pretty == false then
+ pretty = ""
+ else
+ -- forced
+ end
+ context.page()
+ context.setupfootertexts( -- return true: we need to keep this entry
+ { function() context.detokenize(file.basename(filename)) return true end },
+ { function() context.pagenumber() return true end }
+ )
+ context.setuptyping { option = types[pretty] or pretty }
+ context.typefile(filename)
+ end
+ end
+ else
+ context("no files given")
+ end
+\stopluacode
+
+\stoptext
diff --git a/tex/context/base/mtx-context-timing.tex b/tex/context/base/mtx-context-timing.tex
new file mode 100644
index 000000000..b788d4b63
--- /dev/null
+++ b/tex/context/base/mtx-context-timing.tex
@@ -0,0 +1,44 @@
+%D \module
+%D [ file=mtx-context-timing,
+%D version=2009.03.21,
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Timing Runs,
+%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.
+
+% begin help
+%
+% usage: context --extra=timing filename
+%
+% end help
+
+\enablemode[no-timing] \usemodule[timing]
+
+\setuplayout
+ [topspace=1cm,
+ bottomspace=.5cm,
+ header=0pt,
+ width=middle,
+ height=middle,
+ style=\tt]
+
+\setupfootertexts
+ [\getdocumentfilename{1}-luatex-progress.lut -- \pagenumber]
+
+\setupcolors
+ [state=start]
+
+\starttext
+
+ \doifsomething {\getdocumentfilename{1}} {
+ \LoadUsage{\getdocumentfilename{1}-luatex-progress}
+ \ShowUsage{\getdocumentfilename{1}-luatex-progress}
+ }
+
+\stoptext
+
diff --git a/tex/context/base/mult-chk.lua b/tex/context/base/mult-chk.lua
new file mode 100644
index 000000000..bdbd1dd22
--- /dev/null
+++ b/tex/context/base/mult-chk.lua
@@ -0,0 +1,66 @@
+if not modules then modules = { } end modules ['mult-chk'] = {
+ version = 1.001,
+ comment = "companion to mult-chk.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+local lpegmatch = lpeg.match
+local type = type
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+interfaces = interfaces or { }
+
+interfaces.syntax = {
+ test = { keys = table.tohash { "a","b","c","d","e","f","g" } }
+}
+
+function interfaces.invalidkey(kind,key)
+ commands.writestatus("syntax","invalid key '%s' for '%s' in line %s",key,kind,tex.inputlineno)
+end
+
+function interfaces.setvalidkeys(kind,list)
+ local s = interfaces.syntax[kind]
+ if not s then
+ interfaces.syntax[kind] = {
+ keys = aux.settings_to_set(list)
+ }
+ else
+ s.keys = aux.settings_to_set(list)
+ end
+end
+
+function interfaces.addvalidkeys(kind,list)
+ local s = interfaces.syntax[kind]
+ if not s then
+ interfaces.syntax[kind] = {
+ keys = aux.settings_to_set(list)
+ }
+ else
+ aux.settings_to_set(list,s.keys)
+ end
+end
+
+local prefix, kind, keys
+
+local function set(key,value)
+ if keys and not keys[key] then
+ interfaces.invalidkey(kind,key)
+ else
+ texsprint(ctxcatcodes,format("\\setsomevalue{%s}{%s}{%s}",prefix,key,value))
+ end
+end
+
+local pattern = aux.make_settings_to_hash_pattern(set,"tolerant")
+
+function commands.getcheckedparameters(k,p,s)
+ if s and s ~= "" then
+ prefix, kind = p, k
+ keys = k and k ~= "" and interfaces.syntax[k].keys
+ lpegmatch(pattern,s)
+ end
+end
+
+_gcp_ = commands.getcheckedparameters
diff --git a/tex/context/base/mult-chk.mkii b/tex/context/base/mult-chk.mkii
new file mode 100644
index 000000000..60f568a1e
--- /dev/null
+++ b/tex/context/base/mult-chk.mkii
@@ -0,0 +1,29 @@
+%D \module
+%D [ file=mult-chk,
+%D version=2009.04.13,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Checking,
+%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}{ConTeXt Multilingual Macros / Checking}
+
+%D No checking in \MKII.
+
+\def\gobbleparameters{\doquadrupleempty\dogobbleparameters} % todo: 1,2,3,4 case
+\def\dogobbleparameters[#1][#2][#3][#4]{}
+
+\def\setvalidparameterkeys{\gobbleparameters} % forward reference, so no \let
+\def\addvalidparameterkeys{\gobbleparameters} % forward reference, so no \let
+
+\let\enablecheckparameters \relax
+\let\disablecheckparameters\relax
+
+\def\getcheckedparameters[#1]{\getparameters} % just ignore the checking
+
+\endinput
diff --git a/tex/context/base/mult-chk.mkiv b/tex/context/base/mult-chk.mkiv
new file mode 100644
index 000000000..7b40bd64a
--- /dev/null
+++ b/tex/context/base/mult-chk.mkiv
@@ -0,0 +1,103 @@
+%D \module
+%D [ file=mult-chk,
+%D version=2009.04.13,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Checking,
+%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}{ConTeXt Multilingual Macros / Checking}
+
+%D This is very experimental code that eventually might be used
+%D once we have split the whole code base.
+
+%D \startbuffer
+%D \getcheckedparameters[MyTest][MyNamespace][a=1,b=2,c=3,d=4,crap=whatever]
+%D
+%D \MyNamespacea\quad
+%D \MyNamespaceb\quad
+%D \MyNamespacec\quad
+%D \MyNamespaced\quad
+%D crap is \ifdefined\MyNamespacecrap\else un\fi defined
+%D \stopbuffer
+%D
+%D \enablecheckparameters
+%D
+%D \setvalidparameterkeys[MyTest][a,b,c,d] \getbuffer \par
+%D \addvalidparameterkeys[MyTest][crap] \getbuffer \par
+
+\unprotect
+
+\registerctxluafile{mult-chk}{1.001}
+
+\def\setvalidparameterkeys{\dodoubleargument\dosetvalidparameterkeys}
+\def\addvalidparameterkeys{\dodoubleargument\doaddvalidparameterkeys}
+
+\def\dosetvalidparameterkeys[#1][#2]{\ctxlua{interfaces.setvalidkeys("#1",\!!bs#2\!!es)}}
+\def\doaddvalidparameterkeys[#1][#2]{\ctxlua{interfaces.addvalidkeys("#1",\!!bs#2\!!es)}}
+
+\def\getcheckedparametersyes[#1]#2[#3]#4[#5%
+ {\if\noexpand#5]%
+ \expandafter\gobblethreearguments
+ \else
+ \let\setsomevalue\dosetvalue
+ \expandafter\dogetcheckedparametersyes
+ \fi{#1}{#3}#5}
+
+\def\dogetcheckedparametersyes#1#2#3]%
+ {\ctxlua{_gcp_("#1","#2",\!!bs\detokenize{#3}\!!es)}}
+
+\def\getcheckedparametersnop[#1]#2[#3]#4[#5%
+ {\if\noexpand#5]%
+ \expandafter\gobbletwoarguments
+ \else
+ \let\setsomevalue\dosetvalue
+ \expandafter\dogetcheckedparametersnop
+ \fi{#3}#5}
+
+\def\dogetcheckedparametersnop#1#2]%
+ {\def\p!dogetparameter{\p!doassign#1}%
+ \xprocesscommaitem#2,],\@relax@}
+
+\def\disablecheckparameters{\let\getcheckedparameters\getcheckedparametersnop}
+\def\enablecheckparameters {\let\getcheckedparameters\getcheckedparametersyes}
+
+\disablecheckparameters
+
+\protect \endinput
+
+\starttext
+
+\testfeatureonce{10000}{\getcheckedparameters[test][xx][a=b,c= d, e = f]} % 0.20 seconds
+
+\enablecheckparameters
+
+\testfeatureonce{10000}{\getcheckedparameters[test][xx][a=b,c= d, e = f]} % 0.35 seconds
+
+\getcheckedparameters[test][xx][a=a]
+\getcheckedparameters[test][xx][b= b]
+\getcheckedparameters[test][xx][c = c]
+\getcheckedparameters[test][xx][d = d d , e = e ,f = f ]
+\getcheckedparameters[test][xx][g={oeps {oeps}}]
+\getcheckedparameters[test][xx][crap=whatever]
+
+\startlines
+[a:\getvalue{xxa}][a]
+[b:\getvalue{xxb}][b]
+[c:\getvalue{xxc}][c]
+[d:\getvalue{xxd}][d d ]
+[e:\getvalue{xxe}][e ]
+[f:\getvalue{xxf}][f ]
+[g:\getvalue{xxg}][\detokenize\expandafter{\xxg}]
+\stoplines
+
+\setvalidparameterkeys[test][crap]
+
+\getcheckedparameters[test][xx][crap=whatever]
+
+\stoptext
diff --git a/tex/context/base/mult-cld.lua b/tex/context/base/mult-cld.lua
new file mode 100644
index 000000000..81038b68b
--- /dev/null
+++ b/tex/context/base/mult-cld.lua
@@ -0,0 +1,212 @@
+if not modules then modules = { } end modules ['mult-cld'] = {
+ version = 1.001,
+ comment = "companion to mult-cld.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This is an experiment: generating context code at the lua end. After all
+-- it is surprisingly simple to implement due to metatables. I was wondering
+-- if there was a more natural way to deal with commands at the lua end.
+-- Of course it's a bit slower but often more readable when mixed with lua
+-- code. It can also be handy when generating documents from databases or
+-- when constructing large tables or so.
+--
+-- Todo: optional checking against interface
+-- Todo: coroutine trickery
+
+context = context or { }
+
+local format, concat = string.format, table.concat
+local next, type = next, type
+local texsprint, texiowrite, ctxcatcodes = tex.sprint, texio.write, tex.ctxcatcodes
+
+local flush = texsprint or function(cct,...) print(table.concat{...}) end
+
+local _stack_, _n_ = { }, 0
+
+local function _store_(ti)
+ _n_ = _n_ + 1
+ _stack_[_n_] = ti
+ return _n_
+end
+
+local function _flush_(n)
+ if not _stack_[n]() then
+ _stack_[n] = nil
+ else
+ -- keep, beware, that way the stack can grow
+ end
+end
+
+context._stack_ = _stack_
+context._store_ = _store_
+context._flush_ = _flush_
+
+function tex.fprint(...) -- goodie
+ texsprint(ctxcatcodes,format(...))
+end
+
+function context.trace(intercept)
+ local normalflush = flush
+ flush = function(c,...)
+ logs.report("context",concat({...}))
+ if not intercept then
+ normalflush(c,...)
+ end
+ end
+ context.trace = function() end
+end
+
+trackers.register("context.flush", function(v) if v then context.trace() end end)
+trackers.register("context.intercept", function(v) if v then context.trace(true) end end)
+
+local function writer(k,...)
+ if k then
+ flush(ctxcatcodes,k)
+ local t = { ... }
+ local nt = #t
+ if nt > 0 then
+ for i=1,nt do
+ local ti = t[i]
+ local typ = type(ti)
+ if ti == nil then
+ -- next
+ elseif typ == "function" then
+ flush(ctxcatcodes,"{\\mkivflush{" .. _store_(ti) .. "}}")
+ elseif typ == "string" or typ == "number" then
+ flush(ctxcatcodes,"{",ti,"}")
+ elseif typ == "table" then
+ local tn = #ti
+ if tn > 0 then
+ for j=1,tn do
+ local tj = ti[j]
+ if type(tj) == "function" then
+ ti[j] = "\\mkivflush{" .. _store_(tj) .. "}"
+ end
+ end
+ flush(ctxcatcodes,"[",concat(ti,","),"]")
+ else
+ flush(ctxcatcodes,"[")
+ local done = false
+ for k, v in next, ti do
+ if done then
+ flush(ctxcatcodes,",",k,'=',v)
+ else
+ flush(ctxcatcodes,k,'=',v)
+ done = true
+ end
+ end
+ flush(ctxcatcodes,"]")
+ end
+ -- elseif typ == "boolean" then
+ -- flush(ctxcatcodes,"\n")
+ elseif ti == true then
+ flush(ctxcatcodes,"\n")
+ elseif typ == false then
+ -- if force == "direct" then
+ flush(ctxcatcodes,tostring(ti))
+ -- end
+ elseif typ == "thread" then
+ logs.report("interfaces","coroutines not supported as we cannot yeild across boundaries")
+ else
+ logs.report("interfaces","error: %s gets a weird argument %s",k,tostring(ti))
+ end
+ end
+ end
+ end
+end
+
+-- -- --
+
+local function indexer(t,k)
+ local c = "\\" .. k .. " "
+ local f = function(...) return writer(c,...) end
+ t[k] = f
+ return f
+end
+
+local function caller(t,f,a,...)
+ if a then
+ flush(ctxcatcodes,format(f,a,...))
+ elseif type(f) == "function" then
+ flush(ctxcatcodes,"{\\mkivflush{" .. _store_(f) .. "}}")
+ elseif f then
+ flush(ctxcatcodes,f)
+ else
+ flush(ctxcatcodes,"\n")
+ end
+end
+
+setmetatable(context, { __index = indexer, __call = caller } )
+
+-- the only non macro:
+
+local trace_cld = false
+
+function context.runfile(filename)
+ filename = resolvers.findtexfile(filename) or ""
+ if filename ~= "" then
+ local ok = dofile(filename)
+ if type(ok) == "function" then
+ if trace_cld then
+ commands.writestatus("cld","begin of file '%s' (function call)",filename)
+ end
+ ok()
+ if trace_cld then
+ commands.writestatus("cld","end of file '%s' (function call)",filename)
+ end
+ elseif ok then
+ commands.writestatus("cld","file '%s' is processed and returns true",filename)
+ else
+ commands.writestatus("cld","file '%s' is processed and returns nothing",filename)
+ end
+ else
+ commands.writestatus("cld","unknown file '%s'",filename)
+ end
+end
+
+-- tracking is using the regular mechanism; we need to define
+-- these 'macro' functions explictly as otherwise they are are
+-- delayed (as all commands print back to tex, so that tracing
+-- would be enabled afterwards)
+
+trackers.register("cld.print", function(v)
+ trace_cld = v
+ if v then
+ flush = function(c,...)
+ texiowrite(...)
+ texsprint(c,...)
+ end
+ else
+ flush = texsprint
+ end
+end)
+
+function context.enabletrackers (str) trackers.enable (str) end
+function context.disabletrackers(str) trackers.disable(str) end
+
+-- see demo-cld.cld for an example
+
+-- context.starttext(true)
+-- context.chapter({ "label" }, "title", true)
+-- context.chapter(function() return { "label" } end, "title", true)
+--
+-- context.startchapter({ title = "test" }, { more = "oeps" }, true)
+--
+-- context.bTABLE(true)
+-- for i=1,10 do
+-- context.bTR()
+-- for i=1,10 do
+-- context.bTD()
+-- context("%#2i",math.random(99))
+-- context.eTD()
+-- end
+-- context.eTR(true)
+-- end
+-- context.eTABLE(true)
+--
+-- context.stopchapter(true)
+--
+-- context.stoptext(true)
diff --git a/tex/context/base/mult-cld.mkiv b/tex/context/base/mult-cld.mkiv
new file mode 100644
index 000000000..1c5ebd34a
--- /dev/null
+++ b/tex/context/base/mult-cld.mkiv
@@ -0,0 +1,29 @@
+%D \module
+%D [ file=mult-ini,
+%D version=2008.10.22, % 1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is just an idea, maybe a bad one.
+
+\writestatus{loading}{ConTeXt Multilingual Macros / Lua}
+
+\registerctxluafile{mult-cld}{1.001}
+\registerctxluafile{mult-clm}{1.001}
+
+\unprotect
+
+\def\defmkivstart#1{\unexpanded\expandafter\def\csname\e!start#1\endcsname}
+\def\defmkivstop #1{\unexpanded\def\csname\e!stop #1\endcsname}
+\def\defmkiv #1{\unexpanded\def\csname #1\endcsname}
+
+\def\mkivflush #1{\ctxlua{context._flush_(#1)}}
+
+\protect \endinput
diff --git a/tex/context/base/mult-clm.lua b/tex/context/base/mult-clm.lua
new file mode 100644
index 000000000..8838ea532
--- /dev/null
+++ b/tex/context/base/mult-clm.lua
@@ -0,0 +1,184 @@
+if not modules then modules = { } end modules ['mult-clm'] = {
+ version = 1.001,
+ comment = "companion to mult-clm.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- another experiment
+-- todo: multilingual
+
+local texsprint, ctxcatcodes, vrbcatcodes = tex.sprint, tex.ctxcatcodes, tex.vrbcatcodes
+local format, insert, remove, concat = string.format, table.insert, table.remove, table.concat
+local unpack = unpack or table.unpack
+
+local trace_define = false trackers.register("context.define", function(v) trace_define = v end)
+
+mkiv = mkiv or { }
+
+mkiv.h, mkiv.a = aux.settings_to_hash, aux.settings_to_array
+
+local starters, stoppers, macros, stack = { }, { }, { }, { }
+
+local checkers = {
+ "\\dosingleempty",
+ "\\dodoubleempty",
+ "\\dotripleempty",
+ "\\doquadrupleempty",
+ "\\doquintupleempty",
+ "\\dosixtupleempty",
+}
+
+function mkiv.m(name,...)
+ macros[name](...)
+end
+
+function mkiv.b(name,...)
+ local sn = stack[name]
+ insert(sn,{...})
+ starters[name](...)
+end
+
+function mkiv.e(name)
+ local sn = stack[name]
+ local sv = remove(sn)
+ if sv then
+ stoppers[name](unpack(sv))
+ else
+ -- nesting error
+ end
+end
+
+mkiv.n = tonumber
+
+function mkiv.define(name,specification) -- name is optional
+ if type(name) == "table" then
+ specification = name
+ name = specification.name
+ end
+ if name and specification then
+ local arguments = specification.arguments
+ local na = (arguments and #arguments) or 0
+ local environment = specification.environment
+ if na == 0 then
+ if environment then
+ texsprint(ctxcatcodes,"\\defmkstart{",name,"}{\\ctxlua{mkiv.b('",name,"')}}")
+ texsprint(ctxcatcodes,"\\defmkstop{", name,"}{\\ctxlua{mkiv.b('",name,"')}}")
+ else
+ texsprint(ctxcatcodes,"\\defmkiv{", name,"}{\\ctxlua{mkiv.m('",name,"')}}")
+ end
+ else
+ stack[name] = { }
+ local opt, done = 0, false
+ local mkivdo = "\\mkivdo" .. name
+ texsprint(ctxcatcodes,"\\def",mkivdo)
+ for i=1,na do
+ local a = arguments[i]
+ local kind = a[1]
+ if kind == "option" then
+ texsprint(ctxcatcodes,"[#",i,"]")
+ if not done then
+ opt = opt + 1
+ end
+ else
+ done = true -- no more optional checking after this
+ texsprint(ctxcatcodes,"#",i)
+ end
+ end
+ if environment then
+ texsprint(ctxcatcodes,"{\\ctxlua{mkiv.b('",name,"'")
+ else
+ texsprint(ctxcatcodes,"{\\ctxlua{mkiv.m('",name,"'")
+ end
+ for i=1,na do
+ local a = arguments[i]
+ local kind = a[2]
+ if kind == "list" then
+ texsprint(ctxcatcodes,",mkiv.a([[#",i,"]])")
+ elseif kind == "hash" then
+ texsprint(ctxcatcodes,",mkiv.h([[#",i,"]])")
+ elseif kind == "number" then
+ texsprint(ctxcatcodes,",mkiv.n([[#",i,"]])")
+ else
+ texsprint(ctxcatcodes,",[[#",i,"]]")
+ end
+ end
+ texsprint(ctxcatcodes,")}}")
+ if environment then
+ texsprint(ctxcatcodes,"\\defmkivstop{" ,name,"}{\\ctxlua{mkiv.e('",name,"')}}")
+ texsprint(ctxcatcodes,"\\defmkivstart{",name,"}{",checkers[opt],mkivdo,"}")
+ else
+ texsprint(ctxcatcodes,"\\defmkiv{", name,"}{",checkers[opt],mkivdo,"}")
+ end
+ end
+ if environment then
+ starters[name] = specification.starter
+ stoppers[name] = specification.stopper
+ else
+ macros[name] = specification.macro
+ end
+ end
+end
+
+function mkiv.tolist(t)
+ local r = { }
+ for i=1,#t do
+ r[i] = t[i]
+ end
+ for k,v in table.sortedhash(t) do
+ if type(k) ~= "number" then
+ r[#r+1] = k .. "=" .. v
+ end
+ end
+ return concat(r,", ")
+end
+
+--~ \startluacode
+--~ function test(opt_1, opt_2, arg_1)
+--~ context.startnarrower()
+--~ context("options 1: %s",mkiv.tolist(opt_1))
+--~ context.par()
+--~ context("options 2: %s",mkiv.tolist(opt_2))
+--~ context.par()
+--~ context("argument 1: %s",arg_1)
+--~ context.stopnarrower()
+--~ end
+
+--~ mkiv.define {
+--~ name = "test",
+--~ arguments = {
+--~ { "option", "list" },
+--~ { "option", "hash" },
+--~ { "content", "string" },
+--~ },
+--~ macro = test,
+--~ }
+--~ \stopluacode
+
+--~ test: \test[1][a=3]{whatever}
+
+--~ \startluacode
+--~ local function startmore(opt_1)
+--~ context.startnarrower()
+--~ context("start more, options: %s",mkiv.tolist(opt_1))
+--~ context.startnarrower()
+--~ end
+
+--~ local function stopmore(opt_1)
+--~ context.stopnarrower()
+--~ context("stop more, options: %s",mkiv.tolist(opt_1))
+--~ context.stopnarrower()
+--~ end
+
+--~ mkiv.define ( "more", {
+--~ environment = true,
+--~ arguments = {
+--~ { "option", "list" },
+--~ },
+--~ starter = startmore,
+--~ stopper = stopmore,
+--~ } )
+--~ \stopluacode
+
+--~ more: \startmore[1] one \startmore[2] two \stopmore one \stopmore
diff --git a/tex/context/base/mult-com.tex b/tex/context/base/mult-com.tex
new file mode 100644
index 000000000..118616837
--- /dev/null
+++ b/tex/context/base/mult-com.tex
@@ -0,0 +1,31 @@
+%D \module
+%D [ file=mult-com,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
+%C details.
+
+%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
new file mode 100644
index 000000000..62e97d567
--- /dev/null
+++ b/tex/context/base/mult-con.tex
@@ -0,0 +1,53 @@
+%D \module
+%D [ file=mult-con,
+%D version=2000.09.12,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Constants,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file has been replaced by \type {mult-def.lua} from which we
+%D generate separate interface definition files.
+
+% obsolete:
+%
+%
+% \startvariables dutch english
+% german czech
+% italian romanian
+% french
+%
+% one: een one
+% eins jedna
+% uno unu
+% un
+% \stopvariables
+%
+% \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..f6f4f3bf9
--- /dev/null
+++ b/tex/context/base/mult-de.tex
@@ -0,0 +1,1693 @@
+% 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{answerarea}{answerarea}
+\setinterfacevariable{appendices}{anhaenge}
+\setinterfacevariable{appendix}{anhang}
+\setinterfacevariable{april}{April}
+\setinterfacevariable{atmargin}{amrand}
+\setinterfacevariable{atpage}{aufseite}
+\setinterfacevariable{august}{August}
+\setinterfacevariable{author}{autor}
+\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{bbl}{bbl}
+\setinterfacevariable{before}{vor}
+\setinterfacevariable{begin}{begin}
+\setinterfacevariable{bib}{bib}
+\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{cite}{cite}
+\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{down}{down}
+\setinterfacevariable{each}{jede}
+\setinterfacevariable{edge}{kante}
+\setinterfacevariable{empty}{leer}
+\setinterfacevariable{end}{end}
+\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{layer}{layer}
+\setinterfacevariable{left}{links}
+\setinterfacevariable{leftedge}{linkekante}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{linkerrand}
+\setinterfacevariable{leftpage}{linkerseite}
+\setinterfacevariable{lefttoright}{lefttoright}
+\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{maxdepth}{maxdepth}
+\setinterfacevariable{maxheight}{maxheight}
+\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{may}{Mai}
+\setinterfacevariable{mediaeval}{mittelalterlich}
+\setinterfacevariable{medium}{mittel}
+\setinterfacevariable{middle}{mittig}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{mindepth}{mindepth}
+\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{note}{note}
+\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{overbar}{ueberstrichen}
+\setinterfacevariable{overbars}{ueberstreichen}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{overstrike}{durchgestrichen}
+\setinterfacevariable{overstrikes}{durchstreichen}
+\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{righttoleft}{righttoleft}
+\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{short}{kurz}
+\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{starter}{starter}
+\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{subsubsubsubsubsubsection}{unterunterunterunterunterunterabsatz}
+\setinterfacevariable{subsubsubsubsubsubsubject}{unterunterunterunterunterunterthema}
+\setinterfacevariable{subsubsubsubsubsubsubsection}{unterunterunterunterunterunterunterabsatz}
+\setinterfacevariable{subsubsubsubsubsubsubsubject}{unterunterunterunterunterunterunterthema}
+\setinterfacevariable{subsubsubsubsubsubsubsubsection}{unterunterunterunterunterunterunterunterabsatz}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubject}{unterunterunterunterunterunterunterunterthema}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsection}{unterunterunterunterunterunterunterunterunterabsatz}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsubject}{unterunterunterunterunterunterunterunterunterthema}
+\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{underbar}{unterstrichen}
+\setinterfacevariable{underbars}{unterstreichen}
+\setinterfacevariable{unit}{einheit}
+\setinterfacevariable{units}{einheiten}
+\setinterfacevariable{unknown}{unbekannt}
+\setinterfacevariable{unpacked}{ungepackt}
+\setinterfacevariable{up}{up}
+\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{alignsymbol}{alignsymbol}
+\setinterfaceconstant{aligntitle}{titelausrichten}
+\setinterfaceconstant{alternative}{alternative}
+\setinterfaceconstant{andtext}{andtext}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{pfeil}
+\setinterfaceconstant{artauthor}{artauthor}
+\setinterfaceconstant{artauthoretaldisplay}{artauthoretaldisplay}
+\setinterfaceconstant{artauthoretallimit}{artauthoretallimit}
+\setinterfaceconstant{artauthoretaltext}{artauthoretaltext}
+\setinterfaceconstant{at}{bei}
+\setinterfaceconstant{author}{autor}
+\setinterfaceconstant{authoretaldisplay}{authoretaldisplay}
+\setinterfaceconstant{authoretallimit}{authoretallimit}
+\setinterfaceconstant{authoretaltext}{authoretaltext}
+\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{bottomafter}{bottomafter}
+\setinterfaceconstant{bottombefore}{bottombefore}
+\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{connector}{connector}
+\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{database}{database}
+\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{editor}{editor}
+\setinterfaceconstant{editoretaldisplay}{editoretaldisplay}
+\setinterfaceconstant{editoretallimit}{editoretallimit}
+\setinterfaceconstant{editoretaltext}{editoretaltext}
+\setinterfaceconstant{empty}{leer}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{geraderand}
+\setinterfaceconstant{expansion}{expansion}
+\setinterfaceconstant{export}{export}
+\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{filtercommand}{filtercommand}
+\setinterfaceconstant{finalnamesep}{finalnamesep}
+\setinterfaceconstant{firstnamesep}{firstnamesep}
+\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{headalign}{headalign}
+\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{hidenumber}{hidenumber}
+\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{intent}{intent}
+\setinterfaceconstant{interaction}{interaktion}
+\setinterfaceconstant{interlinespace}{zeilenabstande}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{posten}
+\setinterfaceconstant{juniorsep}{juniorsep}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{keyword}
+\setinterfaceconstant{label}{label}
+\setinterfaceconstant{lastnamesep}{lastnamesep}
+\setinterfaceconstant{lastpubsep}{lastpubsep}
+\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{maxdepth}{maxdepth}
+\setinterfaceconstant{maxheight}{maxhoehe}
+\setinterfaceconstant{maxwidth}{maxbreite}
+\setinterfaceconstant{maybeyear}{maybeyear}
+\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{monthconversion}{monthconversion}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{name}
+\setinterfaceconstant{namesep}{namesep}
+\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{numberconversion}{numberconversion}
+\setinterfaceconstant{numberconversionset}{numberconversionset}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{nummerierung}
+\setinterfaceconstant{numberorder}{numberorder}
+\setinterfaceconstant{numberprefix}{numberprefix}
+\setinterfaceconstant{numbersegments}{numbersegments}
+\setinterfaceconstant{numberseparator}{nummernseperator}
+\setinterfaceconstant{numberseparatorset}{numberseparatorset}
+\setinterfaceconstant{numberset}{numberset}
+\setinterfaceconstant{numberstarter}{numberstarter}
+\setinterfaceconstant{numberstopper}{numberstopper}
+\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{order}{order}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{otherstext}{otherstext}
+\setinterfaceconstant{outermargin}{outermargin}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{eigenenummer}
+\setinterfaceconstant{page}{seite}
+\setinterfaceconstant{pageboundaries}{seitenbegrenzung}
+\setinterfaceconstant{pagecolor}{seitenfarbe}
+\setinterfaceconstant{pagecommand}{seitenbefehl}
+\setinterfaceconstant{pageconversion}{pageconversion}
+\setinterfaceconstant{pageconversionset}{pageconversionset}
+\setinterfaceconstant{pagenumber}{seitennummer}
+\setinterfaceconstant{pageprefix}{pageprefix}
+\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
+\setinterfaceconstant{pageprefixconversion}{pageprefixconversion}
+\setinterfaceconstant{pageprefixconversionset}{pageprefixconversionset}
+\setinterfaceconstant{pageprefixsegments}{pageprefixsegments}
+\setinterfaceconstant{pageprefixseparatorset}{pageprefixseparatorset}
+\setinterfaceconstant{pageprefixset}{pageprefixset}
+\setinterfaceconstant{pageprefixstarter}{pageprefixstarter}
+\setinterfaceconstant{pageprefixstopper}{pageprefixstopper}
+\setinterfaceconstant{pagesegments}{pagesegments}
+\setinterfaceconstant{pageseparatorset}{pageseparatorset}
+\setinterfaceconstant{pageset}{pageset}
+\setinterfaceconstant{pagestarter}{pagestarter}
+\setinterfaceconstant{pagestate}{pagestate}
+\setinterfaceconstant{pagestopper}{pagestopper}
+\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{prefixconnector}{prefixconnector}
+\setinterfaceconstant{prefixconversion}{prefixconversion}
+\setinterfaceconstant{prefixconversionset}{prefixconversionset}
+\setinterfaceconstant{prefixsegments}{prefixsegments}
+\setinterfaceconstant{prefixseparatorset}{prefixseparatorset}
+\setinterfaceconstant{prefixset}{prefixset}
+\setinterfaceconstant{prefixstarter}{prefixstarter}
+\setinterfaceconstant{prefixstopper}{prefixstopper}
+\setinterfaceconstant{preset}{voreinstellung}
+\setinterfaceconstant{preview}{vorschau}
+\setinterfaceconstant{previous}{vorige}
+\setinterfaceconstant{previousnumber}{vorigenummer}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{pubsep}{pubsep}
+\setinterfaceconstant{radius}{radius}
+\setinterfaceconstant{random}{zufaellig}
+\setinterfaceconstant{range}{range}
+\setinterfaceconstant{reduction}{reduktion}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{refcommand}{refcommand}
+\setinterfaceconstant{reference}{referenz}
+\setinterfaceconstant{referenceprefix}{referenceprefix}
+\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{samplesize}{samplesize}
+\setinterfaceconstant{saveinlist}{saveinlist}
+\setinterfaceconstant{scale}{format}
+\setinterfaceconstant{scope}{bereich}
+\setinterfaceconstant{screen}{raster}
+\setinterfaceconstant{section}{abschnitt}
+\setinterfaceconstant{sectionconversion}{sectionconversion}
+\setinterfaceconstant{sectionconversionset}{sectionconversionset}
+\setinterfaceconstant{sectionnumber}{abschnittsnummer}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
+\setinterfaceconstant{sectionsegments}{sectionsegments}
+\setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
+\setinterfaceconstant{sectionset}{sectionset}
+\setinterfaceconstant{sectionstarter}{sectionstarter}
+\setinterfaceconstant{sectionstopper}{sectionstopper}
+\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{sort}{sort}
+\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{starter}{starter}
+\setinterfaceconstant{state}{status}
+\setinterfaceconstant{step}{schritt}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{abschnitttrenner}
+\setinterfaceconstant{stretch}{strecken}
+\setinterfaceconstant{strip}{strip}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{stil}
+\setinterfaceconstant{sub}{unter}
+\setinterfaceconstant{subtitle}{untertitel}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{surnamesep}{surnamesep}
+\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{synonymcommand}{synonymbefehl}
+\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{totalnumber}{totalnumber}
+\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{vonsep}{vonsep}
+\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{answerlines}{answerlines}
+\setinterfaceelement{answerspace}{answerspace}
+\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{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{setupanswerarea}{setupanswerarea}
+\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{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..ce5af2bba
--- /dev/null
+++ b/tex/context/base/mult-def.lua
@@ -0,0 +1,16149 @@
+if not modules then modules = { } end modules ['mult-def'] = {
+ version = 1.001,
+ comment = "companion to mult-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+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",
+ },
+ ["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",
+ },
+ ["setupanswerarea"]={
+ ["cs"]="setupanswerarea",
+ ["de"]="setupanswerarea",
+ ["en"]="setupanswerarea",
+ ["fr"]="setupanswerarea",
+ ["it"]="setupanswerarea",
+ ["nl"]="stelantwoordgebiedin",
+ ["pe"]="setupanswerarea",
+ ["ro"]="setupanswerarea",
+ },
+ ["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",
+ },
+ ["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"]={
+ ["strip"]={
+ ["en"]="strip",
+ },
+ ["order"]={
+ ["en"]="order",
+ },
+ ["headalign"]={
+ ["en"]="headalign",
+ ["nl"]="kopuitlijnen",
+ },
+ ["alignsymbol"]={
+ ["en"]="alignsymbol",
+ },
+ ["export"]={
+ ["en"]="export",
+ ["nl"]="exporteer",
+ },
+ ["database"]={
+ ["en"]="database",
+ },
+ ["artauthor"]={
+ ["en"]="artauthor",
+ },
+ ["editor"]={
+ ["en"]="editor",
+ },
+ ["authoretallimit"]={
+ ["en"]="authoretallimit",
+ },
+ ["artauthoretallimit"]={
+ ["en"]="artauthoretallimit",
+ },
+ ["editoretallimit"]={
+ ["en"]="editoretallimit",
+ },
+ ["authoretaldisplay"]={
+ ["en"]="authoretaldisplay",
+ },
+ ["artauthoretaldisplay"]={
+ ["en"]="artauthoretaldisplay",
+ },
+ ["editoretaldisplay"]={
+ ["en"]="editoretaldisplay",
+ },
+ ["authoretaltext"]={
+ ["en"]="authoretaltext",
+ },
+ ["artauthoretaltext"]={
+ ["en"]="artauthoretaltext",
+ },
+ ["editoretaltext"]={
+ ["en"]="editoretaltext",
+ },
+ ["otherstext"]={
+ ["en"]="otherstext",
+ },
+ ["andtext"]={
+ ["en"]="andtext",
+ },
+ ["totalnumber"]={
+ ["en"]="totalnumber",
+ },
+ ["firstnamesep"]={
+ ["en"]="firstnamesep",
+ },
+ ["vonsep"]={
+ ["en"]="vonsep",
+ },
+ ["juniorsep"]={
+ ["en"]="juniorsep",
+ },
+ ["surnamesep"]={
+ ["en"]="surnamesep",
+ },
+ ["lastnamesep"]={
+ ["en"]="lastnamesep",
+ },
+ ["finalnamesep"]={
+ ["en"]="finalnamesep",
+ },
+ ["namesep"]={
+ ["en"]="namesep",
+ },
+ ["pubsep"]={
+ ["en"]="pubsep",
+ },
+ ["lastpubsep"]={
+ ["en"]="lastpubsep",
+ },
+ ["refcommand"]={
+ ["en"]="refcommand",
+ },
+ ["samplesize"]={
+ ["en"]="samplesize",
+ },
+ ["maybeyear"]={
+ ["en"]="maybeyear",
+ },
+ ["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",
+ },
+ ["bottomafter"]={
+ ["en"]="bottomafter",
+ },
+ ["bottombefore"]={
+ ["en"]="bottombefore",
+ },
+ ["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",
+ },
+ ["intent"]={
+ ["en"]="intent",
+ },
+ ["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",
+ },
+ ["connector"]={
+ ["en"]="connector",
+ },
+ ["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",
+ },
+ ["filtercommand"]={
+ ["en"]="filtercommand",
+ },
+ ["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",
+ },
+ ["hidenumber"]={
+ ["en"]="hidenumber",
+ },
+ ["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",
+ },
+ ["maxdepth"]={
+ ["en"]="maxdepth",
+ },
+ ["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",
+ },
+ ["monthconversion"]={
+ ["en"]="monthconversion",
+ ["nl"]="maandconversie",
+ },
+ ["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",
+ },
+ ["numberconversion"]={
+ ["en"]="numberconversion",
+ },
+ ["numberconversionset"]={
+ ["en"]="numberconversionset",
+ },
+ ["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",
+ },
+ ["numberorder"]={
+ ["en"]="numberorder",
+ },
+ ["numberprefix"]={
+ ["en"]="numberprefix",
+ },
+ ["numbersegments"]={
+ ["en"]="numbersegments",
+ },
+ ["numberseparator"]={
+ ["cs"]="oddelovaccisla",
+ ["de"]="nummernseperator",
+ ["en"]="numberseparator",
+ ["fr"]="separateurnumbero",
+ ["it"]="separatorenumero",
+ ["nl"]="nummerscheider",
+ ["pe"]="جداکننده‌شماره",
+ ["ro"]="separatornumar",
+ },
+ ["numberseparatorset"]={
+ ["en"]="numberseparatorset",
+ },
+ ["numberset"]={
+ ["en"]="numberset",
+ },
+ ["numberstopper"]={
+ ["en"]="numberstopper",
+ },
+ ["numberstarter"]={
+ ["en"]="numberstarter",
+ },
+ ["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",
+ },
+ ["pageconversion"]={
+ ["en"]="pageconversion",
+ },
+ ["pageconversionset"]={
+ ["en"]="pageconversionset",
+ },
+ ["pagenumber"]={
+ ["cs"]="cislostranky",
+ ["de"]="seitennummer",
+ ["en"]="pagenumber",
+ ["fr"]="numeropage",
+ ["it"]="numeropagina",
+ ["nl"]="paginanummer",
+ ["pe"]="شماره‌صفحه",
+ ["ro"]="numarpagina",
+ },
+ ["pageprefix"]={
+ ["en"]="pageprefix",
+ },
+ ["pageprefixconnector"]={
+ ["en"]="pageprefixconnector",
+ },
+ ["pageprefixconversion"]={
+ ["en"]="pageprefixconversion",
+ },
+ ["pageprefixconversionset"]={
+ ["en"]="pageprefixconversionset",
+ },
+ ["pageprefixsegments"]={
+ ["en"]="pageprefixsegments",
+ },
+ ["pageprefixseparatorset"]={
+ ["en"]="pageprefixseparatorset",
+ },
+ ["pageprefixset"]={
+ ["en"]="pageprefixset",
+ },
+ ["pageprefixstopper"]={
+ ["en"]="pageprefixstopper",
+ },
+ ["pageprefixstarter"]={
+ ["en"]="pageprefixstarter",
+ },
+ ["pagesegments"]={
+ ["en"]="pagesegments",
+ },
+ ["pageseparatorset"]={
+ ["en"]="pageseparatorset",
+ },
+ ["pageset"]={
+ ["en"]="pageset",
+ },
+ ["pagestate"]={
+ ["cs"]="pagestate",
+ ["de"]="pagestate",
+ ["en"]="pagestate",
+ ["fr"]="etatpage",
+ ["it"]="statopagina",
+ ["nl"]="paginastatus",
+ ["pe"]="وضعیت‌صفحه",
+ ["ro"]="pagestate",
+ },
+ ["pagestopper"]={
+ ["en"]="pagestopper",
+ },
+ ["pagestarter"]={
+ ["en"]="pagestarter",
+ },
+ ["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",
+ },
+ ["prefixconnector"]={
+ ["en"]="prefixconnector",
+ },
+ ["prefixconversion"]={
+ ["en"]="prefixconversion",
+ },
+ ["prefixconversionset"]={
+ ["en"]="prefixconversionset",
+ },
+ ["prefixsegments"]={
+ ["en"]="prefixsegments",
+ },
+ ["prefixseparatorset"]={
+ ["en"]="prefixseparatorset",
+ },
+ ["prefixset"]={
+ ["en"]="prefixset",
+ },
+ ["prefixstopper"]={
+ ["en"]="prefixstopper",
+ },
+ ["prefixstarter"]={
+ ["en"]="prefixstarter",
+ },
+ ["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",
+ },
+ ["range"]={
+ ["en"]="range",
+ ["nl"]="bereik",
+ },
+ ["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",
+ },
+ ["referenceprefix"]={
+ ["en"]="referenceprefix",
+ },
+ ["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",
+ },
+ ["saveinlist"]={
+ ["en"]="saveinlist",
+ },
+ ["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",
+ },
+ ["sectionconversion"]={
+ ["en"]="sectionconversion",
+ },
+ ["sectionconversionset"]={
+ ["en"]="sectionconversionset",
+ },
+ ["sectionnumber"]={
+ ["cs"]="cislooddilu",
+ ["de"]="abschnittsnummer",
+ ["en"]="sectionnumber",
+ ["fr"]="numerosection",
+ ["it"]="numerosezione",
+ ["nl"]="sectienummer",
+ ["pe"]="شماره‌بخش",
+ ["ro"]="numarsectiune",
+ },
+ ["sectionresetset"]={
+ ["en"]="sectionresetset",
+ },
+ ["sectionsegments"]={
+ ["en"]="sectionsegments",
+ },
+ ["sectionseparatorset"]={
+ ["en"]="sectionseparatorset",
+ },
+ ["sectionset"]={
+ ["en"]="sectionset",
+ },
+ ["sectionstopper"]={
+ ["en"]="sectionstopper",
+ },
+ ["sectionstarter"]={
+ ["en"]="sectionstarter",
+ },
+ ["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",
+ },
+ ["sort"]={
+ ["en"]="sort",
+ },
+ ["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",
+ },
+ ["starter"]={
+ ["en"]="starter",
+ ["nl"]="opener",
+ },
+ ["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",
+ },
+ ["synonymcommand"]={
+ ["cs"]="synonymcommand",
+ ["de"]="synonymbefehl",
+ ["en"]="synonymcommand",
+ ["fr"]="synonymcommand",
+ ["it"]="synonymcommand",
+ ["nl"]="synoniemcommando",
+ ["pe"]="synonymcommand",
+ ["ro"]="synonymcommand",
+ },
+ ["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"]={
+ ["answerlines"]={
+ ["cs"]="answerlines",
+ ["de"]="answerlines",
+ ["en"]="answerlines",
+ ["fr"]="answerlines",
+ ["it"]="answerlines",
+ ["nl"]="antwoordregels",
+ ["pe"]="answerlines",
+ ["ro"]="answerlines",
+ },
+ ["answerspace"]={
+ ["cs"]="answerspace",
+ ["de"]="answerspace",
+ ["en"]="answerspace",
+ ["fr"]="answerspace",
+ ["it"]="answerspace",
+ ["nl"]="antwoordruimte",
+ ["pe"]="answerspace",
+ ["ro"]="answerspace",
+ },
+ ["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"]={
+ ["end"]={
+ ["en"]="end",
+ ["nl"]="eind",
+ },
+ ["begin"]={
+ ["en"]="begin",
+ ["nl"]="begin",
+ },
+ ["down"]={
+ ["en"]="down",
+ ["nl"]="omlaag",
+ },
+ ["up"]={
+ ["en"]="up",
+ ["nl"]="omhoog",
+ },
+ ["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",
+ },
+ ["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",
+ },
+ ["maxheight"]={
+ ["en"]="maxheight",
+ },
+ ["maxdepth"]={
+ ["en"]="maxdepth",
+ },
+ ["maxwidth"]={
+ ["en"]="maxwidth",
+ },
+ ["minheight"]={
+ ["en"]="minheight",
+ },
+ ["mindepth"]={
+ ["en"]="mindepth",
+ },
+ ["minwidth"]={
+ ["en"]="minwidth",
+ },
+ ["short"]={
+ ["nl"]="kort",
+ ["en"]="short",
+ ["de"]="kurz",
+ ["cs"]="short",
+ ["it"]="short",
+ ["ro"]="short",
+ ["fr"]="short",
+ },
+ ["cite"]={
+ ["en"]="cite",
+ },
+ ["bbl"]={
+ ["en"]="bbl",
+ },
+ ["bib"]={
+ ["en"]="bib",
+ },
+ ["author"]={
+ ["nl"]="auteur",
+ ["en"]="author",
+ ["de"]="autor",
+ ["cs"]="autor",
+ ["it"]="autore",
+ ["ro"]="autor",
+ ["fr"]="auteur",
+ },
+ ["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",
+ },
+ ["answerarea"]={
+ ["cs"]="answerarea",
+ ["de"]="answerarea",
+ ["en"]="answerarea",
+ ["fr"]="answerarea",
+ ["it"]="answerarea",
+ ["nl"]="antwoordgebied",
+ ["pe"]="answerarea",
+ ["ro"]="answerarea",
+ },
+ ["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",
+ },
+ ["layer"]={
+ ["cs"]="layer",
+ ["de"]="layer",
+ ["en"]="layer",
+ ["fr"]="layer",
+ ["it"]="layer",
+ ["nl"]="layer",
+ ["pe"]="layer",
+ ["ro"]="layer",
+ },
+ ["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",
+ },
+ ["lefttoright"]={
+ ["cs"]="lefttoright",
+ ["de"]="lefttoright",
+ ["en"]="lefttoright",
+ ["fr"]="lefttoright",
+ ["it"]="lefttoright",
+ ["nl"]="lefttoright",
+ ["pe"]="lefttoright",
+ ["ro"]="lefttoright",
+ },
+ ["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",
+ },
+ ["note"]={
+ ["en"]="note",
+ },
+ ["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",
+ },
+ ["righttoleft"]={
+ ["cs"]="righttoleft",
+ ["de"]="righttoleft",
+ ["en"]="righttoleft",
+ ["fr"]="righttoleft",
+ ["it"]="righttoleft",
+ ["nl"]="righttoleft",
+ ["pe"]="righttoleft",
+ ["ro"]="righttoleft",
+ },
+ ["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",
+ },
+ ["starter"]={
+ ["en"]="starter",
+ ["nl"]="opener",
+ },
+ ["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"]="strong",
+ ["fr"]="strong",
+ ["it"]="strong",
+ ["nl"]="sterk",
+ ["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",
+ },
+ ["subsubsubsubsubsubsection"]={
+ ["cs"]="podpodpodpodpodpodsekce",
+ ["de"]="unterunterunterunterunterunterabsatz",
+ ["en"]="subsubsubsubsubsubsection",
+ ["fr"]="soussoussoussoussoussoussection",
+ ["it"]="sottosottosottosottosottosottocapoverso",
+ ["nl"]="subsubsubsubsubsubparagraaf",
+ ["pe"]="زیرزیرزیرزیرزیرزیربخش",
+ ["ro"]="subsubsubsubsubsubsectiune",
+ },
+ ["subsubsubsubsubsubsubject"]={
+ ["cs"]="podpodpodpodpodpodtema",
+ ["de"]="unterunterunterunterunterunterthema",
+ ["en"]="subsubsubsubsubsubsubject",
+ ["fr"]="soussoussoussoussoussoussujet",
+ ["it"]="sottosottosottosottosottosottoargomento",
+ ["nl"]="subsubsubsubsubsubonderwerp",
+ ["pe"]="زیرزیرزیرزیرزیرزیرموضوع",
+ ["ro"]="subsubsubsubsubsubsubiect",
+ },
+ ["subsubsubsubsubsubsubsection"]={
+ ["cs"]="podpodpodpodpodpodpodsekce",
+ ["de"]="unterunterunterunterunterunterunterabsatz",
+ ["en"]="subsubsubsubsubsubsubsection",
+ ["fr"]="soussoussoussoussoussoussoussection",
+ ["it"]="sottosottosottosottosottosottosottocapoverso",
+ ["nl"]="subsubsubsubsubsubsubparagraaf",
+ ["pe"]="زیرزیرزیرزیرزیرزیرزیربخش",
+ ["ro"]="subsubsubsubsubsubsubsectiune",
+ },
+ ["subsubsubsubsubsubsubsubject"]={
+ ["cs"]="podpodpodpodpodpodpodtema",
+ ["de"]="unterunterunterunterunterunterunterthema",
+ ["en"]="subsubsubsubsubsubsubsubject",
+ ["fr"]="soussoussoussoussoussoussoussujet",
+ ["it"]="sottosottosottosottosottosottosottoargomento",
+ ["nl"]="subsubsubsubsubsubsubonderwerp",
+ ["pe"]="زیرزیرزیرزیرزیرزیرزیرموضوع",
+ ["ro"]="subsubsubsubsubsubsubsubiect",
+ },
+ ["subsubsubsubsubsubsubsubsection"]={
+ ["cs"]="podpodpodpodpodpodpodpodsekce",
+ ["de"]="unterunterunterunterunterunterunterunterabsatz",
+ ["en"]="subsubsubsubsubsubsubsubsection",
+ ["fr"]="soussoussoussoussoussoussoussoussection",
+ ["it"]="sottosottosottosottosottosottosottosottocapoverso",
+ ["nl"]="subsubsubsubsubsubsubsubparagraaf",
+ ["pe"]="زیرزیرزیرزیرزیرزیرزیرزیربخش",
+ ["ro"]="subsubsubsubsubsubsubsubsectiune",
+ },
+ ["subsubsubsubsubsubsubsubsubject"]={
+ ["cs"]="podpodpodpodpodpodpodpodtema",
+ ["de"]="unterunterunterunterunterunterunterunterthema",
+ ["en"]="subsubsubsubsubsubsubsubsubject",
+ ["fr"]="soussoussoussoussoussoussoussoussujet",
+ ["it"]="sottosottosottosottosottosottosottosottoargomento",
+ ["nl"]="subsubsubsubsubsubsubsubonderwerp",
+ ["pe"]="زیرزیرزیرزیرزیرزیرزیرزیرموضوع",
+ ["ro"]="subsubsubsubsubsubsubsubsubiect",
+ },
+ ["subsubsubsubsubsubsubsubsubsection"]={
+ ["cs"]="podpodpodpodpodpodpodpodpodsekce",
+ ["de"]="unterunterunterunterunterunterunterunterunterabsatz",
+ ["en"]="subsubsubsubsubsubsubsubsubsection",
+ ["fr"]="soussoussoussoussoussoussoussoussoussection",
+ ["it"]="sottosottosottosottosottosottosottosottosottocapoverso",
+ ["nl"]="subsubsubsubsubsubsubsubsubparagraaf",
+ ["pe"]="زیرزیرزیرزیرزیرزیرزیرزیرزیربخش",
+ ["ro"]="subsubsubsubsubsubsubsubsubsectiune",
+ },
+ ["subsubsubsubsubsubsubsubsubsubject"]={
+ ["cs"]="podpodpodpodpodpodpodpodpodtema",
+ ["de"]="unterunterunterunterunterunterunterunterunterthema",
+ ["en"]="subsubsubsubsubsubsubsubsubsubject",
+ ["fr"]="soussoussoussoussoussoussoussoussoussujet",
+ ["it"]="sottosottosottosottosottosottosottosottosottoargomento",
+ ["nl"]="subsubsubsubsubsubsubsubsubonderwerp",
+ ["pe"]="زیرزیرزیرزیرزیرزیرزیرزیرزیرموضوع",
+ ["ro"]="subsubsubsubsubsubsubsubsubsubiect",
+ },
+ ["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"]="weak",
+ ["fr"]="weak",
+ ["it"]="weak",
+ ["nl"]="zwak",
+ ["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..cff9fb074
--- /dev/null
+++ b/tex/context/base/mult-def.tex
@@ -0,0 +1,35 @@
+%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}
+
+% \def\userinterfacetag
+% {\ifcsname @interface@\defaultinterface @\endcsname\csname @interface@\defaultinterface @\endcsname\else en\fi}
+\def\userinterfacetag
+ {\ifcsname @interface@\currentinterface @\endcsname\csname @interface@\currentinterface @\endcsname\else en\fi}
+\def\userresponsestag
+ {\ifcsname @interface@\currentresponses @\endcsname\csname @interface@\currentresponses @\endcsname\else en\fi}
+
+\input mult-\userinterfacetag \relax
+\input mult-m\userresponsestag \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..20917a034
--- /dev/null
+++ b/tex/context/base/mult-en.tex
@@ -0,0 +1,1693 @@
+% 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{answerarea}{answerarea}
+\setinterfacevariable{appendices}{appendices}
+\setinterfacevariable{appendix}{appendix}
+\setinterfacevariable{april}{April}
+\setinterfacevariable{atmargin}{atmargin}
+\setinterfacevariable{atpage}{atpage}
+\setinterfacevariable{august}{August}
+\setinterfacevariable{author}{author}
+\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{bbl}{bbl}
+\setinterfacevariable{before}{before}
+\setinterfacevariable{begin}{begin}
+\setinterfacevariable{bib}{bib}
+\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{cite}{cite}
+\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{down}{down}
+\setinterfacevariable{each}{each}
+\setinterfacevariable{edge}{edge}
+\setinterfacevariable{empty}{empty}
+\setinterfacevariable{end}{end}
+\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{layer}{layer}
+\setinterfacevariable{left}{left}
+\setinterfacevariable{leftedge}{leftedge}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{leftmargin}
+\setinterfacevariable{leftpage}{leftpage}
+\setinterfacevariable{lefttoright}{lefttoright}
+\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{maxdepth}{maxdepth}
+\setinterfacevariable{maxheight}{maxheight}
+\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{may}{May}
+\setinterfacevariable{mediaeval}{mediaeval}
+\setinterfacevariable{medium}{medium}
+\setinterfacevariable{middle}{middle}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{mindepth}{mindepth}
+\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{note}{note}
+\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{overbar}{overbar}
+\setinterfacevariable{overbars}{overbars}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{overstrike}{overstrike}
+\setinterfacevariable{overstrikes}{overstrikes}
+\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{righttoleft}{righttoleft}
+\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{short}{short}
+\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{starter}{starter}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{stop}
+\setinterfacevariable{stopper}{stopper}
+\setinterfacevariable{stretch}{stretch}
+\setinterfacevariable{strict}{strict}
+\setinterfacevariable{strong}{strong}
+\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{subsubsubsubsubsubsection}{subsubsubsubsubsubsection}
+\setinterfacevariable{subsubsubsubsubsubsubject}{subsubsubsubsubsubsubject}
+\setinterfacevariable{subsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsection}
+\setinterfacevariable{subsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubject}
+\setinterfacevariable{subsubsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsubsection}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubsubject}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsubsubsection}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubsubsubject}
+\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{underbar}{underbar}
+\setinterfacevariable{underbars}{underbars}
+\setinterfacevariable{unit}{unit}
+\setinterfacevariable{units}{units}
+\setinterfacevariable{unknown}{unknown}
+\setinterfacevariable{unpacked}{unpacked}
+\setinterfacevariable{up}{up}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{used}
+\setinterfacevariable{value}{value}
+\setinterfacevariable{vertical}{vertical}
+\setinterfacevariable{very}{very}
+\setinterfacevariable{verystrict}{verystrict}
+\setinterfacevariable{verytolerant}{verytolerant}
+\setinterfacevariable{weak}{weak}
+\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{alignsymbol}{alignsymbol}
+\setinterfaceconstant{aligntitle}{aligntitle}
+\setinterfaceconstant{alternative}{alternative}
+\setinterfaceconstant{andtext}{andtext}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{arrow}
+\setinterfaceconstant{artauthor}{artauthor}
+\setinterfaceconstant{artauthoretaldisplay}{artauthoretaldisplay}
+\setinterfaceconstant{artauthoretallimit}{artauthoretallimit}
+\setinterfaceconstant{artauthoretaltext}{artauthoretaltext}
+\setinterfaceconstant{at}{at}
+\setinterfaceconstant{author}{author}
+\setinterfaceconstant{authoretaldisplay}{authoretaldisplay}
+\setinterfaceconstant{authoretallimit}{authoretallimit}
+\setinterfaceconstant{authoretaltext}{authoretaltext}
+\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{bottomafter}{bottomafter}
+\setinterfaceconstant{bottombefore}{bottombefore}
+\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{connector}{connector}
+\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{database}{database}
+\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{editor}{editor}
+\setinterfaceconstant{editoretaldisplay}{editoretaldisplay}
+\setinterfaceconstant{editoretallimit}{editoretallimit}
+\setinterfaceconstant{editoretaltext}{editoretaltext}
+\setinterfaceconstant{empty}{empty}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{evenmargin}
+\setinterfaceconstant{expansion}{expansion}
+\setinterfaceconstant{export}{export}
+\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{filtercommand}{filtercommand}
+\setinterfaceconstant{finalnamesep}{finalnamesep}
+\setinterfaceconstant{firstnamesep}{firstnamesep}
+\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{headalign}{headalign}
+\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{hidenumber}{hidenumber}
+\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{intent}{intent}
+\setinterfaceconstant{interaction}{interaction}
+\setinterfaceconstant{interlinespace}{interlinespace}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{items}
+\setinterfaceconstant{juniorsep}{juniorsep}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{keyword}
+\setinterfaceconstant{label}{label}
+\setinterfaceconstant{lastnamesep}{lastnamesep}
+\setinterfaceconstant{lastpubsep}{lastpubsep}
+\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{maxdepth}{maxdepth}
+\setinterfaceconstant{maxheight}{maxheight}
+\setinterfaceconstant{maxwidth}{maxwidth}
+\setinterfaceconstant{maybeyear}{maybeyear}
+\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{monthconversion}{monthconversion}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{name}
+\setinterfaceconstant{namesep}{namesep}
+\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{numberconversion}{numberconversion}
+\setinterfaceconstant{numberconversionset}{numberconversionset}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numbering}
+\setinterfaceconstant{numberorder}{numberorder}
+\setinterfaceconstant{numberprefix}{numberprefix}
+\setinterfaceconstant{numbersegments}{numbersegments}
+\setinterfaceconstant{numberseparator}{numberseparator}
+\setinterfaceconstant{numberseparatorset}{numberseparatorset}
+\setinterfaceconstant{numberset}{numberset}
+\setinterfaceconstant{numberstarter}{numberstarter}
+\setinterfaceconstant{numberstopper}{numberstopper}
+\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{order}{order}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{otherstext}{otherstext}
+\setinterfaceconstant{outermargin}{outermargin}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{ownnumber}
+\setinterfaceconstant{page}{page}
+\setinterfaceconstant{pageboundaries}{pageboundaries}
+\setinterfaceconstant{pagecolor}{pagecolor}
+\setinterfaceconstant{pagecommand}{pagecommand}
+\setinterfaceconstant{pageconversion}{pageconversion}
+\setinterfaceconstant{pageconversionset}{pageconversionset}
+\setinterfaceconstant{pagenumber}{pagenumber}
+\setinterfaceconstant{pageprefix}{pageprefix}
+\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
+\setinterfaceconstant{pageprefixconversion}{pageprefixconversion}
+\setinterfaceconstant{pageprefixconversionset}{pageprefixconversionset}
+\setinterfaceconstant{pageprefixsegments}{pageprefixsegments}
+\setinterfaceconstant{pageprefixseparatorset}{pageprefixseparatorset}
+\setinterfaceconstant{pageprefixset}{pageprefixset}
+\setinterfaceconstant{pageprefixstarter}{pageprefixstarter}
+\setinterfaceconstant{pageprefixstopper}{pageprefixstopper}
+\setinterfaceconstant{pagesegments}{pagesegments}
+\setinterfaceconstant{pageseparatorset}{pageseparatorset}
+\setinterfaceconstant{pageset}{pageset}
+\setinterfaceconstant{pagestarter}{pagestarter}
+\setinterfaceconstant{pagestate}{pagestate}
+\setinterfaceconstant{pagestopper}{pagestopper}
+\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{prefixconnector}{prefixconnector}
+\setinterfaceconstant{prefixconversion}{prefixconversion}
+\setinterfaceconstant{prefixconversionset}{prefixconversionset}
+\setinterfaceconstant{prefixsegments}{prefixsegments}
+\setinterfaceconstant{prefixseparatorset}{prefixseparatorset}
+\setinterfaceconstant{prefixset}{prefixset}
+\setinterfaceconstant{prefixstarter}{prefixstarter}
+\setinterfaceconstant{prefixstopper}{prefixstopper}
+\setinterfaceconstant{preset}{preset}
+\setinterfaceconstant{preview}{preview}
+\setinterfaceconstant{previous}{previous}
+\setinterfaceconstant{previousnumber}{previousnumber}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{pubsep}{pubsep}
+\setinterfaceconstant{radius}{radius}
+\setinterfaceconstant{random}{random}
+\setinterfaceconstant{range}{range}
+\setinterfaceconstant{reduction}{reduction}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{refcommand}{refcommand}
+\setinterfaceconstant{reference}{reference}
+\setinterfaceconstant{referenceprefix}{referenceprefix}
+\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{samplesize}{samplesize}
+\setinterfaceconstant{saveinlist}{saveinlist}
+\setinterfaceconstant{scale}{scale}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{screen}
+\setinterfaceconstant{section}{section}
+\setinterfaceconstant{sectionconversion}{sectionconversion}
+\setinterfaceconstant{sectionconversionset}{sectionconversionset}
+\setinterfaceconstant{sectionnumber}{sectionnumber}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
+\setinterfaceconstant{sectionsegments}{sectionsegments}
+\setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
+\setinterfaceconstant{sectionset}{sectionset}
+\setinterfaceconstant{sectionstarter}{sectionstarter}
+\setinterfaceconstant{sectionstopper}{sectionstopper}
+\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{sort}{sort}
+\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{starter}{starter}
+\setinterfaceconstant{state}{state}
+\setinterfaceconstant{step}{step}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{stopper}
+\setinterfaceconstant{stretch}{stretch}
+\setinterfaceconstant{strip}{strip}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{style}
+\setinterfaceconstant{sub}{sub}
+\setinterfaceconstant{subtitle}{subtitle}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{surnamesep}{surnamesep}
+\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{synonymcommand}{synonymcommand}
+\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{totalnumber}{totalnumber}
+\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{vonsep}{vonsep}
+\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{answerlines}{answerlines}
+\setinterfaceelement{answerspace}{answerspace}
+\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{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{setupanswerarea}{setupanswerarea}
+\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{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..5244565e9
--- /dev/null
+++ b/tex/context/base/mult-fr.tex
@@ -0,0 +1,1693 @@
+% 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{answerarea}{answerarea}
+\setinterfacevariable{appendices}{annexes}
+\setinterfacevariable{appendix}{annexe}
+\setinterfacevariable{april}{avril}
+\setinterfacevariable{atmargin}{alamarge}
+\setinterfacevariable{atpage}{alapage}
+\setinterfacevariable{august}{aout}
+\setinterfacevariable{author}{auteur}
+\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{bbl}{bbl}
+\setinterfacevariable{before}{avant}
+\setinterfacevariable{begin}{begin}
+\setinterfacevariable{bib}{bib}
+\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{cite}{cite}
+\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{down}{down}
+\setinterfacevariable{each}{chaque}
+\setinterfacevariable{edge}{bord}
+\setinterfacevariable{empty}{vide}
+\setinterfacevariable{end}{end}
+\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{layer}{layer}
+\setinterfacevariable{left}{gauche}
+\setinterfacevariable{leftedge}{bordgauche}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{margegauche}
+\setinterfacevariable{leftpage}{pagegauche}
+\setinterfacevariable{lefttoright}{lefttoright}
+\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{maxdepth}{maxdepth}
+\setinterfacevariable{maxheight}{maxheight}
+\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{may}{mai}
+\setinterfacevariable{mediaeval}{medieval}
+\setinterfacevariable{medium}{moyen}
+\setinterfacevariable{middle}{milieu}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{mindepth}{mindepth}
+\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{note}{note}
+\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{overbar}{overbar}
+\setinterfacevariable{overbars}{overbars}
+\setinterfacevariable{overlay}{revetement}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{overstrike}{surlignetout}
+\setinterfacevariable{overstrikes}{surligne}
+\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{righttoleft}{righttoleft}
+\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{short}{short}
+\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{starter}{starter}
+\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{subsubsubsubsubsubsection}{soussoussoussoussoussoussection}
+\setinterfacevariable{subsubsubsubsubsubsubject}{soussoussoussoussoussoussujet}
+\setinterfacevariable{subsubsubsubsubsubsubsection}{soussoussoussoussoussoussoussection}
+\setinterfacevariable{subsubsubsubsubsubsubsubject}{soussoussoussoussoussoussoussujet}
+\setinterfacevariable{subsubsubsubsubsubsubsubsection}{soussoussoussoussoussoussoussoussection}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubject}{soussoussoussoussoussoussoussoussujet}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsection}{soussoussoussoussoussoussoussoussoussection}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsubject}{soussoussoussoussoussoussoussoussoussujet}
+\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{underbar}{souslignetout}
+\setinterfacevariable{underbars}{sousligne}
+\setinterfacevariable{unit}{unite}
+\setinterfacevariable{units}{unites}
+\setinterfacevariable{unknown}{inconnu}
+\setinterfacevariable{unpacked}{degroupe}
+\setinterfacevariable{up}{up}
+\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{alignsymbol}{alignsymbol}
+\setinterfaceconstant{aligntitle}{alignementtitre}
+\setinterfaceconstant{alternative}{alternative}
+\setinterfaceconstant{andtext}{andtext}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{fleche}
+\setinterfaceconstant{artauthor}{artauthor}
+\setinterfaceconstant{artauthoretaldisplay}{artauthoretaldisplay}
+\setinterfaceconstant{artauthoretallimit}{artauthoretallimit}
+\setinterfaceconstant{artauthoretaltext}{artauthoretaltext}
+\setinterfaceconstant{at}{a}
+\setinterfaceconstant{author}{auteur}
+\setinterfaceconstant{authoretaldisplay}{authoretaldisplay}
+\setinterfaceconstant{authoretallimit}{authoretallimit}
+\setinterfaceconstant{authoretaltext}{authoretaltext}
+\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{bottomafter}{bottomafter}
+\setinterfaceconstant{bottombefore}{bottombefore}
+\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{connector}{connector}
+\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{database}{database}
+\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{editor}{editor}
+\setinterfaceconstant{editoretaldisplay}{editoretaldisplay}
+\setinterfaceconstant{editoretallimit}{editoretallimit}
+\setinterfaceconstant{editoretaltext}{editoretaltext}
+\setinterfaceconstant{empty}{vide}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{margepaire}
+\setinterfaceconstant{expansion}{expansion}
+\setinterfaceconstant{export}{export}
+\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{filtercommand}{filtercommand}
+\setinterfaceconstant{finalnamesep}{finalnamesep}
+\setinterfaceconstant{firstnamesep}{firstnamesep}
+\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{headalign}{headalign}
+\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{hidenumber}{hidenumber}
+\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{intent}{intent}
+\setinterfaceconstant{interaction}{interaction}
+\setinterfaceconstant{interlinespace}{espaceinterligne}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{elements}
+\setinterfaceconstant{juniorsep}{juniorsep}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{motcle}
+\setinterfaceconstant{label}{etiquette}
+\setinterfaceconstant{lastnamesep}{lastnamesep}
+\setinterfaceconstant{lastpubsep}{lastpubsep}
+\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{maxdepth}{maxdepth}
+\setinterfaceconstant{maxheight}{hauteurmax}
+\setinterfaceconstant{maxwidth}{largeurmax}
+\setinterfaceconstant{maybeyear}{maybeyear}
+\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{monthconversion}{monthconversion}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{nom}
+\setinterfaceconstant{namesep}{namesep}
+\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{numberconversion}{numberconversion}
+\setinterfaceconstant{numberconversionset}{numberconversionset}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numerotation}
+\setinterfaceconstant{numberorder}{numberorder}
+\setinterfaceconstant{numberprefix}{numberprefix}
+\setinterfaceconstant{numbersegments}{numbersegments}
+\setinterfaceconstant{numberseparator}{separateurnumbero}
+\setinterfaceconstant{numberseparatorset}{numberseparatorset}
+\setinterfaceconstant{numberset}{numberset}
+\setinterfaceconstant{numberstarter}{numberstarter}
+\setinterfaceconstant{numberstopper}{numberstopper}
+\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{order}{order}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{otherstext}{otherstext}
+\setinterfaceconstant{outermargin}{margeexterieure}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{numeroproprio}
+\setinterfaceconstant{page}{page}
+\setinterfaceconstant{pageboundaries}{limitespage}
+\setinterfaceconstant{pagecolor}{couleurpage}
+\setinterfaceconstant{pagecommand}{commandepage}
+\setinterfaceconstant{pageconversion}{pageconversion}
+\setinterfaceconstant{pageconversionset}{pageconversionset}
+\setinterfaceconstant{pagenumber}{numeropage}
+\setinterfaceconstant{pageprefix}{pageprefix}
+\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
+\setinterfaceconstant{pageprefixconversion}{pageprefixconversion}
+\setinterfaceconstant{pageprefixconversionset}{pageprefixconversionset}
+\setinterfaceconstant{pageprefixsegments}{pageprefixsegments}
+\setinterfaceconstant{pageprefixseparatorset}{pageprefixseparatorset}
+\setinterfaceconstant{pageprefixset}{pageprefixset}
+\setinterfaceconstant{pageprefixstarter}{pageprefixstarter}
+\setinterfaceconstant{pageprefixstopper}{pageprefixstopper}
+\setinterfaceconstant{pagesegments}{pagesegments}
+\setinterfaceconstant{pageseparatorset}{pageseparatorset}
+\setinterfaceconstant{pageset}{pageset}
+\setinterfaceconstant{pagestarter}{pagestarter}
+\setinterfaceconstant{pagestate}{etatpage}
+\setinterfaceconstant{pagestopper}{pagestopper}
+\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{prefixconnector}{prefixconnector}
+\setinterfaceconstant{prefixconversion}{prefixconversion}
+\setinterfaceconstant{prefixconversionset}{prefixconversionset}
+\setinterfaceconstant{prefixsegments}{prefixsegments}
+\setinterfaceconstant{prefixseparatorset}{prefixseparatorset}
+\setinterfaceconstant{prefixset}{prefixset}
+\setinterfaceconstant{prefixstarter}{prefixstarter}
+\setinterfaceconstant{prefixstopper}{prefixstopper}
+\setinterfaceconstant{preset}{prereglage}
+\setinterfaceconstant{preview}{previsualisation}
+\setinterfaceconstant{previous}{precedent}
+\setinterfaceconstant{previousnumber}{numeroprecedent}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{pubsep}{pubsep}
+\setinterfaceconstant{radius}{rayon}
+\setinterfaceconstant{random}{aleatoire}
+\setinterfaceconstant{range}{range}
+\setinterfaceconstant{reduction}{reduction}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{refcommand}{refcommand}
+\setinterfaceconstant{reference}{reference}
+\setinterfaceconstant{referenceprefix}{referenceprefix}
+\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{samplesize}{samplesize}
+\setinterfaceconstant{saveinlist}{saveinlist}
+\setinterfaceconstant{scale}{echelle}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{ecran}
+\setinterfaceconstant{section}{section}
+\setinterfaceconstant{sectionconversion}{sectionconversion}
+\setinterfaceconstant{sectionconversionset}{sectionconversionset}
+\setinterfaceconstant{sectionnumber}{numerosection}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
+\setinterfaceconstant{sectionsegments}{sectionsegments}
+\setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
+\setinterfaceconstant{sectionset}{sectionset}
+\setinterfaceconstant{sectionstarter}{sectionstarter}
+\setinterfaceconstant{sectionstopper}{sectionstopper}
+\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{sort}{sort}
+\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{starter}{starter}
+\setinterfaceconstant{state}{etat}
+\setinterfaceconstant{step}{pas}
+\setinterfaceconstant{stop}{stoppe}
+\setinterfaceconstant{stopper}{taquet}
+\setinterfaceconstant{stretch}{etire}
+\setinterfaceconstant{strip}{strip}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{style}
+\setinterfaceconstant{sub}{sous}
+\setinterfaceconstant{subtitle}{soustitre}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{surnamesep}{surnamesep}
+\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{synonymcommand}{synonymcommand}
+\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{totalnumber}{totalnumber}
+\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{vonsep}{vonsep}
+\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{answerlines}{answerlines}
+\setinterfaceelement{answerspace}{answerspace}
+\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{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{setupanswerarea}{setupanswerarea}
+\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{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
new file mode 100644
index 000000000..c237f5743
--- /dev/null
+++ b/tex/context/base/mult-fst.tex
@@ -0,0 +1,53 @@
+%D \module
+%D [ file=mult-fst,
+%D version=2006.08.16,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Speed Up,
+%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.
+
+% And so, after a few years of keeping this potentially dangerous
+% speedup in cont-exp, we now move it to the kernel: the next
+% patch is 30\% faster on main interface (seconds) (9->7 sec on
+% 1 million calls). Another speed up is still under testing.
+
+\unprotect
+
+\startinterface english
+
+ \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
+
+\protect \endinput
diff --git a/tex/context/base/mult-ini.lua b/tex/context/base/mult-ini.lua
new file mode 100644
index 000000000..92a7bc629
--- /dev/null
+++ b/tex/context/base/mult-ini.lua
@@ -0,0 +1,105 @@
+if not modules then modules = { } end modules ['mult-ini'] = {
+ version = 1.001,
+ comment = "companion to mult-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, gmatch, gsub = string.format, string.gmatch, string.gsub
+local lpegmatch = lpeg.match
+local serialize = table.serialize
+
+interfaces = interfaces or { }
+interfaces.messages = interfaces.messages or { }
+interfaces.constants = interfaces.constants or { }
+interfaces.variables = interfaces.variables or { }
+
+storage.register("interfaces/messages", interfaces.messages, "interfaces.messages" )
+storage.register("interfaces/constants", interfaces.constants, "interfaces.constants")
+storage.register("interfaces/variables", interfaces.variables, "interfaces.variables")
+
+local messages, constants, variables = interfaces.messages, interfaces.constants, interfaces.variables
+
+function interfaces.setmessages(category,str)
+ local m = messages[category] or { }
+ for k, v in gmatch(str,"(%S+) *: *(.-) *[\n\r]") do
+ m[k] = gsub(v,"%-%-","%%s")
+ end
+ messages[category] = m
+end
+
+function interfaces.setmessage(category,tag,message)
+ local m = messages[category]
+ if not m then
+ m = { }
+ messages[category] = m
+ end
+ m[tag] = gsub(message,"%-%-","%%s")
+end
+
+function interfaces.getmessage(category,tag,default)
+ local m = messages[category]
+ return (m and m[tag]) or default or "unknown message"
+end
+
+function interfaces.doifelsemessage(category,tag)
+ local m = messages[category]
+ return commands.testcase(m and m[tag])
+end
+
+local messagesplitter = lpeg.splitat(",")
+
+function interfaces.makemessage(category,tag,arguments)
+ local m = messages[category]
+ m = (m and (m[tag] or m[tostring(tag)])) or format("unknown message, category '%s', tag '%s'",category,tag)
+ if not m then
+ return m .. " " .. tag
+ elseif not arguments then
+ return m
+ else
+ return format(m,lpegmatch(messagesplitter,arguments))
+ end
+end
+
+function interfaces.showmessage(category,tag,arguments)
+ local m = messages[category]
+ commands.writestatus((m and m.title) or "unknown title",interfaces.makemessage(category,tag,arguments))
+end
+
+function interfaces.setvariable(variable,given)
+--~ variables[given] = variable
+ variables[variable] = given
+end
+
+function interfaces.setconstant(constant,given)
+ constants[given] = constant
+end
+
+-- it's nicer to have numbers as reference than a hash
+
+interfaces.cachedsetups = interfaces.cachedsetups or { }
+interfaces.hashedsetups = interfaces.hashedsetups or { }
+
+storage.register("interfaces.cachedsetups", interfaces.cachedsetups, "interfaces.cachedsetups")
+storage.register("interfaces.hashedsetups", interfaces.hashedsetups, "interfaces.hashedsetups")
+
+local cachedsetups = interfaces.cachedsetups
+local hashedsetups = interfaces.hashedsetups
+
+function interfaces.cachesetup(t)
+ local hash = serialize(t)
+ local done = hashedsetups[hash]
+ if done then
+ return cachedsetups[done]
+ else
+ done = #cachedsetups + 1
+ cachedsetups[done] = t
+ hashedsetups[hash] = done
+ return t
+ end
+end
+
+function interfaces.is_command(str)
+ return (str and str ~= "" and token.csname_name(token.create(str)) ~= "") or false
+end
diff --git a/tex/context/base/mult-ini.mkii b/tex/context/base/mult-ini.mkii
new file mode 100644
index 000000000..c2bb40861
--- /dev/null
+++ b/tex/context/base/mult-ini.mkii
@@ -0,0 +1,935 @@
+%D \module
+%D [ file=mult-ini,
+%D version=2008.10.22, % 1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This 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 \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
+ \def\dofindinterfacemessage##1 #1: ##2\relax##3\end{\def#2{##2}}%
+ \edef\!!stringa{\getvalue{\??ms\currentmessagelibrary} #1: \relax}%
+ \expandafter\dofindinterfacemessage\!!stringa\end}
+
+\def\composemessagetext#1--#2--#3--#4--#5--#6--#7--#8--#9\\%
+ {\def\docomposemessagetext##1,##2,##3,##4,##5,##6,##7,##8,##9\\%
+ {\edef\currentmessagetext{#1##1#2##2#3##3#4##4#5##5#6##6#7##7#8##8}}%
+ \docomposemessagetext}
+
+\def\setmessagetext#1#2%
+ {\def\currentmessagelibrary{#1}%
+ \findinterfacemessage{#2}\currentmessagetext}
+
+\unexpanded\def\getmessage#1#2%
+ {\def\currentmessagelibrary{#1}%
+ \findinterfacemessage{#2}\currentmessagetext
+ \currentmessagetext}
+
+\unexpanded\def\makemessage#1#2#3%
+ {\def\currentmessagelibrary{#1}%
+ \findinterfacemessage{#2}\currentmessagetext
+ \@EA\composemessagetext\currentmessagetext----------------\\#3,,,,,,,,\\%
+ \currentmessagetext}
+
+\def\showmessage#1#2#3%
+ {\def\currentmessagelibrary{#1}%
+ \findinterfacemessage{#2}\currentmessagetext
+ \findinterfacemessage{title}\currentmessagetitle
+ \ifx\currentmessagetext\empty
+ \def\currentmessagetext{<unknown message #2>}%
+ \else
+ \@EA\composemessagetext\currentmessagetext----------------\\#3,,,,,,,,\\%
+ \fi
+ \@EA\writestatus\@EA{\currentmessagetitle}{\currentmessagetext}}
+
+\def\doaddinterfacemessage#1#2%
+ {\findinterfacemessage{#1}\currentmessagetext
+ \doifelsenothing\currentmessagetext
+ {\setxvalue{\??ms\currentmessagelibrary}%
+ {\getvalue{\??ms\currentmessagelibrary} #1: #2\relax}}
+ {\debuggerinfotrue % we consider this an important error
+ \debuggerinfo
+ {message}
+ {duplicate tag #1
+ in library \currentmessagelibrary\space
+ of interface \currentresponses}}%
+ \futurelet\next\getinterfacemessage}
+
+\bgroup
+\obeylines
+\gdef\addinterfacemessage#1: #2
+ {\doaddinterfacemessage{#1}{#2}}%
+\egroup
+
+\def\getinterfacemessage
+ {\ifx\next\stopmessages
+ \egroup\expandafter\gobbleoneargument
+ \else
+ \expandafter\addinterfacemessage
+ \fi}
+
+\let\stopmessages\undefined % for dep checker
+
+\def\startmessages #1 library: #2
+ {\definemessageconstant{#2}% handy for modules
+ \bgroup
+ \obeylines
+ \doifinsetelse{#1}{\currentresponses,all}
+ {\def\next
+ {\def\currentmessagelibrary{#2}%
+ \doifundefined{\??ms\currentmessagelibrary}
+ {\letgvalueempty{\??ms\currentmessagelibrary}}%
+ \futurelet\next\getinterfacemessage}}
+ {\long\def\next##1\stopmessages{\egroup}}%
+ \next}
+
+%D Here, the messages are stored in a way that saves hash
+%D entries, i.e. they are packed in one macro per library.
+%D This was important in the days when we used \TEX's with
+%D hash tables of about 10.000. The next, less efficient way
+%D of storing the message, makes \CONTEXT\ run upto 5\%
+%D faster by storing each message in a macro. In July 2000,
+%D this costs some 185 additional hash entries, and since
+%D we run large \TEX's, let do it!
+
+\def\startmessages #1 library: #2
+ {\definemessageconstant{#2}% handy for modules
+ \bgroup
+ \obeylines
+ \ifcsname\m!prefix!#2\endcsname\else\setgvalue{\m!prefix!#2}{#2}\fi
+ \doifinsetelse{#1}{\currentresponses,all}
+ {\def\next
+ {\def\currentmessagelibrary{#2}%
+ \futurelet\next\getinterfacemessage}}
+ {\long\def\next##1\stopmessages{\egroup}}%
+ \next}
+
+\def\findinterfacemessage#1#2%
+ {\edef#2{\getvalue{\??ms\currentmessagelibrary#1}}}
+
+\def\doaddinterfacemessage#1#2%
+ {\doifdefined{\??ms\currentmessagelibrary#1}
+ {\debuggerinfotrue % we consider this an important error
+ \debuggerinfo
+ {message}
+ {duplicate tag #1
+ in library \currentmessagelibrary\space
+ of interface \currentresponses}}%
+ \setxvalue{\??ms\currentmessagelibrary#1}{#2}%
+ \futurelet\next\getinterfacemessage}
+
+\def\setinterfacemessage#1#2#3%
+ {\ifcsname\m!prefix!#1\endcsname\else\setgvalue{\m!prefix!#1}{#1}\fi
+ \expandafter\def\csname\??ms#1#2\endcsname{#3}}
+
+%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 \<box><width> {12cm}
+%D \<box><height> {3cm}
+%D \stoptyping
+%D
+%D while a similar command for specifying the page dimensions
+%D of an \cap{A4} page results in:
+%D
+%D \starttyping
+%D \<page><width> {21.0cm}
+%D \<page><height> {27.9cm}
+%D \stoptyping
+%D
+%D The prefixes \type{<box>} and \type{<page>} are hidden from
+%D users and can therefore be language independant. Variables
+%D on the other hand, differ for each language:
+%D
+%D \starttyping
+%D \<box><color> {<blue>}
+%D \<box><kleur> {<blauw>}
+%D \<box><couleur> {<blue>}
+%D \stoptyping
+%D
+%D In this example we can see that the assigned values or
+%D keywords are language dependant too. This will be a
+%D complication when defining multi||lingual setup files.
+%D
+%D A third phenomena is that variables and values can have a
+%D similar meaning.
+%D
+%D \starttyping
+%D \<pagenumber><location> {<left>}
+%D \<skip><left> {12cm}
+%D \stoptyping
+%D
+%D A (minor) complication is that where in english we use
+%D \type{<left>}, in dutch we find both \type{<links>} and
+%D \type{<linker>}. This means that when we use some sort of
+%D translation table, we have to distinguish between the
+%D variables at the left side and the fixed values at the
+%D right.
+%D
+%D The same goes for commands that are composed of different
+%D user supplied and/or language specific elements. In english
+%D we can use:
+%D
+%D \starttyping
+%D \<empty><figure>
+%D \<empty><intermezzo>
+%D \stoptyping
+%D
+%D But in dutch we have the following:
+%D
+%D \starttyping
+%D \<lege><figuur>
+%D \<leeg><intermezzo>
+%D \stoptyping
+%D
+%D These subtle differences automatically lead to a solution
+%D where variables, values, elements and other components have
+%D a similar logical name (used in macro's) but a different
+%D meaning (supplied by the user).
+%D
+%D Our solution is one in which the whole system is programmed
+%D in terms of identifiers with language specific meanings. In
+%D such an implementation, each fixed variable is available as:
+%D
+%D \starttyping
+%D \<prefix><variable>
+%D \stoptyping
+%D
+%D This means that for instance:
+%D
+%D \starttyping
+%D \setupbox[width=12cm]
+%D \stoptyping
+%D
+%D expands to something like:
+%D
+%D \starttyping
+%D \def\boxwidth{12cm}
+%D \stoptyping
+%D
+%D because we don't want to recode the source, a setup command
+%D in another language has to expand to this variable, so:
+%D
+%D \starttyping
+%D \setupblock[width=12cm]
+%D \stoptyping
+%D
+%D has to result in the definition of \type{\boxwidth} too.
+%D This method enables us to build compact, fast and readable
+%D code.
+%D
+%D An alternative method, which we considered using, uses a
+%D more indirect way. In this case, both calls generate a
+%D different variable:
+%D
+%D \starttyping
+%D \def\boxwidth {12cm}
+%D \def\boxbreedte {12cm}
+%D \stoptyping
+%D
+%D And because we don't want to recode those megabytes of
+%D already developed code, this variable has to be called with
+%D something like:
+%D
+%D \starttyping
+%D \valueof\box\width
+%D \stoptyping
+%D
+%D where \type{\valueof} takes care of the translation of
+%D \type{width} or \type{breedte} to \type{width} and
+%D combining this with \type{box} to \type{\boxwidth}.
+%D
+%D One advantage of this other scheme is that, within certain
+%D limits, we can implement an interface that can be switched
+%D to another language at will, while the current approach
+%D fixes the interface at startup. There are, by the way,
+%D other reasons too for not choosing this scheme. Switching
+%D user generated commands is for instance impossible and a
+%D dual interface would therefore give a strange mix of
+%D languages.
+%D
+%D Now let's work out the first scheme. Although the left hand
+%D of the assignment is a variable from the users point of
+%D view, it is a constant in terms of the system. Both
+%D \type{width} and \type{breedte} expand to \type{width}
+%D because in the source we only encounter \type{width}. Such
+%D system constants are presented as
+%D
+%D \starttyping
+%D \c!width
+%D \stoptyping
+%D
+%D This constant is always equivalent to \type{width}. As we
+%D can see, we use \type{c!} to mark this one as constant. Its
+%D dutch counterpart is:
+%D
+%D \starttyping
+%D breedte
+%D \stoptyping
+%D
+%D When we interpret a setup command each variable is
+%D translated to it's \type{c!} counterpart. This means that
+%D \type{breedte} and \type{width} expand to \type{breedte}
+%D and \type{\c!width} which both expand to \type{width}. That
+%D way user variables become system constants.
+%D
+%D The interpretation is done by means of a general setup
+%D command \type{\getparameters} that we introduced in the
+%D system module. Let us define some simple setup command:
+%D
+%D \starttyping
+%D \def\setupbox[#1]%
+%D {\getparameters[\??bx][#1]}
+%D \stoptyping
+%D
+%D This command can be used as:
+%D
+%D \starttyping
+%D \setupbox [width=3cm, height=1cm]
+%D \stoptyping
+%D
+%D Afterwards we have two variables \type{\@@bxwidth} and
+%D \type{\@@bxheight} which have the values \type{3cm} and
+%D \type{1cm} assigned. These variables are a combinatiom of
+%D the setup prefix \type{\??bx}, which expands to \type{@@bx}
+%D and the translated user supplied variables \type{width} and
+%D \type{height} or \type{breedte} and \type{hoogte},
+%D depending on the actual language. In dutch we just say:
+%D
+%D \starttyping
+%D \setupblock [width=3cm, height=1cm]
+%D \stoptyping
+%D
+%D and get ourselves \type{\@@bxwidth} and \type{\@@bxheight}
+%D too. In the source of \CONTEXT, we can recognize constants
+%D and variables on their leading \type{c!}, \type{v!} etc.,
+%D prefixes on \type{??} and composed variables on \type{@@}.
+%D
+%D We already saw that user supplied keywords need some
+%D special treatment too. This time we don't translate the
+%D keyword, but instead use in the source a variable which
+%D meaning depends on the interface language.
+%D
+%D \starttyping
+%D \v!left
+%D \stoptyping
+%D
+%D Which can be used in macro's like:
+%D
+%D \starttyping
+%D \processaction
+%D [\@@bxlocation]
+%D [ \v!left=>\dosomethingontheleft,
+%D \v!middle=>\dosomthinginthemiddle,
+%D \v!right=>\dosomethingontheright]
+%D \stoptyping
+%D
+%D Because variables like \type{\@@bxlocation} can have a lot
+%D of meanings, including tricky expandable tokens, we cannot
+%D translate this meaning when we compare. This means that
+%D \type{\@@bxlocation} can be \type{left} of \type{links} of
+%D whatever meaning suits the language. But because
+%D \type{\v!left} also has a meaning that suits the language,
+%D we are able to compare.
+%D
+%D Although we know it sounds confusing we want to state two
+%D important characteristics of the interface as described:
+%D
+%D \startnarrower \em
+%D user variables become system constants
+%D \stopnarrower
+%D
+%D and
+%D
+%D \startnarrower \em
+%D user constants (keywords) become system variables
+%D \stopnarrower
+%D
+
+%D 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<something>}, but in dutch we
+%D have: \type{\stel<iets>in}. Such split elements are no
+%D problem, because we just define two elements. When no second
+%D part is needed, we use a \type{-}:
+
+\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
+ {\the\normalyear.\the\normalmonth.\the\normalday}
+
+\ifx\contextversion\undefined
+ \def\contextversion {unknown}
+ \def\contextversionnumber{0}
+\else
+ \def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi#2\ifnum#3<10 0\fi#3 #4:#5}
+ \edef\contextversionnumber{\expandafter\contextversionnumber\contextversion\relax\space\contextmark}
+\fi
+
+\ifx\undefined\everydump
+ \newtoks\everydump
+ \def\dump{\the\everydump\normaldump}
+\fi
+
+\appendtoks \showcontextbanner \to \everydump
+
+\protect \endinput
diff --git a/tex/context/base/mult-ini.mkiv b/tex/context/base/mult-ini.mkiv
new file mode 100644
index 000000000..e20548f9b
--- /dev/null
+++ b/tex/context/base/mult-ini.mkiv
@@ -0,0 +1,865 @@
+%D \module
+%D [ file=mult-ini,
+%D version=2008.10.22, % 1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This 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}
+
+\def\s!true {true}
+\def\s!false {false}
+
+%D The word \type{height} takes 6~token memory cells. The
+%D control sequence \type{\height} on the other hand uses only
+%D one. Knowing this, we can improve the performance of \TEX,
+%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}
+\def\!!spread{spread}
+
+%D Kind of special:
+
+\edef\!!TLT{\detokenize{TLT}}
+\edef\!!TRT{\detokenize{TRT}}
+
+%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
+
+\unexpanded\def\defineinterfaceconstant #1#2{\setvalue{\c!prefix!#1}{#2}}
+\unexpanded\def\defineinterfacevariable #1#2{\setvalue{\v!prefix!#1}{#2}}
+\unexpanded\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
+
+\unexpanded\def\definereferenceconstant #1#2{\setvalue{\r!prefix!#1}{#2}}
+\unexpanded\def\definefileconstant #1#2{\setvalue{\f!prefix!#1}{#2}}
+
+%D A new one:
+
+\unexpanded\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
+
+\unexpanded\def\definesystemconstant #1{\setvalue{\s!prefix!#1}{#1}}
+\unexpanded\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
+
+\unexpanded\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
+
+\unexpanded\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}.
+
+\unexpanded\def\startmessages #1 library: #2 %
+ {\bgroup
+ \ifcsname\m!prefix!#2\endcsname\else\setgvalue{\m!prefix!#2}{#2}\fi
+ \catcode13=\active
+ \doifinsetelse{#1}{\currentresponses,all}\dostartmessages\nostartmessages{#2}}
+
+\def\dostartmessages#1#2\stopmessages
+ {\ctxlua{interfaces.setmessages("#1",\!!bs#2\!!es)}%
+ \egroup}
+
+\def\nostartmessages#1#2\stopmessages
+ {\egroup}
+
+\def\setinterfacemessage#1#2#3%
+ {\ifcsname\m!prefix!#1\endcsname\else\setgvalue{\m!prefix!#1}{#1}\fi
+ \ctxlua{interfaces.setmessage("#1","#2",\!!bs#3\!!es)}}
+
+\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.getmessage("#1","#2"))}}}
+\unexpanded\def\doifelsemessage #1#2{\ctxlua{interfaces.doifelsemessage("#1","#2")}}
+\unexpanded\def\getmessage #1#2{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.getmessage("#1","#2"))}}
+\unexpanded\def\getmessagedefault#1#2#3{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.getmessage("#1","#2","#3"))}}
+\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 \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 The additional \type {\c!internal!n} prefixing is no longer
+%D needed as we now have separate interface files when dealing
+%D with setups (quick ref docs) and no longer reload the whole
+%D interface. (We no longer need the link back to the main
+%D internal interface.)
+
+\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 \<box><width> {12cm}
+%D \<box><height> {3cm}
+%D \stoptyping
+%D
+%D while a similar command for specifying the page dimensions
+%D of an \cap{A4} page results in:
+%D
+%D \starttyping
+%D \<page><width> {21.0cm}
+%D \<page><height> {27.9cm}
+%D \stoptyping
+%D
+%D The prefixes \type{<box>} and \type{<page>} are hidden from
+%D users and can therefore be language independant. Variables
+%D on the other hand, differ for each language:
+%D
+%D \starttyping
+%D \<box><color> {<blue>}
+%D \<box><kleur> {<blauw>}
+%D \<box><couleur> {<blue>}
+%D \stoptyping
+%D
+%D In this example we can see that the assigned values or
+%D keywords are language dependant too. This will be a
+%D complication when defining multi||lingual setup files.
+%D
+%D A third phenomena is that variables and values can have a
+%D similar meaning.
+%D
+%D \starttyping
+%D \<pagenumber><location> {<left>}
+%D \<skip><left> {12cm}
+%D \stoptyping
+%D
+%D A (minor) complication is that where in english we use
+%D \type{<left>}, in dutch we find both \type{<links>} and
+%D \type{<linker>}. This means that when we use some sort of
+%D translation table, we have to distinguish between the
+%D variables at the left side and the fixed values at the
+%D right.
+%D
+%D The same goes for commands that are composed of different
+%D user supplied and/or language specific elements. In english
+%D we can use:
+%D
+%D \starttyping
+%D \<empty><figure>
+%D \<empty><intermezzo>
+%D \stoptyping
+%D
+%D But in dutch we have the following:
+%D
+%D \starttyping
+%D \<lege><figuur>
+%D \<leeg><intermezzo>
+%D \stoptyping
+%D
+%D These subtle differences automatically lead to a solution
+%D where variables, values, elements and other components have
+%D a similar logical name (used in macro's) but a different
+%D meaning (supplied by the user).
+%D
+%D Our solution is one in which the whole system is programmed
+%D in terms of identifiers with language specific meanings. In
+%D such an implementation, each fixed variable is available as:
+%D
+%D \starttyping
+%D \<prefix><variable>
+%D \stoptyping
+%D
+%D This means that for instance:
+%D
+%D \starttyping
+%D \setupbox[width=12cm]
+%D \stoptyping
+%D
+%D expands to something like:
+%D
+%D \starttyping
+%D \def\boxwidth{12cm}
+%D \stoptyping
+%D
+%D because we don't want to recode the source, a setup command
+%D in another language has to expand to this variable, so:
+%D
+%D \starttyping
+%D \setupblock[width=12cm]
+%D \stoptyping
+%D
+%D has to result in the definition of \type{\boxwidth} too.
+%D This method enables us to build compact, fast and readable
+%D code.
+%D
+%D An alternative method, which we considered using, uses a
+%D more indirect way. In this case, both calls generate a
+%D different variable:
+%D
+%D \starttyping
+%D \def\boxwidth {12cm}
+%D \def\boxbreedte {12cm}
+%D \stoptyping
+%D
+%D And because we don't want to recode those megabytes of
+%D already developed code, this variable has to be called with
+%D something like:
+%D
+%D \starttyping
+%D \valueof\box\width
+%D \stoptyping
+%D
+%D where \type{\valueof} takes care of the translation of
+%D \type{width} or \type{breedte} to \type{width} and
+%D combining this with \type{box} to \type{\boxwidth}.
+%D
+%D One advantage of this other scheme is that, within certain
+%D limits, we can implement an interface that can be switched
+%D to another language at will, while the current approach
+%D fixes the interface at startup. There are, by the way,
+%D other reasons too for not choosing this scheme. Switching
+%D user generated commands is for instance impossible and a
+%D dual interface would therefore give a strange mix of
+%D languages.
+%D
+%D Now let's work out the first scheme. Although the left hand
+%D of the assignment is a variable from the users point of
+%D view, it is a constant in terms of the system. Both
+%D \type{width} and \type{breedte} expand to \type{width}
+%D because in the source we only encounter \type{width}. Such
+%D system constants are presented as
+%D
+%D \starttyping
+%D \c!width
+%D \stoptyping
+%D
+%D This constant is always equivalent to \type{width}. As we
+%D can see, we use \type{c!} to mark this one as constant. Its
+%D dutch counterpart is:
+%D
+%D \starttyping
+%D breedte
+%D \stoptyping
+%D
+%D When we interpret a setup command each variable is
+%D translated to it's \type{c!} counterpart. This means that
+%D \type{breedte} and \type{width} expand to \type{breedte}
+%D and \type{\c!width} which both expand to \type{width}. That
+%D way user variables become system constants.
+%D
+%D The interpretation is done by means of a general setup
+%D command \type{\getparameters} that we introduced in the
+%D system module. Let us define some simple setup command:
+%D
+%D \starttyping
+%D \unexpanded\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 \stelblokin [breedte=3cm,hoogte=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 the time that
+%D the user interface documents were not using a specification
+%D alongside a keyword specification but used a shared file in
+%D which case we need to go in both directions.
+
+\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.
+
+\unexpanded\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<something>}, but in dutch we
+%D have: \type{\stel<iets>in}. Such split elements are no
+%D problem, because we just define two elements. When no second
+%D part is needed, we use a \type{-}:
+
+\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:
+
+\unexpanded\def\startvariables{\gobbleuntil\stopvariables}
+\unexpanded\def\startconstants{\gobbleuntil\stopconstants}
+\unexpanded\def\startelements {\gobbleuntil\stopelements}
+\unexpanded\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
+ {\the\normalyear .\the\normalmonth.\the\normalday}
+
+\ifx\contextversion\undefined
+ \def\contextversion {unknown}
+ \def\contextversionnumber{0}
+\else
+ \def\contextversionnumber#1.#2.#3 #4:#5\relax{#1\ifnum#2<10 0\fi#2\ifnum#3<10 0\fi#3 #4:#5}
+ \edef\contextversionnumber{\expandafter\contextversionnumber\contextversion\relax\space\contextmark}
+\fi
+
+\ifx\undefined\everydump
+ \newtoks\everydump
+ \def\dump{\the\everydump\normaldump}
+\fi
+
+\appendtoks \showcontextbanner \to \everydump
+
+\protect \endinput
diff --git a/tex/context/base/mult-it.tex b/tex/context/base/mult-it.tex
new file mode 100644
index 000000000..ce14800de
--- /dev/null
+++ b/tex/context/base/mult-it.tex
@@ -0,0 +1,1693 @@
+% 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{answerarea}{answerarea}
+\setinterfacevariable{appendices}{appendici}
+\setinterfacevariable{appendix}{appendice}
+\setinterfacevariable{april}{aprile}
+\setinterfacevariable{atmargin}{almargine}
+\setinterfacevariable{atpage}{apagina}
+\setinterfacevariable{august}{agosto}
+\setinterfacevariable{author}{autore}
+\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{bbl}{bbl}
+\setinterfacevariable{before}{prima}
+\setinterfacevariable{begin}{begin}
+\setinterfacevariable{bib}{bib}
+\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{cite}{cite}
+\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{down}{down}
+\setinterfacevariable{each}{ogni}
+\setinterfacevariable{edge}{bordo}
+\setinterfacevariable{empty}{vuoto}
+\setinterfacevariable{end}{end}
+\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{layer}{layer}
+\setinterfacevariable{left}{sinistra}
+\setinterfacevariable{leftedge}{bordosinistro}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{marginesinistro}
+\setinterfacevariable{leftpage}{paginasinistra}
+\setinterfacevariable{lefttoright}{lefttoright}
+\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{maxdepth}{maxdepth}
+\setinterfacevariable{maxheight}{maxheight}
+\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{may}{maggio}
+\setinterfacevariable{mediaeval}{medievale}
+\setinterfacevariable{medium}{medio}
+\setinterfacevariable{middle}{centro}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{mindepth}{mindepth}
+\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{note}{note}
+\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{overbar}{sopralinea}
+\setinterfacevariable{overbars}{sopralinee}
+\setinterfacevariable{overlay}{sovrapponi}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{overstrike}{sbarrato}
+\setinterfacevariable{overstrikes}{sbarrati}
+\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{righttoleft}{righttoleft}
+\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{short}{short}
+\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{starter}{starter}
+\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{subsubsubsubsubsubsection}{sottosottosottosottosottosottocapoverso}
+\setinterfacevariable{subsubsubsubsubsubsubject}{sottosottosottosottosottosottoargomento}
+\setinterfacevariable{subsubsubsubsubsubsubsection}{sottosottosottosottosottosottosottocapoverso}
+\setinterfacevariable{subsubsubsubsubsubsubsubject}{sottosottosottosottosottosottosottoargomento}
+\setinterfacevariable{subsubsubsubsubsubsubsubsection}{sottosottosottosottosottosottosottosottocapoverso}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubject}{sottosottosottosottosottosottosottosottoargomento}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsection}{sottosottosottosottosottosottosottosottosottocapoverso}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsubject}{sottosottosottosottosottosottosottosottosottoargomento}
+\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{underbar}{sottolinea}
+\setinterfacevariable{underbars}{sottolinee}
+\setinterfacevariable{unit}{unita}
+\setinterfacevariable{units}{unita}
+\setinterfacevariable{unknown}{ignoto}
+\setinterfacevariable{unpacked}{unpacked}
+\setinterfacevariable{up}{up}
+\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{alignsymbol}{alignsymbol}
+\setinterfaceconstant{aligntitle}{allineatitolo}
+\setinterfaceconstant{alternative}{alternativa}
+\setinterfaceconstant{andtext}{andtext}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{freccia}
+\setinterfaceconstant{artauthor}{artauthor}
+\setinterfaceconstant{artauthoretaldisplay}{artauthoretaldisplay}
+\setinterfaceconstant{artauthoretallimit}{artauthoretallimit}
+\setinterfaceconstant{artauthoretaltext}{artauthoretaltext}
+\setinterfaceconstant{at}{ad}
+\setinterfaceconstant{author}{autore}
+\setinterfaceconstant{authoretaldisplay}{authoretaldisplay}
+\setinterfaceconstant{authoretallimit}{authoretallimit}
+\setinterfaceconstant{authoretaltext}{authoretaltext}
+\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{bottomafter}{bottomafter}
+\setinterfaceconstant{bottombefore}{bottombefore}
+\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{connector}{connector}
+\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{database}{database}
+\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{editor}{editor}
+\setinterfaceconstant{editoretaldisplay}{editoretaldisplay}
+\setinterfaceconstant{editoretallimit}{editoretallimit}
+\setinterfaceconstant{editoretaltext}{editoretaltext}
+\setinterfaceconstant{empty}{vuoto}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{marginepari}
+\setinterfaceconstant{expansion}{espansione}
+\setinterfaceconstant{export}{export}
+\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{filtercommand}{filtercommand}
+\setinterfaceconstant{finalnamesep}{finalnamesep}
+\setinterfaceconstant{firstnamesep}{firstnamesep}
+\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{headalign}{headalign}
+\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{hidenumber}{hidenumber}
+\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{intent}{intent}
+\setinterfaceconstant{interaction}{interazione}
+\setinterfaceconstant{interlinespace}{interlinea}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{elementi}
+\setinterfaceconstant{juniorsep}{juniorsep}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{parolachiave}
+\setinterfaceconstant{label}{etichetta}
+\setinterfaceconstant{lastnamesep}{lastnamesep}
+\setinterfaceconstant{lastpubsep}{lastpubsep}
+\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{maxdepth}{maxdepth}
+\setinterfaceconstant{maxheight}{altezzamax}
+\setinterfaceconstant{maxwidth}{ampiezzamax}
+\setinterfaceconstant{maybeyear}{maybeyear}
+\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{monthconversion}{monthconversion}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{nome}
+\setinterfaceconstant{namesep}{namesep}
+\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{numberconversion}{numberconversion}
+\setinterfaceconstant{numberconversionset}{numberconversionset}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numerazione}
+\setinterfaceconstant{numberorder}{numberorder}
+\setinterfaceconstant{numberprefix}{numberprefix}
+\setinterfaceconstant{numbersegments}{numbersegments}
+\setinterfaceconstant{numberseparator}{separatorenumero}
+\setinterfaceconstant{numberseparatorset}{numberseparatorset}
+\setinterfaceconstant{numberset}{numberset}
+\setinterfaceconstant{numberstarter}{numberstarter}
+\setinterfaceconstant{numberstopper}{numberstopper}
+\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{order}{order}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{otherstext}{otherstext}
+\setinterfaceconstant{outermargin}{margineesterno}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{numeroproprio}
+\setinterfaceconstant{page}{pagina}
+\setinterfaceconstant{pageboundaries}{limitipagina}
+\setinterfaceconstant{pagecolor}{colorepagina}
+\setinterfaceconstant{pagecommand}{comandopagina}
+\setinterfaceconstant{pageconversion}{pageconversion}
+\setinterfaceconstant{pageconversionset}{pageconversionset}
+\setinterfaceconstant{pagenumber}{numeropagina}
+\setinterfaceconstant{pageprefix}{pageprefix}
+\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
+\setinterfaceconstant{pageprefixconversion}{pageprefixconversion}
+\setinterfaceconstant{pageprefixconversionset}{pageprefixconversionset}
+\setinterfaceconstant{pageprefixsegments}{pageprefixsegments}
+\setinterfaceconstant{pageprefixseparatorset}{pageprefixseparatorset}
+\setinterfaceconstant{pageprefixset}{pageprefixset}
+\setinterfaceconstant{pageprefixstarter}{pageprefixstarter}
+\setinterfaceconstant{pageprefixstopper}{pageprefixstopper}
+\setinterfaceconstant{pagesegments}{pagesegments}
+\setinterfaceconstant{pageseparatorset}{pageseparatorset}
+\setinterfaceconstant{pageset}{pageset}
+\setinterfaceconstant{pagestarter}{pagestarter}
+\setinterfaceconstant{pagestate}{statopagina}
+\setinterfaceconstant{pagestopper}{pagestopper}
+\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{prefixconnector}{prefixconnector}
+\setinterfaceconstant{prefixconversion}{prefixconversion}
+\setinterfaceconstant{prefixconversionset}{prefixconversionset}
+\setinterfaceconstant{prefixsegments}{prefixsegments}
+\setinterfaceconstant{prefixseparatorset}{prefixseparatorset}
+\setinterfaceconstant{prefixset}{prefixset}
+\setinterfaceconstant{prefixstarter}{prefixstarter}
+\setinterfaceconstant{prefixstopper}{prefixstopper}
+\setinterfaceconstant{preset}{preimpostato}
+\setinterfaceconstant{preview}{anteprima}
+\setinterfaceconstant{previous}{precedente}
+\setinterfaceconstant{previousnumber}{numeroprecedente}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{pubsep}{pubsep}
+\setinterfaceconstant{radius}{raggio}
+\setinterfaceconstant{random}{casuale}
+\setinterfaceconstant{range}{range}
+\setinterfaceconstant{reduction}{riduzione}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{refcommand}{refcommand}
+\setinterfaceconstant{reference}{riferimento}
+\setinterfaceconstant{referenceprefix}{referenceprefix}
+\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{samplesize}{samplesize}
+\setinterfaceconstant{saveinlist}{saveinlist}
+\setinterfaceconstant{scale}{scala}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{schermo}
+\setinterfaceconstant{section}{sezione}
+\setinterfaceconstant{sectionconversion}{sectionconversion}
+\setinterfaceconstant{sectionconversionset}{sectionconversionset}
+\setinterfaceconstant{sectionnumber}{numerosezione}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
+\setinterfaceconstant{sectionsegments}{sectionsegments}
+\setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
+\setinterfaceconstant{sectionset}{sectionset}
+\setinterfaceconstant{sectionstarter}{sectionstarter}
+\setinterfaceconstant{sectionstopper}{sectionstopper}
+\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{sort}{sort}
+\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{starter}{starter}
+\setinterfaceconstant{state}{stato}
+\setinterfaceconstant{step}{passo}
+\setinterfaceconstant{stop}{termina}
+\setinterfaceconstant{stopper}{stopper}
+\setinterfaceconstant{stretch}{dilata}
+\setinterfaceconstant{strip}{strip}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{stile}
+\setinterfaceconstant{sub}{sotto}
+\setinterfaceconstant{subtitle}{sottotitolo}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{surnamesep}{surnamesep}
+\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{synonymcommand}{synonymcommand}
+\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{totalnumber}{totalnumber}
+\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{vonsep}{vonsep}
+\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{answerlines}{answerlines}
+\setinterfaceelement{answerspace}{answerspace}
+\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{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{setupanswerarea}{setupanswerarea}
+\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{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-mcs.tex b/tex/context/base/mult-mcs.tex
new file mode 100644
index 000000000..98c392c9f
--- /dev/null
+++ b/tex/context/base/mult-mcs.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{neznama reference --}
+\setinterfacemessage{references}{3}{neznamy typ reference --}
+\setinterfacemessage{references}{2}{duplicitni reference -- na strane --}
+\setinterfacemessage{references}{4}{nedovolena reference --}
+\setinterfacemessage{references}{30}{neznamy objekt --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{reference}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{duplicitni object --}
+\setinterfacemessage{references}{21}{dokument -- nacten}
+\setinterfacemessage{references}{22}{dokument -- neni interaktivni}
+\setinterfacemessage{references}{23}{obskurni (nejasna) reference -- (prefix=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{number --}
+\setinterfacemessage{handlings}{1}{font handling --}
+\setinterfacemessage{handlings}{3}{unknown font handling --}
+\setinterfacemessage{handlings}{2}{font handling -- is loaded}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{system}
+\setinterfacemessage{systems}{41}{externi soubor -- ve skupine -- neexistuje}
+\setinterfacemessage{systems}{9}{-- nenalezeno/nezpracovano}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{nova verze pomocneho souboru, je treba druheho behu}
+\setinterfacemessage{systems}{21}{pomocny soubor necten}
+\setinterfacemessage{systems}{20}{vyznam (trideni) -- nacten}
+\setinterfacemessage{systems}{5}{makra z -- nactena}
+\setinterfacemessage{systems}{4}{prikaz -- je jiz definovan}
+\setinterfacemessage{systems}{27}{verze}
+\setinterfacemessage{systems}{26}{registry}
+\setinterfacemessage{systems}{25}{reference}
+\setinterfacemessage{systems}{24}{plovouci bloky}
+\setinterfacemessage{systems}{1}{nacteni pomocneho souboru odlozeno (typemode)}
+\setinterfacemessage{systems}{23}{-- upraveno na --}
+\setinterfacemessage{systems}{22}{pouzijte platny pomocny soubor}
+\setinterfacemessage{systems}{2}{-- nacteno}
+\setinterfacemessage{systems}{19}{vyznam (synonyma) -- nacten}
+\setinterfacemessage{systems}{18}{synonymum -- -- neexistuje}
+\setinterfacemessage{systems}{7}{makra z -- jsou jiz nactena}
+\setinterfacemessage{systems}{6}{zadna makra v -- nenalezena}
+\setinterfacemessage{systems}{14}{vynucena nova stranka v seznamu na --}
+\setinterfacemessage{systems}{15}{uklada se buffer --}
+\setinterfacemessage{systems}{16}{sazi se buffer --}
+\setinterfacemessage{systems}{17}{sazi se doslovny (verbatim) buffer --}
+\setinterfacemessage{systems}{13}{znacka -- definovana --}
+\setinterfacemessage{systems}{12}{pomosny soubor neni setriden, pouzijte texutil}
+\setinterfacemessage{systems}{11}{vytvarim jednoduchy pomocny soubor}
+\setinterfacemessage{systems}{10}{nepouzivejte em v --}
+\setinterfacemessage{floatblocks}{1}{-- precislovano / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- presunuto}
+\setinterfacemessage{floatblocks}{2}{-- ulozeno}
+\setinterfacemessage{floatblocks}{5}{poradi prizpusobeno}
+\setinterfacemessage{floatblocks}{4}{-- umisteno}
+\setinterfacemessage{floatblocks}{7}{pocet spodnich plovoucich objektu je omezen na --}
+\setinterfacemessage{floatblocks}{6}{pocet hornich plovoucich objektu je omezen na --}
+\setinterfacemessage{floatblocks}{9}{poradi naruseno}
+\setinterfacemessage{floatblocks}{8}{radku je mene nez --}
+\setinterfacemessage{floatblocks}{title}{plovouciobjekty}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{nedefinovano}
+\setinterfacemessage{floatblocks}{11}{nedan zadny blok}
+\setinterfacemessage{floatblocks}{10}{-- omezeno}
+\setinterfacemessage{interactions}{1}{pomer -- x -- (s x v)}
+\setinterfacemessage{interactions}{3}{neaktivni}
+\setinterfacemessage{interactions}{2}{aktivni}
+\setinterfacemessage{interactions}{5}{unknown attachment --}
+\setinterfacemessage{interactions}{4}{zadna strankova synchronizace (--) v hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- does not exist}
+\setinterfacemessage{interactions}{title}{interakce}
+\setinterfacemessage{interactions}{21}{-- kod vlozen}
+\setinterfacemessage{regimes}{1}{kodovani --}
+\setinterfacemessage{regimes}{3}{nezname kodovani --}
+\setinterfacemessage{regimes}{2}{je nacteno kodovani --}
+\setinterfacemessage{regimes}{title}{kodovani}
+\setinterfacemessage{structures}{1}{zacatek oddilu (sekce) --}
+\setinterfacemessage{structures}{title}{struktury}
+\setinterfacemessage{structures}{2}{konec oddilu (sekce) --}
+\setinterfacemessage{linguals}{1}{vzory -- pro -- nacteny (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{deleni slov -- pro -- nacteno (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{zadne vzory -- pro -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{vzory pro -- nenacteny}
+\setinterfacemessage{linguals}{4}{zadne deleni slov -- pro -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{specificke volby jazyka [--] zavadeji -- (zavlecenou) mezeru}
+\setinterfacemessage{linguals}{6}{jazyk -- neni definovan}
+\setinterfacemessage{linguals}{9}{language -- is active}
+\setinterfacemessage{linguals}{8}{specificke volby jazyka [--] bez mezer pripojeny}
+\setinterfacemessage{linguals}{title}{jazyky}
+\setinterfacemessage{linguals}{10}{vzory --nacteny}
+\setinterfacemessage{verbatims}{1}{soubor -- neexistuje}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{filter -- is loaded}
+\setinterfacemessage{filters}{title}{filter}
+\setinterfacemessage{filters}{2}{unknown filter --}
+\setinterfacemessage{textblocks}{1}{nova verze, je treba druhy beh}
+\setinterfacemessage{textblocks}{3}{ctu bloky z --}
+\setinterfacemessage{textblocks}{2}{zapisuji bloky do --}
+\setinterfacemessage{textblocks}{5}{-- neni skryto}
+\setinterfacemessage{textblocks}{4}{je treba druhy beh}
+\setinterfacemessage{textblocks}{7}{-- skryto}
+\setinterfacemessage{textblocks}{6}{-- skryto a zpracovano}
+\setinterfacemessage{textblocks}{9}{-- nevysazeno}
+\setinterfacemessage{textblocks}{8}{-- vysazeno}
+\setinterfacemessage{textblocks}{title}{textovyblok}
+\setinterfacemessage{textblocks}{12}{-- preskoceno}
+\setinterfacemessage{textblocks}{11}{-- nacteno a vysazeno}
+\setinterfacemessage{textblocks}{10}{-- nacteno a zpracovano}
+\setinterfacemessage{encodings}{1}{kodovani --}
+\setinterfacemessage{encodings}{3}{nezname kodovani --}
+\setinterfacemessage{encodings}{2}{je nacteno kodovani --}
+\setinterfacemessage{encodings}{title}{kodovani}
+\setinterfacemessage{columns}{1}{je mozno pouze -- sloupcu}
+\setinterfacemessage{columns}{3}{problem, vypina se vyvazovani}
+\setinterfacemessage{columns}{2}{pouzijte \string\filbreak\space jako alternativu}
+\setinterfacemessage{columns}{5}{spodni plovouci objekt jeste neni podporovan}
+\setinterfacemessage{columns}{4}{horni plovouci objekt jeste neni podporovan}
+\setinterfacemessage{columns}{7}{vyvazovani ukonceno po 100 krocich}
+\setinterfacemessage{columns}{6}{-- plovouci objekt(y) odlozeny}
+\setinterfacemessage{columns}{9}{kontrola nerovnost}
+\setinterfacemessage{columns}{8}{vyvazeno v -- krocich}
+\setinterfacemessage{columns}{title}{sloupce}
+\setinterfacemessage{columns}{13}{siroky plovouci objekt je presunut nad sloupce}
+\setinterfacemessage{columns}{12}{plovouci objekt je presunut do nasledujiciho sloupce / --}
+\setinterfacemessage{columns}{11}{plovouci objekt je pro sloupec prilis siroky}
+\setinterfacemessage{columns}{10}{zbyl (mene nez) 1 radek}
+\setinterfacemessage{symbols}{1}{nacita se soubor symbolu --}
+\setinterfacemessage{symbols}{title}{symboly}
+\setinterfacemessage{files}{1}{synonymum souboru -- je jiz pouzito pro --}
+\setinterfacemessage{files}{title}{soubory}
+\setinterfacemessage{versions}{1}{postradam @+}
+\setinterfacemessage{versions}{3}{oznacene strany: --}
+\setinterfacemessage{versions}{2}{oznacuji se strany}
+\setinterfacemessage{versions}{title}{verze}
+\setinterfacemessage{specials}{1}{-- nacteno}
+\setinterfacemessage{specials}{3}{-- je resetovano}
+\setinterfacemessage{specials}{2}{neni dovoleno hlubsi zanoreni --}
+\setinterfacemessage{specials}{5}{nacita se definicni soubor --}
+\setinterfacemessage{specials}{4}{prikaz -- neexistuje}
+\setinterfacemessage{specials}{7}{neznamy ovladac (driver) --}
+\setinterfacemessage{specials}{6}{zanoreni neni dovoleno}
+\setinterfacemessage{specials}{title}{speciality}
+\setinterfacemessage{layouts}{1}{vyska textu prizpusobena s -- na strane --}
+\setinterfacemessage{layouts}{3}{-- krat text odlozen}
+\setinterfacemessage{layouts}{2}{-- krat odlozeny text umisten}
+\setinterfacemessage{layouts}{5}{okrajove bloky neaktivni}
+\setinterfacemessage{layouts}{4}{okrajove bloky aktivni}
+\setinterfacemessage{layouts}{7}{pocita se misto pro logo}
+\setinterfacemessage{layouts}{6}{sada stran -- zpracovana (velikost --)}
+\setinterfacemessage{layouts}{9}{aktualne ne vice nez -- urovne/urovni vyctu}
+\setinterfacemessage{layouts}{8}{pocita se pozadi}
+\setinterfacemessage{layouts}{title}{layout}
+\setinterfacemessage{layouts}{11}{svisla mezera -- neni povolena v pevnem radkovem rejstriku}
+\setinterfacemessage{layouts}{10}{-- a -- nedava dohromady 1.0}
+\setinterfacemessage{fonts}{1}{kodovani --}
+\setinterfacemessage{fonts}{3}{neznama varianta --}
+\setinterfacemessage{fonts}{2}{varianta -- je nactena}
+\setinterfacemessage{fonts}{5}{styl -- neni definovan}
+\setinterfacemessage{fonts}{4}{zakladni font -- neni definovan}
+\setinterfacemessage{fonts}{7}{neznamy format --}
+\setinterfacemessage{fonts}{6}{-- je nacten}
+\setinterfacemessage{fonts}{14}{bodyfont -- is defined (can better be done global)}
+\setinterfacemessage{fonts}{8}{styl -- definovan}
+\setinterfacemessage{fonts}{title}{zakladnifont}
+\setinterfacemessage{fonts}{10}{neznamy font --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{global file --}
+\setinterfacemessage{databases}{2}{local file --}
+\setinterfacemessage{databases}{4}{unknown file --}
+\setinterfacemessage{databases}{title}{databases}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{nacita se soubor skriptu --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{neznama preambule --}
+\setinterfacemessage{check}{1}{postradam '=' po '--' na radku --}
+\setinterfacemessage{check}{3}{-- -- nahrazuje makro, uzijte VERZALKY!}
+\setinterfacemessage{check}{2}{ocekavam -- argument(y) na radku --}
+\setinterfacemessage{check}{title}{kontrola}
+\setinterfacemessage{metapost}{1}{loading metapost library --}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{obraz -- nelze nalezt}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{obraz -- nepritomen}
+\setinterfacemessage{figures}{5}{dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{dimenze obrazu -- nacteny primo z jeho souboru}
+\setinterfacemessage{figures}{6}{dimenze obrazu -- spocteny programem rlxtools}
+\setinterfacemessage{figures}{8}{obrazovy objekt -- je znovu pouzit}
+\setinterfacemessage{figures}{title}{obrazy}
+\setinterfacemessage{colors}{1}{system -- je globalne aktivovana}
+\setinterfacemessage{colors}{3}{-- neni definovana --}
+\setinterfacemessage{colors}{2}{system -- je lokalne activovana}
+\setinterfacemessage{colors}{5}{neznamy system --}
+\setinterfacemessage{colors}{4}{system -- je nacten}
+\setinterfacemessage{colors}{7}{palette -- neni k dispozici}
+\setinterfacemessage{colors}{6}{palette -- je k dispozici}
+\setinterfacemessage{colors}{9}{-- prostor barev neni podporovan}
+\setinterfacemessage{colors}{8}{specifikace -- v barve -- bude cerna}
+\setinterfacemessage{colors}{title}{barva}
+\setinterfacemessage{colors}{12}{-- is registered}
+\setinterfacemessage{colors}{11}{barva je prevedena na sed}
+\setinterfacemessage{colors}{10}{-- prostor barev je podporovan}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-mde.tex b/tex/context/base/mult-mde.tex
new file mode 100644
index 000000000..4da89ba33
--- /dev/null
+++ b/tex/context/base/mult-mde.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{unbekannte Referenz --}
+\setinterfacemessage{references}{3}{unbekannte Referenz Typ --}
+\setinterfacemessage{references}{2}{doppelte Referenz -- auf Seite --}
+\setinterfacemessage{references}{4}{illegale Referenz --}
+\setinterfacemessage{references}{30}{unbekanntes Object --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{referenzen}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{doppeltes Object --}
+\setinterfacemessage{references}{21}{Dokument -- geladen}
+\setinterfacemessage{references}{22}{Dokument -- ist nicht aktiv}
+\setinterfacemessage{references}{23}{Obskure Referenz -- (Prefix=--)}
+\setinterfacemessage{documents}{1}{Blatt --}
+\setinterfacemessage{documents}{title}{Blaetter}
+\setinterfacemessage{documents}{2}{Nummer --}
+\setinterfacemessage{handlings}{1}{Font Verarbeitung --}
+\setinterfacemessage{handlings}{3}{unknown font handling --}
+\setinterfacemessage{handlings}{2}{Font Verarbeitung -- ist geladen}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{system}
+\setinterfacemessage{systems}{41}{Externe Datei -- in Gruppe -- existiert nicht}
+\setinterfacemessage{systems}{9}{-- nicht gefunden/verarbeitet}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{Neue Version der Hilfsdatei, zweiter Durchlauf benoetigt}
+\setinterfacemessage{systems}{21}{Die Hilfsdatei ist nicht geladen}
+\setinterfacemessage{systems}{20}{Bedeutung (sortieren) von -- geladen}
+\setinterfacemessage{systems}{5}{Modul -- geladen}
+\setinterfacemessage{systems}{4}{Befehl -- ist bereits definiert}
+\setinterfacemessage{systems}{27}{Version}
+\setinterfacemessage{systems}{26}{Register}
+\setinterfacemessage{systems}{25}{Referenzen}
+\setinterfacemessage{systems}{24}{Fliessbloecke}
+\setinterfacemessage{systems}{1}{Laden der Hilfsdatei aufgeschoben (Eingabe-Modus)}
+\setinterfacemessage{systems}{23}{-- angeordnet auf --}
+\setinterfacemessage{systems}{22}{Benoetige gueltige Hilfsdateie}
+\setinterfacemessage{systems}{2}{-- geladen}
+\setinterfacemessage{systems}{19}{Bedeutung (synonyme) von -- geladen}
+\setinterfacemessage{systems}{18}{Synonym -- -- existiert nicht}
+\setinterfacemessage{systems}{7}{Modul -- bereits geladen}
+\setinterfacemessage{systems}{6}{Modul -- gefunden}
+\setinterfacemessage{systems}{14}{Erzwungendes Seitenumbruch in Liste bei --}
+\setinterfacemessage{systems}{15}{Speichere Buffer --}
+\setinterfacemessage{systems}{16}{Setzte Buffer --}
+\setinterfacemessage{systems}{17}{Setzte tippen-Buffer --}
+\setinterfacemessage{systems}{13}{Beschriftung -- definiert --}
+\setinterfacemessage{systems}{12}{Die Hilfdatei ist nicht sortiert, verwende texutil}
+\setinterfacemessage{systems}{11}{Erstelle einfache Hilfdatei}
+\setinterfacemessage{systems}{10}{Benutzte kein em in --}
+\setinterfacemessage{floatblocks}{1}{-- neu nummeriert / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- verschoben}
+\setinterfacemessage{floatblocks}{2}{-- gespeichert}
+\setinterfacemessage{floatblocks}{5}{Reihenfolge angepasst}
+\setinterfacemessage{floatblocks}{4}{-- plaziert}
+\setinterfacemessage{floatblocks}{7}{Anz. der unteren Gleitobjekte beschraengt auf --}
+\setinterfacemessage{floatblocks}{6}{Anz. der oberen Gleitobjekte beschraengt auf --}
+\setinterfacemessage{floatblocks}{9}{Reigenfolge gestoert}
+\setinterfacemessage{floatblocks}{8}{weniger als -- zeilen}
+\setinterfacemessage{floatblocks}{title}{Gleitobjektbloecke}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{undefiniert}
+\setinterfacemessage{floatblocks}{11}{kein Block gegeben}
+\setinterfacemessage{floatblocks}{10}{-- begrenzt}
+\setinterfacemessage{interactions}{1}{Seitenverhaeltnis -- x -- (B x H)}
+\setinterfacemessage{interactions}{3}{inaktiv}
+\setinterfacemessage{interactions}{2}{aktiv}
+\setinterfacemessage{interactions}{5}{unknown attachment --}
+\setinterfacemessage{interactions}{4}{keine Seitensynchronisation (--) im hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- does not exist}
+\setinterfacemessage{interactions}{title}{Interaktion}
+\setinterfacemessage{interactions}{21}{-- Code eingefuegt}
+\setinterfacemessage{regimes}{1}{Kodierung --}
+\setinterfacemessage{regimes}{3}{Unbekannte Kodierung --}
+\setinterfacemessage{regimes}{2}{Kodierung -- ist geladen}
+\setinterfacemessage{regimes}{title}{Kodierung}
+\setinterfacemessage{structures}{1}{Begin des Abschnittsblocks --}
+\setinterfacemessage{structures}{title}{struktur}
+\setinterfacemessage{structures}{2}{Ende des Abschnittsblocks --}
+\setinterfacemessage{linguals}{1}{Trennmuster -- fuer -- geladen (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{Trenndefinitionen -- fuer -- geladen (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{Keine Trennmuster -- fuer -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{Trennmuster fuer -- nicht geladen}
+\setinterfacemessage{linguals}{4}{Keine Trenndefinitionen -- fuer -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{Sprachenspezifische Option [--] fuegt eine Luecke von -- ein}
+\setinterfacemessage{linguals}{6}{Sprache -- ist undefiniert}
+\setinterfacemessage{linguals}{9}{Sprache -- ist aktiv}
+\setinterfacemessage{linguals}{8}{Sprachenspezifische Option [--] nahtlos hinzugefuegt}
+\setinterfacemessage{linguals}{title}{Sprache}
+\setinterfacemessage{linguals}{10}{Trennmuster --geladen}
+\setinterfacemessage{verbatims}{1}{Datei -- existiert nicht}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{filter -- ist geladen}
+\setinterfacemessage{filters}{title}{filter}
+\setinterfacemessage{filters}{2}{unknown filter --}
+\setinterfacemessage{textblocks}{1}{neue Version, zweiter Durchlauf benoetigt}
+\setinterfacemessage{textblocks}{3}{lese Bloecke von --}
+\setinterfacemessage{textblocks}{2}{schreibe Bloecke zu --}
+\setinterfacemessage{textblocks}{5}{-- nicht verborgen}
+\setinterfacemessage{textblocks}{4}{zweiter Durchlauf benoetigt}
+\setinterfacemessage{textblocks}{7}{-- verborgen}
+\setinterfacemessage{textblocks}{6}{-- verborgen und verarbeitet}
+\setinterfacemessage{textblocks}{9}{-- nicht gesetzt}
+\setinterfacemessage{textblocks}{8}{-- gesetzt}
+\setinterfacemessage{textblocks}{title}{textblock}
+\setinterfacemessage{textblocks}{12}{-- ausgelassen}
+\setinterfacemessage{textblocks}{11}{-- geladen und gesetzt}
+\setinterfacemessage{textblocks}{10}{-- geladen und verarbeitet}
+\setinterfacemessage{encodings}{1}{Kodierung --}
+\setinterfacemessage{encodings}{3}{Unbekannte Kodierung --}
+\setinterfacemessage{encodings}{2}{Kodierung -- ist geladen}
+\setinterfacemessage{encodings}{title}{Kodierung}
+\setinterfacemessage{columns}{1}{nur -- Spalten moeglich}
+\setinterfacemessage{columns}{3}{Problem, verwende [ausgleich=nein]}
+\setinterfacemessage{columns}{2}{benutzte \string\filbreak\space als Alternative}
+\setinterfacemessage{columns}{5}{Gleitobjekt unten ncoh nicht unterstuetzt}
+\setinterfacemessage{columns}{4}{Gleitobjekt oben ncoh nicht unterstuetzt}
+\setinterfacemessage{columns}{7}{ausgleich nach 100 Schritten abgebrocheb}
+\setinterfacemessage{columns}{6}{-- Gleitobjekt(e) verschoben}
+\setinterfacemessage{columns}{9}{Ausrichtung ueberpruefen}
+\setinterfacemessage{columns}{8}{ausgeglichen nach -- Schritt(en)}
+\setinterfacemessage{columns}{title}{Spalten}
+\setinterfacemessage{columns}{13}{breites Gleitobjekt an den Anfang der Spalten verschoben}
+\setinterfacemessage{columns}{12}{Gleitobjekt in naechste Zeile verschoben / --}
+\setinterfacemessage{columns}{11}{Gleitobjekt zu breit fuer Spalte}
+\setinterfacemessage{columns}{10}{(weniger als) 1 Zeile uebrig}
+\setinterfacemessage{symbols}{1}{Lade Symboldatei --}
+\setinterfacemessage{symbols}{title}{Symbole}
+\setinterfacemessage{files}{1}{Dateisynonym -- wird bereits fuer -- benutzt}
+\setinterfacemessage{files}{title}{files}
+\setinterfacemessage{versions}{1}{fehlendes @+}
+\setinterfacemessage{versions}{3}{Ausgewaehlte Seiten: --}
+\setinterfacemessage{versions}{2}{Erstelle Seiten}
+\setinterfacemessage{versions}{title}{Version}
+\setinterfacemessage{specials}{1}{-- geladen}
+\setinterfacemessage{specials}{3}{-- ist zurueckgesetzt}
+\setinterfacemessage{specials}{2}{keine tiefere Verschachtelung erlaubt --}
+\setinterfacemessage{specials}{5}{lade Definitionsdatei --}
+\setinterfacemessage{specials}{4}{Befehl -- existiert nicht}
+\setinterfacemessage{specials}{7}{unbekante Driver --}
+\setinterfacemessage{specials}{6}{Verschachtelung nicht erlaubt}
+\setinterfacemessage{specials}{title}{spezielles}
+\setinterfacemessage{layouts}{1}{Texthoehe angepasst mit -- auf Seite --}
+\setinterfacemessage{layouts}{3}{-- mal Text verschoben}
+\setinterfacemessage{layouts}{2}{-- mal verschobener Text plaziert}
+\setinterfacemessage{layouts}{5}{marginalbloecke inaktiv}
+\setinterfacemessage{layouts}{4}{marginalbloecke aktiv}
+\setinterfacemessage{layouts}{7}{berechne Platzbedarf des Logos}
+\setinterfacemessage{layouts}{6}{Unterseitenfolge -- verarbeitet (Groesse --)}
+\setinterfacemessage{layouts}{9}{z.Z. nicht mehr als -- Ebenen in Aufzaehlungen}
+\setinterfacemessage{layouts}{8}{berechne Hintergrund}
+\setinterfacemessage{layouts}{title}{Layout}
+\setinterfacemessage{layouts}{11}{Zwischenraum -- nicht im Grittermoduserlau}
+\setinterfacemessage{layouts}{10}{-- und -- ergeben zusammen nicht 1.0}
+\setinterfacemessage{fonts}{1}{Kodierung --}
+\setinterfacemessage{fonts}{3}{Unbekannte Variante --}
+\setinterfacemessage{fonts}{2}{Variante -- ist geladen}
+\setinterfacemessage{fonts}{5}{Stil -- ist nicht definiert}
+\setinterfacemessage{fonts}{4}{Fliesstext -- ist nicht definiert}
+\setinterfacemessage{fonts}{7}{unbekanntes Format --}
+\setinterfacemessage{fonts}{6}{-- ist geladen}
+\setinterfacemessage{fonts}{14}{Fliesstext -- wurde definiert (besser waere globale Definition)}
+\setinterfacemessage{fonts}{8}{Stil -- definiert}
+\setinterfacemessage{fonts}{title}{Fliesstext}
+\setinterfacemessage{fonts}{10}{unbekanntes Font --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{globale Datei --}
+\setinterfacemessage{databases}{2}{lokale Datei --}
+\setinterfacemessage{databases}{4}{unbekannte Datei --}
+\setinterfacemessage{databases}{title}{Datenbank}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{Lade Scriptdatei --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{unbekannte Preamble --}
+\setinterfacemessage{check}{1}{Fehlendes '=' nach '--' in Zeile --}
+\setinterfacemessage{check}{3}{-- -- ersetzt ein Makro, verwende VERSALIEN!}
+\setinterfacemessage{check}{2}{-- Argument(e) in Zeile -- erwartet}
+\setinterfacemessage{check}{title}{check}
+\setinterfacemessage{metapost}{1}{Lade metapost Bibliothek --}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{Abbildung -- kann nicht gefunden werden}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{Abbildung -- wird nicht erstellt}
+\setinterfacemessage{figures}{5}{Dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{Dimensionen von -- geladen aus der Abbildungsdatei selbst}
+\setinterfacemessage{figures}{6}{Dimensionen von -- ausgerechnet durch rlxtools}
+\setinterfacemessage{figures}{8}{Abbildungobjekt -- wurde wiederverwandt}
+\setinterfacemessage{figures}{title}{Abbildungen}
+\setinterfacemessage{colors}{1}{system -- ist global aktiviert}
+\setinterfacemessage{colors}{3}{-- ist undefiniert --}
+\setinterfacemessage{colors}{2}{system -- ist lokal aktiviert}
+\setinterfacemessage{colors}{5}{unbekanntes System --}
+\setinterfacemessage{colors}{4}{system -- ist geladen}
+\setinterfacemessage{colors}{7}{palette -- ist nicht verfuegbar}
+\setinterfacemessage{colors}{6}{palette -- ist verfuegbar}
+\setinterfacemessage{colors}{9}{-- Farbraum wird nicht unterstuetzt}
+\setinterfacemessage{colors}{8}{Spezifikation -- bei Farbe -- wird schwarz}
+\setinterfacemessage{colors}{title}{farbe}
+\setinterfacemessage{colors}{12}{-- is registered}
+\setinterfacemessage{colors}{11}{Farbe wird in Grau umgewandelt}
+\setinterfacemessage{colors}{10}{-- Farbraum wird unterstuetzt}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-men.tex b/tex/context/base/mult-men.tex
new file mode 100644
index 000000000..4c1bc9942
--- /dev/null
+++ b/tex/context/base/mult-men.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{unknown reference --}
+\setinterfacemessage{references}{3}{unknown reference type --}
+\setinterfacemessage{references}{2}{duplicate reference -- on page --}
+\setinterfacemessage{references}{4}{illegal reference --}
+\setinterfacemessage{references}{30}{unknown object --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{references}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{duplicate object --}
+\setinterfacemessage{references}{21}{document -- loaded}
+\setinterfacemessage{references}{22}{document -- is not interactive}
+\setinterfacemessage{references}{23}{obscure reference -- (prefix=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{number --}
+\setinterfacemessage{handlings}{1}{font handling --}
+\setinterfacemessage{handlings}{3}{unknown font handling --}
+\setinterfacemessage{handlings}{2}{font handling -- is loaded}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{system}
+\setinterfacemessage{systems}{41}{external file -- in group -- does not exist}
+\setinterfacemessage{systems}{9}{-- not found/processed}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{new version of utility file, second pass needed}
+\setinterfacemessage{systems}{21}{no utility data is loaded}
+\setinterfacemessage{systems}{20}{meaning (sorts) of -- loaded}
+\setinterfacemessage{systems}{5}{module -- loaded}
+\setinterfacemessage{systems}{4}{command -- is already defined}
+\setinterfacemessage{systems}{27}{Version}
+\setinterfacemessage{systems}{26}{Registers}
+\setinterfacemessage{systems}{25}{References}
+\setinterfacemessage{systems}{24}{Floatblocks}
+\setinterfacemessage{systems}{1}{loading utility-file postponed (typemode)}
+\setinterfacemessage{systems}{23}{-- arranged at --}
+\setinterfacemessage{systems}{22}{use a valid utilityfile}
+\setinterfacemessage{systems}{2}{-- loaded}
+\setinterfacemessage{systems}{19}{meaning (synonyms) of -- loaded}
+\setinterfacemessage{systems}{18}{synonym -- -- does not exist}
+\setinterfacemessage{systems}{7}{module -- already loaded}
+\setinterfacemessage{systems}{6}{module -- not found}
+\setinterfacemessage{systems}{14}{forced newpage in list at --}
+\setinterfacemessage{systems}{15}{saving buffer --}
+\setinterfacemessage{systems}{16}{typesetting buffer --}
+\setinterfacemessage{systems}{17}{typesetting verbatim buffer --}
+\setinterfacemessage{systems}{13}{mark -- defined --}
+\setinterfacemessage{systems}{12}{the utility-file is not sorted, use texutil}
+\setinterfacemessage{systems}{11}{building simple util}
+\setinterfacemessage{systems}{10}{don't use em in --}
+\setinterfacemessage{floatblocks}{1}{-- renumbered / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- moved}
+\setinterfacemessage{floatblocks}{2}{-- saved}
+\setinterfacemessage{floatblocks}{5}{order adapted}
+\setinterfacemessage{floatblocks}{4}{-- placed}
+\setinterfacemessage{floatblocks}{7}{n of bottom floats limited to --}
+\setinterfacemessage{floatblocks}{6}{n of top floats limited to --}
+\setinterfacemessage{floatblocks}{9}{order disturbed}
+\setinterfacemessage{floatblocks}{8}{less than -- lines}
+\setinterfacemessage{floatblocks}{title}{floatblocks}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{undefined}
+\setinterfacemessage{floatblocks}{11}{no block given}
+\setinterfacemessage{floatblocks}{10}{-- limited}
+\setinterfacemessage{interactions}{1}{aspect ratio -- x -- (b x h)}
+\setinterfacemessage{interactions}{3}{inactive}
+\setinterfacemessage{interactions}{2}{active}
+\setinterfacemessage{interactions}{5}{unknown attachment --}
+\setinterfacemessage{interactions}{4}{no pagesynchronisation (--) in hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- does not exist}
+\setinterfacemessage{interactions}{title}{interaction}
+\setinterfacemessage{interactions}{21}{-- code inserted}
+\setinterfacemessage{regimes}{1}{regime --}
+\setinterfacemessage{regimes}{3}{unknown regime --}
+\setinterfacemessage{regimes}{2}{regime -- is loaded}
+\setinterfacemessage{regimes}{title}{regime}
+\setinterfacemessage{structures}{1}{begin of sectionblock --}
+\setinterfacemessage{structures}{title}{structure}
+\setinterfacemessage{structures}{2}{end of sectionblock --}
+\setinterfacemessage{linguals}{1}{patterns -- for -- loaded (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{hyphenations -- for -- loaded (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{no patterns -- for -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{patterns for -- not loaded}
+\setinterfacemessage{linguals}{4}{no hyphenations -- for -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{language specific options [--] introduce a -- skip}
+\setinterfacemessage{linguals}{6}{language -- is undefined}
+\setinterfacemessage{linguals}{9}{language -- is active}
+\setinterfacemessage{linguals}{8}{language specific options [--] seamless appended}
+\setinterfacemessage{linguals}{title}{language}
+\setinterfacemessage{linguals}{10}{patterns --loaded}
+\setinterfacemessage{verbatims}{1}{file -- does not exist}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{filter -- is loaded}
+\setinterfacemessage{filters}{title}{filter}
+\setinterfacemessage{filters}{2}{unknown filter --}
+\setinterfacemessage{textblocks}{1}{new version, second pass needed}
+\setinterfacemessage{textblocks}{3}{reading blocks from --}
+\setinterfacemessage{textblocks}{2}{writing blocks to --}
+\setinterfacemessage{textblocks}{5}{-- not hidden}
+\setinterfacemessage{textblocks}{4}{second pass needed}
+\setinterfacemessage{textblocks}{7}{-- hidden}
+\setinterfacemessage{textblocks}{6}{-- hidden and processed}
+\setinterfacemessage{textblocks}{9}{-- not typeset}
+\setinterfacemessage{textblocks}{8}{-- typeset}
+\setinterfacemessage{textblocks}{title}{textblocks}
+\setinterfacemessage{textblocks}{12}{-- skipped}
+\setinterfacemessage{textblocks}{11}{-- loaded and typeset}
+\setinterfacemessage{textblocks}{10}{-- loaded and processed}
+\setinterfacemessage{encodings}{1}{coding --}
+\setinterfacemessage{encodings}{3}{unknown coding --}
+\setinterfacemessage{encodings}{2}{coding -- is loaded}
+\setinterfacemessage{encodings}{title}{encoding}
+\setinterfacemessage{columns}{1}{only -- columns possible}
+\setinterfacemessage{columns}{3}{problems, disable balancing}
+\setinterfacemessage{columns}{2}{use \string\filbreak\space as alternative}
+\setinterfacemessage{columns}{5}{bottom float not yet supported}
+\setinterfacemessage{columns}{4}{top float not yet supported}
+\setinterfacemessage{columns}{7}{balancing aborted after 100 steps}
+\setinterfacemessage{columns}{6}{-- float(s) postponed}
+\setinterfacemessage{columns}{9}{check raggedness}
+\setinterfacemessage{columns}{8}{balanced in -- step(s)}
+\setinterfacemessage{columns}{title}{columns}
+\setinterfacemessage{columns}{13}{wide float moved to top of columns}
+\setinterfacemessage{columns}{12}{float moved to next column / --}
+\setinterfacemessage{columns}{11}{float too wide for column}
+\setinterfacemessage{columns}{10}{(less than) 1 line left}
+\setinterfacemessage{symbols}{1}{loading symbolset --}
+\setinterfacemessage{symbols}{title}{symbols}
+\setinterfacemessage{files}{1}{file synonym -- is already used for --}
+\setinterfacemessage{files}{title}{files}
+\setinterfacemessage{versions}{1}{missing @+}
+\setinterfacemessage{versions}{3}{selected pages: --}
+\setinterfacemessage{versions}{2}{marking pages}
+\setinterfacemessage{versions}{title}{version}
+\setinterfacemessage{specials}{1}{-- loaded}
+\setinterfacemessage{specials}{3}{-- is reset}
+\setinterfacemessage{specials}{2}{no deeper nesting is permitted --}
+\setinterfacemessage{specials}{5}{loading definition file --}
+\setinterfacemessage{specials}{4}{command -- does not exist}
+\setinterfacemessage{specials}{7}{unknown driver --}
+\setinterfacemessage{specials}{6}{nesting is not permitted}
+\setinterfacemessage{specials}{title}{specials}
+\setinterfacemessage{layouts}{1}{textheight adapted with -- at page --}
+\setinterfacemessage{layouts}{3}{-- times text postponed}
+\setinterfacemessage{layouts}{2}{-- times postponed text placed}
+\setinterfacemessage{layouts}{5}{marginblocks inactive}
+\setinterfacemessage{layouts}{4}{marginblocks active}
+\setinterfacemessage{layouts}{7}{calculating logospace}
+\setinterfacemessage{layouts}{6}{subpage set -- processed (size --)}
+\setinterfacemessage{layouts}{9}{currently no more than -- levels in itemizations}
+\setinterfacemessage{layouts}{8}{calculating backgrounds}
+\setinterfacemessage{layouts}{title}{layout}
+\setinterfacemessage{layouts}{11}{spacing -- not permitted in gridmode}
+\setinterfacemessage{layouts}{10}{-- and -- don't add up to 1.0}
+\setinterfacemessage{fonts}{1}{coding --}
+\setinterfacemessage{fonts}{3}{unknown variant --}
+\setinterfacemessage{fonts}{2}{variant -- is loaded}
+\setinterfacemessage{fonts}{5}{style -- is not defined}
+\setinterfacemessage{fonts}{4}{bodyfont -- is not defined}
+\setinterfacemessage{fonts}{7}{unknown format --}
+\setinterfacemessage{fonts}{6}{-- is loaded}
+\setinterfacemessage{fonts}{14}{bodyfont -- is defined (can better be done global)}
+\setinterfacemessage{fonts}{8}{style -- defined}
+\setinterfacemessage{fonts}{title}{bodyfont}
+\setinterfacemessage{fonts}{10}{unknown font file --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{global file --}
+\setinterfacemessage{databases}{2}{local file --}
+\setinterfacemessage{databases}{4}{unknown file --}
+\setinterfacemessage{databases}{title}{databases}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{loading script set --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{unknown preamble --}
+\setinterfacemessage{check}{1}{missing or ungrouped '=' after '--' in line --}
+\setinterfacemessage{check}{3}{-- -- replaces a macro, use CAPITALS!}
+\setinterfacemessage{check}{2}{-- argument(s) expected in line --}
+\setinterfacemessage{check}{title}{check}
+\setinterfacemessage{metapost}{1}{loading metapost library --}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{figure -- can not be found}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{figure -- is not preset}
+\setinterfacemessage{figures}{5}{dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{dimensions of -- loaded from figurefile itself}
+\setinterfacemessage{figures}{6}{dimensions of -- calculated by rlxtools}
+\setinterfacemessage{figures}{8}{figureobject -- is reused}
+\setinterfacemessage{figures}{title}{figures}
+\setinterfacemessage{colors}{1}{system -- is global activated}
+\setinterfacemessage{colors}{3}{-- is not defined --}
+\setinterfacemessage{colors}{2}{system -- is local activated}
+\setinterfacemessage{colors}{5}{unknown system --}
+\setinterfacemessage{colors}{4}{system -- is loaded}
+\setinterfacemessage{colors}{7}{palette -- is not available}
+\setinterfacemessage{colors}{6}{palette -- is available}
+\setinterfacemessage{colors}{9}{-- color space is not supported}
+\setinterfacemessage{colors}{8}{specification -- at color -- becomes black}
+\setinterfacemessage{colors}{title}{color}
+\setinterfacemessage{colors}{12}{-- is registered}
+\setinterfacemessage{colors}{11}{color is converted to gray}
+\setinterfacemessage{colors}{10}{-- color space is supported}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-mes.lua b/tex/context/base/mult-mes.lua
new file mode 100644
index 000000000..5c8129711
--- /dev/null
+++ b/tex/context/base/mult-mes.lua
@@ -0,0 +1,2046 @@
+if not modules then modules = { } end modules ['mult-mes'] = {
+ version = 1.001,
+ comment = "companion to mult-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+return {
+ ["publications"]={
+ ["files"]={ "bibl-tra.mkiv" },
+ ["title"]={
+ ["en"]="publications",
+ },
+ ["1"]={
+ ["en"]="file -- not found, unknown style ignored",
+ },
+ ["2"]={
+ ["en"]="file -- not found, waiting for bibtex",
+ },
+ ["3"]={
+ ["en"]="wrote a new auxiliary file \\jobname.aux",
+ },
+ ["4"]={
+ ["en"]="loading database from --",
+ },
+ ["5"]={
+ ["en"]="warning: cite argument -- on line \\the\\inputlineno",
+ },
+ ["6"]={
+ ["en"]="loading formatting style from --",
+ },
+ },
+ ["check"]={
+ ["1"]={
+ ["cs"]="postradam '=' po '--' na radku --",
+ ["de"]="Fehlendes '=' nach '--' in Zeile --",
+ ["en"]="missing or ungrouped '=' after '--' in line --",
+ ["fr"]="manquant ou dégroupé '=' après '--' à la ligne --",
+ ["it"]="'=' mancante o non raggruppato dopo '--' alla riga --",
+ ["nl"]="'=' ontbreekt of zonder {} na '--' in regel --",
+ ["no"]="manglende '=' etter '--' i linje --",
+ ["ro"]="lipseste '=' dupa '--' in linia --",
+ },
+ ["2"]={
+ ["cs"]="ocekavam -- argument(y) na radku --",
+ ["de"]="-- Argument(e) in Zeile -- erwartet",
+ ["en"]="-- argument(s) expected in line --",
+ ["fr"]="-- argument(s) attendu(s) à la ligne --",
+ ["it"]="-- argomento/i attesi alla riga --",
+ ["nl"]="-- argument(en) verwacht in regel --",
+ ["no"]="-- argument forventet i linje --",
+ ["ro"]="argumentul(ele) -- sunt asteptate in linia --",
+ },
+ ["3"]={
+ ["cs"]="-- -- nahrazuje makro, uzijte VERZALKY!",
+ ["de"]="-- -- ersetzt ein Makro, verwende VERSALIEN!",
+ ["en"]="-- -- replaces a macro, use CAPITALS!",
+ ["fr"]="-- -- remplace une macro, utilisez des MAJUSCULES !",
+ ["it"]="-- -- sostituisce una macro, usare le MAIUSCOLE!",
+ ["nl"]="-- -- vervangt een macro, gebruik HOOFDLETTERS!",
+ ["no"]="-- -- overskygger en makro, bruk STORE BOKSTAVER!",
+ ["ro"]="-- -- inlocuieste un macro, folositi MAJUSCULE!",
+ },
+ ["files"]={ "mult-sys.tex" },
+ ["title"]={
+ ["cs"]="kontrola",
+ ["de"]="check",
+ ["en"]="check",
+ ["fr"]="vérification",
+ ["it"]="controllo",
+ ["nl"]="controle",
+ ["no"]="kontroll",
+ ["ro"]="verificari",
+ },
+ },
+ ["colors"]={
+ ["1"]={
+ ["cs"]="system -- je globalne aktivovana",
+ ["de"]="system -- ist global aktiviert",
+ ["en"]="system -- is global activated",
+ ["fr"]="le système -- est globalement activé",
+ ["it"]="sistema -- attivato globalmente",
+ ["nl"]="systeem -- is globaal actief",
+ ["no"]="system -- er aktivert globalt",
+ ["ro"]="sistem -- este activata global",
+ },
+ ["10"]={
+ ["cs"]="-- prostor barev je podporovan",
+ ["de"]="-- Farbraum wird unterstuetzt",
+ ["en"]="-- color space is supported",
+ ["fr"]="-- l'espace de couleur est supporté",
+ ["it"]="spazio dei colori -- supportato",
+ ["nl"]="-- kleurruimte wordt ondersteund",
+ ["no"]="-- fargerom er støttet",
+ ["ro"]="spatiul de culoare -- este suportat",
+ },
+ ["11"]={
+ ["cs"]="barva je prevedena na sed",
+ ["de"]="Farbe wird in Grau umgewandelt",
+ ["en"]="color is converted to gray",
+ ["fr"]="la couleur est convertie en niveau de gris",
+ ["it"]="il colore ø convertito in grigio",
+ ["nl"]="kleur wordt vertaald in grijs",
+ ["no"]="fargen vil bli vist som grø",
+ ["ro"]="culoarea este convertita la gri",
+ },
+ ["12"]={
+ ["cs"]="-- is registered",
+ ["de"]="-- is registered",
+ ["en"]="-- is registered",
+ ["fr"]="-- est enregistré",
+ ["it"]="-- is registered",
+ ["nl"]="-- is geregistreerd",
+ ["no"]="-- is registered",
+ ["ro"]="-- is registered",
+ },
+ ["2"]={
+ ["cs"]="system -- je lokalne activovana",
+ ["de"]="system -- ist lokal aktiviert",
+ ["en"]="system -- is local activated",
+ ["fr"]="le système -- est localement activé",
+ ["it"]="sistema -- attivato localmente",
+ ["nl"]="systeem -- is lokaal actief",
+ ["no"]="system -- er aktivert lokalt",
+ ["ro"]="sistem -- este activata local",
+ },
+ ["3"]={
+ ["cs"]="-- neni definovana --",
+ ["de"]="-- ist undefiniert --",
+ ["en"]="-- is not defined --",
+ ["fr"]="-- n'est pas défini --",
+ ["it"]="-- non definito --",
+ ["nl"]="-- is niet gedefinieerd --",
+ ["no"]="-- er udefinert --",
+ ["ro"]="-- nu este definita --",
+ },
+ ["4"]={
+ ["cs"]="system -- je nacten",
+ ["de"]="system -- ist geladen",
+ ["en"]="system -- is loaded",
+ ["fr"]="le système -- est chargé",
+ ["it"]="sistema -- caricato",
+ ["nl"]="systeem -- wordt geladen",
+ ["no"]="system -- er lest inn",
+ ["ro"]="sistem -- este incarcata",
+ },
+ ["5"]={
+ ["cs"]="neznamy system --",
+ ["de"]="unbekanntes System --",
+ ["en"]="unknown system --",
+ ["fr"]="système -- inconnu",
+ ["it"]="sistema -- sconosciuto",
+ ["nl"]="onbekend systeem --",
+ ["no"]="ukjent system --",
+ ["ro"]="sistem -- necunoscuta",
+ },
+ ["6"]={
+ ["cs"]="palette -- je k dispozici",
+ ["de"]="palette -- ist verfuegbar",
+ ["en"]="palette -- is available",
+ ["fr"]="la palette -- est disponible",
+ ["it"]="tavolozza -- resa disponibile",
+ ["nl"]="palet -- is beschikbaar",
+ ["no"]="palett -- er tilgjengelig",
+ ["ro"]="paleta -- este disponibila",
+ },
+ ["7"]={
+ ["cs"]="palette -- neni k dispozici",
+ ["de"]="palette -- ist nicht verfuegbar",
+ ["en"]="palette -- is not available",
+ ["fr"]="le palette -- n'est pas disponible",
+ ["it"]="tavolozza -- non disponibile",
+ ["nl"]="palet -- is niet beschikbaar",
+ ["no"]="palett -- er ikke tilgjengelig",
+ ["ro"]="palette -- nu este disponibila",
+ },
+ ["8"]={
+ ["cs"]="specifikace -- v barve -- bude cerna",
+ ["de"]="Spezifikation -- bei Farbe -- wird schwarz",
+ ["en"]="specification -- at color -- becomes black",
+ ["fr"]="la spécification -- de la couleur -- devient noire",
+ ["it"]="specifica -- del colore -- convertita in nero",
+ ["nl"]="specificatie -- bij -- wordt zwart",
+ ["no"]="spesifikasjon -- for farge -- gir kun svart",
+ ["ro"]="specificatia -- la culoarea -- devine neagra",
+ },
+ ["9"]={
+ ["cs"]="-- prostor barev neni podporovan",
+ ["de"]="-- Farbraum wird nicht unterstuetzt",
+ ["en"]="-- color space is not supported",
+ ["fr"]="l'espace de couleur -- n'est pas supporté",
+ ["it"]="spazio dei colori -- non supportato",
+ ["nl"]="-- kleurruimte wordt niet ondersteund",
+ ["no"]="-- fargerom er ikke støttet",
+ ["ro"]="spatiul de culoare -- nu este suportat",
+ },
+ ["files"]={ "colo-ini.tex" },
+ ["title"]={
+ ["cs"]="barva",
+ ["de"]="farbe",
+ ["en"]="color",
+ ["fr"]="couleurs",
+ ["it"]="colore",
+ ["nl"]="kleur",
+ ["no"]="farge",
+ ["ro"]="culori",
+ },
+ },
+ ["columns"]={
+ ["1"]={
+ ["cs"]="je mozno pouze -- sloupcu",
+ ["de"]="nur -- Spalten moeglich",
+ ["en"]="only -- columns possible",
+ ["fr"]="seules -- colonnes possibles",
+ ["it"]="solo -- colonne possibili",
+ ["nl"]="maximaal -- kolommen",
+ ["no"]="maksimalt -- kolonner",
+ ["ro"]="este posibil numai -- coloane",
+ },
+ ["10"]={
+ ["cs"]="zbyl (mene nez) 1 radek",
+ ["de"]="(weniger als) 1 Zeile uebrig",
+ ["en"]="(less than) 1 line left",
+ ["fr"]="(moins de) 1 ligne restante",
+ ["it"]="(meno di) una riga rimasta",
+ ["nl"]="(minder dan) 1 regel over",
+ ["no"]="(mindre enn) 1 linje igjen",
+ ["ro"]="a mai ramas (mai putin de) 1 linie",
+ },
+ ["11"]={
+ ["cs"]="plovouci objekt je pro sloupec prilis siroky",
+ ["de"]="Gleitobjekt zu breit fuer Spalte",
+ ["en"]="float too wide for column",
+ ["fr"]="flottant mis à la largeur de la colonne",
+ ["it"]="oggetto mobile troppo ampio per la colonna",
+ ["nl"]="plaatsblok te breed voor kolom",
+ ["no"]="flytblokk for bredt for kolonna",
+ ["ro"]="blocul este prea lat pentru coloana",
+ },
+ ["12"]={
+ ["cs"]="plovouci objekt je presunut do nasledujiciho sloupce / --",
+ ["de"]="Gleitobjekt in naechste Zeile verschoben / --",
+ ["en"]="float moved to next column / --",
+ ["fr"]="flottant déplacé à la colonne suivante / --",
+ ["it"]="oggetto mobile spostata alla colonna successiva / --",
+ ["nl"]="plaatsblok verplaatst naar volgende kolom / --",
+ ["no"]="flytblokk forskjøvet til neste kolonne / --",
+ ["ro"]="blocul este mutat pe urmatoarea coloana / --",
+ },
+ ["13"]={
+ ["cs"]="siroky plovouci objekt je presunut nad sloupce",
+ ["de"]="breites Gleitobjekt an den Anfang der Spalten verschoben",
+ ["en"]="wide float moved to top of columns",
+ ["fr"]="flottant large déplacé dans la partie supérieure de la colonne",
+ ["it"]="oggetto mobile ampio spostato sopra le colonne",
+ ["nl"]="breed figuur geplaatst boven kolommen",
+ ["no"]="bred flytblokk forksjøvet til toppen av kolonnene",
+ ["ro"]="blocul lat este mutat in partea de sus a coloanelor",
+ },
+ ["2"]={
+ ["cs"]="pouzijte \\string\\filbreak\\space jako alternativu",
+ ["de"]="benutzte \\string\\filbreak\\space als Alternative",
+ ["en"]="use \\string\\filbreak\\space as alternative",
+ ["fr"]="utilisez \\string\\filbreak\\space en tant qu'alternative",
+ ["it"]="in alternativa, usare \\string\\filbreak",
+ ["nl"]="gebruik eventueel \\string\\filbreak",
+ ["no"]="bruk \\string\\filbreak\\space som et alternativ",
+ ["ro"]="folositi \\string\\filbreak\\space ca alternativa",
+ },
+ ["3"]={
+ ["cs"]="problem, vypina se vyvazovani",
+ ["de"]="Problem, verwende [ausgleich=nein]",
+ ["en"]="problems, disable balancing",
+ ["fr"]="problèmes, désactive l'équilibrage",
+ ["it"]="problemi, disabilitare il bilanciamento",
+ ["nl"]="probleempje, probeer [balanceren=nee]",
+ ["no"]="problemer, slår av balansering",
+ ["ro"]="probleme, se dezactiveaza alinierea",
+ },
+ ["4"]={
+ ["cs"]="horni plovouci objekt jeste neni podporovan",
+ ["de"]="Gleitobjekt oben ncoh nicht unterstuetzt",
+ ["en"]="top float not yet supported",
+ ["fr"]="flottant en partie supérieure pas encore supporté",
+ ["it"]="float in cima non ancora supportato",
+ ["nl"]="plaatsblok boven nog niet mogelijk",
+ ["no"]="flytblokker øverst er ikke støttet enda",
+ ["ro"]="cadrele top (top float) nu sunt inca suportate",
+ },
+ ["5"]={
+ ["cs"]="spodni plovouci objekt jeste neni podporovan",
+ ["de"]="Gleitobjekt unten ncoh nicht unterstuetzt",
+ ["en"]="bottom float not yet supported",
+ ["fr"]="flottant en partie inférieure pas encore supporté",
+ ["it"]="float in fondo non ancora supportato",
+ ["nl"]="plaatsblok onder nog niet mogelijk",
+ ["no"]="flytblokker nedert er ikke støttet enda",
+ ["ro"]="cadrele bottom (bottom float) nu sunt inca suportate",
+ },
+ ["6"]={
+ ["cs"]="-- plovouci objekt(y) odlozeny",
+ ["de"]="-- Gleitobjekt(e) verschoben",
+ ["en"]="-- float(s) postponed",
+ ["fr"]="-- flottant(s) reporté(s)",
+ ["it"]="-- float(s) posticipate",
+ ["nl"]="-- plaatsblok(en) opgeschort",
+ ["no"]="-- flytblokk forskjøvet",
+ ["ro"]="-- blocurile sunt amanate",
+ },
+ ["7"]={
+ ["cs"]="vyvazovani ukonceno po 100 krocich",
+ ["de"]="ausgleich nach 100 Schritten abgebrocheb",
+ ["en"]="balancing aborted after 100 steps",
+ ["fr"]="équilibrage abandonné après 100 pas",
+ ["it"]="bilanciamento annullato dopo 100 passi",
+ ["nl"]="balanceren afgebroken na 100 stappen",
+ ["no"]="balansering avbrutt etter 100 iterasjoner",
+ ["ro"]="alinierea este oprita dupa 100 de incercari",
+ },
+ ["8"]={
+ ["cs"]="vyvazeno v -- krocich",
+ ["de"]="ausgeglichen nach -- Schritt(en)",
+ ["en"]="balanced in -- step(s)",
+ ["fr"]="équilibré en -- pas",
+ ["it"]="bilanciamento in -- passo/i",
+ ["nl"]="gebalanceerd in -- stap(pen)",
+ ["no"]="balansert etter -- iterasjoner",
+ ["ro"]="aliniat in -- pas(i)",
+ },
+ ["9"]={
+ ["cs"]="kontrola nerovnost",
+ ["de"]="Ausrichtung ueberpruefen",
+ ["en"]="check raggedness",
+ ["fr"]="vérification des irrégularités",
+ ["it"]="controllare seghettamento",
+ ["nl"]="uitlijnen controleren!",
+ ["no"]="kontroller tekstlayout!",
+ ["ro"]="verificat alinierea",
+ },
+ ["files"]={ "page-ini.tex" },
+ ["title"]={
+ ["cs"]="sloupce",
+ ["de"]="Spalten",
+ ["en"]="columns",
+ ["fr"]="colonnes",
+ ["it"]="colonne",
+ ["nl"]="kolommen",
+ ["no"]="kolonner",
+ ["ro"]="coloane",
+ },
+ },
+ ["databases"]={
+ ["1"]={
+ ["cs"]="--",
+ ["de"]="--",
+ ["en"]="--",
+ ["fr"]="--",
+ ["it"]="--",
+ ["nl"]="--",
+ ["no"]="--",
+ ["ro"]="--",
+ },
+ ["2"]={
+ ["cs"]="local file --",
+ ["de"]="lokale Datei --",
+ ["en"]="local file --",
+ ["fr"]="fichier local --",
+ ["it"]="file locale --",
+ ["nl"]="lokaal bestand --",
+ ["no"]="lokal fil --",
+ ["ro"]="fisier local --",
+ },
+ ["3"]={
+ ["cs"]="global file --",
+ ["de"]="globale Datei --",
+ ["en"]="global file --",
+ ["fr"]="fichier global --",
+ ["it"]="file globale --",
+ ["nl"]="globaal bestand --",
+ ["no"]="global fil --",
+ ["ro"]="fisier global --",
+ },
+ ["4"]={
+ ["cs"]="unknown file --",
+ ["de"]="unbekannte Datei --",
+ ["en"]="unknown file --",
+ ["fr"]="fichier inconnu --",
+ ["it"]="file sconosciuto --",
+ ["nl"]="onbekend bestand --",
+ ["no"]="ukjent fil --",
+ ["ro"]="fisier necunoscut --",
+ },
+ ["files"]={ "core-dat.tex" },
+ ["title"]={
+ ["cs"]="databases",
+ ["de"]="Datenbank",
+ ["en"]="databases",
+ ["fr"]="bases de données",
+ ["it"]="database",
+ ["nl"]="database",
+ ["no"]="databaser",
+ ["ro"]="baze de date",
+ },
+ },
+ ["documents"]={
+ ["1"]={
+ ["de"]="Blatt --",
+ ["en"]="sheet --",
+ ["nl"]="sheet --",
+ },
+ ["2"]={
+ ["de"]="Nummer --",
+ ["en"]="number --",
+ ["nl"]="nummer --",
+ },
+ ["files"]={ "docs-bri.tex", "docs-she.tex" },
+ ["title"]={
+ ["de"]="Blaetter",
+ ["en"]="sheets",
+ ["nl"]="sheets",
+ },
+ },
+ ["encodings"]={
+ ["1"]={
+ ["cs"]="kodovani --",
+ ["de"]="Kodierung --",
+ ["en"]="coding --",
+ ["fr"]="encodage --",
+ ["it"]="codifica --",
+ ["nl"]="codering --",
+ ["no"]="koding --",
+ ["ro"]="codificarea --",
+ },
+ ["2"]={
+ ["cs"]="je nacteno kodovani --",
+ ["de"]="Kodierung -- ist geladen",
+ ["en"]="coding -- is loaded",
+ ["fr"]="l'encodage -- est chargé",
+ ["it"]="codifica -- caricata",
+ ["nl"]="codering -- wordt geladen",
+ ["no"]="koding -- er lest inn",
+ ["ro"]="codificarea -- este Encarcata",
+ },
+ ["3"]={
+ ["cs"]="nezname kodovani --",
+ ["de"]="Unbekannte Kodierung --",
+ ["en"]="unknown coding --",
+ ["fr"]="encodage -- inconnu",
+ ["it"]="codifica sconosciuta --",
+ ["nl"]="onbekende codering --",
+ ["no"]="ukjent koding --",
+ ["ro"]="codificarea -- este necunoscuta",
+ },
+ ["files"]={ "enco-ini.mkii" },
+ ["title"]={
+ ["cs"]="kodovani",
+ ["de"]="Kodierung",
+ ["en"]="encoding",
+ ["fr"]="encodage",
+ ["it"]="codifica",
+ ["nl"]="encoding",
+ ["no"]="koding",
+ ["ro"]="codificari",
+ },
+ },
+ ["figures"]={
+ ["1"]={
+ ["cs"]="obraz -- nelze nalezt",
+ ["de"]="Abbildung -- kann nicht gefunden werden",
+ ["en"]="figure -- can not be found",
+ ["fr"]="la figure -- ne peut être trouvée",
+ ["it"]="figura -- non trovata",
+ ["nl"]="figuur -- is niet te vinden",
+ ["ro"]="figura -- nu poate fi gasita",
+ },
+ ["2"]={
+ ["cs"]="obraz -- nepritomen",
+ ["de"]="Abbildung -- wird nicht erstellt",
+ ["en"]="figure -- is not preset",
+ ["fr"]="la figure -- n'est pas pré-sélectionnée",
+ ["it"]="la figura -- non è preimpostata",
+ ["nl"]="figuur -- wordt niet preset",
+ ["ro"]="figura -- nu este presetata",
+ },
+ ["3"]={
+ ["cs"]="dimensions of -- are determined externally",
+ ["de"]="dimensions of -- are determined externally",
+ ["en"]="dimensions of -- are determined externally",
+ ["fr"]="dimensions of -- are determined externally",
+ ["it"]="dimensions of -- are determined externally",
+ ["nl"]="maten van -- worden extern vastgesteld",
+ ["ro"]="dimensions of -- are determined externally",
+ },
+ ["4"]={
+ ["cs"]="dimenze obrazu -- nacteny primo z jeho souboru",
+ ["de"]="Dimensionen von -- geladen aus der Abbildungsdatei selbst",
+ ["en"]="dimensions of -- loaded from figurefile itself",
+ ["fr"]="les dimensions de -- chargées implicitement à partir du fichier de figure",
+ ["it"]="dimensioni di -- caricate dal file di immagini stesso",
+ ["nl"]="maten van -- geladen uit figuurfile zelf",
+ ["ro"]="dimensiunea figurii -- se incarca din fisierul insusi",
+ },
+ ["5"]={
+ ["cs"]="dimensions of -- are unknown",
+ ["de"]="Dimensions of -- are unknown",
+ ["en"]="dimensions of -- are unknown",
+ ["fr"]="dimensions of -- are unknown",
+ ["it"]="dimensions of -- are unknown",
+ ["nl"]="maten van -- zijn onbekend",
+ ["ro"]="dimensions of -- are unknown",
+ },
+ ["6"]={
+ ["cs"]="dimenze obrazu -- spocteny programem rlxtools",
+ ["de"]="Dimensionen von -- ausgerechnet durch rlxtools",
+ ["en"]="dimensions of -- calculated by rlxtools",
+ ["fr"]="les dimensions de -- calculées par rlxtools",
+ ["it"]="dimensioni di -- calcolate da rlxtools",
+ ["nl"]="maten van -- berekend door rlxtools",
+ ["ro"]="dimensiunea figurii -- este calculata de rlxtools",
+ },
+ ["8"]={
+ ["cs"]="obrazovy objekt -- je znovu pouzit",
+ ["de"]="Abbildungobjekt -- wurde wiederverwandt",
+ ["en"]="figureobject -- is reused",
+ ["fr"]="figureobject -- est réutilisé",
+ ["it"]="oggetto-figura -- riutilizzato",
+ ["nl"]="figuurobject -- wordt opnieuw gebruikt",
+ ["ro"]="obiectul figura -- este refolosit",
+ },
+ ["files"]={ "core-inc.mkii" },
+ ["title"]={
+ ["cs"]="obrazy",
+ ["de"]="Abbildungen",
+ ["en"]="figures",
+ ["fr"]="figures",
+ ["it"]="figure",
+ ["nl"]="figuren",
+ ["ro"]="figuri",
+ },
+ },
+ ["files"]={
+ ["1"]={
+ ["cs"]="synonymum souboru -- je jiz pouzito pro --",
+ ["de"]="Dateisynonym -- wird bereits fuer -- benutzt",
+ ["en"]="file synonym -- is already used for --",
+ ["fr"]="le synonyme de fichier -- est déjà utilisé pour --",
+ ["it"]="sinonimo file -- già in uso per --",
+ ["nl"]="file synoniem -- is al in gebruik voor --",
+ ["no"]="filesynonym -- er allerede brukt for --",
+ ["ro"]="sinonimul fisierelor -- este folosit deja pentru --",
+ },
+ ["files"]={ "core-fil.tex" },
+ ["title"]={
+ ["cs"]="soubory",
+ ["de"]="files",
+ ["en"]="files",
+ ["fr"]="fichiers",
+ ["it"]="file",
+ ["nl"]="files",
+ ["no"]="filer",
+ ["ro"]="fisiere",
+ },
+ },
+ ["filters"]={
+ ["1"]={
+ ["cs"]="filter -- is loaded",
+ ["de"]="filter -- ist geladen",
+ ["en"]="filter -- is loaded",
+ ["fr"]="le filtre -- est chargé",
+ ["it"]="filtro -- caricato",
+ ["nl"]="filter -- wordt geladen",
+ },
+ ["2"]={
+ ["cs"]="unknown filter --",
+ ["de"]="unknown filter --",
+ ["en"]="unknown filter --",
+ ["fr"]="filtre -- inconnu",
+ ["it"]="filtro sconosciuto --",
+ ["nl"]="onbekend filter --",
+ },
+ ["files"]={ "filt-ini.tex" },
+ ["title"]={
+ ["cs"]="filter",
+ ["de"]="filter",
+ ["en"]="filter",
+ ["fr"]="filtre",
+ ["it"]="filtri",
+ ["nl"]="filter",
+ },
+ },
+ ["floatblocks"]={
+ ["1"]={
+ ["cs"]="-- precislovano / -- => --",
+ ["de"]="-- neu nummeriert / -- => --",
+ ["en"]="-- renumbered / -- => --",
+ ["fr"]="-- renuméroté / -- => --",
+ ["it"]="-- rinumerato / -- => --",
+ ["nl"]="-- hernummerd / -- => --",
+ ["no"]="-- renummerert / -- => --",
+ ["ro"]="-- renumerotat / -- => --",
+ },
+ ["10"]={
+ ["cs"]="-- omezeno",
+ ["de"]="-- begrenzt",
+ ["en"]="-- limited",
+ ["fr"]="-- limité",
+ ["it"]="-- limitato",
+ ["nl"]="-- begrensd",
+ ["no"]="-- begrenset",
+ ["ro"]="-- limitat",
+ },
+ ["11"]={
+ ["cs"]="nedan zadny blok",
+ ["de"]="kein Block gegeben",
+ ["en"]="no block given",
+ ["fr"]="pas de bloc donné",
+ ["it"]="nessun oggetto specificato",
+ ["nl"]="geen blok opgegeven",
+ ["no"]="ingen blokk oppgitt",
+ ["ro"]="nu este dat nici un bloc",
+ },
+ ["12"]={
+ ["cs"]="nedefinovano",
+ ["de"]="undefiniert",
+ ["en"]="undefined",
+ ["fr"]="indéfini",
+ ["it"]="non definito",
+ ["nl"]="niet gedefinieerd",
+ ["no"]="udefinert",
+ ["ro"]="nedefinit",
+ },
+ ["13"]={
+ ["cs"]="there is nothing to split",
+ ["de"]="there is nothing to split",
+ ["en"]="there is nothing to split",
+ ["fr"]="there is nothing to split",
+ ["it"]="there is nothing to split",
+ ["nl"]="er is niets te splitsen",
+ ["no"]="there is nothing to split",
+ ["ro"]="there is nothing to split",
+ },
+ ["2"]={
+ ["cs"]="-- ulozeno",
+ ["de"]="-- gespeichert",
+ ["en"]="-- saved",
+ ["fr"]="-- sauvegardé",
+ ["it"]="-- salvato",
+ ["nl"]="-- bewaard",
+ ["no"]="-- lagret",
+ ["ro"]="-- salvat",
+ },
+ ["3"]={
+ ["cs"]="-- presunuto",
+ ["de"]="-- verschoben",
+ ["en"]="-- moved",
+ ["fr"]="-- déplacé",
+ ["it"]="-- mosso",
+ ["nl"]="-- verplaatst",
+ ["no"]="-- flyttet",
+ ["ro"]="-- mutat",
+ },
+ ["4"]={
+ ["cs"]="-- umisteno",
+ ["de"]="-- plaziert",
+ ["en"]="-- placed",
+ ["fr"]="-- placé",
+ ["it"]="-- sistemato",
+ ["nl"]="-- geplaatst",
+ ["no"]="-- plassert",
+ ["ro"]="-- plasat",
+ },
+ ["5"]={
+ ["cs"]="poradi prizpusobeno",
+ ["de"]="Reihenfolge angepasst",
+ ["en"]="order adapted",
+ ["fr"]="ordre adapté",
+ ["it"]="ordine aggiustato",
+ ["nl"]="volgorde aangepast",
+ ["no"]="rekkefølge tilpasset",
+ ["ro"]="ordinea adaptata",
+ },
+ ["6"]={
+ ["cs"]="pocet hornich plovoucich objektu je omezen na --",
+ ["de"]="Anz. der oberen Gleitobjekte beschraengt auf --",
+ ["en"]="n of top floats limited to --",
+ ["fr"]="n flottants de haut de page limité à --",
+ ["it"]="n di top floats limitato a --",
+ ["nl"]="maximaal -- boven",
+ ["no"]="maksimalt -- flytblokker øverst",
+ ["ro"]="nr. cadrelor de sus limitat la --",
+ },
+ ["7"]={
+ ["cs"]="pocet spodnich plovoucich objektu je omezen na --",
+ ["de"]="Anz. der unteren Gleitobjekte beschraengt auf --",
+ ["en"]="n of bottom floats limited to --",
+ ["fr"]="n flottants de bas de page limité à --",
+ ["it"]="n di bottom floats limitato a --",
+ ["nl"]="maximaal -- onder",
+ ["no"]="maksimalt -- flytblokker nederst",
+ ["ro"]="nr. blocurilor de jos limitat la --",
+ },
+ ["8"]={
+ ["cs"]="radku je mene nez --",
+ ["de"]="weniger als -- zeilen",
+ ["en"]="less than -- lines",
+ ["fr"]="moins de -- lignes",
+ ["it"]="meno di -- righe",
+ ["nl"]="minder dan -- regels",
+ ["no"]="mindre enn -- linjer",
+ ["ro"]="mai putin de -- linii",
+ },
+ ["9"]={
+ ["cs"]="poradi naruseno",
+ ["de"]="Reigenfolge gestoert",
+ ["en"]="order disturbed",
+ ["fr"]="ordre perturbé",
+ ["it"]="ordine disturbato",
+ ["nl"]="volgorde verstoord",
+ ["no"]="rekkefølge endret",
+ ["ro"]="ordinea deranjata",
+ },
+ ["files"]={ "page-flt.tex", "strc-flt.tex" },
+ ["title"]={
+ ["cs"]="plovouciobjekty",
+ ["de"]="Gleitobjektbloecke",
+ ["en"]="floatblocks",
+ ["fr"]="blocs de flottants",
+ ["it"]="oggetti mobili",
+ ["nl"]="plaatsblokken",
+ ["no"]="flytblokker",
+ ["ro"]="Blocuri",
+ },
+ },
+ ["fonts"]={
+ ["1"]={
+ ["cs"]="kodovani --",
+ ["de"]="Kodierung --",
+ ["en"]="coding --",
+ ["fr"]="encodage --",
+ ["it"]="codifica --",
+ ["nl"]="codering --",
+ ["no"]="koding --",
+ ["ro"]="codificarea --",
+ },
+ ["10"]={
+ ["cs"]="neznamy font --",
+ ["de"]="unbekanntes Font --",
+ ["en"]="unknown font file --",
+ ["fr"]="fichier de police -- inconnu",
+ ["it"]="file di font sconosciuto --",
+ ["nl"]="onbekende font file --",
+ ["no"]="ukjent fontfil --",
+ ["ro"]="fisier font necunoscut --",
+ },
+ ["14"]={
+ ["cs"]="bodyfont -- is defined (can better be done global)",
+ ["de"]="Fliesstext -- wurde definiert (besser waere globale Definition)",
+ ["en"]="bodyfont -- is defined (can better be done global)",
+ ["fr"]="policecorps -- est défini (une définition globale pourrait être plus adéquat)",
+ ["it"]="corpo del testo -- definito (sarebbe meglio globale)",
+ ["nl"]="korps -- is gedefinieerd (kan beter globaal plaatsvinden)",
+ ["no"]="bodyfont -- is defined (can better be done global)",
+ ["ro"]="bodyfont -- is defined (can better be done global)",
+ },
+ ["2"]={
+ ["cs"]="varianta -- je nactena",
+ ["de"]="Variante -- ist geladen",
+ ["en"]="variant -- is loaded",
+ ["fr"]="la variante -- est chargée",
+ ["it"]="variante -- caricata",
+ ["nl"]="variant -- wordt geladen",
+ ["no"]="variant -- er lest inn",
+ ["ro"]="varianta -- este incarcata",
+ },
+ ["3"]={
+ ["cs"]="neznama varianta --",
+ ["de"]="Unbekannte Variante --",
+ ["en"]="unknown variant --",
+ ["fr"]="variante -- inconnue",
+ ["it"]="variante sconosciuta --",
+ ["nl"]="onbekende variant --",
+ ["no"]="ukjent variant --",
+ ["ro"]="varianta necunoscuta --",
+ },
+ ["4"]={
+ ["cs"]="zakladni font -- neni definovan",
+ ["de"]="Fliesstext -- ist nicht definiert",
+ ["en"]="bodyfont -- is not defined",
+ ["fr"]="policecorps -- n'est pas définie",
+ ["it"]="corpo del testo -- non definito",
+ ["nl"]="korps -- is niet gedefinieerd",
+ ["no"]="hovedfont -- er ikke definert",
+ ["ro"]="corpul de litere -- nu este definit",
+ },
+ ["5"]={
+ ["cs"]="styl -- neni definovan",
+ ["de"]="Stil -- ist nicht definiert",
+ ["en"]="style -- is not defined",
+ ["fr"]="le style -- n'est pas défini",
+ ["it"]="stile -- non definito",
+ ["nl"]="stijl -- is niet gedefinieerd",
+ ["no"]="stil -- er ikke definert",
+ ["ro"]="stilul -- nu este definit",
+ },
+ ["6"]={
+ ["cs"]="-- je nacten",
+ ["de"]="-- ist geladen",
+ ["en"]="-- is loaded",
+ ["fr"]="-- est chargé",
+ ["it"]="-- caricato",
+ ["nl"]="-- wordt geladen",
+ ["no"]="-- er lest inn",
+ ["ro"]="-- este incarcat",
+ },
+ ["7"]={
+ ["cs"]="neznamy format --",
+ ["de"]="unbekanntes Format --",
+ ["en"]="unknown format --",
+ ["fr"]="format -- inconnu",
+ ["it"]="formato sconosciuto --",
+ ["nl"]="onbekend formaat --",
+ ["no"]="ukjent format --",
+ ["ro"]="format necunoscut --",
+ },
+ ["8"]={
+ ["cs"]="styl -- definovan",
+ ["de"]="Stil -- definiert",
+ ["en"]="style -- defined",
+ ["fr"]="style -- défini",
+ ["it"]="stile -- definito",
+ ["nl"]="stijl -- gedefinieerd",
+ ["no"]="stil -- definert",
+ ["ro"]="stilul -- definit",
+ },
+ ["files"]={ "font-ini.mkii", "font-ini.mkiv" },
+ ["title"]={
+ ["cs"]="zakladnifont",
+ ["de"]="Fliesstext",
+ ["en"]="bodyfont",
+ ["fr"]="corps de texte",
+ ["it"]="font del corpo",
+ ["nl"]="korps",
+ ["no"]="hovedfont",
+ ["ro"]="corp de litere",
+ },
+ },
+ ["handlings"]={
+ ["1"]={
+ ["cs"]="font handling --",
+ ["de"]="Font Verarbeitung --",
+ ["en"]="font handling --",
+ ["fr"]="manipulation -- de police",
+ ["it"]="font handling --",
+ ["nl"]="font afhandeling --",
+ ["no"]="font handling --",
+ ["ro"]="font handling --",
+ },
+ ["2"]={
+ ["cs"]="font handling -- is loaded",
+ ["de"]="Font Verarbeitung -- ist geladen",
+ ["en"]="font handling -- is loaded",
+ ["fr"]="la manipulation -- de police est chargée",
+ ["it"]="font handling -- is loaded",
+ ["nl"]="font afhandeling -- wordt geladen",
+ ["no"]="font handling -- is loaded",
+ ["ro"]="font handling -- is loaded",
+ },
+ ["3"]={
+ ["cs"]="unknown font handling --",
+ ["de"]="unknown font handling --",
+ ["en"]="unknown font handling --",
+ ["fr"]="manipulation -- inconnue de police",
+ ["it"]="unknown font handling --",
+ ["nl"]="onbekende font afhandeling --",
+ ["no"]="unknown font handling --",
+ ["ro"]="unknown font handling --",
+ },
+ ["files"]={ "hand-ini.mkii" },
+ ["title"]={
+ ["cs"]="handling",
+ ["de"]="handling",
+ ["en"]="handling",
+ ["fr"]="manipulation",
+ ["it"]="handling",
+ ["nl"]="handling",
+ ["no"]="handling",
+ ["ro"]="handling",
+ },
+ },
+ ["interactions"]={
+ ["1"]={
+ ["cs"]="pomer -- x -- (s x v)",
+ ["de"]="Seitenverhaeltnis -- x -- (B x H)",
+ ["en"]="aspect ratio -- x -- (b x h)",
+ ["fr"]="ratio d'aspect -- x -- (b x h)",
+ ["it"]="rapporto -- x -- (b x a)",
+ ["nl"]="aspect ratio -- x -- (b x h)",
+ ["no"]="forholdstall -- x -- (b x h)",
+ ["ro"]="aspectul -- x -- (b x h)",
+ },
+ ["2"]={
+ ["cs"]="aktivni",
+ ["de"]="aktiv",
+ ["en"]="active",
+ ["fr"]="actif",
+ ["it"]="attiva",
+ ["nl"]="actief",
+ ["no"]="aktiv",
+ ["ro"]="activ",
+ },
+ ["21"]={
+ ["cs"]="-- kod vlozen",
+ ["de"]="-- Code eingefuegt",
+ ["en"]="-- code inserted",
+ ["fr"]="-- code inseré",
+ ["it"]="codice -- inserito",
+ ["nl"]="-- code tussengevoegd",
+ ["no"]="-- kode satt inn / tilføyd",
+ ["ro"]="-- cod inserat",
+ },
+ ["3"]={
+ ["cs"]="neaktivni",
+ ["de"]="inaktiv",
+ ["en"]="inactive",
+ ["fr"]="inactif",
+ ["it"]="inattiva",
+ ["nl"]="niet actief",
+ ["no"]="inaktiv",
+ ["ro"]="inactiv",
+ },
+ ["4"]={
+ ["cs"]="zadna strankova synchronizace (--) v hmode",
+ ["de"]="keine Seitensynchronisation (--) im hmode",
+ ["en"]="no pagesynchronisation (--) in hmode",
+ ["fr"]="pas de synchronisation de page (--) dans le hmode",
+ ["it"]="sincronizzazione di pagina (--) non disponibile in hmode",
+ ["nl"]="geen paginasynchronisatie (--) in hmode",
+ ["no"]="ingen sidesynkronisering (--) i hmode",
+ ["ro"]="nu exista sincronizare pt. pagini (--) in hmode",
+ },
+ ["5"]={
+ ["cs"]="unknown attachment --",
+ ["de"]="unknown attachment --",
+ ["en"]="unknown attachment --",
+ ["fr"]="le fichier joint -- est inconnu",
+ ["it"]="unknown attachment --",
+ ["nl"]="onbekend attachment --",
+ ["no"]="unknown attachment --",
+ ["ro"]="unknown attachment --",
+ },
+ ["6"]={
+ ["cs"]="attachment file -- does not exist",
+ ["de"]="attachment file -- does not exist",
+ ["en"]="attachment file -- does not exist",
+ ["fr"]="le fichier joint -- n'existe pas",
+ ["it"]="attachment file -- does not exist",
+ ["nl"]="attachment file -- bestaat niet",
+ ["no"]="attachment file -- does not exist",
+ ["ro"]="attachment file -- does not exist",
+ },
+ ["files"]={ "core-int.tex", "spec-ini.tex" },
+ ["title"]={
+ ["cs"]="interakce",
+ ["de"]="Interaktion",
+ ["en"]="interaction",
+ ["fr"]="interaction",
+ ["it"]="interazione",
+ ["nl"]="interactie",
+ ["no"]="interaksjon",
+ ["ro"]="interactiuni",
+ },
+ },
+ ["javascript"]={
+ ["1"]={
+ ["cs"]="nacita se soubor skriptu --",
+ ["de"]="Lade Scriptdatei --",
+ ["en"]="loading script set --",
+ ["fr"]="chargement du jeu de script --",
+ ["it"]="caricamento dello script set --",
+ ["nl"]="script set -- wordt geladen",
+ ["no"]="leser inn scriptsett --",
+ ["ro"]="se incarca scriptul --",
+ },
+ ["2"]={
+ ["cs"]="neznama preambule --",
+ ["de"]="unbekannte Preamble --",
+ ["en"]="unknown preamble --",
+ ["fr"]="préambule -- inconnu",
+ ["it"]="preambolo sconosciuto --",
+ ["nl"]="onbekende preamble --",
+ ["no"]="ukjent 'preamble' --",
+ ["ro"]="preambul necunoscut --",
+ },
+ ["files"]={ "java-ini.tex" },
+ ["title"]={
+ ["cs"]="javascript",
+ ["de"]="javascript",
+ ["en"]="javascript",
+ ["fr"]="javascript",
+ ["it"]="javascript",
+ ["nl"]="javascript",
+ ["no"]="javascript",
+ ["ro"]="javascript",
+ },
+ },
+ ["layouts"]={
+ ["1"]={
+ ["cs"]="vyska textu prizpusobena s -- na strane --",
+ ["de"]="Texthoehe angepasst mit -- auf Seite --",
+ ["en"]="textheight adapted with -- at page --",
+ ["fr"]="hauteurtexte adaptée avec -- à la page --",
+ ["it"]="altezza del testo adattata con -- a pagina --",
+ ["nl"]="teksthoogte aangepast met -- op pagina --",
+ ["no"]="teksthøyde tilpasset med -- på side --",
+ ["ro"]="textheight adaptat cu -- la pagina --",
+ },
+ ["10"]={
+ ["cs"]="-- a -- nedava dohromady 1.0",
+ ["de"]="-- und -- ergeben zusammen nicht 1.0",
+ ["en"]="-- and -- don't add up to 1.0",
+ ["fr"]="-- et -- ne sont pas ajoutés à 1.0",
+ ["it"]="-- e -- non sommano a 1.0",
+ ["nl"]="-- en -- tellen niet op tot 1.0",
+ ["no"]="-- og -- er ikke 1.0 til sammen",
+ ["ro"]="-- si -- nu se adauga pana la 1.0",
+ },
+ ["11"]={
+ ["cs"]="svisla mezera -- neni povolena v pevnem radkovem rejstriku",
+ ["de"]="Zwischenraum -- nicht im Grittermoduserlau",
+ ["en"]="spacing -- not permitted in gridmode",
+ ["fr"]="espacement -- non permis en modegrille",
+ ["it"]="spaziatura -- non permessa in modo griglia",
+ ["nl"]="interlinie -- niet toegestaan in gridmode",
+ ["no"]="mellomrom -- ikke tillatt i gridmodus",
+ ["ro"]="spatierea -- nu este permisa in gridmode",
+ },
+ ["2"]={
+ ["cs"]="-- krat odlozeny text umisten",
+ ["de"]="-- mal verschobener Text plaziert",
+ ["en"]="-- times postponed text placed",
+ ["fr"]="-- times postponed text placed",
+ ["it"]="posizionato testo posticipato -- volte",
+ ["nl"]="-- maal uitgestelde tekst tussengevoegd",
+ ["no"]="-- ganger forskjøvet tekst plassert",
+ ["ro"]="textul amanat de -- ori a fost plasat",
+ },
+ ["3"]={
+ ["cs"]="-- krat text odlozen",
+ ["de"]="-- mal Text verschoben",
+ ["en"]="-- times text postponed",
+ ["fr"]="-- times text postponed",
+ ["it"]="testo posticipato -- volte",
+ ["nl"]="-- maal tekst plaatsen uitstellen",
+ ["no"]="-- ganger tekst forskjøvet",
+ ["ro"]="textul amanat de -- ori",
+ },
+ ["4"]={
+ ["cs"]="okrajove bloky aktivni",
+ ["de"]="marginalbloecke aktiv",
+ ["en"]="marginblocks active",
+ ["fr"]="blocsmarge actifs",
+ ["it"]="blocchi in margine attivi",
+ ["nl"]="margeblokken actief",
+ ["no"]="margblokker aktive",
+ ["ro"]="blocuri marginale active",
+ },
+ ["5"]={
+ ["cs"]="okrajove bloky neaktivni",
+ ["de"]="marginalbloecke inaktiv",
+ ["en"]="marginblocks inactive",
+ ["fr"]="blocsmarge inactifs",
+ ["it"]="blocchi in margine inattivi",
+ ["nl"]="margeblokken inactief",
+ ["no"]="margblokker inaktive",
+ ["ro"]="blocuri marginale inactive",
+ },
+ ["6"]={
+ ["cs"]="sada stran -- zpracovana (velikost --)",
+ ["de"]="Unterseitenfolge -- verarbeitet (Groesse --)",
+ ["en"]="subpage set -- processed (size --)",
+ ["fr"]="jeu de souspage -- traité (taille --)",
+ ["it"]="gruppo di sottopagine -- elaborato (dimensione --)",
+ ["nl"]="subpagina reeks -- verwerkt (aantal --)",
+ ["no"]="delside sett -- behandlet (størrelse --)",
+ ["ro"]="setul -- de subpagini procesat (dimensiunea --)",
+ },
+ ["7"]={
+ ["cs"]="pocita se misto pro logo",
+ ["de"]="berechne Platzbedarf des Logos",
+ ["en"]="calculating logospace",
+ ["fr"]="calcul de l'espace pour le logo",
+ ["it"]="calcolo dello spazio per logo",
+ ["nl"]="beeldmerken berekenen",
+ ["no"]="beregner plass for logo",
+ ["ro"]="se calculeaza spatiul pentru logo",
+ },
+ ["8"]={
+ ["cs"]="pocita se pozadi",
+ ["de"]="berechne Hintergrund",
+ ["en"]="calculating backgrounds",
+ ["fr"]="calcul des arrières-plans",
+ ["it"]="calcolo dello sfondo",
+ ["nl"]="achtergronden berekenen",
+ ["no"]="beregner bakgrunn",
+ ["ro"]="se calculeaza fundalurile",
+ },
+ ["9"]={
+ ["cs"]="aktualne ne vice nez -- urovne/urovni vyctu",
+ ["de"]="z.Z. nicht mehr als -- Ebenen in Aufzaehlungen",
+ ["en"]="currently no more than -- levels in itemizations",
+ ["fr"]="pas plus de -- niveaux pour l'instant dans les élémentarisations",
+ ["it"]="attualmente non più di -- livelli di elencazione",
+ ["nl"]="momenteel maximaal -- niveaus in opsommingen",
+ ["no"]="for øyeblikket maksimalt -- nivåer i opplisting",
+ ["ro"]="acum nu se supota mai mult de -- nivele de adancime la iteratii",
+ },
+ ["files"]={ "core-itm.tex", "page-bck.mkii", "page-bck.mkiv", "page-ini.tex", "page-log.tex", "strc-itm.tex" },
+ ["title"]={
+ ["cs"]="layout",
+ ["de"]="Layout",
+ ["en"]="layout",
+ ["fr"]="calque",
+ ["it"]="layout",
+ ["nl"]="layout",
+ ["no"]="layout",
+ ["ro"]="aranjamente",
+ },
+ },
+ ["linguals"]={
+ ["1"]={
+ ["cs"]="vzory -- pro -- nacteny (n=--,e=--,m=--)",
+ ["de"]="Trennmuster -- fuer -- geladen (n=--,e=--,m=--)",
+ ["en"]="patterns -- for -- loaded (n=--,e=--,m=--)",
+ ["fr"]="les motifs -- pour -- sont chargés (n=--,e=--,m=--)",
+ ["it"]="schemi -- per -- caricati (n=--,e=--,m=--)",
+ ["nl"]="afbreekpatronen -- voor -- geladen (n=--,e=--,m=--)",
+ ["no"]="orddelingsmønster -- for -- er lest inn (n=--,e=--,m=--)",
+ ["ro"]="sablonul -- pentru -- s-a incarcat (n=--,e=--,m=--)",
+ },
+ ["10"]={
+ ["cs"]="vzory --nacteny",
+ ["de"]="Trennmuster --geladen",
+ ["en"]="patterns --loaded",
+ ["fr"]="motifs -- chargés",
+ ["it"]="schemi -- caricati",
+ ["nl"]="patronen --geladen",
+ ["no"]="orddelingsmønster -- er lest inn",
+ ["ro"]="sabloanele -- incarcate",
+ },
+ ["2"]={
+ ["cs"]="zadne vzory -- pro -- (n=--,e=--,m=--) (--,--)",
+ ["de"]="Keine Trennmuster -- fuer -- (n=--,e=--,m=--) (--,--)",
+ ["en"]="no patterns -- for -- (n=--,e=--,m=--) (--,--)",
+ ["fr"]="pas de motifs -- pour -- (n=--,e=--,m=--) (--,--)",
+ ["it"]="niente schemi -- per -- (n=--,e=--,m=--) (--,--)",
+ ["nl"]="geen afbreekpatronen -- voor -- (n=--,e=--,m=--) (--,--)",
+ ["no"]="ingen orddelingsmønster -- for -- (n=--,e=--,m=--) (--,--)",
+ ["ro"]="nu exista sabloane -- pentru -- (n=--,e=--,m=--) (--,--)",
+ },
+ ["3"]={
+ ["cs"]="deleni slov -- pro -- nacteno (n=--,e=--,m=--)",
+ ["de"]="Trenndefinitionen -- fuer -- geladen (n=--,e=--,m=--)",
+ ["en"]="hyphenations -- for -- loaded (n=--,e=--,m=--)",
+ ["fr"]="hyphenations -- pour -- chargés (n=--,e=--,m=--)",
+ ["it"]="sillabazione -- per -- caricata (n=--,e=--,m=--)",
+ ["nl"]="afbreekdefinities -- voor -- geladen (n=--,e=--,m=--)",
+ ["no"]="orddelingsdefinisjon -- for -- er lest inn (n=--,e=--,m=--)",
+ ["ro"]="despartirea in silabe -- pentru -- s-a incarcat (n=--,e=--,m=--)",
+ },
+ ["4"]={
+ ["cs"]="zadne deleni slov -- pro -- (n=--,e=--,m=--)",
+ ["de"]="Keine Trenndefinitionen -- fuer -- (n=--,e=--,m=--)",
+ ["en"]="no hyphenations -- for -- (n=--,e=--,m=--)",
+ ["fr"]="pas d'hyphenations -- pour -- (n=--,e=--,m=--)",
+ ["it"]="niente sillabazione -- per -- (n=--,e=--,m=--)",
+ ["nl"]="geen afbreekdefinities -- voor -- (n=--,e=--,m=--)",
+ ["no"]="ingen orddelingsdefinisjon -- for -- (n=--,e=--,m=--)",
+ ["ro"]="nu exista despartire in silabe -- pentru -- (n=--,e=--,m=--)",
+ },
+ ["5"]={
+ ["cs"]="vzory pro -- nenacteny",
+ ["de"]="Trennmuster fuer -- nicht geladen",
+ ["en"]="patterns for -- not loaded",
+ ["fr"]="les motifs pour -- ne sont pas chargés",
+ ["it"]="schemi per -- non caricati",
+ ["nl"]="afbreekpatronen voor -- niet geladen",
+ ["no"]="orddelingsmønster for -- er ikke lest inn",
+ ["ro"]="sabloanele pentru -- nu sunt incarcate",
+ },
+ ["6"]={
+ ["cs"]="jazyk -- neni definovan",
+ ["de"]="Sprache -- ist undefiniert",
+ ["en"]="language -- is undefined",
+ ["fr"]="langue -- non définie",
+ ["it"]="lingua -- non definita",
+ ["nl"]="taal -- is niet gedefinieerd",
+ ["no"]="spràk -- er udefinert",
+ ["ro"]="limba -- nu este definita",
+ },
+ ["7"]={
+ ["cs"]="specificke volby jazyka [--] zavadeji -- (zavlecenou) mezeru",
+ ["de"]="Sprachenspezifische Option [--] fuegt eine Luecke von -- ein",
+ ["en"]="language specific options [--] introduce a -- skip",
+ ["fr"]="les options spécifiques de langue [--] introduisent un -- saut",
+ ["it"]="opzioni specifiche per la lingua [--] introducono un salto --",
+ ["nl"]="taal specifieke opties [--] introduceren een skip van --",
+ ["no"]="spràk spesifikk opsjon [--] introduserer et -- hopp",
+ ["ro"]="optiunile specifice ale limbii [--] introduc un spatiu --",
+ },
+ ["8"]={
+ ["cs"]="specificke volby jazyka [--] bez mezer pripojeny",
+ ["de"]="Sprachenspezifische Option [--] nahtlos hinzugefuegt",
+ ["en"]="language specific options [--] seamless appended",
+ ["fr"]="les options spécifiques de langue [--] sont ajoutés en douceur",
+ ["it"]="opzioni specifiche per la lingua [--] aggiunte trasparentemente",
+ ["nl"]="taal specifieke opties [--] naadloos toegevoegd",
+ ["no"]="spràk spesifikk opsjon [--] problemfritt tilføyd",
+ ["ro"]="optiunile specifice ale limbii [--] adaugate",
+ },
+ ["9"]={
+ ["cs"]="language -- is active",
+ ["de"]="Sprache -- ist aktiv",
+ ["en"]="language -- is active",
+ ["fr"]="la langue -- est active",
+ ["it"]="lingua -- attiva",
+ ["nl"]="taal -- is actief",
+ ["no"]="spràk -- er aktivt",
+ ["ro"]="limba -- este activa",
+ },
+ ["files"]={ "lang-ini.mkii", "lang-ini.mkiv" },
+ ["title"]={
+ ["cs"]="jazyky",
+ ["de"]="Sprache",
+ ["en"]="language",
+ ["fr"]="langue",
+ ["it"]="lingua",
+ ["nl"]="taal",
+ ["no"]="sprøk",
+ ["ro"]="limbi",
+ },
+ },
+ ["metapost"]={
+ ["1"]={
+ ["cs"]="loading metapost library --",
+ ["de"]="Lade metapost Bibliothek --",
+ ["en"]="loading metapost library --",
+ ["fr"]="chargement de la bibliothèque metapost --",
+ ["it"]="caricamento della libreria metapost --",
+ ["nl"]="metapost bibliotheek -- wordt geladen",
+ ["no"]="metapost bibliotek -- blir lest inn",
+ ["ro"]="se incarca biblioteca metapost --",
+ },
+ ["files"]={ "meta-ini.mkii", "meta-ini.mkiv" },
+ ["title"]={
+ ["cs"]="metapost",
+ ["de"]="metapost",
+ ["en"]="metapost",
+ ["fr"]="metapost",
+ ["it"]="metapost",
+ ["nl"]="metapost",
+ ["no"]="metapost",
+ ["ro"]="metapost",
+ },
+ },
+ ["references"]={
+ ["1"]={
+ ["cs"]="neznama reference --",
+ ["de"]="unbekannte Referenz --",
+ ["en"]="unknown reference --",
+ ["fr"]="réference -- inconnue",
+ ["it"]="riferimento sconosciuto --",
+ ["nl"]="onbekende verwijzing --",
+ ["no"]="ukjent referanse --",
+ ["ro"]="referinta necunoscuta --",
+ },
+ ["2"]={
+ ["cs"]="duplicitni reference -- na strane --",
+ ["de"]="doppelte Referenz -- auf Seite --",
+ ["en"]="duplicate reference -- on page --",
+ ["fr"]="réference -- dupliquée à la page --",
+ ["it"]="riferimento duplicato -- a pagina --",
+ ["nl"]="dubbele verwijzing -- op pagina --",
+ ["no"]="duplikat referanse -- pø side --",
+ ["ro"]="referinta duplicat -- la pagina --",
+ },
+ ["21"]={
+ ["cs"]="dokument -- nacten",
+ ["de"]="Dokument -- geladen",
+ ["en"]="document -- loaded",
+ ["fr"]="document -- chargé",
+ ["it"]="documento -- caricato",
+ ["nl"]="document -- geladen",
+ ["no"]="dokument -- er lest inn",
+ ["ro"]="documentul -- este incarcat",
+ },
+ ["22"]={
+ ["cs"]="dokument -- neni interaktivni",
+ ["de"]="Dokument -- ist nicht aktiv",
+ ["en"]="document -- is not interactive",
+ ["fr"]="le document -- n'est pas interactif",
+ ["it"]="il documento -- non ø interattivo",
+ ["nl"]="document -- is niet interactief",
+ ["no"]="dokument -- er ikke interaktivt",
+ ["ro"]="documentul -- nu este interactiv",
+ },
+ ["23"]={
+ ["cs"]="obskurni (nejasna) reference -- (prefix=--)",
+ ["de"]="Obskure Referenz -- (Prefix=--)",
+ ["en"]="obscure reference -- (prefix=--)",
+ ["fr"]="reference -- indéterminé (préfixe=--)",
+ ["it"]="riferimento ambiguo -- (prefisso=--)",
+ ["nl"]="onduidelijke verwijzing -- (prefix=--)",
+ ["no"]="obskur referanse -- (Prefix=--)",
+ ["ro"]="referinta obscura -- (prefix=--)",
+ },
+ ["24"]={
+ ["en"]="references from document '--' are not exported",
+ },
+ ["25"]={
+ ["en"]="references from document '--' are not imported (export again)",
+ },
+ ["26"]={
+ ["en"]="references from document '--' are imported",
+ },
+ ["3"]={
+ ["cs"]="neznamy typ reference --",
+ ["de"]="unbekannte Referenz Typ --",
+ ["en"]="unknown reference type --",
+ ["fr"]="type -- de réference inconnu",
+ ["it"]="riferimento di tipo sconosciuto --",
+ ["nl"]="type verwijzing -- onbekend",
+ ["no"]="ukjent referansetype --",
+ ["ro"]="tip necunoscut de referinta --",
+ },
+ ["30"]={
+ ["cs"]="neznamy objekt --",
+ ["de"]="unbekanntes Object --",
+ ["en"]="unknown object --",
+ ["fr"]="objet -- inconnu",
+ ["it"]="oggetto sconosciuto --",
+ ["nl"]="onbekend object --",
+ ["no"]="ukjent objekt --",
+ ["ro"]="obiect necunoscut --",
+ },
+ ["31"]={
+ ["cs"]="duplicitni object --",
+ ["de"]="doppeltes Object --",
+ ["en"]="duplicate object --",
+ ["fr"]="objet -- dupliqué",
+ ["it"]="oggetto duplicato --",
+ ["nl"]="dubbel object --",
+ ["no"]="duplikat objekt --",
+ ["ro"]="obiect duplicat --",
+ },
+ ["4"]={
+ ["cs"]="nedovolena reference --",
+ ["de"]="illegale Referenz --",
+ ["en"]="illegal reference --",
+ ["fr"]="réference -- inconnue",
+ ["it"]="riferimento illecito --",
+ ["nl"]="verboden verwijzing --",
+ ["no"]="ulovlig referanse --",
+ ["ro"]="referinta eronata --",
+ },
+ ["files"]={ "core-obj.tex", "core-ref.tex", "strc-ref.tex" },
+ ["title"]={
+ ["cs"]="reference",
+ ["de"]="referenzen",
+ ["en"]="references",
+ ["fr"]="réferences",
+ ["it"]="riferimenti",
+ ["nl"]="verwijzingen",
+ ["no"]="referanser",
+ ["ro"]="referinte",
+ },
+ },
+ ["regimes"]={
+ ["1"]={
+ ["cs"]="kodovani --",
+ ["de"]="Kodierung --",
+ ["en"]="regime --",
+ ["fr"]="encodage --",
+ ["it"]="codifica --",
+ ["nl"]="regime --",
+ ["no"]="koding --",
+ ["ro"]="codificarea --",
+ },
+ ["2"]={
+ ["cs"]="je nacteno kodovani --",
+ ["de"]="Kodierung -- ist geladen",
+ ["en"]="regime -- is loaded",
+ ["fr"]="l'encodage -- est chargé",
+ ["it"]="codifica -- caricata",
+ ["nl"]="regime -- wordt geladen",
+ ["no"]="koding -- er lest inn",
+ ["ro"]="codificarea -- este Encarcata",
+ },
+ ["3"]={
+ ["cs"]="nezname kodovani --",
+ ["de"]="Unbekannte Kodierung --",
+ ["en"]="unknown regime --",
+ ["fr"]="encodage -- inconnu",
+ ["it"]="codifica sconosciuta --",
+ ["nl"]="onbekend regime --",
+ ["no"]="ukjent koding --",
+ ["ro"]="codificarea -- este necunoscuta",
+ },
+ ["files"]={ "regi-ini.mkii" },
+ ["title"]={
+ ["cs"]="kodovani",
+ ["de"]="Kodierung",
+ ["en"]="regime",
+ ["fr"]="encodage",
+ ["it"]="codifica",
+ ["nl"]="regime",
+ ["no"]="koding",
+ ["ro"]="codificari",
+ },
+ },
+ ["specials"]={
+ ["1"]={
+ ["cs"]="-- nacteno",
+ ["de"]="-- geladen",
+ ["en"]="-- loaded",
+ ["fr"]="-- chargé",
+ ["it"]="-- caricato",
+ ["nl"]="-- geladen",
+ ["no"]="-- er lest inn",
+ ["ro"]="-- incarcat",
+ },
+ ["2"]={
+ ["cs"]="neni dovoleno hlubsi zanoreni --",
+ ["de"]="keine tiefere Verschachtelung erlaubt --",
+ ["en"]="no deeper nesting is permitted --",
+ ["fr"]="pas d'imbracations plus profondes ne sont permises --",
+ ["it"]="non ø permesso un annidamento maggiore --",
+ ["nl"]="verdere nesting is niet toegestaan --",
+ ["no"]="dypere 'nesting' er ikke tillatt --",
+ ["ro"]="nu este permis un nivel de imbricare mai mare --",
+ },
+ ["3"]={
+ ["cs"]="-- je resetovano",
+ ["de"]="-- ist zurueckgesetzt",
+ ["en"]="-- is reset",
+ ["fr"]="-- est remis à zéro",
+ ["it"]="-- reimpostato",
+ ["nl"]="-- gereset",
+ ["no"]="-- er tilbakestilt",
+ ["ro"]="-- s-a resetat",
+ },
+ ["4"]={
+ ["cs"]="prikaz -- neexistuje",
+ ["de"]="Befehl -- existiert nicht",
+ ["en"]="command -- does not exist",
+ ["fr"]="la commande -- n'existe pas",
+ ["it"]="il comando -- non esiste",
+ ["nl"]="commando -- bestaat niet",
+ ["no"]="kommando -- eksisterer ikke",
+ ["ro"]="comanda -- nu exista",
+ },
+ ["5"]={
+ ["cs"]="nacita se definicni soubor --",
+ ["de"]="lade Definitionsdatei --",
+ ["en"]="loading definition file --",
+ ["fr"]="chargement du fichier de définition --",
+ ["it"]="caricamento del file di definizione --",
+ ["nl"]="definitiefile -- wordt geladen",
+ ["no"]="leser inn definisjonsfil for --",
+ ["ro"]="se incarca fisierul de definitii --",
+ },
+ ["6"]={
+ ["cs"]="zanoreni neni dovoleno",
+ ["de"]="Verschachtelung nicht erlaubt",
+ ["en"]="nesting is not permitted",
+ ["fr"]="l'imbrication n'est pas permise",
+ ["it"]="annidamento non permesso",
+ ["nl"]="nesting is niet toegestaan",
+ ["no"]="'nesting' er ikke tillatt",
+ ["ro"]="imbricarea nu este permisa",
+ },
+ ["7"]={
+ ["cs"]="neznamy ovladac (driver) --",
+ ["de"]="unbekante Driver --",
+ ["en"]="unknown driver --",
+ ["fr"]="pilote -- inconnu",
+ ["it"]="driver sconosciuto --",
+ ["nl"]="onbekende driver --",
+ ["no"]="ukjent driver --",
+ ["ro"]="driver necunoscut --",
+ },
+ ["files"]={ "spec-ini.tex" },
+ ["title"]={
+ ["cs"]="speciality",
+ ["de"]="spezielles",
+ ["en"]="specials",
+ ["fr"]="specials",
+ ["it"]="specialitø",
+ ["nl"]="specials",
+ ["no"]="specials",
+ ["ro"]="specials",
+ },
+ },
+ ["structures"]={
+ ["1"]={
+ ["cs"]="zacatek oddilu (sekce) --",
+ ["de"]="Begin des Abschnittsblocks --",
+ ["en"]="begin of sectionblock --",
+ ["fr"]="début de blocsection --",
+ ["it"]="inizio del blocco (sezione) --",
+ ["nl"]="begin van sectieblok --",
+ ["no"]="starten av blokk -- (seksjon)",
+ ["ro"]="inceput de bloc sectiune --",
+ },
+ ["2"]={
+ ["cs"]="konec oddilu (sekce) --",
+ ["de"]="Ende des Abschnittsblocks --",
+ ["en"]="end of sectionblock --",
+ ["fr"]="fin de blocsection --",
+ ["it"]="fine del blocco (sezione) --",
+ ["nl"]="eind van sectieblok --",
+ ["no"]="slutten av blokk -- (seksjon)",
+ ["ro"]="sfarsit de bloc sectiune --",
+ },
+ ["files"]={ "core-sec.mkii", "core-sec.mkiv", "strc-sbe.tex" },
+ ["title"]={
+ ["cs"]="struktury",
+ ["de"]="struktur",
+ ["en"]="structure",
+ ["fr"]="structure",
+ ["it"]="struttura",
+ ["nl"]="structuur",
+ ["no"]="struktur",
+ ["ro"]="structuri",
+ },
+ },
+ ["symbols"]={
+ ["1"]={
+ ["cs"]="nacita se soubor symbolu --",
+ ["de"]="Lade Symboldatei --",
+ ["en"]="loading symbolset --",
+ ["fr"]="chargement du jeu de symbole --",
+ ["it"]="caricamento gruppo di simboli --",
+ ["nl"]="symboolset -- wordt geladen",
+ ["no"]="leser inn symbolsett --",
+ ["ro"]="se incarca setul de simboluri --",
+ },
+ ["files"]={ "symb-ini.tex" },
+ ["title"]={
+ ["cs"]="symboly",
+ ["de"]="Symbole",
+ ["en"]="symbols",
+ ["fr"]="symboles",
+ ["it"]="simboli",
+ ["nl"]="symbolen",
+ ["no"]="symboler",
+ ["ro"]="simboluri",
+ },
+ },
+ ["systems"]={
+ ["1"]={
+ ["cs"]="nacteni pomocneho souboru odlozeno (typemode)",
+ ["de"]="Laden der Hilfsdatei aufgeschoben (Eingabe-Modus)",
+ ["en"]="loading utility-file postponed (typemode)",
+ ["fr"]="chargement de fichier utilitaire reporté (typemode)",
+ ["it"]="caricamento dei file supplementari posticipato (typemode)",
+ ["nl"]="laden hulpfile uitgesteld (typemode)",
+ ["no"]="innlesning av hjelpefila utsatt (typemode)",
+ ["ro"]="se incarca utilitarul-fisierul este amanat (typemode)",
+ },
+ ["10"]={
+ ["cs"]="nepouzivejte em v --",
+ ["de"]="Benutzte kein em in --",
+ ["en"]="don't use em in --",
+ ["fr"]="n'utilisez pas em dans --",
+ ["it"]="non usare em in --",
+ ["nl"]="gebruik geen em in --",
+ ["no"]="ikke bruk em i --",
+ ["ro"]="nu folositi em in --",
+ },
+ ["11"]={
+ ["cs"]="vytvarim jednoduchy pomocny soubor",
+ ["de"]="Erstelle einfache Hilfdatei",
+ ["en"]="building simple util",
+ ["fr"]="construction util simple",
+ ["it"]="costruzione di un semplice supplemento",
+ ["nl"]="aanmaken basale hulpfile",
+ ["no"]="lager enkel hjelpefil",
+ ["ro"]="se creeaza un utilitar simplu",
+ },
+ ["12"]={
+ ["cs"]="pomosny soubor neni setriden, pouzijte texutil",
+ ["de"]="Die Hilfdatei ist nicht sortiert, verwende texutil",
+ ["en"]="the utility-file is not sorted, use texutil",
+ ["fr"]="le fichier utilitaire n'est pas trié, utilise texutil",
+ ["it"]="file di supplemento non ordinato, usare texutil",
+ ["nl"]="de hulpfile is niet gesorteerd, gebruik texutil",
+ ["no"]="hjelpefila er ikke sortert, bruk texutil",
+ ["ro"]="fisierul utilitar nu este sortat, folositi texutil",
+ },
+ ["13"]={
+ ["cs"]="znacka -- definovana --",
+ ["de"]="Beschriftung -- definiert --",
+ ["en"]="mark -- defined --",
+ ["fr"]="marquage -- defini --",
+ ["it"]="marcatura -- definita --",
+ ["nl"]="markering -- gedefinieerd --",
+ ["no"]="markering -- definert --",
+ ["ro"]="marcajul -- definit --",
+ },
+ ["14"]={
+ ["cs"]="vynucena nova stranka v seznamu na --",
+ ["de"]="Erzwungendes Seitenumbruch in Liste bei --",
+ ["en"]="forced newpage in list at --",
+ ["fr"]="nouvellepage forcée dans la liste à --",
+ ["it"]="nuova pagina obbligata in lista a --",
+ ["nl"]="geforceerde paginaovergang in lijst voor --",
+ ["no"]="tvunget sideskift i liste ved --",
+ ["ro"]="s-a fortat trecere pa pagina noua in lista la --",
+ },
+ ["15"]={
+ ["cs"]="uklada se buffer --",
+ ["de"]="Speichere Buffer --",
+ ["en"]="saving buffer --",
+ ["fr"]="sauvegarde du tampon (buffer) --",
+ ["it"]="salvataggio del buffer --",
+ ["nl"]="wegschrijven buffer --",
+ ["no"]="lagrer Buffer --",
+ ["ro"]="buffer salvat --",
+ },
+ ["16"]={
+ ["cs"]="sazi se buffer --",
+ ["de"]="Setzte Buffer --",
+ ["en"]="typesetting buffer --",
+ ["fr"]="composition du tampon (buffer) --",
+ ["it"]="composizione del buffer --",
+ ["nl"]="inlezen buffer --",
+ ["no"]="tegnsetter buffer --",
+ ["ro"]="buffer-ul -- s-a cules",
+ },
+ ["17"]={
+ ["cs"]="sazi se doslovny (verbatim) buffer --",
+ ["de"]="Setzte tippen-Buffer --",
+ ["en"]="typesetting verbatim buffer --",
+ ["fr"]="composition textuelle du tampon (buffer) --",
+ ["it"]="composizione verbatim del buffer --",
+ ["nl"]="verbatim inlezen buffer --",
+ ["no"]="tegnsetter verbatim-buffer --",
+ ["ro"]="se culege buffer-ul verbatim --",
+ },
+ ["18"]={
+ ["cs"]="synonymum -- -- neexistuje",
+ ["de"]="Synonym -- -- existiert nicht",
+ ["en"]="synonym -- -- does not exist",
+ ["fr"]="le synonyme -- -- n'existe pas",
+ ["it"]="sinonimo -- -- non esistente",
+ ["nl"]="synoniem -- -- bestaat niet",
+ ["no"]="synonym -- -- eksisterer ikke",
+ ["ro"]="sinonimul -- -- nu exista",
+ },
+ ["19"]={
+ ["cs"]="vyznam (synonyma) -- nacten",
+ ["de"]="Bedeutung (synonyme) von -- geladen",
+ ["en"]="meaning (synonyms) of -- loaded",
+ ["fr"]="signification (synonymes) de -- chargée",
+ ["it"]="significato (sinonimi) di -- caricato",
+ ["nl"]="betekenissen (synoniemen) van -- geladen",
+ ["no"]="betydning (synonymer) av -- er lest inn",
+ ["ro"]="intelesul (sinonimele) pentru -- incarcat",
+ },
+ ["2"]={
+ ["cs"]="-- nacteno",
+ ["de"]="-- geladen",
+ ["en"]="-- loaded",
+ ["fr"]="-- chargé",
+ ["it"]="-- caricato",
+ ["nl"]="-- geladen",
+ ["no"]="-- er lest inn",
+ ["ro"]="-- s-a incarcat",
+ },
+ ["20"]={
+ ["cs"]="vyznam (trideni) -- nacten",
+ ["de"]="Bedeutung (sortieren) von -- geladen",
+ ["en"]="meaning (sorts) of -- loaded",
+ ["fr"]="signification (tris) de -- chargée",
+ ["it"]="significato (specie) di -- caricato",
+ ["nl"]="betekenissen (sorteren) van -- geladen",
+ ["no"]="betydning (sorterer) av -- er lest inn",
+ ["ro"]="intelesul (ordinea) pentru -- incarcat",
+ },
+ ["21"]={
+ ["cs"]="pomocny soubor necten",
+ ["de"]="Die Hilfsdatei ist nicht geladen",
+ ["en"]="no utility data is loaded",
+ ["fr"]="pas de données utilitaires chargées",
+ ["it"]="nessuna informazione supplementare caricata",
+ ["nl"]="de hulpfile is niet geladen",
+ ["no"]="hjelpefila er ikke lest inn",
+ ["ro"]="nici o data utilitara nu este incarcata",
+ },
+ ["22"]={
+ ["cs"]="pouzijte platny pomocny soubor",
+ ["de"]="Benoetige gueltige Hilfsdateie",
+ ["en"]="use a valid utilityfile",
+ ["fr"]="utilise un fichier utilitaire valide",
+ ["it"]="usare un file supplementare valido",
+ ["nl"]="gebruik een goede hulpfile",
+ ["no"]="bruk en gyldig hjelpefil",
+ ["ro"]="folositi un fisier utilitar valid",
+ },
+ ["23"]={
+ ["cs"]="-- upraveno na --",
+ ["de"]="-- angeordnet auf --",
+ ["en"]="-- arranged at --",
+ ["fr"]="-- arrangé à --",
+ ["it"]="-- sistemato a --",
+ ["nl"]="-- gearrangeerd op --",
+ ["no"]="-- arrangert på --",
+ ["ro"]="-- aranjat la --",
+ },
+ ["24"]={
+ ["cs"]="plovouci bloky",
+ ["de"]="Fliessbloecke",
+ ["en"]="Floatblocks",
+ ["fr"]="blocsflottants",
+ ["it"]="Oggetti mobili",
+ ["nl"]="Plaatsblokken",
+ ["no"]="Flytblokker",
+ ["ro"]="Blocuri",
+ },
+ ["25"]={
+ ["cs"]="reference",
+ ["de"]="Referenzen",
+ ["en"]="References",
+ ["fr"]="Réferences",
+ ["it"]="Riferimenti",
+ ["nl"]="Verwijzingen",
+ ["no"]="Referanser",
+ ["ro"]="Referinte",
+ },
+ ["26"]={
+ ["cs"]="registry",
+ ["de"]="Register",
+ ["en"]="Registers",
+ ["fr"]="Registres",
+ ["it"]="Registri",
+ ["nl"]="Registers",
+ ["no"]="Registere",
+ ["ro"]="Registri",
+ },
+ ["27"]={
+ ["cs"]="verze",
+ ["de"]="Version",
+ ["en"]="Version",
+ ["fr"]="Version",
+ ["it"]="Versione",
+ ["nl"]="Versie",
+ ["no"]="Versjon",
+ ["ro"]="Versiune",
+ },
+ ["4"]={
+ ["cs"]="prikaz -- je jiz definovan",
+ ["de"]="Befehl -- ist bereits definiert",
+ ["en"]="command -- is already defined",
+ ["fr"]="la commande -- est déjà définie",
+ ["it"]="comando -- già definito",
+ ["nl"]="commando -- is al gedefinieerd",
+ ["no"]="kommando -- er allerede definert",
+ ["ro"]="comanda -- este deja definita",
+ },
+ ["41"]={
+ ["cs"]="externi soubor -- ve skupine -- neexistuje",
+ ["de"]="Externe Datei -- in Gruppe -- existiert nicht",
+ ["en"]="external file -- in group -- does not exist",
+ ["fr"]="le fichier externe -- du groupe -- n'existe pas",
+ ["it"]="il file esterno -- del gruppo -- non esiste",
+ ["nl"]="externe file -- in groep -- bestaat niet",
+ ["no"]="ekstern fil -- i gruppe -- eksisterer ikke",
+ ["ro"]="fisierul extern -- din grupul -- nu exista",
+ },
+ ["5"]={
+ ["cs"]="makra z -- nactena",
+ ["de"]="Modul -- geladen",
+ ["en"]="module -- loaded",
+ ["fr"]="module -- chargé",
+ ["it"]="macro del modulo -- caricate",
+ ["nl"]="module -- geladen",
+ ["no"]="makroene i modul -- er lest inn",
+ ["ro"]="macro-urile din modulul -- s-au incarcat",
+ },
+ ["6"]={
+ ["cs"]="zadna makra v -- nenalezena",
+ ["de"]="Modul -- gefunden",
+ ["en"]="module -- not found",
+ ["fr"]="module -- non trouvé",
+ ["it"]="nessuna macro trovata nel modulo --",
+ ["nl"]="geen module -- gevonden",
+ ["no"]="ingen makroer funnet i modul ---",
+ ["ro"]="nu s-au gasit macro-uri in modulul --",
+ },
+ ["7"]={
+ ["cs"]="makra z -- jsou jiz nactena",
+ ["de"]="Modul -- bereits geladen",
+ ["en"]="module -- already loaded",
+ ["fr"]="module -- déjà chargé",
+ ["it"]="macro del modulo -- già caricate",
+ ["nl"]="module -- reeds geladen",
+ ["no"]="makroene i modul -- er allerede lest inn",
+ ["ro"]="macro-urile din modulul -- s-au incarcat deja",
+ },
+ ["8"]={
+ ["cs"]="nova verze pomocneho souboru, je treba druheho behu",
+ ["de"]="Neue Version der Hilfsdatei, zweiter Durchlauf benoetigt",
+ ["en"]="new version of utility file, second pass needed",
+ ["fr"]="nouvelle version de fichier utilitaire, seconde passe nécessaire",
+ ["it"]="nuova versione del file supplementare, seconda passata necessaria",
+ ["nl"]="nieuwe versie hulpfile, tweede run nodig",
+ ["no"]="ny versjon av hjelpefil, andre gjennomkjøring nødvendig",
+ ["ro"]="o noua versiune de fisier utilitar, este necesara o noua trecere",
+ },
+ ["9"]={
+ ["cs"]="-- nenalezeno/nezpracovano",
+ ["de"]="-- nicht gefunden/verarbeitet",
+ ["en"]="-- not found/processed",
+ ["fr"]="-- non trouvé/traité",
+ ["it"]="-- non trovato/elaborato",
+ ["nl"]="-- niet gevonden/geplaatst",
+ ["no"]="-- ikke funnet/behandlet",
+ ["ro"]="-- nu este gasit/procesat",
+ },
+ ["91"]={
+ ["en"]="papertray --",
+ ["nl"]="papierlade --",
+ },
+ ["files"]={ "core-mis.tex", "page-ini.tex", "prag-gen.tex", "strc-mar.tex" },
+ ["title"]={
+ ["cs"]="system",
+ ["de"]="system",
+ ["en"]="system",
+ ["fr"]="système",
+ ["it"]="sistema",
+ ["nl"]="systeem",
+ ["no"]="system",
+ ["ro"]="sistem",
+ },
+ },
+ ["textblocks"]={
+ ["1"]={
+ ["cs"]="nova verze, je treba druhy beh",
+ ["de"]="neue Version, zweiter Durchlauf benoetigt",
+ ["en"]="new version, second pass needed",
+ ["fr"]="nouvelle version, une seconde passe est nécessaire",
+ ["it"]="nuova versione, seconda passata necessaria",
+ ["nl"]="nieuwe versie, tweede run nodig",
+ ["no"]="ny versjon, andre gjennomkjøring nødvendig",
+ ["ro"]="o noua versiune, este nevoie de inca o trecere",
+ },
+ ["10"]={
+ ["cs"]="-- nacteno a zpracovano",
+ ["de"]="-- geladen und verarbeitet",
+ ["en"]="-- loaded and processed",
+ ["fr"]="-- chargé et traité",
+ ["it"]="-- caricato ed elaborato",
+ ["nl"]="-- geladen en verwerkt",
+ ["no"]="-- lest inn og behandlet",
+ ["ro"]="-- incarcat si procesat",
+ },
+ ["11"]={
+ ["cs"]="-- nacteno a vysazeno",
+ ["de"]="-- geladen und gesetzt",
+ ["en"]="-- loaded and typeset",
+ ["fr"]="-- chargé et composé",
+ ["it"]="-- caricato e composto",
+ ["nl"]="-- geladen en geplaatst",
+ ["no"]="-- lest inn og tegnsatt",
+ ["ro"]="-- incarcat si cules",
+ },
+ ["12"]={
+ ["cs"]="-- preskoceno",
+ ["de"]="-- ausgelassen",
+ ["en"]="-- skipped",
+ ["fr"]="-- sauté",
+ ["it"]="-- saltato",
+ ["nl"]="-- overgeslagen",
+ ["no"]="-- utelatt",
+ ["ro"]="-- sarit peste",
+ },
+ ["2"]={
+ ["cs"]="zapisuji bloky do --",
+ ["de"]="schreibe Bloecke zu --",
+ ["en"]="writing blocks to --",
+ ["fr"]="ecriture des blocs vers --",
+ ["it"]="scrittura dei blocchi su --",
+ ["nl"]="wegschrijven blokken naar --",
+ ["no"]="skriver blokker til --",
+ ["ro"]="se scriu blocurile in --",
+ },
+ ["3"]={
+ ["cs"]="ctu bloky z --",
+ ["de"]="lese Bloecke von --",
+ ["en"]="reading blocks from --",
+ ["fr"]="lecture des blocs en provenance de --",
+ ["it"]="lettura dei blocchi da --",
+ ["nl"]="inlezen blokken uit --",
+ ["no"]="leser blokker fra --",
+ ["ro"]="se citesc blocurile din --",
+ },
+ ["4"]={
+ ["cs"]="je treba druhy beh",
+ ["de"]="zweiter Durchlauf benoetigt",
+ ["en"]="second pass needed",
+ ["fr"]="seconde passe nécessaire",
+ ["it"]="seconda passata necessaria",
+ ["nl"]="er is een tweede run nodig",
+ ["no"]="andre gjennomkjøring nødvendig",
+ ["ro"]="este nevoie de inca o trecere",
+ },
+ ["5"]={
+ ["cs"]="-- neni skryto",
+ ["de"]="-- nicht verborgen",
+ ["en"]="-- not hidden",
+ ["fr"]="-- non caché",
+ ["it"]="-- non nascosto",
+ ["nl"]="-- niet verborgen",
+ ["no"]="-- ikke skjult",
+ ["ro"]="-- nu este ascuns",
+ },
+ ["6"]={
+ ["cs"]="-- skryto a zpracovano",
+ ["de"]="-- verborgen und verarbeitet",
+ ["en"]="-- hidden and processed",
+ ["fr"]="-- caché et traité",
+ ["it"]="-- nascosto ed elaborato",
+ ["nl"]="-- verborgen en verwerkt",
+ ["no"]="-- skjult og behandlet",
+ ["ro"]="-- ascuns si procesat",
+ },
+ ["7"]={
+ ["cs"]="-- skryto",
+ ["de"]="-- verborgen",
+ ["en"]="-- hidden",
+ ["fr"]="-- caché",
+ ["it"]="-- nascosto",
+ ["nl"]="-- verborgen",
+ ["no"]="-- skjult",
+ ["ro"]="-- ascuns",
+ },
+ ["8"]={
+ ["cs"]="-- vysazeno",
+ ["de"]="-- gesetzt",
+ ["en"]="-- typeset",
+ ["fr"]="-- composé",
+ ["it"]="-- composto",
+ ["nl"]="-- gehandhaafd",
+ ["no"]="-- tegnsatt",
+ ["ro"]="-- cules",
+ },
+ ["9"]={
+ ["cs"]="-- nevysazeno",
+ ["de"]="-- nicht gesetzt",
+ ["en"]="-- not typeset",
+ ["fr"]="-- non composé",
+ ["it"]="-- non composto",
+ ["nl"]="-- niet gehandhaafd",
+ ["no"]="-- ikke tegnsatt",
+ ["ro"]="-- nu este cules",
+ },
+ ["files"]={ "core-blk.tex" },
+ ["title"]={
+ ["cs"]="textovyblok",
+ ["de"]="textblock",
+ ["en"]="textblocks",
+ ["fr"]="blocs de texte",
+ ["it"]="blocchi di testo",
+ ["nl"]="tekstblokken",
+ ["no"]="tekstblokker",
+ ["ro"]="blocuri de text",
+ },
+ },
+ ["verbatims"]={
+ ["1"]={
+ ["cs"]="soubor -- neexistuje",
+ ["de"]="Datei -- existiert nicht",
+ ["en"]="file -- does not exist",
+ ["fr"]="le fichier -- n'existe pas",
+ ["it"]="il file -- non esiste",
+ ["nl"]="file -- bestaat niet",
+ ["no"]="fil -- eksisterer ikke",
+ ["ro"]="fisierul -- nu exista",
+ },
+ ["files"]={ "core-ver.tex" },
+ ["title"]={
+ ["cs"]="verbatim",
+ ["de"]="verbatim",
+ ["en"]="verbatim",
+ ["fr"]="verbatim",
+ ["it"]="verbatim",
+ ["nl"]="typen",
+ ["no"]="verbatim",
+ ["ro"]="verbatim",
+ },
+ },
+ ["versions"]={
+ ["1"]={
+ ["cs"]="postradam @+",
+ ["de"]="fehlendes @+",
+ ["en"]="missing @+",
+ ["fr"]="@+ manquant",
+ ["it"]="@+ mancante",
+ ["nl"]="er mankeert een @+",
+ ["no"]="manglende @+",
+ ["ro"]="lipseste @+",
+ },
+ ["2"]={
+ ["cs"]="oznacuji se strany",
+ ["de"]="Erstelle Seiten",
+ ["en"]="marking pages",
+ ["fr"]="marquage des pages",
+ ["it"]="marcatura pagine",
+ ["nl"]="markeren pagina's",
+ ["no"]="markerer sider",
+ ["ro"]="pagini marcate",
+ },
+ ["3"]={
+ ["cs"]="oznacene strany: --",
+ ["de"]="Ausgewaehlte Seiten: --",
+ ["en"]="selected pages: --",
+ ["fr"]="pages sélectionnées : --",
+ ["it"]="pagine selezionate: --",
+ ["nl"]="geselecteerde pagina's: --",
+ ["no"]="valgte sider: --",
+ ["ro"]="pagini selectate: --",
+ },
+ ["files"]={ "core-int.tex" },
+ ["title"]={
+ ["cs"]="verze",
+ ["de"]="Version",
+ ["en"]="version",
+ ["fr"]="version",
+ ["it"]="version",
+ ["nl"]="versie",
+ ["no"]="versjon",
+ ["ro"]="versiuni",
+ },
+ },
+}
diff --git a/tex/context/base/mult-mfr.tex b/tex/context/base/mult-mfr.tex
new file mode 100644
index 000000000..78e4f9f17
--- /dev/null
+++ b/tex/context/base/mult-mfr.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{réference -- inconnue}
+\setinterfacemessage{references}{3}{type -- de réference inconnu}
+\setinterfacemessage{references}{2}{réference -- dupliquée à la page --}
+\setinterfacemessage{references}{4}{réference -- inconnue}
+\setinterfacemessage{references}{30}{objet -- inconnu}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{réferences}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{objet -- dupliqué}
+\setinterfacemessage{references}{21}{document -- chargé}
+\setinterfacemessage{references}{22}{le document -- n'est pas interactif}
+\setinterfacemessage{references}{23}{reference -- indéterminé (préfixe=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{number --}
+\setinterfacemessage{handlings}{1}{manipulation -- de police}
+\setinterfacemessage{handlings}{3}{manipulation -- inconnue de police}
+\setinterfacemessage{handlings}{2}{la manipulation -- de police est chargée}
+\setinterfacemessage{handlings}{title}{manipulation}
+\setinterfacemessage{systems}{title}{système}
+\setinterfacemessage{systems}{41}{le fichier externe -- du groupe -- n'existe pas}
+\setinterfacemessage{systems}{9}{-- non trouvé/traité}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{nouvelle version de fichier utilitaire, seconde passe nécessaire}
+\setinterfacemessage{systems}{21}{pas de données utilitaires chargées}
+\setinterfacemessage{systems}{20}{signification (tris) de -- chargée}
+\setinterfacemessage{systems}{5}{module -- chargé}
+\setinterfacemessage{systems}{4}{la commande -- est déjà définie}
+\setinterfacemessage{systems}{27}{Version}
+\setinterfacemessage{systems}{26}{Registres}
+\setinterfacemessage{systems}{25}{Réferences}
+\setinterfacemessage{systems}{24}{blocsflottants}
+\setinterfacemessage{systems}{1}{chargement de fichier utilitaire reporté (typemode)}
+\setinterfacemessage{systems}{23}{-- arrangé à --}
+\setinterfacemessage{systems}{22}{utilise un fichier utilitaire valide}
+\setinterfacemessage{systems}{2}{-- chargé}
+\setinterfacemessage{systems}{19}{signification (synonymes) de -- chargée}
+\setinterfacemessage{systems}{18}{le synonyme -- -- n'existe pas}
+\setinterfacemessage{systems}{7}{module -- déjà chargé}
+\setinterfacemessage{systems}{6}{module -- non trouvé}
+\setinterfacemessage{systems}{14}{nouvellepage forcée dans la liste à --}
+\setinterfacemessage{systems}{15}{sauvegarde du tampon (buffer) --}
+\setinterfacemessage{systems}{16}{composition du tampon (buffer) --}
+\setinterfacemessage{systems}{17}{composition textuelle du tampon (buffer) --}
+\setinterfacemessage{systems}{13}{marquage -- defini --}
+\setinterfacemessage{systems}{12}{le fichier utilitaire n'est pas trié, utilise texutil}
+\setinterfacemessage{systems}{11}{construction util simple}
+\setinterfacemessage{systems}{10}{n'utilisez pas em dans --}
+\setinterfacemessage{floatblocks}{1}{-- renuméroté / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- déplacé}
+\setinterfacemessage{floatblocks}{2}{-- sauvegardé}
+\setinterfacemessage{floatblocks}{5}{ordre adapté}
+\setinterfacemessage{floatblocks}{4}{-- placé}
+\setinterfacemessage{floatblocks}{7}{n flottants de bas de page limité à --}
+\setinterfacemessage{floatblocks}{6}{n flottants de haut de page limité à --}
+\setinterfacemessage{floatblocks}{9}{ordre perturbé}
+\setinterfacemessage{floatblocks}{8}{moins de -- lignes}
+\setinterfacemessage{floatblocks}{title}{blocs de flottants}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{indéfini}
+\setinterfacemessage{floatblocks}{11}{pas de bloc donné}
+\setinterfacemessage{floatblocks}{10}{-- limité}
+\setinterfacemessage{interactions}{1}{ratio d'aspect -- x -- (b x h)}
+\setinterfacemessage{interactions}{3}{inactif}
+\setinterfacemessage{interactions}{2}{actif}
+\setinterfacemessage{interactions}{5}{le fichier joint -- est inconnu}
+\setinterfacemessage{interactions}{4}{pas de synchronisation de page (--) dans le hmode}
+\setinterfacemessage{interactions}{6}{le fichier joint -- n'existe pas}
+\setinterfacemessage{interactions}{title}{interaction}
+\setinterfacemessage{interactions}{21}{-- code inseré}
+\setinterfacemessage{regimes}{1}{encodage --}
+\setinterfacemessage{regimes}{3}{encodage -- inconnu}
+\setinterfacemessage{regimes}{2}{l'encodage -- est chargé}
+\setinterfacemessage{regimes}{title}{encodage}
+\setinterfacemessage{structures}{1}{début de blocsection --}
+\setinterfacemessage{structures}{title}{structure}
+\setinterfacemessage{structures}{2}{fin de blocsection --}
+\setinterfacemessage{linguals}{1}{les motifs -- pour -- sont chargés (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{hyphenations -- pour -- chargés (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{pas de motifs -- pour -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{les motifs pour -- ne sont pas chargés}
+\setinterfacemessage{linguals}{4}{pas d'hyphenations -- pour -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{les options spécifiques de langue [--] introduisent un -- saut}
+\setinterfacemessage{linguals}{6}{langue -- non définie}
+\setinterfacemessage{linguals}{9}{la langue -- est active}
+\setinterfacemessage{linguals}{8}{les options spécifiques de langue [--] sont ajoutés en douceur}
+\setinterfacemessage{linguals}{title}{langue}
+\setinterfacemessage{linguals}{10}{motifs -- chargés}
+\setinterfacemessage{verbatims}{1}{le fichier -- n'existe pas}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{le filtre -- est chargé}
+\setinterfacemessage{filters}{title}{filtre}
+\setinterfacemessage{filters}{2}{filtre -- inconnu}
+\setinterfacemessage{textblocks}{1}{nouvelle version, une seconde passe est nécessaire}
+\setinterfacemessage{textblocks}{3}{lecture des blocs en provenance de --}
+\setinterfacemessage{textblocks}{2}{ecriture des blocs vers --}
+\setinterfacemessage{textblocks}{5}{-- non caché}
+\setinterfacemessage{textblocks}{4}{seconde passe nécessaire}
+\setinterfacemessage{textblocks}{7}{-- caché}
+\setinterfacemessage{textblocks}{6}{-- caché et traité}
+\setinterfacemessage{textblocks}{9}{-- non composé}
+\setinterfacemessage{textblocks}{8}{-- composé}
+\setinterfacemessage{textblocks}{title}{blocs de texte}
+\setinterfacemessage{textblocks}{12}{-- sauté}
+\setinterfacemessage{textblocks}{11}{-- chargé et composé}
+\setinterfacemessage{textblocks}{10}{-- chargé et traité}
+\setinterfacemessage{encodings}{1}{encodage --}
+\setinterfacemessage{encodings}{3}{encodage -- inconnu}
+\setinterfacemessage{encodings}{2}{l'encodage -- est chargé}
+\setinterfacemessage{encodings}{title}{encodage}
+\setinterfacemessage{columns}{1}{seules -- colonnes possibles}
+\setinterfacemessage{columns}{3}{problèmes, désactive l'équilibrage}
+\setinterfacemessage{columns}{2}{utilisez \string\filbreak\space en tant qu'alternative}
+\setinterfacemessage{columns}{5}{flottant en partie inférieure pas encore supporté}
+\setinterfacemessage{columns}{4}{flottant en partie supérieure pas encore supporté}
+\setinterfacemessage{columns}{7}{équilibrage abandonné après 100 pas}
+\setinterfacemessage{columns}{6}{-- flottant(s) reporté(s)}
+\setinterfacemessage{columns}{9}{vérification des irrégularités}
+\setinterfacemessage{columns}{8}{équilibré en -- pas}
+\setinterfacemessage{columns}{title}{colonnes}
+\setinterfacemessage{columns}{13}{flottant large déplacé dans la partie supérieure de la colonne}
+\setinterfacemessage{columns}{12}{flottant déplacé à la colonne suivante / --}
+\setinterfacemessage{columns}{11}{flottant mis à la largeur de la colonne}
+\setinterfacemessage{columns}{10}{(moins de) 1 ligne restante}
+\setinterfacemessage{symbols}{1}{chargement du jeu de symbole --}
+\setinterfacemessage{symbols}{title}{symboles}
+\setinterfacemessage{files}{1}{le synonyme de fichier -- est déjà utilisé pour --}
+\setinterfacemessage{files}{title}{fichiers}
+\setinterfacemessage{versions}{1}{@+ manquant}
+\setinterfacemessage{versions}{3}{pages sélectionnées : --}
+\setinterfacemessage{versions}{2}{marquage des pages}
+\setinterfacemessage{versions}{title}{version}
+\setinterfacemessage{specials}{1}{-- chargé}
+\setinterfacemessage{specials}{3}{-- est remis à zéro}
+\setinterfacemessage{specials}{2}{pas d'imbracations plus profondes ne sont permises --}
+\setinterfacemessage{specials}{5}{chargement du fichier de définition --}
+\setinterfacemessage{specials}{4}{la commande -- n'existe pas}
+\setinterfacemessage{specials}{7}{pilote -- inconnu}
+\setinterfacemessage{specials}{6}{l'imbrication n'est pas permise}
+\setinterfacemessage{specials}{title}{specials}
+\setinterfacemessage{layouts}{1}{hauteurtexte adaptée avec -- à la page --}
+\setinterfacemessage{layouts}{3}{-- times text postponed}
+\setinterfacemessage{layouts}{2}{-- times postponed text placed}
+\setinterfacemessage{layouts}{5}{blocsmarge inactifs}
+\setinterfacemessage{layouts}{4}{blocsmarge actifs}
+\setinterfacemessage{layouts}{7}{calcul de l'espace pour le logo}
+\setinterfacemessage{layouts}{6}{jeu de souspage -- traité (taille --)}
+\setinterfacemessage{layouts}{9}{pas plus de -- niveaux pour l'instant dans les élémentarisations}
+\setinterfacemessage{layouts}{8}{calcul des arrières-plans}
+\setinterfacemessage{layouts}{title}{calque}
+\setinterfacemessage{layouts}{11}{espacement -- non permis en modegrille}
+\setinterfacemessage{layouts}{10}{-- et -- ne sont pas ajoutés à 1.0}
+\setinterfacemessage{fonts}{1}{encodage --}
+\setinterfacemessage{fonts}{3}{variante -- inconnue}
+\setinterfacemessage{fonts}{2}{la variante -- est chargée}
+\setinterfacemessage{fonts}{5}{le style -- n'est pas défini}
+\setinterfacemessage{fonts}{4}{policecorps -- n'est pas définie}
+\setinterfacemessage{fonts}{7}{format -- inconnu}
+\setinterfacemessage{fonts}{6}{-- est chargé}
+\setinterfacemessage{fonts}{14}{policecorps -- est défini (une définition globale pourrait être plus adéquat)}
+\setinterfacemessage{fonts}{8}{style -- défini}
+\setinterfacemessage{fonts}{title}{corps de texte}
+\setinterfacemessage{fonts}{10}{fichier de police -- inconnu}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{fichier global --}
+\setinterfacemessage{databases}{2}{fichier local --}
+\setinterfacemessage{databases}{4}{fichier inconnu --}
+\setinterfacemessage{databases}{title}{bases de données}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{chargement du jeu de script --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{préambule -- inconnu}
+\setinterfacemessage{check}{1}{manquant ou dégroupé '=' après '--' à la ligne --}
+\setinterfacemessage{check}{3}{-- -- remplace une macro, utilisez des MAJUSCULES !}
+\setinterfacemessage{check}{2}{-- argument(s) attendu(s) à la ligne --}
+\setinterfacemessage{check}{title}{vérification}
+\setinterfacemessage{metapost}{1}{chargement de la bibliothèque metapost --}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{la figure -- ne peut être trouvée}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{la figure -- n'est pas pré-sélectionnée}
+\setinterfacemessage{figures}{5}{dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{les dimensions de -- chargées implicitement à partir du fichier de figure}
+\setinterfacemessage{figures}{6}{les dimensions de -- calculées par rlxtools}
+\setinterfacemessage{figures}{8}{figureobject -- est réutilisé}
+\setinterfacemessage{figures}{title}{figures}
+\setinterfacemessage{colors}{1}{le système -- est globalement activé}
+\setinterfacemessage{colors}{3}{-- n'est pas défini --}
+\setinterfacemessage{colors}{2}{le système -- est localement activé}
+\setinterfacemessage{colors}{5}{système -- inconnu}
+\setinterfacemessage{colors}{4}{le système -- est chargé}
+\setinterfacemessage{colors}{7}{le palette -- n'est pas disponible}
+\setinterfacemessage{colors}{6}{la palette -- est disponible}
+\setinterfacemessage{colors}{9}{l'espace de couleur -- n'est pas supporté}
+\setinterfacemessage{colors}{8}{la spécification -- de la couleur -- devient noire}
+\setinterfacemessage{colors}{title}{couleurs}
+\setinterfacemessage{colors}{12}{-- est enregistré}
+\setinterfacemessage{colors}{11}{la couleur est convertie en niveau de gris}
+\setinterfacemessage{colors}{10}{-- l'espace de couleur est supporté}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-mit.tex b/tex/context/base/mult-mit.tex
new file mode 100644
index 000000000..6d2a8f516
--- /dev/null
+++ b/tex/context/base/mult-mit.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{riferimento sconosciuto --}
+\setinterfacemessage{references}{3}{riferimento di tipo sconosciuto --}
+\setinterfacemessage{references}{2}{riferimento duplicato -- a pagina --}
+\setinterfacemessage{references}{4}{riferimento illecito --}
+\setinterfacemessage{references}{30}{oggetto sconosciuto --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{riferimenti}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{oggetto duplicato --}
+\setinterfacemessage{references}{21}{documento -- caricato}
+\setinterfacemessage{references}{22}{il documento -- non ø interattivo}
+\setinterfacemessage{references}{23}{riferimento ambiguo -- (prefisso=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{number --}
+\setinterfacemessage{handlings}{1}{font handling --}
+\setinterfacemessage{handlings}{3}{unknown font handling --}
+\setinterfacemessage{handlings}{2}{font handling -- is loaded}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{sistema}
+\setinterfacemessage{systems}{41}{il file esterno -- del gruppo -- non esiste}
+\setinterfacemessage{systems}{9}{-- non trovato/elaborato}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{nuova versione del file supplementare, seconda passata necessaria}
+\setinterfacemessage{systems}{21}{nessuna informazione supplementare caricata}
+\setinterfacemessage{systems}{20}{significato (specie) di -- caricato}
+\setinterfacemessage{systems}{5}{macro del modulo -- caricate}
+\setinterfacemessage{systems}{4}{comando -- già definito}
+\setinterfacemessage{systems}{27}{Versione}
+\setinterfacemessage{systems}{26}{Registri}
+\setinterfacemessage{systems}{25}{Riferimenti}
+\setinterfacemessage{systems}{24}{Oggetti mobili}
+\setinterfacemessage{systems}{1}{caricamento dei file supplementari posticipato (typemode)}
+\setinterfacemessage{systems}{23}{-- sistemato a --}
+\setinterfacemessage{systems}{22}{usare un file supplementare valido}
+\setinterfacemessage{systems}{2}{-- caricato}
+\setinterfacemessage{systems}{19}{significato (sinonimi) di -- caricato}
+\setinterfacemessage{systems}{18}{sinonimo -- -- non esistente}
+\setinterfacemessage{systems}{7}{macro del modulo -- già caricate}
+\setinterfacemessage{systems}{6}{nessuna macro trovata nel modulo --}
+\setinterfacemessage{systems}{14}{nuova pagina obbligata in lista a --}
+\setinterfacemessage{systems}{15}{salvataggio del buffer --}
+\setinterfacemessage{systems}{16}{composizione del buffer --}
+\setinterfacemessage{systems}{17}{composizione verbatim del buffer --}
+\setinterfacemessage{systems}{13}{marcatura -- definita --}
+\setinterfacemessage{systems}{12}{file di supplemento non ordinato, usare texutil}
+\setinterfacemessage{systems}{11}{costruzione di un semplice supplemento}
+\setinterfacemessage{systems}{10}{non usare em in --}
+\setinterfacemessage{floatblocks}{1}{-- rinumerato / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- mosso}
+\setinterfacemessage{floatblocks}{2}{-- salvato}
+\setinterfacemessage{floatblocks}{5}{ordine aggiustato}
+\setinterfacemessage{floatblocks}{4}{-- sistemato}
+\setinterfacemessage{floatblocks}{7}{n di bottom floats limitato a --}
+\setinterfacemessage{floatblocks}{6}{n di top floats limitato a --}
+\setinterfacemessage{floatblocks}{9}{ordine disturbato}
+\setinterfacemessage{floatblocks}{8}{meno di -- righe}
+\setinterfacemessage{floatblocks}{title}{oggetti mobili}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{non definito}
+\setinterfacemessage{floatblocks}{11}{nessun oggetto specificato}
+\setinterfacemessage{floatblocks}{10}{-- limitato}
+\setinterfacemessage{interactions}{1}{rapporto -- x -- (b x a)}
+\setinterfacemessage{interactions}{3}{inattiva}
+\setinterfacemessage{interactions}{2}{attiva}
+\setinterfacemessage{interactions}{5}{unknown attachment --}
+\setinterfacemessage{interactions}{4}{sincronizzazione di pagina (--) non disponibile in hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- does not exist}
+\setinterfacemessage{interactions}{title}{interazione}
+\setinterfacemessage{interactions}{21}{codice -- inserito}
+\setinterfacemessage{regimes}{1}{codifica --}
+\setinterfacemessage{regimes}{3}{codifica sconosciuta --}
+\setinterfacemessage{regimes}{2}{codifica -- caricata}
+\setinterfacemessage{regimes}{title}{codifica}
+\setinterfacemessage{structures}{1}{inizio del blocco (sezione) --}
+\setinterfacemessage{structures}{title}{struttura}
+\setinterfacemessage{structures}{2}{fine del blocco (sezione) --}
+\setinterfacemessage{linguals}{1}{schemi -- per -- caricati (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{sillabazione -- per -- caricata (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{niente schemi -- per -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{schemi per -- non caricati}
+\setinterfacemessage{linguals}{4}{niente sillabazione -- per -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{opzioni specifiche per la lingua [--] introducono un salto --}
+\setinterfacemessage{linguals}{6}{lingua -- non definita}
+\setinterfacemessage{linguals}{9}{lingua -- attiva}
+\setinterfacemessage{linguals}{8}{opzioni specifiche per la lingua [--] aggiunte trasparentemente}
+\setinterfacemessage{linguals}{title}{lingua}
+\setinterfacemessage{linguals}{10}{schemi -- caricati}
+\setinterfacemessage{verbatims}{1}{il file -- non esiste}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{filtro -- caricato}
+\setinterfacemessage{filters}{title}{filtri}
+\setinterfacemessage{filters}{2}{filtro sconosciuto --}
+\setinterfacemessage{textblocks}{1}{nuova versione, seconda passata necessaria}
+\setinterfacemessage{textblocks}{3}{lettura dei blocchi da --}
+\setinterfacemessage{textblocks}{2}{scrittura dei blocchi su --}
+\setinterfacemessage{textblocks}{5}{-- non nascosto}
+\setinterfacemessage{textblocks}{4}{seconda passata necessaria}
+\setinterfacemessage{textblocks}{7}{-- nascosto}
+\setinterfacemessage{textblocks}{6}{-- nascosto ed elaborato}
+\setinterfacemessage{textblocks}{9}{-- non composto}
+\setinterfacemessage{textblocks}{8}{-- composto}
+\setinterfacemessage{textblocks}{title}{blocchi di testo}
+\setinterfacemessage{textblocks}{12}{-- saltato}
+\setinterfacemessage{textblocks}{11}{-- caricato e composto}
+\setinterfacemessage{textblocks}{10}{-- caricato ed elaborato}
+\setinterfacemessage{encodings}{1}{codifica --}
+\setinterfacemessage{encodings}{3}{codifica sconosciuta --}
+\setinterfacemessage{encodings}{2}{codifica -- caricata}
+\setinterfacemessage{encodings}{title}{codifica}
+\setinterfacemessage{columns}{1}{solo -- colonne possibili}
+\setinterfacemessage{columns}{3}{problemi, disabilitare il bilanciamento}
+\setinterfacemessage{columns}{2}{in alternativa, usare \string\filbreak}
+\setinterfacemessage{columns}{5}{float in fondo non ancora supportato}
+\setinterfacemessage{columns}{4}{float in cima non ancora supportato}
+\setinterfacemessage{columns}{7}{bilanciamento annullato dopo 100 passi}
+\setinterfacemessage{columns}{6}{-- float(s) posticipate}
+\setinterfacemessage{columns}{9}{controllare seghettamento}
+\setinterfacemessage{columns}{8}{bilanciamento in -- passo/i}
+\setinterfacemessage{columns}{title}{colonne}
+\setinterfacemessage{columns}{13}{oggetto mobile ampio spostato sopra le colonne}
+\setinterfacemessage{columns}{12}{oggetto mobile spostata alla colonna successiva / --}
+\setinterfacemessage{columns}{11}{oggetto mobile troppo ampio per la colonna}
+\setinterfacemessage{columns}{10}{(meno di) una riga rimasta}
+\setinterfacemessage{symbols}{1}{caricamento gruppo di simboli --}
+\setinterfacemessage{symbols}{title}{simboli}
+\setinterfacemessage{files}{1}{sinonimo file -- già in uso per --}
+\setinterfacemessage{files}{title}{file}
+\setinterfacemessage{versions}{1}{@+ mancante}
+\setinterfacemessage{versions}{3}{pagine selezionate: --}
+\setinterfacemessage{versions}{2}{marcatura pagine}
+\setinterfacemessage{versions}{title}{version}
+\setinterfacemessage{specials}{1}{-- caricato}
+\setinterfacemessage{specials}{3}{-- reimpostato}
+\setinterfacemessage{specials}{2}{non ø permesso un annidamento maggiore --}
+\setinterfacemessage{specials}{5}{caricamento del file di definizione --}
+\setinterfacemessage{specials}{4}{il comando -- non esiste}
+\setinterfacemessage{specials}{7}{driver sconosciuto --}
+\setinterfacemessage{specials}{6}{annidamento non permesso}
+\setinterfacemessage{specials}{title}{specialitø}
+\setinterfacemessage{layouts}{1}{altezza del testo adattata con -- a pagina --}
+\setinterfacemessage{layouts}{3}{testo posticipato -- volte}
+\setinterfacemessage{layouts}{2}{posizionato testo posticipato -- volte}
+\setinterfacemessage{layouts}{5}{blocchi in margine inattivi}
+\setinterfacemessage{layouts}{4}{blocchi in margine attivi}
+\setinterfacemessage{layouts}{7}{calcolo dello spazio per logo}
+\setinterfacemessage{layouts}{6}{gruppo di sottopagine -- elaborato (dimensione --)}
+\setinterfacemessage{layouts}{9}{attualmente non più di -- livelli di elencazione}
+\setinterfacemessage{layouts}{8}{calcolo dello sfondo}
+\setinterfacemessage{layouts}{title}{layout}
+\setinterfacemessage{layouts}{11}{spaziatura -- non permessa in modo griglia}
+\setinterfacemessage{layouts}{10}{-- e -- non sommano a 1.0}
+\setinterfacemessage{fonts}{1}{codifica --}
+\setinterfacemessage{fonts}{3}{variante sconosciuta --}
+\setinterfacemessage{fonts}{2}{variante -- caricata}
+\setinterfacemessage{fonts}{5}{stile -- non definito}
+\setinterfacemessage{fonts}{4}{corpo del testo -- non definito}
+\setinterfacemessage{fonts}{7}{formato sconosciuto --}
+\setinterfacemessage{fonts}{6}{-- caricato}
+\setinterfacemessage{fonts}{14}{corpo del testo -- definito (sarebbe meglio globale)}
+\setinterfacemessage{fonts}{8}{stile -- definito}
+\setinterfacemessage{fonts}{title}{font del corpo}
+\setinterfacemessage{fonts}{10}{file di font sconosciuto --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{file globale --}
+\setinterfacemessage{databases}{2}{file locale --}
+\setinterfacemessage{databases}{4}{file sconosciuto --}
+\setinterfacemessage{databases}{title}{database}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{caricamento dello script set --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{preambolo sconosciuto --}
+\setinterfacemessage{check}{1}{'=' mancante o non raggruppato dopo '--' alla riga --}
+\setinterfacemessage{check}{3}{-- -- sostituisce una macro, usare le MAIUSCOLE!}
+\setinterfacemessage{check}{2}{-- argomento/i attesi alla riga --}
+\setinterfacemessage{check}{title}{controllo}
+\setinterfacemessage{metapost}{1}{caricamento della libreria metapost --}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{figura -- non trovata}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{la figura -- non è preimpostata}
+\setinterfacemessage{figures}{5}{dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{dimensioni di -- caricate dal file di immagini stesso}
+\setinterfacemessage{figures}{6}{dimensioni di -- calcolate da rlxtools}
+\setinterfacemessage{figures}{8}{oggetto-figura -- riutilizzato}
+\setinterfacemessage{figures}{title}{figure}
+\setinterfacemessage{colors}{1}{sistema -- attivato globalmente}
+\setinterfacemessage{colors}{3}{-- non definito --}
+\setinterfacemessage{colors}{2}{sistema -- attivato localmente}
+\setinterfacemessage{colors}{5}{sistema -- sconosciuto}
+\setinterfacemessage{colors}{4}{sistema -- caricato}
+\setinterfacemessage{colors}{7}{tavolozza -- non disponibile}
+\setinterfacemessage{colors}{6}{tavolozza -- resa disponibile}
+\setinterfacemessage{colors}{9}{spazio dei colori -- non supportato}
+\setinterfacemessage{colors}{8}{specifica -- del colore -- convertita in nero}
+\setinterfacemessage{colors}{title}{colore}
+\setinterfacemessage{colors}{12}{-- is registered}
+\setinterfacemessage{colors}{11}{il colore ø convertito in grigio}
+\setinterfacemessage{colors}{10}{spazio dei colori -- supportato}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-mnl.tex b/tex/context/base/mult-mnl.tex
new file mode 100644
index 000000000..b8204a40b
--- /dev/null
+++ b/tex/context/base/mult-mnl.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{onbekende verwijzing --}
+\setinterfacemessage{references}{3}{type verwijzing -- onbekend}
+\setinterfacemessage{references}{2}{dubbele verwijzing -- op pagina --}
+\setinterfacemessage{references}{4}{verboden verwijzing --}
+\setinterfacemessage{references}{30}{onbekend object --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{verwijzingen}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{dubbel object --}
+\setinterfacemessage{references}{21}{document -- geladen}
+\setinterfacemessage{references}{22}{document -- is niet interactief}
+\setinterfacemessage{references}{23}{onduidelijke verwijzing -- (prefix=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{nummer --}
+\setinterfacemessage{handlings}{1}{font afhandeling --}
+\setinterfacemessage{handlings}{3}{onbekende font afhandeling --}
+\setinterfacemessage{handlings}{2}{font afhandeling -- wordt geladen}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{systeem}
+\setinterfacemessage{systems}{41}{externe file -- in groep -- bestaat niet}
+\setinterfacemessage{systems}{9}{-- niet gevonden/geplaatst}
+\setinterfacemessage{systems}{91}{papierlade --}
+\setinterfacemessage{systems}{8}{nieuwe versie hulpfile, tweede run nodig}
+\setinterfacemessage{systems}{21}{de hulpfile is niet geladen}
+\setinterfacemessage{systems}{20}{betekenissen (sorteren) van -- geladen}
+\setinterfacemessage{systems}{5}{module -- geladen}
+\setinterfacemessage{systems}{4}{commando -- is al gedefinieerd}
+\setinterfacemessage{systems}{27}{Versie}
+\setinterfacemessage{systems}{26}{Registers}
+\setinterfacemessage{systems}{25}{Verwijzingen}
+\setinterfacemessage{systems}{24}{Plaatsblokken}
+\setinterfacemessage{systems}{1}{laden hulpfile uitgesteld (typemode)}
+\setinterfacemessage{systems}{23}{-- gearrangeerd op --}
+\setinterfacemessage{systems}{22}{gebruik een goede hulpfile}
+\setinterfacemessage{systems}{2}{-- geladen}
+\setinterfacemessage{systems}{19}{betekenissen (synoniemen) van -- geladen}
+\setinterfacemessage{systems}{18}{synoniem -- -- bestaat niet}
+\setinterfacemessage{systems}{7}{module -- reeds geladen}
+\setinterfacemessage{systems}{6}{geen module -- gevonden}
+\setinterfacemessage{systems}{14}{geforceerde paginaovergang in lijst voor --}
+\setinterfacemessage{systems}{15}{wegschrijven buffer --}
+\setinterfacemessage{systems}{16}{inlezen buffer --}
+\setinterfacemessage{systems}{17}{verbatim inlezen buffer --}
+\setinterfacemessage{systems}{13}{markering -- gedefinieerd --}
+\setinterfacemessage{systems}{12}{de hulpfile is niet gesorteerd, gebruik texutil}
+\setinterfacemessage{systems}{11}{aanmaken basale hulpfile}
+\setinterfacemessage{systems}{10}{gebruik geen em in --}
+\setinterfacemessage{floatblocks}{1}{-- hernummerd / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- verplaatst}
+\setinterfacemessage{floatblocks}{2}{-- bewaard}
+\setinterfacemessage{floatblocks}{5}{volgorde aangepast}
+\setinterfacemessage{floatblocks}{4}{-- geplaatst}
+\setinterfacemessage{floatblocks}{7}{maximaal -- onder}
+\setinterfacemessage{floatblocks}{6}{maximaal -- boven}
+\setinterfacemessage{floatblocks}{9}{volgorde verstoord}
+\setinterfacemessage{floatblocks}{8}{minder dan -- regels}
+\setinterfacemessage{floatblocks}{title}{plaatsblokken}
+\setinterfacemessage{floatblocks}{13}{er is niets te splitsen}
+\setinterfacemessage{floatblocks}{12}{niet gedefinieerd}
+\setinterfacemessage{floatblocks}{11}{geen blok opgegeven}
+\setinterfacemessage{floatblocks}{10}{-- begrensd}
+\setinterfacemessage{interactions}{1}{aspect ratio -- x -- (b x h)}
+\setinterfacemessage{interactions}{3}{niet actief}
+\setinterfacemessage{interactions}{2}{actief}
+\setinterfacemessage{interactions}{5}{onbekend attachment --}
+\setinterfacemessage{interactions}{4}{geen paginasynchronisatie (--) in hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- bestaat niet}
+\setinterfacemessage{interactions}{title}{interactie}
+\setinterfacemessage{interactions}{21}{-- code tussengevoegd}
+\setinterfacemessage{regimes}{1}{regime --}
+\setinterfacemessage{regimes}{3}{onbekend regime --}
+\setinterfacemessage{regimes}{2}{regime -- wordt geladen}
+\setinterfacemessage{regimes}{title}{regime}
+\setinterfacemessage{structures}{1}{begin van sectieblok --}
+\setinterfacemessage{structures}{title}{structuur}
+\setinterfacemessage{structures}{2}{eind van sectieblok --}
+\setinterfacemessage{linguals}{1}{afbreekpatronen -- voor -- geladen (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{afbreekdefinities -- voor -- geladen (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{geen afbreekpatronen -- voor -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{afbreekpatronen voor -- niet geladen}
+\setinterfacemessage{linguals}{4}{geen afbreekdefinities -- voor -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{taal specifieke opties [--] introduceren een skip van --}
+\setinterfacemessage{linguals}{6}{taal -- is niet gedefinieerd}
+\setinterfacemessage{linguals}{9}{taal -- is actief}
+\setinterfacemessage{linguals}{8}{taal specifieke opties [--] naadloos toegevoegd}
+\setinterfacemessage{linguals}{title}{taal}
+\setinterfacemessage{linguals}{10}{patronen --geladen}
+\setinterfacemessage{verbatims}{1}{file -- bestaat niet}
+\setinterfacemessage{verbatims}{title}{typen}
+\setinterfacemessage{filters}{1}{filter -- wordt geladen}
+\setinterfacemessage{filters}{title}{filter}
+\setinterfacemessage{filters}{2}{onbekend filter --}
+\setinterfacemessage{textblocks}{1}{nieuwe versie, tweede run nodig}
+\setinterfacemessage{textblocks}{3}{inlezen blokken uit --}
+\setinterfacemessage{textblocks}{2}{wegschrijven blokken naar --}
+\setinterfacemessage{textblocks}{5}{-- niet verborgen}
+\setinterfacemessage{textblocks}{4}{er is een tweede run nodig}
+\setinterfacemessage{textblocks}{7}{-- verborgen}
+\setinterfacemessage{textblocks}{6}{-- verborgen en verwerkt}
+\setinterfacemessage{textblocks}{9}{-- niet gehandhaafd}
+\setinterfacemessage{textblocks}{8}{-- gehandhaafd}
+\setinterfacemessage{textblocks}{title}{tekstblokken}
+\setinterfacemessage{textblocks}{12}{-- overgeslagen}
+\setinterfacemessage{textblocks}{11}{-- geladen en geplaatst}
+\setinterfacemessage{textblocks}{10}{-- geladen en verwerkt}
+\setinterfacemessage{encodings}{1}{codering --}
+\setinterfacemessage{encodings}{3}{onbekende codering --}
+\setinterfacemessage{encodings}{2}{codering -- wordt geladen}
+\setinterfacemessage{encodings}{title}{encoding}
+\setinterfacemessage{columns}{1}{maximaal -- kolommen}
+\setinterfacemessage{columns}{3}{probleempje, probeer [balanceren=nee]}
+\setinterfacemessage{columns}{2}{gebruik eventueel \string\filbreak}
+\setinterfacemessage{columns}{5}{plaatsblok onder nog niet mogelijk}
+\setinterfacemessage{columns}{4}{plaatsblok boven nog niet mogelijk}
+\setinterfacemessage{columns}{7}{balanceren afgebroken na 100 stappen}
+\setinterfacemessage{columns}{6}{-- plaatsblok(en) opgeschort}
+\setinterfacemessage{columns}{9}{uitlijnen controleren!}
+\setinterfacemessage{columns}{8}{gebalanceerd in -- stap(pen)}
+\setinterfacemessage{columns}{title}{kolommen}
+\setinterfacemessage{columns}{13}{breed figuur geplaatst boven kolommen}
+\setinterfacemessage{columns}{12}{plaatsblok verplaatst naar volgende kolom / --}
+\setinterfacemessage{columns}{11}{plaatsblok te breed voor kolom}
+\setinterfacemessage{columns}{10}{(minder dan) 1 regel over}
+\setinterfacemessage{symbols}{1}{symboolset -- wordt geladen}
+\setinterfacemessage{symbols}{title}{symbolen}
+\setinterfacemessage{files}{1}{file synoniem -- is al in gebruik voor --}
+\setinterfacemessage{files}{title}{files}
+\setinterfacemessage{versions}{1}{er mankeert een @+}
+\setinterfacemessage{versions}{3}{geselecteerde pagina's: --}
+\setinterfacemessage{versions}{2}{markeren pagina's}
+\setinterfacemessage{versions}{title}{versie}
+\setinterfacemessage{specials}{1}{-- geladen}
+\setinterfacemessage{specials}{3}{-- gereset}
+\setinterfacemessage{specials}{2}{verdere nesting is niet toegestaan --}
+\setinterfacemessage{specials}{5}{definitiefile -- wordt geladen}
+\setinterfacemessage{specials}{4}{commando -- bestaat niet}
+\setinterfacemessage{specials}{7}{onbekende driver --}
+\setinterfacemessage{specials}{6}{nesting is niet toegestaan}
+\setinterfacemessage{specials}{title}{specials}
+\setinterfacemessage{layouts}{1}{teksthoogte aangepast met -- op pagina --}
+\setinterfacemessage{layouts}{3}{-- maal tekst plaatsen uitstellen}
+\setinterfacemessage{layouts}{2}{-- maal uitgestelde tekst tussengevoegd}
+\setinterfacemessage{layouts}{5}{margeblokken inactief}
+\setinterfacemessage{layouts}{4}{margeblokken actief}
+\setinterfacemessage{layouts}{7}{beeldmerken berekenen}
+\setinterfacemessage{layouts}{6}{subpagina reeks -- verwerkt (aantal --)}
+\setinterfacemessage{layouts}{9}{momenteel maximaal -- niveaus in opsommingen}
+\setinterfacemessage{layouts}{8}{achtergronden berekenen}
+\setinterfacemessage{layouts}{title}{layout}
+\setinterfacemessage{layouts}{11}{interlinie -- niet toegestaan in gridmode}
+\setinterfacemessage{layouts}{10}{-- en -- tellen niet op tot 1.0}
+\setinterfacemessage{fonts}{1}{codering --}
+\setinterfacemessage{fonts}{3}{onbekende variant --}
+\setinterfacemessage{fonts}{2}{variant -- wordt geladen}
+\setinterfacemessage{fonts}{5}{stijl -- is niet gedefinieerd}
+\setinterfacemessage{fonts}{4}{korps -- is niet gedefinieerd}
+\setinterfacemessage{fonts}{7}{onbekend formaat --}
+\setinterfacemessage{fonts}{6}{-- wordt geladen}
+\setinterfacemessage{fonts}{14}{korps -- is gedefinieerd (kan beter globaal plaatsvinden)}
+\setinterfacemessage{fonts}{8}{stijl -- gedefinieerd}
+\setinterfacemessage{fonts}{title}{korps}
+\setinterfacemessage{fonts}{10}{onbekende font file --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{globaal bestand --}
+\setinterfacemessage{databases}{2}{lokaal bestand --}
+\setinterfacemessage{databases}{4}{onbekend bestand --}
+\setinterfacemessage{databases}{title}{database}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{script set -- wordt geladen}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{onbekende preamble --}
+\setinterfacemessage{check}{1}{'=' ontbreekt of zonder {} na '--' in regel --}
+\setinterfacemessage{check}{3}{-- -- vervangt een macro, gebruik HOOFDLETTERS!}
+\setinterfacemessage{check}{2}{-- argument(en) verwacht in regel --}
+\setinterfacemessage{check}{title}{controle}
+\setinterfacemessage{metapost}{1}{metapost bibliotheek -- wordt geladen}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{figuur -- is niet te vinden}
+\setinterfacemessage{figures}{3}{maten van -- worden extern vastgesteld}
+\setinterfacemessage{figures}{2}{figuur -- wordt niet preset}
+\setinterfacemessage{figures}{5}{maten van -- zijn onbekend}
+\setinterfacemessage{figures}{4}{maten van -- geladen uit figuurfile zelf}
+\setinterfacemessage{figures}{6}{maten van -- berekend door rlxtools}
+\setinterfacemessage{figures}{8}{figuurobject -- wordt opnieuw gebruikt}
+\setinterfacemessage{figures}{title}{figuren}
+\setinterfacemessage{colors}{1}{systeem -- is globaal actief}
+\setinterfacemessage{colors}{3}{-- is niet gedefinieerd --}
+\setinterfacemessage{colors}{2}{systeem -- is lokaal actief}
+\setinterfacemessage{colors}{5}{onbekend systeem --}
+\setinterfacemessage{colors}{4}{systeem -- wordt geladen}
+\setinterfacemessage{colors}{7}{palet -- is niet beschikbaar}
+\setinterfacemessage{colors}{6}{palet -- is beschikbaar}
+\setinterfacemessage{colors}{9}{-- kleurruimte wordt niet ondersteund}
+\setinterfacemessage{colors}{8}{specificatie -- bij -- wordt zwart}
+\setinterfacemessage{colors}{title}{kleur}
+\setinterfacemessage{colors}{12}{-- is geregistreerd}
+\setinterfacemessage{colors}{11}{kleur wordt vertaald in grijs}
+\setinterfacemessage{colors}{10}{-- kleurruimte wordt ondersteund}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-mno.tex b/tex/context/base/mult-mno.tex
new file mode 100644
index 000000000..ee6fd3273
--- /dev/null
+++ b/tex/context/base/mult-mno.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{ukjent referanse --}
+\setinterfacemessage{references}{3}{ukjent referansetype --}
+\setinterfacemessage{references}{2}{duplikat referanse -- pø side --}
+\setinterfacemessage{references}{4}{ulovlig referanse --}
+\setinterfacemessage{references}{30}{ukjent objekt --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{referanser}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{duplikat objekt --}
+\setinterfacemessage{references}{21}{dokument -- er lest inn}
+\setinterfacemessage{references}{22}{dokument -- er ikke interaktivt}
+\setinterfacemessage{references}{23}{obskur referanse -- (Prefix=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{number --}
+\setinterfacemessage{handlings}{1}{font handling --}
+\setinterfacemessage{handlings}{3}{unknown font handling --}
+\setinterfacemessage{handlings}{2}{font handling -- is loaded}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{system}
+\setinterfacemessage{systems}{41}{ekstern fil -- i gruppe -- eksisterer ikke}
+\setinterfacemessage{systems}{9}{-- ikke funnet/behandlet}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{ny versjon av hjelpefil, andre gjennomkjøring nødvendig}
+\setinterfacemessage{systems}{21}{hjelpefila er ikke lest inn}
+\setinterfacemessage{systems}{20}{betydning (sorterer) av -- er lest inn}
+\setinterfacemessage{systems}{5}{makroene i modul -- er lest inn}
+\setinterfacemessage{systems}{4}{kommando -- er allerede definert}
+\setinterfacemessage{systems}{27}{Versjon}
+\setinterfacemessage{systems}{26}{Registere}
+\setinterfacemessage{systems}{25}{Referanser}
+\setinterfacemessage{systems}{24}{Flytblokker}
+\setinterfacemessage{systems}{1}{innlesning av hjelpefila utsatt (typemode)}
+\setinterfacemessage{systems}{23}{-- arrangert på --}
+\setinterfacemessage{systems}{22}{bruk en gyldig hjelpefil}
+\setinterfacemessage{systems}{2}{-- er lest inn}
+\setinterfacemessage{systems}{19}{betydning (synonymer) av -- er lest inn}
+\setinterfacemessage{systems}{18}{synonym -- -- eksisterer ikke}
+\setinterfacemessage{systems}{7}{makroene i modul -- er allerede lest inn}
+\setinterfacemessage{systems}{6}{ingen makroer funnet i modul ---}
+\setinterfacemessage{systems}{14}{tvunget sideskift i liste ved --}
+\setinterfacemessage{systems}{15}{lagrer Buffer --}
+\setinterfacemessage{systems}{16}{tegnsetter buffer --}
+\setinterfacemessage{systems}{17}{tegnsetter verbatim-buffer --}
+\setinterfacemessage{systems}{13}{markering -- definert --}
+\setinterfacemessage{systems}{12}{hjelpefila er ikke sortert, bruk texutil}
+\setinterfacemessage{systems}{11}{lager enkel hjelpefil}
+\setinterfacemessage{systems}{10}{ikke bruk em i --}
+\setinterfacemessage{floatblocks}{1}{-- renummerert / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- flyttet}
+\setinterfacemessage{floatblocks}{2}{-- lagret}
+\setinterfacemessage{floatblocks}{5}{rekkefølge tilpasset}
+\setinterfacemessage{floatblocks}{4}{-- plassert}
+\setinterfacemessage{floatblocks}{7}{maksimalt -- flytblokker nederst}
+\setinterfacemessage{floatblocks}{6}{maksimalt -- flytblokker øverst}
+\setinterfacemessage{floatblocks}{9}{rekkefølge endret}
+\setinterfacemessage{floatblocks}{8}{mindre enn -- linjer}
+\setinterfacemessage{floatblocks}{title}{flytblokker}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{udefinert}
+\setinterfacemessage{floatblocks}{11}{ingen blokk oppgitt}
+\setinterfacemessage{floatblocks}{10}{-- begrenset}
+\setinterfacemessage{interactions}{1}{forholdstall -- x -- (b x h)}
+\setinterfacemessage{interactions}{3}{inaktiv}
+\setinterfacemessage{interactions}{2}{aktiv}
+\setinterfacemessage{interactions}{5}{unknown attachment --}
+\setinterfacemessage{interactions}{4}{ingen sidesynkronisering (--) i hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- does not exist}
+\setinterfacemessage{interactions}{title}{interaksjon}
+\setinterfacemessage{interactions}{21}{-- kode satt inn / tilføyd}
+\setinterfacemessage{regimes}{1}{koding --}
+\setinterfacemessage{regimes}{3}{ukjent koding --}
+\setinterfacemessage{regimes}{2}{koding -- er lest inn}
+\setinterfacemessage{regimes}{title}{koding}
+\setinterfacemessage{structures}{1}{starten av blokk -- (seksjon)}
+\setinterfacemessage{structures}{title}{struktur}
+\setinterfacemessage{structures}{2}{slutten av blokk -- (seksjon)}
+\setinterfacemessage{linguals}{1}{orddelingsmønster -- for -- er lest inn (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{orddelingsdefinisjon -- for -- er lest inn (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{ingen orddelingsmønster -- for -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{orddelingsmønster for -- er ikke lest inn}
+\setinterfacemessage{linguals}{4}{ingen orddelingsdefinisjon -- for -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{spràk spesifikk opsjon [--] introduserer et -- hopp}
+\setinterfacemessage{linguals}{6}{spràk -- er udefinert}
+\setinterfacemessage{linguals}{9}{spràk -- er aktivt}
+\setinterfacemessage{linguals}{8}{spràk spesifikk opsjon [--] problemfritt tilføyd}
+\setinterfacemessage{linguals}{title}{sprøk}
+\setinterfacemessage{linguals}{10}{orddelingsmønster -- er lest inn}
+\setinterfacemessage{verbatims}{1}{fil -- eksisterer ikke}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{filter -- is loaded}
+\setinterfacemessage{filters}{title}{filter}
+\setinterfacemessage{filters}{2}{unknown filter --}
+\setinterfacemessage{textblocks}{1}{ny versjon, andre gjennomkjøring nødvendig}
+\setinterfacemessage{textblocks}{3}{leser blokker fra --}
+\setinterfacemessage{textblocks}{2}{skriver blokker til --}
+\setinterfacemessage{textblocks}{5}{-- ikke skjult}
+\setinterfacemessage{textblocks}{4}{andre gjennomkjøring nødvendig}
+\setinterfacemessage{textblocks}{7}{-- skjult}
+\setinterfacemessage{textblocks}{6}{-- skjult og behandlet}
+\setinterfacemessage{textblocks}{9}{-- ikke tegnsatt}
+\setinterfacemessage{textblocks}{8}{-- tegnsatt}
+\setinterfacemessage{textblocks}{title}{tekstblokker}
+\setinterfacemessage{textblocks}{12}{-- utelatt}
+\setinterfacemessage{textblocks}{11}{-- lest inn og tegnsatt}
+\setinterfacemessage{textblocks}{10}{-- lest inn og behandlet}
+\setinterfacemessage{encodings}{1}{koding --}
+\setinterfacemessage{encodings}{3}{ukjent koding --}
+\setinterfacemessage{encodings}{2}{koding -- er lest inn}
+\setinterfacemessage{encodings}{title}{koding}
+\setinterfacemessage{columns}{1}{maksimalt -- kolonner}
+\setinterfacemessage{columns}{3}{problemer, slår av balansering}
+\setinterfacemessage{columns}{2}{bruk \string\filbreak\space som et alternativ}
+\setinterfacemessage{columns}{5}{flytblokker nedert er ikke støttet enda}
+\setinterfacemessage{columns}{4}{flytblokker øverst er ikke støttet enda}
+\setinterfacemessage{columns}{7}{balansering avbrutt etter 100 iterasjoner}
+\setinterfacemessage{columns}{6}{-- flytblokk forskjøvet}
+\setinterfacemessage{columns}{9}{kontroller tekstlayout!}
+\setinterfacemessage{columns}{8}{balansert etter -- iterasjoner}
+\setinterfacemessage{columns}{title}{kolonner}
+\setinterfacemessage{columns}{13}{bred flytblokk forksjøvet til toppen av kolonnene}
+\setinterfacemessage{columns}{12}{flytblokk forskjøvet til neste kolonne / --}
+\setinterfacemessage{columns}{11}{flytblokk for bredt for kolonna}
+\setinterfacemessage{columns}{10}{(mindre enn) 1 linje igjen}
+\setinterfacemessage{symbols}{1}{leser inn symbolsett --}
+\setinterfacemessage{symbols}{title}{symboler}
+\setinterfacemessage{files}{1}{filesynonym -- er allerede brukt for --}
+\setinterfacemessage{files}{title}{filer}
+\setinterfacemessage{versions}{1}{manglende @+}
+\setinterfacemessage{versions}{3}{valgte sider: --}
+\setinterfacemessage{versions}{2}{markerer sider}
+\setinterfacemessage{versions}{title}{versjon}
+\setinterfacemessage{specials}{1}{-- er lest inn}
+\setinterfacemessage{specials}{3}{-- er tilbakestilt}
+\setinterfacemessage{specials}{2}{dypere 'nesting' er ikke tillatt --}
+\setinterfacemessage{specials}{5}{leser inn definisjonsfil for --}
+\setinterfacemessage{specials}{4}{kommando -- eksisterer ikke}
+\setinterfacemessage{specials}{7}{ukjent driver --}
+\setinterfacemessage{specials}{6}{'nesting' er ikke tillatt}
+\setinterfacemessage{specials}{title}{specials}
+\setinterfacemessage{layouts}{1}{teksthøyde tilpasset med -- på side --}
+\setinterfacemessage{layouts}{3}{-- ganger tekst forskjøvet}
+\setinterfacemessage{layouts}{2}{-- ganger forskjøvet tekst plassert}
+\setinterfacemessage{layouts}{5}{margblokker inaktive}
+\setinterfacemessage{layouts}{4}{margblokker aktive}
+\setinterfacemessage{layouts}{7}{beregner plass for logo}
+\setinterfacemessage{layouts}{6}{delside sett -- behandlet (størrelse --)}
+\setinterfacemessage{layouts}{9}{for øyeblikket maksimalt -- nivåer i opplisting}
+\setinterfacemessage{layouts}{8}{beregner bakgrunn}
+\setinterfacemessage{layouts}{title}{layout}
+\setinterfacemessage{layouts}{11}{mellomrom -- ikke tillatt i gridmodus}
+\setinterfacemessage{layouts}{10}{-- og -- er ikke 1.0 til sammen}
+\setinterfacemessage{fonts}{1}{koding --}
+\setinterfacemessage{fonts}{3}{ukjent variant --}
+\setinterfacemessage{fonts}{2}{variant -- er lest inn}
+\setinterfacemessage{fonts}{5}{stil -- er ikke definert}
+\setinterfacemessage{fonts}{4}{hovedfont -- er ikke definert}
+\setinterfacemessage{fonts}{7}{ukjent format --}
+\setinterfacemessage{fonts}{6}{-- er lest inn}
+\setinterfacemessage{fonts}{14}{bodyfont -- is defined (can better be done global)}
+\setinterfacemessage{fonts}{8}{stil -- definert}
+\setinterfacemessage{fonts}{title}{hovedfont}
+\setinterfacemessage{fonts}{10}{ukjent fontfil --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{global fil --}
+\setinterfacemessage{databases}{2}{lokal fil --}
+\setinterfacemessage{databases}{4}{ukjent fil --}
+\setinterfacemessage{databases}{title}{databaser}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{leser inn scriptsett --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{ukjent 'preamble' --}
+\setinterfacemessage{check}{1}{manglende '=' etter '--' i linje --}
+\setinterfacemessage{check}{3}{-- -- overskygger en makro, bruk STORE BOKSTAVER!}
+\setinterfacemessage{check}{2}{-- argument forventet i linje --}
+\setinterfacemessage{check}{title}{kontroll}
+\setinterfacemessage{metapost}{1}{metapost bibliotek -- blir lest inn}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{figure -- can not be found}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{figure -- is not preset}
+\setinterfacemessage{figures}{5}{dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{dimensions of -- loaded from figurefile itself}
+\setinterfacemessage{figures}{6}{dimensions of -- calculated by rlxtools}
+\setinterfacemessage{figures}{8}{figureobject -- is reused}
+\setinterfacemessage{figures}{title}{figures}
+\setinterfacemessage{colors}{1}{system -- er aktivert globalt}
+\setinterfacemessage{colors}{3}{-- er udefinert --}
+\setinterfacemessage{colors}{2}{system -- er aktivert lokalt}
+\setinterfacemessage{colors}{5}{ukjent system --}
+\setinterfacemessage{colors}{4}{system -- er lest inn}
+\setinterfacemessage{colors}{7}{palett -- er ikke tilgjengelig}
+\setinterfacemessage{colors}{6}{palett -- er tilgjengelig}
+\setinterfacemessage{colors}{9}{-- fargerom er ikke støttet}
+\setinterfacemessage{colors}{8}{spesifikasjon -- for farge -- gir kun svart}
+\setinterfacemessage{colors}{title}{farge}
+\setinterfacemessage{colors}{12}{-- is registered}
+\setinterfacemessage{colors}{11}{fargen vil bli vist som grø}
+\setinterfacemessage{colors}{10}{-- fargerom er støttet}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-mpe.tex b/tex/context/base/mult-mpe.tex
new file mode 100644
index 000000000..4c1bc9942
--- /dev/null
+++ b/tex/context/base/mult-mpe.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{unknown reference --}
+\setinterfacemessage{references}{3}{unknown reference type --}
+\setinterfacemessage{references}{2}{duplicate reference -- on page --}
+\setinterfacemessage{references}{4}{illegal reference --}
+\setinterfacemessage{references}{30}{unknown object --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{references}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{duplicate object --}
+\setinterfacemessage{references}{21}{document -- loaded}
+\setinterfacemessage{references}{22}{document -- is not interactive}
+\setinterfacemessage{references}{23}{obscure reference -- (prefix=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{number --}
+\setinterfacemessage{handlings}{1}{font handling --}
+\setinterfacemessage{handlings}{3}{unknown font handling --}
+\setinterfacemessage{handlings}{2}{font handling -- is loaded}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{system}
+\setinterfacemessage{systems}{41}{external file -- in group -- does not exist}
+\setinterfacemessage{systems}{9}{-- not found/processed}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{new version of utility file, second pass needed}
+\setinterfacemessage{systems}{21}{no utility data is loaded}
+\setinterfacemessage{systems}{20}{meaning (sorts) of -- loaded}
+\setinterfacemessage{systems}{5}{module -- loaded}
+\setinterfacemessage{systems}{4}{command -- is already defined}
+\setinterfacemessage{systems}{27}{Version}
+\setinterfacemessage{systems}{26}{Registers}
+\setinterfacemessage{systems}{25}{References}
+\setinterfacemessage{systems}{24}{Floatblocks}
+\setinterfacemessage{systems}{1}{loading utility-file postponed (typemode)}
+\setinterfacemessage{systems}{23}{-- arranged at --}
+\setinterfacemessage{systems}{22}{use a valid utilityfile}
+\setinterfacemessage{systems}{2}{-- loaded}
+\setinterfacemessage{systems}{19}{meaning (synonyms) of -- loaded}
+\setinterfacemessage{systems}{18}{synonym -- -- does not exist}
+\setinterfacemessage{systems}{7}{module -- already loaded}
+\setinterfacemessage{systems}{6}{module -- not found}
+\setinterfacemessage{systems}{14}{forced newpage in list at --}
+\setinterfacemessage{systems}{15}{saving buffer --}
+\setinterfacemessage{systems}{16}{typesetting buffer --}
+\setinterfacemessage{systems}{17}{typesetting verbatim buffer --}
+\setinterfacemessage{systems}{13}{mark -- defined --}
+\setinterfacemessage{systems}{12}{the utility-file is not sorted, use texutil}
+\setinterfacemessage{systems}{11}{building simple util}
+\setinterfacemessage{systems}{10}{don't use em in --}
+\setinterfacemessage{floatblocks}{1}{-- renumbered / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- moved}
+\setinterfacemessage{floatblocks}{2}{-- saved}
+\setinterfacemessage{floatblocks}{5}{order adapted}
+\setinterfacemessage{floatblocks}{4}{-- placed}
+\setinterfacemessage{floatblocks}{7}{n of bottom floats limited to --}
+\setinterfacemessage{floatblocks}{6}{n of top floats limited to --}
+\setinterfacemessage{floatblocks}{9}{order disturbed}
+\setinterfacemessage{floatblocks}{8}{less than -- lines}
+\setinterfacemessage{floatblocks}{title}{floatblocks}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{undefined}
+\setinterfacemessage{floatblocks}{11}{no block given}
+\setinterfacemessage{floatblocks}{10}{-- limited}
+\setinterfacemessage{interactions}{1}{aspect ratio -- x -- (b x h)}
+\setinterfacemessage{interactions}{3}{inactive}
+\setinterfacemessage{interactions}{2}{active}
+\setinterfacemessage{interactions}{5}{unknown attachment --}
+\setinterfacemessage{interactions}{4}{no pagesynchronisation (--) in hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- does not exist}
+\setinterfacemessage{interactions}{title}{interaction}
+\setinterfacemessage{interactions}{21}{-- code inserted}
+\setinterfacemessage{regimes}{1}{regime --}
+\setinterfacemessage{regimes}{3}{unknown regime --}
+\setinterfacemessage{regimes}{2}{regime -- is loaded}
+\setinterfacemessage{regimes}{title}{regime}
+\setinterfacemessage{structures}{1}{begin of sectionblock --}
+\setinterfacemessage{structures}{title}{structure}
+\setinterfacemessage{structures}{2}{end of sectionblock --}
+\setinterfacemessage{linguals}{1}{patterns -- for -- loaded (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{hyphenations -- for -- loaded (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{no patterns -- for -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{patterns for -- not loaded}
+\setinterfacemessage{linguals}{4}{no hyphenations -- for -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{language specific options [--] introduce a -- skip}
+\setinterfacemessage{linguals}{6}{language -- is undefined}
+\setinterfacemessage{linguals}{9}{language -- is active}
+\setinterfacemessage{linguals}{8}{language specific options [--] seamless appended}
+\setinterfacemessage{linguals}{title}{language}
+\setinterfacemessage{linguals}{10}{patterns --loaded}
+\setinterfacemessage{verbatims}{1}{file -- does not exist}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{filter -- is loaded}
+\setinterfacemessage{filters}{title}{filter}
+\setinterfacemessage{filters}{2}{unknown filter --}
+\setinterfacemessage{textblocks}{1}{new version, second pass needed}
+\setinterfacemessage{textblocks}{3}{reading blocks from --}
+\setinterfacemessage{textblocks}{2}{writing blocks to --}
+\setinterfacemessage{textblocks}{5}{-- not hidden}
+\setinterfacemessage{textblocks}{4}{second pass needed}
+\setinterfacemessage{textblocks}{7}{-- hidden}
+\setinterfacemessage{textblocks}{6}{-- hidden and processed}
+\setinterfacemessage{textblocks}{9}{-- not typeset}
+\setinterfacemessage{textblocks}{8}{-- typeset}
+\setinterfacemessage{textblocks}{title}{textblocks}
+\setinterfacemessage{textblocks}{12}{-- skipped}
+\setinterfacemessage{textblocks}{11}{-- loaded and typeset}
+\setinterfacemessage{textblocks}{10}{-- loaded and processed}
+\setinterfacemessage{encodings}{1}{coding --}
+\setinterfacemessage{encodings}{3}{unknown coding --}
+\setinterfacemessage{encodings}{2}{coding -- is loaded}
+\setinterfacemessage{encodings}{title}{encoding}
+\setinterfacemessage{columns}{1}{only -- columns possible}
+\setinterfacemessage{columns}{3}{problems, disable balancing}
+\setinterfacemessage{columns}{2}{use \string\filbreak\space as alternative}
+\setinterfacemessage{columns}{5}{bottom float not yet supported}
+\setinterfacemessage{columns}{4}{top float not yet supported}
+\setinterfacemessage{columns}{7}{balancing aborted after 100 steps}
+\setinterfacemessage{columns}{6}{-- float(s) postponed}
+\setinterfacemessage{columns}{9}{check raggedness}
+\setinterfacemessage{columns}{8}{balanced in -- step(s)}
+\setinterfacemessage{columns}{title}{columns}
+\setinterfacemessage{columns}{13}{wide float moved to top of columns}
+\setinterfacemessage{columns}{12}{float moved to next column / --}
+\setinterfacemessage{columns}{11}{float too wide for column}
+\setinterfacemessage{columns}{10}{(less than) 1 line left}
+\setinterfacemessage{symbols}{1}{loading symbolset --}
+\setinterfacemessage{symbols}{title}{symbols}
+\setinterfacemessage{files}{1}{file synonym -- is already used for --}
+\setinterfacemessage{files}{title}{files}
+\setinterfacemessage{versions}{1}{missing @+}
+\setinterfacemessage{versions}{3}{selected pages: --}
+\setinterfacemessage{versions}{2}{marking pages}
+\setinterfacemessage{versions}{title}{version}
+\setinterfacemessage{specials}{1}{-- loaded}
+\setinterfacemessage{specials}{3}{-- is reset}
+\setinterfacemessage{specials}{2}{no deeper nesting is permitted --}
+\setinterfacemessage{specials}{5}{loading definition file --}
+\setinterfacemessage{specials}{4}{command -- does not exist}
+\setinterfacemessage{specials}{7}{unknown driver --}
+\setinterfacemessage{specials}{6}{nesting is not permitted}
+\setinterfacemessage{specials}{title}{specials}
+\setinterfacemessage{layouts}{1}{textheight adapted with -- at page --}
+\setinterfacemessage{layouts}{3}{-- times text postponed}
+\setinterfacemessage{layouts}{2}{-- times postponed text placed}
+\setinterfacemessage{layouts}{5}{marginblocks inactive}
+\setinterfacemessage{layouts}{4}{marginblocks active}
+\setinterfacemessage{layouts}{7}{calculating logospace}
+\setinterfacemessage{layouts}{6}{subpage set -- processed (size --)}
+\setinterfacemessage{layouts}{9}{currently no more than -- levels in itemizations}
+\setinterfacemessage{layouts}{8}{calculating backgrounds}
+\setinterfacemessage{layouts}{title}{layout}
+\setinterfacemessage{layouts}{11}{spacing -- not permitted in gridmode}
+\setinterfacemessage{layouts}{10}{-- and -- don't add up to 1.0}
+\setinterfacemessage{fonts}{1}{coding --}
+\setinterfacemessage{fonts}{3}{unknown variant --}
+\setinterfacemessage{fonts}{2}{variant -- is loaded}
+\setinterfacemessage{fonts}{5}{style -- is not defined}
+\setinterfacemessage{fonts}{4}{bodyfont -- is not defined}
+\setinterfacemessage{fonts}{7}{unknown format --}
+\setinterfacemessage{fonts}{6}{-- is loaded}
+\setinterfacemessage{fonts}{14}{bodyfont -- is defined (can better be done global)}
+\setinterfacemessage{fonts}{8}{style -- defined}
+\setinterfacemessage{fonts}{title}{bodyfont}
+\setinterfacemessage{fonts}{10}{unknown font file --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{global file --}
+\setinterfacemessage{databases}{2}{local file --}
+\setinterfacemessage{databases}{4}{unknown file --}
+\setinterfacemessage{databases}{title}{databases}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{loading script set --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{unknown preamble --}
+\setinterfacemessage{check}{1}{missing or ungrouped '=' after '--' in line --}
+\setinterfacemessage{check}{3}{-- -- replaces a macro, use CAPITALS!}
+\setinterfacemessage{check}{2}{-- argument(s) expected in line --}
+\setinterfacemessage{check}{title}{check}
+\setinterfacemessage{metapost}{1}{loading metapost library --}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{figure -- can not be found}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{figure -- is not preset}
+\setinterfacemessage{figures}{5}{dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{dimensions of -- loaded from figurefile itself}
+\setinterfacemessage{figures}{6}{dimensions of -- calculated by rlxtools}
+\setinterfacemessage{figures}{8}{figureobject -- is reused}
+\setinterfacemessage{figures}{title}{figures}
+\setinterfacemessage{colors}{1}{system -- is global activated}
+\setinterfacemessage{colors}{3}{-- is not defined --}
+\setinterfacemessage{colors}{2}{system -- is local activated}
+\setinterfacemessage{colors}{5}{unknown system --}
+\setinterfacemessage{colors}{4}{system -- is loaded}
+\setinterfacemessage{colors}{7}{palette -- is not available}
+\setinterfacemessage{colors}{6}{palette -- is available}
+\setinterfacemessage{colors}{9}{-- color space is not supported}
+\setinterfacemessage{colors}{8}{specification -- at color -- becomes black}
+\setinterfacemessage{colors}{title}{color}
+\setinterfacemessage{colors}{12}{-- is registered}
+\setinterfacemessage{colors}{11}{color is converted to gray}
+\setinterfacemessage{colors}{10}{-- color space is supported}
+%
+\endinput \ No newline at end of file
diff --git a/tex/context/base/mult-mro.tex b/tex/context/base/mult-mro.tex
new file mode 100644
index 000000000..da96a23a4
--- /dev/null
+++ b/tex/context/base/mult-mro.tex
@@ -0,0 +1,208 @@
+\setinterfacemessage{references}{1}{referinta necunoscuta --}
+\setinterfacemessage{references}{3}{tip necunoscut de referinta --}
+\setinterfacemessage{references}{2}{referinta duplicat -- la pagina --}
+\setinterfacemessage{references}{4}{referinta eronata --}
+\setinterfacemessage{references}{30}{obiect necunoscut --}
+\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
+\setinterfacemessage{references}{24}{references from document '--' are not exported}
+\setinterfacemessage{references}{title}{referinte}
+\setinterfacemessage{references}{26}{references from document '--' are imported}
+\setinterfacemessage{references}{31}{obiect duplicat --}
+\setinterfacemessage{references}{21}{documentul -- este incarcat}
+\setinterfacemessage{references}{22}{documentul -- nu este interactiv}
+\setinterfacemessage{references}{23}{referinta obscura -- (prefix=--)}
+\setinterfacemessage{documents}{1}{sheet --}
+\setinterfacemessage{documents}{title}{sheets}
+\setinterfacemessage{documents}{2}{number --}
+\setinterfacemessage{handlings}{1}{font handling --}
+\setinterfacemessage{handlings}{3}{unknown font handling --}
+\setinterfacemessage{handlings}{2}{font handling -- is loaded}
+\setinterfacemessage{handlings}{title}{handling}
+\setinterfacemessage{systems}{title}{sistem}
+\setinterfacemessage{systems}{41}{fisierul extern -- din grupul -- nu exista}
+\setinterfacemessage{systems}{9}{-- nu este gasit/procesat}
+\setinterfacemessage{systems}{91}{papertray --}
+\setinterfacemessage{systems}{8}{o noua versiune de fisier utilitar, este necesara o noua trecere}
+\setinterfacemessage{systems}{21}{nici o data utilitara nu este incarcata}
+\setinterfacemessage{systems}{20}{intelesul (ordinea) pentru -- incarcat}
+\setinterfacemessage{systems}{5}{macro-urile din modulul -- s-au incarcat}
+\setinterfacemessage{systems}{4}{comanda -- este deja definita}
+\setinterfacemessage{systems}{27}{Versiune}
+\setinterfacemessage{systems}{26}{Registri}
+\setinterfacemessage{systems}{25}{Referinte}
+\setinterfacemessage{systems}{24}{Blocuri}
+\setinterfacemessage{systems}{1}{se incarca utilitarul-fisierul este amanat (typemode)}
+\setinterfacemessage{systems}{23}{-- aranjat la --}
+\setinterfacemessage{systems}{22}{folositi un fisier utilitar valid}
+\setinterfacemessage{systems}{2}{-- s-a incarcat}
+\setinterfacemessage{systems}{19}{intelesul (sinonimele) pentru -- incarcat}
+\setinterfacemessage{systems}{18}{sinonimul -- -- nu exista}
+\setinterfacemessage{systems}{7}{macro-urile din modulul -- s-au incarcat deja}
+\setinterfacemessage{systems}{6}{nu s-au gasit macro-uri in modulul --}
+\setinterfacemessage{systems}{14}{s-a fortat trecere pa pagina noua in lista la --}
+\setinterfacemessage{systems}{15}{buffer salvat --}
+\setinterfacemessage{systems}{16}{buffer-ul -- s-a cules}
+\setinterfacemessage{systems}{17}{se culege buffer-ul verbatim --}
+\setinterfacemessage{systems}{13}{marcajul -- definit --}
+\setinterfacemessage{systems}{12}{fisierul utilitar nu este sortat, folositi texutil}
+\setinterfacemessage{systems}{11}{se creeaza un utilitar simplu}
+\setinterfacemessage{systems}{10}{nu folositi em in --}
+\setinterfacemessage{floatblocks}{1}{-- renumerotat / -- => --}
+\setinterfacemessage{floatblocks}{3}{-- mutat}
+\setinterfacemessage{floatblocks}{2}{-- salvat}
+\setinterfacemessage{floatblocks}{5}{ordinea adaptata}
+\setinterfacemessage{floatblocks}{4}{-- plasat}
+\setinterfacemessage{floatblocks}{7}{nr. blocurilor de jos limitat la --}
+\setinterfacemessage{floatblocks}{6}{nr. cadrelor de sus limitat la --}
+\setinterfacemessage{floatblocks}{9}{ordinea deranjata}
+\setinterfacemessage{floatblocks}{8}{mai putin de -- linii}
+\setinterfacemessage{floatblocks}{title}{Blocuri}
+\setinterfacemessage{floatblocks}{13}{there is nothing to split}
+\setinterfacemessage{floatblocks}{12}{nedefinit}
+\setinterfacemessage{floatblocks}{11}{nu este dat nici un bloc}
+\setinterfacemessage{floatblocks}{10}{-- limitat}
+\setinterfacemessage{interactions}{1}{aspectul -- x -- (b x h)}
+\setinterfacemessage{interactions}{3}{inactiv}
+\setinterfacemessage{interactions}{2}{activ}
+\setinterfacemessage{interactions}{5}{unknown attachment --}
+\setinterfacemessage{interactions}{4}{nu exista sincronizare pt. pagini (--) in hmode}
+\setinterfacemessage{interactions}{6}{attachment file -- does not exist}
+\setinterfacemessage{interactions}{title}{interactiuni}
+\setinterfacemessage{interactions}{21}{-- cod inserat}
+\setinterfacemessage{regimes}{1}{codificarea --}
+\setinterfacemessage{regimes}{3}{codificarea -- este necunoscuta}
+\setinterfacemessage{regimes}{2}{codificarea -- este Encarcata}
+\setinterfacemessage{regimes}{title}{codificari}
+\setinterfacemessage{structures}{1}{inceput de bloc sectiune --}
+\setinterfacemessage{structures}{title}{structuri}
+\setinterfacemessage{structures}{2}{sfarsit de bloc sectiune --}
+\setinterfacemessage{linguals}{1}{sablonul -- pentru -- s-a incarcat (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{3}{despartirea in silabe -- pentru -- s-a incarcat (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{2}{nu exista sabloane -- pentru -- (n=--,e=--,m=--) (--,--)}
+\setinterfacemessage{linguals}{5}{sabloanele pentru -- nu sunt incarcate}
+\setinterfacemessage{linguals}{4}{nu exista despartire in silabe -- pentru -- (n=--,e=--,m=--)}
+\setinterfacemessage{linguals}{7}{optiunile specifice ale limbii [--] introduc un spatiu --}
+\setinterfacemessage{linguals}{6}{limba -- nu este definita}
+\setinterfacemessage{linguals}{9}{limba -- este activa}
+\setinterfacemessage{linguals}{8}{optiunile specifice ale limbii [--] adaugate}
+\setinterfacemessage{linguals}{title}{limbi}
+\setinterfacemessage{linguals}{10}{sabloanele -- incarcate}
+\setinterfacemessage{verbatims}{1}{fisierul -- nu exista}
+\setinterfacemessage{verbatims}{title}{verbatim}
+\setinterfacemessage{filters}{1}{filter -- is loaded}
+\setinterfacemessage{filters}{title}{filter}
+\setinterfacemessage{filters}{2}{unknown filter --}
+\setinterfacemessage{textblocks}{1}{o noua versiune, este nevoie de inca o trecere}
+\setinterfacemessage{textblocks}{3}{se citesc blocurile din --}
+\setinterfacemessage{textblocks}{2}{se scriu blocurile in --}
+\setinterfacemessage{textblocks}{5}{-- nu este ascuns}
+\setinterfacemessage{textblocks}{4}{este nevoie de inca o trecere}
+\setinterfacemessage{textblocks}{7}{-- ascuns}
+\setinterfacemessage{textblocks}{6}{-- ascuns si procesat}
+\setinterfacemessage{textblocks}{9}{-- nu este cules}
+\setinterfacemessage{textblocks}{8}{-- cules}
+\setinterfacemessage{textblocks}{title}{blocuri de text}
+\setinterfacemessage{textblocks}{12}{-- sarit peste}
+\setinterfacemessage{textblocks}{11}{-- incarcat si cules}
+\setinterfacemessage{textblocks}{10}{-- incarcat si procesat}
+\setinterfacemessage{encodings}{1}{codificarea --}
+\setinterfacemessage{encodings}{3}{codificarea -- este necunoscuta}
+\setinterfacemessage{encodings}{2}{codificarea -- este Encarcata}
+\setinterfacemessage{encodings}{title}{codificari}
+\setinterfacemessage{columns}{1}{este posibil numai -- coloane}
+\setinterfacemessage{columns}{3}{probleme, se dezactiveaza alinierea}
+\setinterfacemessage{columns}{2}{folositi \string\filbreak\space ca alternativa}
+\setinterfacemessage{columns}{5}{cadrele bottom (bottom float) nu sunt inca suportate}
+\setinterfacemessage{columns}{4}{cadrele top (top float) nu sunt inca suportate}
+\setinterfacemessage{columns}{7}{alinierea este oprita dupa 100 de incercari}
+\setinterfacemessage{columns}{6}{-- blocurile sunt amanate}
+\setinterfacemessage{columns}{9}{verificat alinierea}
+\setinterfacemessage{columns}{8}{aliniat in -- pas(i)}
+\setinterfacemessage{columns}{title}{coloane}
+\setinterfacemessage{columns}{13}{blocul lat este mutat in partea de sus a coloanelor}
+\setinterfacemessage{columns}{12}{blocul este mutat pe urmatoarea coloana / --}
+\setinterfacemessage{columns}{11}{blocul este prea lat pentru coloana}
+\setinterfacemessage{columns}{10}{a mai ramas (mai putin de) 1 linie}
+\setinterfacemessage{symbols}{1}{se incarca setul de simboluri --}
+\setinterfacemessage{symbols}{title}{simboluri}
+\setinterfacemessage{files}{1}{sinonimul fisierelor -- este folosit deja pentru --}
+\setinterfacemessage{files}{title}{fisiere}
+\setinterfacemessage{versions}{1}{lipseste @+}
+\setinterfacemessage{versions}{3}{pagini selectate: --}
+\setinterfacemessage{versions}{2}{pagini marcate}
+\setinterfacemessage{versions}{title}{versiuni}
+\setinterfacemessage{specials}{1}{-- incarcat}
+\setinterfacemessage{specials}{3}{-- s-a resetat}
+\setinterfacemessage{specials}{2}{nu este permis un nivel de imbricare mai mare --}
+\setinterfacemessage{specials}{5}{se incarca fisierul de definitii --}
+\setinterfacemessage{specials}{4}{comanda -- nu exista}
+\setinterfacemessage{specials}{7}{driver necunoscut --}
+\setinterfacemessage{specials}{6}{imbricarea nu este permisa}
+\setinterfacemessage{specials}{title}{specials}
+\setinterfacemessage{layouts}{1}{textheight adaptat cu -- la pagina --}
+\setinterfacemessage{layouts}{3}{textul amanat de -- ori}
+\setinterfacemessage{layouts}{2}{textul amanat de -- ori a fost plasat}
+\setinterfacemessage{layouts}{5}{blocuri marginale inactive}
+\setinterfacemessage{layouts}{4}{blocuri marginale active}
+\setinterfacemessage{layouts}{7}{se calculeaza spatiul pentru logo}
+\setinterfacemessage{layouts}{6}{setul -- de subpagini procesat (dimensiunea --)}
+\setinterfacemessage{layouts}{9}{acum nu se supota mai mult de -- nivele de adancime la iteratii}
+\setinterfacemessage{layouts}{8}{se calculeaza fundalurile}
+\setinterfacemessage{layouts}{title}{aranjamente}
+\setinterfacemessage{layouts}{11}{spatierea -- nu este permisa in gridmode}
+\setinterfacemessage{layouts}{10}{-- si -- nu se adauga pana la 1.0}
+\setinterfacemessage{fonts}{1}{codificarea --}
+\setinterfacemessage{fonts}{3}{varianta necunoscuta --}
+\setinterfacemessage{fonts}{2}{varianta -- este incarcata}
+\setinterfacemessage{fonts}{5}{stilul -- nu este definit}
+\setinterfacemessage{fonts}{4}{corpul de litere -- nu este definit}
+\setinterfacemessage{fonts}{7}{format necunoscut --}
+\setinterfacemessage{fonts}{6}{-- este incarcat}
+\setinterfacemessage{fonts}{14}{bodyfont -- is defined (can better be done global)}
+\setinterfacemessage{fonts}{8}{stilul -- definit}
+\setinterfacemessage{fonts}{title}{corp de litere}
+\setinterfacemessage{fonts}{10}{fisier font necunoscut --}
+\setinterfacemessage{databases}{1}{--}
+\setinterfacemessage{databases}{3}{fisier global --}
+\setinterfacemessage{databases}{2}{fisier local --}
+\setinterfacemessage{databases}{4}{fisier necunoscut --}
+\setinterfacemessage{databases}{title}{baze de date}
+\setinterfacemessage{publications}{1}{file -- not found, unknown style ignored}
+\setinterfacemessage{publications}{3}{wrote a new auxiliary file \jobname.aux}
+\setinterfacemessage{publications}{title}{publications}
+\setinterfacemessage{publications}{2}{file -- not found, waiting for bibtex}
+\setinterfacemessage{publications}{4}{loading database from --}
+\setinterfacemessage{publications}{5}{warning: cite argument -- on line \the\inputlineno}
+\setinterfacemessage{publications}{6}{loading formatting style from --}
+\setinterfacemessage{javascript}{1}{se incarca scriptul --}
+\setinterfacemessage{javascript}{title}{javascript}
+\setinterfacemessage{javascript}{2}{preambul necunoscut --}
+\setinterfacemessage{check}{1}{lipseste '=' dupa '--' in linia --}
+\setinterfacemessage{check}{3}{-- -- inlocuieste un macro, folositi MAJUSCULE!}
+\setinterfacemessage{check}{2}{argumentul(ele) -- sunt asteptate in linia --}
+\setinterfacemessage{check}{title}{verificari}
+\setinterfacemessage{metapost}{1}{se incarca biblioteca metapost --}
+\setinterfacemessage{metapost}{title}{metapost}
+\setinterfacemessage{figures}{1}{figura -- nu poate fi gasita}
+\setinterfacemessage{figures}{3}{dimensions of -- are determined externally}
+\setinterfacemessage{figures}{2}{figura -- nu este presetata}
+\setinterfacemessage{figures}{5}{dimensions of -- are unknown}
+\setinterfacemessage{figures}{4}{dimensiunea figurii -- se incarca din fisierul insusi}
+\setinterfacemessage{figures}{6}{dimensiunea figurii -- este calculata de rlxtools}
+\setinterfacemessage{figures}{8}{obiectul figura -- este refolosit}
+\setinterfacemessage{figures}{title}{figuri}
+\setinterfacemessage{colors}{1}{sistem -- este activata global}
+\setinterfacemessage{colors}{3}{-- nu este definita --}
+\setinterfacemessage{colors}{2}{sistem -- este activata local}
+\setinterfacemessage{colors}{5}{sistem -- necunoscuta}
+\setinterfacemessage{colors}{4}{sistem -- este incarcata}
+\setinterfacemessage{colors}{7}{palette -- nu este disponibila}
+\setinterfacemessage{colors}{6}{paleta -- este disponibila}
+\setinterfacemessage{colors}{9}{spatiul de culoare -- nu este suportat}
+\setinterfacemessage{colors}{8}{specificatia -- la culoarea -- devine neagra}
+\setinterfacemessage{colors}{title}{culori}
+\setinterfacemessage{colors}{12}{-- is registered}
+\setinterfacemessage{colors}{11}{culoarea este convertita la gri}
+\setinterfacemessage{colors}{10}{spatiul de culoare -- este suportat}
+%
+\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..074d5f3d5
--- /dev/null
+++ b/tex/context/base/mult-nl.tex
@@ -0,0 +1,1693 @@
+% 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{answerarea}{antwoordgebied}
+\setinterfacevariable{appendices}{bijlagen}
+\setinterfacevariable{appendix}{bijlage}
+\setinterfacevariable{april}{april}
+\setinterfacevariable{atmargin}{opmarge}
+\setinterfacevariable{atpage}{oppagina}
+\setinterfacevariable{august}{augustus}
+\setinterfacevariable{author}{auteur}
+\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{bbl}{bbl}
+\setinterfacevariable{before}{voor}
+\setinterfacevariable{begin}{begin}
+\setinterfacevariable{bib}{bib}
+\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{cite}{cite}
+\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{down}{omlaag}
+\setinterfacevariable{each}{elk}
+\setinterfacevariable{edge}{rand}
+\setinterfacevariable{empty}{leeg}
+\setinterfacevariable{end}{eind}
+\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{layer}{layer}
+\setinterfacevariable{left}{links}
+\setinterfacevariable{leftedge}{linkerrand}
+\setinterfacevariable{lefthanging}{linkshangend}
+\setinterfacevariable{leftmargin}{linkermarge}
+\setinterfacevariable{leftpage}{linkerpagina}
+\setinterfacevariable{lefttoright}{lefttoright}
+\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{maxdepth}{maxdepth}
+\setinterfacevariable{maxheight}{maxheight}
+\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{may}{mei}
+\setinterfacevariable{mediaeval}{mediaeval}
+\setinterfacevariable{medium}{middel}
+\setinterfacevariable{middle}{midden}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{mindepth}{mindepth}
+\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{note}{note}
+\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{overbar}{overstreep}
+\setinterfacevariable{overbars}{overstrepen}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{overstrike}{doorstreep}
+\setinterfacevariable{overstrikes}{doorstrepen}
+\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{righttoleft}{righttoleft}
+\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{short}{kort}
+\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{starter}{opener}
+\setinterfacevariable{sticker}{sticker}
+\setinterfacevariable{stop}{stop}
+\setinterfacevariable{stopper}{afsluiter}
+\setinterfacevariable{stretch}{rek}
+\setinterfacevariable{strict}{streng}
+\setinterfacevariable{strong}{sterk}
+\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{subsubsubsubsubsubsection}{subsubsubsubsubsubparagraaf}
+\setinterfacevariable{subsubsubsubsubsubsubject}{subsubsubsubsubsubonderwerp}
+\setinterfacevariable{subsubsubsubsubsubsubsection}{subsubsubsubsubsubsubparagraaf}
+\setinterfacevariable{subsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubonderwerp}
+\setinterfacevariable{subsubsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsubparagraaf}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubonderwerp}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsubsubparagraaf}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubsubonderwerp}
+\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{underbar}{onderstreep}
+\setinterfacevariable{underbars}{onderstrepen}
+\setinterfacevariable{unit}{eenheid}
+\setinterfacevariable{units}{eenheden}
+\setinterfacevariable{unknown}{onbekend}
+\setinterfacevariable{unpacked}{vanelkaar}
+\setinterfacevariable{up}{omhoog}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{gebruikt}
+\setinterfacevariable{value}{waarde}
+\setinterfacevariable{vertical}{vertikaal}
+\setinterfacevariable{very}{zeer}
+\setinterfacevariable{verystrict}{zeerstreng}
+\setinterfacevariable{verytolerant}{zeersoepel}
+\setinterfacevariable{weak}{zwak}
+\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{alignsymbol}{alignsymbol}
+\setinterfaceconstant{aligntitle}{titeluitlijnen}
+\setinterfaceconstant{alternative}{variant}
+\setinterfaceconstant{andtext}{andtext}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{pijl}
+\setinterfaceconstant{artauthor}{artauthor}
+\setinterfaceconstant{artauthoretaldisplay}{artauthoretaldisplay}
+\setinterfaceconstant{artauthoretallimit}{artauthoretallimit}
+\setinterfaceconstant{artauthoretaltext}{artauthoretaltext}
+\setinterfaceconstant{at}{op}
+\setinterfaceconstant{author}{auteur}
+\setinterfaceconstant{authoretaldisplay}{authoretaldisplay}
+\setinterfaceconstant{authoretallimit}{authoretallimit}
+\setinterfaceconstant{authoretaltext}{authoretaltext}
+\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{bottomafter}{bottomafter}
+\setinterfaceconstant{bottombefore}{bottombefore}
+\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{connector}{connector}
+\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{database}{database}
+\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{editor}{editor}
+\setinterfaceconstant{editoretaldisplay}{editoretaldisplay}
+\setinterfaceconstant{editoretallimit}{editoretallimit}
+\setinterfaceconstant{editoretaltext}{editoretaltext}
+\setinterfaceconstant{empty}{leeg}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{evenmarge}
+\setinterfaceconstant{expansion}{expansie}
+\setinterfaceconstant{export}{exporteer}
+\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{filtercommand}{filtercommand}
+\setinterfaceconstant{finalnamesep}{finalnamesep}
+\setinterfaceconstant{firstnamesep}{firstnamesep}
+\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{headalign}{kopuitlijnen}
+\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{hidenumber}{hidenumber}
+\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{intent}{intent}
+\setinterfaceconstant{interaction}{interactie}
+\setinterfaceconstant{interlinespace}{interlinie}
+\setinterfaceconstant{itemalign}{itemuitlijnen}
+\setinterfaceconstant{items}{items}
+\setinterfaceconstant{juniorsep}{juniorsep}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{sleutelexpansie}
+\setinterfaceconstant{keyword}{trefwoord}
+\setinterfaceconstant{label}{label}
+\setinterfaceconstant{lastnamesep}{lastnamesep}
+\setinterfaceconstant{lastpubsep}{lastpubsep}
+\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{maxdepth}{maxdepth}
+\setinterfaceconstant{maxheight}{maxhoogte}
+\setinterfaceconstant{maxwidth}{maxbreedte}
+\setinterfaceconstant{maybeyear}{maybeyear}
+\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{monthconversion}{maandconversie}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{naam}
+\setinterfaceconstant{namesep}{namesep}
+\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{numberconversion}{numberconversion}
+\setinterfaceconstant{numberconversionset}{numberconversionset}
+\setinterfaceconstant{numberdistance}{nummerafstand}
+\setinterfaceconstant{numbering}{nummeren}
+\setinterfaceconstant{numberorder}{numberorder}
+\setinterfaceconstant{numberprefix}{numberprefix}
+\setinterfaceconstant{numbersegments}{numbersegments}
+\setinterfaceconstant{numberseparator}{nummerscheider}
+\setinterfaceconstant{numberseparatorset}{numberseparatorset}
+\setinterfaceconstant{numberset}{numberset}
+\setinterfaceconstant{numberstarter}{numberstarter}
+\setinterfaceconstant{numberstopper}{numberstopper}
+\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{order}{order}
+\setinterfaceconstant{orientation}{orientatie}
+\setinterfaceconstant{otherstext}{otherstext}
+\setinterfaceconstant{outermargin}{buitenmarge}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{eigennummer}
+\setinterfaceconstant{page}{pagina}
+\setinterfaceconstant{pageboundaries}{paginaovergangen}
+\setinterfaceconstant{pagecolor}{paginakleur}
+\setinterfaceconstant{pagecommand}{paginacommando}
+\setinterfaceconstant{pageconversion}{pageconversion}
+\setinterfaceconstant{pageconversionset}{pageconversionset}
+\setinterfaceconstant{pagenumber}{paginanummer}
+\setinterfaceconstant{pageprefix}{pageprefix}
+\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
+\setinterfaceconstant{pageprefixconversion}{pageprefixconversion}
+\setinterfaceconstant{pageprefixconversionset}{pageprefixconversionset}
+\setinterfaceconstant{pageprefixsegments}{pageprefixsegments}
+\setinterfaceconstant{pageprefixseparatorset}{pageprefixseparatorset}
+\setinterfaceconstant{pageprefixset}{pageprefixset}
+\setinterfaceconstant{pageprefixstarter}{pageprefixstarter}
+\setinterfaceconstant{pageprefixstopper}{pageprefixstopper}
+\setinterfaceconstant{pagesegments}{pagesegments}
+\setinterfaceconstant{pageseparatorset}{pageseparatorset}
+\setinterfaceconstant{pageset}{pageset}
+\setinterfaceconstant{pagestarter}{pagestarter}
+\setinterfaceconstant{pagestate}{paginastatus}
+\setinterfaceconstant{pagestopper}{pagestopper}
+\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{prefixconnector}{prefixconnector}
+\setinterfaceconstant{prefixconversion}{prefixconversion}
+\setinterfaceconstant{prefixconversionset}{prefixconversionset}
+\setinterfaceconstant{prefixsegments}{prefixsegments}
+\setinterfaceconstant{prefixseparatorset}{prefixseparatorset}
+\setinterfaceconstant{prefixset}{prefixset}
+\setinterfaceconstant{prefixstarter}{prefixstarter}
+\setinterfaceconstant{prefixstopper}{prefixstopper}
+\setinterfaceconstant{preset}{preset}
+\setinterfaceconstant{preview}{preview}
+\setinterfaceconstant{previous}{vorige}
+\setinterfaceconstant{previousnumber}{vorigenummer}
+\setinterfaceconstant{process}{proces}
+\setinterfaceconstant{pubsep}{pubsep}
+\setinterfaceconstant{radius}{straal}
+\setinterfaceconstant{random}{willekeur}
+\setinterfaceconstant{range}{bereik}
+\setinterfaceconstant{reduction}{reductie}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{refcommand}{refcommand}
+\setinterfaceconstant{reference}{verwijzing}
+\setinterfaceconstant{referenceprefix}{referenceprefix}
+\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{samplesize}{samplesize}
+\setinterfaceconstant{saveinlist}{saveinlist}
+\setinterfaceconstant{scale}{schaal}
+\setinterfaceconstant{scope}{scope}
+\setinterfaceconstant{screen}{raster}
+\setinterfaceconstant{section}{sectie}
+\setinterfaceconstant{sectionconversion}{sectionconversion}
+\setinterfaceconstant{sectionconversionset}{sectionconversionset}
+\setinterfaceconstant{sectionnumber}{sectienummer}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
+\setinterfaceconstant{sectionsegments}{sectionsegments}
+\setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
+\setinterfaceconstant{sectionset}{sectionset}
+\setinterfaceconstant{sectionstarter}{sectionstarter}
+\setinterfaceconstant{sectionstopper}{sectionstopper}
+\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{sort}{sort}
+\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{starter}{opener}
+\setinterfaceconstant{state}{status}
+\setinterfaceconstant{step}{stap}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{afsluiter}
+\setinterfaceconstant{stretch}{rek}
+\setinterfaceconstant{strip}{strip}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{letter}
+\setinterfaceconstant{sub}{sub}
+\setinterfaceconstant{subtitle}{subtitel}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{surnamesep}{surnamesep}
+\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{synonymcommand}{synoniemcommando}
+\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{totalnumber}{totalnumber}
+\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{vonsep}{vonsep}
+\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{answerlines}{antwoordregels}
+\setinterfaceelement{answerspace}{antwoordruimte}
+\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{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{setupanswerarea}{stelantwoordgebiedin}
+\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{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..738e49f72
--- /dev/null
+++ b/tex/context/base/mult-ro.tex
@@ -0,0 +1,1693 @@
+% 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{answerarea}{answerarea}
+\setinterfacevariable{appendices}{apendixuri}
+\setinterfacevariable{appendix}{apendix}
+\setinterfacevariable{april}{aprilie}
+\setinterfacevariable{atmargin}{lamargine}
+\setinterfacevariable{atpage}{lapagina}
+\setinterfacevariable{august}{august}
+\setinterfacevariable{author}{autor}
+\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{bbl}{bbl}
+\setinterfacevariable{before}{inainte}
+\setinterfacevariable{begin}{begin}
+\setinterfacevariable{bib}{bib}
+\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{cite}{cite}
+\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{down}{down}
+\setinterfacevariable{each}{fiecare}
+\setinterfacevariable{edge}{bordura}
+\setinterfacevariable{empty}{gol}
+\setinterfacevariable{end}{end}
+\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{layer}{layer}
+\setinterfacevariable{left}{stanga}
+\setinterfacevariable{leftedge}{bordurastanga}
+\setinterfacevariable{lefthanging}{lefthanging}
+\setinterfacevariable{leftmargin}{marginestanga}
+\setinterfacevariable{leftpage}{paginastanga}
+\setinterfacevariable{lefttoright}{lefttoright}
+\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{maxdepth}{maxdepth}
+\setinterfacevariable{maxheight}{maxheight}
+\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{may}{mai}
+\setinterfacevariable{mediaeval}{medieval}
+\setinterfacevariable{medium}{mediu}
+\setinterfacevariable{middle}{centru}
+\setinterfacevariable{min}{min}
+\setinterfacevariable{mindepth}{mindepth}
+\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{note}{note}
+\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{overbar}{barasus}
+\setinterfacevariable{overbars}{supralinie}
+\setinterfacevariable{overlay}{overlay}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{overstrike}{liniepeste}
+\setinterfacevariable{overstrikes}{liniipeste}
+\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{righttoleft}{righttoleft}
+\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{short}{short}
+\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{starter}{starter}
+\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{subsubsubsubsubsubsection}{subsubsubsubsubsubsectiune}
+\setinterfacevariable{subsubsubsubsubsubsubject}{subsubsubsubsubsubsubiect}
+\setinterfacevariable{subsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsectiune}
+\setinterfacevariable{subsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubiect}
+\setinterfacevariable{subsubsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsubsectiune}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubsubiect}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsection}{subsubsubsubsubsubsubsubsubsectiune}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsubject}{subsubsubsubsubsubsubsubsubsubiect}
+\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{underbar}{sublinie}
+\setinterfacevariable{underbars}{sublinii}
+\setinterfacevariable{unit}{unitate}
+\setinterfacevariable{units}{unitati}
+\setinterfacevariable{unknown}{necunoscut}
+\setinterfacevariable{unpacked}{despachetat}
+\setinterfacevariable{up}{up}
+\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{alignsymbol}{alignsymbol}
+\setinterfaceconstant{aligntitle}{alinieretitlu}
+\setinterfaceconstant{alternative}{alternativ}
+\setinterfaceconstant{andtext}{andtext}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{sageata}
+\setinterfaceconstant{artauthor}{artauthor}
+\setinterfaceconstant{artauthoretaldisplay}{artauthoretaldisplay}
+\setinterfaceconstant{artauthoretallimit}{artauthoretallimit}
+\setinterfaceconstant{artauthoretaltext}{artauthoretaltext}
+\setinterfaceconstant{at}{la}
+\setinterfaceconstant{author}{autor}
+\setinterfaceconstant{authoretaldisplay}{authoretaldisplay}
+\setinterfaceconstant{authoretallimit}{authoretallimit}
+\setinterfaceconstant{authoretaltext}{authoretaltext}
+\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{bottomafter}{bottomafter}
+\setinterfaceconstant{bottombefore}{bottombefore}
+\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{connector}{connector}
+\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{database}{database}
+\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{editor}{editor}
+\setinterfaceconstant{editoretaldisplay}{editoretaldisplay}
+\setinterfaceconstant{editoretallimit}{editoretallimit}
+\setinterfaceconstant{editoretaltext}{editoretaltext}
+\setinterfaceconstant{empty}{gol}
+\setinterfaceconstant{equalheight}{equalheight}
+\setinterfaceconstant{equalwidth}{equalwidth}
+\setinterfaceconstant{escape}{escape}
+\setinterfaceconstant{evenmargin}{marginepara}
+\setinterfaceconstant{expansion}{expansiune}
+\setinterfaceconstant{export}{export}
+\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{filtercommand}{filtercommand}
+\setinterfaceconstant{finalnamesep}{finalnamesep}
+\setinterfaceconstant{firstnamesep}{firstnamesep}
+\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{headalign}{headalign}
+\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{hidenumber}{hidenumber}
+\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{intent}{intent}
+\setinterfaceconstant{interaction}{interactiune}
+\setinterfaceconstant{interlinespace}{spatiereinterliniara}
+\setinterfaceconstant{itemalign}{itemalign}
+\setinterfaceconstant{items}{elemente}
+\setinterfaceconstant{juniorsep}{juniorsep}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keyword}{keyword}
+\setinterfaceconstant{label}{eticheta}
+\setinterfaceconstant{lastnamesep}{lastnamesep}
+\setinterfaceconstant{lastpubsep}{lastpubsep}
+\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{maxdepth}{maxdepth}
+\setinterfaceconstant{maxheight}{inaltimemaxima}
+\setinterfaceconstant{maxwidth}{latimemaxima}
+\setinterfaceconstant{maybeyear}{maybeyear}
+\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{monthconversion}{monthconversion}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{nume}
+\setinterfaceconstant{namesep}{namesep}
+\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{numberconversion}{numberconversion}
+\setinterfaceconstant{numberconversionset}{numberconversionset}
+\setinterfaceconstant{numberdistance}{numberdistance}
+\setinterfaceconstant{numbering}{numerotare}
+\setinterfaceconstant{numberorder}{numberorder}
+\setinterfaceconstant{numberprefix}{numberprefix}
+\setinterfaceconstant{numbersegments}{numbersegments}
+\setinterfaceconstant{numberseparator}{separatornumar}
+\setinterfaceconstant{numberseparatorset}{numberseparatorset}
+\setinterfaceconstant{numberset}{numberset}
+\setinterfaceconstant{numberstarter}{numberstarter}
+\setinterfaceconstant{numberstopper}{numberstopper}
+\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{order}{order}
+\setinterfaceconstant{orientation}{orientation}
+\setinterfaceconstant{otherstext}{otherstext}
+\setinterfaceconstant{outermargin}{outermargin}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{numarpropriu}
+\setinterfaceconstant{page}{pagina}
+\setinterfaceconstant{pageboundaries}{marginipagina}
+\setinterfaceconstant{pagecolor}{culoarepagina}
+\setinterfaceconstant{pagecommand}{comandapagina}
+\setinterfaceconstant{pageconversion}{pageconversion}
+\setinterfaceconstant{pageconversionset}{pageconversionset}
+\setinterfaceconstant{pagenumber}{numarpagina}
+\setinterfaceconstant{pageprefix}{pageprefix}
+\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
+\setinterfaceconstant{pageprefixconversion}{pageprefixconversion}
+\setinterfaceconstant{pageprefixconversionset}{pageprefixconversionset}
+\setinterfaceconstant{pageprefixsegments}{pageprefixsegments}
+\setinterfaceconstant{pageprefixseparatorset}{pageprefixseparatorset}
+\setinterfaceconstant{pageprefixset}{pageprefixset}
+\setinterfaceconstant{pageprefixstarter}{pageprefixstarter}
+\setinterfaceconstant{pageprefixstopper}{pageprefixstopper}
+\setinterfaceconstant{pagesegments}{pagesegments}
+\setinterfaceconstant{pageseparatorset}{pageseparatorset}
+\setinterfaceconstant{pageset}{pageset}
+\setinterfaceconstant{pagestarter}{pagestarter}
+\setinterfaceconstant{pagestate}{pagestate}
+\setinterfaceconstant{pagestopper}{pagestopper}
+\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{prefixconnector}{prefixconnector}
+\setinterfaceconstant{prefixconversion}{prefixconversion}
+\setinterfaceconstant{prefixconversionset}{prefixconversionset}
+\setinterfaceconstant{prefixsegments}{prefixsegments}
+\setinterfaceconstant{prefixseparatorset}{prefixseparatorset}
+\setinterfaceconstant{prefixset}{prefixset}
+\setinterfaceconstant{prefixstarter}{prefixstarter}
+\setinterfaceconstant{prefixstopper}{prefixstopper}
+\setinterfaceconstant{preset}{preset}
+\setinterfaceconstant{preview}{previzualizare}
+\setinterfaceconstant{previous}{precendent}
+\setinterfaceconstant{previousnumber}{numarprecedent}
+\setinterfaceconstant{process}{process}
+\setinterfaceconstant{pubsep}{pubsep}
+\setinterfaceconstant{radius}{raza}
+\setinterfaceconstant{random}{aleator}
+\setinterfaceconstant{range}{range}
+\setinterfaceconstant{reduction}{reducere}
+\setinterfaceconstant{ref}{ref}
+\setinterfaceconstant{refcommand}{refcommand}
+\setinterfaceconstant{reference}{referinta}
+\setinterfaceconstant{referenceprefix}{referenceprefix}
+\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{samplesize}{samplesize}
+\setinterfaceconstant{saveinlist}{saveinlist}
+\setinterfaceconstant{scale}{scala}
+\setinterfaceconstant{scope}{scop}
+\setinterfaceconstant{screen}{ecran}
+\setinterfaceconstant{section}{sectiune}
+\setinterfaceconstant{sectionconversion}{sectionconversion}
+\setinterfaceconstant{sectionconversionset}{sectionconversionset}
+\setinterfaceconstant{sectionnumber}{numarsectiune}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
+\setinterfaceconstant{sectionsegments}{sectionsegments}
+\setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
+\setinterfaceconstant{sectionset}{sectionset}
+\setinterfaceconstant{sectionstarter}{sectionstarter}
+\setinterfaceconstant{sectionstopper}{sectionstopper}
+\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{sort}{sort}
+\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{starter}{starter}
+\setinterfaceconstant{state}{stare}
+\setinterfaceconstant{step}{pas}
+\setinterfaceconstant{stop}{stop}
+\setinterfaceconstant{stopper}{stopper}
+\setinterfaceconstant{stretch}{dilatat}
+\setinterfaceconstant{strip}{strip}
+\setinterfaceconstant{strut}{strut}
+\setinterfaceconstant{style}{stil}
+\setinterfaceconstant{sub}{sub}
+\setinterfaceconstant{subtitle}{subtitlu}
+\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{surnamesep}{surnamesep}
+\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{synonymcommand}{synonymcommand}
+\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{totalnumber}{totalnumber}
+\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{vonsep}{vonsep}
+\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{answerlines}{answerlines}
+\setinterfaceelement{answerspace}{answerspace}
+\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{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{setupanswerarea}{setupanswerarea}
+\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{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
new file mode 100644
index 000000000..d48ce0a94
--- /dev/null
+++ b/tex/context/base/mult-sys.tex
@@ -0,0 +1,882 @@
+%D \module
+%D [ file=mult-sys,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=System,
+%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 In boring module we define a lot of obscure but useful
+%D system constants. By doing so we save lots of memory while
+%D at the same time we prevent ourself from typing errors.
+
+\writestatus{loading}{ConTeXt Multilingual Macros / System}
+
+\unprotect
+
+%D The constants are grouped in such a way that there is a
+%D minimal change of conflicts.
+%D
+%D \starttyping
+%D \definesystemconstants {word}
+%D \definemessageconstant {word}
+%D \stoptyping
+%D
+%D This commands generate \type{\s!word} and \type{\m!word}.
+
+\definesystemconstant {hans}
+\definesystemconstant {taco}
+
+%D First we define some system constants used for both the
+%D multi||lingual interface and multi||linguag typesetting.
+
+\definesystemconstant {afrikaans} \definesystemconstant {af}
+\definesystemconstant {arabic} \definesystemconstant {ar}
+\definesystemconstant {catalan} \definesystemconstant {ca}
+\definesystemconstant {chinese} \definesystemconstant {cn}
+\definesystemconstant {croatian} \definesystemconstant {hr}
+\definesystemconstant {czech} \definesystemconstant {cs} \definesystemconstant {cz}
+\definesystemconstant {danish} \definesystemconstant {da}
+\definesystemconstant {dutch} \definesystemconstant {nl}
+\definesystemconstant {english} \definesystemconstant {en}
+\definesystemconstant {finish} \definesystemconstant {fi}
+\definesystemconstant {french} \definesystemconstant {fr}
+\definesystemconstant {german} \definesystemconstant {de}
+\definesystemconstant {hungarian} \definesystemconstant {hu}
+\definesystemconstant {italian} \definesystemconstant {it}
+\definesystemconstant {latin} \definesystemconstant {la}
+\definesystemconstant {lithuanian} \definesystemconstant {lt}
+\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}
+\definesystemconstant {slovak} \definesystemconstant {sk}
+\definesystemconstant {slovenian} \definesystemconstant {sl}
+\definesystemconstant {slovene}
+\definesystemconstant {spanish} \definesystemconstant {es}
+\definesystemconstant {swedish} \definesystemconstant {sv}
+\definesystemconstant {turkish} \definesystemconstant {tr}
+\definesystemconstant {turkmen} \definesystemconstant {tk}
+\definesystemconstant {gbenglish} \definesystemconstant {gb} \definesystemconstant {ukenglish} \definesystemconstant {uk}
+\definesystemconstant {usenglish} \definesystemconstant {us}
+\definesystemconstant {ukrainian} \definesystemconstant {ua}
+\definesystemconstant {greek} \definesystemconstant {gr}
+\definesystemconstant {ancientgreek} \definesystemconstant {agr}
+\definesystemconstant {vietnamese} \definesystemconstant {vi} \definesystemconstant {vn}
+
+%D For proper \UNICODE\ support we need a few font related
+%D constants.
+
+\definesystemconstant {BoldItalic}
+\definesystemconstant {BoldSlanted}
+\definesystemconstant {Bold}
+\definesystemconstant {Italic}
+\definesystemconstant {Regular}
+\definesystemconstant {Slanted}
+\definesystemconstant {Unicode}
+
+\definesystemconstant {Serif} \definesystemconstant {Regular}
+\definesystemconstant {Sans} \definesystemconstant {Support}
+\definesystemconstant {Mono} \definesystemconstant {Type}
+\definesystemconstant {Math}
+\definesystemconstant {Handwriting}
+\definesystemconstant {Calligraphy}
+\definesystemconstant {Casual}
+
+\definesystemconstant {SerifBold} \definesystemconstant {SansBold} \definesystemconstant {MonoBold}
+\definesystemconstant {SerifItalic} \definesystemconstant {SansItalic} \definesystemconstant {MonoItalic}
+\definesystemconstant {SerifBoldItalic} \definesystemconstant {SansBoldItalic} \definesystemconstant {MonoBoldItalic}
+\definesystemconstant {SerifSlanted} \definesystemconstant {SansSlanted} \definesystemconstant {MonoSlanted}
+\definesystemconstant {SerifBoldSlanted} \definesystemconstant {SansBoldSlanted} \definesystemconstant {MonoBoldSlanted}
+\definesystemconstant {SerifCaps} \definesystemconstant {SansCaps} \definesystemconstant {MonoCaps}
+
+\definesystemconstant {Normal}
+\definesystemconstant {Caps}
+
+\definesystemconstant {mnem} % kind of generic short tag
+
+\definesystemconstant {file}
+\definesystemconstant {name}
+\definesystemconstant {spec}
+
+\definesystemconstant {serif}
+\definesystemconstant {sans}
+\definesystemconstant {mono}
+\definesystemconstant {math}
+\definesystemconstant {handwriting}
+\definesystemconstant {calligraphy}
+\definesystemconstant {casual}
+\definesystemconstant {fax}
+
+\definesystemconstant {fallback}
+
+\definesystemconstant {none}
+\definesystemconstant {default}
+\definesystemconstant {smallcaps}
+
+%D As the name of their define command states, the next set of
+%D constants is used in the message macro's.
+
+\definemessageconstant {check}
+\definemessageconstant {colors}
+\definemessageconstant {columns}
+\definemessageconstant {encodings}
+\definemessageconstant {regimes}
+\definemessageconstant {figures}
+\definemessageconstant {fields}
+\definemessageconstant {files}
+\definemessageconstant {floatblocks}
+\definemessageconstant {fonts}
+\definemessageconstant {handlings}
+\definemessageconstant {interactions}
+\definemessageconstant {javascript}
+\definemessageconstant {layouts}
+\definemessageconstant {linguals}
+\definemessageconstant {references}
+\definemessageconstant {specials}
+\definemessageconstant {structures}
+\definemessageconstant {symbols}
+\definemessageconstant {systems}
+\definemessageconstant {lua}
+\definemessageconstant {textblocks}
+\definemessageconstant {verbatims}
+\definemessageconstant {versions}
+\definemessageconstant {metapost}
+\definemessageconstant {chemicals}
+\definemessageconstant {publications}
+
+%D Net come some \CONTEXT\ constants, used in the definition
+%D of private commands:
+
+\definesystemconstant {tex}
+\definesystemconstant {xml}
+\definesystemconstant {lua}
+
+\definesystemconstant {next}
+\definesystemconstant {pickup}
+\definesystemconstant {ascii}
+\definesystemconstant {default}
+\definesystemconstant {unknown}
+\definesystemconstant {action}
+\definesystemconstant {compare}
+\definesystemconstant {do}
+\definesystemconstant {dodo}
+\definesystemconstant {complex}
+\definesystemconstant {simple}
+\definesystemconstant {start}
+\definesystemconstant {stop}
+\definesystemconstant {dummy}
+\definesystemconstant {local}
+\definesystemconstant {global}
+\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}
+\definesystemconstant {single}
+\definesystemconstant {multi}
+
+\definesystemconstant {hasnumber}
+\definesystemconstant {hastitle}
+\definesystemconstant {hascaption}
+\definesystemconstant {haslevel}
+
+\definesystemconstant {mkiv}
+\definesystemconstant {mkii}
+\definesystemconstant {entities}
+
+\definesystemconstant {normal}
+\definesystemconstant {bold}
+\definesystemconstant {italic}
+\definesystemconstant {slanted}
+
+\definesystemconstant {default}
+\definesystemconstant {smallcaps}
+
+%D A more experienced \TEX\ user will recognize the next four
+%D constants. We need these because font-definitions are
+%D partially english.
+
+\definesystemconstant {run}
+
+\definesystemconstant {fam}
+\definesystemconstant {text}
+\definesystemconstant {script}
+\definesystemconstant {scriptscript}
+
+\definesystemconstant {lefthyphenmin}
+\definesystemconstant {righthyphenmin}
+
+\definesystemconstant {skewchar}
+\definesystemconstant {hyphenchar}
+\definesystemconstant {catcodes}
+\definesystemconstant {encoding}
+\definesystemconstant {resource}
+\definesystemconstant {mapping}
+\definesystemconstant {language}
+\definesystemconstant {patterns}
+\definesystemconstant {rname}
+\definesystemconstant {rscale}
+\definesystemconstant {handling}
+\definesystemconstant {features}
+\definesystemconstant {fallbacks}
+\definesystemconstant {background}
+\definesystemconstant {ucmap}
+
+\definesystemconstant {property}
+\definesystemconstant {overprint}
+\definesystemconstant {layer}
+\definesystemconstant {effect}
+\definesystemconstant {negative}
+\definesystemconstant {color}
+\definesystemconstant {transparency}
+
+\definesystemconstant {black}
+\definesystemconstant {white}
+
+\definesystemconstant {format}
+\definesystemconstant {extensions}
+\definesystemconstant {initializations}
+
+%D Just to be complete we define the standard \TEX\ units.
+
+\definesystemconstant {cm}
+\definesystemconstant {em}
+\definesystemconstant {ex}
+\definesystemconstant {mm}
+\definesystemconstant {pt}
+\definesystemconstant {sp}
+\definesystemconstant {bp}
+\definesystemconstant {in}
+\definesystemconstant {pc}
+\definesystemconstant {cm}
+\definesystemconstant {dd}
+\definesystemconstant {cc}
+\definesystemconstant {nd}
+\definesystemconstant {nc}
+
+%D These constants are used for internal and utility
+%D commands.
+
+\definesystemconstant {check}
+\definesystemconstant {reset}
+\definesystemconstant {set}
+
+\definesystemconstant {entrya}
+\definesystemconstant {entryb}
+\definesystemconstant {entryc}
+\definesystemconstant {entryd}
+\definesystemconstant {entry}
+\definesystemconstant {see}
+\definesystemconstant {from}
+\definesystemconstant {to}
+\definesystemconstant {line}
+\definesystemconstant {page}
+\definesystemconstant {realpage}
+\definesystemconstant {userpage}
+\definesystemconstant {subpage}
+
+\definesystemconstant {synonym}
+
+\definesystemconstant {reference}
+\definesystemconstant {main}
+
+\definesystemconstant {list}
+
+\definesystemconstant {item}
+\definesystemconstant {itemcount}
+
+\definesystemconstant {number}
+\definesystemconstant {references}
+\definesystemconstant {between}
+\definesystemconstant {format}
+\definesystemconstant {old}
+
+\definesystemconstant {thisisblock}
+\definesystemconstant {thiswasblock}
+
+\definesystemconstant {figurepreset}
+
+\definesystemconstant {empty}
+
+%D Some \CONTEXT\ commands take a two||pass aproach to
+%D optimize the typesetting. Each two||pass object has its
+%D own tag.
+
+\definesystemconstant {pass}
+
+\definesystemconstant {data}
+\definesystemconstant {float}
+\definesystemconstant {list}
+\definesystemconstant {page}
+\definesystemconstant {subpage}
+\definesystemconstant {margin}
+\definesystemconstant {profile}
+\definesystemconstant {versionbegin}
+\definesystemconstant {versionend}
+\definesystemconstant {cross}
+\definesystemconstant {paragraph}
+
+%D A lot of macros use tags to distinguish between different
+%D objects, e.g. lists and registers.
+
+\definesystemconstant {prt} % part (deel)
+\definesystemconstant {chp} % chapter (hoofdstuk)
+\definesystemconstant {sec} % section (paragraaf)
+\definesystemconstant {tit} % title (titel)
+\definesystemconstant {sub} % subject (onderwerp)
+\definesystemconstant {mar} % margin (marge)
+\definesystemconstant {num} % number (doornummeren)
+\definesystemconstant {def} % definition (doordefinieren)
+\definesystemconstant {for} % formula (formule)
+\definesystemconstant {fnt} % footnote (voetnoot)
+\definesystemconstant {ind} % index (register)
+\definesystemconstant {lin} % linked index
+\definesystemconstant {lst} % list (opsomming)
+\definesystemconstant {flt} % float (plaatsblok)
+\definesystemconstant {pag} % page (pagina)
+\definesystemconstant {txt} % text (tekst)
+\definesystemconstant {ref} % reference (verwijzing)
+\definesystemconstant {lab} % label (label)
+\definesystemconstant {aut} % automatic (inhoud, index)
+\definesystemconstant {vwa} % automatic (illustrations)
+\definesystemconstant {vwb} % automatic (illustrations)
+
+\definesystemconstant {kop} % kop % still dutch
+
+%D Reference labels can be tagged by users, for instance by
+%D means of \type{tag:}. The reference mechanism itself uses
+%D some tags too. These are definitely not to be used by users.
+%D Here they are:
+
+\definereferenceconstant {cross} {:c:} % cross reference
+\definereferenceconstant {view} {:v:} % view reference
+\definereferenceconstant {viewa} {:a:} % view reference test a
+\definereferenceconstant {viewb} {:b:} % view reference test b
+\definereferenceconstant {page} {:p:} % page referece
+\definereferenceconstant {list} {:l:} % list reference
+\definereferenceconstant {exec} {:e:} % execution reference
+\definereferenceconstant {form} {:m:} % form reference
+\definereferenceconstant {syst} {:s:} % system reference
+
+\definereferenceconstant {from} {:f:} % from list reference
+\definereferenceconstant {to} {:t:} % to list reference
+
+\definereferenceconstant {object} {:o:} % object reference
+\definereferenceconstant {driver} {:d:} % driver object reference
+\definereferenceconstant {widget} {:w:} % field chain reference
+
+\definereferenceconstant {java} {:j:} % java scripts
+
+%D When we use numbers and dimensions the same applies as
+%D with the keywords like \type{width} and \type{plus}
+%D mentioned earlier.
+
+\def\!!ten {10}
+\def\!!twelve {12}
+\def\!!hundred {100}
+\def\!!thousand {1000}
+\def\!!tenthousand {10000}
+\def\!!maxcard {65536}
+\def\!!medcard {32768}
+
+\def\!!zeropoint {0pt}
+\def\!!onepoint {1pt}
+\def\!!twopoint {2pt}
+\def\!!threepoint {3pt}
+\def\!!fourpoint {4pt}
+\def\!!fivepoint {5pt}
+\def\!!sixpoint {6pt}
+\def\!!sevenpoint {7pt}
+\def\!!eightpoint {8pt}
+\def\!!ninepoint {9pt}
+\def\!!tenpoint {10pt}
+\def\!!elevenpoint {11pt}
+\def\!!twelvepoint {12pt}
+\def\!!fourteenpointfour {14.4pt}
+
+\let\onerealpoint\onepoint % needed for latex
+
+% D Another optimization is:
+%
+% \let\points\onepoint
+
+%D A rough test is:
+%D
+%D \starttyping
+%D \def\TestMe % 7.75 sec on a P4/2G
+%D {\dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points
+%D \dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points}
+%D
+%D \def\TestMe % 11.5 sec on a P4/2G
+%D {\dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt%
+%D \dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt}
+%D
+%D \def\TestMe % 12.5 sec on a P4/2G
+%D {\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt%
+%D \dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt}
+%D
+%D \testfeatureonce {500000}{\TestMe}
+%D \stoptyping
+
+%D Variables are composed of a command specific tag and a user
+%D supplied variable (system constant). The first tag \type{ag}
+%D for instance is available as \type{\??ag} and expands to
+%D \type{@@ag} in composed variables.
+
+% vervallen : hd hr hm vt vr vm tr tn te br bm bo on om or
+
+\definesystemvariable {ab} % AlignedBoxes
+\definesystemvariable {ac} % ACcent
+\definesystemvariable {ae} % AttributEs
+\definesystemvariable {ag} % AchterGrond
+\definesystemvariable {al} % ALinea's
+\definesystemvariable {am} % interActieMenu
+\definesystemvariable {an} % ANchor
+\definesystemvariable {as} % AlignmentSwitch
+\definesystemvariable {at} % ATtachments
+\definesystemvariable {ba} % synchronisatieBAlk
+\definesystemvariable {be} % startstop (BeginEnd)
+\definesystemvariable {bj} % BlokJe
+\definesystemvariable {bk} % Blokken (floats)
+\definesystemvariable {bl} % BLanko
+\definesystemvariable {bg} % BleedinG
+\definesystemvariable {bo} % BlankO (definitions)
+\definesystemvariable {bp} % BreakPoint
+\definesystemvariable {br} % sideBaR
+\definesystemvariable {bs} % SelecteerBlokken
+\definesystemvariable {bt} % BuTton
+\definesystemvariable {bu} % BUffer
+\definesystemvariable {bv} % Brieven
+\definesystemvariable {by} % Per
+\definesystemvariable {cb} % CollectBox
+\definesystemvariable {cc} % Comment
+\definesystemvariable {ce} % CasEs
+\definesystemvariable {ch} % CHaracterspacing
+\definesystemvariable {ci} % CItaat
+\definesystemvariable {ck} % Character Kerning
+\definesystemvariable {cl} % kleur (CoLor setup)
+\definesystemvariable {cn} % CollumN
+\definesystemvariable {cm} % CheMical
+\definesystemvariable {co} % COmbinaties
+\definesystemvariable {cp} % CliP
+\definesystemvariable {cr} % kleur (ColoR)
+\definesystemvariable {cs} % kleur (ColorSeparation
+\definesystemvariable {cv} % ConVersie
+\definesystemvariable {cy} % CrYteria
+\definesystemvariable {da} % DAte
+\definesystemvariable {db} % Labels
+\definesystemvariable {dc} % DroppedCaps
+\definesystemvariable {dd} % DoorDefinieren
+\definesystemvariable {de} % DEel
+\definesystemvariable {di} % DIrections
+\definesystemvariable {dl} % DunneLijnen
+\definesystemvariable {dn} % DoorNummeren
+\definesystemvariable {dm} % DefineMeasure
+\definesystemvariable {do} % DefinieerOpmaak
+\definesystemvariable {du} % DUmmy
+\definesystemvariable {ds} % DoorSpringen
+\definesystemvariable {ef} % ExternFiguur
+\definesystemvariable {ec} % EnCoding
+\definesystemvariable {en} % ENvironments
+\definesystemvariable {ep} % ExternfiguurPreset
+\definesystemvariable {eq} % EQalign
+\definesystemvariable {er} % external resources
+\definesystemvariable {ex} % ExterneFiguren
+\definesystemvariable {fa} % font feature
+\definesystemvariable {fc} % FramedContent
+\definesystemvariable {fd} % FielD
+\definesystemvariable {fe} % FoxetExtensions
+\definesystemvariable {ff} % FontFile
+\definesystemvariable {fg} % FiGuurmaten
+\definesystemvariable {fi} % FIle
+\definesystemvariable {fl} % Floats
+\definesystemvariable {fm} % ForMules
+\definesystemvariable {fn} % subformulas
+\definesystemvariable {fo} % xml FO
+\definesystemvariable {fp} % FilegroeP
+\definesystemvariable {fq} % Features
+\definesystemvariable {fr} % ForM
+\definesystemvariable {fs} % FileSynonym
+\definesystemvariable {ft} % FonTs
+\definesystemvariable {fu} % FontSolution
+\definesystemvariable {fv} % FontVariant
+\definesystemvariable {fw} % simpleFonts by Wolfgang
+\definesystemvariable {fx} % FoXet
+\definesystemvariable {gr} % GRid
+\definesystemvariable {ha} % HAng
+\definesystemvariable {hs} % HSpace
+\definesystemvariable {ht} % HiddenText
+\definesystemvariable {ia} % Interactie
+\definesystemvariable {ib} % InteractieBalk
+\definesystemvariable {ic} % ICc profiles
+\definesystemvariable {id} % Index
+\definesystemvariable {ig} % ItemGroup
+\definesystemvariable {ih} % InHoudsopgave
+\definesystemvariable {ii} % stelIndexIn
+\definesystemvariable {il} % stelInvulRegelsin
+\definesystemvariable {im} % InMarge
+\definesystemvariable {in} % INspringen
+\definesystemvariable {ip} % InsertPages
+\definesystemvariable {is} % Items
+\definesystemvariable {it} % stelInTerliniein
+\definesystemvariable {iv} % stelInvulLijnenin
+\definesystemvariable {ka} % KAntlijn
+\definesystemvariable {kd} % KaDerteksten
+\definesystemvariable {kj} % KopJes (floats)
+\definesystemvariable {kk} % Kapitalen
+\definesystemvariable {kl} % KoLommen
+\definesystemvariable {km} % KenMerk
+\definesystemvariable {ko} % KOp(pen)
+\definesystemvariable {kp} % KopPelteken
+\definesystemvariable {kr} % KoRps
+\definesystemvariable {ks} % KolomSpan
+\definesystemvariable {kt} % KonTakten
+\definesystemvariable {kw} % KontaktWaarde
+\definesystemvariable {la} % LAnguage
+\definesystemvariable {lb} % LaBels
+\definesystemvariable {ld} % LegenDa
+\definesystemvariable {le} % LinetablE
+\definesystemvariable {lf} % LocalFigures
+\definesystemvariable {lg} % taal (LanGuage)
+\definesystemvariable {li} % LIjst
+\definesystemvariable {lk} % LinK
+\definesystemvariable {ll} % Layers
+\definesystemvariable {lx} % LayerteXt
+\definesystemvariable {ln} % LijNen
+\definesystemvariable {lo} % LOgos
+\definesystemvariable {lt} % LiTeratuur
+\definesystemvariable {ls} % languageScript
+\definesystemvariable {ly} % LaYout
+\definesystemvariable {ma} % MargeAchtergrond
+\definesystemvariable {mb} % MargeBlokken
+\definesystemvariable {md} % MoDule
+\definesystemvariable {mg} % Metapost paGe
+\definesystemvariable {mh} % MultilingualHead
+\definesystemvariable {mk} % MarKering
+\definesystemvariable {ml} % MultilingualLabel
+\definesystemvariable {mm} % MultilingualMath
+\definesystemvariable {mt} % inline MaTh
+\definesystemvariable {mo} % Math Options
+\definesystemvariable {mp} % MetaPost
+\definesystemvariable {mx} % MatriX
+\definesystemvariable {ng} % parbuilders
+\definesystemvariable {nh} % new heads (structure)
+\definesystemvariable {nn} % structurenumbering
+\definesystemvariable {nm} % Nummering
+\definesystemvariable {np} % NaastPlaatsen
+\definesystemvariable {nr} % Nummeren
+\definesystemvariable {of} % OFfset
+\definesystemvariable {oi} % OmlijndInstellingen
+\definesystemvariable {ol} % OmLijnd
+\definesystemvariable {od} % Omlijnd Defaults (simple)
+\definesystemvariable {on} % ONderstreep
+\definesystemvariable {oo} % OpsOmmingen
+\definesystemvariable {op} % OPsomming
+\definesystemvariable {or} % OtpfilteR
+\definesystemvariable {os} % OffSet
+\definesystemvariable {ot} % OTpsequence
+\definesystemvariable {ov} % OVerlay
+\definesystemvariable {ox} % OffsetBox
+\definesystemvariable {pa} % PAlet
+\definesystemvariable {pb} % PuBlication
+\definesystemvariable {pc} % PageComment
+\definesystemvariable {pe} % PagEhandler
+\definesystemvariable {pf} % ProFiel
+\definesystemvariable {pg} % KoppelPagina
+\definesystemvariable {ph} % ParagrapH
+\definesystemvariable {pl} % PLaats
+\definesystemvariable {pn} % PaginaNummer
+\definesystemvariable {po} % PrOcessor
+\definesystemvariable {pp} % PaPier
+\definesystemvariable {pr} % PRogrammas
+\definesystemvariable {ps} % PoSitioneren
+\definesystemvariable {pt} % PageshifT
+\definesystemvariable {py} % PropertYs
+\definesystemvariable {pv} % PublicationVariable
+\definesystemvariable {ra} % RAise
+\definesystemvariable {rd} % RenDering
+\definesystemvariable {rf} % ReFereren
+\definesystemvariable {rg} % ReGel
+\definesystemvariable {rl} % ReferentieLijst
+\definesystemvariable {rn} % RegelNummer
+\definesystemvariable {ro} % ROteren
+\definesystemvariable {rr} % linenotes
+\definesystemvariable {rs} % RaSters
+\definesystemvariable {rt} % RoosTers
+\definesystemvariable {rv} % ReserVeerfiguur
+\definesystemvariable {rw} % RenderingWindow
+\definesystemvariable {sa} % ScAle
+\definesystemvariable {sb} % SectieBlok
+\definesystemvariable {sc} % SCherm
+\definesystemvariable {sd} % SounD
+\definesystemvariable {se} % SEctie
+\definesystemvariable {sf} % SpeciFics
+\definesystemvariable {sg} % SpacinG
+\definesystemvariable {sh} % ShapeText
+\definesystemvariable {si} % SplIt
+\definesystemvariable {sk} % SectieKop
+\definesystemvariable {sl} % SmalLer
+\definesystemvariable {sm} % SynonieMen
+\definesystemvariable {sn} % SubNummer
+\definesystemvariable {so} % SOrteren
+\definesystemvariable {sp} % SelecteerPapier
+\definesystemvariable {sr} % SpacehandleR
+\definesystemvariable {ss} % Symbool
+\definesystemvariable {st} % STickers
+\definesystemvariable {su} % SetUp
+\definesystemvariable {sv} % SysteemVariabelen
+\definesystemvariable {sw} % SectionWorld
+\definesystemvariable {sx} % Selector
+\definesystemvariable {sy} % SYnchronisatie
+\definesystemvariable {ta} % TAb
+\definesystemvariable {tb} % TekstBlokken
+\definesystemvariable {td} % TextbackgrounDs
+\definesystemvariable {te} % TEmplate
+\definesystemvariable {tf} % TypeFace
+\definesystemvariable {tg} % Tex paGe
+\definesystemvariable {ti} % TabelInstellingen
+\definesystemvariable {tk} % Teksten
+\definesystemvariable {tl} % TekstLijnen
+\definesystemvariable {tm} % TypesynonyM
+\definesystemvariable {tp} % TyPen
+\definesystemvariable {tx} % TeXtflow
+\definesystemvariable {to} % TOlerance
+\definesystemvariable {tr} % TRacer
+\definesystemvariable {ts} % TypeScript
+\definesystemvariable {tt} % TabulaTe
+\definesystemvariable {ty} % TYpe
+\definesystemvariable {uc} % Unicode
+\definesystemvariable {ui} % UItvoer
+\definesystemvariable {ur} % URl
+\definesystemvariable {up} % Utility Program
+\definesystemvariable {va} % VspAce
+\definesystemvariable {ve} % VErsie
+\definesystemvariable {vn} % VoetNoten
+\definesystemvariable {vs} % VSpacing
+\definesystemvariable {vt} % VerTical
+\definesystemvariable {wr} % WitRuimte
+\definesystemvariable {wl} % WordList
+\definesystemvariable {xf} % XML File
+\definesystemvariable {xl} % lxml (mkiv)
+\definesystemvariable {xm} % xml (mkiv)
+\definesystemvariable {xp} % XML Processing
+\definesystemvariable {xy} % schaal
+\definesystemvariable {za} % ZetspiegelAanpassing
+
+%D Next we define some language independant one letter
+%D variables and keywords.
+
+\defineinterfaceconstant {x} {x} % x offset
+\defineinterfaceconstant {y} {y} % y offset
+\defineinterfaceconstant {w} {w} % width
+\defineinterfaceconstant {h} {h} % height
+\defineinterfaceconstant {s} {s} % size
+\defineinterfaceconstant {t} {t} % title
+\defineinterfaceconstant {c} {c} % creator
+\defineinterfaceconstant {e} {e} % extension
+\defineinterfaceconstant {f} {f} % file
+
+\defineinterfaceconstant {a} {a} % kunnen weg
+\defineinterfaceconstant {b} {b} % kunnen weg
+\defineinterfaceconstant {c} {c} % kunnen weg
+\defineinterfaceconstant {d} {d} % kunnen weg
+\defineinterfaceconstant {e} {e} % kunnen weg
+
+\defineinterfaceconstant {s} {s}
+\defineinterfaceconstant {r} {r}
+\defineinterfaceconstant {g} {g}
+\defineinterfaceconstant {b} {b}
+\defineinterfaceconstant {c} {c}
+\defineinterfaceconstant {m} {m}
+\defineinterfaceconstant {y} {y}
+\defineinterfaceconstant {k} {k}
+\defineinterfaceconstant {a} {a} % alternative
+\defineinterfaceconstant {t} {t} % transparency
+\defineinterfaceconstant {p} {p} % percentage
+
+\defineinterfaceconstant {t} {t}
+\defineinterfaceconstant {h} {h}
+\defineinterfaceconstant {b} {b}
+
+\defineinterfaceconstant {rgb} {rgb}
+\defineinterfacevariable {rgb} {rgb}
+
+\defineinterfaceconstant {cmyk} {cmyk}
+\defineinterfacevariable {cmyk} {cmyk}
+
+\defineinterfaceconstant {mp} {mp}
+\defineinterfacevariable {mp} {mp}
+
+\defineinterfacevariable {s} {s}
+
+\defineinterfacevariable {a} {a}
+\defineinterfacevariable {b} {b}
+\defineinterfacevariable {c} {c}
+\defineinterfacevariable {d} {d}
+
+%D Special purpose variables:
+
+\def\v!oddeven#1{\ifodd#1\v!odd\else\v!even\fi}
+
+%D The names of files and their extensions are fixed.
+%D \CONTEXT\ uses as less files as possible. Utility files can
+%D be recognized by the first two characters of the extension:
+%D \type{tu}.
+
+\definefileconstant {utilityfilename} {texutil}
+
+\definefileconstant {blockextension} {tub}
+\definefileconstant {figureextension} {tuf}
+\definefileconstant {inputextension} {tui}
+\definefileconstant {outputextension} {tuo} % tup for previous run
+\definefileconstant {optionextension} {top}
+\definefileconstant {temporaryextension} {tmp}
+\definefileconstant {patternsextension} {pat}
+\definefileconstant {hyphensextension} {hyp}
+\definefileconstant {fontmapextension} {map}
+\definefileconstant {bibextension} {bbl}
+
+%D These files are loaded at start||up. They may contain system
+%D specific setups (or calls to other files), old macro's, to
+%D garantee compatibility and new macro's noy yet present in
+%D the format.
+
+\definefileconstant {errfilename} {cont-err}
+\definefileconstant {sysfilename} {cont-sys}
+\definefileconstant {oldfilename} {cont-old}
+\definefileconstant {newfilename} {cont-new}
+\definefileconstant {filfilename} {cont-fil}
+\definefileconstant {modfilename} {cont-mod}
+
+%D Handy for typescripts (we could use s! instead:
+
+\definetypescriptconstant {name} {name}
+\definetypescriptconstant {default} {default}
+\definetypescriptconstant {map} {map}
+\definetypescriptconstant {special} {special}
+\definetypescriptconstant {size} {size}
+
+%D The next two files specify user settings as well as
+%D \TEXEXEC\ settings when generating a format.
+
+\definefileconstant {usrfilename} {cont-usr} % .tex
+\definefileconstant {fmtfilename} {cont-fmt} % .tex
+
+%D The setup files for the language, font, color and special
+%D subsystems have a common prefix. This means that we have at
+%D most three characters for unique filenames.
+
+\definefileconstant {colorprefix} {colo-}
+\definefileconstant {encodingprefix} {enco-}
+\definefileconstant {filterprefix} {filt-}
+\definefileconstant {fontprefix} {font-}
+\definefileconstant {handlingprefix} {hand-}
+\definefileconstant {javascriptprefix} {java-}
+\definefileconstant {languageprefix} {lang-}
+\definefileconstant {mathprefix} {math-}
+\definefileconstant {metapostprefix} {meta-}
+\definefileconstant {regimeprefix} {regi-}
+\definefileconstant {specialprefix} {spec-}
+\definefileconstant {symbolprefix} {symb-}
+\definefileconstant {typeprefix} {type-}
+\definefileconstant {xtagprefix} {xtag-}
+\definefileconstant {propprefix} {prop-}
+\definefileconstant {unicprefix} {unic-}
+\definefileconstant {sortprefix} {sort-}
+\definefileconstant {prettyprefix} {pret-}
+
+\definefileconstant {moduleprefix} {m-}
+\definefileconstant {styleprefix} {s-}
+\definefileconstant {xstyleprefix} {x-}
+\definefileconstant {privateprefix} {p-}
+\definefileconstant {thirdprefix} {t-}
+
+%definefileconstant {beforeprefix} {b-}
+%definefileconstant {afterprefix} {a-}
+
+%D \CONTEXT\ follows different strategies for finding files.
+%D The macros that are responsible for this 'clever' searching
+%D make use of two (very important) path specifiers.
+
+\definefileconstant {pathseparator} {/}
+\definefileconstant {currentpath} {.}
+\definefileconstant {parentpath} {..}
+
+%D The way fonts are defined and called upon is language
+%D independant. We follow the scheme laid down by Knuth in
+%D Plain \TEX. We'll explain their meaning later.
+
+\defineinterfaceconstant {tf} {tf}
+\defineinterfaceconstant {bf} {bf}
+\defineinterfaceconstant {bs} {bs}
+\defineinterfaceconstant {bi} {bi}
+\defineinterfaceconstant {sl} {sl}
+\defineinterfaceconstant {it} {it}
+\defineinterfaceconstant {sc} {sc}
+\defineinterfaceconstant {rm} {rm}
+\defineinterfaceconstant {ss} {ss}
+\defineinterfaceconstant {tt} {tt}
+\defineinterfaceconstant {hw} {hw}
+\defineinterfaceconstant {cg} {cg}
+\defineinterfaceconstant {os} {os}
+\defineinterfaceconstant {mm} {mm}
+\defineinterfaceconstant {i} {i}
+\defineinterfaceconstant {nn} {nn}
+
+\defineinterfaceconstant {x} {x}
+\defineinterfaceconstant {xx} {xx}
+
+\defineinterfaceconstant {em} {em}
+
+\defineinterfaceconstant {mi} {mi}
+\defineinterfaceconstant {sy} {sy}
+\defineinterfaceconstant {ex} {ex}
+\defineinterfaceconstant {mr} {mr}
+
+\defineinterfaceconstant {ma} {ma}
+\defineinterfaceconstant {mb} {mb}
+\defineinterfaceconstant {mc} {mc}
+
+%D For figure inclusion we need:
+
+\defineinterfaceconstant {tif} {tif}
+\defineinterfaceconstant {eps} {eps}
+\defineinterfaceconstant {mps} {mps}
+\defineinterfaceconstant {jpg} {jpg}
+\defineinterfaceconstant {pdf} {pdf}
+\defineinterfaceconstant {png} {png}
+\defineinterfaceconstant {avi} {avi}
+\defineinterfaceconstant {mov} {mov}
+\defineinterfaceconstant {svg} {svg}
+\defineinterfaceconstant {tex} {tex}
+\defineinterfaceconstant {tmp} {tmp}
+
+%D A careful reader will have noticed that in the module
+%D \type{mult-ini} we defined \type{\selectinterface}. We were
+%D not yet able to actually select an interface, because we
+%D still had to define the constants and variables. Now we've
+%D done so, selection is permitted.
+
+\selectinterface
+
+%D Ok, here are some more, because we've got ouselves some
+%D extensions to \CONTEXT.
+
+\definemessageconstant {addresses}
+\definemessageconstant {documents}
+
+\protect
+
+\endinput
diff --git a/tex/context/base/node-aux.lua b/tex/context/base/node-aux.lua
new file mode 100644
index 000000000..9ed71fd72
--- /dev/null
+++ b/tex/context/base/node-aux.lua
@@ -0,0 +1,145 @@
+if not modules then modules = { } end modules ['node-aux'] = {
+ version = 1.001,
+ comment = "companion to node-spl.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local gsub, format = string.gsub, string.format
+
+local free_node = node.free
+local hpack_nodes = node.hpack
+local node_fields = node.fields
+
+function nodes.repack_hlist(list,...)
+ local temp, b = hpack_nodes(list,...)
+ list = temp.list
+ temp.list = nil
+ free_node(temp)
+ return list, b
+end
+
+function nodes.merge(a,b)
+ if a and b then
+ local t = node.fields(a.id)
+ for i=3,#t do
+ local name = t[i]
+ a[name] = b[name]
+ end
+ end
+ return a, b
+end
+
+local fields, whatsitfields = { }, { }
+
+for k, v in next, node.types() do
+ if v == "whatsit" then
+ fields[k], fields[v] = { }, { }
+ for kk, vv in next, node.whatsits() do
+ local f = node_fields(k,kk)
+ whatsitfields[kk], whatsitfields[vv] = f, f
+ end
+ else
+ local f = node_fields(k)
+ fields[k], fields[v] = f, f
+ end
+end
+
+nodes.fields, nodes.whatsitfields = fields, whatsitfields
+
+function nodes.info(n)
+ local id = n.id
+ local tp = node.type(id)
+ local list = (tp == "whatsit" and whatsitfields[n.subtype]) or fields[id]
+ logs.report(format("%14s","type"),tp)
+ for k,v in next, list do
+ logs.report(format("%14s",v),gsub(gsub(tostring(n[v]),"%s+"," "),"node ",""))
+ end
+end
+
+-- history:
+--
+-- local function cp_skipable(a,id) -- skipable nodes at the margins during character protrusion
+-- return (
+-- id ~= glyph_node
+-- or id == ins_node
+-- or id == mark_node
+-- or id == adjust_node
+-- or id == penalty_node
+-- or (id == glue_node and a.spec.writable)
+-- or (id == disc_node and a.pre == nil and a.post == nil and a.replace == nil)
+-- or (id == math_node and a.surround == 0)
+-- or (id == kern_node and (a.kern == 0 or a.subtype == NORMAL))
+-- or (id == hlist_node and a.width == 0 and a.height == 0 and a.depth == 0 and a.list == nil)
+-- or (id == whatsit_node and a.subtype ~= pdf_refximage_node and a.subtype ~= pdf_refxform_node)
+-- )
+-- end
+--
+-- local function glyph_width(a)
+-- local ch = chardata[a.font][a.char]
+-- return (ch and ch.width) or 0
+-- end
+--
+-- local function glyph_total(a)
+-- local ch = chardata[a.font][a.char]
+-- return (ch and (ch.height+ch.depth)) or 0
+-- end
+--
+-- local function non_discardable(a) -- inline
+-- return a.id < math_node -- brrrr
+-- end
+--
+-- local function calculate_badness(t,s)
+-- if t == 0 then
+-- return 0
+-- elseif s <= 0 then
+-- return INF_BAD
+-- else
+-- local r
+-- if t <= 7230584 then
+-- r = t * 297 / s
+-- elseif s >= 1663497 then
+-- r = t / floor(s / 297)
+-- else
+-- r = t
+-- end
+-- r = floor(r)
+-- if r > 1290 then
+-- return INF_BAD
+-- else
+-- return floor((r * r * r + 0x20000) / 0x40000) -- 0400000 / 01000000
+-- end
+-- end
+-- end
+--
+-- left-overs
+--
+-- local function round_xn_over_d(x, n, d)
+-- local positive -- was x >= 0
+-- if x >= 0 then
+-- positive = true
+-- else
+-- x = -x
+-- positive = false
+-- end
+-- local t = floor(x % 0x8000) * n -- 0100000
+-- local f = floor(t / 0x8000) -- 0100000
+-- local u = floor(x / 0x8000) * n + f -- 0100000
+-- local v = floor(u % d) * 0x8000 + f -- 0100000
+-- if floor(u / d) >= 0x8000 then -- 0100000
+-- logs.error("parbuilder",'arith_error')
+-- else
+-- u = 0x8000 * floor(u / d) + floor(v / d) -- 0100000
+-- end
+-- v = floor(v % d)
+-- if 2*v >= d then
+-- u = u + 1
+-- end
+-- if positive then
+-- return u
+-- else
+-- return -u
+-- end
+-- end
+
diff --git a/tex/context/base/node-bck.lua b/tex/context/base/node-bck.lua
new file mode 100644
index 000000000..94fbac85f
--- /dev/null
+++ b/tex/context/base/node-bck.lua
@@ -0,0 +1,119 @@
+if not modules then modules = { } end modules ['node-bck'] = {
+ version = 1.001,
+ comment = "companion to node-bck.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- beware, this one takes quite some runtime, so we need a status flag
+-- maybe some page related state
+
+local hlist = node.id("hlist")
+local vlist = node.id("vlist")
+
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local traverse = node.traverse
+
+local new_rule = nodes.rule
+local new_glue = nodes.glue
+
+local a_color = attributes.private('color')
+local a_transparency = attributes.private('transparency')
+local a_colorspace = attributes.private('colormodel')
+local a_background = attributes.private('background')
+
+local function add_backgrounds(head) -- boxes, inline will be done too
+ local id = head.id
+ if id == vlist or id == hlist then
+ local current = head.list
+ while current do
+ local id = current.id
+ if id == hlist then -- and current.list
+ local background = has_attribute(current,a_background)
+ if background then
+ -- direct to hbox
+ -- colorspace is already set so we can omit that and stick to color
+ local mode = has_attribute(current,a_colorspace)
+ if mode then
+ local glue = new_glue(-current.width)
+ local rule = new_rule(current.width,current.height,current.depth)
+ local color = has_attribute(current,a_color)
+ local transparency = has_attribute(current,a_transparency)
+ set_attribute(rule,a_colorspace, mode)
+ if color then
+ set_attribute(rule,a_color, color)
+ end
+ if transparency then
+ set_attribute(rule,a_transparency,transparency)
+ end
+ rule.next = glue
+ glue.next = current.list
+ current.list = rule
+ end
+ else
+ -- temporary hack for aligments
+ local list, background, found = current.list, nil, nil
+ for l in traverse(list) do
+ background = has_attribute(l,a_background)
+ if background then
+ found = l
+ break
+ end
+ end
+ if background then
+ local mode = has_attribute(found,a_colorspace)
+ if mode then
+ local glue = new_glue(-current.width)
+ local rule = new_rule(current.width,current.height,current.depth)
+ local color = has_attribute(found,a_color)
+ local transparency = has_attribute(found,a_transparency)
+ set_attribute(rule,a_colorspace, mode)
+ if color then
+ set_attribute(rule,a_color, color)
+ end
+ if transparency then
+ set_attribute(rule,a_transparency,transparency)
+ end
+ rule.next = glue
+ glue.next = list
+ current.list = rule
+ end
+ else
+ add_backgrounds(current)
+ end
+ end
+ elseif id == vlist then -- and current.list
+ -- direct to vbox
+ local background = has_attribute(current,a_background)
+ if background then
+ local mode = has_attribute(current,a_colorspace)
+ if mode then
+ local glue = new_glue(-current.height-current.depth)
+ local rule = new_rule(current.width,current.height,current.depth)
+ local color = has_attribute(current,a_color)
+ local transparency = has_attribute(current,a_transparency)
+ set_attribute(rule,a_colorspace, mode)
+ if color then
+ set_attribute(rule,a_color, color)
+ end
+ if transparency then
+ set_attribute(rule,a_transparency,transparency)
+ end
+ rule.next = glue
+ glue.next = current.list
+ current.list = rule
+ end
+ end
+ add_backgrounds(current)
+ end
+ current = current.next
+ end
+ end
+ return head, true
+end
+
+nodes.add_backgrounds = add_backgrounds
+
+tasks.appendaction("shipouts","normalizers","nodes.add_backgrounds")
diff --git a/tex/context/base/node-bck.mkiv b/tex/context/base/node-bck.mkiv
new file mode 100644
index 000000000..41a6da2cb
--- /dev/null
+++ b/tex/context/base/node-bck.mkiv
@@ -0,0 +1,163 @@
+%D \module
+%D [ file=node-bck,
+%D version=2009.06.08,
+%D title=\CONTEXT\ Node Macros,
+%D subtitle=Backgrounds,
+%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}{ConTeXt Node Support / Backgrounds}
+
+%D This is first attempt to replacing backgrounds in a few
+%D tables mechanisms.
+
+\unprotect
+
+\registerctxluafile{node-bck}{1.001}
+
+%D Box helpers:
+
+\def\doaddbackgroundtobox#1[#2]%
+ {\begingroup\faststartcolor[#2]%
+ \normalexpanded{\noexpand\faststopcolor\endgroup#1
+ attr \backgroundattribute \plusone
+ attr \colormodelattribute \the\attribute\colormodelattribute
+ attr \colorattribute \the\attribute\colorattribute
+ attr \transparencyattribute \the\attribute\transparencyattribute}}
+
+\def\backgroundvbox{\doaddbackgroundtobox\vbox}
+\def\backgroundvtop{\doaddbackgroundtobox\vtop}
+\def\backgroundhbox{\doaddbackgroundtobox\hbox}
+
+\def\colorattr#1%
+ {\ifcsname(cs:\currentpalet#1)\endcsname
+ \thecolorattr{\currentpalet#1}%
+ \else\ifcsname(cs:#1)\endcsname
+ \thecolorattr{#1}%
+ \fi\fi}
+
+\def\thecolorattr#1%
+ {attr \colormodelattribute \attribute\colormodelattribute
+ attr \colorattribute \csname(cs:#1)\endcsname
+ attr \transparencyattribute \csname(ts:#1)\endcsname}
+
+\def\backgroundcolorattr#1%
+ {\ifcsname(cs:\currentpalet#1)\endcsname
+ \thebackgroundcolorattr{\currentpalet#1}%
+ \else\ifcsname(cs:#1)\endcsname
+ \thebackgroundcolorattr{#1}%
+ \fi\fi}
+
+\def\thebackgroundcolorattr#1%
+ {attr \backgroundattribute \plusone
+ attr \colormodelattribute \attribute\colormodelattribute
+ attr \colorattribute \csname(cs:#1)\endcsname
+ attr \transparencyattribute \csname(ts:#1)\endcsname}
+
+% \def\backgroundvbox[#1]{\vbox \backgroundcolorattr{#1}}
+% \def\backgroundvtop[#1]{\vtop \backgroundcolorattr{#1}}
+% \def\backgroundhbox[#1]{\hbox \backgroundcolorattr{#1}}
+
+%D tabulate:
+
+\def\tabulatenormalcolumn#1%
+ {\doiffastoptionalcheckelse{\tabulatenormalcolumnyes#1}{\tabulatenormalcolumnnop#1}}
+
+\def\tabulatenormalcolumnnop#1% overloads anch-pgr
+ {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi&\global\chardef\tabulatetype#1&}
+
+\def\tabulatenormalcolumnyes#1[#2]%
+ {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi&\global\chardef\tabulatetype#1&%
+ \iftrialtypesetting\else\settabulatecolor{#2}\fi\ignorespaces}
+
+\newcount\maxtabularcolorcolumn
+
+\def\settabulatecolor#1% we could store the attributes at the cost of a lua call
+ {\begingroup
+ \global\settrue\tabulatehascolors
+ \ifnum\tabulatecolumn>\maxtabularcolorcolumn
+ \global\maxtabularcolorcolumn\tabulatecolumn
+ \fi
+ \setxvalue{\??tt:c:\the\tabulatecolumn}{#1}%
+ \attribute\backgroundattribute\plusone
+ \faststartcolor[#1]\strut\char0\faststopcolor
+ \endgroup}
+
+\def\repeatsettabulatecolor
+ {\begingroup
+ \ifcsname\??tt:c:\the\tabulatecolumn\endcsname
+ \attribute\backgroundattribute\plusone
+ \faststartcolor[\csname\??tt:c:\the\tabulatecolumn\endcsname]\strut\char0\faststopcolor
+ \fi
+ \endgroup}
+
+\def\resettabulatecolors
+ {\ifcase\maxtabularcolorcolumn\else
+ \doresettabulatecolors
+ \fi}
+
+\def\doresettabulatecolors
+ {\dorecurse\maxtabularcolorcolumn{\letgvalue{\??tt:c:\recurselevel}\undefined}} % slow
+
+\appendtoks
+ \resettabulatecolors
+\to \everyaftertabulaterow
+
+\def\splitofftabulatebox % overloads in anch-pgr
+ {\dontcomplain
+ \global\setbox\tabulatebox % % % global ? % % %
+ \vsplit\tablebox\tabulatecolumn to \lineheight
+ \setbox\tabulatebox\normalvbox
+ {\unvbox\tabulatebox}%
+ \setbox\tabulatebox\hbox to \wd\tabulatebox
+ {\iftrialtypesetting\else\ifconditional\tabulatehascolors\repeatsettabulatecolor\fi\fi
+ \hss\dotabulatehook{\box\tabulatebox}\hss}%
+ \ht\tabulatebox\strutht
+ \dp\tabulatebox\strutdp
+ \box\tabulatebox
+ \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
+
+\appendtoks
+ \global\setfalse\tabulatehascolors
+\to \everytabulate
+
+\protect \endinput
+
+% test
+
+\starttext
+
+\backgroundvbox[green] {\input tufte } \par
+\backgroundvbox[blue] {\input ward } \par
+\backgroundvbox[red] {\input knuth } \par
+\backgroundhbox[yellow]{\rotate[rotation=45]{hello world}} \par
+
+\starttabulate[||p||]
+\NC test \NC test \NC test \NC \NR
+\NC test \NC[green] \input tufte \NC[yellow] test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC[blue] test \NC[red] test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC[gray] test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC[blue] test \NC test \NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC test \NC[magenta] test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC[cyan] \dorecurse{10}{\input ward }\NC test \NC \NR
+\NC test \NC test \NC test \NC \NR
+\NC test \NC[yellow] test \NC test \NC \NR
+\stoptabulate
+
+\stoptext
diff --git a/tex/context/base/node-dir.lua b/tex/context/base/node-dir.lua
new file mode 100644
index 000000000..05e4835e5
--- /dev/null
+++ b/tex/context/base/node-dir.lua
@@ -0,0 +1,308 @@
+if not modules then modules = { } end modules ['node-mir'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Taco Hoekwater and Hans Hagen",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[
+<p>In the process of cleaning up the lua variant of the parbuilder
+we ran into a couple of functions (translated c macros) that were
+somewhat inefficient. More convenient is to use hashes although at
+the c-end still macros are used. In the process directions.h was
+adapted and now has the mappings as comments. This lua file is
+based on that file.
+]]--
+
+
+nodes = nodes or { }
+
+nodes.is_mirrored = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+}
+
+nodes.is_rotated = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ RTT = true, ["+RTT"] = true,
+}
+
+nodes.textdir_is_parallel = {
+ TLT = {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ TRT= {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ LTL = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ },
+ RTT = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ }
+}
+
+nodes.pardir_is_parallel = {
+ TLT = {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ TRT = {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ LTL = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ },
+ RTT = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ },
+}
+
+nodes.pardir_is_opposite = {
+ TLT = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ TRT = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ LTL = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ RTT = true, ["+RTT"] = true,
+ },
+ RTT = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ -- RTT = false,
+ },
+}
+
+nodes.textdir_is_opposite = {
+ TLT = {
+ -- TLT = false,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ TRT= {
+ TLT = true, ["+TLT"] = true,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ LTL = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ RTT = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+}
+
+nodes.glyphdir_is_opposite = {
+ TLT = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ TRT= {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ LTL = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ RTT = {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+}
+
+nodes.pardir_is_equal = {
+ TLT = {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ TRT= {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ LTL= {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ -- RTT = false,
+ },
+ RTT= {
+ -- TLT = false,
+ -- TRT = false,
+ -- LTL = false,
+ RTT = true, ["+RTT"] = true,
+ },
+}
+
+nodes.textdir_is_equal = {
+ TLT = {
+ TLT = true, ["+TLT"] = true,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ TRT= {
+ -- TLT = false,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ LTL = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ },
+ RTT = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ },
+}
+
+nodes.glyphdir_is_equal = {
+ TLT = {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ RTT = true, ["+RTT"] = true,
+ },
+ TRT= {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ RTT = true, ["+RTT"] = true,
+ },
+ LTL = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ -- RTT = false,
+ },
+ RTT = {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ RTT = true, ["+RTT"] = true,
+ },
+}
+
+nodes.partextdir_is_equal = {
+ TLT = {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ },
+ TRT= {
+ -- TLT = false,
+ -- TRT = false,
+ LTL = true, ["+LTL"] = true,
+ RTT = true, ["+RTT"] = true,
+ },
+ LTL = {
+ TLT = true, ["+TLT"] = true,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+ },
+ RTT = {
+ -- TLT = false,
+ TRT = true, ["+TRT"] = true,
+ -- LTL = false,
+ -- RTT = false,
+ },
+}
+
+nodes.textdir_is_is = {
+ TLT = true, ["+TLT"] = true,
+ -- TRT = false,
+ -- LTL = false,
+ -- RTT = false,
+}
+
+nodes.glyphdir_is_orthogonal = {
+ TLT = true, ["+TLT"] = true,
+ TRT = true, ["+TRT"] = true,
+ LTL = true, ["+LTL"] = true,
+ -- RTT = false
+}
+
+nodes.dir_is_pop = {
+ ["-TRT"] = true,
+ ["-TLT"] = true,
+ ["-LTL"] = true,
+ ["-RTT"] = true,
+}
+
+nodes.dir_negation = {
+ ["-TRT"] = "+TRT",
+ ["-TLT"] = "+TLT",
+ ["-LTL"] = "+LTL",
+ ["-RTT"] = "+RTT",
+ ["+TRT"] = "-TRT",
+ ["+TLT"] = "-TLT",
+ ["+LTL"] = "-LTL",
+ ["+RTT"] = "-RTT",
+}
diff --git a/tex/context/base/node-dum.lua b/tex/context/base/node-dum.lua
new file mode 100644
index 000000000..f39a0873f
--- /dev/null
+++ b/tex/context/base/node-dum.lua
@@ -0,0 +1,19 @@
+if not modules then modules = { } end modules ['node-dum'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+nodes = nodes or { }
+
+function nodes.simple_font_handler(head)
+-- lang.hyphenate(head)
+ head = nodes.process_characters(head)
+ nodes.inject_kerns(head)
+ nodes.protect_glyphs(head)
+ head = node.ligaturing(head)
+ head = node.kerning(head)
+ return head
+end
diff --git a/tex/context/base/node-ext.lua b/tex/context/base/node-ext.lua
new file mode 100644
index 000000000..5c4eec8de
--- /dev/null
+++ b/tex/context/base/node-ext.lua
@@ -0,0 +1,30 @@
+if not modules then modules = { } end modules ['node-ext'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Serializing nodes can be handy for tracing. Also, saving and
+loading node lists can come in handy as soon we are going to
+use external applications to process node lists.</p>
+--ldx]]--
+
+function nodes.show(stack)
+-- texio.write_nl(table.serialize(stack))
+end
+
+function nodes.save(stack,name) -- *.ltn : luatex node file
+-- if name then
+-- file.savedata(name,table.serialize(stack))
+-- else
+-- texio.write_nl('log',table.serialize(stack))
+-- end
+end
+
+function nodes.load(name)
+-- return file.loaddata(name)
+-- -- todo
+end
diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua
new file mode 100644
index 000000000..c6e3be448
--- /dev/null
+++ b/tex/context/base/node-fin.lua
@@ -0,0 +1,442 @@
+if not modules then modules = { } end modules ['node-fin'] = {
+ version = 1.001,
+ comment = "companion to node-fin.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this module is being reconstructed
+
+local next, type, format = next, type, string.format
+local texsprint = tex.sprint
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local rule = node.id('rule')
+local whatsit = node.id('whatsit')
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+
+local has_attribute = node.has_attribute
+local copy_node = node.copy
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+states = states or { }
+shipouts = shipouts or { }
+
+local numbers = attributes.numbers
+local trigger = attributes.private('trigger')
+local triggering = false
+
+-- these two will be like trackers
+
+function states.enabletriggering()
+ triggering = true
+end
+function states.disabletriggering()
+ triggering = false
+end
+
+-- the following code is no longer needed due to the new backend
+-- but we keep it around for a while as an example
+--
+-- states.collected = states.collected or { }
+--
+-- storage.register("states/collected", states.collected, "states.collected")
+--
+-- local collected = states.collected
+--
+-- function states.collect(str)
+-- collected[#collected+1] = str
+-- end
+--
+-- function states.flush()
+-- if #collected > 0 then
+-- for i=1,#collected do
+-- texsprint(ctxcatcodes,collected[i]) -- we're in context mode anyway
+-- end
+-- collected = { }
+-- states.collected = collected
+-- end
+-- end
+--
+-- function states.check()
+-- texio.write_nl(concat(collected,"\n"))
+-- end
+
+-- we used to do the main processor loop here and call processor for each node
+-- but eventually this was too much a slow down (1 sec on 23 for 120 pages mk)
+-- so that we moved looping to the processor itself; this may lead to a bit of
+-- duplicate code once that we have more state handlers
+
+local function process_attribute(head,plugin) -- head,attribute,enabled,initializer,resolver,processor,finalizer
+ local namespace = plugin.namespace
+ if namespace.enabled ~= false then -- this test will go away
+ starttiming(attributes)
+ local done, used, ok = false, nil, false
+ local attribute = namespace.attribute or numbers[plugin.name] -- todo: plugin.attribute
+ local processor = plugin.processor
+ if processor then
+ local initializer = plugin.initializer
+ local resolver = plugin.resolver
+ local inheritance = (resolver and resolver()) or nil -- -0x7FFFFFFF -- we can best use nil and skip !
+ if initializer then
+ initializer(namespace,attribute,head)
+ end
+ 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
+ head = flusher(namespace,attribute,head,used)
+ end
+ end
+ end
+ done = true
+ end
+ end
+ stoptiming(attributes)
+ return head, done
+ else
+ return head, false
+ end
+end
+
+nodes.process_attribute = process_attribute
+
+function nodes.install_attribute_handler(plugin) -- we need to avoid this nested function
+ return function(head)
+ return process_attribute(head,plugin)
+ end
+end
+
+--~ experiment (maybe local to function makes more sense)
+--~
+--~ plugindata = { }
+--~
+--~ local template = [[
+--~ local plugin = plugindata["%s"]
+--~ local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+--~ local namespace = plugin.namespace
+--~ local attribute = namespace.attribute
+--~ local processor = plugin.processor
+--~ local initializer = plugin.initializer
+--~ local resolver = plugin.resolver
+--~ local finalizer = plugin.finalizer
+--~ local flusher = plugin.flusher
+--~ return function (head)
+--~ if namespace.enabled then
+--~ starttiming(attributes)
+--~ local done, used, ok = false, nil, false
+--~ if procesxsor then
+--~ local inheritance = (resolver and resolver()) or nil -- -0x7FFFFFFF -- we can best use nil and skip !
+--~ if initializer then
+--~ initializer(namespace,attribute,head)
+--~ end
+--~ head, ok = processor(namespace,attribute,head,inheritance)
+--~ if ok then
+--~ if finalizer then
+--~ head, ok, used = finalizer(namespace,attribute,head)
+--~ if used and flusher then
+--~ head = flusher(namespace,attribute,head,used)
+--~ end
+--~ end
+--~ done = true
+--~ end
+--~ end
+--~ stoptiming(attributes)
+--~ return head, done
+--~ else
+--~ return head, false
+--~ end
+--~ end
+--~ ]]
+--~
+--~ function nodes.install_attribute_handler(plugin) -- we need to avoid this nested function
+--~ plugindata[plugin.name] = plugin
+--~ local str = format(template,plugin.name)
+--~ return loadstring(str)()
+--~ end
+
+-- the injectors
+
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+
+local nsdata, nsdone, nsforced, nsselector, nstrigger
+local current, current_selector, done = 0, 0, false -- nb, stack has a local current !
+
+function states.initialize(namespace,attribute,head)
+ nsdata, nsnone = namespace.data, namespace.none
+ nsforced, nsselector, nslistwise = namespace.forced, namespace.selector, namespace.listwise
+ nstrigger = triggering and namespace.triggering and trigger
+ current, current_selector, done = 0, 0, false -- todo: done cleanup
+end
+
+function states.finalize(namespace,attribute,head) -- is this one ok?
+ if current > 0 and nsnone then
+ local id = head.id
+ if id == hlist or id == vlist then
+ local list = head.list
+ if list then
+ head.list = insert_node_before(list,list,copy_node(nsnone))
+ end
+ else
+ head = insert_node_before(head,head,copy_node(nsnone))
+ end
+ return head, true, true
+ end
+ return head, false, false
+end
+
+local function process(namespace,attribute,head,inheritance,default) -- one attribute
+ local stack, done = head, false
+ while stack do
+ local id = stack.id
+ -- we need to deal with literals too (reset as well as oval)
+ -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ local c = has_attribute(stack,attribute)
+ if c then
+ if default and c == inheritance then
+ if current ~= default then
+ head = insert_node_before(head,stack,copy_node(nsdata[default]))
+ current, done = default, true
+ end
+ elseif current ~= c then
+ head = insert_node_before(head,stack,copy_node(nsdata[c]))
+ current, done = c, true
+ end
+ -- here ? compare selective
+ if id == glue then --leader
+ -- same as *list
+ local content = stack.leader
+ if content then
+ local savedcurrent = current
+ local ci = content.id
+ if ci == hlist or ci == vlist then
+ -- else we reset inside a box unneeded, okay, the downside is
+ -- that we trigger color in each repeated box, so there is room
+ -- for improvement here
+ current = 0
+ end
+ local ok = false
+ if nstrigger and has_attribute(stack,nstrigger) then
+ local outer = has_attribute(stack,attribute)
+ if outer ~= inheritance then
+ stack.leader, ok = process(namespace,attribute,content,inheritance,outer)
+ else
+ stack.leader, ok = process(namespace,attribute,content,inheritance,default)
+ end
+ else
+ stack.leader, ok = process(namespace,attribute,content,inheritance,default)
+ end
+ current = savedcurrent
+ done = done or ok
+ end
+ end
+ elseif default and inheritance then
+ if current ~= default then
+ head = insert_node_before(head,stack,copy_node(nsdata[default]))
+ current, done = default, true
+ end
+ elseif current > 0 then
+ head = insert_node_before(head,stack,copy_node(nsnone))
+ current, done = 0, true
+ end
+ elseif id == hlist or id == vlist then
+ local content = stack.list
+ if content then
+ local ok = false
+ if nstrigger and has_attribute(stack,nstrigger) then
+ local outer = has_attribute(stack,attribute)
+ if outer ~= inheritance then
+ stack.list, ok = process(namespace,attribute,content,inheritance,outer)
+ else
+ stack.list, ok = process(namespace,attribute,content,inheritance,default)
+ end
+ else
+ stack.list, ok = process(namespace,attribute,content,inheritance,default)
+ end
+ done = done or ok
+ end
+ end
+ stack = stack.next
+ end
+ return head, done
+end
+
+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 stack, done = head, false
+ while stack do
+ local id = stack.id
+ -- we need to deal with literals too (reset as well as oval)
+ -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ local c = has_attribute(stack,attribute)
+ if c then
+ if default and c == inheritance then
+ if current ~= default then
+ local data = nsdata[default]
+ head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
+ current, done = default, true
+ end
+ else
+ local s = has_attribute(stack,nsselector)
+ if current ~= c or current_selector ~= s then
+ local data = nsdata[c]
+ head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
+ current, current_selector, done = c, s, true
+ end
+ end
+ elseif default and inheritance then
+ if current ~= default then
+ local data = nsdata[default]
+ head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
+ current, done = default, true
+ end
+ elseif current > 0 then
+ head = insert_node_before(head,stack,copy_node(nsnone))
+ current, current_selector, done = 0, 0, true
+ end
+ if id == glue then -- leader
+ -- same as *list
+ local content = stack.leader
+ if content then
+ local savedcurrent = current
+ local ci = content.id
+ if ci == hlist or ci == vlist then
+ -- else we reset inside a box unneeded, okay, the downside is
+ -- that we trigger color in each repeated box, so there is room
+ -- for improvement here
+ current = 0
+ end
+ local ok = false
+ if nstrigger and has_attribute(stack,nstrigger) then
+ local outer = has_attribute(stack,attribute)
+ if outer ~= inheritance then
+ stack.leader, ok = selective(namespace,attribute,content,inheritance,outer)
+ else
+ stack.leader, ok = selective(namespace,attribute,content,inheritance,default)
+ end
+ else
+ stack.leader, ok = selective(namespace,attribute,content,inheritance,default)
+ end
+ current = savedcurrent
+ done = done or ok
+ end
+ end
+ elseif id == hlist or id == vlist then
+ local content = stack.list
+ if content then
+ local ok = false
+ if nstrigger and has_attribute(stack,nstrigger) then
+ local outer = has_attribute(stack,attribute)
+ if outer ~= inheritance then
+ stack.list, ok = selective(namespace,attribute,content,inheritance,outer)
+ else
+ stack.list, ok = selective(namespace,attribute,content,inheritance,default)
+ end
+ else
+ stack.list, ok = selective(namespace,attribute,content,inheritance,default)
+ end
+ done = done or ok
+ end
+ end
+ stack = stack.next
+ end
+ return head, done
+end
+
+states.selective = selective
+
+-- Ideally the next one should be merged with the previous but keeping it separate is
+-- safer. We deal with two situations: efficient boxwise (layoutareas) and mixed layers
+-- (as used in the stepper). In the stepper we cannot use the box branch as it involves
+-- paragraph lines and then getsmixed up. A messy business (esp since we want to be
+-- efficient).
+
+local function stacked(namespace,attribute,head,default) -- no triggering, no inheritance, but list-wise
+ local stack, done = head, false
+ local current, depth = default or 0, 0
+ while stack do
+ local id = stack.id
+ if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ local c = has_attribute(stack,attribute)
+ if c then
+ if current ~= c then
+ head = insert_node_before(head,stack,copy_node(nsdata[c]))
+ depth = depth + 1
+ current, done = c, true
+ end
+ if id == glue then
+ local content = stack.leader
+ if content then -- unchecked
+ local ok = false
+ stack.leader, ok = stacked(namespace,attribute,content,current)
+ done = done or ok
+ end
+ end
+ elseif default then
+ --
+ elseif current > 0 then
+ head = insert_node_before(head,stack,copy_node(nsnone))
+ depth = depth - 1
+ current, done = 0, true
+ end
+ elseif id == hlist or id == vlist then
+ local content = stack.list
+ if content then
+ -- the problem is that broken lines gets the attribute which can be a later one
+ if nslistwise then
+ local c = has_attribute(stack,attribute)
+ if c and current ~= c and nslistwise[c] then -- viewerlayer
+ local p = current
+ current, done = c, true
+ head = insert_node_before(head,stack,copy_node(nsdata[c]))
+ stack.list = stacked(namespace,attribute,content,current)
+ head, stack = insert_node_after(head,stack,copy_node(nsnone))
+ current = p
+ else
+ local ok = false
+ stack.list, ok = stacked(namespace,attribute,content,current)
+ done = done or ok
+ end
+ else
+ local ok = false
+ stack.list, ok = stacked(namespace,attribute,content,current)
+ done = done or ok
+ end
+ end
+ end
+ stack = stack.next
+ end
+ while depth > 0 do
+ head = insert_node_after(head,stack,copy_node(nsnone))
+ depth = depth -1
+ end
+ return head, done
+end
+
+states.stacked = stacked
+
+-- -- --
+
+statistics.register("attribute processing time", function()
+ return statistics.elapsedseconds(attributes,"front- and backend")
+end)
diff --git a/tex/context/base/node-fin.mkiv b/tex/context/base/node-fin.mkiv
new file mode 100644
index 000000000..ea9e83f16
--- /dev/null
+++ b/tex/context/base/node-fin.mkiv
@@ -0,0 +1,74 @@
+%D \module
+%D [ file=attr-ini,
+%D version=2007.06.06, % probably a bit older
+%D title=\CONTEXT\ Node Macros,
+%D subtitle=Finalizing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Node Support / Finalizing}
+
+% Objects are processed indepently \unknown\ actually we may
+% need a proper callback.
+
+\unprotect
+
+\registerctxluafile{node-fin}{1.001} % we might generalize this one
+
+\definesystemattribute[trigger] \chardef\triggerattribute \dogetattributeid{trigger} % feature inheritance
+
+\def\finalizeobjectbox #1{\ctxlua{nodes.process_page(tex.box[\number#1])}}
+\def\finalizeshipoutbox#1{\ctxlua{nodes.process_page(tex.box[\number#1])}}
+
+% tricky stuff:
+
+% THIS MIGHT BECOME OBSOLETE.
+
+\newcount\attributeboxcount
+
+\edef\startinheritattributes{\attribute\triggerattribute\plusone}
+\edef\stopinheritattributes {\attribute\triggerattribute\attributeunsetvalue}
+
+\def\doattributedcopy{\afterassignment\dodoattributedcopy\attributeboxcount}
+\def\doattributedbox {\afterassignment\dodoattributedbox \attributeboxcount}
+
+\def\dodoattributedcopy
+ {\startinheritattributes
+ \ifvbox\attributeboxcount
+ \vbox{\unvcopy\attributeboxcount}%
+ \else
+ \hbox{\unhcopy\attributeboxcount}%
+ \fi
+ \stopinheritattributes}
+
+\def\dodoattributedbox
+ {\startinheritattributes
+ \ifvbox\attributeboxcount
+ \vbox{\unvbox\attributeboxcount}%
+ \else
+ \hbox{\unhbox\attributeboxcount}%
+ \fi
+ \stopinheritattributes}
+
+\def\enableattributeinheritance
+ {\ctxlua{states.enabletriggering()}%
+ \let\attributedcopy\doattributedcopy
+ \let\attributedbox \doattributedbox}
+
+\def\disableattributeinheritance
+ {\ctxlua{states.disabletriggering()}%
+ \let\attributedcopy\copy
+ \let\attributedbox \box}
+
+\disableattributeinheritance
+
+% \appendtoks
+% \enableattributeinheritance % will become default
+% \to\everyjob
+
+\protect \endinput
diff --git a/tex/context/base/node-fnt.lua b/tex/context/base/node-fnt.lua
new file mode 100644
index 000000000..b0d073425
--- /dev/null
+++ b/tex/context/base/node-fnt.lua
@@ -0,0 +1,207 @@
+if not modules then modules = { } end modules ['node-fnt'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, type = next, type
+
+local trace_characters = false trackers.register("nodes.characters", function(v) trace_characters = v end)
+
+local glyph = node.id('glyph')
+
+local traverse_id = node.traverse_id
+local has_attribute = node.has_attribute
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+fonts = fonts or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+
+local fontdata = fonts.ids
+
+-- some tests with using an array of dynamics[id] and processes[id] demonstrated
+-- that there was nothing to gain (unless we also optimize other parts)
+--
+-- maybe getting rid of the intermediate shared can save some time
+
+-- potential speedup: check for subtype < 256 so that we can remove that test
+-- elsewhere, danger: injected nodes will not be dealt with but that does not
+-- happen often; we could consider processing sublists but that might need mor
+-- checking later on; the current approach also permits variants
+
+if tex.attribute[0] < 0 then
+
+ texio.write_nl("log","!")
+ texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
+ texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
+ texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.")
+ texio.write_nl("log","!")
+
+ tex.attribute[0] = 0 -- else no features
+
+end
+
+-- this will be redone and split in a generic one and a context one
+
+function nodes.process_characters(head)
+ -- either next or not, but definitely no already processed list
+ starttiming(nodes)
+ local usedfonts, attrfonts, done = { }, { }, false
+ local a, u, prevfont, prevattr = 0, 0, nil, 0
+ for n in traverse_id(glyph,head) do
+ local font, attr = n.font, has_attribute(n,0) -- zero attribute is reserved for fonts in context
+ if attr and attr > 0 then
+ if font ~= prevfont or attr ~= prevattr then
+ local used = attrfonts[font]
+ if not used then
+ used = { }
+ attrfonts[font] = used
+ end
+ if not used[attr] then
+ -- we do some testing outside the function
+ local tfmdata = fontdata[font]
+ local shared = tfmdata.shared
+ if shared then
+ local dynamics = shared.dynamics
+ if dynamics then
+ local d = shared.set_dynamics(font,dynamics,attr) -- still valid?
+ if d then
+ used[attr] = d
+ a = a + 1
+ end
+ end
+ end
+ end
+ prevfont, prevattr = font, attr
+ end
+ elseif font ~= prevfont then
+ prevfont, prevattr = font, 0
+ local used = usedfonts[font]
+ if not used then
+ local tfmdata = fontdata[font]
+ if tfmdata then
+ local shared = tfmdata.shared -- we need to check shared, only when same features
+ if shared then
+ local processors = shared.processes
+ if processors and #processors > 0 then
+ usedfonts[font] = processors
+ u = u + 1
+ end
+ end
+ else
+ -- probably nullfont
+ end
+ end
+ else
+ prevattr = attr
+ end
+ end
+ -- we could combine these and just make the attribute nil
+ if u == 1 then
+ local font, processors = next(usedfonts)
+ local n = #processors
+ if n > 0 then
+ local h, d = processors[1](head,font,false)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,false)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ elseif u > 0 then
+ for font, processors in next, usedfonts do
+ local n = #processors
+ local h, d = processors[1](head,font,false)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,false)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ end
+ if a == 1 then
+ local font, dynamics = next(attrfonts)
+ for attribute, processors in next, dynamics do -- attr can switch in between
+ local n = #processors
+ local h, d = processors[1](head,font,attribute)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,attribute)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ elseif a > 0 then
+ for font, dynamics in next, attrfonts do
+ for attribute, processors in next, dynamics do -- attr can switch in between
+ local n = #processors
+ local h, d = processors[1](head,font,attribute)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,attribute)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ end
+ end
+ stoptiming(nodes)
+ if trace_characters then
+ nodes.report(head,done)
+ end
+ return head, true
+end
+
+if node.protect_glyphs then
+
+ nodes.protect_glyphs = node.protect_glyphs
+ nodes.unprotect_glyphs = node.unprotect_glyphs
+
+else do
+
+ -- initial value subtype : X000 0001 = 1 = 0x01 = char
+ --
+ -- expected before linebreak : X000 0000 = 0 = 0x00 = glyph
+ -- X000 0010 = 2 = 0x02 = ligature
+ -- X000 0100 = 4 = 0x04 = ghost
+ -- X000 1010 = 10 = 0x0A = leftboundary lig
+ -- X001 0010 = 18 = 0x12 = rightboundary lig
+ -- X001 1010 = 26 = 0x1A = both boundaries lig
+ -- X000 1100 = 12 = 0x1C = leftghost
+ -- X001 0100 = 20 = 0x14 = rightghost
+
+ function nodes.protect_glyphs(head)
+ local done = false
+ for g in traverse_id(glyph,head) do
+ local s = g.subtype
+ if s == 1 then
+ done, g.subtype = true, 256
+ elseif s <= 256 then
+ done, g.subtype = true, 256 + s
+ end
+ end
+ return done
+ end
+
+ function nodes.unprotect_glyphs(head)
+ local done = false
+ for g in traverse_id(glyph,head) do
+ local s = g.subtype
+ if s > 256 then
+ done, g.subtype = true, s - 256
+ end
+ end
+ return done
+ end
+
+end end
diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua
new file mode 100644
index 000000000..36e240238
--- /dev/null
+++ b/tex/context/base/node-ini.lua
@@ -0,0 +1,244 @@
+if not modules then modules = { } end modules ['node-ini'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Most of the code that had accumulated here is now separated in
+modules.</p>
+--ldx]]--
+
+-- this module is being reconstructed
+
+local utf = unicode.utf8
+local next, type = next, type
+local format, concat, match, utfchar = string.format, table.concat, string.match, utf.char
+
+local chardata = characters and characters.data
+
+--[[ldx--
+<p>We start with a registration system for atributes so that we can use the
+symbolic names later on.</p>
+--ldx]]--
+
+attributes = attributes or { }
+
+attributes.names = attributes.names or { }
+attributes.numbers = attributes.numbers or { }
+attributes.list = attributes.list or { }
+attributes.unsetvalue = -0x7FFFFFFF
+
+storage.register("attributes/names", attributes.names, "attributes.names")
+storage.register("attributes/numbers", attributes.numbers, "attributes.numbers")
+storage.register("attributes/list", attributes.list, "attributes.list")
+
+local names, numbers, list = attributes.names, attributes.numbers, attributes.list
+
+function attributes.define(name,number) -- at the tex end
+ if not numbers[name] then
+ numbers[name], names[number], list[number] = number, name, { }
+ end
+end
+
+--[[ldx--
+<p>We can use the attributes in the range 127-255 (outside user space). These
+are only used when no attribute is set at the \TEX\ end which normally
+happens in <l n='context'/>.</p>
+--ldx]]--
+
+storage.shared.attributes_last_private = storage.shared.attributes_last_private or 127
+
+function attributes.private(name) -- at the lua end (hidden from user)
+ local number = numbers[name]
+ if not number then
+ local last = storage.shared.attributes_last_private or 127
+ if last < 255 then
+ last = last + 1
+ storage.shared.attributes_last_private = last
+ end
+ number = last
+ numbers[name], names[number], list[number] = number, name, { }
+ end
+ return number
+end
+
+--[[ldx--
+<p>Access to nodes is what gives <l n='luatex'/> its power. Here we
+implement a few helper functions. These functions are rather optimized.</p>
+--ldx]]--
+
+--[[ldx--
+<p>When manipulating node lists in <l n='context'/>, we will remove
+nodes and insert new ones. While node access was implemented, we did
+quite some experiments in order to find out if manipulating nodes
+in <l n='lua'/> was feasible from the perspective of performance.</p>
+
+<p>First of all, we noticed that the bottleneck is more with excessive
+callbacks (some gets called very often) and the conversion from and to
+<l n='tex'/>'s datastructures. However, at the <l n='lua'/> end, we
+found that inserting and deleting nodes in a table could become a
+bottleneck.</p>
+
+<p>This resulted in two special situations in passing nodes back to
+<l n='tex'/>: a table entry with value <type>false</type> is ignored,
+and when instead of a table <type>true</type> is returned, the
+original table is used.</p>
+
+<p>Insertion is handled (at least in <l n='context'/> as follows. When
+we need to insert a node at a certain position, we change the node at
+that position by a dummy node, tagged <type>inline</type> which itself
+has_attribute the original node and one or more new nodes. Before we pass
+back the list we collapse the list. Of course collapsing could be built
+into the <l n='tex'/> engine, but this is a not so natural extension.</p>
+
+<p>When we collapse (something that we only do when really needed), we
+also ignore the empty nodes. [This is obsolete!]</p>
+--ldx]]--
+
+nodes = nodes or { }
+
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local penalty = node.id('penalty')
+local kern = node.id('kern')
+local whatsit = node.id('whatsit')
+
+local traverse_id = node.traverse_id
+local traverse = node.traverse
+local free_node = node.free
+local remove_node = node.remove
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+
+function nodes.remove(head, current, free_too)
+ local t = current
+ head, current = remove_node(head,current)
+ if t then
+ if free_too then
+ free_node(t)
+ t = nil
+ else
+ t.next, t.prev = nil, nil
+ end
+ end
+ return head, current, t
+end
+
+function nodes.delete(head,current)
+ return nodes.remove(head,current,true)
+end
+
+nodes.before = insert_node_before
+nodes.after = insert_node_after
+
+-- we need to test this, as it might be fixed now
+
+function nodes.before(h,c,n)
+ if c then
+ if c == h then
+ n.next = h
+ n.prev = nil
+ h.prev = n
+ else
+ local cp = c.prev
+ n.next = c
+ n.prev = cp
+ if cp then
+ cp.next = n
+ end
+ c.prev = n
+ return h, n
+ end
+ end
+ return n, n
+end
+
+function nodes.after(h,c,n)
+ if c then
+ local cn = c.next
+ if cn then
+ n.next = cn
+ cn.prev = n
+ else
+ n.next = nil
+ end
+ c.next = n
+ n.prev = c
+ return h, n
+ end
+ return n, n
+end
+
+-- local h, c = nodes.replace(head,current,new)
+-- local c = nodes.replace(false,current,new)
+-- local c = nodes.replace(current,new)
+
+function nodes.replace(head,current,new) -- no head returned if false
+ if not new then
+ head, current, new = false, head, current
+ end
+ local prev, next = current.prev, current.next
+ if next then
+ new.next, next.prev = next, new
+ end
+ if prev then
+ new.prev, prev.next = prev, new
+ end
+ if head then
+ if head == current then
+ head = new
+ end
+ free_node(current)
+ return head, new
+ else
+ free_node(current)
+ return new
+ end
+end
+
+-- will move
+
+local function count(stack,flat)
+ local n = 0
+ while stack do
+ local id = stack.id
+ if not flat and id == hlist or id == vlist then
+ local list = stack.list
+ if list then
+ n = n + 1 + count(list) -- self counts too
+ else
+ n = n + 1
+ end
+ else
+ n = n + 1
+ end
+ stack = stack.next
+ end
+ return n
+end
+
+nodes.count = count
+
+-- new, will move
+
+function attributes.ofnode(n)
+ local a = n.attr
+ if a then
+ local names = attributes.names
+ a = a.next
+ while a do
+ local number, value = a.number, a.value
+ texio.write_nl(format("%s : attribute %3i, value %4i, name %s",tostring(n),number,value,names[number] or '?'))
+ a = a.next
+ end
+ end
+end
+
+local left, space = lpeg.P("<"), lpeg.P(" ")
+
+nodes.filterkey = left * (1-left)^0 * left * space^0 * lpeg.C((1-space)^0)
diff --git a/tex/context/base/node-ini.mkiv b/tex/context/base/node-ini.mkiv
new file mode 100644
index 000000000..787259316
--- /dev/null
+++ b/tex/context/base/node-ini.mkiv
@@ -0,0 +1,90 @@
+%D \module
+%D [ file=node-ini,
+%D version=2006.08.20,
+%D title=\CONTEXT\ Node Macros,
+%D subtitle=Initialization,
+%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}{ConTeXt Node Support / Initialization}
+
+\unprotect
+
+\newcount\filterstate \filterstate\plusone
+
+\registerctxluafile{node-ini}{1.001}
+\registerctxluafile{node-dir}{1.001}
+\registerctxluafile{node-aux}{1.001}
+\registerctxluafile{node-tst}{1.001}
+\registerctxluafile{node-tra}{1.001} % we might split it off (module)
+\registerctxluafile{node-seq}{1.001} % we might generalize this one
+\registerctxluafile{node-tsk}{1.001}
+\registerctxluafile{node-tex}{1.001}
+\registerctxluafile{node-res}{1.001}
+\registerctxluafile{node-pro}{1.001}
+\registerctxluafile{node-shp}{1.001}
+\registerctxluafile{node-ser}{1.001}
+\registerctxluafile{node-ext}{1.001}
+\registerctxluafile{node-inj}{1.001} % we might split it off
+\registerctxluafile{node-typ}{1.001} % experimental
+
+\newtoks \attributesresetlist
+
+\ifdefined \v!global \else \def\v!global{global} \fi % for metatex
+
+\unexpanded\def\defineattribute
+ {\dodoubleempty\dodefineattribute}
+
+\def\dodefineattribute[#1][#2]% alternatively we can let lua do the housekeeping
+ {\expandafter\newattribute\csname @attr@#1\endcsname
+ \expandafter \xdef\csname :attr:#1\endcsname{\number\lastallocatedattribute}%
+ \ctxlua{attributes.define("#1",\number\lastallocatedattribute)}%
+ %\writestatus\m!systems{defining attribute #1 with number \number\lastallocatedattribute}%
+ \doifnotinset\v!global{#2}{\appendetoks\csname @attr@#1\endcsname\attributeunsetvalue\to\attributesresetlist}}
+
+\unexpanded\def\definesystemattribute
+ {\dodoubleempty\dodefinesystemattribute}
+
+\def\dodefinesystemattribute[#1][#2]% alternatively we can let lua do the housekeeping
+ {\scratchcounter\ctxlua{tex.print(attributes.private("#1"))}\relax
+ \global\expandafter\attributedef\csname @attr@#1\endcsname\scratchcounter
+ \expandafter \xdef\csname :attr:#1\endcsname{\number\scratchcounter}%
+ %\writestatus\m!systems{defining system attribute #1 with number \number\scratchcounter}%
+ \doifnotinset\v!global{#2}{\appendetoks\csname @attr@#1\endcsname\attributeunsetvalue\to\attributesresetlist}}
+
+% expandable so we can \edef them for speed
+
+\def\dosetattribute#1#2{\csname @attr@#1\endcsname#2\relax}
+\def\doresetattribute#1{\csname @attr@#1\endcsname\attributeunsetvalue}
+\def\dogetattribute #1{\number\csname @attr@#1\endcsname}
+\def\dogetattributeid#1{\csname :attr:#1\endcsname}
+
+\let\dompattribute\gobbletwoarguments
+
+\def\resetallattributes{\the\attributesresetlist}
+
+\newcount\shownodescounter
+
+\def\shownextnodes {\afterassignment\doshownodes\shownextnodescounter}
+\def\showflatnodes {\afterassignment\doshownodes\showflatnodescounter}
+\def\doshownextnodes {\ctxlua{texio.write_nl('log',nodes.serializebox(\number\shownodescounter,false,true))}}
+\def\doshowflatnodes {\ctxlua{texio.write_nl('log',nodes.serializebox(\number\shownodescounter,true, true))}}
+\def\visualizenextnodes{\dowithnextbox{\ctxlua{nodes.visualizebox(\number\nextbox,false,true)}}}
+\def\visualizeflatnodes{\dowithnextbox{\ctxlua{nodes.visualizebox(\number\nextbox,true,true)}}}
+
+\unexpanded\def\starttracingnodes[#1]{\ctxlua{nodes.tracers.characters.start("#1")}}
+\unexpanded\def\stoptracingnodes {\ctxlua{nodes.tracers.characters.stop()}}
+
+% \starttext
+% \starttracingnodes[characters]
+% \input tufte \par
+% \input tufte \par
+% \stoptracingnodes
+% \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/node-inj.lua b/tex/context/base/node-inj.lua
new file mode 100644
index 000000000..9c4612a22
--- /dev/null
+++ b/tex/context/base/node-inj.lua
@@ -0,0 +1,466 @@
+if not modules then modules = { } end modules ['node-inj'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini)
+
+-- This is very experimental (this will change when we have luatex > .50 and
+-- a few pending thingies are available. Also, Idris needs to make a few more
+-- test fonts. Btw, future versions of luatex will have extended glyph properties
+-- that can be of help.
+
+local next = next
+
+local trace_injections = false trackers.register("nodes.injections", function(v) trace_injections = v end)
+
+fonts = fonts or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+
+local fontdata = fonts.ids
+
+local glyph = node.id('glyph')
+local kern = node.id('kern')
+
+local traverse_id = node.traverse_id
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+
+local newkern = nodes.kern
+
+local markbase = attributes.private('markbase')
+local markmark = attributes.private('markmark')
+local markdone = attributes.private('markdone')
+local cursbase = attributes.private('cursbase')
+local curscurs = attributes.private('curscurs')
+local cursdone = attributes.private('cursdone')
+local kernpair = attributes.private('kernpair')
+
+local cursives = { }
+local marks = { }
+local kerns = { }
+
+-- currently we do gpos/kern in a bit inofficial way but when we
+-- have the extra fields in glyphnodes to manipulate ht/dp/wd
+-- explicitly i will provide an alternative; also, we can share
+-- tables
+
+-- for the moment we pass the r2l key ... volt/arabtype tests
+
+function nodes.set_cursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
+ local dx, dy = factor*(exit[1]-entry[1]), factor*(exit[2]-entry[2])
+ local ws, wn = tfmstart.width, tfmnext.width
+ local bound = #cursives + 1
+ set_attribute(start,cursbase,bound)
+ set_attribute(nxt,curscurs,bound)
+ cursives[bound] = { rlmode, dx, dy, ws, wn }
+ return dx, dy, bound
+end
+
+function nodes.set_pair(current,factor,rlmode,r2lflag,spec,tfmchr)
+ local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4]
+ -- dy = y - h
+ if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then
+ local bound = has_attribute(current,kernpair)
+ if bound then
+ local kb = kerns[bound]
+ -- inefficient but singles have less, but weird anyway, needs checking
+ kb[2], kb[3], kb[4], kb[5] = (kb[2] or 0) + x, (kb[3] or 0) + y, (kb[4] or 0)+ w, (kb[5] or 0) + h
+ else
+ bound = #kerns + 1
+ set_attribute(current,kernpair,bound)
+ kerns[bound] = { rlmode, x, y, w, h, r2lflag, tfmchr.width }
+ end
+ return x, y, w, h, bound
+ end
+ return x, y, w, h -- no bound
+end
+
+function nodes.set_kern(current,factor,rlmode,x,tfmchr)
+ local dx = factor*x
+ if dx ~= 0 then
+ local bound = #kerns + 1
+ set_attribute(current,kernpair,bound)
+ kerns[bound] = { rlmode, dx }
+ end
+ return dx, bound
+end
+
+function nodes.set_mark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, ma=markanchor
+ local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2])
+ local bound = has_attribute(base,markbase)
+ if bound then
+ local mb = marks[bound]
+ if mb then
+ if not index then index = #mb + 1 end
+ mb[index] = { dx, dy }
+ set_attribute(start,markmark,bound)
+ set_attribute(start,markdone,index)
+ return dx, dy, bound
+ else
+ logs.report("nodes mark", "possible problem, U+%04X is base without data (id: %s)",base.char,bound)
+ end
+ end
+ index = index or 1
+ bound = #marks + 1
+ set_attribute(base,markbase,bound)
+ set_attribute(start,markmark,bound)
+ set_attribute(start,markdone,index)
+ marks[bound] = { [index] = { dx, dy } }
+ return dx, dy, bound
+end
+
+function nodes.trace_injection(head)
+ local function dir(n)
+ return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or ("unset")
+ end
+ local function report(...)
+ logs.report("nodes finisher",...)
+ end
+ report("begin run")
+ for n in traverse_id(glyph,head) do
+ if n.subtype < 256 then
+ local kp = has_attribute(n,kernpair)
+ local mb = has_attribute(n,markbase)
+ local mm = has_attribute(n,markmark)
+ local md = has_attribute(n,markdone)
+ local cb = has_attribute(n,cursbase)
+ local cc = has_attribute(n,curscurs)
+ report("char U+%05X, font=%s",n.char,n.font)
+ if kp then
+ local k = kerns[kp]
+ if k[3] then
+ report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?")
+ else
+ report(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?")
+ end
+ end
+ if mb then
+ report(" markbase: bound=%s",mb)
+ end
+ if mm then
+ local m = marks[mm]
+ if mb then
+ local m = m[mb]
+ if m then
+ report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?")
+ else
+ report(" markmark: bound=%s, missing index",mm)
+ end
+ else
+ m = m[1]
+ report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?")
+ end
+ end
+ if cb then
+ report(" cursbase: bound=%s",cb)
+ end
+ if cc then
+ local c = cursives[cc]
+ report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?")
+ end
+ end
+ end
+ report("end run")
+end
+
+-- todo: reuse tables (i.e. no collection), but will be extra fields anyway
+
+function nodes.inject_kerns(head,where,keep)
+ local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns)
+ if has_marks or has_cursives then
+--~ if has_marks or has_cursives or has_kerns then
+ if trace_injections then
+ nodes.trace_injection(head)
+ end
+ -- in the future variant we will not copy items but refs to tables
+ local done, ky, rl, valid, cx, wx, mk = false, { }, { }, { }, { }, { }, { }
+ if has_kerns then -- move outside loop
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph,head) do
+ if n.subtype < 256 then
+ valid[#valid+1] = n
+ if n.font ~= nf then
+ nf = n.font
+ tm = fontdata[nf].marks
+ end
+ mk[n] = tm[n.char]
+ local k = has_attribute(n,kernpair)
+ if k then
+ local kk = kerns[k]
+ if kk then
+ local x, y, w, h = kk[2] or 0, kk[3] or 0, kk[4] or 0, kk[5] or 0
+ local dy = y - h
+ if dy ~= 0 then
+ ky[n] = dy
+ end
+ if w ~= 0 or x ~= 0 then
+ wx[n] = kk
+ end
+ rl[n] = kk[1] -- could move in test
+ end
+ end
+ end
+ end
+ else
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph,head) do
+ if n.subtype < 256 then
+ valid[#valid+1] = n
+ if n.font ~= nf then
+ nf = n.font
+ tm = fontdata[nf].marks
+ end
+ mk[n] = tm[n.char]
+ end
+ end
+ end
+ if #valid > 0 then
+ -- we can assume done == true because we have cursives and marks
+ local cx = { }
+ if has_kerns and next(ky) then
+ for n, k in next, ky do
+ n.yoffset = k
+ end
+ end
+ -- todo: reuse t and use maxt
+ if has_cursives then
+ local p_cursbase, p = nil, nil
+ -- since we need valid[n+1] we can also use a "while true do"
+ local t, d, maxt = { }, { }, 0
+ for i=1,#valid do -- valid == glyphs
+ local n = valid[i]
+ if not mk[n] then
+ local n_cursbase = has_attribute(n,cursbase)
+ if p_cursbase then
+ local n_curscurs = has_attribute(n,curscurs)
+ if p_cursbase == n_curscurs then
+ local c = cursives[n_curscurs]
+ if c then
+ local rlmode, dx, dy, ws, wn = c[1], c[2], c[3], c[4], c[5]
+ if rlmode >= 0 then
+ dx = dx - ws
+ else
+ dx = dx + wn
+ end
+ if dx ~= 0 then
+ cx[n] = dx
+ rl[n] = rlmode
+ end
+ -- if rlmode and rlmode < 0 then
+ dy = -dy
+ -- end
+ maxt = maxt + 1
+ t[maxt] = p
+ d[maxt] = dy
+ else
+ maxt = 0
+ end
+ end
+ elseif maxt > 0 then
+ local ny = n.yoffset
+ for i=maxt,1,-1 do
+ ny = ny + d[i]
+ local ti = t[i]
+ ti.yoffset = ti.yoffset + ny
+ end
+ maxt = 0
+ end
+ if not n_cursbase and maxt > 0 then
+ local ny = n.yoffset
+ for i=maxt,1,-1 do
+ ny = ny + d[i]
+ local ti = t[i]
+ ti.yoffset = ny
+ end
+ maxt = 0
+ end
+ p_cursbase, p = n_cursbase, n
+ end
+ end
+ if maxt > 0 then
+ local ny = n.yoffset
+ for i=maxt,1,-1 do
+ ny = ny + d[i]
+ local ti = t[i]
+ ti.yoffset = ny
+ end
+ maxt = 0
+ end
+ if not keep then
+ cursives = { }
+ end
+ end
+ if has_marks then
+ for i=1,#valid do
+ local p = valid[i]
+ local p_markbase = has_attribute(p,markbase)
+ if p_markbase then
+ local mrks = marks[p_markbase]
+ for n in traverse_id(glyph,p.next) do
+ local n_markmark = has_attribute(n,markmark)
+ if p_markbase == n_markmark then
+ local index = has_attribute(n,markdone) or 1
+ local d = mrks[index]
+ if d then
+ -- local rlmode = d[3] -- not used
+ -- if rlmode and rlmode > 0 then
+ -- todo
+ -- else
+ local k = wx[p]
+ if k then
+ n.xoffset = p.xoffset - d[1] - k[2]
+ else
+ n.xoffset = p.xoffset - d[1]
+ end
+ -- end
+ if mk[p] then
+ n.yoffset = p.yoffset + d[2]
+ else
+ n.yoffset = n.yoffset + p.yoffset + d[2]
+ end
+ end
+ else
+ break
+ end
+ end
+ end
+ end
+ if not keep then
+ marks = { }
+ end
+ end
+ -- todo : combine
+ if next(wx) then
+ for n, k in next, wx do
+ -- only w can be nil, can be sped up when w == nil
+ local rl, x, w, r2l = k[1], k[2] or 0, k[4] or 0, k[6]
+ local wx = w - x
+--~ if rl < 0 then
+--~ if r2l then
+--~ if wx ~= 0 then
+--~ insert_node_before(head,n,newkern(wx))
+--~ end
+--~ if x ~= 0 then
+--~ insert_node_after (head,n,newkern(x))
+--~ end
+--~ else
+--~ if x ~= 0 then
+--~ insert_node_before(head,n,newkern(x))
+--~ end
+--~ if wx ~= 0 then
+--~ insert_node_after(head,n,newkern(wx))
+--~ end
+--~ end
+--~ else
+ if r2l then
+ if wx ~= 0 then
+ insert_node_before(head,n,newkern(wx))
+ end
+ if x ~= 0 then
+ insert_node_after (head,n,newkern(x))
+ end
+ else
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
+ if wx ~= 0 then
+ insert_node_after(head,n,newkern(wx))
+ end
+ end
+--~ end
+ end
+ end
+ if next(cx) then
+ for n, k in next, cx do
+ if k ~= 0 then
+ local rln = rl[n]
+ if rln and rln < 0 then
+ insert_node_before(head,n,newkern(-k))
+ else
+ insert_node_before(head,n,newkern(k))
+ end
+ end
+ end
+ end
+ if not keep then
+ kerns = { }
+ end
+ return head, true
+ elseif not keep then
+ kerns, cursives, marks = { }, { }, { }
+ end
+ elseif has_kerns then
+ if trace_injections then
+ nodes.trace_injection(head)
+ end
+ for n in traverse_id(glyph,head) do
+ local k = has_attribute(n,kernpair)
+ if k then
+ local kk = kerns[k]
+ if kk then
+ local rl, x, y, w = kk[1], kk[2] or 0, kk[3], kk[4]
+ if y and y ~= 0 then
+ n.yoffset = y -- todo: h ?
+ end
+ if w then
+ -- copied from above
+ local r2l = kk[6]
+ local wx = w - x
+--~ if rl < 0 then
+--~ if r2l then
+--~ if x ~= 0 then
+--~ insert_node_before(head,n,newkern(x))
+--~ end
+--~ if wx ~= 0 then
+--~ insert_node_after(head,n,newkern(wx))
+--~ end
+--~ else
+--~ if wx ~= 0 then
+--~ insert_node_before(head,n,newkern(wx))
+--~ end
+--~ if x ~= 0 then
+--~ insert_node_after (head,n,newkern(x))
+--~ end
+--~ end
+--~ else
+ if r2l then
+ if wx ~= 0 then
+ insert_node_before(head,n,newkern(wx))
+ end
+ if x ~= 0 then
+ insert_node_after (head,n,newkern(x))
+ end
+ else
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
+ if wx ~= 0 then
+ insert_node_after(head,n,newkern(wx))
+ end
+ end
+--~ end
+ else
+ -- simple (e.g. kernclass kerns)
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
+ end
+ end
+ end
+ end
+ if not keep then
+ kerns = { }
+ end
+ return head, true
+ else
+ -- no tracing needed
+ end
+ return head, false
+end
diff --git a/tex/context/base/node-mig.lua b/tex/context/base/node-mig.lua
new file mode 100644
index 000000000..f9f0ad231
--- /dev/null
+++ b/tex/context/base/node-mig.lua
@@ -0,0 +1,120 @@
+if not modules then modules = { } end modules ['node-mig'] = {
+ version = 1.001,
+ comment = "companion to node-mig.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+local insert = node.id('ins')
+local mark = node.id('mark')
+
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local remove_nodes = nodes.remove
+
+local migrated = attributes.private("migrated")
+
+local trace_migrations = false
+
+trackers.register("nodes.migrations", function(v) trace_migrations = v end)
+
+local migrate_inserts, migrate_marks
+
+local t_inserts, t_marks, t_sweeps = 0, 0, 0
+
+local function locate(head,first,last,ni,nm)
+ local current = head
+ while current do
+ local id = current.id
+ if id == vlist or id == hlist then
+ current.list, first, last, ni, nm = locate(current.list,first,last,ni,nm)
+ current= current.next
+ elseif migrate_inserts and id == insert then
+ local insert
+ head, current, insert = remove_nodes(head,current)
+ insert.next = nil
+ if first then
+ insert.prev, last.next = last, insert
+ else
+ insert.prev, first = nil, insert
+ end
+ last, ni = insert, ni + 1
+ elseif migrate_marks and id == mark then
+ local mark
+ head, current, mark = remove_nodes(head,current)
+ mark.next = nil
+ if first then
+ mark.prev, last.next = last, mark
+ else
+ mark.prev, first = nil, mark
+ end
+ last, nm = mark, nm + 1
+ else
+ current= current.next
+ end
+ end
+ return head, first, last, ni, nm
+end
+
+function nodes.migrate_outwards(head,where)
+ local done = false
+ if head then
+ local current = head
+ while current do
+ local id = current.id
+ if id == vlist or id == hlist and not has_attribute(current,migrated) then
+ set_attribute(current,migrated,1)
+ t_sweeps = t_sweeps + 1
+ local h = current.list
+ local first, last, ni, nm
+ while h do
+ local id = h.id
+ if id == vlist or id == hlist then
+ h, first, last, ni, nm = locate(h,first,last,0,0)
+ end
+ h = h.next
+ end
+ if first then
+ t_inserts, t_marks = t_inserts + ni, t_marks + nm
+ if trace_migrations and (ni > 0 or nm > 0) then
+ logs.report("nodes","sweep %s, %s inserts and %s marks migrated outwards",t_sweeps,ni,nm)
+ end
+ -- inserts after head
+ local n = current.next
+ if n then
+ last.next, n.prev = n, last
+ end
+ current.next, first.prev = first, current
+ done, current = true, last
+ end
+ end
+ current = current.next
+ end
+ return head, done
+ end
+end
+
+experiments.register("marks.migrate", function(v)
+ if v then
+ tasks.enableaction("mvlbuilders", "nodes.migrate_outwards")
+ end
+ migrate_marks = v
+end)
+
+experiments.register("inserts.migrate", function(v)
+ if v then
+ tasks.enableaction("mvlbuilders", "nodes.migrate_outwards")
+ end
+ migrate_inserts = v
+end)
+
+statistics.register("node migrations", function()
+ if trace_migrations and t_sweeps > 0 then
+ return format("%s sweeps, %s inserts moved, %s marks moved",t_sweeps,t_inserts,t_marks)
+ end
+end)
diff --git a/tex/context/base/node-mig.mkiv b/tex/context/base/node-mig.mkiv
new file mode 100644
index 000000000..cd731b96f
--- /dev/null
+++ b/tex/context/base/node-mig.mkiv
@@ -0,0 +1,60 @@
+%D \module
+%D [ file=node-mig,
+%D version=2010.01.19,
+%D title=\CONTEXT\ Node Macros,
+%D subtitle=Inserts,
+%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}{ConTeXt Node Support / Migrations}
+
+%D This is very experimental and although it is used in a
+%D real project it mostly serves a testbed for Taco and me so
+%D as prelude to extending the inserts mechanism.
+%D
+%D \starttyping
+%D \automigrateinserts
+%D
+%D \hbox{\vbox{x\footnote{1}x\footnote{2}x\footnote{3}x}}
+%D \vbox{x\footnote{4}x}
+%D \hbox{\vbox{x\footnote{5}x}}
+%D
+%D \hbox{x}
+%D \hbox{x\footnote{6}x}
+%D \hbox{x}
+%D
+%D \starttabulate
+%D \NC test \NC test \footnote{test} \input tufte \NC \NR
+%D \NC test \NC test \footnote{test} \input tufte \NC \NR
+%D \NC test \NC test \footnote{test} \input tufte \NC \NR
+%D \NC test \NC test \footnote{test} \input tufte \NC \NR
+%D \NC test \NC test \footnote{test} \input tufte \NC \NR
+%D \NC test \NC test \footnote{test} \input tufte \NC \NR
+%D \stoptabulate
+%D \stoptyping
+
+\unprotect
+
+\registerctxluafile{node-mig}{1.001}
+
+\newtoks \everyautomigratefootnotes
+\newtoks \everyautomigratemarks
+
+\def\automigrateinserts{\the\everyautomigratefootnotes}
+\def\automigratemarks {\the\everyautomigratemarks}
+
+\appendtoks
+ \let\postponenotes\relax
+ \enableexperiments[inserts.migrate]%
+\to \everyautomigratefootnotes
+
+\appendtoks
+ \enableexperiments[marks.migrate]%
+\to \everyautomigratemarks
+
+\protect
diff --git a/tex/context/base/node-pag.lua b/tex/context/base/node-pag.lua
new file mode 100644
index 000000000..4bc53c6dd
--- /dev/null
+++ b/tex/context/base/node-pag.lua
@@ -0,0 +1,30 @@
+if not modules then modules = { } end modules ['node-pag'] = {
+ version = 1.001,
+ comment = "companion to node-pag.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this callback might disappear and come back in the same way
+-- as par builders
+
+pagebuilders = pagebuilders or { }
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+local actions = tasks.actions("pagebuilders",5)
+
+local function processor(head,groupcode,size,packtype,maxdepth,direction)
+ starttiming(pagebuilders)
+ local _, done = actions(head,groupcode,size,packtype,maxdepth,direction)
+ stoptiming(pagebuilders)
+ return (done and head) or true
+-- return vpack(head)
+end
+
+--~ callbacks.register('pre_output_filter', processor, "preparing output box")
+
+--~ statistics.register("output preparation time", function()
+--~ return statistics.elapsedseconds(pagebuilders)
+--~ end)
diff --git a/tex/context/base/node-pag.mkiv b/tex/context/base/node-pag.mkiv
new file mode 100644
index 000000000..487901ad0
--- /dev/null
+++ b/tex/context/base/node-pag.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=node-pag,
+%D version=2008.09.30,
+%D title=\CONTEXT\ Node Macros,
+%D subtitle=Page Building,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Node Macros / Page Building}
+
+\unprotect
+
+\registerctxluafile{node-pag}{1.001}
+
+\protect \endinput
diff --git a/tex/context/base/node-par.lua b/tex/context/base/node-par.lua
new file mode 100644
index 000000000..7be7e7917
--- /dev/null
+++ b/tex/context/base/node-par.lua
@@ -0,0 +1,101 @@
+if not modules then modules = { } end modules ['node-par'] = {
+ version = 1.001,
+ comment = "companion to node-par.mkiv",
+ 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.numbers = parbuilders.numbers or { }
+parbuilders.attribute = attributes.numbers['parbuilder'] or 999
+
+storage.register("parbuilders.names", parbuilders.names, "parbuilders.names")
+storage.register("parbuilders.numbers", parbuilders.numbers, "parbuilders.numbers")
+
+local constructors, names, numbers, p_attribute = parbuilders.constructors, parbuilders.names, parbuilders.numbers, parbuilders.attribute
+
+local has_attribute = node.has_attribute
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+local mainconstructor = nil -- not stored in format
+
+function parbuilders.register(name,number)
+ parbuilders.names[number] = name
+ parbuilders.numbers[name] = number
+end
+
+function parbuilders.setmain(name)
+ mainconstructor = numbers[name]
+end
+
+-- return values:
+--
+-- true : tex will break itself
+-- false : idem but dangerous
+-- head : list of valid vmode nodes with last being hlist
+
+function parbuilders.constructor(head,followed_by_display)
+ if type(head) == "boolean" then
+ return head
+ else
+ local attribute = has_attribute(head,p_attribute) or mainconstructor
+ if attribute then
+ local constructor = names[attribute]
+ if constructor then
+ local handler = constructor and constructors[constructor]
+ if handler then
+ return handler(head,followed_by_display)
+ else
+ logs.report("parbuilders","handler '%s' is not defined",tostring(constructor))
+ return true -- let tex break
+ end
+ end
+ end
+ return true -- let tex break
+ end
+end
+
+-- just for testing
+
+function parbuilders.constructors.default(head,followed_by_display)
+ return true -- let tex break
+end
+
+-- also for testing (no surrounding spacing done)
+
+function parbuilders.constructors.oneline(head,followed_by_display)
+ return node.hpack(head)
+end
+
+-- It makes no sense to have a sequence here as we already have
+-- pre and post hooks and only one parbuilder makes sense, so no:
+--
+-- local actions = tasks.actions("parbuilders",1)
+
+-- todo: enable one as main
+
+local actions = parbuilders.constructor
+local enabled = false
+
+function parbuilders.enable () enabled = true end
+function parbuilders.disable() enabled = false end
+
+local function processor(head,followed_by_display)
+ if enabled then
+ starttiming(parbuilders)
+ local head = actions(head,followed_by_display)
+ stoptiming(parbuilders)
+ return head
+ else
+ return true -- let tex do the work
+ end
+end
+
+callbacks.register('linebreak_filter', processor, "breaking paragraps into lines")
+
+statistics.register("linebreak processing time", function()
+ return statistics.elapsedseconds(parbuilders)
+end)
diff --git a/tex/context/base/node-par.mkiv b/tex/context/base/node-par.mkiv
new file mode 100644
index 000000000..cb53e643d
--- /dev/null
+++ b/tex/context/base/node-par.mkiv
@@ -0,0 +1,78 @@
+%D \module
+%D [ file=node-par,
+%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 Node 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}
+
+\definesystemattribute[parbuilder] \chardef\parbuilderattribute \dogetattributeid{parbuilder}
+
+% todo auto-enable
+
+% management (enable/disable) is global and will move to lua
+
+\newcount\nofparbuilders
+
+\unexpanded\def\defineparbuilder[#1]%
+ {\global\advance\nofparbuilders\plusone
+ \ctxlua{parbuilders.register("#1",\number\nofparbuilders)}%
+ \setxvalue{\??ng:#1}{\attribute\parbuilderattribute\nofparbuilders}}
+
+\unexpanded\def\startparbuilder[#1]%
+ {\edef\@@currentparbuilder{\number\attribute\parbuilderattribute}%
+ \globalpushmacro\@@currentparbuilder
+ \getvalue{\??ng:#1}%
+ \checkparbuilders}
+
+\unexpanded\def\stopparbuilder
+ {\ifhmode\par\fi
+ \globalpopmacro\@@currentparbuilder
+ \attribute\parbuilderattribute\@@currentparbuilder\relax
+ \checkparbuilders}
+
+\def\setmainparbuilder[#1]%
+ {\ctxlua{parbuilders.setmain("#1")}}
+
+% 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
+\defineparbuilder[basic] % just for testing
+
+\def\enableparbuilders {\ctxlua{parbuilders.enable ()}}
+\def\disableparbuilders{\ctxlua{parbuilders.disable()}}
+
+\def\checkparbuilders % can be more efficient as we don't want to do this to often
+ {\ifcase\attribute\parbuilderattribute
+ \disableparbuilders
+ \else
+ \enableparbuilders
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/node-pro.lua b/tex/context/base/node-pro.lua
new file mode 100644
index 000000000..4f5b3dcbe
--- /dev/null
+++ b/tex/context/base/node-pro.lua
@@ -0,0 +1,149 @@
+if not modules then modules = { } end modules ['node-pro'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local format, concat = string.format, table.concat
+
+local trace_callbacks = false trackers.register("nodes.callbacks", function(v) trace_callbacks = v end)
+
+local glyph = node.id('glyph')
+
+local free_node = node.free
+local first_character = node.first_character
+
+nodes.processors = nodes.processors or { }
+
+-- vbox: grouptype: vbox vtop output split_off split_keep | box_type: exactly|aditional
+-- hbox: grouptype: hbox adjusted_hbox(=hbox_in_vmode) | box_type: exactly|aditional
+
+lists = lists or { }
+chars = chars or { }
+words = words or { } -- not used yet
+
+local actions = tasks.actions("processors",4)
+
+local n = 0
+
+local function reconstruct(head)
+ local t = { }
+ local h = head
+ while h do
+ local id = h.id
+ if id == glyph then
+ t[#t+1] = utf.char(h.char)
+ else
+ t[#t+1] = "[]"
+ end
+ h = h.next
+ end
+ return concat(t)
+end
+
+local function tracer(what,state,head,groupcode,before,after,show)
+ if not groupcode then
+ groupcode = "unknown"
+ elseif groupcode == "" then
+ groupcode = "mvl"
+ end
+ n = n + 1
+ if show then
+ logs.report("nodes","%s %s: %s, group: %s, nodes: %s -> %s, string: %s",what,n,state,groupcode,before,after,reconstruct(head))
+ else
+ logs.report("nodes","%s %s: %s, group: %s, nodes: %s -> %s",what,n,state,groupcode,before,after)
+ end
+end
+
+nodes.processors.enabled = true -- thsi will become a proper state (like trackers)
+
+function nodes.processors.pre_linebreak_filter(head,groupcode,size,packtype,direction)
+ local first, found = first_character(head)
+ if found then
+ if trace_callbacks then
+ local before = nodes.count(head,true)
+ local head, done = actions(head,groupcode,size,packtype,direction)
+ local after = nodes.count(head,true)
+ if done then
+ tracer("pre_linebreak","changed",head,groupcode,before,after,true)
+ else
+ tracer("pre_linebreak","unchanged",head,groupcode,before,after,true)
+ end
+ return (done and head) or true
+ else
+ local head, done = actions(head,groupcode,size,packtype,direction)
+ return (done and head) or true
+ end
+ elseif trace_callbacks then
+ local n = nodes.count(head,false)
+ tracer("pre_linebreak","no chars",head,groupcode,n,n)
+ end
+ return true
+end
+
+function nodes.processors.hpack_filter(head,groupcode,size,packtype,direction)
+ local first, found = first_character(head)
+ if found then
+ if trace_callbacks then
+ local before = nodes.count(head,true)
+ local head, done = actions(head,groupcode,size,packtype,direction)
+ local after = nodes.count(head,true)
+ if done then
+ tracer("hpack","changed",head,groupcode,before,after,true)
+ else
+ tracer("hpack","unchanged",head,groupcode,before,after,true)
+ end
+ return (done and head) or true
+ else
+ local head, done = actions(head,groupcode,size,packtype,direction)
+ return (done and head) or true
+ end
+ elseif trace_callbacks then
+ local n = nodes.count(head,false)
+ tracer("hpack","no chars",head,groupcode,n,n)
+ end
+ return true
+end
+
+callbacks.register('pre_linebreak_filter', nodes.processors.pre_linebreak_filter,"all kind of horizontal manipulations (before par break)")
+callbacks.register('hpack_filter' , nodes.processors.hpack_filter,"all kind of horizontal manipulations")
+
+local actions = tasks.actions("finalizers",1) -- head, where
+
+-- beware, these are packaged boxes so no first_character test
+-- maybe some day a hash with valid groupcodes
+--
+-- beware, much can pass twice, for instance vadjust passes two times
+
+function nodes.processors.post_linebreak_filter(head,groupcode)
+--~ local first, found = first_character(head)
+--~ if found then
+ if trace_callbacks then
+ local before = nodes.count(head,true)
+ local head, done = actions(head,groupcode)
+ local after = nodes.count(head,true)
+ if done then
+ tracer("finalizer","changed",head,groupcode,before,after,true)
+ else
+ tracer("finalizer","unchanged",head,groupcode,before,after,true)
+ end
+ return (done and head) or true
+ else
+ local head, done = actions(head,groupcode)
+ return (done and head) or true
+ end
+--~ elseif trace_callbacks then
+--~ local n = nodes.count(head,false)
+--~ tracer("finalizer","no chars",head,groupcode,n,n)
+--~ end
+--~ return true
+end
+
+callbacks.register('post_linebreak_filter', nodes.processors.post_linebreak_filter,"all kind of horizontal manipulations (after par break)")
+
+statistics.register("h-node processing time", function()
+ return statistics.elapsedseconds(nodes,"including kernel") -- hm, ok here?
+end)
diff --git a/tex/context/base/node-ref.lua b/tex/context/base/node-ref.lua
new file mode 100644
index 000000000..7128b1a6d
--- /dev/null
+++ b/tex/context/base/node-ref.lua
@@ -0,0 +1,533 @@
+if not modules then modules = { } end modules ['node-bck'] = {
+ version = 1.001,
+ comment = "companion to node-bck.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- We supported pdf right from the start and in mkii this has resulted in
+-- extensive control over the links. Nowadays pdftex provides a lot more
+-- control over margins but as mkii supports multiple backends we stuck to
+-- our own mechanisms. In mkiv again we implement our own handling. Eventually
+-- we will even disable the pdf primitives.
+
+-- helper, will end up in luatex
+
+local cleanupreferences, cleanupdestinations = false, true
+
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+
+local hpack_list = node.hpack
+local list_dimensions = node.dimensions
+
+-- current.glue_set current.glue_sign
+
+local trace_backend = false trackers.register("nodes.backend", function(v) trace_backend = v end)
+local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end)
+local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end)
+
+local hlist = node.id("hlist")
+local vlist = node.id("vlist")
+local glue = node.id("glue")
+local whatsit = node.id("whatsit")
+
+local new_kern = nodes.kern
+
+local has_attribute = node.has_attribute
+local traverse = node.traverse
+local find_node_tail = node.tail or node.slide
+local tosequence = nodes.tosequence
+
+local function dimensions(parent,start,stop)
+ stop = stop and stop.next
+ if parent then
+ if stop then
+ return list_dimensions(parent.glue_set,parent.glue_sign,parent.glue_order,start,stop)
+ else
+ return list_dimensions(parent.glue_set,parent.glue_sign,parent.glue_order,start)
+ end
+ else
+ if stop then
+ return list_dimensions(start,stop)
+ else
+ return list_dimensions(start)
+ end
+ end
+end
+
+--~ more compact
+
+local function dimensions(parent,start,stop)
+ if parent then
+ return list_dimensions(parent.glue_set,parent.glue_sign,parent.glue_order,start,stop and stop.next)
+ else
+ return list_dimensions(start,stop and stop.next)
+ end
+end
+
+-- is pardir important at all?
+
+local function inject_range(head,first,last,reference,make,stack,parent,pardir,txtdir)
+ local width, height, depth = dimensions(parent,first,last)
+ if pardir == "TRT" or txtdir == "+TRT" then
+ width = - width
+ end
+ local result, resolved = make(width,height,depth,reference)
+ if result and resolved then
+ if head == first then
+ if trace_backend then
+ logs.report("backend","head: %04i %s %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
+ end
+ result.next = first
+ first.prev = result
+ return result, last
+ else
+ if trace_backend then
+ logs.report("backend","middle: %04i %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
+ end
+ local prev = first.prev
+ if prev then
+ result.next = first
+ result.prev = prev
+ prev.next = result
+ first.prev = result
+ else
+ result.next = first
+ first.prev = result
+ end
+ if first == head.next then
+ head.next = result -- hm, weird
+ end
+ return head, last
+ end
+ else
+ return head, last
+ end
+end
+
+local function inject_list(id,current,reference,make,stack,pardir,txtdir)
+ local width, height, depth, correction = current.width, current.height, current.depth, 0
+ local moveright = false
+ local first = current.list
+ if id == hlist then
+ -- can be either an explicit hbox or a line and there is no way
+ -- to recognize this; anyway only if ht/dp (then inline)
+ --
+ -- to be tested: 0=unknown, 1=linebreak, 2=hbox
+--~ if id.subtype == 1 then
+ local sr = stack[reference]
+ if first then
+ if sr and sr[2] then
+ local last = find_node_tail(first)
+ if last.id == glue and last.subtype == 9 then
+ local prev = last.prev
+ moveright = first.id == glue and first.subtype == 8
+ if prev and prev.id == glue and prev.subtype == 15 then
+ width = dimensions(current,first,prev.prev) -- maybe not current as we already take care of it
+ else
+ if moveright and first.writable then
+ width = width - first.spec.stretch*current.glue_set * current.glue_sign
+ end
+ if last.writable then
+ width = width - last.spec.stretch*current.glue_set * current.glue_sign
+ end
+ end
+ end
+ else
+ -- also weird
+ end
+--~ else
+--~ print("!!!!!!!!!!!!!!!!!")
+ -- simple
+--~ end
+ else
+ -- ok
+ end
+ correction = width
+ else
+ correction = height + depth
+ height, depth = depth, height -- ugly hack, needed because pdftex backend does something funny
+ end
+ if pardir == "TRT" then
+ width = - width
+ end
+ local result, resolved = make(width,height,depth,reference)
+ if result and resolved then
+ if trace_backend then
+ logs.report("backend","box: %04i %s %s: w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",width,height,depth,resolved)
+ end
+ if not first then
+ current.list = result
+ elseif moveright then -- brr no prevs done
+ -- result after first
+ local n = first.next
+ result.next = n
+ first.next = result
+ result.prev = first
+ if n then n.prev = result end
+ else
+ -- first after result
+ result.next = first
+ first.prev = result
+ current.list = result
+ end
+ end
+end
+
+-- skip is somewhat messy
+
+local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,txtdir) -- main
+ if head then
+ local current, first, last, firstdir, reference = head, nil, nil, nil, nil
+ pardir = pardir or "==="
+ txtdir = txtdir or "==="
+ while current do
+ local id = current.id
+ local r = has_attribute(current,attribute)
+ if id == whatsit then
+ local subtype = current.subtype
+ if subtype == 6 then
+ pardir = current.dir
+ elseif subtype == 7 then
+ txtdir = current.dir
+ end
+ elseif id == hlist or id == vlist then
+ if not reference and r and (not skip or r > skip) then
+ inject_list(id,current,r,make,stack,pardir,txtdir)
+ end
+ if r then
+ done[r] = (done[r] or 0) + 1
+ end
+ local list = current.list
+ if list then
+ local _
+ current.list, _, pardir, txtdir = inject_areas(list,attribute,make,stack,done,r or skip or 0,current,pardir,txtdir)
+ end
+ if r then
+ done[r] = done[r] - 1
+ end
+ elseif not r then
+ -- just go on, can be kerns
+ elseif not reference then
+ reference, first, last, firstdir = r, current, current, txtdir
+ elseif r == reference then
+ last = current
+ elseif (done[reference] or 0) == 0 then
+ if not skip or r > skip then
+ head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
+ reference, first, last, firstdir = nil, nil, nil, nil
+ end
+ else
+ reference, first, last, firstdir = r, current, current, txtdir
+ end
+ current = current.next
+ end
+ if reference and (done[reference] or 0) == 0 then
+ head = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
+ end
+ end
+ return head, true, pardir, txtdir
+end
+
+local function inject_area(head,attribute,make,stack,done,parent,pardir,txtdir) -- singular !
+ if head then
+ pardir = pardir or "==="
+ txtdir = txtdir or "==="
+ local current = head
+ while current do
+ local id = current.id
+ local r = has_attribute(current,attribute)
+ if id == whatsit then
+ local subtype = current.subtype
+ if subtype == 6 then
+ pardir = current.dir
+ elseif subtype == 7 then
+ txtdir = current.dir
+ end
+ elseif id == hlist or id == vlist then
+ if r and not done[r] then
+ done[r] = true
+ inject_list(id,current,r,make,stack,pardir,txtdir)
+ end
+ current.list = inject_area(current.list,attribute,make,stack,done,current,pardir,txtdir)
+ elseif r and not done[r] then
+ done[r] = true
+ head, current = inject_range(head,current,current,r,make,stack,parent,pardir,txtdir)
+ end
+ current = current.next
+ end
+ end
+ return head, true
+end
+
+-- tracing
+
+local new_rule = nodes.rule
+local new_kern = nodes.kern
+local set_attribute = node.set_attribute
+local register_color = colors.register
+
+local a_colormodel = attributes.private('colormodel')
+local a_color = attributes.private('color')
+local a_transparency = attributes.private('transparency')
+local u_transparency = nil
+local u_colors = { }
+local force_gray = true
+
+local function colorize(width,height,depth,n)
+ if force_gray then n = 0 end
+ u_transparency = u_transparency or transparencies.register(nil,2,.65)
+ local ucolor = u_colors[n]
+ if not ucolor then
+ if n == 1 then
+ u_color = register_color(nil,'rgb',.75,0,0)
+ elseif n == 2 then
+ u_color = register_color(nil,'rgb',0,.75,0)
+ elseif n == 3 then
+ u_color = register_color(nil,'rgb',0,0,.75)
+ else
+ n = 0
+ u_color = register_color(nil,'gray',.5)
+ end
+ u_colors[n] = u_color
+ end
+ local rule = new_rule(width,height,depth)
+ set_attribute(rule,a_colormodel,1) -- gray color model
+ set_attribute(rule,a_color,u_color)
+ set_attribute(rule,a_transparency,u_transparency)
+ if width < 0 then
+ local kern = new_kern(width)
+ rule.width = -width
+ kern.next = rule
+ rule.prev = kern
+ return kern
+ else
+ return rule
+ end
+end
+
+local new_kern = nodes.kern
+local texattribute = tex.attribute
+local texcount = tex.count
+
+-- references:
+
+nodes.references = {
+ attribute = attributes.private('reference'),
+ stack = { },
+ done = { },
+}
+
+local stack, done, attribute = nodes.references.stack, nodes.references.done, nodes.references.attribute
+
+local nofreferences, topofstack = 0, 0
+
+local function setreference(n,h,d,r) -- n is just a number, can be used for tracing
+ topofstack = topofstack + 1
+ stack[topofstack] = { n, h, d, codeinjections.prerollreference(r) } -- the preroll permits us to determine samepage (but delayed also has some advantages)
+--~ texattribute[attribute] = topofstack -- todo -> at tex end
+ texcount.lastreferenceattribute = topofstack
+end
+
+nodes.setreference = setreference
+
+local function makereference(width,height,depth,reference)
+ local sr = stack[reference]
+ if sr then
+ local resolved, ht, dp, set = sr[1], sr[2], sr[3], sr[4]
+ if ht then
+ if height < ht then height = ht end
+ if depth < dp then depth = dp end
+ end
+ local annot = nodeinjections.reference(width,height,depth,set)
+ if annot then
+ nofreferences = nofreferences + 1
+ local result, current
+ if trace_references then
+ local step = 65536
+ result = hpack_list(colorize(width,height-step,depth-step,2)) -- step subtracted so that we can see seperate links
+ result.width = 0
+ current = result
+ end
+ if current then
+ current.next = annot
+ else
+ result = annot
+ end
+ result = hpack_list(result,0)
+ result.width, result.height, result.depth = 0, 0, 0
+ if cleanupreferences then stack[reference] = nil end
+ return result, resolved
+ else
+ logs.report("backends","unable to resolve reference annotation %s",reference)
+ end
+ else
+ logs.report("backends","unable to resolve reference attribute %s",reference)
+ end
+end
+
+function nodes.add_references(head)
+ if topofstack > 0 then
+ return inject_areas(head,attribute,makereference,stack,done)
+ else
+ return head, false
+ end
+end
+
+-- destinations (we can clean up once set!)
+
+nodes.destinations = {
+ attribute = attributes.private('destination'),
+ stack = { },
+ done = { },
+}
+
+local stack, done, attribute = nodes.destinations.stack, nodes.destinations.done, nodes.destinations.attribute
+
+local nofdestinations, topofstack = 0, 0
+
+local function setdestination(n,h,d,name,view) -- n = grouplevel, name == table
+ topofstack = topofstack + 1
+ stack[topofstack] = { n, h, d, name, view }
+ return topofstack
+end
+
+nodes.setdestination = setdestination
+
+local function makedestination(width,height,depth,reference)
+ local sr = stack[reference]
+ if sr then
+ local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5]
+ if ht then
+ if height < ht then height = ht end
+ if depth < dp then depth = dp end
+ end
+ local result, current
+ if trace_destinations then
+ local step = 0
+ if width == 0 then
+ step = 4*65536
+ width, height, depth = 5*step, 5*step, 0
+ end
+ for n=1,#name do
+ local rule = hpack_list(colorize(width,height,depth,3))
+ rule.width = 0
+ if not result then
+ result, current = rule, rule
+ else
+ current.next = rule
+ rule.prev = current
+ current = rule
+ end
+ width, height = width - step, height - step
+ end
+ end
+ nofdestinations = nofdestinations + 1
+ for n=1,#name do
+ local annot = nodeinjections.destination(width,height,depth,name[n],view)
+ if not result then
+ result, current = annot, annot
+ else
+ current.next = annot
+ annot.prev = current
+ current = annot
+ end
+ end
+ result = hpack_list(result,0)
+ result.width, result.height, result.depth = 0, 0, 0
+ if cleanupdestinations then stack[reference] = nil end
+ return result, resolved
+ else
+ logs.report("backends","unable to resolve destination attribute %s",reference)
+ end
+end
+
+function nodes.add_destinations(head)
+ if topofstack > 0 then
+ return inject_area(head,attribute,makedestination,stack,done) -- singular
+ else
+ return head, false
+ end
+end
+
+-- will move
+
+function jobreferences.mark(reference,h,d,view)
+ return setdestination(tex.currentgrouplevel,h,d,reference,view)
+end
+
+function jobreferences.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible
+ local set, bug = jobreferences.identify(prefix,reference)
+ if bug or #set == 0 then
+ -- unknown ref, just don't set it and issue an error
+ else
+ -- check
+ set.highlight, set.newwindow,set.layer = highlight, newwindow, layer
+ setreference(tex.currentgrouplevel,h,d,set) -- sets attribute / todo: for set[*].error
+ end
+end
+
+function jobreferences.injectcurrentset(h,d) -- used inside doifelse
+ local currentset = jobreferences.currentset
+ if currentset then
+ setreference(tex.currentgrouplevel,h,d,currentset) -- sets attribute / todo: for set[*].error
+ end
+end
+
+--
+
+local function checkboth(open,close)
+ if open and open ~= "" then
+ local set, bug = jobreferences.identify("",open)
+ open = not bug and #set > 0 and set
+ end
+ if close and close ~= "" then
+ local set, bug = jobreferences.identify("",close)
+ close = not bug and #set > 0 and set
+ end
+ return open, close
+end
+
+-- expansion is temp hack
+
+local opendocument, closedocument, openpage, closepage
+
+local function check(what)
+ if what and what ~= "" then
+ local set, bug = jobreferences.identify("",what)
+ return not bug and #set > 0 and set
+ end
+end
+
+function jobreferences.checkopendocumentactions (open) opendocument = check(open) end
+function jobreferences.checkclosedocumentactions(close) closedocument = check(close) end
+function jobreferences.checkopenpageactions (open) openpage = check(open) end
+function jobreferences.checkclosepageactions (close) closepage = check(close) end
+
+function jobreferences.flushdocumentactions()
+ if opendocument or closedocument then
+ backends.codeinjections.flushdocumentactions(opendocument,closedocument) -- backend
+ end
+end
+function jobreferences.flushpageactions()
+ if openpage or closepage then
+ backends.codeinjections.flushpageactions(openpage,closepage) -- backend
+ end
+end
+
+-- end temp hack
+
+statistics.register("interactive elements", function()
+ if nofreferences > 0 or nofdestinations > 0 then
+ return string.format("%s references, %s destinations",nofreferences,nofdestinations)
+ else
+ return nil
+ end
+end)
+
+function jobreferences.enable_interaction()
+ tasks.enableaction("shipouts","nodes.add_references")
+ tasks.enableaction("shipouts","nodes.add_destinations")
+end
diff --git a/tex/context/base/node-res.lua b/tex/context/base/node-res.lua
new file mode 100644
index 000000000..a8ea8745a
--- /dev/null
+++ b/tex/context/base/node-res.lua
@@ -0,0 +1,302 @@
+if not modules then modules = { } end modules ['node-res'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local gmatch, format = string.gmatch, string.format
+local copy_node, free_node, free_list, new_node, node_type, node_id = node.copy, node.free, node.flush_list, node.new, node.type, node.id
+local tonumber, round = tonumber, math.round
+
+local glyph_node = node_id("glyph")
+
+--[[ldx--
+<p>The next function is not that much needed but in <l n='context'/> we use
+for debugging <l n='luatex'/> node management.</p>
+--ldx]]--
+
+nodes = nodes or { }
+
+nodes.whatsits = { } -- table.swapped(node.whatsits())
+
+local reserved = { }
+local whatsits = nodes.whatsits
+
+for k, v in next, node.whatsits() do
+ whatsits[k], whatsits[v] = v, k -- two way
+end
+
+local function register_node(n)
+ reserved[#reserved+1] = n
+ return n
+end
+
+nodes.register = register_node
+
+function nodes.cleanup_reserved(nofboxes) -- todo
+ nodes.tracers.steppers.reset() -- todo: make a registration subsystem
+ local nr, nl = #reserved, 0
+ for i=1,nr do
+ local ri = reserved[i]
+ -- if not (ri.id == glue_spec and not ri.is_writable) then
+ free_node(reserved[i])
+ -- end
+ end
+ if nofboxes then
+ local tb = tex.box
+ for i=0,nofboxes do
+ local l = tb[i]
+ if l then
+ free_node(tb[i])
+ nl = nl + 1
+ end
+ end
+ end
+ reserved = { }
+ return nr, nl, nofboxes -- can be nil
+end
+
+function nodes.usage()
+ local t = { }
+ for n, tag in gmatch(status.node_mem_usage,"(%d+) ([a-z_]+)") do
+ t[tag] = n
+ end
+ return t
+end
+
+local disc = register_node(new_node("disc"))
+local kern = register_node(new_node("kern",1))
+local penalty = register_node(new_node("penalty"))
+local glue = register_node(new_node("glue")) -- glue.spec = nil
+local glue_spec = register_node(new_node("glue_spec"))
+local glyph = register_node(new_node("glyph",0))
+local textdir = register_node(new_node("whatsit",whatsits.dir)) -- 7 (6 is local par node)
+local rule = register_node(new_node("rule"))
+local latelua = register_node(new_node("whatsit",whatsits.late_lua)) -- 35
+local user_n = register_node(new_node("whatsit",whatsits.user_defined)) user_n.type = 100 -- 44
+local user_l = register_node(new_node("whatsit",whatsits.user_defined)) user_l.type = 110 -- 44
+local user_s = register_node(new_node("whatsit",whatsits.user_defined)) user_s.type = 115 -- 44
+local user_t = register_node(new_node("whatsit",whatsits.user_defined)) user_t.type = 116 -- 44
+local left_margin_kern = register_node(new_node("margin_kern",0))
+local right_margin_kern = register_node(new_node("margin_kern",1))
+local lineskip = register_node(new_node("glue",1))
+local baselineskip = register_node(new_node("glue",2))
+local leftskip = register_node(new_node("glue",8))
+local rightskip = register_node(new_node("glue",9))
+local temp = register_node(new_node("temp",0))
+
+function nodes.zeroglue(n)
+ local s = n.spec
+ return not writable or (
+ s.width == 0
+ and s.stretch == 0
+ and s.shrink == 0
+ and s.stretch_order == 0
+ and s.shrink_order == 0
+ )
+end
+
+function nodes.glyph(fnt,chr)
+ local n = copy_node(glyph)
+ if fnt then n.font = fnt end
+ if chr then n.char = chr end
+ return n
+end
+
+function nodes.penalty(p)
+ local n = copy_node(penalty)
+ n.penalty = p
+ return n
+end
+
+function nodes.kern(k)
+ local n = copy_node(kern)
+ n.kern = k
+ return n
+end
+
+function nodes.glue_spec(width,stretch,shrink)
+ local s = copy_node(glue_spec)
+ s.width, s.stretch, s.shrink = width, stretch, shrink
+ return s
+end
+
+local function someskip(skip,width,stretch,shrink)
+ local n = copy_node(skip)
+ if not width then
+ -- no spec
+ elseif tonumber(width) then
+ local s = copy_node(glue_spec)
+ s.width, s.stretch, s.shrink = width, stretch, shrink
+ n.spec = s
+ else
+ -- shared
+ n.spec = copy_node(width)
+ end
+ return n
+end
+
+function nodes.glue(width,stretch,shrink)
+ return someskip(glue,width,stretch,shrink)
+end
+function nodes.leftskip(width,stretch,shrink)
+ return someskip(leftskip,width,stretch,shrink)
+end
+function nodes.rightskip(width,stretch,shrink)
+ return someskip(rightskip,width,stretch,shrink)
+end
+function nodes.lineskip(width,stretch,shrink)
+ return someskip(lineskip,width,stretch,shrink)
+end
+function nodes.baselineskip(width,stretch,shrink)
+ return someskip(baselineskip,width,stretch,shrink)
+end
+
+function nodes.disc()
+ return copy_node(disc)
+end
+
+function nodes.textdir(dir)
+ local t = copy_node(textdir)
+ t.dir = dir
+ return t
+end
+
+function nodes.rule(width,height,depth,dir)
+ local n = copy_node(rule)
+ if width then n.width = width end
+ if height then n.height = height end
+ if depth then n.depth = depth end
+ if dir then n.dir = dir end
+ return n
+end
+
+function nodes.latelua(code)
+ local n = copy_node(latelua)
+ n.data = code
+ return n
+end
+
+function nodes.leftmarginkern(glyph,width)
+ local n = copy_node(left_margin_kern)
+ if not glyph then
+ logs.fatal("nodes","invalid pointer to left margin glyph node")
+ elseif glyph.id ~= glyph_node then
+ logs.fatal("nodes","invalid node type %s for left margin glyph node",node_type(glyph))
+ else
+ n.glyph = glyph
+ end
+ if width then
+ n.width = width
+ end
+ return n
+end
+
+function nodes.rightmarginkern(glyph,width)
+ local n = copy_node(right_margin_kern)
+ if not glyph then
+ logs.fatal("nodes","invalid pointer to right margin glyph node")
+ elseif glyph.id ~= glyph_node then
+ logs.fatal("nodes","invalid node type %s for right margin glyph node",node_type(p))
+ else
+ n.glyph = glyph
+ end
+ if width then
+ n.width = width
+ end
+ return n
+end
+
+function nodes.temp()
+ return copy_node(temp)
+end
+--[[
+<p>At some point we ran into a problem that the glue specification
+of the zeropoint dimension was overwritten when adapting a glue spec
+node. This is a side effect of glue specs being shared. After a
+couple of hours tracing and debugging Taco and I came to the
+conclusion that it made no sense to complicate the spec allocator
+and settled on a writable flag. This all is a side effect of the
+fact that some glues use reserved memory slots (with the zeropoint
+glue being a noticeable one). So, next we wrap this into a function
+and hide it for the user. And yes, LuaTeX now gives a warning as
+well.</p>
+]]--
+
+if tex.luatexversion > 51 then
+
+ function nodes.writable_spec(n)
+ local spec = n.spec
+ if not spec then
+ spec = copy_node(glue_spec)
+ n.spec = spec
+ elseif not spec.writable then
+ spec = copy_node(spec)
+ n.spec = spec
+ end
+ return spec
+ end
+
+else
+
+ function nodes.writable_spec(n)
+ local spec = n.spec
+ if not spec then
+ spec = copy_node(glue_spec)
+ else
+ spec = copy_node(spec)
+ end
+ n.spec = spec
+ return spec
+ end
+
+end
+
+local cache = { }
+
+function nodes.usernumber(num)
+ local n = cache[num]
+ if n then
+ return copy_node(n)
+ else
+ local n = copy_node(user_n)
+ if num then n.value = num end
+ return n
+ end
+end
+
+function nodes.userlist(list)
+ local n = copy_node(user_l)
+ if list then n.value = list end
+ return n
+end
+
+local cache = { } -- we could use the same cache
+
+function nodes.userstring(str)
+ local n = cache[str]
+ if n then
+ return copy_node(n)
+ else
+ local n = copy_node(user_s)
+ n.type = 115
+ if str then n.value = str end
+ return n
+ end
+end
+
+function nodes.usertokens(tokens)
+ local n = copy_node(user_t)
+ if tokens then n.value = tokens end
+ return n
+end
+
+statistics.register("cleaned up reserved nodes", function()
+ return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"]))
+end) -- \topofboxstack
+
+statistics.register("node memory usage", function() -- comes after cleanup !
+ return status.node_mem_usage
+end)
diff --git a/tex/context/base/node-rul.lua b/tex/context/base/node-rul.lua
new file mode 100644
index 000000000..9dd89bcda
--- /dev/null
+++ b/tex/context/base/node-rul.lua
@@ -0,0 +1,288 @@
+if not modules then modules = { } end modules ['node-rul'] = {
+ version = 1.001,
+ comment = "companion to node-rul.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this will go to an auxiliary module
+-- beware: rules now have a dir field
+
+local glyph = node.id("glyph")
+local disc = node.id("disc")
+local rule = node.id("rule")
+
+function nodes.strip_range(first,last) -- todo: dir
+ if first and last then -- just to be sure
+ local current = first
+ while current and current ~= last do
+ local id = current.id
+ if id == glyph or id == disc then
+ --~ if id == glyph or id == rule or id == disc then
+ first = current
+ break
+ else
+ current = current.next
+ end
+ end
+ local current = last
+ while current and current ~= first do
+ local id = current.id
+ --~ if id == glyph or id == rule or id == disc then
+ if id == glyph or id == disc then
+ last = current
+ break
+ else
+ current = current.prev
+ end
+ end
+ end
+ return first, last
+end
+
+-- todo: order and maybe other dimensions
+
+local trace_ruled = false trackers.register("nodes.ruled", function(v) trace_ruled = v end)
+
+local floor = math.floor
+local n_tostring, n_tosequence = nodes.ids_tostring, nodes.tosequence
+
+local a_ruled = attributes.private('ruled')
+local a_color = attributes.private('color')
+local a_transparency = attributes.private('transparency')
+local a_colorspace = attributes.private('colormodel')
+
+local glyph = node.id("glyph")
+local disc = node.id("disc")
+local glue = node.id("glue")
+local penalty = node.id("penalty")
+local kern = node.id("kern")
+local hlist = node.id("hlist")
+local vlist = node.id("vlist")
+local rule = node.id("rule")
+local whatsit = node.id("whatsit")
+
+local new_rule = nodes.rule
+local new_kern = nodes.kern
+local new_glue = nodes.glue
+
+local insert_before, insert_after, strip_range = node.insert_before, node.insert_after, nodes.strip_range
+local list_dimensions, has_attribute, set_attribute = node.dimensions, node.has_attribute, node.set_attribute
+local hpack_nodes = node.hpack
+local dimenfactor = fonts.dimenfactor
+local texwrite = tex.write
+
+local fontdata = fonts.ids
+local variables = interfaces.variables
+
+-- we can use this one elsewhere too
+--
+-- todo: functions: word, sentence
+--
+-- glyph rule unset whatsit glue margin_kern kern math disc
+
+local checkdir = true
+
+-- we assume {glyphruns} and no funny extra kerning, ok, maybe we need
+-- a dummy character as start and end; anyway we only collect glyphs
+
+local function process_words(attribute,data,flush,head,parent) -- we have hlistdir and local dir
+ local n = head
+ if n then
+ local f, l, a, d, i, level
+ local continue, done, strip = false, false, false
+ while n do
+ local id = n.id
+ if id == glyph or id == rule then
+ local aa = has_attribute(n,attribute)
+ if aa then
+ if aa == a then
+ if not f then -- ?
+ f = n
+ end
+ l = n
+ else
+ -- possible extensions: when in same class then keep spanning
+ if f then
+ head, done = flush(head,f,l,d,level,parent,strip), true
+ end
+ f, l, a = n, n, aa
+ level, i = floor(a/1000), a%1000
+ d = data[i]
+ continue = d.continue == variables.yes
+ end
+ else
+ if f then
+ head, done = flush(head,f,l,d,level,parent,strip), true
+ end
+ f, l, a = nil, nil, nil
+ end
+ elseif f and (id == disc or (id == kern and n.subtype == 0)) then
+ l = n
+ elseif id == hlist or id == vlist then
+ if f then
+ head, done = flush(head,f,l,d,level,parent,strip), true
+ f, l, a = nil, nil, nil
+ end
+ local list = n.list
+ if list then
+ n.list = process_words(attribute,data,flush,list,n)
+ end
+ elseif checkdir and id == whatsit and n.subtype == 7 then -- only changes in dir, we assume proper boundaries
+ if f and a then
+ l = n
+ end
+ elseif f then
+ if continue then
+ if id == penalty or id == kern then
+ l = n
+ elseif id == glue then
+ l = n
+ end
+ else
+ head, done = flush(head,f,l,d,level,parent,strip), true
+ f, l, a = nil, nil, nil
+ end
+ end
+ n = n.next
+ end
+ if f then
+ head, done = flush(head,f,l,d,level,parent,strip), true
+ end
+ return head, true -- todo: done
+ else
+ return head, false
+ end
+end
+
+nodes.process_words = process_words
+
+--
+
+nodes.rules = nodes.rules or { }
+nodes.rules.data = nodes.rules.data or { }
+
+storage.register("nodes/rules/data", nodes.rules.data, "nodes.rules.data")
+
+local data = nodes.rules.data
+
+function nodes.rules.define(settings)
+ data[#data+1] = settings
+ texwrite(#data)
+end
+
+local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but acceptable for this purpose
+-- check for f and l
+ local r, m
+ if true then
+ f, l = strip_range(f,l)
+ end
+ local w = list_dimensions(parent.glue_set,parent.glue_sign,parent.glue_order,f,l.next)
+ local method, offset, continue, dy, rulethickness, unit, order, max, ma, ca, ta =
+ d.method, d.offset, d.continue, d.dy, d.rulethickness, d.unit, d.order, d.max, d.ma, d.ca, d.ta
+ local e = dimenfactor(unit,fontdata[f.font])
+ local colorspace = (ma > 0 and ma) or has_attribute(f,a_colorspace) or 1
+ local color = (ca > 0 and ca) or has_attribute(f,a_color)
+ local transparency = (ta > 0 and ta) or has_attribute(f,a_transparency)
+ local foreground = order == variables.foreground
+ rulethickness= rulethickness/2
+ if level > max then
+ level = max
+ end
+ if method == 0 then -- center
+ offset = 2*offset
+ m = (offset+(level-1)*dy+rulethickness)*e/2
+ else
+ m = 0
+ end
+ for i=1,level do
+ local ht = (offset+(i-1)*dy+rulethickness)*e - m
+ local dp = -(offset+(i-1)*dy-rulethickness)*e + m
+ local r = new_rule(w,ht,dp)
+ if color then
+ set_attribute(r,a_colorspace,colorspace)
+ set_attribute(r,a_color,color)
+ end
+ if transparency then
+ set_attribute(r,a_transparency,transparency)
+ end
+ local k = new_kern(-w)
+ if foreground then
+ insert_after(head,l,k)
+ insert_after(head,k,r)
+ l = r
+ else
+ head, _ = insert_before(head,f,r)
+ insert_after(head,r,k)
+ end
+ if trace_ruled then
+ logs.report("ruled", "level: %s, width: %i, height: %i, depth: %i, nodes: %s, text: %s",
+ level,w,ht,dp,n_tostring(f,l),n_tosequence(f,l,true))
+ -- level,r.width,r.height,r.depth,n_tostring(f,l),n_tosequence(f,l,true))
+ end
+ end
+ return head
+end
+
+local process = nodes.process_words
+
+nodes.rules.process = function(head) return process(a_ruled,data,flush_ruled,head) end
+
+function nodes.rules.enable()
+ tasks.enableaction("shipouts","nodes.rules.process")
+end
+
+-- elsewhere:
+--
+-- tasks.appendaction ("shipouts", "normalizers", "nodes.rules.process")
+-- tasks.disableaction("shipouts", "nodes.rules.process") -- only kick in when used
+
+local trace_shifted = false trackers.register("nodes.shifted", function(v) trace_shifted = v end)
+
+local a_shifted = attributes.private('shifted')
+
+nodes.shifts = nodes.shifts or { }
+nodes.shifts.data = nodes.shifts.data or { }
+
+storage.register("nodes/shifts/data", nodes.shifts.data, "nodes.shifts.data")
+
+local data = nodes.shifts.data
+
+function nodes.shifts.define(settings)
+ data[#data+1] = settings
+ texwrite(#data)
+end
+
+local function flush_shifted(head,first,last,data,level,parent,strip) -- not that fast but acceptable for this purpose
+ if true then
+ first, last = strip_range(first,last)
+ end
+ local prev, next = first.prev, last.next
+ first.prev, last.next = nil, nil
+ local width, height, depth = list_dimensions(parent.glue_set,parent.glue_sign,parent.glue_order,first,next)
+ local list = hpack_nodes(first,width,"exactly")
+ if first == head then
+ head = list
+ end
+ if prev then
+ prev.next, list.prev = list, prev
+ end
+ if next then
+ next.prev, list.next = list, next
+ end
+ local raise = data.dy * dimenfactor(data.unit,fontdata[first.font])
+ list.shift, list.height, list.depth = raise, height, depth
+ if trace_shifted then
+ logs.report("shifted", "width: %s, nodes: %s, text: %s",width,n_tostring(first,last),n_tosequence(first,last,true))
+ end
+ return head
+end
+
+local process = nodes.process_words
+
+nodes.shifts.process = function(head) return process(a_shifted,data,flush_shifted,head) end
+
+function nodes.shifts.enable()
+ tasks.enableaction("shipouts","nodes.shifts.process")
+end
diff --git a/tex/context/base/node-rul.mkiv b/tex/context/base/node-rul.mkiv
new file mode 100644
index 000000000..1270eb81d
--- /dev/null
+++ b/tex/context/base/node-rul.mkiv
@@ -0,0 +1,343 @@
+%D \module
+%D [ file=node-rul,
+%D version=2009.11.03, % 1995.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Bars,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% todo: ex and and em traveling with attribute
+
+\writestatus{loading}{ConTeXt Core Macros / Bars}
+
+%D The name of this file might change.
+
+%D \macros
+%D {underbar,underbars,
+%D overbar,overbars,
+%D overstrike,overstrikes,
+%D setupbar}
+%D
+%D In the rare case that we need undelined words, for instance
+%D because all font alternatives are already in use, one can
+%D use \type{\underbar} and \type{\overstrike} and their plural
+%D forms.
+%D
+%D \startbuffer
+%D \underbars{drawing \underbar{bars} under words is a typewriter leftover}
+%D \overstrikes{striking words makes them \overstrike{unreadable} but
+%D sometimes even \overbar{top lines} come into view.}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D The next macros are derived from the \PLAIN\ \TEX\ one, but
+%D also supports nesting. The \type{$} keeps us in horizontal
+%D mode and at the same time applies grouping.
+%D
+%D \showsetup{underbar}
+%D \showsetup{underbars}
+%D \showsetup{overbar}
+%D \showsetup{overbars}
+%D \showsetup{overstrike}
+%D \showsetup{overstrikes}
+%D
+%D \showsetup{setupunderbar}
+
+\unprotect
+
+%definesystemattribute[ruled]
+%definesystemattribute[shifted]
+
+\registerctxluafile{node-rul}{1.001}
+
+\newtoks\checkalldefinedbars
+
+\def\barparameter #1{\csname\dobarparameter\currentbar#1\endcsname}
+\def\dobarparameter #1#2{\ifcsname\??on#1#2\endcsname\??on#1#2\else\expandafter\dobarparentparameter\csname\??on#1\s!parent\endcsname#2\fi}
+\def\dobarparentparameter#1#2{\ifx#1\relax\s!empty\else\dobarparameter#1#2\fi}
+
+\unexpanded\def\definebar
+ {\dotripleempty\dodefinebar}
+
+\def\dodefinebar[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??on#1][\s!parent=#2,#3]%
+ \else
+ \getparameters[\??on#1][\s!parent=,#2]%
+ \fi
+ %
+ %\setvalue{\??on:#1}{0}%
+ %
+ \ifcsname\??on:#1:c\endcsname
+ \csname\??on:#1:c\endcsname\zerocount
+ \else
+ \expandafter\newcount\csname\??on:#1:c\endcsname
+ \fi
+ \normalexpanded{\checkalldefinedbars{\noexpand\doredefinebar{#1}\the\checkalldefinedbars}}%
+ \dodefinebarindeed{#1}%
+ \setuvalue{#1}{\doruled{#1}}}
+
+\def\dodefinebarindeed#1%
+ {\bgroup
+ \def\currentbar{#1}%
+ \doifsomethingelse{\barparameter\c!color}
+ {\donetrue\colored[\barparameter\c!color]}
+ {\donefalse}%
+ \normalexpanded
+ {\egroup
+ \scratchcounter\ctxlua{nodes.rules.define {
+ method = \barparameter\c!method,
+ offset = \barparameter\c!offset,
+ continue = "\barparameter\c!continue",
+ dy = \barparameter\c!dy,
+ rulethickness = \barparameter\c!rulethickness,
+ unit = "\barparameter\c!unit",
+ order = "\barparameter\c!order",
+ max = \barparameter\c!max,
+ ma = \ifdone\the\attribute\colormodelattribute \else0\fi,
+ ca = \ifdone\the\attribute\colorattribute \else0\fi,
+ ta = \ifdone\the\attribute\transparencyattribute\else0\fi
+ }}}%
+ \setevalue{\??on#1:a}{\the\scratchcounter}}
+
+\let\doredefinebar\dodefinebarindeed
+
+\def\doruled#1%
+ {\groupedcommand{\dodoruled{#1}}\relax}
+
+\def\dodoruled
+ {\ctxlua{nodes.rules.enable()}%
+ \glet\dodoruled\dodoruledindeed
+ \dodoruled}
+
+\def\dodoruledindeed#1%
+ {\advance\csname\??on:#1:c\endcsname\plusone
+ \scratchcounter\csname\??on:#1:c\endcsname
+ \attribute\ruledattribute\numexpr1000*\scratchcounter
+ +\csname\??on#1\ifcsname\??on#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname}
+
+% ungrouped
+
+\unexpanded\def\startbar[#1]%
+ {\begingroup
+ \dodoruled{#1}}
+
+\unexpanded\def\stopbar
+ {\endgroup}
+
+\newcount\currentbarnesting % todo: same as colors
+
+\unexpanded\def\pushbar[#1]%
+ {\global\advance\currentbarnesting\plusone
+ \expandafter\edef\csname\??on:s:\number\currentbarnesting\endcsname
+ {\attribute\ruledattribute\the\attribute\ruledattribute}% stack
+ \dodoruled{#1}}
+
+\unexpanded\def\popbar
+ {\csname\??on:s:\number\currentbarnesting\endcsname
+ \global\advance\currentbarnesting\minusone}
+
+\unexpanded\def\setupbars
+ {\dodoubleempty\dosetupbars}
+
+\def\dosetupbars[#1][#2]% not that efficient
+ {\ifsecondargument
+ \getparameters[\??on#1][#2]%
+ \dodefinebarindeed{#1}%
+ \else
+ \getparameters[\??on][#1]%
+ \the\checkalldefinedbars
+ \fi}
+
+\setupbars
+ [\c!method=0, % new: 0=center nested, 1=stack nested
+ \c!continue=\v!no,
+ \c!offset=0, % upwards, replaces: topoffset bottomoffset
+ \c!dy=0,
+ \c!max=3,
+ \c!rulethickness=.1,
+ \c!order=\v!foreground,
+ \c!unit=ex, % so now we are relative
+ \c!color=] % replaces: rulecolor
+
+% \definebar[touchbar] [\c!method=0,\c!dy=-0.4,\c!offset=-0.0]
+% \definebar[touchbars] [touchbar] [\c!continue=\v!yes]
+
+\definebar[\v!overstrike] [\c!method=0,\c!dy= 0.4,\c!offset= 0.5,\c!continue=\v!yes]
+\definebar[\v!underbar] [\c!method=1,\c!dy=-0.4,\c!offset=-0.3,\c!continue=\v!yes]
+\definebar[\v!overbar] [\c!method=1,\c!dy= 0.4,\c!offset= 1.8,\c!continue=\v!yes]
+
+\definebar[\v!overstrikes] [\v!overstrike] [\c!continue=\v!no]
+\definebar[\v!underbars] [\v!underbar] [\c!continue=\v!no]
+\definebar[\v!overbars] [\v!overbar] [\c!continue=\v!no]
+
+% we want these always so ...
+
+\expandafter\let\expandafter\overstrike \csname\v!overstrike \endcsname
+\expandafter\let\expandafter\underbar \csname\v!underbar \endcsname
+\expandafter\let\expandafter\overbar \csname\v!overbar \endcsname
+\expandafter\let\expandafter\overstrikes\csname\v!overstrikes\endcsname
+\expandafter\let\expandafter\underbars \csname\v!underbars \endcsname
+\expandafter\let\expandafter\overbars \csname\v!overbars \endcsname
+
+\unexpanded\def\setupunderbar[#1]% too incompatible for the moment
+ {}
+
+%D This will move: (a bit duplicated)
+
+\newtoks\checkalldefinedshifts
+
+\def\shiftparameter #1{\csname\doshiftparameter\currentshift#1\endcsname}
+\def\shiftparameterhash#1{\doshiftparameterhash{\??ra\currentshift}#1}
+
+\def\doshiftparameter #1#2{\ifcsname\??ra#1#2\endcsname\??ra#1#2\else\expandafter\doshiftparentparameter\csname\??ra#1\s!parent\endcsname#2\fi}
+\def\doshiftparameterhash#1#2{\ifcsname#1#2\endcsname#1\else\expandafter\doshiftparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\doshiftparentparameter #1#2{\ifx#1\relax\s!empty\else\doshiftparameter #1#2\fi}
+\def\doshiftparentparameterhash#1#2{\ifx#1\relax \else\doshiftparameterhash#1#2\fi}
+
+\def\dosetshiftattributes#1#2% style color
+ {\edef\fontattributehash {\shiftparameterhash#1}%
+ \edef\colorattributehash{\shiftparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\unexpanded\def\defineshift
+ {\dotripleempty\dodefineshift}
+
+\def\dodefineshift[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??ra#1][\s!parent=#2,#3]%
+ \else
+ \getparameters[\??ra#1][\s!parent=,#2]%
+ \fi
+ %
+ %\setvalue{\??ra:#1}{0}%
+ %
+ \ifcsname\??ra:#1:c\endcsname
+ \csname\??ra:#1:c\endcsname\zerocount
+ \else
+ \expandafter\newcount\csname\??ra:#1:c\endcsname
+ \fi
+ \normalexpanded{\checkalldefinedshifts{\noexpand\doredefineshift{#1}\the\checkalldefinedshifts}}%
+ \dodefineshiftindeed{#1}%
+ \setuvalue{#1}{\doshifted{#1}}}
+
+\def\dodefineshiftindeed#1%
+ {\bgroup
+ \def\currentshift{#1}%
+ \normalexpanded
+ {\egroup
+ \scratchcounter\ctxlua{nodes.shifts.define {
+ method = \shiftparameter\c!method,
+ continue = "\shiftparameter\c!continue",
+ dy = \shiftparameter\c!dy,
+ unit = "\shiftparameter\c!unit",
+ }}}%
+ \setevalue{\??ra#1:a}{\the\scratchcounter}}
+
+\let\doredefineshift\dodefineshiftindeed
+
+\def\doshifted#1%
+ {\groupedcommand{\dodoshifted{#1}}\relax}
+
+\def\dodoshifted
+ {\ctxlua{nodes.shifts.enable()}%
+ \glet\dodoshifted\dodoshiftedindeed
+ \dodoshifted}
+
+% \def\dodoshiftedindeed#1%
+% {\def\currentshift{#1}%
+% \advance\csname\??ra:#1:c\endcsname\plusone
+% \scratchcounter\csname\??ra:#1:c\endcsname
+% \attribute\shiftedattribute\numexpr1000*\scratchcounter
+% +\csname\??ra#1\ifcsname\??ra#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname
+% \setupalign[\shiftparameter\c!align]%
+% \dosetshiftattributes\c!style\c!color}
+
+\def\dostartisolation{\char0 }
+\def\dostopisolation {\char0 }
+\def\doisolator {\char0 }
+
+\def\doisolatedgroupedalign#1#2%
+ {\groupedcommand
+ {\begingroup\dostartisolation\begingroup#1}
+ {#2\endgroup\dostopisolation\endgroup}}
+
+\def\dosetupisolatedalign#1%
+ {\doisolator
+ \setupalign[#1]\relax}
+
+\def\dodoshiftedindeed#1%
+ {\def\currentshift{#1}%
+ \advance\csname\??ra:#1:c\endcsname\plusone
+ \scratchcounter\csname\??ra:#1:c\endcsname
+ \attribute\shiftedattribute\numexpr1000*\scratchcounter
+ +\csname\??ra#1\ifcsname\??ra#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname
+ \dosetshiftattributes\c!style\c!color
+ \dosetupisolatedalign{\shiftparameter\c!align}}
+
+\def\doshifted#1%
+ {\doisolatedgroupedalign{\dodoshifted{#1}}{}}
+
+\unexpanded\def\startshift[#1]%
+ {\begingroup
+ \dodoshifted{#1}}
+
+\unexpanded\def\stopshift
+ {\endgroup}
+
+\unexpanded\def\setupshifts
+ {\dodoubleempty\dosetupshifts}
+
+\def\dosetupshifts[#1][#2]% not that efficient
+ {\ifsecondargument
+ \getparameters[\??ra#1][#2]%
+ \dodefineshiftindeed{#1}%
+ \else
+ \getparameters[\??ra][#1]%
+ \the\checkalldefinedshifts
+ \fi}
+
+\setupshifts
+ [\c!method=0,
+ \c!continue=\v!no,
+ \c!dy=0,
+ \c!unit=ex,
+ \c!align=,
+ \c!style=,
+ \c!color=]
+
+\def\v!shiftup {shiftup}
+\def\v!shiftdown{shiftdown}
+
+\defineshift [\v!shiftup] [\c!method=0,\c!dy=-1,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=]
+\defineshift [\v!shiftdown] [\c!method=1,\c!dy=.3,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=]
+
+% we want these always so ...
+
+\expandafter\let\expandafter\shiftup \csname\v!shiftup \endcsname
+\expandafter\let\expandafter\shiftdown \csname\v!shiftdown \endcsname
+
+\protect \endinput
+
+% obsolete:
+
+\setupunderbar
+ [\c!alternative=a,
+ \c!rulethickness=\linewidth,
+ \c!bottomoffset=1.5pt,
+ \c!topoffset=2.5pt,
+ \c!rulecolor=]
diff --git a/tex/context/base/node-seq.lua b/tex/context/base/node-seq.lua
new file mode 100644
index 000000000..3a2cf5b6e
--- /dev/null
+++ b/tex/context/base/node-seq.lua
@@ -0,0 +1,186 @@
+if not modules then modules = { } end modules ['node-seq'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Here we implement a mechanism for chaining the special functions
+that we use in <l n="context"> to deal with mode list processing. We
+assume that namespaces for the functions are used, but for speed we
+use locals to refer to them when compiling the chain.</p>
+--ldx]]--
+
+-- todo: delayed: i.e. we register them in the right order already but delay usage
+
+local format, gsub, concat, gmatch = string.format, string.gsub, table.concat, string.gmatch
+local type, loadstring = type, loadstring
+
+sequencer = sequencer or { }
+
+local function validaction(action)
+ local g = _G
+ for str in gmatch(action,"[^%.]+") do
+ g = g[str]
+ if not g then
+ return false
+ end
+ end
+ return true
+end
+
+function sequencer.reset()
+ return {
+ list = { },
+ order = { },
+ kind = { },
+ askip = { },
+ gskip = { },
+ }
+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,force)
+ local g = t.list[group]
+ if g and (force or validaction(action)) 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,force)
+ local g = t.list[group]
+ if g and (force or validaction(action)) then
+ table.remove_value(g,action)
+ table.insert_after_value(g,where,action)
+ t.kind[action] = kind
+ end
+end
+
+function sequencer.enableaction (t,action) t.askip[action] = false end
+function sequencer.disableaction(t,action) t.askip[action] = true end
+function sequencer.enablegroup (t,group) t.gskip[group] = false end
+function sequencer.disablegroup (t,group) t.gskip[group] = true end
+
+function sequencer.setkind(t,action,kind)
+ t.kind[action] = kind
+end
+
+function sequencer.removeaction(t,group,action,force)
+ local g = t.list[group]
+ if g and (force or validaction(action)) then
+ table.remove_value(g,action)
+ end
+end
+
+function sequencer.compile(t,compiler,n)
+ if type(t) == "string" then
+ -- already compiled
+ elseif compiler then
+ t = compiler(t,n)
+ else
+ t = sequencer.tostring(t)
+ end
+ return loadstring(t)()
+end
+
+local function localize(str)
+ return (gsub(str,"%.","_"))
+end
+
+local template = [[
+%s
+return function(...)
+%s
+end]]
+
+function sequencer.tostring(t)
+ local list, order, kind, gskip, askip = t.list, t.order, t.kind, t.gskip, t.askip
+ local vars, calls, args = { }, { }, nil
+ for i=1,#order do
+ local group = order[i]
+ if not gskip[group] then
+ local actions = list[group]
+ for i=1,#actions do
+ local action = actions[i]
+ if not askip[action] then
+ 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
+ end
+ end
+ return format(template,concat(vars,"\n"),concat(calls,"\n"))
+end
+
+-- we used to deal with tail as well but now that the lists are always
+-- double linked and the kernel function no longer expect tail as
+-- argument we stick to head and done (done can probably also go
+-- as luatex deals with return values efficiently now .. in the
+-- past there was some copying involved, but no longer)
+
+local template = [[
+%s
+return function(head%s)
+ local ok, done = false, false
+%s
+ return head, done
+end]]
+
+function sequencer.nodeprocessor(t,n)
+ local list, order, kind, gskip, askip = t.list, t.order, t.kind, t.gskip, t.askip
+ local vars, calls, args = { }, { }, nil
+ if n == 0 then
+ args = ""
+ elseif n == 1 then
+ args = ",one"
+ elseif n == 2 then
+ args = ",one,two"
+ elseif n == 3 then
+ args = ",one,two,three"
+ elseif n == 4 then
+ args = ",one,two,three,four"
+ elseif n == 5 then
+ args = ",one,two,three,four,five"
+ else
+ args = ",..."
+ end
+ for i=1,#order do
+ local group = order[i]
+ if not gskip[group] then
+ local actions = list[group]
+ for i=1,#actions do
+ local action = actions[i]
+ if not askip[action] then
+ 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%s) done = done or ok -- %s %i",localized,args,group,i)
+ else
+ calls[#calls+1] = format(" head, ok = %s(head%s) done = done or ok -- %s %i",localized,args,group,i)
+ end
+ end
+ end
+ end
+ end
+ local processor = format(template,concat(vars,"\n"),args,concat(calls,"\n"))
+--~ print(processor)
+ return processor
+end
diff --git a/tex/context/base/node-ser.lua b/tex/context/base/node-ser.lua
new file mode 100644
index 000000000..e632e92da
--- /dev/null
+++ b/tex/context/base/node-ser.lua
@@ -0,0 +1,276 @@
+if not modules then modules = { } end modules ['node-ser'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- beware, some field names will change in a next releases
+-- of luatex; this is pretty old code that needs an overhaul
+
+local type, format, concat = type, string.format, table.concat
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+
+local traverse = node.traverse
+local node_fields = node.fields
+local node_type = node.type
+
+local expand = table.tohash {
+ "list", -- list_ptr & ins_ptr & adjust_ptr
+ "pre", --
+ "post", --
+ "spec", -- glue_ptr
+ "top_skip", --
+ "attr", --
+ "replace", -- nobreak
+ "components", -- lig_ptr
+ "box_left", --
+ "box_right", --
+ "glyph", -- margin_char
+ "leader", -- leader_ptr
+ "action", -- action_ptr
+ "value", -- user_defined nodes with subtype 'a' en 'n'
+}
+
+-- page_insert: "height", "last_ins_ptr", "best_ins_ptr"
+-- split_insert: "height", "last_ins_ptr", "best_ins_ptr", "broken_ptr", "broken_ins"
+
+local ignore = table.tohash {
+ "page_insert",
+ "split_insert",
+ "ref_count",
+}
+
+local dimension = table.tohash {
+ "width", "height", "depth", "shift",
+ "stretch", "shrink",
+ "xoffset", "yoffset",
+ "surround",
+ "kern",
+ "box_left_width", "box_right_width"
+}
+
+-- flat: don't use next, but indexes
+-- verbose: also add type
+-- can be sped up
+
+nodes.dimensionfields = dimension
+nodes.listablefields = expand
+nodes.ignorablefields = ignore
+
+-- not ok yet:
+
+function nodes.astable(n,sparse) -- not yet ok
+ local f, t = node_fields(n.id,n.subtype), { }
+ for i=1,#f do
+ local v = f[i]
+ local d = n[v]
+ if d then
+ if ignore[v] or v == "id" then
+ -- skip
+ elseif expand[v] then -- or: type(n[v]) ~= "string" or type(n[v]) ~= "number" or type(n[v]) ~= "table"
+ t[v] = "pointer to list"
+ elseif sparse then
+ if (type(d) == "number" and d ~= 0) or (type(d) == "string" and d ~= "") then
+ t[v] = d
+ end
+ else
+ t[v] = d
+ end
+ end
+ end
+ t.type = node_type(n.id)
+ return t
+end
+
+-- under construction:
+
+local function totable(n,flat,verbose)
+ -- todo: no local function
+ local function to_table(n,flat,verbose)
+ local f = node_fields(n.id,n.subtype)
+ local tt = { }
+ for k=1,#f do
+ local v = f[k]
+ local nv = n[v]
+ if nv then
+ if ignore[v] then
+ -- skip
+ elseif expand[v] then
+ if type(nv) == "number" or type(nv) == "string" then
+ tt[v] = nv
+ else
+ tt[v] = totable(nv,flat,verbose)
+ end
+ elseif type(nv) == "table" then
+ tt[v] = nv -- totable(nv,flat,verbose) -- data
+ else
+ tt[v] = nv
+ end
+ end
+ end
+ if verbose then
+ tt.type = node_type(tt.id)
+ end
+ return tt
+ end
+ if n then
+ if flat then
+ local t = { }
+ while n do
+ t[#t+1] = to_table(n,flat,verbise)
+ n = n.next
+ end
+ return t
+ else
+ local t = to_table(n)
+ if n.next then
+ t.next = totable(n.next,flat,verbose)
+ end
+ return t
+ end
+ else
+ return { }
+ end
+end
+
+nodes.totable = totable
+
+local function key(k)
+ return ((type(k) == "number") and "["..k.."]") or k
+end
+
+-- not ok yet; this will become a module
+
+local function serialize(root,name,handle,depth,m)
+ handle = handle or print
+ if depth then
+ depth = depth .. " "
+ handle(format("%s%s={",depth,key(name)))
+ 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 .. "]={")
+ else
+ handle("t={")
+ end
+ end
+ if root then
+ local fld
+ if root.id then
+ fld = node_fields(root.id,root.subtype) -- we can cache these (todo)
+ else
+ fld = table.sortedkeys(root)
+ end
+ if type(root) == 'table' and root['type'] then -- userdata or table
+ handle(format("%s %s=%q,",depth,'type',root['type']))
+ end
+ for f=1,#fld do
+ local k = fld[f]
+ if k == "ref_count" then
+ -- skip
+ elseif k then
+ local v = root[k]
+ local t = type(v)
+ if t == "number" then
+ if v == 0 then
+ -- skip
+ else
+ handle(format("%s %s=%s,",depth,key(k),v))
+ end
+ elseif t == "string" then
+ if v == "" then
+ -- skip
+ else
+ handle(format("%s %s=%q,",depth,key(k),v))
+ end
+ elseif t == "boolean" then
+ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
+ elseif v then -- userdata or table
+ serialize(v,k,handle,depth,m+1)
+ end
+ end
+ end
+ if root['next'] then -- userdata or table
+ serialize(root['next'],'next',handle,depth,m+1)
+ end
+ end
+ if m and m > 0 then
+ handle(format("%s},",depth))
+ else
+ handle(format("%s}",depth))
+ end
+end
+
+function nodes.serialize(root,name)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ end
+ serialize(root, name, flush, nil, 0)
+ return concat(t,"\n")
+end
+
+function nodes.serializebox(n,flat,verbose,name)
+ return nodes.serialize(nodes.totable(tex.box[n],flat,verbose),name)
+end
+
+function nodes.visualizebox(...)
+ tex.print(ctxcatcodes,"\\starttyping")
+ tex.print(nodes.serializebox(...))
+ tex.print("\\stoptyping")
+end
+
+function nodes.list(head,n) -- name might change to nodes.type
+ if not n then
+ tex.print(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()
+ for p in traverse(q) do
+ local s = table.serialize(nodes.astable(p,sparse),node_type(p.id))
+ l[s] = (l[s] or 0) + 1
+ end
+ node.flush_list(q)
+ for k, v in next, l do
+ texio.write_nl(format("%s * %s", v, k))
+ end
+end
+
diff --git a/tex/context/base/node-shp.lua b/tex/context/base/node-shp.lua
new file mode 100644
index 000000000..50b16efa5
--- /dev/null
+++ b/tex/context/base/node-shp.lua
@@ -0,0 +1,58 @@
+if not modules then modules = { } end modules ['node-shp'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+local disc = node.id('disc')
+local mark = node.id('mark')
+local kern = node.id('kern')
+local glue = node.id('glue')
+
+local free_node = node.free
+local remove_node = node.remove
+
+local function cleanup_page(head) -- rough
+ local start = head
+ while start do
+ local id = start.id
+ if id == disc or (id == glue and not start.writable) or (id == kern and start.kern == 0) or id == mark then
+ head, start, tmp = remove_node(head,start)
+ free_node(tmp)
+ elseif id == hlist or id == vlist then
+ local sl = start.list
+ if sl then
+ start.list = cleanup_page(sl)
+ start = start.next
+ else
+ head, start, tmp = remove_node(head,start)
+ free_node(tmp)
+ end
+ else
+ start = start.next
+ end
+ end
+ return head
+end
+
+nodes.cleanup_page_first = false
+
+function nodes.cleanup_page(head)
+ -- about 10% of the nodes make no sense for the backend
+ if nodes.cleanup_page_first then
+ head = cleanup_page(head)
+ end
+ return head, false
+end
+
+local actions = tasks.actions("shipouts",0) -- no extra arguments
+
+function nodes.process_page(head) -- problem, attr loaded before node, todo ...
+ return actions(head)
+end
+
+--~ nodes.process_page = actions
diff --git a/tex/context/base/node-tex.lua b/tex/context/base/node-tex.lua
new file mode 100644
index 000000000..a6eef3269
--- /dev/null
+++ b/tex/context/base/node-tex.lua
@@ -0,0 +1,39 @@
+if not modules then modules = { } end modules ['node-tex'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+kernel = kernel or { }
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local hyphenate, ligaturing, kerning = lang.hyphenate, node.ligaturing, node.kerning
+
+function kernel.hyphenation(head)
+ -- starttiming(kernel)
+ local done = hyphenate(head)
+ -- stoptiming(kernel)
+ return head, done
+end
+
+function kernel.ligaturing(head)
+ -- starttiming(kernel)
+ local head, tail, done = ligaturing(head) -- todo: check what is returned
+ -- stoptiming(kernel)
+ return head, done
+end
+
+function kernel.kerning(head)
+ -- starttiming(kernel)
+ local head, tail, done = kerning(head) -- todo: check what is returned
+ -- stoptiming(kernel)
+ return head, done
+end
+
+callbacks.register('hyphenate' , false, "normal hyphenation routine, called elsewhere")
+callbacks.register('ligaturing', false, "normal ligaturing routine, called elsewhere")
+callbacks.register('kerning' , false, "normal kerning routine, called elsewhere")
diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua
new file mode 100644
index 000000000..5acd70baf
--- /dev/null
+++ b/tex/context/base/node-tra.lua
@@ -0,0 +1,474 @@
+if not modules then modules = { } end modules ['node-tra'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This is rather experimental. We need more control and some of this
+might become a runtime module instead. This module will be cleaned up!</p>
+--ldx]]--
+
+local utf = unicode.utf8
+local format, match, concat, rep, utfchar = string.format, string.match, table.concat, string.rep, utf.char
+
+local ctxcatcodes = tex.ctxcatcodes
+
+fonts = fonts or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+
+nodes = nodes or { }
+nodes.tracers = nodes.tracers or { }
+nodes.tracers.characters = nodes.tracers.characters or { }
+nodes.tracers.steppers = nodes.tracers.steppers or { }
+
+local glyph = node.id('glyph')
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+local disc = node.id('disc')
+local glue = node.id('glue')
+local kern = node.id('kern')
+local rule = node.id('rule')
+local whatsit = node.id('whatsit')
+
+local copy_node_list = node.copy_list
+local hpack_node_list = node.hpack
+local free_node_list = node.flush_list
+local first_character = node.first_character
+local node_type = node.type
+local traverse_nodes = node.traverse
+
+local texsprint = tex.sprint
+local fontdata = fonts.ids
+
+function nodes.tracers.characters.collect(head,list,tag,n)
+ n = n or 0
+ local ok, fn = false, nil
+ while head do
+ local id = head.id
+ if id == glyph then
+ local f = head.font
+ if f ~= fn then
+ ok, fn = false, f
+ end
+ local c = head.char
+ local i = fontdata[f].indices[c] or 0
+ if not ok then
+ ok = true
+ n = n + 1
+ list[n] = list[n] or { }
+ list[n][tag] = { }
+ end
+ local l = list[n][tag]
+ l[#l+1] = { c, f, i }
+ elseif id == disc then
+ -- skip
+ else
+ ok = false
+ end
+ head = head.next
+ end
+end
+
+function nodes.tracers.characters.equal(ta, tb)
+ if #ta ~= #tb then
+ return false
+ else
+ for i=1,#ta do
+ local a, b = ta[i], tb[i]
+ if a[1] ~= b[1] or a[2] ~= b[2] or a[3] ~= b[3] then
+ return false
+ end
+ end
+ end
+ return true
+end
+
+function nodes.tracers.characters.string(t)
+ local tt = { }
+ for i=1,#t do
+ tt[i] = utfchar(t[i][1])
+ end
+ return concat(tt,"")
+end
+
+function nodes.tracers.characters.unicodes(t,decimal)
+ local tt = { }
+ for i=1,#t do
+ local n = t[i][1]
+ if n == 0 then
+ tt[i] = "-"
+ elseif decimal then
+ tt[i] = n
+ else
+ tt[i] = format("U+%04X",n)
+ end
+ end
+ return concat(tt," ")
+end
+
+function nodes.tracers.characters.indices(t,decimal)
+ local tt = { }
+ for i=1,#t do
+ local n = t[i][3]
+ if n == 0 then
+ tt[i] = "-"
+ elseif decimal then
+ tt[i] = n
+ else
+ tt[i] = format("U+%04X",n)
+ end
+ end
+ return concat(tt," ")
+end
+
+function nodes.tracers.characters.start()
+ local npc = nodes.process_characters
+ local list = { }
+ function nodes.process_characters(head)
+ local n = #list
+ nodes.tracers.characters.collect(head,list,'before',n)
+ local h, d = npc(head)
+ nodes.tracers.characters.collect(head,list,'after',n)
+ if #list > n then
+ list[#list+1] = { }
+ end
+ return h, d
+ end
+ function nodes.tracers.characters.stop()
+ tracers.list['characters'] = list
+ local variables = {
+ ['title'] = 'ConTeXt Character Processing Information',
+ ['color-background-one'] = lmx.get('color-background-yellow'),
+ ['color-background-two'] = lmx.get('color-background-purple'),
+ }
+ lmx.show('context-characters.lmx',variables)
+ nodes.process_characters = npc
+ tasks.restart("processors", "characters")
+ end
+ tasks.restart("processors", "characters")
+end
+
+local stack = { }
+
+function nodes.tracers.start(tag)
+ stack[#stack+1] = tag
+ local tracer = nodes.tracers[tag]
+ if tracer and tracer.start then
+ tracer.start()
+ end
+end
+function nodes.tracers.stop()
+ local tracer = stack[#stack]
+ if tracer and tracer.stop then
+ tracer.stop()
+ end
+ stack[#stack] = nil
+end
+
+-- experimental
+
+local collection, collecting, messages = { }, false, { }
+
+function nodes.tracers.steppers.start()
+ collecting = true
+end
+
+function nodes.tracers.steppers.stop()
+ collecting = false
+end
+
+function nodes.tracers.steppers.reset()
+ for i=1,#collection do
+ local c = collection[i]
+ if c then
+ free_node_list(c)
+ end
+ end
+ collection, messages = { }, { }
+end
+
+function nodes.tracers.steppers.nofsteps()
+ return tex.write(#collection)
+end
+
+function nodes.tracers.steppers.glyphs(n,i)
+ local c = collection[i]
+ if c then
+ tex.box[n] = hpack_node_list(copy_node_list(c))
+ end
+end
+
+function nodes.tracers.steppers.features()
+-- local f = first_character(collection[1])
+-- if f then -- something fishy with first_character
+ local f = collection[1]
+ while f do
+ if f.id == glyph then
+ local tfmdata, t = fontdata[f.font], { }
+ for feature, value in table.sortedhash(tfmdata.shared.features) do
+ if feature == "number" or feature == "features" then
+ -- private
+ elseif type(value) == "boolean" then
+ if value then
+ t[#t+1] = format("%s=yes",feature)
+ else
+ -- skip
+ end
+ else
+ t[#t+1] = format("%s=%s",feature,value)
+ end
+ end
+ if #t > 0 then
+ texsprint(ctxcatcodes,concat(t,", "))
+ else
+ texsprint(ctxcatcodes,"no features")
+ end
+ return
+ end
+ f = f.next
+ end
+end
+
+function nodes.tracers.fontchar(font,char)
+ local n = nodes.glyph()
+ n.font, n.char, n.subtype = font, char, 256
+ node.write(n)
+end
+
+function nodes.tracers.steppers.codes(i,command)
+ local c = collection[i]
+ while c do
+ local id = c.id
+ if id == glyph then
+ if command then
+ texsprint(ctxcatcodes,format("%s{%s}{%s}",command,c.font,c.char))
+ else
+ texsprint(ctxcatcodes,format("[%s:U+%04X]",c.font,c.char))
+ end
+ elseif id == whatsit and (c.subtype == 6 or c.subtype == 7) then
+ texsprint(ctxcatcodes,format("[%s]",c.dir))
+ else
+ texsprint(ctxcatcodes,format("[%s]",node_type(id)))
+ end
+ c = c.next
+ end
+end
+
+function nodes.tracers.steppers.messages(i,command,split)
+ local list = messages[i] -- or { "no messages" }
+ if list then
+ for i=1,#list do
+ local l = list[i]
+ if split then
+ local a, b = match(l,"^(.-)%s*:%s*(.*)$")
+ texsprint(ctxcatcodes,format("%s{%s}{%s}",command,a or l,b or ""))
+ else
+ texsprint(ctxcatcodes,format("%s{%s}",command,l))
+ end
+ end
+ end
+end
+
+-- hooks into the node list processor (see otf)
+
+function nodes.tracers.steppers.check(head)
+ if collecting then
+ nodes.tracers.steppers.reset()
+ local n = copy_node_list(head)
+ nodes.inject_kerns(n,nil,"trace",true)
+ nodes.protect_glyphs(n) -- can be option
+ collection[1] = n
+ end
+end
+
+function nodes.tracers.steppers.register(head)
+ if collecting then
+ local nc = #collection+1
+ if messages[nc] then
+ local n = copy_node_list(head)
+ nodes.inject_kerns(n,nil,"trace",true)
+ nodes.protect_glyphs(n) -- can be option
+ collection[nc] = n
+ end
+ end
+end
+
+function nodes.tracers.steppers.message(str,...)
+ str = format(str,...)
+ if collecting then
+ local n = #collection + 1
+ local m = messages[n]
+ if not m then m = { } messages[n] = m end
+ m[#m+1] = str
+ end
+ return str -- saves an intermediate var in the caller
+end
+
+-- this will be reorganized:
+
+function nodes.show_list(head, message)
+ if message then
+ texio.write_nl(message)
+ end
+ for n in traverse_nodes(head) do
+ texio.write_nl(tostring(n))
+ end
+end
+
+function nodes.check_glyphs(head,message)
+ local t = { }
+ for g in traverse_id(glyph,head) do
+ t[#t+1] = format("U+%04X:%s",g.char,g.subtype)
+ end
+ if #t > 0 then
+ logs.report(message or "nodes","%s glyphs: %s",#t,concat(t," "))
+ end
+ return false
+end
+
+function nodes.tosequence(start,stop,compact)
+ if start then
+ local t = { }
+ while start do
+ local id = start.id
+ if id == glyph then
+ local c = start.char
+ if compact then
+ if start.components then
+ t[#t+1] = nodes.tosequence(start.components,nil,compact)
+ else
+ t[#t+1] = format("%s",utfchar(c))
+ end
+ else
+ t[#t+1] = format("U+%04X:%s",c,utfchar(c))
+ end
+ elseif id == whatsit and start.subtype == 6 or start.subtype == 7 then
+ t[#t+1] = "[" .. start.dir .. "]"
+ elseif id == rule then
+ if compact then
+ t[#t+1] = "|"
+ else
+ t[#t+1] = node_type(id)
+ end
+ else
+ if compact then
+ t[#t+1] = "[]"
+ else
+ t[#t+1] = node_type(id)
+ end
+ end
+ if start == stop then
+ break
+ else
+ start = start.next
+ end
+ end
+ if compact then
+ return concat(t)
+ else
+ return concat(t," ")
+ end
+ else
+ return "[empty]"
+ end
+end
+
+function nodes.report(t,done)
+ if done then
+ if status.output_active then
+ logs.report("nodes","output, changed, %s nodes",nodes.count(t))
+ else
+ texio.write("nodes","normal, changed, %s nodes",nodes.count(t))
+ end
+ else
+ if status.output_active then
+ logs.report("nodes","output, unchanged, %s nodes",nodes.count(t))
+ else
+ texio.write("nodes","normal, unchanged, %s nodes",nodes.count(t))
+ end
+ end
+end
+
+function nodes.pack_list(head)
+ local t = { }
+ for n in traverse(head) do
+ t[#t+1] = tostring(n)
+ end
+ return t
+end
+
+function nodes.ids_to_string(head,tail)
+ local t, last_id, last_n = { }, nil, 0
+ for n in traverse_nodes(head,tail) do -- hm, does not stop at tail
+ local id = n.id
+ if not last_id then
+ last_id, last_n = id, 1
+ elseif last_id == id then
+ last_n = last_n + 1
+ else
+ if last_n > 1 then
+ t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?")
+ else
+ t[#t+1] = format("[%s]",node_type(last_id) or "?")
+ end
+ last_id, last_n = id, 1
+ end
+ if n == tail then
+ break
+ end
+ end
+ if not last_id then
+ t[#t+1] = "no nodes"
+ elseif last_n > 1 then
+ t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?")
+ else
+ t[#t+1] = format("[%s]",node_type(last_id) or "?")
+ end
+ return concat(t," ")
+end
+
+nodes.ids_tostring = nodes.ids_to_string
+
+local function show_simple_list(h,depth,n)
+ while h do
+ texio.write_nl(rep(" ",n) .. tostring(h))
+ if not depth or n < depth then
+ local id = h.id
+ if id == hlist or id == vlist then
+ show_simple_list(h.list,depth,n+1)
+ end
+ end
+ h = h.next
+ end
+end
+
+--~ \startluacode
+--~ callback.register('buildpage_filter',function() nodes.show_simple_list(tex.lists.contrib_head) end)
+--~ \stopluacode
+--~ \vbox{b\footnote{n}a}
+--~ \startluacode
+--~ callback.register('buildpage_filter',nil)
+--~ \stopluacode
+
+nodes.show_simple_list = function(h,depth) show_simple_list(h,depth,0) end
+
+function nodes.list_to_utf(h,joiner)
+ local joiner = (joiner ==true and utfchar(0x200C)) or joiner -- zwnj
+ local w = { }
+ while h do
+ if h.id == glyph then -- always true
+ w[#w+1] = utfchar(h.char)
+ if joiner then
+ w[#w+1] = joiner
+ end
+ else
+ w[#w+1] = "[-]"
+ end
+ h = h.next
+ end
+ return concat(w)
+end
diff --git a/tex/context/base/node-tsk.lua b/tex/context/base/node-tsk.lua
new file mode 100644
index 000000000..206b4a266
--- /dev/null
+++ b/tex/context/base/node-tsk.lua
@@ -0,0 +1,315 @@
+if not modules then modules = { } end modules ['node-tsk'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this might move to task-*
+
+local trace_tasks = false trackers.register("tasks.creation", function(v) trace_tasks = v end)
+
+tasks = tasks or { }
+tasks.data = tasks.data or { }
+
+function tasks.new(name,list)
+ local tasklist = sequencer.reset()
+ tasks.data[name] = { list = tasklist, runner = false }
+ for l=1,#list do
+ sequencer.appendgroup(tasklist,list[l])
+ end
+end
+
+function tasks.restart(name)
+ local data = tasks.data[name]
+ if data then
+ data.runner = false
+ end
+end
+
+function tasks.enableaction(name,action)
+ local data = tasks.data[name]
+ if data then
+ sequencer.enableaction(data.list,action)
+ data.runner = false
+ end
+end
+
+function tasks.disableaction(name,action)
+ local data = tasks.data[name]
+ if data then
+ sequencer.disableaction(data.list,action)
+ data.runner = false
+ end
+end
+
+function tasks.enablegroup(name,group)
+ local data = tasks.data[name]
+ if data then
+ sequencer.enablegroup(data.list,group)
+ data.runner = false
+ end
+end
+
+function tasks.disablegroup(name,group)
+ local data = tasks.data[name]
+ if data then
+ sequencer.disablegroup(data.list,group)
+ data.runner = false
+ end
+end
+
+function tasks.appendaction(name,group,action,where,kind)
+ local data = tasks.data[name]
+ if data then
+ sequencer.appendaction(data.list,group,action,where,kind)
+ data.runner = false
+ end
+end
+
+function tasks.prependaction(name,group,action,where,kind)
+ local data = tasks.data[name]
+ if data then
+ sequencer.prependaction(data.list,group,action,where,kind)
+ data.runner = false
+ end
+end
+
+function tasks.removeaction(name,group,action)
+ local data = tasks.data[name]
+ if data then
+ sequencer.removeaction(data.list,group,action)
+ data.runner = false
+ end
+end
+
+function tasks.showactions(name,group,action,where,kind)
+ local data = tasks.data[name]
+ if data then
+ logs.report("nodes","task %s, list:\n%s",name,sequencer.nodeprocessor(data.list))
+ end
+end
+
+-- Optimizing for the number of arguments makes sense, but getting rid of
+-- the nested call (no problem but then we also need to register the
+-- callback with this mechanism so that it gets updated) does not save
+-- much time (24K calls on mk.tex).
+
+local created, total = 0, 0
+
+statistics.register("node list callback tasks", function()
+ if total > 0 then
+ return string.format("%s unique task lists, %s instances (re)created, %s calls",table.count(tasks.data),created,total)
+ else
+ return nil
+ end
+end)
+
+local compile, nodeprocessor = sequencer.compile, sequencer.nodeprocessor
+
+function tasks.actions(name,n) -- we optimize for the number or arguments (no ...)
+ local data = tasks.data[name]
+ if data then
+ if n == 0 then
+ return function(head)
+ local runner = data.runner
+ total = total + 1 -- will go away
+ if not runner then
+ created = created + 1
+ if trace_tasks then
+ logs.report("nodes","creating task runner '%s'",name)
+ end
+ runner = compile(data.list,nodeprocessor,0)
+ data.runner = runner
+ end
+ return runner(head)
+ end
+ elseif n == 1 then
+ return function(head,one)
+ total = total + 1 -- will go away
+ local runner = data.runner
+ if not runner then
+ created = created + 1
+ if trace_tasks then
+ logs.report("nodes","creating task runner '%s' with 1 extra arguments",name)
+ end
+ runner = compile(data.list,nodeprocessor,1)
+ data.runner = runner
+ end
+ return runner(head,one)
+ end
+ elseif n == 2 then
+ return function(head,one,two)
+ total = total + 1 -- will go away
+ local runner = data.runner
+ if not runner then
+ created = created + 1
+ if trace_tasks then
+ logs.report("nodes","creating task runner '%s' with 2 extra arguments",name)
+ end
+ runner = compile(data.list,nodeprocessor,2)
+ data.runner = runner
+ end
+ return runner(head,one,two)
+ end
+ elseif n == 3 then
+ return function(head,one,two,three)
+ total = total + 1 -- will go away
+ local runner = data.runner
+ if not runner then
+ created = created + 1
+ if trace_tasks then
+ logs.report("nodes","creating task runner '%s' with 3 extra arguments",name)
+ end
+ runner = compile(data.list,nodeprocessor,3)
+ data.runner = runner
+ end
+ return runner(head,one,two,three)
+ end
+ elseif n == 4 then
+ return function(head,one,two,three,four)
+ total = total + 1 -- will go away
+ local runner = data.runner
+ if not runner then
+ created = created + 1
+ if trace_tasks then
+ logs.report("nodes","creating task runner '%s' with 4 extra arguments",name)
+ end
+ runner = compile(data.list,nodeprocessor,4)
+ data.runner = runner
+ end
+ return runner(head,one,two,three,four)
+ end
+ elseif n == 5 then
+ return function(head,one,two,three,four,five)
+ total = total + 1 -- will go away
+ local runner = data.runner
+ if not runner then
+ created = created + 1
+ if trace_tasks then
+ logs.report("nodes","creating task runner '%s' with 5 extra arguments",name)
+ end
+ runner = compile(data.list,nodeprocessor,5)
+ data.runner = runner
+ end
+ return runner(head,one,two,three,four,five)
+ end
+ else
+ return function(head,...)
+ total = total + 1 -- will go away
+ local runner = data.runner
+ if not runner then
+ created = created + 1
+ if trace_tasks then
+ logs.report("nodes","creating task runner '%s' with n extra arguments",name)
+ end
+ runner = compile(data.list,nodeprocessor,"n")
+ data.runner = runner
+ end
+ return runner(head,...)
+ end
+ end
+ else
+ return nil
+ end
+end
+
+function tasks.table(name) --maybe move this to task-deb.lua
+ local tsk = tasks.data[name]
+ local lst = tsk and tsk.list
+ local HL, NC, NR, bold, type = context.HL, context.NC, context.NR, context.bold, context.type
+ if lst then
+ local list, order = lst.list, lst.order
+ if list and order then
+ context.starttabulate { "|l|l|" }
+ NC() bold("category") NC() bold("function") NC() NR()
+ for i=1,#order do
+ HL()
+ local o = order[i]
+ local l = list[o]
+ if #l == 0 then
+ NC() type(o) NC() context("unset") NC() NR()
+ else
+ local done = false
+ for k, v in table.sortedhash(l) do
+ NC() if not done then type(o) done = true end NC() type(v) NC() NR()
+ end
+ end
+ end
+ context.stoptabulate()
+ end
+ end
+end
+
+tasks.new (
+ "processors",
+ {
+ "before", -- for users
+ "normalizers",
+ "characters",
+ "words",
+ "fonts",
+ "lists",
+ "after", -- for users
+ }
+)
+
+tasks.new (
+ "finalizers",
+ {
+ "before", -- for users
+ "normalizers",
+-- "characters",
+-- "finishers",
+ "fonts",
+ "lists",
+ "after", -- for users
+ }
+)
+
+tasks.new (
+ "shipouts",
+ {
+ "before", -- for users
+ "normalizers",
+ "finishers",
+ "after", -- for users
+ }
+)
+
+tasks.new (
+ "mvlbuilders",
+ {
+ "before", -- for users
+ "normalizers",
+ "after", -- for users
+ }
+)
+
+tasks.new (
+ "vboxbuilders",
+ {
+ "before", -- for users
+ "normalizers",
+ "after", -- for users
+ }
+)
+
+--~ tasks.new (
+--~ "parbuilders",
+--~ {
+--~ "before", -- for users
+--~ "lists",
+--~ "after", -- for users
+--~ }
+--~ )
+
+--~ tasks.new (
+--~ "pagebuilders",
+--~ {
+--~ "before", -- for users
+--~ "lists",
+--~ "after", -- for users
+--~ }
+--~ )
diff --git a/tex/context/base/node-tst.lua b/tex/context/base/node-tst.lua
new file mode 100644
index 000000000..d7ea96f26
--- /dev/null
+++ b/tex/context/base/node-tst.lua
@@ -0,0 +1,119 @@
+if not modules then modules = { } end modules ['node-tst'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local glue = node.id("glue")
+local penalty = node.id("penalty")
+local kern = node.id("kern")
+local glyph = node.id("glyph")
+local whatsit = node.id("whatsit")
+local hlist = node.id("hlist")
+
+local find_node_tail = node.tail or node.slide
+
+local chardata = characters.data
+
+function nodes.the_left_margin(n) -- todo: three values
+ while n do
+ local id = n.id
+ if id == glue then
+ if n.subtype == 8 then -- 7 in c/web source
+ return n.spec.width
+ else
+ return 0
+ end
+ elseif id == whatsit then
+ n = n.next
+ elseif id == hlist then
+ return n.width
+ else
+ break
+ end
+ end
+ return 0
+end
+
+function nodes.the_right_margin(n)
+ if n then
+ n = find_node_tail(n)
+ while n do
+ local id = n.id
+ if id == glue then
+ if n.subtype == 9 then -- 8 in the c/web source
+ return n.spec.width
+ else
+ return 0
+ end
+ elseif id == whatsit then
+ n = n.prev
+ else
+ break
+ end
+ end
+ end
+ return false
+end
+
+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 = chardata[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
+
+function nodes.is_display_math(head)
+ local n = head.prev
+ while n do
+ local id = n.id
+ if id == penalty then
+ elseif id == glue then
+ if n.subtype == 6 then -- above_display_short_skip
+ return true
+ end
+ else
+ break
+ end
+ n = n.prev
+ end
+ n = head.next
+ while n do
+ local id = n.id
+ if id == penalty then
+ elseif id == glue then
+ if n.subtype == 7 then -- below_display_short_skip
+ return true
+ end
+ else
+ break
+ end
+ n = n.next
+ end
+ return false
+end
diff --git a/tex/context/base/node-typ.lua b/tex/context/base/node-typ.lua
new file mode 100644
index 000000000..5ab6b6975
--- /dev/null
+++ b/tex/context/base/node-typ.lua
@@ -0,0 +1,53 @@
+if not modules then modules = { } end modules ['node-typ'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this will be replaced by blob-ini cum suis so typesetting will go away
+
+local utfvalues = string.utfvalues
+
+local newglyph = nodes.glyph
+local newglue = nodes.glue
+
+local hpack, vpack = node.hpack, node.vpack
+
+typesetting = typesetting or { }
+
+local function tonodes(str,fontid,spacing) -- don't use this
+ local head, prev = nil, nil
+ for s in utfvalues(str) do
+ local next
+ if spacing and s == 32 then
+ next = newglue(spacing or 64*1024*10)
+ else
+ next = newglyph(fontid or 1,s)
+ end
+ if not head then
+ head = next
+ else
+ prev.next = next
+ next.prev = prev
+ end
+ prev = next
+ end
+ return head
+end
+
+typesetting.tonodes = tonodes
+
+function typesetting.hpack(str,fontid,spacing)
+ return hpack(tonodes(str,fontid,spacing))
+end
+
+function typesetting.vpack(str,fontid,spacing)
+ -- vpack is just a hack, and a proper implentation is on the agenda
+ -- as it needs more info etc than currently available
+ return vpack(tonodes(str,fontid,spacing))
+end
+
+--~ node.write(typesetting.hpack("Hello World!"))
+--~ node.write(typesetting.hpack("Hello World!",1,100*1024*10))
diff --git a/tex/context/base/norm-alo.tex b/tex/context/base/norm-alo.tex
new file mode 100644
index 000000000..d47f49037
--- /dev/null
+++ b/tex/context/base/norm-alo.tex
@@ -0,0 +1,36 @@
+%D \module
+%D [ file=norm-alo,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\ALEPH\ and \OMEGA,
+%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.
+
+%D This file will become obsolete!
+
+% omega primitives
+
+\let\textdir = \textdir
+\let\pagedir = \pagedir
+\let\mathdir = \mathdir
+\let\pardir = \pardir
+\let\bodydir = \bodydir
+\let\leftghost = \leftghost
+\let\rightghost = \rightghost
+\let\localleftbox = \localleftbox
+\let\localrightbox = \localrightbox
+\let\localinterlinepenalty = \localinterlinepenalty
+\let\localbrokenpenalty = \localbrokenpenalty
+
+% aleph primitives
+
+\let\boxdir = \boxdir
+\let\pagebottomoffset = \pagebottomoffset
+\let\pagerightoffset = \pagerightoffset
+
+\endinput
diff --git a/tex/context/base/norm-ctx.tex b/tex/context/base/norm-ctx.tex
new file mode 100644
index 000000000..707705d89
--- /dev/null
+++ b/tex/context/base/norm-ctx.tex
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=norm-ctx,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\ALEPH\ and \OMEGA,
+%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.
+
+%D A few more might end up here (like the weird ones in syst-ini).
+
+\let\normalreqno = \normaleqno
diff --git a/tex/context/base/norm-etx.tex b/tex/context/base/norm-etx.tex
new file mode 100644
index 000000000..3edd8e7ef
--- /dev/null
+++ b/tex/context/base/norm-etx.tex
@@ -0,0 +1,79 @@
+%D \module
+%D [ file=norm-etx,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\ETEX,
+%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.
+
+% etex primitives
+
+\let \normalbotmarks = \botmarks
+\let \normalclubpenalties = \clubpenalties
+\let \normalcurrentgrouplevel = \currentgrouplevel
+\let \normalcurrentgrouptype = \currentgrouptype
+\let \normalcurrentifbranch = \currentifbranch
+\let \normalcurrentiflevel = \currentiflevel
+\let \normalcurrentiftype = \currentiftype
+\let \normaldetokenize = \detokenize
+\let \normaldimexpr = \dimexpr
+\let \normaldisplaywidowpenalties = \displaywidowpenalties
+\let \normaleTeXVersion = \eTeXVersion
+\let \normaleTeXminorversion = \eTeXminorversion
+\let \normaleTeXrevision = \eTeXrevision
+\let \normaleTeXversion = \eTeXversion
+\let \normaleveryeof = \everyeof
+\let \normalfirstmarks = \firstmarks
+\let \normalfontchardp = \fontchardp
+\let \normalfontcharht = \fontcharht
+\let \normalfontcharic = \fontcharic
+\let \normalfontcharwd = \fontcharwd
+\let \normalglueexpr = \glueexpr
+\let \normalglueshrink = \glueshrink
+\let \normalglueshrinkorder = \glueshrinkorder
+\let \normalgluestretch = \gluestretch
+\let \normalgluestretchorder = \gluestretchorder
+\let \normalgluetomu = \gluetomu
+\let \normalifcsname = \ifcsname
+\let \normalifdefined = \ifdefined
+\let \normaliffontchar = \iffontchar
+\let \normalinteractionmode = \interactionmode
+\let \normalinterlinepenalties = \interlinepenalties
+\let \normallastlinefit = \lastlinefit
+\let \normallastnodetype = \lastnodetype
+\let \normalmarks = \marks
+\let \normalmuexpr = \muexpr
+\let \normalmutoglue = \mutoglue
+\let \normalnumexpr = \numexpr
+\let \normalpagediscards = \pagediscards
+\let \normalparshapedimen = \parshapedimen
+\let \normalparshapeindent = \parshapeindent
+\let \normalparshapelength = \parshapelength
+\let \normalpredisplaydirection = \predisplaydirection
+\let \normalprotected = \protected
+\let \normalreadline = \readline
+\let \normalsavinghyphcodes = \savinghyphcodes
+\let \normalsavingvdiscards = \savingvdiscards
+\let \normalscantokens = \scantokens
+\let \normalshowgroups = \showgroups
+\let \normalshowifs = \showifs
+\let \normalshowtokens = \showtokens
+\let \normalsplitbotmarks = \splitbotmarks
+\let \normalsplitdiscards = \splitdiscards
+\let \normalsplitfirstmarks = \splitfirstmarks
+\let \normaltopmarks = \topmarks
+\let \normaltracingassigns = \tracingassigns
+\let \normaltracinggroups = \tracinggroups
+\let \normaltracingifs = \tracingifs
+\let \normaltracingnesting = \tracingnesting
+\let \normaltracingscantokens = \tracingscantokens
+\let \normalunexpanded = \unexpanded
+\let \normalunless = \unless
+\let \normalwidowpenalties = \widowpenalties
+
+\endinput
diff --git a/tex/context/base/norm-ltx.tex b/tex/context/base/norm-ltx.tex
new file mode 100644
index 000000000..a779735dd
--- /dev/null
+++ b/tex/context/base/norm-ltx.tex
@@ -0,0 +1,177 @@
+%D \module
+%D [ file=norm-ltx,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\LUATEX,
+%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.
+
+%D This file will become obsolete!
+
+% luatex primitives (incomplete)
+
+\let \normalUdelcode = \Udelcode
+\let \normalUdelcodenum = \Udelcodenum
+\let \normalUdelimiter = \Udelimiter
+\let \normalUmathaccent = \Umathaccent
+\let \normalUmathaccents = \Umathaccents
+\let \normalUmathaxis = \Umathaxis
+\let \normalUmathbinbinspacing = \Umathbinbinspacing
+\let \normalUmathbinclosespacing = \Umathbinclosespacing
+\let \normalUmathbininnerspacing = \Umathbininnerspacing
+\let \normalUmathbinopenspacing = \Umathbinopenspacing
+\let \normalUmathbinopspacing = \Umathbinopspacing
+\let \normalUmathbinordspacing = \Umathbinordspacing
+\let \normalUmathbinpunctspacing = \Umathbinpunctspacing
+\let \normalUmathbinrelspacing = \Umathbinrelspacing
+\let \normalUmathbotaccent = \Umathbotaccent
+\let \normalUmathchar = \Umathchar
+\let \normalUmathchardef = \Umathchardef
+\let \normalUmathcharnum = \Umathcharnum
+\let \normalUmathclosebinspacing = \Umathclosebinspacing
+\let \normalUmathcloseclosespacing = \Umathcloseclosespacing
+\let \normalUmathcloseinnerspacing = \Umathcloseinnerspacing
+\let \normalUmathcloseopenspacing = \Umathcloseopenspacing
+\let \normalUmathcloseopspacing = \Umathcloseopspacing
+\let \normalUmathcloseordspacing = \Umathcloseordspacing
+\let \normalUmathclosepunctspacing = \Umathclosepunctspacing
+\let \normalUmathcloserelspacing = \Umathcloserelspacing
+\let \normalUmathcode = \Umathcode
+\let \normalUmathcodenum = \Umathcodenum
+\let \normalUmathconnectoroverlapmin = \Umathconnectoroverlapmin
+\let \normalUmathfractiondelsize = \Umathfractiondelsize
+\let \normalUmathfractiondenomdown = \Umathfractiondenomdown
+\let \normalUmathfractiondenomvgap = \Umathfractiondenomvgap
+\let \normalUmathfractionnumup = \Umathfractionnumup
+\let \normalUmathfractionnumvgap = \Umathfractionnumvgap
+\let \normalUmathfractionrule = \Umathfractionrule
+\let \normalUmathinnerbinspacing = \Umathinnerbinspacing
+\let \normalUmathinnerclosespacing = \Umathinnerclosespacing
+\let \normalUmathinnerinnerspacing = \Umathinnerinnerspacing
+\let \normalUmathinneropenspacing = \Umathinneropenspacing
+\let \normalUmathinneropspacing = \Umathinneropspacing
+\let \normalUmathinnerordspacing = \Umathinnerordspacing
+\let \normalUmathinnerpunctspacing = \Umathinnerpunctspacing
+\let \normalUmathinnerrelspacing = \Umathinnerrelspacing
+\let \normalUmathlimitabovebgap = \Umathlimitabovebgap
+\let \normalUmathlimitabovekern = \Umathlimitabovekern
+\let \normalUmathlimitabovevgap = \Umathlimitabovevgap
+\let \normalUmathlimitdownbgap = \Umathlimitdownbgap
+\let \normalUmathlimitdownkern = \Umathlimitdownkern
+\let \normalUmathlimitdownvgap = \Umathlimitdownvgap
+\let \normalUmathopbinspacing = \Umathopbinspacing
+\let \normalUmathopclosespacing = \Umathopclosespacing
+\let \normalUmathopenbinspacing = \Umathopenbinspacing
+\let \normalUmathopenclosespacing = \Umathopenclosespacing
+\let \normalUmathopeninnerspacing = \Umathopeninnerspacing
+\let \normalUmathopenopenspacing = \Umathopenopenspacing
+\let \normalUmathopenopspacing = \Umathopenopspacing
+\let \normalUmathopenordspacing = \Umathopenordspacing
+\let \normalUmathopenpunctspacing = \Umathopenpunctspacing
+\let \normalUmathopenrelspacing = \Umathopenrelspacing
+\let \normalUmathoperatorsize = \Umathoperatorsize
+\let \normalUmathopinnerspacing = \Umathopinnerspacing
+\let \normalUmathopopenspacing = \Umathopopenspacing
+\let \normalUmathopopspacing = \Umathopopspacing
+\let \normalUmathopordspacing = \Umathopordspacing
+\let \normalUmathoppunctspacing = \Umathoppunctspacing
+\let \normalUmathoprelspacing = \Umathoprelspacing
+\let \normalUmathordbinspacing = \Umathordbinspacing
+\let \normalUmathordclosespacing = \Umathordclosespacing
+\let \normalUmathordinnerspacing = \Umathordinnerspacing
+\let \normalUmathordopenspacing = \Umathordopenspacing
+\let \normalUmathordopspacing = \Umathordopspacing
+\let \normalUmathordordspacing = \Umathordordspacing
+\let \normalUmathordpunctspacing = \Umathordpunctspacing
+\let \normalUmathordrelspacing = \Umathordrelspacing
+\let \normalUmathoverbarkern = \Umathoverbarkern
+\let \normalUmathoverbarrule = \Umathoverbarrule
+\let \normalUmathoverbarvgap = \Umathoverbarvgap
+\let \normalUmathoverdelimiterbgap = \Umathoverdelimiterbgap
+\let \normalUmathoverdelimitervgap = \Umathoverdelimitervgap
+\let \normalUmathpunctbinspacing = \Umathpunctbinspacing
+\let \normalUmathpunctclosespacing = \Umathpunctclosespacing
+\let \normalUmathpunctinnerspacing = \Umathpunctinnerspacing
+\let \normalUmathpunctopenspacing = \Umathpunctopenspacing
+\let \normalUmathpunctopspacing = \Umathpunctopspacing
+\let \normalUmathpunctordspacing = \Umathpunctordspacing
+\let \normalUmathpunctpunctspacing = \Umathpunctpunctspacing
+\let \normalUmathpunctrelspacing = \Umathpunctrelspacing
+\let \normalUmathquad = \Umathquad
+\let \normalUmathradicaldegreeafter = \Umathradicaldegreeafter
+\let \normalUmathradicaldegreebefore = \Umathradicaldegreebefore
+\let \normalUmathradicaldegreeraise = \Umathradicaldegreeraise
+\let \normalUmathradicalkern = \Umathradicalkern
+\let \normalUmathradicalrule = \Umathradicalrule
+\let \normalUmathradicalvgap = \Umathradicalvgap
+\let \normalUmathrelbinspacing = \Umathrelbinspacing
+\let \normalUmathrelclosespacing = \Umathrelclosespacing
+\let \normalUmathrelinnerspacing = \Umathrelinnerspacing
+\let \normalUmathrelopenspacing = \Umathrelopenspacing
+\let \normalUmathrelopspacing = \Umathrelopspacing
+\let \normalUmathrelordspacing = \Umathrelordspacing
+\let \normalUmathrelpunctspacing = \Umathrelpunctspacing
+\let \normalUmathrelrelspacing = \Umathrelrelspacing
+\let \normalUmathspaceafterscript = \Umathspaceafterscript
+\let \normalUmathstackdenomdown = \Umathstackdenomdown
+\let \normalUmathstacknumup = \Umathstacknumup
+\let \normalUmathstackvgap = \Umathstackvgap
+\let \normalUmathsubshiftdown = \Umathsubshiftdown
+\let \normalUmathsubshiftdrop = \Umathsubshiftdrop
+\let \normalUmathsubsupshiftdown = \Umathsubsupshiftdown
+\let \normalUmathsubsupvgap = \Umathsubsupvgap
+\let \normalUmathsubtopmax = \Umathsubtopmax
+\let \normalUmathsupbottommin = \Umathsupbottommin
+\let \normalUmathsupshiftdrop = \Umathsupshiftdrop
+\let \normalUmathsupshiftup = \Umathsupshiftup
+\let \normalUmathsupsubbottommax = \Umathsupsubbottommax
+\let \normalUmathunderbarkern = \Umathunderbarkern
+\let \normalUmathunderbarrule = \Umathunderbarrule
+\let \normalUmathunderbarvgap = \Umathunderbarvgap
+\let \normalUmathunderdelimiterbgap = \Umathunderdelimiterbgap
+\let \normalUmathunderdelimitervgap = \Umathunderdelimitervgap
+\let \normalUoverdelimiter = \Uoverdelimiter
+\let \normalUradical = \Uradical
+\let \normalUroot = \Uroot
+\let \normalUunderdelimiter = \Uunderdelimiter
+\let \normalattribute = \attribute
+\let \normalattributedef = \attributedef
+\let \normalcatcodetable = \catcodetable
+\let \normalclearmarks = \clearmarks
+\let \normalcrampeddisplaystyle = \crampeddisplaystyle
+\let \normalcrampedscriptscriptstyle = \crampedscriptscriptstyle
+\let \normalcrampedscriptstyle = \crampedscriptstyle
+\let \normalcrampedtextstyle = \crampedtextstyle
+\let \normalformatname = \formatname
+\let \normalifabsdim = \ifabsdim
+\let \normalifabsnum = \ifabsnum
+\let \normalifprimitive = \ifprimitive
+\let \normalinitcatcodetable = \initcatcodetable
+\let \normallatelua = \latelua
+\let \normalluaescapestring = \luaescapestring
+\let \normalluastartup = \luastartup
+\let \normalluatexdatestamp = \luatexdatestamp
+\let \normalluatexrevision = \luatexrevision
+\let \normalluatexversion = \luatexversion
+\let \normalnokerns = \nokerns
+\let \normalnoligs = \noligs
+\let \normalpageleftoffset = \pageleftoffset
+\let \normalpagetopoffset = \pagetopoffset
+\let \normalpostexhyphenchar = \postexhyphenchar
+\let \normalposthyphenchar = \posthyphenchar
+\let \normalpreexhyphenchar = \preexhyphenchar
+\let \normalprehyphenchar = \prehyphenchar
+\let \normalprimitive = \primitive
+\let \normalsavecatcodetable = \savecatcodetable
+\let \normalscantextokens = \scantextokens
+\let \normalsuppressfontnotfounderror = \suppressfontnotfounderror
+\let \normalsuppressifcsnameerror = \suppressifcsnameerror
+\let \normalsuppresslongerror = \suppresslongerror
+\let \normalsynctex = \synctex
+
+\endinput
diff --git a/tex/context/base/norm-ptx.tex b/tex/context/base/norm-ptx.tex
new file mode 100644
index 000000000..8f911d874
--- /dev/null
+++ b/tex/context/base/norm-ptx.tex
@@ -0,0 +1,130 @@
+%D \module
+%D [ file=norm-ptx,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\PDFTEX,
+%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.
+
+\let \normalefcode = \efcode
+\let \normalexpanded = \expanded
+\let \normalifincsname = \ifincsname
+\let \normalifpdfabsdim = \ifpdfabsdim
+\let \normalifpdfabsnum = \ifpdfabsnum
+\let \normalifpdfprimitive = \ifpdfprimitive
+\let \normalleftmarginkern = \leftmarginkern
+\let \normalletterspacefont = \letterspacefont
+\let \normallpcode = \lpcode
+\let \normalpdfadjustspacing = \pdfadjustspacing
+\let \normalpdfannot = \pdfannot
+\let \normalpdfcatalog = \pdfcatalog
+\let \normalpdfcolorstack = \pdfcolorstack
+\let \normalpdfcolorstackinit = \pdfcolorstackinit
+\let \normalpdfcompresslevel = \pdfcompresslevel
+\let \normalpdfcopyfont = \pdfcopyfont
+\let \normalpdfcreationdate = \pdfcreationdate
+\let \normalpdfdecimaldigits = \pdfdecimaldigits
+\let \normalpdfdest = \pdfdest
+\let \normalpdfdestmargin = \pdfdestmargin
+\let \normalpdfdraftmode = \pdfdraftmode
+\let \normalpdfeachlinedepth = \pdfeachlinedepth
+\let \normalpdfeachlineheight = \pdfeachlineheight
+\let \normalpdfendlink = \pdfendlink
+\let \normalpdfendthread = \pdfendthread
+\let \normalpdffirstlineheight = \pdffirstlineheight
+\let \normalpdffontattr = \pdffontattr
+\let \normalpdffontexpand = \pdffontexpand
+\let \normalpdffontname = \pdffontname
+\let \normalpdffontobjnum = \pdffontobjnum
+\let \normalpdffontsize = \pdffontsize
+\let \normalpdfforcepagebox = \pdfforcepagebox % obsolete
+\let \normalpdfgamma = \pdfgamma
+\let \normalpdfgentounicode = \pdfgentounicode
+\let \normalpdfglyphtounicode = \pdfglyphtounicode
+\let \normalpdfhorigin = \pdfhorigin
+\let \normalpdfignoreddimen = \pdfignoreddimen
+\let \normalpdfimageapplygamma = \pdfimageapplygamma
+\let \normalpdfimagegamma = \pdfimagegamma
+\let \normalpdfimagehicolor = \pdfimagehicolor
+\let \normalpdfimageresolution = \pdfimageresolution
+\let \normalpdfincludechars = \pdfincludechars
+\let \normalpdfinclusioncopyfonts = \pdfinclusioncopyfonts
+\let \normalpdfinclusionerrorlevel = \pdfinclusionerrorlevel
+\let \normalpdfinfo = \pdfinfo
+\let \normalpdfinsertht = \pdfinsertht
+\let \normalpdflastannot = \pdflastannot
+\let \normalpdflastlinedepth = \pdflastlinedepth
+\let \normalpdflastlink = \pdflastlink
+\let \normalpdflastobj = \pdflastobj
+\let \normalpdflastxform = \pdflastxform
+\let \normalpdflastximage = \pdflastximage
+\let \normalpdflastximagecolordepth = \pdflastximagecolordepth
+\let \normalpdflastximagepages = \pdflastximagepages
+\let \normalpdflastxpos = \pdflastxpos
+\let \normalpdflastypos = \pdflastypos
+\let \normalpdflinkmargin = \pdflinkmargin
+\let \normalpdfliteral = \pdfliteral
+\let \normalpdfmapfile = \pdfmapfile
+\let \normalpdfmapline = \pdfmapline
+\let \normalpdfminorversion = \pdfminorversion
+\let \normalpdfmovechars = \pdfmovechars % obsolete
+\let \normalpdfnames = \pdfnames
+\let \normalpdfnoligatures = \pdfnoligatures
+\let \normalpdfnormaldeviate = \pdfnormaldeviate
+\let \normalpdfobj = \pdfobj
+\let \normalpdfobjcompresslevel = \pdfobjcompresslevel
+\let \normalpdfoptionalwaysusepdfpagebox = \pdfoptionalwaysusepdfpagebox % obsolete
+\let \normalpdfoptionpdfinclusionerrorlevel = \pdfoptionpdfinclusionerrorlevel % obsolete
+\let \normalpdfoptionpdfminorversion = \pdfoptionpdfminorversion
+\let \normalpdfoutline = \pdfoutline
+\let \normalpdfoutput = \pdfoutput
+\let \normalpdfpageattr = \pdfpageattr
+\let \normalpdfpagebox = \pdfpagebox
+\let \normalpdfpageheight = \pdfpageheight
+\let \normalpdfpageref = \pdfpageref
+\let \normalpdfpageresources = \pdfpageresources
+\let \normalpdfpagesattr = \pdfpagesattr
+\let \normalpdfpagewidth = \pdfpagewidth
+\let \normalpdfpkmode = \pdfpkmode
+\let \normalpdfpkresolution = \pdfpkresolution
+\let \normalpdfprimitive = \pdfprimitive
+\let \normalpdfprotrudechars = \pdfprotrudechars
+\let \normalpdfpxdimen = \pdfpxdimen
+\let \normalpdfrandomseed = \pdfrandomseed
+\let \normalpdfrefobj = \pdfrefobj
+\let \normalpdfrefxform = \pdfrefxform
+\let \normalpdfrefximage = \pdfrefximage
+\let \normalpdfreplacefont = \pdfreplacefont
+\let \normalpdfrestore = \pdfrestore
+\let \normalpdfretval = \pdfretval
+\let \normalpdfsave = \pdfsave
+\let \normalpdfsavepos = \pdfsavepos
+\let \normalpdfsetmatrix = \pdfsetmatrix
+\let \normalpdfsetrandomseed = \pdfsetrandomseed
+\let \normalpdfstartlink = \pdfstartlink
+\let \normalpdfstartthread = \pdfstartthread
+\let \normalpdftexbanner = \pdftexbanner
+\let \normalpdftexrevision = \pdftexrevision
+\let \normalpdftexversion = \pdftexversion
+\let \normalpdfthread = \pdfthread
+\let \normalpdfthreadmargin = \pdfthreadmargin
+\let \normalpdftracingfonts = \pdftracingfonts
+\let \normalpdftrailer = \pdftrailer
+\let \normalpdfuniformdeviate = \pdfuniformdeviate
+\let \normalpdfuniqueresname = \pdfuniqueresname
+\let \normalpdfvorigin = \pdfvorigin
+\let \normalpdfxform = \pdfxform
+\let \normalpdfxformname = \pdfxformname
+\let \normalpdfximage = \pdfximage
+\let \normalpdfximagebbox = \pdfximagebbox
+\let \normalquitvmode = \quitvmode
+\let \normalrightmarginkern = \rightmarginkern
+\let \normalrpcode = \rpcode
+\let \normaltagcode = \tagcode
+
+\endinput
diff --git a/tex/context/base/norm-tex.tex b/tex/context/base/norm-tex.tex
new file mode 100644
index 000000000..61f9740ef
--- /dev/null
+++ b/tex/context/base/norm-tex.tex
@@ -0,0 +1,351 @@
+%D \module
+%D [ file=norm-etx,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\TEX,
+%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.
+
+%D Since \LUATEX\ can generate these lists internally it started
+%D to make sense to cleanup this \type {\normalstuff} for \MKII\ as
+%D well. The tables are generated with a \LUA\ script.
+
+% tex primitives
+
+% Beware, we already redefined \dump, \outer and \everyjob !
+
+% \normal = \
+% \normal- = \-
+% \normal/ = \/
+\let \normalabove = \above
+\let \normalabovedisplayshortskip = \abovedisplayshortskip
+\let \normalabovedisplayskip = \abovedisplayskip
+\let \normalabovewithdelims = \abovewithdelims
+\let \normalaccent = \accent
+\let \normaladjdemerits = \adjdemerits
+\let \normaladvance = \advance
+\let \normalafterassignment = \afterassignment
+\let \normalaftergroup = \aftergroup
+\let \normalatop = \atop
+\let \normalatopwithdelims = \atopwithdelims
+\let \normalbadness = \badness
+\let \normalbaselineskip = \baselineskip
+\let \normalbatchmode = \batchmode
+\let \normalbegingroup = \begingroup
+\let \normalbelowdisplayshortskip = \belowdisplayshortskip
+\let \normalbelowdisplayskip = \belowdisplayskip
+\let \normalbinoppenalty = \binoppenalty
+\let \normalbotmark = \botmark
+\let \normalbox = \box
+\let \normalboxmaxdepth = \boxmaxdepth
+\let \normalbrokenpenalty = \brokenpenalty
+\let \normalcatcode = \catcode
+\let \normalchar = \char
+\let \normalchardef = \chardef
+\let \normalcleaders = \cleaders
+\let \normalclosein = \closein
+\let \normalcloseout = \closeout
+\let \normalclubpenalty = \clubpenalty
+\let \normalcopy = \copy
+\let \normalcount = \count
+\let \normalcountdef = \countdef
+\let \normalcr = \cr
+\let \normalcrcr = \crcr
+\let \normalcsname = \csname
+\let \normalday = \day
+\let \normaldeadcycles = \deadcycles
+\let \normaldef = \def
+\let \normaldefaulthyphenchar = \defaulthyphenchar
+\let \normaldefaultskewchar = \defaultskewchar
+\let \normaldelcode = \delcode
+\let \normaldelimiter = \delimiter
+\let \normaldelimiterfactor = \delimiterfactor
+\let \normaldelimitershortfall = \delimitershortfall
+\let \normaldimen = \dimen
+\let \normaldimendef = \dimendef
+\let \normaldirectlua = \directlua
+\let \normaldiscretionary = \discretionary
+\let \normaldisplayindent = \displayindent
+\let \normaldisplaylimits = \displaylimits
+\let \normaldisplaystyle = \displaystyle
+\let \normaldisplaywidowpenalty = \displaywidowpenalty
+\let \normaldisplaywidth = \displaywidth
+\let \normaldivide = \divide
+\let \normaldoublehyphendemerits = \doublehyphendemerits
+\let \normaldp = \dp
+% \normaldump = \dump
+\let \normaledef = \edef
+\let \normalelse = \else
+\let \normalemergencystretch = \emergencystretch
+\let \normalend = \end
+\let \normalendcsname = \endcsname
+\let \normalendgroup = \endgroup
+\let \normalendinput = \endinput
+\let \normalendlinechar = \endlinechar
+\let \normaleqno = \eqno
+\let \normalerrhelp = \errhelp
+\let \normalerrmessage = \errmessage
+\let \normalerrorcontextlines = \errorcontextlines
+\let \normalerrorstopmode = \errorstopmode
+\let \normalescapechar = \escapechar
+\let \normaleverycr = \everycr
+\let \normaleverydisplay = \everydisplay
+\let \normaleveryhbox = \everyhbox
+% \normaleveryjob = \everyjob
+\let \normaleverymath = \everymath
+\let \normaleverypar = \everypar
+\let \normaleveryvbox = \everyvbox
+\let \normalexhyphenchar = \exhyphenchar
+\let \normalexhyphenpenalty = \exhyphenpenalty
+\let \normalexpandafter = \expandafter
+\let \normalfam = \fam
+\let \normalfi = \fi
+\let \normalfinalhyphendemerits = \finalhyphendemerits
+\let \normalfirstmark = \firstmark
+\let \normalfloatingpenalty = \floatingpenalty
+\let \normalfont = \font
+\let \normalfontdimen = \fontdimen
+\let \normalfontname = \fontname
+\let \normalfuturelet = \futurelet
+\let \normalgdef = \gdef
+\let \normalglobal = \global
+\let \normalglobaldefs = \globaldefs
+\let \normalhalign = \halign
+\let \normalhangafter = \hangafter
+\let \normalhangindent = \hangindent
+\let \normalhbadness = \hbadness
+\let \normalhbox = \hbox
+\let \normalhfil = \hfil
+\let \normalhfill = \hfill
+\let \normalhfilneg = \hfilneg
+\let \normalhfuzz = \hfuzz
+\let \normalhoffset = \hoffset
+\let \normalholdinginserts = \holdinginserts
+\let \normalhrule = \hrule
+\let \normalhsize = \hsize
+\let \normalhskip = \hskip
+\let \normalhss = \hss
+\let \normalht = \ht
+\let \normalhyphenation = \hyphenation
+\let \normalhyphenchar = \hyphenchar
+\let \normalhyphenpenalty = \hyphenpenalty
+\let \normalif = \if
+\let \normalifcase = \ifcase
+\let \normalifcat = \ifcat
+\let \normalifdim = \ifdim
+\let \normalifeof = \ifeof
+\let \normaliffalse = \iffalse
+\let \normalifhbox = \ifhbox
+\let \normalifhmode = \ifhmode
+\let \normalifinner = \ifinner
+\let \normalifmmode = \ifmmode
+\let \normalifnum = \ifnum
+\let \normalifodd = \ifodd
+\let \normaliftrue = \iftrue
+\let \normalifvbox = \ifvbox
+\let \normalifvmode = \ifvmode
+\let \normalifvoid = \ifvoid
+\let \normalifx = \ifx
+\let \normalignorespaces = \ignorespaces
+\let \normalimmediate = \immediate
+\let \normalindent = \indent
+% \normalinput = \input
+\let \normalinputlineno = \inputlineno
+\let \normalinsert = \insert
+\let \normalinsertpenalties = \insertpenalties
+\let \normalinterlinepenalty = \interlinepenalty
+\let \normaljobname = \jobname
+\let \normalkern = \kern
+\let \normallanguage = \language
+\let \normallastbox = \lastbox
+\let \normallastkern = \lastkern
+\let \normallastpenalty = \lastpenalty
+\let \normallastskip = \lastskip
+\let \normallccode = \lccode
+\let \normalleaders = \leaders
+\let \normalleft = \left
+\let \normallefthyphenmin = \lefthyphenmin
+\let \normalleftskip = \leftskip
+\let \normalleqno = \leqno
+\let \normallet = \let
+\let \normallimits = \limits
+\let \normallinepenalty = \linepenalty
+\let \normallineskip = \lineskip
+\let \normallineskiplimit = \lineskiplimit
+\let \normallong = \long
+\let \normallooseness = \looseness
+\let \normallower = \lower
+\let \normallowercase = \lowercase
+\let \normalmag = \mag
+\let \normalmark = \mark
+\let \normalmathaccent = \mathaccent
+\let \normalmathbin = \mathbin
+\let \normalmathchar = \mathchar
+\let \normalmathchardef = \mathchardef
+\let \normalmathchoice = \mathchoice
+\let \normalmathclose = \mathclose
+\let \normalmathcode = \mathcode
+\let \normalmathinner = \mathinner
+\let \normalmathop = \mathop
+\let \normalmathopen = \mathopen
+\let \normalmathord = \mathord
+\let \normalmathpunct = \mathpunct
+\let \normalmathrel = \mathrel
+\let \normalmathsurround = \mathsurround
+\let \normalmaxdeadcycles = \maxdeadcycles
+\let \normalmaxdepth = \maxdepth
+\let \normalmeaning = \meaning
+\let \normalmedmuskip = \medmuskip
+\let \normalmessage = \message
+\let \normalmiddle = \middle
+\let \normalmkern = \mkern
+\let \normalmonth = \month
+\let \normalmoveleft = \moveleft
+\let \normalmoveright = \moveright
+\let \normalmskip = \mskip
+\let \normalmultiply = \multiply
+\let \normalmuskip = \muskip
+\let \normalmuskipdef = \muskipdef
+\let \normalnewlinechar = \newlinechar
+\let \normalnoalign = \noalign
+\let \normalnoboundary = \noboundary
+\let \normalnoexpand = \noexpand
+\let \normalnoindent = \noindent
+\let \normalnolimits = \nolimits
+\let \normalnonscript = \nonscript
+\let \normalnonstopmode = \nonstopmode
+\let \normalnulldelimiterspace = \nulldelimiterspace
+\let \normalnullfont = \nullfont
+\let \normalnumber = \number
+\let \normalomit = \omit
+\let \normalopenin = \openin
+\let \normalopenout = \openout
+\let \normalor = \or
+% \normalouter = \outer
+\let \normaloutput = \output
+\let \normaloutputpenalty = \outputpenalty
+\let \normalover = \over
+\let \normaloverfullrule = \overfullrule
+\let \normaloverline = \overline
+\let \normaloverwithdelims = \overwithdelims
+\let \normalpagedepth = \pagedepth
+\let \normalpagefilllstretch = \pagefilllstretch
+\let \normalpagefillstretch = \pagefillstretch
+\let \normalpagefilstretch = \pagefilstretch
+\let \normalpagegoal = \pagegoal
+\let \normalpageshrink = \pageshrink
+\let \normalpagestretch = \pagestretch
+\let \normalpagetotal = \pagetotal
+\let \normalpar = \par
+\let \normalparfillskip = \parfillskip
+\let \normalparindent = \parindent
+\let \normalparshape = \parshape
+\let \normalparskip = \parskip
+\let \normalpatterns = \patterns
+\let \normalpausing = \pausing
+\let \normalpenalty = \penalty
+\let \normalpostdisplaypenalty = \postdisplaypenalty
+\let \normalpredisplaypenalty = \predisplaypenalty
+\let \normalpredisplaysize = \predisplaysize
+\let \normalpretolerance = \pretolerance
+\let \normalprevdepth = \prevdepth
+\let \normalprevgraf = \prevgraf
+\let \normalradical = \radical
+\let \normalraise = \raise
+\let \normalread = \read
+\let \normalrelax = \relax
+\let \normalrelpenalty = \relpenalty
+\let \normalright = \right
+\let \normalrighthyphenmin = \righthyphenmin
+\let \normalrightskip = \rightskip
+\let \normalromannumeral = \romannumeral
+\let \normalscriptfont = \scriptfont
+\let \normalscriptscriptfont = \scriptscriptfont
+\let \normalscriptscriptstyle = \scriptscriptstyle
+\let \normalscriptspace = \scriptspace
+\let \normalscriptstyle = \scriptstyle
+\let \normalscrollmode = \scrollmode
+\let \normalsetbox = \setbox
+\let \normalsetlanguage = \setlanguage
+\let \normalsfcode = \sfcode
+\let \normalshipout = \shipout
+\let \normalshow = \show
+\let \normalshowbox = \showbox
+\let \normalshowboxbreadth = \showboxbreadth
+\let \normalshowboxdepth = \showboxdepth
+\let \normalshowlists = \showlists
+\let \normalshowthe = \showthe
+\let \normalskewchar = \skewchar
+\let \normalskip = \skip
+\let \normalskipdef = \skipdef
+\let \normalspacefactor = \spacefactor
+\let \normalspaceskip = \spaceskip
+\let \normalspan = \span
+\let \normalspecial = \special
+\let \normalsplitbotmark = \splitbotmark
+\let \normalsplitfirstmark = \splitfirstmark
+\let \normalsplitmaxdepth = \splitmaxdepth
+\let \normalsplittopskip = \splittopskip
+\let \normalstring = \string
+\let \normaltabskip = \tabskip
+\let \normaltextfont = \textfont
+\let \normaltextstyle = \textstyle
+\let \normalthe = \the
+\let \normalthickmuskip = \thickmuskip
+\let \normalthinmuskip = \thinmuskip
+\let \normaltime = \time
+\let \normaltoks = \toks
+\let \normaltoksdef = \toksdef
+\let \normaltolerance = \tolerance
+\let \normaltopmark = \topmark
+\let \normaltopskip = \topskip
+\let \normaltracingcommands = \tracingcommands
+\let \normaltracinglostchars = \tracinglostchars
+\let \normaltracingmacros = \tracingmacros
+\let \normaltracingonline = \tracingonline
+\let \normaltracingoutput = \tracingoutput
+\let \normaltracingpages = \tracingpages
+\let \normaltracingparagraphs = \tracingparagraphs
+\let \normaltracingrestores = \tracingrestores
+\let \normaltracingstats = \tracingstats
+\let \normaluccode = \uccode
+\let \normaluchyph = \uchyph
+\let \normalunderline = \underline
+\let \normalunhbox = \unhbox
+\let \normalunhcopy = \unhcopy
+\let \normalunkern = \unkern
+\let \normalunpenalty = \unpenalty
+\let \normalunskip = \unskip
+\let \normalunvbox = \unvbox
+\let \normalunvcopy = \unvcopy
+\let \normaluppercase = \uppercase
+\let \normalvadjust = \vadjust
+\let \normalvalign = \valign
+\let \normalvbadness = \vbadness
+\let \normalvbox = \vbox
+\let \normalvcenter = \vcenter
+\let \normalvfil = \vfil
+\let \normalvfill = \vfill
+\let \normalvfilneg = \vfilneg
+\let \normalvfuzz = \vfuzz
+\let \normalvoffset = \voffset
+\let \normalvrule = \vrule
+\let \normalvsize = \vsize
+\let \normalvskip = \vskip
+\let \normalvsplit = \vsplit
+\let \normalvss = \vss
+\let \normalvtop = \vtop
+\let \normalwd = \wd
+\let \normalwidowpenalty = \widowpenalty
+\let \normalwrite = \write
+\let \normalxdef = \xdef
+\let \normalxleaders = \xleaders
+\let \normalxspaceskip = \xspaceskip
+\let \normalyear = \year
+
+\endinput
diff --git a/tex/context/base/norm-xtx.tex b/tex/context/base/norm-xtx.tex
new file mode 100644
index 000000000..3da944656
--- /dev/null
+++ b/tex/context/base/norm-xtx.tex
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=norm-xtx,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\XETEX,
+%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.
+
+% xetex primitives
+
+% nothing yet (also defined pdftex primitives)
+
+\endinput
diff --git a/tex/context/base/pack-bar.mkiv b/tex/context/base/pack-bar.mkiv
new file mode 100644
index 000000000..05afd32d0
--- /dev/null
+++ b/tex/context/base/pack-bar.mkiv
@@ -0,0 +1,67 @@
+%D \module
+%D [ file=pack-bar,
+%D version=2009.06.26,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Bars,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Bars}
+
+%D This code has been moved from scrn-int to here (was some old
+%D experimental code). It could be in scrn-bar but it's static.
+
+\unprotect
+
+%D \startbuffer
+%D \dorecurse{10}
+%D {\horizontalpositionbar
+%D \pos\recurselevel \min1 \max10
+%D \token\framed{\recurselevel}%
+%D \\}
+%D
+%D \hbox to 15em
+%D {\hss
+%D \dorecurse{10}
+%D {\verticalpositionbar\pos\recurselevel\min1\max10\token\blackrule\\
+%D \hss}}
+%D \stopbuffer
+
+\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\%
+ {\hbox to \hsize
+ {\hskip\zeropoint\!!plus #1\!!fill
+ \hskip\zeropoint\!!plus-#2\!!fill
+ #4\relax
+ \hskip\zeropoint\!!plus #3\!!fill
+ \hskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalpositionbar\pos#1\min#2\max#3\token#4\\%
+ {\vbox to \vsize
+ {\vskip\zeropoint\!!plus #1\!!fill
+ \vskip\zeropoint\!!plus-#2\!!fill
+ \hbox{#4}\relax
+ \vskip\zeropoint\!!plus #3\!!fill
+ \vskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\horizontalgrowingbar\pos#1\min#2\max#3\height#4\depth#5\\%
+ {\hbox to \hsize
+ {\scratchcounter\numexpr#1-#2+\plusone\relax
+ \leaders\vrule\hskip\zeropoint\!!plus \scratchcounter\!!fill
+ \vrule\!!width\zeropoint\!!height#4\!!depth#5%
+ \hskip\zeropoint\!!plus #3\!!fill
+ \hskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalgrowingbar\pos#1\min#2\max#3\width#4\\%
+ {\vbox to \vsize
+ {\scratchcounter\numexpr#1-#2+\plusone\relax
+ \leaders\hrule\vskip\zeropoint\!!plus\scratchcounter\!!fill
+ \hrule\!!width#4\!!height\zeropoint\!!depth\zeropoint
+ \vskip\zeropoint\!!plus #3\!!fill
+ \vskip\zeropoint\!!plus-#1\!!fill}}
+
+\protect \endinput
diff --git a/tex/context/base/pack-box.mkii b/tex/context/base/pack-box.mkii
new file mode 100644
index 000000000..8adeedb91
--- /dev/null
+++ b/tex/context/base/pack-box.mkii
@@ -0,0 +1,954 @@
+%D \module
+%D [ file=pack-box,
+%D version=2002.04.12,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Boxes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Boxes}
+
+%D This module contains all kind of macros for moving content
+%D around. Many macros here come from other modules, but
+%D depencies made it more clear to isolate them.
+
+% \placeornament
+
+\unprotect
+
+% \definelayer[\v!tekst-2][\c!positie=\v!ja]
+% \definelayer[\v!tekst-1][\c!positie=\v!ja]
+% \definelayer[\v!tekst+1][\c!positie=\v!ja]
+% \definelayer[\v!tekst+2][\c!positie=\v!ja]
+
+% we need to set the size, else we get dimensions depending
+% on the content, which in itsel fis ok, but can lead to loops
+% due to rounding errors (happened in demo-obv)
+
+\definelayer[\v!text-2][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+\definelayer[\v!text-1][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+\definelayer[\v!text+1][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+\definelayer[\v!text+2][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+
+\def\internaltextoverlay#1% will become more generic and installable
+ {\startoverlay % i.e. probably an overlay by itself
+ {\positionoverlay{\v!text#1}} % see later
+ {\composedlayer {\v!text#1}}
+ \stopoverlay}
+
+%\def\internaltextoverlay#1%
+% {\hbox to \zeropoint{\positionoverlay{\v!tekst#1}\hss}%
+% \composedlayer{\v!tekst#1}}
+
+% todo: share info, so that tuo will be smaller
+
+\defineoverlay[\v!text-2][\internaltextoverlay{-2}]
+\defineoverlay[\v!text-1][\internaltextoverlay{-1}]
+\defineoverlay[\v!text+1][\internaltextoverlay{+1}]
+\defineoverlay[\v!text+2][\internaltextoverlay{+2}]
+
+% to be documented
+
+\definelayer[anchor]
+
+\def\anchor
+ {\dosingleargument\doanchor}
+
+\def\doanchor[#1]%
+ {\ifundefined{\??an#1}\@EA\dodoanchor\else\@EA\nonoanchor\fi[#1]}
+
+\def\nonoanchor[#1]%
+ {\getvalue{\??an#1}}
+
+\def\dodoanchor[#1]%
+ {\dotripleempty\dododoanchor[#1]}
+
+\def\dododoanchor
+ {\ifthirdargument
+ \expandafter\dodoanchorT
+ \else
+ \expandafter\dodoanchorS
+ \fi}
+
+\def\dodoanchorS[#1][#2][#3]%
+ {\dodoanchorT[#1][#2][#2]}
+
+\def\dodoanchorT[#1][#2][#3]%
+ {\dowithnextbox
+ {\bgroup
+ \checktextbackgrounds
+ \setbox\scratchbox\null
+ \wd\scratchbox\nextboxwd
+ \ht\scratchbox\nextboxht
+ \dp\scratchbox\nextboxdp
+ \setlayer
+ [anchor]
+ [\c!width=\wd\scratchbox,
+ \c!height=\ht\scratchbox,
+ \c!offset=\!!zeropoint,
+ #2,#3]
+ {\setlayer[#1]{\flushnextbox}}%
+ \framed
+ [#2,
+ \c!background=anchor,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off,
+ #3]
+ {\box\scratchbox}%
+ \egroup}%
+ \vbox}
+
+\def\defineanchor
+ {\doquadrupleempty\dodefineanchor}
+
+\def\dodefineanchor[#1][#2][#3][#4]%
+ {\setvalue{\??an#1}{\dodefinedanchor[#2][#3][#4]}}
+
+\def\dodefinedanchor[#1][#2][#3]%
+ {\def\docommand[##1][##2]%
+ {\ifsecondargument
+ \def\next{\dodoanchorT[#1][#2,##1][#3,##2]}%
+ \else\iffirstargument
+ \def\next{\dodoanchorT[#1][#2,##1][#2,##1]}%
+ \else
+ \def\next{\dodoanchorT[#1][#2][#3]}%
+ \fi\fi
+ \next}%
+ \dodoubleempty\docommand}
+
+\def\@@collectorbox{@@collectorbox}
+
+\def\definecollector
+ {\dodoubleargument\dodefinecollector}
+
+\def\dodefinecollector[#1][#2]%
+ {\ifundefined{\@@collectorbox#1}%
+ \expandafter\newbox\csname\@@collectorbox#1\endcsname
+ \fi
+ \resetcollector[#1]%
+ \setupcollector
+ [#1]
+ [\c!state=\v!start,
+ \c!x=\!!zeropoint,\c!y=\!!zeropoint,
+ \c!offset=\!!zeropoint,\c!rotation=, % geen 0 !
+ \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
+ \c!location=rb,\c!corner=,#2]}
+
+\def\setupcollector
+ {\dodoubleargument\dosetupcollector}
+
+\def\dosetupcollector[#1][#2]%
+ {\def\docommand##1{\getparameters[\??cb##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\def\setcollector
+ {\dodoubleargument\dosetcollector}
+
+\def\dosetcollector[#1][#2]%
+ {\bgroup
+ \forgetall
+ \dontcomplain
+ \dowithnextbox
+ {\ifundefined{\@@collectorbox#1}%
+ \writestatus{collector}{unknown layer #1}%
+ \else
+ \dodosetcollector[#1][#2]%
+ \fi
+ \egroup}
+ \hbox}
+
+\def\collectorparameter#1{\csname\??cb\currentcollector#1\endcsname}
+
+\def\dodosetcollector[#1][#2]% todo: keep reference point
+ {\def\currentcollector{#1}%
+ \mathchardef\collectorbox\csname\@@collectorbox#1\endcsname
+ \getparameters[\??cb#1][#2]%
+ \@@layerxsiz\wd\collectorbox
+ \@@layerysiz\ht\collectorbox
+ \doifvaluesomething{\??cb#1\c!rotation}
+ {\setbox\nextbox\hbox
+ {\rotate
+ [\c!location=\v!high,
+ \c!rotation=\collectorparameter\c!rotation]
+ {\flushnextbox}}}%
+ \advance\@@layerysiz\dp\collectorbox
+ \@@layerxpos\collectorparameter\c!x
+ \advance\@@layerxpos\collectorparameter\c!hoffset
+ \@@layerypos\collectorparameter\c!y
+ \advance\@@layerypos\collectorparameter\c!voffset
+ \doifelse\v!middle{\collectorparameter\c!corner}
+ {\ifdim\@@layerxsiz>\zeropoint
+ \advance\@@layerxpos.5\@@layerxsiz
+ \fi
+ \ifdim\@@layerysiz>\zeropoint
+ \advance\@@layerypos.5\@@layerysiz
+ \fi}%
+ {\ExpandBothAfter\doifinset\v!bottom{\collectorparameter\c!corner}
+ {\ifdim\@@layerysiz>\zeropoint
+ \advance\@@layerypos-\@@layerysiz
+ \@@layerypos-\@@layerypos
+ \fi}%
+ \ExpandBothAfter\doifinset\v!right{\collectorparameter\c!corner}
+ {\ifdim\@@layerxsiz>\zeropoint
+ \advance\@@layerxpos-\@@layerxsiz
+ \@@layerxpos-\@@layerxpos
+ \fi}}%
+ \setbox\nextbox\hbox
+ {\alignedbox[\collectorparameter\c!location]\vbox{\flushnextbox}}%
+ \boxmaxdepth\zeropoint % really needed, nice example
+ \global\advance\boxhdisplacement\@@layerxpos
+ \ifdim\boxhdisplacement<\zeropoint
+ \global\setbox\collectorbox\hbox
+ {\hskip-\boxhdisplacement
+ \box\collectorbox}%
+ \fi
+ \global\advance\boxvdisplacement\@@layerypos
+ \ifdim\boxvdisplacement<\zeropoint
+ \global\setbox\collectorbox\hbox
+ {\lower-\boxvdisplacement
+ \box\collectorbox}%
+ \fi
+ \@@layerxsiz\wd\collectorbox
+ \@@layerysiz\ht\collectorbox
+ \advance\@@layerysiz\dp\collectorbox
+ \global\setbox\collectorbox\hbox
+ {\box\collectorbox
+ \hskip-\@@layerxsiz
+ \hskip\@@layerxpos\relax
+ \ifdim\boxhdisplacement<\zeropoint
+ \hskip-\boxhdisplacement
+ \fi
+ \lower\@@layerypos\hbox
+ {\ifdim\boxvdisplacement<\zeropoint
+ \lower-\boxvdisplacement\flushnextbox
+ \else
+ \flushnextbox
+ \fi}}%
+ % combine height and depth into depth only (later flushed as height)
+ \global\setbox\collectorbox\hbox
+ {\lower\ht\collectorbox\box\collectorbox}%
+ % just to be sure
+ \ifdim\wd\collectorbox<\@@layerxsiz
+ \global\wd\collectorbox\@@layerxsiz
+ \fi}
+
+\def\flushcollector[#1]%
+ {\ifundefined{\@@collectorbox#1}%
+ \writestatus{collector}{unknown collector #1}%
+ \else
+ \doifnotvalue{\??cb#1\c!state}\v!stop
+ {\vbox
+ {\hbox
+ {\doifelsevalue{\??cb#1\c!state}\v!repeat
+ {\let\next\copy}{\let\next\box}%
+ \raise\dp\csname\@@collectorbox#1\endcsname
+ \next\csname\@@collectorbox#1\endcsname}}}%
+ \fi}
+
+\def\composedcollector#1{\flushcollector[#1]}
+
+\def\resetcollector[#1]%
+ {\ifundefined{\@@collectorbox#1}\else
+ \global\setbox\csname\@@collectorbox#1\endcsname\emptybox
+ \fi}
+
+\def\adaptcollector
+ {\dodoubleargument\doadaptcollector}
+
+\def\doadaptcollector[#1][#2]%
+ {\bgroup
+ \def\currentcollector{#1}%
+ \mathchardef\collectorbox\csname\@@collectorbox#1\endcsname
+ \getparameters
+ [\??cb#1][\c!voffset=\zeropoint,\c!hoffset=\zeropoint,#2]%
+ \scratchdimen\wd\collectorbox
+ \advance\scratchdimen\collectorparameter\c!hoffset
+ \global\wd\collectorbox\scratchdimen
+ \scratchdimen\ht\collectorbox
+ \advance\scratchdimen\collectorparameter\c!voffset
+ \global\ht\collectorbox\scratchdimen
+ \egroup}
+
+%\definecollector[test]
+%\setcollector[test]
+% [location=rb]
+% {\externalfigure[koe][frame=on,width=3cm]}
+%\setcollector[test]
+% [corner={right,bottom},location={left,top}]
+% {\framed{gans}}
+%\composedcollector{test}
+
+\definecollector
+ [caption]
+
+\def\collectedtext
+ {\dodoubleempty\docollectedtext}
+
+\def\docollectedtext[#1][#2]#3%
+ {\bgroup
+ \dowithnextbox
+ {\setcollector
+ [caption]
+ {\flushnextbox}%
+ \setcollector
+ [caption][#1]
+ {\getparameters[\??du][#2]%
+ \dosetfontattribute\??du\c!style\setupinterlinespace
+ \framed % watch the special setting of kader/overlay
+ [\c!frame=\v!overlay,#2]
+ {\doattributes\??du\c!style\c!color{#3}}}%
+ \composedcollector{caption}%
+ \egroup}%
+ \hbox}
+
+% \collectedtext
+% [corner={right,bottom},location={left,top}]
+% [background=color,backgroundcolor=white,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \collectedtext
+% [rotation=90,corner={right,bottom},location={right,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \collectedtext
+% [rotation=90,corner={left,bottom},location={left,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+
+\definelayer
+ [caption]
+
+\def\layeredtext
+ {\dodoubleempty\dolayeredtext}
+
+\def\dolayeredtext[#1][#2]#3%
+ {\bgroup
+ \dowithnextbox
+ {\!!widtha \nextboxwd
+ \!!heighta\nextboxht
+ \bgroup % preserve \nextbox
+ \setuplayer
+ [caption]
+ [\c!width=\!!widtha,\c!height=\!!heighta]%
+ \setlayer
+ [caption]
+ [#1]
+ {\getparameters[\??du][#2]%
+ \dosetfontattribute\??du\c!style\setupinterlinespace
+ \framed
+ [\c!frame=\v!overlay,,#2]
+ {\doattributes\??du\c!style\c!color{#3}}}%
+ \egroup
+ \framed
+ [\c!offset=\v!overlay,
+ \c!frame=\v!off,
+ \c!background={\v!foreground,caption},
+ \c!width=\!!widtha,
+ \c!height=\!!heighta]
+ {\flushnextbox}%
+ \egroup}%
+ \hbox}
+
+% \layeredtext
+% [corner={right,bottom},location={left,top}]
+% [background=color,backgroundcolor=white,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \layeredtext
+% [rotation=90,corner={right,bottom},location={right,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \layeredtext
+% [rotation=90,corner={left,bottom},location={left,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+
+\def\ornamenttext
+ {\dodoubleempty\doornamenttext}
+
+\def\doornamenttext[#1][#2]%
+ {\bgroup
+ \doifassignmentelse{#1}
+ {\getparameters[\s!dummy][\c!alternative=\v!a,#1]%
+ \doifelse\dummyalternative\v!a
+ {\egroup\collectedtext}%
+ {\egroup\layeredtext }%
+ [#1][#2]}%
+ {\egroup\getvalue{#1}}}
+
+\def\defineornament
+ {\dotripleempty\dodefineornament}
+
+\def\dodefineornament[#1][#2][#3]%
+ {\setvalue{#1}{\doornamenttext[#2][#3]}}
+
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={right,top},
+% hoffset=-.25ex]
+% [frame=on,background=color,backgroundcolor=red,offset=0pt]
+%
+% \ruledhbox{\affiliation{gans}{\externalfigure[koe][width=3cm]}}
+%
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={right,top},
+% hoffset=-.25ex,alternative=b]
+% [frame=on,background=color,backgroundcolor=red,offset=0pt]
+%
+% \ruledhbox{\affiliation{gans}{\externalfigure[koe][width=3cm]}}
+%
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={left,top},
+% hoffset=.25ex,voffset=.25ex,alternative=a]
+% [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt]
+%
+% \affiliation{photo}{\externalfigure[molen][width=3cm]}
+%
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={left,top},
+% hoffset=.25ex,voffset=.25ex,alternative=b]
+% [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt]
+%
+% \affiliation{drawing}{\externalfigure[hakker][width=3cm]}
+
+% pas op: aanpassen aan nieuwe layer hoek ankers en columnset
+
+\newcount\nofbleeds % per pag
+
+\def\setupbleeding
+ {\dodoubleempty\getparameters[\??bg]}
+
+\setupbleeding
+ [\c!location=l,
+ \c!stretch=\v!yes,
+ \c!width=3cm,
+ \c!height=3cm,
+ \c!offset=2mm,
+ \c!page=\v!no,
+ \c!voffset=\@@bgoffset,
+ \c!hoffset=\@@bgoffset]
+
+\def\bleed
+ {\dosingleempty\dobleed}
+
+
+\def\bleedwidth {\the\hsize}%
+\def\bleedheight{\the\vsize}%
+
+\def\dobleed[#1]#2%
+ {\hbox\bgroup
+ \xdef\bleedwidth {\the\hsize}%
+ \xdef\bleedheight{\the\vsize}%
+ \global\advance\nofbleeds\plusone
+ \getparameters[\??bg][#1]%
+ \!!doneafalse % left
+ \!!donebfalse % right
+ \!!donecfalse % top
+ \!!donedfalse % bottom
+ % replace this part ! todo: default location
+ \processaction
+ [\@@bglocation]
+ [ t=>\!!donectrue\let\@@bghoffset\!!zeropoint,
+ b=>\!!donedtrue\let\@@bghoffset\!!zeropoint,
+ l=>\!!doneatrue\let\@@bgvoffset\!!zeropoint,
+ r=>\!!donebtrue\let\@@bgvoffset\!!zeropoint,
+ bl=>\!!doneatrue\!!donedtrue,
+ lb=>\!!doneatrue\!!donedtrue,
+ br=>\!!donebtrue\!!donedtrue,
+ rb=>\!!donebtrue\!!donedtrue,
+ tl=>\!!doneatrue\!!donectrue,
+ lt=>\!!doneatrue\!!donectrue,
+ tr=>\!!donebtrue\!!donectrue,
+ rt=>\!!donebtrue\!!donectrue]%
+ \doifelse\@@bgstretch\v!yes\donetrue\donefalse
+ \scratchdimen\@@bgwidth
+ \ifdone
+ \if!!donea
+ \advance\scratchdimen\MPx{\??bg:\number\nofbleeds}%
+ \else\if!!doneb
+ \scratchdimen\paperwidth
+ \advance\scratchdimen-\MPx{\??bg:\number\nofbleeds}%
+ \fi\fi
+ \fi
+ \advance\scratchdimen\@@bghoffset
+ \xdef\bleedwidth{\the\scratchdimen}%
+ \scratchdimen\@@bgheight
+ \ifdone
+ \if!!donec
+ \scratchdimen\paperheight
+ \advance\scratchdimen-\MPy{\??bg:\number\nofbleeds}%
+ \else\if!!doned
+ \advance\scratchdimen\MPy{\??bg:\number\nofbleeds}%
+ \fi\fi
+ \fi
+ \advance\scratchdimen\@@bgvoffset
+ \xdef\bleedheight{\the\scratchdimen}%
+ \hsize\bleedwidth
+ \vsize\bleedheight
+ \setbox\scratchbox\hbox{#2}%
+ \doif\@@bgpage\v!yes
+ {\setbox\scratchbox\topskippedbox{\box\scratchbox}}%
+ \setbox\scratchbox\hbox to \@@bgwidth
+ {\if!!donea\hss\fi\box\scratchbox\if!!doneb\hss\fi}%
+ \if!!doned
+ \setbox\scratchbox\hbox
+ {\lower\bleedheight\hbox{\raise\@@bgheight\box\scratchbox}}%
+ \fi
+ \wd\scratchbox\@@bgwidth
+ \ht\scratchbox\@@bgheight
+ \dp\scratchbox\zeropoint
+ \ifdone
+ \hpos{\??bg:\number\nofbleeds}{\box\scratchbox}%
+ \else
+ \box\scratchbox
+ \fi
+ \egroup}
+
+\setupbleeding[\c!stretch=\v!yes]
+
+\defineexternalfigure[bleed][\c!width=\bleedwidth,\c!height=\bleedheight]
+
+% \placefigure[left]{none}
+% {\bleed[width=5cm,height=3cm,location=lt]{\externalfigure[koe][bleed]}}
+%
+% \input tufte
+%
+% \placefigure[left]{none}
+% {\bleed[width=5cm,height=3cm,location=l]{\externalfigure[koe][bleed]}}
+%
+% \input tufte
+%
+% \placefigure[right]{none}
+% {\bleed[width=5cm,height=3cm,location=r]{\externalfigure[koe][bleed]}}
+%
+% \input tufte
+%
+% \placesomefloat[right]{none}
+% {\bleed[width=5cm,height=3cm,location=rb]{\externalfigure[koe][bleed]}}
+%
+% \input tufte
+%
+% \placefigure
+% [top,none]
+% {} % no caption
+% {\bleed
+% [hoffset=-\backspace,
+% voffset=3mm,
+% width=0cm,
+% height=6\lineheight,
+% page=yes, % correct for topskip
+% location=lt]
+% {\externalfigure[koe][bleed][frame=on]}}
+
+% \setlayerframed[layer id][layer settings][framed setting]{data}
+% \setlayerframed[layer id][combined settings]{data}
+
+\def\setlayerframed
+ {\dotripleempty\dosetlayerframed}
+
+\def\dosetlayerframed
+ {\ifthirdargument
+ \expandafter\dosetlayerframedT
+ \else
+ \expandafter\dosetlayerframedS
+ \fi}
+
+\def\dosetlayerframedT[#1][#2][#3]%
+ {\dowithnextbox{\setlayer[#1][#2]{\flushnextbox}}%
+ \hbox\framed[#3]}
+
+\def\dosetlayerframedS[#1][#2][#3]%
+ {\dowithnextbox
+ {\setlayer
+ [#1]
+ [\c!width=\nextboxwd,\c!height=\nextboxht,
+ \c!offset=\!!zeropoint,#2]
+ {\flushnextbox}}%
+ \hbox\framed[\c!location=\v!normal,#2]}
+
+\def\setlayertext
+ {\dotripleempty\dosetlayertext}
+
+\def\dosetlayertext[#1][#2][#3]%
+ {\bgroup
+ \getparameters
+ [\??lx]
+ [\c!align=,
+ \c!width=\hsize,
+ \c!color=,
+ \c!style=,
+ #3]%
+ \dowithnextboxcontent
+ {\forgetall
+ \hsize\@@lxwidth
+ \expanded{\setupalign[\@@lxalign]}%
+ \dosetfontattribute\??lx\c!style}
+ {\setlayer[#1][#2]{\strut\color[\@@lxcolor]{\flushnextbox}}%
+ \egroup}%
+ \vtop}
+
+% \setupbackgrounds
+% [page]
+% [background=pagefigures]
+%
+% \definelayer
+% [pagefigures]
+% [x=-2mm,
+% y=-2mm,
+% width=\paperwidth,
+% height=\paperheight]
+%
+% \definelayerpreset [lefttop] [corner={left,top},location={right,bottom}]
+% \definelayerpreset [righttop] [corner={right,top},location={left,bottom}]
+% \definelayerpreset [leftbottom] [corner={left,bottom},location={right,top}]
+% \definelayerpreset [rightbottom] [corner={right,bottom},location={left,top}]
+% \definelayerpreset [middle] [corner=middle,location=middle]
+%
+% \setlayer[pagefigures][preset=lefttop]
+% \setlayer[pagefigures][preset=righttop]
+% \setlayer[pagefigures][preset=leftbottom]
+% \setlayer[pagefigures][preset=rightbottom]
+
+\definelayerpreset
+ [\v!left\v!top]
+ [\c!corner={\v!left,\v!top},\c!location={\v!right,\v!bottom}]
+
+\definelayerpreset
+ [\v!right\v!top]
+ [\c!corner={\v!right,\v!top},\c!location={\v!left,\v!bottom}]
+
+\definelayerpreset
+ [\v!left\v!bottom]
+ [\c!corner={\v!left,\v!bottom},\c!location={\v!right,\v!top}]
+
+\definelayerpreset
+ [\v!right\v!bottom]
+ [\c!corner={\v!right,\v!bottom},\c!location={\v!left,\v!top}]
+
+\definelayerpreset
+ [\v!middle]
+ [\c!corner=\v!middle,\c!location=\v!middle]
+
+% \definelayerpreset
+% [\v!middle\v!top]
+% [\c!location=\v!bottom,\c!hoffset=.5\layerwidth]
+
+% \definelayerpreset
+% [\v!middle\v!bottom]
+% [\c!location=\v!top,\c!hoffset=.5\layerwidth,\c!voffset=\layerheight]
+
+% \definelayerpreset
+% [\v!middle\v!left]
+% [\c!location=\v!right,\c!voffset=.5\layerheight]
+
+% \definelayerpreset
+% [\v!middle\v!right]
+% [\c!location=\v!left,\c!hoffset=\layerwidth,\c!voffset=.5\layerheight]
+
+\definelayerpreset
+ [\v!middle\v!top]
+ [\c!location=\v!bottom,\c!corner=\v!top,\c!dx=.5\layerwidth]
+
+\definelayerpreset
+ [\v!middle\v!bottom]
+ [\c!location=\v!top,\c!corner=\v!bottom,\c!dx=.5\layerwidth]
+
+\definelayerpreset
+ [\v!middle\v!left]
+ [\c!location=\v!right,\c!corner=\v!left,\c!dy=.5\layerheight]
+
+\definelayerpreset
+ [\v!middle\v!right]
+ [\c!location=\v!left,\c!corner=\v!right,\c!dy=.5\layerheight]
+
+\def\alignedbox
+ {\dodoubleempty\doalignedbox[]}
+
+% \def\doalignedbox[#1][#2]%
+% {\bgroup
+% %\let\iftraceboxplacement\iftracelayers % ugly
+% \dowithnextbox
+% {\let\next\middlebox
+% \processaction
+% [#2]
+% [ t=>\let\next\topbox , b=>\let\next\bottombox ,
+% l=>\let\next\leftbox , r=>\let\next\rightbox ,
+% bl=>\let\next\bottomleftbox,br=>\let\next\bottomrightbox,
+% tl=>\let\next\topleftbox ,tr=>\let\next\toprightbox ,
+% lt=>\let\next\lefttopbox ,lb=>\let\next\leftbottombox ,
+% rt=>\let\next\righttopbox ,rb=>\let\next\rightbottombox]%
+% \next{\flushnextbox}%
+% \egroup}#1}
+
+\def\doalignedbox[#1][#2]%
+ {\bgroup
+ %\let\iftraceboxplacement\iftracelayers % ugly
+ \dowithnextbox
+ {\serializecommalist[#2]%
+ \executeifdefined{\??ab\??ab\serializedcommalist}\middlebox{\flushnextbox}%
+ \egroup}#1}
+
+\setvalue{\??ab\??ab }{\middlebox}
+\setvalue{\??ab\??ab\v!middle }{\middlebox}
+\setvalue{\??ab\??ab\v!left }{\leftbox }
+\setvalue{\??ab\??ab\v!right }{\rightbox }
+\setvalue{\??ab\??ab\v!bottom }{\bottombox}
+\setvalue{\??ab\??ab\v!top }{\topbox }
+
+\setvalue{\??ab\??ab\v!middle\v!middle}{\middlebox}
+\setvalue{\??ab\??ab\v!left \v!top }{\lefttopbox}
+\setvalue{\??ab\??ab\v!left \v!bottom}{\leftbottombox}
+\setvalue{\??ab\??ab\v!right \v!top }{\righttopbox}
+\setvalue{\??ab\??ab\v!right \v!bottom}{\rightbottombox}
+\setvalue{\??ab\??ab\v!top \v!left }{\topleftbox}
+\setvalue{\??ab\??ab\v!bottom\v!left }{\bottomleftbox}
+\setvalue{\??ab\??ab\v!top \v!right }{\toprightbox}
+\setvalue{\??ab\??ab\v!bottom\v!right }{\bottomrightbox}
+
+\setvalue{\??ab\??ab c}{\middlebox}
+\setvalue{\??ab\??ab l}{\leftbox}
+\setvalue{\??ab\??ab r}{\rightbox}
+\setvalue{\??ab\??ab b}{\bottombox}
+\setvalue{\??ab\??ab t}{\topbox}
+
+\setvalue{\??ab\??ab lt}{\lefttopbox}
+\setvalue{\??ab\??ab lb}{\leftbottombox}
+\setvalue{\??ab\??ab rt}{\righttopbox}
+\setvalue{\??ab\??ab rb}{\rightbottombox}
+\setvalue{\??ab\??ab tl}{\topleftbox}
+\setvalue{\??ab\??ab bl}{\bottomleftbox}
+\setvalue{\??ab\??ab tr}{\toprightbox}
+\setvalue{\??ab\??ab br}{\bottomrightbox}
+
+\setvalue{\??ab\??ab m}{\middlebox}
+
+% The next ones were desparately needed by Vit Zyka (see
+% \type {supp-box} for definitions).
+
+\setvalue{\??ab\??ab g}{\baselinemiddlebox}
+\setvalue{\??ab\??ab gl}{\baselineleftbox}
+\setvalue{\??ab\??ab gc}{\baselinemiddlebox}
+\setvalue{\??ab\??ab gr}{\baselinerightbox}
+
+\setvalue{\??ab\??ab \v!line }{\baselinemiddlebox} % \v!grid is taken
+\setvalue{\??ab\??ab \v!line\v!left }{\baselineleftbox}
+\setvalue{\??ab\??ab \v!line\v!middle}{\baselinemiddlebox}
+\setvalue{\??ab\??ab \v!line\v!right }{\baselinerightbox}
+
+\unexpanded\def\offsetbox
+ {\dodoubleempty\dooffsetbox[]}
+
+% left/right/top/bottomoffset -> dimensions change
+% x/y | method=fixed -> dimensions don't change
+
+\def\dooffsetbox[#1][#2]%
+ {\bgroup
+ \dowithnextbox
+ {\getparameters[\??ox]
+ [\c!x=\zeropoint,
+ \c!y=\zeropoint,
+ \c!width=\nextboxwd,
+ \c!height=\nextboxht,
+ \c!depth=\nextboxdp,
+ \c!location=,
+ \c!leftoffset=\zeropoint,
+ \c!rightoffset=\zeropoint,
+ \c!topoffset=\zeropoint,
+ \c!bottomoffset=\zeropoint,
+ \c!method=,
+ #2]%
+ \donefalse
+ \ifdim\@@oxleftoffset =\zeropoint\else\donetrue\fi
+ \ifdim\@@oxrightoffset=\zeropoint\else\donetrue\fi
+ \ifdim\@@oxtopoffset =\zeropoint\else\donetrue\fi
+ \ifdim\@@oxbottomoffset =\zeropoint\else\donetrue\fi
+ \ifdone
+ \doif\@@oxmethod\v!fixed % new
+ {\ifdim\@@oxleftoffset=\zeropoint
+ \ifdim\@@oxrightoffset=\zeropoint \else
+ \scratchdimen-\@@oxrightoffset
+ \edef\@@oxx{\the\scratchdimen}%
+ \let\@@oxrightoffset\zeropoint
+ \fi
+ \else
+ \let\@@oxx\@@oxleftoffset
+ \let\@@oxleftoffset\zeropoint
+ \fi
+ \ifdim\@@oxtopoffset=\zeropoint
+ \ifdim\@@oxbottomoffset=\zeropoint \else
+ \scratchdimen-\@@oxbottomoffset
+ \edef\@@oxy{\the\scratchdimen}%
+ \let\@@oxbottomoffset\zeropoint
+ \fi
+ \else
+ \let\@@oxy\@@oxtopoffset
+ \let\@@oxtopoffset\zeropoint
+ \fi
+ \donefalse}%
+ \fi
+ \ifdone
+ \setbox\nextbox\vbox
+ {\forgetall\offinterlineskip
+ \vskip\@@oxtopoffset
+ \hbox
+ {\hskip\@@oxleftoffset
+ \flushnextbox
+ \hskip\@@oxrightoffset}%
+ \vskip\@@oxbottomoffset}%
+ \scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \nextboxht\scratchdimen
+ \nextboxdp\zeropoint
+ \fi
+ \freezedimenmacro\@@oxwidth
+ \freezedimenmacro\@@oxheight
+ \freezedimenmacro\@@oxdepth
+ \setbox\nextbox\hbox
+ {\hskip\@@oxx\lower\@@oxy\hbox
+ {\doifelsenothing\@@oxlocation
+ {\flushnextbox}
+ {\alignedbox[\@@oxlocation]\hbox{\flushnextbox}}}}%
+ \nextboxwd\@@oxwidth
+ \nextboxht\@@oxheight
+ \nextboxdp\@@oxdepth
+ \flushnextbox
+ \egroup}#1}
+
+% \useMPlibrary[pre] \setupbackgrounds[page][background=pagegrid]
+%
+% \placefigure[left,none]{}{\offset[leftoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+% \placefigure[left,none]{}{\offset[rightoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+% \placefigure[left,none]{}{\offset[topoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+% \placefigure[left,none]{}{\offset[bottomoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+
+\unexpanded\def\offset {\dodoubleempty\dooffsetbox [\hbox]} % yes or no
+\unexpanded\def\aligned{\dosingleempty\doalignedbox[\hbox]} % yes or no
+
+%\ruledhbox{\offsetbox[x=-1cm,y=-1cm,location=c]
+% {\framed[width=4cm,height=4cm]{x}}}
+
+\def\dotabbed#1#2#3#4%
+ {\dontleavehmode
+ \bgroup
+ \setbox\scratchbox\hbox{#3}%
+ \hbox to \wd\scratchbox{#1#4#2}%
+ \egroup}
+
+\unexpanded\def\ltabbed{\dotabbed\relax\hss}
+\unexpanded\def\rtabbed{\dotabbed\hss \relax}
+\unexpanded\def\ctabbed{\dotabbed\hss \hss} \let\mtabbed\ctabbed
+
+% \ltabbed{\romeins{3}}{\romeins{1}} test \endgraf
+% \ltabbed{\romeins{3}}{\romeins{2}} test \endgraf
+% \ltabbed{\romeins{3}}{\romeins{3}} test \endgraf
+%
+% \rtabbed{\romeins{3}}{\romeins{1}} test \endgraf
+% \rtabbed{\romeins{3}}{\romeins{2}} test \endgraf
+% \rtabbed{\romeins{3}}{\romeins{3}} test \endgraf
+%
+% \ctabbed{\romeins{3}}{\romeins{1}} test \endgraf
+% \ctabbed{\romeins{3}}{\romeins{2}} test \endgraf
+% \ctabbed{\romeins{3}}{\romeins{3}} test \endgraf
+
+% alternative, if done, then other name
+%
+% \def\dotabbed#1#2#3#4%
+% {\dontleavehmode
+% \bgroup
+% \scratchdimen\zeropoint
+% \def\docommand##1%
+% {\setbox\scratchbox\hbox{##1}%
+% \ifdim\wd\scratchbox>\scratchdimen
+% \scratchdimen\wd\scratchbox
+% \fi}%
+% \processcommalist[#3]\docommand
+% \hbox to \scratchdimen{#1#4#2}%
+% \egroup}
+%
+% \def\ltabbed{\dotabbed\relax\hss}
+% \def\rtabbed{\dotabbed\hss \relax}
+% \def\ctabbed{\dotabbed\hss \hss} \let\mtabbed\ctabbed
+%
+% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
+% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
+% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
+%
+% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
+% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
+% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
+%
+% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
+% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
+% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
+
+% to be documented
+
+\unexpanded\def\phantombox[#1]%
+ {\hbox\bgroup
+ \getparameters
+ [\??ol]
+ [\c!width=\zeropoint,%
+ \c!height=\zeropoint,%
+ \c!depth=\zeropoint,#1]%
+ \setbox\scratchbox\null
+ \wd\scratchbox\@@olwidth
+ \ht\scratchbox\@@olheight
+ \dp\scratchbox\@@oldepth
+ \box\scratchbox
+ \egroup}
+
+% \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]}
+
+\unexpanded\def\backgroundimage#1#2#3% repeat hsize vsize
+ {\bgroup
+ \forgetall
+ \dowithnextbox
+ {\offinterlineskip
+ \ifcase#1\relax
+ % just one
+ \else
+ \scratchdimen#2\divide\scratchdimen\nextboxwd\count0\scratchdimen\advance\count0\plusone
+ \scratchdimen#3\divide\scratchdimen\nextboxht\count2\scratchdimen\advance\count2\plusone
+ % to be considered, probably methods
+ \ifcase#1\or % x and y
+ \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}%
+ \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}%
+ \or % x
+ \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}%
+ \or % y
+ \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}%
+ \fi
+ \fi
+ \ifdim\nextboxwd>#2\relax
+ \setbox\nextbox\hbox to #2{\hss\flushnextbox\hss}%
+ \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}%
+ \setbox\nextbox\hbox{\expanded{\clip[\c!width=\the\nextboxwd,\c!height=#3]{\flushnextbox}}}%
+ \fi
+ \flushnextbox
+ \egroup}%
+ \hbox}
+
+\protect \endinput
diff --git a/tex/context/base/pack-box.mkiv b/tex/context/base/pack-box.mkiv
new file mode 100644
index 000000000..6cb492aa6
--- /dev/null
+++ b/tex/context/base/pack-box.mkiv
@@ -0,0 +1,944 @@
+%D \module
+%D [ file=pack-box,
+%D version=2002.04.12,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Boxes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Boxes}
+
+%D This module contains all kind of macros for moving content
+%D around. Many macros here come from other modules, but
+%D depencies made it more clear to isolate them.
+
+% \placeornament
+
+\unprotect
+
+% \definelayer[\v!tekst-2][\c!positie=\v!ja]
+% \definelayer[\v!tekst-1][\c!positie=\v!ja]
+% \definelayer[\v!tekst+1][\c!positie=\v!ja]
+% \definelayer[\v!tekst+2][\c!positie=\v!ja]
+
+% we need to set the size, else we get dimensions depending
+% on the content, which in itsel fis ok, but can lead to loops
+% due to rounding errors (happened in demo-obv)
+
+\definelayer[\v!text-2][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+\definelayer[\v!text-1][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+\definelayer[\v!text+1][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+\definelayer[\v!text+2][\c!position=\v!yes,\c!width=\overlaywidth,\c!height=\overlayheight]
+
+\def\internaltextoverlay#1% will become more generic and installable
+ {\startoverlay % i.e. probably an overlay by itself
+ {\positionoverlay{\v!text#1}} % see later
+ {\composedlayer {\v!text#1}}
+ \stopoverlay}
+
+%\def\internaltextoverlay#1%
+% {\hbox to \zeropoint{\positionoverlay{\v!tekst#1}\hss}%
+% \composedlayer{\v!tekst#1}}
+
+% todo: share info, so that tuo will be smaller
+
+\defineoverlay[\v!text-2][\internaltextoverlay{-2}]
+\defineoverlay[\v!text-1][\internaltextoverlay{-1}]
+\defineoverlay[\v!text+1][\internaltextoverlay{+1}]
+\defineoverlay[\v!text+2][\internaltextoverlay{+2}]
+
+% to be documented
+
+\definelayer[anchor]
+
+\def\anchor
+ {\dosingleargument\doanchor}
+
+\def\doanchor[#1]%
+ {\ifcsname\??an#1\endcsname\@EA\nonoanchor\else\@EA\dodoanchor\fi[#1]}
+
+\def\nonoanchor[#1]%
+ {}
+
+\def\dodoanchor[#1]%
+ {\dotripleempty\dododoanchor[#1]}
+
+\def\dododoanchor
+ {\ifthirdargument
+ \expandafter\dodoanchorT
+ \else
+ \expandafter\dodoanchorS
+ \fi}
+
+\def\dodoanchorS[#1][#2][#3]%
+ {\dodoanchorT[#1][#2][#2]}
+
+\def\dodoanchorT[#1][#2][#3]%
+ {\dowithnextbox
+ {\bgroup
+ \checktextbackgrounds
+ \setbox\scratchbox\null
+ \wd\scratchbox\nextboxwd
+ \ht\scratchbox\nextboxht
+ \dp\scratchbox\nextboxdp
+ \setlayer
+ [anchor]
+ [\c!width=\wd\scratchbox,
+ \c!height=\ht\scratchbox,
+ \c!offset=\!!zeropoint,
+ #2,#3]
+ {\setlayer[#1]{\flushnextbox}}%
+ \framed
+ [#2,
+ \c!background=anchor,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off,
+ #3]
+ {\box\scratchbox}%
+ \egroup}%
+ \vbox}
+
+\unexpanded\def\defineanchor
+ {\doquadrupleempty\dodefineanchor}
+
+\def\dodefineanchor[#1][#2][#3][#4]%
+ {\setvalue{\??an#1}{\dodefinedanchor[#2][#3][#4]}}
+
+\def\dodefinedanchor[#1][#2][#3]%
+ {\def\docommand[##1][##2]%
+ {\ifsecondargument
+ \def\next{\dodoanchorT[#1][#2,##1][#3,##2]}%
+ \else\iffirstargument
+ \def\next{\dodoanchorT[#1][#2,##1][#2,##1]}%
+ \else
+ \def\next{\dodoanchorT[#1][#2][#3]}%
+ \fi\fi
+ \next}%
+ \dodoubleempty\docommand}
+
+\def\@@collectorbox{@@collectorbox}
+
+\unexpanded\def\definecollector
+ {\dodoubleargument\dodefinecollector}
+
+\def\dodefinecollector[#1][#2]%
+ {\ifcsname\@@collectorbox#1\endcsname \else
+ \expandafter\newbox\csname\@@collectorbox#1\endcsname
+ \fi
+ \resetcollector[#1]%
+ \setupcollector
+ [#1]
+ [\c!state=\v!start,
+ \c!x=\!!zeropoint,\c!y=\!!zeropoint,
+ \c!offset=\!!zeropoint,\c!rotation=, % geen 0 !
+ \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
+ \c!location=rb,\c!corner=,#2]}
+
+\unexpanded\def\setupcollector
+ {\dodoubleargument\dosetupcollector}
+
+\def\dosetupcollector[#1][#2]%
+ {\def\docommand##1{\getparameters[\??cb##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\def\setcollector
+ {\dodoubleargument\dosetcollector}
+
+\def\dosetcollector[#1][#2]%
+ {\bgroup
+ \forgetall
+ \dontcomplain
+ \dowithnextbox
+ {\ifcsname\@@collectorbox#1\endcsname
+ \dodosetcollector[#1][#2]%
+ \else
+ \writestatus{collector}{unknown layer #1}%
+ \fi
+ \egroup}
+ \hbox}
+
+\def\collectorparameter#1{\csname\??cb\currentcollector#1\endcsname}
+
+\def\dodosetcollector[#1][#2]% todo: keep reference point
+ {\def\currentcollector{#1}%
+ \chardef\collectorbox\csname\@@collectorbox#1\endcsname
+ \getparameters[\??cb#1][#2]%
+ \@@layerxsiz\wd\collectorbox
+ \@@layerysiz\ht\collectorbox
+ \doifvaluesomething{\??cb#1\c!rotation}
+ {\setbox\nextbox\hbox
+ {\rotate
+ [\c!location=\v!high,
+ \c!rotation=\collectorparameter\c!rotation]
+ {\flushnextbox}}}%
+ \advance\@@layerysiz\dp\collectorbox
+ \@@layerxpos\collectorparameter\c!x
+ \advance\@@layerxpos\collectorparameter\c!hoffset
+ \@@layerypos\collectorparameter\c!y
+ \advance\@@layerypos\collectorparameter\c!voffset
+ \doifelse\v!middle{\collectorparameter\c!corner}
+ {\ifdim\@@layerxsiz>\zeropoint
+ \advance\@@layerxpos.5\@@layerxsiz
+ \fi
+ \ifdim\@@layerysiz>\zeropoint
+ \advance\@@layerypos.5\@@layerysiz
+ \fi}%
+ {\normalexpanded{\noexpand\doifinset{\v!bottom}{\collectorparameter\c!corner}}
+ {\ifdim\@@layerysiz>\zeropoint
+ \advance\@@layerypos-\@@layerysiz
+ \@@layerypos-\@@layerypos
+ \fi}%
+ \normalexpanded{\noexpand\doifinset{\v!right}{\collectorparameter\c!corner}}
+ {\ifdim\@@layerxsiz>\zeropoint
+ \advance\@@layerxpos-\@@layerxsiz
+ \@@layerxpos-\@@layerxpos
+ \fi}}%
+ \setbox\nextbox\hbox
+ {\alignedbox[\collectorparameter\c!location]\vbox{\flushnextbox}}%
+ \boxmaxdepth\zeropoint % really needed, nice example
+ \global\advance\boxhdisplacement\@@layerxpos
+ \ifdim\boxhdisplacement<\zeropoint
+ \global\setbox\collectorbox\hbox
+ {\hskip-\boxhdisplacement
+ \box\collectorbox}%
+ \fi
+ \global\advance\boxvdisplacement\@@layerypos
+ \ifdim\boxvdisplacement<\zeropoint
+ \global\setbox\collectorbox\hbox
+ {\lower-\boxvdisplacement
+ \box\collectorbox}%
+ \fi
+ \@@layerxsiz\wd\collectorbox
+ \@@layerysiz\ht\collectorbox
+ \advance\@@layerysiz\dp\collectorbox
+ \global\setbox\collectorbox\hbox
+ {\box\collectorbox
+ \hskip-\@@layerxsiz
+ \hskip\@@layerxpos\relax
+ \ifdim\boxhdisplacement<\zeropoint
+ \hskip-\boxhdisplacement
+ \fi
+ \lower\@@layerypos\hbox
+ {\ifdim\boxvdisplacement<\zeropoint
+ \lower-\boxvdisplacement\flushnextbox
+ \else
+ \flushnextbox
+ \fi}}%
+ % combine height and depth into depth only (later flushed as height)
+ \global\setbox\collectorbox\hbox
+ {\lower\ht\collectorbox\box\collectorbox}%
+ % just to be sure
+ \ifdim\wd\collectorbox<\@@layerxsiz
+ \global\wd\collectorbox\@@layerxsiz
+ \fi}
+
+\def\flushcollector[#1]%
+ {\ifcsname\@@collectorbox#1\endcsname
+ \doifnotvalue{\??cb#1\c!state}\v!stop
+ {\vbox
+ {\hbox
+ {\doifelsevalue{\??cb#1\c!state}\v!repeat
+ {\let\next\copy}{\let\next\box}%
+ \raise\dp\csname\@@collectorbox#1\endcsname
+ \next\csname\@@collectorbox#1\endcsname}}}%
+ \else
+ \writestatus{collector}{unknown collector #1}%
+ \fi}
+
+\def\composedcollector#1{\flushcollector[#1]}
+
+\def\resetcollector[#1]%
+ {\ifcsname\@@collectorbox#1\endcsname
+ \global\setbox\csname\@@collectorbox#1\endcsname\emptybox
+ \fi}
+
+\def\adaptcollector
+ {\dodoubleargument\doadaptcollector}
+
+\def\doadaptcollector[#1][#2]%
+ {\bgroup
+ \def\currentcollector{#1}%
+ \chardef\collectorbox\csname\@@collectorbox#1\endcsname
+ \getparameters[\??cb#1][\c!voffset=\zeropoint,\c!hoffset=\zeropoint,#2]%
+ \scratchdimen\wd\collectorbox
+ \advance\scratchdimen\collectorparameter\c!hoffset
+ \global\wd\collectorbox\scratchdimen
+ \scratchdimen\ht\collectorbox
+ \advance\scratchdimen\collectorparameter\c!voffset
+ \global\ht\collectorbox\scratchdimen
+ \egroup}
+
+%\definecollector[test]
+%\setcollector[test]
+% [location=rb]
+% {\externalfigure[koe][frame=on,width=3cm]}
+%\setcollector[test]
+% [corner={right,bottom},location={left,top}]
+% {\framed{gans}}
+%\composedcollector{test}
+
+\definecollector
+ [caption]
+
+\def\collectedtext
+ {\dodoubleempty\docollectedtext}
+
+\def\docollectedtext[#1][#2]#3%
+ {\bgroup
+ \dowithnextbox
+ {\setcollector
+ [caption]
+ {\flushnextbox}%
+ \setcollector
+ [caption][#1]
+ {\getparameters[\??du][#2]%
+ \dosetfontattribute\??du\c!style\setupinterlinespace
+ \framed % watch the special setting of kader/overlay
+ [\c!frame=\v!overlay,#2]
+ {\doattributes\??du\c!style\c!color{#3}}}%
+ \composedcollector{caption}%
+ \egroup}%
+ \hbox}
+
+% \collectedtext
+% [corner={right,bottom},location={left,top}]
+% [background=color,backgroundcolor=white,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \collectedtext
+% [rotation=90,corner={right,bottom},location={right,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \collectedtext
+% [rotation=90,corner={left,bottom},location={left,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+
+\definelayer
+ [caption]
+
+\def\layeredtext
+ {\dodoubleempty\dolayeredtext}
+
+\def\dolayeredtext[#1][#2]#3%
+ {\bgroup
+ \dowithnextbox
+ {\!!widtha \nextboxwd
+ \!!heighta\nextboxht
+ \bgroup % preserve \nextbox
+ \setuplayer
+ [caption]
+ [\c!width=\!!widtha,\c!height=\!!heighta]%
+ \setlayer
+ [caption]
+ [#1]
+ {\getparameters[\??du][#2]%
+ \dosetfontattribute\??du\c!style\setupinterlinespace
+ \framed
+ [\c!frame=\v!overlay,,#2]
+ {\doattributes\??du\c!style\c!color{#3}}}%
+ \egroup
+ \framed
+ [\c!offset=\v!overlay,
+ \c!frame=\v!off,
+ \c!background={\v!foreground,caption},
+ \c!width=\!!widtha,
+ \c!height=\!!heighta]
+ {\flushnextbox}%
+ \egroup}%
+ \hbox}
+
+% \layeredtext
+% [corner={right,bottom},location={left,top}]
+% [background=color,backgroundcolor=white,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \layeredtext
+% [rotation=90,corner={right,bottom},location={right,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+%
+% \layeredtext
+% [rotation=90,corner={left,bottom},location={left,top}]
+% [frame=on,offset=0pt]
+% {gans}
+% {\externalfigure[koe][width=3cm]}
+
+\def\ornamenttext
+ {\dodoubleempty\doornamenttext}
+
+\def\doornamenttext[#1][#2]%
+ {\bgroup
+ \doifassignmentelse{#1}
+ {\getparameters[\s!dummy][\c!alternative=\v!a,#1]%
+ \doifelse\dummyalternative\v!a
+ {\egroup\collectedtext}%
+ {\egroup\layeredtext }%
+ [#1][#2]}%
+ {\egroup\getvalue{#1}}}
+
+\unexpanded\def\defineornament
+ {\dotripleempty\dodefineornament}
+
+\def\dodefineornament[#1][#2][#3]%
+ {\setvalue{#1}{\doornamenttext[#2][#3]}}
+
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={right,top},
+% hoffset=-.25ex]
+% [frame=on,background=color,backgroundcolor=red,offset=0pt]
+%
+% \ruledhbox{\affiliation{gans}{\externalfigure[koe][width=3cm]}}
+%
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={right,top},
+% hoffset=-.25ex,alternative=b]
+% [frame=on,background=color,backgroundcolor=red,offset=0pt]
+%
+% \ruledhbox{\affiliation{gans}{\externalfigure[koe][width=3cm]}}
+%
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={left,top},
+% hoffset=.25ex,voffset=.25ex,alternative=a]
+% [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt]
+%
+% \affiliation{photo}{\externalfigure[molen][width=3cm]}
+%
+% \defineornament
+% [affiliation]
+% [rotation=90,corner={right,bottom},location={left,top},
+% hoffset=.25ex,voffset=.25ex,alternative=b]
+% [background=color,style=\ss\tfxx,backgroundcolor=white,offset=0pt]
+%
+% \affiliation{drawing}{\externalfigure[hakker][width=3cm]}
+
+% pas op: aanpassen aan nieuwe layer hoek ankers en columnset
+
+\newcount\nofbleeds % per pag
+
+\unexpanded\def\setupbleeding
+ {\dodoubleempty\getparameters[\??bg]}
+
+\setupbleeding
+ [\c!location=l,
+ \c!stretch=\v!yes,
+ \c!width=3cm,
+ \c!height=3cm,
+ \c!offset=2mm,
+ \c!page=\v!no,
+ \c!voffset=\@@bgoffset,
+ \c!hoffset=\@@bgoffset]
+
+\def\bleed
+ {\dosingleempty\dobleed}
+
+
+\def\bleedwidth {\the\hsize}%
+\def\bleedheight{\the\vsize}%
+
+\def\dobleed[#1]#2%
+ {\hbox\bgroup
+ \xdef\bleedwidth {\the\hsize}%
+ \xdef\bleedheight{\the\vsize}%
+ \global\advance\nofbleeds\plusone
+ \getparameters[\??bg][#1]%
+ \!!doneafalse % left
+ \!!donebfalse % right
+ \!!donecfalse % top
+ \!!donedfalse % bottom
+ % replace this part ! todo: default location
+ \processaction
+ [\@@bglocation]
+ [ t=>\!!donectrue\let\@@bghoffset\!!zeropoint,
+ b=>\!!donedtrue\let\@@bghoffset\!!zeropoint,
+ l=>\!!doneatrue\let\@@bgvoffset\!!zeropoint,
+ r=>\!!donebtrue\let\@@bgvoffset\!!zeropoint,
+ bl=>\!!doneatrue\!!donedtrue,
+ lb=>\!!doneatrue\!!donedtrue,
+ br=>\!!donebtrue\!!donedtrue,
+ rb=>\!!donebtrue\!!donedtrue,
+ tl=>\!!doneatrue\!!donectrue,
+ lt=>\!!doneatrue\!!donectrue,
+ tr=>\!!donebtrue\!!donectrue,
+ rt=>\!!donebtrue\!!donectrue]%
+ \doifelse\@@bgstretch\v!yes\donetrue\donefalse
+ \scratchdimen\@@bgwidth
+ \ifdone
+ \if!!donea
+ \advance\scratchdimen\MPx{\??bg:\number\nofbleeds}%
+ \else\if!!doneb
+ \scratchdimen\paperwidth
+ \advance\scratchdimen-\MPx{\??bg:\number\nofbleeds}%
+ \fi\fi
+ \fi
+ \advance\scratchdimen\@@bghoffset
+ \xdef\bleedwidth{\the\scratchdimen}%
+ \scratchdimen\@@bgheight
+ \ifdone
+ \if!!donec
+ \scratchdimen\paperheight
+ \advance\scratchdimen-\MPy{\??bg:\number\nofbleeds}%
+ \else\if!!doned
+ \advance\scratchdimen\MPy{\??bg:\number\nofbleeds}%
+ \fi\fi
+ \fi
+ \advance\scratchdimen\@@bgvoffset
+ \xdef\bleedheight{\the\scratchdimen}%
+ \hsize\bleedwidth
+ \vsize\bleedheight
+ \setbox\scratchbox\hbox{#2}%
+ \doif\@@bgpage\v!yes
+ {\setbox\scratchbox\topskippedbox{\box\scratchbox}}%
+ \setbox\scratchbox\hbox to \@@bgwidth
+ {\if!!donea\hss\fi\box\scratchbox\if!!doneb\hss\fi}%
+ \if!!doned
+ \setbox\scratchbox\hbox
+ {\lower\bleedheight\hbox{\raise\@@bgheight\box\scratchbox}}%
+ \fi
+ \wd\scratchbox\@@bgwidth
+ \ht\scratchbox\@@bgheight
+ \dp\scratchbox\zeropoint
+ \ifdone
+ \hpos{\??bg:\number\nofbleeds}{\box\scratchbox}%
+ \else
+ \box\scratchbox
+ \fi
+ \egroup}
+
+\setupbleeding[\c!stretch=\v!yes]
+
+\defineexternalfigure[bleed][\c!width=\bleedwidth,\c!height=\bleedheight]
+
+% \placefigure[left]{none}
+% {\bleed[width=5cm,height=3cm,location=lt]{\externalfigure[koe][bleed]}}
+%
+% \input tufte
+%
+% \placefigure[left]{none}
+% {\bleed[width=5cm,height=3cm,location=l]{\externalfigure[koe][bleed]}}
+%
+% \input tufte
+%
+% \placefigure[right]{none}
+% {\bleed[width=5cm,height=3cm,location=r]{\externalfigure[koe][bleed]}}
+%
+% \input tufte
+%
+% \placefigure
+% [top,none]
+% {} % no caption
+% {\bleed
+% [hoffset=-\backspace,
+% voffset=3mm,
+% width=0cm,
+% height=6\lineheight,
+% page=yes, % correct for topskip
+% location=lt]
+% {\externalfigure[koe][bleed][frame=on]}}
+
+% \setlayerframed[layer id][layer settings][framed setting]{data}
+% \setlayerframed[layer id][combined settings]{data}
+
+\def\setlayerframed
+ {\dotripleempty\dosetlayerframed}
+
+\def\dosetlayerframed
+ {\ifthirdargument
+ \expandafter\dosetlayerframedT
+ \else
+ \expandafter\dosetlayerframedS
+ \fi}
+
+\def\dosetlayerframedT[#1][#2][#3]%
+ {\dowithnextbox{\setlayer[#1][#2]{\flushnextbox}}%
+ \hbox\framed[#3]}
+
+\def\dosetlayerframedS[#1][#2][#3]%
+ {\dowithnextbox % we could use a local setlayer command (no doif..empty) which also saves a nextbox
+ {\setlayer[#1][\c!width=\nextboxwd,\c!height=\nextboxht,\c!offset=\!!zeropoint,#2]{\flushnextbox}}%
+ \hbox\framed[\c!location=\v!normal,#2]}
+
+\def\setlayertext
+ {\dotripleempty\dosetlayertext}
+
+\def\dosetlayertext[#1][#2][#3]%
+ {\bgroup
+ \getparameters
+ [\??lx]
+ [\c!align=,
+ \c!width=\hsize,
+ \c!color=,
+ \c!style=,
+ #3]%
+ \dowithnextboxcontent
+ {\forgetall
+ \hsize\@@lxwidth
+ \expanded{\setupalign[\@@lxalign]}%
+ \dosetfontattribute\??lx\c!style}
+ {\setlayer[#1][#2]{\strut\color[\@@lxcolor]{\flushnextbox}}%
+ \egroup}%
+ \vtop}
+
+% \setupbackgrounds
+% [page]
+% [background=pagefigures]
+%
+% \definelayer
+% [pagefigures]
+% [x=-2mm,
+% y=-2mm,
+% width=\paperwidth,
+% height=\paperheight]
+%
+% \definelayerpreset [lefttop] [corner={left,top},location={right,bottom}]
+% \definelayerpreset [righttop] [corner={right,top},location={left,bottom}]
+% \definelayerpreset [leftbottom] [corner={left,bottom},location={right,top}]
+% \definelayerpreset [rightbottom] [corner={right,bottom},location={left,top}]
+% \definelayerpreset [middle] [corner=middle,location=middle]
+%
+% \setlayer[pagefigures][preset=lefttop]
+% \setlayer[pagefigures][preset=righttop]
+% \setlayer[pagefigures][preset=leftbottom]
+% \setlayer[pagefigures][preset=rightbottom]
+
+\definelayerpreset
+ [\v!left\v!top]
+ [\c!corner={\v!left,\v!top},\c!location={\v!right,\v!bottom}]
+
+\definelayerpreset
+ [\v!right\v!top]
+ [\c!corner={\v!right,\v!top},\c!location={\v!left,\v!bottom}]
+
+\definelayerpreset
+ [\v!left\v!bottom]
+ [\c!corner={\v!left,\v!bottom},\c!location={\v!right,\v!top}]
+
+\definelayerpreset
+ [\v!right\v!bottom]
+ [\c!corner={\v!right,\v!bottom},\c!location={\v!left,\v!top}]
+
+\definelayerpreset
+ [\v!middle]
+ [\c!corner=\v!middle,\c!location=\v!middle]
+
+% \definelayerpreset
+% [\v!middle\v!top]
+% [\c!location=\v!bottom,\c!hoffset=.5\layerwidth]
+
+% \definelayerpreset
+% [\v!middle\v!bottom]
+% [\c!location=\v!top,\c!hoffset=.5\layerwidth,\c!voffset=\layerheight]
+
+% \definelayerpreset
+% [\v!middle\v!left]
+% [\c!location=\v!right,\c!voffset=.5\layerheight]
+
+% \definelayerpreset
+% [\v!middle\v!right]
+% [\c!location=\v!left,\c!hoffset=\layerwidth,\c!voffset=.5\layerheight]
+
+\definelayerpreset
+ [\v!middle\v!top]
+ [\c!location=\v!bottom,\c!corner=\v!top,\c!dx=.5\layerwidth]
+
+\definelayerpreset
+ [\v!middle\v!bottom]
+ [\c!location=\v!top,\c!corner=\v!bottom,\c!dx=.5\layerwidth]
+
+\definelayerpreset
+ [\v!middle\v!left]
+ [\c!location=\v!right,\c!corner=\v!left,\c!dy=.5\layerheight]
+
+\definelayerpreset
+ [\v!middle\v!right]
+ [\c!location=\v!left,\c!corner=\v!right,\c!dy=.5\layerheight]
+
+\def\alignedbox
+ {\dodoubleempty\doalignedbox[]}
+
+% \def\doalignedbox[#1][#2]%
+% {\bgroup
+% %\let\iftraceboxplacement\iftracelayers % ugly
+% \dowithnextbox
+% {\let\next\middlebox
+% \processaction
+% [#2]
+% [ t=>\let\next\topbox , b=>\let\next\bottombox ,
+% l=>\let\next\leftbox , r=>\let\next\rightbox ,
+% bl=>\let\next\bottomleftbox,br=>\let\next\bottomrightbox,
+% tl=>\let\next\topleftbox ,tr=>\let\next\toprightbox ,
+% lt=>\let\next\lefttopbox ,lb=>\let\next\leftbottombox ,
+% rt=>\let\next\righttopbox ,rb=>\let\next\rightbottombox]%
+% \next{\flushnextbox}%
+% \egroup}#1}
+
+\def\doalignedbox[#1][#2]%
+ {\bgroup
+ %\let\iftraceboxplacement\iftracelayers % ugly
+ \dowithnextbox
+ {\serializecommalist[#2]%
+ \executeifdefined{\??ab\??ab\serializedcommalist}\middlebox{\flushnextbox}%
+ \egroup}#1}
+
+\setvalue{\??ab\??ab }{\middlebox}
+\setvalue{\??ab\??ab\v!middle }{\middlebox}
+\setvalue{\??ab\??ab\v!left }{\leftbox }
+\setvalue{\??ab\??ab\v!right }{\rightbox }
+\setvalue{\??ab\??ab\v!bottom }{\bottombox}
+\setvalue{\??ab\??ab\v!top }{\topbox }
+
+\setvalue{\??ab\??ab\v!middle\v!middle}{\middlebox}
+\setvalue{\??ab\??ab\v!left \v!top }{\lefttopbox}
+\setvalue{\??ab\??ab\v!left \v!bottom}{\leftbottombox}
+\setvalue{\??ab\??ab\v!right \v!top }{\righttopbox}
+\setvalue{\??ab\??ab\v!right \v!bottom}{\rightbottombox}
+\setvalue{\??ab\??ab\v!top \v!left }{\topleftbox}
+\setvalue{\??ab\??ab\v!bottom\v!left }{\bottomleftbox}
+\setvalue{\??ab\??ab\v!top \v!right }{\toprightbox}
+\setvalue{\??ab\??ab\v!bottom\v!right }{\bottomrightbox}
+
+\setvalue{\??ab\??ab c}{\middlebox}
+\setvalue{\??ab\??ab l}{\leftbox}
+\setvalue{\??ab\??ab r}{\rightbox}
+\setvalue{\??ab\??ab b}{\bottombox}
+\setvalue{\??ab\??ab t}{\topbox}
+
+\setvalue{\??ab\??ab lt}{\lefttopbox}
+\setvalue{\??ab\??ab lb}{\leftbottombox}
+\setvalue{\??ab\??ab rt}{\righttopbox}
+\setvalue{\??ab\??ab rb}{\rightbottombox}
+\setvalue{\??ab\??ab tl}{\topleftbox}
+\setvalue{\??ab\??ab bl}{\bottomleftbox}
+\setvalue{\??ab\??ab tr}{\toprightbox}
+\setvalue{\??ab\??ab br}{\bottomrightbox}
+
+\setvalue{\??ab\??ab m}{\middlebox}
+
+% The next ones were desparately needed by Vit Zyka (see
+% \type {supp-box} for definitions).
+
+\setvalue{\??ab\??ab g}{\baselinemiddlebox}
+\setvalue{\??ab\??ab gl}{\baselineleftbox}
+\setvalue{\??ab\??ab gc}{\baselinemiddlebox}
+\setvalue{\??ab\??ab gr}{\baselinerightbox}
+
+\setvalue{\??ab\??ab \v!line }{\baselinemiddlebox} % \v!grid is taken
+\setvalue{\??ab\??ab \v!line\v!left }{\baselineleftbox}
+\setvalue{\??ab\??ab \v!line\v!middle}{\baselinemiddlebox}
+\setvalue{\??ab\??ab \v!line\v!right }{\baselinerightbox}
+
+\unexpanded\def\offsetbox
+ {\dodoubleempty\dooffsetbox[]}
+
+% left/right/top/bottomoffset -> dimensions change
+% x/y | method=fixed -> dimensions don't change
+
+\def\dooffsetbox[#1][#2]%
+ {\bgroup
+ \dowithnextbox
+ {\getparameters[\??ox]
+ [\c!x=\zeropoint,
+ \c!y=\zeropoint,
+ \c!width=\nextboxwd,
+ \c!height=\nextboxht,
+ \c!depth=\nextboxdp,
+ \c!location=,
+ \c!leftoffset=\zeropoint,
+ \c!rightoffset=\zeropoint,
+ \c!topoffset=\zeropoint,
+ \c!bottomoffset=\zeropoint,
+ \c!method=,
+ #2]%
+ \donefalse
+ \ifdim\@@oxleftoffset =\zeropoint\else\donetrue\fi
+ \ifdim\@@oxrightoffset=\zeropoint\else\donetrue\fi
+ \ifdim\@@oxtopoffset =\zeropoint\else\donetrue\fi
+ \ifdim\@@oxbottomoffset =\zeropoint\else\donetrue\fi
+ \ifdone
+ \doif\@@oxmethod\v!fixed % new
+ {\ifdim\@@oxleftoffset=\zeropoint
+ \ifdim\@@oxrightoffset=\zeropoint \else
+ \scratchdimen-\@@oxrightoffset
+ \edef\@@oxx{\the\scratchdimen}%
+ \let\@@oxrightoffset\zeropoint
+ \fi
+ \else
+ \let\@@oxx\@@oxleftoffset
+ \let\@@oxleftoffset\zeropoint
+ \fi
+ \ifdim\@@oxtopoffset=\zeropoint
+ \ifdim\@@oxbottomoffset=\zeropoint \else
+ \scratchdimen-\@@oxbottomoffset
+ \edef\@@oxy{\the\scratchdimen}%
+ \let\@@oxbottomoffset\zeropoint
+ \fi
+ \else
+ \let\@@oxy\@@oxtopoffset
+ \let\@@oxtopoffset\zeropoint
+ \fi
+ \donefalse}%
+ \fi
+ \ifdone
+ \setbox\nextbox\vbox
+ {\forgetall\offinterlineskip
+ \vskip\@@oxtopoffset
+ \hbox
+ {\hskip\@@oxleftoffset
+ \flushnextbox
+ \hskip\@@oxrightoffset}%
+ \vskip\@@oxbottomoffset}%
+ \scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \nextboxht\scratchdimen
+ \nextboxdp\zeropoint
+ \fi
+ \freezedimenmacro\@@oxwidth
+ \freezedimenmacro\@@oxheight
+ \freezedimenmacro\@@oxdepth
+ \setbox\nextbox\hbox
+ {\hskip\@@oxx\lower\@@oxy\hbox
+ {\doifelsenothing\@@oxlocation
+ {\flushnextbox}
+ {\alignedbox[\@@oxlocation]\hbox{\flushnextbox}}}}%
+ \nextboxwd\@@oxwidth
+ \nextboxht\@@oxheight
+ \nextboxdp\@@oxdepth
+ \flushnextbox
+ \egroup}#1}
+
+% \useMPlibrary[pre] \setupbackgrounds[page][background=pagegrid]
+%
+% \placefigure[left,none]{}{\offset[leftoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+% \placefigure[left,none]{}{\offset[rightoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+% \placefigure[left,none]{}{\offset[topoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+% \placefigure[left,none]{}{\offset[bottomoffset=1cm]{\externalfigure[koe][breedte=3cm]}}
+% \input tufte
+
+\unexpanded\def\offset {\dodoubleempty\dooffsetbox [\hbox]} % yes or no
+\unexpanded\def\aligned{\dosingleempty\doalignedbox[\hbox]} % yes or no
+
+%\ruledhbox{\offsetbox[x=-1cm,y=-1cm,location=c]
+% {\framed[width=4cm,height=4cm]{x}}}
+
+\def\dotabbed#1#2#3#4%
+ {\dontleavehmode
+ \bgroup
+ \setbox\scratchbox\hbox{#3}%
+ \hbox to \wd\scratchbox{#1#4#2}%
+ \egroup}
+
+\unexpanded\def\ltabbed{\dotabbed\relax\hss}
+\unexpanded\def\rtabbed{\dotabbed\hss \relax}
+\unexpanded\def\ctabbed{\dotabbed\hss \hss} \let\mtabbed\ctabbed
+
+% \ltabbed{\romeins{3}}{\romeins{1}} test \endgraf
+% \ltabbed{\romeins{3}}{\romeins{2}} test \endgraf
+% \ltabbed{\romeins{3}}{\romeins{3}} test \endgraf
+%
+% \rtabbed{\romeins{3}}{\romeins{1}} test \endgraf
+% \rtabbed{\romeins{3}}{\romeins{2}} test \endgraf
+% \rtabbed{\romeins{3}}{\romeins{3}} test \endgraf
+%
+% \ctabbed{\romeins{3}}{\romeins{1}} test \endgraf
+% \ctabbed{\romeins{3}}{\romeins{2}} test \endgraf
+% \ctabbed{\romeins{3}}{\romeins{3}} test \endgraf
+
+% alternative, if done, then other name
+%
+% \def\dotabbed#1#2#3#4%
+% {\dontleavehmode
+% \bgroup
+% \scratchdimen\zeropoint
+% \def\docommand##1%
+% {\setbox\scratchbox\hbox{##1}%
+% \ifdim\wd\scratchbox>\scratchdimen
+% \scratchdimen\wd\scratchbox
+% \fi}%
+% \processcommalist[#3]\docommand
+% \hbox to \scratchdimen{#1#4#2}%
+% \egroup}
+%
+% \def\ltabbed{\dotabbed\relax\hss}
+% \def\rtabbed{\dotabbed\hss \relax}
+% \def\ctabbed{\dotabbed\hss \hss} \let\mtabbed\ctabbed
+%
+% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
+% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
+% \ltabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
+%
+% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
+% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
+% \rtabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
+%
+% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{10}} test \endgraf
+% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{15}} test \endgraf
+% \ctabbed{\romeins{10},\romeins{2000},\romeins{15}}{\romeins{2000}} test \endgraf
+
+% to be documented
+
+\unexpanded\def\phantombox[#1]%
+ {\hbox\bgroup
+ \getparameters
+ [\??ol]
+ [\c!width=\zeropoint,%
+ \c!height=\zeropoint,%
+ \c!depth=\zeropoint,#1]%
+ \setbox\scratchbox\null
+ \wd\scratchbox\@@olwidth
+ \ht\scratchbox\@@olheight
+ \dp\scratchbox\@@oldepth
+ \box\scratchbox
+ \egroup}
+
+% \backgroundimage{1}{\hsize}{\vsize}{\externalfigure[cow][\c!width=3cm]}
+
+\unexpanded\def\backgroundimage#1#2#3% repeat hsize vsize
+ {\bgroup
+ \forgetall
+ \dowithnextbox
+ {\offinterlineskip
+ \ifcase#1\relax
+ % just one
+ \else
+ \scratchdimen#2\divide\scratchdimen\nextboxwd\count0\scratchdimen\advance\count0\plusone
+ \scratchdimen#3\divide\scratchdimen\nextboxht\count2\scratchdimen\advance\count2\plusone
+ % to be considered, probably methods
+ \ifcase#1\or % x and y
+ \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}%
+ \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}%
+ \or % x
+ \setbox\nextbox\hbox{\dorecurse{\count0}{\copy\nextbox}}%
+ \or % y
+ \setbox\nextbox\vbox{\dorecurse{\count2}{\copy\nextbox\endgraf}}%
+ \fi
+ \fi
+ \ifdim\nextboxwd>#2\relax
+ \setbox\nextbox\hbox to #2{\hss\flushnextbox\hss}%
+ \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}%
+ \setbox\nextbox\hbox{\expanded{\clip[\c!width=\the\nextboxwd,\c!height=#3]{\flushnextbox}}}%
+ \fi
+ \flushnextbox
+ \egroup}%
+ \hbox}
+
+\protect \endinput
diff --git a/tex/context/base/pack-lyr.mkii b/tex/context/base/pack-lyr.mkii
new file mode 100644
index 000000000..85549bccb
--- /dev/null
+++ b/tex/context/base/pack-lyr.mkii
@@ -0,0 +1,755 @@
+%D \module
+%D [ file=pack-lyr,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Layers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Layers}
+
+%D This module is now etex dependent.
+
+% todo : first / last / next / +... => page key
+% test on left/right box when no doublesided option given
+% use \ifcsname instead of doifvalue
+
+\unprotect
+
+% When being backgrounds layers get the background offset
+% displacement. Should be an option, on by default
+% (compatibility).
+
+% positie=forceer == ja maar dan ook in status=herhaal
+
+%D The layering mechanism implemented here is independent of
+%D the output routine, but future extensions may depend on a
+%D more close cooperation.
+
+%D First we overload a macro from \type {core-rul}. From now on
+%D we accept a (optional) argument: the specific layer it
+%D will go in. This means that we can move an overlay from one
+%D background to the other using the dimensions of the parent.
+
+%D ! ! ! ! to be documented ! ! ! !
+
+\ifx\undefined\defineoverlay \message{loaded to early} \wait \fi
+
+\def\defineoverlay
+ {\dotripleempty\dodefineoverlay}
+
+\def\dodefineoverlay[#1][#2][#3]% overlay [layer] content
+ {\ifthirdargument
+ \writestatus{BEWARE}{This (overlay definition) has changed!}% temp
+ \def\docommand##1{\setvalue{\??ov##1}{\setlayer[#2]{\executedefinedoverlay{##1}{#3}}}}
+ \else
+ \def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}%
+ \fi
+ \processcommalist[#1]\docommand}
+
+%D When tracing is turned on, a couple of boxes will
+%D show up as well as the reference point.
+
+\newif\iftracelayers % \tracelayerstrue
+
+%D This handy constant saved some string memory.
+
+\def\@@layerbox{@@layerbox}
+
+%D \macros
+%D {definelayer}
+%D
+%D Each layer gets its own (global) box. This also means that
+%D the data that goes into a layer, is typeset immediately.
+%D Each layer automatically gets an associated overlay,
+%D which can be used in any background assignment.
+
+% todo : links/rechts
+
+\def\definelayer
+ {\dodoubleargument\dodefinelayer}
+
+\def\dodefinelayer[#1][#2]% \zeropoint ipv \!!zeropoint
+ {\setuplayer
+ [#1]
+ [\c!doublesided=,\c!preset=,
+ \c!state=\v!start,\c!direction=\v!normal,\c!option=,
+ \c!x=\zeropoint,\c!y=\zeropoint,\c!position=\v!no,
+ \c!line=0,\c!column=0,
+ \c!width=\nextboxwd,\c!height=\nextboxht,
+ \c!offset=\zeropoint,\c!rotation=, % geen 0 !
+ \c!hoffset=\zeropoint,\c!voffset=\zeropoint,
+ \c!dx=\zeropoint,\c!dy=\zeropoint,
+ \c!location=rb,\c!position=\v!no,\c!page=,
+ \c!method=\v!overlay,
+ \c!sx=1,\c!sy=1,\c!corner=,#2]%
+ \doifvalue{\??ll#1\c!doublesided}\v!yes
+ {\dopresetlayerbox{\v!left #1}%
+ \dopresetlayerbox{\v!right#1}}%
+ \dopresetlayerbox{#1}%
+ \defineoverlay[#1][\composedlayer{#1}]}
+
+\def\dopresetlayerbox#1%
+ {\ifundefined{\@@layerbox#1}%
+ \expandafter\newbox\csname\@@layerbox#1\endcsname
+ \else
+ \resetlayer[#1]%
+ \fi}
+
+%D \macros
+%D {setuplayer}
+%D
+%D After a layer is defined, you can change its
+%D characteristics.
+
+\def\setuplayer
+ {\dodoubleargument\dosetuplayer}
+
+\def\dosetuplayer[#1][#2]%
+ {\def\docommand##1{\getparameters[\??ll##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+%D \macros
+%D {setlayer}
+%D
+%D Data is moved into a layer with the following macro. When
+%D \type {position} is set, relative positioning is used, with
+%D the current point as reference point. Otherwise the topleft
+%D corner is used as reference point.
+%D
+%D \starttyping
+%D \setlayer [identifier] [optional parameters] {data}
+%D \stoptyping
+
+\newcount\currentlayerdata
+
+\let\currentlayerwidth \!!zeropoint
+\let\currentlayerheight\!!zeropoint
+
+\def\setcurrentlayerdimensions
+ {\dodoubleempty\dosetcurrentlayerdimensions}
+
+\def\dosetcurrentlayerdimensions[#1][#2]% name left|right
+ {\edef\currentlayerwidth {\thelayerwidth {#2#1}}%
+ \edef\currentlayerheight{\thelayerheight{#2#1}}}
+
+\def\thelayerwidth #1{\the\wd\executeifdefined{\@@layerbox#1}\emptybox}
+\def\thelayerheight#1{\the\ht\executeifdefined{\@@layerbox#1}\emptybox}
+
+\def\setlayer
+ {\dotripleempty\dosetlayer}
+
+\def\dosetlayer[#1][#2][#3]% #4 == box do \fi is ok
+ {\doifelsevalue{\??ll#1\c!state}\v!stop
+ {\dowithnextbox\donothing\hbox}
+ {\ifthirdargument
+ \dodosetlayer[#1][#2][#3]%
+ \else
+ \doifassignmentelse{#2}
+ {\dodosetlayer[#1][][#2]}%
+ {\dodosetlayer[#1][#2][]}%
+ \fi}}
+
+\def\dodosetlayer[#1][#2][#3]% #2 = links/rechts
+ {\bgroup
+ \recalculatebackgrounds
+ \recalculatelogos
+ \global\advance\currentlayerdata\plusone
+ \forgetall
+ \dontcomplain
+ \doifvalue{\??ll#1\c!option}\v!test\tracelayerstrue
+ \iftracelayers\traceboxplacementtrue\fi
+ \dowithnextbox % sneller als aparte macro
+ {\ifcsname\@@layerbox#1\endcsname % nb: odd/even discard, left/right not
+ \edef\@@layerloc{#2}%
+ \ifx\@@layerloc\v!even
+ \ifodd\realpageno
+ % discard nextbox
+ \else
+ \dododosetlayer[#1][\v!left][#3]%
+ \fi
+ \else\ifx\@@layerloc\v!odd
+ \ifodd\realpageno
+ \dododosetlayer[#1][\v!right][#3]%
+ %\else
+ % discard nextbox
+ \fi
+ \else
+ \dododosetlayer[#1][#2][#3]%
+ \fi\fi
+ \else
+ \writestatus{layer}{unknown layer #1}%
+ \fi
+ \egroup}%
+ \hbox}
+
+\newbox\layerbox
+
+\newdimen\@@layerxsiz
+\newdimen\@@layerysiz
+\newdimen\@@layerxoff
+\newdimen\@@layeryoff
+\newdimen\@@layerxpos
+\newdimen\@@layerypos
+
+\let\lastlayerxpos\!!zeropoint
+\let\lastlayerypos\!!zeropoint
+\let\lastlayerwd \!!zeropoint
+\let\lastlayerht \!!zeropoint
+\let\lastlayerdp \!!zeropoint
+
+% todo left/right
+
+\def\setlastlayerpos#1%
+ {\edef\layerpage{\MPp{lyr:\the\currentlayerdata}}%
+ \xdef\lastlayerxpos{\the\dimexpr-\MPx{lyr:#1:\layerpage}+\MPx{lyr:\the\currentlayerdata}\relax}%
+ \xdef\lastlayerypos{\the\dimexpr \MPy{lyr:#1:\layerpage}-\MPy{lyr:\the\currentlayerdata}\relax}}
+
+\def\definelayerpreset
+ {\dodoubleargument\dodefinelayerpreset}
+
+% \def\dodefinelayerpreset[#1][#2]%
+% {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}}
+%
+% more fun: \definelayerpreset[whatever][lefttop]
+
+\def\dodefinelayerpreset[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}}
+ {\setvalue{\??ll\??ll#1}{\getvalue{\??ll\??ll#2}}}}
+
+\def\dopresetlayer#1#2#3% #1=list #2=tag #3=list
+ {\getparameters[\??ll#2][#1,#3]}
+
+\letempty\currentlayer
+
+\def\layerparameter#1{\csname\??ll\currentlayer#1\endcsname}
+
+\newdimen\layerwidth
+\newdimen\layerheight
+
+\chardef\@@lacome=1 % LAyerCOnstructionMEthod / temp, will be default
+
+\def\dododosetlayer[#1][#2][#3]% will be sped up
+ {% we use the global width, never change this
+ \def\currentlayer{#1}%
+ \@@layerxsiz\layerparameter\c!width
+ \@@layerysiz\layerparameter\c!height
+ \layerwidth \@@layerxsiz
+ \layerheight\@@layerysiz
+ % preroll
+ \getparameters[\??ll\currentlayer][#3]%
+ % presets and real roll
+% maybe todo:
+% \doif{\layerparameter\c!method}\v!fit
+% {\@@layerxsiz\thelayerwidth \currentlayer
+% \@@layerysiz\thelayerheight\currentlayer
+% \layerwidth \@@layerxsiz
+% \layerheight\@@layerysiz
+% }%
+ % etc
+ \executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}%
+ % that was real slow
+ \doif{\layerparameter\c!position}\v!overlay % slow, use \dosetvalue instead
+ {\getparameters[\??ll\currentlayer][\c!width=\zeropoint,\c!height=\zeropoint,\c!position=\v!yes]}%
+ \doifsomething{\layerparameter\c!rotation}
+ {\setbox\nextbox\hbox
+ {\rotate % to be checked with new rotation
+ [\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]
+ {\flushnextbox}}}%
+ % no, not local
+ % \@@layerxsiz\layerparameter\c!width
+ % \@@layerysiz\layerparameter\c!height
+ % never change that
+ \@@layerxpos\layerparameter\c!x
+ \@@layerypos\layerparameter\c!y
+ \doifelse{\layerparameter\c!hoffset}\v!max
+ {\@@layerxoff\@@layerxsiz}{\@@layerxoff\layerparameter\c!hoffset}%
+ \doifelse{\layerparameter\c!voffset}\v!max
+ {\@@layeryoff\@@layerysiz}{\@@layeryoff\layerparameter\c!voffset}%
+ % dx/dy are internal context ones and can be used in preset
+ \advance\@@layerxoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dx\relax
+ \advance\@@layeryoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dy\relax
+ \@@layerxpos\layerparameter\c!sx\@@layerxpos
+ \@@layerypos\layerparameter\c!sy\@@layerypos
+ \@@layerxoff\layerparameter\c!sx\@@layerxoff
+ \@@layeryoff\layerparameter\c!sy\@@layeryoff
+ \doifelse{\layerparameter\c!position}\v!yes % combine ^
+ {\setlastlayerpos{#2\currentlayer}% todo l/r %%%%%%%%%%%%
+ \@@layerxpos\lastlayerxpos
+ \@@layerypos\lastlayerypos
+ \letgvalue{\??ll\currentlayer\layerpage\c!position}\v!yes
+ \letgvalue{\??ll\currentlayer\c!state}\v!start % needed ?
+ \setbox\layerbox\vbox to \@@layerysiz
+ {\hbox to \@@layerxsiz{\xypos{lyr:\the\currentlayerdata}\hss}\vss}}
+ {\setbox\layerbox\emptybox
+ \globallet\lastlayerxpos\!!zeropoint
+ \globallet\lastlayerypos\!!zeropoint
+ \ExpandBothAfter\doifinset\v!bottom{\layerparameter\c!corner}
+ {\ifnum\layerparameter\c!line=\zerocount\else % can be < 0
+ \setevalue{\??ll\currentlayer\c!line}%
+ {\the\numexpr-\layerparameter\c!line+\layoutlines+\plusone\relax}%
+ \fi
+ \ifdim\@@layerysiz>\zeropoint
+ \advance\@@layerypos-\@@layerysiz
+ \@@layerypos-\@@layerypos
+ \@@layeryoff-\@@layeryoff
+ \fi}%
+ \ExpandBothAfter\doifinset\v!right{\layerparameter\c!corner}
+ {\ifnum\layerparameter\c!column=\zerocount\else % can be < 0
+ \setevalue{\??ll\currentlayer\c!column}%
+ {\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}%
+ \fi
+ \ifdim\@@layerxsiz>\zeropoint
+ \advance\@@layerxpos-\@@layerxsiz
+ \@@layerxpos-\@@layerxpos
+ \@@layerxoff-\@@layerxoff
+ \fi}%
+ \ExpandBothAfter\doif\v!middle{\layerparameter\c!corner}
+ {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos.5\@@layerxsiz \fi
+ \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi}%
+ \edef\layerpage{\layerparameter\c!page}}%
+ \doifsomething\layerpage
+ {\edef\layerpage{:\layerpage}%
+ \doifundefined{\@@layerbox#2\currentlayer\layerpage}
+ {\global\expandafter\newbox\csname\@@layerbox#2\currentlayer\layerpage\endcsname}}%
+ \dontcomplain % more comfortable
+ \mathchardef\layerpagebox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
+ \ifvoid\layerpagebox
+ \gsetboxllx\layerpagebox\zeropoint
+ \gsetboxlly\layerpagebox\zeropoint
+ \fi
+ \global\setbox\layerpagebox\vbox %to \layerparameter\c!height % new, otherwise no negative y possible
+ {\offinterlineskip
+ %postpone, to after nextboxwd correction % \hsize\layerparameter\c!width % new, keep box small
+ %\ifvoid\csname\@@layerbox\currentlayer\layerpage\endcsname\else % why not #2#1
+ \ifvoid\layerpagebox
+ \let\lastlayerwidth \zeropoint
+ \let\lastlayerheight\zeropoint
+ \else
+ \edef\lastlayerwidth {\the\wd\layerpagebox}%
+ \edef\lastlayerheight{\the\ht\layerpagebox}%
+ \ht\layerpagebox\zeropoint
+ \dp\layerpagebox\zeropoint
+ \wd\layerpagebox\zeropoint
+ \doifnot{\layerparameter\c!direction}\v!reverse{\box\layerpagebox}%
+ \fi
+ % don't move
+ \xdef\lastlayerwd{\the\nextboxwd}%
+ \xdef\lastlayerht{\the\nextboxht}% % not entirely ok when grid !
+ \xdef\lastlayerdp{\the\nextboxdp}% % not entirely ok when grid !
+ % this code
+ \doifelse{\layerparameter\c!location}\v!grid\donetrue\donefalse
+ \ifdone
+ \nextboxht\strutheight
+ \nextboxdp\strutdepth
+ \else
+ \setbox\nextbox\hbox{\alignedbox[\layerparameter\c!location]\vbox{\flushnextbox}}%
+ \fi
+ \ifnum\layerparameter\c!line=\zerocount\else % no \ifcase, can be negative
+ \advance\@@layerypos\dimexpr\layerparameter\c!line\lineheight+\topskip-\lineheight-\nextboxht\relax
+ \fi
+ \ifnum\layerparameter\c!column=\zerocount\else % no \ifcase, can be negative
+ \advance\@@layerxpos\layoutcolumnoffset{\layerparameter\c!column}%
+ \fi
+ \ifdone
+ \setbox\nextbox\hbox{\alignedbox[rb]\vbox{\flushnextbox}}%
+ \fi
+ % ll registration
+ \scratchdimen\@@layerxpos
+ \advance\scratchdimen\@@layerxoff
+ \ifdim\scratchdimen<\getboxllx\layerpagebox
+ \gsetboxllx\layerpagebox\scratchdimen
+ \fi
+ \ifcase\@@lacome\or % this test will become obsolete
+ \advance\scratchdimen\nextboxwd
+ \nextboxwd\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
+ \fi
+ \scratchdimen\@@layerypos
+ \advance\scratchdimen\@@layeryoff
+ \ifdim\scratchdimen<\getboxlly\layerpagebox
+ \gsetboxlly\layerpagebox\scratchdimen
+ \fi
+ % ll compensation
+ \ifcase\@@lacome\or % this test will become obsolete
+ \advance\scratchdimen\dimexpr\nextboxht+\nextboxdp\relax
+ \nextboxht\ifdim\scratchdimen>\lastlayerheight \scratchdimen \else \lastlayerheight \fi
+ \nextboxdp\zeropoint
+ \fi
+ % placement
+ \hsize\layerparameter\c!width % new, keep box small
+ \vbox to \layerparameter\c!height \bgroup
+ \smashbox\nextbox
+ \vskip\dimexpr\@@layerypos+\@@layeryoff\relax
+ \hskip\dimexpr\@@layerxpos+\@@layerxoff\relax
+ \flushnextbox
+ \ifvoid\layerpagebox
+ % already flushed
+ \else
+ % the reverse case % check !
+ \vskip-\dimexpr\@@layerypos+\@@layeryoff\relax
+ \box\layerpagebox
+ \fi
+ \egroup}%
+ % when position is true, the layerbox holds the compensation and needs
+ % to be placed; never change this !
+ \ifvoid\layerbox\else\box\layerbox\fi}
+
+%D Given the task to be accomplished, the previous macro is
+%D not even that complicated. It mainly comes down to skipping
+%D to the right place and placing a box on top of or below the
+%D existing content. In the case of position tracking, another
+%D reference point is chosen.
+
+%D \macros
+%D {doifelselayerdata}
+%D
+
+\def\doifelselayerdata#1%
+ {\ifundefined{\@@layerbox#1}%
+ \@EA\secondoftwoarguments
+ \else\ifvoid\csname\@@layerbox#1\endcsname
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
+
+%D \macros
+%D {flushlayer}
+%D
+%D When we flush a layer, we flush both the main one and the
+%D page dependent one (when defined). This feature is more
+%D efficient in \ETEX\ since there testing for an undefined
+%D macro does not takes hash space.
+
+% todo: setups before flush, handy hook
+
+\unexpanded\def\flushlayer[#1]%
+ {\doifelsevalue{\??ll#1\c!state}\v!next
+ {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up
+ {\doifelsevalue{\??ll#1\c!state}\v!continue
+ {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up
+ {\doifelsevalue{\??ll#1\c!doublesided}\v!yes
+ {\doifundefinedelse{\@@layerbox#1}%
+ {\dodoflushlayerA[#1]}
+ {\doifbothsidesoverruled
+ {\dodoflushlayerB\v!left [#1]}% left
+ {\dodoflushlayerB\v!right[#1]}% right
+ {\dodoflushlayerB\v!left [#1]}}}% left
+ {\dodoflushlayerA[#1]}}}}
+
+\def\dodoflushlayerA[#1]%
+ {\doifnotvalue{\??ll#1\c!state}\v!stop
+ {\startoverlay
+ {\dodoflushlayer1{#1}{#1}}
+ {\dodoflushlayer0{#1}{#1:\realfolio}}
+ \stopoverlay}}
+
+\def\dodoflushlayerB#1[#2]%
+ {\doifnotvalue{\??ll#2\c!state}\v!stop
+ {\startoverlay
+ {\dodoflushlayer1{#2}{#2}}
+ {\dodoflushlayer0{#2}{#2:\realfolio}}
+ {\dodoflushlayer1{#2}{#1#2}}
+ {\dodoflushlayer0{#2}{#1#2:\realfolio}}
+ \stopoverlay}}
+
+\def\dodoflushlayer#1#2#3%
+ {\ifundefined{\@@layerbox#3}%
+ \ifcase#1\else\writestatus{layer}{unknown layer #3}\fi
+ \else
+ \bgroup
+ \forgetall
+ \offinterlineskip
+ % needed because we need to handle method
+ \executeifdefined{\??ll\??ll\getvalue{\??ll#2\c!preset}}\gobbletwoarguments{#2}{}%
+ %
+ \doifvalue{\??ll#2\c!option}\v!test\tracelayerstrue
+ \iftracelayers\traceboxplacementtrue\fi
+ \!!doneafalse
+ \!!donebfalse
+ \doifvalue{\??ll#2\c!method}\v!overlay\!!doneatrue
+ \doifvalue{\??ll#2\c!method}\v!fit\!!donebtrue
+ \!!donectrue
+ \ifcase#1\else
+ \doifnotvalue{\??ll#2\c!position}\v!yes
+ {\doifvalue{\??ll#2\c!repeat}\v!yes\!!donecfalse
+ \doifvalue{\??ll#2\c!state}\v!repeat\!!donecfalse}%
+ \fi
+ \mathchardef\layerbox\csname\@@layerbox#3\endcsname
+ % we need to copy in order to retain the negative offsets for a next
+ % stage of additions, i.e. llx/lly accumulate in repeat mode and the
+ % compensation may differ each flush depending on added content
+ \setbox\nextbox \if!!doneb
+% \vbox
+% {\scratchdimen\getboxlly\layerbox
+% \vskip-\scratchdimen
+% \scratchdimen\getboxllx\layerbox
+% \hskip-\scratchdimen
+% \advance\scratchdimen-\wd\layerbox
+% \hsize-\scratchdimen
+% \if!!donec\box\else\copy\fi\layerbox}%
+ \vbox
+ {\vskip-\getboxlly\layerbox
+ \hskip-\getboxllx\layerbox
+ \hsize-\dimexpr\getboxllx\layerbox-\wd\layerbox\relax
+ \if!!donec\box\else\copy\fi\layerbox}%
+ \else
+ \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying
+ \fi
+ % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset)
+ \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi
+ {\hbox \if!!donea to \overlaywidth \fi
+ {% klopt dit? #3 en niet #2 ?
+ \doifvalue{\??ll#3\realfolio\c!position}\v!yes{\xypos{lyr:#3:\realfolio}}%
+ \doifoverlayelse{#3}
+ {\box\nextbox}
+ {\startlayoutcomponent{l:#3}{layer #3}\box\nextbox\stoplayoutcomponent}%
+ \hss}%
+ \vss}%
+ \if!!donec
+ \gsetboxllx\layerbox\zeropoint
+ \gsetboxlly\layerbox\zeropoint
+ \fi
+ \egroup
+ \fi}
+
+% \definelayer[test][method=fit] \setupcolors[state=start] \tracelayerstrue
+%
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=10pt]{g}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=-10pt]{bb}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test][x=-20pt]{cccccc}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{dd}\setlayer[test][x=-20pt,y=-3pt]{eeeeee}\flushlayer[test]}
+
+%D \macros
+%D {composedlayer,placelayer,tightlayer}
+%D
+%D This is a handy shortcut, which saves a couple of braces
+%D when we use it as parameter. This name also suits better
+%D to other layering commands.
+
+\def\composedlayer#1{\flushlayer[#1]}
+
+\let\placelayer\flushlayer
+
+\def\tightlayer[#1]%
+ {\hbox
+ {\def\currentlayer{#1}% todo: left/right
+ \setbox\nextbox\emptybox % hoogte/breedte are \wd\nextbox/\ht\nextbox
+ \hsize\layerparameter\c!width % \overlaywidth = \hsize
+ \vsize\layerparameter\c!height % \overlaywheight = \vsize
+ \composedlayer{#1}}}
+
+%D \macros
+%D {resetlayer}
+%D
+%D This macro hardly needs an explanation (and is seldom
+%D needed as well).
+
+\def\doresetlayer#1%
+ {\ifundefined{\@@layerbox#1}\else
+ \global\setbox\csname\@@layerbox#1\endcsname\emptybox
+ \fi}
+
+\def\resetlayer[#1]%
+ {\doresetlayer{#1}%
+ \doifvalue{\??ll#1\c!doublesided}\v!yes % kind of redundant test
+ {\doresetlayer{\v!left #1}%
+ \doresetlayer{\v!right#1}}%
+ \doresetlayer{#1:\realfolio}}
+
+%D \macros
+%D {setMPlayer}
+%D
+%D The following layer macro uses the positions that are
+%D registered by \METAPOST.
+%D
+%D \starttyping
+%D \definelayer[test]
+%D
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \setMPlayer [test] [somepos-3] {\externalfigure[cow.mps][width=2cm]}
+%D
+%D \startuseMPgraphic{oeps}
+%D draw fullcircle scaled 10cm withcolor red ;
+%D register ("somepos-1",2cm,3cm,center currentpicture) ;
+%D register ("somepos-2",8cm,5cm,(-1cm,-2cm)) ;
+%D register ("somepos-3",0cm,0cm,(-2cm,2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \getMPlayer[test]{\useMPgraphic{oeps}}
+%D \stoptyping
+%D
+%D The last line is equivalent to
+%D
+%D \starttyping
+%D \framed
+%D [background={foreground,test},offset=overlay]
+%D {\useMPgraphic{oeps}}
+%D \stoptyping
+
+\def\setMPlayer
+ {\dotripleempty\dosetMPlayer}
+
+\def\MPlayerwidth {\hsize}
+\def\MPlayerheight{\vsize}
+
+\def\dosetMPlayer[#1][#2][#3]%
+ {\checkpositions % new, else only support after \starttext
+ \edef\MPlayerwidth {\MPw{#2}}%
+ \edef\MPlayerheight{\MPh{#2}}%
+ \setlayer[#1][\c!x=\MPx{#2},\c!y=\MPy{#2},\c!position=\v!no,#3]}
+
+\def\getMPlayer
+ {\dodoubleempty\dogetMPlayer}
+
+\def\dogetMPlayer[#1][#2]%
+ {\framed
+ [\c!background={\v!foreground,#1},
+ \c!frame=\v!off,
+ \c!offset=\v!overlay,#2]}
+
+% Some day this (old) mechanism will be combined/integrated
+% in overlays
+
+\newskip\xposition \newskip\yposition
+\newskip\xdimension \newskip\ydimension
+\newskip\xoffset \newskip\yoffset
+
+% already defined \newbox\positionbox
+
+\def\startpositioning
+ {\bgroup
+ \xposition \zeropoint \yposition \zeropoint
+ \xdimension\zeropoint \ydimension\zeropoint
+ \xoffset \zeropoint \yoffset \zeropoint
+ \hfuzz \paperwidth \vfuzz \paperheight
+ \setbox\positionbox\hbox\bgroup}
+
+\def\stoppositioning
+ {\doifnot\@@psoffset\v!yes
+ {\global\xoffset\zeropoint
+ \global\yoffset\zeropoint}%
+ \global\advance\xdimension \xoffset
+ \global\advance\ydimension \yoffset
+ \egroup
+ \vbox to \ydimension
+ {\vskip\yoffset
+ \hbox to \xdimension
+ {\hskip\xoffset
+ \box\positionbox
+ \hfill}
+ \vfill}%
+ \egroup}
+
+\def\resetpositioning
+ {\getparameters[\??ps]
+ [\c!state=\v!start,%
+ \c!unit=\s!cm,%
+ \c!factor=1,%
+ \c!scale=1,%
+ \c!xfactor=\@@psfactor,%
+ \c!yfactor=\@@psfactor,%
+ \c!xscale=\@@psscale,%
+ \c!yscale=\@@psscale,%
+ \c!xstep=\v!absolute,%
+ \c!ystep=\v!absolute,%
+ \c!xoffset=\!!zeropoint,%
+ \c!yoffset=\!!zeropoint]}
+
+\def\setuppositioning
+ {\resetpositioning
+ \dodoubleargument\getparameters[\??ps]}
+
+\def\calculateposition#1#2#3#4#5#6#7#8#9%
+ {\setdimensionwithunit\scratchskip{#1}\@@psunit
+ \scratchskip#8\scratchskip
+ \scratchskip#9\scratchskip
+ \advance\scratchskip #4\relax
+ \doif{#2}\v!relative
+ {\advance\scratchskip #3%
+ \let#4\!!zeropoint}%
+ #3\scratchskip\relax
+ \doifnot\@@psstate\v!overlay
+ {\scratchskip#5\relax
+ \advance\scratchskip #3\relax
+ \ifdim#3<-#7\relax \global#7-#3\relax \fi
+ \ifdim\scratchskip>#6\relax \global#6\scratchskip\relax \fi}}
+
+\def\position
+ {\dosingleempty\doposition}
+
+\def\doposition[#1]#2(#3,#4)%
+ {\dowithnextbox
+ {\bgroup
+ \getparameters[\??ps][#1]%
+ \dontcomplain
+ \calculateposition{#3}\@@psxstep\xposition
+ \@@psxoffset{\nextboxwd}\xdimension\xoffset
+ \@@psxscale\@@psxfactor
+ \scratchdimen\nextboxht \advance\scratchdimen \nextboxdp
+ \calculateposition{#4}\@@psystep\yposition
+ \@@psyoffset\scratchdimen\ydimension\yoffset
+ \@@psyscale\@@psyfactor
+ \vbox to \zeropoint % kan beter.
+ {\vskip\yposition
+ \hbox to \zeropoint
+ {\hskip\xposition
+ \flushnextbox
+ \hss}
+ \vss}%
+ \xdef\dopoppositioning
+ {\xposition\the\xposition
+ \yposition\the\yposition
+ \noexpand\def\noexpand\@@psxoffset{\@@psxoffset}%
+ \noexpand\def\noexpand\@@psyoffset{\@@psyoffset}}%
+ \egroup
+ \dopoppositioning
+ \ignorespaces}
+ \hbox}
+
+\resetpositioning
+
+\setuppositioning
+ [\c!unit=\s!cm,
+ \c!factor=1,
+ \c!scale=1,
+ \c!xstep=\v!absolute,
+ \c!ystep=\v!absolute,
+ \c!offset=\v!yes,
+ \c!xoffset=\!!zeropoint,
+ \c!yoffset=\!!zeropoint]
+
+%D Watch out, a redefinition:
+
+\ifx\settextpagecontent\undefined \writestatus\m!systems{error in page-lyr.tex} \wait \fi
+
+\let\normalsettextpagecontent\settextpagecontent
+
+\definelayer
+ [OTRTEXT]
+
+\setuplayer
+ [OTRTEXT]
+ [\c!width=\innermakeupwidth,
+ \c!height=\textheight]
+
+% will be overloaded in page-spr
+
+\def\settextpagecontent#1#2#3% #2 and #3 will disappear
+ {\doifelselayerdata{OTRTEXT}
+ {\setbox#1\hbox to \makeupwidth
+ {\startoverlay
+ {\tightlayer[OTRTEXT]} % first, otherwise problems with toc
+ {\normalsettextpagecontent{#1}{#2}{#3}\box#1}
+ \stopoverlay}%
+ \dp#1\zeropoint}%
+ {\normalsettextpagecontent{#1}{#2}{#3}}}
+
+\protect \endinput
diff --git a/tex/context/base/pack-lyr.mkiv b/tex/context/base/pack-lyr.mkiv
new file mode 100644
index 000000000..0cb3ee244
--- /dev/null
+++ b/tex/context/base/pack-lyr.mkiv
@@ -0,0 +1,786 @@
+%D \module
+%D [ file=pack-lyr,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Layers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Layers}
+
+% todo : first / last / next / +... => page key
+% test on left/right box when no doublesided option given
+% use \ifcsname instead of doifvalue
+
+\unprotect
+
+% When being backgrounds layers get the background offset
+% displacement. Should be an option, on by default
+% (compatibility).
+
+% positie=forceer == ja maar dan ook in status=herhaal
+
+%D The layering mechanism implemented here is independent of
+%D the output routine, but future extensions may depend on a
+%D more close cooperation.
+
+%D First we overload a macro from \type {core-rul}. From now on
+%D we accept a (optional) argument: the specific layer it
+%D will go in. This means that we can move an overlay from one
+%D background to the other using the dimensions of the parent.
+
+\ifx\undefined\defineoverlay \message{loaded to early} \wait \fi
+
+\unexpanded\def\defineoverlay
+ {\dotripleempty\dodefineoverlay}
+
+\def\dodefineoverlay[#1][#2][#3]% overlay [layer] content
+ {\ifthirdargument
+ %\writestatus{BEWARE}{This (overlay definition) has changed!}% temp
+ \def\docommand##1{\setvalue{\??ov##1}{\setlayer[#2]{\executedefinedoverlay{##1}{#3}}}}
+ \else
+ \def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}%
+ \fi
+ \processcommalist[#1]\docommand}
+
+%D When tracing is turned on, a couple of boxes will
+%D show up as well as the reference point.
+
+\newif\iftracelayers % \tracelayerstrue
+
+%D This handy constant saved some string memory.
+
+\def\@@layerbox{@@layerbox}
+
+%D \macros
+%D {definelayer}
+%D
+%D Each layer gets its own (global) box. This also means that
+%D the data that goes into a layer, is typeset immediately.
+%D Each layer automatically gets an associated overlay,
+%D which can be used in any background assignment.
+
+% todo : links/rechts
+
+\unexpanded\def\definelayer
+ {\dodoubleargument\dodefinelayer}
+
+\def\dodefinelayer[#1][#2]% \zeropoint ipv \!!zeropoint
+ {\setuplayer
+ [#1]
+ [\c!doublesided=,\c!preset=,
+ \c!state=\v!start,\c!direction=\v!normal,\c!option=,
+ \c!x=\zeropoint,\c!y=\zeropoint,\c!position=\v!no,
+ \c!line=0,\c!column=0,
+ \c!width=\nextboxwd,\c!height=\nextboxht,
+ \c!offset=\zeropoint,\c!rotation=, % geen 0 !
+ \c!hoffset=\zeropoint,\c!voffset=\zeropoint,
+ \c!dx=\zeropoint,\c!dy=\zeropoint,
+ \c!location=rb,\c!position=\v!no,\c!page=,
+ \c!method=\v!overlay,
+ \c!sx=1,\c!sy=1,\c!corner=,#2]%
+ \doifvalue{\??ll#1\c!doublesided}\v!yes
+ {\dopresetlayerbox{\v!left #1}%
+ \dopresetlayerbox{\v!right#1}}%
+ \dopresetlayerbox{#1}%
+ \defineoverlay[#1][\composedlayer{#1}]}
+
+\def\dopresetlayerbox#1%
+ {\ifcsname\@@layerbox#1\endcsname
+ \resetlayer[#1]%
+ \else
+ \expandafter\newbox\csname\@@layerbox#1\endcsname
+ \fi}
+
+%D \macros
+%D {setuplayer}
+%D
+%D After a layer is defined, you can change its
+%D characteristics.
+
+\unexpanded\def\setuplayer
+ {\dodoubleargument\dosetuplayer}
+
+\def\dosetuplayer[#1][#2]%
+ {\def\docommand##1{\getparameters[\??ll##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+%D \macros
+%D {setlayer}
+%D
+%D Data is moved into a layer with the following macro. When
+%D \type {position} is set, relative positioning is used, with
+%D the current point as reference point. Otherwise the topleft
+%D corner is used as reference point.
+%D
+%D \starttyping
+%D \setlayer [identifier] [optional parameters] {data}
+%D \stoptyping
+
+\newcount\currentlayerdata
+
+\let\currentlayerwidth \!!zeropoint
+\let\currentlayerheight\!!zeropoint
+
+\def\setcurrentlayerdimensions
+ {\dodoubleempty\dosetcurrentlayerdimensions}
+
+\def\dosetcurrentlayerdimensions[#1][#2]% name left|right
+ {\edef\currentlayerwidth {\thelayerwidth {#2#1}}%
+ \edef\currentlayerheight{\thelayerheight{#2#1}}}
+
+\def\thelayerwidth #1{\the\wd\executeifdefined{\@@layerbox#1}\emptybox}
+\def\thelayerheight#1{\the\ht\executeifdefined{\@@layerbox#1}\emptybox}
+
+\def\setlayer
+ {\dotripleempty\dosetlayer}
+
+% \def\dosetlayer[#1][#2][#3]% #4 == box do \fi is ok
+% {\doifelsevalue{\??ll#1\c!state}\v!stop
+% {\dowithnextbox\donothing\hbox}
+% {\ifthirdargument
+% \dodosetlayer[#1][#2][#3]%
+% \else
+% \dodosetlayer[#1][][#2]%
+% \fi}}
+
+\def\dosetlayer[#1][#2][#3]% #4 == box do \fi is ok
+ {\doifelsevalue{\??ll#1\c!state}\v!stop
+ {\dowithnextbox\donothing\hbox}
+ {\ifthirdargument
+ \dodosetlayer[#1][#2][#3]%
+ \else
+ \doifassignmentelse{#2}
+ {\dodosetlayer[#1][][#2]}%
+ {\dodosetlayer[#1][#2][]}%
+ \fi}}
+
+\def\dodosetlayer[#1][#2][#3]% #2 = links/rechts
+ {\bgroup
+ \recalculatebackgrounds % brrr
+ \global\advance\currentlayerdata\plusone
+ \forgetall
+ \dontcomplain
+ \doifvalue{\??ll#1\c!option}\v!test\tracelayerstrue
+ \iftracelayers\traceboxplacementtrue\fi
+ \dowithnextbox{\dodosetlayerindeed{#1}{#2}{#3}\egroup}\hbox}
+
+\def\dodosetlayerindeed#1#2#3% #2 = links/rechts
+ {\ifcsname\@@layerbox#1\endcsname % nb: odd/even discard, left/right not
+ \edef\@@layerloc{#2}%
+ \ifx\@@layerloc\v!even
+ \ifodd\realpageno
+ % discard nextbox
+ \else
+ \dododosetlayer[#1][\v!left][#3]%
+ \fi
+ \else\ifx\@@layerloc\v!odd
+ \ifodd\realpageno
+ \dododosetlayer[#1][\v!right][#3]%
+ %\else
+ % discard nextbox
+ \fi
+ \else
+ \dododosetlayer[#1][#2][#3]%
+ \fi\fi
+ \else
+ \writestatus{layer}{unknown layer #1}%
+ \fi}
+
+\newbox\layerbox
+
+\newdimen\@@layerxsiz
+\newdimen\@@layerysiz
+\newdimen\@@layerxoff
+\newdimen\@@layeryoff
+\newdimen\@@layerxpos
+\newdimen\@@layerypos
+
+\let\lastlayerxpos\!!zeropoint
+\let\lastlayerypos\!!zeropoint
+\let\lastlayerwd \!!zeropoint
+\let\lastlayerht \!!zeropoint
+\let\lastlayerdp \!!zeropoint
+
+% todo left/right
+
+\def\setlastlayerpos#1%
+ {\edef\layerpage{\MPp{lyr:\the\currentlayerdata}}%
+ \xdef\lastlayerxpos{\the\dimexpr-\MPx{lyr:#1:\layerpage}+\MPx{lyr:\the\currentlayerdata}\relax}%
+ \xdef\lastlayerypos{\the\dimexpr \MPy{lyr:#1:\layerpage}-\MPy{lyr:\the\currentlayerdata}\relax}}
+
+\unexpanded\def\definelayerpreset
+ {\dodoubleargument\dodefinelayerpreset}
+
+% \def\dodefinelayerpreset[#1][#2]%
+% {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}}
+%
+% more fun: \definelayerpreset[whatever][lefttop]
+
+\def\dodefinelayerpreset[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\setvalue{\??ll\??ll#1}{\dopresetlayer{#2}}}
+ {\setvalue{\??ll\??ll#1}{\csname\??ll\??ll#2\endcsname}}}
+
+\def\dopresetlayer#1#2#3% #1=list #2=tag #3=list
+ {\getparameters[\??ll#2][#1,#3]}
+
+\letempty\currentlayer
+
+\def\layerparameter#1{\csname\??ll\currentlayer#1\endcsname}
+
+\newdimen\layerwidth
+\newdimen\layerheight
+
+\chardef\@@lacome=1 % LAyerCOnstructionMEthod / temp, will be default
+
+\def\dododosetlayer[#1][#2][#3]% will be sped up
+ {% we use the global width, never change this
+ \def\currentlayer{#1}%
+ \@@layerxsiz\layerparameter\c!width
+ \@@layerysiz\layerparameter\c!height
+ \layerwidth \@@layerxsiz
+ \layerheight\@@layerysiz
+ % preroll
+ \getparameters[\??ll\currentlayer][#3]%
+ %
+ % \executeifdefined{\??ll\??ll\layerparameter\c!preset}\gobbletwoarguments\currentlayer{#3}%
+ %
+ \edef\@@currentlayerpreset{\layerparameter\c!preset}%
+ \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{#3}\fi
+ %
+ \doif{\layerparameter\c!position}\v!overlay % slow, use \dosetvalue instead
+ {\getparameters[\??ll\currentlayer][\c!width=\zeropoint,\c!height=\zeropoint,\c!position=\v!yes]}%
+ \doifsomething{\layerparameter\c!rotation}% todo: use direct lowlevel call
+ {\setbox\nextbox\hbox{\rotate[\c!location=\v!high,\c!rotation=\layerparameter\c!rotation]{\flushnextbox}}}%
+ % no, not local
+ % \@@layerxsiz\layerparameter\c!width
+ % \@@layerysiz\layerparameter\c!height
+ % never change that
+ \@@layerxpos\layerparameter\c!x
+ \@@layerypos\layerparameter\c!y
+ \doifelse{\layerparameter\c!hoffset}\v!max{\@@layerxoff\@@layerxsiz}{\@@layerxoff\layerparameter\c!hoffset}%
+ \doifelse{\layerparameter\c!voffset}\v!max{\@@layeryoff\@@layerysiz}{\@@layeryoff\layerparameter\c!voffset}%
+ % dx/dy are internal context ones and can be used in preset
+ \advance\@@layerxoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dx\relax
+ \advance\@@layeryoff\dimexpr\layerparameter\c!offset+\layerparameter\c!dy\relax
+ \@@layerxpos\layerparameter\c!sx\@@layerxpos
+ \@@layerypos\layerparameter\c!sy\@@layerypos
+ \@@layerxoff\layerparameter\c!sx\@@layerxoff
+ \@@layeryoff\layerparameter\c!sy\@@layeryoff
+ \edef\@@currentlayerposition{\layerparameter\c!position}%
+ \ifx\@@currentlayerposition\v!yes % combine ^
+ \setlastlayerpos{#2\currentlayer}% sets \layerpage; todo l/r %%%%%%%%%%%%
+ \@@layerxpos\lastlayerxpos
+ \@@layerypos\lastlayerypos
+ \letgvalue{\??ll\currentlayer\layerpage\c!position}\v!yes
+ \letgvalue{\??ll\currentlayer\c!state}\v!start % needed ?
+ \setbox\layerbox\vbox to \@@layerysiz{\hbox to \@@layerxsiz{\xypos{lyr:\the\currentlayerdata}\hss}\vss}%
+ \else
+ \setbox\layerbox\emptybox
+ \globallet\lastlayerxpos\!!zeropoint
+ \globallet\lastlayerypos\!!zeropoint
+ \normalexpanded{\noexpand\doifinset{\v!bottom}{\layerparameter\c!corner}}\dosetlayerbottompositions
+ \normalexpanded{\noexpand\doifinset{\v!right }{\layerparameter\c!corner}}\dosetlayerrightpositions
+ \normalexpanded{\noexpand\doifinset{\v!middle}{\layerparameter\c!corner}}\dosetlayermiddlepositions
+ \edef\layerpage{\layerparameter\c!page}%
+ \fi
+ \ifx\layerpage\empty \else % is expanded
+ \edef\layerpage{:\layerpage}%
+ \ifcsname\@@layerbox#2\currentlayer\layerpage\endcsname \else
+ \expandafter\newbox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
+ \fi
+ \fi
+ \chardef\layerpagebox\csname\@@layerbox#2\currentlayer\layerpage\endcsname
+ \ifvoid\layerpagebox
+ \gsetboxllx\layerpagebox\zeropoint
+ \gsetboxlly\layerpagebox\zeropoint
+ \fi
+ \global\setbox\layerpagebox\vbox %to \layerparameter\c!height % new, otherwise no negative y possible
+ {\offinterlineskip
+ %postpone, to after nextboxwd correction % \hsize\layerparameter\c!width % new, keep box small
+ %\ifvoid\csname\@@layerbox\currentlayer\layerpage\endcsname\else % why not #2#1
+ \ifvoid\layerpagebox
+ \let\lastlayerwidth \zeropoint
+ \let\lastlayerheight\zeropoint
+ \else
+ \edef\lastlayerwidth {\the\wd\layerpagebox}%
+ \edef\lastlayerheight{\the\ht\layerpagebox}%
+ \ht\layerpagebox\zeropoint
+ \dp\layerpagebox\zeropoint
+ \wd\layerpagebox\zeropoint
+ \doifnot{\layerparameter\c!direction}\v!reverse{\box\layerpagebox}%
+ \fi
+ % don't move
+ \xdef\lastlayerwd{\the\nextboxwd}%
+ \xdef\lastlayerht{\the\nextboxht}% % not entirely ok when grid !
+ \xdef\lastlayerdp{\the\nextboxdp}% % not entirely ok when grid !
+ % this code
+ \doifelse{\layerparameter\c!location}\v!grid\donetrue\donefalse
+ \ifdone
+ \nextboxht\strutheight
+ \nextboxdp\strutdepth
+ \else
+ \setbox\nextbox\hbox{\alignedbox[\layerparameter\c!location]\vbox{\flushnextbox}}%
+ \fi
+ \ifnum\layerparameter\c!line=\zerocount\else % no \ifcase, can be negative
+ \advance\@@layerypos\dimexpr\layerparameter\c!line\lineheight+\topskip-\lineheight-\nextboxht\relax
+ \fi
+ \ifnum\layerparameter\c!column=\zerocount\else % no \ifcase, can be negative
+ \advance\@@layerxpos\layoutcolumnoffset{\layerparameter\c!column}%
+ \fi
+ \ifdone
+ \setbox\nextbox\hbox{\alignedbox[rb]\vbox{\flushnextbox}}%
+ \fi
+ % ll registration
+ \scratchdimen\@@layerxpos
+ \advance\scratchdimen\@@layerxoff
+ \ifdim\scratchdimen<\getboxllx\layerpagebox
+ \gsetboxllx\layerpagebox\scratchdimen
+ \fi
+ \ifcase\@@lacome\or % this test will become obsolete
+ \advance\scratchdimen\nextboxwd
+ \nextboxwd\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
+ \fi
+ \scratchdimen\dimexpr\@@layerypos+\@@layeryoff\relax
+ \ifdim\scratchdimen<\getboxlly\layerpagebox
+ \gsetboxlly\layerpagebox\scratchdimen
+ \fi
+ % ll compensation
+ \ifcase\@@lacome\or % this test will become obsolete
+ \advance\scratchdimen\dimexpr\nextboxht+\nextboxdp\relax
+ \nextboxht\ifdim\scratchdimen>\lastlayerheight \scratchdimen \else \lastlayerheight \fi
+ \nextboxdp\zeropoint
+ \fi
+ % placement
+ \hsize\layerparameter\c!width % new, keep box small
+ \vbox to \layerparameter\c!height \bgroup
+ \smashbox\nextbox
+ \vskip\dimexpr\@@layerypos+\@@layeryoff\relax
+ \hskip\dimexpr\@@layerxpos+\@@layerxoff\relax
+ \flushnextbox
+ \ifvoid\layerpagebox
+ % already flushed
+ \else
+ % the reverse case % check !
+ \vskip-\dimexpr\@@layerypos+\@@layeryoff\relax
+ \box\layerpagebox
+ \fi
+ \egroup}%
+ % when position is true, the layerbox holds the compensation and needs
+ % to be placed; never change this !
+ \ifvoid\layerbox\else\box\layerbox\fi}
+
+\def\dosetlayerbottompositions
+ {\ifnum\layerparameter\c!line=\zerocount\else % can be < 0
+ \setevalue{\??ll\currentlayer\c!line}{\the\numexpr-\layerparameter\c!line+\layoutlines+\plusone\relax}%
+ \fi
+ \ifdim\@@layerysiz>\zeropoint
+ \advance\@@layerypos-\@@layerysiz
+ \@@layerypos-\@@layerypos
+ \@@layeryoff-\@@layeryoff
+ \fi}
+
+\def\dosetlayerrightpositions
+ {\ifnum\layerparameter\c!column=\zerocount\else % can be < 0
+ \setevalue{\??ll\currentlayer\c!column}{\the\numexpr-\layerparameter\c!column+\layoutcolumns+\plusone\relax}%
+ \fi
+ \ifdim\@@layerxsiz>\zeropoint
+ \advance\@@layerxpos-\@@layerxsiz
+ \@@layerxpos-\@@layerxpos
+ \@@layerxoff-\@@layerxoff
+ \fi}
+
+\def\dosetlayermiddlepositions
+ {\ifdim\@@layerxsiz>\zeropoint \advance\@@layerxpos.5\@@layerxsiz \fi
+ \ifdim\@@layerysiz>\zeropoint \advance\@@layerypos.5\@@layerysiz \fi}
+
+%D Given the task to be accomplished, the previous macro is
+%D not even that complicated. It mainly comes down to skipping
+%D to the right place and placing a box on top of or below the
+%D existing content. In the case of position tracking, another
+%D reference point is chosen.
+
+%D \macros
+%D {doifelselayerdata}
+
+\def\doifelselayerdata#1%
+ {\ifcsname\@@layerbox#1\endcsname
+ \ifvoid\csname\@@layerbox#1\endcsname
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {flushlayer}
+%D
+%D When we flush a layer, we flush both the main one and the
+%D page dependent one (when defined). This feature is more
+%D efficient in \ETEX\ since there testing for an undefined
+%D macro does not takes hash space.
+
+% todo: setups before flush, handy hook
+
+% \unexpanded\def\flushlayer[#1]%
+% {\doifelsevalue{\??ll#1\c!state}\v!next
+% {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up
+% {\doifelsevalue{\??ll#1\c!state}\v!continue
+% {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up
+% {\doifelsevalue{\??ll#1\c!doublesided}\v!yes
+% {\doifundefinedelse{\@@layerbox#1}%
+% {\dodoflushlayerA[#1]}
+% {\doifbothsidesoverruled
+% {\dodoflushlayerB\v!left [#1]}% left
+% {\dodoflushlayerB\v!right[#1]}% right
+% {\dodoflushlayerB\v!left [#1]}}}% left
+% {\dodoflushlayerA[#1]}}}}
+
+\unexpanded\def\flushlayer[#1]% quite core, so optimized
+ {\begingroup
+ \forgetall
+ \edef\currentlayer{#1}%
+ \edef\@@currentlayerstate{\csname\??ll\currentlayer\c!state\endcsname}%
+ \ifx\@@currentlayerstate\v!stop
+ % nothing
+ \else\ifx\@@currentlayerstate\v!next
+ \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!start % dangerous, stack-built-up
+ \else\ifx\@@currentlayerstate\v!continue
+ \global\expandafter\let\csname\??ll\currentlayer\c!state\endcsname\v!repeat % dangerous, stack-built-up
+ \else
+ \edef\@@currentlayerdoublesided{\csname\??ll\currentlayer\c!doublesided\endcsname}%
+ \ifx\@@currentlayerdoublesided\v!yes
+ \ifcsname\@@layerbox#1\endcsname
+ % we can make a dedicated one for this
+ \doifbothsidesoverruled{\dodoflushlayerB\v!left}{\dodoflushlayerB\v!right}{\dodoflushlayerB\v!left}%
+ \else
+ \dodoflushlayerA
+ \fi
+ \else
+ \dodoflushlayerA
+ \fi
+ \fi\fi\fi
+ \endgroup}
+
+% \ifcase#1\else\writestatus{layer}{unknown layer #3}\fi
+
+\def\dodoflushlayerA
+ {\startoverlay
+ {\ifcsname\@@layerbox\currentlayer \endcsname\dodoflushlayer\plusone \currentlayer \fi}%
+ {\ifcsname\@@layerbox\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{\currentlayer:\realfolio}\fi}%
+ \stopoverlay}
+
+\def\dodoflushlayerB#1%
+ {\startoverlay
+ {\ifcsname\@@layerbox \currentlayer \endcsname\dodoflushlayer\plusone \currentlayer \fi}%
+ {\ifcsname\@@layerbox \currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount {\currentlayer:\realfolio}\fi}%
+ {\ifcsname\@@layerbox#1\currentlayer \endcsname\dodoflushlayer\plusone {#1\currentlayer }\fi}%
+ {\ifcsname\@@layerbox#1\currentlayer:\realfolio\endcsname\dodoflushlayer\zerocount{#1\currentlayer:\realfolio}\fi}%
+ \stopoverlay}
+
+\def\dodoflushlayer#1#2% quite core, so optimized
+ {\begingroup % already grouped
+ \offinterlineskip
+ \edef\@@currentlayermethod{\csname\??ll\currentlayer\c!method\endcsname}%
+ \edef\@@currentlayeroption{\csname\??ll\currentlayer\c!option\endcsname}%
+ % needed because we need to handle method but we should find a way to
+ % speed this up
+ \edef\@@currentlayerpreset{\csname\??ll\currentlayer\c!preset\endcsname}%
+ \ifcsname\??ll\??ll\@@currentlayerpreset\endcsname\csname\??ll\??ll\@@currentlayerpreset\endcsname\currentlayer{}\fi
+ %
+ \ifx\@@currentlayeroption\v!test
+ \tracelayerstrue
+ \fi
+ \iftracelayers
+ \traceboxplacementtrue
+ \fi
+ \!!doneafalse
+ \!!donebfalse
+ \ifx\@@currentlayermethod\v!overlay\!!doneatrue\fi
+ \ifx\@@currentlayermethod\v!fit \!!donebtrue\fi
+ \!!donectrue
+ \ifcase#1\else
+ \edef\@@currentlayerposition{\csname\??ll\currentlayer\c!position\endcsname}%
+ \ifx\@@currentlayerposition\v!yes \else
+ \edef\@@currentlayerrepeat{\csname\??ll\currentlayer\c!repeat\endcsname}%
+ % \edef\@@currentlayerstate {\csname\??ll\currentlayer\c!state\endcsname}% actually this is already set
+ \ifx\@@currentlayerrepeat\v!yes
+ \!!donecfalse
+ \else\ifx\@@currentlayerstate\v!repeat
+ \!!donecfalse
+ \fi\fi
+ \fi
+ \fi
+ \chardef\layerbox\csname\@@layerbox#2\endcsname % \@@layerbox\currentlayer
+ % we need to copy in order to retain the negative offsets for a next
+ % stage of additions, i.e. llx/lly accumulate in repeat mode and the
+ % compensation may differ each flush depending on added content
+ \setbox\nextbox
+ \if!!doneb
+ \therepositionededlayerbox
+ \else
+ \if!!donec\box\else\copy\fi\layerbox % sorry for the delay due to copying
+ \fi
+ % todo: method=offset => overlayoffset right/down (handy for backgrounds with offset)
+ \doifoverlayelse{#2}{\setlayoutcomponentattribute\v!layer{#2}}\resetlayoutcomponentattribute
+ \iftracelayers \ruledvbox \else \vbox \fi \if!!donea to \overlayheight \fi \layoutcomponentboxattribute
+ {\hbox \if!!donea to \overlaywidth \fi
+ {\edef\@@currentlayerpageposition{\csname\??ll#2\realfolio\c!position\endcsname}%
+ \ifx\@@currentlayerpageposition\v!yes\xypos{lyr:#2:\realfolio}\fi
+ \box\nextbox
+ \hss}%
+ \vss}%
+ \if!!donec
+ \gsetboxllx\layerbox\zeropoint
+ \gsetboxlly\layerbox\zeropoint
+ \fi
+ \endgroup}
+
+\def\therepositionededlayerbox % assumes that \if!!donec is set (todo: use dedicated flags)
+ {\vbox
+ {\vskip-\getboxlly\layerbox
+ \hskip-\getboxllx\layerbox
+ \hsize-\dimexpr\getboxllx\layerbox-\wd\layerbox\relax
+ \if!!donec\box\else\copy\fi\layerbox}}
+
+% \definelayer[test][method=fit] \setupcolors[state=start] \tracelayerstrue
+%
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=10pt]{g}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{aa}\setlayer[test][x=-10pt]{bb}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test][x=-20pt]{cccccc}\flushlayer[test]}
+% \framed[framecolor=red,offset=overlay]{\setlayer[test]{dd}\setlayer[test][x=-20pt,y=-3pt]{eeeeee}\flushlayer[test]}
+
+%D \macros
+%D {composedlayer,placelayer,tightlayer}
+%D
+%D This is a handy shortcut, which saves a couple of braces
+%D when we use it as parameter. This name also suits better
+%D to other layering commands.
+
+\def\composedlayer#1{\flushlayer[#1]}
+
+\let\placelayer\flushlayer
+
+\def\tightlayer[#1]%
+ {\hbox
+ {\def\currentlayer{#1}% todo: left/right
+ \setbox\nextbox\emptybox % hoogte/breedte are \wd\nextbox/\ht\nextbox
+ \hsize\layerparameter\c!width % \overlaywidth = \hsize
+ \vsize\layerparameter\c!height % \overlaywheight = \vsize
+ \composedlayer{#1}}}
+
+%D \macros
+%D {resetlayer}
+%D
+%D This macro hardly needs an explanation (and is seldom
+%D needed as well).
+
+\def\doresetlayer#1%
+ {\ifcsname\@@layerbox#1\endcsname
+ \global\setbox\csname\@@layerbox#1\endcsname\emptybox
+ \fi}
+
+\def\resetlayer[#1]%
+ {\doresetlayer{#1}%
+ \doifvalue{\??ll#1\c!doublesided}\v!yes % kind of redundant test
+ {\doresetlayer{\v!left #1}%
+ \doresetlayer{\v!right#1}}%
+ \doresetlayer{#1:\realfolio}}
+
+%D \macros
+%D {setMPlayer}
+%D
+%D The following layer macro uses the positions that are
+%D registered by \METAPOST.
+%D
+%D \starttyping
+%D \definelayer[test]
+%D
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \setMPlayer [test] [somepos-3] {\externalfigure[cow.mps][width=2cm]}
+%D
+%D \startuseMPgraphic{oeps}
+%D draw fullcircle scaled 10cm withcolor red ;
+%D register ("somepos-1",2cm,3cm,center currentpicture) ;
+%D register ("somepos-2",8cm,5cm,(-1cm,-2cm)) ;
+%D register ("somepos-3",0cm,0cm,(-2cm,2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \getMPlayer[test]{\useMPgraphic{oeps}}
+%D \stoptyping
+%D
+%D The last line is equivalent to
+%D
+%D \starttyping
+%D \framed
+%D [background={foreground,test},offset=overlay]
+%D {\useMPgraphic{oeps}}
+%D \stoptyping
+
+\def\setMPlayer
+ {\dotripleempty\dosetMPlayer}
+
+\def\MPlayerwidth {\hsize}
+\def\MPlayerheight{\vsize}
+
+\def\dosetMPlayer[#1][#2][#3]%
+ {\edef\MPlayerwidth {\MPw{#2}}%
+ \edef\MPlayerheight{\MPh{#2}}%
+ \setlayer[#1][\c!x=\MPx{#2},\c!y=\MPy{#2},\c!position=\v!no,#3]}
+
+\def\getMPlayer
+ {\dodoubleempty\dogetMPlayer}
+
+\def\dogetMPlayer[#1][#2]%
+ {\framed
+ [\c!background={\v!foreground,#1},
+ \c!frame=\v!off,
+ \c!offset=\v!overlay,#2]}
+
+% The next mechanism is obsolete and will be removed in \MKIV\ (or move to
+% the compatibility module.
+
+\newskip\xposition \newskip\yposition
+\newskip\xdimension \newskip\ydimension
+\newskip\xoffset \newskip\yoffset
+
+% already defined \newbox\positionbox
+
+\unexpanded\def\startpositioning
+ {\bgroup
+ \xposition \zeropoint \yposition \zeropoint
+ \xdimension\zeropoint \ydimension\zeropoint
+ \xoffset \zeropoint \yoffset \zeropoint
+ \hfuzz \paperwidth \vfuzz \paperheight
+ \setbox\positionbox\hbox\bgroup}
+
+\unexpanded\def\stoppositioning
+ {\doifnot\@@psoffset\v!yes
+ {\global\xoffset\zeropoint
+ \global\yoffset\zeropoint}%
+ \global\advance\xdimension \xoffset
+ \global\advance\ydimension \yoffset
+ \egroup
+ \vbox to \ydimension
+ {\vskip\yoffset
+ \hbox to \xdimension
+ {\hskip\xoffset
+ \box\positionbox
+ \hfill}
+ \vfill}%
+ \egroup}
+
+\def\resetpositioning
+ {\getparameters[\??ps]
+ [\c!state=\v!start,%
+ \c!unit=\s!cm,%
+ \c!factor=1,%
+ \c!scale=1,%
+ \c!xfactor=\@@psfactor,%
+ \c!yfactor=\@@psfactor,%
+ \c!xscale=\@@psscale,%
+ \c!yscale=\@@psscale,%
+ \c!xstep=\v!absolute,%
+ \c!ystep=\v!absolute,%
+ \c!xoffset=\!!zeropoint,%
+ \c!yoffset=\!!zeropoint]}
+
+\unexpanded\def\setuppositioning
+ {\resetpositioning
+ \dodoubleargument\getparameters[\??ps]}
+
+\def\calculateposition#1#2#3#4#5#6#7#8#9%
+ {\setdimensionwithunit\scratchskip{#1}\@@psunit
+ \scratchskip#8\scratchskip
+ \scratchskip#9\scratchskip
+ \advance\scratchskip #4\relax
+ \doif{#2}\v!relative
+ {\advance\scratchskip #3%
+ \let#4\!!zeropoint}%
+ #3\scratchskip\relax
+ \doifnot\@@psstate\v!overlay
+ {\scratchskip#5\relax
+ \advance\scratchskip #3\relax
+ \ifdim#3<-#7\relax \global#7-#3\relax \fi
+ \ifdim\scratchskip>#6\relax \global#6\scratchskip\relax \fi}}
+
+\def\position
+ {\dosingleempty\doposition}
+
+\def\doposition[#1]#2(#3,#4)%
+ {\dowithnextbox
+ {\bgroup
+ \getparameters[\??ps][#1]%
+ \dontcomplain
+ \calculateposition{#3}\@@psxstep\xposition
+ \@@psxoffset{\nextboxwd}\xdimension\xoffset
+ \@@psxscale\@@psxfactor
+ \scratchdimen\nextboxht \advance\scratchdimen \nextboxdp
+ \calculateposition{#4}\@@psystep\yposition
+ \@@psyoffset\scratchdimen\ydimension\yoffset
+ \@@psyscale\@@psyfactor
+ \vbox to \zeropoint % kan beter.
+ {\vskip\yposition
+ \hbox to \zeropoint
+ {\hskip\xposition
+ \flushnextbox
+ \hss}
+ \vss}%
+ \xdef\dopoppositioning
+ {\xposition\the\xposition
+ \yposition\the\yposition
+ \noexpand\def\noexpand\@@psxoffset{\@@psxoffset}%
+ \noexpand\def\noexpand\@@psyoffset{\@@psyoffset}}%
+ \egroup
+ \dopoppositioning
+ \ignorespaces}
+ \hbox}
+
+\resetpositioning
+
+\setuppositioning
+ [\c!unit=\s!cm,
+ \c!factor=1,
+ \c!scale=1,
+ \c!xstep=\v!absolute,
+ \c!ystep=\v!absolute,
+ \c!offset=\v!yes,
+ \c!xoffset=\!!zeropoint,
+ \c!yoffset=\!!zeropoint]
+
+%D Watch out, a redefinition:
+
+\ifx\settextpagecontent\undefined \writestatus\m!systems{error in page-lyr.tex} \wait \fi
+
+\let\normalsettextpagecontent\settextpagecontent
+
+\definelayer
+ [OTRTEXT]
+
+\setuplayer
+ [OTRTEXT]
+ [\c!width=\innermakeupwidth,
+ \c!height=\textheight]
+
+% will be overloaded in page-spr
+
+\def\settextpagecontent#1#2#3% #2 and #3 will disappear
+ {\doifelselayerdata{OTRTEXT}
+ {\setbox#1\hbox to \makeupwidth
+ {\startoverlay
+ {\tightlayer[OTRTEXT]} % first, otherwise problems with toc
+ {\normalsettextpagecontent{#1}{#2}{#3}\box#1}
+ \stopoverlay}%
+ \dp#1\zeropoint}%
+ {\normalsettextpagecontent{#1}{#2}{#3}}}
+
+\protect \endinput
diff --git a/tex/context/base/pack-obj.lua b/tex/context/base/pack-obj.lua
new file mode 100644
index 000000000..0ee46fc99
--- /dev/null
+++ b/tex/context/base/pack-obj.lua
@@ -0,0 +1,54 @@
+if not modules then modules = { } end modules ['pack-obj'] = {
+ version = 1.001,
+ comment = "companion to pack-obj.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>We save object references in the main utility table. jobobjects are
+reusable components.</p>
+--ldx]]--
+
+local texsprint, texcount = tex.sprint, tex.count
+
+jobobjects = jobobjects or { }
+jobobjects.collected = jobobjects.collected or { }
+jobobjects.tobesaved = jobobjects.tobesaved or { }
+
+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.get(tag)
+ return collected[tag] or tobesaved[tag]
+end
+
+function jobobjects.number(tag,default)
+ local o = collected[tag] or tobesaved[tag]
+ texsprint((o and o[1]) or default)
+end
+
+function jobobjects.page(tag,default)
+ local o = collected[tag] or tobesaved[tag]
+ texsprint((o and o[2]) or default)
+end
+
+function jobobjects.doifelse(tag)
+ commands.testcase(collected[tag] or tobesaved[tag])
+end
+
diff --git a/tex/context/base/pack-obj.mkii b/tex/context/base/pack-obj.mkii
new file mode 100644
index 000000000..6971ad04f
--- /dev/null
+++ b/tex/context/base/pack-obj.mkii
@@ -0,0 +1,371 @@
+%D \module
+%D [ file=pack-obj,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Objects,
+%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.
+
+% todo, move more to mkiv, get rid of blabelgroup
+
+\writestatus{loading}{ConTeXt Packaging Macros / Objects}
+
+\unprotect
+
+%D \macros
+%D {setobject,getobject,ifinobject}
+%D
+%D Boxes can be considered reuable objects. Unfortunaltely once
+%D passed to the \DVI\ file, such objects cannot be reused. In
+%D \PDF\ however, reusing is possible and sometimes even a
+%D necessity. Therefore, \CONTEXT\ supports reusable objects.
+%D
+%D During the \TEX\ processing run, boxes can serve the purpose
+%D of objects, and the \DVI\ driver module implements objects
+%D using packed boxes.
+%D
+%D The \PDF\ and \PDFTEX\ driver modules implement objects
+%D using \PDF\ forms. There is no (real) restriction on the
+%D number of objects there.
+%D
+%D The first application of objects in \CONTEXT\ concerned
+%D \METAPOST\ graphics and fill||in form fields. The first
+%D application can save lots of bytes, while the latter use is
+%D more a necessity than byte saving.
+%D
+%D \starttyping
+%D \setobject{class}{name}\somebox{}
+%D \getobject{class}{name}
+%D \stoptyping
+%D
+%D Here \type{\somebox} can be whatever box specification suits
+%D \TEX. We save the dimensions of an object, although some
+%D drivers will do so themselves. This means that when for
+%D instance using \PDFTEX\ we could save a hash entry plus some
+%D 20+ memory locations per object by delegating this
+%D housekeeping to the driver. The current approach permits
+%D us to keep the box characteristic too.
+
+\newif\ifinobject
+
+\def\checkobjectreferences
+ {\startnointerference
+ \protectlabels
+ \ifx\usedoutputdriver\currentoutput
+ \doutilities{objectreferences}\jobname\empty\relax\relax
+ \else
+ % different format (will fails on \purenumber)
+ \fi
+ \global\let\checkobjectreferences\relax
+ \stopnointerference}
+
+\def\objectplaceholder{NOT YET FLUSHED}%
+
+\def\presetobject#1#2% \global added
+ {\blabelgroup
+ \ifcsname\r!object#1::#2\endcsname\else
+ \global\@EA\let\csname\r!object#1::#2\endcsname\objectplaceholder
+ \fi
+ \elabelgroup}
+
+\def\dosetobject#1#2#3% \initializepaper this will move to \everyshipout
+ {\initializepaper
+ \blabelgroup
+ \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}}
+
+\def\resetobject#1#2%
+ {\checkobjectreferences
+ \letbeundefined{\r!object#1::#2}}
+
+%D \macros
+%D {finalizeobjectbox}
+%D
+%D This one provides a hook for last minute object box processing
+%D we need this in \MKIV.
+
+\ifx\finalizeobjectbox\undefined
+ \let\finalizeobjectbox\gobbleoneargument
+\fi
+
+%D Somehow there is a rounding error problem in either \PDFTEX\
+%D or in viewers, or maybe it is conforming the specs. The next
+%D variable compensate for it by removing the rather tight
+%D clip.
+
+\def\objectoffset{1cm}
+
+% \def\dodosetobject#1#2#3%
+% {\bgroup
+% \inobjecttrue
+% \dowithnextbox{\dododosetobject{#1}{#2}{#3}\egroup}}
+
+\def\dodosetobject#1#2#3%
+ {\bgroup
+ \globalpushmacro\crossreferenceobject \objectreferenced
+ \inobjecttrue
+ \dowithnextbox
+ {\globalpopmacro\crossreferenceobject
+ \dododosetobject{#1}{#2}{#3}\egroup}}
+
+\def\dododosetobject#1#2#3%
+ {\blabelgroup
+ \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
+ \scratchdimen\objectoffset
+ \@EA\xdef\csname\r!object#2::#3\endcsname
+ {\noexpand\dohandleobject{#2}{#3}%
+ {\ifhbox\nextbox\hbox\else\vbox\fi}%
+ %{\the\nextboxwd}{\the\nextboxht}{\the\nextboxdp}}%
+ {\number\nextboxwd}{\number\nextboxht}{\number\nextboxdp}%
+ {\number\scratchdimen}}%
+ \expanded % freeze the dimensions since \dostartobject may use \nextbox
+ {\dostartobject
+ {#2}{#3}{\the\nextboxwd}{\the\nextboxht}{\the\nextboxdp}}%
+ \ifcase#1\relax\else \ifdim\objectoffset>\zeropoint
+ \setbox\nextbox\vbox spread 2\scratchdimen
+ {\forgetall \offinterlineskip
+ \vss\hbox spread 2\scratchdimen{\hss\flushnextbox\hss}\vss}%
+ \fi \fi
+ \flushnextbox
+ \dostopobject
+ \elabelgroup}
+
+\def\getobject#1#2%
+ {\blabelgroup
+ \let\dohandleobject\dogetobject
+ \csname\r!object#1::#2\endcsname}
+
+% \def\dogetobject#1#2#3#4#5#6%
+% {\initializepaper
+% \forgetall
+% \dontshowcomposition
+% \setbox\scratchbox\vbox
+% {\doinsertobject{#1}{#2}}%
+% \setbox\scratchbox#3%
+% {\vbox to #5\scaledpoint
+% {\ifdim\ht\scratchbox>#5\scaledpoint
+% % or \ifdim\wd\scratchbox>#4\scaledpoint
+% \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+% \else
+% \vss\box\scratchbox
+% \fi}}%
+% \wd\scratchbox#4\scaledpoint
+% \ht\scratchbox#5\scaledpoint
+% \dp\scratchbox#6\scaledpoint
+% \box\scratchbox
+% \elabelgroup}
+
+% \def\dogetobject#1#2#3#4#5#6#7%
+% {\initializepaper
+% \forgetall
+% \dontshowcomposition
+% \setbox\scratchbox\vbox
+% {\doinsertobject{#1}{#2}}%
+% \setbox\scratchbox#3%
+% {\vbox to #5\scaledpoint
+% {\ifdim\ht\scratchbox>#5\scaledpoint
+% % or \ifdim\wd\scratchbox>#4\scaledpoint
+% \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+% \else
+% \vss\box\scratchbox
+% \fi}}%
+% \scratchdimen#7\scaledpoint
+% \setbox\nextbox\hbox
+% {\hskip-\scratchdimen\lower\scratchdimen\flushnextbox}%
+% \wd\scratchbox#4\scaledpoint
+% \ht\scratchbox#5\scaledpoint
+% \dp\scratchbox#6\scaledpoint
+% \box\scratchbox
+% \elabelgroup}
+
+\def\dogetobject#1#2#3#4#5#6#7% don't change this, should work for dvi & pdf
+ {\initializepaper
+ \forgetall
+ \dontshowcomposition
+ \setbox\scratchbox\vbox
+ {\doinsertobject{#1}{#2}}%
+ \setbox\scratchbox#3%
+ {\vbox to #5\scaledpoint
+ {\ifdim\ht\scratchbox>#5\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else\ifdim\wd\scratchbox>#4\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else
+ %\vss\box\scratchbox
+ \vss\hbox to #4\scaledpoint{\box\scratchbox\hss}% fix Chof
+ \fi\fi}}%
+ \box\scratchbox
+ \elabelgroup}
+
+%D If needed one can ask for the dimensions of an object with:
+%D
+%D \starttyping
+%D \getobjectdimensions{class}{name}
+%D \stoptyping
+%D
+%D The results are reported in \type {\objectwidth}, \type
+%D {\objectheight} and \type {\objectdepth}.
+
+% \def\dogetobjectdimensions#1#2#3#4#5#6%
+% {\def\objectwidth {#4\s!sp}%
+% \def\objectheight{#5\s!sp}%
+% \def\objectdepth {#6\s!sp}}
+
+\def\dogetobjectdimensions#1#2#3#4#5#6#7%
+ {\def\objectwidth {#4\s!sp}%
+ \def\objectheight{#5\s!sp}%
+ \def\objectdepth {#6\s!sp}%
+ \def\objectmargin{#7\s!sp}}
+
+\def\getobjectdimensions#1#2%
+ {\let\dohandleobject\dogetobjectdimensions
+ \let\objectwidth \!!zeropoint
+ \let\objectheight\!!zeropoint
+ \let\objectdepth \!!zeropoint
+ \labelcsname\r!object#1::#2\endcsname}
+
+%D Apart from this kind of objects, that have typeset content,
+%D we can have low level driver specific objects. Both types
+%D can have references to internal representations, hidden for
+%D the user. We keep track of such references by means of a
+%D dedicated cross reference mechanism. Normally, objects are
+%D defined before they are used, but forward referencing
+%D sometimes occurs.
+%D
+%D \starttyping
+%D \dosetobjectreference {class} {identifier} {reference value} {page}
+%D \dogetobjectreference {class} {identifier} \csname
+%D \stoptyping
+%D
+%D These commands are to be called by the \type{\startobject},
+%D \type{\stopobject} and \type{\insertobject} specials.
+
+\def\objectreferenced{\global\chardef\crossreferenceobject\plusone}
+\def\driverreferenced{\global\chardef\crossreferenceobject\zerocount}
+
+\objectreferenced
+
+% no undefined test ! ! ! ! (pdftex fails on undefined objects)
+
+\def\setobjectreferences
+ {\def\objectreference##1##2##3##4%
+ {\ifundefined{\r!driver##1::##2}%
+ \setxvalue{\r!driver##1::##2}{{##3}{##4}}%
+ \else
+ \showmessage\m!references{31}{[##1 ##2=>##3/##4]}%
+ \fi}}
+
+\def\resetobjectreferences
+ {\let\objectreference\gobblefourarguments}
+
+\resetobjectreferences
+
+\def\doregisterobjectreference#1#2#3%
+ {\checkobjectreferences
+ \blabelgroup
+ \expanded{\writeutilitycommand{\noexpand\objectreference{#1}{#2}{#3}{\noexpand\realfolio}}}%
+ \setxvalue{\r!driver#1::#2}{{#3}{\noexpand\realfolio}}%
+ \elabelgroup}
+
+\def\dooverloadobjectreference#1#2#3%
+ {\checkobjectreferences
+ \blabelgroup
+ \setxvalue{\r!driver#1::#2}{{#3}{\noexpand\realfolio}}%
+ \elabelgroup}
+
+\def\dosetobjectreference
+ {\ifcase\crossreferenceobject
+ \objectreferenced
+ \expandafter\dooverloadobjectreference
+ \else
+ \expandafter\doregisterobjectreference
+ \fi}
+
+\def\dosetdriverreference
+ {\driverreferenced\dosetobjectreference}
+
+\def\defaultobjectreference#1#2{0} % driver dependent
+\def\defaultobjectpage #1#2{\realfolio}
+
+\def\dogetobjectreference {\dodogetobjectreference\firstoftwoarguments\defaultobjectreference}
+\def\dogetobjectreferencepage{\dodogetobjectreference\secondoftwoarguments\defaultobjectpage}
+
+\def\dodogetobjectreference#1#2#3#4#5%
+ {\checkobjectreferences
+ \blabelgroup
+ \ifundefined{\r!driver#3::#4}%
+ \showmessage\m!references{30}{[#3 #4=>#3/#4]}%
+ \xdef#5{#2{#3}{#4}}%
+ \else
+ \xdef#5{\@EAEAEA#1\csname\r!driver#3::#4\endcsname}%
+ \fi
+ \elabelgroup}
+
+\def\setobject {\driverreferenced\dosetobject1}
+\def\settightobject{\driverreferenced\dosetobject0}
+
+%D \macros
+%D {doifobjectfoundelse,doifobjectreferencefoundelse}
+%D
+%D To prevent redundant definition of objects, one can use
+%D the next tests:
+%D
+%D \starttyping
+%D \doifobjectfoundelse{class}{object}{do then}{do else}
+%D \doifobjectreferencefoundelse{class}{object}{do then}{do else}
+%D \stoptyping
+
+\def\doifobjectfoundelse#1#2%
+ {\blabelgroup \ifcsname\r!object#1::#2\endcsname
+ \elabelgroup \expandafter\firstoftwoarguments
+ \else
+ \elabelgroup \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifobjectreferencefoundelse#1#2%
+ {\checkobjectreferences
+ \blabelgroup \ifcsname\r!driver#1::#2\endcsname
+ \elabelgroup \expandafter\firstoftwoarguments
+ \else
+ \elabelgroup \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifobjectssupportedelse}
+%D
+%D Starting with reuse of graphics, we will implement object
+%D reuse when possible. To enable mechanisms to determine
+%D what method to use, we provide:
+%D
+%D \starttyping
+%D \doifobjectssupportedelse{true action}{false action}
+%D \stoptyping
+%D
+%D As we can see, currently objects depend on the special
+%D driver.
+
+\newif\ifobjectssupported \objectssupportedtrue
+
+\def\doifobjectssupportedelse
+ {\ifobjectssupported
+ \@EA\doifspecialavailableelse\@EA\doinsertobject
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+%D There is a conceptual problem here. Objects are not possible
+%D in \DVI, unless faked like in \type {spec-dvi}. This means
+%D that we must be careful in loading special drivers that do
+%D support objects while we still want to be able to use the
+%D \DVI\ output.
+
+\protect \endinput
diff --git a/tex/context/base/pack-obj.mkiv b/tex/context/base/pack-obj.mkiv
new file mode 100644
index 000000000..81220e324
--- /dev/null
+++ b/tex/context/base/pack-obj.mkiv
@@ -0,0 +1,399 @@
+%D \module
+%D [ file=pack-obj,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Objects,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Objects}
+
+\unprotect
+
+\let\objectreference\gobblefourarguments % catch mkii tuo stuff
+
+\registerctxluafile{pack-obj}{1.001}
+
+% \startluacode
+% local texbox, texdimen, texcount, texwrite = tex.box, tex.dimen, tex.count, tex.write
+% local pdfxform, pdfrefxform = pdf.xform, pdf.refxform
+%
+% function pdf.xform (l) texbox["objectbox"] = nil return l end
+% function pdf.refxform(l) return node.copy_list(l) end
+%
+% backends.codeinjections.register = pdf.xform
+% backends.codeinjections.restore = pdf.refxform
+%
+% local codeinjections = backends.codeinjections
+%
+% objects = objects or { }
+%
+% local data = { }
+%
+% objects.data = data
+% objects.n = 0
+%
+% function objects.register(name)
+% objects.n = objects.n + 1
+% local list = texbox.objectbox
+% nodes.process_page(list)
+% data[name] = {
+% codeinjections.restore(list),
+% texdimen.objectwd,
+% texdimen.objectht,
+% texdimen.objectdp,
+% texdimen.objectoff,
+% }
+% end
+%
+% function objects.restore(name)
+% local d = data[name]
+% if d then
+% texbox .objectbox = codeinjections.restore(d[1])
+% texdimen.objectwd = d[2]
+% texdimen.objectht = d[3]
+% texdimen.objectdp = d[4]
+% texdimen.objectoff = d[5]
+% else
+% texbox .objectbox = nil
+% texdimen.objectwd = 0
+% texdimen.objectht = 0
+% texdimen.objectdp = 0
+% texdimen.objectoff = 0
+% end
+% end
+%
+% function objects.reference(name)
+% local d = data[name]
+% texwrite((d and d[1]) or 0)
+% end
+%
+% function objects.enhance(name)
+% local d = data[name]
+% if d then
+% d[6] = texcount.realpageno
+% end
+% end
+%
+% function objects.page(name)
+% local d = data[name]
+% texwrite((d and d[6]) or texcount.realpageno)
+% end
+%
+% function objects.doifelse(name)
+% commands.testcase(data[name])
+% end
+% \stopluacode
+%
+% \newbox \objectbox
+% \newtoks \everyobject
+% \newif \ifinobject
+%
+% \newdimen\objectoff \def\objectmargin{\the\objectoff}
+% \newdimen\objectwd \def\objectwidth {\the\objectwd }
+% \newdimen\objectht \def\objectheight{\the\objectht }
+% \newdimen\objectdp \def\objectdepth {\the\objectdp }
+%
+% \def\objectoffset{1cm}
+%
+% \everyobject{\the\everyPDFxform}
+%
+% \let\doresetobjects\relax
+%
+% \def\setobject #1#2{\begingroup\objectoff\objectoffset\inobjecttrue\the\everyobject\dowithnextbox{\dosetobject{#1}{#2}}}
+% \def\settightobject#1#2{\begingroup\objectoff\zeropoint \inobjecttrue\the\everyobject\dowithnextbox{\dosetobject{#1}{#2}}}
+%
+% \let\objectsetvbox\vbox %\def\objectsetvbox{\ruledvbox}
+% \let\objectgetvbox\vbox %\def\objectgetvbox{\ruledvbox}
+% \let\objectsethbox\hbox %\def\objectsethbox{\ruledhbox}
+% \let\objectgethbox\hbox %\def\objectgethbox{\ruledhbox}
+%
+% \def\dosetobject#1#2%
+% {\objectwd\wd\nextbox
+% \objectht\ht\nextbox
+% \objectdp\dp\nextbox
+% \ifdim\objectoff=\zeropoint\relax
+% \setbox\objectbox\box\nextbox
+% \else
+% \setbox\objectbox\objectsetvbox spread 2\objectoff{\vss\objectsethbox spread 2\objectoff{\hss\flushnextbox\hss}\vss}%
+% \fi
+% \ctxlua{objects.register("#1::#2")}%
+% \endgroup}
+%
+% \def\getobject#1#2%
+% {\begingroup
+% \ctxlua{objects.restore("#1::#2")}%
+% \ifdim\objectoff=\zeropoint\relax \else
+% \setbox\objectbox\objectgetvbox to \dimexpr\objectht+\objectdp\relax
+% {\vss\objectgethbox to \objectwd{\hss\box\objectbox\hss}\vss}%
+% \wd\objectbox\objectwd
+% \ht\objectbox\objectht
+% \dp\objectbox\objectdp
+% \fi
+% \box\objectbox
+% \endgroup}
+%
+% \def\getpageobject#1#2%
+% {\begingroup
+% \ctxlua{objects.restore("#1::#2")}%
+% \ifdim\objectoff=\zeropoint\relax
+% \setbox\objectbox\objectgethbox{\ctxlatelua{objects.enhance("#1::#2")}\box\objectbox}
+% \else
+% \setbox\objectbox\objectgetvbox to \dimexpr\objectht+\objectdp\relax
+% {\vss\objectgethbox to \objectwd{\ctxlatelua{objects.enhance("#1::#2")}\hss\box\objectbox\hss}\vss}%
+% \wd\objectbox\objectwd
+% \ht\objectbox\objectht
+% \dp\objectbox\objectdp
+% \fi
+% \box\objectbox
+% \endgroup}
+%
+% \def\setobjectdirectly #1#2{\ctxlua{objects.register("#1::#2")}}
+% \def\getobjectdirectly #1#2{\ctxlua{objects.restore ("#1::#2")}}
+% \def\getobjectdimensions #1#2{\ctxlua{objects.restore ("#1::#2")}}
+% \def\doifobjectfoundelse #1#2{\ctxlua{objects.doifelse("#1::#2")}}
+% \def\doifobjectreferencefoundelse#1#2{\ctxlua{objects.doifelse("#1::#2")}}
+%
+% \let\objectreferenced\relax
+% \let\driverreferenced\relax
+%
+% \def\doregisterobjectreference{\writestatus{objects}{obsolete: register object reference}\gobblethreearguments}
+% \def\dooverloadobjectreference{\writestatus{objects}{obsolete: overload object reference}\gobblethreearguments}
+% \def\dosetobjectreference {\writestatus{objects}{obsolete: set object reference}\gobblethreearguments}
+% \def\dosetdriverreference {\writestatus{objects}{obsolete: set driver reference}\gobblethreearguments}
+%
+% \def\defaultobjectreference{0}
+% \def\defaultobjectpage {\realfolio}
+%
+% \def\dogetobjectreference #1#2#3{\xdef#3{\ctxlua{objects.reference("#1::#2)}}}
+% \def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxlua{objects.page("#1::#2))}}}
+%
+% \protect
+%
+% \starttext
+% test \setobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test
+% \vskip3cm
+% test \settightobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test
+% test \settightobject{a}{c}\ruledhbox{xxx}\getobject{a}{c} test
+% \dorecurse{5000}{test \setobject{a}{b}\ruledhbox{xxx}\getobject{a}{b} test }
+% \stoptext
+
+%D \macros
+%D {setobject,getobject,ifinobject}
+%D
+%D Boxes can be considered reuable objects. Unfortunaltely once
+%D passed to the \DVI\ file, such objects cannot be reused. In
+%D \PDF\ however, reusing is possible and sometimes even a
+%D necessity. Therefore, \CONTEXT\ supports reusable objects.
+%D
+%D During the \TEX\ processing run, boxes can serve the purpose
+%D of objects, and the \DVI\ driver module implements objects
+%D using packed boxes.
+%D
+%D The \PDF\ and \PDFTEX\ driver modules implement objects
+%D using \PDF\ forms. There is no (real) restriction on the
+%D number of objects there.
+%D
+%D The first application of objects in \CONTEXT\ concerned
+%D \METAPOST\ graphics and fill||in form fields. The first
+%D application can save lots of bytes, while the latter use is
+%D more a necessity than byte saving.
+%D
+%D \starttyping
+%D \setobject{class}{name}\somebox{}
+%D \getobject{class}{name}
+%D \stoptyping
+%D
+%D Here \type{\somebox} can be whatever box specification suits
+%D \TEX. We save the dimensions of an object, although some
+%D drivers will do so themselves. This means that when for
+%D instance using \PDFTEX\ we could save a hash entry plus some
+%D 20+ memory locations per object by delegating this
+%D housekeeping to the driver. The current approach permits
+%D us to keep the box characteristic too.
+
+\newif\ifinobject
+
+\def\objectplaceholder{NOT YET FLUSHED}%
+
+\def\presetobject#1#2% \global added
+ {\ifcsname\r!object#1::#2\endcsname\else
+ \global\@EA\let\csname\r!object#1::#2\endcsname\objectplaceholder
+ \fi}
+
+\def\dosetobject#1#2#3% \initializepaper this will move to \everyshipout
+ {% \initializepaper
+ \ifcsname\r!object#2::#3\endcsname
+ \expandafter\gobblefivearguments
+ \else % tzt, overload internal referenced objects to save entries
+ \expandafter\dodosetobject
+ \fi
+ {#1}{#2}{#3}}
+
+\def\resetobject#1#2%
+ {\letbeundefined{\r!object#1::#2}}
+
+%D \macros
+%D {finalizeobjectbox}
+%D
+%D This one provides a hook for last minute object box processing
+%D we need this in \MKIV.
+
+\ifx\finalizeobjectbox\undefined
+ \let\finalizeobjectbox\gobbleoneargument
+\fi
+
+%D Somehow there is a rounding error problem in either \PDFTEX\
+%D or in viewers, or maybe it is conforming the specs. The next
+%D variable compensate for it by removing the rather tight
+%D clip.
+
+\def\objectoffset{1cm}
+
+\def\dodosetobject#1#2#3%
+ {\bgroup
+ \globalpushmacro\crossreferenceobject \objectreferenced
+ \inobjecttrue
+ \dowithnextbox
+ {\globalpopmacro\crossreferenceobject
+ \dododosetobject{#1}{#2}{#3}\egroup}}
+
+\def\dododosetobject#1#2#3%
+ {\begingroup
+ \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
+ \scratchdimen\objectoffset
+ \@EA\xdef\csname\r!object#2::#3\endcsname
+ {\noexpand\dohandleobject{#2}{#3}%
+ {\ifhbox\nextbox\hbox\else\vbox\fi}%
+ {\number\nextboxwd}{\number\nextboxht}{\number\nextboxdp}%
+ {\number\scratchdimen}}%
+ \expanded % freeze the dimensions since \dostartobject may use \nextbox
+ {\dostartobject{#2}{#3}{\the\nextboxwd}{\the\nextboxht}{\the\nextboxdp}}%
+ \ifcase#1\relax\else \ifdim\objectoffset>\zeropoint
+ \setbox\nextbox\vbox spread 2\scratchdimen
+ {\forgetall \offinterlineskip
+ \vss\hbox spread 2\scratchdimen{\hss\flushnextbox\hss}\vss}%
+ \fi \fi
+ \flushnextbox
+ \dostopobject
+ \endgroup}
+
+\def\getobject#1#2%
+ {\begingroup
+ \let\dohandleobject\dogetobject
+ \csname\r!object#1::#2\endcsname}
+
+\def\dogetobject#1#2#3#4#5#6#7% don't change this, should work for dvi & pdf
+ {% \initializepaper
+ \forgetall
+ \dontshowcomposition
+ \setbox\scratchbox\vbox attr \viewerlayerattribute \attribute\viewerlayerattribute
+ {\doinsertobject{#1}{#2}}%
+ \setbox\scratchbox#3%
+ {\vbox to #5\scaledpoint
+ {\ifdim\ht\scratchbox>#5\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else\ifdim\wd\scratchbox>#4\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else
+ %\vss\box\scratchbox
+ \vss\hbox to #4\scaledpoint{\box\scratchbox\hss}% fix Chof
+ \fi\fi}}%
+% \forcecolorhack % needed in order to use layers etc
+ \box\scratchbox
+ \endgroup}
+
+%D If needed one can ask for the dimensions of an object with:
+%D
+%D \starttyping
+%D \getobjectdimensions{class}{name}
+%D \stoptyping
+%D
+%D The results are reported in \type {\objectwidth}, \type
+%D {\objectheight} and \type {\objectdepth}.
+
+\def\dogetobjectdimensions#1#2#3#4#5#6#7%
+ {\def\objectwidth {#4\s!sp}%
+ \def\objectheight{#5\s!sp}%
+ \def\objectdepth {#6\s!sp}%
+ \def\objectmargin{#7\s!sp}}
+
+\def\getobjectdimensions#1#2%
+ {\let\dohandleobject\dogetobjectdimensions
+ \let\objectwidth \!!zeropoint
+ \let\objectheight\!!zeropoint
+ \let\objectdepth \!!zeropoint
+ \csname\r!object#1::#2\endcsname}
+
+%D Apart from this kind of objects, that have typeset content,
+%D we can have low level driver specific objects. Both types
+%D can have references to internal representations, hidden for
+%D the user. We keep track of such references by means of a
+%D dedicated cross reference mechanism. Normally, objects are
+%D defined before they are used, but forward referencing
+%D sometimes occurs.
+%D
+%D \starttyping
+%D \dosetobjectreference {class} {identifier} {reference value} {page}
+%D \dogetobjectreference {class} {identifier} \csname
+%D \stoptyping
+%D
+%D These commands are to be called by the \type{\startobject},
+%D \type{\stopobject} and \type{\insertobject} specials.
+
+\def\objectreferenced{\global\chardef\crossreferenceobject\plusone}
+\def\driverreferenced{\global\chardef\crossreferenceobject\zerocount}
+
+\objectreferenced
+
+% no undefined test ! ! ! ! (pdftex fails on undefined objects)
+
+\def\doregisterobjectreference#1#2#3{\normalexpanded{\noexpand\ctxlatelua{jobobjects.save("#1::#2",#3,\noexpand\the\realpageno)}}}
+\def\dooverloadobjectreference#1#2#3{\ctxlua{jobobjects.set("#1::#2",#3,\the\realpageno)}}
+
+\def\dosetobjectreference
+ {\ifcase\crossreferenceobject
+ \objectreferenced
+ \expandafter\dooverloadobjectreference
+ \else
+ \expandafter\doregisterobjectreference
+ \fi}
+
+\def\dosetdriverreference
+ {\driverreferenced\dosetobjectreference}
+
+\def\defaultobjectreference#1#2{0} % driver dependent
+\def\defaultobjectpage #1#2{\realfolio}
+
+\def\dogetobjectreference #1#2#3{\xdef#3{\ctxlua{jobobjects.number("#1::#2","\defaultobjectreference{#1}{#2}")}}}
+\def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxlua{jobobjects.page("#1::#2","\defaultobjectpage{#1}{#2}")}}}
+
+\def\setobject {\driverreferenced\dosetobject1}
+\def\settightobject{\driverreferenced\dosetobject0}
+
+%D \macros
+%D {doifobjectfoundelse,doifobjectreferencefoundelse}
+%D
+%D To prevent redundant definition of objects, one can use
+%D the next tests:
+%D
+%D \starttyping
+%D \doifobjectfoundelse{class}{object}{do then}{do else}
+%D \doifobjectreferencefoundelse{class}{object}{do then}{do else}
+%D \stoptyping
+
+\def\doifobjectfoundelse#1#2%
+ {\ifcsname\r!object#1::#2\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifobjectreferencefoundelse#1#2{\ctxlua{jobobjects.doifelse("#1::#2")}}
+
+\protect \endinput
diff --git a/tex/context/base/pack-rul.lua b/tex/context/base/pack-rul.lua
new file mode 100644
index 000000000..378167c97
--- /dev/null
+++ b/tex/context/base/pack-rul.lua
@@ -0,0 +1,53 @@
+if not modules then modules = { } end modules ['pack-rul'] = {
+ version = 1.001,
+ comment = "companion to pack-rul.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>An explanation is given in the history document <t>mk</t>.</p>
+--ldx]]--
+
+local texdimen, texcount, texbox = tex.dimen, tex.count, tex.box
+local hpack, free, copy, traverse_id = node.hpack, node.free, node.copy_list, node.traverse_id
+
+function commands.doreshapeframedbox(n)
+ local noflines, lastlinelength, box = 0, 0, texbox[n]
+ if box.width ~= 0 then
+ local list = box.list
+ if list then
+ local width, done = 0, false
+ for h in traverse_id('hlist',list) do -- no dir etc needed
+ local l = h.list
+ if l then
+ done = true
+ local p = hpack(copy(l))
+ lastlinelength = p.width
+ if lastlinelength > width then
+ width = lastlinelength
+ end
+ free(p)
+ end
+ end
+ if done then
+ if width ~= 0 then
+ for h in traverse_id('hlist',list) do
+ local l = h.list
+ if l then
+ -- if h.width ~= width then -- else no display math handling (uses shift)
+ h.list = hpack(l,width,'exactly',h.dir)
+ h.shift = 0 -- needed for display math
+ h.width = width
+ -- end
+ end
+ end
+ end
+ box.width = width
+ end
+ end
+ end
+ texdimen["framedlastlength"] = lastlinelength
+ texcount["framednoflines"] = noflines
+end
diff --git a/tex/context/base/pack-rul.mkii b/tex/context/base/pack-rul.mkii
new file mode 100644
index 000000000..055094547
--- /dev/null
+++ b/tex/context/base/pack-rul.mkii
@@ -0,0 +1,3650 @@
+%D \module
+%D [ file=pack-rul, % was core-rul,
+%D version=1998.10.16,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Ruled Content,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Ruled Content}
+
+\unprotect
+
+%D We have removed the rather old and out dated raster methods. They
+%D have not been used for ages.
+
+%D \macros
+%D {linewidth, setuplinewidth}
+%D
+%D This module deals with rules (lines) in several ways. First
+%D we introduce two macros that can be used to set some common
+%D characteristics.
+%D
+%D \showsetup{setuplinewidth}
+%D
+%D The linewidth is available in \type{\linewidth}. The
+%D preset value of .4pt equals the default hard coded \TEX\
+%D rule width.
+
+\newdimen\linewidth
+
+\def\dosetuplinewidth[#1]%
+ {\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}}
+
+\def\setuplinewidth
+ {\dosingleargument\dosetuplinewidth}
+
+%D \macros
+%D {ruledlinewidth, inheritruledlinewidth}
+%D
+%D Inside framed boxed we will use a private dimensions. As
+%D an option one can let the linewidth inherit its value from
+%D this one.
+
+\newdimen\ruledlinewidth \newif\ifinheritruledlinewidth
+
+% %D \TEX\ lacks support for color and even gray scales. The next
+% %D macros can provide a sort of poor mans gray scales as well
+% %D as give access to more suitable methods of rendering. Such a
+% %D method looks like:
+% %D
+% %D \starttyping
+% %D \def\methodegraybox#1#2#3#4#5#6%
+% %D { ... }
+% %D \stoptyping
+% %D
+% %D The string \type{graybox} is a common element in the name,
+% %D so we can have for instance \type {\postscriptgraybox} or
+% %D \type {\texgraybox}. The first three arguments take a
+% %D dimension, the fourth one takes a number between~0 and~1,
+% %D and the last argument specifies a radius of the box when
+% %D rounded corners are used, so:
+% %D
+% %D \startbuffer
+% %D \dotgraybox{.5\hsize}{1cm}{0cm}{.85}{\v!no}{0pt}
+% %D \stopbuffer
+% %D
+% %D \typebuffer
+% %D
+% %D becomes:
+% %D
+% %D %\startlinecorrection
+% %D % \vbox to 1cm{\getbuffer}
+% %D %\stoplinecorrection
+% %D
+% %D \startlinecorrection
+% %D \unprotect
+% %D \vbox to 1cm{\dotgraybox{.5\hsize}{1cm}{0cm}{.85}{\v!no}{0pt}}
+% %D \protect
+% %D \stoplinecorrection
+% %D
+% %D There are two predefined methodes, one uses periods and the
+% %D other uses small rules. The second method is less
+% %D efficient, but sometimes give better results. The dimensions
+% %D of the resullting box are set to zero.
+%
+% \setvalue{\v!dot graybox}{\processraster\symbol\rasterdot}
+% \setvalue{\v!rule graybox}{\processraster\symbol\rasterbox}
+%
+% \def\rasterdot{\rasterfont.}
+% \def\rasterbox{\hss\vrule\!!width.4pt\!!height.4pt\!!depth\zeropoint}
+%
+% %D Now of course we need:
+%
+% \ifx\rasterfont\undefined \def\rasterfont{\fivepoint} \fi
+%
+% %D We implement two pure \TEX\ based generators, that use
+% %D \type{\leaders} to quickly gerenate the gray pattern. One
+% %D should beware of \DIMENSION\ conflicts, so we use some
+% %D registers above~8. These macros are memory hungry and byte
+% %D spoiling.
+%
+% \def\processraster#1#2#3#4#5#6#7%
+% {\bgroup
+% \forgetall
+% \dontcomplain
+% \dimen10=\onepoint
+% \dimen10=\@@rsfactor\dimen10
+% \dimen10=#5\dimen10
+% \setbox2\hbox to #2
+% {\cleaders\hbox to 2\dimen10{#1\hss}\hss}%
+% \dimen12=#3%
+% \advance\dimen12 #4%
+% % \setbox0\vbox to \dimen12
+% {\cleaders\vbox to 2\dimen10{\box2\vss}\vss}%
+% \setbox0\hbox
+% {\hskip-.5\dimen10\lower0.5\dimen10\copy0
+% \hskip-\wd0\hskip\dimen10\lower1.5\dimen10\box0}%
+% \box0
+% \egroup}
+
+%D \macros
+%D {setupscreens}
+%D
+%D The previous macro uses a predefined constant
+%D \type{\@@rsfactor}. This factor can be set by:
+%D
+%D \showsetup{setupscreens}
+
+\def\setupscreens
+ {\dodoubleargument\getparameters[\??rs]}
+
+% %D The most appropriate way to call for this feature is
+% %D using \type{\graybox}, which is defined as:
+%
+% \def\graybox{\getvalue{\@@rsmethod graybox}}
+%
+% %D We just introduced two pure \TEX\ methods for generating
+% %D rasters. However, it's far more efficient and comfortable in
+% %D terms of speed, memory usage and file size, to use a driver
+% %D supported method.
+%
+% \setvalue{\v!external graybox}{\setgraybox}
+%
+% %D For compatibility reasons we also define the original one:
+%
+% \setvalue{\v!postscript graybox}{\getvalue{\v!external graybox}}
+%
+% %D A quite valid way of letting drivers do the job, is giving
+% %D a solid rule a gray texture.
+
+%D We will communicate through module specific variables, current
+%D framed parameters and some reserved dimension registers.
+
+\newdimen \frameddimenwd
+\newdimen \frameddimenht
+\newdimen \frameddimendp
+
+%D We don't have to stick to a \TEX\ drawn rule, but
+%D also can use rounded or even fancier shapes, as we will
+%D see later on.
+
+\def\dofilledbox
+ {\bgroup
+ \doifelse{\framedparameter\c!backgroundcorner}\v!rectangular
+ {\dofilledlinedbox}
+ {\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize
+ \dofilledlinedbox
+ \else
+ \dofilledroundbox
+ \fi}%
+ \egroup}
+
+\def\dophantombox
+ {\hphantom{\dofilledbox}}
+
+\def\dofilledlinedbox
+ {\vrule\!!width\frameddimenwd\!!height\frameddimenht\!!depth\frameddimendp\relax}%
+
+\def\dostrokedroundbox
+ {\doif{\framedparameter\c!frame}\v!on\dodostrokedroundbox}
+
+\def\dodostrokedroundbox
+ {\bgroup
+ \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}%
+ \edef\ovallin{\the\dimexpr\ruledlinewidth}%
+ \edef\ovalrad{\the\dimexpr\framedparameter\c!frameradius}%
+ \let\ovalstr\!!plusone
+ \let\ovalfil\!!zerocount
+ \forcecolorhack
+ \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
+ \forcecolorhack
+ \doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil\ovalmod
+ \egroup}
+
+% a lot of weird corners
+%
+% \startTEXpage
+% \dontleavehmode\framed
+% [corner=0,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {1} {4}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {5} {8}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {1} {4}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {5} {8}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {9}{12}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{13}{16}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{17}{20}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{21}{24}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{25}{28}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \stopTEXpage
+
+%D The oval box is drawn using a special macro, depending on
+%D the driver in use.
+
+\def\dograybox % avoid black rules when no gray
+ {\doifelsenothing{\framedparameter\c!backgroundscreen}
+ {\dophantombox}
+ {\raster[\framedparameter\c!backgroundscreen]{\dofilledbox}}}
+
+%D It won't be a surprise that we not only provide gray boxes,
+%D but also colored ones. Here it is:
+
+\def\docolorbox
+ {\hbox{\ifincolor
+ \doifcolorelse{\framedparameter\c!backgroundcolor}
+ {\localcolortrue\color[\framedparameter\c!backgroundcolor]{\dofilledbox}}
+ {\dophantombox}%
+ \else
+ \dophantombox
+ \fi}}
+
+%D \macros
+%D {defineoverlay, doifoverlayelse, overlayoffset,
+%D overlaywidth, overlayheight, overlaydepth,
+%D overlaycolor, overlaylinecolor, overlaylinewidth}
+%D
+%D Before we define the macro that actually takes card of the
+%D backgrounds, we introduce overlays. An overlay is something
+%D that contrary to its name lays {\em under} the text. An
+%D example of an overlay definition is:
+%D
+%D \startbuffer[tmp-1]
+%D \defineoverlay
+%D [fancy]
+%D [{\externalfigure
+%D [mp-cont.502]
+%D [width=\overlaywidth,
+%D height=\overlayheight]}]
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-1]
+%D
+%D That for instance can be uses in:
+%D
+%D \startbuffer[tmp-2]
+%D \framed[backgroundachtergrond=fancy]{How Fancy!}
+%D \framed[backgroundachtergrond=fancy,frame=off]{Even More Fancy!}
+%D \stopbuffer
+%D
+%D and looks like:
+%D
+%D \startlinecorrection
+%D \vbox{\baselineskip24pt\getbuffer[tmp-1]\getbuffer[tmp-2]}
+%D \stoplinecorrection
+%D
+%D The formal definition is:
+%D
+%D \showsetup{defineoverlay}
+%D
+%D This macro's definition is a bit obscure, due the many
+%D non||used arguments and the two step call that enable the
+%D setting of the width, height and depth variables.
+%D Multiple backgrounds are possible and are specified as:
+%D
+%D \starttyping
+%D \framed[background={one,two,three}]{Three backgrounds!}
+%D \stoptyping
+%D
+%D Most drawing packages only know width and height. Therefore
+%D the dimensions have a slightly different meaning here:
+%D
+%D \startitemize[packed]
+%D \item \type{\overlaywidth }: width of the overlay
+%D \item \type{\overlayheight}: height plus depth of the overlay
+%D \item \type{\overlaydepth }: depth of the overlay
+%D \stopitemize
+%D
+%D The resulting box is lowered to the right depth.
+
+\def\overlaywidth {\the\hsize\space} % We preset the variables
+\def\overlayheight {\the\vsize\space} % to some reasonable default
+\let\overlaydepth \!!zeropoint % values. The attributes
+\let\overlayoffset \!!zeropoint % of the frame can be (are)
+\let\overlaycolor \empty % set somewhere else.
+\let\overlaylinewidth \!!zeropoint %
+\let\overlaylinecolor \empty %
+
+%D The next register is used to initialize overlays.
+
+\newtoks\everyoverlay
+
+%D An example of an initialization is the following (overlays
+%D can contain text and be executed under an regime where
+%D interlineskip is off).
+
+\appendtoks \oninterlineskip \to \everyoverlay
+
+\def\defineoverlay
+ {\dodoubleargument\dodefineoverlay}
+
+\def\dodefineoverlay[#1][#2]%
+ {\def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}%
+ \processcommalist[#1]\docommand}
+
+\prependtoks
+ \hsize\overlaywidth
+ \vsize\overlayheight
+\to\everyoverlay
+
+\long\def\executedefinedoverlay#1#2%
+ {\bgroup
+ \edef\overlaywidth {\the\frameddimenwd\space}%
+ \edef\overlayheight{\the\dimexpr\frameddimenht+\frameddimendp\relax\space}%
+ \edef\overlaydepth {\the\frameddimendp\space}%
+ \edef\overlaycolor {\framedparameter\c!backgroundcolor}%
+ %\edef\overlaycorner{\framedparameter\c!backgroundcorner}%
+ %\edef\overlayradius{\framedparameter\c!backgroundradius}%
+ \let\overlayoffset\backgroundoffset % we steal this one
+ \setbox\scratchbox\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}%
+ \setbox\scratchbox\hbox
+ {\hskip-.5\dimexpr\wd\scratchbox-\overlaywidth \relax
+ \raise-.5\dimexpr\ht\scratchbox-\frameddimenht\relax % not overlayheight !
+ \box\scratchbox}%
+ \wd\scratchbox\overlaywidth
+ \ht\scratchbox\overlayheight
+ \dp\scratchbox\overlaydepth
+ \startlayoutcomponent{o:#1}{overlay #1}%
+ \box\scratchbox
+ \stoplayoutcomponent
+ \egroup}
+
+%D The empty case is:
+
+\let\executeoverlay\gobblesevenarguments
+
+%D For testing we provide:
+
+\def\doifoverlayelse#1%
+ {\doifdefinedelse{\??ov#1}}
+
+%D We predefine two already familiar backgrounds:
+
+\setvalue{\??ov\v!screen}{\dograybox }
+\setvalue{\??ov\v!color }{\docolorbox}
+
+% %D After all these preparations, the background macro does no
+% %D bring to many surprises. One has to keep in mind that this
+% %D macro starts up a call chain, depending on the background
+% %D one needs:
+% %D
+% %D \startitemize[packed]
+% %D \item a raster, color or user defined shape
+% %D \item square or round corners
+% %D \item a \TEX\ or driver based method
+% %D \stopitemize
+% %D
+% %D The macro can be extended by adding commands to the token
+% %D list register \type {\everybackgroundbox}. For this
+% %D purpose, the name of the current background is available in
+% %D \type {\currentbackgound}.
+
+%D The content of the box will be (temporary) saved in a box. We
+%D also have an extra box for backgrounds.
+
+\newbox\framebox
+\newbox\extraframebox
+
+\newtoks\everybackgroundbox
+
+\let\currentbackground\empty
+
+% \def\dodobackgroundbox#1% also less passing, we can get rid of the old method
+% {\bgroup
+% \def\currentbackground{#1}%
+% \the\everybackgroundbox
+% \setbox\extraframebox\hbox
+% {\vbox{\moveleft\backgroundoffset\hbox{\executeifdefined{\??ov\currentbackground}\donothing}}}%
+% \wd\extraframebox\zeropoint % \backgroundwidth
+% \ht\extraframebox\backgroundheight
+% \dp\extraframebox\backgrounddepth
+% \box\extraframebox % \hskip-\backgroundwidth
+% \egroup}
+
+% \def\dodobackgroundbox#1% also less passing, we can get rid of the old method
+% {\bgroup
+% \def\currentbackground{#1}%
+% \ifcsname\??ov\currentbackground\endcsname
+% \the\everybackgroundbox
+% \setbox\extraframebox\hbox{\vbox{\moveleft\backgroundoffset\hbox{\csname\??ov\currentbackground\endcsname}}}%
+% \wd\extraframebox\zeropoint % \backgroundwidth
+% \ht\extraframebox\backgroundheight
+% \dp\extraframebox\backgrounddepth
+% \box\extraframebox % \hskip-\backgroundwidth
+% \fi
+% \egroup}
+
+\def\dodobackgroundbox
+ {\bgroup
+ \ifcsname\??ov\currentbackground\endcsname
+ \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}
+\def\backgroundheight{\the\vsize}
+
+% todo: also \def\theforegroundbox{#1}
+
+% \def\dobackgroundbox#1%
+% {\setbox\framebox\vbox
+% {\forgetall
+% \boxmaxdepth\maxdimen
+% \scratchdimen \framedparameter{#1}\relax
+% \frameddimenwd\dimexpr\wd\framebox+2\scratchdimen\relax
+% \frameddimenht\dimexpr\ht\framebox+ \scratchdimen\relax
+% \frameddimendp\dimexpr\dp\framebox+ \scratchdimen+\framedparameter\c!backgrounddepth\relax
+% \edef\backgroundoffset{\the\scratchdimen}%
+% \edef\backgroundwidth {\the\wd\framebox}%
+% \edef\backgroundheight{\the\ht\framebox}%
+% \edef\backgrounddepth {\the\dp\framebox}%
+% %\edef\foregroundbox{\box#1}%
+% \def\foregroundbox% fuzzy but needed hack, this \vss, otherwise
+% {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift
+% \edef\component{\framedparameter\c!component}%
+% \hbox to \backgroundwidth % in case 'foreground' is used as overlay
+% {\ifx\component\empty
+% \rawprocesscommalist[\framedbackground]\dodobackgroundbox
+% \else
+% \startlayoutcomponent{b:\component}{\s!background\space\component}%
+% \rawprocesscommalist[\framedbackground]\dodobackgroundbox
+% \stoplayoutcomponent
+% \fi
+% \box\framebox\hss}}}
+
+\def\normalforegroundbox% fuzzy but needed hack, this \vss, otherwise
+ {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift
+
+\def\dobackgroundbox#1%
+ {\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}%
+ \edef\component{\framedparameter\c!component}%
+ \let\foregroundbox\normalforegroundbox
+ \hbox to \backgroundwidth % in case 'foreground' is used as overlay
+ {\ifx\component\empty
+ \expanded{\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax
+ \else
+ \startlayoutcomponent{b:\component}{background \component}%
+ \expanded{\dododobackgroundbox\framedparameter\c!background},\s!unknown,\relax
+ \stoplayoutcomponent
+ \fi
+ \box\framebox\hss}}}
+
+%D One can explictly insert the foreground box. For that
+%D purpose we introduce the overlay \type {foreground}.
+
+\defineoverlay[\v!foreground][\foregroundbox]
+
+%D We can specify overlays as a comma separated list of
+%D overlays, a sometimes handy feature.
+
+%D Besides backgrounds (overlays) we also need some macros to
+%D draw outlines (ruled borders). Again we have to deal with
+%D square and round corners. The first category can be handled
+%D by \TEX\ itself, the latter one depends on the driver. This
+%D macro also support a negative offset.
+
+\ifx\scratchoffset\undefined \newdimen\scratchoffset \fi
+
+\def\dooutlinebox % we needed to move the color command in order to apply attributes properly
+ {\setbox\framebox\vbox % rules on top of box
+ {\scratchoffset \framedparameter\c!frameoffset\relax
+ \frameddimenwd\dimexpr\wd\framebox+2\scratchoffset\relax
+ \frameddimenht\dimexpr\ht\framebox+ \scratchoffset\relax
+ \frameddimendp\dimexpr\dp\framebox+ \scratchoffset+\framedparameter\c!framedepth\relax
+ \ifdim\frameddimendp<\zeropoint
+ \advance\frameddimenht \frameddimendp
+ \scratchdimen-\frameddimendp
+ \frameddimendp\zeropoint
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \setbox\extraframebox\hbox
+ {\doifsomething{\framedparameter\c!framecolor}{\color[\framedparameter\c!framecolor]}{\dostrokedbox}}%
+ \setbox\extraframebox\hbox
+ {\raise\scratchdimen\vbox
+ {\moveleft\scratchoffset
+ \box\extraframebox}}%
+ \wd\extraframebox\wd\framebox
+ \ht\extraframebox\ht\framebox
+ \dp\extraframebox\dp\framebox
+ \hbox{\box\framebox\hskip-\wd\extraframebox\box\extraframebox}}}
+
+\def\dostrokedbox
+ {\doifelse{\framedparameter\c!framecorner}\v!rectangular
+ {\dostrokedlinedbox}
+ {\ifzeropt\dimexpr\framedparameter\c!frameradius\relax % just in case of .x\bodyfontsize
+ \dostrokedlinedbox
+ \else
+ \dostrokedroundbox
+ \fi}}
+
+\def\dostrokedlinedbox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\frameddimenwd
+ \ht\scratchbox\frameddimenht
+ \dp\scratchbox\frameddimendp
+ \setbox\scratchbox\vbox \bgroup
+ \csname t\@@frame@@\framedparameter\c!frame\framedparameter\c!topframe \endcsname
+ \hbox \bgroup
+ \csname l\@@frame@@\framedparameter\c!frame\framedparameter\c!leftframe \endcsname
+ \box\scratchbox
+ \csname r\@@frame@@\framedparameter\c!frame\framedparameter\c!rightframe \endcsname
+ \egroup
+ \csname b\@@frame@@\framedparameter\c!frame\framedparameter\c!bottomframe\endcsname
+ \egroup
+ \wd\scratchbox\frameddimenwd
+ \ht\scratchbox\frameddimenht
+ \dp\scratchbox\frameddimendp
+ \box\scratchbox}
+
+\def\@@frame@@{@@frame@@}
+
+% \setvalue{t\@@frame@@\v!on \v!on}{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{t\@@frame@@\v!off\v!on}{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{t\@@frame@@\v!on }{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{b\@@frame@@\v!on \v!on}{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+% \setvalue{b\@@frame@@\v!off\v!on}{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+% \setvalue{b\@@frame@@\v!on }{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+% \setvalue{l\@@frame@@\v!on \v!on}{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{l\@@frame@@\v!off\v!on}{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{l\@@frame@@\v!on }{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{r\@@frame@@\v!on \v!on}{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+% \setvalue{r\@@frame@@\v!off\v!on}{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+% \setvalue{r\@@frame@@\v!on }{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+
+\def\@@frame@@trule{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+\def\@@frame@@brule{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+\def\@@frame@@rrule{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+\def\@@frame@@lrule{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+
+\letvalue{t\@@frame@@\v!on \v!on}\@@frame@@trule
+\letvalue{t\@@frame@@\v!off\v!on}\@@frame@@trule
+\letvalue{t\@@frame@@\v!on }\@@frame@@trule
+
+\letvalue{b\@@frame@@\v!on \v!on}\@@frame@@brule
+\letvalue{b\@@frame@@\v!off\v!on}\@@frame@@brule
+\letvalue{b\@@frame@@\v!on }\@@frame@@brule
+
+\letvalue{l\@@frame@@\v!on \v!on}\@@frame@@lrule
+\letvalue{l\@@frame@@\v!off\v!on}\@@frame@@lrule
+\letvalue{l\@@frame@@\v!on }\@@frame@@lrule
+
+\letvalue{r\@@frame@@\v!on \v!on}\@@frame@@rrule
+\letvalue{r\@@frame@@\v!off\v!on}\@@frame@@rrule
+\letvalue{r\@@frame@@\v!on }\@@frame@@rrule
+
+% no overlapping rules
+
+\def\@@frame@@trules{\hbox{\kern\ruledlinewidth\vrule\!!width\dimexpr\frameddimenwd-2\ruledlinewidth\relax\!!height\ruledlinewidth}\nointerlineskip\kern-\ruledlinewidth}
+\def\@@frame@@brules{\kern-\ruledlinewidth\nointerlineskip\hbox{\kern\ruledlinewidth\vrule\!!width\dimexpr\frameddimenwd-2\ruledlinewidth\relax\!!height\ruledlinewidth}}
+\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
+
+\letvalue{b\@@frame@@\v!small\v!small}\@@frame@@brules
+\letvalue{b\@@frame@@\v!off \v!small}\@@frame@@brules
+\letvalue{b\@@frame@@\v!small }\@@frame@@brules
+
+\letvalue{l\@@frame@@\v!small\v!small}\@@frame@@lrules
+\letvalue{l\@@frame@@\v!off \v!small}\@@frame@@lrules
+\letvalue{l\@@frame@@\v!small }\@@frame@@lrules
+
+\letvalue{r\@@frame@@\v!small\v!small}\@@frame@@rrules
+\letvalue{r\@@frame@@\v!off \v!small}\@@frame@@rrules
+\letvalue{r\@@frame@@\v!small }\@@frame@@rrules
+
+%D I condidered using the low level support command
+%D \type{\ruledhbox}, but this would slow down processing by a
+%D factor~3.
+
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=on,leftframe=on,topframe=on,bottomframe=on]
+% {}
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=small]
+% {}
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=on]
+% {}
+
+%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
+%D start with defining some booleans. These give an impression
+%D of what we are going to take into account.
+
+% todo: chardefs
+
+\newif\ifboxhasoffset
+\newif\ifboxhaswidth
+\newif\ifboxhasheight
+\newif\ifboxhasformat
+\newif\ifboxhasstrut
+\newif\ifboxisoverlaid
+\newif\ifboxhasframe
+\newif\ifdelayedstrut
+
+%D We also need a few \DIMENSIONS:
+
+\newdimen\@@localoffset
+\newdimen\@@globalwidth
+
+%D \macros
+%D {framed, setupframed}
+%D
+%D Ruled boxes are typeset using \type{\framed}. This command
+%D is quite versatile and, although some users will probably
+%D seldom use it, one cannot overlook its features.
+%D
+%D \showsetup{setupframed}
+%D \showsetup{framed}
+%D
+%D This general macro is a special version of an even more
+%D general case, that can easily be linked into other macros
+%D that need some kind of framing. The local version is called
+%D with an extra parameter: the variable identifier. The reason
+%D for passing this identifier between brackets lays in the
+%D mere fact that this way we can use the optional argument
+%D grabbers.
+
+\def\defaultframeoffset{.25ex}
+
+\unexpanded\def\framed
+ {\bgroup
+ \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]%
+ {\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}
+
+\def\dosetupframed
+ {\ifsecondargument
+ \@EA\dodoublesetupframed
+ \else
+ \@EA\dosinglesetupframed
+ \fi}
+
+\def\dosinglesetupframed[#1][#2]%
+ {\getparameters[\??oi][#1]}
+
+\def\dodoublesetupframed[#1][#2]%
+ {\bgroup
+ \let\dodoubleempty\empty
+ \def\doframed[##1]{\gdef\globalredefinedframed{\dodoubleempty\doframed[##1,#2]}}%
+ \getvalue{#1}%
+ \egroup
+ \letvalue{#1}\globalredefinedframed}
+
+%D \startbuffer
+%D \setupframed [framecolor=yellow] \framed{A}
+%D \defineframed[myframed] [framecolor=blue] \myframed{B}
+%D \setupframed [myframed] [framecolor=red] \myframed{C}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \presetlocalframed[myframed]
+%D \setuplocalframed[myframed][width=4cm,height=2cm]
+%D \localframed[myframed][framecolor=green]{oeps}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {ifinframed}
+%D
+%D The normal case first presets all parameters and next starts
+%D looking for the user supplied ones. The first step is
+%D omitted in the local case, because these are preset at
+%D declaration time and keep their values unless explictly
+%D changed. By presetting the variables everytime the normal
+%D command is called, we can use this command nested, without
+%D the unwanted side effect of inheritance. The boolean is
+%D used to speed up the color stack.
+
+\newif\ifinframed
+
+\def\localframed
+ {\bgroup
+ \dodoubleempty\startlocalframed}
+
+%D The next one is faster on multiple backgrounds per page. No
+%D dimensions can be set, only frames and backgrounds.
+
+\def\fastlocalframed[#1]#2[#3]#4% 3-4
+ {\bgroup
+ \inframedtrue
+ \edef\@@framed{#1}%
+ % more bytes
+ % \scratchdimen\framedparameter\c!frameoffset
+ % \setevalue{\@@framed\c!frameoffset}{\the\scratchdimen}%
+ % \doifnotvalue{\@@framed\c!backgroundoffset}\v!frame
+ % {\scratchdimen\framedparameter\c!backgroundoffset
+ % \setevalue{\@@framed\c!backgroundoffset}{\the\scratchdimen}}%
+ % less bytes
+ \@EA\freezedimenmacro\csname\@@framed\c!frameoffset\endcsname
+ \doifnotvalue{\@@framed\c!backgroundoffset}\v!frame
+ {\@EA\freezedimenmacro\csname\@@framed\c!backgroundoffset\endcsname}%
+ % so far
+ \setbox\framebox\hbox{#4}%
+ \getparameters[\@@framed][#3]% no \expanded !
+ % no, better in calling macro
+ %
+ % \edef\doframedsetups{\framedparameter\c!setups}%
+ % \ifx\doframedsetups\empty\else
+ % \edef\doframedsetups{\noexpand\setups[\doframedsetups]}%
+ % \fi
+ \removeframedboxdepth
+ \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
+ \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}%
+ \edef\overlaylinewidth{\the\ruledlinewidth}%
+ \edef\@@localframing {\framedparameter\c!frame}%
+ \ifx\@@localframing\v!overlay \else \ifx\@@localframing\v!none \else
+ \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+ \ifx\framedrulethickness\empty\else
+ \ruledlinewidth\framedrulethickness\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+ \fi
+ \dooutlinebox % real or invisible frame
+ \fi \fi
+ \edef\framedbackground{\framedparameter\c!background}%
+ \ifx\framedbackground\empty\else\dobackedbox\fi
+ \restoreframedboxdepth
+ \box\framebox
+ \egroup}
+
+%D Before we go into details, we present (and implement) the
+%D main framing routine. I saw no real reason for splitting the
+%D next two macros into smaller pieces. The content will be
+%D collected in a horizontal or vertical box with fixed or free
+%D dimensions and specific settings concerning aligment and
+%D offsets.
+%D
+%D In the first few lines, we pre||expand the frame and
+%D background offsets. We do so, because the can be defined in
+%D terms of the main offset. However, see for instance page
+%D backgrounds, when \type {#2} sets the offset to \type
+%D {overlay}, both offsets become invalid.
+%D
+%D Because it is used so often the he next macro is (and
+%D looks) rather optimized.
+
+\let\postprocessframebox\relax
+
+\let\@@framed\s!unknown
+
+\def\framedparameter#1%
+ {\csname\@@framed#1\endcsname}
+
+\newdimen\!!framedwidth
+\newdimen\!!framedheight
+
+\def\startlocalframed[#1][#2]%
+ {\bgroup
+ \inframedtrue
+ \edef\@@framed{#1}%
+ % this piece of pre expansion is needed (sometimes used in frameoffset)
+ % \doifvaluesomething{\@@framed\c!rulethickness} % obsolete
+ % {\ruledlinewidth\getvalue{\@@framed\c!rulethickness}}% obsolete
+ % this piece of pre expansion is needed (sometimes used circular)
+ \setevalue{\@@framed\c!frameoffset}{\the\dimexpr\framedparameter\c!frameoffset\relax}%
+ \doifnotvalue{\@@framed\c!backgroundoffset}\v!frame
+ {\setevalue{\@@framed\c!backgroundoffset}{\the\dimexpr\framedparameter\c!backgroundoffset\relax}}%
+ % to prevent deadlock in case of self refering
+ \ifsecondargument % faster
+ \getparameters[\@@framed][#2]% here !
+ \fi
+ % new, experimental dirty hook
+ \framedparameter\c!extras
+ % to get the right spacing
+ \doifvaluesomething{\@@framed\c!foregroundstyle}
+ {\@EA\doconvertfont\csname\@@framed\c!foregroundstyle\endcsname\empty}%
+ % beware, both the frame and background offset can be overruled
+ %
+ \edef\doframedsetups{\framedparameter\c!setups}%
+ \ifx\doframedsetups\empty\else
+ \edef\doframedsetups{\noexpand\setups[\doframedsetups]}%
+ \fi
+ % the next macros are visible
+ \edef\localoffset{\framedparameter\c!offset}%
+ \edef\localwidth {\framedparameter\c!width}%
+ \edef\localheight{\framedparameter\c!height}%
+ \edef\localformat{\framedparameter\c!align}%
+ \edef\localstrut {\framedparameter\c!strut}%
+ % these are not
+ \edef\@@localautostrut {\framedparameter\c!autostrut}%
+ \edef\@@localframing {\framedparameter\c!frame}%
+ \edef\@@locallocation {\framedparameter\c!location}%
+ \edef\@@localorientation{\framedparameter\c!orientation}%
+ %
+ \edef\@@localautowidth {\framedparameter\c!autowidth}%
+ %
+ \ifx\@@localframing\v!overlay % no frame, no offset, no framewidth
+ \boxhasframefalse
+ \let\localoffset\v!overlay
+ \else\ifx\@@localframing\v!none % no frame, no framewidth
+ \boxhasframefalse
+ \else
+ \boxhasframetrue
+ \fi\fi
+ \ifboxhasframe
+ \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+ \ifx\framedrulethickness\empty\else
+ \ruledlinewidth\framedrulethickness\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+ \fi
+ \else
+ \ruledlinewidth\zeropoint
+ \fi
+ \ifx\localformat\empty
+ \boxhasformatfalse
+ \else
+ \boxhasformattrue
+ \dosetraggedcommand\localformat
+ \edef\dobeforeframedbox{\raggedtopcommand\framedparameter\c!top}%
+ \edef\doafterframedbox {\framedparameter\c!bottom\raggedbottomcommand}%
+ \fi
+ \ifx\localoffset\v!none
+ \boxhasoffsetfalse
+ \boxhasstrutfalse
+ \boxisoverlaidfalse
+ \@@localoffset\ruledlinewidth
+ \else\ifx\localoffset\v!overlay
+ % \ifx\@@localframing\v!no \boxhasframefalse \fi % test first
+ \boxhasoffsetfalse
+ \boxhasstrutfalse
+ \boxisoverlaidtrue
+ \@@localoffset\zeropoint
+ \else
+ \boxhasoffsettrue
+ \boxhasstruttrue
+ \boxisoverlaidfalse
+ \ifx\localoffset\v!default % new per 2-6-2000
+ \let\localoffset\defaultframeoffset
+ \letvalue{\@@framed\c!offset}\defaultframeoffset
+ \else
+ \let\defaultframeoffset\localoffset
+ \fi
+ \@@localoffset\dimexpr\localoffset+\ruledlinewidth\relax
+ \fi\fi
+ \!!framedheight\zeropoint
+ \!!framedwidth \zeropoint
+ \ifx\localwidth\v!fit
+ \ifboxhasformat
+ \boxhaswidthtrue
+ \!!framedwidth\hsize
+ \else
+ \boxhaswidthfalse
+ \fi
+ \else\ifx\localwidth\v!fixed % equals \v!fit but no shapebox
+ \ifboxhasformat
+ \boxhaswidthtrue
+ \!!framedwidth\hsize
+ \else
+ \boxhaswidthfalse
+ \fi
+ \else\ifx\localwidth\v!broad
+ \boxhaswidthtrue
+ \!!framedwidth\hsize
+ \else\ifx\localwidth\v!local
+ \boxhaswidthtrue
+ \setlocalhsize
+ \!!framedwidth\localhsize
+ \else
+ \boxhaswidthtrue
+ \!!framedwidth\localwidth
+ \fi\fi\fi\fi
+ \ifx\localheight\v!fit
+ \boxhasheightfalse % no longer: \boxhasstrutfalse
+ \else\ifx\localheight\v!broad
+ \boxhasheightfalse
+ \else
+ \boxhasheighttrue
+ \!!framedheight\localheight
+ \fi\fi
+ \ifboxhasheight
+ % obey user set height, also downward compatible
+ \else
+ \doifvaluesomething{\@@framed\c!lines}
+ {\ifcase\framedparameter\c!lines\else
+ \!!framedheight\framedparameter\c!lines\lineheight
+ \edef\localheight{\the\!!framedheight}%
+ \boxhasheighttrue
+ \fi}%
+ \fi
+ % this is now an option: width=local
+ %
+ % \ifdim\!!framedwidth=\hsize
+ % \parindent\zeropoint
+ % \setlocalhsize
+ % \!!framedwidth\localhsize
+ % \fi
+ % i.e. disable (colsetbackgroundproblemintechniek)
+ \advance\!!framedwidth -2\@@localoffset
+ \advance\!!framedheight -2\@@localoffset
+ \ifx\localstrut\v!no
+ \boxhasstrutfalse
+ \else\ifx\localstrut\v!global
+ \setstrut
+ \else\ifx\localstrut\v!local
+ \setfontstrut
+ \else
+ \setstrut
+ \fi\fi\fi
+ \ifboxhasstrut
+ \let\localbegstrut\begstrut
+ \let\localendstrut\endstrut
+ \let\localstrut \strut
+ \else
+ \let\localbegstrut\pseudobegstrut % was: \relax
+ \let\localendstrut\pseudoendstrut % was: \relax
+ \let\localstrut \pseudostrut % was: \relax
+ %\ifboxhasheight\ifdim\!!framedheight<\strutht % saveguard
+ % \let\localbegstrut\relax % but not that
+ % \let\localstrut \relax % save after all
+ %\fi\fi
+ \fi
+ \ifx\@@localautostrut\v!yes
+ \let\delayedbegstrut\relax
+ \let\delayedendstrut\relax
+ \let\delayedstrut \relax
+ \else
+ \let\delayedbegstrut\localbegstrut
+ \let\delayedendstrut\localendstrut
+ \let\delayedstrut \localstrut
+ \let\localbegstrut \relax
+ \let\localendstrut \relax
+ \let\localstrut \relax
+ \fi
+ \ifboxhasheight
+ \let\\\vboxednewline
+ \ifboxhaswidth
+ \let\hairline\vboxedhairline
+ \ifboxhasformat
+ \let\next\doformatboxSomeFormat
+ \else
+ \let\next\doformatboxNoFormat
+ \fi
+ \else
+ \let\hairline\hboxedhairline
+ \ifboxhasformat
+ \let\next\doformatboxHeight
+ \else
+ \let\next\doformatboxVSize
+ \fi
+ \fi
+ \else
+ \ifboxhaswidth
+ \ifboxhasformat
+ \let\hairline\vboxedhairline
+ \let\\\vboxednewline
+ \let\next\doformatboxWidth
+ \else
+ \let\hairline\hboxedhairline
+ \let\\\hboxednewline
+ \let\next\doformatboxHSize
+ \fi
+ \else
+ \let\hairline\hboxedhairline
+ \let\\\hboxednewline
+ \let\next\doformatboxNoSize
+ \fi
+ \fi
+ \edef\framedwidth % a new feature, visible for user
+ {\ifdim\!!framedwidth >\zeropoint\the\!!framedwidth \else\zeropoint\fi}%
+ \edef\framedheight% a new feature, visible for user
+ {\ifdim\!!framedheight>\zeropoint\the\!!framedheight\else\zeropoint\fi}%
+ % we need to register the (outer) color
+ \startregistercolor[\framedparameter\c!foregroundcolor]%
+ % first alternative
+ %\def\dowithframedbox%
+ % {\let\postprocessframebox\relax %new
+ % \aftergroup\stoplocalframed}%
+ % \afterassignment\dowithframedbox
+ % \setbox\framebox=\next}
+ % second alternative
+ %\dowithnextbox
+ % {\setbox\framebox\flushnextbox
+ % \let\postprocessframebox\relax %new
+ % \stoplocalframed}
+ % \next}
+ \@@startframedorientation
+ \afterassignment\dodowithframebox
+ \setbox\framebox\next}
+
+\def\dowithframebox
+ {% moved : \let\postprocessframebox\relax
+ \stoplocalframed}
+
+\def\dodowithframebox
+ {\aftergroup\dowithframebox}
+
+\let\doafterframedbox \relax
+\let\dobeforeframedbox\relax
+
+%D Carefull analysis of this macro will learn us that not all
+%D branches in the last conditionals can be encountered, that
+%D is, some assignments to \type{\next} will never occur.
+%D Nevertheless we implement the whole scheme, if not for
+%D future extensions.
+
+%D \macros
+%D {ifreshapeframebox}
+%D
+%D The last few lines tell what to do after the content of the
+%D box is collected and passed to the next macro. In the case
+%D of a fixed width and centered alignment, the content is
+%D evaluated and used to determine the most natural width. The
+%D rest of the code deals with backgrounds and frames.
+
+\newif\ifreshapeframebox \reshapeframeboxtrue
+
+%D Beware: setting \type {top} and \type {bottom} to nothing, may
+%D result in a frame that is larger that the given height! try:
+%D
+%D \starttyping
+%D \framed
+%D [height=3cm,top=,bottom=,offset=overlay]
+%D {\strut test \shapefill \strut test}
+%D \stoptyping
+%D
+%D This is intended behaviour and not a bug! One can always set
+%D
+%D \starttyping
+%D ...,bottom=\kern0pt,...
+%D \stoptyping
+
+\def\stoplocalframed
+ {\dontshowcomposition
+ \@@stopframedorientation % hm, wrong place ! should rotate the result (after reshape)
+ \stopregistercolor
+ \handleframedlocator\c!before\@@locallocation
+ \ifboxhasformat
+ \ifx\@@localautowidth\v!force
+ \ifreshapeframebox\doreshapeframedbox\fi
+ \boxhaswidthfalse
+ \else
+ \ifx\localwidth\v!fit
+ \ifx\@@localautowidth\v!yes
+ \ifreshapeframebox\doreshapeframedbox\fi
+ \fi
+ \boxhaswidthfalse
+ \else\ifx\localwidth\v!fixed
+ \boxhaswidthfalse
+ \else
+ \resetshapeframebox
+ \fi\fi
+ \fi
+ \else
+ \resetshapeframebox
+ \fi
+ \ifboxhaswidth
+ \wd\framebox\!!framedwidth
+ \fi
+ \ifboxhasheight
+ \ht\framebox\!!framedheight
+ \fi
+ \doifvalue{\@@framed\c!empty}\v!yes
+ {\setbox\scratchbox\null
+ \wd\scratchbox\wd\framebox
+ \ht\scratchbox\ht\framebox
+ \dp\scratchbox\dp\framebox
+ \setbox\framebox\box\scratchbox}%
+ \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
+ \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
+ \ifboxhasoffset
+ \dooffsetframebox
+ \fi
+ \ifboxisoverlaid \else
+ \dolocateframebox
+ \fi
+ \ifx\postprocessframebox\relax \else
+ \let\next\postprocessframebox
+ \let\postprocessframebox\relax % prevent nesting
+ \next\framebox
+ \fi
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}%
+ \edef\overlaylinewidth{\the\ruledlinewidth}% \@@...
+ \ifboxhasframe % real or invisible frame
+ \dooutlinebox
+ \fi
+ \edef\framedbackground{\framedparameter\c!background}%
+ \ifx\framedbackground\empty\else\dobackedbox\fi
+ \handleframedlocator\c!after\@@locallocation
+ \box\framebox
+ \egroup
+ \egroup}
+
+\def\installframedlocator#1#2#3%
+ {\setvalue{\??ol:\c!location:\c!before:#1}{#2}%
+ \setvalue{\??ol:\c!location:\c!after :#1}{#3}}
+
+\def\handleframedlocator#1#2%
+ {\getvalue{\??ol:\c!location:#1:#2}}
+
+\def\doprelocframedbox#1%
+ {\scratchdimen\dimexpr#1+\ruledlinewidth\relax
+ \ifboxhasoffset
+ \advance\scratchdimen \framedparameter\c!offset
+ \fi
+ \scratchskip\dimexpr\ht\framebox-\scratchdimen\relax}
+
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=hanging]{location\\equals\\hanging}
+% \framed[width=2cm,align=middle,location=depth] {location\\equals\\depth}
+% \framed[width=2cm,align=middle,location=height] {location\\equals\\height}
+% B}
+% \vskip2cm
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=low] {location\\equals\\low}
+% \framed[width=2cm,align=middle,location=line] {location\\equals\\line}
+% \framed[width=2cm,align=middle,location=high] {location\\equals\\high}
+% B}
+% \vskip2cm
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=top] {location\\equals\\top}
+% \framed[width=2cm,align=middle,location=bottom] {location\\equals\\bottom}
+% \framed[width=2cm,align=middle,location=lohi] {location\\equals\\lohi}
+% \framed[width=2cm,align=middle,location=middle] {location\\equals\\middle}
+% B}
+
+\installframedlocator \v!hanging % best with strut=no
+ {}
+ {\dp\framebox\ht\framebox
+ \ht\framebox\zeropoint}
+
+\installframedlocator \v!depth
+ {}
+ {\ht\framebox\dimexpr\ht\framebox-\strutdp\relax
+ \dp\framebox\strutdp
+ \box\framebox}
+
+\installframedlocator \v!height
+ {}
+ {\dp\framebox\dimexpr\ht\framebox-\strutht\relax
+ \ht\framebox\strutht
+ \box\framebox}
+
+\installframedlocator \v!high
+ {}
+ {\doprelocframedbox\strutht
+ \setbox\framebox\hbox{\lower\scratchskip\box\framebox}%
+ \ht\framebox\strutht
+ \dp\framebox\strutdp
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!line
+ {}
+ {\setbox\framebox\hbox{\lower.5\ht\framebox\box\framebox}%
+ \ht\framebox.5\lineheight
+ \dp\framebox.5\lineheight
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!low
+ {}
+ {\doprelocframedbox\strutdp
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\strutht
+ \dp\framebox\strutdp
+ \box\framebox}
+
+\installframedlocator \v!top
+ {}
+ {\doprelocframedbox\strutht
+ \setbox\framebox\hbox{\lower\scratchskip\box\framebox}%
+ \ht\framebox\scratchdimen
+ \dp\framebox\scratchskip
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!middle
+ {}
+ {\scratchdimen.5\ht\framebox
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\scratchdimen
+ \dp\framebox\scratchdimen
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!lohi
+ {\handleframedlocator\c!before\v!middle}
+ {\handleframedlocator\c!after \v!middle}
+
+\installframedlocator \v!bottom
+ {}
+ {\doprelocframedbox\strutdp
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\scratchskip
+ \dp\framebox\scratchdimen
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!keep % retains height/depth
+ {\removeframedboxdepth}
+ {\restoreframedboxdepth}
+
+% also used in fastlocalframed
+
+\newdimen\originalframedwd
+\newdimen\originalframedht
+\newdimen\originalframeddp
+
+\def\removeframedboxdepth
+ {\originalframedwd\wd\framebox
+ \originalframedht\ht\framebox
+ \originalframeddp\dp\framebox
+ \ifzeropt\originalframeddp\else\setbox\framebox\hbox{\raise\originalframeddp\box\framebox}\fi
+ \wd\framebox\originalframedwd
+ \ht\framebox\dimexpr\originalframedht+\originalframeddp\relax
+ \dp\framebox\zeropoint}
+
+\def\restoreframedboxdepth
+ {\ifzeropt\originalframeddp\else\setbox\framebox\hbox{\lower\originalframeddp\box\framebox}\fi
+ \wd\framebox\originalframedwd
+ \ht\framebox\originalframedht
+ \dp\framebox\originalframeddp}
+
+% \let\@@startframedorientation\relax
+% \let\@@stopframedorientation \relax
+
+% \framed[width=12cm,height=3cm,orientation=0]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=90]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=180]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=270]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-90]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-180]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-270]{\input ward\relax}
+
+\def\@@startframedorientation
+ {\let\@@stopframedorientation \relax
+ \ifx\@@localorientation\empty\else
+ \ifcase\@@localorientation\else
+ \scratchcounter\@@localorientation
+ \divide\scratchcounter\plustwo
+ \ifodd\scratchcounter
+ \swapmacros\framedwidth \framedheight
+ \swapmacros\localwidth \localheight
+ \swapdimens\!!framedheight\!!framedwidth
+ \def\@@stopframedorientation{\@@dostopframedorientation\plusone}%
+ \else
+ \def\@@stopframedorientation{\@@dostopframedorientation\zerocount}%
+ \fi
+ \fi
+ \fi}
+
+\def\@@dostopframedorientation#1%
+ {\ifcase#1\else
+ \swapmacros\framedwidth \framedheight
+ \swapmacros\localwidth \localheight
+ \swapdimens\!!framedheight\!!framedwidth
+ \fi
+ \setbox\framebox\hbox{\dorotatebox\@@localorientation\hbox{\box\framebox}}}
+
+%D The last conditional takes care of the special situation of
+%D in||line \inframed[height=3cm]{framed} boxes. Such boxes have
+%D to be \inframed{aligned} with the running text.
+
+\def\doinframed[#1]% we could omit #1] but readibility ...
+ {\framed[\c!location=\v!low,#1]}
+
+\unexpanded\def\inframed
+ {\dosingleempty\doinframed}
+
+%D When we set \type{empty} to \type{yes}, we get
+%D ourselves a frame and/or background, but no content, so
+%D actually we have a sort of phantom framed box.
+
+%D Because color marks and specials can interfere with
+%D spacing, we provide a way to specify a foregroundcolor.
+
+\def\docolorframebox
+ {\doifvaluesomething{\@@framed\c!foregroundcolor}
+ {\doifcolorelse{\framedparameter\c!foregroundcolor}
+ {\setbox\framebox\hbox
+ {\localcolortrue
+ \color[\framedparameter\c!foregroundcolor]{\box\framebox}}}
+ {}}}
+
+%D \macros
+%D {mframed, minframed}
+%D
+%D When Tobias asked how to frame mathematical elements in
+%D formulas, Taco's posted the next macro:
+%D
+%D \starttyping
+%D \def\mframed#1%
+%D {\relax
+%D \ifmmode
+%D \vcenter{\hbox{\framed{$\ifinner\else\displaystyle\fi#1$}}}%
+%D \else
+%D \framed{$#1$}%
+%D \fi}
+%D \stoptyping
+%D
+%D Because \type {\ifinner} does not (always) reports what
+%D one would expect, we move the test to the outer level. We
+%D also want to pass arguments,
+%D
+%D \starttyping
+%D \def\mframed%
+%D {\dosingleempty\domframed}
+%D
+%D \def\domframed[#1]#2% % tzt \dowithnextmathbox ?
+%D {\relax
+%D \ifmmode
+%D \ifinner
+%D \inframed[#1]{$#2$}%
+%D \else
+%D \vcenter{\hbox{\framed[#1]{$\displaystyle#2$}}}%
+%D \fi
+%D \else
+%D \inframed[#1]{$#2$}%
+%D \fi}
+%D \stoptyping
+%D
+%D Still better is the next alternative, if only because it
+%D takes care of setting the super- and subscripts styles
+
+\ifx\restoremathstyle\undefined \let\restoremathstyle\relax \fi
+
+\def\domframed[#1][#2]#3%
+ {\begingroup
+ \ifmmode
+ \ifinner
+ \let\mframedstyle\restoremathstyle
+ \else
+ \let\mframedstyle\displaystyle
+ \fi
+ \else
+ \let\mframedstyle\restoremathstyle
+ \fi
+ #1\ifdone
+ \def\normalstrut{$\mframedstyle\vphantom($}%
+ \framed
+ [\c!frameoffset=\@@oioffset,\c!offset=\v!overlay,#2]
+ {$\mframedstyle#3$}%
+ \else
+ \inframed
+ [#2]
+ {$\mframedstyle#3$}%
+ \fi
+ \endgroup}
+
+\def\mframed
+ {\dodoubleempty\domframed[\donetrue]}
+
+\def\inmframed
+ {\dodoubleempty\domframed[\donefalse]}
+
+%D So instead of the rather versatile \type {\framed}, we ue
+%D the \type {\mframed}.
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y^{z_z}
+%D x \times \inmframed{y} \times y^{z_z}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D However, we got into troubles when we want to nest sub- and
+%D superscripts, like in
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y^{\mframed{z}_{\mframed{z}}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D Therefore, we can best use \type {\super} and \type {\suber}
+%D instead of \type {^} and \type {_}. Both commands take care
+%D of proper font switching.
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y\super{\mframed{z}\suber{\mframed{z}}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D As usual, one can specify in what way the text should be
+%D framed. One should be aware of the fact that, inorder to
+%D preserve the proper spacing, the \type {offset} is set to
+%D \type {overlay} and \type {frameoffset} is used used
+%D instead.
+%D
+%D \startbuffer
+%D \startformula
+%D x \times y\super{\mframed[framecolor=red]{z}\suber{z}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D For inline use, we also provide the \type {\inmframed}
+%D alternative: we want $x \times \inmframed{y}$ in inline
+%D math, right?
+
+%D This previous framing macros needs a lot of alternatives for
+%D putting rules around boxes, inserting offsets and aligning
+%D text. Each step is handled by separate macros.
+
+\def\dowidenframebox#1%
+ {\setbox\framebox\vbox
+ {\kern#1\hbox{\kern#1\box\framebox\kern#1}\kern#1}}
+
+\def\dooffsetframebox{\dowidenframebox\localoffset}
+\def\dolocateframebox{\dowidenframebox\ruledlinewidth}
+
+%D Let's hope that the next few examples show us enough of
+%D what needs to be done by the auxiliary macros.
+%D
+%D \startbuffer
+%D \framed[height=1cm,offset=.5cm] {rule based learning}
+%D \framed[height=1cm,offset=0cm] {rule based learning}
+%D \framed[height=1cm,offset=none] {rule based learning}
+%D \framed[height=1cm,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[offset=.5cm] {rule based learning}
+%D \framed[offset=0cm] {rule based learning}
+%D \framed[offset=none] {rule based learning}
+%D \framed[offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[strut=nee,offset=.5cm] {rule based learning}
+%D \framed[strut=nee,offset=0cm] {rule based learning}
+%D \framed[strut=nee,offset=none] {rule based learning}
+%D \framed[strut=nee,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[width=3cm,align=left] {rule\\based\\learning}
+%D \framed[width=3cm,align=middle] {rule\\based\\learning}
+%D \framed[width=3cm,align=right] {rule\\based\\learning}
+%D \framed[width=fit,align=middle] {rule\\based\\learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\dontcomplain\getbuffer}
+%D \stoplinecorrection
+%D
+%D So now we're ready for the complicated stuff. We distinguish
+%D between borders with straight lines and those with round
+%D corners. When using the first alternative it is possible to
+%D turn off one or more lines. More fancy shapes are also
+%D possible by specifying dedicated backgrounds. Turning lines
+%D on and off is implemented as efficient as possible and as a
+%D result is interface language dependant. This next
+%D implementation evolved from simpler ones. It puts for
+%D instance the rules on top of the content and provides
+%D additional offset capabilities. The lot of calls to other
+%D macros makes this mechanism not that easy to comprehend.
+
+%D Getting the backgrounds right takes less code. Again we
+%D have to take care of additional offsets.
+
+\def\dobackedbox
+ {\doifelsevalue{\@@framed\c!backgroundoffset}\v!frame % new
+ {\dobackgroundbox\c!frameoffset}
+ {\dobackgroundbox\c!backgroundoffset}}
+
+%D We handle left, right or middle alignment as well as fixed
+%D or free widths and heights. Each combination gets its own
+%D macro.
+
+%D The following code handles one-liners: \type{align={line,flushright}}.
+%D Beware, since we entered a group and either or not grab the next
+%D bgroup token, we need to finish the group in the oneliner mode.
+
+\ifx\raggedoneliner\undefined \chardef\raggedoneliner\zerocount \fi
+
+\def\doformatonelinerbox % beware: assumes explicit preceding bgroup
+ {\ifcase\raggedoneliner
+ \expandafter\nodoformatonelinerbox
+ \else
+ \expandafter\dodoformatonelinerbox
+ \fi}
+
+\def\dodoformatonelinerbox
+ {\dowithnextboxcontent
+ {\ignorespaces}
+ {\hbox to \hsize
+ {\ifcase\raggedstatus\or\hss\or\hss\fi
+ \unhbox\nextbox \removeunwantedspaces
+ \ifcase\raggedstatus\or \or\hss\or\hss\fi}%
+ \egroup}
+ \hbox}
+
+\def\nodoformatonelinerbox % grabs {
+ {\let\next=}
+
+%D The handlers:
+
+\def\doformatboxSomeFormat
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \forgetall
+ \oninterlineskip
+ \hsize\!!framedwidth
+ \vsize\!!framedheight
+ \doframedsetups
+ \raggedcommand
+ \dobeforeframedbox
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\doafterframedbox
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxNoFormat
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \forgetall
+ \oninterlineskip
+ \hsize\!!framedwidth
+ \vsize\!!framedheight
+ \doframedsetups
+ \raggedcenter
+ \vss
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxHeight
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \forgetall
+ \oninterlineskip
+ \doframedsetups
+ \raggedcommand
+ \vss
+ \bgroup
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \localbegstrut
+ \doformatonelinerbox}
+
+\def\doformatboxWidth
+ {\vbox
+ \bgroup
+ \let\postprocessframebox\relax
+ \forgetall
+ \oninterlineskip
+ \hsize\!!framedwidth
+ \doframedsetups
+ \raggedcommand
+ \dobeforeframedbox
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\doafterframedbox
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxVSize
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \forgetall
+ \vsize\!!framedheight
+ \doframedsetups
+ \vss
+ \bgroup
+ \aftergroup\vss
+ \aftergroup\egroup
+ \hbox
+ \bgroup
+ \aftergroup\egroup
+ \localstrut
+ \doformatonelinerbox}
+
+\def\doformatboxHSize
+ {\hbox to \!!framedwidth
+ \bgroup
+ \let\postprocessframebox\relax
+ \forgetall
+ \doframedsetups
+ \hss
+ \localstrut
+ \bgroup
+ \aftergroup\hss
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxNoSize
+ {\hbox
+ \bgroup
+ \let\postprocessframebox\relax
+ \doframedsetups
+ \localstrut
+ \doformatonelinerbox}
+
+\let\doframedsetups\relax
+
+%D On the next page we show some examples of how these macros
+%D come into action. The examples show us how
+%D \type {fit}, \type {broad} dimensions influence the
+%D formatting. Watch the visualized struts. \footnote {Here we
+%D used \type {\showstruts}.}
+%D
+%D \startpostponing
+%D \bgroup
+%D \showstruts
+%D \dontcomplain
+%D \startlinecorrection
+%D \halign{#\enskip&#\enskip&#\enskip&#\enskip&#\enskip&#\cr
+%D \framed[width=.2\hsize, height=.2\hsize, align=] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=yes] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=yes] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=yes] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=yes] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=yes] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=yes] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=right] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=right] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=right] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=right] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=right] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=right] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=left] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=left] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=left] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=left] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=left] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=left] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=middle] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=middle] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=middle] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=middle] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=middle] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=middle] {a\par b\par c}\cr}
+%D \stoplinecorrection
+%D \blank[2*big]
+%D \egroup
+%D \stoppostponing
+
+%D \macros
+%D {framednoflines, framedlastlength}
+%D
+%D It is possible to let the frame macro calculate the width
+%D of a centered box automatically (\type {fit}). When
+%D doing so, we need to reshape the box:
+
+% The next implementation is frozen! It preserves the depth,
+% otherwise we get problems with framed display math and auto
+% width.
+
+\newcount\framednoflines
+\newdimen\framedlastlength
+
+\def\resetshapeframebox
+ {\framednoflines \zerocount
+ \framedlastlength\zeropoint}
+
+\chardef\reshapeframeboxmethod\plusone % 0=no flush, 1=old method 2=no depth messing
+
+\def\shapeboxstrut % put this in front if needed !
+ {\vrule\!!width\zeropoint\!!height\ht\shapebox\!!depth\dp\shapebox}
+
+\let\framedboxwidth \!!zeropoint
+\let\framedboxheight\!!zeropoint
+\let\framedboxdepth \!!zeropoint
+
+\def\doreshapeframedbox % frozen, that is ... \shapeboxstrut added
+ {\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
+ \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}
+
+%D The two variables \type {\framednoflines} and \type
+%D {\framedlastlength} can be used in a second pass to
+%D optimized framed material.
+
+% torture test / strange case (much depth) / method 2 needed
+%
+% \startTEXpage[frame=on]
+% \startformula \startalign \NC A \NC B \NR \intertext{test} \NC C \NC D \NR \stopalign \stopformula
+% test outside formula
+% \startformula \startalign \NC A \NC B \NR \intertext{test} \NC C \NC D \NR \stopalign \stopformula
+% \blank[big]
+% \startformula \startalign \NC \int_01 \NC B \NR \intertext{test} \NC \int_01 \NC D \NR \stopalign \stopformula
+% test outside formula
+% \startformula \startalign \NC \int_01 \NC B \NR \intertext{test} \NC \int_01 \NC D \NR \stopalign \stopformula
+% \stopTEXpage
+
+%D The examples on the next page show how one can give the
+%D frame as well as the background an additional offset and
+%D even a bit more depth. The blue outline is the frame, the
+%D red box is the background and the small black outline is the
+%D visualization of the resulting box, that is, we applied
+%D \type{\ruledhbox} to the result.
+
+%D \startpostponing
+%D \bgroup
+%D \unprotect
+%D \dontcomplain
+%D
+%D \startbuffer
+%D \vbox to \vsize
+%D \bgroup
+%D \startalignment[middle]
+%D \vss
+%D \dontleavehmode\vbox to .8\vsize
+%D \bgroup
+%D \hsize=300pt
+%D \setupframed
+%D [background=color,
+%D backgroundcolorachtergrondkleur=darkred,
+%D width=300pt,
+%D height=60pt,
+%D framecolorkaderkleur=DemoBlue,
+%D rulethickness=2pt]
+%D \def\status%
+%D {backgroundoffset=\framedparameter\c!backgroundoffset\\
+%D frameoffset=\framedparameter\c!frameoffset\\
+%D depth=\framedparameter\c!depth}
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=0pt,frameoffset=0pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=0pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=0pt,frameoffset=5pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=2pt,frameoffset=5pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=2pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=5pt]{\status}}
+%D \egroup
+%D \vss
+%D \stopalignment
+%D \egroup
+%D \stopbuffer
+%D
+%D \getbuffer \page
+%D
+%D {\setupframed[depth=4pt]\getbuffer} \page
+%D
+%D \protect
+%D \egroup
+%D \stoppostponing
+
+%D When typesetting the framed box inline, we have to keep the
+%D baseline intact outside as well as inside the framed box.
+
+\def\doinlineframedbox
+ {\scratchdimen\dimexpr\strutdp+\ruledlinewidth\relax
+ \ifboxhasoffset
+ \advance\scratchdimen \framedparameter\c!offset
+ \fi
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\strutht
+ \dp\framebox\strutdp
+ \box\framebox}
+
+%D We can also lower the box over the natural depth of the
+%D line.
+
+\def\doloweredframedbox
+ {\ht\framebox\dimexpr\ht\framebox+\dp\framebox-\strutdp\relax
+ \dp\framebox\strutdp
+ \box\framebox}
+
+%D Hanging the content is mainly meant for cases like the
+%D following:
+%D
+%D \starttyping
+%D \framed[strut=no]
+%D {\framed[height=2cm,location=hanging]{test}%
+%D \framed[height=1cm,location=hanging]{test}}
+%D \stoptyping
+
+\def\dohangingframedbox % best with strut=no
+ {\scratchdimen\dimexpr\ht\framebox+\dp\framebox\relax
+ \ht\framebox\zeropoint
+ \dp\framebox\scratchdimen}
+
+%D We can draw lines from left to right and top to bottom by
+%D using the normal \type{\hairline} command. Both directions
+%D need a different treatment.
+%D
+%D \startbuffer
+%D \framed[width=4cm] {alfa\hairline beta\hairline gamma}
+%D \framed[height=2cm] {alfa\hairline beta\hairline gamma}
+%D \framed[width=4cm,height=2cm]{alfa\hairline beta\hairline gamma}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D These macros try to adapt their behaviour as good as
+%D possible to the circumstances and act as natural as
+%D possible.
+
+\def\vboxedhairline
+ {\bgroup
+ \dimen2=\ifboxhasoffset \localoffset \else \zeropoint \fi
+ \dimen4=\dimexpr\dimen2+\ruledlinewidth\relax
+ \setbox0\vbox
+ {\advance\hsize 2\dimen4
+ \vskip\dimen2
+ \hrule
+ \!!height\ruledlinewidth
+ \!!depth\zeropoint
+ \!!width\hsize
+ \vskip\dimen2}%
+ %\endgraf\nointerlineskip\endgraf
+ %\moveleft\dimen4\box0
+ %\endgraf\nointerlineskip\localbegstrut
+ \endgraf\obeydepth\nointerlineskip
+ \moveleft\dimen4\box0
+ \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
+ \dimen2=\ifboxhasoffset \localoffset \else \zeropoint \fi
+ \ifboxhasheight
+ \dimen4\dimexpr\localheight/2+\strutdp-2\ruledlinewidth\relax
+ \dimen6\dimexpr\localheight/2-\strutdp+2\ruledlinewidth\relax
+ \else
+ \dimen4\dimexpr\strutht+\dimen2\relax
+ \dimen6\dimexpr\strutdp+\dimen2\relax
+ \fi
+ \unskip
+ \setbox\scratchbox\hbox
+ {\hskip\dimen2
+ \vrule\!!height\dimen4\!!depth\dimen6\!!width\ruledlinewidth
+ \hskip\dimen2}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \box\scratchbox
+ \ignorespaces
+ \egroup}
+
+%D The argument of the frame command accepts \type{\\} as a
+%D sort of newline signal. In horizontal boxes it expands to a
+%D space.
+
+\def\vboxednewline
+ {\endgraf\ignorespaces}
+
+\def\hboxednewline
+ {\unskip\normalspace\ignorespaces}
+
+%D We can set each rule on or off. The default setting is
+%D inherited from \type{frame}. An earlier implementation
+%D use a bit different approach, but the new one seems more
+%D natural:
+%D
+%D \bgroup
+%D \setuptyping[margin=0pt]
+%D \startlinecorrection
+%D \startbuffer
+%D \framed[offset=overlay,frame=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=on,bottomframe=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=on,bottomframe=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off,bottomframe=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off,bottomframe=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D \stoplinecorrection
+%D \egroup
+
+%D \macros
+%D {setupblackrules}
+%D
+%D The graphic capabilities of \TEX\ do not go beyond simple
+%D filled rules, except of course when using specials. Let's
+%D start with a warning: using this commands is far more slower
+%D than using the \TEX\ primitives \type{\hrule} and
+%D \type{\vrule}, but they save us some tokens. The
+%D characteristics of these rule drawing command can be set by:
+%D
+%D \showsetup{setupblackrules}
+
+\def\setupblackrules
+ {\dodoubleargument\getparameters[\??bj]}
+
+%D \macros
+%D {blackrule}
+%D
+%D The simple command draws only one rule. Its optional
+%D argument can be used to specify the dimensions. By setting
+%D the width, height or depth to \type {max}, one gets the
+%D natural dimensions.
+%D
+%D \showsetup{blackrule}
+
+\def\doblackrule[#1]%
+ {\hbox\bgroup
+ \getparameters[\??bj][#1]%
+ \setstrut
+ \doif\@@bjwidth \v!max{\def\@@bjwidth {1em}}%
+ \doif\@@bjheight\v!max{\def\@@bjheight{\strutht}}%
+ \doif\@@bjdepth \v!max{\def\@@bjdepth {\strutdp}}%
+ \localstartcolor[\@@bjcolor]%
+ \vrule
+ \!!width \@@bjwidth
+ \!!height\@@bjheight
+ \!!depth \@@bjdepth
+ \localstopcolor
+ \egroup}
+
+\unexpanded\def\blackrule
+ {\dosingleempty\doblackrule}
+
+%D \macros
+%D {blackrules}
+%D
+%D One can call for a sequence of black rules, if needed
+%D equally spaced over the given width.
+%D
+%D \showsetup{blackrules}
+%D
+%D The two alternative calls are therefore:
+%D
+%D \startbuffer
+%D Tell me, is this according to the \blackrules[n=6]?
+%D These \blackrules[alternativevariant=b,n=10,distance=.2em,width=4cm] are quite clear.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D We could of course have implemented this macro using
+%D \type{\leaders}, but this would probably have taken more
+%D tokens.
+
+\def\doblackrules[#1]%
+ {\hbox\bgroup
+ \getparameters[\??bj][#1]%
+ \!!widtha\@@bjwidth
+ \!!widthb\@@bjdistance
+ \doif\@@bjalternative\c!b
+ {\scratchcounter\@@bjn
+ \ifnum\scratchcounter=\plusone
+ \!!widthb\zeropoint
+ \else
+ \advance\scratchcounter \minusone
+ \advance\!!widtha -\scratchcounter\!!widthb
+ \divide \!!widtha \@@bjn
+ \fi}%
+ \localstartcolor[\@@bjcolor]%
+ \dorecurse\@@bjn
+ {\vrule
+ \!!width \!!widtha
+ \!!height\@@bjheight
+ \!!depth \@@bjdepth
+ \hskip\!!widthb}%
+ \unskip
+ \localstopcolor
+ \egroup}
+
+\unexpanded\def\blackrules
+ {\dosingleempty\doblackrules}
+
+%D The next commands can be used to draw margin rules. We
+%D support two methods: \marginrule{one for in||line use} and
+%D one that acts on a paragraph. Drawing a margin rule is
+%D rather straightforward because we can use the commands that
+%D put text in the margin.
+
+\def\dodrawmarginrule
+ {\setbox\scratchbox\hbox
+ {\vrule\!!depth\strutdepth\!!height\strutheight\!!width\@@karulethickness}%
+ \smashbox\scratchbox % no \vsmash !!!
+ \box\scratchbox}
+
+\def\drawmarginrule
+ {\strut\inleft{\dodrawmarginrule}}
+
+%D \macros
+%D {marginrule}
+%D
+%D The first method gobbles words and simply puts a bar in the
+%D margin. This method is not entirely robust.
+%D
+%D \showsetup{marginrule}
+
+\definecomplexorsimple\marginrule
+
+\def\simplemarginrule
+ {\let\processword\drawmarginrule
+ \processwords}
+
+\def\complexmarginrule[#1]%
+ {\ifnum#1<\@@kalevel\relax \else
+ \def\@@kadefaultwidth{#1}%
+ \expandafter\simplemarginrule
+ \fi}
+
+%D We need an auxiliary variable
+
+\def\@@kadefaultwidth{1}
+
+%D \macros
+%D {setupmarginrules}
+%D
+%D This macro definitions show us that we can pass an optional
+%D level, which is matched against the previous set one. The
+%D level can be set up with
+%D
+%D \showsetup{setupmarginrules}
+
+\def\setupmarginrules
+ {\dodoubleargument\getparameters[\??ka]}
+
+%D \macros
+%D {startmarginrule}
+%D
+%D The second method collects text and reformats it afterwards,
+%D using the shapebox macros. We prevent local margin rules.
+%D
+%D \showsetup{startmarginrule}
+
+\definecomplexorsimple\startmarginrule
+
+\def\simplestartmarginrule
+ {\bgroup
+ \let\drawmarginrule\relax
+ \let\stopmarginrule\dostopmarginrule
+ \beginofshapebox}
+
+\def\complexstartmarginrule[#1]%
+ {\bgroup
+ \let\drawmarginrule\relax
+ \ifnum#1<\@@kalevel\relax
+ \let\stopmarginrule\egroup
+ \else
+ \def\@@kadefaultwidth{#1}%
+ \let\stopmarginrule\dostopmarginrule
+ \expandafter\beginofshapebox
+ \fi}
+
+\def\dostopmarginrule
+ {\endofshapebox
+ \reshapebox
+ {\hbox{\inleftmargin{\dodrawmarginrule}\box\shapebox}}%
+ \flushshapebox
+ \egroup}
+
+%D \startbuffer
+%D \setupmarginrules[level=5]
+%D
+%D \startmarginrule[1]
+%D First we set the level at~5. Next we typeset this first
+%D paragraph as a level~1 one. As expected no rule show up.
+%D \stopmarginrule
+%D
+%D \startmarginrule[5]
+%D The second paragraph is a level~5 one. As we can see here,
+%D the marginal rule gets a width according to its level.
+%D \stopmarginrule
+%D
+%D \startmarginrule[8]
+%D It will of course be no surprise that this third paragraph
+%D has a even thicker margin rule. This behavior can be
+%D overruled by specifying the width explictly.
+%D \stopmarginrule
+%D \stopbuffer
+%D
+%D In next example we show most features. Watch the rule
+%D thickness adapting itself to the level.
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D We just said:
+%D
+%D \typebuffer
+
+%D \macros
+%D {vl, hl}
+%D
+%D The command \type{\vl} draws a vertical rule \vl\ with strut
+%D dimensions, multiplied with the factor specified in the
+%D optional argument. The height and depth are clipped \vl[3]
+%D to the baselinedistance. Its horizontal counterpart
+%D \type{\hl} draws a horizontal rule \hl\ with a width of 1em,
+%D multiplied with the optional factor. The horizontal rule is
+%D drawn on top of the baseline.
+%D
+%D \showsetup{vl}
+%D \showsetup{hl}
+
+\def\complexvl[#1]%
+ {\bgroup
+ \!!dimena#1\strutht
+ \!!dimenb#1\strutdp
+ \setbox\scratchbox\hbox
+ {\vrule
+ \!!width \linewidth
+ \!!height\!!dimena
+ \!!depth \!!dimenb}%
+ \dp\scratchbox\strutdp
+ \ht\scratchbox\strutht
+ \box\scratchbox
+ \egroup}
+
+\def\complexhl[#1]%
+ {\hbox
+ {\vrule
+ \!!width #1\s!em
+ \!!height\linewidth
+ \!!depth \zeropoint}}
+
+\definecomplexorsimple\vl \def\simplevl{\complexvl[1]}
+\definecomplexorsimple\hl \def\simplehl{\complexhl[1]}
+
+%D \macros
+%D {hairline, thinrule, thinrules, setupthinrules}
+%D
+%D Drawing thin lines can of course easily be accomplished by
+%D the \TEX\ primitives \type{\hrule} and \type{\vrule}. The
+%D next few macros however free us from some specifications.
+%D
+%D \startbuffer
+%D some text
+%D
+%D \hairline
+%D
+%D some more text
+%D
+%D \thinrule
+%D
+%D more and more text
+%D
+%D hi \thinrule\ there
+%D
+%D and then the final text
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D becomes
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D So we've got
+%D
+%D \showsetup{hairline}
+%D \showsetup{thinrule}
+%D
+%D Both can be set up with:
+%D
+%D \showsetup{setupthinrules}
+%D
+%D We also have
+%D
+%D \showsetup{thinrules}
+%D
+%D which looks like: \thinrules[n=2]
+
+\def\thinrule
+ {\strut
+ \bgroup
+ \chardef\ruletype\plusone
+ \processaction
+ [\@@dlalternative]
+ [ \v!a=>\chardef\ruletype0,% no line
+ %\v!b=>\chardef\ruletype1,% height/depth
+ \v!c=>\chardef\ruletype2,% topheight/botdepth
+ % 11=>\chardef\ruletype1,% fallback for backgrounds
+ 0=>\chardef\ruletype0,% compatible with backgrounds
+ % 1=>\chardef\ruletype1,% compatible with backgrounds
+ 2=>\chardef\ruletype2]% compatible with backgrounds
+ \doifsomething\@@dlrulethickness
+ {\linewidth\@@dlrulethickness}%
+ \ifdim\linewidth=\zeropoint
+ \chardef\ruletype\zerocount
+ \else
+ \doifnot\@@dlframe\v!on{\chardef\ruletype\zerocount}%
+ \fi
+ \ifnum\ruletype=\plusone
+ \doif\@@dlheight\v!max{\let\@@dlheight\!!plusone}%
+ \doif\@@dldepth \v!max{\let\@@dldepth \!!plusone}%
+ \else
+ \let\@@dlheight\!!plusone
+ \let\@@dldepth\!!plusone
+ \fi
+ \freezedimensionwithunit\@@dlheight\strutht
+ \freezedimensionwithunit\@@dldepth\strutdp
+ \divide\linewidth \plustwo
+ \doifelse\@@dlbackground\v!color
+ {\startcolor[\@@dlbackgroundcolor]%
+ \ifnum\ruletype=\plustwo % prevent overshoot due to rounding
+ \leaders
+ \hrule
+ \!!height\dimexpr\@@dlheight-.5\linewidth\relax
+ \!!depth \dimexpr\@@dldepth -.5\linewidth\relax
+ \hfill
+ \else
+ \leaders
+ \hrule
+ \!!height\@@dlheight
+ \!!depth \@@dldepth
+ \hfill
+ \fi
+ \stopcolor
+ \ifcase\ruletype
+ % no rule
+ \or
+ \startcolor[\@@dlcolor]%
+ \hfillneg
+ \leaders\hrule\!!height\linewidth\!!depth\linewidth\hfill
+ \stopcolor
+ \or
+ \startcolor[\@@dlcolor]%
+ \hfillneg\leaders\hrule\!!height\dimexpr-\@@dldepth+\linewidth\relax\!!depth\@@dldepth\hfill
+ \hfillneg\leaders\hrule\!!height\@@dlheight\!!depth\dimexpr-\@@dlheight+\linewidth\relax\hfill
+ \stopcolor
+ \fi}
+ {\ifcase\ruletype \else
+ \startcolor[\@@dlcolor]%
+ \leaders\hrule\!!height\@@dlheight\!!depth\@@dldepth\hfill
+ \stopcolor
+ \fi}%
+ \strut
+ \carryoverpar\egroup}
+
+\def\hairline
+ {\endgraf
+ \thinrule
+ \endgraf}
+
+\def\dosetupthinrules[#1]%
+ {\getparameters[\??dl][#1]}
+
+\def\setupthinrules
+ {\dosingleargument\dosetupthinrules}
+
+\def\dothinrules[#1]%
+ {\bgroup
+ \dosetupthinrules[#1]%
+ \@@dlbefore
+ \assignvalue\@@dlinterlinespace\@@dlinterlinespace{1.0}{1.5}{2.0}%
+ \spacing\@@dlinterlinespace
+ \dorecurse\@@dln
+ {\ifnum\recurselevel=\@@dln \dothinrulesnobreak \else
+ \ifnum\recurselevel=2 \dothinrulesnobreak \fi\fi
+ \thinrule
+ \ifnum\recurselevel<\@@dln\relax
+ % test needed, else messed up whitespace
+ \ifx\@@dlinbetween\empty
+ \softbreak
+ \else
+ \endgraf
+ \nowhitespace
+ \@@dlinbetween
+ \fi
+ \fi}%
+ \doifelsenothing\@@dlafter
+ {\carryoverpar\egroup}
+ {\@@dlafter\egroup}}
+
+\def\thinrules
+ {\dosingleempty\dothinrules}
+
+%D A couple of examples are given below.
+%D
+%D \startbuffer
+%D \setupthinrules[n=3,inbetween=,color=gray]
+%D
+%D test test \thinrules\ test test \par
+%D test test \thinrules [color=green] test test \par
+%D test test \thinrules [height=max, depth=max] test test \par
+%D
+%D \setupthinrules[height=.9,depth=.9]
+%D
+%D test test \thinrules\ test test \par
+%D test test \thinrules [alternativevariant=b] test test \par
+%D test test \thinrules [alternativevariant=c] test test \par
+%D test test \thinrules [alternativevariant=c,inbetween=\vskip2ex] test test \par
+%D \stopbuffer
+%D
+%D \typebuffer {\getbuffer}
+%D
+%D There are a couple of alternative ways to visualize rules
+%D using backgrounds. At first sight these may look strange,
+%D but they make sense in educational settings. The
+%D alternatives are more or less compatible with the more
+%D advanced \METAPOST\ based implementation.
+%D
+%D \startbuffer[a]
+%D \setupthinrules
+%D [n=2,
+%D backgroundcolor=gray ,
+%D rulethickness=1pt,
+%D colorkleur=donkerblauw,
+%D after=\blank,
+%D before=\blank]
+%D \stopbuffer
+%D
+%D \typebuffer[a]
+%D
+%D \startbuffer[b]
+%D \thinrules[alternativevariant=a]
+%D \thinrules[alternativevariant=b]
+%D \thinrules[alternativevariant=c]
+%D \stopbuffer
+%D
+%D \typebuffer[b] \getbuffer[a,b]
+%D
+%D \startbuffer[b]
+%D \thinrules[alternativevariant=a,background=color]
+%D \thinrules[alternativevariant=b,background=color]
+%D \thinrules[alternativevariant=c,background=color]
+%D \stopbuffer
+%D
+%D \typebuffer[b] \getbuffer[a,b]
+%D
+%D \startbuffer[b]
+%D \thinrules[alternativevariant=a,height=.8,depth=.8,background=color]
+%D \thinrules[alternativevariant=b,height=.8,depth=.8,background=color]
+%D \thinrules[alternativevariant=c,height=.8,depth=.8,background=color]
+%D \stopbuffer
+%D
+%D \typebuffer[b] \getbuffer[a,b]
+
+%D \macros
+%D {optimizethinrules}
+%D
+%D By saying \type {\thinrulestrue} or \type {-false}, we
+%D can influence the way dangling lines are handled.
+
+\newif\ifoptimizethinrules \optimizethinrulestrue
+
+\def\dothinrulesnobreak
+ {\ifoptimizethinrules\penalty500\fi}
+
+%D \macros
+%D {startframedtext, setupframedtexts, defineframedtext}
+%D
+%D The general framing command we discussed previously, is not
+%D entirely suited for what we call framed texts, as for
+%D instance used in intermezzo's. The next examples show what
+%D we have in mind.
+%D
+%D \startbuffer[framed-0]
+%D \setupframedtexts
+%D [frame=off,
+%D width=\hsize,
+%D background=screen]
+%D
+%D \startframedtext
+%D By default the framed text is centered \dots
+%D \stopframedtext
+%D
+%D \startframedtext[right]
+%D \dots\ but we can also align left, middle and right.
+%D \stopframedtext
+%D \stopbuffer
+%D
+%D \startbuffer[framed-1]
+%D \defineframedtext
+%D [Example]
+%D [width=6cm,
+%D height=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-1]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-2]
+%D \defineframedtext
+%D [Example]
+%D [width=6cm]
+%D
+%D \startExample
+%D \typebuffer[framed-2]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-3]
+%D \defineframedtext
+%D [Example]
+%D [height=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-3]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-4]
+%D \defineframedtext
+%D [Example]
+%D [width=fit,height=broad]
+%D
+%D \Example{a very exciting example}
+%D \stopbuffer
+%D
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-0] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-1] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-2] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-3] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-4] \egroup
+%D
+%D Here we can see that we have a predefined framed text class
+%D as well as the tools for defining our own. So we have:
+%D
+%D \showsetup{setupframedtexts}
+%D
+%D as well as the definition command:
+%D
+%D \showsetup{defineframedtext}
+%D
+%D that generates two commands:
+%D
+%D \showsetup{start<<framedtext>>}
+%D \showsetup{<<framedtext>>}
+%D
+%D The next definition shows the defaults.
+
+\def\dodefineframedtext[#1][#2]%
+ {\presetlocalframed[\??kd#1]%
+ \getparameters[\??kd#1]
+ [\c!width=0.75\hsize,
+ \c!height=\v!fit,
+ \c!align=\v!yes,
+ \c!top=,
+ \c!bottom=\vfill,
+ \c!offset=1em,
+ \c!bodyfont=,
+ \c!style=,
+ \c!color=,
+ \c!left=,
+ \c!right=\hfill,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!inner=,
+ \c!frame=\v!on,
+ \c!topframe=,
+ \c!bottomframe=,
+ \c!leftframe=,
+ \c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!foregroundcolor=,
+ \c!foregroundstyle=,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!linecorrection=\v!on,
+ \c!depthcorrection=\v!on,
+ \c!margin=\v!standard,
+ \c!orientation=,
+ \c!indenting=,
+ #2]%
+ \setvalue{\e!start#1}{\dostartframedtext[#1]}%
+ \setvalue{\e!stop #1}{\dostopframedtext }%
+ \setvalue {#1}{\doframedtext [#1]}}
+
+\def\defineframedtext
+ {\dodoubleempty\dodefineframedtext}
+
+%D We define the general (and original) case by just saying:
+
+\defineframedtext[\v!framedtext]
+
+%D We need several steps before the actual job is done,
+%D because we have to handle an optional identifier (and
+%D because these commands evolved out of a single case).
+
+\def\framedtextparameter#1#2%
+ {\csname\??kd#1#2\endcsname}
+
+\def\dosetupframedtexts[#1][#2]%
+ {\ifsecondargument
+ \def\docommand##1{\getparameters[\??kd##1][#2]}%
+ \processcommacommand[#1]\docommand % new, #1 may be macro
+ \else
+ \getparameters[\??kd\v!framedtext][#1]%
+ \fi}
+
+\def\setupframedtexts
+ {\dodoubleempty\dosetupframedtexts}
+
+\def\dostartframedtext
+ {\bgroup\dotripleempty\dodostartframedtext}
+
+\def\dodostartframedtext[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\dododostartframedtext[#1][][#2]}
+ {\dododostartframedtext[#1][#2][#3]}}
+
+\setfalse\framedtextlocationnone
+
+\def\checkframedtext % messy dependency
+ {\ifinsidefloat
+ \localhsize\hsize
+ \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
+ % \strut % rather clean way to invoke the sidefloat OTR
+ % \setbox0=\lastbox % and get the widths set, so from now on we
+ % \setlocalhsize % can have framed texts alongside sidefloats
+ \checksidefloat
+ \setlocalhsize
+ \else
+ \localhsize\hsize
+ \fi\fi}
+
+\def\dododostartframedtext[#1][#2][#3]% #3 only passed to framed, not to framedtext
+ {\doifsomething{#2}{\setvalue{\??kd#1\c!location}{#2}}% does not listen to #3
+ \setfalse\framedtextlocationnone
+ \processaction % \v!low en \v!depth are already taken !
+ [\framedtextparameter{#1}\c!location]
+ [ \v!left=>\letvalue{\??kd#1\c!left }\relax
+ \letvalue{\??kd#1\c!right}\hfill,
+ \v!right=>\letvalue{\??kd#1\c!left }\hfill
+ \letvalue{\??kd#1\c!right}\relax,
+ \v!middle=>\letvalue{\??kd#1\c!left }\hfill
+ \letvalue{\??kd#1\c!right}\hfill,
+ \v!none=>\letvalue{\??kd#1\c!left }\relax % new
+ \letvalue{\??kd#1\c!right}\relax % new
+ \settrue\framedtextlocationnone]%
+ \letvalue{\??kd#1\c!location}\empty
+ % removed 06/2001
+ % \forgetparindent
+ % added 06/2001 [see demo-bbv]
+ \localhsize\hsize \checkframedtext
+ % so far
+ \setbox\framebox\vbox
+ \startboxedcontent
+ \hsize\localhsize
+ % \insidefloattrue % ? better
+ \expanded{\switchtobodyfont[\framedtextparameter{#1}\c!bodyfont]}%
+ \startcolor[\framedtextparameter{#1}\c!color]%
+ \localframed[\??kd#1][\c!strut=\v!no,#3]% todo: use delayedstrut
+ \bgroup
+ \let\\=\endgraf
+ \framedtextparameter{#1}\c!inner % oud spul
+ \doifvalue{\??kd#1\c!depthcorrection}\v!on % new, inside box
+ {\bgroup
+ \verticalstrut
+ % we need \nowhitespace in case of setups setting whitespace
+ % nb, not safe, text vs \vbox as next
+ \vskip-\struttotal
+ \nowhitespace % na vskip ! new 20/05/2004, fails with next content being box (\scale{..})
+ }%
+ \doinhibitblank % \blank[\v!disable]% plaatst signal
+\setupindenting[\framedtextparameter{#1}\c!indenting]%
+ \doconvertfont{\framedtextparameter{#1}\c!style}\empty
+ \def\dostopframedtext{\dodostopframedtext{#1}{#2}}}
+
+%D The \type {none} option is handy for nested usage, as
+%D in the presentation styles, where we don't want
+%D interference.
+
+\def\dodostopframedtext#1#2% % no \baselinecorrection, see faq docs
+ {\endgraf
+ \removelastskip
+ \doifvalue{\??kd#1\c!depthcorrection}\v!on % local and global
+ {\forgetall
+ \vskip-\struttotal
+ \verticalstrut
+ \egroup
+ \forgetall
+ \vskip-\lineheight
+ % will be an option, not default
+ % \setbaselinecorrections
+ % \donegbotbaselinecorrection
+ \verticalstrut}
+ \stopboxedcontent
+ \stopcolor
+ \ifconditional\framedtextlocationnone
+ \egroup
+ \box\framebox
+ \else\ifinsidefloat
+ \egroup
+ \box\framebox
+ \else
+ \egroup
+ \doplacement[\??kd#1][\c!depthcorrection=\v!off]{\box\framebox}%
+ \fi\fi
+ \egroup}
+
+%D Placement can be ignored:
+%D
+%D \starttyping
+%D \hbox to \hsize \bgroup
+%D \startframedtext[none][width=.5\textwidth] \input tufte \stopframedtext
+%D \startframedtext[none][width=.5\textwidth] \input zapf \stopframedtext
+%D \egroup
+%D
+%D \hbox to \hsize \bgroup
+%D \setupframedtexts[location=none]%
+%D \startframedtext[width=.5\textwidth] \input zapf \stopframedtext
+%D \startframedtext[width=.5\textwidth] \input tufte \stopframedtext
+%D \egroup
+%D \stoptyping
+
+%D The simple brace (or group) delimited case is typeset
+%D slightly different and is not aligned.
+
+\def\doframedtext
+ {\bgroup\dodoubleempty\dodoframedtext}
+
+\def\dodoframedtext[#1][#2]% beware!
+ {\expanded{\switchtobodyfont[\getvalue{\??kd#1\c!bodyfont}]}%
+ \localframed[\??kd#1][\c!strut=\v!no,#2]%
+ \bgroup
+ \blank[\v!disable]%
+ \let\\=\endgraf
+ \getvalue{\??kd#1\c!inner}% % kleur naar outer level
+ \dostartattributes{\??kd#1}\c!style\c!color\empty
+ \bgroup
+ \aftergroup\docloseframedtext
+ \let\next=}
+
+\def\docloseframedtext
+ {\removelastskip
+ \dostopattributes
+ \egroup
+ \egroup}
+
+%D \macros
+%D {defineframed}
+%D
+%D One can also define simple framed texts, using:
+%D
+%D \showsetup{defineframed}
+
+\def\defineframed
+ {\dodoubleempty\dodefineframed}
+
+\def\dodefineframed[#1][#2]%
+ {\iffirstargument
+ \setvalue{#1}{\dodoubleempty\doframed[#2]}%
+ \fi}
+
+\def\doframed[#1][#2]%
+ {\framed[#1,#2]}
+
+%D \macros
+%D {textrule, starttextrule, setuptextrules}
+%D
+%D Putting rules before and after a paragraph is very space
+%D sensitive, but the next command handles that quite well. It
+%D comes in two disguises:
+%D
+%D \startbuffer
+%D \textrule[top]{fragments}
+%D \input reich
+%D \textrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \getbuffer \egroup
+%D
+%D \startbuffer
+%D \setuptextrules
+%D [width=90pt,distance=12pt,rulecolor=blue,
+%D bodyfont=small,style=\sc,color=red]
+%D
+%D \starttextrule{Ship Building Tools}
+%D \nl \setuptolerance[tolerant] \input materie
+%D \stoptextrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \getbuffer \egroup
+%D
+%D \startbuffer
+%D \setuptextrules
+%D [location=inmargin,
+%D bodyfont=small,style=slantedbold]
+%D
+%D \starttextrule{wonderful}
+%D \input tufte
+%D \stoptextrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \getbuffer \egroup
+%D
+%D The formal definition of these commands is:
+%D
+%D \showsetup{textrule}
+%D \showsetup{starttextrule}
+%D \showsetup{setuptextrules}
+%D
+%D The implementation looks a bit complicated due to the
+%D optional arguments.
+
+\def\setuptextrules
+ {\dodoubleargument\getparameters[\??tl]}
+
+\def\complextextrule[#1]% if needed we can make it installable
+ {\let\next\dobottomtextrule
+ \processaction
+ [#1]
+ [ \v!top=>\let\next\dotoptextrule,
+ \v!middle=>\let\next\domiddletextrule,
+ \v!bottom=>\let\next\dobottomtextrule]%
+ \dosinglegroupempty\next}
+
+\definecomplexorsimple\textrule
+
+\def\simpletextrule
+ {\dosinglegroupempty\dounknowntextrule}
+
+\def\docomplextextrule#1%
+ {\bgroup
+ \advance\hsize\dimexpr-\rightskip-\leftskip\relax
+ \setbox\scratchbox\hbox to \hsize
+ {\dimen4\dimexpr .5ex+.5\linewidth\relax
+ \dimen6\dimexpr-.5ex+.5\linewidth\relax
+ \doifnothing{#1}\firstargumentfalse
+ \iffirstargument
+ \doifelse\@@tllocation\v!inmargin
+ {\llap{\doattributes\??tl\c!style\c!color{#1}\hskip\leftmargindistance}}
+ {\color[\@@tlrulecolor]
+ {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlwidth}%
+ \hbox spread 2\dimexpr\@@tldistance\relax
+ {\hss\doattributes\??tl\c!style\c!color{\strut#1}\hss}}%
+ \fi
+ \color[\@@tlrulecolor]
+ {\leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \noindent\box\scratchbox
+%\nobreak\verticalstrut\kern-\struttotal
+% evt \witruimte
+ \egroup}
+
+\def\dotoptextrule#1%
+ {\page[\v!preference] % interferes
+ %\whitespace % no
+ \@@tlbefore
+ \docomplextextrule{#1}%
+% todo, option: \doifnothing{#1}{\ruledvskip-.5ex}
+ \nowhitespace
+ \@@tlinbetween
+ \endgraf}
+
+\def\dodobottomtextrule#1#2%
+ {\ifhmode
+ \endgraf
+ \fi
+ \dimen0\strutdp
+ \ifdim\prevdepth>\strutdp\else % was <\strutdp
+ \ifdim\prevdepth>\zeropoint
+ \advance\dimen0 -\prevdepth
+ \fi
+ \fi
+ \advance\dimen0 .5ex
+ \vskip\dimen0
+% ==
+% \vskip\dimexpr \strutdp + .5ex
+% \ifdim\prevdepth>\strutdp\else\ifdim\prevdepth>\zeropoint-\prevdepth\fi\fi\relax
+%
+ \@@tlinbetween
+ \doifelsenothing{#2}
+ {\bgroup
+ \advance\hsize\dimexpr-\rightskip-\leftskip\relax
+ \nointerlineskip
+ \moveleft-\leftskip\vbox
+ {\color[\@@tlrulecolor]
+ {\hrule\!!depth\linewidth\!!height\zeropoint\!!width\hsize}}%
+ \egroup}
+ {\docomplextextrule{#2}}%
+ \ifvmode\prevdepth\zeropoint\fi
+ #1%
+ \page[\v!preference]}
+
+\def\dobottomtextrule
+ {\dodobottomtextrule\@@tlafter}
+
+\def\domiddletextrule
+ {\dodobottomtextrule\@@tlinbetween}
+
+\def\dounknowntextrule
+ {\iffirstargument
+ \@EA\dotoptextrule
+ \else
+ \@EA\dobottomtextrule\@EA\empty
+ \fi}
+
+%D The grouped commands also supports bodyfont switching:
+
+\def\starttextrule#1%
+ {\bgroup
+ \def\dounknowntextrule{\domiddletextrule}
+ \dotoptextrule{#1}
+ \bgroup
+ \doifsomething\@@tlbodyfont{\switchtobodyfont[\@@tlbodyfont]}}
+
+\def\stoptextrule
+ {\par
+ \egroup
+ \dobottomtextrule\empty
+ \egroup}
+
+%D \macros
+%D {fillinrules, setupfillinrules}
+%D
+%D The next few commands do not really deserve a place in a
+%D core module, because they deal with specific typography.
+%D Nevertheless I decided to make them part of the core,
+%D because they permit us to make questionaires. Let's start
+%D with some examples.
+%D
+%D \fillinrules[n=2,width=fit]{first}
+%D \fillinrules[n=2,width=broad]{first}
+%D \fillinrules[n=2,width=3cm]{first}
+%D \fillinrules[n=2,width=3cm,distance=.5em,separator=:]{first}
+%D \fillinrules[n=2]{first}{last}
+%D \fillintext{first}{last} \input reich \par
+%D
+%D The main command is \type{\fillinrules}. This command takes
+%D one and an optional second argument and sets a paragraph with
+%D empty visualized lines.
+%D
+%D \showsetup{fillinrules}
+%D \showsetup{setupfillinrules}
+
+\def\setupfillinrules
+ {\dodoubleargument\getparameters[\??il]}
+
+\definecomplexorsimpleempty\fillinrules
+
+\def\complexfillinrules[#1]%
+ {\def\docomplexfillinrules##1##2%
+ {\dodocomplexfillinrules[#1]{##1}{##2}{\thinrules
+ [\c!n=\@@iln,\c!interlinespace=\@@ilinterlinespace,\c!before=,\c!after=]}}%
+ \dodoublegroupempty\docomplexfillinrules}
+
+\def\dodocomplexfillinrules[#1]#2#3#4%
+ {\endgraf
+ \@@ilbefore
+ \begingroup
+ \setupfillinrules[#1]%
+ \noindent
+ \doifsomething{#2}
+ {\doifelse\@@ilwidth\v!fit
+ {\let\@@ildistance\!!zeropoint
+ \hbox}
+ {\doifelse\@@ilwidth\v!broad
+ {\hbox}
+ {\hbox to \@@ilwidth}}%
+ \bgroup
+ \doattributes\??il\c!style\c!color{\strut#2\hfill\@@ilseparator}%
+ \hskip\@@ildistance
+ \egroup}%
+ %\hangindent=\wd0\relax % tzt hang=yes,n
+ %\parindent=\hangindent
+ %\box0\relax
+ \setupwhitespace[\v!big]%
+ \ignorespaces
+ #4%
+ \doifsomething{#3}
+ {\kern\@@ildistance
+ \doattributes\??il\c!style\c!color{#3\strut}}%
+ \endgroup
+ \endgraf
+ \@@ilafter}
+
+%D \macros
+%D {fillintext}
+%D
+%D To provide compatible layouts when texts and lines are
+%D mixed, one can typeset a paragraph by using the command
+%D \type{\fillintext}.
+%D
+%D \showsetup{fillintext}
+
+\definecomplexorsimpleempty\fillintext
+
+\def\complexfillintext[#1]% rather rough, using an \unhbox is suboptimal
+ {\def\docomplexfillintext##1##2%
+ {\dowithnextbox
+ {\dodocomplexfillinrules[#1]{##1}{\hfill##2}{\unhbox\nextbox\unskip}}%
+ \hbox\bgroup\let\par\egroup\ignorespaces}%
+ \dodoublegroupempty\docomplexfillintext}
+
+%D \macros
+%D {fillinline, setupfillinlines}
+%D
+%D Another member of the family takes care of putting a (often
+%D small) rule after a piece of text, like
+%D
+%D \startbuffer
+%D \fillinline \input reich \par
+%D \fillinline[margin=0cm] \input reich \par
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D which was typeset by saying:
+%D
+%D \typebuffer
+%D
+%D The two commands that take care of this are:
+%D
+%D \showsetup{fillinline}
+%D \showsetup{setupfillinlines}
+
+\def\setupfillinlines
+ {\dodoubleargument\getparameters[\??iv]}
+
+\definecomplexorsimpleempty\fillinline
+
+\def\complexfillinline[#1]%
+ {%\endgraf % interferes with \definedescription cum suis
+ \@@ivbefore
+ \begingroup
+ \setupfillinlines[#1]%
+ \advance\rightskip \@@ivmargin
+ \parfillskip\zeropoint
+ \def\par % very dangerous
+ {\let\par\endgraf % -)
+ \ifhmode\unskip\hfill\fi
+ \scratchdimen\dimexpr\@@ivwidth-\@@ivdistance\relax
+ \ifdim\scratchdimen>\@@ivmargin\else\expandafter\rlap\fi
+ {\kern\@@ivdistance
+ \vrule
+ \!!width \scratchdimen
+ \!!height.5\linewidth
+ \!!depth .5\linewidth}%
+ \endgraf % !
+ \endgroup
+ \endgraf % !
+ \@@ilafter}}
+
+%D \stopdocumentation
+%D \bgroup
+%D
+%D \setupframedtexts
+%D [setuptext]
+%D [background=color,backgroundcolor=white]
+%D
+%D \startbuffer
+%D \setupbackground
+%D [backgroundoffset=4pt,
+%D background=screen,
+%D frame=on,
+%D framecolor=red,
+%D leftoffset=2pt]
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \startbackground
+%D
+%D \macros
+%D {setupbackground,startbackground,background}
+%D
+%D The section deals with backgrounds in the running text. This
+%D means that texts is to be collected and split over pages. To
+%D show what can be done, we provide this part of the
+%D documentation with some gray background and a red frame.
+%D Both the background and frame can have all characteristics
+%D of \type{\framed}. This time we used the setting:
+%D
+%D \typebuffer
+%D
+%D The implementation is not that sophisticated, but suffices.
+%D The main problem with this kind of functionality is to get
+%D the spacing all right.
+
+%D Specifying the background is more or less the same as
+%D specifying a framed box.
+%D
+%D \showsetup{setupbackground}
+
+\presetlocalframed[\??ag]
+
+\def\dosetupbackground[#1]%
+ {\getparameters[\??ag][#1]%
+ \doifelse\@@agstate\v!start
+ {\let\startbackground\dostartbackground
+ \let\stopbackground \dostopbackground
+ \let\background \dobackground}
+ {\let\startbackground\relax
+ \let\stopbackground \relax
+ \let\background \relax}}
+
+\def\setupbackground
+ {\dosingleargument\dosetupbackground}
+
+%D Actually typesetting the background is implemented rather
+%D straightforward. We need to handle some spacing as well as
+%D the (often) a bit smaller horizontal size.
+%D
+%D \showsetup{startbackground}
+%D
+%D Although we could have used a scratch one, we first
+%D declare a boolean.
+
+% 0=no-split, 1=no-split+indent, 2=split, 3=split+indent
+
+\chardef\backgroundsplitmode\plusthree
+
+%D The \type{\vbox to \lineheight{}\vskip\zeropoint}
+%D construction gives the first real line a decent height by
+%D adding a dummy line.
+
+\def\dostartbackground
+ {\endgraf
+ \bgroup
+ \setbox0\vbox\bgroup
+ \vbox to \lineheight{}\vskip\zeropoint
+ \blank[\v!disable]
+ % \advance\hsize -\@@agleftoffset
+ % \advance\hsize -\@@agrightoffset
+ \leftskip \@@agleftoffset % new **
+ \rightskip\@@agrightoffset} % new **
+
+%D This dummy line is removed by \type{\setbox2=\vsplit0 to
+%D \lineheight}. That way \type{\topskip} takes care of the
+%D lineheight. I'll probably forget to apply this trick
+%D elsewhere.
+
+\def\dostopbackground % improved version (i hope)
+ {\endgraf
+ \removelastskip
+ \egroup
+ \dimen2\leftskip % new **
+ \forgetall
+ \ifinsidefloat
+ \chardef\backgroundsplitmode\zerocount
+ \fi
+ \ifcase\backgroundsplitmode
+ \localframed[\??ag][\c!offset=\v!overlay]{\box0}%
+ \or
+ \hskip\dimen2
+ \localframed[\??ag][\c!offset=\v!overlay]{\box0}%
+ \else
+ \splitmaxdepth\boxmaxdepth
+ \splittopskip\topskip
+ \setbox2\vsplit0 to \lineheight % get rid of fake line
+ \loop
+ \ifdim\pagetotal=\zeropoint % empty page
+ \scratchdimen\textheight
+ \chardef\backgroundsplit\plusone % split to max height
+ \else
+ \setbox\scratchbox\vbox{\@@agbefore}%
+ \scratchdimen\dimexpr\pagegoal-\ht\scratchbox-\pagetotal\relax
+ \chardef\backgroundsplit\plustwo % split to partial height
+ \fi
+ \advance\scratchdimen\dimexpr-\@@agtopoffset-\@@agbottomoffset\relax
+ \ifdim\scratchdimen>2\lineheight\relax % reasonable, will be configurable
+ \ifdim\ht0>\scratchdimen % larger than page
+ \setbox2\vsplit0 to \scratchdimen
+ \else
+ \setbox2\box0
+ \chardef\backgroundsplit\zerocount % no split
+ \fi
+ \setbox2\vbox \ifcase\backgroundsplit\or to \textheight \fi % max split
+ {\vskip\@@agtopoffset
+ \popsplitproperties
+ \unvcopy2
+ \prevdepth\dp2
+ \obeydepth
+ \vskip\@@agbottomoffset
+ \vfill}
+ \@@agbefore
+ \ifcase\backgroundsplit\or\or % partial split
+ \ifdim\pagegoal<\maxdimen
+ \pagegoal=1.2\pagegoal % be a bit more tolerant
+ \fi
+ \fi
+ \startlinecorrection
+ %\localframed[\??ag][\c!offset=\v!overlay]{\hskip\@@agleftoffset\box2\hskip\@@agrightoffset}%
+ \ifnum\backgroundsplitmode=\plusthree \hskip\dimen2 \fi %
+ \localframed[\??ag][\c!offset=\v!overlay]{\box2}% new **
+ \stoplinecorrection
+ \ifcase\backgroundsplit % no split
+ \@@agafter
+ \else % some split
+ \vfill\eject % geen \page !
+ \fi
+ \else
+ \page
+ \fi
+ \ifdim\ht0>\zeropoint \repeat
+ \fi
+ \egroup
+ \endgraf}
+
+%D As a bonus we also have a short command, that is of not
+%D much use, but kept there for historic reasons.
+%D
+%D \showsetup{background}
+
+\def\dobackground
+ {\bgroup
+ \dowithnextbox
+ {\localframed[\??ag][\c!offset=\v!overlay]{\flushnextbox}\egroup}
+ \vbox}
+
+%D \stopdocumentation
+%D \stopbackground
+%D \egroup
+
+%D New, for the moment private; let's see when GB finds out
+%D about this one and its obscure usage. It's used in:
+%D
+%D \startbuffer
+%D \defineframedtext
+%D [tabulateframe]
+%D [offset=overlay,
+%D backgroundoffset=3pt,
+%D background=color,
+%D backgroundcolor=green]
+%D
+%D \setuptabulate
+%D [tabulate]
+%D [frame=tabulateframe]
+%D
+%D \setuptables
+%D [frame=tabulateframe]
+%D
+%D \input tufte
+%D
+%D \starttabulate[|l|l|]
+%D \NC test \NC test \NC \NR \NC test \NC test \NC \NR
+%D \NC test \NC test \NC \NR \NC test \NC test \NC \NR
+%D \stoptabulate
+%D
+%D \input tufte
+%D
+%D \starttable[|l|l|]
+%D \NC test \NC test \NC \AR \NC test \NC test \NC \AR
+%D \NC test \NC test \NC \AR \NC test \NC test \NC \AR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+
+\def\defineframedcontent
+ {\dodoubleempty\dodefineframedcontent}
+
+\def\dodefineframedcontent[#1][#2]%
+ {\presetlocalframed[\??fc#1]%
+ \getparameters[\??fc#1]
+ [\c!leftoffset=\zeropoint,
+ \c!rightoffset=\getvalue{\??fc#1\c!leftoffset},
+ \c!topoffset=\zeropoint,
+ \c!bottomoffset=\getvalue{\??fc#1\c!topoffset},
+ \c!strut=\v!no,
+ \c!offset=\v!overlay,
+ \c!linecorrection=\v!no,
+ \c!left=,
+ \c!right=,
+ #2]}
+
+\let\setuplocalframed\getparameters
+
+\def\setupframedcontent
+ {\dodoubleempty\dosetupframedcontent}
+
+\def\dosetupframedcontent[#1][#2]%
+ {\def\docommand##1{\getparameters[\??fc##1][#2]}%
+ \processcommacommand[#1]\docommand}
+
+\def\startframedcontent[#1]%
+ {\bgroup
+ \let\stopframedcontent\egroup
+ \doifnot{#1}\v!off
+ {\doifdefined{\??fc#1\c!frame}
+ {\def\stopframedcontent{\dostopframedcontent{#1}}%
+ \dostartframedcontent{#1}}}}
+
+\def\dostartframedcontent#1%
+ {\setbox\framebox\hbox\bgroup
+ \setlocalhsize
+ \hsize\localhsize
+ \advance\hsize\dimexpr-\getvalue{\??fc#1\c!leftoffset}-\getvalue{\??fc#1\c!rightoffset} \relax
+ \advance\vsize\dimexpr-\getvalue{\??fc#1\c!topoffset} -\getvalue{\??fc#1\c!bottomoffset}\relax
+ \hskip\getvalue{\??fc#1\c!leftoffset}%
+ \vbox\bgroup
+ \vskip\getvalue{\??fc#1\c!topoffset}%
+ \vbox\bgroup
+ \forgetall
+ \blank[\v!disable]}
+
+\def\dostopframedcontent#1%
+ {\removelastskip
+ \egroup
+ \vskip\getvalue{\??fc#1\c!bottomoffset}%
+ \egroup
+ \hskip\getvalue{\??fc#1\c!rightoffset}%
+ \egroup
+ \doifvalue{\??fc#1\c!width}\v!fit
+ {\letvalue{\??fc#1\c!width}\v!fixed}% no shapebox
+ \ifinsidefloat
+ \donefalse
+ \else
+ \doifelsevalue{\??fc#1\c!linecorrection}\v!yes\donetrue\donefalse
+ \fi
+ % plaats ?
+ \ifdone\startlinecorrection\fi
+ \getvalue{\??fc#1\c!left}% new
+ \localframed[\??fc#1]{\box\framebox}%
+ \getvalue{\??fc#1\c!right}% new
+ \ifdone\stoplinecorrection\fi
+ \egroup}
+
+%D \macros
+%D {backgroundline}
+%D
+%D For the moment an undocumented feature, but a cancidate
+%D for going public.
+
+\def\backgroundline[#1]%
+ %{\doifsomething{#1}{\dobackgroundline{#1}}\hbox}
+ {\doifcolorelse{#1}{\dobackgroundline{#1}\hbox}\hbox}
+
+% \def\backgroundline[#1]%
+% {\doifcolor{#1}{\dobackgroundline{#1}}\hbox}
+
+\def\dobackgroundline#1%
+ {\dowithnextbox
+ {\hbox
+ {\localcolortrue
+ \startcolor[#1]%
+ \vrule
+ \!!width \nextboxwd
+ \!!height\nextboxht
+ \!!depth \nextboxdp
+ \stopcolor
+ \hskip-\nextboxwd
+ \flushnextbox}}}
+
+%D \macros
+%D {encircled}
+%D
+%D Some not so robust left||overs (borrowed from Knuth,
+%D \TEX Book\ page 356):
+
+\def\encircled#1%
+ {{\ooalign{\hfil\raise0.07ex\hbox{{\tx#1}}\hfil\crcr\mathhexbox20D}}}
+
+\let\omcirkeld\encircled
+
+\setuplinewidth
+ [\v!medium]
+
+\setupframed
+ [\c!width=\v!fit,
+ \c!height=\v!broad,
+ \c!lines=,
+ \c!offset=0.25ex, % \defaultframeoffset
+ \c!empty=\v!no,
+ \c!frame=\v!on,
+ \c!topframe=,
+ \c!bottomframe=,
+ \c!leftframe=,
+ \c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!rulethickness=\linewidth,
+ \c!corner=\v!rectangular,
+ \c!depth=\!!zeropoint,
+ \c!foregroundcolor=,
+ \c!foregroundstyle=,
+ \c!background=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=,
+ \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,
+ \c!top=,
+ \c!strut=\v!yes,
+ \c!autostrut=\v!yes,
+ \c!location=\v!normal,
+ \c!orientation=,
+ \c!autowidth=\v!yes,
+ \c!setups=]
+
+\setupscreens
+ [%\c!factor=1.0, % obsolete
+ %\c!method=\v!external, % obsolete
+ \c!screen=0.95]
+
+\setupblackrules
+ [\c!n=3,
+ \c!width=1em,
+ \c!height=1ex,
+ \c!depth=\!!zeropoint,
+ \c!alternative=\c!a,
+ \c!distance=.25ex,
+ \c!color=]
+
+\setupmarginrules
+ [\c!level=0,
+ \c!rulethickness=\@@kadefaultwidth\linewidth]
+
+\setupthinrules
+ [\c!interlinespace=\v!small,
+ \c!n=3,
+ \c!before=,
+ \c!inbetween={\blank[\v!white]},
+ \c!after=,
+ \c!color=,
+ \c!height=.5\linewidth,
+ \c!depth=.5\linewidth,
+ \c!frame=\v!on, % compatible with textbackgrounds
+ \c!alternative=\v!b,
+ \c!backgroundcolor=,
+ \c!background=,
+ \c!rulethickness=]
+
+\setuptextrules
+ [\c!location=\v!left,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!inbetween=,
+ \c!width=2em,
+ \c!style=\v!bold,
+ \c!color=,
+ \c!rulecolor=,
+ \c!bodyfont=,
+ \c!distance=.5em]
+
+\setupfillinrules
+ [\c!width=\v!broad,
+ \c!distance=1em,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!n=1,
+ \c!interlinespace=\v!small,
+ \c!separator=,
+ \c!style=\v!normal,
+ \c!color=]
+
+\setupfillinlines
+ [\c!width=3cm,
+ \c!margin=\@@ivwidth,
+ \c!distance=1em,
+ \c!before=\blank,
+ \c!after=\blank]
+
+\setupbackground
+ [\c!leftoffset=.5\bodyfontsize,
+ \c!rightoffset=\@@agleftoffset,
+ \c!topoffset=\!!zeropoint,
+ \c!bottomoffset=\@@agtopoffset,
+ \c!state=\v!start,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!frame=\v!off,
+ \c!color=,
+ \c!depth=\!!zeropoint,
+ \c!background=\v!screen,
+ \c!backgroundcolor=\@@agcolor,
+ \c!screen=\@@rsscreen,
+ \c!before=,
+ \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv
new file mode 100644
index 000000000..afacc2901
--- /dev/null
+++ b/tex/context/base/pack-rul.mkiv
@@ -0,0 +1,3686 @@
+%D \module
+%D [ file=pack-rul, % was core-rul,
+%D version=1998.10.16,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Ruled Content,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Ruled Content}
+
+%D redo framedtexts like framedcontent (parameter stuff)
+
+%D After a few months testing this solution is now added
+%D to the core. This introduces a possible incompatibility
+%D between \MKII\ and \MKIV\ but for the better.
+
+\registerctxluafile{pack-rul}{1.001}
+
+% old off new
+% 4 lines oeps : 3.6 2.8 3.0
+% tufte 7.5 4.1 4.3
+
+\unprotect
+
+%D We have removed the rather old and out dated raster methods. They
+%D have not been used for ages. You can still find the old code in
+%D the \MKII\ counterpart of this module.
+
+%D This module is rather optimized so sometimes readability has been
+%D sacrisfied for speed. This is because the framing mechanism is used
+%D all over the place.
+
+%D \macros
+%D {linewidth, setuplinewidth}
+%D
+%D This module deals with rules (lines) in several ways. First
+%D we introduce two macros that can be used to set some common
+%D characteristics.
+%D
+%D \showsetup{setuplinewidth}
+%D
+%D The linewidth is available in \type{\linewidth}. The
+%D preset value of .4pt equals the default hard coded \TEX\
+%D rule width.
+
+\newdimen\linewidth
+
+\def\dosetuplinewidth[#1]%
+ {\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}}
+
+\unexpanded\def\setuplinewidth
+ {\dosingleargument\dosetuplinewidth}
+
+%D \macros
+%D {ruledlinewidth, inheritruledlinewidth}
+%D
+%D Inside framed boxed we will use a private dimensions. As
+%D an option one can let the linewidth inherit its value from
+%D this one.
+
+\newdimen\ruledlinewidth \newif\ifinheritruledlinewidth
+
+%D \macros
+%D {setupscreens}
+%D
+%D The previous macro uses a predefined constant
+%D \type{\@@rsfactor}. This factor can be set by:
+%D
+%D \showsetup{setupscreens}
+
+\unexpanded\def\setupscreens
+ {\dodoubleargument\getparameters[\??rs]}
+
+%D We will communicate through module specific variables, current
+%D framed parameters and some reserved dimension registers.
+
+\newdimen \frameddimenwd
+\newdimen \frameddimenht
+\newdimen \frameddimendp
+
+%D We don't have to stick to a \TEX\ drawn rule, but
+%D also can use rounded or even fancier shapes, as we will
+%D see later on.
+
+\def\dofilledbox
+ {\bgroup
+ \edef\@@framedfilledmod{\framedparameter\c!backgroundcorner}%
+ \ifx\@@framedfilledmod\v!rectangular
+ \dofilledlinedbox
+ \else\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize
+ \dofilledlinedbox
+ \else
+ \dofilledroundbox
+ \fi\fi
+ \egroup}
+
+\def\dophantombox
+ {\hphantom{\dofilledbox}}
+
+\def\dofilledlinedbox
+ {\vrule\!!width\frameddimenwd\!!height\frameddimenht\!!depth\frameddimendp\relax}%
+
+\def\dostrokedroundbox
+ {\doif{\framedparameter\c!frame}\v!on\dodostrokedroundbox}
+
+\def\dodostrokedroundbox
+ {\bgroup
+ \edef\ovalmod{\framedparameter\c!framecorner}%
+ \ifx\ovalmod\v!round
+ \let\ovalmod\!!zerocount
+ \else
+ \edef\ovalmod{\number\ovalmod}%
+ \fi
+ \edef\ovalwid{\the\frameddimenwd}%
+ \edef\ovalhei{\the\frameddimenht}%
+ \edef\ovaldep{\the\frameddimendp}%
+ \edef\ovallin{\the\dimexpr\ruledlinewidth}%
+ \edef\ovalrad{\the\dimexpr\framedparameter\c!frameradius}%
+ \let\ovalstr\!!plusone
+ \let\ovalfil\!!zerocount
+% \forcecolorhack
+ \doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil\ovalmod
+ \egroup}
+
+\def\dofilledroundbox
+ {\bgroup
+ \edef\ovalmod{\framedparameter\c!backgroundcorner}%
+ \ifx\ovalmod\v!round
+ \let\ovalmod\!!zerocount
+ \else
+ \edef\ovalmod{\number\ovalmod}%
+ \fi
+ \edef\ovalwid{\the\frameddimenwd}%
+ \edef\ovalhei{\the\frameddimenht}%
+ \edef\ovaldep{\the\frameddimendp}%
+ \edef\ovallin{\the\dimexpr\ruledlinewidth\relax}%
+ \edef\ovalrad{\the\dimexpr\framedparameter\c!backgroundradius\relax}%
+ \let\ovalstr\!!zerocount
+ \let\ovalfil\!!plusone
+% \forcecolorhack
+ \doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil\ovalmod
+ \egroup}
+
+% a lot of weird corners
+%
+% \startTEXpage
+% \dontleavehmode\framed
+% [corner=0,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {1} {4}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {5} {8}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green,
+% background=color,backgroundcolor=yellow]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {1} {4}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {5} {8}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse {9}{12}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{13}{16}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{17}{20}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{21}{24}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \vskip1em
+% \dontleavehmode\dostepwiserecurse{25}{28}{1}{\framed
+% [corner=\recurselevel,frame=on,framecolor=green]{\tttf TEST \twodigits\recurselevel}%
+% \quad}
+% \stopTEXpage
+
+%D The oval box is drawn using a special macro, depending on
+%D the driver in use.
+
+\def\dograybox % avoid black rules when no gray
+ {\doifelsenothing{\framedparameter\c!backgroundscreen}
+ {\dophantombox}
+ {\raster[\framedparameter\c!backgroundscreen]{\dofilledbox}}}
+
+%D It won't be a surprise that we not only provide gray boxes,
+%D but also colored ones. Here it is:
+
+\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}
+
+%D \macros
+%D {defineoverlay, doifoverlayelse, overlayoffset,
+%D overlaywidth, overlayheight, overlaydepth,
+%D overlaycolor, overlaylinecolor, overlaylinewidth}
+%D
+%D Before we define the macro that actually takes card of the
+%D backgrounds, we introduce overlays. An overlay is something
+%D that contrary to its name lays {\em under} the text. An
+%D example of an overlay definition is:
+%D
+%D \startbuffer[tmp-1]
+%D \defineoverlay
+%D [fancy]
+%D [{\externalfigure
+%D [mp-cont.502]
+%D [width=\overlaywidth,
+%D height=\overlayheight]}]
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-1]
+%D
+%D That for instance can be uses in:
+%D
+%D \startbuffer[tmp-2]
+%D \framed[backgroundachtergrond=fancy]{How Fancy!}
+%D \framed[backgroundachtergrond=fancy,frame=off]{Even More Fancy!}
+%D \stopbuffer
+%D
+%D and looks like:
+%D
+%D \startlinecorrection
+%D \vbox{\baselineskip24pt\getbuffer[tmp-1]\getbuffer[tmp-2]}
+%D \stoplinecorrection
+%D
+%D The formal definition is:
+%D
+%D \showsetup{defineoverlay}
+%D
+%D This macro's definition is a bit obscure, due the many
+%D non||used arguments and the two step call that enable the
+%D setting of the width, height and depth variables.
+%D Multiple backgrounds are possible and are specified as:
+%D
+%D \starttyping
+%D \framed[background={one,two,three}]{Three backgrounds!}
+%D \stoptyping
+%D
+%D Most drawing packages only know width and height. Therefore
+%D the dimensions have a slightly different meaning here:
+%D
+%D \startitemize[packed]
+%D \item \type{\overlaywidth }: width of the overlay
+%D \item \type{\overlayheight}: height plus depth of the overlay
+%D \item \type{\overlaydepth }: depth of the overlay
+%D \stopitemize
+%D
+%D The resulting box is lowered to the right depth.
+
+\def\overlaywidth {\the\hsize\space} % We preset the variables
+\def\overlayheight {\the\vsize\space} % to some reasonable default
+\let\overlaydepth \!!zeropoint % values. The attributes
+\let\overlayoffset \!!zeropoint % of the frame can be (are)
+\let\overlaycolor \empty % set somewhere else.
+\let\overlaylinewidth \!!zeropoint %
+\let\overlaylinecolor \empty %
+
+%D The next register is used to initialize overlays.
+
+\newtoks\everyoverlay
+
+%D An example of an initialization is the following (overlays
+%D can contain text and be executed under an regime where
+%D interlineskip is off).
+
+\appendtoks \oninterlineskip \to \everyoverlay
+
+\unexpanded\def\defineoverlay
+ {\dodoubleargument\dodefineoverlay}
+
+\def\dodefineoverlay[#1][#2]%
+ {\def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}%
+ \processcommalist[#1]\docommand}
+
+\prependtoks
+ \hsize\overlaywidth
+ \vsize\overlayheight
+\to\everyoverlay
+
+\long\def\executedefinedoverlay#1#2%
+ {\bgroup
+ \setlayoutcomponentattribute\v!overlay{#1}%
+ \edef\overlaywidth {\the\frameddimenwd\space}%
+ \edef\overlayheight{\the\dimexpr\frameddimenht+\frameddimendp\relax\space}%
+ \edef\overlaydepth {\the\frameddimendp\space}%
+ \edef\overlaycolor {\framedparameter\c!backgroundcolor}%
+ %\edef\overlaycorner{\framedparameter\c!backgroundcorner}%
+ %\edef\overlayradius{\framedparameter\c!backgroundradius}%
+ \let\overlayoffset\backgroundoffset % we steal this one
+ \setbox\scratchbox\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}%
+ \setbox\scratchbox\hbox \layoutcomponentboxattribute
+ {\hskip-.5\dimexpr\wd\scratchbox-\overlaywidth \relax
+ \raise-.5\dimexpr\ht\scratchbox-\frameddimenht\relax % not overlayheight !
+ \box\scratchbox}%
+ \wd\scratchbox\frameddimenwd
+ \ht\scratchbox\frameddimenht
+ \dp\scratchbox\frameddimendp
+ \box\scratchbox
+ \egroup}
+
+%D The empty case is:
+
+\let\executeoverlay\gobblesevenarguments
+
+%D For testing we provide:
+
+\def\doifoverlayelse#1%
+ {\ifcsname\??ov#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D We predefine two already familiar backgrounds:
+
+\setvalue{\??ov\v!screen}{\dograybox }
+\setvalue{\??ov\v!color }{\docolorbox}
+
+% %D After all these preparations, the background macro does no
+% %D bring to many surprises. One has to keep in mind that this
+% %D macro starts up a call chain, depending on the background
+% %D one needs:
+% %D
+% %D \startitemize[packed]
+% %D \item a raster, color or user defined shape
+% %D \item square or round corners
+% %D \item a \TEX\ or driver based method
+% %D \stopitemize
+% %D
+% %D The macro can be extended by adding commands to the token
+% %D list register \type {\everybackgroundbox}. For this
+% %D purpose, the name of the current background is available in
+% %D \type {\currentbackgound}.
+
+%D The content of the box will be (temporary) saved in a box. We
+%D also have an extra box for backgrounds.
+
+\newbox\framebox
+\newbox\extraframebox
+
+\newtoks\everybackgroundbox
+
+\let\currentbackground\empty
+
+\def\dodobackgroundbox
+ {\bgroup
+ \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 % use $ instead of s!unknown
+ \dodobackgroundbox\expandafter\dododobackgroundbox
+ \fi#2}
+
+\let\backgroundoffset\!!zeropoint
+\let\backgrounddepth \!!zeropoint
+\def\backgroundwidth {\the\hsize}
+\def\backgroundheight{\the\vsize}
+
+\def\normalforegroundbox% fuzzy but needed hack, this \vss, otherwise
+ {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift
+
+\def\dobackedbox
+ {\setbox\framebox\vbox
+ {\framedforgetall
+ \boxmaxdepth\maxdimen
+ \frameddimenwd\dimexpr\wd\framebox+2\!!framedbackgroundoffset\relax
+ \frameddimenht\dimexpr\ht\framebox+ \!!framedbackgroundoffset\relax
+ \frameddimendp\dimexpr\dp\framebox+ \!!framedbackgroundoffset+\framedparameter\c!backgrounddepth\relax
+ \edef\backgroundoffset{\the\!!framedbackgroundoffset}%
+ \edef\backgroundwidth {\the\wd\framebox}%
+ \edef\backgroundheight{\the\ht\framebox}%
+ \edef\backgrounddepth {\the\dp\framebox}%
+ %\edef\foregroundbox{\box#1}%
+ \edef\component{\framedparameter\c!component}%
+ \ifx\component\empty
+ \resetlayoutcomponentattribute
+ \else
+ \setlayoutcomponentattribute\v!background\component
+ \fi
+ \let\foregroundbox\normalforegroundbox
+ \hbox \layoutcomponentboxattribute to \backgroundwidth % width in case 'foreground' is used as overlay
+ {\expandafter\dododobackgroundbox\framedbackground,\s!unknown,\relax % hm, messy .. look into it
+ \box\framebox\hss}}}
+
+%D One can explictly insert the foreground box. For that
+%D purpose we introduce the overlay \type {foreground}.
+
+\defineoverlay[\v!foreground][\foregroundbox]
+
+%D We can specify overlays as a comma separated list of
+%D overlays, a sometimes handy feature.
+
+%D Besides backgrounds (overlays) we also need some macros to
+%D draw outlines (ruled borders). Again we have to deal with
+%D square and round corners. The first category can be handled
+%D by \TEX\ itself, the latter one depends on the driver. This
+%D macro also support a negative offset.
+
+\def\dooutlinebox % we needed to move the color command in order to apply attributes properly
+ {\setbox\framebox\vbox % rules on top of box
+ {\frameddimenwd\dimexpr\wd\framebox+2\!!framedframeoffset\relax
+ \frameddimenht\dimexpr\ht\framebox+ \!!framedframeoffset\relax
+ \frameddimendp\dimexpr\dp\framebox+ \!!framedframeoffset+\framedparameter\c!framedepth\relax
+ \ifdim\frameddimendp<\zeropoint
+ \advance\frameddimenht \frameddimendp
+ \scratchdimen-\frameddimendp
+ \frameddimendp\zeropoint
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \setbox\extraframebox\hbox
+ {\doifsomething{\framedparameter\c!framecolor}{\color[\framedparameter\c!framecolor]}{\dostrokedbox}}%
+ \setbox\extraframebox\hbox
+ {\raise\scratchdimen\vbox
+ {\moveleft\!!framedframeoffset
+ \box\extraframebox}}%
+ \wd\extraframebox\wd\framebox
+ \ht\extraframebox\ht\framebox
+ \dp\extraframebox\dp\framebox
+ \hbox{\box\framebox\hskip-\wd\extraframebox\box\extraframebox}}}
+
+\def\dostrokedbox
+ {\edef\@@framedcornermod{\framedparameter\c!framecorner}%
+ \ifx\@@framedcornermod\v!rectangular
+ \dostrokedlinedbox
+ \else\ifzeropt\dimexpr\framedparameter\c!frameradius\relax % just in case of .x\bodyfontsize
+ \dostrokedlinedbox
+ \else
+ \dostrokedroundbox
+ \fi\fi}
+
+\def\dostrokedlinedbox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\frameddimenwd
+ \ht\scratchbox\frameddimenht
+ \dp\scratchbox\frameddimendp
+ \setbox\scratchbox\vbox \bgroup
+ \csname t\@@frame@@\framedparameter\c!frame\framedparameter\c!topframe \endcsname
+ \hbox \bgroup
+ \csname l\@@frame@@\framedparameter\c!frame\framedparameter\c!leftframe \endcsname
+ \box\scratchbox
+ \csname r\@@frame@@\framedparameter\c!frame\framedparameter\c!rightframe \endcsname
+ \egroup
+ \csname b\@@frame@@\framedparameter\c!frame\framedparameter\c!bottomframe\endcsname
+ \egroup
+ \wd\scratchbox\frameddimenwd
+ \ht\scratchbox\frameddimenht
+ \dp\scratchbox\frameddimendp
+ \box\scratchbox}
+
+\def\@@frame@@{@@frame@@}
+
+% \setvalue{t\@@frame@@\v!on \v!on}{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{t\@@frame@@\v!off\v!on}{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{t\@@frame@@\v!on }{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{b\@@frame@@\v!on \v!on}{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+% \setvalue{b\@@frame@@\v!off\v!on}{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+% \setvalue{b\@@frame@@\v!on }{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+% \setvalue{l\@@frame@@\v!on \v!on}{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{l\@@frame@@\v!off\v!on}{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{l\@@frame@@\v!on }{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+% \setvalue{r\@@frame@@\v!on \v!on}{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+% \setvalue{r\@@frame@@\v!off\v!on}{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+% \setvalue{r\@@frame@@\v!on }{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+
+\def\@@frame@@trule{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+\def\@@frame@@brule{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+\def\@@frame@@rrule{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+\def\@@frame@@lrule{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+
+\letvalue{t\@@frame@@\v!on \v!on}\@@frame@@trule
+\letvalue{t\@@frame@@\v!off\v!on}\@@frame@@trule
+\letvalue{t\@@frame@@\v!on }\@@frame@@trule
+
+\letvalue{b\@@frame@@\v!on \v!on}\@@frame@@brule
+\letvalue{b\@@frame@@\v!off\v!on}\@@frame@@brule
+\letvalue{b\@@frame@@\v!on }\@@frame@@brule
+
+\letvalue{l\@@frame@@\v!on \v!on}\@@frame@@lrule
+\letvalue{l\@@frame@@\v!off\v!on}\@@frame@@lrule
+\letvalue{l\@@frame@@\v!on }\@@frame@@lrule
+
+\letvalue{r\@@frame@@\v!on \v!on}\@@frame@@rrule
+\letvalue{r\@@frame@@\v!off\v!on}\@@frame@@rrule
+\letvalue{r\@@frame@@\v!on }\@@frame@@rrule
+
+% no overlapping rules
+
+\def\@@frame@@trules{\hbox{\kern\ruledlinewidth\vrule\!!width\dimexpr\frameddimenwd-2\ruledlinewidth\relax\!!height\ruledlinewidth}\nointerlineskip\kern-\ruledlinewidth}
+\def\@@frame@@brules{\kern-\ruledlinewidth\nointerlineskip\hbox{\kern\ruledlinewidth\vrule\!!width\dimexpr\frameddimenwd-2\ruledlinewidth\relax\!!height\ruledlinewidth}}
+\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
+
+\letvalue{b\@@frame@@\v!small\v!small}\@@frame@@brules
+\letvalue{b\@@frame@@\v!off \v!small}\@@frame@@brules
+\letvalue{b\@@frame@@\v!small }\@@frame@@brules
+
+\letvalue{l\@@frame@@\v!small\v!small}\@@frame@@lrules
+\letvalue{l\@@frame@@\v!off \v!small}\@@frame@@lrules
+\letvalue{l\@@frame@@\v!small }\@@frame@@lrules
+
+\letvalue{r\@@frame@@\v!small\v!small}\@@frame@@rrules
+\letvalue{r\@@frame@@\v!off \v!small}\@@frame@@rrules
+\letvalue{r\@@frame@@\v!small }\@@frame@@rrules
+
+%D I condidered using the low level support command
+%D \type{\ruledhbox}, but this would slow down processing by a
+%D factor~3.
+
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=on,leftframe=on,topframe=on,bottomframe=on]
+% {}
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=small]
+% {}
+% \framed
+% [width=4cm,height=3cm,rulethickness=3mm,
+% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=on]
+% {}
+
+%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
+%D start with defining some booleans. These give an impression
+%D of what we are going to take into account.
+
+% todo: chardefs
+
+\newif\ifboxhasoffset
+\newif\ifboxhaswidth
+\newif\ifboxhasheight
+\newif\ifboxhasformat
+\newif\ifboxhasstrut
+\newif\ifboxisoverlaid
+\newif\ifboxhasframe
+\newif\ifdelayedstrut
+\newif\ifboxhasextraoffset
+
+%D We also need a few \DIMENSIONS:
+
+\newdimen\@@localoffset
+\newdimen\@@globalwidth
+
+%D \macros
+%D {framed, setupframed}
+%D
+%D Ruled boxes are typeset using \type{\framed}. This command
+%D is quite versatile and, although some users will probably
+%D seldom use it, one cannot overlook its features.
+%D
+%D \showsetup{setupframed}
+%D \showsetup{framed}
+%D
+%D This general macro is a special version of an even more
+%D general case, that can easily be linked into other macros
+%D that need some kind of framing. The local version is called
+%D with an extra parameter: the variable identifier. The reason
+%D for passing this identifier between brackets lays in the
+%D mere fact that this way we can use the optional argument
+%D grabbers.
+
+\def\defaultframeoffset{.25ex}
+
+\def\presetlocalframed [#1]{\letvalue{#1\s!parent}\??oi}
+\def\inheritlocalframed[#1]#2[#3]{\letvalue{#1\s!parent}#3}
+\def\copylocalframed [#1]#2[#3]{\setvalue{#1\s!parent}{#3}}
+
+\let\setuplocalframed\getparameters % obsolete
+
+\presetlocalframed[\??ol]
+
+\newcount\framednesting
+
+\unexpanded\def\framed
+ {\bgroup
+ \advance\framednesting\plusone
+ \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol
+ \dodoubleempty\startlocalframed[\??ol:\the\framednesting]}
+
+\unexpanded\def\setupframed
+ {\dodoubleempty\dosetupframed}
+
+\def\dosetupframed
+ {\ifsecondargument
+ \@EA\dodoublesetupframed
+ \else
+ \@EA\dosinglesetupframed
+ \fi}
+
+\def\dosinglesetupframed[#1][#2]%
+ {\getparameters[\??ol][#1]}
+
+\def\dodoublesetupframed[#1][#2]%
+ {\bgroup
+ \let\dodoubleempty\empty
+ \def\doframed[##1]{\gdef\globalredefinedframed{\dodoubleempty\doframed[##1,#2]}}%
+ \getvalue{#1}%
+ \egroup
+ \letvalue{#1}\globalredefinedframed}
+
+%D \startbuffer
+%D \setupframed [framecolor=yellow] \framed{A}
+%D \defineframed[myframed] [framecolor=blue] \myframed{B}
+%D \setupframed [myframed] [framecolor=red] \myframed{C}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \presetlocalframed[myframed]
+%D \setuplocalframed[myframed][width=4cm,height=2cm]
+%D \localframed[myframed][framecolor=green]{oeps}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {ifinframed}
+%D
+%D The normal case first presets all parameters and next starts
+%D looking for the user supplied ones. The first step is
+%D omitted in the local case, because these are preset at
+%D declaration time and keep their values unless explictly
+%D changed. By presetting the variables everytime the normal
+%D command is called, we can use this command nested, without
+%D the unwanted side effect of inheritance. The boolean is
+%D used to speed up the color stack.
+
+\newif\ifinframed
+
+\def\localframed
+ {\bgroup
+ \dodoubleempty\startlocalframed}
+
+%D The next one is faster on multiple backgrounds per page. No
+%D dimensions can be set, only frames and backgrounds.
+
+\def\fastlocalframed[#1]#2[#3]#4% 3-4
+ {\bgroup
+ \inframedtrue
+ \edef\@@framed{#1}%
+ \setbox\framebox\hbox{#4}%
+ \getparameters[\@@framed][#3]% no \expanded !
+ \!!framedframeoffset\framedparameter\c!frameoffset
+ \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}%
+ \ifx\@@framedbackgroundoffset\v!frame
+ \!!framedbackgroundoffset\!!framedframeoffset
+ \else
+ \!!framedbackgroundoffset\@@framedbackgroundoffset
+ \fi
+ % not here, in calling macro: setups
+ \removeframedboxdepth
+% \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
+% \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}%
+ \edef\overlaylinewidth{\the\ruledlinewidth}%
+ \edef\@@localframing {\framedparameter\c!frame}%
+ \ifx\@@localframing\v!overlay \else \ifx\@@localframing\v!none \else
+ \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+ \ifx\framedrulethickness\empty\else
+ \ruledlinewidth\framedrulethickness\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+ \fi
+ \dooutlinebox % real or invisible frame
+ \fi \fi
+ \edef\framedbackground{\framedparameter\c!background}%
+ \ifx\framedbackground\empty\else\dobackedbox\fi
+ \restoreframedboxdepth
+ \box\framebox
+ \egroup}
+
+%D Here is another fast one:
+
+\def\localbackgroundframed#1#2#3#4% tag box wd ht
+ {\setbox#2\vbox\bgroup
+ \inframedtrue
+ \edef\@@framed{\??ma#1}%
+ \expandafter\def\csname\??ma#1\c!component\endcsname{#1}%
+ \expandafter\def\csname\??ma#1\c!width \endcsname{#3}%
+ \expandafter\def\csname\??ma#1\c!height \endcsname{#4}%
+ \!!framedframeoffset\framedparameter\c!frameoffset
+ \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}%
+ \ifx\@@framedbackgroundoffset\v!frame
+ \!!framedbackgroundoffset\!!framedframeoffset
+ \else
+ \!!framedbackgroundoffset\@@framedbackgroundoffset
+ \fi
+ \setbox\framebox\box#2%
+ \dp\framebox\zeropoint
+% \removeframedboxdepth
+% \edef\framedforegroundcolor{\framedparameter\c!foregroundcolor}%
+% \ifx\framedforegroundcolor\empty\else\docolorframebox\fi
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}%
+ \edef\overlaylinewidth{\the\ruledlinewidth}%
+ \edef\@@localframing {\framedparameter\c!frame}%
+ \ifx\@@localframing\v!overlay \else \ifx\@@localframing\v!none \else
+ \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+ \ifx\framedrulethickness\empty\else
+ \ruledlinewidth\framedrulethickness\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+ \fi
+ \dooutlinebox % real or invisible frame
+ \fi \fi
+ \edef\framedbackground{\framedparameter\c!background}%
+ \ifx\framedbackground\empty\else\dobackedbox\fi
+% \restoreframedboxdepth
+ \box\framebox
+ \egroup}
+
+%D Before we go into details, we present (and implement) the
+%D main framing routine. I saw no real reason for splitting the
+%D next two macros into smaller pieces. The content will be
+%D collected in a horizontal or vertical box with fixed or free
+%D dimensions and specific settings concerning aligment and
+%D offsets.
+%D
+%D In the first few lines, we pre||expand the frame and
+%D background offsets. We do so, because the can be defined in
+%D terms of the main offset. However, see for instance page
+%D backgrounds, when \type {#2} sets the offset to \type
+%D {overlay}, both offsets become invalid.
+%D
+%D Because it is used so often the he next macro is (and
+%D looks) rather optimized.
+
+% \def\s!root{root} % maybe configurable
+
+\let\postprocessframebox\relax
+
+\let\@@framed\s!unknown
+
+% \def\framedparameter #1{\csname\doframedparameter\@@framed#1\endcsname}
+% \def\framedparameterhash#1{\doframedparameterhash \@@framed#1}
+%
+% \def\doframedparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedparentparameter \csname#1\s!parent\endcsname#2\fi}
+% \def\doframedparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doframedparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+%
+% \def\doframedparentparameter #1#2{\ifx#1\relax\s!empty\else\doframedparameter #1#2\fi}
+% \def\doframedparentparameterhash#1#2{\ifx#1\relax \else\doframedparameterhash#1#2\fi}
+%
+% \def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1#2\fi}
+% \def\doframedrootparameter #1{\ifcsname\??oi#1\endcsname\??oi#1\else\s!empty\fi}
+
+\def\framedparameter #1{\csname\doframedparameter\@@framed{#1}\endcsname}
+\def\framedparameterhash#1{\doframedparameterhash \@@framed#1}
+
+\def\doframedparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedparentparameter \csname#1\s!parent\endcsname{#2}\fi}
+\def\doframedparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doframedparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\doframedparentparameter #1#2{\ifx#1\relax\s!empty\else\doframedparameter #1{#2}\fi}
+\def\doframedparentparameterhash#1#2{\ifx#1\relax \else\doframedparameterhash#1#2\fi}
+
+\def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1{#2}\fi}
+\def\doframedrootparameter #1{\ifcsname\??oi#1\endcsname\??oi#1\else\s!empty\fi}
+
+\def\frameddimension#1{\the\dimexpr\framedparameter{#1}\relax}
+
+\def\dosetframedattributes#1#2% style color
+ {\edef\fontattributehash {\framedparameterhash#1}%
+ \edef\colorattributehash{\framedparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+% defaults, kind of isolated now
+
+\getparameters
+ [\??oi]
+ [\c!width=\v!fit,
+ \c!height=\v!broad,
+ %\c!lines=,
+ \c!offset=0.25ex, % \defaultframeoffset
+ \c!empty=\v!no,
+ \c!frame=\v!on,
+ %\c!topframe=,
+ %\c!bottomframe=,
+ %\c!leftframe=,
+ %\c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!rulethickness=\linewidth,
+ \c!corner=\v!rectangular,
+ \c!depth=\zeropoint,
+ %\c!foregroundcolor=,
+ %\c!foregroundstyle=,
+ %\c!background=,
+ %\c!backgroundscreen=,
+ %\c!backgroundcolor=,
+ \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,
+ %\c!top=,
+ \c!strut=\v!yes,
+ \c!autostrut=\v!yes,
+ \c!location=\v!normal,
+ %\c!orientation=,
+ \c!autowidth=\v!yes,
+ %\c!setups=
+]
+
+\getparameters
+ [\??od] % for fast version
+ [\c!frame=\v!off,
+ \c!depth=\zeropoint,
+ \c!offset=\v!overlay,
+ %\c!component=,
+ \c!radius=.5\bodyfontsize,
+ \c!rulethickness=\linewidth,
+ \c!corner=\v!rectangular,
+ \c!backgroundoffset=\zeropoint,
+ \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!location=\v!normal]
+
+% so far
+
+\newdimen\!!framedwidth
+\newdimen\!!framedheight
+\newdimen\!!framedscratch % so that users can use \scratchdimen
+\newdimen\!!framedframeoffset
+\newdimen\!!framedbackgroundoffset
+
+\let\setextraframedoffsets \relax
+\let\applyextraframedoffsets\relax
+
+% todo: protect local \framednames
+
+\unexpanded\def\startlocalframed[#1][#2]%
+ {\bgroup
+ \inframedtrue
+ \edef\@@framed{#1}%
+ \ifsecondargument % faster
+ \getparameters[\@@framed][#2]% here !
+ \fi
+ \!!framedframeoffset\framedparameter\c!frameoffset
+ \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}%
+ \ifx\@@framedbackgroundoffset\v!frame
+ \!!framedbackgroundoffset\!!framedframeoffset
+ \else
+ \!!framedbackgroundoffset\@@framedbackgroundoffset
+ \fi
+ % new, experimental dirty hook
+ \framedparameter\c!extras
+ % to get the right spacing
+ \edef\fontattributehash{\framedparameterhash\c!foregroundstyle}%
+ \ifx\fontattributehash\empty\else\dosetfontattribute\fontattributehash\c!foregroundstyle\fi
+ % beware, both the frame and background offset can be overruled
+ %
+ \edef\doframedsetups{\framedparameter\c!setups}%
+ \ifx\doframedsetups\empty\else
+ \edef\doframedsetups{\noexpand\setups[\doframedsetups]}%
+ \fi
+ % the next macros are visible
+ \edef\localoffset{\framedparameter\c!offset}%
+ \edef\localwidth {\framedparameter\c!width}%
+ \edef\localheight{\framedparameter\c!height}%
+ \edef\localformat{\framedparameter\c!align}%
+ \edef\localstrut {\framedparameter\c!strut}%
+ % these are not
+ \edef\@@localautostrut {\framedparameter\c!autostrut}%
+ \edef\@@localframing {\framedparameter\c!frame}%
+ \edef\@@locallocation {\framedparameter\c!location}%
+ \edef\@@localorientation{\framedparameter\c!orientation}%
+ %
+ \edef\@@localautowidth {\framedparameter\c!autowidth}%
+ %
+ \ifx\@@localframing\v!overlay % no frame, no offset, no framewidth
+ \boxhasframefalse
+ \let\localoffset\v!overlay
+ \else\ifx\@@localframing\v!none % no frame, no framewidth
+ \boxhasframefalse
+ \else
+ \boxhasframetrue
+ \fi\fi
+ \ifboxhasframe
+ \edef\framedrulethickness{\framedparameter\c!rulethickness}%
+ \ifx\framedrulethickness\empty\else
+ \ruledlinewidth\framedrulethickness\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi
+ \fi
+ \else
+ \ruledlinewidth\zeropoint
+ \fi
+ \ifx\localformat\empty
+ \boxhasformatfalse
+ \else
+ \boxhasformattrue
+ \dosetraggedcommand\localformat
+ \edef\dobeforeframedbox{\raggedtopcommand\framedparameter\c!top}%
+ \edef\doafterframedbox {\framedparameter\c!bottom\raggedbottomcommand}%
+ \fi
+ \ifx\localoffset\v!none
+ \boxhasoffsetfalse
+ \boxhasstrutfalse
+ \boxisoverlaidfalse
+ \@@localoffset\ruledlinewidth
+ \else\ifx\localoffset\v!overlay
+ % \ifx\@@localframing\v!no \boxhasframefalse \fi % test first
+ \boxhasoffsetfalse
+ \boxhasstrutfalse
+ \boxisoverlaidtrue
+ \@@localoffset\zeropoint
+ \else
+ \boxhasoffsettrue
+ \boxhasstruttrue
+ \boxisoverlaidfalse
+ \ifx\localoffset\v!default % new per 2-6-2000
+ \let\localoffset\defaultframeoffset
+ \expandafter\let\csname\@@framed\c!offset\endcsname\defaultframeoffset
+ \else
+ \let\defaultframeoffset\localoffset
+ \fi
+ \@@localoffset\dimexpr\localoffset+\ruledlinewidth\relax
+ \fi\fi
+ \!!framedheight\zeropoint
+ \!!framedwidth \zeropoint
+ \ifx\localwidth\v!fit
+ \ifboxhasformat
+ \boxhaswidthtrue
+ \!!framedwidth\hsize
+ \else
+ \boxhaswidthfalse
+ \fi
+ \else\ifx\localwidth\v!fixed % equals \v!fit but no shapebox
+ \ifboxhasformat
+ \boxhaswidthtrue
+ \!!framedwidth\hsize
+ \else
+ \boxhaswidthfalse
+ \fi
+ \else\ifx\localwidth\v!broad
+ \boxhaswidthtrue
+ \!!framedwidth\hsize
+ \else\ifx\localwidth\v!local
+ \boxhaswidthtrue
+ \setlocalhsize
+ \!!framedwidth\localhsize
+ \else
+ \boxhaswidthtrue
+ \!!framedwidth\localwidth
+ \fi\fi\fi\fi
+ \ifx\localheight\v!fit
+ \boxhasheightfalse % no longer: \boxhasstrutfalse
+ \else\ifx\localheight\v!broad
+ \boxhasheightfalse
+ \else
+ \boxhasheighttrue
+ \!!framedheight\localheight
+ \fi\fi
+ \ifboxhasheight
+ % obey user set height, also downward compatible
+ \else
+ \edef\@@framedlines{\framedparameter\c!lines}%
+ \ifx\@@framedlines\empty\else
+ \ifcase\@@framedlines\else
+ \!!framedheight\@@framedlines\lineheight
+ \edef\localheight{\the\!!framedheight}%
+ \boxhasheighttrue
+ \fi
+ \fi
+ \fi
+ % this is now an option: width=local
+ %
+ % \ifdim\!!framedwidth=\hsize
+ % \parindent\zeropoint
+ % \setlocalhsize
+ % \!!framedwidth\localhsize
+ % \fi
+ % i.e. disable (colsetbackgroundproblemintechniek)
+ \advance\!!framedwidth -2\@@localoffset
+ \advance\!!framedheight -2\@@localoffset
+ \ifx\localstrut\v!no
+ \boxhasstrutfalse
+ \else\ifx\localstrut\v!global
+ \setstrut
+ \else\ifx\localstrut\v!local
+ \setfontstrut
+ \else
+ \setstrut
+ \fi\fi\fi
+ \ifboxhasstrut
+ \let\localbegstrut\begstrut
+ \let\localendstrut\endstrut
+ \let\localstrut \strut
+ \else
+ \let\localbegstrut\pseudobegstrut % was: \relax
+ \let\localendstrut\pseudoendstrut % was: \relax
+ \let\localstrut \pseudostrut % was: \relax
+ %\ifboxhasheight\ifdim\!!framedheight<\strutht % saveguard
+ % \let\localbegstrut\relax % but not that
+ % \let\localstrut \relax % save after all
+ %\fi\fi
+ \fi
+ \ifx\@@localautostrut\v!yes
+ \let\delayedbegstrut\relax
+ \let\delayedendstrut\relax
+ \let\delayedstrut \relax
+ \else
+ \let\delayedbegstrut\localbegstrut
+ \let\delayedendstrut\localendstrut
+ \let\delayedstrut \localstrut
+ \let\localbegstrut \relax
+ \let\localendstrut \relax
+ \let\localstrut \relax
+ \fi
+ \ifboxhasheight
+ \let\\\vboxednewline
+ \ifboxhaswidth
+ \let\hairline\vboxedhairline
+ \ifboxhasformat
+ \let\next\doformatboxSomeFormat
+ \else
+ \let\next\doformatboxNoFormat
+ \fi
+ \else
+ \let\hairline\hboxedhairline
+ \ifboxhasformat
+ \let\next\doformatboxHeight
+ \else
+ \let\next\doformatboxVSize
+ \fi
+ \fi
+ \else
+ \ifboxhaswidth
+ \ifboxhasformat
+ \let\hairline\vboxedhairline
+ \let\\\vboxednewline
+ \let\next\doformatboxWidth
+ \else
+ \let\hairline\hboxedhairline
+ \let\\\hboxednewline
+ \let\next\doformatboxHSize
+ \fi
+ \else
+ \let\hairline\hboxedhairline
+ \let\\\hboxednewline
+ \let\next\doformatboxNoSize
+ \fi
+ \fi
+ \setextraframedoffsets
+ \edef\framedbackground{\framedparameter\c!background}%
+ \ifx\framedbackground\empty
+ \let\framedforgetall\forgetall
+ \else
+ \let\framedforgetall\relax
+ \forgetall
+ \fi
+ \edef\framedwidth {\ifdim\!!framedwidth >\zeropoint\the\!!framedwidth \else\!!zeropoint\fi}% a new feature, visible for user
+ \edef\framedheight{\ifdim\!!framedheight>\zeropoint\the\!!framedheight\else\!!zeropoint\fi}% a new feature, visible for user
+ \edef\framedoffset{\the\dimexpr\ifboxhasoffset\localoffset\else\zeropoint\fi}%
+ \@@startframedorientation
+ \afterassignment\dodowithframebox
+ \setbox\framebox\next}
+
+\def\dowithframebox
+ {% moved : \let\postprocessframebox\relax
+ \stoplocalframed}
+
+\def\dodowithframebox
+ {\aftergroup\dowithframebox}
+
+\let\doafterframedbox \relax
+\let\dobeforeframedbox\relax
+
+%D Carefull analysis of this macro will learn us that not all
+%D branches in the last conditionals can be encountered, that
+%D is, some assignments to \type{\next} will never occur.
+%D Nevertheless we implement the whole scheme, if not for
+%D future extensions.
+
+%D \macros
+%D {ifreshapeframebox}
+%D
+%D The last few lines tell what to do after the content of the
+%D box is collected and passed to the next macro. In the case
+%D of a fixed width and centered alignment, the content is
+%D evaluated and used to determine the most natural width. The
+%D rest of the code deals with backgrounds and frames.
+
+\newif\ifreshapeframebox \reshapeframeboxtrue
+
+%D Beware: setting \type {top} and \type {bottom} to nothing, may
+%D result in a frame that is larger that the given height! try:
+%D
+%D \starttyping
+%D \framed
+%D [height=3cm,top=,bottom=,offset=overlay]
+%D {\strut test \shapefill \strut test}
+%D \stoptyping
+%D
+%D This is intended behaviour and not a bug! One can always set
+%D
+%D \starttyping
+%D ...,bottom=\kern0pt,...
+%D \stoptyping
+
+\unexpanded\def\stoplocalframed
+ {\dontshowcomposition
+ \@@stopframedorientation % hm, wrong place ! should rotate the result (after reshape)
+ \handleframedlocator\c!before\@@locallocation
+ \ifboxhasformat
+ \ifx\@@localautowidth\v!force
+ \ifreshapeframebox\doreshapeframedbox\fi
+ \boxhaswidthfalse
+ \else
+ \ifx\localwidth\v!fit
+ \ifx\@@localautowidth\v!yes
+ \ifreshapeframebox\doreshapeframedbox\fi
+ \fi
+ \boxhaswidthfalse
+ \else\ifx\localwidth\v!fixed
+ \boxhaswidthfalse
+ \else
+ \resetshapeframebox
+ \fi\fi
+ \fi
+ \ifconditional\boxcontentneedsprocessing
+ \mkdoprocessboxcontents\framebox
+ \fi
+ \else
+ \resetshapeframebox
+ \fi
+ \ifboxhaswidth
+ \wd\framebox\!!framedwidth
+ \fi
+ \ifboxhasheight
+ \ht\framebox\!!framedheight
+ \fi
+ \doif{\framedparameter\c!empty}\v!yes\dosetfakedframebox
+ \ifboxhasextraoffset
+ \applyextraframedoffsets
+ \fi
+ \ifboxhasoffset
+ \dooffsetframebox
+ \fi
+ \ifboxisoverlaid \else
+ \dolocateframebox
+ \fi
+ \ifx\postprocessframebox\relax \else
+ \let\next\postprocessframebox
+ \let\postprocessframebox\relax % prevent nesting
+ \next\framebox
+ \fi
+ \edef\overlaylinecolor{\framedparameter\c!framecolor}%
+ \edef\overlaylinewidth{\the\ruledlinewidth}% \@@...
+ \ifboxhasframe % real or invisible frame
+ \dooutlinebox
+ \fi
+ \ifx\framedbackground\empty\else\dobackedbox\fi
+ \handleframedlocator\c!after\@@locallocation
+ \box\framebox
+ \egroup
+ \egroup}
+
+\def\dosetfakedframebox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\wd\framebox
+ \ht\scratchbox\ht\framebox
+ \dp\scratchbox\dp\framebox
+ \setbox\framebox\box\scratchbox}
+
+% test: (saves one forgetall)
+%
+% \edef\framedbackground{\framedparameter\c!background}%
+% \ifx\framedbackground\empty
+% \let\framedforgetall\forgetall
+% \else
+% \let\framedforgetall\relax
+% \forgetall
+% \fi
+
+\def\installframedlocator#1#2#3%
+ {\setvalue{\??oi:\c!location:\c!before:#1}{#2}%
+ \setvalue{\??oi:\c!location:\c!after :#1}{#3}}
+
+\def\handleframedlocator#1#2%
+ {\csname\??oi:\c!location:#1:#2\endcsname}
+
+\def\doprelocframedbox#1%
+ {\scratchdimen\dimexpr#1+\ruledlinewidth\relax
+ \ifboxhasoffset
+ \advance\scratchdimen \framedparameter\c!offset
+ \fi
+ \scratchskip\dimexpr\ht\framebox-\scratchdimen\relax}
+
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=hanging]{location\\equals\\hanging}
+% \framed[width=2cm,align=middle,location=depth] {location\\equals\\depth}
+% \framed[width=2cm,align=middle,location=height] {location\\equals\\height}
+% B}
+% \vskip2cm
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=low] {location\\equals\\low}
+% \framed[width=2cm,align=middle,location=line] {location\\equals\\line}
+% \framed[width=2cm,align=middle,location=high] {location\\equals\\high}
+% B}
+% \vskip2cm
+% \ruledhbox
+% {A
+% \framed[width=2cm,align=middle,location=top] {location\\equals\\top}
+% \framed[width=2cm,align=middle,location=bottom] {location\\equals\\bottom}
+% \framed[width=2cm,align=middle,location=lohi] {location\\equals\\lohi}
+% \framed[width=2cm,align=middle,location=middle] {location\\equals\\middle}
+% B}
+
+\installframedlocator \v!hanging % best with strut=no
+ {}
+ {\dp\framebox\ht\framebox
+ \ht\framebox\zeropoint}
+
+\installframedlocator \v!depth
+ {}
+ {\ht\framebox\dimexpr\ht\framebox-\strutdp\relax
+ \dp\framebox\strutdp
+ \box\framebox}
+
+\installframedlocator \v!height
+ {}
+ {\dp\framebox\dimexpr\ht\framebox-\strutht\relax
+ \ht\framebox\strutht
+ \box\framebox}
+
+\installframedlocator \v!high
+ {}
+ {\doprelocframedbox\strutht
+ \setbox\framebox\hbox{\lower\scratchskip\box\framebox}%
+ \ht\framebox\strutht
+ \dp\framebox\strutdp
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!line
+ {}
+ {\setbox\framebox\hbox{\lower.5\ht\framebox\box\framebox}%
+ \ht\framebox.5\lineheight
+ \dp\framebox.5\lineheight
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!low
+ {}
+ {\doprelocframedbox\strutdp
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\strutht
+ \dp\framebox\strutdp
+ \box\framebox}
+
+\installframedlocator \v!top
+ {}
+ {\doprelocframedbox\strutht
+ \setbox\framebox\hbox{\lower\scratchskip\box\framebox}%
+ \ht\framebox\scratchdimen
+ \dp\framebox\scratchskip
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!middle
+ {}
+ {\scratchdimen.5\ht\framebox
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\scratchdimen
+ \dp\framebox\scratchdimen
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!lohi
+ {\handleframedlocator\c!before\v!middle}
+ {\handleframedlocator\c!after \v!middle}
+
+\installframedlocator \v!bottom
+ {}
+ {\doprelocframedbox\strutdp
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\scratchskip
+ \dp\framebox\scratchdimen
+ \hbox{\box\framebox}}
+
+\installframedlocator \v!keep % retains height/depth
+ {\removeframedboxdepth}
+ {\restoreframedboxdepth}
+
+% also used in fastlocalframed
+
+\newdimen\originalframedwd
+\newdimen\originalframedht
+\newdimen\originalframeddp
+
+\def\removeframedboxdepth
+ {\originalframedwd\wd\framebox
+ \originalframedht\ht\framebox
+ \originalframeddp\dp\framebox
+ \ifzeropt\originalframeddp\else\setbox\framebox\hbox{\raise\originalframeddp\box\framebox}\fi
+ \wd\framebox\originalframedwd
+ \ht\framebox\dimexpr\originalframedht+\originalframeddp\relax
+ \dp\framebox\zeropoint}
+
+\def\restoreframedboxdepth
+ {\ifzeropt\originalframeddp\else\setbox\framebox\hbox{\lower\originalframeddp\box\framebox}\fi
+ \wd\framebox\originalframedwd
+ \ht\framebox\originalframedht
+ \dp\framebox\originalframeddp}
+
+% \let\@@startframedorientation\relax
+% \let\@@stopframedorientation \relax
+
+% \framed[width=12cm,height=3cm,orientation=0]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=90]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=180]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=270]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-90]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-180]{\input ward\relax}
+% \framed[width=12cm,height=3cm,orientation=-270]{\input ward\relax}
+
+\def\@@startframedorientation
+ {\let\@@stopframedorientation \relax
+ \ifx\@@localorientation\empty\else
+ \ifcase\@@localorientation\else
+ \scratchcounter\@@localorientation
+ \divide\scratchcounter\plustwo
+ \ifodd\scratchcounter
+ \swapmacros\framedwidth \framedheight
+ \swapmacros\localwidth \localheight
+ \swapdimens\!!framedheight\!!framedwidth
+ \def\@@stopframedorientation{\@@dostopframedorientation\plusone}%
+ \else
+ \def\@@stopframedorientation{\@@dostopframedorientation\zerocount}%
+ \fi
+ \fi
+ \fi}
+
+\def\@@dostopframedorientation#1%
+ {\ifcase#1\else
+ \swapmacros\framedwidth \framedheight
+ \swapmacros\localwidth \localheight
+ \swapdimens\!!framedheight\!!framedwidth
+ \fi
+ \setbox\framebox\hbox{\dorotatebox\@@localorientation\hbox{\box\framebox}}}
+
+%D The last conditional takes care of the special situation of
+%D in||line \inframed[height=3cm]{framed} boxes. Such boxes have
+%D to be \inframed{aligned} with the running text.
+
+\def\doinframed[#1]% we could omit #1] but readibility ...
+ {\framed[\c!location=\v!low,#1]}
+
+\unexpanded\def\inframed
+ {\dosingleempty\doinframed}
+
+%D When we set \type{empty} to \type{yes}, we get
+%D ourselves a frame and/or background, but no content, so
+%D actually we have a sort of phantom framed box.
+
+%D Because color marks and specials can interfere with
+%D spacing, we provide a way to specify a foregroundcolor.
+
+\def\docolorframebox
+ {\doifcolor\framedforegroundcolor
+ {\setbox\framebox\hbox{\faststartcolor[\framedforegroundcolor]\box\framebox\faststopcolor}}}
+ %{\setbox\framebox\hbox{\doactivatecolor\framedforegroundcolor\box\framebox}}}
+
+%D \macros
+%D {mframed, minframed}
+%D
+%D When Tobias asked how to frame mathematical elements in
+%D formulas, Taco's posted the next macro:
+%D
+%D \starttyping
+%D \def\mframed#1%
+%D {\relax
+%D \ifmmode
+%D \vcenter{\hbox{\framed{$\ifinner\else\displaystyle\fi#1$}}}%
+%D \else
+%D \framed{$#1$}%
+%D \fi}
+%D \stoptyping
+%D
+%D Because \type {\ifinner} does not (always) reports what
+%D one would expect, we move the test to the outer level. We
+%D also want to pass arguments,
+%D
+%D \starttyping
+%D \def\mframed%
+%D {\dosingleempty\domframed}
+%D
+%D \def\domframed[#1]#2% % tzt \dowithnextmathbox ?
+%D {\relax
+%D \ifmmode
+%D \ifinner
+%D \inframed[#1]{$#2$}%
+%D \else
+%D \vcenter{\hbox{\framed[#1]{$\displaystyle#2$}}}%
+%D \fi
+%D \else
+%D \inframed[#1]{$#2$}%
+%D \fi}
+%D \stoptyping
+%D
+%D Still better is the next alternative, if only because it
+%D takes care of setting the super- and subscripts styles
+
+\newcount\mframedstyle
+
+\def\doinlinemframed[#1]#2%
+ {\begingroup
+ \mframedstyle\mathstyle\relax
+ \inframed[#1]{\Ustartmath\triggermathstyle\mframedstyle#2\Ustopmath}%
+ \endgroup}
+
+\def\funnymathstrut{\Ustartmath\triggermathstyle\mframedstyle\vphantom{(}\Ustopmath}
+
+\def\dodisplaymframed[#1]#2%
+ {\begingroup
+ \mframedstyle\mathstyle\relax
+ \let\normalstrut\funnymathstrut
+ \framed[#1]{\Ustartmath\triggermathstyle\mframedstyle#2\Ustopmath}%
+ \endgroup}
+
+\def\mframed {\dosingleempty\dodisplaymframed}
+\def\inmframed{\dosingleempty\doinlinemframed }
+
+%D So instead of the rather versatile \type {\framed}, we ue
+%D the \type {\mframed}.
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y^{z_z}
+%D x \times \inmframed{y} \times y^{z_z}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D However, we got into troubles when we want to nest sub- and
+%D superscripts, like in
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y^{\mframed{z}_{\mframed{z}}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D Therefore, we can best use \type {\super} and \type {\suber}
+%D instead of \type {^} and \type {_}. Both commands take care
+%D of proper font switching.
+%D
+%D \startbuffer
+%D \startformula
+%D x \times \mframed{y} \times y\super{\mframed{z}\suber{\mframed{z}}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D As usual, one can specify in what way the text should be
+%D framed. One should be aware of the fact that, inorder to
+%D preserve the proper spacing, the \type {offset} is set to
+%D \type {overlay} and \type {frameoffset} is used used
+%D instead.
+%D
+%D \startbuffer
+%D \startformula
+%D x \times y\super{\mframed[framecolor=red]{z}\suber{z}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D For inline use, we also provide the \type {\inmframed}
+%D alternative: we want $x \times \inmframed{y}$ in inline
+%D math, right?
+
+%D This previous framing macros needs a lot of alternatives for
+%D putting rules around boxes, inserting offsets and aligning
+%D text. Each step is handled by separate macros.
+
+\def\dowidenframebox#1%
+ {\setbox\framebox\vbox
+ {\kern#1\hbox{\kern#1\box\framebox\kern#1}\kern#1}}
+
+\def\dooffsetframebox{\dowidenframebox\localoffset}
+\def\dolocateframebox{\dowidenframebox\ruledlinewidth}
+
+%D Let's hope that the next few examples show us enough of
+%D what needs to be done by the auxiliary macros.
+%D
+%D \startbuffer
+%D \framed[height=1cm,offset=.5cm] {rule based learning}
+%D \framed[height=1cm,offset=0cm] {rule based learning}
+%D \framed[height=1cm,offset=none] {rule based learning}
+%D \framed[height=1cm,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[offset=.5cm] {rule based learning}
+%D \framed[offset=0cm] {rule based learning}
+%D \framed[offset=none] {rule based learning}
+%D \framed[offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[strut=nee,offset=.5cm] {rule based learning}
+%D \framed[strut=nee,offset=0cm] {rule based learning}
+%D \framed[strut=nee,offset=none] {rule based learning}
+%D \framed[strut=nee,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D \startbuffer
+%D \framed[width=3cm,align=left] {rule\\based\\learning}
+%D \framed[width=3cm,align=middle] {rule\\based\\learning}
+%D \framed[width=3cm,align=right] {rule\\based\\learning}
+%D \framed[width=fit,align=middle] {rule\\based\\learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\dontcomplain\getbuffer}
+%D \stoplinecorrection
+%D
+%D So now we're ready for the complicated stuff. We distinguish
+%D between borders with straight lines and those with round
+%D corners. When using the first alternative it is possible to
+%D turn off one or more lines. More fancy shapes are also
+%D possible by specifying dedicated backgrounds. Turning lines
+%D on and off is implemented as efficient as possible and as a
+%D result is interface language dependant. This next
+%D implementation evolved from simpler ones. It puts for
+%D instance the rules on top of the content and provides
+%D additional offset capabilities. The lot of calls to other
+%D macros makes this mechanism not that easy to comprehend.
+
+%D We handle left, right or middle alignment as well as fixed
+%D or free widths and heights. Each combination gets its own
+%D macro.
+
+%D The following code handles one-liners: \type{align={line,flushright}}.
+%D Beware, since we entered a group and either or not grab the next
+%D bgroup token, we need to finish the group in the oneliner mode.
+
+\ifx\raggedoneliner\undefined \chardef\raggedoneliner\zerocount \fi
+
+\def\doformatonelinerbox % beware: assumes explicit preceding bgroup
+ {\ifcase\raggedoneliner
+ \expandafter\nodoformatonelinerbox
+ \else
+ \expandafter\dodoformatonelinerbox
+ \fi}
+
+\def\dodoformatonelinerbox
+ {\dowithnextboxcontent
+ {\ignorespaces}
+ {\hbox to \hsize
+ {\ifcase\raggedstatus\or\hss\or\hss\fi
+ \unhbox\nextbox \removeunwantedspaces
+ \ifcase\raggedstatus\or \or\hss\or\hss\fi}%
+ \egroup}
+ \hbox}
+
+\def\nodoformatonelinerbox % grabs {
+ {\let\next=}
+
+%D The handlers:
+
+\def\framedforgetall{\forgetall}
+
+\def\setframedforegroundcolor
+ {\edef\colorattributehash{\framedparameterhash\c!foregroundcolor}%
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash\c!foregroundcolor\fi}
+
+\def\doformatboxSomeFormat
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \framedforgetall
+ \setframedforegroundcolor
+ \oninterlineskip
+ \hsize\!!framedwidth
+ \vsize\!!framedheight
+ \doframedsetups
+ \raggedcommand
+ \dobeforeframedbox
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\doafterframedbox
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxNoFormat
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \framedforgetall
+ \setframedforegroundcolor
+ \oninterlineskip
+ \hsize\!!framedwidth
+ \vsize\!!framedheight
+ \doframedsetups
+ \raggedcenter
+ \vss
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxHeight
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \framedforgetall
+ \setframedforegroundcolor
+ \oninterlineskip
+ \doframedsetups
+ \raggedcommand
+ \vss
+ \bgroup
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \localbegstrut
+ \doformatonelinerbox}
+
+\def\doformatboxWidth
+ {\vbox
+ \bgroup
+ \let\postprocessframebox\relax
+ \framedforgetall
+ \setframedforegroundcolor
+ \oninterlineskip
+ \hsize\!!framedwidth
+ \doframedsetups
+ \raggedcommand
+ \dobeforeframedbox
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\doafterframedbox
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxVSize
+ {\vbox to \!!framedheight
+ \bgroup
+ \let\postprocessframebox\relax
+ \framedforgetall
+ \setframedforegroundcolor
+ \vsize\!!framedheight
+ \doframedsetups
+ \vss
+ \bgroup
+ \aftergroup\vss
+ \aftergroup\egroup
+ \hbox
+ \bgroup
+ \aftergroup\egroup
+ \localstrut
+ \doformatonelinerbox}
+
+\def\doformatboxHSize
+ {\hbox to \!!framedwidth
+ \bgroup
+ \let\postprocessframebox\relax
+ \framedforgetall
+ \setframedforegroundcolor
+ \doframedsetups
+ \hss
+ \localstrut
+ \bgroup
+ \aftergroup\hss
+ \aftergroup\egroup
+ \doformatonelinerbox}
+
+\def\doformatboxNoSize
+ {\hbox
+ \bgroup
+ \setframedforegroundcolor
+ \let\postprocessframebox\relax
+ \doframedsetups
+ \localstrut
+ \doformatonelinerbox}
+
+\let\doframedsetups\relax
+
+%D On the next page we show some examples of how these macros
+%D come into action. The examples show us how
+%D \type {fit}, \type {broad} dimensions influence the
+%D formatting. Watch the visualized struts. \footnote {Here we
+%D used \type {\showstruts}.}
+%D
+%D \startpostponing
+%D \bgroup
+%D \showstruts
+%D \dontcomplain
+%D \startlinecorrection
+%D \halign{#\enskip&#\enskip&#\enskip&#\enskip&#\enskip&#\cr
+%D \framed[width=.2\hsize, height=.2\hsize, align=] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=yes] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=yes] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=yes] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=yes] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=yes] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=yes] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=right] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=right] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=right] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=right] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=right] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=right] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=left] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=left] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=left] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=left] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=left] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=left] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \framed[width=.2\hsize, height=.2\hsize, align=middle] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=broad, align=middle] {a\par b\par c}&
+%D \framed[width=.2\hsize, height=fit, align=middle] {a\par b\par c}&
+%D \framed[width=fit, height=.2\hsize, align=middle] {a\par b\par c}&
+%D \framed[width=fit, height=broad, align=middle] {a\par b\par c}&
+%D \framed[width=fit, height=fit, align=middle] {a\par b\par c}\cr}
+%D \stoplinecorrection
+%D \blank[2*big]
+%D \egroup
+%D \stoppostponing
+
+%D \macros
+%D {framednoflines, framedlastlength}
+%D
+%D It is possible to let the frame macro calculate the width
+%D of a centered box automatically (\type {fit}). When
+%D doing so, we need to reshape the box:
+
+\newcount\framednoflines
+\newdimen\framedlastlength
+
+\def\resetshapeframebox
+ {\framednoflines \zerocount
+ \framedlastlength\zeropoint}
+
+\let\framedboxwidth \!!zeropoint
+\let\framedboxheight\!!zeropoint
+\let\framedboxdepth \!!zeropoint
+
+\def\doreshapeframedbox{\ifvbox\framebox\ctxlua{commands.doreshapeframedbox(\number\framebox)}\fi}
+
+%D The two variables \type {\framednoflines} and \type
+%D {\framedlastlength} can be used in a second pass to
+%D optimized framed material.
+
+% torture test / strange case (much depth) / method 2 needed
+%
+% \startTEXpage[frame=on]
+% \startformula \startalign \NC A \NC B \NR \intertext{test} \NC C \NC D \NR \stopalign \stopformula
+% test outside formula
+% \startformula \startalign \NC A \NC B \NR \intertext{test} \NC C \NC D \NR \stopalign \stopformula
+% \blank[big]
+% \startformula \startalign \NC \int_01 \NC B \NR \intertext{test} \NC \int_01 \NC D \NR \stopalign \stopformula
+% test outside formula
+% \startformula \startalign \NC \int_01 \NC B \NR \intertext{test} \NC \int_01 \NC D \NR \stopalign \stopformula
+% \stopTEXpage
+
+%D The examples on the next page show how one can give the
+%D frame as well as the background an additional offset and
+%D even a bit more depth. The blue outline is the frame, the
+%D red box is the background and the small black outline is the
+%D visualization of the resulting box, that is, we applied
+%D \type{\ruledhbox} to the result.
+
+%D \startpostponing
+%D \bgroup
+%D \unprotect
+%D \dontcomplain
+%D
+%D \startbuffer
+%D \vbox to \vsize
+%D \bgroup
+%D \startalignment[middle]
+%D \vss
+%D \dontleavehmode\vbox to .8\vsize
+%D \bgroup
+%D \hsize=300pt
+%D \setupframed
+%D [background=color,
+%D backgroundcolorachtergrondkleur=darkred,
+%D width=300pt,
+%D height=60pt,
+%D framecolorkaderkleur=DemoBlue,
+%D rulethickness=2pt]
+%D \def\status%
+%D {backgroundoffset=\the\dimexpr\framedparameter\c!backgroundoffset\relax\\
+%D frameoffset=\the\dimexpr\framedparameter\c!frameoffset\relax\\
+%D depth=\the\dimexpr\framedparameter\c!depth\relax}
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=0pt,frameoffset=0pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=0pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=0pt,frameoffset=5pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=2pt,frameoffset=5pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=2pt]{\status}}
+%D \vss
+%D \dontleavehmode \ruledhbox{\framed[backgroundoffset=5pt,frameoffset=5pt]{\status}}
+%D \egroup
+%D \vss
+%D \stopalignment
+%D \egroup
+%D \stopbuffer
+%D
+%D \getbuffer \page
+%D
+%D {\setupframed[depth=4pt]\getbuffer} \page
+%D
+%D \protect
+%D \egroup
+%D \stoppostponing
+
+%D When typesetting the framed box inline, we have to keep the
+%D baseline intact outside as well as inside the framed box.
+
+\def\doinlineframedbox
+ {\scratchdimen\dimexpr\strutdp+\ruledlinewidth\relax
+ \ifboxhasoffset
+ \advance\scratchdimen \framedparameter\c!offset
+ \fi
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
+ \ht\framebox\strutht
+ \dp\framebox\strutdp
+ \box\framebox}
+
+%D We can also lower the box over the natural depth of the
+%D line.
+
+\def\doloweredframedbox
+ {\ht\framebox\dimexpr\ht\framebox+\dp\framebox-\strutdp\relax
+ \dp\framebox\strutdp
+ \box\framebox}
+
+%D Hanging the content is mainly meant for cases like the
+%D following:
+%D
+%D \starttyping
+%D \framed[strut=no]
+%D {\framed[height=2cm,location=hanging]{test}%
+%D \framed[height=1cm,location=hanging]{test}}
+%D \stoptyping
+
+\def\dohangingframedbox % best with strut=no
+ {\scratchdimen\dimexpr\ht\framebox+\dp\framebox\relax
+ \ht\framebox\zeropoint
+ \dp\framebox\scratchdimen}
+
+%D We can draw lines from left to right and top to bottom by
+%D using the normal \type{\hairline} command. Both directions
+%D need a different treatment.
+%D
+%D \startbuffer
+%D \framed[width=4cm] {alfa\hairline beta\hairline gamma}
+%D \framed[height=2cm] {alfa\hairline beta\hairline gamma}
+%D \framed[width=4cm,height=2cm]{alfa\hairline beta\hairline gamma}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \hbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D These macros try to adapt their behaviour as good as
+%D possible to the circumstances and act as natural as
+%D possible.
+
+\def\vboxedhairline
+ {\bgroup
+ \dimen2=\ifboxhasoffset \localoffset \else \zeropoint \fi
+ \dimen4=\dimexpr\dimen2+\ruledlinewidth\relax
+ \setbox0\vbox
+ {\advance\hsize 2\dimen4
+ \vskip\dimen2
+ \hrule
+ \!!height\ruledlinewidth
+ \!!depth\zeropoint
+ \!!width\hsize
+ \vskip\dimen2}%
+ %\endgraf\nointerlineskip\endgraf
+ %\moveleft\dimen4\box0
+ %\endgraf\nointerlineskip\localbegstrut
+ \endgraf\obeydepth\nointerlineskip
+ \moveleft\dimen4\box0
+ \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
+ \dimen2=\ifboxhasoffset \localoffset \else \zeropoint \fi
+ \ifboxhasheight
+ \dimen4\dimexpr\localheight/2+\strutdp-2\ruledlinewidth\relax
+ \dimen6\dimexpr\localheight/2-\strutdp+2\ruledlinewidth\relax
+ \else
+ \dimen4\dimexpr\strutht+\dimen2\relax
+ \dimen6\dimexpr\strutdp+\dimen2\relax
+ \fi
+ \unskip
+ \setbox\scratchbox\hbox
+ {\hskip\dimen2
+ \vrule\!!height\dimen4\!!depth\dimen6\!!width\ruledlinewidth
+ \hskip\dimen2}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \box\scratchbox
+ \ignorespaces
+ \egroup}
+
+%D The argument of the frame command accepts \type{\\} as a
+%D sort of newline signal. In horizontal boxes it expands to a
+%D space.
+
+\def\vboxednewline
+ {\endgraf\ignorespaces}
+
+\def\hboxednewline
+ {\unskip\normalspace\ignorespaces}
+
+%D We can set each rule on or off. The default setting is
+%D inherited from \type{frame}. An earlier implementation
+%D use a bit different approach, but the new one seems more
+%D natural:
+%D
+%D \bgroup
+%D \setuptyping[margin=0pt]
+%D \startlinecorrection
+%D \startbuffer
+%D \framed[offset=overlay,frame=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=on,bottomframe=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=on,bottomframe=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off,bottomframe=off]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \framed[offset=overlay,frame=off,bottomframe=on]{\darkred\blackrule}
+%D \stopbuffer
+%D \hbox{\getbuffer\vbox{\typebuffer}}
+%D \stoplinecorrection
+%D \egroup
+
+%D \macros
+%D {setupblackrules}
+%D
+%D The graphic capabilities of \TEX\ do not go beyond simple
+%D filled rules, except of course when using specials. Let's
+%D start with a warning: using this commands is far more slower
+%D than using the \TEX\ primitives \type{\hrule} and
+%D \type{\vrule}, but they save us some tokens. The
+%D characteristics of these rule drawing command can be set by:
+%D
+%D \showsetup{setupblackrules}
+
+\unexpanded\def\setupblackrules
+ {\dodoubleargument\getparameters[\??bj]}
+
+%D \macros
+%D {blackrule}
+%D
+%D The simple command draws only one rule. Its optional
+%D argument can be used to specify the dimensions. By setting
+%D the width, height or depth to \type {max}, one gets the
+%D natural dimensions.
+%D
+%D \showsetup{blackrule}
+
+\def\complexblackrule[#1]%
+ {\hbox\bgroup\getparameters[\??bj][#1]\domakeblackrule\egroup}
+
+\def\simpleblackrule
+ {\hbox\bgroup\domakeblackrule\egroup}
+
+\def\domakeblackrule
+ {\doif\@@bjwidth \v!max{\def\@@bjwidth {1em}}%
+ \doif\@@bjheight\v!max{\setstrut\let\setstrut\relax\def\@@bjheight{\strutht}}%
+ \doif\@@bjdepth \v!max{\setstrut\def\@@bjdepth {\strutdp}}%
+ \startcolor[\@@bjcolor]% can be made faster, just direct attr
+ \vrule
+ \!!width \@@bjwidth
+ \!!height\@@bjheight
+ \!!depth \@@bjdepth
+ \stopcolor}
+
+\definecomplexorsimple\blackrule
+
+%D \macros
+%D {blackrules}
+%D
+%D One can call for a sequence of black rules, if needed
+%D equally spaced over the given width.
+%D
+%D \showsetup{blackrules}
+%D
+%D The two alternative calls are therefore:
+%D
+%D \startbuffer
+%D Tell me, is this according to the \blackrules[n=6]?
+%D These \blackrules[alternativevariant=b,n=10,distance=.2em,width=4cm] are quite clear.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D We could of course have implemented this macro using
+%D \type{\leaders}, but this would probably have taken more
+%D tokens.
+
+\def\doblackrules[#1]%
+ {\hbox\bgroup
+ \getparameters[\??bj][#1]%
+ \!!widtha\@@bjwidth
+ \!!widthb\@@bjdistance
+ \doif\@@bjalternative\c!b
+ {\scratchcounter\@@bjn
+ \ifnum\scratchcounter=\plusone
+ \!!widthb\zeropoint
+ \else
+ \advance\scratchcounter \minusone
+ \advance\!!widtha -\scratchcounter\!!widthb
+ \divide \!!widtha \@@bjn
+ \fi}%
+ \startcolor[\@@bjcolor]%
+ \dorecurse\@@bjn
+ {\vrule
+ \!!width \!!widtha
+ \!!height\@@bjheight
+ \!!depth \@@bjdepth
+ \hskip\!!widthb}%
+ \unskip
+ \stopcolor
+ \egroup}
+
+\unexpanded\def\blackrules
+ {\dosingleempty\doblackrules}
+
+%D The next commands can be used to draw margin rules. We
+%D support two methods: \marginrule{one for in||line use} and
+%D one that acts on a paragraph. Drawing a margin rule is
+%D rather straightforward because we can use the commands that
+%D put text in the margin.
+
+\def\dodrawmarginrule
+ {\setbox\scratchbox\hbox
+ {\vrule\!!depth\strutdepth\!!height\strutheight\!!width\@@karulethickness}%
+ \smashbox\scratchbox % no \vsmash !!!
+ \box\scratchbox}
+
+\def\drawmarginrule
+ {\strut\inleft{\dodrawmarginrule}}
+
+%D \macros
+%D {marginrule}
+%D
+%D The first method gobbles words and simply puts a bar in the
+%D margin. This method is not entirely robust.
+%D
+%D \showsetup{marginrule}
+
+\definecomplexorsimple\marginrule
+
+\def\simplemarginrule
+ {\let\processword\drawmarginrule
+ \processwords}
+
+\def\complexmarginrule[#1]%
+ {\ifnum#1<\@@kalevel\relax \else
+ \def\@@kadefaultwidth{#1}%
+ \expandafter\simplemarginrule
+ \fi}
+
+%D We need an auxiliary variable
+
+\def\@@kadefaultwidth{1}
+
+%D \macros
+%D {setupmarginrules}
+%D
+%D This macro definitions show us that we can pass an optional
+%D level, which is matched against the previous set one. The
+%D level can be set up with
+%D
+%D \showsetup{setupmarginrules}
+
+\unexpanded\def\setupmarginrules
+ {\dodoubleargument\getparameters[\??ka]}
+
+%D \macros
+%D {startmarginrule}
+%D
+%D The second method collects text and reformats it afterwards,
+%D using the shapebox macros. We prevent local margin rules.
+%D
+%D \showsetup{startmarginrule}
+
+\definecomplexorsimple\startmarginrule
+
+\def\simplestartmarginrule
+ {\bgroup
+ \let\drawmarginrule\relax
+ \let\stopmarginrule\dostopmarginrule
+ \beginofshapebox}
+
+\def\complexstartmarginrule[#1]%
+ {\bgroup
+ \let\drawmarginrule\relax
+ \ifnum#1<\@@kalevel\relax
+ \let\stopmarginrule\egroup
+ \else
+ \def\@@kadefaultwidth{#1}%
+ \let\stopmarginrule\dostopmarginrule
+ \expandafter\beginofshapebox
+ \fi}
+
+\def\dostopmarginrule
+ {\endofshapebox
+ \reshapebox
+ {\hbox{\inleftmargin{\dodrawmarginrule}\box\shapebox}}%
+ \flushshapebox
+ \egroup}
+
+%D \startbuffer
+%D \setupmarginrules[level=5]
+%D
+%D \startmarginrule[1]
+%D First we set the level at~5. Next we typeset this first
+%D paragraph as a level~1 one. As expected no rule show up.
+%D \stopmarginrule
+%D
+%D \startmarginrule[5]
+%D The second paragraph is a level~5 one. As we can see here,
+%D the marginal rule gets a width according to its level.
+%D \stopmarginrule
+%D
+%D \startmarginrule[8]
+%D It will of course be no surprise that this third paragraph
+%D has a even thicker margin rule. This behavior can be
+%D overruled by specifying the width explictly.
+%D \stopmarginrule
+%D \stopbuffer
+%D
+%D In next example we show most features. Watch the rule
+%D thickness adapting itself to the level.
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D We just said:
+%D
+%D \typebuffer
+
+%D \macros
+%D {vl, hl}
+%D
+%D The command \type{\vl} draws a vertical rule \vl\ with strut
+%D dimensions, multiplied with the factor specified in the
+%D optional argument. The height and depth are clipped \vl[3]
+%D to the baselinedistance. Its horizontal counterpart
+%D \type{\hl} draws a horizontal rule \hl\ with a width of 1em,
+%D multiplied with the optional factor. The horizontal rule is
+%D drawn on top of the baseline.
+%D
+%D \showsetup{vl}
+%D \showsetup{hl}
+
+\def\dovlwdhtdp#1#2#3%
+ {\bgroup
+ \!!dimena#2\strutht
+ \!!dimenb#3\strutdp
+ \setbox\scratchbox\hbox
+ {\vrule
+ \!!width #1\linewidth
+ \!!height\!!dimena
+ \!!depth \!!dimenb}%
+ \dp\scratchbox\strutdp
+ \ht\scratchbox\strutht
+ \box\scratchbox
+ \egroup}
+
+\def\complexvl[#1]%
+ {\dovlwdhtdp{1}{#1}{#1}}
+
+\def\complexhl[#1]%
+ {\hbox
+ {\vrule
+ \!!width #1\s!em
+ \!!height\linewidth
+ \!!depth \zeropoint}}
+
+\definecomplexorsimple\vl \def\simplevl{\complexvl[1]}
+\definecomplexorsimple\hl \def\simplehl{\complexhl[1]}
+
+%D \macros
+%D {hairline, thinrule, thinrules, setupthinrules}
+%D
+%D Drawing thin lines can of course easily be accomplished by
+%D the \TEX\ primitives \type{\hrule} and \type{\vrule}. The
+%D next few macros however free us from some specifications.
+%D
+%D \startbuffer
+%D some text
+%D
+%D \hairline
+%D
+%D some more text
+%D
+%D \thinrule
+%D
+%D more and more text
+%D
+%D hi \thinrule\ there
+%D
+%D and then the final text
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D becomes
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D So we've got
+%D
+%D \showsetup{hairline}
+%D \showsetup{thinrule}
+%D
+%D Both can be set up with:
+%D
+%D \showsetup{setupthinrules}
+%D
+%D We also have
+%D
+%D \showsetup{thinrules}
+%D
+%D which looks like: \thinrules[n=2]
+
+\def\thinrule
+ {\strut
+ \bgroup
+ \chardef\ruletype\plusone
+ \processaction
+ [\@@dlalternative]
+ [ \v!a=>\chardef\ruletype0,% no line
+ %\v!b=>\chardef\ruletype1,% height/depth
+ \v!c=>\chardef\ruletype2,% topheight/botdepth
+ % 11=>\chardef\ruletype1,% fallback for backgrounds
+ 0=>\chardef\ruletype0,% compatible with backgrounds
+ % 1=>\chardef\ruletype1,% compatible with backgrounds
+ 2=>\chardef\ruletype2]% compatible with backgrounds
+ \doifsomething\@@dlrulethickness
+ {\linewidth\@@dlrulethickness}%
+ \ifdim\linewidth=\zeropoint
+ \chardef\ruletype\zerocount
+ \else
+ \doifnot\@@dlframe\v!on{\chardef\ruletype\zerocount}%
+ \fi
+ \ifnum\ruletype=\plusone
+ \doif\@@dlheight\v!max{\let\@@dlheight\!!plusone}%
+ \doif\@@dldepth \v!max{\let\@@dldepth \!!plusone}%
+ \else
+ \let\@@dlheight\!!plusone
+ \let\@@dldepth\!!plusone
+ \fi
+ \freezedimensionwithunit\@@dlheight\strutht
+ \freezedimensionwithunit\@@dldepth\strutdp
+ \divide\linewidth \plustwo
+ \doifelse\@@dlbackground\v!color
+ {\startcolor[\@@dlbackgroundcolor]%
+ \ifnum\ruletype=\plustwo % prevent overshoot due to rounding
+ \leaders
+ \hrule
+ \!!height\dimexpr\@@dlheight-.5\linewidth\relax
+ \!!depth \dimexpr\@@dldepth -.5\linewidth\relax
+ \hfill
+ \else
+ \leaders
+ \hrule
+ \!!height\@@dlheight
+ \!!depth \@@dldepth
+ \hfill
+ \fi
+ \stopcolor
+ \ifcase\ruletype
+ % no rule
+ \or
+ \startcolor[\@@dlcolor]%
+ \hfillneg
+ \leaders\hrule\!!height\linewidth\!!depth\linewidth\hfill
+ \stopcolor
+ \or
+ \startcolor[\@@dlcolor]%
+ \hfillneg\leaders\hrule\!!height\dimexpr-\@@dldepth+\linewidth\relax\!!depth\@@dldepth\hfill
+ \hfillneg\leaders\hrule\!!height\@@dlheight\!!depth\dimexpr-\@@dlheight+\linewidth\relax\hfill
+ \stopcolor
+ \fi}
+ {\ifcase\ruletype \else
+ \startcolor[\@@dlcolor]%
+ \leaders\hrule\!!height\@@dlheight\!!depth\@@dldepth\hfill
+ \stopcolor
+ \fi}%
+ \strut
+ \carryoverpar\egroup}
+
+\def\hairline
+ {\endgraf
+ \thinrule
+ \endgraf}
+
+\def\dosetupthinrules[#1]%
+ {\getparameters[\??dl][#1]}
+
+\unexpanded\def\setupthinrules
+ {\dosingleargument\dosetupthinrules}
+
+\def\dothinrules[#1]%
+ {\bgroup
+ \dosetupthinrules[#1]%
+ \@@dlbefore
+ \assignvalue\@@dlinterlinespace\@@dlinterlinespace{1.0}{1.5}{2.0}%
+ \spacing\@@dlinterlinespace
+ \dorecurse\@@dln
+ {\ifnum\recurselevel=\@@dln \dothinrulesnobreak \else
+ \ifnum\recurselevel=2 \dothinrulesnobreak \fi\fi
+ \thinrule
+ \ifnum\recurselevel<\@@dln\relax
+ % test needed, else messed up whitespace
+ \ifx\@@dlinbetween\empty
+ \softbreak
+ \else
+ \endgraf
+ \nowhitespace
+ \@@dlinbetween
+ \fi
+ \fi}%
+ \doifelsenothing\@@dlafter
+ {\carryoverpar\egroup}
+ {\@@dlafter\egroup}}
+
+\def\thinrules
+ {\dosingleempty\dothinrules}
+
+%D A couple of examples are given below.
+%D
+%D \startbuffer
+%D \setupthinrules[n=3,inbetween=,color=gray]
+%D
+%D test test \thinrules\ test test \par
+%D test test \thinrules [color=green] test test \par
+%D test test \thinrules [height=max, depth=max] test test \par
+%D
+%D \setupthinrules[height=.9,depth=.9]
+%D
+%D test test \thinrules\ test test \par
+%D test test \thinrules [alternativevariant=b] test test \par
+%D test test \thinrules [alternativevariant=c] test test \par
+%D test test \thinrules [alternativevariant=c,inbetween=\vskip2ex] test test \par
+%D \stopbuffer
+%D
+%D \typebuffer {\getbuffer}
+%D
+%D There are a couple of alternative ways to visualize rules
+%D using backgrounds. At first sight these may look strange,
+%D but they make sense in educational settings. The
+%D alternatives are more or less compatible with the more
+%D advanced \METAPOST\ based implementation.
+%D
+%D \startbuffer[a]
+%D \setupthinrules
+%D [n=2,
+%D backgroundcolor=gray ,
+%D rulethickness=1pt,
+%D colorkleur=donkerblauw,
+%D after=\blank,
+%D before=\blank]
+%D \stopbuffer
+%D
+%D \typebuffer[a]
+%D
+%D \startbuffer[b]
+%D \thinrules[alternativevariant=a]
+%D \thinrules[alternativevariant=b]
+%D \thinrules[alternativevariant=c]
+%D \stopbuffer
+%D
+%D \typebuffer[b] \getbuffer[a,b]
+%D
+%D \startbuffer[b]
+%D \thinrules[alternativevariant=a,background=color]
+%D \thinrules[alternativevariant=b,background=color]
+%D \thinrules[alternativevariant=c,background=color]
+%D \stopbuffer
+%D
+%D \typebuffer[b] \getbuffer[a,b]
+%D
+%D \startbuffer[b]
+%D \thinrules[alternativevariant=a,height=.8,depth=.8,background=color]
+%D \thinrules[alternativevariant=b,height=.8,depth=.8,background=color]
+%D \thinrules[alternativevariant=c,height=.8,depth=.8,background=color]
+%D \stopbuffer
+%D
+%D \typebuffer[b] \getbuffer[a,b]
+
+%D \macros
+%D {optimizethinrules}
+%D
+%D By saying \type {\thinrulestrue} or \type {-false}, we
+%D can influence the way dangling lines are handled.
+
+\newif\ifoptimizethinrules \optimizethinrulestrue
+
+\def\dothinrulesnobreak
+ {\ifoptimizethinrules\penalty500\fi}
+
+%D \macros
+%D {startframedtext, setupframedtexts, defineframedtext}
+%D
+%D The general framing command we discussed previously, is not
+%D entirely suited for what we call framed texts, as for
+%D instance used in intermezzo's. The next examples show what
+%D we have in mind.
+%D
+%D \startbuffer[framed-0]
+%D \setupframedtexts
+%D [frame=off,
+%D width=\hsize,
+%D background=screen]
+%D
+%D \startframedtext
+%D By default the framed text is centered \dots
+%D \stopframedtext
+%D
+%D \startframedtext[right]
+%D \dots\ but we can also align left, middle and right.
+%D \stopframedtext
+%D \stopbuffer
+%D
+%D \startbuffer[framed-1]
+%D \defineframedtext
+%D [Example]
+%D [width=6cm,
+%D height=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-1]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-2]
+%D \defineframedtext
+%D [Example]
+%D [width=6cm]
+%D
+%D \startExample
+%D \typebuffer[framed-2]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-3]
+%D \defineframedtext
+%D [Example]
+%D [height=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-3]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-4]
+%D \defineframedtext
+%D [Example]
+%D [width=fit,height=broad]
+%D
+%D \Example{a very exciting example}
+%D \stopbuffer
+%D
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-0] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-1] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-2] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-3] \egroup
+%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-4] \egroup
+%D
+%D Here we can see that we have a predefined framed text class
+%D as well as the tools for defining our own. So we have:
+%D
+%D \showsetup{setupframedtexts}
+%D
+%D as well as the definition command:
+%D
+%D \showsetup{defineframedtext}
+%D
+%D that generates two commands:
+%D
+%D \showsetup{start<<framedtext>>}
+%D \showsetup{<<framedtext>>}
+%D
+%D The next definition shows the defaults.
+
+\def\dodefineframedtext[#1][#2]%
+ {\presetlocalframed[\??kd#1]%
+ \getparameters[\??kd#1]
+ [\c!width=0.75\hsize,
+ \c!height=\v!fit,
+ \c!align=\v!yes,
+ \c!top=,
+ \c!bottom=\vfill,
+ \c!offset=1em,
+ \c!bodyfont=,
+ \c!style=,
+ \c!color=,
+ \c!left=,
+ \c!right=\hfill,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!inner=,
+ \c!frame=\v!on,
+ \c!topframe=,
+ \c!bottomframe=,
+ \c!leftframe=,
+ \c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!foregroundcolor=,
+ \c!foregroundstyle=,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!linecorrection=\v!on,
+ \c!depthcorrection=\v!on,
+ \c!margin=\v!standard,
+ \c!orientation=,
+ \c!indenting=,
+ #2]%
+ \setuvalue{\e!start#1}{\dostartframedtext[#1]}%
+ \setuvalue{\e!stop #1}{\dostopframedtext }%
+ \setuvalue {#1}{\doframedtext [#1]}}
+
+\unexpanded\def\defineframedtext
+ {\dodoubleempty\dodefineframedtext}
+
+%D We define the general (and original) case by just saying:
+
+\defineframedtext[\v!framedtext]
+
+%D We need several steps before the actual job is done,
+%D because we have to handle an optional identifier (and
+%D because these commands evolved out of a single case).
+
+\def\framedtextparameter#1#2% todo: currentframedtext
+ {\csname\??kd#1#2\endcsname}
+
+\def\dosetupframedtexts[#1][#2]%
+ {\ifsecondargument
+ \def\docommand##1{\getparameters[\??kd##1][#2]}%
+ \processcommacommand[#1]\docommand % new, #1 may be macro
+ \else
+ \getparameters[\??kd\v!framedtext][#1]%
+ \fi}
+
+\unexpanded\def\setupframedtexts
+ {\dodoubleempty\dosetupframedtexts}
+
+\def\dostartframedtext
+ {\bgroup\dotripleempty\dodostartframedtext}
+
+\def\dodostartframedtext[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\dododostartframedtext[#1][][#2]}
+ {\dododostartframedtext[#1][#2][#3]}}
+
+\setfalse\framedtextlocationnone
+
+\def\checkframedtext % messy dependency
+ {\ifinsidefloat
+ \localhsize\hsize
+ \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
+ % \strut % rather clean way to invoke the sidefloat OTR
+ % \setbox0=\lastbox % and get the widths set, so from now on we
+ % \setlocalhsize % can have framed texts alongside sidefloats
+ \checksidefloat
+ \setlocalhsize
+ \else
+ \localhsize\hsize
+ \fi\fi}
+
+\def\dododostartframedtext[#1][#2][#3]% #3 only passed to framed, not to framedtext
+ {\doifsomething{#2}{\setvalue{\??kd#1\c!location}{#2}}% does not listen to #3
+ \setfalse\framedtextlocationnone
+ \processaction % \v!low en \v!depth are already taken !
+ [\framedtextparameter{#1}\c!location]
+ [ \v!left=>\letvalue{\??kd#1\c!left }\relax
+ \letvalue{\??kd#1\c!right}\hfill,
+ \v!right=>\letvalue{\??kd#1\c!left }\hfill
+ \letvalue{\??kd#1\c!right}\relax,
+ \v!middle=>\letvalue{\??kd#1\c!left }\hfill
+ \letvalue{\??kd#1\c!right}\hfill,
+ \v!none=>\letvalue{\??kd#1\c!left }\relax % new
+ \letvalue{\??kd#1\c!right}\relax % new
+ \settrue\framedtextlocationnone]%
+ \letvalue{\??kd#1\c!location}\empty
+ % removed 06/2001
+ % \forgetparindent
+ % added 06/2001 [see demo-bbv]
+ \localhsize\hsize \checkframedtext
+ % so far
+ \setbox\framebox\vbox
+ \startboxedcontent
+ \hsize\localhsize
+ % \insidefloattrue % ? better
+ \normalexpanded{\noexpand\switchtobodyfont[\framedtextparameter{#1}\c!bodyfont]}%
+ \startcolor[\framedtextparameter{#1}\c!color]%
+ \localframed[\??kd#1][\c!strut=\v!no,#3]% todo: use delayedstrut
+ \bgroup
+ \let\\=\endgraf
+ \framedtextparameter{#1}\c!inner % oud spul
+ \doifvalue{\??kd#1\c!depthcorrection}\v!on % new, inside box
+ {\bgroup
+ \verticalstrut
+ % we need \nowhitespace in case of setups setting whitespace
+ % nb, not safe, text vs \vbox as next
+ \vskip-\struttotal
+ \nowhitespace % na vskip ! new 20/05/2004, fails with next content being box (\scale{..})
+ }%
+ \doinhibitblank % \blank[\v!disable]% plaatst signal
+\setupindenting[\framedtextparameter{#1}\c!indenting]%
+ \doconvertfont{\framedtextparameter{#1}\c!style}\empty
+ \def\dostopframedtext{\dodostopframedtext{#1}{#2}}}
+
+%D The \type {none} option is handy for nested usage, as
+%D in the presentation styles, where we don't want
+%D interference.
+
+\def\dodostopframedtext#1#2% % no \baselinecorrection, see faq docs
+ {\endgraf
+ \removelastskip
+ \doifvalue{\??kd#1\c!depthcorrection}\v!on % local and global
+ {\forgetall
+ \vskip-\struttotal
+ \verticalstrut
+ \egroup
+ \forgetall % brrr too often
+ \vskip-\lineheight
+ % will be an option, not default
+ % \setbaselinecorrections
+ % \donegbotbaselinecorrection
+ \verticalstrut}
+ \stopboxedcontent
+ \stopcolor
+ \ifconditional\framedtextlocationnone
+ \egroup
+ \box\framebox
+ \else\ifinsidefloat
+ \egroup
+ \box\framebox
+ \else
+ \egroup
+ \doplacement[\??kd#1][\c!depthcorrection=\v!off]{\box\framebox}%
+ \fi\fi
+ \egroup}
+
+%D Placement can be ignored:
+%D
+%D \starttyping
+%D \hbox to \hsize \bgroup
+%D \startframedtext[none][width=.5\textwidth] \input tufte \stopframedtext
+%D \startframedtext[none][width=.5\textwidth] \input zapf \stopframedtext
+%D \egroup
+%D
+%D \hbox to \hsize \bgroup
+%D \setupframedtexts[location=none]%
+%D \startframedtext[width=.5\textwidth] \input zapf \stopframedtext
+%D \startframedtext[width=.5\textwidth] \input tufte \stopframedtext
+%D \egroup
+%D \stoptyping
+
+%D The simple brace (or group) delimited case is typeset
+%D slightly different and is not aligned.
+
+\def\doframedtext
+ {\bgroup\dodoubleempty\dodoframedtext}
+
+\def\dodoframedtext[#1][#2]% beware!
+ {\normalexpanded{\noexpand\switchtobodyfont[\getvalue{\??kd#1\c!bodyfont}]}%
+ \localframed[\??kd#1][\c!strut=\v!no,#2]%
+ \bgroup
+ \blank[\v!disable]%
+ \let\\=\endgraf
+ \getvalue{\??kd#1\c!inner}% % kleur naar outer level
+ \dostartattributes{\??kd#1}\c!style\c!color\empty
+ \bgroup
+ \aftergroup\docloseframedtext
+ \let\next=}
+
+\def\docloseframedtext
+ {\removelastskip
+ \dostopattributes
+ \egroup
+ \egroup}
+
+%D \macros
+%D {defineframed}
+%D
+%D One can also define simple framed texts, using:
+%D
+%D \showsetup{defineframed}
+
+\unexpanded\def\defineframed
+ {\dodoubleempty\dodefineframed}
+
+\def\dodefineframed[#1][#2]%
+ {\iffirstargument
+ \setuvalue{#1}{\dodoubleempty\doframed[#2]}%
+ \fi}
+
+\def\doframed[#1][#2]%
+ {\framed[#1,#2]}
+
+%D \macros
+%D {textrule, starttextrule, setuptextrules}
+%D
+%D Putting rules before and after a paragraph is very space
+%D sensitive, but the next command handles that quite well. It
+%D comes in two disguises:
+%D
+%D \startbuffer
+%D \textrule[top]{fragments}
+%D \input reich
+%D \textrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \getbuffer \egroup
+%D
+%D \startbuffer
+%D \setuptextrules
+%D [width=90pt,distance=12pt,rulecolor=blue,
+%D bodyfont=small,style=\sc,color=red]
+%D
+%D \starttextrule{Ship Building Tools}
+%D \nl \setuptolerance[tolerant] \input materie
+%D \stoptextrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \getbuffer \egroup
+%D
+%D \startbuffer
+%D \setuptextrules
+%D [location=inmargin,
+%D bodyfont=small,style=slantedbold]
+%D
+%D \starttextrule{wonderful}
+%D \input tufte
+%D \stoptextrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \getbuffer \egroup
+%D
+%D The formal definition of these commands is:
+%D
+%D \showsetup{textrule}
+%D \showsetup{starttextrule}
+%D \showsetup{setuptextrules}
+%D
+%D The implementation looks a bit complicated due to the
+%D optional arguments.
+
+\unexpanded\def\setuptextrules
+ {\dodoubleargument\getparameters[\??tl]}
+
+\def\complextextrule[#1]% if needed we can make it installable
+ {\let\next\dobottomtextrule
+ \processaction
+ [#1]
+ [ \v!top=>\let\next\dotoptextrule,
+ \v!middle=>\let\next\domiddletextrule,
+ \v!bottom=>\let\next\dobottomtextrule]%
+ \dosinglegroupempty\next}
+
+\definecomplexorsimple\textrule
+
+\def\simpletextrule
+ {\dosinglegroupempty\dounknowntextrule}
+
+\def\docomplextextrule#1%
+ {\bgroup
+ \advance\hsize\dimexpr-\rightskip-\leftskip\relax
+ \setbox\scratchbox\hbox to \hsize
+ {\dimen4\dimexpr .5ex+.5\linewidth\relax
+ \dimen6\dimexpr-.5ex+.5\linewidth\relax
+ \doifsomething{#1}
+ {\doifelse\@@tllocation\v!inmargin
+ {\llap{\doattributes\??tl\c!style\c!color{#1}\hskip\leftmargindistance}}
+ {\color[\@@tlrulecolor]
+ {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlwidth}%
+ \hbox spread 2\dimexpr\@@tldistance\relax
+ {\hss\doattributes\??tl\c!style\c!color{\strut#1}\hss}}}%
+ \color[\@@tlrulecolor]
+ {\leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \noindent\box\scratchbox
+%\nobreak\verticalstrut\kern-\struttotal
+% evt \witruimte
+ \egroup}
+
+\def\dotoptextrule#1%
+ {\page[\v!preference] % interferes
+ %\whitespace % no
+ \@@tlbefore
+ \docomplextextrule{#1}%
+% todo, option: \doifnothing{#1}{\ruledvskip-.5ex}
+ \nowhitespace
+ \@@tlinbetween
+ \endgraf}
+
+\def\dodobottomtextrule#1#2%
+ {\ifhmode
+ \endgraf
+ \fi
+ \dimen0\strutdp
+ \ifdim\prevdepth>\strutdp\else % was <\strutdp
+ \ifdim\prevdepth>\zeropoint
+ \advance\dimen0 -\prevdepth
+ \fi
+ \fi
+ \advance\dimen0 .5ex
+ \vskip\dimen0
+% ==
+% \vskip\dimexpr \strutdp + .5ex
+% \ifdim\prevdepth>\strutdp\else\ifdim\prevdepth>\zeropoint-\prevdepth\fi\fi\relax
+%
+ \@@tlinbetween
+ \doifelsenothing{#2}
+ {\bgroup
+ \advance\hsize\dimexpr-\rightskip-\leftskip\relax
+ \nointerlineskip
+ \moveleft-\leftskip\vbox
+ {\color[\@@tlrulecolor]
+ {\hrule\!!depth\linewidth\!!height\zeropoint\!!width\hsize}}%
+ \egroup}
+ {\docomplextextrule{#2}}%
+ \ifvmode\prevdepth\zeropoint\fi
+ #1%
+ \page[\v!preference]}
+
+\def\dobottomtextrule
+ {\dodobottomtextrule\@@tlafter}
+
+\def\domiddletextrule
+ {\dodobottomtextrule\@@tlinbetween}
+
+\def\dounknowntextrule
+ {\iffirstargument
+ \@EA\dotoptextrule
+ \else
+ \@EA\dobottomtextrule\@EA\empty
+ \fi}
+
+%D The grouped commands also supports bodyfont switching:
+
+\unexpanded\def\starttextrule#1%
+ {\bgroup
+ \def\dounknowntextrule{\domiddletextrule}
+ \dotoptextrule{#1}
+ \bgroup
+ \doifsomething\@@tlbodyfont{\switchtobodyfont[\@@tlbodyfont]}}
+
+\unexpanded\def\stoptextrule
+ {\par
+ \egroup
+ \dobottomtextrule\empty
+ \egroup}
+
+%D \macros
+%D {fillinrules, setupfillinrules}
+%D
+%D The next few commands do not really deserve a place in a
+%D core module, because they deal with specific typography.
+%D Nevertheless I decided to make them part of the core,
+%D because they permit us to make questionaires. Let's start
+%D with some examples.
+%D
+%D \fillinrules[n=2,width=fit]{first}
+%D \fillinrules[n=2,width=broad]{first}
+%D \fillinrules[n=2,width=3cm]{first}
+%D \fillinrules[n=2,width=3cm,distance=.5em,separator=:]{first}
+%D \fillinrules[n=2]{first}{last}
+%D \fillintext{first}{last} \input reich \par
+%D
+%D The main command is \type{\fillinrules}. This command takes
+%D one and an optional second argument and sets a paragraph with
+%D empty visualized lines.
+%D
+%D \showsetup{fillinrules}
+%D \showsetup{setupfillinrules}
+
+\unexpanded\def\setupfillinrules
+ {\dodoubleargument\getparameters[\??il]}
+
+\definecomplexorsimpleempty\fillinrules
+
+\def\complexfillinrules[#1]%
+ {\def\docomplexfillinrules##1##2%
+ {\dodocomplexfillinrules[#1]{##1}{##2}{\thinrules
+ [\c!n=\@@iln,\c!interlinespace=\@@ilinterlinespace,\c!before=,\c!after=]}}%
+ \dodoublegroupempty\docomplexfillinrules}
+
+\def\dodocomplexfillinrules[#1]#2#3#4%
+ {\endgraf
+ \@@ilbefore
+ \begingroup
+ \setupfillinrules[#1]%
+ \noindent
+ \doifsomething{#2}
+ {\doifelse\@@ilwidth\v!fit
+ {\let\@@ildistance\!!zeropoint
+ \hbox}
+ {\doifelse\@@ilwidth\v!broad
+ {\hbox}
+ {\hbox to \@@ilwidth}}%
+ \bgroup
+ \doattributes\??il\c!style\c!color{\strut#2\hfill\@@ilseparator}%
+ \hskip\@@ildistance
+ \egroup}%
+ %\hangindent=\wd0\relax % tzt hang=yes,n
+ %\parindent=\hangindent
+ %\box0\relax
+ \setupwhitespace[\v!big]%
+ \ignorespaces
+ #4%
+ \doifsomething{#3}
+ {\kern\@@ildistance
+ \doattributes\??il\c!style\c!color{#3\strut}}%
+ \endgroup
+ \endgraf
+ \@@ilafter}
+
+%D \macros
+%D {fillintext}
+%D
+%D To provide compatible layouts when texts and lines are
+%D mixed, one can typeset a paragraph by using the command
+%D \type{\fillintext}.
+%D
+%D \showsetup{fillintext}
+
+\definecomplexorsimpleempty\fillintext
+
+\def\complexfillintext[#1]% rather rough, using an \unhbox is suboptimal
+ {\def\docomplexfillintext##1##2%
+ {\dowithnextbox
+ {\dodocomplexfillinrules[#1]{##1}{\hfill##2}{\unhbox\nextbox\unskip}}%
+ \hbox\bgroup\let\par\egroup\ignorespaces}%
+ \dodoublegroupempty\docomplexfillintext}
+
+%D \macros
+%D {fillinline, setupfillinlines}
+%D
+%D Another member of the family takes care of putting a (often
+%D small) rule after a piece of text, like
+%D
+%D \startbuffer
+%D \fillinline \input reich \par
+%D \fillinline[margin=0cm] \input reich \par
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D which was typeset by saying:
+%D
+%D \typebuffer
+%D
+%D The two commands that take care of this are:
+%D
+%D \showsetup{fillinline}
+%D \showsetup{setupfillinlines}
+
+\unexpanded\def\setupfillinlines
+ {\dodoubleargument\getparameters[\??iv]}
+
+\definecomplexorsimpleempty\fillinline
+
+\def\complexfillinline[#1]%
+ {%\endgraf % interferes with \definedescription cum suis
+ \@@ivbefore
+ \begingroup
+ \setupfillinlines[#1]%
+ \advance\rightskip \@@ivmargin
+ \parfillskip\zeropoint
+ \def\par % very dangerous
+ {\let\par\endgraf % -)
+ \ifhmode\unskip\hfill\fi
+ \scratchdimen\dimexpr\@@ivwidth-\@@ivdistance\relax
+ \ifdim\scratchdimen>\@@ivmargin\else\expandafter\rlap\fi
+ {\kern\@@ivdistance
+ \vrule
+ \!!width \scratchdimen
+ \!!height.5\linewidth
+ \!!depth .5\linewidth}%
+ \endgraf % !
+ \endgroup
+ \endgraf % !
+ \@@ilafter}}
+
+%D \stopdocumentation
+%D \bgroup
+%D
+%D \setupframedtexts
+%D [setuptext]
+%D [background=color,backgroundcolor=white]
+%D
+%D \startbuffer
+%D \setupbackground
+%D [backgroundoffset=4pt,
+%D background=screen,
+%D frame=on,
+%D framecolor=red,
+%D leftoffset=2pt]
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \startbackground
+%D
+%D \macros
+%D {setupbackground,startbackground,background}
+%D
+%D The section deals with backgrounds in the running text. This
+%D means that texts is to be collected and split over pages. To
+%D show what can be done, we provide this part of the
+%D documentation with some gray background and a red frame.
+%D Both the background and frame can have all characteristics
+%D of \type{\framed}. This time we used the setting:
+%D
+%D \typebuffer
+%D
+%D The implementation is not that sophisticated, but suffices.
+%D The main problem with this kind of functionality is to get
+%D the spacing all right.
+
+%D Specifying the background is more or less the same as
+%D specifying a framed box.
+%D
+%D \showsetup{setupbackground}
+
+\presetlocalframed[\??ag]
+
+\def\dosetupbackground[#1]%
+ {\getparameters[\??ag][#1]%
+ \doifelse\@@agstate\v!start
+ {\let\startbackground\dostartbackground
+ \let\stopbackground \dostopbackground
+ \let\background \dobackground}
+ {\let\startbackground\relax
+ \let\stopbackground \relax
+ \let\background \relax}}
+
+\unexpanded\def\setupbackground
+ {\dosingleargument\dosetupbackground}
+
+%D Actually typesetting the background is implemented rather
+%D straightforward. We need to handle some spacing as well as
+%D the (often) a bit smaller horizontal size.
+%D
+%D \showsetup{startbackground}
+%D
+%D Although we could have used a scratch one, we first
+%D declare a boolean.
+
+% 0=no-split, 1=no-split+indent, 2=split, 3=split+indent
+
+\chardef\backgroundsplitmode\plusthree
+
+%D The \type{\vbox to \lineheight{}\vskip\zeropoint}
+%D construction gives the first real line a decent height by
+%D adding a dummy line.
+
+\def\dostartbackground
+ {\endgraf
+ \bgroup
+ \setbox0\vbox\bgroup
+ \vbox to \lineheight{}\vskip\zeropoint
+ \blank[\v!disable]
+ % \advance\hsize -\@@agleftoffset
+ % \advance\hsize -\@@agrightoffset
+ \leftskip \@@agleftoffset % new **
+ \rightskip\@@agrightoffset} % new **
+
+%D This dummy line is removed by \type{\setbox2=\vsplit0 to
+%D \lineheight}. That way \type{\topskip} takes care of the
+%D lineheight. I'll probably forget to apply this trick
+%D elsewhere.
+
+\def\dostopbackground % improved version (i hope)
+ {\endgraf
+ \removelastskip
+ \egroup
+ \dimen2\leftskip % new **
+ \forgetall
+ \ifinsidefloat
+ \chardef\backgroundsplitmode\zerocount
+ \fi
+ \ifcase\backgroundsplitmode
+ \localframed[\??ag][\c!offset=\v!overlay]{\box0}%
+ \or
+ \hskip\dimen2
+ \localframed[\??ag][\c!offset=\v!overlay]{\box0}%
+ \else
+ \splitmaxdepth\boxmaxdepth
+ \splittopskip\topskip
+ \setbox2\vsplit0 to \lineheight % get rid of fake line
+ \loop
+ \ifdim\pagetotal=\zeropoint % empty page
+ \scratchdimen\textheight
+ \chardef\backgroundsplit\plusone % split to max height
+ \else
+ \setbox\scratchbox\vbox{\@@agbefore}%
+ \scratchdimen\dimexpr\pagegoal-\ht\scratchbox-\pagetotal\relax
+ \chardef\backgroundsplit\plustwo % split to partial height
+ \fi
+ \advance\scratchdimen\dimexpr-\@@agtopoffset-\@@agbottomoffset\relax
+ \ifdim\scratchdimen>2\lineheight\relax % reasonable, will be configurable
+ \ifdim\ht0>\scratchdimen % larger than page
+ \setbox2\vsplit0 to \scratchdimen
+ \else
+ \setbox2\box0
+ \chardef\backgroundsplit\zerocount % no split
+ \fi
+ \setbox2\vbox \ifcase\backgroundsplit\or to \textheight \fi % max split
+ {\vskip\@@agtopoffset
+ \unvcopy2
+ \prevdepth\dp2
+ \obeydepth
+ \vskip\@@agbottomoffset
+ \vfill}
+ \@@agbefore
+ \ifcase\backgroundsplit\or\or % partial split
+ \ifdim\pagegoal<\maxdimen
+ \pagegoal=1.2\pagegoal % be a bit more tolerant
+ \fi
+ \fi
+ \startlinecorrection
+ %\localframed[\??ag][\c!offset=\v!overlay]{\hskip\@@agleftoffset\box2\hskip\@@agrightoffset}%
+ \ifnum\backgroundsplitmode=\plusthree \hskip\dimen2 \fi %
+ \localframed[\??ag][\c!offset=\v!overlay]{\box2}% new **
+ \stoplinecorrection
+ \ifcase\backgroundsplit % no split
+ \@@agafter
+ \else % some split
+ \vfill\eject % geen \page !
+ \fi
+ \else
+ \page
+ \fi
+ \ifdim\ht0>\zeropoint \repeat
+ \fi
+ \egroup
+ \endgraf}
+
+%D As a bonus we also have a short command, that is of not
+%D much use, but kept there for historic reasons.
+%D
+%D \showsetup{background}
+
+\def\dobackground
+ {\bgroup
+ \dowithnextbox
+ {\localframed[\??ag][\c!offset=\v!overlay]{\flushnextbox}\egroup}
+ \vbox}
+
+%D \stopdocumentation
+%D \stopbackground
+%D \egroup
+
+%D New, for the moment private; let's see when GB finds out
+%D about this one and its obscure usage. It's used in:
+%D
+%D \startbuffer
+%D \defineframedtext
+%D [tabulateframe]
+%D [offset=overlay,
+%D backgroundoffset=3pt,
+%D background=color,
+%D backgroundcolor=green]
+%D
+%D \setuptabulate
+%D [tabulate]
+%D [frame=tabulateframe]
+%D
+%D \setuptables
+%D [frame=tabulateframe]
+%D
+%D \input tufte
+%D
+%D \starttabulate[|l|l|]
+%D \NC test \NC test \NC \NR \NC test \NC test \NC \NR
+%D \NC test \NC test \NC \NR \NC test \NC test \NC \NR
+%D \stoptabulate
+%D
+%D \input tufte
+%D
+%D \starttable[|l|l|]
+%D \NC test \NC test \NC \AR \NC test \NC test \NC \AR
+%D \NC test \NC test \NC \AR \NC test \NC test \NC \AR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+
+% \unexpanded\def\defineframedcontent
+% {\dodoubleempty\dodefineframedcontent}
+%
+% \def\dodefineframedcontent[#1][#2]%
+% {\presetlocalframed[\??fc#1]%
+% \getparameters[\??fc#1]
+% [\c!leftoffset=\zeropoint,
+% \c!rightoffset=\getvalue{\??fc#1\c!leftoffset},
+% \c!topoffset=\zeropoint,
+% \c!bottomoffset=\getvalue{\??fc#1\c!topoffset},
+% \c!strut=\v!no,
+% \c!offset=\v!overlay,
+% \c!linecorrection=\v!no,
+% \c!left=,
+% \c!right=,
+% #2]}
+%
+% \unexpanded\def\setupframedcontent
+% {\dodoubleempty\dosetupframedcontent}
+%
+% \def\dosetupframedcontent[#1][#2]%
+% {\def\docommand##1{\getparameters[\??fc##1][#2]}%
+% \processcommacommand[#1]\docommand}
+%
+% \unexpanded\def\startframedcontent[#1]%
+% {\bgroup
+% \doifelse{#1}\v!off
+% {\let\stopframedcontent\egroup}
+% {\ifcsname\??fc#1\c!frame\endcsname
+% \dostartframedcontent{#1}%
+% \fi}}
+%
+% \def\dostartframedcontent#1%
+% {\unexpanded\def\stopframedcontent{\dostopframedcontent{#1}}%
+% \setbox\framebox\hbox\bgroup
+% \setlocalhsize
+% \hsize\localhsize
+% \advance\hsize\dimexpr-\getvalue{\??fc#1\c!leftoffset}-\getvalue{\??fc#1\c!rightoffset} \relax
+% \advance\vsize\dimexpr-\getvalue{\??fc#1\c!topoffset} -\getvalue{\??fc#1\c!bottomoffset}\relax
+% \hskip\getvalue{\??fc#1\c!leftoffset}%
+% \vbox\bgroup
+% \vskip\getvalue{\??fc#1\c!topoffset}%
+% \vbox\bgroup
+% \forgetall
+% \blank[\v!disable]}
+%
+% \def\dostopframedcontent#1%
+% {\removelastskip
+% \egroup
+% \vskip\getvalue{\??fc#1\c!bottomoffset}%
+% \egroup
+% \hskip\getvalue{\??fc#1\c!rightoffset}%
+% \egroup
+% \doifvalue{\??fc#1\c!width}\v!fit
+% {\letvalue{\??fc#1\c!width}\v!fixed}% no shapebox
+% \ifinsidefloat
+% \donefalse
+% \else
+% \doifelsevalue{\??fc#1\c!linecorrection}\v!yes\donetrue\donefalse
+% \fi
+% % plaats ?
+% \ifdone\startlinecorrection\fi
+% \getvalue{\??fc#1\c!left}% new
+% \localframed[\??fc#1]{\box\framebox}%
+% \getvalue{\??fc#1\c!right}% new
+% \ifdone\stoplinecorrection\fi
+% \egroup}
+
+\def\framedcontentparameter #1{\csname\doframedcontentparameter{\??fc\@@framedcontent}#1\endcsname}
+\def\doframedcontentparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedcontentparentparameter\csname#1\s!parent\endcsname#2\fi}
+\def\doframedcontentparentparameter#1#2{\ifx#1\relax\s!empty\else\doframedcontentparameter#1#2\fi}
+
+\presetlocalframed[\??fc]
+
+\getparameters
+ [\??fc]
+ [\c!leftoffset=\zeropoint,
+ \c!rightoffset=\framedcontentparameter\c!leftoffset,
+ \c!topoffset=\zeropoint,
+ \c!bottomoffset=\framedcontentparameter\c!topoffset,
+ \c!strut=\v!no,
+ %\c!linecorrection=\v!no,
+ %\c!left=,
+ %\c!right=,
+ %\c!width=\v!fit,
+ \c!offset=\v!overlay]
+
+\def\letframedcontentparameter#1%
+ {\letvalue{\??fc\@@framedcontent#1}}
+
+\unexpanded\def\defineframedcontent
+ {\dodoubleempty\dodefineframedcontent}
+
+\def\dodefineframedcontent[#1][#2]%
+ {\getparameters[\??fc#1][\s!parent=\??fc,#2]}
+
+\unexpanded\def\setupframedcontent
+ {\dodoubleempty\dosetupframedcontent}
+
+\def\dosetupframedcontent[#1][#2]%
+ {\def\docommand##1{\getparameters[\??fc##1][#2]}%
+ \processcommacommand[#1]\docommand}
+
+\unexpanded\def\startframedcontent
+ {\dosingleempty\dostartframedcontent}
+
+\def\dostartframedcontent[#1]%
+ {\bgroup
+ \edef\@@framedcontent{#1}%
+ \let\stopframedcontent\egroup
+ \doifnot{#1}\v!off{\dodostartframedcontent{#1}}}
+
+\def\dodostartframedcontent#1%
+ {\unexpanded\def\stopframedcontent{\dostopframedcontent{#1}}%
+ \setbox\framebox\hbox\bgroup
+ \setlocalhsize
+ \hsize\localhsize
+ \advance\hsize\dimexpr-\framedcontentparameter\c!leftoffset-\framedcontentparameter\c!rightoffset \relax
+ \advance\vsize\dimexpr-\framedcontentparameter\c!topoffset -\framedcontentparameter\c!bottomoffset\relax
+ \hskip\framedcontentparameter\c!leftoffset
+ \vbox\bgroup
+ \vskip\framedcontentparameter\c!topoffset
+ \vbox\bgroup
+ \forgetall
+ \blank[\v!disable]}
+
+\def\dostopframedcontent#1%
+ {\removelastskip
+ \egroup
+ \vskip\framedcontentparameter\c!bottomoffset
+ \egroup
+ \hskip\framedcontentparameter\c!rightoffset
+ \egroup
+ \doif{\framedcontentparameter\c!width}\v!fit
+ {\letframedcontentparameter\c!width\v!fixed}% no shapebox
+ \ifinsidefloat
+ \donefalse
+ \else
+ \doifelse{\framedcontentparameter\c!linecorrection}\v!yes\donetrue\donefalse
+ \fi
+ % plaats ?
+ \ifdone\startlinecorrection\fi
+ \framedcontentparameter\c!left % new
+ \localframed[\??fc#1]{\box\framebox}%
+ \framedcontentparameter\c!right % new
+ \ifdone\stoplinecorrection\fi
+ \egroup}
+
+%D \macros
+%D {backgroundline}
+%D
+%D For the moment an undocumented feature, but a cancidate
+%D for going public.
+
+\def\backgroundline[#1]%
+ %{\doifsomething{#1}{\dobackgroundline{#1}}\hbox}
+ {\doifcolorelse{#1}{\dobackgroundline{#1}\hbox}\hbox}
+
+% \def\backgroundline[#1]%
+% {\doifcolor{#1}{\dobackgroundline{#1}}\hbox}
+
+\def\dobackgroundline#1%
+ {\dowithnextbox
+ {\hbox
+ {\startcolor[#1]%
+ \vrule
+ \!!width \nextboxwd
+ \!!height\nextboxht
+ \!!depth \nextboxdp
+ \stopcolor
+ \hskip-\nextboxwd
+ \flushnextbox}}}
+
+%D \macros
+%D {encircled}
+%D
+%D Some not so robust left||overs (borrowed from Knuth,
+%D \TEX Book\ page 356):
+
+\def\encircled#1%
+ {{\ooalign{\hfil\raise0.07ex\hbox{{\tx#1}}\hfil\crcr\mathhexbox20D}}}
+
+\let\omcirkeld\encircled
+
+\setuplinewidth
+ [\v!medium]
+
+\setupframed
+ [\c!width=\v!fit,
+ \c!height=\v!broad,
+ \c!lines=,
+ \c!offset=0.25ex, % \defaultframeoffset
+ \c!empty=\v!no,
+ \c!frame=\v!on,
+ \c!topframe=,
+ \c!bottomframe=,
+ \c!leftframe=,
+ \c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!rulethickness=\linewidth,
+ \c!corner=\v!rectangular,
+ \c!depth=\zeropoint,
+ \c!foregroundcolor=,
+ \c!foregroundstyle=,
+ \c!background=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=,
+ \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,
+ \c!top=,
+ \c!strut=\v!yes,
+ \c!autostrut=\v!yes,
+ \c!location=\v!normal,
+ \c!orientation=,
+ \c!autowidth=\v!yes,
+ \c!setups=]
+
+\setupscreens
+ [%\c!factor=1.0, % obsolete
+ %\c!method=\v!external, % obsolete
+ \c!screen=0.95]
+
+\setupblackrules
+ [\c!n=3,
+ \c!width=1em,
+ \c!height=1ex,
+ \c!depth=\!!zeropoint,
+ \c!alternative=\c!a,
+ \c!distance=.25ex,
+ \c!color=]
+
+\setupmarginrules
+ [\c!level=0,
+ \c!rulethickness=\@@kadefaultwidth\linewidth]
+
+\setupthinrules
+ [\c!interlinespace=\v!small,
+ \c!n=3,
+ \c!before=,
+ \c!inbetween={\blank[\v!white]},
+ \c!after=,
+ \c!color=,
+ \c!height=.5\linewidth,
+ \c!depth=.5\linewidth,
+ \c!frame=\v!on, % compatible with textbackgrounds
+ \c!alternative=\v!b,
+ \c!backgroundcolor=,
+ \c!background=,
+ \c!rulethickness=]
+
+\setuptextrules
+ [\c!location=\v!left,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!inbetween=,
+ \c!width=2em,
+ \c!style=\v!bold,
+ \c!color=,
+ \c!rulecolor=,
+ \c!bodyfont=,
+ \c!distance=.5em]
+
+\setupfillinrules
+ [\c!width=\v!broad,
+ \c!distance=1em,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!n=1,
+ \c!interlinespace=\v!small,
+ \c!separator=,
+ \c!style=\v!normal,
+ \c!color=]
+
+\setupfillinlines
+ [\c!width=3cm,
+ \c!margin=\@@ivwidth,
+ \c!distance=1em,
+ \c!before=\blank,
+ \c!after=\blank]
+
+\setupbackground
+ [\c!leftoffset=.5\bodyfontsize,
+ \c!rightoffset=\@@agleftoffset,
+ \c!topoffset=\!!zeropoint,
+ \c!bottomoffset=\@@agtopoffset,
+ \c!state=\v!start,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!frame=\v!off,
+ \c!color=,
+ \c!depth=\!!zeropoint,
+ \c!background=\v!screen,
+ \c!backgroundcolor=\@@agcolor,
+ \c!screen=\@@rsscreen,
+ \c!before=,
+ \c!after=]
+
+% Experimental extension:
+
+\def\c!loffset{loffset}
+\def\c!roffset{roffset}
+\def\c!toffset{toffset}
+\def\c!boffset{boffset}
+
+\getparameters
+ [\??oi]
+ [\c!loffset=\zeropoint,
+ \c!roffset=\zeropoint,
+ \c!toffset=\zeropoint,
+ \c!boffset=\zeropoint]
+
+\newdimen\!!framedloffset
+\newdimen\!!framedroffset
+\newdimen\!!framedtoffset
+\newdimen\!!framedboffset
+
+\def\setextraframedoffsets
+ {\boxhasextraoffsetfalse
+ \!!framedloffset\framedparameter\c!loffset
+ \!!framedroffset\framedparameter\c!roffset
+ \!!framedtoffset\framedparameter\c!toffset
+ \!!framedboffset\framedparameter\c!boffset
+ \relax
+ \ifzeropt\!!framedloffset\else \advance\!!framedwidth -\!!framedloffset \boxhasextraoffsettrue \fi
+ \ifzeropt\!!framedroffset\else \advance\!!framedwidth -\!!framedroffset \boxhasextraoffsettrue \fi
+ \ifzeropt\!!framedtoffset\else \advance\!!framedheight-\!!framedtoffset \boxhasextraoffsettrue \fi
+ \ifzeropt\!!framedboffset\else \advance\!!framedheight-\!!framedboffset \boxhasextraoffsettrue \fi}
+
+\def\applyextraframedoffsets
+ {\setbox\framebox\vbox\bgroup
+ \vskip\!!framedtoffset
+ \hbox\bgroup
+ \hskip\!!framedloffset
+ \box\framebox
+ \hskip\!!framedroffset
+ \egroup
+ \vskip\!!framedboffset
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/page-app.mkii b/tex/context/base/page-app.mkii
new file mode 100644
index 000000000..e5c149aa0
--- /dev/null
+++ b/tex/context/base/page-app.mkii
@@ -0,0 +1,225 @@
+%D \module
+%D [ file=page-app, % from meta-fig
+%D version=1998.01.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Independent page building,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Applications}
+
+%D The fitting page code is moved from \type {meta-fig} to
+%D here.
+
+\unprotect
+
+\definepapersize
+ [\??fp\s!dummy]
+ [\c!width=\fittingwd,
+ \c!height=\fittinght]
+
+\definelayout
+ [\??fp\s!dummy]
+ [\c!width=\fittingwd,\c!height=\fittinght,\c!location=\v!middle,
+ \c!topspace=\!!zeropoint,\c!backspace=\!!zeropoint,
+ \c!cutspace=\!!zeropoint,\c!bottomspace=\!!zeropoint,
+ \c!textdistance=\!!zeropoint,\c!lines=0,\c!grid=\v!no,
+ \c!top=\!!zeropoint,\c!bottom=\!!zeropoint,
+ \c!margin=\!!zeropoint,\c!edge=\!!zeropoint,
+ \c!leftmargin=\!!zeropoint,\c!leftedge=\!!zeropoint,
+ \c!rightmargin=\!!zeropoint,\c!rightedge=\!!zeropoint,
+ \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
+
+
+\def\dostartfittingpage[#1][#2]%
+ {\page % this is kind of tricky! there can be preceding page refs
+ \autostarttext
+ \bgroup % resulting in a zero height page; test fig-make !
+ \def\currentfittingpage{#1}%
+ \dontcomplain
+ % runs under current page regime, i.e. page variables passed to mp
+ \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+ \setbox\scratchbox\hbox
+ \bgroup
+ % needed later \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+ \doifvalue{\currentfittingpage\c!margin}\v!page % undocumented
+ {\offsetbox
+ [\c!leftoffset=\backspace,
+ \c!rightoffset=\cutspace,
+ \c!topoffset=\topspace,
+ \c!bottomoffset=\bottomspace]\hbox}%
+ \bgroup
+ \scale[\c!scale=\getvalue{\currentfittingpage\c!scale}]%
+ \bgroup\localframed[\currentfittingpage]%
+ \bgroup}
+
+\def\dostopfittingpage
+ {\egroup % localframed
+ \egroup % scale
+ \egroup % offsetbox
+ \egroup % scratchbox
+ \edef\fittingwd{\the\wd\scratchbox}%
+ \edef\fittinght{\the\ht\scratchbox}%
+ \startlocallayout
+ \ifdim\fittinght<\lineheight
+ % write status : too small
+ \setbox\scratchbox\vbox to \lineheight{\vss\box\scratchbox\vss}%
+ \edef\fittinght{\the\lineheight}%
+ \fi
+ \let\checkcurrentlayout\relax % else interference with odd/even layout
+ \processaction
+ [\getvalue{\currentfittingpage\c!paper}]
+ [ \v!auto=>\let\fittingpapersize\printpapersize,
+ \s!unknown=>\let\fittingpapersize\commalistelement,
+ \s!default=>\def\fittingpapersize{\??fp\s!dummy}]%
+ \expanded{\setuppapersize[\??fp\s!dummy][\fittingpapersize]}%
+ \definelayout
+ [\v!page]%
+ [\c!location=\v!middle,
+ \c!width=\fittingwd,
+ \c!height=\fittinght]%
+ \setuplayout
+ [\v!page]%
+ \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!page=]%
+ \centerbox{\box\scratchbox}%
+ \stopmakeup
+ \stoplocallayout
+ \egroup
+ \autostoptext}
+
+%D \TEX\ pages (for \METAPOST\ pages, see \type {meta-fig}):
+
+\presetlocalframed[\??tg]
+
+\def\setupTEXpage
+ {\dodoubleargument\getparameters[\??tg]}
+
+\def\startTEXpage
+ {\dosingleempty\dostartTEXpage}
+
+\def\dostartTEXpage[#1]%
+ {\dostartfittingpage[\??tg][#1]\gobblespacetokens}
+
+\def\stopTEXpage
+ {\removelastspace
+ \dostopfittingpage}
+
+\setupTEXpage
+ [\c!scale=1000,
+ \c!strut=\v!no,
+ \c!align=\v!normal, % needed, else problems !
+ \c!offset=\v!overlay,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!frame=\v!off]
+
+%D For Mojca:
+%D
+%D \starttyping
+%D \startTEXstream \chapter{Bla} Hello world!\crlf Hello world! \stopTEXstream
+%D \startTEXpage \chapter{Bla} Hello world!\crlf Hello world! \stopTEXpage
+%D \stoptyping
+%D
+%D maybe I should support stream=yes in framed.
+
+\def\startTEXstream
+ {\dosingleempty\dostartTEXstream}
+
+\def\dostartTEXstream[#1]%
+ {\page
+ \defineoutputstream[tex]%
+ \enableoutputstream[tex]%
+ \def\stopTEXstream
+ {\disableoutputstream
+ \startTEXpage
+ \outputstreamunvbox[tex]%
+ \stopTEXpage}}
+
+%D Application pages (for an example, see \type {m-pstric}):
+
+\def\@@texapp{texapp}
+\def\@@texdim{texdim}
+
+\def\saveTEXapplication#1#2%
+ {\immediate\openout\scratchwrite=\bufferprefix\@@texdim.tmp
+ \immediate\write\scratchwrite{\dimen#1=\the\ht\scratchbox}%
+ \immediate\write\scratchwrite{\dimen#2=\the\wd\scratchbox}%
+ \immediate\closeout\scratchwrite}
+
+\def\restoreTEXapplication
+ {\readlocfile{\bufferprefix\@@texdim.tmp}\donothing\donothing}
+
+\def\startTEXapplication
+ {\dosingleempty\dostartTEXapplication}
+
+\long\def\dostartTEXapplication[#1]#2#3\stopTEXapplication
+ {\bgroup
+ \bgroup
+ \let\f!temporaryextension\c!tex
+ \setbuffer[\@@texapp]%
+ \starttext
+ #2% preamble
+ \startTEXpage[#1]%
+ \topskip\zeropoint
+ \setbox\scratchbox\hbox{#3}%
+ \saveTEXapplication02% dimensions
+ \box\scratchbox
+ \stopTEXpage
+ \stoptext
+ \endbuffer
+ \egroup
+ \doifelse\jobsuffix{dvi}\donetrue\donefalse
+ \executesystemcommand{texexec \bufferprefix\@@texapp.tex --once --batch}%
+ \ifdone % eps
+ \executesystemcommand{dvips -E* -o \@@texapp.eps \@@texapp}%
+ \else % pdf
+ \executesystemcommand{dvips \bufferprefix\@@texapp}%
+ \executesystemcommand{ps2pdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+% \executesystemcommand{texmfstart pstopdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+ \fi
+ \restoreTEXapplication % dimensions
+ \doifelse\jobsuffix{dvi}\donetrue\donefalse
+ \setbox\scratchbox\hbox
+ {\expanded{\externalfigure
+ [\bufferprefix\@@texapp.\ifdone eps\else pdf\fi]
+ [\c!object=\v!no]}}%
+ \setbox\scratchbox\hbox
+ {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}%
+ \wd\scratchbox\dimen0
+ \ht\scratchbox\dimen2
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \egroup}
+
+%D \macros
+%D {startpagefigure}
+%D
+%D \starttyping
+%D \starttext \pagefigure[two.1] \stoptext
+%D \stoptyping
+
+\def\startpagefigure
+ {\dodoubleempty\dostartpagefigure}
+
+\def\dostartpagefigure[#1][#2]%
+ {\bgroup
+ \getparameters[\??ex][\c!offset=\v!overlay,#2]%
+ \startTEXpage[\c!offset=\@@exoffset]%
+ \externalfigure[#1][#2]\ignorespaces} % so we can put some text below the graphic
+
+\def\stoppagefigure
+ {\stopTEXpage
+ \egroup}
+
+\def\pagefigure
+ {\dodoubleempty\dopagefigure}
+
+\def\dopagefigure[#1][#2]%
+ {\dostartpagefigure[#1][#2]\stoppagefigure}
+
+\protect \endinput
diff --git a/tex/context/base/page-app.mkiv b/tex/context/base/page-app.mkiv
new file mode 100644
index 000000000..7dd71cf2a
--- /dev/null
+++ b/tex/context/base/page-app.mkiv
@@ -0,0 +1,225 @@
+%D \module
+%D [ file=page-app, % from meta-fig
+%D version=1998.01.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Independent page building,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Applications}
+
+%D The fitting page code is moved from \type {meta-fig} to
+%D here.
+
+\unprotect
+
+\definepapersize
+ [\??fp\s!dummy]
+ [\c!width=\fittingwd,
+ \c!height=\fittinght]
+
+\definelayout
+ [\??fp\s!dummy]
+ [\c!width=\fittingwd,\c!height=\fittinght,\c!location=\v!middle,
+ \c!topspace=\!!zeropoint,\c!backspace=\!!zeropoint,
+ \c!cutspace=\!!zeropoint,\c!bottomspace=\!!zeropoint,
+ \c!textdistance=\!!zeropoint,\c!lines=0,\c!grid=\v!no,
+ \c!top=\!!zeropoint,\c!bottom=\!!zeropoint,
+ \c!margin=\!!zeropoint,\c!edge=\!!zeropoint,
+ \c!leftmargin=\!!zeropoint,\c!leftedge=\!!zeropoint,
+ \c!rightmargin=\!!zeropoint,\c!rightedge=\!!zeropoint,
+ \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
+
+
+\def\dostartfittingpage[#1][#2]%
+ {\page % this is kind of tricky! there can be preceding page refs
+ \autostarttext
+ \bgroup % resulting in a zero height page; test fig-make !
+ \def\currentfittingpage{#1}%
+ \dontcomplain
+ % runs under current page regime, i.e. page variables passed to mp
+ \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+ \setbox\scratchbox\hbox
+ \bgroup
+ % needed later \getparameters[\currentfittingpage][\c!paper=,#2]% auto or size or nothing
+ \doifvalue{\currentfittingpage\c!margin}\v!page % undocumented
+ {\offsetbox
+ [\c!leftoffset=\backspace,
+ \c!rightoffset=\cutspace,
+ \c!topoffset=\topspace,
+ \c!bottomoffset=\bottomspace]\hbox}%
+ \bgroup
+ \scale[\c!scale=\getvalue{\currentfittingpage\c!scale}]%
+ \bgroup\localframed[\currentfittingpage]%
+ \bgroup}
+
+\def\dostopfittingpage
+ {\egroup % localframed
+ \egroup % scale
+ \egroup % offsetbox
+ \egroup % scratchbox
+ \edef\fittingwd{\the\wd\scratchbox}%
+ \edef\fittinght{\the\ht\scratchbox}%
+ \startlocallayout
+ \ifdim\fittinght<\lineheight
+ % write status : too small
+ \setbox\scratchbox\vbox to \lineheight{\vss\box\scratchbox\vss}%
+ \edef\fittinght{\the\lineheight}%
+ \fi
+ \let\checkcurrentlayout\relax % else interference with odd/even layout
+ \processaction
+ [\getvalue{\currentfittingpage\c!paper}]
+ [ \v!auto=>\let\fittingpapersize\printpapersize,
+ \s!unknown=>\let\fittingpapersize\commalistelement,
+ \s!default=>\def\fittingpapersize{\??fp\s!dummy}]%
+ \expanded{\setuppapersize[\??fp\s!dummy][\fittingpapersize]}%
+ \definelayout
+ [\v!page]%
+ [\c!location=\v!middle,
+ \c!width=\fittingwd,
+ \c!height=\fittinght]%
+ \setuplayout
+ [\v!page]%
+ \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!page=]%
+ \centerbox{\box\scratchbox}%
+ \stopmakeup
+ \stoplocallayout
+ \egroup
+ \autostoptext}
+
+%D \TEX\ pages (for \METAPOST\ pages, see \type {meta-fig}):
+
+\presetlocalframed[\??tg]
+
+\unexpanded\def\setupTEXpage
+ {\dodoubleargument\getparameters[\??tg]}
+
+\unexpanded\def\startTEXpage
+ {\dosingleempty\dostartTEXpage}
+
+\def\dostartTEXpage[#1]%
+ {\dostartfittingpage[\??tg][#1]\gobblespacetokens}
+
+\unexpanded\def\stopTEXpage
+ {\removelastspace
+ \dostopfittingpage}
+
+\setupTEXpage
+ [\c!scale=1000,
+ \c!strut=\v!no,
+ \c!align=\v!normal, % needed, else problems !
+ \c!offset=\v!overlay,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!frame=\v!off]
+
+%D For Mojca:
+%D
+%D \starttyping
+%D \startTEXstream \chapter{Bla} Hello world!\crlf Hello world! \stopTEXstream
+%D \startTEXpage \chapter{Bla} Hello world!\crlf Hello world! \stopTEXpage
+%D \stoptyping
+%D
+%D maybe I should support stream=yes in framed.
+
+\unexpanded\def\startTEXstream
+ {\dosingleempty\dostartTEXstream}
+
+\def\dostartTEXstream[#1]%
+ {\page
+ \defineoutputstream[tex]%
+ \enableoutputstream[tex]%
+ \unexpanded\def\stopTEXstream
+ {\disableoutputstream
+ \startTEXpage
+ \outputstreamunvbox[tex]%
+ \stopTEXpage}}
+
+%D Application pages (for an example, see \type {m-pstric}):
+
+\def\@@texapp{texapp}
+\def\@@texdim{texdim}
+
+\def\saveTEXapplication#1#2%
+ {\immediate\openout\scratchwrite=\bufferprefix\@@texdim.tmp
+ \immediate\write\scratchwrite{\dimen#1=\the\ht\scratchbox}%
+ \immediate\write\scratchwrite{\dimen#2=\the\wd\scratchbox}%
+ \immediate\closeout\scratchwrite}
+
+\def\restoreTEXapplication
+ {\readlocfile{\bufferprefix\@@texdim.tmp}\donothing\donothing}
+
+\def\startTEXapplication
+ {\dosingleempty\dostartTEXapplication}
+
+\long\def\dostartTEXapplication[#1]#2#3\stopTEXapplication
+ {\bgroup
+ \bgroup
+ \let\f!temporaryextension\c!tex
+ \setbuffer[\@@texapp]%
+ \starttext
+ #2% preamble
+ \startTEXpage[#1]%
+ \topskip\zeropoint
+ \setbox\scratchbox\hbox{#3}%
+ \saveTEXapplication02% dimensions
+ \box\scratchbox
+ \stopTEXpage
+ \stoptext
+ \endbuffer
+ \egroup
+ \doifelse\jobsuffix{dvi}\donetrue\donefalse
+ \executesystemcommand{texexec \bufferprefix\@@texapp.tex --once --batch}%
+ \ifdone % eps
+ \executesystemcommand{dvips -E* -o \@@texapp.eps \@@texapp}%
+ \else % pdf
+ \executesystemcommand{dvips \bufferprefix\@@texapp}%
+ \executesystemcommand{ps2pdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+% \executesystemcommand{texmfstart pstopdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
+ \fi
+ \restoreTEXapplication % dimensions
+ \doifelse\jobsuffix{dvi}\donetrue\donefalse
+ \setbox\scratchbox\hbox
+ {\expanded{\externalfigure
+ [\bufferprefix\@@texapp.\ifdone eps\else pdf\fi]
+ [\c!object=\v!no]}}%
+ \setbox\scratchbox\hbox
+ {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}%
+ \wd\scratchbox\dimen0
+ \ht\scratchbox\dimen2
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \egroup}
+
+%D \macros
+%D {startpagefigure}
+%D
+%D \starttyping
+%D \starttext \pagefigure[two.1] \stoptext
+%D \stoptyping
+
+\unexpanded\def\startpagefigure
+ {\dodoubleempty\dostartpagefigure}
+
+\def\dostartpagefigure[#1][#2]%
+ {\bgroup
+ \getparameters[\??ex][\c!offset=\v!overlay,#2]%
+ \startTEXpage[\c!offset=\@@exoffset]%
+ \externalfigure[#1][#2]\ignorespaces} % so we can put some text below the graphic
+
+\unexpanded\def\stoppagefigure
+ {\stopTEXpage
+ \egroup}
+
+\def\pagefigure
+ {\dodoubleempty\dopagefigure}
+
+\def\dopagefigure[#1][#2]%
+ {\dostartpagefigure[#1][#2]\stoppagefigure}
+
+\protect \endinput
diff --git a/tex/context/base/page-bck.mkii b/tex/context/base/page-bck.mkii
new file mode 100644
index 000000000..0b4ad779a
--- /dev/null
+++ b/tex/context/base/page-bck.mkii
@@ -0,0 +1,593 @@
+%D \module
+%D [ file=page-bck, % copied from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Backgrounds,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Backgrounds}
+
+% \chardef\kindofpagetextareas=1 will isolate graphics from backgrounds
+
+\unprotect
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+%D \macros
+%D {recalculatebackgrounds}
+%D
+%D We use a couple of switches so that we can minimize the
+%D amount of background calculations. The main switch is set
+%D by the recalculate directive.
+%D
+%D \starttyping
+%D \recalculatebackgrounds
+%D \stoptyping
+%D
+%D Other modules may not directly set the switches
+%D themselves.
+
+\newif\ifnewbackground
+\newif\ifsomebackground
+
+%D For special purposes, users can question the \type
+%D {*background} mode. This mode is only available when
+%D typesetting the pagebody.
+%D
+%D \starttyping
+%D \startmode[*background] ...
+%D \stoptyping
+
+\appendtoks
+ \ifsomebackground \ifnewbackground \setsystemmode\v!background \fi \fi
+\to \everybeforepagebody
+
+%D \macros
+%D {addmainbackground, addtextbackground,
+%D addpagebackground, addprintbackground}
+%D
+%D Apart from the previously mentioned directive, the
+%D interface between this module and the other modules
+%D is made up by four macros that add background to parts of
+%D the layout.
+%D
+%D \starttyping
+%D \addmainbackground <box>
+%D \addtextbackground <box>
+%D \addpagebackground <box>
+%D \addprintbackground <box>
+%D \stoptyping
+
+%D To minimize calculations, we keep track of the state of the
+%D background of each area. A previous implementation did
+%D check each call to the background calculation macro, but
+%D using an intermediate usage flag instead of testing each
+%D time saves about 3\% on a run with a couple of backgrounds.
+%D (On the 824 pages maps bibliography runtime went down from
+%D 309 to 299 seconds.)
+
+\def\checkbackground#1%
+ {\edef\!!stringe{\??ma#1}%
+ \doifelsevaluenothing{\!!stringe\c!background }
+ {\doifelsevaluenothing{\!!stringe\c!foregroundcolor}
+ {\doifelsevalue{\!!stringe\c!frame }\v!on\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!leftframe }\v!on\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!rightframe}\v!on\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!topframe }\v!on\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!bottomframe }\v!on\!!doneatrue
+ \!!doneafalse}}}}}
+ \!!doneatrue}
+ \!!doneatrue
+ \if!!donea
+ \setusage \!!stringe
+ \else
+ \resetusage\!!stringe
+ \fi}
+
+\def\ifsomebackgroundfound#1%
+ {\ifusage{\??ma#1}}
+
+% \def\doifsomebackgroundelse#1#2#3%
+% {\ifusage{\??ma#1}#2\else#3\fi}
+
+\def\doifsomebackgroundelse#1%
+ {\ifusage{\??ma#1}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D The background mechanism falls back on the \type {\framed}
+%D macro. This means that all normal frame and overlay
+%D features can be used.
+
+\def\addsomebackground#1#2#3#4% area box width height / zero test added
+ {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint
+ \doifvaluesomething{\??ma#1\c!setups}{\setups[\getvalue{\??ma#1\c!setups}]}% should not produce funny spaces !
+ \setbox#2\vbox\fastlocalframed
+ [\??ma#1]
+ [\c!component=#1,\c!strut=\v!no,\c!offset=\v!overlay,\c!setups=,%
+ \c!width=#3,\c!height=#4]
+ {\dp#2\zeropoint\box#2}%
+ \fi\fi\fi}
+
+%D There are quite some backgrounds. At the bottom layer,
+%D there is the {\em paper} background. This one is only
+%D used for special purposes, like annotations to documents.
+
+\def\addprintbackground#1%
+ {\addsomebackground
+ \v!paper#1\printpaperwidth\printpaperheight}
+
+%D The page backgrounds can be put behind the {\em left
+%D page}, the {\em right page} or {\em each page}. As with
+%D the paper background, these are calculated on each page.
+
+\def\addpagebackground#1%
+ {\doifbothsidesoverruled
+ {\addsomebackground\v!rightpage#1\paperwidth\paperheight}
+ {\addsomebackground\v!rightpage#1\paperwidth\paperheight}
+ {\addsomebackground\v!leftpage #1\paperwidth\paperheight}%
+ \addsomebackground\v!page #1\paperwidth\paperheight}
+
+%D Then there are the 25 areas that make up the layout: {\em
+%D top, header, text, footer, bottom} times {\em left edge,
+%D left margin, text, right margin, right edge}. These are
+%D only recalculated when they change or when the \type
+%D {status} is set to \type {repeat}.
+
+\newbox\leftbackground
+\newbox\rightbackground
+
+\def\addmainbackground#1% todo: dimension spec
+ {\ifsomebackground
+ \ifnewbackground \setbackgroundboxes \fi
+ \setbox#1\vbox
+ {\offinterlineskip
+ \doifmarginswapelse
+ {\copy\leftbackground}{\copy\rightbackground}%
+ \box#1}%
+ \fi}
+
+%D Finaly there is an aditional {\em text} background, again
+%D useful for special purposes only. This one is calculated
+%D each time. The hidden backgrounds are not meant for users!
+
+\newconditional\hiddenbackgroundenabled
+
+\def\addtextbackground#1%
+ {\ifconditional\hiddenbackgroundenabled
+ \addsomebackground\v!hidden#1\makeupwidth\textheight % mine !
+ \fi
+ \addsomebackground\v!text#1\makeupwidth\textheight}
+
+%D The next couple of macros implement the area backgrounds.
+%D As said, these are cached in dedicated boxes. The offsets
+%D and depth of the page are used for alignment purposes.
+
+\newdimen\pageoffset % bleed
+\newdimen\pagedepth
+
+\let\pagebackgroundhoffset\!!zeropoint
+\let\pagebackgroundvoffset\!!zeropoint
+\let\pagebackgrounddepth \!!zeropoint
+
+% \def\setbackgroundboxes
+% {\showmessage\m!layouts8\empty
+% \setbackgroundbox\leftbackground\relax
+% \ifdoublesided
+% \setbackgroundbox\rightbackground\doswapmargins
+% \fi
+% \doifnot\@@mastatus\v!herhaal{\global\newbackgroundfalse}}
+
+%D We need a bit more clever mechanism in order to handle
+%D layers well. This means that we cannot calculate both
+%D background at the same time since something may have
+%D changed halfway a page.
+
+\chardef\newrightbackground\zerocount
+\chardef\newleftbackground \zerocount
+
+\def\recalculatebackgrounds
+ {\global\newbackgroundtrue}
+
+\def\setbackgroundboxes
+ {\ifnewbackground
+ \global\chardef\newrightbackground\plusone
+ \global\chardef\newleftbackground\plusone
+ \global\setbox\leftbackground\emptybox
+ \global\setbox\rightbackground\emptybox
+ \fi
+ \doifbothsides
+ {\ifcase\newleftbackground \else
+ % \showmessage\m!layouts8\empty
+ \setbackgroundbox\leftbackground\relax
+ \global\chardef\newleftbackground\zerocount
+ \global\chardef\newrightbackground\zerocount
+ \fi}
+ {\ifcase\newleftbackground \else
+ % \showmessage\m!layouts8\empty
+ \setbackgroundbox\leftbackground\relax
+ \global\chardef\newleftbackground\zerocount
+ \fi}
+ {\ifcase\newrightbackground \else
+ % \showmessage\m!layouts8\empty
+ \setbackgroundbox\rightbackground\doswapmargins
+ \global\chardef\newrightbackground\zerocount
+ \fi}%
+ \ifx\@@mastate\v!repeat\else\global\newbackgroundfalse\fi}
+
+\def\addmainbackground#1% todo: dimension spec
+ {\ifsomebackground
+ \setbackgroundboxes
+ \setbox#1\vbox
+ {\offinterlineskip
+ \doifmarginswapelse
+ {\copy\leftbackground}
+ {\copy\rightbackground}
+ \box#1}%
+ \fi}
+
+\def\setbackgroundoffsets
+ {\ifsomebackground \ifnewbackground
+ \global\let\pagebackgroundhoffset\!!zeropoint
+ \global\let\pagebackgroundvoffset\!!zeropoint
+ \global\let\pagebackgrounddepth \!!zeropoint
+ \doifsomebackgroundelse{\v!text\v!text}\donetrue\donefalse
+ \ifdone\else\doifsomebackgroundelse\v!text\donetrue\donothing\fi
+ \ifdone
+ \bgroup
+ \scratchdimen\getvalue{\??ma\v!page\c!offset}%
+ \doifsomebackgroundelse{\v!top\v!text}\donothing
+ {\doifsomebackgroundelse{\v!bottom\v!text}\donothing
+ {\xdef\pagebackgroundhoffset{\the\scratchdimen}}}%
+ \doifsomebackgroundelse{\v!text\v!rightedge}\donothing
+ {\doifsomebackgroundelse{\v!text\v!leftedge}\donothing
+ {\xdef\pagebackgroundvoffset{\the\scratchdimen}%
+ \scratchdimen\getvalue{\??ma\v!page\c!depth}%
+ \xdef\pagebackgrounddepth{\the\scratchdimen}}}%
+ \egroup
+ \fi
+ \fi \fi}
+
+\appendtoks \setbackgroundoffsets \to \everybeforepagebody
+
+\newconditional\swapbackgroundmargins \settrue\swapbackgroundmargins
+
+\def\setbackgroundbox#1#2%
+ {\global\setbox#1\vbox
+ {\dontcomplain
+ \swapmargins
+ \ifconditional\swapbackgroundmargins
+ \doifmarginswapelse \donothing
+ {\swapmacros\v!rightmargin\v!leftmargin
+ \swapmacros\v!rightedge \v!leftedge}%
+ \fi
+ \calculatereducedvsizes
+ \offinterlineskip
+ #2\relax
+ \vskip\dimexpr-\topheight-\topdistance\relax
+ \dodopagebodybackground\v!top\topheight
+ \vskip\topdistance
+ \dodopagebodybackground\v!header\headerheight
+ \vskip\headerdistance
+ \dodopagebodybackground\v!text\textheight
+ \vskip\footerdistance
+ \dodopagebodybackground\v!footer\footerheight
+ \vskip\bottomdistance
+ \dodopagebodybackground\v!bottom\bottomheight
+ \vfilll}%
+ \smashbox#1}
+
+\def\dodopagebodybackground#1#2%
+ {\ifdim#2>\zeropoint % added, faster
+ \setbox\scratchbox\vbox to #2
+ \bgroup\hbox\bgroup
+ % \swapmargins
+ \goleftonpage
+ \dododopagebodybackground\leftedgewidth #2#1\v!leftedge
+ \hskip\leftedgedistance
+ \dododopagebodybackground\leftmarginwidth #2#1\v!leftmargin
+ \hskip\leftmargindistance
+ \dododopagebodybackground\makeupwidth #2#1\v!text
+ \hskip\rightmargindistance
+ \dododopagebodybackground\rightmarginwidth#2#1\v!rightmargin
+ \hskip\rightedgedistance
+ \dododopagebodybackground\rightedgewidth #2#1\v!rightedge
+ \egroup\egroup
+ \wd\scratchbox\zeropoint
+ \box\scratchbox\relax
+ \fi}
+
+\def\dododopagebodybackground#1#2#3#4% width height pos pos
+ {\ifsomebackgroundfound{#3#4}%
+ \ifdim#2>\zeropoint\relax
+ \ifdim#1>\zeropoint\relax
+ \doifvaluesomething{\??ma#3#4\c!setups}{\setups[\getvalue{\??ma#3#4\c!setups}]}% should not produce funny spaces !
+ \fastlocalframed
+ [\??ma#3#4]
+ [\c!component=#3-#4,\c!offset=\v!overlay,\c!setups=]
+ {\vbox to #2{\vss\hbox to#1{\hss\getvalue{\??ma#3#4\c!command}\hss}\vss}}%
+ \else
+ \hskip#1%
+ \fi
+ \else
+ \hskip#1%
+ \fi
+ \else
+ \hskip#1%
+ \fi}
+
+%D The background mechanism is quite demanding in terms or
+%D resources. We used to delay these definitions till runtime
+%D usage, but since today's \TEX's are large, we now do the
+%D work on forehand.
+%D
+%D \starttyping
+%D \setupbackgrounds [settings]
+%D \setupbackgrounds [paper,page,text,..] [settings]
+%D \setupbackgrounds [top,...] [leftedge,...] [settings]
+%D \stoptyping
+%D
+%D \showsetup{setupbackgrounds}
+%D
+%D Because the number of arguments runs from one to three,
+%D we need to check for it.
+
+\def\setupbackgrounds
+ {\dotripleempty\dosetupbackgrounds}
+
+\def\dosetupbackgrounds[#1][#2][#3]%
+ {\ifthirdargument
+ \global\somebackgroundtrue
+ \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}}%
+ \processcommalist[#2]\dodocommand}}%
+ \processcommalist[#1]\docommand
+ \else\ifsecondargument
+ \global\somebackgroundtrue
+ \doifcommonelse{#1}{\v!text,\v!hidden,\v!paper,\v!page,\v!leftpage,\v!rightpage}
+ {\def\docommand##1{\getparameters[\??ma##1][#2]\checkbackground{##1}}%
+ \processcommalist[#1]\docommand}%
+ {\setupbackgrounds
+ [#1]%
+ [\v!leftedge,\v!leftmargin,\v!text,\v!rightmargin,\v!rightedge]%
+ [#2]}%
+ \else\iffirstargument
+ \getparameters[\??ma][#1]%
+ \fi\fi\fi
+ \doifelsevalue{\??ma\v!page\c!offset}\v!overlay
+ {\global\pageoffset\zeropoint}
+ {\global\pageoffset\getvalue{\??ma\v!page\c!offset}}%
+ \global\pagedepth\getvalue{\??ma\v!page\c!depth}%
+ \xdef\pagebackgroundoffset{\the\pageoffset}%
+ \xdef\pagebackgrounddepth {\the\pagedepth }%
+ \doifelse\@@mastate\v!stop
+ {\global\newbackgroundfalse}
+ {\global\newbackgroundtrue }}
+
+\let\pagebackgroundoffset\!!zeropoint
+\let\pagebackgrounddepth \!!zeropoint
+
+%D Each areas (currently there are $1+3+25+1=30$ of them)
+%D has its own low level framed object associated.
+
+\presetlocalframed [\??ma\v!paper]
+\presetlocalframed [\??ma\v!page]
+\presetlocalframed [\??ma\v!leftpage]
+\presetlocalframed [\??ma\v!rightpage]
+
+\copyparameters
+ [\??ma\v!paper\c!frame][\??ma\v!page]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+\copyparameters
+ [\??ma\v!paper\c!background][\??ma\v!page]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+\copyparameters
+ [\??ma\v!page\c!frame][\??ma\v!page]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+\copyparameters
+ [\??ma\v!page\c!background][\??ma\v!page]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+\copyparameters
+ [\??ma\v!leftpage\c!frame][\??ma\v!leftpage]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+\copyparameters
+ [\??ma\v!leftpage\c!background][\??ma\v!leftpage]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+\copyparameters
+ [\??ma\v!rightpage\c!frame][\??ma\v!rightpage]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+\copyparameters
+ [\??ma\v!rightpage\c!background][\??ma\v!rightpage]
+ [\c!offset,\c!depth,\c!radius,\c!corner,\c!color,\c!screen]
+
+%D We save some keying by defining the areas using
+%D intermediate commands. The inheritance macro makes sure
+%D that copies are efficient.
+
+\def\dodocommand#1#2%
+ {\copylocalframed
+ [\??ma#1#2][\??ma\v!page]%
+ \getparameters
+ [\??ma#1#2]
+ [\c!background=,\c!frame=,\c!color=,\c!screen=\@@rsscreen,
+ \c!bottomframe=,\c!topframe=,\c!leftframe=,\c!rightframe=]%
+ \inheritparameter[\??ma][#1#2\c!color][\v!page\c!color]%
+ \inheritparameter[\??ma][#1#2\c!screen][\v!page\c!screen]%
+ \inheritparameter[\??ma][#1#2\c!framecolor][\v!page\c!framecolor]%
+ \inheritparameter[\??ma][#1#2\c!backgroundcolor][\v!page\c!backgroundcolor]%
+ \inheritparameter[\??ma][#1#2\c!backgroundscreen][\v!page\c!backgroundscreen]}
+
+%D The stand alone text area inherits from the page too.
+
+\dodocommand\v!text \empty
+\dodocommand\v!hidden\empty
+
+%D We now define all 25 main areas in a row.
+
+\def\docommand#1%
+ {\dodocommand#1\v!leftedge
+ \dodocommand#1\v!leftmargin
+ \dodocommand#1\v!text
+ \dodocommand#1\v!rightmargin
+ \dodocommand#1\v!rightedge}
+
+\docommand\v!top
+\docommand\v!header
+\docommand\v!text
+\docommand\v!footer
+\docommand\v!bottom
+
+%D We need some cleanup now.
+
+\let\dodocommand\relax \let\docommand\relax
+
+%D We now set up the individual areas to use reasonable
+%D defaults.
+
+\setupbackgrounds
+ [\c!state=\c!start]
+
+\setupbackgrounds
+ [\v!paper,\v!page,\v!leftpage,\v!rightpage]
+ [\c!frame=\v!off,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!background=,
+ \c!screen=\@@rsscreen,
+ \c!color=,
+ %\c!frameoffset=\getvalue{\??ma\v!page\c!offset},
+ %\c!backgroundoffset=\getvalue{\??ma\v!page\c!offset},
+ \c!offset=\!!zeropoint, % later set to \v!overlay, watch out !
+ \c!depth=\!!zeropoint]
+
+\def\docommand#1%
+ {\inheritparameter[\??ma][#1\c!frameoffset][\v!page\c!offset]%
+ \inheritparameter[\??ma][#1\c!backgroundoffset][\v!page\c!offset]}
+
+\docommand\v!paper
+\docommand\v!page
+\docommand\v!leftpage
+\docommand\v!rightpage
+
+%D Again we clean up temporary macros.
+
+\let\docommand\relax
+
+%D The hidden layer can be populated by extending the
+%D following comma separated list. This only happens in core
+%D modules.
+
+% todo page-2 .. page+2 achter pagina -> bleed
+% spread-2 .. spread+2 achter spread -> spread (repeat 2 times)
+
+\def\enablehiddenbackground
+ {\global\settrue\hiddenbackgroundenabled
+ \global\somebackgroundtrue
+ \recalculatebackgrounds}
+
+\def\disablehiddenbackground
+ {\global\setfalse\hiddenbackgroundenabled}
+
+\def\hiddenbackground
+ {\v!text-2,\v!text-1,\v!foreground,\v!text+1,\v!text+2}
+
+\setupbackgrounds
+ [\v!hidden]
+ [\c!background=\hiddenbackground]
+
+% The next series is used in local (for instance floating)
+% backgrounds.
+
+\presetlocalframed
+ [\??ma\v!local]
+
+\def\localbackground
+ {\v!local-2,\v!local-1,\v!foreground,\v!local+1,\v!local+2}
+
+\defineoverlay[\v!local-2][\positionoverlay{\v!local-2}]
+\defineoverlay[\v!local-1][\positionoverlay{\v!local-1}]
+\defineoverlay[\v!local+1][\positionoverlay{\v!local+1}]
+\defineoverlay[\v!local+2][\positionoverlay{\v!local+2}]
+
+\def\addlocalbackgroundtobox
+ {\ifconditional\hiddenbackgroundenabled
+ \expandafter\doaddlocalbackground
+ \else
+ \resetglobal \expandafter\gobbleoneargument
+ \fi}
+
+\def\doaddlocalbackground#1%
+ {\dodoglobal\setbox#1\hbox
+ {\fastlocalframed % \localframed
+ [\??ma\v!local]
+ [\c!component=local,\c!frame=\v!off,\c!offset=\v!overlay,\c!setups=,%
+ \c!location=\v!keep,% when we use \localframed instead of \fastlocalframed
+ \c!background=\localbackground]%
+ {\registerMPlocaltextarea{\box#1}}}%
+ \resetglobal % redundant
+ \doglobal\increment\localpositionnumber\relax} % afterwards !
+
+% Test how previous macro behaves with depth:
+%
+% \startcolumnset
+% \input tufte
+% \placefigure{none}{\framed[lines=5]{xxx}}
+% \input tufte
+% \placefigure{none}{\starttabulate\NC test\nc test\NC\NR\stoptabulate}
+% \input tufte
+% \stopcolumnset
+
+%D Because we haven't really set up backgrounds yet, we set
+%D the main efficiency switch to false.
+
+\somebackgroundfalse
+
+\protect \endinput
+
+%D Removed \quote {features}:
+%D
+%D \starttyping
+%D \startinteraction
+%D \doifmarginswapelse
+%D {\copy\leftbackground}
+%D {\copy\rightbackground}%
+%D \stopinteraction
+%D \stoptyping
+%D
+%D \starttyping
+%D \edef\setpagebackgrounddepth%
+%D {\dp#2=\the\dp#2}%
+%D \setbox#2=\vbox\localframed[\??ma#1]{...}
+%D \setpagebackgrounddepth
+%D \stoptyping
diff --git a/tex/context/base/page-bck.mkiv b/tex/context/base/page-bck.mkiv
new file mode 100644
index 000000000..93400943d
--- /dev/null
+++ b/tex/context/base/page-bck.mkiv
@@ -0,0 +1,563 @@
+%D \module
+%D [ file=page-bck, % copied from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Backgrounds,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Backgrounds}
+
+% \chardef\kindofpagetextareas=1 will isolate graphics from backgrounds
+
+% todo \fastlocalframed -> \localbackgroundframed
+
+\unprotect
+
+%D \macros
+%D {recalculatebackgrounds}
+%D
+%D We use a couple of switches so that we can minimize the
+%D amount of background calculations. The main switch is set
+%D by the recalculate directive.
+%D
+%D \starttyping
+%D \recalculatebackgrounds
+%D \stoptyping
+%D
+%D Other modules may not directly set the switches
+%D themselves.
+
+\newif\ifnewbackground
+\newif\ifsomebackground
+
+%D For special purposes, users can question the \type
+%D {*background} mode. This mode is only available when
+%D typesetting the pagebody.
+%D
+%D \starttyping
+%D \startmode[*background] ...
+%D \stoptyping
+
+\appendtoks
+ \ifsomebackground \ifnewbackground \setsystemmode\v!background \fi \fi
+\to \everybeforepagebody
+
+%D \macros
+%D {addmainbackground, addtextbackground,
+%D addpagebackground, addprintbackground}
+%D
+%D Apart from the previously mentioned directive, the
+%D interface between this module and the other modules
+%D is made up by four macros that add background to parts of
+%D the layout.
+%D
+%D \starttyping
+%D \addmainbackground <box>
+%D \addtextbackground <box>
+%D \addpagebackground <box>
+%D \addprintbackground <box>
+%D \stoptyping
+
+%D To minimize calculations, we keep track of the state of the
+%D background of each area. A previous implementation did
+%D check each call to the background calculation macro, but
+%D using an intermediate usage flag instead of testing each
+%D time saves about 3\% on a run with a couple of backgrounds.
+%D (On the 824 pages maps bibliography runtime went down from
+%D 309 to 299 seconds.)
+
+% \let\currentotrbackground\empty
+%
+% \def\@@docheckbackground#1#2%
+% {\ifcsname\currentotrbackground#1\endcsname
+% \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\!!doneatrue\fi
+% \fi}
+%
+% \def\@@nocheckbackground#1#2%
+% {\ifcsname\currentotrbackground#1\endcsname
+% \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\else\!!doneatrue\fi
+% \fi}
+%
+% \def\checkbackground#1%
+% {\edef\currentotrbackground{\??ma#1}%
+% \begingroup
+% \!!doneafalse
+% \if!!donea\else\@@nocheckbackground\c!background \empty
+% \if!!donea\else\@@docheckbackground\c!frame \v!on
+% \if!!donea\else\@@nocheckbackground\c!foregroundcolor\empty
+% \if!!donea\else\@@docheckbackground\c!leftframe \v!on
+% \if!!donea\else\@@docheckbackground\c!rightframe \v!on
+% \if!!donea\else\@@docheckbackground\c!topframe \v!on
+% \if!!donea\else\@@docheckbackground\c!bottomframe \v!on \fi\fi\fi\fi\fi\fi\fi
+% \if!!donea
+% \endgroup\setusage \currentotrbackground
+% \else
+% \endgroup\resetusage\currentotrbackground
+% \fi}
+%
+% \def\ifsomebackgroundfound#1%
+% {\ifusage{\??ma#1}}
+%
+% \def\doifsomebackgroundelse#1%
+% {\ifusage{\??ma#1}%
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+
+\let\currentotrbackground\empty
+
+\def\@@docheckbackground#1#2%
+ {\ifcsname\currentotrbackground#1\endcsname
+ \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\!!doneatrue\fi
+ \fi}
+
+\def\@@nocheckbackground#1#2%
+ {\ifcsname\currentotrbackground#1\endcsname
+ \edef\!!stringa{\csname\currentotrbackground#1\endcsname}\ifx\!!stringa#2\else\!!doneatrue\fi
+ \fi}
+
+\def\checkbackground#1% here we need an \ifempty primitive
+ {\edef\currentotrbackground{\??ma#1}%
+ \begingroup
+ \!!doneafalse
+ \if!!donea\else\@@nocheckbackground\c!background \empty
+ \if!!donea\else\@@docheckbackground\c!frame \v!on
+ \if!!donea\else\@@nocheckbackground\c!foregroundcolor\empty
+ \if!!donea\else\@@docheckbackground\c!leftframe \v!on
+ \if!!donea\else\@@docheckbackground\c!rightframe \v!on
+ \if!!donea\else\@@docheckbackground\c!topframe \v!on
+ \if!!donea\else\@@docheckbackground\c!bottomframe \v!on \fi\fi\fi\fi\fi\fi\fi
+ \if!!donea
+ \endgroup\expandafter\let\csname\currentotrbackground\endcsname\relax
+ \else
+ \endgroup\expandafter\let\csname\currentotrbackground\endcsname\undefined
+ \fi}
+
+\def\ifsomebackgroundfound#1%
+ {\ifcsname\??ma#1\endcsname}
+
+\def\doifsomebackgroundelse#1%
+ {\ifcsname\??ma#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifsomebackground#1%
+ {\ifcsname\??ma#1\endcsname
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+%D The background mechanism falls back on the \type {\framed}
+%D macro. This means that all normal frame and overlay
+%D features can be used.
+
+% \def\addsomebackground#1#2#3#4% area box width height / zero test added
+% {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint
+% \ifcsname\??ma#1\c!setups\endcsname % to be done
+% \doprocesslocalsetups{\csname\??ma#1\c!setups\endcsname}% should not produce funny spaces !
+% \fi
+% \setbox#2\vbox\fastlocalframed % maybe \superfastlocalframed{tag}{w}{h}
+% [\??ma#1]%
+% [\c!component=#1,\c!width=#3,\c!height=#4]% are width and height used?
+% {\dp#2\zeropoint\box#2}%
+% \fi\fi\fi}
+
+\def\addsomebackground#1#2#3#4% area box width height / zero test added
+ {\ifsomebackgroundfound#1\ifdim#3>\zeropoint\ifdim#4>\zeropoint
+ \ifcsname\??ma#1\c!setups\endcsname % to be done
+ \doprocesslocalsetups{\csname\??ma#1\c!setups\endcsname}% should not produce funny spaces !
+ \fi
+ \localbackgroundframed{#1}{#2}{#3}{#4}%
+ \fi\fi\fi}
+
+%D There are quite some backgrounds. At the bottom layer,
+%D there is the {\em paper} background. This one is only
+%D used for special purposes, like annotations to documents.
+
+\def\addprintbackground#1%
+ {\addsomebackground\v!paper#1\printpaperwidth\printpaperheight}
+
+%D The page backgrounds can be put behind the {\em left
+%D page}, the {\em right page} or {\em each page}. As with
+%D the paper background, these are calculated on each page.
+
+\def\addpagebackground#1%
+ {\doifbothsidesoverruled
+ {\addsomebackground\v!rightpage#1\paperwidth\paperheight}
+ {\addsomebackground\v!rightpage#1\paperwidth\paperheight}
+ {\addsomebackground\v!leftpage #1\paperwidth\paperheight}%
+ \addsomebackground\v!page #1\paperwidth\paperheight}
+
+%D Then there are the 25 areas that make up the layout: {\em
+%D top, header, text, footer, bottom} times {\em left edge,
+%D left margin, text, right margin, right edge}. These are
+%D only recalculated when they change or when the \type
+%D {status} is set to \type {repeat}.
+
+\newbox\leftbackground
+\newbox\rightbackground
+
+\def\addmainbackground#1% todo: dimension spec
+ {\ifsomebackground
+ \ifnewbackground \setbackgroundboxes \fi
+ \setbox#1\vbox
+ {\offinterlineskip
+ \doifmarginswapelse{\copy\leftbackground}{\copy\rightbackground}%
+ \box#1}%
+ \fi}
+
+%D Finaly there is an aditional {\em text} background, again
+%D useful for special purposes only. This one is calculated
+%D each time. The hidden backgrounds are not meant for users!
+
+\newconditional\hiddenbackgroundenabled
+
+\def\addtextbackground#1%
+ {\ifconditional\hiddenbackgroundenabled
+ \addsomebackground\v!hidden#1\makeupwidth\textheight % mine !
+ \fi
+ \addsomebackground\v!text#1\makeupwidth\textheight}
+
+%D The next couple of macros implement the area backgrounds.
+%D As said, these are cached in dedicated boxes. The offsets
+%D and depth of the page are used for alignment purposes.
+
+\newdimen\pageoffset % bleed
+\newdimen\pagedepth
+
+% \def\setbackgroundboxes
+% {\showmessage\m!layouts8\empty
+% \setbackgroundbox\leftbackground\relax
+% \ifdoublesided
+% \setbackgroundbox\rightbackground\doswapmargins
+% \fi
+% \doifnot\@@mastatus\v!herhaal{\global\newbackgroundfalse}}
+
+%D We need a bit more clever mechanism in order to handle
+%D layers well. This means that we cannot calculate both
+%D background at the same time since something may have
+%D changed halfway a page.
+
+\chardef\newrightbackground\zerocount
+\chardef\newleftbackground \zerocount
+
+\def\recalculatebackgrounds
+ {\global\newbackgroundtrue}
+
+\def\setbackgroundboxes
+ {\ifnewbackground
+ \dosetbackgroundboxesr
+ \fi
+ \doifbothsides\dosetbackgroundboxesa\dosetbackgroundboxesb\dosetbackgroundboxesc
+ \ifx\@@mastate\v!repeat\else\global\newbackgroundfalse\fi}
+
+\def\dosetbackgroundboxesr
+ {\global\chardef\newrightbackground\plusone
+ \global\chardef\newleftbackground\plusone
+ \global\setbox\leftbackground\emptybox
+ \global\setbox\rightbackground\emptybox}
+\def\dosetbackgroundboxesa
+ {\ifcase\newleftbackground \else
+ % \showmessage\m!layouts8\empty
+ \setbackgroundbox\leftbackground\relax
+ \global\chardef\newleftbackground\zerocount
+ \global\chardef\newrightbackground\zerocount
+ \fi}
+\def\dosetbackgroundboxesb
+ {\ifcase\newleftbackground \else
+ % \showmessage\m!layouts8\empty
+ \setbackgroundbox\leftbackground\relax
+ \global\chardef\newleftbackground\zerocount
+ \fi}
+\def\dosetbackgroundboxesc
+ {\ifcase\newrightbackground \else
+ % \showmessage\m!layouts8\empty
+ \setbackgroundbox\rightbackground\doswapmargins
+ \global\chardef\newrightbackground\zerocount
+ \fi}
+
+\def\addmainbackground#1% todo: dimension spec
+ {\ifsomebackground
+ \setbackgroundboxes
+ \setbox#1\vbox
+ {\offinterlineskip
+ \doifmarginswapelse{\copy\leftbackground}{\copy\rightbackground}%
+ \box#1}%
+ \fi}
+
+\newdimen\pagebackgroundhoffset
+\newdimen\pagebackgroundvoffset
+\newdimen\pagebackgrounddepth
+\newdimen\pagebackgroundoffset
+
+\def\setbackgroundoffsets % used in menus (we can use ifcsname's here)
+ {\ifsomebackground \ifnewbackground
+ \global\pagebackgroundhoffset\zeropoint
+ \global\pagebackgroundvoffset\zeropoint
+ \global\pagebackgrounddepth \zeropoint
+ \doifsomebackgroundelse{\v!text\v!text}\donetrue\donefalse
+ \ifdone\else\doifsomebackgroundelse\v!text\donetrue\donothing\fi
+ \ifdone
+ \begingroup
+ \scratchdimen\csname\??ma\v!page\c!offset\endcsname
+ \doifsomebackgroundelse{\v!top\v!text}\donothing
+ {\doifsomebackgroundelse{\v!bottom\v!text}\donothing
+ {\global\pagebackgroundhoffset\scratchdimen}}%
+ \doifsomebackgroundelse{\v!text\v!rightedge}\donothing
+ {\doifsomebackgroundelse{\v!text\v!leftedge}\donothing
+ {\global\pagebackgroundvoffset\scratchdimen
+ \global\pagebackgrounddepth\csname\??ma\v!page\c!depth\endcsname}}%
+ \endgroup
+ \fi
+ \fi \fi}
+
+\appendtoks \setbackgroundoffsets \to \everybeforepagebody
+
+\newconditional\swapbackgroundmargins \settrue\swapbackgroundmargins
+
+\def\setbackgroundbox#1#2%
+ {\global\setbox#1\vbox
+ {\dontcomplain
+ \swapmargins
+ \ifconditional\swapbackgroundmargins
+ \doifmarginswapelse \donothing
+ {\swapmacros\v!rightmargin\v!leftmargin
+ \swapmacros\v!rightedge \v!leftedge}%
+ \fi
+ \calculatereducedvsizes
+ \offinterlineskip
+ #2\relax
+ \vskip\dimexpr-\topheight-\topdistance\relax
+ \dodopagebodybackground\v!top\topheight
+ \vskip\topdistance
+ \dodopagebodybackground\v!header\headerheight
+ \vskip\headerdistance
+ \dodopagebodybackground\v!text\textheight
+ \vskip\footerdistance
+ \dodopagebodybackground\v!footer\footerheight
+ \vskip\bottomdistance
+ \dodopagebodybackground\v!bottom\bottomheight
+ \vfilll}%
+ \smashbox#1}
+
+\def\dodopagebodybackground#1#2% maybe helper
+ {\ifdim#2>\zeropoint % added, faster
+ \setbox\scratchbox\vbox to #2
+ \bgroup\hbox\bgroup
+ % \swapmargins
+ \goleftonpage
+ \dododopagebodybackground\leftedgewidth #2#1\v!leftedge
+ \hskip\leftedgedistance
+ \dododopagebodybackground\leftmarginwidth #2#1\v!leftmargin
+ \hskip\leftmargindistance
+ \dododopagebodybackground\makeupwidth #2#1\v!text
+ \hskip\rightmargindistance
+ \dododopagebodybackground\rightmarginwidth#2#1\v!rightmargin
+ \hskip\rightedgedistance
+ \dododopagebodybackground\rightedgewidth #2#1\v!rightedge
+ \egroup\egroup
+ \wd\scratchbox\zeropoint
+ \box\scratchbox\relax
+ \fi}
+
+\def\dododopagebodybackground#1#2#3#4% width height pos pos % maybe helper
+ {\ifsomebackgroundfound{#3#4}%
+ \ifdim#2>\zeropoint\relax
+ \ifdim#1>\zeropoint\relax
+ \ifcsname\??ma#3#4\c!setups\endcsname % to be done
+ \doprocesslocalsetups{\csname\??ma#3#4\c!setups\endcsname}% should not produce funny spaces !
+ \fi
+ \fastlocalframed
+ [\??ma#3#4]%
+ [\c!component=#3-#4]%
+ {\vbox to #2{\vss\hbox to#1{\hss\csname\??ma#3#4\c!command\endcsname\hss}\vss}}%
+ \else
+ \hskip#1%
+ \fi
+ \else
+ \hskip#1%
+ \fi
+ \else
+ \hskip#1%
+ \fi}
+
+%D The background mechanism is quite demanding in terms or
+%D resources. We used to delay these definitions till runtime
+%D usage, but since today's \TEX's are large, we now do the
+%D work on forehand.
+%D
+%D \starttyping
+%D \setupbackgrounds [settings]
+%D \setupbackgrounds [paper,page,text,..] [settings]
+%D \setupbackgrounds [top,...] [leftedge,...] [settings]
+%D \stoptyping
+%D
+%D \showsetup{setupbackgrounds}
+%D
+%D Because the number of arguments runs from one to three,
+%D we need to check for it.
+
+\unexpanded\def\setupbackgrounds
+ {\dotripleempty\dosetupbackgrounds}
+
+\def\dosetupbackgrounds[#1][#2][#3]%
+ {\ifthirdargument
+ \global\somebackgroundtrue
+ \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}}%
+ \processcommalist[#2]\dodocommand}}%
+ \processcommalist[#1]\docommand
+ \else\ifsecondargument
+ \global\somebackgroundtrue
+ \doifcommonelse{#1}{\v!text,\v!hidden,\v!paper,\v!page,\v!leftpage,\v!rightpage}
+ {\def\docommand##1{\getparameters[\??ma##1][#2]\checkbackground{##1}}%
+ \processcommalist[#1]\docommand}%
+ {\setupbackgrounds
+ [#1]%
+ [\v!leftedge,\v!leftmargin,\v!text,\v!rightmargin,\v!rightedge]%
+ [#2]}%
+ \else\iffirstargument
+ \getparameters[\??ma][#1]%
+ \fi\fi\fi
+ \doifelsevalue{\??ma\v!page\c!offset}\v!overlay
+ {\global\pageoffset\zeropoint}
+ {\global\pageoffset\csname\??ma\v!page\c!offset\endcsname}%
+ \global\pagedepth\csname\??ma\v!page\c!depth\endcsname
+ \global\pagebackgroundoffset\pageoffset
+ \global\pagebackgrounddepth\pagedepth
+ \doifelse\@@mastate\v!stop
+ {\global\newbackgroundfalse}
+ {\global\newbackgroundtrue }}
+
+%D Each areas (currently there are $1+3+25+1=30$ of them)
+%D has its own low level framed object associated.
+
+\def\installsomebackground#1#2{\inheritlocalframed[\??ma#1#2][\??od]}
+
+\installsomebackground \v!paper \empty
+\installsomebackground \v!page \empty
+\installsomebackground \v!leftpage \empty
+\installsomebackground \v!rightpage \empty
+
+%D The stand alone text area inherits from the page too.
+
+\installsomebackground \v!text \empty
+\installsomebackground \v!hidden \empty
+
+%D We save some keying by defining the areas using a helper:
+
+\def\docommand#1%
+ {\installsomebackground#1\v!leftedge
+ \installsomebackground#1\v!leftmargin
+ \installsomebackground#1\v!text
+ \installsomebackground#1\v!rightmargin
+ \installsomebackground#1\v!rightedge}
+
+\docommand \v!top
+\docommand \v!header
+\docommand \v!text
+\docommand \v!footer
+\docommand \v!bottom
+
+%D We need some cleanup now.
+
+\let\docommand\relax
+
+%D We now set up the individual areas to use reasonable
+%D defaults.
+
+\installsomebackground \v!paper \empty
+\installsomebackground \v!page \empty
+\installsomebackground \v!leftpage \empty
+\installsomebackground \v!rightpage \empty
+
+\getparameters
+ [\??ma\v!page]
+ [\c!offset=\zeropoint, % hm, so we need to force overlay elsewhere
+ \c!depth=\zeropoint]
+
+%D General setup:
+
+\setupbackgrounds
+ [\c!state=\c!start]
+
+%D The hidden layer can be populated by extending the
+%D following comma separated list. This only happens in core
+%D modules.
+
+% todo page-2 .. page+2 achter pagina -> bleed
+% spread-2 .. spread+2 achter spread -> spread (repeat 2 times)
+
+\def\enablehiddenbackground
+ {\global\settrue\hiddenbackgroundenabled
+ \global\somebackgroundtrue
+ \recalculatebackgrounds}
+
+\def\disablehiddenbackground
+ {\global\setfalse\hiddenbackgroundenabled}
+
+\def\hiddenbackground
+ {\v!text-2,\v!text-1,\v!foreground,\v!text+1,\v!text+2}
+
+\setupbackgrounds
+ [\v!hidden]
+ [\c!background=\hiddenbackground]
+
+% The next series is used in local (for instance floating)
+% backgrounds.
+
+\installsomebackground \v!local \empty % not really a background, invisible for users
+
+\getparameters
+ [\??ma\v!local]
+ [\c!component=local,
+ \c!background=\localbackground]
+
+\def\localbackground
+ {\v!local-2,\v!local-1,\v!foreground,\v!local+1,\v!local+2}
+
+\defineoverlay[\v!local-2][\positionoverlay{\v!local-2}]
+\defineoverlay[\v!local-1][\positionoverlay{\v!local-1}]
+\defineoverlay[\v!local+1][\positionoverlay{\v!local+1}]
+\defineoverlay[\v!local+2][\positionoverlay{\v!local+2}]
+
+\def\addlocalbackgroundtobox
+ {\ifconditional\hiddenbackgroundenabled
+ \expandafter\doaddlocalbackground
+ \else
+ \resetglobal \expandafter\gobbleoneargument
+ \fi}
+
+\def\doaddlocalbackground#1%
+ {\dodoglobal\setbox#1\hbox{\fastlocalframed[\??ma\v!local][]{\registerMPlocaltextarea{\box#1}}}%
+ \resetglobal % redundant
+ \doglobal\increment\localpositionnumber\relax} % afterwards !
+
+% Test how previous macro behaves with depth:
+%
+% \startcolumnset
+% \input tufte
+% \placefigure{none}{\framed[lines=5]{xxx}}
+% \input tufte
+% \placefigure{none}{\starttabulate\NC test\nc test\NC\NR\stoptabulate}
+% \input tufte
+% \stopcolumnset
+
+%D Because we haven't really set up backgrounds yet, we set
+%D the main efficiency switch to false.
+
+\somebackgroundfalse
+
+\protect \endinput
diff --git a/tex/context/base/page-flt.lua b/tex/context/base/page-flt.lua
new file mode 100644
index 000000000..74d1e4e8c
--- /dev/null
+++ b/tex/context/base/page-flt.lua
@@ -0,0 +1,227 @@
+if not modules then modules = { } end modules ['page-flt'] = {
+ version = 1.001,
+ comment = "companion to page-flt.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local setdimen, setbox, setcount, texbox = tex.setdimen, tex.setbox, tex.setcount, tex.box
+local insert, remove = table.insert, table.remove
+local texwrite, texsprint, ctxcatcodes = tex.write, tex.sprint, tex.ctxcatcodes
+
+local copy_node_list = node.copy_list
+
+local trace_floats = false trackers.register("graphics.floats", function(v) trace_floats = v end) -- name might change
+
+-- we use floatbox, floatwidth, floatheight
+-- text page leftpage rightpage (todo: top, bottom, margin, order)
+
+floats = floats or { }
+
+local noffloats, last, default, pushed = 0, nil, "text", { }
+
+local function initialize()
+ return {
+ text = { },
+ page = { },
+ leftpage = { },
+ rightpage = { },
+ }
+end
+
+local stacks = initialize()
+
+-- list location
+
+function floats.stacked(which) -- floats.thenofstacked
+ return #stacks[which or default]
+end
+
+function floats.thestacked(which)
+ return texwrite(#stacks[which or default])
+end
+
+function floats.push()
+ insert(pushed,stacks)
+ stacks = initialize()
+ setcount("global","savednoffloats",0)
+end
+
+function floats.pop()
+ local popped = remove(pushed)
+ if popped then
+ for which, stack in next, stacks do
+ for i=1,#stack do
+ insert(popped[which],stack[i])
+ end
+ end
+ stacks = popped
+ setcount("global","savednoffloats",#stacks[default])
+ end
+end
+
+local function setdimensions(b)
+ local w, h, d = 0, 0, 0
+ if b then
+ w, h, d = b.width, b.height, b.depth
+ end
+ setdimen("global","floatwidth", w)
+ setdimen("global","floatheight", h+d)
+ return w, h, d
+end
+
+local function get(stack,n)
+ n = n or #stack
+ if n > 0 then
+ local t = stack[n]
+ if t then
+ return t, t.box, n
+ end
+ end
+end
+
+function floats.save(which,data)
+ which = which or default
+ local stack = stacks[which]
+ noffloats = noffloats + 1
+ local b = texbox.floatbox
+ local w, h, d = b.width, b.height, b.depth
+ local t = {
+ n = noffloats,
+ data = data or { },
+ box = copy_node_list(b),
+ }
+ texbox.floatbox = nil
+ insert(stack,t)
+ setcount("global","savednoffloats",#stacks[default])
+ if trace_floats then
+ logs.report("floats","saving %s float %s in slot %s (%i,%i,%i)",which,noffloats,#stack,w,h,d)
+ else
+ interfaces.showmessage("floatblocks",2,noffloats)
+ end
+end
+
+function floats.resave(which)
+ if last then
+ which = which or default
+ local stack = stacks[which]
+ local b = texbox.floatbox
+ local w, h, d = b.width, b.height, b.depth
+ last.box = copy_node_list(b)
+ texbox.floatbox = nil
+ insert(stack,1,last)
+ setcount("global","savednoffloats",#stacks[default])
+ if trace_floats then
+ logs.report("floats","resaving %s float %s in slot %s (%i,%i,%i)",which,noffloats,#stack,w,h,d)
+ else
+ interfaces.showmessage("floatblocks",2,noffloats)
+ end
+ else
+ logs.report("floats","unable to resave float")
+ end
+end
+
+function floats.flush(which,n)
+ which = which or default
+ local stack = stacks[which]
+ local t, b, n = get(stack,n or 1)
+ if t then
+ local w, h, d = setdimensions(b)
+ if trace_floats then
+ logs.report("floats","flushing %s float %s from slot %s (%i,%i,%i)",which,t.n,n,w,h,d)
+ else
+ interfaces.showmessage("floatblocks",3,t.n)
+ end
+ texbox.floatbox = b
+ last = remove(stack,n)
+ last.box = nil
+ setcount("global","savednoffloats",#stacks[default])
+ else
+ setdimensions()
+ end
+end
+
+function floats.thevar(name,default)
+ local value = last and last.data[name] or default
+ if value and value ~= "" then
+ texsprint(ctxcatcodes,value)
+ end
+end
+
+function floats.consult(which,n)
+ which = which or default
+ local stack = stacks[which]
+ local t, b, n = get(stack,n)
+ if t then
+ local w, h, d = setdimensions(b)
+ if trace_floats then
+ logs.report("floats","consulting %s float %s in slot %s (%i,%i,%i)",which,t.n,n,w,h,d)
+ end
+ return t, b, n
+ else
+ if trace_floats then
+ logs.report("floats","nothing to consult")
+ end
+ setdimensions()
+ end
+end
+
+function floats.collect(which,maxwidth,distance)
+ which = which or default
+ local stack = stacks[which]
+ local n, m = #stack, 0
+ for i=1,n do
+ local t, b, n = get(stack,i)
+ if t then
+ local w, h, d = setdimensions(b)
+ if w + distance < maxwidth then
+ m = m + 1
+ maxwidth = maxwidth - w - distance
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if m == 0 then
+ m = 1
+ end
+ setcount("global","nofcollectedfloats",m)
+end
+
+function commands.doifsavedfloatelse(which)
+ local stack = stacks[which or default]
+ commands.doifelse(#stack>0)
+end
+
+function floats.thecheckedpagefloat(packed)
+ local result = ""
+ if structure.pages.is_odd() then
+ if #stacks.rightpage > 0 then
+ result = "rightpage"
+ elseif #stacks.page > 0 then
+ result = "page"
+ elseif #stacks.leftpage > 0 then
+ if packed then
+ result = "leftpage"
+ else
+ result = "empty"
+ end
+ end
+ else
+ if #stacks.leftpage > 0 then
+ result = "leftpage"
+ elseif #stacks.page > 0 then
+ result = "page"
+ elseif #stacks.rightpage > 0 then
+ if packed then
+ result = "rightpage"
+ else
+ result = "empty"
+ end
+ end
+ end
+ texsprint(ctxcatcodes,result)
+end
diff --git a/tex/context/base/page-flt.mkiv b/tex/context/base/page-flt.mkiv
new file mode 100644
index 000000000..944626b8e
--- /dev/null
+++ b/tex/context/base/page-flt.mkiv
@@ -0,0 +1,233 @@
+%D \module
+%D [ file=page-flt,
+%D version=2010.04,08,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Float Management,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Float Management}
+
+%D This module has code that previously was in other modules. There is
+%D also float related code in \type {strc-flt.mkiv}.
+
+\registerctxluafile{page-flt}{1.001}
+
+\unprotect
+
+%D To be checked and removed
+
+%def\dosavefloatinfo {\showmessage\m!floatblocks2{\the\totalnoffloats}}
+\def\doinsertfloatinfo {\showmessage\m!floatblocks4{\the\totalnoffloats}}
+\def\dofloatflushedinfo{\showmessage\m!floatblocks3{\the\numexpr\totalnoffloats-\savednoffloats\relax}}
+
+%D Extra float registers.
+
+\newif\ifsomefloatwaiting \somefloatwaitingfalse
+\newif\ifroomforfloat \roomforfloattrue
+\newif\ifnofloatpermitted \nofloatpermittedfalse
+\newif\ifcenterfloatbox \centerfloatboxtrue
+\newif\iflocalcenterfloatbox \localcenterfloatboxfalse
+\newif\ifglobalcenterfloatbox \globalcenterfloatboxfalse
+\newif\ifflushingfloats \flushingfloatsfalse
+\newif\ifpackflushedfloats \packflushedfloatstrue % for the moment
+\newif\ifpackcolumnfloats \packcolumnfloatstrue
+
+\newcount\totalnoffloats
+\newcount\savednoffloats
+\newcount\noffloatinserts
+\newcount\nofcollectedfloats % communication channel
+
+\newbox \floatlist
+\newbox \savedfloatlist
+\newbox \floattext
+
+\newdimen\floatwidth
+\newdimen\floatheight
+\newdimen\floatdepth
+\newdimen\floattextwidth
+\newdimen\floattextheight
+
+\newbox \floatbox
+\newbox \savedfloatbox
+
+%D From now on we manage the float stack at the \LUA\ end instead of packing
+%D them in a box and splitting off stacked floats. It's not so much less code
+%D but it's cleaner this way. It also opens op some posibilities as we can now
+%D more conveniently cary additional information around.
+
+\newtoks \everyfloatscheck
+
+\appendtoks
+ \ifcase\savednoffloats
+ \global\somefloatwaitingfalse
+ \else
+ \global\somefloatwaitingtrue
+ \fi
+\to \everyfloatscheck
+
+\def\dofloatsflush#1#2%
+ {\ctxlua{floats.flush("#1",\number#2)}%
+ \the\everyfloatscheck}
+
+\def\dofloatssave#1%
+ {\ctxlua{floats.save("#1")}%
+ \the\everyfloatscheck}
+
+\def\dofloatsresave#1%
+ {\ctxlua{floats.resave("#1")}%
+ \the\everyfloatscheck}
+
+\def\dopushsavedfloats
+ {\ctxlua{floats.push()}%
+ \the\everyfloatscheck}
+
+\def\dopopsavedfloats
+ {\ctxlua{floats.pop()}%
+ \the\everyfloatscheck}
+
+\def\dofloatsgetinfo#1%
+ {\ctxlua{floats.consult("#1")}}
+
+\def\doifsavedfloatelse#1%
+ {\ctxlua{commands.doifsavedfloatelse("#1")}}
+
+\def\dofloatscollect#1#2#3%
+ {\ctxlua{floats.collect("#1",\number\dimexpr#2,\number\dimexpr#3)}}
+
+\def\dofloatsnofstacked#1%
+ {\ctxlua{floats.thestacked("#1")}}
+
+\def\dofloatsgetvariable#1%
+ {\ctxlua{floats.thevar("specification")}}
+
+\let\dopushcolumnfloats\dopushsavedfloats
+\let\dopopcolumnfloats \dopopsavedfloats
+
+\def\dofloatssavepagefloat#1#2%
+ {\ctxlua{floats.save("#1", { specification = "#2" })}}
+
+%D The following code is in transition as we don't want to break the
+%D current single column, multi column, and columnset mechanism.
+%D
+%D First we reimplement some helpers.
+
+\def\dogetfloat
+ {\ifsomefloatwaiting
+ \dofloatsflush{text}{1}%
+ \ifcenterfloatbox
+ \ifdim\wd\globalscratchbox<\hsize
+ \global\setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}%
+ \else
+ % retain special alignments
+ \ifinsidecolumns
+ \ifdim\wd\floatbox>\makeupwidth
+ \global\wd\floatbox\makeupwidth
+ \fi
+ \fi
+ \fi
+ \fi
+ \else
+ \global\savednoffloats\zerocount
+ \global\setbox\floatbox\emptybox
+ \fi}
+
+\def\dosavefloat
+ {\dofloatssave{text}%
+ \nonoindentation} % brrr nonoindentation here
+
+\def\doresavefloat
+ {\dofloatsresave{text}}
+
+\def\doreversesavefloat
+ {\dofloatsresave{text}}
+
+\def\doflushsavedfloats % simplified \OTRONEdodoflushfloats
+ {\doloop
+ {\ifsomefloatwaiting
+ \docheckiffloatfits
+ \ifroomforfloat
+ \dogetfloat
+ \doplacefloatbox
+ \else
+ \exitloop
+ \fi
+ \else
+ \exitloop
+ \fi}}
+
+%D Page floats use different stacks.
+
+\newtoks \everybeforeflushedpagefloat
+
+\def\doflushsomepagefloat#1% future releases can do more clever things
+ {\dofloatsflush{#1}{1}%
+ \edef\floatspecification{\dofloatsgetvariable{specification}}%
+ \the\everybeforeflushedpagefloat
+ \vbox to \textheight
+ {\doifnotinset\v!high\floatspecification\vfill
+ \box\floatbox
+ \doifnotinset\v!low\floatspecification\vfill}%
+ \vfill\eject}
+
+% \def\doflushpagefloats
+% {\doifoddpageelse
+% {\ifnum\dofloatsnofstacked{rightpage}>\zerocount
+% \doflushsomepagefloat{rightpage}%
+% \else\ifnum\dofloatsnofstacked{page}>\zerocount
+% \doflushsomepagefloat{page}
+% \else\ifnum\dofloatsnofstacked{leftpage}>\zerocount
+% \null\vfill\eject
+% %\doflushsomepagefloat{leftpage}%
+% \fi\fi\fi}
+% {\ifnum\dofloatsnofstacked{leftpage}>\zerocount
+% \doflushsomepagefloat{leftpage}%
+% \else\ifnum\dofloatsnofstacked{page}>\zerocount
+% \doflushsomepagefloat{page}
+% \else\ifnum\dofloatsnofstacked{rightpage}>\zerocount
+% \null\vfill\eject
+% %\doflushsomepagefloat{rightpage}%
+% \fi\fi\fi}}
+
+\def\doflushpagefloats
+ {\edef\checkedpagefloat{\ctxlua{floats.thecheckedpagefloat()}}% (true) for packed
+ \ifx\checkedpagefloat\empty
+ % nothing
+ \else\ifx\checkedpagefloat\v!empty
+ \null\vfill\eject
+ \else
+ \doflushsomepagefloat\checkedpagefloat
+ \fi\fi}
+
+\def\uncenteredfloatbox
+ {\ifcenterfloatbox
+ \ifhbox\floatbox\relax % remove centering
+ \ifdim\wd\floatbox=\hsize
+ \ifhbox\floatbox
+ \setbox\scratchbox\hbox
+ {\unhbox\floatbox
+ \unskip\unskip
+ \global\setbox\globalscratchbox\lastbox}%
+ \box\globalscratchbox
+ \else
+ \box\floatbox
+ \fi
+ \else
+ \box\floatbox
+ \fi
+ \else
+ \box\floatbox
+ \fi
+ \else
+ \box\floatbox
+ \fi}
+
+\ifdefined\doflushfloats\else \let\doflushfloats\relax \fi
+\ifdefined\flushfloatbox\else \let\flushfloatbox\relax \fi
+
+\protect \endinput
diff --git a/tex/context/base/page-flw.mkii b/tex/context/base/page-flw.mkii
new file mode 100644
index 000000000..3eb867a78
--- /dev/null
+++ b/tex/context/base/page-flw.mkii
@@ -0,0 +1,107 @@
+%D \module
+%D [ file=page-flw,
+%D version=2003.04.19, % from test-002 (1997) profile experiment
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Text Flows,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Text Flows}
+
+%D This is high experimental and especially flushing may change (proper
+%D spacing is the driving force here).
+
+\unprotect
+
+\def\definetextflow
+ {\dodoubleempty\dodefinetextflow}
+
+\def\dodefinetextflow[#1][#2]% flow settings
+ {\iffirstargument
+ \doiftextflowcollectorelse{#1}
+ {\setbox\textflowcollector{#1}\emptybox}
+ {\@EA\newbox\csname\??tx:c:#1\endcsname}%
+ \getparameters[\??tx:p:#1]
+ [\c!width=\hsize,\c!style=,#2]%
+ \fi}
+
+\def\textflowparameter#1#2{\csname\??tx:p:#1#2\endcsname}
+\def\textflowcollector #1{\csname\??tx:c:#1\endcsname}
+
+\def\doiftextflowcollectorelse#1{\doifdefinedelse{\??tx:c:#1}}
+
+\def\doiftextflowelse#1%
+ {\doiftextflowcollectorelse{#1}
+ {\ifvoid\textflowcollector{#1}%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+ {\secondoftwoarguments}}
+
+\def\doiftextflow#1%
+ {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
+
+\def\starttextflow[#1]%
+ {\doiftextflowcollectorelse{#1}
+ {\global\setbox\textflowcollector{#1}\vbox
+ \bgroup
+ \unvbox\textflowcollector{#1}%
+ \hsize\textflowparameter{#1}\c!width
+ \doifsomething{\textflowparameter{#1}\c!style}%
+ {\doconvertfont{\textflowparameter{#1}\c!style}}%
+ \def\stoptextflow{\endgraf\egroup}}
+ {\let\stoptextflow\relax}}
+
+\def\flushtextflow#1%
+ {\doiftextflow{#1}
+ {\ifdim\ht\textflowcollector{#1}>\vsize
+ \setbox\scratchbox\vsplit\textflowcollector{#1} to \vsize
+ \unvbox\scratchbox
+ \else
+ \unvbox\textflowcollector{#1}%
+ \fi}}
+
+\protect \endinput
+
+% Example (dutch)
+%
+% \stelpapierformaatin [S6]
+% \steltolerantiein [soepel,rek]
+% \stelkleurenin [status=start]
+% \stelvoetin [strut=nee]
+% \stelwitruimtein [groot]
+%
+% \stellayoutin
+% [rechterrand=5cm,breedte=passend,marge=0pt,randafstand=1cm,
+% voet=4cm,voetafstand=1cm,hoofd=0cm]
+%
+% \stelteksttekstenin[rand][][\vbox{\flushtextflow{alpha}}]
+% \stelvoettekstenin [rand][][\vbox{\flushtextflow{beta}}]
+% \stelvoettekstenin [\vbox{\flushtextflow{gamma}}][]
+%
+% \definetextflow [alfa] [breedte=\rechterrandbreedte]
+% \definetextflow [beta] [breedte=\rechterrandbreedte]
+% \definetextflow [gamma] [breedte=\voethoogte]
+%
+% \starttekst
+%
+% \dorecurse{50}
+% {\getrandomnumber{\funny}{0}{8}
+% \ifcase\funny \starttextflow[alfa] \input tufte.tex \stoptextflow
+% \or \starttextflow[beta] \input knuth.tex \stoptextflow
+% \or \starttextflow[gamma] \input materie.tex \stoptextflow
+% \or {\bf TUFTE}\quad \input tufte \par
+% \or {\bf TUFTE}\quad \input tufte \par
+% \or {\bf KNUTH}\quad \input knuth \par
+% \or {\bf KNUTH}\quad \input knuth \par
+% \or {\bf MATERIE}\quad \input materie \par
+% \else {\bf MATERIE}\quad \input materie \par
+% \fi}
+%
+% \stoptekst
diff --git a/tex/context/base/page-flw.mkiv b/tex/context/base/page-flw.mkiv
new file mode 100644
index 000000000..81b4fedcb
--- /dev/null
+++ b/tex/context/base/page-flw.mkiv
@@ -0,0 +1,107 @@
+%D \module
+%D [ file=page-flw,
+%D version=2003.04.19, % from test-002 (1997) profile experiment
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Text Flows,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Text Flows}
+
+%D This is high experimental and especially flushing may change (proper
+%D spacing is the driving force here).
+
+\unprotect
+
+\unexpanded\def\definetextflow
+ {\dodoubleempty\dodefinetextflow}
+
+\def\dodefinetextflow[#1][#2]% flow settings
+ {\iffirstargument
+ \doiftextflowcollectorelse{#1}
+ {\setbox\textflowcollector{#1}\emptybox}
+ {\@EA\newbox\csname\??tx:c:#1\endcsname}%
+ \getparameters[\??tx:p:#1]
+ [\c!width=\hsize,\c!style=,#2]%
+ \fi}
+
+\def\textflowparameter#1#2{\csname\??tx:p:#1#2\endcsname}
+\def\textflowcollector #1{\csname\??tx:c:#1\endcsname}
+
+\def\doiftextflowcollectorelse#1{\doifdefinedelse{\??tx:c:#1}}
+
+\def\doiftextflowelse#1%
+ {\doiftextflowcollectorelse{#1}
+ {\ifvoid\textflowcollector{#1}%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+ {\secondoftwoarguments}}
+
+\def\doiftextflow#1%
+ {\doiftextflowelse{#1}\firstofoneargument\gobbleoneargument}
+
+\unexpanded\def\starttextflow[#1]%
+ {\doiftextflowcollectorelse{#1}
+ {\global\setbox\textflowcollector{#1}\vbox
+ \bgroup
+ \unvbox\textflowcollector{#1}%
+ \hsize\textflowparameter{#1}\c!width
+ \doifsomething{\textflowparameter{#1}\c!style}%
+ {\doconvertfont{\textflowparameter{#1}\c!style}}%
+ \unexpanded\def\stoptextflow{\endgraf\egroup}}
+ {\let\stoptextflow\relax}}
+
+\def\flushtextflow#1%
+ {\doiftextflow{#1}
+ {\ifdim\ht\textflowcollector{#1}>\vsize
+ \setbox\scratchbox\vsplit\textflowcollector{#1} to \vsize
+ \unvbox\scratchbox
+ \else
+ \unvbox\textflowcollector{#1}%
+ \fi}}
+
+\protect \endinput
+
+% Example (dutch)
+%
+% \stelpapierformaatin [S6]
+% \steltolerantiein [soepel,rek]
+% \stelkleurenin [status=start]
+% \stelvoetin [strut=nee]
+% \stelwitruimtein [groot]
+%
+% \stellayoutin
+% [rechterrand=5cm,breedte=passend,marge=0pt,randafstand=1cm,
+% voet=4cm,voetafstand=1cm,hoofd=0cm]
+%
+% \stelteksttekstenin[rand][][\vbox{\flushtextflow{alpha}}]
+% \stelvoettekstenin [rand][][\vbox{\flushtextflow{beta}}]
+% \stelvoettekstenin [\vbox{\flushtextflow{gamma}}][]
+%
+% \definetextflow [alfa] [breedte=\rechterrandbreedte]
+% \definetextflow [beta] [breedte=\rechterrandbreedte]
+% \definetextflow [gamma] [breedte=\voethoogte]
+%
+% \starttekst
+%
+% \dorecurse{50}
+% {\getrandomnumber{\funny}{0}{8}
+% \ifcase\funny \starttextflow[alfa] \input tufte.tex \stoptextflow
+% \or \starttextflow[beta] \input knuth.tex \stoptextflow
+% \or \starttextflow[gamma] \input materie.tex \stoptextflow
+% \or {\bf TUFTE}\quad \input tufte \par
+% \or {\bf TUFTE}\quad \input tufte \par
+% \or {\bf KNUTH}\quad \input knuth \par
+% \or {\bf KNUTH}\quad \input knuth \par
+% \or {\bf MATERIE}\quad \input materie \par
+% \else {\bf MATERIE}\quad \input materie \par
+% \fi}
+%
+% \stoptekst
diff --git a/tex/context/base/page-imp.mkii b/tex/context/base/page-imp.mkii
new file mode 100644
index 000000000..e4ece04a6
--- /dev/null
+++ b/tex/context/base/page-imp.mkii
@@ -0,0 +1,1314 @@
+%D \module
+%D [ file=page-imp, % was: core-pag,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Pagebody Building (Imposition),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% much of this can more to run time loading !
+
+\writestatus{loading}{ConTeXt Page Macros / Pagebody Building}
+
+\unprotect
+
+% sizing bug:
+%
+% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe
+%
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+% to be moved code:
+
+\newif\ifclipprintbox \clipprintboxtrue
+%newif\ifclippagebox \clippageboxtrue
+
+\def\clippedprintbox#1#2% can be made more efficient, see other clipper
+ {\ifclipprintbox
+ \!!widthc \pagebackgroundoffset
+ \!!widtha \dimexpr\paperwidth + \!!widthc\relax
+ \!!heighta\dimexpr\paperheight+2\!!widthc\relax
+ \setbox#2\vbox to \paperheight{\vfill\box#2}%
+ \ht#2\paperheight
+ \wd#2\paperwidth
+ \setbox#2\vbox
+ {\framed
+ [\c!offset=\!!widthc,\c!strut=\v!no,\c!frame=\v!off]
+ {\box#2}}%
+ \setbox#2\hbox to \paperwidth
+ {\ifcase#1\relax
+ \!!widthb\zeropoint
+ \hskip-\!!widthc
+ \else
+ \!!widthb\!!widthc
+ \fi
+ \lower\!!widthc\hbox
+ {\clip
+ [\c!width=\!!widtha,\c!height=\!!heighta,
+ \c!hoffset=\!!widthb,\c!voffset=\zeropoint]
+ {\box#2}}}%
+ \wd#2\paperwidth
+ \ht#2\paperheight
+ \fi
+ \box#2\relax}
+
+\let\clippagebox \gobbleoneargument
+\let\clipprintbox\gobbleoneargument
+
+% \setuppagenumbering[alternative=doublesided]
+% \setupcolors[state=start]
+% \setuppapersize[A4][A4,oversized]
+% \setuplayout[location=middle,clipoffset=5mm]
+% \setupbackgrounds
+% [page]
+% [frame=on,rulethickness=1mm,
+% backgroundoffset=10mm,background=color,backgroundcolor=red]
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+\def\clippagebox#1%
+ {\ifdim\@@lyclipoffset>\zeropoint
+ \!!widtha \wd#1%
+ \!!heighta\ht#1%
+ \!!deptha \dp#1%
+ \setbox#1\hbox
+ {\!!widthb \@@lyclipoffset
+ \advance\!!heighta\dimexpr\!!deptha+2\!!widthb\relax
+ \advance\!!widtha \!!widthb
+ \doifbothsides
+ {\advance\!!widtha\!!widthb \!!widthc-\!!widthb \hskip\!!widthc}%
+ {\!!widthc\zeropoint}
+ {\!!widthc-\!!widthb \hskip\!!widthc}%
+ \lower\!!widthb\hbox
+ {\clip
+ [\c!hoffset=\!!widthc,
+ \c!voffset=-\!!widthb,
+ \c!width=\!!widtha,
+ \c!height=\!!heighta]%
+ {\box#1}}}%
+ \wd#1\!!widtha
+ \ht#1\!!heighta
+ \dp#1\!!deptha
+ \fi}
+
+%D \macros
+%D {starttextdata}
+%D
+%D This is a user macro (appending to every last shipout is not
+%D really user friendly.
+
+\newtoks \collectedtextdata
+
+\long\def\starttextdata#1\stoptextdata
+ {\doglobal\appendtoks#1\to\collectedtextdata}
+
+\def\flushtextdata
+ {\vsmashed{\the\collectedtextdata}% all dimensions zero
+ \global\collectedtextdata\emptytoks
+ \globallet\flushtextdata\donothing}
+
+\prependtoks \flushtextdata \to \everylastshipout
+
+% moved code:
+
+% \def\myshipout#1%
+% {\beforeshipout % voor de pagebody dus !
+% \dontshowcomposition
+% \ifarrangingpages\@EA\actualarrange\else\@EA\actualshipout\fi
+% {\thisisrealpage\realfolio#1}%
+% \gotonextrealpage
+% \aftershipout}
+
+\def\installpagehandler#1#2% % a handler takes one argument: something to be boxed
+ {\setvalue{\??pp:\c!method:#1}{#2}} % and shipped out (don't depend on the exact package)
+
+\installpagehandler\v!normal
+ {\ifarrangingpages\expandafter\actualarrange\else\expandafter\actualshipout\fi}
+
+\def\myshipout#1%
+ {\beforeshipout % voor de pagebody dus !
+ \dontshowcomposition
+ \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{\thisisrealpage\realfolio#1}%
+ \gotonextrealpage
+ \aftershipout}
+
+\newbox\postponedcontent
+
+% \def\flushatshipout
+% {\dowithnextbox
+% {\global\setbox\postponedcontent\hbox to \zeropoint
+% {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
+% \box\postponedcontent\flushnextbox}%
+% \global\ht\postponedcontent\zeropoint
+% \global\dp\postponedcontent\zeropoint
+% \global\wd\postponedcontent\zeropoint}%
+% \hbox}
+
+\def\flushatshipout
+ {\dowithnextbox
+ {\global\setbox\postponedcontent\hbox to \zeropoint
+ {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
+ \unhbox\postponedcontent\unhbox\nextbox}%
+ \global\ht\postponedcontent\zeropoint
+ \global\dp\postponedcontent\zeropoint
+ \global\wd\postponedcontent\zeropoint}%
+ \hbox}
+
+% \starttypen
+% \def\pagestoshipout{1,3,5}
+% \stoptypen
+
+\newcount\shippedoutpages
+
+\let\pagestoshipout\empty % {1,3,6}
+\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even
+
+\ifx\finalizeshipoutbox\undefined \let\finalizeshipoutbox\firstofoneargument \fi
+
+\def\actualshipout#1%
+ {\global\advance\shippedoutpages\plusone
+ % this is not resource safe!
+ \ifx\pagestoshipout\empty
+ \ifcase\whichpagetoshipout\relax
+ \donetrue
+ \or % 1
+ \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
+ \or % 2
+ \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
+ \else
+ \donetrue
+ \fi
+ \else % testen, aangepast / expanded nodig ?
+ \expanded{\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}%
+ \donetrue\donefalse
+ \fi
+ \ifdone
+ \shipout\vbox
+ {\forgetall
+ \offinterlineskip
+ \dontcomplain
+ \scratchdimen-1in
+ \vskip\scratchdimen
+ \hskip\scratchdimen
+ \hbox % \setbox0=\box.. is nicer
+ {\setbox0\hbox{\finalizeshipoutbox{#1}}% just in case there are objects there, hook for testing
+ \setbox\scratchbox\hbox
+ {% before the main one !
+ \ifcase\realfolio \or
+ \the\everyfirstshipout
+ \global\everyfirstshipout\emptytoks
+ \fi
+ % the main one
+ \the\everyshipout\relax
+ % always last (and after the main one)
+ \ifnum\realpageno=\lastpage\relax
+ \the\everylastshipout
+ \global\everylastshipout\emptytoks
+ \fi}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \box\postponedcontent % evt ver naar links !
+ \box0}}%
+ \else
+ \message
+ {[\ifarrangingpages arranged \fi page
+ \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
+ not flushed]}%
+ \setbox0\hbox{#1}%
+ \deadcycles\zerocount
+ \fi}
+
+\def\actualarrange#1%
+ {\setbox0\hbox{\thisisrealpage{\realfolio}#1}%
+ \pusharrangedpage0%
+ \deadcycles\zerocount}
+
+%D We need a couple of boxes for duplex printing \unknown
+
+\newbox\arrangedpageA \newbox\arrangedpageB
+
+%D \unknown\ and some for simulating big sheets.
+
+\newbox\arrangedpageC \newbox\arrangedpageD
+\newbox\arrangedpageE \newbox\arrangedpageF
+\newbox\arrangedpageG \newbox\arrangedpageH
+
+\newif\ifswaparranged
+\newif\ifnegatearranged
+\newif\ifmirrorarranged
+\newif\ifdoublearranged
+
+\newif\ifarrangingdisabled
+
+\def\arrangedrotationO{0}
+\def\arrangedrotationE{0}
+
+\newcounter\arrangedpageN
+\newcounter\arrangedpageM
+
+\chardef\arrangedpageT=1
+\chardef\arrangedpageX=1
+\chardef\arrangedpageY=1
+
+\def\calculatepaperoffsets#1%
+ {\scratchdimen\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen \arrangedpageX
+ \global\advance\paperwidth -2\scratchdimen
+ \scratchdimen\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen \arrangedpageY
+ \global\advance\paperheight-2\scratchdimen}
+
+\newconditional\arrangedbackgroundokay % more ifs -> conditionals
+
+\def\setuparranging[#1]%
+ {\ifarrangingdisabled \else
+ \doifelse{#1}\v!disable
+ {\global\arrangingdisabledtrue}
+ {\global\arrangingdisabledfalse}%
+ \global\arrangingpagestrue
+ \global\negatearrangedfalse
+ \global\mirrorarrangedfalse
+ \global\doublearrangedfalse
+ \gdef\arrangedrotationO{0}%
+ \gdef\arrangedrotationE{180}%
+ \processallactionsinset
+ [#1]
+ [ \v!mirrored=>\global\mirrorarrangedtrue,
+ \v!doublesided=>\global\doublearrangedtrue,
+ \v!negative=>\global\negatearrangedtrue,
+ \v!rotated=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+ 90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+ 180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
+ 270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
+ \s!reset=>\global\arrangingpagesfalse,
+ \v!background=>\global\settrue\arrangedbackgroundokay,
+ \s!unknown=>\checkinstalledpagearrangement\commalistelement]%
+ % no \s!default=> we can have aaa,,bbb
+ \ifx\handlearrangedpage\undefined
+ \global\arrangingpagesfalse
+ \fi
+ \doifcommonelse{#1}{90,270,\v!rotated}
+ {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
+ \setuppapersize
+ \ifarrangingpages
+ \abortutilitygeneration
+ \fi
+ \fi}
+
+\def\installpagearrangement #1 %
+ {\setgvalue{\??pp\??pp#1}}
+
+\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
+ {\executeifdefined{\??pp\??pp#1}\donothing}
+
+\def\dosetuparrangement#1#2#3#4#5#6#7#8%
+ {\global\chardef\arrangedpageX #1%
+ \global\chardef\arrangedpageY #2%
+ \global\chardef\arrangedpageT #3%
+ \global\chardef\horizontalcutmarks#4%
+ \global\chardef\verticalcutmarks #5%
+ \global\let \pusharrangedpage #6%
+ \global\let \poparrangedpages #7%
+ \global\let \handlearrangedpage#8}
+
+\installpagearrangement {\v!normal}
+ {\global\arrangingpagesfalse}
+
+\installpagearrangement 2*16
+ {\dosetuparrangement{4}{4}{16}{5}{5}%
+ \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*8
+ {\dosetuparrangement{4}{2}{8}{5}{3}%
+ \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*4
+ {\dosetuparrangement{2}{2}{4}{3}{3}%
+ \pusharrangedpageEIGHT\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*2
+ {\dosetuparrangement{2}{1}{2}{3}{2}%
+ \pusharrangedpageFOURA\poparrangedpagesAB\relax}
+
+\installpagearrangement 2**2
+ {\dosetuparrangement{2}{1}{2}{3}{2}%
+ \pusharrangedpageFOURB\poparrangedpagesAB\relax}
+
+\installpagearrangement 2SIDE
+ {\dosetuparrangement{2}{1}{2}{3}{2}%
+ \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE}
+
+\installpagearrangement 2TOP
+ {\dosetuparrangement{1}{2}{2}{2}{3}%
+ \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP}
+
+\installpagearrangement 2UP
+ {\dosetuparrangement{2}{1}{4}{3}{2}%
+ \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP}
+
+\installpagearrangement 2DOWN
+ {\dosetuparrangement{1}{2}{4}{2}{3}%
+ \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
+
+\installpagearrangement 2*4*2 % one defined by Willy Egger:
+ {\dosetuparrangement{2}{2}{4}{3}{2}%
+ \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
+
+\installpagearrangement 2*2*4 % onother one of Willy Egger
+ {\dosetuparrangement{2}{1}{8}{3}{2}%
+ \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}
+
+\installpagearrangement 2TOPSIDE
+ {\dosetuparrangement{1}{2}{4}{2}{3}%
+ \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
+
+% \def\filluparrangedpages % beware: \realpageno is 1 ahead
+% {\ifarrangingpages
+% \scratchcounter-\realpageno
+% \divide\scratchcounter \arrangedpageT
+% \multiply\scratchcounter \arrangedpageT
+% \advance\scratchcounter \realpageno
+% \advance\scratchcounter \minusone
+% \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}%
+% \fi}
+
+\def\filluparrangedpages % beware: \realpageno is 1 ahead
+ {\ifarrangingpages
+ \scratchcounter\numexpr\realpageno-\plusone\relax
+ \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter
+ \ifcase\scratchcounter\else
+ \advance\scratchcounter \plusone
+ \dostepwiserecurse\scratchcounter\arrangedpageT\plusone
+ {\noheaderandfooterlines\ejectdummypage}%
+ \fi
+ \fi}
+
+\def\handlearrangedpageXandY#1#2#3#4#5%
+ {\global\setbox#5\hbox to \arrangedpageX\paperwidth
+ {\setbox\scratchbox\vbox to \arrangedpageY\paperheight
+ {\forgetall
+ \offinterlineskip
+ \dontcomplain
+ \vskip#4\paperheight
+ \hskip#3\paperwidth
+ \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
+ \vfill}%
+ \wd\scratchbox\zeropoint
+ \box\scratchbox\box#5\hss}}
+
+\def\gotonextarrangepage
+ {\global\advance\arrangeno \plusone
+ \def\pagecutmarksymbol{\the\arrangeno}}
+
+\def\outputarrangedbox#1%
+ {\bgroup
+ \gotonextarrangepage
+ \ifnum\arrangedrotationO\arrangedrotationE>\zerocount
+ \setbox#1\vbox
+ {\ifdoublearranged
+ \ifodd\arrangeno
+ \dorotatebox\arrangedrotationO\hbox{\box#1}%
+ \else
+ \dorotatebox\arrangedrotationE\hbox{\box#1}%
+ \fi
+ \else
+ \dorotatebox\arrangedrotationO\hbox{\box#1}%
+ \fi}%
+ \fi
+ \ifmirrorarranged
+ \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
+ \fi
+ \ifnegatearranged
+ \negatecolorbox{#1}%
+ \fi
+ \finishpagebox#1%
+ \ifconditional\arrangedbackgroundokay\addprintbackground#1\fi
+ \actualshipout{\box#1}%
+ \egroup}
+
+%D The format file can be 16K smaller when we postpone the
+%D real arrangments. Some day ...
+
+% TOP
+
+% 32/16/8/4/SIDE
+
+\def\poparrangedpagesAB
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}033\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}003\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}130\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}130\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}033\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}003\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}102\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12
+ \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14
+ \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16
+ \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17
+ \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19
+ \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21
+ \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22
+ \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23
+ \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24
+ \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25
+ \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26
+ \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28
+ \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30
+ \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31
+ \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}031\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}031\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}130\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}130\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}120\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13
+ \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01}
+\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}
+
+\def\pusharrangedpageFOURdo#1#2#3%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#3}010\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB % 2/3 not {1}
+ \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB % 3/2 not {1}
+ \or \handlearrangedpageXandY{#3}000\arrangedpageA % 4
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageSIDETOP#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \poparrangedpages
+ \fi}
+
+\def\handlearrangedpageSIDE
+ {\global\wd\arrangedpageA\paperwidth
+ \global\wd\arrangedpageB\paperwidth
+ \global\setbox\arrangedpageA\hbox
+ {\box\arrangedpageA\box\arrangedpageB}%
+ \global\ht\arrangedpageA\paperheight}
+
+\def\handlearrangedpageTOP
+ {\global\ht\arrangedpageA\paperheight
+ \global\ht\arrangedpageB\paperheight
+ \global\setbox\arrangedpageA\vbox
+ {\forgetall\offinterlineskip\vskip\paperheight
+ \box\arrangedpageA\box\arrangedpageB}%
+ \global\setbox\arrangedpageB\box\scratchbox} % ?
+
+% 2UP/2DOWN / 1pt prevents overflow
+
+\def\splitoffarrangedpagesTWO
+ {\splittopskip\zeropoint
+ \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint
+ \scratchdimen\dimexpr\ht\arrangedpageB-\onepoint\relax
+ \ifdim\scratchdimen>\onepoint
+ \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
+ \fi}
+
+\def\handlearrangedpageTWOUP
+ {\splitoffarrangedpagesTWO
+ \ifswaparranged
+ \global\setbox\arrangedpageA\hbox
+ {\clippedprintbox0\arrangedpageA
+ \clippedprintbox1\arrangedpageB}%
+ \swaparrangedfalse
+ \else
+ \global\setbox\arrangedpageA\hbox
+ {\clippedprintbox0\arrangedpageB
+ \clippedprintbox1\arrangedpageA}%
+ \swaparrangedtrue
+ \fi
+ \global\ht\arrangedpageA\paperheight
+ \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\handlearrangedpageTWODOWN
+ {\splitoffarrangedpagesTWO
+ \global\ht\arrangedpageA\paperheight
+ \global\ht\arrangedpageB\paperheight
+ \ifswaparranged
+ \global\setbox\arrangedpageA\vbox
+ {\forgetall\offinterlineskip\vskip\paperheight
+ \box\arrangedpageA\box\arrangedpageB}%
+ \swaparrangedfalse
+ \else
+ \global\setbox\arrangedpageA\vbox
+ {\forgetall\offinterlineskip\vskip\paperheight
+ \box\arrangedpageB\box\arrangedpageA}%
+ \swaparrangedtrue
+ \fi
+ \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\poparrangedpagesTWO
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \swaparrangedfalse
+ \doloop
+ {\handlearrangedpage
+ \bgroup
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \ht\arrangedpageA\paperheight
+ \wd\arrangedpageA\paperwidth
+ \outputarrangedbox\arrangedpageA
+ \egroup
+ \ifdim\ht\arrangedpageB=\zeropoint
+ \exitloop
+ \fi}%
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+\def\pusharrangedpageTWO#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \global\setbox\arrangedpageB\vbox
+ {\forgetall
+ \offinterlineskip
+ \unvbox\arrangedpageB
+ \allowbreak
+ \ht#1\onepoint
+ \dp#1\zeropoint
+ \vbox{\box#1}}}
+
+\def\poparrangedpagesTWOTOPSIDE
+ {\ifnum\arrangedpageN>\zerocount
+ \bgroup
+ \gdef\arrangedpageN{2}\poparrangedpagesTWO
+ \let\arrangedpageA\arrangedpageC
+ \let\arrangedpageB\arrangedpageD
+ \gdef\arrangedpageN{2}\poparrangedpagesTWO
+ \doglobal\newcounter\arrangedpageN
+ \egroup
+ \fi}
+
+\def\pusharrangedpageTWOTOPSIDE#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 2
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 2
+ \poparrangedpages
+ \fi}
+
+%D Willy Egger's sheet simulations:
+
+\def\poparrangedpagesAtoH
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \outputarrangedbox\arrangedpageC
+ \outputarrangedbox\arrangedpageD
+ \outputarrangedbox\arrangedpageE
+ \outputarrangedbox\arrangedpageF
+ \outputarrangedbox\arrangedpageG
+ \outputarrangedbox\arrangedpageH
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\poparrangedpagesAtoD
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \outputarrangedbox\arrangedpageC
+ \outputarrangedbox\arrangedpageD
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+% to arrange 16 pages on 4 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENFOUR#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageE % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageF % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageG % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageH % 8
+ \or \handlearrangedpageXandY{#1}010\arrangedpageH % 9
+ \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10
+ \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11
+ \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12
+ \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENTWO#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}011\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}001\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageD % 5
+ \or \handlearrangedpageXandY{#1}110\arrangedpageC % 6
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11
+ \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12
+ \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13
+ \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+% % handy for stickers etc, this way we can treat them as page
+%
+% \setuppapersize [XY][A4]
+% \setuppaper [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6]
+% \setuplayout [page] [topspace=5mm,backspace=5mm]
+% \setuplayout [page]
+% \setuplayout [location=middle]
+% \setuparranging [XY]
+% \showframe
+%
+% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext
+
+\def\pusharrangedpageXY#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \doglobal\increment\arrangedpageM
+ \global\setbox\arrangedpageB\hbox
+ \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi
+ {\ifvoid\arrangedpageB\else
+ \unhbox\arrangedpageB
+ \ifdim\@@ppdx>\zeropoint \else \hss\fi
+ \hskip\@@ppdx
+ \ifdim\@@ppdx>\zeropoint \else \hss\fi
+ \fi
+ \box#1}%
+ \ifnum\arrangedpageM<\arrangedpageX\else
+ \global\setbox\arrangedpageA\vbox
+ \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi
+ {\offinterlineskip
+ \ifvoid\arrangedpageA\else
+ \unvbox\arrangedpageA
+ \ifdim\@@ppdy>\zeropoint \else \vss\fi
+ \vskip\@@ppdy
+ \ifdim\@@ppdy>\zeropoint \else \vss\fi
+ \fi
+ \box\arrangedpageB}%
+ \doglobal\newcounter\arrangedpageM
+ \fi
+ \ifnum\arrangedpageN<\arrangedpageT\else
+ \poparrangedpages
+ \fi}
+
+\def\poparrangedpagesXY
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight \arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \doglobal\newcounter\arrangedpageN
+ \doglobal\newcounter\arrangedpageM
+ \fi}
+
+\installpagearrangement XY
+ {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount
+ \pusharrangedpageXY\poparrangedpagesXY\relax}
+
+%D A crazy definition, don't guess who pushed me for the landscape option.
+
+\definepapersize
+ [XY]
+ [\c!height=\dimexpr\dimexpr\@@ppheight-\numexpr\@@ppny-1\relax\dimexpr\@@ppdy\relax\relax/\@@ppny\relax,
+ \c!width =\dimexpr\dimexpr\@@ppwidth -\numexpr\@@ppnx-1\relax\dimexpr\@@ppdx\relax\relax/\@@ppnx\relax]
+
+\setuppaper
+ [\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax,
+ \c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax]
+
+% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
+% \definepageshift[test][vertical] [10pt,20pt,30pt,40pt,50pt]
+%
+% \setuppageshift[test]
+% \setuppageshift[test][test]
+% \setuppageshift[test][none]
+% \setuppageshift[none][test]
+% \setuppageshift[paper][test][test] % arrange only
+% \setuppageshift[paper][test] % arrange only
+% \setuppageshift[print][test][test]
+%
+% \showframe \dorecurse{100}{\input tufte \par}
+
+% #1=name #2=horizontal|vertical #3=shiftlist
+
+\def\definepageshift
+ {\dotripleargument\dodefinepageshift}
+
+\def\dodefinepageshift[#1][#2][#3]%
+ {\setvalue{\??pt#2:#1}{#3}}
+
+\letempty \hpageshifts \newcounter\nofhpageshifts
+\letempty \vpageshifts \newcounter\nofvpageshifts
+
+% \let\shiftprintpagebox\gobbleoneargument
+% \let\shiftpaperpagebox\gobbleoneargument
+
+\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
+ {\ifx#2\empty
+ #1\zeropoint
+ \else
+ \doglobal\increment#3%
+ \getfromcommacommand[#2][#3]%
+ \ifx\commalistelement\empty
+ \globallet#3\!!plusone
+ \getfromcommacommand[#2][#3]%
+ \fi
+ \ifx\commalistelement\empty
+ #1\zeropoint
+ \else
+ #1=\commalistelement
+ \donetrue
+ \fi
+ \fi}
+
+\def\shiftpagebox#1%
+ {\donefalse
+ \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts
+ \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts
+ \ifdone % see also layout offsets, maybe \movebox
+ \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+ \setbox#1\vbox % \forgetall already done
+ {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}%
+ \next
+ \fi}
+
+\def\setuppageshift
+ {\dotripleempty\dosetuppageshift}
+
+\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical
+ {\ifthirdargument % paper=arrange
+ \let\hpageshifts\empty
+ \let\vpageshifts\empty
+ \let\shiftprintpagebox\gobbleoneargument
+ \let\shiftpaperpagebox\gobbleoneargument
+ \doifdefined{\??pt\v!horizontal:#2}
+ {\edef\hpageshifts{\getvalue{\??pt\v!horizontal:#2}}}%
+ \doifdefined{\??pt\v!vertical :#3}
+ {\edef\vpageshifts{\getvalue{\??pt\v!vertical :#3}}}%
+ \doif{#1}\v!page{\let\shiftprintpagebox\shiftpagebox}%
+ \doif{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}%
+ \else\ifsecondargument
+ \doifinsetelse{#1}{\v!page,\v!paper}
+ {\setuppageshift[#1][#2][#2]}
+ {\setuppageshift[\v!page][#1][#2]}%
+ \else\iffirstargument
+ \setuppageshift[\v!page][#1][#1]%
+ \fi\fi\fi}
+
+%D One can (mis)use this mechanism, in close cooperation
+%D with \PDFTEX\ to arrange pages of already produced files.
+%D
+%D \starttyping
+%D \insertpages[file.pdf][1,3][n=30,width=18cm]
+%D \stoptyping
+%D
+%D The pages are inserted in the text area, and even pages
+%D are repositioned according to the width. In this example
+%D empty pages are added after page 1 and 3.
+%D
+%D Selecting pages can be accomplished by:
+%D
+%D \starttyping
+%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
+%D \stoptyping
+%D
+%D One may pass \type {odd} or \type {even} instead of a
+%D comma separated list. A third alternative is:
+%D
+%D \starttyping
+%D \copypages[file.pdf][n=30,scale=950]
+%D \stoptyping
+%D
+%D This macros inserts the page, according to the settings
+%D provided.
+
+\def\insertpages
+ {\dotripleempty\doinsertpages}
+
+\def\doinsertpages[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\dodoinsertpages[#1][][#2]}
+ {\dodoinsertpages[#1][#2][#3]}}
+
+\def\dodoinsertpages[#1][#2][#3]%
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
+ \doifinset0{#2}{\null\page}%
+ \dorecurse\@@ipn
+ {\dofilterpage{#1}\recurselevel
+ \doifinset\recurselevel{#2}{\null\page}}%
+ \egroup}
+
+\def\filterpages
+ {\dotripleempty\dofilterpages}
+
+\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
+ \doifelse{#2}\v!even
+ {\dorecurse\@@ipn
+ {\ifodd\recurselevel\relax\else\dofilterpage{#1}\recurselevel\fi}}
+ {\doifelse{#2}\v!odd
+ {\dorecurse\@@ipn
+ {\ifodd\recurselevel\relax\dofilterpage{#1}\recurselevel\fi}}
+ {\def\dodocommand##1%
+ {\ifnum##1>\@@ipn\else\dofilterpage{#1}{##1}\fi}%
+ \def\docommand##1%
+ {\dowithrange{##1}\dodocommand}%
+ \processcommalist[#2]\docommand}}%
+ \egroup}
+
+\def\dofilterpage#1#2%
+ {\hbox to \textwidth
+ {\ifdoublesided\ifdim\@@ipwidth>\zeropoint\relax\ifodd\realpageno\else
+ \hfill
+ \def\dowithfigure{\hskip-\@@ipwidth}%
+ \fi\fi\fi
+ \setbox0\hbox
+ {\externalfigure[#1][\c!page=#2,\c!height=\textheight]}%
+ \wd0\zeropoint
+ \box0}
+ \page}
+
+\def\copypages
+ {\dodoubleempty\docopypages}
+
+\def\docopypages[#1][#2]%
+ {\bgroup
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip]
+ [\c!n=\noffigurepages,
+ \c!marking=\v!off,
+ \c!scale=\!!thousand,
+ \c!offset=\!!zeropoint,
+ #2]%
+ \dorecurse\@@ipn
+ {\vbox to \textheight
+ {\hsize\textwidth
+ \scratchdimen\@@ipoffset
+ \centeredbox
+ {\doifelse\@@ipmarking\v!on\cuthbox\hbox
+ {\ifdim\scratchdimen>\zeropoint\relax
+ \advance\vsize -2\scratchdimen
+ \advance\hsize -2\scratchdimen
+ \externalfigure[#1][\c!page=\recurselevel,#2,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]%
+ \else
+ \externalfigure[#1][\c!page=\recurselevel,#2,\c!offset=\v!overlay]%
+ \fi}}}
+ \page}
+ \egroup}
+
+%D \macros
+%D {combinepages}
+%D
+%D Yet another way of postprocessing is handles by \type
+%D {\combinepages}. This macro builds a matrix of pages from a
+%D file, for example:
+%D
+%D \starttyping
+%D \setuppapersize
+%D [A4][A4] % or [A4,landscape][A4,landscape]
+%D
+%D \setuplayout
+%D [header=0pt,footer=1cm,
+%D backspace=1cm,topspace=1cm,
+%D width=middle,height=middle]
+%D
+%D \setupfootertexts
+%D [presentation---\currentdate\space---\space\pagenumber]
+%D
+%D \starttext
+%D \combinepages[slides][nx=2,ny=3,frame=on]
+%D \stoptext
+%D \stoptyping
+%D
+%D One can influence the way the pages are combined. (This
+%D will be explained some time.)
+
+\def\combinepages
+ {\dodoubleempty\docombinepages}
+
+\def\docombinepages[#1][#2]% a=perpag b=free
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters
+ [\??ip]
+ [\c!alternative=\v!a,
+ \c!n=\noffigurepages,\c!nx=2,\c!ny=2,\c!start=1,\c!stop=\!!maxcard,
+ \c!distance=\bodyfontsize,
+ \c!bottom=\vfill,\c!top=\vss,
+ \c!left=\hss,\c!right=\hss,
+ \c!before=\page,\c!after=\page,\c!inbetween=\blank,
+ \c!frame=,\c!background=,\c!backgroundcolor=,
+ #2]%
+ \def\@@ipname{#1}%
+ \@@ipbefore
+ \executeifdefined{\strippedcsname\docombinepages\@@ipalternative}\docombinepagesb
+ \@@ipafter
+ \egroup}
+
+\def\docombinepagesa
+ {\globallet\combinedpagescounter\@@ipstart
+ \doloop
+ {\vbox to \textheight
+ {\hsize\textwidth % ? ?
+ \scratchdimen\@@ipdistance
+ \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
+ \dorecurse\@@ipny
+ {\hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\vbox to \!!heighta
+ {\hsize\!!widtha
+ \vsize\!!heighta
+ \@@iptop
+ \hbox to \hsize
+ {\@@ipleft
+ \ifnum\combinedpagescounter>\@@ipstop\relax
+ \globallet\@@ipn\!!zerocount
+ \else\ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[\@@ipname]
+ [\c!object=\v!no,
+ \c!page=\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]%
+ \fi\fi
+ \@@ipright}
+ \@@ipbottom}%
+ \doglobal\increment\combinedpagescounter
+ \hfil}%
+ \hfilneg}
+ \vfil}%
+ \vfilneg}%
+ \page
+ \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\def\docombinepagesc
+ {\globallet\combinedpagescounter\@@ipstart
+ \doloop
+ {\vbox to \textheight
+ {\hsize\textwidth % ? ?
+ \scratchdimen\@@ipdistance
+ \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
+ \hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\@@ipleft
+ \vbox to \textheight
+ {\hsize\!!widtha
+ {\dorecurse\@@ipny
+ {\@@iptop
+ \hbox to \hsize
+ {\vbox to \!!heighta
+ {\hsize\!!widtha
+ \vsize\!!heighta
+ \ifnum\combinedpagescounter>\@@ipstop\relax
+ \globallet\@@ipn\!!zerocount
+ \else\ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[\@@ipname]
+ [\c!object=\v!no,
+ \c!page=\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]%
+ \fi\fi}}
+ \doglobal\increment\combinedpagescounter
+ \@@ipbottom}%
+ \vfil}%
+ \vfilneg}
+ \hfil}%
+ \hfilneg}}
+ \page
+ \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\let\docombinepageshorizontal\docombinepagesa
+\let\docombinepagesvertical \docombinepagesc
+
+\def\docombinepagesb
+ {\globallet\combinedpagescounter\@@ipstart
+ \doloop
+ {\startbaselinecorrection
+ \scratchdimen\@@ipdistance
+ \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\doglobal\increment\combinedpagescounter
+ \ifnum\combinedpagescounter>\@@ipn \else
+ \expanded{\externalfigure[\@@ipname]
+ [\c!page=\combinedpagescounter,
+ \c!width=\the\!!widtha,% todo \freezedimenmacro
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]}%
+ \hfill
+ \fi}\hfillneg}%
+ \stopbaselinecorrection
+ \ifnum\combinedpagescounter<\@@ipn\relax
+ \@@ipinbetween
+ \else
+ \exitloop
+ \fi}}
+
+%D \macros
+%D {setuppagecomment,startpagecomment}
+%D
+%D This command is not yet documented. Usage:
+%D
+%D \starttyping
+%D \setuppagecomment[state=start,location=right]
+%D
+%D \startpagecomment
+%D \input knuth
+%D \stoppagecomment
+%D \stoptyping
+
+\def\setuppagecomment
+ {\dosingleempty\dosetuppagecomment}
+
+\def\dosetuppagecomment[#1]%
+ {\getparameters[\??pc][#1]%
+ \doifelse\@@pcstate\v!start
+ {\doifinsetelse\@@pclocation{\v!bottom,\v!top}
+ {\setuppapersize[\c!left=\hskip\@@pcoffset]%
+ \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcheight\relax}%
+ \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset\relax}%
+ \defineoverlay[\v!pagecomment][\placepagecommentTB]}
+ {\setuppapersize[\c!top=\vskip\@@pcoffset]%
+ \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}%
+ \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}%
+ \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
+ \processaction
+ [\@@pclocation]
+ [ \v!bottom=>{\setuppapersize[\c!bottom =\vss,\c!top =\vskip\@@pcoffset]},
+ \v!top=>{\setuppapersize[\c!top =\vss,\c!bottom =\vskip\@@pcoffset]},
+ \v!left=>{\setuppapersize[\c!left =\hss,\c!right=\hskip\@@pcoffset]},
+ \v!right=>{\setuppapersize[\c!right=\hss,\c!left =\hskip\@@pcoffset]}]%
+ \definepapersize
+ [\v!pagecomment]
+ [\c!height=\@@pcpaperheight,
+ \c!width=\@@pcpaperwidth]%
+ \let\@@pcprintpapersize\printpapersize
+ \setuppapersize[\papersize][\v!pagecomment]%
+ \setupbackgrounds[\v!paper][\c!background=\v!pagecomment]}
+ {\doif\@@pcstate\v!stop % else initialization invokes backgrounds
+ {% this should be tested first
+ % \expanded{\setuppapersize[\papersize][\@@pcprintpapersize]}%
+ \setupbackgrounds[\v!paper][\c!background=]}}}
+
+\def\@@pcprintpapersize{\printpapersize}
+
+\def\placepagecommentTB
+ {\vbox to \printpaperheight
+ {\forgetall
+ \hsize\printpaperwidth
+ \vskip\@@pcoffset
+ \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
+ \hskip\@@pcoffset
+ \vbox to \@@pcheight
+ {\forgetall
+ \hsize\paperwidth
+ \ifpagecomment
+ \getbuffer[\v!pagecomment]%
+ \global\pagecommentfalse
+ \fi}%
+ \hfill
+ \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
+ \vskip\@@pcoffset}}
+
+\def\placepagecommentLR
+ {\hbox to \printpaperwidth
+ {\hskip\@@pcoffset
+ \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
+ \vbox to \printpaperheight
+ {\forgetall
+ \vskip\@@pcoffset
+ \hsize\@@pcwidth
+ \ifpagecomment
+ \getbuffer[\v!pagecomment]%
+ \global\pagecommentfalse
+ \fi
+ \vss}%
+ \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
+ \hskip\@@pcoffset}}
+
+\newif\ifpagecomment
+
+\setvalue{\e!start\v!pagecomment}%
+ {\global\pagecommenttrue
+ \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}
+
+\setuppagecomment
+ [\c!state=, % \v!stop would invoke background calculation
+ \c!location=\v!bottom,
+ \c!offset=.5cm,
+ \c!distance=.5cm,
+ \c!height=5cm,
+ \c!width=10cm]
+
+% This macro cuts a page into n parts that can be pasted
+% together.
+
+\def\slicepages
+ {\dotripleempty\doslicepages}
+
+\def\doslicepages[#1][#2][#3]%
+ {\ifthirdargument
+ \dodoslicepages[#1][#2][#3]%
+ \else
+ \dodoslicepages[#1][#2][#2]%
+ \fi}
+
+\newcounter\slicedpagenumber
+
+\def\dodoslicepages[#1][#2][#3]%
+ {\bgroup
+ \dontcomplain
+ \globallet\slicedpagenumber\!!zerocount
+ \getfiguredimensions[#1]
+ \getparameters
+ [\??ip]
+ [\c!n=1,
+ \c!offset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
+ \c!width=\figurewidth,\c!height=\figureheight,#2]
+ \ifnum\@@ipn>\zerocount
+ \definepapersize
+ [\s!dummy][\c!height=\@@ipheight,\c!width=\@@ipwidth]
+ \setuppapersize
+ [\s!dummy][\s!dummy]
+ \setuplayout
+ [\c!backspace=\!!zeropoint,\c!topspace=\!!zeropoint,
+ \c!height=\v!middle,\c!width=\v!middle,
+ \c!textdistance=\!!zeropoint,
+ \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
+ \fi
+ \dorecurse\noffigurepages
+ {\global\let\slicedpagenumber\recurselevel
+ \ifnum\@@ipn>\plusone
+ \dorecurse\@@ipn
+ {\let\xslice\recurselevel
+ \dorecurse\@@ipn
+ {\let\yslice\recurselevel
+ \clip
+ [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
+ {\scale
+ [\c!scale=\@@ipn000]
+ {\externalfigure[#1][\c!page=\slicedpagenumber]}}
+ \page}}
+ \else
+ \ifodd\slicedpagenumber\relax
+ \getparameters[\??ip][#2]
+ \else
+ \getparameters[\??ip][#3]
+ \fi
+ \hskip\@@ipoffset
+ \clip
+ [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset,
+ \c!height=\@@ipheight,\c!width=\@@ipwidth]
+ {\externalfigure[#1][\c!page=\slicedpagenumber]}
+ \page
+ \fi}
+ \egroup}
+
+% \starttext \slicepages[slice1.pdf][n=3] \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/page-imp.mkiv b/tex/context/base/page-imp.mkiv
new file mode 100644
index 000000000..a0f32ef86
--- /dev/null
+++ b/tex/context/base/page-imp.mkiv
@@ -0,0 +1,1299 @@
+%D \module
+%D [ file=page-imp, % was: core-pag,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Pagebody Building (Imposition),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% much of this can more to run time loading !
+
+\writestatus{loading}{ConTeXt Page Macros / Pagebody Building}
+
+\unprotect
+
+% sizing bug:
+%
+% \setuppapersize[A4][A4,landscape] \setuparranging[2UP] \showframe
+%
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+% to be moved code:
+
+\newif\ifclipprintbox \clipprintboxtrue
+%newif\ifclippagebox \clippageboxtrue
+
+\def\clippedprintbox#1#2% can be made more efficient, see other clipper
+ {\ifclipprintbox
+ \!!widthc \pagebackgroundoffset
+ \!!widtha \dimexpr\paperwidth + \!!widthc\relax
+ \!!heighta\dimexpr\paperheight+2\!!widthc\relax
+ \setbox#2\vbox to \paperheight{\vfill\box#2}%
+ \ht#2\paperheight
+ \wd#2\paperwidth
+ \setbox#2\vbox
+ {\framed
+ [\c!offset=\!!widthc,\c!strut=\v!no,\c!frame=\v!off]
+ {\box#2}}%
+ \setbox#2\hbox to \paperwidth
+ {\ifcase#1\relax
+ \!!widthb\zeropoint
+ \hskip-\!!widthc
+ \else
+ \!!widthb\!!widthc
+ \fi
+ \lower\!!widthc\hbox
+ {\clip
+ [\c!width=\!!widtha,\c!height=\!!heighta,
+ \c!hoffset=\!!widthb,\c!voffset=\zeropoint]
+ {\box#2}}}%
+ \wd#2\paperwidth
+ \ht#2\paperheight
+ \fi
+ \box#2\relax}
+
+\let\clippagebox \gobbleoneargument
+\let\clipprintbox\gobbleoneargument
+
+% \setuppagenumbering[alternative=doublesided]
+% \setupcolors[state=start]
+% \setuppapersize[A4][A4,oversized]
+% \setuplayout[location=middle,clipoffset=5mm]
+% \setupbackgrounds
+% [page]
+% [frame=on,rulethickness=1mm,
+% backgroundoffset=10mm,background=color,backgroundcolor=red]
+% \starttext \dorecurse{10}{\input tufte \par} \stoptext
+
+\def\clippagebox % skip fast over false
+ {\ifdim\@@lyclipoffset>\zeropoint
+ \expandafter\doclippagebox
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doclippagebox#1%
+ {\!!widtha \wd#1%
+ \!!heighta\ht#1%
+ \!!deptha \dp#1%
+ \setbox#1\hbox
+ {\!!widthb \@@lyclipoffset
+ \advance\!!heighta\dimexpr\!!deptha+2\!!widthb\relax
+ \advance\!!widtha \!!widthb
+ \doifbothsides
+ {\advance\!!widtha\!!widthb \!!widthc-\!!widthb \hskip\!!widthc}%
+ {\!!widthc\zeropoint}
+ {\!!widthc-\!!widthb \hskip\!!widthc}%
+ \lower\!!widthb\hbox
+ {\clip
+ [\c!hoffset=\!!widthc,
+ \c!voffset=-\!!widthb,
+ \c!width=\!!widtha,
+ \c!height=\!!heighta]%
+ {\box#1}}}%
+ \wd#1\!!widtha
+ \ht#1\!!heighta
+ \dp#1\!!deptha}
+
+%D \macros
+%D {starttextdata}
+%D
+%D This is a user macro (appending to every last shipout is not
+%D really user friendly.
+
+\newtoks \collectedtextdata
+
+\long\unexpanded\def\starttextdata#1\stoptextdata
+ {\doglobal\appendtoks#1\to\collectedtextdata}
+
+\def\flushtextdata
+ {\vsmashed{\the\collectedtextdata}% all dimensions zero
+ \global\collectedtextdata\emptytoks
+ \globallet\flushtextdata\donothing}
+
+\prependtoks \flushtextdata \to \everylastshipout
+
+\def\installpagehandler#1#2% % a handler takes one argument: something to be boxed
+ {\setgvalue{\??pp:\c!method:#1}##1{#2{##1}}} % and shipped out (don't depend on the exact package)
+
+\installpagehandler\v!normal
+ {\ifarrangingpages\expandafter\actualarrange\else\expandafter\actualshipout\fi}
+
+\def\myshipout#1%
+ {\beforeshipout % voor de pagebody dus !
+ \dontshowcomposition
+ \executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{#1}%
+ \setnextrealpageno
+ \aftershipout}
+
+\newbox\postponedcontent
+
+\def\flushatshipout
+ {\dowithnextbox
+ {\global\setbox\postponedcontent\hbox to \zeropoint
+ {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
+ \unhbox\postponedcontent\unhbox\nextbox}% was \box
+ \global\ht\postponedcontent\zeropoint
+ \global\dp\postponedcontent\zeropoint
+ \global\wd\postponedcontent\zeropoint}%
+ \hbox}
+
+% \starttypen
+% \def\pagestoshipout{1,3,5}
+% \stoptypen
+
+\newcount\shippedoutpages
+
+\let\pagestoshipout\empty % {1,3,6}
+\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even
+
+\def\actualshipout#1%
+ {\global\advance\shippedoutpages\plusone
+ % this is not resource safe!
+ \ifx\pagestoshipout\empty
+ \ifcase\whichpagetoshipout\relax
+ \donetrue
+ \or % 1
+ \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
+ \or % 2
+ \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
+ \else
+ \donetrue
+ \fi
+ \else % testen, aangepast / expanded nodig ?
+ \normalexpanded{\noexpand\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}}%
+ \donetrue\donefalse
+ \fi
+ \ifdone
+ \shipout\vbox
+ {%\forgetall
+ \offinterlineskip
+ \dontcomplain
+ \scratchdimen-1in
+ \vskip\scratchdimen
+ \hskip\scratchdimen
+ \setbox0\hbox{#1}% just in case there are objects there, hook for testing
+ \finalizeshipoutbox0%
+ \setbox\scratchbox\hbox
+ {% before the main one !
+ \ifcase\realfolio \or
+ \the\everyfirstshipout
+ \global\everyfirstshipout\emptytoks
+ \fi
+ % the main one
+ \the\everyshipout\relax
+ % always last (and after the main one)
+ \ifnum\realpageno=\lastpage\relax
+ \the\everylastshipout
+ \global\everylastshipout\emptytoks
+ \fi}%
+ \smashbox\scratchbox
+ \hbox % \setbox0=\box.. is nicer
+ {\box\scratchbox
+ \ifvoid\postponedcontent\else\box\postponedcontent\fi % evt ver naar links !
+ \box0}}%
+ \else
+ \message
+ {[\ifarrangingpages arranged \fi page
+ \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
+ not flushed]}%
+ \setbox0\hbox{#1}%
+ \deadcycles\zerocount
+ \fi}
+
+\def\actualarrange#1%
+ {\setbox0\hbox{#1}%
+ \pusharrangedpage0%
+ \deadcycles\zerocount}
+
+%D We need a couple of boxes for duplex printing \unknown
+
+\newbox\arrangedpageA \newbox\arrangedpageB
+
+%D \unknown\ and some for simulating big sheets.
+
+\newbox\arrangedpageC \newbox\arrangedpageD
+\newbox\arrangedpageE \newbox\arrangedpageF
+\newbox\arrangedpageG \newbox\arrangedpageH
+
+\newif\ifswaparranged
+\newif\ifnegatearranged
+\newif\ifmirrorarranged
+\newif\ifdoublearranged
+
+\newif\ifarrangingdisabled
+
+\def\arrangedrotationO{0}
+\def\arrangedrotationE{0}
+
+\newcounter\arrangedpageN
+\newcounter\arrangedpageM
+
+\chardef\arrangedpageT=1
+\chardef\arrangedpageX=1
+\chardef\arrangedpageY=1
+
+\def\calculatepaperoffsets#1%
+ {\scratchdimen\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen \arrangedpageX
+ \global\advance\paperwidth -2\scratchdimen
+ \scratchdimen\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen \arrangedpageY
+ \global\advance\paperheight-2\scratchdimen}
+
+\newconditional\arrangedbackgroundokay % more ifs -> conditionals
+
+\unexpanded\def\setuparranging[#1]%
+ {\ifarrangingdisabled \else
+ \doifelse{#1}\v!disable
+ {\global\arrangingdisabledtrue}
+ {\global\arrangingdisabledfalse}%
+ \global\arrangingpagestrue
+ \global\negatearrangedfalse
+ \global\mirrorarrangedfalse
+ \global\doublearrangedfalse
+ \gdef\arrangedrotationO{0}%
+ \gdef\arrangedrotationE{180}%
+ \processallactionsinset
+ [#1]
+ [ \v!mirrored=>\global\mirrorarrangedtrue,
+ \v!doublesided=>\global\doublearrangedtrue,
+ \v!negative=>\global\negatearrangedtrue,
+ \v!rotated=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+ 90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
+ 180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
+ 270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
+ \s!reset=>\global\arrangingpagesfalse,
+ \v!background=>\global\settrue\arrangedbackgroundokay,
+ \s!unknown=>\checkinstalledpagearrangement\commalistelement]%
+ % no \s!default=> we can have aaa,,bbb
+ \ifx\handlearrangedpage\undefined
+ \global\arrangingpagesfalse
+ \fi
+ \doifcommonelse{#1}{90,270,\v!rotated}
+ {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
+ \setuppapersize
+ \fi}
+
+\def\installpagearrangement #1 %
+ {\setgvalue{\??pp\??pp#1}}
+
+\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
+ {\executeifdefined{\??pp\??pp#1}\donothing}
+
+\def\dosetuparrangement#1#2#3#4#5#6#7#8%
+ {\global\chardef\arrangedpageX #1%
+ \global\chardef\arrangedpageY #2%
+ \global\chardef\arrangedpageT #3%
+ \global\chardef\horizontalcutmarks#4%
+ \global\chardef\verticalcutmarks #5%
+ \global\let \pusharrangedpage #6%
+ \global\let \poparrangedpages #7%
+ \global\let \handlearrangedpage#8}
+
+\installpagearrangement {\v!normal}
+ {\global\arrangingpagesfalse}
+
+\installpagearrangement 2*16
+ {\dosetuparrangement{4}{4}{16}{5}{5}%
+ \pusharrangedpageTHIRTYTWO\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*8
+ {\dosetuparrangement{4}{2}{8}{5}{3}%
+ \pusharrangedpageSIXTEEN\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*4
+ {\dosetuparrangement{2}{2}{4}{3}{3}%
+ \pusharrangedpageEIGHT\poparrangedpagesAB\relax}
+
+\installpagearrangement 2*2
+ {\dosetuparrangement{2}{1}{2}{3}{2}%
+ \pusharrangedpageFOURA\poparrangedpagesAB\relax}
+
+\installpagearrangement 2**2
+ {\dosetuparrangement{2}{1}{2}{3}{2}%
+ \pusharrangedpageFOURB\poparrangedpagesAB\relax}
+
+\installpagearrangement 2SIDE
+ {\dosetuparrangement{2}{1}{2}{3}{2}%
+ \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageSIDE}
+
+\installpagearrangement 2TOP
+ {\dosetuparrangement{1}{2}{2}{2}{3}%
+ \pusharrangedpageSIDETOP\poparrangedpagesTWO\handlearrangedpageTOP}
+
+\installpagearrangement 2UP
+ {\dosetuparrangement{2}{1}{4}{3}{2}%
+ \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWOUP}
+
+\installpagearrangement 2DOWN
+ {\dosetuparrangement{1}{2}{4}{2}{3}%
+ \pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
+
+\installpagearrangement 2*4*2 % one defined by Willy Egger:
+ {\dosetuparrangement{2}{2}{4}{3}{2}%
+ \pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
+
+\installpagearrangement 2*2*4 % onother one of Willy Egger
+ {\dosetuparrangement{2}{1}{8}{3}{2}%
+ \pusharrangedpageSIXTEENFOUR\poparrangedpagesAtoH\relax}
+
+\installpagearrangement 2TOPSIDE
+ {\dosetuparrangement{1}{2}{4}{2}{3}%
+ \pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
+
+% \def\filluparrangedpages % beware: \realpageno is 1 ahead
+% {\ifarrangingpages
+% \scratchcounter-\realpageno
+% \divide\scratchcounter \arrangedpageT
+% \multiply\scratchcounter \arrangedpageT
+% \advance\scratchcounter \realpageno
+% \advance\scratchcounter \minusone
+% \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}%
+% \fi}
+
+\def\filluparrangedpages % beware: \realpageno is 1 ahead
+ {\ifarrangingpages
+ \scratchcounter\numexpr\realpageno-\plusone\relax
+ \dosetmodulo\scratchcounter\arrangedpageT\scratchcounter
+ \ifcase\scratchcounter\else
+ \advance\scratchcounter \plusone
+ \dostepwiserecurse\scratchcounter\arrangedpageT\plusone
+ {\noheaderandfooterlines\ejectdummypage}%
+ \fi
+ \fi}
+
+\def\handlearrangedpageXandY#1#2#3#4#5%
+ {\global\setbox#5\hbox to \arrangedpageX\paperwidth
+ {\setbox\scratchbox\vbox to \arrangedpageY\paperheight
+ {%\forgetall
+ \offinterlineskip
+ \dontcomplain
+ \vskip#4\paperheight
+ \hskip#3\paperwidth
+ \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
+ \vfill}%
+ \wd\scratchbox\zeropoint
+ \box\scratchbox\box#5\hss}}
+
+\def\gotonextarrangepage
+ {\global\advance\arrangeno \plusone
+ \def\pagecutmarksymbol{\the\arrangeno}}
+
+\def\outputarrangedbox#1%
+ {\bgroup
+ \forgetall % somehow we're back and need to redo this
+ \gotonextarrangepage
+ \ifnum\arrangedrotationO\arrangedrotationE>\zerocount
+ \setbox#1\vbox
+ {\ifdoublearranged
+ \ifodd\arrangeno
+ \dorotatebox\arrangedrotationO\hbox{\box#1}%
+ \else
+ \dorotatebox\arrangedrotationE\hbox{\box#1}%
+ \fi
+ \else
+ \dorotatebox\arrangedrotationO\hbox{\box#1}%
+ \fi}%
+ \fi
+ \ifmirrorarranged
+ \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
+ \fi
+ \ifnegatearranged
+ \negatecolorbox{#1}%
+ \fi
+ \finishpagebox#1%
+ \ifconditional\arrangedbackgroundokay\addprintbackground#1\fi
+ \actualshipout{\box#1}%
+ \egroup}
+
+%D The format file can be 16K smaller when we postpone the
+%D real arrangments. Some day ...
+
+% TOP
+
+% 32/16/8/4/SIDE
+
+\def\poparrangedpagesAB
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}033\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}003\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}130\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}130\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}033\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}003\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}102\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}132\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}031\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 12
+ \or \handlearrangedpageXandY{#1}031\arrangedpageA % 13
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 14
+ \or \handlearrangedpageXandY{#1}102\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}132\arrangedpageA % 16
+ \or \handlearrangedpageXandY{#1}122\arrangedpageA % 17
+ \or \handlearrangedpageXandY{#1}112\arrangedpageB % 18
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 19
+ \or \handlearrangedpageXandY{#1}021\arrangedpageA % 20
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 21
+ \or \handlearrangedpageXandY{#1}021\arrangedpageB % 22
+ \or \handlearrangedpageXandY{#1}122\arrangedpageB % 23
+ \or \handlearrangedpageXandY{#1}112\arrangedpageA % 24
+ \or \handlearrangedpageXandY{#1}013\arrangedpageA % 25
+ \or \handlearrangedpageXandY{#1}023\arrangedpageB % 26
+ \or \handlearrangedpageXandY{#1}120\arrangedpageB % 27
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 28
+ \or \handlearrangedpageXandY{#1}120\arrangedpageA % 29
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 30
+ \or \handlearrangedpageXandY{#1}013\arrangedpageB % 31
+ \or \handlearrangedpageXandY{#1}023\arrangedpageA % 32
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}031\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}031\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}130\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}130\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}120\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}120\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 12
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 13
+ \or \handlearrangedpageXandY{#1}021\arrangedpageB % 14
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}021\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageFOURA{\pusharrangedpageFOURdo01}
+\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}
+
+\def\pusharrangedpageFOURdo#1#2#3%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#3}010\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#3}0{#1}0\arrangedpageB % 2/3 not {1}
+ \or \handlearrangedpageXandY{#3}0{#2}0\arrangedpageB % 3/2 not {1}
+ \or \handlearrangedpageXandY{#3}000\arrangedpageA % 4
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageSIDETOP#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \poparrangedpages
+ \fi}
+
+\def\handlearrangedpageSIDE
+ {\global\wd\arrangedpageA\paperwidth
+ \global\wd\arrangedpageB\paperwidth
+ \global\setbox\arrangedpageA\hbox
+ {\box\arrangedpageA\box\arrangedpageB}%
+ \global\ht\arrangedpageA\paperheight}
+
+\def\handlearrangedpageTOP
+ {\global\ht\arrangedpageA\paperheight
+ \global\ht\arrangedpageB\paperheight
+ \global\setbox\arrangedpageA\vbox
+ {%\forgetall
+ \offinterlineskip\vskip\paperheight
+ \box\arrangedpageA\box\arrangedpageB}%
+ \global\setbox\arrangedpageB\box\scratchbox} % ?
+
+% 2UP/2DOWN / 1pt prevents overflow
+
+\def\splitoffarrangedpagesTWO
+ {\splittopskip\zeropoint
+ \global\setbox\arrangedpageA\vsplit\arrangedpageB to \onepoint
+ \scratchdimen\dimexpr\ht\arrangedpageB-\onepoint\relax
+ \ifdim\scratchdimen>\onepoint
+ \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
+ \fi}
+
+\def\handlearrangedpageTWOUP
+ {\splitoffarrangedpagesTWO
+ \ifswaparranged
+ \global\setbox\arrangedpageA\hbox
+ {\clippedprintbox0\arrangedpageA
+ \clippedprintbox1\arrangedpageB}%
+ \swaparrangedfalse
+ \else
+ \global\setbox\arrangedpageA\hbox
+ {\clippedprintbox0\arrangedpageB
+ \clippedprintbox1\arrangedpageA}%
+ \swaparrangedtrue
+ \fi
+ \global\ht\arrangedpageA\paperheight
+ \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\handlearrangedpageTWODOWN
+ {\splitoffarrangedpagesTWO
+ \global\ht\arrangedpageA\paperheight
+ \global\ht\arrangedpageB\paperheight
+ \ifswaparranged
+ \global\setbox\arrangedpageA\vbox
+ {%\forgetall
+ \offinterlineskip\vskip\paperheight
+ \box\arrangedpageA\box\arrangedpageB}%
+ \swaparrangedfalse
+ \else
+ \global\setbox\arrangedpageA\vbox
+ {%\forgetall
+ \offinterlineskip\vskip\paperheight
+ \box\arrangedpageB\box\arrangedpageA}%
+ \swaparrangedtrue
+ \fi
+ \global\setbox\arrangedpageB\box\scratchbox}
+
+\def\poparrangedpagesTWO
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \swaparrangedfalse
+ \doloop
+ {\handlearrangedpage
+ \bgroup
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \ht\arrangedpageA\paperheight
+ \wd\arrangedpageA\paperwidth
+ \outputarrangedbox\arrangedpageA
+ \egroup
+ \ifdim\ht\arrangedpageB=\zeropoint
+ \exitloop
+ \fi}%
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+\def\pusharrangedpageTWO#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \global\setbox\arrangedpageB\vbox
+ {%\forgetall
+ \offinterlineskip
+ \unvbox\arrangedpageB
+ \allowbreak
+ \ht#1\onepoint
+ \dp#1\zeropoint
+ \vbox{\box#1}}}
+
+\def\poparrangedpagesTWOTOPSIDE
+ {\ifnum\arrangedpageN>\zerocount
+ \bgroup
+ \gdef\arrangedpageN{2}\poparrangedpagesTWO
+ \let\arrangedpageA\arrangedpageC
+ \let\arrangedpageB\arrangedpageD
+ \gdef\arrangedpageN{2}\poparrangedpagesTWO
+ \doglobal\newcounter\arrangedpageN
+ \egroup
+ \fi}
+
+\def\pusharrangedpageTWOTOPSIDE#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 2
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 2
+ \poparrangedpages
+ \fi}
+
+%D Willy Egger's sheet simulations:
+
+\def\poparrangedpagesAtoH
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \outputarrangedbox\arrangedpageC
+ \outputarrangedbox\arrangedpageD
+ \outputarrangedbox\arrangedpageE
+ \outputarrangedbox\arrangedpageF
+ \outputarrangedbox\arrangedpageG
+ \outputarrangedbox\arrangedpageH
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\poparrangedpagesAtoD
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \outputarrangedbox\arrangedpageC
+ \outputarrangedbox\arrangedpageD
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+% to arrange 16 pages on 4 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENFOUR#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageE % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageF % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageG % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageH % 8
+ \or \handlearrangedpageXandY{#1}010\arrangedpageH % 9
+ \or \handlearrangedpageXandY{#1}000\arrangedpageG % 10
+ \or \handlearrangedpageXandY{#1}010\arrangedpageF % 11
+ \or \handlearrangedpageXandY{#1}000\arrangedpageE % 12
+ \or \handlearrangedpageXandY{#1}010\arrangedpageD % 13
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 14
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+% to arrange 16 pages on 2 sheets to form one booklet
+
+\def\pusharrangedpageSIXTEENTWO#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}011\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}001\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}100\arrangedpageD % 5
+ \or \handlearrangedpageXandY{#1}110\arrangedpageC % 6
+ \or \handlearrangedpageXandY{#1}100\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}100\arrangedpageC % 11
+ \or \handlearrangedpageXandY{#1}110\arrangedpageD % 12
+ \or \handlearrangedpageXandY{#1}011\arrangedpageD % 13
+ \or \handlearrangedpageXandY{#1}001\arrangedpageC % 14
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+% % handy for stickers etc, this way we can treat them as page
+%
+% \setuppapersize [XY][A4]
+% \setuppaper [topspace=5mm,backspace=5mm,dx=1mm,dy=1mm,nx=2,ny=6]
+% \setuplayout [page] [topspace=5mm,backspace=5mm]
+% \setuplayout [page]
+% \setuplayout [location=middle]
+% \setuparranging [XY]
+% \showframe
+%
+% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext
+
+\def\pusharrangedpageXY#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \doglobal\increment\arrangedpageM
+ \global\setbox\arrangedpageB\hbox
+ \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi
+ {\ifvoid\arrangedpageB\else
+ \unhbox\arrangedpageB
+ \ifdim\@@ppdx>\zeropoint \else \hss\fi
+ \hskip\@@ppdx
+ \ifdim\@@ppdx>\zeropoint \else \hss\fi
+ \fi
+ \box#1}%
+ \ifnum\arrangedpageM<\arrangedpageX\else
+ \global\setbox\arrangedpageA\vbox
+ \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi
+ {\offinterlineskip
+ \ifvoid\arrangedpageA\else
+ \unvbox\arrangedpageA
+ \ifdim\@@ppdy>\zeropoint \else \vss\fi
+ \vskip\@@ppdy
+ \ifdim\@@ppdy>\zeropoint \else \vss\fi
+ \fi
+ \box\arrangedpageB}%
+ \doglobal\newcounter\arrangedpageM
+ \fi
+ \ifnum\arrangedpageN<\arrangedpageT\else
+ \poparrangedpages
+ \fi}
+
+\def\poparrangedpagesXY
+ {\ifnum\arrangedpageN>\zerocount
+ \dontcomplain
+ \paperwidth\arrangedpageX\paperwidth
+ \paperheight \arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \doglobal\newcounter\arrangedpageN
+ \doglobal\newcounter\arrangedpageM
+ \fi}
+
+\installpagearrangement XY
+ {\dosetuparrangement\@@ppnx\@@ppny\@@ppxy\!!zerocount\!!zerocount
+ \pusharrangedpageXY\poparrangedpagesXY\relax}
+
+%D A crazy definition, don't guess who pushed me for the landscape option.
+
+\definepapersize
+ [XY]
+ [\c!height=\dimexpr\dimexpr\@@ppheight-\numexpr\@@ppny-1\relax\dimexpr\@@ppdy\relax\relax/\@@ppny\relax,
+ \c!width =\dimexpr\dimexpr\@@ppwidth -\numexpr\@@ppnx-1\relax\dimexpr\@@ppdx\relax\relax/\@@ppnx\relax]
+
+\setuppaper
+ [\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax,
+ \c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax]
+
+% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
+% \definepageshift[test][vertical] [10pt,20pt,30pt,40pt,50pt]
+%
+% \setuppageshift[test]
+% \setuppageshift[test][test]
+% \setuppageshift[test][none]
+% \setuppageshift[none][test]
+% \setuppageshift[paper][test][test] % arrange only
+% \setuppageshift[paper][test] % arrange only
+% \setuppageshift[print][test][test]
+%
+% \showframe \dorecurse{100}{\input tufte \par}
+
+% #1=name #2=horizontal|vertical #3=shiftlist
+
+\unexpanded\def\definepageshift
+ {\dotripleargument\dodefinepageshift}
+
+\def\dodefinepageshift[#1][#2][#3]%
+ {\setvalue{\??pt#2:#1}{#3}}
+
+\letempty \hpageshifts \newcounter\nofhpageshifts
+\letempty \vpageshifts \newcounter\nofvpageshifts
+
+% \let\shiftprintpagebox\gobbleoneargument
+% \let\shiftpaperpagebox\gobbleoneargument
+
+\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
+ {\ifx#2\empty
+ #1\zeropoint
+ \else
+ \doglobal\increment#3%
+ \getfromcommacommand[#2][#3]%
+ \ifx\commalistelement\empty
+ \globallet#3\!!plusone
+ \getfromcommacommand[#2][#3]%
+ \fi
+ \ifx\commalistelement\empty
+ #1\zeropoint
+ \else
+ #1=\commalistelement
+ \donetrue
+ \fi
+ \fi}
+
+\def\shiftpagebox#1%
+ {\donefalse
+ \dogetpageshift{\dimen0}\hpageshifts\nofhpageshifts
+ \dogetpageshift{\dimen2}\vpageshifts\nofvpageshifts
+ \ifdone % see also layout offsets, maybe \movebox
+ \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+ \setbox#1\vbox
+ {\offinterlineskip\vskip\dimen2\hskip\dimen0\box#1}%
+ \next
+ \fi}
+
+\unexpanded\def\setuppageshift
+ {\dotripleempty\dosetuppageshift}
+
+\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical
+ {\ifthirdargument % paper=arrange
+ \let\hpageshifts\empty
+ \let\vpageshifts\empty
+ \let\shiftprintpagebox\gobbleoneargument
+ \let\shiftpaperpagebox\gobbleoneargument
+ \doifdefined{\??pt\v!horizontal:#2}
+ {\edef\hpageshifts{\getvalue{\??pt\v!horizontal:#2}}}%
+ \doifdefined{\??pt\v!vertical :#3}
+ {\edef\vpageshifts{\getvalue{\??pt\v!vertical :#3}}}%
+ \doif{#1}\v!page{\let\shiftprintpagebox\shiftpagebox}%
+ \doif{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}%
+ \else\ifsecondargument
+ \doifinsetelse{#1}{\v!page,\v!paper}
+ {\setuppageshift[#1][#2][#2]}
+ {\setuppageshift[\v!page][#1][#2]}%
+ \else\iffirstargument
+ \setuppageshift[\v!page][#1][#1]%
+ \fi\fi\fi}
+
+%D One can (mis)use this mechanism, in close cooperation
+%D with \PDFTEX\ to arrange pages of already produced files.
+%D
+%D \starttyping
+%D \insertpages[file.pdf][1,3][n=30,width=18cm]
+%D \stoptyping
+%D
+%D The pages are inserted in the text area, and even pages
+%D are repositioned according to the width. In this example
+%D empty pages are added after page 1 and 3.
+%D
+%D Selecting pages can be accomplished by:
+%D
+%D \starttyping
+%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
+%D \stoptyping
+%D
+%D One may pass \type {odd} or \type {even} instead of a
+%D comma separated list. A third alternative is:
+%D
+%D \starttyping
+%D \copypages[file.pdf][n=30,scale=950]
+%D \stoptyping
+%D
+%D This macros inserts the page, according to the settings
+%D provided.
+
+\def\insertpages
+ {\dotripleempty\doinsertpages}
+
+\def\doinsertpages[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\dodoinsertpages[#1][][#2]}
+ {\dodoinsertpages[#1][#2][#3]}}
+
+\def\dodoinsertpages[#1][#2][#3]%
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
+ \doifinset0{#2}{\null\page}%
+ \dorecurse\@@ipn
+ {\dofilterpage{#1}\recurselevel
+ \doifinset\recurselevel{#2}{\null\page}}%
+ \egroup}
+
+\def\filterpages
+ {\dotripleempty\dofilterpages}
+
+\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
+ \doifelse{#2}\v!even
+ {\dorecurse\@@ipn
+ {\ifodd\recurselevel\relax\else\dofilterpage{#1}\recurselevel\fi}}
+ {\doifelse{#2}\v!odd
+ {\dorecurse\@@ipn
+ {\ifodd\recurselevel\relax\dofilterpage{#1}\recurselevel\fi}}
+ {\def\dodocommand##1%
+ {\ifnum##1>\@@ipn\else\dofilterpage{#1}{##1}\fi}%
+ \def\docommand##1%
+ {\dowithrange{##1}\dodocommand}%
+ \processcommalist[#2]\docommand}}%
+ \egroup}
+
+\def\dofilterpage#1#2%
+ {\hbox to \textwidth
+ {\ifdoublesided\ifdim\@@ipwidth>\zeropoint\relax\ifodd\realpageno\else
+ \hfill
+ \def\dowithfigure{\hskip-\@@ipwidth}%
+ \fi\fi\fi
+ \setbox0\hbox
+ {\externalfigure[#1][\c!page=#2,\c!height=\textheight]}%
+ \wd0\zeropoint
+ \box0}
+ \page}
+
+\def\copypages
+ {\dodoubleempty\docopypages}
+
+\def\docopypages[#1][#2]%
+ {\bgroup
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip]
+ [\c!n=\noffigurepages,
+ \c!marking=\v!off,
+ \c!scale=\!!thousand,
+ \c!offset=\!!zeropoint,
+ #2]%
+ \dorecurse\@@ipn
+ {\vbox to \textheight
+ {\hsize\textwidth
+ \scratchdimen\@@ipoffset
+ \centeredbox
+ {\doifelse\@@ipmarking\v!on\cuthbox\hbox
+ {\ifdim\scratchdimen>\zeropoint\relax
+ \advance\vsize -2\scratchdimen
+ \advance\hsize -2\scratchdimen
+ \externalfigure[#1][\c!page=\recurselevel,#2,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]%
+ \else
+ \externalfigure[#1][\c!page=\recurselevel,#2,\c!offset=\v!overlay]%
+ \fi}}}
+ \page}
+ \egroup}
+
+%D \macros
+%D {combinepages}
+%D
+%D Yet another way of postprocessing is handles by \type
+%D {\combinepages}. This macro builds a matrix of pages from a
+%D file, for example:
+%D
+%D \starttyping
+%D \setuppapersize
+%D [A4][A4] % or [A4,landscape][A4,landscape]
+%D
+%D \setuplayout
+%D [header=0pt,footer=1cm,
+%D backspace=1cm,topspace=1cm,
+%D width=middle,height=middle]
+%D
+%D \setupfootertexts
+%D [presentation---\currentdate\space---\space\pagenumber]
+%D
+%D \starttext
+%D \combinepages[slides][nx=2,ny=3,frame=on]
+%D \stoptext
+%D \stoptyping
+%D
+%D One can influence the way the pages are combined. (This
+%D will be explained some time.)
+
+\def\combinepages
+ {\dodoubleempty\docombinepages}
+
+\def\docombinepages[#1][#2]% a=perpag b=free
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters
+ [\??ip]
+ [\c!alternative=\v!a,
+ \c!n=\noffigurepages,\c!nx=2,\c!ny=2,\c!start=1,\c!stop=\!!maxcard,
+ \c!distance=\bodyfontsize,
+ \c!bottom=\vfill,\c!top=\vss,
+ \c!left=\hss,\c!right=\hss,
+ \c!before=\page,\c!after=\page,\c!inbetween=\blank,
+ \c!frame=,\c!background=,\c!backgroundcolor=,
+ #2]%
+ \def\@@ipname{#1}%
+ \@@ipbefore
+ \expandcheckedcsname{\??ip::\c!alternative:}\@@ipalternative\v!b
+ \@@ipafter
+ \egroup}
+
+\setvalue{\??ip::\c!alternative:\v!a}%
+ {\globallet\combinedpagescounter\@@ipstart
+ \doloop
+ {\vbox to \textheight
+ {\hsize\textwidth % ? ?
+ \scratchdimen\@@ipdistance
+ \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
+ \dorecurse\@@ipny
+ {\hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\vbox to \!!heighta
+ {\hsize\!!widtha
+ \vsize\!!heighta
+ \@@iptop
+ \hbox to \hsize
+ {\@@ipleft
+ \ifnum\combinedpagescounter>\@@ipstop\relax
+ \globallet\@@ipn\!!zerocount
+ \else\ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[\@@ipname]
+ [\c!object=\v!no,
+ \c!page=\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]%
+ \fi\fi
+ \@@ipright}
+ \@@ipbottom}%
+ \doglobal\increment\combinedpagescounter
+ \hfil}%
+ \hfilneg}
+ \vfil}%
+ \vfilneg}%
+ \page
+ \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\setvalue{\??ip::\c!alternative:\v!c}%
+ {\globallet\combinedpagescounter\@@ipstart
+ \doloop
+ {\vbox to \textheight
+ {\hsize\textwidth % ? ?
+ \scratchdimen\@@ipdistance
+ \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
+ \hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\@@ipleft
+ \vbox to \textheight
+ {\hsize\!!widtha
+ {\dorecurse\@@ipny
+ {\@@iptop
+ \hbox to \hsize
+ {\vbox to \!!heighta
+ {\hsize\!!widtha
+ \vsize\!!heighta
+ \ifnum\combinedpagescounter>\@@ipstop\relax
+ \globallet\@@ipn\!!zerocount
+ \else\ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[\@@ipname]
+ [\c!object=\v!no,
+ \c!page=\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]%
+ \fi\fi}}
+ \doglobal\increment\combinedpagescounter
+ \@@ipbottom}%
+ \vfil}%
+ \vfilneg}
+ \hfil}%
+ \hfilneg}}
+ \page
+ \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\setvalue{\??ip::\c!alternative:\v!horizontal}{\getvalue{\??ip::\c!alternative:\v!a}}
+\setvalue{\??ip::\c!alternative:\v!vertical }{\getvalue{\??ip::\c!alternative:\v!c}}
+
+\setvalue{\??ip::\c!alternative:\v!b}%
+ {\globallet\combinedpagescounter\@@ipstart
+ \doloop
+ {\startbaselinecorrection
+ \scratchdimen\@@ipdistance
+ \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\doglobal\increment\combinedpagescounter
+ \ifnum\combinedpagescounter>\@@ipn \else
+ \normalexpanded{\noexpand\externalfigure[\@@ipname]
+ [\c!page=\combinedpagescounter,
+ \c!width=\the\!!widtha,% todo \freezedimenmacro
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]}%
+ \hfill
+ \fi}\hfillneg}%
+ \stopbaselinecorrection
+ \ifnum\combinedpagescounter<\@@ipn\relax
+ \@@ipinbetween
+ \else
+ \exitloop
+ \fi}}
+
+%D \macros
+%D {setuppagecomment,startpagecomment}
+%D
+%D This command is not yet documented. Usage:
+%D
+%D \starttyping
+%D \setuppagecomment[state=start,location=right]
+%D
+%D \startpagecomment
+%D \input knuth
+%D \stoppagecomment
+%D \stoptyping
+
+\unexpanded\def\setuppagecomment
+ {\dosingleempty\dosetuppagecomment}
+
+\def\dosetuppagecomment[#1]%
+ {\getparameters[\??pc][#1]%
+ \doifelse\@@pcstate\v!start
+ {\doifinsetelse\@@pclocation{\v!bottom,\v!top}
+ {\setuppapersize[\c!left=\hskip\@@pcoffset]%
+ \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcheight\relax}%
+ \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset\relax}%
+ \defineoverlay[\v!pagecomment][\placepagecommentTB]}
+ {\setuppapersize[\c!top=\vskip\@@pcoffset]%
+ \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}%
+ \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}%
+ \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
+ \processaction
+ [\@@pclocation]
+ [ \v!bottom=>{\setuppapersize[\c!bottom =\vss,\c!top =\vskip\@@pcoffset]},
+ \v!top=>{\setuppapersize[\c!top =\vss,\c!bottom =\vskip\@@pcoffset]},
+ \v!left=>{\setuppapersize[\c!left =\hss,\c!right=\hskip\@@pcoffset]},
+ \v!right=>{\setuppapersize[\c!right=\hss,\c!left =\hskip\@@pcoffset]}]%
+ \definepapersize
+ [\v!pagecomment]
+ [\c!height=\@@pcpaperheight,
+ \c!width=\@@pcpaperwidth]%
+ \let\@@pcprintpapersize\printpapersize
+ \setuppapersize[\papersize][\v!pagecomment]%
+ \setupbackgrounds[\v!paper][\c!background=\v!pagecomment]}
+ {\doif\@@pcstate\v!stop % else initialization invokes backgrounds
+ {% this should be tested first
+ % \normalexpanded{\noexpand\setuppapersize[\papersize][\@@pcprintpapersize]}%
+ \setupbackgrounds[\v!paper][\c!background=]}}}
+
+\def\@@pcprintpapersize{\printpapersize}
+
+\unexpanded\def\placepagecommentTB
+ {\vbox to \printpaperheight
+ {%\forgetall
+ \hsize\printpaperwidth
+ \vskip\@@pcoffset
+ \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
+ \hskip\@@pcoffset
+ \vbox to \@@pcheight
+ {%\forgetall
+ \hsize\paperwidth
+ \ifpagecomment
+ \getbuffer[\v!pagecomment]%
+ \global\pagecommentfalse
+ \fi}%
+ \hfill
+ \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
+ \vskip\@@pcoffset}}
+
+\unexpanded\def\placepagecommentLR
+ {\hbox to \printpaperwidth
+ {\hskip\@@pcoffset
+ \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
+ \vbox to \printpaperheight
+ {%\forgetall
+ \vskip\@@pcoffset
+ \hsize\@@pcwidth
+ \ifpagecomment
+ \getbuffer[\v!pagecomment]%
+ \global\pagecommentfalse
+ \fi
+ \vss}%
+ \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
+ \hskip\@@pcoffset}}
+
+\newif\ifpagecomment
+
+\setvalue{\e!start\v!pagecomment}%
+ {\global\pagecommenttrue
+ \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}
+
+\setuppagecomment
+ [\c!state=, % \v!stop would invoke background calculation
+ \c!location=\v!bottom,
+ \c!offset=.5cm,
+ \c!distance=.5cm,
+ \c!height=5cm,
+ \c!width=10cm]
+
+% This macro cuts a page into n parts that can be pasted
+% together.
+
+\def\slicepages
+ {\dotripleempty\doslicepages}
+
+\def\doslicepages[#1][#2][#3]%
+ {\ifthirdargument
+ \dodoslicepages[#1][#2][#3]%
+ \else
+ \dodoslicepages[#1][#2][#2]%
+ \fi}
+
+\newcounter\slicedpagenumber
+
+\def\dodoslicepages[#1][#2][#3]%
+ {\bgroup
+ \dontcomplain
+ \globallet\slicedpagenumber\!!zerocount
+ \getfiguredimensions[#1]
+ \getparameters
+ [\??ip]
+ [\c!n=1,
+ \c!offset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
+ \c!width=\figurewidth,\c!height=\figureheight,#2]
+ \ifnum\@@ipn>\zerocount
+ \definepapersize
+ [\s!dummy][\c!height=\@@ipheight,\c!width=\@@ipwidth]
+ \setuppapersize
+ [\s!dummy][\s!dummy]
+ \setuplayout
+ [\c!backspace=\!!zeropoint,\c!topspace=\!!zeropoint,
+ \c!height=\v!middle,\c!width=\v!middle,
+ \c!textdistance=\!!zeropoint,
+ \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
+ \fi
+ \dorecurse\noffigurepages
+ {\global\let\slicedpagenumber\recurselevel
+ \ifnum\@@ipn>\plusone
+ \dorecurse\@@ipn
+ {\let\xslice\recurselevel
+ \dorecurse\@@ipn
+ {\let\yslice\recurselevel
+ \clip
+ [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
+ {\scale
+ [\c!scale=\@@ipn000]
+ {\externalfigure[#1][\c!page=\slicedpagenumber]}}
+ \page}}
+ \else
+ \ifodd\slicedpagenumber\relax
+ \getparameters[\??ip][#2]
+ \else
+ \getparameters[\??ip][#3]
+ \fi
+ \hskip\@@ipoffset
+ \clip
+ [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset,
+ \c!height=\@@ipheight,\c!width=\@@ipwidth]
+ {\externalfigure[#1][\c!page=\slicedpagenumber]}
+ \page
+ \fi}
+ \egroup}
+
+% \starttext \slicepages[slice1.pdf][n=3] \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/page-ini.mkii b/tex/context/base/page-ini.mkii
new file mode 100644
index 000000000..816b7d944
--- /dev/null
+++ b/tex/context/base/page-ini.mkii
@@ -0,0 +1,1558 @@
+ %D \module
+%D [ file=page-ini,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Initializations,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Initializations}
+
+% still a dutch/english mess
+
+%D This class of modules implements the output routines and
+%D floating body support. Although the modules are relatively
+%D new, the code herein is rather old. This reordering was
+%D needed when column sets were implemented and sharing code
+%D started to make sense.
+
+%D The history shows from the code, since both column
+%D mechanism use a different way of looping over columns.
+
+\unprotect
+
+\def\m!otr{otr}
+
+\chardef\normalpagebox=255
+
+\newbox\pagebox
+
+\ifx\recalculatelayout\undefined
+
+ \let \recalculatelayout \relax
+
+\fi
+
+\ifx\recalculatelogos\undefined
+
+ \let \recalculatelogos \relax
+ \let \addlogobackground \gobbleoneargument % <box>
+
+\fi
+
+\ifx\recalculatebackgrounds\undefined
+
+ \let \recalculatebackgrounds \relax
+ \let \addmainbackground \gobbleoneargument % <box>
+ \let \addtextbackground \gobbleoneargument % <box>
+ \let \addpagebackground \gobbleoneargument % <box>
+ \let \addprintbackground \gobbleoneargument % <box>
+ \let \addstatusinfo \gobbleoneargument % <box>
+
+\fi
+
+\ifx\realpageno\undefined
+
+ \countdef\realpageno = 0 \realpageno = 1
+ \countdef\userpageno = 1 \userpageno = 1
+ \countdef\subpageno = 2 \subpageno = 0 % !!
+ \countdef\arrangeno = 3 \arrangeno = 0 % !!
+
+ \let\pageno\userpageno
+
+\fi
+
+\ifx\realfolio\undefined
+
+ \def\realfolio{\the\realpageno}
+
+\fi
+
+\newcount\nofshipouts
+
+\appendtoks
+ \global\advance\nofshipouts\plusone
+\to \everyaftershipout
+
+% principle:
+%
+% multiple otr's
+%
+% (1) single column, simple routine (old one)
+% (2) multi column, collect and split routine (old one)
+% (3) multi column, page by page (new one, needed for taco)
+% (4) single column, spread handling (for fun)
+% (5) multi column, page by page, spread handling (as challenge)
+%
+% common components
+%
+% (1) float placement
+% (2) float flushing
+% (3) page body building
+% (4) ...
+%
+% ort
+%
+% + balancing
+% - mixed / one / multi / balancetofit
+% + backgrounds
+% + pre / post
+% + distances / heights
+% + ragged / baseline / normal
+% - pos sync
+% - last page
+%
+% - itemize / subtexts -> old mechanism
+%
+% floats
+%
+% - top / bottom / side / page / column / spead
+% - flush / packed flush / current page / next page / area
+%
+% footnotes
+%
+% + carry over pre column / local to column
+% + last column / pre last column / each column
+% - multiple classes
+% - area / page / end
+%
+% areas
+%
+% - top / bottom / mid in spread
+%
+% IMPORTANT
+%
+% switchtobodyfont in between ivm top
+
+% floats:
+%
+% tricky in balancing mode, a la huidige multi columns
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+\ifx\dosetuplayout\undefined % overloaded in page-lay !
+
+ \def\setuplayout{\dodoubleempty\getparameters[\??ly]}
+
+\fi
+
+\ifx\mkprocesscolumncontents\undefined\let\mkprocesscolumncontents\gobbleoneargument\fi
+\ifx\mkprocesspagecontents \undefined\let\mkprocesspagecontents \gobbleoneargument\fi
+\ifx\mkprocessboxcontents \undefined\let\mkprocessboxcontents \gobbleoneargument\fi
+
+\def\normalejectpenalty{-\plustenthousand } \let\ejectpenalty\normalejectpenalty
+\def\normalsuperpenalty{-\plustwentythousand} \let\superpenalty\normalsuperpenalty
+
+%D In case we're not running \ETEX, we need to bypass a
+%D couple of primitives.
+
+% ONE = single column
+% MUL = multi column
+% SET = columns sets
+
+\def\@@OTR{OTR}
+
+\let\OTRdefault\empty
+
+\def\OTRcommand#1%
+ {\csname\@@OTR
+ \ifcsname\@@OTR\OTRidentifier\strippedcsname#1\endcsname
+ \OTRidentifier
+ \else\ifcsname\@@OTR\OTRdefault\strippedcsname#1\endcsname % fallback
+ \OTRdefault
+ \fi\fi
+ \strippedcsname#1\endcsname}
+
+% obsolete
+
+\def\installotr#1% andere naam, beter \connectotr of zo
+ {\def\OTRidentifier{#1}}
+
+\def\activateotr#1#2%
+ {\def\OTRidentifier{#1}%
+ \def\OTRdefault {#2}}
+
+%D The initialization of the \type {\hsize} and \type {\vsize}
+%D depends on the OTR used.
+
+\def\setvsize {\OTRcommand\setvsize}
+\def\sethsize {\OTRcommand\sethsize}
+\def\finalsidefloatoutput {\OTRcommand\finalsidefloatoutput}
+\def\dopagecontents {\OTRcommand\dopagecontents}
+
+\def\dosettopinserts {\OTRcommand\dosettopinserts}
+\def\dosetbotinserts {\OTRcommand\dosetbotinserts}
+\def\dotopinsertions {\OTRcommand\dotopinsertions}
+\def\dobotinsertions {\OTRcommand\dobotinsertions}
+\def\dosetbothinserts {\OTRcommand\dosetbothinserts}
+
+\def\doflushfloats {\OTRcommand\doflushfloats}
+\def\flushfloatbox {\OTRcommand\flushfloatbox}
+\def\docheckiffloatfits {\OTRcommand\docheckiffloatfits}
+
+\def\someherefloat {\OTRcommand\someherefloat}
+\def\somefixdfloat {\OTRcommand\somefixdfloat}
+\def\somepagefloat {\OTRcommand\somepagefloat}
+\def\sometopsfloat {\OTRcommand\sometopsfloat}
+\def\somebotsfloat {\OTRcommand\somebotsfloat}
+\def\somesidefloat {\OTRcommand\somesidefloat}
+
+\def\flushsavedfloats {\OTRcommand\flushsavedfloats}
+
+\def\synchronizehsize {\OTRcommand\synchronizehsize}
+
+\def\gotonextpage {\OTRcommand\gotonextpage }
+\def\gotonextpageX{\OTRcommand\gotonextpageX} % will become obsolete
+
+% beter een \installotr#1 met #1 = macro en auto test
+
+\newif \iftraceotr
+\newif \ifinotr
+\newtoks \mainoutput
+\newcount\otrlevel
+
+% When issuing two \par\penalty-\plustenthousand's, only the first
+% triggers the otr; obscure feature or optimization?
+
+\def\outputcounter{-100010} % -10010
+
+\def\doinvokeoutput
+ {\iftraceotr
+ \expandafter\dodotracedoutput
+ \else
+ \expandafter\dodoinvokeoutput
+ \fi}
+
+\def\outputmessage#1#2#3%
+ {\iftraceotr\writestatus\m!otr{#1 #2 \number#3}\fi}
+
+\def\dodoinvokeoutput#1%
+ {\outputmessage+{special}{#1}%
+ \bgroup\par\penalty#1\relax\egroup
+ \outputmessage-{special}{#1}}
+
+\def\dodotracedoutput#1%
+ {\outputmessage+{traced}{#1/\the\outputpenalty}%
+ \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}%
+ \dodoinvokeoutput{#1}%
+ \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}%
+ \outputmessage-{traced}{#1/\the\outputpenalty}}
+
+\def\installoutput#1#2% \invoke \action
+ {\decrement\outputcounter
+ \edef#1{\noexpand\doinvokeoutput{\outputcounter}}%
+ \setvalue{\@@OTR\outputcounter}{#2}}
+
+\def\invokeoutputroutine
+ {\outputmessage+{trying}\outputpenalty
+ \executeifdefined{\@@OTR\the\outputpenalty}\dodonormaloutput
+ \outputmessage-{trying}\outputpenalty}
+
+\def\dodonormaloutput
+ {\outputmessage+{normal}\outputpenalty
+ \the\OTRcommand\output
+ \outputmessage-{normal}\outputpenalty}
+
+\mainoutput{\invokeoutputroutine} \output{\inotrtrue\the\mainoutput}
+
+%D Some hooks:
+
+\output{\inotrtrue\the\everybeforeoutput\the\mainoutput\the\everyafteroutput}
+
+\ifx\pagediscards\undefined \let\pagediscards\relax \fi
+
+\installoutput\synchronizeoutput % maybe add pagediscards
+ {\ifvoid\normalpagebox\else
+ \unvbox\normalpagebox
+ \pagediscards % maybe not needed ?
+ \fi}
+
+\installoutput\discardpage
+ {\setbox\scratchbox\box\normalpagebox}
+
+%D In order to force consistent use of variables, we
+%D predefine a lot of them here.
+
+%D The next two registers can be used to store pre column
+%D material as well as footnotes or so.
+
+\newbox\precolumnbox \newdimen\precolumnboxheight
+\newbox\postcolumnbox \newdimen\postcolumnboxheight
+
+%D We reserve a counter for the number of columns as well as
+%D the current column. Both are not to be changed by users!
+
+\newcount\nofcolumns \nofcolumns = 1
+\newcount\mofcolumns \mofcolumns = 1
+
+\chardef\maxnofcolumns = 50
+\chardef\allocatednofcolumns = 0
+
+%D The next dimensions reports the final column height
+
+\newdimen\finalcolumnheights
+\newcount\finalcolumnlines
+
+%D During initialization the temporary boxes are allocated.
+%D This enables us to use as much columns as we want, without
+%D exhausting the pool of boxes too fast. We could have packed
+%D them in one box, but we've got enough boxes.
+%D
+%D Two sets of boxes are declared, the txtboxes are used for
+%D the text, the topboxes are for moved column floats.
+
+\def\@col@{@col@}
+
+\def\initializecolumns#1%
+ {\ifnum#1>\maxnofcolumns
+ \showmessage\m!columns1\maxnofcolumns
+ \nofcolumns\maxnofcolumns
+ \else
+ \nofcolumns#1\relax
+ \fi
+ \ifnum\nofcolumns>\allocatednofcolumns
+ \dorecurse\nofcolumns
+ {\ifnum\recurselevel>\allocatednofcolumns\relax
+ % \newbox\next \letgvalue{\@col@-\recurselevel-t}=\next
+ \@EA\newbox\csname\@col@-\recurselevel-t\endcsname % text
+ \@EA\newbox\csname\@col@-\recurselevel-f\endcsname % foot
+ \@EA\newbox\csname\@col@-\recurselevel-h\endcsname % top insert
+ \@EA\newbox\csname\@col@-\recurselevel-l\endcsname % top insert
+ \fi}%
+ \global\chardef\allocatednofcolumns=\nofcolumns
+ \fi}
+
+\def\firstcolumnbox {\columntextbox\plusone}
+\def\currentcolumnbox {\columntextbox\mofcolumns}
+\def\lastcolumnbox {\columntextbox\nofcolumns}
+
+\def\firsttopcolumnbox {\columntopbox \plusone}
+\def\currenttopcolumnbox{\columntopbox \mofcolumns}
+\def\lasttopcolumnbox {\columntopbox \nofcolumns}
+
+\def\columntextbox#1{\csname\@col@-\number#1-t\endcsname}
+\def\columnfootbox#1{\csname\@col@-\number#1-f\endcsname}
+\def\columntopbox #1{\csname\@col@-\number#1-h\endcsname}
+\def\columnbotbox #1{\csname\@col@-\number#1-l\endcsname}
+
+\def\columnsettextbox{\global\setbox\columntextbox}
+\def\columnsetfootbox{\global\setbox\columnfootbox}
+\def\columnsettopbox {\global\setbox\columntopbox}
+\def\columnsetbotbox {\global\setbox\columnbotbox}
+
+\def\columngettextbox{\copy\columntextbox}
+\def\columngetfootbox{\copy\columnfootbox}
+\def\columngettopbox {\copy\columntopbox}
+\def\columngetbotbox {\copy\columnbotbox}
+
+\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}}
+\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}}
+\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}}
+\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}}
+
+%D Without going in details we present two macro's which handle
+%D the columns. The action which is transfered by the the first
+%D and only parameter can do something with \type
+%D {\currentcolumnbox}. In case of the mid columns, \type
+%D {\firstcolumnbox} and \type {\lastcolumnbox} are handled
+%D outside these macro's.
+
+\def\dohandlecolumn#1%
+ {\mofcolumns\recurselevel
+ \let\currentcolumn\recurselevel
+ #1\relax}
+
+\def\dohandleallcolumns#1%
+ {\dorecurse\nofcolumns{\dohandlecolumn{#1}}}
+
+\def\dohandlerevcolumns#1%
+ {\dostepwiserecurse\nofcolumns\plusone\minusone{\dohandlecolumn{#1}}}
+
+\def\dohandlemidcolumns#1%
+ {\dohandleallcolumns
+ {\ifnum\recurselevel>\plusone
+ \ifnum\recurselevel<\nofcolumns
+ \dohandlecolumn{#1}%
+ \fi
+ \fi}}
+
+%D This register can be used as a temporary storage for page
+%D content.
+
+\newbox\restofpage
+
+%D Features.
+
+\newif\ifintermediatefootnotes
+\newif\ifcarryoverfootnotes %\carryoverfootnotestrue
+\newif\iflastcolumnfootnotes %\lastcolumnfootnotestrue
+\newif\ifbalancecolumns %\balancecolumnstrue
+\newif\ifbalancetoheight %\balancetoheighttrue
+\newif\ifforcecolumngrid \forcecolumngridtrue
+\newif\ifstretchcolumns \stretchcolumnsfalse
+\newif\ifinheritcolumns \inheritcolumnsfalse
+\newif\ifheightencolumns \heightencolumnsfalse
+
+\newif\ifbalancingcolumns
+\newif\ifcollectingcontent
+\newif\ifcolumnoverflow
+\newif\iffinalflushingfloats
+\newif\ifpackflushedfloats \packflushedfloatstrue % for the moment
+
+\newdimen\intercolumnwidth
+\newdimen\localcolumnwidth
+\newdimen\savedpagetotal
+
+\chardef\columndirection=0 % 0:lr 1:rl
+
+\def\minbalancetoplines {1}
+\def\minfreecolumnlines {2}
+
+\newif\ifrecentercolumnbox \recentercolumnboxtrue
+\newif\ifrerecentercolumnbox \rerecentercolumnboxtrue
+\newif\ifpackcolumnfloats \packcolumnfloatstrue
+
+\newbox\collectedpagefloats
+\newbox\collectedleftpagefloats
+\newbox\collectedrightpagefloats
+
+%D The \type {\ifdim} test is needed, because otherwise the
+%D last line of a text end up on top of the baseline instead of
+%D on the baseline, as is the case with preceding pages.
+%D Also, a \type {\vfil} better than a \type {\vfill}.
+
+% to be replaced by \page[now] \page[final] / merged
+
+% \def\eject {\par\penalty-\plustenthousand } % == {\par\break} % plain
+% \def\supereject {\par\penalty-\plustwentythousand} % also plain
+
+\def\eject {\par\ifvmode\penalty\ejectpenalty\fi\resetpagebreak} % == {\par\break} % plain
+\def\supereject {\par\ifvmode\penalty\superpenalty\fi\resetpagebreak} % also plain
+
+\def\doejectpage {\par\ifvmode\ifdim\pagetotal>\pagegoal\else\normalvfil\fi\fi} % pg set to \textheight
+\def\ejectpage {\doejectpage\eject}
+\def\superejectpage{\doejectpage\supereject}
+
+\ifx\bye\undefined \def\bye{\par\vfill\supereject\end} \fi % plain tex command
+
+% floats
+%
+% \def\ejectinsert
+% {\flushnotes
+% \bgroup
+% \noftopfloats\plusthousand
+% \nofbotfloats\zerocount
+% \doflushfloats
+% \egroup}
+
+\def\ejectinsert
+ {\flushnotes
+ \bgroup
+ \noftopfloats\plusthousand
+ \nofbotfloats\zerocount
+ % this is needed in case a float that has been stored
+ % ends up at the current page; this border case occurs when
+ % the calculated room is 'eps' smaller that the room available
+ % when just flushing; so now we have (maybe optional):
+ \pagebaselinecorrection
+ % alas, this is tricky but needed (first surfaced in prikkels)
+ \doflushfloats
+ \egroup}
+
+\def\ejectdummypage
+ {\endgraf \ifvmode
+ \ejectinsert
+ \hardespatie % will be different
+ \vfill
+ \gotonextpage
+ \fi}
+
+\def\beforefinaloutput
+ {}
+
+\def\afterfinaloutput
+ {\forgetall
+ \vskip\zeropoint\relax
+ \ifvoid\normalpagebox \else
+ \unvbox\normalpagebox
+ \penalty\outputpenalty
+ \fi
+ % not really needed, replaced by \flushsavedfloats
+ \ifnum\outputpenalty>\superpenalty \else % better use a proper otr signal
+ \dosupereject
+ \fi
+ % but does not hurt either (we're still in the otr!)
+ \inpagebodytrue % needed for enabling \blank !
+ \flushsavedfloats % was \dosetbothinserts; only otr one !
+ \setvsize % this is needed for interacting components, like floats and multicolumns
+ \adaptfuzzypagegoal} % watch this hack!
+
+\def\dofinaloutput#1#2% \vbox: prevents spurious spaces in every..pagebody
+ {\beforefinaloutput
+ \the\everybeforeshipout % brrr not in shipout
+ \ifspecialbasedsettings
+ \myshipout{\hbox{\hbox to \zeropoint{\the\pageboundsettings}%
+ \hbox{\vbox{\dopagebody#1#2\setpagecounters}}}}%
+ \else
+ \the\pageboundsettings
+ \myshipout{\hbox{\vbox{\dopagebody#1#2\setpagecounters}}}%
+ \fi
+ \the\everyaftershipout
+ \afterfinaloutput
+ \popproperties} % ... and here ...
+
+\def\donofinaloutput#1#2%
+ {\beforefinaloutput
+ \the\everybeforeshipout
+ \setpagecounters
+ \message{[-\the\realpageno]}%
+ \setbox\scratchbox\hbox
+ {%\the\everyshipout % still needed here ?
+ \dopagebody#1#2}%
+ \deadcycles\zerocount
+ \gotonextrealpage
+ \the\everyaftershipout
+ \afterfinaloutput
+ \popproperties} % ... and here
+
+% beware: \ifprocessingpages is in use
+
+\ifx\checkpageversion\undefined \let\checkpageversion\relax \fi % todo: hook into \everybeforeshipout
+\ifx\doflushspread \undefined \let\doflushspread \relax \fi % todo
+
+\def\finaloutput#1#2%
+ {\checkpageversion
+ \ifprocessingpages
+ \ifpageselected
+ \@EAEAEA\dofinaloutput
+ \else
+ \@EAEAEA\donofinaloutput
+ \fi
+ \else
+ \ifpageselected
+ \@EAEAEA\donofinaloutput
+ \else
+ \@EAEAEA\dofinaloutput
+ \fi
+ \fi#1#2%
+ \resetselectiepagina
+ \incrementpagenumber
+ \checkpagedimensions
+ \ifnum\outputpenalty>\superpenalty \else
+ \dosupereject
+ \fi
+ \doflushspread
+ \dopostponeblock}
+
+\def\dooutput
+ {\finaloutput\unvbox\normalpagebox}
+
+\maxdeadcycles=1000
+
+% will be installable tracer; better use chardef
+
+% this needs a real cleanup
+
+\def\doplaceversiontext#1#2%
+ {\doifsomething{#2}
+ {\defconvertedcommand\ascii{#2}%
+ \space#1:\space\ascii\space
+ \!!doneatrue}}
+
+\def\placeversioninfo % nog engels maken
+ {\ifcase\conceptmode
+ % 0 : nothing
+ \or
+ % 1 : simple
+ \vskip\!!sixpoint
+ \hbox to \makeupwidth
+ {\infofont
+ \v!concept:\space\currentdate
+ \hss\reportpagedimensions}%
+ \else
+ % 2/3 : extensive
+ \vskip\!!sixpoint
+ \hbox to \makeupwidth
+ {\infofont
+ \getmessage\m!systems{27}:\space\currentdate\space
+ \doplaceversiontext\v!project \currentproject
+ \doplaceversiontext\v!product \currentproduct
+ \doplaceversiontext\v!component\currentcomponent
+ \if!!donea\else\space\v!file:\space\jobname\fi
+ \hss\reportpagedimensions}%
+ \fi}
+
+% tot hier
+
+\def\doversion[#1]%
+ {\chardef\conceptmode\zerocount
+ \overfullrule\zeropoint
+ \processaction % \v!final=>
+ [#1]
+ [ \v!concept=>\chardef\conceptmode\plusone, % simple banner
+ \v!file=>\chardef\conceptmode\plustwo, % full banner
+ \v!temporary=>\chardef\conceptmode\plusthree % full banner plus
+ \overfullrule5\points]} % info in the margin
+
+\def\version
+ {\dosingleargument\doversion}
+
+\def\addstatusinfo
+ {\ifcase\conceptmode
+ \@EA\gobbleoneargument
+ \else
+ \@EA\doaddstatusinfo
+ \fi}
+
+\def\doaddstatusinfo#1%
+ {\setbox#1\vbox to \paperheight
+ {\vsmashbox#1\box#1%
+ \offinterlineskip
+ \vskip\topspace
+ \hsize\paperwidth
+ \hfill\hbox{\placetestinfo\hskip.5cm}\vss
+ \settexthoffset\hskip\texthoffset % brrrr
+ %\tlap{\placeversioninfo}\vskip.5cm
+ \vbox to 1cm{\vss\placeversioninfo\vss}}}
+
+\def\dotestinfo#1#2#3%
+ {\ifinpagebody\else\ifnum\conceptmode=\plusthree
+ \begingroup
+ \defconvertedcommand\ascii{#3}%
+ \xdef\extratestinfo
+ {#2\space\ascii}%
+ \gdef\totaltestinfo
+ {\global\setbox#1\vbox
+ {\unvbox#1\relax
+ \infofont \setupinterlinespace
+ \hbox
+ {\strut
+ \expanded{\doboundtext{\extratestinfo}{12em}{..}}%
+ \quad}}}%
+ \endgroup
+ \ifinner
+ \aftergroup\totaltestinfo
+ \else
+ \totaltestinfo
+ \fi
+ \fi\fi}
+
+% this will be inserts some day
+
+% \installinsertion\referenceinfobox
+% \installinsertion\registerinfobox
+% \installinsertion\floatinfobox
+
+\newbox\referenceinfobox
+\newbox\registerinfobox
+\newbox\floatinfobox
+
+\def\referenceinfo{\dotestinfo\referenceinfobox}
+\def\registerinfo {\dotestinfo\registerinfobox}
+\def\floatinfo {\dotestinfo\floatinfobox}
+
+\def\placetestinfo
+ {\vbox to \makeupheight
+ {\forgetall
+ \infofont
+ \hsize10em
+ \ifvoid\floatinfobox\else
+ \strut \getmessage\m!systems{24}%
+ \vskip\!!sixpoint
+ \unvbox\floatinfobox
+ \vskip\!!twelvepoint
+ \fi
+ \ifvoid\referenceinfobox\else
+ \strut \getmessage\m!systems{25}%
+ \vskip\!!sixpoint
+ \unvbox\referenceinfobox
+ \vskip\!!twelvepoint
+ \fi
+ \ifvoid\registerinfobox\else
+ \strut \getmessage\m!systems{26}%
+ \vskip\!!sixpoint
+ \unvbox\registerinfobox
+ \fi
+ \vss}}
+
+\version[\v!final]
+
+% bewaren tvb documentatie
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.2\hsize
+% \vsize=2\hsize
+% \ruledvbox to \vsize{\input tufte \par}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss
+% \ruledvbox to \vsize{\input tufte \par\vfill}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}}
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.18\hsize
+% \vsize=2.5\hsize
+% \setbox0=\vbox{\input tufte\relax}%
+% \ruledvbox to \vsize{\unvcopy0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss
+% \ruledvbox to \vsize{\unvcopy0\vfill}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}}
+
+\newtoks\afterpage \newtoks\aftereverypage
+\newtoks\beforepage \newtoks\beforeeverypage
+
+\chardef\showgridstate=0
+
+\def\showgrid
+ {\dosingleempty\doshowgrid}
+
+\def\doshowgrid[#1]%
+ {\chardef\showgridstate \plusone % downward compatible default
+ \chardef\gridboxlinemode \plusone
+ \chardef\gridboxlinenomode\plusone
+ \processallactionsinset
+ [#1]%
+ [ \v!reset=>\chardef\showgridstate \zerocount,
+ \v!bottom=>\chardef\showgridstate \plusone,
+ \v!top=>\chardef\showgridstate \plustwo,
+ \v!none=>\chardef\gridboxlinemode \zerocount,
+ \v!all=>\chardef\gridboxlinemode \plusone,
+ \v!lines=>\chardef\gridboxlinemode \plustwo,
+ \v!frame=>\chardef\gridboxlinemode \plusthree,
+ \v!nonumber=>\chardef\gridboxlinenomode\zerocount,
+ \v!right=>\chardef\gridboxlinenomode\plusone,
+ \v!left=>\chardef\gridboxlinenomode\plustwo]}
+
+\def\buildpagebox#1%
+ {\setbox#1\vbox to \paperheight
+ {\hsize\paperwidth
+ \vskip\topspace
+ \doifbothsides
+ {\hskip\backspace}
+ {\hskip\backspace}
+ {\hskip\paperwidth \hskip-\backspace \hskip-\makeupwidth}%
+ \box#1}%
+ \dp#1\zeropoint}
+
+% \newif\ifpagebodyornaments \pagebodyornamentstrue
+%
+% \appendtoks
+% \global\pagebodyornamentstrue
+% \to \everyaftershipout
+
+\newif\ifarrangingpages \arrangingpagesfalse
+
+\chardef\pageornamentstate\zerocount % 0=on 1=one-off 2=always-off
+
+\def\pagebodyornamentstrue {\chardef\pageornamentstate\zerocount} % for a while
+\def\pagebodyornamentsfalse{\chardef\pageornamentstate\plusone} % for a while
+
+\appendtoks
+ \ifcase\pageornamentstate\or
+ \chardef\pageornamentstate\zerocount
+ \fi
+\to \everyaftershipout
+
+\let\poparrangedpages\relax
+\let\pusharrangedpage\relax
+
+\ifx\shiftprintpagebox\undefined
+ \let\shiftprintpagebox\gobbleoneargument
+ \let\shiftpaperpagebox\gobbleoneargument
+\fi
+
+\ifx\registerpageposition\undefined
+ \let\registerpageposition\gobbleoneargument
+\fi
+
+\def\reportarrangedpage#1%
+ {\showmessage\m!systems
+ {23}{\the\realpageno.\the\pageno\ifnum\subpageno>0 .\the\subpageno\fi,#1}}
+
+\newif\ifsavepagebody \newbox\savedpagebody
+
+% beware, \??ly is used before defined, i.e. bad module design
+
+\setuplayout[\c!method=\v!normal]
+
+\def\buildpagebody#1#2%
+ {\ifsavepagebody\global\setbox\savedpagebody\fi
+ \vbox
+ {\beginrestorecatcodes
+ \forgetall % igv problemen, check: \boxmaxdepth\maxdimen
+ \boxmaxdepth\maxdimen % new
+ \dontcomplain
+ % the following plugin uses and sets pagebox; beware: this
+ % will change and is for my (hh) personal experiments
+ \executeifdefined{\??ly\c!method\@@lymethod}%
+ {\getvalue{\??ly\c!method\v!normal}}#1#2%
+ % the finishing touch
+ \ifcase\pageornamentstate
+ \addpagebackground \pagebox
+ \fi
+ \registerpageposition\pagebox
+ \ifarrangingpages
+ \shiftpaperpagebox \pagebox % \v!paper
+ \else
+ \clippagebox \pagebox
+ \doifelse\@@lymarking\v!page
+ {\replicatepagebox \pagebox
+ \addpagecutmarks \pagebox}
+ {\addpagecutmarks \pagebox
+ \replicatepagebox \pagebox}%
+ \scalepagebox \pagebox
+ \mirrorpaperbox \pagebox
+ \orientpaperbox \pagebox
+ \addpagecolormarks \pagebox
+ \centerpagebox \pagebox
+ \addprintbackground\pagebox
+ \mirrorprintbox \pagebox
+ \orientprintbox \pagebox
+ \shiftprintpagebox \pagebox % \v!page
+ \offsetprintbox \pagebox
+ \negateprintbox \pagebox
+ \fi
+ \box\pagebox
+ \endrestorecatcodes}%
+ \ifsavepagebody\copy\savedpagebody\fi}
+
+\setvalue{\??ly\c!method\v!normal}#1#2%
+ {\setbox\pagebox\vbox
+ {\offinterlineskip
+ \ifcase\pageornamentstate
+ \bgroup % else footnotes get inconsistent font/baseline
+ \dostartattributes\??ly\c!style\c!color\empty
+ \offinterlineskip
+ \gettextboxes
+ \dostopattributes
+ \egroup
+ \fi
+ \getmainbox#1#2}% including footnotes
+ \ifcase\pageornamentstate
+ \addmainbackground \pagebox
+ \addlogobackground \pagebox
+ \fi
+ \buildpagebox \pagebox
+ \addstatusinfo \pagebox}
+
+\def\finishpagebox#1%
+ {\ifarrangingpages
+ \addpagecutmarks #1%
+ \addpagecolormarks#1%
+ \centerpagebox #1%
+ \mirrorprintbox #1%
+ \orientprintbox #1%
+ \offsetprintbox #1%
+ \negateprintbox #1%
+ \fi}
+
+\appendtoks \restoreglobalbodyfont \to \everybeforepagebody
+\appendtoks \restorecolumnsettings \to \everybeforepagebody
+
+\ifx\nestednewbox\undefined \newbox\nestednextbox \fi
+
+\prependtoks \let\nextbox\nestednextbox \to \everybeforepagebody
+
+\def\dopagebody#1#2%
+ {%\getallmarks % now in following token register
+ \the\everybeforepagebody
+ \starttextproperties
+ \gotonextsubpage % nog eens: als in pagina (tbv standaard opmaak)
+ \dontshowboxes % dan hier blokkeren en verderop resetten
+% \shipoutfacingpage
+ \checkreferences
+ \checkmargeblokken
+ \the\beforeeverypage
+ \flushtoks\beforepage
+ \inpagebodytrue\buildpagebody#1#2%
+ \flushtoks\afterpage
+ \the\aftereverypage
+ \resetpagebreak
+ %updatelistreferences % now in aftereverypage
+ \resetlayouttextlines % will go to \aftereverypage
+ \stoptextproperties
+ \the\everyafterpagebody}
+
+\newtoks\pageboundsettings
+
+\prependtoks \initializepaper \to \pageboundsettings
+
+% not here
+
+\newif\ifpagebreakdisabled \pagebreakdisabledfalse
+
+% \chardef\testpagemethod=0 % todo: \testnewpage[method=,lines=,voffset=]
+%
+% \def\testpage {\dotripleempty\dotestpage[\plusone]}
+% \def\testpageonly{\dotripleempty\dotestpage[\plustwo]}
+%
+% \def\dotestpage[#1][#2][#3]%
+% {%\relax % needed before \if
+% \endgraf
+% \ifpagebreakdisabled
+% % do nothing
+% \else
+% %ifnum#1=\plusone\synchronizeoutput\fi
+% \ifdim\pagegoal<\maxdimen \relax
+% \ifdim\pagetotal<\pagegoal \relax
+% \scratchdimen\lineheight
+% \multiply\scratchdimen#2\relax
+% \advance\scratchdimen \pagetotal
+% \ifdim\lastskip<\parskip
+% \advance\scratchdimen \parskip
+% \fi
+% \ifthirdargument
+% \advance\scratchdimen#3\relax
+% \fi
+% \ifcase\testpagemethod
+% \ifdim\scratchdimen>.99\pagegoal
+% \vfill\eject % \penalty-\!!tenthousand\relax
+% \fi
+% \or
+% \advance\scratchdimen-\pagegoal
+% \ifdim\scratchdimen>-\lineheight
+% \vfill\eject % \penalty-\!!tenthousand\relax
+% \fi
+% \or
+% \getnoflines\pagegoal
+% \advance\scratchdimen-\noflines\lineheight \relax
+% \ifdim\scratchdimen>-\lineheight
+% \vfill\eject % \penalty-\!!tenthousand\relax
+% \fi
+% \or % same as 0 but more accurate
+% \advance\scratchdimen-10\s!sp\relax
+% \ifdim\scratchdimen>\pagegoal
+% \vfill\eject % \penalty-\!!tenthousand\relax
+% \fi
+% \fi
+% \else
+% % force page break / new
+% % \vfill\eject % \penalty-\!!tenthousand\relax
+% \fi
+% \else
+% \ifnum#1=\plusone\goodbreak\fi
+% \fi
+% \fi}
+
+\chardef\testpagemethod \zerocount % todo: \testnewpage[method=,lines=,voffset=]
+\chardef\testpagetrigger\zerocount
+
+\def\testpage {\dotripleempty\dotestpage[\plusone ]} %
+\def\testpageonly{\dotripleempty\dotestpage[\plustwo ]} % no penalties added to the mvl
+\def\testpagesync{\dotripleempty\dotestpage[\plusthree]} % force sync
+
+\def\dotestpage[#1][#2][#3]% don't change, only add more methods
+ {\relax % needed before \if
+ \ifpagebreakdisabled
+ \endgraf
+ \else
+ % new from here
+ \ifcase\testpagetrigger
+ \endgraf
+ \or
+ \ifvmode
+ \dosomebreak\allowbreak
+ \else % indeed?
+ \vadjust{\allowbreak}%
+ \endgraf
+ \fi
+ \fi
+ % till here
+ \ifdim\pagegoal<\maxdimen \relax
+ \ifdim\pagetotal<\pagegoal \relax
+ \scratchdimen\lineheight
+ \multiply\scratchdimen#2\relax
+ \advance\scratchdimen \pagetotal
+ \ifdim\lastskip<\parskip
+ \advance\scratchdimen \parskip
+ \fi
+ \ifthirdargument
+ \advance\scratchdimen#3\relax
+ \fi
+ \ifcase\testpagemethod
+ \ifdim\scratchdimen>.99\pagegoal
+ \penalty-\!!tenthousand\relax
+ \fi
+ \or
+ \advance\scratchdimen-\pagegoal
+ \ifdim\scratchdimen>-\lineheight
+ \penalty-\!!tenthousand\relax
+ \fi
+ \or
+ \getnoflines\pagegoal
+ \advance\scratchdimen-\noflines\lineheight \relax
+ \ifdim\scratchdimen>-\lineheight
+ \penalty-\!!tenthousand\relax
+ \fi
+ \or % same as 0 but more accurate
+ \advance\scratchdimen-10\s!sp\relax
+ \ifdim\scratchdimen>\pagegoal
+ \penalty-\!!tenthousand\relax
+ \fi
+ \fi
+ \else
+ \ifnum#1=\plusthree
+ \flushpagesofar
+ \fi
+ \fi
+ \else
+ \ifnum#1=\plusone\goodbreak\fi
+ \fi
+ \fi}
+
+\def\flushpagesofar
+ {\endgraf
+ \ifdim\pagetotal>\pagegoal
+ \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal
+ \goodbreak % \penalty0
+ \else
+ \page
+ \fi
+ \else
+ \fi}
+
+\def\testcolumn
+ {\dodoubleempty\dotestcolumn}
+
+\def\dotestcolumn[#1][#2]%
+ {%\relax % needed before \if !
+ \endgraf
+ \ifdim\pagegoal<\maxdimen \ifdim\pagetotal<\pagegoal % \relax
+ \scratchdimen\pagegoal
+ \advance\scratchdimen-\pagetotal
+ \ifdim\lastskip<\parskip
+ \advance\scratchdimen \parskip
+ \fi
+ \ifsecondargument
+ \advance\scratchdimen#2%
+ \fi
+ \getrawnoflines\scratchdimen % raw !
+ % \message{[\number#1>\number\noflines ?}\wait
+ \ifnum#1>\noflines
+ \column
+ \fi
+ \else
+ \penalty-\!!tenthousand % untested ! ! \column
+ \fi \fi}
+
+\let\resetcurrentsectionmarks\relax
+
+% was: \resetsectionmarks\firstsection, zie \handlepagebreak
+
+\def\page{\pagebreak} % the short form of \pagebreak (mult-com one)
+
+\def\resetpagebreak
+ {\global\pagebreakdisabledfalse}
+
+\def\simplifypagebreak
+ {\def\dopagebreak[##1]{\goodbreak}}
+
+\def\disablepagebreaks
+ {\def\dopagebreak[##1]{}}
+
+\def\executepagebreakhandler#1%
+ {\edef\@@pagespecification{#1}%
+ \doifdefinedelse{\??pe:\@@pagespecification}
+ {\getvalue{\??pe:\@@pagespecification}}
+ {\doifdefinedelse{\??pe::\@@pagespecification}
+ {\executepagebreakhandlers{\getvalue{\??pe::\@@pagespecification}}}
+ {\getvalue{\??pe:\s!unknown}}}}
+
+\long\def\installpagebreakhandler#1#2%
+ {\long\setvalue{\??pe:#1}{#2}}
+
+% \definecomplexorsimple\pagebreak
+
+% \def\simplepagebreak
+% {\executepagebreakhandler\v!ja}
+
+% \def\complexpagebreak[#1]% if empty, do nothing and avoid processing,
+% {\flushnotes % see head's; watch how we group
+% \doifsomething{#1}{\bgroup\executepagebreakhandlers{#1}\egroup}}
+
+\unexpanded\def\pagebreak
+ {\dosingleempty\dopagebreak}
+
+\def\dopagebreak[#1]% so, page ornaments are reset after a pagebreak command, unless set
+ {\bgroup
+ \edef\prevrealpageno{\the\realpageno}%
+ \ifcase\pageornamentstate \or
+ % disable reset after shipout
+ \global\chardef\pageornamentstate\plustwo
+ \fi
+ \iffirstargument % or if empty i.e. []
+ \flushnotes\executepagebreakhandlers{#1}%
+ \else % so, no pagebreak when \pagebreak[] ! ! !
+ \flushnotes\executepagebreakhandler\v!yes
+ \fi
+ \ifnum\prevrealpageno<\realpageno
+ \global\chardef\pageornamentstate\zerocount
+ \fi
+ \egroup}
+
+\def\executepagebreakhandlers#1%
+ {\processcommacommand[#1]\executepagebreakhandler}
+
+\installpagebreakhandler \s!dummy
+ {\ejectinsert
+ \gotonextpage
+ \ejectdummypage}
+
+\installpagebreakhandler \v!frame
+ {\page\bgroup\showframe\page[\v!empty]\egroup}
+
+\installpagebreakhandler \s!unknown
+ {\doifinstringelse{+}\@@pagespecification
+ {\ejectinsert
+ \gotonextpage
+ \dorecurse\@@pagespecification\ejectdummypage}
+ {\doifnumberelse\@@pagespecification
+ {\ejectinsert
+ \gotonextpage
+ \doloop
+ {\ifnum\userpageno<\@@pagespecification\relax
+ \ejectdummypage
+ \else
+ \exitloop
+ \fi}}
+ {}}}
+
+\installpagebreakhandler \s!default
+ {} % do nothing if empty
+
+\installpagebreakhandler \v!reset
+ {% better not: \global\chardef\pageornamentstate\zerocount
+ \resetpagebreak}
+
+\installpagebreakhandler \v!disable
+ {\global\pagebreakdisabledtrue}
+
+\installpagebreakhandler \v!yes
+ {\ifpagebreakdisabled\else
+ \ejectinsert
+ \gotonextpage
+ \ifinsidecolumns % this will move to MUL
+ \ejectpage % anders soms geen overgang
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!makeup % ??
+ {\ifpagebreakdisabled\else
+ \eject
+ \fi}
+
+\installpagebreakhandler \v!blank
+ {\ifcase\pageornamentstate
+ \global\chardef\pageornamentstate\plusone
+ \fi}
+
+\installpagebreakhandler \v!no
+ {\ifpagebreakdisabled\else
+ \dosomebreak\nobreak
+ \fi}
+
+\installpagebreakhandler \v!preference
+ {\ifpagebreakdisabled\else
+ \ifinsidecolumns % this will move to MUL
+ \dosomebreak\goodbreak
+ \else
+ \testpage[3][\zeropoint]%
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!bigpreference
+ {\ifpagebreakdisabled\else
+ \ifinsidecolumns % this will move to MUL
+ \dosomebreak\goodbreak
+ \else
+ \testpage[5][\zeropoint]%
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!empty
+ {\ejectinsert
+ \gotonextpage
+ \doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}%
+ \doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}%
+ \ejectdummypage}
+
+\installpagebreakhandler \v!left
+ {\ejectinsert
+ \gotonextpageX % will become \gotonextpage
+ \doifbothsidesoverruled{}{\resetcurrentsectionmarks\ejectdummypage}{}}
+
+\installpagebreakhandler \v!right
+ {\ejectinsert
+ \gotonextpageX % will become \gotonextpage
+ \doifbothsidesoverruled{}{}{\resetcurrentsectionmarks\ejectdummypage}}
+
+\installpagebreakhandler \v!even
+ {\page
+ \doifoddpageelse{\resetcurrentsectionmarks\ejectdummypage}\donothing}
+
+\installpagebreakhandler \v!odd
+ {\page
+ \doifoddpageelse\donothing{\resetcurrentsectionmarks\ejectdummypage}}
+
+\installpagebreakhandler \v!quadruple % not yet ok inside columnsets
+ {\ifdoublesided
+ \!!counta\realpageno
+ \!!countb\realpageno
+ \divide\!!counta 4
+ \divide\!!countb 2
+ \ifnum\!!counta=\!!countb
+ \else
+ \executepagebreakhandler\v!yes
+ \executepagebreakhandler\v!empty
+ \executepagebreakhandler\v!empty
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!last
+ {\ejectinsert
+ \gotonextpageX % will become \gotonextpage
+ \relax
+ \doifbothsidesoverruled
+ {\shipoutfacingpage}
+ {}
+ {\noheaderandfooterlines \ejectdummypage}%
+ \filluparrangedpages}
+
+\installpagebreakhandler \v!lastpage % handy for backpage preceded by empty pages
+ {\executepagebreakhandler\v!yes
+ \ifdoublesided
+ \executepagebreakhandler\v!left
+ \executepagebreakhandler\v!empty
+ \executepagebreakhandler\v!empty
+ \fi}
+
+\installpagebreakhandler \v!start
+ {\globallet\shipout\normalshipout}
+
+\installpagebreakhandler \v!stop
+ {\globallet\shipout\noshipout}
+
+% nb: \executepagebreakhandler\v!hoofd in other ones
+
+\installpagebreakhandler \v!header
+ {\doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}}
+
+\installpagebreakhandler \v!footer
+ {\doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}}
+
+% \definepagebreak
+% [chapter]
+% [yes,header,right]
+%
+% \setuphead
+% [chapter]
+% [page=chapter,
+% header=empty,
+% footer=chapter]
+%
+% \definepagebreak % untested
+% [lastpage]
+% [left,{empty,right},{empty,left}]
+
+% public page handler, beware: definepage already in use (core-ref)
+%
+% \definepagebreak[instance][forsure]
+% \definepagebreak[forsure][yes,+4]
+
+\def\definepagebreak
+ {\dodoubleargument\dodefinepagebreak}
+
+\def\dodefinepagebreak[#1][#2]% non recursive, meant for simple mappings
+ {\setvalue{\??pe::#1}{#2}}
+
+% hier nog uti blokkeren
+
+% don't change this / test case:
+%
+% \setupbackgrounds[state=repeat]
+% \setupbackgrounds[text][text][background=whatever]
+% \couplepage[chapter][before={\defineoverlay[whatever][ON]}]
+% \setuphead[chapter][before={\pagetype[chapter]}]
+% \chapter{First} \page test \chapter{second} \page test
+
+\long\def\installcolumnbreakhandler#1#2#3% #1=otr-id #2=tag
+ {\long\setvalue{\??cn:#1:#2}{#3}}
+
+\def\definecolumnbreak
+ {\dodoubleargument\dodefinecolumnbreak}
+
+\def\dodefinecolumnbreak[#1][#2]% non recursive, meant for simple mappings
+ {\setvalue{\??cn::#1}{#2}}
+
+%\def\columnbreak
+% {\dosingleempty\docolumnbreak}
+%
+%\def\docolumnbreak[#1]%
+% {\expanded{\nextcolumn[\executeifdefined{\??cn::#1}{#1}]}}
+
+\definecomplexorsimple\columnbreak
+
+\def\simplecolumnbreak
+ {\executecolumnbreakhandler\v!yes}
+
+\def\complexcolumnbreak[#1]% if empty, do nothing and avoid processing
+ {\doifsomething{#1}{\executecolumnbreakhandlers{#1}}}
+
+\def\executecolumnbreakhandlers#1%
+ {\processcommacommand[#1]\executecolumnbreakhandler}
+
+\def\executecolumnbreakhandler#1% here no commalist
+ {\edef\@@columnspecification{#1}%
+ \doifdefinedelse{\??cn:\OTRidentifier:\@@columnspecification}
+ {\getvalue{\??cn:\OTRidentifier:\@@columnspecification}}
+ {\doifdefinedelse{\??cn::\@@columnspecification}
+ {\executecolumnbreakhandlers{\getvalue{\??cn::\@@columnspecification}}}
+ {\getvalue{\??cn:\OTRidentifier:\s!unknown}}}}
+
+%let\nextcolumn\columnbreak
+\let\column \columnbreak
+
+% We don't want spurious last pages (due to left over marks):
+
+\def\noshipout
+ {\writestatus\m!systems{ignoring further shipouts}%
+ \global\advance\realpageno\minusone % else no flush of resources
+ \dowithnextbox{\deadcycles\zerocount}}
+
+% \def\doignorerestoftext
+% {\ifarrangingpages \else \ifnum\textlevel>\zerocount \else
+% \globallet\shipout\noshipout
+% \fi \fi}
+%
+% better:
+
+\def\doignorerestoftext
+ {\ifarrangingpages \else \ifnum\textlevel=\plusone
+ \globallet\shipout\noshipout
+ \fi \fi}
+
+\let\ignorerestoftext\donothing
+
+\prependtoks % only ignore in a symmetrical doc
+ \globallet\ignorerestoftext\doignorerestoftext
+\to \everystarttext
+
+% \appendtoks
+% \ignorerestoftext
+% \to \everylastshipout
+
+\newif\ifpageselected \pageselectedtrue
+\newif\ifselectingpages \selectingpagesfalse
+\newif\ifprocessingpages\processingpagestrue
+
+\let\pageselection \empty
+\let\currentpageselection\empty
+\let\aftershipout \relax
+\let\beforeshipout \relax
+
+\def\dodobeforeshipout#1%
+ {\global\let\beforeshipout\relax
+ \getvalue{\??pg#1\c!before}}
+
+\def\dobeforeshipout
+ {\doifsomething\currentpageselection
+ {\processcommacommand[\currentpageselection]\dodobeforeshipout}}
+
+\def\dododoaftershipout#1%
+ {\global\let\aftershipout\relax
+ \global\let\currentpageselection\empty
+ \getvalue{\??pg#1\c!after}}
+
+\def\dodoaftershipout#1%
+ {\doifelsevalue{\??pg#1\c!option}\v!doublesided
+ {\doifbothsidesoverruled
+ {\dododoaftershipout{#1}}
+ {\dododoaftershipout{#1}}
+ {}}
+ {\dododoaftershipout{#1}}}
+
+\def\doaftershipout
+ {\doifsomething\currentpageselection
+ {\processcommacommand[\currentpageselection]\dodoaftershipout}}
+
+% Dit wordt eigenlijk nooit en moet worden vervangen door
+% het meer algemene mechanisme.
+
+\def\dopagetype[#1]%
+ {\edef\desoortpagina{#1}%
+ \ifx\desoortpagina\empty \else
+ \@EA\doglobal\@EA\addtocommalist\@EA{\desoortpagina}\currentpageselection
+ \ifselectingpages
+ \fullexpandtwoargsafter\doifcommon\desoortpagina\pageselection
+ {\global\pageselectedtrue}%
+ \fi
+ \gdef\beforeshipout{\dobeforeshipout}%
+ \gdef\aftershipout {\doaftershipout}%
+ \fi}
+
+\def\pagetype
+ {\dosingleargument\dopagetype}
+
+\def\docouplepage[#1][#2]%
+ {\getparameters
+ [\??pg]
+ [\c!before=,
+ \c!after=,
+ \c!option=,
+ #2]%
+ \def\docommand##1%
+ {\getparameters
+ [\??pg##1]
+ [\c!before=\@@pgbefore,
+ \c!after=\@@pgafter,
+ \c!option=\@@pgoption]}%
+ \processcommalist[#1]\docommand}%
+
+\def\couplepage
+ {\dodoubleargument\docouplepage}
+
+\def\doprocesspage[#1][#2]%
+ {\processaction
+ [#2]
+ [\v!yes=>\global\processingpagestrue,
+ \v!no=>\global\processingpagesfalse]%
+ \gdef\pageselection{#1}%
+ \global\selectingpagestrue
+ \global\pageselectedfalse}
+
+\def\processpage
+ {\dodoubleargument\doprocesspage}
+
+\def\resetselectiepagina
+ {\ifselectingpages
+ \doifbothsidesoverruled{\global\pageselectedfalse}{}{\global\pageselectedfalse}%
+ \fi}
+
+\newif\ifregistertextareas
+\newif\iftracetextareas
+
+\newbox\registertextbox
+
+% \def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box
+% {\hbox{\box#3}}
+
+\def\enabletextarearegistration{\global\registertextareastrue}
+
+\def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box
+ {\hbox\bgroup
+ \ifregistertextareas \ifx\registerMPtextarea\undefined \else
+ \setbox\registertextbox\null
+ \wd\registertextbox\wd#3%
+ \ht\registertextbox\ht#3%
+ \dp\registertextbox\dp#3%
+ \ifcase#1\or % 1
+ \setbox\registertextbox\hbox{\lower\strutdp\box\registertextbox}%
+ \fi
+ \ifcase#2\or % 1
+ \setbox\registertextbox\hbox{\raise\topskip\hbox{\lower\strutht\box\registertextbox}}%
+ \dp\registertextbox\strutdp
+ \fi
+ \dp\registertextbox\strutdp % needed
+ %\setbox\registertextbox\hbox
+ % {\iftracetextareas\gray\boxrulewidth2pt\ruledhbox\fi
+ % {\registerMPtextarea{\box\registertextbox}}}%
+ \setbox\registertextbox\hbox
+ {\registerMPtextarea{\box\registertextbox}}%
+ \smashbox\registertextbox
+ \box\registertextbox
+ \fi \fi
+ \box#3%
+ \egroup}
+
+%D \macros
+%D {setupoppositeplacing,startopposite}
+%D
+%D \starttyping
+%D \starttext
+%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test
+%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test
+%D \stoptext
+%D \stoptyping
+
+% Moved from page-mar.tex, made english, cleaned up, but still to be
+% redesigned
+
+\newbox\facingpage
+
+\def\setupoppositeplacing
+ {\dodoubleargument\getparameters[\??np]}
+
+\def\startopposite
+ {\dowithnextboxcontent
+ {\hsize\makeupwidth}%
+ {\global\setbox\facingpage\vbox
+ {\ifvoid\facingpage
+ \@@npbefore
+ \else
+ \@@npinbetween
+ \unvbox\facingpage
+ \fi
+ \box\nextbox}}%
+ \vbox\bgroup}
+
+\def\stopopposite
+ {\egroup}
+
+\def\finishfacingpage
+ {\ifvoid\facingpage\else
+ \global\setbox\facingpage\vbox to \makeupheight
+ {\unvbox\facingpage
+ \@@npafter
+ \vss}%
+ \fi}
+
+\def\shipoutfacingpage
+ {\doif\@@npstate\v!start
+ {\ifvoid\facingpage\else
+ \ifnum\realpageno>\plusone
+ \bgroup
+ \chardef\pageornamentstate\plusone
+ \finishfacingpage
+ \myshipout{\buildpagebody\box\facingpage}%
+ \egroup
+ \else
+ \global\setbox\facingpage\emptybox
+ \fi
+ \fi}}
+
+\setupoppositeplacing
+ [\c!state=\v!start,
+ \c!before=,
+ \c!inbetween=\blank,
+ \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv
new file mode 100644
index 000000000..07d342282
--- /dev/null
+++ b/tex/context/base/page-ini.mkiv
@@ -0,0 +1,1512 @@
+%D \module
+%D [ file=page-ini,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Initializations,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Initializations}
+
+% still a dutch/english mess
+
+%D This class of modules implements the output routines and
+%D floating body support. Although the modules are relatively
+%D new, the code herein is rather old. This reordering was
+%D needed when column sets were implemented and sharing code
+%D started to make sense.
+
+%D The history shows from the code, since both column
+%D mechanism use a different way of looping over columns.
+
+\unprotect
+
+\def\m!otr{otr}
+
+\chardef\normalpagebox=255
+
+\newbox\pagebox
+
+\ifx\recalculatelayout\undefined
+
+ \let \recalculatelayout \relax
+
+\fi
+
+\ifx\recalculatebackgrounds\undefined
+
+ \let \recalculatebackgrounds \relax
+ \let \addmainbackground \gobbleoneargument % <box>
+ \let \addtextbackground \gobbleoneargument % <box>
+ \let \addpagebackground \gobbleoneargument % <box>
+ \let \addprintbackground \gobbleoneargument % <box>
+ \let \addstatusinfo \gobbleoneargument % <box>
+
+\fi
+
+\ifx\realpageno\undefined
+
+ \countdef\realpageno = 0 \realpageno = 1
+ \countdef\userpageno = 1 \userpageno = 1
+ \countdef\subpageno = 2 \subpageno = 0 % !!
+ \countdef\arrangeno = 3 \arrangeno = 0 % !!
+
+ \let\pageno\userpageno
+
+\fi
+
+\ifx\realfolio\undefined
+
+ \def\realfolio{\the\realpageno}
+
+\fi
+
+\newcount\nofshipouts
+
+\appendtoks
+ \global\advance\nofshipouts\plusone
+\to \everyaftershipout
+
+% principle:
+%
+% multiple otr's
+%
+% (1) single column, simple routine (old one)
+% (2) multi column, collect and split routine (old one)
+% (3) multi column, page by page (new one, needed for taco)
+% (4) single column, spread handling (for fun)
+% (5) multi column, page by page, spread handling (as challenge)
+%
+% common components
+%
+% (1) float placement
+% (2) float flushing
+% (3) page body building
+% (4) ...
+%
+% ort
+%
+% + balancing
+% - mixed / one / multi / balancetofit
+% + backgrounds
+% + pre / post
+% + distances / heights
+% + ragged / baseline / normal
+% - pos sync
+% - last page
+%
+% - itemize / subtexts -> old mechanism
+%
+% floats
+%
+% - top / bottom / side / page / column / spead
+% - flush / packed flush / current page / next page / area
+%
+% footnotes
+%
+% + carry over pre column / local to column
+% + last column / pre last column / each column
+% - multiple classes
+% - area / page / end
+%
+% areas
+%
+% - top / bottom / mid in spread
+%
+% IMPORTANT
+%
+% switchtobodyfont in between ivm top
+
+% floats:
+%
+% tricky in balancing mode, a la huidige multi columns
+
+\ifx\dosetuplayout\undefined % overloaded in page-lay !
+
+ \unexpanded\def\setuplayout{\dodoubleempty\getparameters[\??ly]}
+
+\fi
+
+\ifx\mkprocesscolumncontents\undefined\let\mkprocesscolumncontents\gobbleoneargument\fi
+\ifx\mkprocesspagecontents \undefined\let\mkprocesspagecontents \gobbleoneargument\fi
+\ifx\mkprocessboxcontents \undefined\let\mkprocessboxcontents \gobbleoneargument\fi
+
+\def\normalejectpenalty{-\plustenthousand } \let\ejectpenalty\normalejectpenalty
+\def\normalsuperpenalty{-\plustwentythousand} \let\superpenalty\normalsuperpenalty
+
+%D In case we're not running \ETEX, we need to bypass a
+%D couple of primitives.
+
+% ONE = single column
+% MUL = multi column
+% SET = columns sets
+
+\def\@@OTR{OTR}
+
+\let\OTRdefault\empty
+
+% obsolete
+
+\def\installotr#1% andere naam, beter \connectotr of zo
+ {\def\OTRidentifier{#1}}
+
+% \def\OTRcommand#1%
+% {\csname\@@OTR
+% \ifcsname\@@OTR\OTRidentifier\strippedcsname#1\endcsname
+% \OTRidentifier
+% \else\ifcsname\@@OTR\OTRdefault\strippedcsname#1\endcsname % fallback
+% \OTRdefault
+% \fi\fi
+% \strippedcsname#1\endcsname}
+%
+% maybe faster but at least less tracing:
+
+\def\OTRcommand#1%
+ {\csname\@@OTR
+ \ifcsname\@@OTR\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname
+ \OTRidentifier
+ \else\ifcsname\@@OTR\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname % fallback
+ \OTRdefault
+ \fi\fi
+ \expandafter\gobbleoneargument\string#1\endcsname}
+
+\def\activateotr#1#2%
+ {\def\OTRidentifier{#1}%
+ \def\OTRdefault {#2}}
+
+% variant that does a preset:
+
+\newtoks\registeredotrcommands
+
+\def\registerotrcommand#1%
+ {\appendtoks\dowithotrcommand#1\to\registeredotrcommands}
+
+\def\dopresetotrcommand#1%
+ {\expandafter\let\expandafter#1\csname\@@OTR
+ \ifcsname\@@OTR\OTRidentifier\expandafter\gobbleoneargument\string#1\endcsname
+ \OTRidentifier
+ \else\ifcsname\@@OTR\OTRdefault\expandafter\gobbleoneargument\string#1\endcsname % fallback
+ \OTRdefault
+ \fi\fi
+ \expandafter\gobbleoneargument\string#1\endcsname}
+
+\def\activateotr#1#2%
+ {\def\OTRidentifier{#1}%
+ \def\OTRdefault {#2}%
+ \let\dowithotrcommand\dopresetotrcommand
+ \the\registeredotrcommands}
+
+\appendtoks
+ \activateotr{ONE}{}%
+\to\everydump
+
+%D The initialization of the \type {\hsize} and \type {\vsize}
+%D depends on the OTR used.
+
+% todo: \registerotrcommand\output, is a toks
+
+\registerotrcommand\setvsize % \def\setvsize {\OTRcommand\setvsize}
+\registerotrcommand\sethsize % \def\sethsize {\OTRcommand\sethsize}
+\registerotrcommand\finalsidefloatoutput % \def\finalsidefloatoutput {\OTRcommand\finalsidefloatoutput}
+\registerotrcommand\dopagecontents % \def\dopagecontents {\OTRcommand\dopagecontents}
+\registerotrcommand\dosettopinserts % \def\dosettopinserts {\OTRcommand\dosettopinserts}
+\registerotrcommand\dosetbotinserts % \def\dosetbotinserts {\OTRcommand\dosetbotinserts}
+\registerotrcommand\dotopinsertions % \def\dotopinsertions {\OTRcommand\dotopinsertions}
+\registerotrcommand\dobotinsertions % \def\dobotinsertions {\OTRcommand\dobotinsertions}
+\registerotrcommand\dosetbothinserts % \def\dosetbothinserts {\OTRcommand\dosetbothinserts}
+\registerotrcommand\doflushfloats % \def\doflushfloats {\OTRcommand\doflushfloats}
+\registerotrcommand\flushfloatbox % \def\flushfloatbox {\OTRcommand\flushfloatbox}
+\registerotrcommand\docheckiffloatfits % \def\docheckiffloatfits {\OTRcommand\docheckiffloatfits}
+\registerotrcommand\flushsavedfloats % \def\flushsavedfloats {\OTRcommand\flushsavedfloats}
+\registerotrcommand\synchronizehsize % \def\synchronizehsize {\OTRcommand\synchronizehsize}
+\registerotrcommand\gotonextpage % \def\gotonextpage {\OTRcommand\gotonextpage }
+\registerotrcommand\gotonextpageX % \def\gotonextpageX {\OTRcommand\gotonextpageX} % will become obsolete
+
+% wrong, will be redone
+%
+% \registerotrcommand\someherefloat % \def\someherefloat {\OTRcommand\someherefloat}
+% \registerotrcommand\somefixdfloat % \def\somefixdfloat {\OTRcommand\somefixdfloat}
+% \registerotrcommand\somepagefloat % \def\somepagefloat {\OTRcommand\somepagefloat}
+% \registerotrcommand\sometopsfloat % \def\sometopsfloat {\OTRcommand\sometopsfloat}
+% \registerotrcommand\somebotsfloat % \def\somebotsfloat {\OTRcommand\somebotsfloat}
+% \registerotrcommand\somesidefloat % \def\somesidefloat {\OTRcommand\somesidefloat}
+
+% beter een \installotr#1 met #1 = macro en auto test
+
+\newif \iftraceotr
+\newif \ifinotr
+\newtoks \mainoutput
+\newcount\otrlevel
+
+% When issuing two \par\penalty-\plustenthousand's, only the first
+% triggers the otr; obscure feature or optimization?
+
+\newcount\outputcounter \outputcounter=-100010 % -10010
+
+\def\doinvokeoutput
+ {\iftraceotr
+ \expandafter\dodotracedoutput
+ \else
+ \expandafter\dodoinvokeoutput
+ \fi}
+
+\def\doshowoutputmessage#1#2#3%
+ {\writestatus\m!otr{#1 #2 \number#3}}
+
+\def\dodoinvokeoutput#1%
+ {\bgroup\par\penalty#1\egroup}
+
+\def\dodotracedoutput#1%
+ {\doshowoutputmessage+{traced}{#1/\the\outputpenalty}%
+ \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}%
+ \dodoinvokeoutput{#1}%
+ \writestatus\m!otr{c:\number\mofcolumns,v:\the\vsize,g:\the\pagegoal,t:\the\pagetotal}%
+ \doshowoutputmessage-{traced}{#1/\the\outputpenalty}}
+
+\def\installoutput#1#2% \invoke \action
+ {\global\advance\outputcounter\minusone
+ \edef#1{\noexpand\doinvokeoutput{\number\outputcounter}}%
+ \setvalue{\@@OTR\number\outputcounter}{#2}}
+
+\def\invoketracedoutputroutine
+ {\doshowoutputmessage+{trying}\outputpenalty
+ \ifcsname\@@OTR\the\outputpenalty\endcsname
+ \doshowoutputmessage+{special}\outputpenalty
+ \csname\@@OTR\the\outputpenalty\endcsname
+ \doshowoutputmessage-{special}\outputpenalty
+ \else
+ \doshowoutputmessage+{normal}\outputpenalty
+ \the\OTRcommand\output
+ \doshowoutputmessage-{normal}\outputpenalty
+ \fi
+ \doshowoutputmessage-{trying}\outputpenalty}
+
+\def\invokenormaloutputroutine
+ {\ifcsname\@@OTR\the\outputpenalty\endcsname
+ \csname\@@OTR\the\outputpenalty\endcsname
+ \else
+ \the\OTRcommand\output
+ \fi}
+
+\def\invokeoutputroutine
+ {\iftraceotr
+ \expandafter\invoketracedoutputroutine
+ \else
+ \expandafter\invokenormaloutputroutine
+ \fi}
+
+\mainoutput{\invokeoutputroutine} \output{\inotrtrue\the\mainoutput}
+
+%D Some hooks:
+
+\output{\inotrtrue\the\everybeforeoutput\the\mainoutput\the\everyafteroutput}
+
+\ifx\pagediscards\undefined \let\pagediscards\relax \fi
+
+\installoutput\synchronizeoutput % maybe add pagediscards
+ {\ifvoid\normalpagebox\else
+ \unvbox\normalpagebox
+ \pagediscards % maybe not needed ?
+ \fi}
+
+\installoutput\discardpage
+ {\setbox\scratchbox\box\normalpagebox}
+
+%D In order to force consistent use of variables, we
+%D predefine a lot of them here.
+
+%D The next two registers can be used to store pre column
+%D material as well as footnotes or so.
+
+\newbox\precolumnbox \newdimen\precolumnboxheight
+\newbox\postcolumnbox \newdimen\postcolumnboxheight
+
+%D We reserve a counter for the number of columns as well as
+%D the current column. Both are not to be changed by users!
+
+\newcount\nofcolumns \nofcolumns = 1
+\newcount\mofcolumns \mofcolumns = 1
+
+\chardef\maxnofcolumns = 50
+\chardef\allocatednofcolumns = 0
+
+%D The next dimensions reports the final column height
+
+\newdimen\finalcolumnheights
+\newcount\finalcolumnlines
+
+%D During initialization the temporary boxes are allocated.
+%D This enables us to use as much columns as we want, without
+%D exhausting the pool of boxes too fast. We could have packed
+%D them in one box, but we've got enough boxes.
+%D
+%D Two sets of boxes are declared, the txtboxes are used for
+%D the text, the topboxes are for moved column floats.
+
+\def\@col@{@col@}
+
+\def\initializecolumns#1%
+ {\ifnum#1>\maxnofcolumns
+ \showmessage\m!columns1\maxnofcolumns
+ \nofcolumns\maxnofcolumns
+ \else
+ \nofcolumns#1\relax
+ \fi
+ \ifnum\nofcolumns>\allocatednofcolumns
+ \dorecurse\nofcolumns
+ {\ifnum\recurselevel>\allocatednofcolumns\relax
+ % \newbox\next \letgvalue{\@col@-\recurselevel-t}=\next
+ \@EA\newbox\csname\@col@-\recurselevel-t\endcsname % text
+ \@EA\newbox\csname\@col@-\recurselevel-f\endcsname % foot
+ \@EA\newbox\csname\@col@-\recurselevel-h\endcsname % top insert
+ \@EA\newbox\csname\@col@-\recurselevel-l\endcsname % top insert
+ \fi}%
+ \global\chardef\allocatednofcolumns=\nofcolumns
+ \fi}
+
+\def\firstcolumnbox {\columntextbox\plusone}
+\def\currentcolumnbox {\columntextbox\mofcolumns}
+\def\lastcolumnbox {\columntextbox\nofcolumns}
+
+\def\firsttopcolumnbox {\columntopbox \plusone}
+\def\currenttopcolumnbox{\columntopbox \mofcolumns}
+\def\lasttopcolumnbox {\columntopbox \nofcolumns}
+
+\def\columntextbox#1{\csname\@col@-\number#1-t\endcsname}
+\def\columnfootbox#1{\csname\@col@-\number#1-f\endcsname}
+\def\columntopbox #1{\csname\@col@-\number#1-h\endcsname}
+\def\columnbotbox #1{\csname\@col@-\number#1-l\endcsname}
+
+\def\columnsettextbox{\global\setbox\columntextbox}
+\def\columnsetfootbox{\global\setbox\columnfootbox}
+\def\columnsettopbox {\global\setbox\columntopbox}
+\def\columnsetbotbox {\global\setbox\columnbotbox}
+
+\def\columngettextbox{\copy\columntextbox}
+\def\columngetfootbox{\copy\columnfootbox}
+\def\columngettopbox {\copy\columntopbox}
+\def\columngetbotbox {\copy\columnbotbox}
+
+\def\columnerasetextboxes{\dorecurse\allocatednofcolumns{\columnsettextbox\recurselevel\emptybox}}
+\def\columnerasefootboxes{\dorecurse\allocatednofcolumns{\columnsetfootbox\recurselevel\emptybox}}
+\def\columnerasetopboxes {\dorecurse\allocatednofcolumns{\columnsettopbox \recurselevel\emptybox}}
+\def\columnerasebotboxes {\dorecurse\allocatednofcolumns{\columnsetbotbox \recurselevel\emptybox}}
+
+%D Without going in details we present two macro's which handle
+%D the columns. The action which is transfered by the the first
+%D and only parameter can do something with \type
+%D {\currentcolumnbox}. In case of the mid columns, \type
+%D {\firstcolumnbox} and \type {\lastcolumnbox} are handled
+%D outside these macro's.
+
+\def\dohandlecolumn#1%
+ {\mofcolumns\recurselevel
+ \let\currentcolumn\recurselevel
+ #1\relax}
+
+\def\dohandleallcolumns#1%
+ {\dorecurse\nofcolumns{\dohandlecolumn{#1}}}
+
+\def\dohandlerevcolumns#1%
+ {\dostepwiserecurse\nofcolumns\plusone\minusone{\dohandlecolumn{#1}}}
+
+\def\dohandlemidcolumns#1%
+ {\dohandleallcolumns
+ {\ifnum\recurselevel>\plusone
+ \ifnum\recurselevel<\nofcolumns
+ \dohandlecolumn{#1}%
+ \fi
+ \fi}}
+
+%D This register can be used as a temporary storage for page
+%D content.
+
+\newbox\restofpage
+
+%D Features.
+
+\newif\ifintermediatefootnotes
+\newif\ifcarryoverfootnotes %\carryoverfootnotestrue
+\newif\iflastcolumnfootnotes %\lastcolumnfootnotestrue
+\newif\ifbalancecolumns %\balancecolumnstrue
+\newif\ifbalancetoheight %\balancetoheighttrue
+\newif\ifforcecolumngrid \forcecolumngridtrue
+\newif\ifstretchcolumns \stretchcolumnsfalse
+\newif\ifinheritcolumns \inheritcolumnsfalse
+\newif\ifheightencolumns \heightencolumnsfalse
+
+\newif\ifbalancingcolumns
+\newif\ifcollectingcontent
+\newif\ifcolumnoverflow
+
+\newdimen\intercolumnwidth
+\newdimen\localcolumnwidth
+\newdimen\savedpagetotal
+
+\chardef\columndirection=0 % 0:lr 1:rl
+
+\def\minbalancetoplines {1}
+\def\minfreecolumnlines {2}
+
+\newif\ifrecentercolumnbox \recentercolumnboxtrue
+\newif\ifrerecentercolumnbox \rerecentercolumnboxtrue
+\newif\ifpackcolumnfloats \packcolumnfloatstrue
+
+\newbox\collectedpagefloats
+\newbox\collectedleftpagefloats
+\newbox\collectedrightpagefloats
+
+%D The \type {\ifdim} test is needed, because otherwise the
+%D last line of a text end up on top of the baseline instead of
+%D on the baseline, as is the case with preceding pages.
+%D Also, a \type {\vfil} better than a \type {\vfill}.
+
+% to be replaced by \page[now] \page[final] / merged
+
+% \def\eject {\par\penalty-\plustenthousand } % == {\par\break} % plain
+% \def\supereject {\par\penalty-\plustwentythousand} % also plain
+
+\def\eject {\par\ifvmode\penalty\ejectpenalty\fi\resetpagebreak} % == {\par\break} % plain
+\def\supereject {\par\ifvmode\penalty\superpenalty\fi\resetpagebreak} % also plain
+
+\def\doejectpage {\par\ifvmode\ifdim\pagetotal>\pagegoal\else\normalvfil\fi\fi} % pg set to \textheight
+\def\ejectpage {\doejectpage\eject}
+\def\superejectpage{\doejectpage\supereject}
+
+\ifx\bye\undefined \def\bye{\par\vfill\supereject\end} \fi % plain tex command
+
+% floats
+
+\def\ejectinsert
+ {%\flushnotes already done
+ \bgroup
+ \noftopfloats\plusthousand
+ \nofbotfloats\zerocount
+ % this is needed in case a float that has been stored
+ % ends up at the current page; this border case occurs when
+ % the calculated room is 'eps' smaller that the room available
+ % when just flushing; so now we have (maybe optional):
+ \pagebaselinecorrection
+ % alas, this is tricky but needed (first surfaced in prikkels)
+ \doflushfloats
+ \egroup}
+
+\def\ejectdummypage
+ {\endgraf \ifvmode
+ \ejectinsert
+ \fixedspace
+ \vfill
+ \gotonextpage
+ \fi}
+
+\def\beforefinaloutput
+ {}
+
+\def\afterfinaloutput
+ {%\forgetall
+ \vskip\zeropoint\relax
+ \ifvoid\normalpagebox \else
+ \unvbox\normalpagebox
+ \penalty\outputpenalty
+ \fi
+ % not really needed, replaced by \flushsavedfloats
+ \ifnum\outputpenalty>\superpenalty \else % better use a proper otr signal
+ \dosupereject
+ \fi
+ % but does not hurt either (we're still in the otr!)
+ \inpagebodytrue % needed for enabling \blank !
+ \flushsavedfloats % was \dosetbothinserts; only otr one !
+ \setvsize} % this is needed for interacting components, like floats and multicolumns
+
+\def\dofinaloutput#1#2% \vbox: prevents spurious spaces in every..pagebody
+ {\forgetall
+ \beforefinaloutput
+ \the\everybeforeshipout % brrr not in shipout
+ \the\pageboundsettings
+ \myshipout{\hbox{\vbox{\dopagebody#1#2}}}% is this hbox needed
+ \the\everyaftershipout
+ \afterfinaloutput}
+
+\def\donofinaloutput#1#2%
+ {\forgetall
+ \beforefinaloutput
+ \the\everybeforeshipout
+ \message{[-\the\realpageno]}%
+ \setbox\scratchbox\hbox{\dopagebody#1#2}%
+ \deadcycles\zerocount
+ \setnextrealpageno
+ \the\everyaftershipout
+ \afterfinaloutput}
+
+% beware: \ifprocessingpages is in use
+
+\ifdefined\doflushspread\else \let\doflushspread\relax \fi % todo
+
+\def\finaloutput#1#2%
+ {\ifprocessingpages
+ \ifpageselected
+ \@EAEAEA\dofinaloutput
+ \else
+ \@EAEAEA\donofinaloutput
+ \fi
+ \else
+ \ifpageselected
+ \@EAEAEA\donofinaloutput
+ \else
+ \@EAEAEA\dofinaloutput
+ \fi
+ \fi#1#2%
+ \resetselectiepagina
+ \incrementpagenumber
+ \incrementsubpagenumber
+ \checkpagedimensions
+ \ifnum\outputpenalty>\superpenalty \else
+ \dosupereject
+ \fi
+ \doflushspread
+ \doflushpostponedcontent}
+
+\def\dooutput
+ {\finaloutput\unvbox\normalpagebox}
+
+\maxdeadcycles=1000
+
+% will be installable tracer; better use chardef
+
+% this needs a real cleanup
+
+\def\doplaceversiontext#1#2%
+ {\doifsomething{#2}
+ {\defconvertedcommand\ascii{#2}%
+ \space#1:\space\ascii\space
+ \!!doneatrue}}
+
+\unexpanded\def\placeversioninfo % nog engels maken
+ {\ifcase\conceptmode
+ % 0 : nothing
+ \or
+ % 1 : simple
+ \vskip\!!sixpoint
+ \hbox to \makeupwidth
+ {\infofont
+ \v!concept:\space\currentdate
+ \hss\reportpagedimensions}%
+ \else
+ % 2/3 : extensive
+ \vskip\!!sixpoint
+ \hbox to \makeupwidth
+ {\infofont
+ \getmessage\m!systems{27}:\space\currentdate\space
+ \doplaceversiontext\v!project \currentproject
+ \doplaceversiontext\v!product \currentproduct
+ \doplaceversiontext\v!component\currentcomponent
+ \if!!donea\else\space\v!file:\space\jobname\fi
+ \hss\reportpagedimensions}%
+ \fi}
+
+% tot hier
+
+\def\doversion[#1]%
+ {\chardef\conceptmode\zerocount
+ \overfullrule\zeropoint
+ \processaction % \v!final=>
+ [#1]
+ [ \v!concept=>\chardef\conceptmode\plusone, % simple banner
+ \v!file=>\chardef\conceptmode\plustwo, % full banner
+ \v!temporary=>\chardef\conceptmode\plusthree % full banner plus
+ \overfullrule5\points]} % info in the margin
+
+\def\version
+ {\dosingleargument\doversion}
+
+\def\addstatusinfo
+ {\ifcase\conceptmode
+ \@EA\gobbleoneargument
+ \else
+ \@EA\doaddstatusinfo
+ \fi}
+
+\def\doaddstatusinfo#1%
+ {\setbox#1\vbox to \paperheight
+ {\vsmashbox#1\box#1%
+ \offinterlineskip
+ \vskip\topspace
+ \hsize\paperwidth
+ %\hfill\hbox{\placetestinfo\hskip.5cm}\vss % obsolete
+ \settexthoffset\hskip\texthoffset % brrrr
+ \vbox to 1cm{\vss\placeversioninfo\vss}}}
+
+\def\dotestinfo#1#2#3%
+ {\ifinpagebody\else\ifnum\conceptmode=\plusthree
+ \begingroup
+ \defconvertedcommand\ascii{#3}%
+ \xdef\extratestinfo
+ {#2\space\ascii}%
+ \gdef\totaltestinfo
+ {\global\setbox#1\vbox
+ {\unvbox#1\relax
+ \infofont \setupinterlinespace
+ \hbox
+ {\strut
+ \expanded{\doboundtext{\extratestinfo}{12em}{..}}%
+ \quad}}}%
+ \endgroup
+ \ifinner
+ \aftergroup\totaltestinfo
+ \else
+ \totaltestinfo
+ \fi
+ \fi\fi}
+
+\version[\v!final]
+
+% bewaren tvb documentatie
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.2\hsize
+% \vsize=2\hsize
+% \ruledvbox to \vsize{\input tufte \par}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss
+% \ruledvbox to \vsize{\input tufte \par\vfill}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}}
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.18\hsize
+% \vsize=2.5\hsize
+% \setbox0=\vbox{\input tufte\relax}%
+% \ruledvbox to \vsize{\unvcopy0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss
+% \ruledvbox to \vsize{\unvcopy0\vfill}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}}
+
+\newtoks\afterpage \newtoks\aftereverypage
+\newtoks\beforepage \newtoks\beforeeverypage
+
+\chardef\showgridstate=0
+
+\def\showgrid
+ {\dosingleempty\doshowgrid}
+
+\def\doshowgrid[#1]%
+ {\chardef\showgridstate \plusone % downward compatible default
+ \chardef\gridboxlinemode \plusone
+ \chardef\gridboxlinenomode\plusone
+ \processallactionsinset
+ [#1]%
+ [ \v!reset=>\chardef\showgridstate \zerocount,
+ \v!bottom=>\chardef\showgridstate \plusone,
+ \v!top=>\chardef\showgridstate \plustwo,
+ \v!none=>\chardef\gridboxlinemode \zerocount,
+ \v!all=>\chardef\gridboxlinemode \plusone,
+ \v!lines=>\chardef\gridboxlinemode \plustwo,
+ \v!frame=>\chardef\gridboxlinemode \plusthree,
+ \v!nonumber=>\chardef\gridboxlinenomode\zerocount,
+ \v!right=>\chardef\gridboxlinenomode\plusone,
+ \v!left=>\chardef\gridboxlinenomode\plustwo,
+ \v!outer=>\chardef\gridboxlinenomode\plusthree]%
+ \ifcase\showgridstate
+ \let\addtextgridlayer\gobbleoneargument
+ \else % 1=bottom 2=top
+ \let\addtextgridlayer\doaddtextgridlayer
+ \fi}
+
+\definepalet
+ [layout]
+ [grid=red,
+ page=green]
+
+% if really needed for speed we can cache the grid
+
+\let\addtextgridlayer\gobbleoneargument
+
+\def\doaddtextgridlayer#1% to be checked for color and layer
+ {\startcolor[layout:grid]%
+ \setgridbox\scratchbox\makeupwidth\textheight % todo: check color
+ \global\setbox#1\hbox
+ {\ifcase\showgridstate\or\or\box#1\hskip-\makeupwidth\fi
+ \bgroup % color
+ \ifcase\layoutcolumns\else
+ \gray
+ \setlayoutcomponentattribute\v!grid\v!columns
+ \hbox \layoutcomponentboxattribute to \makeupwidth
+ {\dorecurse\layoutcolumns
+ {\hskip\layoutcolumnwidth
+ \ifnum\recurselevel<\layoutcolumns
+ \vrule
+ \!!height\ht\scratchbox
+ \!!depth\dp\scratchbox
+ \!!width\layoutcolumndistance
+ \fi}}%
+ \hskip-\makeupwidth
+ \fi
+ \setlayoutcomponentattribute\v!grid\v!lines
+ \hbox \layoutcomponentboxattribute{\box\scratchbox}%
+ \egroup
+ \ifcase\showgridstate\or\hskip-\makeupwidth\box#1\fi}%
+ \stopcolor}
+
+\def\buildpagebox#1%
+ {\setbox#1\vbox to \paperheight
+ {\hsize\paperwidth
+ \vskip\topspace
+ \doifbothsides
+ {\hskip\backspace}
+ {\hskip\backspace}
+ {\hskip\paperwidth \hskip-\backspace \hskip-\makeupwidth}%
+ \box#1}%
+ \dp#1\zeropoint}
+
+% \newif\ifpagebodyornaments \pagebodyornamentstrue
+%
+% \appendtoks
+% \global\pagebodyornamentstrue
+% \to \everyaftershipout
+
+\newif\ifarrangingpages \arrangingpagesfalse
+
+\chardef\pageornamentstate\zerocount % 0=on 1=one-off 2=always-off
+
+\def\pagebodyornamentstrue {\chardef\pageornamentstate\zerocount} % for a while
+\def\pagebodyornamentsfalse{\chardef\pageornamentstate\plusone} % for a while
+
+\appendtoks
+ \ifcase\pageornamentstate\or
+ \chardef\pageornamentstate\zerocount
+ \fi
+\to \everyaftershipout
+
+\let\poparrangedpages\relax
+\let\pusharrangedpage\relax
+
+\ifx\shiftprintpagebox\undefined
+ \let\shiftprintpagebox\gobbleoneargument
+ \let\shiftpaperpagebox\gobbleoneargument
+\fi
+
+\ifx\registerpageposition\undefined
+ \let\registerpageposition\gobbleoneargument
+\fi
+
+\def\reportarrangedpage#1%
+ {\showmessage\m!systems
+ {23}{\the\realpageno.\the\pageno\ifnum\subpageno>0 .\the\subpageno\fi,#1}}
+
+\newif\ifsavepagebody \newbox\savedpagebody
+
+% beware, \??ly is used before defined, i.e. bad module design
+
+\setuplayout[\c!method=\v!normal]
+
+\def\buildpagebody#1#2%
+ {\ifsavepagebody\global\setbox\savedpagebody\fi
+ \vbox
+ {\beginrestorecatcodes
+% \forgetall % igv problemen, check: \boxmaxdepth\maxdimen
+ \boxmaxdepth\maxdimen % new
+ \dontcomplain
+ % the following plugin uses and sets pagebox; beware: this
+ % will change and is for my (hh) personal experiments
+ \executeifdefined{\??ly\c!method\@@lymethod}%
+ {\getvalue{\??ly\c!method\v!normal}}#1#2%
+ % the finishing touch
+ \ifcase\pageornamentstate
+ \addpagebackground \pagebox
+ \fi
+ \registerpageposition\pagebox
+ \ifarrangingpages
+ \shiftpaperpagebox \pagebox % \v!paper
+ \else
+ \clippagebox \pagebox
+ \doifelse\@@lymarking\v!page
+ {\replicatepagebox \pagebox
+ \addpagecutmarks \pagebox}
+ {\addpagecutmarks \pagebox
+ \replicatepagebox \pagebox}%
+ \scalepagebox \pagebox
+ \mirrorpaperbox \pagebox
+ \orientpaperbox \pagebox
+ \addpagecolormarks \pagebox
+ \centerpagebox \pagebox
+ \addprintbackground\pagebox
+ \mirrorprintbox \pagebox
+ \orientprintbox \pagebox
+ \shiftprintpagebox \pagebox % \v!page
+ \offsetprintbox \pagebox
+ \negateprintbox \pagebox
+ \fi
+ \box\pagebox
+ \endrestorecatcodes}%
+ \ifsavepagebody\copy\savedpagebody\fi}
+
+\setvalue{\??ly\c!method\v!normal}#1#2%
+ {\setbox\pagebox\vbox
+ {\offinterlineskip
+ \ifcase\pageornamentstate
+ \bgroup % else footnotes get inconsistent font/baseline
+ \dostartattributes\??ly\c!style\c!color\empty
+ \offinterlineskip
+ \gettextboxes
+ \dostopattributes
+ \egroup
+ \fi
+ \getmainbox#1#2}% including footnotes
+ \ifcase\pageornamentstate
+ \addmainbackground \pagebox
+ \fi
+ \buildpagebox \pagebox
+ \addstatusinfo \pagebox}
+
+\def\finishpagebox#1%
+ {\ifarrangingpages
+ \addpagecutmarks #1%
+ \addpagecolormarks#1%
+ \centerpagebox #1%
+ \mirrorprintbox #1%
+ \orientprintbox #1%
+ \offsetprintbox #1%
+ \negateprintbox #1%
+ \fi}
+
+\appendtoks \restoreouterspacing \to \everybeforepagebody
+\appendtoks \restoreglobalbodyfont \to \everybeforepagebody
+%appendtoks \restoreouterspacing \to \everybeforepagebody
+
+\ifx\nestednewbox\undefined \newbox\nestednextbox \fi
+
+\prependtoks \let\nextbox\nestednextbox \to \everybeforepagebody
+
+\def\dopagebody#1#2%
+ {%\getallmarks % now in following token register
+ \the\everybeforepagebody
+ \starttextproperties
+% \setnextsubpageno % nog eens: als in pagina (tbv standaard opmaak)
+ \dontshowboxes % dan hier blokkeren en verderop resetten
+% \shipoutfacingpage
+ \checkmarginblocks
+ \the\beforeeverypage
+ \normalexpanded{\global\beforepage\emptytoks\the\beforepage}% \scratchtoks\beforepage\global\beforepage\emptytoks\the\scratchtoks % was \flushtoks\beforepage
+ \inpagebodytrue\buildpagebody#1#2%
+ \normalexpanded{\global\afterpage \emptytoks\the\afterpage }% \scratchtoks\afterpage \global\afterpage \emptytoks\the\scratchtoks % was \flushtoks\afterpage
+ \the\aftereverypage
+ \resetpagebreak
+ %updatelistreferences % now in aftereverypage
+ \resetlayouttextlines % will go to \aftereverypage
+ \stoptextproperties
+ \the\everyafterpagebody}
+
+\newtoks\pageboundsettings
+
+% \prependtoks \initializepaper \to \pageboundsettings
+
+% not here
+
+\newif\ifpagebreakdisabled \pagebreakdisabledfalse
+
+\chardef\testpagemethod \zerocount % todo: \testnewpage[method=,lines=,voffset=]
+\chardef\testpagetrigger\zerocount
+
+\def\testpage {\dotripleempty\dotestpage[\plusone ]} %
+\def\testpageonly{\dotripleempty\dotestpage[\plustwo ]} % no penalties added to the mvl
+\def\testpagesync{\dotripleempty\dotestpage[\plusthree]} % force sync
+
+\def\dotestpage[#1][#2][#3]% don't change, only add more methods
+ {\relax % needed before \if
+ \ifpagebreakdisabled
+ \endgraf
+ \else
+ % new from here
+ \ifcase\testpagetrigger
+ \endgraf
+ \or
+ \ifvmode
+ \dosomebreak\allowbreak
+ \else % indeed?
+ \vadjust{\allowbreak}%
+ \endgraf
+ \fi
+ \fi
+ % till here
+ \ifdim\pagegoal<\maxdimen \relax
+ \ifdim\pagetotal<\pagegoal \relax
+ \scratchdimen\lineheight
+ \multiply\scratchdimen#2\relax
+ \advance\scratchdimen \pagetotal
+ \ifdim\lastskip<\parskip
+ \advance\scratchdimen \parskip
+ \fi
+ \ifthirdargument
+ \advance\scratchdimen#3\relax
+ \fi
+ \ifcase\testpagemethod
+ \ifdim\scratchdimen>.99\pagegoal
+ \penalty-\!!tenthousand\relax
+ \fi
+ \or
+ \advance\scratchdimen-\pagegoal
+ \ifdim\scratchdimen>-\lineheight
+ \penalty-\!!tenthousand\relax
+ \fi
+ \or
+ \getnoflines\pagegoal
+ \advance\scratchdimen-\noflines\lineheight \relax
+ \ifdim\scratchdimen>-\lineheight
+ \penalty-\!!tenthousand\relax
+ \fi
+ \or % same as 0 but more accurate
+ \advance\scratchdimen-10\s!sp\relax
+ \ifdim\scratchdimen>\pagegoal
+ \penalty-\!!tenthousand\relax
+ \fi
+ \fi
+ \else
+ \ifnum#1=\plusthree
+ \flushpagesofar
+ \fi
+ \fi
+ \else
+ \ifnum#1=\plusone\goodbreak\fi
+ \fi
+ \fi}
+
+\def\flushpagesofar
+ {\endgraf
+ \ifdim\pagetotal>\pagegoal
+ \ifdim\dimexpr\pagetotal-\pageshrink\relax>\pagegoal
+ \goodbreak % \penalty0
+ \else
+ \page
+ \fi
+ \else
+ \fi}
+
+\def\testcolumn
+ {\dodoubleempty\dotestcolumn}
+
+\def\dotestcolumn[#1][#2]%
+ {%\relax % needed before \if !
+ \endgraf
+ \ifdim\pagegoal<\maxdimen \ifdim\pagetotal<\pagegoal % \relax
+ \scratchdimen\pagegoal
+ \advance\scratchdimen-\pagetotal
+ \ifdim\lastskip<\parskip
+ \advance\scratchdimen \parskip
+ \fi
+ \ifsecondargument
+ \advance\scratchdimen#2%
+ \fi
+ \getrawnoflines\scratchdimen % raw !
+ % \message{[\number#1>\number\noflines ?}\wait
+ \ifnum#1>\noflines
+ \column
+ \fi
+ \else
+ \penalty-\!!tenthousand % untested ! ! \column
+ \fi \fi}
+
+\let\resetcurrentsectionmarks\relax
+
+% was: \resetsectionmarks\firstsection, zie \handlepagebreak
+
+\def\page{\pagebreak} % the short form of \pagebreak (mult-com one)
+
+\def\resetpagebreak
+ {\global\pagebreakdisabledfalse}
+
+\def\simplifypagebreak
+ {\def\dopagebreak[##1]{\goodbreak}}
+
+\def\disablepagebreaks
+ {\def\dopagebreak[##1]{}}
+
+\def\executepagebreakhandler#1%
+ {\edef\@@pagespecification{#1}%
+ \ifcsname\??pe:\@@pagespecification\endcsname
+ \csname\??pe:\@@pagespecification\endcsname
+ \else\ifcsname\??pe::\@@pagespecification\endcsname
+ \executepagebreakhandlers{\csname\??pe::\@@pagespecification\endcsname}%
+ \else
+ \csname\??pe:\s!unknown\endcsname
+ \fi\fi}
+
+\long\def\installpagebreakhandler#1#2%
+ {\long\setvalue{\??pe:#1}{#2}}
+
+\unexpanded\def\pagebreak
+ {\dosingleempty\dopagebreak}
+
+\def\dopagebreak[#1]% so, page ornaments are reset after a pagebreak command, unless set
+ {\bgroup
+ \flushnotes
+ \edef\prevrealpageno{\the\realpageno}%
+ \ifcase\pageornamentstate \or
+ % disable reset after shipout
+ \global\chardef\pageornamentstate\plustwo
+ \fi
+ \iffirstargument % or if empty i.e. []
+ \executepagebreakhandlers{#1}%
+ \else % so, no pagebreak when \pagebreak[] ! ! !
+ \executepagebreakhandler\v!yes
+ \fi
+ \ifnum\prevrealpageno<\realpageno
+ % there must have been a reason why i added the ifcase
+ % but it fails on tests/mkiv/pages/ornaments-001.tex
+ % as WS found out so we have to wait till the next side
+ % effect shows up
+ % \ifcase\pageornamentstate\or
+ \global\chardef\pageornamentstate\zerocount
+ % \fi
+ \fi
+ \egroup}
+
+\def\executepagebreakhandlers#1%
+ {\processcommacommand[#1]\executepagebreakhandler}
+
+\installpagebreakhandler \s!dummy
+ {\ejectinsert
+ \gotonextpage
+ \ejectdummypage}
+
+\installpagebreakhandler \v!frame
+ {\page\bgroup\showframe\page[\v!empty]\egroup}
+
+\installpagebreakhandler \s!unknown
+ {\doifinstringelse{+}\@@pagespecification
+ {\ejectinsert
+ \gotonextpage
+ \dorecurse\@@pagespecification\ejectdummypage}
+ {\doifnumberelse\@@pagespecification
+ {\ejectinsert
+ \gotonextpage
+ \doloop
+ {\ifnum\userpageno<\@@pagespecification\relax
+ \ejectdummypage
+ \else
+ \exitloop
+ \fi}}
+ {}}}
+
+\installpagebreakhandler \s!default
+ {} % do nothing if empty
+
+\installpagebreakhandler \v!reset
+ {% better not: \global\chardef\pageornamentstate\zerocount
+ \resetpagebreak}
+
+\installpagebreakhandler \v!disable
+ {\global\pagebreakdisabledtrue}
+
+\installpagebreakhandler \v!yes
+ {\ifpagebreakdisabled\else
+ \ejectinsert
+ \gotonextpage
+ \ifinsidecolumns % this will move to MUL
+ \ejectpage % anders soms geen overgang
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!makeup % ??
+ {\ifpagebreakdisabled\else
+ \eject
+ \fi}
+
+\installpagebreakhandler \v!blank
+ {\ifcase\pageornamentstate
+ \global\chardef\pageornamentstate\plusone
+ \fi}
+
+\installpagebreakhandler \v!no
+ {\ifpagebreakdisabled\else
+ \dosomebreak\nobreak
+ \fi}
+
+\installpagebreakhandler \v!preference
+ {\ifpagebreakdisabled\else
+ \ifinsidecolumns % this will move to MUL
+ \dosomebreak\goodbreak
+ \else
+ \testpage[3][\zeropoint]%
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!bigpreference
+ {\ifpagebreakdisabled\else
+ \ifinsidecolumns % this will move to MUL
+ \dosomebreak\goodbreak
+ \else
+ \testpage[5][\zeropoint]%
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!empty
+ {\ejectinsert
+ \gotonextpage
+ \doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}%
+ \doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}%
+ \ejectdummypage}
+
+\installpagebreakhandler \v!left
+ {\ejectinsert
+ \gotonextpageX % will become \gotonextpage
+ \doifbothsidesoverruled{}{\resetcurrentsectionmarks\ejectdummypage}{}}
+
+\installpagebreakhandler \v!right
+ {\ejectinsert
+ \gotonextpageX % will become \gotonextpage
+ \doifbothsidesoverruled{}{}{\resetcurrentsectionmarks\ejectdummypage}}
+
+\installpagebreakhandler \v!even
+ {\page
+ \doifoddpageelse{\resetcurrentsectionmarks\ejectdummypage}\donothing}
+
+\installpagebreakhandler \v!odd
+ {\page
+ \doifoddpageelse\donothing{\resetcurrentsectionmarks\ejectdummypage}}
+
+\installpagebreakhandler \v!quadruple % not yet ok inside columnsets
+ {\ifdoublesided
+ \!!counta\realpageno
+ \!!countb\realpageno
+ \divide\!!counta 4
+ \divide\!!countb 2
+ \ifnum\!!counta=\!!countb
+ \else
+ \executepagebreakhandler\v!yes
+ \executepagebreakhandler\v!empty
+ \executepagebreakhandler\v!empty
+ \fi
+ \fi}
+
+\installpagebreakhandler \v!last
+ {\ejectinsert
+ \gotonextpageX % will become \gotonextpage
+ \relax
+ \doifbothsidesoverruled
+ {\shipoutfacingpage}
+ {}
+ {\noheaderandfooterlines \ejectdummypage}%
+ \filluparrangedpages}
+
+\installpagebreakhandler \v!lastpage % handy for backpage preceded by empty pages
+ {\executepagebreakhandler\v!yes
+ \ifdoublesided
+ \executepagebreakhandler\v!left
+ \executepagebreakhandler\v!empty
+ \executepagebreakhandler\v!empty
+ \fi}
+
+\installpagebreakhandler \v!start
+ {\globallet\shipout\normalshipout}
+
+\installpagebreakhandler \v!stop
+ {\globallet\shipout\noshipout}
+
+% nb: \executepagebreakhandler\v!hoofd in other ones
+
+\installpagebreakhandler \v!header
+ {\doifnotvalue{\??tk\v!header\c!state}\v!stop{\setupheader[\c!state=\v!empty]}}
+
+\installpagebreakhandler \v!footer
+ {\doifnotvalue{\??tk\v!footer\c!state}\v!stop{\setupfooter[\c!state=\v!empty]}}
+
+% \definepagebreak
+% [chapter]
+% [yes,header,right]
+%
+% \setuphead
+% [chapter]
+% [page=chapter,
+% header=empty,
+% footer=chapter]
+%
+% \definepagebreak % untested
+% [lastpage]
+% [left,{empty,right},{empty,left}]
+
+% public page handler, beware: definepage already in use (core-ref)
+%
+% \definepagebreak[instance][forsure]
+% \definepagebreak[forsure][yes,+4]
+
+\unexpanded\def\definepagebreak
+ {\dodoubleargument\dodefinepagebreak}
+
+\def\dodefinepagebreak[#1][#2]% non recursive, meant for simple mappings
+ {\setvalue{\??pe::#1}{#2}}
+
+% don't change this / test case:
+%
+% \setupbackgrounds[state=repeat]
+% \setupbackgrounds[text][text][background=whatever]
+% \couplepage[chapter][before={\defineoverlay[whatever][ON]}]
+% \setuphead[chapter][before={\pagetype[chapter]}]
+% \chapter{First} \page test \chapter{second} \page test
+
+\long\def\installcolumnbreakhandler#1#2#3% #1=otr-id #2=tag
+ {\long\setvalue{\??cn:#1:#2}{#3}}
+
+\unexpanded\def\definecolumnbreak
+ {\dodoubleargument\dodefinecolumnbreak}
+
+\def\dodefinecolumnbreak[#1][#2]% non recursive, meant for simple mappings
+ {\setvalue{\??cn::#1}{#2}}
+
+%\def\columnbreak
+% {\dosingleempty\docolumnbreak}
+%
+%\def\docolumnbreak[#1]%
+% {\expanded{\nextcolumn[\executeifdefined{\??cn::#1}{#1}]}}
+
+\definecomplexorsimple\columnbreak
+
+\def\simplecolumnbreak
+ {\executecolumnbreakhandler\v!yes}
+
+\def\complexcolumnbreak[#1]% if empty, do nothing and avoid processing
+ {\doifsomething{#1}{\executecolumnbreakhandlers{#1}}}
+
+\def\executecolumnbreakhandlers#1%
+ {\processcommacommand[#1]\executecolumnbreakhandler}
+
+\def\executecolumnbreakhandler#1% here no commalist
+ {\edef\@@columnspecification{#1}%
+ \doifdefinedelse{\??cn:\OTRidentifier:\@@columnspecification}
+ {\getvalue{\??cn:\OTRidentifier:\@@columnspecification}}
+ {\doifdefinedelse{\??cn::\@@columnspecification}
+ {\executecolumnbreakhandlers{\getvalue{\??cn::\@@columnspecification}}}
+ {\getvalue{\??cn:\OTRidentifier:\s!unknown}}}}
+
+%let\nextcolumn\columnbreak
+\let\column \columnbreak
+
+% We don't want spurious last pages (due to left over marks):
+
+\def\noshipout
+ {\writestatus\m!systems{ignoring further shipouts}%
+ \global\advance\realpageno\minusone % else no flush of resources
+ \dowithnextbox{\deadcycles\zerocount}}
+
+% \def\doignorerestoftext
+% {\ifarrangingpages \else \ifnum\textlevel>\zerocount \else
+% \globallet\shipout\noshipout
+% \fi \fi}
+%
+% better:
+
+\def\doignorerestoftext
+ {\ifarrangingpages \else \ifnum\textlevel=\plusone
+ \globallet\shipout\noshipout
+ \fi \fi}
+
+\let\ignorerestoftext\donothing
+
+\prependtoks % only ignore in a symmetrical doc
+ \globallet\ignorerestoftext\doignorerestoftext
+\to \everystarttext
+
+% \appendtoks
+% \ignorerestoftext
+% \to \everylastshipout
+
+\newif\ifpageselected \pageselectedtrue
+\newif\ifselectingpages \selectingpagesfalse
+\newif\ifprocessingpages\processingpagestrue
+
+\let\pageselection \empty
+\let\currentpageselection\empty
+\let\aftershipout \relax
+\let\beforeshipout \relax
+
+\def\dodobeforeshipout#1%
+ {\global\let\beforeshipout\relax
+ \csname\??pg#1\c!before\endcsname}
+
+\def\dobeforeshipout
+ {\doifsomething\currentpageselection
+ {\processcommacommand[\currentpageselection]\dodobeforeshipout}}
+
+\def\dododoaftershipout#1%
+ {\global\let\aftershipout\relax
+ \global\let\currentpageselection\empty
+ \csname\??pg#1\c!after\endcsname}
+
+\def\dodoaftershipout#1%
+ {\doifelsevalue{\??pg#1\c!option}\v!doublesided
+ {\doifbothsidesoverruled
+ {\dododoaftershipout{#1}}
+ {\dododoaftershipout{#1}}
+ {}}
+ {\dododoaftershipout{#1}}}
+
+\def\doaftershipout
+ {\doifsomething\currentpageselection
+ {\processcommacommand[\currentpageselection]\dodoaftershipout}}
+
+% Dit wordt eigenlijk nooit en moet worden vervangen door
+% het meer algemene mechanisme.
+
+\def\dopagetype[#1]%
+ {\edef\desoortpagina{#1}%
+ \ifx\desoortpagina\empty \else
+ \@EA\doglobal\@EA\addtocommalist\@EA{\desoortpagina}\currentpageselection
+ \ifselectingpages
+ \fullexpandtwoargsafter\doifcommon\desoortpagina\pageselection
+ {\global\pageselectedtrue}%
+ \fi
+ \gdef\beforeshipout{\dobeforeshipout}%
+ \gdef\aftershipout {\doaftershipout}%
+ \fi}
+
+\def\pagetype
+ {\dosingleargument\dopagetype}
+
+\def\docouplepage[#1][#2]%
+ {\getparameters
+ [\??pg]
+ [\c!before=,
+ \c!after=,
+ \c!option=,
+ #2]%
+ \def\docommand##1%
+ {\getparameters
+ [\??pg##1]
+ [\c!before=\@@pgbefore,
+ \c!after=\@@pgafter,
+ \c!option=\@@pgoption]}%
+ \processcommalist[#1]\docommand}%
+
+\def\couplepage
+ {\dodoubleargument\docouplepage}
+
+\def\doprocesspage[#1][#2]%
+ {\processaction
+ [#2]
+ [\v!yes=>\global\processingpagestrue,
+ \v!no=>\global\processingpagesfalse]%
+ \gdef\pageselection{#1}%
+ \global\selectingpagestrue
+ \global\pageselectedfalse}
+
+\def\processpage
+ {\dodoubleargument\doprocesspage}
+
+\def\resetselectiepagina
+ {\ifselectingpages
+ \doifbothsidesoverruled{\global\pageselectedfalse}{}{\global\pageselectedfalse}%
+ \fi}
+
+\newif\ifregistertextareas
+\newif\iftracetextareas
+
+\newbox\registertextbox
+
+% \def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box
+% {\hbox{\box#3}}
+
+\def\enabletextarearegistration{\global\registertextareastrue}
+
+\def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box
+ {\hbox\bgroup
+ \ifregistertextareas \ifx\registerMPtextarea\undefined \else
+ \setbox\registertextbox\null
+ \wd\registertextbox\wd#3%
+ \ht\registertextbox\ht#3%
+ \dp\registertextbox\dp#3%
+ \ifcase#1\or % 1
+ \setbox\registertextbox\hbox{\lower\strutdp\box\registertextbox}%
+ \fi
+ \ifcase#2\or % 1
+ \setbox\registertextbox\hbox{\raise\topskip\hbox{\lower\strutht\box\registertextbox}}%
+ \dp\registertextbox\strutdp
+ \fi
+ \dp\registertextbox\strutdp % needed
+ %\setbox\registertextbox\hbox
+ % {\iftracetextareas\gray\boxrulewidth2pt\ruledhbox\fi
+ % {\registerMPtextarea{\box\registertextbox}}}%
+ \setbox\registertextbox\hbox
+ {\registerMPtextarea{\box\registertextbox}}%
+ \smashbox\registertextbox
+ \box\registertextbox
+ \fi \fi
+ \box#3%
+ \egroup}
+
+%D \macros
+%D {setupoppositeplacing,startopposite}
+%D
+%D \starttyping
+%D \starttext
+%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test
+%D test \startopposite \blackrule[width=3cm,height=4cm] \stopopposite test
+%D \stoptext
+%D \stoptyping
+
+% Moved from page-mar.tex, made english, cleaned up, but still to be
+% redesigned
+
+\newbox\facingpage
+
+\unexpanded\def\setupoppositeplacing
+ {\dodoubleargument\getparameters[\??np]}
+
+\unexpanded\def\startopposite
+ {\dowithnextboxcontent
+ {\hsize\makeupwidth}%
+ {\global\setbox\facingpage\vbox
+ {\ifvoid\facingpage
+ \@@npbefore
+ \else
+ \@@npinbetween
+ \unvbox\facingpage
+ \fi
+ \box\nextbox}}%
+ \vbox\bgroup}
+
+\unexpanded\def\stopopposite
+ {\egroup}
+
+\def\finishfacingpage
+ {\ifvoid\facingpage\else
+ \global\setbox\facingpage\vbox to \makeupheight
+ {\unvbox\facingpage
+ \@@npafter
+ \vss}%
+ \fi}
+
+\def\shipoutfacingpage
+ {\doif\@@npstate\v!start
+ {\ifvoid\facingpage\else
+ \ifnum\realpageno>\plusone
+ \bgroup
+ \chardef\pageornamentstate\plusone
+ \finishfacingpage
+ \myshipout{\buildpagebody\box\facingpage}%
+ \egroup
+ \else
+ \global\setbox\facingpage\emptybox
+ \fi
+ \fi}}
+
+\setupoppositeplacing
+ [\c!state=\v!start,
+ \c!before=,
+ \c!inbetween=\blank,
+ \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/page-ins.mkii b/tex/context/base/page-ins.mkii
new file mode 100644
index 000000000..069153434
--- /dev/null
+++ b/tex/context/base/page-ins.mkii
@@ -0,0 +1,103 @@
+%D \module
+%D [ file=core-ins,
+%D version=2002.04.16,
+%D title=\CONTEXT\ Insertion Macros,
+%D subtitle=Insertions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Insertions}
+
+%D Insertions are special data collections that are associated
+%D to \TEX's internal page builder. When multiple footnote
+%D classes were introduced, I decided to isolate some of the
+%D functionality in a module.
+
+\unprotect
+
+\newtoks\@@insertionlist
+
+\def\processinsertions{\the\@@insertionlist}
+
+\let\doprocessinsert\gobbleoneargument
+
+%\def\installinsertion#1%
+% {\ifx#1\undefined
+% \newinsert#1%
+% \count#1\plusthousand
+% \skip #1\zeropoint
+% \dimen#1\maxdimen
+% \appendtoks\doprocessinsert#1\to\@@insertionlist
+% \fi}
+
+\def\installinsertion#1%
+ {\ifx#1\undefined
+ \let#1\relax
+ \fi
+ \ifx#1\relax % permits \csname...\endcsname
+ \newinsert#1%
+ \count#1\plusthousand
+ \skip #1\zeropoint
+ \dimen#1\maxdimen
+ \appendtoks\doprocessinsert#1\to\@@insertionlist
+ \fi}
+
+
+\def\synchronizeinsertions
+ {\def\doprocessinsert##1{\ifvoid##1\else\insert##1{\unvbox##1}\fi}%
+ \processinsertions}
+
+%D For instance, when we postpone footnotes, we need to save
+%D some data related to the inserts. The next methods are
+%D far from ideal, but better than nothing. We save and
+%D restore box content and associated data independently.
+%D The box content is only restores when non||void.
+
+\def\backupinsertion#1%
+ {\csname\string#1\endcsname}
+
+\def\installbackupinsertion#1%
+ {\expandafter\newinsert\csname\string#1\endcsname
+ \count\backupinsertion#1\zerocount
+ \skip \backupinsertion#1\zeropoint
+ \dimen\backupinsertion#1\maxdimen}
+
+\def\saveinsertionbox#1%
+ {\ifdim\ht#1>\zeropoint % hm, actually unknown
+ \global\setbox\backupinsertion#1\box#1%
+ \else
+ \global\setbox\backupinsertion#1\emptybox
+ \fi}
+
+\def\restoreinsertionbox#1%
+ {\ifvoid\backupinsertion#1\else % if void, we keep the content
+ \global\setbox#1\box\backupinsertion#1%
+ \fi}
+
+\def\eraseinsertionbackup#1%
+ {\global\setbox\backupinsertion#1\emptybox}
+
+\def\saveinsertiondata#1%
+ {\global\skip \backupinsertion#1\skip #1%
+ \global\count\backupinsertion#1\count#1%
+ \global\dimen\backupinsertion#1\dimen#1}
+
+\def\restoreinsertiondata#1%
+ {\global\skip #1\skip \backupinsertion#1%
+ \global\count#1\count\backupinsertion#1%
+ \global\dimen#1\dimen\backupinsertion#1}
+
+%D Auxiliary macros:
+
+\def\addinsertionheight#1\to#2%
+ {\ifvoid#1\else
+ \advance#2 1\skip#1\relax
+ \advance#2 \ht #1\relax
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-ins.mkiv b/tex/context/base/page-ins.mkiv
new file mode 100644
index 000000000..3e12bfcf0
--- /dev/null
+++ b/tex/context/base/page-ins.mkiv
@@ -0,0 +1,94 @@
+%D \module
+%D [ file=core-ins,
+%D version=2002.04.16,
+%D title=\CONTEXT\ Insertion Macros,
+%D subtitle=Insertions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Insertions}
+
+%D Insertions are special data collections that are associated
+%D to \TEX's internal page builder. When multiple footnote
+%D classes were introduced, I decided to isolate some of the
+%D functionality in a module.
+
+\unprotect
+
+\newtoks\@@insertionlist
+
+\def\processinsertions{\the\@@insertionlist}
+
+\let\doprocessinsert\gobbleoneargument
+
+\def\installinsertion#1%
+ {\ifdefined#1\else
+ \let#1\relax
+ \fi
+ \ifx#1\relax % permits \csname...\endcsname
+ \newinsert#1%
+ \count#1\plusthousand
+ \skip #1\zeropoint
+ \dimen#1\maxdimen
+ \appendtoks\doprocessinsert#1\to\@@insertionlist
+ \fi}
+
+
+\def\synchronizeinsertions
+ {\def\doprocessinsert##1{\ifvoid##1\else\insert##1{\unvbox##1}\fi}%
+ \processinsertions}
+
+%D For instance, when we postpone footnotes, we need to save
+%D some data related to the inserts. The next methods are
+%D far from ideal, but better than nothing. We save and
+%D restore box content and associated data independently.
+%D The box content is only restores when non||void.
+
+\def\backupinsertion#1%
+ {\csname\string#1\endcsname}
+
+\def\installbackupinsertion#1%
+ {\expandafter\newinsert\csname\string#1\endcsname
+ \count\backupinsertion#1\zerocount
+ \skip \backupinsertion#1\zeropoint
+ \dimen\backupinsertion#1\maxdimen}
+
+\def\saveinsertionbox#1%
+ {\ifdim\ht#1>\zeropoint % hm, actually unknown
+ \global\setbox\backupinsertion#1\box#1%
+ \else
+ \global\setbox\backupinsertion#1\emptybox
+ \fi}
+
+\def\restoreinsertionbox#1%
+ {\ifvoid\backupinsertion#1\else % if void, we keep the content
+ \global\setbox#1\box\backupinsertion#1%
+ \fi}
+
+\def\eraseinsertionbackup#1%
+ {\global\setbox\backupinsertion#1\emptybox}
+
+\def\saveinsertiondata#1%
+ {\global\skip \backupinsertion#1\skip #1%
+ \global\count\backupinsertion#1\count#1%
+ \global\dimen\backupinsertion#1\dimen#1}
+
+\def\restoreinsertiondata#1%
+ {\global\skip #1\skip \backupinsertion#1%
+ \global\count#1\count\backupinsertion#1%
+ \global\dimen#1\dimen\backupinsertion#1}
+
+%D Auxiliary macros:
+
+\def\addinsertionheight#1\to#2%
+ {\ifvoid#1\else
+ \advance#2 1\skip#1\relax
+ \advance#2 \ht #1\relax
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-lay.mkii b/tex/context/base/page-lay.mkii
new file mode 100644
index 000000000..de1194c2a
--- /dev/null
+++ b/tex/context/base/page-lay.mkii
@@ -0,0 +1,1429 @@
+%D \module
+%D [ file=page-lay,
+%D version=2000.10.20, % copied from main-001
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Layout Specification,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Layout Specification}
+
+%D This module is now etex dependent.
+
+% to be translated into english
+
+% hoofdhoogte wordt bij status=hoog niet aangepast op outer
+% level, wel binnen bepaalde berekeningen
+
+%D Before you start wondering why some of the page related
+%D modules skip upward or left in order to place elements, you
+%D must realize that the reference point is the top left
+%D corner of the main typesetting area. One reason for this
+%D choice is that it suited some viewers that displayed page
+%D areas. Another reason is that margins, edges and top and
+%D bottom areas are kind of virtual, while the header, text
+%D and footer areas normally determine the text flow.
+
+\unprotect
+
+%D First we get rid of the funny \TEX\ offset defaults of one
+%D inch by setting them to zero.
+
+\voffset = 0pt % setting this to -1in let's go metapost crazy
+\hoffset = 0pt % setting this to -1in let's go metapost crazy
+
+%D The dimensions related to layout areas are represented by
+%D real dimensions.
+
+\newdimen\paperheight \paperheight = 297mm
+\newdimen\paperwidth \paperwidth = 210mm
+
+\newdimen\printpaperheight \printpaperheight = \paperheight
+\newdimen\printpaperwidth \printpaperwidth = \paperwidth
+
+\newdimen\makeupheight % calculated
+\newdimen\makeupwidth % calculated
+
+\newdimen\textheight % calculated
+\newdimen\textwidth % calculated
+
+\newdimen\topspace \topspace = 2cm
+\newdimen\backspace \backspace = \topspace
+\newdimen\cutspace \cutspace = 0pt
+\newdimen\bottomspace \bottomspace = 0pt
+
+\newdimen\headerheight \headerheight = 2cm
+\newdimen\footerheight \footerheight = \headerheight
+
+\newdimen\topoffset \topoffset = 0pt
+\newdimen\backoffset \backoffset = \topoffset
+
+\newdimen\leftmarginwidth \leftmarginwidth = 3cm
+\newdimen\rightmarginwidth \rightmarginwidth = \leftmarginwidth
+
+\newdimen\leftedgewidth \leftedgewidth = 3cm
+\newdimen\rightedgewidth \rightedgewidth = \leftedgewidth
+
+\newdimen\topheight \topheight = 0cm
+\newdimen\bottomheight \bottomheight = \topheight
+
+\newcount\layoutlines \layoutlines = 0
+\newcount\layoutcolumns \layoutcolumns = 0
+\newdimen\layoutcolumndistance \layoutcolumndistance = 0pt
+\newdimen\layoutcolumnwidth \layoutcolumnwidth = 0pt
+
+%D We can save some tokens and fuzzy parameters by using a
+%D symbolic name for the current set of layout parameters.
+
+\let\currentlayout\empty
+
+\def\layoutparameter#1%
+ {\csname\??ly\ifcsname
+ \??ly\currentlayout#1\endcsname\currentlayout
+ \fi#1\endcsname}
+
+\def\namedlayoutparameter#1#2%
+ {\csname\??ly\ifcsname\??ly #1#2\endcsname#1\else
+ \ifcsname\??ly\currentlayout#2\endcsname\currentlayout
+ \fi\fi#2\endcsname}
+
+%D Beause normal \TEX\ has at most 256 dimensions (of which a
+%D substantial part is already in use), we provide a way to
+%D generate a format with macro based alternatives. For a long
+%D time, this used to be the default case. Beware: only fixed
+%D dimensions can be used in calculations! By the way, the
+%D gain in speed can hardly be called impressive and is roughly
+%D 1 second on a 35 second run of 850 empty pages with a
+%D couple of backgrounds only (which is far less than one
+%D percent on a normal document).
+
+%D The next series of dimensions are complemented by left
+%D and rights ones.
+
+\newdimen \margindistance
+\newdimen \edgedistance
+\newdimen \marginwidth
+\newdimen \edgewidth
+
+%D Because a distance does not really makes sense when there
+%D is no area, we use a zero distance in case there is no
+%D area.
+
+\def\layoutdistance#1#2%
+ {\ifdim\zeropoint<#1\layoutparameter#2\else\zeropoint\fi}
+
+%D The horizontal distances are:
+
+\newdimen \leftedgedistance
+\newdimen \rightedgedistance
+\newdimen \leftmargindistance
+\newdimen \rightmargindistance
+
+%D The vertical distances are:
+
+\newdimen \topdistance
+\newdimen \headerdistance
+\newdimen \footerdistance
+\newdimen \bottomdistance
+
+%D We need to calculate the extra distances:
+
+\def\setlayoutdimensions
+ {\global\marginwidth \layoutparameter\c!margin
+ \global\edgewidth \layoutparameter\c!edge
+ \global\margindistance \layoutparameter\c!margindistance
+ \global\edgedistance \layoutparameter\c!edgedistance
+ \global\leftedgedistance \layoutdistance \leftedgewidth \c!leftedgedistance
+ \global\rightedgedistance \layoutdistance \rightedgewidth \c!rightedgedistance
+ \global\leftmargindistance \layoutdistance \leftmarginwidth \c!leftmargindistance
+ \global\rightmargindistance\layoutdistance \rightmarginwidth \c!rightmargindistance
+ \global\topdistance \layoutdistance \topheight \c!topdistance
+ \global\headerdistance \layoutdistance \headerheight \c!headerdistance
+ \global\footerdistance \layoutdistance \footerheight \c!footerdistance
+ \global\bottomdistance \layoutdistance \bottomheight \c!bottomdistance}
+
+\def\setlayoutdistances % local in \setreducedvsize
+ {\headerdistance\layoutdistance\headerheight\c!headerdistance
+ \footerdistance\layoutdistance\footerheight\c!footerdistance}
+
+% these are wrong in the running text, assumes some swapping, needs a cleanup
+
+\def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth }
+\def\innermarginwidth {\rightorleftpageaction\leftmarginwidth \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth {\rightorleftpageaction\rightedgewidth \leftedgewidth }
+\def\inneredgewidth {\rightorleftpageaction\leftedgewidth \rightedgewidth}
+\def\outeredgedistance {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth {\rightorleftpageaction\cutspace\backspace}
+\def\innerspacewidth {\rightorleftpageaction\backspace\cutspace}
+
+\newtoks\extralayoutcalculations \def\calculatelayoutextras{\the\extralayoutcalculations}
+
+% \appendtoks
+% non etex calculations used to go here
+% \to \extralayoutcalculations
+
+\newtoks\everyswapmargins % watch the order !
+
+\appendtoks
+ \swapdimens\leftmargindistance\rightmargindistance
+ \swapdimens\leftedgedistance \rightedgedistance
+ \swapdimens\leftmarginwidth \rightmarginwidth
+ \swapdimens\leftedgewidth \rightedgewidth
+\to \everyswapmargins
+
+\appendtoks
+ \swapmacros\leftmargintotal \rightmargintotal
+ \swapmacros\leftedgetotal \rightedgetotal
+ \swapmacros\leftsidetotal \rightsidetotal
+ \swapmacros\leftcombitotal \rightcombitotal
+ \swapmacros\innermargintotal\outermargintotal
+ \swapmacros\inneredgetotal \outeredgetotal
+ \swapmacros\innercombitotal \outercombitotal
+ \swapmacros\innersidetotal \outersidetotal
+\to \everyswapmargins
+
+%D \macros
+%D {definepapersize}
+%D
+%D Before we start calculating layout dimensions, we will
+%D first take care of paper sizes. The first argument can be
+%D either an assignment (for defaults) or an identifier, in
+%D which case the second argument is an assignment.
+%D
+%D \showsetup{definepapersize}
+
+\def\definepapersize
+ {\dodoubleempty\dodefinepapersize}
+
+\def\definepapersize
+ {\dotripleempty\dodefinepapersize}
+
+\def\dodefinepapersize[#1][#2][#3]%
+ {\ifsecondargument
+ \doifsomething{#1} % to be sure
+ {\doifassignmentelse{#2}
+ {\getparameters
+ [\??pp#1] % geen \c!scale, scheelt hash ruimte
+ [\c!width=\@@ppwidth,\c!height=\@@ppheight,\c!offset=\@@ppoffset,#2]}
+ {\setvalue{\??pp:1:#1}{#2}%
+ \setvalue{\??pp:2:#1}{#3}}}%
+ \else
+ \getparameters[\??pp][#1]%
+ \setuppapersize % hm. this will freeze !
+ \fi}
+
+%D For the moment we need to fake this macro.
+
+\ifx\setuppapersize\undefined
+ \let\setuppapersize\relax
+\fi
+
+%D We set the defaults to the dimensions of an A4 sheet of
+%D paper.
+
+\definepapersize
+ [\c!width=210mm,\c!height=297mm,\c!offset=\!!zeropoint]
+
+%D Yet undocumented, let's see if it gets noticed.
+%D
+%D \starttyping
+%D \definepapersize[main] [A4] [A4]
+%D \definepapersize[extra][A4,landscape][A4,landscape]
+%D
+%D \starttext
+%D \setuppapersize[main]
+%D Page 1. \page
+%D Page 2. \page
+%D \setuppapersize[extra]
+%D Page 2 \page
+%D \setuppapersize[main]
+%D Page 3. \page
+%D Page 4. \page
+%D \adaptpapersize[extra]
+%D Page 5. \page
+%D Page 6. \page
+%D \stoptext
+%D \stoptyping
+
+%D \macros
+%D {setuppaper,setuppapersize}
+%D
+%D When setting up the papersize on which to typeset and
+%D print, we can also determine some more characteristics.
+%D
+%D \showsetup{setuppapersize}
+%D
+%D We keep track of these features with the following
+%D variables.
+
+\chardef\papermirror =0 \chardef\printmirror =0
+\chardef\paperorientation=0 \chardef\printorientation=0 % beware: later no chardef
+\chardef\paperreverse =0 \chardef\printreverse =0
+\chardef\paperlandscape =0 \chardef\printlandscape =0
+
+\let\papersize\empty \let\printpapersize\empty
+
+\def\paperscale{1} \newif\ifnegateprintbox
+
+\def\setuppaper[#1]%
+ {\getparameters[\??pp][\c!paper=,\c!page=,#1]%
+ \edef\@@ppxy{\the\numexpr\@@ppnx*\@@ppny\relax}%
+ \doifelsenothing\@@pppage
+ {\doifelsenothing\@@pppaper
+ {} % {\setuppapersize} % added, removed, no need for, too tricky, mag-01 (fixed by freezing pp's)
+ {\dodosetuppapersize[\papersize][\@@pppaper]}}
+ {\doifelsenothing\@@pppaper
+ {\dodosetuppapersize[\@@pppage][\printpapersize]}
+ {\dodosetuppapersize[\@@pppage][\@@pppaper]}}}
+
+\def\setuppapersize
+ {\dodoubleempty\dosetuppapersize}
+
+\def\dosetuppapersize[#1][#2]%
+ {\doifassignmentelse{#1}
+ {\setuppaper[#1]}
+ {\doifelsenothing{#2}
+ {\expanded{\dodosetuppapersize
+ [\executeifdefined{\??pp:1:#1}{#1}]%
+ [\executeifdefined{\??pp:2:#1}{}]}}
+ {\doifassignmentelse{#2}
+ {\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]}
+ {\expanded{\dodosetuppapersize
+ [\executeifdefined{\??pp:1:#1}{#1}]%
+ [\executeifdefined{\??pp:1:#2}{#2}]}}}}}
+
+\let\reinstatepapersize\relax
+
+\def\adaptpapersize
+ {\global\let\reinstatepapersize\restorepapersize
+ \setuppapersize}
+
+\appendtoks
+ \reinstatepapersize
+ \global\let\reinstatepapersize\relax
+\to \everyaftershipout
+
+\def\dodosetuppapersize[#1][#2]%
+ {\ifsecondargument
+ \expanded{\dododosetuppapersize[#1][#2]}%
+ \calculatehsizes
+ \calculatevsizes
+ \recalculatelogos
+ \recalculatebackgrounds
+ \recalculatelayout
+ \else\iffirstargument
+ \setuppapersize[#1][#2]%
+ \else\ifx\papersize\undefined\else
+ \restorepapersize
+ \fi\fi\fi}
+
+% dimen freeze is a bit tricky, but catches local redundant calls
+% with values where e.g width is defined in terms of \paperwidth
+
+\def\dododosetuppapersize[#1][#2]%
+ {\xdef\restorepapersize{\noexpand\setuppapersize[#1][#2]}%
+ \dosetuppaperorientation{#1}\paperlandscape\paperorientation\paperreverse\papermirror
+ \dosetuppaperorientation{#2}\printlandscape\printorientation\printreverse\printmirror
+ \def\docommand##1%
+ {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+ {\global\paperwidth \getvalue{\??pp##1\c!width}%
+ \global\paperheight\getvalue{\??pp##1\c!height}%
+\ifinpagebody
+ \setevalue{\??pp##1\c!height}{\the\paperheight}%
+ \setevalue{\??pp##1\c!width }{\the\paperwidth }%
+\fi
+ \calculatepaperoffsets{##1}%
+ \xdef\papersize{##1}}}}%
+ \processcommacommand[#1]\docommand
+ \doifdefinedelse{\??pp#1\c!scale}
+ {\edef\paperscale{\getvalue{\??pp#1\c!scale}}}
+ {\edef\paperscale{1}}%
+ \def\docommand##1%
+ {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+ {\global\printpaperwidth \getvalue{\??pp##1\c!width}%
+ \global\printpaperheight\getvalue{\??pp##1\c!height}%
+\ifinpagebody
+ \setevalue{\??pp##1\c!height}{\the\printpaperheight}%
+ \setevalue{\??pp##1\c!width }{\the\printpaperwidth}%
+\fi
+ \xdef\printpapersize{##1}}}}%
+ \processcommacommand[#2]\docommand
+ \global\setdimentoatleast\paperwidth \onepoint
+ \global\setdimentoatleast\paperheight \onepoint
+ \global\setdimentoatleast\printpaperwidth \onepoint
+ \global\setdimentoatleast\printpaperheight\onepoint
+ \ifcase\paperlandscape\else
+ \doglobal\swapdimens\paperwidth\paperheight
+ \fi
+ \ifcase\printlandscape\else
+ \doglobal\swapdimens\printpaperwidth\printpaperheight
+ \fi
+ % this check can be confusing, so we've added the possibility
+ % to bypass this test: \setuppapersize[option=fit]
+ \doif\@@ppoption\v!max % \v!fit is
+ {\bgroup
+ % we need to pre-swap else we get the wrong paper size
+ \ifcase\paperorientation\else
+ \doifinset\paperorientation{90,270}{\swapdimens\paperwidth\paperheight}%
+ \fi
+ \ifcase\printorientation\else
+ \doifinset\printorientation{90,270}{\swapdimens\printpaperwidth\printpaperheight}%
+ \fi
+ \ifdim\paperheight>\printpaperheight
+ \global\printpaperheight\paperheight
+ \writestatus\m!systems{print height forced to paper height}%
+ \fi
+ \ifdim\paperwidth>\printpaperwidth
+ \global\printpaperwidth\paperwidth
+ \writestatus\m!systems{print width forced to paper width}%
+ \fi
+ \egroup}}
+
+\def\dosetuppaperorientation#1#2#3#4#5%
+ {\global\chardef#2\zerocount
+ \global\chardef#5\zerocount
+ \globallet#3\!!zerocount
+ \globallet#4\!!zerocount
+ \global\negateprintboxfalse
+ \processallactionsinset
+ [#1]
+ [ \v!landscape=>\global\chardef#2\plusone,
+ \v!mirrored=>\global\chardef#5\plusone,
+ \v!rotated=>\gdef#3{90}\gdef#4{270},
+ \v!negative=>\global\negateprintboxtrue,
+ 90=>\gdef#3{90}\gdef#4{270},
+ 180=>\gdef#3{180}\gdef#4{0},
+ 270=>\gdef#3{270}\gdef#4{90}]}
+
+\ifx\calculatepaperoffsets\undefined
+
+ \def\calculatepaperoffsets#1%
+ {\scratchdimen\getvalue{\??pp#1\c!offset}%
+ \global\advance\paperwidth -2\scratchdimen
+ \global\advance\paperheight-2\scratchdimen}
+
+\fi
+
+\let\restorepapersize\relax
+
+\def\checkforems[#1]%
+ {\def\docommand##1%
+ {\beforesplitstring##1\at em\to\asciia
+ \doifnot\asciia{##1}
+ {\aftersplitstring\asciia\at=\to\asciia
+ \doifsomething\asciia
+ {\showmessage\m!systems{10}{##1}}}}%
+ \processcommalist[#1]\docommand}
+
+\ifx\setups\undefined \def\setups[#1]{\setdefaultpenalties} \fi
+
+% \newtoks \everybeforelayout \relax
+% \newtoks \everyafterlayout \relax
+
+\def\recalculatelayout
+ {\doifsomething{\layoutparameter\c!page\layoutparameter\c!paper}
+ {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}%
+ \dorecalculatelayout}
+
+\def\dorecalculatelayout
+ {%\the\everybeforelayout
+ \setups[\layoutparameter\c!preset]%
+ \global\leftmarginwidth \layoutparameter\c!leftmargin
+ \global\rightmarginwidth\layoutparameter\c!rightmargin
+ \global\leftedgewidth \layoutparameter\c!leftedge
+ \global\rightedgewidth \layoutparameter\c!rightedge
+ \global\headerheight \layoutparameter\c!header
+ \global\footerheight \layoutparameter\c!footer
+ \global\bottomheight \layoutparameter\c!bottom
+ \global\topheight \layoutparameter\c!top
+ \global\backspace \layoutparameter\c!backspace
+ \global\topspace \layoutparameter\c!topspace
+ \setlayoutdimensions % the rest of the `dimensions'
+ \doifelse\@@lygrid\v!yes\gridsnappingtrue\gridsnappingfalse
+ \ifgridsnapping
+ \setsystemmode\v!grid
+ \else
+ \resetsystemmode\v!grid
+ \fi
+ \setups[\layoutparameter\c!setups]% depends on gridsnapping !
+ \simplesetupwhitespace
+ \simplesetupblank
+ \global\cutspace\layoutparameter\c!cutspace
+ \relax
+ \doifelse{\layoutparameter\c!width}\v!middle
+ {\ifdim\cutspace=\zeropoint
+ \global\cutspace\backspace
+ \fi
+ \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax}
+ {\doifelse{\layoutparameter\c!width}\v!fit
+ {\ifdim\cutspace=\zeropoint
+ \global\cutspace\backspace
+ \fi
+ \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax
+ \scratchdimen\dimexpr\backspace
+ -\leftedgewidth -\leftedgedistance
+ -\leftmarginwidth-\leftmargindistance\relax
+ \ifdim\scratchdimen<\zeropoint
+ \scratchdimen\zeropoint
+ \fi
+ \global\advance\makeupwidth\dimexpr
+ -\rightmargindistance-\rightmarginwidth
+ -\rightedgedistance -\rightedgewidth
+ -\scratchdimen\relax}
+ {\global\makeupwidth\layoutparameter\c!width\relax
+ \ifdim\cutspace=\zeropoint
+ \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax
+ % \else
+ % A kind of inconsistent specification, but used
+ % in for instance s-pre-19.tex; the cutspace is
+ % used only for determining some kind of right
+ % margin; don't use this in doublesided mode
+ \fi}}%
+ \scratchdimen\layoutparameter\c!bottomspace\relax
+ %\ifdim\scratchdimen=\zeropoint
+ % \scratchdimen\topspace
+ %\fi
+ \global\bottomspace\layoutparameter\c!bottomspace\relax
+ \global\layoutlines0\number\layoutparameter\c!lines\relax % may be empty
+ \ifcase\layoutlines
+ \doifelse{\layoutparameter\c!height}\v!middle
+ {\ifdim\bottomspace=\zeropoint
+ \global\bottomspace\topspace
+ \fi
+ \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax}
+ {\doifelse{\layoutparameter\c!height}\v!fit
+ {\ifdim\bottomspace=\zeropoint
+ \global\bottomspace\topspace
+ \fi
+ \global\makeupheight\dimexpr\paperheight-\bottomspace\relax
+ \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax
+ \ifdim\scratchdimen<\zeropoint
+ \scratchdimen\zeropoint
+ \fi
+ \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax}
+ {\global\makeupheight\layoutparameter\c!height\relax
+ \ifdim\bottomspace=\zeropoint
+ \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax
+ \else
+ % inconsistent specification
+ \fi}}%
+ \else
+ % beware, when the bodyfont changes (switched) this will change as well; implementing
+ % a global lineheight is tricky: should we take the bodyfont interlinespace or the one set
+ % independent of the bodyfont (before or after a layout spec); way too fuzzy, so we
+ % stick to the current method (after a night of experimenting ...2003/10/13)
+ \global\makeupheight\dimexpr
+ \layoutparameter\c!lines\lineheight-\strutheight+\topskip+
+ \headerdistance+\headerheight+\footerdistance+\footerheight\relax
+ \fi
+ \backoffset\layoutparameter\c!horoffset
+ \topoffset \layoutparameter\c!veroffset
+ \global\setdimentoatleast\makeupwidth\onepoint
+ \global\setdimentoatleast\makeupheight \onepoint
+ % \checkcurrentlayout % here ?
+ % \the\everyafterlayout
+ \calculatelayoutextras
+ \calculatehsizes
+ \calculatevsizes
+ \calculatepseudocolumns
+ \checkgridsnapping
+ \recalculatelogos
+ \recalculatebackgrounds}
+
+\def\calculatepseudocolumns
+ {\global\layoutcolumns\layoutparameter\c!columns
+ \global\layoutcolumndistance\layoutparameter\c!columndistance
+ \global\layoutcolumnwidth\dimexpr\makeupwidth-\layoutcolumns\layoutcolumndistance+\layoutcolumndistance\relax
+ \global\divide\layoutcolumnwidth\layoutcolumns
+ \dorecurse\layoutcolumns
+ {\setxvalue{\??ly:c:\recurselevel}%
+ {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}}}
+
+%\dorecurse\layoutcolumns
+% {\setxvalue{\??ly:c:\recurselevel}{\the\dimexpr
+% (\numexpr(\recurselevel-1)\dimexpr(\layoutcolumnwidth+\layoutcolumndistance))}}
+
+\def\layoutcolumnoffset#1%
+ {\executeifdefined{\??ly:c:#1}\!!zeropoint}
+
+\def\checklayout
+ {\ifdim\makeupheight=\layoutlines\lineheight \else \recalculatelayout \fi}
+
+\appendtoks \checklayout \to \everystarttext
+
+% document:
+%
+% \setuplayout[odd][state=stop] \setuplayout[even][state=stop] \setuplayout[page]
+%
+% \startstandardmakeup[page=blank] ... \stopstandardmakeup
+
+\def\changetolayout#1%
+ {%\writestatus\m!layouts{changing to layout #1}%
+ \xdef\currentlayout{#1}\recalculatelayout}
+
+\def\checkcurrentoddlayout
+ {\ifcsname\??ly\v!odd\c!state\endcsname
+ \doifvalue{\??ly\v!odd\c!state}\v!start{\changetolayout\v!odd}%
+ \fi}
+
+\def\checkcurrentevenlayout
+ {\ifcsname\??ly\v!even\c!state\endcsname
+ \doifvalue{\??ly\v!even\c!state}\v!start{\changetolayout\v!even}%
+ \fi}
+
+\ifx\lastpage\undefined \def\lastpage{1} \fi
+
+\def\reverserealfolio
+ {\ifnum\lastpage>\plusone
+ \ifnum\lastpage=\realfolio
+ \v!last
+ \else\ifnum\plusone=\realfolio
+ \v!first
+ \else
+ \the\numexpr\realfolio-\lastpage\relax
+ \fi\fi
+ \else
+ \!!zerocount
+ \fi}
+
+\def\checkcurrentlayout % public and used in naw, so keep this name
+ {\ifcsname\??ly\realfolio\c!state\endcsname
+ \doifvalue{\??ly\realfolio\c!state}\v!start{\changetolayout\realfolio}%
+ \else\ifcsname\??ly\reverserealfolio\c!state\endcsname
+ \doifvalue{\??ly\reverserealfolio\c!state}\v!start{\changetolayout\reverserealfolio}%
+ \else\ifcsname\??ly\v!current\c!state\endcsname
+ \changetolayout\v!current % no start test ?
+ \else
+ \doifoddpageelse\checkcurrentoddlayout\checkcurrentevenlayout
+ \fi\fi\fi}
+
+% testcase
+%
+% \setuppagenumbering[alternative=doublesided]
+%
+% \setuplayout [width=11cm]
+% \definelayout [odd] [backspace=1cm]
+% \definelayout [even] [backspace=4cm]
+% \definelayout [5] [backspace=5cm]
+% \definelayout [6] [backspace=5cm]
+% \definelayout [-2] [backspace=0cm,cutspace=0cm]
+% \definelayout [last] [backspace=0cm,cutspace=0cm]
+%
+% \checkcurrentlayout \showframe
+%
+% \starttext
+% \dorecurse{20} {\input knuth \endgraf \input tufte \endgraf}
+% \stoptext
+
+%appendtoks \checkcurrentlayout \to \everyaftershipout % no
+\appendtoks \checkcurrentlayout \to \everystarttext
+
+\appendtoks
+ \dochecknextlayout
+\to \everyaftershipout
+
+% \def\dochecknextlayout
+% {\ifx\currentlayout\v!current
+% % prevent redundant calculations
+% \else
+% \globallet\currentlayout\empty
+% \global\letbeundefined{\??ly\v!current\c!state}%
+% \checkcurrentlayout
+% \fi}
+%
+% this breaks after a standardmakeup
+
+\def\dochecknextlayout{\checkcurrentlayout}
+
+\newif\ifdoublesidedprint
+
+\def\presetcenterpagebox % in \setuplayout !!!!!!!!!!!!!!!!
+ {\doublesidedprintfalse
+ \ExpandFirstAfter\processallactionsinset
+ [\@@lylocation]
+ [ \v!middle=>{\setuppapersize[\c!left=\hss,\c!right=\hss,\c!top=\vss,\c!bottom=\vss]},
+ \v!left=>{\setuppapersize[\c!left=,\c!right=\hss]},
+ \v!right=>{\setuppapersize[\c!left=\hss,\c!right=]},
+ \v!bottom=>{\setuppapersize[\c!top=\vss,\c!bottom=]},
+ \v!top=>{\setuppapersize[\c!top=,\c!bottom=\vss]},%
+ \v!doublesided=>\doublesidedprinttrue,
+ \v!singlesided=>\doublesidedprintfalse]}
+
+\def\definelayout
+ {\dodoubleargument\dodefinelayout}
+
+\def\dodefinelayout[#1][#2]%
+ {\getparameters[\??ly#1][\c!state=\v!start,#2]}
+
+\def\dodosetuplayout[#1][#2]%
+ {\ConvertToConstant\doifnot{#2}\v!reset % #2 ?
+ {\getparameters[\??ly#1][#2]%
+ \checkforems[#2]}}
+
+% global needed for non-doublesided standardmakeup
+
+\def\dosetuplayout[#1][#2]%
+ {\globallet\currentlayout\empty % new, global
+ \ifsecondargument
+ \dodosetuplayout[#1][#2]%
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\dodosetuplayout[][#1]}
+ {\doifnot{#1}\v!reset{\xdef\currentlayout{#1}}}% new, global
+ \fi\fi
+ \recalculatelayout
+ \checkcurrentlayout % here ?
+ \presetcenterpagebox}
+
+\def\setuplayout
+ {\dodoubleempty\dosetuplayout}
+
+\let\@@zaheight=\!!zeropoint
+
+\def\dopushpagedimensions
+ {\xdef\oldtextheight {\the\textheight }%
+ \xdef\oldfooterheight{\the\footerheight}%
+ \global\let\@@zaheight\@@zaheight}
+
+\def\dopoppagedimensions
+ {\global\textheight \oldtextheight
+ \global\footerheight\oldfooterheight
+ \recalculatelayout
+ \global\let\pushpagedimensions\dopushpagedimensions
+ \global\let\poppagedimensions\relax}
+
+\let\poppagedimensions = \relax
+\let\pushpagedimensions = \dopushpagedimensions
+
+% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook
+% in een test met \doifdefined. Bij veel bladzijden kan dit
+% te veel macro's kosten. Vandaar de set \adaptedpages. Het
+% kost tijd, maar scheelt macro's.
+
+\let\adaptedpages\empty
+
+\def\adaptpagedimensions
+ {\ifx\adaptedpages\empty\else
+ \rawdoifinsetelse\realfolio\adaptedpages
+ {\getvalue{\??za\realfolio}%
+ \letbeundefined{\??za\realfolio}}
+ \donothing
+ \fi}
+
+\def\checkpagedimensions
+ {\poppagedimensions
+ \adaptpagedimensions}
+
+\def\reportpagedimensions
+ {\ifx\poppagedimensions\relax \else
+ \space\the\dimexpr\@@zaheight\relax\space-\space
+ \fi
+ \realfolio}
+
+\def\dodoadaptlayout[#1]%
+ {\getparameters[\??za][\c!height=,\c!lines=0,#1]%
+ \pushpagedimensions
+ \ifcase\@@zalines\relax
+ \showmessage\m!layouts1{\@@zaheight,\realfolio}%
+ \else
+ \showmessage\m!layouts1{\@@zalines\space\v!lines,\realfolio}%
+ \def\@@zaheight{\@@zalines\openlineheight}%
+ \fi
+ \doifelse\@@zaheight\v!max
+ {\balancedimensions\textheight\footerheight\footerheight}
+ {\balancedimensions\textheight\footerheight\@@zaheight}%
+ \ifdim\footerheight<\zeropoint
+ \global\advance\textheight \footerheight
+ \global\footerheight\zeropoint
+ \global\xdef\@@zaheight{\layoutparameter\c!footer\space(\v!max)}%
+ \fi
+ \setvsize
+ \global\pagegoal\vsize % nog corrigeren voor insertions ?
+ \recalculatelogos
+ \recalculatebackgrounds
+ \global\let\pushpagedimensions\relax
+ \global\let\poppagedimensions\dopoppagedimensions}
+
+\def\doadaptlayout[#1][#2]%
+ {\doifelsenothing{#2}
+ {\dodoadaptlayout[#1]}
+ {\def\docommand##1%
+ {\addtocommalist{##1}\adaptedpages
+ \setgvalue{\??za##1}{\dodoadaptlayout[#2]}}%
+ \processcommalist[#1]\docommand
+ \adaptpagedimensions}}
+
+\def\adaptlayout
+ {\dodoubleempty\doadaptlayout}
+
+% describe interface
+
+%D Centering the paper area on the print area is determined
+%D by the \type {top}, \type {bottom}, \type {left} and \type
+%D {right} parameters.
+
+\def\centerpagebox#1%
+ {\printpaperwidth \paperscale\printpaperwidth
+ \printpaperheight\paperscale\printpaperheight
+ \setbox#1\vbox to \printpaperheight
+ {\@@pptop
+ \hbox to \printpaperwidth
+ {\ifdoublesidedprint
+ \doifbothsides
+ {\@@ppleft \box#1\@@ppright}
+ {\@@ppleft \box#1\@@ppright}
+ {\@@ppright\box#1\@@ppleft }%
+ \else
+ \@@ppleft \box#1\@@ppright
+ \fi}%
+ \par
+ \@@ppbottom}}
+
+\def\offsetprintbox#1%
+ {\ifdim\topoffset=\zeropoint % \relax
+ \ifdim\backoffset=\zeropoint
+ \donefalse
+ \else
+ \donetrue
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+ \setbox#1\vbox
+ {%\forgetall
+ \offinterlineskip
+ \vskip\topoffset
+ \doifbothsides{\hskip\backoffset}{\hskip\backoffset}{\hskip-\backoffset}%
+ \box#1}%
+ \next
+ \fi}
+
+\def\replicatepagebox#1%
+ {\ifnum\@@lynx>\plusone
+ \donetrue
+ \else\ifnum\@@lyny>\plusone
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \setbox#1\vbox
+ {%\forgetall
+ \offinterlineskip
+ \dorecurse\@@lyny
+ {\hbox{\dorecurse\@@lynx{\copy#1\hskip\@@lydx}\unskip}%
+ \vskip\@@lydy}
+ \unskip}%
+ \fi}
+
+\def\orientpagebodybox#1#2#3%
+ {\ifnum#2#3>\zerocount
+ \setbox#1\vbox
+ {\edef\somerotation{\ifdoublesided\ifodd\realpageno#2\else#3\fi\else#2\fi}%
+ \dorotatebox\somerotation\hbox{\box#1}}%
+ \fi}
+
+\def\orientpaperbox#1%
+ {\orientpagebodybox{#1}\paperorientation\paperreverse}
+
+\def\orientprintbox#1%
+ {\orientpagebodybox{#1}\printorientation\printreverse}
+
+\def\mirrorpagebodybox#1#2%
+ {\ifcase#2\or
+ \setbox#1\vbox
+ {\domirrorbox\vbox{\box#1}}%
+ \fi}
+
+\def\mirrorpaperbox#1%
+ {\mirrorpagebodybox{#1}\papermirror}
+
+\def\mirrorprintbox#1%
+ {\mirrorpagebodybox{#1}\printmirror}
+
+\def\scalepagebox#1%
+ {\ifdim\@@lyscale\points=\onepoint \else
+ \setbox#1\vbox
+ {\scale[\c!sx=\@@lyscale,\c!sy=\@@lyscale]{\box#1}}%
+ \paperwidth\@@lyscale\paperwidth
+ \paperheight \@@lyscale\paperheight
+ \fi}
+
+\def\negateprintbox#1%
+ {\ifnegateprintbox
+ \negatecolorbox{#1}%
+ \fi}
+
+\def\pagecutmarksymbol {\the\realpageno}
+\def\pagecutmarklength {.5cm}
+\let\pagecutmarktoptext \empty
+\let\pagecutmarkbottomtext \empty
+
+\def\extrapagecutmarkbottomtext
+ {\rlap{\jobname}\hfill\currentdate\space-\space\currenttime\hfill\llap{\realfolio}}
+
+\def\makepagecutbox % #1
+ {\let\cutmarksymbol \pagecutmarksymbol
+ \let\cutmarklength \pagecutmarklength
+ \let\cutmarktoptext \pagecutmarktoptext
+ \let\cutmarkbottomtext\pagecutmarkbottomtext
+ \makecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!on}%
+ {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!page}% only at outer when nx/ny > 0
+ {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!empty}%
+ {\let\pagecutmarksymbol\empty
+ \let\pagecutmarktoptext\empty
+ \let\pagecutmarkbottomtext\empty
+ \makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!text}%
+ {\let\pagecutmarksymbol\empty
+ \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext
+ \makepagecutbox}
+
+\setvalue{\??ly:c:\c!marking:\v!color}%
+ {\doaddpagecolormarks\colormarkbox}
+
+\setvalue{\??ly:c:\c!marking:\v!screen}%
+ {\doaddpagecolormarks\rastermarkbox}
+
+\def\addpagecutmarks % #1
+ {\executeifdefined{\??ly:n:\c!marking:\@@lymarking}\gobbleoneargument}
+
+\def\addpagecolormarks % #1
+ {\executeifdefined{\??ly:c:\c!marking:\@@lymarking}\gobbleoneargument}
+
+\def\doaddpagecolormarks#1#2%
+ {\makepagecutbox{#2}%
+ \ifnum\horizontalcutmarks>2 \chardef\colormarkoffset4 \fi
+ \ifnum\verticalcutmarks >2 \chardef\colormarkoffset4 \fi
+ #1{#2}}
+
+% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET
+
+\ifx\doifelselayoutsomeline\undefined % defined in page-txt
+ \let\doifelselayoutsomeline\secondofthreearguments
+\fi
+
+\def\calculatevsizes % global needed in \recalculatelayoutregel
+ {\redoglobal\textheight\makeupheight
+ \doifelselayoutsomeline \v!header
+ {\redoglobal\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}%
+ \donothing
+ \doifelselayoutsomeline \v!footer
+ {\redoglobal\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}%
+ \donothing
+ \ifzeropt\headerheight
+ \resetsystemmode\v!header
+ \else
+ \setsystemmode\v!header
+ \fi
+ \ifzeropt\footerheight
+ \resetsystemmode\v!footer
+ \else
+ \setsystemmode\v!footer
+ \fi
+ \resetglobal
+ \setvsize}
+
+\def\calculatereducedvsizes
+ {\textheight\makeupheight
+ \doifelselayoutsomeline \v!header
+ {\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}%
+ {\headerheight\zeropoint
+ \setlayoutdistances}%
+ \doifelselayoutsomeline \v!footer
+ {\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}%
+ {\footerheight\zeropoint
+ \setlayoutdistances}}
+
+\newdimen\innermakeupwidth % special purpose
+\newdimen\innermakeupmargin % special purpose
+
+\chardef\innermakeupcompensation\plusone
+
+\def\compensatedinnermakeupmargin
+ {\dimexpr\ifnum\innermakeupcompensation=\plusone+\innermakeupmargin\else\zeropoint\fi\relax}
+
+\def\freezetextwidth % \makeupwidth may be set to \textwidth
+ {\textwidth\makeupwidth % which is a tricky but valid value
+ \doifsomething{\layoutparameter\c!textwidth}
+ {\textwidth\layoutparameter\c!textwidth}% % local
+ \global\innermakeupwidth\textwidth
+ \doifelsenothing{\layoutparameter\c!textmargin}
+ {\global\innermakeupmargin\zeropoint}
+ {\global\innermakeupmargin\layoutparameter\c!textmargin}%
+ \global\advance\innermakeupwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax
+ \advance\textwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax} % local
+
+\def\calculatehsizes
+ {\freezetextwidth
+ \sethsize}
+
+% De onderstaande macro voert commando's uit, afhankelijk van
+% het karakter van het paginanummer.
+%
+% \doifoddpageelse{then-commando}{else-commando}
+
+%D When we start at an even page, we need to swap the layout
+%D differently. We cannot adapt the real page number, since
+%D it is used in cross referencing. The next switch is set
+%D when we start at an even page.
+
+\newif\ifshiftedrealpageno
+
+% \def\doifoddpageelse#1#2%
+% {\ifshiftedrealpageno
+% \ifodd\realpageno#2\else#1\fi
+% \else
+% \ifodd\realpageno#1\else#2\fi
+% \fi}
+
+\def\doifoddpageelse
+ {\ifshiftedrealpageno
+ \ifodd\realpageno
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \ifodd\realpageno
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi
+ \fi}
+
+\let\doifonevenpaginaelse\doifoddpageelse
+
+% what are those \relax'es doing there?
+
+% \def\doifbothsidesoverruled#1#2#3%
+% {\ifdoublesided
+% \doifoddpageelse{#2}{#3}\relax
+% \else
+% #1\relax
+% \fi}
+
+% \def\doifbothsides#1#2#3%
+% {\ifdoublesided
+% \ifsinglesided
+% #1\relax
+% \else
+% \doifoddpageelse{#2}{#3}\relax
+% \fi
+% \else
+% #1\relax
+% \fi}
+
+\def\redoifoddpageelse#1{\doifoddpageelse}
+
+\def\doifbothsidesoverruled
+ {\ifdoublesided
+ \@EA\redoifoddpageelse
+ \else
+ \@EA\firstofthreearguments
+ \fi}
+
+\def\doifbothsides
+ {\ifdoublesided
+ \ifsinglesided
+ \@EAEAEA\firstofthreearguments
+ \else
+ \@EAEAEA\redoifoddpageelse
+ \fi
+ \else
+ \@EA\firstofthreearguments
+ \fi}
+
+\newdimen\texthoffset
+
+\def\settexthoffset
+ {\doifbothsides
+ {\texthoffset\backspace}
+ {\texthoffset\backspace}
+ {\texthoffset\dimexpr\paperwidth-\backspace-\makeupwidth\relax}}
+
+\def\goleftonpage
+ {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax}
+
+\def\doifmarginswapelse#1#2%
+ {\doifbothsides{#1}{#1}{#2}}
+
+\def\swapmargins
+ {\doifmarginswapelse\relax\doswapmargins}
+
+\def\doswapmargins
+ {\let\swapmargins \relax % to prevent local swapping
+ \let\doswapmargins\relax % to prevent local swapping
+ \the\everyswapmargins}
+
+\def\rightorleftpageaction
+ {\ifdoublesided
+ \ifsinglesided
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\doifoddpageelse
+ \fi
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
+
+\def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth }
+\def\innermarginwidth {\rightorleftpageaction\leftmarginwidth \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth {\rightorleftpageaction\rightedgewidth \leftedgewidth }
+\def\inneredgewidth {\rightorleftpageaction\leftedgewidth \rightedgewidth}
+\def\outeredgedistance {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth {\rightorleftpageaction\cutspace \backspace }
+\def\innerspacewidth {\rightorleftpageaction\backspace\cutspace}
+
+\def\leftmargintotal {\dimexpr\leftmarginwidth +\leftmargindistance \relax}
+\def\rightmargintotal {\dimexpr\rightmarginwidth+\rightmargindistance\relax}
+\def\leftedgetotal {\dimexpr\leftedgewidth +\leftedgedistance \relax}
+\def\rightedgetotal {\dimexpr\rightedgewidth +\rightedgedistance \relax}
+
+\def\leftsidetotal {\dimexpr\leftmarginwidth +\leftedgetotal \relax}
+\def\rightsidetotal {\dimexpr\rightmarginwidth+\rightedgetotal\relax}
+\def\leftcombitotal {\dimexpr\leftmargintotal +\leftedgetotal \relax}
+\def\rightcombitotal {\dimexpr\rightmargintotal+\rightedgetotal\relax}
+
+\def\innermargintotal {\dimexpr\innermarginwidth+\innermargindistance\relax}
+\def\outermargintotal {\dimexpr\outermarginwidth+\outermargindistance\relax}
+\def\inneredgetotal {\dimexpr\inneredgewidth +\inneredgedistance \relax}
+\def\outeredgetotal {\dimexpr\outeredgewidth +\outeredgedistance \relax}
+
+\def\innercombitotal {\dimexpr\innermargintotal+\inneredgetotal\relax}
+\def\outercombitotal {\dimexpr\outermargintotal+\outeredgetotal\relax}
+\def\innersidetotal {\dimexpr\innermarginwidth+\inneredgetotal\relax}
+\def\outersidetotal {\dimexpr\outermarginwidth+\outeredgetotal\relax}
+
+%D \macros
+%D {startlocallayout}
+%D
+%D These macros should be used with care. They permit local
+%D layouts (as used in fitting pages, see \type {page-app.tex}).
+
+%D This is kind of obsolete now that we have \type
+%D {\definelayout}, so this hack will disappear in future
+%D versions.
+
+\def\startlocallayout
+ {\globalpushmacro\restorepapersize
+ \globalpushmacro\currentlayout}
+
+\def\stoplocallayout
+ {\globalpopmacro\currentlayout
+ \globalpopmacro\restorepapersize
+ \restorepapersize
+ \setuplayout}
+
+%D \macros
+%D {showprint, showframe, showlayout, showsetups}
+%D
+%D We predefine a couple of tracing macros.
+%D
+%D \showsetup{showprint}
+%D \showsetup{showframe}
+%D \showsetup{showlayout}
+%D \showsetup{showsetups}
+%D %showsetup{showmargins}
+
+\fetchruntimecommand \showprint {page-run.mkii}
+\fetchruntimecommand \showframe {page-run.mkii}
+\fetchruntimecommand \showlayout {page-run.mkii}
+\fetchruntimecommand \showsetups {page-run.mkii}
+\fetchruntimecommand \showmargins {page-run.mkii}
+
+%D The default dimensions are quite old and will not change.
+%D The funny fractions were introduced when we went from fixed
+%D dimensions to relative ones. Since \CONTEXT\ is a dutch
+%D package, the dimensions are based on the metric system. The
+%D asymmetrical layout is kind of handy for short
+%D quick||and||dirty stapled documents.
+%D
+%D Although valid, it is not a real good idea to use
+%D dimensions based on the \type {em} unit. First of all,
+%D since there are no fonts loaded yet, this dimension makes
+%D no sense, and second, you would loose track of values,
+%D since they could change while going to a new page,
+%D depending on the current font setting.
+
+\setuplayout
+ [ \c!topspace=.08417508418\paperheight, % 2.5cm
+ \c!top=\!!zeropoint,
+ \c!topdistance=\!!zeropoint,
+ \c!header=.06734006734\paperheight, % 2.0cm
+ \c!headerdistance=\!!zeropoint,
+ \c!height=.84175084175\paperheight, % 25.0cm
+ \c!footerdistance=\layoutparameter\c!headerdistance,
+ \c!footer=.06734006734\paperheight, % 2.0cm
+ \c!bottomdistance=\layoutparameter\c!topdistance,
+ \c!bottom=\!!zeropoint,
+ \c!backspace=.11904761905\paperwidth, % 2.5cm
+ \c!edge=\!!zeropoint,
+ \c!edgedistance=\layoutparameter\c!margindistance,
+ \c!margin=.12649983170\paperwidth, % snijwit-2*afstand
+ \c!margindistance=.02008341748\paperwidth, % 12.0pt
+ \c!leftedge=\layoutparameter\c!edge,
+ \c!leftedgedistance=\layoutparameter\c!edgedistance,
+ \c!leftmargin=\layoutparameter\c!margin,
+ \c!leftmargindistance=\layoutparameter\c!margindistance,
+ \c!width=.71428571429\paperwidth, % 15.0cm
+ \c!rightmargindistance=\layoutparameter\c!margindistance,
+ \c!rightmargin=\layoutparameter\c!margin,
+ \c!rightedgedistance=\layoutparameter\c!edgedistance,
+ \c!rightedge=\layoutparameter\c!edge,
+ \c!veroffset=\!!zeropoint,
+ \c!bottomspace=\!!zeropoint,
+ \c!horoffset=\!!zeropoint,
+ \c!cutspace=\!!zeropoint,
+ \c!textwidth=, % dangerous option -> centered / local
+ \c!textmargin=, % dangerous option -> both sides
+ \c!textdistance=\!!zeropoint, % shift down on grid
+ \c!style=,
+ \c!color=,
+ \c!marking=\v!off,
+ \c!location=, % \v!singlesided, but empty is signal
+ \c!scale=1,
+ \c!nx=1,
+ \c!ny=1,
+ \c!dx=\!!zeropoint,
+ \c!dy=\!!zeropoint,
+ \c!grid=\v!no,
+ \c!preset=,
+ \c!setups=\systemsetupsprefix\s!default,
+ \c!clipoffset=\!!zeropoint,
+ \c!lines=0,
+ \c!paper=, % for foxet
+ \c!page=, % for foxet
+ \c!columns=1,
+ \c!columndistance=\!!zeropoint]
+
+%D First we define a whole range of (DIN) papersizes,
+%D of which the A-series makes most sense. We enable checking.
+
+%D We also set some of the parameters that will be used when
+%D positioning the typeset paper onto the print paper.
+
+\setuppaper % (size) % only used in XY imposition
+ [\c!width=\zeropoint,
+ \c!height=\zeropoint,
+ \c!topspace=\zeropoint,
+ \c!backspace=\zeropoint,
+ \c!dx=\zeropoint,
+ \c!dy=\zeropoint,
+ \c!nx=1,
+ \c!ny=1,
+ \c!method=\v!normal]
+
+\setuppapersize
+ [\c!option=\v!max,
+ \c!top=,
+ \c!bottom=\vss,
+ \c!left=,
+ \c!right=\hss]
+
+\definepapersize [A0] [\c!width=841mm,\c!height=1189mm]
+\definepapersize [A1] [\c!width=594mm,\c!height=841mm]
+\definepapersize [A2] [\c!width=420mm,\c!height=594mm]
+\definepapersize [A3] [\c!width=297mm,\c!height=420mm]
+\definepapersize [A4] [\c!width=210mm,\c!height=297mm]
+\definepapersize [A5] [\c!width=148mm,\c!height=210mm]
+\definepapersize [A6] [\c!width=105mm,\c!height=148mm]
+\definepapersize [A7] [\c!width=74mm,\c!height=105mm]
+\definepapersize [A8] [\c!width=52mm,\c!height=74mm]
+\definepapersize [A9] [\c!width=37mm,\c!height=52mm]
+\definepapersize [A10] [\c!width=26mm,\c!height=37mm]
+
+\definepapersize [B0] [\c!width=1000mm,\c!height=1414mm]
+\definepapersize [B1] [\c!width=707mm,\c!height=1000mm]
+\definepapersize [B2] [\c!width=500mm,\c!height=707mm]
+\definepapersize [B3] [\c!width=353mm,\c!height=500mm] % [\c!width=354mm,\c!height=500mm]
+\definepapersize [B4] [\c!width=250mm,\c!height=353mm] % [\c!width=250mm,\c!height=354mm]
+\definepapersize [B5] [\c!width=176mm,\c!height=250mm] % [\c!width=177mm,\c!height=250mm]
+\definepapersize [B6] [\c!width=125mm,\c!height=176mm] % [\c!width=125mm,\c!height=177mm]
+\definepapersize [B7] [\c!width=88mm,\c!height=125mm]
+\definepapersize [B8] [\c!width=62mm,\c!height=88mm] % [\c!width=63mm,\c!height=88mm]
+\definepapersize [B9] [\c!width=44mm,\c!height=62mm] % [\c!width=44mm,\c!height=63mm]
+\definepapersize [B10] [\c!width=31mm,\c!height=44mm]
+
+\definepapersize [C0] [\c!width=917mm,\c!height=1297mm]
+\definepapersize [C1] [\c!width=648mm,\c!height=917mm] % [\c!width=649mm,\c!height=917mm]
+\definepapersize [C2] [\c!width=458mm,\c!height=648mm] % [\c!width=459mm,\c!height=649mm]
+\definepapersize [C3] [\c!width=324mm,\c!height=458mm] % [\c!width=324mm,\c!height=459mm]
+\definepapersize [C4] [\c!width=229mm,\c!height=324mm]
+\definepapersize [C5] [\c!width=162mm,\c!height=229mm]
+\definepapersize [C6] [\c!width=114mm,\c!height=162mm] % [\c!width=115mm,\c!height=162mm]
+\definepapersize [C7] [\c!width=81mm,\c!height=114mm] % [\c!width=81mm,\c!height=115mm]
+\definepapersize [C8] [\c!width=57mm,\c!height=81mm]
+\definepapersize [C9] [\c!width=40mm,\c!height=57mm]
+\definepapersize [C10] [\c!width=28mm,\c!height=40mm]
+
+%D Per August 2004 the rounding of some (seldom used) sizes
+%D were corrected top the latest DIN specifications. Peter
+%D Rolf came up with these and a few more missing sizes.
+%D Watch out: spaces and slashes!
+
+\definepapersize [4 A0] [\c!width=1682mm,\c!height=2378mm]
+\definepapersize [2 A0] [\c!width=1189mm,\c!height=1682mm]
+\definepapersize [C6/C5] [\c!width=114mm,\c!height=229mm]
+
+%D Because there are no standardized screen sizes, we define
+%D a bunch of sizes with $4:3$ ratios. The \type {S6} size is
+%D nearly as wide as a sheet of \type {A4} paper.
+
+\definepapersize [S3] [\c!width=300pt,\c!height=225pt]
+\definepapersize [S4] [\c!width=400pt,\c!height=300pt]
+\definepapersize [S5] [\c!width=500pt,\c!height=375pt]
+\definepapersize [S6] [\c!width=600pt,\c!height=450pt]
+\definepapersize [S8] [\c!width=800pt,\c!height=600pt]
+\definepapersize [SW] [\c!width=800pt,\c!height=450pt]
+\definepapersize [SM] [\c!width=720pt,\c!height=450pt]
+
+%D These are handy too:
+
+\definepapersize [S33] [\c!width=300pt,\c!height=300pt]
+\definepapersize [S44] [\c!width=400pt,\c!height=400pt]
+\definepapersize [S55] [\c!width=500pt,\c!height=500pt]
+\definepapersize [S66] [\c!width=600pt,\c!height=600pt]
+
+%D One may wonder if \TEX\ should be used for typesetting
+%D \CDROM\ covers, but it does not hurt to have the paper size
+%D ready.
+
+\definepapersize [CD] [\c!width=120mm,\c!height=120mm]
+
+%D The next series is for our English speaking friends who
+%D decided to stick to non metric values. Thanks to Nelson
+%D Beebe for completing the inch based list.
+
+\definepapersize [letter] [\c!width=8.5in,\c!height=11in]
+\definepapersize [ledger] [\c!width=11in,\c!height=17in]
+\definepapersize [tabloid] [\c!width=17in,\c!height=11in]
+
+\definepapersize [legal] [\c!width=8.5in,\c!height=14in]
+\definepapersize [folio] [\c!width=8.5in,\c!height=13in]
+\definepapersize [executive] [\c!width=7.25in,\c!height=10.5in]
+
+\definepapersize [A] [\c!width=8.5in,\c!height=11in] % 1 sheet
+\definepapersize [B] [\c!width=11in,\c!height=17in] % 2 sheets
+\definepapersize [C] [\c!width=17in,\c!height=22in] % 4 sheets
+
+%D The next set is for Tobias Burnus, who gave me the sizes.
+
+\definepapersize [envelope 9] [\c!width=8.88in,\c!height=3.88in]
+\definepapersize [envelope 10] [\c!width=9.5in,\c!height=4.13in]
+\definepapersize [envelope 11] [\c!width=10.38in,\c!height=4.5in]
+\definepapersize [envelope 12] [\c!width=11.0in,\c!height=4.75in]
+\definepapersize [envelope 14] [\c!width=11.5in,\c!height=5.0in]
+\definepapersize [monarch] [\c!width=7.5in,\c!height=3.88in]
+\definepapersize [check] [\c!width=8.58in,\c!height=3.88in]
+\definepapersize [DL] [\c!width=110mm,\c!height=220mm] % [\c!width=220mm,\c!height=110mm]
+\definepapersize [E4] [\c!width=280mm,\c!height=400mm]
+
+%D The next three sets are supplied by Taco:
+
+\definepapersize [RA0] [\c!width=860mm,\c!height=1220mm]
+\definepapersize [RA1] [\c!width=610mm,\c!height=860mm]
+\definepapersize [RA2] [\c!width=430mm,\c!height=610mm]
+\definepapersize [RA3] [\c!width=305mm,\c!height=430mm]
+\definepapersize [RA4] [\c!width=215mm,\c!height=305mm]
+
+%D ISO SRA (supplementary raw A) sizes:
+
+\definepapersize [SRA0] [\c!width=900mm,\c!height=1280mm]
+\definepapersize [SRA1] [\c!width=640mm,\c!height=900mm]
+\definepapersize [SRA2] [\c!width=450mm,\c!height=640mm]
+\definepapersize [SRA3] [\c!width=320mm,\c!height=450mm]
+\definepapersize [SRA4] [\c!width=225mm,\c!height=320mm]
+
+%D Swedish thesis formats:
+
+\definepapersize [G5] [\c!width=169mm,\c!height=239mm]
+\definepapersize [E5] [\c!width=155mm,\c!height=220mm]
+
+%D Industry invention:
+
+\definepapersize [A3plus] [\c!width=329mm,\c!height=483mm]
+
+%D We can now default to a reasonable size. We match the print
+%D paper size with the typeset paper size. This setting should
+%D come after the first layout specification (already done).
+
+\setuppapersize
+ [A4][A4]
+
+%D A few goodies:
+
+\definepapersize
+ [oversized]
+ [ \c!width=\dimexpr\paperwidth +1.5cm\relax,
+ \c!height=\dimexpr\paperheight+1.5cm\relax]
+
+\definepapersize
+ [doublesized]
+ [ \c!width=\dimexpr \paperwidth \relax,
+ \c!height=\dimexpr2\paperheight\relax]
+
+\definepapersize
+ [doubleoversized]
+ [ \c!width=\dimexpr \paperheight+1.5cm\relax,
+ \c!height=\dimexpr2\paperwidth +1.5cm\relax]
+
+%D For orthogonality:
+
+\definepapersize
+ [undersized]
+ [ \c!width=\dimexpr\paperwidth -1.5cm\relax,
+ \c!height=\dimexpr\paperheight-1.5cm\relax]
+
+\definelayout
+ [\v!page]
+ [\c!backspace=\zeropoint,
+ \c!cutspace=\zeropoint,
+ \c!topspace=\zeropoint,
+ \c!bottomspace=\zeropoint,
+ \c!margin=\zeropoint,
+ \c!edge=\zeropoint,
+ \c!header=\zeropoint,
+ \c!footer=\zeropoint,
+ \c!top=\zeropoint,
+ \c!bottom=\zeropoint,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\zeropoint,
+ \c!leftedge=\zeropoint,
+ \c!rightedge=\zeropoint,
+ \c!textdistance=\zeropoint,
+ \c!width=\v!middle,
+ \c!height=\v!middle,
+ \c!lines=0,
+ \c!grid=\v!no]
+
+\definelayout
+ [\v!middle]
+ [\c!width=\v!middle,
+ \c!height=\v!middle]
+
+\protect \endinput
diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv
new file mode 100644
index 000000000..28f9be594
--- /dev/null
+++ b/tex/context/base/page-lay.mkiv
@@ -0,0 +1,1425 @@
+%D \module
+%D [ file=page-lay,
+%D version=2000.10.20, % copied from main-001
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Layout Specification,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Layout Specification}
+
+%D This module is now etex dependent.
+
+% to be translated into english
+
+% hoofdhoogte wordt bij status=hoog niet aangepast op outer
+% level, wel binnen bepaalde berekeningen
+
+%D Before you start wondering why some of the page related
+%D modules skip upward or left in order to place elements, you
+%D must realize that the reference point is the top left
+%D corner of the main typesetting area. One reason for this
+%D choice is that it suited some viewers that displayed page
+%D areas. Another reason is that margins, edges and top and
+%D bottom areas are kind of virtual, while the header, text
+%D and footer areas normally determine the text flow.
+
+\unprotect
+
+%D First we get rid of the funny \TEX\ offset defaults of one
+%D inch by setting them to zero.
+
+\voffset = 0pt % setting this to -1in let's go metapost crazy
+\hoffset = 0pt % setting this to -1in let's go metapost crazy
+
+%D The dimensions related to layout areas are represented by
+%D real dimensions.
+
+\newdimen\paperheight \paperheight = 297mm
+\newdimen\paperwidth \paperwidth = 210mm
+
+\newdimen\printpaperheight \printpaperheight = \paperheight
+\newdimen\printpaperwidth \printpaperwidth = \paperwidth
+
+\newdimen\makeupheight % calculated
+\newdimen\makeupwidth % calculated
+
+\newdimen\textheight % calculated
+\newdimen\textwidth % calculated
+
+\newdimen\topspace \topspace = 2cm
+\newdimen\backspace \backspace = \topspace
+\newdimen\cutspace \cutspace = 0pt
+\newdimen\bottomspace \bottomspace = 0pt
+
+\newdimen\headerheight \headerheight = 2cm
+\newdimen\footerheight \footerheight = \headerheight
+
+\newdimen\topoffset \topoffset = 0pt
+\newdimen\backoffset \backoffset = \topoffset
+
+\newdimen\leftmarginwidth \leftmarginwidth = 3cm
+\newdimen\rightmarginwidth \rightmarginwidth = \leftmarginwidth
+
+\newdimen\leftedgewidth \leftedgewidth = 3cm
+\newdimen\rightedgewidth \rightedgewidth = \leftedgewidth
+
+\newdimen\topheight \topheight = 0cm
+\newdimen\bottomheight \bottomheight = \topheight
+
+\newcount\layoutlines \layoutlines = 0
+\newcount\layoutcolumns \layoutcolumns = 0
+\newdimen\layoutcolumndistance \layoutcolumndistance = 0pt
+\newdimen\layoutcolumnwidth \layoutcolumnwidth = 0pt
+
+%D We can save some tokens and fuzzy parameters by using a
+%D symbolic name for the current set of layout parameters.
+
+\let\currentlayout\empty
+
+\def\layoutparameter#1%
+ {\csname\??ly\ifcsname
+ \??ly\currentlayout#1\endcsname\currentlayout
+ \fi#1\endcsname}
+
+\def\namedlayoutparameter#1#2%
+ {\csname\??ly\ifcsname\??ly #1#2\endcsname#1\else
+ \ifcsname\??ly\currentlayout#2\endcsname\currentlayout
+ \fi\fi#2\endcsname}
+
+%D Beause normal \TEX\ has at most 256 dimensions (of which a
+%D substantial part is already in use), we provide a way to
+%D generate a format with macro based alternatives. For a long
+%D time, this used to be the default case. Beware: only fixed
+%D dimensions can be used in calculations! By the way, the
+%D gain in speed can hardly be called impressive and is roughly
+%D 1 second on a 35 second run of 850 empty pages with a
+%D couple of backgrounds only (which is far less than one
+%D percent on a normal document).
+
+%D The next series of dimensions are complemented by left
+%D and rights ones.
+
+\newdimen \margindistance
+\newdimen \edgedistance
+\newdimen \marginwidth
+\newdimen \edgewidth
+
+%D Because a distance does not really makes sense when there
+%D is no area, we use a zero distance in case there is no
+%D area.
+
+\def\layoutdistance#1#2%
+ {\ifdim\zeropoint<#1\layoutparameter#2\else\zeropoint\fi}
+
+%D The horizontal distances are:
+
+\newdimen \leftedgedistance
+\newdimen \rightedgedistance
+\newdimen \leftmargindistance
+\newdimen \rightmargindistance
+
+%D The vertical distances are:
+
+\newdimen \topdistance
+\newdimen \headerdistance
+\newdimen \footerdistance
+\newdimen \bottomdistance
+
+%D We need to calculate the extra distances:
+
+\def\setlayoutdimensions
+ {\global\marginwidth \layoutparameter\c!margin
+ \global\edgewidth \layoutparameter\c!edge
+ \global\margindistance \layoutparameter\c!margindistance
+ \global\edgedistance \layoutparameter\c!edgedistance
+ \global\leftedgedistance \layoutdistance \leftedgewidth \c!leftedgedistance
+ \global\rightedgedistance \layoutdistance \rightedgewidth \c!rightedgedistance
+ \global\leftmargindistance \layoutdistance \leftmarginwidth \c!leftmargindistance
+ \global\rightmargindistance\layoutdistance \rightmarginwidth \c!rightmargindistance
+ \global\topdistance \layoutdistance \topheight \c!topdistance
+ \global\headerdistance \layoutdistance \headerheight \c!headerdistance
+ \global\footerdistance \layoutdistance \footerheight \c!footerdistance
+ \global\bottomdistance \layoutdistance \bottomheight \c!bottomdistance}
+
+\def\setlayoutdistances % local in \setreducedvsize
+ {\headerdistance\layoutdistance\headerheight\c!headerdistance
+ \footerdistance\layoutdistance\footerheight\c!footerdistance}
+
+% these are wrong in the running text, assumes some swapping, needs a cleanup
+
+\def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth }
+\def\innermarginwidth {\rightorleftpageaction\leftmarginwidth \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth {\rightorleftpageaction\rightedgewidth \leftedgewidth }
+\def\inneredgewidth {\rightorleftpageaction\leftedgewidth \rightedgewidth}
+\def\outeredgedistance {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth {\rightorleftpageaction\cutspace\backspace}
+\def\innerspacewidth {\rightorleftpageaction\backspace\cutspace}
+
+\newtoks\extralayoutcalculations \def\calculatelayoutextras{\the\extralayoutcalculations}
+
+% \appendtoks
+% non etex calculations used to go here
+% \to \extralayoutcalculations
+
+\newtoks\everyswapmargins % watch the order !
+
+\appendtoks
+ \swapdimens\leftmargindistance\rightmargindistance
+ \swapdimens\leftedgedistance \rightedgedistance
+ \swapdimens\leftmarginwidth \rightmarginwidth
+ \swapdimens\leftedgewidth \rightedgewidth
+\to \everyswapmargins
+
+\appendtoks
+ \swapmacros\leftmargintotal \rightmargintotal
+ \swapmacros\leftedgetotal \rightedgetotal
+ \swapmacros\leftsidetotal \rightsidetotal
+ \swapmacros\leftcombitotal \rightcombitotal
+ \swapmacros\innermargintotal\outermargintotal
+ \swapmacros\inneredgetotal \outeredgetotal
+ \swapmacros\innercombitotal \outercombitotal
+ \swapmacros\innersidetotal \outersidetotal
+\to \everyswapmargins
+
+%D \macros
+%D {definepapersize}
+%D
+%D Before we start calculating layout dimensions, we will
+%D first take care of paper sizes. The first argument can be
+%D either an assignment (for defaults) or an identifier, in
+%D which case the second argument is an assignment.
+%D
+%D \showsetup{definepapersize}
+
+\unexpanded\def\definepapersize
+ {\dodoubleempty\dodefinepapersize}
+
+\unexpanded\def\definepapersize
+ {\dotripleempty\dodefinepapersize}
+
+\def\dodefinepapersize[#1][#2][#3]%
+ {\ifsecondargument
+ \doifsomething{#1} % to be sure
+ {\doifassignmentelse{#2}
+ {\getparameters
+ [\??pp#1] % geen \c!scale, scheelt hash ruimte
+ [\c!width=\@@ppwidth,\c!height=\@@ppheight,\c!offset=\@@ppoffset,#2]}
+ {\setvalue{\??pp:1:#1}{#2}%
+ \setvalue{\??pp:2:#1}{#3}}}%
+ \else
+ \getparameters[\??pp][#1]%
+ \setuppapersize % hm. this will freeze !
+ \fi}
+
+%D For the moment we need to fake this macro.
+
+\ifx\setuppapersize\undefined
+ \let\setuppapersize\relax
+\fi
+
+%D We set the defaults to the dimensions of an A4 sheet of
+%D paper.
+
+\definepapersize
+ [\c!width=210mm,\c!height=297mm,\c!offset=\zeropoint]
+
+%D Yet undocumented, let's see if it gets noticed.
+%D
+%D \starttyping
+%D \definepapersize[main] [A4] [A4]
+%D \definepapersize[extra][A4,landscape][A4,landscape]
+%D
+%D \starttext
+%D \setuppapersize[main]
+%D Page 1. \page
+%D Page 2. \page
+%D \setuppapersize[extra]
+%D Page 2 \page
+%D \setuppapersize[main]
+%D Page 3. \page
+%D Page 4. \page
+%D \adaptpapersize[extra]
+%D Page 5. \page
+%D Page 6. \page
+%D \stoptext
+%D \stoptyping
+
+%D \macros
+%D {setuppaper,setuppapersize}
+%D
+%D When setting up the papersize on which to typeset and
+%D print, we can also determine some more characteristics.
+%D
+%D \showsetup{setuppapersize}
+%D
+%D We keep track of these features with the following
+%D variables.
+
+\chardef\papermirror =0 \chardef\printmirror =0
+\chardef\paperorientation=0 \chardef\printorientation=0 % beware: later no chardef
+\chardef\paperreverse =0 \chardef\printreverse =0
+\chardef\paperlandscape =0 \chardef\printlandscape =0
+
+\let\papersize\empty \let\printpapersize\empty
+
+\def\paperscale{1} \newif\ifnegateprintbox
+
+\unexpanded\def\setuppaper[#1]%
+ {\getparameters[\??pp][\c!paper=,\c!page=,#1]%
+ \edef\@@ppxy{\the\numexpr\@@ppnx*\@@ppny\relax}%
+ \doifelsenothing\@@pppage
+ {\doifelsenothing\@@pppaper
+ {} % {\setuppapersize} % added, removed, no need for, too tricky, mag-01 (fixed by freezing pp's)
+ {\dodosetuppapersize[\papersize][\@@pppaper]}}
+ {\doifelsenothing\@@pppaper
+ {\dodosetuppapersize[\@@pppage][\printpapersize]}
+ {\dodosetuppapersize[\@@pppage][\@@pppaper]}}}
+
+\unexpanded\def\setuppapersize
+ {\dodoubleempty\dosetuppapersize}
+
+\def\dosetuppapersize[#1][#2]%
+ {\doifassignmentelse{#1}
+ {\setuppaper[#1]}
+ {\doifelsenothing{#2}
+ {\expanded{\dodosetuppapersize
+ [\executeifdefined{\??pp:1:#1}{#1}]%
+ [\executeifdefined{\??pp:2:#1}{}]}}
+ {\doifassignmentelse{#2}
+ {\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]}
+ {\expanded{\dodosetuppapersize
+ [\executeifdefined{\??pp:1:#1}{#1}]%
+ [\executeifdefined{\??pp:1:#2}{#2}]}}}}}
+
+\let\reinstatepapersize\relax
+
+\def\adaptpapersize
+ {\global\let\reinstatepapersize\restorepapersize
+ \setuppapersize}
+
+\appendtoks
+ \reinstatepapersize
+ \global\let\reinstatepapersize\relax
+\to \everyaftershipout
+
+\def\dodosetuppapersize[#1][#2]%
+ {\ifsecondargument
+ \expanded{\dododosetuppapersize[#1][#2]}%
+ \calculatehsizes
+ \calculatevsizes
+ \recalculatebackgrounds
+ \recalculatelayout
+ \else\iffirstargument
+ \setuppapersize[#1][#2]%
+ \else\ifx\papersize\undefined\else
+ \restorepapersize
+ \fi\fi\fi}
+
+% dimen freeze is a bit tricky, but catches local redundant calls
+% with values where e.g width is defined in terms of \paperwidth
+
+\def\dododosetuppapersize[#1][#2]%
+ {\xdef\restorepapersize{\noexpand\setuppapersize[#1][#2]}%
+ \dosetuppaperorientation{#1}\paperlandscape\paperorientation\paperreverse\papermirror
+ \dosetuppaperorientation{#2}\printlandscape\printorientation\printreverse\printmirror
+ \def\docommand##1%
+ {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+ {\global\paperwidth \getvalue{\??pp##1\c!width}%
+ \global\paperheight\getvalue{\??pp##1\c!height}%
+ \ifinpagebody
+ \setevalue{\??pp##1\c!height}{\the\paperheight}%
+ \setevalue{\??pp##1\c!width }{\the\paperwidth }%
+ \fi
+ \calculatepaperoffsets{##1}%
+ \xdef\papersize{##1}}}}%
+ \processcommacommand[#1]\docommand
+ \doifdefinedelse{\??pp#1\c!scale}
+ {\edef\paperscale{\getvalue{\??pp#1\c!scale}}}
+ {\edef\paperscale{1}}%
+ \def\docommand##1%
+ {\doifsomething{##1}{\doifdefined{\??pp##1\c!width}
+ {\global\printpaperwidth \getvalue{\??pp##1\c!width}%
+ \global\printpaperheight\getvalue{\??pp##1\c!height}%
+ \ifinpagebody
+ \setevalue{\??pp##1\c!height}{\the\printpaperheight}%
+ \setevalue{\??pp##1\c!width }{\the\printpaperwidth}%
+ \fi
+ \xdef\printpapersize{##1}}}}%
+ \processcommacommand[#2]\docommand
+ \global\setdimentoatleast\paperwidth \onepoint
+ \global\setdimentoatleast\paperheight \onepoint
+ \global\setdimentoatleast\printpaperwidth \onepoint
+ \global\setdimentoatleast\printpaperheight\onepoint
+ \ifcase\paperlandscape\else
+ \doglobal\swapdimens\paperwidth\paperheight
+ \fi
+ \ifcase\printlandscape\else
+ \doglobal\swapdimens\printpaperwidth\printpaperheight
+ \fi
+ % this check can be confusing, so we've added the possibility
+ % to bypass this test: \setuppapersize[option=fit]
+ \doif\@@ppoption\v!max % \v!fit is
+ {\bgroup
+ % we need to pre-swap else we get the wrong paper size
+ \ifcase\paperorientation\else
+ \doifinset\paperorientation{90,270}{\swapdimens\paperwidth\paperheight}%
+ \fi
+ \ifcase\printorientation\else
+ \doifinset\printorientation{90,270}{\swapdimens\printpaperwidth\printpaperheight}%
+ \fi
+ \ifdim\paperheight>\printpaperheight
+ \global\printpaperheight\paperheight
+ \writestatus\m!systems{print height forced to paper height}%
+ \fi
+ \ifdim\paperwidth>\printpaperwidth
+ \global\printpaperwidth\paperwidth
+ \writestatus\m!systems{print width forced to paper width}%
+ \fi
+ \egroup}}
+
+\def\dosetuppaperorientation#1#2#3#4#5%
+ {\global\chardef#2\zerocount
+ \global\chardef#5\zerocount
+ \globallet#3\!!zerocount
+ \globallet#4\!!zerocount
+ \global\negateprintboxfalse
+ \processallactionsinset
+ [#1]
+ [ \v!landscape=>\global\chardef#2\plusone,
+ \v!mirrored=>\global\chardef#5\plusone,
+ \v!rotated=>\gdef#3{90}\gdef#4{270},
+ \v!negative=>\global\negateprintboxtrue,
+ 90=>\gdef#3{90}\gdef#4{270},
+ 180=>\gdef#3{180}\gdef#4{0},
+ 270=>\gdef#3{270}\gdef#4{90}]}
+
+\ifx\calculatepaperoffsets\undefined
+
+ \def\calculatepaperoffsets#1%
+ {\scratchdimen\getvalue{\??pp#1\c!offset}%
+ \global\advance\paperwidth -2\scratchdimen
+ \global\advance\paperheight-2\scratchdimen}
+
+\fi
+
+\let\restorepapersize\relax
+
+% \def\docheckforems#1%
+% {\beforesplitstring#1\at em\to\asciia
+% \doifnot\asciia{#1}
+% {\aftersplitstring\asciia\at=\to\asciia
+% \doifsomething\asciia{\showmessage\m!systems{10}{#1}}}}
+%
+% \def\checkforems[#1]%
+% {\processcommalist[#1]\docheckforems}
+
+\ifx\setups\undefined \unexpanded\def\setups[#1]{\setdefaultpenalties} \fi
+
+% \newtoks \everybeforelayout \relax
+% \newtoks \everyafterlayout \relax
+
+\def\recalculatelayout
+ {\doifsomething{\layoutparameter\c!page\layoutparameter\c!paper}
+ {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}%
+ \dorecalculatelayout}
+
+\ifdefined\docheckgridsnapping \else \let\docheckgridsnapping\relax \fi
+
+\def\dorecalculatelayout
+ {%\the\everybeforelayout
+ \setups[\layoutparameter\c!preset]%
+ \global\leftmarginwidth \layoutparameter\c!leftmargin
+ \global\rightmarginwidth\layoutparameter\c!rightmargin
+ \global\leftedgewidth \layoutparameter\c!leftedge
+ \global\rightedgewidth \layoutparameter\c!rightedge
+ \global\headerheight \layoutparameter\c!header
+ \global\footerheight \layoutparameter\c!footer
+ \global\bottomheight \layoutparameter\c!bottom
+ \global\topheight \layoutparameter\c!top
+ \global\backspace \layoutparameter\c!backspace
+ \global\topspace \layoutparameter\c!topspace
+ \setlayoutdimensions % the rest of the `dimensions'
+ \docheckgridsnapping
+ \doprocesslocalsetups{\layoutparameter\c!setups}% depends on gridsnapping !
+ \simplesetupwhitespace
+ \simplesetupblank
+ \setupinterlinespace[\v!reset]% \synchronizegloballinespecs
+ \global\cutspace\layoutparameter\c!cutspace
+ \relax
+ \doifelse{\layoutparameter\c!width}\v!middle
+ {\ifdim\cutspace=\zeropoint
+ \global\cutspace\backspace
+ \fi
+ \global\makeupwidth\dimexpr\paperwidth-\backspace-\cutspace\relax}
+ {\doifelse{\layoutparameter\c!width}\v!fit
+ {\ifdim\cutspace=\zeropoint
+ \global\cutspace\backspace
+ \fi
+ \global\makeupwidth\dimexpr\paperwidth-\cutspace\relax
+ \scratchdimen\dimexpr\backspace
+ -\leftedgewidth -\leftedgedistance
+ -\leftmarginwidth-\leftmargindistance\relax
+ \ifdim\scratchdimen<\zeropoint
+ \scratchdimen\zeropoint
+ \fi
+ \global\advance\makeupwidth\dimexpr
+ -\rightmargindistance-\rightmarginwidth
+ -\rightedgedistance -\rightedgewidth
+ -\scratchdimen\relax}
+ {\global\makeupwidth\layoutparameter\c!width\relax
+ \ifdim\cutspace=\zeropoint
+ \global\cutspace\dimexpr\paperwidth-\makeupwidth-\backspace\relax
+ % \else
+ % A kind of inconsistent specification, but used
+ % in for instance s-pre-19.tex; the cutspace is
+ % used only for determining some kind of right
+ % margin; don't use this in doublesided mode
+ \fi}}%
+ \scratchdimen\layoutparameter\c!bottomspace\relax
+ %\ifdim\scratchdimen=\zeropoint
+ % \scratchdimen\topspace
+ %\fi
+ \global\bottomspace\layoutparameter\c!bottomspace\relax
+ \global\layoutlines0\number\layoutparameter\c!lines\relax % may be empty
+ \ifcase\layoutlines
+ \doifelse{\layoutparameter\c!height}\v!middle
+ {\ifdim\bottomspace=\zeropoint
+ \global\bottomspace\topspace
+ \fi
+ \global\makeupheight\dimexpr\paperheight-\topspace-\bottomspace\relax}
+ {\doifelse{\layoutparameter\c!height}\v!fit
+ {\ifdim\bottomspace=\zeropoint
+ \global\bottomspace\topspace
+ \fi
+ \global\makeupheight\dimexpr\paperheight-\bottomspace\relax
+ \scratchdimen\dimexpr\topspace-\topheight-\topdistance\relax
+ \ifdim\scratchdimen<\zeropoint
+ \scratchdimen\zeropoint
+ \fi
+ \global\advance\makeupheight\dimexpr-\bottomdistance-\bottomheight-\scratchdimen\relax}
+ {\global\makeupheight\layoutparameter\c!height\relax
+ \ifdim\bottomspace=\zeropoint
+ \global\bottomspace\dimexpr\paperheight-\makeupheight-\topspace\relax
+ \else
+ % inconsistent specification
+ \fi}}%
+ \else
+ % beware, when the bodyfont changes (switched) this will change as well; implementing
+ % a global lineheight is tricky: should we take the bodyfont interlinespace or the one set
+ % independent of the bodyfont (before or after a layout spec); way too fuzzy, so we
+ % stick to the current method (after a night of experimenting ...2003/10/13)
+ \global\makeupheight\dimexpr
+ \layoutparameter\c!lines\lineheight-\strutheight+\topskip+
+ \headerdistance+\headerheight+\footerdistance+\footerheight\relax
+ \fi
+ \backoffset\layoutparameter\c!horoffset
+ \topoffset \layoutparameter\c!veroffset
+ \global\setdimentoatleast\makeupwidth\onepoint
+ \global\setdimentoatleast\makeupheight \onepoint
+ % \checkcurrentlayout % here ?
+ % \the\everyafterlayout
+ \calculatelayoutextras
+ \calculatehsizes
+ \calculatevsizes
+ \calculatepseudocolumns
+ \recalculatebackgrounds}
+
+\def\calculatepseudocolumns
+ {\global\layoutcolumns\layoutparameter\c!columns
+ \global\layoutcolumndistance\layoutparameter\c!columndistance
+ \global\layoutcolumnwidth\dimexpr\makeupwidth-\layoutcolumns\layoutcolumndistance+\layoutcolumndistance\relax
+ \global\divide\layoutcolumnwidth\layoutcolumns
+ \dorecurse\layoutcolumns
+ {\setxvalue{\??ly:c:\recurselevel}%
+ {\the\numexpr\recurselevel-\plusone\relax\dimexpr\layoutcolumnwidth+\layoutcolumndistance\relax}}}
+
+%\dorecurse\layoutcolumns
+% {\setxvalue{\??ly:c:\recurselevel}{\the\dimexpr
+% (\numexpr(\recurselevel-1)\dimexpr(\layoutcolumnwidth+\layoutcolumndistance))}}
+
+\def\layoutcolumnoffset#1%
+ {\executeifdefined{\??ly:c:#1}\zeropoint}
+
+\def\checklayout
+ {\ifdim\makeupheight=\layoutlines\lineheight \else \recalculatelayout \fi}
+
+\appendtoks \checklayout \to \everystarttext
+
+% document:
+%
+% \setuplayout[odd][state=stop] \setuplayout[even][state=stop] \setuplayout[page]
+%
+% \startstandardmakeup[page=blank] ... \stopstandardmakeup
+
+\def\changetolayout#1%
+ {%\writestatus\m!layouts{changing to layout #1}%
+ \xdef\currentlayout{#1}\recalculatelayout}
+
+\def\checkcurrentoddlayout
+ {\ifcsname\??ly\v!odd\c!state\endcsname
+ \doifvalue{\??ly\v!odd\c!state}\v!start{\changetolayout\v!odd}%
+ \fi}
+
+\def\checkcurrentevenlayout
+ {\ifcsname\??ly\v!even\c!state\endcsname
+ \doifvalue{\??ly\v!even\c!state}\v!start{\changetolayout\v!even}%
+ \fi}
+
+\ifx\lastpage\undefined \def\lastpage{1} \fi
+
+\def\reverserealfolio
+ {\ifnum\lastpage>\plusone
+ \ifnum\lastpage=\realfolio
+ \v!last
+ \else\ifnum\plusone=\realfolio
+ \v!first
+ \else
+ \the\numexpr\realfolio-\lastpage\relax
+ \fi\fi
+ \else
+ \!!zerocount
+ \fi}
+
+\def\checkcurrentlayout % public and used in naw, so keep this name
+ {\ifcsname\??ly\realfolio\c!state\endcsname
+ \doifvalue{\??ly\realfolio\c!state}\v!start{\changetolayout\realfolio}%
+ \else\ifcsname\??ly\reverserealfolio\c!state\endcsname
+ \doifvalue{\??ly\reverserealfolio\c!state}\v!start{\changetolayout\reverserealfolio}%
+ \else\ifcsname\??ly\v!current\c!state\endcsname
+ \changetolayout\v!current % no start test ?
+ \else
+ \doifoddpageelse\checkcurrentoddlayout\checkcurrentevenlayout
+ \fi\fi\fi}
+
+% testcase
+%
+% \setuppagenumbering[alternative=doublesided]
+%
+% \setuplayout [width=11cm]
+% \definelayout [odd] [backspace=1cm]
+% \definelayout [even] [backspace=4cm]
+% \definelayout [5] [backspace=5cm]
+% \definelayout [6] [backspace=5cm]
+% \definelayout [-2] [backspace=0cm,cutspace=0cm]
+% \definelayout [last] [backspace=0cm,cutspace=0cm]
+%
+% \checkcurrentlayout \showframe
+%
+% \starttext
+% \dorecurse{20} {\input knuth \endgraf \input tufte \endgraf}
+% \stoptext
+
+%appendtoks \checkcurrentlayout \to \everyaftershipout % no
+\appendtoks \checkcurrentlayout \to \everystarttext
+
+\appendtoks
+ \dochecknextlayout
+\to \everyaftershipout
+
+% \def\dochecknextlayout
+% {\ifx\currentlayout\v!current
+% % prevent redundant calculations
+% \else
+% \globallet\currentlayout\empty
+% \global\letbeundefined{\??ly\v!current\c!state}%
+% \checkcurrentlayout
+% \fi}
+%
+% this breaks after a standardmakeup
+
+\def\dochecknextlayout{\checkcurrentlayout}
+
+\newif\ifdoublesidedprint
+
+\def\presetcenterpagebox % in \setuplayout !!!!!!!!!!!!!!!!
+ {\doublesidedprintfalse
+ \normalexpanded{\noexpand\processallactionsinset[\@@lylocation]}
+ [ \v!middle=>{\setuppapersize[\c!left=\hss,\c!right=\hss,\c!top=\vss,\c!bottom=\vss]},
+ \v!left=>{\setuppapersize[\c!left=,\c!right=\hss]},
+ \v!right=>{\setuppapersize[\c!left=\hss,\c!right=]},
+ \v!bottom=>{\setuppapersize[\c!top=\vss,\c!bottom=]},
+ \v!top=>{\setuppapersize[\c!top=,\c!bottom=\vss]},%
+ \v!doublesided=>\doublesidedprinttrue,
+ \v!singlesided=>\doublesidedprintfalse]}
+
+\unexpanded\def\definelayout
+ {\dodoubleargument\dodefinelayout}
+
+\def\dodefinelayout[#1][#2]%
+ {\getparameters[\??ly#1][\c!state=\v!start,#2]}
+
+% \def\dodosetuplayout[#1][#2]%
+% {\ConvertToConstant\doifnot{#2}\v!reset % #2 ?
+% {\getparameters[\??ly#1][#2]%
+% \checkforems[#2]}}
+
+\def\dodosetuplayout[#1][#2]%
+ {\doifnot{#2}\v!reset{\getparameters[\??ly#1][#2]}}
+
+% global needed for non-doublesided standardmakeup
+
+\def\dosetuplayout[#1][#2]%
+ {\globallet\currentlayout\empty % new, global
+ \ifsecondargument
+ \dodosetuplayout[#1][#2]%
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\dodosetuplayout[][#1]}
+ {\doifnot{#1}\v!reset{\xdef\currentlayout{#1}}}% new, global
+ \fi\fi
+ \recalculatelayout
+ \checkcurrentlayout % here ?
+ \presetcenterpagebox}
+
+\unexpanded\def\setuplayout
+ {\dodoubleempty\dosetuplayout}
+
+\let\@@zaheight\!!zeropoint
+
+\def\dopushpagedimensions
+ {\xdef\oldtextheight {\the\textheight }%
+ \xdef\oldfooterheight{\the\footerheight}%
+ \global\let\@@zaheight\@@zaheight}
+
+\def\dopoppagedimensions
+ {\global\textheight \oldtextheight
+ \global\footerheight\oldfooterheight
+ \recalculatelayout
+ \global\let\pushpagedimensions\dopushpagedimensions
+ \global\let\poppagedimensions\relax}
+
+\let\poppagedimensions \relax
+\let\pushpagedimensions\dopushpagedimensions
+
+% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook
+% in een test met \doifdefined. Bij veel bladzijden kan dit
+% te veel macro's kosten. Vandaar de set \adaptedpages. Het
+% kost tijd, maar scheelt macro's.
+
+\let\adaptedpages\empty
+
+\def\adaptpagedimensions
+ {\ifx\adaptedpages\empty\else
+ \adaptpagedimensionsindeed
+ \fi}
+
+\def\adaptpagedimensionsindeed
+ {\rawdoifinset\realfolio\adaptedpages
+ {\removefromcommalist\realfolio\adaptedpages
+ \getvalue{\??za\realfolio}%
+ \letbeundefined{\??za\realfolio}}}
+
+\def\checkpagedimensions
+ {\poppagedimensions
+ \adaptpagedimensions}
+
+\def\reportpagedimensions
+ {\ifx\poppagedimensions\relax \else
+ \space\the\dimexpr\@@zaheight\relax\space-\space
+ \fi
+ \realfolio}
+
+\def\dodoadaptlayout[#1]%
+ {\getparameters[\??za][\c!height=,\c!lines=0,#1]%
+ \pushpagedimensions
+ \ifcase\@@zalines\relax
+ \showmessage\m!layouts1{\@@zaheight,\realfolio}%
+ \else
+ \showmessage\m!layouts1{\@@zalines\space\v!lines,\realfolio}%
+ \def\@@zaheight{\@@zalines\openlineheight}%
+ \fi
+ \doifelse\@@zaheight\v!max
+ {\balancedimensions\textheight\footerheight\footerheight}
+ {\balancedimensions\textheight\footerheight\@@zaheight}%
+ \ifdim\footerheight<\zeropoint
+ \global\advance\textheight \footerheight
+ \global\footerheight\zeropoint
+ \global\xdef\@@zaheight{\layoutparameter\c!footer\space(\v!max)}%
+ \fi
+ \setvsize
+ \global\pagegoal\vsize % nog corrigeren voor insertions ?
+ \recalculatebackgrounds
+ \global\let\pushpagedimensions\relax
+ \global\let\poppagedimensions\dopoppagedimensions}
+
+\def\doadaptlayout[#1][#2]%
+ {\doifelsenothing{#2}
+ {\dodoadaptlayout[#1]}
+ {\def\docommand##1%
+ {\addtocommalist{##1}\adaptedpages
+ \setgvalue{\??za##1}{\dodoadaptlayout[#2]}}%
+ \processcommalist[#1]\docommand
+ \adaptpagedimensions}}
+
+\def\adaptlayout
+ {\dodoubleempty\doadaptlayout}
+
+% describe interface
+
+%D Centering the paper area on the print area is determined
+%D by the \type {top}, \type {bottom}, \type {left} and \type
+%D {right} parameters.
+
+\def\centerpagebox#1%
+ {\printpaperwidth \paperscale\printpaperwidth
+ \printpaperheight\paperscale\printpaperheight
+ \setbox#1\vbox to \printpaperheight
+ {\@@pptop
+ \hbox to \printpaperwidth
+ {\ifdoublesidedprint
+ \doifbothsides
+ {\@@ppleft \box#1\@@ppright}
+ {\@@ppleft \box#1\@@ppright}
+ {\@@ppright\box#1\@@ppleft }%
+ \else
+ \@@ppleft \box#1\@@ppright
+ \fi}%
+ \par
+ \@@ppbottom}}
+
+\def\offsetprintbox#1%
+ {\ifdim\topoffset=\zeropoint % \relax
+ \ifdim\backoffset=\zeropoint
+ \donefalse
+ \else
+ \donetrue
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \edef\next{\wd#1\the\wd#1\ht#1\the\ht#1\dp#1\the\dp#1}%
+ \setbox#1\vbox
+ {\offinterlineskip
+ \vskip\topoffset
+ \hskip\doifbothsides\backoffset\backoffset{-\backoffset}%
+ \box#1}%
+ \next
+ \fi}
+
+\def\replicatepagebox#1%
+ {\ifnum\@@lynx>\plusone
+ \donetrue
+ \else\ifnum\@@lyny>\plusone
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \setbox#1\vbox
+ {\offinterlineskip
+ \dorecurse\@@lyny
+ {\hbox{\dorecurse\@@lynx{\copy#1\hskip\@@lydx}\unskip}%
+ \vskip\@@lydy}
+ \unskip}%
+ \fi}
+
+\def\orientpagebodybox#1#2#3%
+ {\ifnum#2#3>\zerocount
+ \setbox#1\vbox
+ {\edef\somerotation{\ifdoublesided\ifodd\realpageno#2\else#3\fi\else#2\fi}%
+ \dorotatebox\somerotation\hbox{\box#1}}%
+ \fi}
+
+\def\orientpaperbox#1%
+ {\orientpagebodybox{#1}\paperorientation\paperreverse}
+
+\def\orientprintbox#1%
+ {\orientpagebodybox{#1}\printorientation\printreverse}
+
+\def\mirrorpagebodybox#1#2%
+ {\ifcase#2\or
+ \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
+ \fi}
+
+\def\mirrorpaperbox#1%
+ {\mirrorpagebodybox{#1}\papermirror}
+
+\def\mirrorprintbox#1%
+ {\mirrorpagebodybox{#1}\printmirror}
+
+\def\scalepagebox#1%
+ {\ifdim\@@lyscale\points=\onepoint \else
+ \setbox#1\vbox{\scale[\c!sx=\@@lyscale,\c!sy=\@@lyscale]{\box#1}}%
+ \paperwidth \@@lyscale\paperwidth
+ \paperheight\@@lyscale\paperheight
+ \fi}
+
+\def\negateprintbox#1%
+ {\ifnegateprintbox
+ \negatecolorbox{#1}%
+ \fi}
+
+\def\pagecutmarksymbol {\the\realpageno}
+\def\pagecutmarklength {.5cm}
+\let\pagecutmarktoptext \empty
+\let\pagecutmarkbottomtext \empty
+
+\def\extrapagecutmarkbottomtext
+ {\rlap{\jobname}\hfill\currentdate\space-\space\currenttime\hfill\llap{\realfolio}}
+
+\def\makepagecutbox % #1
+ {\let\cutmarksymbol \pagecutmarksymbol
+ \let\cutmarklength \pagecutmarklength
+ \let\cutmarktoptext \pagecutmarktoptext
+ \let\cutmarkbottomtext\pagecutmarkbottomtext
+ \makecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!on}%
+ {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!page}% only at outer when nx/ny > 0
+ {\makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!empty}%
+ {\let\pagecutmarksymbol\empty
+ \let\pagecutmarktoptext\empty
+ \let\pagecutmarkbottomtext\empty
+ \makepagecutbox}
+
+\setvalue{\??ly:n:\c!marking:\v!text}%
+ {\let\pagecutmarksymbol\empty
+ \let\pagecutmarkbottomtext\extrapagecutmarkbottomtext
+ \makepagecutbox}
+
+\setvalue{\??ly:c:\c!marking:\v!color}%
+ {\doaddpagecolormarks\colormarkbox}
+
+\setvalue{\??ly:c:\c!marking:\v!screen}%
+ {\doaddpagecolormarks\rastermarkbox}
+
+\letvalue{\??ly:c:\c!marking:\v!unknown}\gobbleoneargument
+\letvalue{\??ly:n:\c!marking:\v!unknown}\gobbleoneargument
+
+% \def\addpagecutmarks {\executeifdefined{\??ly:n:\c!marking:\@@lymarking}\gobbleoneargument}
+% \def\addpagecolormarks{\executeifdefined{\??ly:c:\c!marking:\@@lymarking}\gobbleoneargument}
+
+\def\addpagecutmarks {\expandcheckedcsname{\??ly:n:\c!marking:}\@@lymarking\s!unknown}
+\def\addpagecolormarks{\expandcheckedcsname{\??ly:c:\c!marking:}\@@lymarking\s!unknown}
+
+\def\doaddpagecolormarks#1#2%
+ {\makepagecutbox{#2}%
+ \ifnum\horizontalcutmarks>\plustwo \chardef\colormarkoffset\plusfour \fi
+ \ifnum\verticalcutmarks >\plustwo \chardef\colormarkoffset\plusfour \fi
+ #1{#2}}
+
+% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET
+
+\ifx\doifelselayoutsomeline\undefined % defined in page-txt
+ \let\doifelselayoutsomeline\secondofthreearguments
+\fi
+
+\def\compensatevsizeheader {\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}
+\def\compensatevsizefooter {\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}
+\def\globalcompensatevsizeheader{\global\advance\textheight-\dimexpr\headerheight+\headerdistance\relax}
+\def\globalcompensatevsizefooter{\global\advance\textheight-\dimexpr\footerheight+\footerdistance\relax}
+
+\def\compensatevsizeheaderzero{\headerheight\zeropoint\setlayoutdistances}
+\def\compensatevsizefooterzero{\footerheight\zeropoint\setlayoutdistances}
+
+\def\calculatevsizes
+ {\textheight\makeupheight
+ \doifelselayoutsomeline\v!header\compensatevsizeheader\donothing
+ \doifelselayoutsomeline\v!footer\compensatevsizefooter\donothing
+ \setvsizemodes
+ \resetglobal
+ \setvsize}
+
+\def\calculateglobalvsizes
+ {\global\textheight\makeupheight
+ \doifelselayoutsomeline\v!header\globalcompensatevsizeheader\donothing
+ \doifelselayoutsomeline\v!footer\globalcompensatevsizefooter\donothing
+ \setvsizemodes
+ \setvsize}
+
+\def\setvsizemodes
+ {\ifzeropt\headerheight
+ \resetsystemmode\v!header
+ \else
+ \setsystemmode\v!header
+ \fi
+ \ifzeropt\footerheight
+ \resetsystemmode\v!footer
+ \else
+ \setsystemmode\v!footer
+ \fi}
+
+\def\calculatereducedvsizes
+ {\textheight\makeupheight
+ \doifelselayoutsomeline\v!header\compensatevsizeheader\compensatevsizeheaderzero
+ \doifelselayoutsomeline\v!footer\compensatevsizefooter\compensatevsizefooterzero}
+
+\newdimen\innermakeupwidth % special purpose
+\newdimen\innermakeupmargin % special purpose
+
+\chardef\innermakeupcompensation\plusone
+
+\def\compensatedinnermakeupmargin
+ {\dimexpr\ifnum\innermakeupcompensation=\plusone+\innermakeupmargin\else\zeropoint\fi\relax}
+
+\def\freezetextwidth % \makeupwidth may be set to \textwidth
+ {\textwidth\makeupwidth % which is a tricky but valid value
+ \doifsomething{\layoutparameter\c!textwidth}
+ {\textwidth\layoutparameter\c!textwidth}% % local
+ \global\innermakeupwidth\textwidth
+ \doifelsenothing{\layoutparameter\c!textmargin}
+ {\global\innermakeupmargin\zeropoint}
+ {\global\innermakeupmargin\layoutparameter\c!textmargin}%
+ \global\advance\innermakeupwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax
+ \advance\textwidth-\dimexpr\innermakeupmargin+\innermakeupmargin\relax} % local
+
+\def\calculatehsizes
+ {\freezetextwidth
+ \sethsize}
+
+% De onderstaande macro voert commando's uit, afhankelijk van
+% het karakter van het paginanummer.
+%
+% \doifoddpageelse{then-commando}{else-commando}
+
+%D When we start at an even page, we need to swap the layout
+%D differently. We cannot adapt the real page number, since
+%D it is used in cross referencing. The next switch is set
+%D when we start at an even page.
+
+% We could use nested if here plus some \@EAEAEA's but but the
+% next variant has less expansion which is nicer in tracing.
+
+\def\doifoddpageelse {\ifodd\pagenoshift\expandafter\doifoddpageelseyes \else\expandafter\doifoddpageelsenop \fi}
+\def\doifoddpageelseyes{\ifodd\realpageno \expandafter\secondoftwoarguments\else\expandafter\firstoftwoarguments \fi}
+\def\doifoddpageelsenop{\ifodd\realpageno \expandafter\firstoftwoarguments \else\expandafter\secondoftwoarguments\fi}
+
+\let\doifonevenpaginaelse\doifoddpageelse
+
+\def\redoifoddpageelse#1{\doifoddpageelse}
+
+\def\doifbothsidesoverruled
+ {\ifdoublesided
+ \expandafter\redoifoddpageelse
+ \else
+ \expandafter\firstofthreearguments
+ \fi}
+
+\def\doifbothsides% #1 #2 #3
+ {\ifdoublesided
+ \expandafter\doifbothsidesindeed
+ \else
+ \expandafter\firstofthreearguments
+ \fi}
+
+\def\doifbothsidesindeed
+ {\ifsinglesided
+ \expandafter\firstofthreearguments
+ \else
+ \expandafter\redoifoddpageelse
+ \fi}
+
+\newdimen\texthoffset
+
+\def\settexthoffset
+ {\texthoffset\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}}
+
+% The next hack is too tricky as we may shipout more pages:
+%
+% \def\freezepagestatechecks
+% {\the\everyfreezepagestatechecks}
+%
+% \newtoks \everyfreezepagestatechecks
+%
+% \appendtoks
+% \doifbothsides
+% {\let\doifbothsides\firstofthreearguments}%
+% {\let\doifbothsides\secondofthreearguments}%
+% {\let\doifbothsides\thirdofthreearguments}%
+% \rightorleftpageaction
+% {\let\rightorleftpageaction\firstoftwoarguments}%
+% {\let\rightorleftpageaction\secondoftwoarguments}%
+% \doifmarginswapelse
+% {\let\doifmarginswapelse\firstoftwoarguments}%
+% {\let\doifmarginswapelse\secondoftwoarguments}%
+% \to \everyfreezepagestatechecks
+%
+% \prependtoks
+% \freezepagestatechecks
+% \to \everybeforeshipout
+
+\def\goleftonpage
+ {\hskip-\dimexpr\leftmargindistance+\leftmarginwidth+\leftedgedistance+\leftedgewidth\relax}
+
+\def\doifmarginswapelse#1#2%
+ {\doifbothsides{#1}{#1}{#2}}
+
+\def\swapmargins
+ {\doifmarginswapelse\relax\doswapmargins}
+
+\def\doswapmargins
+ {\let\swapmargins \relax % to prevent local swapping
+ \let\doswapmargins\relax % to prevent local swapping
+ \the\everyswapmargins}
+
+\def\rightorleftpageaction
+ {\ifdoublesided
+ \expandafter\rightorleftpageactionindeed
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\rightorleftpageactionindeed
+ {\ifsinglesided
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\doifoddpageelse
+ \fi}
+
+\def\outermarginwidth {\rightorleftpageaction\rightmarginwidth \leftmarginwidth }
+\def\innermarginwidth {\rightorleftpageaction\leftmarginwidth \rightmarginwidth}
+\def\outermargindistance{\rightorleftpageaction\rightmargindistance\leftmargindistance }
+\def\innermargindistance{\rightorleftpageaction\leftmargindistance \rightmargindistance}
+
+\def\outeredgewidth {\rightorleftpageaction\rightedgewidth \leftedgewidth }
+\def\inneredgewidth {\rightorleftpageaction\leftedgewidth \rightedgewidth}
+\def\outeredgedistance {\rightorleftpageaction\rightedgedistance\leftedgedistance }
+\def\inneredgedistance {\rightorleftpageaction\leftedgedistance \rightedgedistance}
+
+\def\outerspacewidth {\rightorleftpageaction\cutspace \backspace}
+\def\innerspacewidth {\rightorleftpageaction\backspace\cutspace }
+
+\def\leftmargintotal {\dimexpr\leftmarginwidth +\leftmargindistance \relax}
+\def\rightmargintotal {\dimexpr\rightmarginwidth+\rightmargindistance\relax}
+\def\leftedgetotal {\dimexpr\leftedgewidth +\leftedgedistance \relax}
+\def\rightedgetotal {\dimexpr\rightedgewidth +\rightedgedistance \relax}
+
+\def\leftsidetotal {\dimexpr\leftmarginwidth +\leftedgetotal \relax}
+\def\rightsidetotal {\dimexpr\rightmarginwidth+\rightedgetotal\relax}
+\def\leftcombitotal {\dimexpr\leftmargintotal +\leftedgetotal \relax}
+\def\rightcombitotal {\dimexpr\rightmargintotal+\rightedgetotal\relax}
+
+\def\innermargintotal {\dimexpr\innermarginwidth+\innermargindistance\relax}
+\def\outermargintotal {\dimexpr\outermarginwidth+\outermargindistance\relax}
+\def\inneredgetotal {\dimexpr\inneredgewidth +\inneredgedistance \relax}
+\def\outeredgetotal {\dimexpr\outeredgewidth +\outeredgedistance \relax}
+
+\def\innercombitotal {\dimexpr\innermargintotal+\inneredgetotal\relax}
+\def\outercombitotal {\dimexpr\outermargintotal+\outeredgetotal\relax}
+\def\innersidetotal {\dimexpr\innermarginwidth+\inneredgetotal\relax}
+\def\outersidetotal {\dimexpr\outermarginwidth+\outeredgetotal\relax}
+
+%D \macros
+%D {startlocallayout}
+%D
+%D These macros should be used with care. They permit local
+%D layouts (as used in fitting pages, see \type {page-app.tex}).
+
+%D This is kind of obsolete now that we have \type
+%D {\definelayout}, so this hack will disappear in future
+%D versions.
+
+\unexpanded\def\startlocallayout
+ {\globalpushmacro\restorepapersize
+ \globalpushmacro\currentlayout}
+
+\unexpanded\def\stoplocallayout
+ {\globalpopmacro\currentlayout
+ \globalpopmacro\restorepapersize
+ \restorepapersize
+ \setuplayout}
+
+%D \macros
+%D {showprint, showframe, showlayout, showsetups}
+%D
+%D We predefine a couple of tracing macros.
+%D
+%D \showsetup{showprint}
+%D \showsetup{showframe}
+%D \showsetup{showlayout}
+%D \showsetup{showsetups}
+%D %showsetup{showmargins}
+
+\fetchruntimecommand \showprint {page-run.mkii}
+\fetchruntimecommand \showframe {page-run.mkii}
+\fetchruntimecommand \showlayout {page-run.mkii}
+\fetchruntimecommand \showsetups {page-run.mkii}
+\fetchruntimecommand \showmargins {page-run.mkii}
+
+%D The default dimensions are quite old and will not change.
+%D The funny fractions were introduced when we went from fixed
+%D dimensions to relative ones. Since \CONTEXT\ is a dutch
+%D package, the dimensions are based on the metric system. The
+%D asymmetrical layout is kind of handy for short
+%D quick||and||dirty stapled documents.
+%D
+%D Although valid, it is not a real good idea to use
+%D dimensions based on the \type {em} unit. First of all,
+%D since there are no fonts loaded yet, this dimension makes
+%D no sense, and second, you would loose track of values,
+%D since they could change while going to a new page,
+%D depending on the current font setting.
+
+\setuplayout
+ [ \c!topspace=.08417508418\paperheight, % 2.5cm
+ \c!top=\zeropoint,
+ \c!topdistance=\zeropoint,
+ \c!header=.06734006734\paperheight, % 2.0cm
+ \c!headerdistance=\zeropoint,
+ \c!height=.84175084175\paperheight, % 25.0cm
+ \c!footerdistance=\layoutparameter\c!headerdistance,
+ \c!footer=.06734006734\paperheight, % 2.0cm
+ \c!bottomdistance=\layoutparameter\c!topdistance,
+ \c!bottom=\zeropoint,
+ \c!backspace=.11904761905\paperwidth, % 2.5cm
+ \c!edge=\zeropoint,
+ \c!edgedistance=\layoutparameter\c!margindistance,
+ \c!margin=.12649983170\paperwidth, % snijwit-2*afstand
+ \c!margindistance=.02008341748\paperwidth, % 12.0pt
+ \c!leftedge=\layoutparameter\c!edge,
+ \c!leftedgedistance=\layoutparameter\c!edgedistance,
+ \c!leftmargin=\layoutparameter\c!margin,
+ \c!leftmargindistance=\layoutparameter\c!margindistance,
+ \c!width=.71428571429\paperwidth, % 15.0cm \dimexpr\
+ \c!rightmargindistance=\layoutparameter\c!margindistance,
+ \c!rightmargin=\layoutparameter\c!margin,
+ \c!rightedgedistance=\layoutparameter\c!edgedistance,
+ \c!rightedge=\layoutparameter\c!edge,
+ \c!veroffset=\zeropoint,
+ \c!bottomspace=\zeropoint,
+ \c!horoffset=\zeropoint,
+ \c!cutspace=\zeropoint,
+ \c!textwidth=, % dangerous option -> centered / local
+ \c!textmargin=, % dangerous option -> both sides
+ \c!textdistance=\zeropoint, % shift down on grid
+ \c!style=,
+ \c!color=,
+ \c!marking=\v!off,
+ \c!location=, % \v!singlesided, but empty is signal
+ \c!scale=1,
+ \c!nx=1,
+ \c!ny=1,
+ \c!dx=\zeropoint,
+ \c!dy=\zeropoint,
+ \c!grid=\v!no,
+ \c!preset=,
+ \c!setups=\systemsetupsprefix\s!default,
+ \c!clipoffset=\zeropoint,
+ \c!lines=0,
+ \c!paper=, % for foxet
+ \c!page=, % for foxet
+ \c!columns=1,
+ \c!columndistance=\zeropoint]
+
+%D First we define a whole range of (DIN) papersizes,
+%D of which the A-series makes most sense. We enable checking.
+
+%D We also set some of the parameters that will be used when
+%D positioning the typeset paper onto the print paper.
+
+\setuppaper % (size) % only used in XY imposition
+ [\c!width=\zeropoint,
+ \c!height=\zeropoint,
+ \c!topspace=\zeropoint,
+ \c!backspace=\zeropoint,
+ \c!dx=\zeropoint,
+ \c!dy=\zeropoint,
+ \c!nx=1,
+ \c!ny=1,
+ \c!method=\v!normal]
+
+\setuppapersize
+ [\c!option=\v!max,
+ \c!top=,
+ \c!bottom=\vss,
+ \c!left=,
+ \c!right=\hss]
+
+\definepapersize [A0] [\c!width=841mm,\c!height=1189mm]
+\definepapersize [A1] [\c!width=594mm,\c!height=841mm]
+\definepapersize [A2] [\c!width=420mm,\c!height=594mm]
+\definepapersize [A3] [\c!width=297mm,\c!height=420mm]
+\definepapersize [A4] [\c!width=210mm,\c!height=297mm]
+\definepapersize [A5] [\c!width=148mm,\c!height=210mm]
+\definepapersize [A6] [\c!width=105mm,\c!height=148mm]
+\definepapersize [A7] [\c!width=74mm,\c!height=105mm]
+\definepapersize [A8] [\c!width=52mm,\c!height=74mm]
+\definepapersize [A9] [\c!width=37mm,\c!height=52mm]
+\definepapersize [A10] [\c!width=26mm,\c!height=37mm]
+
+\definepapersize [B0] [\c!width=1000mm,\c!height=1414mm]
+\definepapersize [B1] [\c!width=707mm,\c!height=1000mm]
+\definepapersize [B2] [\c!width=500mm,\c!height=707mm]
+\definepapersize [B3] [\c!width=353mm,\c!height=500mm] % [\c!width=354mm,\c!height=500mm]
+\definepapersize [B4] [\c!width=250mm,\c!height=353mm] % [\c!width=250mm,\c!height=354mm]
+\definepapersize [B5] [\c!width=176mm,\c!height=250mm] % [\c!width=177mm,\c!height=250mm]
+\definepapersize [B6] [\c!width=125mm,\c!height=176mm] % [\c!width=125mm,\c!height=177mm]
+\definepapersize [B7] [\c!width=88mm,\c!height=125mm]
+\definepapersize [B8] [\c!width=62mm,\c!height=88mm] % [\c!width=63mm,\c!height=88mm]
+\definepapersize [B9] [\c!width=44mm,\c!height=62mm] % [\c!width=44mm,\c!height=63mm]
+\definepapersize [B10] [\c!width=31mm,\c!height=44mm]
+
+\definepapersize [C0] [\c!width=917mm,\c!height=1297mm]
+\definepapersize [C1] [\c!width=648mm,\c!height=917mm] % [\c!width=649mm,\c!height=917mm]
+\definepapersize [C2] [\c!width=458mm,\c!height=648mm] % [\c!width=459mm,\c!height=649mm]
+\definepapersize [C3] [\c!width=324mm,\c!height=458mm] % [\c!width=324mm,\c!height=459mm]
+\definepapersize [C4] [\c!width=229mm,\c!height=324mm]
+\definepapersize [C5] [\c!width=162mm,\c!height=229mm]
+\definepapersize [C6] [\c!width=114mm,\c!height=162mm] % [\c!width=115mm,\c!height=162mm]
+\definepapersize [C7] [\c!width=81mm,\c!height=114mm] % [\c!width=81mm,\c!height=115mm]
+\definepapersize [C8] [\c!width=57mm,\c!height=81mm]
+\definepapersize [C9] [\c!width=40mm,\c!height=57mm]
+\definepapersize [C10] [\c!width=28mm,\c!height=40mm]
+
+%D Per August 2004 the rounding of some (seldom used) sizes
+%D were corrected top the latest DIN specifications. Peter
+%D Rolf came up with these and a few more missing sizes.
+%D Watch out: spaces and slashes!
+
+\definepapersize [4 A0] [\c!width=1682mm,\c!height=2378mm]
+\definepapersize [2 A0] [\c!width=1189mm,\c!height=1682mm]
+\definepapersize [C6/C5] [\c!width=114mm,\c!height=229mm]
+
+%D Because there are no standardized screen sizes, we define
+%D a bunch of sizes with $4:3$ ratios. The \type {S6} size is
+%D nearly as wide as a sheet of \type {A4} paper.
+
+\definepapersize [S3] [\c!width=300pt,\c!height=225pt]
+\definepapersize [S4] [\c!width=400pt,\c!height=300pt]
+\definepapersize [S5] [\c!width=500pt,\c!height=375pt]
+\definepapersize [S6] [\c!width=600pt,\c!height=450pt]
+\definepapersize [S8] [\c!width=800pt,\c!height=600pt]
+\definepapersize [SW] [\c!width=800pt,\c!height=450pt]
+\definepapersize [SM] [\c!width=720pt,\c!height=450pt]
+
+%D These are handy too:
+
+\definepapersize [S33] [\c!width=300pt,\c!height=300pt]
+\definepapersize [S44] [\c!width=400pt,\c!height=400pt]
+\definepapersize [S55] [\c!width=500pt,\c!height=500pt]
+\definepapersize [S66] [\c!width=600pt,\c!height=600pt]
+
+%D One may wonder if \TEX\ should be used for typesetting
+%D \CDROM\ covers, but it does not hurt to have the paper size
+%D ready.
+
+\definepapersize [CD] [\c!width=120mm,\c!height=120mm]
+
+%D The next series is for our English speaking friends who
+%D decided to stick to non metric values. Thanks to Nelson
+%D Beebe for completing the inch based list.
+
+\definepapersize [letter] [\c!width=8.5in,\c!height=11in]
+\definepapersize [ledger] [\c!width=11in,\c!height=17in]
+\definepapersize [tabloid] [\c!width=17in,\c!height=11in]
+
+\definepapersize [legal] [\c!width=8.5in,\c!height=14in]
+\definepapersize [folio] [\c!width=8.5in,\c!height=13in]
+\definepapersize [executive] [\c!width=7.25in,\c!height=10.5in]
+
+\definepapersize [A] [\c!width=8.5in,\c!height=11in] % 1 sheet
+\definepapersize [B] [\c!width=11in,\c!height=17in] % 2 sheets
+\definepapersize [C] [\c!width=17in,\c!height=22in] % 4 sheets
+
+%D The next set is for Tobias Burnus, who gave me the sizes.
+
+\definepapersize [envelope 9] [\c!width=8.88in,\c!height=3.88in]
+\definepapersize [envelope 10] [\c!width=9.5in,\c!height=4.13in]
+\definepapersize [envelope 11] [\c!width=10.38in,\c!height=4.5in]
+\definepapersize [envelope 12] [\c!width=11.0in,\c!height=4.75in]
+\definepapersize [envelope 14] [\c!width=11.5in,\c!height=5.0in]
+\definepapersize [monarch] [\c!width=7.5in,\c!height=3.88in]
+\definepapersize [check] [\c!width=8.58in,\c!height=3.88in]
+\definepapersize [DL] [\c!width=110mm,\c!height=220mm] % [\c!width=220mm,\c!height=110mm]
+\definepapersize [E4] [\c!width=280mm,\c!height=400mm]
+
+%D The next three sets are supplied by Taco:
+
+\definepapersize [RA0] [\c!width=860mm,\c!height=1220mm]
+\definepapersize [RA1] [\c!width=610mm,\c!height=860mm]
+\definepapersize [RA2] [\c!width=430mm,\c!height=610mm]
+\definepapersize [RA3] [\c!width=305mm,\c!height=430mm]
+\definepapersize [RA4] [\c!width=215mm,\c!height=305mm]
+
+%D ISO SRA (supplementary raw A) sizes:
+
+\definepapersize [SRA0] [\c!width=900mm,\c!height=1280mm]
+\definepapersize [SRA1] [\c!width=640mm,\c!height=900mm]
+\definepapersize [SRA2] [\c!width=450mm,\c!height=640mm]
+\definepapersize [SRA3] [\c!width=320mm,\c!height=450mm]
+\definepapersize [SRA4] [\c!width=225mm,\c!height=320mm]
+
+%D Swedish thesis formats:
+
+\definepapersize [G5] [\c!width=169mm,\c!height=239mm]
+\definepapersize [E5] [\c!width=155mm,\c!height=220mm]
+
+%D Industry invention:
+
+\definepapersize [A3plus] [\c!width=329mm,\c!height=483mm]
+
+%D We can now default to a reasonable size. We match the print
+%D paper size with the typeset paper size. This setting should
+%D come after the first layout specification (already done).
+
+\setuppapersize
+ [A4][A4]
+
+%D A few goodies:
+
+\definepapersize
+ [oversized]
+ [ \c!width=\dimexpr\paperwidth +1.5cm\relax,
+ \c!height=\dimexpr\paperheight+1.5cm\relax]
+
+\definepapersize
+ [doublesized]
+ [ \c!width=\dimexpr \paperwidth \relax,
+ \c!height=\dimexpr2\paperheight\relax]
+
+\definepapersize
+ [doubleoversized]
+ [ \c!width=\dimexpr \paperheight+1.5cm\relax,
+ \c!height=\dimexpr2\paperwidth +1.5cm\relax]
+
+%D For orthogonality:
+
+\definepapersize
+ [undersized]
+ [ \c!width=\dimexpr\paperwidth -1.5cm\relax,
+ \c!height=\dimexpr\paperheight-1.5cm\relax]
+
+\definelayout
+ [\v!page]
+ [\c!backspace=\zeropoint,
+ \c!cutspace=\zeropoint,
+ \c!topspace=\zeropoint,
+ \c!bottomspace=\zeropoint,
+ \c!margin=\zeropoint,
+ \c!edge=\zeropoint,
+ \c!header=\zeropoint,
+ \c!footer=\zeropoint,
+ \c!top=\zeropoint,
+ \c!bottom=\zeropoint,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\zeropoint,
+ \c!leftedge=\zeropoint,
+ \c!rightedge=\zeropoint,
+ \c!textdistance=\zeropoint,
+ \c!width=\v!middle,
+ \c!height=\v!middle,
+ \c!lines=0,
+ \c!grid=\v!no]
+
+\definelayout
+ [\v!middle]
+ [\c!width=\v!middle,
+ \c!height=\v!middle]
+
+\protect \endinput
diff --git a/tex/context/base/page-lin.lua b/tex/context/base/page-lin.lua
new file mode 100644
index 000000000..1f2c96251
--- /dev/null
+++ b/tex/context/base/page-lin.lua
@@ -0,0 +1,215 @@
+if not modules then modules = { } end modules ['page-lin'] = {
+ version = 1.001,
+ comment = "companion to page-lin.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- experimental
+
+local trace_numbers = false trackers.register("lines.numbers", function(v) trace_numbers = v end)
+
+local format = string.format
+local texsprint, texwrite, texbox = tex.sprint, tex.write, tex.box
+
+local ctxcatcodes = tex.ctxcatcodes
+local variables = interfaces.variables
+
+nodes = nodes or { }
+nodes.lines = nodes.lines or { }
+nodes.lines.data = nodes.lines.data or { } -- start step tag
+
+storage.register("lines/data", nodes.lines.data, "nodes.lines.data")
+
+-- if there is demand for it, we can support multiple numbering streams
+-- and use more than one attibute
+
+local hlist, vlist, whatsit = node.id('hlist'), node.id('vlist'), node.id('whatsit')
+
+local display_math = attributes.private('display-math')
+local line_number = attributes.private('line-number')
+local line_reference = attributes.private('line-reference')
+
+local current_list = { }
+local cross_references = { }
+local chunksize = 250 -- not used in boxed
+
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local traverse = node.traverse
+local copy_node = node.copy
+local hpack_node = node.hpack
+local insert_node_after = node.insert_after
+local insert_node_before = node.insert_before
+
+local whatsit = node.id("whatsit")
+
+local data = nodes.lines.data
+local last = #data
+
+nodes.lines.scratchbox = nodes.lines.scratchbox or 0
+
+-- cross referencing
+
+function nodes.lines.number(n)
+ n = tonumber(n)
+ local cr = cross_references[n] or 0
+ cross_references[n] = nil
+ return cr
+end
+
+local function resolve(n,m) -- we can now check the 'line' flag (todo)
+ while n do
+ local id = n.id
+ if id == whatsit then -- why whatsit
+ local a = has_attribute(n,line_reference)
+ if a then
+ cross_references[a] = m
+ end
+ elseif id == hlist or id == vlist then
+ resolve(n.list,m)
+ end
+ n = n.next
+ end
+end
+
+function nodes.lines.finalize(t)
+ local getnumber = nodes.lines.number
+ for _,p in next, t do
+ for _,r in next, p do
+ if r.metadata.kind == "line" then
+ local e = r.entries
+ local u = r.userdata
+ e.linenumber = getnumber(e.text or 0) -- we can nil e.text
+ e.conversion = u and u.conversion
+ r.userdata = nil -- hack
+ end
+ end
+ end
+end
+
+local filters = jobreferences.filters
+local helpers = structure.helpers
+
+jobreferences.registerfinalizer(nodes.lines.finalize)
+
+filters.line = filters.line or { }
+
+function filters.line.default(data)
+-- helpers.title(data.entries.linenumber or "?",data.metadata)
+ texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",data.entries.conversion or "numbers",data.entries.linenumber or "0"))
+end
+
+function filters.line.page(data,prefixspec,pagespec) -- redundant
+ helpers.prefixpage(data,prefixspec,pagespec)
+end
+
+function filters.line.linenumber(data) -- raw
+ texwrite(data.entries.linenumber or "0")
+end
+
+-- boxed variant, todo: use number mechanism
+
+nodes.lines.boxed = { }
+
+-- todo: cache setups, and free id no longer used
+-- use interfaces.cachesetup(t)
+
+function nodes.lines.boxed.register(configuration)
+ last = last + 1
+ data[last] = configuration
+ if trace_numbers then
+ logs.report("lines","registering setup %s",last)
+ end
+ return last
+end
+
+function nodes.lines.boxed.setup(n,configuration)
+ local d = data[n]
+ if d then
+ if trace_numbers then
+ logs.report("lines","updating setup %s",n)
+ end
+ for k,v in next, configuration do
+ d[k] = v
+ end
+ else
+ if trace_numbers then
+ logs.report("lines","registering setup %s (br)",n)
+ end
+ data[n] = configuration
+ end
+ return n
+end
+
+local the_left_margin = nodes.the_left_margin
+
+local function check_number(n,a,skip) -- move inline
+ local d = data[a]
+ if d then
+ local s = d.start or 1
+ current_list[#current_list+1] = { n, s }
+ if not skip and s % d.step == 0 then
+ local tag = d.tag or ""
+ texsprint(ctxcatcodes, format("\\makenumber{%s}{%s}{%s}{%s}{%s}{%s}\\endgraf",tag,s,n.shift,n.width,the_left_margin(n.list),n.dir))
+ if trace_numbers then
+ logs.report("numbers","making number %s for setup %s: %s (%s)",#current_list,a,s,d.continue or "no")
+ end
+ else
+ texsprint(ctxcatcodes, "\\skipnumber\\endgraf")
+ end
+ d.start = s + 1 -- (d.step or 1)
+ end
+end
+
+function nodes.lines.boxed.stage_one(n)
+ current_list = { }
+ local head = texbox[n]
+ if head then
+ local list = head.list
+ local last_a, skip = nil, false
+ for n in traverse_id(hlist,list) do -- attr test here and quit as soon as zero found
+ if n.height == 0 and n.depth == 0 then
+ -- skip funny hlists
+ else
+ local a = has_attribute(n.list,line_number)
+ if a and a > 0 then
+ if last_a ~= a then
+ if data[a].method == variables.next then
+ skip = true
+ end
+ last_a = a
+ end
+ if has_attribute(n,display_math) then
+ if nodes.is_display_math(n) then
+ check_number(n,a,skip)
+ end
+ else
+ -- the following test fails somehow (change in luatex?)
+ -- if node.first_character(n.list) then
+ check_number(n,a,skip)
+ -- end
+ end
+ skip = false
+ end
+ end
+ end
+ end
+end
+
+function nodes.lines.boxed.stage_two(n,m)
+ if #current_list > 0 then
+ m = m or nodes.lines.scratchbox
+ local t, i = { }, 0
+ for l in traverse_id(hlist,texbox[m].list) do
+ t[#t+1] = copy_node(l)
+ end
+ for i=1,#current_list do
+ local li = current_list[i]
+ local n, m, ti = li[1], li[2], t[i]
+ ti.next, n.list = n.list, ti
+ resolve(n,m)
+ end
+ end
+end
diff --git a/tex/context/base/page-lin.mkii b/tex/context/base/page-lin.mkii
new file mode 100644
index 000000000..a04804ce6
--- /dev/null
+++ b/tex/context/base/page-lin.mkii
@@ -0,0 +1,312 @@
+%D \module
+%D [ file=page-lin, % copied from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Line Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Line Numbering}
+
+\unprotect
+
+\newif\ifnumberinglines
+\newif\iftypesettinglines
+
+\newcount\linenumber
+\newcount\linestepper
+
+\chardef\linenumberlocation=0
+
+\newtoks\beforeeverylinenumbering
+\newtoks\aftereverylinenumbering
+
+% het gebruik van \setlocalreference scheelt een hash entry
+
+\def\dodoshowlinenumber % for use elsewhere, to be extended
+ {\doplacelinenumber
+ \global\advance\linenumber \plusone}
+
+\def\completelinenumber
+ {\@@rnleft\convertnumber\@@rnconversion\linenumber\@@rnright}
+
+\def\dosetuplinenumbering[#1]%
+ {\getparameters[\??rn][\c!start=1,\c!step=1,#1]%
+ \global\linenumber\plusone}
+
+\def\setuplinenumbering
+ {\dosingleargument\dosetuplinenumbering}
+
+\def\dostartnummerenLINE
+ {\EveryPar{\placelinenumber}} % why not append to everypar ? better
+
+\def\dostopnummerenLINE
+ {\the\aftereverylinenumbering
+ \egroup}
+
+\def\dostartnummerenVERB
+ {\EveryLine{\placelinenumber}}
+
+\def\dostopnummerenVERB
+ {\the\aftereverylinenumbering
+ \egroup}
+
+\newevery \everylinenumber \relax
+
+\def\dodoplacelinenumber
+ {% beware of em's, the font is already switched !
+ \setbox\scratchbox\hbox
+ {\setbox0\hbox{\@@rncommand{\completelinenumber}}\vsmashbox0%
+ \ifcase\linenumberlocation
+ \iftypesettinglines % hack
+ \expandafter\llap
+ \else
+ \expandafter\rlap
+ \fi{\hbox to \@@rnwidth{\box0\hss}}% was \llap, nog testen !!
+ \or
+ \inleftmargin
+ {\forgetall
+ \doifelse\@@rnwidth\v!margin
+ {\hsize\leftmarginwidth}{\hsize\@@rnwidth}%
+ \alignedline\@@rnalign\v!right{\box0\hskip\@@rndistance}}%
+ \else
+ \inrightmargin
+ {\forgetall
+ \doifelse\@@rnwidth\v!margin
+ {\hsize\rightmarginwidth}{\hsize\@@rnwidth}%
+ \alignedline\@@rnalign\v!left{\hskip\@@rndistance\box0}}%
+ \fi}%
+ \vsmashbox\scratchbox
+ \box\scratchbox
+ \the\everylinenumber}
+
+\def\complexstartlinenumbering[#1]%
+ {\doifnot{#1}\v!continue
+ {\doifnumberelse{#1}
+ {\global\linenumber#1\relax}
+ {\doifelsenothing\@@rnstart
+ {\global\linenumber\plusone}
+ {\global\linenumber\@@rnstart}}}%
+ \chardef\linenumberlocation\zerocount
+ \processaction
+ [\@@rnlocation]
+ [ \v!inmargin=>\chardef\linenumberlocation\plusone,
+ \v!inleft=>\chardef\linenumberlocation\plusone,
+ \v!inright=>\chardef\linenumberlocation\plustwo,
+ \v!margin=>\chardef\linenumberlocation\plusone]%
+ % \v!text=>\chardef\linenumberlocation\zerocount,
+ %\s!unknown=>\chardef\linenumberlocation\zerocount,
+ %\s!default=>\chardef\linenumberlocation\zerocount]%
+ \doifnot\@@rnwidth\v!margin
+ {\freezedimenmacro\@@rnwidth
+ \ifcase\linenumberlocation % text
+ \advance\leftskip\@@rnwidth\relax
+ \fi}%
+ \freezedimenmacro\@@rndistance
+ \chardef\@@rn@@rnmethod
+ \ifprocessingverbatim\zerocount\else\iftypesettinglines\plusone\else\plustwo\fi\fi
+ \processaction
+ [\@@rnmethod]
+ [ \v!type=>\chardef\@@rn@@rnmethod\zerocount,
+ \v!line=>\chardef\@@rn@@rnmethod\plusone,
+ \v!text=>\chardef\@@rn@@rnmethod\plustwo,
+ \v!file=>\chardef\@@rn@@rnmethod\plusthree]%
+ \ifcase\@@rn@@rnmethod % verbatim, line by line
+ \typesettinglinestrue
+ \let\dostartnummeren\dostartnummerenVERB
+ \let\stoplinenumbering\dostopnummerenVERB
+ \def\placelinenumber
+ {\doplacelinenumber
+ \global\advance\linenumber \plusone}%
+ \or % text, line by line
+ \let\dostartnummeren\dostartnummerenLINE
+ \let\stoplinenumbering\dostopnummerenLINE
+ \def\placelinenumber
+ {\doplacelinenumber
+ \global\advance\linenumber \plusone}%
+ \or % text, whole lot
+ \let\dostartnummeren\dostartnummerenPAR
+ \let\stoplinenumbering\dostopnummerenPAR
+ \def\placelinenumber
+ {\global\advance\linenumber \minusone
+ \doplacelinenumber}%
+ \or % verbatim, selective line by line
+ \typesettinglinestrue
+ \let\dostartnummeren\dostartnummerenVERB
+ \let\stoplinenumbering\dostopnummerenVERB
+ \def\placelinenumber
+ {\global\linenumber\verbatimlinenumber
+ \global\advance\linenumber \minusone
+ \doplacelinenumber}%
+ \fi
+ \dostartnummeren}
+
+\def\startlinenumbering
+ {\bgroup
+ \the\beforeeverylinenumbering
+ \numberinglinestrue
+ \complexorsimpleempty\startlinenumbering}
+
+\def\donoplacelinenumber
+ {\the\everylinenumber}
+
+\def\doplacelinenumber
+ {\ifnum\linenumber<\@@rnstart\relax
+ \donoplacelinenumber
+ \else
+ \ifnum\numexpr(\linenumber/\@@rnstep)*\@@rnstep\relax=\linenumber
+ \doattributes\??rn\c!style\c!color\dodoplacelinenumber
+ \else
+ \donoplacelinenumber
+ \fi
+ \fi}
+
+\def\someline[#1]%
+ {\dolinereference0[#1]\ignorespaces}
+
+\def\startline[#1]%
+ {\dolinereference1[#1]\ignorespaces}
+
+\def\stopline[#1]%
+ {\removelastspace\dolinereference2[#1]}
+
+\def\inline#1[#2]%
+ {\doifelsenothing{#1}
+ {\doifinstringelse{--}\currenttextreference
+ {\in{\leftlabeltext\v!lines}{\rightlabeltext\v!lines}[\@@rnprefix#2]}
+ {\in{\leftlabeltext\v!line }{\rightlabeltext\v!line }[\@@rnprefix#2]}}
+ {\in{#1}[\@@rnprefix#2]}}
+
+\def\dostartnummerenPAR
+ {\beginofshapebox
+ \doglobal\newcounter\linereference}
+
+% localcrossref heroverwegen
+
+\def\setlinereference#1#2#3#4%
+ {\setxvalue{lrf:#1}{\noexpand\dogetlinereference{#2}{#3}{#4}}}
+
+\def\getlinereference#1%
+ {\getvalue{lrf:#1}}
+
+\def\dogetlinereference#1#2#3%
+ {\edef\linereferencename{#1}%
+ \edef\linereferenceline{#2}%
+ \edef\linereferenceplus{#3}}
+
+% 1 xxx xxx xxx xxx xxx xxx xxx
+% 2 xxx yyy yyy yyy yyy yyy yyy <= start y
+% 3 yyy yyy yyy yyy yyy yyy yyy
+% 4 yyy yyy yyy yyy yyy xxx xxx <= stop y
+% 5 xxx xxx xxx xxx xxx xxx xxx
+
+\def\dolinereference#1[#2]%
+ {\bgroup
+ \dimen0=\strutdp
+ \doif\@@rnreferencing\v!on
+ {\doglobal\increment\linereference
+ % start 1=>(n=y,l=0,p=1)
+ % stop 2=>(n=y,l=0,p=2)
+ \setlinereference{\linereference}{\@@rnprefix#2}{0}{#1}%
+ \advance\dimen0 \linereference sp}%
+ \prewordbreak
+ \vrule \!!width \zeropoint \!!depth \dimen0 \!!height \zeropoint
+ \prewordbreak
+ \egroup}
+
+\def\dostopnummerenPAR % dp's -> openstrutdepth
+ {\endofshapebox
+ \checkreferences
+ \linestepper\zerocount
+ \reshapebox{\global\advance\linestepper \plusone}%
+ \global\advance\linenumber \linestepper
+ \doifelse\@@rnreferencing\v!on
+ {\reshapebox % We are going back!
+ {\global\advance\linenumber \minusone
+ \dimen0=\dp\shapebox
+ \advance\dimen0 -\strutdp\relax
+ \ifdim\dimen0>\zeropoint
+ % 1=>4 | 2=>4 1=>2
+ % start 1=>(n=y,l=2,p=1)
+ % stop 2=>(n=y,l=4,p=2)
+ \dostepwiserecurse\plusone{\number\dimen0}\plusone
+ {\getlinereference\recurselevel
+ \setlinereference\recurselevel
+ {\linereferencename}{\the\linenumber}{\linereferenceplus}}%
+ \fi}%
+ \global\advance\linenumber \linestepper
+ \ifnum\linereference>\zerocount % anders vreemde loop in paragraphs+recurse
+ \dorecurse\linereference
+ {\getlinereference\recurselevel
+ \ifnum\linereferenceplus=2 % stop
+ % ref y: text = 4 / Kan dit buiten referentie mechanisme om?
+ \expanded{\setlocalcrossreference
+ {\referenceprefix\linereferencename}{}{}{\linereferenceline}}%
+ \fi}%
+ \dorecurse\linereference
+ {\getlinereference\recurselevel
+ \ifnum\linereferenceplus<2 % start / lone
+ \ifnum\linereferenceplus=1 % start
+ \getreferenceelements\linereferencename % text = 4
+ \ifnum\linereferenceline<0\currenttextreference\relax % 0 prevents error
+ \edef\linereferenceline{\linereferenceline--\currenttextreference}%
+ \fi
+ \fi
+ \expanded{\setlocalcrossreference
+ {\referenceprefix\linereferencename}{}{}{\linereferenceline}}%
+ \fi}%
+ \global\let\scratchline\linenumber % We are going back!
+ \reshapebox
+ {\doglobal\decrement\scratchline
+ \hbox
+ {\dorecurse\linereference
+ {\getlinereference\recurselevel
+ \getreferenceelements\linereferencename
+ \beforesplitstring\currenttextreference--\at--\to\firstline
+ \ifnum\firstline=\scratchline\relax
+ % beter een rawtextreference, i.e. expanded
+ % \textreference[\linereferencename]{\currenttextreference}%
+ \rawtextreference\s!lin\linereferencename\currenttextreference
+ \expanded{\setlocalcrossreference
+ {\referenceprefix\linereferencename}{}{}{0}}% ==done
+ \fi}%
+ \dimen0\dp\shapebox
+ \advance\dimen0 -\strutdp\relax
+ \ifdim\dimen0>\zeropoint
+ \dp\shapebox\strutdp
+ \fi
+ \placelinenumber\box\shapebox}}% no \strut !
+ \else
+ \reshapebox{\hbox{\placelinenumber\box\shapebox}}% no \strut !
+ \fi}
+ {\reshapebox{\global\advance\linenumber \minusone}%
+ \global\advance\linenumber \linestepper
+ \reshapebox{\hbox{\placelinenumber\box\shapebox}}}% no \strut !
+ \global\advance\linenumber \linestepper
+ \flushshapebox
+ \the\aftereverylinenumbering
+ \egroup}
+
+\setuplinenumbering
+ [\c!method=,
+ \c!conversion=\v!numbers,
+ \c!start=1,
+ \c!step=1,
+ \c!location=\v!margin,
+ \c!style=,
+ \c!color=,
+ \c!prefix=,
+ \c!referencing=\v!on,
+ \c!width=\ifcase\linenumberlocation2em\else\v!margin\fi,
+ \c!left=,
+ \c!right=,
+ \c!command=,
+ \c!distance=\zeropoint,
+ \c!align=\ifcase\linenumberlocation\v!right\or\v!right\or\v!left\fi]
+
+\protect \endinput
diff --git a/tex/context/base/page-lin.mkiv b/tex/context/base/page-lin.mkiv
new file mode 100644
index 000000000..51f027639
--- /dev/null
+++ b/tex/context/base/page-lin.mkiv
@@ -0,0 +1,498 @@
+%D \module
+%D [ file=page-lin,
+%D version=2007.11.29,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Line Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% generic or not ... maybe not bother too much and simplify to mkiv only
+
+\writestatus{loading}{ConTeXt Core Macros / Line Numbering}
+
+\unprotect
+
+% todo: save settings
+
+% low level interface
+
+\registerctxluafile{page-lin}{1.001}
+
+\definesystemattribute[line-number] \chardef\linenumberattribute \dogetattributeid{line-number}
+\definesystemattribute[line-reference] \chardef\linereferenceattribute \dogetattributeid{line-reference}
+
+\appendtoksonce \attribute\linenumberattribute \attributeunsetvalue \to \everyforgetall
+\appendtoksonce \attribute\displaymathattribute\plusone \to \everybeforedisplayformula
+
+\newcount\linenumber
+\newbox \linenumberscratchbox
+\newcount\linenumberchunk
+\newcount\linerefcounter
+
+\newconditional\tracelinenumbering
+
+\def\mkprocesstextlinenumbers#1%
+ {\setbox\linenumberscratchbox\vbox{\forgetall\offinterlineskip\ctxlua{nodes.lines.boxed.stage_one(\number#1)}}%
+ \ctxlua{nodes.lines.boxed.stage_two(\number#1,\number\linenumberscratchbox)}}% can move to lua code
+
+% id nr shift width leftskip dir
+
+% \def\mkskiplinenumber #1#2#3#4#6#5{}
+% \def\mkleftlinenumber #1#2#3#4#5#6{\hbox{\llap{#2\quad\hskip#3\scaledpoint}}}
+% \def\mkrightlinenumber#1#2#3#4#5#6{\hbox{\rlap{\hskip#4\scaledpoint\hskip#3\scaledpoint\quad#2}}}
+
+\let\makenumber\gobblesixarguments
+
+\newconditional\boxcontentneedsprocessing
+
+\def\mkdoprocesspagecontents #1{\mkaddtextlinenumbers{#1}\plusone \plusone}
+\def\mkdoprocessboxcontents #1{\mkaddtextlinenumbers{#1}\plusone \plusone}
+\def\mkdoprocesscolumncontents#1{\mkaddtextlinenumbers{#1}\currentcolumn\nofcolumns}
+
+\def\mklinenumberparameters
+ {continue = "\linenumberparameter\c!continue",
+ start = \linenumberparameter\c!start,
+ step = \linenumberparameter\c!step,
+ method = "\linenumberparameter\c!method",
+ tag = "\currentlinenumbering"}
+
+\def\mklinenumberupdateparameters
+ {continue = "\linenumberparameter\c!continue"}
+
+\def\mkdefinetextlinenumbering
+ {\setxvalue{ln:c:\currentlinenumbering}{\number\ctxlua{tex.sprint(nodes.lines.boxed.register({\mklinenumberparameters}))}}}
+
+\def\mkupdatetextlinenumbering
+ {\ctxlua{nodes.lines.boxed.setup(\getvalue{ln:c:\currentlinenumbering},{\mklinenumberupdateparameters})}}
+
+\def\mkstarttextlinenumbering#1#2% always when assignment
+ {\globallet\mkprocesspagecontents \mkdoprocesspagecontents
+ \globallet\mkprocesscolumncontents\mkdoprocesscolumncontents
+ \global\settrue\boxcontentneedsprocessing % see core-rul.mkiv
+ \edef\currentlinenumbering{#1}%
+ \ifcase#2\relax
+ \mkupdatetextlinenumbering % continue
+ \or
+ \mkdefinetextlinenumbering % only when assignment
+ \fi
+ \attribute\linenumberattribute\getvalue{ln:c:\currentlinenumbering}\relax}
+
+\def\mksetuptextlinenumbering
+ {\ifcsname ln:c:\currentlinenumbering\endcsname
+ \ctxlua{nodes.lines.boxed.setup(\getvalue{ln:c:\currentlinenumbering},{\mklinenumberparameters})}%
+ \fi}
+
+\def\mkstoptextlinenumbering
+ {\attribute\linenumberattribute\attributeunsetvalue}
+
+% we could make this a bit more efficient by putting the end reference
+% in the same table as the start one but why make things complex ...
+
+\let\dofinishlinereference\dofinishfullreference
+
+\def\mksomelinereference#1#2#3%
+ {\dontleavehmode\begingroup
+ \global\advance\linerefcounter\plusone
+ \attribute\linereferenceattribute\linerefcounter
+ #3%
+ % for the moment we use a simple system i.e. no prefixes etc .. todo: store as number
+ \expanded{\dodosetreference{line}{#2}{conversion=\linenumberparameter\c!conversion}{\the\linerefcounter}}% kind labels userdata text
+ \endgroup}
+
+\def\mkstartlinereference#1{\mksomelinereference{#1}{lr:b:#1}{}\ignorespaces}
+\def\mkstoplinereference #1{\removeunwantedspaces\mksomelinereference{#1}{lr:e:#1}{}}
+
+\def\mklinestartreference#1[#2]{\in{#1}[lr:b:#2]} % not interfaced
+\def\mklinestopreference #1[#2]{\in{#1}[lr:e:#2]} % not interfaced
+
+% high level interface
+
+\newif\ifnumberinglines
+\newif\iftypesettinglines
+
+\let\currentlinenumbering\empty
+
+\chardef\linenumbermode = 1 % 0=continue, 1=restart
+\chardef\linenumberlocation = 1 % 0=middle, 1=left, 2=right, 3=inner, 4=outer, 5=text, 6=begin, 7=end
+\chardef\linenumberalignment = 5 % 0=middle, 1=left, 2=right, 5=auto
+
+\newevery \beforeeverylinenumbering \relax
+\newevery \aftereverylinenumbering \relax
+\newevery \everylinenumber \relax
+
+\newdimen\linenumberwidth
+\newdimen\linenumberdistance
+
+\unexpanded\def\definelinenumbering
+ {\dosingleempty\dodefinelinenumbering}
+
+\def\dodefinelinenumbering[#1]%
+ {\edef\currentlinenumbering{#1}%
+ \mkdefinetextlinenumbering}
+
+\unexpanded\def\setuplinenumbering
+ {\dodoubleempty\dosetuplinenumbering}
+
+\def\dosetuplinenumbering[#1][#2]%
+ {\ifsecondargument
+ \def\currentlinenumbering{#1}%
+ \getparameters[\??rn#1][#2]%
+ \else
+ \let\currentlinenumbering\empty
+ \getparameters[\??rn][#1]%
+ \fi
+ \mksetuptextlinenumbering}
+
+\def\linenumberparameter#1%
+ {\csname\??rn\ifcsname\??rn\currentlinenumbering#1\endcsname\currentlinenumbering\fi#1\endcsname}
+
+\def\linenumberattributes
+ {\doattributes{\??rn\ifcsname\??rn\currentlinenumbering\c!style\endcsname\currentlinenumbering\fi}}
+
+\setuplinenumbering
+ [\c!conversion=\v!numbers,
+ \c!start=1,
+ \c!step=1,
+ \c!method=\v!first,
+ \c!continue=\v!no,
+ \c!location=\v!left,
+ \c!style=,
+ \c!color=,
+ \c!width=2em,
+ \c!left=,
+ \c!right=,
+ \c!command=,
+ \c!distance=\zeropoint,
+ \c!align=\v!auto]
+
+\definelinenumbering
+
+\unexpanded\def\startlinenumbering
+ {\dodoubleempty\dostartlinenumbering}
+
+% no intermediate changes in values, define a class, otherwise each range
+% would need a number
+
+% todo: text
+
+\expandafter\chardef\csname\??rn:l:\v!middle \endcsname \zerocount
+\expandafter\chardef\csname\??rn:l:\v!left \endcsname \plusone
+\expandafter\chardef\csname\??rn:l:\v!margin \endcsname \plusone
+\expandafter\chardef\csname\??rn:l:\v!inmargin\endcsname \plusone
+\expandafter\chardef\csname\??rn:l:\v!inleft \endcsname \plusone
+\expandafter\chardef\csname\??rn:l:\v!right \endcsname \plustwo
+\expandafter\chardef\csname\??rn:l:\v!inright \endcsname \plustwo
+\expandafter\chardef\csname\??rn:l:\v!inner \endcsname \plusthree
+\expandafter\chardef\csname\??rn:l:\v!outer \endcsname \plusfour
+\expandafter\chardef\csname\??rn:l:\v!text \endcsname \plusfive
+\expandafter\chardef\csname\??rn:l:\v!begin \endcsname \plussix
+\expandafter\chardef\csname\??rn:l:\v!end \endcsname \plusseven
+
+\expandafter\chardef\csname\??rn:a:\v!middle \endcsname \zerocount
+\expandafter\chardef\csname\??rn:a:\v!right \endcsname \plusone
+\expandafter\chardef\csname\??rn:a:\v!flushleft \endcsname \plusone
+\expandafter\chardef\csname\??rn:a:\v!left \endcsname \plustwo
+\expandafter\chardef\csname\??rn:a:\v!flushright\endcsname \plustwo
+\expandafter\chardef\csname\??rn:a:\v!auto \endcsname \plusfive
+
+\def\dostartlinenumbering[#1][#2]% todo: c!continue
+ {\begingroup
+ \chardef\linenumbermode\plusone
+ \ifsecondargument
+ \def\currentlinenumbering{#1}%
+ \doifassignmentelse{#2}
+ {\getparameters[\??rn\currentlinenumbering][#2]}
+ {\doifnumberelse{#2}% downward compatible
+ {\setvalue{\??rn#1\c!start}{#2}}%
+ {\doif{#2}\v!continue
+ {\getparameters[\??rn\currentlinenumbering][\c!continue=\v!yes]%
+ \chardef\linenumbermode\zerocount}}}%
+ \else\iffirstargument
+ \doifnumberelse{#1}% downward compatible
+ {\let\currentlinenumbering\empty
+ \setvalue{\??rn\c!start}{#1}}%
+ {\doifelse{#1}\v!continue
+ {\let\currentlinenumbering\empty
+ \getparameters[\??rn\currentlinenumbering][\c!continue=\v!yes]%
+ \chardef\linenumbermode\zerocount}
+ {\def\currentlinenumbering{#1}}}%
+ \fi\fi
+ \doif{\linenumberparameter\c!continue}\v!yes
+ {\chardef\linenumbermode\zerocount}%
+ \numberinglinestrue
+ \the\beforeeverylinenumbering
+ \mkstarttextlinenumbering\currentlinenumbering\linenumbermode}
+
+\unexpanded\def\stoplinenumbering
+ {\mkstoptextlinenumbering
+ \the\aftereverylinenumbering
+ \endgroup}
+
+% number placement
+
+\let\mkskiplinenumber \gobblesixarguments
+
+\def\mkdoinnerlinenumber{\doifoddpageelse\mkdoleftlinenumber\mkdorightlinenumber}
+\def\mkdoouterlinenumber{\doifoddpageelse\mkdorightlinenumber\mkdoleftlinenumber}
+
+\def\mkleftlinenumber
+ {\ifcase\linenumberlocation
+ \expandafter\mkdoleftlinenumber
+ \or
+ \expandafter\mkdoleftlinenumber
+ \or
+ \expandafter\mkdoleftlinenumber
+ \or
+ \expandafter\mkdoinnerlinenumber
+ \or
+ \expandafter\mkdoouterlinenumber
+ \or
+ \expandafter\mkdotextlinenumber
+ \or
+ \expandafter\mkdobeginlinenumber
+ \or
+ \expandafter\mkdoendlinenumber
+ \fi}
+
+\def\mkrightlinenumber
+ {\ifcase\linenumberlocation
+ \expandafter\mkdorightlinenumber
+ \or
+ \expandafter\mkdorightlinenumber
+ \or
+ \expandafter\mkdorightlinenumber
+ \or
+ \expandafter\mkdoouterlinenumber
+ \or
+ \expandafter\mkdoinnerlinenumber
+ \or
+ \expandafter\mkdotextlinenumber
+ \or
+ \expandafter\mkdoendlinenumber
+ \or
+ \expandafter\mkdobeginlinenumber
+ \fi}
+
+\def\mkaddtextlinenumbers#1#2#3% box col max
+ {\bgroup
+ \chardef\linenumberbox #1\relax
+ \chardef\linenumbercolumn #2\relax
+ \chardef\linenumberlastcolumn#3\relax
+ \fullrestoreglobalbodyfont
+ \def\skipnumber{\hbox{}}%
+ \let\makenumber\maketextlinenumber
+ \mkprocesstextlinenumbers\linenumberbox
+ \egroup}
+
+\def\maketextlinenumber#1%
+ {\edef\currentlinenumbering{#1}%
+ \chardef\linenumberlocation \executeifdefined{\??rn:l:\linenumberparameter\c!location}\plusone % left
+ \chardef\linenumberalignment\executeifdefined{\??rn:a:\linenumberparameter\c!align }\plusfive % auto
+ \ifcase\linenumberlastcolumn\relax
+ \let\domakenumber\mkskiplinenumber
+ \or
+ % one column
+ \ifcase\linenumberlocation
+ \let\domakenumber\mkskiplinenumber
+ % hm
+ \or
+ \let\domakenumber\mkleftlinenumber
+ \or
+ \let\domakenumber\mkrightlinenumber
+ \or % inner
+ \let\domakenumber\mkdoinnerlinenumber
+ \or % outer
+ \let\domakenumber\mkdoouterlinenumber
+ \or % text
+ \let\domakenumber\mkdotextlinenumber
+ \or
+ \let\domakenumber\mkdobeginlinenumber
+ \or
+ \let\domakenumber\mkdoendlinenumber
+ \fi
+ \else\ifcase\linenumbercolumn\relax
+ \let\domakenumber\mkskiplinenumber
+ \or
+ \let\domakenumber\mkleftlinenumber
+ \ifcase\linenumberlocation\or
+ \chardef\linenumberlocation\plusone
+ \or
+ \chardef\linenumberlocation\plustwo
+ \else
+ \chardef\linenumberlocation\plusone
+ \or
+ \chardef\linenumberlocation\plusone
+ \or
+ \chardef\linenumberlocation\plusone
+ \or
+ \chardef\linenumberlocation\plusone % todo
+ \or
+ \chardef\linenumberlocation\plusone % todo
+ \fi
+ \else
+ \let\domakenumber\mkrightlinenumber
+ \ifcase\linenumberlocation\or
+ \chardef\linenumberlocation\plustwo
+ \or
+ \chardef\linenumberlocation\plusone
+ \or
+ \chardef\linenumberlocation\plustwo
+ \or
+ \chardef\linenumberlocation\plustwo
+ \or
+ \chardef\linenumberlocation\plustwo % todo
+ \or
+ \chardef\linenumberlocation\plustwo % todo
+ \fi
+ \fi\fi
+ \domakenumber{#1}}
+
+\def\mkdotextlinenumber #1#2#3#4#5#6% beware, one needs so compensate for this in the width !
+ {\hbox{\dosomelinenumber{#1}{2}{#2}{#5}\hskip#3\scaledpoint}}
+
+\def\mkdotextlinenumber #1#2#3#4#5#6% beware, one needs so compensate for this in the width !
+ {\hbox{\dosomelinenumber{#1}{2}{#2}{#5}\hskip#3\scaledpoint}}
+
+\def\mkdoleftlinenumber #1#2#3#4#5#6%
+ {\naturalhbox to \zeropoint
+ {\ifcase\istltdir#6\else \hskip-#4\scaledpoint \fi
+ \llap{\dosomelinenumber{#1}{2}{#2}{#5}\kern#3\scaledpoint}}}
+
+\def\mkdorightlinenumber#1#2#3#4#5#6%
+ {\naturalhbox to \zeropoint
+ {\ifcase\istltdir#6\else \hskip-#4\scaledpoint \fi
+ \rlap{\hskip#4\scaledpoint\hskip#3\scaledpoint\dosomelinenumber{#1}{1}{#2}{#5}}}}
+
+\def\mkdobeginlinenumber #1#2#3#4#5#6%
+ {\ifcase\istltdir#6\relax
+ \chardef\linenumberlocation\plusone
+ \expandafter\mkdoleftlinenumber
+ \else
+ \chardef\linenumberlocation\plustwo
+ \expandafter\mkdorightlinenumber
+ \fi{#1}{#2}{#3}{#4}{#5}{#6}}
+
+\def\mkdoendlinenumber#1#2#3#4#5#6%
+ {\ifcase\istltdir#6\relax
+ \chardef\linenumberlocation\plustwo
+ \expandafter\mkdorightlinenumber
+ \else
+ \chardef\linenumberlocation\plusone
+ \expandafter\mkdoleftlinenumber
+ \fi{#1}{#2}{#3}{#4}{#5}{#6}}
+
+\def\dosomelinenumber#1#2#3#4% tag 1=left|2=right linenumber leftskip
+ {\begingroup
+ \def\currentlinenumbering{#1}%
+ \def\linenumber{#3}% unsafe
+ \doifelse{\linenumberparameter\c!width}\v!margin
+ {\linenumberwidth\leftmarginwidth}
+ {\linenumberwidth\linenumberparameter\c!width}%
+ \linenumberdistance\linenumberparameter\c!distance\relax
+ \ifcase#2\relax\or\hskip\linenumberdistance\fi\relax
+ \ifnum\linenumberlocation=\plusfive
+ \scratchdimen\dimexpr#4\scaledpoint-\linenumberdistance\relax
+ \chardef\linenumberlocation\plusone
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \ifcase\linenumberalignment
+ \chardef\linenumberlocation\zerocount % middle
+ \or
+ \chardef\linenumberlocation\plusone % left
+ \or
+ \chardef\linenumberlocation\plustwo % right
+ \fi
+ \ifconditional\tracelinenumbering\ruledhbox\else\hbox\fi to \linenumberwidth
+ {\ifcase\linenumberlocation
+ \hss % middle
+ \or
+ % left
+ \or
+ \hss % right
+ \or
+ \doifoddpageelse\relax\hss % inner
+ \or
+ \doifoddpageelse\hss\relax % outer
+ \fi
+ \linenumberattributes\c!style\c!color
+ {\linenumberparameter\c!command
+ {\linenumberparameter\c!left
+ \convertnumber{\linenumberparameter\c!conversion}{#3}%
+ \linenumberparameter\c!right}}%
+ \ifcase\linenumberlocation
+ \hss % middle
+ \or
+ \hss % left
+ \or
+ % right
+ \or
+ \doifoddpageelse\hss\relax % inner
+ \or
+ \doifoddpageelse\relax\hss % outer
+ \fi}%
+ \ifcase#2\relax\or\or\hskip\linenumberdistance\fi\relax
+ \hskip-\scratchdimen
+ \the\everylinenumber
+ \endgroup}
+
+% left right inner outer
+
+% align: \alignedline\@@rnalign\v!right{\box0\hskip\@@rndistance}
+
+% referencing
+
+\def\someline [#1]{\mkstartlinereference{#1}\mkstoplinereference{#1}}
+\unexpanded\def\startline[#1]{\mkstartlinereference{#1}}
+\unexpanded\def\stopline [#1]{\mkstoplinereference {#1}}
+
+\def\mkshowstartlinereference#1%
+ {\ifconditional\tracelinenumbering
+ \setbox\scratchbox\hbox{\llap
+ {\vrule\!!width\onepoint\!!depth\strutdp\!!height.8\strutht\raise.85\strutht\hbox{\llap{\tt\txx#1}}}}%
+ \smashbox\scratchbox\box\scratchbox
+ \fi}
+\def\mkshowstoplinereference#1%
+ {\ifconditional\tracelinenumbering
+ \setbox\scratchbox\hbox{\rlap
+ {\raise.85\strutht\hbox{\rlap{\tt\txx#1}}\vrule\!!width\onepoint\!!depth\strutdp\!!height.8\strutht}}%
+ \smashbox\scratchbox\box\scratchbox
+ \fi}
+
+\def\mkstartlinereference#1{\mksomelinereference{#1}{lr:b:#1}{\mkshowstartlinereference{#1}}\ignorespaces}
+\def\mkstoplinereference #1{\removeunwantedspaces\mksomelinereference{#1}{lr:e:#1}{\mkshowstoplinereference{#1}}}
+
+% eventually we will do this in lua
+
+\def\currentreferencelinenumber{\ctxlua{jobreferences.filter("linenumber")}}
+
+\def\doifelsesamelinereference#1#2#3%
+ {\doifreferencefoundelse{lr:b:#1}
+ {\edef\fline{\currentreferencelinenumber}%
+ \doifreferencefoundelse{lr:e:#1}
+ {\edef\tline{\currentreferencelinenumber}%
+ %[\fline,\tline]
+ \ifx\fline\tline#2\else#3\fi}
+ {\unknownreference{#1}#2}}
+ {\unknownreference{#1}#2}}
+
+\def\inline#1[#2]%
+ {\doifelsenothing{#1}
+ {\doifelsesamelinereference{#2}
+ {\in{\leftlabeltext\v!line}{\rightlabeltext\v!line}[lr:b:#2]}
+ {\in{\leftlabeltext\v!lines}{}[lr:b:#2]--\in{}{\rightlabeltext\v!lines}[lr:e:#2]}}
+ {\doifelsesamelinereference{#2}
+ {\in{#1}[lr:b:#2]}
+ {\in{#1}[lr:b:#2]--\in[lr:e:#2]}}}
+
+\def\inlinerange[#1]%
+ {\doifelsesamelinereference{#1}
+ {\in[lr:b:#1]}
+ {\in[lr:b:#1]--\in[lr:e:#1]}}
+
+\protect \endinput
diff --git a/tex/context/base/page-log.mkii b/tex/context/base/page-log.mkii
new file mode 100644
index 000000000..18c7991b1
--- /dev/null
+++ b/tex/context/base/page-log.mkii
@@ -0,0 +1,202 @@
+%D \module
+%D [ file=page-log, % moved here from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Logos,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Logos}
+
+\unprotect
+
+%D Although logos can conveniently be implemented on top of
+%D background and text areas, we provide a dedicated mechanism
+%D here. One reason is that such a separate mechanism cannot
+%D interfere with the other ones, but an even more important
+%D reason is that logos are kind of special in the sense that
+%D they have a short life span and may change after the first
+%D page.
+
+%D \macros
+%D {recalculatelogos,addlogobackground}
+%D
+%D The interface to the other low level page building routines
+%D is provided by a macro that signals changes in layout
+%D specifications:
+%D
+%D \starttyping
+%D \recalculatelogos
+%D \stoptyping
+%D
+%D as well as a simple placement macro:
+%D
+%D \starttyping
+%D \addlogobackground <box>
+%D \stoptyping
+%D
+%D In no way the following boolean switch should be used
+%D directly.
+
+\newif\ifnewlogos
+
+\def\recalculatelogos
+ {\global\newlogostrue}
+
+%D The current state of logos is registered in a status
+%D variable \type {\logostatus}.
+%D
+%D \starttabulate[|l|l|l|]
+%D \NC 0 \NC don't place \NC remains 0 \NC \NR
+%D \NC 1 \NC place now \NC remains 1 \NC \NR
+%D \NC 2 \NC calulate and place \NC becomes 1 \NC \NR
+%D \NC 3 \NC calculate and place once \NC becomes 2 \NC \NR
+%D \stoptabulate
+
+\chardef\logostatus=0
+
+\def\addlogobackground#1% todo: dimension spec
+ {\ifcase\logostatus \else
+ \ifcase\logostatus
+ % no logos to take care of
+ \or % 1
+ \ifnewlogos
+ \chardef\logostatus2
+ \setlogoboxes
+ \chardef\logostatus1
+ \global\newlogosfalse
+ \fi
+ \or % 2
+ \setlogoboxes
+ \chardef\logostatus1
+ \or % 3
+ \setlogoboxes
+ \global\chardef\logostatus2
+ \fi
+ \setbox#1\vbox
+ {\offinterlineskip
+ \doifmarginswapelse
+ {\copy\leftlogos}
+ {\copy\rightlogos}
+ \box#1}%
+ \fi}
+
+%D For efficiency reasons (and since logos seldom change inside
+%D a document) we can save the left and right hand (or first
+%D and following page) logos in boxes. The areas are slightly
+%D different from the ones used in backgrounds and text
+%D placement, but still related to the page layout. The {\em
+%D left} and {\em right edge}, as well as {\em top} and {\em
+%D bottom} touch the bounding box of the paper and are
+%D therefore not the sams as their background adn text
+%D counterparts. In addition there are {\em left}, {\em right}
+%D and {\em middle} areas as well as a {\em page} one.
+
+\newbox\leftlogos
+\newbox\rightlogos
+
+\def\setlogoboxes
+ {\showmessage\m!layouts7\empty
+ \dosetlogobox\leftlogos\relax
+ \ifdoublesided
+ \dosetlogobox\rightlogos\doswapmargins
+ \fi}
+
+\def\dosetlogobox#1#2%
+ {\global\setbox#1\vbox to \paperheight
+ {\dontcomplain % needed here ?
+ \calculatereducedvsizes % needed here ?
+ \offinterlineskip
+ #2\relax
+ \vskip-\topspace
+ \dodosetlogobox\v!top\blap
+ \vskip\topspace
+ \dodosetlogobox\v!header\blap
+ \vskip\dimexpr\headerheight+\headerdistance\relax
+ \dodosetlogobox\v!text\blap
+ \vskip\dimexpr\textheight+\footerdistance+\footerheight\relax
+ \dodosetlogobox\v!footer \tlap
+ \vfilll
+ \dodosetlogobox\v!bottom\tlap
+ \vskip\topspace}
+ \smashbox#1}
+
+\def\dodosetlogobox#1#2%
+ {\hbox % width equals \makeupwidth
+ {\def\docommand##1%
+ {\donefalse
+ \ifnum\logostatus=3 \ExpandBothAfter
+ \doifinset{\getvalue{\??lo#1##1}}\requestedlogos\donetrue
+ \else
+ \doifvalue{\??lo#1##1\c!state}\v!start\donetrue
+ \fi
+ \ifdone
+ #2{\hbox{\getvalue{\??lo#1##1\c!command}}}%
+ \fi}%
+ \def\dodocommand##1##2##3##4##5##6%
+ {\hsmash
+ {\hskip-\texthoffset
+ \hbox to \paperwidth
+ {\rlap{\docommand##1}\hss\llap{\docommand##6}}%
+ \hskip-\paperwidth
+ \hbox to \paperwidth
+ {\hskip\texthoffset
+ \hskip-\leftmarginwidth
+ \hskip-\leftmargindistance
+ \hbox to \leftmarginwidth{\docommand##2\hss}%
+ \hskip\leftmargindistance
+ \hbox to \makeupwidth{\docommand##3\hss\docommand##4}%
+ \hskip\rightmargindistance
+ \hbox to \rightmarginwidth{\hss\docommand##5}%
+ \hfill}}}%
+ \normalbaselines
+ \settexthoffset
+ \hsmash
+ {\hbox to \makeupwidth{\hss\docommand\c!middle\hss}}%
+ \hsmash
+ {\hskip-\texthoffset
+ \hbox to \paperwidth{\docommand\v!page\hss}}%
+ \swapmargins
+ \doifbothsidesoverruled
+ {\dodocommand
+ \v!leftedge \v!leftmargin \v!left
+ \v!right \v!rightmargin \v!rightedge}
+ {\dodocommand
+ \v!leftedge \v!leftmargin \v!left
+ \v!right \v!rightmargin \v!rightedge}
+ {\dodocommand
+ \v!rightedge \v!rightmargin \v!right
+ \v!left \v!leftmargin \v!leftedge}}}
+
+%D The user interface is relatively simple and provides
+%D macros for assigning logos to logo areas as well as
+%D forcing placement.
+%D
+%D \showsetup{definelogo}
+%D \showsetup{placelogos}
+
+\let\definedlogos \empty
+\let\requestedlogos\empty
+
+\long\def\dodefinelogo[#1][#2][#3][#4]%
+ {\addtocommalist{#1}\definedlogos
+ \long\setvalue{\??lo#2#3}{#1}%
+ \getparameters[\??lo#2#3][#4]%
+ \global\chardef\logostatus2 }
+
+\def\definelogo
+ {\doquadrupleargument\dodefinelogo}
+
+\def\placelogos
+ {\dosingleempty\doplacelogos}
+
+\def\doplacelogos[#1]%
+ {\xdef\requestedlogos{\iffirstargument#1\else\definedlogos\fi}%
+ \global\chardef\logostatus3 }
+
+\protect \endinput
diff --git a/tex/context/base/page-mak.mkii b/tex/context/base/page-mak.mkii
new file mode 100644
index 000000000..040feb1d2
--- /dev/null
+++ b/tex/context/base/page-mak.mkii
@@ -0,0 +1,234 @@
+%D \module
+%D [ file=page-mak, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Simple MakeUp,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / MakeUp}
+
+\unprotect
+
+%D \macros
+%D {definemakeup, setupmakeup, startmakeup}
+%D
+%D A makeup is a separate page, like a title page or colofon.
+%D There is one standard makeup page, but you can define more
+%D if needed.
+%D
+%D \starttyping
+%D \startstandardmakeup
+%D My Fancy Title
+%D \stopstandardmakeup
+%D \stoptyping
+%D
+%D The associated commands are:
+%D
+%D \showsetup{definemakeup}
+%D \showsetup{setupmakeup}
+%D \showsetup{startmakeup}
+
+\def\definemakeup
+ {\dodoubleargument\dodefinemakeup}
+
+\def\dodefinemakeup[#1][#2]%
+ {\getparameters
+ [\??do#1]%
+ [\c!width=\innermakeupwidth, % example in manual / was \makeupwidth
+ \c!height=\textheight, % example in manual
+ \c!voffset=\!!zeropoint, % example in manual
+ \c!hoffset=\!!zeropoint, % example in manual
+ \c!commands=,
+ \c!setups=,
+ \c!page=\v!right,
+ \c!doublesided=\v!empty,
+ \c!before=,
+ \c!top=\vss,
+ \c!bottom=\vss,
+ \c!after=,
+ \c!bottomstate=\v!normal,
+ \c!topstate=\v!normal,
+ \c!textstate=\v!normal,
+ \c!headerstate=\v!stop,
+ \c!footerstate=\v!stop,
+ \c!pagestate=\v!stop, % in manual ! ! !
+ \c!color=,
+ \c!align=,
+ #2]%
+ \setvalue{\e!start#1\e!makeup}{\startmakeup[#1]}%
+ \setvalue{\e!stop #1\e!makeup}{\stopmakeup}}
+
+\def\setupmakeup
+ {\dodoubleargument\dosetupmakeup}
+
+\def\dosetupmakeup[#1]%
+ {\getparameters[\??do#1]}
+
+%D This will save us some 375 bytes in the format file.
+
+\def\makeupparameter#1{\getvalue{\??do\currentmakeup#1}}
+
+%D The \type{\start}||\type{\stop} macros are used for both
+%D the direct and indirect way. The parameterless call will
+%D build a simple box.
+
+\newtoks\everymakeup
+
+\appendtoks \postponemarks \to \everymakeup
+
+\let\currentmakeup\empty
+
+\def\startmakeup
+ {\dodoubleempty\dostartmakeup}
+
+\def\dostartmakeup[#1][#2]%
+ {\bgroup
+ \edef\currentmakeup{#1}%
+ \the\everymakeup
+ \iffirstargument
+ \setupmakeup[\currentmakeup][#2]%
+ \let\stopmakeup\dodostopmakeup
+ \expandafter \dodostartmakeup
+ \else
+ \let\stopmakeup\donostopmakeup
+ \expandafter \donostartmakeup
+ \fi}
+
+%D The simple case:
+
+\def\donostartmakeup % textwidth ?
+ {\page
+ \setupheader[\c!state=\v!empty]%
+ \setupfooter[\c!state=\v!empty]%
+ \setsystemmode\v!makeup
+ \vbox to \textheight\bgroup\hsize\textwidth}
+
+\def\donostopmakeup
+ {\egroup
+ \flushmarks % new, here, else empty pages
+ \page
+ \egroup}
+
+%D The normal one:
+
+\newbox\makeupbox
+
+\def\dodostartmakeup
+ {\doifvaluesomething{\??do\currentmakeup\c!page}
+ {\ExpandFirstAfter\page[\makeupparameter\c!page]}%
+ \pagetype[\currentmakeup]%
+ \setsystemmode\v!makeup
+ \setupmakeuplayout
+ \makeupparameter\c!commands % hm, what is this one doing here ?
+ \startregistercolor[\makeupparameter\c!color]%
+ \forgetall % else indented flush
+ \global\setbox\makeupbox\vbox to \makeupparameter\c!height
+ \bgroup
+% \forgetall
+ \setups[\makeupparameter\c!setups]%
+ \hsize\makeupparameter\c!width
+ \doifsomething{\makeupparameter\c!align}
+ {\setupalign[\makeupparameter\c!align]}%
+ \makeupparameter\c!top}
+
+\def\dodostopmakeup
+ {\endgraf
+ \makeupparameter\c!bottom
+ \egroup
+ \flushmarks % new, here, else empty pages
+ \stopregistercolor
+ \doflushmakeup
+ \egroup
+ \calculatehsizes
+ \calculatevsizes}
+
+%D Selective page processing is handled here. (Why?)
+
+\def\doflushmakeup
+ {\ifprocessingpages
+ \ifpageselected
+ \doshipoutmakeup
+ \fi
+ \else
+ \ifpageselected \else
+ \doshipoutmakeup
+ \fi
+ \fi
+ \ifselectingpages
+ \global\pageselectedfalse
+ \fi}
+
+% \def\pushpagestate{\globalpushmacro\@@pnstate}
+% \def\poppagestate {\globalpopmacro \@@pnstate}
+
+\def\doshipoutmakeup
+ {\pushpagestate % new
+ \makeupparameter\c!before
+ \setbox\makeupbox\vbox{\hbox{\color[\makeupparameter\c!color]{\box\makeupbox}}}%
+ % \ifgridsnapping
+ % new per 22/6/2006
+ \ifdim\ht\makeupbox>\vsize
+ \ht\makeupbox\vsize
+ \fi
+ % \fi
+ \box\makeupbox
+ \setuppagenumber[\c!state=\makeupparameter\c!pagestate]%
+ \setupmakeuplayout
+ \page
+ \makeupparameter\c!after
+ \relax % voor fi
+ \ifdoublesided \ifodd\realpageno\else
+ \processaction
+ [\makeupparameter\c!doublesided]
+ [ \v!yes=>\null
+ \page,
+ \v!empty=>{\setupmakeuplayout
+ \page[\v!blank]%
+ \null
+ \page}]%
+ \fi \fi
+ \poppagestate} % new
+
+%D The text surrounding the main body text can be influenced
+%D by setting their associated status variables. The
+%D connection between them is made by the following macro
+
+\def\setupmakeuplayout
+ {\setupfooter[\c!state=\makeupparameter\c!footerstate]%
+ \setupheader[\c!state=\makeupparameter\c!headerstate]%
+ \setuptext [\c!state=\makeupparameter\c!textstate]%
+ \setupbottom[\c!state=\makeupparameter\c!bottomstate]%
+ \setuptop [\c!state=\makeupparameter\c!topstate]%
+ % this is needed, but no \setuplayout here; fails in texexec --fig=c
+ \recalculatelayout}
+
+%D The standard page template is defined as follows:
+
+\definemakeup
+ [\v!standard]
+ [\c!width=\innermakeupwidth,
+ \c!height=\textheight,
+ \c!voffset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,
+ \c!page=\v!right,
+ \c!doublesided=\v!empty]
+
+\definemakeup
+ [\v!text]
+ [\c!topstate=\v!start,
+ \c!headerstate=\v!start,
+ \c!textstate=\v!start,
+ \c!footerstate=\v!start,
+ \c!bottomstate=\v!start,
+ \c!doublesided=\v!no,
+ \c!page=\v!yes,
+ \c!top=\pseudostrut\ignorespaces,
+ \c!bottom=\obeydepth\vss]
+
+\protect \endinput
diff --git a/tex/context/base/page-mak.mkiv b/tex/context/base/page-mak.mkiv
new file mode 100644
index 000000000..fd89a45ff
--- /dev/null
+++ b/tex/context/base/page-mak.mkiv
@@ -0,0 +1,233 @@
+%D \module
+%D [ file=page-mak, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Simple MakeUp,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / MakeUp}
+
+\unprotect
+
+%D \macros
+%D {definemakeup, setupmakeup, startmakeup}
+%D
+%D A makeup is a separate page, like a title page or colofon.
+%D There is one standard makeup page, but you can define more
+%D if needed.
+%D
+%D \starttyping
+%D \startstandardmakeup
+%D My Fancy Title
+%D \stopstandardmakeup
+%D \stoptyping
+%D
+%D The associated commands are:
+%D
+%D \showsetup{definemakeup}
+%D \showsetup{setupmakeup}
+%D \showsetup{startmakeup}
+
+\unexpanded\def\definemakeup
+ {\dodoubleargument\dodefinemakeup}
+
+\def\dodefinemakeup[#1][#2]%
+ {\getparameters
+ [\??do#1]%
+ [\c!width=\innermakeupwidth, % example in manual / was \makeupwidth
+ \c!height=\textheight, % example in manual
+ \c!voffset=\!!zeropoint, % example in manual
+ \c!hoffset=\!!zeropoint, % example in manual
+ \c!commands=,
+ \c!setups=,
+ \c!page=\v!right,
+ \c!doublesided=\v!empty,
+ \c!before=,
+ \c!top=\vss,
+ \c!bottom=\vss,
+ \c!after=,
+ \c!bottomstate=\v!normal,
+ \c!topstate=\v!normal,
+ \c!textstate=\v!normal,
+ \c!headerstate=\v!stop,
+ \c!footerstate=\v!stop,
+ \c!pagestate=\v!stop, % in manual ! ! !
+ \c!color=,
+ \c!align=,
+ #2]%
+ \setvalue{\e!start#1\e!makeup}{\startmakeup[#1]}%
+ \setvalue{\e!stop #1\e!makeup}{\stopmakeup}}
+
+\unexpanded\def\setupmakeup
+ {\dodoubleargument\dosetupmakeup}
+
+\def\dosetupmakeup[#1]%
+ {\getparameters[\??do#1]}
+
+%D This will save us some 375 bytes in the format file.
+
+\def\makeupparameter#1{\getvalue{\??do\currentmakeup#1}}
+
+%D The \type{\start}||\type{\stop} macros are used for both
+%D the direct and indirect way. The parameterless call will
+%D build a simple box.
+
+\newtoks\everymakeup
+
+\appendtoks \postponemarks \to \everymakeup
+
+\let\currentmakeup\empty
+
+\unexpanded\def\startmakeup
+ {\dodoubleempty\dostartmakeup}
+
+\def\dostartmakeup[#1][#2]%
+ {\bgroup
+ \edef\currentmakeup{#1}%
+ \the\everymakeup
+ \iffirstargument
+ \setupmakeup[\currentmakeup][#2]%
+ \let\stopmakeup\dodostopmakeup
+ \expandafter \dodostartmakeup
+ \else
+ \let\stopmakeup\donostopmakeup
+ \expandafter \donostartmakeup
+ \fi}
+
+%D The simple case:
+
+\def\donostartmakeup % textwidth ?
+ {\page
+ \setupheader[\c!state=\v!empty]%
+ \setupfooter[\c!state=\v!empty]%
+ \setsystemmode\v!makeup
+ \vbox to \textheight\bgroup\hsize\textwidth}
+
+\def\donostopmakeup
+ {\egroup
+ \flushmarks % new, here, else empty pages
+ \page
+ \egroup}
+
+%D The normal one:
+
+\newbox\makeupbox
+
+\def\dodostartmakeup
+ {\doifvaluesomething{\??do\currentmakeup\c!page}
+ {\ExpandFirstAfter\page[\makeupparameter\c!page]}%
+ \pagetype[\currentmakeup]%
+ \setsystemmode\v!makeup
+ \setupmakeuplayout
+ \makeupparameter\c!commands % hm, what is this one doing here ?
+ \forgetall % else indented flush
+ \global\setbox\makeupbox\vbox to \makeupparameter\c!height
+ \bgroup
+ \doifsomething{\makeupparameter\c!color}{\startcolor[\makeupparameter\c!color]}% can be made faster
+ \doprocesslocalsetups{\makeupparameter\c!setups}%
+ \hsize\makeupparameter\c!width
+ \doifsomething{\makeupparameter\c!align}
+ {\setupalign[\makeupparameter\c!align]}%
+ \makeupparameter\c!top}
+
+\def\dodostopmakeup
+ {\endgraf
+ \makeupparameter\c!bottom
+ \doifsomething{\makeupparameter\c!color}{\stopcolor}%
+ \egroup
+ \flushmarks % new, here, else empty pages
+ \doflushmakeup
+ \egroup
+ \calculatehsizes
+ \calculatevsizes}
+
+%D Selective page processing is handled here. (Why?)
+
+\def\doflushmakeup
+ {\ifprocessingpages
+ \ifpageselected
+ \doshipoutmakeup
+ \fi
+ \else
+ \ifpageselected \else
+ \doshipoutmakeup
+ \fi
+ \fi
+ \ifselectingpages
+ \global\pageselectedfalse
+ \fi}
+
+% \def\pushpagestate{\globalpushmacro\@@pnstate}
+% \def\poppagestate {\globalpopmacro \@@pnstate}
+
+\def\doshipoutmakeup
+ {\pushpagestate % new
+ \makeupparameter\c!before
+ \setbox\makeupbox\vbox{\hbox{\color[\makeupparameter\c!color]{\box\makeupbox}}}%
+ % \ifgridsnapping
+ % new per 22/6/2006
+ \ifdim\ht\makeupbox>\vsize
+ \ht\makeupbox\vsize
+ \fi
+ % \fi
+ \box\makeupbox
+ \setuppagenumber[\c!state=\makeupparameter\c!pagestate]%
+ \setupmakeuplayout
+ \page
+ \makeupparameter\c!after
+ \relax % voor fi
+ \ifdoublesided \ifodd\realpageno\else
+ \processaction
+ [\makeupparameter\c!doublesided]
+ [ \v!yes=>\null
+ \page,
+ \v!empty=>{\setupmakeuplayout
+ \page[\v!blank]%
+ \null
+ \page}]%
+ \fi \fi
+ \poppagestate} % new
+
+%D The text surrounding the main body text can be influenced
+%D by setting their associated status variables. The
+%D connection between them is made by the following macro
+
+\unexpanded\def\setupmakeuplayout
+ {\setupfooter[\c!state=\makeupparameter\c!footerstate]%
+ \setupheader[\c!state=\makeupparameter\c!headerstate]%
+ \setuptext [\c!state=\makeupparameter\c!textstate]%
+ \setupbottom[\c!state=\makeupparameter\c!bottomstate]%
+ \setuptop [\c!state=\makeupparameter\c!topstate]%
+ % this is needed, but no \setuplayout here; fails in texexec --fig=c
+ \recalculatelayout}
+
+%D The standard page template is defined as follows:
+
+\definemakeup
+ [\v!standard]
+ [\c!width=\innermakeupwidth,
+ \c!height=\textheight,
+ \c!voffset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,
+ \c!page=\v!right,
+ \c!doublesided=\v!empty]
+
+\definemakeup
+ [\v!text]
+ [\c!topstate=\v!start,
+ \c!headerstate=\v!start,
+ \c!textstate=\v!start,
+ \c!footerstate=\v!start,
+ \c!bottomstate=\v!start,
+ \c!doublesided=\v!no,
+ \c!page=\v!yes,
+ \c!top=\pseudostrut\ignorespaces,
+ \c!bottom=\obeydepth\vss]
+
+\protect \endinput
diff --git a/tex/context/base/page-mar.mkii b/tex/context/base/page-mar.mkii
new file mode 100644
index 000000000..96223bafe
--- /dev/null
+++ b/tex/context/base/page-mar.mkii
@@ -0,0 +1,867 @@
+%D \module
+%D [ file=page-mar, % moved here from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Marginal Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for margin words is one of the reasons for writing
+%D \CONTEXT. Over time support for marginal content has been
+%D extended en enhanced. Therefore it's always good to watch
+%D out for unexpected side effects.
+
+\writestatus{loading}{ConTeXt Page Macros / Maginal Things}
+
+\unprotect
+
+%D There are three categories and their historically grown meaning is
+%D as follows:
+%D
+%D marginlines: these are flushed relative to the start of a line and
+%D need to be invoked there.
+%D
+%D marginwords: these can be issued in the text flow and will migrate
+%D sidewards; in spite of the name, it can be a paragraph of text as
+%D well, but normally it's words.
+%D
+%D margintexts: these can be set beforehand and are flushed at the
+%D next paragraph of text (of header)
+%D
+%D While these mechanisms were rather separated, they now are slightly
+%D more integrated. Instead of low level instances we now have a mechanism
+%D for defining additional ones.
+
+%D \macros
+%D {inleftedge,inleftmargin,inrightmargin,inrightedge}
+%D
+%D The fast and clean way of putting things in the margin is
+%D using \type{\rlap} or \type{\llap}. Unfortunately these
+%D macro's don't handle indentation, left and right skips. We
+%D therefore embed them in some macro's that (force and)
+%D remove the indentation and restore it afterwards.
+
+\def\definemarginline
+ {\dodoubleargument\dodefinemarginline}
+
+\def\dodefinemarginline[#1][#2]%
+ {\getparameters
+ [\??im\??im#1]
+ [\c!location=\v!left,
+ \c!distance=\zeropoint,
+ \c!width=\leftmarginwidth,
+ \c!hoffset=\leftmargindistance,
+ \c!command=,
+ #2]%
+ \unexpanded\setvalue{#1}{\dohandlemarginline{#1}}}
+
+\def\marginlineparameter #1{\csname\??im\??im\currentmarginline#1\endcsname}
+\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}}
+
+\def\dohandlemarginline#1% #2
+ {\def\currentmarginline{#1}%
+ \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}} % {#2}
+
+\def\doleftmarginline#1#2% #1 is redundant (we can remove it when we group dohandlemarginline; maybe ...
+ {\pushindentation
+ \llap
+ {\def\currentmarginline{#1}%
+ \postsignalrightpage
+ \hsize\marginlineparameter\c!width\relax
+ \marginlineexecuter\c!command\firstofoneargument{#2}\relax
+ \hskip\dimexpr
+ +\leftskip
+ +\compensatedinnermakeupmargin
+ +\marginlineparameter\c!hoffset
+ +\marginlineparameter\c!distance
+ \relax}%
+ \popindentation
+ \ignorespaces}
+
+\def\dorightmarginline#1#2% #1 is redundant
+ {\pushindentation
+ \rlap
+ {\def\currentmarginline{#1}%
+ \postsignalrightpage
+ \hskip\dimexpr
+ +\hsize
+ -\rightskip
+ +\compensatedinnermakeupmargin
+ +\marginlineparameter\c!hoffset
+ +\marginlineparameter\c!distance
+ \relax
+ \hsize\marginlineparameter\c!width
+ \marginlineexecuter\c!command\firstofoneargument{#2}}%
+ \popindentation
+ \ignorespaces}
+
+\long\def\installmarginlinehandler#1#2{\setvalue{\s!do\??im\??im#1}{#2}}
+
+\installmarginlinehandler \v!left {\doleftmarginline}
+\installmarginlinehandler \v!right {\dorightmarginline}
+\installmarginlinehandler \v!inner {\presignalrightpage\doifrightpageelse\doleftmarginline \dorightmarginline}
+\installmarginlinehandler \v!outer {\presignalrightpage\doifrightpageelse\dorightmarginline\doleftmarginline }
+
+\definemarginline[inleftmargin] [\c!location=\v!left, \c!width=\leftmarginwidth, \c!distance=\leftmargindistance, \c!hoffset=\zeropoint]
+\definemarginline[inrightmargin][\c!location=\v!right,\c!width=\rightmarginwidth,\c!distance=\rightmargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inleftedge] [\c!location=\v!left, \c!width=\leftedgewidth, \c!distance=\leftedgedistance, \c!hoffset=\leftmargintotal]
+\definemarginline[inrightedge] [\c!location=\v!right,\c!width=\rightedgewidth, \c!distance=\rightedgedistance, \c!hoffset=\rightmargintotal]
+
+\definemarginline[inoutermargin][\c!location=\v!outer,\c!width=\outermarginwidth,\c!distance=\outermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[ininnermargin][\c!location=\v!inner,\c!width=\innermarginwidth,\c!distance=\innermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inouteredge] [\c!location=\v!outer,\c!width=\outeredgewidth, \c!distance=\outeredgedistance, \c!hoffset=\outermargintotal]
+\definemarginline[ininneredge] [\c!location=\v!inner,\c!width=\inneredgewidth, \c!distance=\inneredgedistance, \c!hoffset=\innermargintotal]
+
+\definemarginline[atleftmargin] [\c!location=\v!left, \c!command=\lrlap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+\definemarginline[atrightmargin][\c!location=\v!right,\c!command=\rllap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+
+\ifx\lrlap\undefined \def\lrlap#1{\llap{\rlap{#1}}} \fi
+\ifx\rllap\undefined \def\rllap#1{\rlap{\llap{#1}}} \fi
+
+\def\lrlap#1{\llap{\rlap{#1}}}
+\def\rllap#1{\rlap{\hskip\hsize\llap{#1}}}
+
+%D We want to keep things efficient and therefore only handle
+%D situations like:
+%D
+%D \startbuffer
+%D \inleftedge {fine} some text \par
+%D \strut \inleftmargin {fine} some text \par
+%D \noindent \inrightmargin {fine} some text \par
+%D \noindent \strut \inrightedge {fine} some text \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which looks like:
+%D
+%D \bgroup
+%D \getbuffer
+%D \parindent 30pt
+%D \getbuffer
+%D \egroup
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \def\TestLine#1#2{\backgroundline[#1]{\strut\white\tttf#2~\recurselevel}}
+%D
+%D \startbuffer
+%D \inleftmargin {\TestLine{red} {lm}} test test test \par
+%D \inrightmargin{\TestLine{green} {rm}} test test test \par
+%D \inleftedge {\TestLine{red} {le}} test test test \par
+%D \inrightedge {\TestLine{green} {re}} test test test \par
+%D \inoutermargin{\TestLine{blue} {om}} test test test \par
+%D \ininnermargin{\TestLine{yellow}{im}} test test test \par
+%D \inouteredge {\TestLine{blue} {oe}} test test test \par
+%D \ininneredge {\TestLine{yellow}{ie}} test test test \par
+%D \atleftmargin {\TestLine{red} {alm}} \hfill test \par
+%D \atrightmargin{\TestLine{green} {arm}} test \hfill \par
+%D \stopbuffer
+%D
+%D \dorecurse{40}\getbuffer \page
+%D \stoptyping
+
+%D New, yet undocumented:
+%D
+%D used for pascal:
+%D
+%D \starttyping
+%D \index {test} test \index {west} west \index {rest} rest
+%D
+%D \startnarrower
+%D \placeregister[index][alternative=b,command=\atleftmargin]
+%D \stopnarrower
+%D \stoptyping
+
+% todo: compensate distance when setuplayout[textwidth=..]
+% todo: generalize margin/edge model, now too much duplication
+
+%D The next bunch of macros looks messy which is due to its
+%D multi-purpose character.
+
+\chardef\margincontentdisplacement \zerocount
+\let \margincontentdistance \!!zeropoint
+\let \margincontenthoffset \!!zeropoint
+\def \margincontentlines {1}
+\def \margincontenttag {0}
+\let \margincontentseparator \empty
+\def \margincontentstrutheight {\strutht}
+
+\newcount\margincontentlevel
+\newdimen\margincontentheight
+
+\def\setupinmargin
+ {\dodoubleempty\dosetupinmargin}
+
+\def\dosetupinmargin[#1][#2]%
+ {\ifsecondargument
+ \processcommalist[#1]{\dodosetupinmargin[#2]}% becomes [#2]{##1}
+ \else
+ \getparameters[\??im][#1]%
+ \fi}
+
+% \def\dodosetupinmargin[#1]#2% [settings]{class}
+% {\checkinmargin[#2]%
+% \getparameters[\??im#2][#1]}
+
+\def\dodosetupinmargin[#1]#2% [settings]{class}
+ {\checkinmargin[#2]%
+ \getparameters[\??im#2][#1]%
+ % will become an \everyinmarginsetup thing
+ \ifcase\executeifdefined{\??im#2\c!sidemethod}{0}\else
+ \enableparpositions
+ \fi}
+
+\def\checkinmargin[#1]%
+ {\ifundefined{\??im#1\c!offset}% this offset is related to framed !
+ \addtocommalist{#1}\inmargintaglist
+ \presetmargintext[#1]%
+ \fi}
+
+\def\presetmargintext[#1]%
+ {\presetlocalframed
+ [\??im#1]%
+ \getparameters
+ [\??im#1]
+ [\c!frame=\v!off,
+ \c!offset=\v!overlay,
+ \c!line=1,
+ \c!separator=,
+ \c!width=\v!broad,
+ \c!distance=, % empty = signal
+ \c!hoffset=\zeropoint,
+ \c!style=\@@imstyle,
+ \c!color=\@@imcolor,
+ \c!strut=\@@imstrut,
+ \c!location=\@@imlocation,
+ \c!align=\@@imalign,
+ \c!before=\@@imbefore,
+ \c!after=\@@imafter]}
+
+\newdimen\naturalmargincontentheight
+
+\def\makemargintextblock#1#2#3% width l r content
+ {\bgroup
+ \forgetall % added, else problems with 'center' and nested itemize
+ \dontcomplain
+ \hsize\getvalue{\??im#1\c!width}\relax
+ \doifnumberelse\margincontenttag
+ {\ifcase\margincontenttag\relax
+ \edef\margincontenttag{#1}% first one is setups id as well
+ \fi}
+ \donothing
+ \doifnumberelse\margincontenttag
+ {\ifnum\margincontenttag>25 % to be translated
+ \writestatus\m!systems{potential margin stack overflow (\margincontenttag)}%
+ \fi}
+ \donothing
+ % we need to preserve {a,b,c} kind of settings
+ \let\margincontentalign#1%
+ \processallactionsinset
+ [\getvalue{\??im\margincontenttag\c!align}]
+ [ \v!yes=>\let\margincontentalign#1,
+ \v!no=>\let\margincontentalign\v!normal,
+ \v!inner=>\let\margincontentalign#1,
+ \v!outer=>\let\margincontentalign#2,
+ \v!left=>\let\margincontentalign\v!left,
+ \v!middle=>\let\margincontentalign\v!middle,
+ \v!right=>\let\margincontentalign\v!right]%
+ \doifvaluesomething{\??im\margincontenttag\c!align} % watch {} around set
+ {\edef\margincontentalign{{\getvalue{\??im\margincontenttag\c!align},\margincontentalign}}}%
+ %
+ \expanded{\getparameters[\??im\margincontenttag][\c!align=\margincontentalign]}%
+ %
+ \edef\margincontentstrut{\getvalue{\??im\margincontenttag\c!strut}}%
+ \savestrut %
+ \setbox\scratchbox\vbox\localframed
+ [\??im\margincontenttag]
+ [\c!strut=\v!no,\c!offset=\v!overlay] % strut handled internally
+ {\decrement\margincontentlines
+ \dorecurse\margincontentlines{\savedstrut\endgraf\nointerlineskip}% ! savedstrut
+ \@@imbefore
+ \dostartattributes{\??im\margincontenttag}\c!style\c!color\empty
+ \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no
+ \begstrut#3\endstrut\endgraf
+ \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed
+ \dostopattributes
+ \@@imafter}%
+ \global \naturalmargincontentheight\ht\scratchbox
+ \global\advance\naturalmargincontentheight\dp\scratchbox
+ \doif\@@imstack\v!yes
+ {\def\overlappingmargin{-20\scaledpoint}% test value, maybe .25\strutboxdp, maybe configurable
+ \setbox\scratchbox\vbox{\stackeddown\vbox{\box\scratchbox}}}% new
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp % nieuw
+ \box\scratchbox
+ \egroup}
+
+%D The stacker permits constructs like:
+%D
+%D \starttyping
+%D \setupinmargin[stack=yes]
+%D
+%D \inleft{test 1}test\break
+%D \inleft{test 2}test\break
+%D \inleft{test 1}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2}
+%D \inleft{test 3}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4\endgraf test 5\endgraf test 6}
+%D \inleft{test 7\endgraf test 8\endgraf test 9}
+%D \input tufte
+%D \stoptyping
+
+%D This approach permits us to implement a better mechanism
+%D later. We need the \type {\graphicvadjust} in order to
+%D handle:
+%D
+%D \starttyping
+%D \inleft{test} {\red \dorecurse{40}{test }\par}
+%D {\red \inleft{test} \dorecurse{40}{test }\par}
+%D \stoptyping
+%D
+%D The outer margin color is either black or color set as
+%D main text color.
+
+\newif\ifrightmargin % documenteren
+
+\ifx\dopositionmarginbox\undefined
+ \def\dopositionmarginbox#1{\graphicvadjust{\box#1}}
+\fi
+
+% watch out, margin dimensions are swapped locally (\swapmargins)
+
+% with \margincontentmethod one can control pagebreaks
+%
+% 0 no break
+% 1 each entry is one line
+% 2 only natural height
+% 3 also stack height
+
+\chardef\margincontentmethod \plusthree % beware: 1 = old method
+\chardef\marginpagecheckmethod\plusone
+
+\def\margincontentextralines{1} % old method, play safe
+\def\nofmargincontentlines {0}
+
+\def\doplacemargintext#1#2#3#4%
+ {\dontcomplain
+ \strut
+ \doifsomething{#1}
+ {\def\margincontenttag{#1}}%
+ \doifinsetelse{\margincontenttag}{\v!left,\v!right} % ugly hack
+ {\let \margincontentdistance \empty % signal
+ \let \margincontenthoffset \zeropoint}
+ {\edef\margincontentdistance{\executeifdefined{\??im\margincontenttag\c!distance }\empty }% signal
+ \edef\margincontenthoffset {\executeifdefined{\??im\margincontenttag\c!hoffset }\zeropoint}}%
+ \edef\margincontentlines {\executeifdefined{\??im\margincontenttag\c!line }\plusone }%
+ \edef\margincontentseparator {\executeifdefined{\??im\margincontenttag\c!separator}\donothing}%
+ \setbox\scratchbox\hbox{#4}% % todo: make sure that color stack works
+ \ifcase\margincontentmethod
+ \scratchdimen\zeropoint
+ \or % old method
+ \scratchdimen\ht\scratchbox
+ \advance\scratchdimen\dp\scratchbox
+ \or
+ \scratchdimen\naturalmargincontentheight
+ \or
+ \scratchdimen\naturalmargincontentheight
+ \ifx\laststackvmove\undefined\else\global\advance\scratchdimen\laststackvmove\fi
+ \fi
+ \ifdim\scratchdimen>\margincontentheight
+ \global\margincontentheight\scratchdimen
+ \fi
+ \setbox\scratchbox\hbox
+ {#2{\hskip#3\strut
+ \ifcase\margincontentdisplacement
+ % normal, move strutheight up
+ \scratchdimen\strutdp
+ \advance\scratchdimen \margincontentstrutheight
+ \advance\scratchdimen -\strutht
+ \raise\scratchdimen
+ \or
+ % low, obey vadjust
+ \fi
+ \box\scratchbox}}%
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \gdef\margincontentstrutheight{\the\strutht}%
+ %\graphicvadjust{\box\scratchbox}} % fails in high math lines, let it be
+ %\hbox{\lower\strutdp\box\scratchbox}} % alas, wrong lapping, therefore useless
+ \dopositionmarginbox\scratchbox}
+
+% \def\domarginblockskip#1%
+% {\hskip\margincontenthoffset
+% \hskip\compensatedinnermakeupmargin\relax
+% \doifelsenothing\margincontentdistance
+% {\hskip\getvalue{\??im#1\c!distance}}
+% {\hskip\margincontentdistance}%
+% \relax}
+
+\def\domarginblockskip#1%
+ {\doifelsenothing\margincontentdistance
+ {\hskip\dimexpr
+ +\margincontenthoffset
+ +\compensatedinnermakeupmargin
+ +\csname\??im#1\c!distance\endcsname
+ \relax}
+ {\dimexpr
+ +\margincontenthoffset
+ +\compensatedinnermakeupmargin
+ +\margincontentdistance
+ \relax}%
+ \relax}
+
+\def\doleftmarginblock#1#2%
+ {\doplacemargintext{#1}\llap\zeropoint
+ {\llap{\placemargincontentseparator}%
+ \makemargintextblock\v!left\v!right{#2}%
+ \domarginblockskip\v!left}}
+
+\def\dorightmarginblock#1#2%
+ {\doplacemargintext{#1}\rlap\hsize
+ {\hskip\textwidth\hskip-\hsize % new: hsize correction
+ \domarginblockskip\v!right
+ \makemargintextblock\v!right\v!left{#2}%
+ \rlap{\placemargincontentseparator}}}
+
+\def\placemargincontentseparator
+ {\ifnum\margincontentlevel>\zerocount
+ \ifx\margincontentseparator\empty\else
+ \bgroup
+ \scratchdimen\margincontentlines\lineheight
+ \advance\scratchdimen -\lineheight
+ \lower\scratchdimen\hbox{\margincontentseparator}%
+ \egroup
+ \fi
+ \fi}
+
+\newbox\marginconstructbox
+
+\def\doinmarginswapped#1#2#3#4%
+ {\iffirstsidefloatparagraph\nowhitespace\fi % zo laat mogelijk
+ \setbox\marginconstructbox\hbox\bgroup % prevents page break in the middle of construction
+ \startsignalrightpage
+ \doifswappedrightpageelse
+ {\rightmargintrue #2}
+ {\rightmarginfalse#1}
+ {#3}% setups
+ {#4}% content
+ \stopsignalrightpage
+ \egroup
+ \unhbox\marginconstructbox}
+
+% history made this a bit complicated, the +/- was needed before
+% we had enough mem/hash to do the page correction
+
+\edef\inmargintaglist{+,-,\v!low,\v!left,\v!right,\v!inner,\v!outer}
+
+% the old one:
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+% {\doifcommonelse{+,-,\v!laag}{#4}
+% {\dodoinmargin[#1][#2][#3][#4][#5]}
+% {\dodoinmargin[#1][#2][#3][][#4]}}
+%
+% an alternative:
+%
+% \letvalue{\??im\v!laag\c!offset}\empty
+% \letvalue{\??im +\c!offset}\empty
+% \letvalue{\??im -\c!offset}\empty
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+% {\doifnumberelse{#4}
+% {\dodoinmargin[#1][#2][#3][#4][#5]}
+% {\doifdefinedelse{\??im#4\c!offset}
+% {\dodoinmargin[#1][#2][#3][#4][#5]}
+% {\dodoinmargin[#1][#2][#3][][#4]}}}
+%
+% the problem is that we need to keep downward compatibility
+% with respect to the first argument thing a reference or a
+% directive; the alternative is to force users to pass a
+% directive along with a reference; anyhow, as long as one
+% does not use references that have the same name as a
+% directive we can use the (slow) alternative
+
+\def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+ {\expanded{\doifinsetelse{#4}{\inmargintaglist}}
+ {\dodoinmargin[#1][#2][#3][#4][#5]}
+ {\dodoinmargin[#1][#2][#3][][#4]}}
+
+\def\defineinmargin
+ {\doquadrupleempty\dodefineinmargin}
+
+\def\dodefineinmargin[#1][#2][#3][#4]%
+ {\doifassignmentelse{#4}
+ {\setupinmargin[#1][#4]%
+ \setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#1]}}
+ {\setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#4]}}}
+
+\defineinmargin [inleft] [\v!left] [\v!normal] % takes left settings
+\defineinmargin [inright] [\v!right] [\v!normal] % takes right settings
+\defineinmargin [ininner] [\v!inner] [\v!normal] % takes left/right settings
+\defineinmargin [inouter] [\v!outer] [\v!normal] % takes left/right settings
+\defineinmargin [inmargin] [\@@imlocation] [\v!normal] % takes left/right settings
+\defineinmargin [inother] [\@@imlocation] [\v!reverse] % takes left/right settings
+
+\def\inothermargin{\inother}
+
+%D This permits definitions like:
+%D
+%D \starttyping
+%D \defineinmargin [SomePlace] [inner] [normal] [distance=1cm]
+%D \defineinmargin [SomePlace] [inner] [normal] [SomePlace] \setupinmargin[SomePlace][distance=1cm]
+%D \defineinmargin [MyPlace] [inner] [normal] [SomePlace]
+%D \defineinmargin [YourPlace] [inner] [normal] [SomePlace]
+%D \stoptyping
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \startbuffer
+%D \inleft {\TestLine{red} {l}} test test test \par
+%D \inright {\TestLine{green} {r}} test test test \par
+%D \inmargin {\TestLine{blue} {m}} test test test \par
+%D \inothermargin{\TestLine{yellow} {x}} test test test \par
+%D \ininner {\TestLine{cyan} {i}} test test test \par
+%D \inouter {\TestLine{magenta}{o}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \defineinmargin [InOuterA] [outer] [normal] [distance=0cm]
+%D \defineinmargin [InOuterB] [outer] [normal] [distance=1cm]
+%D \defineinmargin [InOuterC] [outer] [normal] [distance=2cm,line=2]
+%D
+%D \startbuffer
+%D \InOuterA{\TestLine{red} {A}} test test test \par
+%D \InOuterB{\TestLine{green}{B}} test test test \par
+%D \InOuterC{\TestLine{blue} {C}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D
+%D \dorecurse{10}{\inleft {one} test \inleft {two} test } \page
+%D
+%D \start
+%D \margintext {one} \margintext {two} \input thuan \par
+%D \setupinmargin[1][line=3,distance=1cm]
+%D \margintext [1]{one}
+%D \margintext [2]{two}
+%D \input thuan \page
+%D \stop
+%D
+%D \setupinmargin[3][location=inner,distance=1cm]
+%D \setupinmargin[4][location=outer,distance=2cm]
+%D
+%D % \setupinmargin[left] [line=2]
+%D % \setupinmargin[right][line=2]
+%D
+%D \dorecurse
+%D {10}
+%D {\margintext {\kern3cm\TestLine{blue}{none}}
+%D \margintext[3] {\TestLine{darkgray}{3}}
+%D \margintext[4] {\TestLine{darkgray}{4}}
+%D \margintext[left] {\TestLine{red} {left}}
+%D \margintext[right]{\TestLine{green} {right}}
+%D \margintext[inner]{\TestLine{cyan} {inner}}
+%D \margintext[outer]{\TestLine{magenta} {outer}}
+%D \input thuan \endgraf}
+%D
+%D \dorecurse{10}{\margintext{test\\test\\test} \input thuan \endgraf}
+%D \stoptyping
+
+% Test case:
+%
+% \setuppagenumbering[alternative=doublesided] \setupwhitespace[medium]
+%
+% \placefigure[right]{}{\externalfigure[dummy][width=2cm]}
+% \input tufte \inothermargin{test} \input tufte
+
+% \def\dodoinmargin[#1][#2][#3][#4][#5]#6%
+% {\bgroup
+% \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
+% \postponenotes % group is (somehow) needed
+% \doifinsetelse\v!low{#4}
+% {\chardef\margincontentdisplacement\plusone}
+% {\chardef\margincontentdisplacement\zerocount}%
+% \doif\v!reverse{#2}
+% {\swapmacros\dorightmarginblock\doleftmarginblock}%
+% \processaction
+% [#1]
+% [ \v!left=>\let\next\doleftmarginblock, % no swapping
+% \v!right=>\let\next\dorightmarginblock, % no swapping
+% \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
+% \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
+% \s!unknown=>\ifdoublesided
+% \doifcommonelse{+,-}{#4}
+% {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
+% {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
+% \else
+% \let\next\doleftmarginblock
+% \fi]%
+% \next{#3}{#6}%
+% \rawpagereference\s!mar{#5}% naar binnen ! ! ! !
+% \flushnotes
+% \egroup % don't forget the group
+% \ignorespaces}
+
+% test first
+%
+% setupsystem[random=1235]
+%
+% \setupinmargin[left][sidemethod=3]
+% \dorecurse{10}{test \fakewords{20}{40} test \inleft{test\\test} test \fakewords{20}{40} \par}
+% \page
+% \setupinmargin[left][sidemethod=4]
+% \dorecurse{40}{test \fakewords{50}{80} test \inleft{test\\test} \par}
+% \page
+
+\def\dodoinmargin[#1][#2][#3][#4][#5]#6%
+ {\bgroup
+% \tracingall
+ % old stuff, a bit tricky, but now interfaced
+ \edef\currentmargincontent{#1}%
+ \chardef\marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone
+ \chardef\margincontentmethod \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree
+ \chardef\marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone
+ % so far
+ \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
+ \postponenotes % group is (somehow) needed
+ \doifinsetelse\v!low{#4}
+ {\chardef\margincontentdisplacement\plusone}
+ {\chardef\margincontentdisplacement\zerocount}%
+ \doif\v!reverse{#2}
+ {\swapmacros\dorightmarginblock\doleftmarginblock}%
+ \processaction
+ [#1]
+ [ \v!left=>\let\next\doleftmarginblock, % no swapping
+ \v!right=>\let\next\dorightmarginblock, % no swapping
+ \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
+ \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
+ \s!unknown=>\ifdoublesided
+ \doifcommonelse{+,-}{#4}
+ {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
+ {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
+ \else
+ \let\next\doleftmarginblock
+ \fi]%
+ \next{#3}{#6}%
+ \rawpagereference\s!mar{#5}% naar binnen ! ! ! !
+ \flushnotes
+ \egroup % don't forget the group
+ \ignorespaces}
+
+% dit zijn voorlopig lokale commando's / vervallen
+%
+% \def\woordinmarge {\indentation\doquintupleempty\doinmargin[\@@implaats][\inleftmargin][\inrightmarge]}
+%
+% \def\woordinlinker {\inleftmargin } % vervallen
+% \def\woordinrechter{\inrechtermarge} % vervallen
+
+% Some day: \definemarking[\v!margetitel]
+
+%D Now come the margin text collectors. The collected content is
+%D flushed at every paragraph by the following macro. Note for
+%D myself: here the location (plaats) is no longer a tag (number).
+
+% gone: \def\doflushmargincontent{\doinmargin[\@@implaats][\v!normaal][]} % + [#1][#2]{#3}}
+
+%D These are now all the same (long ago they had different
+%D implementations, somewhere in Sork time if I remember
+%D right).
+
+\def\margintext {\dodoubleempty\domargincontent}
+\def\marginword {\margintext}
+\def\margintitle{\margintext} % txt mark as well
+
+\newtoks\collectedmargintexts % so .. delayed!
+\chardef\margintextcollected \zerocount
+
+\def\domargincontent[#1][#2]#3% we used to check for #2/#1 being number, no longer now
+ {\global\chardef\margintextcollected\plusone
+ \edef\margincontenttag{#1}%
+ \ifx\margincontenttag\empty
+ \global\advance\margincontentlevel\plusone
+ \edef\margincontenttag{\number\margincontentlevel}%
+ \fi
+ \checkinmargin[\margincontenttag]%
+ \doglobal \appendetoks
+ \noexpand \checkinmargin[\margincontenttag]%
+ \noexpand \doinmargin[\executeifdefined{\??im\margincontenttag\c!location}\@@imlocation][\v!normal][\margincontenttag][\margincontenttag][#2]%
+ \to \collectedmargintexts
+ \doglobal \appendtoks
+ {#3}%
+ \to \collectedmargintexts}
+
+\let\restoreinterlinepenalty\relax
+
+\def\flushmargincontents % plural
+ {\restoreinterlinepenalty % here?
+ \ifcase\margintextcollected\else % called quite often, so we
+ \expandafter\doflushmargincontents % speed up the \fi scan by
+ \fi} % using a \do..
+
+\def\doflushmargincontents % links + rechts
+ {\bgroup
+ \forgetall
+ \global\margincontentheight\zeropoint
+ \startsignalrightpage
+ \the\collectedmargintexts
+ \signalrightpage
+ \stopsignalrightpage
+ \resetmargincontent
+ % dirty tricks
+ \ifcase\margincontentmethod
+ \donefalse
+ \else\ifinsidecolumns % brrrr
+ \donetrue % how fuzzy
+ \else\ifdim\margincontentheight>\lineheight\relax
+ \donetrue % how dirty
+ \else
+ \donefalse % how needed
+ \fi\fi\fi
+ \savemargincontentlines
+ \ifdone
+ \advance\margincontentheight \margincontentextralines\lineheight
+ \ifdim\pagegoal>\pagetotal
+ \bgroup % preserve \margincontentheight
+ \advance\margincontentheight \pagetotal
+ \ifdim\margincontentheight>\pagegoal
+ \egroup
+ \ifcase\marginpagecheckmethod
+ % disabled
+ \or
+ \setmargincontentpenalties
+ \or
+ % potentially dangerous, maybe better a \goodbreak; the problem is that
+ % there can be a penalty there, which we then overload and we also introduce
+ % nasty side effects, so, we drop this option
+ % \vadjust pre {\page}%
+ \fi
+ \else
+ \egroup
+ \fi
+ \fi
+ \else % We need the above because interlinepenalties overrule vadjusted \nobreaks.
+ % a bit dangerous
+ \vadjust{\nobreak}%
+ \fi
+ \egroup}
+
+\def\setmargincontentpenalties
+ {\getnoflines\margincontentheight
+ \keeplinestogether\noflines}
+
+\def\savemargincontentlines
+ {\bgroup
+ \advance\margincontentheight \margincontentextralines\lineheight % 1 by default
+ \getnoflines\margincontentheight
+ \xdef\nofmargincontentlines{\the\noflines}%
+ \egroup}
+
+\def\fillupmargincontentlines % etex ! ! !
+ {\endgraf
+ \begingroup
+ \scratchcounter\numexpr\nofmargincontentlines-\prevgraf\relax\relax
+ \ifnum\scratchcounter>\zerocount
+ \forgetall\dorecurse\scratchcounter{\nobreak\crlf}%
+ \fi
+ \endgroup}
+
+% Yet undocumented, for a manual flush in for instance headers.
+
+\def\resetmargincontent
+ {\global\margincontentlevel\zerocount
+ \global\chardef\margintextcollected\zerocount
+ \global\collectedmargintexts\emptytoks}
+
+% \def\placemargincontent
+% {\ifcase\margintextcollected\else
+% \bgroup
+% \chardef\graphicvadjustmode\zerocount
+% \doflushmargincontents
+% \egroup
+% \fi}
+%
+% font fix:
+
+\def\placemargincontent
+ {\ifcase\margintextcollected\else % was level check
+ \bgroup
+ \redoconvertfont % !!
+ \chardef\graphicvadjustmode\zerocount
+ \doflushmargincontents
+ \egroup
+ \fi}
+
+% For old times sake (i use it in project styles) we provide
+
+\def\placemargintexts {\placemargincontent}
+\def\resetmargetitels {\resetmargincontent}
+\def\margewoordpositie{\margewoord} % obsolete, now no longer range
+
+% but never use them yourself since they may disappear.
+
+\def\oplinker#1%
+ {\strut
+ \graphicvadjust
+ {\dontcomplain
+ \setbox\scratchbox\vtop{\forgetall\strut#1}%
+ \getboxheight\scratchdimen\of\box\scratchbox
+ \vskip-\scratchdimen % waarom stond hier een \ ?
+ \box\scratchbox}}
+
+\setupinmargin
+ [\c!style=\v!bold,
+ \c!color=,
+ \c!strut=\v!auto,
+ \c!location=\v!both,
+ \c!align=\v!inner,
+ \c!stack=\v!no,
+ \c!before=,
+ \c!after=]
+
+\setupinmargin
+ [\v!left]
+ [\c!distance=\leftmargindistance,
+ \c!width=\leftmarginwidth,
+ %\c!align=\v!left, % no
+ \c!location=\v!left]
+
+\setupinmargin
+ [\v!right]
+ [\c!distance=\rightmargindistance,
+ \c!width=\rightmarginwidth,
+ %\c!align=\v!right, % no
+ \c!location=\v!right]
+
+% bonus needed when [inner/outer] is used as tag
+
+\setupinmargin[\v!inner][\c!location=\v!inner,\c!align=\v!inner]
+\setupinmargin[\v!outer][\c!location=\v!outer,\c!align=\v!inner]
+
+% more efficient (5K less fotmat file)
+%
+% \letvalue{\??im\v!inner\c!location}\v!inner \letvalue{\??im\v!inner\c!align}\v!inner
+% \letvalue{\??im\v!outer\c!location}\v!outer \letvalue{\??im\v!outer\c!align}\v!inner
+
+\protect \endinput
diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv
new file mode 100644
index 000000000..464b4f9bb
--- /dev/null
+++ b/tex/context/base/page-mar.mkiv
@@ -0,0 +1,824 @@
+%D \module
+%D [ file=page-mar, % moved here from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Marginal Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for margin words is one of the reasons for writing
+%D \CONTEXT. Over time support for marginal content has been
+%D extended en enhanced. Therefore it's always good to watch
+%D out for unexpected side effects.
+
+\writestatus{loading}{ConTeXt Page Macros / Maginal Things}
+
+\unprotect
+
+%D There are three categories and their historically grown meaning is
+%D as follows:
+%D
+%D marginlines: these are flushed relative to the start of a line and
+%D need to be invoked there.
+%D
+%D marginwords: these can be issued in the text flow and will migrate
+%D sidewards; in spite of the name, it can be a paragraph of text as
+%D well, but normally it's words.
+%D
+%D margintexts: these can be set beforehand and are flushed at the
+%D next paragraph of text (of header)
+%D
+%D While these mechanisms were rather separated, they now are slightly
+%D more integrated. Instead of low level instances we now have a mechanism
+%D for defining additional ones.
+
+%D \macros
+%D {inleftedge,inleftmargin,inrightmargin,inrightedge}
+%D
+%D The fast and clean way of putting things in the margin is
+%D using \type{\rlap} or \type{\llap}. Unfortunately these
+%D macro's don't handle indentation, left and right skips. We
+%D therefore embed them in some macro's that (force and)
+%D remove the indentation and restore it afterwards.
+
+\unexpanded\def\definemarginline
+ {\dodoubleargument\dodefinemarginline}
+
+\def\dodefinemarginline[#1][#2]%
+ {\getparameters
+ [\??im\??im#1]
+ [\c!location=\v!left,
+ \c!distance=\zeropoint,
+ \c!width=\leftmarginwidth,
+ \c!hoffset=\leftmargindistance,
+ \c!command=,
+ #2]%
+ \setuvalue{#1}{\dohandlemarginline{#1}}}
+
+\def\marginlineparameter #1{\csname\??im\??im\currentmarginline#1\endcsname}
+\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}}
+
+\def\dohandlemarginline#1% #2
+ {\def\currentmarginline{#1}%
+ \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}} % {#2}
+
+\def\doleftmarginline#1#2% #1 is redundant (we can remove it when we group dohandlemarginline; maybe ...
+ {\pushindentation
+ \llap
+ {\def\currentmarginline{#1}%
+ \postsignalrightpage
+ \hsize\marginlineparameter\c!width\relax
+ \marginlineexecuter\c!command\firstofoneargument{#2}\relax
+ \hskip\dimexpr
+ +\leftskip
+ +\compensatedinnermakeupmargin
+ +\marginlineparameter\c!hoffset
+ +\marginlineparameter\c!distance
+ \relax}%
+ \popindentation
+ \ignorespaces}
+
+\def\dorightmarginline#1#2% #1 is redundant
+ {\pushindentation
+ \rlap
+ {\def\currentmarginline{#1}%
+ \postsignalrightpage
+ \hskip\dimexpr
+ +\hsize
+ -\rightskip
+ +\compensatedinnermakeupmargin
+ +\marginlineparameter\c!hoffset
+ +\marginlineparameter\c!distance
+ \relax
+ \hsize\marginlineparameter\c!width
+ \marginlineexecuter\c!command\firstofoneargument{#2}}%
+ \popindentation
+ \ignorespaces}
+
+\long\def\installmarginlinehandler#1#2{\setvalue{\s!do\??im\??im#1}{#2}}
+
+\installmarginlinehandler \v!left {\doleftmarginline}
+\installmarginlinehandler \v!right {\dorightmarginline}
+\installmarginlinehandler \v!inner {\presignalrightpage\doifrightpageelse\doleftmarginline \dorightmarginline}
+\installmarginlinehandler \v!outer {\presignalrightpage\doifrightpageelse\dorightmarginline\doleftmarginline }
+
+\definemarginline[inleftmargin] [\c!location=\v!left, \c!width=\leftmarginwidth, \c!distance=\leftmargindistance, \c!hoffset=\zeropoint]
+\definemarginline[inrightmargin][\c!location=\v!right,\c!width=\rightmarginwidth,\c!distance=\rightmargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inleftedge] [\c!location=\v!left, \c!width=\leftedgewidth, \c!distance=\leftedgedistance, \c!hoffset=\leftmargintotal]
+\definemarginline[inrightedge] [\c!location=\v!right,\c!width=\rightedgewidth, \c!distance=\rightedgedistance, \c!hoffset=\rightmargintotal]
+
+\definemarginline[inoutermargin][\c!location=\v!outer,\c!width=\outermarginwidth,\c!distance=\outermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[ininnermargin][\c!location=\v!inner,\c!width=\innermarginwidth,\c!distance=\innermargindistance,\c!hoffset=\zeropoint]
+\definemarginline[inouteredge] [\c!location=\v!outer,\c!width=\outeredgewidth, \c!distance=\outeredgedistance, \c!hoffset=\outermargintotal]
+\definemarginline[ininneredge] [\c!location=\v!inner,\c!width=\inneredgewidth, \c!distance=\inneredgedistance, \c!hoffset=\innermargintotal]
+
+\definemarginline[atleftmargin] [\c!location=\v!left, \c!command=\lrlap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+\definemarginline[atrightmargin][\c!location=\v!right,\c!command=\rllap,\c!width=\zeropoint,\c!distance=\zeropoint,\c!hoffset=\zeropoint]
+
+\def\lrlap#1{\llap{\rlap{#1}}}
+\def\rllap#1{\rlap{\hskip\hsize\llap{#1}}}
+
+%D We want to keep things efficient and therefore only handle
+%D situations like:
+%D
+%D \startbuffer
+%D \inleftedge {fine} some text \par
+%D \strut \inleftmargin {fine} some text \par
+%D \noindent \inrightmargin {fine} some text \par
+%D \noindent \strut \inrightedge {fine} some text \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which looks like:
+%D
+%D \bgroup
+%D \getbuffer
+%D \parindent 30pt
+%D \getbuffer
+%D \egroup
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \def\TestLine#1#2{\backgroundline[#1]{\strut\white\tttf#2~\recurselevel}}
+%D
+%D \startbuffer
+%D \inleftmargin {\TestLine{red} {lm}} test test test \par
+%D \inrightmargin{\TestLine{green} {rm}} test test test \par
+%D \inleftedge {\TestLine{red} {le}} test test test \par
+%D \inrightedge {\TestLine{green} {re}} test test test \par
+%D \inoutermargin{\TestLine{blue} {om}} test test test \par
+%D \ininnermargin{\TestLine{yellow}{im}} test test test \par
+%D \inouteredge {\TestLine{blue} {oe}} test test test \par
+%D \ininneredge {\TestLine{yellow}{ie}} test test test \par
+%D \atleftmargin {\TestLine{red} {alm}} \hfill test \par
+%D \atrightmargin{\TestLine{green} {arm}} test \hfill \par
+%D \stopbuffer
+%D
+%D \dorecurse{40}\getbuffer \page
+%D \stoptyping
+
+%D New, yet undocumented:
+%D
+%D used for pascal:
+%D
+%D \starttyping
+%D \index {test} test \index {west} west \index {rest} rest
+%D
+%D \startnarrower
+%D \placeregister[index][alternative=b,command=\atleftmargin]
+%D \stopnarrower
+%D \stoptyping
+
+% todo: compensate distance when setuplayout[textwidth=..]
+% todo: generalize margin/edge model, now too much duplication
+
+%D The next bunch of macros looks messy which is due to its
+%D multi-purpose character.
+
+\chardef\margincontentdisplacement \zerocount
+\let \margincontentdistance \!!zeropoint
+\let \margincontenthoffset \!!zeropoint
+\def \margincontentlines {1}
+\def \margincontenttag {0}
+\let \margincontentseparator \empty
+\def \margincontentstrutheight {\strutht}
+
+\newcount\margincontentlevel
+\newdimen\margincontentheight
+
+\unexpanded\def\setupinmargin
+ {\dodoubleempty\dosetupinmargin}
+
+\def\dosetupinmargin[#1][#2]%
+ {\ifsecondargument
+ \processcommalist[#1]{\dodosetupinmargin[#2]}% becomes [#2]{##1}
+ \else
+ \getparameters[\??im][#1]%
+ \fi}
+
+% \def\dodosetupinmargin[#1]#2% [settings]{class}
+% {\checkinmargin[#2]%
+% \getparameters[\??im#2][#1]}
+
+\def\dodosetupinmargin[#1]#2% [settings]{class}
+ {\checkinmargin[#2]%
+ \getparameters[\??im#2][#1]%
+ % will become an \everyinmarginsetup thing
+ \ifcase\executeifdefined{\??im#2\c!sidemethod}{0}\else
+ \enableparpositions
+ \fi}
+
+\def\checkinmargin[#1]%
+ {\ifcsname\??im#1\c!offset\endcsname\else % this offset is related to framed !
+ \addtocommalist{#1}\inmargintaglist
+ \presetmargintext[#1]%
+ \fi}
+
+\def\presetmargintext[#1]%
+ {\presetlocalframed
+ [\??im#1]%
+ \getparameters
+ [\??im#1]
+ [\c!frame=\v!off,
+ \c!offset=\v!overlay,
+ \c!line=1,
+ \c!separator=,
+ \c!width=\v!broad,
+ \c!distance=, % empty = signal
+ \c!hoffset=\zeropoint,
+ \c!style=\@@imstyle,
+ \c!color=\@@imcolor,
+ \c!strut=\@@imstrut,
+ \c!location=\@@imlocation,
+ \c!align=\@@imalign,
+ \c!before=\@@imbefore,
+ \c!after=\@@imafter]}
+
+\newdimen\naturalmargincontentheight
+
+\def\makemargintextblock#1#2#3% width l r content
+ {\bgroup
+ \forgetall % added, else problems with 'center' and nested itemize
+ \dontcomplain
+ \hsize\getvalue{\??im#1\c!width}\relax
+ \doifnumberelse\margincontenttag
+ {\ifcase\margincontenttag\relax
+ \edef\margincontenttag{#1}% first one is setups id as well
+ \fi}
+ \donothing
+ \doifnumberelse\margincontenttag
+ {\ifnum\margincontenttag>25 % to be translated
+ \writestatus\m!systems{potential margin stack overflow (\margincontenttag)}%
+ \fi}
+ \donothing
+ % we need to preserve {a,b,c} kind of settings
+ \let\margincontentalign#1%
+ \processallactionsinset
+ [\getvalue{\??im\margincontenttag\c!align}]
+ [ \v!yes=>\let\margincontentalign#1,
+ \v!no=>\let\margincontentalign\v!normal,
+ \v!inner=>\let\margincontentalign#1,
+ \v!outer=>\let\margincontentalign#2,
+ \v!left=>\let\margincontentalign\v!left,
+ \v!middle=>\let\margincontentalign\v!middle,
+ \v!right=>\let\margincontentalign\v!right]%
+ \doifvaluesomething{\??im\margincontenttag\c!align} % watch {} around set
+ {\edef\margincontentalign{{\getvalue{\??im\margincontenttag\c!align},\margincontentalign}}}%
+ %
+ \expanded{\getparameters[\??im\margincontenttag][\c!align=\margincontentalign]}%
+ %
+ \edef\margincontentstrut{\getvalue{\??im\margincontenttag\c!strut}}%
+ \savestrut %
+ \setbox\scratchbox\vbox\localframed
+ [\??im\margincontenttag]
+ [\c!strut=\v!no,\c!offset=\v!overlay] % strut handled internally
+ {\decrement\margincontentlines
+ \dorecurse\margincontentlines{\savedstrut\endgraf\nointerlineskip}% ! savedstrut
+ \@@imbefore
+ \dostartattributes{\??im\margincontenttag}\c!style\c!color\empty
+ \dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no
+ \begstrut#3\endstrut\endgraf
+ \xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed
+ \dostopattributes
+ \@@imafter}%
+ \global \naturalmargincontentheight\ht\scratchbox
+ \global\advance\naturalmargincontentheight\dp\scratchbox
+ \doif\@@imstack\v!yes
+ {\def\overlappingmargin{-20\scaledpoint}% test value, maybe .25\strutboxdp, maybe configurable
+ \setbox\scratchbox\vbox{\stackeddown\vbox{\box\scratchbox}}}% new
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp % nieuw
+ \box\scratchbox
+ \egroup}
+
+%D The stacker permits constructs like:
+%D
+%D \starttyping
+%D \setupinmargin[stack=yes]
+%D
+%D \inleft{test 1}test\break
+%D \inleft{test 2}test\break
+%D \inleft{test 1}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2}
+%D \inleft{test 3}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4}
+%D \input tufte
+%D \inleft{test 1}
+%D \inleft{test 2\endgraf test 3}
+%D \inleft{test 4\endgraf test 5\endgraf test 6}
+%D \inleft{test 7\endgraf test 8\endgraf test 9}
+%D \input tufte
+%D \stoptyping
+
+%D This approach permits us to implement a better mechanism
+%D later. We need the \type {\graphicvadjust} in order to
+%D handle:
+%D
+%D \starttyping
+%D \inleft{test} {\red \dorecurse{40}{test }\par}
+%D {\red \inleft{test} \dorecurse{40}{test }\par}
+%D \stoptyping
+%D
+%D The outer margin color is either black or color set as
+%D main text color.
+
+\newif\ifrightmargin % documenteren
+
+\ifx\dopositionmarginbox\undefined
+ \def\dopositionmarginbox#1{\graphicvadjust{\box#1}}
+\fi
+
+% watch out, margin dimensions are swapped locally (\swapmargins)
+
+% with \margincontentmethod one can control pagebreaks
+%
+% 0 no break
+% 1 each entry is one line
+% 2 only natural height
+% 3 also stack height
+
+\chardef\margincontentmethod \plusthree % beware: 1 = old method
+\chardef\marginpagecheckmethod\plusone
+
+\def\margincontentextralines{1} % old method, play safe
+\def\nofmargincontentlines {0}
+
+\def\doplacemargintext#1#2#3#4%
+ {\dontcomplain
+ \strut
+ \doifsomething{#1}
+ {\def\margincontenttag{#1}}%
+ \doifinsetelse{\margincontenttag}{\v!left,\v!right} % ugly hack
+ {\let \margincontentdistance \empty % signal
+ \let \margincontenthoffset \zeropoint}
+ {\edef\margincontentdistance{\executeifdefined{\??im\margincontenttag\c!distance }\empty }% signal
+ \edef\margincontenthoffset {\executeifdefined{\??im\margincontenttag\c!hoffset }\zeropoint}}%
+ \edef\margincontentlines {\executeifdefined{\??im\margincontenttag\c!line }\plusone }%
+ \edef\margincontentseparator {\executeifdefined{\??im\margincontenttag\c!separator}\donothing}%
+ \setbox\scratchbox\hbox{#4}% % todo: make sure that color stack works
+ \ifcase\margincontentmethod
+ \scratchdimen\zeropoint
+ \or % old method
+ \scratchdimen\ht\scratchbox
+ \advance\scratchdimen\dp\scratchbox
+ \or
+ \scratchdimen\naturalmargincontentheight
+ \or
+ \scratchdimen\naturalmargincontentheight
+ \ifx\laststackvmove\undefined\else\global\advance\scratchdimen\laststackvmove\fi
+ \fi
+ \ifdim\scratchdimen>\margincontentheight
+ \global\margincontentheight\scratchdimen
+ \fi
+ \setbox\scratchbox\hbox
+ {#2{\hskip#3\strut
+ \ifcase\margincontentdisplacement
+ % normal, move strutheight up
+ \scratchdimen\strutdp
+ \advance\scratchdimen \margincontentstrutheight
+ \advance\scratchdimen -\strutht
+ \raise\scratchdimen
+ \or
+ % low, obey vadjust
+ \fi
+ \box\scratchbox}}%
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \gdef\margincontentstrutheight{\the\strutht}%
+ %\graphicvadjust{\box\scratchbox}} % fails in high math lines, let it be
+ %\hbox{\lower\strutdp\box\scratchbox}} % alas, wrong lapping, therefore useless
+ \dopositionmarginbox\scratchbox}
+
+% \def\domarginblockskip#1%
+% {\hskip\margincontenthoffset
+% \hskip\compensatedinnermakeupmargin\relax
+% \doifelsenothing\margincontentdistance
+% {\hskip\getvalue{\??im#1\c!distance}}
+% {\hskip\margincontentdistance}%
+% \relax}
+
+\def\domarginblockskip#1%
+ {\doifelsenothing\margincontentdistance
+ {\hskip\dimexpr
+ +\margincontenthoffset
+ +\compensatedinnermakeupmargin
+ +\csname\??im#1\c!distance\endcsname
+ \relax}
+ {\dimexpr
+ +\margincontenthoffset
+ +\compensatedinnermakeupmargin
+ +\margincontentdistance
+ \relax}%
+ \relax}
+
+\def\doleftmarginblock#1#2%
+ {\doplacemargintext{#1}\llap\zeropoint
+ {\llap{\placemargincontentseparator}%
+ \makemargintextblock\v!left\v!right{#2}%
+ \domarginblockskip\v!left}}
+
+\def\dorightmarginblock#1#2%
+ {\doplacemargintext{#1}\rlap\hsize
+ {\hskip\textwidth\hskip-\hsize % new: hsize correction
+ \domarginblockskip\v!right
+ \makemargintextblock\v!right\v!left{#2}%
+ \rlap{\placemargincontentseparator}}}
+
+\unexpanded\def\placemargincontentseparator
+ {\ifnum\margincontentlevel>\zerocount
+ \ifx\margincontentseparator\empty\else
+ \bgroup
+ \scratchdimen\margincontentlines\lineheight
+ \advance\scratchdimen -\lineheight
+ \lower\scratchdimen\hbox{\margincontentseparator}%
+ \egroup
+ \fi
+ \fi}
+
+\newbox\marginconstructbox
+
+\def\doinmarginswapped#1#2#3#4%
+ {\iffirstsidefloatparagraph\nowhitespace\fi % zo laat mogelijk
+ \setbox\marginconstructbox\hbox\bgroup % prevents page break in the middle of construction
+ \startsignalrightpage
+ \doifswappedrightpageelse
+ {\rightmargintrue #2}
+ {\rightmarginfalse#1}
+ {#3}% setups
+ {#4}% content
+ \stopsignalrightpage
+ \egroup
+ \unhbox\marginconstructbox}
+
+% history made this a bit complicated, the +/- was needed before
+% we had enough mem/hash to do the page correction
+
+\edef\inmargintaglist{+,-,\v!low,\v!left,\v!right,\v!inner,\v!outer}
+
+% the old one:
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+% {\doifcommonelse{+,-,\v!laag}{#4}
+% {\dodoinmargin[#1][#2][#3][#4][#5]}
+% {\dodoinmargin[#1][#2][#3][][#4]}}
+%
+% an alternative:
+%
+% \letvalue{\??im\v!laag\c!offset}\empty
+% \letvalue{\??im +\c!offset}\empty
+% \letvalue{\??im -\c!offset}\empty
+%
+% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+% {\doifnumberelse{#4}
+% {\dodoinmargin[#1][#2][#3][#4][#5]}
+% {\doifdefinedelse{\??im#4\c!offset}
+% {\dodoinmargin[#1][#2][#3][#4][#5]}
+% {\dodoinmargin[#1][#2][#3][][#4]}}}
+%
+% the problem is that we need to keep downward compatibility
+% with respect to the first argument thing a reference or a
+% directive; the alternative is to force users to pass a
+% directive along with a reference; anyhow, as long as one
+% does not use references that have the same name as a
+% directive we can use the (slow) alternative
+
+\def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
+ {\expanded{\doifinsetelse{#4}{\inmargintaglist}}
+ {\dodoinmargin[#1][#2][#3][#4][#5]}
+ {\dodoinmargin[#1][#2][#3][][#4]}}
+
+\unexpanded\def\defineinmargin
+ {\doquadrupleempty\dodefineinmargin}
+
+\def\dodefineinmargin[#1][#2][#3][#4]%
+ {\doifassignmentelse{#4}
+ {\setupinmargin[#1][#4]%
+ \setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#1]}}
+ {\setvalue{#1}{\indentation\doquintupleempty\doinmargin[#2][#3][#4]}}}
+
+\defineinmargin [inleft] [\v!left] [\v!normal] % takes left settings
+\defineinmargin [inright] [\v!right] [\v!normal] % takes right settings
+\defineinmargin [ininner] [\v!inner] [\v!normal] % takes left/right settings
+\defineinmargin [inouter] [\v!outer] [\v!normal] % takes left/right settings
+\defineinmargin [inmargin] [\@@imlocation] [\v!normal] % takes left/right settings
+\defineinmargin [inother] [\@@imlocation] [\v!reverse] % takes left/right settings
+
+\def\inothermargin{\inother}
+
+%D This permits definitions like:
+%D
+%D \starttyping
+%D \defineinmargin [SomePlace] [inner] [normal] [distance=1cm]
+%D \defineinmargin [SomePlace] [inner] [normal] [SomePlace] \setupinmargin[SomePlace][distance=1cm]
+%D \defineinmargin [MyPlace] [inner] [normal] [SomePlace]
+%D \defineinmargin [YourPlace] [inner] [normal] [SomePlace]
+%D \stoptyping
+%D
+%D A torture test:
+%D
+%D \starttyping
+%D \startbuffer
+%D \inleft {\TestLine{red} {l}} test test test \par
+%D \inright {\TestLine{green} {r}} test test test \par
+%D \inmargin {\TestLine{blue} {m}} test test test \par
+%D \inothermargin{\TestLine{yellow} {x}} test test test \par
+%D \ininner {\TestLine{cyan} {i}} test test test \par
+%D \inouter {\TestLine{magenta}{o}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \defineinmargin [InOuterA] [outer] [normal] [distance=0cm]
+%D \defineinmargin [InOuterB] [outer] [normal] [distance=1cm]
+%D \defineinmargin [InOuterC] [outer] [normal] [distance=2cm,line=2]
+%D
+%D \startbuffer
+%D \InOuterA{\TestLine{red} {A}} test test test \par
+%D \InOuterB{\TestLine{green}{B}} test test test \par
+%D \InOuterC{\TestLine{blue} {C}} test test test \par
+%D \stopbuffer
+%D
+%D \dorecurse{80}\getbuffer \page
+%D
+%D \dorecurse{10}{\inleft {one} test \inleft {two} test } \page
+%D
+%D \start
+%D \margintext {one} \margintext {two} \input thuan \par
+%D \setupinmargin[1][line=3,distance=1cm]
+%D \margintext [1]{one}
+%D \margintext [2]{two}
+%D \input thuan \page
+%D \stop
+%D
+%D \setupinmargin[3][location=inner,distance=1cm]
+%D \setupinmargin[4][location=outer,distance=2cm]
+%D
+%D % \setupinmargin[left] [line=2]
+%D % \setupinmargin[right][line=2]
+%D
+%D \dorecurse
+%D {10}
+%D {\margintext {\kern3cm\TestLine{blue}{none}}
+%D \margintext[3] {\TestLine{darkgray}{3}}
+%D \margintext[4] {\TestLine{darkgray}{4}}
+%D \margintext[left] {\TestLine{red} {left}}
+%D \margintext[right]{\TestLine{green} {right}}
+%D \margintext[inner]{\TestLine{cyan} {inner}}
+%D \margintext[outer]{\TestLine{magenta} {outer}}
+%D \input thuan \endgraf}
+%D
+%D \dorecurse{10}{\margintext{test\\test\\test} \input thuan \endgraf}
+%D \stoptyping
+
+% Test case:
+%
+% \setuppagenumbering[alternative=doublesided] \setupwhitespace[medium]
+%
+% \placefigure[right]{}{\externalfigure[dummy][width=2cm]}
+% \input tufte \inothermargin{test} \input tufte
+
+% test first
+%
+% setupsystem[random=1235]
+%
+% \setupinmargin[left][sidemethod=3]
+% \dorecurse{10}{test \fakewords{20}{40} test \inleft{test\\test} test \fakewords{20}{40} \par}
+% \page
+% \setupinmargin[left][sidemethod=4]
+% \dorecurse{40}{test \fakewords{50}{80} test \inleft{test\\test} \par}
+% \page
+
+\def\dodoinmargin[#1][#2][#3][#4][#5]#6%
+ {\bgroup
+ % old stuff, a bit tricky, but now interfaced
+ \edef\currentmargincontent{#1}%
+ \chardef\marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone
+ \chardef\margincontentmethod \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree
+ \chardef\marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone
+ % so far
+ \forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
+ \postponenotes % group is (somehow) needed
+ \doifinsetelse\v!low{#4}
+ {\chardef\margincontentdisplacement\plusone}
+ {\chardef\margincontentdisplacement\zerocount}%
+ \doif\v!reverse{#2}
+ {\swapmacros\dorightmarginblock\doleftmarginblock}%
+ \processaction
+ [#1]
+ [ \v!left=>\let\next\doleftmarginblock, % no swapping
+ \v!right=>\let\next\dorightmarginblock, % no swapping
+ \v!inner=>\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock },
+ \v!outer=>\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock},
+ \s!unknown=>\ifdoublesided
+ \doifcommonelse{+,-}{#4}
+ {\def\next{\doinmarginswapped\dorightmarginblock\doleftmarginblock }}
+ {\def\next{\doinmarginswapped\doleftmarginblock \dorightmarginblock}}%
+ \else
+ \let\next\doleftmarginblock
+ \fi]%
+ \next{#3}{#6}%
+ \pagereference[#5]% naar binnen ! ! ! !
+ \flushnotes
+ \egroup % don't forget the group
+ \ignorespaces}
+
+% dit zijn voorlopig lokale commando's / vervallen
+%
+% \def\woordinmarge {\indentation\doquintupleempty\doinmargin[\@@implaats][\inleftmargin][\inrightmarge]}
+%
+% \def\woordinlinker {\inleftmargin } % vervallen
+% \def\woordinrechter{\inrechtermarge} % vervallen
+
+% Some day: \definemarking[\v!margetitel]
+
+%D Now come the margin text collectors. The collected content is
+%D flushed at every paragraph by the following macro. Note for
+%D myself: here the location (plaats) is no longer a tag (number).
+
+%D These are now all the same (long ago they had different
+%D implementations, somewhere in Sork time if I remember
+%D right).
+
+\def\margintext {\dodoubleempty\domargincontent}
+\def\marginword {\margintext}
+\def\margintitle{\margintext} % txt mark as well
+
+\newtoks\collectedmargintexts % so .. delayed!
+\chardef\margintextcollected \zerocount
+
+\def\domargincontent[#1][#2]#3% we used to check for #2/#1 being number, no longer now
+ {\global\chardef\margintextcollected\plusone
+ \global\let\flushmargincontents\doflushmargincontents
+ \edef\margincontenttag{#1}%
+ \ifx\margincontenttag\empty
+ \global\advance\margincontentlevel\plusone
+ \edef\margincontenttag{\number\margincontentlevel}%
+ \fi
+ \checkinmargin[\margincontenttag]%
+ \doglobal \appendetoks
+ \noexpand \checkinmargin[\margincontenttag]%
+ \noexpand \doinmargin[\executeifdefined{\??im\margincontenttag\c!location}\@@imlocation][\v!normal][\margincontenttag][\margincontenttag][#2]%
+ \to \collectedmargintexts
+ \doglobal \appendtoks
+ {#3}%
+ \to \collectedmargintexts}
+
+\def\doflushmargincontents % plural
+ {\ifcase\margintextcollected\else
+ \expandafter\flushmargincontentsindeed
+ \fi}
+
+\let\flushmargincontents\relax
+
+\def\flushmargincontentsindeed % links + rechts
+ {\bgroup
+ \forgetall
+ \global\margincontentheight\zeropoint
+ \startsignalrightpage
+ \the\collectedmargintexts
+ \signalrightpage
+ \stopsignalrightpage
+ \resetmargincontent
+ % dirty tricks
+ \ifcase\margincontentmethod
+ \donefalse
+ \else\ifinsidecolumns % brrrr
+ \donetrue % how fuzzy
+ \else\ifdim\margincontentheight>\lineheight\relax
+ \donetrue % how dirty
+ \else
+ \donefalse % how needed
+ \fi\fi\fi
+ \savemargincontentlines
+ \ifdone
+ \advance\margincontentheight \margincontentextralines\lineheight
+ \ifdim\pagegoal>\pagetotal
+ \bgroup % preserve \margincontentheight
+ \advance\margincontentheight \pagetotal
+ \ifdim\margincontentheight>\pagegoal
+ \egroup
+ \ifcase\marginpagecheckmethod
+ % disabled
+ \or
+ \setmargincontentpenalties
+ \or
+ % potentially dangerous, maybe better a \goodbreak; the problem is that
+ % there can be a penalty there, which we then overload and we also introduce
+ % nasty side effects, so, we drop this option
+ % \vadjust pre {\page}%
+ \fi
+ \else
+ \egroup
+ \fi
+ \fi
+ \else % We need the above because interlinepenalties overrule vadjusted \nobreaks.
+ % a bit dangerous
+ \vadjust{\nobreak}%
+ \fi
+ \global\let\flushmargincontents\relax
+ \egroup}
+
+\def\setmargincontentpenalties
+ {\getnoflines\margincontentheight
+ \keeplinestogether\noflines}
+
+\def\savemargincontentlines
+ {\bgroup
+ \advance\margincontentheight \margincontentextralines\lineheight % 1 by default
+ \getnoflines\margincontentheight
+ \xdef\nofmargincontentlines{\the\noflines}%
+ \egroup}
+
+\def\fillupmargincontentlines % etex ! ! !
+ {\endgraf
+ \begingroup
+ \scratchcounter\numexpr\nofmargincontentlines-\prevgraf\relax\relax
+ \ifnum\scratchcounter>\zerocount
+ \forgetall\dorecurse\scratchcounter{\nobreak\crlf}%
+ \fi
+ \endgroup}
+
+% Yet undocumented, for a manual flush in for instance headers.
+
+\def\resetmargincontent
+ {\global\margincontentlevel\zerocount
+ \global\chardef\margintextcollected\zerocount
+ \global\collectedmargintexts\emptytoks}
+
+\unexpanded\def\placemargincontent
+ {\ifcase\margintextcollected\else % was level check
+ \bgroup
+ \redoconvertfont % !!
+ \chardef\graphicvadjustmode\zerocount
+ \flushmargincontentsindeed
+ \egroup
+ \fi}
+
+% For old times sake (i use it in project styles) we provide
+
+\unexpanded\def\placemargintexts {\placemargincontent}
+\def\resetmargetitels {\resetmargincontent}
+\def\margewoordpositie{\margewoord} % obsolete, now no longer range
+
+% but never use them yourself since they may disappear.
+
+\def\oplinker#1%
+ {\strut
+ \graphicvadjust
+ {\dontcomplain
+ \setbox\scratchbox\vtop{\forgetall\strut#1}%
+ \getboxheight\scratchdimen\of\box\scratchbox
+ \vskip-\scratchdimen % waarom stond hier een \ ?
+ \box\scratchbox}}
+
+\setupinmargin
+ [\c!style=\v!bold,
+ \c!color=,
+ \c!strut=\v!auto,
+ \c!location=\v!both,
+ \c!align=\v!inner,
+ \c!stack=\v!no,
+ \c!before=,
+ \c!after=]
+
+\setupinmargin
+ [\v!left]
+ [\c!distance=\leftmargindistance,
+ \c!width=\leftmarginwidth,
+ %\c!align=\v!left, % no
+ \c!location=\v!left]
+
+\setupinmargin
+ [\v!right]
+ [\c!distance=\rightmargindistance,
+ \c!width=\rightmarginwidth,
+ %\c!align=\v!right, % no
+ \c!location=\v!right]
+
+% bonus needed when [inner/outer] is used as tag
+
+\setupinmargin[\v!inner][\c!location=\v!inner,\c!align=\v!inner]
+\setupinmargin[\v!outer][\c!location=\v!outer,\c!align=\v!inner]
+
+% more efficient (5K less fotmat file)
+%
+% \letvalue{\??im\v!inner\c!location}\v!inner \letvalue{\??im\v!inner\c!align}\v!inner
+% \letvalue{\??im\v!outer\c!location}\v!outer \letvalue{\??im\v!outer\c!align}\v!inner
+
+\protect \endinput
diff --git a/tex/context/base/page-mis.mkii b/tex/context/base/page-mis.mkii
new file mode 100644
index 000000000..bd029f896
--- /dev/null
+++ b/tex/context/base/page-mis.mkii
@@ -0,0 +1,268 @@
+%D \module
+%D [ file=page-mis,
+%D version=2008.11.17, % was part of page-flt.tex / 2000.10.20
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Misc Float Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Misc Float Things}
+
+\unprotect
+
+\newif\ifmargeblokken
+
+\def\dosetupmarginblocks[#1]%
+ {\getparameters[\??mb][#1]%
+ \doifelse\@@mbstate\v!start
+ {\showmessage\m!layouts4\empty
+ \margeblokkentrue
+ \let\somenextfloat\dosomenextfloat
+ \let\startmarginblock\dostartmarginblock
+ \let\stopmarginblock\dostopmarginblock}%
+ {\showmessage\m!layouts5\empty
+ \margeblokkenfalse
+ \def\somenextfloat[##1]%
+ {\someelsefloat[##1,\v!here]}%
+ \let\startmarginblock\dontstartmargeblok
+ \let\stopmarginblock\dontstopmargeblok}}
+
+\def\setupmarginblocks
+ {\dosingleargument\dosetupmarginblocks}
+
+\newbox\marginbox
+
+\def\dosomenextfloat[#1]%
+ {\global\setbox\marginbox\vbox
+ {\hsize\@@mbwidth
+ \unvcopy\marginbox
+ \ifvoid\marginbox\else\expandafter\@@mbinbetween\fi
+ \box\floatbox\filbreak}%
+ \ifdim\ht\marginbox>\textheight
+ \dosavefloatinfo
+ \else
+ \doinsertfloatinfo
+ \fi}
+
+\newbox\preparedmarginbox
+
+\def\reshapemargin
+ {\ifdim\ht\preparedmarginbox>\zeropoint
+ \beginofshapebox
+ \unvbox\preparedmarginbox
+ \endofshapebox
+ \reshapebox
+ {\box\shapebox}%
+ \setbox\preparedmarginbox\vbox to \textheight
+ {\@@mbtop
+ \flushshapebox
+ \@@mbbottom}%
+ \fi}
+
+\def\plaatsrechtermargeblok
+ {\hskip\rightmarginwidth}
+
+\def\plaatslinkermargeblok
+ {\hskip\leftmarginwidth}
+
+\def\checkmargeblokken
+ {\ifvoid\marginbox\else\docheckmargeblokken\fi}
+
+\def\docheckmargeblokken % erg inefficient
+ {\setbox\preparedmarginbox\vbox
+ {\forgetall
+ \splittopskip\topskip
+ \ifvoid\marginbox\else
+ \ifdim\ht\marginbox>\textheight
+ \vsplit\marginbox to \textheight
+ \else
+ \unvbox\marginbox
+ \fi
+ \fi}%
+ \reshapemargin
+ \setbox\preparedmarginbox\vbox
+ {\@@mbbefore\box\preparedmarginbox\@@mbafter}%
+ \def\rightmarginbox
+ {\def\plaatsrechtermargeblok
+ {\setbox\preparedmarginbox\hbox to \rightmarginwidth
+ {\@@mbleft\box\preparedmarginbox\@@mbright}%
+ \vsmashbox\preparedmarginbox
+ \box\preparedmarginbox}}%
+ \def\leftmarginbox
+ {\def\plaatslinkermargeblok
+ {\setbox\preparedmarginbox\hbox to \leftmarginwidth
+ {\@@mbright\box\preparedmarginbox\@@mbleft}%
+ \vsmashbox\preparedmarginbox
+ \box\preparedmarginbox}}%
+ \processaction % traag
+ [\@@mblocation]
+ [ \v!inmargin=>\doifbothsidesoverruled\rightmarginbox\rightmarginbox\leftmarginbox,
+ \v!middle=>\doifbothsidesoverruled\rightmarginbox\leftmarginbox\rightmarginbox,
+ \v!left=>\leftmarginbox,
+ \v!right=>\rightmarginbox,
+ \s!unknown=>\setbox\preparedmarginbox\hbox{}]}
+
+\def\dostartmarginblock % 2 maal \vbox ivm \unvbox elders
+ {\global\setbox\marginbox\vtop\bgroup\vbox\bgroup
+ \hsize\@@mbwidth
+ \ifvoid\marginbox\else
+ \unvbox\marginbox
+ \@@mbinbetween
+ \fi
+ \setupalign[\@@mbalign]%
+ \dostartattributes\??mb\c!style\c!color{}%
+ \begstrut\ignorespaces}
+
+\def\dostopmarginblock
+ {\unskip\endstrut
+ \dostopattributes
+ \egroup
+ \egroup}
+
+\def\dontstartmargeblok
+ {\@@mbbefore
+ \bgroup
+ \dostartattributes\??mb\c!style\c!color\empty}
+
+\def\dontstopmargeblok
+ {\dostopattributes
+ \egroup
+ \@@mbafter}
+
+\newcounter\nofpostponedblocks
+
+\newif\ifinpostponing
+
+\newevery\everytopofpage\relax
+
+\appendtoks \the\everytopofpage \to\everystarttext
+\appendtoks\global\everytopofpage\emptytoks\to\everystoptext
+
+% \startpostponing [pagenumber] [+pageoffset]
+%
+% \startpostponing[2]
+% PAGE 2 \blank
+% \stoppostponing
+%
+% \startpostponing[+1]
+% PAGE +1 \blank
+% \stoppostponing
+%
+% \startpostponing[+2]
+% PAGE +2 \blank
+% \stoppostponing
+%
+% \starttext \dorecurse{4}{\input tufte \page} \stoptext
+
+\newtoks \postponedpageblocks
+\newcounter\nofpostponedpageblocks
+
+% \ifinpostponing: handhaven, want gebruikt in stijlen ! ! ! ! !
+
+\def\flushpagefloats
+ {\doifoddpageelse
+ {\ifvoid\collectedleftpagefloats
+ \ifvoid\collectedrightpagefloats\else
+ \unvbox\collectedrightpagefloats
+ \page
+ %\the\everytopofpage
+ \fi
+ \fi}
+ {\ifvoid\collectedleftpagefloats\else
+ \unvbox\collectedleftpagefloats
+ \page
+ %\the\everytopofpage
+ \fi
+ \ifvoid\collectedrightpagefloats\else
+ \unvbox\collectedrightpagefloats
+ \page
+ %\the\everytopofpage
+ \fi}%
+ \ifvoid\collectedpagefloats\else
+ % message
+ \unvbox\collectedpagefloats
+ \fi}
+
+% \def\flushrestfloats
+% {\doif{\floatsharedparameter\c!cache}\v!no\doflushfloats}
+
+% \let\flushrestfloats\relax
+
+\def\dopostponeblock
+ {\bgroup % new may 2004
+ \setsystemmode\v!postponing % new may 2004
+ \the\everytopofpage
+ %\flushrestfloats
+ \flushpagefloats
+ \donefalse
+ \ifinpostponing \else
+ \ifcase\nofpostponedblocks \else \donetrue \fi
+ \ifcase\nofpostponedpageblocks \else \donetrue \fi
+ \fi
+ \ifdone
+ \bgroup % we need the color/font switch, else problems inside split verbatim
+ \setnormalcatcodes % postponing in verbatim
+ \pushpostponedpagecolor
+ \restoreglobalbodyfont % The \nof-test is
+ \global\pagetotal\zeropoint % recently added and
+ \global\inpostponingtrue % definitely needed else
+ \the\postponedpageblocks % we can loose or disorder
+ \dorecurse\nofpostponedblocks % floats; anyhow, this
+ {\getbuffer[pbuf-\recurselevel]}% % mechanism is still
+ \doflushfloats % new but potential dangerous % suboptimal and needs a
+ \doglobal\newcounter\nofpostponedblocks % proper analysis
+ \global\inpostponingfalse
+ \poppostponedpagecolor
+ \egroup
+ \fi
+ \egroup} % new may 2004
+
+\def\getpostponedblock#1#2%
+ {\doif{#1}\realfolio{\getbuffer[rbuf-#2]}} % no \ifnum, avoid \fi
+
+% beware, \dosingleempty conflicts with buffers (feeds back the \par)
+
+\setvalue{\e!start\v!postponing}%
+ {\bgroup
+ \obeylines
+ \doifnextoptionalelse{\egroup\nodostartpostponing}{\egroup\dodostartpostponing}}
+
+\def\nodostartpostponing[#1]%
+ {\doglobal\increment\nofpostponedpageblocks
+ \bgroup % a little bit of misusing grouping
+ \doifinstring{+}{#1}\advance \realpageno#1\relax % ugly but efficient
+ \doglobal\appendetoks\noexpand\getpostponedblock
+ {\realfolio}{\nofpostponedpageblocks}\to\postponedpageblocks
+ \egroup
+ \showmessage\m!layouts3\nofpostponedpageblocks
+ \dostartbuffer[rbuf-\nofpostponedpageblocks]%
+ [\e!start\v!postponing][\e!stop\v!postponing]}
+
+\def\dodostartpostponing
+ {\doglobal\increment\nofpostponedblocks
+ \showmessage\m!layouts3\nofpostponedblocks
+ \expanded{\dostartbuffer[pbuf-\nofpostponedblocks][\e!start\v!postponing][\e!stop\v!postponing]}}
+
+% Setups:
+
+\setupmarginblocks
+ [\c!state=\v!start,
+ \c!location=\v!inmargin,
+ \c!width=\rightmarginwidth,
+ \c!style=,
+ \c!color=,
+ \c!align=,
+ \c!left=,
+ \c!right=,
+ \c!top=,
+ \c!inbetween=\blank,
+ \c!bottom=\vfill,
+ \c!before=,
+ \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/page-mis.mkiv b/tex/context/base/page-mis.mkiv
new file mode 100644
index 000000000..f7c3d529d
--- /dev/null
+++ b/tex/context/base/page-mis.mkiv
@@ -0,0 +1,239 @@
+%D \module
+%D [ file=page-mis,
+%D version=2008.11.17, % was part of page-flt.tex / 2000.10.20
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Misc Float Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Misc Float Things}
+
+\unprotect
+
+\newif\ifmarginblocks
+
+\def\dosetupmarginblocks[#1]%
+ {\getparameters[\??mb][#1]%
+ \doifelse\@@mbstate\v!start
+ {\showmessage\m!layouts4\empty
+ \marginblockstrue
+ \let\somenextfloat\dosomenextfloat
+ \let\startmarginblock\dostartmarginblock
+ \let\stopmarginblock\dostopmarginblock}%
+ {\showmessage\m!layouts5\empty
+ \marginblocksfalse
+ \def\somenextfloat[##1]%
+ {\someelsefloat[##1,\v!here]}%
+ \let\startmarginblock\dontstartmargeblok
+ \let\stopmarginblock\dontstopmargeblok}}
+
+\unexpanded\def\setupmarginblocks
+ {\dosingleargument\dosetupmarginblocks}
+
+\newbox\marginbox
+
+\def\dosomenextfloat[#1]%
+ {\global\setbox\marginbox\vbox
+ {\hsize\@@mbwidth
+ \unvcopy\marginbox
+ \ifvoid\marginbox\else\expandafter\@@mbinbetween\fi
+ \box\floatbox\filbreak}%
+ \ifdim\ht\marginbox>\textheight
+ % \dosavefloatinfo
+ \else
+ \doinsertfloatinfo
+ \fi}
+
+\newbox\preparedmarginbox
+
+\def\reshapemargin
+ {\ifdim\ht\preparedmarginbox>\zeropoint
+ \beginofshapebox
+ \unvbox\preparedmarginbox
+ \endofshapebox
+ \reshapebox
+ {\box\shapebox}%
+ \setbox\preparedmarginbox\vbox to \textheight
+ {\@@mbtop
+ \flushshapebox
+ \@@mbbottom}%
+ \fi}
+
+\unexpanded\def\placerightmarginblock
+ {\hskip\rightmarginwidth}
+
+\unexpanded\def\placeleftmarginblock
+ {\hskip\leftmarginwidth}
+
+\def\checkmarginblocks
+ {\ifvoid\marginbox\else\docheckmarginblocks\fi}
+
+\def\docheckmarginblocks % erg inefficient
+ {\setbox\preparedmarginbox\vbox
+ {\forgetall
+ \splittopskip\topskip
+ \ifvoid\marginbox\else
+ \ifdim\ht\marginbox>\textheight
+ \vsplit\marginbox to \textheight
+ \else
+ \unvbox\marginbox
+ \fi
+ \fi}%
+ \reshapemargin
+ \setbox\preparedmarginbox\vbox
+ {\@@mbbefore\box\preparedmarginbox\@@mbafter}%
+ \def\rightmarginbox
+ {\unexpanded\def\placerightmarginblock
+ {\setbox\preparedmarginbox\hbox to \rightmarginwidth
+ {\@@mbleft\box\preparedmarginbox\@@mbright}%
+ \vsmashbox\preparedmarginbox
+ \box\preparedmarginbox}}%
+ \def\leftmarginbox
+ {\unexpanded\def\placeleftmarginblock
+ {\setbox\preparedmarginbox\hbox to \leftmarginwidth
+ {\@@mbright\box\preparedmarginbox\@@mbleft}%
+ \vsmashbox\preparedmarginbox
+ \box\preparedmarginbox}}%
+ \processaction % traag
+ [\@@mblocation]
+ [ \v!inmargin=>\doifbothsidesoverruled\rightmarginbox\rightmarginbox\leftmarginbox,
+ \v!middle=>\doifbothsidesoverruled\rightmarginbox\leftmarginbox\rightmarginbox,
+ \v!left=>\leftmarginbox,
+ \v!right=>\rightmarginbox,
+ \s!unknown=>\setbox\preparedmarginbox\hbox{}]}
+
+\def\dostartmarginblock % 2 maal \vbox ivm \unvbox elders
+ {\global\setbox\marginbox\vtop\bgroup\vbox\bgroup
+ \hsize\@@mbwidth
+ \ifvoid\marginbox\else
+ \unvbox\marginbox
+ \@@mbinbetween
+ \fi
+ \setupalign[\@@mbalign]%
+ \dostartattributes\??mb\c!style\c!color{}%
+ \begstrut\ignorespaces}
+
+\def\dostopmarginblock
+ {\unskip\endstrut
+ \dostopattributes
+ \egroup
+ \egroup}
+
+\def\dontstartmargeblok
+ {\@@mbbefore
+ \bgroup
+ \dostartattributes\??mb\c!style\c!color\empty}
+
+\def\dontstopmargeblok
+ {\dostopattributes
+ \egroup
+ \@@mbafter}
+
+\newcount\nofpostponedblocks
+
+\newif\ifinpostponing
+
+\newevery\everytopofpage\relax
+
+\appendtoks \the\everytopofpage \to\everystarttext
+\appendtoks\global\everytopofpage\emptytoks\to\everystoptext
+
+% \startpostponing [pagenumber] [+pageoffset]
+%
+% \startpostponing[2]
+% PAGE 2 \blank
+% \stoppostponing
+%
+% \startpostponing[+1]
+% PAGE +1 \blank
+% \stoppostponing
+%
+% \startpostponing[+2]
+% PAGE +2 \blank
+% \stoppostponing
+%
+% \starttext \dorecurse{4}{\input tufte \page} \stoptext
+
+\newtoks \postponedpageblocks
+\newcount \nofpostponedpageblocks
+
+% \ifinpostponing: handhaven, want gebruikt in stijlen ! ! ! ! !
+
+\def\dodoflushpostponedblocks
+ {\bgroup % we need the font switch, else problems inside split verbatim
+ \setnormalcatcodes % postponing in verbatim
+ \restoreglobalbodyfont
+ \global\pagetotal\zeropoint
+ \global\inpostponingtrue
+ \the\postponedpageblocks
+ \dorecurse\nofpostponedblocks
+ {\getbuffer[pbuf-\recurselevel]}%
+ \doflushfloats % new but potential dangerous
+ \global\nofpostponedblocks\zerocount
+ \global\inpostponingfalse
+ \egroup}
+
+\def\doflushpostponedblocks
+ {\ifinpostponing \else
+ \ifcase\nofpostponedblocks \else \dodoflushpostponedblocks \fi
+ \ifcase\nofpostponedpageblocks \else \dodoflushpostponedblocks \fi
+ \fi}
+
+\def\doflushpostponedcontent
+ {\bgroup
+ \setsystemmode\v!postponing
+ \the\everytopofpage
+ %\flushrestfloats
+ \doflushpagefloats
+ \doflushpostponedblocks
+ \egroup}
+
+\def\getpostponedblock#1#2%
+ {\doif{#1}\realfolio{\getbuffer[rbuf-#2]}} % no \ifnum, avoid \fi
+
+% beware, \dosingleempty conflicts with buffers (feeds back the \par)
+
+\setvalue{\e!start\v!postponing}%
+ {\bgroup
+ \obeylines
+ \doifnextoptionalelse{\egroup\nodostartpostponing}{\egroup\dodostartpostponing}}
+
+\def\nodostartpostponing[#1]%
+ {\global\advance\nofpostponedpageblocks\plusone % hm, never reset?
+ \bgroup % a little bit of misusing grouping
+ \doifinstring{+}{#1}\advance \realpageno#1\relax % ugly but efficient
+ \doglobal\appendetoks\noexpand\getpostponedblock
+ {\realfolio}{\number\nofpostponedpageblocks}\to\postponedpageblocks
+ \egroup
+ \showmessage\m!layouts3{\number\nofpostponedpageblocks}%
+ \dostartbuffer[rbuf-\number\nofpostponedpageblocks]%
+ [\e!start\v!postponing][\e!stop\v!postponing]}
+
+\def\dodostartpostponing
+ {\global\advance\nofpostponedblocks\plusone
+ \showmessage\m!layouts3{\number\nofpostponedblocks}%
+ \expanded{\dostartbuffer[pbuf-\number\nofpostponedblocks][\e!start\v!postponing][\e!stop\v!postponing]}}
+
+% Setups:
+
+\setupmarginblocks
+ [\c!state=\v!start,
+ \c!location=\v!inmargin,
+ \c!width=\rightmarginwidth,
+ \c!style=,
+ \c!color=,
+ \c!align=,
+ \c!left=,
+ \c!right=,
+ \c!top=,
+ \c!inbetween=\blank,
+ \c!bottom=\vfill,
+ \c!before=,
+ \c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/page-mul.mkii b/tex/context/base/page-mul.mkii
new file mode 100644
index 000000000..c78af074a
--- /dev/null
+++ b/tex/context/base/page-mul.mkii
@@ -0,0 +1,1773 @@
+%D \module
+%D [ file=page-mul, % was: core-mul
+%D version=1998.03.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Multi Column Output,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Simple Multi Column}
+
+%D This module is mostly a copy from the original multi column
+%D routine as implemented in \type {core-mul}. When the main
+%D OTR macro's were isolated in modules and column sets were
+%D introduced, this module became part of the OTR modules. As
+%D a result this module is no longer generic. It also needs
+%D an overhaul.
+
+\unprotect
+
+% TO DO !
+
+\let\OTRMULsetvsize \OTRONEsetvsize
+\let\OTRMULsethsize \OTRONEsethsize
+\let\OTRMULdopagecontents \OTRONEdopagecontents
+\let\OTRMULfinalsidefloatoutput\OTRONEfinalsidefloatoutput % ???
+\let\OTRMULflushfloatbox \OTRONEflushfloatbox
+
+\let\OTRMULdosettopinserts \relax
+\let\OTRMULdosetbotinserts \relax
+\let\OTRMULdotopinsertions \relax
+\let\OTRMULdobotinsertions \relax
+\let\OTRMULdosetbothinserts \relax
+\let\OTRMULflushsavedfloats \relax
+
+\let\OTRMULflushsidefloats \forgetsidefloats % \relax
+\let\OTRMULsynchronizesidefloats\forgetsidefloats % \relax
+
+\newtoks \OTRMULoutput
+
+\def\OTRMULgotonextpage
+ {\ejectpage}
+
+\def\OTRMULgotonextpageX % will become obsolete
+ {\superejectpage}
+
+% check \count<insert> multiplications
+
+% some day try this in balancing routine
+%
+% \ifdim\pagetotal>\pagegoal
+% \eject
+% \else
+% \goodbreak
+% \fi
+
+%D The following macro's implement a multi||column output
+%D routine. The original implementation was based on Donald
+%D Knuth's implementation, which was adapted by Craig Platt to
+%D support balancing of the last page. I gradually adapted
+%D Platt's version to our needs but under certain
+%D circumstances things still went wrong. I considered all
+%D calls to Platt's \type{\balancingerror} as undesirable.
+
+%D This completely new implementation can handle enough
+%D situations for everyday documents, but is still far from
+%D perfect. While at the moment the routine doesn't support
+%D all kind of floats, it does support:
+%D
+%D \startitemize[packed]
+%D \item an unlimitted number of columns
+%D \item ragged or not ragged bottoms
+%D \item optional balancing without \type{\balancingerrors}
+%D \item different \type{\baselineskips}, \type{\spacing},
+%D \type{\topskip} and \type{\maxdepth}
+%D \item left- and right indentation, e.g. within lists
+%D \item moving columns floats to the next column or page
+%D \item handling of floats that are to wide for a columns
+%D \stopitemize
+%D
+%D One could wonder why single and multi||columns modes are
+%D still separated. One reason for this is that \TeX\ is not
+%D suited well for handling multi||columns. As a result, the
+%D single columns routines are more robust. Handling one
+%D column as a special case of multi||columns is posible but at
+%D the cost of worse float handling, worse page breaking,
+%D worse etc. Complicated multi||column page handling should
+%D be done in \cap{DTP}||systems anyway.
+%D
+%D There are three commands provided for entering and leaving
+%D multi||column mode and for going to the next column:
+%D
+%D \interface \type{\beginmulticolumns} \\ \\
+%D \interface \type{\endmulticolumns} \\ \\
+%D \interface \type{\ejectcolumn} \\ \\
+%D
+%D This routines are sort of stand||alone. They communicate
+%D with the rest of \CONTEXT\ by means of some interface
+%D macro's, which we only mention.
+%D
+%D \interface \type{\nofcolumns} \\
+%D the number of columns \\
+%D \interface \type{\minbalancetoplines} \\
+%D the minimum number op balanced top lines \\
+%D \interface \type{\betweencolumns} \\
+%D the stuff between columns \\
+%D \interface \type{\finaloutput{action}{box}} \\
+%D some kind of \type{\pagebody} and \type{\shipout} \\
+%D
+%D \interface \type{\ifbalancecolumns} \\
+%D balancing the colums or not \\
+%D \interface \type{\ifstretchcolumns} \\
+%D ragging the bottom or not \\
+%D
+%D \interface \type{\ifheightencolumns} \\
+%D fix the heigh tor not \\
+%D \interface \type{\fixedcolumnheight} \\
+%D the optional fixed height \\
+%D
+%D \interface \type{\ifinheritcolumns} \\
+%D handle ragging or not \\
+%D \interface \type{\ifr@ggedbottom} \\
+%D use ragged bottoms \\
+%D \interface \type{\ifb@selinebottom} \\
+%D put the bottom line on the baseline \\
+%D \interface \type{\ifnormalbottom} \\
+%D put the bottom line at the baseline \\
+%D
+%D \interface \type{\ifreversecolumns} \\
+%D reverse the order in wich columns are flushed \\
+%D
+%D \interface \type{\usercolumnwidth} \\
+%D the calculated width of a column \\
+%D \interface \type{\columntextwidth} \\
+%D the maximum width of a column \\
+%D \interface \type{\columntextheight} \\
+%D the minimum width of a column \\
+%D
+%D \interface \type{\spacingfactor} \\
+%D the spacing factor \\
+%D \interface \type{\bodyfontsize} \\
+%D the (local) bodyfontsize \\
+%D \interface \type{\openlineheight} \\
+%D the lineheight (including \type{\spacing}) \\
+%D
+%D \interface \type{\EveryBodyFont} \\
+%D communication channel to font switching routines \\
+%D
+%D \interface \type{\global\settopskip} \\
+%D set \type{\topskip} \\
+%D \interface \type{\setvsize} \\
+%D set \type{\vsize} and \type{\pagegoal} \\
+%D \interface \type{\sethsize} \\
+%D set \type{\hsize} \\
+%D
+%D \interface \type{\flushcolumnfloats} \\
+%D push saved column floats (next page) \\
+%D \interface \type{\flushcolumnfloat} \\
+%D push saved column floats (next column) \\
+%D \interface \type{\setcolumnfloats} \\
+%D initialize column floats \\
+%D
+%D \interface \type{\finishcolumnbox} \\
+%D do something special (a hook) \\
+%D \interface \type{\postprocesscolumnpagebox} \\
+%D do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnbox} \\
+%D do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnline} \\
+%D do something with each columnline (also a hook) \\
+%D \interface \type{\currentcolumn} \\
+%D the current column \\
+%D
+%D These interface macro's are called upon or initialized
+%D by the multi||column macro's.
+
+%D A lot of footnote stuff added!
+
+\def\finalcolumntextwidth {\makeupwidth}
+\def\finalcolumntextheight {\textheight}
+\def\columntextwidth {\makeupwidth}
+\def\columntextheight {\textheight}
+\def\usercolumnwidth {\textwidth}
+\def\columntextoffset {\!!zeropoint}
+
+\def\fixedcolumnheight {\textheight}
+\def\betweencolumns {\hskip\bodyfontsize}
+
+\let\setcolumnfloats \relax % in CONTEXT used for floats
+\let\flushcolumnfloats \relax % in CONTEXT used for floats
+\let\flushcolumnfloat \relax % in CONTEXT used for floats
+\let\finishcolumnbox \relax % in CONTEXT used for backgrounds
+
+% %D In fact, the column height and width are set by means of
+% %D two macro's. One can change their meaning if needed:
+%
+% \def\setcolumntextheight
+% {\def\columntextheight{\teksthoogte}}
+%
+% \def\setcolumntextwidth
+% {\def\columntextwidth{\zetbreedte}}
+
+%D Both macros are redefined in \CONTEXT\ when backgrounds
+%D are applied to columns. The final values are used when
+%D flushing the columns.
+
+\newtoks\singlecolumnout % remove that one
+
+%D It's more convenient to use \type {\columnwidth} instead
+%D of messing around with boxes each time.
+
+\newdimen\columnwidth
+\newdimen\gutterwidth
+
+\def\determinecolumnwidth
+ {\bgroup
+ \setbox\scratchbox\hbox
+ {\setcolumnhsize
+ \global\columnwidth\usercolumnwidth
+ \global\gutterwidth\intercolumnwidth}%
+ \egroup}
+
+%D Going to a new columns is done by means of a
+%D \type{\ejectcolumn}. The following definition does not
+%D always work.
+
+\def\ejectcolumn
+ {\goodbreak\showmessage\m!columns2\empty}
+
+%D The next macro should never be called so let's deal with it.
+%D There were several solutions to these kind of errors. First
+%D we check for a good breakpoint before firing up the
+%D multi||column routine (\type{\break} or \type{\allowbreak}).
+%D We do the same at the end of the routine
+%D (\type{\allowbreak}). These allowances are definitely
+%D needed!
+%D
+%D Some on first sight redundant calls to for instance
+%D \type{\setvsize} in the flushing, splitting and balancing
+%D macro's can definitely not be omitted! Some are just there
+%D to handle situations that only few times arise. One of
+%D those can be that the output routine is invoked before
+%D everything is taken care of. This happens when we
+%D flush (part of) the current page with an \type{\unvbox}
+%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One
+%D simply cannot balance columns that are just balanced.
+%D
+%D I hope one never sees the following message. Because it
+%D took me a lot of time to develop the multi||columns
+%D routines, every (although seldom) warning gives me the
+%D creeps!
+
+\def\balancingerror
+ {\showmessage\m!columns3\empty
+ \finaloutput\unvbox\normalpagebox}
+
+\def\OTRMULsometopsfloat{\showmessage\m!columns4\empty \someherefloat}
+\def\OTRMULsomebotsfloat{\showmessage\m!columns5\empty \someherefloat}
+
+\def\OTRMULsomeherefloat{\OTRONEsomeherefloat}
+
+%D The local column width is available in the dimension
+%D register \type{\localcolumnwidth}, which is calculated as:
+
+\def\setcolumnhsize % beware, this one is available for use in macros
+ {\setbox\scratchbox\hbox{\parindent\zeropoint\betweencolumns}%
+ \intercolumnwidth\wd\scratchbox
+ \localcolumnwidth\columntextwidth
+ \advance\localcolumnwidth -\leftskip
+ \advance\localcolumnwidth -\rightskip
+ % new
+ \advance\localcolumnwidth -\colleftskip
+ \advance\localcolumnwidth -\colrightskip
+ %
+ \advance\localcolumnwidth -\nofcolumns\intercolumnwidth
+ \advance\localcolumnwidth \intercolumnwidth
+ \divide \localcolumnwidth \nofcolumns
+ \scratchdimen\columntextoffset
+ \multiply\scratchdimen \plustwo
+ \advance\localcolumnwidth -\scratchdimen
+ \usercolumnwidth\localcolumnwidth
+ \hsize\localcolumnwidth} % we don't do it \global
+
+%D Torture test:
+%D
+%D \startbuffer
+%D \startbuffer[b]
+%D \startcolumns
+%D \input tufte
+%D \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower
+%D \input tufte
+%D \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower
+%D \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns
+%D \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower[left]
+%D \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns
+%D \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns \startnarrower
+%D \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns \startnarrower
+%D \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D \stopbuffer
+%D
+%D \start
+%D \def\postprocesscolumnline#1{\ruledhbox{\strut\box#1}\hss}
+%D \getbuffer
+%D \stop
+
+%D One should be aware that when font related dimensions are
+%D used in typesetting the in||between material, these
+%D dimensions are influenced by bodyfont switches inside
+%D multi||column mode.
+
+\newdimen\mcscratchdimen
+\newcount\nofcolumnlines
+
+\chardef\multicolumnlinemethod\zerocount % 0: overshoot (old default), 1: tight
+% \chardef\multicolumnlinemethod\plusone
+
+\def\getmulticolumnlines
+ {\mcscratchdimen-\columntextoffset
+ \multiply\mcscratchdimen \plustwo
+ \advance\mcscratchdimen \columntextheight
+ \ifdim\precolumnboxheight>\zeropoint
+ \advance\mcscratchdimen -\precolumnboxheight
+ \fi
+ \settotalinsertionheight
+ \advance\mcscratchdimen -\totalinsertionheight
+ \ifcase\multicolumnlinemethod \getnoflines\mcscratchdimen
+ \or \getrawnoflines\mcscratchdimen
+ \else \getrawnoflines\mcscratchdimen
+ \fi
+ % added 30/7/2004
+ \ifnum\layoutlines>\zerocount \ifnum\noflines>\layoutlines
+ \noflines\layoutlines
+ \fi \fi
+ \nofcolumnlines\noflines}
+
+\def\multicolumnovershootratio{.5} % {\ifgridsnapping0\else.5\fi}
+
+\def\setcolumnvsize
+ {\getmulticolumnlines
+ \mcscratchdimen\nofcolumnlines\openlineheight
+ \advance\mcscratchdimen \multicolumnovershootratio\openlineheight % collect enough data
+ \global\vsize\nofcolumns\mcscratchdimen
+ \global\pagegoal\vsize} % let's do it only here
+
+%D It really starts here. After some checks and initializations
+%D we change the output routine to continous multi||column
+%D mode. This mode handles columns that fill the current and
+%D next full pages. The method used is (more or less)
+%D multiplying \type{\vsize} and dividing \type{\hsize} by
+%D \type{\nofcolumns}. More on this can be found in the
+%D \TeX book. We save the top of the current page in box
+%D \type{\precolumnbox}.
+%D
+%D We manipulate \type{\topskip} a bit, just to be shure that
+%D is has no flexibility. This has te be done every time a
+%D font switch takles place, because \type{\topskip} can depend
+%D on this.
+%D
+%D Watch the trick with the \type{\vbox}. This way we get the
+%D right interlining and white space.
+
+\def\beginmulticolumns
+ {\par
+ \flushnotes
+ \xdef\precolumndepth{\the\prevdepth}%
+ \begingroup
+ % new
+ \leftskip1\leftskip
+ \rightskip1\rightskip
+ \edef\colleftskip {\the\leftskip}%
+ \edef\colrightskip{\the\rightskip}%
+ \leftskip\zeropoint
+ \rightskip\zeropoint
+ %
+ \dontshowcomposition
+ %\setcolumntextwidth\relax
+ %\setcolumntextheight\relax
+ \widowpenalty\zerocount % is gewoon beter
+ \clubpenalty \zerocount % zeker bij grids
+ \ifsomefloatwaiting
+ \showmessage\m!columns6{\the\savednoffloats}%
+ \global\setbox\savedfloatlist\box\floatlist
+ \xdef\restoresavedfloats
+ {\global\savednoffloats\the\savednoffloats
+ \global\setbox\floatlist\box\savedfloatlist
+ \global\noexpand\somefloatwaitingtrue}%
+ \global\savednoffloats\zerocount
+ \global\somefloatwaitingfalse
+ \else
+ \global\let\restoresavedfloats\relax
+ \fi
+ \dimen0\pagetotal
+ \advance\dimen0 \parskip
+ \advance\dimen0 \openlineheight
+ \ifdim\dimen0<\pagegoal
+ \allowbreak
+ \else
+ \break % Sometimes fails
+ \fi
+ \appendtoks\topskip1\topskip\to\everybodyfont
+ \the\everybodyfont % ugly here
+ \saveinterlinespace % ugly here
+ \initializecolumns\nofcolumns
+ \hangafter\zerocount
+ \hangindent\zeropoint
+ \everypar\emptytoks
+ \ifdim\pagetotal=\zeropoint \else
+ \verticalstrut
+ \vskip-\struttotal
+ \fi
+ \global\savedpagetotal\pagetotal
+ \global\singlecolumnout\output
+ %\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}%
+ \global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
+ \eject % no \holdinginserts=1, can make footnote disappear !
+ \global\precolumnboxheight\ht\precolumnbox
+ \global\output{\continuousmulticolumnsout}%
+ \setcolumnfloats
+ \dohandleallcolumns
+ {\global\setbox\currenttopcolumnbox\emptybox}%
+ \checkbegincolumnfootnotes
+ \activateotr{MUL}{ONE}% todo ! ! ! !
+ \let\sethsize\setcolumnhsize
+ \let\setvsize\setcolumnvsize
+ \sethsize
+ \setvsize
+ \showcomposition}
+
+%D When we leave the multi||column mode, we have to process the
+%D not yet shipped out part of the columns. When we don't
+%D balance, we simply force a continuous output, but a balanced
+%D output is more tricky.
+
+%D First we try to fill up the page and when all or something
+%D is left we try to balance things. This is another useful
+%D adaption of the ancesters of these macro's. It takes some
+%D reasoning to find out what happens and maybe I'm making
+%D some mistake, but it works.
+%D
+%D Voiding box \type{\precolumnbox} is sometimes necessary,
+%D e.g. when there is no text given between \type{\begin..}
+%D and \type{\end..}. The \type{\par} is needed!
+
+\chardef\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! !
+
+\def\endmulticolumns
+ {%\par
+ \ifnum\multicolumnendsyncmethod=\plustwo
+ \synchronizeoutput
+ \else
+ % don't combine these
+ \vskip\lineheight
+ \vskip-\lineheight % take footnotes into account
+ \fi
+ \dontshowcomposition
+ \doflushcolumnfloat % added recently
+ %\doflushcolumnfloats % no, since it results in wrong top floats
+ \flushnotes % before start of columns
+ \par
+ \ifbalancecolumns
+ \ifnum\multicolumnendsyncmethod=\plusone
+ \global\output{\continuousmulticolumnsout}%
+ \goodbreak
+ \fi
+ \global\output{\balancedmulticolumnsout}%
+ \else
+ \goodbreak
+ \fi
+ \eject % the prevdepth is important, try e.g. toclist in
+ \prevdepth\zeropoint % columns before some noncolumned text text
+ \global\output\singlecolumnout
+ \global\output{\the\mainoutput}% % % % % todo
+ \ifvoid\precolumnbox\else
+ \unvbox\precolumnbox
+ \fi
+ \global\precolumnboxheight\zeropoint
+ \endgroup % here
+ \nofcolumns\plusone
+ \setvsize % the outer one!
+ \synchronizeoutput % new may 2004 / we need to: \pagegoal\vsize
+ \checkendcolumnfootnotes
+ \dosomebreak\allowbreak
+ \restoresavedfloats}
+
+%D Because some initializations happen three times, we
+%D defined a macro for them. Erasing \type{\everypar} is
+%D needed because we don't want anything to interfere.
+
+\def\setmulticolumnsout
+ {\everypar\emptytoks
+ \dontcomplain
+ \settopskip
+ \setmaxdepth
+ \topskip1\topskip
+ \splittopskip\topskip
+ \splitmaxdepth\maxdepth
+ \boxmaxdepth\maxdepth % dangerous
+ \emergencystretch\zeropoint\relax} % sometimes needed !
+
+%D Flushing the page comes to pasting the columns together and
+%D appending the result to box \type{\precolumnbox}, if not
+%D void. I've seen a lot of implementations in which some skip
+%D was put between normal text and multi||column text. When we
+%D don't want this, the baselines can be messed up. I hope the
+%D seemingly complicated calculation of a correction
+%D \type{\kern} is adequate to overcome this. Although not
+%D watertight, spacing is taken into account and even multiple
+%D mode changes on one page go well. But cross your fingers and
+%D don't blame me.
+%D
+%D One of the complications of flushing out the boxes is that
+%D \type{\precolumnbox} needs to be \type{\unvbox}'ed, otherwise
+%D there is too less flexibility in the page when using
+%D \type{\r@ggedbottom}. It took a lot of time before these
+%D kind of problems were overcome. Using \type{\unvbox} at the
+%D wrong moment can generate \type{\balancingerror}'s.
+%D
+%D One can use the macros \type {\maxcolumnheight} and \type
+%D {\maxcolumndepth} when generating material between columns
+%D as well as postprocessing column lines.
+
+\let\maxcolumnheight=\zeropoint
+\let\maxcolumndepth =\zeropoint
+
+\newbox\columnpagebox
+
+\def\setmaxcolumndimensions
+ {\let\maxcolumnheight\!!zeropoint
+ \let\maxcolumndepth \!!zeropoint
+ \dohandleallcolumns
+ {\ifdim\ht\currentcolumnbox>\maxcolumnheight
+ \edef\maxcolumnheight{\the\ht\currentcolumnbox}%
+ \fi
+ \ifdim\dp\currentcolumnbox>\maxcolumndepth
+ \edef\maxcolumndepth{\the\dp\currentcolumnbox}%
+ \fi}}
+
+\chardef\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++
+\chardef\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid
+
+\def\flushprecolumnboxnogrid
+ {\unvbox\precolumnbox}
+
+\def\flushprecolumnboxongrid
+ {\scratchdimen\savedpagetotal
+ \advance\scratchdimen -\ht\precolumnbox
+ \advance\scratchdimen -\dp\precolumnbox
+ \advance\scratchdimen -\topskip
+ \box\precolumnbox
+ \kern\scratchdimen}
+
+\newconditional\someprecolumncontent
+
+\def\flushcolumnedpage#1%
+ {\bgroup
+ \ifvoid\precolumnbox
+ \setfalse\someprecolumncontent % will be set elsewhere
+ \else
+ \settrue\someprecolumncontent
+\mkprocessboxcontents\precolumnbox
+ \fi
+ \forgetall
+ \setmulticolumnsout
+ \showcomposition
+ \setmaxcolumndimensions
+ \dohandleallcolumns
+ {\mkprocesscolumncontents\currentcolumnbox}%
+ \postprocesscolumns
+ \dohandleallcolumns % \hbox i.v.m. \showcomposition
+ {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth
+ {\box\currentcolumnbox
+ \global\wd\currentcolumnbox\localcolumnwidth
+ \ifheightencolumns
+ \global\ht\currentcolumnbox\fixedcolumnheight
+ \fi}}%
+ \setmaxcolumndimensions
+ \overlaycolumnfootnotes
+ \setbox\columnpagebox\vbox
+ {\hbox to \finalcolumntextwidth
+ {\hskip\colleftskip\relax % new, \relax needed
+ \ifreversecolumns
+ \popsplitproperties % else wrong color stack
+ \@EA\dohandlerevcolumns
+ \else
+ \@EA\dohandleallcolumns
+ \fi
+ {\finishcolumnbox{\hbox
+ {\ifx\finishcolumnbox\relax\else\strut\fi
+ \box\currentcolumnbox}}%
+ \hfil}%
+ \unskip
+ \hskip\colrightskip}}% new
+ \scratchdimen\zeropoint
+ \dohandleallcolumns
+ {\ifdim-\ht\currenttopcolumnbox<\scratchdimen
+ \scratchdimen-\ht\currenttopcolumnbox
+ \fi
+ \global\setbox\currenttopcolumnbox\emptybox}%
+ \advance\scratchdimen \ht\columnpagebox
+ \setbox\scratchbox\hbox to \columntextwidth
+ {\vrule
+ \!!width\zeropoint
+ \!!height\scratchdimen
+ \!!depth\dp\columnpagebox
+ \dostepwiserecurse2\nofcolumns1{\hfil\betweencolumns}\hfil}%
+ \setbox\columnpagebox\hbox
+ {\box\columnpagebox
+ \hskip-\columntextwidth
+ \restoretextcolor{\box\scratchbox}}%
+ \postprocesscolumnpagebox % new, acts upon \box\columnpagebox
+ \ifconditional\someprecolumncontent
+ \settrue\someprecolumncontent
+ % next some incredible crappy code
+ \ifcase\multicolumntopalignmethod
+ \flushprecolumnboxnogrid % not on grid
+ \or
+ \flushprecolumnboxongrid % force on grid
+ \else\ifgridsnapping % somehow this junk fails in pascal
+ \flushprecolumnboxongrid % obey grid settings, force on grid
+ \else
+ \flushprecolumnboxnogrid % ignore grid settings, not on grid
+ \fi \fi
+ \fi
+ \global\precolumnboxheight\zeropoint
+ \setvsize
+ \dosomebreak\nobreak % hm, only needed when topstuff
+ \ifgridsnapping
+ \else
+ \ifcase\multicolumntopflushmethod
+ % sometimes method 1 goes wrong, so we need a way out; best sort this out
+ % when we run into it again
+ \or
+ % \input tufte \startcolumns \showbaselines \input tufte \stopcolumns \input tufte
+ \ifconditional\someprecolumncontent
+% \scratchdimen\topskip
+% \advance\scratchdimen -\openstrutheight
+% \nointerlineskip
+% \vskip-\scratchdimen
+ \nointerlineskip
+ \vskip\dimexpr\openstrutheight-\topskip\relax
+ \fi
+ \or
+% \scratchdimen\topskip
+% \advance\scratchdimen -\openstrutheight
+% \nointerlineskip
+% \vskip-\scratchdimen
+ \nointerlineskip
+ \vskip\dimexpr\openstrutheight-\topskip\relax
+ \or
+ % untested but maybe handy
+% \scratchdimen\topskip
+% \advance\scratchdimen -\openstrutheight
+% \nointerlineskip
+% \vskip-\scratchdimen
+% \vskip-\lineheight
+% \vbox{\strut}%
+ \nointerlineskip
+ \vskip\dimexpr\openstrutheight-\topskip-\lineheight\relax
+ \vbox{\strut}%
+ \fi
+ \fi
+ \prevdepth\openstrutdepth
+ \nointerlineskip
+ \dp\columnpagebox\zeropoint
+ \global\finalcolumnheights\ht\columnpagebox
+ \getnoflines\finalcolumnheights
+ \global\finalcolumnlines\noflines
+ \ifcase#1\else
+ % messy correction, we need to rewrite this module (newcolumns)
+ \setbox\columnpagebox\vbox
+ {\offinterlineskip
+ \scratchdimen\ht\columnpagebox
+ \advance\scratchdimen\dp\columnpagebox % we probably lost that one already
+ \box\columnpagebox
+ \vskip-\scratchdimen}%
+ \scratchdimen\noflines\openlineheight
+ \advance\scratchdimen-\openstrutdepth
+ \advance\scratchdimen-\openlineheight
+ \advance\scratchdimen\topskip
+ \ht\columnpagebox\scratchdimen
+ \dp\columnpagebox\openstrutdepth
+ % end of mess
+ \fi
+ \box\columnpagebox
+ \egroup}
+
+%D In case one didn't notice, finaly \type{\finishcolumnbox} is
+%D applied to all boxes. One can use these hooks for special
+%D purposes.
+%D
+%D Once upon a time I wanted to manipulate the individual lines
+%D in a column. This feature is demonstrated in the two examples
+%D below.
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1% or \postprocesscolumnbox
+%D {\ruledhbox{\box#1}\hss}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line: \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we show the natural width of the lines:
+%D
+%D {\getbuffer}
+%D
+%D The next example does a bit more advanced manipulation:
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1%
+%D {\ifodd\currentcolumn
+%D \hfill\unhbox#1\relax
+%D \else
+%D \relax\unhbox#1\hfill
+%D \fi}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we also see an application of \type{\currentcolumn}:
+%D
+%D {\getbuffer}
+%D
+%D This feature is implemented using the reshape macros
+%D presented in \type{supp-box}.
+
+\def\postprocesscolumns
+ {\ifx\postprocesscolumnline\undefined \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vtop
+ {\beginofshapebox
+ \unvbox\currentcolumnbox
+ \unskip\unskip
+ \endofshapebox
+ \reshapebox
+ {\dimen0\ht\shapebox
+ \dimen2\dp\shapebox
+ \setbox\shapebox\hbox to \hsize
+ {\postprocesscolumnline\shapebox}%
+ \ht\shapebox\dimen0
+ \dp\shapebox\dimen2
+ \box\shapebox}%
+ \flushshapebox
+ \everypar\emptytoks
+ \parskip\zeropoint % = \forgetall
+ \verticalstrut
+ \vskip-\struttotal
+ \vfil}}%
+ \fi
+ \ifx\postprocesscolumnbox\undefined \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\hbox
+ {\postprocesscolumnbox\currentcolumnbox}}
+ \fi}
+
+%D We default to doing nothing!
+
+\let\postprocesscolumnline =\undefined
+\let\postprocesscolumnbox =\undefined
+\let\postprocesscolumnpagebox=\relax
+
+%D \macros
+%D {reversecolumnstrue}
+%D
+%D We can force the macro that takes care of combining
+%D the columns, to flush them in the revere order. Of
+%D course, by default we don't reverse.
+
+\newif\ifreversecolumns
+
+%D Here comes the simple splitting routine. It's a bit
+%D longer than expected because of ragging bottoms or not.
+%D This part can be a bit shorter but I suppose that I will
+%D forget what happens. The splitting takes some already
+%D present material (think of floats) into account!
+%D
+%D First we present some auxiliary routines. Any material,
+%D like for instance floats, that is already present in the
+%D boxes is preserved.
+
+\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
+ {\bgroup
+ \ifdim\ht#4>\zeropoint
+ \dimen0\dimen#3\relax
+ \dimen2\dimen0
+ \advance\dimen0 -\ht#4%
+ \columnfootnotecorrection{#1}{\dimen0}%
+ \setbox0\vsplit#2 to \dimen0
+ \global\setbox#1\vbox to \dimen2
+ {\ifgridsnapping
+ \dimen0-\openstrutheight
+ \advance\dimen0 \topskip
+ \vskip\dimen0\copy#4\vskip-\dimen0
+ \else
+ \unvcopy#4%
+ \fi
+ \fuzzysnappedbox\unvbox0
+ \fakecolumnfootnotes{#1}}%
+ \else
+ \ifcase\clevernotes
+ \global\setbox#1\vsplit#2 to \dimen#3%
+ \global\setbox#1\vbox
+ {\fuzzysnappedbox\unvbox{#1}}% % or \box ?
+ \else
+ \columnfootnotecorrection{#1}{\dimen#3}%
+ \setbox0\vsplit#2 to \dimen#3%
+ \global\setbox#1\vbox to \dimen#3%
+ {\fuzzysnappedbox\unvbox0
+ \fakecolumnfootnotes{#1}}%
+ \fi
+ \fi
+ \egroup}
+
+\def\splitcurrentcolumn from \box#1to \dimen#2%
+ {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox}
+
+\def\splitfirstcolumn from \box#1to \dimen#2%
+ {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox}
+
+\def\splitlastcolumn from \box#1to \dimen#2%
+ {\global\setbox\lastcolumnbox\vbox
+ {\unvcopy\lasttopcolumnbox
+ \fuzzysnappedbox\unvbox{#1}%
+ \fakecolumnfootnotes\lastcolumnbox}}
+
+%D NEW: still to be documented.
+
+\def\fakecolumnfootnotes#1%
+ {\relax
+ \ifcase\clevernotes\else
+ \ifnum#1=\lastcolumnbox
+ \fakenotes
+ \fi
+ \fi}
+
+\def\columnfootnotecorrection#1#2%
+ {\relax
+ \ifcase\clevernotes
+ % page notes
+ \or
+ \ifnum#1=\firstcolumnbox\relax
+ \calculatetotalclevernoteheight
+ \advance#2 -\totalnoteheight
+ \fi
+ \else
+ \ifnum#1=\lastcolumnbox\relax
+ \calculatetotalclevernoteheight
+ \advance#2 -\totalnoteheight
+ \fi
+ \fi}
+
+\def\overlaycolumnfootnotes
+ {\relax
+ \ifcase\clevernotes
+ % page notes
+ \else
+ \checknotepresence
+ \ifnotespresent
+ % the note box has the depth of the notefont
+ % because a column (i.e. first column has no depth,
+ % we need to anchor top down)
+ \bgroup
+ \ifcase\clevernotes\or
+ \getmulticolumnlines
+ \advance\nofcolumnlines \minustwo
+ \scratchdimen\nofcolumnlines\lineheight
+ \advance\scratchdimen \topskip
+ \setbox0\hbox
+ {\lower\scratchdimen\vbox{\placenoteinserts}}%
+ \ht0=\openstrutheight % \strutht
+ \dp0=\openstrutdepth % \strutdp
+ \scratchdimen\ht\firstcolumnbox
+ \global\setbox\firstcolumnbox\vbox to \scratchdimen
+ {\box\firstcolumnbox
+ \vskip-\scratchdimen
+ \restoretextcolor{\box0}}%
+ \else
+ % maybe here also \getmulticolumnlines
+ \scratchdimen\ht\firstcolumnbox
+ \advance\scratchdimen -\openstrutdepth % \strutdp
+ \getnoflines\scratchdimen
+ \advance\noflines \minustwo
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen \topskip
+ \setbox0\hbox
+ {\lower\scratchdimen\vbox{\placenoteinserts}}%
+ \ht0=\openstrutheight % \strutht
+ \dp0=\openstrutdepth % \strutdp
+ \scratchdimen\ht\lastcolumnbox
+ \global\setbox\lastcolumnbox\vbox to \scratchdimen
+ {\box\lastcolumnbox
+ \vskip-\scratchdimen
+ \restoretextcolor{\box0}}%
+ \fi
+ \egroup
+ \fi
+ \fi}
+
+%D Here comes the routine that splits the long box in columns.
+%D The macro \type{\flushcolumnfloats} can be used to flush
+%D either floats that were present before the multi||column
+%D mode was entered, or floats that migrate to next columns.
+%D Flushing floats is a delicate process.
+
+\def\continuousmulticolumnsout
+ {\bgroup
+ \forgetall
+ \setmulticolumnsout
+ \dontshowcomposition
+% \dimen0=\columntextheight
+% \advance\dimen0 -\precolumnboxheight
+% \settotalinsertionheight
+% \advance\dimen0 -\totalinsertionheight
+% \ifgridsnapping % evt altijd, nog testen
+% \getnoflines{\dimen0}
+% \dimen0=\noflines\openlineheight
+% \fi
+ \getmulticolumnlines
+ \dimen0=\nofcolumnlines\openlineheight
+ \dohandleallcolumns
+ {\splitcurrentcolumn from \box\normalpagebox to \dimen0}%
+ \setbox\restofpage\vbox{\unvbox\normalpagebox}%
+ \ifinheritcolumns
+ \ifr@ggedbottom % vreemd
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+ {\dimen0\dp\currentcolumnbox
+ \unvbox\currentcolumnbox
+ \vskip-\dimen0
+ \vskip\openstrutdepth % \strutdp
+ \prevdepth\openstrutdepth % \strutdp
+ \vfill}}%
+ \ifbottomnotes \else
+ \dimen0\ht\firstcolumnbox
+ \fi
+ \fi
+ \ifn@rmalbottom
+ \advance\dimen0 \maxdepth
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \dimen0
+ {\unvbox\currentcolumnbox}}%
+ \fi
+ \ifb@selinebottom
+ % the columns are on top of the baseline
+ \fi
+ \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \dimen0
+ {\ifstretchcolumns
+ \unvbox\currentcolumnbox
+ \else
+ \unvbox\currentcolumnbox % wel of niet \unvbox ?
+ \vfill
+ \fi}}%
+ \dohandleallcolumns
+ {\global\ht\currentcolumnbox\dimen0}%
+ \fi
+ \setbox\precolumnbox\vbox{\flushcolumnedpage\zerocount}%
+ \finaloutput\box\precolumnbox
+ \sethsize
+ \setvsize
+ \flushcolumnfloats
+ \unvbox\restofpage
+ % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen
+ \egroup}
+
+%D And this is the balancing stuff. Again, part of the routine
+%D is dedicated to handling ragged bottoms, but here we also
+%D see some handling concerning the stretching of columns.
+%D We set \type{\widowpenalty} at~0, which enables us to
+%D balance columns with few lines. The use of \type{\box2} and
+%D \type{\box4} garantees a more robust check when skips are
+%D used.
+
+\def\multicolumnsbalancemax{250} % 100 is too small when floats are involved
+
+\def\balancedmulticolumnsout
+ {\bgroup
+ \setmulticolumnsout
+ \dontshowcomposition
+ \widowpenalty\zerocount
+ \setbox0\vbox{\unvbox\normalpagebox}%
+\ifdim\ht0>\openlineheight % at least one line
+ \ifnum\minbalancetoplines<2 % balance anyway
+ \donetrue
+ \else % check criterium to available lines
+ \getnoflines{\ht0}%
+ \divide\noflines \nofcolumns \relax
+ \ifnum\noflines<\minbalancetoplines \relax
+ \dimen0\ht0
+ \advance\dimen0 \ht\firsttopcolumnbox
+ \advance\dimen0 \openlineheight \relax % let's play safe
+ \ifdim\dimen0>\columntextheight % column exceeding text height
+ \donetrue
+ \else % it seems to fit
+ \donefalse
+ \fi
+ \else % balance indeed
+ \donetrue
+ \fi
+ \fi
+\else % balancing does not make sense
+ \donefalse
+\fi
+\ifdone % start balancing
+ %\ifdim\ht0>\openlineheight
+ \dimen0\ht0
+ \advance\dimen0 \topskip
+ \advance\dimen0 -\baselineskip
+ \dohandleallcolumns
+ {\advance\dimen0 \ht\currenttopcolumnbox}%
+ \divide\dimen0 \nofcolumns
+ \vbadness\!!tenthousand\relax
+ \count255=\zerocount
+ \bgroup
+ \ifgridsnapping
+ \dimen2\lineheight
+ \else
+ \dimen2=\onepoint % RUBISH
+ \dimen2=\spacingfactor\dimen2
+ \fi
+ \doloop
+ {\advance\count255 \plusone
+ \global\setbox\restofpage\copy0\relax
+ \splitfirstcolumn from \box\restofpage to \dimen0
+ \dohandlemidcolumns
+ {\splitcurrentcolumn from \box\restofpage to \dimen0}%
+ \splitlastcolumn from \box\restofpage to \dimen0
+ \setbox2\vbox{\unvcopy\firstcolumnbox}%
+ \dimen4\zeropoint
+ \dohandleallcolumns
+ {\setbox4\vbox
+ {\unvcopy\currentcolumnbox
+ %rather new, test this on pdftex-z.tex
+ \unpenalty\unskip\unpenalty\unskip}% maybe better in main splitter
+ %\writestatus{balance}{\the\currentcolumnbox: \the\ht4}%
+% \dimen6\ht4 \ifdim\dimen6>\dimen4 \dimen4=\dimen6 \fi}%
+ \ifdim\ht4>\dimen4 \dimen4=\ht4 \fi}%
+ \advance\dimen4 -.0005pt % get rid of accurracy problem, pretty new
+ \ifnum\count255>\multicolumnsbalancemax\relax
+ \exitloop
+ \else\ifdim\dimen4>\ht2
+ \advance\dimen0 \dimen2\relax
+ \else
+ \exitloop
+ \fi\fi}%
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox{\unvcopy\currentcolumnbox}}% NIEUW
+ \ifnum\count255>\multicolumnsbalancemax\relax
+ \showmessage\m!columns7\empty
+ \else
+ \showmessage\m!columns8{\the\count255\space}%
+ \fi
+ \egroup
+ \ifinheritcolumns
+ % We cannot assume that the first column is the tallest, if
+ % only because we may have an aborted balance (one line in the
+ % first column and a graphic in the second one).
+ %
+ % \dimen0\ht\firstcolumnbox
+ % \dimen2\ht\firstcolumnbox
+ %
+ \dimen0=\zeropoint
+ \dohandleallcolumns
+ {\ifdim\ht\currentcolumnbox>\dimen0
+ \dimen0=\ht\currentcolumnbox
+ \fi}%
+ \dimen2\dimen0
+ % so far
+ \advance\dimen2 -\openlineheight
+ \dohandleallcolumns
+ {\dimen4\ht\currentcolumnbox
+ \dimen6=10\openlineheight % funny value
+ \global\setbox\currentcolumnbox\vbox to \dimen0
+ {\unvbox\currentcolumnbox
+ \ifdim\dimen4>\dimen6
+ \ifdim\dimen4<\dimen0
+ \ifdim\dimen4>\dimen2
+ \vskip\zeropoint % !!
+ \else
+ \vskip\openlineheight
+ \vfill
+ \fi
+ \else
+ \vskip\zeropoint
+ \fi
+ \else
+ \vskip\openlineheight
+ \vfill
+ \fi}}%
+ \else
+ \bgroup
+ \ifstretchcolumns
+ \dimen0\ht\firstcolumnbox
+ \dimen2=\bottomtolerance\ht\firstcolumnbox
+ \setbox0\vbox{\unvcopy\lastcolumnbox}%
+ \advance\dimen0 -\ht0\relax
+ \advance\dimen0 -\dp0\relax
+ \ifdim\dimen0>\openlineheight\relax
+ \ifdim\dimen0>\dimen2\relax
+ % \stretchcolumnsfalse % beter goed slecht dan slecht goed
+ \showmessage\m!columns9\empty
+ \fi
+ \fi
+ \fi
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+ {\ifstretchcolumns
+ \unvbox\currentcolumnbox
+ \else
+ \box\currentcolumnbox
+ \vfill
+ \fi}}%
+ \egroup
+ \fi
+ \else
+ % a one liner is not properly handled here, so best rewrite the text then
+ \showmessage\m!columns{10}\empty
+ \global\setbox\firstcolumnbox\vbox{\unvbox0}%
+ \fi
+ \global\output{\balancingerror}%
+ \b@selinebottomtrue % forces depth in separation rule
+ \flushcolumnedpage\plusone
+ \multicolumnseject
+ \egroup}
+
+\def\multicolumnseject
+ {\ifdim\pagetotal>\textheight
+ \eject % new
+ \else
+ \allowbreak
+ \fi}
+
+%D The multicolumn mechanism is incorporated in a \CONTEXT\
+%D interface, which acts like:
+%D
+%D \starttyping
+%D \startcolumns[n=4,balance=no]
+%D some text
+%D \stopcolumns
+%D \stoptyping
+%D
+%D The setup is optional. The default behaviour of columns
+%D can be set up with:
+%D
+%D \starttyping
+%D \setupcolumns
+%D [n=2,
+%D balance=yes]
+%D \stoptyping
+%D
+%D In this case, stretching is according to the way it's
+%D done outside columns (\type{\inheritcolumnstrue}). Also
+%D we can setup the \type{tolerance} within a column, the
+%D \type{distance} between columns and the fixed
+%D \type{height} of a column.
+
+%D Multi||column output: the float routines
+%D
+%D Here come the routines that handle the placement of column
+%D floats. Floats that are to big migrate to the next
+%D column. Floats that are too wide, migrate to the top of the
+%D next page, where they span as much columns as needed.
+%D Floats that are left over from outside the multi||column
+%D mode are flushed first. In macro \type{\finaloutput} the
+%D topfloats that are left from previous text should be set.
+%D
+%D When there are some floats in the queue, we inhibit the
+%D flushing of floats on top of columns. The number of
+%D waiting floats is preswent in \type{\savednoftopfloats} and
+%D is saved. As long as there are floats waiting, the topfloats
+%D are places as if we are outside multi||column mode. This is
+%D neccessary for e.g. multicolumn lists.
+%D
+%D When all those floats are flushed, we switch to the local
+%D flushing routine.
+
+\def\setcolumnfloats
+ {\xdef\globalsavednoffloats{\the\savednoffloats}%
+ \ifnum\globalsavednoffloats>\zerocount
+ \setglobalcolumnfloats
+ \else
+ \setlocalcolumnfloats
+ \fi}
+
+\def\setglobalcolumnfloats
+ {\everypar\emptytoks
+ \let\flushcolumnfloat\relax
+ %\let\doroomfloat\relax
+ \let\docheckiffloatfits\relax
+ \let\flushcolumnfloats\noflushcolumnfloats}
+
+\def\setlocalcolumnfloats
+ {\everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}%
+ \let\flushcolumnfloat\doflushcolumnfloat
+ %\let\doroomfloat\docolumnroomfloat
+ \let\docheckiffloatfits\docolumnroomfloat
+ \let\flushcolumnfloats\doflushcolumnfloats
+ \let\doflushfloats\doflushcolumnfloats % new
+ \let\dosetbothinserts\relax
+ \let\dotopinsertions\relax}
+
+\def\noflushcolumnfloats
+ {\bgroup
+ \xdef\localsavednoffloats{\the\savednoffloats}%
+ \global\savednoffloats\globalsavednoffloats
+ \dotopinsertions
+ \xdef\globalsavenoffloats{\the\savednoffloats}%
+ \ifnum\globalsavednoffloats=\zerocount
+ \setlocalcolumnfloats
+ \fi
+ \global\savednoffloats\localsavednoffloats
+ \egroup}
+
+%D We need to calculate the amount of free space in a columns.
+%D When there is not enough room, we migrate the float to the
+%D next column. These macro's are alternatives (and
+%D look||alikes) of \type{\doroomfloat}. When a float is to
+%D wide, for one column, it is moved to the top of the next
+%D page. Of course such moved floats have to be taken into
+%D account when we calculate the available space. It's a pitty
+%D that such things are no integral part of \TEX.
+
+\def\getcolumnstatus\column#1\total#2\goal#3\\%
+ {\dimen0=\ifdim\pagegoal<\maxdimen \pagetotal \else \zeropoint \fi
+ \dimen2=\zeropoint
+ \count255=\zerocount
+ \dimen8=\columntextheight
+ \advance\dimen8 -\precolumnboxheight
+ \def\dogetcolumnstatus
+ {\advance\count255 \plusone
+ \advance\dimen2 \ht\currenttopcolumnbox
+ \advance\dimen2 \dp\currenttopcolumnbox
+ \dimen4\dimen2
+ \advance\dimen4 \dimen0
+ \dimen6=\count255\dimen8
+ \ifdim\dimen4>\dimen6
+ \else
+ \let\dogetcolumnstatus\relax
+ \fi}%
+ \dohandleallcolumns{\dogetcolumnstatus}%
+ \ifnum\count255=0 \count255=1 \fi
+ #1=\count255
+ #2=\dimen4
+ #3=\dimen6 }
+
+\def\getinsertionheight
+ {\ifdim\pagegoal<\maxdimen
+ \bgroup
+ \dimen0=\columntextheight
+ \advance\dimen0 -\pagegoal
+ \xdef\insertionheight{\the\dimen0}%
+ \egroup
+ \else
+ \global\let\insertionheight\zeropoint
+ \fi}
+
+\def\docolumnroomfloat
+ {\ifpostponecolumnfloats
+ \global\roomforfloatfalse
+ \else\ifnofloatpermitted
+ \global\roomforfloatfalse
+ \else
+ \bgroup
+ \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
+ \advance\dimen0 2\openlineheight % nog nodig ?
+ %\ifnum\count255=\nofcolumns
+ % \getinsertionheight
+ % %\message{\insertionheight}\wait
+ % \advance\dimen0 \insertionheight
+ %\fi
+ \setbox\scratchbox\vbox % tricky met objecten ?
+ {\blank[\@@bkspacebefore]
+ \snaptogrid\vbox{\copy\floatbox}}%
+ \advance\dimen0 \ht\scratchbox
+ \advance\dimen0 .5\lineheight % needed because goal a bit higher
+ %\message{column: \the\count255; total: \the\dimen0; goal: \the\dimen2}\wait
+ \ifdim\dimen0>\dimen2
+ \global\roomforfloatfalse
+ \else
+ \global\roomforfloattrue
+ \fi
+ \ifdim\wd\floatbox>\hsize
+ \showmessage\m!columns{11}\empty
+ \global\roomforfloatfalse
+ \fi
+ \egroup
+ \fi\fi}
+
+%D Flushing one float is done as soon as possible, i.e.
+%D \type{\everypar}. This means that (at the moment)
+%D sidefloats are not supported (overulled)!
+
+\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue
+
+\def\doflushcolumnfloat
+ {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting
+ \bgroup
+ \forgetall
+ \let\doflushcolumnfloat\relax
+ \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\%
+ \ifdim\dimen0>\zeropoint
+ \dogetfloat
+ \ifdim\wd\floatbox>\hsize
+ \doresavefloat
+ \else
+ %\setbox2=\vbox
+ % {\blank[\@@bkspacebefore]
+ % \snaptogrid\vbox{\copy\floatbox}%
+ % \blank[\@@bkspaceafter]
+ \setbox2=\vbox
+ {\blank[\@@bkspacebefore]
+ \snaptogrid\vbox{\copy\floatbox}}%
+ \advance\dimen0 \ht2
+ \ifdim\dimen0>\dimen2
+ \ifnum\mofcolumns<\nofcolumns
+ \advance\mofcolumns \plusone
+%% bug %% \edef\currenttopcolumnbox{\getvalue{\@@topcol\the\count255}}%
+ \ifdim\ht\currenttopcolumnbox=\zeropoint
+ \global\setbox\currenttopcolumnbox\vbox
+ {\snaptogrid\vbox{\copy\floatbox}
+ \whitespace % nodig ?
+ \blank[\@@bkspaceafter]}%
+ \dimen4=\ht\currenttopcolumnbox
+ \advance\dimen4 \dp\currenttopcolumnbox
+ \global\advance\vsize -\dimen4
+ \advance\dimen4 -\pagegoal
+ \global\pagegoal-\dimen4
+ \showmessage\m!columns{12}a%
+ \else
+ \showmessage\m!columns{12}b%
+ \doresavefloat
+ \fi
+ \else
+ \showmessage\m!columns{12}c%
+ \doresavefloat
+ \fi
+ \else
+ \ifhmode{\setbox0\lastbox}\fi% waar is die er in geslopen
+ \par
+ \ifdim\prevdepth<\zeropoint \else % anders bovenaan kolom witruimte
+ \nobreak
+ \blank[\@@bkspacebefore]
+ \nobreak
+ \fi
+ \flushfloatbox
+ \blank[\@@bkspaceafter]
+ \fi
+ \fi
+ \fi
+ \egroup
+ \fi\fi\fi\fi}
+
+%D This one looks complicated. Upto \type{\nofcolumns} floats
+%D are placed, taking the width of a float into account. This
+%D routine can be improved on different ways:
+%D
+%D \startitemize[intro,packed]
+%D \item taking into account some imaginary baseline, just to
+%D get the captions in line
+%D \item multipass flushing until as many floats are displaced
+%D as possible
+%D \stopitemize
+%D
+%D When handling lots of (small) floats spacing can get worse
+%D because of lining out the columns.
+
+\def\doflushcolumnfloats
+ {\ifpostponecolumnfloats\else
+ \bgroup
+ \forgetall
+ \ifsomefloatwaiting
+ \dimen8\zeropoint
+ \dimen4\zeropoint
+ \count0\zerocount % count0 can be used local
+ \count2\nofcolumns % count2 can be used local
+ \dohandleallcolumns
+ {\ifnum\count0>\zerocount % the wide one's reserved space
+ \global\setbox\currenttopcolumnbox\vbox
+ {\snaptogrid\vbox
+ {\copy\currenttopcolumnbox
+ \hbox{\vphantom{\copy\floatbox}}}
+ \whitespace % nodig ?
+ \blank[\@@bkspaceafter]}%
+ \else
+ \dogetfloat
+ \ifdim\wd\floatbox>\finalcolumntextwidth % better somewhere else too
+ \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
+ \fi % otherwise the graphic may disappear
+ \ifdim\wd\floatbox>\hsize
+ \dimen0\wd\floatbox
+ \advance\dimen0 \intercolumnwidth
+ \dimen2\hsize
+ \advance\dimen2 \intercolumnwidth
+ \advance\dimen0 .5pt % hm, why 1
+ \advance\dimen2 .5pt % hm, why 2
+ \divide\dimen0 \dimen2
+ \count0\dimen0
+ \advance\count0 \plusone
+ \ifnum\count0>\count2
+ \doresavefloat
+ \count0\zerocount
+ \else
+ \dimen0=\count0\hsize
+ \advance\dimen0 \count0\intercolumnwidth
+ \advance\dimen0 -\intercolumnwidth
+ \global\setbox\floatbox\hbox to \dimen0
+ %{\hss\hbox{\copy\floatbox}\hss}%
+ {\processaction[\@@bklocation] % how easy to forget
+ [ \v!left=>\copy\floatbox\hss,
+ \v!right=>\hss\copy\floatbox,
+ \s!default=>\hss\copy\floatbox\hss,
+ \s!unknown=>\hss\copy\floatbox\hss]}%
+ \fi
+ \showmessage\m!columns{13}\empty
+ \else
+ % \showmessage\m!columns{13}\empty
+ \fi
+ \ifdim\ht\floatbox>\zeropoint\relax
+ \global\setbox\currenttopcolumnbox\vbox
+ {\snaptogrid\vbox
+ {\copy\currenttopcolumnbox
+ \copy\floatbox}
+ \whitespace % nodig ?
+ \blank[\@@bkspaceafter]}%
+ \fi
+ \dimen6\ht\currenttopcolumnbox
+ \advance\dimen6 \dp\currenttopcolumnbox
+ \fi
+ \ifdim\dimen4<\ht\currenttopcolumnbox
+ \dimen4\ht\currenttopcolumnbox
+ \fi
+ \advance\dimen8 \dimen6
+ \advance\count2 \minusone
+ \advance\count0 \minusone }%
+ \setvsize
+ \global\advance\vsize -\dimen8
+ \global\pagegoal\vsize
+ \else
+ %\doflushfloats % does not snap!
+ \fi
+ \egroup
+ \fi}
+
+%D The next macro can be used to flush floats in the current
+%D stream. No width checking is (yet) done.
+
+\def\insertcolumnfloats
+ {\doloop
+ {\ifsomefloatwaiting
+ \bgroup
+ \forgetall
+ % no check for width
+ \dogetfloat
+ \blank[\@@bkspacebefore]
+ \snaptogrid\vbox{\copy\floatbox}
+ \blank[\@@bkspaceafter]
+ \egroup
+ \else
+ \exitloop
+ \fi}}
+
+%D This were the multi||column routines. They can and need to
+%D be improved but at the moment their behaviour is acceptable.
+%D
+%D One inprovement can be to normalize the height of floats
+%D to $n\times$\type{\lineheight} with a macro like:
+%D
+%D \starttyping
+%D \normalizevbox{...}
+%D \stoptyping
+
+% border case, should fit on one page
+%
+% \startcolumns
+%
+% 1 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{1}}
+% 2 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{2}}
+% 3 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{3}}
+%
+% \stopcolumns
+
+\def\setupcolumns
+ {\dosingleempty\dosetupcolumns}
+
+\def\dosetupcolumns[#1]%
+ {\getparameters[\??kl][#1]%
+ \nofcolumns\@@kln\relax
+ \processaction
+ [\@@klrule]
+ [ \v!on=>\let\betweencolumns\linebetweencolumns,
+ \v!off=>\let\betweencolumns\spacebetweencolumns,
+ \s!default=>\let\betweencolumns\spacebetweencolumns,
+ \s!unknown=>\let\betweencolumns\@@klrule]}
+
+\def\linebetweencolumns
+ {\bgroup
+ \starttextproperties
+ \ifdim\@@kldistance>\zeropoint
+ \dimen0=\@@kldistance
+ \else
+ \dimen0=\linewidth
+ \fi
+ \advance\dimen0 -\linewidth
+ \hskip.5\dimen0
+ \vrule
+ \!!width\linewidth
+ \ifb@selinebottom\!!depth\strutdepth\fi
+ \hskip.5\dimen0\relax
+ \stoptextproperties
+ \egroup}
+
+\def\spacebetweencolumns
+ {\hskip\@@kldistance}
+
+\presetlocalframed[\??kl]
+
+\def\backgroundfinishcolumnbox
+ {\doifinsetelse\@@kloffset{\v!none,\v!overlay}
+ {\let\@@kloffset\!!zeropoint}
+ {\scratchdimen\@@kloffset
+ \advance\scratchdimen -\@@klrulethickness
+ \edef\@@kloffset{\the\scratchdimen}}%
+ \localframed
+ [\??kl]
+ [\c!strut=\v!no,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!align=]}
+
+\let\restorecolumnsettings\relax
+
+\definecomplexorsimpleempty\startcolumns
+
+\def\complexstartcolumns[#1]% %% \startcolumns
+ {\bgroup
+ \let\stopcolumns\egroup
+ \ifinsidecolumns
+ \else
+ \setupcolumns[#1]%
+ \ifnum\@@kln>1\relax
+ \whitespace
+ \begingroup
+ \doif\@@kloption\v!background
+ {\let\finishcolumnbox\backgroundfinishcolumnbox
+ \let\columntextoffset\@@kloffset}%
+ \ifx\@@klcommand\empty\else
+ \let\postprocesscolumnline\@@klcommand
+ \fi
+ \doifelsenothing\@@klheight
+ \heightencolumnsfalse
+ \heightencolumnstrue
+ \doifelse\@@kldirection\v!right
+ \reversecolumnsfalse
+ \reversecolumnstrue
+ \doifelse\@@klbalance\v!yes
+ \balancecolumnstrue
+ \balancecolumnsfalse
+\installalign\v!yes {\stretchcolumnstrue \inheritcolumnsfalse}% todo: new key
+\installalign\v!no {\stretchcolumnsfalse\inheritcolumnsfalse}% todo: new key
+\installalign\v!text{\stretchcolumnsfalse\inheritcolumnstrue }%
+\stretchcolumnsfalse
+\inheritcolumnstrue
+\doifsomething\@@klalign{\expanded{\setupalign[\@@klalign]}}%
+% \processaction
+% [\@@klalign]
+% [ \v!yes=>\stretchcolumnstrue
+% \inheritcolumnsfalse,
+% \v!no=>\stretchcolumnsfalse
+% \inheritcolumnsfalse,
+% \v!text=>\stretchcolumnsfalse
+% \inheritcolumnstrue]%
+ \nofcolumns=\@@kln
+ %
+ % probably more is needed, and how about nesting save's
+ %
+ \savecurrentblank
+ \savecurrentwhitespace
+ \def\restorecolumnsettings
+ {\boxmaxdepth\maxdimen % done elsewhere
+ \restorecurrentblank
+ \restorecurrentwhitespace}%
+ %
+ \edef\fixedcolumnheight{\@@klheight}%
+ \edef\minbalancetoplines{\@@klntop}%
+ \setuptolerance[\@@kltolerance]% %% \startcolumns
+ \setupblank[\@@klblank]%
+ \ifdim\ctxparskip>\zeropoint\relax
+ \setupwhitespace[\@@klblank]%
+ \fi
+ \def\stopcolumns
+ {\endmulticolumns
+ \global\insidecolumnsfalse
+ \endgroup
+ \egroup}%
+ \global\insidecolumnstrue
+ \beginmulticolumns
+ \fi
+ \fi}
+
+\installcolumnbreakhandler {MUL} \v!preference
+ {\goodbreak}
+
+\installcolumnbreakhandler {MUL} \v!yes
+ {\par % todo: since
+ {\testrulewidth\zeropoint\ruledvskip\textheight} % we misuse a
+ \penalty-200 % side effect
+ \vskip-\textheight
+ }% bugged : \prevdepth-\thousandpoint} % signals top of column to \blank
+
+%D New: only at start of columns; may change ! Rather
+%D interwoven and therefore to be integrated when the multi
+%D column modules are merged. (moved from cont-new.tex)
+
+\def\setupcolumnspan[#1]%
+ {\getparameters[\??ks][#1]}
+
+\presetlocalframed
+ [\??ks]
+
+\setupcolumnspan
+ [\c!n=2,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off]
+
+\newbox\columnspanbox \let\postprocesscolumnspanbox\gobbleoneargument
+
+\def\dostartcolumnspan[#1]%
+ {\bgroup
+ \setupcolumnspan[#1]%
+ \forgetall
+ \ifinsidecolumns
+ \advance\hsize \intercolumnwidth
+ \hsize\@@ksn\hsize
+ \advance\hsize -\intercolumnwidth
+ \fi
+ \dowithnextbox
+ {\setbox\columnspanbox\flushnextbox
+ \ifinsidecolumns\wd\columnspanbox\hsize\fi
+ \postprocesscolumnspanbox\columnspanbox
+ \scratchdimen\ht\columnspanbox
+ \setbox\columnspanbox\hbox % depth to be checked, probably option!
+ {\localframed[\??ks][\c!offset=\v!overlay]{\box\columnspanbox}}%
+ \ht\columnspanbox\scratchdimen
+ \dp\columnspanbox\strutdp
+ \wd\columnspanbox\hsize
+ \ifinsidecolumns
+ \ifnum\@@ksn>1
+ \setvsize
+ \dohandleallcolumns
+ {\ifnum\currentcolumn>\@@ksn\else
+ \global\setbox\currenttopcolumnbox=\vbox
+ {\ifnum\currentcolumn=1
+ \snaptogrid\vbox{\copy\columnspanbox}
+ \else
+ \snaptogrid\vbox{\vphantom{\copy\columnspanbox}}
+ \fi}%
+ \wd\currenttopcolumnbox\hsize
+ \global\advance\vsize -\ht\currenttopcolumnbox
+ \fi}
+ \global\pagegoal\vsize
+ \else
+ \snaptogrid\vbox{\box\columnspanbox}
+ \fi
+ \else
+ \snaptogrid\vbox{\box\columnspanbox}
+ \fi
+ \endgraf
+ \ifvmode\prevdepth\strutdp\fi
+ \egroup}
+ \vbox\bgroup
+ %\topskipcorrection % becomes an option !
+ \EveryPar{\begstrut\EveryPar{}}} % also !
+
+\def\startcolumnspan
+ {\dosingleempty\dostartcolumnspan}
+
+\def\stopcolumnspan
+ {\egroup}
+
+\setupcolumns
+ [\c!n=2,
+ \c!ntop=1,
+ \c!command=,
+ \c!direction=\v!right,
+ \c!rule=\v!off,
+ \c!tolerance=\v!tolerant,
+ \c!distance=1.5\bodyfontsize, % influenced by switching
+ \c!height=,
+ \c!balance=\v!yes,
+ \c!align=\v!text,
+ \c!blank={\v!line,\v!fixed},
+ \c!option=,
+ \c!rulethickness=\linewidth,
+ \c!offset=.5\bodyfontsize]
+
+%D Undocumented and still under development.
+
+\def\startsimplecolumns
+ {\dosingleempty\dostartsimplecolumns}
+
+\def\dostartsimplecolumns[#1]%
+ {\bgroup
+ \nopenalties
+ \getparameters[\??kl]
+ [\c!width=\hsize,\c!distance=1.5\bodyfontsize,%
+ \c!n=2,\c!lines=0,#1]%
+ \let\rigidcolumnlines\@@kllines
+ \setrigidcolumnhsize\@@klwidth\@@kldistance\@@kln
+ \setbox\scratchbox\vbox\bgroup
+ \forgetall} % \blank[\v!disable]
+
+\def\stopsimplecolumns
+ {\removebottomthings
+ \egroup
+ \rigidcolumnbalance\scratchbox
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv
new file mode 100644
index 000000000..88ec7a5e7
--- /dev/null
+++ b/tex/context/base/page-mul.mkiv
@@ -0,0 +1,1751 @@
+%D \module
+%D [ file=page-mul, % was: core-mul
+%D version=1998.03.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Multi Column Output,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Simple Multi Column}
+
+%D This module is mostly a copy from the original multi column
+%D routine as implemented in \type {core-mul}. When the main
+%D OTR macro's were isolated in modules and column sets were
+%D introduced, this module became part of the OTR modules. As
+%D a result this module is no longer generic. It also needs
+%D an overhaul.
+
+\unprotect
+
+% TO DO !
+
+\let\OTRMULsetvsize \OTRONEsetvsize
+\let\OTRMULsethsize \OTRONEsethsize
+\let\OTRMULdopagecontents \OTRONEdopagecontents
+\let\OTRMULfinalsidefloatoutput\OTRONEfinalsidefloatoutput % ???
+\let\OTRMULflushfloatbox \OTRONEflushfloatbox
+
+\let\OTRMULdosettopinserts \relax
+\let\OTRMULdosetbotinserts \relax
+\let\OTRMULdotopinsertions \relax
+\let\OTRMULdobotinsertions \relax
+\let\OTRMULdosetbothinserts \relax
+\let\OTRMULflushsavedfloats \relax
+
+\let\OTRMULflushsidefloats \forgetsidefloats % \relax
+\let\OTRMULsynchronizesidefloats\forgetsidefloats % \relax
+
+\newtoks \OTRMULoutput
+
+\def\OTRMULgotonextpage
+ {\ejectpage}
+
+\def\OTRMULgotonextpageX % will become obsolete
+ {\superejectpage}
+
+% check \count<insert> multiplications
+
+% some day try this in balancing routine
+%
+% \ifdim\pagetotal>\pagegoal
+% \eject
+% \else
+% \goodbreak
+% \fi
+
+%D The following macro's implement a multi||column output
+%D routine. The original implementation was based on Donald
+%D Knuth's implementation, which was adapted by Craig Platt to
+%D support balancing of the last page. I gradually adapted
+%D Platt's version to our needs but under certain
+%D circumstances things still went wrong. I considered all
+%D calls to Platt's \type{\balancingerror} as undesirable.
+
+%D This completely new implementation can handle enough
+%D situations for everyday documents, but is still far from
+%D perfect. While at the moment the routine doesn't support
+%D all kind of floats, it does support:
+%D
+%D \startitemize[packed]
+%D \item an unlimitted number of columns
+%D \item ragged or not ragged bottoms
+%D \item optional balancing without \type{\balancingerrors}
+%D \item different \type{\baselineskips}, \type{\spacing},
+%D \type{\topskip} and \type{\maxdepth}
+%D \item left- and right indentation, e.g. within lists
+%D \item moving columns floats to the next column or page
+%D \item handling of floats that are to wide for a columns
+%D \stopitemize
+%D
+%D One could wonder why single and multi||columns modes are
+%D still separated. One reason for this is that \TeX\ is not
+%D suited well for handling multi||columns. As a result, the
+%D single columns routines are more robust. Handling one
+%D column as a special case of multi||columns is posible but at
+%D the cost of worse float handling, worse page breaking,
+%D worse etc. Complicated multi||column page handling should
+%D be done in \cap{DTP}||systems anyway.
+%D
+%D There are three commands provided for entering and leaving
+%D multi||column mode and for going to the next column:
+%D
+%D \interface \type{\beginmulticolumns} \\ \\
+%D \interface \type{\endmulticolumns} \\ \\
+%D \interface \type{\ejectcolumn} \\ \\
+%D
+%D This routines are sort of stand||alone. They communicate
+%D with the rest of \CONTEXT\ by means of some interface
+%D macro's, which we only mention.
+%D
+%D \interface \type{\nofcolumns} \\
+%D the number of columns \\
+%D \interface \type{\minbalancetoplines} \\
+%D the minimum number op balanced top lines \\
+%D \interface \type{\betweencolumns} \\
+%D the stuff between columns \\
+%D \interface \type{\finaloutput{action}{box}} \\
+%D some kind of \type{\pagebody} and \type{\shipout} \\
+%D
+%D \interface \type{\ifbalancecolumns} \\
+%D balancing the colums or not \\
+%D \interface \type{\ifstretchcolumns} \\
+%D ragging the bottom or not \\
+%D
+%D \interface \type{\ifheightencolumns} \\
+%D fix the heigh tor not \\
+%D \interface \type{\fixedcolumnheight} \\
+%D the optional fixed height \\
+%D
+%D \interface \type{\ifinheritcolumns} \\
+%D handle ragging or not \\
+%D \interface \type{\ifr@ggedbottom} \\
+%D use ragged bottoms \\
+%D \interface \type{\ifb@selinebottom} \\
+%D put the bottom line on the baseline \\
+%D \interface \type{\ifnormalbottom} \\
+%D put the bottom line at the baseline \\
+%D
+%D \interface \type{\ifreversecolumns} \\
+%D reverse the order in wich columns are flushed \\
+%D
+%D \interface \type{\usercolumnwidth} \\
+%D the calculated width of a column \\
+%D \interface \type{\columntextwidth} \\
+%D the maximum width of a column \\
+%D \interface \type{\columntextheight} \\
+%D the minimum width of a column \\
+%D
+%D \interface \type{\spacingfactor} \\
+%D the spacing factor \\
+%D \interface \type{\bodyfontsize} \\
+%D the (local) bodyfontsize \\
+%D \interface \type{\openlineheight} \\
+%D the lineheight (including \type{\spacing}) \\
+%D
+%D \interface \type{\EveryBodyFont} \\
+%D communication channel to font switching routines \\
+%D
+%D \interface \type{\global\settopskip} \\
+%D set \type{\topskip} \\
+%D \interface \type{\setvsize} \\
+%D set \type{\vsize} and \type{\pagegoal} \\
+%D \interface \type{\sethsize} \\
+%D set \type{\hsize} \\
+%D
+%D \interface \type{\flushcolumnfloats} \\
+%D push saved column floats (next page) \\
+%D \interface \type{\flushcolumnfloat} \\
+%D push saved column floats (next column) \\
+%D \interface \type{\setcolumnfloats} \\
+%D initialize column floats \\
+%D
+%D \interface \type{\finishcolumnbox} \\
+%D do something special (a hook) \\
+%D \interface \type{\postprocesscolumnpagebox} \\
+%D do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnbox} \\
+%D do something with each columnbox (also a hook) \\
+%D \interface \type{\postprocesscolumnline} \\
+%D do something with each columnline (also a hook) \\
+%D \interface \type{\currentcolumn} \\
+%D the current column \\
+%D
+%D These interface macro's are called upon or initialized
+%D by the multi||column macro's.
+
+%D A lot of footnote stuff added!
+
+\def\finalcolumntextwidth {\makeupwidth}
+\def\finalcolumntextheight {\textheight}
+\def\columntextwidth {\makeupwidth}
+\def\columntextheight {\textheight}
+\def\usercolumnwidth {\textwidth}
+\def\columntextoffset {\!!zeropoint}
+
+\def\fixedcolumnheight {\textheight}
+\def\betweencolumns {\hskip\bodyfontsize}
+
+\let\setcolumnfloats \relax % in CONTEXT used for floats
+\let\flushcolumnfloats \relax % in CONTEXT used for floats
+\let\flushcolumnfloat \relax % in CONTEXT used for floats
+\let\finishcolumnbox \relax % in CONTEXT used for backgrounds
+
+% %D In fact, the column height and width are set by means of
+% %D two macro's. One can change their meaning if needed:
+%
+% \def\setcolumntextheight
+% {\def\columntextheight{\teksthoogte}}
+%
+% \def\setcolumntextwidth
+% {\def\columntextwidth{\zetbreedte}}
+
+%D Both macros are redefined in \CONTEXT\ when backgrounds
+%D are applied to columns. The final values are used when
+%D flushing the columns.
+
+\newtoks\singlecolumnout % remove that one
+
+%D It's more convenient to use \type {\columnwidth} instead
+%D of messing around with boxes each time.
+
+\newdimen\columnwidth
+\newdimen\gutterwidth
+
+\def\determinecolumnwidth
+ {\bgroup
+ \setbox\scratchbox\hbox
+ {\setcolumnhsize
+ \global\columnwidth\usercolumnwidth
+ \global\gutterwidth\intercolumnwidth}%
+ \egroup}
+
+%D Going to a new columns is done by means of a
+%D \type{\ejectcolumn}. The following definition does not
+%D always work.
+
+\def\ejectcolumn
+ {\goodbreak\showmessage\m!columns2\empty}
+
+%D The next macro should never be called so let's deal with it.
+%D There were several solutions to these kind of errors. First
+%D we check for a good breakpoint before firing up the
+%D multi||column routine (\type{\break} or \type{\allowbreak}).
+%D We do the same at the end of the routine
+%D (\type{\allowbreak}). These allowances are definitely
+%D needed!
+%D
+%D Some on first sight redundant calls to for instance
+%D \type{\setvsize} in the flushing, splitting and balancing
+%D macro's can definitely not be omitted! Some are just there
+%D to handle situations that only few times arise. One of
+%D those can be that the output routine is invoked before
+%D everything is taken care of. This happens when we
+%D flush (part of) the current page with an \type{\unvbox}
+%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One
+%D simply cannot balance columns that are just balanced.
+%D
+%D I hope one never sees the following message. Because it
+%D took me a lot of time to develop the multi||columns
+%D routines, every (although seldom) warning gives me the
+%D creeps!
+
+\def\balancingerror
+ {\showmessage\m!columns3\empty
+ \finaloutput\unvbox\normalpagebox}
+
+\def\OTRMULsometopsfloat{\showmessage\m!columns4\empty \someherefloat}
+\def\OTRMULsomebotsfloat{\showmessage\m!columns5\empty \someherefloat}
+
+\def\OTRMULsomeherefloat{\OTRONEsomeherefloat}
+
+%D The local column width is available in the dimension
+%D register \type{\localcolumnwidth}, which is calculated as:
+
+\def\setcolumnhsize % beware, this one is available for use in macros
+ {\setbox\scratchbox\hbox{\parindent\zeropoint\betweencolumns}%
+ \intercolumnwidth\wd\scratchbox
+ \localcolumnwidth\columntextwidth
+ \advance\localcolumnwidth -\leftskip
+ \advance\localcolumnwidth -\rightskip
+ % new
+ \advance\localcolumnwidth -\colleftskip
+ \advance\localcolumnwidth -\colrightskip
+ %
+ \advance\localcolumnwidth -\nofcolumns\intercolumnwidth
+ \advance\localcolumnwidth \intercolumnwidth
+ \divide \localcolumnwidth \nofcolumns
+ \scratchdimen\columntextoffset
+ \multiply\scratchdimen \plustwo
+ \advance\localcolumnwidth -\scratchdimen
+ \usercolumnwidth\localcolumnwidth
+ \hsize\localcolumnwidth} % we don't do it \global
+
+%D Torture test:
+%D
+%D \startbuffer
+%D \startbuffer[b]
+%D \startcolumns
+%D \input tufte
+%D \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower
+%D \input tufte
+%D \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower
+%D \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns
+%D \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startcolumns \startnarrower[left]
+%D \input tufte
+%D \stopnarrower \stopcolumns
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns
+%D \input tufte
+%D \stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower \startcolumns \startnarrower
+%D \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D
+%D \startbuffer[b]
+%D \startnarrower[left] \startcolumns \startnarrower
+%D \input tufte
+%D \stopnarrower\stopcolumns \stopnarrower
+%D \stopbuffer
+%D \typebuffer[b] \getbuffer[b]
+%D \stopbuffer
+%D
+%D \start
+%D \def\postprocesscolumnline#1{\ruledhbox{\strut\box#1}\hss}
+%D \getbuffer
+%D \stop
+
+%D One should be aware that when font related dimensions are
+%D used in typesetting the in||between material, these
+%D dimensions are influenced by bodyfont switches inside
+%D multi||column mode.
+
+\newdimen\mcscratchdimen
+\newcount\nofcolumnlines
+
+\chardef\multicolumnlinemethod\zerocount % 0: overshoot (old default), 1: tight
+% \chardef\multicolumnlinemethod\plusone
+
+\def\getmulticolumnlines
+ {\mcscratchdimen-\columntextoffset
+ \multiply\mcscratchdimen \plustwo
+ \advance\mcscratchdimen \columntextheight
+ \ifdim\precolumnboxheight>\zeropoint
+ \advance\mcscratchdimen -\precolumnboxheight
+ \fi
+ \settotalinsertionheight
+ \advance\mcscratchdimen -\totalinsertionheight
+ \ifcase\multicolumnlinemethod \getnoflines\mcscratchdimen
+ \or \getrawnoflines\mcscratchdimen
+ \else \getrawnoflines\mcscratchdimen
+ \fi
+ % added 30/7/2004
+ \ifnum\layoutlines>\zerocount \ifnum\noflines>\layoutlines
+ \noflines\layoutlines
+ \fi \fi
+ \nofcolumnlines\noflines}
+
+\def\multicolumnovershootratio{.5} % {\ifgridsnapping0\else.5\fi}
+
+\def\setcolumnvsize
+ {\getmulticolumnlines
+ \mcscratchdimen\nofcolumnlines\openlineheight
+ \advance\mcscratchdimen \multicolumnovershootratio\openlineheight % collect enough data
+ \global\vsize\nofcolumns\mcscratchdimen
+ \global\pagegoal\vsize} % let's do it only here
+
+%D It really starts here. After some checks and initializations
+%D we change the output routine to continous multi||column
+%D mode. This mode handles columns that fill the current and
+%D next full pages. The method used is (more or less)
+%D multiplying \type{\vsize} and dividing \type{\hsize} by
+%D \type{\nofcolumns}. More on this can be found in the
+%D \TeX book. We save the top of the current page in box
+%D \type{\precolumnbox}.
+%D
+%D We manipulate \type{\topskip} a bit, just to be shure that
+%D is has no flexibility. This has te be done every time a
+%D font switch takles place, because \type{\topskip} can depend
+%D on this.
+%D
+%D Watch the trick with the \type{\vbox}. This way we get the
+%D right interlining and white space.
+
+\def\beginmulticolumns
+ {\par
+ \flushnotes
+ \xdef\precolumndepth{\the\prevdepth}%
+ \begingroup
+ % new
+ \leftskip1\leftskip
+ \rightskip1\rightskip
+ \edef\colleftskip {\the\leftskip}%
+ \edef\colrightskip{\the\rightskip}%
+ \leftskip\zeropoint
+ \rightskip\zeropoint
+ %
+ \dontshowcomposition
+ %\setcolumntextwidth\relax
+ %\setcolumntextheight\relax
+ \widowpenalty\zerocount % is gewoon beter
+ \clubpenalty \zerocount % zeker bij grids
+ \dopushcolumnfloats
+ \dimen0\dimexpr\pagetotal+\parskip+\openlineheight\relax
+ \ifdim\dimen0<\pagegoal
+ \allowbreak
+ \else
+ \break % Sometimes fails
+ \fi
+ \appendtoks\topskip1\topskip\to\everybodyfont
+ \the\everybodyfont % ugly here
+ \saveinterlinespace % ugly here
+ \initializecolumns\nofcolumns
+ \hangafter\zerocount
+ \hangindent\zeropoint
+ \everypar\emptytoks
+ \ifdim\pagetotal=\zeropoint \else
+ \verticalstrut
+ \vskip-\struttotal
+ \fi
+ \global\savedpagetotal\pagetotal
+ \global\singlecolumnout\output
+ %\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}%
+ \global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
+ \eject % no \holdinginserts=1, can make footnote disappear !
+ \global\precolumnboxheight\ht\precolumnbox
+ \global\output{\continuousmulticolumnsout}%
+ \setcolumnfloats
+ \dohandleallcolumns
+ {\global\setbox\currenttopcolumnbox\emptybox}%
+ \checkbegincolumnfootnotes
+ \activateotr{MUL}{ONE}% todo ! ! ! !
+ \let\sethsize\setcolumnhsize
+ \let\setvsize\setcolumnvsize
+ \sethsize
+ \setvsize
+ \showcomposition}
+
+%D When we leave the multi||column mode, we have to process the
+%D not yet shipped out part of the columns. When we don't
+%D balance, we simply force a continuous output, but a balanced
+%D output is more tricky.
+
+%D First we try to fill up the page and when all or something
+%D is left we try to balance things. This is another useful
+%D adaption of the ancesters of these macro's. It takes some
+%D reasoning to find out what happens and maybe I'm making
+%D some mistake, but it works.
+%D
+%D Voiding box \type{\precolumnbox} is sometimes necessary,
+%D e.g. when there is no text given between \type{\begin..}
+%D and \type{\end..}. The \type{\par} is needed!
+
+\chardef\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! !
+
+\def\endmulticolumns
+ {%\par
+ \ifnum\multicolumnendsyncmethod=\plustwo
+ \synchronizeoutput
+ \else
+ % don't combine these
+ \vskip\lineheight
+ \vskip-\lineheight % take footnotes into account
+ \fi
+ \dontshowcomposition
+ \doflushcolumnfloat % added recently
+ %\doflushcolumnfloats % no, since it results in wrong top floats
+ \flushnotes % before start of columns
+ \par
+ \ifbalancecolumns
+ \ifnum\multicolumnendsyncmethod=\plusone
+ \global\output{\continuousmulticolumnsout}%
+ \goodbreak
+ \fi
+ \global\output{\balancedmulticolumnsout}%
+ \else
+ \goodbreak
+ \fi
+ \eject % the prevdepth is important, try e.g. toclist in
+ \prevdepth\zeropoint % columns before some noncolumned text text
+ \global\output\singlecolumnout
+ \global\output{\the\mainoutput}% % % % % todo
+ \ifvoid\precolumnbox\else
+ \unvbox\precolumnbox
+ \fi
+ \global\precolumnboxheight\zeropoint
+ \endgroup % here
+ \nofcolumns\plusone
+ \setvsize % the outer one!
+ \synchronizeoutput % new may 2004 / we need to: \pagegoal\vsize
+ \checkendcolumnfootnotes
+ \dosomebreak\allowbreak
+ \dopopcolumnfloats}
+
+%D Because some initializations happen three times, we
+%D defined a macro for them. Erasing \type{\everypar} is
+%D needed because we don't want anything to interfere.
+
+\def\setmulticolumnsout
+ {\everypar\emptytoks
+ \dontcomplain
+ \settopskip
+ \setmaxdepth
+ \topskip1\topskip
+ \splittopskip\topskip
+ \splitmaxdepth\maxdepth
+ \boxmaxdepth\maxdepth % dangerous
+ \emergencystretch\zeropoint\relax} % sometimes needed !
+
+%D Flushing the page comes to pasting the columns together and
+%D appending the result to box \type{\precolumnbox}, if not
+%D void. I've seen a lot of implementations in which some skip
+%D was put between normal text and multi||column text. When we
+%D don't want this, the baselines can be messed up. I hope the
+%D seemingly complicated calculation of a correction
+%D \type{\kern} is adequate to overcome this. Although not
+%D watertight, spacing is taken into account and even multiple
+%D mode changes on one page go well. But cross your fingers and
+%D don't blame me.
+%D
+%D One of the complications of flushing out the boxes is that
+%D \type{\precolumnbox} needs to be \type{\unvbox}'ed, otherwise
+%D there is too less flexibility in the page when using
+%D \type{\r@ggedbottom}. It took a lot of time before these
+%D kind of problems were overcome. Using \type{\unvbox} at the
+%D wrong moment can generate \type{\balancingerror}'s.
+%D
+%D One can use the macros \type {\maxcolumnheight} and \type
+%D {\maxcolumndepth} when generating material between columns
+%D as well as postprocessing column lines.
+
+\let\maxcolumnheight=\zeropoint
+\let\maxcolumndepth =\zeropoint
+
+\newbox\columnpagebox
+
+\def\setmaxcolumndimensions
+ {\let\maxcolumnheight\!!zeropoint
+ \let\maxcolumndepth \!!zeropoint
+ \dohandleallcolumns
+ {\ifdim\ht\currentcolumnbox>\maxcolumnheight
+ \edef\maxcolumnheight{\the\ht\currentcolumnbox}%
+ \fi
+ \ifdim\dp\currentcolumnbox>\maxcolumndepth
+ \edef\maxcolumndepth{\the\dp\currentcolumnbox}%
+ \fi}}
+
+\chardef\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++
+\chardef\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid
+
+\def\flushprecolumnboxnogrid
+ {\unvbox\precolumnbox}
+
+\def\flushprecolumnboxongrid
+ {\scratchdimen\savedpagetotal
+ \advance\scratchdimen -\ht\precolumnbox
+ \advance\scratchdimen -\dp\precolumnbox
+ \advance\scratchdimen -\topskip
+ \box\precolumnbox
+ \kern\scratchdimen}
+
+\newconditional\someprecolumncontent
+
+\def\flushcolumnedpage#1%
+ {\bgroup
+ \ifvoid\precolumnbox
+ \setfalse\someprecolumncontent % will be set elsewhere
+ \else
+ \settrue\someprecolumncontent
+ \mkprocessboxcontents\precolumnbox
+ \fi
+ \forgetall
+ \setmulticolumnsout
+ \showcomposition
+ \setmaxcolumndimensions
+ \dohandleallcolumns
+ {\mkprocesscolumncontents\currentcolumnbox}%
+ \postprocesscolumns
+ \dohandleallcolumns % \hbox i.v.m. \showcomposition
+ {\global\setbox\currentcolumnbox\hbox to \localcolumnwidth
+ {\box\currentcolumnbox
+ \global\wd\currentcolumnbox\localcolumnwidth
+ \ifheightencolumns
+ \global\ht\currentcolumnbox\fixedcolumnheight
+ \fi}}%
+ \setmaxcolumndimensions
+ \overlaycolumnfootnotes
+ \setbox\columnpagebox\vbox
+ {\hbox to \finalcolumntextwidth
+ {\hskip\colleftskip\relax % new, \relax needed
+ \ifreversecolumns
+ \@EA\dohandlerevcolumns
+ \else
+ \@EA\dohandleallcolumns
+ \fi
+ {\finishcolumnbox{\hbox
+ {\ifx\finishcolumnbox\relax\else\strut\fi
+ \box\currentcolumnbox}}%
+ \hfil}%
+ \unskip
+ \hskip\colrightskip}}% new
+ \scratchdimen\zeropoint
+ \dohandleallcolumns
+ {\ifdim-\ht\currenttopcolumnbox<\scratchdimen
+ \scratchdimen-\ht\currenttopcolumnbox
+ \fi
+ \global\setbox\currenttopcolumnbox\emptybox}%
+ \advance\scratchdimen \ht\columnpagebox
+ \setbox\scratchbox\hbox to \columntextwidth
+ {\vrule
+ \!!width\zeropoint
+ \!!height\scratchdimen
+ \!!depth\dp\columnpagebox
+ \dostepwiserecurse2\nofcolumns1{\hfil\betweencolumns}\hfil}%
+ \setbox\columnpagebox\hbox
+ {\box\columnpagebox
+ \hskip-\columntextwidth
+ \box\scratchbox}%
+ \postprocesscolumnpagebox % new, acts upon \box\columnpagebox
+ \ifconditional\someprecolumncontent
+ \settrue\someprecolumncontent
+ % next some incredible crappy code
+ \ifcase\multicolumntopalignmethod
+ \flushprecolumnboxnogrid % not on grid
+ \or
+ \flushprecolumnboxongrid % force on grid
+ \else\ifgridsnapping % somehow this junk fails in pascal
+ \flushprecolumnboxongrid % obey grid settings, force on grid
+ \else
+ \flushprecolumnboxnogrid % ignore grid settings, not on grid
+ \fi \fi
+ \fi
+ \global\precolumnboxheight\zeropoint
+ \setvsize
+ \dosomebreak\nobreak % hm, only needed when topstuff
+ \ifgridsnapping
+ \else
+ \ifcase\multicolumntopflushmethod
+ % sometimes method 1 goes wrong, so we need a way out; best sort this out
+ % when we run into it again
+ \or
+ % \input tufte \startcolumns \showbaselines \input tufte \stopcolumns \input tufte
+ \ifconditional\someprecolumncontent
+% \scratchdimen\topskip
+% \advance\scratchdimen -\openstrutheight
+% \nointerlineskip
+% \vskip-\scratchdimen
+ \nointerlineskip
+ \vskip\dimexpr\openstrutheight-\topskip\relax
+ \fi
+ \or
+% \scratchdimen\topskip
+% \advance\scratchdimen -\openstrutheight
+% \nointerlineskip
+% \vskip-\scratchdimen
+ \nointerlineskip
+ \vskip\dimexpr\openstrutheight-\topskip\relax
+ \or
+ % untested but maybe handy
+% \scratchdimen\topskip
+% \advance\scratchdimen -\openstrutheight
+% \nointerlineskip
+% \vskip-\scratchdimen
+% \vskip-\lineheight
+% \vbox{\strut}%
+ \nointerlineskip
+ \vskip\dimexpr\openstrutheight-\topskip-\lineheight\relax
+ \vbox{\strut}%
+ \fi
+ \fi
+ \prevdepth\openstrutdepth
+ \nointerlineskip
+ \dp\columnpagebox\zeropoint
+ \global\finalcolumnheights\ht\columnpagebox
+ \getnoflines\finalcolumnheights
+ \global\finalcolumnlines\noflines
+ \ifcase#1\else
+ % messy correction, we need to rewrite this module (newcolumns)
+ \setbox\columnpagebox\vbox
+ {\offinterlineskip
+ \scratchdimen\ht\columnpagebox
+ \advance\scratchdimen\dp\columnpagebox % we probably lost that one already
+ \box\columnpagebox
+ \vskip-\scratchdimen}%
+ \scratchdimen\noflines\openlineheight
+ \advance\scratchdimen-\openstrutdepth
+ \advance\scratchdimen-\openlineheight
+ \advance\scratchdimen\topskip
+ \ht\columnpagebox\scratchdimen
+ \dp\columnpagebox\openstrutdepth
+ % end of mess
+ \fi
+ \box\columnpagebox
+ \egroup}
+
+%D In case one didn't notice, finaly \type{\finishcolumnbox} is
+%D applied to all boxes. One can use these hooks for special
+%D purposes.
+%D
+%D Once upon a time I wanted to manipulate the individual lines
+%D in a column. This feature is demonstrated in the two examples
+%D below.
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1% or \postprocesscolumnbox
+%D {\ruledhbox{\box#1}\hss}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line: \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we show the natural width of the lines:
+%D
+%D {\getbuffer}
+%D
+%D The next example does a bit more advanced manipulation:
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1%
+%D {\ifodd\currentcolumn
+%D \hfill\unhbox#1\relax
+%D \else
+%D \relax\unhbox#1\hfill
+%D \fi}
+%D
+%D \startcolumns[n=4]
+%D \dorecurse{25}{line \recurselevel\par}
+%D \stopcolumns
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we also see an application of \type{\currentcolumn}:
+%D
+%D {\getbuffer}
+%D
+%D This feature is implemented using the reshape macros
+%D presented in \type{supp-box}.
+
+\def\postprocesscolumns
+ {\ifx\postprocesscolumnline\undefined \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vtop
+ {\beginofshapebox
+ \unvbox\currentcolumnbox
+ \unskip\unskip
+ \endofshapebox
+ \reshapebox
+ {\dimen0\ht\shapebox
+ \dimen2\dp\shapebox
+ \setbox\shapebox\hbox to \hsize
+ {\postprocesscolumnline\shapebox}%
+ \ht\shapebox\dimen0
+ \dp\shapebox\dimen2
+ \box\shapebox}%
+ \flushshapebox
+ \everypar\emptytoks
+ \parskip\zeropoint % = \forgetall
+ \verticalstrut
+ \vskip-\struttotal
+ \vfil}}%
+ \fi
+ \ifx\postprocesscolumnbox\undefined \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\hbox
+ {\postprocesscolumnbox\currentcolumnbox}}
+ \fi}
+
+%D We default to doing nothing!
+
+\let\postprocesscolumnline =\undefined
+\let\postprocesscolumnbox =\undefined
+\let\postprocesscolumnpagebox=\relax
+
+%D \macros
+%D {reversecolumnstrue}
+%D
+%D We can force the macro that takes care of combining
+%D the columns, to flush them in the revere order. Of
+%D course, by default we don't reverse.
+
+\newif\ifreversecolumns
+
+%D Here comes the simple splitting routine. It's a bit
+%D longer than expected because of ragging bottoms or not.
+%D This part can be a bit shorter but I suppose that I will
+%D forget what happens. The splitting takes some already
+%D present material (think of floats) into account!
+%D
+%D First we present some auxiliary routines. Any material,
+%D like for instance floats, that is already present in the
+%D boxes is preserved.
+
+\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
+ {\bgroup
+ \ifdim\ht#4>\zeropoint
+ \dimen0\dimen#3\relax
+ \dimen2\dimen0
+ \advance\dimen0 -\ht#4%
+ \columnfootnotecorrection{#1}{\dimen0}%
+ \setbox0\vsplit#2 to \dimen0
+ \global\setbox#1\vbox to \dimen2
+ {\ifgridsnapping
+ \dimen0-\openstrutheight
+ \advance\dimen0 \topskip
+ \vskip\dimen0\copy#4\vskip-\dimen0
+ \else
+ \unvcopy#4%
+ \fi
+ \fuzzysnappedbox\unvbox0
+ \fakecolumnfootnotes{#1}}%
+ \else
+ \ifcase\clevernotes
+ \global\setbox#1\vsplit#2 to \dimen#3%
+ \global\setbox#1\vbox
+ {\fuzzysnappedbox\unvbox{#1}}% % or \box ?
+ \else
+ \columnfootnotecorrection{#1}{\dimen#3}%
+ \setbox0\vsplit#2 to \dimen#3%
+ \global\setbox#1\vbox to \dimen#3%
+ {\fuzzysnappedbox\unvbox0
+ \fakecolumnfootnotes{#1}}%
+ \fi
+ \fi
+ \egroup}
+
+\def\splitcurrentcolumn from \box#1to \dimen#2%
+ {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox}
+
+\def\splitfirstcolumn from \box#1to \dimen#2%
+ {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox}
+
+\def\splitlastcolumn from \box#1to \dimen#2%
+ {\global\setbox\lastcolumnbox\vbox
+ {\unvcopy\lasttopcolumnbox
+ \fuzzysnappedbox\unvbox{#1}%
+ \fakecolumnfootnotes\lastcolumnbox}}
+
+%D NEW: still to be documented.
+
+\def\fakecolumnfootnotes#1%
+ {\relax
+ \ifcase\clevernotes\else
+ \ifnum#1=\lastcolumnbox
+ \fakenotes
+ \fi
+ \fi}
+
+\def\columnfootnotecorrection#1#2%
+ {\relax
+ \ifcase\clevernotes
+ % page notes
+ \or
+ \ifnum#1=\firstcolumnbox\relax
+ \calculatetotalclevernoteheight
+ \advance#2 -\totalnoteheight
+ \fi
+ \else
+ \ifnum#1=\lastcolumnbox\relax
+ \calculatetotalclevernoteheight
+ \advance#2 -\totalnoteheight
+ \fi
+ \fi}
+
+\def\overlaycolumnfootnotes
+ {\relax
+ \ifcase\clevernotes
+ % page notes
+ \else
+ \checknotepresence
+ \ifnotespresent
+ % the note box has the depth of the notefont
+ % because a column (i.e. first column has no depth,
+ % we need to anchor top down)
+ \bgroup
+ \ifcase\clevernotes\or
+ \getmulticolumnlines
+ \advance\nofcolumnlines \minustwo
+ \scratchdimen\nofcolumnlines\lineheight
+ \advance\scratchdimen \topskip
+ \setbox0\hbox
+ {\lower\scratchdimen\vbox{\placenoteinserts}}%
+ \ht0=\openstrutheight % \strutht
+ \dp0=\openstrutdepth % \strutdp
+ \wd0=\zeropoint
+ \scratchdimen\ht\firstcolumnbox
+ \global\setbox\firstcolumnbox\vbox to \scratchdimen
+ {\box\firstcolumnbox
+ \vskip-\scratchdimen
+ \box0}%
+ \else
+ % maybe here also \getmulticolumnlines
+ \scratchdimen\ht\firstcolumnbox
+ \advance\scratchdimen -\openstrutdepth % \strutdp
+ \getnoflines\scratchdimen
+ \advance\noflines \minustwo
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen \topskip
+ \setbox0\hbox
+ {\lower\scratchdimen\vbox{\placenoteinserts}}%
+ \ht0=\openstrutheight % \strutht
+ \dp0=\openstrutdepth % \strutdp
+ \wd0=\zeropoint
+ \scratchdimen\ht\lastcolumnbox
+ \global\setbox\lastcolumnbox\vbox to \scratchdimen
+ {\box\lastcolumnbox
+ \vskip-\scratchdimen
+ \box0}%
+ \fi
+ \egroup
+ \fi
+ \fi}
+
+%D Here comes the routine that splits the long box in columns.
+%D The macro \type{\flushcolumnfloats} can be used to flush
+%D either floats that were present before the multi||column
+%D mode was entered, or floats that migrate to next columns.
+%D Flushing floats is a delicate process.
+
+\def\continuousmulticolumnsout
+ {\bgroup
+ \forgetall
+ \setmulticolumnsout
+ \dontshowcomposition
+% \dimen0=\columntextheight
+% \advance\dimen0 -\precolumnboxheight
+% \settotalinsertionheight
+% \advance\dimen0 -\totalinsertionheight
+% \ifgridsnapping % evt altijd, nog testen
+% \getnoflines{\dimen0}
+% \dimen0=\noflines\openlineheight
+% \fi
+ \getmulticolumnlines
+ \dimen0=\nofcolumnlines\openlineheight
+ \dohandleallcolumns
+ {\splitcurrentcolumn from \box\normalpagebox to \dimen0}%
+ \setbox\restofpage\vbox{\unvbox\normalpagebox}%
+ \ifinheritcolumns
+ \ifr@ggedbottom % vreemd
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+ {\dimen0\dp\currentcolumnbox
+ \unvbox\currentcolumnbox
+ \vskip-\dimen0
+ \vskip\openstrutdepth % \strutdp
+ \prevdepth\openstrutdepth % \strutdp
+ \vfill}}%
+ \ifbottomnotes \else
+ \dimen0\ht\firstcolumnbox
+ \fi
+ \fi
+ \ifn@rmalbottom
+ \advance\dimen0 \maxdepth
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \dimen0
+ {\unvbox\currentcolumnbox}}%
+ \fi
+ \ifb@selinebottom
+ % the columns are on top of the baseline
+ \fi
+ \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \dimen0
+ {\ifstretchcolumns
+ \unvbox\currentcolumnbox
+ \else
+ \unvbox\currentcolumnbox % wel of niet \unvbox ?
+ \vfill
+ \fi}}%
+ \dohandleallcolumns
+ {\global\ht\currentcolumnbox\dimen0}%
+ \fi
+ \setbox\precolumnbox\vbox{\flushcolumnedpage\zerocount}%
+ \finaloutput\box\precolumnbox
+ \sethsize
+ \setvsize
+ \flushcolumnfloats
+ \unvbox\restofpage
+ % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen
+ \egroup}
+
+%D And this is the balancing stuff. Again, part of the routine
+%D is dedicated to handling ragged bottoms, but here we also
+%D see some handling concerning the stretching of columns.
+%D We set \type{\widowpenalty} at~0, which enables us to
+%D balance columns with few lines. The use of \type{\box2} and
+%D \type{\box4} garantees a more robust check when skips are
+%D used.
+
+\def\multicolumnsbalancemax{250} % 100 is too small when floats are involved
+
+\def\balancedmulticolumnsout
+ {\bgroup
+ \setmulticolumnsout
+ \dontshowcomposition
+ \widowpenalty\zerocount
+ \setbox0\vbox{\unvbox\normalpagebox}%
+\ifdim\ht0>\openlineheight % at least one line
+ \ifnum\minbalancetoplines<2 % balance anyway
+ \donetrue
+ \else % check criterium to available lines
+ \getnoflines{\ht0}%
+ \divide\noflines \nofcolumns \relax
+ \ifnum\noflines<\minbalancetoplines \relax
+ \dimen0\ht0
+ \advance\dimen0 \ht\firsttopcolumnbox
+ \advance\dimen0 \openlineheight \relax % let's play safe
+ \ifdim\dimen0>\columntextheight % column exceeding text height
+ \donetrue
+ \else % it seems to fit
+ \donefalse
+ \fi
+ \else % balance indeed
+ \donetrue
+ \fi
+ \fi
+\else % balancing does not make sense
+ \donefalse
+\fi
+\ifdone % start balancing
+ %\ifdim\ht0>\openlineheight
+ \dimen0\ht0
+ \advance\dimen0 \topskip
+ \advance\dimen0 -\baselineskip
+ \dohandleallcolumns
+ {\advance\dimen0 \ht\currenttopcolumnbox}%
+ \divide\dimen0 \nofcolumns
+ \vbadness\!!tenthousand\relax
+ \count255=\zerocount
+ \bgroup
+ \ifgridsnapping
+ \dimen2\lineheight
+ \else
+ \dimen2=\onepoint % RUBISH
+ \dimen2=\spacingfactor\dimen2
+ \fi
+ \doloop
+ {\advance\count255 \plusone
+ \global\setbox\restofpage\copy0\relax
+ \splitfirstcolumn from \box\restofpage to \dimen0
+ \dohandlemidcolumns
+ {\splitcurrentcolumn from \box\restofpage to \dimen0}%
+ \splitlastcolumn from \box\restofpage to \dimen0
+ \setbox2\vbox{\unvcopy\firstcolumnbox}%
+ \dimen4\zeropoint
+ \dohandleallcolumns
+ {\setbox4\vbox
+ {\unvcopy\currentcolumnbox
+ %rather new, test this on pdftex-z.tex
+ \unpenalty\unskip\unpenalty\unskip}% maybe better in main splitter
+ %\writestatus{balance}{\the\currentcolumnbox: \the\ht4}%
+% \dimen6\ht4 \ifdim\dimen6>\dimen4 \dimen4=\dimen6 \fi}%
+ \ifdim\ht4>\dimen4 \dimen4=\ht4 \fi}%
+ \advance\dimen4 -.0005pt % get rid of accurracy problem, pretty new
+ \ifnum\count255>\multicolumnsbalancemax\relax
+ \exitloop
+ \else\ifdim\dimen4>\ht2
+ \advance\dimen0 \dimen2\relax
+ \else
+ \exitloop
+ \fi\fi}%
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox{\unvcopy\currentcolumnbox}}% NIEUW
+ \ifnum\count255>\multicolumnsbalancemax\relax
+ \showmessage\m!columns7\empty
+ \else
+ \showmessage\m!columns8{\the\count255\space}%
+ \fi
+ \egroup
+ \ifinheritcolumns
+ % We cannot assume that the first column is the tallest, if
+ % only because we may have an aborted balance (one line in the
+ % first column and a graphic in the second one).
+ %
+ % \dimen0\ht\firstcolumnbox
+ % \dimen2\ht\firstcolumnbox
+ %
+ \dimen0=\zeropoint
+ \dohandleallcolumns
+ {\ifdim\ht\currentcolumnbox>\dimen0
+ \dimen0=\ht\currentcolumnbox
+ \fi}%
+ \dimen2\dimen0
+ % so far
+ \advance\dimen2 -\openlineheight
+ \dohandleallcolumns
+ {\dimen4\ht\currentcolumnbox
+ \dimen6=10\openlineheight % funny value
+ \global\setbox\currentcolumnbox\vbox to \dimen0
+ {\unvbox\currentcolumnbox
+ \ifdim\dimen4>\dimen6
+ \ifdim\dimen4<\dimen0
+ \ifdim\dimen4>\dimen2
+ \vskip\zeropoint % !!
+ \else
+ \vskip\openlineheight
+ \vfill
+ \fi
+ \else
+ \vskip\zeropoint
+ \fi
+ \else
+ \vskip\openlineheight
+ \vfill
+ \fi}}%
+ \else
+ \bgroup
+ \ifstretchcolumns
+ \dimen0\ht\firstcolumnbox
+ \dimen2=\bottomtolerance\ht\firstcolumnbox
+ \setbox0\vbox{\unvcopy\lastcolumnbox}%
+ \advance\dimen0 -\ht0\relax
+ \advance\dimen0 -\dp0\relax
+ \ifdim\dimen0>\openlineheight\relax
+ \ifdim\dimen0>\dimen2\relax
+ % \stretchcolumnsfalse % beter goed slecht dan slecht goed
+ \showmessage\m!columns9\empty
+ \fi
+ \fi
+ \fi
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox\vbox to \ht\firstcolumnbox
+ {\ifstretchcolumns
+ \unvbox\currentcolumnbox
+ \else
+ \box\currentcolumnbox
+ \vfill
+ \fi}}%
+ \egroup
+ \fi
+ \else
+ % a one liner is not properly handled here, so best rewrite the text then
+ \showmessage\m!columns{10}\empty
+ \global\setbox\firstcolumnbox\vbox{\unvbox0}%
+ \fi
+ \global\output{\balancingerror}%
+ \b@selinebottomtrue % forces depth in separation rule
+ \flushcolumnedpage\plusone
+ \multicolumnseject
+ \egroup}
+
+\def\multicolumnseject
+ {\ifdim\pagetotal>\textheight
+ \eject % new
+ \else
+ \allowbreak
+ \fi}
+
+%D The multicolumn mechanism is incorporated in a \CONTEXT\
+%D interface, which acts like:
+%D
+%D \starttyping
+%D \startcolumns[n=4,balance=no]
+%D some text
+%D \stopcolumns
+%D \stoptyping
+%D
+%D The setup is optional. The default behaviour of columns
+%D can be set up with:
+%D
+%D \starttyping
+%D \setupcolumns
+%D [n=2,
+%D balance=yes]
+%D \stoptyping
+%D
+%D In this case, stretching is according to the way it's
+%D done outside columns (\type{\inheritcolumnstrue}). Also
+%D we can setup the \type{tolerance} within a column, the
+%D \type{distance} between columns and the fixed
+%D \type{height} of a column.
+
+%D Multi||column output: the float routines
+%D
+%D Here come the routines that handle the placement of column
+%D floats. Floats that are to big migrate to the next
+%D column. Floats that are too wide, migrate to the top of the
+%D next page, where they span as much columns as needed.
+%D Floats that are left over from outside the multi||column
+%D mode are flushed first. In macro \type{\finaloutput} the
+%D topfloats that are left from previous text should be set.
+%D
+%D When there are some floats in the queue, we inhibit the
+%D flushing of floats on top of columns. The number of
+%D waiting floats is preswent in \type{\savednoftopfloats} and
+%D is saved. As long as there are floats waiting, the topfloats
+%D are places as if we are outside multi||column mode. This is
+%D neccessary for e.g. multicolumn lists.
+%D
+%D When all those floats are flushed, we switch to the local
+%D flushing routine.
+
+\def\dopushcolumnfloats
+ {\ifsomefloatwaiting
+ \showmessage\m!columns6{\the\savednoffloats}%
+ \global\setbox\savedfloatlist\box\floatlist
+ \xdef\dopopcolumnfloats
+ {\global\savednoffloats\the\savednoffloats
+ \global\setbox\floatlist\box\savedfloatlist
+ \global\noexpand\somefloatwaitingtrue}%
+ \global\savednoffloats\zerocount
+ \global\somefloatwaitingfalse
+ \else
+ \global\let\dopopcolumnfloats\relax
+ \fi}
+
+\let\dopopcolumnfloats\relax
+
+% \def\setcolumnfloats % messy as it adapts everypar
+% {\xdef\globalsavednoffloats{\the\savednoffloats}%
+% \ifnum\globalsavednoffloats>\zerocount
+% \setglobalcolumnfloats % hm, we always push so this never happens
+% \else
+% \setlocalcolumnfloats
+% \fi}
+
+\def\setcolumnfloats % messy as it adapts everypar, we need to adapt this
+ {\setlocalcolumnfloats}
+
+\newconditional\onlylocalcolumnfloats % temp hack as we will redo floats (grid snapping is also messy now)
+
+\def\OTRMULdocheckiffloatfits{\ifconditional\onlylocalcolumnfloats\docolumnroomfloat \else\relax \fi}
+\def\OTRMULdosetbothinserts {\ifconditional\onlylocalcolumnfloats\relax \else\OTRONEdosetbothinserts\fi}
+\def\OTRMULdotopinsertions {\ifconditional\onlylocalcolumnfloats\relax \else\OTRONEdotopinsertions \fi}
+\def\OTRMULdoflushfloats {\ifconditional\onlylocalcolumnfloats\doflushcolumnfloats\else\OTRONEdoflushfloats \fi}
+
+\def\setlocalcolumnfloats
+ {\settrue\onlylocalcolumnfloats
+ \everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}%
+ \let\flushcolumnfloat\doflushcolumnfloat
+ \let\flushcolumnfloats\doflushcolumnfloats}
+
+\def\setglobalcolumnfloats
+ {\setfalse\onlylocalcolumnfloats
+ \everypar\emptytoks
+ \let\flushcolumnfloat\relax
+ \let\flushcolumnfloats\noflushcolumnfloats}
+
+\def\noflushcolumnfloats
+ {\bgroup
+ \xdef\localsavednoffloats{\the\savednoffloats}%
+ \global\savednoffloats\globalsavednoffloats
+ \dotopinsertions
+ \xdef\globalsavenoffloats{\the\savednoffloats}%
+ \ifnum\globalsavednoffloats=\zerocount
+ \setlocalcolumnfloats
+ \fi
+ \global\savednoffloats\localsavednoffloats
+ \egroup}
+
+%D We need to calculate the amount of free space in a columns.
+%D When there is not enough room, we migrate the float to the
+%D next column. These macro's are alternatives (and
+%D look||alikes) of \type{\doroomfloat}. When a float is to
+%D wide, for one column, it is moved to the top of the next
+%D page. Of course such moved floats have to be taken into
+%D account when we calculate the available space. It's a pitty
+%D that such things are no integral part of \TEX.
+
+\def\getcolumnstatus\column#1\total#2\goal#3\\%
+ {\dimen0=\ifdim\pagegoal<\maxdimen \pagetotal \else \zeropoint \fi
+ \dimen2=\zeropoint
+ \count255=\zerocount
+ \dimen8=\columntextheight
+ \advance\dimen8 -\precolumnboxheight
+ \def\dogetcolumnstatus
+ {\advance\count255 \plusone
+ \advance\dimen2 \ht\currenttopcolumnbox
+ \advance\dimen2 \dp\currenttopcolumnbox
+ \dimen4\dimen2
+ \advance\dimen4 \dimen0
+ \dimen6=\count255\dimen8
+ \ifdim\dimen4>\dimen6
+ \else
+ \let\dogetcolumnstatus\relax
+ \fi}%
+ \dohandleallcolumns{\dogetcolumnstatus}%
+ \ifnum\count255=0 \count255=1 \fi
+ #1=\count255
+ #2=\dimen4
+ #3=\dimen6 }
+
+\def\getinsertionheight
+ {\ifdim\pagegoal<\maxdimen
+ \bgroup
+ \dimen0=\columntextheight
+ \advance\dimen0 -\pagegoal
+ \xdef\insertionheight{\the\dimen0}%
+ \egroup
+ \else
+ \global\let\insertionheight\zeropoint
+ \fi}
+
+\def\docolumnroomfloat
+ {\ifpostponecolumnfloats
+ \global\roomforfloatfalse
+ \else\ifnofloatpermitted
+ \global\roomforfloatfalse
+ \else
+ \bgroup
+ \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
+ \dofloatsgetinfo{text}%
+ \setbox\scratchbox\vbox % tricky met objecten ?
+ {\blank[\@@bkspacebefore]
+ \snaptogrid\vbox{\vskip\floatheight}}% copy?
+ \advance\dimen0\dimexpr\ht\scratchbox+2\openlineheight+.5\lineheight\relax\relax % needed because goal a bit higher
+ \ifdim\dimen0>\dimen2
+ \global\roomforfloatfalse
+ \else
+ \global\roomforfloattrue
+ \fi
+ \ifdim\floatwidth>\hsize
+ \showmessage\m!columns{11}\empty
+ \global\roomforfloatfalse
+ \fi
+ \egroup
+ \fi\fi}
+
+%D Flushing one float is done as soon as possible, i.e.
+%D \type{\everypar}. This means that (at the moment)
+%D sidefloats are not supported (overulled)!
+
+\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue
+
+\def\doflushcolumnfloat
+ {\ifpostponecolumnfloats\else\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting
+ \bgroup
+ \forgetall
+ \let\doflushcolumnfloat\relax
+ \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\%
+ \ifdim\dimen0>\zeropoint
+ \dofloatsgetinfo{text}%
+ \ifdim\floatwidth>\hsize
+ % dropped ?
+ \else
+ \setbox2\vbox
+ {\blank[\@@bkspacebefore]
+ \snaptogrid\vbox{\vskip\floatheight}}%
+ \advance\dimen0 \ht2
+ \ifdim\dimen0>\dimen2
+ \ifnum\mofcolumns<\nofcolumns
+ \advance\mofcolumns \plusone
+ \ifdim\ht\currenttopcolumnbox=\zeropoint
+ \dofloatsflush{text}{1}%
+ \global\setbox\currenttopcolumnbox\vbox
+ {\snaptogrid\vbox{\box\floatbox}
+ \whitespace % nodig ?
+ \blank[\@@bkspaceafter]}%
+ \dimen4=\htdp\currenttopcolumnbox
+ \global\advance\vsize -\dimen4
+ \advance\dimen4 -\pagegoal
+ \global\pagegoal-\dimen4
+ \showmessage\m!columns{12}a%
+ \else
+ \showmessage\m!columns{12}b%
+ \fi
+ \else
+ \showmessage\m!columns{12}c%
+ \fi
+ \else
+ \ifhmode{\setbox0\lastbox}\fi% waar is die er in geslopen
+ \par
+ \ifdim\prevdepth<\zeropoint \else % anders bovenaan kolom witruimte
+ \nobreak
+ \blank[\@@bkspacebefore]
+ \nobreak
+ \fi
+ \dofloatsflush{text}{1}%
+ \flushfloatbox
+ \blank[\@@bkspaceafter]
+ \fi
+ \fi
+ \fi
+ \egroup
+ \fi\fi\fi\fi}
+
+%D This one looks complicated. Upto \type{\nofcolumns} floats
+%D are placed, taking the width of a float into account. This
+%D routine can be improved on different ways:
+%D
+%D \startitemize[intro,packed]
+%D \item taking into account some imaginary baseline, just to
+%D get the captions in line
+%D \item multipass flushing until as many floats are displaced
+%D as possible
+%D \stopitemize
+%D
+%D When handling lots of (small) floats spacing can get worse
+%D because of lining out the columns.
+
+
+\def\doflushcolumnfloats
+ {\ifpostponecolumnfloats\else
+ \bgroup
+ \forgetall
+ \ifsomefloatwaiting
+ \dimen8\zeropoint
+ \dimen4\zeropoint
+ \count0\zerocount % count0 can be used local
+ \count2\nofcolumns % count2 can be used local
+ \dohandleallcolumns
+ {\ifnum\count0>\zerocount % the wide one's reserved space
+ \global\setbox\currenttopcolumnbox\vbox
+ {\snaptogrid\vbox
+ {\copy\currenttopcolumnbox
+ \hbox{\vphantom{\vskip\floatheight}}}% known from previous
+ \whitespace % nodig ?
+ \blank[\@@bkspaceafter]}%
+ \else
+ \dofloatsgetinfo{text}%
+ \ifdim\floatwidth>\hsize
+ \dimen0\dimexpr\floatwidth+\intercolumnwidth+.5pt\relax
+ \dimen2\dimexpr\hsize +\intercolumnwidth+.5pt\relax
+ \divide\dimen0 \dimen2
+ \count0\dimen0
+ \advance\count0 \plusone
+ \ifnum\count0>\count2
+ \count0\zerocount
+ \else
+ \dimen0\dimexpr\count0\hsize+\count0\intercolumnwidth-\intercolumnwidth\relax
+ \dofloatsflush{text}{1}%
+ \ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too
+ \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
+ \fi % otherwise the graphic may disappear
+ \global\setbox\floatbox\hbox to \dimen0
+ {\processaction[\@@bklocation] % how easy to forget
+ [ \v!left=>\box\floatbox\hss,
+ \v!right=>\hss\box\floatbox,
+ \s!default=>\hss\box\floatbox\hss,
+ \s!unknown=>\hss\box\floatbox\hss]}%
+ \fi
+ \showmessage\m!columns{13}\empty
+ \else
+ \dofloatsflush{text}{1}%
+ \ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too
+ \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
+ \fi % otherwise the graphic may disappear
+ % \showmessage\m!columns{13}\empty
+ \fi
+ \ifdim\ht\floatbox>\zeropoint\relax
+ \global\setbox\currenttopcolumnbox\vbox
+ {\snaptogrid\vbox
+ {\box\currenttopcolumnbox % was copy
+ \box\floatbox}
+ \whitespace % nodig ?
+ \blank[\@@bkspaceafter]}%
+ \fi
+ \dimen6\htdp\currenttopcolumnbox
+ \fi
+ \ifdim\dimen4<\ht\currenttopcolumnbox
+ \dimen4\ht\currenttopcolumnbox
+ \fi
+ \advance\dimen8 \dimen6
+ \advance\count2 \minusone
+ \advance\count0 \minusone }%
+ \setvsize
+ \global\advance\vsize -\dimen8
+ \global\pagegoal\vsize
+ \else
+ %\doflushfloats % does not snap!
+ \fi
+ \egroup
+ \fi}
+
+%D The next macro can be used to flush floats in the current
+%D stream. No width checking is (yet) done.
+
+\def\insertcolumnfloats
+ {\doloop
+ {\ifsomefloatwaiting
+ \bgroup
+ \forgetall
+ % no check for width
+ \dogetfloat
+ \blank[\@@bkspacebefore]
+ \snaptogrid\vbox{\copy\floatbox}
+ \blank[\@@bkspaceafter]
+ \egroup
+ \else
+ \exitloop
+ \fi}}
+
+%D This were the multi||column routines. They can and need to
+%D be improved but at the moment their behaviour is acceptable.
+%D
+%D One inprovement can be to normalize the height of floats
+%D to $n\times$\type{\lineheight} with a macro like:
+%D
+%D \starttyping
+%D \normalizevbox{...}
+%D \stoptyping
+
+% border case, should fit on one page
+%
+% \startcolumns
+%
+% 1 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{1}}
+% 2 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{2}}
+% 3 \input tufte \par \plaatsfiguur{}{\omlijnd[breedte=\hsize,hoogte=3cm]{3}}
+%
+% \stopcolumns
+
+\unexpanded\def\setupcolumns
+ {\dosingleempty\dosetupcolumns}
+
+\def\dosetupcolumns[#1]%
+ {\getparameters[\??kl][#1]%
+ \nofcolumns\@@kln\relax
+ \processaction
+ [\@@klrule]
+ [ \v!on=>\let\betweencolumns\linebetweencolumns,
+ \v!off=>\let\betweencolumns\spacebetweencolumns,
+ \s!default=>\let\betweencolumns\spacebetweencolumns,
+ \s!unknown=>\let\betweencolumns\@@klrule]}
+
+\def\linebetweencolumns
+ {\bgroup
+ \starttextproperties
+ \ifdim\@@kldistance>\zeropoint
+ \dimen0=\@@kldistance
+ \else
+ \dimen0=\linewidth
+ \fi
+ \advance\dimen0 -\linewidth
+ \hskip.5\dimen0
+ \vrule
+ \!!width\linewidth
+ \ifb@selinebottom\!!depth\strutdepth\fi
+ \hskip.5\dimen0\relax
+ \stoptextproperties
+ \egroup}
+
+\def\spacebetweencolumns
+ {\hskip\@@kldistance}
+
+\presetlocalframed[\??kl]
+
+\def\backgroundfinishcolumnbox
+ {\doifinsetelse\@@kloffset{\v!none,\v!overlay}
+ {\let\@@kloffset\!!zeropoint}
+ {\scratchdimen\@@kloffset
+ \advance\scratchdimen -\@@klrulethickness
+ \edef\@@kloffset{\the\scratchdimen}}%
+ \localframed
+ [\??kl]
+ [\c!strut=\v!no,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!align=]}
+
+\definecomplexorsimpleempty\startcolumns
+
+\def\complexstartcolumns[#1]% %% \startcolumns
+ {\bgroup
+ \let\stopcolumns\egroup
+ \ifinsidecolumns
+ \else
+ \setupcolumns[#1]%
+ \ifnum\@@kln>1\relax
+ \whitespace
+ \begingroup
+ \doif\@@kloption\v!background
+ {\let\finishcolumnbox\backgroundfinishcolumnbox
+ \let\columntextoffset\@@kloffset}%
+ \ifx\@@klcommand\empty\else
+ \let\postprocesscolumnline\@@klcommand
+ \fi
+ \doifelsenothing\@@klheight
+ \heightencolumnsfalse
+ \heightencolumnstrue
+ \doifelse\@@kldirection\v!right
+ \reversecolumnsfalse
+ \reversecolumnstrue
+ \doifelse\@@klbalance\v!yes
+ \balancecolumnstrue
+ \balancecolumnsfalse
+ \installalign\v!yes {\stretchcolumnstrue \inheritcolumnsfalse}% todo: new key
+ \installalign\v!no {\stretchcolumnsfalse\inheritcolumnsfalse}% todo: new key
+ \installalign\v!text{\stretchcolumnsfalse\inheritcolumnstrue }%
+ \stretchcolumnsfalse
+ \inheritcolumnstrue
+ \doifsomething\@@klalign{\expanded{\setupalign[\@@klalign]}}%
+ \nofcolumns=\@@kln
+ %
+ % probably more is needed, and how about nesting save's
+ %
+ \saveouterspacing
+ %
+ \edef\fixedcolumnheight{\@@klheight}%
+ \edef\minbalancetoplines{\@@klntop}%
+ \setuptolerance[\@@kltolerance]% %% \startcolumns
+ \setupblank[\@@klblank]%
+ \ifdim\ctxparskip>\zeropoint\relax
+ \setupwhitespace[\@@klblank]%
+ \fi
+ \unexpanded\def\stopcolumns
+ {\endmulticolumns
+ \global\insidecolumnsfalse
+ \endgroup
+ \egroup}%
+ \global\insidecolumnstrue
+ \beginmulticolumns
+ \fi
+ \fi}
+
+\installcolumnbreakhandler {MUL} \v!preference
+ {\goodbreak}
+
+\installcolumnbreakhandler {MUL} \v!yes
+ {\par % todo: since
+ {\testrulewidth\zeropoint\ruledvskip\textheight} % we misuse a
+ \penalty-200 % side effect
+ \vskip-\textheight
+ }% bugged : \prevdepth-\thousandpoint} % signals top of column to \blank
+
+%D New: only at start of columns; may change ! Rather
+%D interwoven and therefore to be integrated when the multi
+%D column modules are merged. (moved from cont-new.tex)
+
+\unexpanded\def\setupcolumnspan[#1]%
+ {\getparameters[\??ks][#1]}
+
+\presetlocalframed
+ [\??ks]
+
+\setupcolumnspan
+ [\c!n=2,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off]
+
+\newbox\columnspanbox \let\postprocesscolumnspanbox\gobbleoneargument
+
+\def\dostartcolumnspan[#1]%
+ {\bgroup
+ \setupcolumnspan[#1]%
+ \forgetall
+ \ifinsidecolumns
+ \advance\hsize \intercolumnwidth
+ \hsize\@@ksn\hsize
+ \advance\hsize -\intercolumnwidth
+ \fi
+ \dowithnextbox
+ {\setbox\columnspanbox\flushnextbox
+ \ifinsidecolumns\wd\columnspanbox\hsize\fi
+ \postprocesscolumnspanbox\columnspanbox
+ \scratchdimen\ht\columnspanbox
+ \setbox\columnspanbox\hbox % depth to be checked, probably option!
+ {\localframed[\??ks][\c!offset=\v!overlay]{\box\columnspanbox}}%
+ \ht\columnspanbox\scratchdimen
+ \dp\columnspanbox\strutdp
+ \wd\columnspanbox\hsize
+ \ifinsidecolumns
+ \ifnum\@@ksn>1
+ \setvsize
+ \dohandleallcolumns
+ {\ifnum\currentcolumn>\@@ksn\else
+ \global\setbox\currenttopcolumnbox=\vbox
+ {\ifnum\currentcolumn=1
+ \snaptogrid\vbox{\copy\columnspanbox}
+ \else
+ \snaptogrid\vbox{\vphantom{\copy\columnspanbox}}
+ \fi}%
+ \wd\currenttopcolumnbox\hsize
+ \global\advance\vsize -\ht\currenttopcolumnbox
+ \fi}
+ \global\pagegoal\vsize
+ \else
+ \snaptogrid\vbox{\box\columnspanbox}
+ \fi
+ \else
+ \snaptogrid\vbox{\box\columnspanbox}
+ \fi
+ \endgraf
+ \ifvmode\prevdepth\strutdp\fi
+ \egroup}
+ \vbox\bgroup
+ %\topskipcorrection % becomes an option !
+ \EveryPar{\begstrut\EveryPar{}}} % also !
+
+\unexpanded\def\startcolumnspan
+ {\dosingleempty\dostartcolumnspan}
+
+\unexpanded\def\stopcolumnspan
+ {\egroup}
+
+\setupcolumns
+ [\c!n=2,
+ \c!ntop=1,
+ \c!command=,
+ \c!direction=\v!right,
+ \c!rule=\v!off,
+ \c!tolerance=\v!tolerant,
+ \c!distance=1.5\bodyfontsize, % influenced by switching
+ \c!height=,
+ \c!balance=\v!yes,
+ \c!align=\v!text,
+ \c!blank={\v!line,\v!fixed},
+ \c!option=,
+ \c!rulethickness=\linewidth,
+ \c!offset=.5\bodyfontsize]
+
+%D Undocumented and still under development.
+
+\unexpanded\def\startsimplecolumns
+ {\dosingleempty\dostartsimplecolumns}
+
+\def\dostartsimplecolumns[#1]%
+ {\bgroup
+ \nopenalties
+ \getparameters[\??kl]
+ [\c!width=\hsize,\c!distance=1.5\bodyfontsize,%
+ \c!n=2,\c!lines=0,#1]%
+ \let\rigidcolumnlines\@@kllines
+ \setrigidcolumnhsize\@@klwidth\@@kldistance\@@kln
+ \setbox\scratchbox\vbox\bgroup
+ \forgetall} % \blank[\v!disable]
+
+\unexpanded\def\stopsimplecolumns
+ {\removebottomthings
+ \egroup
+ \rigidcolumnbalance\scratchbox
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/page-not.mkii b/tex/context/base/page-not.mkii
new file mode 100644
index 000000000..9c67f18f1
--- /dev/null
+++ b/tex/context/base/page-not.mkii
@@ -0,0 +1,72 @@
+%D \module
+%D [ file=page-nnt,
+%D version=2002.04.16,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Footnotes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Footnotes}
+
+%D Terrible hacks: we need to share save/restore
+
+%D We've moved some footnote handling to a separate page
+%D module. The macros below are used in the single and multi
+%D column page handlers and permit mixed usage of column and
+%D page notes.
+
+\unprotect
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+ {\ifcase\clevernotes
+ \erasenotebackup
+ \else
+ \doflushnotes
+ \savenotecontent
+ \fi
+ \savenotedata
+ \checknotes}
+
+\def\checkendcolumnfootnotes
+ {\restorenotedata % maybe better just \checknotes
+ \ifcase\clevernotes\else
+ \restorenotecontent
+ \fi}
+
+\def\checksinglecolumnfootnotes
+ {\checknotes} % njet : \restorenotedata
+
+\newdimen\totalinsertionheight
+
+\def\settotalinsertionheight
+ {\calculatetotalnoteheight
+ \totalinsertionheight\totalnoteheight
+ \addinsertionheight\topins\to\totalinsertionheight
+ \addinsertionheight\botins\to\totalinsertionheight}
+
+% hm
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+ {\ifcase\clevernotes
+ \erasenotebackup
+ \else
+ \doflushnotes
+ \savenotecontent
+ \fi
+ \savenotedata
+ \checknotes}
+
+\def\checkendcolumnfootnotes
+ {\restorenotedata
+ \ifinsidecolumns
+ \ifcase\clevernotes\else
+ \restorenotecontent
+ \fi
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-not.mkiv b/tex/context/base/page-not.mkiv
new file mode 100644
index 000000000..95229f9d0
--- /dev/null
+++ b/tex/context/base/page-not.mkiv
@@ -0,0 +1,69 @@
+%D \module
+%D [ file=page-nnt,
+%D version=2002.04.16,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Footnotes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Footnotes}
+
+%D Terrible hacks: we need to share save/restore
+
+%D We've moved some footnote handling to a separate page
+%D module. The macros below are used in the single and multi
+%D column page handlers and permit mixed usage of column and
+%D page notes.
+
+\unprotect
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+ {\ifcase\clevernotes
+ \erasenotebackup
+ \else
+ \flushnotes
+ \savenotecontent
+ \fi
+ \savenotedata}
+
+\def\checkendcolumnfootnotes
+ {\restorenotedata
+ \ifcase\clevernotes\else
+ \restorenotecontent
+ \fi}
+
+\let\checksinglecolumnfootnotes\relax
+
+\newdimen\totalinsertionheight
+
+\def\settotalinsertionheight
+ {\calculatetotalnoteheight
+ \totalinsertionheight\totalnoteheight
+ \addinsertionheight\topins\to\totalinsertionheight
+ \addinsertionheight\botins\to\totalinsertionheight}
+
+% hm
+
+\def\checkbegincolumnfootnotes % should happen inside otr
+ {\ifcase\clevernotes
+ \erasenotebackup
+ \else
+ \flushnotes
+ \savenotecontent
+ \fi
+ \savenotedata}
+
+\def\checkendcolumnfootnotes
+ {\restorenotedata
+ \ifinsidecolumns
+ \ifcase\clevernotes\else
+ \restorenotecontent
+ \fi
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/page-one.mkii b/tex/context/base/page-one.mkii
new file mode 100644
index 000000000..1affc24d0
--- /dev/null
+++ b/tex/context/base/page-one.mkii
@@ -0,0 +1,659 @@
+%D \module
+%D [ file=page-one,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Default Routine,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Default Routine}
+
+%D This is just the good old \CONTEXT\ output routine, which
+%D has been there right from the start.
+
+\unprotect
+
+% OTRONE: basic single column
+
+\activateotr{ONE}{} % the default one
+
+\newtoks\OTRONEoutput
+
+\def\OTRONEgotonextpage
+ {\ejectpage}
+
+\def\OTRONEgotonextpageX % will become obsolete
+ {\superejectpage}
+
+\def\OTRONEsethsize
+ {\global\hsize\textwidth}
+
+% keep (original one)
+%
+% \def\OTRONEsetvsize
+% {\ifdim\vsize=\teksthoogte \else
+% \bgroup
+% \scratchdimen-\vsize
+% \advance\scratchdimen \teksthoogte
+% \global\advance\vsize \scratchdimen
+% \relax \ifdim\pagegoal<\maxdimen
+% \advance\scratchdimen \pagegoal
+% \global\pagegoal\scratchdimen
+% \fi
+% \egroup
+% \fi}
+%
+% no (keep)
+%
+% \def\OTRONEsetvsize
+% {\ifdim\vsize=\teksthoogte \else
+% \bgroup
+% \scratchdimen-\vsize
+% \advance\scratchdimen \teksthoogte
+% \ifgridsnapping
+% \getrawnoflines\scratchdimen
+% \scratchdimen\noflines\openlineheight
+% \ifdim\scratchdimen>\noflinesheight % available afterwards
+% \advance\scratchdimen-\openlineheight
+% \fi
+% \ifdim\scratchdimen<\zeropoint
+% \scratchdimen\zeropoint
+% \fi
+% \fi
+% \global\advance\vsize \scratchdimen
+% \relax \ifdim\pagegoal<\maxdimen
+% \advance\scratchdimen \pagegoal
+% \global\pagegoal\scratchdimen
+% \fi
+% \egroup
+% \fi}
+
+% \def\OTRONEsetvsize
+% {\ifgridsnapping
+% \ifcase\layoutlines
+% \getrawnoflines\teksthoogte
+% \else
+% \noflines\layoutlines
+% \fi
+% \global\vsize\noflines\openlineheight
+% \else
+% \global\vsize\teksthoogte
+% \fi
+% \ifdim\pagegoal<\maxdimen
+% \global\pagegoal\vsize
+% \fi}
+
+\newdimen\oldvsize
+
+\def\OTRONEsetvsize
+ {\ifgridsnapping
+ \ifcase\layoutlines
+ \getrawnoflines\textheight
+ \else
+ \noflines\layoutlines
+ \fi
+ \global\vsize\noflines\openlineheight
+ \else
+ \global\vsize\textheight
+ \fi
+ \ifdim\pagegoal<\maxdimen
+ \ifdim\oldvsize=\vsize
+ % let's assume that the layout didn't change
+ \else
+ \bgroup
+ \global\oldvsize\vsize
+ \advance\vsize-\topinserted
+ \advance\vsize-\botinserted
+ \global\pagegoal\vsize
+ \egroup
+ \fi
+ \fi}
+
+\chardef\kindofpagetextareas=2 % whole page (public variable! never change)
+
+\def\OTRONEregisteredtextarea#1%
+ {\ifregistertextareas
+ \setbox0\vbox{#1}%
+ \wd0\makeupwidth % somehow a space creeps in
+ \vbox{\registeredtextarea000}%
+ \else
+ #1%
+ \fi}
+
+% \chardef\kindofpagetextareas\plusone
+
+\def\doOTRONEregisteredtextareaA#1%
+ {\ifregistertextareas
+ \xypos{pbd:\realfolio:b}% we could save bytes by only saving the y
+ \endgraf
+ \begingroup
+ \scratchdimen\MPy{pbd:\realfolio:b}%
+ \advance\scratchdimen-\MPy{pbd:\realfolio:e}%
+ \setbox\scratchbox\null
+ \wd\scratchbox\makeupwidth
+ \ht\scratchbox\scratchdimen
+ \vsmash{\registeredtextarea00\scratchbox}%
+ \endgroup
+ #1%
+ \endgraf
+ \xypos{pbd:\realfolio:e}%
+ \else
+ #1%
+ \fi}
+
+\def\doOTRONEregisteredtextareaB#1%
+ {\ifregistertextareas
+ \setbox0\vbox{#1}%
+ \wd0\makeupwidth % somehow a space creeps in
+ \vbox{\registeredtextarea000}%
+ \else
+ #1%
+ \fi}
+
+\let\OTRONEregisteredtextareaA\firstofoneargument
+\let\OTRONEregisteredtextareaB\firstofoneargument
+
+\def\OTRONEdopagecontents#1#2% \box<n> \unvbox<n>
+ {\bgroup % niet breedte zetten, kan fractie zijn!
+ \ifcase\kindofpagetextareas
+ \or % partial page (experimental)
+ \let\OTRONEregisteredtextareaA\doOTRONEregisteredtextareaA
+ \or % whole page (default)
+ \let\OTRONEregisteredtextareaB\doOTRONEregisteredtextareaB
+ \or % partial page (only works well with no stretch!)
+ \let\OTRONEregisteredtextareaA\doOTRONEregisteredtextareaB
+ \fi
+ \setbox0\vbox \ifbottomnotes to \textheight \fi
+ {\edef\currentpagedepth{\the\dp#2}% still to be derived from #1
+ \dotopinsertions
+ \ifgridsnapping
+ \OTRONEregisteredtextareaA{#1#2}%
+ \vskip-\currentpagedepth\vskip\openstrutdepth
+ \pushproperties % moved from just after #1#2
+ \prevdepth\openstrutdepth
+ \dobotinsertions
+ \vfil
+ \else\ifr@ggedbottom
+ \OTRONEregisteredtextareaA{#1#2}%
+ \vskip-\currentpagedepth\vskip\openstrutdepth
+ \pushproperties % moved from just after #1#2
+ \prevdepth\openstrutdepth
+ \dobotinsertions
+ \vfil
+ \else\ifb@selinebottom
+ \OTRONEregisteredtextareaA{#1#2}%
+ \kern-\currentpagedepth\kern\maxdepth
+ \pushproperties % moved from just after #1#2
+ \dobotinsertions
+ \else
+ \OTRONEregisteredtextareaA{#1#2}%
+ \pushproperties % moved from just after #1#2
+ \dobotinsertions % added
+ \fi\fi\fi
+ \fakepagenotes}% was \fakenotes, but wrong! (check with \setupalign[height])
+ \ifbottomnotes
+ \ifgridsnapping
+\ifcase\layoutlines % todo: make macro of this
+ \getrawnoflines\textheight
+\else
+ \noflines\layoutlines
+\fi
+% \getnoflines\textheight
+ \advance\noflines \minusone
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen \topskip
+ \else
+ \scratchdimen\ht0
+ \fi
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \setbox2\hbox
+ {\checksinglecolumnfootnotes
+ \lower\scratchdimen\vbox{\placebottomnotes}}%
+ \smashbox2% % needed here
+ \ifbottomnotes
+ \ht0\zeropoint
+ \fi
+ \OTRONEregisteredtextareaB
+ {\vbox to \textheight
+ {\box0\box2\ifbottomnotes\else\vfill\fi}}%
+ \egroup}
+
+\def\OTRONEfinalsidefloatoutput
+ {\finaloutput\unvbox\normalpagebox}
+
+\OTRONEoutput
+ {\sidefloatoutput}
+
+%D Insertions
+
+\newif\iftopofinsert
+
+% \def\OTRONEdosettopinserts
+% {\bgroup
+% \ifsomefloatwaiting
+% \noffloatinserts\zerocount
+% \let\totaltopinserted\!!zeropoint
+% \OTRONEdodosettopinserts
+% \ifnum\@@bknbottom=\zerocount
+% \ifnum\@@bknlines>\zerocount
+% \ifdim\totaltopinserted>\zeropoint\relax
+% \dimen0=\lineheight
+% \dimen0=\@@bknlines\dimen0
+% \advance\dimen0 \totaltopinserted\relax
+% \ifdim\dimen0>\textheight
+% \showmessage\m!floatblocks8\@@bknlines
+% \vfilll\eject
+% \fi
+% \fi
+% \fi
+% \fi
+% \fi
+% \egroup}
+
+\def\OTRONEdosettopinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \let\totaltopinserted\!!zeropoint
+ \OTRONEdodosettopinserts
+ \ifnum\@@bknbottom=\zerocount
+ \ifnum\@@bknlines>\zerocount
+ \ifdim\totaltopinserted>\zeropoint\relax
+ \ifdim\dimexpr\@@bknlines\lineheight+\totaltopinserted\relax>\textheight
+ \showmessage\m!floatblocks8\@@bknlines
+ \vfilll\eject
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \egroup}
+
+\def\OTRONEdodosettopinserts
+ {\ifnum\noffloatinserts<\noftopfloats
+ \dogetfloat
+ \ifdim\topinserted=\zeropoint
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \global\advance\topinserted\dimexpr\ht\floatbox+\dp\floatbox+\floatbottomskip\relax
+ \ifdim\topinserted<\textheight\relax
+ \xdef\totaltopinserted{\the\topinserted}%
+ \insert\topins
+ {\forgetall
+ \iftopofinsert
+ \topskipcorrection % [xx] new: see icare topbleed
+ \kern-\lineskip\par
+ \prevdepth\maxdimen
+ \else
+ %\blank[-\@@bkspaceafter,\@@bkspacebefore]% inserts can't look back
+ \betweenfloatblanko
+ \fi
+ \flushfloatbox
+ \blank[\@@bkspaceafter]}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\noftopfloats\relax
+ \fi
+ \dofloatflushedinfo
+ \else
+ \doresavefloat
+ \noffloatinserts\noftopfloats\relax
+ \fi
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks6{\the\noftopfloats}%
+ \fi
+ \let\OTRONEdodosettopinserts\relax
+ \fi
+ \OTRONEdodosettopinserts}
+
+\def\OTRONEdosetbotinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \OTRONEdodosetbotinserts
+ \fi
+ \egroup}
+
+\def\OTRONEdodosetbotinserts
+ {\ifnum\noffloatinserts<\nofbotfloats\relax
+ \dogetfloat
+ \global\advance\botinserted \ht\floatbox\relax
+ \global\advance\botinserted \dp\floatbox\relax
+ \global\advance\botinserted \floattopskip\relax
+ \ifdim\botinserted<\pagegoal\relax
+ \insert\botins
+ {\forgetall
+ \blank[\@@bkspacebefore]%
+ \flushfloatbox}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\nofbotfloats
+ \fi
+ \dofloatflushedinfo
+ \else
+ \doresavefloat
+ \noffloatinserts\nofbotfloats\relax
+ \fi
+ \global\nofloatpermittedtrue % vgl topfloats s!
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks7{\the\nofbotfloats}%
+ \fi
+ \let\OTRONEdodosetbotinserts\relax
+ \fi
+ \OTRONEdodosetbotinserts}
+
+\def\OTRONEdosetbothinserts
+ {\global\topinserted\zeropoint
+ \global\botinserted\zeropoint
+ \ifflushingfloats \else
+ \OTRONEdosettopinserts
+ \OTRONEdosetbotinserts
+ \ifsomefloatwaiting
+ \doif\@@bkcache\v!no\doflushfloats
+ \fi
+ \fi}
+
+% \def\OTRONEdotopinsertions
+% {\ifvoid\topins\else
+% \ifgridsnapping
+% \box\topins
+% \vskip-\topskip \vskip\strutheight % [xx] new: see icare topbleed
+% \else
+% \unvbox\topins
+% \fi
+% \fi
+% \global\topinserted\zeropoint}
+
+\chardef\topinserttopskipmode=0 % 1 no topskip
+
+\def\OTRONEdotopinsertions
+ {\ifvoid\topins\else
+ \ifgridsnapping
+ \box\topins
+ \vskip-\topskip
+ \vskip\strutheight % [xx] new: see icare topbleed
+ \else
+ \ifcase\topinserttopskipmode
+ % 0: default, do nothing
+ \or
+ % 1: no topskip (crossed fingers)
+ \vskip-\topskip
+ \vskip\strutheight
+ \fi
+ \unvbox\topins
+ \fi
+ \fi
+ \global\topinserted\zeropoint}
+
+\def\OTRONEdobotinsertions
+ {\ifvoid\botins\else
+ \ifgridsnapping
+ \snaptogrid\hbox{\box\botins}%
+ \else
+ \unvbox\botins
+ \fi
+ \fi
+ \global\botinserted\zeropoint
+ \global\nofloatpermittedfalse}
+
+\def\OTRONEdoflushfloats
+ {\global\flushingfloatstrue
+ \ifsomefloatwaiting
+ \par
+ % if kept, then option and definitely off in gridmode ! ! ! !
+ % \ifvmode \prevdepth\maxdimen \fi % prevents whitespace; problematic in icare tests
+ \OTRONEdodoflushfloats
+ \fi
+ \global\savednoffloats\zerocount
+ \global\somefloatwaitingfalse
+ \global\flushingfloatsfalse}
+
+\def\OTRONEflushfloatbox % nog verder doorvoeren en meer info in marge
+ {\ifcenterfloatbox \ifdim\wd\floatbox<\hsize
+ \setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}%
+ \fi \fi
+ \snaptogrid\hbox{\iftestfloatbox\ruledhbox\fi{\copy\floatbox}}}
+
+\def\OTRONEdodoflushfloats % much in common with OTRSET
+ {\ifsomefloatwaiting
+ \ifpackflushedfloats
+ \centerfloatboxfalse
+ \dogetfloat
+ \ifdim\wd\floatbox>\makeupwidth
+ \global\setbox\floatbox\hbox to \makeupwidth{\hss\box\floatbox\hss}%
+ \fi
+ \OTRONEsetvsize
+ \!!widtha\wd\floatbox
+ \dofloatflushedinfo
+ \doloop
+ {\ifsomefloatwaiting
+ \dosavefloatstatus
+ \dogetfloat
+ \advance\!!widtha 1em % variable
+ \advance\!!widtha \wd\floatbox\relax
+ \ifdim\!!widtha>\hsize
+ \dorestorefloatstatus
+ \global\somefloatwaitingtrue
+ \exitloop
+ \else
+ \global\setbox\floatbox\hbox
+ {\ifcase\columndirection % nog document wide
+ \ifvoid\savedfloatbox\else
+ \ifhbox\savedfloatbox\unhbox\else\box\fi\savedfloatbox\hfil
+ \fi
+ \ifhbox\floatbox\unhbox\else\box\fi\floatbox
+ \else
+ \ifhbox\floatbox\unhbox\else\box\fi\floatbox
+ \ifvoid\savedfloatbox\else
+ \hfil\ifhbox\savedfloatbox\unhbox\else\box\fi\savedfloatbox
+ \fi
+ \fi}%
+ \dofloatflushedinfo
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \global\setbox\floatbox\hbox to \hsize
+ {\hfil\ifhbox\floatbox\unhbox\else\box\fi\floatbox\hfil}%
+ \else
+ %\bgroup % \box\floatbox can be in use!? messy
+ \dogetfloat
+ %\doplacefloatbox
+ %\egroup
+ \dofloatflushedinfo
+ \fi
+ % there is a chance that due to rounding errors, the float
+ % fits on a page where it was first rejected, in which case
+ % the prevdepth is -maxdimen and we cannot obey the grid
+ \doplacefloatbox
+ \expandafter\OTRONEdodoflushfloats
+ \fi}
+
+\def\OTRONEdocheckiffloatfits % vervangen ivm downward comp
+ {\ifnofloatpermitted
+ \global\roomforfloatfalse
+ \else
+ % new per 31/5/2004, should be an option, only one column mode
+ \begingroup
+ \scratchdimen\dimexpr\pagetotal+\lineheight\relax
+ \ifdim\scratchdimen>\pagegoal
+ \goodbreak % hack ? needed in icare-az
+ \fi
+ % should be an option
+ \endgroup
+ \dimen0\dimexpr\pagetotal+\ht\floatbox+\dp\floatbox+\floattopskip-\pageshrink\relax
+ %\message{c:\the\mofcolumns,t:\the\pagetotal,g:\the\pagegoal}%\wait
+ \dimen2\pagegoal
+ \relax % needed
+ \ifcase\textfloatmethod
+ % method 0 : raw
+ \or
+ % method 1 : safe
+ \dimen2 .99\pagegoal
+ \or
+ % method 2 : tight
+ \advance\dimen0 -\onepoint
+ \fi
+ \relax % really needed ! ! ! !
+ \ifdim\dimen0>\dimen2
+ \global\roomforfloatfalse
+ \else
+ \global\roomforfloattrue
+ \fi
+ \fi}
+
+\def\OTRONEflushsavedfloats
+ {\dosetbothinserts}
+
+% TODO: TEST FIRST, NO CORRECTION NEEDED IN GRID MODE, EVT OPTION
+
+\def\OTRONEsomeherefloat[#1]% spacing between two successive must be better
+ {\baselinecorrection % not really needed in grid mode:
+ %\ifgridsnapping \else \baselinecorrection \fi % ! ! ! test test test ! ! ! !
+ \doplacefloatbox
+ \doinsertfloatinfo
+ \dochecknextindentation\??bk
+ \dorechecknextindentation}
+
+% \def\OTRONEsomefixdfloat % [#1]
+% {\docheckiffloatfits
+% \ifroomforfloat\else
+% \goodbreak
+% \fi
+% \showmessage\m!floatblocks9\empty
+% \someherefloat} % [#1]
+%
+% better:
+%
+% \dorecurse{50}
+% {[before normal] \input thuan
+% \placefigure{normal}{\framed[height=1cm,width=8cm]{}}
+% \placefigure{normal}{\framed[height=2cm,width=8cm]{}}
+% [before force] \input thuan
+% \placefigure[force]{force}{\framed[height=8cm,width=8cm]{}}}
+
+\chardef\fixedfloatmethod=3
+
+% \def\OTRONEsomefixdfloat % [#1]
+% {\docheckiffloatfits
+% \ifroomforfloat\else
+% \ifzeropt\pagetotal
+% % let's assume that there is room
+% \else
+% \ifcase\fixedfloatmethod
+% % disabled
+% \or % 1 (old method)
+% \goodbreak
+% \or % 2 (safe method)
+% \page
+% \or % 3 (keeps in stream)
+% \vskip\textheight
+% \vskip-\textheight
+% \or % 4 (also keeps in place)
+% \dosomebreak\nobreak
+% \fi
+% \fi
+% \fi
+% \showmessage\m!floatblocks9\empty
+% \someherefloat} % [#1]
+
+\def\OTRONEsomefixdfloat % [#1]
+ {% there is (in mkii) no good way to prevent a break
+ % so better fail than mess, we can get loose from
+ % heads, so be it
+ \showmessage\m!floatblocks9\empty
+ \OTRONEsomeherefloat} % [#1]
+
+\def\OTRONEsomesidefloat[#1]% links, rechts NOG TESTEN EN AANPASSEN
+ {\ifinsidecolumns
+ \someelsefloat[\v!here]%
+ \else
+ %\checkwaitingfloats{#1}%
+ \def\logsidefloat
+ {\doinsertfloatinfo}%
+ \setbox\floatbox\vbox{\box\floatbox}%
+ \wd\floatbox\floatwidth
+ \processfirstactioninset
+ [#1]
+ [ \v!left=>\leftfloat {\box\floatbox},
+ \v!right=>\rightfloat {\box\floatbox},
+ \v!inleft=>\leftmarginfloat {\box\floatbox},
+ \v!inright=>\rightmarginfloat{\box\floatbox},
+ \v!leftmargin=>\leftmarginfloat {\box\floatbox},
+ \v!rightmargin=>\rightmarginfloat{\box\floatbox},
+ \v!leftedge=>\leftedgefloat {\box\floatbox},
+ \v!rightedge=>\rightedgefloat {\box\floatbox},
+ \v!backspace=>\backspacefloat {\box\floatbox},
+ \v!cutspace=>\cutspacefloat {\box\floatbox},
+ \v!inmargin=>\cutspacefloat {\box\floatbox}]%
+ \doifinset\v!tall{#1}\flushsidefloatsafterpar
+ \fi}
+
+\def\OTRONEdosomepagefloat#1[#2]%
+ {%\checkwaitingfloats{#1}%
+ \global\setbox#1\vbox
+ {\unvbox#1%
+ \vbox to \textheight
+ {\doifnotinset\v!high{#2}\vfill
+ \box\floatbox
+ \doifnotinset\v!low{#2}\vfill}%
+ \goodbreak}%
+ \doinsertfloatinfo}
+
+\def\OTRONEsomepagefloat {\OTRONEdosomepagefloat\collectedpagefloats}
+\def\OTRONEsomeleftpagefloat {\OTRONEdosomepagefloat\collectedleftpagefloats}
+\def\OTRONEsomerightpagefloat{\OTRONEdosomepagefloat\collectedrightpagefloats}
+
+\def\OTRONEsometopsfloat[#1]%
+ {\ifdim\topinserted=\zeropoint
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \global\advance\topinserted \ht\floatbox
+ \global\advance\topinserted \dp\floatbox
+ \global\advance\topinserted \floatbottomskip
+ \insert\topins
+ {\forgetall
+ \iftopofinsert
+ \topskipcorrection % [xx] new: see icare topbleed
+ \kern-\lineskip\par\prevdepth\maxdimen
+ \else
+ %\blank[-\@@bkspaceafter,\@@bkspacebefore]% inserts can't look back
+ \betweenfloatblanko
+ \fi
+ \flushfloatbox
+ \blank[\@@bkspaceafter]}%
+ \doinsertfloatinfo}
+
+\def\OTRONEsomebotsfloat[#1]%
+ {\global\advance\botinserted \ht\floatbox
+ \global\advance\botinserted \dp\floatbox
+ \global\advance\botinserted \floattopskip
+ \insert\botins
+ {\forgetall
+ \blank[\@@bkspacebefore]%
+ \flushfloatbox}%
+ %\global\nofloatpermittedtrue
+ \doinsertfloatinfo}
+
+\def\OTRONEsomefacefloat[#1]% untested
+ {\startopposite\flushfloatbox\stopopposite}
+
+\def\OTRONEnextcolumn[#1]%
+ {}
+
+\protect \endinput
diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv
new file mode 100644
index 000000000..bbd35181e
--- /dev/null
+++ b/tex/context/base/page-one.mkiv
@@ -0,0 +1,532 @@
+%D \module
+%D [ file=page-one,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Default Routine,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Default Routine}
+
+%D This is just the good old \CONTEXT\ output routine, which
+%D has been there right from the start.
+
+\unprotect
+
+% OTRONE: basic single column
+
+\activateotr{ONE}{} % the default one
+
+\newtoks\OTRONEoutput
+
+\def\OTRONEgotonextpage
+ {\ejectpage}
+
+\def\OTRONEgotonextpageX % will become obsolete
+ {\superejectpage}
+
+\def\OTRONEsethsize
+ {\global\hsize\textwidth}
+
+\newdimen\oldvsize
+
+\def\OTRONEsetvsize
+ {\ifgridsnapping
+ \ifcase\layoutlines
+ \getrawnoflines\textheight
+ \else
+ \noflines\layoutlines
+ \fi
+ \global\vsize\noflines\openlineheight
+ \else
+ \global\vsize\textheight
+ \fi
+ \ifdim\pagegoal<\maxdimen
+ \ifdim\oldvsize=\vsize
+ % let's assume that the layout didn't change
+ \else
+ \bgroup
+ \global\oldvsize\vsize
+ \advance\vsize-\topinserted
+ \advance\vsize-\botinserted
+ \global\pagegoal\vsize
+ \egroup
+ \fi
+ \fi}
+
+\chardef\kindofpagetextareas=2 % whole page (public variable! never change)
+
+% can we avoind the extra vboxing here?
+
+\def\OTRONEregisteredtextarea#1%
+ {\ifregistertextareas
+ \setbox0\vbox{#1}%
+ \wd0\makeupwidth % somehow a space creeps in
+ \vbox{\registeredtextarea000}%
+ \else
+ #1%
+ \fi}
+
+% \chardef\kindofpagetextareas\plusone
+
+\def\doOTRONEregisteredtextareaA#1%
+ {\ifregistertextareas
+ \xypos{pbd:\realfolio:b}% we could save bytes by only saving the y
+ \endgraf
+ \begingroup
+ \scratchdimen\dimexpr\MPy{pbd:\realfolio:b}-\MPy{pbd:\realfolio:e}\relax
+ \setbox\scratchbox\null
+ \wd\scratchbox\makeupwidth
+ \ht\scratchbox\scratchdimen
+ \vsmash{\registeredtextarea00\scratchbox}%
+ \endgroup
+ #1%
+ \endgraf
+ \xypos{pbd:\realfolio:e}%
+ \else
+ #1%
+ \fi}
+
+\def\doOTRONEregisteredtextareaB#1%
+ {\ifregistertextareas
+ \setbox0\vbox{#1}%
+ \wd0\makeupwidth % somehow a space creeps in
+ \vbox{\registeredtextarea000}%
+ \else
+ #1%
+ \fi}
+
+\let\OTRONEregisteredtextareaA\firstofoneargument
+\let\OTRONEregisteredtextareaB\firstofoneargument
+
+\def\OTRONEdopagecontents#1#2% \box<n> \unvbox<n>
+ {\bgroup % niet breedte zetten, kan fractie zijn!
+ \ifcase\kindofpagetextareas
+ \or % partial page (experimental)
+ \let\OTRONEregisteredtextareaA\doOTRONEregisteredtextareaA
+ \or % whole page (default)
+ \let\OTRONEregisteredtextareaB\doOTRONEregisteredtextareaB
+ \or % partial page (only works well with no stretch!)
+ \let\OTRONEregisteredtextareaA\doOTRONEregisteredtextareaB
+ \fi
+ \setbox0\vbox \ifbottomnotes to \textheight \fi
+ {\edef\currentpagedepth{\the\dp#2}% still to be derived from #1
+ \dotopinsertions
+ \ifgridsnapping
+ \OTRONEregisteredtextareaA{#1#2}%
+ \vskip-\currentpagedepth\vskip\openstrutdepth
+ \prevdepth\openstrutdepth
+ \dobotinsertions
+ \vfil
+ \else\ifr@ggedbottom
+ \OTRONEregisteredtextareaA{#1#2}%
+ \vskip-\currentpagedepth\vskip\openstrutdepth
+ \prevdepth\openstrutdepth
+ \dobotinsertions
+ \vfil
+ \else\ifb@selinebottom
+ \OTRONEregisteredtextareaA{#1#2}%
+ \kern-\currentpagedepth\kern\maxdepth
+ \dobotinsertions
+ \else
+ \OTRONEregisteredtextareaA{#1#2}%
+ \dobotinsertions % added
+ \fi\fi\fi
+ \fakepagenotes}% was \fakenotes, but wrong! (check with \setupalign[height])
+ \ifbottomnotes
+ \ifgridsnapping
+ \ifcase\layoutlines % todo: make macro of this
+ \getrawnoflines\textheight
+ \else
+ \noflines\layoutlines
+ \fi
+ \advance\noflines \minusone
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen \topskip
+ \else
+ \scratchdimen\ht0
+ \fi
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \setbox2\hbox
+ {\checksinglecolumnfootnotes
+ \lower\scratchdimen\vbox{\placebottomnotes}}%
+ \smashbox2% % needed here
+ \ifbottomnotes
+ \ht0\zeropoint
+ \fi
+ \OTRONEregisteredtextareaB
+ {\vbox to \textheight
+ {\box0\box2\ifbottomnotes\else\vfill\fi}}%
+ \egroup}
+
+\def\OTRONEfinalsidefloatoutput
+ {\finaloutput\unvbox\normalpagebox}
+
+\OTRONEoutput
+ {\sidefloatoutput}
+
+%D Insertions
+
+\newif\iftopofinsert
+
+\def\OTRONEdosettopinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \let\totaltopinserted\!!zeropoint
+ \OTRONEdodosettopinserts
+ \ifnum\@@bknbottom=\zerocount
+ \ifnum\@@bknlines>\zerocount
+ \ifdim\totaltopinserted>\zeropoint\relax
+ \ifdim\dimexpr\@@bknlines\lineheight+\totaltopinserted\relax>\textheight
+ \showmessage\m!floatblocks8\@@bknlines
+ \vfilll\eject
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \egroup}
+
+\def\OTRONEdodosettopinserts
+ {\ifnum\noffloatinserts<\noftopfloats
+ \dogetfloat
+ \ifdim\topinserted=\zeropoint
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \global\advance\topinserted\dimexpr\ht\floatbox+\dp\floatbox+\floatbottomskip\relax
+ \ifdim\topinserted<\textheight\relax
+ \xdef\totaltopinserted{\the\topinserted}%
+ \insert\topins
+ {\forgetall
+ \iftopofinsert
+ \topskipcorrection % [xx] new: see icare topbleed
+ \kern-\lineskip\par
+ \prevdepth\maxdimen
+ \else
+ %\blank[-\@@bkspaceafter,\@@bkspacebefore]% inserts can't look back
+ \betweenfloatblanko
+ \fi
+ \flushfloatbox
+ \blank[\@@bkspaceafter]}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\noftopfloats\relax
+ \fi
+ \dofloatflushedinfo
+ \else
+ \doresavefloat
+ \noffloatinserts\noftopfloats\relax
+ \fi
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks6{\the\noftopfloats}%
+ \fi
+ \let\OTRONEdodosettopinserts\relax
+ \fi
+ \OTRONEdodosettopinserts}
+
+\def\OTRONEdosetbotinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \OTRONEdodosetbotinserts
+ \fi
+ \egroup}
+
+\def\OTRONEdodosetbotinserts
+ {\ifnum\noffloatinserts<\nofbotfloats\relax
+ \dogetfloat
+ \global\advance\botinserted \ht\floatbox\relax
+ \global\advance\botinserted \dp\floatbox\relax
+ \global\advance\botinserted \floattopskip\relax
+ \ifdim\botinserted<\pagegoal\relax
+ \insert\botins
+ {\forgetall
+ \blank[\@@bkspacebefore]%
+ \flushfloatbox}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\nofbotfloats
+ \fi
+ \dofloatflushedinfo
+ \else
+ \doresavefloat
+ \noffloatinserts\nofbotfloats\relax
+ \fi
+ \global\nofloatpermittedtrue % vgl topfloats s!
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks7{\the\nofbotfloats}%
+ \fi
+ \let\OTRONEdodosetbotinserts\relax
+ \fi
+ \OTRONEdodosetbotinserts}
+
+\def\OTRONEdosetbothinserts
+ {\global\topinserted\zeropoint
+ \global\botinserted\zeropoint
+ \ifflushingfloats \else
+ \OTRONEdosettopinserts
+ \OTRONEdosetbotinserts
+ \ifsomefloatwaiting
+ \doif\@@bkcache\v!no\doflushfloats
+ \fi
+ \fi}
+
+\chardef\topinserttopskipmode=0 % 1 no topskip
+
+\def\OTRONEdotopinsertions
+ {\ifvoid\topins\else
+ \ifgridsnapping
+ \box\topins
+ \vskip-\topskip
+ \vskip\strutheight % [xx] new: see icare topbleed
+ \else
+ \ifcase\topinserttopskipmode
+ % 0: default, do nothing
+ \or
+ % 1: no topskip (crossed fingers)
+ \vskip-\topskip
+ \vskip\strutheight
+ \fi
+ \unvbox\topins
+ \fi
+ \fi
+ \global\topinserted\zeropoint}
+
+\def\OTRONEdobotinsertions
+ {\ifvoid\botins\else
+ \ifgridsnapping
+ % \floatparameter\c!bottombefore
+ \snaptogrid\hbox{\box\botins}%
+ % \floatparameter\c!bottomafter
+ \else
+ \floatparameter\c!bottombefore
+ \unvbox\botins
+ \floatparameter\c!bottomafter
+ \fi
+ \fi
+ \global\botinserted\zeropoint
+ \global\nofloatpermittedfalse}
+
+\def\OTRONEdoflushfloats
+ {\global\flushingfloatstrue
+ \ifsomefloatwaiting
+ \par
+ % if kept, then option and definitely off in gridmode ! ! ! !
+ % \ifvmode \prevdepth\maxdimen \fi % prevents whitespace; problematic in icare tests
+ \OTRONEdodoflushfloats
+ \fi
+ \global\savednoffloats\zerocount
+ \global\somefloatwaitingfalse
+ \global\flushingfloatsfalse}
+
+\def\OTRONEflushfloatbox % nog verder doorvoeren en meer info in marge
+ {\ifcenterfloatbox \ifdim\wd\floatbox<\hsize
+ \global\setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}%
+ \fi \fi
+ \snaptogrid\hbox{\iftestfloatbox\ruledhbox\fi{\box\floatbox}}} % was copy
+
+\def\OTRONEdodoflushfloats % much in common with OTRSET
+ {\ifsomefloatwaiting
+ \ifpackflushedfloats
+ \centerfloatboxfalse % not needed as we do call directly
+ \dofloatscollect{text}{\hsize}{1em}%
+ \OTRONEsetvsize
+ \global\setbox\floatbox\hbox to \hsize
+ {\hfil
+ \dorecurse\nofcollectedfloats
+ {\ifcase\columndirection % nog document wide
+ \dofloatsflush{text}{1}%
+ \else
+ \dofloatsflushn{text}{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}%
+ \fi
+ \ifdim\wd\floatbox>\makeupwidth % \hsize
+ \hbox to \makeupwidth{\hss\box\floatbox\hss}%
+ \else
+ \box\floatbox
+ \fi
+ \ifnum\recurselevel<\nofcollectedfloats
+ \hfil
+ \fi}%
+ \hfil}%
+ \else
+ \dogetfloat
+ \fi
+ % there is a chance that due to rounding errors, the float
+ % fits on a page where it was first rejected, in which case
+ % the prevdepth is -maxdimen and we cannot obey the grid
+ \doplacefloatbox
+ \expandafter\OTRONEdodoflushfloats
+ \fi}
+
+\def\OTRONEdocheckiffloatfits % vervangen ivm downward comp
+ {\ifnofloatpermitted
+ \global\roomforfloatfalse
+ \else
+ % new per 31/5/2004, should be an option, only one column mode
+ \begingroup
+ \scratchdimen\dimexpr\pagetotal+\lineheight\relax
+ \ifdim\scratchdimen>\pagegoal
+ \goodbreak % hack ? needed in icare-az
+ \fi
+ % should be an option
+ \endgroup
+ \dimen0\dimexpr\pagetotal+\floatheight+\floattopskip-\pageshrink\relax
+ \dimen2\pagegoal
+ \relax % needed
+ \ifcase\textfloatmethod
+ % method 0 : raw
+ \or
+ % method 1 : safe
+ \dimen2 .99\pagegoal
+ \or
+ % method 2 : tight
+ \advance\dimen0 -\onepoint
+ \fi
+ \relax % really needed ! ! ! !
+ \ifdim\dimen0>\dimen2
+ \global\roomforfloatfalse
+ \else
+ \global\roomforfloattrue
+ \fi
+ \fi}
+
+\def\OTRONEflushsavedfloats
+ {\dosetbothinserts}
+
+% TODO: TEST FIRST, NO CORRECTION NEEDED IN GRID MODE, EVT OPTION
+
+\def\OTRONEsomeherefloat[#1]% spacing between two successive must be better
+ {\baselinecorrection % not really needed in grid mode:
+ %\ifgridsnapping \else \baselinecorrection \fi % ! ! ! test test test ! ! ! !
+ \doplacefloatbox
+ \doinsertfloatinfo
+ \dohandlenextfloatindent}
+
+% \def\OTRONEsomefixdfloat % [#1]
+% {\docheckiffloatfits
+% \ifroomforfloat\else
+% \goodbreak
+% \fi
+% \showmessage\m!floatblocks9\empty
+% \someherefloat} % [#1]
+%
+% better:
+%
+% \dorecurse{50}
+% {[before normal] \input thuan
+% \placefigure{normal}{\framed[height=1cm,width=8cm]{}}
+% \placefigure{normal}{\framed[height=2cm,width=8cm]{}}
+% [before force] \input thuan
+% \placefigure[force]{force}{\framed[height=8cm,width=8cm]{}}}
+
+\chardef\fixedfloatmethod=3
+
+% \def\OTRONEsomefixdfloat % [#1]
+% {\docheckiffloatfits
+% \ifroomforfloat\else
+% \ifzeropt\pagetotal
+% % let's assume that there is room
+% \else
+% \ifcase\fixedfloatmethod
+% % disabled
+% \or % 1 (old method)
+% \goodbreak
+% \or % 2 (safe method)
+% \page
+% \or % 3 (keeps in stream)
+% \vskip\textheight
+% \vskip-\textheight
+% \or % 4 (also keeps in place)
+% \dosomebreak\nobreak
+% \fi
+% \fi
+% \fi
+% \showmessage\m!floatblocks9\empty
+% \someherefloat} % [#1]
+
+\def\OTRONEsomefixdfloat % [#1]
+ {% there is (in mkii) no good way to prevent a break
+ % so better fail than mess, we can get loose from
+ % heads, so be it
+ \showmessage\m!floatblocks9\empty
+ \OTRONEsomeherefloat} % [#1]
+
+\def\OTRONEsomesidefloat[#1]% links, rechts NOG TESTEN EN AANPASSEN
+ {\ifinsidecolumns
+ \someelsefloat[\v!here]%
+ \else
+ %\checkwaitingfloats{#1}%
+ \def\logsidefloat
+ {\doinsertfloatinfo}%
+ \setbox\floatbox\vbox{\box\floatbox}%
+ \wd\floatbox\floatwidth
+ \processfirstactioninset
+ [#1]
+ [ \v!left=>\leftfloat {\box\floatbox},
+ \v!right=>\rightfloat {\box\floatbox},
+ \v!inleft=>\leftmarginfloat {\box\floatbox},
+ \v!inright=>\rightmarginfloat{\box\floatbox},
+ \v!leftmargin=>\leftmarginfloat {\box\floatbox},
+ \v!rightmargin=>\rightmarginfloat{\box\floatbox},
+ \v!leftedge=>\leftedgefloat {\box\floatbox},
+ \v!rightedge=>\rightedgefloat {\box\floatbox},
+ \v!backspace=>\backspacefloat {\box\floatbox},
+ \v!cutspace=>\cutspacefloat {\box\floatbox},
+ \v!inmargin=>\cutspacefloat {\box\floatbox}]%
+ \doifinset\v!tall{#1}\flushsidefloatsafterpar
+ \fi}
+
+\def\OTRONEsomepagefloat [#1]{\dofloatssavepagefloat{page} {#1}}
+\def\OTRONEsomeleftpagefloat [#1]{\dofloatssavepagefloat{leftpage} {#1}}
+\def\OTRONEsomerightpagefloat[#1]{\dofloatssavepagefloat{rightpage}{#1}}
+
+\def\OTRONEsometopsfloat[#1]%
+ {\ifdim\topinserted=\zeropoint
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \global\advance\topinserted\dimexpr\ht\floatbox+\dp\floatbox+\floatbottomskip\relax
+ \insert\topins
+ {\forgetall
+ \iftopofinsert
+ \topskipcorrection % [xx] new: see icare topbleed
+ \kern-\lineskip\par\prevdepth\maxdimen
+ \else
+ %\blank[-\@@bkspaceafter,\@@bkspacebefore]% inserts can't look back
+ \betweenfloatblanko
+ \fi
+ \flushfloatbox
+ \blank[\@@bkspaceafter]}%
+ \doinsertfloatinfo}
+
+\def\OTRONEsomebotsfloat[#1]%
+ {\global\advance\botinserted\dimexpr\ht\floatbox+\dp\floatbox+\floattopskip\relax
+ \insert\botins
+ {\forgetall
+ \blank[\@@bkspacebefore]%
+ \flushfloatbox}%
+ %\global\nofloatpermittedtrue
+ \doinsertfloatinfo}
+
+\def\OTRONEsomefacefloat[#1]% untested
+ {\startopposite\flushfloatbox\stopopposite}
+
+\def\OTRONEnextcolumn[#1]%
+ {}
+
+\protect \endinput
diff --git a/tex/context/base/page-par.mkii b/tex/context/base/page-par.mkii
new file mode 100644
index 000000000..a5dea2e63
--- /dev/null
+++ b/tex/context/base/page-par.mkii
@@ -0,0 +1,58 @@
+%D \module
+%D [ file=page-par, % copied from page-lin
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Line Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Paragraph Numbering}
+
+\unprotect
+
+\newcount\internalparagraphnumber
+
+\def\setupparagraphnumbering
+ {\dosingleempty\dosetupparagraphnumbering}
+
+\def\dosetupparagraphnumbering[#1]%
+ {\getparameters
+ [\??ph][#1]%
+ \processaction
+ [\@@phstate]
+ [\v!start=>\let\showparagraphnumber\doshowparagraphnumberA,
+ \v!stop=>\let\showparagraphnumber\relax,
+ \v!line=>\let\showparagraphnumber\doshowparagraphnumberB,
+ \v!reset=>\global\internalparagraphnumber\zerocount
+ \let\showparagraphnumber\doshowparagraphnumberA]}
+
+\def\dodoshowparagraphnumber
+ {\global\advance\internalparagraphnumber \plusone
+ \inleftmargin % \tf normalizes em
+ {\tf{\doattributes\??ph\c!style\c!color{\the\internalparagraphnumber}}%
+ \kern\@@phdistance}}
+
+\def\doshowparagraphnumberA
+ {\ifprocessingverbatim
+ \iflinepar\dodoshowparagraphnumber\fi
+ \else
+ \dodoshowparagraphnumber
+ \fi}
+
+\def\doshowparagraphnumberB
+ {\ifnumberinglines
+ \doshowparagraphnumberA
+ \fi}
+
+\setupparagraphnumbering
+ [\c!state=\v!stop,
+ \c!style=,
+ \c!color=,
+ \c!distance=\ifcase\linenumberlocation2em\else\!!zeropoint\fi] % will change
+
+\protect \endinput
diff --git a/tex/context/base/page-par.mkiv b/tex/context/base/page-par.mkiv
new file mode 100644
index 000000000..fb8631eec
--- /dev/null
+++ b/tex/context/base/page-par.mkiv
@@ -0,0 +1,58 @@
+%D \module
+%D [ file=page-par, % copied from page-lin
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Line Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Paragraph Numbering}
+
+\unprotect
+
+\newcount\internalparagraphnumber
+
+\unexpanded\def\setupparagraphnumbering
+ {\dosingleempty\dosetupparagraphnumbering}
+
+\def\dosetupparagraphnumbering[#1]%
+ {\getparameters
+ [\??ph][#1]%
+ \processaction
+ [\@@phstate]
+ [\v!start=>\let\showparagraphnumber\doshowparagraphnumberA,
+ \v!stop=>\let\showparagraphnumber\relax,
+ \v!line=>\let\showparagraphnumber\doshowparagraphnumberB,
+ \v!reset=>\global\internalparagraphnumber\zerocount
+ \let\showparagraphnumber\doshowparagraphnumberA]}
+
+\def\dodoshowparagraphnumber
+ {\global\advance\internalparagraphnumber \plusone
+ \inleftmargin % \tf normalizes em
+ {\tf{\doattributes\??ph\c!style\c!color{\the\internalparagraphnumber}}%
+ \kern\@@phdistance}}
+
+\def\doshowparagraphnumberA
+ {\ifprocessingverbatim
+ \iflinepar\dodoshowparagraphnumber\fi
+ \else
+ \dodoshowparagraphnumber
+ \fi}
+
+\def\doshowparagraphnumberB
+ {\ifnumberinglines
+ \doshowparagraphnumberA
+ \fi}
+
+\setupparagraphnumbering
+ [\c!state=\v!stop,
+ \c!style=,
+ \c!color=,
+ \c!distance=\ifcase\linenumberlocation2em\else\!!zeropoint\fi] % will change
+
+\protect \endinput
diff --git a/tex/context/base/page-plg.mkii b/tex/context/base/page-plg.mkii
new file mode 100644
index 000000000..3203b923c
--- /dev/null
+++ b/tex/context/base/page-plg.mkii
@@ -0,0 +1,202 @@
+%D \module
+%D [ file=page-pls,
+%D version=2003.03.16,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Page Setup,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\pageareabox\undefined \else \endinput \fi
+
+\writestatus{loading}{ConTeXt Page Macros / Extra Page Building}
+
+%D This feature has been present for a while but has never been
+%D exploited: pluggable pagebuilders. The next example code
+%D demonstrates the application of one such a plug-in. This variant
+%D support \type {page}, \type {leftpage} and \type {rightpage}
+%D definitions where specific areas are placed with the \type
+%D {\pagearea} command.
+%D
+%D \starttyping
+%D \setupheadertexts[the header text]
+%D \setupfootertexts[a pretty long left footer text][something right]
+%D \setupbottomtexts[a not so long bottom text][another right thing]
+%D \setuptexttexts [margin][something marginal][indeed]
+%D
+%D \startpagelayout[leftpage]
+%D \setupTABLE[offset=overlay]
+%D \setupTABLE[c][1][width=\leftmarginwidth]
+%D \bTABLE
+%D \bTR
+%D \bTD[nx=3,background=color,backgroundcolor=green]
+%D \pagearea[header][text][middle]
+%D \eTD
+%D \eTR
+%D \bTR
+%D \bTD \pagearea[text][margin][left] \eTD
+%D \bTD[nx=2] \pagearea[text] \eTD
+%D \eTR
+%D \bTR
+%D \bTD[nx=3,offset=overlay]
+%D {\bTABLE[width=.5\hsize]
+%D \bTR
+%D \bTD \pagearea[footer][text][left] \eTD
+%D \bTD \pagearea[bottom][text][left] \eTD
+%D \eTR
+%D \eTABLE}
+%D \eTD
+%D \eTR
+%D \eTABLE
+%D \stoppagelayout
+%D
+%D \startpagelayout[rightpage]
+%D \setupTABLE[offset=overlay]
+%D \setupTABLE[c][1][width=\rightmarginwidth]
+%D \bTABLE
+%D \bTR
+%D \bTD[nx=3] \pagearea[header][text][middle] \eTD
+%D \eTR
+%D \bTR
+%D \bTD \pagearea[text][margin][left] \eTD
+%D \bTD[nx=2] \pagearea[text] \eTD
+%D \eTR
+%D \bTR
+%D \bTD[nx=3,offset=overlay]
+%D {\bTABLE[width=.5\hsize]
+%D \bTR
+%D \bTD \pagearea[bottom][text][right] \eTD
+%D \bTD \pagearea[footer][text][right] \eTD
+%D \eTR
+%D \eTABLE}
+%D \eTD
+%D \eTR
+%D \eTABLE
+%D \stoppagelayout
+%D
+%D \setupcolors[state=start]
+%D
+%D \setupbackgrounds[text][background=color,backgroundcolor=blue]
+%D \setupbackgrounds[header][text][background=color,backgroundcolor=red]
+%D
+%D \setuppagenumbering[alternative=doublesided,location=]
+%D
+%D \setuplayout[method=makeup]
+%D
+%D \definetextbackground
+%D [test]
+%D [state=start,
+%D background=color,
+%D backgroundcolor=yellow]
+%D
+%D \starttext
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \input tufte \starttest \input tufte \stoptest \input tufte
+%D
+%D \starttabulate
+%D \NC test \NC \starttest \input tufte \stoptest \NC \NR
+%D \stoptabulate
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \stoptext
+%D \stoptyping
+
+\unprotect
+
+\setvalue{\??ly\c!method\v!makeup}#1#2%
+ {\setbox\pagebox\hbox
+ {\vbox to \textheight
+ {\offinterlineskip
+ % optie
+ \vskip\dimexpr-1\topskip+\strutheight\relax
+ %
+ \textwidth\makeupwidth
+ \hsize\textwidth
+ \boxmaxdepth\maxdepth
+ \noindent
+ \dopagecontents#1#2}}%
+ \wd\pagebox\makeupwidth
+ \ht\pagebox\textheight
+ \dp\pagebox\zeropoint
+ \hsize\paperwidth
+ \vsize\paperheight
+ \setbox\pagebox\vbox
+ {\doifbothsidesoverruled
+ {\let\!!stringa\v!page}
+ {\let\!!stringa\v!rightpage}
+ {\let\!!stringa\v!leftpage}%
+ \getvalue{\??ly\c!method:\!!stringa}}%
+ \wd\pagebox\paperwidth
+ \ht\pagebox\paperheight
+ \dp\pagebox\zeropoint}
+
+\newbox\pageareabox
+
+\def\pagearea
+ {\dotripleempty\dopagearea}
+
+\def\dopagearea[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelse{#3}\v!left
+ {\dodopagearea{#1}{#2}\c!lefttext}
+ {\doifelse{#3}\v!right
+ {\dodopagearea{#1}{#2}\c!righttext}
+ {\dodopagearea{#1}{#2}\c!middletext}}%
+ \else\ifsecondargument
+ \doifbothsidesoverruled
+ {\dodopagearea{#1}{#2}\c!righttext}
+ {\dodopagearea{#1}{#2}\c!righttext}
+ {\dodopagearea{#1}{#2}\c!lefttext }%
+ \else
+ \doif{#1}\v!text % copy due to trial runs in TABLE
+ {\iftrialtypesetting
+ \copy\pagebox
+ \else
+ \setbox\pagebox\vbox
+ {\localstarttextcolor
+ \box\pagebox
+ \localstoptextcolor}%
+ \localpositioningfalse
+ \addtextbackground\pagebox
+ \addtextgridlayer\pagebox
+ \box\pagebox
+ \fi}%
+ \fi\fi}
+
+\def\dodopagearea#1#2#3%
+ {\setbox\pageareabox\vbox{\getvalue{\??tk#1#2#3}}%
+ \ifsomebackgroundfound{#1#2}%
+ \iftrialtypesetting
+ \box\pageareabox
+ \else
+ \localframed
+ [\??ma#1#2]
+ [\c!width=\wd\pageareabox,
+ \c!height=\ht\pageareabox,
+ \c!offset=\v!overlay]
+ {\box\pageareabox}%
+ \fi
+ \else
+ \box\pageareabox
+ \fi}
+
+\setvalue{\??ly\c!method:\v!leftpage }{\getvalue{\??ly\c!method:\v!page}}
+\setvalue{\??ly\c!method:\v!rightpage}{\getvalue{\??ly\c!method:\v!page}}
+
+% \long\def\startpagelayout[#1]#2\stoppagelayout
+% {\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\long\def\startpagelayout
+ {\bgroup\catcode`\^^M=\@@ignore\dostartpagelayout}
+
+\long\def\dostartpagelayout[#1]#2\stoppagelayout
+ {\egroup\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\protect \endinput
diff --git a/tex/context/base/page-plg.mkiv b/tex/context/base/page-plg.mkiv
new file mode 100644
index 000000000..7d7612153
--- /dev/null
+++ b/tex/context/base/page-plg.mkiv
@@ -0,0 +1,198 @@
+%D \module
+%D [ file=page-pls,
+%D version=2003.03.16,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Page Setup,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\pageareabox\undefined \else \endinput \fi
+
+\writestatus{loading}{ConTeXt Page Macros / Extra Page Building}
+
+%D This feature has been present for a while but has never been
+%D exploited: pluggable pagebuilders. The next example code
+%D demonstrates the application of one such a plug-in. This variant
+%D support \type {page}, \type {leftpage} and \type {rightpage}
+%D definitions where specific areas are placed with the \type
+%D {\pagearea} command.
+%D
+%D \starttyping
+%D \setupheadertexts[the header text]
+%D \setupfootertexts[a pretty long left footer text][something right]
+%D \setupbottomtexts[a not so long bottom text][another right thing]
+%D \setuptexttexts [margin][something marginal][indeed]
+%D
+%D \startpagelayout[leftpage]
+%D \setupTABLE[offset=overlay]
+%D \setupTABLE[c][1][width=\leftmarginwidth]
+%D \bTABLE
+%D \bTR
+%D \bTD[nx=3,background=color,backgroundcolor=green]
+%D \pagearea[header][text][middle]
+%D \eTD
+%D \eTR
+%D \bTR
+%D \bTD \pagearea[text][margin][left] \eTD
+%D \bTD[nx=2] \pagearea[text] \eTD
+%D \eTR
+%D \bTR
+%D \bTD[nx=3,offset=overlay]
+%D {\bTABLE[width=.5\hsize]
+%D \bTR
+%D \bTD \pagearea[footer][text][left] \eTD
+%D \bTD \pagearea[bottom][text][left] \eTD
+%D \eTR
+%D \eTABLE}
+%D \eTD
+%D \eTR
+%D \eTABLE
+%D \stoppagelayout
+%D
+%D \startpagelayout[rightpage]
+%D \setupTABLE[offset=overlay]
+%D \setupTABLE[c][1][width=\rightmarginwidth]
+%D \bTABLE
+%D \bTR
+%D \bTD[nx=3] \pagearea[header][text][middle] \eTD
+%D \eTR
+%D \bTR
+%D \bTD \pagearea[text][margin][left] \eTD
+%D \bTD[nx=2] \pagearea[text] \eTD
+%D \eTR
+%D \bTR
+%D \bTD[nx=3,offset=overlay]
+%D {\bTABLE[width=.5\hsize]
+%D \bTR
+%D \bTD \pagearea[bottom][text][right] \eTD
+%D \bTD \pagearea[footer][text][right] \eTD
+%D \eTR
+%D \eTABLE}
+%D \eTD
+%D \eTR
+%D \eTABLE
+%D \stoppagelayout
+%D
+%D \setupcolors[state=start]
+%D
+%D \setupbackgrounds[text][background=color,backgroundcolor=blue]
+%D \setupbackgrounds[header][text][background=color,backgroundcolor=red]
+%D
+%D \setuppagenumbering[alternative=doublesided,location=]
+%D
+%D \setuplayout[method=makeup]
+%D
+%D \definetextbackground
+%D [test]
+%D [state=start,
+%D background=color,
+%D backgroundcolor=yellow]
+%D
+%D \starttext
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \input tufte \starttest \input tufte \stoptest \input tufte
+%D
+%D \starttabulate
+%D \NC test \NC \starttest \input tufte \stoptest \NC \NR
+%D \stoptabulate
+%D
+%D \dorecurse{10}{\input tufte \par}
+%D
+%D \stoptext
+%D \stoptyping
+
+\unprotect
+
+\setvalue{\??ly\c!method\v!makeup}#1#2%
+ {\setbox\pagebox\hbox
+ {\vbox to \textheight
+ {\offinterlineskip
+ % optie
+ \vskip\dimexpr-1\topskip+\strutheight\relax
+ %
+ \textwidth\makeupwidth
+ \hsize\textwidth
+ \boxmaxdepth\maxdepth
+ \noindent
+ \dopagecontents#1#2}}%
+ \wd\pagebox\makeupwidth
+ \ht\pagebox\textheight
+ \dp\pagebox\zeropoint
+ \hsize\paperwidth
+ \vsize\paperheight
+ \setbox\pagebox\vbox
+ {\doifbothsidesoverruled
+ {\let\!!stringa\v!page}
+ {\let\!!stringa\v!rightpage}
+ {\let\!!stringa\v!leftpage}%
+ \getvalue{\??ly\c!method:\!!stringa}}%
+ \wd\pagebox\paperwidth
+ \ht\pagebox\paperheight
+ \dp\pagebox\zeropoint}
+
+\newbox\pageareabox
+
+\def\pagearea
+ {\dotripleempty\dopagearea}
+
+\def\dopagearea[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelse{#3}\v!left
+ {\dodopagearea{#1}{#2}\c!lefttext}
+ {\doifelse{#3}\v!right
+ {\dodopagearea{#1}{#2}\c!righttext}
+ {\dodopagearea{#1}{#2}\c!middletext}}%
+ \else\ifsecondargument
+ \doifbothsidesoverruled
+ {\dodopagearea{#1}{#2}\c!righttext}
+ {\dodopagearea{#1}{#2}\c!righttext}
+ {\dodopagearea{#1}{#2}\c!lefttext }%
+ \else
+ \doif{#1}\v!text % copy due to trial runs in TABLE
+ {\iftrialtypesetting
+ \copy\pagebox
+ \else
+ \localpositioningfalse
+ \addtextbackground\pagebox
+ \addtextgridlayer\pagebox
+ \box\pagebox
+ \fi}%
+ \fi\fi}
+
+\def\dodopagearea#1#2#3%
+ {\setbox\pageareabox\vbox{\getvalue{\??tk#1#2#3}}%
+ \ifsomebackgroundfound{#1#2}%
+ \iftrialtypesetting
+ \box\pageareabox
+ \else
+ \localframed
+ [\??ma#1#2]
+ [\c!width=\wd\pageareabox,
+ \c!height=\ht\pageareabox,
+ \c!offset=\v!overlay]
+ {\box\pageareabox}%
+ \fi
+ \else
+ \box\pageareabox
+ \fi}
+
+\setvalue{\??ly\c!method:\v!leftpage }{\getvalue{\??ly\c!method:\v!page}}
+\setvalue{\??ly\c!method:\v!rightpage}{\getvalue{\??ly\c!method:\v!page}}
+
+% \long\unexpanded\def\startpagelayout[#1]#2\stoppagelayout
+% {\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\long\unexpanded\def\startpagelayout
+ {\bgroup\catcode`\^^M=\@@ignore\dostartpagelayout}
+
+\long\def\dostartpagelayout[#1]#2\stoppagelayout
+ {\egroup\long\setvalue{\??ly\c!method:#1}{#2}}
+
+\protect \endinput
diff --git a/tex/context/base/page-run.mkii b/tex/context/base/page-run.mkii
new file mode 100644
index 000000000..ae5af81e9
--- /dev/null
+++ b/tex/context/base/page-run.mkii
@@ -0,0 +1,382 @@
+%D \module
+%D [ file=page-run,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Runtime Macros}
+
+\unprotect
+
+\gdef\doshowprint[#1][#2][#3]%
+ {\framed
+ [\c!offset=\v!overlay,
+ \c!strut=\v!no]
+ {\forgetall
+ \dontcomplain
+ \globaldefs\minusone
+ \dimen0\pagegoal
+ \definepapersize[X][\c!width=4em, \c!height=6em]%
+ \definepapersize[Y][\c!width=12em,\c!height=14em]%
+ \setuppapersize[#1,X][#2,Y]%
+ \setuplayout[#3]%
+ \setbox0\vbox
+ {\framed
+ [\c!offset=\v!overlay,\c!strut=\v!no,
+ \c!width=\paperwidth,\c!height=\paperheight]
+ {\ss ABC\par DEF}}%
+ \doublesidedfalse
+ \def\cutmarklength{.5em}%
+ \addpagecutmarks0%
+ \replicatepagebox0%
+ \scalepagebox0%
+ \mirrorpaperbox0%
+ \orientpaperbox0%
+ \centerpagebox0%
+ \mirrorprintbox0%
+ \orientprintbox0%
+ \offsetprintbox0%
+ \pagegoal\dimen0
+ \box0}}
+
+\gdef\showprint
+ {\dotripleempty\doshowprint}
+
+% \switchnaarkorps[8pt]
+%
+% \startcombinatie[4*4]
+% {\toonprint} {\strut}
+% {\toonprint[][][plaats=midden]} {\type{plaats=midden}}
+% {\toonprint[][][plaats=midden,markering=aan]} {\type{markering=aan}\break
+% \type{plaats=midden}}
+% {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break
+% \type{plaats=midden}\break
+% \type{nx=2}}
+% {\toonprint[][][plaats=links]} {\type{plaats=links}}
+% {\toonprint[][][plaats=rechts]} {\type{plaats=rechts}}
+% {\toonprint[][][plaats={links,onder}]} {\type{plaats={links,onder}}}
+% {\toonprint[][][plaats={rechts,onder}]} {\type{plaats={rechts,onder}}}
+% {\toonprint[][][nx=2,ny=1]} {\type{nx=2,ny=1}}
+% {\toonprint[][][nx=1,ny=2]} {\type{nx=1,ny=2}}
+% {\toonprint[][][nx=2,ny=2]} {\type{nx=2,ny=2}}
+% {\toonprint[][][nx=2,ny=2,plaats=midden]} {\type{nx=2,ny=2}\break
+% \type{plaats=midden}}
+% {\toonprint[][][rugoffset=3pt]} {\type{rugoffset=.5cm}}
+% {\toonprint[][][kopoffset=3pt]} {\type{kopoffset=.5cm}}
+% {\toonprint[][][schaal=1.5]} {\type{schaal=1.5}}
+% {\toonprint[][][schaal=0.8]} {\type{schaal=0.8}}
+% \stopcombinatie
+%
+% \startcombinatie[3*4]
+% {\toonprint[liggend][][plaats=midden]} {\type{liggend}}
+% {\toonprint[][liggend][plaats=midden]} {\strut\break\type{liggend}}
+% {\toonprint[liggend][liggend][plaats=midden]} {\type{liggend}\break\type{liggend}}
+% {\toonprint[90][][plaats=midden]} {\type{90}}
+% {\toonprint[][90][plaats=midden]} {\strut\break\type{90}}
+% {\toonprint[90][90][plaats=midden]} {\type{90}\break\type{90}}
+% {\toonprint[180][][plaats=midden]} {\type{180}}
+% {\toonprint[][180][plaats=midden]} {\strut\break\type{180}}
+% {\toonprint[180][180][plaats=midden]} {\type{180}\break\type{180}}
+% {\toonprint[gespiegeld][][plaats=midden]} {\type{gespiegeld}}
+% {\toonprint[][gespiegeld][plaats=midden]} {\strut\break\type{gespiegeld}}
+% {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}}
+% \stopcombinatie
+
+\gdef\doshowframe[#1][#2]%
+ {\ifsecondargument
+ \setupbackgrounds
+ [\v!page]
+ [\c!frame=\v!on,
+ \c!corner=\v!rectangular,
+ \c!frameoffset=\!!zeropoint,
+ \c!framedepth=\!!zeropoint,
+ \c!framecolor=layout:page]
+ \setupbackgrounds
+ [#1][#2]
+ [\c!background=,
+ \c!frame=\v!on,
+ \c!corner=\v!rectangular,
+ \c!frameoffset=\!!zeropoint,
+ \c!framedepth=\!!zeropoint,
+ \c!framecolor=]
+ \else\iffirstargument
+ \showframe
+ [\v!header,\v!text,\v!footer]
+ [#1]
+ \else
+ \showframe
+ [\v!header,\v!text,\v!footer]
+ [\v!leftedge,\v!leftmargin,
+ \v!text,
+ \v!rightmargin,\v!rightedge]
+ \fi\fi
+ \setupbackgrounds
+ [\c!state=\v!repeat]}
+
+\gdef\showframe{\dodoubleempty\doshowframe}
+
+\gdef\showsetupA#1#2%
+ {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr}
+
+\gdef\showsetupB#1#2#3%
+ {#1&&#2#3&\tttf\string#3\cr}
+
+% \startinterface english % english is fallback
+
+\gdef\showsetups
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{paperheight} \paperheight
+ \showsetupA{paperwidth} \paperwidth
+ \showsetupA{printpaperheight} \printpaperheight
+ \showsetupA{printpaperwidth} \printpaperwidth
+ \showsetupA{topspace} \topspace
+ \showsetupA{backspace} \backspace
+ \showsetupA{height} \makeupheight
+ \showsetupA{width} \makeupwidth
+ \showsetupA{top} \topheight
+ \showsetupA{topdistance} \topdistance
+ \showsetupA{header} \headerheight
+ \showsetupA{headerdistance} \headerdistance
+ \showsetupA{textheight} \textheight
+ \showsetupA{footerdistance} \footerdistance
+ \showsetupA{footer} \footerheight
+ \showsetupA{bottomdistance} \bottomdistance
+ \showsetupA{bottom} \bottomheight
+ \showsetupA{leftedge} \leftedgewidth
+ \showsetupA{leftedgedistance} \leftedgedistance
+ \showsetupA{leftmargin} \leftmarginwidth
+ \showsetupA{leftmargindistance} \leftmargindistance
+ \showsetupA{textwidth} \textwidth
+ \showsetupA{rightmargindistance}\rightmargindistance
+ \showsetupA{rightmargin} \rightmarginwidth
+ \showsetupA{rightedgedistance} \rightedgedistance
+ \showsetupA{rightedge} \rightedgewidth
+ \showsetupB{bodyfontsize} \the \globalbodyfontsize
+ \showsetupB{line} \relax \normallineheight
+ \showsetupB{height} \relax \strutheightfactor
+ \showsetupB{depth} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+% \stopinterface
+
+\startinterface dutch
+
+\gdef\showsetups
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{papierhoogte} \papierhoogte
+ \showsetupA{papierbreedte} \papierbreedte
+ \showsetupA{printpapierhoogte} \printpapierhoogte
+ \showsetupA{printpapierbreedte} \printpapierbreedte
+ \showsetupA{kopwit} \kopwit
+ \showsetupA{rugwit} \rugwit
+ \showsetupA{snijwit} \snijwit
+ \showsetupA{hoogte} \zethoogte
+ \showsetupA{breedte} \zetbreedte
+ \showsetupA{boven} \bovenhoogte
+ \showsetupA{bovenafstand} \bovenafstand
+ \showsetupA{hoofd} \hoofdhoogte
+ \showsetupA{hoofdafstand} \hoofdafstand
+ \showsetupA{teksthoogte} \teksthoogte
+ \showsetupA{voetafstand} \voetafstand
+ \showsetupA{voet} \voethoogte
+ \showsetupA{onderafstand} \onderafstand
+ \showsetupA{onder} \onderhoogte
+ \showsetupA{linkerrand} \linkerrandbreedte
+ \showsetupA{linkerrandafstand} \linkerrandafstand
+ \showsetupA{linkermarge} \linkermargebreedte
+ \showsetupA{linkermargeafstand} \linkermargeafstand
+ \showsetupA{tekstbreedte} \tekstbreedte
+ \showsetupA{rechtermargeafstand}\rechtermargeafstand
+ \showsetupA{rechtermarge} \rechtermargebreedte
+ \showsetupA{rechterrandafstand} \rechterrandafstand
+ \showsetupA{rechterrand} \rechterrandbreedte
+ \showsetupB{korps} \the \globalbodyfontsize
+ \showsetupB{regel} \relax \normallineheight
+ \showsetupB{hoogte} \relax \strutheightfactor
+ \showsetupB{diepte} \relax \strutdepthfactor
+ \showsetupB{boven} \relax \topskipfactor
+ \showsetupB{onder} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+% todo: \showsetupA{rugwit} \rugwit
+
+\startinterface german
+
+\gdef\showsetups%
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{papierhoehe} \papierhoehe
+ \showsetupA{papierbreite} \papierbreite
+ \showsetupA{printpapierhoehe} \printpapierhoehe
+ \showsetupA{printpapierbreite} \printpapierbreite
+ \showsetupA{kopfweite} \kopfweite
+ \showsetupA{rumpfweite} \rumpfweite
+ \showsetupA{hoehe} \satzhoehe
+ \showsetupA{breite} \satzbreite
+ \showsetupA{oben} \hoeheoben
+ \showsetupA{abstandoben} \abstandoben
+ \showsetupA{kopfzeile} \kopfzeilenhoehe
+ \showsetupA{kopfzeilenabstand} \kopfzeilenabstand
+ \showsetupA{texthoehe} \texthoehe
+ \showsetupA{fusszeileabstand} \fusszeileabstand
+ \showsetupA{fusszeilen} \fusszeilenhoehe
+ \showsetupA{abstandunten} \abstandunten
+ \showsetupA{hoeheunten} \hoeheunten
+ \showsetupA{linkerrand} \breitelinkerrand
+ \showsetupA{abstandlinkerrand} \abstandlinkerrand
+ \showsetupA{linkemarginal} \linkemarginalbreite
+ \showsetupA{linkemarginalafstand} \linkemarginalafstand
+ \showsetupA{textbreite} \textbreite
+ \showsetupA{rechtemarginalafstand}\rechtemarginalafstand
+ \showsetupA{rechtemarginal} \rechtemarginalbreite
+ \showsetupA{abstandrechterrand} \abstandrechterrand
+ \showsetupA{rechterrand} \breiterechterrand
+ \showsetupB{fliesstext} \the \globalbodyfontsize
+ \showsetupB{linie} \relax \normallineheight
+ \showsetupB{hoehe} \relax \strutheightfactor
+ \showsetupB{tiefe} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface czech
+
+\gdef\showsetups%
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{vyskapapiru} \vyskapapiru
+ \showsetupA{sirkapapiru} \sirkapapiru
+ \showsetupA{vyskatiskpapiru} \vyskatiskpapiru
+ \showsetupA{sirkatiskpapiru} \sirkatiskpapiru
+ \showsetupA{hornimezera} \hornimezera
+ \showsetupA{spodnimezera} \spodnimezera
+ \showsetupA{vyska} \vyskasazby
+ \showsetupA{breite} \sirkasazby
+ \showsetupA{vyskatextu} \vyskatextu
+ \showsetupA{sirkatextu} \sirkatextu
+ \showsetupA{horejsek} \vyskahorejsku
+ \showsetupA{vzdalenosthorejsku} \vzdalenosthorejsku
+ \showsetupA{zahlavi} \vyskazahlavi
+ \showsetupA{vzdalenostzahlavi} \vzdalenostzahlavi
+ \showsetupA{fusszeileabstand} \vzdalenostupati
+ \showsetupA{upati} \vyskaupati
+ \showsetupA{vzdalenostspodku} \vzdalenostspodku
+ \showsetupA{spodek} \vyakaspodku
+ \showsetupA{levyokraj} \sirkalevehookraje
+ \showsetupA{vzdalenostlevehookraje} \vzdalenostlevehookraje
+ \showsetupA{levamarginalie} \sirkalevemarginalie
+ \showsetupA{vzdalenostlevemarginalie} \vzdalenostlevemarginalie
+ \showsetupA{vzdalenostpravemarginalie}\vzdalenostpravemarginalie
+ \showsetupA{pravamarginalie} \sirkapravemarginalie
+ \showsetupA{vzdalenostpravehookraje} \vzdalenostpravehookraje
+ \showsetupA{pravyokraj} \sirkapravehookraje
+ \showsetupB{zakladnivelikost} \the \globalbodyfontsize
+ \showsetupB{linka} \relax \normallineheight
+ \showsetupB{vyska} \relax \strutheightfactor
+ \showsetupB{hloubka} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface romanian
+
+\gdef\showsetups%
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{paperheight} \paperheight
+ \showsetupA{paperwidth} \paperwidth
+ \showsetupA{printpaperheight} \printpaperheight
+ \showsetupA{printpaperwidth} \printpaperwidth
+ \showsetupA{topspace} \topspace
+ \showsetupA{backspace} \backspace
+ \showsetupA{height} \makeupheight
+ \showsetupA{width} \makeupwidth
+ \showsetupA{top} \topheight
+ \showsetupA{topdistance} \topdistance
+ \showsetupA{header} \headerheight
+ \showsetupA{headerdistance} \headerdistance
+ \showsetupA{textheight} \textheight
+ \showsetupA{footerdistance} \footerdistance
+ \showsetupA{footer} \footerheight
+ \showsetupA{bottomdistance} \bottomdistance
+ \showsetupA{bottom} \bottomheight
+ \showsetupA{leftedge} \leftedgewidth
+ \showsetupA{leftedgedistance} \leftedgedistance
+ \showsetupA{leftmargin} \leftmarginwidth
+ \showsetupA{leftmargindistance} \leftmargindistance
+ \showsetupA{textwidth} \textwidth
+ \showsetupA{rightmargindistance}\rightmargindistance
+ \showsetupA{rightmargin} \rightmarginwidth
+ \showsetupA{rightedgedistance} \rightedgedistance
+ \showsetupA{rightedge} \rightedgewidth
+ \showsetupB{bodyfontsize} \the \globalbodyfontsize
+ \showsetupB{line} \relax \normallineheight
+ \showsetupB{height} \relax \strutheightfactor
+ \showsetupB{depth} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\gdef\showlayout % interfereert lelijk met een \typefile er na
+ {\bgroup
+ \page
+ \showframe
+ \setuplayout[\c!marking=\v!on]
+ \dorecurse{4}{\showsetups\page}
+ \egroup}
+
+\gdef\showmargins
+ {\starttabulate
+ \NC asynchrone \NC \doifoddpageelse {odd} {even} \NC \NR
+ \NC synchrone \NC \doifrightpageelse {right} {left} \NC \NR
+ \NC right margin \NC \the\rightmarginwidth \NC \NR
+ \NC left margin \NC \the\leftmarginwidth \NC \NR
+ \NC outer margin \NC \the\outermarginwidth \NC \NR
+ \NC inner margin \NC \the\innermarginwidth \NC \NR
+ \stoptabulate}
+
+\protect \endinput
diff --git a/tex/context/base/page-run.mkiv b/tex/context/base/page-run.mkiv
new file mode 100644
index 000000000..ae5af81e9
--- /dev/null
+++ b/tex/context/base/page-run.mkiv
@@ -0,0 +1,382 @@
+%D \module
+%D [ file=page-run,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Runtime Macros}
+
+\unprotect
+
+\gdef\doshowprint[#1][#2][#3]%
+ {\framed
+ [\c!offset=\v!overlay,
+ \c!strut=\v!no]
+ {\forgetall
+ \dontcomplain
+ \globaldefs\minusone
+ \dimen0\pagegoal
+ \definepapersize[X][\c!width=4em, \c!height=6em]%
+ \definepapersize[Y][\c!width=12em,\c!height=14em]%
+ \setuppapersize[#1,X][#2,Y]%
+ \setuplayout[#3]%
+ \setbox0\vbox
+ {\framed
+ [\c!offset=\v!overlay,\c!strut=\v!no,
+ \c!width=\paperwidth,\c!height=\paperheight]
+ {\ss ABC\par DEF}}%
+ \doublesidedfalse
+ \def\cutmarklength{.5em}%
+ \addpagecutmarks0%
+ \replicatepagebox0%
+ \scalepagebox0%
+ \mirrorpaperbox0%
+ \orientpaperbox0%
+ \centerpagebox0%
+ \mirrorprintbox0%
+ \orientprintbox0%
+ \offsetprintbox0%
+ \pagegoal\dimen0
+ \box0}}
+
+\gdef\showprint
+ {\dotripleempty\doshowprint}
+
+% \switchnaarkorps[8pt]
+%
+% \startcombinatie[4*4]
+% {\toonprint} {\strut}
+% {\toonprint[][][plaats=midden]} {\type{plaats=midden}}
+% {\toonprint[][][plaats=midden,markering=aan]} {\type{markering=aan}\break
+% \type{plaats=midden}}
+% {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break
+% \type{plaats=midden}\break
+% \type{nx=2}}
+% {\toonprint[][][plaats=links]} {\type{plaats=links}}
+% {\toonprint[][][plaats=rechts]} {\type{plaats=rechts}}
+% {\toonprint[][][plaats={links,onder}]} {\type{plaats={links,onder}}}
+% {\toonprint[][][plaats={rechts,onder}]} {\type{plaats={rechts,onder}}}
+% {\toonprint[][][nx=2,ny=1]} {\type{nx=2,ny=1}}
+% {\toonprint[][][nx=1,ny=2]} {\type{nx=1,ny=2}}
+% {\toonprint[][][nx=2,ny=2]} {\type{nx=2,ny=2}}
+% {\toonprint[][][nx=2,ny=2,plaats=midden]} {\type{nx=2,ny=2}\break
+% \type{plaats=midden}}
+% {\toonprint[][][rugoffset=3pt]} {\type{rugoffset=.5cm}}
+% {\toonprint[][][kopoffset=3pt]} {\type{kopoffset=.5cm}}
+% {\toonprint[][][schaal=1.5]} {\type{schaal=1.5}}
+% {\toonprint[][][schaal=0.8]} {\type{schaal=0.8}}
+% \stopcombinatie
+%
+% \startcombinatie[3*4]
+% {\toonprint[liggend][][plaats=midden]} {\type{liggend}}
+% {\toonprint[][liggend][plaats=midden]} {\strut\break\type{liggend}}
+% {\toonprint[liggend][liggend][plaats=midden]} {\type{liggend}\break\type{liggend}}
+% {\toonprint[90][][plaats=midden]} {\type{90}}
+% {\toonprint[][90][plaats=midden]} {\strut\break\type{90}}
+% {\toonprint[90][90][plaats=midden]} {\type{90}\break\type{90}}
+% {\toonprint[180][][plaats=midden]} {\type{180}}
+% {\toonprint[][180][plaats=midden]} {\strut\break\type{180}}
+% {\toonprint[180][180][plaats=midden]} {\type{180}\break\type{180}}
+% {\toonprint[gespiegeld][][plaats=midden]} {\type{gespiegeld}}
+% {\toonprint[][gespiegeld][plaats=midden]} {\strut\break\type{gespiegeld}}
+% {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}}
+% \stopcombinatie
+
+\gdef\doshowframe[#1][#2]%
+ {\ifsecondargument
+ \setupbackgrounds
+ [\v!page]
+ [\c!frame=\v!on,
+ \c!corner=\v!rectangular,
+ \c!frameoffset=\!!zeropoint,
+ \c!framedepth=\!!zeropoint,
+ \c!framecolor=layout:page]
+ \setupbackgrounds
+ [#1][#2]
+ [\c!background=,
+ \c!frame=\v!on,
+ \c!corner=\v!rectangular,
+ \c!frameoffset=\!!zeropoint,
+ \c!framedepth=\!!zeropoint,
+ \c!framecolor=]
+ \else\iffirstargument
+ \showframe
+ [\v!header,\v!text,\v!footer]
+ [#1]
+ \else
+ \showframe
+ [\v!header,\v!text,\v!footer]
+ [\v!leftedge,\v!leftmargin,
+ \v!text,
+ \v!rightmargin,\v!rightedge]
+ \fi\fi
+ \setupbackgrounds
+ [\c!state=\v!repeat]}
+
+\gdef\showframe{\dodoubleempty\doshowframe}
+
+\gdef\showsetupA#1#2%
+ {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr}
+
+\gdef\showsetupB#1#2#3%
+ {#1&&#2#3&\tttf\string#3\cr}
+
+% \startinterface english % english is fallback
+
+\gdef\showsetups
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{paperheight} \paperheight
+ \showsetupA{paperwidth} \paperwidth
+ \showsetupA{printpaperheight} \printpaperheight
+ \showsetupA{printpaperwidth} \printpaperwidth
+ \showsetupA{topspace} \topspace
+ \showsetupA{backspace} \backspace
+ \showsetupA{height} \makeupheight
+ \showsetupA{width} \makeupwidth
+ \showsetupA{top} \topheight
+ \showsetupA{topdistance} \topdistance
+ \showsetupA{header} \headerheight
+ \showsetupA{headerdistance} \headerdistance
+ \showsetupA{textheight} \textheight
+ \showsetupA{footerdistance} \footerdistance
+ \showsetupA{footer} \footerheight
+ \showsetupA{bottomdistance} \bottomdistance
+ \showsetupA{bottom} \bottomheight
+ \showsetupA{leftedge} \leftedgewidth
+ \showsetupA{leftedgedistance} \leftedgedistance
+ \showsetupA{leftmargin} \leftmarginwidth
+ \showsetupA{leftmargindistance} \leftmargindistance
+ \showsetupA{textwidth} \textwidth
+ \showsetupA{rightmargindistance}\rightmargindistance
+ \showsetupA{rightmargin} \rightmarginwidth
+ \showsetupA{rightedgedistance} \rightedgedistance
+ \showsetupA{rightedge} \rightedgewidth
+ \showsetupB{bodyfontsize} \the \globalbodyfontsize
+ \showsetupB{line} \relax \normallineheight
+ \showsetupB{height} \relax \strutheightfactor
+ \showsetupB{depth} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+% \stopinterface
+
+\startinterface dutch
+
+\gdef\showsetups
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{papierhoogte} \papierhoogte
+ \showsetupA{papierbreedte} \papierbreedte
+ \showsetupA{printpapierhoogte} \printpapierhoogte
+ \showsetupA{printpapierbreedte} \printpapierbreedte
+ \showsetupA{kopwit} \kopwit
+ \showsetupA{rugwit} \rugwit
+ \showsetupA{snijwit} \snijwit
+ \showsetupA{hoogte} \zethoogte
+ \showsetupA{breedte} \zetbreedte
+ \showsetupA{boven} \bovenhoogte
+ \showsetupA{bovenafstand} \bovenafstand
+ \showsetupA{hoofd} \hoofdhoogte
+ \showsetupA{hoofdafstand} \hoofdafstand
+ \showsetupA{teksthoogte} \teksthoogte
+ \showsetupA{voetafstand} \voetafstand
+ \showsetupA{voet} \voethoogte
+ \showsetupA{onderafstand} \onderafstand
+ \showsetupA{onder} \onderhoogte
+ \showsetupA{linkerrand} \linkerrandbreedte
+ \showsetupA{linkerrandafstand} \linkerrandafstand
+ \showsetupA{linkermarge} \linkermargebreedte
+ \showsetupA{linkermargeafstand} \linkermargeafstand
+ \showsetupA{tekstbreedte} \tekstbreedte
+ \showsetupA{rechtermargeafstand}\rechtermargeafstand
+ \showsetupA{rechtermarge} \rechtermargebreedte
+ \showsetupA{rechterrandafstand} \rechterrandafstand
+ \showsetupA{rechterrand} \rechterrandbreedte
+ \showsetupB{korps} \the \globalbodyfontsize
+ \showsetupB{regel} \relax \normallineheight
+ \showsetupB{hoogte} \relax \strutheightfactor
+ \showsetupB{diepte} \relax \strutdepthfactor
+ \showsetupB{boven} \relax \topskipfactor
+ \showsetupB{onder} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+% todo: \showsetupA{rugwit} \rugwit
+
+\startinterface german
+
+\gdef\showsetups%
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{papierhoehe} \papierhoehe
+ \showsetupA{papierbreite} \papierbreite
+ \showsetupA{printpapierhoehe} \printpapierhoehe
+ \showsetupA{printpapierbreite} \printpapierbreite
+ \showsetupA{kopfweite} \kopfweite
+ \showsetupA{rumpfweite} \rumpfweite
+ \showsetupA{hoehe} \satzhoehe
+ \showsetupA{breite} \satzbreite
+ \showsetupA{oben} \hoeheoben
+ \showsetupA{abstandoben} \abstandoben
+ \showsetupA{kopfzeile} \kopfzeilenhoehe
+ \showsetupA{kopfzeilenabstand} \kopfzeilenabstand
+ \showsetupA{texthoehe} \texthoehe
+ \showsetupA{fusszeileabstand} \fusszeileabstand
+ \showsetupA{fusszeilen} \fusszeilenhoehe
+ \showsetupA{abstandunten} \abstandunten
+ \showsetupA{hoeheunten} \hoeheunten
+ \showsetupA{linkerrand} \breitelinkerrand
+ \showsetupA{abstandlinkerrand} \abstandlinkerrand
+ \showsetupA{linkemarginal} \linkemarginalbreite
+ \showsetupA{linkemarginalafstand} \linkemarginalafstand
+ \showsetupA{textbreite} \textbreite
+ \showsetupA{rechtemarginalafstand}\rechtemarginalafstand
+ \showsetupA{rechtemarginal} \rechtemarginalbreite
+ \showsetupA{abstandrechterrand} \abstandrechterrand
+ \showsetupA{rechterrand} \breiterechterrand
+ \showsetupB{fliesstext} \the \globalbodyfontsize
+ \showsetupB{linie} \relax \normallineheight
+ \showsetupB{hoehe} \relax \strutheightfactor
+ \showsetupB{tiefe} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface czech
+
+\gdef\showsetups%
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{vyskapapiru} \vyskapapiru
+ \showsetupA{sirkapapiru} \sirkapapiru
+ \showsetupA{vyskatiskpapiru} \vyskatiskpapiru
+ \showsetupA{sirkatiskpapiru} \sirkatiskpapiru
+ \showsetupA{hornimezera} \hornimezera
+ \showsetupA{spodnimezera} \spodnimezera
+ \showsetupA{vyska} \vyskasazby
+ \showsetupA{breite} \sirkasazby
+ \showsetupA{vyskatextu} \vyskatextu
+ \showsetupA{sirkatextu} \sirkatextu
+ \showsetupA{horejsek} \vyskahorejsku
+ \showsetupA{vzdalenosthorejsku} \vzdalenosthorejsku
+ \showsetupA{zahlavi} \vyskazahlavi
+ \showsetupA{vzdalenostzahlavi} \vzdalenostzahlavi
+ \showsetupA{fusszeileabstand} \vzdalenostupati
+ \showsetupA{upati} \vyskaupati
+ \showsetupA{vzdalenostspodku} \vzdalenostspodku
+ \showsetupA{spodek} \vyakaspodku
+ \showsetupA{levyokraj} \sirkalevehookraje
+ \showsetupA{vzdalenostlevehookraje} \vzdalenostlevehookraje
+ \showsetupA{levamarginalie} \sirkalevemarginalie
+ \showsetupA{vzdalenostlevemarginalie} \vzdalenostlevemarginalie
+ \showsetupA{vzdalenostpravemarginalie}\vzdalenostpravemarginalie
+ \showsetupA{pravamarginalie} \sirkapravemarginalie
+ \showsetupA{vzdalenostpravehookraje} \vzdalenostpravehookraje
+ \showsetupA{pravyokraj} \sirkapravehookraje
+ \showsetupB{zakladnivelikost} \the \globalbodyfontsize
+ \showsetupB{linka} \relax \normallineheight
+ \showsetupB{vyska} \relax \strutheightfactor
+ \showsetupB{hloubka} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\startinterface romanian
+
+\gdef\showsetups%
+ {\noindent
+ \vbox
+ {\forgetall
+ \dontcomplain
+ \switchtobodyfont[\v!small]
+ \tabskip\zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \showsetupA{paperheight} \paperheight
+ \showsetupA{paperwidth} \paperwidth
+ \showsetupA{printpaperheight} \printpaperheight
+ \showsetupA{printpaperwidth} \printpaperwidth
+ \showsetupA{topspace} \topspace
+ \showsetupA{backspace} \backspace
+ \showsetupA{height} \makeupheight
+ \showsetupA{width} \makeupwidth
+ \showsetupA{top} \topheight
+ \showsetupA{topdistance} \topdistance
+ \showsetupA{header} \headerheight
+ \showsetupA{headerdistance} \headerdistance
+ \showsetupA{textheight} \textheight
+ \showsetupA{footerdistance} \footerdistance
+ \showsetupA{footer} \footerheight
+ \showsetupA{bottomdistance} \bottomdistance
+ \showsetupA{bottom} \bottomheight
+ \showsetupA{leftedge} \leftedgewidth
+ \showsetupA{leftedgedistance} \leftedgedistance
+ \showsetupA{leftmargin} \leftmarginwidth
+ \showsetupA{leftmargindistance} \leftmargindistance
+ \showsetupA{textwidth} \textwidth
+ \showsetupA{rightmargindistance}\rightmargindistance
+ \showsetupA{rightmargin} \rightmarginwidth
+ \showsetupA{rightedgedistance} \rightedgedistance
+ \showsetupA{rightedge} \rightedgewidth
+ \showsetupB{bodyfontsize} \the \globalbodyfontsize
+ \showsetupB{line} \relax \normallineheight
+ \showsetupB{height} \relax \strutheightfactor
+ \showsetupB{depth} \relax \strutdepthfactor
+ \showsetupB{topskip} \relax \topskipfactor
+ \showsetupB{maxdepth} \relax \maxdepthfactor}}}
+
+\stopinterface
+
+\gdef\showlayout % interfereert lelijk met een \typefile er na
+ {\bgroup
+ \page
+ \showframe
+ \setuplayout[\c!marking=\v!on]
+ \dorecurse{4}{\showsetups\page}
+ \egroup}
+
+\gdef\showmargins
+ {\starttabulate
+ \NC asynchrone \NC \doifoddpageelse {odd} {even} \NC \NR
+ \NC synchrone \NC \doifrightpageelse {right} {left} \NC \NR
+ \NC right margin \NC \the\rightmarginwidth \NC \NR
+ \NC left margin \NC \the\leftmarginwidth \NC \NR
+ \NC outer margin \NC \the\outermarginwidth \NC \NR
+ \NC inner margin \NC \the\innermarginwidth \NC \NR
+ \stoptabulate}
+
+\protect \endinput
diff --git a/tex/context/base/page-set.mkii b/tex/context/base/page-set.mkii
new file mode 100644
index 000000000..eb01799ae
--- /dev/null
+++ b/tex/context/base/page-set.mkii
@@ -0,0 +1,2766 @@
+%D \module
+%D [ file=page-set,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Column Sets,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% getnoflines vs getrawnoflines
+
+% some day: cleanup and go etex
+
+\writestatus{loading}{ConTeXt Page Macros / Column Sets}
+
+% todo : last longer than previous
+% todo : block span over last column if footnotes
+% todo : diagnosis balancing run
+% todo : separate footnote placement
+% todo : go on on same page with colset
+% todo : test page areas per page
+% todo : leftmargin/rightmargin (better than afstand(1))
+
+% use the OTRSET layer for more purposes, like the footnotes !
+
+\unprotect
+
+\newcount\tofcolumns % total
+\newcount\lofcolumns % left
+\newcount\rofcolumns % right
+
+\newcount\columnfirstcell \columnfirstcell=1
+\newcount\columnlastcell
+\newcount\columnfreecells
+\newcount\currenthcell
+\newcount\currentvcell
+\newcount\columnhcells
+\newcount\columnvcells
+
+\newif\ifenoughcolumncells
+\newif\ifsomefreecolumncells
+\newif\ifcolumnspread
+\newif\iftracecolumnset % \tracecolumnsettrue
+
+\def\columnmaxcells {75} % runtime
+\def\columnmaxfreecells {0} % runtime
+\def\columngaplimit {0} % {5}
+
+\def\@otr@{otr}
+
+\def\OTRSETmakeupwidth{\innermakeupwidth}
+
+\let\OTRSETflushsidefloats \forgetsidefloats % \relax
+\let\OTRSETsynchronizesidefloats\forgetsidefloats % \relax
+
+\def\OTRSETgridcell #1#2{\csname \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETgetgridcell#1#2{\box\csname \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETsetgridcell#1#2{\global\setbox\csname\@otr@:\number#1:\number#2\endcsname}
+
+\long\def\OTRSETdoifcellelse#1#2%
+ {\relax\ifvoid\csname\@otr@:\number#1:\number#2\endcsname
+ \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments
+ \fi}
+
+% The following two macros are used to compensate for a switch in body fonts
+% as in:
+%
+% \definecolumnset [two] [n=2,balancing=yes]
+% \definecolumnset [three] [n=3,balancing=yes]
+%
+% \setupcolumnsetlines[two][1][1][7]
+% \setupcolumnsetlines[two][1][2][10]
+%
+% \setupcolumnsetlines[three][1][1][40]
+% \setupcolumnsetlines[three][1][2][40]
+% \setupcolumnsetlines[three][1][3][40]
+%
+% \setupcolumnsetstart[three][1][1][15]
+% \setupcolumnsetstart[three][1][2][20]
+% \setupcolumnsetstart[three][1][3][20]
+%
+% \starttext
+% \startcolumnset [two] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \switchtobodyfont[small]
+% \startcolumnset [three] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+%D Marks in columnsets:
+%D
+%D \starttyping
+%D \definemarking[M]
+%D \setupheadertexts[\setups{show-M-marks}]
+%D \definecolumnset[test][n=3]
+%D
+%D \startsetups show-M-marks
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][1][last]\quad
+%D \getmarking[M][2][previous]/\getmarking[M][2][first]/\getmarking[M][2][last]\quad
+%D \getmarking[M][3][previous]/\getmarking[M][3][first]/\getmarking[M][3][last]\quad
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][last]\quad
+%D \getsavedmarking[M][previous]/\getsavedmarking[M][first]/\getsavedmarking[M][last]
+%D \stopsetups
+%D
+%D \startbuffer
+%D \section{Knuth} [K1]\marking[M]{k1} [K2]\marking[M]{k2} \input knuth
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \section{Douglas} [O]\marking[M]{o} \input douglas
+%D \stopbuffer
+%D
+%D \starttext
+%D \startcolumnset[test]
+%D \dorecurse{5}{\getbuffer}
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D % \column % sometimes needed
+%D \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+% not ok yet, for column sets we need a special case: within a column we
+% need to bubble-up the marks; the indirectness permits overloading here
+
+\let\saveOTRSETmark \refreshsavedmark
+\let\bubbleOTRSETmark\bubblesavedmark
+\let\resetOTRSETmark \resetsavedmark
+\let\presetOTRSETmark\presetsavedmark
+
+\def\doregisterOTRSETmarks#1{\saveOTRSETmark [#1][\number\mofcolumns]}
+\def\dobubbleOTRSETmarks #1{\bubbleOTRSETmark[#1][\number\mofcolumns]}
+\def\doresetOTRSETmarks #1{\resetOTRSETmark [#1][\recurselevel]}
+\def\dopresetOTRSETmarks #1{\presetOTRSETmark[#1][\recurselevel]}
+
+\def\registerOTRSETmarks
+ {\processcommacommand[\alldefinedmarks]\doregisterOTRSETmarks}
+\def\bubbleOTRSETmarks
+ {\processcommacommand[\alldefinedmarks]\dobubbleOTRSETmarks}
+\def\resetOTRSETmarks
+ {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\doresetOTRSETmarks}}
+\def\presetOTRSETmarks
+ {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\dopresetOTRSETmarks}}
+
+%D test case of Vit Zika (context list):
+%D
+%D \starttyping
+%D \setuplayout[height=middle,width=middle,grid=yes]
+%D
+%D \starttext
+%D \startcolumnset
+%D \dorecurse{10}
+%D {\input thuan \endgraf
+%D \bgroup
+%D \ss\restoreinterlinespace
+%D \dorecurse{3}{\input hawking \endgraf}
+%D \egroup
+%D \input bryson \endgraf}
+%D \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+\def\OTRSETsetcorrectnofcells#1%
+ {\bgroup
+ \!!counta#1\relax
+ \ifdim\globalbodyfontsize=\localbodyfontsize
+ \restoreinterlinespace
+ \else
+ \!!dimena-\!!counta\lineheight
+ \restoreglobalbodyfont % slow, we need a fast one
+ \advance\!!dimena\!!counta\lineheight
+ \getnoflines\!!dimena
+ \advance\!!counta\noflines
+ \ifnum\!!counta<#1\else
+ \!!counta#1\relax
+ \fi
+ \fi
+ \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+ \@EA\egroup\@EA\scratchcounter\the\!!counta\relax}
+
+\def\OTRSETsetcorrectcellht
+ {\bgroup
+ \!!dimena-\strutht\relax
+ \ifdim\globalbodyfontsize=\localbodyfontsize
+ \restoreinterlinespace
+ \else
+ \restoreglobalbodyfont
+ \fi
+ \advance\!!dimena\strutht
+ \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+ \@EA\egroup\@EA\scratchdimen\the\!!dimena\relax}
+
+\def\columnerasegridboxes % maybe dedicated loops
+ {\bgroup
+ \increment\columnmaxcells\relax
+ \ifodd\realpageno
+ \else % we are on the other page
+ \columnspreadfalse
+ \fi
+ \ifcolumnspread
+ \dorecurse\nofcolumns
+ {\let\!!stringa\recurselevel
+ \scratchcounter\recurselevel \advance\scratchcounter\lofcolumns
+ \edef\!!stringb{\the\scratchcounter}%
+ \dostepwiserecurse \zerocount \columnmaxcells \plusone
+ {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+ \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+ \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+ \box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \else
+ \emptybox
+ %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+ \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \fi
+ \else
+ \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+ \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+ \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \else
+ \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \fi
+ \fi}}%
+ \else
+ \dorecurse \tofcolumns
+ {\let\!!stringa\recurselevel
+ \dostepwiserecurse \zerocount \columnmaxcells \plusone
+ {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+ \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+ \else
+ \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+ \fi}}%
+ \fi
+ \dorecurse\tofcolumns
+ {\global\setbox\csname\@otr@:\recurselevel:\columnmaxcells\endcsname\copy\placeholderboxa}%
+ \global\columnfirstcell\zerocount
+ \global\columnlastcell\columnfirstcell
+ \global\columnfreecells\columnfirstcell
+ \egroup}
+
+\def\doOTRSETsetgridcells#1#2#3#4#5#6% placeholder col row wid hei {data}
+ {\!!countd#2\advance\!!countd#4\advance\!!countd\minusone
+ \!!counte#3\advance\!!counte#5\advance\!!counte\minusone
+ \dostepwiserecurse{#2}\!!countd\plusone
+ {\!!countf\recurselevel
+ \dostepwiserecurse{#3}\!!counte\plusone
+ {\OTRSETsetgridcell\!!countf\recurselevel#1}}%
+ \dostepwiserecurse{#3}\!!counte\plusone
+ {\global\wd\OTRSETgridcell{#2}\recurselevel\hsize}%
+ \OTRSETsetgridcell{#2}\!!counte#6}
+
+\def\OTRSETsetgridcells
+ {\doOTRSETsetgridcells{\copy\placeholderboxb}}
+
+\def\OTRSETerasegridcells#1#2#3#4%
+ {\doOTRSETsetgridcells{\emptybox}{#1}{#2}{#3}{#4}{\emptybox}}
+
+\def\setupcolumnsetlines{\doquintupleempty\dosetupcolumnsettrick[l]}
+\def\setupcolumnsetstart{\doquintupleempty\dosetupcolumnsettrick[s]}
+
+\def\dosetupcolumnsettrick[#1][#2][#3][#4][#5]% tag id page col value
+ {% not needed, is already relative
+ % \doifinstringelse{+}{#3}{\scratchcounter\realpageno}{\scratchcounter\zerocount}%
+ % \advance\scratchcounter#3\relax % \relax needed
+ % \setevalue{\??mc:#1:#2:\the\scratchcounter:\number#4}{\number#5}}
+ \iffifthargument
+ \setevalue{\??mc:#1:#2:\number#3:\number#4}{\number#5}%
+ \else
+ \setevalue{\??mc:#1:#2:\number#3:0}{\number#4}%
+ \fi}
+
+\def\currentcolumnmaxcellstag #1{\??mc:l:\OTRSETidentifier:\columnsetpage:\number#1}
+\def\currentcolumnstartcelltag#1{\??mc:s:\OTRSETidentifier:\columnsetpage:\number#1}
+
+\def\doresetcolumnsetlines#1%
+ {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+ \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+ \fi
+ \ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+ \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+ \fi}
+
+\def\currentcolumnsomecells#1#2%
+ {\ifcsname#1\mofcolumns\endcsname
+ \ifnum\csname#1\mofcolumns\endcsname=\zerocount
+ #2%
+ \else
+ \number\numexpr\ifnum\csname#1\mofcolumns\endcsname<\zerocount
+ \columnmaxcells+\fi\csname#1\mofcolumns\endcsname\relax
+ \fi
+ \else\ifcsname#10\endcsname
+ \ifnum\csname#10\endcsname=\zerocount
+ #2%
+ \else
+ \number\numexpr\ifnum\csname#10\endcsname<\zerocount
+ \columnmaxcells+\fi\csname#10\endcsname\relax
+ \fi
+ \else
+ #2%
+ \fi\fi}
+
+\def\currentcolumnmaxcells {\currentcolumnsomecells\currentcolumnmaxcellstag \columnmaxcells}
+\def\currentcolumnstartcell{\currentcolumnsomecells\currentcolumnstartcelltag\plusone}
+
+\def\OTRSETsetfreecells#1#2% col start
+ {\bgroup
+ \global\columnfirstcell\ifnum#2=0 1\else#2\fi\relax
+ \OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+ \edef\columnmaxcells{\the\scratchcounter}%
+ \ifnum\columnfirstcell>\columnmaxcells
+ \global\columnfreecells\zerocount
+ \global\columnfirstcell\plusone
+ \global\columnlastcell \zerocount
+ \global\somefreecolumncellsfalse
+ %\message{no cells a}%
+ \else
+ \doloop
+ {\ifnum\columnfirstcell>\columnmaxcells\relax
+ \exitloop
+ \else
+ \OTRSETdoifcellelse{#1}\columnfirstcell
+ {\global\advance\columnfirstcell\plusone}\exitloop
+ \fi}%
+ \global\columnlastcell\columnfirstcell
+ \doloop
+ {\ifnum\columnlastcell>\columnmaxcells\relax
+ \exitloop
+ \else
+ \OTRSETdoifcellelse{#1}\columnlastcell
+ {\global\advance\columnlastcell \minusone \exitloop}
+ {\global\advance\columnlastcell \plusone }%
+ \fi}%
+ \ifnum\columnfirstcell>\columnmaxcells
+ \global\columnfreecells\zerocount
+ \global\columnfirstcell\plusone
+ \global\columnlastcell \zerocount
+ \global\somefreecolumncellsfalse
+ %\message{no cells b}%
+ \else
+ \ifnum\columnlastcell>\columnmaxcells
+ \global\columnlastcell\columnmaxcells
+ \fi
+ \global\columnfreecells\columnlastcell
+ \global\advance\columnfreecells -\columnfirstcell
+ \global\advance\columnfreecells \plusone
+ \global\somefreecolumncellstrue
+ %\message{\number\columnfirstcell-\number\columnlastcell=\number\columnfreecells}%
+ \fi
+ \fi
+ \egroup}
+
+\def\OTRSETgetmaxfreecells#1#2% col start
+ {\let\columnmaxfreecells\!!zerocount
+ \let\columnfrmfreecells\!!zerocount
+ \pushmacro \columnmaxcells
+\OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+\edef\columnmaxcells{\the\scratchcounter}%
+ \scratchcounter\zerocount
+ \dostepwiserecurse{#2}\columnmaxcells\plusone
+ {\OTRSETdoifcellelse{#1}\recurselevel
+ {\ifnum\columnmaxfreecells<\scratchcounter
+ \edef\columnmaxfreecells{\the\scratchcounter}%
+ \let\columnfrmfreecells\recurselevel
+ \fi
+ \scratchcounter\zerocount}
+ {\advance\scratchcounter\plusone}}%
+ \popmacro\columnmaxcells}
+
+\long\def\OTRSETrecurseRL#1%
+ {\dostepwiserecurse\nofcolumns\plusone\minusone
+ {#1\hskip\OTRSETgetparameter\c!distance\recurselevel}}
+
+\def\OTRSETmakegridbox
+ {\ifcase\columndirection
+ \OTRSETdomakegridbox\plusone\nofcolumns\plusone
+ \else
+ \OTRSETdomakegridbox\nofcolumns\plusone\minusone
+ \fi}
+
+\def\OTRSETmakeupwidth{\makeupwidth} % temporary indirectness
+
+\def\OTRSETdomakegridbox#1#2#3%
+ {\hbox\bgroup
+ \dontcomplain
+ \forgetall % can go once in \flush
+ \!!heighta \textheight
+ % test first !
+ \hbox to \OTRSETmakeupwidth
+ {\dostepwiserecurse{#1}{#2}{#3}
+ {\mofcolumns\recurselevel
+ \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+ \setbox\scratchbox\hbox\localframed
+ [\??mc\OTRSETidentifier\number\mofcolumns]%
+ [\c!width=\localcolumnwidth,\c!height=\!!heighta,\c!lines=]%
+ {}%
+ \wd\scratchbox\localcolumnwidth
+ \ht\scratchbox\!!heighta
+ \ifcase\columndirection
+ \hskip\OTRSETgetparameter\c!distance\recurselevel
+ \box\scratchbox
+ \else
+ \box\scratchbox
+ \hskip\OTRSETgetparameter\c!distance\recurselevel
+ \fi}}%
+ \hskip-\OTRSETmakeupwidth
+ % main text
+ \hbox to \OTRSETmakeupwidth
+ {\dostepwiserecurse{#1}{#2}{#3}
+ {\mofcolumns\recurselevel
+ \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+ \offinterlineskip
+ \setbox\scratchbox\vbox to \!!heighta
+ {\topskipcorrection % not needed
+ \ifcase\OTRSETbalancemethod
+ % no
+ \or
+ % yes
+ \doifelselayerdata{OTRTEXT}\vfill\relax % temp hack
+ \or
+ % top
+ \or
+ % bottom
+ \vfill
+ \fi
+ \dorecurse\columnmaxcells
+ {\setbox\scratchbox\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}%
+% {\setbox\scratchbox\hbox
+% {\localstarttextcolor
+% \OTRSETgetgridcell\mofcolumns\recurselevel
+% \localstoptextcolor}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \ifcase\columndirection
+ \box\scratchbox
+ \else
+ \hbox to \localcolumnwidth
+ {\hskip\localcolumnwidth\llap{\box\scratchbox}}%
+ \fi
+ \par}%
+ \ifcase\OTRSETbalancemethod
+ % no
+ \else
+ % yes, top, bottom
+ \ifdim\globalbodyfontsize=\localbodyfontsize
+ \removedepth
+ \restoreglobalbodyfont
+ \vskip\strutdepth
+ \fi
+ \kern\zeropoint
+ \vss
+ \fi}%
+ \wd\scratchbox\localcolumnwidth % \textwidth
+ \ifcase\columndirection
+ \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox
+ \else
+ \box\scratchbox\hskip\OTRSETgetparameter\c!distance\recurselevel
+ \fi}}%
+ \egroup}
+
+\let\OTRSETbalht\zeropoint
+
+\def\OTRSETreducegridbox % for the moment no difference between methods
+ {\globallet\OTRSETbalht\zeropoint
+ \ifcase\OTRSETbalancemethod
+ % no balancing
+ \else
+ \bgroup
+ \!!counta\columnmaxcells
+ \donetrue
+ \doloop
+ {\dorecurse\nofcolumns{\OTRSETdoifcellelse\recurselevel\!!counta\donefalse\donothing}%
+ \ifdone
+ \ifnum\!!counta>\plusone\advance\!!counta\minusone\else\exitloop\fi
+ \else
+ \exitloop
+ \fi}%
+ \ifnum\!!counta>\plusone
+ \!!heighta\lineheight
+ \multiply\!!heighta \!!counta
+ \advance\!!heighta \topskip
+ \advance\!!heighta -\lineheight
+ \else
+ \!!heighta\zeropoint
+ \fi
+ \xdef\OTRSETbalht{\the\!!heighta}%
+ \egroup
+ \fi}
+
+\def\OTRSETflushfinalfootnotes
+ {\ifcase\lastcolumnlastcell \else
+ \setbox\scratchbox\hbox
+ {\placebottomnotes}%
+ \ifdim\ht\scratchbox>\zeropoint
+ \setbox\scratchbox\hbox
+ {\hbox to \zeropoint{\OTRSETgetgridcell\nofcolumns\lastcolumnlastcell}%
+ \box\scratchbox}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \OTRSETsetgridcell\nofcolumns\lastcolumnlastcell\box\scratchbox
+ \fi
+ \global\lastcolumnlastcell\zerocount
+ \fi}
+
+\def\OTRSETdoflush
+ {\ifcollectingcontent
+ \registerOTRSETmarks
+ \global\mofcolumns\plusone
+ \else
+ \OTRSETdofinalflush
+ \OTRSETdofinaloutput
+ \ifnum\columnsetpage>0
+ \dorecurse\nofcolumns{\doresetcolumnsetlines\recurselevel}%
+ \fi
+ \doglobal\increment\columnsetpage
+ \OTRSETinitializecolumns
+ %\OTRSETdoflushfloats
+ \OTRSETstartnextpage
+\presetOTRSETmarks
+ \initializecolumntextareas
+ \fi}
+
+\newbox\OTRfinalpagebox
+
+\def\OTRSETdofinalflush % see \OTRSETdoflush
+ {\OTRSETflushfinalfootnotes
+ \placecolumntextareas
+ \OTRSETcentergridcells
+ \bgroup % we want to keep the reduction local
+ \OTRSETreducegridbox
+ \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+ \egroup % otherwise we get the wrong number of free cells
+ %\gdef\localcolumnmaxcells{0}% here ?
+ \global\mofcolumns\nofcolumns} % otherwise problems in finaloutput
+
+\def\OTRSETdofinaloutput
+ {\ifdim\ht\OTRfinalpagebox=\textheight
+ \bgroup % \let\OTRSETsetvsize\relax % prevents useless search for gap
+ \ifcase\OTRSETbalancemethod
+ \finaloutput\box\OTRfinalpagebox
+ \else\ifdim\OTRSETbalht>\zeropoint
+ % catch a bordercase
+ \scratchdimen\OTRSETbalht
+ \advance\scratchdimen\lineheight\relax
+ \ifdim\scratchdimen>\textheight
+ % full page
+ \finaloutput\box\OTRfinalpagebox
+ \else
+ % same page
+ \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
+ {\box\OTRfinalpagebox\vss}%
+ \setlayer[OTRTEXT]{\box\OTRfinalpagebox}%
+ \snaptogrid\vbox{\vskip\OTRSETbalht}% hack
+ \fi
+ \else
+ \finaloutput\box\OTRfinalpagebox
+ \fi \fi
+ \globallet\OTRSETbalht\zeropoint
+ \egroup
+ \fi}
+
+\definesystemvariable {mc}
+\definesystemvariable {mt}
+\definesystemconstant {colset}
+
+\definetwopasslist\s!colset
+
+\newdimen \OTRSETtextswidth
+\newdimen \OTRSETtextsheight
+\let \OTRSETidentifier=\empty
+
+\newtoks \OTRSEToutput
+
+\def\OTRSETgetparameter#1#2{\csname\??mc\OTRSETidentifier\number#2#1\endcsname}
+\def\OTRSETsetparameter#1#2{\setvalue{\??mc\OTRSETidentifier\number#2#1}}
+
+\def\OTRSETskipstart
+ {\scratchcounter\executeifdefined{\??mc\OTRSETidentifier\c!start}\zerocount
+ \relax % needed !
+ \ifcase\scratchcounter\else
+ \advance\scratchcounter\plusone
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxe}
+ \plusone\plusone\nofcolumns\scratchcounter
+ \null
+ \fi}
+
+\def\OTRSETsetvsize % snap per sectie (gap here?)
+ {\ifcollectingcontent \else % can be assigndimen
+\OTRSETskipstart % not that well tested
+ \OTRSETcheckinsert % added
+ \OTRSETsetfreecells\mofcolumns\columnfirstcell
+ \ifsomefreecolumncells
+ \global\vsize\columnfreecells\lineheight
+ \ifinotr % else problems with floats, see extreme
+ \global\pagegoal\vsize % niet nodig, tenzij binnen otr
+ \fi
+ \synchronizeoutput % fails on example
+ % \allowbreak % hm
+ \fi
+ \synchronizenotes
+ \fi}
+
+\def\OTRSETsethsize % of course this does not migrate outside the otr
+ {\localcolumnwidth\OTRSETlocalwidth\mofcolumns
+ \textwidth\localcolumnwidth
+ \hsize\localcolumnwidth}
+
+\def\OTRSETsynchronizehsize
+ {\ifcase0\getvalue{\??mc\??mc\c!width}\else % some width set
+ \bgroup
+ \scratchdimen\OTRSETlocalwidth\mofcolumns
+ \ifdim\scratchdimen=\textwidth
+ \egroup
+ \else
+ % only if change in width and \column/\break
+ \egroup \OTRSETsethsize
+ \fi
+ \fi}
+
+\def\OTRSETcheckfreelines
+ {\OTRSETsetvsize}
+
+\def\doOTRSETcolumnseparator
+ {\hbox to \zeropoint{\hss\red\vl\hss}}
+
+\let\OTRSETcolumnseparator\relax
+
+\def\showbreaks
+ {\let\OTRSETcolumnseparator\doOTRSETcolumnseparator}
+
+% \installcolumnbreakhandler {SET} \v!ja
+% {% hmmm:
+% \ifhmode
+% \bgroup
+% \removeunwantedspaces
+% \parfillskip\zeropoint
+% \OTRSETcolumnseparator
+% \par
+% \egroup
+% \fi
+% % brrr:
+% \ejectinsert
+% \ejectpage
+% \OTRSETsynchronizehsize} % no \OTRSETsethsize, can be mid smaller (like tabulate)
+%
+% \installcolumnbreakhandler {SET} \v!forceer
+% {\OTRSETgotocolumn[\v!forceer]}
+% \installcolumnbreakhandler {SET} \v!eerste
+% {\OTRSETgotocolumn[\v!eerste]}
+% \installcolumnbreakhandler {SET} \v!laatste
+% {\OTRSETgotocolumn[\v!laatste]}
+%
+% \installcolumnbreakhandler {SET} \v!pagina
+% {\simplepagebreak % \flushnotes \executepagebreakhandler\v!ja
+% \ifnum\mofcolumns>\plusone
+% \OTRSETgotocolumn[\v!laatste,\v!forceer]%
+% \fi}
+
+\def\OTRSETcolumnhbreak
+ {\ifhmode
+ \bgroup
+ \removeunwantedspaces
+ \parfillskip\zeropoint
+ \OTRSETcolumnseparator
+ \par
+ \egroup
+ \fi}
+
+\installcolumnbreakhandler {SET} \v!local
+ {\OTRSETcolumnhbreak
+ \ejectinsert
+ \ejectpage % brrr
+ % no \OTRSETsethsize, can be mid smaller (like tabulate)
+ % also, this one should be executed at the outer level
+ % (setting hsize inside otr does not work)
+ \OTRSETsynchronizehsize}
+
+% We need to make sure that we really leave the column; mid
+% column we may end up in an empty gap, and we don't want to
+% stay there (basically such a gap is a small empty page
+% then).
+
+\installcolumnbreakhandler {SET} \v!yes
+ {\OTRSETcolumnhbreak
+ \edef\savedmofcolumns{\the\mofcolumns}%
+ \edef\savedrealpageno{\the\realpageno}%
+ \ejectinsert
+ \ejectpage % brrr
+ \doloop
+ {\ifnum\savedmofcolumns=\mofcolumns
+ \ifnum\savedrealpageno=\realpageno
+ \OTRSETdummycolumn
+ \else
+ \exitloop
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \OTRSETsynchronizehsize}
+
+\installcolumnbreakhandler {SET} \s!unknown
+ {\expanded{\OTRSETgotocolumn[\@@columnspecification]}}
+
+\installcolumnbreakhandler {SET} \v!page
+ {\vfill\eject % \doejectpage\eject
+ \OTRSETgotonextpage}
+
+\newtoks\OTRSETeverystartofcolumn
+
+\newbox\OTRSETsavedfootnotes
+
+% \installoutput\OTRSETflushtextsofar % spacing goes wrong
+
+%\def\OTRSETflushtextsofar
+% {\ifvoid\normalpagebox \else
+% \setbox\scratchbox\vbox{\unvbox\normalpagebox}%
+% \OTRSETsavenotes
+% \OTRSEThandleflushedtext0
+% \fi}
+
+% The complication is in the fact that when the HERE float
+% is placed, the otr is not invoked when there is not yet
+% enough content; this can lead to a change in order (turning
+% on the tracer with option 0 is very instructive, watch the
+% small numbers in the margin)
+%
+% 0 = no flushing, so no interference but user should handle
+% border cases of placement
+% 1 = the normal otr, rather untested
+% 2 = a solution that works ok, is experimental and above
+% all messy
+
+\chardef\OTRSETflushtextmode=0
+
+\def\OTRSETflushtextsofar
+ {\ifcase\OTRSETflushtextmode
+ % don't mess around
+ \or
+ % the normal one
+ \ifvoid\normalpagebox\else
+ \OTRSETnaturalflush
+ \OTRSETcheckfreelines
+ \fi
+ \or
+ % way to complicated, but kind of ok
+ \doOTRSETflushtextsofar
+ \fi}
+
+\newskip\lastskipinotr
+
+\installoutput\doOTRSETflushtextsofar % experimental
+ {\ifvoid\normalpagebox\else
+ \scratchdimen\dp\normalpagebox
+ \setbox\scratchbox\vbox
+ {\forgetall
+ \unvbox\normalpagebox
+ \global\lastskipinotr\lastskip\relax
+ \ifdim\lastskipinotr>\zeropoint\relax
+ \removelastskip
+ \else
+ \kern-\scratchdimen % handle depth
+ \fi}%
+ \ifdim\lastskipinotr>\zeropoint
+ \scratchskip\ht\scratchbox
+ \setbox\scratchbox\hbox
+ {\lower\strutdepth\box\scratchbox}%
+ \dp\scratchbox\scratchdimen
+ \ht\scratchbox\scratchskip
+ \fi
+ \OTRSETsavenotes
+ \OTRSEThandleflushedtext\zerocount
+ \ifdim\lastskipinotr>\zeropoint
+ %\vskip \lastskipinotr % hm, gets lost anyway
+ \else
+ % we should not discard skips after here; tricky
+ \fi
+ \OTRSETsetvsize
+ \fi}
+
+\def\OTRSETplacebottomnotes
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns
+ \ifintermediatefootnotes \placebottomnotes \fi
+ \fi
+ \else
+ \placebottomnotes
+ \fi}
+
+\def\OTRSETflushsavednotes
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns
+ \flushsavednotes
+ \fi
+ \else
+ \flushsavednotes
+ \fi}
+
+\def\OTRSETsavenotes
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns \else
+ \savenotes
+ \fi
+ \fi}
+
+\appendtoks \OTRSETflushsavednotes \to \OTRSETeverystartofcolumn
+
+\def\OTRSETnaturalflush
+ {\bgroup
+ \forgetall % new, needed !
+ \setbox0\vbox to \columnfreecells\lineheight
+ {\vskip-\topskip
+ \vskip\lineheight
+ \prevdepth\strutdp
+ \unvbox\normalpagebox
+ \vfill}%
+ \setbox2\hbox
+ {\OTRSETplacebottomnotes}%
+ \setbox\scratchbox\hbox
+ {\wd0\zeropoint\box0\box2}%
+ \dp\scratchbox\strutdp
+ \OTRSEThandleflushedtext\plusone
+ \egroup}
+
+\newcount\lastcolumnlastcell
+
+\def\OTRSEThandleflushedtext#1%
+ {\getnoflines{\ht\scratchbox}%
+ %\wd\scratchbox\textwidth % geen \hsize kan < zijn in bv split tabulate
+ \wd\scratchbox\OTRSETlocalwidth\mofcolumns
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxf}
+ \mofcolumns\columnfirstcell\plusone\noflines
+ {\registeredtextarea1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell
+ \global\columnlastcell\columnfirstcell
+ \global\advance\columnlastcell \noflines
+ \global\lastcolumnlastcell\columnlastcell
+ \global\advance\lastcolumnlastcell \minusone
+ % find next (acceptable) gap, todo: deadcycle
+ \ifcase#1\else
+ \OTRSETfillgapsbetweencells\mofcolumns\columnlastcell
+ \fi
+ \OTRSETfindnextgap
+ % \message{\the\mofcolumns,\the\columnfirstcell,\the\columnfreecells}%
+ % \wait
+ % we cannot adapt the hsize since it may have changed (like
+ % inside a tabulate) so we only change it when there is a
+ % reason to do so
+ \OTRSETsynchronizehsize
+ \OTRSETsetvsize}
+
+\def\OTRSETfindnextgap
+ {\OTRSETsetfreecells\mofcolumns\columnlastcell
+ \ifsomefreecolumncells
+ % okay
+ \bubbleOTRSETmarks % not robust because we reenter
+ \else
+ \registerOTRSETmarks % not robust because we reenter
+ \global\advance\mofcolumns \plusone
+ \ifnum\mofcolumns>\nofcolumns
+ \OTRSETdoflush
+ \global\columnlastcell\plusone
+ \global\columnfirstcell\zerocount
+ \OTRSETdoflushfloats
+ \else
+ \the\OTRSETeverystartofcolumn
+ \global\columnlastcell\plusone
+ \global\columnfirstcell\zerocount
+ \fi
+ \fi}
+
+\let\OTRSETcheckfreelines\donothing
+
+\def\OTRSETfillgapsbetweencells#1#2% col
+ {\ifnum\columngaplimit>\zerocount
+ \donefalse
+ \dostepwiserecurse{#2}\columnmaxcells\plusone
+ {\OTRSETdoifcellelse{#1}\recurselevel
+ {\ifdone
+ \!!countb\recurselevel \advance\!!countb -\!!counta\relax
+ \ifnum\!!countb>\plusone
+ \advance\!!countb \minusone
+ \ifnum\!!countb<\columngaplimit\relax
+ \!!countb\recurselevel \advance\!!countb \minusone
+ \dostepwiserecurse\!!counta\!!countb\plusone
+ {\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
+ %\message{[gap]}%
+ \fi
+ \fi
+ \fi
+ \donefalse}
+ {\ifdone \else
+ \donetrue
+ \!!counta\recurselevel
+ \fi}}%
+ \fi}
+
+\appendtoks
+ \OTRSETfillgapsbetweencells\mofcolumns\plusone
+\to \OTRSETeverystartofcolumn
+
+%\def\OTRSETfreezeminimumgap#1%
+% {\OTRSETgetmaxfreecells{#1}{1}%
+% \ifnum\columnmaxfreecells>0
+% \!!countb=\columnfrmfreecells
+% \!!counta=\!!counta \advance\!!counta -\columnmaxfreecells
+% \dorecurse{\columnmaxcells}
+% {\ifnum\recurselevel<\!!counta\relax
+% \donetrue
+% \else\ifnum\recurselevel>\!!countb
+% \donetrue
+% \else
+% \donefalse
+% \fi\fi
+% \ifdone
+% \OTRSETdoifcellelse{#1}{\recurselevel}
+% {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
+% \fi}%
+% \fi}
+%
+%\def\OTRSETfillgaps#1#2#3% col from to
+% {\dostepwiserecurse{#2}{#3}{1}
+% {\OTRSETdoifcellelse{#1}{\recurselevel}
+% {}{\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}}}
+%
+%\def\OTRSETfillbotgaps#1#2% col first
+% {\OTRSETfillgaps{#1}{#2}{\columnmaxcells}}
+%
+%\def\OTRSETfilltopgaps#1#2% col last
+% {\OTRSETfillgaps{#1}{1}{#2}}
+
+\newif\ifspancolumnslots \spancolumnslotstrue
+\newif\ifcheckcolumnspan \checkcolumnspantrue
+
+\def\OTRSETcheckwidthgap#1#2% box size
+ {\ifcheckcolumnspan
+ \bgroup
+ \scratchdimen#2%
+ \advance\scratchdimen-\wd#1\relax
+ \ifdim-10\scaledpoint>\scratchdimen
+ \egroup
+ \else\ifdim10\scaledpoint<\scratchdimen
+ \egroup
+ \else
+ \egroup
+ \wd#1=#2%
+ \fi\fi
+ \fi}
+
+\def\OTRSETcheckcolumnslot#1%
+ {\enoughcolumncellstrue
+ \ifspancolumnslots\else
+ \OTRSETcheckwidthgap#1\hsize
+ \ifdim\wd#1>\hsize
+ \enoughcolumncellsfalse
+ \fi
+ \fi
+ \ifenoughcolumncells
+ \getnoflines\pagetotal
+ \scratchcounter\noflines
+ \getnoflines{\ht#1}%
+ \columnvcells\noflines
+ \columnhcells\plusone
+ \advance\scratchcounter \columnvcells \relax
+ \ifnum\scratchcounter>\columnfreecells
+ \enoughcolumncellsfalse
+ \fi
+ \fi}
+
+\def\OTRSETstoreincolumnslotPAGE#1%
+ {\ifenoughcolumncells
+ % to do
+ \OTRSETsavebox{#1}%
+ \else
+ \OTRSETsavebox{#1}%
+ \fi}
+
+\def\OTRSETstoreincolumnslotTOPS#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETcheckcolumnslot{#1}%
+ \ifenoughcolumncells
+ \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+ \fi
+ \ifenoughcolumncells
+ \OTRSETsetgridcells\mofcolumns\columnfirstcell\columnhcells\columnvcells
+ {\hbox{\copy#1}}%
+ \OTRSETsetvsize
+ \else
+ \OTRSETsavebox{#1}%
+ \fi}
+
+\def\OTRSETstoreincolumnslotBOTS#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \edef\savedcolumnlastcell{\the\columnlastcell}%
+ \OTRSETcheckcolumnslot{#1}%
+ \ifenoughcolumncells
+ \advance\columnlastcell -\columnvcells \advance\columnlastcell \plusone
+% \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+ \OTRSETcheckcolumnspace\mofcolumns\columnlastcell{#1}%
+ \fi
+ \ifenoughcolumncells
+ \OTRSETsetgridcells\mofcolumns\columnlastcell\columnhcells\columnvcells{\copy#1}%
+ \OTRSETfillgapsbetweencells\mofcolumns\savedcolumnlastcell % -)
+ \OTRSETsetvsize
+ \else
+ \columnlastcell\savedcolumnlastcell
+ \OTRSETsavebox{#1}%
+ \fi}
+
+\newdimen\totalcolumnspace
+
+\def\columnspacetopoffset{0}
+\def\columnspacebotoffset{0}
+
+\def\OTRSETcheckcolumnspace#1#2#3% col row box
+ {\columnhcells\plusone
+ \totalcolumnspace\zeropoint
+ \scratchcounter#1%
+ \enoughcolumncellstrue
+ \doloop
+ {\advance\totalcolumnspace \OTRSETlocalwidth\scratchcounter\relax % needed
+\OTRSETcheckwidthgap#3\totalcolumnspace
+ \ifnum\wd#3>\totalcolumnspace\relax
+ \ifnum\scratchcounter=\nofcolumns
+ \enoughcolumncellsfalse
+ \exitloop
+ \else
+ \advance\columnhcells \plusone
+ \advance\scratchcounter \plusone
+ \advance\totalcolumnspace \OTRSETgetparameter\c!distance\scratchcounter
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \ifenoughcolumncells
+ \getnoflines{\ht#3}%
+ \columnvcells\noflines
+ \OTRSETcheckcolumncells{#1}{#2}\columnhcells\columnvcells
+ \fi}
+
+\def\OTRSETcheckcolumncells#1#2#3#4% col row wid hei
+ {\!!countd#1\advance\!!countd#3\advance\!!countd\minusone
+ \!!counte#2\advance\!!counte#4\advance\!!counte\minusone
+ \ifnum\!!counte>\columnmaxcells\relax
+ \enoughcolumncellsfalse
+ \else
+ \enoughcolumncellstrue
+%\let\columnspacetopoffset\zerocount
+%\scratchcounter#2\advance\scratchcounter\minusone
+%\ifnum\scratchcounter>0
+% \dostepwiserecurse{#1}\!!countd\plusone
+% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacetopoffset\plusone
+% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacetopoffset\plusone
+% \fi\fi}%
+% \advance\!!counte \columnspacetopoffset \relax
+% \advance\columnvcells \columnspacetopoffset \relax
+%\fi
+%\let\columnspacebotoffset\zerocount
+%\scratchcounter\!!counte
+%\advance\scratchcounter \columnvcells \relax
+%\ifnum\scratchcounter>\columnmaxcells\else
+% \dostepwiserecurse{#1}\!!countd\plusone
+% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacebotoffset\plusone
+% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacebotoffset\plusone
+% \fi\fi}%
+% \advance\!!counte \columnspacebotoffset \relax
+% \advance\columnvcells \columnspacebotoffset \relax
+%\fi
+ \dostepwiserecurse{#1}\!!countd\plusone % cols
+ {\ifenoughcolumncells
+ \!!countf\recurselevel\relax
+ \dostepwiserecurse{#2}\!!counte\plusone % rows
+ {\ifenoughcolumncells
+ \OTRSETdoifcellelse\!!countf\recurselevel
+ {\enoughcolumncellsfalse}{}%
+ \fi}%
+ \fi}%
+ \fi}
+
+\def\OTRSETsetpreferedcolumnslot#1#2%
+ {\doifsomething{#1}{\edef\preferedcolumn{#1}}%
+ \doifsomething{#2}{\edef\preferedrow {#2}}}
+
+\OTRSETsetpreferedcolumnslot{\nofcolumns}{1} % default ?
+
+\let\pofcolumns\mofcolumns
+\let\qofcolumns\mofcolumns
+
+\newif\ifquitincurrentcolumn
+
+\def\OTRSETstoreincolumnslotLRTB#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \mofcolumns\nofcolumns+\currenthcell
+ \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotLRBT#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \mofcolumns\nofcolumns+\currenthcell
+ \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLTB#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \nofcolumns\qofcolumns-\currenthcell
+ \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLBT#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \nofcolumns\qofcolumns-\currenthcell
+ \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBLR#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \plusone\columnmaxcells+\currentvcell
+ \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBRL#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \plusone\columnmaxcells+\currentvcell
+ \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTLR#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \columnmaxcells\plusone-\currentvcell
+ \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTRL#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \columnmaxcells\plusone-\currentvcell
+ \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXTB#1% fixed column
+ {\OTRSETcheckprefered
+ \OTRSETdoifcellelse\pofcolumns\plusone
+ {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot1}{#1}% % 1/2 dependent of place, todo
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \pofcolumns \pofcolumns +\currenthcell
+ \preferedrow\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXBT#1% fixed column
+ {\OTRSETcheckprefered
+ \OTRSETdoifcellelse\pofcolumns\columnmaxcells
+ {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot3}{#1}% % 3/2 dependent of place, todo
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \pofcolumns \pofcolumns +\currenthcell
+ \columnmaxcells\preferedrow-\currentvcell{#1}}
+
+% \def\OTRSETstoreincolumnslotHERE#1% fixed column
+% {\OTRSETprepareforcolumnslot2{#1}%
+% \OTRSETflushtextsofar
+% \getnoflines\pagetotal \advance\noflines\columnfirstcell
+% \OTRSETstoreincolumnslotindeed
+% \mofcolumns\mofcolumns+\currenthcell
+% \noflines\columnmaxcells+\currentvcell{#1}%
+% \OTRSETsetvsize}
+
+\chardef\OTRSETforcefixedfloats=0
+
+\def\OTRSETstoreincolumnslotHERE#1% fixed column
+ {\ifcase\OTRSETforcefixedfloats
+ \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+ \else
+ \OTRSETstoreincolumnslotFIXD{#1}%
+ \fi}
+
+% this one looses too wide graphics
+%
+% \def\OTRSETstoreincolumnslotFIXD#1% fixed column
+% {\OTRSETprepareforcolumnslot2{#1}%
+% % no flush text sofar here, beware: no width test
+% \snaptogrid\vbox{\box#1}}
+%
+% still imperfect
+
+\def\OTRSETstoreincolumnslotFIXD#1% fixed column
+ {\OTRSETflushtextsofar
+ \ifdim\wd#1>\textwidth
+ \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+ \else
+ % crappy test / needed for o-pbu-f / will be replaced
+ \getnoflines{\ht#1}%
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen\lineheight
+ \advance\scratchdimen\pagetotal\relax
+ \ifdim\scratchdimen<\pagegoal
+ %OTRSETprepareforcolumnslot3{#1}%
+ %ruledvskip\columnslotspacing\lineheight
+ \blank[\columnslotspacing*\v!line]%
+ \snaptogrid\hbox to \hsize{\hss\box#1\hss}% strange, why the centering
+ \blank[\columnslotspacing*\v!line]%
+ \else
+ \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+ \fi
+ \fi}
+
+\def\OTRSETstoreincolumnslotSOMEWHERE#1#2%
+ {\OTRSETprepareforcolumnslot{#1}{#2}%
+ \OTRSETflushtextsofar
+ \getnoflines\pagetotal \advance\noflines\columnfirstcell
+ \OTRSETstoreincolumnslotindeed
+ \mofcolumns\mofcolumns+\currenthcell
+ \noflines\columnmaxcells+\currentvcell{#2}%
+ \OTRSETsetvsize}
+
+\def\OTRSETcheckprefered
+ {\ifnum\preferedcolumn<\mofcolumns
+ \let\pofcolumns\mofcolumns
+ \else
+ \let\pofcolumns\preferedcolumn
+ \fi
+ \ifquitincurrentcolumn
+ \ifnum\mofcolumns=\nofcolumns
+ \def\qofcolumns{\mofcolumns}%
+ \else
+ \scratchcounter\mofcolumns
+ \advance\scratchcounter \plusone
+ \edef\qofcolumns{\the\scratchcounter}%
+ \fi
+ \else
+ \let\qofcolumns\mofcolumns
+ \fi}
+
+\def\OTRSETstoreincolumnslotindeed#1#2#3#4#5#6#7#8#9%
+ {\OTRSETcheckprefered
+ \enoughcolumncellsfalse
+ \donefalse
+ \dostepwiserecurse{#1}{#2}{#31}
+ {\ifdone
+ \exitloop
+ \else
+ #4=\recurselevel
+ \dostepwiserecurse{#5}{#6}{#71}
+ {\ifdone
+ \exitloop
+ \else
+ #8=\recurselevel
+ \OTRSETcheckcolumnspace\currenthcell\currentvcell{#9}%
+ \ifenoughcolumncells \donetrue \fi
+ \fi}%
+ \fi}%
+ \ifdone
+ \enoughcolumncellstrue
+ \else
+ \enoughcolumncellsfalse
+ \fi
+ \ifenoughcolumncells
+% \ifnum\columnspacetopoffset>0\message{[+++]}\fi
+% \ifnum\columnspacebotoffset>0\message{[---]}\fi
+% \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+% {\vbox
+% {\ifcase\columnspacetopoffset\else\ruledvskip\columnspacetopoffset\lineheight\fi
+% \copy#9
+% \ifcase\columnspacebotoffset\else\ruledvskip\columnspacebotoffset\lineheight\fi}}%
+ \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+ {\copy#9}%
+ \ifnum\currenthcell=\mofcolumns\relax
+ \ifdim\ht\OTRSETsavedfootnotes>\zeropoint
+ \OTRSETsetfreecells\mofcolumns\columnfirstcell
+ \ifsomefreecolumncells
+ \getnoflines{\ht\OTRSETsavedfootnotes}\relax
+ \ifnum\columnfreecells<\noflines
+ \global\somefreecolumncellsfalse
+ \else
+ %\message{[flt]}% float
+ \fi
+ \fi
+ \ifsomefreecolumncells
+ % ok, enough room for notes
+ %\message{[flt]}% float
+ \else % ?
+ \OTRSETsavebox{#9}%
+ \OTRSETerasegridcells\currenthcell\currentvcell\columnhcells\columnvcells
+ %\message{[clr]}% save box
+ \fi
+ \else
+ %\message{[flt]}% float
+ \fi
+ \else
+ %\message{[flt]}% float
+ \fi
+ \OTRSETsetvsize
+ %\message{[fnt]}% float
+ \else
+ %\message{[rej]}% save box
+ \OTRSETsavebox{#9}%
+ \fi}
+
+\chardef\columnslotspacing \plusone
+
+\def\OTRSETstoreincolumnslot#1% #2 % {method} {box} % alleen last
+ {% no messing around here
+ % \dp#2=\zeropoint
+ % \ifcase\columnslotspacing\else
+ % \setbox#2=\vbox spread \columnslotspacing\lineheight
+ % {\vss\box#2\vss}%
+ % \fi
+ % and don't change this any more
+% \doifdefinedelse{\strippedcsname\OTRSETstoreincolumnslot#1}
+% {\getvalue{\strippedcsname\OTRSETstoreincolumnslot#1}{#2}}
+% {\OTRSETstoreincolumnslotUNKNOWN{#2}}}
+ \executeifdefined{\strippedcsname\OTRSETstoreincolumnslot#1}
+ \OTRSETstoreincolumnslotUNKNOWN} % {#2}}
+
+\def\OTRSETstoreincolumnslotUNKNOWN#1%
+ {\OTRSETprepareforcolumnslot2{#1}\copy#1} % {} ?
+
+% \def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
+% {\dp#2\zeropoint
+% \ifcase\columnslotspacing\else
+% \scratchdimen\columnslotspacing\lineheight
+% \ifnum#1=2 \scratchdimen2\scratchdimen \fi
+% \setbox#2\vbox spread \scratchdimen
+% {\ifnum#1>1\vss\fi\box#2\relax\ifnum#1<3\vss\fi}%
+% \fi}
+
+\def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
+ {\dp#2\zeropoint
+ \ifcase\columnslotspacing\else
+ \scratchdimen\columnslotspacing\lineheight
+ \ifnum#1=2 \scratchdimen2\scratchdimen \fi
+ \begingroup
+ \advance\scratchdimen\ht#2\relax
+ \ifdim\scratchdimen<\columnmaxcells\lineheight
+ \endgroup \setbox#2\vbox spread \scratchdimen \bgroup
+ \else
+ \endgroup \setbox#2\vbox to \columnmaxcells\lineheight \bgroup
+ \vskip\strutdepth
+ \fi
+ \ifnum#1>1\vss\fi
+ \box#2\relax
+ \ifnum#1<3\vss\fi
+ \egroup
+ \fi}
+
+\def\OTRSETdocheckiffloatfits % eigenlijk moet else float anders
+ {\global\ifnofloatpermitted\roomforfloatfalse\else\roomforfloattrue\fi}
+
+\def\OTRSETunpreparebox#1%
+ {\ifhbox#1% spans and so
+ \global\setbox\floatbox\vbox{\box#1}%
+ \else
+ \setbox\scratchbox\vbox
+ {\unvbox#1\unskip\unskip\unskip
+ \global\setbox\floatbox\lastbox}%
+ \fi}
+
+\def\OTRSETsavebox#1% clean up the skips
+ {\OTRSETunpreparebox{#1}%
+ \dosavefloat}
+
+\def\OTRSETresavebox#1% clean up the skips
+ {\OTRSETunpreparebox{#1}%
+ \doresavefloat}
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+ {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETdoflushfloats
+ {\bgroup
+ \def\OTRSETsavebox##1{\!!doneafalse}%
+ \doloop
+ {\ifsomefloatwaiting
+\OTRSETskipstart
+ \dogetfloat
+ \ifdim\wd\floatbox>\zeropoint
+ \!!doneatrue
+ \dp\floatbox\zeropoint
+ \OTRSETstoreincolumnslot{TBLR}\floatbox
+ \if!!donea
+ %\message{[flu]}%
+ \else
+ \OTRSETresavebox\floatbox
+ \exitloop
+ \fi
+ \else
+ %\message{[err]}% happens but why?
+ \fi
+ \else
+ \exitloop
+ \fi}
+ \egroup}
+
+\newif\ifcentergridcells \centergridcellstrue
+
+\newif\ifcentergridcellonly \centergridcellonlyfalse
+\newif\ifautocentergridcellonly \autocentergridcellonlytrue
+
+\def\OTRSETcentergridcells
+ {\ifcentergridcells
+ \dorecurse\nofcolumns
+ {\currenthcell\recurselevel
+ \ifautocentergridcellonly
+ % we prevent centering when the next column is empty
+ % to be checked ! ! ! !
+ \advance\currenthcell \plusone
+ \centergridcellonlytrue
+ \ifnum\currenthcell>\nofcolumns
+ % ok already
+ \else
+ % only span if there is a next column with content
+ \dorecurse\columnmaxcells
+ {\ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+ \centergridcellonlyfalse
+ \else\ifdim\dp\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+ \centergridcellonlyfalse
+ \fi\fi}%
+ \fi
+ \fi
+ \currenthcell\recurselevel
+ \dorecurse\columnmaxcells
+ {\currentvcell\recurselevel\relax
+ \ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+ \ifdim\dp\OTRSETgridcell\currenthcell\currentvcell=\zeropoint
+ \bgroup
+ \setbox\scratchbox\OTRSETgetgridcell\currenthcell\currentvcell
+ \getnoflines{\ht\scratchbox}%
+ \!!counta\currentvcell
+ \advance\!!counta -\noflines
+ \advance\!!counta \plusone
+ % first col always ok
+ \!!countb\currenthcell
+ \!!countc\currenthcell
+ \advance\!!countc \plusone
+ \!!donebtrue
+ \ifcentergridcellonly
+ \!!countc\maxdimen
+ \fi
+ \dostepwiserecurse\!!countc\nofcolumns\plusone
+ {\if!!doneb
+ \let\xrecurselevel\recurselevel
+ \dostepwiserecurse\!!counta\currentvcell\plusone
+ {\ifdim\ht\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+ \!!donebfalse
+ \else\ifdim\wd\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+ \!!donebfalse
+ \fi\fi}%
+ \if!!doneb
+ \!!countb\xrecurselevel
+ \fi
+ \fi}%
+ \totalcolumnspace\OTRSETlocalwidth\currenthcell
+ \dostepwiserecurse\!!countc\!!countb\plusone
+ {\advance\totalcolumnspace \OTRSETlocalwidth\recurselevel
+ \advance\totalcolumnspace \OTRSETgetparameter\c!distance\recurselevel}%
+ \ifdim\totalcolumnspace>\wd\scratchbox
+ \setbox\scratchbox\hbox to \totalcolumnspace{\hss\box\scratchbox\hss}%
+ \fi
+ \OTRSETsetgridcell\currenthcell\currentvcell\box\scratchbox
+ \egroup
+ \fi
+ \fi}}%
+ \fi}
+
+\def\OTRSETinitializecolumns% once per page
+ {\columnspreadtrue % todo
+ \ifcolumnspread
+ \global\rofcolumns\getvalue{\??mc\OTRSETidentifier\c!nright}%
+ \global\lofcolumns\getvalue{\??mc\OTRSETidentifier\c!nleft}%
+ \global\tofcolumns\rofcolumns \relax
+ \ifodd\realpageno\relax
+ \global\nofcolumns\rofcolumns
+ \else
+ \global\advance\tofcolumns\lofcolumns
+ \global\nofcolumns\lofcolumns
+ \fi
+ \else
+ \global\nofcolumns\getvalue{\??mc\OTRSETidentifier\c!n}%
+ \global\rofcolumns\nofcolumns
+ \global\lofcolumns\nofcolumns
+ \global\tofcolumns\nofcolumns
+ \fi
+ \OTRSETassignwidths
+ \global\mofcolumns\plusone
+ \columnerasegridboxes}
+
+% vanaf hier:
+
+\def\definecolumnset
+ {\dodoubleargument\dodefinecolumnset}
+
+\def\dodefinecolumnset[#1][#2]%
+ {\getparameters[\??mc#1]
+ [\c!direction=\v!right,
+ \c!balance=\v!no,
+ \c!distance=1.5\bodyfontsize, % controleren
+ \c!n=2,
+ \c!nleft=\getvalue{\??mc#1\c!n},
+ \c!nright=\getvalue{\??mc#1\c!n},
+ \c!width=\v!fit,
+ \c!lines=0,
+ \c!start=0,
+ #2]%
+ \dorecurse{\getvalue{\??mc#1\c!nleft}} % todo
+ {\dododefinecolumnset[#1][\recurselevel]}%
+ \dorecurse{\getvalue{\??mc#1\c!nright}} % todo
+ {\dododefinecolumnset[#1][\recurselevel]}%
+ % redo framed settings
+ \setupcolumnset[#1][1][\c!distance=\!!zeropoint]}
+
+\def\dododefinecolumnset[#1][#2]%
+ {\presetlocalframed
+ [\??mc#1#2]%
+ \setupcolumnset
+ [#1][#2]
+ [\c!offset=\v!overlay,
+ \c!frame=\v!off,
+ \c!align=,
+ \c!lines=0,% really needed since c!regels is now part of framed
+ \c!width=\getvalue{\??mc#1\c!width},
+ \c!distance=\getvalue{\??mc#1\c!distance}]}
+
+\def\setupcolumnset
+ {\dotripleargument\dosetupcolumnset}
+
+\def\dosetupcolumnset[#1][#2][#3]%
+ {\ifthirdargument
+ \def\docommand##1%
+ {\doifelse{##1}\v!each
+ {\dorecurse{\getvalue{\??mc#1\c!n}}{\docommand\recurselevel}}
+ {\getparameters[\??mc#1##1][#3]}}%
+ \processcommalist[#2]\docommand
+ \else
+ \getparameters[\??mc#1][#2]%
+ \fi}
+
+\definecolumnset[\s!default][\c!n=2] % fallback
+
+\def\OTRSETgotonextpage
+ {\vfill\eject
+ \relax\ifnum\mofcolumns>\plusone
+ \OTRSETgotocolumn[\v!last]%
+ \ifnum\mofcolumns>\plusone
+ \OTRSETgotocolumn[\v!force]%
+ \fi
+ \fi}
+
+\let\OTRSETgotonextpageX\OTRSETgotonextpage % will become obsolete
+
+\def\OTRSETgotocolumn
+ {\dosingleempty\doOTRSETgotocolumn}
+
+\def\doOTRSETgotoCOLROW#1% <number>|<number>*<number>
+ {\bgroup % really needed
+ \splitstring#1\at*\to\column\and\row
+ \bgroup
+ \ifx\column\empty\else\expanded{\doOTRSETgotoCOLUMN{\column}}\fi
+ \egroup
+ \bgroup
+ \ifx\row \empty\else\expanded{\doOTRSETgotoROW {\row }}\fi
+ \egroup
+ \egroup}
+
+\def\doOTRSETgotoCOLUMN#1%
+ {\ifnum\mofcolumns=#1\else
+ \vfill\eject % \doejectpage\eject
+ \doloop
+ {\ifnum\mofcolumns=#1\relax
+ \exitloop \else \OTRSETdummycolumn
+ \fi}%
+ \fi}
+
+\def\doOTRSETgotoROW#1%
+ {\ifnum#1>1
+ \scratchcounter\zerocount
+ \currenthcell\mofcolumns
+ \currentvcell#1\advance\currentvcell \minusone
+ \dorecurse\currentvcell
+ {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+ {\advance\scratchcounter\plusone}}
+ \getnoflines\pagetotal
+ \advance\scratchcounter-\noflines
+ \ifnum\scratchcounter>\zerocount
+ \dorecurse\scratchcounter{\line{\strut}}%
+ \fi
+ \fi
+ \OTRSETsetvsize}
+
+\def\doOTRSETgotocolumn[#1]% yes|force|first|last|<number>|<number>*<number>
+ {\processallactionsinset
+ [#1]
+ [ \v!yes=>\OTRSETdummycolumn,
+ \v!no=>,% not supported
+ \v!force=>\OTRSETdummycolumn,
+ \v!first=>\expanded{\doOTRSETgotoCOLUMN{1}},
+ \v!last=>\expanded{\doOTRSETgotoCOLUMN{\the\nofcolumns}},
+ \s!default=>\OTRSETdummycolumn,
+ \s!unknown=>\expanded{\doOTRSETgotoCOLROW{\commalistelement}}]}
+
+% to be documented and tested, not yet that robust
+
+% \def\OTRSETgotocell#1#2%
+% {\endgraf
+% \gdef\gotocellcounter{0}%
+% \doloop
+% {\ifnum\mofcolumns<#1\relax
+% \doglobal\increment\gotocellcounter\relax
+% \ifnum\gotocellcounter>#1\relax
+% \line{\strut}\crlf
+% \line{\strut}\crlf
+% \column
+% \writestatus{columnset}{quitting goto cell}%
+% \exitloop
+% \else
+% \column
+% \fi
+% \else
+% \exitloop
+% \fi}%
+% \ifnum\mofcolumns=#1\relax
+% \ifnum#2>1
+% \scratchcounter\zerocount
+% \currenthcell\mofcolumns
+% \currentvcell#2\advance\currentvcell \minusone
+% \dorecurse\currentvcell
+% {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+% {\advance\scratchcounter\plusone}}
+% \getnoflines\pagetotal
+% \advance\scratchcounter-\noflines
+% \ifnum\scratchcounter>\zerocount
+% \dorecurse\scratchcounter{\line{\strut}}%
+% \fi
+% \fi
+% \fi
+% \OTRSETsetvsize}
+
+\def\OTRSETgotocell#1#2% obsolete: now \column[#1*#2]
+ {\endgraf
+ \doOTRSETgotoCOLUMN{#1}%
+ \doOTRSETgotoROW {#2}}
+
+\def\OTRSETdummycolumn
+ {\verticalstrut
+ \vskip-\struttotal
+ \vfill
+ \eject}
+
+\newcounter\columnsetlevel
+\let\currentcolumnset\empty
+\chardef\OTRSETfinish\zerocount
+
+\def\startcolumnset
+ {\dodoubleempty\dostartcolumnset}
+
+\def\dostartcolumnset[#1][#2]%
+ {\increment\columnsetlevel\relax
+ \globallet\localcolumnmaxcells\!!zerocount
+ \global\chardef\OTRSETfinish\zerocount
+ \resetOTRSETmarks
+ \ifnum\columnsetlevel=\plusone
+ \bgroup
+ \saveinterlinespace
+ \globallet\columnsetpage\!!plusone
+ \def\currentcolumnset{#2}%
+ \insidecolumnstrue % will be different flag in addition
+ \activateotr{SET}{ONE}% andere naam, activate or so
+ \doifelsenothing{#1}
+ {\globallet\OTRSETlist\s!default}
+ {\xdef\OTRSETlist{#1}}%
+ \OTRSETstartnextpage
+ \OTRSETassignwidths
+ \OTRSETsethsize
+ \else
+ \bgroup
+ \fi}
+
+% \setuplayout[grid=yes] \definecolumnset[example] \showgrid
+
+% \starttext
+% \startcolumnset[example]
+% \input knuth \endgraf \input knuth
+% \placetable{table}{\framed[width=\makeupwidth,height=4cm]{Hello}}
+% \input knuth \endgraf \input knuth
+% \stopcolumnset
+% \input knuth \endgraf \input knuth
+% \stoptext
+
+
+\def\OTRSETflushleftovers % new per 13/4/2006
+ {\OTRSETdoifcellelse{1}{1}
+ {\bgroup
+ \OTRSETcentergridcells
+ \chardef\OTRSETbalancemethod\plusone
+ \OTRSETreducegridbox
+ \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+ \global\ht\OTRfinalpagebox\textheight % signals output that there is content
+ \OTRSETdofinaloutput
+ \globallet\OTRSETbalht\zeropoint
+ \egroup}
+ {}}
+
+\def\stopcolumnset
+ {\relax
+ \ifnum\columnsetlevel=\plusone
+ \endgraf % needed, else wrong vsize in one par case
+ \global\chardef\OTRSETfinish\plusone
+ % no, extra page \pagebreak % (test on pascal toc)
+ \dostopcolumnset
+ \egroup
+ \global\notelimittrue % brrr, untested and fuzzy
+ \setvsize
+ \sethsize
+ \ifvoid\OTRfinalpagebox\else
+ % probably balanced
+ \ifdim\ht\OTRfinalpagebox<\textheight
+ \snaptogrid[\v!page]\hbox{\box\OTRfinalpagebox}%
+ \else
+ \box\OTRfinalpagebox
+ \fi
+ \fi
+ \global\chardef\OTRSETfinish\zerocount
+ \ifsomefloatwaiting \setvsize \pagebreak \setvsize \fi
+ \OTRSETflushleftovers
+ \else
+ \egroup
+ \fi
+ \decrement\columnsetlevel\relax}
+
+\chardef\OTRSETbalancemethod\zerocount
+
+\def\dostopcolumnset
+ {%\OTRSETdofinalflushfloats % yes/no
+ \ifcase\OTRSETbalancemethod
+ \OTRSETnobalance
+ \else
+ \OTRSETdobalance
+ \fi}
+
+\def\OTRSETdobalance
+ {\OTRSETnobalance}
+
+\def\localcolumnmaxcells{0}
+
+% don't loose empty 1page/1column with area (example **)
+%
+% \definecolumntextarea[title][x=1,y=4,nx=2,ny=7,state=start]
+% \setupcolumntextareatext[title][\vtop to 5cm{a\\b\\b\\d}]
+%
+% \starttext
+% \startcolumnset \dorecurse{1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+% better:
+
+\def\definecolumnsetarea {\definecolumntextarea}
+\def\setupcolumnsetarea {\setupcolumntextarea}
+\def\setupcolumnsetareatext{\setupcolumntextareatext}
+
+\def\OTRSETnobalance
+ {\iflastcolumnfootnotes % testen ! optie
+ % inhibit flush of floats !
+ % todo: nothing if no footnotes, else empty page
+ \dostepwiserecurse\mofcolumns\nofcolumns\plusone
+ {\vskip-\struttotal\verticalstrut\vfill\eject}%
+ \else
+ \ifnum\mofcolumns>\plusone
+ \donetrue
+ \else\ifdim\pagetotal>\zeropoint % too dangerous, we loose data
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \ifnum\mofcolumns=\nofcolumns
+ \OTRSETflushfinalfootnotes
+ \else
+ % probably todo
+ \fi
+ \vfill
+ \eject
+\registerOTRSETmarks
+ % brr, may result in empty page after nicely fit text
+ % or if left, then lost of first column only text
+ \ifnum\mofcolumns>\plusone
+ \OTRSETdofinalflush
+ \OTRSETdofinaloutput
+ \fi
+ \fi
+ \fi}
+
+\def\OTRSETstartnextpage
+ {\doifsomething\OTRSETlist
+ {\getfromcommacommand[\OTRSETlist][1]%
+ \global\let\OTRSETidentifier\commalistelement
+ \doifundefined{\??mc\OTRSETidentifier\c!n}
+ {\globallet\OTRSETidentifier\s!default}%
+ \let\newcommalistelement\empty
+ \doglobal\replaceincommalist\OTRSETlist1%
+ \OTRSETrestart}}
+
+\def\OTRSETrestart % weed
+ {\OTRSETinitializefeatures
+ \OTRSETflushpreposttext
+ \OTRSETinitializecolumns
+ \OTRSETcheckinsert
+ \OTRSETcheckgrid
+ \OTRSETsetvsize
+ \OTRSETsethsize % or local ?
+ \OTRSETsetplaceholders
+ \OTRSEThandlepreposttext
+ \initializecolumntextareas % name !
+ \OTRSETcheckstartcells
+ \OTRSETsetvsize}
+
+% \def\OTRSETcheckstartcells
+% {\dorecurse\nofcolumns
+% {\bgroup
+% \mofcolumns\recurselevel
+% \scratchcounter\currentcolumnstartcell % uses \mofcolumns, returns 1 or more
+% \advance\scratchcounter \minusone
+% \dorecurse\scratchcounter
+% {\OTRSETdoifcellelse\mofcolumns\recurselevel
+% \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
+% \egroup}}
+
+\def\OTRSETcheckstartcells
+ {\dorecurse\nofcolumns
+ {\bgroup
+ \mofcolumns\recurselevel
+\OTRSETsetcorrectnofcells\currentcolumnstartcell
+\advance\scratchcounter \minusone
+ \dorecurse\scratchcounter
+ {\OTRSETdoifcellelse\mofcolumns\recurselevel
+ \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
+ \egroup}}
+
+% \OTRSEToutput
+% {\dontcomplain % new, get rid of overfull message (to be sorted out)
+% \OTRSETnaturalflush
+% %\OTRSETstartnextpage
+% \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
+% \OTRSETcheckfreelines
+% \OTRSETchecksidefloat}
+
+\OTRSEToutput
+ {\dontcomplain % new, get rid of overfull message (to be sorted out)
+ \doloop
+ {\OTRSETnaturalflush
+ %\OTRSETstartnextpage % no
+ \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
+ \OTRSETcheckfreelines
+ \ifsomefreecolumncells
+ \exitloop
+ \else
+ % flush page and get rid of more floats if present
+ \fi}%
+ \OTRSETchecksidefloat}
+
+\def\OTRSETinitializefeatures
+ {% number of lines
+ % new: raw
+ \getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}%
+ % direction
+ \doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right
+ {\chardef\columndirection\zerocount}
+ {\chardef\columndirection\plusone}%
+ % balancing
+ \chardef\OTRSETbalancemethod\zerocount
+ \processaction
+ [\getvalue{\??mc\OTRSETidentifier\c!balance}]
+ [ \v!yes=>\chardef\OTRSETbalancemethod\plusone,
+ \v!top=>\chardef\OTRSETbalancemethod\plustwo,
+ \v!bottom=>\chardef\OTRSETbalancemethod\plusthree]}
+
+% keep 'm for a while
+%
+% \installoutput\OTRSETflushpreposttext
+% {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
+% \ifcarryoverfootnotes \else
+% \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+% \fi}
+%
+% to be tested on 'boekinhoud' in 'pascal/demo-bbi'
+%
+% junk ! ! ! ! !
+%
+%\installoutput\OTRSETflushpreposttext
+% {\global\setbox\precolumnbox\vbox
+% {\unvbox\normalpagebox
+% \strut\vskip-2\lineheight\strut}% we want a proper depth
+% \ifcarryoverfootnotes \else
+% \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+% \fi}
+%
+% \starttext
+% \definecolumnset[two][n=2]
+% \startcolumnset[two] \dorecurse{4}{\input tufte } \stopcolumnset
+% \input tufte
+% \startcolumnset[two] \input tufte \stopcolumnset
+% \stoptext
+%
+% \installoutput\OTRSETflushpreposttext
+% {\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}%
+% \global\dp\precolumnbox\strutdepth
+% \ifcarryoverfootnotes \else
+% \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+% \fi}
+
+% test:
+%
+% \setupcolumnset [test-1] [balance=yes]
+% \setupcolumnset [test-2] [balance=yes]
+% \setupcolumnsetlines[test-1][1][1] [8]
+% \setupcolumnsetlines[test-1][1][2][10]
+% \startcolumnset [test-1] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \startcolumnset [test-2] \dorecurse {2}{\input ward \par} \stopcolumnset
+
+\ifx\lastskipinotr\undefined \newskip\lastskipinotr \fi
+
+\installoutput\OTRSETflushpreposttext
+ {\global\setbox\precolumnbox\vbox
+ {\unvbox\normalpagebox
+ \global\lastskipinotr\lastskip}%
+ \ifdim\lastskipinotr>\zeropoint
+ \global\setbox\precolumnbox\hbox
+ {\lower\strutdepth\box\precolumnbox}%
+ \fi
+ \global\dp\precolumnbox\strutdepth
+ \ifcarryoverfootnotes \else
+ \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+ \fi}
+
+\let\precolumnlines \!!zerocount
+\let\postcolumnlines\!!zerocount
+
+\def\OTRSEThandlepreposttext
+ {\ifdim\ht\precolumnbox>\zeropoint % new
+ \getnoflines{\ht\precolumnbox}%
+ \edef\precolumnlines{\the\noflines}%
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxe}
+ \plusone\plusone\nofcolumns\noflines
+ % normal version (single column set)
+ % {\box\precolumnbox}%
+ % compensated for bodyfont change
+ {\hbox
+ {\OTRSETsetcorrectcellht
+ \raise\scratchdimen\box\precolumnbox}}%
+ \else
+ \let\precolumnlines\!!zerocount
+ \fi
+ \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
+ \getnoflines{\ht\postcolumnbox}%
+ \edef\postcolumnlines{\the\noflines}%
+ \advance\columnfreecells -\noflines
+ \advance\columnfreecells \plusone
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxe}
+ \plusone\columnfreecells\nofcolumns\noflines
+ {\box\postcolumnbox}%
+ \else
+ \let\postcolumnlines\!!zerocount
+ \fi}
+
+\def\OTRSETchecksidefloat
+ {} % {\sidefloatoutput}
+
+\def\OTRSETfinalsidefloatoutput
+ {}
+
+\def\OTRSETcheckgrid
+ {\topskip1\topskip
+ \ifforcecolumngrid
+ \widowpenalty\zerocount
+ \clubpenalty\zerocount
+ \brokenpenalty\zerocount
+ \fi}
+
+\def\OTRSETcheckinsert
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns
+ \OTRSETforceinserts
+ \else
+ \OTRSETinhibitinserts
+ \fi
+ \else
+ \OTRSETforceinserts
+ \fi}
+
+\def\OTRSETforceinserts
+ {\enablenotes}
+
+\def\OTRSETinhibitinserts
+ {\disablenotes}
+
+% interface to footnotes
+
+\def\OTRSETassignwidths
+ {%\scratchdimen\makeupwidth
+ \freezetextwidth \scratchdimen\textwidth
+ %
+ \scratchcounter\zerocount
+ \dorecurse\nofcolumns
+ {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+ {\advance\scratchcounter \plusone }
+ {\advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+ \advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!distance}}%
+ \ifcase\scratchcounter\else
+ \divide\scratchdimen \scratchcounter
+ \fi
+ \setgvalue{\??mc\??mc\c!width}{0}%
+ \dorecurse\nofcolumns
+ {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+ {\dimen0=\scratchdimen}
+ {\setgvalue{\??mc\??mc\c!width}{1}%
+ \dimen0=\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+ \setxvalue{\??mc\recurselevel\??mc\c!width}{\the\dimen0}}}
+
+\def\OTRSETlocalwidth#1%
+ {\getvalue{\??mc\number#1\??mc\c!width}}
+
+\newbox\placeholderboxa
+\newbox\placeholderboxb
+\newbox\placeholderboxc
+\newbox\placeholderboxd
+\newbox\placeholderboxe
+\newbox\placeholderboxf
+
+\def\columnplaceholder#1#2%
+ {\hbox
+ {\localcolortrue
+ \setbox\scratchbox\hbox to \hsize
+ {\iftracecolumnset \incolortrue \localcolortrue
+ \hskip-.5ex%
+ \startcolor[columnset:#2]\vrule\!!width1ex\!!height.5ex\!!depth.5ex\stopcolor
+ \fi
+ \hss}%
+ \ifcase#1\relax
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\zeropoint
+ \else
+ \wd\scratchbox\hsize
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \fi
+ \box\scratchbox}}
+
+\definepalet
+ [columnset]
+ [a=cyan,b=green,c=blue,d=red,e=magenta,f=darkgray]
+
+\def\OTRSETsetplaceholders
+ {\global\setbox\placeholderboxa\columnplaceholder0a%
+ \global\setbox\placeholderboxb\columnplaceholder0b%
+ \global\setbox\placeholderboxc\columnplaceholder0c%
+ \global\setbox\placeholderboxd\columnplaceholder0d%
+ \global\setbox\placeholderboxe\columnplaceholder0e%
+ \global\setbox\placeholderboxf\columnplaceholder1f}
+
+\def\doOTRSETshowstatus
+ {\llap{\incolortrue \localcolortrue \tt\tfxx
+ \startcolor[blue](\the\vsize->\number\columnfirstcell\#\number\columnfreecells)\stopcolor
+ \hskip\leftskip}}
+
+\def\OTRSETshowstatus
+ {\iftracecolumnset \doOTRSETshowstatus \fi}
+
+% \appendtoks \OTRSETshowstatus \to \everypar
+
+% page contents
+
+\def\OTRSETdopagecontents#1#2% takes two args: \box<n> \unvbox<n>
+ {\vbox to \textheight{\forgetall#1#2\pushproperties}}
+
+\def\OTRSETsomepagefloat {\def\floatmethod{PAGE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeherefloat {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeelsefloat {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomefixdfloat {\def\floatmethod{FIXD}\OTRSETsomeslotfloat} % check
+\def\OTRSETsometopfloat {\def\floatmethod{TOPS}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomebottomfloat{\def\floatmethod{BOTS}\OTRSETsomeslotfloat} % check
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+ {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETsomeslotfloat[#1]%
+ {\setbox\floatbox\vbox{\flushfloatbox}%
+ \dp\floatbox\strutdp
+ \@EA\uppercasestring\floatmethod\to\floatmethod
+ \OTRSETstoreincolumnslot\floatmethod\floatbox
+ \doinsertfloatinfo}
+
+% kind of new, looks much like OTRONE, but not entirely
+
+\def\OTRSETdosettopinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \let\totaltopinserted\!!zeropoint
+ \OTRSETdodosettopinserts
+ \ifnum\@@bknbottom=\zerocount
+ \ifnum\@@bknlines>\zerocount
+ \ifdim\totaltopinserted>\zeropoint\relax
+ \dimen0\lineheight
+ \dimen0=\@@bknlines\dimen0
+ \advance\dimen0 \totaltopinserted\relax
+ \ifdim\dimen0>\textheight % \vsize %%%%%%%%% \textheight
+ \showmessage\m!floatblocks8{\@@bknlines}%
+ \vfilll\eject
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \egroup}
+
+\def\OTRSETdodosettopinserts
+ {\ifnum\noffloatinserts<\noftopfloats
+ \dogetfloat
+ \ifdim\topinserted=\zeropoint\relax
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \setbox\scratchbox\vbox % kan beter !
+ {\forgetall
+ \iftopofinsert
+ \ifdim\OTRSETtopoffset=\zeropoint
+ \moveongrid[\v!top]
+ \fi
+ \else
+ \betweenfloatblanko % inserts can't look back
+ \fi
+ \flushfloatbox
+ \blank[\@@bkspaceafter]}%
+ \global\advance\topinserted \ht\scratchbox\relax
+ \ifdim\topinserted>\vsize % was \textheight\relax
+ \OTRSETresavebox\floatbox
+ \noffloatinserts\noftopfloats\relax
+ \global\advance\topinserted -\ht\scratchbox
+ \let\OTRSETdodosettopinserts\relax % to be tested
+ \else
+ \xdef\totaltopinserted{\the\topinserted}%
+ \insert\topins{\forgetall\box\scratchbox}% interlineskip ?
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\noftopfloats\relax
+ \fi
+ \dofloatflushedinfo
+ \fi
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks6{\the\noftopfloats}%
+ \fi
+ \let\OTRSETdodosettopinserts\relax
+ \fi
+ \OTRSETdodosettopinserts}
+
+\def\OTRSETdosetbotinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \OTRSETdodosetbotinserts
+ \fi
+ \egroup}
+
+\def\OTRSETdodosetbotinserts
+ {\ifnum\noffloatinserts<\nofbotfloats\relax
+ \dogetfloat
+ \global\advance\botinserted \ht\floatbox\relax
+ \global\advance\botinserted \dp\floatbox\relax
+ \global\advance\botinserted \floattopskip\relax
+ \ifdim\botinserted<\pagegoal\relax
+ \insert\botins
+ {\forgetall
+ \blank[\@@bkspacebefore]%
+ \flushfloatbox}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\nofbotfloats
+ \fi
+ \dofloatflushedinfo
+ \else
+ \OTRSETresavebox\floatbox
+ \noffloatinserts\nofbotfloats\relax
+ \fi
+ \global\nofloatpermittedtrue % vgl topfloats s!
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks7{\the\nofbotfloats}%
+ \fi
+ \let\OTRSETdodosetbotinserts\relax
+ \fi
+ \OTRSETdodosetbotinserts}
+
+\let\OTRSETdosetbothinserts\relax
+
+\def\OTRSETdotopinsertions
+ {\ifvoid\topins\else
+ \ifvoid\columntopbox\mofcolumns
+ \columnsettopbox\mofcolumns\box\topins
+ \else
+ \columnsettopbox\mofcolumns\vbox % temp, must be better
+ {\forgetall
+ \offinterlineskip
+ \box\columntopbox\mofcolumns
+ \box\topins}
+ \fi
+ \fi
+ \global\topinserted\zeropoint\relax} % goes away
+
+\def\OTRSETdobotinsertions
+ {\ifvoid\botins \else
+ \columnsetbotbox\mofcolumns\box\botins
+% \else
+% \columnsetbotbox\mofcolumns\vbox % temp, must be better
+% {\forgetall
+% \offinterlineskip
+% \box\botins
+% \box\columnbotbox\mofcolumns}
+ \fi
+ \global\botinserted\zeropoint\relax} % goes away
+
+% set ipv text
+
+% left right 1 2 3 +1 +2 +3
+
+\let\columnleftareas \empty
+\let\columnrightareas\empty
+
+% links rechts => odd, even, n, named
+
+\def\definecolumntextarea
+ {\dotripleempty\dodefinecolumntextarea}
+
+\def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig !
+ {\ifthirdargument
+ \doifinsetelse{#2}{\v!both,\v!fixed}
+ {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]%
+ \definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+ {\doifelse{#2}\v!next
+ {\doifoddpageelse
+ {\definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+ {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}}
+ {\presetlocalframed
+ [\??mt#1#2]%
+ \processaction[#2] % \doglobal voorkomt stack build up
+ [ \v!left=>\doglobal\addtocommalist{#1}\columnleftareas,
+ \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]%
+ \getparameters[\??mt#1#2]
+ [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight,
+ \c!leftoffset=\zeropoint,\c!rightoffset=\zeropoint,
+ \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off,
+ \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}%
+ \else
+ \definecolumntextarea[#1][\v!next][#2]%
+ \fi}
+
+\def\setupcolumntextarea
+ {\dotripleempty\dosetupcolumntextarea}
+
+\def\dosetupcolumntextarea[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelse{#2}\v!both
+ {\setupcolumntextarea[#1][\v!left ][#3]%
+ \setupcolumntextarea[#1][\v!right][#3]}
+ {\doifelse{#2}\v!next
+ {\doifoddpageelse
+ {\setupcolumntextarea[#1][\v!right][#3]}
+ {\setupcolumntextarea[#1][\v!left][#3]}}
+ {\getparameters[\??mt#1#2][#3]}}%
+ \else
+ \setupcolumntextarea[#1][\v!next][#2]%
+ \fi}
+
+\def\docheckcolumnsetareapage#1#2%
+ {\ifnum\getvalue{\??mt#1\c!page}>\plusone
+ \doifelsevalue{\??mt#1\c!type}\v!fixed
+ {\ifnum\columnsetpage=\getvalue{\??mt#1\c!page}\relax
+ \donetrue\else\donefalse
+ \fi}
+ {\ifnum\columnsetpage<\getvalue{\??mt#1\c!page}\relax
+ \donefalse\else\donetrue
+ \fi}%
+ \else
+ \donetrue
+ \fi}
+
+\def\initializecolumntextareas
+ {\ifodd\realpageno
+ \doinitializecolumntextareas\columnrightareas\v!right
+ \else
+ \doinitializecolumntextareas\columnleftareas\v!left
+ \fi}
+
+\def\doinitializecolumntextareas#1#2%
+ {\def\docommand##1%
+ {\docheckcolumnsetareapage{##1#2}\plusone
+ \ifdone
+ \donefalse
+ \processaction
+ [\getvalue{\??mt##1#2\c!state}]
+ [ \v!start=>\donetrue,
+ \v!repeat=>\donetrue,
+ \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+ \ifdone\dodoinitializecolumntextareas{##1}{#2}\fi
+ \fi}%
+ \processcommacommand[#1]\docommand}
+
+\def\dodoinitializecolumntextareas#1#2%
+ {\doOTRSETsetgridcells
+ {\copy\placeholderboxd}
+ {\getvalue{\??mt#1#2\c!x }}{\getvalue{\??mt#1#2\c!y }}
+ {\getvalue{\??mt#1#2\c!nx}}{\getvalue{\??mt#1#2\c!ny}}
+ {\copy\placeholderboxd}}
+
+\def\placecolumntextareas
+ {\ifodd\realpageno
+ \doplacecolumntextareas\columnrightareas\v!right
+ \else
+ \doplacecolumntextareas\columnleftareas\v!left
+ \fi}
+
+\def\doplacecolumntextareas#1#2% global ?
+ {\bgroup
+ \forgetall
+ \def\docommand##1%
+ {\docheckcolumnsetareapage{##1#2}\zerocount
+ \ifdone
+ \donefalse
+ \processaction
+ [\getvalue{\??mt##1#2\c!state}]
+ [ \v!start=>\donetrue\doglobal\removefromcommalist{##1}#1,
+ \v!repeat=>\donetrue,
+ \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+ \ifdone
+ \dodoplacecolumntextareas{##1}{#2}%
+ \else
+ \doglobal\removefromcommalist{##1}#1%
+ \fi
+ \fi}%
+ \processcommacommand[#1]\docommand
+ \egroup}
+
+% \page[left]
+% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer]
+% \setupcolumntextareatext[intro][left][\setups{intro}]
+% \flushcolumntextareas
+
+\def\flushcolumntextareas
+ {\initializecolumntextareas
+ \setvsize}
+
+\def\columntextlastbackspace{\backspace}
+
+% beware, we have clipping offsets of 2\lineheight by default
+
+\def\columntextareaparameter#1%
+ {\csname\??mt\currentcolumntestarea#1\endcsname}
+
+\def\dodoplacecolumntextareas#1#2%
+ {\def\currentcolumntestarea{#1#2}%
+ \!!counta\columntextareaparameter\c!x
+ \!!countb\columntextareaparameter\c!nx
+ \docalculatecolumnsetspan
+ \!!heighta\columntextareaparameter\c!ny\lineheight
+ % wrong
+ % \ifnum\columntextareaparameter\c!y=\zerocount
+ % \advance\!!heighta -\lineheight
+ % \advance\!!heighta \topskip
+ % \fi
+ % \advance\!!heighta -\lineheight % option
+ \ifnum\columntextareaparameter\c!y=\plusone
+ \advance\!!heighta -\lineheight
+ \advance\!!heighta \topskip
+ \fi
+ %
+ \setbox\scratchbox\vbox
+ {\donetrue\localframed
+ [\??mt\currentcolumntestarea]
+ [\c!location=,% new (*)
+ \c!width=\!!widtha,\c!height=\!!heighta,\c!lines=]
+ {\columntextareaparameter\empty}}%
+ \!!counta\columntextareaparameter\c!x
+ \!!countb\columntextareaparameter\c!y
+ \advance\!!countb \columntextareaparameter\c!ny
+ \advance\!!countb \minusone
+ % new (*)
+ \doif{\columntextareaparameter\c!location}\v!depth
+ {\setbox\scratchbox\hbox{\lower\strutdepth\box\scratchbox}%
+ \dp\scratchbox\zeropoint
+ \ht\scratchbox\!!heighta}%
+ %
+ \setbox0\hbox
+ {\ifcase\!!countc
+ \copy\scratchbox % \box
+ \else
+ \clip
+ [ %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!leftoffset=\columntextareaparameter\c!clipoffset,%
+ \c!offset=\columntextareaparameter\c!clipoffset,%
+ \c!offset=\columntextareaparameter\c!clipoffset,%
+ \c!rightoffset=\columntextareaparameter\c!rightoffset,%
+ \c!width=\!!widthb,%
+ \c!height=\!!heighta]%
+ {\copy\scratchbox}%
+ \fi}%
+ \OTRSETsetgridcell\!!counta\!!countb\box0
+ \ifcase\!!countc\else
+ \advance\!!counta \columntextareaparameter\c!nx
+ \advance\!!counta -\!!countc
+ \advance\!!widtha -\!!widthb
+ \setbox0\hbox
+ {\hskip-\namedlayoutparameter\v!odd\c!backspace
+ \clip
+ [ %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!rightoffset=\columntextareaparameter\c!clipoffset,%
+ \c!offset=\columntextareaparameter\c!clipoffset,%
+ \c!offset=\columntextareaparameter\c!clipoffset,%
+ \c!leftoffset=\columntextareaparameter\c!leftoffset,%
+ \c!width=\!!widtha,%
+ \c!height=\!!heighta,%
+ \c!hoffset=\!!widthb]%
+ {\copy\scratchbox}}%
+ \OTRSETsetgridcell\!!counta\!!countb\box0%
+ \fi}
+
+\def\setupcolumntextareatext
+ {\dotripleempty\dosetupcolumntextareatext}
+
+\long\def\dosetupcolumntextareatext[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelse{#2}\v!both
+ {\setvalue{\??mt#1\v!left }{#3}%
+ \setvalue{\??mt#1\v!right}{#3}}
+ {\doifelse{#2}\v!next
+ {\doifoddpageelse
+ {\setvalue{\??mt#1\v!right}{#3}}%
+ {\setvalue{\??mt#1\v!left }{#3}}}%
+ {\setvalue{\??mt#1#2}{#3}}}%
+ \else
+ \setupcolumntextareatext[#1][\v!next][{#2}]%
+ \fi}
+
+\def\docalculatecolumnsetspan
+ {% \!!counta <= x
+ % \!!countb <= nx
+ % \!!widtha => total width
+ % \!!widthb => left width
+ % \!!countc => left cols
+ \!!widtha\!!countb\textwidth % we assume equal widths
+ \advance\!!countb \!!counta
+ \advance\!!countb \minusone
+ \ifnum\!!countb>\nofcolumns
+ \!!countc\!!countb
+ \advance\!!countc -\nofcolumns
+ \!!countb\nofcolumns
+ \else
+ \!!countc\zerocount
+ \fi
+ \advance\!!counta \plusone
+ \dostepwiserecurse\!!counta\!!countb\plusone
+ {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+ \!!widthb\!!widtha
+ \advance\!!widthb -\!!countc\textwidth
+ \ifodd\realpageno \else % tricky, assumes that we keep there
+ \ifcase\!!countc\else
+ % nog niet ok voor enkel/doublesided
+ \advance\!!widtha \namedlayoutparameter\v!even\c!backspace
+ \advance\!!widtha \namedlayoutparameter\v!odd \c!backspace
+ \advance\!!widthb \namedlayoutparameter\v!even\c!backspace
+ \dorecurse\!!countc
+ {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+ \fi
+ \fi}
+
+\def\columnsetspanhsize{\textwidth}
+
+\def\setcolumnsetspanhsize#1#2% x nx / uses counta/b
+ {\!!counta#1\!!countb#2\docalculatecolumnsetspan
+ \edef\columnsetspanhsize{\the\!!widtha}}
+
+\def\definecolumnsetspan
+ {\dodoubleempty\dodefinecolumnsetspan}
+
+\def\dodefinecolumnsetspan[#1][#2]%
+ {%\ifsecondargument
+ \defineframedtext
+ [cs:#1]
+ [\c!frame=\v!off,
+ \c!before=,
+ \c!after=,
+ \c!offset=\v!overlay,
+ \c!location=\v!left,
+ \c!linecorrection=\v!off,
+ \c!depthcorrection=\v!off,
+ \c!n=2,
+ \c!nlines=0,
+ \c!indenting=,
+ \c!indentnext=\v!yes,
+ \c!default=HERE,
+ \c!alternative=\v!a,
+ #2]%
+ %\else
+ % \definecolumnspan[][#1]%
+ }%\fi}
+
+\definecolumnsetspan[\s!default]
+
+\def\setupcolumnsetspan
+ {\dodoubleempty\dosetupcolumnsetspan}
+
+\def\dosetupcolumnsetspan[#1][#2]%
+ {\ifsecondargument
+ \setupframedtexts[cs:#1][#2]%
+ \else
+ \setupcolumnsetspan[\s!default][#1]%
+ \fi}
+
+\def\startcolumnsetspan
+ {\dotripleempty\dostartcolumnsetspan}
+
+%%%%%%%%%%%%%%%% TODO
+
+\def\dostartcolumnsetspan[#1][#2][#3]% [#3] gobbles space
+ {\endgraf % else rubish output if forgotten
+ \vskip \zeropoint % make sure otr is done, otherwise last line problems
+ \bgroup
+ \forgetall
+ \ifnum\columnsetlevel>\zerocount\else
+ % of course we needed a one-column fall back for tm
+ \columnsetspanhsize\hsize
+ \nofcolumns\plusone
+ \mofcolumns\plusone
+ \fi
+ \setupframedtexts[cs:#1]
+ [\c!width=\columnsetspanhsize,
+ \c!linecorrection=\v!off,
+ \c!depthcorrection=\v!off,
+ #2]%
+ % determine widths
+ \!!countc\framedtextparameter{cs:#1}\c!n
+ % \!!countd\numexpr(\nofcolumns-\mofcolumns+\plusone)%
+ \!!countd\nofcolumns
+ % n <= n of columns
+ \ifnum\!!countc>\!!countd \!!countc\!!countd \fi
+ \advance\!!countd -\mofcolumns
+ \advance\!!countd \plusone
+ % n <= n of available columns (alternative a)
+ \doif{\framedtextparameter{cs:#1}\c!alternative}\v!a
+ {\ifnum\!!countc>\!!countd \!!countc\!!countd \fi}%
+ % here it all starts
+ \setcolumnsetspanhsize\mofcolumns\!!countc % a/b used
+ \hsize\columnsetspanhsize
+ \setbox\scratchbox\vbox\bgroup
+ \dostartframedtext[cs:#1][\v!none]% geen nils placement
+ % spoils spacing : \vskip-\struttotal\par\verticalstrut\par
+ \ifnum\columnsetlevel>\zerocount
+ \framedtextparameter{cs:#1}\c!before
+ \fi
+ \def\stopcolumnsetspan{\dostopcolumnsetspan{#1}}}
+
+\def\dostopcolumnsetspan#1%
+ {\par
+ \verticalstrut
+ \kern-2\struttotal
+ \verticalstrut
+ \ifnum\columnsetlevel>\zerocount
+ \doifsomething{\framedtextparameter{cs:#1}\c!after}
+ {\framedtextparameter{cs:#1}\c!after
+ \kern\zeropoint}% otherwise blanks disappear, better be a switch
+ \else
+ \endgraf
+ \fi
+ \dostopframedtext
+ \egroup
+ \setbox\scratchbox\frozenhbox to \hsize
+ {\dontcomplain
+ \alignedline{\framedtextparameter{cs:#1}\c!location}\v!middle
+ {\lower\strutdepth\box\scratchbox}}%
+ \dp\scratchbox\zeropoint % else wrong snap insidefloat
+%
+% to be tested first (strange in grid mode)
+%
+% \setbox\scratchbox\frozenhbox to \hsize
+% {\dontcomplain
+% \chardef\alignstrutmode\zerocount
+% \alignedline{\framedtextparameter{cs:#1}\c!plaats}\v!midden
+% {\box\scratchbox}}%
+%
+ \ifinsidefloat
+ \box\scratchbox
+ \else\ifnum\columnsetlevel>\zerocount
+ % we only set \columnsetspacing when asked for, else bottom problems
+ % don't change this any more (test naw)
+ \chardef\columnslotspacing\framedtextparameter{cs:#1}\c!nlines\relax
+ % todo: nboven/onder & \chardef\columnslotlocation2
+ %\OTRSETstoreincolumnslotHERE\scratchbox
+ \edef\floatmethod{\framedtextparameter{cs:#1}\c!default}%
+ \@EA\uppercasestring\floatmethod\to\floatmethod
+ % todo : \v!here -> here enzovoorts
+ \OTRSETstoreincolumnslot\floatmethod\scratchbox
+ % watch out: no \dochecknextindentation{tag}
+ \checknextindentation[\framedtextparameter{cs:#1}\c!indentnext]%
+ \else
+ % of course we needed a one-column fall back for tm; brrr, the box has now too
+ % much height (try \ruledvbox); don't change this without testing techniek
+ \scratchdimen\ht\scratchbox
+ \advance\scratchdimen-\strutdp
+ \ht\scratchbox\scratchdimen
+ \framedtextparameter{cs:#1}\c!before
+ \snaptogrid\vbox{\box\scratchbox}%
+ \framedtextparameter{cs:#1}\c!after
+ \fi\fi
+ \egroup
+ \endgraf}
+
+% \startcolumnset[two]
+% \input tufte
+% \startcolumnsetspan[two][width=20cm,location=middle] \input tufte \stopcolumnsetspan
+% \startcolumnsetspan[two][default=btlr] \input tufte \stopcolumnsetspan
+% \input tufte \par
+% \input tufte \par
+% \startcolumnsetspan[two] \emptylines[5] \stopcolumnsetspan
+% \startcolumnsetspan[two] \input tufte \stopcolumnsetspan
+% \stopcolumnset
+
+\protect \endinput
+
+% extreme examples (1)
+%
+% \setupfloats[numbering=nocheck]
+%
+% \definecolumnset [first] [n=2,start=0]
+% \definecolumnset [next] [n=2,start=3]
+%
+% \setuptexttexts[\vbox to \textheight{\topskipcorrection \hsize\makeupwidth left \hfill right\vfill}]
+%
+% \setuphead[chapter][text=empty]
+%
+% \starttext
+%
+% \startcolumnset[first,next]
+% \placefigure[btrl]{}{}
+% \placefigure[tblr]{}{}
+% \chapter{thuan} \dorecurse{25}{\recurselevel: \input thuan \endgraf}
+% \stopcolumnset
+%
+% \startcolumnset[first,next]
+% \chapter{thuan} \dorecurse{25}{\input thuan \endgraf\placefigure{}{}}
+% \stopcolumnset
+
+\unprotect
+
+% only in columnsets
+
+% \def\cornerfigure
+% {\dotripleempty\docornerfigure}
+%
+% \def\docornerfigure[#1][#2][#3]% [layer] [location] [settings]
+% {\bgroup
+% \dowithnextbox
+% {\!!doneafalse
+% \!!donebfalse
+% \processallactionsinset
+% [\v!left,\v!bottom,#2]
+% [ \v!left=>\!!doneatrue ,
+% \v!right=>\!!doneafalse,
+% \v!top=>\!!donebtrue ,
+% \v!bottom=>\!!donebfalse]%
+% \!!widtha\nextboxwd
+% \if!!donea
+% % unchecked
+% \advance\!!widtha-\backspace
+% \else
+% % unchecked
+% \advance\!!widtha-\backspace
+% \fi
+% \!!widtha\textwidth % could be an option
+% \!!heighta\nextboxht
+% % zou een macro moeten zijn \getnoflayoutlines
+% \ifnum\layoutparameter\c!lines=\zerocount
+% \getnoflines\textheight
+% \else
+% \noflines\layoutparameter\c!lines
+% \fi
+% %
+% \advance\noflines \plusone % wordt default, instelbaar
+% \!!heightb\noflines\lineheight\relax
+% \if!!doneb % boven
+% % unchecked
+% \advance\!!heighta-\topspace
+% \advance\!!heighta-\headerheight
+% \advance\!!heighta-\headerdistance
+% \else % onder
+% % checked
+% \advance\!!heighta-\paperheight
+% \advance\!!heighta+\!!heightb
+% \advance\!!heighta+\topspace
+% \advance\!!heighta+\headerheight
+% \advance\!!heighta+\headerdistance
+% \advance\!!heighta-\footerdistance
+% \advance\!!heighta-\footerheight
+% \fi
+% \getnoflines\!!heighta
+% \!!heighta\noflines\lineheight\relax
+% \def\docornerfigure[####1]%
+% {\expanded{\plaatsfiguur[####1,\v!none]{}
+% {\noexpand\phantombox[\c!width=\the\!!widtha,\c!height=\the\!!heighta]}}}%
+% \if!!donea
+% \if!!doneb % links boven / rb
+% \setlayer[#1]
+% [\c!corner={\v!left,\v!top},\c!location=rb,#3]
+% {\flushnextbox}%
+% \docornerfigure[tblr]%
+% \else % links onder / rt
+% \setlayer[#1]
+% [\c!corner={\v!left,\v!bottom},\c!location=rt,#3]
+% {\flushnextbox}%
+% \docornerfigure[btlr]%
+% \fi
+% \else
+% \if!!doneb % rechts boven / lt
+% \setlayer[#1]
+% [\c!corner={\v!right,\v!top},\c!location=lb,#3]
+% {\flushnextbox}%
+% \docornerfigure[tbrl]%
+% \else % rechts onder / lb
+% \setlayer[#1]
+% [\c!corner={\v!right,\v!bottom},\c!location=lt,#3]
+% {\flushnextbox}%
+% \docornerfigure[btrl]%
+% \fi
+% \fi
+% \egroup}
+% \vbox}
diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv
new file mode 100644
index 000000000..cc6fbb5e6
--- /dev/null
+++ b/tex/context/base/page-set.mkiv
@@ -0,0 +1,2674 @@
+%D \module
+%D [ file=page-set,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Column Sets,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% getnoflines vs getrawnoflines
+
+% some day: cleanup and go etex
+
+\writestatus{loading}{ConTeXt Page Macros / Column Sets}
+
+% todo : last longer than previous
+% todo : block span over last column if footnotes
+% todo : diagnosis balancing run
+% todo : separate footnote placement
+% todo : go on on same page with colset
+% todo : test page areas per page
+% todo : leftmargin/rightmargin (better than afstand(1))
+
+% use the OTRSET layer for more purposes, like the footnotes !
+
+\unprotect
+
+\newcount\tofcolumns % total
+\newcount\lofcolumns % left
+\newcount\rofcolumns % right
+
+\newcount\columnfirstcell \columnfirstcell=1
+\newcount\columnlastcell
+\newcount\columnfreecells
+\newcount\currenthcell
+\newcount\currentvcell
+\newcount\columnhcells
+\newcount\columnvcells
+
+\newif\ifenoughcolumncells
+\newif\ifsomefreecolumncells
+\newif\ifcolumnspread
+\newif\iftracecolumnset % \tracecolumnsettrue
+
+\def\columnmaxcells {75} % runtime
+\def\columnmaxfreecells {0} % runtime
+\def\columngaplimit {0} % {5}
+
+\def\@otr@{otr}
+
+\def\OTRSETmakeupwidth{\innermakeupwidth}
+
+\let\OTRSETflushsidefloats \forgetsidefloats % \relax
+\let\OTRSETsynchronizesidefloats\forgetsidefloats % \relax
+
+\def\OTRSETgridcell #1#2{\csname \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETgetgridcell#1#2{\box\csname \@otr@:\number#1:\number#2\endcsname}
+\def\OTRSETsetgridcell#1#2{\global\setbox\csname\@otr@:\number#1:\number#2\endcsname}
+
+\long\def\OTRSETdoifcellelse#1#2%
+ {\relax\ifvoid\csname\@otr@:\number#1:\number#2\endcsname
+ \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments
+ \fi}
+
+% The following two macros are used to compensate for a switch in body fonts
+% as in:
+%
+% \definecolumnset [two] [n=2,balancing=yes]
+% \definecolumnset [three] [n=3,balancing=yes]
+%
+% \setupcolumnsetlines[two][1][1][7]
+% \setupcolumnsetlines[two][1][2][10]
+%
+% \setupcolumnsetlines[three][1][1][40]
+% \setupcolumnsetlines[three][1][2][40]
+% \setupcolumnsetlines[three][1][3][40]
+%
+% \setupcolumnsetstart[three][1][1][15]
+% \setupcolumnsetstart[three][1][2][20]
+% \setupcolumnsetstart[three][1][3][20]
+%
+% \starttext
+% \startcolumnset [two] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \switchtobodyfont[small]
+% \startcolumnset [three] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+%D Marks in columnsets:
+%D
+%D \starttyping
+%D \definemarking[M]
+%D \setupheadertexts[\setups{show-M-marks}]
+%D \definecolumnset[test][n=3]
+%D
+%D \startsetups show-M-marks
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][1][last]\quad
+%D \getmarking[M][2][previous]/\getmarking[M][2][first]/\getmarking[M][2][last]\quad
+%D \getmarking[M][3][previous]/\getmarking[M][3][first]/\getmarking[M][3][last]\quad
+%D \getmarking[M][1][previous]/\getmarking[M][1][first]/\getmarking[M][last]\quad
+%D \getsavedmarking[M][previous]/\getsavedmarking[M][first]/\getsavedmarking[M][last]
+%D \stopsetups
+%D
+%D \startbuffer
+%D \section{Knuth} [K1]\marking[M]{k1} [K2]\marking[M]{k2} \input knuth
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \stopbuffer
+%D
+%D \startbuffer
+%D \section{Ward} [W]\marking[M]{w} \input ward
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D \section{Davis} [D]\marking[M]{d} \input davis
+%D \section{Zapf} [Z]\marking[M]{z} \input zapf
+%D \section{Douglas} [O]\marking[M]{o} \input douglas
+%D \stopbuffer
+%D
+%D \starttext
+%D \startcolumnset[test]
+%D \dorecurse{5}{\getbuffer}
+%D \placefigure[here]{none}{\externalfigure[a][height=2cm]}
+%D % \column % sometimes needed
+%D \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+% not ok yet, for column sets we need a special case: within a column we
+% need to bubble-up the marks; the indirectness permits overloading here
+
+\let\saveOTRSETmark \refreshsavedmark
+\let\bubbleOTRSETmark\bubblesavedmark
+\let\resetOTRSETmark \resetsavedmark
+\let\presetOTRSETmark\presetsavedmark
+
+\def\doregisterOTRSETmarks#1{\saveOTRSETmark [#1][\number\mofcolumns]}
+\def\dobubbleOTRSETmarks #1{\bubbleOTRSETmark[#1][\number\mofcolumns]}
+\def\doresetOTRSETmarks #1{\resetOTRSETmark [#1][\recurselevel]}
+\def\dopresetOTRSETmarks #1{\presetOTRSETmark[#1][\recurselevel]}
+
+\def\registerOTRSETmarks
+ {\processcommacommand[\alldefinedmarks]\doregisterOTRSETmarks}
+\def\bubbleOTRSETmarks
+ {\processcommacommand[\alldefinedmarks]\dobubbleOTRSETmarks}
+\def\resetOTRSETmarks
+ {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\doresetOTRSETmarks}}
+\def\presetOTRSETmarks
+ {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\dopresetOTRSETmarks}}
+
+%D test case of Vit Zika (context list):
+%D
+%D \starttyping
+%D \setuplayout[height=middle,width=middle,grid=yes]
+%D
+%D \starttext
+%D \startcolumnset
+%D \dorecurse{10}
+%D {\input thuan \endgraf
+%D \bgroup
+%D \ss\restoreinterlinespace
+%D \dorecurse{3}{\input hawking \endgraf}
+%D \egroup
+%D \input bryson \endgraf}
+%D \stopcolumnset
+%D \stoptext
+%D \stoptyping
+
+\def\OTRSETsetcorrectnofcells#1%
+ {\bgroup
+ \!!counta#1\relax
+ \ifdim\globalbodyfontsize=\localbodyfontsize
+ \restoreinterlinespace
+ \else
+ \!!dimena-\!!counta\lineheight
+ \restoreglobalbodyfont % slow, we need a fast one
+ \advance\!!dimena\!!counta\lineheight
+ \getnoflines\!!dimena
+ \advance\!!counta\noflines
+ \ifnum\!!counta<#1\else
+ \!!counta#1\relax
+ \fi
+ \fi
+ \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+ \@EA\egroup\@EA\scratchcounter\the\!!counta\relax}
+
+\def\OTRSETsetcorrectcellht
+ {\bgroup
+ \!!dimena-\strutht\relax
+ \ifdim\globalbodyfontsize=\localbodyfontsize
+ \restoreinterlinespace
+ \else
+ \restoreglobalbodyfont
+ \fi
+ \advance\!!dimena\strutht
+ \relax % needed ! ! ! ! else lookahead over \fi and \@EA
+ \@EA\egroup\@EA\scratchdimen\the\!!dimena\relax}
+
+\def\columnerasegridboxes % maybe dedicated loops
+ {\bgroup
+ \increment\columnmaxcells\relax
+ \ifodd\realpageno
+ \else % we are on the other page
+ \columnspreadfalse
+ \fi
+ \ifcolumnspread
+ \dorecurse\nofcolumns
+ {\let\!!stringa\recurselevel
+ \scratchcounter\recurselevel \advance\scratchcounter\lofcolumns
+ \edef\!!stringb{\the\scratchcounter}%
+ \dostepwiserecurse \zerocount \columnmaxcells \plusone
+ {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+ \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+ \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+ \box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \else
+ \emptybox
+ %\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+ \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \fi
+ \else
+ \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+ \ifcsname\@otr@:\!!stringb:\recurselevel\endcsname
+ \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \else
+ \expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
+ \fi
+ \fi}}%
+ \else
+ \dorecurse \tofcolumns
+ {\let\!!stringa\recurselevel
+ \dostepwiserecurse \zerocount \columnmaxcells \plusone
+ {\ifcsname\@otr@:\!!stringa:\recurselevel\endcsname
+ \global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
+ \else
+ \expandafter\newbox\csname\@otr@:\!!stringa:\recurselevel\endcsname
+ \fi}}%
+ \fi
+ \dorecurse\tofcolumns
+ {\global\setbox\csname\@otr@:\recurselevel:\columnmaxcells\endcsname\copy\placeholderboxa}%
+ \global\columnfirstcell\zerocount
+ \global\columnlastcell\columnfirstcell
+ \global\columnfreecells\columnfirstcell
+ \egroup}
+
+\def\doOTRSETsetgridcells#1#2#3#4#5#6% placeholder col row wid hei {data}
+ {\!!countd#2\advance\!!countd#4\advance\!!countd\minusone
+ \!!counte#3\advance\!!counte#5\advance\!!counte\minusone
+ \dostepwiserecurse{#2}\!!countd\plusone
+ {\!!countf\recurselevel
+ \dostepwiserecurse{#3}\!!counte\plusone
+ {\OTRSETsetgridcell\!!countf\recurselevel#1}}%
+ \dostepwiserecurse{#3}\!!counte\plusone
+ {\global\wd\OTRSETgridcell{#2}\recurselevel\hsize}%
+ \OTRSETsetgridcell{#2}\!!counte#6}
+
+\def\OTRSETsetgridcells
+ {\doOTRSETsetgridcells{\copy\placeholderboxb}}
+
+\def\OTRSETerasegridcells#1#2#3#4%
+ {\doOTRSETsetgridcells{\emptybox}{#1}{#2}{#3}{#4}{\emptybox}}
+
+\unexpanded\def\setupcolumnsetlines{\doquintupleempty\dosetupcolumnsettrick[l]}
+\unexpanded\def\setupcolumnsetstart{\doquintupleempty\dosetupcolumnsettrick[s]}
+
+\def\dosetupcolumnsettrick[#1][#2][#3][#4][#5]% tag id page col value
+ {% not needed, is already relative
+ % \doifinstringelse{+}{#3}{\scratchcounter\realpageno}{\scratchcounter\zerocount}%
+ % \advance\scratchcounter#3\relax % \relax needed
+ % \setevalue{\??mc:#1:#2:\the\scratchcounter:\number#4}{\number#5}}
+ \iffifthargument
+ \setevalue{\??mc:#1:#2:\number#3:\number#4}{\number#5}%
+ \else
+ \setevalue{\??mc:#1:#2:\number#3:0}{\number#4}%
+ \fi}
+
+\def\currentcolumnmaxcellstag #1{\??mc:l:\OTRSETidentifier:\columnsetpage:\number#1}
+\def\currentcolumnstartcelltag#1{\??mc:s:\OTRSETidentifier:\columnsetpage:\number#1}
+
+\def\doresetcolumnsetlines#1%
+ {\ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+ \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+ \fi
+ \ifcsname\currentcolumnmaxcellstag{#1}\endcsname
+ \letgvalue{\currentcolumnmaxcellstag{#1}}\zerocount
+ \fi}
+
+\def\currentcolumnsomecells#1#2%
+ {\ifcsname#1\mofcolumns\endcsname
+ \ifnum\csname#1\mofcolumns\endcsname=\zerocount
+ #2%
+ \else
+ \number\numexpr\ifnum\csname#1\mofcolumns\endcsname<\zerocount
+ \columnmaxcells+\fi\csname#1\mofcolumns\endcsname\relax
+ \fi
+ \else\ifcsname#10\endcsname
+ \ifnum\csname#10\endcsname=\zerocount
+ #2%
+ \else
+ \number\numexpr\ifnum\csname#10\endcsname<\zerocount
+ \columnmaxcells+\fi\csname#10\endcsname\relax
+ \fi
+ \else
+ #2%
+ \fi\fi}
+
+\def\currentcolumnmaxcells {\currentcolumnsomecells\currentcolumnmaxcellstag \columnmaxcells}
+\def\currentcolumnstartcell{\currentcolumnsomecells\currentcolumnstartcelltag\plusone}
+
+\def\OTRSETsetfreecells#1#2% col start
+ {\bgroup
+ \global\columnfirstcell\ifnum#2=0 1\else#2\fi\relax
+ \OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+ \edef\columnmaxcells{\the\scratchcounter}%
+ \ifnum\columnfirstcell>\columnmaxcells
+ \global\columnfreecells\zerocount
+ \global\columnfirstcell\plusone
+ \global\columnlastcell \zerocount
+ \global\somefreecolumncellsfalse
+ %\message{no cells a}%
+ \else
+ \doloop
+ {\ifnum\columnfirstcell>\columnmaxcells\relax
+ \exitloop
+ \else
+ \OTRSETdoifcellelse{#1}\columnfirstcell
+ {\global\advance\columnfirstcell\plusone}\exitloop
+ \fi}%
+ \global\columnlastcell\columnfirstcell
+ \doloop
+ {\ifnum\columnlastcell>\columnmaxcells\relax
+ \exitloop
+ \else
+ \OTRSETdoifcellelse{#1}\columnlastcell
+ {\global\advance\columnlastcell \minusone \exitloop}
+ {\global\advance\columnlastcell \plusone }%
+ \fi}%
+ \ifnum\columnfirstcell>\columnmaxcells
+ \global\columnfreecells\zerocount
+ \global\columnfirstcell\plusone
+ \global\columnlastcell \zerocount
+ \global\somefreecolumncellsfalse
+ %\message{no cells b}%
+ \else
+ \ifnum\columnlastcell>\columnmaxcells
+ \global\columnlastcell\columnmaxcells
+ \fi
+ \global\columnfreecells\columnlastcell
+ \global\advance\columnfreecells -\columnfirstcell
+ \global\advance\columnfreecells \plusone
+ \global\somefreecolumncellstrue
+ %\message{\number\columnfirstcell-\number\columnlastcell=\number\columnfreecells}%
+ \fi
+ \fi
+ \egroup}
+
+\def\OTRSETgetmaxfreecells#1#2% col start
+ {\let\columnmaxfreecells\!!zerocount
+ \let\columnfrmfreecells\!!zerocount
+ \pushmacro \columnmaxcells
+\OTRSETsetcorrectnofcells\currentcolumnmaxcells % sets \scratchcounter
+\edef\columnmaxcells{\the\scratchcounter}%
+ \scratchcounter\zerocount
+ \dostepwiserecurse{#2}\columnmaxcells\plusone
+ {\OTRSETdoifcellelse{#1}\recurselevel
+ {\ifnum\columnmaxfreecells<\scratchcounter
+ \edef\columnmaxfreecells{\the\scratchcounter}%
+ \let\columnfrmfreecells\recurselevel
+ \fi
+ \scratchcounter\zerocount}
+ {\advance\scratchcounter\plusone}}%
+ \popmacro\columnmaxcells}
+
+\long\def\OTRSETrecurseRL#1%
+ {\dostepwiserecurse\nofcolumns\plusone\minusone
+ {#1\hskip\OTRSETgetparameter\c!distance\recurselevel}}
+
+\def\OTRSETmakegridbox
+ {\ifcase\columndirection
+ \OTRSETdomakegridbox\plusone\nofcolumns\plusone
+ \else
+ \OTRSETdomakegridbox\nofcolumns\plusone\minusone
+ \fi}
+
+\def\OTRSETmakeupwidth{\makeupwidth} % temporary indirectness
+
+\def\OTRSETdomakegridbox#1#2#3%
+ {\hbox\bgroup
+ \dontcomplain
+ \forgetall % can go once in \flush
+ \!!heighta \textheight
+ % test first !
+ \hbox to \OTRSETmakeupwidth
+ {\dostepwiserecurse{#1}{#2}{#3}
+ {\mofcolumns\recurselevel
+ \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+ \setbox\scratchbox\hbox\localframed
+ [\??mc\OTRSETidentifier\number\mofcolumns]%
+ [\c!width=\localcolumnwidth,\c!height=\!!heighta,\c!lines=]%
+ {}%
+ \wd\scratchbox\localcolumnwidth
+ \ht\scratchbox\!!heighta
+ \ifcase\columndirection
+ \hskip\OTRSETgetparameter\c!distance\recurselevel
+ \box\scratchbox
+ \else
+ \box\scratchbox
+ \hskip\OTRSETgetparameter\c!distance\recurselevel
+ \fi}}%
+ \hskip-\OTRSETmakeupwidth
+ % main text
+ \hbox to \OTRSETmakeupwidth
+ {\dostepwiserecurse{#1}{#2}{#3}
+ {\mofcolumns\recurselevel
+ \localcolumnwidth\OTRSETlocalwidth\mofcolumns
+ \offinterlineskip
+ \setbox\scratchbox\vbox to \!!heighta
+ {%\topskipcorrection % not needed
+ \ifcase\OTRSETbalancemethod
+ % no
+ \or
+ % yes
+ \doifelselayerdata{OTRTEXT}\vfill\relax % temp hack
+ \or
+ % top
+ \or
+ % bottom
+ \vfill
+ \fi
+ \dorecurse\columnmaxcells
+ {\setbox\scratchbox\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \ifcase\columndirection
+ \box\scratchbox
+ \else
+ \hbox to \localcolumnwidth
+ {\hskip\localcolumnwidth\llap{\box\scratchbox}}%
+ \fi
+ \par}%
+ \ifcase\OTRSETbalancemethod
+ % no
+ \else
+ % yes, top, bottom
+ \ifdim\globalbodyfontsize=\localbodyfontsize
+ \removedepth
+ \restoreglobalbodyfont
+ \vskip\strutdepth
+ \fi
+ \kern\zeropoint
+ \vss
+ \fi}%
+ \wd\scratchbox\localcolumnwidth % \textwidth
+ \ifcase\columndirection
+ \hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox
+ \else
+ \box\scratchbox\hskip\OTRSETgetparameter\c!distance\recurselevel
+ \fi}}%
+ \egroup}
+
+\let\OTRSETbalht\zeropoint
+
+\def\OTRSETreducegridbox % for the moment no difference between methods
+ {\globallet\OTRSETbalht\zeropoint
+ \ifcase\OTRSETbalancemethod
+ % no balancing
+ \else
+ \bgroup
+ \!!counta\columnmaxcells
+ \donetrue
+ \doloop
+ {\dorecurse\nofcolumns{\OTRSETdoifcellelse\recurselevel\!!counta\donefalse\donothing}%
+ \ifdone
+ \ifnum\!!counta>\plusone\advance\!!counta\minusone\else\exitloop\fi
+ \else
+ \exitloop
+ \fi}%
+ \ifnum\!!counta>\plusone
+ \!!heighta\lineheight
+ \multiply\!!heighta \!!counta
+ \advance\!!heighta \topskip
+ \advance\!!heighta -\lineheight
+ \else
+ \!!heighta\zeropoint
+ \fi
+ \xdef\OTRSETbalht{\the\!!heighta}%
+ \egroup
+ \fi}
+
+\def\OTRSETflushfinalfootnotes
+ {\ifcase\lastcolumnlastcell \else
+ \setbox\scratchbox\hbox
+ {\placebottomnotes}%
+ \ifdim\ht\scratchbox>\zeropoint
+ \setbox\scratchbox\hbox
+ {\hbox to \zeropoint{\OTRSETgetgridcell\nofcolumns\lastcolumnlastcell}%
+ \box\scratchbox}%
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \OTRSETsetgridcell\nofcolumns\lastcolumnlastcell\box\scratchbox
+ \fi
+ \global\lastcolumnlastcell\zerocount
+ \fi}
+
+\def\OTRSETdoflush
+ {\ifcollectingcontent
+ \registerOTRSETmarks
+ \global\mofcolumns\plusone
+ \else
+ \OTRSETdofinalflush
+ \OTRSETdofinaloutput
+ \ifnum\columnsetpage>0
+ \dorecurse\nofcolumns{\doresetcolumnsetlines\recurselevel}%
+ \fi
+ \doglobal\increment\columnsetpage
+ \OTRSETinitializecolumns
+ %\OTRSETdoflushfloats
+ \OTRSETstartnextpage
+\presetOTRSETmarks
+ \initializecolumntextareas
+ \fi}
+
+\newbox\OTRfinalpagebox
+
+\def\OTRSETdofinalflush % see \OTRSETdoflush
+ {\OTRSETflushfinalfootnotes
+ \placecolumntextareas
+ \OTRSETcentergridcells
+ \bgroup % we want to keep the reduction local
+ \OTRSETreducegridbox
+ \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+ \egroup % otherwise we get the wrong number of free cells
+ %\gdef\localcolumnmaxcells{0}% here ?
+ \global\mofcolumns\nofcolumns} % otherwise problems in finaloutput
+
+\def\OTRSETdofinaloutput
+ {\ifdim\ht\OTRfinalpagebox=\textheight
+ \bgroup % \let\OTRSETsetvsize\relax % prevents useless search for gap
+ \ifcase\OTRSETbalancemethod
+ \finaloutput\box\OTRfinalpagebox
+ \else\ifdim\OTRSETbalht>\zeropoint
+ % catch a bordercase
+ \scratchdimen\OTRSETbalht
+ \advance\scratchdimen\lineheight\relax
+ \ifdim\scratchdimen>\textheight
+ % full page
+ \finaloutput\box\OTRfinalpagebox
+ \else
+ % same page
+ \global\setbox\OTRfinalpagebox \iftracecolumnset\ruledvbox\else\vbox\fi to \OTRSETbalht
+ {\box\OTRfinalpagebox\vss}%
+ \setlayer[OTRTEXT]{\box\OTRfinalpagebox}%
+ \snaptogrid\vbox{\vskip\OTRSETbalht}% hack
+ \fi
+ \else
+ \finaloutput\box\OTRfinalpagebox
+ \fi \fi
+ \globallet\OTRSETbalht\zeropoint
+ \egroup
+ \fi}
+
+\definesystemvariable {mc}
+\definesystemvariable {mt}
+\definesystemconstant {colset}
+
+\definetwopasslist\s!colset
+
+\newdimen \OTRSETtextswidth
+\newdimen \OTRSETtextsheight
+\let \OTRSETidentifier=\empty
+
+\newtoks \OTRSEToutput
+
+\def\OTRSETgetparameter#1#2{\csname\??mc\OTRSETidentifier\number#2#1\endcsname}
+\def\OTRSETsetparameter#1#2{\setvalue{\??mc\OTRSETidentifier\number#2#1}}
+
+\def\OTRSETskipstart
+ {\scratchcounter\executeifdefined{\??mc\OTRSETidentifier\c!start}\zerocount
+ \relax % needed !
+ \ifcase\scratchcounter\else
+ \advance\scratchcounter\plusone
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxe}
+ \plusone\plusone\nofcolumns\scratchcounter
+ \null
+ \fi}
+
+\def\OTRSETsetvsize % snap per sectie (gap here?)
+ {\ifcollectingcontent \else % can be assigndimen
+\OTRSETskipstart % not that well tested
+ \OTRSETcheckinsert % added
+ \OTRSETsetfreecells\mofcolumns\columnfirstcell
+ \ifsomefreecolumncells
+ \global\vsize\columnfreecells\lineheight
+ \ifinotr % else problems with floats, see extreme
+ \global\pagegoal\vsize % niet nodig, tenzij binnen otr
+ \fi
+ \synchronizeoutput % fails on example
+ % \allowbreak % hm
+ \fi
+ \synchronizenotes
+ \fi}
+
+\def\OTRSETsethsize % of course this does not migrate outside the otr
+ {\localcolumnwidth\OTRSETlocalwidth\mofcolumns
+ \textwidth\localcolumnwidth
+ \hsize\localcolumnwidth}
+
+\def\OTRSETsynchronizehsize
+ {\ifcase0\getvalue{\??mc\??mc\c!width}\else % some width set
+ \bgroup
+ \scratchdimen\OTRSETlocalwidth\mofcolumns
+ \ifdim\scratchdimen=\textwidth
+ \egroup
+ \else
+ % only if change in width and \column/\break
+ \egroup \OTRSETsethsize
+ \fi
+ \fi}
+
+\def\OTRSETcheckfreelines
+ {\OTRSETsetvsize}
+
+\def\doOTRSETcolumnseparator
+ {\hbox to \zeropoint{\hss\red\vl\hss}}
+
+\let\OTRSETcolumnseparator\relax
+
+\def\showbreaks
+ {\let\OTRSETcolumnseparator\doOTRSETcolumnseparator}
+
+% \installcolumnbreakhandler {SET} \v!ja
+% {% hmmm:
+% \ifhmode
+% \bgroup
+% \removeunwantedspaces
+% \parfillskip\zeropoint
+% \OTRSETcolumnseparator
+% \par
+% \egroup
+% \fi
+% % brrr:
+% \ejectinsert
+% \ejectpage
+% \OTRSETsynchronizehsize} % no \OTRSETsethsize, can be mid smaller (like tabulate)
+%
+% \installcolumnbreakhandler {SET} \v!forceer
+% {\OTRSETgotocolumn[\v!forceer]}
+% \installcolumnbreakhandler {SET} \v!eerste
+% {\OTRSETgotocolumn[\v!eerste]}
+% \installcolumnbreakhandler {SET} \v!laatste
+% {\OTRSETgotocolumn[\v!laatste]}
+%
+% \installcolumnbreakhandler {SET} \v!pagina
+% {\simplepagebreak % \flushnotes \executepagebreakhandler\v!ja
+% \ifnum\mofcolumns>\plusone
+% \OTRSETgotocolumn[\v!laatste,\v!forceer]%
+% \fi}
+
+\def\OTRSETcolumnhbreak
+ {\ifhmode
+ \bgroup
+ \removeunwantedspaces
+ \parfillskip\zeropoint
+ \OTRSETcolumnseparator
+ \par
+ \egroup
+ \fi}
+
+\installcolumnbreakhandler {SET} \v!local
+ {\OTRSETcolumnhbreak
+ \ejectinsert
+ \ejectpage % brrr
+ % no \OTRSETsethsize, can be mid smaller (like tabulate)
+ % also, this one should be executed at the outer level
+ % (setting hsize inside otr does not work)
+ \OTRSETsynchronizehsize}
+
+% We need to make sure that we really leave the column; mid
+% column we may end up in an empty gap, and we don't want to
+% stay there (basically such a gap is a small empty page
+% then).
+
+\installcolumnbreakhandler {SET} \v!yes
+ {\OTRSETcolumnhbreak
+ \edef\savedmofcolumns{\the\mofcolumns}%
+ \edef\savedrealpageno{\the\realpageno}%
+ \ejectinsert
+ \ejectpage % brrr
+ \doloop
+ {\ifnum\savedmofcolumns=\mofcolumns
+ \ifnum\savedrealpageno=\realpageno
+ \OTRSETdummycolumn
+ \else
+ \exitloop
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \OTRSETsynchronizehsize}
+
+\installcolumnbreakhandler {SET} \s!unknown
+ {\expanded{\OTRSETgotocolumn[\@@columnspecification]}}
+
+\installcolumnbreakhandler {SET} \v!page
+ {\vfill\eject % \doejectpage\eject
+ \OTRSETgotonextpage}
+
+\newtoks\OTRSETeverystartofcolumn
+
+\newbox\OTRSETsavedfootnotes
+
+% \installoutput\OTRSETflushtextsofar % spacing goes wrong
+
+%\def\OTRSETflushtextsofar
+% {\ifvoid\normalpagebox \else
+% \setbox\scratchbox\vbox{\unvbox\normalpagebox}%
+% \OTRSETsavenotes
+% \OTRSEThandleflushedtext0
+% \fi}
+
+% The complication is in the fact that when the HERE float
+% is placed, the otr is not invoked when there is not yet
+% enough content; this can lead to a change in order (turning
+% on the tracer with option 0 is very instructive, watch the
+% small numbers in the margin)
+%
+% 0 = no flushing, so no interference but user should handle
+% border cases of placement
+% 1 = the normal otr, rather untested
+% 2 = a solution that works ok, is experimental and above
+% all messy
+
+\chardef\OTRSETflushtextmode=0
+
+\def\OTRSETflushtextsofar
+ {\ifcase\OTRSETflushtextmode
+ % don't mess around
+ \or
+ % the normal one
+ \ifvoid\normalpagebox\else
+ \OTRSETnaturalflush
+ \OTRSETcheckfreelines
+ \fi
+ \or
+ % way to complicated, but kind of ok
+ \doOTRSETflushtextsofar
+ \fi}
+
+\newskip\lastskipinotr
+
+\installoutput\doOTRSETflushtextsofar % experimental
+ {\ifvoid\normalpagebox\else
+ \scratchdimen\dp\normalpagebox
+ \setbox\scratchbox\vbox
+ {\forgetall
+ \unvbox\normalpagebox
+ \global\lastskipinotr\lastskip\relax
+ \ifdim\lastskipinotr>\zeropoint\relax
+ \removelastskip
+ \else
+ \kern-\scratchdimen % handle depth
+ \fi}%
+ \ifdim\lastskipinotr>\zeropoint
+ \scratchskip\ht\scratchbox
+ \setbox\scratchbox\hbox
+ {\lower\strutdepth\box\scratchbox}%
+ \dp\scratchbox\scratchdimen
+ \ht\scratchbox\scratchskip
+ \fi
+ \OTRSETsavenotes
+ \OTRSEThandleflushedtext\zerocount
+ \ifdim\lastskipinotr>\zeropoint
+ %\vskip \lastskipinotr % hm, gets lost anyway
+ \else
+ % we should not discard skips after here; tricky
+ \fi
+ \OTRSETsetvsize
+ \fi}
+
+\def\OTRSETplacebottomnotes
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns
+ \ifintermediatefootnotes \placebottomnotes \fi
+ \fi
+ \else
+ \placebottomnotes
+ \fi}
+
+\def\OTRSETflushsavednotes
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns
+ \flushsavednotes
+ \fi
+ \else
+ \flushsavednotes
+ \fi}
+
+\def\OTRSETsavenotes
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns \else
+ \savenotes
+ \fi
+ \fi}
+
+\appendtoks \OTRSETflushsavednotes \to \OTRSETeverystartofcolumn
+
+\def\OTRSETnaturalflush
+ {\bgroup
+ \forgetall % new, needed !
+ \setbox0\vbox to \columnfreecells\lineheight
+ {\vskip-\topskip
+ \vskip\lineheight
+ \prevdepth\strutdp
+ \unvbox\normalpagebox
+ \vfill}%
+ \setbox2\hbox
+ {\OTRSETplacebottomnotes}%
+ \setbox\scratchbox\hbox
+ {\wd0\zeropoint\box0\box2}%
+ \dp\scratchbox\strutdp
+ \OTRSEThandleflushedtext\plusone
+ \egroup}
+
+\newcount\lastcolumnlastcell
+
+\def\OTRSEThandleflushedtext#1%
+ {\getnoflines{\ht\scratchbox}%
+ %\wd\scratchbox\textwidth % geen \hsize kan < zijn in bv split tabulate
+ \wd\scratchbox\OTRSETlocalwidth\mofcolumns
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxf}
+ \mofcolumns\columnfirstcell\plusone\noflines
+ {\registeredtextarea1\columnfirstcell\scratchbox}% == \hbox / tricky htcorr == \columnfirstcell
+ \global\columnlastcell\columnfirstcell
+ \global\advance\columnlastcell \noflines
+ \global\lastcolumnlastcell\columnlastcell
+ \global\advance\lastcolumnlastcell \minusone
+ % find next (acceptable) gap, todo: deadcycle
+ \ifcase#1\else
+ \OTRSETfillgapsbetweencells\mofcolumns\columnlastcell
+ \fi
+ \OTRSETfindnextgap
+ % \message{\the\mofcolumns,\the\columnfirstcell,\the\columnfreecells}%
+ % \wait
+ % we cannot adapt the hsize since it may have changed (like
+ % inside a tabulate) so we only change it when there is a
+ % reason to do so
+ \OTRSETsynchronizehsize
+ \OTRSETsetvsize}
+
+\def\OTRSETfindnextgap
+ {\OTRSETsetfreecells\mofcolumns\columnlastcell
+ \ifsomefreecolumncells
+ % okay
+ \bubbleOTRSETmarks % not robust because we reenter
+ \else
+ \registerOTRSETmarks % not robust because we reenter
+ \global\advance\mofcolumns \plusone
+ \ifnum\mofcolumns>\nofcolumns
+ \OTRSETdoflush
+ \global\columnlastcell\plusone
+ \global\columnfirstcell\zerocount
+ \OTRSETdoflushfloats
+ \else
+ \the\OTRSETeverystartofcolumn
+ \global\columnlastcell\plusone
+ \global\columnfirstcell\zerocount
+ \fi
+ \fi}
+
+\let\OTRSETcheckfreelines\donothing
+
+\def\OTRSETfillgapsbetweencells#1#2% col
+ {\ifnum\columngaplimit>\zerocount
+ \donefalse
+ \dostepwiserecurse{#2}\columnmaxcells\plusone
+ {\OTRSETdoifcellelse{#1}\recurselevel
+ {\ifdone
+ \!!countb\recurselevel \advance\!!countb -\!!counta\relax
+ \ifnum\!!countb>\plusone
+ \advance\!!countb \minusone
+ \ifnum\!!countb<\columngaplimit\relax
+ \!!countb\recurselevel \advance\!!countb \minusone
+ \dostepwiserecurse\!!counta\!!countb\plusone
+ {\OTRSETsetgridcell{#1}\recurselevel\copy\placeholderboxc}%
+ %\message{[gap]}%
+ \fi
+ \fi
+ \fi
+ \donefalse}
+ {\ifdone \else
+ \donetrue
+ \!!counta\recurselevel
+ \fi}}%
+ \fi}
+
+\appendtoks
+ \OTRSETfillgapsbetweencells\mofcolumns\plusone
+\to \OTRSETeverystartofcolumn
+
+\newif\ifspancolumnslots \spancolumnslotstrue
+\newif\ifcheckcolumnspan \checkcolumnspantrue
+
+\def\OTRSETcheckwidthgap#1#2% box size
+ {\ifcheckcolumnspan
+ \bgroup
+ \scratchdimen#2%
+ \advance\scratchdimen-\wd#1\relax
+ \ifdim-10\scaledpoint>\scratchdimen
+ \egroup
+ \else\ifdim10\scaledpoint<\scratchdimen
+ \egroup
+ \else
+ \egroup
+ \wd#1=#2%
+ \fi\fi
+ \fi}
+
+\def\OTRSETcheckcolumnslot#1%
+ {\enoughcolumncellstrue
+ \ifspancolumnslots\else
+ \OTRSETcheckwidthgap#1\hsize
+ \ifdim\wd#1>\hsize
+ \enoughcolumncellsfalse
+ \fi
+ \fi
+ \ifenoughcolumncells
+ \getnoflines\pagetotal
+ \scratchcounter\noflines
+ \getnoflines{\ht#1}%
+ \columnvcells\noflines
+ \columnhcells\plusone
+ \advance\scratchcounter \columnvcells \relax
+ \ifnum\scratchcounter>\columnfreecells
+ \enoughcolumncellsfalse
+ \fi
+ \fi}
+
+\def\OTRSETstoreincolumnslotPAGE#1%
+ {\ifenoughcolumncells
+ % to do
+ \OTRSETsavebox{#1}%
+ \else
+ \OTRSETsavebox{#1}%
+ \fi}
+
+\def\OTRSETstoreincolumnslotTOPS#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETcheckcolumnslot{#1}%
+ \ifenoughcolumncells
+ \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+ \fi
+ \ifenoughcolumncells
+ \OTRSETsetgridcells\mofcolumns\columnfirstcell\columnhcells\columnvcells
+ {\hbox{\copy#1}}%
+ \OTRSETsetvsize
+ \else
+ \OTRSETsavebox{#1}%
+ \fi}
+
+\def\OTRSETstoreincolumnslotBOTS#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \edef\savedcolumnlastcell{\the\columnlastcell}%
+ \OTRSETcheckcolumnslot{#1}%
+ \ifenoughcolumncells
+ \advance\columnlastcell -\columnvcells \advance\columnlastcell \plusone
+% \OTRSETcheckcolumnspace\mofcolumns\columnfirstcell{#1}%
+ \OTRSETcheckcolumnspace\mofcolumns\columnlastcell{#1}%
+ \fi
+ \ifenoughcolumncells
+ \OTRSETsetgridcells\mofcolumns\columnlastcell\columnhcells\columnvcells{\copy#1}%
+ \OTRSETfillgapsbetweencells\mofcolumns\savedcolumnlastcell % -)
+ \OTRSETsetvsize
+ \else
+ \columnlastcell\savedcolumnlastcell
+ \OTRSETsavebox{#1}%
+ \fi}
+
+\newdimen\totalcolumnspace
+
+\def\columnspacetopoffset{0}
+\def\columnspacebotoffset{0}
+
+\def\OTRSETcheckcolumnspace#1#2#3% col row box
+ {\columnhcells\plusone
+ \totalcolumnspace\zeropoint
+ \scratchcounter#1%
+ \enoughcolumncellstrue
+ \doloop
+ {\advance\totalcolumnspace \OTRSETlocalwidth\scratchcounter\relax % needed
+\OTRSETcheckwidthgap#3\totalcolumnspace
+ \ifnum\wd#3>\totalcolumnspace\relax
+ \ifnum\scratchcounter=\nofcolumns
+ \enoughcolumncellsfalse
+ \exitloop
+ \else
+ \advance\columnhcells \plusone
+ \advance\scratchcounter \plusone
+ \advance\totalcolumnspace \OTRSETgetparameter\c!distance\scratchcounter
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \ifenoughcolumncells
+ \getnoflines{\ht#3}%
+ \columnvcells\noflines
+ \OTRSETcheckcolumncells{#1}{#2}\columnhcells\columnvcells
+ \fi}
+
+\def\OTRSETcheckcolumncells#1#2#3#4% col row wid hei
+ {\!!countd#1\advance\!!countd#3\advance\!!countd\minusone
+ \!!counte#2\advance\!!counte#4\advance\!!counte\minusone
+ \ifnum\!!counte>\columnmaxcells\relax
+ \enoughcolumncellsfalse
+ \else
+ \enoughcolumncellstrue
+%\let\columnspacetopoffset\zerocount
+%\scratchcounter#2\advance\scratchcounter\minusone
+%\ifnum\scratchcounter>0
+% \dostepwiserecurse{#1}\!!countd\plusone
+% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacetopoffset\plusone
+% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacetopoffset\plusone
+% \fi\fi}%
+% \advance\!!counte \columnspacetopoffset \relax
+% \advance\columnvcells \columnspacetopoffset \relax
+%\fi
+%\let\columnspacebotoffset\zerocount
+%\scratchcounter\!!counte
+%\advance\scratchcounter \columnvcells \relax
+%\ifnum\scratchcounter>\columnmaxcells\else
+% \dostepwiserecurse{#1}\!!countd\plusone
+% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacebotoffset\plusone
+% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
+% \let\columnspacebotoffset\plusone
+% \fi\fi}%
+% \advance\!!counte \columnspacebotoffset \relax
+% \advance\columnvcells \columnspacebotoffset \relax
+%\fi
+ \dostepwiserecurse{#1}\!!countd\plusone % cols
+ {\ifenoughcolumncells
+ \!!countf\recurselevel\relax
+ \dostepwiserecurse{#2}\!!counte\plusone % rows
+ {\ifenoughcolumncells
+ \OTRSETdoifcellelse\!!countf\recurselevel
+ {\enoughcolumncellsfalse}{}%
+ \fi}%
+ \fi}%
+ \fi}
+
+\def\OTRSETsetpreferedcolumnslot#1#2%
+ {\doifsomething{#1}{\edef\preferedcolumn{#1}}%
+ \doifsomething{#2}{\edef\preferedrow {#2}}}
+
+\OTRSETsetpreferedcolumnslot{\nofcolumns}{1} % default ?
+
+\let\pofcolumns\mofcolumns
+\let\qofcolumns\mofcolumns
+
+\newif\ifquitincurrentcolumn
+
+\def\OTRSETstoreincolumnslotLRTB#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \mofcolumns\nofcolumns+\currenthcell
+ \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotLRBT#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \mofcolumns\nofcolumns+\currenthcell
+ \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLTB#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \nofcolumns\qofcolumns-\currenthcell
+ \plusone\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotRLBT#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \nofcolumns\qofcolumns-\currenthcell
+ \columnmaxcells\plusone-\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBLR#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \plusone\columnmaxcells+\currentvcell
+ \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotTBRL#1%
+ {\OTRSETprepareforcolumnslot1{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \plusone\columnmaxcells+\currentvcell
+ \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTLR#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \columnmaxcells\plusone-\currentvcell
+ \mofcolumns\nofcolumns+\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotBTRL#1%
+ {\OTRSETprepareforcolumnslot3{#1}%
+ \OTRSETflushtextsofar
+ \OTRSETcheckprefered
+ \OTRSETstoreincolumnslotindeed
+ \columnmaxcells\plusone-\currentvcell
+ \nofcolumns\qofcolumns-\currenthcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXTB#1% fixed column
+ {\OTRSETcheckprefered
+ \OTRSETdoifcellelse\pofcolumns\plusone
+ {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot1}{#1}% % 1/2 dependent of place, todo
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \pofcolumns \pofcolumns +\currenthcell
+ \preferedrow\columnmaxcells+\currentvcell{#1}}
+
+\def\OTRSETstoreincolumnslotFXBT#1% fixed column
+ {\OTRSETcheckprefered
+ \OTRSETdoifcellelse\pofcolumns\columnmaxcells
+ {\OTRSETprepareforcolumnslot2}{\OTRSETprepareforcolumnslot3}{#1}% % 3/2 dependent of place, todo
+ \OTRSETflushtextsofar
+ \OTRSETstoreincolumnslotindeed
+ \pofcolumns \pofcolumns +\currenthcell
+ \columnmaxcells\preferedrow-\currentvcell{#1}}
+
+\chardef\OTRSETforcefixedfloats=0
+
+\def\OTRSETstoreincolumnslotHERE#1% fixed column
+ {\ifcase\OTRSETforcefixedfloats
+ \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+ \else
+ \OTRSETstoreincolumnslotFIXD{#1}%
+ \fi}
+
+% this one looses too wide graphics
+%
+% \def\OTRSETstoreincolumnslotFIXD#1% fixed column
+% {\OTRSETprepareforcolumnslot2{#1}%
+% % no flush text sofar here, beware: no width test
+% \snaptogrid\vbox{\box#1}}
+%
+% still imperfect
+
+\def\OTRSETstoreincolumnslotFIXD#1% fixed column
+ {\OTRSETflushtextsofar
+ \ifdim\wd#1>\textwidth
+ \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+ \else
+ % crappy test / needed for o-pbu-f / will be replaced
+ \getnoflines{\ht#1}%
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen\lineheight
+ \advance\scratchdimen\pagetotal\relax
+ \ifdim\scratchdimen<\pagegoal
+ %OTRSETprepareforcolumnslot3{#1}%
+ %ruledvskip\columnslotspacing\lineheight
+ \blank[\columnslotspacing*\v!line]%
+ \snaptogrid\hbox to \hsize{\hss\box#1\hss}% strange, why the centering
+ \blank[\columnslotspacing*\v!line]%
+ \else
+ \OTRSETstoreincolumnslotSOMEWHERE2{#1}%
+ \fi
+ \fi}
+
+\def\OTRSETstoreincolumnslotSOMEWHERE#1#2%
+ {\OTRSETprepareforcolumnslot{#1}{#2}%
+ \OTRSETflushtextsofar
+ \getnoflines\pagetotal \advance\noflines\columnfirstcell
+ \OTRSETstoreincolumnslotindeed
+ \mofcolumns\mofcolumns+\currenthcell
+ \noflines\columnmaxcells+\currentvcell{#2}%
+ \OTRSETsetvsize}
+
+\def\OTRSETcheckprefered
+ {\ifnum\preferedcolumn<\mofcolumns
+ \let\pofcolumns\mofcolumns
+ \else
+ \let\pofcolumns\preferedcolumn
+ \fi
+ \ifquitincurrentcolumn
+ \ifnum\mofcolumns=\nofcolumns
+ \def\qofcolumns{\mofcolumns}%
+ \else
+ \scratchcounter\mofcolumns
+ \advance\scratchcounter \plusone
+ \edef\qofcolumns{\the\scratchcounter}%
+ \fi
+ \else
+ \let\qofcolumns\mofcolumns
+ \fi}
+
+\def\OTRSETstoreincolumnslotindeed#1#2#3#4#5#6#7#8#9%
+ {\OTRSETcheckprefered
+ \enoughcolumncellsfalse
+ \donefalse
+ \dostepwiserecurse{#1}{#2}{#31}
+ {\ifdone
+ \exitloop
+ \else
+ #4=\recurselevel
+ \dostepwiserecurse{#5}{#6}{#71}
+ {\ifdone
+ \exitloop
+ \else
+ #8=\recurselevel
+ \OTRSETcheckcolumnspace\currenthcell\currentvcell{#9}%
+ \ifenoughcolumncells \donetrue \fi
+ \fi}%
+ \fi}%
+ \ifdone
+ \enoughcolumncellstrue
+ \else
+ \enoughcolumncellsfalse
+ \fi
+ \ifenoughcolumncells
+% \ifnum\columnspacetopoffset>0\message{[+++]}\fi
+% \ifnum\columnspacebotoffset>0\message{[---]}\fi
+% \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+% {\vbox
+% {\ifcase\columnspacetopoffset\else\ruledvskip\columnspacetopoffset\lineheight\fi
+% \copy#9
+% \ifcase\columnspacebotoffset\else\ruledvskip\columnspacebotoffset\lineheight\fi}}%
+ \OTRSETsetgridcells\currenthcell\currentvcell\columnhcells\columnvcells
+ {\copy#9}%
+ \ifnum\currenthcell=\mofcolumns\relax
+ \ifdim\ht\OTRSETsavedfootnotes>\zeropoint
+ \OTRSETsetfreecells\mofcolumns\columnfirstcell
+ \ifsomefreecolumncells
+ \getnoflines{\ht\OTRSETsavedfootnotes}\relax
+ \ifnum\columnfreecells<\noflines
+ \global\somefreecolumncellsfalse
+ \else
+ %\message{[flt]}% float
+ \fi
+ \fi
+ \ifsomefreecolumncells
+ % ok, enough room for notes
+ %\message{[flt]}% float
+ \else % ?
+ \OTRSETsavebox{#9}%
+ \OTRSETerasegridcells\currenthcell\currentvcell\columnhcells\columnvcells
+ %\message{[clr]}% save box
+ \fi
+ \else
+ %\message{[flt]}% float
+ \fi
+ \else
+ %\message{[flt]}% float
+ \fi
+ \OTRSETsetvsize
+ %\message{[fnt]}% float
+ \else
+ %\message{[rej]}% save box
+ \OTRSETsavebox{#9}%
+ \fi}
+
+\chardef\columnslotspacing \plusone
+
+\def\OTRSETstoreincolumnslot#1% #2 % {method} {box} % alleen last
+ {% no messing around here
+ % \dp#2=\zeropoint
+ % \ifcase\columnslotspacing\else
+ % \setbox#2=\vbox spread \columnslotspacing\lineheight
+ % {\vss\box#2\vss}%
+ % \fi
+ % and don't change this any more
+% \doifdefinedelse{\strippedcsname\OTRSETstoreincolumnslot#1}
+% {\getvalue{\strippedcsname\OTRSETstoreincolumnslot#1}{#2}}
+% {\OTRSETstoreincolumnslotUNKNOWN{#2}}}
+ \executeifdefined{\strippedcsname\OTRSETstoreincolumnslot#1}
+ \OTRSETstoreincolumnslotUNKNOWN} % {#2}}
+
+\def\OTRSETstoreincolumnslotUNKNOWN#1%
+ {\OTRSETprepareforcolumnslot2{#1}\copy#1} % {} ?
+
+\def\OTRSETprepareforcolumnslot#1#2% 1=hoog 2=midden 3=laag
+ {\dp#2\zeropoint
+ \ifcase\columnslotspacing\else
+ \scratchdimen\columnslotspacing\lineheight
+ \ifnum#1=2 \scratchdimen2\scratchdimen \fi
+ \begingroup
+ \advance\scratchdimen\ht#2\relax
+ \ifdim\scratchdimen<\columnmaxcells\lineheight
+ \endgroup \setbox#2\vbox spread \scratchdimen \bgroup
+ \else
+ \endgroup \setbox#2\vbox to \columnmaxcells\lineheight \bgroup
+ \vskip\strutdepth
+ \fi
+ \ifnum#1>1\vss\fi
+ \box#2\relax
+ \ifnum#1<3\vss\fi
+ \egroup
+ \fi}
+
+\def\OTRSETdocheckiffloatfits % eigenlijk moet else float anders
+ {\global\ifnofloatpermitted\roomforfloatfalse\else\roomforfloattrue\fi}
+
+\def\OTRSETunpreparebox#1%
+ {\ifhbox#1% spans and so
+ \global\setbox\floatbox\vbox{\box#1}%
+ \else
+ \setbox\scratchbox\vbox
+ {\unvbox#1\unskip\unskip\unskip
+ \global\setbox\floatbox\lastbox}%
+ \fi}
+
+% for the moment resave is still needed here
+
+\def\OTRSETsavebox#1% clean up the skips
+ {\OTRSETunpreparebox{#1}%
+ \dofloatssave{text}}
+
+\def\OTRSETresavebox#1% clean up the skips
+ {\OTRSETunpreparebox{#1}%
+ \dofloatsresave{text}}
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+ {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETdoflushfloats
+ {\bgroup
+ \def\OTRSETsavebox##1{\!!doneafalse}%
+ \doloop
+ {\ifsomefloatwaiting
+ \OTRSETskipstart
+ \dofloatsgetinfo{text}%
+ \ifdim\floatwidth>\zeropoint
+ \!!doneatrue
+ \dofloatsflush{text}{1}%
+ \dp\floatbox\zeropoint
+ \OTRSETstoreincolumnslot{TBLR}\floatbox
+ \if!!donea
+ %\message{[flu]}%
+ \else
+ \OTRSETresavebox\floatbox
+ \exitloop
+ \fi
+ \else
+ %\message{[err]}% happens but why?
+ \fi
+ \else
+ \exitloop
+ \fi}
+ \egroup}
+
+\newif\ifcentergridcells \centergridcellstrue
+
+\newif\ifcentergridcellonly \centergridcellonlyfalse
+\newif\ifautocentergridcellonly \autocentergridcellonlytrue
+
+\def\OTRSETcentergridcells
+ {\ifcentergridcells
+ \dorecurse\nofcolumns
+ {\currenthcell\recurselevel
+ \ifautocentergridcellonly
+ % we prevent centering when the next column is empty
+ % to be checked ! ! ! !
+ \advance\currenthcell \plusone
+ \centergridcellonlytrue
+ \ifnum\currenthcell>\nofcolumns
+ % ok already
+ \else
+ % only span if there is a next column with content
+ \dorecurse\columnmaxcells
+ {\ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+ \centergridcellonlyfalse
+ \else\ifdim\dp\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+ \centergridcellonlyfalse
+ \fi\fi}%
+ \fi
+ \fi
+ \currenthcell\recurselevel
+ \dorecurse\columnmaxcells
+ {\currentvcell\recurselevel\relax
+ \ifdim\ht\OTRSETgridcell\currenthcell\currentvcell>\zeropoint
+ \ifdim\dp\OTRSETgridcell\currenthcell\currentvcell=\zeropoint
+ \bgroup
+ \setbox\scratchbox\OTRSETgetgridcell\currenthcell\currentvcell
+ \getnoflines{\ht\scratchbox}%
+ \!!counta\currentvcell
+ \advance\!!counta -\noflines
+ \advance\!!counta \plusone
+ % first col always ok
+ \!!countb\currenthcell
+ \!!countc\currenthcell
+ \advance\!!countc \plusone
+ \!!donebtrue
+ \ifcentergridcellonly
+ \!!countc\maxdimen
+ \fi
+ \dostepwiserecurse\!!countc\nofcolumns\plusone
+ {\if!!doneb
+ \let\xrecurselevel\recurselevel
+ \dostepwiserecurse\!!counta\currentvcell\plusone
+ {\ifdim\ht\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+ \!!donebfalse
+ \else\ifdim\wd\OTRSETgridcell\xrecurselevel\recurselevel>\zeropoint
+ \!!donebfalse
+ \fi\fi}%
+ \if!!doneb
+ \!!countb\xrecurselevel
+ \fi
+ \fi}%
+ \totalcolumnspace\OTRSETlocalwidth\currenthcell
+ \dostepwiserecurse\!!countc\!!countb\plusone
+ {\advance\totalcolumnspace \OTRSETlocalwidth\recurselevel
+ \advance\totalcolumnspace \OTRSETgetparameter\c!distance\recurselevel}%
+ \ifdim\totalcolumnspace>\wd\scratchbox
+ \setbox\scratchbox\hbox to \totalcolumnspace{\hss\box\scratchbox\hss}%
+ \fi
+ \OTRSETsetgridcell\currenthcell\currentvcell\box\scratchbox
+ \egroup
+ \fi
+ \fi}}%
+ \fi}
+
+\def\OTRSETinitializecolumns% once per page
+ {\columnspreadtrue % todo
+ \ifcolumnspread
+ \global\rofcolumns\getvalue{\??mc\OTRSETidentifier\c!nright}%
+ \global\lofcolumns\getvalue{\??mc\OTRSETidentifier\c!nleft}%
+ \global\tofcolumns\rofcolumns \relax
+ \ifodd\realpageno\relax
+ \global\nofcolumns\rofcolumns
+ \else
+ \global\advance\tofcolumns\lofcolumns
+ \global\nofcolumns\lofcolumns
+ \fi
+ \else
+ \global\nofcolumns\getvalue{\??mc\OTRSETidentifier\c!n}%
+ \global\rofcolumns\nofcolumns
+ \global\lofcolumns\nofcolumns
+ \global\tofcolumns\nofcolumns
+ \fi
+ \OTRSETassignwidths
+ \global\mofcolumns\plusone
+ \columnerasegridboxes}
+
+% vanaf hier:
+
+\unexpanded\def\definecolumnset
+ {\dodoubleargument\dodefinecolumnset}
+
+\def\dodefinecolumnset[#1][#2]%
+ {\getparameters[\??mc#1]
+ [\c!direction=\v!right,
+ \c!balance=\v!no,
+ \c!distance=1.5\bodyfontsize, % controleren
+ \c!n=2,
+ \c!nleft=\getvalue{\??mc#1\c!n},
+ \c!nright=\getvalue{\??mc#1\c!n},
+ \c!width=\v!fit,
+ \c!lines=0,
+ \c!start=0,
+ #2]%
+ \dorecurse{\getvalue{\??mc#1\c!nleft}} % todo
+ {\dododefinecolumnset[#1][\recurselevel]}%
+ \dorecurse{\getvalue{\??mc#1\c!nright}} % todo
+ {\dododefinecolumnset[#1][\recurselevel]}%
+ % redo framed settings
+ \setupcolumnset[#1][1][\c!distance=\!!zeropoint]}
+
+\def\dododefinecolumnset[#1][#2]%
+ {\presetlocalframed
+ [\??mc#1#2]%
+ \setupcolumnset
+ [#1][#2]
+ [\c!offset=\v!overlay,
+ \c!frame=\v!off,
+ \c!align=,
+ \c!lines=0,% really needed since c!regels is now part of framed
+ \c!width=\getvalue{\??mc#1\c!width},
+ \c!distance=\getvalue{\??mc#1\c!distance}]}
+
+\unexpanded\def\setupcolumnset
+ {\dotripleargument\dosetupcolumnset}
+
+\def\dosetupcolumnset[#1][#2][#3]%
+ {\ifthirdargument
+ \def\docommand##1%
+ {\doifelse{##1}\v!each
+ {\dorecurse{\getvalue{\??mc#1\c!n}}{\docommand\recurselevel}}
+ {\getparameters[\??mc#1##1][#3]}}%
+ \processcommalist[#2]\docommand
+ \else
+ \getparameters[\??mc#1][#2]%
+ \fi}
+
+\definecolumnset[\s!default][\c!n=2] % fallback
+
+\def\OTRSETgotonextpage
+ {\vfill\eject
+ \relax\ifnum\mofcolumns>\plusone
+ \OTRSETgotocolumn[\v!last]%
+ \ifnum\mofcolumns>\plusone
+ \OTRSETgotocolumn[\v!force]%
+ \fi
+ \fi}
+
+\let\OTRSETgotonextpageX\OTRSETgotonextpage % will become obsolete
+
+\def\OTRSETgotocolumn
+ {\dosingleempty\doOTRSETgotocolumn}
+
+\def\doOTRSETgotoCOLROW#1% <number>|<number>*<number>
+ {\bgroup % really needed
+ \splitstring#1\at*\to\column\and\row
+ \bgroup
+ \ifx\column\empty\else\expanded{\doOTRSETgotoCOLUMN{\column}}\fi
+ \egroup
+ \bgroup
+ \ifx\row \empty\else\expanded{\doOTRSETgotoROW {\row }}\fi
+ \egroup
+ \egroup}
+
+\def\doOTRSETgotoCOLUMN#1%
+ {\ifnum\mofcolumns=#1\else
+ \vfill\eject % \doejectpage\eject
+ \doloop
+ {\ifnum\mofcolumns=#1\relax
+ \exitloop \else \OTRSETdummycolumn
+ \fi}%
+ \fi}
+
+\def\doOTRSETgotoROW#1%
+ {\ifnum#1>1
+ \scratchcounter\zerocount
+ \currenthcell\mofcolumns
+ \currentvcell#1\advance\currentvcell \minusone
+ \dorecurse\currentvcell
+ {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+ {\advance\scratchcounter\plusone}}
+ \getnoflines\pagetotal
+ \advance\scratchcounter-\noflines
+ \ifnum\scratchcounter>\zerocount
+ \dorecurse\scratchcounter{\line{\strut}}%
+ \fi
+ \fi
+ \OTRSETsetvsize}
+
+\def\doOTRSETgotocolumn[#1]% yes|force|first|last|<number>|<number>*<number>
+ {\processallactionsinset
+ [#1]
+ [ \v!yes=>\OTRSETdummycolumn,
+ \v!no=>,% not supported
+ \v!force=>\OTRSETdummycolumn,
+ \v!first=>\expanded{\doOTRSETgotoCOLUMN{1}},
+ \v!last=>\expanded{\doOTRSETgotoCOLUMN{\the\nofcolumns}},
+ \s!default=>\OTRSETdummycolumn,
+ \s!unknown=>\expanded{\doOTRSETgotoCOLROW{\commalistelement}}]}
+
+% to be documented and tested, not yet that robust
+
+% \def\OTRSETgotocell#1#2%
+% {\endgraf
+% \gdef\gotocellcounter{0}%
+% \doloop
+% {\ifnum\mofcolumns<#1\relax
+% \doglobal\increment\gotocellcounter\relax
+% \ifnum\gotocellcounter>#1\relax
+% \line{\strut}\crlf
+% \line{\strut}\crlf
+% \column
+% \writestatus{columnset}{quitting goto cell}%
+% \exitloop
+% \else
+% \column
+% \fi
+% \else
+% \exitloop
+% \fi}%
+% \ifnum\mofcolumns=#1\relax
+% \ifnum#2>1
+% \scratchcounter\zerocount
+% \currenthcell\mofcolumns
+% \currentvcell#2\advance\currentvcell \minusone
+% \dorecurse\currentvcell
+% {\OTRSETdoifcellelse\mofcolumns\recurselevel\donothing
+% {\advance\scratchcounter\plusone}}
+% \getnoflines\pagetotal
+% \advance\scratchcounter-\noflines
+% \ifnum\scratchcounter>\zerocount
+% \dorecurse\scratchcounter{\line{\strut}}%
+% \fi
+% \fi
+% \fi
+% \OTRSETsetvsize}
+
+\def\OTRSETgotocell#1#2% obsolete: now \column[#1*#2]
+ {\endgraf
+ \doOTRSETgotoCOLUMN{#1}%
+ \doOTRSETgotoROW {#2}}
+
+\def\OTRSETdummycolumn
+ {\verticalstrut
+ \vskip-\struttotal
+ \vfill
+ \eject}
+
+\newcounter\columnsetlevel
+\let\currentcolumnset\empty
+\chardef\OTRSETfinish\zerocount
+
+\unexpanded\def\startcolumnset
+ {\dodoubleempty\dostartcolumnset}
+
+\def\dostartcolumnset[#1][#2]%
+ {\increment\columnsetlevel\relax
+ \globallet\localcolumnmaxcells\!!zerocount
+ \global\chardef\OTRSETfinish\zerocount
+ \resetOTRSETmarks
+ \ifnum\columnsetlevel=\plusone
+ \bgroup
+ \saveinterlinespace
+ \globallet\columnsetpage\!!plusone
+ \def\currentcolumnset{#2}%
+ \insidecolumnstrue % will be different flag in addition
+ \activateotr{SET}{ONE}% andere naam, activate or so
+ \doifelsenothing{#1}
+ {\globallet\OTRSETlist\s!default}
+ {\xdef\OTRSETlist{#1}}%
+ \OTRSETstartnextpage
+ \OTRSETassignwidths
+ \OTRSETsethsize
+ \else
+ \bgroup
+ \fi}
+
+% \setuplayout[grid=yes] \definecolumnset[example] \showgrid
+
+% \starttext
+% \startcolumnset[example]
+% \input knuth \endgraf \input knuth
+% \placetable{table}{\framed[width=\makeupwidth,height=4cm]{Hello}}
+% \input knuth \endgraf \input knuth
+% \stopcolumnset
+% \input knuth \endgraf \input knuth
+% \stoptext
+
+\def\OTRSETflushleftovers % new per 13/4/2006
+ {\OTRSETdoifcellelse{1}{1}
+ {\bgroup
+ \OTRSETcentergridcells
+ \chardef\OTRSETbalancemethod\plusone
+ \OTRSETreducegridbox
+ \global\setbox\OTRfinalpagebox\OTRSETmakegridbox
+ \global\ht\OTRfinalpagebox\textheight % signals output that there is content
+ \OTRSETdofinaloutput
+ \globallet\OTRSETbalht\zeropoint
+ \egroup}
+ {}}
+
+\unexpanded\def\stopcolumnset
+ {\relax
+ \ifnum\columnsetlevel=\plusone
+ \endgraf % needed, else wrong vsize in one par case
+ \global\chardef\OTRSETfinish\plusone
+ % no, extra page \pagebreak % (test on pascal toc)
+ \dostopcolumnset
+ \egroup
+ \global\notelimittrue % brrr, untested and fuzzy
+ \setvsize
+ \sethsize
+ \ifvoid\OTRfinalpagebox\else
+ % probably balanced
+ \ifdim\ht\OTRfinalpagebox<\textheight
+ \snaptogrid[\v!page]\hbox{\box\OTRfinalpagebox}%
+ \else
+ \box\OTRfinalpagebox
+ \fi
+ \fi
+ \global\chardef\OTRSETfinish\zerocount
+ \ifsomefloatwaiting \setvsize \pagebreak \setvsize \fi
+ \OTRSETflushleftovers
+ \else
+ \egroup
+ \fi
+ \decrement\columnsetlevel\relax}
+
+\chardef\OTRSETbalancemethod\zerocount
+
+\def\dostopcolumnset
+ {%\OTRSETdofinalflushfloats % yes/no
+ \ifcase\OTRSETbalancemethod
+ \OTRSETnobalance
+ \else
+ \OTRSETdobalance
+ \fi}
+
+\def\OTRSETdobalance
+ {\OTRSETnobalance}
+
+\def\localcolumnmaxcells{0}
+
+% currently line represents real line, i.e. on the grid, and
+% not something noflines (also, watch out for switching from
+% 2-3 columns on one page with both sets balanced: the
+% second set does not see the first set
+
+% don't loose empty 1page/1column with area (example **)
+%
+% \definecolumntextarea[title][x=1,y=4,nx=2,ny=7,state=start]
+% \setupcolumntextareatext[title][\vtop to 5cm{a\\b\\b\\d}]
+%
+% \starttext
+% \startcolumnset \dorecurse{1}{\input tufte \par} \stopcolumnset
+% \stoptext
+
+% better:
+
+\unexpanded\def\definecolumnsetarea {\definecolumntextarea}
+\unexpanded\def\setupcolumnsetarea {\setupcolumntextarea}
+\unexpanded\def\setupcolumnsetareatext{\setupcolumntextareatext}
+
+% so this will be changed
+
+\def\OTRSETnobalance
+ {\iflastcolumnfootnotes % testen ! optie
+ % inhibit flush of floats !
+ % todo: nothing if no footnotes, else empty page
+ \dostepwiserecurse\mofcolumns\nofcolumns\plusone
+ {\vskip-\struttotal\verticalstrut\vfill\eject}%
+ \else
+ \ifnum\mofcolumns>\plusone
+ \donetrue
+ \else\ifdim\pagetotal>\zeropoint % too dangerous, we loose data
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \ifnum\mofcolumns=\nofcolumns
+ \OTRSETflushfinalfootnotes
+ \else
+ % probably todo
+ \fi
+ \vfill
+ \eject
+\registerOTRSETmarks
+ % brr, may result in empty page after nicely fit text
+ % or if left, then lost of first column only text
+ \ifnum\mofcolumns>\plusone
+ \OTRSETdofinalflush
+ \OTRSETdofinaloutput
+ \fi
+ \fi
+ \fi}
+
+\def\OTRSETstartnextpage
+ {\doifsomething\OTRSETlist
+ {\getfromcommacommand[\OTRSETlist][1]%
+ \global\let\OTRSETidentifier\commalistelement
+ \doifundefined{\??mc\OTRSETidentifier\c!n}
+ {\globallet\OTRSETidentifier\s!default}%
+ \let\newcommalistelement\empty
+ \doglobal\replaceincommalist\OTRSETlist1%
+ \OTRSETrestart}}
+
+\def\OTRSETrestart % weed
+ {\OTRSETinitializefeatures
+ \OTRSETflushpreposttext
+ \OTRSETinitializecolumns
+ \OTRSETcheckinsert
+ \OTRSETcheckgrid
+ \OTRSETsetvsize
+ \OTRSETsethsize % or local ?
+ \OTRSETsetplaceholders
+ \OTRSEThandlepreposttext
+ \initializecolumntextareas % name !
+ \OTRSETcheckstartcells
+ \OTRSETsetvsize}
+
+\def\OTRSETcheckstartcells
+ {\dorecurse\nofcolumns
+ {\bgroup
+ \mofcolumns\recurselevel
+\OTRSETsetcorrectnofcells\currentcolumnstartcell
+\advance\scratchcounter \minusone
+ \dorecurse\scratchcounter
+ {\OTRSETdoifcellelse\mofcolumns\recurselevel
+ \donothing{\OTRSETsetgridcell\mofcolumns\recurselevel\copy\placeholderboxe}}%
+ \egroup}}
+
+\OTRSEToutput
+ {\dontcomplain % new, get rid of overfull message (to be sorted out)
+ \doloop
+ {\OTRSETnaturalflush
+ %\OTRSETstartnextpage % no
+ \OTRSETdoflushfloats % actually belongs in \flushsavedfloats (but goes wrong)
+ \OTRSETcheckfreelines
+ \ifsomefreecolumncells
+ \exitloop
+ \else
+ % flush page and get rid of more floats if present
+ \fi}%
+ \OTRSETchecksidefloat}
+
+\def\OTRSETinitializefeatures
+ {% number of lines
+ % new: raw
+ \getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}%
+ % direction
+ \doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right
+ {\chardef\columndirection\zerocount}
+ {\chardef\columndirection\plusone}%
+ % balancing
+ \chardef\OTRSETbalancemethod\zerocount
+ \processaction
+ [\getvalue{\??mc\OTRSETidentifier\c!balance}]
+ [ \v!yes=>\chardef\OTRSETbalancemethod\plusone,
+ \v!top=>\chardef\OTRSETbalancemethod\plustwo,
+ \v!bottom=>\chardef\OTRSETbalancemethod\plusthree]}
+
+% test:
+%
+% \definecolumnset[test-1] %[balance=yes]
+% \definecolumnset[test-2] %[balance=yes]
+%
+% \setupcolumnsetlines[test-1][1][1] [4]
+% \setupcolumnsetlines[test-1][1][2][10]
+%
+% \startcolumnset [test-1] \dorecurse {1}{\input tufte \par} \stopcolumnset
+% \startcolumnset [test-2] \dorecurse {2}{\input ward \par} \stopcolumnset
+
+\ifx\lastskipinotr\undefined \newskip\lastskipinotr \fi
+
+\installoutput\OTRSETflushpreposttext
+ {\global\setbox\precolumnbox\vbox
+ {\unvbox\normalpagebox
+ \global\lastskipinotr\lastskip}%
+ \ifdim\lastskipinotr>\zeropoint
+ \global\setbox\precolumnbox\hbox
+ {\lower\strutdepth\box\precolumnbox}%
+ \fi
+ \global\dp\precolumnbox\strutdepth
+ \ifcarryoverfootnotes \else
+ \global\setbox\postcolumnbox\vbox{\placebottomnotes}%
+ \fi}
+
+\let\precolumnlines \!!zerocount
+\let\postcolumnlines\!!zerocount
+
+\def\OTRSEThandlepreposttext
+ {\ifdim\ht\precolumnbox>\zeropoint % new
+ \getnoflines{\ht\precolumnbox}%
+ \edef\precolumnlines{\the\noflines}%
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxe}
+ \plusone\plusone\nofcolumns\noflines
+ % normal version (single column set)
+ % {\box\precolumnbox}%
+ % compensated for bodyfont change
+ {\hbox
+ {\OTRSETsetcorrectcellht
+ \raise\scratchdimen\box\precolumnbox}}%
+ \else
+ \let\precolumnlines\!!zerocount
+ \fi
+ \ifdim\ht\postcolumnbox>\zeropoint % new, otherwise empty bottom line
+ \getnoflines{\ht\postcolumnbox}%
+ \edef\postcolumnlines{\the\noflines}%
+ \advance\columnfreecells -\noflines
+ \advance\columnfreecells \plusone
+ \doOTRSETsetgridcells
+ {\copy\placeholderboxe}
+ \plusone\columnfreecells\nofcolumns\noflines
+ {\box\postcolumnbox}%
+ \else
+ \let\postcolumnlines\!!zerocount
+ \fi}
+
+\def\OTRSETchecksidefloat
+ {} % {\sidefloatoutput}
+
+\def\OTRSETfinalsidefloatoutput
+ {}
+
+\def\OTRSETcheckgrid
+ {\topskip1\topskip
+ \ifforcecolumngrid
+ \widowpenalty\zerocount
+ \clubpenalty\zerocount
+ \brokenpenalty\zerocount
+ \fi}
+
+\def\OTRSETcheckinsert
+ {\iflastcolumnfootnotes
+ \ifnum\nofcolumns=\mofcolumns
+ \OTRSETforceinserts
+ \else
+ \OTRSETinhibitinserts
+ \fi
+ \else
+ \OTRSETforceinserts
+ \fi}
+
+\def\OTRSETforceinserts
+ {\enablenotes}
+
+\def\OTRSETinhibitinserts
+ {\disablenotes}
+
+% interface to footnotes
+
+\def\OTRSETassignwidths
+ {%\scratchdimen\makeupwidth
+ \freezetextwidth \scratchdimen\textwidth
+ %
+ \scratchcounter\zerocount
+ \dorecurse\nofcolumns
+ {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+ {\advance\scratchcounter \plusone }
+ {\advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+ \advance\scratchdimen -\getvalue{\??mc\OTRSETidentifier\recurselevel\c!distance}}%
+ \ifcase\scratchcounter\else
+ \divide\scratchdimen \scratchcounter
+ \fi
+ \setgvalue{\??mc\??mc\c!width}{0}%
+ \dorecurse\nofcolumns
+ {\doifelsevalue{\??mc\OTRSETidentifier\recurselevel\c!width}\v!fit
+ {\dimen0=\scratchdimen}
+ {\setgvalue{\??mc\??mc\c!width}{1}%
+ \dimen0=\getvalue{\??mc\OTRSETidentifier\recurselevel\c!width}}%
+ \setxvalue{\??mc\recurselevel\??mc\c!width}{\the\dimen0}}}
+
+\def\OTRSETlocalwidth#1%
+ {\getvalue{\??mc\number#1\??mc\c!width}}
+
+\newbox\placeholderboxa
+\newbox\placeholderboxb
+\newbox\placeholderboxc
+\newbox\placeholderboxd
+\newbox\placeholderboxe
+\newbox\placeholderboxf
+
+\def\columnplaceholder#1#2%
+ {\hbox
+ {\setbox\scratchbox\hbox to \hsize
+ {\iftracecolumnset
+ \hskip-.5ex%
+ \startcolor[columnset:#2]\vrule\!!width1ex\!!height.5ex\!!depth.5ex\stopcolor
+ \fi
+ \hss}%
+ \ifcase#1\relax
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\zeropoint
+ \else
+ \wd\scratchbox\hsize
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \fi
+ \box\scratchbox}}
+
+\definepalet
+ [columnset]
+ [a=cyan,b=green,c=blue,d=red,e=magenta,f=darkgray]
+
+\def\OTRSETsetplaceholders
+ {\global\setbox\placeholderboxa\columnplaceholder0a%
+ \global\setbox\placeholderboxb\columnplaceholder0b%
+ \global\setbox\placeholderboxc\columnplaceholder0c%
+ \global\setbox\placeholderboxd\columnplaceholder0d%
+ \global\setbox\placeholderboxe\columnplaceholder0e%
+ \global\setbox\placeholderboxf\columnplaceholder1f}
+
+\def\doOTRSETshowstatus
+ {\llap{\tt\tfxx
+ \startcolor[blue](\the\vsize->\number\columnfirstcell\#\number\columnfreecells)\stopcolor
+ \hskip\leftskip}}
+
+\installtextracer{OTRSET} % low level
+
+\def\enabletextracerOTRSET {\tracecolumnsettrue \let\OTRSETshowstatus\doOTRSETshowstatus}
+\def\disabletextracerOTRSET{\tracecolumnsetfalse\let\OTRSETshowstatus\relax}
+
+\disabletextracerOTRSET
+
+% \appendtoks \OTRSETshowstatus \to \everypar
+
+% page contents
+
+\def\OTRSETdopagecontents#1#2% takes two args: \box<n> \unvbox<n>
+ {\vbox to \textheight{\forgetall#1#2}}
+
+\def\OTRSETsomepagefloat {\def\floatmethod{PAGE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeherefloat {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomeelsefloat {\def\floatmethod{HERE}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomefixdfloat {\def\floatmethod{FIXD}\OTRSETsomeslotfloat} % check
+\def\OTRSETsometopfloat {\def\floatmethod{TOPS}\OTRSETsomeslotfloat} % check
+\def\OTRSETsomebottomfloat{\def\floatmethod{BOTS}\OTRSETsomeslotfloat} % check
+
+\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
+ {\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
+
+\def\OTRSETsomeslotfloat[#1]%
+ {\setbox\floatbox\vbox{\flushfloatbox}%
+ \dp\floatbox\strutdp
+ \@EA\uppercasestring\floatmethod\to\floatmethod
+ \OTRSETstoreincolumnslot\floatmethod\floatbox
+ \doinsertfloatinfo}
+
+% kind of new, looks much like OTRONE, but not entirely
+
+\def\OTRSETdosettopinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \let\totaltopinserted\!!zeropoint
+ \OTRSETdodosettopinserts
+ \ifnum\@@bknbottom=\zerocount
+ \ifnum\@@bknlines>\zerocount
+ \ifdim\totaltopinserted>\zeropoint\relax
+ \dimen0\lineheight
+ \dimen0=\@@bknlines\dimen0
+ \advance\dimen0 \totaltopinserted\relax
+ \ifdim\dimen0>\textheight % \vsize %%%%%%%%% \textheight
+ \showmessage\m!floatblocks8{\@@bknlines}%
+ \vfilll\eject
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \egroup}
+
+\def\OTRSETdodosettopinserts
+ {\ifnum\noffloatinserts<\noftopfloats
+ \dogetfloat
+ \ifdim\topinserted=\zeropoint\relax
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \setbox\scratchbox\vbox % kan beter !
+ {\forgetall
+ \iftopofinsert
+ \ifdim\OTRSETtopoffset=\zeropoint
+ \moveongrid[\v!top]
+ \fi
+ \else
+ \betweenfloatblanko % inserts can't look back
+ \fi
+ \flushfloatbox
+ \blank[\@@bkspaceafter]}%
+ \global\advance\topinserted \ht\scratchbox\relax
+ \ifdim\topinserted>\vsize % was \textheight\relax
+ \OTRSETresavebox\floatbox
+ \noffloatinserts\noftopfloats\relax
+ \global\advance\topinserted -\ht\scratchbox
+ \let\OTRSETdodosettopinserts\relax % to be tested
+ \else
+ \xdef\totaltopinserted{\the\topinserted}%
+ \insert\topins{\forgetall\box\scratchbox}% interlineskip ?
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\noftopfloats\relax
+ \fi
+ \dofloatflushedinfo
+ \fi
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks6{\the\noftopfloats}%
+ \fi
+ \let\OTRSETdodosettopinserts\relax
+ \fi
+ \OTRSETdodosettopinserts}
+
+\def\OTRSETdosetbotinserts
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts\zerocount
+ \OTRSETdodosetbotinserts
+ \fi
+ \egroup}
+
+\def\OTRSETdodosetbotinserts
+ {\ifnum\noffloatinserts<\nofbotfloats\relax
+ \dogetfloat
+ \global\advance\botinserted \ht\floatbox\relax
+ \global\advance\botinserted \dp\floatbox\relax
+ \global\advance\botinserted \floattopskip\relax
+ \ifdim\botinserted<\pagegoal\relax
+ \insert\botins
+ {\forgetall
+ \blank[\@@bkspacebefore]%
+ \flushfloatbox}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts \plusone
+ \else
+ \noffloatinserts\nofbotfloats
+ \fi
+ \dofloatflushedinfo
+ \else
+ \OTRSETresavebox\floatbox
+ \noffloatinserts\nofbotfloats\relax
+ \fi
+ \global\nofloatpermittedtrue % vgl topfloats s!
+ \else
+ \ifsomefloatwaiting
+ \showmessage\m!floatblocks7{\the\nofbotfloats}%
+ \fi
+ \let\OTRSETdodosetbotinserts\relax
+ \fi
+ \OTRSETdodosetbotinserts}
+
+\let\OTRSETdosetbothinserts\relax
+
+\def\OTRSETdotopinsertions
+ {\ifvoid\topins\else
+ \ifvoid\columntopbox\mofcolumns
+ \columnsettopbox\mofcolumns\box\topins
+ \else
+ \columnsettopbox\mofcolumns\vbox % temp, must be better
+ {\forgetall
+ \offinterlineskip
+ \box\columntopbox\mofcolumns
+ \box\topins}
+ \fi
+ \fi
+ \global\topinserted\zeropoint\relax} % goes away
+
+\def\OTRSETdobotinsertions
+ {\ifvoid\botins \else
+ \columnsetbotbox\mofcolumns\box\botins
+% \else
+% \columnsetbotbox\mofcolumns\vbox % temp, must be better
+% {\forgetall
+% \offinterlineskip
+% \box\botins
+% \box\columnbotbox\mofcolumns}
+ \fi
+ \global\botinserted\zeropoint\relax} % goes away
+
+% set ipv text
+
+% left right 1 2 3 +1 +2 +3
+
+\let\columnleftareas \empty
+\let\columnrightareas\empty
+
+% links rechts => odd, even, n, named
+
+\unexpanded\def\definecolumntextarea
+ {\dotripleempty\dodefinecolumntextarea}
+
+\def\dodefinecolumntextarea[#1][#2][#3]% y=0 is mogelijke en handig !
+ {\ifthirdargument
+ \doifinsetelse{#2}{\v!both,\v!fixed}
+ {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]%
+ \definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+ {\doifelse{#2}\v!next
+ {\doifoddpageelse
+ {\definecolumntextarea[#1][\v!right][\c!type=#2,#3]}
+ {\definecolumntextarea[#1][\v!left ][\c!type=#2,#3]}}
+ {\presetlocalframed
+ [\??mt#1#2]%
+ \processaction[#2] % \doglobal voorkomt stack build up
+ [ \v!left=>\doglobal\addtocommalist{#1}\columnleftareas,
+ \v!right=>\doglobal\addtocommalist{#1}\columnrightareas]%
+ \getparameters[\??mt#1#2]
+ [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,\c!clipoffset=2\lineheight,
+ \c!leftoffset=\zeropoint,\c!rightoffset=\zeropoint,
+ \c!offset=\v!overlay,\c!strut=\v!no,\c!frame=\v!off,
+ \c!type=#2,\c!page=1,\c!state=\v!stop,#3]}}%
+ \else
+ \definecolumntextarea[#1][\v!next][#2]%
+ \fi}
+
+\unexpanded\def\setupcolumntextarea
+ {\dotripleempty\dosetupcolumntextarea}
+
+\def\dosetupcolumntextarea[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelse{#2}\v!both
+ {\setupcolumntextarea[#1][\v!left ][#3]%
+ \setupcolumntextarea[#1][\v!right][#3]}
+ {\doifelse{#2}\v!next
+ {\doifoddpageelse
+ {\setupcolumntextarea[#1][\v!right][#3]}
+ {\setupcolumntextarea[#1][\v!left][#3]}}
+ {\getparameters[\??mt#1#2][#3]}}%
+ \else
+ \setupcolumntextarea[#1][\v!next][#2]%
+ \fi}
+
+\def\docheckcolumnsetareapage#1#2%
+ {\ifnum\getvalue{\??mt#1\c!page}>\plusone
+ \doifelsevalue{\??mt#1\c!type}\v!fixed
+ {\ifnum\columnsetpage=\getvalue{\??mt#1\c!page}\relax
+ \donetrue\else\donefalse
+ \fi}
+ {\ifnum\columnsetpage<\getvalue{\??mt#1\c!page}\relax
+ \donefalse\else\donetrue
+ \fi}%
+ \else
+ \donetrue
+ \fi}
+
+\def\initializecolumntextareas
+ {\ifodd\realpageno
+ \doinitializecolumntextareas\columnrightareas\v!right
+ \else
+ \doinitializecolumntextareas\columnleftareas\v!left
+ \fi}
+
+\def\doinitializecolumntextareas#1#2%
+ {\def\docommand##1%
+ {\docheckcolumnsetareapage{##1#2}\plusone
+ \ifdone
+ \donefalse
+ \processaction
+ [\getvalue{\??mt##1#2\c!state}]
+ [ \v!start=>\donetrue,
+ \v!repeat=>\donetrue,
+ \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+ \ifdone\dodoinitializecolumntextareas{##1}{#2}\fi
+ \fi}%
+ \processcommacommand[#1]\docommand}
+
+\def\dodoinitializecolumntextareas#1#2%
+ {\doOTRSETsetgridcells
+ {\copy\placeholderboxd}
+ {\getvalue{\??mt#1#2\c!x }}{\getvalue{\??mt#1#2\c!y }}
+ {\getvalue{\??mt#1#2\c!nx}}{\getvalue{\??mt#1#2\c!ny}}
+ {\copy\placeholderboxd}}
+
+\unexpanded\def\placecolumntextareas
+ {\ifodd\realpageno
+ \doplacecolumntextareas\columnrightareas\v!right
+ \else
+ \doplacecolumntextareas\columnleftareas\v!left
+ \fi}
+
+\def\doplacecolumntextareas#1#2% global ?
+ {\bgroup
+ \forgetall
+ \def\docommand##1%
+ {\docheckcolumnsetareapage{##1#2}\zerocount
+ \ifdone
+ \donefalse
+ \processaction
+ [\getvalue{\??mt##1#2\c!state}]
+ [ \v!start=>\donetrue\doglobal\removefromcommalist{##1}#1,
+ \v!repeat=>\donetrue,
+ \s!unknown=>\doperformtest\commalistelement\donetrue\donefalse]%
+ \ifdone
+ \dodoplacecolumntextareas{##1}{#2}%
+ \else
+ \doglobal\removefromcommalist{##1}#1%
+ \fi
+ \fi}%
+ \processcommacommand[#1]\docommand
+ \egroup}
+
+% \page[left]
+% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer]
+% \setupcolumntextareatext[intro][left][\setups{intro}]
+% \flushcolumntextareas
+
+\def\flushcolumntextareas
+ {\initializecolumntextareas
+ \setvsize}
+
+\def\columntextlastbackspace{\backspace}
+
+% beware, we have clipping offsets of 2\lineheight by default
+
+\def\columntextareaparameter#1%
+ {\csname\??mt\currentcolumntestarea#1\endcsname}
+
+\def\dodoplacecolumntextareas#1#2%
+ {\def\currentcolumntestarea{#1#2}%
+ \!!counta\columntextareaparameter\c!x
+ \!!countb\columntextareaparameter\c!nx
+ \docalculatecolumnsetspan
+ \!!heighta\columntextareaparameter\c!ny\lineheight
+ % wrong
+ % \ifnum\columntextareaparameter\c!y=\zerocount
+ % \advance\!!heighta -\lineheight
+ % \advance\!!heighta \topskip
+ % \fi
+ % \advance\!!heighta -\lineheight % option
+ \ifnum\columntextareaparameter\c!y=\plusone
+ \advance\!!heighta -\lineheight
+ \advance\!!heighta \topskip
+ \fi
+ %
+ \setbox\scratchbox\vbox
+ {\donetrue\localframed
+ [\??mt\currentcolumntestarea]
+ [\c!location=,% new (*)
+ \c!width=\!!widtha,\c!height=\!!heighta,\c!lines=]
+ {\columntextareaparameter\empty}}%
+ \!!counta\columntextareaparameter\c!x
+ \!!countb\columntextareaparameter\c!y
+ \advance\!!countb \columntextareaparameter\c!ny
+ \advance\!!countb \minusone
+ % new (*)
+ \doif{\columntextareaparameter\c!location}\v!depth
+ {\setbox\scratchbox\hbox{\lower\strutdepth\box\scratchbox}%
+ \dp\scratchbox\zeropoint
+ \ht\scratchbox\!!heighta}%
+ %
+ \setbox0\hbox
+ {\ifcase\!!countc
+ \copy\scratchbox % \box
+ \else
+ \clip
+ [ %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!leftoffset=\columntextareaparameter\c!clipoffset,%
+ \c!offset=\columntextareaparameter\c!clipoffset,%
+ \c!offset=\columntextareaparameter\c!clipoffset,%
+ \c!rightoffset=\columntextareaparameter\c!rightoffset,%
+ \c!width=\!!widthb,%
+ \c!height=\!!heighta]%
+ {\copy\scratchbox}%
+ \fi}%
+ \OTRSETsetgridcell\!!counta\!!countb\box0
+ \ifcase\!!countc\else
+ \advance\!!counta \columntextareaparameter\c!nx
+ \advance\!!counta -\!!countc
+ \advance\!!widtha -\!!widthb
+ \setbox0\hbox
+ {\hskip-\namedlayoutparameter\v!odd\c!backspace
+ \clip
+ [ %\c!topoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!bottomoffset=\columntextareaparameter\c!clipoffset,%
+ %\c!rightoffset=\columntextareaparameter\c!clipoffset,%
+ \c!offset=\columntextareaparameter\c!clipoffset,%
+ \c!leftoffset=\columntextareaparameter\c!leftoffset,%
+ \c!width=\!!widtha,%
+ \c!height=\!!heighta,%
+ \c!hoffset=\!!widthb]%
+ {\copy\scratchbox}}%
+ \OTRSETsetgridcell\!!counta\!!countb\box0%
+ \fi}
+
+\unexpanded\def\setupcolumntextareatext
+ {\dotripleempty\dosetupcolumntextareatext}
+
+\long\def\dosetupcolumntextareatext[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelse{#2}\v!both
+ {\setvalue{\??mt#1\v!left }{#3}%
+ \setvalue{\??mt#1\v!right}{#3}}
+ {\doifelse{#2}\v!next
+ {\doifoddpageelse
+ {\setvalue{\??mt#1\v!right}{#3}}%
+ {\setvalue{\??mt#1\v!left }{#3}}}%
+ {\setvalue{\??mt#1#2}{#3}}}%
+ \else
+ \setupcolumntextareatext[#1][\v!next][{#2}]%
+ \fi}
+
+\def\docalculatecolumnsetspan
+ {% \!!counta <= x
+ % \!!countb <= nx
+ % \!!widtha => total width
+ % \!!widthb => left width
+ % \!!countc => left cols
+ \!!widtha\!!countb\textwidth % we assume equal widths
+ \advance\!!countb \!!counta
+ \advance\!!countb \minusone
+ \ifnum\!!countb>\nofcolumns
+ \!!countc\!!countb
+ \advance\!!countc -\nofcolumns
+ \!!countb\nofcolumns
+ \else
+ \!!countc\zerocount
+ \fi
+ \advance\!!counta \plusone
+ \dostepwiserecurse\!!counta\!!countb\plusone
+ {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+ \!!widthb\!!widtha
+ \advance\!!widthb -\!!countc\textwidth
+ \ifodd\realpageno \else % tricky, assumes that we keep there
+ \ifcase\!!countc\else
+ % nog niet ok voor enkel/doublesided
+ \advance\!!widtha \namedlayoutparameter\v!even\c!backspace
+ \advance\!!widtha \namedlayoutparameter\v!odd \c!backspace
+ \advance\!!widthb \namedlayoutparameter\v!even\c!backspace
+ \dorecurse\!!countc
+ {\advance\!!widtha\OTRSETgetparameter\c!distance\recurselevel}%
+ \fi
+ \fi}
+
+\def\columnsetspanhsize{\textwidth}
+
+\def\setcolumnsetspanhsize#1#2% x nx / uses counta/b
+ {\!!counta#1\!!countb#2\docalculatecolumnsetspan
+ \edef\columnsetspanhsize{\the\!!widtha}}
+
+\unexpanded\def\definecolumnsetspan
+ {\dodoubleempty\dodefinecolumnsetspan}
+
+\def\dodefinecolumnsetspan[#1][#2]%
+ {%\ifsecondargument
+ \defineframedtext
+ [cs:#1]
+ [\c!frame=\v!off,
+ \c!before=,
+ \c!after=,
+ \c!offset=\v!overlay,
+ \c!location=\v!left,
+ \c!linecorrection=\v!off,
+ \c!depthcorrection=\v!off,
+ \c!n=2,
+ \c!nlines=0,
+ \c!indenting=,
+ \c!indentnext=\v!yes,
+ \c!default=HERE,
+ \c!alternative=\v!a,
+ #2]%
+ %\else
+ % \definecolumnspan[][#1]%
+ }%\fi}
+
+\definecolumnsetspan[\s!default]
+
+\unexpanded\def\setupcolumnsetspan
+ {\dodoubleempty\dosetupcolumnsetspan}
+
+\def\dosetupcolumnsetspan[#1][#2]%
+ {\ifsecondargument
+ \setupframedtexts[cs:#1][#2]%
+ \else
+ \setupcolumnsetspan[\s!default][#1]%
+ \fi}
+
+\unexpanded\def\startcolumnsetspan
+ {\dotripleempty\dostartcolumnsetspan}
+
+%%%%%%%%%%%%%%%% TODO
+
+\def\dostartcolumnsetspan[#1][#2][#3]% [#3] gobbles space
+ {\endgraf % else rubish output if forgotten
+ \vskip \zeropoint % make sure otr is done, otherwise last line problems
+ \bgroup
+ \forgetall
+ \ifnum\columnsetlevel>\zerocount\else
+ % of course we needed a one-column fall back for tm
+ \columnsetspanhsize\hsize
+ \nofcolumns\plusone
+ \mofcolumns\plusone
+ \fi
+ \setupframedtexts[cs:#1]
+ [\c!width=\columnsetspanhsize,
+ \c!linecorrection=\v!off,
+ \c!depthcorrection=\v!off,
+ #2]%
+ % determine widths
+ \!!countc\framedtextparameter{cs:#1}\c!n
+ % \!!countd\numexpr(\nofcolumns-\mofcolumns+\plusone)%
+ \!!countd\nofcolumns
+ % n <= n of columns
+ \ifnum\!!countc>\!!countd \!!countc\!!countd \fi
+ \advance\!!countd -\mofcolumns
+ \advance\!!countd \plusone
+ % n <= n of available columns (alternative a)
+ \doif{\framedtextparameter{cs:#1}\c!alternative}\v!a
+ {\ifnum\!!countc>\!!countd \!!countc\!!countd \fi}%
+ % here it all starts
+ \setcolumnsetspanhsize\mofcolumns\!!countc % a/b used
+ \hsize\columnsetspanhsize
+ \setbox\scratchbox\vbox\bgroup
+ \dostartframedtext[cs:#1][\v!none]% geen nils placement
+ % spoils spacing : \vskip-\struttotal\par\verticalstrut\par
+ \ifnum\columnsetlevel>\zerocount
+ \framedtextparameter{cs:#1}\c!before
+ \fi
+ \unexpanded\def\stopcolumnsetspan{\dostopcolumnsetspan{#1}}}
+
+\def\dostopcolumnsetspan#1%
+ {\par
+ \verticalstrut
+ \kern-2\struttotal
+ \verticalstrut
+ \ifnum\columnsetlevel>\zerocount
+ \doifsomething{\framedtextparameter{cs:#1}\c!after}
+ {\framedtextparameter{cs:#1}\c!after
+ \kern\zeropoint}% otherwise blanks disappear, better be a switch
+ \else
+ \endgraf
+ \fi
+ \dostopframedtext
+ \egroup
+ \setbox\scratchbox\frozenhbox to \hsize
+ {\dontcomplain
+ \alignedline{\framedtextparameter{cs:#1}\c!location}\v!middle
+ {\lower\strutdepth\box\scratchbox}}%
+ \dp\scratchbox\zeropoint % else wrong snap insidefloat
+%
+% to be tested first (strange in grid mode)
+%
+% \setbox\scratchbox\frozenhbox to \hsize
+% {\dontcomplain
+% \chardef\alignstrutmode\zerocount
+% \alignedline{\framedtextparameter{cs:#1}\c!plaats}\v!midden
+% {\box\scratchbox}}%
+%
+ \ifinsidefloat
+ \box\scratchbox
+ \else\ifnum\columnsetlevel>\zerocount
+ % we only set \columnsetspacing when asked for, else bottom problems
+ % don't change this any more (test naw)
+ \chardef\columnslotspacing\framedtextparameter{cs:#1}\c!nlines\relax
+ % todo: nboven/onder & \chardef\columnslotlocation2
+ %\OTRSETstoreincolumnslotHERE\scratchbox
+ \edef\floatmethod{\framedtextparameter{cs:#1}\c!default}%
+ \@EA\uppercasestring\floatmethod\to\floatmethod
+ % todo : \v!here -> here enzovoorts
+ \OTRSETstoreincolumnslot\floatmethod\scratchbox
+ % watch out: no \dochecknextindentation{tag}
+ \checknextindentation[\framedtextparameter{cs:#1}\c!indentnext]%
+ \else
+ % of course we needed a one-column fall back for tm; brrr, the box has now too
+ % much height (try \ruledvbox); don't change this without testing techniek
+ \scratchdimen\ht\scratchbox
+ \advance\scratchdimen-\strutdp
+ \ht\scratchbox\scratchdimen
+ \framedtextparameter{cs:#1}\c!before
+ \snaptogrid\vbox{\box\scratchbox}%
+ \framedtextparameter{cs:#1}\c!after
+ \fi\fi
+ \egroup
+ \endgraf}
+
+% \startcolumnset[two]
+% \input tufte
+% \startcolumnsetspan[two][width=20cm,location=middle] \input tufte \stopcolumnsetspan
+% \startcolumnsetspan[two][default=btlr] \input tufte \stopcolumnsetspan
+% \input tufte \par
+% \input tufte \par
+% \startcolumnsetspan[two] \emptylines[5] \stopcolumnsetspan
+% \startcolumnsetspan[two] \input tufte \stopcolumnsetspan
+% \stopcolumnset
+
+\protect \endinput
+
+% extreme examples (1)
+%
+% \setupfloats[numbering=nocheck]
+%
+% \definecolumnset [first] [n=2,start=0]
+% \definecolumnset [next] [n=2,start=3]
+%
+% \setuptexttexts[\vbox to \textheight{\topskipcorrection \hsize\makeupwidth left \hfill right\vfill}]
+%
+% \setuphead[chapter][text=empty]
+%
+% \starttext
+%
+% \startcolumnset[first,next]
+% \placefigure[btrl]{}{}
+% \placefigure[tblr]{}{}
+% \chapter{thuan} \dorecurse{25}{\recurselevel: \input thuan \endgraf}
+% \stopcolumnset
+%
+% \startcolumnset[first,next]
+% \chapter{thuan} \dorecurse{25}{\input thuan \endgraf\placefigure{}{}}
+% \stopcolumnset
+
+\unprotect
+
+% only in columnsets
+
+% \def\cornerfigure
+% {\dotripleempty\docornerfigure}
+%
+% \def\docornerfigure[#1][#2][#3]% [layer] [location] [settings]
+% {\bgroup
+% \dowithnextbox
+% {\!!doneafalse
+% \!!donebfalse
+% \processallactionsinset
+% [\v!left,\v!bottom,#2]
+% [ \v!left=>\!!doneatrue ,
+% \v!right=>\!!doneafalse,
+% \v!top=>\!!donebtrue ,
+% \v!bottom=>\!!donebfalse]%
+% \!!widtha\nextboxwd
+% \if!!donea
+% % unchecked
+% \advance\!!widtha-\backspace
+% \else
+% % unchecked
+% \advance\!!widtha-\backspace
+% \fi
+% \!!widtha\textwidth % could be an option
+% \!!heighta\nextboxht
+% % zou een macro moeten zijn \getnoflayoutlines
+% \ifnum\layoutparameter\c!lines=\zerocount
+% \getnoflines\textheight
+% \else
+% \noflines\layoutparameter\c!lines
+% \fi
+% %
+% \advance\noflines \plusone % wordt default, instelbaar
+% \!!heightb\noflines\lineheight\relax
+% \if!!doneb % boven
+% % unchecked
+% \advance\!!heighta-\topspace
+% \advance\!!heighta-\headerheight
+% \advance\!!heighta-\headerdistance
+% \else % onder
+% % checked
+% \advance\!!heighta-\paperheight
+% \advance\!!heighta+\!!heightb
+% \advance\!!heighta+\topspace
+% \advance\!!heighta+\headerheight
+% \advance\!!heighta+\headerdistance
+% \advance\!!heighta-\footerdistance
+% \advance\!!heighta-\footerheight
+% \fi
+% \getnoflines\!!heighta
+% \!!heighta\noflines\lineheight\relax
+% \def\docornerfigure[####1]%
+% {\expanded{\plaatsfiguur[####1,\v!none]{}
+% {\noexpand\phantombox[\c!width=\the\!!widtha,\c!height=\the\!!heighta]}}}%
+% \if!!donea
+% \if!!doneb % links boven / rb
+% \setlayer[#1]
+% [\c!corner={\v!left,\v!top},\c!location=rb,#3]
+% {\flushnextbox}%
+% \docornerfigure[tblr]%
+% \else % links onder / rt
+% \setlayer[#1]
+% [\c!corner={\v!left,\v!bottom},\c!location=rt,#3]
+% {\flushnextbox}%
+% \docornerfigure[btlr]%
+% \fi
+% \else
+% \if!!doneb % rechts boven / lt
+% \setlayer[#1]
+% [\c!corner={\v!right,\v!top},\c!location=lb,#3]
+% {\flushnextbox}%
+% \docornerfigure[tbrl]%
+% \else % rechts onder / lb
+% \setlayer[#1]
+% [\c!corner={\v!right,\v!bottom},\c!location=lt,#3]
+% {\flushnextbox}%
+% \docornerfigure[btrl]%
+% \fi
+% \fi
+% \egroup}
+% \vbox}
diff --git a/tex/context/base/page-sid.mkii b/tex/context/base/page-sid.mkii
new file mode 100644
index 000000000..0848c9d8c
--- /dev/null
+++ b/tex/context/base/page-sid.mkii
@@ -0,0 +1,931 @@
+%D \module
+%D [ file=page-sid,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Side Floats,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Side Floats}
+
+\unprotect
+
+% problem: when too small, side effects; we need to determine the
+% shift earlier so that we can act when shift < size
+%
+% \definefloat[edgefigure]
+% \setupfloat
+% [edgefigure]
+% [rightmargindistance=-\rightmargintotal,
+% leftmargindistance=-\rightmargintotal,
+% default=outer]
+% \starttext
+% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte
+% \stoptext
+
+% todo: dimexpr an dnumexpr
+
+% These macro deal with side floats. We started with Daniel
+% Comenetz macros as published in TUGBoat Volume 14 (1993),
+% No.\ 1: Anchored Figures at Either Margin. I extended and
+% patched the macros to suite our needs which results in a
+% messy module. Therefore, this module badly needs an update
+% because it's now a mixture of old and new macros.
+
+% afhankelijke variabelen
+%
+% \overgap vervangen door \floatsidetopskip
+% \sidegap vervangen door \floatsideskip
+% \undergap vervangen door \floatsidebottomskip
+%
+% \prskp vervangen door \ctxparskip
+
+% toegevoegde macro's/aanroepen
+%
+% \logsidefloat : loginformatie
+% \flushsidefloats : nodig voor koppen
+
+% recente wijzigingen:
+%
+% namen aangepast: \float... enz. i.p.v. \pic
+
+% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}}
+% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval
+% begint de tekst terecht wat lager.
+
+\newdimen\sidefloatheight % includes the topskip
+\newdimen\sidefloatwidth
+\newdimen\sidefloathsize
+\newdimen\sidefloatshift
+\newdimen\sidefloatextrashift
+\newdimen\sidefloatvsize \def\nofloatvsize{-1pt }
+\newdimen\sidefloatprogress
+\newdimen\sidefloatpagetotal
+
+\newbox\floatbottom
+
+\newcount\sidefloatsidelines
+\newcount\sidefloatlinesdone
+
+% 1 = backspace
+% 2 = leftedge
+% 3 = leftmargin
+% 4 = leftside
+% 5 = rightside
+% 6 = rightmargin
+% 7 = rightedge
+% 8 = cutspace
+
+\chardef\sidefloattype\zerocount
+
+\def\backspacefloat {\global\chardef\sidefloattype1 \putsidefloat}
+\def\leftedgefloat {\global\chardef\sidefloattype2 \putsidefloat}
+\def\leftmarginfloat {\global\chardef\sidefloattype3 \putsidefloat}
+\def\leftfloat {\global\chardef\sidefloattype4 \putsidefloat}
+\def\rightfloat {\global\chardef\sidefloattype5 \putsidefloat}
+\def\rightmarginfloat {\global\chardef\sidefloattype6 \putsidefloat}
+\def\rightedgefloat {\global\chardef\sidefloattype7 \putsidefloat}
+\def\cutspacefloat {\global\chardef\sidefloattype8 \putsidefloat}
+
+\let\marginfloat \cutspacefloat
+
+\newif\ifroomforfloat
+\newif\iffloatshort
+\newif\iffloatflag
+\newif\iffloatrighteqo
+\newif\iffloatlefteqo
+
+\newdimen\sidefloatleftskip
+\newdimen\sidefloatrightskip
+\newdimen\sidefloatmaximum
+
+% \def\checksidefloatshift
+% {\ifdim\sidefloatmaximum>\zeropoint
+% \ifcase\sidefloattype
+% % invalid
+% \or
+% % backspace
+% \or
+% \global\sidefloatshift-\sidefloatmaximum
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance \rightedgedistance
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+% \or
+% \global\sidefloatshift-\sidefloatmaximum
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+% \or
+% % left
+% \or
+% % right
+% \or
+% \global\sidefloatshift-\sidefloatmaximum
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+% \or
+% \global\sidefloatshift-\sidefloatmaximum
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftedgedistance \rightedgedistance
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+% \global\advance\sidefloatshift-\rightorleftpageaction \leftmargindistance \rightmargindistance
+% \or
+% % cutspace
+% \fi
+% \fi}
+
+\def\checksidefloatshift
+ {\ifdim\sidefloatmaximum>\zeropoint
+ \ifcase\sidefloattype
+ % invalid
+ \or
+ % backspace
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftedgedistance \rightedgedistance
+ -\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ % left
+ \or
+ % right
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftedgedistance \rightedgedistance
+ -\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ % cutspace
+ \fi
+ \fi}
+
+% \def\setsidefloatskips
+% {\global\sidefloatrightskip\zeropoint
+% \global\sidefloatleftskip \zeropoint
+% \ifcase\sidefloattype
+% \or % backspace
+% \global \sidefloatleftskip \rightorleftpageaction \backspace \cutspace
+% \or % leftedge
+% \global \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
+% \global\advance\sidefloatleftskip \rightorleftpageaction \leftmarginwidth\rightmarginwidth
+% \global\advance\sidefloatleftskip \rightorleftpageaction \leftedgedistance\rightedgedistance
+% \or % leftmargin
+% \global \sidefloatleftskip \rightorleftpageaction \leftmargindistance\rightmargindistance
+% \or % leftside
+% \or % rightside
+% \or % rightmargin
+% \global \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
+% \or % rightedge
+% \global \sidefloatrightskip\rightorleftpageaction \rightmargindistance\leftmargindistance
+% \global\advance\sidefloatrightskip\rightorleftpageaction \rightmarginwidth\leftmarginwidth
+% \global\advance\sidefloatrightskip\rightorleftpageaction \rightedgedistance\leftedgedistance
+% \or % cutspace
+% \global \sidefloatrightskip\rightorleftpageaction \cutspace\backspace
+% \fi
+% \ifdim\sidefloatrightskip>\zeropoint
+% \doglobal\advance\sidefloatrightskip\rightskip
+% \fi
+% \ifdim\sidefloatleftskip>\zeropoint
+% \doglobal\advance\sidefloatleftskip\leftskip
+% \fi}
+
+
+% use \outermarginwidth etc here
+
+\def\setsidefloatskips
+ {\global\sidefloatrightskip\zeropoint
+ \global\sidefloatleftskip \zeropoint
+ \ifcase\sidefloattype
+ \or % backspace
+ \global\sidefloatleftskip\dimexpr
+ +\rightorleftpageaction \backspace \cutspace
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % leftedge
+ \global\sidefloatleftskip\dimexpr
+ +\rightorleftpageaction \leftmargindistance \rightmargindistance
+ +\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+ +\rightorleftpageaction \leftedgedistance \rightedgedistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % leftmargin
+ \global\sidefloatleftskip\dimexpr
+ +\rightorleftpageaction \leftmargindistance \rightmargindistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % leftside
+ \or % rightside
+ \or % rightmargin
+ \global\sidefloatrightskip\dimexpr
+ +\rightorleftpageaction \rightmargindistance \leftmargindistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % rightedge
+ \global\sidefloatrightskip\dimexpr
+ +\rightorleftpageaction \rightmargindistance \leftmargindistance
+ +\rightorleftpageaction \rightmarginwidth \leftmarginwidth
+ +\rightorleftpageaction \rightedgedistance \leftedgedistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % cutspace
+ \global\sidefloatrightskip\dimexpr
+ +\rightorleftpageaction \cutspace \backspace
+ +\compensatedinnermakeupmargin
+ \relax
+ \fi
+ \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi
+ \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip \fi}
+
+% eq is still crap
+
+\ifx\normalleqno\undefined
+
+ \let\floatrighteqo=\eqno
+ \let\floatleftleqo=\leqno
+
+\else
+
+ \let\floatrighteqo=\normaleqno
+ \let\floatleftleqo=\normalleqno
+
+\fi
+
+% Watch it even more! In inner, gaat't mis omdat daar
+% pagetotal enz niet zijn aangepast. Inner kan overigens niet
+% betrouwbaar worden getest!
+
+% \def\flushsidefloats%
+% {\par
+% \sidefloatprogress=\sidefloatvsize
+% \advance\sidefloatprogress by -\pagetotal
+% \ifdim\sidefloatprogress>\zeropoint
+% \witruimte % nog checken op interferentie
+% \kern\sidefloatprogress
+% \fi
+% \global\sidefloatvsize=\nofloatvsize
+% \global\floatflagfalse}
+%
+% no, too buggy, leads to top of page crap
+%
+%\def\flushsidefloats
+% {\par
+% \dochecksidefloat
+% \scratchcounter=-\hangafter
+% \dorecurse{\scratchcounter}{\strut\hfill\strut\par}}
+%
+%\def\flushsidefloats
+% {\par
+% \!!heighta\sidefloatvsize
+% \advance\!!heighta -\pagetotal
+% \ifdim\!!heighta>\zeropoint
+% % to be checked for interference
+% \witruimte
+% % will be option
+% \getnoflines\!!heighta
+% \!!heighta\noflines\lineheight
+% % so far for option
+% \kern\!!heighta
+% \fi
+% % == \forgetsidefloats
+% \global\sidefloatvsize\nofloatvsize
+% \global\floatshortfalse
+% \global\floatflagfalse}
+
+% \def\flushsidefloats
+% {\par
+% \!!heighta\sidefloatvsize
+% \advance\!!heighta -\pagetotal
+% \ifdim\!!heighta>\zeropoint
+% % to be checked for interference
+% \witruimte
+% % will be option
+% \getnoflines\!!heighta
+% \!!heighta\noflines\lineheight
+% % so far for option
+% \ifdim\sidefloatbottomskip>\zeropoint\relax
+% \ifdim\!!heighta>\sidefloatbottomskip
+% \advance\!!heighta-\sidefloatbottomskip
+% \kern\!!heighta
+% \vskip\sidefloatbottomskip
+% \else
+% \kern\!!heighta
+% \fi
+% \else
+% \kern\!!heighta
+% \fi
+% \fi
+% % == \forgetsidefloats
+% \global\sidefloatvsize\nofloatvsize
+% \global\floatshortfalse
+% \global\floatflagfalse}
+
+\newif\iftracesidefloats
+
+\def\flushsidefloats
+ {\par
+ \!!heighta\sidefloatvsize
+ \advance\!!heighta -\pagetotal
+ \ifnum\!!heighta>\zeropoint
+ \global\advance\sidefloatvsize -\sidefloatbottomskip
+ \ifdim\!!heighta>\zeropoint
+ \bgroup
+ \let\flushsidefloats\relax
+ \forgetall
+ \doloop
+ {\strut
+ \iftracesidefloats
+ \color[darkgray]%
+ {\baselinerulefalse
+ \boxrulewidth.5\points
+ \ruledhbox{\strut\kern\sidefloatwidth}}%
+ \fi
+ \par
+ \!!heighta\sidefloatvsize
+ \advance\!!heighta -\pagetotal
+ \ifdim\!!heighta>\zeropoint
+ \ifnum\recurselevel>\plushundred
+ \exitloop
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \egroup
+ \ifdim\parskip>\zeropoint
+ \ifdim\sidefloatbottomskip>\parskip
+ \nowhitespace
+ \vskip\sidefloatbottomskip
+ \fi
+ \fi
+ \else\ifdim\sidefloatbottomskip>\parskip
+ \vskip\sidefloatbottomskip
+ \fi\fi
+ \fi
+ % not entirely the same as \forgetsidefloats
+ \global\sidefloatvsize\nofloatvsize
+ % \global\sidefloatsidelines\zerocount % no, we flush before a side float
+ \global\floatshortfalse % so this will get lost
+ % also here if used at all \global\holdinginserts\zerocount
+ \global\floatflagfalse}
+
+\def\flushsidefloatsafterpar
+ {\xdef\oldpagetotal{\the\pagetotal}%
+ \gdef\checksidefloat
+ {\dochecksidefloat
+ \ifdim\oldpagetotal=\pagetotal \else
+ \global\let\checksidefloat\dochecksidefloat
+ \flushsidefloats
+ \global\sidefloatsidelines\zerocount % here !
+ \fi}}
+
+\def\forgetsidefloats
+ {\global\sidefloatvsize\nofloatvsize
+ \global\sidefloatsidelines\zerocount
+ % also here if used at all \global\holdinginserts\zerocount
+ \global\floatshortfalse
+ \global\floatflagfalse}
+
+\let\logsidefloat=\relax
+
+\def\pushpenalties % needed ? and right
+ {\widowpenalty\plusone
+ \clubpenalty\plustwo
+ \brokenpenalty\plusone
+ \let\pushpenalties\relax
+ \edef\poppenalties
+ {\widowpenalty \the\widowpenalty
+ \clubpenalty \the\clubpenalty
+ \brokenpenalty\the\brokenpenalty
+ \let\poppenalties\relax}}
+
+% shouldn;t that be:
+%
+% \def\pushpenalties % needed?
+% {\let\pushpenalties\relax
+% \edef\poppenalties
+% {\widowpenalty \the\widowpenalty
+% \clubpenalty \the\clubpenalty
+% \brokenpenalty\the\brokenpenalty
+% \let\poppenalties\relax}%
+% \widowpenalty\plusone
+% \clubpenalty\plustwo
+% \brokenpenalty\plusone}
+
+\let\poppenalties=\relax
+
+\def\restorepenalties
+ {\ifnum\outputpenalty=\!!tenthousand\else
+ \penalty\outputpenalty
+ \fi}
+
+\def\sidefloatoutput
+ {\iffloatshort
+ \unvbox\normalpagebox
+ \setbox\floatbottom\lastbox
+ \ifdim\wd\floatbottom>\sidefloathsize
+ \penalty-201
+ \box\floatbottom
+ \else
+ \ifvoid\floatbottom
+ \else
+ \restoreleftindent
+ \ifdim\wd\floatbottom<\sidefloathsize
+ \parskip\zeropoint
+ %\noindent
+ \ifinner\else\vadjust{\penalty\minusone}\fi
+ \iffloatlefteqo
+ \global\floatlefteqofalse
+ \else
+ \global\advance\sidefloathsize -\wd\floatbottom
+ \iffloatrighteqo
+ \global\floatrighteqofalse
+ \else
+ \global\divide\sidefloathsize \plustwo
+ \fi
+ \hskip\sidefloathsize
+ \fi
+ \fi
+ \box\floatbottom
+ \restorepenalties
+ \fi
+ \fi
+ % why was this \global\holdinginserts\zerocount
+ \global\floatshortfalse
+ \else
+ \finalsidefloatoutput % new
+ \global\sidefloatvsize\nofloatvsize
+ \global\sidefloatsidelines\zerocount
+ % we can end up in fig lock, so \global\holdinginserts\zerocount here too ?
+ \poppenalties
+ \fi}
+
+\def\finalsidefloatoutput% new
+ {\finaloutput\unvbox\normalpagebox}
+
+\def\restoreleftindent
+ {\relax \ifnum\sidefloattype>4 \else
+ \parskip\zeropoint % here ?
+ \ifdim\sidefloatwidth>\zeropoint % new, see prikkels
+ \noindent
+ \ifinner\else\vadjust{\penalty\minusone}\fi
+ \hskip\sidefloatwidth
+ %\else
+ % we have a margin or edge float
+ \fi
+ \fi}
+
+\ifx\normaleqno\undefined
+
+ \def\normaleqno
+ {\iffloatshort
+ \global\floatrighteqotrue
+ \fi
+ \floatrighteqo}
+
+\else
+
+ \def\eqno
+ {\iffloatshort
+ \global\floatrighteqotrue
+ \fi
+ \floatrighteqo}
+
+\fi
+
+% externfiguur -> grid =ja|hoogte|diepte|halveregel|passend -> helemaal in details
+% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'
+
+% replacement for below
+%
+% \global\setbox\floatbox\hbox % no \hskip, but \kern here
+% {\ifcase\sidefloattype
+% \vbox{#1}%
+% \or % 1
+% \hskip\sidefloatleftshift
+% \hskip\sidefloatshift
+% \vbox{#1}%
+% \kern-\sidefloatextrashift
+% \or % 2
+% \hskip\sidefloatshift
+% \vbox{#1}%
+% \kern-\sidefloatextrashift
+% \or % 3
+% \hskip\sidefloatshift
+% \vbox{#1}%
+% \kern-\sidefloatextrashift
+% \or % 4
+% \hskip\sidefloatleftshift
+% \hskip\sidefloatshift
+% \vbox{#1\removedepth}%
+% \kern-\sidefloatextrashift
+% \or % 5
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \kern\sidefloatrightshift
+% \or % 6
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \or % 7
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \or % 8
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \kern\sidefloatrightshift
+% \fi}%
+%
+% keep this ^
+
+\def\putsidefloat#1% grid (4) is rather experimental
+ {\par
+ \whitespace
+ % moved here dec 2001
+ {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved
+ \checksidefloatshift
+ \ifdim\sidefloatshift=\zeropoint \relax
+ \ifnum\sidefloattype=4
+ \global\advance\sidefloatshift\sidefloatextrashift
+ \global\sidefloatextrashift\zeropoint
+ \else\ifnum\sidefloattype=5
+ \global\advance\sidefloatshift\sidefloatextrashift
+ \global\sidefloatextrashift\zeropoint
+ \fi\fi
+ \else
+ \ifnum\sidefloattype<4
+ \global\chardef\sidefloattype4
+ \else\ifnum\sidefloattype>5
+ \global\chardef\sidefloattype5
+ \fi\fi
+ \fi
+ \previoussidefloat
+ \stallsidefloat
+ %\global\setbox\floatbox\hbox
+ % {\ifmarginfloat\else\ifrightfloat\else\kern\sidefloatleftshift\fi\fi
+ % \hskip\ifrightfloat-\sidefloatextrashift\else\sidefloatshift\fi
+ % \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
+ % \kern\ifrightfloat\sidefloatshift\else-\sidefloatextrashift\fi
+ % \ifmarginfloat\else\ifrightfloat\kern\sidefloatrightshift\fi\fi}%
+ \global\setbox\floatbox\hbox % no \hskip, but \kern here
+ {\ifnum\sidefloattype=4
+ \hskip\sidefloatleftshift
+ \else\ifnum\sidefloattype=1
+ \hskip\sidefloatleftshift
+ \fi\fi
+ \ifnum\sidefloattype>4
+ \hskip-\sidefloatextrashift
+ \else
+ \hskip\sidefloatshift
+ \fi
+ \vbox{#1\ifnum\sidefloatalign=4 \removedepth\fi}%
+ \ifnum\sidefloattype>4
+ \kern\sidefloatshift
+ \else
+ \kern-\sidefloatextrashift
+ \fi
+ \ifnum\sidefloattype=8
+ \kern\sidefloatrightshift
+ \else\ifnum\sidefloattype=5
+ \kern\sidefloatrightshift
+ \fi\fi}%
+ \ifnum\sidefloatalign=4
+ \getnoflines{\ht\floatbox}%
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen-\strutdepth
+ \getrawnoflines\sidefloattopskip
+ \advance\scratchdimen\noflines\lineheight
+ % todo: maybe rounding problem here
+ % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}%
+ \global\setbox\floatbox\hbox{\lower\strutdepth\box\floatbox}%
+ \global\ht\floatbox\scratchdimen
+ \global\dp\floatbox\zeropoint
+ \fi
+ \ifcase\sidefloatalign \else
+ \global\sidefloattopskip\zeropoint
+ \fi
+ \scratchdimen
+ \ifnum\sidefloattype<4
+ \sidefloattopskip
+ \else\ifnum\sidefloattype>5
+ \sidefloattopskip
+ \else
+ \zeropoint
+ \fi\fi
+ % the top of the box is at the previous baseline
+ \ifcase\sidefloatalign
+ % 0 normal
+ \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+ \or % 1 height
+ \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+ \or % 2 line
+ \or % 3 depth
+ \advance\scratchdimen\lineheight
+ \advance\scratchdimen\strutdepth
+ \or % 4 grid
+ \scratchdimen\zeropoint
+ \or
+ \advance\scratchdimen\strutheight
+ \fi
+ % new
+ \global\sidefloatlinesdone\zerocount
+ \ifnum\sidefloatsidelines>\zerocount
+ \advance\scratchdimen\sidefloatsidelines\lineheight
+ \fi
+ % new
+ \global\setbox\floatbox\hbox
+ {\vbox
+ {\vskip\scratchdimen
+ \nointerlineskip
+ \box\floatbox
+ \ifnum\sidefloatalign=5 \vskip-\lineheight \fi}}%
+ \ifnum\sidefloattype<4
+ \global\sidefloattopskip\zeropoint
+ \else\ifnum\sidefloattype>5
+ \global\sidefloattopskip\zeropoint
+ \fi\fi
+ \global\sidefloatdownshift\zeropoint
+ \measuresidefloat
+ \ifroomforfloat \else
+ \tosssidefloat
+ \measuresidefloat
+ \stallsidefloat
+ \fi
+ \setsidefloat}
+
+\def\progresssidefloat
+ {\sidefloatprogress\sidefloatvsize
+ \iffloatflag
+ \advance\sidefloatprogress -\sidefloatpagetotal
+ \global\floatflagfalse
+ \else
+ \advance\sidefloatprogress -\pagetotal
+ \fi}
+
+\def\tosssidefloat
+ {\vfill\eject}
+
+\def\measuresidefloat
+ {\global\floatflagtrue
+ \global\sidefloatpagetotal \pagetotal % global
+ \ifnum\sidefloattype<4
+ \global \sidefloatwidth \zeropoint
+ \else\ifnum\sidefloattype>5
+ \global \sidefloatwidth \zeropoint
+ \else
+ \global \sidefloatwidth \wd\floatbox
+ \global\advance\sidefloatwidth \floatsideskip
+ \fi\fi
+ \ifdim\sidefloatwidth<\zeropoint
+ \global\sidefloatwidth\zeropoint
+ \fi
+ \global \sidefloathsize \hsize
+ \global\advance\sidefloathsize -\sidefloatwidth
+ \global \sidefloatheight \ht\floatbox
+ \global\advance\sidefloatheight \dp\floatbox
+ \global\advance\sidefloatheight \sidefloattopskip
+ \global \sidefloatvsize \sidefloatheight
+ \global\advance\sidefloatvsize \sidefloatpagetotal
+ \dimen0\sidefloatvsize
+ \dimen2\pagegoal
+ \relax
+ \ifcase\sidefloatmethod
+ % method 0 : raw
+ \or
+ % method 1 : safe
+ \dimen2 .99\pagegoal
+ \or
+ % method 2 : tight
+ \advance\dimen0 -\onepoint
+ \fi
+ \relax % really needed ! ! ! !
+ \ifdim\dimen0>\dimen2
+ \global\roomforfloatfalse
+ \else
+ \dimen0=\pagegoal
+ \advance\dimen0 -\sidefloatvsize
+ \ifdim\dimen0<\sidefloatbottomskip
+ \global\advance\sidefloatvsize \dimen0
+ \global\floatshorttrue
+ \pushpenalties
+ % why was this \global\holdinginserts\plusone
+ \else
+ \global\advance\sidefloatvsize \sidefloatbottomskip
+ \global\floatshortfalse
+ \fi
+ \global\roomforfloattrue
+ \fi}
+
+\def\setsidefloat% nilling everypar saves time and redudant pos's
+ {% removed here dec 2001
+ % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}%
+ \ifnum\sidefloattype=4 \kern\sidefloattopskip \fi
+ \ifnum\sidefloattype=5 \kern\sidefloattopskip \fi
+ \edef\presidefloatdepth{\the\prevdepth}%
+ \nointerlineskip
+ \bgroup
+ \everypar\emptytoks
+ \parskip\zeropoint
+ %\checksidefloatshift
+ \setsidefloatskips
+ \logsidefloat
+ \relax
+ \ifcase\sidefloattype
+ % invalid
+ \or % backspace
+ \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill
+ \or % leftedge
+ \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+ \or % leftmargin
+ \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+ \or % leftside
+ \noindent\box\floatbox\hfill
+ \or % rightside
+ \hfill\box\floatbox
+ \or % rightmargin
+ \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+ \or % rightedge
+ \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+ \or % cutspace
+ \hfill\rlap{\hskip\sidefloatrightskip\llap{\box\floatbox}}%
+ \fi
+ \egroup
+ \par
+ \kern-\sidefloatheight
+ \penalty10001 % oeps, this will change
+ \normalbaselines
+ \prevdepth\presidefloatdepth
+ % \noindent
+ \resetsidefloatparagraph
+ \ignorespaces} % not really needed
+
+\newcount\sidefloatparagraph
+
+\def\iffirstsidefloatparagraph
+ {\ifcase\sidefloatparagraph\or}
+
+% without sidefloat lines
+%
+% \def\setsidefloatparagraph
+% {%\advance\sidefloatprogress \sidefloatbottomskip
+% %\!!counta\sidefloatprogress
+% \scratchdimen\sidefloatprogress
+% \advance\scratchdimen \strutht
+% \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+% \!!counta\scratchdimen
+% \divide\!!counta \baselineskip
+% \ifnum\!!counta>0
+% \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
+% \hangafter-\!!counta
+% \fi
+% \global\advance\sidefloatparagraph \plusone
+% \iftracesidefloats
+% \hskip-\sidefloatwidth
+% \color[darkgray]%
+% {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+% %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+% \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+% \fi}
+
+\def\setsidefloatparagraph
+ {%\advance\sidefloatprogress \sidefloatbottomskip
+ %\!!counta\sidefloatprogress
+ \scratchdimen\sidefloatprogress
+ \advance\scratchdimen \strutht
+ \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+ \!!counta\scratchdimen
+ \divide\!!counta \baselineskip\relax
+ \ifnum\!!counta>0
+ % new from here
+ \ifcase\sidefloatsidelines\else
+ \ifcase\sidefloatlinesdone
+ \global\sidefloatlinesdone\!!counta
+ \else
+ \scratchcounter\sidefloatlinesdone
+ \advance\scratchcounter-\!!counta
+ \global\advance\sidefloatsidelines-\scratchcounter
+ \fi
+ \fi
+ \ifnum\sidefloatsidelines>\zerocount
+ \scratchtoks\emptytoks
+ \scratchcounter\sidefloatsidelines
+ \scratchdimen\hsize
+ \advance\scratchdimen-\sidefloatwidth
+ \dorecurse\sidefloatsidelines
+ {\appendtoks \zeropoint \hsize \to \scratchtoks}%
+ \ifnum\!!counta>\sidefloatsidelines
+ \advance\!!counta -\sidefloatsidelines\relax
+ \advance\scratchcounter\!!counta
+ \dorecurse\!!counta
+ {\ifnum\sidefloattype>4
+ \appendtoks \zeropoint \scratchdimen \to \scratchtoks
+ \else
+ \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks
+ \fi}%
+ \fi
+ \advance\scratchcounter \plusone
+ \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax
+ \else
+ % new till here
+ \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
+ \hangafter-\!!counta
+ \fi
+ \fi
+ \global\advance\sidefloatparagraph \plusone
+ \iftracesidefloats
+ \hskip-\sidefloatwidth
+ \color[darkgray]%
+ {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+ %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+ \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+ \fi}
+
+\def\resetsidefloatparagraph
+ {\global\sidefloatparagraph\zerocount }
+
+\def\dochecksidefloat
+ {\progresssidefloat
+ \ifdim\sidefloatprogress>\zeropoint
+ \setsidefloatparagraph
+ \else
+ \resetsidefloatparagraph
+ \fi
+ \parskip\ctxparskip}
+
+\def\checksidefloat
+ {\dochecksidefloat}
+
+\def\synchronizesidefloats
+ {\ifinner \else \checksidefloat \fi}
+
+\def\doadjustsidefloatdisplaylines
+ {\par
+ \vskip-\parskip
+ \noindent
+ \ignorespaces}
+
+\def\adjustsidefloatdisplaylines
+ {\aftergroup\doadjustsidefloatdisplaylines}
+
+\def\previoussidefloat
+ {\progresssidefloat
+ \ifdim\sidefloatprogress>\zeropoint \relax
+ \iffloatshort
+ \global\floatshortfalse
+ \tosssidefloat
+ \else
+ \kern\sidefloatprogress
+ \fi
+ \fi}
+
+\def\stallsidefloat
+ {\!!counta\pageshrink
+ \divide\!!counta \baselineskip
+ \advance\!!counta \plusone
+ \parskip\zeropoint
+ \dorecurse\!!counta{\line{}}
+ \kern-\!!counta\baselineskip
+ \penalty\zerocount }
+
+% We need to hook it into the other otr's. This code will move.
+
+\let\OTRONEflushsidefloats \flushsidefloats
+\let\OTRONEsynchronizesidefloats\synchronizesidefloats
+
+% page-set
+%
+% \let\OTRSETflushsidefloats \forgetsidefloats
+% \let\OTRSETsynchronizesidefloats\forgetsidefloats
+
+% page-mul
+%
+% \let\OTRMULflushsidefloats \forgetsidefloats
+% \let\OTRMULsynchronizesidefloats\forgetsidefloats
+
+\def\synchronizesidefloats{\OTRcommand\synchronizesidefloats}
+\def\flushsidefloats {\OTRcommand\flushsidefloats}
+
+\protect \endinput
diff --git a/tex/context/base/page-sid.mkiv b/tex/context/base/page-sid.mkiv
new file mode 100644
index 000000000..c30204a4e
--- /dev/null
+++ b/tex/context/base/page-sid.mkiv
@@ -0,0 +1,795 @@
+%D \module
+%D [ file=page-sid,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Side Floats,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Side Floats}
+
+\unprotect
+
+% problem: when too small, side effects; we need to determine the
+% shift earlier so that we can act when shift < size
+%
+% \definefloat[edgefigure]
+% \setupfloat
+% [edgefigure]
+% [rightmargindistance=-\rightmargintotal,
+% leftmargindistance=-\rightmargintotal,
+% default=outer]
+% \starttext
+% \placeedgefigure{}{\framed[width=12cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=5cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=4cm]{}} \input tufte
+% \placeedgefigure{}{\framed[width=2cm]{}} \input tufte
+% \stoptext
+
+% todo: dimexpr an dnumexpr
+
+% These macro deal with side floats. We started with Daniel
+% Comenetz macros as published in TUGBoat Volume 14 (1993),
+% No.\ 1: Anchored Figures at Either Margin. I extended and
+% patched the macros to suite our needs which results in a
+% messy module. Therefore, this module badly needs an update
+% because it's now a mixture of old and new macros.
+
+% afhankelijke variabelen
+%
+% \overgap vervangen door \floatsidetopskip
+% \sidegap vervangen door \floatsideskip
+% \undergap vervangen door \floatsidebottomskip
+%
+% \prskp vervangen door \ctxparskip
+
+% toegevoegde macro's/aanroepen
+%
+% \logsidefloat : loginformatie
+% \flushsidefloats : nodig voor koppen
+
+% recente wijzigingen:
+%
+% namen aangepast: \float... enz. i.p.v. \pic
+
+% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}}
+% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval
+% begint de tekst terecht wat lager.
+
+\newdimen\sidefloatheight % includes the topskip
+\newdimen\sidefloatwidth
+\newdimen\sidefloathsize
+\newdimen\sidefloatshift
+\newdimen\sidefloatextrashift
+\newdimen\sidefloatvsize \def\nofloatvsize{-1pt }
+\newdimen\sidefloatprogress
+\newdimen\sidefloatpagetotal
+
+\newbox\floatbottom
+
+\newcount\sidefloatsidelines
+\newcount\sidefloatlinesdone
+
+% 1 = backspace
+% 2 = leftedge
+% 3 = leftmargin
+% 4 = leftside
+% 5 = rightside
+% 6 = rightmargin
+% 7 = rightedge
+% 8 = cutspace
+
+\chardef\sidefloattype\zerocount
+
+\def\backspacefloat {\global\chardef\sidefloattype1 \putsidefloat}
+\def\leftedgefloat {\global\chardef\sidefloattype2 \putsidefloat}
+\def\leftmarginfloat {\global\chardef\sidefloattype3 \putsidefloat}
+\def\leftfloat {\global\chardef\sidefloattype4 \putsidefloat}
+\def\rightfloat {\global\chardef\sidefloattype5 \putsidefloat}
+\def\rightmarginfloat {\global\chardef\sidefloattype6 \putsidefloat}
+\def\rightedgefloat {\global\chardef\sidefloattype7 \putsidefloat}
+\def\cutspacefloat {\global\chardef\sidefloattype8 \putsidefloat}
+
+\let\marginfloat \cutspacefloat
+
+\newif\ifroomforfloat
+\newif\iffloatshort
+\newif\iffloatflag
+\newif\iffloatrighteqo
+\newif\iffloatlefteqo
+
+\newdimen\sidefloatleftskip
+\newdimen\sidefloatrightskip
+\newdimen\sidefloatmaximum
+
+\def\checksidefloatshift
+ {\ifdim\sidefloatmaximum>\zeropoint
+ \ifcase\sidefloattype
+ % invalid
+ \or
+ % backspace
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftedgedistance \rightedgedistance
+ -\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ % left
+ \or
+ % right
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ \global\sidefloatshift\dimexpr
+ -\sidefloatmaximum
+ -\rightorleftpageaction \leftedgedistance \rightedgedistance
+ -\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+ -\rightorleftpageaction \leftmargindistance \rightmargindistance
+ -\compensatedinnermakeupmargin
+ \relax
+ \or
+ % cutspace
+ \fi
+ \fi}
+
+\def\setsidefloatskips
+ {\global\sidefloatrightskip\zeropoint
+ \global\sidefloatleftskip \zeropoint
+ \ifcase\sidefloattype
+ \or % backspace
+ \global\sidefloatleftskip\dimexpr
+ +\rightorleftpageaction \backspace \cutspace
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % leftedge
+ \global\sidefloatleftskip\dimexpr
+ +\rightorleftpageaction \leftmargindistance \rightmargindistance
+ +\rightorleftpageaction \leftmarginwidth \rightmarginwidth
+ +\rightorleftpageaction \leftedgedistance \rightedgedistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % leftmargin
+ \global\sidefloatleftskip\dimexpr
+ +\rightorleftpageaction \leftmargindistance \rightmargindistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % leftside
+ \or % rightside
+ \or % rightmargin
+ \global\sidefloatrightskip\dimexpr
+ +\rightorleftpageaction \rightmargindistance \leftmargindistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % rightedge
+ \global\sidefloatrightskip\dimexpr
+ +\rightorleftpageaction \rightmargindistance \leftmargindistance
+ +\rightorleftpageaction \rightmarginwidth \leftmarginwidth
+ +\rightorleftpageaction \rightedgedistance \leftedgedistance
+ +\compensatedinnermakeupmargin
+ \relax
+ \or % cutspace
+ \global\sidefloatrightskip\dimexpr
+ +\rightorleftpageaction \cutspace \backspace
+ +\compensatedinnermakeupmargin
+ \relax
+ \fi
+ \ifdim\sidefloatrightskip>\zeropoint \doglobal\advance\sidefloatrightskip\rightskip \fi
+ \ifdim\sidefloatleftskip >\zeropoint \doglobal\advance\sidefloatleftskip \leftskip \fi}
+
+% eq is still crap
+
+\ifx\normalleqno\undefined
+
+ \let\floatrighteqo=\eqno
+ \let\floatleftleqo=\leqno
+
+\else
+
+ \let\floatrighteqo=\normaleqno
+ \let\floatleftleqo=\normalleqno
+
+\fi
+
+% Watch it even more! In inner, gaat't mis omdat daar
+% pagetotal enz niet zijn aangepast. Inner kan overigens niet
+% betrouwbaar worden getest!
+
+\newif\iftracesidefloats
+
+\def\flushsidefloats
+ {\par
+ \!!heighta\sidefloatvsize
+ \advance\!!heighta -\pagetotal
+ \ifnum\!!heighta>\zeropoint
+ \global\advance\sidefloatvsize -\sidefloatbottomskip
+ \ifdim\!!heighta>\zeropoint
+ \bgroup
+ \let\flushsidefloats\relax
+ \forgetall
+ \doloop
+ {\strut
+ \iftracesidefloats
+ \color[darkgray]%
+ {\baselinerulefalse
+ \boxrulewidth.5\points
+ \ruledhbox{\strut\kern\sidefloatwidth}}%
+ \fi
+ \par
+ \!!heighta\sidefloatvsize
+ \advance\!!heighta -\pagetotal
+ \ifdim\!!heighta>\zeropoint
+ \ifnum\recurselevel>\plushundred
+ \exitloop
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \egroup
+ \ifdim\parskip>\zeropoint
+ \ifdim\sidefloatbottomskip>\parskip
+ \nowhitespace
+ \vskip\sidefloatbottomskip
+ \fi
+ \fi
+ \else\ifdim\sidefloatbottomskip>\parskip
+ \vskip\sidefloatbottomskip
+ \fi\fi
+ \fi
+ % not entirely the same as \forgetsidefloats
+ \global\sidefloatvsize\nofloatvsize
+ % \global\sidefloatsidelines\zerocount % no, we flush before a side float
+ \global\floatshortfalse % so this will get lost
+ % also here if used at all \global\holdinginserts\zerocount
+ \global\floatflagfalse}
+
+\def\dochecksidefloatafterpar
+ {\dochecksidefloat
+ \ifdim\oldpagetotal=\pagetotal \else
+ \global\let\checksidefloat\dochecksidefloat
+ \flushsidefloats
+ \global\sidefloatsidelines\zerocount % here !
+ \fi}
+
+\def\flushsidefloatsafterpar
+ {\xdef\oldpagetotal{\the\pagetotal}%
+ \global\let\checksidefloat\dochecksidefloatafterpar}
+
+\def\forgetsidefloats
+ {\global\sidefloatvsize\nofloatvsize
+ \global\sidefloatsidelines\zerocount
+ % also here if used at all \global\holdinginserts\zerocount
+ \global\floatshortfalse
+ \global\floatflagfalse}
+
+\let\logsidefloat=\relax
+
+\def\pushpenalties % needed ? and right
+ {\widowpenalty\plusone
+ \clubpenalty\plustwo
+ \brokenpenalty\plusone
+ \let\pushpenalties\relax
+ \edef\poppenalties
+ {\widowpenalty \the\widowpenalty
+ \clubpenalty \the\clubpenalty
+ \brokenpenalty\the\brokenpenalty
+ \let\poppenalties\relax}}
+
+% shouldn;t that be:
+%
+% \def\pushpenalties % needed?
+% {\let\pushpenalties\relax
+% \edef\poppenalties
+% {\widowpenalty \the\widowpenalty
+% \clubpenalty \the\clubpenalty
+% \brokenpenalty\the\brokenpenalty
+% \let\poppenalties\relax}%
+% \widowpenalty\plusone
+% \clubpenalty\plustwo
+% \brokenpenalty\plusone}
+
+\let\poppenalties=\relax
+
+\def\restorepenalties
+ {\ifnum\outputpenalty=\!!tenthousand\else
+ \penalty\outputpenalty
+ \fi}
+
+\def\sidefloatoutput
+ {\iffloatshort
+ \unvbox\normalpagebox
+ \setbox\floatbottom\lastbox
+ \ifdim\wd\floatbottom>\sidefloathsize
+ \penalty-201
+ \box\floatbottom
+ \else
+ \ifvoid\floatbottom
+ \else
+ \restoreleftindent
+ \ifdim\wd\floatbottom<\sidefloathsize
+ \parskip\zeropoint
+ %\noindent
+ \ifinner\else\vadjust{\penalty\minusone}\fi
+ \iffloatlefteqo
+ \global\floatlefteqofalse
+ \else
+ \global\advance\sidefloathsize -\wd\floatbottom
+ \iffloatrighteqo
+ \global\floatrighteqofalse
+ \else
+ \global\divide\sidefloathsize \plustwo
+ \fi
+ \hskip\sidefloathsize
+ \fi
+ \fi
+ \box\floatbottom
+ \restorepenalties
+ \fi
+ \fi
+ % why was this \global\holdinginserts\zerocount
+ \global\floatshortfalse
+ \else
+ \finalsidefloatoutput % new
+ \global\sidefloatvsize\nofloatvsize
+ \global\sidefloatsidelines\zerocount
+ % we can end up in fig lock, so \global\holdinginserts\zerocount here too ?
+ \poppenalties
+ \fi}
+
+\def\finalsidefloatoutput% new
+ {\finaloutput\unvbox\normalpagebox}
+
+\def\restoreleftindent
+ {\relax \ifnum\sidefloattype>4 \else
+ \parskip\zeropoint % here ?
+ \ifdim\sidefloatwidth>\zeropoint % new, see prikkels
+ \noindent
+ \ifinner\else\vadjust{\penalty\minusone}\fi
+ \hskip\sidefloatwidth\relax
+ %\else
+ % we have a margin or edge float
+ \fi
+ \fi}
+
+\ifx\normaleqno\undefined
+
+ \def\normaleqno
+ {\iffloatshort
+ \global\floatrighteqotrue
+ \fi
+ \floatrighteqo}
+
+\else
+
+ \def\eqno
+ {\iffloatshort
+ \global\floatrighteqotrue
+ \fi
+ \floatrighteqo}
+
+\fi
+
+% externfiguur -> grid =ja|hoogte|diepte|halveregel|passend -> helemaal in details
+% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'
+
+% replacement for below
+%
+% \global\setbox\floatbox\hbox % no \hskip, but \kern here
+% {\ifcase\sidefloattype
+% \vbox{#1}%
+% \or % 1
+% \hskip\sidefloatleftshift
+% \hskip\sidefloatshift
+% \vbox{#1}%
+% \kern-\sidefloatextrashift
+% \or % 2
+% \hskip\sidefloatshift
+% \vbox{#1}%
+% \kern-\sidefloatextrashift
+% \or % 3
+% \hskip\sidefloatshift
+% \vbox{#1}%
+% \kern-\sidefloatextrashift
+% \or % 4
+% \hskip\sidefloatleftshift
+% \hskip\sidefloatshift
+% \vbox{#1\removedepth}%
+% \kern-\sidefloatextrashift
+% \or % 5
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \kern\sidefloatrightshift
+% \or % 6
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \or % 7
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \or % 8
+% \hskip-\sidefloatextrashift
+% \vbox{#1}%
+% \kern\sidefloatshift
+% \kern\sidefloatrightshift
+% \fi}%
+%
+% keep this ^
+
+\def\repositionsidefloat#1%
+ {\global\setbox\floatbox\hbox % no \hskip, but \kern here
+ {\ifnum\sidefloattype=\plusfour
+ \hskip\sidefloatleftshift
+ \else\ifnum\sidefloattype=\plusone
+ \hskip\sidefloatleftshift
+ \fi\fi
+ \ifnum\sidefloattype>\plusfour
+ \hskip-\sidefloatextrashift
+ \else
+ \hskip\sidefloatshift
+ \fi
+ \vbox{#1\ifnum\sidefloatalign=\plusfour \removedepth\fi}%
+ \ifnum\sidefloattype>\plusfour
+ \kern\sidefloatshift
+ \else
+ \kern-\sidefloatextrashift
+ \fi
+ \ifnum\sidefloattype=8
+ \kern\sidefloatrightshift
+ \else\ifnum\sidefloattype=\plusfive
+ \kern\sidefloatrightshift
+ \fi\fi}}
+
+\def\putsidefloat#1% grid (4) is rather experimental
+ {\par
+ \whitespace
+ % moved here dec 2001
+ {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}% moved
+ \checksidefloatshift
+ \ifdim\sidefloatshift=\zeropoint \relax
+ \ifnum\sidefloattype=\plusfour
+ \global\advance\sidefloatshift\sidefloatextrashift
+ \global\sidefloatextrashift\zeropoint
+ \else\ifnum\sidefloattype=\plusfive
+ \global\advance\sidefloatshift\sidefloatextrashift
+ \global\sidefloatextrashift\zeropoint
+ \fi\fi
+ \else
+ \ifnum\sidefloattype<\plusfour
+ \global\chardef\sidefloattype\plusfour
+ \else\ifnum\sidefloattype>\plusfive
+ \global\chardef\sidefloattype\plusfive
+ \fi\fi
+ \fi
+ \previoussidefloat
+ \stallsidefloat
+ \repositionsidefloat{#1}%
+ \ifnum\sidefloatalign=\plusfour
+ \getnoflines{\ht\floatbox}%
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen-\strutdepth
+ \getrawnoflines\sidefloattopskip
+ \advance\scratchdimen\noflines\lineheight
+ % todo: maybe rounding problem here
+ % \global\setbox\floatbox\hbox{\lower\lineheight\box\floatbox}%
+ \global\setbox\floatbox\hbox{\lower\strutdepth\box\floatbox}%
+ \global\ht\floatbox\scratchdimen
+ \global\dp\floatbox\zeropoint
+ \fi
+ \ifcase\sidefloatalign \else
+ \global\sidefloattopskip\zeropoint
+ \fi
+ \scratchdimen
+ \ifnum\sidefloattype<\plusfour
+ \sidefloattopskip
+ \else\ifnum\sidefloattype>\plusfive
+ \sidefloattopskip
+ \else
+ \zeropoint
+ \fi\fi
+ % the top of the box is at the previous baseline
+ \ifcase\sidefloatalign
+ % 0 normal
+ \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+ \or % 1 height
+ \advance\scratchdimen\strutdepth % == \sidefloattopoffset
+ \or % 2 line
+ \or % 3 depth
+ \advance\scratchdimen\lineheight
+ \advance\scratchdimen\strutdepth
+ \or % 4 grid
+ \scratchdimen\zeropoint
+ \or
+ \advance\scratchdimen\strutheight
+ \fi
+ % new
+ \global\sidefloatlinesdone\zerocount
+ \ifnum\sidefloatsidelines>\zerocount
+ \advance\scratchdimen\sidefloatsidelines\lineheight
+ \fi
+ % new
+ \global\setbox\floatbox\hbox
+ {\vbox
+ {\vskip\scratchdimen
+ \nointerlineskip
+ \box\floatbox
+ \ifnum\sidefloatalign=\plusfive \vskip-\lineheight \fi}}%
+ \ifnum\sidefloattype<\plusfour
+ \global\sidefloattopskip\zeropoint
+ \else\ifnum\sidefloattype>\plusfive
+ \global\sidefloattopskip\zeropoint
+ \fi\fi
+ \global\sidefloatdownshift\zeropoint
+ \measuresidefloat
+ \ifroomforfloat \else
+ \vfill\eject % inline \tosssidefloat
+ \measuresidefloat
+ \stallsidefloat
+ \fi
+ \setsidefloat}
+
+\def\progresssidefloat
+ {\sidefloatprogress\sidefloatvsize
+ \advance\sidefloatprogress-\iffloatflag\sidefloatpagetotal\global\floatflagfalse\else\pagetotal\fi}
+
+\def\measuresidefloat
+ {\global\floatflagtrue
+ \global\sidefloatpagetotal \pagetotal % global
+ \ifnum\sidefloattype<\plusfour
+ \global \sidefloatwidth \zeropoint
+ \else\ifnum\sidefloattype>\plusfive
+ \global \sidefloatwidth \zeropoint
+ \else
+ \global \sidefloatwidth \wd\floatbox
+ \global\advance\sidefloatwidth \floatsideskip
+ \fi\fi
+ \ifdim\sidefloatwidth<\zeropoint
+ \global\sidefloatwidth\zeropoint
+ \fi
+ \global \sidefloathsize \hsize
+ \global\advance\sidefloathsize -\sidefloatwidth
+ \global \sidefloatheight \ht\floatbox
+ \global\advance\sidefloatheight \dp\floatbox
+ \global\advance\sidefloatheight \sidefloattopskip
+ \global \sidefloatvsize \sidefloatheight
+ \global\advance\sidefloatvsize \sidefloatpagetotal
+ \dimen0\sidefloatvsize
+ \dimen2\pagegoal
+ \relax
+ \ifcase\sidefloatmethod
+ % method 0 : raw
+ \or
+ % method 1 : safe
+ \dimen2 .99\pagegoal
+ \or
+ % method 2 : tight
+ \advance\dimen0 -\onepoint
+ \fi
+ \relax % really needed ! ! ! !
+ \ifdim\dimen0>\dimen2
+ \global\roomforfloatfalse
+ \else
+ \dimen0=\pagegoal
+ \advance\dimen0 -\sidefloatvsize
+ \ifdim\dimen0<\sidefloatbottomskip
+ \global\advance\sidefloatvsize \dimen0
+ \global\floatshorttrue
+ \pushpenalties
+ % why was this \global\holdinginserts\plusone
+ \else
+ \global\advance\sidefloatvsize \sidefloatbottomskip
+ \global\floatshortfalse
+ \fi
+ \global\roomforfloattrue
+ \fi}
+
+\def\setsidefloat% nilling everypar saves time and redudant pos's
+ {% removed here dec 2001
+ % {\everypar\emptytoks\forgetall\verticalstrut\vskip-\struttotal}%
+ \ifnum\sidefloattype=\plusfour \kern\sidefloattopskip \fi
+ \ifnum\sidefloattype=\plusfive \kern\sidefloattopskip \fi
+ \edef\presidefloatdepth{\the\prevdepth}%
+ \nointerlineskip
+ \bgroup
+ \everypar\emptytoks
+ \parskip\zeropoint
+ \setsidefloatskips
+ \logsidefloat
+ \relax
+ \ifcase\sidefloattype
+ % invalid
+ \or % backspace
+ \noindent\llap{\rlap{\box\floatbox}\hskip\sidefloatleftskip}\hfill
+ \or % leftedge
+ \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+ \or % leftmargin
+ \noindent\llap{\box\floatbox\hskip\sidefloatleftskip}\hfill
+ \or % leftside
+ \noindent\box\floatbox\hfill
+ \or % rightside
+ \hfill\box\floatbox
+ \or % rightmargin
+ \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+ \or % rightedge
+ \hfill\rlap{\hskip\sidefloatrightskip\box\floatbox}%
+ \or % cutspace
+ \hfill\rlap{\hskip\sidefloatrightskip\llap{\box\floatbox}}%
+ \fi
+ \egroup
+ \par
+\ifgridsnapping
+ \getrawnoflines\sidefloatheight
+ \sidefloatheight=\noflines\lineheight
+\fi
+ \kern-\sidefloatheight
+ \penalty10001 % oeps, this will change
+ \normalbaselines
+ \prevdepth\presidefloatdepth
+ % \noindent
+ \resetsidefloatparagraph
+ \ignorespaces} % not really needed
+
+\newcount\sidefloatparagraph
+
+\def\iffirstsidefloatparagraph
+ {\ifcase\sidefloatparagraph\or}
+
+% without sidefloat lines
+%
+% \def\setsidefloatparagraph
+% {%\advance\sidefloatprogress \sidefloatbottomskip
+% %\!!counta\sidefloatprogress
+% \scratchdimen\sidefloatprogress
+% \advance\scratchdimen \strutht
+% \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+% \!!counta\scratchdimen
+% \divide\!!counta \baselineskip
+% \ifnum\!!counta>0
+% \hangindent \ifnum\sidefloattype>4 -\fi\sidefloatwidth
+% \hangafter-\!!counta
+% \fi
+% \global\advance\sidefloatparagraph \plusone
+% \iftracesidefloats
+% \hskip-\sidefloatwidth
+% \color[darkgray]%
+% {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+% %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+% \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+% \fi}
+
+\def\setsidefloatparagraph
+ {%\advance\sidefloatprogress \sidefloatbottomskip
+ %\!!counta\sidefloatprogress
+ \scratchdimen\sidefloatprogress
+ \advance\scratchdimen \strutht
+ \advance\scratchdimen -\roundingeps % new, needed in prikkels, prevent rounding errors
+ \!!counta\scratchdimen
+ \divide\!!counta \baselineskip\relax
+ \ifnum\!!counta>0
+ % new from here
+ \ifcase\sidefloatsidelines\else
+ \ifcase\sidefloatlinesdone
+ \global\sidefloatlinesdone\!!counta
+ \else
+ \scratchcounter\sidefloatlinesdone
+ \advance\scratchcounter-\!!counta
+ \global\advance\sidefloatsidelines-\scratchcounter
+ \fi
+ \fi
+ \ifnum\sidefloatsidelines>\zerocount
+ \scratchtoks\emptytoks
+ \scratchcounter\sidefloatsidelines
+ \scratchdimen\hsize
+ \advance\scratchdimen-\sidefloatwidth
+ \dorecurse\sidefloatsidelines
+ {\appendtoks \zeropoint \hsize \to \scratchtoks}%
+ \ifnum\!!counta>\sidefloatsidelines
+ \advance\!!counta -\sidefloatsidelines\relax
+ \advance\scratchcounter\!!counta
+ \dorecurse\!!counta
+ {\ifnum\sidefloattype>\plusfour
+ \appendtoks \zeropoint \scratchdimen \to \scratchtoks
+ \else
+ \appendtoks \sidefloatwidth \scratchdimen \to \scratchtoks
+ \fi}%
+ \fi
+ \advance\scratchcounter \plusone
+ \parshape \scratchcounter \the\scratchtoks \zeropoint \hsize\relax
+ \else
+ % new till here
+ \hangindent \ifnum\sidefloattype>\plusfour -\fi\sidefloatwidth
+ \hangafter-\!!counta
+ \fi
+ \fi
+ \global\advance\sidefloatparagraph \plusone
+ \iftracesidefloats
+ \hskip-\sidefloatwidth
+ \color[darkgray]%
+ {\vrule\!!height.5\points\!!depth.5\points\!!width\sidefloatwidth
+ %\hskip-.25\bodyfontsize\showstruts\strut\hskip.25\bodyfontsize}%
+ \llap{\showstruts\strut\hskip.25\bodyfontsize}}%
+ \fi}
+
+\def\resetsidefloatparagraph
+ {\global\sidefloatparagraph\zerocount}
+
+\def\dochecksidefloat
+ {\progresssidefloat
+ \ifdim\sidefloatprogress>\zeropoint
+ \setsidefloatparagraph
+ \else
+ \resetsidefloatparagraph
+ \fi
+ \parskip\ctxparskip}
+
+\let\checksidefloat\dochecksidefloat
+
+\def\synchronizesidefloats
+ {\ifinner \else \checksidefloat \fi}
+
+\def\doadjustsidefloatdisplaylines
+ {\par
+ % not in mkiv: \vskip-\parskip
+ \noindent
+ \ignorespaces}
+
+\def\adjustsidefloatdisplaylines
+ {\aftergroup\doadjustsidefloatdisplaylines}
+
+\def\previoussidefloat
+ {\progresssidefloat
+ \ifdim\sidefloatprogress>\zeropoint \relax
+ \iffloatshort
+ \global\floatshortfalse
+ \vfill\eject % inline \tosssidefloat
+ \else
+ \kern\sidefloatprogress
+ \fi
+ \fi}
+
+\def\stallsidefloat
+ {\!!counta\pageshrink
+ \divide\!!counta \baselineskip
+ \advance\!!counta \plusone
+ \parskip\zeropoint
+ \dorecurse\!!counta{\line{}}
+ \kern-\!!counta\baselineskip
+ \penalty\zerocount }
+
+% We need to hook it into the other otr's. This code will move.
+
+\let\OTRONEflushsidefloats \flushsidefloats
+\let\OTRONEsynchronizesidefloats\synchronizesidefloats
+
+% page-set
+%
+% \let\OTRSETflushsidefloats \forgetsidefloats
+% \let\OTRSETsynchronizesidefloats\forgetsidefloats
+
+% page-mul
+%
+% \let\OTRMULflushsidefloats \forgetsidefloats
+% \let\OTRMULsynchronizesidefloats\forgetsidefloats
+
+\registerotrcommand\synchronizesidefloats % \def\synchronizesidefloats{\OTRcommand\synchronizesidefloats}
+\registerotrcommand\flushsidefloats % \def\flushsidefloats {\OTRcommand\flushsidefloats}
+
+\protect \endinput
diff --git a/tex/context/base/page-spr.mkii b/tex/context/base/page-spr.mkii
new file mode 100644
index 000000000..06947a36a
--- /dev/null
+++ b/tex/context/base/page-spr.mkii
@@ -0,0 +1,104 @@
+%D \module
+%D [ file=page-spr,
+%D version=2002.11.11,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Spreading,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Spreading}
+
+% This module is experimental and not yet official!
+
+\unprotect
+
+\newbox\spreadbox
+\newif \ifinspread
+
+\chardef\showspreadmode=1
+
+% beware, ugly overload, to be redone
+
+\def\normalsettextpagecontent#1#2#3% #2 and #3 will disappear
+ {\setbox#1\hbox
+ {\vbox to \textheight
+ {\offinterlineskip
+ \freezetextwidth
+ \hsize\textwidth % local variant of \sethsize
+ \boxmaxdepth\maxdepth
+ \noindent % content can be < \hsize
+ \dopagecontents#2#3}}%
+ \dp#1\zeropoint
+ \setbox#1\hbox to \makeupwidth
+ {\ifinspread
+ \ifvoid\spreadbox
+ \global\setbox\spreadbox\box#1%
+ \copy\spreadbox\hss % left page
+ \else
+ % prevent duplicate writes in normal run
+ \ifarrangingpages \else \ifcase\showspreadmode
+ \global\setbox\spreadbox\null
+ \wd\spreadbox\makeupwidth
+ \ht\spreadbox\textheight
+ \fi \fi
+ \hss\box\spreadbox % right page
+ \fi
+ \else
+ \hss\box#1\hss % never change the \hss's
+ \fi}}
+
+\def\doflushspread
+ {\ifinspread \ifvoid\spreadbox\else
+ % this page will be discarded later
+ \null \page
+ \fi \fi }
+
+\def\startspread
+ {\bgroup
+ \ifdoublesided
+ \page[\v!left]%
+ %\setsystemmode{spread}%
+ \inspreadtrue
+ \scratchdimen2\textwidth
+ \advance\scratchdimen2\backspace
+ \expanded{\setuplayout[\c!textwidth=\the\scratchdimen]}%
+ \def\startspread{\bgroup\let\stopspread\egroup}%
+ \let\stopspread\dostopspread
+ \else
+ \let\stopspread\egroup
+ \fi}
+
+\let\stopspread\relax
+
+\def\dostopspread
+ {\kern\zeropoint\page
+ \inspreadfalse
+ \setuplayout[\c!textwidth=\textwidth]
+ \page[\v!left]
+ \egroup}
+
+\protect \endinput
+
+% texexec --arr --pdf test
+%
+% \setuplayout[width=middle]
+% \setuppapersize[A4][A3,landscape]
+% \setuppagenumbering[alternative=doublesided]
+% \setuparranging[2UP]
+%
+% \starttext
+%
+% \dorecurse{3}{\input tufte }
+%
+% \startspread
+% \dorecurse{10}{\input tufte }
+% \stopspread
+%
+% \dorecurse{3}{\input tufte }
+%
+% \stoptext
diff --git a/tex/context/base/page-spr.mkiv b/tex/context/base/page-spr.mkiv
new file mode 100644
index 000000000..75b91dff7
--- /dev/null
+++ b/tex/context/base/page-spr.mkiv
@@ -0,0 +1,103 @@
+%D \module
+%D [ file=page-spr,
+%D version=2002.11.11,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Spreading,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Spreading}
+
+% This module is experimental and not yet official!
+
+\unprotect
+
+\newbox\spreadbox
+\newif \ifinspread
+
+\chardef\showspreadmode\plusone
+
+% beware, ugly overload, to be redone
+
+\def\normalsettextpagecontent#1#2#3% #2 and #3 will disappear
+ {\setbox#1\hbox
+ {\setlayoutcomponentattribute\v!page\v!text
+ \vbox \layoutcomponentboxattribute to \textheight
+ {\offinterlineskip
+ \freezetextwidth
+ \hsize\textwidth % local variant of \sethsize
+ \boxmaxdepth\maxdepth
+ \noindent % content can be < \hsize
+ \dopagecontents#2#3}}%
+ \dp#1\zeropoint
+ \setbox#1\hbox to \makeupwidth
+ {\ifinspread
+ \ifvoid\spreadbox
+ \global\setbox\spreadbox\box#1%
+ \copy\spreadbox\hss % left page
+ \else
+ % prevent duplicate writes in normal run
+ \ifarrangingpages \else \ifcase\showspreadmode
+ \global\setbox\spreadbox\null
+ \wd\spreadbox\makeupwidth
+ \ht\spreadbox\textheight
+ \fi \fi
+ \hss\box\spreadbox % right page
+ \fi
+ \else
+ \hss\box#1\hss % never change the \hss's
+ \fi}}
+
+\def\doflushspread
+ {\ifinspread \ifvoid\spreadbox\else
+ % this page will be discarded later
+ \null \page
+ \fi \fi }
+
+\unexpanded\def\startspread
+ {\bgroup
+ \ifdoublesided
+ \page[\v!left]%
+ %\setsystemmode{spread}%
+ \inspreadtrue
+ \expanded{\setuplayout[\c!textwidth=\the\dimexpr2\textwidth+2\backspace\relax]}%
+ \unexpanded\def\startspread{\bgroup\let\stopspread\egroup}%
+ \let\stopspread\dostopspread
+ \else
+ \let\stopspread\egroup
+ \fi}
+
+\let\stopspread\relax
+
+\def\dostopspread
+ {\kern\zeropoint\page
+ \inspreadfalse
+ \setuplayout[\c!textwidth=\textwidth]
+ \page[\v!left]
+ \egroup}
+
+\protect \endinput
+
+% texexec --arr --pdf test
+%
+% \setuplayout[width=middle]
+% \setuppapersize[A4][A3,landscape]
+% \setuppagenumbering[alternative=doublesided]
+% \setuparranging[2UP]
+%
+% \starttext
+%
+% \dorecurse{3}{\input tufte }
+%
+% \startspread
+% \dorecurse{10}{\input tufte }
+% \stopspread
+%
+% \dorecurse{3}{\input tufte }
+%
+% \stoptext
diff --git a/tex/context/base/page-str.lua b/tex/context/base/page-str.lua
new file mode 100644
index 000000000..c4d1957c3
--- /dev/null
+++ b/tex/context/base/page-str.lua
@@ -0,0 +1,221 @@
+if not modules then modules = { } end modules ['page-str'] = {
+ version = 1.001,
+ comment = "companion to page-str.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- work in progresss .. unfinished
+
+local concat = table.concat
+
+local find_tail, write_node, free_node, copy_nodelist = node.slide, node.write, node.free, node.copy_list
+local vpack_nodelist, hpack_nodelist = node.vpack, node.hpack
+local texdimen, texbox = tex.dimen, tex.box
+
+local new_kern = nodes.kern
+local new_glyph = nodes.glyph
+
+local trace_collecting = false trackers.register("streams.collecting", function(v) trace_collecting = v end)
+local trace_flushing = false trackers.register("streams.flushing", function(v) trace_flushing = v end)
+
+streams = streams or { }
+
+local data, name, stack = { }, nil, { }
+
+function streams.enable(newname)
+ if newname == "default" then
+ name = nil
+ else
+ name = newname
+ end
+end
+
+function streams.disable()
+ name = stack[#stack]
+end
+
+function streams.start(newname)
+ table.insert(stack,name)
+ name = newname
+end
+
+function streams.stop(newname)
+ name = table.remove(stack)
+end
+
+function streams.collect(head,where)
+ if name and head and name ~= "default" then
+ local tail = node.slide(head)
+ local dana = data[name]
+ if not dana then
+ dana = { }
+ data[name] = dana
+ end
+ local last = dana[#dana]
+ if last then
+ local tail = find_tail(last)
+ tail.next, head.prev = head, tail
+ elseif last == false then
+ dana[#dana] = head
+ else
+ dana[1] = head
+ end
+ if trace_collecting then
+ logs.report("streams","appending snippet '%s' to slot %s",name,#dana)
+ end
+ return nil, true
+ else
+ return head, false
+ end
+end
+
+function streams.push(thename)
+ if not thename or thename == "" then
+ thename = name
+ end
+ if thename and thename ~= "" then
+ local dana = data[thename]
+ if dana then
+ dana[#dana+1] = false
+ if trace_collecting then
+ logs.report("streams","pushing snippet '%s'",thename)
+ end
+ end
+ end
+end
+
+function streams.flush(name,copy) -- problem: we need to migrate afterwards
+ local dana = data[name]
+ if dana then
+ local dn = #dana
+ if dn == 0 then
+ -- nothing to flush
+ elseif copy then
+ if trace_flushing then
+ logs.report("streams","flushing copies of %s slots of '%s'",dn,name)
+ end
+ for i=1,dn do
+ local di = dana[i]
+ if di then
+ write_node(copy_nodelist(di.list)) -- list, will be option
+ end
+ end
+ if copy then
+ data[name] = nil
+ end
+ else
+ if trace_flushing then
+ logs.report("streams","flushing %s slots of '%s'",dn,name)
+ end
+ for i=1,dn do
+ local di = dana[i]
+ if di then
+ write_node(di.list) -- list, will be option
+ di.list = nil
+ free_node(di)
+ end
+ end
+ end
+ end
+end
+
+function streams.synchronize(list) -- this is an experiment !
+ -- we don't optimize this as we want to trace in detail
+ list = aux.settings_to_array(list)
+ local max = 0
+ if trace_flushing then
+ logs.report("streams","synchronizing list: %s",concat(list," "))
+ end
+ for i=1,#list do
+ local dana = data[list[i]]
+ if dana then
+ local n = #dana
+ if n > max then
+ max = n
+ end
+ end
+ end
+ if trace_flushing then
+ logs.report("streams","maximum number of slots: %s",max)
+ end
+ for m=1,max do
+ local height, depth = 0, 0
+ for i=1,#list do
+ local name = list[i]
+ local dana = data[name]
+ local slot = dana[m]
+ if slot then
+ local vbox = vpack_nodelist(slot)
+ local ht, dp = vbox.height, vbox.depth
+ if ht > height then
+ height = ht
+ end
+ if dp > depth then
+ depth = dp
+ end
+ dana[m] = vbox
+ if trace_flushing then
+ logs.report("streams","slot %s of '%s' is packed to height %s and depth %s",m,name,ht,dp)
+ end
+ end
+ end
+ if trace_flushing then
+ logs.report("streams","slot %s has max height %s and max depth %s",m,height,depth)
+ end
+ local strutht, strutdp = texdimen.globalbodyfontstrutheight, texdimen.globalbodyfontstrutdepth
+ local struthtdp = strutht + strutdp
+ for i=1,#list do
+ local name = list[i]
+ local dana = data[name]
+ local vbox = dana[m]
+ if vbox then
+ local delta_height = height - vbox.height
+ local delta_depth = depth - vbox.depth
+ if delta_height > 0 or delta_depth > 0 then
+ if false then
+ -- actually we need to add glue and repack
+ vbox.height, vbox.depth = height, depth
+ if trace_flushing then
+ logs.report("streams","slot %s of '%s' with delta (%s,%s) is compensated",m,i,delta_height,delta_depth)
+ end
+ else
+ -- this is not yet ok as we also need to keep an eye on vertical spacing
+ -- so we might need to do some splitting or whatever
+ local tail = vbox.list and find_tail(vbox.list)
+ local n, delta = 0, delta_height -- for tracing
+ while delta > 0 do
+ -- we need to add some interline penalties
+ local line = copy_nodelist(tex.box.strutbox)
+ line.height, line.depth = strutht, strutdp
+ if tail then
+ tail.next, line.prev = line, tail
+ end
+ tail = line
+ n, delta = n +1, delta - struthtdp
+ end
+ dana[m] = vpack_nodelist(vbox.list)
+ vbox.list = nil
+ free_node(vbox)
+ if trace_flushing then
+ logs.report("streams","slot %s:%s with delta (%s,%s) is compensated by %s lines",m,i,delta_height,delta_depth,n)
+ end
+ end
+ end
+ else
+ -- make dummy
+ end
+ end
+ end
+end
+
+tasks.appendaction("mvlbuilders", "normalizers", "streams.collect")
+
+tasks.disableaction("mvlbuilders", "streams.collect")
+
+function streams.initialize()
+ tasks.enableaction ("mvlbuilders", "streams.collect")
+end
+
+-- todo: remove empty last { }'s
diff --git a/tex/context/base/page-str.mkii b/tex/context/base/page-str.mkii
new file mode 100644
index 000000000..cfaebe398
--- /dev/null
+++ b/tex/context/base/page-str.mkii
@@ -0,0 +1,376 @@
+%D \module
+%D [ file=page-str,
+%D version=2006.03.21,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Page Streams,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Page Streams}
+
+%D The first version of this component of \CONTEXT\ was written
+%D for Thomas Schmitz who asked for parallel page streams. While
+%D playing with the code, I decided to make it into a component
+%D that can be used to construct all kind of stream related
+%D mechanisms. Because I could apply this feature in a project,
+%D there is some additional code here (related to graphics).
+%D
+%D These macros were written while listening to and watching the DVD
+%D \quotation {Rush In Rio}.
+
+% not yet ok in mkiv ... marknotes
+
+\unprotect
+
+% taco, what is the best way to append a otr chunk (insert pagediscards?)
+
+\let\currentoutputstream\s!default
+
+\newtoks\defaultstreamoutput \defaultstreamoutput=\OTRONEoutput
+
+\newtoks\normalstreamoutput \normalstreamoutput={\saveoutputstream[\currentoutputstream]}
+
+\newcount\streampenalty \streampenalty=-101010101
+
+\ifx\multicolumnseject\undefined \else
+ \let\normalmulticolumnseject\multicolumnseject
+ \def\multicolumnseject{\ifinoutputstream\else\normalmulticolumnseject\fi}
+\fi
+
+\newif\ifinoutputstream
+
+\newtoks \everyenableoutputstream
+
+\appendtoks
+ \flushsidefloats
+\to \everyenableoutputstream
+
+\def\enableoutputstream[#1]%
+ {\the\everyenableoutputstream
+ \finishoutputstream
+ \writestatus{otr}{switching to output stream #1}%
+ \inoutputstreamtrue
+ \xdef\currentoutputstream{#1}}
+
+\def\disableoutputstream
+ {\finishoutputstream
+ \writestatus{otr}{switching to default output stream}%
+ \inoutputstreamfalse
+ \global\let\currentoutputstream\s!default}
+
+\def\useoutputstream[#1]%
+ {\writestatus{otr}{using output stream #1}%
+ \xdef\currentoutputstream{#1}}
+
+\def\handlestreamoutput
+ {\doifelse\currentoutputstream\s!default
+ {\ifnum\outputpenalty=\streampenalty
+ \ifvoid\normalpagebox \else
+ \unvbox\normalpagebox
+ \fi
+ \else
+ \the\defaultstreamoutput
+ \fi}
+ {\the\normalstreamoutput}}
+
+\OTRONEoutput{\handlestreamoutput}
+
+\def\defineoutputstream[#1]%
+ {\doifundefined{otrs:#1}{\expandafter\newbox\csname otrs:#1\endcsname}}
+
+\def\outputstreamtag#1%
+ {\csname otrs:#1\endcsname}
+
+\def\finishoutputstream % todo: installoutput
+ {\endgraf
+ \penalty\streampenalty
+ \endgraf}
+
+\def\saveoutputstream[#1]%
+ {\writestatus{otr}{saving otr stream #1}%
+ \ifvoid\normalpagebox
+ \global\setbox\outputstreamtag{#1}\emptybox
+ \else
+ \global\setbox\outputstreamtag{#1}\vbox
+ {\presetoutputstream
+ \ifvoid\outputstreamtag{#1}\else\unvbox\outputstreamtag{#1}\fi
+ \scratchdimen\dp\normalpagebox
+ \unvbox\normalpagebox
+ \vskip-\scratchdimen
+ \kern\strutdepth}%
+ \fi}
+
+% \def\presetoutputstream
+% {\pdffirstlineheight\strutheight
+% \pdflastlinedepth \strutdepth
+% \pdfeachlineheight \strutheight
+% \pdfeachlinedepth \strutdepth}
+
+\let\presetoutputstream\relax
+
+\def\outputstreamht [#1]{\ht\outputstreamtag{#1}}
+\def\outputstreamdp [#1]{\dp\outputstreamtag{#1}}
+\def\outputstreamwd [#1]{\wd\outputstreamtag{#1}}
+
+%def\outputstreambox [#1]{\ifvoid\outputstreamtag{#1}\else\box \outputstreamtag{#1}\fi}
+%def\outputstreamcopy[#1]{\ifvoid\outputstreamtag{#1}\else\copy\outputstreamtag{#1}\fi}
+
+\def\dowithoutputstreambox#1[#2]{\ifvoid\outputstreamtag{#2}\else#1\outputstreamtag{#2}\fi}
+
+\def\outputstreamcopy {\dowithoutputstreambox\copy }
+\def\outputstreambox {\dowithoutputstreambox\box }
+\def\outputstreamunvcopy{\dowithoutputstreambox\unvcopy}
+\def\outputstreamunvbox {\dowithoutputstreambox\unvbox }
+
+%D Footnotes don't go along with streams, simply because there is no
+%D way to re-split inserts. A dirty way out is to use marks and store
+%D notes that way.
+
+\def\definemarknote
+ {\dodoubleempty\dodefinemarknote}
+
+\def\dodefinemarknote[#1][#2]%
+ {\definemarking[mn:#1]%
+ \setvalue{mn:#1:n}{0}%
+ \getparameters
+ [mn:#1]
+ [\c!before=,
+ \c!after=,
+ \c!inbetween=\endgraf,
+ \c!command=\firstofoneargument,
+ #2]}
+
+\def\setmarknote[#1]#2%
+ {\doglobal\incrementvalue{mn:#1:n}%
+ \setgvalue{mn:#1:t:\getvalue{mn:#1:n}}{#2}%
+ \expanded{\marking[mn:#1]{\getvalue{mn:#1:n}}}}
+
+\def\flushmarknotes[#1]% assumes split
+ {\begingroup
+% \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
+% \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
+% \ifnum\firstmarknote<\lastmarknote\relax
+% \getvalue{mn:#1\c!before}%
+% \dostepwiserecurse\firstmarknote\lastmarknote\plusone
+% {\ifnum\recurselevel>\firstmarknote\relax
+% \ifnum\recurselevel<\lastmarknote\relax
+% \getvalue{mn:#1\c!inbetween}%
+% \fi
+% \fi
+% \getvalue{mn:#1\c!command}{\getvalue{mn:#1:t:\recurselevel}}}%
+% \getvalue{mn:#1\c!after}%
+% \fi
+ \endgroup}
+
+\def\erasemarknotes[#1]%
+ {\begingroup
+ \edef\firstmarknote{0\fetchmark[mn:#1][column:first]}%
+ \edef\lastmarknote {0\fetchmark[mn:#1][column:last]}%
+ \dostepwiserecurse\firstmarknote\lastmarknote\plusone
+ {\global\letvalue{mn:#1:t:\recurselevel}\empty}%
+ \endgroup}
+
+%D The next section implements synchronization of (currently
+%D two) output streams. In due time we will implement both a
+%D vertical and horizontal system, as well as alternative
+%D splitters (firstpagevsize, succesivevsize etc).
+
+\def\synchronizeoutputstreams[#1]% [one,two] [left,right]
+ {\bgroup
+ \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+ \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+ \forgeteverypar
+ \def\roundingeps{50sp}%
+ \getboxheight\dimen0\of\box\outputstreamtag\firstoutputstream
+ \getboxheight\dimen2\of\box\outputstreamtag\secondoutputstream
+ \scratchdimen\dimexpr\dimen0-\dimen2\relax
+ \ifdim\scratchdimen<-\roundingeps\relax
+ \scratchdimen-\scratchdimen
+ \writestatus{sync}{compensating first stream: \the\scratchdimen/\number\scratchdimen}%
+ \getroundednoflines\scratchdimen
+ \global\setbox\outputstreamtag\firstoutputstream\vbox
+ {\presetoutputstream
+ \unvbox\outputstreamtag\firstoutputstream\dorecurse\noflines\crlf}%
+ \else\ifdim\scratchdimen>\roundingeps\relax
+ \writestatus{sync}{compensating second stream: \the\scratchdimen/\number\scratchdimen}%
+ \getroundednoflines\scratchdimen
+ \global\setbox\outputstreamtag\secondoutputstream\vbox
+ {\presetoutputstream
+ \unvbox\outputstreamtag\secondoutputstream\dorecurse\noflines\crlf}%
+ \else
+ \writestatus{sync}{no need to compensate streams: \the\scratchdimen/\number\scratchdimen}%
+ \fi\fi
+ \egroup}
+
+\def\nofoutputstreamsplitlines {\v!auto} % {40}
+\def\outputstreamsplittolerance {-5}
+
+\def\flushoutputstreampages[#1]%
+ {\bgroup
+ \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+ \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+ \doloop
+ {\flushoutputstreams[#1]%
+ \ifvoid\outputstreamtag\firstoutputstream
+ \ifvoid\outputstreamtag\secondoutputstream
+ \exitloop
+ \else
+ \global\setbox\outputstreamtag\firstoutputstream\vbox{\strut}%
+ \fi
+ \else
+ \ifvoid\outputstreamtag\secondoutputstream
+ \global\setbox\outputstreamtag\secondoutputstream\vbox{\strut}%
+ \else
+ % okay
+ \fi
+ \fi}%
+ \egroup}
+
+\def\flushoutputstreams[#1]%
+ {\bgroup
+ \getfromcommalist[#1][\plusone]\let\firstoutputstream \commalistelement
+ \getfromcommalist[#1][\plustwo]\let\secondoutputstream\commalistelement
+ \doif\nofoutputstreamsplitlines\v!auto
+ {\getrawnoflines\textheight
+ \edef\nofoutputstreamsplitlines{\the\noflines}}%
+ \splittopskip\strutheight
+ \scratchdimen\nofoutputstreamsplitlines\lineheight\relax
+ \unless\iffalse
+ \dimen0\scratchdimen
+ \doloop
+ {\setbox4\copy\outputstreamtag\firstoutputstream
+ \setbox0\vsplit4 to \dimen0
+ \setbox0\vbox
+ {\directsetup{stream:\firstoutputstream:top}%
+ \unvbox0
+ \directsetup{stream:\firstoutputstream:bottom}}%
+ \ifdim\ht0>\scratchdimen
+ \advance\dimen0-\lineheight
+ \else
+ \exitloop
+ \fi}%
+ \scratchdimen\dimen0
+ \dimen2\scratchdimen
+ \doloop
+ {\setbox6\copy\outputstreamtag\secondoutputstream
+ \setbox2\vsplit6 to \dimen2
+ \setbox2\vbox
+ {\directsetup{stream:\secondoutputstream:top}%
+ \unvbox0
+ \directsetup{stream:\secondoutputstream:bottom}}%
+ \ifdim\ht2>\scratchdimen
+ \advance\dimen2-\lineheight
+ \else
+ \exitloop
+ \fi}%
+ \scratchdimen\dimen2
+ \fi
+ \setbox4\copy\outputstreamtag\firstoutputstream
+ \setbox6\copy\outputstreamtag\secondoutputstream
+ \scratchcounter\zerocount
+ \doloop
+ {\setbox0\vsplit4 to \scratchdimen
+ \setbox0\vbox{\unvbox0}%
+ \setbox2\vsplit6 to \scratchdimen
+ \setbox2\vbox{\unvbox2}%
+ \ifvoid4
+ \exitloop
+ \else\ifvoid6
+ \exitloop
+ \else
+ \dimen8=\dimexpr\ht4-\ht6\relax
+ \ifdim\dimen8<\zeropoint\dimen8=-\dimen8\relax\fi
+ \advance\scratchcounter\plusone
+ \ifdim\dimen8<.5\lineheight
+ \exitloop
+ \else\ifnum\outputstreamsplittolerance>\zeropoint
+ \ifnum\scratchcounter>\outputstreamsplittolerance\relax
+ \exitloop
+ \else
+ \advance\scratchdimen\lineheight
+ \fi
+ \else\ifnum\outputstreamsplittolerance<\zeropoint
+ \ifnum-\scratchcounter<\outputstreamsplittolerance\relax
+ \exitloop
+ \else
+ \advance\scratchdimen-\lineheight
+ \fi
+ \else\ifnum\outputstreamsplittolerance=\zeropoint
+ \exitloop
+ \fi\fi\fi\fi
+ \fi\fi}%
+ \setbox0\vsplit\outputstreamtag\firstoutputstream to \scratchdimen
+ \setbox0\vbox to \textheight
+ {\presetoutputstream
+ \directsetup{stream:\firstoutputstream:top}%
+ \unvbox0
+ \vfill
+ \directsetup{stream:\firstoutputstream:bottom}}%
+ \setbox2\vsplit\outputstreamtag\secondoutputstream to \scratchdimen
+ \setbox2\vbox to \textheight
+ {\presetoutputstream
+ \directsetup{stream:\secondoutputstream:top}%
+ \unvbox2
+ \vfill
+ \directsetup{stream:\secondoutputstream:bottom}}%
+ \directsetup{stream:\firstoutputstream:reset}%
+ \directsetup{stream:\secondoutputstream:reset}%
+ \page[even]
+ \box0\vfill\page
+ \box2\vfill\page
+ \egroup}
+
+ %D Although one can put floats in a stream, it sometimes makes sense
+ %D to keep them apart and this is what local floats do.
+
+ \def\setuplocalfloats
+ {\getparameters[\??lf]}
+
+ \setuplocalfloats
+ [%before=\blank,
+ %after=\blank,
+ inbetween=\blank]
+
+ \installfloathandler \v!local \somelocalfloat
+
+ \initializeboxstack{localfloats}
+
+ \newcounter\noflocalfloats
+
+ \def\resetlocalfloats
+ {\doglobal\newcounter\noflocalfloats
+ \initializeboxstack{localfloats}}
+
+ \def\somelocalfloat[#1]%
+ {\doglobal\increment\noflocalfloats
+ \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
+
+ \def\getlocalfloats
+ {\dorecurse\noflocalfloats
+ {\ifnum\recurselevel=\plusone % 1\relax
+ \getvalue{\??lf\c!before}%
+ \else
+ \getvalue{\??lf\c!inbetween}%
+ \fi
+ \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
+ \ifnum\recurselevel=\noflocalfloats\relax
+ \getvalue{\??lf\c!after}%
+ \fi}}
+
+ \def\flushlocalfloats
+ {\getlocalfloats
+ \resetlocalfloats}
+
+ \def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
+
+ \def\forcelocalfloats{\let\forcedfloatmethod\v!local}
+
+%D Because many arrangements are possible, we will implement
+%D some examples in a runtime loadable module \type {m-streams}.
+
+\protect \endinput
diff --git a/tex/context/base/page-str.mkiv b/tex/context/base/page-str.mkiv
new file mode 100644
index 000000000..d73643cbe
--- /dev/null
+++ b/tex/context/base/page-str.mkiv
@@ -0,0 +1,144 @@
+%D \module
+%D [ file=page-str,
+%D version=2010.03.13, % 2006.03.21,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Page Streams,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Page Macros / Page Streams}
+
+%D The first version of this component of \CONTEXT\ was written
+%D for Thomas Schmitz who asked for parallel page streams. While
+%D playing with the code, I decided to make it into a component
+%D that can be used to construct all kind of stream related
+%D mechanisms. Because I could apply this feature in a project,
+%D there is some additional code here (related to graphics).
+%D
+%D These macros were written while listening to and watching the DVD
+%D \quotation {Rush In Rio}.
+%D
+%D The reimplementation (or rather experimenting with the complete
+%D rewrite) was done while looping over \quotation {Wende Snijders
+%D No.9}.
+%D
+%D Remark: marknotes are gone, at least for a while.
+
+\writestatus{loading}{ConTeXt Page Macros / Page Streams}
+
+\registerctxluafile{page-str}{1.001}
+
+\unprotect
+
+\let \currentoutputstream \empty
+\newif \ifinoutputstream
+\newtoks \everyenableoutputstream
+
+\appendtoks
+ \flushsidefloats
+\to \everyenableoutputstream
+
+\def\initializeoutputstreams
+ {\ctxlua{streams.initialize()}%
+ \glet\initializeoutputstreams\relax}
+
+\def\enableoutputstream[#1]%
+ {\initializeoutputstreams
+ \the\everyenableoutputstream
+ \inoutputstreamtrue
+ \xdef\currentoutputstream{#1}%
+ \ctxlua{streams.enable("#1")}}
+
+\def\disableoutputstream
+ {\inoutputstreamfalse
+ \global\let\currentoutputstream\s!default
+ \ctxlua{streams.disable()}}
+
+\unexpanded\def\startoutputstream[#1]%
+ {\begingroup
+ \initializeoutputstreams
+ \the\everyenableoutputstream
+ \inoutputstreamtrue
+ \xdef\currentoutputstream{#1}%
+ \ctxlua{streams.start("#1")}}
+
+\unexpanded\def\stopoutputstream
+ {\ctxlua{streams.stop()}%
+ \endgroup}
+
+\def\flushoutputstream [#1]{\ctxlua{streams.flush("#1")}}
+\def\outputstreamcopy [#1]{\vbox{\ctxlua{streams.flush("#1",true)}}}
+\def\outputstreambox [#1]{\vbox{\ctxlua{streams.flush("#1")}}}
+\def\outputstreamunvcopy[#1]{\ctxlua{streams.flush("#1",true)}}
+\def\outputstreamunvbox [#1]{\ctxlua{streams.flush("#1")}}
+\def\synchronizestreams [#1]{\ctxlua{streams.synchronize("#1")}}
+\def\dopushoutputstream [#1]{\ctxlua{streams.push("#1")}}
+
+\def\pushoutputstream {\dosingleempty\dopushoutputstream}
+
+% \unexpanded\def\defineoutputstream[#1]%
+% {\doifundefined{otrs:#1}{\expandafter\newbox\csname otrs:#1\endcsname}}
+%
+% \def\useoutputstream[#1]%
+% {\writestatus{otr}{using output stream #1}%
+% \xdef\currentoutputstream{#1}}
+%
+% \directsetup{stream:\firstoutputstream:set}
+% \directsetup{stream:\firstoutputstream:top}
+% \directsetup{stream:\firstoutputstream:bottom}
+% \directsetup{stream:\firstoutputstream:reset}
+
+%D Obsolete in \MKIV:
+
+\unexpanded\def\definemarknote {\dodoubleempty\dodefinemarknote}
+\def\dodefinemarknote[#1][#2]{}
+\def\setmarknote [#1]{\gobbleoneargument}
+\def\flushmarknotes [#1]{}
+\def\erasemarknotes [#1]{}
+
+\protect \endinput
+
+% \enabletrackers[streams.flushing]
+%
+% \setuplayout[grid=yes] \showgrid
+%
+% \starttext
+%
+% \input tufte
+%
+% \startoutputstream[nl]
+%
+% Wat doen we hier?
+%
+% \enableoutputstream[en]
+%
+% Are you sleeping, brother John?\footnote{xxx}
+%
+% \dorecurse{4}{x \footnote{note \recurselevel}\input tufte \par \pushoutputstream}
+%
+% \enableoutputstream[de]
+%
+% Bruder Jakob, schläfst du noch?\footnote{yyy}
+%
+% \dorecurse{4}{x \footnote{note \recurselevel}\input ward \par \pushoutputstream}
+%
+% \disableoutputstream
+%
+% \stopoutputstream
+%
+% Vader Jacob, slaap je nog?\footnote{zzz}
+%
+% \input tufte
+%
+% \synchronizestreams[en,de,nl]
+%
+% \page \flushoutputstream[en] \input knuth
+% \page \flushoutputstream[de] \input knuth
+% \page \flushoutputstream[nl] \input knuth
+%
+% \stoptext
diff --git a/tex/context/base/page-txt.mkii b/tex/context/base/page-txt.mkii
new file mode 100644
index 000000000..9fe73bec1
--- /dev/null
+++ b/tex/context/base/page-txt.mkii
@@ -0,0 +1,784 @@
+%D \module
+%D [ file=page-txt, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Texts,
+%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.
+
+% \setuplayouttext in manual
+
+\writestatus{loading}{ConTeXt Page Macros / Texts}
+
+\unprotect
+
+\let\dodummypageskip\gobbleoneargument % obsolete
+
+%D Interfacing between this and other modules is handled by
+%D the following macros. The current state of a text line
+%D (header, footer, etc.) is checked by:
+%D
+%D \starttyping
+%D \resetlayouttextlines
+%D \stoptyping
+%D
+%D The main text box is finished by the following macro:
+%D
+%D \starttyping
+%D \getmainbox <box> <\vbox|\unvbox>
+%D \stoptyping
+%D
+%D The text lines are collected with:
+%D
+%D \starttyping
+%D \gettextboxes
+%D \stoptyping
+%D
+%D It is possible to extens the default content of the text
+%D areas by appending content to the following token list
+%D registers:
+
+\newtoks\toptextcontent \newtoks\leftedgetextcontent
+\newtoks\headertextcontent \newtoks\leftmargintextcontent
+\newtoks\footertextcontent \newtoks\rightmargintextcontent
+\newtoks\bottomtextcontent \newtoks\rightedgetextcontent
+
+\newtoks\texttextcontent
+
+%D \macros
+%D {setuptop, setupheader, setuptext,
+%D setupfooter, setupbottom}
+%D
+%D The macros in this module sometimes look a bit more complicated
+%D than needed, which is a direct result of the fact that their
+%D ancestors are quite old and upward compatibility is a must.
+%D
+%D \showsetup{setuptop}
+%D \showsetup{setupheader}
+%D \showsetup{setuptext}
+%D \showsetup{setupfooter}
+%D \showsetup{setupbottom}
+
+\def\setuplayouttext
+ {\dotripleempty\dosetuplayouttext}
+
+\def\dosetuplayouttext[#1][#2][#3]% beware, non global
+ {\ifthirdargument
+ \getparameters[\??tk#1#2][#3]%
+ \else
+ %\getparameters[\??tk#1\v!text][#2]%
+ \edef\previoustextstate{\getvalue{\??tk#1\c!state}}%
+ \getparameters[\??tk#1][#2]%
+ \doifnotvalue{\??tk#1\c!state}\previoustextstate
+ {%\checkcurrentlayout % no
+ \edef\currenttextstate{\getvalue{\??tk#1\c!state}}%
+ % speed optimization (calculating backgrounds takes time)
+ \doifcommon{\previoustextstate,\currenttextstate}{\v!high,\v!none}
+ {\calculatevsizes
+ \recalculatebackgrounds
+ \recalculatelogos}}%
+ \fi}
+
+\def\setuptop {\dotripleempty\dosetuplayouttext[\v!top]}
+\def\setupheader {\dotripleempty\dosetuplayouttext[\v!header]}
+\def\setuptext {\dotripleempty\dosetuplayouttext[\v!text]}
+\def\setupfooter {\dotripleempty\dosetuplayouttext[\v!footer]}
+\def\setupbottom {\dotripleempty\dosetuplayouttext[\v!bottom]}
+
+%D \macros
+%D {noheaderandfooterlines,notopandbottomlines}
+%D
+%D Although not really needed, the following shortcuts
+%D sometimes come in handy.
+%D
+%D \showsetup{noheaderandfooterlines}
+%D \showsetup{notopandbottomlines}
+
+\def\noheaderandfooterlines
+ {\setupheader[\c!state=\v!empty]%
+ \setupfooter[\c!state=\v!empty]}
+
+\def\notopandbottomlines
+ {\setuptop [\c!state=\v!empty]%
+ \setupbottom[\c!state=\v!empty]}
+
+%D \macros
+%D {setuptoptexts, setupheadertexts, setuptexttexts,
+%D setupfootertexts, setupbottomtexts}
+%D
+%D The next macros take one or more arguments. The exact setup
+%D depends on the number of arguments. Although not that
+%D intuitive, the current scheme evolved out of the original.
+%D When margin and edge texts as well as middle texts showed
+%D up, the current odd|/|even scheme surfaced.
+%D
+%D \showsetup{setuptoptexts}
+%D \showsetup{setupheadertexts}
+%D \showsetup{setuptexttexts}
+%D \showsetup{setupfootertexts}
+%D \showsetup{setupbottomtexts}
+
+\def\setuptoptexts {\dosixtupleempty\dosetuptexts[\v!top]}
+\def\setupheadertexts {\dosixtupleempty\dosetuptexts[\v!header]}
+\def\setuptexttexts {\dosixtupleempty\dosetuptexts[\v!text]}
+\def\setupfootertexts {\dosixtupleempty\dosetuptexts[\v!footer ]}
+\def\setupbottomtexts {\dosixtupleempty\dosetuptexts[\v!bottom]}
+
+%D The left, right and center variables can also be set
+%D directly using the previously discussed macros.
+
+\def\dosetuptexts[#1][#2][#3][#4][#5][#6]%
+ {\ifsixthargument
+ \setvalue{\??tk#1#2\c!lefttext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#6}}%
+ \setvalue{\??tk#1#2\c!righttext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#5}}%
+ \else\iffifthargument
+ \setvalue{\??tk#1\v!text\c!lefttext}%
+ {\dodoubletexts{\??tk#1}\v!text
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#2}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}%
+ \setvalue{\??tk#1\v!text\c!righttext}%
+ {\dodoubletexts{\??tk#1}\v!text
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}}%
+ \else\iffourthargument
+ \setvalue{\??tk#1#2\c!lefttext}%
+ {\dodoubletexts{\??tk#1}{#2}
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}%
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}}%
+ \setvalue{\??tk#1#2\c!righttext}%
+ {\dodoubletexts{\??tk#1}{#2}
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}%
+ \else\ifthirdargument
+ \setvalue{\??tk#1\v!text\c!lefttext}%
+ {\dodoubletexts{\??tk#1}\v!text
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}%
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}}%
+ \setvalue{\??tk#1\v!text\c!righttext}%
+ {\dodoubletexts{\??tk#1}\v!text
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}%
+ \else\ifsecondargument % new
+ \letvalue{\??tk#1\v!text\c!lefttext }\empty
+ \letvalue{\??tk#1\v!text\c!righttext}\empty
+ \setvalue{\??tk#1\v!text\c!middletext }%
+ {\dosingletexts{\??tk#1}\v!text\c!style\c!color\c!width{#2}}%
+ \else
+ \dosixtupleempty\dosetuptexts[#1][\v!text][][][][]%
+ \dosixtupleempty\dosetuptexts[#1][\v!margin][][][][]%
+ \dosixtupleempty\dosetuptexts[#1][\v!edge ][][][][]%
+ \fi\fi\fi\fi\fi}
+
+%D Left and right texts are swapped on odd and even pages, but
+%D only when double sided typesetting is enabled.
+
+\def\dodoubletexts#1#2#3#4#5#6%
+ {\doifoddpageelse
+ {\dosingletexts{#1}{#2}#3{#4}} % #3 => provides three arguments
+ {\dosingletexts{#1}{#2}#5{#6}}} % #5 => provides three arguments
+
+%D The next macro will be cleaned up amd made less messy and
+%D dependent.
+
+\def\placetextlinestrut#1%
+ {\doifvalue{#1\c!strut}\v!yes{\setstrut\strut}}
+
+\def\dosingletexts#1#2#3#4#5#6%
+ {\bgroup
+ \defconvertedargument\ascii{#6}%
+ \doifsomething\ascii
+ {\doattributes{#1#2}#3#4%
+ {\placetextlinestrut{#1}% here !
+ %\doifdefinedelse{\??mk\ascii\c!coupling} % brrr
+ \doifelsemarking\ascii
+ {\dolimitatetexts{#1#2#5}{\getmarking[\ascii][\v!first]}}
+ {\ConvertConstantAfter\doifelse\v!pagenumber{#6}
+ \@@plaatspaginanummer
+ {\ConvertConstantAfter\doifelse\v!date{#6}
+ {\currentdate}
+ {% #6{}{}{} -> {} needed for macros that look
+ % ahead, like \uniqueMPgraphic
+ \opeenregel\dolimitatetexts{#1#2#5}{#6{}{}{}}}}}}}%
+ \egroup}
+
+%D When specified, the texts are automatically limited in
+%D length.
+
+\def\dolimitatetexts#1#2%
+ {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\getvalue{#1}}{\unknown}}}
+
+%D The placement of text is hooked into the token lists
+%D associated to the area at hand.
+
+\appendtoks \placelayouttextline\v!top \topheight \to \toptextcontent
+\appendtoks \placelayouttextline\v!header\headerheight \to \headertextcontent
+\appendtoks \placelayouttextline\v!text \textheight \to \texttextcontent
+\appendtoks \placelayouttextline\v!footer\footerheight \to \footertextcontent
+\appendtoks \placelayouttextline\v!bottom\bottomheight \to \bottomtextcontent
+
+%D Texts can be disabled, moved up and ignored, depending in
+%D the \type {status} variable. This is handled by the next
+%D couple of macros.
+
+\def\settextlinestatus #1{\edef\textlinestatus{\csname\??tk#1\c!state\endcsname}}
+%def\resettextlinestatus#1{\letgvalue{\??tk#1\c!state}\v!normal}
+
+\def\resettextlinestatus#1% postpone
+ {\setgvalue{\??tk#1\s!reset}{\letgvalue{\??tk#1\c!state}\v!normal}}
+
+\def\placelayouttextline#1% #2
+ {\settextlinestatus{#1}%
+ \csname\string\placelayouttextline
+ \ifundefined{\string\placelayouttextline\textlinestatus}%
+ \s!unknown
+ \else
+ \textlinestatus
+ \fi
+ \endcsname{#1}} % {#2}
+
+\def\doifelselayouttextline#1% shown or not
+ {\doifinsetelse{\getvalue{\??tk#1\c!state}}{\v!normal,\v!start}}
+
+\def\doifelselayoutsomeline#1% present or not
+ {\edef\!!stringa{\csname\??tk#1\c!state\endcsname}%
+ \ifx\!!stringa\v!none
+ \@EA\secondoftwoarguments
+ \else\ifx\!!stringa\v!high
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
+
+% \doplacelayouttextline does the actual placement (when a non-zero height)
+
+\newconditional\resyncaftertextline
+
+\setvalue{\string\placelayouttextline\v!normal }{\doplacelayouttextline}
+\setvalue{\string\placelayouttextline }{\doplacelayouttextline}
+
+\setvalue{\string\placelayouttextline\v!none}#1#2%
+ {}
+
+\setvalue{\string\placelayouttextline\v!high}#1#2%
+ {\global\settrue\resyncaftertextline
+ \resettextlinestatus{#1}}
+
+\setvalue{\string\placelayouttextline\v!empty}#1#2%
+ {\resettextlinestatus{#1}}
+
+\setvalue{\string\placelayouttextline\v!start}#1#2%
+ {\resettextlinestatus{#1}%
+ \doplacelayouttextline{#1}{#2}}
+
+\setvalue{\string\placelayouttextline\v!stop}#1#2%
+ {}
+
+\setvalue{\string\placelayouttextline\v!nomarking}#1#2%
+ {\bgroup
+ \resettextlinestatus{#1}%
+ \let\dogetmarking\nogetmarking
+ \doplacelayouttextline{#1}{#2}%
+ \egroup}
+
+\setvalue{\string\placelayouttextline\s!unknown}#1#2%
+ {\global\settrue\resyncaftertextline
+ \bgroup % new
+ \resettextlinestatus{#1}%
+ \getvalue{\??tk#1\textlinestatus}%
+ \getvalue{\??tk#1\v!text \textlinestatus}%
+ \getvalue{\??tk#1\v!margin\textlinestatus}%
+ \getvalue{\??tk#1\v!edge \textlinestatus}%
+ \doplacelayouttextline{#1}{#2}%
+ \egroup}
+
+%D The following macro has to be called after a page
+%D is flushed.
+
+\def\resetlayouttextline#1%
+ {\getvalue {\??tk#1\s!reset}%
+ \letgvalue{\??tk#1\s!reset}\relax}
+
+\def\resetlayouttextlines
+ {\resetlayouttextline\v!top
+ \resetlayouttextline\v!header
+ \resetlayouttextline\v!text
+ \resetlayouttextline\v!footer
+ \resetlayouttextline\v!bottom
+ \ifconditional\resyncaftertextline
+ \doglobal\calculatevsizes
+ \recalculatebackgrounds
+ \recalculatelogos
+ \global\setfalse\resyncaftertextline
+ \fi}
+
+% \settext[header][text][middle][xxx][yyy]
+
+\def\settextcontent
+ {\doquintupleempty\dosettextcontent}
+
+\def\dosettextcontent[#1][#2][#3][#4][#5]% header text middle text/text
+ {\iffifthargument
+ \setvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}%
+ \else\iffourthargument
+ \setvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}%
+ \else\ifthirdargument
+ \setvalue{\??tk#1#2\c!middletext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}%
+ \fi\fi\fi}
+
+\def\resettextcontent
+ {\dotripleempty\doresettextcontent}
+
+\def\doresettextcontent[#1][#2][#3]% header text middle
+ {\ifthirdargument
+ \letvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}\empty
+ \else\ifsecondargument
+ \letvalue{\??tk#1#2\c!lefttext }\empty
+ \letvalue{\??tk#1#2\c!middletext}\empty
+ \letvalue{\??tk#1#2\c!righttext }\empty
+ \fi\fi}
+
+\let\settext \settextcontent % downward compatibility
+\let\resettext\resettextcontent % downward compatibility
+
+\setvalue{:\c!middle:\c!text:}{\c!middletext}
+\setvalue{:\c!left :\c!text:}{\c!lefttext }
+\setvalue{:\c!right :\c!text:}{\c!righttext }
+
+%D The next series of macros is not that easy to read,
+%D because they hook into the main page building macros. By
+%D using token list registers for the text content, we can
+%D easily hook in other code, like menu generators.
+%D
+%D Beware: the token lists are always expanded, also when the
+%D height of an area is zero. This is because reset actions can
+%D be part of them.
+
+\newbox\scratchpagebox
+
+\def\gettextboxes
+ {\setbox\scratchpagebox\vbox
+ {\dontcomplain
+ \calculatereducedvsizes
+ \swapmargins
+ \offinterlineskip
+ \vskip\dimexpr-\topheight-\topdistance\relax
+ \the\toptextcontent
+ \vskip\dimexpr\topheight+\topdistance\relax
+ \the\headertextcontent
+ \vskip\dimexpr\headerheight+\headerdistance\relax
+ \placepositionanchors
+ \vskip-\textheight
+ \the\texttextcontent
+ \vskip\textheight
+ \the\everyendoftextbody
+ \vskip\footerdistance
+ \the\footertextcontent
+ \vskip\dimexpr\footerheight+\bottomdistance\relax
+ \the\bottomtextcontent
+ \vskip\bottomheight
+ \vfilll}%
+ \smashbox\scratchpagebox
+ \box\scratchpagebox}
+
+\def\getmainbox#1#2%
+ {\setbox\scratchpagebox\vbox
+ {\offinterlineskip % na \paginaletter !
+ \calculatereducedvsizes
+ \calculatehsizes
+ \swapmargins
+ \vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax
+ \hbox to \makeupwidth
+ {\bgroup
+ \swapmargins
+ \goleftonpage
+ \ifdim\leftedgewidth>\zeropoint
+ \the\leftedgetextcontent
+ \hskip\leftedgewidth
+ \fi
+ \hskip\leftedgedistance
+ \ifdim\leftmarginwidth>\zeropoint
+ \the\leftmargintextcontent
+ \hskip\leftmarginwidth
+ \fi
+ \hskip\leftmargindistance
+ \egroup
+ \mkprocesspagecontents{#2}%
+ \settextpagecontent\scratchpagebox{#1}{#2}%
+ \setbox\scratchpagebox\vbox % can we avoid this extra box
+ {\startlayoutcomponent{textbody}{text body}%
+ \box\scratchpagebox
+ \stoplayoutcomponent}%
+ \addtextbackground\scratchpagebox
+ \addtextgridlayer\scratchpagebox
+ \localstarttextcolor % does not work in mkiv
+ \box\scratchpagebox
+ \localstoptextcolor % so we have to change this
+ \bgroup
+ \hskip\rightmargindistance
+ \ifdim\rightmarginwidth>\zeropoint
+ \the\rightmargintextcontent
+ \hskip\rightmarginwidth
+ \fi
+ \hskip\rightedgedistance
+ \ifdim\rightedgewidth>\zeropoint
+ \the\rightedgetextcontent
+ \hskip\rightedgewidth
+ \fi
+ \egroup
+ \hss}}%
+ \smashbox\scratchpagebox
+ \box\scratchpagebox}
+
+%D The main text area has to be combined with some additional
+%D (tracing) information.
+
+% will be overloaded in page-lyr
+
+\def\settextpagecontent#1#2#3% #2 and #3 will disappear
+ {\setbox#1\hbox to \makeupwidth
+ {\hss % so don't change this
+ \vbox to \textheight
+ {\offinterlineskip
+ \freezetextwidth
+ \hsize\textwidth % local variant of \sethsize
+ \boxmaxdepth\maxdepth
+ \noindent % content can be < \hsize
+ \dopagecontents#2#3}%
+ \hss}%
+ \dp#1\zeropoint}
+
+\definepalet
+ [layout]
+ [grid=red,
+ page=green]
+
+\def\addtextgridlayer#1% tzt run time
+ {\ifcase\showgridstate\else % 1=bottom 2=top
+ \setgridbox\scratchbox\makeupwidth\textheight
+ \setbox#1\hbox
+ {\ifcase\showgridstate\or\or\box#1\hskip-\makeupwidth\fi
+ \bgroup % color
+ \startlayoutcomponent{gridcolumns}{grid columns}%
+ \incolortrue
+ \ifcase\layoutcolumns\else
+ \gray
+ \hbox to \makeupwidth
+ {\dorecurse\layoutcolumns
+ {\hskip\layoutcolumnwidth
+ \ifnum\recurselevel<\layoutcolumns
+ \vrule
+ \!!height\ht\scratchbox
+ \!!depth\dp\scratchbox
+ \!!width\layoutcolumndistance
+ \fi}}%
+ \hskip-\makeupwidth
+ \fi
+ \stoplayoutcomponent
+ \startlayoutcomponent{gridlines}{grid lines}%
+ \startcolor[layout:grid]\box\scratchbox\stopcolor
+ \stoplayoutcomponent
+ \egroup
+ \ifcase\showgridstate\or\hskip-\makeupwidth\box#1\fi}%
+ \fi}
+
+%D The placement of a whole line is handled by the next two
+%D macros. These are hooked into the general purpose token
+%D list registers mentioned before.
+
+\def\ignoredlinebreak{\unskip\space\ignorespaces}
+
+\def\doplacelayouttextline#1#2%
+ {\ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height
+ \goleftonpage
+ \hbox
+ {\setbox\scratchpagebox\vbox to #2
+ {%\forgetall
+ \vsize#2\relax
+ \normalbaselines
+ \let\\\ignoredlinebreak
+ \let\crlf\ignoredlinebreak
+ %\getvalue{\??tk#1\v!text\c!before}%
+ \getvalue{\??tk#1\c!before}%
+ \doifbothsidesoverruled
+ {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\gobbleoneargument\getvalue}
+ {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\gobbleoneargument\getvalue}
+ {\dodoplacelayouttextline#1\c!righttext\c!middletext\c!lefttext \getvalue\gobbleoneargument}%
+ %\getvalue{\??tk#1\v!text\c!after}%
+ \getvalue{\??tk#1\c!after}%
+ \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
+ \dp\scratchpagebox\zeropoint
+ \box\scratchpagebox}%
+ \vskip-#2\relax
+ \fi}
+
+\def\dodoplacelayouttextline#1#2#3#4#5#6% \hsize toegevoegd, \hss's niet meer wijzigen
+ {\hbox
+ {\ifdim\leftedgewidth>\zeropoint
+ \dododoplacelayouttextline\leftedgewidth{#1}\v!edge
+ {\hss\getvalue{\??tk#1\v!edge#2}}%
+ \hskip\leftedgedistance
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ \dododoplacelayouttextline\leftmarginwidth{#1}\v!margin
+ {\hbox to \leftmarginwidth
+ {\hss\getvalue{\??tk#1\v!margin#2}}%
+ \hskip-\leftmarginwidth
+ \hbox to \leftmarginwidth
+ {\hss#5{\??tk#1\v!margin\c!margintext}}}%
+ \hskip\leftmargindistance
+ \fi
+ \ifdim\makeupwidth>\zeropoint
+ \dododoplacelayouttextline\makeupwidth{#1}\v!text
+ {\hbox to \makeupwidth
+ {\@@nmpre{#5{\??tk#1\v!text\c!marginedgetext}}%
+ \getvalue{\??tk#1\v!text#2}\hss}%
+ \hskip-\makeupwidth
+ \hbox to \makeupwidth
+ {\hss\getvalue{\??tk#1\v!text#3}\hss}%
+ \hskip-\makeupwidth
+ \hbox to \makeupwidth
+ {\hss\getvalue{\??tk#1\v!text#4}%
+ \@@nmpos{#6{\??tk#1\v!text\c!marginedgetext}}}}%
+ \fi
+ \ifdim\rightmarginwidth>\zeropoint
+ \hskip\rightmargindistance
+ \dododoplacelayouttextline\rightmarginwidth{#1}\v!margin
+ {\hbox to \rightmarginwidth
+ {\getvalue{\??tk#1\v!margin#4}\hss}%
+ \hskip-\rightmarginwidth
+ \hbox to \rightmarginwidth
+ {#6{\??tk#1\v!margin\c!margintext}\hss}}%
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ \hskip\rightedgedistance
+ \dododoplacelayouttextline\rightedgewidth{#1}\v!edge
+ {\getvalue{\??tk#1\v!edge#4}\hss}%
+ \fi}}
+
+% \def\dododoplacelayouttextline#1#2#3#4%
+% {\vbox % to \vsize
+% {\hsize#1\relax
+% \getvalue{\??tk#2#3\c!voor}
+% \hbox to #1{#4}%
+% \getvalue{\??tk#2#3\c!na}}}
+
+\def\dododoplacelayouttextline#1#2#3#4%
+ {\vbox % to \vsize
+ {\hsize#1\relax
+ \getvalue{\??tk#2#3\c!before}%
+ \startlayoutcomponent{t:#2:#3}{area #2 #3}%
+ \hbox to #1{#4}%
+ \stoplayoutcomponent
+ \getvalue{\??tk#2#3\c!after}}}
+
+%D Although it is far better to use backgrounds for this
+%D purpose, one can add a rule in the following way. This
+%D method makes the rules disappear in case of an empty text
+%D line. Consider this a feature.
+%D
+%D \starttyping
+%D \setupheadertexts[left][right]
+%D
+%D \setupheader[text][after=\hrule,style=bold]
+%D
+%D \starttext
+%D \input tufte \page
+%D \setupheader[state=empty]
+%D \input tufte \page
+%D \stoptext
+%D \stoptyping
+
+%D The next twosome will be done differently (using an
+%D existing auxiliary macro).
+
+% \def\@@nmpre#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\unhbox0\tfskip\fi}
+% \def\@@nmpos#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\tfskip\unhbox0\fi}
+
+% cleaner
+
+\def\@@nmpre#1{\doiftext{#1}{{#1}\tfskip}}
+\def\@@nmpos#1{\doiftext{#1}{\tfskip{#1}}}
+
+% newer
+
+\def\@@nmprepos#1#2#3#4#5%
+ {\doifelsenothing\@@nmwidth
+ {\doiftext{#5}{#1{#5}#2}}
+ {\doiftext{#5}{\hbox to \@@nmwidth{#3{#5}#4}}}}
+
+\def\@@nmpre{\@@nmprepos\empty\tfskip\relax\hss}
+\def\@@nmpos{\@@nmprepos\tfskip\empty\hss\relax}
+
+%D This code will move to \type {page-flt.tex}.
+
+\appendtoks
+ \plaatsrechtermargeblok \hskip-\rightmarginwidth
+\to \rightmargintextcontent
+
+\appendtoks
+ \plaatslinkermargeblok \hskip-\leftmarginwidth
+\to \leftmargintextcontent
+
+%D The next hook will later be used for keeping track of
+%D positions, i.e.\ it will provide a proper (page
+%D dependent) reference point.
+
+\ifx\undefined\placepositionanchors
+ \def\placepositionanchors{\vskip\textheight}
+\fi
+
+%D \macros
+%D {definetext}
+%D
+%D Some macros ago, we implemented the \type {status} option
+%D \type {unknown}. This one is used to take care of
+%D symbolic texts handlers.
+%D
+%D \showsetup{definetext}
+%D
+%D The next example demonstrates how we can use this
+%D mechanism to provide page (event) dependent text lines.
+%D
+%D \starttyping
+%D \definetext[chapter][footer][pagenumber]
+%D \setuphead[chapter][header=high,footer=chapter]
+%D \setupheadertexts[pagenumber]
+%D \setupfootertexts[left][right]
+%D \chapter{eerste} \dorecurse{20}{\input tufte \relax}
+%D \chapter{tweede} \dorecurse{20}{\input tufte \relax}
+%D \stoptyping
+
+\def\definetext
+ {\doseventupleempty\dodefinetext}
+
+\def\dodefinetext[#1][#2][#3][#4][#5][#6][#7]%
+ {\ifseventhargument
+ \setvalue{\??tk#2#3#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5][#6][#7]}%
+ \else\ifsixthargument
+ \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5][#6]}%
+ \else\iffifthargument
+ \setvalue{\??tk#2#3#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5]}%
+ \else\iffourthargument
+ \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4]}%
+ \else
+ \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3]}%
+ \fi\fi\fi\fi}
+
+%D The rest of this file is dedicated to setting up the
+%D texts. This code is not that impressive.
+
+\setupheadertexts [\v!text] [] []
+\setupheadertexts [\v!margin] [] []
+\setupheadertexts [\v!edge] [] []
+
+\setupfootertexts [\v!text] [] []
+\setupfootertexts [\v!margin] [] []
+\setupfootertexts [\v!edge] [] []
+
+\setuptexttexts [\v!text] [] []
+\setuptexttexts [\v!margin] [] []
+\setuptexttexts [\v!edge] [] []
+
+\setupbottomtexts [\v!text] [] []
+\setupbottomtexts [\v!margin] [] []
+\setupbottomtexts [\v!edge] [] []
+
+\setuptoptexts [\v!text] [] []
+\setuptoptexts [\v!margin] [] []
+\setuptoptexts [\v!edge] [] []
+
+% alternative
+%
+% \def\resetlayouttekst%
+% {\dodoubleempty\doresetlayouttekst}
+%
+% \def\doresetlayouttekst[#1][#2]%
+% {\ifsecondargument
+% \dodoresetlayouttekst[#1][#2]%
+% \else
+% \dodoresetlayouttekst[#1][\v!tekst]%
+% \fi}
+%
+% \def\dodoresetlayouttekst[#1][#2]%
+% {...}
+%
+% \def\docommand#1%
+% {\resetlayouttekst[#1][\v!tekst]%
+% \resetlayouttekst[#1][\v!marge]%
+% \resetlayouttekst[#1][\v!rand]}
+
+%D We combine a lot of similar settings in a macro that
+%D we will later dispose.
+
+\def\dodocommand[#1][#2]%
+ {\getparameters
+ [\??tk#1#2]
+ [%\c!state=\v!normal, % moved
+ \c!before=, % both global and local are used
+ \c!after=, % both global and local are used
+ \c!strut=, % the local one, not (yet) used
+ \c!style=\getvalue{\??tk#1\c!style},% hm, got lost
+ \c!color=\getvalue{\??tk#1\c!color}, % hm, got lost
+ \c!lefttext=,
+ \c!middletext=,
+ \c!righttext=,
+ \c!marginedgetext=,
+ \c!margintext=,
+ \c!width=]%
+ \inheritparameter[\??tk#1#2][\c!leftstyle ][\c!style ]%
+ \inheritparameter[\??tk#1#2][\c!rightstyle ][\c!style ]%
+ \inheritparameter[\??tk#1#2][\c!leftcolor ][\c!color ]%
+ \inheritparameter[\??tk#1#2][\c!rightcolor ][\c!color ]%
+ \inheritparameter[\??tk#1#2][\c!leftwidth ][\c!width]%
+ \inheritparameter[\??tk#1#2][\c!rightwidth][\c!width]}
+
+\def\docommand#1%
+ {\dodocommand[#1][\v!text]%
+ \dodocommand[#1][\v!margin]%
+ \dodocommand[#1][\v!edge]}
+
+\docommand\v!top
+\docommand\v!header
+\docommand\v!footer
+\docommand\v!text
+\docommand\v!bottom
+
+\let\docommand \relax
+\let\dodocommand\relax
+
+%D While the header and footer lines are moved away from the
+%D main text, the top and bottom lines are centered.
+
+\setuptop [\c!state=\v!normal,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setupheader[\c!state=\v!normal,\c!before=, \c!after=\vss,\c!strut=\v!yes]
+\setuptext [\c!state=\v!normal,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setupfooter[\c!state=\v!normal,\c!before=\vss,\c!after=, \c!strut=\v!yes]
+\setupbottom[\c!state=\v!normal,\c!before=\vss,\c!after=\vss,\c!strut=]
+
+\setuptop [\c!style=,\c!color=]
+\setupheader[\c!style=,\c!color=]
+\setuptext [\c!style=,\c!color=]
+\setupfooter[\c!style=,\c!color=]
+\setupbottom[\c!style=,\c!color=]
+
+\protect \endinput
diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv
new file mode 100644
index 000000000..bdc7c1bb6
--- /dev/null
+++ b/tex/context/base/page-txt.mkiv
@@ -0,0 +1,850 @@
+%D \module
+%D [ file=page-txt, % copied from main-001,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Texts,
+%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.
+
+% where we can do some mkiv cleanup
+
+% \setuplayouttext in manual
+
+\writestatus{loading}{ConTeXt Page Macros / Texts}
+
+\unprotect
+
+%D Interfacing between this and other modules is handled by
+%D the following macros. The current state of a text line
+%D (header, footer, etc.) is checked by:
+%D
+%D \starttyping
+%D \resetlayouttextlines
+%D \stoptyping
+%D
+%D The main text box is finished by the following macro:
+%D
+%D \starttyping
+%D \getmainbox <box> <\vbox|\unvbox>
+%D \stoptyping
+%D
+%D The text lines are collected with:
+%D
+%D \starttyping
+%D \gettextboxes
+%D \stoptyping
+%D
+%D It is possible to extens the default content of the text
+%D areas by appending content to the following token list
+%D registers:
+
+\newtoks\toptextcontent \newtoks\leftedgetextcontent
+\newtoks\headertextcontent \newtoks\leftmargintextcontent
+\newtoks\footertextcontent \newtoks\rightmargintextcontent
+\newtoks\bottomtextcontent \newtoks\rightedgetextcontent
+
+\newtoks\texttextcontent
+
+%D \macros
+%D {setuptop, setupheader, setuptext,
+%D setupfooter, setupbottom}
+%D
+%D The macros in this module sometimes look a bit more complicated
+%D than needed, which is a direct result of the fact that their
+%D ancestors are quite old and upward compatibility is a must.
+%D
+%D \showsetup{setuptop}
+%D \showsetup{setupheader}
+%D \showsetup{setuptext}
+%D \showsetup{setupfooter}
+%D \showsetup{setupbottom}
+
+\unexpanded\def\setuplayouttext
+ {\dotripleempty\dosetuplayouttext}
+
+\def\dosetuplayouttext[#1][#2][#3]% beware, non global
+ {\ifthirdargument
+ \getparameters[\??tk#1#2][#3]%
+ \else
+ %\getparameters[\??tk#1\v!text][#2]%
+ \edef\previoustextstate{\csname\??tk#1\c!state\endcsname}%
+ \getparameters[\??tk#1][#2]%
+ \edef\currenttextstate{\csname\??tk#1\c!state\endcsname}%
+ \ifx\currenttextstate\previoustextstate
+ % no change in state
+ \else
+ %\checkcurrentlayout % no
+ % speed optimization (calculating backgrounds takes time)
+ \doifcommon{\previoustextstate,\currenttextstate}{\v!high,\v!none}
+ {\calculatevsizes
+ \recalculatebackgrounds}%
+ \fi
+ \fi}
+
+\unexpanded\def\setuptop {\dotripleempty\dosetuplayouttext[\v!top]}
+\unexpanded\def\setupheader {\dotripleempty\dosetuplayouttext[\v!header]}
+\unexpanded\def\setuptext {\dotripleempty\dosetuplayouttext[\v!text]}
+\unexpanded\def\setupfooter {\dotripleempty\dosetuplayouttext[\v!footer]}
+\unexpanded\def\setupbottom {\dotripleempty\dosetuplayouttext[\v!bottom]}
+
+%D \macros
+%D {noheaderandfooterlines,notopandbottomlines}
+%D
+%D Although not really needed, the following shortcuts
+%D sometimes come in handy.
+%D
+%D \showsetup{noheaderandfooterlines}
+%D \showsetup{notopandbottomlines}
+
+\def\noheaderandfooterlines
+ {\setupheader[\c!state=\v!empty]%
+ \setupfooter[\c!state=\v!empty]}
+
+\def\notopandbottomlines
+ {\setuptop [\c!state=\v!empty]%
+ \setupbottom[\c!state=\v!empty]}
+
+%D \macros
+%D {setuptoptexts, setupheadertexts, setuptexttexts,
+%D setupfootertexts, setupbottomtexts}
+%D
+%D The next macros take one or more arguments. The exact setup
+%D depends on the number of arguments. Although not that
+%D intuitive, the current scheme evolved out of the original.
+%D When margin and edge texts as well as middle texts showed
+%D up, the current odd|/|even scheme surfaced.
+%D
+%D \showsetup{setuptoptexts}
+%D \showsetup{setupheadertexts}
+%D \showsetup{setuptexttexts}
+%D \showsetup{setupfootertexts}
+%D \showsetup{setupbottomtexts}
+
+\unexpanded\def\setuptoptexts {\dosixtupleempty\dosetuptexts[\v!top ]}
+\unexpanded\def\setupheadertexts {\dosixtupleempty\dosetuptexts[\v!header ]}
+\unexpanded\def\setuptexttexts {\dosixtupleempty\dosetuptexts[\v!text ]}
+\unexpanded\def\setupfootertexts {\dosixtupleempty\dosetuptexts[\v!footer ]}
+\unexpanded\def\setupbottomtexts {\dosixtupleempty\dosetuptexts[\v!bottom ]}
+
+%D The left, right and center variables can also be set
+%D directly using the previously discussed macros.
+
+\def\dosetuptexts[#1][#2][#3][#4][#5][#6]%
+ {\ifsixthargument
+ \setvalue{\??tk#1#2\c!lefttext}%
+ {\dodoubletexts{#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#6}}%
+ \setvalue{\??tk#1#2\c!righttext}%
+ {\dodoubletexts{#1}{#2}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#5}}%
+ \else\iffifthargument
+ \setvalue{\??tk#1\v!text\c!lefttext}%
+ {\dodoubletexts{#1}\v!text
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#2}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}%
+ \setvalue{\??tk#1\v!text\c!righttext}%
+ {\dodoubletexts{#1}\v!text
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}}%
+ \else\iffourthargument
+ \setvalue{\??tk#1#2\c!lefttext}%
+ {\dodoubletexts{#1}{#2}
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}%
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#3}}%
+ \setvalue{\??tk#1#2\c!righttext}%
+ {\dodoubletexts{#1}{#2}
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}%
+ \else\ifthirdargument
+ \setvalue{\??tk#1\v!text\c!lefttext}%
+ {\dodoubletexts{#1}\v!text
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}%
+ {\c!leftstyle\c!leftcolor\c!leftwidth}{#2}}%
+ \setvalue{\??tk#1\v!text\c!righttext}%
+ {\dodoubletexts{#1}\v!text
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}%
+ \else\ifsecondargument % new
+ \letvalue{\??tk#1\v!text\c!lefttext }\empty
+ \letvalue{\??tk#1\v!text\c!righttext }\empty
+ \setvalue{\??tk#1\v!text\c!middletext}{\dosingletexts{#1}\v!text\c!style\c!color\c!width{#2}}%
+ \else
+ \dosixtupleempty\dosetuptexts[#1][\v!text ][][][][]%
+ \dosixtupleempty\dosetuptexts[#1][\v!margin][][][][]%
+ \dosixtupleempty\dosetuptexts[#1][\v!edge ][][][][]%
+ \fi\fi\fi\fi\fi}
+
+%D Left and right texts are swapped on odd and even pages, but
+%D only when double sided typesetting is enabled.
+
+\def\dodoubletexts{\doifoddpageelse\dodoubletextsodd\dodoubletextseven}
+
+\def\dodoubletextsodd #1#2#3#4#5#6{\dosingletexts{#1}{#2}#3{#4}} % #3 => provides three arguments
+\def\dodoubletextseven#1#2#3#4#5#6{\dosingletexts{#1}{#2}#5{#6}} % #5 => provides three arguments
+
+%D The next macro will be cleaned up and made less messy and
+%D dependent.
+
+\unexpanded\def\placetextlinestrut#1%
+ {\doifvalue{#1\c!strut}\v!yes{\setstrut\strut}}
+
+\def\dosingletexts#1#2#3#4#5#6%
+ {\bgroup
+ \defconvertedargument\ascii{#6}% no longer \defconvertedargument, this also does not permit \v!pagenumber (i.e. v!)
+ \ifx\ascii\empty\else
+ \dostartattributes{\??tk#1#2}#3#4\empty
+ \placetextlinestrut{\??tk#1}% here !
+ \doifelsemarking\ascii
+ {\dolimitatetexts{\??tk#1#2#5}{\getmarking[\ascii][\v!first]}}%
+ {\ifcsname\??tk->\ascii\endcsname
+ \csname\??tk->\ascii\endcsname
+ \else
+ % #6{}{}{} -> {} needed for macros that look
+ % ahead, like \uniqueMPgraphic
+ \ignorecrlf\dolimitatetexts{\??tk#1#2#5}{#6{}{}{}}%
+ \fi}%
+ \dostopattributes
+ \fi
+ \egroup}
+
+\setvalue{\??tk->\v!pagenumber}{\placelocationpagenumber}
+\setvalue{\??tk->\v!date }{\currentdate}
+
+%D When specified, the texts are automatically limited in
+%D length.
+
+\def\dolimitatetexts#1#2%
+ {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\csname#1\endcsname}{\unknown}}}
+
+%D The placement of text is hooked into the token lists
+%D associated to the area at hand.
+
+\appendtoks \placelayouttextline\v!top \topheight \to \toptextcontent
+\appendtoks \placelayouttextline\v!header\headerheight \to \headertextcontent
+\appendtoks \placelayouttextline\v!text \textheight \to \texttextcontent
+\appendtoks \placelayouttextline\v!footer\footerheight \to \footertextcontent
+\appendtoks \placelayouttextline\v!bottom\bottomheight \to \bottomtextcontent
+
+%D Texts can be disabled, moved up and ignored, depending in
+%D the \type {status} variable. This is handled by the next
+%D couple of macros.
+
+% \def\settextlinestatus#1%
+% {\edef\textlinestatus{\csname\??tk#1\c!state\endcsname}}
+
+\def\settextlinestatus#1%
+ {\ifcase0\csname\??tk#1\c!n\endcsname\relax
+ \edef\textlinestatus{\csname\??tk#1\c!state\endcsname}%
+ \else
+ \setxvalue{\??tk#1\c!n}{\the\numexpr\csname\??tk#1\c!n\endcsname-1}%
+ \let\textlinestatus\v!stop
+ \fi}
+
+\appendtoks
+ \doifinset\v!header\floatspecification{\setxvalue{\??tk\v!header\c!n}{1}}%
+ \doifinset\v!footer\floatspecification{\setxvalue{\??tk\v!footer\c!n}{1}}%
+\to \everybeforeflushedpagefloat
+
+\def\resettextlinestatus#1% postpone
+ {\expandafter\gdef\csname\??tk#1\s!reset\endcsname{\global\expandafter\let\csname\??tk#1\c!state\endcsname\v!normal}}
+
+\unexpanded\def\placelayouttextline#1% #2
+ {\settextlinestatus#1%
+ \csname\??tk::\ifcsname\??tk::\textlinestatus\endcsname\textlinestatus\else\s!unknown\fi\endcsname#1} % {#2}
+
+\def\doifelselayouttextline#1% shown or not
+ {\edef\!!stringa{\csname\??tk#1\c!state\endcsname}%
+ \ifx\!!stringa\v!normal
+ \@EA\firstoftwoarguments
+ \else\ifx\!!stringa\v!start
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi\fi}
+
+\def\doifelselayoutsomeline#1% present or not
+ {\edef\!!stringa{\csname\??tk#1\c!state\endcsname}%
+ \ifx\!!stringa\v!none
+ \@EA\secondoftwoarguments
+ \else\ifx\!!stringa\v!high
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
+
+% \doplacelayouttextline does the actual placement (when a non-zero height)
+
+\newconditional\resyncaftertextline
+
+% there is no need for {#1} etc since we use symbolic names
+
+\setvalue{\??tk::\v!normal}{\doplacelayouttextline}
+\setvalue{\??tk::\empty }{\doplacelayouttextline}
+
+\setvalue{\??tk::\v!none }#1#2{}
+\setvalue{\??tk::\v!stop }#1#2{}
+
+\setvalue{\??tk::\v!high}#1#2%
+ {\global\settrue\resyncaftertextline
+ \resettextlinestatus#1}
+
+\setvalue{\??tk::\v!empty}#1#2%
+ {\resettextlinestatus#1}
+
+\setvalue{\??tk::\v!start}#1#2%
+ {\resettextlinestatus#1%
+ \doplacelayouttextline#1#2}
+
+\setvalue{\??tk::\v!nomarking}#1#2%
+ {\bgroup
+ \resettextlinestatus#1%
+ \let\dogetmarking\nogetmarking
+ \doplacelayouttextline#1#2%
+ \egroup}
+
+\setvalue{\??tk::\s!unknown}#1#2%
+ {\global\settrue\resyncaftertextline
+ \bgroup % new
+ \resettextlinestatus#1%
+ \csname\??tk#1\textlinestatus\endcsname
+ \csname\??tk#1\v!text \textlinestatus\endcsname
+ \csname\??tk#1\v!margin\textlinestatus\endcsname
+ \csname\??tk#1\v!edge \textlinestatus\endcsname
+ \doplacelayouttextline#1#2%
+ \egroup}
+
+%D The following macro has to be called after a page
+%D is flushed.
+
+\def\resetlayouttextline#1%
+ {\csname\??tk#1\s!reset\endcsname
+ \global\expandafter\let\csname\??tk#1\s!reset\endcsname\relax}
+
+\def\resetlayouttextlines
+ {\resetlayouttextline\v!top
+ \resetlayouttextline\v!header
+ \resetlayouttextline\v!text
+ \resetlayouttextline\v!footer
+ \resetlayouttextline\v!bottom
+ \ifconditional\resyncaftertextline
+ \calculateglobalvsizes
+ \recalculatebackgrounds
+ \global\setfalse\resyncaftertextline
+ \fi}
+
+% \settext[header][text][middle][xxx][yyy]
+
+\def\settextcontent
+ {\doquintupleempty\dosettextcontent}
+
+\def\dosettextcontent[#1][#2][#3][#4][#5]% header text middle text/text
+ {\iffifthargument
+ \setvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#5}}%
+ \else\iffourthargument
+ \setvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#4}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#4}}%
+ \else\ifthirdargument
+ \setvalue{\??tk#1#2\c!middletext}%
+ {\dodoubletexts{\??tk#1}{#2}%
+ {\c!leftstyle \c!leftcolor \c!leftwidth }{#3}%
+ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}%
+ \fi\fi\fi}
+
+\def\resettextcontent
+ {\dotripleempty\doresettextcontent}
+
+\def\doresettextcontent[#1][#2][#3]% header text middle
+ {\ifthirdargument
+ \letvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}\empty
+ \else\ifsecondargument
+ \letvalue{\??tk#1#2\c!lefttext }\empty
+ \letvalue{\??tk#1#2\c!middletext}\empty
+ \letvalue{\??tk#1#2\c!righttext }\empty
+ \fi\fi}
+
+\let\settext \settextcontent % downward compatibility
+\let\resettext\resettextcontent % downward compatibility
+
+\setvalue{:\c!middle:\c!text:}{\c!middletext}
+\setvalue{:\c!left :\c!text:}{\c!lefttext }
+\setvalue{:\c!right :\c!text:}{\c!righttext }
+
+%D The next series of macros is not that easy to read,
+%D because they hook into the main page building macros. By
+%D using token list registers for the text content, we can
+%D easily hook in other code, like menu generators.
+%D
+%D Beware: the token lists are always expanded, also when the
+%D height of an area is zero. This is because reset actions can
+%D be part of them.
+
+\newbox\scratchpagebox
+
+\def\gettextboxes
+ {\setbox\scratchpagebox\vbox
+ {\dontcomplain
+ \calculatereducedvsizes
+ \swapmargins
+ \offinterlineskip
+ \vskip\dimexpr-\topheight-\topdistance\relax
+ \the\toptextcontent
+ \vskip\dimexpr\topheight+\topdistance\relax
+ \the\headertextcontent
+ \vskip\dimexpr\headerheight+\headerdistance\relax
+ \placepositionanchors
+ \vskip-\textheight
+ \the\texttextcontent
+ \vskip\textheight
+ \the\everyendoftextbody
+ \vskip\footerdistance
+ \the\footertextcontent
+ \vskip\dimexpr\footerheight+\bottomdistance\relax
+ \the\bottomtextcontent
+ \vskip\bottomheight
+ \vfilll}%
+ \smashbox\scratchpagebox
+ \box\scratchpagebox}
+
+\def\getmainbox#1#2%
+ {\setbox\scratchpagebox\vbox
+ {\offinterlineskip % na \paginaletter !
+ \calculatereducedvsizes
+ \calculatehsizes
+ \swapmargins
+ \vskip\dimexpr\headerheight+\headerdistance+\layoutparameter\c!textdistance\relax
+ \hbox to \makeupwidth
+ {\bgroup
+ \swapmargins
+ \goleftonpage
+ \ifdim\leftedgewidth>\zeropoint
+ \the\leftedgetextcontent
+ \hskip\leftedgewidth
+ \fi
+ \hskip\leftedgedistance
+ \ifdim\leftmarginwidth>\zeropoint
+ \the\leftmargintextcontent
+ \hskip\leftmarginwidth
+ \fi
+ \hskip\leftmargindistance
+ \egroup
+ \mkprocesspagecontents{#2}%
+ \settextpagecontent\scratchpagebox{#1}{#2}%
+ \addtextbackground\scratchpagebox
+ \addtextgridlayer\scratchpagebox
+ \box\scratchpagebox
+ \bgroup
+ \hskip\rightmargindistance
+ \ifdim\rightmarginwidth>\zeropoint
+ \the\rightmargintextcontent
+ \hskip\rightmarginwidth
+ \fi
+ \hskip\rightedgedistance
+ \ifdim\rightedgewidth>\zeropoint
+ \the\rightedgetextcontent
+ \hskip\rightedgewidth
+ \fi
+ \egroup
+ \hss}}%
+ \smashbox\scratchpagebox
+ \box\scratchpagebox}
+
+%D The main text area has to be combined with some additional
+%D (tracing) information.
+
+% will be stored as normal and overloaded in page-lyr and later in
+% page-spr we overload the the stored version .. evenatually i will
+% clear up the experimental mess
+
+\def\settextpagecontent#1#2#3% #2 and #3 will disappear
+ {\setbox#1\hbox to \makeupwidth
+ {\hss % so don't change this
+ \setlayoutcomponentattribute\v!page\v!text
+ \vbox \layoutcomponentboxattribute to \textheight
+ {\offinterlineskip
+ \freezetextwidth
+ \hsize\textwidth % local variant of \sethsize
+ \boxmaxdepth\maxdepth
+ \noindent % content can be < \hsize
+ \dopagecontents#2#3}%
+ \hss}%
+ \dp#1\zeropoint}
+
+%D The placement of a whole line is handled by the next two
+%D macros. These are hooked into the general purpose token
+%D list registers mentioned before.
+
+\def\ignoredlinebreak{\unskip\space\ignorespaces}
+
+% \def\doplacelayouttextline#1#2%
+% {\ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height
+% \goleftonpage
+% \hbox
+% {\setbox\scratchpagebox\vbox to #2
+% {\vsize#2\relax
+% \normalbaselines
+% \let\\\ignoredlinebreak
+% \let\crlf\ignoredlinebreak
+% \csname\??tk#1\c!before\endcsname
+% \doifbothsidesoverruled
+% {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
+% {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
+% {\dodoplacelayouttextline#1\c!righttext\c!middletext\c!lefttext \plusone\zerocount}%
+% \csname\??tk#1\c!after\endcsname
+% \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
+% \dp\scratchpagebox\zeropoint
+% \box\scratchpagebox}%
+% \vskip-#2\relax
+% \fi}
+%
+% \def\dodoplacelayouttextline#1#2#3#4#5#6% \hsize toegevoegd, \hss's niet meer wijzigen
+% {\hbox
+% {\ifdim\leftedgewidth>\zeropoint
+% \dododoplacelayouttextline\leftedgewidth#1\v!edge
+% {\hss\csname\??tk#1\v!edge#2\endcsname}%
+% \hskip\leftedgedistance
+% \fi
+% \ifdim\leftmarginwidth>\zeropoint
+% \dododoplacelayouttextline\leftmarginwidth#1\v!margin
+% {\hbox to \leftmarginwidth
+% {\hss\csname\??tk#1\v!margin#2\endcsname}%
+% \hskip-\leftmarginwidth
+% \hbox to \leftmarginwidth
+% {\hss\ifcase#5\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi}}%
+% \hskip\leftmargindistance
+% \fi
+% \ifdim\makeupwidth>\zeropoint
+% \dododoplacelayouttextline\makeupwidth{#1}\v!text
+% {\hbox to \makeupwidth
+% {\ifcase#5\or\@@nmpre{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi
+% \csname\??tk#1\v!text#2\endcsname\hss}%
+% \hskip-\makeupwidth
+% \hbox to \makeupwidth
+% {\hss\csname\??tk#1\v!text#3\endcsname\hss}%
+% \hskip-\makeupwidth
+% \hbox to \makeupwidth
+% {\hss\csname\??tk#1\v!text#4\endcsname
+% \ifcase#6\or\@@nmpos{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi}}%
+% \fi
+% \ifdim\rightmarginwidth>\zeropoint
+% \hskip\rightmargindistance
+% \dododoplacelayouttextline\rightmarginwidth{#1}\v!margin
+% {\hbox to \rightmarginwidth
+% {\csname\??tk#1\v!margin#4\endcsname\hss}%
+% \hskip-\rightmarginwidth
+% \hbox to \rightmarginwidth
+% {\ifcase#6\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi\hss}}%
+% \fi
+% \ifdim\rightedgewidth>\zeropoint
+% \hskip\rightedgedistance
+% \dododoplacelayouttextline\rightedgewidth{#1}\v!edge
+% {\csname\??tk#1\v!edge#4\endcsname\hss}%
+% \fi}}
+%
+% \def\dododoplacelayouttextline#1#2#3#4%
+% {\vbox % to \vsize
+% {\hsize#1\relax
+% \csname\??tk#2#3\c!before\endcsname
+% \setlayoutcomponentattribute#2#3%
+% \hbox \layoutcomponentboxattribute to #1{#4}%
+% \csname\??tk#2#3\c!after\endcsname}}
+
+\def\doplacelayouttextline#1#2%
+ {\let\currentlayouttextline#1%
+ \ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height
+ \doplacelayouttextlineindeed{#2}%
+ \fi}
+
+\def\doplacelayouttextlineindeed#1%
+ {\goleftonpage
+ \hbox
+ {\setbox\scratchpagebox\vbox to #1
+ {\vsize#1\relax
+ \normalbaselines
+ \let\\\ignoredlinebreak
+ \let\crlf\ignoredlinebreak
+ \csname\??tk\currentlayouttextline\c!before\endcsname
+ \doifbothsidesoverruled\dodoplacelayouttextlineright\dodoplacelayouttextlineright\dodoplacelayouttextlineleft
+ \csname\??tk\currentlayouttextline\c!after\endcsname
+ \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
+ \dp\scratchpagebox\zeropoint
+ \box\scratchpagebox}%
+ \vskip-#1\relax}
+
+\def\dodoplacelayouttextlineright{\dodoplacelayouttextline\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
+\def\dodoplacelayouttextlineleft {\dodoplacelayouttextline\c!righttext\c!middletext\c!lefttext \plusone\zerocount}
+
+\def\dodoplacelayouttextline#1#2#3#4#5% \hsize toegevoegd, \hss's niet meer wijzigen
+ {\hbox
+ {\ifdim\leftedgewidth>\zeropoint
+ \dododoplacelayouttextline\leftedgewidth\currentlayouttextline\v!edge{\thelayoutleftedgeline#1}%
+ \hskip\leftedgedistance
+ \fi
+ \ifdim\leftmarginwidth>\zeropoint
+ \dododoplacelayouttextline\leftmarginwidth\currentlayouttextline\v!margin{\thelayoutleftmarginline#1#4}%
+ \hskip\leftmargindistance
+ \fi
+ \ifdim\makeupwidth>\zeropoint
+ \dododoplacelayouttextline\makeupwidth\currentlayouttextline\v!text{\thelayouttextline#1#2#3#4#5}%
+ \fi
+ \ifdim\rightmarginwidth>\zeropoint
+ \hskip\rightmargindistance
+ \dododoplacelayouttextline\rightmarginwidth\currentlayouttextline\v!margin{\thelayoutrightmarginline#3#5}%
+ \fi
+ \ifdim\rightedgewidth>\zeropoint
+ \hskip\rightedgedistance
+ \dododoplacelayouttextline\rightedgewidth\currentlayouttextline\v!edge{\thelayoutrightedgeline#3}%
+ \fi}}
+
+\def\thelayoutleftedgeline#1%
+ {\hss\csname\??tk\currentlayouttextline\v!edge#1\endcsname}%
+
+\def\thelayoutrightedgeline#1%
+ {\csname\??tk\currentlayouttextline\v!edge#1\endcsname\hss}
+
+\def\thelayoutleftmarginline#1#2%
+ {\hbox to \leftmarginwidth{\hss\csname\??tk\currentlayouttextline\v!margin#1\endcsname}%
+ \hskip-\leftmarginwidth
+ \hbox to \leftmarginwidth{\hss\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi}}
+
+\def\thelayoutrightmarginline#1#2%
+ {\hbox to \rightmarginwidth{\csname\??tk\currentlayouttextline\v!margin#1\endcsname\hss}%
+ \hskip-\rightmarginwidth
+ \hbox to \rightmarginwidth{\ifcase#2\or\csname\??tk\currentlayouttextline\v!margin\c!margintext\endcsname\fi\hss}}
+
+\def\thelayoutedgetextline{\csname\??tk\currentlayouttextline\v!text\c!marginedgetext\endcsname}
+
+\def\thelayouttextline#1#2#3#4#5%
+ {\hbox to \makeupwidth{\ifcase#4\or\@@nmpre\thelayoutedgetextline\fi\csname\??tk\currentlayouttextline\v!text#1\endcsname\hss}%
+ \hskip-\makeupwidth
+ \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#2\endcsname\hss}%
+ \hskip-\makeupwidth
+ \hbox to \makeupwidth{\hss\csname\??tk\currentlayouttextline\v!text#3\endcsname\ifcase#5\or\@@nmpos\thelayoutedgetextline\fi}}
+
+\def\dododoplacelayouttextline#1#2#3#4%
+ {\vbox % to \vsize
+ {\hsize#1\relax
+ \csname\??tk#2#3\c!before\endcsname
+ \setlayoutcomponentattribute#2#3%
+ \hbox \layoutcomponentboxattribute to #1{#4}%
+ \csname\??tk#2#3\c!after\endcsname}}
+
+%D Although it is far better to use backgrounds for this
+%D purpose, one can add a rule in the following way. This
+%D method makes the rules disappear in case of an empty text
+%D line. Consider this a feature.
+%D
+%D \starttyping
+%D \setupheadertexts[left][right]
+%D
+%D \setupheader[text][after=\hrule,style=bold]
+%D
+%D \starttext
+%D \input tufte \page
+%D \setupheader[state=empty]
+%D \input tufte \page
+%D \stoptext
+%D \stoptyping
+
+%D The next twosome will be done differently (using an
+%D existing auxiliary macro).
+
+% \def\@@nmpre#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\unhbox0\tfskip\fi}
+% \def\@@nmpos#1{\setbox0\hbox{#1}\ifdim\wd0=\zeropoint\else\tfskip\unhbox0\fi}
+
+% cleaner
+%
+% \def\@@nmpre#1{\doiftext{#1}{{#1}\tfskip}}
+% \def\@@nmpos#1{\doiftext{#1}{\tfskip{#1}}}
+%
+% newer
+%
+% \def\@@nmprepos#1#2#3#4#5%
+% {\doifelsenothing\@@nmwidth
+% {\doiftext{#5}{#1{#5}#2}}
+% {\doiftext{#5}{\hbox to \@@nmwidth{#3{#5}#4}}}}
+%
+% \def\@@nmpre{\@@nmprepos\empty\tfskip\relax\hss}
+% \def\@@nmpos{\@@nmprepos\tfskip\empty\hss\relax}
+%
+% faster
+
+\def\@@nmpre#1%
+ {\begingroup
+ \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox\else
+ \doifelsenothing\@@nmwidth
+ {\box\scratchbox\tfskip}
+ {\hbox to \@@nmwidth{\box\scratchbox\hss}}%
+ \fi
+ \endgroup}
+
+\def\@@nmpos#1%
+ {\begingroup
+ \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox\else
+ \doifelsenothing\@@nmwidth
+ {\tfskip\box\scratchbox}
+ {\hbox to \@@nmwidth{\hss\box\scratchbox}}%
+ \fi
+ \endgroup}
+
+%D This code will move to \type {page-flt.tex}.
+
+\appendtoks \placerightmarginblock \hskip-\rightmarginwidth \to \rightmargintextcontent
+\appendtoks \placeleftmarginblock \hskip-\leftmarginwidth \to \leftmargintextcontent
+
+%D The next hook will later be used for keeping track of
+%D positions, i.e.\ it will provide a proper (page
+%D dependent) reference point.
+
+\ifx\undefined\placepositionanchors
+ \unexpanded\def\placepositionanchors{\vskip\textheight}
+\fi
+
+%D \macros
+%D {definetext}
+%D
+%D Some macros ago, we implemented the \type {status} option
+%D \type {unknown}. This one is used to take care of
+%D symbolic texts handlers.
+%D
+%D \showsetup{definetext}
+%D
+%D The next example demonstrates how we can use this
+%D mechanism to provide page (event) dependent text lines.
+%D
+%D \starttyping
+%D \definetext[chapter][footer][pagenumber]
+%D \setuphead[chapter][header=high,footer=chapter]
+%D \setupheadertexts[pagenumber]
+%D \setupfootertexts[left][right]
+%D \chapter{eerste} \dorecurse{20}{\input tufte \relax}
+%D \chapter{tweede} \dorecurse{20}{\input tufte \relax}
+%D \stoptyping
+
+\unexpanded\def\definetext
+ {\doseventupleempty\dodefinetext}
+
+\def\dodefinetext[#1][#2][#3][#4][#5][#6][#7]%
+ {\ifseventhargument
+ \setvalue{\??tk#2#3#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5][#6][#7]}%
+ \else\ifsixthargument
+ \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5][#6]}%
+ \else\iffifthargument
+ \setvalue{\??tk#2#3#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4][#5]}%
+ \else\iffourthargument
+ \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3][#4]}%
+ \else
+ \setvalue{\??tk #2#1}{\dosixtupleempty\dosetuptexts[#2][#3]}%
+ \fi\fi\fi\fi}
+
+%D The rest of this file is dedicated to setting up the
+%D texts. This code is not that impressive.
+
+\setupheadertexts [\v!text] [] []
+\setupheadertexts [\v!margin] [] []
+\setupheadertexts [\v!edge] [] []
+
+\setupfootertexts [\v!text] [] []
+\setupfootertexts [\v!margin] [] []
+\setupfootertexts [\v!edge] [] []
+
+\setuptexttexts [\v!text] [] []
+\setuptexttexts [\v!margin] [] []
+\setuptexttexts [\v!edge] [] []
+
+\setupbottomtexts [\v!text] [] []
+\setupbottomtexts [\v!margin] [] []
+\setupbottomtexts [\v!edge] [] []
+
+\setuptoptexts [\v!text] [] []
+\setuptoptexts [\v!margin] [] []
+\setuptoptexts [\v!edge] [] []
+
+% alternative
+%
+% \def\resetlayouttekst%
+% {\dodoubleempty\doresetlayouttekst}
+%
+% \def\doresetlayouttekst[#1][#2]%
+% {\ifsecondargument
+% \dodoresetlayouttekst[#1][#2]%
+% \else
+% \dodoresetlayouttekst[#1][\v!tekst]%
+% \fi}
+%
+% \def\dodoresetlayouttekst[#1][#2]%
+% {...}
+%
+% \def\docommand#1%
+% {\resetlayouttekst[#1][\v!tekst]%
+% \resetlayouttekst[#1][\v!marge]%
+% \resetlayouttekst[#1][\v!rand]}
+
+%D We combine a lot of similar settings in a macro that
+%D we will later dispose.
+
+\def\dodocommand[#1][#2]%
+ {\getparameters
+ [\??tk#1#2]
+ [%\c!state=\v!normal, % moved
+ \c!before=,% both global and local are used
+ \c!after=,% both global and local are used
+ \c!strut=,% the local one, not (yet) used
+ \c!style=\csname\??tk#1\c!style\endcsname,% hm, got lost
+ \c!color=\csname\??tk#1\c!color\endcsname,% hm, got lost
+ \c!lefttext=,
+ \c!middletext=,
+ \c!righttext=,
+ \c!marginedgetext=,
+ \c!margintext=,
+ \c!width=]%
+ \inheritparameter[\??tk#1#2][\c!leftstyle ][\c!style ]%
+ \inheritparameter[\??tk#1#2][\c!rightstyle][\c!style ]%
+ \inheritparameter[\??tk#1#2][\c!leftcolor ][\c!color ]%
+ \inheritparameter[\??tk#1#2][\c!rightcolor][\c!color ]%
+ \inheritparameter[\??tk#1#2][\c!leftwidth ][\c!width]%
+ \inheritparameter[\??tk#1#2][\c!rightwidth][\c!width]}
+
+\def\docommand#1%
+ {\dodocommand[#1][\v!text]%
+ \dodocommand[#1][\v!margin]%
+ \dodocommand[#1][\v!edge]}
+
+\docommand\v!top
+\docommand\v!header
+\docommand\v!footer
+\docommand\v!text
+\docommand\v!bottom
+
+\let\docommand \relax
+\let\dodocommand\relax
+
+%D While the header and footer lines are moved away from the
+%D main text, the top and bottom lines are centered.
+
+\setuptop [\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setupheader[\c!state=\v!normal,\c!n=0,\c!before=, \c!after=\vss,\c!strut=\v!yes]
+\setuptext [\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+\setupfooter[\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=, \c!strut=\v!yes]
+\setupbottom[\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
+
+\setuptop [\c!style=,\c!color=]
+\setupheader[\c!style=,\c!color=]
+\setuptext [\c!style=,\c!color=]
+\setupfooter[\c!style=,\c!color=]
+\setupbottom[\c!style=,\c!color=]
+
+\protect \endinput
diff --git a/tex/context/base/pdfr-def.mkii b/tex/context/base/pdfr-def.mkii
new file mode 100644
index 000000000..7554bda9e
--- /dev/null
+++ b/tex/context/base/pdfr-def.mkii
@@ -0,0 +1,843 @@
+% filename : pdfr-def.tex
+% comment : generated by mtxrun --script chars --pdf
+% author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+% copyright: PRAGMA ADE / ConTeXt Development Team
+% license : see context related readme files
+%
+\pdfglyphtounicode{space}{0020}%
+\pdfglyphtounicode{exclam}{0021}%
+\pdfglyphtounicode{quotedbl}{0022}%
+\pdfglyphtounicode{numbersign}{0023}%
+\pdfglyphtounicode{dollar}{0024}%
+\pdfglyphtounicode{percent}{0025}%
+\pdfglyphtounicode{ampersand}{0026}%
+\pdfglyphtounicode{quotesingle}{0027}%
+\pdfglyphtounicode{parenleft}{0028}%
+\pdfglyphtounicode{parenright}{0029}%
+\pdfglyphtounicode{asterisk}{002A}%
+\pdfglyphtounicode{plus}{002B}%
+\pdfglyphtounicode{comma}{002C}%
+\pdfglyphtounicode{hyphen}{002D}%
+\pdfglyphtounicode{period}{002E}%
+\pdfglyphtounicode{slash}{002F}%
+\pdfglyphtounicode{zero}{0030}%
+\pdfglyphtounicode{one}{0031}%
+\pdfglyphtounicode{two}{0032}%
+\pdfglyphtounicode{three}{0033}%
+\pdfglyphtounicode{four}{0034}%
+\pdfglyphtounicode{five}{0035}%
+\pdfglyphtounicode{six}{0036}%
+\pdfglyphtounicode{seven}{0037}%
+\pdfglyphtounicode{eight}{0038}%
+\pdfglyphtounicode{nine}{0039}%
+\pdfglyphtounicode{colon}{003A}%
+\pdfglyphtounicode{semicolon}{003B}%
+\pdfglyphtounicode{less}{003C}%
+\pdfglyphtounicode{equal}{003D}%
+\pdfglyphtounicode{greater}{003E}%
+\pdfglyphtounicode{question}{003F}%
+\pdfglyphtounicode{at}{0040}%
+\pdfglyphtounicode{A}{0041}%
+\pdfglyphtounicode{B}{0042}%
+\pdfglyphtounicode{C}{0043}%
+\pdfglyphtounicode{D}{0044}%
+\pdfglyphtounicode{E}{0045}%
+\pdfglyphtounicode{F}{0046}%
+\pdfglyphtounicode{G}{0047}%
+\pdfglyphtounicode{H}{0048}%
+\pdfglyphtounicode{I}{0049}%
+\pdfglyphtounicode{J}{004A}%
+\pdfglyphtounicode{K}{004B}%
+\pdfglyphtounicode{L}{004C}%
+\pdfglyphtounicode{M}{004D}%
+\pdfglyphtounicode{N}{004E}%
+\pdfglyphtounicode{O}{004F}%
+\pdfglyphtounicode{P}{0050}%
+\pdfglyphtounicode{Q}{0051}%
+\pdfglyphtounicode{R}{0052}%
+\pdfglyphtounicode{S}{0053}%
+\pdfglyphtounicode{T}{0054}%
+\pdfglyphtounicode{U}{0055}%
+\pdfglyphtounicode{V}{0056}%
+\pdfglyphtounicode{W}{0057}%
+\pdfglyphtounicode{X}{0058}%
+\pdfglyphtounicode{Y}{0059}%
+\pdfglyphtounicode{Z}{005A}%
+\pdfglyphtounicode{bracketleft}{005B}%
+\pdfglyphtounicode{backslash}{005C}%
+\pdfglyphtounicode{bracketright}{005D}%
+\pdfglyphtounicode{asciicircum}{005E}%
+\pdfglyphtounicode{underscore}{005F}%
+\pdfglyphtounicode{grave}{0060}%
+\pdfglyphtounicode{a}{0061}%
+\pdfglyphtounicode{b}{0062}%
+\pdfglyphtounicode{c}{0063}%
+\pdfglyphtounicode{d}{0064}%
+\pdfglyphtounicode{e}{0065}%
+\pdfglyphtounicode{f}{0066}%
+\pdfglyphtounicode{g}{0067}%
+\pdfglyphtounicode{h}{0068}%
+\pdfglyphtounicode{i}{0069}%
+\pdfglyphtounicode{j}{006A}%
+\pdfglyphtounicode{k}{006B}%
+\pdfglyphtounicode{l}{006C}%
+\pdfglyphtounicode{m}{006D}%
+\pdfglyphtounicode{n}{006E}%
+\pdfglyphtounicode{o}{006F}%
+\pdfglyphtounicode{p}{0070}%
+\pdfglyphtounicode{q}{0071}%
+\pdfglyphtounicode{r}{0072}%
+\pdfglyphtounicode{s}{0073}%
+\pdfglyphtounicode{t}{0074}%
+\pdfglyphtounicode{u}{0075}%
+\pdfglyphtounicode{v}{0076}%
+\pdfglyphtounicode{w}{0077}%
+\pdfglyphtounicode{x}{0078}%
+\pdfglyphtounicode{y}{0079}%
+\pdfglyphtounicode{z}{007A}%
+\pdfglyphtounicode{braceleft}{007B}%
+\pdfglyphtounicode{bar}{007C}%
+\pdfglyphtounicode{braceright}{007D}%
+\pdfglyphtounicode{asciitilde}{007E}%
+\pdfglyphtounicode{exclamdown}{00A1}%
+\pdfglyphtounicode{cent}{00A2}%
+\pdfglyphtounicode{sterling}{00A3}%
+\pdfglyphtounicode{currency}{00A4}%
+\pdfglyphtounicode{yen}{00A5}%
+\pdfglyphtounicode{brokenbar}{00A6}%
+\pdfglyphtounicode{section}{00A7}%
+\pdfglyphtounicode{dieresis}{00A8}%
+\pdfglyphtounicode{copyright}{00A9}%
+\pdfglyphtounicode{ordfeminine}{00AA}%
+\pdfglyphtounicode{guillemotleft}{00AB}%
+\pdfglyphtounicode{logicalnot}{00AC}%
+\pdfglyphtounicode{registered}{00AE}%
+\pdfglyphtounicode{macron}{00AF}%
+\pdfglyphtounicode{degree}{00B0}%
+\pdfglyphtounicode{plusminus}{00B1}%
+\pdfglyphtounicode{acute}{00B4}%
+\pdfglyphtounicode{mu}{00B5}%
+\pdfglyphtounicode{paragraph}{00B6}%
+\pdfglyphtounicode{periodcentered}{00B7}%
+\pdfglyphtounicode{cedilla}{00B8}%
+\pdfglyphtounicode{ordmasculine}{00BA}%
+\pdfglyphtounicode{guillemotright}{00BB}%
+\pdfglyphtounicode{onequarter}{00BC}%
+\pdfglyphtounicode{onehalf}{00BD}%
+\pdfglyphtounicode{threequarters}{00BE}%
+\pdfglyphtounicode{questiondown}{00BF}%
+\pdfglyphtounicode{Agrave}{00C0}%
+\pdfglyphtounicode{Aacute}{00C1}%
+\pdfglyphtounicode{Acircumflex}{00C2}%
+\pdfglyphtounicode{Atilde}{00C3}%
+\pdfglyphtounicode{Adieresis}{00C4}%
+\pdfglyphtounicode{Aring}{00C5}%
+\pdfglyphtounicode{AE}{00C6}%
+\pdfglyphtounicode{Ccedilla}{00C7}%
+\pdfglyphtounicode{Egrave}{00C8}%
+\pdfglyphtounicode{Eacute}{00C9}%
+\pdfglyphtounicode{Ecircumflex}{00CA}%
+\pdfglyphtounicode{Edieresis}{00CB}%
+\pdfglyphtounicode{Igrave}{00CC}%
+\pdfglyphtounicode{Iacute}{00CD}%
+\pdfglyphtounicode{Icircumflex}{00CE}%
+\pdfglyphtounicode{Idieresis}{00CF}%
+\pdfglyphtounicode{Eth}{00D0}%
+\pdfglyphtounicode{Ntilde}{00D1}%
+\pdfglyphtounicode{Ograve}{00D2}%
+\pdfglyphtounicode{Oacute}{00D3}%
+\pdfglyphtounicode{Ocircumflex}{00D4}%
+\pdfglyphtounicode{Otilde}{00D5}%
+\pdfglyphtounicode{Odieresis}{00D6}%
+\pdfglyphtounicode{multiply}{00D7}%
+\pdfglyphtounicode{Oslash}{00D8}%
+\pdfglyphtounicode{Ugrave}{00D9}%
+\pdfglyphtounicode{Uacute}{00DA}%
+\pdfglyphtounicode{Ucircumflex}{00DB}%
+\pdfglyphtounicode{Udieresis}{00DC}%
+\pdfglyphtounicode{Yacute}{00DD}%
+\pdfglyphtounicode{Thorn}{00DE}%
+\pdfglyphtounicode{germandbls}{00DF}%
+\pdfglyphtounicode{agrave}{00E0}%
+\pdfglyphtounicode{aacute}{00E1}%
+\pdfglyphtounicode{acircumflex}{00E2}%
+\pdfglyphtounicode{atilde}{00E3}%
+\pdfglyphtounicode{adieresis}{00E4}%
+\pdfglyphtounicode{aring}{00E5}%
+\pdfglyphtounicode{ae}{00E6}%
+\pdfglyphtounicode{ccedilla}{00E7}%
+\pdfglyphtounicode{egrave}{00E8}%
+\pdfglyphtounicode{eacute}{00E9}%
+\pdfglyphtounicode{ecircumflex}{00EA}%
+\pdfglyphtounicode{edieresis}{00EB}%
+\pdfglyphtounicode{igrave}{00EC}%
+\pdfglyphtounicode{iacute}{00ED}%
+\pdfglyphtounicode{icircumflex}{00EE}%
+\pdfglyphtounicode{idieresis}{00EF}%
+\pdfglyphtounicode{eth}{00F0}%
+\pdfglyphtounicode{ntilde}{00F1}%
+\pdfglyphtounicode{ograve}{00F2}%
+\pdfglyphtounicode{oacute}{00F3}%
+\pdfglyphtounicode{ocircumflex}{00F4}%
+\pdfglyphtounicode{otilde}{00F5}%
+\pdfglyphtounicode{odieresis}{00F6}%
+\pdfglyphtounicode{divide}{00F7}%
+\pdfglyphtounicode{oslash}{00F8}%
+\pdfglyphtounicode{ugrave}{00F9}%
+\pdfglyphtounicode{uacute}{00FA}%
+\pdfglyphtounicode{ucircumflex}{00FB}%
+\pdfglyphtounicode{udieresis}{00FC}%
+\pdfglyphtounicode{yacute}{00FD}%
+\pdfglyphtounicode{thorn}{00FE}%
+\pdfglyphtounicode{ydieresis}{00FF}%
+\pdfglyphtounicode{Amacron}{0100}%
+\pdfglyphtounicode{amacron}{0101}%
+\pdfglyphtounicode{Abreve}{0102}%
+\pdfglyphtounicode{abreve}{0103}%
+\pdfglyphtounicode{Aogonek}{0104}%
+\pdfglyphtounicode{aogonek}{0105}%
+\pdfglyphtounicode{Cacute}{0106}%
+\pdfglyphtounicode{cacute}{0107}%
+\pdfglyphtounicode{Ccircumflex}{0108}%
+\pdfglyphtounicode{ccircumflex}{0109}%
+\pdfglyphtounicode{Cdotaccent}{010A}%
+\pdfglyphtounicode{cdotaccent}{010B}%
+\pdfglyphtounicode{Ccaron}{010C}%
+\pdfglyphtounicode{ccaron}{010D}%
+\pdfglyphtounicode{Dcaron}{010E}%
+\pdfglyphtounicode{dcaron}{010F}%
+\pdfglyphtounicode{Dcroat}{0110}%
+\pdfglyphtounicode{dcroat}{0111}%
+\pdfglyphtounicode{Emacron}{0112}%
+\pdfglyphtounicode{emacron}{0113}%
+\pdfglyphtounicode{Ebreve}{0114}%
+\pdfglyphtounicode{ebreve}{0115}%
+\pdfglyphtounicode{Edotaccent}{0116}%
+\pdfglyphtounicode{edotaccent}{0117}%
+\pdfglyphtounicode{Eogonek}{0118}%
+\pdfglyphtounicode{eogonek}{0119}%
+\pdfglyphtounicode{Ecaron}{011A}%
+\pdfglyphtounicode{ecaron}{011B}%
+\pdfglyphtounicode{Gcircumflex}{011C}%
+\pdfglyphtounicode{gcircumflex}{011D}%
+\pdfglyphtounicode{Gbreve}{011E}%
+\pdfglyphtounicode{gbreve}{011F}%
+\pdfglyphtounicode{Gdotaccent}{0120}%
+\pdfglyphtounicode{gdotaccent}{0121}%
+\pdfglyphtounicode{Gcommaaccent}{0122}%
+\pdfglyphtounicode{gcommaaccent}{0123}%
+\pdfglyphtounicode{Hcircumflex}{0124}%
+\pdfglyphtounicode{hcircumflex}{0125}%
+\pdfglyphtounicode{Hbar}{0126}%
+\pdfglyphtounicode{hbar}{0127}%
+\pdfglyphtounicode{Itilde}{0128}%
+\pdfglyphtounicode{itilde}{0129}%
+\pdfglyphtounicode{Imacron}{012A}%
+\pdfglyphtounicode{imacron}{012B}%
+\pdfglyphtounicode{Ibreve}{012C}%
+\pdfglyphtounicode{ibreve}{012D}%
+\pdfglyphtounicode{Iogonek}{012E}%
+\pdfglyphtounicode{iogonek}{012F}%
+\pdfglyphtounicode{Idotaccent}{0130}%
+\pdfglyphtounicode{dotlessi}{0131}%
+\pdfglyphtounicode{IJ}{0132}%
+\pdfglyphtounicode{ij}{0133}%
+\pdfglyphtounicode{Jcircumflex}{0134}%
+\pdfglyphtounicode{jcircumflex}{0135}%
+\pdfglyphtounicode{Kcommaaccent}{0136}%
+\pdfglyphtounicode{kcommaaccent}{0137}%
+\pdfglyphtounicode{kgreenlandic}{0138}%
+\pdfglyphtounicode{Lacute}{0139}%
+\pdfglyphtounicode{lacute}{013A}%
+\pdfglyphtounicode{Lcommaaccent}{013B}%
+\pdfglyphtounicode{lcommaaccent}{013C}%
+\pdfglyphtounicode{Lcaron}{013D}%
+\pdfglyphtounicode{lcaron}{013E}%
+\pdfglyphtounicode{Ldot}{013F}%
+\pdfglyphtounicode{ldot}{0140}%
+\pdfglyphtounicode{Lslash}{0141}%
+\pdfglyphtounicode{lslash}{0142}%
+\pdfglyphtounicode{Nacute}{0143}%
+\pdfglyphtounicode{nacute}{0144}%
+\pdfglyphtounicode{Ncommaaccent}{0145}%
+\pdfglyphtounicode{ncommaaccent}{0146}%
+\pdfglyphtounicode{Ncaron}{0147}%
+\pdfglyphtounicode{ncaron}{0148}%
+\pdfglyphtounicode{napostrophe}{0149}%
+\pdfglyphtounicode{Eng}{014A}%
+\pdfglyphtounicode{eng}{014B}%
+\pdfglyphtounicode{Omacron}{014C}%
+\pdfglyphtounicode{omacron}{014D}%
+\pdfglyphtounicode{Obreve}{014E}%
+\pdfglyphtounicode{obreve}{014F}%
+\pdfglyphtounicode{Ohungarumlaut}{0150}%
+\pdfglyphtounicode{ohungarumlaut}{0151}%
+\pdfglyphtounicode{OE}{0152}%
+\pdfglyphtounicode{oe}{0153}%
+\pdfglyphtounicode{Racute}{0154}%
+\pdfglyphtounicode{racute}{0155}%
+\pdfglyphtounicode{Rcommaaccent}{0156}%
+\pdfglyphtounicode{rcommaaccent}{0157}%
+\pdfglyphtounicode{Rcaron}{0158}%
+\pdfglyphtounicode{rcaron}{0159}%
+\pdfglyphtounicode{Sacute}{015A}%
+\pdfglyphtounicode{sacute}{015B}%
+\pdfglyphtounicode{Scircumflex}{015C}%
+\pdfglyphtounicode{scircumflex}{015D}%
+\pdfglyphtounicode{Scedilla}{015E}%
+\pdfglyphtounicode{scedilla}{015F}%
+\pdfglyphtounicode{Scaron}{0160}%
+\pdfglyphtounicode{scaron}{0161}%
+\pdfglyphtounicode{Tcommaaccent}{0162}%
+\pdfglyphtounicode{tcommaaccent}{0163}%
+\pdfglyphtounicode{Tcaron}{0164}%
+\pdfglyphtounicode{tcaron}{0165}%
+\pdfglyphtounicode{Tbar}{0166}%
+\pdfglyphtounicode{tbar}{0167}%
+\pdfglyphtounicode{Utilde}{0168}%
+\pdfglyphtounicode{utilde}{0169}%
+\pdfglyphtounicode{Umacron}{016A}%
+\pdfglyphtounicode{umacron}{016B}%
+\pdfglyphtounicode{Ubreve}{016C}%
+\pdfglyphtounicode{ubreve}{016D}%
+\pdfglyphtounicode{Uring}{016E}%
+\pdfglyphtounicode{uring}{016F}%
+\pdfglyphtounicode{Uhungarumlaut}{0170}%
+\pdfglyphtounicode{uhungarumlaut}{0171}%
+\pdfglyphtounicode{Uogonek}{0172}%
+\pdfglyphtounicode{uogonek}{0173}%
+\pdfglyphtounicode{Wcircumflex}{0174}%
+\pdfglyphtounicode{wcircumflex}{0175}%
+\pdfglyphtounicode{Ycircumflex}{0176}%
+\pdfglyphtounicode{ycircumflex}{0177}%
+\pdfglyphtounicode{Ydieresis}{0178}%
+\pdfglyphtounicode{Zacute}{0179}%
+\pdfglyphtounicode{zacute}{017A}%
+\pdfglyphtounicode{Zdotaccent}{017B}%
+\pdfglyphtounicode{zdotaccent}{017C}%
+\pdfglyphtounicode{Zcaron}{017D}%
+\pdfglyphtounicode{zcaron}{017E}%
+\pdfglyphtounicode{longs}{017F}%
+\pdfglyphtounicode{florin}{0192}%
+\pdfglyphtounicode{Ohorn}{01A0}%
+\pdfglyphtounicode{ohorn}{01A1}%
+\pdfglyphtounicode{Uhorn}{01AF}%
+\pdfglyphtounicode{uhorn}{01B0}%
+\pdfglyphtounicode{Gcaron}{01E6}%
+\pdfglyphtounicode{gcaron}{01E7}%
+\pdfglyphtounicode{Aringacute}{01FA}%
+\pdfglyphtounicode{aringacute}{01FB}%
+\pdfglyphtounicode{AEacute}{01FC}%
+\pdfglyphtounicode{aeacute}{01FD}%
+\pdfglyphtounicode{Oslashacute}{01FE}%
+\pdfglyphtounicode{oslashacute}{01FF}%
+\pdfglyphtounicode{Scommaaccent}{0218}%
+\pdfglyphtounicode{scommaaccent}{0219}%
+\pdfglyphtounicode{afii57929}{02BC}%
+\pdfglyphtounicode{afii64937}{02BD}%
+\pdfglyphtounicode{circumflex}{02C6}%
+\pdfglyphtounicode{caron}{02C7}%
+\pdfglyphtounicode{breve}{02D8}%
+\pdfglyphtounicode{dotaccent}{02D9}%
+\pdfglyphtounicode{ring}{02DA}%
+\pdfglyphtounicode{ogonek}{02DB}%
+\pdfglyphtounicode{tilde}{02DC}%
+\pdfglyphtounicode{hungarumlaut}{02DD}%
+\pdfglyphtounicode{gravecomb}{0300}%
+\pdfglyphtounicode{acutecomb}{0301}%
+\pdfglyphtounicode{tildecomb}{0303}%
+\pdfglyphtounicode{hookabovecomb}{0309}%
+\pdfglyphtounicode{dotbelowcomb}{0323}%
+\pdfglyphtounicode{tonos}{0384}%
+\pdfglyphtounicode{dieresistonos}{0385}%
+\pdfglyphtounicode{Alphatonos}{0386}%
+\pdfglyphtounicode{anoteleia}{0387}%
+\pdfglyphtounicode{Epsilontonos}{0388}%
+\pdfglyphtounicode{Etatonos}{0389}%
+\pdfglyphtounicode{Iotatonos}{038A}%
+\pdfglyphtounicode{Omicrontonos}{038C}%
+\pdfglyphtounicode{Upsilontonos}{038E}%
+\pdfglyphtounicode{Omegatonos}{038F}%
+\pdfglyphtounicode{iotadieresistonos}{0390}%
+\pdfglyphtounicode{Alpha}{0391}%
+\pdfglyphtounicode{Beta}{0392}%
+\pdfglyphtounicode{Gamma}{0393}%
+\pdfglyphtounicode{Epsilon}{0395}%
+\pdfglyphtounicode{Zeta}{0396}%
+\pdfglyphtounicode{Eta}{0397}%
+\pdfglyphtounicode{Theta}{0398}%
+\pdfglyphtounicode{Iota}{0399}%
+\pdfglyphtounicode{Kappa}{039A}%
+\pdfglyphtounicode{Lambda}{039B}%
+\pdfglyphtounicode{Mu}{039C}%
+\pdfglyphtounicode{Nu}{039D}%
+\pdfglyphtounicode{Xi}{039E}%
+\pdfglyphtounicode{Omicron}{039F}%
+\pdfglyphtounicode{Pi}{03A0}%
+\pdfglyphtounicode{Rho}{03A1}%
+\pdfglyphtounicode{Sigma}{03A3}%
+\pdfglyphtounicode{Tau}{03A4}%
+\pdfglyphtounicode{Upsilon}{03A5}%
+\pdfglyphtounicode{Phi}{03A6}%
+\pdfglyphtounicode{Chi}{03A7}%
+\pdfglyphtounicode{Psi}{03A8}%
+\pdfglyphtounicode{Iotadieresis}{03AA}%
+\pdfglyphtounicode{Upsilondieresis}{03AB}%
+\pdfglyphtounicode{alphatonos}{03AC}%
+\pdfglyphtounicode{epsilontonos}{03AD}%
+\pdfglyphtounicode{etatonos}{03AE}%
+\pdfglyphtounicode{iotatonos}{03AF}%
+\pdfglyphtounicode{upsilondieresistonos}{03B0}%
+\pdfglyphtounicode{alpha}{03B1}%
+\pdfglyphtounicode{beta}{03B2}%
+\pdfglyphtounicode{gamma}{03B3}%
+\pdfglyphtounicode{delta}{03B4}%
+\pdfglyphtounicode{epsilon}{03B5}%
+\pdfglyphtounicode{zeta}{03B6}%
+\pdfglyphtounicode{eta}{03B7}%
+\pdfglyphtounicode{theta}{03B8}%
+\pdfglyphtounicode{iota}{03B9}%
+\pdfglyphtounicode{kappa}{03BA}%
+\pdfglyphtounicode{lambda}{03BB}%
+\pdfglyphtounicode{nu}{03BD}%
+\pdfglyphtounicode{xi}{03BE}%
+\pdfglyphtounicode{omicron}{03BF}%
+\pdfglyphtounicode{pi}{03C0}%
+\pdfglyphtounicode{rho}{03C1}%
+\pdfglyphtounicode{sigma1}{03C2}%
+\pdfglyphtounicode{sigma}{03C3}%
+\pdfglyphtounicode{tau}{03C4}%
+\pdfglyphtounicode{upsilon}{03C5}%
+\pdfglyphtounicode{phi}{03C6}%
+\pdfglyphtounicode{chi}{03C7}%
+\pdfglyphtounicode{psi}{03C8}%
+\pdfglyphtounicode{omega}{03C9}%
+\pdfglyphtounicode{iotadieresis}{03CA}%
+\pdfglyphtounicode{upsilondieresis}{03CB}%
+\pdfglyphtounicode{omicrontonos}{03CC}%
+\pdfglyphtounicode{upsilontonos}{03CD}%
+\pdfglyphtounicode{omegatonos}{03CE}%
+\pdfglyphtounicode{theta1}{03D1}%
+\pdfglyphtounicode{Upsilon1}{03D2}%
+\pdfglyphtounicode{phi1}{03D5}%
+\pdfglyphtounicode{omega1}{03D6}%
+\pdfglyphtounicode{afii10023}{0401}%
+\pdfglyphtounicode{afii10051}{0402}%
+\pdfglyphtounicode{afii10052}{0403}%
+\pdfglyphtounicode{afii10053}{0404}%
+\pdfglyphtounicode{afii10054}{0405}%
+\pdfglyphtounicode{afii10055}{0406}%
+\pdfglyphtounicode{afii10056}{0407}%
+\pdfglyphtounicode{afii10057}{0408}%
+\pdfglyphtounicode{afii10058}{0409}%
+\pdfglyphtounicode{afii10059}{040A}%
+\pdfglyphtounicode{afii10060}{040B}%
+\pdfglyphtounicode{afii10061}{040C}%
+\pdfglyphtounicode{afii10062}{040E}%
+\pdfglyphtounicode{afii10145}{040F}%
+\pdfglyphtounicode{afii10017}{0410}%
+\pdfglyphtounicode{afii10018}{0411}%
+\pdfglyphtounicode{afii10019}{0412}%
+\pdfglyphtounicode{afii10020}{0413}%
+\pdfglyphtounicode{afii10021}{0414}%
+\pdfglyphtounicode{afii10022}{0415}%
+\pdfglyphtounicode{afii10024}{0416}%
+\pdfglyphtounicode{afii10025}{0417}%
+\pdfglyphtounicode{afii10026}{0418}%
+\pdfglyphtounicode{afii10027}{0419}%
+\pdfglyphtounicode{afii10028}{041A}%
+\pdfglyphtounicode{afii10029}{041B}%
+\pdfglyphtounicode{afii10030}{041C}%
+\pdfglyphtounicode{afii10031}{041D}%
+\pdfglyphtounicode{afii10032}{041E}%
+\pdfglyphtounicode{afii10033}{041F}%
+\pdfglyphtounicode{afii10034}{0420}%
+\pdfglyphtounicode{afii10035}{0421}%
+\pdfglyphtounicode{afii10036}{0422}%
+\pdfglyphtounicode{afii10037}{0423}%
+\pdfglyphtounicode{afii10038}{0424}%
+\pdfglyphtounicode{afii10039}{0425}%
+\pdfglyphtounicode{afii10040}{0426}%
+\pdfglyphtounicode{afii10041}{0427}%
+\pdfglyphtounicode{afii10042}{0428}%
+\pdfglyphtounicode{afii10043}{0429}%
+\pdfglyphtounicode{afii10044}{042A}%
+\pdfglyphtounicode{afii10045}{042B}%
+\pdfglyphtounicode{afii10046}{042C}%
+\pdfglyphtounicode{afii10047}{042D}%
+\pdfglyphtounicode{afii10048}{042E}%
+\pdfglyphtounicode{afii10049}{042F}%
+\pdfglyphtounicode{afii10065}{0430}%
+\pdfglyphtounicode{afii10066}{0431}%
+\pdfglyphtounicode{afii10067}{0432}%
+\pdfglyphtounicode{afii10068}{0433}%
+\pdfglyphtounicode{afii10069}{0434}%
+\pdfglyphtounicode{afii10070}{0435}%
+\pdfglyphtounicode{afii10072}{0436}%
+\pdfglyphtounicode{afii10073}{0437}%
+\pdfglyphtounicode{afii10074}{0438}%
+\pdfglyphtounicode{afii10075}{0439}%
+\pdfglyphtounicode{afii10076}{043A}%
+\pdfglyphtounicode{afii10077}{043B}%
+\pdfglyphtounicode{afii10078}{043C}%
+\pdfglyphtounicode{afii10079}{043D}%
+\pdfglyphtounicode{afii10080}{043E}%
+\pdfglyphtounicode{afii10081}{043F}%
+\pdfglyphtounicode{afii10082}{0440}%
+\pdfglyphtounicode{afii10083}{0441}%
+\pdfglyphtounicode{afii10084}{0442}%
+\pdfglyphtounicode{afii10085}{0443}%
+\pdfglyphtounicode{afii10086}{0444}%
+\pdfglyphtounicode{afii10087}{0445}%
+\pdfglyphtounicode{afii10088}{0446}%
+\pdfglyphtounicode{afii10089}{0447}%
+\pdfglyphtounicode{afii10090}{0448}%
+\pdfglyphtounicode{afii10091}{0449}%
+\pdfglyphtounicode{afii10092}{044A}%
+\pdfglyphtounicode{afii10093}{044B}%
+\pdfglyphtounicode{afii10094}{044C}%
+\pdfglyphtounicode{afii10095}{044D}%
+\pdfglyphtounicode{afii10096}{044E}%
+\pdfglyphtounicode{afii10097}{044F}%
+\pdfglyphtounicode{afii10071}{0451}%
+\pdfglyphtounicode{afii10099}{0452}%
+\pdfglyphtounicode{afii10100}{0453}%
+\pdfglyphtounicode{afii10101}{0454}%
+\pdfglyphtounicode{afii10102}{0455}%
+\pdfglyphtounicode{afii10103}{0456}%
+\pdfglyphtounicode{afii10104}{0457}%
+\pdfglyphtounicode{afii10105}{0458}%
+\pdfglyphtounicode{afii10106}{0459}%
+\pdfglyphtounicode{afii10107}{045A}%
+\pdfglyphtounicode{afii10108}{045B}%
+\pdfglyphtounicode{afii10109}{045C}%
+\pdfglyphtounicode{afii10110}{045E}%
+\pdfglyphtounicode{afii10193}{045F}%
+\pdfglyphtounicode{afii10146}{0462}%
+\pdfglyphtounicode{afii10194}{0463}%
+\pdfglyphtounicode{afii10147}{0472}%
+\pdfglyphtounicode{afii10195}{0473}%
+\pdfglyphtounicode{afii10148}{0474}%
+\pdfglyphtounicode{afii10196}{0475}%
+\pdfglyphtounicode{afii10050}{0490}%
+\pdfglyphtounicode{afii10098}{0491}%
+\pdfglyphtounicode{afii10846}{04D9}%
+\pdfglyphtounicode{afii57799}{05B0}%
+\pdfglyphtounicode{afii57801}{05B1}%
+\pdfglyphtounicode{afii57800}{05B2}%
+\pdfglyphtounicode{afii57802}{05B3}%
+\pdfglyphtounicode{afii57793}{05B4}%
+\pdfglyphtounicode{afii57794}{05B5}%
+\pdfglyphtounicode{afii57795}{05B6}%
+\pdfglyphtounicode{afii57798}{05B7}%
+\pdfglyphtounicode{afii57797}{05B8}%
+\pdfglyphtounicode{afii57806}{05B9}%
+\pdfglyphtounicode{afii57796}{05BB}%
+\pdfglyphtounicode{afii57807}{05BC}%
+\pdfglyphtounicode{afii57839}{05BD}%
+\pdfglyphtounicode{afii57645}{05BE}%
+\pdfglyphtounicode{afii57841}{05BF}%
+\pdfglyphtounicode{afii57842}{05C0}%
+\pdfglyphtounicode{afii57804}{05C1}%
+\pdfglyphtounicode{afii57803}{05C2}%
+\pdfglyphtounicode{afii57658}{05C3}%
+\pdfglyphtounicode{afii57664}{05D0}%
+\pdfglyphtounicode{afii57665}{05D1}%
+\pdfglyphtounicode{afii57666}{05D2}%
+\pdfglyphtounicode{afii57667}{05D3}%
+\pdfglyphtounicode{afii57668}{05D4}%
+\pdfglyphtounicode{afii57669}{05D5}%
+\pdfglyphtounicode{afii57670}{05D6}%
+\pdfglyphtounicode{afii57671}{05D7}%
+\pdfglyphtounicode{afii57672}{05D8}%
+\pdfglyphtounicode{afii57673}{05D9}%
+\pdfglyphtounicode{afii57674}{05DA}%
+\pdfglyphtounicode{afii57675}{05DB}%
+\pdfglyphtounicode{afii57676}{05DC}%
+\pdfglyphtounicode{afii57677}{05DD}%
+\pdfglyphtounicode{afii57678}{05DE}%
+\pdfglyphtounicode{afii57679}{05DF}%
+\pdfglyphtounicode{afii57680}{05E0}%
+\pdfglyphtounicode{afii57681}{05E1}%
+\pdfglyphtounicode{afii57682}{05E2}%
+\pdfglyphtounicode{afii57683}{05E3}%
+\pdfglyphtounicode{afii57684}{05E4}%
+\pdfglyphtounicode{afii57685}{05E5}%
+\pdfglyphtounicode{afii57686}{05E6}%
+\pdfglyphtounicode{afii57687}{05E7}%
+\pdfglyphtounicode{afii57688}{05E8}%
+\pdfglyphtounicode{afii57689}{05E9}%
+\pdfglyphtounicode{afii57690}{05EA}%
+\pdfglyphtounicode{afii57716}{05F0}%
+\pdfglyphtounicode{afii57717}{05F1}%
+\pdfglyphtounicode{afii57718}{05F2}%
+\pdfglyphtounicode{afii57388}{060C}%
+\pdfglyphtounicode{afii57403}{061B}%
+\pdfglyphtounicode{afii57407}{061F}%
+\pdfglyphtounicode{afii57409}{0621}%
+\pdfglyphtounicode{afii57410}{0622}%
+\pdfglyphtounicode{afii57411}{0623}%
+\pdfglyphtounicode{afii57412}{0624}%
+\pdfglyphtounicode{afii57413}{0625}%
+\pdfglyphtounicode{afii57414}{0626}%
+\pdfglyphtounicode{afii57415}{0627}%
+\pdfglyphtounicode{afii57416}{0628}%
+\pdfglyphtounicode{afii57417}{0629}%
+\pdfglyphtounicode{afii57418}{062A}%
+\pdfglyphtounicode{afii57419}{062B}%
+\pdfglyphtounicode{afii57420}{062C}%
+\pdfglyphtounicode{afii57421}{062D}%
+\pdfglyphtounicode{afii57422}{062E}%
+\pdfglyphtounicode{afii57423}{062F}%
+\pdfglyphtounicode{afii57424}{0630}%
+\pdfglyphtounicode{afii57425}{0631}%
+\pdfglyphtounicode{afii57426}{0632}%
+\pdfglyphtounicode{afii57427}{0633}%
+\pdfglyphtounicode{afii57428}{0634}%
+\pdfglyphtounicode{afii57429}{0635}%
+\pdfglyphtounicode{afii57430}{0636}%
+\pdfglyphtounicode{afii57431}{0637}%
+\pdfglyphtounicode{afii57432}{0638}%
+\pdfglyphtounicode{afii57433}{0639}%
+\pdfglyphtounicode{afii57434}{063A}%
+\pdfglyphtounicode{afii57440}{0640}%
+\pdfglyphtounicode{afii57441}{0641}%
+\pdfglyphtounicode{afii57442}{0642}%
+\pdfglyphtounicode{afii57443}{0643}%
+\pdfglyphtounicode{afii57444}{0644}%
+\pdfglyphtounicode{afii57445}{0645}%
+\pdfglyphtounicode{afii57446}{0646}%
+\pdfglyphtounicode{afii57470}{0647}%
+\pdfglyphtounicode{afii57448}{0648}%
+\pdfglyphtounicode{afii57449}{0649}%
+\pdfglyphtounicode{afii57450}{064A}%
+\pdfglyphtounicode{afii57451}{064B}%
+\pdfglyphtounicode{afii57452}{064C}%
+\pdfglyphtounicode{afii57453}{064D}%
+\pdfglyphtounicode{afii57454}{064E}%
+\pdfglyphtounicode{afii57455}{064F}%
+\pdfglyphtounicode{afii57456}{0650}%
+\pdfglyphtounicode{afii57457}{0651}%
+\pdfglyphtounicode{afii57458}{0652}%
+\pdfglyphtounicode{afii57392}{0660}%
+\pdfglyphtounicode{afii57393}{0661}%
+\pdfglyphtounicode{afii57394}{0662}%
+\pdfglyphtounicode{afii57395}{0663}%
+\pdfglyphtounicode{afii57396}{0664}%
+\pdfglyphtounicode{afii57397}{0665}%
+\pdfglyphtounicode{afii57398}{0666}%
+\pdfglyphtounicode{afii57399}{0667}%
+\pdfglyphtounicode{afii57400}{0668}%
+\pdfglyphtounicode{afii57401}{0669}%
+\pdfglyphtounicode{afii57381}{066A}%
+\pdfglyphtounicode{afii63167}{066D}%
+\pdfglyphtounicode{afii57511}{0679}%
+\pdfglyphtounicode{afii57506}{067E}%
+\pdfglyphtounicode{afii57507}{0686}%
+\pdfglyphtounicode{afii57512}{0688}%
+\pdfglyphtounicode{afii57513}{0691}%
+\pdfglyphtounicode{afii57508}{0698}%
+\pdfglyphtounicode{afii57505}{06A4}%
+\pdfglyphtounicode{afii57509}{06AF}%
+\pdfglyphtounicode{afii57514}{06BA}%
+\pdfglyphtounicode{afii57519}{06D2}%
+\pdfglyphtounicode{afii57534}{06D5}%
+\pdfglyphtounicode{Wgrave}{1E80}%
+\pdfglyphtounicode{wgrave}{1E81}%
+\pdfglyphtounicode{Wacute}{1E82}%
+\pdfglyphtounicode{wacute}{1E83}%
+\pdfglyphtounicode{Wdieresis}{1E84}%
+\pdfglyphtounicode{wdieresis}{1E85}%
+\pdfglyphtounicode{Ygrave}{1EF2}%
+\pdfglyphtounicode{ygrave}{1EF3}%
+\pdfglyphtounicode{afii61664}{200C}%
+\pdfglyphtounicode{afii301}{200D}%
+\pdfglyphtounicode{afii299}{200E}%
+\pdfglyphtounicode{afii300}{200F}%
+\pdfglyphtounicode{figuredash}{2012}%
+\pdfglyphtounicode{endash}{2013}%
+\pdfglyphtounicode{emdash}{2014}%
+\pdfglyphtounicode{afii208}{2015}%
+\pdfglyphtounicode{underscoredbl}{2017}%
+\pdfglyphtounicode{quoteleft}{2018}%
+\pdfglyphtounicode{quoteright}{2019}%
+\pdfglyphtounicode{quotesinglbase}{201A}%
+\pdfglyphtounicode{quotereversed}{201B}%
+\pdfglyphtounicode{quotedblleft}{201C}%
+\pdfglyphtounicode{quotedblright}{201D}%
+\pdfglyphtounicode{quotedblbase}{201E}%
+\pdfglyphtounicode{dagger}{2020}%
+\pdfglyphtounicode{daggerdbl}{2021}%
+\pdfglyphtounicode{bullet}{2022}%
+\pdfglyphtounicode{onedotenleader}{2024}%
+\pdfglyphtounicode{twodotenleader}{2025}%
+\pdfglyphtounicode{ellipsis}{2026}%
+\pdfglyphtounicode{afii61573}{202C}%
+\pdfglyphtounicode{afii61574}{202D}%
+\pdfglyphtounicode{afii61575}{202E}%
+\pdfglyphtounicode{perthousand}{2030}%
+\pdfglyphtounicode{minute}{2032}%
+\pdfglyphtounicode{second}{2033}%
+\pdfglyphtounicode{guilsinglleft}{2039}%
+\pdfglyphtounicode{guilsinglright}{203A}%
+\pdfglyphtounicode{exclamdbl}{203C}%
+\pdfglyphtounicode{fraction}{2044}%
+\pdfglyphtounicode{colonmonetary}{20A1}%
+\pdfglyphtounicode{franc}{20A3}%
+\pdfglyphtounicode{lira}{20A4}%
+\pdfglyphtounicode{peseta}{20A7}%
+\pdfglyphtounicode{afii57636}{20AA}%
+\pdfglyphtounicode{dong}{20AB}%
+\pdfglyphtounicode{Euro}{20AC}%
+\pdfglyphtounicode{afii61248}{2105}%
+\pdfglyphtounicode{Ifraktur}{2111}%
+\pdfglyphtounicode{afii61289}{2113}%
+\pdfglyphtounicode{afii61352}{2116}%
+\pdfglyphtounicode{weierstrass}{2118}%
+\pdfglyphtounicode{Rfraktur}{211C}%
+\pdfglyphtounicode{prescription}{211E}%
+\pdfglyphtounicode{trademark}{2122}%
+\pdfglyphtounicode{Omega}{2126}%
+\pdfglyphtounicode{estimated}{212E}%
+\pdfglyphtounicode{aleph}{2135}%
+\pdfglyphtounicode{onethird}{2153}%
+\pdfglyphtounicode{twothirds}{2154}%
+\pdfglyphtounicode{oneeighth}{215B}%
+\pdfglyphtounicode{threeeighths}{215C}%
+\pdfglyphtounicode{fiveeighths}{215D}%
+\pdfglyphtounicode{seveneighths}{215E}%
+\pdfglyphtounicode{arrowleft}{2190}%
+\pdfglyphtounicode{arrowup}{2191}%
+\pdfglyphtounicode{arrowright}{2192}%
+\pdfglyphtounicode{arrowdown}{2193}%
+\pdfglyphtounicode{arrowboth}{2194}%
+\pdfglyphtounicode{arrowupdn}{2195}%
+\pdfglyphtounicode{arrowupdnbse}{21A8}%
+\pdfglyphtounicode{carriagereturn}{21B5}%
+\pdfglyphtounicode{arrowdblleft}{21D0}%
+\pdfglyphtounicode{arrowdblup}{21D1}%
+\pdfglyphtounicode{arrowdblright}{21D2}%
+\pdfglyphtounicode{arrowdbldown}{21D3}%
+\pdfglyphtounicode{arrowdblboth}{21D4}%
+\pdfglyphtounicode{universal}{2200}%
+\pdfglyphtounicode{partialdiff}{2202}%
+\pdfglyphtounicode{existential}{2203}%
+\pdfglyphtounicode{emptyset}{2205}%
+\pdfglyphtounicode{Delta}{2206}%
+\pdfglyphtounicode{gradient}{2207}%
+\pdfglyphtounicode{element}{2208}%
+\pdfglyphtounicode{notelement}{2209}%
+\pdfglyphtounicode{suchthat}{220B}%
+\pdfglyphtounicode{product}{220F}%
+\pdfglyphtounicode{summation}{2211}%
+\pdfglyphtounicode{minus}{2212}%
+\pdfglyphtounicode{asteriskmath}{2217}%
+\pdfglyphtounicode{radical}{221A}%
+\pdfglyphtounicode{proportional}{221D}%
+\pdfglyphtounicode{infinity}{221E}%
+\pdfglyphtounicode{orthogonal}{221F}%
+\pdfglyphtounicode{angle}{2220}%
+\pdfglyphtounicode{logicaland}{2227}%
+\pdfglyphtounicode{logicalor}{2228}%
+\pdfglyphtounicode{intersection}{2229}%
+\pdfglyphtounicode{union}{222A}%
+\pdfglyphtounicode{integral}{222B}%
+\pdfglyphtounicode{therefore}{2234}%
+\pdfglyphtounicode{similar}{223C}%
+\pdfglyphtounicode{congruent}{2245}%
+\pdfglyphtounicode{approxequal}{2248}%
+\pdfglyphtounicode{notequal}{2260}%
+\pdfglyphtounicode{equivalence}{2261}%
+\pdfglyphtounicode{lessequal}{2264}%
+\pdfglyphtounicode{greaterequal}{2265}%
+\pdfglyphtounicode{propersubset}{2282}%
+\pdfglyphtounicode{propersuperset}{2283}%
+\pdfglyphtounicode{notsubset}{2284}%
+\pdfglyphtounicode{reflexsubset}{2286}%
+\pdfglyphtounicode{reflexsuperset}{2287}%
+\pdfglyphtounicode{circleplus}{2295}%
+\pdfglyphtounicode{circlemultiply}{2297}%
+\pdfglyphtounicode{perpendicular}{22A5}%
+\pdfglyphtounicode{dotmath}{22C5}%
+\pdfglyphtounicode{house}{2302}%
+\pdfglyphtounicode{revlogicalnot}{2310}%
+\pdfglyphtounicode{integraltp}{2320}%
+\pdfglyphtounicode{integralbt}{2321}%
+\pdfglyphtounicode{angleleft}{2329}%
+\pdfglyphtounicode{angleright}{232A}%
+\pdfglyphtounicode{SF100000}{2500}%
+\pdfglyphtounicode{SF110000}{2502}%
+\pdfglyphtounicode{SF10000}{250C}%
+\pdfglyphtounicode{SF30000}{2510}%
+\pdfglyphtounicode{SF20000}{2514}%
+\pdfglyphtounicode{SF40000}{2518}%
+\pdfglyphtounicode{SF80000}{251C}%
+\pdfglyphtounicode{SF90000}{2524}%
+\pdfglyphtounicode{SF60000}{252C}%
+\pdfglyphtounicode{SF70000}{2534}%
+\pdfglyphtounicode{SF50000}{253C}%
+\pdfglyphtounicode{SF430000}{2550}%
+\pdfglyphtounicode{SF240000}{2551}%
+\pdfglyphtounicode{SF510000}{2552}%
+\pdfglyphtounicode{SF520000}{2553}%
+\pdfglyphtounicode{SF390000}{2554}%
+\pdfglyphtounicode{SF220000}{2555}%
+\pdfglyphtounicode{SF210000}{2556}%
+\pdfglyphtounicode{SF250000}{2557}%
+\pdfglyphtounicode{SF500000}{2558}%
+\pdfglyphtounicode{SF490000}{2559}%
+\pdfglyphtounicode{SF380000}{255A}%
+\pdfglyphtounicode{SF280000}{255B}%
+\pdfglyphtounicode{SF270000}{255C}%
+\pdfglyphtounicode{SF260000}{255D}%
+\pdfglyphtounicode{SF360000}{255E}%
+\pdfglyphtounicode{SF370000}{255F}%
+\pdfglyphtounicode{SF420000}{2560}%
+\pdfglyphtounicode{SF190000}{2561}%
+\pdfglyphtounicode{SF200000}{2562}%
+\pdfglyphtounicode{SF230000}{2563}%
+\pdfglyphtounicode{SF470000}{2564}%
+\pdfglyphtounicode{SF480000}{2565}%
+\pdfglyphtounicode{SF410000}{2566}%
+\pdfglyphtounicode{SF450000}{2567}%
+\pdfglyphtounicode{SF460000}{2568}%
+\pdfglyphtounicode{SF400000}{2569}%
+\pdfglyphtounicode{SF540000}{256A}%
+\pdfglyphtounicode{SF530000}{256B}%
+\pdfglyphtounicode{SF440000}{256C}%
+\pdfglyphtounicode{upblock}{2580}%
+\pdfglyphtounicode{dnblock}{2584}%
+\pdfglyphtounicode{block}{2588}%
+\pdfglyphtounicode{lfblock}{258C}%
+\pdfglyphtounicode{rtblock}{2590}%
+\pdfglyphtounicode{ltshade}{2591}%
+\pdfglyphtounicode{shade}{2592}%
+\pdfglyphtounicode{dkshade}{2593}%
+\pdfglyphtounicode{filledbox}{25A0}%
+\pdfglyphtounicode{H22073}{25A1}%
+\pdfglyphtounicode{H18543}{25AA}%
+\pdfglyphtounicode{H18551}{25AB}%
+\pdfglyphtounicode{filledrect}{25AC}%
+\pdfglyphtounicode{triagup}{25B2}%
+\pdfglyphtounicode{triagrt}{25BA}%
+\pdfglyphtounicode{triagdn}{25BC}%
+\pdfglyphtounicode{triaglf}{25C4}%
+\pdfglyphtounicode{lozenge}{25CA}%
+\pdfglyphtounicode{circle}{25CB}%
+\pdfglyphtounicode{H18533}{25CF}%
+\pdfglyphtounicode{invbullet}{25D8}%
+\pdfglyphtounicode{invcircle}{25D9}%
+\pdfglyphtounicode{openbullet}{25E6}%
+\pdfglyphtounicode{smileface}{263A}%
+\pdfglyphtounicode{invsmileface}{263B}%
+\pdfglyphtounicode{sun}{263C}%
+\pdfglyphtounicode{female}{2640}%
+\pdfglyphtounicode{male}{2642}%
+\pdfglyphtounicode{spade}{2660}%
+\pdfglyphtounicode{club}{2663}%
+\pdfglyphtounicode{heart}{2665}%
+\pdfglyphtounicode{diamond}{2666}%
+\pdfglyphtounicode{musicalnote}{266A}%
+\pdfglyphtounicode{musicalnotedbl}{266B}%
+%
+\endinput
diff --git a/tex/context/base/pdfr-ec.mkii b/tex/context/base/pdfr-ec.mkii
new file mode 100644
index 000000000..b6604984c
--- /dev/null
+++ b/tex/context/base/pdfr-ec.mkii
@@ -0,0 +1,145 @@
+%D \module
+%D [ file=pdfr-ec,
+%D version=2005.07.27,
+%D title=\CONTEXT\ PDF Font Resources,
+%D subtitle=EC encoding,
+%D author={Vladimir Volovich / Taco Hoekwater},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This vector is derived (but reformatted a bit) from
+%D the one in \LaTeX's CMap package
+
+\startpdffontresource[ec]
+/CIDInit /ProcSet findresource begin
+12 dict begin
+ begincmap
+ /CIDSystemInfo
+ << /Registry (TeX)
+ /Ordering (T1)
+ /Supplement 0
+ >> def
+ /CMapName /TeX-T1-0 def
+ /CMapType 2 def
+ 1 begincodespacerange
+ <00> <FF>
+ endcodespacerange
+ 10 beginbfrange
+ <0E> <0F> <2039>
+ <10> <12> <201C>
+ <15> <16> <2013>
+ <21> <26> <0021>
+ <28> <5F> <0028>
+ <61> <7E> <0061>
+ <C0> <D6> <00C0>
+ <D8> <DE> <00D8>
+ <E0> <F6> <00E0>
+ <F8> <FE> <00F8>
+ endbfrange
+ 95 beginbfchar
+ <00> <0060>
+ <01> <00B4>
+ <02> <02C6>
+ <03> <02DC>
+ <04> <00A8>
+ <05> <02DD>
+ <06> <02DA>
+ <07> <02C7>
+ <08> <02D8>
+ <09> <00AF>
+ <0A> <02D9>
+ <0B> <00B8>
+ <0C> <02DB>
+ <0D> <201A>
+ <13> <00AB>
+ <14> <00BB>
+ <17> <200C>
+ <19> <0131>
+ <1B> <00660066>
+ <1C> <00660069>
+ <1D> <0066006C>
+ <1E> <006600660069>
+ <1F> <00660066006C>
+ <20> <2423>
+ <27> <2019>
+ <60> <2018>
+ <7F> <002D>
+ <80> <0102>
+ <81> <0104>
+ <82> <0106>
+ <83> <010C>
+ <84> <010E>
+ <85> <011A>
+ <86> <0118>
+ <87> <011E>
+ <88> <0139>
+ <89> <013D>
+ <8A> <0141>
+ <8B> <0143>
+ <8C> <0147>
+ <8D> <014A>
+ <8E> <0150>
+ <8F> <0154>
+ <90> <0158>
+ <91> <015A>
+ <92> <0160>
+ <93> <015E>
+ <94> <0164>
+ <95> <021A>
+ <96> <0170>
+ <97> <016E>
+ <98> <0178>
+ <99> <0179>
+ <9A> <017D>
+ <9B> <017B>
+ <9C> <0132>
+ <9D> <0130>
+ <9E> <0111>
+ <9F> <00A7>
+ <A0> <0103>
+ <A1> <0105>
+ <A2> <0107>
+ <A3> <010D>
+ <A4> <010F>
+ <A5> <011B>
+ <A6> <0119>
+ <A7> <011F>
+ <A8> <013A>
+ <A9> <013E>
+ <AA> <0142>
+ <AB> <0144>
+ <AC> <0148>
+ <AD> <014B>
+ <AE> <0151>
+ <AF> <0155>
+ <B0> <0159>
+ <B1> <015B>
+ <B2> <0161>
+ <B3> <015F>
+ <B4> <0165>
+ <B5> <021B>
+ <B6> <0171>
+ <B7> <016F>
+ <B8> <00FF>
+ <B9> <017A>
+ <BA> <017E>
+ <BB> <017C>
+ <BC> <0133>
+ <BD> <00A1>
+ <BE> <00BF>
+ <BF> <00A3>
+ <D7> <0152>
+ <DF> <00530053>
+ <F7> <0153>
+ <FF> <00DF>
+ endbfchar
+ endcmap
+CMapName currentdict /CMap defineresource pop end
+end
+\stoppdffontresource
+
+\endinput
diff --git a/tex/context/base/pdfr-il2.mkii b/tex/context/base/pdfr-il2.mkii
new file mode 100644
index 000000000..70bcb25da
--- /dev/null
+++ b/tex/context/base/pdfr-il2.mkii
@@ -0,0 +1,233 @@
+%D \module
+%D [ file=pdfr-il2,
+%D version=2000.12.10,
+%D title=\CONTEXT\ PDF Font Resources,
+%D subtitle=ISO Latin 2,
+%D author={Ondrej Koala Vacha, Hans Hagen},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This vector is derived (but reformatted a bit) from a
+%D sample send to me by Petr Ferdus. There was some Czech
+%D comment in which I could recognize the name of Ondrej
+%D Koala Vacha. More information on setting up such a vector
+%D can be found in the \PDF\ reference manual.
+
+\startpdffontresource[il2]
+/CIDInit /ProcSet findresource begin
+12 dict begin
+ begincmap
+ /CIDSystemInfo
+ << /Registry (Adobe)
+ /Ordering (T1UV)
+ /Supplement 0
+ >> def
+ /CMapName /Adobe-Identity-UCS def
+ /CMapType 1 def
+ 1 begincodespacerange
+ <00> <FF>
+ endcodespacerange
+ %%FontSpecificEncoding
+ 191 beginbfrange
+ <20> <20> <0020> % space dec: 32 oct:040 hex:20
+ <21> <21> <0021> % exclam dec: 33 oct:041 hex:21
+ <22> <22> <0022> % quotedbl dec: 34 oct:042 hex:22
+ <23> <23> <0023> % numbersign dec: 35 oct:043 hex:23
+ <24> <24> <0024> % dollar dec: 36 oct:044 hex:24
+ <25> <25> <0025> % percent dec: 37 oct:045 hex:25
+ <26> <26> <0026> % ampersand dec: 38 oct:046 hex:26
+ <27> <27> <0027> % quotesingle dec: 39 oct:047 hex:27
+ <28> <28> <0028> % parenleft dec: 40 oct:050 hex:28
+ <29> <29> <0029> % parenright dec: 41 oct:051 hex:29
+ <2a> <2a> <002a> % asterisk dec: 42 oct:052 hex:2a
+ <2b> <2b> <002b> % plus dec: 43 oct:053 hex:2b
+ <2c> <2c> <002c> % comma dec: 44 oct:054 hex:2c
+ <2d> <2d> <002d> % hyphen dec: 45 oct:055 hex:2d
+ <2e> <2e> <002e> % period dec: 46 oct:056 hex:2e
+ <2f> <2f> <002f> % slash dec: 47 oct:057 hex:2f
+ <30> <30> <0030> % zero dec: 48 oct:060 hex:30
+ <31> <31> <0031> % one dec: 49 oct:061 hex:31
+ <32> <32> <0032> % two dec: 50 oct:062 hex:32
+ <33> <33> <0033> % three dec: 51 oct:063 hex:33
+ <34> <34> <0034> % four dec: 52 oct:064 hex:34
+ <35> <35> <0035> % five dec: 53 oct:065 hex:35
+ <36> <36> <0036> % six dec: 54 oct:066 hex:36
+ <37> <37> <0037> % seven dec: 55 oct:067 hex:37
+ <38> <38> <0038> % eight dec: 56 oct:070 hex:38
+ <39> <39> <0039> % nine dec: 57 oct:071 hex:39
+ <3a> <3a> <003a> % colon dec: 58 oct:072 hex:3a
+ <3b> <3b> <003b> % semicolon dec: 59 oct:073 hex:3b
+ <3c> <3c> <003c> % less dec: 60 oct:074 hex:3c
+ <3d> <3d> <003d> % equal dec: 61 oct:075 hex:3d
+ <3e> <3e> <003e> % greater dec: 62 oct:076 hex:3e
+ <3f> <3f> <003f> % question dec: 63 oct:077 hex:3f
+ <40> <40> <0040> % at dec: 64 oct:100 hex:40
+ <41> <41> <0041> % A dec: 65 oct:101 hex:41
+ <42> <42> <0042> % B dec: 66 oct:102 hex:42
+ <43> <43> <0043> % C dec: 67 oct:103 hex:43
+ <44> <44> <0044> % D dec: 68 oct:104 hex:44
+ <45> <45> <0045> % E dec: 69 oct:105 hex:45
+ <46> <46> <0046> % F dec: 70 oct:106 hex:46
+ <47> <47> <0047> % G dec: 71 oct:107 hex:47
+ <48> <48> <0048> % H dec: 72 oct:110 hex:48
+ <49> <49> <0049> % I dec: 73 oct:111 hex:49
+ <4a> <4a> <004a> % J dec: 74 oct:112 hex:4a
+ <4b> <4b> <004b> % K dec: 75 oct:113 hex:4b
+ <4c> <4c> <004c> % L dec: 76 oct:114 hex:4c
+ <4d> <4d> <004d> % M dec: 77 oct:115 hex:4d
+ <4e> <4e> <004e> % N dec: 78 oct:116 hex:4e
+ <4f> <4f> <004f> % O dec: 79 oct:117 hex:4f
+ <50> <50> <0050> % P dec: 80 oct:120 hex:50
+ <51> <51> <0051> % Q dec: 81 oct:121 hex:51
+ <52> <52> <0052> % R dec: 82 oct:122 hex:52
+ <53> <53> <0053> % S dec: 83 oct:123 hex:53
+ <54> <54> <0054> % T dec: 84 oct:124 hex:54
+ <55> <55> <0055> % U dec: 85 oct:125 hex:55
+ <56> <56> <0056> % V dec: 86 oct:126 hex:56
+ <57> <57> <0057> % W dec: 87 oct:127 hex:57
+ <58> <58> <0058> % X dec: 88 oct:130 hex:58
+ <59> <59> <0059> % Y dec: 89 oct:131 hex:59
+ <5a> <5a> <005a> % Z dec: 90 oct:132 hex:5a
+ <5b> <5b> <005b> % bracketleft dec: 91 oct:133 hex:5b
+ <5c> <5c> <005c> % backslash dec: 92 oct:134 hex:5c
+ <5d> <5d> <005d> % bracketright dec: 93 oct:135 hex:5d
+ <5e> <5e> <005e> % asciicircum dec: 94 oct:136 hex:5e
+ <5f> <5f> <005f> % underscore dec: 95 oct:137 hex:5f
+ <60> <60> <0060> % grave dec: 96 oct:140 hex:60
+ <61> <61> <0061> % a dec: 97 oct:141 hex:61
+ <62> <62> <0062> % b dec: 98 oct:142 hex:62
+ <63> <63> <0063> % c dec: 99 oct:143 hex:63
+ <64> <64> <0064> % d dec:100 oct:144 hex:64
+ <65> <65> <0065> % e dec:101 oct:145 hex:65
+ <66> <66> <0066> % f dec:102 oct:146 hex:66
+ <67> <67> <0067> % g dec:103 oct:147 hex:67
+ <68> <68> <0068> % h dec:104 oct:150 hex:68
+ <69> <69> <0069> % i dec:105 oct:151 hex:69
+ <6a> <6a> <006a> % j dec:106 oct:152 hex:6a
+ <6b> <6b> <006b> % k dec:107 oct:153 hex:6b
+ <6c> <6c> <006c> % l dec:108 oct:154 hex:6c
+ <6d> <6d> <006d> % m dec:109 oct:155 hex:6d
+ <6e> <6e> <006e> % n dec:110 oct:156 hex:6e
+ <6f> <6f> <006f> % o dec:111 oct:157 hex:6f
+ <70> <70> <0070> % p dec:112 oct:160 hex:70
+ <71> <71> <0071> % q dec:113 oct:161 hex:71
+ <72> <72> <0072> % r dec:114 oct:162 hex:72
+ <73> <73> <0073> % s dec:115 oct:163 hex:73
+ <74> <74> <0074> % t dec:116 oct:164 hex:74
+ <75> <75> <0075> % u dec:117 oct:165 hex:75
+ <76> <76> <0076> % v dec:118 oct:166 hex:76
+ <77> <77> <0077> % w dec:119 oct:167 hex:77
+ <78> <78> <0078> % x dec:120 oct:170 hex:78
+ <79> <79> <0079> % y dec:121 oct:171 hex:79
+ <7a> <7a> <007a> % z dec:122 oct:172 hex:7a
+ <7b> <7b> <007b> % braceleft dec:123 oct:173 hex:7b
+ <7c> <7c> <007c> % bar dec:124 oct:174 hex:7c
+ <7d> <7d> <007d> % braceright dec:125 oct:175 hex:7d
+ <7e> <7e> <007e> % asciitilde dec:126 oct:176 hex:7e
+ <a0> <a0> <00a0> % nbspace dec:160 oct:240 hex:a0
+ <a1> <a1> <0104> % Aogonek dec:161 oct:241 hex:a1
+ <a2> <a2> <00a2> % breve dec:162 oct:242 hex:a2
+ <a3> <a3> <00a3> % Lslash dec:163 oct:243 hex:a3
+ <a4> <a4> <00a4> % currency dec:164 oct:244 hex:a4
+ <a5> <a5> <013d> % Lcaron dec:165 oct:245 hex:a5
+ <a6> <a6> <015a> % Sacute dec:166 oct:246 hex:a6
+ <a7> <a7> <00a7> % section dec:167 oct:247 hex:a7
+ <a8> <a8> <00a8> % dieresis dec:168 oct:250 hex:a8
+ <a9> <a9> <0160> % Scaron dec:169 oct:251 hex:a9
+ <aa> <aa> <015e> % Scedilla dec:170 oct:252 hex:aa
+ <ab> <ab> <0164> % Tcaron dec:171 oct:253 hex:ab
+ <ac> <ac> <0179> % Zacute dec:172 oct:254 hex:ac
+ <ad> <ad> <00ad> % sfthyphen dec:173 oct:255 hex:ad
+ <ae> <ae> <017d> % Zcaron dec:174 oct:256 hex:ae
+ <af> <af> <00af> % Zdotaccent dec:175 oct:257 hex:af
+ <b0> <b0> <00b0> % ring dec:176 oct:260 hex:b0
+ <b1> <b1> <0105> % aogonek dec:177 oct:261 hex:b1
+ <b2> <b2> <00b2> % ogonek dec:178 oct:262 hex:b2
+ <b3> <b3> <00b3> % lslash dec:179 oct:263 hex:b3
+ <b4> <b4> <00b4> % acute dec:180 oct:264 hex:b4
+ <b5> <b5> <013e> % lcaron dec:181 oct:265 hex:b5
+ <b6> <b6> <015b> % sacute dec:182 oct:266 hex:b6
+ <b7> <b7> <00b7> % caron dec:183 oct:267 hex:b7
+ <b8> <b8> <00b8> % cedilla dec:184 oct:270 hex:b8
+ <b9> <b9> <0161> % scaron dec:185 oct:271 hex:b9
+ <ba> <ba> <015f> % scedilla dec:186 oct:272 hex:ba
+ <bb> <bb> <0165> % tcaron dec:187 oct:273 hex:bb
+ <bc> <bc> <017a> % zacute dec:188 oct:274 hex:bc
+ <bd> <bd> <00bd> % hungarumlaut dec:189 oct:275 hex:bd
+ <be> <be> <017e> % zcaron dec:190 oct:276 hex:be
+ <bf> <bf> <00bf> % zdotaccent dec:191 oct:277 hex:bf
+ <c0> <c0> <0154> % Racute dec:192 oct:300 hex:c0
+ <c1> <c1> <00c1> % Aacute dec:193 oct:301 hex:c1
+ <c2> <c2> <00c2> % Acircumflex dec:194 oct:302 hex:c2
+ <c3> <c3> <0102> % Abreve dec:195 oct:303 hex:c3
+ <c4> <c4> <00c4> % Adieresis dec:196 oct:304 hex:c4
+ <c5> <c5> <0139> % Lacute dec:197 oct:305 hex:c5
+ <c6> <c6> <0106> % Cacute dec:198 oct:306 hex:c6
+ <c7> <c7> <00c7> % Ccedilla dec:199 oct:307 hex:c7
+ <c8> <c8> <010c> % Ccaron dec:200 oct:310 hex:c8
+ <c9> <c9> <00c9> % Eacute dec:201 oct:311 hex:c9
+ <ca> <ca> <0118> % Eogonek dec:202 oct:312 hex:ca
+ <cb> <cb> <00cb> % Edieresis dec:203 oct:313 hex:cb
+ <cc> <cc> <011a> % Ecaron dec:204 oct:314 hex:cc
+ <cd> <cd> <00cd> % Iacute dec:205 oct:315 hex:cd
+ <ce> <ce> <00ce> % Icircumflex dec:206 oct:316 hex:ce
+ <cf> <cf> <010e> % Dcaron dec:207 oct:317 hex:cf
+ <d0> <d0> <00d0> % Dslash dec:208 oct:320 hex:d0
+ <d1> <d1> <0143> % Nacute dec:209 oct:321 hex:d1
+ <d2> <d2> <0147> % Ncaron dec:210 oct:322 hex:d2
+ <d3> <d3> <00d3> % Oacute dec:211 oct:323 hex:d3
+ <d4> <d4> <00d4> % Ocircumflex dec:212 oct:324 hex:d4
+ <d5> <d5> <00d5> % Ohungarumlaut dec:213 oct:325 hex:d5
+ <d6> <d6> <00d6> % Odieresis dec:214 oct:326 hex:d6
+ <d7> <d7> <00d7> % multiply dec:215 oct:327 hex:d7
+ <d8> <d8> <0158> % Rcaron dec:216 oct:330 hex:d8
+ <d9> <d9> <016e> % Uring dec:217 oct:331 hex:d9
+ <da> <da> <00da> % Uacute dec:218 oct:332 hex:da
+ <db> <db> <00db> % Uhungarumlaut dec:219 oct:333 hex:db
+ <dc> <dc> <00dc> % Udieresis dec:220 oct:334 hex:dc
+ <dd> <dd> <00dd> % Yacute dec:221 oct:335 hex:dd
+ <de> <de> <00de> % Tcommaaccent dec:222 oct:336 hex:de
+ <df> <df> <00df> % germandbls dec:223 oct:337 hex:df
+ <e0> <e0> <0155> % racute dec:224 oct:340 hex:e0
+ <e1> <e1> <00e1> % aacute dec:225 oct:341 hex:e1
+ <e2> <e2> <00e2> % acircumflex dec:226 oct:342 hex:e2
+ <e3> <e3> <0103> % abreve dec:227 oct:343 hex:e3
+ <e4> <e4> <00e4> % adieresis dec:228 oct:344 hex:e4
+ <e5> <e5> <013a> % lacute dec:229 oct:345 hex:e5
+ <e6> <e6> <0107> % cacute dec:230 oct:346 hex:e6
+ <e7> <e7> <00e7> % ccedilla dec:231 oct:347 hex:e7
+ <e8> <e8> <010d> % ccaron dec:232 oct:350 hex:e8
+ <e9> <e9> <00e9> % eacute dec:233 oct:351 hex:e9
+ <ea> <ea> <0119> % eogonek dec:234 oct:352 hex:ea
+ <eb> <eb> <00eb> % edieresis dec:235 oct:353 hex:eb
+ <ec> <ec> <011b> % ecaron dec:236 oct:354 hex:ec
+ <ed> <ed> <00ed> % iacute dec:237 oct:355 hex:ed
+ <ee> <ee> <00ee> % icircumflex dec:238 oct:356 hex:ee
+ <ef> <ef> <010f> % dcaron dec:239 oct:357 hex:ef
+ <f0> <f0> <00f0> % dmacron dec:240 oct:360 hex:f0
+ <f1> <f1> <0144> % nacute dec:241 oct:361 hex:f1
+ <f2> <f2> <0148> % ncaron dec:242 oct:362 hex:f2
+ <f3> <f3> <00f3> % oacute dec:243 oct:363 hex:f3
+ <f4> <f4> <00f4> % ocircumflex dec:244 oct:364 hex:f4
+ <f5> <f5> <00f5> % ohungarumlaut dec:245 oct:365 hex:f5
+ <f6> <f6> <00f6> % odieresis dec:246 oct:366 hex:f6
+ <f7> <f7> <00f7> % divide dec:247 oct:367 hex:f7
+ <f8> <f8> <0159> % rcaron dec:248 oct:370 hex:f8
+ <f9> <f9> <016f> % uring dec:249 oct:371 hex:f9
+ <fa> <fa> <00fa> % uacute dec:250 oct:372 hex:fa
+ <fb> <fb> <00fb> % uhungarumlaut dec:251 oct:373 hex:fb
+ <fc> <fc> <00fc> % udieresis dec:252 oct:374 hex:fc
+ <fd> <fd> <00fd> % yacute dec:253 oct:375 hex:fd
+ <fe> <fe> <00fe> % tcommaaccent dec:254 oct:376 hex:fe
+ <ff> <ff> <00ff> % dotaccent dec:255 oct:377 hex:ff
+ endbfrange
+ endcmap
+CMapName currentdict /CMap defineresource pop end
+end
+\stoppdffontresource
+
+\endinput
diff --git a/tex/context/base/ppchtex.mkii b/tex/context/base/ppchtex.mkii
new file mode 100644
index 000000000..045e9808b
--- /dev/null
+++ b/tex/context/base/ppchtex.mkii
@@ -0,0 +1,3554 @@
+%D \module
+%D [ file=ppchtex (m-chemie),
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten},
+%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% option=test => boxes
+% dummy => file
+% final => file / local run
+%
+% constante van phantom in definitie ONE: \setchemicaltextwidth 300
+%
+% it would be interesting to rewrite this module with todays
+% experiences and new context functionality, maybe ...
+
+% Deze module ondersteunt het zetten van chemische
+% (structuur)formules. Hoewel de macro' zijn afgestemd op
+% CONTEXT, zijn ze ook buiten deze zetomgeving te gebruiken.
+%
+% Dit is, afgezien van updates, de definitieve versie van
+% PPCHTEX. Gebruikersgemak, eenvoud, flexibiliteit, en
+% snelheid zijn inmiddels redelijk geoptimaliseerd. Dit neemt
+% niet weg dat hier en daar nog verbetering mogelijk is. Dit
+% zal dan ook nog gebeuren.
+%
+% Volgende versies zullen tenminste dezelfde functionaliteit
+% hebben. We houden ons natuurlijk het recht voor de kwaliteit
+% van de output te verbeteren. Daarnaast staan nog op het
+% wensenlijstje:
+%
+% - optimaliseren in termen van proces-tijd
+% - aanpassen naamgeving van interne macro's
+% - toevoegen van functionaliteit
+% - in \x!-vorm omzetten van GIVES, TB enz.
+%
+% De mix tussen engels en nederlands lijkt soms verwarrend.
+% Meestal zijn verborgen macro's engels en zichtbare macro's
+% nederlands. Het gebruik van [ ] en { } sluit aan op andere
+% Context-macro's. Hetzelfde geldt voor instellingen en
+% \start-\stop-constructies.
+%
+% De schijnbaar overbodige \bgroup-\egroup constructie
+% garandeert aansluiting bij de Context-macro's voor het
+% plaatsen van figuren, tabellen en andere floats.
+%
+% Binnen Context worden de macro's geladen met
+% \gebruikextras[chemie]. Daarbij wordt een passende melding
+% getoont. Buiten Context genereren we een melding:
+
+\doifundefined{usemodule}
+ {\writestatus{loading}{ConTeXt Chemical Macro's / 1996.3.1}}
+
+% Er kan gebruik worden gemaakt van PiCTeX of PStricks. Een
+% van deze pakketten moet van te voren zijn geladen.
+%
+% \input prepictex.tex (i.g.v. LaTeX)
+% \input pictex.tex
+% \input postpictex.tex (i.g.v. LaTeX)
+%
+% of:
+%
+% \input multido.tex
+% \input pstricks.tex
+% \input pst-plot.tex
+%
+% In \CONTEXT\ kan men de modules m-pictex en m-pstricks
+% gebruiken. De eerste module laad of efficiente wijze PiCTeX
+% en de tweede module koppelt het PSTRICKS kleurmechanisme
+% aan dat van \CONTEXT.
+%
+
+% PSTricks: {-\chemicalangle} instead of {*0}, which produces
+% faulty ps code when \chemicalangle=0
+
+\startcommands dutch english german
+
+ gotochemical: naarchemie gotochemical zurchemie
+ setupchemical: stelchemiein setupchemical stellechemieein
+ startchemical: startchemie startchemical startchemie
+ stopchemical: stopchemie stopchemical stopchemie
+ definechemical: definieerchemie definechemical definierechemie
+ chemical: chemie chemical chemie
+ toptext: boventekst toptext textueber
+ bottext: ondertekst bottext textunter
+ midtext: middentekst midtext textmitte
+
+\stopcommands
+
+\doifundefined{fiverm} % In the more recent LaTeX versions
+ {\font\fiverm=cmr5 } % \fiverm is no longer (pre)defined.
+
+\doifdefinedelse{beginpicture} % PiCTeX
+ {\doifdefinedelse{startMPdrawing}
+ {\chardef\chemicaldrawingmode=2 } % MetaPost
+ {\chardef\chemicaldrawingmode=0 }} % raw
+ {\doifdefinedelse{psaxes}
+ {\chardef\chemicaldrawingmode=1 } % PSTricks
+ {\chardef\chemicaldrawingmode=3 }} % unknown
+
+\ifcase\chemicaldrawingmode
+ \writestatus{ppchtex}{using PiCTeX}
+\or
+ \writestatus{ppchtex}{using PSTricks (still experimental)}
+ \writestatus{ppchtex}{automatic sizing not (yet) supported}
+\or
+ \writestatus{ppchtex}{using PiCTeX and MetaPost}
+\else
+ \writestatus{ppchtex}{load PiCTeX (+pre/post) or PSTricks (+pst_plot) first}
+ \bgroup
+ \read16 to \exit
+ \egroup
+ \expandafter\endinput
+\fi
+
+% De onderstaande help-informatie (%I) kan worden opgeroepen
+% in TeXEdit. De daaropvolgende setup-informatie (%S) kan
+% nadat zij is uit deze file is gefilterd met TeXUtil, in
+% handleidingen worden gebruikt. In deze file opgenomen
+% documentatie (%D en %M) kan worden gebruikt voor een
+% technische handleiding. Met %T kunnen templates worden
+% gedefinieerd voor TeXEdit.
+
+%I n=Chemie
+%I c=\stelchemiein,\chemie
+%I
+%I Chemische formules kunnen worden gezet met behulp van de
+%I onderstaande commando's:
+%I
+%I buiten $ en $$ :
+%I
+%I \chemie[segmenten][symbolen]
+%I
+%I \startchemie[instellingen]
+%I \chemie...
+%I \chemie...
+%I \stopchemie
+%I
+%I en binnen $ en $$:
+%I
+%I \chemie{}{}
+%I
+%I Voor tekst, uitleg en voorbeelde verwijzen we vooralsnog
+%I naar de handleiding.
+%P
+%I Het gedrag van de macro's kan worden ingesteld met:
+%I
+%I \stelchemiein[breedte=,hoogte=,links=,rechts=,boven=,
+%I onder=,korps=,schaal=,status=,assenstelsel=,kader=,
+%I variant=,optie=,formaat=,tekstformaat=,resolutie=,
+%I offset=,letter=]
+%I
+%I Structuren kunnen worden voorgedefinieerd met het commando
+%I
+%I \definieerchemie[naam]{\chemie...}
+
+%S \startsetup
+%S \command
+%S [\!stelchemiein]
+%S \type
+%S [\c!vars!]
+%S \variable
+%S [\c!breedte]
+%S [\c!number!,\v!passend]
+%S [0]
+%S \variable
+%S [\c!hoogte]
+%S [\c!number!,\v!passend]
+%S [0]
+%S \variable
+%S [\c!links]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!rechts]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!boven]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!onder]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!resolutie]
+%S [\c!number!]
+%S [\outputresolution]
+%S \variable
+%S [\c!korps]
+%S [10pt,11pt,12pt]
+%S [\bodyfontsize]
+%S \variable
+%S [\c!schaal]
+%S [\v!klein,\v!middel,\v!groot]
+%S [\v!middel]
+%S \variable
+%S [\c!formaat]
+%S [\v!klein,\v!middel,\v!groot]
+%S [\v!groot]
+%S \variable
+%S [\c!tekstformaat]
+%S [\v!klein,\v!middel,\v!groot]
+%S [\v!groot]
+%S \variable
+%S [\c!status]
+%S [\v!start,\v!stop]
+%S [\v!start]
+%S \variable
+%S [\c!kader]
+%S [\v!aan,\v!uit]
+%S [\v!uit]
+%S \variable
+%S [\c!assenstelsel]
+%S [\v!aan,\v!uit]
+%S [\v!uit]
+%S \variable
+%S [\c!optie]
+%S [\v!test]
+%S []
+%S \variable
+%S [\c!variant]
+%S [1,2]
+%S [1]
+%S \variable
+%S [\c!offset]
+%S [HIGH,LOW]
+%S [LOW]
+%S \variable
+%S [\c!letter]
+%S [\c!command!]
+%S [\rm]
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [\v!startchemie]
+%S \type
+%S [\c!vars!\c!stp!]
+%S \inheritvariable
+%S [\v!stelchemiein]
+%S []
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [\v!chemie]
+%S \type
+%S [\c!vals!\c!vals!]
+%S \value
+%S [\c!list!]
+%S []
+%S \value
+%S [\c!list!]
+%S []
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [definieerchemie]
+%S \type
+%S [\c!val!\c!arg!]
+%S \value
+%S [\c!text!]
+%S []
+%S \stopsetup
+
+\unprotect
+
+% Om te voorkomen dat sub- en superscripts botsen passen we
+% wat fontdimen's aan (Knuth, The TeXBook, p179). Helaas
+% kunnen deze instellingen niet lokaal worden gehouden door
+% groeperen, vandaar dat een en ander moet worden geset n
+% gereset.
+%
+% Er dient een relatie te worden gelegd met de afmetingen
+% van de letters. In een eerdere versie werden daartoe de
+% \fontdimen's opgehoogd. Omdat dit problemen gaf bij
+% scaled fonts, is bij nader inzien gekozen voor de
+% onderstaande oplossing, waarbij de nieuwe waarden worden
+% afgeleid van de x-height (\fontexheight). De factor 0.70
+% is min of meer experimenteel vastgesteld. Soms worden de
+% regels iets verder uit elkaar gezet. Jammer. Italic fonts
+% hebben grotere cijfers en vallen min of meer uit de boot.
+
+\newif\ifloweredsubscripts
+
+% Due to some upward incompatibality of LaTeX to LaTeX2.09
+% and/or LaTeX2e we had to force \@@dochemicalstyle. Otherwise
+% some weird \nullfont error comes up.
+
+\def\beginlatexmathmodehack
+ {\ifmmode
+ \let\endlatexmathmodehack=\relax
+ \else
+ \def\endlatexmathmodehack{$}$\@@dochemicalstyle\empty
+ \fi}
+
+\def\setsubscripts%
+ {\beginlatexmathmodehack
+ \def\dosetsubscript##1##2##3%
+ {\dimen0=##3\fontexheight##2%
+ \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
+ ##1##2=\dimen0\relax}%
+ \def\dodosetsubscript##1##2%
+ {\dosetsubscript{##1}{\textfont 2}{##2}%
+ \dosetsubscript{##1}{\scriptfont 2}{##2}%
+ \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
+ %dodosetsubscript\mathsupnormal {?}%
+ \dodosetsubscript\mathsubnormal {.7}%
+ \dodosetsubscript\mathsubcombined{.7}%
+ \global\loweredsubscriptstrue
+ \endlatexmathmodehack}
+
+\def\resetsubscripts
+ {\ifloweredsubscripts
+ \beginlatexmathmodehack
+ \def\doresetsubscript##1##2%
+ {\dimen0=\getvalue{@@\string##1\string##2}\relax
+ ##1##2=\dimen0}%
+ \def\dodoresetsubscript##1%
+ {\doresetsubscript{##1}{\textfont2}%
+ \doresetsubscript{##1}{\scriptfont2}%
+ \doresetsubscript{##1}{\scriptscriptfont2}}%
+ %dodoresetsubscript\mathsupnormal
+ \dodoresetsubscript\mathsubnormal
+ \dodoresetsubscript\mathsubcombined
+ \global\loweredsubscriptsfalse
+ \endlatexmathmodehack
+ \fi}
+
+\ifx\Umathchar\undefined \else
+ % for the moment we nil them, soon we will have a proper
+ % way to deal with this
+ \let\setsubscripts \relax
+ \let\resetsubscripts\relax
+\fi
+
+\def\doresetsubscripts
+ {\resetsubscripts}
+
+\def\sethighsubscripts
+ {\resetsubscripts
+ \let\dosetsubscripts=\relax}
+
+\def\setlowsubscripts
+ {\def\dosetsubscripts{\setsubscripts}}
+
+\setlowsubscripts
+
+\newcount\horchemical % t.z.t. \newcounter
+\newcount\verchemical % t.z.t. \newcounter
+\newcount\txtchemical % t.z.t. \newcounter
+\newcount\levchemical % t.z.t. \newcounter
+
+\newif\ifinchemical \inchemicalfalse
+\newif\iffixedchemical \fixedchemicalfalse
+
+\newbox\chemicalsymbols
+
+% Eigenlijk moeten de constanten en variabelen in cont-nl.tex
+% staan. Dit pakket is echter relatief onafhankelijk van CONTEXT.
+
+\definesystemvariable {chemical}
+
+\definesystemconstant {chemical}
+
+\definesystemconstant {translate}
+\definesystemconstant {distance}
+\definesystemconstant {mirror}
+\definesystemconstant {rotate}
+\definesystemconstant {substitute}
+\definesystemconstant {angle}
+
+\definesystemconstant {executechemical}
+\definesystemconstant {chemicaltextelement}
+\definesystemconstant {chemicallinesegment}
+\definesystemconstant {chemicalcircsegment}
+
+\def\chemicalspace {\quad}
+
+% begin van experiment:
+%
+% De onderstaande twee macro's kunnen worden gebruikt voor
+% bijvoorbeeld een interactiemechanisme.
+%
+% \localgotochemical {verwijzing} {tekst}
+% \localthisischemical {verwijzing}
+
+\def\dowithchemical%
+ {}
+
+\doifdefinedelse{@@iastate}
+ {\def\localgotochemical#1#2{\naarbox{#2}[#1]}%
+ \def\localthisischemical#1{\pagereference[#1]}}
+ {\def\localgotochemical#1{}%
+ \def\localthisischemical#1{}}
+
+% eind van experiment
+
+\def\setchemicalmaximum #1
+ {\def\maxchemical{#1}}
+
+\def\doifchemicalnumber#1#2#3%
+ {\doifnumberelse{#1}
+ {\ifnum#1>\maxchemical\relax
+ \writestatus{ppchtex}{number #1 is skipped}%
+ \else
+ #3%
+ \fi}
+ {\unknownchemical{#2}}}%
+
+\newif\ifsmallchemicaltext
+
+\let\@@localchemicalstyle\empty
+
+\def\setupchemicalformat[#1]%
+ {\processaction
+ [\getvalue{#1\c!size}]
+ [ \v!small=>\def\@@localchemicalformat{\scriptscriptstyle},
+ \v!medium=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
+ \v!big=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
+ \s!unknown=>\def\@@localchemicalformat{\getvalue{#1\c!size}}]%
+ \processaction
+ [\getvalue{#1\c!textsize}]
+ [ \v!small=>\def\@@localchemicalstyle{\scriptscriptstyle},
+ \v!medium=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
+ \v!big=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
+ \s!unknown=>\def\@@localchemicalstyle{\getvalue{#1\c!textsize}}]%
+ \processaction
+ [\getvalue{#1\c!scale}]
+ [ \v!small=>\def\@@localchemicalscale{500},
+ \v!medium=>\def\@@localchemicalscale{625},
+ \v!big=>\def\@@localchemicalscale{750},
+ \s!unknown=>\def\@@localchemicalscale{\getvalue{#1\c!scale}}]}
+
+\def\@@currentchemicalformat
+ {\ifinchemical
+ \@@localchemicalformat
+ \else
+ \@@localchemicalstyle
+ \fi}
+
+\def\dosetupchemical[#1]%
+ {\getparameters[\??chemical\s!chemical][#1]%
+ \doifelse{\@@chemicalchemicaloffset}{LOW}
+ {\setlowsubscripts}
+ {\sethighsubscripts}%
+ \setupchemicalformat[\??chemical\s!chemical]%
+ \ignorespaces}
+
+\def\setupchemical
+ {\dosingleargument\dosetupchemical}
+
+\def\@@dochemicalstyle% % default mapping
+ {\@@chemicalstyle}
+
+\def\@@dochemicalcolor% % no mapping yet
+ {}
+
+\def\@@chemicalstyle % $inner-style$ % (overloaded)
+ {\@@chemicalchemicalstyle} % $$outer-style$$
+
+\def\@@writechemicalstate#1#2%
+ {}
+
+\def\@@beginchemicallocalpicture
+ {\ifcase\chemicaldrawingmode
+ \beginpicture
+ \or
+ \pspicture(0,0)(0,0) % is this permitted ?
+ \or
+ \pushMPdrawing
+ \startMPdrawing
+ %prologues := 1 ;
+ %input mp-tool ;
+ u := 10*\@@chemicalunit;
+ bboxmargin := 0pt ;
+ pickup pencircle scaled 2u ; % ???
+ \stopMPdrawing
+ \beginpicture
+ \fi}
+
+\def\@@endchemicallocalpicture#1#2%
+ {\ifcase\chemicaldrawingmode
+ \endpicture
+ \or
+ \endpspicture
+ \or
+ \resetchemicalcoordinates
+ \setbox2\hbox{\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
+ \wd2=\!!zeropoint
+ \ht2=\!!zeropoint
+ \dp2=\!!zeropoint
+ \put {\box2} at 0 0
+ \endpicture
+ \popMPdrawing
+ \fi}
+
+\def\@@beginchemicalpicture#1#2#3#4%
+ {\ifnum\chemicaldrawingmode=1
+ \pspicture(#1,#3)(#2,#4)%
+ \def\account##1##2{}%
+ \psaxes[axesstyle=none,labels=none,ticks=none](#1,#3)(#2,#4)%
+ \else
+ \beginpicture
+ \setplotarea
+ x from {#1} to {#2},
+ y from {#3} to {#4}
+ \iffixedchemical
+ \accountingon
+ \def\account##1##2%
+ {\put {} at {##1} {##2} }%
+ \else
+ \accountingoff
+ \def\account##1##2{}%
+ \fi
+ \fi
+ \ignorespaces}
+
+\def\@@endchemicalpicture%
+ {\ifcase\chemicaldrawingmode
+ \put {\box\chemicalsymbols} at 0 0 % elders
+ \endpicture
+ \or
+ \rput(0,0){\box\chemicalsymbols}%
+ \endpspicture
+ \or
+ \put {\box\chemicalsymbols} at 0 0 % elders
+ \ifMPdrawingdone
+ \resetchemicalcoordinates
+ \setbox2\hbox{\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
+ \wd2=\!!zeropoint
+ \ht2=\!!zeropoint
+ \dp2=\!!zeropoint
+ \put {\box2} at 0 0 %
+ \fi
+ \endpicture
+ \fi}
+
+\def\@@setchemicalcoordinatesystem#1%
+ {\edef\@@chemicalunit{#1}%
+ \ifcase\chemicaldrawingmode
+ \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit> %
+ \or
+ \psset{unit=\@@chemicalunit}%
+ \or
+ \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit> %
+ \startMPdrawing
+ %input mp-tool ;
+ %prologues := 1 ;
+ u := 10*#1;
+ bboxmargin := 0pt ;
+ pickup pencircle scaled 2u ; % ???
+ \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
+ bottom shiftedto y=0
+ ticks from {#1} to {#2} by 500 /
+ \axis
+ left shiftedto x=0
+ ticks from {#3} to {#4} by 500 / %
+ \or
+ \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;
+ draw z1--(x2,y1)--z2--(x1,y2)--cycle ;
+ d := 50u ; dd := 10u ;
+ draw (x1,0)--(x2,0) ;
+ draw (0,y1)--(0,y2) ;
+ for i=d step -d until x1: draw (i,dd)--(i,-dd) ; endfor ;
+ for i=d step d until x2: draw (i,dd)--(i,-dd) ; endfor ;
+ for i=d step -d until y1: draw (-dd,i)--(dd,i) ; endfor ;
+ for i=d step d until y2: draw (-dd,i)--(dd,i) ; endfor ;
+ \stopMPdrawing
+ \fi}
+
+\def\@@setsecondchemicalplotsymbol%
+ {\ifcase\chemicaldrawingmode
+ \!!widtha=50.8mm
+ \divide\!!widtha by \@@chemicalresolution\relax
+ \plotsymbolspacing=\!!widtha
+ \setplotsymbol({\vrule\!!height\!!widtha\!!width\!!widtha})%
+ \fi}
+
+% Something for Dirk:
+
+\newcount \currentchemical
+
+%\newif \ifskipchemical
+
+\def\setchemicaldimensions#1#2#3%
+ {\bgroup
+ \global\advance\currentchemical by 1
+ \dimen0=#1\relax
+ \dimen2=#2\relax
+ \dimen4=#3\relax
+ \setxvalue{chemical::\the\currentchemical}%
+ {\noexpand\docommand{\the\dimen0}{\the\dimen2}{\the\dimen4}}%
+ \egroup}
+
+%\def\getchemicaldimensions#1#2#3%
+% {\global\advance\currentchemical by 1
+% \def\docommand##1##2##3%
+% {#1=##1\relax#2=##2\relax#3=##3\relax}%
+% \doifdefinedelse{chemical::\the\currentchemical}
+% {\getvalue{chemical::\the\currentchemical}}
+% {\docommand{6cm}{4cm}{0cm}}}
+%
+%\def\savechemicaldimensions%
+% {\bgroup
+% \writestatus{ppchtex}{saving dimensions in ppchtex.dim}%
+% \def\docommand##1##2##3%
+% {\immediate\write\scratchwrite
+% {\noexpand\setchemicaldimensions{##1}{##2}{##3}}}%
+% \immediate\openout\scratchwrite=ppchtex.dim
+% \scratchcounter=0
+% \loop
+% \ifnum\scratchcounter<\currentchemical
+% \advance\scratchcounter by 1
+% \getvalue{chemical::\the\scratchcounter}%
+% \repeat
+% \immediate\closeout\scratchwrite
+% \egroup}
+%
+%\def\loadchemicaldimensions% oh, how nice it would be to use
+% {\bgroup % one of the context read commands
+% \global\currentchemical=0
+% \immediate\openin\scratchread=./ppchtex.dim
+% \ifeof\scratchread
+% \immediate\closein\scratchread
+% \global\skipchemicalfalse
+% \else
+% \immediate\closein\scratchread
+% \input ./ppchtex.dim\relax
+% \ifnum\currentchemical>0
+% \writestatus{ppchtex}{loading dimensions from ppchtex.dim}%
+% \global\skipchemicaltrue
+% \else
+% \global\skipchemicalfalse
+% \fi
+% \global\currentchemical=0
+% \global\let\savechemicaldimensions=\relax
+% \fi
+% \egroup
+% \global\let\loadchemicaldimensions=\relax}
+
+\ifx\normalchemicalframe\undefined
+ \let\normalchemicalframe\hbox % hook for educational purposes
+\fi
+
+\unexpanded\def\complexstartchemical[#1]%
+ {\copyparameters
+ [\??chemical][\??chemical\s!chemical]
+ [\c!width,\c!height,\c!left,\c!right,\c!top,\c!bottom,
+ \c!bodyfont,\c!size,\c!scale,\c!state,\c!frame,\c!axis,\c!factor,
+ \c!location,\c!option,\c!alternative,\c!resolution,\c!offset,\c!style,
+ \c!color,\c!rulecolor,\c!rulethickness]%
+ \getparameters
+ [\??chemical]
+ [#1]%
+ %
+ \setupchemicalformat[\??chemical]%
+ %
+ \ifnum\chemicaldrawingmode=2
+ \resetMPdrawing
+ \fi
+ %
+ \doif{\@@chemicalalternative}{2}
+ {\@@setsecondchemicalplotsymbol}%
+ %
+ \doif{\@@chemicalaxis}\v!on
+ {\let\chemicalframe\hbox}%
+ %
+ \!!counta=250000
+ \divide\!!counta by \@@localchemicalscale
+ \!!widtha=\@@chemicalbodyfont
+ \divide\!!widtha by \!!counta
+ \@@setchemicalcoordinatesystem{\the\!!widtha}%
+ %
+ % \!!counta = -x \!!countc = -y
+ % \!!countb = +x \!!countd = +y
+ %
+ \def\calculateaxis##1##2##3##4##5%
+ {##1=##3\relax
+ ##2=##4\relax
+ \ifnum##5=0
+ \ifnum##3=0
+ \ifnum##4=0
+ ##1=2000
+ ##2=2000
+ \fi
+ \fi
+ \else
+ \ifnum##3=0
+ \ifnum##4=0
+ ##1=##5\relax
+ \divide##1 by 2
+ ##2=##1\relax
+ \else
+ ##1=##5\relax
+ \advance##1 by -##2\relax
+ \fi
+ \else
+ \ifnum##4=0
+ ##2=##5\relax
+ \advance##2 by -##1\relax
+ \fi
+ \fi
+ \fi}%
+ \fixedchemicalfalse
+ \doif\@@chemicalwidth\v!fit
+ {\edef\@@chemicalwidth
+ {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}%
+ \fixedchemicaltrue}%
+ \doif\@@chemicalheight\v!fit
+ {\edef\@@chemicalheight
+ {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}%
+ \fixedchemicaltrue}%
+ \doifelse\@@chemicallocation\v!intext
+ {\!!counta=0 \!!countb=0
+ \!!counta=0 \!!countd=0 }
+ {\calculateaxis
+ \!!counta\!!countb
+ \@@chemicalleft\@@chemicalright\@@chemicalwidth
+ \calculateaxis
+ \!!countc\!!countd
+ \@@chemicalbottom\@@chemicaltop\@@chemicalheight}%
+ %
+ \edef\@@chemheight {\the\!!countc}%
+ \edef\@@chemdepth {\the\!!countd}%
+ \edef\@@chemicaltop {\the\!!countc}%
+ \edef\@@chemicalbottom{\the\!!countd}%
+ %
+ \doifinsetelse\v!on{\@@chemicalframe,\@@chemicalaxis}
+ {\def\@@chemicalborder{\chemicalframe}}
+ {\def\@@chemicalborder{\normalchemicalframe}}%
+ %
+ \setbox0=\hbox\bgroup % this was a \vbox which took \hsize
+ %
+ \@@beginchemicalpicture
+ {-\the\!!counta}{\the\!!countb}
+ {-\the\!!countc}{\the\!!countd}%
+ \doif{\@@chemicalstate}\v!start
+ {\doif\@@chemicalaxis\v!on
+ {\@@setchemicalaxis
+ {-\the\!!counta}{\the\!!countb}
+ {-\the\!!countc}{\the\!!countd}}}%
+ \doifelse\@@chemicaloption\v!test
+ {\def\@@writechemicalstate##1##2%
+ {\convertargument##2\to\ascii
+ \writestatus{##1}{\ascii}}}
+ {\def\@@writechemicalstate##1##2{}}%
+ \ignorespaces}
+
+\def\dostartchemical%
+ {\catcode`\^=\@@superscript% t.b.v. \enableduplication
+ \catcode`\_=\@@subscript % t.b.v. de zekerheid
+ \begingroup
+ \inchemicaltrue
+ \def\toptext##1{\gdef\thetoptext{##1}\ignorespaces}\toptext{}%
+ \def\bottext##1{\gdef\thebottext{##1}\ignorespaces}\bottext{}%
+ \def\midtext##1{\gdef\themidtext{##1}\ignorespaces}\midtext{}%
+ \def\@@chemicalpostponed{}%
+ \complexorsimpleempty\startchemical}
+
+\def\startchemical
+ {\bgroup % t.b.v. ungrouped floats
+% \loadchemicaldimensions
+% \ifskipchemical
+% \def\dostartchemical%
+% {\def\dummy[####1]{}\dosingleempty\dummy}%
+% \def\chemical%
+% {\def\dummy[####1][####2][####3]{}\dotripleempty\dummy}%
+% \def\toptext##1{}%
+% \def\midtext##1{}%
+% \def\bottext##1{}%
+% \fi
+ \dostartchemical}
+
+\def\stopchemical
+ {%\ifskipchemical
+ % \getchemicaldimensions{\dimen0}{\dimen2}{\dimen4}%
+ % \dimen8=\dimen2\advance\dimen8 by \dimen4
+ % \setbox0=\vbox to \dimen8
+ % {\vss\hbox to \dimen0{\hss\the\currentchemical\hss}\vss}%
+ % \wd0=\dimen0\ht0=\dimen2\dp0=\dimen4
+ % \chemicalframe{\box0}%
+ %\else
+ \checkchemicalpicture
+ \@@endchemicalpicture
+ \egroup
+ \ifnum\chemicaldrawingmode=1
+ \dimen0=\@@chemicalunit
+ \setbox0=\hbox{\lower\@@chemdepth\dimen0\box0}%
+ \ht0=\@@chemheight\dimen0
+ \dp0=\@@chemdepth\dimen0
+ \fi
+ \dimen0=\ht0
+ \advance\dimen0 by \dp0
+ \inchemicalfalse % enables \chemie{} in text
+ \setbox4=\alignedchemical\themidtext
+ \setbox6=\alignedchemical\thetoptext
+ \setbox8=\alignedchemical\thebottext
+ \setbox4=\hbox to \wd0
+ {\strut\hss$\vcenter{\box4}$\hss}%
+ \setbox2=\vbox to \dimen0
+ {\hbox to \wd0{\strut\hss\box6\hss}
+ \vfill
+ \hbox to \wd0{\strut\hss\box8\hss}
+ \vss}% disables the depth
+ \wd0=0pt \wd4=0pt
+ \ht2=\ht0 \dp2=\dp0
+ \ht4=\ht0 \dp4=\dp0
+ %\setchemicaldimensions{\wd2}{\ht2}{\dp2}%
+ \@@chemicalborder{\box0\box4\box2}% text on top of chemicals
+ \endgroup
+ %\fi
+ \ignorespaces
+ \egroup} % t.b.v. ungrouped floats
+
+\def\alignedchemical#1%
+ {\vtop
+ {\def\par{\egroup\hbox\bgroup\strut}%
+ \let\\=\par
+ \let\endgraf=\par
+ \hbox\bgroup\strut#1\egroup}}
+
+% \setchemicalcoordinates{#1}{#2}
+%
+% #1: verplaatsing in x-richting
+% #2: verplaatsing in y-richting
+
+\newif\ifchemicaldirection
+
+\def\checkchemicaldirection#1#2%
+ {\ifchemicaldirection
+ \ifnum#1>0 \advance\horchemical -\chemicaldirection \fi
+ \ifnum#1<0 \advance\horchemical +\chemicaldirection \fi
+ \ifnum#2>0 \advance\verchemical -\chemicaldirection \fi
+ \ifnum#2<0 \advance\verchemical +\chemicaldirection \fi
+ \chemicaldirectionfalse
+ \fi}
+
+\def\processchemicaldirection%
+ {\chemicaldirectiontrue\processchemicaltranslate}
+
+\def\setchemicalcoordinates#1#2%
+ {\advance\horchemical #1\relax
+ \advance\verchemical #2\relax
+ \checkchemicaldirection{#1}{#2}%
+ \!!counta=-\horchemical\edef\chemicalxoffset{\the\!!counta}%
+ \!!countb=-\verchemical\edef\chemicalyoffset{\the\!!countb}%
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
+ \fi}
+
+\def\resetchemicalcoordinates
+ {\horchemical=0
+ \verchemical=0
+ \edef\chemicalxoffset{0}%
+ \edef\chemicalyoffset{0}%
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \setcoordinatesystem point at 0 0
+ \fi}
+
+\def\restorechemicalcoordinates
+ {%\writestatus{ppchtex}{restoring \the\horchemical,\the\verchemical}%
+ \edef\chemicalxoffset{\the\horchemical}%
+ \edef\chemicalyoffset{\the\verchemical}%
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
+ \fi}
+
+\def\setchemicaltranslate #1 #2 #3
+ {\setvalue{\s!translate#1}{\setchemicalcoordinates{#2}{#3}}}
+
+\def\processchemicaltranslate#1%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{MOV#1}
+ {\ifnum##1=0
+ \def\chemicaloffset{0}% incompatible change
+ \resetchemicalcoordinates
+ \else
+ \getvalue{\s!translate##1}%
+ \dochemicaloffset{##1}%
+ \def\chemicaloffset{0}%
+ \fi}}%
+ \doprocess[#1]}
+
+\def\setchemicaldistance #1
+ {\setvalue{\s!distance1}{\setchemicalcoordinates{-#1}{ 0}}%
+ \setvalue{\s!distance2}{\setchemicalcoordinates{ 0}{ #1}}%
+ \setvalue{\s!distance3}{\setchemicalcoordinates{ #1}{ 0}}%
+ \setvalue{\s!distance4}{\setchemicalcoordinates{ 0}{-#1}}}
+
+\def\setchemicaldirection #1
+ {\def\chemicaldirection{#1}}
+
+\def\processchemicaldistance#1%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{ADJ#1}
+ {\ifnum##1=0
+ \resetchemicalcoordinates
+ \else
+ \def\@@chemicalpostponed{\getvalue{\s!distance##1}}%
+ \@@chemicalpostponed
+ \fi}}%
+ \doprocess[#1]}
+
+\def\setchemicalsubstitute #1
+ {\setvalue{\s!substitute1}{\setchemicalcoordinates{-#1}{ 0}}%
+ \setvalue{\s!substitute2}{\setchemicalcoordinates{ 0}{ #1}}%
+ \setvalue{\s!substitute3}{\setchemicalcoordinates{ #1}{ 0}}%
+ \setvalue{\s!substitute4}{\setchemicalcoordinates{ 0}{-#1}}}
+
+\def\processchemicalsubstitute#1%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{SUB#1}
+ {\ifnum##1=0
+ \resetchemicalcoordinates
+ \else
+ \def\@@chemicalpostponed{\getvalue{\s!substitute##1}}%
+ \@@chemicalpostponed
+ \fi}}%
+ \doprocess[#1]}
+
+% Het is mogelijk een offset of move meerdere malen uit te
+% voeren, door een nummer voor het commando te plaatsen.
+
+\def\chemicalrepeat {1}
+
+\def\redoprocesschemical[#1#2]%
+ {\doifinstringelse{#1}{0123456789.}
+ {\edef\chemicalrepeat{\chemicalrepeat#1}%
+ \redoprocesschemical[#2]}
+ {\processchemical[#1#2]%
+ \def\chemicalrepeat{1}}}
+
+\def\doprocesschemical[#1#2]#3%
+ {\doifinstringelse{#1}{0123456789.}
+ {\def\chemicalrepeat{#1}%
+ \redoprocesschemical[#2]}
+ {#3}}
+
+% \dochemicaloffset{#1}
+%
+% #1: binding
+
+\def\chemicaloffset{0}
+
+\def\processchemicaloffset#1%
+ {\dimen0=62500 sp % real calc on cardinals, funny number
+ \dimen0=\chemicalrepeat\dimen0
+ \divide\dimen0 by \@@localchemicalscale
+ \!!counta=\dimen0
+ \def\doprocess[##1##2]%
+ {\doifinstringelse{##1}{128}
+ {\edef\chemicaloffset{\the\!!counta}}
+ {\doifinstringelse{##1}{456}
+ {\edef\chemicaloffset{-\the\!!counta}}
+ {\doifelse{##1}{0}
+ {\edef\chemicaloffset{0}}
+ {\unknownchemical{OFF#1}}}}}%
+ \doprocess[#1]}
+
+\def\dochemicaloffset#1%
+ {\ifnum\chemicaloffset=0
+ \def\undochemicaloffset{}%
+ \else
+ \setchemicalcoordinates{-\chemicaloffset}{0}%
+ \def\undochemicaloffset%
+ {\setchemicalcoordinates{\chemicaloffset}{0}%
+ \def\undochemicaloffset{}}%
+ \fi}
+
+\def\processchemicalphantom#1#2%
+ {\setbox0=\hbox
+ {\def\splitoff##1????{##1}%
+ $\@@dochemicalstyle{\@@localchemicalformat\splitoff#2}$}%
+ \dimen0=.25\wd0
+ \divide\dimen0 by \@@localchemicalscale
+ \!!counta=\dimen0
+ \doifinstringelse{#1}{128}
+ {\edef\chemicaloffset{\the\!!counta}}
+ {\doifinstringelse{#1}{456}
+ {\edef\chemicaloffset{-\the\!!counta}}
+ {\doifelse{#1}{0}
+ {\edef\chemicaloffset{0}}
+ {\unknownchemical{OF#1:#2}}}}}
+
+% \dosetchemicalrotation{#1}{#2}
+%
+% #1: cos(phi)
+% #2: sin(phi)
+
+\def\chemicalrotation {1}
+\def\chemicalangle {0}
+\def\chemicalxoffset {0}
+\def\chemicalyoffset {0}
+
+\def\setchemicalmirror#1%
+ {\setvalue{\s!mirror#1}{*}}
+
+\def\resetchemicalmirror#1%
+ {\resetvalue{\s!mirror#1}}
+
+\def\togglechemicalmirror#1%
+ {\doifelse{\getvalue{\s!mirror#1}}{*}
+ {\resetchemicalmirror{#1}}
+ {\setchemicalmirror{#1}}}
+
+\def\setchemicalrotation #1 #2 #3 #4 #5 #6 #7 #8 #9
+ {\setvalue{\s!rotate1.#1}{\dosetchemicalrotation{#2}{#3}}%
+ \setvalue{\s!rotate2.#1}{\dosetchemicalrotation{#4}{#5}}%
+ \setvalue{\s!rotate3.#1}{\dosetchemicalrotation{#6}{#7}}%
+ \setvalue{\s!rotate4.#1}{\dosetchemicalrotation{#8}{#9}}}
+
+\def\setchemicalangle #1 #2 #3 #4 #5
+ {\setvalue{\s!angle1.#1}{\dosetchemicalangle{#2}}%
+ \setvalue{\s!angle2.#1}{\dosetchemicalangle{#3}}%
+ \setvalue{\s!angle3.#1}{\dosetchemicalangle{#4}}%
+ \setvalue{\s!angle4.#1}{\dosetchemicalangle{#5}}}
+
+\def\chemicalrotate[#1]%
+ {\doifdefinedelse{\s!mirror#1}
+ {\getvalue{\s!rotate\chemicalrotation.#1\getvalue{\s!mirror#1}}%
+ \getvalue{\s!angle\chemicalrotation.#1\getvalue{\s!mirror#1}}}
+ {\getvalue{\s!rotate\chemicalrotation.#1}%
+ \getvalue{\s!angle\chemicalrotation.#1}}}
+
+\def\dosetchemicalangle#1% zwak zie onder
+ {\def\chemicalangle{#1}}
+
+\def\dosetchemicalrotation#1#2%
+ {\ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \startrotation by {#1} {#2} %% \stoprotation (t.b.v. testen)
+ \fi}
+
+\def\doresetchemicalrotation
+ {\ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \stoprotation
+ \fi}
+
+\def\processchemicalrotation#1%
+ {\def\doprocess[##1##2]%
+ {\doifnumberelse{##1}
+ {\def\chemicalrotation{##1}}
+ {\unknownchemical{ROT#1}}}%
+ \doprocess[#1]}
+
+% \filtertextelement[#1][#2][#3][#4]
+%
+% #1: volgnummer
+% #2: offset in uitlijningen
+% #3: lijst met uitlijningen -> \chemicalloca
+% #4: lijst met teksten -> \chemicaltext
+
+\def\setchemicallocation#1%
+ {\doifelse{#1}{}
+ {\edef\chemicalloca{c}}
+ {\edef\chemicalloca{#1}}}
+
+\newif\iffixedchemicaltext
+
+\def\filterchemicaltextelement[#1][#2][#3][#4]%
+ {\ifchemicaltextconstant
+ \def\chemicaltext{#4}%
+ \setchemicallocation{}%
+ \else
+ \ifnum#1=0\relax
+ \setchemicallocation{}%
+ \else
+ \iffixedchemicaltext
+ \!!counta#2
+ \else
+ \!!counta=\chemicalrotation
+ \advance\!!counta -1
+ \multiply\!!counta #2
+ \advance\!!counta #1
+ \fi
+ \getfromcommalist[#3][\the\!!counta]%
+ \setchemicallocation\commalistelement
+ \fi
+ \ifchemicalpicture
+ \let\chemicaltext\relax
+ \else
+ \advance\txtchemical 1
+ \getfromcommalist[#4][\txtchemical]%
+ \let\chemicaltext\commalistelement
+ \fi
+ \fi
+ \fixedchemicaltextfalse}
+
+% \putchemicaltext{#1}{#2}
+%
+% #1 : x-coordinaat
+% #2 : y-coordinaat
+%
+% \chemicaltext en \chemicalloca worden met \gettextelement
+% opgehaald uit de tweede set bij \chemie
+%
+% Ten behoeve van testdoeleinden wordt gebruik gemaakt van
+% \chemicalframe in plaats van het meer sjieke, maar tevens
+% meer trage \framed.
+
+\ifx\ruledhbox\undefined
+ \def\chemicalframe#1%
+ {\hbox
+ {\vrule\hskip-.4pt
+ \vbox{\hrule\vskip-.4pt\hbox{#1}\vskip-.4pt\hrule}%
+ \hskip-.4pt\vrule}}
+\else
+ \def\chemicalframe#1%
+ {\ruledhbox{#1}}
+\fi
+
+\def\doputchemicaltext#1 [#2] at #3 #4 %
+ {\ifnum\chemicaldrawingmode=1
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[#2]{\chemicalangle}(#3,#4){#1}}}%
+ \else
+ \put {#1} [#2] at {#3} {#4} %
+ \fi}
+
+\def\dodoifsinglelocation#1#2\\#3%
+ {\ifx#2\relax#3\fi}
+
+\def\doifsinglelocationelse#1%
+ {\expandafter\dodoifsinglelocationelse#1\relax\\}
+
+\def\putchemicaltext#1#2%
+ {\enablechemicalspecials
+ \ifchemicalpicture
+ \setchemicalpicture{#1}{#2}%
+ \else
+ \doifelse\@@chemicaloption\v!test
+ {\def\@@chemicalframe{\chemicalframe}}
+ {\def\@@chemicalframe{}}%
+ \dosetsubscripts
+ \setbox2=\hbox{\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@localchemicalformat \chemicaltext}$}%
+ \setbox4=\hbox{$\@@dochemicalstyle{\@@localchemicalformat C_2^2}$}%
+ \setbox6=\hbox{$\@@dochemicalstyle{\@@localchemicalformat O}$}% or C
+ \doresetsubscripts
+ \doifnot\@@chemicallocation\v!intext
+ {\ht2=\ht4
+ \dp2=\dp4}%
+ \setbox2=\hbox{\@@chemicalframe{\box2}}%
+ \ifdim\wd2>\wd6
+ \doifelse{#1}{0}
+ {\doifnot{#2}{0}{\wd2=\wd6}}
+ {%\doifsinglelocation\chemicalloca
+ {\doifinset{\chemicalloca}{t,b}{\wd2=\wd6}}}% common ?
+ \fi
+ \expanded
+ {\doputchemicaltext
+ {\noexpand\dowithchemical{\copy2}} % per se \copy2 i.p.v. \box2
+ [\chemicalloca] at {#1} {#2} }
+ \nomoreaccounting
+ \fi
+ \disablechemicalspecials}
+
+\def\setchemicaltextelement #1 #2 #3
+ {\setvalue{\s!chemicaltextelement#1}{\putchemicaltext{#2}{#3}}}
+
+\def\getchemicalfixedtextelement%
+ {\fixedchemicaltexttrue
+ \getchemicaltextelement}
+
+\def\getchemicaltextelement[#1][#2][#3][#4][#5]%
+ {\filterchemicaltextelement[#2][#3][#4][#5]%
+ \doifelse{#2}{0}
+ {\dochemicaloffset{#2}% % incompatible change
+ \putchemicaltext{0}{0}%
+ \undochemicaloffset} % incompatible change
+ {\chemicalrotate[#2]%
+ \dochemicaloffset{#2}%
+ \def\chemicaltextelementnumber{#2}%
+ \getvalue{\s!chemicaltextelement#1}%
+ \getvalue{\s!chemicaltextelement#11}%
+ \getvalue{\s!chemicaltextelement#12}%
+ \getvalue{\s!chemicaltextelement#13}%
+ \undochemicaloffset}}
+
+\def\processchemicaltextelement#1#2#3#4#5%
+ {\def\doprocess[##1##2##3##4##5]%
+ {\doifelse{##1}{?}
+ {\doprocess[1..\maxchemical ????]}
+ {\doifchemicalnumber{##1}{#1#2}
+ {\doifelse{##2##3}{..}
+ {\doifchemicalnumber{##4}{#1#2}
+ {\getchemicaltextelement[#1][##1][#4][#5][#3]%
+ \doifnot{##1}{##4}
+ {\!!counta=##1\relax
+ \advance\!!counta by 1
+ \edef\nextsegment{\the\!!counta}%
+ \doprocess[\nextsegment..##4##5]}}}
+ {\getchemicaltextelement[#1][##1][#4][#5][#3]%
+ \doifnot{##2}{?}{\doprocess[##2##3##4##5]}}}}}%
+ \doprocess[#2]%
+ \smallchemicaltextfalse}
+
+\def\processchemicalsmalltextelement%
+ {\smallchemicaltexttrue\processchemicaltextelement}
+
+\def\processchemicalsmalltextconstant%
+ {\smallchemicaltexttrue\processchemicaltextconstant}
+
+\def\processchemicalunrotatedtextelement#1#2#3#4#5#6%
+ {\bgroup
+ \xdef\@@xxx{0}%
+ \xdef\@@yyy{0}%
+ \def\putchemicaltext##1##2%
+ {\xdef\@@xxx{##1}%
+ \xdef\@@yyy{##2}}%
+ \getvalue{\s!chemicaltextelement#1}%
+ \egroup
+ \bgroup
+ \def\doputchemicaltext##1 [##2] at ##3 ##4 %
+ {\ifnum\chemicaldrawingmode=1
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\rput{\chemicalangle}(\@@xxx,\@@yyy){\expanded{\rput[##2](##3,##4){##1}}}}%
+ \else
+ \put
+ {\stoprotation \setcoordinatesystem point at 0 0
+ \expanded{\put {##1} [##2] at {##3} {##4} }}
+ at {\@@xxx} {\@@yyy}
+ \fi}%
+ \processchemicaltextelement{#2}{#3}{#4}{#5}{#6}%
+ \egroup}
+
+\newif\ifchemicaltextconstant
+
+\def\processchemicaltextconstant#1#2#3#4%
+ {\chemicaltextconstanttrue
+ \let\@@oldchemicalframe\@@chemicalframe
+ \let\@@chemicalframe\relax
+ \processchemicaltextelement{#1}{#2}{#3}{#4}{}%
+ \let\@@chemicalframe\@@oldchemicalframe
+ \chemicaltextconstantfalse}
+
+% \plotchemicalline{#1}{#2}{#3}{#4}
+%
+% #1: x-coordinaat beginpunt
+% #2: y-coordinaat beginpunt
+% #3: x-coordinaat eindpunt
+% #4: y-coordinaat eindpunt
+
+\chardef\chemicallinetype=0
+
+\def\doplotchemicalline
+ {\!!counte=\!!countc \advance\!!counte by -\!!counta
+ \!!countf=\!!countd \advance\!!countf by -\!!countb
+ \bgroup
+ \ifcase\chemicaldrawingmode
+ \ifcase\chemicallinetype
+ % 0 : normal line
+ \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /%
+ \or
+ % 1 : normal arrow
+ \arrow <5pt> [.2,.67] from {\!!counta} {\!!countb} to {\!!countc} {\!!countd}
+ \or
+ % 2 : reverse arrow
+ \arrow <5pt> [.2,.67] from {\!!countc} {\!!countd} to {\!!counta} {\!!countb}
+ \or
+ % 3 : unrotated line
+ \put {\stoprotation \setcoordinatesystem point at 0 0
+ \plot 0 0 {\!!counte} {\!!countf} /}
+ [\chemicallineposition] at {\!!counta} {\!!countb}
+ \else
+ % 4 : dashed line
+ \findlength {\plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /}%
+ \setdashesnear <2pt> for <\totalarclength>%
+ \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /%
+ \fi
+ \or
+ \ifcase\chemicallinetype
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \or
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline{->}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \or
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline{<-}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \or
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[\chemicallineposition]{-\chemicalangle}%
+ (\!!counta,\!!countb){\psline(0,0)(\!!counte,\!!countf)}}}%
+ \else
+ \psset{linestyle=dashed}%
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \fi
+ \or
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ x3 := \MPdivten[\the\!!counte]u ;
+ y3 := \MPdivten[\the\!!countf]u ;
+ \ifcase\chemicallinetype
+ % 0 : normal line
+ draw ((z1--z2) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \or
+ % 1 : normal arrow
+ drawarrow ((z1--z2) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \or
+ % 2 : reverse arrow
+ drawarrow ((z2--z1) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \or
+ % 3 : unrotated line % nog \chemicalineposition: t/b
+ draw (origin--z3)
+ shifted (z1 rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \else
+ % 4 : dashed line
+ draw ((z1--z2) rotatedaround(origin,-\chemicalangle))
+% shifted z0 dashed evenly ;
+ shifted z0 dashed dashpattern(on 5.5u off 6u) ;
+ \fi
+ \stopMPdrawing
+ \fi
+ \egroup
+ \account\!!counta\!!countb
+ \account\!!countc\!!countd}
+
+\def\plotchemicalline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \doplotchemicalline}
+
+\def\plotchemicalfactorline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifdim\@@chemicalfactor\onepoint=\onepoint \else
+ \scratchdimen\!!counta\s!sp \multiply\scratchdimen1000 \scratchdimen\@@chemicalfactor\scratchdimen \divide\scratchdimen1000 \!!counta\scratchdimen
+ \scratchdimen\!!countc\s!sp \multiply\scratchdimen1000 \scratchdimen\@@chemicalfactor\scratchdimen \divide\scratchdimen1000 \!!countc\scratchdimen
+ \fi
+ \doplotchemicalline}
+
+\def\plotchemicalzline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ filldraw ((
+ \ifnum\chemicalangle>180
+ z1--z2
+ \else\ifnum\chemicalangle<90
+ z1--(z2 shifted (-2u,+2u))--(z2 shifted (+2u,-2u))
+ \else\ifnum\chemicalangle=90
+ (z1 shifted (-2u,+2u))--(z1 shifted (+2u,-2u))--
+ (z2 shifted (+2u,+2u))--(z2 shifted (-2u,-2u))
+ \else
+ (z1 shifted (+2u,+2u))--(z1 shifted (-2u,-2u))--z2
+ \fi\fi\fi
+ --cycle) rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ \stopMPdrawing
+ \else
+ \doplotchemicalline
+ \ifnum\chemicalangle>180 \else
+ \ifnum\chemicalangle=90
+ \advance\!!counta by -20 \advance\!!countc by -20
+ \doplotchemicalline
+ \advance\!!counta by 40 \advance\!!countc by 40
+ \else\ifnum\chemicalangle<90
+ \advance\!!countc by -20 \advance\!!countd by +20
+ \doplotchemicalline
+ \advance\!!countc by +40 \advance\!!countd by -40
+ \else
+ \advance\!!counta by 20 \advance\!!countb by 20
+ \doplotchemicalline
+ \advance\!!counta by -40 \advance\!!countb by -40
+ \fi\fi
+ \fi
+ \doplotchemicalline
+ \fi}
+
+\def\plotchemicaldeltaline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ filldraw ((z1--(z2 rotatedaround(z1,5))--(z2 rotatedaround(z1,-5))
+ --cycle) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \stopMPdrawing
+ \account{#1}{#2}%
+ \account{#3}{#4}%
+ \else
+ \doplotchemicalline
+ \advance\!!countc by 16 \advance\!!countd by -21
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -8 \advance\!!countd by 14
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \fi}
+
+\def\setchemicallinesegment #1 #2 #3 #4 #5
+ {\setvalue{\s!chemicallinesegment#1}{\plotchemicalline{#2}{#3}{#4}{#5}}}
+
+\def\setchemicalfactorlinesegment #1 #2 #3 #4 #5
+ {\setvalue{\s!chemicallinesegment#1}{\plotchemicalfactorline{#2}{#3}{#4}{#5}}}
+
+\def\getchemicallinesegment[#1][#2]%
+ {\chemicalrotate[#1]%
+ \dochemicaloffset{#1}%
+ \getvalue{\s!chemicallinesegment#2}%
+ \getvalue{\s!chemicallinesegment#21}%
+ \getvalue{\s!chemicallinesegment#22}%
+ \undochemicaloffset}
+
+\def\getprivatechemicallinesegment[#1][#2]%
+ {\chemicalrotate[#1]%
+ \getvalue{\s!chemicallinesegment#2#1}}
+
+\def\doprocesschemicallinesegment#1#2#3#4#5%
+ {\chardef\chemicallinetype=#1
+ \def\chemicallineposition{#2}%
+ \def\doprocess[##1##2##3##4##5]%
+ {\doifelse{##1}{?}
+ {\doprocess[1..\maxchemical ????]}
+ {\doifchemicalnumber{##1}{#4#5}
+ {\doifelse{##2##3}{..}
+ {\doifchemicalnumber{##4}{#4#5}
+ {#3[##1][#4]%
+ \doifnot{##1}{##4}
+ {\!!counta=##1\relax
+ \advance\!!counta by 1
+ \edef\nextsegment{\the\!!counta}%
+ \doprocess[\nextsegment..##4##5]}}}
+ {#3[##1][#4]%
+ \doifnot{##2}{?}
+ {\doprocess[##2##3##4##5]}}}}}%
+ \doprocess[#5]}
+
+\def\processchemicallinesegment
+ {\doprocesschemicallinesegment0c\getchemicallinesegment}
+
+\def\processchemicalzlinesegment#1#2%
+ {%\doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \bgroup
+ \def\plotchemicalline{\plotchemicalzline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processchemicaldeltalinesegment#1#2%
+ {%\doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \bgroup
+ \def\plotchemicalline{\plotchemicaldeltaline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processprivatechemicallinesegment%
+ {\doprocesschemicallinesegment0c\getprivatechemicallinesegment}
+
+\def\processchemicaldownarrowsegment%
+ {\doprocesschemicallinesegment1c\getchemicallinesegment}
+
+\def\processchemicaluparrowsegment%
+ {\doprocesschemicallinesegment2c\getchemicallinesegment}
+
+\def\processchemicalunrotatedlinesegment#1%
+ {\doprocesschemicallinesegment3{#1}\getchemicallinesegment}
+
+\def\processchemicaldashedlinesegment
+ {\doprocesschemicallinesegment4c\getchemicallinesegment}
+
+\def\plotchemicaldasheddeltaline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ z20 = z2 rotatedaround(z1,+5) ;
+ z21 = z2 rotatedaround(z1,-5) ;
+ draw (z1 rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ save n ; n := 5 ;
+ for i=1 upto n :
+ draw ((((z20--z21) shifted -z2) shifted (i/n)[z2,z1])
+ rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ endfor
+ \stopMPdrawing
+ \account{#1}{#2}%
+ \account{#3}{#4}%
+ \else
+ \doplotchemicalline
+ \advance\!!countc by 16 \advance\!!countd by -21
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -8 \advance\!!countd by 14
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \fi}
+
+\def\plotchemicalwavyline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ save d ; pair d ;
+ d := z2 rotatedaround(z1,+5) shifted -z2 ;
+ save n ; n := 4 ;
+ draw ((for i=0 upto n-1 :
+ ((i)/n)[z1,z2] ..
+ ((i+.25)/n)[z1,z2] shifted d ..
+ ((i+.50)/n)[z1,z2] ..
+ ((i+.75)/n)[z1,z2] shifted -d ..
+ endfor
+ z2) rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ \stopMPdrawing
+ \account{#1}{#2}%
+ \account{#3}{#4}%
+ \else
+ \doplotchemicalline
+ \advance\!!countc by 16 \advance\!!countd by -21
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -8 \advance\!!countd by 14
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \fi}
+
+\def\processchemicaldasheddeltalinesegment#1#2%
+ {\bgroup
+ \def\plotchemicalline{\plotchemicaldasheddeltaline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processchemicalwavylinesegment#1#2%
+ {\bgroup
+ \def\plotchemicalline{\plotchemicalwavyline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processchemicalopenend#1#2%
+ {\doprocesschemicallinesegment0c\doprocesschemicalopenend{#1}{#2}}
+
+\def\doprocesschemicalopenend[#1][#2]%
+ {\chemicalrotate[#1]%
+ \dochemicaloffset{#1}%
+ \ifcase\chemicaldrawingmode
+ \beginpicture
+ \setquadratic\plot
+ 300 0 400 0
+ 500 0 550 75
+ 600 0 650 -75
+ 700 0 750 75
+ 800 0 850 -75
+ 900 0 950 0
+ 1050 0 /
+ \endpicture
+ \or
+ \rput{-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline(300,0)(500,0)%
+ \rput(500,0){\psplot[yunit=75,plotstyle=curve]{0}{720}{x sin}}%
+ \psline(950,0)(1050,0)}%
+ \or
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ draw
+ (((30.0u,0)--(50.0u,0){up}..(55.0u,7.5u)..
+ (60.0u,0)..(65.0u,-7.5u)..(70.0u,0)..
+ (75.0u,7.5u)..(80.0u,0)..(85.0u,-7.5u)..{up}
+ (90.0u,0)--(105.0u,0)) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \stopMPdrawing
+ \fi
+ \undochemicaloffset}
+
+% \plotchemicalcircle{#1}{#2}{#3}{#4}
+%
+% #1: lengte van de boog in graden
+% #2: x-coordinaat eindpunt
+% #3: y-coordinaat eindpunt
+
+\newif\ifchemicaldotted
+
+\def\plotchemicalcircle#1#2#3#4#5#6%
+ {\bgroup
+ \ifcase\chemicaldrawingmode
+ \ifchemicaldotted
+ \findlength{\circulararc {#4} degrees from {#5} {#6} center at {0} {0} }%
+ \divide\totalarclength by 6
+ \def\b{\the\totalarclength}%
+ \divide\totalarclength by 2
+ \def\a{\the\totalarclength}%
+ \setdashpattern <\a,\b,\b,\b,\b,\b,\a>
+ \fi
+ \circulararc {#4} degrees from {#5} {#6} center at {0} {0} %
+ \or
+ \ifchemicaldotted
+ \psset{linestyle=dashed}%
+ \fi
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psarc(0,0){#3}{#1}{#2}}%
+ \or
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ r := \MPdivten[#3]*2u;
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ draw ((subpath (#1/45,#2/45) of (fullcircle scaled (r)))
+ rotatedaround (origin,\chemicalangle+150))
+ shifted z0 \ifchemicaldotted dashed withdots \fi ;
+ \stopMPdrawing
+ \fi
+ \egroup}
+
+\def\setchemicalcircsegment #1 #2 #3 #4 #5 #6 #7
+ {\setvalue{\s!chemicalcircsegment#1}{\plotchemicalcircle{#2}{#3}{#4}{#5}{#6}{#7}}}
+
+\def\getchemicalcircsegment[#1][#2]%
+ {\chemicalrotate[#1]%
+ \getvalue{\s!chemicalcircsegment#2}}
+
+\def\doprocesschemicalcircsegment#1#2%
+ {\def\doprocess[##1##2##3##4##5]%
+ {\doifelse{##1}{?}
+ {\doprocess[1..\maxchemical ????]}
+ {\doifchemicalnumber{##1}{#1#2}
+ {\doifelse{##2##3}{..}
+ {\doifchemicalnumber{##4}{#1#2}
+ {\getchemicalcircsegment[##1][#1]%
+ \doifnot{##1}{##4}
+ {\!!counta=##1\relax
+ \advance\!!counta by 1
+ \edef\nextsegment{\the\!!counta}%
+ \doprocess[\nextsegment..##4##5]}}}
+ {\getchemicalcircsegment[##1][#1]%
+ \doifnot{##2}{?}
+ {\doprocess[##2##3##4##5]}}}}}%
+ \doprocess[#2]}
+
+\def\processchemicalcircsegment%
+ {\chemicaldottedfalse\doprocesschemicalcircsegment}
+
+\def\processchemicaldottsegment%
+ {\chemicaldottedtrue\doprocesschemicalcircsegment}
+
+\let\endchemicalpicture = \relax
+\let\checkchemicalpicture = \relax
+\let\nomoreaccounting = \relax
+
+\newif\ifchemicalpicture
+
+\def\beginchemicalpicture#1% NO PSTRICKS SUPPORT YET
+ {\checkchemicalpicture
+ \bgroup % DOES NOT HANDLE AUTOWIDTH/HEIGHT
+ \chemicalpicturetrue
+ \processchemical[#1]}
+
+\def\setchemicalpicture#1#2%
+ {\chemicalpicturefalse
+ \def\endchemicalpicture%
+ {\@@endchemicallocalpicture{#1}{#2}%
+ \egroup
+ \ifnum\chemicaldrawingmode=1
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[\chemicalloca]{\chemicalangle}(#1,#2){\box\nextbox}}}%
+ \else
+ \expanded{\put{\box\nextbox}[\chemicalloca] at {#1} {#2} }
+ \fi
+ \egroup}%
+ \def\checkchemicalpicture%
+ {\ifx\endchemicalpicture\relax \else
+ \writestatus{ppchtex}{missing end of picture (PE)}%
+ \endchemicalpicture
+ \fi}%
+ \setbox\nextbox=\hbox\bgroup
+ \@@beginchemicallocalpicture
+ % alternatief: gewoon accounting, en zelf l,r afhandelen
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \accountingon
+ \let\nomoreaccounting=\accountingoff
+ \fi}
+
+\def\doskipchemical[#1][#2]%
+ {{\tt[ppchtex]}}
+
+\def\skipchemical%
+ {\dodoubleargument\doskipchemical}
+
+\def\complexchemical% met \expandafter
+ {\ifinchemical
+ \expandafter\dochemical
+ \else
+ \writestatus{ppchtex}{the [][]-alternative is not permitted here}%
+ \expandafter\skipchemical
+ \fi}
+
+\newif\ifinnerchemical
+
+\def\dosimplechemical#1#2#3%
+ {\doifdefinedelse{\??chemical\c!location}
+ {\writestatus{ppchtex}{the {}{}-alternative is not permitted here}}
+ {\ifinnerchemical
+ \let\chemicalsign = \chemicalinnersign
+ \let\chemicalmolecule = \chemicalinnermolecule
+ \let\chemicalsinglearrow = \chemicalsingleinnerarrow
+ \let\chemicaldoublearrow = \chemicaldoubleinnerarrow
+ \let\chemicaltwintiparrow = \chemicaltwintipinnerarrow
+ \else
+ \let\chemicalsign = \chemicaloutersign
+ \let\chemicalmolecule = \chemicaloutermolecule
+ \let\chemicalsinglearrow = \chemicalsingleouterarrow
+ \let\chemicaldoublearrow = \chemicaldoubleouterarrow
+ \let\chemicaltwintiparrow = \chemicaltwintipouterarrow
+ \fi
+ \disablechemicalspecials
+ \unexpandedprocessallactionsinset
+ [#1]
+ [ HIGH=>\sethighsubscripts,
+ LOW=>\setlowsubscripts,
+ PLUS=>\chemicalsign{+},
+ GIVES=>\chemicalsinglearrow{#2}{#3},
+ EQUILIBRIUM=>\chemicaldoublearrow{#2}{#3},
+ MESOMERIC=>\chemicaltwintiparrow{#2}{#3},
+ SINGLE=>\singlechemicalbond,
+ DOUBLE=>\doublechemicalbond,
+ TRIPLE=>\triplechemicalbond,
+ +=>\chemicalsign{+},
+ ->=>\chemicalsinglearrow{#2}{#3},
+ <->=>\chemicaldoublearrow{#2}{#3},
+ <>=>\chemicaltwintiparrow{#2}{#3},
+ -=>\singlechemicalbond,
+ --=>\doublechemicalbond,
+ ---=>\triplechemicalbond,
+ \s!unknown=>\enablechemicalspecials
+ \chemicalmolecule{\commalistelement}{#2}{#3}]}}
+
+%\def\dosimplechemicalA#1#2#3%
+% {\let\chemicalspace=\relax
+% \def\dodosimplechemical##1%
+% {\dosimplechemical{##1}{}{}}%
+% \@EA\processcommalist\@EA[\@@chemicalchemicaloffset,#1]\dodosimplechemical
+% \egroup}
+
+\def\dosimplechemicalA#1#2#3% % evt: {#1,\relax}
+ {\let\chemicalspace=\relax
+ \@EA\dosimplechemical\@EA{\@@chemicalchemicaloffset,#1}{#2}{#3}%
+ \egroup}
+
+\def\dosimplechemicalB#1#2#3%
+ {\dosimplechemical{#1}{#2}{#3}%
+ \egroup}
+
+\def\dosimplechemicalC#1#2#3%
+ {$\simplechemical{#1}{#2}{#3}$%
+ \egroup} % erbij
+
+\def\simplechemical
+ {\ifinner
+ \innerchemicaltrue
+ \else
+ \innerchemicalfalse
+ \fi
+ \bgroup
+ \catcode`\^=\@@superscript % t.b.v. \enableduplication
+ \catcode`\_=\@@subscript % t.b.v. de zekerheid
+ \ifmmode
+ \ifinnerchemical
+ \def\next{\dotriplegroupempty\dosimplechemicalA}%
+ \else
+ \def\next{\dotriplegroupempty\dosimplechemicalB}%
+ \fi
+ \else
+ \def\next{\dotriplegroupempty\dosimplechemicalC}%
+ \fi
+ \next}
+
+\definecomplexorsimple\chemical
+
+\def\dogotochemical#1#2%
+ {\def\dowithchemical% % experiment
+ {\localgotochemical{#1}}% % experiment
+ \chemical} % experiment
+
+\def\gotochemical% % experiment
+ {\dosingleargument\dogotochemical} % experiment
+
+\def\dododochemical#1[#2][#3]% % experiment
+ {\def\simpledododochemical% % experiment
+ {#1[#2][#3]}% % experiment
+ \def\complexdododochemical[##1]% % experiment
+ {\def\dowithchemical% % experiment
+ {\localthisischemical{#2}}% % experiment
+ #1[#3][##1]}% % experiment
+ \complexorsimple\dododochemical} % experiment
+
+\def\dodochemical[#1][#2]%
+ {\ignorespaces
+ \ifinchemical
+ \drawchemical[#1][#2]%
+ \ignorespaces
+ \else
+ \startchemical[\c!location=\v!intext]%
+ \drawchemical[#1][#2]%
+ \expandafter\stopchemical
+ \fi
+ \ignorespaces}
+
+\def\dochemical[#1]%
+ {\def\simpledochemical%
+ {\@@writechemicalstate{ppchtex}{[#1][]}%
+ \dodochemical[#1][]}%
+ %
+ \def\complexdochemical[##1]%
+ {\@@writechemicalstate{ppchtex}{[#1][##1]}%
+ \txtchemical=0%
+ \dodochemical[#1][##1]}%
+ %
+ \def\complexdochemical[##1]% % experiment
+ {\@@writechemicalstate{ppchtex}{[#1][##1]}% % experiment
+ \txtchemical=0% % experiment
+ \dododochemical\dodochemical[#1][##1]}% % experiment
+ %
+ \complexorsimple\dochemical}
+
+% \processlocalchemicals{#1}
+%
+% #1: commando's
+
+\def\dodoprocesschemical#1%
+ {\processchemical[#1????]}
+
+\def\processlocalchemicals#1%
+ {\processcommalist[#1]\dodoprocesschemical}
+
+% \drawchemical[#1][#2]
+%
+% #1: bindingen enz.
+% #2: atomen enz.
+
+\def\localdodochemical[#1][#2]%
+ {\@@writechemicalstate{ppchtex}{[#1][#2]}%
+ %\bgroup % koppelen en afmetingen gaat fout, vandaar:
+ \advance\levchemical 1
+ \letvalue{\??chemical\s!unknown\the\levchemical}\unknownchemical
+ \setevalue{\??chemical\c!text\the\levchemical}{\the\txtchemical}%
+ \txtchemical=0
+ \dodochemical[#1][#2]%
+ % \@EA\txtchemical\@EA\csname\??chemical\c!text\the\levchemical\endcsname
+ \txtchemical\csname\??chemical\c!text\the\levchemical\endcsname
+ \@EA\let\@EA\unknownchemical\csname\??chemical\s!unknown\the\levchemical\endcsname
+ \advance\levchemical -1
+ %\egroup
+ \ignorespaces}
+
+\def\drawchemical[#1][#2]%
+ {\ignorespaces
+ \def\dodochemical[##1][##2]%
+ {\drawchemical[##1][##2]%
+ \ignorespaces}%
+ \def\dochemical[##1]%
+ {\def\simpledochemical%
+ {\@@writechemicalstate{ppchtex}{[##1][#2]}%
+ \dodochemical[##1][#2]%
+ \ignorespaces}%
+ \def\complexdochemical[####1]%
+ {\dododochemical\localdodochemical[##1][####1,#2]}%
+ \complexorsimple\dochemical}%
+ \doif\@@chemicalstate\v!start
+ {\doifelse\chemicalname\s!unknown
+ {\getvalue{\s!executechemical\defaultchemical}[#2]}
+ {\getvalue{\s!executechemical\chemicalname}[#2]}%
+ \def\unknownchemical##1%
+ {\processunknownchemical[##1][#2]}%
+ \processcommalist[\@@chemicaloffset,#1]\dodoprocesschemical}%
+ \ignorespaces}
+
+\unexpanded\def\chemicaloxidation#1#2#3%
+ {\chemicaltop
+ {\ifnum#20=0
+ 0%
+ \else
+ #1\expandafter\uppercase\expandafter{\romannumeral#2}%
+ \fi}
+ {#3}}
+
+\def\chemicaltfraction{\ifinchemical.60\else.8\fi}
+\def\chemicalbfraction{\ifinchemical.45\else.6\fi}
+\def\chemicallfraction{\ifinchemical.1\else.1\fi}
+\def\chemicalrfraction{\ifinchemical.1\else.1\fi}
+
+\def\chemicaltighttext
+ {\def\chemicaltfraction{\ifinchemical.3\else.6\fi}%
+ \def\chemicalbfraction{\ifinchemical.2\else.4\fi}%
+ \def\chemicallfraction{\ifinchemical 0\else 0\fi}%
+ \def\chemicalrfraction{\ifinchemical 0\else 0\fi}}
+
+\def\dochemicaltop#1#2#3#4%
+ {\vbox
+ {\@@dochemicalcolor
+ \baselineskip=\chemicaltfraction\baselineskip \lineskip0pt
+ \halign
+ {#1###2\cr
+ $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr
+ $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr}}}
+
+\def\dochemicalbottom#1#2#3#4%
+ {\vtop
+ {\@@dochemicalcolor
+ \baselineskip=\chemicalbfraction\baselineskip \lineskip0pt
+ \halign
+ {#1###2\cr
+ $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr
+ $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr}}}
+
+\def\chemicalleft#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\scriptscriptstyle#1}$%
+ $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
+
+\def\chemicalright#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
+ $\@@dochemicalstyle{\scriptscriptstyle#1}$}}
+
+\def\chemicalcentered#1%
+ {\setbox0=\hbox{$\@@dochemicalstyle{\scriptscriptstyle#1}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \dimen0=.5\ht2
+ \advance\dimen0 by -.5\ht0
+ \advance\dimen0 by \dp0
+ \hbox{\@@dochemicalcolor\raise\dimen0\box0}}
+
+\def\chemicalleftcentered#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ \chemicalcentered{#1}%
+ $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
+
+\def\chemicalrightcentered#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
+ \chemicalcentered{#1}}}
+
+\def\chemicaltop {\dochemicaltop \hss \hss }
+\def\chemicallefttop {\dochemicaltop \relax \hss }
+\def\chemicalrighttop {\dochemicaltop \hss \relax}
+\def\chemicalbottom {\dochemicalbottom \hss \hss }
+\def\chemicalleftbottom {\dochemicalbottom \relax \hss }
+\def\chemicalrightbottom {\dochemicalbottom \hss \relax}
+
+\def\chemicaltopleft #1{\chemicalleft {\chemicallefttop {#1}{}}}
+\def\chemicalbottomleft #1{\chemicalleft {\chemicalleftbottom{#1}{}}}
+\def\chemicaltopright #1{\chemicalright{\chemicallefttop {#1}{}}}
+\def\chemicalbottomright#1{\chemicalright{\chemicalleftbottom{#1}{}}}
+
+\def\chemicalsmashedleft#1%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
+ \wd2=\wd0
+ \box2
+ \egroup}
+
+\def\chemicalsmashedmiddle#1%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
+ \hbox{\hskip-.5\wd2\hskip.5\wd0\box2}
+ \egroup}
+
+\def\chemicalsmashedright#1%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
+ \hbox to \wd0{\hskip-\wd2\hskip\wd0\box2}%
+ \egroup}
+
+\def\+{\tabalign} % is \long in Plain
+
+\def\chemicalforever#1#2%
+ {\bgroup
+ \setbox0=\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\scriptscriptstyle\hskip-.15em#2}$}%
+ \wd0=0pt
+ \big#1_{\hskip.1em\box0}%
+ \egroup}
+
+\def\disablechemicalspecials%
+ {\def\+##1{##1}\def\-##1{##1}%
+ \def\[{[}\def\]{]}%
+ \def\1{}\def\2{}\def\3{}\def\4{}\def\5{}\def\6{}\def\7{}%
+ \def\X{}%
+ \def\T{}\def\B{}\def\L{}\def\R{}\def\LC{}\def\RC{}%
+ \def\TL{}\def\BL{}\def\TR{}\def\BR{}%
+ \def\LT{}\def\LB{}\def\RT{}\def\RB{}%
+ \def\SL{}\def\SM{}\def\SR{}}
+
+\def\enablechemicalspecials%
+ {\def\+{\dodoublegroupempty\chemicaloxidation{+}}% {} needed!
+ \def\-{\dodoublegroupempty\chemicaloxidation{-}}% {} needed!
+ \def\[{\dodoublegroupempty\chemicalforever {[}}% {} needed!
+ \def\]{\dodoublegroupempty\chemicalforever {]}}% {} needed!
+ \def\1{\chemicaloxidation\relax1}%
+ \def\2{\chemicaloxidation\relax2}%
+ \def\3{\chemicaloxidation\relax3}%
+ \def\4{\chemicaloxidation\relax4}%
+ \def\5{\chemicaloxidation\relax5}%
+ \def\6{\chemicaloxidation\relax6}%
+ \def\7{\chemicaloxidation\relax7}%
+ \def\X{\chemicaltighttext}%
+ \def\T{\chemicaltop}%
+ \def\B{\chemicalbottom}%
+ \def\L{\chemicalleft}%
+ \def\LC{\chemicalleftcentered}%
+ \def\R{\chemicalright}%
+ \def\RC{\chemicalrightcentered}%
+ \def\TL{\chemicaltopleft}%
+ \def\BL{\chemicalbottomleft}%
+ \def\TR{\chemicaltopright}%
+ \def\BR{\chemicalbottomright}%
+ \def\LT{\chemicallefttop}%
+ \def\LB{\chemicalleftbottom}%
+ \def\RT{\chemicalrighttop}%
+ \def\RB{\chemicalrightbottom}%
+ \def\SL{\chemicalsmashedleft}%
+ \def\SM{\chemicalsmashedmiddle}%
+ \def\SR{\chemicalsmashedright}}
+
+% \reversechemical#1#2#3
+%
+% #1: prefix
+% #2: volgnummer enz
+% #3: tegengestelde volgnummers
+
+\def\reversechemical#1#2#3%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{#1#2}%
+ {\getfromcommalist[#3][##1]%
+ \let\reversechemicalaction=\commalistelement
+ \processchemical[#1\reversechemicalaction##2]}}%
+ \doprocess[#2]}
+
+% \processunknownchemical[#1????][#2]
+%
+% #1: bindingen enz.
+% #2: atomen enz.
+
+\def\defaultchemical%
+ {SIX}
+
+\def\processunknownchemical[#1????][#2]%
+ {\processaction
+ [#1]
+ [ SAVE=>\executechemicalSAVE,
+ RESTORE=>\executechemicalRESTORE,
+ HIGH=>\sethighsubscripts,
+ LOW=>\setlowsubscripts,
+ \s!default=>,
+ \s!unknown=>\doifdefinedelse{\s!executechemical#1}
+ {\def\chemicalrotation{1}%
+ \def\chemicaloffset{0}%
+ \doifdefined{\s!executechemical#1}
+ {\getvalue{\s!executechemical#1}[#2]}%
+ \@@chemicalpostponed}
+ {\getpredefinedchemical{#1}}]}
+
+\newcount\chemicalstack % tzt \newwounter
+
+\setvalue{\s!chemical\c!x1}{0}
+\setvalue{\s!chemical\c!y1}{0}
+
+\def\executechemicalSAVE
+ {%\writestatus{ppchtex}{saving \the\horchemical,\the\verchemical}%
+ \advance\chemicalstack by 1
+ \letvalue {\s!chemical n\the\chemicalstack}=\chemicalname
+ %\letvalue {\s!chemical p\the\chemicalstack}=\@@chemicalpostponed
+ \setevalue{\s!chemical x\the\chemicalstack}{\the\horchemical}%
+ \setevalue{\s!chemical y\the\chemicalstack}{\the\verchemical}}
+
+\def\restorechemicalvalues#1%
+ {\let\oldprocesschemical=\processchemical
+ \doifdefined{\s!executechemical#1}{\getvalue{\s!executechemical#1}[]}%
+ \let\processchemical=\oldprocesschemical}
+
+\def\executechemicalRESTORE
+ {\ifnum\chemicalstack=0\relax
+ \horchemical=\getvalue{\s!chemical x1}\relax
+ \verchemical=\getvalue{\s!chemical y1}\relax
+ \else
+ \restorechemicalvalues{\getvalue{\s!chemical n\the\chemicalstack}}%
+ %\@EA\let\@EA\@@chemicalpostponed\@EA=\csname\s!chemical p\the\chemicalstack\endcsname
+ \let\@@chemicalpostponed=\relax
+ \horchemical=\getvalue{\s!chemical x\the\chemicalstack}\relax
+ \verchemical=\getvalue{\s!chemical y\the\chemicalstack}\relax
+ \advance\chemicalstack by -1
+ \fi
+ \restorechemicalcoordinates}
+
+% De onderstaande macro's zijn verantwoordelijk voor het zetten
+% van de + en pijlen. De +, en dus ook de pijlen, worden omhoog
+% gehaald. Dit oogt m.i. fraaier.
+
+\def\chemicalinnerclip#1%
+ {{\setbox0=\hbox{#1}\ht0\ht\strutbox\dp0\dp\strutbox\box0}}
+
+\def\chemicalraise#1#2%
+ {\chemicalinnerclip
+ {\setbox0=\hbox{$#1+$}%
+ \raise\dp0\hbox{$#1#2$}}}
+
+\def\chemicalinnersign#1% todo: \@@chemicaltextcolor
+ {\chemicalraise{\@@localchemicalstyle}{#1}}
+
+\def\chemicaloutersign#1%
+ {\chemicalraise{}{\@@dochemicalcolor#1}}
+
+\def\chemicalsingleinnerarrow#1#2%
+ {\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}
+
+\def\chemicaldoubleinnerarrow#1#2% todo: \@@chemicaltextcolor
+ {\chemicalinnerclip
+ {\lower.2ex\hbox
+ {\setbox0=\hbox{$\@@localchemicalstyle\longrightarrow$}%
+ \setbox2=\hbox{$\@@localchemicalstyle\longleftarrow$}%
+ \wd0=0pt\raise\ht0\box0\box2}}}
+
+\def\chemicaltwintipinnerarrow#1#2% todo: \@@chemicaltextcolor
+ {\chemicalinnerclip
+ {\setbox0=\hbox{\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}%
+ \setbox2=\hbox{\chemicalraise{\@@localchemicalstyle}{\longleftarrow}}%
+ \wd0=0pt\box0\box2}}
+
+\def\dochemicalouterarrow#1#2#3%
+ {\bgroup
+ \setbox0=\hbox{$\longrightarrow$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#2\quad}$}%
+ \setbox4=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#3\quad}$}%
+ \dimen2=\wd0 % \dimen0 is used elsewhere
+ \ifdim\wd2>\dimen2 \dimen0=\wd2 \fi
+ \ifdim\wd4>\dimen2 \dimen0=\wd4 \fi
+ \chemicaloutermolecule
+ {#1}
+ {\ifdim\ht2>\!!zeropoint\box2\fi} % expands to \empty in test
+ {\ifdim\ht4>\!!zeropoint\box4\fi}% % expands to \empty in test
+ \egroup}
+
+\def\chemicalsingleouterarrow
+ {\dochemicalouterarrow
+ {\hbox to \dimen2{\rightarrowfill}}}
+
+\def\chemicaldoubleouterarrow
+ {\dochemicalouterarrow
+ {\lower.5\ht0\vbox
+ {\offinterlineskip
+ \hbox to \dimen2{\rightarrowfill}
+ \hbox to \dimen2{\leftarrowfill}}}}
+
+\def\chemicaltwintipouterarrow
+ {\dochemicalouterarrow
+ {\hbox
+ {\hbox to \dimen2{\rightarrowfill}%
+ \hskip-\dimen2
+ \hbox to \dimen2{\leftarrowfill}}}}
+
+\def\chemicalinnermolecule#1#2#3% no mathop here, can generate space
+ {\chemicalspace % todo: \@@chemicaltextcolor
+ \chemicalinnerclip
+ {\dosetsubscripts
+ $\@@dochemicalstyle{\@@localchemicalstyle\strut#1}$%
+ \doresetsubscripts}%
+ \chemicalspace}
+
+\def\chemicaloutermolecule#1#2#3%
+ {\chemicalspace
+ \bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox % else the font is reset
+ {\dosetsubscripts
+ \hbox{$\@@dochemicalstyle{\strut#1}$}%
+ \doresetsubscripts}%
+ \mathop{\box0}%
+ \ifthirdargument
+ \doifnot{#2}{}
+ {^{\@@dochemicalstyle{\strut#2}}}%
+ \doifnot{#3}{}
+ {_{\@@dochemicalstyle{\strut#3}}}%
+ \else
+ \doifnot{#2}{}
+ {_{\@@dochemicalstyle{\strut#2}}}%
+ \fi
+ \egroup
+ \chemicalspace}
+
+\def\chemicalsinglepicturearrow#1%
+ {\lower.5ex\hbox
+ {\@@dochemicalstyle
+ $\chemicalspace
+ \buildrel
+ \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
+ \over{\overrightarrow
+ {\hphantom{\@chemicalstyle{\scriptstyle\quad#1\quad}}}}%
+ \chemicalspace$}}
+
+\def\chemicaldoublepicturearrow#1%
+ {\lower.5ex\hbox
+ {\@@dochemicalstyle
+ $\chemicalspace
+ \buildrel
+ \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
+ \over{\overrightarrow{\overleftarrow
+ {\hphantom{\@@dochemicalstyle{\scriptstyle\quad#1\quad}}}}}%
+ \chemicalspace$}}
+
+% Bij de in-line bindingen wordt gebruik gemaakt van
+% een \hrule. De maatvoering wordt bepaald door een
+% kunstmatige em (\wd0).
+
+\def\somechemicalbond%
+ {\hrule width \wd0 height .4pt}
+
+\def\dochemicalbonds#1#2#3% todo: \@@chemicaltextstyle
+ {{\setbox0=\hbox
+ {${\@@localchemicalstyle M}$}%
+ \vbox to \ht0
+ {\@@dochemicalcolor
+ \hsize\wd0
+ \vskip.1\wd0#1\vfill#2\vfill#3\vskip.1\wd0}}}
+
+\def\singlechemicalbond%
+ {\dochemicalbonds{}{\somechemicalbond}{}}
+
+\def\doublechemicalbond%
+ {\dochemicalbonds{\somechemicalbond}{}{\somechemicalbond}}
+
+\def\triplechemicalbond%
+ {\dochemicalbonds{\somechemicalbond}{\somechemicalbond}{\somechemicalbond}}
+
+% In plaats van \def\naam{\chemie[...]...} kan beter gebruik
+% worden gemaakt van het commando
+%
+% \definieerchemie[naam]{commando's}
+%
+% De naam krijgt, om problemen met bestaande macro's te
+% voorkomen, een prefix. Bij het ophalen van een commando
+% worden beide definities afgehandeld.
+
+\def\dodefinechemical[#1]#2%
+ {\doifdefined{\??chemical#1}
+ {\writestatus{ppchtex}{chemical definition #1 is redefined}}%
+ \setvalue{\??chemical#1}{#2}}
+
+\def\definechemical%
+ {\dosingleargument\dodefinechemical}
+
+\def\getpredefinedchemical#1%
+ {\doifdefinedelse{\??chemical#1}
+ {\getvalue{\??chemical#1}}
+ {\doifdefinedelse{#1}
+ {\getvalue{#1}}
+ {\writestatus{ppchtex}{unknown chemical definition #1}}}}
+
+% Hieronder zijn de definities van de structuren opgenomen. De
+% naam van de structuur is als volgt opgebouwd:
+%
+% \executechemicalNUMBER[#1]
+%
+% waarbij [#1] betrekking heeft op de tekstelementen van \chemie,
+% de [tweede lijst] dus.
+%
+% De aan \chemie[#1][#2] meegegeven lijst van segmenten wordt
+% deels door de in \execute gedefinieerde macro's afgehandeld,
+% deels door algemene macro's. Segmenten hebben de vorm:
+%
+% [+|-|]identifier[X|XYZ|X..Y]
+%
+% Voorbeelden van segmenten zijn:
+%
+% R1
+% R1..4
+% R135
+% -R1
+% +R35
+
+\setchemicalmaximum 0
+
+\def\processchemical[#1]%
+ {\unknownchemical{#1}}
+
+\def\setchemicalname#1 %
+ {\def\chemicalname{#1}}
+
+\let\chemicalname=\s!unknown
+
+% Vooruitlopend op een gedetailleerde documentatie, zijn hier
+% vast enkele gebruikte afmetingen:
+%
+% lengte radikalen : 500
+% afstand radikalen : 100
+% afstand dubbele radikalen : 260
+% afstand substituenten : +125
+
+\def\executechemicalONE[#1]%
+ {\setchemicalname ONE
+ %
+ \setchemicalmaximum 8
+ \setchemicaldistance 0
+ \setchemicalsubstitute 625
+ \setchemicaldirection 303
+ %
+ \setchemicalrotation 1 1 0 1 0 1 0 1 0
+ \setchemicalrotation 2 0.707 -0.707 0.707 -0.707 0.707 -0.707 0.707 -0.707
+ \setchemicalrotation 3 0 -1 0 -1 0 -1 0 -1
+ \setchemicalrotation 4 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707
+ \setchemicalrotation 5 -1 0 -1 0 -1 0 -1 0
+ \setchemicalrotation 6 -0.707 0.707 -0.707 0.707 -0.707 0.707 -0.707 0.707
+ \setchemicalrotation 7 0 1 0 1 0 1 0 1
+ \setchemicalrotation 8 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 45 135 225 315
+ \setchemicalangle 3 90 180 270 0
+ \setchemicalangle 4 135 225 315 45
+ \setchemicalangle 5 180 270 0 90
+ \setchemicalangle 6 225 315 45 135
+ \setchemicalangle 7 270 0 90 180
+ \setchemicalangle 8 315 45 135 225
+ %
+ \setchemicaltranslate 1 -1000 0
+ \setchemicaltranslate 2 -1000 1000
+ \setchemicaltranslate 3 0 1000
+ \setchemicaltranslate 4 1000 1000
+ \setchemicaltranslate 5 1000 0
+ \setchemicaltranslate 6 1000 -1000
+ \setchemicaltranslate 7 0 -1000
+ \setchemicaltranslate 8 -1000 -1000
+ %
+ \setchemicallinesegment SB 300 0 700 0
+ \setchemicallinesegment DB1 300 50 700 50
+ \setchemicallinesegment DB2 300 -50 700 -50
+ %
+ %setchemicallinesegment EP 200 125 200 -125
+ \setchemicalfactorlinesegment EP 200 125 200 -125
+ %
+ \setchemicaltextelement ES 200 0
+ \setchemicaltextelement ED1 200 50
+ \setchemicaltextelement ED2 200 -50
+ \setchemicaltextelement ET1 200 75
+ \setchemicaltextelement ET2 200 0
+ \setchemicaltextelement ET3 200 -75
+ \setchemicaltextelement HB1 300 0
+ \setchemicaltextelement HB2 475 0
+ \setchemicaltextelement HB3 650 0
+ %
+ \setchemicaltextelement Z 800 0
+ \setchemicaltextelement RZ 950 0
+ \setchemicaltextelement ZN 500 0
+ \setchemicaltextelement ZTN 500 150
+ \setchemicaltextelement ZBN 500 -150
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\doprocesschemical[##1##2##3##4##5]
+ {\processaction
+ [##1##2##3##4##5]
+ [ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ SUB##4##5=>\processchemicalsubstitute{##4##5},
+ ADJ##4##5=>\processchemicaldistance{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ DIR##4##5=>\processchemicaldirection{##4##5},
+ OFF##4##5=>\processchemicaloffset{##4##5},
+ CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
+ LDD##4##5=>\processchemicaldashedlinesegment{DB1}{##4##5}%
+ \processchemicallinesegment{DB2}{##4##5},
+ RDD##4##5=>\processchemicallinesegment{DB1}{##4##5}%
+ \processchemicaldashedlinesegment{DB2}{##4##5},
+ OF##3:##5=>\processchemicalphantom{##3}{##5},
+ OE##3##4##5=>\processchemicalopenend{OE}{##3##4##5},
+ EP##3##4##5=>\processchemicallinesegment{EP}{##3##4##5},
+ ES##3##4##5=>\processchemicaltextconstant{ES}{##3##4##5}{\hbox{$\cdot$}}{0},
+ ED##3##4##5=>\processchemicaltextconstant{ED}{##3##4##5}{\hbox{$\cdot$}}{0},
+ ET##3##4##5=>\processchemicaltextconstant{ET}{##3##4##5}{\hbox{$\cdot$}}{0},
+ HB##3##4##5=>\processchemicaltextconstant{HB}{##3##4##5}{\hbox{$\cdot$}}{0},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ BB##3##4##5=>\processchemicaldeltalinesegment{SB}{##3##4##5},
+ BD##3##4##5=>\processchemicaldasheddeltalinesegment{SB}{##3##4##5},
+ BW##3##4##5=>\processchemicalwavylinesegment{SB}{##3##4##5},
+ SD##3##4##5=>\processchemicaldashedlinesegment{SB}{##3##4##5},
+ TB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5}%
+ \processchemicallinesegment{DB}{##3##4##5},
+ CZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{0}{},
+ ZTN##4##5=>\processchemicalsmalltextconstant{ZTN}{##4##5}{\chemicaltextelementnumber}{0},
+ ZTT##4##5=>\processchemicalsmalltextelement{ZTN}{##4##5}{#1}{0}{},
+ ZBN##4##5=>\processchemicalsmalltextconstant{ZBN}{##4##5}{\chemicaltextelementnumber}{0},
+ ZBT##4##5=>\processchemicalsmalltextelement{ZBN}{##4##5}{#1}{0}{},
+ ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
+ ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}
+ {l,l,t,r,r,r,b,l},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}}
+
+\def\executechemicalTHREE[#1]%
+ {\setchemicalname THREE
+ %
+ \setchemicalmaximum 3
+ \setchemicaldistance 289
+ \setchemicalsubstitute 952
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 -0.5 -0.866 -0.866 0.5 0.5 0.866 0.866 -0.5
+ \setchemicalrotation 3 -0.5 0.866 0.866 0.5 0.5 -0.866 -0.866 -0.5
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 120 210 300 30
+ \setchemicalangle 3 240 330 60 150
+ %
+ \setchemicaltranslate 1 -1000 0
+ \setchemicaltranslate 2 0 1000
+ \setchemicaltranslate 3 1000 0
+ \setchemicaltranslate 4 0 -1000
+ %
+ \setchemicallinesegment B 577 0 -289 -500
+ \setchemicallinesegment SB 352 -130 -64 -370
+ \setchemicallinesegment -SB 352 -130 -289 -500
+ \setchemicallinesegment +SB 577 0 -64 -370
+ \setchemicallinesegment DB1 327 -87 -89 -327
+ \setchemicallinesegment DB2 377 -172 -39 -413
+ \setchemicallinesegment R 577 0 1077 0
+ \setchemicallinesegment -R 577 0 1010 250
+ \setchemicallinesegment +R 577 0 1010 -250
+ \setchemicallinesegment ER1 577 50 1077 50
+ \setchemicallinesegment ER2 577 -50 1077 -50
+ \setchemicallinesegment SR 837 0 1077 0
+ \setchemicallinesegment -SR 802 130 1010 250
+ \setchemicallinesegment +SR 802 -130 1010 -250
+ \setchemicallinesegment DR1 837 50 1077 50
+ \setchemicallinesegment DR2 837 -50 1077 -50
+ %
+ \setchemicaltextelement Z 577 0
+ \setchemicaltextelement RZ 1177 0
+ \setchemicaltextelement -RZ 1097 300
+ \setchemicaltextelement +RZ 1097 -300
+ \setchemicaltextelement CRZ 1077 0
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [ ROT##4=>\processchemicalrotation{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ SUB##4=>\processchemicalsubstitute{##4},
+ ADJ##4=>\processchemicaldistance{##4},
+ -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{3}
+ {l,t,r, l,r,l, r,b,l, r,l,r},
+ +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{3}
+ {l,r,b, r,r,l, r,l,t, l,l,r},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ -SR##4=>\processchemicallinesegment{-SR}{##4},
+ +SR##4=>\processchemicallinesegment{+SR}{##4},
+ CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}
+ {},
+ DB##3##4=>\processchemicallinesegment{DB}{##3##4},
+ DR##3##4=>\processchemicallinesegment{DR}{##3##4},
+ RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{3}
+ {l,r,r, t,r,l, r,l,l, b,l,r},
+ ER##3##4=>\processchemicallinesegment{ER}{##3##4},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ SR##3##4=>\processchemicallinesegment{SR}{##3##4},
+ -R##3##4=>\processchemicallinesegment{-R}{##3##4},
+ +R##3##4=>\processchemicallinesegment{+R}{##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalFOUR[#1]%
+ {\setchemicalname FOUR
+ %
+ \setchemicalmaximum 4
+ \setchemicaldistance 500
+ \setchemicalsubstitute 0
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 0 -1 -1 0 0 1 1 0
+ \setchemicalrotation 3 -1 0 0 1 1 0 0 -1
+ \setchemicalrotation 4 0 1 1 0 0 -1 -1 0
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 90 180 270 0
+ \setchemicalangle 3 180 270 0 90
+ \setchemicalangle 4 270 0 90 180
+ %
+ \setchemicaltranslate 1 -1000 0
+ \setchemicaltranslate 2 0 1000
+ \setchemicaltranslate 3 1000 0
+ \setchemicaltranslate 4 0 -1000
+ %
+ \setchemicallinesegment B 500 500 500 -500
+ \setchemicallinesegment SB 500 240 500 -240
+ \setchemicallinesegment -SB 500 240 500 -500
+ \setchemicallinesegment +SB 500 500 500 -240
+ \setchemicallinesegment DB1 450 240 450 -240
+ \setchemicallinesegment DB2 550 240 550 -240
+ \setchemicallinesegment EB 360 300 360 -300
+ \setchemicallinesegment R 500 500 854 854
+ \setchemicallinesegment -R 500 500 500 1000
+ \setchemicallinesegment +R 500 500 1000 500
+ \setchemicallinesegment ER1 465 535 819 889
+ \setchemicallinesegment ER2 535 465 889 819
+ \setchemicallinesegment SR 684 684 854 854
+ \setchemicallinesegment -SR 500 760 500 1000
+ \setchemicallinesegment +SR 760 500 1000 500
+ \setchemicallinesegment DR1 649 719 819 889
+ \setchemicallinesegment DR2 719 649 889 819
+ %
+ \setchemicaltextelement Z 500 500
+ \setchemicaltextelement RZ 925 925
+ \setchemicaltextelement -RZ 500 1100
+ \setchemicaltextelement +RZ 1100 500
+ \setchemicaltextelement CRZ 1038 1038
+ %
+ \setchemicaltextelement ZN 350 350
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [ PB:##4=>\beginchemicalpicture{##4},
+ PE????=>\endchemicalpicture,
+ ROT##4=>\processchemicalrotation{##4},
+ SUB##4=>\processchemicalsubstitute{##4},
+ ADJ##4=>\processchemicaldistance{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{4}
+ {b,l,t,r, l,t,r,b, t,r,b,l, r,b,l,t},
+ +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{4}
+ {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ -SR##4=>\processchemicallinesegment{-SR}{##4},
+ +SR##4=>\processchemicallinesegment{+SR}{##4},
+ CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
+ ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
+ ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
+ DB##3##4=>\processchemicallinesegment{DB}{##3##4},
+ DR##3##4=>\processchemicallinesegment{DR}{##3##4},
+ EB##3##4=>\processchemicallinesegment{EB}{##3##4},
+ ER##3##4=>\processchemicallinesegment{ER}{##3##4},
+ RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{4}
+ {lb,lt,rt,rb, lt,rt,rb,lb, rt,rb,lb,lt, rb,lb,lt,rt},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ SR##3##4=>\processchemicallinesegment{SR}{##3##4},
+ -R##3##4=>\processchemicallinesegment{-R}{##3##4},
+ +R##3##4=>\processchemicallinesegment{+R}{##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalFIVE[#1]%
+ {\setchemicalname FIVE
+ %
+ \setchemicalmaximum 5
+ \setchemicaldistance 688
+ \setchemicalsubstitute 1226
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 0.309 -0.951 -0.951 -0.309 -0.309 0.940 0.951 0.309
+ \setchemicalrotation 3 -0.809 -0.588 -0.588 0.809 0.809 0.588 0.588 -0.809
+ \setchemicalrotation 4 -0.809 0.588 0.588 0.809 0.809 -0.588 -0.588 -0.809
+ \setchemicalrotation 5 0.309 0.951 0.951 -0.309 -0.309 -0.951 -0.951 0.309
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 72 162 252 342
+ \setchemicalangle 3 144 234 324 54
+ \setchemicalangle 4 216 306 36 126
+ \setchemicalangle 5 288 18 108 198
+ %
+ \setchemicaltranslate 1 -1376 0
+ \setchemicaltranslate 2 -425 1304
+ \setchemicaltranslate 3 1113 809
+ \setchemicaltranslate 4 1113 -809
+ \setchemicaltranslate 5 -425 -1304
+ %
+ \setchemicallinesegment A 1188 500 1188 -500
+ \setchemicallinesegment B 688 500 688 -500
+ \setchemicallinesegment S -263 808 688 -500
+ \setchemicallinesegment SS -116 606 541 -298
+ \setchemicallinesegment -SS -263 808 541 -298
+ \setchemicallinesegment +SS -116 606 688 -500
+ \setchemicallinesegment SB 688 240 688 -240
+ \setchemicallinesegment -SB 688 240 688 -500
+ \setchemicallinesegment +SB 688 500 688 -240
+ \setchemicallinesegment DB1 638 240 638 -240
+ \setchemicallinesegment DB2 738 240 738 -240
+ \setchemicallinesegment EB 548 340 548 -340
+ \setchemicallinesegment R 688 500 1093 794
+ \setchemicallinesegment -R 688 500 688 1000
+ \setchemicallinesegment +R 688 500 1163 345
+ \setchemicallinesegment ER1 659 540 1064 834
+ \setchemicallinesegment ER2 727 460 1122 754
+ \setchemicallinesegment SR 898 653 1093 794
+ \setchemicallinesegment -SR 688 760 688 1000
+ \setchemicallinesegment +SR 935 420 1163 345
+ \setchemicallinesegment DR1 869 693 1064 834
+ \setchemicallinesegment DR2 927 613 1122 754
+ %
+ \setchemicaltextelement Z 688 500
+ \setchemicaltextelement RZ 1188 863
+ \setchemicaltextelement -RZ 688 1100
+ \setchemicaltextelement +RZ 1258 315
+ \setchemicaltextelement CRZ 1323 947
+ %
+ \setchemicalcircsegment C -36 36 590 72 475 -345
+ \setchemicalcircsegment CC -72 0 590 72 182 -561
+ %
+ \setchemicaltextelement ZN 468 350
+ \setchemicaltextelement RN 860 625 % 1.25 Z
+ \setchemicaltextelement RTN 785 728 % .12 / 103 75
+ \setchemicaltextelement RBN 935 522
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [ FRONT????=>{\executechemicalFIVEFRONT[#1]},
+ PB:##4=>\beginchemicalpicture{##4},
+ PE????=>\endchemicalpicture,
+ ROT##4=>\processchemicalrotation{##4},
+ SUB##4=>\processchemicalsubstitute{##4},
+ ADJ##4=>\processchemicaldistance{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{5}
+ {b,l,t,r,r, l,t,r,r,l, t,r,r,l,l, r,b,l,t,r},
+ +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{5}
+ {l,t,r,r,b, t,r,r,l,l, r,r,l,l,r, b,l,l,r,r},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ -SR##4=>\processchemicallinesegment{-SR}{##4},
+ +SR##4=>\processchemicallinesegment{+SR}{##4},
+ -RD##4=>\processchemicaldashedlinesegment{-R}{##4},
+ +RD##4=>\processchemicaldashedlinesegment{+R}{##4},
+ -RB##4=>\processchemicaldeltalinesegment{-R}{##4},
+ +RB##4=>\processchemicaldeltalinesegment{+R}{##4},
+ CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
+ RTN##4=>\processchemicaltextconstant{RTN}{##4}{\chemicaltextelementnumber}{0},
+ RTT##4=>\processchemicaltextelement{RTN}{##4}{#1}{0}{},
+ RBN##4=>\processchemicaltextconstant{RBN}{##4}{\chemicaltextelementnumber}{0},
+ RBT##4=>\processchemicaltextelement{RBN}{##4}{#1}{0}{},
+ -SS##4=>\processchemicallinesegment{-SS}{##4},
+ +SS##4=>\processchemicallinesegment{+SS}{##4},
+ CCD##4=>\processchemicaldottsegment{CC}{##4},
+ SS##3##4=>\processchemicallinesegment{SS}{##3##4},
+ RD##3##4=>\processchemicaldashedlinesegment{R}{##3##4},
+ RB##3##4=>\processchemicaldeltalinesegment{R}{##3##4},
+ ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
+ ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
+ RN##3##4=>\processchemicaltextconstant{RN}{##3##4}{\chemicaltextelementnumber}{0},
+ RT##3##4=>\processchemicaltextelement{RN}{##3##4}{#1}{0}{},
+ AU##3##4=>\processchemicaluparrowsegment{A}{##3##4},
+ AD##3##4=>\processchemicaldownarrowsegment{A}{##3##4},
+ CC##3##4=>\processchemicalcircsegment{CC}{##3##4},
+ CD##3##4=>\processchemicaldottsegment{C}{##3##4},
+ DB##3##4=>\processchemicallinesegment{DB}{##3##4},
+ DR##3##4=>\processchemicallinesegment{DR}{##3##4},
+ EB##3##4=>\processchemicallinesegment{EB}{##3##4},
+ ER##3##4=>\processchemicallinesegment{ER}{##3##4},
+ RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{5}
+ {l,l,r,r,r, l,r,r,b,l, r,r,b,l,t, r,l,l,t,r},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ SR##3##4=>\processchemicallinesegment{SR}{##3##4},
+ -R##3##4=>\processchemicallinesegment{-R}{##3##4},
+ +R##3##4=>\processchemicallinesegment{+R}{##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ C##2##3##4=>\processchemicalcircsegment{C}{##2##3##4},
+ R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
+ S##2##3##4=>\processchemicallinesegment{S}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalSIX[#1]%
+ {\setchemicalname SIX
+ %
+ \setchemicalmaximum 6
+ \setchemicalsubstitute 1375
+ \setchemicaldistance 866
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 0.5 -0.866 -0.866 -0.5 -0.5 0.866 0.866 0.5
+ \setchemicalrotation 3 -0.5 -0.866 -0.866 0.5 0.5 0.866 0.866 -0.5
+ \setchemicalrotation 4 -1 0 0 1 1 0 0 -1
+ \setchemicalrotation 5 -0.5 0.866 0.866 0.5 0.5 -0.866 -0.866 -0.5
+ \setchemicalrotation 6 0.5 0.866 0.866 -0.5 -0.5 -0.866 -0.866 0.5
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 60 150 240 330
+ \setchemicalangle 3 120 210 300 30
+ \setchemicalangle 4 180 270 0 90
+ \setchemicalangle 5 240 330 60 150
+ \setchemicalangle 6 300 30 120 210
+ %
+ \setchemicaltranslate 1 -1732 0
+ \setchemicaltranslate 2 -866 1500
+ \setchemicaltranslate 3 866 1500
+ \setchemicaltranslate 4 1732 0
+ \setchemicaltranslate 5 866 -1500
+ \setchemicaltranslate 6 -866 -1500
+ %
+ \setchemicallinesegment A 1386 500 1386 -500
+ \setchemicallinesegment S 0 1000 866 -500
+ \setchemicallinesegment SS 125 783 741 -283
+ \setchemicallinesegment -SS 0 1000 741 -283
+ \setchemicallinesegment +SS 125 783 866 -500
+ \setchemicallinesegment B 866 500 866 -500
+ \setchemicallinesegment SB 866 240 866 -240
+ \setchemicallinesegment -SB 866 240 866 -500
+ \setchemicallinesegment +SB 866 500 866 -240
+ \setchemicallinesegment DB1 816 240 816 -240
+ \setchemicallinesegment DB2 916 240 916 -240
+ \setchemicallinesegment EB 726 340 726 -340
+ \setchemicallinesegment R 866 500 1299 750
+ \setchemicallinesegment -R 866 500 866 1000
+ \setchemicallinesegment +R 866 500 1299 250
+ \setchemicallinesegment ER1 841 543 1274 793
+ \setchemicallinesegment ER2 891 457 1324 707
+ \setchemicallinesegment SR 1091 630 1299 750
+ \setchemicallinesegment -SR 866 740 866 1000
+ \setchemicallinesegment +SR 1091 370 1299 250
+ \setchemicallinesegment DR1 1066 673 1274 793
+ \setchemicallinesegment DR2 1116 588 1324 707
+ \setchemicallinesegment MID1 0 1000 -150 200
+ \setchemicallinesegment MID2 0 -1000 -150 -200
+ \setchemicallinesegment MIDS1 0 1000 -180 0
+ \setchemicallinesegment MIDS2 0 -1000 -180 0
+ %
+ \setchemicalcircsegment C -30 30 700 60 600 -346
+ \setchemicalcircsegment CC -60 0 700 60 350 -606
+ %
+ \setchemicaltextelement Z 866 500
+ \setchemicaltextelement RZ 1386 800
+ \setchemicaltextelement -RZ 866 1100
+ \setchemicaltextelement +RZ 1386 200
+ \setchemicaltextelement CRZ 1524 880
+ \setchemicaltextelement MIDZ -150 0
+ %
+ \setchemicaltextelement ZN 589 350
+ \setchemicaltextelement RN 1083 625 % 1.25 Z
+ \setchemicaltextelement RTN 1008 755 % .12 / 130 75
+ \setchemicaltextelement RBN 1158 495
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ FRONT????=>{\executechemicalSIXFRONT[#1]},
+ MID????=>\processchemicallinesegment{MID}{1????},
+ MIDS????=>\processchemicallinesegment{MIDS}{1????},
+ MIDZ????=>\processchemicaltextelement{MIDZ}{1????}{#1}{0}{},
+ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ ROT##4##5=>\processchemicalrotation{##4##5},
+ SUB##4##5=>\processchemicalsubstitute{##4##5},
+ ADJ##4##5=>\processchemicaldistance{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ -RZ##4##5=>\processchemicaltextelement{-RZ}{##4##5}{#1}{6}
+ {b,l,l,t,r,r, l,l,r,r,r,l, t,r,r,b,l,l, r,r,l,l,l,r},
+ +RZ##4##5=>\processchemicaltextelement{+RZ}{##4##5}{#1}{6}
+ {l,t,r,r,b,l, r,r,r,l,l,l, r,b,l,l,t,r, l,l,l,r,r,r},
+ -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
+ +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
+ -SR##4##5=>\processchemicallinesegment{-SR}{##4##5},
+ +SR##4##5=>\processchemicallinesegment{+SR}{##4##5},
+ -RD##4##5=>\processchemicaldashedlinesegment{-R}{##4##5},
+ +RD##4##5=>\processchemicaldashedlinesegment{+R}{##4##5},
+ -RB##4##5=>\processchemicaldeltalinesegment{-R}{##4##5},
+ +RB##4##5=>\processchemicaldeltalinesegment{+R}{##4##5},
+ CRZ##4##5=>\processchemicaltextelement{CRZ}{##4##5}{#1}{0}{},
+ -SS##4##5=>\processchemicallinesegment{-SS}{##4##5},
+ +SS##4##5=>\processchemicallinesegment{+SS}{##4##5},
+ CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
+RTN##4##5=>\processchemicaltextconstant{RTN}{##4##5}{\chemicaltextelementnumber}{0},
+RTT##4##5=>\processchemicaltextelement{RTN}{##4##5}{#1}{0}{},
+RBN##4##5=>\processchemicaltextconstant{RBN}{##4##5}{\chemicaltextelementnumber}{0},
+RBT##4##5=>\processchemicaltextelement{RBN}{##4##5}{#1}{0}{},
+ SS##3##4##5=>\processchemicallinesegment{SS}{##3##4##5},
+ RD##3##4##5=>\processchemicaldashedlinesegment{R}{##3##4##5},
+ RB##3##4##5=>\processchemicaldeltalinesegment{R}{##3##4##5},
+ ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
+ ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
+RN##3##4##5=>\processchemicaltextconstant{RN}{##3##4##5}{\chemicaltextelementnumber}{0},
+RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
+ AU##3##4##5=>\processchemicaluparrowsegment{A}{##3##4##5},
+ AD##3##4##5=>\processchemicaldownarrowsegment{A}{##3##4##5},
+ CD##3##4##5=>\processchemicaldottsegment{C}{##3##4##5},
+ CC##3##4##5=>\processchemicalcircsegment{CC}{##3##4##5},
+ DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
+ EB##3##4##5=>\processchemicallinesegment{EB}{##3##4##5},
+ ER##3##4##5=>\processchemicallinesegment{ER}{##3##4##5},
+ RZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{6}
+ {l,l,t,r,r,b, l,r,r,r,l,l, r,r,b,l,l,t, r,l,l,l,r,r},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ SR##3##4##5=>\processchemicallinesegment{SR}{##3##4##5},
+ DR##3##4##5=>\processchemicallinesegment{DR}{##3##4##5},
+ -R##3##4##5=>\processchemicallinesegment{-R}{##3##4##5},
+ +R##3##4##5=>\processchemicallinesegment{+R}{##3##4##5},
+ B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
+ C##2##3##4##5=>\processchemicalcircsegment{C}{##2##3##4##5},
+ R##2##3##4##5=>\processchemicallinesegment{R}{##2##3##4##5},
+ S##2##3##4##5=>\processchemicallinesegment{S}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalSEVEN[#1]% incomplete !
+ {\setchemicalname SEVEN
+ %
+ \setchemicalmaximum 7
+ \setchemicalsubstitute -
+ \setchemicaldistance 1038
+ %
+ \setchemicalrotation 1 .623 .782 - - - - - -
+ \setchemicalrotation 2 -.223 .975 - - - - - -
+ \setchemicalrotation 3 -.901 .434 - - - - - -
+ \setchemicalrotation 4 -.901 -.434 - - - - - -
+ \setchemicalrotation 5 -.223 -.975 - - - - - -
+ \setchemicalrotation 6 .623 -.782 - - - - - -
+ \setchemicalrotation 7 1 0 - - - - - -
+ %
+ \setchemicalangle 1 0 - - -
+ \setchemicalangle 2 51.429 - - -
+ \setchemicalangle 3 102.857 - - -
+ \setchemicalangle 4 154.286 - - -
+ \setchemicalangle 5 205.714 - - -
+ \setchemicalangle 6 257.143 - - -
+ \setchemicalangle 7 308.571 - - -
+ %
+ \setchemicaltranslate 1 - -
+ \setchemicaltranslate 2 - -
+ \setchemicaltranslate 3 - -
+ \setchemicaltranslate 4 - -
+ \setchemicaltranslate 5 - -
+ \setchemicaltranslate 6 - -
+ \setchemicaltranslate 7 - -
+ %
+ \setchemicallinesegment B 1038 500 1038 -500
+ \setchemicallinesegment SB 1038 240 1038 -240
+ \setchemicallinesegment -SB 1038 240 1038 -500
+ \setchemicallinesegment +SB 1038 500 1038 -240
+ %
+ \setchemicaltextelement Z 1038 500
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ %ROT##4##5=>\processchemicalrotation{##4},
+ %SUB##4##5=>\processchemicalsubstitute{##4##5},
+ %ADJ##4##5=>\processchemicaldistance{##4##5},
+ %MOV##4##5=>\processchemicaltranslate{##4##5},
+ -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
+ +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalEIGHT[#1]% incomplete !
+ {\setchemicalname EIGHT
+ %
+ \setchemicalmaximum 8
+ %\setchemicalsubstitute 1307
+ \setchemicaldistance 1207
+ %
+ \setchemicalrotation 1 .707 .707 - - - - - -
+ \setchemicalrotation 2 0 1 - - - - - -
+ \setchemicalrotation 3 -.707 .707 - - - - - -
+ \setchemicalrotation 4 -1 0 - - - - - -
+ \setchemicalrotation 5 -.707 -.707 - - - - - -
+ \setchemicalrotation 6 0 -1 - - - - - -
+ \setchemicalrotation 7 .707 -.707 - - - - - -
+ \setchemicalrotation 8 1 0 - - - - - -
+ %
+ \setchemicalangle 1 45 - - -
+ \setchemicalangle 2 90 - - -
+ \setchemicalangle 3 135 - - -
+ \setchemicalangle 4 180 - - -
+ \setchemicalangle 5 225 - - -
+ \setchemicalangle 6 270 - - -
+ \setchemicalangle 7 315 - - -
+ \setchemicalangle 8 0 - - -
+ %
+ \setchemicaltranslate 1 -2414 0
+ \setchemicaltranslate 2 -1706 1706
+ \setchemicaltranslate 3 0 2414
+ \setchemicaltranslate 4 1706 1706
+ \setchemicaltranslate 5 2414 0
+ \setchemicaltranslate 6 1706 -1706
+ \setchemicaltranslate 7 0 -2414
+ \setchemicaltranslate 8 -1706 -1706
+ %
+ \setchemicallinesegment B 1207 500 1207 -500
+ \setchemicallinesegment SB 1207 240 1207 -240
+ \setchemicallinesegment -SB 1207 240 1207 -500
+ \setchemicallinesegment +SB 1207 500 1207 -240
+ %
+ \setchemicaltextelement Z 1207 500
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ %SUB##4##5=>\processchemicalsubstitute{##4##5},
+ ADJ##4##5=>\processchemicaldistance{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
+ +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalFIVEFRONT[#1]%
+ {\executechemicalFIVE[]%
+ %
+ \setchemicalname FIVEFRONT
+ %
+ \setchemicallinesegment -R 688 500 688 100
+ \setchemicallinesegment +R 688 500 688 900
+ %
+ \setchemicaltextelement -RZ 0 -1300
+ \setchemicaltextelement +RZ 0 1300
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\def\chemicalrotation{2}%
+ \processaction
+ [##1##2##3##4]
+ [ -RZ##4=>\processchemicalunrotatedtextelement{Z}{-RZ}{##4}{#1}{5}
+ {,,,,, t,t,t,t,t},
+ +RZ##4=>\processchemicalunrotatedtextelement{Z}{+RZ}{##4}{#1}{5}
+ {,,,,, b,b,b,b,b},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ -R##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##3##4},
+ +R##3##4=>\processchemicalunrotatedlinesegment{b}{+R}{##3##4},
+ BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
+ R##2##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##2##3##4}%
+ \processchemicalunrotatedlinesegment{b}{+R}{##2##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalSIXFRONT[#1]%
+ {\executechemicalSIX[]%
+ %
+ \setchemicalname SIXFRONT
+ %
+ \setchemicallinesegment -R 866 500 866 100
+ \setchemicallinesegment +R 866 500 866 900
+ %
+ \setchemicaltextelement -RZ 0 -1300
+ \setchemicaltextelement +RZ 0 1300
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\def\chemicalrotation{2}%
+ \processaction
+ [##1##2##3##4]
+ [ -RZ##4=>\processchemicalunrotatedtextelement{Z}{-RZ}{##4}{#1}{6}
+ {,,,,,, t,t,t,t,t,t},
+ +RZ##4=>\processchemicalunrotatedtextelement{Z}{+RZ}{##4}{#1}{6}
+ {,,,,,, b,b,b,b,b,b},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ -R##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##3##4},
+ +R##3##4=>\processchemicalunrotatedlinesegment{b}{+R}{##3##4},
+ BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
+ R##2##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##2##3##4}%
+ \processchemicalunrotatedlinesegment{b}{+R}{##2##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+% 1 : 0
+% 2 : -115
+% 3* : -195
+% 3 : -165
+% 4 : -245
+
+\def\executechemicalCARBON[#1]%
+ {\setchemicalname CARBON
+ %
+ \setchemicalmaximum 4
+ \setchemicaldistance 0
+ \setchemicalsubstitute 0
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 -0.423 -0.906 -0.906 0.423 0.423 0.906 0.906 -0.423
+ \setchemicalrotation 3 -0.966 -0.259 -0.259 0.966 0.966 0.259 0.259 -0.966
+ \setchemicalrotation 3* -0.966 0.259 0.259 0.966 0.966 -0.259 -0.259 -0.966
+ \setchemicalrotation 4 -0.423 0.906 0.906 0.423 0.423 -0.906 -0.906 -0.423
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 115 205 295 25
+ \setchemicalangle 3 165 255 345 75
+ \setchemicalangle 3* 195 285 15 105
+ \setchemicalangle 4 245 335 65 155
+ %
+ \setchemicaltranslate 1 -1500 0
+ \setchemicaltranslate 2 0 1500
+ \setchemicaltranslate 3 1500 0
+ \setchemicaltranslate 4 0 -1500
+ %
+ \setchemicallinesegment B1 500 0 1000 0
+ \setchemicallinesegment B2 300 0 1000 0
+ \setchemicallinesegment B3 500 0 1000 0
+ \setchemicallinesegment B4 300 0 1000 0
+ %
+ \setchemicaltextelement Z 1100 0
+ %
+ \setchemicalcircsegment C 0 360 500 360 0 -500
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ MIR????=>\setchemicalmirror{3},
+ -MIR????=>\resetchemicalmirror{3},
+ *MIR????=>\togglechemicalmirror{3},
+ CB????=>\processlocalchemicals{B,C,Z},
+ C????=>\processchemicalcircsegment{C}{1????},
+ -ROT##5=>\reversechemical{ROT}{##5}{3,4,1,2},
+ ROT##4##5=>\processchemicalrotation{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ CB##3##4##5=>\processlocalchemicals
+ {ROT##3,C,B,Z2..4,
+ MOV##3,*MIR,-ROT##3,C,B,Z2..4},
+ B##2##3##4##5=>\processprivatechemicallinesegment{B}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{4}
+ {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+% 1: 45 2: -90 3: -225
+% 4: -45 5: -135 6: -270
+
+\newif\ifNEWMANstagger \NEWMANstaggertrue
+
+\def\executechemicalNEWMANSTAGGER%
+ {\NEWMANstaggertrue\executechemicalNEWMAN}
+
+\def\executechemicalNEWMANECLIPSE%
+ {\NEWMANstaggerfalse\executechemicalNEWMAN}
+
+\def\executechemicalNEWMAN[#1]%
+ {\setchemicalname NEWMAN
+ %
+ \setchemicalmaximum 6
+ \setchemicaldistance 0
+ \setchemicalsubstitute 0
+ %
+ \ifNEWMANstagger
+ \setchemicalrotation 1 0.707 0.707 0.707 -0.707 -0.707 -0.707 -0.707 0.707
+ \setchemicalrotation 2 0 -1 -1 0 0 1 1 0
+ \setchemicalrotation 3 -0.707 0.707 0.707 0.707 0.707 -0.707 -0.707 -0.707
+ \else
+ \setchemicalrotation 1 .866 -.5 -.5 -.866 -.866 .5 .5 .866
+ \setchemicalrotation 2 -.259 .966 .966 .259 .259 -.966 -.966 -.259
+ \setchemicalrotation 3 -.5 -.866 -.866 .5 .5 .866 .866 -.5
+ \fi
+ \setchemicalrotation 4 0.707 -0.707 -0.707 -0.707 -0.707 0.707 0.707 0.707
+ \setchemicalrotation 5 -0.707 -0.707 -0.707 0.707 0.707 0.707 0.707 -0.707
+ \setchemicalrotation 6 0 1 1 0 0 -1 -1 0
+ %
+ \ifNEWMANstagger
+ \setchemicalangle 1 315 45 135 225
+ \setchemicalangle 2 90 180 270 0
+ \setchemicalangle 3 225 315 45 135
+ \else
+ \setchemicalangle 1 30 120 210 300
+ \setchemicalangle 2 255 345 75 165
+ \setchemicalangle 3 120 210 300 30
+ \fi
+ \setchemicalangle 4 45 135 225 315
+ \setchemicalangle 5 135 225 315 45
+ \setchemicalangle 6 270 0 90 180
+ %
+ \setchemicaltranslate 1 -1500 0
+ \setchemicaltranslate 2 0 1500
+ \setchemicaltranslate 3 1500 0
+ \setchemicaltranslate 4 0 -1500
+ %
+ \setchemicallinesegment B1 0 0 1000 0
+ \setchemicallinesegment B2 0 0 1000 0
+ \setchemicallinesegment B3 0 0 1000 0
+ \setchemicallinesegment B4 500 0 1000 0
+ \setchemicallinesegment B5 500 0 1000 0
+ \setchemicallinesegment B6 500 0 1000 0
+ %
+ \setchemicaltextelement Z 1100 0
+ %
+ \setchemicalcircsegment C 0 360 500 360 0 -500
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [STAGGER????=>{\executechemicalNEWMANSTAGGER[#1]},
+ ECLIPSE????=>{\executechemicalNEWMANECLIPSE[#1]},
+ B????=>\processlocalchemicals{B1..6},
+ CB????=>\processlocalchemicals{B1..6,C,Z1..6},
+ C????=>\processchemicalcircsegment{C}{1????},
+ ROT##4=>\processchemicalrotation{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ B##2##3##4=>\processprivatechemicallinesegment{B}{##2##3##4},
+ Z##2##3##4=>\ifNEWMANstagger
+ \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
+ {l,t,r,l,r,b, l,r,l,r,r,l, r,b,l,r,l,t, r,l,r,l,l,r}%
+ \else
+ \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
+ {l,r,t,t,r,b, t,b,r,r,b,l, r,l,b,b,l,t, b,t,l,l,t,r}%
+ \fi,
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalCHAIR[#1]% smaller
+ {\setchemicalname CHAIR
+ %
+ \setchemicalmaximum 6
+ %
+ \setchemicallinesegment B1 1600 800 2800 -800
+ \setchemicallinesegment B2 2800 -800 800 0
+ \setchemicallinesegment B3 800 0 -1600 -800
+ \setchemicallinesegment B4 -1600 -800 -2800 800
+ \setchemicallinesegment B5 -2800 800 -800 0
+ \setchemicallinesegment B6 -800 0 1600 800
+ %
+ \setchemicallinesegment +R1 1600 800 1600 1600
+ \setchemicallinesegment +R2 2800 -800 2800 -1600
+ \setchemicallinesegment +R3 800 0 800 800
+ \setchemicallinesegment +R4 -1600 -800 -1600 -1600
+ \setchemicallinesegment +R5 -2800 800 -2800 1600
+ \setchemicallinesegment +R6 -800 0 -800 -800
+ %
+ \setchemicallinesegment -R1 1600 800 2350 522 % 750 278
+ \setchemicallinesegment -R2 2800 -800 3493 -400
+ \setchemicallinesegment -R3 800 0 1329 -600 % 528 600
+ \setchemicallinesegment -R4 -1600 -800 -2350 -522 % 750 278
+ \setchemicallinesegment -R5 -2800 800 -3493 400
+ \setchemicallinesegment -R6 -800 0 -1329 600 % 528 600
+ %
+ \setchemicaltextelement +RZ1 1600 1800
+ \setchemicaltextelement +RZ2 2800 -1800
+ \setchemicaltextelement +RZ3 800 1000
+ \setchemicaltextelement +RZ4 -1600 -1800
+ \setchemicaltextelement +RZ5 -2800 1800
+ \setchemicaltextelement +RZ6 -800 -1000
+ %
+ \setchemicaltextelement -RZ1 2538 453 % 200 lang
+ \setchemicaltextelement -RZ2 3666 -300
+ \setchemicaltextelement -RZ3 1460 -750
+ \setchemicaltextelement -RZ4 -2538 -453
+ \setchemicaltextelement -RZ5 -3666 300
+ \setchemicaltextelement -RZ6 -1460 750
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\def\chemicalrotation{1}%
+ \processaction
+ [##1##2##3##4##5]
+ [ B????=>\processlocalchemicals{B1,B2,B3,B4,B5,B6},
+ -R????=>\processlocalchemicals{-R1,-R2,-R3,-R4,-R5,-R6},
+ +R????=>\processlocalchemicals{+R1,+R2,+R3,+R4,+R5,+R6},
+ B##2????=>{\getchemicallinesegment[0][B##2]},
+ -RZ##4????=>{\getchemicalfixedtextelement[-RZ##4][1][##4][l,l,tc,r,r,bc][#1]},
+ +RZ##4????=>{\getchemicalfixedtextelement[+RZ##4][1][##4][c][#1]},
+ -R##3????=>{\getchemicallinesegment[0][-R##3]},
+ +R##3????=>{\getchemicallinesegment[0][+R##3]},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalarrow#1#2[#3]%
+ {\dogetcommalistelement1\from#3\to\toptext
+ \dogetcommalistelement2\from#3\to\bottext
+ \def\dochemicaltext##1%
+ {\dosetsubscripts%
+ $\@@dochemicalstyle{\@@localchemicalformat\strut##1}$%
+ \doresetsubscripts}%
+ \doifelse\@@chemicallocation\v!intext
+ {#1{\dochemicaltext\toptext}}%
+ {\setbox\chemicalsymbols=\hbox
+ {\box\chemicalsymbols
+ \vbox{\halign{##\cr
+ \hbox to 3em{\hss\dochemicaltext{\toptext}\hss}\cr
+ #2%
+ \hbox to 3em{\hss\dochemicaltext{\bottext}\hss}\cr}}}}}
+
+\def\executechemicalGIVES
+ {\executechemicalarrow
+ {\chemicalsinglepicturearrow}% nodig
+ {\rightarrowfill\cr}}
+
+\def\executechemicalEQUILIBRIUM
+ {\executechemicalarrow
+ {\chemicaldoublepicturearrow}% nodig
+ {\rightarrowfill\cr\leftarrowfill\cr}}
+
+\def\executechemicalMESOMERIC
+ {\executechemicalarrow
+ {\chemicalsinglepicturearrow}% nodig
+ {$\leftarrow\hskip-1em$\rightarrowfill\cr}}
+
+\def\executechemicalsign#1[#2]%
+ {\doifelse\@@chemicallocation\v!intext
+ {\dosetsubscripts
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$%
+ \doresetsubscripts}
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols
+ \dosetsubscripts
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$%
+ \doresetsubscripts}}}
+
+\def\executechemicalPLUS
+ {\executechemicalsign{+}}
+
+\def\executechemicalMINUS
+ {\executechemicalsign{-}}
+
+\def\executechemicalEQUAL
+ {\executechemicalsign{=}}
+
+\def\executechemicalSPACE[#1]%
+ {\doifnot\@@chemicallocation\v!intext
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols
+ \quad}}}
+
+\def\executechemicalCHEM[#1]%
+ {\doifnot\@@chemicallocation\v!intext
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$}}}
+
+\def\executechemicalTEXT[#1]%
+ {\doifnot\@@chemicallocation\v!intext
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols#1}}}
+
+%\def\executechemicalLOW[#1]%
+% {\setlowsubscripts}
+%
+%\def\executechemicalHIGH[#1]%
+% {\sethighsubscripts}
+
+\def\putchemicalrule#1#2#3#4%
+ {\ifcase\chemicaldrawingmode
+ \putrule from {#1} {#2} to {#3} {#4}
+ \or
+ \psline(#1,#2)(#3,#4)%
+ \or
+ \bgroup
+ \!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ draw z1--z2 ;
+ \stopMPdrawing
+ \egroup
+ \fi}
+
+\def\executechemicalcomplex#1%
+ {\bgroup
+ \putchemicalrule {0} {-\@@chemicalbottom} {0} {\@@chemicaltop}%
+ \putchemicalrule {0} {\@@chemicaltop} {#1150} {\@@chemicaltop}%
+ \putchemicalrule {0} {-\@@chemicalbottom} {#1150} {-\@@chemicalbottom}%
+ \egroup}
+
+\def\executechemicalOPENCOMPLEX[#1]%
+ {\executechemicalcomplex+\ignorespaces
+ \executechemicalSPACE[]}
+
+\def\executechemicalCLOSECOMPLEX[#1]%
+ {\executechemicalSPACE[]%
+ \executechemicalcomplex-\ignorespaces}
+
+% nog niet door midden as!
+
+\def\executechemicalverticalsymbol#1#2%
+ {\executechemicalTEXT
+ [$\left#1\relax
+ \dimen0=\@@chemicalunit
+ \scratchcounter=\@@chemicaltop
+ \advance\scratchcounter by \@@chemicalbottom
+ \dimen0=\scratchcounter\dimen0
+ \vcenter to \dimen0{}
+ \dimen2=\@@chemicalunit
+ \dimen2=\@@chemicalright\dimen0
+ \vcenter{\leftskip1em\hsize\dimen2\relax\strut#2\strut}%
+ \right.$]}%
+
+\def\executechemicalUPARROW[#1]%
+ {\executechemicalverticalsymbol\uparrow{#1}}
+
+\def\executechemicalDOWNARROW[#1]%
+ {\executechemicalverticalsymbol\downarrow{#1}}
+
+\def\executechemicalUPDOWNARROW[#1]%
+ {\executechemicalverticalsymbol\updownarrow{#1}}
+
+\let\setchemicalattributes\relax
+
+\setupchemical
+ [\c!width=0,
+ \c!height=0,
+ \c!left=0,
+ \c!right=0,
+ \c!top=0,
+ \c!bottom=0,
+ \c!bodyfont=\the\bodyfontsize,
+ \c!resolution=\outputresolution,
+ \c!scale=\v!medium,
+ \c!size=\v!medium,
+ \c!textsize=\v!big,
+ \c!frame=\v!off,
+ \c!axis=\v!off,
+ \c!state=\v!start,
+ \c!style=\rm,
+ \c!location=,
+ \c!option=,
+ \c!offset=LOW,
+ \c!alternative=1,
+ \c!color=,
+ \c!rulethickness=,
+ \c!rulecolor=,
+ \c!factor=1]
+
+% Tijdelijk plaatsen we deze extra macro's hier.
+%
+% mathontop: \mtop {} {}
+% textontop: \ttop {} {}
+
+\def\putontop#1#2%
+ {\vbox
+ {\halign
+ {\strut\hss##\hss\cr
+ #1\cr
+ #2\cr}}}
+
+\def\ttop#1#2%
+ {\putontop{\tx#1}{#2}}
+
+\def\mtop#1#2%
+ {\vbox
+ {\offinterlineskip
+ \halign
+ {\hss##\hss\cr
+ $\scriptscriptstyle#1$\cr
+ \noalign{\vskip.5ex}%
+ $#2$\cr}}}
+
+\def\ctop#1#2%
+ {\vbox
+ {\offinterlineskip
+ \halign
+ {\hss##\hss\cr
+ $\@@dochemicalstyle{\@@localchemicalformat\scriptscriptstyle#1}$\cr
+ \noalign{\vskip.5ex}%
+ $\@@dochemicalstyle{\@@localchemicalformat#2}$\cr}}}
+
+%D Here are a couple of \CONTEXT\ goodies:
+%D
+%D \startitemize
+%D \item styles hooked into \CONTEXT\ style mechanism
+%D \item support for color and rulethickness (mp mode only)
+%D \item position tracking
+%D \stopitemize
+
+\ifCONTEXT \else \protect \endinput \fi
+
+\let\@@chemicalrulecolor\empty
+\let\@@chemicalcolor \empty
+
+% \def\setchemicalattributes
+% {\scratchdimen\@@chemicalchemicalrulethickness
+% \def\chemicalattributes
+% {withpen pencircle scaled \the\scratchdimen\space
+% withcolor }%
+% \doifelsenothing\@@chemicalchemicalrulecolor
+% {\edef\chemicalattributes{\chemicalattributes black}}
+% {\edef\chemicalattributes{\chemicalattributes \MPcolor{\@@chemicalchemicalrulecolor}}}%
+% \startMPdrawing
+% drawoptions (\chemicalattributes) ;
+% \stopMPdrawing}
+
+\def\setchemicalattributes
+ {\scratchdimen\@@chemicalrulethickness
+ \def\chemicalattributes
+ {withpen pencircle scaled \the\scratchdimen\space
+ withcolor }%
+ \doifelsenothing\@@chemicalrulecolor
+ {\edef\chemicalattributes{\chemicalattributes black}}
+ {\edef\chemicalattributes{\chemicalattributes \MPcolor{\@@chemicalrulecolor}}}%
+ \startMPdrawing
+ drawoptions (\chemicalattributes) ;
+ \stopMPdrawing}
+
+\def\@@dochemicalcolor
+ {\doifsomething\@@chemicalcolor{\color[\@@chemicalcolor]}}
+
+\def\@@dochemicalstyle
+ {\doconvertfont\@@chemicalstyle}
+
+\setupchemical
+ [\c!rulethickness=\linewidth,
+ \c!rulecolor=,
+ \c!color=]
+
+\def\cpos#1#2%
+ {\iftrialtypesetting
+ #2%
+ \else
+ \bgroup
+ \globalpushmacro\dowithchemical
+ \gdef\dowithchemical##1{\hpos{#1}{##1}\globalpopmacro\dowithchemical}%
+ #2%
+ \egroup
+ \fi}
+
+\protect \endinput
+
+% \startchemical[axis=on,frame=yes]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
+
+% \startchemical[size=big,scale=small,axis=on,frame=yes,factor=1.5]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
+
+% \startchemical[size=big,scale=medium,axis=on,frame=yes,factor=1.5]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
+
+% \startchemical[size=big,scale=big,axis=on,frame=yes,factor=1.5]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
+
diff --git a/tex/context/base/ppchtex.mkiv b/tex/context/base/ppchtex.mkiv
new file mode 100644
index 000000000..e81551eea
--- /dev/null
+++ b/tex/context/base/ppchtex.mkiv
@@ -0,0 +1,3460 @@
+%D \module
+%D [ file=ppchtex (m-chemie),
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten},
+%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% option=test => boxes
+% dummy => file
+% final => file / local run
+%
+% constante van phantom in definitie ONE: \setchemicaltextwidth 300
+%
+% it would be interesting to rewrite this module with todays
+% experiences and new context functionality, maybe ...
+
+% Deze module ondersteunt het zetten van chemische
+% (structuur)formules. Hoewel de macro' zijn afgestemd op
+% CONTEXT, zijn ze ook buiten deze zetomgeving te gebruiken.
+%
+% Dit is, afgezien van updates, de definitieve versie van
+% PPCHTEX. Gebruikersgemak, eenvoud, flexibiliteit, en
+% snelheid zijn inmiddels redelijk geoptimaliseerd. Dit neemt
+% niet weg dat hier en daar nog verbetering mogelijk is. Dit
+% zal dan ook nog gebeuren.
+%
+% Volgende versies zullen tenminste dezelfde functionaliteit
+% hebben. We houden ons natuurlijk het recht voor de kwaliteit
+% van de output te verbeteren. Daarnaast staan nog op het
+% wensenlijstje:
+%
+% - optimaliseren in termen van proces-tijd
+% - aanpassen naamgeving van interne macro's
+% - toevoegen van functionaliteit
+% - in \x!-vorm omzetten van GIVES, TB enz.
+%
+% De mix tussen engels en nederlands lijkt soms verwarrend.
+% Meestal zijn verborgen macro's engels en zichtbare macro's
+% nederlands. Het gebruik van [ ] en { } sluit aan op andere
+% Context-macro's. Hetzelfde geldt voor instellingen en
+% \start-\stop-constructies.
+%
+% De schijnbaar overbodige \bgroup-\egroup constructie
+% garandeert aansluiting bij de Context-macro's voor het
+% plaatsen van figuren, tabellen en andere floats.
+%
+% Binnen Context worden de macro's geladen met
+% \gebruikextras[chemie]. Daarbij wordt een passende melding
+% getoont. Buiten Context genereren we een melding:
+
+\doifundefined{usemodule}
+ {\writestatus{loading}{ConTeXt Chemical Macro's / 1996.3.1}}
+
+% Er kan gebruik worden gemaakt van PiCTeX of PStricks. Een
+% van deze pakketten moet van te voren zijn geladen.
+%
+% \input prepictex.tex (i.g.v. LaTeX)
+% \input pictex.tex
+% \input postpictex.tex (i.g.v. LaTeX)
+%
+% of:
+%
+% \input multido.tex
+% \input pstricks.tex
+% \input pst-plot.tex
+%
+% In \CONTEXT\ kan men de modules m-pictex en m-pstricks
+% gebruiken. De eerste module laad of efficiente wijze PiCTeX
+% en de tweede module koppelt het PSTRICKS kleurmechanisme
+% aan dat van \CONTEXT.
+%
+
+% PSTricks: {-\chemicalangle} instead of {*0}, which produces
+% faulty ps code when \chemicalangle=0
+
+\startcommands dutch english german
+
+ gotochemical: naarchemie gotochemical zurchemie
+ setupchemical: stelchemiein setupchemical stellechemieein
+ startchemical: startchemie startchemical startchemie
+ stopchemical: stopchemie stopchemical stopchemie
+ definechemical: definieerchemie definechemical definierechemie
+ chemical: chemie chemical chemie
+ toptext: boventekst toptext textueber
+ bottext: ondertekst bottext textunter
+ midtext: middentekst midtext textmitte
+
+\stopcommands
+
+\doifundefined{fiverm} % In the more recent LaTeX versions
+ {\font\fiverm=cmr5 } % \fiverm is no longer (pre)defined.
+
+\doifdefinedelse{beginpicture} % PiCTeX
+ {\doifdefinedelse{startMPdrawing}
+ {\chardef\chemicaldrawingmode=2 } % MetaPost
+ {\chardef\chemicaldrawingmode=0 }} % raw
+ {\doifdefinedelse{psaxes}
+ {\chardef\chemicaldrawingmode=1 } % PSTricks
+ {\chardef\chemicaldrawingmode=3 }} % unknown
+
+\ifcase\chemicaldrawingmode
+ \writestatus{ppchtex}{using PiCTeX}
+\or
+ \writestatus{ppchtex}{using PSTricks (still experimental)}
+ \writestatus{ppchtex}{automatic sizing not (yet) supported}
+\or
+ \writestatus{ppchtex}{using PiCTeX and MetaPost}
+\else
+ \writestatus{ppchtex}{load PiCTeX (+pre/post) or PSTricks (+pst_plot) first}
+ \bgroup
+ \read16 to \exit
+ \egroup
+ \expandafter\endinput
+\fi
+
+%I n=Chemie
+%I c=\stelchemiein,\chemie
+%I
+%I Chemische formules kunnen worden gezet met behulp van de
+%I onderstaande commando's:
+%I
+%I buiten $ en $$ :
+%I
+%I \chemie[segmenten][symbolen]
+%I
+%I \startchemie[instellingen]
+%I \chemie...
+%I \chemie...
+%I \stopchemie
+%I
+%I en binnen $ en $$:
+%I
+%I \chemie{}{}
+%I
+%I Voor tekst, uitleg en voorbeelde verwijzen we vooralsnog
+%I naar de handleiding.
+%P
+%I Het gedrag van de macro's kan worden ingesteld met:
+%I
+%I \stelchemiein[breedte=,hoogte=,links=,rechts=,boven=,
+%I onder=,korps=,schaal=,status=,assenstelsel=,kader=,
+%I variant=,optie=,formaat=,tekstformaat=,resolutie=,
+%I offset=,letter=]
+%I
+%I Structuren kunnen worden voorgedefinieerd met het commando
+%I
+%I \definieerchemie[naam]{\chemie...}
+
+%S \startsetup
+%S \command
+%S [\!stelchemiein]
+%S \type
+%S [\c!vars!]
+%S \variable
+%S [\c!breedte]
+%S [\c!number!,\v!passend]
+%S [0]
+%S \variable
+%S [\c!hoogte]
+%S [\c!number!,\v!passend]
+%S [0]
+%S \variable
+%S [\c!links]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!rechts]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!boven]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!onder]
+%S [\c!number!]
+%S [0]
+%S \variable
+%S [\c!resolutie]
+%S [\c!number!]
+%S [\outputresolution]
+%S \variable
+%S [\c!korps]
+%S [10pt,11pt,12pt]
+%S [\bodyfontsize]
+%S \variable
+%S [\c!schaal]
+%S [\v!klein,\v!middel,\v!groot]
+%S [\v!middel]
+%S \variable
+%S [\c!formaat]
+%S [\v!klein,\v!middel,\v!groot]
+%S [\v!groot]
+%S \variable
+%S [\c!tekstformaat]
+%S [\v!klein,\v!middel,\v!groot]
+%S [\v!groot]
+%S \variable
+%S [\c!status]
+%S [\v!start,\v!stop]
+%S [\v!start]
+%S \variable
+%S [\c!kader]
+%S [\v!aan,\v!uit]
+%S [\v!uit]
+%S \variable
+%S [\c!assenstelsel]
+%S [\v!aan,\v!uit]
+%S [\v!uit]
+%S \variable
+%S [\c!optie]
+%S [\v!test]
+%S []
+%S \variable
+%S [\c!variant]
+%S [1,2]
+%S [1]
+%S \variable
+%S [\c!offset]
+%S [HIGH,LOW]
+%S [LOW]
+%S \variable
+%S [\c!letter]
+%S [\c!command!]
+%S [\rm]
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [\v!startchemie]
+%S \type
+%S [\c!vars!\c!stp!]
+%S \inheritvariable
+%S [\v!stelchemiein]
+%S []
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [\v!chemie]
+%S \type
+%S [\c!vals!\c!vals!]
+%S \value
+%S [\c!list!]
+%S []
+%S \value
+%S [\c!list!]
+%S []
+%S \stopsetup
+
+%S \startsetup
+%S \command
+%S [definieerchemie]
+%S \type
+%S [\c!val!\c!arg!]
+%S \value
+%S [\c!text!]
+%S []
+%S \stopsetup
+
+\unprotect
+
+% Om te voorkomen dat sub- en superscripts botsen passen we
+% wat fontdimen's aan (Knuth, The TeXBook, p179). Helaas
+% kunnen deze instellingen niet lokaal worden gehouden door
+% groeperen, vandaar dat een en ander moet worden geset n
+% gereset.
+%
+% Er dient een relatie te worden gelegd met de afmetingen
+% van de letters. In een eerdere versie werden daartoe de
+% \fontdimen's opgehoogd. Omdat dit problemen gaf bij
+% scaled fonts, is bij nader inzien gekozen voor de
+% onderstaande oplossing, waarbij de nieuwe waarden worden
+% afgeleid van de x-height (\fontexheight). De factor 0.70
+% is min of meer experimenteel vastgesteld. Soms worden de
+% regels iets verder uit elkaar gezet. Jammer. Italic fonts
+% hebben grotere cijfers en vallen min of meer uit de boot.
+
+\newif\ifloweredsubscripts
+
+% Due to some upward incompatibality of LaTeX to LaTeX2.09
+% and/or LaTeX2e we had to force \@@dochemicalstyle. Otherwise
+% some weird \nullfont error comes up.
+
+\def\beginlatexmathmodehack
+ {\ifmmode
+ \let\endlatexmathmodehack=\relax
+ \else
+ \def\endlatexmathmodehack{$}$\@@dochemicalstyle\empty
+ \fi}
+
+\def\setsubscripts
+ {\beginlatexmathmodehack
+ \def\dosetsubscript##1##2##3%
+ {\dimen0=##3\fontexheight##2%
+ \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
+ ##1##2=\dimen0\relax}%
+ \def\dodosetsubscript##1##2%
+ {\dosetsubscript{##1}{\textfont 2}{##2}%
+ \dosetsubscript{##1}{\scriptfont 2}{##2}%
+ \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
+ %dodosetsubscript\mathsupnormal {?}%
+ \dodosetsubscript\mathsubnormal {.7}%
+ \dodosetsubscript\mathsubcombined{.7}%
+ \global\loweredsubscriptstrue
+ \endlatexmathmodehack}
+
+\def\resetsubscripts
+ {\ifloweredsubscripts
+ \beginlatexmathmodehack
+ \def\doresetsubscript##1##2%
+ {\dimen0=\getvalue{@@\string##1\string##2}\relax
+ ##1##2=\dimen0}%
+ \def\dodoresetsubscript##1%
+ {\doresetsubscript{##1}{\textfont2}%
+ \doresetsubscript{##1}{\scriptfont2}%
+ \doresetsubscript{##1}{\scriptscriptfont2}}%
+ %dodoresetsubscript\mathsupnormal
+ \dodoresetsubscript\mathsubnormal
+ \dodoresetsubscript\mathsubcombined
+ \global\loweredsubscriptsfalse
+ \endlatexmathmodehack
+ \fi}
+
+\ifx\Umathchar\undefined \else
+ % for the moment we nil them, soon we will have a proper
+ % way to deal with this
+ \let\setsubscripts \relax
+ \let\resetsubscripts\relax
+\fi
+
+\def\doresetsubscripts
+ {\resetsubscripts}
+
+\def\sethighsubscripts
+ {\resetsubscripts
+ \let\dosetsubscripts=\relax}
+
+\def\setlowsubscripts
+ {\def\dosetsubscripts{\setsubscripts}}
+
+\setlowsubscripts
+
+\newcount\horchemical % t.z.t. \newcounter
+\newcount\verchemical % t.z.t. \newcounter
+\newcount\txtchemical % t.z.t. \newcounter
+\newcount\levchemical % t.z.t. \newcounter
+
+\newif\ifinchemical \inchemicalfalse
+\newif\iffixedchemical \fixedchemicalfalse
+
+\newbox\chemicalsymbols
+
+% Eigenlijk moeten de constanten en variabelen in cont-nl.tex
+% staan. Dit pakket is echter relatief onafhankelijk van CONTEXT.
+
+\definesystemvariable {chemical}
+
+\definesystemconstant {chemical}
+
+\definesystemconstant {translate}
+\definesystemconstant {distance}
+\definesystemconstant {mirror}
+\definesystemconstant {rotate}
+\definesystemconstant {substitute}
+\definesystemconstant {angle}
+
+\definesystemconstant {executechemical}
+\definesystemconstant {chemicaltextelement}
+\definesystemconstant {chemicallinesegment}
+\definesystemconstant {chemicalcircsegment}
+
+\def\chemicalspace {\quad}
+
+% begin van experiment:
+%
+% De onderstaande twee macro's kunnen worden gebruikt voor
+% bijvoorbeeld een interactiemechanisme.
+%
+% \localgotochemical {verwijzing} {tekst}
+% \localthisischemical {verwijzing}
+
+\def\dowithchemical%
+ {}
+
+\doifdefinedelse{@@iastate}
+ {\def\localgotochemical#1#2{\naarbox{#2}[#1]}%
+ \def\localthisischemical#1{\pagereference[#1]}}
+ {\def\localgotochemical#1{}%
+ \def\localthisischemical#1{}}
+
+% eind van experiment
+
+\def\setchemicalmaximum #1
+ {\def\maxchemical{#1}}
+
+\def\doifchemicalnumber#1#2#3%
+ {\doifnumberelse{#1}
+ {\ifnum#1>\maxchemical\relax
+ \writestatus{ppchtex}{number #1 is skipped}%
+ \else
+ #3%
+ \fi}
+ {\unknownchemical{#2}}}%
+
+\newif\ifsmallchemicaltext
+
+\let\@@localchemicalstyle\empty
+
+\unexpanded\def\setupchemicalformat[#1]%
+ {\processaction
+ [\getvalue{#1\c!size}]
+ [ \v!small=>\def\@@localchemicalformat{\scriptscriptstyle},
+ \v!medium=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
+ \v!big=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
+ \s!unknown=>\def\@@localchemicalformat{\getvalue{#1\c!size}}]%
+ \processaction
+ [\getvalue{#1\c!textsize}]
+ [ \v!small=>\def\@@localchemicalstyle{\scriptscriptstyle},
+ \v!medium=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
+ \v!big=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
+ \s!unknown=>\def\@@localchemicalstyle{\getvalue{#1\c!textsize}}]%
+ \processaction
+ [\getvalue{#1\c!scale}]
+ [ \v!small=>\def\@@localchemicalscale{500},
+ \v!medium=>\def\@@localchemicalscale{625},
+ \v!big=>\def\@@localchemicalscale{750},
+ \s!unknown=>\def\@@localchemicalscale{\getvalue{#1\c!scale}}]}
+
+\def\@@currentchemicalformat
+ {\ifinchemical
+ \@@localchemicalformat
+ \else
+ \@@localchemicalstyle
+ \fi}
+
+\def\dosetupchemical[#1]%
+ {\getparameters[\??chemical\s!chemical][#1]%
+ \doifelse{\@@chemicalchemicaloffset}{LOW}
+ {\setlowsubscripts}
+ {\sethighsubscripts}%
+ \setupchemicalformat[\??chemical\s!chemical]%
+ \ignorespaces}
+
+\unexpanded\def\setupchemical
+ {\dosingleargument\dosetupchemical}
+
+\def\@@dochemicalstyle% % default mapping
+ {\@@chemicalstyle}
+
+\def\@@dochemicalcolor% % no mapping yet
+ {}
+
+\def\@@chemicalstyle % $inner-style$ % (overloaded)
+ {\@@chemicalchemicalstyle} % $$outer-style$$
+
+\def\@@writechemicalstate#1#2%
+ {}
+
+\def\@@beginchemicallocalpicture
+ {\ifcase\chemicaldrawingmode
+ \beginpicture
+ \or
+ \pspicture(0,0)(0,0) % is this permitted ?
+ \or
+ \pushMPdrawing
+ \startMPdrawing
+ %prologues := 1 ;
+ %input mp-tool ;
+ u := 10*\@@chemicalunit;
+ bboxmargin := 0pt ;
+ pickup pencircle scaled 2u ; % ???
+ \stopMPdrawing
+ \beginpicture
+ \fi}
+
+\def\@@endchemicallocalpicture#1#2%
+ {\ifcase\chemicaldrawingmode
+ \endpicture
+ \or
+ \endpspicture
+ \or
+ \resetchemicalcoordinates
+ \setbox2\hbox{\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
+ \wd2=\!!zeropoint
+ \ht2=\!!zeropoint
+ \dp2=\!!zeropoint
+ \put {\box2} at 0 0
+ \endpicture
+ \popMPdrawing
+ \fi}
+
+\def\@@beginchemicalpicture#1#2#3#4%
+ {\ifnum\chemicaldrawingmode=1
+ \pspicture(#1,#3)(#2,#4)%
+ \def\account##1##2{}%
+ \psaxes[axesstyle=none,labels=none,ticks=none](#1,#3)(#2,#4)%
+ \else
+ \beginpicture
+ \setplotarea
+ x from {#1} to {#2},
+ y from {#3} to {#4}
+ \iffixedchemical
+ \accountingon
+ \def\account##1##2%
+ {\put {} at {##1} {##2} }%
+ \else
+ \accountingoff
+ \def\account##1##2{}%
+ \fi
+ \fi
+ \ignorespaces}
+
+\def\@@endchemicalpicture%
+ {\ifcase\chemicaldrawingmode
+ \put {\box\chemicalsymbols} at 0 0 % elders
+ \endpicture
+ \or
+ \rput(0,0){\box\chemicalsymbols}%
+ \endpspicture
+ \or
+ \put {\box\chemicalsymbols} at 0 0 % elders
+ \ifMPdrawingdone
+ \resetchemicalcoordinates
+ \setbox2\hbox{\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
+ \wd2=\!!zeropoint
+ \ht2=\!!zeropoint
+ \dp2=\!!zeropoint
+ \put {\box2} at 0 0 %
+ \fi
+ \endpicture
+ \fi}
+
+\def\@@setchemicalcoordinatesystem#1%
+ {\edef\@@chemicalunit{#1}%
+ \ifcase\chemicaldrawingmode
+ \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit> %
+ \or
+ \psset{unit=\@@chemicalunit}%
+ \or
+ \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit> %
+ \startMPdrawing
+ %input mp-tool ;
+ %prologues := 1 ;
+ u := 10*#1;
+ bboxmargin := 0pt ;
+ pickup pencircle scaled 2u ; % ???
+ \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
+ bottom shiftedto y=0
+ ticks from {#1} to {#2} by 500 /
+ \axis
+ left shiftedto x=0
+ ticks from {#3} to {#4} by 500 / %
+ \or
+ \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;
+ draw z1--(x2,y1)--z2--(x1,y2)--cycle ;
+ d := 50u ; dd := 10u ;
+ draw (x1,0)--(x2,0) ;
+ draw (0,y1)--(0,y2) ;
+ for i=d step -d until x1: draw (i,dd)--(i,-dd) ; endfor ;
+ for i=d step d until x2: draw (i,dd)--(i,-dd) ; endfor ;
+ for i=d step -d until y1: draw (-dd,i)--(dd,i) ; endfor ;
+ for i=d step d until y2: draw (-dd,i)--(dd,i) ; endfor ;
+ \stopMPdrawing
+ \fi}
+
+\def\@@setsecondchemicalplotsymbol%
+ {\ifcase\chemicaldrawingmode
+ \!!widtha=50.8mm
+ \divide\!!widtha by \@@chemicalresolution\relax
+ \plotsymbolspacing=\!!widtha
+ \setplotsymbol({\vrule\!!height\!!widtha\!!width\!!widtha})%
+ \fi}
+
+% Something for Dirk:
+
+\newcount \currentchemical
+
+%\newif \ifskipchemical
+
+\def\setchemicaldimensions#1#2#3%
+ {\bgroup
+ \global\advance\currentchemical by 1
+ \dimen0=#1\relax
+ \dimen2=#2\relax
+ \dimen4=#3\relax
+ \setxvalue{chemical::\the\currentchemical}%
+ {\noexpand\docommand{\the\dimen0}{\the\dimen2}{\the\dimen4}}%
+ \egroup}
+
+\ifx\normalchemicalframe\undefined
+ \let\normalchemicalframe\hbox % hook for educational purposes
+\fi
+
+\unexpanded\def\complexstartchemical[#1]%
+ {\copyparameters
+ [\??chemical][\??chemical\s!chemical]
+ [\c!width,\c!height,\c!left,\c!right,\c!top,\c!bottom,
+ \c!bodyfont,\c!size,\c!scale,\c!state,\c!frame,\c!axis,\c!factor,
+ \c!location,\c!option,\c!alternative,\c!resolution,\c!offset,\c!style,
+ \c!color,\c!rulecolor,\c!rulethickness]%
+ \getparameters
+ [\??chemical]
+ [#1]%
+ %
+ \setupchemicalformat[\??chemical]%
+ %
+ \ifnum\chemicaldrawingmode=2
+ \resetMPdrawing
+ \fi
+ %
+ \doif{\@@chemicalalternative}{2}
+ {\@@setsecondchemicalplotsymbol}%
+ %
+ \doif{\@@chemicalaxis}\v!on
+ {\let\chemicalframe\hbox}%
+ %
+ \!!counta=250000
+ \divide\!!counta by \@@localchemicalscale
+ \!!widtha=\@@chemicalbodyfont
+ \divide\!!widtha by \!!counta
+ \@@setchemicalcoordinatesystem{\the\!!widtha}%
+ %
+ % \!!counta = -x \!!countc = -y
+ % \!!countb = +x \!!countd = +y
+ %
+ \def\calculateaxis##1##2##3##4##5%
+ {##1=##3\relax
+ ##2=##4\relax
+ \ifnum##5=0
+ \ifnum##3=0
+ \ifnum##4=0
+ ##1=2000
+ ##2=2000
+ \fi
+ \fi
+ \else
+ \ifnum##3=0
+ \ifnum##4=0
+ ##1=##5\relax
+ \divide##1 by 2
+ ##2=##1\relax
+ \else
+ ##1=##5\relax
+ \advance##1 by -##2\relax
+ \fi
+ \else
+ \ifnum##4=0
+ ##2=##5\relax
+ \advance##2 by -##1\relax
+ \fi
+ \fi
+ \fi}%
+ \fixedchemicalfalse
+ \doif\@@chemicalwidth\v!fit
+ {\edef\@@chemicalwidth
+ {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}%
+ \fixedchemicaltrue}%
+ \doif\@@chemicalheight\v!fit
+ {\edef\@@chemicalheight
+ {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}%
+ \fixedchemicaltrue}%
+ \doifelse\@@chemicallocation\v!intext
+ {\!!counta=0 \!!countb=0
+ \!!counta=0 \!!countd=0 }
+ {\calculateaxis
+ \!!counta\!!countb
+ \@@chemicalleft\@@chemicalright\@@chemicalwidth
+ \calculateaxis
+ \!!countc\!!countd
+ \@@chemicalbottom\@@chemicaltop\@@chemicalheight}%
+ %
+ \edef\@@chemheight {\the\!!countc}%
+ \edef\@@chemdepth {\the\!!countd}%
+ \edef\@@chemicaltop {\the\!!countc}%
+ \edef\@@chemicalbottom{\the\!!countd}%
+ %
+ \doifinsetelse\v!on{\@@chemicalframe,\@@chemicalaxis}
+ {\def\@@chemicalborder{\chemicalframe}}
+ {\def\@@chemicalborder{\normalchemicalframe}}%
+ %
+ \setbox0=\hbox\bgroup % this was a \vbox which took \hsize
+ %
+ \@@beginchemicalpicture
+ {-\the\!!counta}{\the\!!countb}
+ {-\the\!!countc}{\the\!!countd}%
+ \doif{\@@chemicalstate}\v!start
+ {\doif\@@chemicalaxis\v!on
+ {\@@setchemicalaxis
+ {-\the\!!counta}{\the\!!countb}
+ {-\the\!!countc}{\the\!!countd}}}%
+ \doifelse\@@chemicaloption\v!test
+ {\def\@@writechemicalstate##1##2%
+ {\convertargument##2\to\ascii
+ \writestatus{##1}{\ascii}}}
+ {\def\@@writechemicalstate##1##2{}}%
+ \ignorespaces}
+
+\def\dostartchemical%
+ {\catcode`\^=\@@superscript% t.b.v. \enableduplication
+ \catcode`\_=\@@subscript % t.b.v. de zekerheid
+ \begingroup
+ \inchemicaltrue
+ \def\toptext##1{\gdef\thetoptext{##1}\ignorespaces}\toptext{}%
+ \def\bottext##1{\gdef\thebottext{##1}\ignorespaces}\bottext{}%
+ \def\midtext##1{\gdef\themidtext{##1}\ignorespaces}\midtext{}%
+ \def\@@chemicalpostponed{}%
+ \complexorsimpleempty\startchemical}
+
+\unexpanded\def\startchemical
+ {\bgroup % t.b.v. ungrouped floats
+ \dostartchemical}
+
+\unexpanded\def\stopchemical
+ {\checkchemicalpicture
+ \@@endchemicalpicture
+ \egroup
+ \ifnum\chemicaldrawingmode=1
+ \dimen0=\@@chemicalunit
+ \setbox0=\hbox{\lower\@@chemdepth\dimen0\box0}%
+ \ht0=\@@chemheight\dimen0
+ \dp0=\@@chemdepth\dimen0
+ \fi
+ \dimen0=\ht0
+ \advance\dimen0 by \dp0
+ \inchemicalfalse % enables \chemie{} in text
+ \setbox4=\alignedchemical\themidtext
+ \setbox6=\alignedchemical\thetoptext
+ \setbox8=\alignedchemical\thebottext
+ \setbox4=\hbox to \wd0
+ {\strut\hss$\vcenter{\box4}$\hss}%
+ \setbox2=\vbox to \dimen0
+ {\hbox to \wd0{\strut\hss\box6\hss}
+ \vfill
+ \hbox to \wd0{\strut\hss\box8\hss}
+ \vss}% disables the depth
+ \wd0=0pt \wd4=0pt
+ \ht2=\ht0 \dp2=\dp0
+ \ht4=\ht0 \dp4=\dp0
+ \@@chemicalborder{\box0\box4\box2}% text on top of chemicals
+ \endgroup
+ \ignorespaces
+ \egroup} % t.b.v. ungrouped floats
+
+\def\alignedchemical#1%
+ {\vtop
+ {\def\par{\egroup\hbox\bgroup\strut}%
+ \let\\=\par
+ \let\endgraf=\par
+ \hbox\bgroup\strut#1\egroup}}
+
+% \setchemicalcoordinates{#1}{#2}
+%
+% #1: verplaatsing in x-richting
+% #2: verplaatsing in y-richting
+
+\newif\ifchemicaldirection
+
+\def\checkchemicaldirection#1#2%
+ {\ifchemicaldirection
+ \ifnum#1>0 \advance\horchemical -\chemicaldirection \fi
+ \ifnum#1<0 \advance\horchemical +\chemicaldirection \fi
+ \ifnum#2>0 \advance\verchemical -\chemicaldirection \fi
+ \ifnum#2<0 \advance\verchemical +\chemicaldirection \fi
+ \chemicaldirectionfalse
+ \fi}
+
+\def\processchemicaldirection%
+ {\chemicaldirectiontrue\processchemicaltranslate}
+
+\def\setchemicalcoordinates#1#2%
+ {\advance\horchemical #1\relax
+ \advance\verchemical #2\relax
+ \checkchemicaldirection{#1}{#2}%
+ \!!counta=-\horchemical\edef\chemicalxoffset{\the\!!counta}%
+ \!!countb=-\verchemical\edef\chemicalyoffset{\the\!!countb}%
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
+ \fi}
+
+\def\resetchemicalcoordinates
+ {\horchemical=0
+ \verchemical=0
+ \edef\chemicalxoffset{0}%
+ \edef\chemicalyoffset{0}%
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \setcoordinatesystem point at 0 0
+ \fi}
+
+\def\restorechemicalcoordinates
+ {%\writestatus{ppchtex}{restoring \the\horchemical,\the\verchemical}%
+ \edef\chemicalxoffset{\the\horchemical}%
+ \edef\chemicalyoffset{\the\verchemical}%
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
+ \fi}
+
+\def\setchemicaltranslate #1 #2 #3
+ {\setvalue{\s!translate#1}{\setchemicalcoordinates{#2}{#3}}}
+
+\def\processchemicaltranslate#1%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{MOV#1}
+ {\ifnum##1=0
+ \def\chemicaloffset{0}% incompatible change
+ \resetchemicalcoordinates
+ \else
+ \getvalue{\s!translate##1}%
+ \dochemicaloffset{##1}%
+ \def\chemicaloffset{0}%
+ \fi}}%
+ \doprocess[#1]}
+
+\def\setchemicaldistance #1
+ {\setvalue{\s!distance1}{\setchemicalcoordinates{-#1}{ 0}}%
+ \setvalue{\s!distance2}{\setchemicalcoordinates{ 0}{ #1}}%
+ \setvalue{\s!distance3}{\setchemicalcoordinates{ #1}{ 0}}%
+ \setvalue{\s!distance4}{\setchemicalcoordinates{ 0}{-#1}}}
+
+\def\setchemicaldirection #1
+ {\def\chemicaldirection{#1}}
+
+\def\processchemicaldistance#1%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{ADJ#1}
+ {\ifnum##1=0
+ \resetchemicalcoordinates
+ \else
+ \def\@@chemicalpostponed{\getvalue{\s!distance##1}}%
+ \@@chemicalpostponed
+ \fi}}%
+ \doprocess[#1]}
+
+\def\setchemicalsubstitute #1
+ {\setvalue{\s!substitute1}{\setchemicalcoordinates{-#1}{ 0}}%
+ \setvalue{\s!substitute2}{\setchemicalcoordinates{ 0}{ #1}}%
+ \setvalue{\s!substitute3}{\setchemicalcoordinates{ #1}{ 0}}%
+ \setvalue{\s!substitute4}{\setchemicalcoordinates{ 0}{-#1}}}
+
+\def\processchemicalsubstitute#1%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{SUB#1}
+ {\ifnum##1=0
+ \resetchemicalcoordinates
+ \else
+ \def\@@chemicalpostponed{\getvalue{\s!substitute##1}}%
+ \@@chemicalpostponed
+ \fi}}%
+ \doprocess[#1]}
+
+% Het is mogelijk een offset of move meerdere malen uit te
+% voeren, door een nummer voor het commando te plaatsen.
+
+\def\chemicalrepeat {1}
+
+\def\redoprocesschemical[#1#2]%
+ {\doifinstringelse{#1}{0123456789.}
+ {\edef\chemicalrepeat{\chemicalrepeat#1}%
+ \redoprocesschemical[#2]}
+ {\processchemical[#1#2]%
+ \def\chemicalrepeat{1}}}
+
+\def\doprocesschemical[#1#2]#3%
+ {\doifinstringelse{#1}{0123456789.}
+ {\def\chemicalrepeat{#1}%
+ \redoprocesschemical[#2]}
+ {#3}}
+
+% \dochemicaloffset{#1}
+%
+% #1: binding
+
+\def\chemicaloffset{0}
+
+\def\processchemicaloffset#1%
+ {\dimen0=62500 sp % real calc on cardinals, funny number
+ \dimen0=\chemicalrepeat\dimen0
+ \divide\dimen0 by \@@localchemicalscale
+ \!!counta=\dimen0
+ \def\doprocess[##1##2]%
+ {\doifinstringelse{##1}{128}
+ {\edef\chemicaloffset{\the\!!counta}}
+ {\doifinstringelse{##1}{456}
+ {\edef\chemicaloffset{-\the\!!counta}}
+ {\doifelse{##1}{0}
+ {\edef\chemicaloffset{0}}
+ {\unknownchemical{OFF#1}}}}}%
+ \doprocess[#1]}
+
+\def\dochemicaloffset#1%
+ {\ifnum\chemicaloffset=0
+ \def\undochemicaloffset{}%
+ \else
+ \setchemicalcoordinates{-\chemicaloffset}{0}%
+ \def\undochemicaloffset%
+ {\setchemicalcoordinates{\chemicaloffset}{0}%
+ \def\undochemicaloffset{}}%
+ \fi}
+
+\def\processchemicalphantom#1#2%
+ {\setbox0=\hbox
+ {\def\splitoff##1????{##1}%
+ $\@@dochemicalstyle{\@@localchemicalformat\splitoff#2}$}%
+ \dimen0=.25\wd0
+ \divide\dimen0 by \@@localchemicalscale
+ \!!counta=\dimen0
+ \doifinstringelse{#1}{128}
+ {\edef\chemicaloffset{\the\!!counta}}
+ {\doifinstringelse{#1}{456}
+ {\edef\chemicaloffset{-\the\!!counta}}
+ {\doifelse{#1}{0}
+ {\edef\chemicaloffset{0}}
+ {\unknownchemical{OF#1:#2}}}}}
+
+% \dosetchemicalrotation{#1}{#2}
+%
+% #1: cos(phi)
+% #2: sin(phi)
+
+\def\chemicalrotation {1}
+\def\chemicalangle {0}
+\def\chemicalxoffset {0}
+\def\chemicalyoffset {0}
+
+\def\setchemicalmirror#1%
+ {\setvalue{\s!mirror#1}{*}}
+
+\def\resetchemicalmirror#1%
+ {\resetvalue{\s!mirror#1}}
+
+\def\togglechemicalmirror#1%
+ {\doifelse{\getvalue{\s!mirror#1}}{*}
+ {\resetchemicalmirror{#1}}
+ {\setchemicalmirror{#1}}}
+
+\def\setchemicalrotation #1 #2 #3 #4 #5 #6 #7 #8 #9
+ {\setvalue{\s!rotate1.#1}{\dosetchemicalrotation{#2}{#3}}%
+ \setvalue{\s!rotate2.#1}{\dosetchemicalrotation{#4}{#5}}%
+ \setvalue{\s!rotate3.#1}{\dosetchemicalrotation{#6}{#7}}%
+ \setvalue{\s!rotate4.#1}{\dosetchemicalrotation{#8}{#9}}}
+
+\def\setchemicalangle #1 #2 #3 #4 #5
+ {\setvalue{\s!angle1.#1}{\dosetchemicalangle{#2}}%
+ \setvalue{\s!angle2.#1}{\dosetchemicalangle{#3}}%
+ \setvalue{\s!angle3.#1}{\dosetchemicalangle{#4}}%
+ \setvalue{\s!angle4.#1}{\dosetchemicalangle{#5}}}
+
+\def\chemicalrotate[#1]%
+ {\doifdefinedelse{\s!mirror#1}
+ {\getvalue{\s!rotate\chemicalrotation.#1\getvalue{\s!mirror#1}}%
+ \getvalue{\s!angle\chemicalrotation.#1\getvalue{\s!mirror#1}}}
+ {\getvalue{\s!rotate\chemicalrotation.#1}%
+ \getvalue{\s!angle\chemicalrotation.#1}}}
+
+\def\dosetchemicalangle#1% zwak zie onder
+ {\def\chemicalangle{#1}}
+
+\def\dosetchemicalrotation#1#2%
+ {\ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \startrotation by {#1} {#2} %% \stoprotation (t.b.v. testen)
+ \fi}
+
+\def\doresetchemicalrotation
+ {\ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \stoprotation
+ \fi}
+
+\def\processchemicalrotation#1%
+ {\def\doprocess[##1##2]%
+ {\doifnumberelse{##1}
+ {\def\chemicalrotation{##1}}
+ {\unknownchemical{ROT#1}}}%
+ \doprocess[#1]}
+
+% \filtertextelement[#1][#2][#3][#4]
+%
+% #1: volgnummer
+% #2: offset in uitlijningen
+% #3: lijst met uitlijningen -> \chemicalloca
+% #4: lijst met teksten -> \chemicaltext
+
+\def\setchemicallocation#1%
+ {\doifelse{#1}{}
+ {\edef\chemicalloca{c}}
+ {\edef\chemicalloca{#1}}}
+
+\newif\iffixedchemicaltext
+
+\def\filterchemicaltextelement[#1][#2][#3][#4]%
+ {\ifchemicaltextconstant
+ \def\chemicaltext{#4}%
+ \setchemicallocation{}%
+ \else
+ \ifnum#1=0\relax
+ \setchemicallocation{}%
+ \else
+ \iffixedchemicaltext
+ \!!counta#2
+ \else
+ \!!counta=\chemicalrotation
+ \advance\!!counta -1
+ \multiply\!!counta #2
+ \advance\!!counta #1
+ \fi
+ \getfromcommalist[#3][\the\!!counta]%
+ \setchemicallocation\commalistelement
+ \fi
+ \ifchemicalpicture
+ \let\chemicaltext\relax
+ \else
+ \advance\txtchemical 1
+ \getfromcommalist[#4][\txtchemical]%
+ \let\chemicaltext\commalistelement
+ \fi
+ \fi
+ \fixedchemicaltextfalse}
+
+% \putchemicaltext{#1}{#2}
+%
+% #1 : x-coordinaat
+% #2 : y-coordinaat
+%
+% \chemicaltext en \chemicalloca worden met \gettextelement
+% opgehaald uit de tweede set bij \chemie
+%
+% Ten behoeve van testdoeleinden wordt gebruik gemaakt van
+% \chemicalframe in plaats van het meer sjieke, maar tevens
+% meer trage \framed.
+
+\ifx\ruledhbox\undefined
+ \def\chemicalframe#1%
+ {\hbox
+ {\vrule\hskip-.4pt
+ \vbox{\hrule\vskip-.4pt\hbox{#1}\vskip-.4pt\hrule}%
+ \hskip-.4pt\vrule}}
+\else
+ \def\chemicalframe#1%
+ {\ruledhbox{#1}}
+\fi
+
+\def\doputchemicaltext#1 [#2] at #3 #4 %
+ {\ifnum\chemicaldrawingmode=1
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[#2]{\chemicalangle}(#3,#4){#1}}}%
+ \else
+ \put {#1} [#2] at {#3} {#4} %
+ \fi}
+
+\def\dodoifsinglelocation#1#2\\#3%
+ {\ifx#2\relax#3\fi}
+
+\def\doifsinglelocationelse#1%
+ {\expandafter\dodoifsinglelocationelse#1\relax\\}
+
+\def\putchemicaltext#1#2%
+ {\enablechemicalspecials
+ \ifchemicalpicture
+ \setchemicalpicture{#1}{#2}%
+ \else
+ \doifelse\@@chemicaloption\v!test
+ {\def\@@chemicalframe{\chemicalframe}}
+ {\def\@@chemicalframe{}}%
+ \dosetsubscripts
+ \setbox2=\hbox{\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@localchemicalformat \chemicaltext}$}%
+ \setbox4=\hbox{$\@@dochemicalstyle{\@@localchemicalformat C_2^2}$}%
+ \setbox6=\hbox{$\@@dochemicalstyle{\@@localchemicalformat O}$}% or C
+ \doresetsubscripts
+ \doifnot\@@chemicallocation\v!intext
+ {\ht2=\ht4
+ \dp2=\dp4}%
+ \setbox2=\hbox{\@@chemicalframe{\box2}}%
+ \ifdim\wd2>\wd6
+ \doifelse{#1}{0}
+ {\doifnot{#2}{0}{\wd2=\wd6}}
+ {%\doifsinglelocation\chemicalloca
+ {\doifinset{\chemicalloca}{t,b}{\wd2=\wd6}}}% common ?
+ \fi
+ \expanded
+ {\doputchemicaltext
+ {\noexpand\dowithchemical{\copy2}} % per se \copy2 i.p.v. \box2
+ [\chemicalloca] at {#1} {#2} }
+ \nomoreaccounting
+ \fi
+ \disablechemicalspecials}
+
+\def\setchemicaltextelement #1 #2 #3
+ {\setvalue{\s!chemicaltextelement#1}{\putchemicaltext{#2}{#3}}}
+
+\def\getchemicalfixedtextelement%
+ {\fixedchemicaltexttrue
+ \getchemicaltextelement}
+
+\def\getchemicaltextelement[#1][#2][#3][#4][#5]%
+ {\filterchemicaltextelement[#2][#3][#4][#5]%
+ \doifelse{#2}{0}
+ {\dochemicaloffset{#2}% % incompatible change
+ \putchemicaltext{0}{0}%
+ \undochemicaloffset} % incompatible change
+ {\chemicalrotate[#2]%
+ \dochemicaloffset{#2}%
+ \def\chemicaltextelementnumber{#2}%
+ \getvalue{\s!chemicaltextelement#1}%
+ \getvalue{\s!chemicaltextelement#11}%
+ \getvalue{\s!chemicaltextelement#12}%
+ \getvalue{\s!chemicaltextelement#13}%
+ \undochemicaloffset}}
+
+\def\processchemicaltextelement#1#2#3#4#5%
+ {\def\doprocess[##1##2##3##4##5]%
+ {\doifelse{##1}{?}
+ {\doprocess[1..\maxchemical ????]}
+ {\doifchemicalnumber{##1}{#1#2}
+ {\doifelse{##2##3}{..}
+ {\doifchemicalnumber{##4}{#1#2}
+ {\getchemicaltextelement[#1][##1][#4][#5][#3]%
+ \doifnot{##1}{##4}
+ {\!!counta=##1\relax
+ \advance\!!counta by 1
+ \edef\nextsegment{\the\!!counta}%
+ \doprocess[\nextsegment..##4##5]}}}
+ {\getchemicaltextelement[#1][##1][#4][#5][#3]%
+ \doifnot{##2}{?}{\doprocess[##2##3##4##5]}}}}}%
+ \doprocess[#2]%
+ \smallchemicaltextfalse}
+
+\def\processchemicalsmalltextelement%
+ {\smallchemicaltexttrue\processchemicaltextelement}
+
+\def\processchemicalsmalltextconstant%
+ {\smallchemicaltexttrue\processchemicaltextconstant}
+
+\def\processchemicalunrotatedtextelement#1#2#3#4#5#6%
+ {\bgroup
+ \xdef\@@xxx{0}%
+ \xdef\@@yyy{0}%
+ \def\putchemicaltext##1##2%
+ {\xdef\@@xxx{##1}%
+ \xdef\@@yyy{##2}}%
+ \getvalue{\s!chemicaltextelement#1}%
+ \egroup
+ \bgroup
+ \def\doputchemicaltext##1 [##2] at ##3 ##4 %
+ {\ifnum\chemicaldrawingmode=1
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\rput{\chemicalangle}(\@@xxx,\@@yyy){\expanded{\rput[##2](##3,##4){##1}}}}%
+ \else
+ \put
+ {\stoprotation \setcoordinatesystem point at 0 0
+ \expanded{\put {##1} [##2] at {##3} {##4} }}
+ at {\@@xxx} {\@@yyy}
+ \fi}%
+ \processchemicaltextelement{#2}{#3}{#4}{#5}{#6}%
+ \egroup}
+
+\newif\ifchemicaltextconstant
+
+\def\processchemicaltextconstant#1#2#3#4%
+ {\chemicaltextconstanttrue
+ \let\@@oldchemicalframe\@@chemicalframe
+ \let\@@chemicalframe\relax
+ \processchemicaltextelement{#1}{#2}{#3}{#4}{}%
+ \let\@@chemicalframe\@@oldchemicalframe
+ \chemicaltextconstantfalse}
+
+% \plotchemicalline{#1}{#2}{#3}{#4}
+%
+% #1: x-coordinaat beginpunt
+% #2: y-coordinaat beginpunt
+% #3: x-coordinaat eindpunt
+% #4: y-coordinaat eindpunt
+
+\chardef\chemicallinetype=0
+
+\def\doplotchemicalline
+ {\!!counte=\!!countc \advance\!!counte by -\!!counta
+ \!!countf=\!!countd \advance\!!countf by -\!!countb
+ \bgroup
+ \ifcase\chemicaldrawingmode
+ \ifcase\chemicallinetype
+ % 0 : normal line
+ \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /%
+ \or
+ % 1 : normal arrow
+ \arrow <5pt> [.2,.67] from {\!!counta} {\!!countb} to {\!!countc} {\!!countd}
+ \or
+ % 2 : reverse arrow
+ \arrow <5pt> [.2,.67] from {\!!countc} {\!!countd} to {\!!counta} {\!!countb}
+ \or
+ % 3 : unrotated line
+ \put {\stoprotation \setcoordinatesystem point at 0 0
+ \plot 0 0 {\!!counte} {\!!countf} /}
+ [\chemicallineposition] at {\!!counta} {\!!countb}
+ \else
+ % 4 : dashed line
+ \findlength {\plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /}%
+ \setdashesnear <2pt> for <\totalarclength>%
+ \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /%
+ \fi
+ \or
+ \ifcase\chemicallinetype
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \or
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline{->}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \or
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline{<-}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \or
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[\chemicallineposition]{-\chemicalangle}%
+ (\!!counta,\!!countb){\psline(0,0)(\!!counte,\!!countf)}}}%
+ \else
+ \psset{linestyle=dashed}%
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
+ \fi
+ \or
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ x3 := \MPdivten[\the\!!counte]u ;
+ y3 := \MPdivten[\the\!!countf]u ;
+ \ifcase\chemicallinetype
+ % 0 : normal line
+ draw ((z1--z2) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \or
+ % 1 : normal arrow
+ drawarrow ((z1--z2) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \or
+ % 2 : reverse arrow
+ drawarrow ((z2--z1) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \or
+ % 3 : unrotated line % nog \chemicalineposition: t/b
+ draw (origin--z3)
+ shifted (z1 rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \else
+ % 4 : dashed line
+ draw ((z1--z2) rotatedaround(origin,-\chemicalangle))
+ shifted z0 dashed dashpattern(on 5.5u off 6u) ;
+ \fi
+ \stopMPdrawing
+ \fi
+ \egroup
+ \account\!!counta\!!countb
+ \account\!!countc\!!countd}
+
+\def\plotchemicalline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \doplotchemicalline}
+
+\def\plotchemicalfactorline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifdim\@@chemicalfactor\onepoint=\onepoint \else
+ \scratchdimen\!!counta\s!sp \multiply\scratchdimen1000 \scratchdimen\@@chemicalfactor\scratchdimen \divide\scratchdimen1000 \!!counta\scratchdimen
+ \scratchdimen\!!countc\s!sp \multiply\scratchdimen1000 \scratchdimen\@@chemicalfactor\scratchdimen \divide\scratchdimen1000 \!!countc\scratchdimen
+ \fi
+ \doplotchemicalline}
+
+\def\plotchemicalzline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ filldraw ((
+ \ifnum\chemicalangle>180
+ z1--z2
+ \else\ifnum\chemicalangle<90
+ z1--(z2 shifted (-2u,+2u))--(z2 shifted (+2u,-2u))
+ \else\ifnum\chemicalangle=90
+ (z1 shifted (-2u,+2u))--(z1 shifted (+2u,-2u))--
+ (z2 shifted (+2u,+2u))--(z2 shifted (-2u,-2u))
+ \else
+ (z1 shifted (+2u,+2u))--(z1 shifted (-2u,-2u))--z2
+ \fi\fi\fi
+ --cycle) rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ \stopMPdrawing
+ \else
+ \doplotchemicalline
+ \ifnum\chemicalangle>180 \else
+ \ifnum\chemicalangle=90
+ \advance\!!counta by -20 \advance\!!countc by -20
+ \doplotchemicalline
+ \advance\!!counta by 40 \advance\!!countc by 40
+ \else\ifnum\chemicalangle<90
+ \advance\!!countc by -20 \advance\!!countd by +20
+ \doplotchemicalline
+ \advance\!!countc by +40 \advance\!!countd by -40
+ \else
+ \advance\!!counta by 20 \advance\!!countb by 20
+ \doplotchemicalline
+ \advance\!!counta by -40 \advance\!!countb by -40
+ \fi\fi
+ \fi
+ \doplotchemicalline
+ \fi}
+
+\def\plotchemicaldeltaline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ filldraw ((z1--(z2 rotatedaround(z1,5))--(z2 rotatedaround(z1,-5))
+ --cycle) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \stopMPdrawing
+ \account{#1}{#2}%
+ \account{#3}{#4}%
+ \else
+ \doplotchemicalline
+ \advance\!!countc by 16 \advance\!!countd by -21
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -8 \advance\!!countd by 14
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \fi}
+
+\def\setchemicallinesegment #1 #2 #3 #4 #5
+ {\setvalue{\s!chemicallinesegment#1}{\plotchemicalline{#2}{#3}{#4}{#5}}}
+
+\def\setchemicalfactorlinesegment #1 #2 #3 #4 #5
+ {\setvalue{\s!chemicallinesegment#1}{\plotchemicalfactorline{#2}{#3}{#4}{#5}}}
+
+\def\getchemicallinesegment[#1][#2]%
+ {\chemicalrotate[#1]%
+ \dochemicaloffset{#1}%
+ \getvalue{\s!chemicallinesegment#2}%
+ \getvalue{\s!chemicallinesegment#21}%
+ \getvalue{\s!chemicallinesegment#22}%
+ \undochemicaloffset}
+
+\def\getprivatechemicallinesegment[#1][#2]%
+ {\chemicalrotate[#1]%
+ \getvalue{\s!chemicallinesegment#2#1}}
+
+\def\doprocesschemicallinesegment#1#2#3#4#5%
+ {\chardef\chemicallinetype=#1
+ \def\chemicallineposition{#2}%
+ \def\doprocess[##1##2##3##4##5]%
+ {\doifelse{##1}{?}
+ {\doprocess[1..\maxchemical ????]}
+ {\doifchemicalnumber{##1}{#4#5}
+ {\doifelse{##2##3}{..}
+ {\doifchemicalnumber{##4}{#4#5}
+ {#3[##1][#4]%
+ \doifnot{##1}{##4}
+ {\!!counta=##1\relax
+ \advance\!!counta by 1
+ \edef\nextsegment{\the\!!counta}%
+ \doprocess[\nextsegment..##4##5]}}}
+ {#3[##1][#4]%
+ \doifnot{##2}{?}
+ {\doprocess[##2##3##4##5]}}}}}%
+ \doprocess[#5]}
+
+\def\processchemicallinesegment
+ {\doprocesschemicallinesegment0c\getchemicallinesegment}
+
+\def\processchemicalzlinesegment#1#2%
+ {%\doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \bgroup
+ \def\plotchemicalline{\plotchemicalzline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processchemicaldeltalinesegment#1#2%
+ {%\doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \bgroup
+ \def\plotchemicalline{\plotchemicaldeltaline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processprivatechemicallinesegment%
+ {\doprocesschemicallinesegment0c\getprivatechemicallinesegment}
+
+\def\processchemicaldownarrowsegment%
+ {\doprocesschemicallinesegment1c\getchemicallinesegment}
+
+\def\processchemicaluparrowsegment%
+ {\doprocesschemicallinesegment2c\getchemicallinesegment}
+
+\def\processchemicalunrotatedlinesegment#1%
+ {\doprocesschemicallinesegment3{#1}\getchemicallinesegment}
+
+\def\processchemicaldashedlinesegment
+ {\doprocesschemicallinesegment4c\getchemicallinesegment}
+
+\def\plotchemicaldasheddeltaline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ z20 = z2 rotatedaround(z1,+5) ;
+ z21 = z2 rotatedaround(z1,-5) ;
+ draw (z1 rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ save n ; n := 5 ;
+ for i=1 upto n :
+ draw ((((z20--z21) shifted -z2) shifted (i/n)[z2,z1])
+ rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ endfor
+ \stopMPdrawing
+ \account{#1}{#2}%
+ \account{#3}{#4}%
+ \else
+ \doplotchemicalline
+ \advance\!!countc by 16 \advance\!!countd by -21
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -8 \advance\!!countd by 14
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \fi}
+
+\def\plotchemicalwavyline#1#2#3#4%
+ {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \ifnum\chemicaldrawingmode=2
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ save d ; pair d ;
+ d := z2 rotatedaround(z1,+5) shifted -z2 ;
+ save n ; n := 4 ;
+ draw ((for i=0 upto n-1 :
+ ((i)/n)[z1,z2] ..
+ ((i+.25)/n)[z1,z2] shifted d ..
+ ((i+.50)/n)[z1,z2] ..
+ ((i+.75)/n)[z1,z2] shifted -d ..
+ endfor
+ z2) rotatedaround(origin,-\chemicalangle)) shifted z0 ;
+ \stopMPdrawing
+ \account{#1}{#2}%
+ \account{#3}{#4}%
+ \else
+ \doplotchemicalline
+ \advance\!!countc by 16 \advance\!!countd by -21
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -8 \advance\!!countd by 14
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \advance\!!countc by -4 \advance\!!countd by 7
+ \doplotchemicalline
+ \fi}
+
+\def\processchemicaldasheddeltalinesegment#1#2%
+ {\bgroup
+ \def\plotchemicalline{\plotchemicaldasheddeltaline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processchemicalwavylinesegment#1#2%
+ {\bgroup
+ \def\plotchemicalline{\plotchemicalwavyline}%
+ \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
+ \egroup}
+
+\def\processchemicalopenend#1#2%
+ {\doprocesschemicallinesegment0c\doprocesschemicalopenend{#1}{#2}}
+
+\def\doprocesschemicalopenend[#1][#2]%
+ {\chemicalrotate[#1]%
+ \dochemicaloffset{#1}%
+ \ifcase\chemicaldrawingmode
+ \beginpicture
+ \setquadratic\plot
+ 300 0 400 0
+ 500 0 550 75
+ 600 0 650 -75
+ 700 0 750 75
+ 800 0 850 -75
+ 900 0 950 0
+ 1050 0 /
+ \endpicture
+ \or
+ \rput{-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psline(300,0)(500,0)%
+ \rput(500,0){\psplot[yunit=75,plotstyle=curve]{0}{720}{x sin}}%
+ \psline(950,0)(1050,0)}%
+ \or
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ draw
+ (((30.0u,0)--(50.0u,0){up}..(55.0u,7.5u)..
+ (60.0u,0)..(65.0u,-7.5u)..(70.0u,0)..
+ (75.0u,7.5u)..(80.0u,0)..(85.0u,-7.5u)..{up}
+ (90.0u,0)--(105.0u,0)) rotatedaround(origin,-\chemicalangle))
+ shifted z0 ;
+ \stopMPdrawing
+ \fi
+ \undochemicaloffset}
+
+% \plotchemicalcircle{#1}{#2}{#3}{#4}
+%
+% #1: lengte van de boog in graden
+% #2: x-coordinaat eindpunt
+% #3: y-coordinaat eindpunt
+
+\newif\ifchemicaldotted
+
+\def\plotchemicalcircle#1#2#3#4#5#6%
+ {\bgroup
+ \ifcase\chemicaldrawingmode
+ \ifchemicaldotted
+ \findlength{\circulararc {#4} degrees from {#5} {#6} center at {0} {0} }%
+ \divide\totalarclength by 6
+ \def\b{\the\totalarclength}%
+ \divide\totalarclength by 2
+ \def\a{\the\totalarclength}%
+ \setdashpattern <\a,\b,\b,\b,\b,\b,\a>
+ \fi
+ \circulararc {#4} degrees from {#5} {#6} center at {0} {0} %
+ \or
+ \ifchemicaldotted
+ \psset{linestyle=dashed}%
+ \fi
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\psarc(0,0){#3}{#1}{#2}}%
+ \or
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ r := \MPdivten[#3]*2u;
+ x0 := \MPdivten[\chemicalxoffset]u ;
+ y0 := \MPdivten[\chemicalyoffset]u ;
+ draw ((subpath (#1/45,#2/45) of (fullcircle scaled (r)))
+ rotatedaround (origin,\chemicalangle+150))
+ shifted z0 \ifchemicaldotted dashed withdots \fi ;
+ \stopMPdrawing
+ \fi
+ \egroup}
+
+\def\setchemicalcircsegment #1 #2 #3 #4 #5 #6 #7
+ {\setvalue{\s!chemicalcircsegment#1}{\plotchemicalcircle{#2}{#3}{#4}{#5}{#6}{#7}}}
+
+\def\getchemicalcircsegment[#1][#2]%
+ {\chemicalrotate[#1]%
+ \getvalue{\s!chemicalcircsegment#2}}
+
+\def\doprocesschemicalcircsegment#1#2%
+ {\def\doprocess[##1##2##3##4##5]%
+ {\doifelse{##1}{?}
+ {\doprocess[1..\maxchemical ????]}
+ {\doifchemicalnumber{##1}{#1#2}
+ {\doifelse{##2##3}{..}
+ {\doifchemicalnumber{##4}{#1#2}
+ {\getchemicalcircsegment[##1][#1]%
+ \doifnot{##1}{##4}
+ {\!!counta=##1\relax
+ \advance\!!counta by 1
+ \edef\nextsegment{\the\!!counta}%
+ \doprocess[\nextsegment..##4##5]}}}
+ {\getchemicalcircsegment[##1][#1]%
+ \doifnot{##2}{?}
+ {\doprocess[##2##3##4##5]}}}}}%
+ \doprocess[#2]}
+
+\def\processchemicalcircsegment%
+ {\chemicaldottedfalse\doprocesschemicalcircsegment}
+
+\def\processchemicaldottsegment%
+ {\chemicaldottedtrue\doprocesschemicalcircsegment}
+
+\let\endchemicalpicture = \relax
+\let\checkchemicalpicture = \relax
+\let\nomoreaccounting = \relax
+
+\newif\ifchemicalpicture
+
+\def\beginchemicalpicture#1% NO PSTRICKS SUPPORT YET
+ {\checkchemicalpicture
+ \bgroup % DOES NOT HANDLE AUTOWIDTH/HEIGHT
+ \chemicalpicturetrue
+ \processchemical[#1]}
+
+\def\setchemicalpicture#1#2%
+ {\chemicalpicturefalse
+ \def\endchemicalpicture%
+ {\@@endchemicallocalpicture{#1}{#2}%
+ \egroup
+ \ifnum\chemicaldrawingmode=1
+ \rput
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[\chemicalloca]{\chemicalangle}(#1,#2){\box\nextbox}}}%
+ \else
+ \expanded{\put{\box\nextbox}[\chemicalloca] at {#1} {#2} }
+ \fi
+ \egroup}%
+ \def\checkchemicalpicture%
+ {\ifx\endchemicalpicture\relax \else
+ \writestatus{ppchtex}{missing end of picture (PE)}%
+ \endchemicalpicture
+ \fi}%
+ \setbox\nextbox=\hbox\bgroup
+ \@@beginchemicallocalpicture
+ % alternatief: gewoon accounting, en zelf l,r afhandelen
+ \ifnum\chemicaldrawingmode=1
+ % njet
+ \else
+ \accountingon
+ \let\nomoreaccounting=\accountingoff
+ \fi}
+
+\def\doskipchemical[#1][#2]%
+ {{\tt[ppchtex]}}
+
+\def\skipchemical%
+ {\dodoubleargument\doskipchemical}
+
+\def\complexchemical% met \expandafter
+ {\ifinchemical
+ \expandafter\dochemical
+ \else
+ \writestatus{ppchtex}{the [][]-alternative is not permitted here}%
+ \expandafter\skipchemical
+ \fi}
+
+\newif\ifinnerchemical
+
+\def\dosimplechemical#1#2#3%
+ {\doifdefinedelse{\??chemical\c!location}
+ {\writestatus{ppchtex}{the {}{}-alternative is not permitted here}}
+ {\ifinnerchemical
+ \let\chemicalsign = \chemicalinnersign
+ \let\chemicalmolecule = \chemicalinnermolecule
+ \let\chemicalsinglearrow = \chemicalsingleinnerarrow
+ \let\chemicaldoublearrow = \chemicaldoubleinnerarrow
+ \let\chemicaltwintiparrow = \chemicaltwintipinnerarrow
+ \else
+ \let\chemicalsign = \chemicaloutersign
+ \let\chemicalmolecule = \chemicaloutermolecule
+ \let\chemicalsinglearrow = \chemicalsingleouterarrow
+ \let\chemicaldoublearrow = \chemicaldoubleouterarrow
+ \let\chemicaltwintiparrow = \chemicaltwintipouterarrow
+ \fi
+ \disablechemicalspecials
+ \unexpandedprocessallactionsinset
+ [#1]
+ [ HIGH=>\sethighsubscripts,
+ LOW=>\setlowsubscripts,
+ PLUS=>\chemicalsign{+},
+ GIVES=>\chemicalsinglearrow{#2}{#3},
+ EQUILIBRIUM=>\chemicaldoublearrow{#2}{#3},
+ MESOMERIC=>\chemicaltwintiparrow{#2}{#3},
+ SINGLE=>\singlechemicalbond,
+ DOUBLE=>\doublechemicalbond,
+ TRIPLE=>\triplechemicalbond,
+ +=>\chemicalsign{+},
+ ->=>\chemicalsinglearrow{#2}{#3},
+ <->=>\chemicaldoublearrow{#2}{#3},
+ <>=>\chemicaltwintiparrow{#2}{#3},
+ -=>\singlechemicalbond,
+ --=>\doublechemicalbond,
+ ---=>\triplechemicalbond,
+ \s!unknown=>\enablechemicalspecials
+ \chemicalmolecule{\commalistelement}{#2}{#3}]}}
+
+\def\dosimplechemicalA#1#2#3% % evt: {#1,\relax}
+ {\let\chemicalspace=\relax
+ \@EA\dosimplechemical\@EA{\@@chemicalchemicaloffset,#1}{#2}{#3}%
+ \egroup}
+
+\def\dosimplechemicalB#1#2#3%
+ {\dosimplechemical{#1}{#2}{#3}%
+ \egroup}
+
+\def\dosimplechemicalC#1#2#3%
+ {$\simplechemical{#1}{#2}{#3}$%
+ \egroup} % erbij
+
+\def\simplechemical
+ {\ifinner
+ \innerchemicaltrue
+ \else
+ \innerchemicalfalse
+ \fi
+ \bgroup
+ \catcode`\^=\@@superscript % t.b.v. \enableduplication
+ \catcode`\_=\@@subscript % t.b.v. de zekerheid
+ \ifmmode
+ \ifinnerchemical
+ \def\next{\dotriplegroupempty\dosimplechemicalA}%
+ \else
+ \def\next{\dotriplegroupempty\dosimplechemicalB}%
+ \fi
+ \else
+ \def\next{\dotriplegroupempty\dosimplechemicalC}%
+ \fi
+ \next}
+
+\definecomplexorsimple\chemical
+
+\def\dogotochemical#1#2%
+ {\def\dowithchemical% % experiment
+ {\localgotochemical{#1}}% % experiment
+ \chemical} % experiment
+
+\def\gotochemical% % experiment
+ {\dosingleargument\dogotochemical} % experiment
+
+\def\dododochemical#1[#2][#3]% % experiment
+ {\def\simpledododochemical% % experiment
+ {#1[#2][#3]}% % experiment
+ \def\complexdododochemical[##1]% % experiment
+ {\def\dowithchemical% % experiment
+ {\localthisischemical{#2}}% % experiment
+ #1[#3][##1]}% % experiment
+ \complexorsimple\dododochemical} % experiment
+
+\def\dodochemical[#1][#2]%
+ {\ignorespaces
+ \ifinchemical
+ \drawchemical[#1][#2]%
+ \ignorespaces
+ \else
+ \startchemical[\c!location=\v!intext]%
+ \drawchemical[#1][#2]%
+ \expandafter\stopchemical
+ \fi
+ \ignorespaces}
+
+\def\dochemical[#1]%
+ {\def\simpledochemical%
+ {\@@writechemicalstate{ppchtex}{[#1][]}%
+ \dodochemical[#1][]}%
+ %
+ \def\complexdochemical[##1]%
+ {\@@writechemicalstate{ppchtex}{[#1][##1]}%
+ \txtchemical=0%
+ \dodochemical[#1][##1]}%
+ %
+ \def\complexdochemical[##1]% % experiment
+ {\@@writechemicalstate{ppchtex}{[#1][##1]}% % experiment
+ \txtchemical=0% % experiment
+ \dododochemical\dodochemical[#1][##1]}% % experiment
+ %
+ \complexorsimple\dochemical}
+
+% \processlocalchemicals{#1}
+%
+% #1: commando's
+
+\def\dodoprocesschemical#1%
+ {\processchemical[#1????]}
+
+\def\processlocalchemicals#1%
+ {\processcommalist[#1]\dodoprocesschemical}
+
+% \drawchemical[#1][#2]
+%
+% #1: bindingen enz.
+% #2: atomen enz.
+
+\def\localdodochemical[#1][#2]%
+ {\@@writechemicalstate{ppchtex}{[#1][#2]}%
+ %\bgroup % koppelen en afmetingen gaat fout, vandaar:
+ \advance\levchemical 1
+ \letvalue{\??chemical\s!unknown\the\levchemical}\unknownchemical
+ \setevalue{\??chemical\c!text\the\levchemical}{\the\txtchemical}%
+ \txtchemical=0
+ \dodochemical[#1][#2]%
+ % \@EA\txtchemical\@EA\csname\??chemical\c!text\the\levchemical\endcsname
+ \txtchemical\csname\??chemical\c!text\the\levchemical\endcsname
+ \@EA\let\@EA\unknownchemical\csname\??chemical\s!unknown\the\levchemical\endcsname
+ \advance\levchemical -1
+ %\egroup
+ \ignorespaces}
+
+\def\drawchemical[#1][#2]%
+ {\ignorespaces
+ \def\dodochemical[##1][##2]%
+ {\drawchemical[##1][##2]%
+ \ignorespaces}%
+ \def\dochemical[##1]%
+ {\def\simpledochemical%
+ {\@@writechemicalstate{ppchtex}{[##1][#2]}%
+ \dodochemical[##1][#2]%
+ \ignorespaces}%
+ \def\complexdochemical[####1]%
+ {\dododochemical\localdodochemical[##1][####1,#2]}%
+ \complexorsimple\dochemical}%
+ \doif\@@chemicalstate\v!start
+ {\doifelse\chemicalname\s!unknown
+ {\getvalue{\s!executechemical\defaultchemical}[#2]}
+ {\getvalue{\s!executechemical\chemicalname}[#2]}%
+ \def\unknownchemical##1%
+ {\processunknownchemical[##1][#2]}%
+ \processcommalist[\@@chemicaloffset,#1]\dodoprocesschemical}%
+ \ignorespaces}
+
+\unexpanded\def\chemicaloxidation#1#2#3%
+ {\chemicaltop
+ {\ifnum#20=0
+ 0%
+ \else
+ #1\expandafter\uppercase\expandafter{\romannumeral#2}%
+ \fi}
+ {#3}}
+
+\def\chemicaltfraction{\ifinchemical.60\else.8\fi}
+\def\chemicalbfraction{\ifinchemical.45\else.6\fi}
+\def\chemicallfraction{\ifinchemical.1\else.1\fi}
+\def\chemicalrfraction{\ifinchemical.1\else.1\fi}
+
+\def\chemicaltighttext
+ {\def\chemicaltfraction{\ifinchemical.3\else.6\fi}%
+ \def\chemicalbfraction{\ifinchemical.2\else.4\fi}%
+ \def\chemicallfraction{\ifinchemical 0\else 0\fi}%
+ \def\chemicalrfraction{\ifinchemical 0\else 0\fi}}
+
+\def\dochemicaltop#1#2#3#4%
+ {\vbox
+ {\@@dochemicalcolor
+ \baselineskip=\chemicaltfraction\baselineskip \lineskip0pt
+ \halign
+ {#1###2\cr
+ $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr
+ $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr}}}
+
+\def\dochemicalbottom#1#2#3#4%
+ {\vtop
+ {\@@dochemicalcolor
+ \baselineskip=\chemicalbfraction\baselineskip \lineskip0pt
+ \halign
+ {#1###2\cr
+ $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr
+ $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr}}}
+
+\def\chemicalleft#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\scriptscriptstyle#1}$%
+ $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
+
+\def\chemicalright#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
+ $\@@dochemicalstyle{\scriptscriptstyle#1}$}}
+
+\def\chemicalcentered#1%
+ {\setbox0=\hbox{$\@@dochemicalstyle{\scriptscriptstyle#1}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \dimen0=.5\ht2
+ \advance\dimen0 by -.5\ht0
+ \advance\dimen0 by \dp0
+ \hbox{\@@dochemicalcolor\raise\dimen0\box0}}
+
+\def\chemicalleftcentered#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ \chemicalcentered{#1}%
+ $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
+
+\def\chemicalrightcentered#1#2%
+ {\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
+ \chemicalcentered{#1}}}
+
+\def\chemicaltop {\dochemicaltop \hss \hss }
+\def\chemicallefttop {\dochemicaltop \relax \hss }
+\def\chemicalrighttop {\dochemicaltop \hss \relax}
+\def\chemicalbottom {\dochemicalbottom \hss \hss }
+\def\chemicalleftbottom {\dochemicalbottom \relax \hss }
+\def\chemicalrightbottom {\dochemicalbottom \hss \relax}
+
+\def\chemicaltopleft #1{\chemicalleft {\chemicallefttop {#1}{}}}
+\def\chemicalbottomleft #1{\chemicalleft {\chemicalleftbottom{#1}{}}}
+\def\chemicaltopright #1{\chemicalright{\chemicallefttop {#1}{}}}
+\def\chemicalbottomright#1{\chemicalright{\chemicalleftbottom{#1}{}}}
+
+\def\chemicalsmashedleft#1%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
+ \wd2=\wd0
+ \box2
+ \egroup}
+
+\def\chemicalsmashedmiddle#1%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
+ \hbox{\hskip-.5\wd2\hskip.5\wd0\box2}
+ \egroup}
+
+\def\chemicalsmashedright#1%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
+ \hbox to \wd0{\hskip-\wd2\hskip\wd0\box2}%
+ \egroup}
+
+\def\+{\tabalign} % is \long in Plain
+
+\def\chemicalforever#1#2%
+ {\bgroup
+ \setbox0=\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\scriptscriptstyle\hskip-.15em#2}$}%
+ \wd0=0pt
+ \big#1_{\hskip.1em\box0}%
+ \egroup}
+
+\def\disablechemicalspecials%
+ {\def\+##1{##1}\def\-##1{##1}%
+ \def\[{[}\def\]{]}%
+ \def\1{}\def\2{}\def\3{}\def\4{}\def\5{}\def\6{}\def\7{}%
+ \def\X{}%
+ \def\T{}\def\B{}\def\L{}\def\R{}\def\LC{}\def\RC{}%
+ \def\TL{}\def\BL{}\def\TR{}\def\BR{}%
+ \def\LT{}\def\LB{}\def\RT{}\def\RB{}%
+ \def\SL{}\def\SM{}\def\SR{}}
+
+\def\enablechemicalspecials%
+ {\def\+{\dodoublegroupempty\chemicaloxidation{+}}% {} needed!
+ \def\-{\dodoublegroupempty\chemicaloxidation{-}}% {} needed!
+ \def\[{\dodoublegroupempty\chemicalforever {[}}% {} needed!
+ \def\]{\dodoublegroupempty\chemicalforever {]}}% {} needed!
+ \def\1{\chemicaloxidation\relax1}%
+ \def\2{\chemicaloxidation\relax2}%
+ \def\3{\chemicaloxidation\relax3}%
+ \def\4{\chemicaloxidation\relax4}%
+ \def\5{\chemicaloxidation\relax5}%
+ \def\6{\chemicaloxidation\relax6}%
+ \def\7{\chemicaloxidation\relax7}%
+ \def\X{\chemicaltighttext}%
+ \def\T{\chemicaltop}%
+ \def\B{\chemicalbottom}%
+ \def\L{\chemicalleft}%
+ \def\LC{\chemicalleftcentered}%
+ \def\R{\chemicalright}%
+ \def\RC{\chemicalrightcentered}%
+ \def\TL{\chemicaltopleft}%
+ \def\BL{\chemicalbottomleft}%
+ \def\TR{\chemicaltopright}%
+ \def\BR{\chemicalbottomright}%
+ \def\LT{\chemicallefttop}%
+ \def\LB{\chemicalleftbottom}%
+ \def\RT{\chemicalrighttop}%
+ \def\RB{\chemicalrightbottom}%
+ \def\SL{\chemicalsmashedleft}%
+ \def\SM{\chemicalsmashedmiddle}%
+ \def\SR{\chemicalsmashedright}}
+
+% \reversechemical#1#2#3
+%
+% #1: prefix
+% #2: volgnummer enz
+% #3: tegengestelde volgnummers
+
+\def\reversechemical#1#2#3%
+ {\def\doprocess[##1##2]%
+ {\doifchemicalnumber{##1}{#1#2}%
+ {\getfromcommalist[#3][##1]%
+ \let\reversechemicalaction=\commalistelement
+ \processchemical[#1\reversechemicalaction##2]}}%
+ \doprocess[#2]}
+
+% \processunknownchemical[#1????][#2]
+%
+% #1: bindingen enz.
+% #2: atomen enz.
+
+\def\defaultchemical%
+ {SIX}
+
+\def\processunknownchemical[#1????][#2]%
+ {\processaction
+ [#1]
+ [ SAVE=>\executechemicalSAVE,
+ RESTORE=>\executechemicalRESTORE,
+ HIGH=>\sethighsubscripts,
+ LOW=>\setlowsubscripts,
+ \s!default=>,
+ \s!unknown=>\doifdefinedelse{\s!executechemical#1}
+ {\def\chemicalrotation{1}%
+ \def\chemicaloffset{0}%
+ \doifdefined{\s!executechemical#1}
+ {\getvalue{\s!executechemical#1}[#2]}%
+ \@@chemicalpostponed}
+ {\getpredefinedchemical{#1}}]}
+
+\newcount\chemicalstack % tzt \newwounter
+
+\setvalue{\s!chemical\c!x1}{0}
+\setvalue{\s!chemical\c!y1}{0}
+
+\def\executechemicalSAVE
+ {%\writestatus{ppchtex}{saving \the\horchemical,\the\verchemical}%
+ \advance\chemicalstack by 1
+ \letvalue {\s!chemical n\the\chemicalstack}=\chemicalname
+ %\letvalue {\s!chemical p\the\chemicalstack}=\@@chemicalpostponed
+ \setevalue{\s!chemical x\the\chemicalstack}{\the\horchemical}%
+ \setevalue{\s!chemical y\the\chemicalstack}{\the\verchemical}}
+
+\def\restorechemicalvalues#1%
+ {\let\oldprocesschemical=\processchemical
+ \doifdefined{\s!executechemical#1}{\getvalue{\s!executechemical#1}[]}%
+ \let\processchemical=\oldprocesschemical}
+
+\def\executechemicalRESTORE
+ {\ifnum\chemicalstack=0\relax
+ \horchemical=\getvalue{\s!chemical x1}\relax
+ \verchemical=\getvalue{\s!chemical y1}\relax
+ \else
+ \restorechemicalvalues{\getvalue{\s!chemical n\the\chemicalstack}}%
+ %\@EA\let\@EA\@@chemicalpostponed\@EA=\csname\s!chemical p\the\chemicalstack\endcsname
+ \let\@@chemicalpostponed=\relax
+ \horchemical=\getvalue{\s!chemical x\the\chemicalstack}\relax
+ \verchemical=\getvalue{\s!chemical y\the\chemicalstack}\relax
+ \advance\chemicalstack by -1
+ \fi
+ \restorechemicalcoordinates}
+
+% De onderstaande macro's zijn verantwoordelijk voor het zetten
+% van de + en pijlen. De +, en dus ook de pijlen, worden omhoog
+% gehaald. Dit oogt m.i. fraaier.
+
+\def\chemicalinnerclip#1%
+ {{\setbox0=\hbox{#1}\ht0\ht\strutbox\dp0\dp\strutbox\box0}}
+
+\def\chemicalraise#1#2%
+ {\chemicalinnerclip
+ {\setbox0=\hbox{$#1+$}%
+ \raise\dp0\hbox{$#1#2$}}}
+
+\def\chemicalinnersign#1% todo: \@@chemicaltextcolor
+ {\chemicalraise{\@@localchemicalstyle}{#1}}
+
+\def\chemicaloutersign#1%
+ {\chemicalraise{}{\@@dochemicalcolor#1}}
+
+\def\chemicalsingleinnerarrow#1#2%
+ {\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}
+
+\def\chemicaldoubleinnerarrow#1#2% todo: \@@chemicaltextcolor
+ {\chemicalinnerclip
+ {\lower.2ex\hbox
+ {\setbox0=\hbox{$\@@localchemicalstyle\longrightarrow$}%
+ \setbox2=\hbox{$\@@localchemicalstyle\longleftarrow$}%
+ \wd0=0pt\raise\ht0\box0\box2}}}
+
+\def\chemicaltwintipinnerarrow#1#2% todo: \@@chemicaltextcolor
+ {\chemicalinnerclip
+ {\setbox0=\hbox{\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}%
+ \setbox2=\hbox{\chemicalraise{\@@localchemicalstyle}{\longleftarrow}}%
+ \wd0=0pt\box0\box2}}
+
+\def\dochemicalouterarrow#1#2#3%
+ {\bgroup
+ \setbox0=\hbox{$\longrightarrow$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#2\quad}$}%
+ \setbox4=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#3\quad}$}%
+ \dimen2=\wd0 % \dimen0 is used elsewhere
+ \ifdim\wd2>\dimen2 \dimen0=\wd2 \fi
+ \ifdim\wd4>\dimen2 \dimen0=\wd4 \fi
+ \chemicaloutermolecule
+ {#1}
+ {\ifdim\ht2>\!!zeropoint\box2\fi} % expands to \empty in test
+ {\ifdim\ht4>\!!zeropoint\box4\fi}% % expands to \empty in test
+ \egroup}
+
+\def\chemicalsingleouterarrow
+ {\dochemicalouterarrow
+ {\hbox to \dimen2{\rightarrowfill}}}
+
+\def\chemicaldoubleouterarrow
+ {\dochemicalouterarrow
+ {\lower.5\ht0\vbox
+ {\offinterlineskip
+ \hbox to \dimen2{\rightarrowfill}
+ \hbox to \dimen2{\leftarrowfill}}}}
+
+\def\chemicaltwintipouterarrow
+ {\dochemicalouterarrow
+ {\hbox
+ {\hbox to \dimen2{\rightarrowfill}%
+ \hskip-\dimen2
+ \hbox to \dimen2{\leftarrowfill}}}}
+
+\def\chemicalinnermolecule#1#2#3% no mathop here, can generate space
+ {\chemicalspace % todo: \@@chemicaltextcolor
+ \chemicalinnerclip
+ {\dosetsubscripts
+ $\@@dochemicalstyle{\@@localchemicalstyle\strut#1}$%
+ \doresetsubscripts}%
+ \chemicalspace}
+
+\def\chemicaloutermolecule#1#2#3%
+ {\chemicalspace
+ \bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox % else the font is reset
+ {\dosetsubscripts
+ \hbox{$\@@dochemicalstyle{\strut#1}$}%
+ \doresetsubscripts}%
+ \mathop{\box0}%
+ \ifthirdargument
+ \doifnot{#2}{}
+ {^{\@@dochemicalstyle{\strut#2}}}%
+ \doifnot{#3}{}
+ {_{\@@dochemicalstyle{\strut#3}}}%
+ \else
+ \doifnot{#2}{}
+ {_{\@@dochemicalstyle{\strut#2}}}%
+ \fi
+ \egroup
+ \chemicalspace}
+
+\def\chemicalsinglepicturearrow#1%
+ {\lower.5ex\hbox
+ {\@@dochemicalstyle
+ $\chemicalspace
+ \buildrel
+ \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
+ \over{\overrightarrow
+ {\hphantom{\@chemicalstyle{\scriptstyle\quad#1\quad}}}}%
+ \chemicalspace$}}
+
+\def\chemicaldoublepicturearrow#1%
+ {\lower.5ex\hbox
+ {\@@dochemicalstyle
+ $\chemicalspace
+ \buildrel
+ \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
+ \over{\overrightarrow{\overleftarrow
+ {\hphantom{\@@dochemicalstyle{\scriptstyle\quad#1\quad}}}}}%
+ \chemicalspace$}}
+
+% Bij de in-line bindingen wordt gebruik gemaakt van
+% een \hrule. De maatvoering wordt bepaald door een
+% kunstmatige em (\wd0).
+
+\def\somechemicalbond%
+ {\hrule width \wd0 height .4pt}
+
+\def\dochemicalbonds#1#2#3% todo: \@@chemicaltextstyle
+ {{\setbox0=\hbox
+ {${\@@localchemicalstyle M}$}%
+ \vbox to \ht0
+ {\@@dochemicalcolor
+ \hsize\wd0
+ \vskip.1\wd0#1\vfill#2\vfill#3\vskip.1\wd0}}}
+
+\def\singlechemicalbond%
+ {\dochemicalbonds{}{\somechemicalbond}{}}
+
+\def\doublechemicalbond%
+ {\dochemicalbonds{\somechemicalbond}{}{\somechemicalbond}}
+
+\def\triplechemicalbond%
+ {\dochemicalbonds{\somechemicalbond}{\somechemicalbond}{\somechemicalbond}}
+
+% In plaats van \def\naam{\chemie[...]...} kan beter gebruik
+% worden gemaakt van het commando
+%
+% \definieerchemie[naam]{commando's}
+%
+% De naam krijgt, om problemen met bestaande macro's te
+% voorkomen, een prefix. Bij het ophalen van een commando
+% worden beide definities afgehandeld.
+
+\def\dodefinechemical[#1]#2%
+ {\doifdefined{\??chemical#1}
+ {\writestatus{ppchtex}{chemical definition #1 is redefined}}%
+ \setvalue{\??chemical#1}{#2}}
+
+\unexpanded\def\definechemical%
+ {\dosingleargument\dodefinechemical}
+
+\def\getpredefinedchemical#1%
+ {\doifdefinedelse{\??chemical#1}
+ {\getvalue{\??chemical#1}}
+ {\doifdefinedelse{#1}
+ {\getvalue{#1}}
+ {\writestatus{ppchtex}{unknown chemical definition #1}}}}
+
+% Hieronder zijn de definities van de structuren opgenomen. De
+% naam van de structuur is als volgt opgebouwd:
+%
+% \executechemicalNUMBER[#1]
+%
+% waarbij [#1] betrekking heeft op de tekstelementen van \chemie,
+% de [tweede lijst] dus.
+%
+% De aan \chemie[#1][#2] meegegeven lijst van segmenten wordt
+% deels door de in \execute gedefinieerde macro's afgehandeld,
+% deels door algemene macro's. Segmenten hebben de vorm:
+%
+% [+|-|]identifier[X|XYZ|X..Y]
+%
+% Voorbeelden van segmenten zijn:
+%
+% R1
+% R1..4
+% R135
+% -R1
+% +R35
+
+\setchemicalmaximum 0
+
+\def\processchemical[#1]%
+ {\unknownchemical{#1}}
+
+\def\setchemicalname#1 %
+ {\def\chemicalname{#1}}
+
+\let\chemicalname=\s!unknown
+
+% Vooruitlopend op een gedetailleerde documentatie, zijn hier
+% vast enkele gebruikte afmetingen:
+%
+% lengte radikalen : 500
+% afstand radikalen : 100
+% afstand dubbele radikalen : 260
+% afstand substituenten : +125
+
+
+
+
+\def\executechemicalONE[#1]%
+ {\setchemicalname ONE
+ %
+ \setchemicalmaximum 8
+ \setchemicaldistance 0
+ \setchemicalsubstitute 625
+ \setchemicaldirection 303
+ %
+ \setchemicalrotation 1 1 0 1 0 1 0 1 0
+ \setchemicalrotation 2 0.707 -0.707 0.707 -0.707 0.707 -0.707 0.707 -0.707
+ \setchemicalrotation 3 0 -1 0 -1 0 -1 0 -1
+ \setchemicalrotation 4 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707
+ \setchemicalrotation 5 -1 0 -1 0 -1 0 -1 0
+ \setchemicalrotation 6 -0.707 0.707 -0.707 0.707 -0.707 0.707 -0.707 0.707
+ \setchemicalrotation 7 0 1 0 1 0 1 0 1
+ \setchemicalrotation 8 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 45 135 225 315
+ \setchemicalangle 3 90 180 270 0
+ \setchemicalangle 4 135 225 315 45
+ \setchemicalangle 5 180 270 0 90
+ \setchemicalangle 6 225 315 45 135
+ \setchemicalangle 7 270 0 90 180
+ \setchemicalangle 8 315 45 135 225
+ %
+ \setchemicaltranslate 1 -1000 0
+ \setchemicaltranslate 2 -1000 1000
+ \setchemicaltranslate 3 0 1000
+ \setchemicaltranslate 4 1000 1000
+ \setchemicaltranslate 5 1000 0
+ \setchemicaltranslate 6 1000 -1000
+ \setchemicaltranslate 7 0 -1000
+ \setchemicaltranslate 8 -1000 -1000
+ %
+ \setchemicallinesegment SB 300 0 700 0
+ \setchemicallinesegment DB1 300 50 700 50
+ \setchemicallinesegment DB2 300 -50 700 -50
+ %
+ %setchemicallinesegment EP 200 125 200 -125
+ \setchemicalfactorlinesegment EP 200 125 200 -125
+ %
+ \setchemicaltextelement ES 200 0
+ \setchemicaltextelement ED1 200 50
+ \setchemicaltextelement ED2 200 -50
+ \setchemicaltextelement ET1 200 75
+ \setchemicaltextelement ET2 200 0
+ \setchemicaltextelement ET3 200 -75
+ \setchemicaltextelement HB1 300 0
+ \setchemicaltextelement HB2 475 0
+ \setchemicaltextelement HB3 650 0
+ %
+ \setchemicaltextelement Z 800 0
+ \setchemicaltextelement RZ 950 0
+ \setchemicaltextelement ZN 500 0
+ \setchemicaltextelement ZTN 500 150
+ \setchemicaltextelement ZBN 500 -150
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\doprocesschemical[##1##2##3##4##5]
+ {\processaction
+ [##1##2##3##4##5]
+ [ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ SUB##4##5=>\processchemicalsubstitute{##4##5},
+ ADJ##4##5=>\processchemicaldistance{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ DIR##4##5=>\processchemicaldirection{##4##5},
+ OFF##4##5=>\processchemicaloffset{##4##5},
+ CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
+ LDD##4##5=>\processchemicaldashedlinesegment{DB1}{##4##5}%
+ \processchemicallinesegment{DB2}{##4##5},
+ RDD##4##5=>\processchemicallinesegment{DB1}{##4##5}%
+ \processchemicaldashedlinesegment{DB2}{##4##5},
+ OF##3:##5=>\processchemicalphantom{##3}{##5},
+ OE##3##4##5=>\processchemicalopenend{OE}{##3##4##5},
+ EP##3##4##5=>\processchemicallinesegment{EP}{##3##4##5},
+ ES##3##4##5=>\processchemicaltextconstant{ES}{##3##4##5}{\hbox{$\cdot$}}{0},
+ ED##3##4##5=>\processchemicaltextconstant{ED}{##3##4##5}{\hbox{$\cdot$}}{0},
+ ET##3##4##5=>\processchemicaltextconstant{ET}{##3##4##5}{\hbox{$\cdot$}}{0},
+ HB##3##4##5=>\processchemicaltextconstant{HB}{##3##4##5}{\hbox{$\cdot$}}{0},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ BB##3##4##5=>\processchemicaldeltalinesegment{SB}{##3##4##5},
+ BD##3##4##5=>\processchemicaldasheddeltalinesegment{SB}{##3##4##5},
+ BW##3##4##5=>\processchemicalwavylinesegment{SB}{##3##4##5},
+ SD##3##4##5=>\processchemicaldashedlinesegment{SB}{##3##4##5},
+ TB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5}%
+ \processchemicallinesegment{DB}{##3##4##5},
+ CZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{0}{},
+ ZTN##4##5=>\processchemicalsmalltextconstant{ZTN}{##4##5}{\chemicaltextelementnumber}{0},
+ ZTT##4##5=>\processchemicalsmalltextelement{ZTN}{##4##5}{#1}{0}{},
+ ZBN##4##5=>\processchemicalsmalltextconstant{ZBN}{##4##5}{\chemicaltextelementnumber}{0},
+ ZBT##4##5=>\processchemicalsmalltextelement{ZBN}{##4##5}{#1}{0}{},
+ ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
+ ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}
+ {l,l,t,r,r,r,b,l},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}}
+
+\def\executechemicalTHREE[#1]%
+ {\setchemicalname THREE
+ %
+ \setchemicalmaximum 3
+ \setchemicaldistance 289
+ \setchemicalsubstitute 952
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 -0.5 -0.866 -0.866 0.5 0.5 0.866 0.866 -0.5
+ \setchemicalrotation 3 -0.5 0.866 0.866 0.5 0.5 -0.866 -0.866 -0.5
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 120 210 300 30
+ \setchemicalangle 3 240 330 60 150
+ %
+ \setchemicaltranslate 1 -1000 0
+ \setchemicaltranslate 2 0 1000
+ \setchemicaltranslate 3 1000 0
+ \setchemicaltranslate 4 0 -1000
+ %
+ \setchemicallinesegment B 577 0 -289 -500
+ \setchemicallinesegment SB 352 -130 -64 -370
+ \setchemicallinesegment -SB 352 -130 -289 -500
+ \setchemicallinesegment +SB 577 0 -64 -370
+ \setchemicallinesegment DB1 327 -87 -89 -327
+ \setchemicallinesegment DB2 377 -172 -39 -413
+ \setchemicallinesegment R 577 0 1077 0
+ \setchemicallinesegment -R 577 0 1010 250
+ \setchemicallinesegment +R 577 0 1010 -250
+ \setchemicallinesegment ER1 577 50 1077 50
+ \setchemicallinesegment ER2 577 -50 1077 -50
+ \setchemicallinesegment SR 837 0 1077 0
+ \setchemicallinesegment -SR 802 130 1010 250
+ \setchemicallinesegment +SR 802 -130 1010 -250
+ \setchemicallinesegment DR1 837 50 1077 50
+ \setchemicallinesegment DR2 837 -50 1077 -50
+ %
+ \setchemicaltextelement Z 577 0
+ \setchemicaltextelement RZ 1177 0
+ \setchemicaltextelement -RZ 1097 300
+ \setchemicaltextelement +RZ 1097 -300
+ \setchemicaltextelement CRZ 1077 0
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [ ROT##4=>\processchemicalrotation{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ SUB##4=>\processchemicalsubstitute{##4},
+ ADJ##4=>\processchemicaldistance{##4},
+ -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{3}
+ {l,t,r, l,r,l, r,b,l, r,l,r},
+ +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{3}
+ {l,r,b, r,r,l, r,l,t, l,l,r},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ -SR##4=>\processchemicallinesegment{-SR}{##4},
+ +SR##4=>\processchemicallinesegment{+SR}{##4},
+ CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}
+ {},
+ DB##3##4=>\processchemicallinesegment{DB}{##3##4},
+ DR##3##4=>\processchemicallinesegment{DR}{##3##4},
+ RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{3}
+ {l,r,r, t,r,l, r,l,l, b,l,r},
+ ER##3##4=>\processchemicallinesegment{ER}{##3##4},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ SR##3##4=>\processchemicallinesegment{SR}{##3##4},
+ -R##3##4=>\processchemicallinesegment{-R}{##3##4},
+ +R##3##4=>\processchemicallinesegment{+R}{##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalFOUR[#1]%
+ {\setchemicalname FOUR
+ %
+ \setchemicalmaximum 4
+ \setchemicaldistance 500
+ \setchemicalsubstitute 0
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 0 -1 -1 0 0 1 1 0
+ \setchemicalrotation 3 -1 0 0 1 1 0 0 -1
+ \setchemicalrotation 4 0 1 1 0 0 -1 -1 0
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 90 180 270 0
+ \setchemicalangle 3 180 270 0 90
+ \setchemicalangle 4 270 0 90 180
+ %
+ \setchemicaltranslate 1 -1000 0
+ \setchemicaltranslate 2 0 1000
+ \setchemicaltranslate 3 1000 0
+ \setchemicaltranslate 4 0 -1000
+ %
+ \setchemicallinesegment B 500 500 500 -500
+ \setchemicallinesegment SB 500 240 500 -240
+ \setchemicallinesegment -SB 500 240 500 -500
+ \setchemicallinesegment +SB 500 500 500 -240
+ \setchemicallinesegment DB1 450 240 450 -240
+ \setchemicallinesegment DB2 550 240 550 -240
+ \setchemicallinesegment EB 360 300 360 -300
+ \setchemicallinesegment R 500 500 854 854
+ \setchemicallinesegment -R 500 500 500 1000
+ \setchemicallinesegment +R 500 500 1000 500
+ \setchemicallinesegment ER1 465 535 819 889
+ \setchemicallinesegment ER2 535 465 889 819
+ \setchemicallinesegment SR 684 684 854 854
+ \setchemicallinesegment -SR 500 760 500 1000
+ \setchemicallinesegment +SR 760 500 1000 500
+ \setchemicallinesegment DR1 649 719 819 889
+ \setchemicallinesegment DR2 719 649 889 819
+ %
+ \setchemicaltextelement Z 500 500
+ \setchemicaltextelement RZ 925 925
+ \setchemicaltextelement -RZ 500 1100
+ \setchemicaltextelement +RZ 1100 500
+ \setchemicaltextelement CRZ 1038 1038
+ %
+ \setchemicaltextelement ZN 350 350
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [ PB:##4=>\beginchemicalpicture{##4},
+ PE????=>\endchemicalpicture,
+ ROT##4=>\processchemicalrotation{##4},
+ SUB##4=>\processchemicalsubstitute{##4},
+ ADJ##4=>\processchemicaldistance{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{4}
+ {b,l,t,r, l,t,r,b, t,r,b,l, r,b,l,t},
+ +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{4}
+ {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ -SR##4=>\processchemicallinesegment{-SR}{##4},
+ +SR##4=>\processchemicallinesegment{+SR}{##4},
+ CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
+ ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
+ ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
+ DB##3##4=>\processchemicallinesegment{DB}{##3##4},
+ DR##3##4=>\processchemicallinesegment{DR}{##3##4},
+ EB##3##4=>\processchemicallinesegment{EB}{##3##4},
+ ER##3##4=>\processchemicallinesegment{ER}{##3##4},
+ RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{4}
+ {lb,lt,rt,rb, lt,rt,rb,lb, rt,rb,lb,lt, rb,lb,lt,rt},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ SR##3##4=>\processchemicallinesegment{SR}{##3##4},
+ -R##3##4=>\processchemicallinesegment{-R}{##3##4},
+ +R##3##4=>\processchemicallinesegment{+R}{##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalFIVE[#1]%
+ {\setchemicalname FIVE
+ %
+ \setchemicalmaximum 5
+ \setchemicaldistance 688
+ \setchemicalsubstitute 1226
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 0.309 -0.951 -0.951 -0.309 -0.309 0.940 0.951 0.309
+ \setchemicalrotation 3 -0.809 -0.588 -0.588 0.809 0.809 0.588 0.588 -0.809
+ \setchemicalrotation 4 -0.809 0.588 0.588 0.809 0.809 -0.588 -0.588 -0.809
+ \setchemicalrotation 5 0.309 0.951 0.951 -0.309 -0.309 -0.951 -0.951 0.309
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 72 162 252 342
+ \setchemicalangle 3 144 234 324 54
+ \setchemicalangle 4 216 306 36 126
+ \setchemicalangle 5 288 18 108 198
+ %
+ \setchemicaltranslate 1 -1376 0
+ \setchemicaltranslate 2 -425 1304
+ \setchemicaltranslate 3 1113 809
+ \setchemicaltranslate 4 1113 -809
+ \setchemicaltranslate 5 -425 -1304
+ %
+ \setchemicallinesegment A 1188 500 1188 -500
+ \setchemicallinesegment B 688 500 688 -500
+ \setchemicallinesegment S -263 808 688 -500
+ \setchemicallinesegment SS -116 606 541 -298
+ \setchemicallinesegment -SS -263 808 541 -298
+ \setchemicallinesegment +SS -116 606 688 -500
+ \setchemicallinesegment SB 688 240 688 -240
+ \setchemicallinesegment -SB 688 240 688 -500
+ \setchemicallinesegment +SB 688 500 688 -240
+ \setchemicallinesegment DB1 638 240 638 -240
+ \setchemicallinesegment DB2 738 240 738 -240
+ \setchemicallinesegment EB 548 340 548 -340
+ \setchemicallinesegment R 688 500 1093 794
+ \setchemicallinesegment -R 688 500 688 1000
+ \setchemicallinesegment +R 688 500 1163 345
+ \setchemicallinesegment ER1 659 540 1064 834
+ \setchemicallinesegment ER2 727 460 1122 754
+ \setchemicallinesegment SR 898 653 1093 794
+ \setchemicallinesegment -SR 688 760 688 1000
+ \setchemicallinesegment +SR 935 420 1163 345
+ \setchemicallinesegment DR1 869 693 1064 834
+ \setchemicallinesegment DR2 927 613 1122 754
+ %
+ \setchemicaltextelement Z 688 500
+ \setchemicaltextelement RZ 1188 863
+ \setchemicaltextelement -RZ 688 1100
+ \setchemicaltextelement +RZ 1258 315
+ \setchemicaltextelement CRZ 1323 947
+ %
+ \setchemicalcircsegment C -36 36 590 72 475 -345
+ \setchemicalcircsegment CC -72 0 590 72 182 -561
+ %
+ \setchemicaltextelement ZN 468 350
+ \setchemicaltextelement RN 860 625 % 1.25 Z
+ \setchemicaltextelement RTN 785 728 % .12 / 103 75
+ \setchemicaltextelement RBN 935 522
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [ FRONT????=>{\executechemicalFIVEFRONT[#1]},
+ PB:##4=>\beginchemicalpicture{##4},
+ PE????=>\endchemicalpicture,
+ ROT##4=>\processchemicalrotation{##4},
+ SUB##4=>\processchemicalsubstitute{##4},
+ ADJ##4=>\processchemicaldistance{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{5}
+ {b,l,t,r,r, l,t,r,r,l, t,r,r,l,l, r,b,l,t,r},
+ +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{5}
+ {l,t,r,r,b, t,r,r,l,l, r,r,l,l,r, b,l,l,r,r},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ -SR##4=>\processchemicallinesegment{-SR}{##4},
+ +SR##4=>\processchemicallinesegment{+SR}{##4},
+ -RD##4=>\processchemicaldashedlinesegment{-R}{##4},
+ +RD##4=>\processchemicaldashedlinesegment{+R}{##4},
+ -RB##4=>\processchemicaldeltalinesegment{-R}{##4},
+ +RB##4=>\processchemicaldeltalinesegment{+R}{##4},
+ CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
+ RTN##4=>\processchemicaltextconstant{RTN}{##4}{\chemicaltextelementnumber}{0},
+ RTT##4=>\processchemicaltextelement{RTN}{##4}{#1}{0}{},
+ RBN##4=>\processchemicaltextconstant{RBN}{##4}{\chemicaltextelementnumber}{0},
+ RBT##4=>\processchemicaltextelement{RBN}{##4}{#1}{0}{},
+ -SS##4=>\processchemicallinesegment{-SS}{##4},
+ +SS##4=>\processchemicallinesegment{+SS}{##4},
+ CCD##4=>\processchemicaldottsegment{CC}{##4},
+ SS##3##4=>\processchemicallinesegment{SS}{##3##4},
+ RD##3##4=>\processchemicaldashedlinesegment{R}{##3##4},
+ RB##3##4=>\processchemicaldeltalinesegment{R}{##3##4},
+ ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
+ ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
+ RN##3##4=>\processchemicaltextconstant{RN}{##3##4}{\chemicaltextelementnumber}{0},
+ RT##3##4=>\processchemicaltextelement{RN}{##3##4}{#1}{0}{},
+ AU##3##4=>\processchemicaluparrowsegment{A}{##3##4},
+ AD##3##4=>\processchemicaldownarrowsegment{A}{##3##4},
+ CC##3##4=>\processchemicalcircsegment{CC}{##3##4},
+ CD##3##4=>\processchemicaldottsegment{C}{##3##4},
+ DB##3##4=>\processchemicallinesegment{DB}{##3##4},
+ DR##3##4=>\processchemicallinesegment{DR}{##3##4},
+ EB##3##4=>\processchemicallinesegment{EB}{##3##4},
+ ER##3##4=>\processchemicallinesegment{ER}{##3##4},
+ RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{5}
+ {l,l,r,r,r, l,r,r,b,l, r,r,b,l,t, r,l,l,t,r},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ SR##3##4=>\processchemicallinesegment{SR}{##3##4},
+ -R##3##4=>\processchemicallinesegment{-R}{##3##4},
+ +R##3##4=>\processchemicallinesegment{+R}{##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ C##2##3##4=>\processchemicalcircsegment{C}{##2##3##4},
+ R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
+ S##2##3##4=>\processchemicallinesegment{S}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalSIX[#1]%
+ {\setchemicalname SIX
+ %
+ \setchemicalmaximum 6
+ \setchemicalsubstitute 1375
+ \setchemicaldistance 866
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 0.5 -0.866 -0.866 -0.5 -0.5 0.866 0.866 0.5
+ \setchemicalrotation 3 -0.5 -0.866 -0.866 0.5 0.5 0.866 0.866 -0.5
+ \setchemicalrotation 4 -1 0 0 1 1 0 0 -1
+ \setchemicalrotation 5 -0.5 0.866 0.866 0.5 0.5 -0.866 -0.866 -0.5
+ \setchemicalrotation 6 0.5 0.866 0.866 -0.5 -0.5 -0.866 -0.866 0.5
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 60 150 240 330
+ \setchemicalangle 3 120 210 300 30
+ \setchemicalangle 4 180 270 0 90
+ \setchemicalangle 5 240 330 60 150
+ \setchemicalangle 6 300 30 120 210
+ %
+ \setchemicaltranslate 1 -1732 0
+ \setchemicaltranslate 2 -866 1500
+ \setchemicaltranslate 3 866 1500
+ \setchemicaltranslate 4 1732 0
+ \setchemicaltranslate 5 866 -1500
+ \setchemicaltranslate 6 -866 -1500
+ %
+ \setchemicallinesegment A 1386 500 1386 -500
+ \setchemicallinesegment S 0 1000 866 -500
+ \setchemicallinesegment SS 125 783 741 -283
+ \setchemicallinesegment -SS 0 1000 741 -283
+ \setchemicallinesegment +SS 125 783 866 -500
+ \setchemicallinesegment B 866 500 866 -500
+ \setchemicallinesegment SB 866 240 866 -240
+ \setchemicallinesegment -SB 866 240 866 -500
+ \setchemicallinesegment +SB 866 500 866 -240
+ \setchemicallinesegment DB1 816 240 816 -240
+ \setchemicallinesegment DB2 916 240 916 -240
+ \setchemicallinesegment EB 726 340 726 -340
+ \setchemicallinesegment R 866 500 1299 750
+ \setchemicallinesegment -R 866 500 866 1000
+ \setchemicallinesegment +R 866 500 1299 250
+ \setchemicallinesegment ER1 841 543 1274 793
+ \setchemicallinesegment ER2 891 457 1324 707
+ \setchemicallinesegment SR 1091 630 1299 750
+ \setchemicallinesegment -SR 866 740 866 1000
+ \setchemicallinesegment +SR 1091 370 1299 250
+ \setchemicallinesegment DR1 1066 673 1274 793
+ \setchemicallinesegment DR2 1116 588 1324 707
+ \setchemicallinesegment MID1 0 1000 -150 200
+ \setchemicallinesegment MID2 0 -1000 -150 -200
+ \setchemicallinesegment MIDS1 0 1000 -180 0
+ \setchemicallinesegment MIDS2 0 -1000 -180 0
+ %
+ \setchemicalcircsegment C -30 30 700 60 600 -346
+ \setchemicalcircsegment CC -60 0 700 60 350 -606
+ %
+ \setchemicaltextelement Z 866 500
+ \setchemicaltextelement RZ 1386 800
+ \setchemicaltextelement -RZ 866 1100
+ \setchemicaltextelement +RZ 1386 200
+ \setchemicaltextelement CRZ 1524 880
+ \setchemicaltextelement MIDZ -150 0
+ %
+ \setchemicaltextelement ZN 589 350
+ \setchemicaltextelement RN 1083 625 % 1.25 Z
+ \setchemicaltextelement RTN 1008 755 % .12 / 130 75
+ \setchemicaltextelement RBN 1158 495
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ FRONT????=>{\executechemicalSIXFRONT[#1]},
+ MID????=>\processchemicallinesegment{MID}{1????},
+ MIDS????=>\processchemicallinesegment{MIDS}{1????},
+ MIDZ????=>\processchemicaltextelement{MIDZ}{1????}{#1}{0}{},
+ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ ROT##4##5=>\processchemicalrotation{##4##5},
+ SUB##4##5=>\processchemicalsubstitute{##4##5},
+ ADJ##4##5=>\processchemicaldistance{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ -RZ##4##5=>\processchemicaltextelement{-RZ}{##4##5}{#1}{6}
+ {b,l,l,t,r,r, l,l,r,r,r,l, t,r,r,b,l,l, r,r,l,l,l,r},
+ +RZ##4##5=>\processchemicaltextelement{+RZ}{##4##5}{#1}{6}
+ {l,t,r,r,b,l, r,r,r,l,l,l, r,b,l,l,t,r, l,l,l,r,r,r},
+ -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
+ +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
+ -SR##4##5=>\processchemicallinesegment{-SR}{##4##5},
+ +SR##4##5=>\processchemicallinesegment{+SR}{##4##5},
+ -RD##4##5=>\processchemicaldashedlinesegment{-R}{##4##5},
+ +RD##4##5=>\processchemicaldashedlinesegment{+R}{##4##5},
+ -RB##4##5=>\processchemicaldeltalinesegment{-R}{##4##5},
+ +RB##4##5=>\processchemicaldeltalinesegment{+R}{##4##5},
+ CRZ##4##5=>\processchemicaltextelement{CRZ}{##4##5}{#1}{0}{},
+ -SS##4##5=>\processchemicallinesegment{-SS}{##4##5},
+ +SS##4##5=>\processchemicallinesegment{+SS}{##4##5},
+ CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
+RTN##4##5=>\processchemicaltextconstant{RTN}{##4##5}{\chemicaltextelementnumber}{0},
+RTT##4##5=>\processchemicaltextelement{RTN}{##4##5}{#1}{0}{},
+RBN##4##5=>\processchemicaltextconstant{RBN}{##4##5}{\chemicaltextelementnumber}{0},
+RBT##4##5=>\processchemicaltextelement{RBN}{##4##5}{#1}{0}{},
+ SS##3##4##5=>\processchemicallinesegment{SS}{##3##4##5},
+ RD##3##4##5=>\processchemicaldashedlinesegment{R}{##3##4##5},
+ RB##3##4##5=>\processchemicaldeltalinesegment{R}{##3##4##5},
+ ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
+ ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
+RN##3##4##5=>\processchemicaltextconstant{RN}{##3##4##5}{\chemicaltextelementnumber}{0},
+RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
+ AU##3##4##5=>\processchemicaluparrowsegment{A}{##3##4##5},
+ AD##3##4##5=>\processchemicaldownarrowsegment{A}{##3##4##5},
+ CD##3##4##5=>\processchemicaldottsegment{C}{##3##4##5},
+ CC##3##4##5=>\processchemicalcircsegment{CC}{##3##4##5},
+ DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
+ EB##3##4##5=>\processchemicallinesegment{EB}{##3##4##5},
+ ER##3##4##5=>\processchemicallinesegment{ER}{##3##4##5},
+ RZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{6}
+ {l,l,t,r,r,b, l,r,r,r,l,l, r,r,b,l,l,t, r,l,l,l,r,r},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ SR##3##4##5=>\processchemicallinesegment{SR}{##3##4##5},
+ DR##3##4##5=>\processchemicallinesegment{DR}{##3##4##5},
+ -R##3##4##5=>\processchemicallinesegment{-R}{##3##4##5},
+ +R##3##4##5=>\processchemicallinesegment{+R}{##3##4##5},
+ B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
+ C##2##3##4##5=>\processchemicalcircsegment{C}{##2##3##4##5},
+ R##2##3##4##5=>\processchemicallinesegment{R}{##2##3##4##5},
+ S##2##3##4##5=>\processchemicallinesegment{S}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalSEVEN[#1]% incomplete !
+ {\setchemicalname SEVEN
+ %
+ \setchemicalmaximum 7
+ \setchemicalsubstitute -
+ \setchemicaldistance 1038
+ %
+ \setchemicalrotation 1 .623 .782 - - - - - -
+ \setchemicalrotation 2 -.223 .975 - - - - - -
+ \setchemicalrotation 3 -.901 .434 - - - - - -
+ \setchemicalrotation 4 -.901 -.434 - - - - - -
+ \setchemicalrotation 5 -.223 -.975 - - - - - -
+ \setchemicalrotation 6 .623 -.782 - - - - - -
+ \setchemicalrotation 7 1 0 - - - - - -
+ %
+ \setchemicalangle 1 0 - - -
+ \setchemicalangle 2 51.429 - - -
+ \setchemicalangle 3 102.857 - - -
+ \setchemicalangle 4 154.286 - - -
+ \setchemicalangle 5 205.714 - - -
+ \setchemicalangle 6 257.143 - - -
+ \setchemicalangle 7 308.571 - - -
+ %
+ \setchemicaltranslate 1 - -
+ \setchemicaltranslate 2 - -
+ \setchemicaltranslate 3 - -
+ \setchemicaltranslate 4 - -
+ \setchemicaltranslate 5 - -
+ \setchemicaltranslate 6 - -
+ \setchemicaltranslate 7 - -
+ %
+ \setchemicallinesegment B 1038 500 1038 -500
+ \setchemicallinesegment SB 1038 240 1038 -240
+ \setchemicallinesegment -SB 1038 240 1038 -500
+ \setchemicallinesegment +SB 1038 500 1038 -240
+ %
+ \setchemicaltextelement Z 1038 500
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ %ROT##4##5=>\processchemicalrotation{##4},
+ %SUB##4##5=>\processchemicalsubstitute{##4##5},
+ %ADJ##4##5=>\processchemicaldistance{##4##5},
+ %MOV##4##5=>\processchemicaltranslate{##4##5},
+ -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
+ +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalEIGHT[#1]% incomplete !
+ {\setchemicalname EIGHT
+ %
+ \setchemicalmaximum 8
+ %\setchemicalsubstitute 1307
+ \setchemicaldistance 1207
+ %
+ \setchemicalrotation 1 .707 .707 - - - - - -
+ \setchemicalrotation 2 0 1 - - - - - -
+ \setchemicalrotation 3 -.707 .707 - - - - - -
+ \setchemicalrotation 4 -1 0 - - - - - -
+ \setchemicalrotation 5 -.707 -.707 - - - - - -
+ \setchemicalrotation 6 0 -1 - - - - - -
+ \setchemicalrotation 7 .707 -.707 - - - - - -
+ \setchemicalrotation 8 1 0 - - - - - -
+ %
+ \setchemicalangle 1 45 - - -
+ \setchemicalangle 2 90 - - -
+ \setchemicalangle 3 135 - - -
+ \setchemicalangle 4 180 - - -
+ \setchemicalangle 5 225 - - -
+ \setchemicalangle 6 270 - - -
+ \setchemicalangle 7 315 - - -
+ \setchemicalangle 8 0 - - -
+ %
+ \setchemicaltranslate 1 -2414 0
+ \setchemicaltranslate 2 -1706 1706
+ \setchemicaltranslate 3 0 2414
+ \setchemicaltranslate 4 1706 1706
+ \setchemicaltranslate 5 2414 0
+ \setchemicaltranslate 6 1706 -1706
+ \setchemicaltranslate 7 0 -2414
+ \setchemicaltranslate 8 -1706 -1706
+ %
+ \setchemicallinesegment B 1207 500 1207 -500
+ \setchemicallinesegment SB 1207 240 1207 -240
+ \setchemicallinesegment -SB 1207 240 1207 -500
+ \setchemicallinesegment +SB 1207 500 1207 -240
+ %
+ \setchemicaltextelement Z 1207 500
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ PB:##4##5=>\beginchemicalpicture{##4##5},
+ PE????=>\endchemicalpicture,
+ %SUB##4##5=>\processchemicalsubstitute{##4##5},
+ ADJ##4##5=>\processchemicaldistance{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
+ +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
+ SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
+ B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalFIVEFRONT[#1]%
+ {\executechemicalFIVE[]%
+ %
+ \setchemicalname FIVEFRONT
+ %
+ \setchemicallinesegment -R 688 500 688 100
+ \setchemicallinesegment +R 688 500 688 900
+ %
+ \setchemicaltextelement -RZ 0 -1300
+ \setchemicaltextelement +RZ 0 1300
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\def\chemicalrotation{2}%
+ \processaction
+ [##1##2##3##4]
+ [ -RZ##4=>\processchemicalunrotatedtextelement{Z}{-RZ}{##4}{#1}{5}
+ {,,,,, t,t,t,t,t},
+ +RZ##4=>\processchemicalunrotatedtextelement{Z}{+RZ}{##4}{#1}{5}
+ {,,,,, b,b,b,b,b},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ -R##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##3##4},
+ +R##3##4=>\processchemicalunrotatedlinesegment{b}{+R}{##3##4},
+ BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
+ R##2##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##2##3##4}%
+ \processchemicalunrotatedlinesegment{b}{+R}{##2##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalSIXFRONT[#1]%
+ {\executechemicalSIX[]%
+ %
+ \setchemicalname SIXFRONT
+ %
+ \setchemicallinesegment -R 866 500 866 100
+ \setchemicallinesegment +R 866 500 866 900
+ %
+ \setchemicaltextelement -RZ 0 -1300
+ \setchemicaltextelement +RZ 0 1300
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\def\chemicalrotation{2}%
+ \processaction
+ [##1##2##3##4]
+ [ -RZ##4=>\processchemicalunrotatedtextelement{Z}{-RZ}{##4}{#1}{6}
+ {,,,,,, t,t,t,t,t,t},
+ +RZ##4=>\processchemicalunrotatedtextelement{Z}{+RZ}{##4}{#1}{6}
+ {,,,,,, b,b,b,b,b,b},
+ -SB##4=>\processchemicallinesegment{-SB}{##4},
+ +SB##4=>\processchemicallinesegment{+SB}{##4},
+ SB##3##4=>\processchemicallinesegment{SB}{##3##4},
+ -R##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##3##4},
+ +R##3##4=>\processchemicalunrotatedlinesegment{b}{+R}{##3##4},
+ BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
+ R##2##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##2##3##4}%
+ \processchemicalunrotatedlinesegment{b}{+R}{##2##3##4},
+ B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
+ Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+% 1 : 0
+% 2 : -115
+% 3* : -195
+% 3 : -165
+% 4 : -245
+
+\def\executechemicalCARBON[#1]%
+ {\setchemicalname CARBON
+ %
+ \setchemicalmaximum 4
+ \setchemicaldistance 0
+ \setchemicalsubstitute 0
+ %
+ \setchemicalrotation 1 1 0 0 -1 -1 0 0 1
+ \setchemicalrotation 2 -0.423 -0.906 -0.906 0.423 0.423 0.906 0.906 -0.423
+ \setchemicalrotation 3 -0.966 -0.259 -0.259 0.966 0.966 0.259 0.259 -0.966
+ \setchemicalrotation 3* -0.966 0.259 0.259 0.966 0.966 -0.259 -0.259 -0.966
+ \setchemicalrotation 4 -0.423 0.906 0.906 0.423 0.423 -0.906 -0.906 -0.423
+ %
+ \setchemicalangle 1 0 90 180 270
+ \setchemicalangle 2 115 205 295 25
+ \setchemicalangle 3 165 255 345 75
+ \setchemicalangle 3* 195 285 15 105
+ \setchemicalangle 4 245 335 65 155
+ %
+ \setchemicaltranslate 1 -1500 0
+ \setchemicaltranslate 2 0 1500
+ \setchemicaltranslate 3 1500 0
+ \setchemicaltranslate 4 0 -1500
+ %
+ \setchemicallinesegment B1 500 0 1000 0
+ \setchemicallinesegment B2 300 0 1000 0
+ \setchemicallinesegment B3 500 0 1000 0
+ \setchemicallinesegment B4 300 0 1000 0
+ %
+ \setchemicaltextelement Z 1100 0
+ %
+ \setchemicalcircsegment C 0 360 500 360 0 -500
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\processaction
+ [##1##2##3##4##5]
+ [ MIR????=>\setchemicalmirror{3},
+ -MIR????=>\resetchemicalmirror{3},
+ *MIR????=>\togglechemicalmirror{3},
+ CB????=>\processlocalchemicals{B,C,Z},
+ C????=>\processchemicalcircsegment{C}{1????},
+ -ROT##5=>\reversechemical{ROT}{##5}{3,4,1,2},
+ ROT##4##5=>\processchemicalrotation{##4##5},
+ MOV##4##5=>\processchemicaltranslate{##4##5},
+ CB##3##4##5=>\processlocalchemicals
+ {ROT##3,C,B,Z2..4,
+ MOV##3,*MIR,-ROT##3,C,B,Z2..4},
+ B##2##3##4##5=>\processprivatechemicallinesegment{B}{##2##3##4##5},
+ Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{4}
+ {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+% 1: 45 2: -90 3: -225
+% 4: -45 5: -135 6: -270
+
+\newif\ifNEWMANstagger \NEWMANstaggertrue
+
+\def\executechemicalNEWMANSTAGGER%
+ {\NEWMANstaggertrue\executechemicalNEWMAN}
+
+\def\executechemicalNEWMANECLIPSE%
+ {\NEWMANstaggerfalse\executechemicalNEWMAN}
+
+\def\executechemicalNEWMAN[#1]%
+ {\setchemicalname NEWMAN
+ %
+ \setchemicalmaximum 6
+ \setchemicaldistance 0
+ \setchemicalsubstitute 0
+ %
+ \ifNEWMANstagger
+ \setchemicalrotation 1 0.707 0.707 0.707 -0.707 -0.707 -0.707 -0.707 0.707
+ \setchemicalrotation 2 0 -1 -1 0 0 1 1 0
+ \setchemicalrotation 3 -0.707 0.707 0.707 0.707 0.707 -0.707 -0.707 -0.707
+ \else
+ \setchemicalrotation 1 .866 -.5 -.5 -.866 -.866 .5 .5 .866
+ \setchemicalrotation 2 -.259 .966 .966 .259 .259 -.966 -.966 -.259
+ \setchemicalrotation 3 -.5 -.866 -.866 .5 .5 .866 .866 -.5
+ \fi
+ \setchemicalrotation 4 0.707 -0.707 -0.707 -0.707 -0.707 0.707 0.707 0.707
+ \setchemicalrotation 5 -0.707 -0.707 -0.707 0.707 0.707 0.707 0.707 -0.707
+ \setchemicalrotation 6 0 1 1 0 0 -1 -1 0
+ %
+ \ifNEWMANstagger
+ \setchemicalangle 1 315 45 135 225
+ \setchemicalangle 2 90 180 270 0
+ \setchemicalangle 3 225 315 45 135
+ \else
+ \setchemicalangle 1 30 120 210 300
+ \setchemicalangle 2 255 345 75 165
+ \setchemicalangle 3 120 210 300 30
+ \fi
+ \setchemicalangle 4 45 135 225 315
+ \setchemicalangle 5 135 225 315 45
+ \setchemicalangle 6 270 0 90 180
+ %
+ \setchemicaltranslate 1 -1500 0
+ \setchemicaltranslate 2 0 1500
+ \setchemicaltranslate 3 1500 0
+ \setchemicaltranslate 4 0 -1500
+ %
+ \setchemicallinesegment B1 0 0 1000 0
+ \setchemicallinesegment B2 0 0 1000 0
+ \setchemicallinesegment B3 0 0 1000 0
+ \setchemicallinesegment B4 500 0 1000 0
+ \setchemicallinesegment B5 500 0 1000 0
+ \setchemicallinesegment B6 500 0 1000 0
+ %
+ \setchemicaltextelement Z 1100 0
+ %
+ \setchemicalcircsegment C 0 360 500 360 0 -500
+ %
+ \def\processchemical[##1##2##3##4]%
+ {\processaction
+ [##1##2##3##4]
+ [STAGGER????=>{\executechemicalNEWMANSTAGGER[#1]},
+ ECLIPSE????=>{\executechemicalNEWMANECLIPSE[#1]},
+ B????=>\processlocalchemicals{B1..6},
+ CB????=>\processlocalchemicals{B1..6,C,Z1..6},
+ C????=>\processchemicalcircsegment{C}{1????},
+ ROT##4=>\processchemicalrotation{##4},
+ MOV##4=>\processchemicaltranslate{##4},
+ B##2##3##4=>\processprivatechemicallinesegment{B}{##2##3##4},
+ Z##2##3##4=>\ifNEWMANstagger
+ \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
+ {l,t,r,l,r,b, l,r,l,r,r,l, r,b,l,r,l,t, r,l,r,l,l,r}%
+ \else
+ \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
+ {l,r,t,t,r,b, t,b,r,r,b,l, r,l,b,b,l,t, b,t,l,l,t,r}%
+ \fi,
+ \s!unknown=>\unknownchemical{##1##2##3##4}]}}
+
+\def\executechemicalCHAIR[#1]% smaller
+ {\setchemicalname CHAIR
+ %
+ \setchemicalmaximum 6
+ %
+ \setchemicallinesegment B1 1600 800 2800 -800
+ \setchemicallinesegment B2 2800 -800 800 0
+ \setchemicallinesegment B3 800 0 -1600 -800
+ \setchemicallinesegment B4 -1600 -800 -2800 800
+ \setchemicallinesegment B5 -2800 800 -800 0
+ \setchemicallinesegment B6 -800 0 1600 800
+ %
+ \setchemicallinesegment +R1 1600 800 1600 1600
+ \setchemicallinesegment +R2 2800 -800 2800 -1600
+ \setchemicallinesegment +R3 800 0 800 800
+ \setchemicallinesegment +R4 -1600 -800 -1600 -1600
+ \setchemicallinesegment +R5 -2800 800 -2800 1600
+ \setchemicallinesegment +R6 -800 0 -800 -800
+ %
+ \setchemicallinesegment -R1 1600 800 2350 522 % 750 278
+ \setchemicallinesegment -R2 2800 -800 3493 -400
+ \setchemicallinesegment -R3 800 0 1329 -600 % 528 600
+ \setchemicallinesegment -R4 -1600 -800 -2350 -522 % 750 278
+ \setchemicallinesegment -R5 -2800 800 -3493 400
+ \setchemicallinesegment -R6 -800 0 -1329 600 % 528 600
+ %
+ \setchemicaltextelement +RZ1 1600 1800
+ \setchemicaltextelement +RZ2 2800 -1800
+ \setchemicaltextelement +RZ3 800 1000
+ \setchemicaltextelement +RZ4 -1600 -1800
+ \setchemicaltextelement +RZ5 -2800 1800
+ \setchemicaltextelement +RZ6 -800 -1000
+ %
+ \setchemicaltextelement -RZ1 2538 453 % 200 lang
+ \setchemicaltextelement -RZ2 3666 -300
+ \setchemicaltextelement -RZ3 1460 -750
+ \setchemicaltextelement -RZ4 -2538 -453
+ \setchemicaltextelement -RZ5 -3666 300
+ \setchemicaltextelement -RZ6 -1460 750
+ %
+ \def\processchemical[##1##2##3##4##5]%
+ {\def\chemicalrotation{1}%
+ \processaction
+ [##1##2##3##4##5]
+ [ B????=>\processlocalchemicals{B1,B2,B3,B4,B5,B6},
+ -R????=>\processlocalchemicals{-R1,-R2,-R3,-R4,-R5,-R6},
+ +R????=>\processlocalchemicals{+R1,+R2,+R3,+R4,+R5,+R6},
+ B##2????=>{\getchemicallinesegment[0][B##2]},
+ -RZ##4????=>{\getchemicalfixedtextelement[-RZ##4][1][##4][l,l,tc,r,r,bc][#1]},
+ +RZ##4????=>{\getchemicalfixedtextelement[+RZ##4][1][##4][c][#1]},
+ -R##3????=>{\getchemicallinesegment[0][-R##3]},
+ +R##3????=>{\getchemicallinesegment[0][+R##3]},
+ \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
+
+\def\executechemicalarrow#1#2[#3]%
+ {\dogetcommalistelement1\from#3\to\toptext
+ \dogetcommalistelement2\from#3\to\bottext
+ \def\dochemicaltext##1%
+ {\dosetsubscripts%
+ $\@@dochemicalstyle{\@@localchemicalformat\strut##1}$%
+ \doresetsubscripts}%
+ \doifelse\@@chemicallocation\v!intext
+ {#1{\dochemicaltext\toptext}}%
+ {\setbox\chemicalsymbols=\hbox
+ {\box\chemicalsymbols
+ \vbox{\halign{##\cr
+ \hbox to 3em{\hss\dochemicaltext{\toptext}\hss}\cr
+ #2%
+ \hbox to 3em{\hss\dochemicaltext{\bottext}\hss}\cr}}}}}
+
+\def\executechemicalGIVES
+ {\executechemicalarrow
+ {\chemicalsinglepicturearrow}% nodig
+ {\rightarrowfill\cr}}
+
+\def\executechemicalEQUILIBRIUM
+ {\executechemicalarrow
+ {\chemicaldoublepicturearrow}% nodig
+ {\rightarrowfill\cr\leftarrowfill\cr}}
+
+\def\executechemicalMESOMERIC
+ {\executechemicalarrow
+ {\chemicalsinglepicturearrow}% nodig
+ {$\leftarrow\hskip-1em$\rightarrowfill\cr}}
+
+\def\executechemicalsign#1[#2]%
+ {\doifelse\@@chemicallocation\v!intext
+ {\dosetsubscripts
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$%
+ \doresetsubscripts}
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols
+ \dosetsubscripts
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$%
+ \doresetsubscripts}}}
+
+\def\executechemicalPLUS
+ {\executechemicalsign{+}}
+
+\def\executechemicalMINUS
+ {\executechemicalsign{-}}
+
+\def\executechemicalEQUAL
+ {\executechemicalsign{=}}
+
+\def\executechemicalSPACE[#1]%
+ {\doifnot\@@chemicallocation\v!intext
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols
+ \quad}}}
+
+\def\executechemicalCHEM[#1]%
+ {\doifnot\@@chemicallocation\v!intext
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$}}}
+
+\def\executechemicalTEXT[#1]%
+ {\doifnot\@@chemicallocation\v!intext
+ {\setbox\chemicalsymbols\hbox
+ {\box\chemicalsymbols#1}}}
+
+%\def\executechemicalLOW[#1]%
+% {\setlowsubscripts}
+%
+%\def\executechemicalHIGH[#1]%
+% {\sethighsubscripts}
+
+\def\putchemicalrule#1#2#3#4%
+ {\ifcase\chemicaldrawingmode
+ \putrule from {#1} {#2} to {#3} {#4}
+ \or
+ \psline(#1,#2)(#3,#4)%
+ \or
+ \bgroup
+ \!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
+ \global\MPdrawingdonetrue
+ \setchemicalattributes
+ \startMPdrawing
+ x1 := \MPdivten[\the\!!counta]u ;
+ y1 := \MPdivten[\the\!!countb]u ;
+ x2 := \MPdivten[\the\!!countc]u ;
+ y2 := \MPdivten[\the\!!countd]u ;
+ draw z1--z2 ;
+ \stopMPdrawing
+ \egroup
+ \fi}
+
+\def\executechemicalcomplex#1%
+ {\bgroup
+ \putchemicalrule {0} {-\@@chemicalbottom} {0} {\@@chemicaltop}%
+ \putchemicalrule {0} {\@@chemicaltop} {#1150} {\@@chemicaltop}%
+ \putchemicalrule {0} {-\@@chemicalbottom} {#1150} {-\@@chemicalbottom}%
+ \egroup}
+
+\def\executechemicalOPENCOMPLEX[#1]%
+ {\executechemicalcomplex+\ignorespaces
+ \executechemicalSPACE[]}
+
+\def\executechemicalCLOSECOMPLEX[#1]%
+ {\executechemicalSPACE[]%
+ \executechemicalcomplex-\ignorespaces}
+
+% nog niet door midden as!
+
+\def\executechemicalverticalsymbol#1#2%
+ {\executechemicalTEXT
+ [$\left#1\relax
+ \dimen0=\@@chemicalunit
+ \scratchcounter=\@@chemicaltop
+ \advance\scratchcounter by \@@chemicalbottom
+ \dimen0=\scratchcounter\dimen0
+ \vcenter to \dimen0{}
+ \dimen2=\@@chemicalunit
+ \dimen2=\@@chemicalright\dimen0
+ \vcenter{\leftskip1em\hsize\dimen2\relax\strut#2\strut}%
+ \right.$]}%
+
+\def\executechemicalUPARROW[#1]%
+ {\executechemicalverticalsymbol\uparrow{#1}}
+
+\def\executechemicalDOWNARROW[#1]%
+ {\executechemicalverticalsymbol\downarrow{#1}}
+
+\def\executechemicalUPDOWNARROW[#1]%
+ {\executechemicalverticalsymbol\updownarrow{#1}}
+
+\let\setchemicalattributes\relax
+
+\setupchemical
+ [\c!width=0,
+ \c!height=0,
+ \c!left=0,
+ \c!right=0,
+ \c!top=0,
+ \c!bottom=0,
+ \c!bodyfont=\the\bodyfontsize,
+ \c!resolution=\outputresolution,
+ \c!scale=\v!medium,
+ \c!size=\v!medium,
+ \c!textsize=\v!big,
+ \c!frame=\v!off,
+ \c!axis=\v!off,
+ \c!state=\v!start,
+ \c!style=\rm,
+ \c!location=,
+ \c!option=,
+ \c!offset=LOW,
+ \c!alternative=1,
+ \c!color=,
+ \c!rulethickness=,
+ \c!rulecolor=,
+ \c!factor=1]
+
+% Tijdelijk plaatsen we deze extra macro's hier.
+%
+% mathontop: \mtop {} {}
+% textontop: \ttop {} {}
+
+\def\putontop#1#2%
+ {\vbox
+ {\halign
+ {\strut\hss##\hss\cr
+ #1\cr
+ #2\cr}}}
+
+\def\ttop#1#2%
+ {\putontop{\tx#1}{#2}}
+
+\def\mtop#1#2%
+ {\vbox
+ {\offinterlineskip
+ \halign
+ {\hss##\hss\cr
+ $\scriptscriptstyle#1$\cr
+ \noalign{\vskip.5ex}%
+ $#2$\cr}}}
+
+\def\ctop#1#2%
+ {\vbox
+ {\offinterlineskip
+ \halign
+ {\hss##\hss\cr
+ $\@@dochemicalstyle{\@@localchemicalformat\scriptscriptstyle#1}$\cr
+ \noalign{\vskip.5ex}%
+ $\@@dochemicalstyle{\@@localchemicalformat#2}$\cr}}}
+
+%D Here are a couple of goodies:
+%D
+%D \startitemize
+%D \item styles hooked into \CONTEXT\ style mechanism
+%D \item support for color and rulethickness (mp mode only)
+%D \item position tracking
+%D \stopitemize
+
+\let\@@chemicalrulecolor\empty
+\let\@@chemicalcolor \empty
+
+\def\setchemicalattributes
+ {\scratchdimen\@@chemicalrulethickness
+ \def\chemicalattributes
+ {withpen pencircle scaled \the\scratchdimen\space
+ withcolor }%
+ \doifelsenothing\@@chemicalrulecolor
+ {\edef\chemicalattributes{\chemicalattributes black}}
+ {\edef\chemicalattributes{\chemicalattributes \MPcolor{\@@chemicalrulecolor}}}%
+ \startMPdrawing
+ drawoptions (\chemicalattributes) ;
+ \stopMPdrawing}
+
+\def\@@dochemicalcolor
+ {\doifsomething\@@chemicalcolor{\color[\@@chemicalcolor]}}
+
+\def\@@dochemicalstyle
+ {\doconvertfont\@@chemicalstyle}
+
+\setupchemical
+ [\c!rulethickness=\linewidth,
+ \c!rulecolor=,
+ \c!color=]
+
+\def\cpos#1#2%
+ {\iftrialtypesetting
+ #2%
+ \else
+ \bgroup
+ \globalpushmacro\dowithchemical
+ \gdef\dowithchemical##1{\hpos{#1}{##1}\globalpopmacro\dowithchemical}%
+ #2%
+ \egroup
+ \fi}
+
+\protect \endinput
+
+% \startchemical[axis=on,frame=yes]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
+
+% \startchemical[size=big,scale=small,axis=on,frame=yes,factor=1.5]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
+
+% \startchemical[size=big,scale=medium,axis=on,frame=yes,factor=1.5]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
+
+% \startchemical[size=big,scale=big,axis=on,frame=yes,factor=1.5]
+% \chemical[SIX,ROT2,B,R36,RZ6][CH_3]
+% \chemical[PB:RZ3,ONE,Z05,SB5,EP37,PE][O,H]
+% \stopchemical
diff --git a/tex/context/base/pret-lua.lua b/tex/context/base/pret-lua.lua
new file mode 100644
index 000000000..8803971f3
--- /dev/null
+++ b/tex/context/base/pret-lua.lua
@@ -0,0 +1,319 @@
+if not modules then modules = { } end modules ['pret-lua'] = {
+ version = 1.001,
+ comment = "companion to buff-ver.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this is not a real parser as we also want to typeset wrong output
+-- and a real parser would choke on that
+
+local utf = unicode.utf8
+
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local utfbyte, utffind = utf.byte, utf.find
+local byte, sub, find, match = string.byte, string.sub, string.find, string.match
+local texsprint, texwrite = tex.sprint, tex.write
+local ctxcatcodes = tex.ctxcatcodes
+
+local visualizer = buffers.newvisualizer("lua")
+
+visualizer.identifiers = { }
+
+-- borrowed from scite
+--
+-- depricated:
+--
+-- gcinfo unpack getfenv setfenv loadlib
+-- table.maxn table.getn table.setn
+-- math.log10 math.mod math.modf math.fmod
+
+visualizer.identifiers.core = {
+ "and", "break", "do", "else", "elseif", "end", "false", "for", "function",
+ "if", "in", "local", "nil", "not", "or", "repeat", "return", "then",
+ "true", "until", "while"
+}
+
+visualizer.identifiers.base = {
+ "assert", "collectgarbage", "dofile", "error", "loadfile",
+ "loadstring", "print", "rawget", "rawset", "require", "tonumber",
+ "tostring", "type",
+}
+
+visualizer.identifiers.five = {
+ "_G", "getmetatable", "ipairs", "next", "pairs",
+ "pcall", "rawequal", "setmetatable", "xpcall", "string", "table",
+ "math", "coroutine", "io", "os", "debug", "load", "module", "select",
+}
+
+visualizer.identifiers.libs = {
+ -- coroutine
+ "coroutine.create", "coroutine.resume", "coroutine.status", "coroutine.wrap",
+ "coroutine.yield", "coroutine.running",
+ -- package
+ "package.cpath", "package.loaded", "package.loadlib", "package.path", "package.config",
+ -- io
+ "io.close", "io.flush", "io.input", "io.lines", "io.open", "io.output",
+ "io.read", "io.tmpfile", "io.type", "io.write", "io.stdin", "io.stdout",
+ "io.stderr", "io.popen",
+ -- math
+ "math.abs", "math.acos", "math.asin", "math.atan", "math.atan2", "math.ceil",
+ "math.cos", "math.deg", "math.exp", "math.floor math.", "math.ldexp",
+ "math.log", "math.max", "math.min", "math.pi", "math.pow",
+ "math.rad", "math.random", "math.randomseed", "math.sin", "math.sqrt",
+ "math.tan", "math.cosh", "math.sinh", "math.tanh",
+ "math.huge",
+ -- string
+ "string.byte", "string.char", "string.dump", "string.find", "string.len",
+ "string.lower", "string.rep", "string.sub", "string.upper", "string.format",
+ "string.gfind", "string.gsub", "string.gmatch", "string.match", "string.reverse",
+ -- table
+ "table.concat", "table.foreach", "table.foreachi",
+ "table.sort", "table.insert", "table.remove",
+ "table.pack", "table.unpack",
+ -- os
+ "os.clock", "os.date", "os.difftime", "os.execute", "os.exit", "os.getenv",
+ "os.remove", "os.rename", "os.setlocale", "os.time", "os.tmpname",
+ -- package
+ "package.preload", "package.seeall",
+ -- bit
+ -- ... todo ...
+}
+
+local known_words = { }
+
+for k,v in next, visualizer.identifiers do
+ for _,w in next, v do
+ known_words[w] = k
+ end
+end
+
+visualizer.styles = {
+ core = "",
+ base = "\\sl ",
+ five = "\\sl ",
+ libs = "\\sl ",
+}
+
+local styles = visualizer.styles
+
+local colors = {
+ "prettyone",
+ "prettytwo",
+ "prettythree",
+ "prettyfour",
+}
+
+local states = {
+ ['"']=1, ["'"]=1, ["[["] = 1, ["]]"] = 1,
+ ['+']=1, ['-']=1, ['*']=1, ['/']=1, ['%']=1, ['^']=1,
+ ["("] = 3, [")"] = 3, ["["] = 3, ["]"] = 3,
+ ['--']=4,
+}
+
+local change_state, finish_state = buffers.change_state, buffers.finish_state
+
+local function flush_lua_word(state, word)
+ if word then
+ local id = known_words[word]
+ if id then
+ state = change_state(2,state)
+ if styles[id] then
+ texsprint(ctxcatcodes,styles[id])
+ end
+ texwrite(word)
+ state = finish_state(state)
+ else
+ state = finish_state(state) -- ?
+ texwrite(word)
+ end
+ else
+ state = finish_state(state)
+ end
+ return state
+end
+
+local incomment, inlongstring = false, false
+
+function visualizer.reset()
+ incomment, inlongstring = false, false -- needs to be hooked into flusher
+end
+
+-- we will also provide a proper parser based pretty printer although normaly
+-- a pretty printer should handle faulty code too (educational purposes)
+
+local function written(state,c,i)
+ if c == " " then
+ state = finish_state(state)
+ texsprint(ctxcatcodes,"\\obs")
+ elseif c == "\t" then
+ state = finish_state(state)
+ texsprint(ctxcatcodes,"\\obs")
+ if buffers.visualizers.enabletab then
+ texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength))
+ end
+ else
+ texwrite(c)
+ end
+ return state, 0
+end
+
+function visualizer.flush_line(str, nested)
+ local state, instr, inesc, word = 0, false, false, nil
+ buffers.currentcolors = colors
+ local code, comment = match(str,"^(.-)%-%-%[%[(.*)$")
+ if comment then
+ -- process the code and then flush the comment
+ elseif incomment then
+ comment, code = match(str,"^(.-)%]%](.*)$")
+ if comment then
+ -- flush the comment and then process the code
+ for c in utfcharacters(comment) do
+ if c == " " then texsprint(ctxcatcodes,"\\obs") else texwrite(c) end
+ end
+ state = change_state(states['--'], state)
+ texwrite("]]")
+ state = finish_state(state)
+ incomment = false
+ else
+ for c in utfcharacters(str) do
+ if c == " " then texsprint(ctxcatcodes,"\\obs") else texwrite(c) end
+ end
+ end
+ comment = nil
+ else
+ code = str
+ end
+ if code and code ~= "" then
+ local pre, post = match(code,"^(.-)%-%-(.*)$")
+ if pre then
+ code = pre
+ end
+ local p, s, i = nil, nil, 0
+ for c in utfcharacters(code) do
+ i = i + 1
+ if instr then
+ if p then
+ texwrite(p)
+ p = nil
+ end
+ if c == s then
+ if inesc then
+ texwrite(c)
+ inesc = false
+ else
+ state = change_state(states[c],state)
+ instr = false
+ texwrite(c)
+ state = finish_state(state)
+ end
+ s = nil
+ else
+ if c == "\\" then
+ inesc = not inesc
+ else
+ inesc = false
+ end
+ state, i = written(state,c,i)
+ end
+ elseif c == "[" then
+ if word then
+ texwrite(word)
+ word = nil
+ end
+ if p == "[" then
+ inlongstring = true
+ state = change_state(states["[["],state)
+ texwrite(p,c)
+ state = finish_state(state)
+ p = nil
+ else
+ if p then
+ state, i = written(state,p,i)
+ end
+ p = c
+ end
+ elseif c == "]" then
+ if word then
+ texwrite(word)
+ word = nil
+ end
+ if p == "]" then
+ inlongstring = false
+ state = change_state(states["]]"],state)
+ texwrite(p,c)
+ state = finish_state(state)
+ p = nil
+ else
+ if p then
+ state, i = written(state,p,i)
+ end
+ p = c
+ end
+ else
+ if p then
+ state = change_state(states[p],state)
+ texwrite(p)
+ state = finish_state(state)
+ p = nil
+ end
+ if c == " " or c == "\t" then
+ if word then
+ state = flush_lua_word(state,word)
+ word = nil
+ end
+ state, i = written(state,c,i)
+ elseif inlongstring then
+ state, i = written(state,c,i)
+ elseif c == '"' or c == "'" then
+if word then
+ state = flush_lua_word(state,word)
+ word = nil
+end
+ instr = true
+ state = change_state(states[c],state)
+ state, i = written(state,c,i)
+ state = finish_state(state)
+ s = c
+ elseif find(c,"^[%a]$") then
+ state = finish_state(state)
+ if word then word = word .. c else word = c end
+ elseif word and (#word > 1) and find(c,"^[%d%.%_]$") then
+ if word then word = word .. c else word = c end
+ else
+ state = flush_lua_word(state,word)
+ word = nil
+ state = change_state(states[c],state)
+ texwrite(c)
+ instr = (c == '"')
+ end
+ end
+ end
+ if p then
+ texwrite(p)
+ -- state, i = written(state,p,i)
+ p = nil
+ end
+ state = flush_lua_word(state,word)
+ if post then
+ state = change_state(states['--'], state)
+ texwrite("--")
+ state = finish_state(state)
+ for c in utfcharacters(post) do
+ state, i = written(state,c,i)
+ end
+ end
+ end
+ if comment then
+ incomment = true
+ state = change_state(states['--'], state)
+ texwrite("[[")
+ state = finish_state(state)
+ -- texwrite(comment) -- maybe also split and
+ for c in utfcharacters(comment) do
+ state, i = written(state,c,i)
+ end
+ end
+ state = finish_state(state)
+end
diff --git a/tex/context/base/pret-mp.lua b/tex/context/base/pret-mp.lua
new file mode 100644
index 000000000..782adf5f5
--- /dev/null
+++ b/tex/context/base/pret-mp.lua
@@ -0,0 +1,236 @@
+if not modules then modules = { } end modules ['pret-mp'] = {
+ version = 1.001,
+ comment = "companion to buff-ver.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local utfbyte, utffind = utf.byte, utf.find
+local texsprint, texwrite = tex.sprint, tex.write
+local ctxcatcodes = tex.ctxcatcodes
+
+local visualizer = buffers.newvisualizer("mp")
+
+visualizer.identifiers = { }
+
+visualizer.identifiers.primitives = {
+ 'charcode', 'day', 'linecap', 'linejoin', 'miterlimit', 'month', 'pausing',
+ 'prologues', 'showstopping', 'time', 'tracingcapsules', 'tracingchoices',
+ 'tracingcommands', 'tracingequations', 'tracinglostchars',
+ 'tracingmacros', 'tracingonline', 'tracingoutput', 'tracingrestores',
+ 'tracingspecs', 'tracingstats', 'tracingtitles', 'truecorners',
+ 'warningcheck', 'year', 'mpprocset',
+ 'false', 'nullpicture', 'pencircle', 'true',
+ 'and', 'angle', 'arclength', 'arctime', 'ASCII', 'bluepart', 'boolean', 'bot',
+ 'char', 'color', 'cosd', 'cycle', 'decimal', 'directiontime', 'floor', 'fontsize',
+ 'greenpart', 'hex', 'infont', 'intersectiontimes', 'known', 'length', 'llcorner',
+ 'lrcorner', 'makepath', 'makepen', 'mexp', 'mlog', 'normaldeviate', 'not',
+ 'numeric', 'oct', 'odd', 'or', 'path', 'pair', 'pen', 'penoffset', 'picture', 'point',
+ 'postcontrol', 'precontrol', 'redpart', 'reverse', 'rotated', 'scaled',
+ 'shifted', 'sind', 'slanted', 'sqrt', 'str', 'string', 'subpath', 'substring',
+ 'transform', 'transformed', 'ulcorner', 'uniformdeviate', 'unknown',
+ 'urcorner', 'xpart', 'xscaled', 'xxpart', 'xypart', 'ypart', 'yscaled', 'yxpart',
+ 'yypart', 'zscaled',
+ 'addto', 'clip', 'input', 'interim', 'let', 'newinternal', 'save', 'setbounds',
+ 'shipout', 'show', 'showdependencies', 'showtoken', 'showvariable',
+ 'special',
+ 'begingroup', 'endgroup', 'of', 'curl', 'tension', 'and', 'controls',
+ 'reflectedabout', 'rotatedaround', 'interpath', 'on', 'off', 'beginfig',
+ 'endfig', 'def', 'vardef', 'enddef', 'epxr', 'suffix', 'text', 'primary', 'secondary',
+ 'tertiary', 'primarydef', 'secondarydef', 'tertiarydef', 'top', 'bottom',
+ 'ulft', 'urt', 'llft', 'lrt', 'randomseed', 'also', 'contour', 'doublepath',
+ 'withcolor', 'withpen', 'dashed', 'if', 'else', 'elseif', 'fi', 'for', 'endfor', 'forever', 'exitif',
+ 'forsuffixes', 'downto', 'upto', 'step', 'until',
+ 'charlist', 'extensible', 'fontdimen', 'headerbyte', 'kern', 'ligtable',
+ 'boundarychar', 'chardp', 'charext', 'charht', 'charic', 'charwd', 'designsize',
+ 'fontmaking', 'charexists',
+ 'cullit', 'currenttransform', 'gfcorners', 'grayfont', 'hround',
+ 'imagerules', 'lowres_fix', 'nodisplays', 'notransforms', 'openit',
+ 'displaying', 'currentwindow', 'screen_rows', 'screen_cols',
+ 'pixels_per_inch', 'cull', 'display', 'openwindow', 'numspecial',
+ 'totalweight', 'autorounding', 'fillin', 'proofing', 'tracingpens',
+ 'xoffset', 'chardx', 'granularity', 'smoothing', 'turningcheck', 'yoffset',
+ 'chardy', 'hppp', 'tracingedges', 'vppp',
+ 'extra_beginfig', 'extra_endfig', 'mpxbreak',
+ 'end', 'btex', 'etex', 'verbatimtex'
+}
+
+visualizer.identifiers.plain = {
+ 'ahangle', 'ahlength', 'bboxmargin', 'defaultpen', 'defaultscale',
+ 'labeloffset', 'background', 'currentpen', 'currentpicture', 'cuttings',
+ 'defaultfont', 'extra_beginfig', 'extra_endfig',
+ 'beveled', 'black', 'blue', 'bp', 'butt', 'cc', 'cm', 'dd', 'ditto', 'down', 'epsilon',
+ 'evenly', 'fullcircle', 'green', 'halfcircle', 'identity', 'in', 'infinity', 'left',
+ 'mitered', 'mm', 'origin', 'pensquare', 'pt', 'quartercircle', 'red', 'right',
+ 'rounded', 'squared', 'unitsquare', 'up', 'white', 'withdots',
+ 'abs', 'bbox', 'ceiling', 'center', 'cutafter', 'cutbefore', 'dir',
+ 'directionpoint', 'div', 'dotprod', 'intersectionpoint', 'inverse', 'mod', 'lft',
+ 'round', 'rt', 'unitvector', 'whatever',
+ 'cutdraw', 'draw', 'drawarrow', 'drawdblarrow', 'fill', 'filldraw', 'drawdot',
+ 'loggingall', 'pickup', 'tracingall', 'tracingnone', 'undraw', 'unfill',
+ 'unfilldraw',
+ 'buildcycle', 'dashpattern', 'decr', 'dotlabel', 'dotlabels', 'drawoptions',
+ 'incr', 'label', 'labels', 'max', 'min', 'thelabel', 'z',
+ 'beginchar', 'blacker', 'capsule_end', 'change_width',
+ 'define_blacker_pixels', 'define_corrected_pixels',
+ 'define_good_x_pixels', 'define_good_y_pixels',
+ 'define_horizontal_corrected_pixels', 'define_pixels',
+ 'define_whole_blacker_pixels', 'define_whole_pixels',
+ 'define_whole_vertical_blacker_pixels',
+ 'define_whole_vertical_pixels', 'endchar', 'extra_beginchar',
+ 'extra_endchar', 'extra_setup', 'font_coding_scheme',
+ 'font_extra_space'
+}
+
+visualizer.identifiers.metafun = {
+ 'unitcircle', 'fulldiamond', 'unitdiamond',
+ 'halfcircle', 'quartercircle',
+ 'llcircle', 'lrcircle', 'urcircle', 'ulcircle',
+ 'tcircle', 'bcircle', 'lcircle', 'rcircle',
+ 'lltriangle', 'lrtriangle', 'urtriangle', 'ultriangle',
+ 'smoothed', 'cornered', 'superellipsed', 'randomized', 'squeezed',
+ 'punked', 'curved', 'unspiked', 'simplified', 'blownup', 'stretched',
+ 'paralled', 'enlonged', 'shortened',
+ 'enlarged', 'leftenlarged', 'topenlarged', 'rightenlarged', 'bottomenlarged',
+ 'llenlarged', 'lrenlarged', 'urenlarged', 'ulenlarged',
+ 'llmoved', 'lrmoved', 'urmoved', 'ulmoved',
+ 'boundingbox', 'innerboundingbox', 'outerboundingbox',
+ 'bottomboundary', 'leftboundary', 'topboundary', 'rightboundary',
+ 'xsized', 'ysized', 'xysized',
+ 'cmyk', 'transparent', 'withshade', 'spotcolor',
+ 'drawfill', 'undrawfill',
+ 'inverted', 'uncolored', 'softened', 'grayed',
+ 'textext', 'graphictext',
+ 'loadfigure', 'externalfigure'
+}
+
+visualizer.styles = {
+ primitives = "",
+ plain = "\\sl",
+ metafun = "\\sl",
+}
+
+local styles = visualizer.styles
+
+-- btex .. etex
+
+local colors = {
+ "prettyone",
+ "prettytwo",
+ "prettythree",
+ "prettyfour",
+}
+
+local states = {
+ [';']=1, ['$']=1, ['@']=1, ['#']=1,
+ ['\\']=2,
+ ['(']=3, [')']=3, ['[']=3, [']']=3, [':']=3, ['=']=3, ['<']=3, ['>']=3, ['"']=3,
+ ['-']=4, ['+']=4, ['/']=4, ['*']=4, ['|']=4, ['`']=4, ['!']=4, ['?']=4, ['^']=4, ['&']=4, ['%']=4,
+ ['%']=4, ['.']=4, [',']=4
+}
+
+local known_words = { }
+
+for k,v in next, visualizer.identifiers do
+ for _,w in next, v do
+ known_words[w] = k
+ end
+end
+
+local change_state, finish_state = buffers.change_state, buffers.finish_state
+
+local function flush_mp_word(state, word, intex)
+ if word then
+ if intex then
+ if word == 'etex' then
+ state = change_state(2,state)
+ texwrite(word)
+ state = finish_state(state)
+ return state, false
+ else
+ texwrite(word)
+ return state, true
+ end
+ else
+ local id = known_words[word]
+ if id then
+ state = change_state(2,state)
+ if styles[id] then
+ texsprint(ctxcatcodes,styles[id])
+ end
+ texwrite(word)
+ state = finish_state(state)
+ return state, (word == 'btex') or (word == 'verbatimtex')
+ else
+ state = finish_state(state)
+ texwrite(word)
+ return state, intex
+ end
+ end
+ else
+ state = finish_state(state)
+ return state, intex
+ end
+end
+
+-- todo: split string in code and comment, and escape comment fast
+-- could be generic
+
+-- to be considered: visualizer => table [result, instr, incomment, word]
+
+function visualizer.flush_line(str,nested)
+ local state, word, instr, intex, incomment = 0, nil, false, false, false
+ buffers.currentcolors = colors
+ for c in utfcharacters(str) do
+ if c == " " then
+ state, intex = flush_mp_word(state, word, intex)
+ word = nil
+ texsprint(ctxcatcodes,"\\obs")
+ elseif incomment then
+ texwrite(c)
+ elseif c == '%' then
+ state = change_state(states[c], state)
+ incomment = true
+ texwrite(c)
+ state = finish_state(state)
+ elseif instr then
+ if c == '"' then
+ state = change_state(states[c],state)
+ instr = false
+ texwrite(c)
+ state = finish_state(state)
+ else
+ texwrite(c)
+ end
+ elseif intex then
+ if utffind(c,"^[%a]$") then
+ if word then word = word .. c else word = c end
+ else
+ state, intex = flush_mp_word(state, word, intex)
+ word = nil
+ if intex then
+ texwrite(c)
+ else
+ state = change_state(states[c], state)
+ texwrite(c)
+ end
+ end
+ elseif utffind(c,"^[%a]$") then
+ state = finish_state(state)
+ if word then word = word .. c else word = c end
+ else
+ state, intex = flush_mp_word(state, word, intex)
+ word = nil
+ state = change_state(states[c], state)
+ texwrite(c)
+ state = finish_state(state)
+ instr = (c == '"')
+ end
+ end
+ state, intex = flush_mp_word(state, word, intex)
+ state = finish_state(state)
+end
diff --git a/tex/context/base/pret-tex.lua b/tex/context/base/pret-tex.lua
new file mode 100644
index 000000000..5d128fa3b
--- /dev/null
+++ b/tex/context/base/pret-tex.lua
@@ -0,0 +1,87 @@
+if not modules then modules = { } end modules ['pret-tex'] = {
+ version = 1.001,
+ comment = "companion to buff-ver.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local utfbyte, utffind = utf.byte, utf.find
+local rep = string.rep
+local texsprint, texwrite = tex.sprint, tex.write
+local ctxcatcodes, vrbcatcodes = tex.ctxcatcodes, tex.vrbcatcodes
+
+local visualizer = buffers.newvisualizer("tex")
+
+local colors = {
+ "prettytwo",
+ "prettyone",
+ "prettythree",
+ "prettyfour"
+}
+
+local states = {
+ ['$']=2, ['{']=2, ['}']=2,
+ ['[']=3, [']']=3, ['(']=3, [')']=3, ['<']=3, ['>']=3, ['#']=3, ['=']=3, ['"']=3,
+ ['/']=4, ['^']=4, ['_']=4, ['-']=4, ['&']=4, ['+']=4, ["'"]=4, ['`']=4, ['|']=4, ['%']=4
+}
+
+-- some day I'll make an lpeg
+
+local change_state, finish_state = buffers.change_state, buffers.finish_state
+
+local chardata = characters.data
+local is_letter = characters.is_letter
+
+function visualizer.flush_line(str,nested)
+ local state, first, i = 0, false, 0
+ buffers.currentcolors = colors
+ for c in utfcharacters(str) do
+ i = i + 1
+ if c == " " then
+ state = finish_state(state)
+ texsprint(ctxcatcodes,"\\obs")
+ first = false
+ elseif c == "\t" then
+ state = finish_state(state)
+ texsprint(ctxcatcodes,"\\obs")
+ if buffers.visualizers.enabletab then
+ texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength))
+ i = 0
+ end
+ first = false
+ elseif first then
+ state = 1
+ texwrite(c)
+ if not utffind(c,"^[%a%!%?%@]$") then
+ state = finish_state(state)
+ end
+ first = false
+ elseif state == 1 then
+ if utffind(c,"^[%a%!%?%@]$") then
+ texwrite(c)
+ first = false
+ elseif c == "\\" then
+ state = change_state(1, state)
+ texwrite(c)
+ first = true
+ else
+ state = change_state(states[c], state)
+ texwrite(c)
+ first = false
+ end
+ elseif c == "\\" then
+ first = true
+ state = change_state(1, state)
+ texwrite(c)
+ else
+ state = change_state(states[c], state)
+ texwrite(c)
+ first = false
+ end
+ end
+ state = finish_state(state)
+end
diff --git a/tex/context/base/pret-xml.lua b/tex/context/base/pret-xml.lua
new file mode 100644
index 000000000..b11dccb99
--- /dev/null
+++ b/tex/context/base/pret-xml.lua
@@ -0,0 +1,136 @@
+if not modules then modules = { } end modules ['pret-xml'] = {
+ version = 1.001,
+ comment = "companion to buff-ver.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- line by line, no check because can be snippet (educational) and
+-- a somewhat simplified view on xml; we forget about dtd's and
+-- cdata (some day i'll make a visualizer for valid xml using the
+-- built in parser)
+
+local utf = unicode.utf8
+
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local utfbyte, utffind = utf.byte, utf.find
+local rep = string.rep
+local texsprint, texwrite = tex.sprint, tex.write
+local ctxcatcodes = tex.ctxcatcodes
+
+local visualizer = buffers.newvisualizer("xml")
+
+local colors = {
+ "prettytwo",
+ "prettyone",
+ "prettythree",
+ "prettyfour"
+}
+
+local states = {
+ ['"']=2, ["'"]=2,
+ ["-"]=1, ["?"]=1, ["!"]=1, [":"]=1, ["_"]=1, ["/"]=1,
+}
+
+local change_state, finish_state = buffers.change_state, buffers.finish_state
+
+local state, intag, dotag, inentity, inquote
+
+function visualizer.reset()
+ state, intag, dotag, inentity, inquote = 0, false, false, false, false
+end
+
+function visualizer.flush_line(str,nested)
+ buffers.currentcolors = colors
+ for c in utfcharacters(str) do
+ if c == "&" then
+ inentity = true -- no further checking
+ state = change_state(3, state)
+ texwrite(c)
+ elseif c == ";" then
+ if inentity then
+ inentity = false
+ state = change_state(3, state)
+ texwrite(c)
+ state = finish_state(state)
+ else
+ texwrite(c)
+ end
+ elseif inentity then
+ state = change_state(3, state)
+ texwrite(c)
+ elseif c == " " then
+ state = finish_state(state)
+ texsprint(ctxcatcodes,"\\obs")
+ intag = false
+ elseif c == "\t" then
+ state = finish_state(state)
+ texsprint(ctxcatcodes,"\\obs")
+ if buffers.visualizers.enabletab then
+ texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength))
+ end
+ intag = false
+ elseif c == "<" then
+ if intag then
+ state = finish_state(state)
+ -- error
+ else
+ intag = 1
+ dotag = true
+ state = change_state(1, state)
+ end
+ texwrite(c)
+ elseif c == ">" then
+ if intag then
+ texwrite(c)
+ state = finish_state(state)
+ intag, dotag = false, false
+ elseif dotag then
+ state = change_state(1, state)
+ texwrite(c)
+ state = finish_state(state)
+ intag, dotag = false, false
+ else
+ state = finish_state(state)
+ texwrite(c)
+ end
+ elseif intag then
+ if utffind(c,"^[%S]$") then
+ state = change_state(1, state)
+ texwrite(c)
+ intag = intag + 1
+ else
+ intag = false
+ state = finish_state(state)
+ texwrite(c)
+ end
+ elseif dotag then
+ if c == "'" or c == '"' then
+ if inquote then
+ if c == inquote then
+ state = change_state(states[c], state) -- 2
+ texwrite(c)
+ state = finish_state(state)
+ inquote = false
+ else
+ texwrite(c)
+ end
+ else
+ inquote = c
+ state = change_state(states[c], state)
+ texwrite(c)
+ state = finish_state(state)
+ end
+ elseif inquote then
+ texwrite(c)
+ else
+ state = change_state(states[c], state)
+ texwrite(c)
+ end
+ else
+ texwrite(c)
+ end
+ end
+ state = finish_state(state)
+end
diff --git a/tex/context/base/prop-ini.mkii b/tex/context/base/prop-ini.mkii
new file mode 100644
index 000000000..035a40c93
--- /dev/null
+++ b/tex/context/base/prop-ini.mkii
@@ -0,0 +1,150 @@
+%D \module
+%D [ file=prop-ini,
+%D version=2003.04.20,
+%D title=\CONTEXT\ Property 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 Property Macros / Initialization}
+
+%D Welcome to the third alternative of this yet undocumented module,
+%D which means that there is no public interface yet!
+
+\unprotect
+
+\newcount\propertylevel
+
+\def\currentpropertylevel {\csname\??py:l:\currentpropertytype\endcsname} % counter
+\def\previouspropertylevel{\csname\??py:p:\currentpropertytype\endcsname} % counter
+
+\def\currentproperty {\csname\??py:c:\number\currentpropertylevel \endcsname} % string
+\def\previousproperty {\csname\??py:c:\number\previouspropertylevel\endcsname} % string
+
+% more efficient:
+
+\def\currentproperty {\csname\??py:c:\number\propertylevel\endcsname} % string
+\def\currentpropertytype {\csname\??py\currentproperty\c!type\endcsname}
+
+\def\docheckproperty % watch the s instead of e
+ {\csname\s!check\currentpropertytype property\endcsname
+ \global\expandafter\let\csname\??py\s!check\currentproperty\endcsname\empty}
+
+\def\checkproperty[#1]%
+ {\bgroup
+ \def\currentproperty{#1}%
+ \csname\??py\s!check\currentproperty\endcsname
+ \egroup}
+
+\unexpanded\def\property[#1]%
+ {\groupedcommand{\dostartproperty{#1}}\dostopproperty}
+
+\unexpanded\def\startproperty[#1]%
+ {\dostartproperty{#1}}
+
+\unexpanded\def\stopproperty
+ {\dostopproperty}
+
+\def\dostartgproperty
+ {\begingroup\dostartproperty}
+
+\def\dostopgproperty
+ {\dostopproperty\endgroup}
+
+\def\dostartproperty#1% evt pack: {current}{level}{
+ {\global\advance\propertylevel\plusone
+ \@EAEAEA\xdef\currentproperty{#1}%
+ \global\advance\previouspropertylevel\plusone
+ \global\advance\currentpropertylevel\plusone
+ \csname\??py\s!check\currentproperty\endcsname
+ \csname\s!start\currentpropertytype\s!property\endcsname}
+
+\def\dostopproperty
+ {\csname\s!stop\currentpropertytype\s!property\endcsname
+ \global\advance\currentpropertylevel\minusone
+ \global\advance\previouspropertylevel\minusone
+ \global\advance\propertylevel\minusone}
+
+\def\defineproperty
+ {\dotripleempty\dodefineproperty}
+
+\def\dodefineproperty[#1]%
+ {\ifcsname\??py#1\c!global\endcsname
+ \expandafter\nododefineproperty
+ \else
+ \expandafter\dododefineproperty
+ \fi[#1]}
+
+% due to initializations/counters, definitions are always global
+%
+% global : yes : ungrouped
+% no : grouped
+% method : command : define commands
+% none : no commands
+
+\def\dododefineproperty[#1][#2][#3]% global ! ! !
+ {\getgparameters[\??py#1][\c!global=\v!no,\c!type=#2,\c!method=\v!none,#3]% global ! ! ! !
+ \ifcsname\??py:l:#2\endcsname \else
+ \expandafter\newcount\csname\??py:l:#2\endcsname % current level
+ \expandafter\newcount\csname\??py:p:#2\endcsname % previous level
+ \global\csname\??py:p:#2\endcsname\minusone
+ \global\expandafter\expandafter\let\csname\??py:c:0\endcsname\empty
+ \fi
+ \letgvalue{\??py\s!check#1}\docheckproperty
+ \doifelsevalue{\??py#1\c!method}\v!command
+ {\doifelsevalue{\??py#1\c!global}\v!yes
+ {\setgvalue{\e!start#1}{\dostartproperty{#1}}%
+ \letgvalue{\e!stop #1}\dostopproperty}%
+ {\setgvalue{\e!start#1}{\dostartgproperty{#1}}%
+ \letgvalue{\e!stop #1}\dostopgproperty}}%
+ {\doifelsevalue{\??py#1\c!global}\v!yes
+ {\setgvalue{\e!start#2}[##1]{\dostartproperty{##1}}%
+ \letgvalue{\e!stop #2}\dostopproperty}%
+ {\setgvalue{\e!start#2}[##1]{\dostartgproperty{##1}}%
+ \letgvalue{\e!stop #2}\dostopgproperty}}}
+
+\def\nododefineproperty[#1][#2][#3]%
+ {}
+
+\def\doifelseproperty#1{\doifdefinedelse{\??py#1\c!global}}
+
+\def\setupproperty
+ {\dodoubleempty\dosetupproperty}
+
+\def\dosetupproperty[#1][#2]% local
+ {\ifsecondargument
+ \getparameters[\??py#1][#2]%
+ \else
+ \getparameters[\??py][#1]%
+ \fi}
+
+\letvalue{\??py\s!empty}\empty
+
+% beware, normally \*parameter concerns the current one
+
+\def\propertyparameter#1#2% expands to #1 when not defined (see \define...)
+ {\csname\??py
+ \ifcsname\??py#1#2\endcsname
+ #1#2%
+ \else\ifcsname\??py\csname\??py#1\c!type\endcsname#2\endcsname
+ \csname\??py#1\c!type\endcsname#2%
+ \else
+ \s!empty
+ \fi\fi
+ \endcsname}
+
+\def\currentpropertyparameter % self and class
+ {\propertyparameter\currentproperty}
+
+\def\checkedpropertyparameter#1% only self
+ {\executeifdefined{\??py\currentproperty#1}}
+
+\def\definepropertyhandler#1{\setvalue{\??py*#1}}
+\def\propertyhandler #1{\getvalue{\??py*#1}}
+
+\protect \endinput
diff --git a/tex/context/base/prop-ini.mkiv b/tex/context/base/prop-ini.mkiv
new file mode 100644
index 000000000..97d72582e
--- /dev/null
+++ b/tex/context/base/prop-ini.mkiv
@@ -0,0 +1,150 @@
+%D \module
+%D [ file=prop-ini,
+%D version=2003.04.20,
+%D title=\CONTEXT\ Property 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 Property Macros / Initialization}
+
+%D Welcome to the third alternative of this yet undocumented module,
+%D which means that there is no public interface yet!
+
+\unprotect
+
+\newcount\propertylevel
+
+\def\currentpropertylevel {\csname\??py:l:\currentpropertytype\endcsname} % counter
+\def\previouspropertylevel{\csname\??py:p:\currentpropertytype\endcsname} % counter
+
+\def\currentproperty {\csname\??py:c:\number\currentpropertylevel \endcsname} % string
+\def\previousproperty {\csname\??py:c:\number\previouspropertylevel\endcsname} % string
+
+% more efficient:
+
+\def\currentproperty {\csname\??py:c:\number\propertylevel\endcsname} % string
+\def\currentpropertytype {\csname\??py\currentproperty\c!type\endcsname}
+
+\def\docheckproperty % watch the s instead of e
+ {\csname\s!check\currentpropertytype property\endcsname
+ \global\expandafter\let\csname\??py\s!check\currentproperty\endcsname\empty}
+
+\def\checkproperty[#1]%
+ {\bgroup
+ \def\currentproperty{#1}%
+ \csname\??py\s!check\currentproperty\endcsname
+ \egroup}
+
+\unexpanded\def\property[#1]%
+ {\groupedcommand{\dostartproperty{#1}}\dostopproperty}
+
+\unexpanded\def\startproperty[#1]%
+ {\dostartproperty{#1}}
+
+\unexpanded\def\stopproperty
+ {\dostopproperty}
+
+\def\dostartgproperty
+ {\begingroup\dostartproperty}
+
+\def\dostopgproperty
+ {\dostopproperty\endgroup}
+
+\def\dostartproperty#1% evt pack: {current}{level}{
+ {\global\advance\propertylevel\plusone
+ \@EAEAEA\xdef\currentproperty{#1}%
+ \global\advance\previouspropertylevel\plusone
+ \global\advance\currentpropertylevel\plusone
+ \csname\??py\s!check\currentproperty\endcsname
+ \csname\s!start\currentpropertytype\s!property\endcsname}
+
+\def\dostopproperty
+ {\csname\s!stop\currentpropertytype\s!property\endcsname
+ \global\advance\currentpropertylevel\minusone
+ \global\advance\previouspropertylevel\minusone
+ \global\advance\propertylevel\minusone}
+
+\unexpanded\def\defineproperty
+ {\dotripleempty\dodefineproperty}
+
+\def\dodefineproperty[#1]%
+ {\ifcsname\??py#1\c!global\endcsname
+ \expandafter\nododefineproperty
+ \else
+ \expandafter\dododefineproperty
+ \fi[#1]}
+
+% due to initializations/counters, definitions are always global
+%
+% global : yes : ungrouped
+% no : grouped
+% method : command : define commands
+% none : no commands
+
+\def\dododefineproperty[#1][#2][#3]% global ! ! !
+ {\getgparameters[\??py#1][\c!global=\v!no,\c!type=#2,\c!method=\v!none,#3]% global ! ! ! !
+ \ifcsname\??py:l:#2\endcsname \else
+ \expandafter\newcount\csname\??py:l:#2\endcsname % current level
+ \expandafter\newcount\csname\??py:p:#2\endcsname % previous level
+ \global\csname\??py:p:#2\endcsname\minusone
+ \global\expandafter\let\csname\??py:c:0\endcsname\empty
+ \fi
+ \letgvalue{\??py\s!check#1}\docheckproperty
+ \doifelsevalue{\??py#1\c!method}\v!command
+ {\doifelsevalue{\??py#1\c!global}\v!yes
+ {\setugvalue{\e!start#1}{\dostartproperty{#1}}%
+ \setugvalue{\e!stop #1}{\dostopproperty}}%
+ {\setugvalue{\e!start#1}{\dostartgproperty{#1}}%
+ \setugvalue{\e!stop #1}{\dostopgproperty}}}%
+ {\doifelsevalue{\??py#1\c!global}\v!yes
+ {\setugvalue{\e!start#2}[##1]{\dostartproperty{##1}}%
+ \setugvalue{\e!stop #2}{\dostopproperty}}%
+ {\setugvalue{\e!start#2}[##1]{\dostartgproperty{##1}}%
+ \setugvalue{\e!stop #2}{\dostopgproperty}}}}
+
+\def\nododefineproperty[#1][#2][#3]%
+ {}
+
+\def\doifelseproperty#1{\doifdefinedelse{\??py#1\c!global}}
+
+\unexpanded\def\setupproperty
+ {\dodoubleempty\dosetupproperty}
+
+\def\dosetupproperty[#1][#2]% local
+ {\ifsecondargument
+ \getparameters[\??py#1][#2]%
+ \else
+ \getparameters[\??py][#1]%
+ \fi}
+
+\letvalue{\??py\s!empty}\empty
+
+% beware, normally \*parameter concerns the current one
+
+\def\propertyparameter#1#2% expands to #1 when not defined (see \define...)
+ {\csname\??py
+ \ifcsname\??py#1#2\endcsname
+ #1#2%
+ \else\ifcsname\??py\csname\??py#1\c!type\endcsname#2\endcsname
+ \csname\??py#1\c!type\endcsname#2%
+ \else
+ \s!empty
+ \fi\fi
+ \endcsname}
+
+\def\currentpropertyparameter % self and class
+ {\propertyparameter\currentproperty}
+
+\def\checkedpropertyparameter#1% only self
+ {\ifcsname\??py\currentproperty#1\endcsname\csname\??py\currentproperty#1\endcsname\fi}
+
+\unexpanded\def\definepropertyhandler#1{\setvalue{\??py*#1}}
+\def\propertyhandler #1{\getvalue{\??py*#1}}
+
+\protect \endinput
diff --git a/tex/context/base/prop-lay.mkii b/tex/context/base/prop-lay.mkii
new file mode 100644
index 000000000..aeec94bb2
--- /dev/null
+++ b/tex/context/base/prop-lay.mkii
@@ -0,0 +1,143 @@
+%D \module
+%D [ file=prop-lay,
+%D version=2003.04.20,
+%D title=\CONTEXT\ Property Macros,
+%D subtitle=Layers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Property Macros / Layers}
+
+%D Highly experimental, will probably change/evolve. Also, quite certainly
+%D we will no longer share code between mkii and mkiv.
+
+\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}
+
+\setglobalsystemreference \rt!exec \v!HideLayer {hidelayer}
+\setglobalsystemreference \rt!exec \v!VideLayer {videlayer}
+\setglobalsystemreference \rt!exec \v!ToggleLayer {togglelayer}
+
+\setexecutecommandcheck {hidelayer} \domakelayerpropertylist
+\setexecutecommandcheck {videlayer} \domakelayerpropertylist
+\setexecutecommandcheck {togglelayer} \domakelayerpropertylist
+
+% \currentlayerproperty
+% \checklayerproperty
+% \startlayerproperty
+% \stoplayerproperty
+% \domakelayerpropertylist
+
+%D \starttext
+%D
+%D \setuppapersize[S4][S4]
+%D \setuplayout[middle]
+%D \setupcolors[state=start]
+%D \setupinteraction[state=start,color=,contrastcolor=]
+%D
+%D \defineproperty [L1] [layer] [title=layer 1]
+%D \defineproperty [L2] [layer] [title=layer 2]
+%D
+%D \button{HIDE L1}[HideLayer{L1}]
+%D \button{VIDE L1}[VideLayer{L1}]
+%D \button{TOGGLE L1}[ToggleLayer{L1}]
+%D
+%D \button{HIDE L2}[HideLayer{L2}]
+%D \button{VIDE L2}[VideLayer{L2}]
+%D \button{TOGGLE L2}[ToggleLayer{L2}]
+%D
+%D \noheaderandfooterlines \centerbox{\startoverlay
+%D {\definedfont[Mono at 150pt]%
+%D \startproperty[L1]\red TEST\stopproperty}
+%D {\definedfont[Mono at 150pt]%
+%D \startproperty[L2]\green TEST\stopproperty}
+%D \stopoverlay} \page
+%D
+%D \noheaderandfooterlines \centerbox{\startoverlay
+%D {\definedfont[Mono at 15pt]%
+%D \goto{\startproperty[L1]\red TEST\stopproperty}[CloseDocument]}
+%D {\definedfont[Mono at 15pt]%
+%D \goto{\startproperty[L2]\green TEST\stopproperty}[CloseDocument]}
+%D \stopoverlay} \page
+%D
+%D \startproperty[L1]
+%D level 1 \startproperty[L2]level 2 \stopproperty level 1
+%D \stopproperty
+%D
+%D \startproperty[L1]
+%D level 1 \page \startproperty[L2]level 2 \stopproperty level 1
+%D \stopproperty
+%D
+%D \stoptext
+
+%D Handy for tracing:
+
+\def\showlayoutcomponents
+ {\let\startlayoutcomponent\dostartlayoutcomponent
+ \let\stoplayoutcomponent \dostoplayoutcomponent}
+
+\def\dodefinelayoutcomponent#1#2%
+ {\doifelsenothing{#2}%
+ {\defineproperty[#1][\s!layer]}%
+ {\defineproperty[#1][\s!layer][\c!title=#2]}}
+
+\def\dostartlayoutcomponent#1#2%
+ {\doifelseproperty{#1}\donothing{\dodefinelayoutcomponent{#1}{#2}}%
+ \startproperty[#1]}
+
+\def\dostoplayoutcomponent
+ {\stopproperty}
+
+\let\startlayoutcomponent\gobbletwoarguments
+\let\stoplayoutcomponent \relax
+
+\protect \endinput
+
+% \def\remaplayering
+% {\dodoubleargument\doremaplayering}
+%
+% \def\remaplayering[#1][#2]%
+% {\setvalue{\??lm#1}{#2}}
+%
+% \def\remappedlayering#1%
+% {\ifcsname\??lm#1\endcsname
+% \@EA\remappedlayering\csname\??lm#1\endcsname\else#1%
+% \fi}
+%
+% \def\startshowlayering#1#2%
+% {\ifshowlayering
+% \defineproperty[\remappedlayering{#1}][\s!layer][\c!titel=#2]%
+% \startproperty[\remappedlayering{#1}]%
+% \fi}
diff --git a/tex/context/base/prop-lay.mkiv b/tex/context/base/prop-lay.mkiv
new file mode 100644
index 000000000..7711dae52
--- /dev/null
+++ b/tex/context/base/prop-lay.mkiv
@@ -0,0 +1,140 @@
+%D \module
+%D [ file=prop-lay,
+%D version=2003.04.20,
+%D title=\CONTEXT\ Property Macros,
+%D subtitle=Layers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Property Macros / Layers}
+
+%D Highly experimental, will probably change/evolve. Also, quite certainly
+%D we will no longer share code between mkii and mkiv.
+
+% test, nesting is somewhat special with layers
+%
+% \defineproperty[hans][layer]
+% \defineproperty[ton] [layer]
+% \setupheadertexts[no layer]
+% 1\startproperty[hans]2\startproperty[ton]3\stopproperty4\stopproperty5
+
+\unprotect
+
+% will be redone ... no longer using property mechanism (less clashes)
+
+\let\currentviewerlayer\empty
+
+\appendtoks
+ \let\currentviewerlayer\empty
+\to \everypagebody
+
+\unexpanded\def\startlayerproperty
+ {\pushmacro\currentviewerlayer % grouped (used in interaction)
+ \let\currentlayerproperty\currentproperty % can be cross group
+ \dotriggerviewerlayer\currentlayerproperty}
+
+\unexpanded\def\stoplayerproperty
+ {\popmacro\currentviewerlayer % grouped (used in interaction)
+ \let\currentlayerproperty\previousproperty % can be cross group
+ \dotriggerviewerlayer\currentlayerproperty}
+
+\def\checklayerproperty % could be made more clever
+ {\registerviewerlayer\currentproperty\currentproperty
+ \ctxlua{backends.codeinjections.defineviewerlayer{
+ tag = "\currentproperty",
+ title = "\checkedpropertyparameter\c!title\currentproperty",
+ visible = "\checkedpropertyparameter\c!state\v!start",
+ kind = 0, % 1 == frozen
+ printable = "\checkedpropertyparameter\v!printable\v!yes" % v! looks wrong
+ }}}
+
+%D \starttext
+%D
+%D \setuppapersize[S4][S4]
+%D \setuplayout[middle]
+%D \setupcolors[state=start]
+%D \setupinteraction[state=start,color=,contrastcolor=]
+%D
+%D \defineproperty [L1] [layer] [title=layer 1]
+%D \defineproperty [L2] [layer] [title=layer 2]
+%D
+%D \button{HIDE L1}[HideLayer{L1}]
+%D \button{VIDE L1}[VideLayer{L1}]
+%D \button{TOGGLE L1}[ToggleLayer{L1}]
+%D
+%D \button{HIDE L2}[HideLayer{L2}]
+%D \button{VIDE L2}[VideLayer{L2}]
+%D \button{TOGGLE L2}[ToggleLayer{L2}]
+%D
+%D \noheaderandfooterlines \centerbox{\startoverlay
+%D {\definedfont[Mono at 150pt]%
+%D \startproperty[L1]\red TEST\stopproperty}
+%D {\definedfont[Mono at 150pt]%
+%D \startproperty[L2]\green TEST\stopproperty}
+%D \stopoverlay} \page
+%D
+%D \noheaderandfooterlines \centerbox{\startoverlay
+%D {\definedfont[Mono at 15pt]%
+%D \goto{\startproperty[L1]\red TEST\stopproperty}[CloseDocument]}
+%D {\definedfont[Mono at 15pt]%
+%D \goto{\startproperty[L2]\green TEST\stopproperty}[CloseDocument]}
+%D \stopoverlay} \page
+%D
+%D \startproperty[L1]
+%D level 1 \startproperty[L2]level 2 \stopproperty level 1
+%D \stopproperty
+%D
+%D \startproperty[L1]
+%D level 1 \page \startproperty[L2]level 2 \stopproperty level 1
+%D \stopproperty
+%D
+%D \stoptext
+
+\def\doinitializelayoutcomponent#1#2%
+ {\ctxlua{backends.codeinjections.defineviewerlayer{% this will move to the lua end i.e be merged with register
+ tag = "#1:#2",
+ title = "#1 #2",
+ visible = "\v!start",
+ kind = 0, % 1 == frozen
+ printable = "\v!yes"
+ }}%
+ \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(viewerlayers.register('#1:#2',true))}\relax}%
+ \expandafter\glet\csname\??ly>#1:#2\endcsname\layoutcomponentboxattribute}
+
+\def\dosetlayoutcomponentattribute#1#2% make this faster
+ {\expandafter\let\expandafter\layoutcomponentboxattribute\csname\??ly>#1:#2\endcsname
+ \ifx\layoutcomponentboxattribute\relax
+ \doinitializelayoutcomponent{#1}{#2}% get rid of { }
+ \fi}
+
+\def\doresetlayoutcomponentattribute
+ {\let\layoutcomponentboxattribute\empty}
+
+\let\setlayoutcomponentattribute \gobbletwoarguments
+\let\resetlayoutcomponentattribute\relax
+\let\layoutcomponentboxattribute \empty
+
+\def\showlayoutcomponents
+ {\ctxlua{viewerlayers.enable()}%
+ \let\setlayoutcomponentattribute \dosetlayoutcomponentattribute
+ \let\resetlayoutcomponentattribute\doresetlayoutcomponentattribute}
+
+\protect \endinput
+
+% \starttext
+% \showlayoutcomponents
+% \setupinteraction[state=start]
+% \setupheadertexts[{\goto{page 1}[page(2)]}]
+% test \setlayoutcomponentattribute{test}{aap}\hbox \layoutcomponentboxattribute \bgroup aap
+% \setlayoutcomponentattribute{test}{noot}\hbox \layoutcomponentboxattribute \bgroup noot
+% \setlayoutcomponentattribute{test}{mies}\hbox \layoutcomponentboxattribute \bgroup mies
+% \egroup noot \egroup aap \egroup
+% test \setlayoutcomponentattribute{test}{hans}\hbox \layoutcomponentboxattribute \bgroup aap \hbox{!} aap\egroup
+% test \page test \page
+% \stoptext
+
diff --git a/tex/context/base/prop-mis.mkii b/tex/context/base/prop-mis.mkii
new file mode 100644
index 000000000..d8e9ab173
--- /dev/null
+++ b/tex/context/base/prop-mis.mkii
@@ -0,0 +1,189 @@
+%D \module
+%D [ file=prop-mis,
+%D version=2004.05.29, % some code moved from private modules
+%D title=\CONTEXT\ Property Macros,
+%D subtitle=Miscelaneous,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Property Macros / Miscelaneous}
+
+%D This module contains some code that has been in use in some
+%D private modules (p-*). These features depend on the fact
+%D that pdftex writes the page content as one stream.
+
+%D EXPERIMENTAL
+
+\unprotect
+
+%D Stream based overprint and knockout:
+
+\defineproperty[\v!overprint][\s!overprint] [\c!method=\v!command]
+\defineproperty[\v!knockout] [\s!overprint] [\c!method=\v!command]
+
+%D Negation.
+
+\defineproperty [\v!negative] [\s!negative] [\c!method=\v!command]
+\defineproperty [\v!positive] [\s!negative] [\c!method=\v!command]
+
+%D Special font effects.
+
+\setupproperty
+ [\s!effect]
+ [\c!rulethickness=\zeropoint,
+ \c!stretch=0]
+
+\defineproperty [\v!inner] [\s!effect] [\c!rulethickness=.25pt]
+\defineproperty [\v!outer] [\s!effect] [\c!rulethickness=.25pt]
+\defineproperty [\v!both] [\s!effect] [\c!rulethickness=.25pt]
+\defineproperty [\v!normal] [\s!effect]
+\defineproperty [\v!hidden] [\s!effect]
+
+\defineproperty [\v!stretch] [\s!effect] [\c!stretch=1]
+
+%D Overprint cum suis.
+
+\definepropertyhandler \v!overprint {\dostartoverprint}
+\definepropertyhandler \v!knockout {\dostopoverprint }
+
+\def\startoverprintproperty
+ {\ifincolor
+ \propertyhandler\currentproperty
+ \dooverprintmark\currentproperty
+ \fi}
+
+\def\stopoverprintproperty
+ {\ifincolor
+ \ifcase\currentpropertylevel\or
+ \dostopoverprint
+ \dooverprintmark\empty
+ \else
+ \propertyhandler\previousproperty
+ \dooverprintmark\previousproperty
+ \fi
+ \fi}
+
+\rawnewmark\overprintmark
+
+\def\dooverprintmark#1%
+ {\ifinpagebody \else \ifinframed \else
+ \expanded{\rawsetmark\noexpand\overprintmark{#1}}%
+ \fi \fi}
+
+\def\pushoverprintproperty
+ {\doifsomething{\rawgetbotmark\overprintmark}\dostopoverprint}
+
+\def\popoverprintproperty
+ {\doifsomething{\rawgetbotmark\overprintmark}%
+ {\propertyhandler{\rawgetbotmark\overprintmark}}}
+
+\def\popsplitoverprintproperty
+ {\getsplitmarks\overprintmark % hier wel
+ \doifsomething{\rawgetsplitbotmark\overprintmark}%
+ {\propertyhandler{\rawgetsplitbotmark\overprintmark}}}
+
+\appendtoks \pushoverprintproperty \to \everypushproperties
+\appendtoks \popoverprintproperty \to \everypopproperties
+\appendtoks \popsplitoverprintproperty \to \everypopsplitproperties
+
+%D Negative cum suis.
+
+\definepropertyhandler \v!negative {\dostartnegative}
+\definepropertyhandler \v!positive {\dostopnegative }
+
+\def\startnegativeproperty
+ {\ifincolor
+ \propertyhandler\currentproperty
+ \donegativemark\currentproperty
+ \fi}
+
+\def\stopnegativeproperty
+ {\ifincolor
+ \ifcase\currentpropertylevel\or
+ \dostopnegative
+ \donegativemark\empty
+ \else
+ \propertyhandler\previousproperty
+ \donegativemark\previousproperty
+ \fi
+ \fi}
+
+\rawnewmark\negativemark
+
+\def\donegativemark#1%
+ {\ifinpagebody \else \ifinframed \else
+ \expanded{\rawsetmark\noexpand\negativemark{#1}}%
+ \fi \fi}
+
+\def\pushnegativeproperty
+ {\doifsomething{\rawgetbotmark\negativemark}\dostopnegative}
+
+\def\popnegativeproperty
+ {\doifsomething{\rawgetbotmark\overprintmark}%
+ {\propertyhandler{\rawgetbotmark\negativemark}}}
+
+\def\popsplitnegativeproperty
+ {\getsplitmarks\negativemark % hier wel
+ \doifsomething{\rawgetsplitbotmark\negativemark}%
+ {\propertyhandler{\rawgetsplitbotmark\negativemark}}}
+
+\appendtoks \pushnegativeproperty \to \everypushproperties
+\appendtoks \popnegativeproperty \to \everypopproperties
+\appendtoks \popsplitnegativeproperty \to \everypopsplitproperties
+
+%D Effects.
+
+\definepropertyhandler \v!normal {0}
+\definepropertyhandler \v!inner {0}
+\definepropertyhandler \v!outer {1}
+\definepropertyhandler \v!both {2}
+\definepropertyhandler \v!hidden {3}
+\definepropertyhandler \v!stretch{0}
+
+\def\effectpropertydata#1%
+ {{\propertyhandler{#1}}%
+ {\propertyparameter{#1}\c!rulethickness}%
+ {\propertyparameter{#1}\c!stretch}}
+
+\def\starteffectproperty
+ {\expanded{\dostartfonteffect\effectpropertydata\currentproperty}%
+ \doeffectmark{\effectpropertydata\currentproperty}}
+
+\def\stopeffectproperty
+ {\dostopfonteffect
+ \ifcase\currentpropertylevel\or
+ \doeffectmark\empty
+ \else
+ \expanded{\dostartfonteffect\effectpropertydata\previousproperty}%
+ \doeffectmark{\effectpropertydata\previousproperty}%
+ \fi}
+
+\rawnewmark\effectmark
+
+\def\doeffectmark#1%
+ {\ifinpagebody \else \ifinframed \else
+ \expanded{\rawsetmark\noexpand\effectmark{#1}}% could be number
+ \fi \fi}
+
+\def\pusheffectproperty
+ {\doifsomething{\rawgetbotmark\effectmark}\dostopfonteffect}
+
+\def\popeffectproperty
+ {\doifsomething{\rawgetbotmark\effectmark}%
+ {\expanded{\dostartfonteffect\rawgetbotmark\effectmark}}}
+
+\def\popspliteffectproperty
+ {\getsplitmarks\effectmark
+ \doifsomething{\rawgetsplitbotmark\effectmark}%
+ {\expanded{\dostartfonteffect\rawgetsplitbotmark\effectmark}}}
+
+\appendtoks \pusheffectproperty \to \everypushproperties
+\appendtoks \popeffectproperty \to \everypopproperties
+\appendtoks \popspliteffectproperty \to \everypopsplitproperties
+
+\protect \endinput
diff --git a/tex/context/base/prop-mis.mkiv b/tex/context/base/prop-mis.mkiv
new file mode 100644
index 000000000..37c1d7973
--- /dev/null
+++ b/tex/context/base/prop-mis.mkiv
@@ -0,0 +1,74 @@
+%D \module
+%D [ file=prop-mis,
+%D version=2004.05.29, % some code moved from private modules
+%D title=\CONTEXT\ Property Macros,
+%D subtitle=Miscelaneous,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Property Macros / Miscelaneous}
+
+%D This module contains some code that has been in use in some
+%D private modules (p-*). These features depend on the fact
+%D that pdftex writes the page content as one stream.
+
+%D EXPERIMENTAL
+
+\unprotect
+
+% D Overprint cum suis.
+%
+% \defineproperty[\v!overprint][\s!overprint] [\c!method=\v!command]
+% \defineproperty[\v!knockout] [\s!overprint] [\c!method=\v!command]
+%
+% \definepropertyhandler \v!overprint {\dotriggeroverprint\v!overprint}
+% \definepropertyhandler \v!knockout {\dotriggeroverprint\v!knockout }
+%
+% \unexpanded\def\startoverprintproperty{\dotriggeroverprint\v!overprint}
+% \unexpanded\def\stopoverprintproperty {\dotriggeroverprint\v!knockout }
+
+%D Negative cum suis.
+
+\defineproperty [\v!negative] [\s!negative] [\c!method=\v!command]
+\defineproperty [\v!positive] [\s!negative] [\c!method=\v!command]
+
+\definepropertyhandler \v!negative {\dotriggernegative\v!negative}
+\definepropertyhandler \v!positive {\dotriggernegative\v!positive}
+
+\unexpanded\def\startnegativeproperty{\dotriggernegative\v!negative}
+\unexpanded\def\stopnegativeproperty {\dotriggernegative\v!positive}
+
+%D Special font effects.
+
+\setupproperty
+ [\s!effect]
+ [\c!rulethickness=\zeropoint,
+ \c!stretch=0]
+
+\defineproperty [\v!inner] [\s!effect] [\c!rulethickness=.25pt]
+\defineproperty [\v!outer] [\s!effect] [\c!rulethickness=.25pt]
+\defineproperty [\v!both] [\s!effect] [\c!rulethickness=.25pt]
+\defineproperty [\v!normal] [\s!effect]
+\defineproperty [\v!hidden] [\s!effect]
+
+\defineproperty [\v!stretch] [\s!effect] [\c!stretch=1]
+
+\def\mktriggereffect#1%
+ {\dotriggereffect{#1}{\propertyparameter{#1}\c!stretch}{\propertyparameter{#1}\c!rulethickness}}
+
+\definepropertyhandler \v!normal {\mktriggereffect\v!normal}
+\definepropertyhandler \v!inner {\mktriggereffect\v!inner }
+\definepropertyhandler \v!outer {\mktriggereffect\v!outer }
+\definepropertyhandler \v!both {\mktriggereffect\v!both }
+\definepropertyhandler \v!hidden {\mktriggereffect\v!hidden}
+\definepropertyhandler \v!stretch{\mktriggereffect\v!normal}
+
+\unexpanded\def\starteffectproperty{\mktriggereffect\currentproperty}
+\unexpanded\def\stopeffectproperty {\mktriggereffect\v!normal }
+
+\protect \endinput
diff --git a/tex/context/base/regi-8859-1.lua b/tex/context/base/regi-8859-1.lua
new file mode 100644
index 000000000..b8f0a8573
--- /dev/null
+++ b/tex/context/base/regi-8859-1.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-1'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-1"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-1.mkii b/tex/context/base/regi-8859-1.mkii
new file mode 100644
index 000000000..c291b029a
--- /dev/null
+++ b/tex/context/base/regi-8859-1.mkii
@@ -0,0 +1,154 @@
+%D \module
+%D [ file=regi-8859-1,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-1 (West European),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-1/Latin1 input encoding (regime) for West European languages,
+%D see also cp1252 and iso-8859-15 (includes Euro).
+%D
+%D (Contributors to the original file: Daniel Flipo, Hans Hagen \& Denis Roegel.)
+%D
+%D Usage: \type{\enableregime[8859-1]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-1]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\exclamdown} % 00A1 INVERTED EXCLAMATION MARK
+\defineactivetoken 162 {\textcent} % 00A2 CENT SIGN
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\textyen} % 00A5 YEN SIGN
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\ordfeminine} % 00AA FEMININE ORDINAL INDICATOR
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\textmacron} % 00AF MACRON
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\onesuperior} % 00B9 SUPERSCRIPT ONE
+\defineactivetoken 186 {\ordmasculine} % 00BA MASCULINE ORDINAL INDICATOR
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\onequarter} % 00BC VULGAR FRACTION ONE QUARTER
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\threequarter} % 00BE VULGAR FRACTION THREE QUARTERS
+\defineactivetoken 191 {\questiondown} % 00BF INVERTED QUESTION MARK
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 208 {\Eth} % 00D0 LATIN CAPITAL LETTER ETH
+\defineactivetoken 209 {\Ntilde} % 00D1 LATIN CAPITAL LETTER N WITH TILDE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Yacute} % 00DD LATIN CAPITAL LETTER Y WITH ACUTE
+\defineactivetoken 222 {\Thorn} % 00DE LATIN CAPITAL LETTER THORN
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 240 {\eth} % 00F0 LATIN SMALL LETTER ETH
+\defineactivetoken 241 {\ntilde} % 00F1 LATIN SMALL LETTER N WITH TILDE
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\yacute} % 00FD LATIN SMALL LETTER Y WITH ACUTE
+\defineactivetoken 254 {\thorn} % 00FE LATIN SMALL LETTER THORN
+\defineactivetoken 255 {\ydiaeresis} % 00FF LATIN SMALL LETTER Y WITH DIAERESIS
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-10.lua b/tex/context/base/regi-8859-10.lua
new file mode 100644
index 000000000..574d4ac50
--- /dev/null
+++ b/tex/context/base/regi-8859-10.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-10'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-10"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
+ 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138
+}
diff --git a/tex/context/base/regi-8859-10.mkii b/tex/context/base/regi-8859-10.mkii
new file mode 100644
index 000000000..79d74d952
--- /dev/null
+++ b/tex/context/base/regi-8859-10.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=regi-8859-10,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-10 (Nordic),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-10/Latin6 input encoding (regime) for Nordic languages.
+%D
+%D Usage: \type{\enableregime[8859-10]} (see \type {regi-syn} for
+%D alternatives calls).
+
+
+\startregime[iso-8859-10]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\Aogonek} % 0104 LATIN CAPITAL LETTER A WITH OGONEK
+\defineactivetoken 162 {\Emacron} % 0112 LATIN CAPITAL LETTER E WITH MACRON
+\defineactivetoken 163 {\Gcommaaccent} % 0122 LATIN CAPITAL LETTER G WITH CEDILLA
+\defineactivetoken 164 {\Imacron} % 012A LATIN CAPITAL LETTER I WITH MACRON
+\defineactivetoken 165 {\Itilde} % 0128 LATIN CAPITAL LETTER I WITH TILDE
+\defineactivetoken 166 {\Kcommaaccent} % 0136 LATIN CAPITAL LETTER K WITH CEDILLA
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\Lcommaaccent} % 013B LATIN CAPITAL LETTER L WITH CEDILLA
+\defineactivetoken 169 {\Dstroke} % 0110 LATIN CAPITAL LETTER D WITH STROKE
+\defineactivetoken 170 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 171 {\Tstroke} % 0166 LATIN CAPITAL LETTER T WITH STROKE
+\defineactivetoken 172 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\Umacron} % 016A LATIN CAPITAL LETTER U WITH MACRON
+\defineactivetoken 175 {\Neng} % 014A LATIN CAPITAL LETTER ENG
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\aogonek} % 0105 LATIN SMALL LETTER A WITH OGONEK
+\defineactivetoken 178 {\emacron} % 0113 LATIN SMALL LETTER E WITH MACRON
+\defineactivetoken 179 {\gcommaaccent} % 0123 LATIN SMALL LETTER G WITH CEDILLA
+\defineactivetoken 180 {\imacron} % 012B LATIN SMALL LETTER I WITH MACRON
+\defineactivetoken 181 {\itilde} % 0129 LATIN SMALL LETTER I WITH TILDE
+\defineactivetoken 182 {\kcommaaccent} % 0137 LATIN SMALL LETTER K WITH CEDILLA
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\lcommaaccent} % 013C LATIN SMALL LETTER L WITH CEDILLA
+\defineactivetoken 185 {\dstroke} % 0111 LATIN SMALL LETTER D WITH STROKE
+\defineactivetoken 186 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 187 {\tstroke} % 0167 LATIN SMALL LETTER T WITH STROKE
+\defineactivetoken 188 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 189 {\texthorizontalbar} % 2015 HORIZONTAL BAR
+\defineactivetoken 190 {\umacron} % 016B LATIN SMALL LETTER U WITH MACRON
+\defineactivetoken 191 {\neng} % 014B LATIN SMALL LETTER ENG
+\defineactivetoken 192 {\Amacron} % 0100 LATIN CAPITAL LETTER A WITH MACRON
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Iogonek} % 012E LATIN CAPITAL LETTER I WITH OGONEK
+\defineactivetoken 200 {\Ccaron} % 010C LATIN CAPITAL LETTER C WITH CARON
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Eogonek} % 0118 LATIN CAPITAL LETTER E WITH OGONEK
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Edotaccent} % 0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 208 {\Eth} % 00D0 LATIN CAPITAL LETTER ETH
+\defineactivetoken 209 {\Ncommaaccent} % 0145 LATIN CAPITAL LETTER N WITH CEDILLA
+\defineactivetoken 210 {\Omacron} % 014C LATIN CAPITAL LETTER O WITH MACRON
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\Utilde} % 0168 LATIN CAPITAL LETTER U WITH TILDE
+\defineactivetoken 216 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 217 {\Uogonek} % 0172 LATIN CAPITAL LETTER U WITH OGONEK
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Yacute} % 00DD LATIN CAPITAL LETTER Y WITH ACUTE
+\defineactivetoken 222 {\Thorn} % 00DE LATIN CAPITAL LETTER THORN
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\amacron} % 0101 LATIN SMALL LETTER A WITH MACRON
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\iogonek} % 012F LATIN SMALL LETTER I WITH OGONEK
+\defineactivetoken 232 {\ccaron} % 010D LATIN SMALL LETTER C WITH CARON
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\eogonek} % 0119 LATIN SMALL LETTER E WITH OGONEK
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\edotaccent} % 0117 LATIN SMALL LETTER E WITH DOT ABOVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 240 {\eth} % 00F0 LATIN SMALL LETTER ETH
+\defineactivetoken 241 {\ncommaaccent} % 0146 LATIN SMALL LETTER N WITH CEDILLA
+\defineactivetoken 242 {\omacron} % 014D LATIN SMALL LETTER O WITH MACRON
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\utilde} % 0169 LATIN SMALL LETTER U WITH TILDE
+\defineactivetoken 248 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 249 {\uogonek} % 0173 LATIN SMALL LETTER U WITH OGONEK
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\yacute} % 00FD LATIN SMALL LETTER Y WITH ACUTE
+\defineactivetoken 254 {\thorn} % 00FE LATIN SMALL LETTER THORN
+\defineactivetoken 255 {\kkra} % 0138 LATIN SMALL LETTER KRA
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-11.lua b/tex/context/base/regi-8859-11.lua
new file mode 100644
index 000000000..1910bbb5d
--- /dev/null
+++ b/tex/context/base/regi-8859-11.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-11'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-11"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000
+}
diff --git a/tex/context/base/regi-8859-13.lua b/tex/context/base/regi-8859-13.lua
new file mode 100644
index 000000000..a6f71cb78
--- /dev/null
+++ b/tex/context/base/regi-8859-13.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-13'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-13"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019
+}
diff --git a/tex/context/base/regi-8859-13.mkii b/tex/context/base/regi-8859-13.mkii
new file mode 100644
index 000000000..a6dbe376f
--- /dev/null
+++ b/tex/context/base/regi-8859-13.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=regi-8859-13,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-13 (Baltic),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-13/Latin7 input encoding (regime) for Baltic languages,
+%D see also iso-8859-4 and cp1257.
+%D
+%D Usage: \type{\enableregime[8859-13]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[iso-8859-13]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 162 {\textcent} % 00A2 CENT SIGN
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\Rcommaaccent} % 0156 LATIN CAPITAL LETTER R WITH CEDILLA
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\quotedblleft} % 201C LEFT DOUBLE QUOTATION MARK
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 185 {\onesuperior} % 00B9 SUPERSCRIPT ONE
+\defineactivetoken 186 {\rcommaaccent} % 0157 LATIN SMALL LETTER R WITH CEDILLA
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\onequarter} % 00BC VULGAR FRACTION ONE QUARTER
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\threequarter} % 00BE VULGAR FRACTION THREE QUARTERS
+\defineactivetoken 191 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 192 {\Aogonek} % 0104 LATIN CAPITAL LETTER A WITH OGONEK
+\defineactivetoken 193 {\Iogonek} % 012E LATIN CAPITAL LETTER I WITH OGONEK
+\defineactivetoken 194 {\Amacron} % 0100 LATIN CAPITAL LETTER A WITH MACRON
+\defineactivetoken 195 {\Cacute} % 0106 LATIN CAPITAL LETTER C WITH ACUTE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\Eogonek} % 0118 LATIN CAPITAL LETTER E WITH OGONEK
+\defineactivetoken 199 {\Emacron} % 0112 LATIN CAPITAL LETTER E WITH MACRON
+\defineactivetoken 200 {\Ccaron} % 010C LATIN CAPITAL LETTER C WITH CARON
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Zacute} % 0179 LATIN CAPITAL LETTER Z WITH ACUTE
+\defineactivetoken 203 {\Edotaccent} % 0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+\defineactivetoken 204 {\Gcommaaccent} % 0122 LATIN CAPITAL LETTER G WITH CEDILLA
+\defineactivetoken 205 {\Kcommaaccent} % 0136 LATIN CAPITAL LETTER K WITH CEDILLA
+\defineactivetoken 206 {\Imacron} % 012A LATIN CAPITAL LETTER I WITH MACRON
+\defineactivetoken 207 {\Lcommaaccent} % 013B LATIN CAPITAL LETTER L WITH CEDILLA
+\defineactivetoken 208 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 209 {\Nacute} % 0143 LATIN CAPITAL LETTER N WITH ACUTE
+\defineactivetoken 210 {\Ncommaaccent} % 0145 LATIN CAPITAL LETTER N WITH CEDILLA
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Omacron} % 014C LATIN CAPITAL LETTER O WITH MACRON
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Uogonek} % 0172 LATIN CAPITAL LETTER U WITH OGONEK
+\defineactivetoken 217 {\Lstroke} % 0141 LATIN CAPITAL LETTER L WITH STROKE
+\defineactivetoken 218 {\Sacute} % 015A LATIN CAPITAL LETTER S WITH ACUTE
+\defineactivetoken 219 {\Umacron} % 016A LATIN CAPITAL LETTER U WITH MACRON
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Zdotaccent} % 017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+\defineactivetoken 222 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\aogonek} % 0105 LATIN SMALL LETTER A WITH OGONEK
+\defineactivetoken 225 {\iogonek} % 012F LATIN SMALL LETTER I WITH OGONEK
+\defineactivetoken 226 {\amacron} % 0101 LATIN SMALL LETTER A WITH MACRON
+\defineactivetoken 227 {\cacute} % 0107 LATIN SMALL LETTER C WITH ACUTE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\eogonek} % 0119 LATIN SMALL LETTER E WITH OGONEK
+\defineactivetoken 231 {\emacron} % 0113 LATIN SMALL LETTER E WITH MACRON
+\defineactivetoken 232 {\ccaron} % 010D LATIN SMALL LETTER C WITH CARON
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\zacute} % 017A LATIN SMALL LETTER Z WITH ACUTE
+\defineactivetoken 235 {\edotaccent} % 0117 LATIN SMALL LETTER E WITH DOT ABOVE
+\defineactivetoken 236 {\gcommaaccent} % 0123 LATIN SMALL LETTER G WITH CEDILLA
+\defineactivetoken 237 {\kcommaaccent} % 0137 LATIN SMALL LETTER K WITH CEDILLA
+\defineactivetoken 238 {\imacron} % 012B LATIN SMALL LETTER I WITH MACRON
+\defineactivetoken 239 {\lcommaaccent} % 013C LATIN SMALL LETTER L WITH CEDILLA
+\defineactivetoken 240 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 241 {\nacute} % 0144 LATIN SMALL LETTER N WITH ACUTE
+\defineactivetoken 242 {\ncommaaccent} % 0146 LATIN SMALL LETTER N WITH CEDILLA
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\omacron} % 014D LATIN SMALL LETTER O WITH MACRON
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\uogonek} % 0173 LATIN SMALL LETTER U WITH OGONEK
+\defineactivetoken 249 {\lstroke} % 0142 LATIN SMALL LETTER L WITH STROKE
+\defineactivetoken 250 {\sacute} % 015B LATIN SMALL LETTER S WITH ACUTE
+\defineactivetoken 251 {\umacron} % 016B LATIN SMALL LETTER U WITH MACRON
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\zdotaccent} % 017C LATIN SMALL LETTER Z WITH DOT ABOVE
+\defineactivetoken 254 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 255 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-14.lua b/tex/context/base/regi-8859-14.lua
new file mode 100644
index 000000000..0c3474865
--- /dev/null
+++ b/tex/context/base/regi-8859-14.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-14'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-14"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
+ 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-15.lua b/tex/context/base/regi-8859-15.lua
new file mode 100644
index 000000000..a5626d653
--- /dev/null
+++ b/tex/context/base/regi-8859-15.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-15'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-15"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-15.mkii b/tex/context/base/regi-8859-15.mkii
new file mode 100644
index 000000000..cf788d3f3
--- /dev/null
+++ b/tex/context/base/regi-8859-15.mkii
@@ -0,0 +1,154 @@
+%D \module
+%D [ file=regi-8859-15,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-15 (West European),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-15/Latin9 input encoding (regime) for
+%D West European languages, almost the same as iso-8859-1 with rarely
+%D used symbols (currency symbol,%D fractions, accents) replaced by
+%D Euro and some additional letters,%D see also cp1252.
+%D
+%D Usage: \type{\enableregime[8859-15]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-15]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\exclamdown} % 00A1 INVERTED EXCLAMATION MARK
+\defineactivetoken 162 {\textcent} % 00A2 CENT SIGN
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 165 {\textyen} % 00A5 YEN SIGN
+\defineactivetoken 166 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\ordfeminine} % 00AA FEMININE ORDINAL INDICATOR
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\textmacron} % 00AF MACRON
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 185 {\onesuperior} % 00B9 SUPERSCRIPT ONE
+\defineactivetoken 186 {\ordmasculine} % 00BA MASCULINE ORDINAL INDICATOR
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\OEligature} % 0152 LATIN CAPITAL LIGATURE OE
+\defineactivetoken 189 {\oeligature} % 0153 LATIN SMALL LIGATURE OE
+\defineactivetoken 190 {\Ydiaeresis} % 0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+\defineactivetoken 191 {\questiondown} % 00BF INVERTED QUESTION MARK
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 208 {\Eth} % 00D0 LATIN CAPITAL LETTER ETH
+\defineactivetoken 209 {\Ntilde} % 00D1 LATIN CAPITAL LETTER N WITH TILDE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Yacute} % 00DD LATIN CAPITAL LETTER Y WITH ACUTE
+\defineactivetoken 222 {\Thorn} % 00DE LATIN CAPITAL LETTER THORN
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 240 {\eth} % 00F0 LATIN SMALL LETTER ETH
+\defineactivetoken 241 {\ntilde} % 00F1 LATIN SMALL LETTER N WITH TILDE
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\yacute} % 00FD LATIN SMALL LETTER Y WITH ACUTE
+\defineactivetoken 254 {\thorn} % 00FE LATIN SMALL LETTER THORN
+\defineactivetoken 255 {\ydiaeresis} % 00FF LATIN SMALL LETTER Y WITH DIAERESIS
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-16.lua b/tex/context/base/regi-8859-16.lua
new file mode 100644
index 000000000..817b41db2
--- /dev/null
+++ b/tex/context/base/regi-8859-16.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-16'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-16"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B,
+ 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-16.mkii b/tex/context/base/regi-8859-16.mkii
new file mode 100644
index 000000000..96f0a15d4
--- /dev/null
+++ b/tex/context/base/regi-8859-16.mkii
@@ -0,0 +1,151 @@
+%D \module
+%D [ file=regi-8859-16,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-16 (Romanian),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-16/Latin10 input encoding (regime) for Romanian.
+%D
+%D Usage: \type{\enableregime[8859-16]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-16]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\Aogonek} % 0104 LATIN CAPITAL LETTER A WITH OGONEK
+\defineactivetoken 162 {\aogonek} % 0105 LATIN SMALL LETTER A WITH OGONEK
+\defineactivetoken 163 {\Lstroke} % 0141 LATIN CAPITAL LETTER L WITH STROKE
+\defineactivetoken 164 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 165 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 166 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\Scommaaccent} % 0218 LATIN CAPITAL LETTER S WITH COMMA BELOW
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\Zacute} % 0179 LATIN CAPITAL LETTER Z WITH ACUTE
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\zacute} % 017A LATIN SMALL LETTER Z WITH ACUTE
+\defineactivetoken 175 {\Zdotaccent} % 017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\Ccaron} % 010C LATIN CAPITAL LETTER C WITH CARON
+\defineactivetoken 179 {\lstroke} % 0142 LATIN SMALL LETTER L WITH STROKE
+\defineactivetoken 180 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 181 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 185 {\ccaron} % 010D LATIN SMALL LETTER C WITH CARON
+\defineactivetoken 186 {\scommaaccent} % 0219 LATIN SMALL LETTER S WITH COMMA BELOW
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\OEligature} % 0152 LATIN CAPITAL LIGATURE OE
+\defineactivetoken 189 {\oeligature} % 0153 LATIN SMALL LIGATURE OE
+\defineactivetoken 190 {\Ydiaeresis} % 0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+\defineactivetoken 191 {\zdotaccent} % 017C LATIN SMALL LETTER Z WITH DOT ABOVE
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Abreve} % 0102 LATIN CAPITAL LETTER A WITH BREVE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Cacute} % 0106 LATIN CAPITAL LETTER C WITH ACUTE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 208 {\Dstroke} % 0110 LATIN CAPITAL LETTER D WITH STROKE
+\defineactivetoken 209 {\Nacute} % 0143 LATIN CAPITAL LETTER N WITH ACUTE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Ohungarumlaut} % 0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\Sacute} % 015A LATIN CAPITAL LETTER S WITH ACUTE
+\defineactivetoken 216 {\Uhungarumlaut} % 0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Eogonek} % 0118 LATIN CAPITAL LETTER E WITH OGONEK
+\defineactivetoken 222 {\Tcommaaccent} % 021A LATIN CAPITAL LETTER T WITH COMMA BELOW
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\abreve} % 0103 LATIN SMALL LETTER A WITH BREVE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\cacute} % 0107 LATIN SMALL LETTER C WITH ACUTE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 240 {\dstroke} % 0111 LATIN SMALL LETTER D WITH STROKE
+\defineactivetoken 241 {\nacute} % 0144 LATIN SMALL LETTER N WITH ACUTE
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\ohungarumlaut} % 0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\sacute} % 015B LATIN SMALL LETTER S WITH ACUTE
+\defineactivetoken 248 {\uhungarumlaut} % 0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\eogonek} % 0119 LATIN SMALL LETTER E WITH OGONEK
+\defineactivetoken 254 {\tcommaaccent} % 021B LATIN SMALL LETTER T WITH COMMA BELOW
+\defineactivetoken 255 {\ydiaeresis} % 00FF LATIN SMALL LETTER Y WITH DIAERESIS
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-2.lua b/tex/context/base/regi-8859-2.lua
new file mode 100644
index 000000000..7ae59d0fa
--- /dev/null
+++ b/tex/context/base/regi-8859-2.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-2'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-2"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
+ 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
+}
diff --git a/tex/context/base/regi-8859-2.mkii b/tex/context/base/regi-8859-2.mkii
new file mode 100644
index 000000000..81fe8419e
--- /dev/null
+++ b/tex/context/base/regi-8859-2.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=regi-8859-2,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-2 (East European),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-2/Latin2 input encoding (regime) for
+%D Central European languages, see also cp1250.
+%D
+%D Usage: \type{\enableregime[8859-2]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-2]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\Aogonek} % 0104 LATIN CAPITAL LETTER A WITH OGONEK
+\defineactivetoken 162 {\textbreve} % 02D8 BREVE
+\defineactivetoken 163 {\Lstroke} % 0141 LATIN CAPITAL LETTER L WITH STROKE
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\Lcaron} % 013D LATIN CAPITAL LETTER L WITH CARON
+\defineactivetoken 166 {\Sacute} % 015A LATIN CAPITAL LETTER S WITH ACUTE
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 170 {\Scedilla} % 015E LATIN CAPITAL LETTER S WITH CEDILLA
+\defineactivetoken 171 {\Tcaron} % 0164 LATIN CAPITAL LETTER T WITH CARON
+\defineactivetoken 172 {\Zacute} % 0179 LATIN CAPITAL LETTER Z WITH ACUTE
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 175 {\Zdotaccent} % 017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\aogonek} % 0105 LATIN SMALL LETTER A WITH OGONEK
+\defineactivetoken 178 {\textogonek} % 02DB OGONEK
+\defineactivetoken 179 {\lstroke} % 0142 LATIN SMALL LETTER L WITH STROKE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\lcaron} % 013E LATIN SMALL LETTER L WITH CARON
+\defineactivetoken 182 {\sacute} % 015B LATIN SMALL LETTER S WITH ACUTE
+\defineactivetoken 183 {\textcaron} % 02C7 CARON
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 186 {\scedilla} % 015F LATIN SMALL LETTER S WITH CEDILLA
+\defineactivetoken 187 {\tcaron} % 0165 LATIN SMALL LETTER T WITH CARON
+\defineactivetoken 188 {\zacute} % 017A LATIN SMALL LETTER Z WITH ACUTE
+\defineactivetoken 189 {\texthungarumlaut} % 02DD DOUBLE ACUTE ACCENT
+\defineactivetoken 190 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 191 {\zdotaccent} % 017C LATIN SMALL LETTER Z WITH DOT ABOVE
+\defineactivetoken 192 {\Racute} % 0154 LATIN CAPITAL LETTER R WITH ACUTE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Abreve} % 0102 LATIN CAPITAL LETTER A WITH BREVE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Lacute} % 0139 LATIN CAPITAL LETTER L WITH ACUTE
+\defineactivetoken 198 {\Cacute} % 0106 LATIN CAPITAL LETTER C WITH ACUTE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Ccaron} % 010C LATIN CAPITAL LETTER C WITH CARON
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Eogonek} % 0118 LATIN CAPITAL LETTER E WITH OGONEK
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Ecaron} % 011A LATIN CAPITAL LETTER E WITH CARON
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Dcaron} % 010E LATIN CAPITAL LETTER D WITH CARON
+\defineactivetoken 208 {\Dstroke} % 0110 LATIN CAPITAL LETTER D WITH STROKE
+\defineactivetoken 209 {\Nacute} % 0143 LATIN CAPITAL LETTER N WITH ACUTE
+\defineactivetoken 210 {\Ncaron} % 0147 LATIN CAPITAL LETTER N WITH CARON
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Ohungarumlaut} % 0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Rcaron} % 0158 LATIN CAPITAL LETTER R WITH CARON
+\defineactivetoken 217 {\Uring} % 016E LATIN CAPITAL LETTER U WITH RING ABOVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Uhungarumlaut} % 0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Yacute} % 00DD LATIN CAPITAL LETTER Y WITH ACUTE
+\defineactivetoken 222 {\Tcedilla} % 0162 LATIN CAPITAL LETTER T WITH CEDILLA
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\racute} % 0155 LATIN SMALL LETTER R WITH ACUTE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\abreve} % 0103 LATIN SMALL LETTER A WITH BREVE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\lacute} % 013A LATIN SMALL LETTER L WITH ACUTE
+\defineactivetoken 230 {\cacute} % 0107 LATIN SMALL LETTER C WITH ACUTE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\ccaron} % 010D LATIN SMALL LETTER C WITH CARON
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\eogonek} % 0119 LATIN SMALL LETTER E WITH OGONEK
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\ecaron} % 011B LATIN SMALL LETTER E WITH CARON
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\dcaron} % 010F LATIN SMALL LETTER D WITH CARON
+\defineactivetoken 240 {\dstroke} % 0111 LATIN SMALL LETTER D WITH STROKE
+\defineactivetoken 241 {\nacute} % 0144 LATIN SMALL LETTER N WITH ACUTE
+\defineactivetoken 242 {\ncaron} % 0148 LATIN SMALL LETTER N WITH CARON
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\ohungarumlaut} % 0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\rcaron} % 0159 LATIN SMALL LETTER R WITH CARON
+\defineactivetoken 249 {\uring} % 016F LATIN SMALL LETTER U WITH RING ABOVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\uhungarumlaut} % 0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\yacute} % 00FD LATIN SMALL LETTER Y WITH ACUTE
+\defineactivetoken 254 {\tcedilla} % 0163 LATIN SMALL LETTER T WITH CEDILLA
+\defineactivetoken 255 {\textdotaccent} % 02D9 DOT ABOVE
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-3.lua b/tex/context/base/regi-8859-3.lua
new file mode 100644
index 000000000..a83d63bac
--- /dev/null
+++ b/tex/context/base/regi-8859-3.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-3'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-3"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B,
+ 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9
+}
diff --git a/tex/context/base/regi-8859-3.mkii b/tex/context/base/regi-8859-3.mkii
new file mode 100644
index 000000000..dcb8be67f
--- /dev/null
+++ b/tex/context/base/regi-8859-3.mkii
@@ -0,0 +1,145 @@
+%D \module
+%D [ file=regi-8859-3,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-3 (South European),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-3/Latin3 input encoding (regime) for South
+%D European languages, esp. for Esperanto and Maltese.
+%D
+%D Usage: \type{\enableregime[8859-3]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-3]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\Hstroke} % 0126 LATIN CAPITAL LETTER H WITH STROKE
+\defineactivetoken 162 {\textbreve} % 02D8 BREVE
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 166 {\Hcircumflex} % 0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\Idotaccent} % 0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+\defineactivetoken 170 {\Scedilla} % 015E LATIN CAPITAL LETTER S WITH CEDILLA
+\defineactivetoken 171 {\Gbreve} % 011E LATIN CAPITAL LETTER G WITH BREVE
+\defineactivetoken 172 {\Jcircumflex} % 0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 175 {\Zdotaccent} % 017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\hstroke} % 0127 LATIN SMALL LETTER H WITH STROKE
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\hcircumflex} % 0125 LATIN SMALL LETTER H WITH CIRCUMFLEX
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\dotlessi} % 0131 LATIN SMALL LETTER DOTLESS I
+\defineactivetoken 186 {\scedilla} % 015F LATIN SMALL LETTER S WITH CEDILLA
+\defineactivetoken 187 {\gbreve} % 011F LATIN SMALL LETTER G WITH BREVE
+\defineactivetoken 188 {\jcircumflex} % 0135 LATIN SMALL LETTER J WITH CIRCUMFLEX
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 191 {\zdotaccent} % 017C LATIN SMALL LETTER Z WITH DOT ABOVE
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Cdotaccent} % 010A LATIN CAPITAL LETTER C WITH DOT ABOVE
+\defineactivetoken 198 {\Ccircumflex} % 0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 209 {\Ntilde} % 00D1 LATIN CAPITAL LETTER N WITH TILDE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Gdotaccent} % 0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Gcircumflex} % 011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Ubreve} % 016C LATIN CAPITAL LETTER U WITH BREVE
+\defineactivetoken 222 {\Scircumflex} % 015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\cdotaccent} % 010B LATIN SMALL LETTER C WITH DOT ABOVE
+\defineactivetoken 230 {\ccircumflex} % 0109 LATIN SMALL LETTER C WITH CIRCUMFLEX
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 241 {\ntilde} % 00F1 LATIN SMALL LETTER N WITH TILDE
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\gdotaccent} % 0121 LATIN SMALL LETTER G WITH DOT ABOVE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\gcircumflex} % 011D LATIN SMALL LETTER G WITH CIRCUMFLEX
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\ubreve} % 016D LATIN SMALL LETTER U WITH BREVE
+\defineactivetoken 254 {\scircumflex} % 015D LATIN SMALL LETTER S WITH CIRCUMFLEX
+\defineactivetoken 255 {\textdotaccent} % 02D9 DOT ABOVE
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-4.lua b/tex/context/base/regi-8859-4.lua
new file mode 100644
index 000000000..939d55026
--- /dev/null
+++ b/tex/context/base/regi-8859-4.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-4'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-4"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
+ 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
+ 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
+ 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
+}
diff --git a/tex/context/base/regi-8859-4.mkii b/tex/context/base/regi-8859-4.mkii
new file mode 100644
index 000000000..3ebe66a13
--- /dev/null
+++ b/tex/context/base/regi-8859-4.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=regi-8859-4,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-4 (North European),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-4/Latin4 input encoding (regime) for West
+%D European languages, see also cp1257 and iso-8859-13.
+%D
+%D Usage: \type{\enableregime[8859-4]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-4]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\Aogonek} % 0104 LATIN CAPITAL LETTER A WITH OGONEK
+\defineactivetoken 162 {\kkra} % 0138 LATIN SMALL LETTER KRA
+\defineactivetoken 163 {\Rcommaaccent} % 0156 LATIN CAPITAL LETTER R WITH CEDILLA
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\Itilde} % 0128 LATIN CAPITAL LETTER I WITH TILDE
+\defineactivetoken 166 {\Lcommaaccent} % 013B LATIN CAPITAL LETTER L WITH CEDILLA
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 170 {\Emacron} % 0112 LATIN CAPITAL LETTER E WITH MACRON
+\defineactivetoken 171 {\Gcommaaccent} % 0122 LATIN CAPITAL LETTER G WITH CEDILLA
+\defineactivetoken 172 {\Tstroke} % 0166 LATIN CAPITAL LETTER T WITH STROKE
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 175 {\textmacron} % 00AF MACRON
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\aogonek} % 0105 LATIN SMALL LETTER A WITH OGONEK
+\defineactivetoken 178 {\textogonek} % 02DB OGONEK
+\defineactivetoken 179 {\rcommaaccent} % 0157 LATIN SMALL LETTER R WITH CEDILLA
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\itilde} % 0129 LATIN SMALL LETTER I WITH TILDE
+\defineactivetoken 182 {\lcommaaccent} % 013C LATIN SMALL LETTER L WITH CEDILLA
+\defineactivetoken 183 {\textcaron} % 02C7 CARON
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 186 {\emacron} % 0113 LATIN SMALL LETTER E WITH MACRON
+\defineactivetoken 187 {\gcommaaccent} % 0123 LATIN SMALL LETTER G WITH CEDILLA
+\defineactivetoken 188 {\tstroke} % 0167 LATIN SMALL LETTER T WITH STROKE
+\defineactivetoken 189 {\Neng} % 014A LATIN CAPITAL LETTER ENG
+\defineactivetoken 190 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 191 {\neng} % 014B LATIN SMALL LETTER ENG
+\defineactivetoken 192 {\Amacron} % 0100 LATIN CAPITAL LETTER A WITH MACRON
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Iogonek} % 012E LATIN CAPITAL LETTER I WITH OGONEK
+\defineactivetoken 200 {\Ccaron} % 010C LATIN CAPITAL LETTER C WITH CARON
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Eogonek} % 0118 LATIN CAPITAL LETTER E WITH OGONEK
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Edotaccent} % 0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Imacron} % 012A LATIN CAPITAL LETTER I WITH MACRON
+\defineactivetoken 208 {\Dstroke} % 0110 LATIN CAPITAL LETTER D WITH STROKE
+\defineactivetoken 209 {\Ncommaaccent} % 0145 LATIN CAPITAL LETTER N WITH CEDILLA
+\defineactivetoken 210 {\Omacron} % 014C LATIN CAPITAL LETTER O WITH MACRON
+\defineactivetoken 211 {\Kcommaaccent} % 0136 LATIN CAPITAL LETTER K WITH CEDILLA
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 217 {\Uogonek} % 0172 LATIN CAPITAL LETTER U WITH OGONEK
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Utilde} % 0168 LATIN CAPITAL LETTER U WITH TILDE
+\defineactivetoken 222 {\Umacron} % 016A LATIN CAPITAL LETTER U WITH MACRON
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\amacron} % 0101 LATIN SMALL LETTER A WITH MACRON
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\iogonek} % 012F LATIN SMALL LETTER I WITH OGONEK
+\defineactivetoken 232 {\ccaron} % 010D LATIN SMALL LETTER C WITH CARON
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\eogonek} % 0119 LATIN SMALL LETTER E WITH OGONEK
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\edotaccent} % 0117 LATIN SMALL LETTER E WITH DOT ABOVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\imacron} % 012B LATIN SMALL LETTER I WITH MACRON
+\defineactivetoken 240 {\dstroke} % 0111 LATIN SMALL LETTER D WITH STROKE
+\defineactivetoken 241 {\ncommaaccent} % 0146 LATIN SMALL LETTER N WITH CEDILLA
+\defineactivetoken 242 {\omacron} % 014D LATIN SMALL LETTER O WITH MACRON
+\defineactivetoken 243 {\kcommaaccent} % 0137 LATIN SMALL LETTER K WITH CEDILLA
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 249 {\uogonek} % 0173 LATIN SMALL LETTER U WITH OGONEK
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\utilde} % 0169 LATIN SMALL LETTER U WITH TILDE
+\defineactivetoken 254 {\umacron} % 016B LATIN SMALL LETTER U WITH MACRON
+\defineactivetoken 255 {\textdotaccent} % 02D9 DOT ABOVE
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-5.lua b/tex/context/base/regi-8859-5.lua
new file mode 100644
index 000000000..ab093d139
--- /dev/null
+++ b/tex/context/base/regi-8859-5.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-5'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-5"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F
+}
diff --git a/tex/context/base/regi-8859-5.mkii b/tex/context/base/regi-8859-5.mkii
new file mode 100644
index 000000000..531226433
--- /dev/null
+++ b/tex/context/base/regi-8859-5.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=regi-8859-5,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-5 (Cyrillic),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-5 input encoding (regime) for Cyrillic,
+%D see also regi-cyr and regi-cyp.
+%D
+%D Usage: \type{\enableregime[8859-5]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-5]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\cyrillicYO} % 0401 CYRILLIC CAPITAL LETTER IO
+\defineactivetoken 162 {\cyrillicDJE} % 0402 CYRILLIC CAPITAL LETTER DJE
+\defineactivetoken 163 {\cyrillicGJE} % 0403 CYRILLIC CAPITAL LETTER GJE
+\defineactivetoken 164 {\cyrillicIE} % 0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE
+\defineactivetoken 165 {\cyrillicDZE} % 0405 CYRILLIC CAPITAL LETTER DZE
+\defineactivetoken 166 {\cyrillicII} % 0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+\defineactivetoken 167 {\cyrillicYI} % 0407 CYRILLIC CAPITAL LETTER YI
+\defineactivetoken 168 {\cyrillicJE} % 0408 CYRILLIC CAPITAL LETTER JE
+\defineactivetoken 169 {\cyrillicLJE} % 0409 CYRILLIC CAPITAL LETTER LJE
+\defineactivetoken 170 {\cyrillicNJE} % 040A CYRILLIC CAPITAL LETTER NJE
+\defineactivetoken 171 {\cyrillicTSHE} % 040B CYRILLIC CAPITAL LETTER TSHE
+\defineactivetoken 172 {\cyrillicKJE} % 040C CYRILLIC CAPITAL LETTER KJE
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\cyrillicUSHRT} % 040E CYRILLIC CAPITAL LETTER SHORT U
+\defineactivetoken 175 {\cyrillicDZHE} % 040F CYRILLIC CAPITAL LETTER DZHE
+\defineactivetoken 176 {\cyrillicA} % 0410 CYRILLIC CAPITAL LETTER A
+\defineactivetoken 177 {\cyrillicB} % 0411 CYRILLIC CAPITAL LETTER BE
+\defineactivetoken 178 {\cyrillicV} % 0412 CYRILLIC CAPITAL LETTER VE
+\defineactivetoken 179 {\cyrillicG} % 0413 CYRILLIC CAPITAL LETTER GHE
+\defineactivetoken 180 {\cyrillicD} % 0414 CYRILLIC CAPITAL LETTER DE
+\defineactivetoken 181 {\cyrillicE} % 0415 CYRILLIC CAPITAL LETTER IE
+\defineactivetoken 182 {\cyrillicZH} % 0416 CYRILLIC CAPITAL LETTER ZHE
+\defineactivetoken 183 {\cyrillicZ} % 0417 CYRILLIC CAPITAL LETTER ZE
+\defineactivetoken 184 {\cyrillicI} % 0418 CYRILLIC CAPITAL LETTER I
+\defineactivetoken 185 {\cyrillicISHRT} % 0419 CYRILLIC CAPITAL LETTER SHORT I
+\defineactivetoken 186 {\cyrillicK} % 041A CYRILLIC CAPITAL LETTER KA
+\defineactivetoken 187 {\cyrillicL} % 041B CYRILLIC CAPITAL LETTER EL
+\defineactivetoken 188 {\cyrillicM} % 041C CYRILLIC CAPITAL LETTER EM
+\defineactivetoken 189 {\cyrillicN} % 041D CYRILLIC CAPITAL LETTER EN
+\defineactivetoken 190 {\cyrillicO} % 041E CYRILLIC CAPITAL LETTER O
+\defineactivetoken 191 {\cyrillicP} % 041F CYRILLIC CAPITAL LETTER PE
+\defineactivetoken 192 {\cyrillicR} % 0420 CYRILLIC CAPITAL LETTER ER
+\defineactivetoken 193 {\cyrillicS} % 0421 CYRILLIC CAPITAL LETTER ES
+\defineactivetoken 194 {\cyrillicT} % 0422 CYRILLIC CAPITAL LETTER TE
+\defineactivetoken 195 {\cyrillicU} % 0423 CYRILLIC CAPITAL LETTER U
+\defineactivetoken 196 {\cyrillicF} % 0424 CYRILLIC CAPITAL LETTER EF
+\defineactivetoken 197 {\cyrillicH} % 0425 CYRILLIC CAPITAL LETTER HA
+\defineactivetoken 198 {\cyrillicC} % 0426 CYRILLIC CAPITAL LETTER TSE
+\defineactivetoken 199 {\cyrillicCH} % 0427 CYRILLIC CAPITAL LETTER CHE
+\defineactivetoken 200 {\cyrillicSH} % 0428 CYRILLIC CAPITAL LETTER SHA
+\defineactivetoken 201 {\cyrillicSHCH} % 0429 CYRILLIC CAPITAL LETTER SHCHA
+\defineactivetoken 202 {\cyrillicHRDSN} % 042A CYRILLIC CAPITAL LETTER HARD SIGN
+\defineactivetoken 203 {\cyrillicERY} % 042B CYRILLIC CAPITAL LETTER YERU
+\defineactivetoken 204 {\cyrillicSFTSN} % 042C CYRILLIC CAPITAL LETTER SOFT SIGN
+\defineactivetoken 205 {\cyrillicEREV} % 042D CYRILLIC CAPITAL LETTER E
+\defineactivetoken 206 {\cyrillicYU} % 042E CYRILLIC CAPITAL LETTER YU
+\defineactivetoken 207 {\cyrillicYA} % 042F CYRILLIC CAPITAL LETTER YA
+\defineactivetoken 208 {\cyrillica} % 0430 CYRILLIC SMALL LETTER A
+\defineactivetoken 209 {\cyrillicb} % 0431 CYRILLIC SMALL LETTER BE
+\defineactivetoken 210 {\cyrillicv} % 0432 CYRILLIC SMALL LETTER VE
+\defineactivetoken 211 {\cyrillicg} % 0433 CYRILLIC SMALL LETTER GHE
+\defineactivetoken 212 {\cyrillicd} % 0434 CYRILLIC SMALL LETTER DE
+\defineactivetoken 213 {\cyrillice} % 0435 CYRILLIC SMALL LETTER IE
+\defineactivetoken 214 {\cyrilliczh} % 0436 CYRILLIC SMALL LETTER ZHE
+\defineactivetoken 215 {\cyrillicz} % 0437 CYRILLIC SMALL LETTER ZE
+\defineactivetoken 216 {\cyrillici} % 0438 CYRILLIC SMALL LETTER I
+\defineactivetoken 217 {\cyrillicishrt} % 0439 CYRILLIC SMALL LETTER SHORT I
+\defineactivetoken 218 {\cyrillick} % 043A CYRILLIC SMALL LETTER KA
+\defineactivetoken 219 {\cyrillicl} % 043B CYRILLIC SMALL LETTER EL
+\defineactivetoken 220 {\cyrillicm} % 043C CYRILLIC SMALL LETTER EM
+\defineactivetoken 221 {\cyrillicn} % 043D CYRILLIC SMALL LETTER EN
+\defineactivetoken 222 {\cyrillico} % 043E CYRILLIC SMALL LETTER O
+\defineactivetoken 223 {\cyrillicp} % 043F CYRILLIC SMALL LETTER PE
+\defineactivetoken 224 {\cyrillicr} % 0440 CYRILLIC SMALL LETTER ER
+\defineactivetoken 225 {\cyrillics} % 0441 CYRILLIC SMALL LETTER ES
+\defineactivetoken 226 {\cyrillict} % 0442 CYRILLIC SMALL LETTER TE
+\defineactivetoken 227 {\cyrillicu} % 0443 CYRILLIC SMALL LETTER U
+\defineactivetoken 228 {\cyrillicf} % 0444 CYRILLIC SMALL LETTER EF
+\defineactivetoken 229 {\cyrillich} % 0445 CYRILLIC SMALL LETTER HA
+\defineactivetoken 230 {\cyrillicc} % 0446 CYRILLIC SMALL LETTER TSE
+\defineactivetoken 231 {\cyrillicch} % 0447 CYRILLIC SMALL LETTER CHE
+\defineactivetoken 232 {\cyrillicsh} % 0448 CYRILLIC SMALL LETTER SHA
+\defineactivetoken 233 {\cyrillicshch} % 0449 CYRILLIC SMALL LETTER SHCHA
+\defineactivetoken 234 {\cyrillichrdsn} % 044A CYRILLIC SMALL LETTER HARD SIGN
+\defineactivetoken 235 {\cyrillicery} % 044B CYRILLIC SMALL LETTER YERU
+\defineactivetoken 236 {\cyrillicsftsn} % 044C CYRILLIC SMALL LETTER SOFT SIGN
+\defineactivetoken 237 {\cyrillicerev} % 044D CYRILLIC SMALL LETTER E
+\defineactivetoken 238 {\cyrillicyu} % 044E CYRILLIC SMALL LETTER YU
+\defineactivetoken 239 {\cyrillicya} % 044F CYRILLIC SMALL LETTER YA
+\defineactivetoken 240 {\textnumero} % 2116 NUMERO SIGN
+\defineactivetoken 241 {\cyrillicyo} % 0451 CYRILLIC SMALL LETTER IO
+\defineactivetoken 242 {\cyrillicdje} % 0452 CYRILLIC SMALL LETTER DJE
+\defineactivetoken 243 {\cyrillicgje} % 0453 CYRILLIC SMALL LETTER GJE
+\defineactivetoken 244 {\cyrillicie} % 0454 CYRILLIC SMALL LETTER UKRAINIAN IE
+\defineactivetoken 245 {\cyrillicdze} % 0455 CYRILLIC SMALL LETTER DZE
+\defineactivetoken 246 {\cyrillicii} % 0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+\defineactivetoken 247 {\cyrillicyi} % 0457 CYRILLIC SMALL LETTER YI
+\defineactivetoken 248 {\cyrillicje} % 0458 CYRILLIC SMALL LETTER JE
+\defineactivetoken 249 {\cyrilliclje} % 0459 CYRILLIC SMALL LETTER LJE
+\defineactivetoken 250 {\cyrillicnje} % 045A CYRILLIC SMALL LETTER NJE
+\defineactivetoken 251 {\cyrillictshe} % 045B CYRILLIC SMALL LETTER TSHE
+\defineactivetoken 252 {\cyrillickje} % 045C CYRILLIC SMALL LETTER KJE
+\defineactivetoken 253 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 254 {\cyrillicushrt} % 045E CYRILLIC SMALL LETTER SHORT U
+\defineactivetoken 255 {\cyrillicdzhe} % 045F CYRILLIC SMALL LETTER DZHE
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-6.lua b/tex/context/base/regi-8859-6.lua
new file mode 100644
index 000000000..e094129f2
--- /dev/null
+++ b/tex/context/base/regi-8859-6.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-6'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-6"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F,
+ 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
+ 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+}
diff --git a/tex/context/base/regi-8859-7.lua b/tex/context/base/regi-8859-7.lua
new file mode 100644
index 000000000..cee253582
--- /dev/null
+++ b/tex/context/base/regi-8859-7.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-7'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-7"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
+}
diff --git a/tex/context/base/regi-8859-7.mkii b/tex/context/base/regi-8859-7.mkii
new file mode 100644
index 000000000..80259be65
--- /dev/null
+++ b/tex/context/base/regi-8859-7.mkii
@@ -0,0 +1,153 @@
+%D \module
+%D [ file=regi-8859-7,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-7 (Greek),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-7 input encoding (regime) for Greek,
+%D see also cp1253.
+%D
+%D (Contributor to the original file: Apostolos Syropoulos.)
+%D
+%D Usage: \type{\enableregime[8859-7]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-7]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\quoteleft} % 2018 LEFT SINGLE QUOTATION MARK
+\defineactivetoken 162 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 165 {\unknownchar} % 20AF DRACHMA SIGN (TODO)
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\unknownchar} % 037A GREEK YPOGEGRAMMENI (TODO)
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 175 {\texthorizontalbar} % 2015 HORIZONTAL BAR
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\greektonos} % 0384 GREEK TONOS
+\defineactivetoken 181 {\greekdialytikatonos} % 0385 GREEK DIALYTIKA TONOS
+\defineactivetoken 182 {\greekAlphatonos} % 0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\greekEpsilontonos} % 0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+\defineactivetoken 185 {\greekEtatonos} % 0389 GREEK CAPITAL LETTER ETA WITH TONOS
+\defineactivetoken 186 {\greekIotatonos} % 038A GREEK CAPITAL LETTER IOTA WITH TONOS
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\greekOmicrontonos} % 038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\greekUpsilontonos} % 038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+\defineactivetoken 191 {\greekOmegatonos} % 038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+\defineactivetoken 192 {\greekiotadialytikatonos} % 0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+\defineactivetoken 193 {\greekAlpha} % 0391 GREEK CAPITAL LETTER ALPHA
+\defineactivetoken 194 {\greekBeta} % 0392 GREEK CAPITAL LETTER BETA
+\defineactivetoken 195 {\greekGamma} % 0393 GREEK CAPITAL LETTER GAMMA
+\defineactivetoken 196 {\greekDelta} % 0394 GREEK CAPITAL LETTER DELTA
+\defineactivetoken 197 {\greekEpsilon} % 0395 GREEK CAPITAL LETTER EPSILON
+\defineactivetoken 198 {\greekZeta} % 0396 GREEK CAPITAL LETTER ZETA
+\defineactivetoken 199 {\greekEta} % 0397 GREEK CAPITAL LETTER ETA
+\defineactivetoken 200 {\greekTheta} % 0398 GREEK CAPITAL LETTER THETA
+\defineactivetoken 201 {\greekIota} % 0399 GREEK CAPITAL LETTER IOTA
+\defineactivetoken 202 {\greekKappa} % 039A GREEK CAPITAL LETTER KAPPA
+\defineactivetoken 203 {\greekLambda} % 039B GREEK CAPITAL LETTER LAMDA
+\defineactivetoken 204 {\greekMu} % 039C GREEK CAPITAL LETTER MU
+\defineactivetoken 205 {\greekNu} % 039D GREEK CAPITAL LETTER NU
+\defineactivetoken 206 {\greekXi} % 039E GREEK CAPITAL LETTER XI
+\defineactivetoken 207 {\greekOmicron} % 039F GREEK CAPITAL LETTER OMICRON
+\defineactivetoken 208 {\greekPi} % 03A0 GREEK CAPITAL LETTER PI
+\defineactivetoken 209 {\greekRho} % 03A1 GREEK CAPITAL LETTER RHO
+\defineactivetoken 210 {\unknownchar} % <undefined>
+\defineactivetoken 211 {\greekSigma} % 03A3 GREEK CAPITAL LETTER SIGMA
+\defineactivetoken 212 {\greekTau} % 03A4 GREEK CAPITAL LETTER TAU
+\defineactivetoken 213 {\greekUpsilon} % 03A5 GREEK CAPITAL LETTER UPSILON
+\defineactivetoken 214 {\greekPhi} % 03A6 GREEK CAPITAL LETTER PHI
+\defineactivetoken 215 {\greekChi} % 03A7 GREEK CAPITAL LETTER CHI
+\defineactivetoken 216 {\greekPsi} % 03A8 GREEK CAPITAL LETTER PSI
+\defineactivetoken 217 {\greekOmega} % 03A9 GREEK CAPITAL LETTER OMEGA
+\defineactivetoken 218 {\greekIotadialytika} % 03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+\defineactivetoken 219 {\greekUpsilondialytika} % 03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+\defineactivetoken 220 {\greekalphatonos} % 03AC GREEK SMALL LETTER ALPHA WITH TONOS
+\defineactivetoken 221 {\greekepsilontonos} % 03AD GREEK SMALL LETTER EPSILON WITH TONOS
+\defineactivetoken 222 {\greeketatonos} % 03AE GREEK SMALL LETTER ETA WITH TONOS
+\defineactivetoken 223 {\greekiotatonos} % 03AF GREEK SMALL LETTER IOTA WITH TONOS
+\defineactivetoken 224 {\greekupsilondialytikatonos} % 03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+\defineactivetoken 225 {\greekalpha} % 03B1 GREEK SMALL LETTER ALPHA
+\defineactivetoken 226 {\greekbeta} % 03B2 GREEK SMALL LETTER BETA
+\defineactivetoken 227 {\greekgamma} % 03B3 GREEK SMALL LETTER GAMMA
+\defineactivetoken 228 {\greekdelta} % 03B4 GREEK SMALL LETTER DELTA
+\defineactivetoken 229 {\greekepsilon} % 03B5 GREEK SMALL LETTER EPSILON
+\defineactivetoken 230 {\greekzeta} % 03B6 GREEK SMALL LETTER ZETA
+\defineactivetoken 231 {\greeketa} % 03B7 GREEK SMALL LETTER ETA
+\defineactivetoken 232 {\greektheta} % 03B8 GREEK SMALL LETTER THETA
+\defineactivetoken 233 {\greekiota} % 03B9 GREEK SMALL LETTER IOTA
+\defineactivetoken 234 {\greekkappa} % 03BA GREEK SMALL LETTER KAPPA
+\defineactivetoken 235 {\greeklambda} % 03BB GREEK SMALL LETTER LAMDA
+\defineactivetoken 236 {\greekmu} % 03BC GREEK SMALL LETTER MU
+\defineactivetoken 237 {\greeknu} % 03BD GREEK SMALL LETTER NU
+\defineactivetoken 238 {\greekxi} % 03BE GREEK SMALL LETTER XI
+\defineactivetoken 239 {\greekomicron} % 03BF GREEK SMALL LETTER OMICRON
+\defineactivetoken 240 {\greekpi} % 03C0 GREEK SMALL LETTER PI
+\defineactivetoken 241 {\greekrho} % 03C1 GREEK SMALL LETTER RHO
+\defineactivetoken 242 {\greekfinalsigma} % 03C2 GREEK SMALL LETTER FINAL SIGMA
+\defineactivetoken 243 {\greeksigma} % 03C3 GREEK SMALL LETTER SIGMA
+\defineactivetoken 244 {\greektau} % 03C4 GREEK SMALL LETTER TAU
+\defineactivetoken 245 {\greekupsilon} % 03C5 GREEK SMALL LETTER UPSILON
+\defineactivetoken 246 {\greekphi} % 03C6 GREEK SMALL LETTER PHI
+\defineactivetoken 247 {\greekchi} % 03C7 GREEK SMALL LETTER CHI
+\defineactivetoken 248 {\greekpsi} % 03C8 GREEK SMALL LETTER PSI
+\defineactivetoken 249 {\greekomega} % 03C9 GREEK SMALL LETTER OMEGA
+\defineactivetoken 250 {\greekiotadialytika} % 03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+\defineactivetoken 251 {\greekupsilondiaeresis} % 03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+\defineactivetoken 252 {\greekomicrontonos} % 03CC GREEK SMALL LETTER OMICRON WITH TONOS
+\defineactivetoken 253 {\greekupsilontonos} % 03CD GREEK SMALL LETTER UPSILON WITH TONOS
+\defineactivetoken 254 {\greekomegatonos} % 03CE GREEK SMALL LETTER OMEGA WITH TONOS
+\defineactivetoken 255 {\unknownchar} % <undefined>
+
+\stopregime
+
diff --git a/tex/context/base/regi-8859-8.lua b/tex/context/base/regi-8859-8.lua
new file mode 100644
index 000000000..062b080ad
--- /dev/null
+++ b/tex/context/base/regi-8859-8.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-8'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-8"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
+}
diff --git a/tex/context/base/regi-8859-9.lua b/tex/context/base/regi-8859-9.lua
new file mode 100644
index 000000000..2af118a8c
--- /dev/null
+++ b/tex/context/base/regi-8859-9.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-8859-9'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["8859-9"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-9.mkii b/tex/context/base/regi-8859-9.mkii
new file mode 100644
index 000000000..8460d739b
--- /dev/null
+++ b/tex/context/base/regi-8859-9.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=regi-8859-9,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=iso-8859-9 (Turkish),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for iso-8859-9/Latin5 input encoding (regime) for Turkish,
+%D see also cp1254.
+%D
+%D Usage: \type{\enableregime[8859-9]} (see \type {regi-syn} for
+%D alternatives calls).
+
+\startregime[8859-9]
+
+\defineactivetoken 128 {\unknownchar} % 0080 <control>
+\defineactivetoken 129 {\unknownchar} % 0081 <control>
+\defineactivetoken 130 {\unknownchar} % 0082 <control>
+\defineactivetoken 131 {\unknownchar} % 0083 <control>
+\defineactivetoken 132 {\unknownchar} % 0084 <control>
+\defineactivetoken 133 {\unknownchar} % 0085 <control>
+\defineactivetoken 134 {\unknownchar} % 0086 <control>
+\defineactivetoken 135 {\unknownchar} % 0087 <control>
+\defineactivetoken 136 {\unknownchar} % 0088 <control>
+\defineactivetoken 137 {\unknownchar} % 0089 <control>
+\defineactivetoken 138 {\unknownchar} % 008A <control>
+\defineactivetoken 139 {\unknownchar} % 008B <control>
+\defineactivetoken 140 {\unknownchar} % 008C <control>
+\defineactivetoken 141 {\unknownchar} % 008D <control>
+\defineactivetoken 142 {\unknownchar} % 008E <control>
+\defineactivetoken 143 {\unknownchar} % 008F <control>
+\defineactivetoken 144 {\unknownchar} % 0090 <control>
+\defineactivetoken 145 {\unknownchar} % 0091 <control>
+\defineactivetoken 146 {\unknownchar} % 0092 <control>
+\defineactivetoken 147 {\unknownchar} % 0093 <control>
+\defineactivetoken 148 {\unknownchar} % 0094 <control>
+\defineactivetoken 149 {\unknownchar} % 0095 <control>
+\defineactivetoken 150 {\unknownchar} % 0096 <control>
+\defineactivetoken 151 {\unknownchar} % 0097 <control>
+\defineactivetoken 152 {\unknownchar} % 0098 <control>
+\defineactivetoken 153 {\unknownchar} % 0099 <control>
+\defineactivetoken 154 {\unknownchar} % 009A <control>
+\defineactivetoken 155 {\unknownchar} % 009B <control>
+\defineactivetoken 156 {\unknownchar} % 009C <control>
+\defineactivetoken 157 {\unknownchar} % 009D <control>
+\defineactivetoken 158 {\unknownchar} % 009E <control>
+\defineactivetoken 159 {\unknownchar} % 009F <control>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\exclamdown} % 00A1 INVERTED EXCLAMATION MARK
+\defineactivetoken 162 {\textcent} % 00A2 CENT SIGN
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\textyen} % 00A5 YEN SIGN
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\ordfeminine} % 00AA FEMININE ORDINAL INDICATOR
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\textmacron} % 00AF MACRON
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\onesuperior} % 00B9 SUPERSCRIPT ONE
+\defineactivetoken 186 {\ordmasculine} % 00BA MASCULINE ORDINAL INDICATOR
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\onequarter} % 00BC VULGAR FRACTION ONE QUARTER
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\threequarter} % 00BE VULGAR FRACTION THREE QUARTERS
+\defineactivetoken 191 {\questiondown} % 00BF INVERTED QUESTION MARK
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 208 {\Gbreve} % 011E LATIN CAPITAL LETTER G WITH BREVE
+\defineactivetoken 209 {\Ntilde} % 00D1 LATIN CAPITAL LETTER N WITH TILDE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Idotaccent} % 0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+\defineactivetoken 222 {\Scedilla} % 015E LATIN CAPITAL LETTER S WITH CEDILLA
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 240 {\gbreve} % 011F LATIN SMALL LETTER G WITH BREVE
+\defineactivetoken 241 {\ntilde} % 00F1 LATIN SMALL LETTER N WITH TILDE
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\dotlessi} % 0131 LATIN SMALL LETTER DOTLESS I
+\defineactivetoken 254 {\scedilla} % 015F LATIN SMALL LETTER S WITH CEDILLA
+\defineactivetoken 255 {\ydiaeresis} % 00FF LATIN SMALL LETTER Y WITH DIAERESIS
+
+\stopregime
+
diff --git a/tex/context/base/regi-cp1250.lua b/tex/context/base/regi-cp1250.lua
new file mode 100644
index 000000000..a37ca46b4
--- /dev/null
+++ b/tex/context/base/regi-cp1250.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1250'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1250"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
+ 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
+ 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
+}
diff --git a/tex/context/base/regi-cp1250.mkii b/tex/context/base/regi-cp1250.mkii
new file mode 100644
index 000000000..b92eb5e31
--- /dev/null
+++ b/tex/context/base/regi-cp1250.mkii
@@ -0,0 +1,153 @@
+%D \module
+%D [ file=regi-cp1250,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=cp1250 (East European),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for cp1250 input encoding (regime) for Central European languages,
+%D see also iso-8859-2.
+%D
+%D Usage:
+%D \type{\enableregime[cp1250]} or \type{\enablereregime[windows-1250]}
+
+
+\startregime[cp1250]
+
+\defineactivetoken 128 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 129 {\unknownchar} % <undefined>
+\defineactivetoken 130 {\quotesinglebase} % 201A SINGLE LOW-9 QUOTATION MARK
+\defineactivetoken 131 {\unknownchar} % <undefined>
+\defineactivetoken 132 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 133 {\textellipsis} % 2026 HORIZONTAL ELLIPSIS
+\defineactivetoken 134 {\textdag} % 2020 DAGGER
+\defineactivetoken 135 {\textddag} % 2021 DOUBLE DAGGER
+\defineactivetoken 136 {\unknownchar} % <undefined>
+\defineactivetoken 137 {\perthousand} % 2030 PER MILLE SIGN
+\defineactivetoken 138 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 139 {\guilsingleleft} % 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 140 {\Sacute} % 015A LATIN CAPITAL LETTER S WITH ACUTE
+\defineactivetoken 141 {\Tcaron} % 0164 LATIN CAPITAL LETTER T WITH CARON
+\defineactivetoken 142 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 143 {\Zacute} % 0179 LATIN CAPITAL LETTER Z WITH ACUTE
+\defineactivetoken 144 {\unknownchar} % <undefined>
+\defineactivetoken 145 {\quoteleft} % 2018 LEFT SINGLE QUOTATION MARK
+\defineactivetoken 146 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+\defineactivetoken 147 {\quotedblleft} % 201C LEFT DOUBLE QUOTATION MARK
+\defineactivetoken 148 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 149 {\textbullet} % 2022 BULLET
+\defineactivetoken 150 {\endash} % 2013 EN DASH
+\defineactivetoken 151 {\emdash} % 2014 EM DASH
+\defineactivetoken 152 {\unknownchar} % <undefined>
+\defineactivetoken 153 {\trademark} % 2122 TRADE MARK SIGN
+\defineactivetoken 154 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 155 {\guilsingleright} % 203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 156 {\sacute} % 015B LATIN SMALL LETTER S WITH ACUTE
+\defineactivetoken 157 {\tcaron} % 0165 LATIN SMALL LETTER T WITH CARON
+\defineactivetoken 158 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 159 {\zacute} % 017A LATIN SMALL LETTER Z WITH ACUTE
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\textcaron} % 02C7 CARON
+\defineactivetoken 162 {\textbreve} % 02D8 BREVE
+\defineactivetoken 163 {\Lstroke} % 0141 LATIN CAPITAL LETTER L WITH STROKE
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\Aogonek} % 0104 LATIN CAPITAL LETTER A WITH OGONEK
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\Scedilla} % 015E LATIN CAPITAL LETTER S WITH CEDILLA
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\Zdotaccent} % 017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\textogonek} % 02DB OGONEK
+\defineactivetoken 179 {\lstroke} % 0142 LATIN SMALL LETTER L WITH STROKE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\aogonek} % 0105 LATIN SMALL LETTER A WITH OGONEK
+\defineactivetoken 186 {\scedilla} % 015F LATIN SMALL LETTER S WITH CEDILLA
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\Lcaron} % 013D LATIN CAPITAL LETTER L WITH CARON
+\defineactivetoken 189 {\texthungarumlaut} % 02DD DOUBLE ACUTE ACCENT
+\defineactivetoken 190 {\lcaron} % 013E LATIN SMALL LETTER L WITH CARON
+\defineactivetoken 191 {\zdotaccent} % 017C LATIN SMALL LETTER Z WITH DOT ABOVE
+\defineactivetoken 192 {\Racute} % 0154 LATIN CAPITAL LETTER R WITH ACUTE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Abreve} % 0102 LATIN CAPITAL LETTER A WITH BREVE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Lacute} % 0139 LATIN CAPITAL LETTER L WITH ACUTE
+\defineactivetoken 198 {\Cacute} % 0106 LATIN CAPITAL LETTER C WITH ACUTE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Ccaron} % 010C LATIN CAPITAL LETTER C WITH CARON
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Eogonek} % 0118 LATIN CAPITAL LETTER E WITH OGONEK
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Ecaron} % 011A LATIN CAPITAL LETTER E WITH CARON
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Dcaron} % 010E LATIN CAPITAL LETTER D WITH CARON
+\defineactivetoken 208 {\Dstroke} % 0110 LATIN CAPITAL LETTER D WITH STROKE
+\defineactivetoken 209 {\Nacute} % 0143 LATIN CAPITAL LETTER N WITH ACUTE
+\defineactivetoken 210 {\Ncaron} % 0147 LATIN CAPITAL LETTER N WITH CARON
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Ohungarumlaut} % 0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Rcaron} % 0158 LATIN CAPITAL LETTER R WITH CARON
+\defineactivetoken 217 {\Uring} % 016E LATIN CAPITAL LETTER U WITH RING ABOVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Uhungarumlaut} % 0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Yacute} % 00DD LATIN CAPITAL LETTER Y WITH ACUTE
+\defineactivetoken 222 {\Tcedilla} % 0162 LATIN CAPITAL LETTER T WITH CEDILLA
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\racute} % 0155 LATIN SMALL LETTER R WITH ACUTE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\abreve} % 0103 LATIN SMALL LETTER A WITH BREVE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\lacute} % 013A LATIN SMALL LETTER L WITH ACUTE
+\defineactivetoken 230 {\cacute} % 0107 LATIN SMALL LETTER C WITH ACUTE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\ccaron} % 010D LATIN SMALL LETTER C WITH CARON
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\eogonek} % 0119 LATIN SMALL LETTER E WITH OGONEK
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\ecaron} % 011B LATIN SMALL LETTER E WITH CARON
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\dcaron} % 010F LATIN SMALL LETTER D WITH CARON
+\defineactivetoken 240 {\dstroke} % 0111 LATIN SMALL LETTER D WITH STROKE
+\defineactivetoken 241 {\nacute} % 0144 LATIN SMALL LETTER N WITH ACUTE
+\defineactivetoken 242 {\ncaron} % 0148 LATIN SMALL LETTER N WITH CARON
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\ohungarumlaut} % 0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\rcaron} % 0159 LATIN SMALL LETTER R WITH CARON
+\defineactivetoken 249 {\uring} % 016F LATIN SMALL LETTER U WITH RING ABOVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\uhungarumlaut} % 0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\yacute} % 00FD LATIN SMALL LETTER Y WITH ACUTE
+\defineactivetoken 254 {\tcedilla} % 0163 LATIN SMALL LETTER T WITH CEDILLA
+\defineactivetoken 255 {\textdotaccent} % 02D9 DOT ABOVE
+
+\stopregime
+
diff --git a/tex/context/base/regi-cp1251.lua b/tex/context/base/regi-cp1251.lua
new file mode 100644
index 000000000..42fe0b340
--- /dev/null
+++ b/tex/context/base/regi-cp1251.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1251'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1251"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
+ 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
+ 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
+}
diff --git a/tex/context/base/regi-cp1251.mkii b/tex/context/base/regi-cp1251.mkii
new file mode 100644
index 000000000..60f04170b
--- /dev/null
+++ b/tex/context/base/regi-cp1251.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=regi-cp1251,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=cp1251 (Cyrillic),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for cp1251 input encoding (regime) for Cyrillic.
+%D
+%D Usage:
+%D \type{\enableregime[cp1251]} or \type{\enablereregime[windows-1251]}
+
+
+\startregime[cp1251]
+
+\defineactivetoken 128 {\cyrillicDJE} % 0402 CYRILLIC CAPITAL LETTER DJE
+\defineactivetoken 129 {\cyrillicGJE} % 0403 CYRILLIC CAPITAL LETTER GJE
+\defineactivetoken 130 {\quotesinglebase} % 201A SINGLE LOW-9 QUOTATION MARK
+\defineactivetoken 131 {\cyrillicgje} % 0453 CYRILLIC SMALL LETTER GJE
+\defineactivetoken 132 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 133 {\textellipsis} % 2026 HORIZONTAL ELLIPSIS
+\defineactivetoken 134 {\textdag} % 2020 DAGGER
+\defineactivetoken 135 {\textddag} % 2021 DOUBLE DAGGER
+\defineactivetoken 136 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 137 {\perthousand} % 2030 PER MILLE SIGN
+\defineactivetoken 138 {\cyrillicLJE} % 0409 CYRILLIC CAPITAL LETTER LJE
+\defineactivetoken 139 {\guilsingleleft} % 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 140 {\cyrillicNJE} % 040A CYRILLIC CAPITAL LETTER NJE
+\defineactivetoken 141 {\cyrillicKJE} % 040C CYRILLIC CAPITAL LETTER KJE
+\defineactivetoken 142 {\cyrillicTSHE} % 040B CYRILLIC CAPITAL LETTER TSHE
+\defineactivetoken 143 {\cyrillicDZHE} % 040F CYRILLIC CAPITAL LETTER DZHE
+\defineactivetoken 144 {\cyrillicdje} % 0452 CYRILLIC SMALL LETTER DJE
+\defineactivetoken 145 {\quoteleft} % 2018 LEFT SINGLE QUOTATION MARK
+\defineactivetoken 146 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+\defineactivetoken 147 {\quotedblleft} % 201C LEFT DOUBLE QUOTATION MARK
+\defineactivetoken 148 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 149 {\textbullet} % 2022 BULLET
+\defineactivetoken 150 {\endash} % 2013 EN DASH
+\defineactivetoken 151 {\emdash} % 2014 EM DASH
+\defineactivetoken 152 {\unknownchar} % <undefined>
+\defineactivetoken 153 {\trademark} % 2122 TRADE MARK SIGN
+\defineactivetoken 154 {\cyrilliclje} % 0459 CYRILLIC SMALL LETTER LJE
+\defineactivetoken 155 {\guilsingleright} % 203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 156 {\cyrillicnje} % 045A CYRILLIC SMALL LETTER NJE
+\defineactivetoken 157 {\cyrillickje} % 045C CYRILLIC SMALL LETTER KJE
+\defineactivetoken 158 {\cyrillictshe} % 045B CYRILLIC SMALL LETTER TSHE
+\defineactivetoken 159 {\cyrillicdzhe} % 045F CYRILLIC SMALL LETTER DZHE
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\cyrillicUSHRT} % 040E CYRILLIC CAPITAL LETTER SHORT U
+\defineactivetoken 162 {\cyrillicushrt} % 045E CYRILLIC SMALL LETTER SHORT U
+\defineactivetoken 163 {\cyrillicJE} % 0408 CYRILLIC CAPITAL LETTER JE
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\cyrillicGHEupturn} % 0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\cyrillicYO} % 0401 CYRILLIC CAPITAL LETTER IO
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\cyrillicIE} % 0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\cyrillicYI} % 0407 CYRILLIC CAPITAL LETTER YI
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\cyrillicII} % 0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+\defineactivetoken 179 {\cyrillicii} % 0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+\defineactivetoken 180 {\cyrillicgheupturn} % 0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\cyrillicyo} % 0451 CYRILLIC SMALL LETTER IO
+\defineactivetoken 185 {\textnumero} % 2116 NUMERO SIGN
+\defineactivetoken 186 {\cyrillicie} % 0454 CYRILLIC SMALL LETTER UKRAINIAN IE
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\cyrillicje} % 0458 CYRILLIC SMALL LETTER JE
+\defineactivetoken 189 {\cyrillicDZE} % 0405 CYRILLIC CAPITAL LETTER DZE
+\defineactivetoken 190 {\cyrillicdze} % 0455 CYRILLIC SMALL LETTER DZE
+\defineactivetoken 191 {\cyrillicyi} % 0457 CYRILLIC SMALL LETTER YI
+\defineactivetoken 192 {\cyrillicA} % 0410 CYRILLIC CAPITAL LETTER A
+\defineactivetoken 193 {\cyrillicB} % 0411 CYRILLIC CAPITAL LETTER BE
+\defineactivetoken 194 {\cyrillicV} % 0412 CYRILLIC CAPITAL LETTER VE
+\defineactivetoken 195 {\cyrillicG} % 0413 CYRILLIC CAPITAL LETTER GHE
+\defineactivetoken 196 {\cyrillicD} % 0414 CYRILLIC CAPITAL LETTER DE
+\defineactivetoken 197 {\cyrillicE} % 0415 CYRILLIC CAPITAL LETTER IE
+\defineactivetoken 198 {\cyrillicZH} % 0416 CYRILLIC CAPITAL LETTER ZHE
+\defineactivetoken 199 {\cyrillicZ} % 0417 CYRILLIC CAPITAL LETTER ZE
+\defineactivetoken 200 {\cyrillicI} % 0418 CYRILLIC CAPITAL LETTER I
+\defineactivetoken 201 {\cyrillicISHRT} % 0419 CYRILLIC CAPITAL LETTER SHORT I
+\defineactivetoken 202 {\cyrillicK} % 041A CYRILLIC CAPITAL LETTER KA
+\defineactivetoken 203 {\cyrillicL} % 041B CYRILLIC CAPITAL LETTER EL
+\defineactivetoken 204 {\cyrillicM} % 041C CYRILLIC CAPITAL LETTER EM
+\defineactivetoken 205 {\cyrillicN} % 041D CYRILLIC CAPITAL LETTER EN
+\defineactivetoken 206 {\cyrillicO} % 041E CYRILLIC CAPITAL LETTER O
+\defineactivetoken 207 {\cyrillicP} % 041F CYRILLIC CAPITAL LETTER PE
+\defineactivetoken 208 {\cyrillicR} % 0420 CYRILLIC CAPITAL LETTER ER
+\defineactivetoken 209 {\cyrillicS} % 0421 CYRILLIC CAPITAL LETTER ES
+\defineactivetoken 210 {\cyrillicT} % 0422 CYRILLIC CAPITAL LETTER TE
+\defineactivetoken 211 {\cyrillicU} % 0423 CYRILLIC CAPITAL LETTER U
+\defineactivetoken 212 {\cyrillicF} % 0424 CYRILLIC CAPITAL LETTER EF
+\defineactivetoken 213 {\cyrillicH} % 0425 CYRILLIC CAPITAL LETTER HA
+\defineactivetoken 214 {\cyrillicC} % 0426 CYRILLIC CAPITAL LETTER TSE
+\defineactivetoken 215 {\cyrillicCH} % 0427 CYRILLIC CAPITAL LETTER CHE
+\defineactivetoken 216 {\cyrillicSH} % 0428 CYRILLIC CAPITAL LETTER SHA
+\defineactivetoken 217 {\cyrillicSHCH} % 0429 CYRILLIC CAPITAL LETTER SHCHA
+\defineactivetoken 218 {\cyrillicHRDSN} % 042A CYRILLIC CAPITAL LETTER HARD SIGN
+\defineactivetoken 219 {\cyrillicERY} % 042B CYRILLIC CAPITAL LETTER YERU
+\defineactivetoken 220 {\cyrillicSFTSN} % 042C CYRILLIC CAPITAL LETTER SOFT SIGN
+\defineactivetoken 221 {\cyrillicEREV} % 042D CYRILLIC CAPITAL LETTER E
+\defineactivetoken 222 {\cyrillicYU} % 042E CYRILLIC CAPITAL LETTER YU
+\defineactivetoken 223 {\cyrillicYA} % 042F CYRILLIC CAPITAL LETTER YA
+\defineactivetoken 224 {\cyrillica} % 0430 CYRILLIC SMALL LETTER A
+\defineactivetoken 225 {\cyrillicb} % 0431 CYRILLIC SMALL LETTER BE
+\defineactivetoken 226 {\cyrillicv} % 0432 CYRILLIC SMALL LETTER VE
+\defineactivetoken 227 {\cyrillicg} % 0433 CYRILLIC SMALL LETTER GHE
+\defineactivetoken 228 {\cyrillicd} % 0434 CYRILLIC SMALL LETTER DE
+\defineactivetoken 229 {\cyrillice} % 0435 CYRILLIC SMALL LETTER IE
+\defineactivetoken 230 {\cyrilliczh} % 0436 CYRILLIC SMALL LETTER ZHE
+\defineactivetoken 231 {\cyrillicz} % 0437 CYRILLIC SMALL LETTER ZE
+\defineactivetoken 232 {\cyrillici} % 0438 CYRILLIC SMALL LETTER I
+\defineactivetoken 233 {\cyrillicishrt} % 0439 CYRILLIC SMALL LETTER SHORT I
+\defineactivetoken 234 {\cyrillick} % 043A CYRILLIC SMALL LETTER KA
+\defineactivetoken 235 {\cyrillicl} % 043B CYRILLIC SMALL LETTER EL
+\defineactivetoken 236 {\cyrillicm} % 043C CYRILLIC SMALL LETTER EM
+\defineactivetoken 237 {\cyrillicn} % 043D CYRILLIC SMALL LETTER EN
+\defineactivetoken 238 {\cyrillico} % 043E CYRILLIC SMALL LETTER O
+\defineactivetoken 239 {\cyrillicp} % 043F CYRILLIC SMALL LETTER PE
+\defineactivetoken 240 {\cyrillicr} % 0440 CYRILLIC SMALL LETTER ER
+\defineactivetoken 241 {\cyrillics} % 0441 CYRILLIC SMALL LETTER ES
+\defineactivetoken 242 {\cyrillict} % 0442 CYRILLIC SMALL LETTER TE
+\defineactivetoken 243 {\cyrillicu} % 0443 CYRILLIC SMALL LETTER U
+\defineactivetoken 244 {\cyrillicf} % 0444 CYRILLIC SMALL LETTER EF
+\defineactivetoken 245 {\cyrillich} % 0445 CYRILLIC SMALL LETTER HA
+\defineactivetoken 246 {\cyrillicc} % 0446 CYRILLIC SMALL LETTER TSE
+\defineactivetoken 247 {\cyrillicch} % 0447 CYRILLIC SMALL LETTER CHE
+\defineactivetoken 248 {\cyrillicsh} % 0448 CYRILLIC SMALL LETTER SHA
+\defineactivetoken 249 {\cyrillicshch} % 0449 CYRILLIC SMALL LETTER SHCHA
+\defineactivetoken 250 {\cyrillichrdsn} % 044A CYRILLIC SMALL LETTER HARD SIGN
+\defineactivetoken 251 {\cyrillicery} % 044B CYRILLIC SMALL LETTER YERU
+\defineactivetoken 252 {\cyrillicsftsn} % 044C CYRILLIC SMALL LETTER SOFT SIGN
+\defineactivetoken 253 {\cyrillicerev} % 044D CYRILLIC SMALL LETTER E
+\defineactivetoken 254 {\cyrillicyu} % 044E CYRILLIC SMALL LETTER YU
+\defineactivetoken 255 {\cyrillicya} % 044F CYRILLIC SMALL LETTER YA
+
+\stopregime
+
diff --git a/tex/context/base/regi-cp1252.lua b/tex/context/base/regi-cp1252.lua
new file mode 100644
index 000000000..74b2f3761
--- /dev/null
+++ b/tex/context/base/regi-cp1252.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1252'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1252"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
+}
diff --git a/tex/context/base/regi-cp1252.mkii b/tex/context/base/regi-cp1252.mkii
new file mode 100644
index 000000000..9a54f178f
--- /dev/null
+++ b/tex/context/base/regi-cp1252.mkii
@@ -0,0 +1,156 @@
+%D \module
+%D [ file=regi-cp1252,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=cp1252 (West European),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for cp1252 input encoding (regime) for West European languages,
+%D see also iso-8859-1 and iso-8859-15.
+%D
+%D (Contributors to the original file: Tobias Burnus, Hans Hagen \& Victor Figurnov.)
+%D
+%D Usage:
+%D \type{\enableregime[cp1252]} or \type{\enablereregime[windows-1252]}
+%D % and \enableregime[win] for backward-compatibility
+
+
+\startregime[cp1252]
+
+\defineactivetoken 128 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 129 {\unknownchar} % <undefined>
+\defineactivetoken 130 {\quotesinglebase} % 201A SINGLE LOW-9 QUOTATION MARK
+\defineactivetoken 131 {\fhook} % 0192 LATIN SMALL LETTER F WITH HOOK
+\defineactivetoken 132 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 133 {\textellipsis} % 2026 HORIZONTAL ELLIPSIS
+\defineactivetoken 134 {\textdag} % 2020 DAGGER
+\defineactivetoken 135 {\textddag} % 2021 DOUBLE DAGGER
+\defineactivetoken 136 {\textcircumflex} % 02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+\defineactivetoken 137 {\perthousand} % 2030 PER MILLE SIGN
+\defineactivetoken 138 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 139 {\guilsingleleft} % 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 140 {\OEligature} % 0152 LATIN CAPITAL LIGATURE OE
+\defineactivetoken 141 {\unknownchar} % <undefined>
+\defineactivetoken 142 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 143 {\unknownchar} % <undefined>
+\defineactivetoken 144 {\unknownchar} % <undefined>
+\defineactivetoken 145 {\quoteleft} % 2018 LEFT SINGLE QUOTATION MARK
+\defineactivetoken 146 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+\defineactivetoken 147 {\quotedblleft} % 201C LEFT DOUBLE QUOTATION MARK
+\defineactivetoken 148 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 149 {\textbullet} % 2022 BULLET
+\defineactivetoken 150 {\endash} % 2013 EN DASH
+\defineactivetoken 151 {\emdash} % 2014 EM DASH
+\defineactivetoken 152 {\texttilde} % 02DC SMALL TILDE
+\defineactivetoken 153 {\trademark} % 2122 TRADE MARK SIGN
+\defineactivetoken 154 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 155 {\guilsingleright} % 203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 156 {\oeligature} % 0153 LATIN SMALL LIGATURE OE
+\defineactivetoken 157 {\unknownchar} % <undefined>
+\defineactivetoken 158 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 159 {\Ydiaeresis} % 0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\exclamdown} % 00A1 INVERTED EXCLAMATION MARK
+\defineactivetoken 162 {\textcent} % 00A2 CENT SIGN
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\textyen} % 00A5 YEN SIGN
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\ordfeminine} % 00AA FEMININE ORDINAL INDICATOR
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\textmacron} % 00AF MACRON
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\onesuperior} % 00B9 SUPERSCRIPT ONE
+\defineactivetoken 186 {\ordmasculine} % 00BA MASCULINE ORDINAL INDICATOR
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\onequarter} % 00BC VULGAR FRACTION ONE QUARTER
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\threequarter} % 00BE VULGAR FRACTION THREE QUARTERS
+\defineactivetoken 191 {\questiondown} % 00BF INVERTED QUESTION MARK
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 208 {\Eth} % 00D0 LATIN CAPITAL LETTER ETH
+\defineactivetoken 209 {\Ntilde} % 00D1 LATIN CAPITAL LETTER N WITH TILDE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Yacute} % 00DD LATIN CAPITAL LETTER Y WITH ACUTE
+\defineactivetoken 222 {\Thorn} % 00DE LATIN CAPITAL LETTER THORN
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 240 {\eth} % 00F0 LATIN SMALL LETTER ETH
+\defineactivetoken 241 {\ntilde} % 00F1 LATIN SMALL LETTER N WITH TILDE
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\yacute} % 00FD LATIN SMALL LETTER Y WITH ACUTE
+\defineactivetoken 254 {\thorn} % 00FE LATIN SMALL LETTER THORN
+\defineactivetoken 255 {\ydiaeresis} % 00FF LATIN SMALL LETTER Y WITH DIAERESIS
+
+\stopregime
+
diff --git a/tex/context/base/regi-cp1253.lua b/tex/context/base/regi-cp1253.lua
new file mode 100644
index 000000000..f14a186bb
--- /dev/null
+++ b/tex/context/base/regi-cp1253.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1253'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1253"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
+}
diff --git a/tex/context/base/regi-cp1253.mkii b/tex/context/base/regi-cp1253.mkii
new file mode 100644
index 000000000..24ec45eac
--- /dev/null
+++ b/tex/context/base/regi-cp1253.mkii
@@ -0,0 +1,153 @@
+%D \module
+%D [ file=regi-cp1253,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=cp1253 (Greek),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for cp1253 input encoding (regime) for Greek,
+%D see also iso-8859-7.
+%D
+%D Usage:
+%D \type{\enableregime[cp1253]} or \type{\enablereregime[windows-1253]}
+
+
+\startregime[cp1253]
+
+\defineactivetoken 128 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 129 {\unknownchar} % <undefined>
+\defineactivetoken 130 {\quotesinglebase} % 201A SINGLE LOW-9 QUOTATION MARK
+\defineactivetoken 131 {\fhook} % 0192 LATIN SMALL LETTER F WITH HOOK
+\defineactivetoken 132 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 133 {\textellipsis} % 2026 HORIZONTAL ELLIPSIS
+\defineactivetoken 134 {\textdag} % 2020 DAGGER
+\defineactivetoken 135 {\textddag} % 2021 DOUBLE DAGGER
+\defineactivetoken 136 {\unknownchar} % <undefined>
+\defineactivetoken 137 {\perthousand} % 2030 PER MILLE SIGN
+\defineactivetoken 138 {\unknownchar} % <undefined>
+\defineactivetoken 139 {\guilsingleleft} % 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 140 {\unknownchar} % <undefined>
+\defineactivetoken 141 {\unknownchar} % <undefined>
+\defineactivetoken 142 {\unknownchar} % <undefined>
+\defineactivetoken 143 {\unknownchar} % <undefined>
+\defineactivetoken 144 {\unknownchar} % <undefined>
+\defineactivetoken 145 {\quoteleft} % 2018 LEFT SINGLE QUOTATION MARK
+\defineactivetoken 146 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+\defineactivetoken 147 {\quotedblleft} % 201C LEFT DOUBLE QUOTATION MARK
+\defineactivetoken 148 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 149 {\textbullet} % 2022 BULLET
+\defineactivetoken 150 {\endash} % 2013 EN DASH
+\defineactivetoken 151 {\emdash} % 2014 EM DASH
+\defineactivetoken 152 {\unknownchar} % <undefined>
+\defineactivetoken 153 {\trademark} % 2122 TRADE MARK SIGN
+\defineactivetoken 154 {\unknownchar} % <undefined>
+\defineactivetoken 155 {\guilsingleright} % 203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 156 {\unknownchar} % <undefined>
+\defineactivetoken 157 {\unknownchar} % <undefined>
+\defineactivetoken 158 {\unknownchar} % <undefined>
+\defineactivetoken 159 {\unknownchar} % <undefined>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\greekdialytikatonos} % 0385 GREEK DIALYTIKA TONOS
+\defineactivetoken 162 {\greekAlphatonos} % 0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\textyen} % 00A5 YEN SIGN
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\unknownchar} % <undefined>
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\texthorizontalbar} % 2015 HORIZONTAL BAR
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\greektonos} % 0384 GREEK TONOS
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\greekEpsilontonos} % 0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+\defineactivetoken 185 {\greekEtatonos} % 0389 GREEK CAPITAL LETTER ETA WITH TONOS
+\defineactivetoken 186 {\greekIotatonos} % 038A GREEK CAPITAL LETTER IOTA WITH TONOS
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\greekOmicrontonos} % 038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\greekUpsilontonos} % 038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+\defineactivetoken 191 {\greekOmegatonos} % 038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+\defineactivetoken 192 {\greekiotadialytikatonos} % 0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+\defineactivetoken 193 {\greekAlpha} % 0391 GREEK CAPITAL LETTER ALPHA
+\defineactivetoken 194 {\greekBeta} % 0392 GREEK CAPITAL LETTER BETA
+\defineactivetoken 195 {\greekGamma} % 0393 GREEK CAPITAL LETTER GAMMA
+\defineactivetoken 196 {\greekDelta} % 0394 GREEK CAPITAL LETTER DELTA
+\defineactivetoken 197 {\greekEpsilon} % 0395 GREEK CAPITAL LETTER EPSILON
+\defineactivetoken 198 {\greekZeta} % 0396 GREEK CAPITAL LETTER ZETA
+\defineactivetoken 199 {\greekEta} % 0397 GREEK CAPITAL LETTER ETA
+\defineactivetoken 200 {\greekTheta} % 0398 GREEK CAPITAL LETTER THETA
+\defineactivetoken 201 {\greekIota} % 0399 GREEK CAPITAL LETTER IOTA
+\defineactivetoken 202 {\greekKappa} % 039A GREEK CAPITAL LETTER KAPPA
+\defineactivetoken 203 {\greekLambda} % 039B GREEK CAPITAL LETTER LAMDA
+\defineactivetoken 204 {\greekMu} % 039C GREEK CAPITAL LETTER MU
+\defineactivetoken 205 {\greekNu} % 039D GREEK CAPITAL LETTER NU
+\defineactivetoken 206 {\greekXi} % 039E GREEK CAPITAL LETTER XI
+\defineactivetoken 207 {\greekOmicron} % 039F GREEK CAPITAL LETTER OMICRON
+\defineactivetoken 208 {\greekPi} % 03A0 GREEK CAPITAL LETTER PI
+\defineactivetoken 209 {\greekRho} % 03A1 GREEK CAPITAL LETTER RHO
+\defineactivetoken 210 {\unknownchar} % <undefined>
+\defineactivetoken 211 {\greekSigma} % 03A3 GREEK CAPITAL LETTER SIGMA
+\defineactivetoken 212 {\greekTau} % 03A4 GREEK CAPITAL LETTER TAU
+\defineactivetoken 213 {\greekUpsilon} % 03A5 GREEK CAPITAL LETTER UPSILON
+\defineactivetoken 214 {\greekPhi} % 03A6 GREEK CAPITAL LETTER PHI
+\defineactivetoken 215 {\greekChi} % 03A7 GREEK CAPITAL LETTER CHI
+\defineactivetoken 216 {\greekPsi} % 03A8 GREEK CAPITAL LETTER PSI
+\defineactivetoken 217 {\greekOmega} % 03A9 GREEK CAPITAL LETTER OMEGA
+\defineactivetoken 218 {\greekIotadialytika} % 03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+\defineactivetoken 219 {\greekUpsilondialytika} % 03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+\defineactivetoken 220 {\greekalphatonos} % 03AC GREEK SMALL LETTER ALPHA WITH TONOS
+\defineactivetoken 221 {\greekepsilontonos} % 03AD GREEK SMALL LETTER EPSILON WITH TONOS
+\defineactivetoken 222 {\greeketatonos} % 03AE GREEK SMALL LETTER ETA WITH TONOS
+\defineactivetoken 223 {\greekiotatonos} % 03AF GREEK SMALL LETTER IOTA WITH TONOS
+\defineactivetoken 224 {\greekupsilondialytikatonos} % 03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+\defineactivetoken 225 {\greekalpha} % 03B1 GREEK SMALL LETTER ALPHA
+\defineactivetoken 226 {\greekbeta} % 03B2 GREEK SMALL LETTER BETA
+\defineactivetoken 227 {\greekgamma} % 03B3 GREEK SMALL LETTER GAMMA
+\defineactivetoken 228 {\greekdelta} % 03B4 GREEK SMALL LETTER DELTA
+\defineactivetoken 229 {\greekepsilon} % 03B5 GREEK SMALL LETTER EPSILON
+\defineactivetoken 230 {\greekzeta} % 03B6 GREEK SMALL LETTER ZETA
+\defineactivetoken 231 {\greeketa} % 03B7 GREEK SMALL LETTER ETA
+\defineactivetoken 232 {\greektheta} % 03B8 GREEK SMALL LETTER THETA
+\defineactivetoken 233 {\greekiota} % 03B9 GREEK SMALL LETTER IOTA
+\defineactivetoken 234 {\greekkappa} % 03BA GREEK SMALL LETTER KAPPA
+\defineactivetoken 235 {\greeklambda} % 03BB GREEK SMALL LETTER LAMDA
+\defineactivetoken 236 {\greekmu} % 03BC GREEK SMALL LETTER MU
+\defineactivetoken 237 {\greeknu} % 03BD GREEK SMALL LETTER NU
+\defineactivetoken 238 {\greekxi} % 03BE GREEK SMALL LETTER XI
+\defineactivetoken 239 {\greekomicron} % 03BF GREEK SMALL LETTER OMICRON
+\defineactivetoken 240 {\greekpi} % 03C0 GREEK SMALL LETTER PI
+\defineactivetoken 241 {\greekrho} % 03C1 GREEK SMALL LETTER RHO
+\defineactivetoken 242 {\greekfinalsigma} % 03C2 GREEK SMALL LETTER FINAL SIGMA
+\defineactivetoken 243 {\greeksigma} % 03C3 GREEK SMALL LETTER SIGMA
+\defineactivetoken 244 {\greektau} % 03C4 GREEK SMALL LETTER TAU
+\defineactivetoken 245 {\greekupsilon} % 03C5 GREEK SMALL LETTER UPSILON
+\defineactivetoken 246 {\greekphi} % 03C6 GREEK SMALL LETTER PHI
+\defineactivetoken 247 {\greekchi} % 03C7 GREEK SMALL LETTER CHI
+\defineactivetoken 248 {\greekpsi} % 03C8 GREEK SMALL LETTER PSI
+\defineactivetoken 249 {\greekomega} % 03C9 GREEK SMALL LETTER OMEGA
+\defineactivetoken 250 {\greekiotadialytika} % 03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+\defineactivetoken 251 {\greekupsilondiaeresis} % 03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+\defineactivetoken 252 {\greekomicrontonos} % 03CC GREEK SMALL LETTER OMICRON WITH TONOS
+\defineactivetoken 253 {\greekupsilontonos} % 03CD GREEK SMALL LETTER UPSILON WITH TONOS
+\defineactivetoken 254 {\greekomegatonos} % 03CE GREEK SMALL LETTER OMEGA WITH TONOS
+\defineactivetoken 255 {\unknownchar} % <undefined>
+
+\stopregime
+
diff --git a/tex/context/base/regi-cp1254.lua b/tex/context/base/regi-cp1254.lua
new file mode 100644
index 000000000..76fbe9c49
--- /dev/null
+++ b/tex/context/base/regi-cp1254.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1254'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1254"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
+}
diff --git a/tex/context/base/regi-cp1254.mkii b/tex/context/base/regi-cp1254.mkii
new file mode 100644
index 000000000..4dd509b9d
--- /dev/null
+++ b/tex/context/base/regi-cp1254.mkii
@@ -0,0 +1,153 @@
+%D \module
+%D [ file=regi-cp1254,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=cp1254 (Turkish),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for cp1254 input encoding (regime) for Turkish,
+%D see also iso-8859-9.
+%D
+%D Usage:
+%D \type{\enableregime[cp1254]} or \type{\enablereregime[windows-1254]}
+
+
+\startregime[cp1254]
+
+\defineactivetoken 128 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 129 {\unknownchar} % <undefined>
+\defineactivetoken 130 {\quotesinglebase} % 201A SINGLE LOW-9 QUOTATION MARK
+\defineactivetoken 131 {\fhook} % 0192 LATIN SMALL LETTER F WITH HOOK
+\defineactivetoken 132 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 133 {\textellipsis} % 2026 HORIZONTAL ELLIPSIS
+\defineactivetoken 134 {\textdag} % 2020 DAGGER
+\defineactivetoken 135 {\textddag} % 2021 DOUBLE DAGGER
+\defineactivetoken 136 {\textcircumflex} % 02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+\defineactivetoken 137 {\perthousand} % 2030 PER MILLE SIGN
+\defineactivetoken 138 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 139 {\guilsingleleft} % 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 140 {\OEligature} % 0152 LATIN CAPITAL LIGATURE OE
+\defineactivetoken 141 {\unknownchar} % <undefined>
+\defineactivetoken 142 {\unknownchar} % <undefined>
+\defineactivetoken 143 {\unknownchar} % <undefined>
+\defineactivetoken 144 {\unknownchar} % <undefined>
+\defineactivetoken 145 {\quoteleft} % 2018 LEFT SINGLE QUOTATION MARK
+\defineactivetoken 146 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+\defineactivetoken 147 {\quotedblleft} % 201C LEFT DOUBLE QUOTATION MARK
+\defineactivetoken 148 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 149 {\textbullet} % 2022 BULLET
+\defineactivetoken 150 {\endash} % 2013 EN DASH
+\defineactivetoken 151 {\emdash} % 2014 EM DASH
+\defineactivetoken 152 {\texttilde} % 02DC SMALL TILDE
+\defineactivetoken 153 {\trademark} % 2122 TRADE MARK SIGN
+\defineactivetoken 154 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 155 {\guilsingleright} % 203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 156 {\oeligature} % 0153 LATIN SMALL LIGATURE OE
+\defineactivetoken 157 {\unknownchar} % <undefined>
+\defineactivetoken 158 {\unknownchar} % <undefined>
+\defineactivetoken 159 {\Ydiaeresis} % 0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\exclamdown} % 00A1 INVERTED EXCLAMATION MARK
+\defineactivetoken 162 {\textcent} % 00A2 CENT SIGN
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\textyen} % 00A5 YEN SIGN
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\ordfeminine} % 00AA FEMININE ORDINAL INDICATOR
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\textmacron} % 00AF MACRON
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 185 {\onesuperior} % 00B9 SUPERSCRIPT ONE
+\defineactivetoken 186 {\ordmasculine} % 00BA MASCULINE ORDINAL INDICATOR
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\onequarter} % 00BC VULGAR FRACTION ONE QUARTER
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\threequarter} % 00BE VULGAR FRACTION THREE QUARTERS
+\defineactivetoken 191 {\questiondown} % 00BF INVERTED QUESTION MARK
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 199 {\Ccedilla} % 00C7 LATIN CAPITAL LETTER C WITH CEDILLA
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ediaeresis} % 00CB LATIN CAPITAL LETTER E WITH DIAERESIS
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Icircumflex} % 00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 207 {\Idiaeresis} % 00CF LATIN CAPITAL LETTER I WITH DIAERESIS
+\defineactivetoken 208 {\Gbreve} % 011E LATIN CAPITAL LETTER G WITH BREVE
+\defineactivetoken 209 {\Ntilde} % 00D1 LATIN CAPITAL LETTER N WITH TILDE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\Ucircumflex} % 00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Idotaccent} % 0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
+\defineactivetoken 222 {\Scedilla} % 015E LATIN CAPITAL LETTER S WITH CEDILLA
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 231 {\ccedilla} % 00E7 LATIN SMALL LETTER C WITH CEDILLA
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ediaeresis} % 00EB LATIN SMALL LETTER E WITH DIAERESIS
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\icircumflex} % 00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
+\defineactivetoken 239 {\idiaeresis} % 00EF LATIN SMALL LETTER I WITH DIAERESIS
+\defineactivetoken 240 {\gbreve} % 011F LATIN SMALL LETTER G WITH BREVE
+\defineactivetoken 241 {\ntilde} % 00F1 LATIN SMALL LETTER N WITH TILDE
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\ucircumflex} % 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\dotlessi} % 0131 LATIN SMALL LETTER DOTLESS I
+\defineactivetoken 254 {\scedilla} % 015F LATIN SMALL LETTER S WITH CEDILLA
+\defineactivetoken 255 {\ydiaeresis} % 00FF LATIN SMALL LETTER Y WITH DIAERESIS
+
+\stopregime
+
diff --git a/tex/context/base/regi-cp1255.lua b/tex/context/base/regi-cp1255.lua
new file mode 100644
index 000000000..9ea807fbd
--- /dev/null
+++ b/tex/context/base/regi-cp1255.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1255'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1255"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
+ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
+}
diff --git a/tex/context/base/regi-cp1256.lua b/tex/context/base/regi-cp1256.lua
new file mode 100644
index 000000000..e77525bcf
--- /dev/null
+++ b/tex/context/base/regi-cp1256.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1256'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1256"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+ 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
+ 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
+ 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
+ 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2
+}
diff --git a/tex/context/base/regi-cp1257.lua b/tex/context/base/regi-cp1257.lua
new file mode 100644
index 000000000..1b5d53379
--- /dev/null
+++ b/tex/context/base/regi-cp1257.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1257'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1257"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9
+}
diff --git a/tex/context/base/regi-cp1257.mkii b/tex/context/base/regi-cp1257.mkii
new file mode 100644
index 000000000..0790ef734
--- /dev/null
+++ b/tex/context/base/regi-cp1257.mkii
@@ -0,0 +1,153 @@
+%D \module
+%D [ file=regi-cp1257,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=cp1257 (Windows Baltic),
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for cp1257 input encoding (regime) for Baltic languages,
+%D see also iso-8859-4 and iso-8859-13.
+%D
+%D Usage:
+%D \type{\enableregime[cp1257]} or \type{\enablereregime[windows-1257]}
+
+
+\startregime[cp1257]
+
+\defineactivetoken 128 {\texteuro} % 20AC EURO SIGN
+\defineactivetoken 129 {\unknownchar} % <undefined>
+\defineactivetoken 130 {\quotesinglebase} % 201A SINGLE LOW-9 QUOTATION MARK
+\defineactivetoken 131 {\unknownchar} % <undefined>
+\defineactivetoken 132 {\quotedblbase} % 201E DOUBLE LOW-9 QUOTATION MARK
+\defineactivetoken 133 {\textellipsis} % 2026 HORIZONTAL ELLIPSIS
+\defineactivetoken 134 {\textdag} % 2020 DAGGER
+\defineactivetoken 135 {\textddag} % 2021 DOUBLE DAGGER
+\defineactivetoken 136 {\unknownchar} % <undefined>
+\defineactivetoken 137 {\perthousand} % 2030 PER MILLE SIGN
+\defineactivetoken 138 {\unknownchar} % <undefined>
+\defineactivetoken 139 {\guilsingleleft} % 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 140 {\unknownchar} % <undefined>
+\defineactivetoken 141 {\textdiaeresis} % 00A8 DIAERESIS
+\defineactivetoken 142 {\textcaron} % 02C7 CARON
+\defineactivetoken 143 {\textcedilla} % 00B8 CEDILLA
+\defineactivetoken 144 {\unknownchar} % <undefined>
+\defineactivetoken 145 {\quoteleft} % 2018 LEFT SINGLE QUOTATION MARK
+\defineactivetoken 146 {\quoteright} % 2019 RIGHT SINGLE QUOTATION MARK
+\defineactivetoken 147 {\quotedblleft} % 201C LEFT DOUBLE QUOTATION MARK
+\defineactivetoken 148 {\quotedblright} % 201D RIGHT DOUBLE QUOTATION MARK
+\defineactivetoken 149 {\textbullet} % 2022 BULLET
+\defineactivetoken 150 {\endash} % 2013 EN DASH
+\defineactivetoken 151 {\emdash} % 2014 EM DASH
+\defineactivetoken 152 {\unknownchar} % <undefined>
+\defineactivetoken 153 {\trademark} % 2122 TRADE MARK SIGN
+\defineactivetoken 154 {\unknownchar} % <undefined>
+\defineactivetoken 155 {\guilsingleright} % 203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+\defineactivetoken 156 {\unknownchar} % <undefined>
+\defineactivetoken 157 {\textmacron} % 00AF MACRON
+\defineactivetoken 158 {\textogonek} % 02DB OGONEK
+\defineactivetoken 159 {\unknownchar} % <undefined>
+\defineactivetoken 160 {\nonbreakablespace} % 00A0 NO-BREAK SPACE
+\defineactivetoken 161 {\unknownchar} % <undefined>
+\defineactivetoken 162 {\textcent} % 00A2 CENT SIGN
+\defineactivetoken 163 {\textsterling} % 00A3 POUND SIGN
+\defineactivetoken 164 {\textcurrency} % 00A4 CURRENCY SIGN
+\defineactivetoken 165 {\unknownchar} % <undefined>
+\defineactivetoken 166 {\textbrokenbar} % 00A6 BROKEN BAR
+\defineactivetoken 167 {\sectionmark} % 00A7 SECTION SIGN
+\defineactivetoken 168 {\Ostroke} % 00D8 LATIN CAPITAL LETTER O WITH STROKE
+\defineactivetoken 169 {\copyright} % 00A9 COPYRIGHT SIGN
+\defineactivetoken 170 {\Rcommaaccent} % 0156 LATIN CAPITAL LETTER R WITH CEDILLA
+\defineactivetoken 171 {\leftguillemot} % 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 172 {\textlognot} % 00AC NOT SIGN
+\defineactivetoken 173 {\softhyphen} % 00AD SOFT HYPHEN
+\defineactivetoken 174 {\registered} % 00AE REGISTERED SIGN
+\defineactivetoken 175 {\AEligature} % 00C6 LATIN CAPITAL LETTER AE
+\defineactivetoken 176 {\textdegree} % 00B0 DEGREE SIGN
+\defineactivetoken 177 {\textpm} % 00B1 PLUS-MINUS SIGN
+\defineactivetoken 178 {\twosuperior} % 00B2 SUPERSCRIPT TWO
+\defineactivetoken 179 {\threesuperior} % 00B3 SUPERSCRIPT THREE
+\defineactivetoken 180 {\textacute} % 00B4 ACUTE ACCENT
+\defineactivetoken 181 {\textmu} % 00B5 MICRO SIGN
+\defineactivetoken 182 {\paragraphmark} % 00B6 PILCROW SIGN
+\defineactivetoken 183 {\periodcentered} % 00B7 MIDDLE DOT
+\defineactivetoken 184 {\ostroke} % 00F8 LATIN SMALL LETTER O WITH STROKE
+\defineactivetoken 185 {\onesuperior} % 00B9 SUPERSCRIPT ONE
+\defineactivetoken 186 {\rcommaaccent} % 0157 LATIN SMALL LETTER R WITH CEDILLA
+\defineactivetoken 187 {\rightguillemot} % 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+\defineactivetoken 188 {\onequarter} % 00BC VULGAR FRACTION ONE QUARTER
+\defineactivetoken 189 {\onehalf} % 00BD VULGAR FRACTION ONE HALF
+\defineactivetoken 190 {\threequarter} % 00BE VULGAR FRACTION THREE QUARTERS
+\defineactivetoken 191 {\aeligature} % 00E6 LATIN SMALL LETTER AE
+\defineactivetoken 192 {\Aogonek} % 0104 LATIN CAPITAL LETTER A WITH OGONEK
+\defineactivetoken 193 {\Iogonek} % 012E LATIN CAPITAL LETTER I WITH OGONEK
+\defineactivetoken 194 {\Amacron} % 0100 LATIN CAPITAL LETTER A WITH MACRON
+\defineactivetoken 195 {\Cacute} % 0106 LATIN CAPITAL LETTER C WITH ACUTE
+\defineactivetoken 196 {\Adiaeresis} % 00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
+\defineactivetoken 197 {\Aring} % 00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
+\defineactivetoken 198 {\Eogonek} % 0118 LATIN CAPITAL LETTER E WITH OGONEK
+\defineactivetoken 199 {\Emacron} % 0112 LATIN CAPITAL LETTER E WITH MACRON
+\defineactivetoken 200 {\Ccaron} % 010C LATIN CAPITAL LETTER C WITH CARON
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Zacute} % 0179 LATIN CAPITAL LETTER Z WITH ACUTE
+\defineactivetoken 203 {\Edotaccent} % 0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
+\defineactivetoken 204 {\Gcommaaccent} % 0122 LATIN CAPITAL LETTER G WITH CEDILLA
+\defineactivetoken 205 {\Kcommaaccent} % 0136 LATIN CAPITAL LETTER K WITH CEDILLA
+\defineactivetoken 206 {\Imacron} % 012A LATIN CAPITAL LETTER I WITH MACRON
+\defineactivetoken 207 {\Lcommaaccent} % 013B LATIN CAPITAL LETTER L WITH CEDILLA
+\defineactivetoken 208 {\Scaron} % 0160 LATIN CAPITAL LETTER S WITH CARON
+\defineactivetoken 209 {\Nacute} % 0143 LATIN CAPITAL LETTER N WITH ACUTE
+\defineactivetoken 210 {\Ncommaaccent} % 0145 LATIN CAPITAL LETTER N WITH CEDILLA
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Omacron} % 014C LATIN CAPITAL LETTER O WITH MACRON
+\defineactivetoken 213 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 214 {\Odiaeresis} % 00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
+\defineactivetoken 215 {\textmultiply} % 00D7 MULTIPLICATION SIGN
+\defineactivetoken 216 {\Uogonek} % 0172 LATIN CAPITAL LETTER U WITH OGONEK
+\defineactivetoken 217 {\Lstroke} % 0141 LATIN CAPITAL LETTER L WITH STROKE
+\defineactivetoken 218 {\Sacute} % 015A LATIN CAPITAL LETTER S WITH ACUTE
+\defineactivetoken 219 {\Umacron} % 016A LATIN CAPITAL LETTER U WITH MACRON
+\defineactivetoken 220 {\Udiaeresis} % 00DC LATIN CAPITAL LETTER U WITH DIAERESIS
+\defineactivetoken 221 {\Zdotaccent} % 017B LATIN CAPITAL LETTER Z WITH DOT ABOVE
+\defineactivetoken 222 {\Zcaron} % 017D LATIN CAPITAL LETTER Z WITH CARON
+\defineactivetoken 223 {\ssharp} % 00DF LATIN SMALL LETTER SHARP S
+\defineactivetoken 224 {\aogonek} % 0105 LATIN SMALL LETTER A WITH OGONEK
+\defineactivetoken 225 {\iogonek} % 012F LATIN SMALL LETTER I WITH OGONEK
+\defineactivetoken 226 {\amacron} % 0101 LATIN SMALL LETTER A WITH MACRON
+\defineactivetoken 227 {\cacute} % 0107 LATIN SMALL LETTER C WITH ACUTE
+\defineactivetoken 228 {\adiaeresis} % 00E4 LATIN SMALL LETTER A WITH DIAERESIS
+\defineactivetoken 229 {\aring} % 00E5 LATIN SMALL LETTER A WITH RING ABOVE
+\defineactivetoken 230 {\eogonek} % 0119 LATIN SMALL LETTER E WITH OGONEK
+\defineactivetoken 231 {\emacron} % 0113 LATIN SMALL LETTER E WITH MACRON
+\defineactivetoken 232 {\ccaron} % 010D LATIN SMALL LETTER C WITH CARON
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\zacute} % 017A LATIN SMALL LETTER Z WITH ACUTE
+\defineactivetoken 235 {\edotaccent} % 0117 LATIN SMALL LETTER E WITH DOT ABOVE
+\defineactivetoken 236 {\gcommaaccent} % 0123 LATIN SMALL LETTER G WITH CEDILLA
+\defineactivetoken 237 {\kcommaaccent} % 0137 LATIN SMALL LETTER K WITH CEDILLA
+\defineactivetoken 238 {\imacron} % 012B LATIN SMALL LETTER I WITH MACRON
+\defineactivetoken 239 {\lcommaaccent} % 013C LATIN SMALL LETTER L WITH CEDILLA
+\defineactivetoken 240 {\scaron} % 0161 LATIN SMALL LETTER S WITH CARON
+\defineactivetoken 241 {\nacute} % 0144 LATIN SMALL LETTER N WITH ACUTE
+\defineactivetoken 242 {\ncommaaccent} % 0146 LATIN SMALL LETTER N WITH CEDILLA
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\omacron} % 014D LATIN SMALL LETTER O WITH MACRON
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\odiaeresis} % 00F6 LATIN SMALL LETTER O WITH DIAERESIS
+\defineactivetoken 247 {\textdiv} % 00F7 DIVISION SIGN
+\defineactivetoken 248 {\uogonek} % 0173 LATIN SMALL LETTER U WITH OGONEK
+\defineactivetoken 249 {\lstroke} % 0142 LATIN SMALL LETTER L WITH STROKE
+\defineactivetoken 250 {\sacute} % 015B LATIN SMALL LETTER S WITH ACUTE
+\defineactivetoken 251 {\umacron} % 016B LATIN SMALL LETTER U WITH MACRON
+\defineactivetoken 252 {\udiaeresis} % 00FC LATIN SMALL LETTER U WITH DIAERESIS
+\defineactivetoken 253 {\zdotaccent} % 017C LATIN SMALL LETTER Z WITH DOT ABOVE
+\defineactivetoken 254 {\zcaron} % 017E LATIN SMALL LETTER Z WITH CARON
+\defineactivetoken 255 {\textdotaccent} % 02D9 DOT ABOVE
+
+\stopregime
+
diff --git a/tex/context/base/regi-cp1258.lua b/tex/context/base/regi-cp1258.lua
new file mode 100644
index 000000000..271db3009
--- /dev/null
+++ b/tex/context/base/regi-cp1258.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['regi-cp1258'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+regimes.data["cp1258"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
+ 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
+ 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF
+}
diff --git a/tex/context/base/regi-cyp.mkii b/tex/context/base/regi-cyp.mkii
new file mode 100644
index 000000000..7d134df50
--- /dev/null
+++ b/tex/context/base/regi-cyp.mkii
@@ -0,0 +1,1169 @@
+%D \module
+%D [ file=regi-cyp,
+%D version=2003.01.24,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Cyrillic Plus,
+%D author=...,
+%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 In this file several rarely user cyrillic input regimes
+%D are defined.
+
+\startregime[cp855]
+
+\defineactivetoken 128 {\cyrillicdje}
+\defineactivetoken 129 {\cyrillicDJE}
+\defineactivetoken 130 {\'\cyrillicg}
+\defineactivetoken 131 {\'\cyrillicG}
+\defineactivetoken 132 {\cyrillicyo}
+\defineactivetoken 133 {\cyrillicYO}
+\defineactivetoken 134 {\cyrillicie}
+\defineactivetoken 135 {\cyrillicIE}
+\defineactivetoken 136 {\cyrillicdze}
+\defineactivetoken 137 {\cyrillicDZE}
+\defineactivetoken 138 {\cyrillicii}
+\defineactivetoken 139 {\cyrillicII}
+\defineactivetoken 140 {\cyrillicyi}
+\defineactivetoken 141 {\cyrillicYI}
+\defineactivetoken 142 {\cyrillicje}
+\defineactivetoken 143 {\cyrillicJE}
+\defineactivetoken 144 {\cyrilliclje}
+\defineactivetoken 145 {\cyrillicLJE}
+\defineactivetoken 146 {\cyrillicnje}
+\defineactivetoken 147 {\cyrillicNJE}
+\defineactivetoken 148 {\cyrillictshe}
+\defineactivetoken 149 {\cyrillicTSHE}
+\defineactivetoken 150 {\'\cyrillick}
+\defineactivetoken 151 {\'\cyrillicK}
+\defineactivetoken 152 {\cyrillicushrt}
+\defineactivetoken 153 {\cyrillicUSHRT}
+\defineactivetoken 154 {\cyrillicdzhe}
+\defineactivetoken 155 {\cyrillicDZHE}
+\defineactivetoken 156 {\cyrillicyu}
+\defineactivetoken 157 {\cyrillicYU}
+\defineactivetoken 158 {\cyrillichrdsn}
+\defineactivetoken 159 {\cyrillicHRDSN}
+\defineactivetoken 160 {\cyrillica}
+\defineactivetoken 161 {\cyrillicA}
+\defineactivetoken 162 {\cyrillicb}
+\defineactivetoken 163 {\cyrillicB}
+\defineactivetoken 164 {\cyrillicc}
+\defineactivetoken 165 {\cyrillicC}
+\defineactivetoken 166 {\cyrillicd}
+\defineactivetoken 167 {\cyrillicD}
+\defineactivetoken 168 {\cyrillice}
+\defineactivetoken 169 {\cyrillicE}
+\defineactivetoken 170 {\cyrillicf}
+\defineactivetoken 171 {\cyrillicF}
+\defineactivetoken 172 {\cyrillicg}
+\defineactivetoken 173 {\cyrillicG}
+\defineactivetoken 174 {\leftguillemot}
+\defineactivetoken 175 {\rightguillemot}
+\defineactivetoken 181 {\cyrillich}
+\defineactivetoken 182 {\cyrillicH}
+\defineactivetoken 183 {\cyrillici}
+\defineactivetoken 184 {\cyrillicI}
+\defineactivetoken 189 {\cyrillicishrt}
+\defineactivetoken 190 {\cyrillicISHRT}
+\defineactivetoken 198 {\cyrillick}
+\defineactivetoken 199 {\cyrillicK}
+\defineactivetoken 207 {\textcurrency}
+\defineactivetoken 208 {\cyrillicl}
+\defineactivetoken 209 {\cyrillicL}
+\defineactivetoken 210 {\cyrillicm}
+\defineactivetoken 211 {\cyrillicM}
+\defineactivetoken 212 {\cyrillicn}
+\defineactivetoken 213 {\cyrillicN}
+\defineactivetoken 214 {\cyrillico}
+\defineactivetoken 215 {\cyrillicO}
+\defineactivetoken 216 {\cyrillicp}
+\defineactivetoken 221 {\cyrillicP}
+\defineactivetoken 222 {\cyrillicya}
+\defineactivetoken 224 {\cyrillicYA}
+\defineactivetoken 225 {\cyrillicr}
+\defineactivetoken 226 {\cyrillicR}
+\defineactivetoken 227 {\cyrillics}
+\defineactivetoken 228 {\cyrillicS}
+\defineactivetoken 229 {\cyrillict}
+\defineactivetoken 230 {\cyrillicT}
+\defineactivetoken 231 {\cyrillicu}
+\defineactivetoken 232 {\cyrillicU}
+\defineactivetoken 233 {\cyrilliczh}
+\defineactivetoken 234 {\cyrillicZH}
+\defineactivetoken 235 {\cyrillicv}
+\defineactivetoken 236 {\cyrillicV}
+\defineactivetoken 237 {\cyrillicsftsn}
+\defineactivetoken 238 {\cyrillicSFTSN}
+\defineactivetoken 239 {\textnumero}
+\defineactivetoken 240 {\-}
+\defineactivetoken 241 {\cyrillicery}
+\defineactivetoken 242 {\cyrillicERY}
+\defineactivetoken 243 {\cyrillicz}
+\defineactivetoken 244 {\cyrillicZ}
+\defineactivetoken 245 {\cyrillicsh}
+\defineactivetoken 246 {\cyrillicSH}
+\defineactivetoken 247 {\cyrillicerev}
+\defineactivetoken 248 {\cyrillicEREV}
+\defineactivetoken 249 {\cyrillicshch}
+\defineactivetoken 250 {\cyrillicSHCH}
+\defineactivetoken 251 {\cyrillicch}
+\defineactivetoken 252 {\cyrillicCH}
+\defineactivetoken 253 {\sectionmark}
+\defineactivetoken 254 {\textblacksquare}
+\defineactivetoken 255 {\nonbreakablespace}
+
+\stopregime
+
+\startregime[cp866av]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\cyrillica}
+\defineactivetoken 161 {\cyrillicb}
+\defineactivetoken 162 {\cyrillicv}
+\defineactivetoken 163 {\cyrillicg}
+\defineactivetoken 164 {\cyrillicd}
+\defineactivetoken 165 {\cyrillice}
+\defineactivetoken 166 {\cyrilliczh}
+\defineactivetoken 167 {\cyrillicz}
+\defineactivetoken 168 {\cyrillici}
+\defineactivetoken 169 {\cyrillicishrt}
+\defineactivetoken 170 {\cyrillick}
+\defineactivetoken 171 {\cyrillicl}
+\defineactivetoken 172 {\cyrillicm}
+\defineactivetoken 173 {\cyrillicn}
+\defineactivetoken 174 {\cyrillico}
+\defineactivetoken 175 {\cyrillicp}
+\defineactivetoken 224 {\cyrillicr}
+\defineactivetoken 225 {\cyrillics}
+\defineactivetoken 226 {\cyrillict}
+\defineactivetoken 227 {\cyrillicu}
+\defineactivetoken 228 {\cyrillicf}
+\defineactivetoken 229 {\cyrillich}
+\defineactivetoken 230 {\cyrillicc}
+\defineactivetoken 231 {\cyrillicch}
+\defineactivetoken 232 {\cyrillicsh}
+\defineactivetoken 233 {\cyrillicshch}
+\defineactivetoken 234 {\cyrillichrdsn}
+\defineactivetoken 235 {\cyrillicery}
+\defineactivetoken 236 {\cyrillicsftsn}
+\defineactivetoken 237 {\cyrillicerev}
+\defineactivetoken 238 {\cyrillicyu}
+\defineactivetoken 239 {\cyrillicya}
+\defineactivetoken 240 {\cyrillicYO}
+\defineactivetoken 241 {\cyrillicyo}
+\defineactivetoken 252 {\textnumero}
+\defineactivetoken 253 {\textcurrency}
+\defineactivetoken 254 {\textblacksquare}
+\defineactivetoken 255 {\nonbreakablespace}
+\defineactivetoken 246 {\mathematics\rightarrow}
+\defineactivetoken 247 {\mathematics\leftarrow}
+\defineactivetoken 248 {\mathematics\downarrow}
+\defineactivetoken 249 {\mathematics\uparrow}
+\defineactivetoken 250 {\textdiv}
+\defineactivetoken 251 {\textpm}
+
+\stopregime
+
+\startregime[cp866mav]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\cyrillica}
+\defineactivetoken 161 {\cyrillicb}
+\defineactivetoken 162 {\cyrillicv}
+\defineactivetoken 163 {\cyrillicg}
+\defineactivetoken 164 {\cyrillicd}
+\defineactivetoken 165 {\cyrillice}
+\defineactivetoken 166 {\cyrilliczh}
+\defineactivetoken 167 {\cyrillicz}
+\defineactivetoken 168 {\cyrillici}
+\defineactivetoken 169 {\cyrillicishrt}
+\defineactivetoken 170 {\cyrillick}
+\defineactivetoken 171 {\cyrillicl}
+\defineactivetoken 172 {\cyrillicm}
+\defineactivetoken 173 {\cyrillicn}
+\defineactivetoken 174 {\cyrillico}
+\defineactivetoken 175 {\cyrillicp}
+\defineactivetoken 224 {\cyrillicr}
+\defineactivetoken 225 {\cyrillics}
+\defineactivetoken 226 {\cyrillict}
+\defineactivetoken 227 {\cyrillicu}
+\defineactivetoken 228 {\cyrillicf}
+\defineactivetoken 229 {\cyrillich}
+\defineactivetoken 230 {\cyrillicc}
+\defineactivetoken 231 {\cyrillicch}
+\defineactivetoken 232 {\cyrillicsh}
+\defineactivetoken 233 {\cyrillicshch}
+\defineactivetoken 234 {\cyrillichrdsn}
+\defineactivetoken 235 {\cyrillicery}
+\defineactivetoken 236 {\cyrillicsftsn}
+\defineactivetoken 237 {\cyrillicerev}
+\defineactivetoken 238 {\cyrillicyu}
+\defineactivetoken 239 {\cyrillicya}
+\defineactivetoken 240 {\cyrillicYO}
+\defineactivetoken 241 {\cyrillicyo}
+\defineactivetoken 248 {\textdegree}
+\defineactivetoken 249 {\textbullet}
+\defineactivetoken 250 {\periodcentered}
+\defineactivetoken 254 {\textblacksquare}
+\defineactivetoken 255 {\nonbreakablespace}
+\defineactivetoken 242 {\mathematics\geq}
+\defineactivetoken 243 {\mathematics\leq}
+\defineactivetoken 246 {\textdiv}
+\defineactivetoken 247 {\mathematics\sim}
+\defineactivetoken 251 {\textsurd}
+\defineactivetoken 252 {\high{\txx n}}
+\defineactivetoken 253 {\twosuperior}
+
+\stopregime
+
+\startregime[cp866tat]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\cyrillica}
+\defineactivetoken 161 {\cyrillicb}
+\defineactivetoken 162 {\cyrillicv}
+\defineactivetoken 163 {\cyrillicg}
+\defineactivetoken 164 {\cyrillicd}
+\defineactivetoken 165 {\cyrillice}
+\defineactivetoken 166 {\cyrilliczh}
+\defineactivetoken 167 {\cyrillicz}
+\defineactivetoken 168 {\cyrillici}
+\defineactivetoken 169 {\cyrillicishrt}
+\defineactivetoken 170 {\cyrillick}
+\defineactivetoken 171 {\cyrillicl}
+\defineactivetoken 172 {\cyrillicm}
+\defineactivetoken 173 {\cyrillicn}
+\defineactivetoken 174 {\cyrillico}
+\defineactivetoken 175 {\cyrillicp}
+\defineactivetoken 224 {\cyrillicr}
+\defineactivetoken 225 {\cyrillics}
+\defineactivetoken 226 {\cyrillict}
+\defineactivetoken 227 {\cyrillicu}
+\defineactivetoken 228 {\cyrillicf}
+\defineactivetoken 229 {\cyrillich}
+\defineactivetoken 230 {\cyrillicc}
+\defineactivetoken 231 {\cyrillicch}
+\defineactivetoken 232 {\cyrillicsh}
+\defineactivetoken 233 {\cyrillicshch}
+\defineactivetoken 234 {\cyrillichrdsn}
+\defineactivetoken 235 {\cyrillicery}
+\defineactivetoken 236 {\cyrillicsftsn}
+\defineactivetoken 237 {\cyrillicerev}
+\defineactivetoken 238 {\cyrillicyu}
+\defineactivetoken 239 {\cyrillicya}
+\defineactivetoken 240 {\cyrillicYO}
+\defineactivetoken 241 {\cyrillicyo}
+\defineactivetoken 242 {\cyrillicSCHWA}
+\defineactivetoken 243 {\cyrillicschwa}
+\defineactivetoken 244 {\cyrillicOTLD}
+\defineactivetoken 245 {\cyrillicotld}
+\defineactivetoken 246 {\cyrillicY}
+\defineactivetoken 247 {\cyrillicy}
+\defineactivetoken 248 {\cyrillicZHDSC}
+\defineactivetoken 249 {\cyrilliczhdsc}
+\defineactivetoken 250 {\cyrillicNDSC}
+\defineactivetoken 251 {\cyrillicndsc}
+\defineactivetoken 252 {\cyrillicSHHA}
+\defineactivetoken 253 {\cyrillicshha}
+\defineactivetoken 254 {\textblacksquare}
+\defineactivetoken 255 {\nonbreakablespace}
+
+\stopregime
+
+\startregime[ctt]
+
+\defineactivetoken 171 {\leftguillemot}
+\defineactivetoken 187 {\rightguillemot}
+\defineactivetoken 192 {\cyrillicA}
+\defineactivetoken 193 {\cyrillicB}
+\defineactivetoken 194 {\cyrillicV}
+\defineactivetoken 195 {\cyrillicG}
+\defineactivetoken 196 {\cyrillicD}
+\defineactivetoken 197 {\cyrillicE}
+\defineactivetoken 168 {\cyrillicYO}
+\defineactivetoken 198 {\cyrillicZH}
+\defineactivetoken 199 {\cyrillicZ}
+\defineactivetoken 200 {\cyrillicI}
+\defineactivetoken 201 {\cyrillicISHRT}
+\defineactivetoken 202 {\cyrillicK}
+\defineactivetoken 203 {\cyrillicL}
+\defineactivetoken 204 {\cyrillicM}
+\defineactivetoken 205 {\cyrillicN}
+\defineactivetoken 206 {\cyrillicO}
+\defineactivetoken 170 {\cyrillicOTLD}
+\defineactivetoken 207 {\cyrillicP}
+\defineactivetoken 208 {\cyrillicR}
+\defineactivetoken 209 {\cyrillicS}
+\defineactivetoken 210 {\cyrillicT}
+\defineactivetoken 211 {\cyrillicU}
+\defineactivetoken 175 {\cyrillicY}
+\defineactivetoken 212 {\cyrillicF}
+\defineactivetoken 213 {\cyrillicH}
+\defineactivetoken 214 {\cyrillicC}
+\defineactivetoken 215 {\cyrillicCH}
+\defineactivetoken 216 {\cyrillicSH}
+\defineactivetoken 217 {\cyrillicSHCH}
+\defineactivetoken 218 {\cyrillicHRDSN}
+\defineactivetoken 219 {\cyrillicERY}
+\defineactivetoken 220 {\cyrillicSFTSN}
+\defineactivetoken 221 {\cyrillicEREV}
+\defineactivetoken 222 {\cyrillicYU}
+\defineactivetoken 223 {\cyrillicYA}
+\defineactivetoken 224 {\cyrillica}
+\defineactivetoken 225 {\cyrillicb}
+\defineactivetoken 226 {\cyrillicv}
+\defineactivetoken 227 {\cyrillicg}
+\defineactivetoken 228 {\cyrillicd}
+\defineactivetoken 229 {\cyrillice}
+\defineactivetoken 184 {\cyrillicyo}
+\defineactivetoken 230 {\cyrilliczh}
+\defineactivetoken 231 {\cyrillicz}
+\defineactivetoken 232 {\cyrillici}
+\defineactivetoken 233 {\cyrillicishrt}
+\defineactivetoken 234 {\cyrillick}
+\defineactivetoken 235 {\cyrillicl}
+\defineactivetoken 236 {\cyrillicm}
+\defineactivetoken 237 {\cyrillicn}
+\defineactivetoken 238 {\cyrillico}
+\defineactivetoken 186 {\cyrillicotld}
+\defineactivetoken 239 {\cyrillicp}
+\defineactivetoken 240 {\cyrillicr}
+\defineactivetoken 241 {\cyrillics}
+\defineactivetoken 242 {\cyrillict}
+\defineactivetoken 243 {\cyrillicu}
+\defineactivetoken 191 {\cyrillicy}
+\defineactivetoken 244 {\cyrillicf}
+\defineactivetoken 245 {\cyrillich}
+\defineactivetoken 246 {\cyrillicc}
+\defineactivetoken 247 {\cyrillicch}
+\defineactivetoken 248 {\cyrillicsh}
+\defineactivetoken 249 {\cyrillicshch}
+\defineactivetoken 250 {\cyrillichrdsn}
+\defineactivetoken 251 {\cyrillicery}
+\defineactivetoken 252 {\cyrillicsftsn}
+\defineactivetoken 253 {\cyrillicerev}
+\defineactivetoken 254 {\cyrillicyu}
+\defineactivetoken 255 {\cyrillicya}
+
+\stopregime
+
+\startregime[dbk]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicYO}
+\defineactivetoken 135 {\cyrillicZH}
+\defineactivetoken 136 {\cyrillicZ}
+\defineactivetoken 137 {\cyrillicI}
+\defineactivetoken 139 {\cyrillicISHRT}
+\defineactivetoken 140 {\cyrillicK}
+\defineactivetoken 142 {\cyrillicL}
+\defineactivetoken 143 {\cyrillicM}
+\defineactivetoken 144 {\cyrillicN}
+\defineactivetoken 145 {\cyrillicO}
+\defineactivetoken 146 {\cyrillicOTLD}
+\defineactivetoken 147 {\cyrillicP}
+\defineactivetoken 148 {\cyrillicR}
+\defineactivetoken 149 {\cyrillicS}
+\defineactivetoken 150 {\cyrillicT}
+\defineactivetoken 151 {\cyrillicU}
+\defineactivetoken 152 {\cyrillicY}
+\defineactivetoken 153 {\cyrillicF}
+\defineactivetoken 154 {\cyrillicH}
+\defineactivetoken 155 {\cyrillicC}
+\defineactivetoken 156 {\cyrillicCH}
+\defineactivetoken 157 {\cyrillicSH}
+\defineactivetoken 158 {\cyrillicSHCH}
+\defineactivetoken 159 {\cyrillicHRDSN}
+\defineactivetoken 160 {\cyrillicERY}
+\defineactivetoken 161 {\cyrillicSFTSN}
+\defineactivetoken 162 {\cyrillicEREV}
+\defineactivetoken 163 {\cyrillicYU}
+\defineactivetoken 164 {\cyrillicYA}
+\defineactivetoken 165 {\cyrillica}
+\defineactivetoken 166 {\cyrillicb}
+\defineactivetoken 167 {\cyrillicv}
+\defineactivetoken 168 {\cyrillicg}
+\defineactivetoken 169 {\cyrillicd}
+\defineactivetoken 170 {\cyrillice}
+\defineactivetoken 171 {\cyrillicyo}
+\defineactivetoken 172 {\cyrilliczh}
+\defineactivetoken 173 {\cyrillicz}
+\defineactivetoken 174 {\cyrillici}
+\defineactivetoken 175 {\cyrillicishrt}
+\defineactivetoken 225 {\cyrillick}
+\defineactivetoken 226 {\cyrillicl}
+\defineactivetoken 227 {\cyrillicm}
+\defineactivetoken 228 {\cyrillicn}
+\defineactivetoken 229 {\cyrillico}
+\defineactivetoken 230 {\cyrillicotld}
+\defineactivetoken 231 {\cyrillicp}
+\defineactivetoken 232 {\cyrillicr}
+\defineactivetoken 233 {\cyrillics}
+\defineactivetoken 234 {\cyrillict}
+\defineactivetoken 235 {\cyrillicu}
+\defineactivetoken 236 {\cyrillicy}
+\defineactivetoken 237 {\cyrillicf}
+\defineactivetoken 238 {\cyrillich}
+\defineactivetoken 239 {\cyrillicc}
+\defineactivetoken 241 {\cyrillicch}
+\defineactivetoken 242 {\cyrillicsh}
+\defineactivetoken 243 {\cyrillicshch}
+\defineactivetoken 244 {\cyrillichrdsn}
+\defineactivetoken 245 {\cyrillicery}
+\defineactivetoken 246 {\cyrillicsftsn}
+\defineactivetoken 247 {\cyrillicerev}
+\defineactivetoken 248 {\cyrillicyu}
+\defineactivetoken 249 {\cyrillicya}
+
+\stopregime
+
+\startregime[iso88595]
+
+\defineactivetoken 160 {\nonbreakablespace}
+\defineactivetoken 161 {\cyrillicYO}
+\defineactivetoken 162 {\cyrillicDJE}
+\defineactivetoken 163 {\'\cyrillicG}
+\defineactivetoken 164 {\cyrillicIE}
+\defineactivetoken 165 {\cyrillicDZE}
+\defineactivetoken 166 {\cyrillicII}
+\defineactivetoken 167 {\cyrillicYI}
+\defineactivetoken 168 {\cyrillicJE}
+\defineactivetoken 169 {\cyrillicLJE}
+\defineactivetoken 170 {\cyrillicNJE}
+\defineactivetoken 171 {\cyrillicTSHE}
+\defineactivetoken 172 {\'\cyrillicK}
+\defineactivetoken 173 {\-}
+\defineactivetoken 174 {\cyrillicUSHRT}
+\defineactivetoken 175 {\cyrillicDZHE}
+\defineactivetoken 176 {\cyrillicA}
+\defineactivetoken 177 {\cyrillicB}
+\defineactivetoken 178 {\cyrillicV}
+\defineactivetoken 179 {\cyrillicG}
+\defineactivetoken 180 {\cyrillicD}
+\defineactivetoken 181 {\cyrillicE}
+\defineactivetoken 182 {\cyrillicZH}
+\defineactivetoken 183 {\cyrillicZ}
+\defineactivetoken 184 {\cyrillicI}
+\defineactivetoken 185 {\cyrillicISHRT}
+\defineactivetoken 186 {\cyrillicK}
+\defineactivetoken 187 {\cyrillicL}
+\defineactivetoken 188 {\cyrillicM}
+\defineactivetoken 189 {\cyrillicN}
+\defineactivetoken 190 {\cyrillicO}
+\defineactivetoken 191 {\cyrillicP}
+\defineactivetoken 192 {\cyrillicR}
+\defineactivetoken 193 {\cyrillicS}
+\defineactivetoken 194 {\cyrillicT}
+\defineactivetoken 195 {\cyrillicU}
+\defineactivetoken 196 {\cyrillicF}
+\defineactivetoken 197 {\cyrillicH}
+\defineactivetoken 198 {\cyrillicC}
+\defineactivetoken 199 {\cyrillicCH}
+\defineactivetoken 200 {\cyrillicSH}
+\defineactivetoken 201 {\cyrillicSHCH}
+\defineactivetoken 202 {\cyrillicHRDSN}
+\defineactivetoken 203 {\cyrillicERY}
+\defineactivetoken 204 {\cyrillicSFTSN}
+\defineactivetoken 205 {\cyrillicEREV}
+\defineactivetoken 206 {\cyrillicYU}
+\defineactivetoken 207 {\cyrillicYA}
+\defineactivetoken 208 {\cyrillica}
+\defineactivetoken 209 {\cyrillicb}
+\defineactivetoken 210 {\cyrillicv}
+\defineactivetoken 211 {\cyrillicg}
+\defineactivetoken 212 {\cyrillicd}
+\defineactivetoken 213 {\cyrillice}
+\defineactivetoken 214 {\cyrilliczh}
+\defineactivetoken 215 {\cyrillicz}
+\defineactivetoken 216 {\cyrillici}
+\defineactivetoken 217 {\cyrillicishrt}
+\defineactivetoken 218 {\cyrillick}
+\defineactivetoken 219 {\cyrillicl}
+\defineactivetoken 220 {\cyrillicm}
+\defineactivetoken 221 {\cyrillicn}
+\defineactivetoken 222 {\cyrillico}
+\defineactivetoken 223 {\cyrillicp}
+\defineactivetoken 224 {\cyrillicr}
+\defineactivetoken 225 {\cyrillics}
+\defineactivetoken 226 {\cyrillict}
+\defineactivetoken 227 {\cyrillicu}
+\defineactivetoken 228 {\cyrillicf}
+\defineactivetoken 229 {\cyrillich}
+\defineactivetoken 230 {\cyrillicc}
+\defineactivetoken 231 {\cyrillicch}
+\defineactivetoken 232 {\cyrillicsh}
+\defineactivetoken 233 {\cyrillicshch}
+\defineactivetoken 234 {\cyrillichrdsn}
+\defineactivetoken 235 {\cyrillicery}
+\defineactivetoken 236 {\cyrillicsftsn}
+\defineactivetoken 237 {\cyrillicerev}
+\defineactivetoken 238 {\cyrillicyu}
+\defineactivetoken 239 {\cyrillicya}
+\defineactivetoken 240 {\textnumero}
+\defineactivetoken 241 {\cyrillicyo}
+\defineactivetoken 242 {\cyrillicdje}
+\defineactivetoken 243 {\'\cyrillicg}
+\defineactivetoken 244 {\cyrillicie}
+\defineactivetoken 245 {\cyrillicdze}
+\defineactivetoken 246 {\cyrillicii}
+\defineactivetoken 247 {\cyrillicyi}
+\defineactivetoken 248 {\cyrillicje}
+\defineactivetoken 249 {\cyrilliclje}
+\defineactivetoken 250 {\cyrillicnje}
+\defineactivetoken 251 {\cyrillictshe}
+\defineactivetoken 252 {\'\cyrillick}
+\defineactivetoken 253 {\sectionmark}
+\defineactivetoken 254 {\cyrillicushrt}
+\defineactivetoken 255 {\cyrillicdzhe}
+
+\stopregime
+
+\startregime[isoir111]
+
+\defineactivetoken 225 {\cyrillicA}
+\defineactivetoken 226 {\cyrillicB}
+\defineactivetoken 247 {\cyrillicV}
+\defineactivetoken 231 {\cyrillicG}
+\defineactivetoken 228 {\cyrillicD}
+\defineactivetoken 229 {\cyrillicE}
+\defineactivetoken 179 {\cyrillicYO}
+\defineactivetoken 246 {\cyrillicZH}
+\defineactivetoken 250 {\cyrillicZ}
+\defineactivetoken 233 {\cyrillicI}
+\defineactivetoken 234 {\cyrillicISHRT}
+\defineactivetoken 235 {\cyrillicK}
+\defineactivetoken 236 {\cyrillicL}
+\defineactivetoken 237 {\cyrillicM}
+\defineactivetoken 238 {\cyrillicN}
+\defineactivetoken 239 {\cyrillicO}
+\defineactivetoken 240 {\cyrillicP}
+\defineactivetoken 242 {\cyrillicR}
+\defineactivetoken 243 {\cyrillicS}
+\defineactivetoken 244 {\cyrillicT}
+\defineactivetoken 245 {\cyrillicU}
+\defineactivetoken 230 {\cyrillicF}
+\defineactivetoken 232 {\cyrillicH}
+\defineactivetoken 227 {\cyrillicC}
+\defineactivetoken 254 {\cyrillicCH}
+\defineactivetoken 251 {\cyrillicSH}
+\defineactivetoken 253 {\cyrillicSHCH}
+\defineactivetoken 255 {\cyrillicHRDSN}
+\defineactivetoken 249 {\cyrillicERY}
+\defineactivetoken 248 {\cyrillicSFTSN}
+\defineactivetoken 252 {\cyrillicEREV}
+\defineactivetoken 224 {\cyrillicYU}
+\defineactivetoken 241 {\cyrillicYA}
+\defineactivetoken 193 {\cyrillica}
+\defineactivetoken 194 {\cyrillicb}
+\defineactivetoken 215 {\cyrillicv}
+\defineactivetoken 199 {\cyrillicg}
+\defineactivetoken 196 {\cyrillicd}
+\defineactivetoken 197 {\cyrillice}
+\defineactivetoken 163 {\cyrillicyo}
+\defineactivetoken 214 {\cyrilliczh}
+\defineactivetoken 218 {\cyrillicz}
+\defineactivetoken 201 {\cyrillici}
+\defineactivetoken 202 {\cyrillicishrt}
+\defineactivetoken 203 {\cyrillick}
+\defineactivetoken 204 {\cyrillicl}
+\defineactivetoken 205 {\cyrillicm}
+\defineactivetoken 206 {\cyrillicn}
+\defineactivetoken 207 {\cyrillico}
+\defineactivetoken 208 {\cyrillicp}
+\defineactivetoken 210 {\cyrillicr}
+\defineactivetoken 211 {\cyrillics}
+\defineactivetoken 212 {\cyrillict}
+\defineactivetoken 213 {\cyrillicu}
+\defineactivetoken 198 {\cyrillicf}
+\defineactivetoken 200 {\cyrillich}
+\defineactivetoken 195 {\cyrillicc}
+\defineactivetoken 222 {\cyrillicch}
+\defineactivetoken 219 {\cyrillicsh}
+\defineactivetoken 221 {\cyrillicshch}
+\defineactivetoken 223 {\cyrillichrdsn}
+\defineactivetoken 217 {\cyrillicery}
+\defineactivetoken 216 {\cyrillicsftsn}
+\defineactivetoken 220 {\cyrillicerev}
+\defineactivetoken 192 {\cyrillicyu}
+\defineactivetoken 209 {\cyrillicya}
+\defineactivetoken 160 {\nonbreakablespace}
+\defineactivetoken 161 {\cyrillicdje}
+\defineactivetoken 162 {\'\cyrillicg}
+\defineactivetoken 164 {\cyrillicie}
+\defineactivetoken 165 {\cyrillicdze}
+\defineactivetoken 166 {\cyrillicii}
+\defineactivetoken 167 {\cyrillicyi}
+\defineactivetoken 168 {\cyrillicje}
+\defineactivetoken 169 {\cyrilliclje}
+\defineactivetoken 170 {\cyrillicnje}
+\defineactivetoken 171 {\cyrillictshe}
+\defineactivetoken 172 {\'\cyrillick}
+\defineactivetoken 173 {\-}
+\defineactivetoken 174 {\cyrillicushrt}
+\defineactivetoken 175 {\cyrillicdzhe}
+\defineactivetoken 176 {\textnumero}
+\defineactivetoken 177 {\cyrillicDJE}
+\defineactivetoken 178 {\'\cyrillicG}
+\defineactivetoken 180 {\cyrillicIE}
+\defineactivetoken 181 {\cyrillicDZE}
+\defineactivetoken 182 {\cyrillicII}
+\defineactivetoken 183 {\cyrillicYI}
+\defineactivetoken 184 {\cyrillicJE}
+\defineactivetoken 185 {\cyrillicLJE}
+\defineactivetoken 186 {\cyrillicNJE}
+\defineactivetoken 187 {\cyrillicTSHE}
+\defineactivetoken 188 {\'\cyrillicK}
+\defineactivetoken 189 {\textcurrency}
+\defineactivetoken 190 {\cyrillicUSHRT}
+\defineactivetoken 191 {\cyrillicDZHE}
+
+\stopregime
+
+\startregime[mik]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\cyrillica}
+\defineactivetoken 161 {\cyrillicb}
+\defineactivetoken 162 {\cyrillicv}
+\defineactivetoken 163 {\cyrillicg}
+\defineactivetoken 164 {\cyrillicd}
+\defineactivetoken 165 {\cyrillice}
+\defineactivetoken 166 {\cyrilliczh}
+\defineactivetoken 167 {\cyrillicz}
+\defineactivetoken 168 {\cyrillici}
+\defineactivetoken 169 {\cyrillicishrt}
+\defineactivetoken 170 {\cyrillick}
+\defineactivetoken 171 {\cyrillicl}
+\defineactivetoken 172 {\cyrillicm}
+\defineactivetoken 173 {\cyrillicn}
+\defineactivetoken 174 {\cyrillico}
+\defineactivetoken 175 {\cyrillicp}
+\defineactivetoken 176 {\cyrillicr}
+\defineactivetoken 177 {\cyrillics}
+\defineactivetoken 178 {\cyrillict}
+\defineactivetoken 179 {\cyrillicu}
+\defineactivetoken 180 {\cyrillicf}
+\defineactivetoken 181 {\cyrillich}
+\defineactivetoken 182 {\cyrillicc}
+\defineactivetoken 183 {\cyrillicch}
+\defineactivetoken 184 {\cyrillicsh}
+\defineactivetoken 185 {\cyrillicshch}
+\defineactivetoken 186 {\cyrillichrdsn}
+\defineactivetoken 187 {\cyrillicery}
+\defineactivetoken 188 {\cyrillicsftsn}
+\defineactivetoken 189 {\cyrillicerev}
+\defineactivetoken 190 {\cyrillicyu}
+\defineactivetoken 191 {\cyrillicya}
+\defineactivetoken 213 {\textnumero}
+\defineactivetoken 214 {\sectionmark}
+\defineactivetoken 248 {\textdegree}
+\defineactivetoken 249 {\textbullet}
+\defineactivetoken 250 {\periodcentered}
+\defineactivetoken 254 {\textblacksquare}
+\defineactivetoken 255 {\nonbreakablespace}
+\defineactivetoken 224 {\mathematics\alpha}
+\defineactivetoken 225 {\mathematics\beta}
+\defineactivetoken 226 {\mathematics\Gamma}
+\defineactivetoken 227 {\mathematics\pi}
+\defineactivetoken 228 {\mathematics\Sigma}
+\defineactivetoken 229 {\mathematics\sigma}
+\defineactivetoken 230 {\textmu}
+\defineactivetoken 231 {\mathematics\tau}
+\defineactivetoken 232 {\mathematics\Phi}
+\defineactivetoken 233 {\mathematics\Theta}
+\defineactivetoken 234 {\mathematics\Omega}
+\defineactivetoken 235 {\mathematics\delta}
+\defineactivetoken 236 {\mathematics\infty}
+\defineactivetoken 237 {\mathematics\emptyset}
+\defineactivetoken 238 {\mathematics\in}
+\defineactivetoken 239 {\mathematics\cap}
+\defineactivetoken 240 {\mathematics\equiv}
+\defineactivetoken 241 {\textpm}
+\defineactivetoken 242 {\mathematics\geq}
+\defineactivetoken 243 {\mathematics\leq}
+\defineactivetoken 246 {\textdiv}
+\defineactivetoken 247 {\mathematics\sim}
+\defineactivetoken 251 {\textsurd}
+\defineactivetoken 252 {\high{\txx n}}
+\defineactivetoken 253 {\twosuperior}
+
+\stopregime
+
+\startregime[mls]
+
+% The symbols 194 to 253 are defined in Mongolian fonts in
+% the Mon\TeX\ package (?)
+
+\defineactivetoken 128 {\cyrillicB}
+\defineactivetoken 129 {\cyrillicy}
+\defineactivetoken 130 {\cyrillicD}
+\defineactivetoken 131 {\cyrillicYO}
+\defineactivetoken 132 {\cyrillicerev}
+\defineactivetoken 133 {\cyrillicZH}
+\defineactivetoken 134 {\cyrillicZ}
+\defineactivetoken 135 {\cyrillicI}
+\defineactivetoken 136 {\cyrillicISHRT}
+\defineactivetoken 137 {\cyrillicyo}
+\defineactivetoken 138 {\cyrillicL}
+\defineactivetoken 139 {\cyrillicishrt}
+\defineactivetoken 140 {\cyrillicOTLD}
+\defineactivetoken 141 {\cyrillicP}
+\defineactivetoken 142 {\cyrillicEREV}
+\defineactivetoken 143 {\cyrillicU}
+\defineactivetoken 144 {\cyrillicF}
+\defineactivetoken 145 {\cyrillicC}
+\defineactivetoken 146 {\cyrillicCH}
+\defineactivetoken 147 {\cyrillicSH}
+\defineactivetoken 148 {\cyrillicotld}
+\defineactivetoken 149 {\cyrillicSHCH}
+\defineactivetoken 150 {\cyrillicHRDSN}
+\defineactivetoken 151 {\cyrillicERY}
+\defineactivetoken 152 {\cyrillicSFTSN}
+\defineactivetoken 153 {\cyrillicOTLD}
+\defineactivetoken 154 {\cyrillicY}
+\defineactivetoken 155 {\cyrillicEREV}
+\defineactivetoken 156 {\cyrillicYU}
+\defineactivetoken 157 {\cyrillicYA}
+\defineactivetoken 158 {\cyrillicb}
+\defineactivetoken 159 {\cyrillicv}
+\defineactivetoken 160 {\cyrillicg}
+\defineactivetoken 161 {\cyrillicd}
+\defineactivetoken 162 {\cyrilliczh}
+\defineactivetoken 163 {\cyrillicz}
+\defineactivetoken 164 {\cyrillici}
+\defineactivetoken 165 {\cyrillicishrt}
+\defineactivetoken 166 {\cyrillick}
+\defineactivetoken 167 {\cyrillicl}
+\defineactivetoken 168 {\cyrillicm}
+\defineactivetoken 169 {\cyrillicn}
+\defineactivetoken 170 {\cyrillicotld}
+\defineactivetoken 171 {\cyrillicp}
+\defineactivetoken 172 {\cyrillict}
+\defineactivetoken 173 {\cyrillicy}
+\defineactivetoken 174 {\leftguillemot}
+\defineactivetoken 175 {\rightguillemot}
+\defineactivetoken 176 {\cyrillicf}
+\defineactivetoken 177 {\cyrillicc}
+\defineactivetoken 178 {\cyrillicch}
+\defineactivetoken 180 {\cyrillicsh}
+\defineactivetoken 181 {\cyrillicshch}
+\defineactivetoken 182 {\cyrillichrdsn}
+\defineactivetoken 183 {\cyrillicery}
+\defineactivetoken 184 {\cyrillicsftsn}
+\defineactivetoken 189 {\cyrillicerev}
+\defineactivetoken 190 {\cyrillicyu}
+\defineactivetoken 193 {\cyrillicya}
+\defineactivetoken 226 {\cyrillicG}
+\defineactivetoken 225 {\ss}
+\defineactivetoken 231 {\mathematics{\gamma}}
+\defineactivetoken 255 {\nonbreakablespace}
+\defineactivetoken 194 {\titem}
+\defineactivetoken 195 {\shud}
+\defineactivetoken 197 {\secondaryshud}
+\defineactivetoken 198 {\shilbe}
+\defineactivetoken 199 {\gedes}
+\defineactivetoken 207 {\secondarygedes}
+\defineactivetoken 208 {\cegteishud}
+\defineactivetoken 209 {\lewer}
+\defineactivetoken 210 {\suuliinlewer}
+\defineactivetoken 211 {\tertiarylewer}
+\defineactivetoken 212 {\mewer}
+\defineactivetoken 213 {\suuliinmewer}
+\defineactivetoken 214 {\xewteeqix}
+\defineactivetoken 215 {\dawxarcegtxewteeqix}
+\defineactivetoken 216 {\halfnum}
+\defineactivetoken 219 {\num}
+\defineactivetoken 220 {\halfnumtgedes}
+\defineactivetoken 221 {\numtaigedes}
+\defineactivetoken 222 {\buruuxarsangedes}
+\defineactivetoken 223 {\gedesteishilbe}
+\defineactivetoken 224 {\erweeljinshilbe}
+\defineactivetoken 227 {\secerweeljin}
+\defineactivetoken 228 {\bosooshilbe}
+\defineactivetoken 229 {\etgershilbe}
+\defineactivetoken 230 {\zawj}
+\defineactivetoken 232 {\suuliinzawj}
+\defineactivetoken 233 {\dawxarcegtzawj}
+\defineactivetoken 234 {\sereeewer}
+\defineactivetoken 235 {\matgarshilbe}
+\defineactivetoken 236 {\bituushilbe}
+\defineactivetoken 237 {\secondaryqagt}
+\defineactivetoken 238 {\qagt}
+\defineactivetoken 239 {\secnumtdelbenqix}
+\defineactivetoken 240 {\numtdelbenqix}
+\defineactivetoken 241 {\secsertenqixtnum}
+\defineactivetoken 242 {\sertenqixtnum}
+\defineactivetoken 243 {\zadgaizardigt}
+\defineactivetoken 244 {\bituuzardigt}
+\defineactivetoken 245 {\malgaitaititem}
+\defineactivetoken 246 {\suul}
+\defineactivetoken 247 {\orxic}
+\defineactivetoken 248 {\biodoisuul}
+\defineactivetoken 249 {\bagodoisuul}
+\defineactivetoken 250 {\nceg}
+\defineactivetoken 251 {\gceg}
+\defineactivetoken 252 {\ceg}
+\defineactivetoken 253 {\dorwoljin}
+
+\stopregime
+
+\startregime[mnk]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicYO}
+\defineactivetoken 135 {\cyrillicZH}
+\defineactivetoken 136 {\cyrillicZ}
+\defineactivetoken 137 {\cyrillicI}
+\defineactivetoken 138 {\cyrillicISHRT}
+\defineactivetoken 139 {\cyrillicK}
+\defineactivetoken 140 {\cyrillicL}
+\defineactivetoken 141 {\cyrillicM}
+\defineactivetoken 142 {\cyrillicN}
+\defineactivetoken 143 {\cyrillicO}
+\defineactivetoken 144 {\cyrillicOTLD}
+\defineactivetoken 145 {\cyrillicP}
+\defineactivetoken 146 {\cyrillicR}
+\defineactivetoken 147 {\cyrillicS}
+\defineactivetoken 148 {\cyrillicT}
+\defineactivetoken 149 {\cyrillicU}
+\defineactivetoken 150 {\cyrillicY}
+\defineactivetoken 151 {\cyrillicF}
+\defineactivetoken 152 {\cyrillicH}
+\defineactivetoken 153 {\cyrillicC}
+\defineactivetoken 154 {\cyrillicCH}
+\defineactivetoken 155 {\cyrillicSH}
+\defineactivetoken 156 {\cyrillicSHCH}
+\defineactivetoken 157 {\cyrillicHRDSN}
+\defineactivetoken 158 {\cyrillicERY}
+\defineactivetoken 159 {\cyrillicSFTSN}
+\defineactivetoken 160 {\cyrillicEREV}
+\defineactivetoken 161 {\cyrillicYU}
+\defineactivetoken 162 {\cyrillicYA}
+\defineactivetoken 163 {\cyrillica}
+\defineactivetoken 164 {\cyrillicb}
+\defineactivetoken 165 {\cyrillicv}
+\defineactivetoken 166 {\cyrillicg}
+\defineactivetoken 167 {\cyrillicd}
+\defineactivetoken 168 {\cyrillice}
+\defineactivetoken 169 {\cyrillicyo}
+\defineactivetoken 170 {\cyrilliczh}
+\defineactivetoken 173 {\cyrillicz}
+\defineactivetoken 224 {\cyrillici}
+\defineactivetoken 225 {\cyrillicishrt}
+\defineactivetoken 226 {\cyrillick}
+\defineactivetoken 227 {\cyrillicl}
+\defineactivetoken 228 {\cyrillicm}
+\defineactivetoken 229 {\cyrillicn}
+\defineactivetoken 230 {\cyrillico}
+\defineactivetoken 231 {\cyrillicotld}
+\defineactivetoken 232 {\cyrillicp}
+\defineactivetoken 233 {\cyrillicr}
+\defineactivetoken 234 {\cyrillics}
+\defineactivetoken 235 {\cyrillict}
+\defineactivetoken 236 {\cyrillicu}
+\defineactivetoken 237 {\cyrillicy}
+\defineactivetoken 238 {\cyrillicf}
+\defineactivetoken 239 {\cyrillich}
+\defineactivetoken 240 {\cyrillicc}
+\defineactivetoken 241 {\cyrillicch}
+\defineactivetoken 242 {\cyrillicsh}
+\defineactivetoken 243 {\cyrillicshch}
+\defineactivetoken 244 {\cyrillichrdsn}
+\defineactivetoken 245 {\cyrillicery}
+\defineactivetoken 248 {\cyrillicsftsn}
+\defineactivetoken 252 {\cyrillicerev}
+\defineactivetoken 253 {\cyrillicyu}
+\defineactivetoken 254 {\cyrillicya}
+
+\stopregime
+
+\startregime[mos]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 160 {\cyrillicYO}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 153 {\cyrillicOTLD}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 154 {\cyrillicY}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 164 {\cyrillicSHCH}
+\defineactivetoken 162 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 224 {\cyrillica}
+\defineactivetoken 225 {\cyrillicb}
+\defineactivetoken 226 {\cyrillicv}
+\defineactivetoken 227 {\cyrillicg}
+\defineactivetoken 228 {\cyrillicd}
+\defineactivetoken 229 {\cyrillice}
+\defineactivetoken 161 {\cyrillicyo}
+\defineactivetoken 230 {\cyrilliczh}
+\defineactivetoken 231 {\cyrillicz}
+\defineactivetoken 232 {\cyrillici}
+\defineactivetoken 233 {\cyrillicishrt}
+\defineactivetoken 234 {\cyrillick}
+\defineactivetoken 235 {\cyrillicl}
+\defineactivetoken 236 {\cyrillicm}
+\defineactivetoken 237 {\cyrillicn}
+\defineactivetoken 238 {\cyrillico}
+\defineactivetoken 249 {\cyrillicotld}
+\defineactivetoken 239 {\cyrillicp}
+\defineactivetoken 240 {\cyrillicr}
+\defineactivetoken 241 {\cyrillics}
+\defineactivetoken 242 {\cyrillict}
+\defineactivetoken 243 {\cyrillicu}
+\defineactivetoken 250 {\cyrillicy}
+\defineactivetoken 244 {\cyrillicf}
+\defineactivetoken 245 {\cyrillich}
+\defineactivetoken 246 {\cyrillicc}
+\defineactivetoken 247 {\cyrillicch}
+\defineactivetoken 248 {\cyrillicsh}
+\defineactivetoken 165 {\cyrillicshch}
+\defineactivetoken 163 {\cyrillichrdsn}
+\defineactivetoken 251 {\cyrillicery}
+\defineactivetoken 252 {\cyrillicsftsn}
+\defineactivetoken 253 {\cyrillicerev}
+\defineactivetoken 254 {\cyrillicyu}
+\defineactivetoken 168 {\cyrillicya}
+
+\stopregime
+
+\startregime[ncc]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicYO}
+\defineactivetoken 135 {\cyrillicZH}
+\defineactivetoken 136 {\cyrillicZ}
+\defineactivetoken 137 {\cyrillicI}
+\defineactivetoken 139 {\cyrillicISHRT}
+\defineactivetoken 140 {\cyrillicK}
+\defineactivetoken 142 {\cyrillicL}
+\defineactivetoken 143 {\cyrillicM}
+\defineactivetoken 144 {\cyrillicN}
+\defineactivetoken 145 {\cyrillicO}
+\defineactivetoken 146 {\cyrillicOTLD}
+\defineactivetoken 147 {\cyrillicP}
+\defineactivetoken 148 {\cyrillicR}
+\defineactivetoken 149 {\cyrillicS}
+\defineactivetoken 150 {\cyrillicT}
+\defineactivetoken 151 {\cyrillicU}
+\defineactivetoken 152 {\cyrillicY}
+\defineactivetoken 153 {\cyrillicF}
+\defineactivetoken 154 {\cyrillicH}
+\defineactivetoken 155 {\cyrillicC}
+\defineactivetoken 156 {\cyrillicCH}
+\defineactivetoken 157 {\cyrillicSH}
+\defineactivetoken 158 {\cyrillicSHCH}
+\defineactivetoken 159 {\cyrillicHRDSN}
+\defineactivetoken 160 {\cyrillicERY}
+\defineactivetoken 161 {\cyrillicSFTSN}
+\defineactivetoken 162 {\cyrillicEREV}
+\defineactivetoken 163 {\cyrillicYU}
+\defineactivetoken 164 {\cyrillicYA}
+\defineactivetoken 165 {\cyrillica}
+\defineactivetoken 166 {\cyrillicb}
+\defineactivetoken 167 {\cyrillicv}
+\defineactivetoken 168 {\cyrillicg}
+\defineactivetoken 169 {\cyrillicd}
+\defineactivetoken 170 {\cyrillice}
+\defineactivetoken 171 {\cyrillicyo}
+\defineactivetoken 172 {\cyrilliczh}
+\defineactivetoken 173 {\cyrillicz}
+\defineactivetoken 225 {\cyrillici}
+\defineactivetoken 226 {\cyrillicishrt}
+\defineactivetoken 227 {\cyrillick}
+\defineactivetoken 228 {\cyrillicl}
+\defineactivetoken 229 {\cyrillicm}
+\defineactivetoken 230 {\cyrillicn}
+\defineactivetoken 231 {\cyrillico}
+\defineactivetoken 232 {\cyrillicotld}
+\defineactivetoken 233 {\cyrillicp}
+\defineactivetoken 234 {\cyrillicr}
+\defineactivetoken 235 {\cyrillics}
+\defineactivetoken 236 {\cyrillict}
+\defineactivetoken 237 {\cyrillicu}
+\defineactivetoken 238 {\cyrillicy}
+\defineactivetoken 239 {\cyrillicf}
+\defineactivetoken 240 {\cyrillich}
+\defineactivetoken 241 {\cyrillicc}
+\defineactivetoken 242 {\cyrillicch}
+\defineactivetoken 243 {\cyrillicsh}
+\defineactivetoken 244 {\cyrillicshch}
+\defineactivetoken 245 {\cyrillichrdsn}
+\defineactivetoken 246 {\cyrillicery}
+\defineactivetoken 247 {\cyrillicsftsn}
+\defineactivetoken 248 {\cyrillicerev}
+\defineactivetoken 249 {\cyrillicyu}
+\defineactivetoken 251 {\cyrillicya}
+
+\stopregime
+
+\endinput
diff --git a/tex/context/base/regi-cyr.mkii b/tex/context/base/regi-cyr.mkii
new file mode 100644
index 000000000..1e84b9cba
--- /dev/null
+++ b/tex/context/base/regi-cyr.mkii
@@ -0,0 +1,722 @@
+%D \module
+%D [ file=regi-cyr,
+%D version=2003.01.24,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Cyrillic,
+%D author=...,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Here are additional input regimes for cyrillic encodings others than cp1251
+%D and iso-8859-5:
+%D
+%D \startitemize
+%D \item two variants of dos
+%D \item three variants of koi-8 for *nix: russian,
+%D ukrainian and mixed
+%D \item two variants for the mac
+%D \stopitemize
+%D
+%D Other, not so popular regimes, can be found in \type
+%D {regi-cy2}.
+
+\startregime[cp866]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\cyrillica}
+\defineactivetoken 161 {\cyrillicb}
+\defineactivetoken 162 {\cyrillicv}
+\defineactivetoken 163 {\cyrillicg}
+\defineactivetoken 164 {\cyrillicd}
+\defineactivetoken 165 {\cyrillice}
+\defineactivetoken 166 {\cyrilliczh}
+\defineactivetoken 167 {\cyrillicz}
+\defineactivetoken 168 {\cyrillici}
+\defineactivetoken 169 {\cyrillicishrt}
+\defineactivetoken 170 {\cyrillick}
+\defineactivetoken 171 {\cyrillicl}
+\defineactivetoken 172 {\cyrillicm}
+\defineactivetoken 173 {\cyrillicn}
+\defineactivetoken 174 {\cyrillico}
+\defineactivetoken 175 {\cyrillicp}
+\defineactivetoken 224 {\cyrillicr}
+\defineactivetoken 225 {\cyrillics}
+\defineactivetoken 226 {\cyrillict}
+\defineactivetoken 227 {\cyrillicu}
+\defineactivetoken 228 {\cyrillicf}
+\defineactivetoken 229 {\cyrillich}
+\defineactivetoken 230 {\cyrillicc}
+\defineactivetoken 231 {\cyrillicch}
+\defineactivetoken 232 {\cyrillicsh}
+\defineactivetoken 233 {\cyrillicshch}
+\defineactivetoken 234 {\cyrillichrdsn}
+\defineactivetoken 235 {\cyrillicery}
+\defineactivetoken 236 {\cyrillicsftsn}
+\defineactivetoken 237 {\cyrillicerev}
+\defineactivetoken 238 {\cyrillicyu}
+\defineactivetoken 239 {\cyrillicya}
+\defineactivetoken 240 {\cyrillicYO}
+\defineactivetoken 241 {\cyrillicyo}
+\defineactivetoken 242 {\cyrillicIE}
+\defineactivetoken 243 {\cyrillicie}
+\defineactivetoken 244 {\cyrillicYI}
+\defineactivetoken 245 {\cyrillicyi}
+\defineactivetoken 246 {\cyrillicUSHRT}
+\defineactivetoken 247 {\cyrillicushrt}
+\defineactivetoken 248 {\textdegree}
+\defineactivetoken 249 {\bullet}
+\defineactivetoken 250 {\periodcentered}
+\defineactivetoken 252 {\textnumero}
+\defineactivetoken 253 {\textcurrency}
+\defineactivetoken 254 {\textblacksquare}
+\defineactivetoken 255 {\nonbreakablespace}
+\defineactivetoken 251 {\textsurd}
+
+\stopregime
+
+\startregime[cp866nav]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\cyrillica}
+\defineactivetoken 161 {\cyrillicb}
+\defineactivetoken 162 {\cyrillicv}
+\defineactivetoken 163 {\cyrillicg}
+\defineactivetoken 164 {\cyrillicd}
+\defineactivetoken 165 {\cyrillice}
+\defineactivetoken 166 {\cyrilliczh}
+\defineactivetoken 167 {\cyrillicz}
+\defineactivetoken 168 {\cyrillici}
+\defineactivetoken 169 {\cyrillicishrt}
+\defineactivetoken 170 {\cyrillick}
+\defineactivetoken 171 {\cyrillicl}
+\defineactivetoken 172 {\cyrillicm}
+\defineactivetoken 173 {\cyrillicn}
+\defineactivetoken 174 {\cyrillico}
+\defineactivetoken 175 {\cyrillicp}
+\defineactivetoken 224 {\cyrillicr}
+\defineactivetoken 225 {\cyrillics}
+\defineactivetoken 226 {\cyrillict}
+\defineactivetoken 227 {\cyrillicu}
+\defineactivetoken 228 {\cyrillicf}
+\defineactivetoken 229 {\cyrillich}
+\defineactivetoken 230 {\cyrillicc}
+\defineactivetoken 231 {\cyrillicch}
+\defineactivetoken 232 {\cyrillicsh}
+\defineactivetoken 233 {\cyrillicshch}
+\defineactivetoken 234 {\cyrillichrdsn}
+\defineactivetoken 235 {\cyrillicery}
+\defineactivetoken 236 {\cyrillicsftsn}
+\defineactivetoken 237 {\cyrillicerev}
+\defineactivetoken 238 {\cyrillicyu}
+\defineactivetoken 239 {\cyrillicya}
+\defineactivetoken 240 {\cyrillicYO}
+\defineactivetoken 241 {\cyrillicyo}
+\defineactivetoken 242 {\cyrillicGUP}
+\defineactivetoken 243 {\cyrillicgup}
+\defineactivetoken 244 {\cyrillicIE}
+\defineactivetoken 245 {\cyrillicie}
+\defineactivetoken 246 {\cyrillicII}
+\defineactivetoken 247 {\cyrillicii}
+\defineactivetoken 248 {\cyrillicYI}
+\defineactivetoken 249 {\cyrillicyi}
+\defineactivetoken 250 {\cyrillicUSHRT}
+\defineactivetoken 251 {\cyrillicushrt}
+\defineactivetoken 252 {\textnumero}
+\defineactivetoken 253 {\leftguillemot}
+\defineactivetoken 254 {\rightguillemot}
+\defineactivetoken 255 {\nonbreakablespace}
+
+\stopregime
+
+\startregime[koi8-r]
+
+\defineactivetoken 225 {\cyrillicA}
+\defineactivetoken 226 {\cyrillicB}
+\defineactivetoken 247 {\cyrillicV}
+\defineactivetoken 231 {\cyrillicG}
+\defineactivetoken 228 {\cyrillicD}
+\defineactivetoken 229 {\cyrillicE}
+\defineactivetoken 179 {\cyrillicYO}
+\defineactivetoken 246 {\cyrillicZH}
+\defineactivetoken 250 {\cyrillicZ}
+\defineactivetoken 233 {\cyrillicI}
+\defineactivetoken 234 {\cyrillicISHRT}
+\defineactivetoken 235 {\cyrillicK}
+\defineactivetoken 236 {\cyrillicL}
+\defineactivetoken 237 {\cyrillicM}
+\defineactivetoken 238 {\cyrillicN}
+\defineactivetoken 239 {\cyrillicO}
+\defineactivetoken 240 {\cyrillicP}
+\defineactivetoken 242 {\cyrillicR}
+\defineactivetoken 243 {\cyrillicS}
+\defineactivetoken 244 {\cyrillicT}
+\defineactivetoken 245 {\cyrillicU}
+\defineactivetoken 230 {\cyrillicF}
+\defineactivetoken 232 {\cyrillicH}
+\defineactivetoken 227 {\cyrillicC}
+\defineactivetoken 254 {\cyrillicCH}
+\defineactivetoken 251 {\cyrillicSH}
+\defineactivetoken 253 {\cyrillicSHCH}
+\defineactivetoken 255 {\cyrillicHRDSN}
+\defineactivetoken 249 {\cyrillicERY}
+\defineactivetoken 248 {\cyrillicSFTSN}
+\defineactivetoken 252 {\cyrillicEREV}
+\defineactivetoken 224 {\cyrillicYU}
+\defineactivetoken 241 {\cyrillicYA}
+\defineactivetoken 193 {\cyrillica}
+\defineactivetoken 194 {\cyrillicb}
+\defineactivetoken 215 {\cyrillicv}
+\defineactivetoken 199 {\cyrillicg}
+\defineactivetoken 196 {\cyrillicd}
+\defineactivetoken 197 {\cyrillice}
+\defineactivetoken 163 {\cyrillicyo}
+\defineactivetoken 214 {\cyrilliczh}
+\defineactivetoken 218 {\cyrillicz}
+\defineactivetoken 201 {\cyrillici}
+\defineactivetoken 202 {\cyrillicishrt}
+\defineactivetoken 203 {\cyrillick}
+\defineactivetoken 204 {\cyrillicl}
+\defineactivetoken 205 {\cyrillicm}
+\defineactivetoken 206 {\cyrillicn}
+\defineactivetoken 207 {\cyrillico}
+\defineactivetoken 208 {\cyrillicp}
+\defineactivetoken 210 {\cyrillicr}
+\defineactivetoken 211 {\cyrillics}
+\defineactivetoken 212 {\cyrillict}
+\defineactivetoken 213 {\cyrillicu}
+\defineactivetoken 198 {\cyrillicf}
+\defineactivetoken 200 {\cyrillich}
+\defineactivetoken 195 {\cyrillicc}
+\defineactivetoken 222 {\cyrillicch}
+\defineactivetoken 219 {\cyrillicsh}
+\defineactivetoken 221 {\cyrillicshch}
+\defineactivetoken 223 {\cyrillichrdsn}
+\defineactivetoken 217 {\cyrillicery}
+\defineactivetoken 216 {\cyrillicsftsn}
+\defineactivetoken 220 {\cyrillicerev}
+\defineactivetoken 192 {\cyrillicyu}
+\defineactivetoken 209 {\cyrillicya}
+\defineactivetoken 148 {\textblacksquare}
+\defineactivetoken 149 {\textbullet}
+\defineactivetoken 154 {\nonbreakablespace}
+\defineactivetoken 156 {\textdegree}
+\defineactivetoken 158 {\periodcentered}
+\defineactivetoken 191 {\copyright}
+\defineactivetoken 150 {\textsurd}
+\defineactivetoken 151 {\mathematics\sim}
+\defineactivetoken 152 {\mathematics\leq}
+\defineactivetoken 153 {\mathematics\geq}
+\defineactivetoken 157 {\twosuperior}
+\defineactivetoken 159 {\textdiv}
+
+\stopregime
+
+\startregime[koi8-ru]
+
+\defineactivetoken 225 {\cyrillicA}
+\defineactivetoken 226 {\cyrillicB}
+\defineactivetoken 247 {\cyrillicV}
+\defineactivetoken 231 {\cyrillicG}
+\defineactivetoken 228 {\cyrillicD}
+\defineactivetoken 229 {\cyrillicE}
+\defineactivetoken 179 {\cyrillicYO}
+\defineactivetoken 246 {\cyrillicZH}
+\defineactivetoken 250 {\cyrillicZ}
+\defineactivetoken 233 {\cyrillicI}
+\defineactivetoken 234 {\cyrillicISHRT}
+\defineactivetoken 235 {\cyrillicK}
+\defineactivetoken 236 {\cyrillicL}
+\defineactivetoken 237 {\cyrillicM}
+\defineactivetoken 238 {\cyrillicN}
+\defineactivetoken 239 {\cyrillicO}
+\defineactivetoken 240 {\cyrillicP}
+\defineactivetoken 242 {\cyrillicR}
+\defineactivetoken 243 {\cyrillicS}
+\defineactivetoken 244 {\cyrillicT}
+\defineactivetoken 245 {\cyrillicU}
+\defineactivetoken 230 {\cyrillicF}
+\defineactivetoken 232 {\cyrillicH}
+\defineactivetoken 227 {\cyrillicC}
+\defineactivetoken 254 {\cyrillicCH}
+\defineactivetoken 251 {\cyrillicSH}
+\defineactivetoken 253 {\cyrillicSHCH}
+\defineactivetoken 255 {\cyrillicHRDSN}
+\defineactivetoken 249 {\cyrillicERY}
+\defineactivetoken 248 {\cyrillicSFTSN}
+\defineactivetoken 252 {\cyrillicEREV}
+\defineactivetoken 224 {\cyrillicYU}
+\defineactivetoken 241 {\cyrillicYA}
+\defineactivetoken 193 {\cyrillica}
+\defineactivetoken 194 {\cyrillicb}
+\defineactivetoken 215 {\cyrillicv}
+\defineactivetoken 199 {\cyrillicg}
+\defineactivetoken 196 {\cyrillicd}
+\defineactivetoken 197 {\cyrillice}
+\defineactivetoken 163 {\cyrillicyo}
+\defineactivetoken 214 {\cyrilliczh}
+\defineactivetoken 218 {\cyrillicz}
+\defineactivetoken 201 {\cyrillici}
+\defineactivetoken 202 {\cyrillicishrt}
+\defineactivetoken 203 {\cyrillick}
+\defineactivetoken 204 {\cyrillicl}
+\defineactivetoken 205 {\cyrillicm}
+\defineactivetoken 206 {\cyrillicn}
+\defineactivetoken 207 {\cyrillico}
+\defineactivetoken 208 {\cyrillicp}
+\defineactivetoken 210 {\cyrillicr}
+\defineactivetoken 211 {\cyrillics}
+\defineactivetoken 212 {\cyrillict}
+\defineactivetoken 213 {\cyrillicu}
+\defineactivetoken 198 {\cyrillicf}
+\defineactivetoken 200 {\cyrillich}
+\defineactivetoken 195 {\cyrillicc}
+\defineactivetoken 222 {\cyrillicch}
+\defineactivetoken 219 {\cyrillicsh}
+\defineactivetoken 221 {\cyrillicshch}
+\defineactivetoken 223 {\cyrillichrdsn}
+\defineactivetoken 217 {\cyrillicery}
+\defineactivetoken 216 {\cyrillicsftsn}
+\defineactivetoken 220 {\cyrillicerev}
+\defineactivetoken 192 {\cyrillicyu}
+\defineactivetoken 209 {\cyrillicya}
+\defineactivetoken 147 {\upperleftsinglesixquote}
+\defineactivetoken 148 {\textblacksquare}
+\defineactivetoken 149 {\textbullet} % Changed by V.F. 07/02/2003 (was: \bullet)
+\defineactivetoken 150 {\upperrightdoubleninequote}
+\defineactivetoken 151 {\emdash}
+\defineactivetoken 152 {\textnumero}
+\defineactivetoken 153 {\trademark} % Changed by V.F. 07/02/2003 (was: \texttrademark)
+\defineactivetoken 154 {\nonbreakablespace}
+\defineactivetoken 155 {\rightguillemot}
+\defineactivetoken 156 {\registered}
+\defineactivetoken 157 {\leftguillemot}
+\defineactivetoken 158 {\periodcentered} % Changed by V.F. 07/02/2003 (was: \textperiodcentered)
+\defineactivetoken 159 {\textcurrency}
+\defineactivetoken 164 {\cyrillicie}
+\defineactivetoken 166 {\cyrillicii}
+\defineactivetoken 167 {\cyrillicyi}
+\defineactivetoken 173 {\cyrillicgup}
+\defineactivetoken 174 {\cyrillicushrt}
+\defineactivetoken 180 {\cyrillicIE}
+\defineactivetoken 182 {\cyrillicII}
+\defineactivetoken 183 {\cyrillicYI}
+\defineactivetoken 189 {\cyrillicGUP}
+\defineactivetoken 190 {\cyrillicUSHRT}
+\defineactivetoken 191 {\copyright}
+
+\stopregime
+
+\startregime[koi8-u]
+
+\defineactivetoken 225 {\cyrillicA}
+\defineactivetoken 226 {\cyrillicB}
+\defineactivetoken 247 {\cyrillicV}
+\defineactivetoken 231 {\cyrillicG}
+\defineactivetoken 228 {\cyrillicD}
+\defineactivetoken 229 {\cyrillicE}
+\defineactivetoken 179 {\cyrillicYO}
+\defineactivetoken 246 {\cyrillicZH}
+\defineactivetoken 250 {\cyrillicZ}
+\defineactivetoken 233 {\cyrillicI}
+\defineactivetoken 234 {\cyrillicISHRT}
+\defineactivetoken 235 {\cyrillicK}
+\defineactivetoken 236 {\cyrillicL}
+\defineactivetoken 237 {\cyrillicM}
+\defineactivetoken 238 {\cyrillicN}
+\defineactivetoken 239 {\cyrillicO}
+\defineactivetoken 240 {\cyrillicP}
+\defineactivetoken 242 {\cyrillicR}
+\defineactivetoken 243 {\cyrillicS}
+\defineactivetoken 244 {\cyrillicT}
+\defineactivetoken 245 {\cyrillicU}
+\defineactivetoken 230 {\cyrillicF}
+\defineactivetoken 232 {\cyrillicH}
+\defineactivetoken 227 {\cyrillicC}
+\defineactivetoken 254 {\cyrillicCH}
+\defineactivetoken 251 {\cyrillicSH}
+\defineactivetoken 253 {\cyrillicSHCH}
+\defineactivetoken 255 {\cyrillicHRDSN}
+\defineactivetoken 249 {\cyrillicERY}
+\defineactivetoken 248 {\cyrillicSFTSN}
+\defineactivetoken 252 {\cyrillicEREV}
+\defineactivetoken 224 {\cyrillicYU}
+\defineactivetoken 241 {\cyrillicYA}
+\defineactivetoken 193 {\cyrillica}
+\defineactivetoken 194 {\cyrillicb}
+\defineactivetoken 215 {\cyrillicv}
+\defineactivetoken 199 {\cyrillicg}
+\defineactivetoken 196 {\cyrillicd}
+\defineactivetoken 197 {\cyrillice}
+\defineactivetoken 163 {\cyrillicyo}
+\defineactivetoken 214 {\cyrilliczh}
+\defineactivetoken 218 {\cyrillicz}
+\defineactivetoken 201 {\cyrillici}
+\defineactivetoken 202 {\cyrillicishrt}
+\defineactivetoken 203 {\cyrillick}
+\defineactivetoken 204 {\cyrillicl}
+\defineactivetoken 205 {\cyrillicm}
+\defineactivetoken 206 {\cyrillicn}
+\defineactivetoken 207 {\cyrillico}
+\defineactivetoken 208 {\cyrillicp}
+\defineactivetoken 210 {\cyrillicr}
+\defineactivetoken 211 {\cyrillics}
+\defineactivetoken 212 {\cyrillict}
+\defineactivetoken 213 {\cyrillicu}
+\defineactivetoken 198 {\cyrillicf}
+\defineactivetoken 200 {\cyrillich}
+\defineactivetoken 195 {\cyrillicc}
+\defineactivetoken 222 {\cyrillicch}
+\defineactivetoken 219 {\cyrillicsh}
+\defineactivetoken 221 {\cyrillicshch}
+\defineactivetoken 223 {\cyrillichrdsn}
+\defineactivetoken 217 {\cyrillicery}
+\defineactivetoken 216 {\cyrillicsftsn}
+\defineactivetoken 220 {\cyrillicerev}
+\defineactivetoken 192 {\cyrillicyu}
+\defineactivetoken 209 {\cyrillicya}
+\defineactivetoken 164 {\cyrillicie}
+\defineactivetoken 166 {\cyrillicii}
+\defineactivetoken 167 {\cyrillicyi}
+\defineactivetoken 173 {\cyrillicgup}
+\defineactivetoken 180 {\cyrillicIE}
+\defineactivetoken 182 {\cyrillicII}
+\defineactivetoken 183 {\cyrillicYI}
+\defineactivetoken 189 {\cyrillicGUP}
+
+\stopregime
+
+\startregime[maccyr]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\textdag} % Changed by V.F. 07/02/2003 (was: dag)
+\defineactivetoken 161 {\textdegree}
+\defineactivetoken 162 {\textcent}
+\defineactivetoken 163 {\textsterling} % Changed by V.F. 07/02/2003 (was: \sterling)
+\defineactivetoken 164 {\sectionmark} % Changed by V.F. 07/02/2003 (was: \S)
+\defineactivetoken 165 {\textbullet} % Changed by V.F. 07/02/2003 (was: \bullet}
+\defineactivetoken 166 {\paragraphmark} % Changed by V.F. 07/02/2003 (was: \P)
+\defineactivetoken 167 {\cyrillicII}
+\defineactivetoken 168 {\registered}
+\defineactivetoken 169 {\copyright}
+\defineactivetoken 170 {\trademark} % Changed by V.F. 07/02/2003 (was: \texttrademark}
+\defineactivetoken 171 {\cyrillicDJE}
+\defineactivetoken 172 {\cyrillicdje}
+\defineactivetoken 174 {\'\cyrillicG}
+\defineactivetoken 175 {\'\cyrillicg}
+\defineactivetoken 180 {\cyrillicii}
+\defineactivetoken 183 {\cyrillicJE}
+\defineactivetoken 184 {\cyrillicIE}
+\defineactivetoken 185 {\cyrillicie}
+\defineactivetoken 186 {\cyrillicYI}
+\defineactivetoken 187 {\cyrillicyi}
+\defineactivetoken 188 {\cyrillicLJE}
+\defineactivetoken 189 {\cyrilliclje}
+\defineactivetoken 190 {\cyrillicNJE}
+\defineactivetoken 191 {\cyrillicnje}
+\defineactivetoken 192 {\cyrillicje}
+\defineactivetoken 193 {\cyrillicDZE}
+\defineactivetoken 196 {\textflorin} % Changed by V.F. 07/02/2003 (was: \florijn)
+\defineactivetoken 199 {\leftguillemot}
+\defineactivetoken 200 {\rightguillemot}
+\defineactivetoken 201 {\textellipsis} % Changed by V.F. 07/02/2003 (was: \dots)
+\defineactivetoken 202 {\nonbreakablespace}
+\defineactivetoken 203 {\cyrillicTSHE}
+\defineactivetoken 204 {\cyrillictshe}
+\defineactivetoken 205 {\'\cyrillicK}
+\defineactivetoken 206 {\'\cyrillick}
+\defineactivetoken 207 {\cyrillicdze}
+\defineactivetoken 208 {\endash}
+\defineactivetoken 209 {\emdash}
+\defineactivetoken 210 {\upperleftdoublesixquote} % Changed by V.F. 07/02/2003
+ % (was: \upperleftsinglesixquote)
+\defineactivetoken 211 {\upperrightdoubleninequote}
+\defineactivetoken 212 {\upperleftsinglesixquote}
+\defineactivetoken 213 {\upperrightsingleninequote}
+\defineactivetoken 215 {\lowerleftdoubleninequote}
+\defineactivetoken 216 {\cyrillicUSHRT}
+\defineactivetoken 217 {\cyrillicushrt}
+\defineactivetoken 218 {\cyrillicDZHE}
+\defineactivetoken 219 {\cyrillicdzhe}
+\defineactivetoken 220 {\textnumero}
+\defineactivetoken 221 {\cyrillicYO}
+\defineactivetoken 222 {\cyrillicyo}
+\defineactivetoken 223 {\cyrillicya}
+\defineactivetoken 224 {\cyrillica}
+\defineactivetoken 225 {\cyrillicb}
+\defineactivetoken 226 {\cyrillicv}
+\defineactivetoken 227 {\cyrillicg}
+\defineactivetoken 228 {\cyrillicd}
+\defineactivetoken 229 {\cyrillice}
+\defineactivetoken 230 {\cyrilliczh}
+\defineactivetoken 231 {\cyrillicz}
+\defineactivetoken 232 {\cyrillici}
+\defineactivetoken 233 {\cyrillicishrt}
+\defineactivetoken 234 {\cyrillick}
+\defineactivetoken 235 {\cyrillicl}
+\defineactivetoken 236 {\cyrillicm}
+\defineactivetoken 237 {\cyrillicn}
+\defineactivetoken 238 {\cyrillico}
+\defineactivetoken 239 {\cyrillicp}
+\defineactivetoken 240 {\cyrillicr}
+\defineactivetoken 241 {\cyrillics}
+\defineactivetoken 242 {\cyrillict}
+\defineactivetoken 243 {\cyrillicu}
+\defineactivetoken 244 {\cyrillicf}
+\defineactivetoken 245 {\cyrillich}
+\defineactivetoken 246 {\cyrillicc}
+\defineactivetoken 247 {\cyrillicch}
+\defineactivetoken 248 {\cyrillicsh}
+\defineactivetoken 249 {\cyrillicshch}
+\defineactivetoken 250 {\cyrillichrdsn}
+\defineactivetoken 251 {\cyrillicery}
+\defineactivetoken 252 {\cyrillicsftsn}
+\defineactivetoken 253 {\cyrillicerev}
+\defineactivetoken 254 {\cyrillicyu}
+\defineactivetoken 255 {\textcurrency}
+\defineactivetoken 173 {\mathematics{\neq}} % Added by V.F. 07/02/2003
+\defineactivetoken 176 {\mathematics{\infty}} % Added by V.F. 07/02/2003
+\defineactivetoken 177 {\textpm} % Added by V.F. 07/02/2003
+\defineactivetoken 178 {\mathematics{\leq}} % Added by V.F. 07/02/2003
+\defineactivetoken 179 {\mathematics{\geq}} % Added by V.F. 07/02/2003
+\defineactivetoken 181 {\textmu} % Added by V.F. 07/02/2003
+\defineactivetoken 182 {\mathematics{\partial}} % Added by V.F. 07/02/2003
+\defineactivetoken 194 {\textlognot} % Added by V.F. 07/02/2003
+\defineactivetoken 195 {\textsurd} % Added by V.F. 07/02/2003
+\defineactivetoken 197 {\mathematics{\approx}} % Added by V.F. 07/02/2003
+\defineactivetoken 198 {\mathematics{\Delta}} % Added by V.F. 07/02/2003
+\defineactivetoken 214 {\textdiv} % Added by V.F. 07/02/2003
+
+\stopregime
+
+\startregime[macukr]
+
+\defineactivetoken 128 {\cyrillicA}
+\defineactivetoken 129 {\cyrillicB}
+\defineactivetoken 130 {\cyrillicV}
+\defineactivetoken 131 {\cyrillicG}
+\defineactivetoken 132 {\cyrillicD}
+\defineactivetoken 133 {\cyrillicE}
+\defineactivetoken 134 {\cyrillicZH}
+\defineactivetoken 135 {\cyrillicZ}
+\defineactivetoken 136 {\cyrillicI}
+\defineactivetoken 137 {\cyrillicISHRT}
+\defineactivetoken 138 {\cyrillicK}
+\defineactivetoken 139 {\cyrillicL}
+\defineactivetoken 140 {\cyrillicM}
+\defineactivetoken 141 {\cyrillicN}
+\defineactivetoken 142 {\cyrillicO}
+\defineactivetoken 143 {\cyrillicP}
+\defineactivetoken 144 {\cyrillicR}
+\defineactivetoken 145 {\cyrillicS}
+\defineactivetoken 146 {\cyrillicT}
+\defineactivetoken 147 {\cyrillicU}
+\defineactivetoken 148 {\cyrillicF}
+\defineactivetoken 149 {\cyrillicH}
+\defineactivetoken 150 {\cyrillicC}
+\defineactivetoken 151 {\cyrillicCH}
+\defineactivetoken 152 {\cyrillicSH}
+\defineactivetoken 153 {\cyrillicSHCH}
+\defineactivetoken 154 {\cyrillicHRDSN}
+\defineactivetoken 155 {\cyrillicERY}
+\defineactivetoken 156 {\cyrillicSFTSN}
+\defineactivetoken 157 {\cyrillicEREV}
+\defineactivetoken 158 {\cyrillicYU}
+\defineactivetoken 159 {\cyrillicYA}
+\defineactivetoken 160 {\textdag} % Changed by V.F. 07/02/2003 (was: \dag)
+\defineactivetoken 161 {\textdegree}
+\defineactivetoken 162 {\cyrillicGUP}
+\defineactivetoken 163 {\textsterling} % Changed by V.F. 07/02/2003 (was: \sterling)
+\defineactivetoken 164 {\sectionmark} % Changed by V.F. 07/02/2003 (was: \S)
+\defineactivetoken 165 {\textbullet} % Changed by V.F. 07/02/2003 (was: \bullet}
+\defineactivetoken 166 {\paragraphmark} % Changed by V.F. 07/02/2003 (was: \P)
+\defineactivetoken 167 {\cyrillicII}
+\defineactivetoken 168 {\registered}
+\defineactivetoken 169 {\copyright}
+\defineactivetoken 170 {\trademark} % Changed by V.F. 07/02/2003 (was: \texttrademark}
+\defineactivetoken 171 {\cyrillicDJE}
+\defineactivetoken 172 {\cyrillicdje}
+\defineactivetoken 174 {\'\cyrillicG}
+\defineactivetoken 175 {\'\cyrillicg}
+\defineactivetoken 180 {\cyrillicii}
+\defineactivetoken 182 {\cyrillicgup}
+\defineactivetoken 183 {\cyrillicJE}
+\defineactivetoken 184 {\cyrillicIE}
+\defineactivetoken 185 {\cyrillicie}
+\defineactivetoken 186 {\cyrillicYI}
+\defineactivetoken 187 {\cyrillicyi}
+\defineactivetoken 188 {\cyrillicLJE}
+\defineactivetoken 189 {\cyrilliclje}
+\defineactivetoken 190 {\cyrillicNJE}
+\defineactivetoken 191 {\cyrillicnje}
+\defineactivetoken 192 {\cyrillicje}
+\defineactivetoken 193 {\cyrillicDZE}
+\defineactivetoken 196 {\textflorin} % Changed by V.F. 07/02/2003 (was: \florijn)
+\defineactivetoken 199 {\leftguillemot}
+\defineactivetoken 200 {\rightguillemot}
+\defineactivetoken 201 {\textellipsis} % Changed by V.F. 07/02/2003 (was: \dots)
+\defineactivetoken 202 {\nonbreakablespace}
+\defineactivetoken 203 {\cyrillicTSHE}
+\defineactivetoken 204 {\cyrillictshe}
+\defineactivetoken 205 {\'\cyrillicK}
+\defineactivetoken 206 {\'\cyrillick}
+\defineactivetoken 207 {\cyrillicdze}
+\defineactivetoken 208 {\endash}
+\defineactivetoken 209 {\emdash}
+\defineactivetoken 210 {\upperleftdoublesixquote} % Changed by V.F. 07/02/2003
+ % (was: \upperleftsinglesixquote)
+\defineactivetoken 211 {\upperrightdoubleninequote}
+\defineactivetoken 212 {\upperleftsinglesixquote}
+\defineactivetoken 213 {\upperrightsingleninequote}
+\defineactivetoken 215 {\lowerleftdoubleninequote}
+\defineactivetoken 216 {\cyrillicUSHRT}
+\defineactivetoken 217 {\cyrillicushrt}
+\defineactivetoken 218 {\cyrillicDZHE}
+\defineactivetoken 219 {\cyrillicdzhe}
+\defineactivetoken 220 {\textnumero}
+\defineactivetoken 221 {\cyrillicYO}
+\defineactivetoken 222 {\cyrillicyo}
+\defineactivetoken 223 {\cyrillicya}
+\defineactivetoken 224 {\cyrillica}
+\defineactivetoken 225 {\cyrillicb}
+\defineactivetoken 226 {\cyrillicv}
+\defineactivetoken 227 {\cyrillicg}
+\defineactivetoken 228 {\cyrillicd}
+\defineactivetoken 229 {\cyrillice}
+\defineactivetoken 230 {\cyrilliczh}
+\defineactivetoken 231 {\cyrillicz}
+\defineactivetoken 232 {\cyrillici}
+\defineactivetoken 233 {\cyrillicishrt}
+\defineactivetoken 234 {\cyrillick}
+\defineactivetoken 235 {\cyrillicl}
+\defineactivetoken 236 {\cyrillicm}
+\defineactivetoken 237 {\cyrillicn}
+\defineactivetoken 238 {\cyrillico}
+\defineactivetoken 239 {\cyrillicp}
+\defineactivetoken 240 {\cyrillicr}
+\defineactivetoken 241 {\cyrillics}
+\defineactivetoken 242 {\cyrillict}
+\defineactivetoken 243 {\cyrillicu}
+\defineactivetoken 244 {\cyrillicf}
+\defineactivetoken 245 {\cyrillich}
+\defineactivetoken 246 {\cyrillicc}
+\defineactivetoken 247 {\cyrillicch}
+\defineactivetoken 248 {\cyrillicsh}
+\defineactivetoken 249 {\cyrillicshch}
+\defineactivetoken 250 {\cyrillichrdsn}
+\defineactivetoken 251 {\cyrillicery}
+\defineactivetoken 252 {\cyrillicsftsn}
+\defineactivetoken 253 {\cyrillicerev}
+\defineactivetoken 254 {\cyrillicyu}
+\defineactivetoken 255 {\textcurrency}
+\defineactivetoken 173 {\mathematics{\neq}} % Added by V.F. 07/02/2003
+\defineactivetoken 176 {\mathematics{\infty}} % Added by V.F. 07/02/2003
+\defineactivetoken 177 {\textpm} % Added by V.F. 07/02/2003
+\defineactivetoken 178 {\mathematics{\leq}} % Added by V.F. 07/02/2003
+\defineactivetoken 179 {\mathematics{\geq}} % Added by V.F. 07/02/2003
+\defineactivetoken 181 {\textmu} % Added by V.F. 07/02/2003
+\defineactivetoken 194 {\textlognot} % Added by V.F. 07/02/2003
+\defineactivetoken 195 {\textsurd} % Added by V.F. 07/02/2003
+\defineactivetoken 197 {\mathematics{\approx}} % Added by V.F. 07/02/2003
+\defineactivetoken 198 {\mathematics{\Delta}} % Added by V.F. 07/02/2003
+\defineactivetoken 214 {\textdiv} % Added by V.F. 07/02/2003
+
+\stopregime
+
+\endinput
diff --git a/tex/context/base/regi-def.mkii b/tex/context/base/regi-def.mkii
new file mode 100644
index 000000000..e26709c77
--- /dev/null
+++ b/tex/context/base/regi-def.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=regi-def,
+%D version=2000.20.12, % split from less verbose base file
+%D title=\CONTEXT\ Regime Macros,
+%D subtitle=Default Character Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen \& Ton Otten]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startregime[default]
+
+\dostepwiserecurse{128}{255}{1}
+ {\expanded{\defineactivetoken\recurselevel\space{\rawcharacter\recurselevel}}}%
+
+\stopregime
+
+\endinput
diff --git a/tex/context/base/regi-ibm.mkii b/tex/context/base/regi-ibm.mkii
new file mode 100644
index 000000000..1fad9545a
--- /dev/null
+++ b/tex/context/base/regi-ibm.mkii
@@ -0,0 +1,73 @@
+%D \module
+%D [ file=regi-ibm,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=The Good Old MSDOS IBM codepage,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module activates the \cap{IBM PC} high \ASCII\
+%D characters, such as and .
+
+\startregime [ibm]
+
+\defineactivetoken 145 {\aeligature} %
+\defineactivetoken 146 {\AEligature} %
+\defineactivetoken 152 {\ijligature} %
+
+\defineactivetoken 225 {\ssharp} %
+
+\defineactivetoken 160 {\aacute} %
+\defineactivetoken 130 {\eacute} %
+\defineactivetoken 144 {\Eacute} %
+\defineactivetoken 161 {\iacute} %
+\defineactivetoken 162 {\oacute} %
+\defineactivetoken 163 {\uacute} %
+
+\defineactivetoken 135 {\ccedilla} %
+\defineactivetoken 128 {\Ccedilla} %
+
+\defineactivetoken 132 {\adiaeresis} %
+\defineactivetoken 142 {\Adiaeresis} %
+\defineactivetoken 137 {\ediaeresis} %
+\defineactivetoken 139 {\idiaeresis} %
+\defineactivetoken 148 {\odiaeresis} %
+\defineactivetoken 153 {\Odiaeresis} %
+\defineactivetoken 129 {\udiaeresis} %
+\defineactivetoken 154 {\Udiaeresis} %
+
+\defineactivetoken 164 {\ntilde} %
+\defineactivetoken 165 {\Ntilde} %
+
+\defineactivetoken 134 {\aring} %
+\defineactivetoken 143 {\Aring} %
+
+\defineactivetoken 131 {\acircumflex} %
+\defineactivetoken 136 {\ecircumflex} %
+\defineactivetoken 140 {\icircumflex} %
+\defineactivetoken 147 {\ocircumflex} %
+\defineactivetoken 150 {\ucircumflex} %
+
+\defineactivetoken 133 {\agrave} %
+\defineactivetoken 138 {\egrave} %
+\defineactivetoken 141 {\igrave} %
+\defineactivetoken 149 {\ograve} %
+\defineactivetoken 151 {\ugrave} %
+
+\stopregime
+
+% todo
+
+\startregime [ibm]
+
+\defineactivetoken {\ifvmode\leavevmode\fi\leftguillemot\prewordbreak}
+\defineactivetoken {\prewordbreak\rightguillemot}
+
+\stopregime
+
+\endinput
diff --git a/tex/context/base/regi-ini.lua b/tex/context/base/regi-ini.lua
new file mode 100644
index 000000000..837397607
--- /dev/null
+++ b/tex/context/base/regi-ini.lua
@@ -0,0 +1,88 @@
+if not modules then modules = { } end modules ['regi-ini'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local char, utfchar, gsub = string.char, utf.char, string.gsub
+local texsprint = tex.sprint
+
+local ctxcatcodes = tex.ctxcatcodes
+
+--[[ldx--
+<p>Regimes take care of converting the input characters into
+<l n='utf'/> sequences. The conversion tables are loaded at
+runtime.</p>
+--ldx]]--
+
+regimes = regimes or { }
+regimes.data = regimes.data or { }
+regimes.utf = regimes.utf or { }
+regimes.synonyms = regimes.synonyms or { }
+
+storage.register("regimes/synonyms", regimes.synonyms, "regimes.synonyms")
+
+-- setmetatable(regimes.data,_empty_table_)
+
+regimes.currentregime = "utf"
+
+--[[ldx--
+<p>We will hook regime handling code into the input methods.</p>
+--ldx]]--
+
+function regimes.number(n)
+ if type(n) == "string" then return tonumber(n,16) else return n end
+end
+
+function regimes.setsynonym(synonym,target)
+ regimes.synonyms[synonym] = target
+end
+
+function regimes.truename(regime)
+ texsprint(ctxcatcodes,(regime and regimes.synonyms[synonym] or regime) or regimes.currentregime)
+end
+
+function regimes.load(regime)
+ regime = regimes.synonyms[regime] or regime
+ if not regimes.data[regime] then
+ environment.loadluafile("regi-"..regime, 1.001)
+ if regimes.data[regime] then
+ regimes.utf[regime] = { }
+ for k,v in next, regimes.data[regime] do
+ regimes.utf[regime][char(k)] = utfchar(v)
+ end
+ end
+ end
+end
+
+function regimes.translate(line,regime)
+ regime = regimes.synonyms[regime] or regime
+ if regime and line then
+ local rur = regimes.utf[regime]
+ if rur then
+ return (gsub(line,"(.)",rur)) -- () redundant
+ end
+ end
+ return line
+end
+
+function regimes.enable(regime)
+ regime = regimes.synonyms[regime] or regime
+ if regimes.data[regime] then
+ regimes.currentregime = regime
+ local translate = regimes.translate
+ resolvers.install_text_filter('input',function(s)
+ return translate(s,regime)
+ end)
+ else
+ regimes.disable()
+ end
+end
+
+function regimes.disable()
+ regimes.currentregime = "utf"
+ resolvers.install_text_filter('input',nil)
+end
diff --git a/tex/context/base/regi-ini.mkii b/tex/context/base/regi-ini.mkii
new file mode 100644
index 000000000..3cdfe2763
--- /dev/null
+++ b/tex/context/base/regi-ini.mkii
@@ -0,0 +1,248 @@
+%D \module
+%D [ file=regi-ini,
+%D version=2000.12.27, % 1998.12.03,
+%D title=\CONTEXT\ Regime 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
+
+%D Remark: regimes accumulate, so there is no explicit reset in
+%D mkii mode.
+
+%D Variables.
+
+\def\@reg@{@r@eg@} % regime prefix
+
+%D \macros
+%D {currentregime}
+
+\let\currentregime\empty
+\let\defaultregime\s!default
+
+%D Some low level inheritance stuff (mkii).
+
+\def\doautosetregime#1#2%
+ {\ifnum#2>127
+ \expanded{\defineactivetoken #2 \@EA\noexpand\csname#1\endcsname}%
+ \fi}
+
+%D \macros
+%D {startregime}
+%D
+%D Sometimes it makes sense to activate the characters in the
+%D upper half of the character table. Such a bundle of
+%D characters can be packages in a regime. Later we will see
+%D encodings (that links characters slots to glyphs) and
+%D mappings (that take care of hyphenation and case changes).
+%D
+%D When character~231 is of category code letter, it
+%D directly maps to glyph~231 (unless of course some virtual
+%D font is used). By making character~231 active, we can map
+%D it onto for instance the glyph in slot 233. This mapping
+%D can in itself be indirect, in the sense that it is for
+%D instance handled by an accent command.
+%D
+%D Regimes are implemented roughly the same as mappings, but
+%D enabled under different circumstances. In the future, the
+%D low level implementation may change.
+
+\def\startregime[#1]%
+ {\pushmacro\currentregime
+ \edef\currentregime{#1}%
+ \checkregimetoks}
+
+\def\checkregimetoks
+ {\doifundefined{\@reg@\currentregime}
+ {\@EA\newtoks\csname\@reg@\currentregime\endcsname}}
+
+\def\stopregime
+ {\popmacro\currentregime}
+
+\def\setregimetoks
+ {\checkregimetoks
+ \@EA\let\@EA\regimetoks\csname\@reg@\currentregime\endcsname}
+
+%D \macros
+%D {defineactivedecimal, defineactivedecimals, defineactivetoken}
+%D
+%D The following commands are rather ugly ones. It makes a
+%D character active and assigns it a value. When expanded,
+%D the decimal number of the character is passed as first
+%D argument.
+%D
+%D \starttyping
+%D \def\decimalcharacter#1{\message{#1 is now active}}
+%D
+%D \defineactivedecimal 122 {\decimalcharacter}
+%D
+%D \defineactivedecimals 128 to 255 as {\decimalcharacter}
+%D \stoptyping
+%D
+%D This command is typically used in coding definitions,
+%D like the \UNICODE\ one.
+
+\def\dodefineactivedecimal#1#2% \unexpanded ? pdfdoc encoding
+ {\catcode#1\active
+ \scratchcounter\uccode\activehackcode
+ \uccode\activehackcode#1\relax
+ \uppercase{\unexpanded\edef~{\noexpand#2{\number#1}}}%
+ \uccode\activehackcode\scratchcounter}
+
+\long\def\defineactivedecimal#1 #2 %
+ {\setregimetoks
+ \regimetoks\expandafter{\the\regimetoks\dodefineactivedecimal{#1}{#2}}}
+
+\long\def\defineactivedecimals#1 to #2 as #3 %
+ {\setregimetoks
+ \dostepwiserecurse{#1}{#2}\plusone
+ {\regimetoks\@EA\@EA\@EA{\@EA\the\@EA\regimetoks\@EA\dodefineactivedecimal\@EA{\recurselevel}{#3}}}}
+
+\def\doexpandactivedecimal#1%
+ {\ifnum#1>\scratchcounter
+ \expandafter\gobbletwoarguments
+ \else
+ \noexpand\dodefineactivedecimal{#1}{\the\scratchtoks}%
+ \expandafter\expandafter\expandafter\doexpandactivedecimal\expandafter
+ \fi\expandafter{\the\numexpr#1+\plusone\relax}}
+
+\long\def\defineactivedecimals#1 to #2 as #3 %
+ {\setregimetoks
+ \scratchcounter#2\relax
+ \scratchtoks{#3}%
+ \expanded{\regimetoks{\the\regimetoks\doexpandactivedecimal{#1}}}%
+ \ignorespaces}
+
+\long\def\defineactivetoken #1 #2% no {} after #2, else no kern
+ {\setregimetoks
+ \regimetoks\expandafter{\the\regimetoks\defineactivecharacter#1 {#2}}}
+
+\long\def\defineactiveinspector #1 #2% watch the missing {}
+ {\setregimetoks
+ \regimetoks\expandafter{\the\regimetoks\defineactivecharacter#1 {#2}}}
+
+%D \macros
+%D {defineregimesynonym,trueregimename}
+
+\def\defineregimesynonym
+ {\dodoubleargument\dodefineregimesynonym}
+
+\def\dodefineregimesynonym[#1][#2]%
+ {\setevalue{\@reg@:s:#1}{#2}}
+
+\def\trueregimename#1%
+ {\executeifdefined{\@reg@:s:#1}{#1}}
+
+%D \macros
+%D {useregime}
+
+\def\useregime[#1]%
+ {\processcommalist[#1]\douseregime}
+
+\def\douseregime#1%
+ {\doifundefined{\c!file\f!regimeprefix#1}%
+ {\letgvalue{\c!file\f!regimeprefix#1}\empty
+ \makeshortfilename[\truefilename{\f!regimeprefix#1}]%
+ \startreadingfile
+ \readsysfile{\shortfilename.mkii}
+ {\showmessage\m!regimes2{#1}}
+ {\showmessage\m!regimes3{#1}}%
+ \stopreadingfile}}
+
+%D \macros
+%D {enableregime,disableregime}
+
+\let\enabledregime\empty
+
+\def\enableregime[#1]%
+ {\edef\currentregime{\trueregimename{#1}}%
+ \doifelsenothing\currentregime
+ {\disableregime}
+ {\douseregime\currentregime
+ \the\executeifdefined{\@reg@\currentregime}\emptytoks}}
+
+\def\disableregime
+ {\let\currentregime\empty}
+
+%D \macros
+%D {protectregime, settoletterunlessactive, settocodeunlessactive}
+%D
+%D The next boolean is used later on to prevent unwanted
+%D catcode changes. Use it with care.
+
+\newif\ifprotectregime \protectregimetrue
+
+\def\settoletterunlessactive#1%
+ {\ifprotectregime\ifnum\catcode#1=\active\else
+ \catcode#1\@@letter
+ \fi\else
+ \catcode#1\@@letter
+ \fi}
+
+\def\settootherunlessactive#1%
+ {\ifprotectregime\ifnum\catcode#1=\active\else
+ \catcode#1=\@@other
+ \fi\else
+ \catcode#1=\@@other
+ \fi}
+
+\def\settocodeunlessactive#1#2%
+ {\ifprotectregime\ifnum\catcode#1=\active\else
+ \catcode#1=#2\relax
+ \fi\else
+ \catcode#1=#2\relax
+ \fi}
+
+%D Goodie:
+
+\def\showregime[#1]%
+ {\doifnot{#1}{utf}
+ {\bgroup
+ \enableregime[#1]%
+ \starttabulate[|l|l|l|]
+ \dostepwiserecurse{128}{255}{1}
+ {\expanded
+ {\scantokens
+ {\NC \recurselevel
+ \NC \rawcharacter\recurselevel
+ \NC \noexpand\tttf
+ \noexpand\meaning\rawcharacter\recurselevel \NC \NR}}}%
+ \stoptabulate
+ \unskip
+ \egroup}}
+
+%D Sort related:
+
+\def\dowalkregime#1%
+ {\the\executeifdefined{\@reg@#1}\emptytoks}
+
+%D Simplify matters for \XETEX.
+
+\ifnum\texengine=\xetexengine
+
+ \def\enableregime[#1]%
+ {\doifelse{#1}{utf}%
+ {\writestatus\m!regimes{mapping utf to utf-8}%
+ \XeTeXinputencoding{utf-8}}
+ {\XeTeXinputencoding{#1}}}
+
+ \def\disableregime
+ {\XeTeXinputencoding{utf-8}}
+
+ \def\loadregime[#1]{}
+ \let\walkregime \gobbleoneargument
+ \let\doautosetregime \gobbletwoarguments
+
+\else
+
+ \useregime[def,uni,utf] % we load the rest runtime
+
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/regi-ini.mkiv b/tex/context/base/regi-ini.mkiv
new file mode 100644
index 000000000..db7a224ac
--- /dev/null
+++ b/tex/context/base/regi-ini.mkiv
@@ -0,0 +1,55 @@
+%D \module
+%D [ file=regi-ini,
+%D version=2005.04.25,
+%D title=\CONTEXT\ Regime Macros,
+%D subtitle=Regime 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.
+
+\unprotect
+
+%D First some initialization code:
+
+\registerctxluafile{regi-ini}{1.001}
+
+%D \macros
+%D {currentregime}
+
+\def\currentregime{utf}
+
+%D \macros
+%D {defineregimesynonym,trueregimename}
+
+\unexpanded\def\defineregimesynonym
+ {\dodoubleargument\dodefineregimesynonym}
+
+\def\dodefineregimesynonym[#1][#2]%
+ {\ctxlua{regimes.setsynonym("#1","#2")}}
+
+\def\trueregimename#1%
+ {\ctxlua{regimes.truename("#1")}}
+
+%D \macros
+%D {useregime}
+
+\def\useregime[#1]%
+ {\processcommalist[#1]\douseregime}
+
+\def\douseregime#1%
+ {\ctxlua{regimes.load("#1")}}
+
+%D \macros
+%D {enableregime,disableregime}
+
+\def\enableregime[#1]%
+ {\edef\currentregime{\ctxlua{regimes.load("#1") regimes.enable("#1") regimes.truename()}}}
+
+\def\disableregime
+ {\edef\currentregime{\ctxlua{regimes.disable()}}}
+
+\protect \endinput
diff --git a/tex/context/base/regi-mac.mkii b/tex/context/base/regi-mac.mkii
new file mode 100644
index 000000000..b3c281ec0
--- /dev/null
+++ b/tex/context/base/regi-mac.mkii
@@ -0,0 +1,147 @@
+%D \module
+%D [ file=regi-mac,
+%D version=2001.03.18,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Mac Encoding,
+%D author={Michel Bovani \& Adam Lindsay \& Hans Hagen},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startregime [mac]
+
+\defineactivetoken 128 {\Adiaeresis}
+\defineactivetoken 129 {\Aring}
+\defineactivetoken 130 {\Ccedilla}
+\defineactivetoken 131 {\Eacute}
+\defineactivetoken 132 {\Ntilde}
+\defineactivetoken 133 {\Odiaeresis}
+\defineactivetoken 134 {\Udiaeresis}
+\defineactivetoken 135 {\aacute}
+\defineactivetoken 136 {\agrave}
+\defineactivetoken 137 {\acircumflex}
+\defineactivetoken 138 {\adiaeresis}
+\defineactivetoken 139 {\atilde}
+\defineactivetoken 140 {\aring}
+\defineactivetoken 141 {\ccedilla}
+\defineactivetoken 142 {\eacute}
+\defineactivetoken 143 {\egrave}
+\defineactivetoken 144 {\ecircumflex}
+\defineactivetoken 145 {\ediaeresis}
+\defineactivetoken 146 {\iacute}
+\defineactivetoken 147 {\igrave}
+\defineactivetoken 148 {\icircumflex}
+\defineactivetoken 149 {\idiaeresis}
+\defineactivetoken 150 {\ntilde}
+\defineactivetoken 151 {\oacute}
+\defineactivetoken 152 {\ograve}
+\defineactivetoken 153 {\ocircumflex}
+\defineactivetoken 154 {\odiaeresis}
+\defineactivetoken 155 {\otilde}
+\defineactivetoken 156 {\uacute}
+\defineactivetoken 157 {\ugrave}
+\defineactivetoken 158 {\ucircumflex}
+\defineactivetoken 159 {\udiaeresis}
+\defineactivetoken 160 {\textdag}
+\defineactivetoken 161 {\textdegree}
+\defineactivetoken 162 {\textcent}
+\defineactivetoken 163 {\textsterling}
+\defineactivetoken 164 {\sectionmark}
+\defineactivetoken 165 {\textbullet}
+\defineactivetoken 166 {\paragraphmark}
+\defineactivetoken 167 {\ssharp}
+\defineactivetoken 168 {\registered}
+\defineactivetoken 169 {\copyright}
+\defineactivetoken 170 {\trademark}
+\defineactivetoken 171 {\textacute}
+\defineactivetoken 172 {\textdiaeresis}
+\defineactivetoken 173 {\mathematics\neq}
+\defineactivetoken 174 {\AEligature}
+\defineactivetoken 175 {\Ostroke}
+\defineactivetoken 176 {\mathematics\infty}
+\defineactivetoken 177 {\textpm}
+\defineactivetoken 178 {\mathematics\leq}
+\defineactivetoken 179 {\mathematics\geq}
+\defineactivetoken 180 {\textyen}
+\defineactivetoken 181 {\textmu}
+\defineactivetoken 182 {\mathematics\partial}
+\defineactivetoken 183 {\mathematics\Sigma}
+\defineactivetoken 184 {\mathematics\Pi}
+\defineactivetoken 185 {\mathematics\pi}
+\defineactivetoken 186 {\mathematics\smallint}
+\defineactivetoken 187 {\ordfeminine}
+\defineactivetoken 188 {\ordmasculine}
+\defineactivetoken 189 {\mathematics\Omega}
+\defineactivetoken 190 {\aeligature}
+\defineactivetoken 191 {\ostroke}
+\defineactivetoken 192 {\questiondown}
+\defineactivetoken 193 {\exclamdown}
+\defineactivetoken 194 {\textlognot}
+\defineactivetoken 195 {\mathematics{\sqrt{}}}
+\defineactivetoken 196 {\textflorin}
+\defineactivetoken 197 {\mathematics\approx}
+\defineactivetoken 198 {\mathematics\Delta}
+\defineactivetoken 199 {\leftguillemot}
+\defineactivetoken 200 {\rightguillemot}
+\defineactivetoken 201 {\dots}
+\defineactivetoken 202 {\nonbreakablespace}
+\defineactivetoken 203 {\Agrave}
+\defineactivetoken 204 {\Atilde}
+\defineactivetoken 205 {\Otilde}
+\defineactivetoken 206 {\OEligature}
+\defineactivetoken 207 {\oeligature}
+\defineactivetoken 208 {\endash}
+\defineactivetoken 209 {\emdash}
+\defineactivetoken 210 {\quotedblleft}
+\defineactivetoken 211 {\quotedblright}
+\defineactivetoken 212 {\quoteleft}
+\defineactivetoken 213 {\quoteright}
+\defineactivetoken 214 {\textdiv}
+\defineactivetoken 215 {\mathematics\diamond}
+\defineactivetoken 216 {\ydiaeresis}
+\defineactivetoken 217 {\Ydiaeresis}
+\defineactivetoken 218 {\textfraction}
+\defineactivetoken 219 {\texteuro}
+\defineactivetoken 220 {\guilsingleleft}
+\defineactivetoken 221 {\guilsingleright}
+\defineactivetoken 222 {fi}
+\defineactivetoken 223 {fl}
+\defineactivetoken 224 {\textddag}
+\defineactivetoken 225 {\periodcentered}
+\defineactivetoken 226 {\quotesinglebase}
+\defineactivetoken 227 {\quotedblbase }
+\defineactivetoken 228 {\perthousand}
+\defineactivetoken 229 {\Acircumflex}
+\defineactivetoken 230 {\Ecircumflex}
+\defineactivetoken 231 {\Aacute}
+\defineactivetoken 232 {\Ediaeresis}
+\defineactivetoken 233 {\Egrave}
+\defineactivetoken 234 {\Iacute}
+\defineactivetoken 235 {\Icircumflex}
+\defineactivetoken 236 {\Idiaeresis}
+\defineactivetoken 237 {\Igrave}
+\defineactivetoken 238 {\Oacute}
+\defineactivetoken 239 {\Ocircumflex}
+%defineactivetoken 240 % No definition for Apple logo glyph yet.
+\defineactivetoken 241 {\Ograve}
+\defineactivetoken 242 {\Uacute}
+\defineactivetoken 243 {\Ucircumflex}
+\defineactivetoken 244 {\Ugrave}
+\defineactivetoken 245 {\dotlessi}
+\defineactivetoken 246 {\textcircumflex}
+\defineactivetoken 247 {\texttilde}
+\defineactivetoken 248 {\textmacron}
+\defineactivetoken 249 {\textbreve}
+\defineactivetoken 250 {\textdotaccent}
+\defineactivetoken 251 {\textring}
+\defineactivetoken 252 {\textcedilla}
+\defineactivetoken 253 {\texthungarumlaut}
+\defineactivetoken 254 {\textogonek}
+\defineactivetoken 255 {\textcaron}
+
+\stopregime
+
+\endinput
diff --git a/tex/context/base/regi-syn.tex b/tex/context/base/regi-syn.tex
new file mode 100644
index 000000000..7a8a9c146
--- /dev/null
+++ b/tex/context/base/regi-syn.tex
@@ -0,0 +1,73 @@
+%D \module
+%D [ file=regi-syn,
+%D version=2006.04.04,
+%D title=\CONTEXT\ Regime Macros,
+%D subtitle=Synonyms,
+%D author=Mojca Miklavec \& 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}{ConTeXt Regime Macros / Synonyms}
+
+\unprotect
+
+\defineregimesynonym [windows-1250] [cp1250]
+\defineregimesynonym [windows-1251] [cp1251]
+\defineregimesynonym [windows-1252] [cp1252]
+\defineregimesynonym [windows-1253] [cp1253]
+\defineregimesynonym [windows-1254] [cp1254]
+%defineregimesynonym [windows-1255] [cp1255] % not supported yet (Hebrew)
+%defineregimesynonym [windows-1256] [cp1256] % not supported yet (Arabic)
+\defineregimesynonym [windows-1257] [cp1257]
+%defineregimesynonym [windows-1258] [cp1258] % not supported yet (Vietnamese)
+
+\defineregimesynonym [il1] [8859-1]
+\defineregimesynonym [il2] [8859-2]
+\defineregimesynonym [il3] [8859-3]
+\defineregimesynonym [il4] [8859-4]
+\defineregimesynonym [il5] [8859-9]
+\defineregimesynonym [il6] [8859-10]
+\defineregimesynonym [il7] [8859-13]
+%defineregimesynonym [il8] [8859-14]
+\defineregimesynonym [il9] [8859-15]
+\defineregimesynonym [il10] [8859-16]
+
+\defineregimesynonym [iso-8859-1] [8859-1]
+\defineregimesynonym [iso-8859-2] [8859-2]
+\defineregimesynonym [iso-8859-3] [8859-3]
+\defineregimesynonym [iso-8859-4] [8859-4]
+\defineregimesynonym [iso-8859-9] [8859-9]
+\defineregimesynonym [iso-8859-10] [8859-10]
+\defineregimesynonym [iso-8859-13] [8859-13]
+%defineregimesynonym [iso-8859-14] [8859-14]
+\defineregimesynonym [iso-8859-15] [8859-15]
+\defineregimesynonym [iso-8859-16] [8859-16]
+
+\defineregimesynonym [latin1] [8859-1]
+\defineregimesynonym [latin2] [8859-2]
+\defineregimesynonym [latin3] [8859-3]
+\defineregimesynonym [latin4] [8859-4]
+\defineregimesynonym [latin5] [8859-9]
+\defineregimesynonym [latin6] [8859-10]
+\defineregimesynonym [latin7] [8859-13]
+%defineregimesynonym [latin8] [8859-14]
+\defineregimesynonym [latin9] [8859-15]
+\defineregimesynonym [latin10] [8859-16]
+
+% kind of special
+
+\defineregimesynonym [utf-8] [utf]
+\defineregimesynonym [utf8] [utf]
+
+% for historical reasons / compatibility
+
+\defineregimesynonym [windows] [cp1252]
+\defineregimesynonym [grk] [8859-7]
+\defineregimesynonym [iso88595] [8859-5]
+
+\protect \endinput
+
diff --git a/tex/context/base/regi-uni.mkii b/tex/context/base/regi-uni.mkii
new file mode 100644
index 000000000..c4d9521e9
--- /dev/null
+++ b/tex/context/base/regi-uni.mkii
@@ -0,0 +1,24 @@
+%D \module
+%D [ file=enco-uni,
+%D version=1998.10.18,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Unicode,
+%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 activates all characters in the upper range
+%D and sets them to the basic unicodehandler. Beware, this is
+%D a special purpose handler (esp for chinese encodings).
+
+\startregime[unicode]
+
+\defineactivedecimals 128 to 255 as {\handleunicodeflowglyph}
+
+\stopregime
+
+\endinput
diff --git a/tex/context/base/regi-utf.mkii b/tex/context/base/regi-utf.mkii
new file mode 100644
index 000000000..b3423b15a
--- /dev/null
+++ b/tex/context/base/regi-utf.mkii
@@ -0,0 +1,52 @@
+%D \module
+%D [ file=regi-utf,
+%D version=2002.12.03,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=UTF-8,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifnum\texengine>\pdftexengine
+ \expandafter \endinput
+\fi
+
+%D This regime activates the characters $>192$ and let them
+%D handle \UTF\ encoded content streams. This regime runs on
+%D top of the \type {unic} modules. We use an active inspector
+%D instead of a active token handler because here we don't want
+%D the \type {{}}. We only support this in \ETEX.
+
+% ÀÁÂÃÄÅàáâãäå
+% ÆÇæç
+% ÈÉÊËèéêë
+% ÌÍÎÏÞìíîïþ
+% Ðð
+% Ññ
+% ÒÓÔÕÖòóôõö
+% Øø
+% ÙÚÛÜùúû
+% Ýýÿ
+% ß
+% Ţţ
+
+\unprotect
+
+\startregime[utf]
+
+\dostepwiserecurse{192}{223}{1}
+ {\expanded{\defineactiveinspector{\recurselevel} {\noexpand\utftwouniglph {\recurselevel}}}} % space delimited
+
+\dostepwiserecurse{224}{239}{1}
+ {\expanded{\defineactiveinspector{\recurselevel} {\noexpand\utfthreeuniglph{\recurselevel}}}} % space delimited
+
+\dostepwiserecurse{240}{247}{1}
+ {\expanded{\defineactiveinspector{\recurselevel} {\noexpand\utffouruniglph {\recurselevel}}}} % space delimited
+
+\stopregime
+
+\protect \endinput
diff --git a/tex/context/base/regi-vis.mkii b/tex/context/base/regi-vis.mkii
new file mode 100644
index 000000000..d1071354f
--- /dev/null
+++ b/tex/context/base/regi-vis.mkii
@@ -0,0 +1,158 @@
+%D \module
+%D [ file=regi-vis,
+%D version=2005.12.26,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=viscii,
+%D author=script-generated,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Support for VISCII input encoding (regime) for Vietnamese.
+%D
+%D Usage:
+%D \type{\enableregime[vis]}
+
+
+\startregime[viscii]
+
+\defineactivetoken 2 {\Abrevehook} % 1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+\defineactivetoken 5 {\Abrevetilde} % 1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+\defineactivetoken 6 {\Acircumflextilde} % 1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+\defineactivetoken 20 {\Yhook} % 1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+\defineactivetoken 25 {\Ytilde} % 1EF8 LATIN CAPITAL LETTER Y WITH TILDE
+\defineactivetoken 30 {\Ydotbelow} % 1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW
+\defineactivetoken 128 {\Adotbelow} % 1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW
+\defineactivetoken 129 {\Abreveacute} % 1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+\defineactivetoken 130 {\Abrevegrave} % 1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+\defineactivetoken 131 {\Abrevedotbelow} % 1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+\defineactivetoken 132 {\Acircumflexacute} % 1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+\defineactivetoken 133 {\Acircumflexgrave} % 1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+\defineactivetoken 134 {\Acircumflexhook} % 1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+\defineactivetoken 135 {\Acircumflexdotbelow} % 1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+\defineactivetoken 136 {\Etilde} % 1EBC LATIN CAPITAL LETTER E WITH TILDE
+\defineactivetoken 137 {\Edotbelow} % 1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW
+\defineactivetoken 138 {\Ecircumflexacute} % 1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+\defineactivetoken 139 {\Ecircumflexgrave} % 1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+\defineactivetoken 140 {\Ecircumflexhook} % 1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+\defineactivetoken 141 {\Ecircumflextilde} % 1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+\defineactivetoken 142 {\Ecircumflexdotbelow} % 1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+\defineactivetoken 143 {\Ocircumflexacute} % 1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+\defineactivetoken 144 {\Ocircumflexgrave} % 1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+\defineactivetoken 145 {\Ocircumflexhook} % 1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+\defineactivetoken 146 {\Ocircumflextilde} % 1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+\defineactivetoken 147 {\Ocircumflexdotbelow} % 1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+\defineactivetoken 148 {\Ohorndotbelow} % 1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+\defineactivetoken 149 {\Ohornacute} % 1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+\defineactivetoken 150 {\Ohorngrave} % 1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+\defineactivetoken 151 {\Ohornhook} % 1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+\defineactivetoken 152 {\Idotbelow} % 1ECA LATIN CAPITAL LETTER I WITH DOT BELOW
+\defineactivetoken 153 {\Ohook} % 1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE
+\defineactivetoken 154 {\Odotbelow} % 1ECC LATIN CAPITAL LETTER O WITH DOT BELOW
+\defineactivetoken 155 {\Ihook} % 1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE
+\defineactivetoken 156 {\Uhook} % 1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE
+\defineactivetoken 157 {\Utilde} % 0168 LATIN CAPITAL LETTER U WITH TILDE
+\defineactivetoken 158 {\Udotbelow} % 1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW
+\defineactivetoken 159 {\Ygrave} % 1EF2 LATIN CAPITAL LETTER Y WITH GRAVE
+\defineactivetoken 160 {\Otilde} % 00D5 LATIN CAPITAL LETTER O WITH TILDE
+\defineactivetoken 161 {\abreveacute} % 1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE
+\defineactivetoken 162 {\abrevegrave} % 1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE
+\defineactivetoken 163 {\abrevedotbelow} % 1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+\defineactivetoken 164 {\acircumflexacute} % 1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+\defineactivetoken 165 {\acircumflexgrave} % 1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+\defineactivetoken 166 {\Acircumflexhook} % 1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+\defineactivetoken 167 {\acircumflexdotbelow} % 1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+\defineactivetoken 168 {\etilde} % 1EBD LATIN SMALL LETTER E WITH TILDE
+\defineactivetoken 169 {\edotbelow} % 1EB9 LATIN SMALL LETTER E WITH DOT BELOW
+\defineactivetoken 170 {\ecircumflexacute} % 1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+\defineactivetoken 171 {\ecircumflexgrave} % 1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+\defineactivetoken 172 {\ecircumflexhook} % 1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+\defineactivetoken 173 {\ecircumflextilde} % 1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+\defineactivetoken 174 {\ecircumflexdotbelow} % 1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+\defineactivetoken 175 {\ocircumflexacute} % 1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+\defineactivetoken 176 {\ocircumflexgrave} % 1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+\defineactivetoken 177 {\ocircumflexhook} % 1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+\defineactivetoken 178 {\ocircumflextilde} % 1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+\defineactivetoken 179 {\Ohorntilde} % 1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE
+\defineactivetoken 180 {\Ohorn} % 01A0 LATIN CAPITAL LETTER O WITH HORN
+\defineactivetoken 181 {\ocircumflexdotbelow} % 1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+\defineactivetoken 182 {\ohorngrave} % 1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE
+\defineactivetoken 183 {\ohornhook} % 1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+\defineactivetoken 184 {\idotbelow} % 1ECB LATIN SMALL LETTER I WITH DOT BELOW
+\defineactivetoken 185 {\Uhorndotbelow} % 1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+\defineactivetoken 186 {\Uhornacute} % 1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+\defineactivetoken 187 {\Uhorngrave} % 1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+\defineactivetoken 188 {\Uhornhook} % 1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+\defineactivetoken 189 {\ohorn} % 01A1 LATIN SMALL LETTER O WITH HORN
+\defineactivetoken 190 {\ohornacute} % 1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE
+\defineactivetoken 191 {\Uhorn} % 01AF LATIN CAPITAL LETTER U WITH HORN
+\defineactivetoken 192 {\Agrave} % 00C0 LATIN CAPITAL LETTER A WITH GRAVE
+\defineactivetoken 193 {\Aacute} % 00C1 LATIN CAPITAL LETTER A WITH ACUTE
+\defineactivetoken 194 {\Acircumflex} % 00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 195 {\Atilde} % 00C3 LATIN CAPITAL LETTER A WITH TILDE
+\defineactivetoken 196 {\Ahook} % 1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE
+\defineactivetoken 197 {\Abreve} % 0102 LATIN CAPITAL LETTER A WITH BREVE
+\defineactivetoken 198 {\abrevehook} % 1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+\defineactivetoken 199 {\abrevetilde} % 1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE
+\defineactivetoken 200 {\Egrave} % 00C8 LATIN CAPITAL LETTER E WITH GRAVE
+\defineactivetoken 201 {\Eacute} % 00C9 LATIN CAPITAL LETTER E WITH ACUTE
+\defineactivetoken 202 {\Ecircumflex} % 00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 203 {\Ehook} % 1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE
+\defineactivetoken 204 {\Igrave} % 00CC LATIN CAPITAL LETTER I WITH GRAVE
+\defineactivetoken 205 {\Iacute} % 00CD LATIN CAPITAL LETTER I WITH ACUTE
+\defineactivetoken 206 {\Itilde} % 0128 LATIN CAPITAL LETTER I WITH TILDE
+\defineactivetoken 207 {\ygrave} % 1EF3 LATIN SMALL LETTER Y WITH GRAVE
+\defineactivetoken 208 {\Dstroke} % 0110 LATIN CAPITAL LETTER D WITH STROKE
+\defineactivetoken 209 {\uhornacute} % 1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE
+\defineactivetoken 210 {\Ograve} % 00D2 LATIN CAPITAL LETTER O WITH GRAVE
+\defineactivetoken 211 {\Oacute} % 00D3 LATIN CAPITAL LETTER O WITH ACUTE
+\defineactivetoken 212 {\Ocircumflex} % 00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 213 {\adotbelow} % 1EA1 LATIN SMALL LETTER A WITH DOT BELOW
+\defineactivetoken 214 {\yhook} % 1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE
+\defineactivetoken 215 {\uhorngrave} % 1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE
+\defineactivetoken 216 {\uhornhook} % 1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+\defineactivetoken 217 {\Ugrave} % 00D9 LATIN CAPITAL LETTER U WITH GRAVE
+\defineactivetoken 218 {\Uacute} % 00DA LATIN CAPITAL LETTER U WITH ACUTE
+\defineactivetoken 219 {\ytilde} % 1EF9 LATIN SMALL LETTER Y WITH TILDE
+\defineactivetoken 220 {\ydotbelow} % 1EF5 LATIN SMALL LETTER Y WITH DOT BELOW
+\defineactivetoken 221 {\Yacute} % 00DD LATIN CAPITAL LETTER Y WITH ACUTE
+\defineactivetoken 222 {\ohorntilde} % 1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE
+\defineactivetoken 223 {\uhorn} % 01B0 LATIN SMALL LETTER U WITH HORN
+\defineactivetoken 224 {\agrave} % 00E0 LATIN SMALL LETTER A WITH GRAVE
+\defineactivetoken 225 {\aacute} % 00E1 LATIN SMALL LETTER A WITH ACUTE
+\defineactivetoken 226 {\acircumflex} % 00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
+\defineactivetoken 227 {\atilde} % 00E3 LATIN SMALL LETTER A WITH TILDE
+\defineactivetoken 228 {\ahook} % 1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE
+\defineactivetoken 229 {\abreve} % 0103 LATIN SMALL LETTER A WITH BREVE
+\defineactivetoken 230 {\uhorntilde} % 1EEF LATIN SMALL LETTER U WITH HORN AND TILDE
+\defineactivetoken 231 {\acircumflextilde} % 1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+\defineactivetoken 232 {\egrave} % 00E8 LATIN SMALL LETTER E WITH GRAVE
+\defineactivetoken 233 {\eacute} % 00E9 LATIN SMALL LETTER E WITH ACUTE
+\defineactivetoken 234 {\ecircumflex} % 00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
+\defineactivetoken 235 {\ehook} % 1EBB LATIN SMALL LETTER E WITH HOOK ABOVE
+\defineactivetoken 236 {\igrave} % 00EC LATIN SMALL LETTER I WITH GRAVE
+\defineactivetoken 237 {\iacute} % 00ED LATIN SMALL LETTER I WITH ACUTE
+\defineactivetoken 238 {\itilde} % 0129 LATIN SMALL LETTER I WITH TILDE
+\defineactivetoken 239 {\ihook} % 1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE
+\defineactivetoken 240 {\dstroke} % 0111 LATIN SMALL LETTER D WITH STROKE
+\defineactivetoken 241 {\uhorndotbelow} % 1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+\defineactivetoken 242 {\ograve} % 00F2 LATIN SMALL LETTER O WITH GRAVE
+\defineactivetoken 243 {\oacute} % 00F3 LATIN SMALL LETTER O WITH ACUTE
+\defineactivetoken 244 {\ocircumflex} % 00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
+\defineactivetoken 245 {\otilde} % 00F5 LATIN SMALL LETTER O WITH TILDE
+\defineactivetoken 246 {\ohook} % 1ECF LATIN SMALL LETTER O WITH HOOK ABOVE
+\defineactivetoken 247 {\odotbelow} % 1ECD LATIN SMALL LETTER O WITH DOT BELOW
+\defineactivetoken 248 {\udotbelow} % 1EE5 LATIN SMALL LETTER U WITH DOT BELOW
+\defineactivetoken 249 {\ugrave} % 00F9 LATIN SMALL LETTER U WITH GRAVE
+\defineactivetoken 250 {\uacute} % 00FA LATIN SMALL LETTER U WITH ACUTE
+\defineactivetoken 251 {\utilde} % 0169 LATIN SMALL LETTER U WITH TILDE
+\defineactivetoken 252 {\uhook} % 1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE
+\defineactivetoken 253 {\yacute} % 00FD LATIN SMALL LETTER Y WITH ACUTE
+\defineactivetoken 254 {\ohorndotbelow} % 1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+\defineactivetoken 255 {\Uhorntilde} % 1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE
+
+\stopregime
+
diff --git a/tex/context/base/rlxcache.rlx b/tex/context/base/rlxcache.rlx
new file mode 100644
index 000000000..006e5feac
--- /dev/null
+++ b/tex/context/base/rlxcache.rlx
@@ -0,0 +1,71 @@
+<?xml version='1.0 standalone='yes'?>
+
+<rl:manipulators>
+
+ <rl:manipulator name='pdf' suffix='eps'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.eps</rl:old>
+ <rl:new><rl:value name='cache' default='rlxcache'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath="<rl:value name='path'/>"
+ --outputpath="<rl:value name='cache' default='.'/>"
+ "<rl:value name='file' method='nosuffix'/>.eps"
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='svg'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.svg</rl:old>
+ <rl:new><rl:value name='cache' default='rlxcache'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath="<rl:value name='path'/>"
+ --outputpath="<rl:value name='cache' default='.'/>"
+ "<rl:value name='file' method='nosuffix'/>.svg"
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='svgz'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.svgz</rl:old>
+ <rl:new><rl:value name='cache' default='rlxcache'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath="<rl:value name='path'/>"
+ --outputpath="<rl:value name='cache' default='.'/>"
+ "<rl:value name='file' method='nosuffix'/>.svgz"
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='gif'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.gif</rl:old>
+ <rl:new><rl:value name='cache' default='rlxcache'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath="<rl:value name='path'/>"
+ --outputpath="<rl:value name='cache' default='.'/>"
+ "<rl:value name='file' method='nosuffix'/>.gif"
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='tif'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.tif</rl:old>
+ <rl:new><rl:value name='cache' default='rlxcache'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath="<rl:value name='path'/>"
+ --outputpath="<rl:value name='cache' default='.'/>"
+ "<rl:value name='file' method='nosuffix'/>.tif"
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='tiff'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.tiff</rl:old>
+ <rl:new><rl:value name='cache' default='rlxcache'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath="<rl:value name='path'/>"
+ --outputpath="<rl:value name='cache' default='.'/>"
+ "<rl:value name='file' method='nosuffix'/>.tiff"
+ </rl:step>
+ </rl:manipulator>
+
+</rl:manipulators>
diff --git a/tex/context/base/rlxtools.rlx b/tex/context/base/rlxtools.rlx
new file mode 100644
index 000000000..b230c6d5b
--- /dev/null
+++ b/tex/context/base/rlxtools.rlx
@@ -0,0 +1,136 @@
+<?xml version='1.0 standalone='yes'?>
+
+<rl:manipulators>
+
+ <!-- normally the file tag will also have a suffix! -->
+
+ <!-- pstopdf will be made independent of the example framework -->
+
+ <!-- rl:manipulator name='pdf' suffix='svg'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file'/></rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ inkscape
+ --without-gui
+ --print="&gt;<rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.ps"
+ <rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.svg
+ </rl:step>
+ <rl:step>
+ texmfstart pstopdf
+ <rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.ps
+ <rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.pdf
+ </rl:step>
+ </rl:manipulator -->
+
+ <!-- rl:manipulator name='pdf' suffix='svgz'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file'/></rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ inkscape
+ --without-gui
+ --print="&gt;<rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.ps"
+ <rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.svgz
+ </rl:step>
+ <rl:step>
+ texmfstart pstopdf
+ <rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.ps
+ <rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.pdf
+ </rl:step>
+ </rl:manipulator -->
+
+ <rl:manipulator name='pdf' suffix='eps'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.eps</rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ <rl:value name='old'/>
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='svg'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.svg</rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ <rl:value name='old'/>
+ <rl:value name='new'/>
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='svgz'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.svgz</rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ <rl:value name='old'/>
+ <rl:value name='new'/>
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='lowres' suffix='pdf'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file'/></rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file'/></rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert --method=4
+ --inputpath=<rl:value name='path'/>
+ --outputpath=<rl:value name='path'/>/<rl:value name='prefix'/>
+ <rl:value name='file'/>
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='medres' suffix='pdf'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file'/></rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file'/></rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert --method=4
+ --inputpath=<rl:value name='path'/>
+ --outputpath=<rl:value name='path'/>/<rl:value name='prefix'/>
+ <rl:value name='file'/>
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='gif'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.gif</rl:old>
+ <rl:new><rl:value name='cache' default='.'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath=<rl:value name='path'/>
+ --outputpath=<rl:value name='cache' default='.'/>
+ <rl:value name='file' method='nosuffix'/>.gif
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='tif'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.tif</rl:old>
+ <rl:new><rl:value name='cache' default='.'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath=<rl:value name='path'/>
+ --outputpath=<rl:value name='cache' default='.'/>
+ <rl:value name='file' method='nosuffix'/>.tif
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='pdf' suffix='tiff'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file' method='nosuffix'/>.tiff</rl:old>
+ <rl:new><rl:value name='cache' default='.'/>/<rl:value name='file' method='nosuffix'/>.pdf</rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert
+ --inputpath=<rl:value name='path'/>
+ --outputpath=<rl:value name='cache' default='.'/>
+ <rl:value name='file' method='nosuffix'/>.tiff
+ </rl:step>
+ </rl:manipulator>
+
+ <rl:manipulator name='cropped' suffix='pdf'>
+ <rl:old><rl:value name='path'/>/<rl:value name='file'/></rl:old>
+ <rl:new><rl:value name='path'/>/<rl:value name='prefix'/><rl:value name='file'/></rl:new>
+ <rl:step>
+ texmfstart pstopdf --convert --method=3
+ --inputpath=<rl:value name='path'/>
+ --outputpath=<rl:value name='path'/>/<rl:value name='prefix'/>
+ <rl:value name='file'/>
+ </rl:step>
+ </rl:manipulator>
+
+</rl:manipulators>
diff --git a/tex/context/base/s-abr-01.tex b/tex/context/base/s-abr-01.tex
new file mode 100644
index 000000000..a55eb95f1
--- /dev/null
+++ b/tex/context/base/s-abr-01.tex
@@ -0,0 +1,324 @@
+%D \module
+%D [ file=s-abr-01,
+%D version=1996.01.01,
+%D title=\CONTEXT\ Style File,
+%D subtitle=General Abbreviations 1,
+%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
+
+\setupsorting[logo][\c!style=\v!capital]
+
+\setupcapitals[\c!title=\v!no]
+
+\protect
+
+\logo [MKI] {MkI}
+\logo [MKII] {MkII}
+\logo [MKIII] {MkIII}
+\logo [MKIV] {MkIV}
+
+%logo [FGA] {fga}
+%logo [FGBBS] {fgbbs}
+\logo [ACROBAT] {Acro\-bat}
+\logo [AFM] {afm}
+\logo [API] {api}
+\logo [ALEPH] {Aleph} % {\mathematics{\aleph}}
+\logo [ALGOL] {ALGOL}
+\logo [AMS] {ams}
+\logo [AMSLATEX] {\AmSLaTeX}
+\logo [AMSTEX] {\AmSTeX}
+\logo [ANSI] {ansi}
+\logo [ARABTEX] {Arab\TeX}
+\logo [ASCII] {ascii}
+\logo [ASCIITEX] {ascii\TeX}
+\logo [BACHOTEX] {Bacho\TeX}
+\logo [BIBTEX] {bib\TeX}
+\logo [BLUESKY] {BlueSky}
+\logo [BMP] {bmp}
+\logo [BSD] {bsd}
+\logo [CCODE] {C}
+\logo [CALCMATH] {CalcMath}
+\logo [CD] {cd}
+\logo [CPU] {cpu}
+\logo [CDROM] {cdrom}
+\logo [CID] {cid}
+\logo [CJK] {cjk}
+\logo [CMR] {cmr}
+\logo [CMYK] {cmyk}
+\logo [CODHOST] {CodHost}
+\logo [CONTEXT] {\ConTeXt}
+\logo [CSS] {css}
+\logo [CTAN] {ctan}
+\logo [CTXTOOLS] {ctxtools}
+\logo [CWEB] {cweb}
+\logo [DANTE] {Dante}
+\logo [DISTILLER] {distiller}
+\logo [DRATEX] {Dra\TeX}
+\logo [DSC] {dsc}
+\logo [DTD] {dtd}
+\logo [DTK] {dtk}
+\logo [DTP] {dtp}
+\logo [DVD] {dvd}
+\logo [DVI] {dvi}
+\logo [DVIPDFM] {dvipdfm}
+\logo [DVIPDFMX] {dvipdfmx}
+\logo [DVIPOS] {dvipos}
+\logo [DVIPS] {dvips}
+\logo [DVIPSONE] {dvipsone}
+\logo [DVISCR] {dviscr}
+\logo [DVIWINDO] {dviwindo}
+\logo [EC] {ec}
+\logo [EIFFEL] {Eiffel}
+\logo [EMACS] {emacs}
+\logo [EMTEX] {em\TeX}
+\logo [ENCODING] {enc}
+\logo [ENCTEX] {enc\TeX}
+\logo [EPS] {eps}
+\logo [ETEX] {\eTeX}
+\logo [EUROBACHOTEX] {EuroBacho\TeX}
+\logo [EUROMATH] {EuroMath}
+\logo [EUROTEX] {Euro\TeX}
+\logo [EXAMPLE] {eXaMpLe}
+\logo [EXAMPLED] {exampled}
+\logo [EXAMPLEQ] {exampleq}
+\logo [EXAMPLER] {exampler}
+\logo [EXAMPLET] {examplet}
+\logo [EXAMPLEX] {examplex}
+\logo [EXIMPLE] {eXiMpLe}
+\logo [FAQ] {faq}
+\logo [FDF] {fdf}
+\logo [FONTFORGE] {FontForge}
+\logo [FOXET] {foXet}
+\logo [FPTEX] {fp\TeX}
+\logo [FREEBSD] {FreeBSD}
+\logo [FTP] {ftp}
+\logo [GHOSTSCRIPT]{Ghost\-script}
+\logo [GHOSTVIEW] {Ghost\-view}
+\logo [GIF] {gif}
+\logo [GNU] {gnu}
+\logo [GNUPLOT] {gnuplot}
+\logo [GS] {Ghost\-Script}
+\logo [GUST] {Gust}
+\logo [GWTEX] {gw\TeX}
+\logo [HSB] {hsb}
+\logo [HTML] {html}
+\logo [HTTP] {http}
+\logo [HZ] {hz}
+\logo [IBM] {ibm}
+\logo [IMAGEMAGICK]{ImageMagick}
+\logo [INITEX] {ini\TeX}
+\logo [INRSTEX] {inrs\TeX}
+\logo [IO] {io}
+\logo [IRCNET] {IRCnet}
+\logo [ISO] {iso}
+\logo [JAVA] {Java}
+\logo [JAVASCRIPT] {Java\-Script}
+\logo [JPEG] {jpeg}
+\logo [JPG] {jpg}
+\logo [KPATHSEA] {kpathsea}
+\logo [KPSE] {kpse}
+\logo [KPSEWHICH] {kpsewhich}
+\logo [MKTEXLSR] {mktexlsr}
+\logo [LAMSTEX] {\LamSTeX}
+\logo [LATEX] {\LaTeX}
+\logo [LATEXTE] {\LaTeX2e}
+\logo [LATEXTN] {\LaTeX2.09}
+\logo [LINUX] {linux}
+\logo [LISP] {Lisp}
+\logo [LPEG] {lpeg}
+\logo [LUA] {Lua}
+\logo [LUAJIT] {LuaJIT}
+\logo [LUATEX] {Lua\TeX}
+\logo [LUATOOLS] {luatools}
+\logo [MACOSX] {MacOSX}
+\logo [MACROTEX] {Macro\TeX}
+\logo [MAKEMPY] {MakeMPY}
+\logo [MAPPING] {map}
+\logo [MAPS] {Maps}
+\logo [MATHML] {MathML}
+\logo [METAFONT] {\MetaFont}
+\logo [METAPOST] {\MetaPost}
+\logo [METATEX] {Meta\TeX}
+\logo [MIKTEX] {Mik\TeX}
+\logo [MLTEX] {ml\TeX}
+\logo [METATYPE] {MetaType1}
+\logo [MODULA] {Modula}
+\logo [MOV] {mov}
+\logo [MPS] {mps}
+\logo [MPTOPDF] {mptopdf}
+\logo [MPLIB] {mplib}
+\logo [MSDOS] {msdos}
+\logo [MSWINDOWS] {MS~Windows}
+\logo [MTXRUN] {mtxrun}
+\logo [MTXTOOLS] {mtxtools}
+\logo [NETPBM] {NetPBM}
+\logo [NTG] {ntg}
+\logo [NTS] {nts}
+\logo [OFM] {ofm}
+\logo [OMEGA] {Omega}
+\logo [OPENMATH] {OpenMath}
+\logo [OPENTYPE] {OpenType}
+\logo [OPI] {opi}
+\logo [OTF] {otf}
+\logo [OTP] {otp}
+\logo [OVF] {ovf}
+\logo [PASCAL] {Pascal}
+\logo [PCTEX] {pc\TeX}
+\logo [PDF] {pdf}
+\logo [PDFETEX] {pdfe\TeX}
+\logo [PDFTEX] {pdf\TeX}
+\logo [PDFTOOLS] {pdftools}
+\logo [PDFTOPS] {pdftops}
+\logo [PERL] {Perl}
+\logo [PERLTK] {Perl/Tk}
+\logo [PICTEX] {\PiCTeX}
+\logo [PK] {pk}
+\logo [PLAIN] {Plain}
+\logo [PNG] {png}
+\logo [POSIX] {posix}
+\logo [POSTSCRIPT] {Post\-Script}
+\logo [PPCHTEX] {\PPCHTeX}
+\logo [PRAGMA] {Pragma ADE}
+\logo [PRESS] {press}
+\logo [PRIFIL] {prifil}
+\logo [PS] {Post\-Script}
+\logo [PSCHECK] {pscheck}
+\logo [PSTOEDIT] {pstoedit}
+\logo [PSTOPAGE] {pstopage}
+\logo [PSTOPDF] {pstopdf}
+\logo [PSTRICKS] {pstricks}
+\logo [RAM] {ram}
+\logo [READER] {Acro\-bat Reader}
+\logo [RELAXNG] {Relax\kern.125emNG}
+\logo [RGB] {rgb}
+\logo [RLXTOOLS] {rlxtools}
+\logo [RUBY] {Ruby}
+\logo [SCITE] {SciTE}
+\logo [SGML] {sgml}
+\logo [SI] {si}
+\logo [SQL] {sql}
+\logo [SVG] {svg}
+\logo [TABLE] {\TaBlE}
+\logo [TCPIP] {tcp/ip}
+\logo [TDS] {tds} % no sc te
+\logo [TETEX] {te\TeX} % no sc te
+\logo [TEX] {\TeX}
+\logo [TEXADRES] {\TeX adress}
+\logo [TEXBASE] {\TeX base}
+\logo [TEXEDIT] {\TeX edit}
+\logo [TEXEXEC] {\TeX exec}
+\logo [TEXFONT] {\TeX font}
+\logo [TEXFORM] {\TeX form}
+\logo [TEXLIVE] {\TeX Live}
+\logo [TEXLUA] {\TeX Lua}
+\logo [TEXMF] {texmf}
+\logo [TEXMFSTART] {texmfstart}
+\logo [TEXNL] {tex-nl}
+\logo [TEXSHOW] {\TeX show}
+\logo [TEXSPELL] {\TeX spell}
+\logo [TEXGYRE] {\TeX\ Gyre}
+\logo [TEXSYNC] {texsync}
+\logo [TEXTMATE] {TextMate}
+\logo [TEXTOOLS] {\TeX tools}
+\logo [TEXUTIL] {\TeX util}
+\logo [TEXWORK] {\TeX work}
+\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT}
+\logo [TFM] {tfm}
+\logo [TIF] {tif}
+\logo [TIFF] {tiff}
+\logo [TIFFINFO] {tiffinfo}
+\logo [TIFFTAGS] {tifftags}
+\logo [TMFTOOLS] {tmftools}
+\logo [TPIC] {tpic}
+\logo [TPM] {tpm}
+\logo [TRUETYPE] {TrueType}
+\logo [TTF] {ttf}
+\logo [TUG] {tug}
+\logo [TUGBOAT] {Tug\-Boat}
+\logo [TUGNEWS] {Tug\-News}
+\logo [TYPEONE] {Type1}
+\logo [UCS] {ucs}
+\logo [UNICODE] {Uni\-code}
+\logo [UNIX] {Unix}
+\logo [URI] {uri}
+\logo [URL] {url}
+\logo [USA] {usa}
+\logo [USENET] {usenet}
+\logo [UTF] {utf}
+\logo [UTF] {utf}
+\logo [VF] {vf}
+\logo [WDT] {wdt}
+\logo [WEB] {web}
+\logo [WEBC] {web2c}
+\logo [WIKI] {Wiki}
+\logo [WINDOWS] {Windows}
+\logo [WINNT] {WinNT}
+\logo [WINNX] {Win9x}
+\logo [WWW] {www}
+\logo [WYSIWYG] {wysiwyg}
+\logo [XDVI] {Xdvi}
+\logo [XETEX] {\XeTeX}
+\logo [XFDF] {xfdf}
+\logo [XHTML] {xhtml}
+\logo [XINDY] {Xindy}
+\logo [XML] {xml}
+\logo [XPATH] {xpath}
+\logo [XMLTOOLS] {xmltools}
+\logo [XPDFETEX] {xpdfe\TeX}
+\logo [XSL] {xsl}
+\logo [XSLFO] {xsl-fo}
+\logo [XSLT] {xslt}
+\logo [XSLTPROC] {xsltproc}
+\logo [XYPIC] {XYPIC} % wrong logo
+\logo [YandY] {y\&y}
+\logo [ZIP] {zip}
+
+\def\METAFUN {\MetaFun}
+
+\logo [METAFUN] {\MetaFun}
+
+\def\SystemSpecialA#1{$\langle\it#1\rangle$}
+\def\SystemSpecialB#1{{\tttf<#1>}}
+
+\def\CATCODE {\SystemSpecialA{catcode}}
+\def\CATCODES {\SystemSpecialA{catcodes}}
+\def\DIMENSION {\SystemSpecialA{dimension}}
+\def\DIMENSIONS {\SystemSpecialA{dimensions}}
+\def\COUNTER {\SystemSpecialA{counter}}
+\def\COUNTERS {\SystemSpecialA{counters}}
+\def\HBOX {\SystemSpecialA{hbox}}
+\def\HBOXES {\SystemSpecialA{hboxes}}
+\def\VBOX {\SystemSpecialA{vbox}}
+\def\VBOXES {\SystemSpecialA{vboxes}}
+\def\BOX {\SystemSpecialA{box}}
+\def\BOXES {\SystemSpecialA{boxes}}
+\def\TOKENLIST {\SystemSpecialA{token list}}
+\def\TOKENLISTS {\SystemSpecialA{token lists}}
+\def\NEWLINE {\SystemSpecialA{newline}}
+\def\SKIP {\SystemSpecialA{skip}}
+\def\SKIPS {\SystemSpecialA{skips}}
+\def\MUSKIP {\SystemSpecialA{muskip}}
+\def\MUSKIPS {\SystemSpecialA{muskips}}
+\def\MARK {\SystemSpecialA{mark}}
+\def\MARKS {\SystemSpecialA{marks}}
+
+\def\SPACE {\SystemSpecialB{space}}
+\def\EOF {\SystemSpecialB{eof}}
+\def\TAB {\SystemSpecialB{tab}}
+\def\NEWPAGE {\SystemSpecialB{newpage}}
+\def\NEWLINE {\SystemSpecialB{newline}}
+
+\doifmodeelse {mkiv} {
+ \unexpanded\def\THANH{H\agrave n Th\ecircumflexacute\ Th\agrave nh}
+} {
+ \unexpanded\def\THANH{H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh}
+}
+
+\endinput
diff --git a/tex/context/base/s-abr-02.tex b/tex/context/base/s-abr-02.tex
new file mode 100644
index 000000000..005559ef3
--- /dev/null
+++ b/tex/context/base/s-abr-02.tex
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=s-abr-02,
+%D version=1996.01.01,
+%D title=\CONTEXT\ Style File,
+%D subtitle=General Abbreviations 2,
+%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.
+
+\usemodule[abr-01]
+
+\unprotect
+
+\setupsorting[logo][\c!style=\v!smallcaps]
+
+\setupcapitals[\c!title=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/s-abr-03.tex b/tex/context/base/s-abr-03.tex
new file mode 100644
index 000000000..43068b9a5
--- /dev/null
+++ b/tex/context/base/s-abr-03.tex
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=s-abr-03,
+%D version=1998.08.10,
+%D title=\CONTEXT\ Style File,
+%D subtitle=General Abbreviations 3,
+%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.
+
+\usemodule[abr-01]
+
+\unprotect
+
+\setupsorting[logo][\c!style=\v!WORD]
+
+\protect
+
+\endinput
diff --git a/tex/context/base/s-cdr-01.tex b/tex/context/base/s-cdr-01.tex
new file mode 100644
index 000000000..80103936d
--- /dev/null
+++ b/tex/context/base/s-cdr-01.tex
@@ -0,0 +1,131 @@
+%D \module
+%D [ file=s-cdr-01,
+%D version=2001.2.07, % maybe earlier
+%D title=\CONTEXT\ Style File,
+%D subtitle=CDROM Cover,
+%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.
+
+\def\PDFMPformoffset{20cm}
+
+\definepapersize
+ [CDcover]
+ [width=12.5cm,
+ height=12.4cm]
+
+\definelayout
+ [CDcover]
+ [topspace=5mm,
+ backspace=5mm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setuparranging
+ [2SIDE]
+
+\setuppapersize
+ [CDcover]
+ [A4,landscape]
+
+\setuplayout
+ [CDcover]
+
+\setuplayout
+ [location=middle]
+
+\setupcolors
+ [state=start]
+
+\setupbackgrounds
+ [leftpage]
+ [background=leftcover]
+
+\setupbackgrounds
+ [rightpage]
+ [background=rightcover]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\defineoverlay[leftcover] [\useMPgraphic{leftcover}]
+\defineoverlay[rightcover][\useMPgraphic{rightcover}]
+
+\startuseMPgraphic{leftcover}
+ StartPage ;
+ pickup pencircle scaled .5pt ;
+ draw
+ bottomboundary Page &
+ rightboundary Page &
+ topboundary Page ;
+ draw
+ bottomboundary (Page enlarged 3mm) &
+ rightboundary (Page enlarged 3mm) &
+ topboundary (Page enlarged 3mm) dashed evenly ;
+ StopPage ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{rightcover}
+ StartPage ;
+ pickup pencircle scaled .5pt ;
+ draw
+ topboundary Page &
+ leftboundary Page &
+ bottomboundary Page ;
+ draw
+ topboundary (Page enlarged 3mm) &
+ leftboundary (Page enlarged 3mm) &
+ bottomboundary (Page enlarged 3mm) dashed evenly ;
+ draw
+ bottomboundary Page --
+ lrcorner Page shifted (-5mm,-1cm) --
+ llcorner Page shifted ( 5mm,-1cm) -- cycle ;
+ draw
+ topboundary Page --
+ ulcorner Page shifted ( 5mm, 1cm) --
+ urcorner Page shifted (-5mm, 1cm) -- cycle ;
+ StopPage ;
+ setbounds currentpicture to Page ;
+\stopuseMPgraphic
+
+\setupmakeup
+ [standard]
+ [doublesided=no,page=]
+
+\setuplayout
+ [topspace=5mm,
+ backspace=5mm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\defineframedtext
+ [maintext]
+ [background={foreground,color},
+ backgroundcolor=a-bit-white,
+ frame=off,
+ before=,
+ after=,
+ align=right,
+ strut=no,
+ height=fit,
+ width=\textheight]
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+ \startstandardmakeup
+ page 1
+ \stopstandardmakeup
+
+ \startstandardmakeup
+ page 2
+ \stopstandardmakeup
+\stoptext
diff --git a/tex/context/base/s-chi-00.tex b/tex/context/base/s-chi-00.tex
new file mode 100644
index 000000000..bec86f6d2
--- /dev/null
+++ b/tex/context/base/s-chi-00.tex
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=s-chi-00,
+%D version=1999.12.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Basic Chinese Style,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D suggestions=Wang Lei,
+%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.
+
+\input font-chi.mkii % faster than \setupbodyfont[chi]
+
+\mainlanguage [cn]
+
+\unprotect
+
+\setupsection [\s!section-1] [\c!headconversion=\s!chinese]
+\setupsection [\s!section-2] [\c!headconversion=\s!chinese]
+\setupsection [\s!section-3] [\c!headconversion=\s!chinese]
+
+\setupsection [\s!section-2] [\v!appendix\c!conversion=]
+
+\setuphead [\v!chapter] [\c!distance=1.25em]
+\setuphead [\v!section] [\c!distance=1.25em]
+\setuphead [\v!subsection] [\c!distance=1.00em]
+
+\setuplist [\v!chapter] [\c!headlabel=\v!yes,\c!headconversion=\v!yes,\c!width=5em]
+\setuplist [\v!section] [\c!headlabel=\v!yes,\c!headconversion=\v!yes,\c!width=5em]
+
+\setupmarking [\v!chapter\v!number] [\c!headlabel=\v!yes,\c!headconversion=\v!yes]
+\setupmarking [\v!section\v!number] [\c!headlabel=\v!yes,\c!headconversion=\v!yes]
+
+\setuplabeltext [cn] [\v!subsection={\symbol[S]\kern.25em}]
+\setuplabeltext [cn] [\v!subsubsection={\symbol[S]\kern.25em}]
+\setuplabeltext [cn] [\v!subsubsubsection={\symbol[S]\kern.25em}]
+\setuplabeltext [cn] [\v!subsubsubsubsection={\symbol[S]\kern.25em}]
+
+% nog taalonafhankelijk maken -> \e!tabel enz
+
+\definereferenceformat [intable] [\c!label=\v!table]
+\definereferenceformat [infigure] [\c!label=\v!figure]
+\definereferenceformat [inchapter] [\c!label=\v!chapter]
+\definereferenceformat [insection] [\c!label=\v!section]
+
+% important
+
+\setuptyping[\c!tab=\v!no]
+
+%D This module (and font support) adapts to the \UTF\ regime, but you
+%D need to enable \UTF\ first!
+%D
+%D \starttyping
+%D \enableregime[utf] \usemodule[chi-00]
+%D
+%D \starttext
+%D
+%D 兡也包因沘氓侷柵苗孫孫財
+%D 崧淫設弼琶跑愍窟榜蒸奭稽
+%D 霄瓢館縲擻鼕孃魔釁佉沎岠
+%D 狋垚柛胅娭涘罞偟惈牻荺傒
+%D 焱菏酡廅滘絺赩塴榗箂踃嬁
+%D 澕蓴醊獧螗餟燱螬駸礑鎞瀧
+%D 鄿瀯騬醹躕鱕
+%D
+%D \blank
+%D
+%D Wang Lei is written as: 王磊
+%D
+%D \stoptext
+%D \stoptyping
+
+\protect \endinput
diff --git a/tex/context/base/s-faq-00.tex b/tex/context/base/s-faq-00.tex
new file mode 100644
index 000000000..11859936c
--- /dev/null
+++ b/tex/context/base/s-faq-00.tex
@@ -0,0 +1,93 @@
+%D \module
+%D [ file=s-faq-00,
+%D version=1997.21.08,
+%D title=\CONTEXT\ Style File,
+%D subtitle=FAQ Common Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[abr-01]
+
+\defineblock[question]
+\defineblock[answer]
+
+\def\ScreenFAQ {fs-\TagOfFAQ-\LanguageOfFAQ}
+\def\PaperFAQ {fp-\TagOfFAQ-\LanguageOfFAQ}
+\def\FileNameOfFAQ {fa-\TagOfFAQ-\LanguageOfFAQ}
+
+\language
+ [\HyphenationOfFAQ]
+
+\setupwhitespace
+ [big]
+
+\setupbodyfont
+ [ams]
+
+\setuptolerance
+ [tolerant]
+
+\setupregister
+ [index]
+ [indicator=no]
+
+\setupframedtexts
+ [width=\hsize]
+
+\setupblock
+ [question]
+ [before=\startframedtext,
+ after=\stopframedtext]
+
+\setupblock
+ [answer]
+ [after=\EndAnswer]
+
+\def\EndAnswer {}
+
+\def\AuthorOfFAQ {}
+\def\IndexOfFAQ {}
+
+\def\FrequentlyAskedQuestion#1#2%
+ {\page
+ \doglobal\increment\CurrentNOfFAQ
+ \pagereference[faq:\CurrentNOfFAQ]
+ \gdef\IndexOfFAQ{#1}
+ \gdef\AuthorOfFAQ{#2}}
+
+\newcounter\CurrentNOfFAQ
+
+\setuplabeltext [nl] [FAQ=Vaak gestelde vragen]
+\setuplabeltext [du] [FAQ=Oft gestellte Fragen]
+\setuplabeltext [en] [FAQ=Frequently Asked Questions]
+
+\setuplabeltext [nl] [about=over]
+\setuplabeltext [du] [about=zu]
+\setuplabeltext [en] [about=about]
+
+\setuplabeltext [nl] [version=Versie]
+\setuplabeltext [du] [version=Version]
+\setuplabeltext [en] [version=Version]
+
+\setuplabeltext [nl] [goback=terug]
+\setuplabeltext [du] [goback=zur\"uck]
+\setuplabeltext [en] [goback=go back]
+
+\setuplabeltext [nl] [paper=papier]
+\setuplabeltext [du] [paper=Papier]
+\setuplabeltext [en] [paper=paper]
+
+\setuplabeltext [nl] [faqs=FAQ's]
+\setuplabeltext [du] [faqs=FAQs]
+\setuplabeltext [en] [faqs=FAQ's]
+
+\setuplabeltext [nl] [index=index]
+\setuplabeltext [du] [index=Index]
+\setuplabeltext [en] [index=index]
+
+\endinput
diff --git a/tex/context/base/s-faq-01.tex b/tex/context/base/s-faq-01.tex
new file mode 100644
index 000000000..8c116e0f7
--- /dev/null
+++ b/tex/context/base/s-faq-01.tex
@@ -0,0 +1,215 @@
+%D \module
+%D [ file=s-faq-01,
+%D version=1997.21.08,
+%D title=\CONTEXT\ Style File,
+%D subtitle=FAQ Interactive Version,
+%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.
+
+\usemodule[faq-00]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=.5cm,
+ backspace=.5cm,
+ margin=0pt,
+ height=fit,
+ header=0pt,
+ width=fit,
+ footer=0pt,
+ bottomdistance=12pt,
+ bottom=18pt]
+
+\setupinteractionscreen
+ [width=fit,
+ height=fit,
+ option=max]
+
+\setupinteraction
+ [state=start,
+ page=yes,
+ color=darkred,
+ contrastcolor=black,
+ menu=on]
+
+\setupcolors
+ [state=start]
+
+\setupbackgrounds
+ [state=repeat]
+
+\setupbackgrounds
+ [page]
+ [offset=3pt]
+
+\setupbackgrounds
+ [text]
+ [text]
+ [background={screen,go-on}]
+
+\setupbackgrounds
+ [bottom]
+ [text]
+ [background=screen]
+
+\setupframedtexts
+ [background=MyFrame,
+ backgroundcolor=white,
+ framecolor=darkred,
+ frame=overlay]
+
+\defineoverlay[go-on][\overlaybutton{forward}]
+
+\useexternaldocument
+ [paperfaq]
+ [\PaperFAQ]
+ []
+
+\setupregister
+ [index]
+ [coupling=yes,
+ unknownreference=none,
+ interaction=text]
+
+\coupleregister
+ [index]
+
+\defineinteractionmenu [bottom 1] [bottom] [state=stop]
+\defineinteractionmenu [bottom 2] [bottom] [state=stop]
+
+\setupinteractionmenu
+ [bottom, bottom 1, bottom 2]
+ [background=MyFrame,
+ backgroundcolor=white,
+ color=black,
+ contrastcolor=black,
+ frame=overlay,
+ framecolor=darkred,
+ dummy=yes,
+ middle=\hskip1em,
+ height=\bottomheight,
+ distance=overlay]
+
+\setupinteractionmenu
+ [bottom 1]
+ [{\hfill},
+ {\labeltext{paper}[paperfaq::]},
+ {\labeltext{goback}[PreviousJump]},
+ {\labeltext{faqs}[faqs]},
+ {\labeltext{index}[index]},
+ {\gobackwardcharacter[previouspage]},
+ {\goforwardcharacter[nextpage]}]
+
+\setupinteractionmenu
+ [bottom 2]
+ [{\CurrentIndexOfFAQ},
+ {\hfill},
+ {\labeltext{paper}[paperfaq::faq:\CurrentNOfFAQ]},
+ {\labeltext{goback}[PreviousJump]},
+ {\labeltext{faqs}[faqs]},
+ {\labeltext{index}[index]},
+ {\gobackwardcharacter[previouspage]},
+ {\goforwardcharacter[nextpage]}]
+
+\def\CurrentIndexOfFAQ%
+ {\bgroup
+ \setupinteraction[color=]%
+ \menubox[bottom]%
+ {\hskip-.5em\def\index{\hskip.5em\coupledindex}\IndexOfFAQ}%
+ \egroup}
+
+\setupinteractionmenu
+ [bottom 1]
+ [state=start]
+
+\def\EndAnswer
+ {\vfill
+ \bgroup
+ \tfx\setstrut
+ \framed
+ [frame=overlay,
+ framecolor=darkred,
+ background=MyFrame,
+ backgroundcolor=white]
+ {\AuthorOfFAQ}
+ \egroup}
+
+\def\TitlePage
+ {\startstandardmakeup
+ \blank[3*big]
+ \midaligned{\bfd \labeltext{FAQ}}
+ \blank[3*big]
+ \midaligned{\bfd \labeltext{about} \NameOfFAQ}
+ \blank[3*big]
+ \midaligned{\bfb \labeltext{version}: \currentdate}
+ \blank[3*big]
+ \midaligned{\tta \ListOfFAQ}
+ \vfill
+ \midaligned{\tta pragma@wxs.nl}
+ \blank[3*big]
+ \stopstandardmakeup}
+
+\def\StartReadingFAQ
+ {\setupinteractionmenu[bottom 1][state=stop]
+ \setupinteractionmenu[bottom 2][state=start]
+ \page}
+
+\def\StopReadingFAQ
+ {\page
+ \setupinteractionmenu[bottom 2][state=stop]
+ \setupinteractionmenu[bottom 1][state=start]}
+
+\def\FileWithFAQs
+ {\StartReadingFAQ
+ \input \FileNameOfFAQ \relax
+ \StopReadingFAQ}
+
+\def\IndexPage
+ {\page
+ \def\CurrentIndexOfFAQ{}
+ \def\NameOfFAQ{}
+ \pagereference[index]
+ \placeregister[index]
+ \page}
+
+\def\BeginFAQ
+ {\doglobal\increment\CurrentNOfFAQ
+ \setbox0=\vbox\bgroup
+ \setupframedtexts[before=,after=,linecorrection=off]
+ \startframedtext}
+
+\def\EndFAQ
+ {\stopframedtext
+ \egroup
+ \button
+ [color=,contrastcolor=,frame=overlay,offset=overlay]
+ {\copy0}
+ [faq:\CurrentNOfFAQ]
+ \vskip6pt}
+
+\def\AllFAQs
+ {\page
+ \def\CurrentIndexOfFAQ{}
+ \def\NameOfFAQ{}
+ \newcounter\CurrentNOfFAQ
+ \setupblock[question][before=\BeginFAQ,after=\EndFAQ]
+ \pagereference[faqs]
+ \useblocks[question]}
+
+\startuniqueMPgraphic{Frame}
+ path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+ pickup pencircle scaled 2pt ;
+ fill p withcolor \MPcolor{\overlaycolor} ;
+ draw p withcolor \MPcolor{\overlaylinecolor} ;
+\stopuniqueMPgraphic
+
+\defineoverlay[MyFrame][\uniqueMPgraphic{Frame}]
+
+\endinput
diff --git a/tex/context/base/s-faq-02.tex b/tex/context/base/s-faq-02.tex
new file mode 100644
index 000000000..02287bde4
--- /dev/null
+++ b/tex/context/base/s-faq-02.tex
@@ -0,0 +1,63 @@
+%D \module
+%D [ file=s-faq-02,
+%D version=1997.21.08,
+%D title=\CONTEXT\ Style File,
+%D subtitle=FAQ Paper Version,
+%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.
+
+\usemodule[faq-00]
+
+\setuplayout
+ [header=0pt]
+
+\setuppagenumbering
+ [location=]
+
+\setupfootertexts
+ [\labeltext{FAQ}: \NameOfFAQ\IndexOfFAQ][pagenumber]
+
+\def\EndAnswer%
+ {\blank[2*big]
+ \page[no]
+ (\AuthorOfFAQ)}
+
+\def\TitlePage%
+ {\startstandardmakeup
+ \midaligned{\bfd \labeltext{FAQ}}
+ \blank[3*big]
+ \midaligned{\bfd \labeltext{about} \NameOfFAQ}
+ \blank[3*big]
+ \midaligned{\bfb \labeltext{version}: \currentdate}
+ \blank[3*big]
+ \midaligned{\tta \ListOfFAQ}
+ \vfill
+ \midaligned{\tta pragma@wxs.nl}
+ \blank[3*big]
+ \stopstandardmakeup}
+
+\def\StartReadingFAQ
+ {\page}
+
+\def\StopReadingFAQ
+ {\page}
+
+\def\FileWithFAQs
+ {\StartReadingFAQ
+ \input \FileNameOfFAQ \relax
+ \StopReadingFAQ}
+
+\def\IndexPage
+ {\page
+ \setupfootertexts[\labeltext{index}][]
+ \placeregister[index]}
+
+\def\AllFAQs
+ {}
+
+\endinput
diff --git a/tex/context/base/s-faq-03.tex b/tex/context/base/s-faq-03.tex
new file mode 100644
index 000000000..4f556f713
--- /dev/null
+++ b/tex/context/base/s-faq-03.tex
@@ -0,0 +1,70 @@
+%D \module
+%D [ file=s-faq-03,
+%D version=1997.21.08,
+%D title=\CONTEXT\ Style File,
+%D subtitle=FAQ General Framework,
+%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.
+
+\def\StartFAQ[#1]%
+ {\getrawparameters[FAQ][name=,label=,language=,hyphenation=,url=,#1]
+ \let\NameOfFAQ \FAQname
+ \let\TagOfFAQ \FAQlabel
+ \let\LanguageOfFAQ \FAQlanguage
+ \let\HyphenationOfFAQ \FAQhyphenation
+ \let\ListOfFAQ \FAQurl
+ \doifmodeelse{screen}
+ {\usemodule[faq-01]}
+ {\usemodule[faq-02]}
+ \starttext
+ \TitlePage
+ \StartReadingFAQ}
+
+\def\StopFAQ
+ {\StopReadingFAQ
+ \IndexPage
+ \AllFAQs
+ \stoptext}
+
+\def\ProcessFAQ[#1]%
+ {\StartFAQ[#1]
+ \input \FileNameOfFAQ \relax
+ \StopFAQ}
+
+% for old times sake:
+
+\def\PDFscreenFAQ \name #1 \tag #2 \language #3 \hyphenation #4 \list #5
+ {\def\NameOfFAQ {#1}
+ \def\TagOfFAQ {#2}
+ \def\LanguageOfFAQ {#3}
+ \def\HyphenationOfFAQ {#4}
+ \def\ListOfFAQ {#5}
+ \usemodule[faq-01]
+ \starttext
+ \TitlePage
+ \FileWithFAQs
+ \IndexPage
+ \AllFAQs
+ \stoptext}
+
+\def\PDFpaperFAQ \name #1 \tag #2 \language #3 \hyphenation #4 \list #5
+ {\def\NameOfFAQ {#1}
+ \def\TagOfFAQ {#2}
+ \def\LanguageOfFAQ {#3}
+ \def\HyphenationOfFAQ {#4}
+ \def\ListOfFAQ {#5}
+ \usemodule[faq-02]
+ \starttext
+ \TitlePage
+ \FileWithFAQs
+ \IndexPage
+ \stoptext}
+
+\let\DVIpaperFAQ\PDFscreenFAQ
+
+\endinput
diff --git a/tex/context/base/s-fnt-01.tex b/tex/context/base/s-fnt-01.tex
new file mode 100644
index 000000000..69c8efab9
--- /dev/null
+++ b/tex/context/base/s-fnt-01.tex
@@ -0,0 +1,61 @@
+%D \module
+%D [ file=s-fnt-01,
+%D version=2001.08.22,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Font Environment 1,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file is used by the \type {texfont.pl} installation
+%D script. It is of no use for \MKIV.
+
+%D Modes: compact
+
+\dontcomplain
+
+\setupbodyfont
+ [10pt]
+
+\setuplayout
+ [backspace=30pt,
+ topspace=30pt,
+ footer=0pt,
+ header=36pt,
+ width=middle,
+ height=middle]
+
+\setupcolors
+ [state=start]
+
+\def\ShowFont
+ {\dotripleempty\doShowFont}
+
+\def\doShowFont[#1][#2][#3]%
+ {\doifsomething{#1}
+ {\bgroup
+ \ifthirdargument
+ \definefontsynonym[WhateverName][#2][encoding=#3]
+ \definefont[WhateverFont][WhateverName]
+ \setupheadertexts[\tttf#2\quad#1\quad#3]
+ \WhateverFont
+ \setupinterlinespace
+ \showfont[WhateverName]
+ \showligatures[WhateverName]
+ \doifnotmode{compact}{\showaccents\showcharacters}
+ \else
+ \definefontsynonym[WhateverName][#2]
+ \definefont[WhateverFont][WhateverName]
+ \setupheadertexts[\tttf#2\quad#1\quad(special font)]
+ \WhateverFont
+ \setupinterlinespace
+ \showfont[WhateverName]
+ \fi
+ \page
+ \egroup}}
+
+\endinput
diff --git a/tex/context/base/s-fnt-02.tex b/tex/context/base/s-fnt-02.tex
new file mode 100644
index 000000000..69f976102
--- /dev/null
+++ b/tex/context/base/s-fnt-02.tex
@@ -0,0 +1,133 @@
+% output=pdftex modes=demo
+
+% nice example:
+%
+% \usemodule[s-fnt-02]
+%
+% \usetypescriptfile[type-ghz.tex]
+%
+% \usetypescript [sans] [optima,optima-nova] [texnansi]
+%
+% \setvariables
+% [glyphs]
+% [name-1=OptimaLT,
+% name-2=OptimaNovaLT-Regular]
+%
+% \starttext
+%
+% \setups[show-glyphs]
+%
+% \stoptext
+%
+% see end, for other example (or run texexec s-fnt-02 --mode=demo)
+
+\setvariables
+ [glyphs]
+ [frame=on,
+ name-1=cmr10,
+ name-2=cmtt10,
+ map-1=,
+ map-2=]
+
+\setuppapersize[S4][S4]
+
+\setupcolors[state=start]
+
+\setuplayout[page]
+
+\definecolor[Gray] [s=.2]
+\definecolor[ColorNone][s=1,t=.5,a=1]
+\definecolor[ColorOne] [r=1,t=.5,a=1]
+\definecolor[ColorTwo] [g=1,t=.5,a=1]
+\definecolor[BackOne] [b=1,t=.5,a=1]
+\definecolor[BackTwo] [r=1,g=1,t=.5,a=1]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=Gray]
+
+\startsetups[show-glyphs]
+
+ \doifnothing{\getvariable{glyphs}{name-1}}{\endinput}
+ \doifnothing{\getvariable{glyphs}{name-2}}{\endinput}
+
+ \doifsomething{\getvariable{glyphs}{map-1}}{\loadmapfile[\getvariable{glyphs}{map-1}]}
+ \doifsomething{\getvariable{glyphs}{map-2}}{\loadmapfile[\getvariable{glyphs}{map-2}]}
+
+ \definefont[FontOne][\getvariable{glyphs}{name-1} at 280pt]
+ \definefont[FontTwo][\getvariable{glyphs}{name-2} at 280pt]
+
+% \dostepwiserecurse{0}{255}{1}
+% {\doiffontcharelse{\getvariable{glyphs}{name-1}}{\recurselevel}
+% {\doiffontcharelse{\getvariable{glyphs}{name-2}}{\recurselevel}
+% {\startstandardmakeup
+% \doifelse{\getvariable{glyphs}{frame}}{on} % too many box calculations when off, but who cares
+% {\boxrulewidth=2pt}
+% {\boxrulewidth=0pt}
+% \setbox 0=\hbox{\white\ruledhbox{\FontOne \char\recurselevel}}
+% \setbox 2=\hbox{\white\ruledhbox{\FontTwo \char\recurselevel}}
+% \setbox 4=\hbox{\FontOne \ColorOne \char\recurselevel}
+% \setbox 6=\hbox{\FontTwo \ColorTwo \char\recurselevel}
+% \setbox 8=\hbox{\BackOne \ruledhbox{\FontOne \phantom{\char\recurselevel}}}
+% \setbox10=\hbox{\BackTwo \ruledhbox{\FontTwo \phantom{\char\recurselevel}}}
+% \vfill
+% \hbox{\dostepwiserecurse{0}{10}{2}{\hbox to \hsize{\hss\box\recurselevel\hss}\hskip-\hsize}}
+% \vfill
+% \tttf
+% \setstrut
+% \hbox to \hsize{\strut\hss
+% {\ColorOne \getvariable{glyphs}{name-1}}\quad
+% {\ColorTwo \getvariable{glyphs}{name-2}}\quad
+% {\ColorNone char \recurselevel }\hss}
+% \stopstandardmakeup}
+% {}}
+% {}}
+
+ \dostepwiserecurse{0}{255}{1}
+ {\donefalse
+ \doiffontcharelse{\getvariable{glyphs}{name-1}}{\recurselevel}{\donetrue}{}%
+ \doiffontcharelse{\getvariable{glyphs}{name-2}}{\recurselevel}{\donetrue}{}%
+ \ifdone
+ \startstandardmakeup
+ \doifelse{\getvariable{glyphs}{frame}}{on} % too many box calculations when off, but who cares
+ {\boxrulewidth=2pt}
+ {\boxrulewidth=0pt}
+ \setbox 0=\hbox{\white\ruledhbox{\FontOne \char\recurselevel}}
+ \setbox 2=\hbox{\white\ruledhbox{\FontTwo \char\recurselevel}}
+ \setbox 4=\hbox{\FontOne \ColorOne \char\recurselevel}
+ \setbox 6=\hbox{\FontTwo \ColorTwo \char\recurselevel}
+ \setbox 8=\hbox{\BackOne \ruledhbox{\FontOne \phantom{\char\recurselevel}}}
+ \setbox10=\hbox{\BackTwo \ruledhbox{\FontTwo \phantom{\char\recurselevel}}}
+ \vfill
+ \hbox{\dostepwiserecurse{0}{10}{2}{\hbox to \hsize{\hss\box\recurselevel\hss}\hskip-\hsize}}
+ \vfill
+ \tttf
+ \setstrut
+ \hbox to \hsize{\strut\hss
+ {\ColorOne \getvariable{glyphs}{name-1}}\quad
+ {\ColorTwo \getvariable{glyphs}{name-2}}\quad
+ {\ColorNone char \recurselevel }\hss}
+ \stopstandardmakeup
+ \fi}
+
+\stopsetups
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+ \setupencoding[default=ec]
+
+ \loadmapline [=][aer10 <cmr10.pfb]
+ \loadmapline [=][\defaultencoding-lmr10 <\defaultencoding.enc <lmr10.pfb]
+
+ \setvariables
+ [glyphs]
+ [frame=on,
+ name-1=aer10,
+ name-2=\defaultencoding-lmr10]
+
+ \setups[show-glyphs]
+
+\stoptext
diff --git a/tex/context/base/s-fnt-10.tex b/tex/context/base/s-fnt-10.tex
new file mode 100644
index 000000000..216d9d232
--- /dev/null
+++ b/tex/context/base/s-fnt-10.tex
@@ -0,0 +1,163 @@
+%D \module
+%D [ file=s-fnt-01,
+%D version=2006.10.10, % guess
+%D title=\CONTEXT\ Style File,
+%D subtitle=Listing Glyphs in Large Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+local format, sprint = string.format, tex.sprint
+
+function fonts.otf.show_all()
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata and tfmdata.shared then
+ local otfdata = tfmdata.shared.otfdata
+ if otfdata and otfdata.luatex then
+ local unicodes = otfdata.luatex.unicodes
+ sprint(tex.ctxcatcodes,format("\\starttabulate[|l|r|c|]"))
+ for i, name in ipairs(table.sortedkeys(unicodes)) do
+ local unicode = unicodes[name]
+ if unicode >= 0 then
+ sprint(tex.ctxcatcodes,format("\\NC %s \\NC %s \\NC \\char%s \\NC\\NR",name,unicode,unicode))
+ end
+ end
+ sprint(tex.ctxcatcodes,format("\\stoptabulate"))
+ end
+ end
+end
+
+function fonts.show_all()
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata then
+ local chars = tfmdata.characters
+ local descs = tfmdata.descriptions or { }
+ local data = characters.data
+ sprint(tex.ctxcatcodes,format("\\setuptabulate[header=repeat]"))
+ sprint(tex.ctxcatcodes,format("\\starttabulatehead"))
+ sprint(tex.ctxcatcodes,"\\NC\\bf unicode\\NC\\bf visual\\NC\\bf index\\NC\\bf glyph\\NC\\bf adobe\\NC\\bf context\\NC\\NR")
+ sprint(tex.ctxcatcodes,"\\HL")
+ sprint(tex.ctxcatcodes,format("\\stoptabulatehead"))
+ sprint(tex.ctxcatcodes,format("\\starttabulate[|l|c|l|p|p|p|]"))
+ for k, unicode in ipairs(table.sortedkeys(chars)) do
+-- for unicode, _ in table.sortedpairs(chars) do
+ if unicode >= 0 then
+ local chr, des, dat = chars[unicode], descs[unicode], data[unicode]
+ local index = chr.index or 0
+ local cname = (dat and dat.contextname) or ""
+ local aname = (dat and dat.adobename) or ""
+ local gname = (des and des.name) or ""
+ local mname = dat and dat.mathname
+ if type(mname) ~= "string" then
+ mname = ""
+ end
+ local mspec = dat and dat.mathspec
+ if mspec then
+ for m=1,#mspec do
+ local n = mspec[m].name
+ if n then
+ if mname == "" then
+ mname = n
+ else
+ mname = mname .. " " .. n
+ end
+ end
+ end
+ end
+ if mname ~= "" then
+ mname = "m: " .. mname
+ if cname ~= "" then
+ cname = cname .. " " .. mname
+ else
+ cname = mname
+ end
+ end
+ sprint(tex.ctxcatcodes,format("\\NC\\tttf U+%05X\\NC\\char%s\\NC\\tttf %05X\\NC\\tttf %s\\NC\\tttf %s\\NC\\tttf %s\\NC\\NR",unicode,unicode,index,gname,aname,cname))
+ end
+ end
+ sprint(tex.ctxcatcodes,format("\\stoptabulate"))
+ else
+ sprint(tex.ctxcatcodes,"problems")
+ end
+end
+
+function fonts.show_glyphs()
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata then
+ local chars = tfmdata.characters
+ for k, v in ipairs(table.sortedkeys(chars)) do
+ if v >=0 then
+ sprint(tex.ctxcatcodes,format("\\dontleavehmode{\\strut\\char%s}\\endgraf",v))
+ end
+ end
+ end
+end
+\stopluacode
+
+\def\ShowCompleteFont#1#2#3%
+ {\bgroup
+ \page
+ \font\TestFont=#1 at #2
+ \setuplayout[style=\TestFont]
+ \setupheadertexts[]
+ \setupfootertexts[#1 -- \pagenumber]
+ \setupfootertexts[pagenumber]
+ \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm]
+ \TestFont
+ \nonknuthmode
+ \startcolumns[n=#3]
+ \TestFont
+ \ctxlua { fonts.show_all() }
+ \stopcolumns
+ \page
+ \egroup}
+
+\def\ShowAllGlyphs#1#2#3%
+ {\bgroup
+ \page
+ \font\TestFontA=#1 at 12pt
+ \font\TestFontB=#1 at #2
+ \setuplayout[style=\TestFontA]
+ \setupheadertexts[]
+ \setupfootertexts[#1 -- \pagenumber]
+ \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm,header=1cm,footer=2cm]
+ \TestFontB \setupinterlinespace[line=1.2\dimexpr#2\relax] \raggedcenter
+ \nonknuthmode
+ \startcolumns[n=#3]
+ \TestFontB
+ \ctxlua { fonts.show_glyphs() }
+ \stopcolumns
+ \page
+ \egroup}
+
+\endinput
+
+\starttext
+
+% \ShowCompleteFont{name:dejavusansmono}{10pt}{2}
+% \ShowCompleteFont{name:dejavuserif}{10pt}{2}
+% \ShowCompleteFont{name:officinasansbookitcregular}{10pt}{2}
+% \ShowCompleteFont{name:officinaserifbookitcregular}{10pt}{2}
+% \ShowCompleteFont{name:serpentineserifeflight}{10pt}{2}
+% \ShowCompleteFont{name:lmtypewriter10-regular}{10pt}{2}
+% \ShowCompleteFont{lt55485}{10pt}{2}
+% \ShowCompleteFont{lmr10}{10pt}{2}
+% \ShowCompleteFont{lbr}{10pt}{2}
+% \ShowCompleteFont{name:Cambria}{10pt}{2}
+% \ShowCompleteFont{name:CambriaMath}{10pt}{2}
+% \ShowCompleteFont{name:texgyrepagella-regular}{10pt}{2}
+% \ShowCompleteFont{name:texgyrechorus-mediumitalic}{10pt}{2}
+% \ShowAllGlyphs {name:texgyrepagella-regular} {48pt}{2}
+% \ShowAllGlyphs {name:texgyrechorus-mediumitalic}{48pt}{2}
+% \ShowCompleteFont{name:euler10-regular}{10pt}{2}
+
+% \ShowCompleteFont{name:palatinosansinformalcombold}{20pt}{2}
+% \ShowCompleteFont{name:palatinonovaregular}{11pt}{2}
+% \ShowCompleteFont{name:optimanovaltregular}{11pt}{2}
+
+\stoptext
diff --git a/tex/context/base/s-fnt-11.tex b/tex/context/base/s-fnt-11.tex
new file mode 100644
index 000000000..8f855cc72
--- /dev/null
+++ b/tex/context/base/s-fnt-11.tex
@@ -0,0 +1,61 @@
+%D \module
+%D [ file=s-fnt-11,
+%D version=2006.02.01, % or so
+%D title=\CONTEXT\ Style File,
+%D subtitle=Listing Installed Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This code usd to be in the kernel but since it's hardly used
+%D it's now a module.
+%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
+
+\startluacode
+function fonts.names.table(pattern,reload,all)
+ local t = fonts.names.list(pattern,reload)
+ if t then
+ tex.sprint(tex.ctxcatcodes,"\\start\\nonknuthmode\\starttabulate[|T|T|T|T|T|]")
+ tex.sprint(tex.ctxcatcodes,"\\NC hashname\\NC type\\NC fontname\\NC filename\\NC\\NR\\HL")
+ for v,tv in table.sortedpairs(t) do
+ local kind, name, file = tv[1], tv[2], tv[3]
+ if all or v == string.lower(name) then
+ if kind and name and file then
+ tex.sprint(tex.ctxcatcodes,string.format("\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR",v,kind,name,file))
+ else
+ logs.report("font table", "skipping %s", v)
+ end
+ end
+ end
+ tex.sprint(tex.ctxcatcodes,"\\stoptabulate\\stop")
+ end
+end
+\stopluacode
+
+\unprotect
+
+\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}
+
+\protect \endinput
diff --git a/tex/context/base/s-fnt-20.tex b/tex/context/base/s-fnt-20.tex
new file mode 100644
index 000000000..a57c0ba47
--- /dev/null
+++ b/tex/context/base/s-fnt-20.tex
@@ -0,0 +1,140 @@
+%D \module
+%D [ file=s-fnt-20,
+%D version=2009.01.10,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Tracing Feature Application (1),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file is used by Idris and me in the process of getting the
+%D best arabic fonts getting rendered best. As such it might change.
+
+% \setvariables
+% [otftracker]
+% [title=Reverse Chaining,
+% figure=test-003-volt.pdf,
+% font=husayni,
+% sample={ببب بببب ببببب بببببب}]
+
+\def\checkedfeature#1#2{\ifnum\featureattribute{#1}=\zerocount#2\else#1\fi}
+
+% we can consider adding a dir key to features
+
+\definefontfeature
+ [otftracker-default]
+ [default]
+ [mode=node]
+
+\definefontfeature
+ [otftracker-arabtype]
+ [mode=node,analyze=yes,
+ language=dflt,script=arab,ccmp=yes,
+ init=yes,medi=yes,fina=yes,isol=yes,
+ liga=yes,dlig=yes,rlig=yes,clig=yes,
+ mark=yes,mkmk=yes,kern=yes,curs=yes]
+
+% \definefontfeature
+% [otftracker-husayni]
+% [analyze=yes,mode=node,
+% language=dflt,script=arab,ccmp=yes,
+% init=yes,medi=yes,fina=yes,isol=yes,
+% calt=yes,
+% mark=yes,mkmk=yes,kern=yes,curs=yes]
+
+\definefontfeature
+ [otftracker-husayni]
+ [analyze=yes,mode=node,
+ language=dflt,script=arab,ccmp=no,
+ init=yes,medi=yes,fina=yes,
+ rlig=yes,
+ ccmp=yes,
+ ss01=yes, % full Allah, Muhammad, Allahumma
+ ss05=yes, % full Jiim stacking
+ ss09=yes, % full Haa stacking
+ ss10=yes, % partial dipped Miim
+ % ss11=yes, % full dipped Miim
+ ss13=yes, % full stacked Miim
+ ss15=yes, % full stacked Laam-on-Miim
+ ss17=yes, % full stacked Ayn-on-Miim
+ ss19=yes, % LM_im
+ ss24=yes,ss25=yes,ss26=yes, % BX, LH_im, full Yaa.final specials
+ ss27=yes, % partial thin Miim.final
+ ss31=yes, % partial Raa.final contexts
+ ss34=yes, % partial Raa.final contexts
+ ss35=yes, % full Kaaf contexts
+ ss36=yes, % full Laam contexts
+ ss37=yes, % Miim-Miim contexts
+ ss38=yes, % fancy thin Haa.medial-Miim.final
+ ss39=yes, % high and low Baa strings
+ ss40=yes, % diagonal entry
+ ss41=yes, % initial alternates
+ % js06=yes,js08=yes,js10=yes,js11=yes,js17=yes,
+ % ttwl=yes,
+ mark=yes,mkmk=yes,
+ kern=yes,curs=yes]
+
+\definefontfeature
+ [otftracker-simplenaskhi]
+ [analyze=yes,mode=node,
+ language=dflt,script=arab,
+ init=yes,medi=yes,fina=yes,calt=yes,
+ rlig=yes,liga=yes,dlig=yes,
+ mark=yes,mkmk=yes,curs=yes]
+
+\setvalue{otftracker-direction-arabtype}{-1}
+\setvalue{otftracker-direction-husayni}{-1}
+\setvalue{otftracker-direction-simplenaskhi}{-1}
+
+\setvariables
+ [otftracker]
+ [font=Serif,
+ features=\checkedfeature{otftracker-\getvariable{otftracker}{font}}{otftracker-default},
+ size=48pt,
+ figure=,
+ title=Feature Check,
+ sample=no sample,
+ direction=\executeifdefined{otftracker-direction-\getvariable{otftracker}{font}}{0},
+ set=\setups{otftracker}]
+
+\setuplayout
+ [topspace=1.5cm,
+ backspace=1.5cm,
+ width=middle,
+ height=middle,
+ header=1.5cm,
+ footer=1.5cm]
+
+\setuphead
+ [chapter]
+ [header=high,
+ number=no]
+
+\setupfootertexts
+ [chapter]
+
+\setupalign
+ [flushleft]
+
+\setupcolors
+ [state=start]
+
+\startsetups otftracker
+ \setupbodyfont[tt,10pt]
+ \starttext
+ \chapter{\getvariable{otftracker}{title}}
+ \doifsomething {\getvariable{otftracker}{figure}} {
+ \startlinecorrection
+ \externalfigure[\getvariable{otftracker}{figure}]
+ \stoplinecorrection
+ }
+ \showotfcomposition
+ {\getvariable{otftracker}{font}*\getvariable{otftracker}{features} at \getvariable{otftracker}{size}}
+ {\getvariable{otftracker}{direction}}
+ {\getvariable{otftracker}{sample}}
+ \stoptext
+\stopsetups
diff --git a/tex/context/base/s-fnt-21.tex b/tex/context/base/s-fnt-21.tex
new file mode 100644
index 000000000..dd8de398d
--- /dev/null
+++ b/tex/context/base/s-fnt-21.tex
@@ -0,0 +1,46 @@
+%D \module
+%D [ file=s-fnt-20,
+%D version=2009.01.10,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Tracing Feature Application (2),
+%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 is related to:
+
+\usemodule[fnt-20]
+
+\setvariables
+ [otftracker]
+ [set=\setups{araball}]
+
+\startsetups araball
+ \begingroup
+ \setupcolors[state=start]%
+ \enabletrackers[otf.analyzing]% beware, kind of global
+ \ruledhbox \bgroup
+ \definedfont[\getvariable{otftracker}{font}*\getvariable{otftracker}{features} at \getvariable{otftracker}{size}]%
+ \ifnum\getvariable{otftracker}{direction}<0 \textdir TRT\else\ifnum\getvariable{otftracker}{direction}>0 \textdir TLT\fi\fi\relax
+ \getvariable{otftracker}{sample}%
+ \egroup
+ \disabletrackers[otf.analyzing]%
+ \endgroup
+\stopsetups
+
+\def\ShowOtfTrackerSample#1%
+ {\doiffile{#1}
+ {\blank
+ \startlinecorrection
+ \vbox \bgroup
+ \forgetall
+ \setbox\scratchbox\hbox{\component #1 \relax}
+ \hbox{\copy\scratchbox\quad\lower\dp\scratchbox\hbox{\ruledhbox{\externalfigure[#1-volt.pdf][height=\htdp\scratchbox]}}}
+ \hbox{\strut\tttf#1}%
+ \egroup
+ \stoplinecorrection
+ \blank}}
diff --git a/tex/context/base/s-fnt-23.tex b/tex/context/base/s-fnt-23.tex
new file mode 100644
index 000000000..096c8fbf5
--- /dev/null
+++ b/tex/context/base/s-fnt-23.tex
@@ -0,0 +1,272 @@
+%D \module
+%D [ file=s-fnt-23,
+%D version=2009.03.04,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Tracing Feature Application (3),
+%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.
+
+\startluacode
+ local last_data = nil
+ local format = string.format
+ local function tpf(...)
+-- print("!!!!",...)
+ tex.print(tex.ctxcatcodes,format(...))
+ end
+ function fonts.otf.show_shape(n)
+ local tfmdata = fonts.ids[font.current()]
+ lastdata = tfmdata
+ local charnum = tonumber(n)
+ if not charnum then
+ charnum = tfmdata.unicodes[n]
+ end
+ local c = tfmdata.characters[charnum]
+ local d = tfmdata.descriptions[charnum]
+ if d then
+ local factor = (tfmdata.size/tfmdata.units)*((7200/7227)/65536)
+ local llx, lly, urx, ury = unpack(d.boundingbox)
+ llx, lly, urx, ury = llx*factor, lly*factor, urx*factor, ury*factor
+ local width, italic = (d.width or 0)*factor, (d.italic or 0)*factor
+ local top_accent, bot_accent = (d.top_accent or 0)*factor, (d.bot_accent or 0)*factor
+ local anchors, math = d.anchors, d.math
+ tpf("\\startMPcode")
+ tpf("pickup pencircle scaled .25bp ; ")
+ tpf('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum)
+ tpf('draw (%s,%s)--(%s,%s)--(%s,%s)--(%s,%s)--cycle withcolor green ;',llx,lly,urx,lly,urx,ury,llx,ury)
+ tpf('draw (%s,%s)--(%s,%s) withcolor green ;',llx,0,urx,0)
+ tpf('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;')
+ tpf("defaultscale := 0.05 ; ")
+ -- inefficient but non critical
+ local function slant_1(v,dx,dy,txt,xsign,ysign,loc,labloc)
+ if #v > 0 then
+ local l = { }
+ for kk, vv in ipairs(v) do
+ local h, k = vv.height, vv.kern
+ if h and k then
+ l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy)
+ end
+ end
+ tpf("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1])
+ tpf("draw laddered (%s) withcolor .5white ;",table.concat(l,".."))
+ tpf("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l])
+ for k, v in ipairs(l) do
+ tpf("draw %s withcolor blue withpen pencircle scaled 1bp;",v)
+ end
+ end
+ end
+ local function slant_2(v,dx,dy,txt,xsign,ysign,loc,labloc)
+ if #v > 0 then
+ local l = { }
+ for kk, vv in ipairs(v) do
+ local h, k = vv.height, vv.kern
+ if h and k then
+ l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy)
+ end
+ end
+ if loc == "top" then
+ tpf('label.%s("\\type{%s}",%s shifted (0,-1bp)) ;',loc,txt,l[#l])
+ else
+ tpf('label.%s("\\type{%s}",%s shifted (0,2bp)) ;',loc,txt,l[1])
+ end
+ for kk, vv in ipairs(v) do
+ local h, k = vv.height, vv.kern
+ if h and k then
+ tpf('label.top("(%s,%s)",%s shifted (0,-2bp));',k,h,l[kk])
+ end
+ end
+ end
+ end
+ if math then
+ local kerns = math.kerns
+ if kerns then
+ for _, slant in ipairs { slant_1, slant_2 } do
+ for k,v in pairs(kerns) do
+ if k == "top_right" then
+ slant(v,width+italic,0,k,1,1,"top","ulft")
+ elseif k == "bottom_right" then
+ slant(v,width,0,k,1,1,"bot","lrt")
+ elseif k == "top_left" then
+ slant(v,0,0,k,-1,1,"top","ulft")
+ elseif k == "bottom_left" then
+ slant(v,0,0,k,-1,1,"bot","lrt")
+ end
+ end
+ end
+ end
+ end
+ local function show(x,y,txt)
+ local xx, yy = x*factor, y*factor
+ tpf("draw (%s,%s) withcolor blue withpen pencircle scaled 1bp;",xx,yy)
+ tpf('label.top("\\type{%s}",(%s,%s-2bp)) ;',txt,xx,yy)
+ tpf('label.bot("(%s,%s)",(%s,%s+2bp)) ;',x,y,xx,yy)
+ end
+ if anchors then
+ local a = anchors.baselig
+ if a then
+ for k, v in pairs(a) do
+ for kk, vv in ipairs(v) do
+ show(vv[1],vv[2],k .. ":" .. kk)
+ end
+ end
+ end
+ local a = anchors.mark
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ local a = anchors.basechar
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ local ba = anchors.centry
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ local a = anchors.cexit
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ end
+ if italic ~= 0 then
+ tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury)
+ tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury)
+ tpf('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,ury)
+ tpf('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,ury)
+ tpf('label.rt("%s",(%s-2bp,%s-1bp));',d.italic,width+italic,ury)
+ end
+ if top_accent ~= 0 then
+ tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,ury)
+ tpf('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,ury)
+ tpf('label.top("%s",(%s,%s-1bp));',d.top_accent,top_accent,ury)
+ end
+ if bot_accent ~= 0 then
+ tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,lly)
+ tpf('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,ury)
+ tpf('label.bot("%s",(%s,%s+1bp));',d.bot_accent,bot_accent,lly)
+ end
+ tpf('draw origin withcolor red withpen pencircle scaled 1bp;')
+ tpf("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;")
+ tpf("currentpicture := currentpicture scaled 8 ;")
+ tpf("\\stopMPcode")
+ elseif c then
+ local factor = (7200/7227)/65536
+ tpf("\\startMPcode")
+ tpf("pickup pencircle scaled .25bp ; ")
+ tpf('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum)
+ tpf('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;')
+ tpf("defaultscale := 0.05 ; ")
+ local italic, top_accent, bot_accent = (c.italic or 0)*factor, (c.top_accent or 0)*factor, (c.bot_accent or 0)*factor
+ local width, height, depth = (c.width or 0)*factor, (c.height or 0)*factor, (c.depth or 0)*factor
+ local ury = height
+ if italic ~= 0 then
+ tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury)
+ tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury)
+ tpf('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,height)
+ tpf('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,height)
+ tpf('label.rt("%6.3f bp",(%s-2bp,%s-1bp));',italic,width+italic,height)
+ end
+ if top_accent ~= 0 then
+ tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,height)
+ tpf('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,height)
+ tpf('label.top("%6.3f bp",(%s,%s-1bp));',top_accent,top_accent,height)
+ end
+ if bot_accent ~= 0 then
+ tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,height)
+ tpf('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,height)
+ tpf('label.bot("%6.3f bp",(%s,%s+1bp));',bot_accent,bot_accent,height)
+ end
+ tpf('draw origin withcolor red withpen pencircle scaled 1bp;')
+ tpf("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;")
+ tpf("currentpicture := currentpicture scaled 8 ;")
+ tpf("\\stopMPcode")
+ else
+ tpf("no such shape: %s",n)
+ end
+ end
+ function fonts.otf.show_all_shapes(start,stop)
+ local tfmdata = fonts.ids[font.current()]
+ lastdata = tfmdata
+ start, stop = start or "\\startTEXpage\\gobbleoneargument", stop or "\\stopTEXpage"
+ local unicodes, indices, descriptions = tfmdata.unicodes, tfmdata.indices, tfmdata.descriptions
+ for _, unicode in next, table.sortedkeys(descriptions) do
+ local d = descriptions[unicode]
+ local name = d.name
+ tpf("%s{%s}%%",start,unicode)
+ tpf("\\writestatus{glyph}{U+%04X -> %s}%%",unicode,name)
+ fonts.otf.show_shape(unicode)
+ tpf(stop)
+ end
+ end
+ function fonts.otf.show_shape_field(unicode,name)
+ local tfmdata = lastdata or fonts.ids[font.current()]
+ local d = tfmdata.descriptions[unicode]
+ if d then
+ if name == "unicode" then
+ tpf("U+%04X",unicode)
+ else
+ d = d[name]
+ if d then
+ tpf(d)
+ end
+ end
+ end
+ end
+\stopluacode
+
+\setupcolors
+ [state=start]
+
+\def\GetGlyphField#1#2%
+ {\ctxlua{fonts.otf.show_shape_field(#1,"#2")}}
+
+\def\StartShowGlyphShape#1%
+ {\startTEXpage
+ \nonknuthmode
+ \def\GlyphUnicode{#1}}
+
+\def\StopShowGlyphShape
+ {\par
+ \midaligned{\tttf\setstrut\strut\GetGlyphField\GlyphUnicode{unicode}: \GetGlyphField\GlyphUnicode{name}}%
+ \stopTEXpage}
+
+\def\ShowGlyphShape#1#2#3% name size glyph
+ {\begingroup
+ \definedfont[#1 at #2]%
+ \obeyMPboxdepth
+ \ctxlua{fonts.otf.show_shape("#3")}%
+ \endgroup}
+
+\def\ShowAllGlyphShapes#1#2% name size
+ {\begingroup
+ \nonknuthmode
+ \definedfont[#1 at #2]%
+ \ctxlua{fonts.otf.show_all_shapes("\\StartShowGlyphShape","\\StopShowGlyphShape")}%
+ \endgroup}
+
+\setupcolors
+ [state=start]
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x62A} \stopTEXpage
+\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x2004} \stopTEXpage
+\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0xF0299} \stopTEXpage
+\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{NameMe.1190} \stopTEXpage
+
+\ShowAllGlyphShapes{simplenaskhi}{100bp}
+
+\stoptext
diff --git a/tex/context/base/s-fnt-24.tex b/tex/context/base/s-fnt-24.tex
new file mode 100644
index 000000000..073588033
--- /dev/null
+++ b/tex/context/base/s-fnt-24.tex
@@ -0,0 +1,83 @@
+%D \module
+%D [ file=s-fnt-24,
+%D version=2009.02.06,
+%D title=\CONTEXT\ Style File,
+%D subtitle=CJK Glyph Combination Testing,
+%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\ShowChineseCombiChar#1#2#3#4%
+ {\blank[small]
+ \dontleavehmode
+ \hbox\bgroup
+ \dontcomplain
+ \setstrut
+ \hbox to 7em{\ruledhbox{\char#1}\hskip.25em\type{+}\hskip.25em\ruledhbox{\char#2}\hskip.25em\type{=}\hskip.25em\ruledhbox{\char#1\char#2}\hss}\relax
+ \ruledvtop{\hsize1em\char#1\char#2}\relax
+ \hskip2em
+ \ruledvtop{\hsize.625em\char#1\char#2}\relax
+ \hskip2em
+ \ruledvtop{\hsize1.5em\char#1\char#2}\relax
+ \hskip2em
+ \type{#3 + #4}\relax
+ \egroup
+ \blank[small]}
+
+\startluacode
+local example = {
+ korean = 0x0AC00,
+ chinese = 0x04E55,
+ full_width_open = 0x03008,
+ full_width_close = 0x03009,
+ half_width_open = 0x02018,
+ half_width_close = 0x02019,
+ hyphen = 0x02026,
+ non_starter = 0x03005,
+ other = 0x0004D, -- M
+}
+
+function fonts.analyzers.cjktest(first,second)
+ for k, v in next, example do
+ if (not first or first == "") or first == k then
+ for kk, vv in next, example do
+ if (not second or second == "") or second == kk then
+ tex.sprint(tex.ctxcatcodes,string.format("\\ShowChineseCombiChar{%s}{%s}{%s}{%s}",v,vv,k,kk))
+ end
+ end
+ end
+ end
+end
+\stopluacode
+
+\def\ShowCombinationsKorean
+ {\dodoubleempty\doShowCombinationsKorean}
+
+\def\doShowCombinationsKorean[#1][#2]%
+ {\startpacked
+ \setscript[hangul]
+ \setupcolors[\c!state=\v!start]
+ \enabletrackers[cjk.analyzing]
+ \ctxlua{fonts.analyzers.cjktest("#1","#2")}\par % !
+ \disabletrackers[cjk.analyzing]
+ \stoppacked}
+
+\def\ShowCombinationsChinese
+ {\dodoubleempty\doShowCombinationsChinese}
+
+\def\doShowCombinationsChinese[#1][#2]%
+ {\startpacked
+ \setscript[hanzi]
+ \setupcolors[\c!state=\v!start]
+ \enabletrackers[cjk.analyzing]
+ \ctxlua{fonts.analyzers.cjktest("#1","#2")}\par % !
+ \disabletrackers[cjk.analyzing]
+ \stoppacked}
+
+\protect \endinput
diff --git a/tex/context/base/s-fnt-25.tex b/tex/context/base/s-fnt-25.tex
new file mode 100644
index 000000000..a8b398716
--- /dev/null
+++ b/tex/context/base/s-fnt-25.tex
@@ -0,0 +1,194 @@
+%D \module
+%D [ file=s-fnt-25,
+%D version=2009.01.25,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Math Glyph Checking,
+%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.
+
+\def\enableshowmathfontvirtual
+ {\ctxlua{fonts.tfm.auto_cleanup=false}}
+
+\def\showmathfontcharacters
+ {\dodoubleempty\doshowmathfontcharacters}
+
+\def\doshowmathfontcharacters[#1][#2]%
+ {\begingroup
+ \dontcomplain
+ \doifelsenothing{#1}
+ {\definedfont[MathRoman*math-text]}
+ {\definedfont[#1]}%
+ \doifelsenothing{#2}
+ {\ctxlua{document.showmathfont(font.current())}}
+ {\def\dodoshowmathfontcharacters##1{\ctxlua{document.showmathfont(font.current(),##1)}}%
+ \processcommalist[#2]\dodoshowmathfontcharacters}%
+ \endgroup}
+
+\def\startmathfontlist
+ {\startpacked}
+
+\def\stopmathfontlist
+ {\stoppacked}
+
+\def\startmathfontlistentry
+ {\blank
+ \begingroup}
+
+\def\stopmathfontlistentry
+ {\endgroup
+ \blank}
+
+\def\mathfontlistentryhexdectit#1#2#3%
+ {#1: \char#2\enspace\ruledhbox{\char#2}\enspace#3\par
+ \advance\leftskip 1em\relax}
+
+\def\mathfontlistentrywdhtdpic#1#2#3#4%
+ {width: #1, height: #2, depth: #3, italic: #4\par}
+
+\def\mathfontlistentryresource#1%
+ {virtual: #1\par}
+
+\def\mathfontlistentrynext#1#2%
+ {#1~\ruledhbox{\char#2}}
+
+\def\mathfontlistentrynextlist#1%
+ {next: #1\par}
+
+\def\fontlistentryvariants#1#2%
+ {#1~\ruledhbox{\char#2}}
+
+\def\mathfontlistentryvariantslist#1%
+ {variants: #1\par}
+
+\def\mathfontlistentrynextvariantslist#1#2%
+ {next: #1 => variants: #2\par}
+
+\def\mathfontlistentryclassname#1#2%
+ {mathclass: #1, mathname: #2\par}
+
+\def\mathfontlistentrysymbol#1#2%
+ {mathsymbol: #1~\ruledhbox{\char#2}\par}
+
+\startluacode
+function document.showmathfont(id,slot)
+ local data = characters.data
+ local tfmdata = fonts.ids[id]
+ local characters = tfmdata.characters
+ local sorted = (slot and { slot }) or table.sortedkeys(characters)
+ local function report(...)
+ tex.sprint(tex.ctxcatcodes,string.format(...))
+ end
+ local virtual, names = tfmdata.type == "virtual", { }
+ if virtual then
+ for k, v in ipairs(tfmdata.fonts) do
+ local name = fonts.ids[v.id].name
+ names[k] = (name and file.basename(name)) or v.id
+ end
+ end
+ local round = math.round
+-- print(table.serialize(names))
+ for _, s in next, sorted do
+ local char = characters[s]
+ if char then
+ local info = data[s]
+ local cnext, cvert_variants, choriz_variants = char.next, char.vert_variants, char.horiz_variants
+ report("\\startmathfontlistentry")
+ report("\\mathfontlistentryhexdectit{U+%05X}{%s}{%s}",s,s,string.lower(info.description or "no description, private to font"))
+ report("\\mathfontlistentrywdhtdpic{%s}{%s}{%s}{%s}",round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0))
+ if virtual then
+ local commands = char.commands
+ if commands then
+ local t = { }
+ for i=1,#commands do
+ local ci = commands[i]
+ if ci[1] == "slot" then
+ local fnt, idx = ci[2], ci[3]
+ t[#t+1] = string.format("%s/%0X",names[fnt] or fnt,idx)
+ end
+ end
+ if #t > 0 then
+ report("\\mathfontlistentryresource{%s}",table.concat(t,", "))
+ end
+ end
+ end
+ if info.mathclass then
+ report("\\mathfontlistentryclassname{%s}{%s}",info.mathclass,info.mathname or "no name")
+ end
+ if info.mathspec then
+ for i=1,#info.mathspec do
+ report("\\mathfontlistentryclassname{%s}{%s}",info.mathspec[i].class,info.mathspec[i].name or "no name")
+ end
+ end
+ if info.mathsymbol then
+ report("\\mathfontlistentrysymbol{U+%05X}{%s}",info.mathsymbol,info.mathsymbol)
+ end
+ if cnext then
+ local t, done = { }, { }
+ while cnext do
+ if done[cnext] then
+ t[#t+1] = "CYCLE"
+ break
+ else
+ done[cnext] = true
+ t[#t+1] = string.format("\\mathfontlistentrynext{U+%05X}{%s}",cnext,cnext)
+ cnext = characters[cnext]
+ cvert_variants = cnext.vert_variants or cvert_variants
+ choriz_variants = cnext.horiz_variants or choriz_variants
+ if cnext then
+ cnext = cnext.next
+ end
+ end
+ end
+ cnext = t
+ end
+ if cvert_variants then
+ local t = { }
+ for k, v in next, cvert_variants do
+ t[#t+1] = string.format("\\fontlistentryvariants{U+%05X}{%s}",v.glyph,v.glyph)
+ end
+ cvert_variants = t
+ end
+ if choriz_variants then
+ local t = { }
+ for k, v in next, choriz_variants do
+ t[#t+1] = string.format("\\fontlistentryvariants{U+%05X}{%s}",v.glyph,v.glyph)
+ end
+ choriz_variants = t
+ end
+ local cvariants = choriz_variants or cvert_variants
+ if cvariants and cnext then
+ report("\\mathfontlistentrynextvariantslist{%s}{%s}",table.concat(cnext," => "),table.concat(cvariants," => "))
+ else
+ if cnext then
+ report("\\mathfontlistentrynextlist{%s}",table.concat(cnext," => "))
+ end
+ if variants then
+ report("\\mathfontlistentryvariantslist{%s}",table.concat(cvariants," "))
+ end
+ end
+ report("\\stopmathfontlistentry")
+ end
+ end
+end
+\stopluacode
+
+\endinput
+
+\startbuffer[mathtest]
+ \begingroup\mm\mr\showmathfontcharacters\endgroup
+\stopbuffer
+
+\starttext
+ \usetypescript[cambria] \setupbodyfont[cambria, 12pt] \getbuffer[mathtest]
+ \usetypescript[lmvirtual] \setupbodyfont[lmvirtual,12pt] \getbuffer[mathtest]
+ \usetypescript[pxvirtual] \setupbodyfont[pxvirtual,12pt] \getbuffer[mathtest]
+ \usetypescript[txvirtual] \setupbodyfont[txvirtual,12pt] \getbuffer[mathtest]
+ \usetypescript[palatino] \setupbodyfont[palatino, 10pt] \getbuffer[mathtest]
+ \usetypescript[mathtimes] \setupbodyfont[mathtimes,12pt] \getbuffer[mathtest]
+\stoptext
+
diff --git a/tex/context/base/s-fnt-26.tex b/tex/context/base/s-fnt-26.tex
new file mode 100644
index 000000000..026abf29b
--- /dev/null
+++ b/tex/context/base/s-fnt-26.tex
@@ -0,0 +1,73 @@
+%D \module
+%D [ file=s-fnt-26,
+%D version=2009.10.26,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Goodies Tables,
+%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.
+
+\startluacode
+
+ function document.show_goodies_stylistics(name)
+ local goodies = fonts.goodies.get(name)
+ local stylistics = goodies and goodies.stylistics
+ if stylistics then
+ local col, row, type = context.NC, context.NR, context.type
+ context.starttabulate { "|l|pl|" }
+ col() context("feature") col() context("meaning") col() row()
+ for feature, meaning in table.sortedpairs(stylistics) do
+ col() type(feature) col() type(meaning) col() row()
+ end
+ context.stoptabulate()
+ end
+ end
+
+ function document.show_goodies_featuresets(name)
+ local goodies = fonts.goodies.get(name)
+ local featuresets = goodies and goodies.featuresets
+ if featuresets then
+ local col, row, type = context.NC, context.NR, context.type
+ context.starttabulate { "|l|pl|" }
+ col() context("featureset") col() context("definitions") col() row()
+ for featureset, definitions in table.sortedpairs(featuresets) do
+ col() type(featureset) col()
+ for k, v in table.sortedpairs(definitions) do
+ type(string.format("%s=%s",k,tostring(v)))
+ context.quad()
+ end
+ col() row()
+ end
+ context.stoptabulate()
+ end
+ end
+
+ function document.show_goodies_colorschemes(name)
+ local goodies = fonts.goodies.get(name)
+ local colorschemes = goodies and goodies.colorschemes
+ if colorschemes then
+ local col, row, type = context.NC, context.NR, context.type
+ context.starttabulate { "|l|pl|" }
+ col() context("colorscheme") col() context("numbers") col() row()
+ for colorscheme, numbers in table.sortedpairs(colorschemes) do
+ col() type(colorscheme) col()
+ for i=1,#numbers do
+ type(i)
+ context.quad()
+ end
+ col() row()
+ end
+ context.stoptabulate()
+ end
+
+\stopluacode
+
+\def\showgoodiesstylistics #1{\ctxlua{document.show_goodies_stylistics ("#1")}}
+\def\showgoodiesfeaturesets #1{\ctxlua{document.show_goodies_featuresets ("#1")}}
+\def\showgoodiescolorschemes#1{\ctxlua{document.show_goodies_colorschemes("#1")}}
+
+\endinput
diff --git a/tex/context/base/s-fnt-30.tex b/tex/context/base/s-fnt-30.tex
new file mode 100644
index 000000000..81b6c8d19
--- /dev/null
+++ b/tex/context/base/s-fnt-30.tex
@@ -0,0 +1,42 @@
+%D \module
+%D [ file=s-fnt-30,
+%D version=2006.05.10, % abou tthen, quite old already
+%D title=\CONTEXT\ Style File,
+%D subtitle=Showing Character Data,
+%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.
+
+\startluacode
+function document.show_character_data(n)
+ local n = characters.number(n)
+ local d = characters.data[n]
+ if d then
+ local function entry(label,name)
+ texsprint(tex.ctxcatcodes,format("\\NC %s\\NC %s\\NC\\NR",label,characters.valid(d[name])))
+ end
+ texsprint(tex.ctxcatcodes,"\\starttabulate[|Tl|Tl|]")
+ entry("unicode index" , "unicodeslot")
+ entry("context name" , "contextname")
+ entry("adobe name" , "adobename")
+ entry("category" , "category")
+ entry("description" , "description")
+ entry("uppercase code", "uccode")
+ entry("lowercase code", "lccode")
+ entry("specials" , "specials")
+ texsprint(tex.ctxcatcodes,"\\stoptabulate ")
+ end
+end
+\stopluacode
+
+\def\ShowCharacterData#1%
+ {\ctxlua{document.show_character_data(#1)}}
+
+% \ShowCharacterData{123}
+% \ShowCharacterData{0x7B}
+
+% \dostepwiserecurse{`A}{`Z}{1}{\ShowCharacterData{#1}}
diff --git a/tex/context/base/s-grk-00.tex b/tex/context/base/s-grk-00.tex
new file mode 100644
index 000000000..ec5ddf1f7
--- /dev/null
+++ b/tex/context/base/s-grk-00.tex
@@ -0,0 +1,77 @@
+%D \module
+%D [ file=s-grk-00,
+%D version=2004.08.23,
+%D title=\CONTEXT\ Style File,
+%D subtitle=CB Greek Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D suggestions=Giuseppe Bilotta,
+%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.
+
+\usetypescriptfile[type-cbg]
+
+\usetypescript [all] [cbgreek-medium]
+
+\startsetups [cbgreek]
+
+ \catcode`~=\other
+ \catcode`|=\other
+
+ \language[greek]
+ \switchtobodyfont[cbgreek]
+
+\stopsetups
+
+\definestartstop
+ [greek]
+ [commands=\directsetup{cbgreek}]
+
+\doifnotmode{demo}{\endinput}
+
+% The following sample file was submitted to the \CONTEXT\
+% mailing list by Giuseppe Bilotta, along with the right
+% typescripts.
+
+% already loaded: \usemodule[greek]
+
+\mainlanguage[english]
+
+\starttext
+
+We can easily use plain English for normal text, and then switch
+to greek when we want; as a first try we type the lower and
+upper case 26 letters of the latin alphabet and see how they come
+out in greek:
+
+\startgreek
+a b c d e f g h i j k l m n o p q r s t u v w x y z \par
+A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+\stopgreek
+
+As it can be observed, some uppercase letters have strange
+outcomes; also, j gives \greek{j} and c gives the
+end-of-word sigma \greek{c}; interestingly, s gives either the
+normal sigma or the end-of-word one, depending on whether it's at
+the end of the word or not: \greek{satrapws}.
+
+Of course we can use the various diacritical signs: accents
+(\greek{`a, 'a, ~a}), breathings (\greek{<r, >w, a"}) and
+subscribed iotas (\greek{a|, h|, w|}) (these last are pretty ugly in my
+opinion); observe how they automatically get the correct position
+with uppercase letters: (\greek{`A, 'A, ~A, <A, >A, A|}).
+
+Can the thing be used for serious work?
+
+\startgreek
+>>'Andra moi >'ennepe, Mo~usa, pol'utropon, >'os m'ala poll`a\hfill\break
+pl'agqjh, >epe`i Tro'ihs <er`on ptol'iejron >'eperse;\hfill\break
+poll~wn d" >anjr'wpwn >'iden >'astea ka`i n'oon >'egnw,\hfill\break
+poll`a d" <'o g" >en p'ontw| p'ajen >'algea <`on kat`a jum'on,\hfill\break
+>>arn'umenos <'hn te yuq`hn ka`i n'oston <eta'irwn.
+\stopgreek
+
+\stoptext
diff --git a/tex/context/base/s-inf-01.tex b/tex/context/base/s-inf-01.tex
new file mode 100644
index 000000000..a2a693ae2
--- /dev/null
+++ b/tex/context/base/s-inf-01.tex
@@ -0,0 +1,203 @@
+%D \module
+%D [ file=s-inf-01,
+%D version=2009.07.09,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Information 1 (\MKII/\MKIV\ usage),
+%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 Some day I will generalize this table mechanism.
+
+\startluacode
+ local format, gsub, find, match = string.format, string.gsub, string.find, string.match
+ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+ local list, size, comp, used, nope = { }, { }, { }, { mkii = { }, mkiv = { } }, { 0, 0, 0, 0 }
+
+ local omit = {
+ "char%-def%.lua",
+ "mult%-def%.lua", "mult%-..%.tex", "mult%-m..%.tex",
+ }
+ local skip = {
+ "prag%-.*%.tex", "docs%-.*.tex", "list%-.*%.tex", "test%-.*%.tex", "demo%-.*%.tex",
+ "opti%-.*%.tex", "chrt%-.*%.tex",
+ }
+ local types = {
+ "tex", "mkii", "mkiv", "lua"
+ }
+
+ local function collect(list,suffix,n)
+ local path = file.dirname(resolvers.find_file("context.tex"),".")
+ local pattern = path .. "/*." .. suffix
+ local texfiles = dir.glob(pattern)
+ for _, name in ipairs(texfiles) do
+ local base = file.basename(name)
+ local category = match(base,"^([a-z][a-z][a-z][a-z])%-[a-z0-9]+%.[a-z]+")
+ if category and lfs.isfile(name) then
+ local okay = true
+ for s=1,#skip do
+ if find(base,skip[s]) then
+ okay = false
+ break
+ end
+ end
+ if okay then
+ local lm, sm, cm = list[category], size[category], comp[category]
+ if not lm then
+ lm, sm, cm = { 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0 }
+ list[category], size[category], comp[category] = lm, sm, cm
+ end
+ lm[n] = lm[n] + 1
+ local done = true
+ for o=1,#omit do
+ if find(base,omit[o]) then
+ done = false
+ break
+ end
+ end
+ local data = io.loaddata(name)
+ if suffix == "lua" then
+ data = gsub(data,"%-%-%[%[.-%]%]%-%-","")
+ data = gsub(data,"%-%-.-[\n\r]","")
+ else
+ data = gsub(data,"%%.-[\n\r]","")
+ end
+ data = gsub(data,"%s","")
+ sm[n+4] = sm[n+4] + #data
+ if done then
+ sm[n] = sm[n] + #data
+ else
+ cm[n] = cm[n] + 1
+ end
+ end
+ end
+ end
+ end
+
+ local function prepare(what)
+ if next(list) then
+ -- already loaded
+ else
+ for k, v in ipairs(types) do
+ collect(list,v,k)
+ end
+ for category, _ in pairs(list) do
+ pattern ="{"..category.."%-"
+ for suffix, t in pairs(used) do
+ local data = io.loaddata(resolvers.find_file("context."..suffix))
+ if find(data,pattern) then
+ t[category] = true
+ end
+ end
+ end
+ end
+ local max, what = 0, (what == "size" and size) or list
+ for k, v in table.sortedpairs(what) do
+ for i=1,4 do if v[i] > max then max = v[i] end end
+ end
+ return max, what, function(n) return n/max end
+ end
+
+ function document.context_state_1(what)
+ local max, what, norm = prepare(what)
+ texsprint(ctxcatcodes,"\\starttabulate[|Tc|T|T|T|T|]")
+ texsprint(ctxcatcodes,"\\NC category\\NC")
+ for i, t in ipairs(types) do
+ local n, m = 0, 0
+ for k, v in pairs(list) do
+ local nn, mm = what[k][i], what[k][i+4]
+ n = n + nn
+ m = m + (mm or nn)
+ end
+ texsprint(ctxcatcodes,format("\\Top{%s}{%s}{%s}{%s}\\NC",t,norm(max),n,m))
+ end
+ texsprint(ctxcatcodes,"\\NC\\NR\\HL")
+ for k, v in table.sortedpairs(what) do
+ local c = (what == size and comp[k]) or nope
+ local cat = format("%s~%s~~%s",(used.mkii[k] and "ii") or "~~",(used.mkiv[k] and "iv") or "~~",k)
+ texsprint(ctxcatcodes,"\\NC",cat,"\\NC")
+ for i, t in ipairs(types) do
+ texsprint(ctxcatcodes,format("\\Bar{%s}{%s}{%s}{%s}\\NC",t,v[i],c[i],norm(v[i])))
+ end
+ texsprint(ctxcatcodes,"\\NR")
+ end
+ texsprint(ctxcatcodes,"\\stoptabulate")
+ end
+
+ function document.context_state_2(what)
+ local max, what, norm = prepare(what)
+ for k, v in table.sortedpairs(what) do
+ local c = (what == size and comp[k]) or nope
+ texsprint(ctxcatcodes,format("\\StartUp{%s}",k))
+ for i, t in ipairs(types) do
+ texsprint(ctxcatcodes,format("\\Up{%s}{%s}",t,norm(v[i])))
+ end
+ texsprint(ctxcatcodes,"\\StopUp")
+ end
+ end
+
+\stopluacode
+
+\definecolor[bar:tex] [middlegreen]
+\definecolor[bar:mkii][middleblue]
+\definecolor[bar:mkiv][middlered]
+\definecolor[bar:lua] [middlegray]
+
+\def\Top#1#2#3#4%
+ {\hbox to 5em{\hss#3}%
+ \enspace
+ \hbox to #2\dimexpr 20em\relax{#1\ifnum#3=#4\else~#4\rlap{~+}\fi\hss}}
+
+\def\Bar#1#2#3#4%
+ {\ifcase#2\else
+ \hbox to 5em{\hss\ifcase#3\else\llap{-~}\fi#2}%
+ \enspace
+ \blackrule[color=bar:#1,width=#4\dimexpr 20em\relax,height=.8\strutht]%
+ \fi}
+
+\newcount\UpCounter
+
+\def\StartUp#1%
+ {\dontleavehmode\framed[frame=off,align={middle,low},height=18em]\bgroup
+ \def\StopUp
+ {\par\nointerlineskip\blackrule[height=1pt,width=4em,depth=0pt,color=darkgray]%
+ \par\tttf\strut#1\par
+ \egroup
+ \ifnum\UpCounter=17 \par \UpCounter\zerocount\else \kern1em \advance\UpCounter\plusone \fi}}
+
+\def\Up#1#2%
+ {\scratchdimen#2\dimexpr 16em\relax
+ \ifdim\scratchdimen=\zeropoint
+ \kern1em
+ \else
+ \ifdim\scratchdimen<\onepoint \scratchdimen\onepoint \fi
+ \blackrule[color=bar:#1,height=\scratchdimen,width=1em]%
+ \fi}
+
+\def\Show#1#2#3%
+ {\startTEXpage[offset=1em,width=fit]
+ \hbox{\tttf\strut\currentdate~-~#1}
+ \ctxlua{document.context_state_\number#2("#3")}
+ \stopTEXpage}
+
+% \doifnotmode{demo}{\endinput}
+
+\starttext
+ \Show
+ {The number of files used in ConTeXt (modules and styles are excluded).}
+ {1}{number}
+ \Show
+ {The size of (core) files used in ConTeXt (- indicates exclusion of large data files; + indicates inclusion of large data files; comment and spaces removed.)}
+ {1}{size}
+ \Show
+ {The relative number of files used in ConTeXt (tex, mkii, mkiv, lua).}
+ {2}{number}
+ \Show
+ {The relative size of files used in ConTeXt (tex, mkii, mkiv, lua).}
+ {2}{size}
+\stoptext
diff --git a/tex/context/base/s-inf-02.tex b/tex/context/base/s-inf-02.tex
new file mode 100644
index 000000000..77a3f650c
--- /dev/null
+++ b/tex/context/base/s-inf-02.tex
@@ -0,0 +1,27 @@
+%D \module
+%D [ file=s-inf-02,
+%D version=2009.11.25,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Information 2 (filenames),
+%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.
+
+\starttext
+
+\starttabulate [|T|T|]
+ \NC \type{\jobname} \NC \jobname \NC \NR
+ \NC \type{\jobfilename} \NC \jobfilename \NC \NR
+ \NC \type{\jobfilesuffix} \NC \jobfilesuffix \NC \NR
+ \NC \type{\inputfilename} \NC \inputfilename \NC \NR
+ \NC \type{\inputfilebarename} \NC \inputfilebarename \NC \NR
+ \NC \type{\inputfilesuffix} \NC \inputfilesuffix \NC \NR
+ \NC \type{\outputfilename} \NC \outputfilename \NC \NR
+ \NC \type{\operatingsystem} \NC \operatingsystem \NC \NR
+\stoptabulate
+
+\stoptext
diff --git a/tex/context/base/s-jap-00.tex b/tex/context/base/s-jap-00.tex
new file mode 100644
index 000000000..28cb6c241
--- /dev/null
+++ b/tex/context/base/s-jap-00.tex
@@ -0,0 +1,23 @@
+%D \module
+%D [ file=s-jap-00,
+%D version=2006.01.19,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Basic Japanese Style,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D suggestions=Richard Gabriel,
+%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.
+
+\input font-jap.tex % faster than \setupbodyfont[jap]
+
+\mainlanguage [ja]
+
+\unprotect
+
+\setuptyping[\c!tab=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/s-mag-01.tex b/tex/context/base/s-mag-01.tex
new file mode 100644
index 000000000..da4e027f4
--- /dev/null
+++ b/tex/context/base/s-mag-01.tex
@@ -0,0 +1,406 @@
+%D \module
+%D [ file=s-mag-01,
+%D version=2002.12.14,
+%D title=\CONTEXT\ Style File,
+%D subtitle=\CONTEXT\ Magazine Base Style,
+%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.
+
+% This style is used for producing explanationary documents.
+% Don't misuse it for other purposes, since it may confuse
+% users. Don't change the title either, since it provides a
+% way to categorize documents. Numbers are disabled in
+% instances produced outside PRAGMA ADE.
+%
+% The layout setup is such that one has several text areas
+% available: headers and footers, margins and edges as well
+% as the main text area. The surrounding (gray) makes the
+% main page stand out and is suitable for viewing in spread
+% mode.
+%
+% Since this style is under constant construction, messing
+% around with settings will produce unwanted side effects.
+% So, if some feature or settings is needed, let me know.
+
+% todo: mp frames
+
+\setvariables[magazine][number=0]
+\setvariables[magazine][author=]
+\setvariables[magazine][title={Zero Issue}]
+\setvariables[magazine][date=\currentdate]
+
+% These are reserved for PRAGMA-ADE, don't use them yourself!
+
+% \setvariables[magazine][main=Tricky]
+% \setvariables[magazine][main=Update]
+% \setvariables[magazine][main=HOWTO]
+
+% \setvariables[magazine][main=This Way] % preludes to a/the manual
+% \setvariables[magazine][main=A Better Way] % dirty versus clean
+% \setvariables[magazine][main=No Way] % how users should not do it
+% \setvariables[magazine][main=Your Way] % how users do it
+% \setvariables[magazine][main=My Way] % how users do it
+% \setvariables[magazine][main=Our Way] % how we do things at pragma
+% \setvariables[magazine][main=Their Way] % how to do latex things in context
+
+\setvariables[magazine][main=My Way]
+
+\startmode[atpragma]
+ \setvariables[magazine][main=This Way]
+\stopmode
+
+\definepapersize
+ [magazine]
+ [width=\dimexpr\paperwidth-.1\paperwidth\relax,
+ height=\dimexpr\paperheight-.1\paperheight\relax]
+
+\setuppapersize
+ [magazine]
+ [A4]
+
+\setupinteractionscreen
+ [option=doublesided]
+
+\definecolor[OuterColor][s=.3]
+\definecolor[InnerColor][s=.8]
+\definecolor[MainColor] [s=.2]
+\definecolor[TitleColor][s=.7]
+
+\definecolor[MyRed] [r=.6]
+\definecolor[MyGreen][g=.6]
+\definecolor[MyBlue] [b=.6]
+
+\startuseMPgraphic{paper}
+ sh := define_circular_shade(a,a,0,bbheight(OverlayBox),
+ \MPcolor{InnerColor},\MPcolor{OuterColor}) ;
+ fill OverlayBox withshade sh ;
+\stopuseMPgraphic
+
+\startreusableMPgraphic{middlepaper}
+ pair a ; a := center OverlayBox ;
+ \includeMPgraphic{paper}
+\stopreusableMPgraphic
+
+\startreusableMPgraphic{rightpaper}
+ pair a ; a := .5[urcorner OverlayBox,lrcorner OverlayBox] ;
+ \includeMPgraphic{paper}
+\stopreusableMPgraphic
+
+\startreusableMPgraphic{leftpaper}
+ pair a ; a := .5[ulcorner OverlayBox,llcorner OverlayBox] ;
+ \includeMPgraphic{paper}
+\stopreusableMPgraphic
+
+\startreusableMPgraphic{page}
+ fill OverlayBox withcolor white ;
+\stopreusableMPgraphic
+
+\startusableMPgraphic{text}
+ StartPage ;
+ for i = Header,Text,Footer :
+ for j = LeftEdge, LeftMargin, Text, RightMargin, RightEdge :
+ draw Field[i][j] withpen pencircle scaled .5pt ;
+ endfor ;
+ endfor ;
+ StopPage ;
+ setbounds currentpicture to Field[Text][Text] ;
+\stopusableMPgraphic
+
+\startsetups[paper]
+
+ \doifmodeelse{*makeup}
+ {\reuseMPgraphic{middlepaper}}
+ {\doifoddpageelse
+ {\reuseMPgraphic{rightpaper}}
+ {\reuseMPgraphic{leftpaper}}}
+
+\stopsetups
+
+\defineoverlay[paper] [\setups{paper}]
+\defineoverlay[page] [\reuseMPgraphic{page}]
+\defineoverlay[text] [\doifmode{frame}{\useMPgraphic{text}}]
+
+\setupbackgrounds [paper] [background=paper]
+\setupbackgrounds [page] [background={page,title}]
+\setupbackgrounds [text] [background=text]
+
+\definelayer
+ [title]
+ [state=repeat,
+ hoffset=-1cm,
+ voffset=1cm,
+ width=\paperwidth,
+ height=\paperheight]
+
+\setupoutput
+ [pdftex]
+
+\setuplayout
+ [width=middle,
+ topspace=1.5cm,
+ height=middle,
+ header=1.5cm,
+ footer=1cm,
+ %grid=yes,
+ headerdistance=.25cm,
+ footerdistance=.5cm,
+ backspace=3cm,
+ margin=1.5cm,
+ margindistance=.25cm,
+ edge=.75cm,
+ edgedistance=.25cm,
+ bottomdistance=1.5cm,
+ bottom=.1\printpaperheight]
+
+\definelayout
+ [makeup]
+ [topspace=1cm,
+ backspace=1cm,
+ header=0pt,
+ footer=0pt,
+ bottom=0pt]
+
+\setuppagenumbering
+ [alternative=doublesided]
+
+\setupcolors
+ [state=start]
+
+\usetypescript
+ [palatino][\defaultencoding]
+
+\setupbodyfont
+ [palatino,10pt]
+
+\setuptolerance
+ [verytolerant]
+
+\appendtoks\setups[papershift]\to\beforeeverypage
+
+\startsetups[papershift]
+
+ \setuppapersize[top=\vskip.5cm,bottom=\vss]
+
+ \doifmodeelse{*makeup}
+ {\setuppapersize[left=\hfill,right=\hfill]}
+ {\doifoddpageelse
+ {\setuppapersize[right=\hfill]}
+ {\setuppapersize[left=\hfill]}}
+
+\stopsetups
+
+\setupbottomtexts
+ [\setups{rightbanner}] []
+ [] [\setups{leftbanner}]
+
+\startsetups [leftbanner]
+
+ \definedfont[Regular at \the\bottomheight]
+ \setbox\scratchbox\hbox{\TitleColor\getvariable{magazine}{main}}
+ \ht\scratchbox1ex
+ \dp\scratchbox\zeropoint
+ \MainColor
+ \definedfont[Regular sa 2]
+ \doifsomething{\getvariable{magazine}{number}}
+ {\doifnot{\getvariable{magazine}{number}}{0}
+ {\#\getvariable{magazine}{number}}}
+ \quad
+ \currentdate
+ \quad
+ \scale[height=.25\bottomheight]{\box\scratchbox}
+ \quad
+ \hbox to 1.5em{\hss\pagenumber\hss}
+ \quad
+ \hskip-\backspace
+
+\stopsetups
+
+\startsetups [rightbanner]
+
+ \definedfont[Regular at \the\bottomheight]
+ \setbox\scratchbox\hbox{\TitleColor\getvariable{magazine}{main}}
+ \ht\scratchbox1ex
+ \dp\scratchbox\zeropoint
+ \MainColor
+ \hskip-\backspace
+ \definedfont[Regular sa 2]
+ \quad
+ \hbox to 1.5em{\hss\pagenumber\hss}
+ \quad
+ \scale[height=.25\bottomheight]{\box\scratchbox}
+ \quad
+ \currentdate
+ \quad
+ \doifmode{atpragma}{\#\getvariable{magazine}{number}}
+
+\stopsetups
+
+\startsetups[titlepage]
+
+ \disablemode[frame]
+
+ \setuplayout[makeup]
+
+ \startstandardmakeup[doublesided=no]
+
+ \definelayer
+ [makeup]
+ [width=\textwidth,
+ height=\textheight]
+
+ \setlayerframed
+ [makeup]
+ [corner={left,top},location={right,bottom}]
+ [frame=off,
+ foregroundcolor=MainColor]
+ {\scale
+ [width=\makeupwidth]
+ {\definedfont[Regular sa 10]%
+ \getvariable{magazine}{main}}}
+
+ \setlayerframed
+ [makeup]
+ [corner={right,top},location={left},y=.4\textheight]
+ [frame=off,
+ foregroundcolor=MainColor,
+ width=\textwidth,
+ align=left]
+ {\definedfont[Regular sa 2.5]\setupinterlinespace
+ \startmode[atpragma]
+ \strut \ConTeXt\ magazine \#\getvariable{magazine}{number}\endgraf
+ \stopmode
+ \strut \getvariable{magazine}{date} \endgraf
+ \blank
+ \strut \getvariable{magazine}{title}\endgraf
+ \doifsomething{\getvariable{magazine}{author}}
+ {\strut \getvariable{magazine}{author}\endgraf}
+ \doifsomething{\getvariable{magazine}{affiliation}}
+ {\strut \getvariable{magazine}{affiliation}\endgraf}}
+
+ \setlayerframed
+ [makeup]
+ [corner={right,bottom},location={left,top}]
+ [frame=off,
+ align=normal, % left,
+ width=.8\textwidth,
+ foregroundcolor=MainColor]
+ {\getbuffer[abstract]}
+
+ \flushlayer[makeup]
+
+ \stopstandardmakeup
+
+ \setuplayout[reset]
+
+\stopsetups
+
+\startsetups[listing]
+
+ \page \disablemode[frame]
+
+ \setuptexttexts [][] \setuptexttexts []
+ \setupheadertexts[][] \setupheadertexts[source code of this document]
+ \setupfootertexts[][] \setupfootertexts[]
+
+ \typefile[TEX]{\inputfilename} % \jobname
+
+\stopsetups
+
+\startsetups[lastpage]
+
+ \page \disablemode[frame] \page[even]
+
+ \doifoddpageelse
+ {}
+ {\setuplayout[makeup]
+ \startstandardmakeup[doublesided=no,page=]
+ \stopstandardmakeup
+ \setuplayout[reset]}
+
+\stopsetups
+
+\startsetups[title]
+
+ \disablemode[frame]
+
+ \setlayerframed
+ [title]
+ [corner={left,top},location={left,bottom},
+ rotation=90]
+ [frame=off,
+ foregroundcolor=MainColor]
+ {\definedfont[RegularBold sa 2]\strut\getvariable{magazine}{title}}
+
+ \setlayerframed
+ [title]
+ [corner={right,top},
+ rotation=270]
+ [frame=off,
+ foregroundcolor=MainColor]
+ {\definedfont[RegularBold sa 2]\strut\getvariable{magazine}{title}}
+
+\stopsetups
+
+\startbuffer[abstract]
+ % no abstract
+\stopbuffer
+
+\setuphead
+ [chapter]
+ [page=yes,
+ after={\blank[2*big]},
+ color=MainColor,
+ style=\bfc]
+
+\setuphead
+ [section]
+ [before={\blank[2*big]},
+ after=\blank,
+ color=MainColor,
+ style=\bfb]
+
+\setuphead
+ [subsection]
+ [before=\blank,
+ after=,
+ color=MainColor,
+ style=\bf]
+
+\setupwhitespace
+ [big]
+
+\definetyping[xtyping] [style=\ttx]
+\definetyping[xxtyping][style=\ttxx]
+
+\definetypeface
+ [narrowtt] [tt]
+ [mono] [modern-cond] [default] [encoding=\defaultencoding]
+
+\definetyping[ntyping] \setuptyping[ntyping][style=\narrowtt]
+\definetype [ntype] \setuptype [ntype] [style=\narrowtt]
+
+\doifnotmode{demo}{\endinput}
+
+\startbuffer[abstract]
+ \input tufte
+\stopbuffer
+
+\starttext
+
+ % \showframe
+
+ \setups[titlepage] \setups[title]
+
+ \chapter{E.R. Tufte} \input tufte \page
+ \chapter{D.E.K. Knuth} \input knuth \page
+ \chapter{H. Zapf} \input zapf \page
+ \chapter{D. Hofstadter} \input douglas \page
+
+ \setups[lastpage]
+
+\stoptext
diff --git a/tex/context/base/s-map-10.tex b/tex/context/base/s-map-10.tex
new file mode 100644
index 000000000..865132f97
--- /dev/null
+++ b/tex/context/base/s-map-10.tex
@@ -0,0 +1,488 @@
+%\module [
+% file=s-map-se,
+% version=2005.02.03,
+% title=\CONTEXT\ Style File,
+% subtitle=\MAPS\ basis stijl,
+% author={Hans Hagen, Taco Hoekwater and Siep Kroonenberg},
+% date=\currentdate,
+% copyright={NTG / MAPS}%
+%]
+
+% This module re-implements the MAPS style for use with the Context
+% macro package. The original MAPS layout was designed and
+% implemented in LaTeX by Taco Hoekwater and Siep Kroonenberg.
+
+% This style will be cleaned up as soon as we have time for it.
+
+% - three layouts:
+% 1. two columns
+% 2. one column, with wide outer margins (option onecolumn)
+% 3. one column, with wide left margin (option asym)
+% - font sizes deviate from TeX's usual geometric progression
+% - use of sans-serif for headers and various details
+% - option realfonts uses Bitstream Charter, Euler Math and Latin Modern.
+% This is used for final typesetting.
+% The default font setup, intended for authors, uses Computer
+% Modern.
+
+% A mode nosubsub defines only two levels of sectioning. If you
+% don't need more and use the two-column layout, then this option
+% will probably improve the looks of your paper.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% pdftex support
+
+\newif\ifMapsInColumns
+\doifmode{asym}{\enablemode[onecolumn]} % implies onecolumn
+\doifnotmode{onecolumn}{\MapsInColumnstrue}
+
+\enablemode[realfonts]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% fonts
+
+%%%%%%%%% first, font sizes
+\definebodyfontenvironment [7pt][% LaTeX: scriptsize
+ interlinespace=8pt,
+ big=8pt,
+ small=6pt%
+]
+
+\definebodyfontenvironment [8pt][% LaTeX: footnotesize
+ interlinespace=9pt,
+ big=9pt,
+ small=7pt,
+ x=6pt%
+]
+
+\definebodyfontenvironment [9pt][% LaTeX: small
+ interlinespace=10pt,
+ big=10pt,
+ small=7pt,%
+ x=7pt,%
+ script=7pt%
+]
+
+\definebodyfontenvironment [10pt][% LaTeX: normalsize
+ interlinespace=11pt,
+ big=11pt,
+ small=9pt,%
+ x=8pt,%
+ script=7pt%
+]
+
+\definebodyfontenvironment [11pt][% LaTeX: large
+ interlinespace=11pt,
+ big=11pt,
+ small=10pt,%
+ x=9pt,%
+ script=8pt%
+]
+
+\definebodyfontenvironment [14pt][%
+ interlinespace=14pt,
+ big=24pt,
+ small=11pt,
+ x=10pt%
+]
+
+\definebodyfontenvironment [24pt][%
+ interlinespace=24pt,
+ big=24pt,
+ small=14pt,
+ x=11pt%
+]
+
+%%% font families
+
+\starttypescript [map] [texnansi]
+
+ \definetypeface[map][ss][sans] [map] [default][encoding=\typescripttwo]
+ \definetypeface[map][rm][serif][charter] [default][encoding=\typescripttwo,rscale=0.95]
+ \definetypeface[map][tt][mono] [modern] [default][encoding=\typescripttwo]
+ \definetypeface[map][mm][math] [euler] [default][encoding=\typescripttwo]
+
+% \usemathcollection[eul]
+
+\stoptypescript
+
+% activate protruding
+
+\setupinterlinespace[line=11pt]
+
+\setupfontsynonym[handling=pure]
+
+\setupalign[hanging]
+
+\usetypescript[map][texnansi]
+
+\setupbodyfont [map,10pt]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% additional general typographic details
+
+\setupindenting [yes,next,11pt] % indenting after enumerations etc.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% 3 versions of layout with matching headers
+
+% I would like to move the entire layout slightly toward the spine,
+% but Context seems to provide no good handle for that.
+% So instead, I'll use a two-column layout centered on the page and
+% matching single-column layouts.
+
+% It is easy to do the shift toward the spine when assembling the
+% volume with LaTeX pdfpages.
+
+\definepapersize [maps][%
+ width=595.3bp, % 21cm
+ height=756bp% 10.5in
+]
+
+\setuppapersize [maps][maps]
+
+% parameters:
+% margin -> latex marginparwith
+
+\setuplayout[%
+ topspace=40pt,
+ height=692pt,
+ header=33pt,
+ margin=106pt,
+ leftmargindistance=11pt,
+ rightmargindistance=11pt%
+]
+
+
+\setupblank[5.5pt]
+
+\setuppagenumbering [location=]
+
+\definetyping [widetyping]
+
+\setupheader [style=\ss]
+\setupfooter [style=\ss]
+
+\def\AuHead{%
+ %\ifnum\pageno=\MapsPage \hbox{}\else
+ \MapsRunningAuthor%\fi
+}
+\def\TiHead{%
+ \ifnum\pageno=\MapsPage \relax \MapsRunningAuthor %\hbox{}
+ \else \MapsRunningTitle\fi}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% sectioning
+
+\setupheads[sectionnumber=no, align=right]
+
+\def\hfonti{\bfa}
+\def\hfontii{\bf}
+\def\hfontiii{\rm\bi}
+\def\runin#1#2{#2.}
+
+\doifmodeelse{nosubsub}{%
+\setuphead [section][%
+ style=\hfontii,
+ before={\blank[halfline]},
+ after={}%
+]
+\setuphead [subsection][%
+ style=\hfontiii,
+ command=\runin,
+ alternative=text,
+ before={\blank[halfline]}%
+]}{%
+\setuphead [section][%
+ style=\hfonti,
+ before={\blank[13pt]},
+ after={\blank[6pt]}%
+]
+\setuphead [subsection][%
+ style=\hfontii,
+ before={\blank[6pt]},
+ after={}%
+]
+\setuphead [subsubsection][%
+ style=\hfontiii,
+ command=\runin,
+ alternative=text,
+ before={\blank[halfline]}%
+]}
+
+\doifmodeelse{nosubsub}{%
+\setuphead [subject][%
+ style=\hfontii,
+ before={\blank[halfline]},
+ after={}%
+]
+\setuphead [subsubject][%
+ style=\hfontiii,
+ command=\runin,
+ alternative=text,
+ before={\blank[halfline]}%
+]}{%
+\setuphead [subject][%
+ style=\hfonti,
+ before={\blank},
+ after={\blank[halfline]}%
+]
+\setuphead [subsubject][%
+ style=\hfontii,
+ before={\blank[halfline]},
+ after={}%
+]
+\setuphead [subsubsubject][%
+ style=\hfontiii,
+ command=\runin,
+ alternative=text,
+ before={\blank[halfline]}%
+]}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% floats
+
+\setupfloats [location=left, before={\ss}]
+\setupcaptions [style={\ss},
+ stopper=.,
+ inbetween={\blank[halfline]}]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% various document elements
+
+%\startnotmode[realfonts]
+\def\ChkBox{%
+ \hbox {\boxrulewidth=.4pt \raise.2ex\ruledvbox
+ {\phantom{\vrule width .85ex height .85ex%
+}}}}
+%\stopnotmode
+%\startmode[realfonts]
+%\def\ChkBox{\raise.12ex\hbox{\ws \char50}}
+%\stopmode
+\definesymbol [1][\ChkBox]
+
+\setupitemize[1][packed]
+
+\setupitemize [each][%
+ indentnext=no,
+ align=right,
+ width=1em,
+ distance=0pt%
+]
+
+% an outer form of itemize that does not indent
+% the paragraph.
+
+\definecomplexorsimpleempty\startouteritemize
+\def\complexstartouteritemize[#1]{\begingroup
+ \startitemize[width=1sp,#1]
+ \let\doitem\item
+ \def\item{\doitem[]\hbox{}\kern12pt\rightskip=0pt}%
+}
+
+\def\stopouteritemize{\stopitemize\endgroup}
+
+
+\setupenumerations [indentnext=no]
+
+\setupdescriptions [indentnext=no]
+
+\unexpanded\def\smalltyping{%
+ \switchtobodyfont[tt,9pt]%
+ \setuplocalinterlinespace[line=11pt]%
+ \parindent=0pt
+}
+
+% typing:
+% - prettyverbatim is NOT the default
+% - smaller size
+
+\setuptyping [%
+ style={\smalltyping},
+ option=none,
+ indentnext=no%
+]
+
+\def\footnum#1{#1.}
+
+\setupfootnotes
+ [location=none,
+ width=\textwidth,
+ bodyfont=9pt,
+ before=,
+ numbercommand=\footnum]
+
+\setupfootnotedefinition
+ [location=serried,
+ before=,
+ after=,
+ distance=0.5em]
+
+\setuptabulate
+ [before=\blank,
+ inner=\ss,
+ after=\blank]
+
+\def\startIntroEntry#1%
+ {\blank[line]
+ \startbaselinecorrection
+ \bgroup
+ \setupalign[right]
+ \setuptolerance[verytolerant]
+ \setupindenting[no]
+ \switchtobodyfont[9pt]%
+ \hyphenpenalty10000
+ \parfillskip 0pt plus 1fill
+ \rightskip6pt plus 1fill
+ \ss
+ \bgroup\bf #1\par\egroup
+ \ignorespaces }
+
+\def\stopIntroEntry
+ {\par\egroup \stopbaselinecorrection}
+
+\def\defineIntroEntry[#1][#2][#3]%
+ {\setvalue{start#1}{\startIntroEntry{#2}}%
+ \setvalue {stop#1}{\stopIntroEntry#3}}
+
+\defineIntroEntry[Keywords][Keywords][]
+\defineIntroEntry[Abstract][Abstract][]
+
+% article parameters (other fields and defaults)
+\def\MapsBibData[#1]%
+ {\getparameters [Maps]
+ [SubTitle=,
+ RunningAuthor=,
+ RunningTitle=,
+ Email=,
+ Address=,
+ Page=1,
+ Title=No Title given,
+ Author=No Author given,
+ Period=,
+ Number=99,
+ Year=2006,
+ #1]%
+ \doifnothing\MapsRunningAuthor
+ {\global\let\MapsRunningAuthor\MapsAuthor}%
+ \doifnothing\MapsRunningTitle
+ {\global\let\MapsRunningTitle\MapsTitle}}%
+
+\def\dostartArticle[#1]{%
+ \MapsBibData[#1]
+ \pageno=\MapsPage
+ \count0=\MapsPage
+ \setuppagenumber[number=\MapsPage]
+ \bgroup
+ \hsize = 457pt
+ \let\\\crlf
+ \blank[29pt,force]
+ \switchtobodyfont[rm,24pt]
+ \setupalign[right]
+ {\bf\noindent\MapsTitle\par\blank[6pt]}
+ \ifx\MapsSubTitle\empty \else
+ { \switchtobodyfont[ss,24pt]\sl\noindent
+ \advance \rightskip 0pt plus 2em
+ \MapsSubTitle\par}
+ \fi
+ \doifmodeelse{newstyle}
+ {\blank[22pt]}
+ {\blank[30pt]}
+ \egroup
+ \switchtobodyfont[rm,10pt]
+ \doifmode{newstyle}
+ {\noindent\MapsAuthor\blank[line]}
+ \setupalign[width]
+ \ifMapsInColumns
+ \startcolumns\hyphenpenalty1000
+ \else
+ \clubpenalty10000
+ \widowpenalty10000
+ \fi
+}
+
+\definecolumnset[mapsset][n=2,grid=on]
+
+\def\startArticle{\dosingleempty\dostartArticle}
+
+\def\stopArticle{%
+ {\blank\let\\\crlf
+ \noindent\switchtobodyfont[ss,9pt]%
+ \MapsAuthor
+ \doifsomething{\MapsAddress}{\\\MapsAddress}%
+ \doifsomething{\MapsEmail}{\\\MapsEmail}}%
+ \ifMapsInColumns \stopcolumns \fi
+ \page
+}
+
+\installpagebreakhandler{last}{}
+
+%%% `logos' %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\LATEX{La\TeX}
+\def\LaTeX{La\TeX}
+\def\TEX{\TeX}
+\def\CONTEXT{Con{\TeX}t}
+\def\ConTeXt{Con{\TeX}t}
+\def\METAFONT{Metafont}
+\def\METAPOST{MetaPost}
+\def\POSTSCRIPT{PostScript}
+
+
+%%%%%%%%%%%
+
+\doifmodeelse{onecolumn}{%
+ \setuplayout[width=340pt]
+ \doifmodeelse{asym}{% one col, asymmetric
+ \setuplayout[backspace=187.3pt]%
+ \setuptyping [widetyping][oddmargin=-117pt]
+ \setuppagenumbering [alternative={singlesided,doublesided}]
+ \setupheadertexts
+ [{\hbox{}\hskip-117pt\TiHead}]
+ [{{\tfx\MapsPeriod~}\MapsYear\quad\bf\pagenumber\hskip-30pt\hbox{}}]
+ [{\hbox{}\hskip-147pt{\bf\pagenumber}\quad {\tfx MAPS~}\MapsNumber}]
+ [\AuHead]
+ \setupfootertexts
+ }{% one col, symmetric
+ \setuplayout[backspace=70.3pt]
+ \setuppagenumbering [alternative=doublesided]
+ \setuptyping[blank=halfline]
+ \setupheadertexts
+ [\TiHead]
+ [{{\tfx\MapsPeriod~}\MapsYear\quad\bf\pagenumber\hskip-147pt\hbox{}}]
+ [{\hbox{}\hskip-147pt{\bf\pagenumber}\quad {\tfx MAPS~}\MapsNumber}]
+ [\AuHead]
+ \setupfootertexts
+}}{% two col
+ \setuplayout[width=457pt]
+ \setupcolumns[n=2,tolerance=verytolerant,distance=11pt]
+ \setuplayout[backspace=70.3pt,grid=yes]
+ \setuppagenumbering [alternative=doublesided]
+ \setuptyping[blank=halfline]
+ \setupheadertexts
+ [\TiHead]
+ [{{\tfx\MapsPeriod~}\MapsYear\quad\bf\pagenumber\hskip-30pt\hbox{}}]
+ [{\hbox{}\hskip-30pt{\bf\pagenumber}\quad {\tfx MAPS~}\MapsNumber}]
+ [\AuHead]
+ \setupfootertexts
+}
+
+%\MapsBibData
+% []
+
+%\abovedisplayskip = 12pt
+%\abovedisplayshortskip = 6pt
+
+\newdimen\iabovedisplayskip
+\newdimen\iabovedisplayshortskip
+%\let\abovedisplayskip\iabovedisplayskip
+%\let\abovedisplayshortskip\iabovedisplayshortskip
+
+\setuplanguage
+ [nl]
+ [\c!leftquote=\upperleftsinglesixquote,
+ \c!leftquotation=\upperleftdoublesixquote]
+
+%\protect
+\endinput
diff --git a/tex/context/base/s-mod-00.tex b/tex/context/base/s-mod-00.tex
new file mode 100644
index 000000000..270f7a9b4
--- /dev/null
+++ b/tex/context/base/s-mod-00.tex
@@ -0,0 +1,512 @@
+%D \module
+%D [ file=s-mod-00,
+%D version=very-old,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Documentation Base Environment,
+%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 looks like crap, is not documented, will
+%D change, and used to be called modu-*.tex.
+
+% todo:
+%
+% file inclusions -> hyperlinks
+
+\mainlanguage[en] % better not here
+
+\usemodule[units]
+
+\doifnotmode{mkiv}{
+ \enableactivediscretionaries
+ \newprettytrue
+}
+
+\unprotect
+
+% beter:
+%
+% group -> title
+% title -> category
+% subtitle -> subtitle
+
+% herzien ivm fonts
+
+% nog eens \interface \\ \\ verder doorvoeren
+
+\def\resetmodule
+ {\getrawparameters
+ [Module]
+ [ file=\jobname,
+ version={\currentdate[\v!year,{.},\v!month,{.},\v!day]},
+ system=\CONTEXT,
+ title=,
+ subtitle=,
+ author=Hans Hagen,
+ date=\currentdate,
+ copyright={PRAGMA / Hans Hagen \& Ton Otten},
+ suggestions=]}
+
+\resetmodule
+
+\def\dostartmodule[#1]%
+ {\newcounter\ParagraphNumber
+ \resetmodule
+ \getrawparameters[Module][type=tex,#1]}
+
+\def\startmodule
+ {\starttext
+ \dosingleempty\dostartmodule}
+
+\def\complexmodule[#1]%
+ {\startglobal % i.v.m. \bgroup in \startdocumentation
+ \getrawparameters[Module][#1]
+ \stopglobal % i.v.m. \bgroup in \startdocumentation
+ \moduletitle}
+
+\def\stopmodule
+ {\page
+ \placeregister
+ [\v!index]
+ [\c!balance=\v!yes,
+ \c!indicator=\v!no,
+ \c!criterium=\v!text]
+ \stoptext}
+
+\def\simplemodule#1%
+ {\type{#1}}
+
+\definecomplexorsimple\module
+
+% \startmode[atpragma]
+%
+% \def\TitlePage#1% can be done more efficient
+% {\startMPrun
+% mpgraph := #1 ;
+% input mp-cont ;
+% \stopMPrun
+% \externalfigure
+% [\bufferprefix mprun.#1]
+% [\c!height=\vsize,
+% \c!width=\hsize]}
+%
+% \defineoverlay[titlepage][\TitlePage{512}]
+%
+% \stopmode
+
+\startuseMPgraphic{titlepage}
+
+ width := PaperWidth ;
+ height := PaperHeight ;
+
+ color local_red, local_white, local_blue ;
+
+ local_white := white ;
+
+ local_blue := local_white randomized (.6,.8) ;
+ local_red := local_white randomized (.3,.4) ;
+
+ u := width/400 ;
+
+ def a_module (expr dx, dy) =
+ picture p ; p := image
+ ( ddy := 0 ; sx := 60u ;
+ for i=1 upto (4 randomized 2) :
+ sy := 7u randomized 3u ;
+ fill unitsquare xyscaled(sx,sy) shifted (0,ddy)
+ withcolor local_red ;
+ ddy := ddy + sy + 4u ;
+ endfor ) ;
+ p := p shifted (dx,dy) shifted - center p ;
+ fill boundingbox p enlarged 8u withcolor local_white ;
+ fill boundingbox p enlarged 4u withcolor local_blue ;
+ draw p ;
+ enddef ;
+
+ set_grid(width, height, width/15, height/15) ;
+ forever:
+ if new_on_grid(uniformdeviate width,uniformdeviate height):
+ a_module(dx,dy) ;
+ fi ;
+ exitif grid_full ;
+ endfor ;
+
+ clip currentpicture to unitsquare xyscaled(width,height) ;
+\stopuseMPgraphic
+
+\defineoverlay
+ [titlepage]
+ [\useMPgraphic{titlepage}]
+
+\doifmode{atpragma}{\readfile{s-mod-04.tex}{}{}}
+
+\defineframed
+ [TitleFrame]
+ [\c!background=\v!color,
+ \c!backgroundcolor=white,
+ \c!align=\v!right,
+ \c!offset=12pt,
+ \c!strut=\v!no,
+ \c!frame=\v!off,
+ \c!bottom=]
+
+\definelayout
+ [titlepage]
+ [\c!backspace=0pt,
+ \c!topspace=0pt,
+ \c!header=0pt,
+ \c!footer=0pt,
+ \c!height=\v!middle,
+ \c!width=\v!middle]
+
+\def\moduletitle
+ {\setuplayout[titlepage]
+ \ifx\ModuleNumber\undefined \else
+ \ifnum\ModuleNumber<10
+ \edef\ModuleNumber{00\ModuleNumber}
+ \else\ifnum\ModuleNumber<100
+ \edef\ModuleNumber{0\ModuleNumber}
+ \fi\fi
+ \setupbackgrounds
+ [\v!page]
+ [\c!background=titlepage]
+ \fi
+ \startmakeup[\v!standard][\c!headerstate=\v!none,\c!footerstate=\v!none]
+ \switchtobodyfont[14.4pt,ss]
+ \bgroup
+ \def\CONTEXT {Con\kern-.15em\TeX t}
+ \def\TEXUTIL {\TeX Util}
+ \def\PPCHTEX {PPCH\TeX}
+ \def\METAPOST{MetaPost}
+ \hfill
+ {\definedfont[SansBold at 96pt]\setstrut
+ \TitleFrame{\Modulesystem}}
+ \vfill
+ \definetabulate[temp][|l|l|]%
+ \switchtobodyfont[17.3pt,ss]
+ \hfill
+ {\bf\setstrut
+ \TitleFrame
+ {\insidefloattrue\setuptabulate[\c!before=,\c!after=]%
+ \starttemp
+ \doifsomething{\Moduletitle}
+ {\NC title \EQ \Moduletitle \NC\NR}%
+ \doifsomething{\Modulesubtitle}
+ {\NC subtitle \EQ \Modulesubtitle \NC\NR}%
+ \doifsomething{\Moduleauthor}
+ {\NC author \EQ \Moduleauthor \NC\NR}%
+ \NC date \EQ \currentdate \NC\NR
+ %\doifsomething{\Modulesuggestions} % todo: generates space
+ % {\NC suggestions \NC \Modulesuggestions \NC\NR}%
+ \stoptemp}}
+ \egroup
+ \stopmakeup
+ \ifx\ModuleNumber\undefined \else
+ \setupbackgrounds
+ [\v!page]
+ [\c!background=]
+ \fi
+ \setuplayout}
+
+\let\stopdocumentation=\relax
+
+\def\startdocumentation
+ {\bgroup
+ \doglobal\newcounter\NOfMarginLines
+ \def\stopdocumentation{\par\egroup}}
+
+\newif\ifcompressdefinitions
+
+\def\startcompressdefinitions {\global\compressdefinitionstrue}
+\def\stopcompressdefinitions {\global\compressdefinitionsfalse}
+
+\gdef\CompressDefinitions%
+ {\ifcompressdefinitions
+ \switchtobodyfont[\v!small]%
+ \fi}
+
+\startnotmode[nocode]
+
+ \definetyping
+ [definition]
+
+ \setuptyping
+ [definition]
+ [\c!before={\page[\v!preference]}\blank\PresetParagraphNumber\CompressDefinitions,
+ \c!after=\ResetParagraphNumber\blank,
+ \c!option=\Moduletype]
+
+\stopnotmode
+
+\startmode[nocode]
+
+% \definieerbuffer[definition] % ignore
+
+ \long\def\startdefinition#1\stopdefinition{}
+
+\stopmode
+
+\definetyping [PL] [\c!option=PL, \c!margin=\v!standard]
+\definetyping [JV] [\c!option=JV, \c!margin=\v!standard]
+\definetyping [MP] [\c!option=MP, \c!margin=\v!standard]
+\definetyping [TEX] [\c!option=TEX,\c!margin=\v!standard]
+
+\setuptyping [\v!typing] [\c!margin=\v!standard]
+\setuptyping [\v!file] [\c!margin=\v!standard]
+\setuptyping [definition] [\c!margin=0pt]
+
+\newcounter\NOfMarginLines
+\newcounter\ParagraphNumber
+
+\def\ResetParagraphNumber
+ {\egroup}
+
+\def\PresetParagraphNumber
+ {\bgroup
+ \xdef\NOfTextLines%
+ {\the\prevgraf}%
+ \doglobal\decrement\NOfMarginLines
+ \doglobal\increment\ParagraphNumber
+ \message{.}%
+ \gdef\ShowParagraphNumber%
+ {\llap{\slx\ParagraphNumber\hskip\leftmargindistance}}%
+ \gdef\ShowParagraphNumberA%
+ {\ifnum\NOfMarginLines>\NOfTextLines\relax
+ \doglobal\increment\NOfTextLines
+ \else
+ \ShowParagraphNumber
+ \global\let\ShowParagraphNumberA=\relax
+ \global\let\ShowParagraphNumberB=\ShowParagraphNumber
+ \doglobal\newcounter\NOfMarginLines
+ \fi}%
+ \gdef\ShowParagraphNumberB%
+ {}%
+ \EveryLine
+ {\ShowParagraphNumberA}%
+ \EveryPar
+ {\vadjust{\nobreak}%
+ \ShowParagraphNumberB}}
+
+\EveryPar % skip one
+ {\EveryPar
+ {\doglobal\newcounter\NOfMarginLines}}
+
+\def\dodomargeaanduidingen[#1]#2%
+ {\def\docommand##1%
+ {\indent\hbox
+ {\ifx#2\relax
+ \index{##1}%
+ \else
+ \index{#2{##1}}%
+ \fi
+ #2{\doboundtext{##1}{\leftmarginwidth}{..}}}%
+ \doglobal\increment\NOfMarginLines
+ \endgraf}%
+ \processcommalist[#1]\docommand}
+
+\def\margeaanduidingen#1[#2]%
+ {\def\domargeaanduidingen##1##2%
+ {\margintitle[#2]%
+ {\switchtobodyfont[\v!small]%
+ \doglobal\newcounter\NOfMarginLines
+ \dodomargeaanduidingen[##1]#1%
+ \scratchcounter=\NOfMarginLines
+ \multiply\scratchcounter by 10
+ \divide\scratchcounter by 12
+ \advance\scratchcounter by 1
+ \xdef\NOfMarginLines{\the\scratchcounter}%
+ \processcommalist[##2]\index}}%
+ \dodoublegroupempty\domargeaanduidingen}
+
+\def\complexmacros{\margeaanduidingen\tex }
+\def\complexextras{\margeaanduidingen\relax}
+
+\def\complexelements
+ {\margeaanduidingen\someelement}
+
+\def\someelement#1{\type{<#1>}}
+
+\definecomplexorsimpleempty\macros
+\definecomplexorsimpleempty\extras
+\definecomplexorsimpleempty\elements
+
+\def\showelements{\dodoubleempty\doshowelements}
+
+\def\doshowelements[#1][#2]
+ {\bgroup
+ \processXMLbuffer
+ \typebuffer
+ \setupcolors[\c!state=\v!stop]
+ \showXSDcomponent[#1][#2]
+ \egroup}
+
+% \macros{a,b}
+% \macros{a,b}{b}
+% \macros[a]{a,b}{b}
+
+% weg ermee
+
+\defineparagraphs [interface] [\c!n=2]
+\setupparagraphs [interface] [1] [\c!width=4cm]
+
+\def\startexample{\par\startnarrower} \let\startvoorbeeld\startexample
+\def\stopexample {\stopnarrower} \let\stopvoorbeeld \stopexample
+
+\gdef\VisualizeLastSpace{\ifdim\lastskip>0pt\unskip\tttf\char32\fi}
+
+\gdef\ShowHeadText #1{\tttf#1\VL\mainlanguage[\currentlanguage]\headtext {#1}\VisualizeLastSpace}
+\gdef\ShowLabelText#1{\tttf#1\VL\mainlanguage[\currentlanguage]\labeltext{#1}\VisualizeLastSpace}
+
+\startbuffer[lang-a]
+\starttable[|l|l|]
+ \HL
+ \VL \bf head key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowHeadText \v!abbreviations \VL\FR
+ \VL \ShowHeadText \v!units \VL\MR
+ \VL \ShowHeadText \v!figures \VL\MR
+ \VL \ShowHeadText \v!graphics \VL\MR
+ \VL \ShowHeadText \v!index \VL\MR
+ \VL \ShowHeadText \v!content \VL\MR
+ \VL \ShowHeadText \v!intermezzi \VL\MR
+ \VL \ShowHeadText \v!logos \VL\MR
+ \VL \ShowHeadText \v!tables \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\startbuffer[lang-b]
+\starttable[|l|l|]
+ \HL
+ \VL \bf label key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowLabelText \v!table \VL\FR
+ \VL \ShowLabelText \v!figure \VL\MR
+ \VL \ShowLabelText \v!intermezzo \VL\MR
+ \VL \ShowLabelText \v!graphic \VL\MR
+ \VL \ShowLabelText \v!chapter \VL\MR
+ \VL \ShowLabelText \v!section \VL\MR
+ \VL \ShowLabelText \v!subsection \VL\MR
+ \VL \ShowLabelText \v!subsubsection \VL\MR
+ \VL \ShowLabelText \v!appendix \VL\MR
+ \VL \ShowLabelText \v!part \VL\MR
+ \VL \ShowLabelText \v!line \VL\MR
+ \VL \ShowLabelText \v!lines \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\startbuffer[lang-c]
+\starttable[|l|l|]
+ \HL
+ \VL \bf label key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowLabelText \v!january \VL\FR
+ \VL \ShowLabelText \v!february \VL\MR
+ \VL \ShowLabelText \v!march \VL\MR
+ \VL \ShowLabelText \v!april \VL\MR
+ \VL \ShowLabelText \v!may \VL\MR
+ \VL \ShowLabelText \v!june \VL\MR
+ \VL \ShowLabelText \v!july \VL\MR
+ \VL \ShowLabelText \v!august \VL\MR
+ \VL \ShowLabelText \v!september \VL\MR
+ \VL \ShowLabelText \v!october \VL\MR
+ \VL \ShowLabelText \v!november \VL\MR
+ \VL \ShowLabelText \v!december \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\startbuffer[lang-d]
+\starttable[|l|l|]
+ \HL
+ \VL \bf label key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowLabelText \v!sunday \VL\FR
+ \VL \ShowLabelText \v!monday \VL\MR
+ \VL \ShowLabelText \v!tuesday \VL\MR
+ \VL \ShowLabelText \v!wednesday \VL\MR
+ \VL \ShowLabelText \v!thursday \VL\MR
+ \VL \ShowLabelText \v!friday \VL\MR
+ \VL \ShowLabelText \v!saturday \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\gdef\ShowTextsValues[#1][#2]%
+ {\vbox\bgroup
+ \language[#1]%
+ \setbox\scratchbox\hbox to \hsize{\hss\bfb#2 language defaults\hss}
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \vskip1em
+ \hrule
+ \vskip2em
+ \halign
+ {\hss##\hss&##\hskip1em&\hss##\hss\cr
+ $\vcenter{\getbuffer[lang-a]}$&&$\vcenter{\getbuffer[lang-b]}$\cr
+ \noalign{\vskip1em}
+ $\vcenter{\getbuffer[lang-c]}$&&$\vcenter{\getbuffer[lang-d]}$\cr}%
+ \egroup}
+
+\gdef\ShowLanguageValues[#1][#2]#3#4%
+ {\hbox to \hsize
+ {\hss
+ \vbox
+ \bgroup
+ \language[#1]%
+ \let\normalbar=|
+ \starttable[||||]
+ \HL
+ \VL \THREE{\bf subsentence symbol and quotes} \VL\SR
+ \HL
+ \VL \quotation{#3 #4} \VL \quote{#2} \VL \let|=\normalbar |<||<|#3|>|#4|>| \VL\FR
+ \VL \quotation{#3 #4} \VL \quote{#2} \VL |<||<|#3|>|#4|>| \VL\LR
+ \HL
+ \stoptable
+ \egroup
+ \hss}}
+
+\gdef\doShowAllLanguageValues[#1][#2]#3#4%
+ {\vbox
+ {\ShowTextsValues[#1][#2]
+ \vskip2em
+ \ShowLanguageValues[#1][#2]{#3}{#4}}
+ \protect
+ \page}
+
+\gdef\ShowAllLanguageValues
+ {\page
+ \unprotect
+ \dodoubleargument\doShowAllLanguageValues}
+
+\protect
+
+%D Command references:
+
+% \input setupa
+% \input setupb
+
+\usemodule[int-load] \loadsetups
+
+\unprotect
+
+% \def\showsetup
+% {\doglobal\newcounter\CurrentArgument
+% \setup}
+
+\def\showsetup#1%
+ {{\def\y##1{\writestatus{setups}{warning: remove y! from #1}}%
+ \setup{#1}}}
+
+\setupframedtexts
+ [setuptext]
+ [\c!background=\v!screen,
+ \c!frame=\v!off]
+
+\protect \endinput
diff --git a/tex/context/base/s-mod-01.tex b/tex/context/base/s-mod-01.tex
new file mode 100644
index 000000000..4454986ce
--- /dev/null
+++ b/tex/context/base/s-mod-01.tex
@@ -0,0 +1,157 @@
+%D \module
+%D [ file=s-mod-01,
+%D version=very-old,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Documentation Paper Environment,
+%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 looks like crap, is not documented, will
+%D change, and used to be called modu-*.tex.
+
+\usemodule[mod-00,abr-01]
+
+\dontcomplain
+
+\unprotect
+
+\setupbodyfont
+ [10pt]
+
+\definetypeface
+ [narrowtt] [tt]
+ [mono] [modern-cond] [default] [encoding=\defaultencoding]
+
+\setuptyping[\v!typing][\c!style=\narrowtt]
+\setuptype [\v!type] [\c!style=\narrowtt]
+
+\mainlanguage
+ [en]
+
+\setupwhitespace
+ [\v!big]
+
+\setuptolerance
+ [\v!tolerant]
+
+\emergencystretch=5em
+
+\setuplayout
+ [\c!backspace=3.5cm,
+ \c!leftmargin=1.75cm,
+ \c!rightmargin=0cm,
+ \c!margindistance=.5cm,
+ \c!leftedgedistance=.25cm,
+ \c!rightedgedistance=.5cm,
+ \c!edge=1.5cm,
+ \c!width=15.55333cm, % 13.998cm at 9pt => 15.55333 at 10pt
+ \c!topspace=2cm,
+ \c!header=1.25cm,
+ \c!footer=1.25cm,
+ \c!height=middle,
+ \c!style=\ss]
+
+\setupsetup
+ [\c!reference=1]
+
+\startnotmode[single]
+
+ \setuppagenumbering
+ [\c!alternative={\v!doublesided,\v!singlesided}]
+
+\stopnotmode
+
+\setuppagenumbering
+ [\c!location=]
+
+\expanded{\setupfootertexts
+ [\v!edge]
+ [][\v!pagenumber]}
+
+\startmode[single]
+
+ \setupfootertexts
+ [\v!margin]
+ [\filename{\Modulefile}][]
+
+\stopmode
+
+\startnotmode[single]
+
+ \setupfootertexts
+ [\v!margin]
+ [\filename{\Modulefile}][]
+ [\filename{\Modulefile}][]
+
+\stopnotmode
+
+\setupfootertexts
+ [\v!text]
+ [\CONTEXT]
+ [\Moduletitle]
+
+\setupheadertexts
+ [\v!text]
+ []
+ [\Modulesubtitle]
+
+\setupinmargin
+ [\c!location=\v!left]
+
+\setupheads
+ [\c!alternative=\v!inmargin]
+
+\setuphead
+ [\v!chapter]
+ [\c!style=\ssc,
+ \c!page=\v!right,
+ \c!header=\v!empty]
+
+\setuphead
+ [\v!section]
+ [\c!style=\ssb,
+ \c!page=\v!right]
+
+\setuplist
+ [\v!chapter]
+ [\c!style=\v!bold,
+ \c!after=\blank]
+
+\setupcombinedlist
+ [\v!content]
+ [\c!width=3em,
+ \c!aligntitle=\v!yes]
+
+\setupregister
+ [\v!index]
+ [\c!balance=\v!yes,
+ \c!indicator=\v!no]
+
+\startnotmode[nocolor]
+
+\setupcolors
+ [\c!state=\v!start]
+
+\stopnotmode
+
+\startnotmode[color]
+
+ \setupcolors
+ [\c!conversion=\v!always]
+
+ \setuptyping
+ [\c!palet=graypretty]
+
+\stopnotmode
+
+\setupinteraction
+ [\c!state=\v!start,
+ \c!color=,
+ \c!style=]
+
+\protect \endinput
diff --git a/tex/context/base/s-mod-02.tex b/tex/context/base/s-mod-02.tex
new file mode 100644
index 000000000..9dae3ecc0
--- /dev/null
+++ b/tex/context/base/s-mod-02.tex
@@ -0,0 +1,420 @@
+%D \module
+%D [ file=s-mod-02,
+%D version=very-old,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Documentation Screen Environment,
+%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 looks like crap, is not documented, will
+%D change, and used to be called modu-*.tex.
+
+% Macro's
+
+\usemodule[mod-00]
+
+% todo: internationalize + setups
+
+\setuphead[paragraaf][expansion=command]
+\setuphead[section][expansion=command]
+
+\def\complexmodule[#1]% redefined
+ {\startglobal % i.v.m. \bgroup in \startdocumentation
+ \getparameters[Module][#1]
+ \stopglobal % i.v.m. \bgroup in \startdocumentation
+ %%\section{\Modulesubtitle}
+ \xdef\Temp{\Modulesubtitle}%%Modulesubtitle:\framed{BEGIN \Modulesubtitle END} :#1 !}
+ \@EA\section\@EA{\Temp}
+ \WriteLists}
+
+\def\stopmodule % redefined
+ {\page
+ \determineregistercharacteristics
+ [index]
+ [criterium=section]
+ \ifutilitydone
+ \pagereference
+ [index]
+ \placeregister
+ [index]
+ [balance=yes,
+ indicator=no,
+ criterium=section]
+ \fi}
+
+\let\ComposeLists=\relax
+
+\newcounter\ModuleNumber
+
+\newwrite\BatchFile \openout\BatchFile=\jobname.bat
+
+\def\WriteBatchFile
+ {\doglobal\increment\ModuleNumber
+% \immediate\write\BatchFile{call modu-run \FileName\space \ModuleNumber}}
+% \immediate\write\BatchFile{texmfstart texutil --modu \FileName}}
+ \immediate\write\BatchFile{texmfstart texexec --pdf --modu --batch \FileName }}
+
+\newif\ifProcessingPublic
+
+\def\WriteLists
+ {\writetolist[FileNames] {}{\FileName}
+ \writetolist[GroupItems]{}{\GroupItem}}
+
+\def\moduletitle{}
+
+\def\TypeZeroModule#1%
+ {\section{[to be extracted: #1]}
+ {\em This module is not yet split off.}
+ \WriteLists}
+
+\def\TypeOneModule#1%
+ {\section{[to be documented: #1]}
+ {\em This module is not yet fully documented.}
+ \WriteLists}
+
+\def\TypeTwoModule#1%
+ {\ifProcessingPublic
+ \readfile{#1.ted}{}{}%
+ \WriteBatchFile
+ \else
+ \section{[not yet public: #1]}
+ {\em This module is documented but not yet public.}
+ \WriteLists
+ \fi}
+
+\def\TypeThreeModule#1%
+ {\readfile{#1.ted}{}{}%
+ \WriteBatchFile}
+
+\def\processmodule#1#2%
+ {\page
+ \bgroup
+ \def\FileName{#1}
+ \setupreferencing[prefix=#1]
+ \useexternaldocument[PaperVersion][#1][]
+ \aftersplitstring#1\at-\to\GroupItem
+ \ComposeLists
+ \ifcase#2
+ \TypeZeroModule{#1}
+ \or
+ \TypeOneModule{#1}
+ \or
+ \TypeTwoModule{#1}
+ \or
+ \TypeThreeModule{#1}
+ \fi
+ \page
+ \setupreferencing[prefix=]
+ \egroup}
+
+\def\ModuleGroup#1#2%
+ {\page
+ \let\Modulefile=\empty
+ \setupreferencing[prefix=#1]
+ \def\FileGroup{#1}
+ \writetolist[FileGroups]{}{\FileGroup}
+ \chapter[content]{#2}
+ \MakeListOfItems
+ \MakeListOfNames
+ \MakeListOfGroups
+ \placecontent[criterium=chapter,level=section]}
+
+% Layout
+
+\setupbodyfont
+ [9pt]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [backspace=72.5pt,
+ leftmargin=50pt,
+ leftmargindistance=12.5pt,
+ rightmargin=0pt,
+ rightedge=80pt,
+ rightedgedistance=10pt,
+ leftedge=0pt,
+ width=430pt,
+ topspace=10pt,
+ header=0pt,
+ footer=30pt,
+ bottomdistance=10pt,
+ bottom=15pt,
+ height=410pt,
+ style=\ss]
+
+\setuptyping
+ [palet=colorpretty]
+
+\setupsetup
+ [reference=3]
+
+\definecolor [AchtergrondKleur] [s=.6]
+\definecolor [ButtonKleur] [r=.2,g=.2,b=.6]
+\definecolor [TekstKleur] [r=.6,g=.2,b=.2]
+
+\definecolor [colorprettyone] [r=.6,g=.0,b=.0] % red
+\definecolor [colorprettytwo] [r=.0,g=.6,b=.0] % green
+\definecolor [colorprettythree] [r=.0,g=.0,b=.6] % blue
+\definecolor [colorprettyfour] [r=.6,g=.6,b=.0] % yellow
+
+\setupinteraction
+ [state=start,
+ page=yes,
+ contrastcolor=,
+ menu=on,
+ color=]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=AchtergrondKleur,
+ offset=2.5pt] % this offset influences the menus!
+
+\setupbackgrounds
+ [text,footer]
+ [text,leftmargin]
+ [background=color,
+ backgroundcolor=white]
+
+\setupsubpagenumber
+ [way=bysection,
+ state=start]
+
+\setupinteractionbar
+ [frame=off,
+ offset=0pt,
+ height=fit]
+
+\setupwhitespace
+ [big]
+
+\setuptyping
+ [typing]
+ [option=color]
+
+\setuptyping
+ [definition]
+ [option=color]
+
+\setuptyping
+ [file]
+ [option=color]
+
+\setuppagenumbering
+ [alternative=singlesided,
+ way=bysection,
+ state=none]
+
+\setupinmargin
+ [location=left]
+
+\setupheads
+ [alternative=inmargin]
+
+\setuphead
+ [chapter]
+ [style=\ssc,
+ page=right]
+
+\setuphead
+ [section]
+ [style=\ssb,
+ page=right]
+
+\setuplist
+ [chapter]
+ [style=bold,
+ after=\blank]
+
+\setupcontent
+ [width=2em]
+
+\setupindex
+ [balance=yes,
+ indicator=no]
+
+\setupcolors
+ [state=start]
+
+\def\TitelBlad#1%
+ {\startstandardmakeup
+ \definefont[GrootFont] [SansBold at 72pt]
+ \definefont[MiddelFont][Sans at 32pt]
+ \definefont[KleinFont] [Sans at 24pt]
+ \startcolor[AchtergrondKleur]
+ \vskip12pt
+ \midaligned{\GrootFont\setstrut\strut Con\TeX t}
+ \vskip24pt
+ \midaligned{\MiddelFont\setstrut\strut #1}
+ \vskip24pt
+ \midaligned{\KleinFont\setstrut\strut Hans Hagen}
+ \vfilll
+ \midaligned{\KleinFont\setstrut\strut PRAGMA ADE}
+ \vskip24pt
+ \midaligned{\KleinFont\setstrut\strut www.pragma-ade.com --- \currentdate}
+ \vskip12pt
+ \stopcolor
+ \stopstandardmakeup}
+
+\def\ColofonBlad
+ {\startmode[atpragma]
+ \page
+ \bgroup
+ \def\PragmaHoogte {\makeupheight}
+ \def\PragmaBreedte{\textwidth}
+ \def\PragmaKopwit {\topspace}
+ \def\PragmaRugwit {\backspace}
+ \def\PragmaMarge {0pt}
+ \PragmaLijnentrue
+ \PlaatsPragmaLogo[ADE]
+ \vfill
+ todo: colofon
+ \startnarrower[3*middle]
+ This is the official documentation of \CONTEXT\ version
+ \referraldate, a \TEX\ macropackage developed by J.~Hagen
+ \& A.F.~Otten, who both hold the copyrights.
+ \stopnarrower
+ \vfill
+ \page
+ \egroup
+ \stopmode}
+
+\def\ColofonBlad
+ {}
+
+\newbox\ListOfItems
+\newbox\ListOfGroups
+\newbox\ListOfNames
+
+\definelist[FileNames] \def\FileName {}
+\definelist[FileGroups] \def\FileGroup {}
+\definelist[GroupItems] \def\GroupItem {}
+
+\setuplist
+ [FileNames,FileGroups,FileGroups]
+ [expansion=yes,
+ pagenumber=no,
+ style=\ss\bf]
+
+\setuplist
+ [FileNames]
+ [command=\FileNameEntry,
+ after=\endgraf,
+ alternative=none] % horizontal
+
+\setuplist
+ [FileGroups]
+ [command=\FileGroupEntry,
+ after=\hss,
+ alternative=horizontal]
+
+\def\FileNameEntry#1#2#3%
+ {\strut\hbox{#2}\endgraf}
+
+\def\FileGroupEntry#1#2#3%
+ {\strut\hbox{#2}\endgraf}
+
+\def\MakeListOfItems
+ {\setbox\ListOfItems=\vbox
+ {\ss\bf
+ \placelist[GroupItems][color=ButtonKleur,contrastcolor=white,criterium=chapter]}}
+
+\def\MakeListOfNames
+ {\setbox\ListOfNames=\vbox
+ {\hsize\rightedgewidth
+ \ss\bf\setupinterlinespace
+ \startsimplecolumns[distance=10pt]
+ \placelist[FileNames][color=ButtonKleur,contrastcolor=white,criterium=chapter]
+ \stopsimplecolumns}}
+
+\def\MakeListOfGroups
+ {\setbox\ListOfGroups=\hbox to \textwidth
+ {\ss\bf
+ \setupinteraction[color=ButtonKleur]%
+ \placelist[FileGroups][color=ButtonKleur,contrastcolor=white,criterium=all]\unskip\unskip}}
+
+\setbox\ListOfGroups=\hbox{}
+
+%\setupfootertexts
+% [rand]
+% []
+% [{\interactiebalk[variant=g]}]
+
+\setupinteractionmenu
+ [right,bottom]
+ [state=start,
+ frame=off,
+ color=AchtergrondKleur,
+ contrastcolor=white,
+ style=\ss\bf,
+ height=15pt,
+ offset=0pt,
+ inbetween=\vskip5pt,
+ background=color,
+ backgroundcolor=ButtonKleur]
+
+\startinteractionmenu[right]
+ \boxofsize \vbox \textheight \footerdistance \footerheight 5pt
+ \bgroup
+ \copy\ListOfNames
+ \vfill
+ \but [\FileGroup:content] local contents \\
+ \but [\FileName:index] local register \\
+ \but [PaperVersion::begin] paper version \\
+ \but [content] main contents \\
+ \but [index] main register \\
+ \but [PreviousJump] previous jump \\
+ \but [CloseDocument] close document \\
+ \unskip
+ \egroup
+\stopinteractionmenu
+
+\startinteractionmenu[bottom]
+ \unhcopy\ListOfGroups
+\stopinteractionmenu
+
+\def\placemoduleregister
+ {\startbackmatter
+ \setupsubpagenumber[reset]
+ \title[-:index]{Register}
+ \placeregister[index]
+ \stopbackmatter}
+
+\def\placemodulecontent
+ {\startfrontmatter
+ \title[-:content]{Contents}
+ \setupinteractionbar[state=stop]
+ \placecontent[criterium=text,level=chapter]
+ \stopfrontmatter}
+
+\setupcontent
+ [pagenumber=no,
+ level=chapter,
+ interaction=all,
+ style=,
+ before=,
+ after=]
+
+\setupfootertexts
+ [margin]
+ [\tt\Modulefile]
+ []
+
+\setupfootertexts
+ [text]
+ [chapter][chapter]
+
+\setupindex
+ [symbol=1]
+
+\setuptolerance
+ [verytolerant]
+
+\endinput
diff --git a/tex/context/base/s-mod.ctx b/tex/context/base/s-mod.ctx
new file mode 100644
index 000000000..a85c991a5
--- /dev/null
+++ b/tex/context/base/s-mod.ctx
@@ -0,0 +1,24 @@
+<?xml version='1.0' standalone='yes'?>
+
+<ctx:job>
+ <ctx:message>TeX Documentation Generator</ctx:message>
+ <ctx:preprocess>
+ <ctx:processors>
+ <ctx:processor name='ted'>mtxrun --script modules --convert --prep <ctx:value name='old'/></ctx:processor>
+ </ctx:processors>
+ <ctx:files>
+ <ctx:file processor='ted'><ctx:value name='old'/></ctx:file>
+ </ctx:files>
+ </ctx:preprocess>
+ <ctx:flags>
+ <!-- ctx:flag>purge</ctx:flag -->
+ <ctx:flag>global</ctx:flag>
+ <ctx:flag>prep</ctx:flag>
+ </ctx:flags>
+ <ctx:process>
+ <ctx:resources>
+ <ctx:module>mod-01</ctx:module>
+ </ctx:resources>
+ </ctx:process>
+</ctx:job>
+
diff --git a/tex/context/base/s-pre-00.tex b/tex/context/base/s-pre-00.tex
new file mode 100644
index 000000000..7b22e2fd9
--- /dev/null
+++ b/tex/context/base/s-pre-00.tex
@@ -0,0 +1,202 @@
+%D \module
+%D [ file=s-pre-00,
+%D version=1997.07.22,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 0,
+%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 provides some non core functionality that can
+%D be used in the presentations styles. This module contains
+%D experimental macros.
+%D
+%D The presentation environments are independent of each other.
+%D Although they have much in common, and in many cases can be
+%D exchanged, the common components are not collected in this
+%D file. That way they can serve as examples of style
+%D definitions.
+
+\unprotect
+
+\newbox \presentationstack
+\newcounter \presentationcounter
+\newdimen \presentationheight
+
+\appendtoks\doglobal\newcounter\presentationcounter\to\everyshipout
+
+\defineframedtext
+ [presentationshield]
+
+\setupframedtexts
+ [presentationshield]
+ [\c!background=\v!color,
+ \c!backgroundcolor=StepColor,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off]
+
+\definecolor[StepColor][white]
+
+\def\enablepresentationstep%
+ {\let\enablepresentationstep\relax
+ \useJSpreamblenow{presentation}%
+ \setuptexttexts
+ [\vbox to \textheight
+ {\dopresentationstep1\box\presentationstack\vfill}]}
+
+\def\presentationstep
+ {\dopresentationstep0}
+
+\def\dopresentationstep#1% not ok yet
+ {\global\setbox\presentationstack=\vbox
+ {\ifnum\presentationcounter=0
+ \global\presentationheight=\!!zeropoint
+ \fi
+ \ifcase#1\relax
+ \scratchdimen=\pagetotal
+ \else
+ \scratchdimen=\textheight
+ \fi
+ \advance\scratchdimen by -\presentationheight
+ \edef\presentationstepheight{\the\scratchdimen}
+ \global\presentationheight=\pagetotal
+ \forgetall
+ \offinterlineskip
+ \dontcomplain
+ \box\presentationstack
+ \doglobal\increment\presentationcounter
+ \scratchcounter=\realpageno \multiply\scratchcounter by 100
+ \advance\scratchcounter by \presentationcounter
+ \edef\presentationtag{presentation:\the\scratchcounter}
+ \setupfield
+ [presentation]
+ [\c!width=\v!fit,\c!height=\v!fit,\c!offset=\v!overlay,
+ \c!strut=\v!no,\c!frame=\v!off,\c!option=\v!readonly]
+ \definesymbol
+ [\presentationtag]
+ [\presentationshade]
+ \def\presentationshade
+ {\presentationshield
+ [\c!width=\textwidth,\c!height=\presentationstepheight]{}}
+ \definefield[\presentationtag][check][presentation][\presentationtag,\v!none][\presentationtag]
+ \fitfield[\presentationtag]}}
+
+\startJSpreamble {presentation} used later
+ var presentation = new Array() ;
+ for (i=1;i<=\lastpage;i++)
+ { presentation[i] = 0 }
+ this.dirty = false ;
+ function NextPresentation (pagenumber)
+ { % ++presentation[pagenumber] ;
+ presentation[pagenumber] = presentation[pagenumber] + 1 ;
+ var dummy = 100*pagenumber + presentation[pagenumber] ;
+ var v = this.getField("presentation:"+dummy) ;
+ if (v)
+ { v.hidden = true }
+ % { v.display = display.hidden }
+ else
+ { ++pagenumber ;
+ if (pagenumber<=\lastpage)
+ { presentation[pagenumber] = presentation[pagenumber] + 1 ;
+ dummy = 100*(pagenumber) + presentation[pagenumber] ;
+ v = this.getField("presentation:"+dummy) ;
+ if (v) { v.hidden = true }
+ % if (v) { v.display = display.hidden }
+ ++this.pageNum } }
+ this.dirty = false }
+\stopJSpreamble
+
+\definereference[NextStep][JS(NextPresentation{\realfolio})]
+
+%D \macros
+%D {presentationstep}
+%D
+%D The macro \type {\presentationstep} provides a basic slide
+%D show functionality. It sort of records pieces of the page
+%D that will show up stepwise. It can be used like:
+%D
+%D \starttyping
+%D \startitemize
+%D \item eerste
+%D \item tweede
+%D \stopitemize
+%D
+%D \presentationstep
+%D
+%D \startformula
+%D ax^2+bx+c
+%D \stopformula
+%D
+%D \presentationstep
+%D \stoptyping
+%D
+%D When the document is opened, the two text fragments are
+%D covered by a shield. Each page has its own shield stack. The
+%D logical reference \type {NextStep} can be used to hide the
+%D shield.
+%D
+%D \starttyping
+%D \setupfootertexts[{\button{Show Up}[NextStep]}]
+%D \stoptyping
+%D
+%D In case of presentation style 2, you can say:
+%D
+%D \starttyping
+%D \definereference[Whatever][JS(NextPresentation{\realfolio})]
+%D \stoptyping
+%D
+%D Depending of the viewer, you need to reset the fields at
+%D startup:
+%D
+%D \starttyping
+%D \setupinteraction[openaction=ResetForm]
+%D \stoptyping
+%D
+%D Fixed spacing give you the best results:
+%D
+%D \starttyping
+%D \setupwhitespace[fixed]
+%D \setupblank[fixed]
+%D \stoptyping
+%D
+%D Sometimes you need to set the color of the background, as
+%D with style 2:
+%D
+%D \starttyping
+%D \definecolor[StepColor][Page]
+%D \stoptyping
+%D
+%D Special effects can be reached with:
+%D
+%D \starttyping
+%D \setupframedtexts
+%D [presentationshield]
+%D [background=color,backgroundcolor=red]
+%D \stoptyping
+%D
+%D There is also:
+%D
+%D \starttyping
+%D \autopresentationsteptrue
+%D \stoptyping
+%D
+%D One can enable this feature as \type {step} mode.
+
+\newif\ifautopresentationstep
+
+\appendtoks \ifautopresentationstep\presentationstep\fi \to \everypar
+
+\doifmode{step} {\enablepresentationstep}
+\doifmode{autostep}{\autopresentationsteptrue\enablepresentationstep}
+
+%D When in \type {comment} mode, embedded page comments are
+%D processed and put below the page. The default space of
+%D 5cm should be adequate but can of course be changed.
+
+\doifmode{comment}{\setuppagecomment[state=start,location=bottom]}
+
+\protect \endinput
diff --git a/tex/context/base/s-pre-01.tex b/tex/context/base/s-pre-01.tex
new file mode 100644
index 000000000..b86133fa6
--- /dev/null
+++ b/tex/context/base/s-pre-01.tex
@@ -0,0 +1,404 @@
+%D \module
+%D [ file=s-pre-01,
+%D version=1997.07.22,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 1,
+%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 environment can be used to typeset interactive
+%D presentations. This module was first used at the 1997 \TUG\
+%D meeting.
+
+\usemodule[pre-general]
+
+%D \macros
+%D {language}
+%D
+%D Because this module is defined in english, we default to the
+%D english hyphenation patterns and labels too.
+
+\language
+ [en]
+
+%D \macros
+%D {setupbodyfont,setuplayout}
+%D
+%D For screen reading, a Lucida Bright font looks nice. We use
+%D a 14.4 point bodyfont for the main text, but switch back to
+%D 12 points for ornaments.
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+\setuplayout
+ [style=smallbodyfont]
+
+%D \macros
+%D {setupcolors,definecolor}
+%D
+%D Screen presentations without color just look dull, so we
+%D enable color support. We define ourselves a yellowish
+%D backgroundcolor and a not too dark blue interactioncolor.
+
+\setupcolors
+ [state=start]
+
+\definecolor [BackgroundColor] [r=1, g=1, b=.7]
+\definecolor [InteractionColor] [r=.1, g=.5, b=.8]
+\definecolor [ContrastColor] [r=.9, g=.5, b=.2]
+
+%D \macros
+%D {setuppapersize,setuplayout,setupinteractionscreen}
+%D
+%D
+%D We use a nice large screen, and dedicate the right edge and
+%D bottom part to navigational tools. We automatically set
+%D the width and height of the page and start up full screen.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=12pt,
+ header=0pt,
+ footer=0pt,
+ height=402pt, % 450 - 12 - 15 - 12 - 12 + 3
+ bottomdistance=15pt,
+ bottom=12pt,
+ backspace=12pt,
+ margin=0pt,
+ width=fit,
+ edgedistance=12pt,
+ rightedge=96pt]
+
+\setupinteractionscreen
+ [option=max]
+
+%D \macros
+%D {setupbackgrounds}
+%D
+%D We set the pagecolor to yellow except the part of the screen
+%D that is used to display the running text. By seting the
+%D offset to 3pt the text will not touch the yellow parts. We
+%D do not set the depth.
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=BackgroundColor,
+ offset=3pt]
+
+\setupbackgrounds
+ [text][text]
+ [background=color,
+ backgroundcolor=white]
+
+%D I considered the next setup too, but finaly decided to
+%D comment it out.
+%D
+%D \starttyping
+%D \setupbackgrounds
+%D [bottom][text]
+%D [frame=on,
+%D framecolor=white]
+%D \stoptyping
+
+%D \macros
+%D {setupinteraction}
+%D
+%D We did not enable interactive text support yet, so let's do
+%D that now. We force page reference to circumvent problems
+%D with named destinations in buggy viewers.
+
+\setupinteraction
+ [page=yes,
+ color=InteractionColor,
+ contrastcolor=ContrastColor,
+ menu=on,
+ state=start]
+
+%D \macros
+%D {setupinteractionmenu,startinteractionmenu}
+%D
+%D At the bottom of the screen we show two navigational bars.
+%D At the left we show the subpage bar, at the right we use a
+%D non default backward|/|forward bar.
+
+\setupinteractionmenu
+ [bottom]
+ [leftoffset=-3pt,
+ rightoffset=-3pt]
+
+\startinteractionmenu[bottom]
+ \txt \InteractionBar \\
+ \txt \InteractionButtons \\
+\stopinteractionmenu
+
+%D \macros
+%D {interactionbar}
+%D
+%D The left bar gets a white border (on the yellow background).
+%D Because we don't want to typeset an empty frame when no
+%D subpage bar is shown, we check for the number of subpages.
+
+\def\InteractionBar%
+ {\ifnum\nofsubpages>1
+ \framed
+ [framecolor=white,rulethickness=1pt,
+ height=\bottomheight,strut=no]
+ {\interactionbar[alternative=f,width=.5\makeupwidth,height=1ex]}
+ \fi}
+
+%D \macros
+%D {setupinteractionbar, interactionbuttons}
+%D
+%D The right hand buttons enable us to jump backward and forward,
+%D as well as to the previous and next jump. We also enable to
+%D close the presentation.
+
+\setupinteractionbar
+ [framecolor=white,rulethickness=1pt,
+ height=\bottomheight,strut=no]
+
+\def\InteractionButtons%
+ {\interactionbuttons
+ [width=15em]
+ [PreviousJump,NextJump,
+ firstpage,
+ firstsubpage,previouspage,nextpage,lastsubpage,
+ lastpage,
+ CloseDocument]}
+
+%D \macros
+%D {StartTitlePage, TitlePage}
+%D
+%D The titlepage is rather simple and can be typeset in two
+%D ways:
+%D
+%D \starttyping
+%D \StartTitlePage
+%D text \\ text \\ text
+%D \StopTitlepage
+%D \stoptyping
+%D
+%D or more straightforward:
+%D
+%D \starttyping
+%D \TitlePage{text\\text\\text}
+%D \stoptyping
+%D
+%D The first alternative can be used for more complicated
+%D title pages.
+
+\def\StartTitlePage%
+ {\startstandardmakeup
+ \bfd\setupinterlinespace
+ \setupalign[middle]
+ \vfil
+ \let\\=\vfil}
+
+\def\StopTitlePage%
+ {\vfil\vfil\vfil
+ \stopstandardmakeup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+%D \macros
+%D {TitlePage, Topics, Topic, Subject}
+%D
+%D A presentation after loading this module looks like:
+%D
+%D \starttyping
+%D \TitlePage {About Whatever\\Topics}
+%D
+%D \Topics {Todays Talk}
+%D
+%D \Topic {Some topic}
+%D
+%D \Subject {Alfa}
+%D
+%D .....
+%D
+%D \Subject {Beta}
+%D
+%D .....
+%D \stoptyping
+
+%D \macros
+%D {definehead}
+%D
+%D The commands \type{\Topic} and \type{\Subject} are defined
+%D as copies of head. We use \type{\Nopic} for internal
+%D purposes.
+
+\definehead [Topic] [chapter]
+\definehead [Subject] [section]
+
+\definehead [Nopic] [title]
+
+%D \macros
+%D {setuphead}
+%D
+%D Because chapters and sections do not make sense in
+%D presentations, we use our own command for typesetting the
+%D titles. Sectionnumbers are of course hidden from viewing.
+%D Each topic is followed by a list of subjects that belong
+%D to the topic.
+
+\setuphead
+ [Topic, Nopic, Subject]
+ [command=\HeadLine,
+ page=yes,
+ style=\tfb,
+ after=\blank,
+ sectionnumber=no]
+
+\setuphead
+ [Topic]
+ [after=\PlaceSubjectList]
+
+\setuphead
+ [Subject]
+ [continue=no]
+
+%D \macros
+%D {framed, midalined}
+%D
+%D The command used to typeset the head lines is rather simple.
+%D We just center the framed title. The frame macro optimizes
+%D the alignment and at the same time enables us to typeset a
+%D nice colored rule.
+
+\def\HeadLine#1#2%
+ {\midaligned
+ {\framed
+ [framecolor=BackgroundColor,rulethickness=1pt,
+ width=.8\hsize,align=middle,strut=no]
+ {#2}}}
+
+%D \macros
+%D {setuplist}
+%D
+%D The subject list is automatically placed. We center each
+%D subject line by using one of the default alternatives (g). We
+%D could have said:
+%D
+%D \starttyping
+%D \setuplist
+%D [Subject]
+%D [alternative=none,
+%D command=\SubjectListLine,
+%D interaction=all]
+%D
+%D \def\SubjectListLine#1#2#3%
+%D {\midaligned{#2}}
+%D \stoptyping
+%D
+%D But why should we complicate things when we can use
+%D alternative~\type{g}. The test is only needed if one
+%D does not automatically goes a new page with each subject.
+
+\def\PlaceSubjectList%
+ {\blank
+ \determinelistcharacteristics[Subject]
+ % \ifnum\utilitylistlength>0 \placelist[Subject] \fi}
+ \doifmode{*list}{\placelist[Subject]}}
+
+\setuplist
+ [Subject, Topic]
+ [alternative=g,
+ interaction=all,
+ before=,
+ after=]
+
+% %D \macros
+% %D {setuptexttexts}
+% %D
+% %D The topics will be listed in the right edge, using:
+%
+% \setuptexttexts
+% [edge]
+% [][\TopicList]
+
+%D \macros
+%D {setuplist, placelist,startinteractionmenu}
+%D
+%D The actual topic list is typeset using a \type{\vbox}. We
+%D have to specify \type{criteriumcriterium=all} because otherwise no
+%D list will be typeset. (By default lists are typeset
+%D locally.)
+
+\startinteractionmenu[right]
+ \placelist
+ [Topic]
+ [alternative=f, % command, % none,
+ maxwidth=\hsize,
+ width=\hsize,
+ offset=0pt,
+ criterium=all,
+ align=left,
+ style=\setsmallbodyfont\bfx]
+\stopinteractionmenu
+
+\def\Topics#1% temporary hack
+ {\Nopic{#1}
+ \placelist[Topic][criterium=all]}
+
+\def\Subjects%
+ {}
+
+%D \macros
+%D {setuptexttexts, button}
+%D
+%D During a presentation, we want to use the cursor to point to
+%D parts of the text. Furthermore we want to be able to jump to
+%D the next page, without the need to move the cursor on buttons.
+%D Therefore we make the text part of the screen into an
+%D invisible button.
+
+\setuptexttexts
+ [\GotoNextPage][]
+
+\def\GotoNextPage
+ {\button[width=\hsize,height=\vsize,frame=off]{}[nextpage]}
+
+%D \macros
+%D {setupsubpagenumber}
+%D
+%D The left bottom navigation bar shows the subpages, which will
+%D be counted by text. One can change this in the preentation
+%D itself by saying \type {[way=byTopic]}.
+
+\setupsubpagenumber
+ [way=bytext, % Topic,
+ state=start]
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\TitlePage{Title Page\\pre-original}
+
+\Topics{Some Nice Quotes}
+
+\Topic{A Few}
+
+\Subject{Knuth} \input knuth
+\Subject{Tufte} \input tufte
+
+\Topic{Some More}
+
+\Subject{Zapf} \input zapf
+\Subject{Bryson} \input bryson
+
+\stoptext
diff --git a/tex/context/base/s-pre-02.tex b/tex/context/base/s-pre-02.tex
new file mode 100644
index 000000000..9df1fe383
--- /dev/null
+++ b/tex/context/base/s-pre-02.tex
@@ -0,0 +1,381 @@
+%D \module
+%D [ file=s-pre-02,
+%D version=1998.04.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 2,
+%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 environment can be used to typeset interactive
+%D presentations. This module was first used at the 1998
+%D publishers conference of the European Portable Document
+%D Association (now merged into a graphics association).
+
+\usemodule[pre-general]
+
+%D \macros
+%D {setupbodyfont, switchtobodyfont, setuplayout}
+%D
+%D At \PRAGMA\ we prefer using the Lucida Bright fonts, but
+%D one can of course load another typeface.
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+\setuplayout
+ [style=smallbodyfont]
+
+%D \macros
+%D {setuppapersize, setuplayout}
+%D
+%D The papersize suits the screen dimensions. The layout is
+%D rather simple. We use the whole width of the screen and only
+%D have navigational tools at the bottom of the screen.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [backspace=1cm,
+ topspace=1cm,
+ margin=0pt,
+ header=0pt,
+ footer=0pt,
+ bottomdistance=.875cm,
+ bottom=1cm,
+ width=fit,
+ height=fit]
+
+%D \macros
+%D {setupwhitespace, setuptyping}
+%D
+%D We don't have much height, so we use a more cramped
+%D spacing. Verbatim text looks better when indented.
+%D
+
+\setupwhitespace
+ [medium]
+
+\setuptyping
+ [margin=standard]
+
+%D \macros
+%D {definecolor, setupcolors}
+%D
+%D Of course we enable color. We define some logical colors,
+%D of which most default to the same green shade.
+
+\definecolor [BackgroundColor] [r=.8, g=.8, b=.8]
+\definecolor [OrnamentColor] [r= 0, g=.7, b=.4]
+
+\setupcolors
+ [state=start]
+
+%D \macros
+%D {setupinteraction, setupinteractionscreen}
+%D
+%D We still have to enable interaction mode. We go full
+%D screen!
+
+\setupinteraction
+ [state=start,
+ color=OrnamentColor,
+ contrastcolor=OrnamentColor]
+
+\setupinteractionscreen
+ [option=max,
+ width=fit,
+ height=fit]
+
+%D \macros
+%D {setupitemize}
+%D
+%D And why not bring some color in itemizations too?
+
+\setupitemize
+ [color=OrnamentColor]
+
+%D \macros
+%D {defineoverlay, setupbackgrounds}
+%D
+%D The navigational elements and the backgrounds are
+%D provided by \METAPOST.
+%D
+%D When \METAPOST\ is used, it makes sense to generate the
+%D graphics at runtime. This is supported when one enables
+%D system calls in the local \type {texmf.cnf} file and add the
+%D switch \type {\runMPgraphicstrue} to the local file \type
+%D {cont-sys.tex}. When direct processing is disabled or not
+%D supported, \TEXEXEC\ will take care of graphic generation.
+
+\startuniqueMPgraphic{PageBackground}
+ fill unitsquare
+ xyscaled(OverlayWidth,OverlayHeight)
+ withcolor OverlayColor ;
+ draw unitsquare
+ xyscaled(OverlayWidth,OverlayHeight)
+ enlarged (-2*OverlayLineWidth)
+ withpen pencircle scaled OverlayLineWidth
+ withcolor OverlayLineColor ;
+\stopuniqueMPgraphic
+
+\defineoverlay
+ [PageBackground]
+ [\uniqueMPgraphic{PageBackground}]
+
+\setupbackgrounds
+ [page]
+ [background=PageBackground,
+ backgroundcolor=BackgroundColor,
+ rulethickness=.125cm,
+ framecolor=OrnamentColor]
+
+%D \macros
+%D {setuptexttexts}
+%D
+%D By clicking on the text area, one goes to the next page.
+%D We hook this feature into the text backgrounds.
+
+\startuniqueMPgraphic{TextBackground}
+ draw unitsquare
+ xyscaled(OverlayWidth,OverlayHeight)
+ enlarged (4*OverlayLineWidth)
+ withpen pencircle scaled OverlayLineWidth
+ withcolor OverlayLineColor ;
+\stopuniqueMPgraphic
+
+\defineoverlay
+ [TextBackground]
+ [\uniqueMPgraphic{TextBackground}]
+
+\defineoverlay
+ [NextPage]
+ [\overlaybutton{nextpage}]
+
+\setupbackgrounds
+ [text]
+ [background={TextBackground,NextPage},
+ backgroundcolor=BackgroundColor,
+ rulethickness=.0625cm,
+ framecolor=OrnamentColor]
+
+%D \macros
+%D {setupinteractionmenu,startinteractionmenu}
+%D
+%D At the bottom of the screen, we show three buttons. These
+%D direct us to the previous or next jump or exit the document.
+
+\setupMPvariables[RightArrow][height=\bottomheight]
+\setupMPvariables[LeftArrow] [height=\bottomheight]
+\setupMPvariables[Circle] [height=\bottomheight]
+\setupMPvariables[UpArrow] [height=\bottomheight]
+
+\startuniqueMPgraphic{RightArrow}{height}
+ z1=(0,0) ; z2=(\MPvar{height},.5y3) ; z3=(0,\MPvar{height}) ;
+ drawfill z1--z2--z3--cycle
+ withpen pencircle scaled (\MPvar{height}/5)
+ withcolor \MPcolor{OrnamentColor} ;
+\stopuniqueMPgraphic
+
+\startuniqueMPgraphic{LeftArrow}{height}
+ z1=(\MPvar{height},0) ; z2=(0,.5y3) ; z3=(\MPvar{height},\MPvar{height}) ;
+ drawfill z1--z2--z3--cycle
+ withpen pencircle scaled (\MPvar{height}/5)
+ withcolor \MPcolor{OrnamentColor} ;
+\stopuniqueMPgraphic
+
+\startuniqueMPgraphic{Circle}{height}
+ drawfill fullcircle scaled \MPvar{height}
+ withpen pencircle scaled (\MPvar{height}/5)
+ withcolor \MPcolor{OrnamentColor} ;
+\stopuniqueMPgraphic
+
+\startuniqueMPgraphic{UpArrow}{height}
+ z1=(0,0) ; z2=(\MPvar{height},0) ; z3=(.5x2,\MPvar{height}) ;
+ drawfill z1--z2--z3--cycle
+ withpen pencircle scaled (\MPvar{height}/5)
+ withcolor \MPcolor{OrnamentColor} ;
+\stopuniqueMPgraphic
+
+\setupinteractionmenu
+ [bottom]
+ [state=start,
+ frame=off,
+ width=.3\textwidth,
+ height=\bottomheight]
+
+\setupinteraction
+ [menu=on]
+
+\def\WhateverButton
+ {\doifreferencefoundelse{Whatever}
+ {\raw [Whatever] \uniqueMPgraphic{UpArrow} \\}
+ {}}
+
+\startinteractionmenu[bottom]
+ \but [Topics] \\ % secret button
+ \hfill
+ \WhateverButton % user specific
+ \kern2\bottomheight
+ \raw [previouspage] \uniqueMPgraphic{LeftArrow} \\
+ \kern.5\bottomheight
+ \raw [CloseDocument] \uniqueMPgraphic{Circle} \\
+ \kern.5\bottomheight
+ \raw [nextpage] \uniqueMPgraphic{RightArrow} \\
+ \kern.5\bottomheight
+\stopinteractionmenu
+
+%D \macros
+%D {TitlePage, Topics, Topic, Subject}
+%D
+%D A presentation after loading this module looks like:
+%D
+%D \starttyping
+%D \TitlePage {About Whatever\\Topics}
+%D
+%D \Topics {Todays Talk}
+%D
+%D \Topic {Some topic}
+%D
+%D .....
+%D
+%D \Topic {Next Topic}
+%D
+%D .....
+%D \stoptyping
+
+%D \macros
+%D {StartTitlePage, TitlePage}
+%D
+%D The titlepage is rather simple and can be typeset in two
+%D ways:
+%D
+%D \starttyping
+%D \StartTitlePage
+%D text \\ text \\ text
+%D \StopTitlepage
+%D \stoptyping
+%D
+%D or as one||liner:
+%D
+%D \starttyping
+%D \TitlePage{text\\text\\text}
+%D \stoptyping
+%D
+%D The first alternative can be used for more complicated
+%D title pages.
+
+\def\StartTitlePage%
+ {\startstandardmakeup
+ \bfd\setupinterlinespace
+ \setupalign[middle]
+ \vfil
+ \let\\=\vfil}
+
+\def\StopTitlePage%
+ {\vfil\vfil\vfil
+ \stopstandardmakeup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+%D \macros
+%D {definehead}
+%D
+%D The commands \type{\Topic} and \type{\Subject} are defined
+%D as copies of head. We use \type{\Nopic} for internal
+%D purposes.
+
+\definehead [Topic] [chapter]
+\definehead [Subject] [section]
+
+\definehead [Nopic] [title]
+
+%D \macros
+%D {setuphead}
+%D
+%D We use our own command for typesetting the titles. We hide
+%D sectionnumbers from viewing. Each topic is followed by a
+%D list of subjects that belong to the topic.
+
+\setuphead
+ [Topic, Nopic]
+ [after={\blank[3*medium]},
+ number=no,
+ style=\tfb,
+ page=yes,
+ alternative=middle]
+
+\setuphead
+ [Subject]
+ [after=\blank,
+ number=no,
+ page=yes,
+ continue=no,
+ style=\tfa]
+
+%D \macros
+%D {setuplist}
+%D
+%D When found, the subject list is automatically placed
+%D after the topic head.
+
+\setuplist
+ [Topic,Subject]
+ [alternative=g,
+ interaction=all,
+ before=,
+ after=]
+
+\setuplist
+ [Topic]
+ [criterium=all]
+
+\def\Topics#1%
+ {\determinelistcharacteristics[Topic]
+ \doifmode{*list}
+ {\Nopic[Topics]{#1}
+ \startcolumns
+ \placelist[Topic]
+ \stopcolumns}}
+
+\setuplist
+ [Subject]
+ [criterium=Topic]
+
+\def\Subjects%
+ {\determinelistcharacteristics[Subject]
+ \doifmode{*list}
+ {\placelist[Subject]}}
+
+\setuphead
+ [Topic]
+ [after={\blank[3*medium]\Subjects}]
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\TitlePage{Title Page\\pre-green}
+
+\Topics{Some Nice Quotes}
+
+\Topic{A Few}
+
+\Subject{Knuth} \input knuth
+\Subject{Tufte} \input tufte
+
+\Topic{Some More}
+
+\Subject{Zapf} \input zapf
+\Subject{Bryson} \input bryson
+
+\stoptext
diff --git a/tex/context/base/s-pre-03.tex b/tex/context/base/s-pre-03.tex
new file mode 100644
index 000000000..bdd7960c5
--- /dev/null
+++ b/tex/context/base/s-pre-03.tex
@@ -0,0 +1,257 @@
+%D \module
+%D [ file=s-pre-03,
+%D version=1998.09.06,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 3,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is the third environment for typesetting interactive
+%D presentations. I used this style for a talk on \TEX\ and
+%D \JAVASCRIPT\ at \TUG98, mainly because I didn't want to
+%D use the same style three times. Therefore this is a rather
+%D simple, silly style.
+
+\usemodule[pre-general]
+
+%D \macros
+%D {setupbodyfont}
+%D
+%D We use a large bodyfont. Combined with the fancy
+%D background, this does not leave that much room for text, but
+%D presentations should use much text anyway.
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+%D \macros
+%D {setuppapersize,setuplayout,setupinteractionscreen}
+%D
+%D The page dimensions are set to size \type {S6}, being
+%D 600pt by 450pt. We use wide margins and discard headers
+%D and footers. We also launch the document full screen.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ topspace=75pt,
+ backspace=100pt,
+ header=0pt,
+ footer=0pt]
+
+\setupinteractionscreen
+ [option=max]
+
+%D \macros
+%D {setupcolors,definecolor}
+%D
+%D Next, color support is turned on and a dark red color is
+%D defined. Other red shades will be derived from this one
+%D color.
+
+\setupcolors
+ [state=start]
+
+\definecolor [PageColor] [black]
+\definecolor [BackgroundColor] [s=.85]
+\definecolor [OrnamentColor] [r=.75]
+
+%D \macros
+%D {setupinteraction}
+%D
+%D We turn on interaction mode and use the same color for
+%D hyperlinks and redundant hyperlinks (the ones that point
+%D to the current page).
+
+\setupinteraction
+ [state=start,
+ contrastcolor=OrnamentColor,
+ color=OrnamentColor]
+
+%D \macros
+%D {defineoverlay, setupbackgrounds}
+%D
+%D The joke in this presentation is the elliptical shape of
+%D which the bottom part includes a page indication.
+
+\defineoverlay
+ [PageShape][\useMPgraphic{PageShape}]
+
+% \startuseMPgraphic{PageShape}
+% lin := 20pt ; off := .75lin ;
+% wid := \overlaywidth ; hei := \overlayheight ;
+% pos := \currentpage ; tot := \lastpage ;
+% path bb; bb := unitsquare xscaled wid yscaled hei ;
+% filldraw bb withcolor \MPcolor{PageColor} ;
+% pickup pencircle xscaled .5lin yscaled lin rotated 45 ;
+% pair r, t, l, b ;
+% r := (wid-off,.5hei) ; t := (.5wid,hei-off) ;
+% l := (off,.5hei) ; b := (.5wid,off) ;
+% path p; p := superellipse(r,t,l,b,.8) ;
+% fill p withcolor \MPcolor{Backgroundcolor} ;
+% draw p withcolor \MPcolor{OrnamentColor} ;
+% color contrastcolor ; contrastcolor = 2/3 * \MPcolor{OrnamentColor} ;
+% if (pos>0) and (tot>0):
+% pair pa ; pa := point 5 of p ;
+% pair pb ; pb := point 7 of p ;
+% draw pa withcolor contrastcolor ;
+% draw pb withcolor contrastcolor ;
+% len := 2/tot ;
+% pair pa ; pa := point (5+len*pos) of p ;
+% pair pb ; pb := point (5+len*(pos-1)) of p ;
+% p := p cutafter pa ;
+% p := p cutbefore pb ;
+% draw p withcolor contrastcolor ;
+% fi ;
+% setbounds currentpicture to bb ;
+% \stopuseMPgraphic
+
+\startuseMPgraphic{PageShape}
+ StartPage ;
+ path p ; pair pa, pb ; numeric len ; color contrastcolor ;
+ fill Page withcolor \MPcolor {PageColor} ;
+ pickup pencircle rotated 45 xscaled 10pt yscaled 20pt ;
+ p := Page enlarged (-10pt,-15pt) superellipsed .8 ;
+ p := p shifted (-1.5pt,0) ; % looks better
+ fill p withcolor \MPcolor{BackgroundColor} ;
+ draw p withcolor \MPcolor{OrnamentColor} ;
+ contrastcolor = 2/3 * \MPcolor{OrnamentColor} ;
+ if (PageNumber>0) and (NOfPages>0):
+ draw point 5 of p withcolor contrastcolor ;
+ draw point 7 of p withcolor contrastcolor ;
+ len := 2/NOfPages ;
+ pa := point (5+len*PageNumber) of p ;
+ pb := point (5+len*(PageNumber-1)) of p ;
+ draw (p cutafter pa) cutbefore pb
+ withcolor contrastcolor ;
+ fi ;
+ StopPage ;
+\stopuseMPgraphic
+
+%D We use the viewer provided feature to go to the previous or
+%D next page.
+
+\defineoverlay[PrevButton][\overlaybutton{PreviousPage}]
+\defineoverlay[NextButton][\overlaybutton{NextPage}]
+
+\setupbackgrounds
+ [page]
+ [background={PageShape,PrevButton}]
+
+\setupbackgrounds
+ [text][text]
+ [background=NextButton]
+
+% or using hard coded next/prev pages:
+%
+% \defineoverlay[PrevButton][\overlaybutton{previouspage}]
+% \defineoverlay[NextButton][\overlaybutton{nextpage}]
+%
+% \setupbackgrounds[state=repeat]
+% \setupbackground[text][text][background=NextButton]
+%
+% or simply (using an repeated layer):
+%
+% \setupbackground[text][background=NextButton]
+
+%D \macros
+%D {definehead, setuphead}
+%D
+%D Like the other presentation styles, we use \type {\Topic}
+%D instead of \type {\chapters}. This time we don't provide
+%D an additional sectioning. So we have:
+%D
+%D \starttyping
+%D \TitlePage{How nice}
+%D
+%D \Topics{This is about ...}
+%D
+%D \Topic{The first one}
+%D
+%D \Topic{Another one}
+%D \stoptyping
+
+\definehead [Topic] [chapter]
+\definehead [Nopic] [title]
+
+\setuphead
+ [Topic,Nopic]
+ [after={\blank[3*medium]},
+ number=no,
+ style=\tfb,
+ page=yes,
+ alternative=middle]
+
+\setuplist
+ [Topic]
+ [alternative=g,
+ interaction=all,
+ before=,
+ after=]
+
+\def\Subject
+ {\Topic}
+
+%D The tables of contents is associated with \type
+%D {\Topics}.
+
+\def\Topics#1%
+ {\Nopic[Topics]{#1}
+ \placelist[Topic][criterium=all]}
+
+\def\Subjects
+ {}
+
+%D Instead of \type {\TitlePage}, one can use the pair
+%D \type {\StartTitlePage} -- \type {\StopTitlePage}:
+%D
+%D \starttyping
+%D \StartTitlePage
+%D A Self Made Title
+%D \StopTitlePage
+%D \stoptyping
+
+\def\StartTitlePage%
+ {\startstandardmakeup
+ \bfd\setupinterlinespace
+ \setupalign[middle]
+ \vfil
+ \def\\{\vfil\bfb\setupinterlinespace}}
+
+\def\StopTitlePage%
+ {\vfil\vfil\vfil
+ \stopstandardmakeup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\TitlePage{Title Page\\pre-funny}
+
+\Topics{Some Nice Quotes}
+
+\Topic{A Few}
+
+\Subject{Knuth} \input knuth
+\Subject{Tufte} \input tufte
+
+\Topic{Some More}
+
+\Subject{Zapf} \input zapf
+\Subject{Bryson} \input bryson
+
+\stoptext
diff --git a/tex/context/base/s-pre-04.tex b/tex/context/base/s-pre-04.tex
new file mode 100644
index 000000000..09cc79b72
--- /dev/null
+++ b/tex/context/base/s-pre-04.tex
@@ -0,0 +1,377 @@
+%D \module
+%D [ file=s-pre-04,
+%D version=1998.09.06,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 4,
+%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.
+
+\usemodule[pre-general]
+
+%D \macros
+%D {setupbodyfont}
+%D
+%D This is just another environment for typesetting interactive
+%D presentations. I wrote this module on behalf of a course I
+%D gave for the United Kingdom \TeX\ users group.
+
+\setupbodyfont[ams,pos,14.4pt]
+
+%D \macros
+%D {setupcolors,definecolor}
+%D
+%D I started using dark blue for the navigational elements. In
+%D that context, dark red is a logical choice for the contrast
+%D color. While playing around with the navigational elements
+%D I decided to use the not so dominant color yellow for the
+%D status bar.
+%D
+%D A few days before I wrote this style, the recent acquisition
+%D of Mondriaans last painting by the Dutch governement was a
+%D hot topic in the dutch news scenary. Therefore I decided to
+%D replace the rather dull title page by something more
+%D colorful, in mondriaan colors, but far more random than any
+%D of his paintings. For consistence we remap the already
+%D defined primary colors.
+
+\setupcolors [state=start]
+
+\definecolor [NoneColor] [s=.6]
+\definecolor [GotoColor] [b=.6] \definecolor[blue] [GotoColor]
+\definecolor [ExitColor] [r=.6] \definecolor[red] [ExitColor]
+\definecolor [JumpColor] [s=.6]
+\definecolor [UserColor] [g=.6] \definecolor[green] [UserColor]
+\definecolor [StepColor] [r=.6,g=.6] \definecolor[yellow][StepColor]
+
+\definecolor [PageColor] [s=.80] \definecolor[gray] [PageColor]
+\definecolor [TextColor] [s=.90]
+
+%D \macros
+%D {setuppapersize}
+%D
+%D As usual, we take a screen oriented paper size:
+
+\setuppapersize
+ [S6][S6]
+
+%D \macros
+%D {setuplayout,setupinteractionscreen}
+%D
+%D The layout definition fits into this $600\times450$ point
+%D area, but the dimensions are somewhat diffused by the text
+%D background offset.
+
+\setuplayout
+ [width=530pt,
+ height=400pt,
+ header=0pt,
+ footer=0pt,
+ backspace=15pt,
+ topspace=15pt,
+ bottomdistance=15pt,
+ bottom=10pt,
+ margin=0pt,
+ rightedgedistance=15pt,
+ rightedge=30pt]
+
+\setupinteractionscreen
+ [option=max]
+
+%D \macros
+%D {setupbackgrounds}
+%D
+%D Both the page and the text area have a gray background.
+%D The \type {[text,text]} area also has an offset. Later we
+%D will see that we have to compensate for that in the
+%D navigational areas.
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=PageColor]
+
+\setupbackgrounds
+ [text][text]
+ [background=color,
+ backgroundcolor=TextColor,
+ backgroundoffset=5pt]
+
+%D \macros
+%D {setupinteraction}
+%D
+%D For convenient navigation, we turn on interaction.
+
+\setupinteraction
+ [state=start,
+ menu=on,
+ color=UserColor,
+ contrastcolor=NoneColor]
+
+%D \macros
+%D {setupsubpagenumber}
+%D
+%D When navigating the document, we keep the title page out
+%D of sight, therefore we use sub page numbers.
+
+\setupsubpagenumber
+ [state=start,
+ way=bytext]
+
+%D \macros
+%D {setupinteractionmenu}
+%D
+%D There is only one interaction menu, located in the right
+%D edge of the screen. Both offsets enlarge the edge by the
+%D same amount as the text background offset.
+
+\setupinteractionmenu
+ [right]
+ [state=start,
+ frame=off,
+ strut=no,
+ offset=0pt,
+ inbetween=,
+ bottomoffset=-5pt,
+ topoffset=-5pt]
+
+%D \macros
+%D {startinteractionmenu}
+%D
+%D The menu itself is not that spectacular. We use the
+%D start||stop alternative for setting the content. The macro
+%D \type {\interactioncolor} expands into either the
+%D interaction color or the contrast color, the latter only
+%D when no jump is possible.
+
+\startinteractionmenu[right]
+ \setupinteraction[color=GotoColor]
+ \but [previoussubpage] \Triangle {90}\framedwidth\interactioncolor \\
+ \vskip10pt
+ \but [nextsubpage] \Triangle{270}\framedwidth\interactioncolor \\
+ \vfill
+ \but [PreviousJump] \Triangle{180}\framedwidth{NoneColor} \\
+ \vskip-5pt
+ \but [NextJump] \Triangle {0}\framedwidth{NoneColor} \\
+\stopinteractionmenu
+
+%D \macros
+%D {setupinteractionbar}
+%D
+%D The interaction bar at the bottom is also larger than the
+%D normal width of the bottom area.
+
+\setupinteractionbar
+ [alternative=f,
+ width=\textwidth,
+ height=\bottomheight,
+ distance=10pt,
+ color=NoneColor,
+ contrastcolor=StepColor]
+
+%D \macros
+%D {setupbottomtexts}
+%D
+%D The bar is centered in the middle.
+
+\setupbottomtexts
+ [\interactionbar]
+
+%D We can exit viewing with a close button, located on the
+%D rightmost bottom area.
+
+\def\CloseButton
+ {\button
+ [width=\rightedgewidth,height=\bottomheight,offset=overlay,
+ background=color,backgroundcolor=ExitColor,frame=off]
+ {}%
+ [CloseDocument]}
+
+\setupbottomtexts
+ [edge][][\CloseButton]
+
+%D \macros
+%D {definesymbol,setupitemize}
+%D
+%D Because some prominent things are rectangular or triangular,
+%D we prefer some different symbols in itemizations:
+
+\definesymbol[1][$\blacktriangleright$]
+\definesymbol[2][$\blacktriangledown$]
+\definesymbol[3][$\blacktriangleright$]
+\definesymbol[4][$\blacktriangledown$]
+
+\setupitemize[each][color=NoneColor]
+
+%D \macros
+%D {TitlePage,defineoverlay,button,setupalign,
+%D setupbackgrounds,setupinteraction,setupinteractionbar,
+%D startstandardmakeup,switchtobodyfont,setupinterlinespace}
+%D
+%D Now the main layout and navigational definitions are
+%D done, it makes sense to define and tune some structuring
+%D commands. First we build the titlepage.
+
+\defineoverlay [TitleGraphic] [\useMPgraphic{title}]
+\defineoverlay [NextPage] [\overlaybutton{nextpage}]
+
+\def\StartTitlePage
+ {\setupbackgrounds[page][background={color,TitleGraphic,NextPage}]
+ \setupbackgrounds[text][text][background=]
+ \setupinteraction[menu=off]
+ \setupinteractionbar[state=stop]
+ \startstandardmakeup
+ \switchtobodyfont[24pt]
+ \bfd\setupinterlinespace
+ \setupalign[middle]
+ \vfil
+ \let\\=\vfil}
+
+\def\StopTitlePage
+ {\vfil\vfil\vfil
+ \stopstandardmakeup
+ \setupinteraction[menu=on]
+ \setupinteractionbar[state=start]
+ \setupbackgrounds[page][background=color]
+ \setupbackgrounds[text][text][background=color]
+ \setupsubpagenumber[reset]}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+%D \macros
+%D {Topic, Nopic, Subject,
+%D definehead, setuphead}
+%D
+%D We use \type {\Topic} and \type {\Subject} instead of
+%D chapters and sections. The \type {\Nopic} alternative is
+%D meant for internal use.
+
+\definehead [Topic] [chapter]
+\definehead [Nopic] [title]
+\definehead [Subject] [section]
+
+\setuphead
+ [Topic, Nopic]
+ [after={\blank[3*medium]},
+ number=no,
+ style=\tfb,
+ page=yes,
+ alternative=middle]
+
+\setuphead
+ [Subject]
+ [after=\blank,
+ number=no,
+ page=yes,
+ continue=no,
+ style=\tfa]
+
+%D \macros
+%D {Topics, Subjects,
+%D setuplist, placelist, startcolumns}
+%D
+%D This style is meant for the more large presentations, and
+%D therefore provided for a list of topics as well as local
+%D lists of subjects. When many topics are introduces, the
+%D list is typeset in columns.
+
+\setuplist
+ [Topic,Subject]
+ [alternative=g,
+ interaction=all,
+ before=,
+ after=]
+
+\setuplist
+ [Topic]
+ [criterium=all]
+
+\def\Topics#1%
+ {\determinelistcharacteristics[Topic]
+ \ifnum\utilitylistlength>0
+ \Nopic[Topics]{#1}
+ \ifnum\utilitylistlength>12
+ \startcolumns
+ \placelist[Topic]
+ \stopcolumns
+ \else
+ \placelist[Topic]
+ \fi
+ \fi}
+
+\def\Subjects%
+ {\placelist[Subject]}
+
+%D Last we define the overlays. Look at the way colors are
+%D linked into the macros.
+
+\startMPinclusions
+ def triangle (expr wid, rot, col) =
+ x1 := x3 := y1 := 0 ; x2 := y3 := wid ; y2 := .5y3 ;
+ fill (z1--z2--z3--cycle) rotated rot withcolor col ;
+ currentpicture := currentpicture xysized (wid,wid) ;
+ enddef ;
+\stopMPinclusions
+
+\setupMPvariables
+ [triangle]
+ [width=1cm,
+ rotation=0,
+ color=black]
+
+\startuniqueMPgraphic{triangle}{width,rotation,color}
+ triangle(\MPvar{width},\MPvar{rotation},\MPvar{color}) ;
+\stopuniqueMPgraphic
+
+\def\Triangle#1#2#3%
+ {\uniqueMPgraphic{triangle}{rotation=#1,width=#2,color=#3}}
+
+\startuseMPgraphic{title} % can be simplified with "randomized"
+ color c ; path p ;
+ for i=1 upto 250 :
+ x0 := uniformdeviate \overlaywidth ;
+ y0 := uniformdeviate \overlayheight ;
+ sx := uniformdeviate 20 ;
+ sy := uniformdeviate 20 ;
+ cc := round(uniformdeviate 2) ;
+ if cc=0 : c := \MPcolor{GotoColor} fi ;
+ if cc=1 : c := \MPcolor{ExitColor} fi ;
+ if cc=2 : c := \MPcolor{StepColor} fi ;
+ qq := round(uniformdeviate 1) ;
+ if qq=0 :
+ p := unitsquare xscaled sx yscaled sy ;
+ else :
+ rr := round(uniformdeviate 3) * 90 ;
+ x1 := x3 := y1 := 0 ; x2 := y3 := sx; y2 := .5y3 ;
+ p := (z1--z2--z3--cycle) rotated rr ;
+ fi ;
+ fill p shifted z0 withcolor c ;
+ endfor ;
+\stopuseMPgraphic
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\TitlePage{Title Page\\pre-colorfull}
+
+\Topics{Some Nice Quotes}
+
+\Topic{A Few}
+
+\Subject{Knuth} \input knuth
+\Subject{Tufte} \input tufte
+
+\Topic{Some More}
+
+\Subject{Zapf} \input zapf
+\Subject{Bryson} \input bryson
+
+\stoptext
diff --git a/tex/context/base/s-pre-05.tex b/tex/context/base/s-pre-05.tex
new file mode 100644
index 000000000..9b3ae89ff
--- /dev/null
+++ b/tex/context/base/s-pre-05.tex
@@ -0,0 +1,240 @@
+%D \module
+%D [ file=s-pre-05,
+%D version=1998.12.12,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 5,
+%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.
+
+\usemodule[pre-general]
+
+%D As all styles sofar, this one has the same structuring
+%D commands.
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+\setupcolors [state=start]
+
+\definecolor [BackgroundColor] [s=.95]
+\definecolor [OrnamentColor] [r=.6,g=.7,b=.8]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [width=430pt,
+ height=400pt,
+ header=0pt,
+ footer=0pt,
+ margin=0pt,
+ backspace=25pt,
+ topspace=25pt,
+ rightedgedistance=20pt,
+ rightedge=110pt]
+
+\setupinteractionscreen
+ [option=max]
+
+\setupbackgrounds
+ [state=repeat]
+
+\setupbackgrounds
+ [page]
+ [backgroundcolor=white]
+
+\setupbackgrounds
+ [text][text]
+ [background={HashFrameA,NextPage},
+ backgroundoffset=20pt]
+
+\defineoverlay
+ [HashFrameA]
+ [\useMPgraphic{HashFrameA}]
+
+\defineoverlay
+ [HashFrameB]
+ [\useMPgraphic{HashFrameB}]
+
+\setupinteraction
+ [state=start,
+ menu=on,
+ color=OrnamentColor,
+ contrastcolor=OrnamentColor]
+
+%D Watch how we use a list alternative that matches the
+%D menu.
+
+\setupinteractionmenu
+ [right]
+ [background=HashFrameB,
+ style=smallbold,
+ frame=off,
+ offset=10pt,
+ height=35pt,
+ before=,
+ after=,
+ inbetween=\endgraf,
+ width=\rightedgewidth]
+
+\startinteractionmenu[right]
+ \placelist
+ [Topic]
+ [criterium=all,
+ alternative=right,
+ maxwidth=.8\rightedgewidth,
+ interaction=all,
+ before=,
+ after=]
+ \vfill
+ \setupinteractionmenu
+ [right]
+ [height=30pt]
+ \but [CloseDocument] Close \\
+\stopinteractionmenu
+
+\setupwhitespace
+ [big]
+
+\setupblank
+ [big]
+
+%D \macros
+%D {TitlePage}
+%D
+%D Now the main layout and navigational definitions are
+%D done, it makes sense to define and tune some structuring
+%D commands. First we build the titlepage.
+
+\defineoverlay [TitleGraphic] [\useMPgraphic{TitleGraphic}]
+\defineoverlay [NextPage] [\overlaybutton{forward}]
+
+\def\StartTitlePage%
+ {\setupbackgrounds[page][background={color,TitleGraphic,NextPage}]
+ \setupbackgrounds[text][text][background=]
+ \setupinteraction[menu=off]
+ \setupinteractionbar[state=stop]
+ \setuplayout[width=550pt,rightedge=0pt]
+ \startstandardmakeup
+ \switchtobodyfont[24pt]
+ \bfd\setupinterlinespace
+ \setupalign[middle]
+ \vfil
+ \let\\=\vfil}
+
+\def\StopTitlePage%
+ {\vfil\vfil\vfil
+ \stopstandardmakeup
+ \setuplayout[width=430pt,rightedge=110pt]
+ \setupinteraction[menu=on]
+ \setupinteractionbar[state=start]
+ \setupbackgrounds[page][background=color]
+ \setupbackgrounds[text][text][background={HashFrameA,NextPage}]}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+%D \macros
+%D {Topics,Subjects}
+%D
+%D Since the lists are in the menu, we don't honor list
+%D placement macros.
+
+\def\Topics#1{}
+\def\Subjects{}
+
+%D \macros
+%D {Topic, Nopic, Subject}
+%D
+%D Since t his style is meant for rather flat structured
+%D documents, only \type {\Topic} makes sense.
+
+\definehead [Topic] [chapter]
+\definehead [Nopic] [title]
+\definehead [Subject] [section]
+
+\setuphead
+ [Topic, Nopic]
+ [after={\blank[3*medium]},
+ number=no,
+ style=\tfb,
+ page=yes,
+ alternative=middle]
+
+\setuphead
+ [Subject]
+ [after=\blank,
+ number=no,
+ page=yes,
+ continue=no,
+ style=\tfa]
+
+%D We use only one kind of base graphic, which is sligthly
+%D tuned for the different usage.
+
+\startMPinclusions
+ def random_hash_frame (expr width, height, offset, linewidth ) =
+
+ def delta = ((uniformdeviate .5offset) + .25offset) enddef ;
+ x1 := offset ; y1 := offset ; x2 := width-offset ; y2 := height-offset ;
+
+ drawoptions(withpen pencircle scaled linewidth withcolor \MPcolor{BackgroundColor}) ;
+ fill z1--(x2,y1)--z2--(x1,y2)--cycle ;
+
+ drawoptions(withpen pencircle scaled linewidth withcolor \MPcolor{OrnamentColor}) ;
+ draw (x1-delta,y1)--(x2+delta,y1) ;
+ draw (x2,y1-delta)--(x2,y2+delta) ;
+ draw (x2+delta,y2)--(x1-delta,y2) ;
+ draw (x1,y2+delta)--(x1,y1-delta) ;
+
+ drawoptions();
+ setbounds currentpicture to unitsquare xscaled width yscaled height ;
+ enddef ;
+\stopMPinclusions
+
+\startuseMPgraphic{HashFrameA}
+ random_hash_frame(OverlayWidth,OverlayHeight,15pt,2pt) ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{HashFrameB}
+ random_hash_frame(OverlayWidth,OverlayHeight, 5pt,2pt) ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{TitleGraphic}
+ for i=1 upto 300 :
+ offset := uniformdeviate 10pt ;
+ width := 2*offset + 30pt + uniformdeviate 30pt ;
+ height := 2*offset + 10pt + uniformdeviate 10pt ;
+ addto currentpicture also
+ image(random_hash_frame(width,height,offset,1pt)) shifted
+ (uniformdeviate OverlayWidth, uniformdeviate OverlayHeight) ;
+ endfor ;
+\stopuseMPgraphic
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\TitlePage{Title Page\\pre-fuzzy}
+
+\Topics{Some Nice Quotes}
+
+\Topic{A Few}
+
+\Subject{Knuth} \input knuth
+\Subject{Tufte} \input tufte
+
+\Topic{Some More}
+
+\Subject{Zapf} \input zapf
+\Subject{Bryson} \input bryson
+
+\stoptext
diff --git a/tex/context/base/s-pre-06.tex b/tex/context/base/s-pre-06.tex
new file mode 100644
index 000000000..7a84323e9
--- /dev/null
+++ b/tex/context/base/s-pre-06.tex
@@ -0,0 +1,325 @@
+%D \module
+%D [ file=s-pre-06,
+%D version=1999.04.28,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 6,
+%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 wrote this sixth presentation style on behalf of a
+%D presentation at Bachotek~'99. The joke in this style is
+%D (ab)using the Antikwa Torunska, a rather Polish font. When I
+%D was first confronted with this font, the backward slant
+%D stoke me as very characteristic.
+%D
+%D Each page has a slightly different background consisting of
+%D three O's. Although \TEX\ could do the randomization,
+%D scaling and placement, I prefered to use \METAPOST. The
+%D backward slant is also reflected in the stepwise increasing
+%D left margin. Due to this characteristic and the trick used,
+%D this style is only suited for simple presentations, using
+%D itemizations.
+
+\usemodule[pre-general]
+
+%D \macros
+%D {setupbodyfont}
+%D
+%D As said, we will use the Antikwa Torunska, and because we
+%D want it to show up well, we use it large.
+
+\setupbodyfont
+ [ant,14.4pt]
+
+%D \macros
+%D {definecolor, setupcolors}
+%D
+%D Thus style only uses gray scales, but nevertheless we turn
+%D on color. We only use a few logical color names.
+
+\setupcolors
+ [state=start]
+
+\definecolor [BackgroundColor] [s=.8]
+\definecolor [ContrastColor] [s=.9]
+\definecolor [InteractionColor] [s=.6]
+
+%D \macros
+%D {setuppapersize}
+%D
+%D As (nearly) always, we use a 600 pt times 450 pt screen
+%D width, mapped on ditto paper dimensions.
+
+\setuppapersize
+ [S6][S6]
+
+%D \macros
+%D {setuplayout}
+%D
+%D The layout is rather symmetrical. We don't use headers and
+%D footers, and thereby automatically turn off the page
+%D numbering: no room, no number. We use the bottom to present
+%D a rather trivial menu.
+
+\setuplayout
+ [backspace=2cm,
+ topspace=2cm,
+ width=middle,
+ header=0pt,
+ height=middle,
+ footer=0pt,
+ bottomdistance=.5cm,
+ bottom=1cm]
+
+%D \macros
+%D {setupinteractionmenu,startinteractionmenu}
+%D
+%D This menu is slighly moved to the right because that looks
+%D better. The menu itself has one goto (\type {\got}) entry,
+%D which is forced to the right.
+
+\setupinteractionmenu
+ [bottom]
+ [rightoffset=-1cm]
+
+\startinteractionmenu[bottom]
+ \hfill \got [CloseDocument] \bfd Quit \\
+\stopinteractionmenu
+
+%D \macros
+%D {setupbackgrounds}
+%D
+%D Page background are calculated at each page, opposite to the
+%D other backgrounds, that are reused and only calculated when
+%D \CONTEXT\ is explictly told to do so. There are three
+%D overlays: a gray fill, the graphic, and a button that
+%D circulates the pages.
+
+\setupbackgrounds
+ [page]
+ [background={color,Joke,GoAround},
+ backgroundcolor=BackgroundColor]
+
+%D \macros
+%D {defineoverlay}
+%D
+%D The \type {forward} reference action circulates over the
+%D pages, so, at the last page, we are led back to the first.
+
+\defineoverlay [GoAround] [\overlaybutton{forward}]
+
+%D The joke is a simple \METAPOST\ routine. The picture is
+%D actually larger than the screen, but is clipped of when
+%D included.
+
+\defineoverlay [Joke] [\useMPgraphic{background}]
+
+\startuseMPgraphic{background}
+ input mp-tool ;
+ width := \overlaywidth ;
+ height := \overlayheight ;
+ picture p ; p := char 79 infont "\truefontname{Regular}" scaled 1 ;
+ pwidth := xpart urcorner bbox p - xpart llcorner bbox p ;
+ pheight := ypart urcorner bbox p - ypart llcorner bbox p ;
+ def do (expr r) =
+ addto currentpicture also p shifted - center p scaled r
+ xscaled (width/pwidth) yscaled (height/pheight)
+ withcolor \MPcolor{ContrastColor} ;
+ enddef ;
+ do (0.9+uniformdeviate0.1) ;
+ do (1.4+uniformdeviate0.1) ;
+ do (1.9+uniformdeviate0.1) ;
+\stopuseMPgraphic
+
+%D \macros
+%D {setupinteraction,setupinteractionscreen}
+%D
+%D We did not yet turn on the interaction, so let's do that
+%D now. When opened, the document will fil the screen.
+
+\setupinteraction
+ [state=start,
+ color=InteractionColor,
+ contrastcolor=InteractionColor,
+ menu=on]
+
+\setupinteractionscreen
+ [option=max]
+
+%D \macros
+%D {TitlePage, Topics, Topic}
+%D
+%D A presentation normally consists of a title page, a list of
+%D topics, and the content itself. In this style, a further
+%D subdivision does not make sense, but because we want to be
+%D compatible with the other styles, they are added. A
+%D presentation looks like:
+%D
+%D \starttyping
+%D \usemodule[pre-antikwa]
+%D
+%D \startext
+%D
+%D \TitlePage{The Title}
+%D
+%D \Topics{Contents}
+%D
+%D \Topic{Some Topic}
+%D
+%D \startitemize
+%D \item first
+%D \item second
+%D \stopitemize
+%D
+%D \Topic{Some Topic}
+%D
+%D ...
+%D
+%D \stoptext
+%D \stoptyping
+
+%D \macros
+%D {definehead, Topic, Subject}
+%D
+%D We use dedicated sectioning commands.
+
+\definehead [Topic] [chapter]
+\definehead [Subject] [section]
+
+\definehead [Nopic] [title]
+
+%D \macros
+%D {setuphead}
+%D
+%D We turn of numbering. The assignment to \type {after} takes
+%D care of the increasing indentation. This indentation is the
+%D only low level \TEX\ code needed. Including this
+%D functionality in the core of \CONTEXT\ is not that useful
+%D and I would forget about this feature being present anyway.
+
+\setuphead
+ [Topic, Nopic, Subject]
+ [number=no,
+ after={\blank[2*big]\ToTheLeft\everypar{\ToTheRight}}]
+
+%D After section titles we set the \type {\leftskip} to a value
+%D that suits the Antikwa slant.
+
+\def\ToTheLeft%
+ {\gdef\LeftSkip{30}%
+ \rightskip0pt\relax
+ \leftskip30pt\relax}
+
+%D Each new paragraph adds to the \type {\leftskip}.
+
+\def\ToTheRight%
+ {\doglobal\increment(\LeftSkip,20)%
+ \leftskip=\LeftSkip pt\relax}
+
+%D \macros
+%D {Topics}
+%D
+%D The \type {\Topics} command uses a bot of low level
+%D \CONTEXT. We could have done with:
+%D
+%D \starttyping
+%D \def\Topics#1%
+%D {\Nopic[Topics]{#1}
+%D \placelist[Topic][criteriumcriterium=all]}
+%D \stoptyping
+%D
+%D but the next alternative sort of ignores this command when
+%D no list is found.
+
+\def\Topics#1%
+ {\determinelistcharacteristics[Topic]
+ \ifcase\utilitylistlength\else
+ \Nopic[Topics]{#1}
+ \placelist[Topic][criterium=all]
+ \fi}
+
+%D \macros
+%D {setuplist}
+%D
+%D We use the single item command to achieve a result similar
+%D to the itemizations.
+
+\setuplist
+ [Topic]
+ [alternative=command,
+ command=\TopicListCommand]
+
+\def\TopicListCommand#1#2#3%
+ {\item#2\par}
+
+%D A dummy command, needed to be compatible with the other
+%D presentation styles.
+
+\def\Subjects%
+ {}
+
+%D \macros
+%D {StartTitlePage}
+%D
+%D We use a nested \type {\everypar}; everything in there
+%D will be put in front of each paragraph. The nesting prevents
+%D the first paragraph from indenting. The struts give the
+%D lines a decent height, which looks better inrelation to the
+%D next pages.
+
+\def\StartTitlePage%
+ {\startstandardmakeup
+ \bfd\setupinterlinespace
+ \everypar{\everypar{\advance\leftskip30pt\relax}}
+ \let\\=\blank
+ \begstrut}
+
+\def\StopTitlePage%
+ {\endstrut
+ \vfill
+ \stopstandardmakeup}
+
+%D \macros
+%D {TitlePage}
+%D
+%D The title page can be generated with one command:
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\usemodule[pre-antikwa]
+
+\starttext
+
+\TitlePage{Title Page\\pre-polish}
+
+\Topics{Some Nice Lists}
+
+\Topic{Some Lists}
+
+\Subject{A list}
+
+\startitemize
+\item first
+\item second
+\stopitemize
+
+\Subject{A bigger list}
+
+\startitemize
+\item first
+\item second
+\item third
+\item fourth
+\stopitemize
+
+\stoptext
diff --git a/tex/context/base/s-pre-07.tex b/tex/context/base/s-pre-07.tex
new file mode 100644
index 000000000..bf84971bb
--- /dev/null
+++ b/tex/context/base/s-pre-07.tex
@@ -0,0 +1,212 @@
+%D \module
+%D [ file=s-pre-07,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 7,
+%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 style was made for the \NTS\ presentation at
+%D \EUROTEX\ 1999. It's a wink to programming in a webbed way.
+%D This is just one way of implementing such a style. Today
+%D we have more \METAPOST\ interfacing available, and
+%D thereby moore tools and alternative ways to reach such a
+%D goal. I must admit that the main macro looks fuzzy. On
+%D the other hand, the presentation can look quite structured.
+%D
+%D \starttyping
+%D \Topics{...}
+%D
+%D \StartIdeas
+%D \Topic{...}
+%D \StartIdea ... \StopIdea
+%D \StartIdea ... \StopIdea
+%D \StopIdeas
+%D \stoptyping
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+\usemodule
+ [abr-02]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=0cm,
+ backspace=0cm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setupinteractionscreen
+ [option=max]
+
+%D In order to prevent loops due to random placement, we
+%D keep the random seed reasonable constant.
+
+\setupsystem
+ [random=big]
+
+\setupcolors
+ [state=start]
+
+\definecolor[gray] [s=.4]
+\definecolor[lightgray][s=.9]
+
+\definecolor[red] [r=.4] \definecolor[cyan] [g=.4,b=.4]
+\definecolor[green][g=.4] \definecolor[magenta][r=.4,b=.4]
+\definecolor[blue] [b=.4] \definecolor[yellow] [r=.4,g=.4]
+
+\definecolor[PageColor][gray]
+\definecolor[TextColor][lightgray]
+\definecolor[LineColor][yellow]
+
+\definecolor[linecolor 1][red] \definecolor[linecolor 5][cyan]
+\definecolor[linecolor 2][green] \definecolor[linecolor 6][magenta]
+\definecolor[linecolor 3][blue] \definecolor[linecolor 4][yellow]
+
+\setupinteraction
+ [state=start,
+ display=new,
+ color=LineColor,
+ contrastcolor=LineColor]
+
+\startuseMPgraphic{shape}
+ path p ; color c, w ; numeric width, height ;
+ c := \MPcolor{LineColor} ; w := \MPcolor{TextColor} ;
+ width := \overlaywidth ; height := \overlayheight ;
+ pickup pencircle scaled .5cm ;
+ p := unitcircle
+ xscaled \MPw{\Idea} yscaled \MPh{\Idea}
+ shifted \MPxy{\Idea} ;
+ for z = (0,.5height), (width,.5height), (.5width,0), (.5width,height),
+ (0,0), (width,height), (0,height), (width,0) :
+ draw center p -- z withcolor c ;
+ endfor ;
+ fill p withcolor w ;
+ draw p withcolor c ;
+ p := unitcircle
+ xscaled \MPw{\Page} yscaled \MPh{\Page}
+ shifted \MPxy{\Page} ;
+ pickup pencircle scaled .25cm ;
+ fill p withcolor w ;
+ draw p withcolor c ;
+ draw unitsquare xscaled width yscaled height withcolor c ;
+\stopuseMPgraphic
+
+\defineoverlay [shape] [\useMPgraphic{shape}]
+\defineoverlay [nextpage] [\overlaybutton{nextpage}]
+\defineoverlay [previouspage] [\overlaybutton{previouspage}]
+\defineoverlay [content] [\overlaybutton{content}]
+\defineoverlay [forward] [\overlaybutton{forward}]
+
+\setupbackgrounds
+ [page]
+ [background={color,previouspage,shape},
+ backgroundcolor=PageColor]
+
+\def\StartIdea%
+ {\xdef\Idea{idea:\realfolio}
+ \xdef\Page{page:\realfolio}
+ \startstandardmakeup
+ \dontcomplain
+ \vbox to \makeupheight \bgroup
+ \getrandomdimen\scratchdimen{75pt}{600pt}\vskip 0pt plus \scratchdimen
+ \hbox to \makeupwidth \bgroup
+ \getrandomdimen\scratchdimen{75pt}{600pt}\hskip 0pt plus \scratchdimen
+ \hpos{idea:\realfolio} \bgroup
+ \framed
+ [width=.6\hsize,height=fit,offset=2cm,align=middle,
+ frame=off,strut=no,background=forward]
+ \bgroup
+ \setupwhitespace[big]}
+
+\def\StopIdea%
+ {\egroup
+ \egroup
+ \getrandomdimen\scratchdimen{75pt}{600pt}\hskip 0pt plus \scratchdimen
+ \egroup
+ \getrandomdimen\scratchdimen{75pt}{600pt}\vskip 0pt plus \scratchdimen
+ \egroup
+ \ifx\CurrentTopic\empty \else
+ \vskip-\makeupheight
+ \vbox to \makeupheight
+ {\vfill
+ \ifx\CurrentListTopic\empty\else
+ \writetolist[Topic]{}{\CurrentListTopic}
+ \fi
+ \hbox to \makeupwidth
+ {\hfill
+ \hpos{page:\realfolio}
+ {\framed
+ [offset=.5cm,frame=off,background=content]
+ {\bf\ignorespaces\CurrentTopic\unskip}}%
+ \hskip.5cm}
+ \vskip.5cm}
+ \fi
+ \stopstandardmakeup
+ \let\CurrentListTopic\empty}
+
+\definelist
+ [Topic]
+
+\setuplist
+ [Topic]
+ [alternative=f,
+ expansion=command]
+
+\let\CurrentTopic\empty
+\let\CurrentListTopic\empty
+
+\long\def\StartTopic#1\StopTopic
+ {\long\def\CurrentTopic{#1}
+ \let\CurrentListTopic\CurrentTopic}
+
+\def\Topic#1%
+ {\StartTopic#1\StopTopic}
+
+\def\Topics#1%
+ {\StartIdeas
+ \def\CurrentTopic{#1}
+ \StartIdea
+ \pagereference[content]
+ \placelist[Topic][criterium=all]
+ \StopIdea
+ \StopIdeas}
+
+\newcounter\CurrentIdeas
+
+\def\StartIdeas%
+ {\ifnum\CurrentIdeas=6 \doglobal\newcounter\CurrentIdeas \fi
+ \doglobal\increment\CurrentIdeas
+ \definecolor[LineColor][linecolor \CurrentIdeas]}
+
+\def\StopIdeas%
+ {}
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\Topics{This is about \unknown}
+
+\StartIdeas
+ \Topic{Some topic}
+ \StartIdea An idea \unknown \StopIdea
+ \StartIdea \unknown\ and another \StopIdea
+\StopIdeas
+
+\stoptext
+
+
diff --git a/tex/context/base/s-pre-08.tex b/tex/context/base/s-pre-08.tex
new file mode 100644
index 000000000..425310299
--- /dev/null
+++ b/tex/context/base/s-pre-08.tex
@@ -0,0 +1,271 @@
+%D \module
+%D [ file=s-pre-08,
+%D version=1999.09.01,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 8,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is one of the 6 styles made for the \NTS\ presentation
+%D at \EUROTEX\ 1999. The idea was to demonstrate a couple of
+%D nasty things that one can do with \PDFTEX, being an example
+%D of an extension. Afterwards it was provded that this could
+%D also be done using traditional \TEX.
+%D
+%D This version is nearly the same as the original, although
+%D since then the \METAPOST\ related macro have become more
+%D smooth. The original used a couple of boxes, skipt and
+%D fills, while this version uses the layer mechanism that
+%D came available in fall 2000. This style is actually more a
+%D demonstration gimmick than a real useful one.
+
+%D You may want to turn on layer tracing:
+%D
+%D \starttyping
+%D \tracelayerstrue
+%D \stoptyping
+
+\setuppapersize
+ [S6][S6]
+
+\setupbodyfont
+ [pos,10pt]
+
+%D We use the whole page and have no margins.
+
+\setuplayout
+ [topspace=0cm,
+ backspace=0cm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setupcolors
+ [state=start]
+
+\definecolor[TextColor][s=.9]
+\definecolor[PageColor][r=.5,g=.4,b=.3]
+\definecolor[LineColor][r=.7,g=.6,b=.5]
+
+\definecolor[ColorPage][r=.5,g=.6,b=.7]
+\definecolor[ColorLine][r=.3,g=.4,b=.5]
+
+\setupinteraction
+ [state=start,
+ display=new]
+
+\setupinteractionscreen
+ [option=max]
+
+%D The page, sample text and pagenumber will have a background
+%D graphic.
+
+\defineoverlay [page] [\uniqueMPgraphic{page}]
+\defineoverlay [graphic] [\uniqueMPgraphic{graphic}]
+\defineoverlay [number] [\uniqueMPgraphic{number}]
+
+%D Each element will also be a button.
+
+\defineoverlay [nextpage] [\overlaybutton{nextpage}]
+\defineoverlay [previouspage] [\overlaybutton{previouspage}]
+\defineoverlay [forward] [\overlaybutton{forward}]
+
+%D We are going to put all three elements on a layer.
+
+\definelayer [main]
+\defineoverlay [main] [\composedlayer{main}]
+
+%D The page backgrounds are as follows:
+
+\setupbackgrounds
+ [page]
+ [background={previouspage,page}]
+
+%D We could have put the main layer on the page overlay, but
+%D the next solution makes us independent of the back and top
+%D margins. The \type {idea} layer is for user purposes.
+
+\setupbackgrounds
+ [text]
+ [background={main,idea}]
+
+%D The page number, sample text and explanation all have
+%D associated framed texts. The two overlays \type {sample}
+%D and \type {text} and there for special (user) purposes.
+
+\defineframedtext
+ [PageText]
+ [width=fit,offset=.5cm,
+ before=,after=,frame=off,background={number,forward}]
+
+\defineframedtext
+ [SampleText]
+ [width=.6\makeupwidth,height=fit,offset=2cm,align=middle,
+ before=,after=,frame=off,background={graphic,sample,nextpage}]
+
+\defineframedtext
+ [TextText]
+ [width=.6\makeupwidth,height=fit,offset=2cm,align=middle,
+ before=,after=,frame=off,background={text,nextpage}]
+
+%D Nothing goes on the page directly, since we use layers. The
+%D \type {\null} command makes sure that at least something is
+%D on the page so that the page is flushed. Here we also take
+%D care of placing the page number.
+
+\def\StartIdea
+ {\null \dontcomplain}
+
+\def\StopIdea
+ {\setlayer
+ [main]
+ [x=\makeupwidth,y=.5cm,hoffset=-.5cm,location=lb]
+ {\PageText{\pagenumber}}
+ \page}
+
+%D Both texts get their position registered.
+
+\def\StartSample
+ {\setlayer
+ [main]
+ [hoffset=.75cm,voffset=.75cm]
+ \bgroup \hpos {SampText:\realfolio} \bgroup \startSampleText [none]}
+
+\def\StopSample
+ {\stopSampleText \egroup \egroup}
+
+%D Here the position of the sample text and explanationary
+%D text are passed on to the graphic that concerns the latter.
+
+% use setlayertext instead
+
+\def\StartText
+ {\setMPpositiongraphic
+ {TextText:\realfolio}{text}{other=SampText:\realfolio}
+ \setlayer
+ [main]
+ [x=\makeupwidth,y=\makeupheight,
+ hoffset=-.75cm,voffset=-.75cm,
+ location=lt]
+ \bgroup \noindent \hpos {TextText:\realfolio} \bgroup \startTextText [none]}
+
+\def\StopText
+ {\stopTextText \egroup \egroup}
+
+%D The graphics that encircle the two texts are related to
+%D their position. This is because when they overlay, a shine
+%D through is shown. This only shows up when there is enough
+%D text to make them overlap.
+
+\startuniqueMPgraphic{page}
+ StartPage ;
+ pickup pencircle scaled .5cm ;
+ fill Page withcolor \MPcolor{PageColor} ;
+ draw Page withcolor \MPcolor{LineColor} ;
+ StopPage ;
+\stopuniqueMPgraphic
+
+\startuniqueMPgraphic{number}
+ path p ; p := fullcircle xscaled OverlayWidth yscaled OverlayHeight;
+ pickup pencircle scaled .25cm ;
+ fill p withcolor \MPcolor{TextColor} ;
+ draw p withcolor (white-\MPcolor{PageColor}) ;
+\stopuniqueMPgraphic
+
+\startuniqueMPgraphic{graphic}
+ path p ; p := fullcircle xscaled OverlayWidth yscaled OverlayHeight;
+ pickup pencircle scaled .5cm ;
+ fill p withcolor \MPcolor{TextColor} ;
+ draw p withcolor \MPcolor{LineColor} ;
+\stopuniqueMPgraphic
+
+%D This graphic is calculated when a position is flushed that
+%D has this graphics as attached. The \type {self} reference
+%D is provided by \CONTEXT\ itself.
+
+\startMPpositiongraphic{text}
+ initialize_box(\MPpos{\MPvar{other}}) ;
+ path p ; p := fullcircle xscaled wxy yscaled hxy shifted cxy ;
+ initialize_box(\MPpos{\MPvar{self}}) ;
+ path q ; q := fullcircle xscaled wxy yscaled hxy shifted cxy ;
+ pickup pencircle scaled .5cm ;
+ fill q withcolor \MPcolor{TextColor} ;
+ draw p withcolor (white-\MPcolor{PageColor}) ;
+ clip currentpicture to q ;
+ draw q withcolor \MPcolor{LineColor} ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+%D In order to be complete, we also define a title page.
+%D Here suddenly the text background shows up.
+
+\def\StartTitlePage
+ {\startstandardmakeup
+ \dontcomplain
+ \setupframedtexts[TextText][width=fit]
+ \StartText
+ \bfd\setupinterlinespace
+ \def\\{\blank\bfc\setupinterlinespace\def\\{\blank}}}
+
+\def\StopTitlePage
+ {\StopText
+ \stopstandardmakeup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+%D For this purpose, we redefine the position graphic to
+%D handle a text only case:
+
+\startMPpositiongraphic{text}
+ if box_found(\MPpos{\MPvar{other}}) :
+ initialize_box(\MPpos{\MPvar{other}}) ;
+ path p ; p := fullcircle xscaled wxy yscaled hxy shifted cxy ;
+ fi ;
+ initialize_box(\MPpos{\MPvar{self}}) ;
+ path q ; q := fullcircle xscaled wxy yscaled hxy shifted cxy ;
+ pickup pencircle scaled .5cm ;
+ fill q withcolor \MPcolor{TextColor} ;
+ if box_found(\MPpos{\MPvar{other}}) :
+ draw p withcolor (white-\MPcolor{PageColor}) ;
+ clip currentpicture to q ;
+ draw q withcolor \MPcolor{LineColor} ;
+ else :
+ draw q withcolor (white-\MPcolor{PageColor}) ;
+ fi ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+% setbounds currentpicture to boundingbox origin ;
+\stopMPpositiongraphic
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\TitlePage
+ {Fancy Styles:\\layers}
+
+\StartIdea
+ \StartSample
+ \input tufte
+ \StopSample
+ \StartText
+ \input reich
+ \StopText
+\StopIdea
+
+\StartIdea
+ \StartSample
+ \input knuth
+ \StopSample
+ \StartText
+ \input reich
+ \StopText
+\StopIdea
+
+\stoptext
diff --git a/tex/context/base/s-pre-09.tex b/tex/context/base/s-pre-09.tex
new file mode 100644
index 000000000..a829dd6e2
--- /dev/null
+++ b/tex/context/base/s-pre-09.tex
@@ -0,0 +1,380 @@
+%D \module
+%D [ file=s-pre-09,
+%D version=unknown,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 9,
+%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 made this style when I had to give a presentation on
+%D the \MAPS\ bibliography production for several user group
+%D meetings. This style is rather tuned for combinations of
+%D examples and explanations. The colors match the \MAPS\
+%D bibliography colors.
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+%D A couple of years later, in 2001 this style was documented
+%D and made public. While documenting, I also changed box
+%D building on top of overlays into the now available layer
+%D positioning. So, this styles demonstrates quite some
+%D tricks.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=0cm,
+ backspace=0cm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+%D Local environments can be set by using the setups commands.
+%D For downward compatibility, we keep supporting the \type
+%D {\...Settings} hooks. Using local environments is seldom
+%D needed.
+
+\let\TextSettings \empty
+\let\SampleSettings\empty
+
+\startsetups [text] \TextSettings \stopsetups
+\startsetups [sample] \SampleSettings \stopsetups
+
+%D The dimensions are kind of fixed.
+
+\def\FrameWidth {448pt}
+\def\FrameHeight {348pt}
+\def\FrameOffset {24pt}
+\def\FrameSkip {12pt}
+
+%D But they {\em can} and {\em will} be changed.
+
+\def\FrameWidth {408pt}
+\def\FrameHeight {318pt}
+
+%D The funny values come from the $3:4$ display aspect
+%D ratio.
+
+\setupcolors
+ [state=start]
+
+\definecolor[PageColor] [s=.40]
+\definecolor[TextColor] [s=.90]
+\definecolor[InteractionColor][r=.40]
+\definecolor[LineColor] [r=.60,g=.60]
+
+%D Of course we go interactive and since we will probably
+%D open other documents, we make sure that the viewer opens a
+%D new window.
+
+\setupinteraction
+ [color=InteractionColor,
+ contrastcolor=LineColor,
+ display=new,
+ state=start]
+
+\setupinteractionscreen
+ [option=max]
+
+%D Before we come to the real macros, we do a little bit of
+%D tuning.
+
+\setupitemize
+ [1][packed]
+
+\setuptyping
+ [blank=medium]
+
+%D Apart from the titlepage, the page gets a simple colored
+%D background. Later we will activate the background.
+
+\setupbackgrounds
+ [page]
+ [backgroundcolor=PageColor]
+
+%D Everything gets frames by a nice \METAPOST\ frame.
+
+\defineoverlay [background] [\uniqueMPgraphic{background}]
+
+\startuniqueMPgraphic{background}
+ path p ; color c, w, d ;
+ c := \MPcolor{PageColor} ;
+ w := \MPcolor{TextColor} ;
+ d := \MPcolor{LineColor} ;
+ p := unitsquare xscaled OverlayWidth yscaled OverlayHeight ;
+ pickup pencircle scaled (1.5*\FrameSkip) ;
+ draw p withcolor c ;
+ pickup pencircle scaled \FrameSkip ;
+ fill p withcolor w ;
+ draw p withcolor d ;
+\stopuniqueMPgraphic
+
+%D We will present samples and explanation pair||wise, so
+%D we need a hyperlink that skips a page.
+
+\defineoverlay [nextpage] [\overlaybutton{nextpage}]
+\defineoverlay [previouspage] [\overlaybutton{previouspage}]
+\defineoverlay [skippage] [\overlaybutton{page(+2)}]
+
+%D Layers are normally used to position multiple content on
+%D a specific overlay. Here we will use them to position
+%D only and since the samples and text will swap place, we
+%D will use quite a few layers.
+
+\defineoverlay [text] [\composedlayer{text}]
+\defineoverlay [sample] [\composedlayer{sample}]
+\defineoverlay [common] [\composedlayer{common}]
+
+%D There are three positions. When combined, the sample and
+%D text windows overlap, otherwise the lone window is
+%D centered. We could have used one layer and reversed the
+%D order by setting the \type {direction} parameter, but
+%D this approach is more readable.
+
+\definelayer
+ [text]
+ [x=\makeupwidth,y=\makeupheight,location=lt,
+ hoffset=-\FrameSkip,voffset=-\FrameSkip]
+
+\definelayer
+ [sample]
+ [hoffset=\FrameSkip,voffset=\FrameSkip]
+
+\definelayer
+ [common]
+ [x=.5\makeupwidth,y=.5\makeupheight,location=c]
+
+%D The topic is put in the lower right corner of the text
+%D window.
+
+\defineoverlay [topic] [\composedlayer{topic}]
+
+\definelayer
+ [topic]
+ [x=\FrameWidth,y=\FrameHeight,location=lt,
+ hoffset=-\FrameOffset,voffset=-\FrameSkip]
+
+%D The topic is put in a framed box. That way we can make
+%D sure that it gets a background, which looks better when
+%D it covers something else. Otherwise we could have stuct
+%D to:
+%D
+%D \starttyping
+%D \def\Topic#1%
+%D {\setlayer[topic]{\color[PageColor]{\bfb\setstrut#1}}}
+%D \stoptyping
+%D
+%D But, we go for the nice alternative:
+
+\def\Topic#1%
+ {\doifsomething{#1}
+ {\setlayer [topic]
+ {\bfb\setstrut
+ \inframed
+ [frame=off,foregroundcolor=PageColor,offset=0pt,
+ background=color,backgroundcolor=TextColor]
+ {#1}}}}
+
+%D The sample as well as the explanation will be collected in
+%D a buffer. That way we can reuse the content. We could
+%D have used a box instead, but can we be sure that the content
+%D is not adapting itself? So, buffers we use.
+
+\resetbuffer[sample]
+\resetbuffer[text]
+
+%D Both the sample and explanation are kind of windowed.
+
+\defineframedtext
+ [SampleText]
+ [width=\FrameWidth,height=\FrameHeight,offset=\FrameOffset,
+ frame=off,align=normal,strut=no,before=,after=,
+ background={background,nextpage}]
+
+%D We safe some keying in by combining things in one macro.
+
+\def\DoSampleText#1#2#3% kind layer overlays
+ {\setupframedtexts[SampleText][background={background,#3}]
+ \setlayer[#2]
+ {\startSampleText[none]
+ \setups[#1]
+ \getbuffer[#1]
+ \stopSampleText}}
+
+\def\StartSample{\dostartbuffer[sample][StartSample][StopSample]}
+\def\StartText {\dostartbuffer[text] [StartText] [StopText]}
+
+%D The following definitions apply at the outer level.
+
+\def\StopSample
+ {\startstandardmakeup
+ \DoSampleText{sample}{common}{nextpage}
+ \stopstandardmakeup
+ \resetbuffer[sample]}
+
+\def\StopText
+ {\startstandardmakeup
+ \DoSampleText{text}{common}{topic,nextpage}
+ \stopstandardmakeup
+ \resetbuffer[text]}
+
+\setupbackgrounds[page][background={color,nextpage}]
+\setupbackgrounds[text][background=common]
+
+%D When we combine sample and text, we get slightly
+%D different definitions. As you can see we generate two
+%D pages. Watch how we manipulate the order of the
+%D overlays and teh nature of the buttons. Here data
+%D abstraction really pays off.
+
+\def\StartIdea
+ {\bgroup
+ \let\StopSample\relax
+ \let\StopText \relax}
+
+\def\StopIdea%
+ {\setupbackgrounds[page][background={color,skippage}]
+ \setupbackgrounds[text][background={text,sample}]
+ \startstandardmakeup
+ \DoSampleText{sample}{sample}{previouspage}
+ \DoSampleText{text} {text} {topic,nextpage}
+ \stopstandardmakeup
+ \setupbackgrounds[page][background={color,nextpage}]
+ \setupbackgrounds[text][background={sample,text}]
+ \startstandardmakeup
+ \DoSampleText{sample}{sample}{previouspage}
+ \DoSampleText{text} {text} {topic,nextpage}
+ \stopstandardmakeup
+ \egroup}
+
+%D The rest of the definitions takes care of the title page.
+%D Please don't steal this one for your own documents.
+
+\defineoverlay[joke] [\useMPgraphic{joke}{n=0}] % not to be changed!
+
+\startuseMPgraphic{joke}{n}
+ StartPage ;
+ path p, q ; numeric w ; pair xy ;
+ set_grid(OverlayWidth,OverlayHeight,OverlayWidth/8,OverlayHeight/8) ;
+ if \MPvar{n}=1 :
+ p := fulldiamond ; fill Page withcolor \MPcolor{TextColor} ;
+ else :
+ p := fullsquare ; fill Page withcolor \MPcolor{PageColor} ;
+ fi ;
+ forever :
+ xy := center Page randomized (OverlayWidth,OverlayHeight) ;
+ if new_on_grid(xpart xy, ypart xy) :
+ q := (p xyscaled (OverlayWidth/5,OverlayHeight/5))
+ randomized (\FrameSkip,\FrameSkip)
+ shifted xy ;
+ w := (\FrameSkip) randomized (\FrameSkip/2) ;
+ draw q withcolor \MPcolor{PageColor} withpen pencircle scaled (1.5w) ;
+ fill q withcolor \MPcolor{TextColor} ;
+ draw q withcolor \MPcolor{LineColor} withpen pencircle scaled ( w) ;
+ fi ;
+ exitif grid_full ;
+ endfor ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay[fuzzy][\useMPgraphic{fuzzy}]
+
+\startuseMPgraphic{fuzzy}
+ path p ; numeric w ;
+ p := (fullsquare xyscaled (OverlayWidth,OverlayHeight))
+ randomized (\FrameSkip,\FrameSkip) ;
+ w := (\FrameSkip) randomized (\FrameSkip/2) ;
+ draw p withcolor \MPcolor{PageColor} withpen pencircle scaled (1.5w) ;
+ fill p withcolor \MPcolor{TextColor} ;
+ draw p withcolor \MPcolor{LineColor} withpen pencircle scaled ( w) ;
+\stopuseMPgraphic
+
+%D This time we use a fit window, but with a slightly randomized
+%D frame, our trademark so to say.
+
+\def\StartTitlePage
+ {\bgroup
+ \setupbackgrounds[page][background={joke,nextpage}]
+ \startstandardmakeup
+ \switchtobodyfont[big]
+ \setupframedtexts
+ [SampleText]
+ [background=fuzzy,
+ foregroundcolor=PageColor,
+ width=fit,
+ height=fit,
+ align=middle]
+ \startSampleText[middle]
+ \bfd\setupinterlinespace
+ \def\\{\bfb\setupinterlinespace\vfil\def\\{\vfil}}}
+
+\def\StopTitlePage
+ {\stopSampleText
+ \stopstandardmakeup
+ \egroup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+%D Let's nill some error prone presentation macros.
+
+\let\Subject \Topic
+\let\Topics \gobbleoneargument
+\let\Subjects \relax
+
+%D We will avoid \quote {overfull} messages.
+
+\dontcomplain
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\setupbodyfont[12pt]
+
+\TitlePage{Quotes, Quotes\\and more quotes}
+
+\StartIdea
+ \StartSample
+ \input knuth \par
+ \StopSample
+ \StartText
+ \Topic{Tufte}
+ \input tufte \par
+ \StopText
+ \StopIdea
+
+\StartIdea
+ \StartSample
+ \input materie \par
+ \StopSample
+ \StartText
+ \input reich \par
+ \StopText
+\StopIdea
+
+\StartText
+ \input tufte \par
+\StopText
+
+\StartIdea
+ \StartSample
+ \input knuth \par
+ \StopSample
+ \StartText
+ \input tufte \par
+ \StopText
+\StopIdea
+
+\stoptext
diff --git a/tex/context/base/s-pre-10.tex b/tex/context/base/s-pre-10.tex
new file mode 100644
index 000000000..67a867ec7
--- /dev/null
+++ b/tex/context/base/s-pre-10.tex
@@ -0,0 +1,308 @@
+%D \module
+%D [ file=s-pre-10,
+%D version=unknown,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 10,
+%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 style is derived from the ninth style, which was
+%D used first at \EUROTEX\ 99 and later at \TUG\ 2000. This
+%D alternative build up a page.
+
+\startmode [demo]
+ \disablemode[demo] \usemodule[pre-09] \enablemode[demo]
+\stopmode
+
+\startnotmode [demo]
+ \usemodule[pre-09]
+\stopnotmode
+
+%D We use blue colors instead of yellow ones. Since we have
+%D used symbolic names, we can easily overload the existing
+%D scheme.
+
+\definecolor[LineColor][r=.40,g=.40,b=1.00]
+
+%D Here we don't use fixed dimensions, but fit the sample
+%D windows and derive the text windows's width from this one.
+
+\setupframedtexts
+ [SampleText]
+ [width=fit,height=fit,
+ background={background,nextpage}]
+
+%D The topic goes to the top right corner of the screen which
+%D means that it is positioned left down to the reference
+%D point. Watch how we make data on this layer (here only
+%D the topic but it can be more) persistent.
+
+\setuplayer
+ [topic]
+ [y=0pt,x=\makeupwidth,location=lb,state=repeat,
+ hoffset=-\FrameSkip,voffset=\FrameSkip]
+
+%D Clicking on the page brings us back.
+
+\setupbackgrounds
+ [page]
+ [background={previouspage,color,topic}]
+
+%D All layers end up on the text area. This could have been
+%D the page area too since these have the same dimensions.
+
+\setupbackgrounds
+ [text]
+ [background={common,sample,text}]
+
+%D Because we build up the text window step by step, we will
+%D separate the entries by white space.
+
+\startsetups [always]
+ \setupwhitespace[big]
+ \setupblank[big]
+\stopsetups
+
+%D The \type {\Topic} commands can be simplified to:
+
+\def\Topic#1%
+ {\resetlayer[topic]
+ \setlayer[topic]{\bfb\setstrut\color[TextColor]{#1}}}
+
+%D We also provide a way to erase the topic.
+
+\def\NoTopic
+ {\resetlayer[topic]}
+
+%D We have to redefine the structuring commands to support
+%D the resetting of buffer counters.
+
+\newcounter\TextN
+
+\def\StartSample
+ {\doglobal\newcounter\TextN
+ \dostartbuffer[sample][StartSample][StopSample]}
+
+\def\StartText
+ {\doglobal\newcounter\TextN
+ \dostartbuffer[text][StartText][StopText]}
+
+\def\StartSubText
+ {\doglobal\increment\TextN
+ \dostartbuffer[text-\TextN][StartSubText][StopSubText]}
+
+\def\StopText
+ {\startstandardmakeup
+ \DoSampleText{text}{common}{nextpage}
+ \stopstandardmakeup}
+
+\def\StopSubText
+ {\startstandardmakeup
+ \DoSampleText{text}{common}{nextpage}
+ \stopstandardmakeup}
+
+%D The \type {\DoSampleText} command is adapted to support
+%D addition of subtexts (each subtext goes into its own
+%D buffer).
+
+\def\DoSampleText#1#2#3%
+ {\setupframedtexts[SampleText][background={background,#3}]
+ \bgroup
+ \setups[#1]%
+ \setups[always]%
+ \setbox\nextbox=\hbox
+ {\startSampleText[none]
+ \getbuffer[#1]\par
+ \doif{#1}{text}
+ {\dorecurse{\TextN}{\getbuffer[text-\recurselevel]\par}}
+ \stopSampleText}
+ \xdef\SampleTextWidth{\the\wd\nextbox}
+ \setlayer[#2]{\box\nextbox}%
+ \egroup}
+
+%D Since we are no longer swapping windows, we end up with a
+%D much simplier \type {\Stopidea} macro. We don't reset
+%D samples at the inner level.
+
+\def\StartIdea%
+ {\bgroup
+ \let\StopSample \relax
+ \let\StopText \relax
+ \let\StopSubText\relax
+ \def\StartSample{\dostartbuffer[sample][StartSample][StopSample]}}
+
+\def\StopIdea%
+ {\startstandardmakeup
+ \DoSampleText{sample}{sample}{nextpage}
+ \SetTextWidth
+ \DoSampleText{text} {text} {nextpage}
+ \stopstandardmakeup
+ \egroup}
+
+%D Here we determine the width of the text window. It is
+%D derived from the width of the sample and stays the same
+%D within a sequence.
+
+\def\SetTextWidth
+ {\ifnum\TextN<1 % yes or no, may change
+ \scratchdimen=\makeupwidth
+ \advance\scratchdimen by -\SampleTextWidth
+ \advance\scratchdimen by \FrameSkip
+ \xdef\SampleWidth{\the\scratchdimen}%
+ \fi
+ \setupframedtexts
+ [SampleText]
+ [width=\SampleWidth]}
+
+%D We use the (already implemented) second alternative of
+%D the titlepage graphic. Please don't change this.
+
+\defineoverlay[joke] [\useMPgraphic{joke}{n=1}] % not to be changed !
+
+\doifnotmode{demo}{\endinput}
+
+%D The demo section. The original presentation uses proper
+%D graphics and has better spacing.
+
+\def\SomeSymbol#1#2{\definedfont[ContextNavigation at #1]\char#2}
+
+\setupcombinations[distance=\FrameOffset,inbetween=\vskip\FrameOffset]
+
+\starttext
+
+\TitlePage{Some Famous Symbols}
+
+\Topic{Symbols}
+
+\StartSample
+ \startcombination[2*2]
+ {\SomeSymbol{5cm}{1}} {}
+ {\SomeSymbol{5cm}{3}} {}
+ {\SomeSymbol{5cm}{2}} {}
+ {\SomeSymbol{5cm}{4}} {}
+ \stopcombination
+\StopSample
+
+\Topic{Previous}
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{7cm}{1}
+ \StopSample
+ \StartText
+ This symbol can be used to indicate a hyperlink to a
+ previous page.
+ \StopText
+\StopIdea
+
+\StartIdea
+ \StartSubText
+ As one can expect there is also a symbol for going to
+ the next page.
+ \StopSubText
+\StopIdea
+
+\Topic{Previous}
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{9cm}{2}
+ \StopSample
+ \StartText
+ This symbol is actually just a mirrored version of the
+ first symbol we showed.
+ \StopText
+\StopIdea
+
+\NoTopic
+
+\StartText
+ Is this nice or not?
+\StopText
+
+\Topic{First and Last}
+
+\StartSample
+ \SomeSymbol{11cm}{3}
+\StopSample
+
+\StartSample
+ \SomeSymbol{11cm}{4}
+\StopSample
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{5cm}{3}
+ \StopSample
+ \StartText
+ A few screens back, we saw this symbol.
+ \StopText
+\StopIdea
+
+\StartIdea
+ \StartSubText
+ This symbol represents the beginning of something.
+ \StopSubText
+\StopIdea
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{5cm}{4}
+ \StopSample
+ \StartSubText
+ Just like this one represents an end.
+ \StopSubText
+\StopIdea
+
+\StartIdea
+ \StartSubText
+ They look just like the symbols found on audio and
+ video players.
+ \StopSubText
+\StopIdea
+
+\Topic{Summary}
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{6cm}{1}
+ \StopSample
+ \StartText
+ So we have a symbol for previous \unknown
+ \StopText
+\StopIdea
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{6cm}{2}
+ \StopSample
+ \StartSubText
+ \unknown\ and one for next \unknown
+ \StopSubText
+\StopIdea
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{6cm}{3}
+ \StopSample
+ \StartSubText
+ \unknown\ and yet another for first \unknown
+ \StopSubText
+\StopIdea
+
+\StartIdea
+ \StartSample
+ \SomeSymbol{6cm}{4}
+ \StopSample
+ \StartSubText
+ \unknown\ and of course for last.
+ \StopSubText
+\StopIdea
+
+\stoptext
+
diff --git a/tex/context/base/s-pre-11.tex b/tex/context/base/s-pre-11.tex
new file mode 100644
index 000000000..23bf9e223
--- /dev/null
+++ b/tex/context/base/s-pre-11.tex
@@ -0,0 +1,220 @@
+%D \module
+%D [ file=s-pre-11,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 11,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=0cm,
+ backspace=0cm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setupbodyfont
+ [14.4pt,lbr]
+
+\setupcolors
+ [state=start]
+
+\setupinteraction
+ [click=no,
+ display=new,
+ state=start]
+
+\setupinteractionscreen
+ [option=max]
+
+\def\SomeShape%
+ {\resetMPdrawing
+ \startMPdrawing
+ path p[], q[] ; pair a, b ;
+ StartPage ;
+ \stopMPdrawing
+ \dorecurse{\CurrentTopic}
+ {\startMPdrawing
+ initialize_box(\MPpos{topic-\realfolio-\recurselevel}) ;
+ p[\recurselevel] := tensecircle (wxy,hxy,.25cm) shifted cxy ;
+ fill p[\recurselevel] withcolor .9white ;
+ pickup pencircle scaled .25cm ;
+ \ifnum\recurselevel=\CurrentTopic\space
+ draw p[\recurselevel] withcolor \MPcolor{ShowColor} ;
+ \else
+ draw p[\recurselevel] withcolor \MPcolor{DoneColor} ;
+ \fi
+ \stopMPdrawing}%
+ \dorecurse{\CurrentMaxItem}
+ {\startMPdrawing
+ initialize_box(\MPpos{item-\realfolio-\recurselevel}) ;
+ linewidth := .25cm ;
+ q[\recurselevel] := tensecircle (wxy,hxy,linewidth) shifted cxy ;
+ fill q[\recurselevel] withcolor .9white ;
+ pickup pencircle scaled linewidth ;
+ \ifnum\recurselevel=\CurrentMaxItem\space
+ draw q[\recurselevel] withcolor \MPcolor{ShowColor} ;
+ \else
+ draw q[\recurselevel] withcolor \MPcolor{DoneColor} ;
+ \fi
+ \stopMPdrawing}%
+ \dostepwiserecurse{2}{\CurrentTopic}{1}
+ {\startMPdrawing
+ draw
+ rt point 3 of p[\recurselevel-1] --
+ lft point 7 of p[\recurselevel]
+ withcolor \MPcolor{ArrowColor} ;
+ \stopMPdrawing}%
+ \dostepwiserecurse{2}{\CurrentMaxItem}{1}
+ {\startMPdrawing
+ draw
+ bot point 9 of q[\recurselevel-1] --
+ top point 5 of q[\recurselevel]
+ withcolor \MPcolor{ArrowColor} ;
+ \stopMPdrawing}%
+ \startMPdrawing
+ draw Page
+ withpen pencircle scaled .5cm
+ withcolor \MPcolor{EdgeColor} ;
+ StopPage ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \getMPdrawing}
+
+\def\TitlePage#1%
+ {\startstandardmakeup
+ \setupalign[middle]
+ \def\\{\vfil\bfb\setupinterlinespace}
+ \bfd\setupinterlinespace
+ \vfil#1\vfil\vfil
+ \stopstandardmakeup}
+
+\definecolor[PageColor][r=.5,g=.4,b=.3]
+\definecolor[LineColor][r=.7,g=.6,b=.5]
+
+\definecolor[PageColor] [s=.60]
+\definecolor[ShowColor] [r=.40]
+\definecolor[EdgeColor] [g=.40]
+\definecolor[DoneColor] [r=.40,g=.40]
+\definecolor[ArrowColor] [b=.40]
+\definecolor[LineColor] [r=.60,g=.60]
+\definecolor[GotoColor] [ArrowColor]
+
+\setupinteraction[color=GotoColor,contrastcolor=GotoColor]
+
+\defineoverlay [shape] [\SomeShape]
+\defineoverlay [next] [\overlaybutton{forward}] % [{nextpage}]
+
+\setupbackgrounds
+ [page]
+ [background={color,next,shape},
+ backgroundcolor=PageColor]
+
+\doglobal\newcounter\CurrentMaxItem
+\doglobal\newcounter\CurrentItem
+\doglobal\newcounter\CurrentTopic
+
+\def\StartIdea%
+ {\doglobal\newcounter\CurrentItem}
+
+\def\StartTopic%
+ {\doglobal\increment\CurrentTopic
+ \dostartbuffer[topic-\CurrentTopic][StartTopic][StopTopic]}
+
+\def\StopIdea%
+ {\dorecurse{\CurrentItem}
+ {\let\CurrentMaxItem\recurselevel
+ \doStopIdea}}
+
+\def\doStopIdea%
+ {\startstandardmakeup
+ \dontcomplain
+ \vskip.875cm
+ \hbox to \makeupwidth
+ {\hfill
+ \dorecurse{\CurrentTopic}
+ {\edef\Topic{topic-\realfolio-\recurselevel}%
+ \hpos
+ {\Topic}
+ {\framed
+ [frame=off,align=middle,offset=.25cm]
+ {\getbuffer[topic-\recurselevel]}}%
+ \ifnum\recurselevel<\CurrentTopic
+ \hskip.875cm
+ \fi}%
+ \hfill}
+ \vskip.875cm
+ \vfilll
+ \dorecurse{\CurrentMaxItem}
+ {\edef\Item{item-\realfolio-\recurselevel}
+ \hbox to \makeupwidth
+ {\hfill
+ \hpos
+ {\Item}
+ {\framed
+ [width=.75\makeupwidth,
+ frame=off,
+ align=middle,offset=.125cm]
+ {\getbuffer[item-\recurselevel]}}%
+ \hfill}
+ \vskip.875cm}
+ \vfilll
+ \stopstandardmakeup}
+
+\def\StartItem%
+ {\doglobal\increment\CurrentItem
+ \dostartbuffer[item-\CurrentItem][StartItem][StopItem]}
+
+\lefthyphenmin =\maxdimen
+\righthyphenmin=\maxdimen
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\StartIdea
+ \StartTopic
+ A Nice Idea
+ \StopTopic
+ \StartItem
+ \input reich \relax
+ \StopItem
+ \StartItem
+ \input reich \relax
+ \StopItem
+ \StartItem
+ \input reich \relax
+ \StopItem
+\StopIdea
+
+\StartIdea
+ \StartTopic
+ One More Nice Idea
+ \StopTopic
+ \StartItem
+ \input reich \relax
+ \StopItem
+ \StartItem
+ \input reich \relax
+ \StopItem
+\StopIdea
+
+\StartIdea
+ \StartTopic
+ The Last Idea
+ \StopTopic
+ \StartItem
+ \input tufte \relax
+ \StopItem
+\StopIdea
+
+\stoptext
diff --git a/tex/context/base/s-pre-12.tex b/tex/context/base/s-pre-12.tex
new file mode 100644
index 000000000..722d59ced
--- /dev/null
+++ b/tex/context/base/s-pre-12.tex
@@ -0,0 +1,226 @@
+%D \module
+%D [ file=s-pre-12,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 12,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=0cm,
+ backspace=0cm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setupbodyfont
+ [14.4pt,lbr]
+
+\setupcolors
+ [state=start]
+
+\setupinteraction
+ [click=no,
+ display=new,
+ state=start]
+
+\setupinteractionscreen
+ [option=max]
+
+\def\SomeShape%
+ {\resetMPdrawing
+ \startMPdrawing
+ path p ; pair a, b ;
+ ahlength := .375cm ;
+ StartPage ;
+ draw Page %unitsquare
+ %xscaled PaperWidth yscaled PaperHeight
+ withpen pencircle scaled .5cm
+ withcolor \MPcolor{EdgeColor} ;
+ \stopMPdrawing
+ \dorecurse{\CurrentTopic}
+ {\startMPdrawing
+ initialize_box(\MPpos{topic-\realfolio-\recurselevel}) ;
+ p := tensecircle (wxy,hxy,.25cm) shifted cxy ;
+ fill p withcolor .9white ;
+ pickup pencircle scaled .25cm ;
+ \ifnum\recurselevel=\CurrentTopic
+ draw p withcolor \MPcolor{ShowColor} ;
+ a := bot point 7 of p ;
+ \else
+ draw p withcolor \MPcolor{DoneColor} ;
+ \fi
+ \stopMPdrawing}
+ \dorecurse{\CurrentMaxItem}
+ {\startMPdrawing
+ initialize_box(\MPpos{item-\realfolio-\recurselevel}) ;
+ linewidth := .25cm ;
+ p := tensecircle (wxy,hxy,linewidth) shifted cxy ;
+ fill p withcolor .9white ;
+ pickup pencircle scaled linewidth ;
+ b := rt point 3 of p ;
+ \ifnum\recurselevel=\CurrentMaxItem
+ draw p withcolor \MPcolor{ShowColor} ;
+ \else
+ draw p withcolor \MPcolor{DoneColor} ;
+ \fi
+ dxab := xpart a-xpart b ;
+ dyab := ypart a-ypart b ;
+ sign := if dyab>0 : - fi 1 ;
+ drawarrow
+ a --
+ a shifted (+2linewidth-dxab/2,0) {left} ..
+ if abs(dyab)>4linewidth :
+ a shifted (-dxab/2,+sign*2linewidth) --
+ b shifted (+dxab/2,-sign*2linewidth) ..
+ fi
+ {left} b shifted (-2linewidth+dxab/2,0) --
+ b
+ withcolor \MPcolor{ArrowColor} ;
+ \stopMPdrawing}%
+ \startMPdrawing
+ StopPage ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \getMPdrawing}
+
+\definecolor[PageColor][r=.5,g=.4,b=.3]
+\definecolor[LineColor][r=.7,g=.6,b=.5]
+
+\definecolor[PageColor] [s=.60]
+\definecolor[ShowColor] [r=.40]
+\definecolor[EdgeColor] [g=.40]
+\definecolor[DoneColor] [r=.40,g=.40]
+\definecolor[ArrowColor] [b=.40]
+\definecolor[LineColor] [r=.60,g=.60]
+\definecolor[GotoColor] [ArrowColor]
+
+\setupinteraction[color=GotoColor,contrastcolor=GotoColor]
+
+\defineoverlay [shape] [\SomeShape]
+\defineoverlay [next] [\overlaybutton{forward}]
+
+\setupbackgrounds
+ [page]
+ [background={color,next,shape},
+ backgroundcolor=PageColor]
+
+\doglobal\newcounter\CurrentItem
+\doglobal\newcounter\CurrentTopic
+\doglobal\newcounter\CurrentMaxItem
+
+\def\StartIdea%
+ {\doglobal\newcounter\CurrentItem}
+
+\def\StartTopic%
+ {\doglobal\increment\CurrentTopic
+ \dostartbuffer[topic-\CurrentTopic][StartTopic][StopTopic]}
+
+\def\StopIdea%
+ {\dorecurse{\CurrentItem}
+ {\let\CurrentMaxItem\recurselevel
+ \doStopIdea}}
+
+\def\IdeaWidth {.6\makeupwidth} % .5
+\def\TopicWidth{.2\makeupwidth} % .3
+
+\def\doStopIdea%
+ {\startstandardmakeup
+ \dontcomplain
+ \vbox to \makeupheight
+ {\vskip.75cm \relax % \vfill
+ \dorecurse{\CurrentMaxItem}
+ {\edef\Item{item-\realfolio-\recurselevel}
+ \hbox to \makeupwidth
+ {\hskip.75cm
+ \hpos
+ {\Item}
+ {\framed
+ [width=\IdeaWidth,frame=off,
+ align=middle,offset=.125cm]
+ {\getbuffer[item-\recurselevel]}}}
+ \vskip.875cm}
+ \vfill}
+ \vskip-\makeupheight
+ \vbox to \makeupheight
+ {\vskip.75cm \relax
+ \dorecurse{\CurrentTopic}
+ {\edef\Topic{topic-\realfolio-\recurselevel}
+ \hbox to \makeupwidth
+ {\hfill
+ \hpos
+ {\Topic}
+ {\framed
+ [width=\TopicWidth,frame=off,
+ align=middle,offset=.25cm]
+ {\getbuffer[topic-\recurselevel]}}%
+ \hskip.75cm}
+ \vskip.875cm}
+ \vfill}
+ \stopstandardmakeup}
+
+\def\StartItem%
+ {\doglobal\increment\CurrentItem
+ \dostartbuffer[item-\CurrentItem][StartItem][StopItem]}
+
+\lefthyphenmin =\maxdimen
+\righthyphenmin=\maxdimen
+
+\def\TitlePage#1%
+ {\startstandardmakeup
+ \setupalign[middle]
+ \def\\{\vfil\bfb\setupinterlinespace}
+ \bfd\setupinterlinespace
+ \vfil#1\vfil\vfil
+ \stopstandardmakeup}
+
+\endinput
+
+% \starttext
+%
+% \StartIdea
+% \StartTopic
+% What a topic
+% \StopTopic
+% \StartItem
+% \input reich \relax
+% \StopItem
+% \StartItem
+% \input reich \relax
+% \StopItem
+% \StartItem
+% \input reich \relax
+% \StopItem
+% \StopIdea
+%
+% \StartIdea
+% \StartTopic
+% One More Nice Idea
+% \StopTopic
+% \StartItem
+% \input reich \relax
+% \StopItem
+% \StartItem
+% \input reich \relax
+% \StopItem
+% \StopIdea
+%
+% \StartIdea
+% \StartTopic
+% The Last Idea
+% \StopTopic
+% \StartItem
+% \input tufte \relax
+% \StopItem
+% \StopIdea
+%
+% \stoptext
diff --git a/tex/context/base/s-pre-13.tex b/tex/context/base/s-pre-13.tex
new file mode 100644
index 000000000..6032f36d2
--- /dev/null
+++ b/tex/context/base/s-pre-13.tex
@@ -0,0 +1,302 @@
+%D \module
+%D [ file=s-pre-13,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 13,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is again one of the \EUROTEX\ 99 styles. It's one of
+%D the quick and dirty styles supporting basic structuring.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ header=0pt,
+ footer=0pt,
+ bottomdistance=.5cm,
+ bottom=1cm,
+ topspace=2cm,
+ backspace=2cm]
+
+%D This style is meant to be used with lucida handwriting
+%D fonts. If you don't have that font, you may reconsider
+%D using this style.
+
+\startmode[asintended] \setupbodyfont[lbr,hw] \stopmode
+
+%D These colors will mostly be used in the graphics drawn by
+%D \METAPOST.
+
+\setupcolors
+ [state=start]
+
+\definecolor[PageColor] [s=.6]
+\definecolor[TextColor] [s=.8]
+\definecolor[LineColor] [g=.4]
+\definecolor[SymbolColor][r=.4]
+
+%D When interacting, we will use button shaped that are
+%D quite random and thereby regenerated for each instance.
+
+\setupinteractionscreen
+ [option=max]
+
+\setupinteractionmenu
+ [bottom]
+ [state=start,
+ height=1cm,
+ middle=\hskip1cm]
+
+\setupinteraction
+ [state=start,
+ menu=on,
+ display=new,
+ click=no,
+ color=SymbolColor,
+ contrastcolor=SymbolColor]
+
+\startinteractionmenu[bottom]
+ \hfill
+ \got [previouspage] \symbol[prevmark] \\
+ \got [nextpage] \symbol[nextmark] \\
+ \got [CloseDocument] \symbol[stopmark] \\
+ \txt \tfd \SymbolColor \pagenumber \\
+\stopinteractionmenu
+
+%D When not processed at runtime, the itemmark graphics can
+%D result in processing loops due to funny dimensions.
+%D Therefore, from now on, the itemize macros limit the height
+%D and depth.
+
+\definesymbol[itemmark][\useMPgraphic{itemmark}]
+\definesymbol[stopmark][\useMPgraphic{stopmark}]
+\definesymbol[nextmark][\useMPgraphic{nextmark}]
+\definesymbol[prevmark][\useMPgraphic{prevmark}]
+
+%D Of course we have some backgrounds.
+
+\defineoverlay [page] [\useMPgraphic{page}]
+\defineoverlay [next] [\overlaybutton{forward}]
+\defineoverlay [prev] [\overlaybutton{PreviousJump}]
+
+\setupbackgrounds
+ [page]
+ [background={page,prev}]
+
+\setupbackgrounds
+ [text]
+ [background=next]
+
+\setuphead
+ [chapter]
+ [alternative=middle,
+ number=no,
+ color=SymbolColor,
+ style=\tfc]
+
+%D A little bit of tweaking.
+
+\setupwhitespace
+ [big]
+
+\setupitemize
+ [1]
+ [symbol=itemmark,
+ width=3\bodyfontsize]
+
+\def\StartTitlePage%
+ {\setupinteractionmenu[bottom][state=stop] % will be named page block
+ \startstandardmakeup
+ \setupalign[middle]
+ \def\\%
+ {\stopcolor
+ \vfil
+ \bfb\setupinterlinespace
+ \startcolor[black]}
+ \bfd\setupinterlinespace
+ \vfil
+ \startcolor[SymbolColor]}
+
+\def\StopTitlePage
+ {\stopcolor
+ \vfil\vfil
+ \stopstandardmakeup
+ \setupinteractionmenu[bottom][state=start]}
+
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+\definehead[Topic][chapter]
+\definehead[Nopic][title]
+
+\setuplist
+ [Topic]
+ [criterium=all,
+ alternative=g,
+ interaction=all,
+ after=\blank]
+
+\def\Topics#1%
+ {\Nopic{#1}
+ \bgroup
+ \setupinteraction
+ [color=,
+ contrastcolor=]
+ \determinelistcharacteristics[Topic]
+ \ifnum\utilitylistlength>12
+ \startcolumns[n=2]
+ \placelist[Topic]
+ \stopcolumns
+ \else
+ \placelist[Topic]
+ \fi
+ \egroup}
+
+%D We don't support another level of structuring.
+
+\let\Subject \Topic
+\let\Subjects\relax
+
+%D Most of this style is \METAPOST\ definitions. We could
+%D have shared some code, but it would not on forehand make
+%D things more readable, so we stick to the following
+%D definitions.
+
+\startuseMPgraphic{page}
+
+ width := \overlaywidth ;
+ height := \overlayheight ;
+
+ d := 15 ; dd := d ; dd := 10 ;
+
+ def fuzzy (expr p,dx,dy) =
+ (xpart p +dx-uniformdeviate dx,ypart p+dy-uniformdeviate dy)
+ enddef ;
+
+ pair ll, lr, ur, ul ;
+
+ ll := (d,d) ;
+ lr := (width-d,d) ;
+ ur := (width-d,height-d) ;
+ ul := (d,height-d) ;
+
+ path p, q, r, s ;
+
+ p := ll.. for i=.1 step .1 until .9 : fuzzy (i[ll,lr],0,+dd).. endfor lr ;
+ q := lr.. for i=.1 step .1 until .9 : fuzzy (i[lr,ur],-dd,0).. endfor ur ;
+ r := ur.. for i=.1 step .1 until .9 : fuzzy (i[ur,ul],0,-dd).. endfor ul ;
+ s := ul.. for i=.1 step .1 until .9 : fuzzy (i[ul,ll],+dd,0).. endfor ll ;
+
+ fill unitsquare xscaled width yscaled height withcolor \MPcolor{PageColor} ;
+
+ fill p & q & r & s -- cycle withcolor \MPcolor{TextColor} ;
+
+ color c ; c := \MPcolor{LineColor} ;
+
+ draw p withpen pencircle xscaled 20 yscaled 5 rotated 30 withcolor c ;
+ draw q withpen pencircle xscaled 5 yscaled 20 rotated 30 withcolor c ;
+ draw r withpen pencircle xscaled 20 yscaled 5 rotated 30 withcolor c ;
+ draw s withpen pencircle xscaled 5 yscaled 20 rotated 30 withcolor c ;
+
+\stopuseMPgraphic
+
+\startuseMPgraphic{itemmark}
+ width := BodyFontSize ; height := width/4 ;
+ maxheight := StrutHeight ; line := 3width/2 ;
+
+ def fuzzy = -(height/4)+uniformdeviate (height/2) enddef ;
+
+ draw
+ ((0,0+fuzzy)--(width,height+fuzzy/2))
+ shifted (line/2,0)
+ withpen pencircle
+ xscaled line yscaled (line/4)
+ rotated (25+uniformdeviate 10) withcolor \MPcolor{SymbolColor} ;
+
+ setbounds currentpicture to unitsquare xyscaled(width,maxheight) ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{nextmark}
+ LoadPageState ; width := BottomHeight ; height := line := width/2 ;
+
+ def fuzzy = -(height/8)+uniformdeviate (height/4) enddef ;
+
+ z1 = (0,0+fuzzy) ; z2 = (width,height/2+fuzzy/2) ; z3 = (0,height+fuzzy) ;
+
+ draw
+ (z1..{right}z2 & z2{left}..z3)
+ withpen pencircle
+ xscaled line yscaled (line/4)
+ rotated 30 withcolor \MPcolor{SymbolColor} ;
+
+ setbounds currentpicture to unitsquare xyscaled(width,height) ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{prevmark}
+ LoadPageState ; width := BottomHeight ; height := line := width/2 ;
+
+ def fuzzy = -(height/8)+uniformdeviate (height/4) enddef ;
+
+ z1 = (width,0+fuzzy) ; z2 = (0,height/2+fuzzy/2) ; z3 = (width,height+fuzzy) ;
+
+ draw
+ (z1..{left}z2 & z2{right}..z3)
+ withpen pencircle
+ xscaled line yscaled (line/4)
+ rotated 30 withcolor \MPcolor{SymbolColor} ;
+
+ setbounds currentpicture to unitsquare xyscaled(width,height) ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{stopmark}
+ LoadPageState ; width := BottomHeight ; height := line := width/2 ;
+
+ def fuzzy = -(height/8)+uniformdeviate (height/4) enddef ;
+
+ z1 = (0,0+fuzzy) ;
+ z2 = (width,height+fuzzy) ;
+ z3 = (width,0+fuzzy) ;
+ z4 = (0,height+fuzzy) ;
+ z5 = (width/2,height/2) ;
+
+ drawoptions
+ (withpen pencircle
+ xscaled line yscaled (line/4)
+ rotated 30 withcolor \MPcolor{SymbolColor}) ;
+
+ draw z1..{right}z5..z2 ; draw z3..{left}z5..z4 ;
+
+ setbounds currentpicture to unitsquare xyscaled(width,height) ;
+\stopuseMPgraphic
+
+\doifnotmode{demo}{\endinput}
+
+%D The (rather silly) demo section.
+
+\starttext
+
+\TitlePage{Title Page\\pre-writing}
+
+\Topics{Some Nice Quotes}
+
+\Topic{A Few}
+
+\Subject{Knuth} \input knuth
+\Subject{Tufte} \input tufte
+
+\Topic{Some More}
+
+\Subject{Zapf} \input zapf
+\Subject{Bryson} \input bryson
+
+\stoptext
diff --git a/tex/context/base/s-pre-14.tex b/tex/context/base/s-pre-14.tex
new file mode 100644
index 000000000..f44117e7c
--- /dev/null
+++ b/tex/context/base/s-pre-14.tex
@@ -0,0 +1,264 @@
+%D \module
+%D [ file=s-pre-14,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 14,
+%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 In the process of making a couple of simple styles for
+%D \EUROTEX\ 99, I came to this one. The joke is in the
+%D pagenumber. This style can be used for short presentations
+%D with much text.
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+%D Since we expect text, we can best be very tolerant.
+
+\setuptolerance
+ [verytolerant,stretch]
+
+%D As most styles we choose a large screen page size.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [width=fit,
+ rightedge=3cm,
+ margin=0pt,
+ rightedgedistance=2cm,
+ height=middle,
+ header=0pt,
+ footer=0pt,
+ topspace=1cm,
+ backspace=1cm]
+
+%D We only use two colors, named \type {One} and \type
+%D {Two}:
+
+\setupcolors
+ [state=start]
+
+\definecolor [One] [r=.6,g=.4,b=.4]
+\definecolor [Two] [r=.4,g=.6,b=.6]
+
+%D If you've looked at the demo file, you will have noticed
+%D that the background consists of four pieces: two filled
+%D rectangles and two half numbers. These are put on th epage
+%D using four overlays:
+
+\setupbackgrounds
+ [page]
+ [background={one,two,three,four}]
+
+%D When we code this in \TEX, we get the following
+%D definitions. As an alternative we coudl have used layers
+%D but I'm afraid that it would not have led to less code.
+
+\defineoverlay
+ [one]
+ [{\framed
+ [frame=off,background=color,backgroundcolor=Two,
+ width=\overlaywidth,height=\overlayheight]
+ {}}]
+
+\defineoverlay
+ [three]
+ [{\hbox to \overlaywidth
+ {\hfill\SetOverlayWidth
+ \framed
+ [frame=off,background=color,backgroundcolor=One,
+ width=\overlaywidth,height=\overlayheight]
+ {}}}]
+
+%D We could have used the main backgroundcolor instead of
+%D overlay \type {one}.
+
+\definefont[NumberFont][RegularBold at 3cm]
+
+\defineoverlay
+ [two]
+ [{\framed
+ [frame=off,width=\overlaywidth,height=\overlayheight,
+ offset=overlay]
+ {\vfill
+ \NumberFont\setstrut\SetOverlayWidth
+ \hbox to \hsize
+ {\hfill
+ \setupinteraction[style=,color=]%
+ \setbox0=\hbox{\strut\One\pagenumber}%
+ \hbox to 0pt{\hss\gotobox{\box0}[previouspage]\hss}%
+ \hskip\overlaywidth}}}]
+
+\defineoverlay
+ [four]
+ [{\framed
+ [frame=off,width=\overlaywidth,height=\overlayheight,offset=overlay]
+ {\vfill
+ \hbox to \hsize
+ {\hfill
+ \SetOverlayWidth
+ \framed
+ [frame=off,width=\overlaywidth,height=\overlayheight,offset=overlay]
+ {\vfill\NumberFont\setstrut
+ \setbox0=\hbox{\strut\Two\pagenumber}%
+ \setbox2=\hbox{\clip[nx=2,ny=1,x=2,y=1]{\copy0}}%
+ \dp2=\dp0
+ \hbox to \hsize{\hbox to 0pt{\hss\hskip.5\wd0\box2\hss}\hfill}}}}}]
+
+\def\SetOverlayWidth%
+ {\scratchdimen = \rightedgedistance
+ \divide\scratchdimen by 2
+ \advance\scratchdimen by \rightedgewidth
+ \advance\scratchdimen by \backspace
+ \edef\overlaywidth{\the\scratchdimen}}
+
+%D A much cleaner implementation is the following. If you hate
+%D \METAPOST, you can run this style in the specified mode:
+
+\startnotmode[no-metapost]
+
+\setupbackgrounds
+ [page]
+ [background={number}]
+
+\defineoverlay[number][\useMPgraphic{number}]
+
+\startuseMPgraphic{number}
+ StartPage ;
+ path Vage ; picture Left, Right ;
+ x1 = x2 = xpart (llcorner Field[Text][RightEdge] shifted (-RightEdgeDistance/2,0)) ;
+ y1 = ypart llcorner Page ;
+ y2 = ypart ulcorner Page ;
+ Vage := llcorner Page -- z1 -- z2 -- ulcorner Page -- cycle ;
+ fill Page withcolor \MPcolor {One} ;
+ fill Vage withcolor \MPcolor {Two} ;
+ if PageNumber>0 :
+ defaultfont := "\truefontname{RegularBold}" ;
+ Left := Right := thelabel("\folio",origin) ysized 3cm ;
+ clip Right to boundingbox Right shifted (bbwidth(Right)/2,0) ;
+ draw Left shifted z1 shifted (0,2.25cm) withcolor \MPcolor {One} ;
+ draw Right shifted z1 shifted (0,2.25cm) withcolor \MPcolor {Two} ;
+ fi ;
+ StopPage ;
+\stopuseMPgraphic
+
+\stopnotmode
+
+%D We use the simple label typesetting present in \METAPOST\
+%D because digits are seldom kerned so real \TEX ing is not
+%D needed. As in the previous method, we let the graphics
+%D overlap so that we don't get white lines due to rounding
+%D problems in viewers.
+%D
+%D We put a button behind the text (this overlay is calculated
+%D each page).
+
+\defineoverlay
+ [nextpage]
+ [\overlaybutton{nextpage}]
+
+\setupbackgrounds
+ [text]
+ [backgroundoffset=.5cm,
+ background=nextpage]
+
+%D We still have to turn on interaction mode.
+
+\setupinteraction
+ [state=start,
+ display=new,
+ menu=on]
+
+\setupinteraction
+ [color=,
+ contrastcolor=]
+
+%D Next we define structuring commands.
+
+\definehead[Topic] [chapter] \setuphead[Topic] [style=\bfc]
+\definehead[Subject][section] \setuphead[Subject][style=\bfa]
+
+\setuphead
+ [Topic, Subject]
+ [number=no,
+ after={\blank[big]}]
+
+%D Because we will provide a menu, we don't offer lists.
+
+\let\Topics \gobbleoneargument
+\let\Subjects\relax
+
+%D The table of contents goes to the right edge.
+
+\startinteractionmenu[right]
+ \setupinteraction
+ [color=black,
+ contrastcolor=Two]
+ \placelist
+ [Topic]
+ [alternative=e,
+ frame=off,
+ criterium=all]
+ \vfill
+\stopinteractionmenu
+
+\setuplist
+ [Topic]
+ [width=\rightedgewidth,
+ maxwidth=\rightedgewidth,
+ style=\bfa]
+
+%D We safe some space:
+
+\setupwhitespace
+ [medium]
+
+\setupblank
+ [medium]
+
+%D In the titlepage, we still use the \TEX\ overlays,
+%D so that we don't have to define a second graphic.
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+\def\StartTitlePage%
+ {\bgroup
+ \setupbackgrounds[page][background={one,three}]
+ \startstandardmakeup
+ \setupalign[middle]
+ \def\\{\vfil\bfb\setupinterlinespace}
+ \bfd\setupinterlinespace
+ \vfil}
+
+\def\StopTitlePage%
+ {\vfil\vfil\vfil
+ \stopstandardmakeup
+ \egroup}
+
+%D This is it.
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\TitlePage{Some Quotes\\(that you probably know by now)}
+
+\Topic{Tufte} \input tufte
+\Topic{Knuth} \input knuth
+\Topic{Reich} \input reich
+\Topic{Zapf} \input zapf
+\Topic{Materie} \input materie
+%Topic{Stork} \input stork
+
+\stoptext
diff --git a/tex/context/base/s-pre-15.tex b/tex/context/base/s-pre-15.tex
new file mode 100644
index 000000000..c9a157abb
--- /dev/null
+++ b/tex/context/base/s-pre-15.tex
@@ -0,0 +1,186 @@
+%D \module
+%D [ file=s-pre-15,
+%D version=1999.09.01,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 15,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is one of the styles I made for the presentation on
+%D the \NTS\ project at Euro\TeX\ 1998. You need balls to let
+%D \TEX\ typeset graphics, but this style demonstrates that it
+%D can be done.
+%D
+%D This presentation is meant for presentations that build up
+%D an idea stepwise.
+%D
+%D \starttyping
+%D \TitlePage{Do you know \TEX ?}
+%D
+%D \StartIdea
+%D \StartItem We use \TEX\ for typesetting \unknown \StopItem
+%D \StartItem mathematical text \unknown \StopItem
+%D \StartItem but also for text that has no math \unknown \StopItem
+%D \StartItem or presentations like this \unknown \StopItem
+%D \StartItem and whatever you can come up with! \StopItem
+%D \StopIdea
+%D \stoptyping
+
+%D The basic layout is rather simple and used as much of the
+%D screen as possible.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [backspace=25pt,
+ topspace=25pt,
+ width=middle,
+ height=middle,
+ header=0pt,
+ footer=0pt]
+
+\setupinteraction
+ [state=start,
+ display=new,
+ color=LineColor,
+ contrastcolor=LineColor,
+ click=no]
+
+\setupinteractionscreen
+ [option=max]
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+%D We use a lot of color. You can remap them if you want
+%D differend ones. The ideas circulate over the colors.
+
+\setupcolors
+ [state=start]
+
+\definecolor[TextColor][s=.8]
+\definecolor[PageColor][s=.6]
+\definecolor[LineColor][s=.4]
+
+\definecolor[red] [r=.4] \definecolor[cyan] [g=.4,b=.4]
+\definecolor[green][g=.4] \definecolor[magenta][r=.4,b=.4]
+\definecolor[blue] [b=.4] \definecolor[yellow] [r=.4,g=.4]
+
+\definecolor[linecolor 1][red] \definecolor[linecolor 5][cyan]
+\definecolor[linecolor 2][green] \definecolor[linecolor 6][magenta]
+\definecolor[linecolor 3][blue] \definecolor[linecolor 4][yellow]
+
+%D We use variables to make sure that the graphics are reused
+%D but unique.
+
+\setupMPvariables[pageframe][pagecolor=PageColor,linecolor=LineColor]
+\setupMPvariables[textframe][textcolor=TextColor,linecolor=LineColor]
+
+\setupbackgrounds
+ [page]
+ [background={pageframe,nextpage}]
+
+\defineoverlay [pageframe] [\uniqueMPgraphic{pageframe}]
+\defineoverlay [textframe] [\uniqueMPgraphic{textframe}]
+\defineoverlay [nextpage] [\overlaybutton{forward}]
+
+\startuniqueMPgraphic{pageframe}{pagecolor,linecolor}
+ path p ; p := fullsquare xyscaled (\overlaywidth,\overlayheight) ;
+ pickup pencircle scaled 10pt ;
+ fill p withcolor \MPvar{pagecolor} ;
+ draw p withcolor \MPvar{linecolor} ;
+\stopuniqueMPgraphic
+
+\startuniqueMPgraphic{textframe}{textcolor,linecolor}
+ path p ; p := fullcircle xyscaled (\overlaywidth,\overlayheight) ;
+ pickup pencircle scaled 10pt ;
+ fill p withcolor \MPvar{textcolor} ;
+ draw p withcolor \MPvar{linecolor} ;
+\stopuniqueMPgraphic
+
+%D The rest of the file implements the nasty part: typesetting
+%D text embedded in a graphic. The text is collected in a box
+%D so that we can reuse it.
+
+\newbox\CollectedIdeas
+\newcounter\CurrentTopic
+
+\def\StartItem%
+ {\setbox\CollectedIdeas=\hbox\bgroup
+ \ifdim\wd\CollectedIdeas>0pt \unhbox\CollectedIdeas\hskip25pt \fi
+ \setbox\scratchbox=\hbox\bgroup
+ \framed
+ [width=160pt,height=160pt,align=middle,frame=off,
+ background=textframe,offset=15pt,top=\vfill,bottom=\vfill]
+ \bgroup}
+
+\def\StopItem%
+ {\egroup
+ \egroup
+ \setbox\scratchbox=\hbox{\lower.5\ht\scratchbox\box\scratchbox}%
+ \ht\scratchbox=.5\ht\scratchbox
+ \dp\scratchbox= \ht\scratchbox
+ \box\scratchbox
+ \egroup
+ \startstandardmakeup
+ \dontcomplain
+ \leftskip 0pt plus 50pt
+ \rightskip 0pt plus 50pt
+ \parfillskip 0pt
+ \baselineskip 100pt
+ \unhcopy\CollectedIdeas
+ \stopstandardmakeup}
+
+\def\StartIdea%
+ {\ifnum\CurrentTopic=6 \doglobal\newcounter\CurrentTopic \fi
+ \doglobal\increment\CurrentTopic
+ \definecolor[LineColor][linecolor \CurrentTopic]
+ \setbox\CollectedIdeas=\null}
+
+\def\StopIdea%
+ {}
+
+\def\StartTitlePage%
+ {\startstandardmakeup
+ \setupalign[middle]
+ \def\\{\vfil\bfb\setupinterlinespace}
+ \bfd\setupinterlinespace
+ \vfil}
+
+\def\StopTitlePage%
+ {\vfil\vfil
+ \stopstandardmakeup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+\doifnotmode{demo}{\endinput}
+
+%D A simple test on functionality.
+
+\setupoutput[pdftex]
+
+\starttext
+
+\TitlePage{Do you know \TEX ?}
+
+\startbuffer
+\StartIdea
+ \StartItem We use \TEX\ for typesetting \unknown \StopItem
+ \StartItem mathematical text \unknown \StopItem
+ \StartItem but also for text that has no math \unknown \StopItem
+ \StartItem or presentations like this \unknown \StopItem
+ \StartItem and whatever you can come up with! \StopItem
+\StopIdea
+\stopbuffer
+
+\dorecurse{6}{\getbuffer}
+
+\stoptext
diff --git a/tex/context/base/s-pre-16.tex b/tex/context/base/s-pre-16.tex
new file mode 100644
index 000000000..81f21ec60
--- /dev/null
+++ b/tex/context/base/s-pre-16.tex
@@ -0,0 +1,203 @@
+%D \module
+%D [ file=s-pre-16,
+%D version=1999.09.01,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 16,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The first version of this style was made late summer 1999,
+%D but its first usage was during a course I gave in BRNO.
+%D It's a rather simple style with a dominating background.
+
+\setuppapersize
+ [S6][S6]
+
+\setupbodyfont
+ [pos,14.4pt]
+
+\setuplayout
+ [topspace=100pt,
+ backspace=120pt,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setupbackgrounds
+ [text]
+ [backgroundoffset=80pt,
+ background=GoOn]
+
+\setupbackgrounds
+ [page]
+ [background={FuzzyCircle,Again}]
+
+\setupcolors
+ [state=start]
+
+\definecolor[gray] [s=.4]
+\definecolor[white][s=.8]
+
+\definecolor[red] [r=.8] \definecolor[cyan] [g=.8,b=.8]
+\definecolor[green][g=.8] \definecolor[magenta][r=.8,b=.8]
+\definecolor[blue] [b=.8] \definecolor[yellow] [r=.8,g=.8]
+
+\definecolor[PageColor][gray]
+\definecolor[TextColor][yellow]
+\definecolor[LineColor][blue]
+
+\setupinteraction
+ [state=start,
+ color=LineColor,
+ contrastcolor=LineColor]
+
+\setupinteractionscreen
+ [option=max]
+
+\setupitemize
+ [each]
+ [color=blue,
+ symbol=FuzzyDot]
+
+\startuseMPgraphic{FuzzyCircle}
+ path p ; numeric w, h, l ;
+ w := OverlayWidth ; h := OverlayHeight ;
+ def dd = (1 randomized (1/5)) enddef ;
+ pickup pencircle xscaled 10pt yscaled 2pt rotated 30;
+ for i:=1 upto 50 :
+ p := (-dd,-dd)..(dd,-dd)..(dd,dd)..(-dd,dd)..cycle ;
+ p := p rotatedaround (center p, uniformdeviate 360) ;
+ p := p xscaled (w/2) yscaled (h/2) ;
+ l := length(p)/2 ;
+ p := p cutbefore point (uniformdeviate l) of p ;
+ p := p cutafter point (l+uniformdeviate l) of p ;
+ draw p withcolor \MPcolor{LineColor} randomized (.4,1) ;
+ endfor ;
+ picture s ; s := currentpicture xysized (w-15,h-15) ;
+ currentpicture := nullpicture ;
+ fill boundingbox s enlarged 60pt withcolor \MPcolor{PageColor} ;
+ addto currentpicture also s ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{FuzzyDot}
+ path p ; numeric w ;
+ w := BodyFontSize/2 ;
+ def dd = (w randomized (w/2)) enddef ;
+ pickup pencircle xscaled (w/2) yscaled (w/3) rotated 30 ;
+ for i=0 step 45 until 135 :
+ p := (-dd,0)--(dd,0) ;
+ p := p rotatedaround (origin,i-w+uniformdeviate w) ;
+ draw p withcolor \MPcolor{LineColor} randomized (.3,.8) ;
+ endfor ;
+\stopuseMPgraphic
+
+\defineoverlay [FuzzyCircle] [\useMPgraphic{FuzzyCircle}]
+\defineoverlay [GoOn] [{\setupinteraction[click=no]\overlaybutton{forward}}]
+\defineoverlay [Again] [\overlaybutton{firstpage}]
+
+\definesymbol
+ [FuzzyDot]
+ [\lower\dp\strutbox\hbox{\useMPgraphic{FuzzyDot}}]
+
+\def\Item%
+ {\par\noindent\symbol[FuzzyDot]\hskip.5em\nobreak}
+
+\setupitemize
+ [all]
+ [packed]
+ [symbol=FuzzyDot]
+
+\def\NextIdea%
+ {\blank[back,medium]
+ \midaligned{\symbol[FuzzyDot]}
+ \blank[medium]
+ \blank[disable]}
+
+\definehead [Topic] [chapter]
+\definehead [Nopic] [title]
+
+\setuphead
+ [Topic, Nopic]
+ [alternative=middle,
+ before=,
+ number=no,
+ style=\bfb]
+
+\setuplist
+ [Topic]
+ [alternative=g,
+ interaction=all]
+
+%D Since we want a colored text, and since color directive
+%D can spoil the spacing, we use a foregroundcolor.
+
+\setupbackgrounds
+ [text]
+ [foregroundcolor=TextColor]
+
+%D Unfortunately this does not work when on the page colors
+%D are set, so we play safe and say:
+
+\setupmakeup
+ [standard]
+ [color=TextColor]
+
+\def\StartIdea%
+ {\startstandardmakeup
+ \setupwhitespace[medium]
+ \setupblank[medium]
+ \setupalign[broad,middle]}
+
+\def\StopIdea%
+ {\stopstandardmakeup}
+
+\def\Topics#1%
+ {\Nopic{#1}
+ \startcolumns
+ \setupinteraction[color=TextColor,contrastcolor=TextColor]
+ \placelist[Topic]
+ \stopcolumns
+ \page}
+
+%D Some fakes.
+
+\def\Subject {\Topic}
+\def\Subjects {}
+
+%D A bonus (copied from \type {s-pre-02} but with a different
+%D vertical alignment.
+
+\def\StartTitlePage%
+ {\startstandardmakeup
+ \bfd\setupinterlinespace
+ \setupalign[middle]
+ \vfil
+ \let\\=\vfil}
+
+\def\StopTitlePage%
+ {\vfil
+ \stopstandardmakeup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\Topics{...}
+
+\StartIdea
+ \Topic{...}
+ ...
+ \NextIdea
+ ...
+\StopIdea
+
+\stoptext
diff --git a/tex/context/base/s-pre-17.tex b/tex/context/base/s-pre-17.tex
new file mode 100644
index 000000000..798f30cf8
--- /dev/null
+++ b/tex/context/base/s-pre-17.tex
@@ -0,0 +1,399 @@
+%D \module
+%D [ file=s-pre-17,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 17,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setupbodyfont
+ [12pt,ss]
+
+\setupcolors
+ [state=start]
+
+\setupsystem
+ [random=medium]
+
+\setupbackgrounds
+ [state=repeat]
+
+\setupbackgrounds
+ [page]
+ [background={page,forward}]
+
+\setupbackgrounds
+ [text][text]
+ [background=blowup]
+
+\setupinteraction
+ [state=start,
+ %click=off,
+ color=TitleColor,
+ contrastcolor=TitleColor]
+
+\setupinteractionscreen
+ [option=max]
+
+\setuptolerance
+ [verytolerant,stretch]
+
+\definecolor [BackColor] [s=.30]
+\definecolor [PageColor] [g=1]
+\definecolor [FrameColor] [r=1]
+\definecolor [TitleColor] [y=1]
+\definecolor [ArrowColor] [b=1]
+
+\defineoverlay [title] [\useMPgraphic{title}]
+\defineoverlay [page] [\useMPgraphic{page}]
+\defineoverlay [blowup] [\overlaybutton{page(\realfolio)}]
+\defineoverlay [forward] [\overlaybutton{forward}]
+
+\startMPpositiongraphic{mppos:connection}
+ path pa, pb, pc ; pair ca, cb ;
+ initialize_box(\MPpos{\MPvar{self}}) ; pa := pxy ; ca := cxy ;
+ initialize_box(\MPpos{\MPvar{prev}}) ; pb := pxy ; cb := cxy ;
+ pickup pencircle scaled .5pt ;
+ pa := pa enlarged 10pt ;
+ pb := pb enlarged 10pt ;
+ for i=1 upto 10 :
+ draw pa randomized 20pt withcolor \MPcolor{FrameColor} ;
+ endfor ;
+ if \MPp{\MPvar{prev}}>0 :
+ pair a, b, c, d ;
+ for i=1 upto 25 :
+ a := .5[ulcorner pa,urcorner pa] randomized (10pt,10pt) ;
+ b := .5[llcorner pb,lrcorner pb] randomized (20pt,10pt) ;
+ c := .5[a,b] rotatedaround(a,-25) randomized (5pt,5pt) ;
+ d := .5[a,b] rotatedaround(a,+25) randomized (5pt,5pt) ;
+ draw (a--b) withcolor \MPcolor{ArrowColor} ;
+ draw (d--a--c) withcolor \MPcolor{ArrowColor} ;
+ endfor ;
+ fi ;
+ anchor_box(\MPanchor{\MPvar{self}}) ;
+\stopMPpositiongraphic
+
+\startuseMPgraphic{title}
+ pickup pencircle scaled .5pt ;
+ for i=1 upto 10 :
+ draw
+ fullsquare xyscaled(OverlayWidth,OverlayHeight)
+ enlarged 10pt randomized 20pt
+ withcolor \MPcolor{TitleColor} ;
+ endfor ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{page}
+ StartPage ;
+ pickup pencircle scaled .5pt ;
+ fill Page withcolor \MPcolor{BackColor} ;
+ for i=1 upto 20 :
+ draw Page enlarged -50pt randomized 50pt withcolor \MPcolor{PageColor} ;
+ endfor ;
+ StopPage ;
+\stopuseMPgraphic
+
+\def\StartText%
+ {\bgroup
+ \getrandomdimen\scratchdimen{250pt}{350pt}%
+ \edef\TextWidth{\the\scratchdimen}%
+ \setbox\scratchbox=\hbox\bgroup
+ \hsize\TextWidth
+ \setupframedtexts
+ [before=,after=,
+ width=fit,align=right, % normal,
+ frame=off,foregroundcolor=white]%
+ \framedtext\bgroup}
+
+\def\BlowX{450pt} % \def\BlowX{600pt}
+\def\BlowY{300pt} % \def\BlowY{450pt}
+\def\BlowV {50pt} % \def\BlowV{100pt}
+\def\BlowH {75pt} % \def\BlowH{100pt}
+\def\BackO {50pt} % \def\BackO {50pt}
+
+\def\StopText%
+ {\egroup\egroup
+ \doglobal\increment\CurrentBlaBla
+ \let\PrevBlaBla\CurrentBlaBla \doglobal\decrement\PrevBlaBla
+ \let\NextBlaBla\CurrentBlaBla \doglobal\increment\NextBlaBla
+ \setMPpositiongraphic
+ {connection:\CurrentBlaBla}%
+ {mppos:connection}%
+ {seed=\CurrentBlaBla,
+ prev=connection:\PrevBlaBla,
+ next=connection:\NextBlaBla}%
+ \SetBlowUp{connection:\CurrentBlaBla}\BlowX\BlowY\BlowH\BlowV
+ \hbox to 600pt
+% {\getrandomdimen\scratchdimen{50pt}{100pt}%
+ {\getrandomdimen\scratchdimen{50pt}{75pt}%
+ \hskip0pt plus \scratchdimen minus \scratchdimen
+ \hpos{connection:\CurrentBlaBla}%
+ {\framed
+ [frame=off,
+ offset=overlay,
+ backgroundoffset=\BackO,
+ background=blowup]
+ {\box\scratchbox}}%
+% \getrandomdimen\scratchdimen{50pt}{100pt}%
+ \getrandomdimen\scratchdimen{50pt}{75pt}%
+ \hskip0pt plus \scratchdimen minus \scratchdimen}%
+% \getrandomdimen\scratchdimen{100pt}{150pt}%
+ \getrandomdimen\scratchdimen{75pt}{125pt}%
+ \vskip\scratchdimen
+ \egroup}
+
+\def\xStartText
+ {\bgroup
+ \setbox\scratchbox=\hbox\bgroup
+ \framed
+ [frame=off,foregroundcolor=white]
+ \bgroup}
+
+\def\xStopText{\StopText}
+
+\def\SetBlowUp#1#2#3#4#5% tag width height hoffset voffset
+ {\scratchdimen=\MPw{#1}%
+ \advance\scratchdimen-#2 %
+ \divide\scratchdimen by 2
+ \advance\scratchdimen by \MPx{#1}\relax
+ \ifdim\scratchdimen<0pt \scratchdimen=0pt \fi
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextX
+ \advance\scratchdimen by #2 %
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextW
+ %
+ \scratchdimen=\MPh{#1}%
+ \advance\scratchdimen-#3 %
+ \divide\scratchdimen by 2
+ \advance\scratchdimen\MPy{#1}\relax
+ \ifdim\scratchdimen<0pt \scratchdimen=0pt \fi
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextY
+ \advance\scratchdimen by #3
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextH
+ %
+ \def\PDFpageviewkey{ fitr \TextX\space\TextY\space\TextW\space\TextH}%
+ \def\PDFpageviewwrd{ /FitR \TextX\space\TextY\space\TextW\space\TextH}%
+ \edef\PDFpageview{/View [\PDFpageviewwrd]}}
+
+\def\xSetBlowUp#1#2#3#4#5% tag width height hoffset voffset
+ {\scratchdimen\MPx{#1}\relax
+ \ifdim\scratchdimen<#4
+ \ScaledPointsToBigPoints{0}\TextX
+ \multiply\scratchdimen 2
+ \else
+ \advance\scratchdimen-#4
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextX
+ \advance\scratchdimen#4
+ \advance\scratchdimen#4
+ \fi
+ \advance\scratchdimen\MPw{#1}%
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextW
+ %
+ \scratchdimen\MPy{#1}\relax
+ \ifdim\scratchdimen<#5
+ \ScaledPointsToBigPoints{0}\TextY
+ \multiply\scratchdimen 2
+ \else
+ \advance\scratchdimen-#5
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextY
+ \advance\scratchdimen#5
+ \advance\scratchdimen#5
+ \fi
+ \advance\scratchdimen\MPh{#1}%
+ \ScaledPointsToBigPoints{\number\scratchdimen}\TextH
+ %
+ \def\PDFpageviewkey{ fitr \TextX\space\TextY\space\TextW\space\TextH}%
+ \def\PDFpageviewwrd{ /FitR \TextX\space\TextY\space\TextW\space\TextH}%
+ \edef\PDFpageview{/View [\PDFpageviewwrd]}}
+
+\dontcomplain
+
+\def\StartPage#1%
+ {\doStartPage{1}{#1}}
+
+\def\doStartPage#1#2%
+ {\def\StopPage{\doStopPage{#1}{#2}}%
+ \setbox\scratchbox=\hbox\bgroup
+ \valign\bgroup\ignorespaces##\vss\cr}
+
+\def\doStopPage#1#2%
+ {\cr
+ \egroup
+ \egroup
+ \setbox\scratchbox=\vbox
+ {\vskip100pt
+ \hbox \ifcase#1 spread 200pt \else to \wd\scratchbox \fi
+ {\hss
+ \switchtobodyfont[big]%
+ \bfd\setupinterlinespace
+ \ifcase#1\else \SetBlowUp{title:\realfolio}\BlowX\BlowY\BlowH\BlowV \fi
+ \hpos{title:\realfolio}
+ {\framed
+ [frame=off,align=middle,
+ foregroundcolor=white,
+ background={title,blowup}]
+ {#2}}%
+ \hss}
+ \vskip100pt
+ \box\scratchbox}
+ \doFlushPage}
+
+\def\doFlushPage
+ {\scratchdimen=\ht\scratchbox
+ \advance\scratchdimen \dp\scratchbox
+ \advance\scratchdimen 100pt
+ \edef\height{\the\scratchdimen}
+ \scratchdimen=\wd\scratchbox
+ \advance\scratchdimen 100pt
+ \edef\width {\the\scratchdimen}
+ \expanded{\definepapersize[MASTER][width=\width,height=\height]}
+ \setuppapersize
+ [MASTER][MASTER]
+ \setuplayout
+ [topspace=25pt,backspace=25pt,
+ width=middle,header=0pt,footer=0pt,height=middle]
+ \centerbox{\box\scratchbox}
+ \page}
+
+\def\StartTopic#1%
+ {\unskip\unskip\cr
+ \doglobal\increment(\CurrentBlaBla,100)%
+ \vbox\bgroup
+ \vskip100pt
+ \bgroup
+ \definecolor[FrameColor][TitleColor]
+ \switchtobodyfont[big]
+ \bfd\setupinterlinespace
+ \xStartText#1\xStopText
+ \vskip25pt
+ \egroup}
+
+\def\StopTopic%
+ {\vskip-\lastskip
+ \vskip100pt
+ \egroup
+ \ignorespaces}
+
+\def\TitlePage#1%
+ {\doStartPage{0}{\def\\{\vskip1ex\bfc\def\\{\vskip1ex\bfb}}#1}
+ \StopPage}
+
+\doifnotmode{demo}{\endinput}
+
+\setupoutput[pdftex]
+
+\starttext
+
+\TitlePage{About Text\\Today's Talk\\Hans Hagen}
+
+\StartPage{The First Page}
+
+\StartTopic{Some Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input knuth \StopText
+\StopTopic
+
+\StartTopic{Another Text}
+ \StartText \input tufte \StopText
+ \StartText \input zapf \StopText
+ \StartText \input knuth \StopText
+\StopTopic
+
+\StartTopic{Some More Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input tufte \StopText
+\StopTopic
+
+\StartTopic{Some Text Agian}
+ \StartText \input tufte \StopText
+ \StartText \input zapf \StopText
+ \StartText \input knuth \StopText
+ \StartText \input tufte \StopText
+\StopTopic
+
+\StopPage
+
+\StartPage{The Second Page}
+
+\StartTopic{Some Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+\StopTopic
+
+\StartTopic{Another Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+\StopTopic
+
+\StartTopic{Some Nice Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input tufte \StopText
+ \StartText \input tufte \StopText
+\StopTopic
+
+\StartTopic{Some Funny Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+\StopTopic
+
+\StartTopic{Quite Some Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+\StopTopic
+
+\StartTopic{Even More Text}
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+\StopTopic
+
+\StopPage
+
+\StartPage{The Third Page}
+
+\StartTopic{Some Short Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+\StopTopic
+
+\StartTopic{Some Minimal Text}
+ \StartText \input tufte \StopText
+ \StartText \input zapf \StopText
+\StopTopic
+
+\StartTopic{Some More Text}
+ \StartText \input tufte \StopText
+ \StartText \input knuth \StopText
+ \StartText \input zapf \StopText
+ \StartText \input tufte \StopText
+ \StartText \input tufte \StopText
+\StopTopic
+
+\StopPage
+
+\stoptext
diff --git a/tex/context/base/s-pre-18.tex b/tex/context/base/s-pre-18.tex
new file mode 100644
index 000000000..407f30824
--- /dev/null
+++ b/tex/context/base/s-pre-18.tex
@@ -0,0 +1,177 @@
+%D \module
+%D [ file=s-pre-18,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 18,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+
+
+% output=pdftex interface=en
+
+% todo: met pos en dan iedere titel
+
+\setuppapersize
+ [S6][S6]
+
+\setupbodyfont
+ [loc,ppl]
+
+\setupcolors
+ [state=start]
+
+\definecolor [shade-1] [s=.7]
+\definecolor [shade-2] [s=.1]
+
+\definecolor [shade-3] [s=.8]
+\definecolor [shade-4] [b=.8]
+
+\definecolor [shade-5] [g=.6]
+
+\setuplayout
+ [topspace=1cm,
+ height=fit,
+ backspace=1cm,
+ width=middle,
+ header=0pt,
+ footer=0pt,
+ bottomdistance=1cm]
+
+\setupbackgrounds
+ [state=repeat]
+
+\setupbackgrounds [page] [background=page]
+
+\defineoverlay [page] [\useMPgraphic{page}]
+\defineoverlay [text] [\useMPgraphic{text}]
+
+\startuseMPgraphic{page}
+ StartPage ;
+ path p ; numeric s ; pair cp ; cp := center Page ;
+ s := define_circular_shade(cp,cp,0,TextWidth,
+ \MPcolor{shade-1},\MPcolor{shade-2}) ;
+ fill Page withshade s ;
+ p := fullcircle xyscaled (TextWidth+1cm, TextHeight+1cm) shifted cp ;
+ s := define_circular_shade(cp,cp,0,TextWidth,\MPcolor{shade-3},
+ \MPcolor{shade-4}) ;
+ fill p withshade s ;
+ StopPage
+\stopuseMPgraphic
+
+\startuseMPgraphic{text}
+ StartPage ;
+ path p ; numeric s, t ; pair cp ; cp := center Page ;
+ s := define_circular_shade(cp,cp,0,TextWidth,
+ \MPcolor{shade-1},\MPcolor{shade-2}) ;
+ fill Page withshade s ;
+ p := llcorner Field[Text][Bottom] --
+ lrcorner Field[Text][Bottom] --
+ urcorner Field[Text][Text] --
+ ulcorner Field[Text][Text] -- cycle ;
+ p := p enlarged .5cm randomized .5cm ;
+ t := define_circular_shade(cp,cp,0,TextWidth,\MPcolor{shade-3},
+ \MPcolor{shade-4}) ;
+ fill p withshade t ;
+
+ def bottom_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) =
+ if (pp>0) and (rr>0) :
+ if nn = 1 :
+ p := (0,0)--(ww,hh/2)--(0,hh)--cycle ;
+ elseif nn = 2 :
+ p := (0,hh/2)--(ww,hh)--(ww,0)--cycle ;
+ else :
+ p := origin--cycle ;
+ fi ;
+ fill p randomized 2.5mm shifted (xx,yy) withshade s ;
+ fi ;
+ enddef ;
+
+ \MPmenubuttons{bottom}
+
+ if length \MPstring{topic} > 0 :
+ graphictext
+ \MPstring{topic}
+ scaled 3
+ shifted ulcorner Field[Text][Text]
+ shifted (0,-1.5cm)
+ withshade s ;
+ fi ;
+
+ StopPage ;
+\stopuseMPgraphic
+
+\setupinteractionmenu
+ [bottom]
+ [state=start,
+ frame=off,
+ left=\hfill,
+ middle=\hskip.5cm,
+ width=2\bottomheight,
+ position=yes]
+
+\startinteractionmenu[bottom]
+ \but [previouspage] \\
+ \but [nextpage] \\
+\stopinteractionmenu
+
+\setupinteraction
+ [state=start,
+ click=no,
+ color=shade-5,
+ contrastcolor=shade-5,
+ menu=on]
+
+\setupwhitespace
+ [big]
+
+\def\Topic#1%
+ {\page
+ \setMPtext{topic}{#1}
+ \vbox to 2cm{}}
+
+\setMPtext{topic}{}
+
+\def\StartTitlePage%
+ {\startstandardmakeup[bottomstate=none]
+ \setupalign[middle]
+ \vfill}
+
+\def\StopTitlePage%
+ {\stopstandardmakeup
+ \setuplayout[bottom=1.5cm]
+ \setupbackgrounds[page][background=text]}
+
+\def\TitleString#1#2%
+ {\indent
+ \startMPcode
+ graphictext
+ "#2"
+ scaled #1
+ withdrawcolor .4white
+ withfillcolor .7white
+ withpen pencircle scaled 2pt ;
+ \stopMPcode
+ \vfill}
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\StartTitlePage
+ \TitleString{8}{Welcome}
+ \TitleString{4}{to my favourite}
+ \TitleString{8}{Quotes}
+\StopTitlePage
+
+\Topic {Douglas R. Hofstadter} \input douglas \page
+\Topic {Donald E. Knuth} \input knuth \page
+\Topic {Edward R. Tufte} \input tufte \page
+\Topic {Hermann Zapf} \input zapf \page
+
+\stoptext
diff --git a/tex/context/base/s-pre-19.tex b/tex/context/base/s-pre-19.tex
new file mode 100644
index 000000000..3715d6ac1
--- /dev/null
+++ b/tex/context/base/s-pre-19.tex
@@ -0,0 +1,347 @@
+%D \module
+%D [ file=s-pre-19,
+%D version=2000.07.31,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 19,
+%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 style is made in the process or writing the \METAFUN\
+%D manual. It exploits a few tricks, like graphics calculated
+%D using positional information. It also uses the (at that
+%D moment) new menu list placement alternative. If you forget
+%D about the definition of the button shapes, which is
+%D complicated in any system, this style is not even that hard
+%D to follow. Watch how the left side of the buttons follow
+%D the right side of the text graphic.
+%D
+%D While playing bit with this style, the random alternative
+%D made me think of those organic building with non equal
+%D windows (we have a few in The Netherlands), so I decided to
+%D label this style as \type {pre-organic}.
+%D
+%D At the end of this file, there is a small test file, so
+%D when you process this file with \TEXEXEC\ and the options
+%D \type {--mode=demo} and \type {--pdf}, you will get a demo
+%D document.
+
+%D We use one of the standard screen \quote {paper} sizes, and
+%D map it onto the same size, so that we get a nicely cropped
+%D page.
+
+\setuppapersize
+ [S6][S6]
+
+%D Like in the \METAFUN\ manual, we use the Palatino as main
+%D bodyfont. This font is quite readable on even low
+%D resolution screens, although I admit that this style is
+%D developed using an $1400\times1050$ pixel LCD screen, so I
+%D may be biased.
+
+%\startmode[asintended] \setupbodyfont[ppl] \stopmode
+
+%D The layout specification sets up a text area and a right
+%D edge area where the menus will go. Watch the rather large
+%D edge distance. By setting the header and footer dimensions
+%D to zero, we automatically get rid of page body ornaments,
+%D like the pagenumber.
+
+\setuplayout
+ [topspace=48pt,
+ backspace=48pt,
+ cutspace=12pt,
+ width=400pt,
+ margin=0cm,
+ rightedge=88pt,
+ rightedgedistance=48pt,
+ header=0cm,
+ footer=0cm,
+ height=middle]
+
+%D We use a moderate, about a line height, interparagraph
+%D white space.
+
+\setupwhitespace
+ [big]
+
+%D Of course we use colors, since on computer displays they
+%D come for free.
+
+\setupcolors
+ [state=start]
+
+\definecolor [red] [r=.75]
+\definecolor [yellow] [r=.75,g=.75]
+\definecolor [gray] [s=.50]
+\definecolor [white] [s=.85]
+
+\definecolor [PageColor] [yellow]
+\definecolor [TextColor] [white]
+\definecolor [OrnamentColor] [red]
+\definecolor [InteractionColor] [red]
+\definecolor [ContrastColor] [gray]
+
+%D This is an interactive document, so we enable interaction.
+%D In this style, we disable the viewer's \quote {highlight a
+%D hyperlink when it's clicked on} feature. We will use a
+%D menu, so we enable menus. Later we will see the contract
+%D color |<|hyperlinks gets that color when we are already on
+%D the location|>| in action.
+
+\setupinteraction
+ [state=start,
+ click=off,
+ color=InteractionColor,
+ contrastcolor=ContrastColor,
+ menu=on]
+
+%D The menu itself is set up as follows. Because we will
+%D calculate menubuttons based on their position on the page,
+%D we have to keep track of the positions. Therefore, we set
+%D the \type {position} variable to \type {yes}.
+
+\setupinteractionmenu
+ [right]
+ [frame=off,
+ position=yes,
+ align=middle,
+ topoffset=-.75cm,
+ bottomoffset=-.75cm,
+ color=gray,
+ contrastcolor=gray,
+ style=bold,
+ before=,
+ after=]
+
+%D The menu content is rather sober: a list of topics (later
+%D we will define the command that generates topic entries),
+%D and a close button.
+
+\startinteractionmenu[right]
+ \placelist[Topic][alternative=right]
+ \vfill
+ \but [CloseDocument] close \\
+\stopinteractionmenu
+
+%D We have now arived at the more interesting part of the style
+%D definition: the graphic that goes in the page background.
+%D Because this graphic will change, we define a usable
+%D \METAPOST\ graphic. Page backgrounds are recalculated each
+%D page, opposite to the other backgrounds that are calculated
+%D when a new background is defined, or when repetitive
+%D calculation is turned on.
+
+\setupbackgrounds
+ [page]
+ [background=page]
+
+\defineoverlay
+ [page]
+ [\useMPgraphic{page}]
+
+\setupMPvariables
+ [page]
+ [alternative=3]
+
+\startuseMPgraphic{page}
+
+ \includeMPgraphic{rightsuperbutton}
+
+ StartPage ;
+
+ path p, q ; pickup pencircle scaled 3pt ;
+
+ p := Field[Text][Text] enlarged 36pt superellipsed .90 ;
+
+ fill Page withcolor \MPcolor{PageColor} ;
+ fill p withcolor \MPcolor{TextColor} ;
+ draw p withcolor \MPcolor{OrnamentColor} ;
+
+ p := Field[Text][Text] enlarged 48pt superellipsed .90 ;
+
+ def right_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) =
+ if (pp>0) and (rr>0) :
+ q := rightsuperbutton(p,xx,yy,RightEdgeWidth,hh) ;
+ fill q withcolor \MPcolor{TextColor} ;
+ draw q withcolor if rr=2 : \MPcolor{ContrastColor}
+ else : \MPcolor{InteractionColor} fi ;
+ fi ;
+ enddef ;
+
+ \MPmenubuttons{right}
+
+ StopPage ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{page}
+
+ \includeMPgraphic{rightsuperbutton}
+
+ StartPage ;
+
+ numeric alternative, seed, superness, squeezeness, randomness ;
+ path p, q ; transform t ;
+
+ alternative := \MPvar{alternative} ;
+ seed := uniformdeviate 100 ;
+
+ if alternative > 10 :
+ superness := .85 + ((\realfolio-1)/\lastpage) * .15 ;
+ squeezeness := 12pt - ((\realfolio-1)/\lastpage) * 10pt ;
+ else :
+ superness := .90 ;
+ squeezeness := 12pt ;
+ fi ;
+
+ randomness := squeezeness ;
+
+ alternative := alternative mod 10 ;
+
+ t := identity if alternative=3: shifted (9pt,-9pt) fi ;
+
+ % first we draw the shape that surrounds the text
+
+ randomseed := seed ;
+
+ p := Field[Text][Text] enlarged if
+ alternative = 1 : 36pt superellipsed superness elseif
+ alternative = 2 : 36pt squeezed squeezeness elseif
+ alternative = 3 : 36pt randomized randomness else
+ : 36pt fi ;
+ pickup pencircle scaled 3pt ;
+
+ fill Page withcolor \MPcolor{PageColor} ;
+ fill p withcolor \MPcolor{TextColor} ;
+ draw p withcolor \MPcolor{OrnamentColor} ;
+
+ % we set p to the wider shape from which we will chip off pieces
+
+ randomseed := seed ;
+
+ p := ( Field[Text][Text] enlarged if
+ alternative = 1 : 48pt superellipsed superness elseif
+ alternative = 2 : 48pt squeezed squeezeness elseif
+ alternative = 3 : 36pt randomized randomness else
+ : 48pt fi ) transformed t ;
+
+ % calls to *_menu_button are generated automatically ...
+
+ vardef right_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) =
+ save q ; path q ;
+ if (pp>0) and (rr>0) :
+ q := rightsuperbutton(p,xx,yy,RightEdgeWidth,hh) ; % \MPw{menu:right:\realfolio}
+ fill q withcolor \MPcolor{TextColor} ;
+ draw q withcolor if rr=2 : \MPcolor{ContrastColor}
+ else : \MPcolor{InteractionColor} fi ;
+ fi ;
+ enddef ;
+
+ % ... and inserted when the graphic data is flushed here ...
+
+ \MPmenubuttons{right}
+
+ StopPage ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{rightsuperbutton}
+
+vardef rightsuperbutton (expr pat, xpos, ypos, wid, hei) =
+
+ save p, ptop, pbot, t, b, edge, shift, width, height ;
+ path p, ptop, pbot ; pair t, b ; numeric edge, shift, width, height ;
+
+ edge := xpos + wid ; shift := ypos + hei ;
+
+ p := rightpath pat ;
+
+ ptop := ((-infinity,shift)--(edge,shift)) ;
+ pbot := ((-infinity,shift-hei)--(edge,shift-hei)) ;
+
+ t := p intersection_point ptop ;
+ b := p intersection_point pbot ;
+
+ p := subpath(0,xpart (p intersectiontimes ptop)) of p ;
+ p := subpath(xpart (p intersectiontimes pbot),length(p)) of p ;
+
+ (p -- t -- point 1 of ptop &
+ point 1 of ptop -- point 1 of pbot &
+ point 1 of pbot -- b
+ -- cycle)
+
+enddef ;
+
+\stopuseMPgraphic
+
+%D Topics are identified with \type {\Topic}, which is an
+%D instance of chapter headings. The number is made invisible.
+%D Since it still is a numbered section header, \CONTEXT\ will
+%D write the header to the table of contents.
+
+\definehead
+ [Topic]
+ [chapter]
+
+\setuphead
+ [Topic]
+ [number=no]
+
+%D We will use a bold font in the table of contents. We also
+%D force a complete list.
+
+\setuplist
+ [Topic]
+ [criterium=all,
+ style=bold,
+ before=,
+ after=]
+
+%D The \type {\TitlePage} macro looks horrible, because we
+%D want to keep the interface simple: a list of small
+%D sentences, separated by \type {\\}.
+
+\def\StartTitlePage
+ {\startstandardmakeup
+ \switchtobodyfont[big]
+ \def\\{\vfill\bfb\let\\=\par}
+ \bfd\setupinterlinespace\gray
+ \vskip.5cm}
+
+\def\StopTitlePage
+ {\\\vskip.5cm % the \\ is really needed
+ \stopstandardmakeup}
+
+\def\TitlePage#1%
+ {\StartTitlePage#1\StopTitlePage}
+
+%D A couple of goodies:
+
+\def\Subject {\Topic}
+\def\Topics #1{}
+\def\Subjects {}
+
+%D For those who want to test:
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\setupMPvariables[page][alternative=3]
+
+\TitlePage
+ {A Few Nice Quotes\\
+ A Simple Style Demo\\
+ Hans Hagen, August 2000}
+
+
+\Topic {Douglas R. Hofstadter} \input douglas \page
+\Topic {Donald E. Knuth} \input knuth \page
+\Topic {Edward R. Tufte} \input tufte \page
+\Topic {Hermann Zapf} \input zapf \page
+%Topic {David F. Stork} \input stork \page
+
+\stoptext
diff --git a/tex/context/base/s-pre-22.tex b/tex/context/base/s-pre-22.tex
new file mode 100644
index 000000000..cb09816dc
--- /dev/null
+++ b/tex/context/base/s-pre-22.tex
@@ -0,0 +1,319 @@
+%D \module
+%D [ file=s-pre-22,
+%D version=2000.08.07,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 22,
+%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 style was made on behalf of the \PDFTEX\ presentation
+%D at \TUG\ 2000. It cycled a summary of each talk, with name
+%D and title. When documenting this style, I changed
+%D reprocessing into pushing on layers.
+%D
+%D A \quote {problem} like this can be solved in several ways:
+%D
+%D \startitemize
+%D \item writing a lot of semi||complex \TEX\ code as shown
+%D \item keeping track of positions and draw everything on the
+%D page layer
+%D \item defining an overlay for each summary and changing the
+%D order when flushing
+%D \item maintaining a so called field stack
+%D \stopitemize
+%D
+%D We go for the first method. We assume that summaries are
+%D simple text snippets.
+
+\startmode[asintended] \setupbodyfont[lbr] \stopmode
+
+\setupbodyfont[14.4pt]
+
+%D We use the whole page area.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=0cm,
+ backspace=0cm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+%D We define a couple of matching colors and gray scales.
+%D Watch out, some are really meant to look dim.
+
+\setupcolors
+ [state=start]
+
+\definecolor[PageColor] [s=.50]
+\definecolor[TextColor] [s=.80]
+\definecolor[DoneColor] [s=.65]
+
+\definecolor[TopColor] [r=.5,g=.6,b=.7]
+\definecolor[BotColor] [r=.6,g=.7,b=.5]
+\definecolor[DotColor] [r=.7,g=.5,b=.6]
+
+%D We will use foreground colors. Because these can interfere
+%D with the colors they overload, we can bets make sure that
+%D we don't have local colors.
+
+\setupinteraction
+ [state=start,
+ color=,
+ contrastcolor=]
+
+%D The presentation is supposed to cycle automatically.
+
+\setupinteractionscreen
+ [option=max,
+ delay=5]
+
+\setuppagetransitions
+
+%D We will use random positioning of objects.
+
+\setupsystem
+ [random=medium]
+
+%D We have two kind of graphics: the page background and
+%D the shape around the textual elements.
+
+\defineoverlay [shape] [\uniqueMPgraphic{shape}]
+\defineoverlay [page] [\reuseMPgraphic{page}]
+
+\startreusableMPgraphic{page}
+ StartPage ;
+ filldraw Page withcolor \MPcolor{PageColor} ;
+ pickup pencircle scaled .375cm ;
+ for i=1 upto 200 :
+ drawdot center Page randomized (PaperWidth,PaperHeight)
+ withcolor \MPcolor {DotColor} ;
+ endfor ;
+ StopPage ;
+\stopreusableMPgraphic
+
+\startuniqueMPgraphic{shape}
+ path p ;
+ p := unitsquare xyscaled(OverlayWidth,OverlayHeight) superellipsed .90 ;
+ draw p withpen pencircle scaled .50cm withcolor \MPcolor{PageColor} ;
+ fill p withcolor OverlayColor ;
+ draw p withpen pencircle scaled .25cm withcolor OverlayLineColor ;
+ currentpicture := currentpicture xysized(OverlayWidth,OverlayHeight) ;
+\stopuniqueMPgraphic
+
+%D The resizing at the end is needed to get a nice inverted
+%D hyperlink when we click on it in a browser.
+
+%D Behind the page we put a forward button:
+
+\defineoverlay [forward] [\overlaybutton{forward}]
+
+%D The content will be managed by means of two layers.
+
+\definelayer [main] \defineoverlay [main] [\composedlayer{main}]
+\definelayer [temp] \defineoverlay [temp] [\composedlayer{temp}]
+
+%D The first layer will hold everything to be shown, while
+%D the second one gets the data we currently focus on.
+%D Therefore the first layer will not be flushed each page.
+
+\setuplayer
+ [main]
+ [state=repeat]
+
+%D All the overlays go onto the page area.
+
+\setupbackgrounds
+ [page]
+ [background={page,forward,main,temp}]
+
+%D We have to collect all data before we typeset it. Each
+%D element will be typeset dim and bright. The dim
+%D alternatives will be collected on the main layer, but each
+%D bring one goes onto a box stack.
+
+\initializeboxstack{Summary}
+\initializeboxstack{Subtext}
+
+%D The macros that take care of all this manipulations look
+%D more complicated than they actually are. We use a
+%D scratchbox to collect and inspect data. Also, because we
+%D typeset each element twice, we need to make sure that we use
+%D the same random seed for both.
+
+\doglobal\newcounter\CurrentSummary
+
+\def\StartSummary% bottom bot-title top-title
+ {\dodoublegroupempty\doStartSummary}
+
+\def\doStartSummary#1#2%
+ {\doglobal\increment\CurrentSummary
+ \setbox\scratchbox=\hbox{\strut#1}
+ \getrandomseed\RandomSeed
+ \setlayer[main]
+ {\RandomSubtextBox{DoneColor}{BotColor}{BotColor}}
+ \setrandomseed\RandomSeed
+ \savebox{Subtext}{\CurrentSummary}
+ {\RandomSubtextBox{TextColor}{BotColor}{black}}
+ \setbox\scratchbox=\hbox \bgroup
+ \setbox\scratchbox=\hbox{\bfb\setstrut\strut\quad#2\quad}%
+ \SetAcceptableWidth
+ \framed [offset=0pt,width=fit,frame=off,align=middle,strut=no]
+ \bgroup \setupwhitespace[big]
+ \doifsomething{#2}{\noindent\box\scratchbox\blank}}
+
+\def\StopSummary
+ {\egroup \egroup
+ \getrandomseed\RandomSeed
+ \setlayer[main]
+ {\RandomSummaryBox{DoneColor}{TopColor}{TopColor}}
+ \setrandomseed\RandomSeed
+ \savebox{Summary}{\CurrentSummary}
+ {\RandomSummaryBox{TextColor}{TopColor}{black}}}
+
+%D A \type {\doStartSummary#1#2#3\StopSummary} could have been
+%D used too but this one is less sensitive for catcode changes
+%D (not that we expect problems like this in this kind of
+%D application).
+
+%D The width is either derived from the width ot the title or
+%D at random. The final width of the box is detemined by the
+%D content.
+
+\def\SetAcceptableWidth
+ {\scratchdimen=.5\makeupwidth
+ \ifdim\wd\scratchbox>.5\makeupwidth
+ \getrandomdimen\hsize{\wd\scratchbox}{.8\makeupwidth}%
+ \else
+ \getrandomdimen\hsize{.5\makeupwidth}{.7\makeupwidth}%
+ \fi}
+
+%D The subtext box goes at the bottom, somewhere in the right
+%D corner.
+
+\def\RandomSubtextBox#1#2#3%
+ {\vbox to \makeupheight
+ {\vfill
+ \hbox to \makeupwidth
+ {\hfill
+ \button
+ [offset=2ex,frame=off,background=shape,strut=no,
+ backgroundcolor=#1,framecolor=#2,foregroundcolor=#3]
+ {\copy\scratchbox}%
+ [previouspage]%
+ \getrandomdimen\scratchdimen{.5cm}{2.5cm}%
+ \hskip\scratchdimen}
+ \getrandomdimen\scratchdimen{.5cm}{1.5cm}
+ \vskip \scratchdimen}}
+
+%D The main text goes in the top half of the page, not to
+%D far from the center. The last \type {\vskip} makes sure
+%D that we don't clash with the subtexts.
+
+\definereference[thispage][page(\CurrentSummary)]
+
+\def\RandomSummaryBox#1#2#3%
+ {\vbox to \makeupheight
+ {\getrandomdimen\scratchdimen{.5cm}\makeupheight
+ \vskip 0pt plus \scratchdimen
+ \hbox to \makeupwidth
+ {\getrandomdimen\scratchdimen{.5cm}\makeupwidth
+ \hskip 0pt plus \scratchdimen
+ \button
+ [offset=3ex,frame=off,background=shape,strut=no,
+ backgroundcolor=#1,framecolor=#2,foregroundcolor=#3]
+ {\copy\scratchbox}%
+ [thispage]%
+ \getrandomdimen\scratchdimen{.5cm}\makeupwidth
+ \hskip 0pt plus \scratchdimen}
+ \getrandomdimen\scratchdimen{.5cm}\makeupheight
+ \vskip 0pt plus \scratchdimen
+ \vskip.2\makeupheight}}
+
+%D Because we conly collect data, we hav eto make sure that at
+%D some moment it is processed and flushed. The following loop
+%D does this.
+
+\def\BuildPage
+ {\dorecurse{\CurrentSummary}
+ {\startstandardmakeup
+ \setlayer[temp]{\foundbox{Summary}\recurselevel}
+ \setlayer[temp]{\foundbox{Subtext}\recurselevel}
+ \stopstandardmakeup}}
+
+%D We hook this macro into the \type {\stoptext} macro.
+
+\appendtoks \BuildPage \to \everystoptext
+
+%D We still need a title page.
+
+\def\TitlePage%
+ {\dodoublegroupempty\doTitlePage}
+
+\long\def\doTitlePage#1#2%
+ {\ifsecondargument
+ \MakeTitlePage{#1}{#2}
+ \else\iffirstargument
+ \MakeTitlePage{\currentdate}{#1}
+ \else
+ \MakeTitlePage{\currentdate}{Welcome}
+ \fi\fi}
+
+\def\MakeTitlePage#1#2%
+ {\StartSummary{#1}{#2}\StopSummary}
+
+%D For old times sake:
+
+\long\def\StartTopic#1\StopTopic{\StartSummary#1\StopSummary}
+
+\doifnotmode{demo}{\endinput}
+
+%D The demo text.
+
+\starttext
+
+\TitlePage{Indeed}{The Title Page}
+
+\StartSummary{Alpha}{Title}
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+\StopSummary
+
+\StartSummary{Beta and Gamma}{Another Title}
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+\StopSummary
+
+\StartSummary{Delta}{Some Title}
+ A simple and not too long text just to show the topic.
+\StopSummary
+
+\StartSummary{Epsilon}{What A Title}
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+\StopSummary
+
+\StartSummary{Zeta, Eta and Theta}{Eh, A Title}
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+\StopSummary
+
+\StartSummary{Omega}
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+ A simple and not too long text just to show the topic.
+\StopSummary
+
+\stoptext
diff --git a/tex/context/base/s-pre-23.tex b/tex/context/base/s-pre-23.tex
new file mode 100644
index 000000000..90ed18353
--- /dev/null
+++ b/tex/context/base/s-pre-23.tex
@@ -0,0 +1,109 @@
+%D \module
+%D [ file=s-pre-20,
+%D version=2000.08.07,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 20,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This style looks a lot like number 22. This time we don't
+%D cycle but build up the page. One can click on the text go
+%D to the page wanted. Clicking on the titl ebrings you to the
+%D previous page.
+
+\startmode [demo]
+ \disablemode[demo] \usemodule[pre-22] \enablemode[demo]
+\stopmode
+
+\startnotmode [demo]
+ \usemodule[pre-22]
+\stopnotmode
+
+%D We use a simple two||color scheme.
+
+\definecolor[DotColor][r=.5,g=.6,b=.7]
+\definecolor[TopColor][r=.7,g=.6,b=.5]
+\definecolor[BotColor][TopColor]
+
+%D We will not delay page building.
+
+\let\BuildPage\relax
+
+%D Instead, we will flush a page for each summary. The main
+%D layer is build up anyway, but we need to overlay the
+%D current summary.
+
+\let\normalStartSummary\StartSummary
+\let\normalStopSummary \StopSummary
+
+\def\StartSummary
+ {\startstandardmakeup
+ \normalStartSummary}
+
+\def\StopSummary
+ {\normalStopSummary
+ \setlayer[temp]{\foundbox{Summary}\CurrentSummary}
+ \setlayer[temp]{\foundbox{Subtext}\CurrentSummary}
+ \stopstandardmakeup}
+
+%D The title page is not added to the main layer (or
+%D actually, it is, but we erase the layer before it's
+%D used).
+
+\long\def\MakeTitlePage#1#2%
+ {\startstandardmakeup
+ \definereference[thispage][]
+ \switchtobodyfont[32pt]
+ \StartSummary{#1}{}#2\StopSummary
+ \resetlayer[main]
+ \setlayer[temp]{\foundbox{Summary}\CurrentSummary}
+ \setlayer[temp]{\foundbox{Subtext}\CurrentSummary}
+ \definereference[thispage][page(\CurrentSummary)]
+ \stopstandardmakeup}
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\TitlePage{August 2000}{Something Very Important}
+
+\StartSummary{Alpha}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopSummary
+
+\StartSummary{Beta and Gamma}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopSummary
+
+\StartSummary{Delta}
+ A simple and not too long text just to show the idea.
+\StopSummary
+
+\StartSummary{Epsilon}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopSummary
+
+\StartSummary{Zeta, Eta and Theta}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopSummary
+
+\StartSummary{Omega}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopSummary
+
+\stoptext
diff --git a/tex/context/base/s-pre-26.tex b/tex/context/base/s-pre-26.tex
new file mode 100644
index 000000000..a99516960
--- /dev/null
+++ b/tex/context/base/s-pre-26.tex
@@ -0,0 +1,255 @@
+%D \module
+%D [ file=s-pre-26,
+%D version=2001.02.18,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 26,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D modes: reverse
+
+%D This is a nice and simple style, written in februari
+%D 2001. It uses a square papersize, derived from \type {S4}.
+%D Because this style is meant to be used with Zapf
+%D Chancery, I dedicate this style to Volker Schaa, a fan of
+%D Zapf.
+
+\setuppapersize
+ [S44][S44]
+
+\startmode[asintended]
+ \definetypeface[zaphy][cg][calligraphy][chancery]
+ \setupbodyfont[zaphy,cg,12pt]
+\stopmode
+
+\startnotmode[asintended]
+ \setupbodyfont[13pt]
+\stopnotmode
+
+%D We use the whole page.
+
+\setuplayout
+ [backspace=0pt,
+ topspace=0pt,
+ header=0pt,
+ footer=0pt,
+ bottom=0pt,
+ width=middle,
+ height=middle]
+
+%D We will be very tolerant in alignment.
+
+\setuptolerance
+ [verytolerant,stretch]
+
+%D Of course use navigation, but we hide the in this case
+%D ugly reverse video hyper spot.
+
+\setupinteraction
+ [state=start,
+ color=white,
+ contrastcolor=white,
+ style=\underbar,
+ click=no]
+
+%D This style looks best in a dark room, full screen.
+
+\setupinteractionscreen
+ [option=max]
+
+%D We use colors and remap a couple of standard colors.
+
+\setupcolors
+ [state=start]
+
+\definecolor[white] [s=.8]
+\definecolor[red] [r=.7]
+\definecolor[green] [g=.7]
+\definecolor[blue] [b=.7]
+\definecolor[yellow][r=.7,g=.7]
+
+\definecolor [PageColor][black]
+
+%D These colors will cyclic be assigned to \type
+%D {TextColor}.
+
+\definecolor [TextColor 0][white]
+\definecolor [TextColor 1][red]
+\definecolor [TextColor 2][green]
+\definecolor [TextColor 3][blue]
+\definecolor [TextColor 4][yellow]
+
+\definecolor [TextColor] [TextColor 0]
+
+%D We will collect everything in a layer.
+
+\definelayer
+ [main]
+ [state=repeat]
+
+%D We have quite some overlays.
+
+\defineoverlay [page] [\reuseMPgraphic{page}]
+\defineoverlay [text] [\useMPgraphic{text}]
+\defineoverlay [next] [\overlaybutton{nextpage}]
+\defineoverlay [prev] [\overlaybutton{previouspage}]
+\defineoverlay [main] [\composedlayer{main}]
+
+%D These end up as paper, page and text backgrounds. We need
+%D to locate the foreground, otherwise hyperlinks will not
+%D work.
+
+\setupbackgrounds % otherwise in acrobat 5 rounding error
+ [paper] % and one pixel white line
+ [backgroundcolor=Pagecolor,
+ background=page]
+
+\setupbackgrounds
+ [page]
+ [background={page,prev,foreground,main}]
+
+\setupbackgrounds
+ [text]
+ [background=next,
+ backgroundoffset=-10pt]
+
+%D This means that clicking on the center brings you to the
+%D next page, while clicking on teh page frame brings you one
+%D page back.
+
+%D As usual, the graphics are handled by \METAPOST:
+
+\startuseMPgraphic{text}
+ path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ;
+ color c ; c := (.7+uniformdeviate.3)*\MPcolor{TextColor} ;
+ p := p enlarged -1.25pt ;
+ filldraw p withcolor c ;
+ draw p withpen pencircle scaled 2.5pt withcolor .75c ;
+\stopuseMPgraphic
+
+\startreusableMPgraphic{page}
+ path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ;
+ color c ; c := \MPcolor{PageColor} ;
+ filldraw p enlarged 5pt withcolor c ; % bleeding
+\stopreusableMPgraphic
+
+%D The text is typeset in a framed text. We cycle trough the
+%D colors by means of a counter. This counter also determines
+%D the positioning on the main layer. The width is slightly
+%D random.
+
+\newcounter\KindOfTopic % and cycle through corners
+\newdimen \TopicWidth % with randomized widths
+
+\defineframedtext
+ [TopicText]
+ [frame=off,
+ offset=10pt,
+ style=bold,
+ width=\TopicWidth,
+ background=text,
+ before=,
+ after=,
+ align=normal]
+
+\def\BeforeTopic
+ {\ifcase\KindOfTopic\relax
+ \TopicWidth=.7\textwidth
+ \definecolor[CharColor][black]
+ \else
+ \getrandomdimen\TopicWidth{.55\textwidth}{.7\textwidth}
+ \definecolor[CharColor][white]
+ \fi
+ \doifmode{reverse}
+ {\setupframedtexts[TopicText][foregroundcolor=CharColor]}
+ \definecolor[TextColor][TextColor \KindOfTopic]
+ \ifcase\KindOfTopic\relax
+ \setuplayer[main][x=.5\textwidth,y=.5\textheight,location=c] \or
+ \setuplayer[main][x=0pt, y=0pt, location=rb] \or
+ \setuplayer[main][x=\textwidth, y=0pt, location=lb] \or
+ \setuplayer[main][x=\textwidth, y=\textheight, location=lt] \or
+ \setuplayer[main][x=0pt, y=\textheight, location=rt] \fi}
+
+\def\AfterTopic
+ {\ifnum\KindOfTopic=4
+ \gdef\KindOfTopic{1}
+ \else
+ \doglobal\increment\KindOfTopic
+ \fi}
+
+\def\StartTopic
+ {\BeforeTopic
+ \startstandardmakeup
+ \setlayer[main] \bgroup \startTopicText[none]
+ }%\setupwhitespace[big]} % generates an empty line
+
+\def\StopTopic
+ {\stopTopicText \egroup
+ \stopstandardmakeup
+ \AfterTopic}
+
+%D The title and colofon page are centered on the page.
+
+\def\StartNopic
+ {\doglobal\newcounter\KindOfTopic % centered at the page
+ \StartTopic
+ \bfd\setupinterlinespace
+ \setupinteraction[color=,contrastcolor=]%
+ \def\\{\blank\bfb\setupinterlinespace\def\\{\blank}}%
+ \raggedcenter\ignorespaces}
+
+\def\StopNopic
+ {\StopTopic}
+
+\let\StartTitlePage\StartNopic \let\StartColofonPage\StartNopic
+\let\StopTitlePage \StopNopic \let\StopColofonPage \StopNopic
+
+\def\TitlePage #1{\StartTitlePage #1\StopTitlePage}
+\def\ColofonPage#1{\StartColofonPage#1\StopColofonPage}
+
+%D We provide a minimum of title commands.
+
+\definehead
+ [Title]
+ [title]
+
+\definehead
+ [Subject]
+ [subject]
+
+\setuphead
+ [Title]
+ [style=\bfb,
+ page=,
+ before=,
+ after=\blank]
+
+\setuphead
+ [Subject]
+ [style=\bfa,
+ before=\blank,
+ after=\blank]
+
+\doifnotmode{demo}{\endinput}
+
+\def\Sample #1 {\input #1 \par \rightaligned{--- #1 ---}}
+
+\starttext
+
+\StartNopic The \ConTeXt\ Test Quotes \\ \currentdate \StopNopic
+
+\StartTopic \Sample tufte \StopTopic
+\StartTopic \Sample knuth \StopTopic
+\StartTopic \Sample zapf \StopTopic
+\StartTopic \Sample douglas \StopTopic
+\StartTopic \Sample stork \StopTopic
+\StartTopic \Sample materie \StopTopic
+
+\StartNopic There Will Be Some More \StopNopic
+
+\stoptext
diff --git a/tex/context/base/s-pre-27.tex b/tex/context/base/s-pre-27.tex
new file mode 100644
index 000000000..eda75e8f4
--- /dev/null
+++ b/tex/context/base/s-pre-27.tex
@@ -0,0 +1,181 @@
+%D \module
+%D [ file=s-pre-27,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 27,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setuppapersize
+ [S6][S6]
+
+% \setupbodyfont[ppl]
+
+\definetypeface[main][rm][casual][informal][default]
+\loadmapfile[original-micropress-informal.map]
+
+\setupbodyfont[main,10pt]
+
+\setuplayout
+ [footerdistance=20pt,
+ footer=40pt,
+ %footer=24pt,
+ %bottomdistance=10pt,
+ %bottom=12pt,
+ header=0pt,
+ backspace=20pt,
+ topspace=20pt,
+ width=middle,
+ height=fit]
+
+% \def\MainTitle#1{\setupfootertexts[\hfill#1]}
+% \def\SubTitle #1{\setupbottomtexts[\hfill#1]}
+%
+% \MainTitle{a dull talk held at \currentdate}
+% \SubTitle {welcome to whatever}
+%
+% \setupbottom
+% [style=\ssbf,
+% color=white]
+%
+% \setupfooter
+% [style=\ssbfb,
+% color=white]
+
+\setupfooter
+ [strut=no,
+ style=\bfb,
+ color=white]
+
+\setupinteraction
+ [state=start]
+
+\setupinteractionscreen
+ [option=max]
+
+\definecolor[white] [s=.8]
+\definecolor[red] [r=.7]
+\definecolor[green] [g=.7]
+\definecolor[blue] [b=.7]
+\definecolor[yellow][r=.7,g=.7]
+
+\setupcolors
+ [state=start]
+
+\defineoverlay [page] [\reuseMPgraphic{page}]
+\defineoverlay [text] [\useMPgraphic {text}]
+\defineoverlay [continue] [\overlaybutton {forward}]
+
+\setupbackgrounds
+ [page]
+ [background={page,continue}]
+
+\definecolor [PageColor] [red]
+\definecolor [TextColor] [yellow]
+
+\defineframedtext
+ [TopicPage]
+
+\defineframedtext
+ [TopicText]
+
+\setupframedtexts
+ [TopicPage]
+ [width=\textwidth,
+ height=\textheight,
+ offset=overlay]
+
+\setupframedtexts
+ [TopicText]
+ [offset=10pt,
+ style=bold, % hm
+ width=\TopicWidth,
+ background=text,
+ align=normal]
+
+\setupframedtexts
+ [TopicPage,TopicText]
+ [frame=off,
+ depthcorrection=off,
+ before=,
+ after=]
+
+\newbox \TopicBox
+\newcounter \KindOfTopic
+\newdimen \TopicWidth
+
+\def\KindOfTopic{1}
+
+\def\StartTopic
+ {\getrandomdimen\TopicWidth{.5\textwidth}{.7\textwidth}
+ \ifcase\KindOfTopic\or
+ \setupframedtexts [TopicPage] [align={right,high}] \or
+ \setupframedtexts [TopicPage] [align={left,high}] \or
+ \setupframedtexts [TopicPage] [align={left,low}] \or
+ \setupframedtexts [TopicPage] [align={right,low}] \fi
+ \setbox\scratchbox=\vbox \bgroup \dontcomplain
+ \noindent \startTopicPage [none]
+ \noindent \startTopicText [none]
+ \setuptolerance [verytolerant,stretch]}
+
+\def\StopTopic%
+ {\stopTopicText
+ \stopTopicPage
+ \egroup
+ \global\setbox\TopicBox=\vbox
+ {\startoverlay
+ {\box\TopicBox} {\box\scratchbox}
+ \stopoverlay}
+ \copy\TopicBox
+ \ifnum\KindOfTopic=4
+ \def\KindOfTopic{1}
+ \else
+ \increment\KindOfTopic
+ \fi
+ \page}
+
+\startuseMPgraphic{text}
+ path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ;
+ color c ; c := (.7+uniformdeviate.3)*\MPcolor{TextColor} ;
+ p := p enlarged -1.25pt ;
+ fill p withcolor c ;
+ draw p withpen pencircle scaled 2.5pt withcolor .75c ;
+\stopuseMPgraphic
+
+\startreusableMPgraphic{page}
+ path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ;
+ color c ; c := \MPcolor{PageColor} ;
+ fill p withcolor c ;
+ draw p withpen pencircle scaled 2.5pt withcolor c ;
+\stopreusableMPgraphic
+
+\def\StartNopic#1\StopNopic
+ {\setupfootertexts
+ [\vbox to \footerheight
+ {\vfill
+ \raggedleft
+ \def\\{\endgraf\tx\setstrut\strut}
+ \setstrut\strut\ignorespaces#1\unskip\endgraf\removedepth}]
+ \null \page}
+
+\def\TitlePage#1%
+ {\StartNopic#1\StopNopic}
+
+\setuphead[title] [style=\bfc,after=\blank]
+\setuphead[subject][style=\bfa,before=\blank]
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\TitlePage
+ {a dull talk held at \currentdate\\welcome to whatever}
+
+\dorecurse{10}{\StartTopic \input tufte \StopTopic}
+
+\stoptext
diff --git a/tex/context/base/s-pre-30.tex b/tex/context/base/s-pre-30.tex
new file mode 100644
index 000000000..2a3899c92
--- /dev/null
+++ b/tex/context/base/s-pre-30.tex
@@ -0,0 +1,258 @@
+%D \module
+%D [ file=s-pre-30,
+%D version=2006.04.25,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 30,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[streams]
+
+\setuppapersize
+ [S6] [S6]
+
+\setupbodyfont
+ [12pt,tt]
+
+\definemeasure[bleed][6pt]
+
+\definecolor[maincolor-3][r=.5,g=.2,b=.2]
+\definecolor[maincolor-1][r=.2,g=.5,b=.2]
+\definecolor[maincolor-2][r=.2,g=.2,b=.5]
+
+\definecolor[pagecolor] [s=.5]
+\definecolor[resultcolor][s=1,t=.85,a=1]
+\definecolor[maincolor] [maincolor-3]
+
+\definecolorgroup
+ [maingroup]
+ [.5:.2:.2,
+ .2:.5:.2,
+ .2:.2:.5]
+
+\definecolorgroup
+ [resultgroup]
+ [1:.85:.85,
+ .85:1:.85,
+ .85:.85:1]
+
+\def\CurrentColor{1}
+
+\definecolor[maincolor] [maingroup:\CurrentColor]
+\definecolor[resultcolor][resultgroup:\CurrentColor]
+
+\def\NextColor{\ifnum\CurrentColor=3 \def\CurrentColor{1}\else\doglobal\increment\CurrentColor\fi}
+
+\setuplayout
+ [backspace=\measure{bleed},
+ topspace=30pt,
+ bottomdistance=\measure{bleed},
+ bottom=\dimexpr30pt-\measure{bleed}\relax,
+ header=0pt,
+ footer=0pt,
+ topdistance=\measure{bleed},
+ top=\dimexpr30pt-\measure{bleed}\relax,
+ width=middle,
+ height=middle]
+
+\setuptop
+ [before=\vfill,
+ after=\vfill,
+ strut=yes]
+
+\setupbackgrounds
+ [text]
+ [backgroundoffset=\measure{bleed},
+ background=color,
+ backgroundcolor=maincolor]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=pagecolor]
+
+\setupcolors
+ [state=start,
+ textcolor=white]
+
+\setuphead
+ [chapter]
+ [style=\ttd]
+
+\setuphead
+ [section]
+ [style=\ttd]
+
+\defineproperty
+ [result]
+ [layer]
+ [state=stop]
+
+\definelayer
+ [result]
+
+\setuplayer
+ [result]
+ [width=\textwidth,
+ height=\textheight]
+
+\setupbackgrounds
+ [text]
+ [background={color,toggle,foreground,result}]
+
+\setupinteraction
+ [state=start,
+ click=no,
+ menu=on,
+ color=white,
+ contrastcolor=white,
+ closepageaction=HideLayer{result},
+ openpageaction=HideLayer{result}]
+
+% We add a dummy color switch so that each page has at least one
+% transparency; else acrobat will render the pages differently
+% bug in 6 and 7).
+
+\startinteractionmenu[bottom]
+% \color[resultcolor]{ }%
+ \hfill
+ \got [content] content \\
+ \got [previouspage] previous \\
+ \got [nextpage] next \\
+ \got [ToggleLayer{result}] result \\
+ \got [CloseDocument] close \\
+\stopinteractionmenu
+
+\setuphead
+ [section]
+ [placehead=no,
+ incrementnumber=list]
+
+\setuplist
+ [section]
+ [alternative=f]
+
+\defineoverlay
+ [toggle]
+ [\overlaybutton{ToggleLayer{result}}]
+
+\definestreamlayer
+ [resultstream]
+
+\startsetups streamlayer:resultstream:flush
+ \setlayer
+ [result]
+ [preset=middlebottom,
+ hoffset=\measure{bleed},
+% voffset=-\measure{bleed}]
+ voffset=\measure{bleed}]
+ {\startproperty[result]%
+% \framed
+% [offset=overlay,
+% frame=off,
+% background=color,
+% backgroundoffset=1\dimexpr\measure{bleed}\relax,
+% backgroundcolor=maincolor]
+ {\framed
+ [offset=overlay,
+ frame=off,
+ foregroundcolor=maincolor,
+ background=color,
+ backgroundoffset=1\dimexpr\measure{bleed}\relax,
+ backgroundcolor=resultcolor]
+ {\tightlayer[\currentstreamlayer]}}
+ \stopproperty}
+\stopsetups
+
+\startsetups show-definition
+ \subject{definition}
+ \typebuffer
+ \getbuffer
+ \page
+\stopsetups
+
+\startsetups show-result
+ \startstreamlayer[resultstream]
+ \subject{result}
+ \getbuffer
+ \stopstreamlayer
+ \placestreamlayer[resultstream]
+ \page
+\stopsetups
+
+\startsetups show-usage
+ \subject{usage}
+ \typebuffer
+ \startstreamlayer[resultstream]
+ \subject{result}
+ \getbuffer
+ \stopstreamlayer
+ \placestreamlayer[resultstream]
+ \page
+\stopsetups
+
+\startsetups show-usage-lines
+ \subject{usage}
+ \typebuffer
+ \startstreamlayer[resultstream]
+ \subject{result}
+ \startlines
+ \getbuffer
+ \stoplines
+ \stopstreamlayer
+ \placestreamlayer[resultstream]
+ \page
+\stopsetups
+
+\startsetups show-contents
+ \startcolumns[n=3]
+ \placelist[section][criterium=text]
+ \stopcolumns
+ \pagereference[content]
+ \page
+ \NextColor
+\stopsetups
+
+\def\TitlePage#1%
+ {\title{#1}
+ \setups{show-contents}}
+
+\def\StartSample#1%
+ {\starttext
+ \page
+ \section{#1}
+ \setuptoptexts[][\processedfile\enspace:\enspace\lowercase{#1}]}
+
+\def\StopSample
+ {\page
+ \setuptoptexts[][]
+ \stoptext
+ \NextColor}
+
+\endinput
+
+\usemodule[pre-30]
+
+% \TitlePage{Howling to the moon}
+
+\StartSample{Basics}
+
+\startbuffer
+\lua{a = 1.5 ; b = 1.8 ; c = a*b ; tex.print(c) ;}
+
+\startlua
+ a = 1
+ b = 2
+ c = a*b
+ tex.print(c)
+\stoplua
+\stopbuffer
+
+\setups{show-usage}
+
+\StopSample
diff --git a/tex/context/base/s-pre-50.tex b/tex/context/base/s-pre-50.tex
new file mode 100644
index 000000000..782f6aea1
--- /dev/null
+++ b/tex/context/base/s-pre-50.tex
@@ -0,0 +1,101 @@
+%D \module
+%D [ file=s-pre-50,
+%D version=2003.01.26,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 50,
+%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 When my mailbox started to overflow with messages about
+%D problems with the presentation step mechanism, I looked up
+%D old presentaton, hacked a bit and cooked up an alternative
+%D that is less dependent on \PDF\ trickery.
+%D
+%D Consider it a cheap trick and prelude to a couple of new
+%D presentation styles. (At the time of writing this, I
+%D still have some 10 of those styles to clean up and
+%D document.) You can give it a try:
+%D
+%D \starttyping
+%D texexec --pdf --mode=demo s-pre-50
+%D \stoptyping
+
+% Basic definitions.
+
+\defineframedtext
+ [horizontal]
+ [width=\textwidth,
+ frame=off,
+ strut=no,
+ height=fit,
+ align={right,lohi},
+ before=,
+ after=]
+
+\definecollector
+ [contribution]
+ [state=repeat,
+ corner={left,bottom},
+ location={right,bottom}]
+
+%D An example of tuning:
+
+\startmode[demo]
+
+ \setupcollector
+ [contribution]
+ [voffset=-.25\bodyfontsize]
+
+ \setupframedtexts
+ [horizontal]
+ [background=color,
+ backgroundcolor=darkgray,
+ foregroundcolor=white]
+
+\stopmode
+
+%D Structure and trick.
+
+\def\StartSteps
+ {\checkutilities}
+
+\def\StopSteps
+ {\resetcollector[contribution]}
+
+\long\def\StartStep#1\StopStep
+ {\setcollector
+ [contribution]
+ {\starthorizontal[none]#1\stophorizontal}
+ \flushcollector[contribution]
+ \page}
+
+%D Trick. Nowadays we can use streams.
+
+\installoutput\FlushStep
+ {\StartStep\unvbox\normalpagebox\StopStep}
+
+%D Demo.
+
+\doifnotmode{demo}{\endinput}
+
+\setupcolors[state=start] \setuppapersize[S6][S6] \setuplayout[middle]
+
+\starttext
+
+\StartSteps
+
+ \title[whow]{How Much?} \FlushStep
+ \item More \FlushStep
+ \item And More \FlushStep
+ \item And Even More \FlushStep
+
+ \StartStep And So On \StopStep
+
+\StopSteps
+
+\stoptext
diff --git a/tex/context/base/s-pre-60.tex b/tex/context/base/s-pre-60.tex
new file mode 100644
index 000000000..f12b98b06
--- /dev/null
+++ b/tex/context/base/s-pre-60.tex
@@ -0,0 +1,159 @@
+%D \module
+%D [ file=s-pre-60,
+%D version=2004.03.15,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 60,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startmode[paper,print]
+ \let\StartSteps\relax
+ \let\StopSteps \relax
+ \let\FlushStep \relax
+ \let\ResetStep \relax
+ \let\StartBusy\relax
+ \let\StopBusy \relax
+ \endinput
+\stopmode
+
+\newcounter\StepCounter
+\newcounter\StepMaximum
+
+\useJSscripts[stp]
+
+\startsetups[set-stepper]
+
+ \ifnum\getvariable{stepper}{nofsteps}>\StepMaximum
+
+ \dostepwiserecurse {\numexpr(\StepMaximum+1)} {\getvariable{stepper}{nofsteps}} {1}
+ {\doifnotmode{nosteps,nostep}
+ {\expanded{\defineproperty[step:\recurselevel][layer][state=stop,global=yes]}}}
+
+ \xdef\StepMaximum{\getvariable{stepper}{nofsteps}}
+
+ \fi
+
+\stopsetups
+
+\setvariables
+ [stepper]
+ [set=\setups{set-stepper},
+ nofsteps=50]
+
+\defineproperty[step:busy][layer][state=start,global=no]
+
+\definereference [SetupStepper] [JS(SetupStepper{step,\StepMaximum})]
+\definereference [ResetStepper] [JS(ResetStepper)]
+\definereference [CheckStepper] [JS(CheckStepper{\StepCounter})]
+\definereference [InvokeStepper] [JS(InvokeStepper)]
+
+\def\ResetStep {\doglobal\newcounter\StepCounter}
+\def\NextStep {\doglobal\increment \StepCounter}
+\def\PrevStep {\doglobal\decrement \StepCounter}
+
+% todo: roll back blank
+
+\def\StepLayer {step:\StepCounter}
+\def\NextStepLayer {step:\the\numexpr\StepCounter+1\relax}
+\def\FirstStepLayer{step:1}
+
+\startmode[mkiv]
+
+ \def\StartStep
+ {\startproperty[\StepLayer]%
+ \ignorespaces}
+
+ \def\StopStep
+ {\removeunwantedspaces
+ \stopproperty}
+
+\stopmode
+
+\startnotmode[mkiv]
+
+ \def\StartStep
+ {\ifvmode
+ \scratchskip\lastskip
+ \vskip-\scratchskip
+ \startproperty[\StepLayer]%
+ \vskip\scratchskip
+ \else
+ \startproperty[\StepLayer]%
+ \fi
+ \ignorespaces}
+
+ \def\StopStep
+ {\removeunwantedspaces
+ \stopproperty}
+
+\stopnotmode
+
+\def\StartSteps{\iftrialtypesetting\else\ResetStep\NextStep\StartStep\fi}
+\def\StopSteps {\iftrialtypesetting\else\StopStep \PrevStep \fi}
+\def\FlushStep {\iftrialtypesetting\else\StopStep \NextStep\StartStep\fi}
+
+\appendtoks
+ \ResetStep
+\to \everyaftershipout
+
+\def\StartBusy{\startproperty[step:busy]\ignorespaces}
+\def\StopBusy {\removeunwantedspaces\stopproperty}
+
+\setupinteraction
+ [%openaction=SetupStepper,
+ closeaction=ResetStepper,
+ openpageaction=CheckStepper,
+ closepageaction=ResetStepper]
+
+\defineoverlay[invoke][\overlaybutton{InvokeStepper}]
+
+\setupbackgrounds
+ [text]
+ [background=invoke]
+
+% bonus
+
+\useMPlibrary[nav]
+
+\definepalet
+ [navplus]
+ [attach=interactioncolor,
+ comment=interactioncolor]
+
+\setupcomment
+ [symbol={comment-normal,comment-down},
+ textlayer=\StepLayer,
+ option=buffer,
+ height=\textheight,
+ width=\textwidth,
+ margin=0pt]
+
+\setupattachments
+ [symbol={attach-normal,attach-down},
+ textlayer=\StepLayer]
+
+%D Handy:
+
+\def\StartLocalSteps{\ResetStep}
+\def\StopLocalSteps {}
+
+\def\StartLocalStep {\NextStep\StartStep}
+\def\StopLocalStep {\StopStep}
+
+%D used as (given some definitions):
+%D
+%D \starttyping
+%D \StartLocalSteps
+%D \startcombination[both]
+%D {\StartLocalStep\placestreamlayer[left]\StopLocalStep} {}
+%D {\StartLocalStep\placestreamlayer[right]\StopLocalStep} {}
+%D \stopcombination
+%D \StopLocalSteps
+%D \stoptyping
+
+\endinput
diff --git a/tex/context/base/s-pre-61.tex b/tex/context/base/s-pre-61.tex
new file mode 100644
index 000000000..fa52d158a
--- /dev/null
+++ b/tex/context/base/s-pre-61.tex
@@ -0,0 +1,273 @@
+%D \module
+%D [ file=s-pre-61,
+%D version=2004.03.15,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 61,
+%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 Optima
+
+\usemodule[pre-60]
+
+\doifmodeelse {mkiv} {
+ \usetypescriptfile[type-hgz]
+ \definetypeface[mainface][ss][sans][optima-nova][default]
+} {
+ \usetypescriptfile[type-ghz]
+ \definetypeface[mainface][ss][sans][optima-nova][default][encoding=\defaultencoding]
+}
+
+\setupbodyfont[mainface,ss,18pt]
+\setupinterlinespace[line=3.25ex]
+
+\setuppapersize
+ [S6][S6]
+
+% \setuppapersize
+% [SW][SW]
+
+\setuplayout
+ [topspace=10pt,
+ header=30pt,
+ headerdistance=20pt,
+ height=middle,
+ footerdistance=20pt,
+ footer=0pt,
+ bottomdistance=20pt,
+ bottom=20pt,
+ bottomspace=50pt,
+ backspace=30pt,
+ width=middle]
+
+\setupinteraction
+ [state=start,
+ click=off,
+ menu=on,
+ style=,
+ color=interactioncolor,
+ contrastcolor=interactioncolor]
+
+\setupinteractionscreen
+ [option=max]
+
+\setupinteractionmenu
+ [bottom]
+ [color=maincolor,
+ contrastcolor=maincolor,
+ style=\tfa, % acceptable
+ left=\hfill,
+ middle=,
+ right=,
+ height=\bottomheight,
+ width=2\bottomheight,
+ offset=overlay,
+ frame=off]
+
+\startinteractionmenu[bottom]
+ \but [firstpage] \symbol[firstpage] \\
+ \but [previouspage] \symbol[previouspage] \\
+ \but [InvokeStepper] \StartBusy\symbol[PauseRendering]\StopBusy \\
+ \but [nextpage] \symbol[nextpage] \\
+ \but [lastpage] \symbol[lastpage] \\
+ \but [CloseDocument] \symbol[CloseDocument] \\
+\stopinteractionmenu
+
+% maybe in colo-sjk : \setupcolor[sjk]
+
+\definecolor [dark] [s=.4]
+\definecolor [bright] [s=.9]
+
+\definecolor [red] [r=.4,g=.2,b=.2]
+\definecolor [green] [r=.2,g=.4,b=.2]
+\definecolor [blue] [r=.2,g=.2,b=.4]
+
+\definecolor [cyan] [r=.2,g=.4,b=.4]
+\definecolor [magenta][r=.4,g=.2,b=.4]
+\definecolor [yellow] [r=.4,g=.4,b=.2]
+
+\definecolor [pagecolor] [dark]
+\definecolor [maincolor] [bright]
+\definecolor [textcolor] [red]
+
+\definecolor [interactioncolor] [r=.8,g=.8,b=.6]
+
+\setupcolors
+ [state=start,
+ textcolor=maincolor]
+
+\setupbackgrounds
+ [page]
+ [background=page,
+ backgroundcolor=textcolor]
+
+\setupbackgrounds
+ [text]% [text]
+ [background={comments,text,invoke}]
+
+\definelayer
+ [text]
+ [width=\textwidth,
+ height=\textheight]
+
+\defineoverlay
+ [comments]
+ [{\setlayer[text][preset=middle]{\placecomments}}]
+
+\defineoverlay[page][\uniqueMPgraphic{page-\ifcase\realpageno\or one\else plus\fi}]
+
+\startuniqueMPgraphic{page-one}
+ StartPage ;
+ fill Page
+ enlarged 4pt
+ withcolor \MPcolor{pagecolor} ;
+ fill Field[Text][Text]
+ enlarged 10pt
+% topenlarged (HeaderHeight+HeaderDistance)
+ leftenlarged (BackSpace+4pt)
+ rightenlarged (CutSpace +4pt)
+ withcolor OverlayColor ;
+ StopPage ;
+\stopuniqueMPgraphic
+
+\startuniqueMPgraphic{page-plus}
+ StartPage ;
+ fill Page
+ enlarged 4pt
+ withcolor \MPcolor{pagecolor} ;
+ fill Field[Text][Text]
+ enlarged 10pt
+ leftenlarged (BackSpace+4pt)
+ rightenlarged (CutSpace+4pt)
+ withcolor OverlayColor ;
+ StopPage ;
+\stopuniqueMPgraphic
+
+% this needs to be sorted out !
+
+\appendtoks
+ \NormalizeFontHeight \HeadFont {\setstrut\strut\quad} {1.0\headerheight} {SansBold}
+ \NormalizeFontHeight \TitleFont {\setstrut\strut\quad} {2.0\headerheight} {SansBold}
+ \NormalizeFontHeight \SubTitleFont {\setstrut\strut\quad} {1.5\headerheight} {SansBold}
+ \NormalizeFontHeight \SubSubTitleFont {\setstrut\strut\quad} {1.0\headerheight} {SansBold}
+\to \everystarttext
+\appendtoks
+ \NormalizeFontHeight \HeadFont {\setstrut\strut\quad} {1.0\headerheight} {SansBold}
+ \NormalizeFontHeight \TitleFont {\setstrut\strut\quad} {2.0\headerheight} {SansBold}
+ \NormalizeFontHeight \SubTitleFont {\setstrut\strut\quad} {1.5\headerheight} {SansBold}
+ \NormalizeFontHeight \SubSubTitleFont {\setstrut\strut\quad} {1.0\headerheight} {SansBold}
+\to \everystoptext
+
+\setuphead
+ [chapter]
+ [placehead=empty,
+ after={\blank[medium]},
+ color=maincolor,
+ placenumber=no,
+ style=\HeadFont]
+
+\setupheadertexts
+ [\doiftextelse{\currentheadnumber}{\placeheadtext[Topic]}{\placeheadtext[Nopic]}]
+ []
+
+\setuppagenumbering
+ [location=]
+
+\definesymbol
+ [emdash]
+ [\emdash]
+
+\setupitemize
+ [each]
+ [loose,serried,joinedup,broad]
+ [symbol=emdash]
+
+\setupalign
+ [broad,right]
+
+\def\doTitlePage#1#2#3%
+ {\startstandardmakeup[headerstate=high]
+ \def\\{\def\\{\endgraf\quad\quad}\endgraf\quad\ignorespaces#2}%
+ #1\setstrut\setupinterlinespace\vfil#3\vfil\vfil
+ \stopstandardmakeup}
+
+\def\TitlePage {\doTitlePage\TitleFont\relax}
+\def\SubTitlePage{\doTitlePage\TitleFont\SubTitleFont}
+
+\definehead[Topic][chapter]
+\definehead[Nopic][title]
+
+\def\Topics#1%
+ {\Nopic[topics]{#1}
+ \startcolumns
+ \placelist[Topic]
+ \stopcolumns}
+
+\setuplist
+ [Topic]
+ [alternative=f,
+ color=maincolor,
+ contrastcolor=maincolor,
+ criterium=all]
+
+\defineoverlay[topics][\overlaybutton{topics}]
+
+\setupbackgrounds
+ [bottom] [text]
+ [background=topics]
+
+% \doifnotmode{demo}{\endinput}
+
+\starttext
+
+\TitlePage{Stepwise\\Refinement}
+
+\Topics{Topics}
+
+\Topic{Female Artists}
+
+\StartSteps
+
+\startitemize
+\item Tori Amos \FlushStep
+\item Kate Bush \FlushStep
+\item Heather Nova \FlushStep
+\item Alanis Morissette \FlushStep
+\item Suzanne Vega \FlushStep
+\stopitemize
+
+\StopSteps
+
+\Topic{Male Composers}
+
+\StartSteps
+
+\startitemize
+\item John Adams \FlushStep
+\item Steve Reich \FlushStep
+\item Louis Andriessen \FlushStep
+\item Olivier Messiaen \FlushStep
+\stopitemize
+
+\StopSteps
+
+\Topic{And Some More}
+
+\StartSteps
+
+\startitemize
+\item Mark Hollis \FlushStep
+\item Roger Waters \FlushStep
+\item David Gilmore \FlushStep
+\item Peter Gabriel \FlushStep
+\item Randy Newman \FlushStep
+\stopitemize
+
+\StopSteps
+
+\stoptext
diff --git a/tex/context/base/s-pre-62.tex b/tex/context/base/s-pre-62.tex
new file mode 100644
index 000000000..64bb3495b
--- /dev/null
+++ b/tex/context/base/s-pre-62.tex
@@ -0,0 +1,228 @@
+%D \module
+%D [ file=s-pre-62,
+%D version=2005.03.04,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 62,
+%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 Melior
+
+\usemodule[pre-60]
+
+\usetypescriptfile
+ [type-ghz]
+
+\definetypeface[mainface][rm][serif][melior] [default][encoding=texnansi]
+\definetypeface[mainface][tt][mono] [modern] [default][encoding=texnansi,rscale=1.05]
+\definetypeface[mainface][ss][serif][melior] [default][encoding=texnansi]
+\definetypeface[mainface][mm][math] [palatino][default][encoding=texnansi,rscale=0.95]
+
+\setupbodyfont
+ [mainface,14.4pt]
+
+\setuppapersize
+ [S6][S6]
+
+\setvariables[layout][dx=0,dy=1,nx=2,ny=2,step=64]
+
+\definemeasure[layoutwd][\dimexpr\paperwidth /\getvariable{layout}{step}\relax]
+\definemeasure[layoutht][\dimexpr\paperheight/\getvariable{layout}{step}\relax]
+
+\setuplayout
+ [ width=middle,
+ height=middle,
+ header=0pt,
+ footer=0pt,
+ margin=0pt,
+ backspace=5\measure{layoutwd},
+ topspace=5\measure{layoutht}]
+
+\setuplayout
+ [step]
+ [ backspace=\numexpr2+ \getvariable{layout}{dx}\relax\measure{layoutwd},
+ cutspace=\numexpr3+\getvariable{layout}{nx}-\getvariable{layout}{dx}\relax\measure{layoutwd},
+ topspace=\numexpr2+ \getvariable{layout}{dy}\relax\measure{layoutht},
+ bottomspace=\numexpr3+\getvariable{layout}{ny}-\getvariable{layout}{dy}\relax\measure{layoutht}]
+
+
+\definecolor[layout:left] [t=.5,a=1,b=1]
+\definecolor[layout:right] [t=.5,a=1,r=1]
+\definecolor[layout:top] [t=.5,a=1,g=1]
+\definecolor[layout:bottom][t=.5,a=1,y=1]
+\definecolor[layout:page] [s=.75]
+
+\definehspace[menu][\measure{layoutwd}]
+
+\setupinteraction
+ [state=start,
+ click=off,
+ style=,
+ color=interactioncolor,
+ contrastcolor=interactioncolor]
+
+\setupinteractionscreen
+ [option=max]
+
+\setupbuttons
+ [color=maincolor,
+ contrastcolor=maincolor,
+ style=\tf, % acceptable
+ height=2\measure{layoutht},
+ width=2\measure{layoutwd},
+ offset=overlay,
+ frame=off]
+
+\definecolor[interactioncolor][darkgray]
+\definecolor[maincolor] [lightgray]
+
+\setuptexttexts
+ []
+ [\vbox to \textheight{\vfill\hfill\setups{menu:content}}]
+
+\startsetups menu:content
+
+ \button{\symbol[firstpage]}[firstpage]
+ \hspace[menu]
+ \button{\symbol[previouspage]}[previouspage]
+ \hspace[menu]
+ \button{\StartBusy\symbol[PauseRendering]\StopBusy}[InvokeStepper]
+ \hspace[menu]
+ \button{\symbol[nextpage]}[nextpage]
+ \hspace[menu]
+ \button{\symbol[lastpage]}[lastpage]
+ \hspace[menu]
+ \button{\symbol[CloseDocument]}[CloseDocument]
+
+\stopsetups
+
+\startuseMPgraphic{page}{step}
+ StartPage ;
+ numeric dx, dy ; dx := PaperWidth/\MPvar{step} ; dy := PaperHeight/\MPvar{step} ;
+ fill Page withcolor .5white ;
+ fill
+ ulcorner Page -- urcorner Page --
+ urcorner Page shifted (0,-TopSpace+dy) -- ulcorner Page shifted (0,-TopSpace+dy) -- cycle
+ withcolor \MPcolor{layout:top} ;
+ fill
+ llcorner Page -- lrcorner Page --
+ lrcorner Page shifted (0,BottomSpace-dy) -- llcorner Page shifted (0,BottomSpace-dy) -- cycle
+ withcolor \MPcolor{layout:bottom} ;
+ fill
+ ulcorner Page -- llcorner Page --
+ llcorner Page shifted (BackSpace-dx,0) -- ulcorner Page shifted (BackSpace-dx,0) -- cycle
+ withcolor \MPcolor{layout:left} ;
+ fill
+ urcorner Page -- lrcorner Page --
+ lrcorner Page shifted (-CutSpace+dx,0) -- urcorner Page shifted (-CutSpace+dx,0) -- cycle
+ withcolor \MPcolor{layout:right} ;
+ fill Field[Text][Text] enlarged (dx,dy) withcolor white ;
+ fill Field[Text][Text] enlarged (dx,dy) withcolor \MPcolor{layout:page} ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay[page][\useMPgraphic{page}{step=\getvariable{layout}{step}}]
+
+\setupbackgrounds
+ [page]
+ [background=page]
+
+\setupcolors
+ [state=start]
+
+\startsetups nextstep
+ % pagebreak handlers are grouped, so we need to set global
+ \ifnum\getvariable{layout}{dx}=\getvariable{layout}{nx}\relax
+ \ifnum\getvariable{layout}{dy}=\getvariable{layout}{ny}\relax
+ \setxvariables[layout][dy=1]
+ \else
+ \setxvariables[layout][dy=\the\numexpr\getvariable{layout}{dy}+1\relax]
+ \fi
+ \setxvariables[layout][dx=1]
+ \else
+ \setxvariables[layout][dx=\the\numexpr\getvariable{layout}{dx}+1\relax]
+ \fi
+ % global anyway
+ \setuplayout[step]
+\stopsetups
+
+\definefontsynonym[MainTitleFont][SerifBold]
+
+\definefont[ChapterTitleFont][MainTitleFont sa 2]
+
+\appendtoks
+ \NormalizeFontHeight \TitleFont {\setstrut\strut\quad} {4\lineheight} {MainTitleFont}
+ \NormalizeFontHeight \SubTitleFont {\setstrut\strut\quad} {3\lineheight} {MainTitleFont}
+ \NormalizeFontHeight \ChapterNumberFont {XVI} {4\lineheight} {MainTitleFont}
+\to \everystarttext
+
+\setupsection
+ [section-2]
+ [bodypartconversion=Romannumerals]
+
+\installpagebreakhandler {step} {\setups{nextstep}}
+
+\definepagebreak[chapter][yes,step]
+
+\setuphead
+ [chapter]
+ [page=chapter,
+ command=\MyChapterCommand]
+
+\definehead[Topic][chapter]
+\definehead[Nopic][title]
+
+\setuphead[chapter,Topic,Nopic]
+ [numberstyle=\ChapterNumberFont,
+ textstyle=\ChapterTitleFont,
+ numbercolor=lightgray,
+ textcolor=darkgray]
+
+\def\MyChapterCommand#1#2%
+ {\hbox \bgroup % we need to nil the strut added by the headplacement
+ \setupframed[frame=off,lines=4,offset=overlay]%
+ \rlap{\hskip2\lineheight\framed{\setnostrut#1}}\framed{#2}%
+ \egroup}
+
+\setupitemize
+ [each]
+ [R,broad]
+ [stopper=,
+ color=lightgray]
+
+\def\doTitlePage#1#2#3%
+ {\startstandardmakeup[headerstate=high,textstate=stop]
+ \setupalign[middle]
+ \def\\{\def\\{\endgraf}\endgraf\vfil\ignorespaces#2}%
+ \startcolor[darkgray]
+ #1\setstrut\setupinterlinespace\vfil#3\vfil
+ \stopcolor
+ \stopstandardmakeup}
+
+\def\TitlePage {\doTitlePage\TitleFont\relax}
+\def\SubTitlePage{\doTitlePage\TitleFont\SubTitleFont}
+
+\doifnotmode{demo} {\endinput}
+
+\starttext
+
+\StartTitlePage
+bla\\bla bla\\bla
+\StopTitlePage
+
+\StartRemark {Bla Bla}
+ Bla Bla Bla. \FlushStep
+ Bla Bla Bla. \FlushStep
+\StopRemark
+
+\StartRemark {Bla Bla}
+ Bla Bla Bla. \FlushStep
+ Bla Bla Bla. \FlushStep
+\StopRemark
+
+\stoptext
diff --git a/tex/context/base/s-pre-63.tex b/tex/context/base/s-pre-63.tex
new file mode 100644
index 000000000..76de8b991
--- /dev/null
+++ b/tex/context/base/s-pre-63.tex
@@ -0,0 +1,73 @@
+%D \module
+%D [ file=s-pre-63,
+%D version=2006.05.11,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 63,
+%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.
+
+\usemodule[pre-61,streams]
+
+\definemeasure[textgap] [\dimexpr24pt\relax]
+
+\definemeasure[leftwidth] [\dimexpr.25\textwidth-.5\measure{textgap}\relax]
+\definemeasure[rightwidth][\dimexpr.75\textwidth-.5\measure{textgap}\relax]
+
+\definestreamlayer[left] [width=\measure{leftwidth}]
+\definestreamlayer[right][width=\measure{rightwidth}]
+
+\setupbodyfont[12pt]
+
+\definefont[LeftFont][Normal sa 3]
+
+\setupheader[style=\tfc,before=\vss,after=\vss]
+
+\startsetups streamlayer:left:settings
+ \hsize\measure{leftwidth}
+ \LeftFont
+ \setupinterlinespace
+\stopsetups
+
+\startsetups streamlayer:right:settings
+ \hsize\measure{rightwidth}
+\stopsetups
+
+\definecombination[both][distance=\measure{textgap},location=top]
+
+\startsetups place:both
+ \startcombination[both]
+ {\StartLocalStep\placestreamlayer[left]\StopLocalStep} {}
+ {\StartLocalStep\placestreamlayer[right]\StopLocalStep} {}
+ \stopcombination
+\stopsetups
+
+\def\StartPage {\page \StartLocalSteps}
+\def\StopPage {\StopLocalSteps \page}
+
+\def\StartLeft {\startstreamlayer[left]}
+\def\StartRight{\startstreamlayer[right]}
+
+\def\StopLeft {\stopstreamlayer}
+\def\StopRight {\stopstreamlayer}
+
+\def\StartPair {}
+\def\StopPair {\setups[place:both]}
+
+\doifnotmode {demo} {\endinput}
+
+\setupbodyfont[8pt] \definefont[BigFont][Normal sa 4]
+
+\starttext
+
+\StartPage
+ \StartPair \StartLeft ZAPF \StopLeft \StartRight \input zapf \StopRight \StopPair
+ \StartPair \StartLeft DAVIS \StopLeft \StartRight \input davis \StopRight \StopPair
+ \StartPair \StartLeft WARD \StopLeft \StartRight \input ward \StopRight \StopPair
+\StopPage
+
+\stoptext
diff --git a/tex/context/base/s-pre-64.tex b/tex/context/base/s-pre-64.tex
new file mode 100644
index 000000000..b9dc10002
--- /dev/null
+++ b/tex/context/base/s-pre-64.tex
@@ -0,0 +1,203 @@
+%D \module
+%D [ file=s-pre-64,
+%D version=2006.05.11,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 64,
+%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.
+
+% To be documented, used in 2007
+
+\usemodule[s][pre-60]
+
+\newcounter\shapesynctag
+\newdimen\slantedshapedimen
+\newdimen\slantedshapestep
+\newdimen\slantedshapeleftskip
+\newdimen\slantedshapeoffset
+\newdimen\slantedshapeextra
+
+\positioningtrue
+
+\def\AdaptShape
+ {\doglobal\increment\shapesynctag
+ \getnoflines\textheight
+ \slantedshapestep\dimexpr\slantedshapeleftskip/\noflines\relax
+ \leftskip\slantedshapeleftskip
+ \scratchdimen\dimexpr\MPy{text:\MPp\shapesynctag}+\MPh{text:\MPp\shapesynctag}-\topskip-\MPy\shapesynctag\relax
+ \advance\scratchdimen\slantedshapeextra
+ \getnoflines\scratchdimen
+ \slantedshapedimen \noflines \slantedshapestep
+ \scratchtoks\emptytoks
+ \dorecurse{30}
+ {\appendetoks
+ \the\dimexpr-\slantedshapedimen+\slantedshapeoffset \relax\space
+ \the\dimexpr \hsize-2\slantedshapeoffset\relax\space
+ \to\scratchtoks
+ \advance\slantedshapedimen \slantedshapestep}%
+ \parshape 30 \the\scratchtoks
+ \strut\xypos\shapesynctag}
+
+\def\AdaptShapeX
+ {\doglobal\increment\shapesynctag
+ \getnoflines\textheight
+ \slantedshapestep\dimexpr\slantedshapeleftskip/\noflines\relax
+ \leftskip\slantedshapeleftskip
+ \scratchdimen\dimexpr\MPy{text:\MPp\shapesynctag}+\MPh{text:\MPp\shapesynctag}-\topskip-\MPy\shapesynctag\relax
+ \advance\scratchdimen\slantedshapeextra
+ \getnoflines\scratchdimen
+ \slantedshapedimen \noflines \slantedshapestep
+ \scratchtoks\emptytoks
+ \dorecurse{30}
+ {\appendetoks
+ \the\dimexpr-\slantedshapedimen+\slantedshapeoffset +5cm \relax\space
+ \the\dimexpr \hsize-2\slantedshapeoffset\relax\space
+ \to\scratchtoks
+ \advance\slantedshapedimen \slantedshapestep}%
+ \parshape 30 \the\scratchtoks
+ \strut\xypos\shapesynctag}
+
+\setuppapersize[S6][S6]
+
+\setupinteraction
+ [state=start,
+ click=no]
+
+\setupinteractionscreen
+ [option=max]
+
+\setuplayout
+ [backspace=12pt,
+ topspace=24pt,
+ height=middle,
+ width=middle,
+ header=0pt,
+ footer=0pt]
+
+\definecolor[maincolor][b=.5]
+\definecolor[somecolor][g=.5]
+\definecolor[morecolor][r=.5]
+
+\setupcolors
+ [textcolor=maincolor,
+ state=start]
+
+\setupbackgrounds
+ [text]% [text]
+ [background={base,text,invoke}]
+
+\definelayer
+ [text]
+ [width=\textwidth,
+ height=\textheight]
+
+\definelayer
+ [base]
+ [width=\textwidth,
+ height=\textheight]
+
+\definetype [epet] [style=,color=morecolor]
+\setuptype [style=,color=somecolor]
+
+\slantedshapeleftskip150pt
+\slantedshapeoffset12pt
+\slantedshapeextra10pt
+
+\startreusableMPgraphic{page}
+ StartPage ;
+ fill Page withcolor \MPcolor{maincolor} ;
+ path p ; p := Field[Text][Text] enlarged 6pt ;
+ p :=
+ llcorner p shifted (0,-12pt) --
+ lrcorner p shifted (-150pt,0) --
+ urcorner p shifted (0,12pt) --
+ ulcorner p shifted (150pt,0) --
+ cycle ;
+ fill p
+ withcolor .9white ;
+ StopPage ;
+\stopreusableMPgraphic
+
+\defineoverlay[page][\reuseMPgraphic{page}]
+\setupbackgrounds[page][background=page]
+
+\setupalign[flushleft]
+
+\def\StartItem
+ {\blank[line]
+ \begingroup
+ \EveryPar {\AdaptShape}} % beware: \ABBREV aan begin gaat fout
+
+\def\StopItem
+ {\endgraf
+ \endgroup
+ \blank[line]}
+
+\def\StartType
+ {\blank[halfline]
+ \begingroup
+ \EveryPar {\AdaptShape}
+ \dontleavehmode \quad}
+
+\def\StopType
+ {\endgraf
+ \endgroup
+ \blank[halfline]}
+
+\def\Title#1%
+ {\page
+ \setlayer
+ [text]
+ [preset=lefttop,
+ rotation=90]
+ {\color[white]{\scale[height=24pt]{\strut#1}}}}
+
+\def\SetBanner#1%
+ {\setuplayer[base][state=repeat]
+ \setlayer[base][preset=rightbottom]{\color[white]{\scale[height=9pt]{\strut#1}}}}
+
+\let\titlefont\relax
+
+\startmode[atpragma]
+ \definefontfeature[default][method=node,script=latn,language=dflt,liga=yes,onum=yes,kern=yes]
+ \definedfont[palatinosanscom-regular*default at 12pt] \setupinterlinespace[line=15pt]
+ \definefont[titlefont][palatinosanscom-bold*default at 48pt]
+\stopmode
+
+\endinput
+
+% \starttext
+
+% \SetBanner{tug 2007 san diego}
+
+% \Title {hans hagen}
+
+% \startstandardmakeup \titlefont \setupinterlinespace[line=3ex] \vfill
+
+% \StartItem \dontleavehmode \quad {\morecolor zapfino, a} \StopItem
+% \StartItem \dontleavehmode \quad {\morecolor torture test} \StopItem
+% \StartItem \dontleavehmode \quad {\morecolor for luatex} \StopItem
+
+% \vfill \stopstandardmakeup
+
+% \Title{loading fonts}
+
+% \StartSteps
+
+% \StartItem the \OPENTYPE\ font reader is borrowed from \FONTFORGE\ \FlushStep \StopItem
+% \StartItem once it was ready, we could look into such a font \FlushStep \StopItem
+% \StartItem it tooks while to figure out the format due to rather fuzzy specs \FlushStep \StopItem
+% \StartItem it took us even more time to find out that the loader was flawed \FlushStep \StopItem
+% \StartItem one reason was that fonts themselves may have bugs or be incomplete \FlushStep \StopItem
+% \StartItem then we changed to \FONTFORGE\ version 2 \FlushStep \StopItem
+% \StartItem this made the missing pieces surface in more complex feature handling \FlushStep \StopItem
+% \StartItem while implementing features the new table format was cleaned up \FlushStep \StopItem
+
+% \StopSteps
+
+% \stoptext
diff --git a/tex/context/base/s-pre-66.tex b/tex/context/base/s-pre-66.tex
new file mode 100644
index 000000000..916a7de66
--- /dev/null
+++ b/tex/context/base/s-pre-66.tex
@@ -0,0 +1,133 @@
+%D \module
+%D [ file=s-pre-66,
+%D version=2009.02.24,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 66,
+%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.
+
+%D Cambria (made in the aftermath of testing \OPENTYPE\ math).
+
+% \enablemode[paper]
+
+\usemodule[pre-60]
+\usemodule[abr-01]
+
+\definepapersize
+ [wide]
+ [width=960pt,
+ height=600pt]
+
+\setuppapersize
+ [wide]
+ [wide]
+
+\setuplayout
+ [topspace=20pt,
+ bottomspace=20pt,
+ header=0pt,
+ footer=0pt,
+ backspace=20pt,
+ height=middle,
+ rightmargin=0pt,
+ rightedge=\dimexpr220pt-40pt\relax,
+ rightedgedistance=40pt,
+ leftedge=0pt,
+ leftmargin=0pt,
+ cutspace=220pt,
+ width=\dimexpr960pt-40pt-220pt\relax]
+
+\definebodyfontenvironment
+ [20pt]
+
+\definefontfeature[default][default][mode=node,script=latn]
+
+\usetypescript
+ [cambria]
+
+\setupbodyfont
+ [cambria,20pt] \bf
+
+\setupwhitespace
+ [big]
+
+\setupcolors
+ [state=start]
+
+\definecolor[pagecolor][s=.25]
+\definecolor[edgecolor][b=.50,g=.75,r=.75]
+
+\setupinteraction
+ [state=start,
+ click=no,
+ color=,
+ contrastcolor=]
+
+\defineoverlay[pagegraphic][\reuseMPgraphic{pagegraphic}]
+
+\startuseMPgraphic{pagegraphic}
+ StartPage ;
+ fill Page enlarged 10pt withcolor \MPcolor{pagecolor} ;
+ fill Page enlarged 10pt leftenlarged (CutSpace - bbwidth(Page) - 10pt) withcolor \MPcolor{edgecolor} ;
+ % fill Field[Text][RightEdge] withcolor green ;
+ % fill Field[Text][Text] withcolor yellow ;
+ StopPage ;
+\stopuseMPgraphic
+
+\setupbackgrounds
+ [page]
+ [background=pagegraphic]
+
+\setupbackgrounds
+ [text]
+ [rightedge]
+ [background=edge]
+
+\definelayer
+ [edge]
+ [width=\rightedgewidth,
+ state=repeat]
+
+\setuphead
+ [chapter]
+ [style=\bfc,
+ color=edgecolor]
+
+\setupcolors
+ [textcolor=edgecolor]
+
+\newcounter\MyCounter
+
+\def\StartRemark#1%
+ {\doglobal\increment\MyCounter % hm, we could use the autoref (todo in cont-xp)
+ \title[topic:\MyCounter]{#1}
+ \setlayer[edge][preset=middletop,y=\thelayerheight{edge}]{\strut\color[pagecolor]{\bf\goto{#1}[topic:\MyCounter]}}
+ \StartSteps}
+
+\def\StopRemark
+ {\StopSteps
+ \page}
+
+\def\StartRemark#1%
+ {\doglobal\increment\MyCounter % hm, we could use the autoref (todo in cont-xp)
+ \title[topic:\MyCounter]{#1}
+ \StartSteps
+ \def\StopRemark
+ {\StopSteps
+ \page
+ \setlayer[edge][preset=middletop,y=\thelayerheight{edge}]{\strut\color[pagecolor]{\bf\goto{#1}[topic:\MyCounter]}}}}
+
+\def\StartTitlePage
+ {\startstandardmakeup[top=\vss,bottom=\vss\vss]
+ \definedfont[Bold sa 4]
+ \raggedcenter
+ \setupinterlinespace
+ \baselineskip=1\baselineskip plus 1fil minus 1fil\relax}
+
+\def\StopTitlePage
+ {\stopstandardmakeup}
diff --git a/tex/context/base/s-pre-67.tex b/tex/context/base/s-pre-67.tex
new file mode 100644
index 000000000..53c3260f5
--- /dev/null
+++ b/tex/context/base/s-pre-67.tex
@@ -0,0 +1,144 @@
+% todo: version of placement that also takes the sync node
+
+\usemodule[s][abr-02]
+\usemodule[s][pre-60]
+
+\definecolor[red:fullcolor] [r=1]
+\definecolor[red:lightcolor] [r=.5]
+\definecolor[red:darkcolor] [r=.375]
+
+\definecolor[green:fullcolor] [g=1]
+\definecolor[green:lightcolor] [g=.5]
+\definecolor[green:darkcolor] [g=.375]
+
+\definecolor[blue:fullcolor] [b=1]
+\definecolor[blue:lightcolor] [b=.5]
+\definecolor[blue:darkcolor] [b=.375]
+
+\definepalet[red-scheme] [fullcolor=red:fullcolor, lightcolor=red:lightcolor, darkcolor=red:darkcolor]
+\definepalet[green-scheme][fullcolor=green:fullcolor,lightcolor=green:lightcolor,darkcolor=green:darkcolor]
+\definepalet[blue-scheme] [fullcolor=blue:fullcolor, lightcolor=blue:lightcolor, darkcolor=blue:darkcolor]
+
+\setuppalet[red-scheme]
+
+\setupcolors
+ [textcolor=darkcolor]
+
+\setupinteraction
+ [color=darkcolor,
+ contrastcolor=darkcolor]
+
+\startuseMPgraphic{bullet}
+ path b, p ;
+ p := fullsquare scaled .5LineHeight ;
+ b := boundingbox p ;
+ p := p rotatedaround(center p, 45) ;
+ p := p shifted (0,-.125StrutDepth) ;
+ fill p withcolor \MPcolor{lightcolor} ;
+ setbounds currentpicture to b ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{bar}
+ path b, p ;
+ p := fullsquare scaled .25LineHeight ;
+ b := boundingbox p ;
+ p := p rotatedaround(center p, 45) ;
+ p := p shifted (0,+.25StrutDepth) ;
+ fill p withcolor \MPcolor{lightcolor} ;
+ setbounds currentpicture to b ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{page}
+ StartPage ;
+ fill Page enlarged 5mm withcolor .1[white,\MPcolor{fullcolor}] ;
+ interim linecap := butt ;
+ numeric h ; h := bbheight(Page)/4 ;
+ numeric w ; w := bbwidth(Page)/4 ;
+ h := h randomized(h) ;
+ w := w randomized(w) ;
+ draw
+ ulcorner Page shifted (0,-h) -- ulcorner Page -- ulcorner Page shifted (w,0)
+ withpen pensquare scaled .5cm
+ withcolor \MPcolor{lightcolor} ;
+ numeric h ; h := bbheight(Page)/4 ;
+ numeric w ; w := bbwidth(Page)/4 ;
+ h := h randomized(h) ;
+ w := w randomized(w) ;
+ draw
+ lrcorner Page shifted (0,h) -- lrcorner Page -- lrcorner Page shifted (-w,0)
+ withpen pensquare scaled .5cm
+ withcolor \MPcolor{lightcolor} ;
+ setbounds currentpicture to Page ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay[page][\useMPgraphic{page}]
+
+\definesymbol[1][\reuseMPgraphic{bullet}]
+\definesymbol[2][\reuseMPgraphic{bar}]
+
+\setupitemgroup[itemize][2][width=1em]
+
+\setupinteraction
+ [state=start,
+ click=no]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ header=0pt,
+ footer=0pt,
+ backspace=1cm,
+% topspace=1cm]
+ topspace=.5cm]
+
+\setupbackgrounds
+ [page]
+ [background=page]
+
+\setuphead
+ [chapter]
+ [command=\MyCommand,
+ before=,
+ after={\blank[disable]},
+ color=lightcolor,
+ style=\bfc]
+
+\definelayer
+ [title]
+ [width=\paperwidth,
+ height=\paperheight]
+
+\setupbackgrounds
+ [page]
+ [background={page,title}]
+
+\setupwhitespace
+ [big]
+
+\def\MyCommand#1#2%
+ {\setlayer[title][preset=rightbottom,x=.75cm,y=.5cm]{#2}}
+
+\def\titlepage#1#2%
+ {\startstandardmakeup
+ \definefont[LargeFont][Normal at 120pt]
+ \setlayerframed
+ [title]
+ [preset=lefttop,x=1cm,y=.25cm]
+ [align=flushleft,foregroundstyle=\LargeFont,offset=0pt,foregroundcolor=lightcolor,frame=off]
+ {#1}
+ \definefont[SmallFont][Normal at 60pt]
+ \setlayerframed
+ [title]
+ [preset=rightbottom,x=1cm,y=.5cm]
+ [align=flushright,foregroundstyle=\SmallFont,offset=0pt,foregroundcolor=lightcolor,frame=off]
+ {#2}
+ \stopstandardmakeup}
+
+\let\Title\title
+\let\TitlePage\titlepage
+
+\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..91075d54d
--- /dev/null
+++ b/tex/context/base/s-pre-71.tex
@@ -0,0 +1,210 @@
+% engine=luatex
+
+%D \module
+%D [ file=s-pre-71,
+%D version=2008.08.05,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 71,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D I might improve this module so consider it experimental.
+
+% \enablemode[numbers]
+% \enablemode[paper]
+
+\usemodule[pre-60,abr-02]
+
+\setupinteraction[state=start,click=off]
+
+\definepapersize[wide][width=900pt,height=600pt]
+
+\setuppapersize[wide][wide]
+
+\setuplayout[page]
+
+% \setupbodyfont[15pt]
+
+\usetypescriptfile[type-hgz]
+\usetypescript[palatino-informal]
+\setupbodyfont[palatino-informal,15pt]
+
+\setupsorting[logo][style=]
+
+\startnotmode[paper]
+ \setupbackgrounds[page][background=color,backgroundcolor=black]
+\stopnotmode
+
+\TransparencyHack
+
+\definelayer[page][width=\paperwidth,height=\paperheight]
+
+\definecolor[TopicColor-1][r=.3,g=.4,b=.5]
+\definecolor[TopicColor-2][r=.3,g=.5,b=.4]
+\definecolor[TopicColor-3][r=.4,g=.3,b=.5]
+\definecolor[TopicColor-4][r=.4,g=.5,b=.3]
+\definecolor[TopicColor-5][r=.5,g=.3,b=.4]
+\definecolor[TopicColor-6][r=.5,g=.4,b=.3]
+\definecolor[TopicColor-7][r=.35,g=.35,b=.6]
+\definecolor[TopicColor-8][r=.6,g=.35,b=.35]
+\definecolor[TopicColor-9][r=.35,g=.6,b=.35]
+
+\definecolor[TopicColor-0][t=.5,a=1,s=.5]
+\definecolor[TopicColor] [s=1]
+
+\setupcolors[state=start]
+\setupcolors[textcolor=TopicColor]
+
+\startluacode
+ local locations = {
+ 'lefttop',
+ 'middletop',
+ 'righttop',
+ 'middleleft',
+ 'middle',
+ 'middleright',
+ 'leftbottom',
+ 'middlebottom',
+ 'rightbottom',
+ }
+ local done, current, previous, n = table.tohash(locations,false), 0, 0, 0
+ function document.reset_locations()
+ done, current, previous, n = table.tohash(locations,false), 0, 0, 0
+ end
+ function document.next_location(loc)
+ previous = current
+ n = n + 1
+ loc = loc and loc ~= "" and tonumber(loc)
+ while true do
+ current = loc or math.random(1,#locations)
+ if not done[current] then
+ done[current] = true
+ break
+ end
+ end
+ end
+ function document.current_location()
+ tex.print(locations[current] or "")
+ end
+ function document.previous_location()
+ tex.print(locations[previous] or "")
+ end
+ function document.current_n()
+ tex.print(tostring(current))
+ end
+ function document.previous_n()
+ tex.print(tostring(previous))
+ end
+ function document.step()
+ tex.print(tostring(n))
+ end
+\stopluacode
+
+\def\StartTopics
+ {\startstandardmakeup
+ \ctxlua{document.reset_locations()}
+ \doifnotmode{paper}{\StartLocalSteps}}
+
+\def\StopTopics
+ {\doifnotmode{paper}{\StopLocalSteps}
+ \flushlayer[page]
+ \stopstandardmakeup}
+
+\def\StartTopic
+ {\dosingleempty\doStartTopic}
+
+\def\doStartTopic[#1]%
+ {\doifnotmode{paper}{\NextStep}
+ \ctxlua{document.next_location("#1")}
+ \startnotmode[paper]
+ \doifnothing{#1}
+ {\ifcase\ctxlua{document.previous_n()}\else
+ \setlayer
+ [page]
+ [preset=\ctxlua{document.previous_location()}]
+ \bgroup
+ \doifnotmode{paper}{\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]
+\definefont[TempFont] [SansBold at 12pt]
+
+\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/s-pre-93.tex b/tex/context/base/s-pre-93.tex
new file mode 100644
index 000000000..b67645806
--- /dev/null
+++ b/tex/context/base/s-pre-93.tex
@@ -0,0 +1,210 @@
+%D \module
+%D [ file=s-pre-20,
+%D version=2000.08.07,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 20,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setupbodyfont
+ [lbr,14.4pt]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [topspace=0cm,
+ backspace=0cm,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setupcolors
+ [state=start]
+
+\setupinteraction
+ [state=start,
+ click=no,
+ display=new,
+ color=LineColor,
+ contrastcolor=LineColor]
+
+\setupinteractionscreen
+ [option=max]
+
+\setupsystem
+ [random=big] % once per hour
+
+\startreusableMPgraphic{page}
+ StartPage ;
+ filldraw Page withcolor \MPcolor{PageColor} ;
+ pickup pencircle scaled (.25cm+uniformdeviate.25cm) ;
+ for i=1 upto 200 :
+ drawdot
+ (uniformdeviate PaperWidth,uniformdeviate PaperHeight)
+ withcolor \MPcolor {LineColor} ;
+ endfor ;
+ StopPage ;
+\stopreusableMPgraphic
+
+\startuseMPgraphic{idea}
+ StartPage ;
+ path p ;
+ p := unitsquare xyscaled(\MPw{idea:\realfolio},\MPh{idea:\realfolio}) superellipsed .90 ;
+ p := p shifted \MPxy{idea:\realfolio} ;
+ draw p withpen pencircle scaled .500cm withcolor \MPcolor{PageColor} ;
+ fill p withcolor \MPcolor{\overlaycolor} ;
+ draw p withpen pencircle scaled .250cm withcolor \MPcolor{LineColor} ;
+ p := unitsquare xyscaled(\MPw{title:\realfolio},\MPh{title:\realfolio}) superellipsed .90 ;
+ p := p shifted \MPxy{title:\realfolio} ;
+ draw p withpen pencircle scaled .250cm withcolor \MPcolor{PageColor} ;
+ fill p withcolor \MPcolor{\overlaycolor} ;
+ draw p withpen pencircle scaled .125cm withcolor \MPcolor{LineColor} ;
+ StopPage ;
+\stopuseMPgraphic
+
+\definecolor[PageColor][s=.50]
+\definecolor[TextColor][s=.80]
+\definecolor[DoneColor][s=.65]
+\definecolor[LineColor][r=.7,g=.6,b=.5]
+
+\defineoverlay [idea] [\useMPgraphic {idea}]
+\defineoverlay [page] [\reuseMPgraphic{page}]
+
+\setupbackgrounds
+ [page]
+ [background={page,forward}]
+
+\defineoverlay[forward][\overlaybutton{forward}]
+
+% alternatief: buffer en ander regime, zodat lokale kleuren
+% kunnen worden genilled. Pos gebruiken om te positioneren.
+
+\definereference[thispage][page(\realfolio)]
+
+\newbox\firstideabox \setbox\firstideabox =\null
+\newbox\secondideabox \setbox\secondideabox=\null
+\newbox\thirdideabox \setbox\thirdideabox =\null
+
+\def\StartTopic% bottom title, top title
+ {\dodoublegroupempty\doStartTopic}
+
+\def\doStartTopic#1#2% the positions end up at each page -)
+ {\setbox\firstideabox=
+ \vbox to \makeupheight
+ \bgroup
+ \getrandomdimen\scratchdimen{.5cm}\makeupheight
+ \vskip 0cm plus \scratchdimen
+ \hbox to \makeupwidth
+ \bgroup
+ \getrandomdimen\scratchdimen{.5cm}\makeupwidth
+ \hskip 0cm plus \scratchdimen
+ \setbox\scratchbox=\hbox\bgroup\hpos{idea:\realfolio}
+ \bgroup
+ \getrandomdimen\hsize{.5\makeupwidth}{.7\makeupwidth}%
+ \framed
+ [offset=3ex,align=middle,strut=no,frame=off,
+ before=,after=]
+ \bgroup
+ \setupwhitespace[big]%
+ \doifsomething{#2}{\Title{#2}}%
+ \def\StopTopic{%
+ \egroup
+ \egroup
+ \egroup
+ \gotobox{\box\scratchbox}[thispage]%
+ \getrandomdimen\scratchdimen{.5cm}\makeupwidth
+ \hskip 0cm plus \scratchdimen
+ \egroup
+ \getrandomdimen\scratchdimen{.5cm}\makeupheight
+ \vskip 0cm plus \scratchdimen
+ \hbox to \makeupwidth
+ \bgroup
+ \hfill
+ \hpos{title:\realfolio}
+ {\button[offset=1.5ex,frame=off]{#1}[backward]}%
+ \getrandomdimen\scratchdimen{.5cm}{2.5cm}%
+ \hskip \scratchdimen
+ \egroup
+ \getrandomdimen\scratchdimen{.5cm}{1.5cm}
+ \vskip \scratchdimen
+ \egroup
+ \setbox\secondideabox=\vbox
+ {\framed
+ [offset=overlay,frame=off,background=idea,backgroundcolor=TextColor]
+ {\copy\firstideabox}}
+ \setbox\firstideabox=\vbox
+ {\framed
+ [offset=overlay,frame=off,background=idea,backgroundcolor=DoneColor]
+ {\LineColor\copy\firstideabox}}
+ \startstandardmakeup
+ \startoverlay
+ {\copy\thirdideabox }
+ {\copy\secondideabox}
+ \stopoverlay
+ \stopstandardmakeup
+ \setbox\thirdideabox=\vbox
+ {\startoverlay
+ {\copy\thirdideabox }
+ {\copy\firstideabox}
+ \stopoverlay}}}
+
+\long\def\TitlePage#1#2%
+ {\bgroup
+ \switchtobodyfont[32pt]
+ \StartTopic{#1}#2\StopTopic
+ \egroup}
+
+\def\Title#1{\midaligned{\bfb#1}\blank}
+
+\doifnotmode{demo}{\endinput}
+
+% \usemodule[pre-super] % super ellipse as well as superpositioned
+
+\starttext
+
+\setupoutput[pdftex]
+
+\TitlePage{August 2000}{Something Very Important}
+
+\StartTopic{Alpha}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopTopic
+
+\StartTopic{Beta and Gamma}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopTopic
+
+\StartTopic{Delta}
+ A simple and not too long text just to show the idea.
+\StopTopic
+
+\StartTopic{Epsilon}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopTopic
+
+\StartTopic{Zeta, Eta and Theta}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopTopic
+
+\StartTopic{Omega}
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+ A simple and not too long text just to show the idea.
+\StopTopic
+
+\stoptext
diff --git a/tex/context/base/s-ptj-01.tex b/tex/context/base/s-ptj-01.tex
new file mode 100644
index 000000000..9990bf006
--- /dev/null
+++ b/tex/context/base/s-ptj-01.tex
@@ -0,0 +1,425 @@
+%D \module
+%D [ file=s-ptj-01,
+%D version=2009.12.18,
+%D title=\CONTEXT\ Style File,
+%D subtitle=PracTeX Journal Style,
+%D author=Aditya Mahajan,
+%D email=adityam at umich dot edu,
+%D date=\currentdate,
+%D copyright=2009 Aditya Mahajan]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%M % These macros are needed to compile the documentation.
+%M \def\PracTeX {Prac\kern-0.07em\TeX}
+%M \def\PRACTEX {\PracTeX}
+%M \def\pracjourn {The \PRACTEX\ Journal}
+%M \useurl[pracjourn][http://www.tug.org/pracjourn/][][\pracjourn]
+%M \useurl[texgyre] [http://www.gust.org.pl/projects/e-foundry/tex-gyre/]
+
+\writestatus {loading} {Context Module for the PracTeX Journal}
+
+%D This module is for producing acticles for \from[pracjourn]. It merely copies the
+%D layout of the the \LATEX\ class \filename{pracjourn.cls} available from
+%D \pracjourn\ website (\url[pracjourn]). This module has a filename synonym
+%D \filename{pracjourn}. So to use this module, you can write:
+%D \starttyping
+%D \usemodule[pracjourn]
+%D \stoptyping
+%D A sample document is given at the end of this file. The typeset sample can
+%D be obtained by
+%D \starttyping
+%D texmfstart texexec --mode=demo s-ptj-01.tex
+%D \stoptyping
+%D The documentation is written as comments. If you want to see a \PDF\ copy
+%D \starttyping
+%D texmfstart texexec --module s-ptj-01.tex
+%D \stoptyping
+
+\startmodule[pracjourn]
+
+\unprotect
+
+%D First let's setup the paper size and layout for \pracjourn. I am actually not
+%D sure about the \quote{official} layout requirement for \pracjourn\ and have
+%D reverse engineered the layout from the typeset \LATEX\ examples. If you
+%D feel that anything is wrong here, please let me know.
+
+\setuppapersize
+ [letter][letter]
+
+\setuplayout
+ [ width=middle,
+ height=middle,
+ location=middle,
+ topspace=1.25in,
+ bottomspace=1in,
+ backspace=1in,
+ cutspace=1in,
+ leftmargin=0.25in,
+ rightmargin=0.25in,
+ leftmargindistance=0in,
+ rightmargindistance=0in,
+ header=1in,
+ footer=.5in,
+ headerdistace=0in,
+ footerdistance=.25in,
+ ]
+
+%D Next we do the font setup. \pracjourn\ uses mathpazo for roman and math faces and
+%D uses latin modern for sans serif and monotype. For the main face, 12pt is
+%D used with a 15.5pt baseline skip. Font protrusion is enabled, but font
+%D expansion is not. We follow these conventions. \CONTEXT\ uses Pagella fonts
+%D from \TEX{gyre} project, so we use them instead.
+
+\usetypescript [serif,sans,mono] [hanging] [pure]
+\setupalign [hanging]
+\usetypescript [palatino][encoding=texnansi]
+\setupbodyfont [palatino,12pt]
+
+\definefont [titlefont] [Regular at 20pt]
+\definefont [authorfont] [Regular at 14pt]
+
+\setupbodyfontenvironment
+ [12pt]
+ [interlinespace=15.5pt,em=italic]
+
+\setupbodyfontenvironment
+ [11pt]
+ [interlinespace=13.6pt,em=italic]
+
+%D The variables for the article are stored in the \mono{pracjourn} namespace.
+%D To initialize these variables use
+%D \starttyping
+%D \setvariables
+%D [pracjourn]
+%D [ title=Tile of the Article,
+%D author=Name of Author,
+%D address=Write your Address,
+%D revision={d=14,m=11,y=2006},
+%D copyright=Whatever you want,
+%D ]
+%D \stoptyping
+%D \mono{title} and \mono{author} should always be entered (even though this
+%D module does not make them mandatory, it makes little sense to have an
+%D article without a title or author. Other variables are optional. If a
+%D revision is not written, current date will be used to show the revision.
+%D Other variables for the article are the author's email address and website
+%D url. Due to catcode problems, it is not always possible to reliably enter
+%D these using the variable mechanism. To enter these use \type|\useURL|
+%D \starttyping
+%D \useURL[email][mailto:address@whatever.com][][address@whatever.com]
+%D \useURL[website][link to your homepage]
+%D \stoptyping
+%D If either of these \URL's are not present, they will be silently ignored
+%D while generating the title.
+
+\setvariables [pracjourn] [ title=]
+\setvariables [pracjourn] [ author=]
+\setvariables [pracjourn] [ address=]
+\setvariables [pracjourn] [copyright=]
+\setvariables [pracjourn] [ revision=]
+
+%D We use the buffer \filename{abstract} for the abstract. So to enter the
+%D abstract, write
+%D \starttyping
+%D \startbuffer[abstract]
+%D Write your abstract
+%D \stopbuffer
+%D \stoptyping
+%D Right now, there is no mechanism to inhibt abstracts. In case someone
+%D requires it, such a mechanism is easy to implement.
+
+\startbuffer[abstract]
+\stopbuffer
+
+%D The actual title with the additional information is typset by calling
+%D \starttyping
+%D \setups{title}
+%D \stoptyping
+%D Remember that the \type|\setvariables[pracjourn][...]| step must be done
+%D before \type|\setups{title}|.
+
+\setuphead
+ [title]
+ [style=\titlefont,
+ after={\blank[big]}]
+
+%D Next we define internal frames to take care of the layout of the extra
+%D material in the title.
+
+\defineframed
+ [pracjourninfotitle]
+ [ frame=off,
+ strut=yes,
+ width=0.1\textwidth,
+ height=fit,
+ align=left,
+ location=hanging,
+ ]
+
+\defineframed
+ [pracjourninfodetails]
+ [ frame=off,
+ strut=yes,
+ width=0.85\textwidth,
+ height=fit,
+ align=normal,
+ location=hanging,
+ ]
+
+\newif\ifpracjourntitleskipdone
+
+\def\pracjourninfo#1#2%
+ {\pracjourntitleskipdonetrue
+ \hbox to \textwidth
+ \bgroup
+ \hfill \pracjourninfotitle{#1}
+ \hfill \pracjourninfodetails{#2}
+ \egroup\endgraf}
+
+%D Now we take care of the actual layout of the title. Most of this is
+%D heuristic, as I was trying to get the same visual effect as the
+%D \filename{pracjourn.cls} class. If something does not match, please let me
+%D know. The information is typeset as
+%D \starttyping
+%D \hfill <box of .1\textwidth> \hfill <box of .85\textwidth>
+%D \stoptyping
+%D at 11pt size. We also add the title and author information in the \PDF\
+%D metadata.
+
+\startsetups [title]
+% Place the tile and the author
+ \title{\getvariable{pracjourn}{title}}
+ \blank[medium]
+ \bgroup\authorfont\setupinterlinespace
+ \getvariable{pracjourn}{author} \endgraf\egroup
+ \blank[2*big]
+% Place the additional information
+ \bgroup\switchtobodyfont[11pt]
+ \setupindenting[no]
+ \doifurldefinedelse{email}
+ {\pracjourninfo{Email}{\tttf\from[email]\relax}}
+ \empty
+ \doifurldefinedelse{website}
+ {\pracjourninfo{Website}{\from[website]\relax}}
+ \empty
+ \doifsomething{\getvariable{pracjourn}{address}}
+ {\pracjourninfo{Address}{\getvariable{pracjourn}{address}}}
+ \ifpracjourntitleskipdone \blank[big] \fi
+ \pracjourninfo{Abstract}
+ {\setupindenting[yes]
+ \setupinterlinespace
+ \getbuffer[abstract]
+ \endgraf}
+ \egroup
+ \blank[big]
+ \setups{pracjourndate}
+ % Add information to pdfmetadata
+ \setupinteraction
+ [title={\getvariable{pracjourn}{title}},
+ author={\getvariable{pracjourn}{author}},
+ subtitle={The PracTeX Journal Article}]
+\stopsetups
+
+% If revision number is present, write it to \filename{_rev.tex}
+% FIXME: Do we need to ensure that the dates and month are two digits?
+\startrawsetups [pracjourndate]
+ \doifsomething{\getvariable{pracjourn}{revision}}
+ {\expanded{\setvariables[pracjourn:date][y=,m=,d=,\getvariable{pracjourn}{revision}]}
+ \immediate\openout \scratchwrite _rev.tex
+ \immediate\write \scratchwrite
+ {\getvariable{pracjourn:date}{y}/\getvariable{pracjourn:date}{m}/\getvariable{pracjourn:date}{d}}
+ \immediate\closeout\scratchwrite}
+\stoprawsetups
+
+%D Next we setup the header and footer for the first page. \pracjourn\ formats the
+%D header as
+%D \startlines
+%D The PracTeX Journal, year, No. number
+%D Article revision year/mm/dd
+%D \stoplines
+%D If a copyright notice is present, it is printed right aligned on the bottom
+%D of first page. Otherwise the footer on the first page is empty.
+
+\startsetups [pracjourntitleheader]
+ \framed[frame=off,width=\textwidth,align=normal,location=low]
+ {\small\setupinterlinespace
+ \doifelsenothing{\pracjournissue}
+ {For submission to \pracjourn}
+ {\pracjournissue}
+ \endgraf
+ \doifelsenothing{\getvariable{pracjourn}{revision}}
+ {Draft of \currentdate[year,/,mm,/,dd]}
+ {Article revision\space
+ \expanded{\date[\getvariable{pracjourn}{revision}][year,/,mm,/,dd]}}
+ \endgraf}
+\stopsetups
+
+\startsetups [pracjourntitlefooter]
+ \framed[frame=off,width=\textwidth,align=flushright,location=low]
+ {\small\setupinterlinespace \getvariable{pracjourn}{copyright}\endgraf}
+\stopsetups
+
+\definetext [pracjourntitleheader] [header] [\setups{pracjourntitleheader}][]
+\definetext [pracjourntitlefooter] [footer] [\setups{pracjourntitlefooter}]
+
+\setuphead
+ [title]
+ [header=pracjourntitleheader,
+ footer=pracjourntitlefooter]
+
+%D For rest of the pages, page number is printed on the middle of the footer.
+
+\setuppagenumbering [location={footer,middle}, style=mediaeval]
+
+%D Next we setup the formating for the sections. \pracjourn\ wants font sizes of
+%D 17pt, 14pt, and 12pt respectively for section, subsection, and
+%D subsubsection. By default, \tex{tfa} is 1.2, \tex{tfb} is 1.4, so the sizes
+%D come out close to what is required. The section number is typset in
+%D oldstyle fonts.
+
+\setuphead
+ [section,subject]
+ [ style=\tfb,
+ numberstyle=mediaeval,
+ before={\blank[2*big]},
+ after={\blank[big]},
+ ]
+
+\setuphead
+ [subsection,subsubject]
+ [ style=\tfa,
+ numberstyle=mediaeval,
+ before={\blank[big]},
+ after={\blank[medium]},
+ ]
+
+\setuphead
+ [subsubsection,subsubsubject]
+ [ style=\tf,
+ numberstyle=mediaeval,
+ before={\blank[medium]},
+ after={\blank},
+ ]
+
+%D Now we setup the captions. The captions head are set in normal font, and
+%D the caption number is set in oldstlyle.
+
+\setupcaptions [headstyle=normal,stopper=:,conversion=mediaeval]
+
+%D Footnotes are placed in a box with a width of 1.5em. The footnote numeral
+%D are set in oldstyle font.
+
+\setupnote
+ [footnote]
+ [margindistance=0em,
+ conversion=mediaeval,
+ command=\pracjournfootnote,
+ ]
+
+\setupnotedefinition [footnote] [location=left,hang=1]
+
+\def\pracjournfootnote#1{\hbox to 1.5em{#1.}}
+
+%D \pracjourn\ uses dash as the first level of itemize and text period as the second
+%D level. The third level is left unspecified.
+
+\definesymbol [1] [{\symbol[dash]}]
+\definesymbol [2] [\periodcentered]
+
+\setupitemize [each] [packed]
+\setupitemize [1] [packed,autointro] [margin=1em]
+
+%D We enable colors, interaction and bookmarks.
+
+\setupinteraction [state=start,color=darkred,style=normal]
+\setupurl [color=darkred]
+\setupcolors [state=start]
+\placebookmarks [section,subsection] [section]
+
+%D We setup medium indenting, whitespace and blanks.
+
+\setupindenting [medium,yes]
+\setupwhitespace [medium]
+\setupblank [medium]
+
+%D We define logos for \PRACTEX\ and \pracjourn. These definitions are copied from
+%D \filename{pracjourn.cls} and can be accessed by \type|\PracTeX|,
+%D \type|\PRACTEX| and \type|\pracjourn|.
+
+\def\PracTeX{Prac\kern-0.07em\TeX}
+\def\PRACTEX{\PracTeX}
+\def\pracjourn {The \PRACTEX\ Journal}
+
+%D \filename{pracjourn.cls} provides two macros \type|\ctanfile| and
+%D \type|\ctanloc|. I am not sure what is the advantage of these macors. If
+%D you want to use these macros, you can use the \type|\useURL| mechanism of
+%D \CONTEXT. For example
+%D \starttyping
+%D \useURL[pracjourn][http://ctan.org/get?fn=/macros/contrib/latex/pracjourn][][\mono{CTAN:macros/contrib/latex/pracjourn}]
+%D The \LATEX\ style files for \pracjourn\ is localed at \from[pracjourn]
+%D \stoptyping
+
+%D For the final version of the paper, the string \quotation{The PracTeX
+%D Journal year, No x} is written on the header. This only happens when the
+%D current directory contains a file \filename{_iss.tex} which contains string
+%D like \quotation{pracjourn 2006 No 04, 2006-11-15}. This step is usually taken in
+%D the final production of the article. If this file is absent, \quotation{For
+%D submission to the PracTeX Journal} is written instead. The next macros are
+%D used to parse this file.
+
+\let\pracjournissue\empty
+
+\def\parse@iss pracjourn #1 No #2, #3-#4-#5\@nil%
+ {\!!counta#2\relax
+ \edef\pracjournissue{\pracjourn, #1, No.\,\the\!!counta}}
+
+%D Read the \filename{_iss.tex} file, if present to determine the current
+%D issue.
+
+\immediate\openin\scratchread _iss.tex
+\ifeof\scratchread\else
+ \read \scratchread to \!!stringa
+ \expandafter\parse@iss\!!stringa\@nil
+\fi
+\immediate\closein\scratchread
+
+\protect
+
+\stopmodule
+
+\doifnotmode{demo}{\endinput}
+
+\usemodule[pracjourn]
+
+\setvariables
+ [pracjourn]
+ [ title=\PRACTEX\ Article in \CONTEXT,
+ author=Aditya Mahajan,
+ address={Ann Arbor,\\ Michigan, USA.},
+ revision={y=2006,m=11,d=14},
+ copyright={Copyright \copyright\ 2006 Aditya Mahajan.}
+ ]
+
+\useURL[website][http://www.eecs.umich.edu/~adityam]
+\useURL[email][mailto:adityam@umich.edu][][adityam@umich.edu]
+
+%D If any of the above information is not provided, the corresponding entry
+%D will not apprear in the title.
+
+\startbuffer[abstract]
+Write abstract here
+\stopbuffer
+
+\starttext \setups[title]
+
+\section{Introduction}
+
+Write your article \unknown
+
+\stoptext
+
+\endinput
diff --git a/tex/context/base/s-reg-01.tex b/tex/context/base/s-reg-01.tex
new file mode 100644
index 000000000..123b97384
--- /dev/null
+++ b/tex/context/base/s-reg-01.tex
@@ -0,0 +1,50 @@
+%D \module
+%D [ file=s-reg-01,
+%D version=2005.04.25,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Extra Regime 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.
+
+%D \macros
+%D {showregime}
+%D
+%D This code is moved from the kernel to here. (We could make it
+%D auto-loadable).
+
+\startluacode
+--[[ldx--
+<p>The following code is rather <l n='context'/> specific.</p>
+--ldx]]--
+
+function regimes.show(regime)
+ regime = regimes.synonyms[regime] or regime
+ local r = regimes.data[regime]
+ if r then
+ tex.sprint(tc,"\\starttabulate[|rT|T|rT|lT|lT|lT|]")
+ for k, v in ipairs(r) do
+ tex.sprint(tex.ctxcatcodes, string.format("\\NC %s\\NC\\getvalue{%s}\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR", k,
+ characters.contextname(v), characters.hexindex(v), characters.contextname(v),
+ characters.category(v), characters.description(v)))
+ end
+ tex.sprint(tex.ctxcatcodes,"\\stoptabulate")
+ else
+ tex.sprint(tex.ctxcatcodes,"unknown regime " .. regime)
+ end
+end
+\stopluacode
+
+\unprotect
+
+\def\showregime
+ {\dosingleempty\doshowregime}
+
+\def\doshowregime[#1]%
+ {\ctxlua{regimes.show("#1")}}
+
+\protect \endinput
diff --git a/tex/context/base/s-syn-01.tex b/tex/context/base/s-syn-01.tex
new file mode 100644
index 000000000..d797be61e
--- /dev/null
+++ b/tex/context/base/s-syn-01.tex
@@ -0,0 +1,54 @@
+%D \module
+%D [ file=s-syn-01,
+%D version=0000.00.00,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Preliminary Syntax Stuff,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is needed for the \METAFUN\ manual (this module was
+%D called \type {p-syn-01} on my machine).
+
+\unprotect
+
+\def\Indent #1{\ifvmode\noindent\hbox to 2em{\hss#1}\else#1\fi}
+\def\Sugar #1{\ifhmode\unskip\unskip\unskip\fi\kern.25em{#1}\kern.25em\ignorespaces}
+\def\Something#1{\Sugar{\mathematics{\langle\hbox{#1}\rangle}}}
+\def\Lbrace {\Sugar{\tttf\leftargument}}
+\def\Rbrace {\Sugar{\tttf\rightargument}}
+\def\Or {\Sugar{\mathematics{\vert}}}
+\def\Optional #1{\Sugar{\mathematics{[\hbox{#1}]}}}
+\def\Means {\Sugar{\mathematics{\rightarrow}}}
+\def\Tex #1{\Sugar{\type{#1}}}
+\def\Literal #1{\Sugar{\type{#1}}}
+\def\Syntax #1{\strut\kern-.25em{#1}\kern-.25em}
+\def\Next {\crlf\hbox to 2em{}\nobreak}
+\def\Whatever #1{\Sugar{\mathematics{(\hbox{#1})}}}
+\def\Quote #1{\Sugar{\quote{#1}}}
+
+\def\Or {\Sugar{\Indent{\mathematics{\vert}}}}
+\def\Means {\Sugar{\Indent{\mathematics{\rightarrow}}}}
+
+\def\StartSyntax
+ {\goodbreak
+ \startlines
+ \catcode`\#=12
+ \let\L \Literal
+ \let\S \Something
+ \def\FL##1{\color[darkred]{\L{##1}}}
+ \def\FS##1{\S{\color[darkred]{##1}}}
+ \let\M \Means
+ \let\O \Or
+ \let\Q \Quote
+ \let\LB\Lbrace
+ \let\RB\Rbrace}
+
+\def\StopSyntax
+ {\stoplines}
+
+\protect \endinput
diff --git a/tex/context/base/s-sys-01.tex b/tex/context/base/s-sys-01.tex
new file mode 100644
index 000000000..77d3410c4
--- /dev/null
+++ b/tex/context/base/s-sys-01.tex
@@ -0,0 +1,61 @@
+% engine=luatex
+
+%D \module
+%D [ file=s-sys-01,
+%D version=2008.03.32,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Generate List of Math Symbol,
+%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.
+
+\startluacode
+function showmath()
+ local slots = mathematics.slots.traditional
+ local escape = characters.filters.utf.private.escape
+ local data = characters.data
+ tex.sprint(tex.ctxcatcodes,"\\starttabulate[|T|c|T|T|T|T||||]")
+ local texsprint = tex.sprint
+% -- function texsprint(a,b) print(b) end
+ for _, v in ipairs(table.sortedkeys(slots)) do
+ local t, d, u = slots[v], data[v], escape(utf.char(v))
+ local class, name, description = d.mathclass or "", d.mathname or "" , d.description or ""
+ if class == "accent" then
+ u = ""
+ end
+ if t[3] and t[4] then
+ texsprint(tex.ctxcatcodes,string.format(
+ "\\NC 0x%04X\\NC $%s$\\NC %s\\NC 0x%04X\\NC %s\\NC 0x%04X\\NC %s\\NC %s\\NC %s\\NC\\NR",
+ v,u,t[1],t[2],t[3],t[4],class,name,description))
+ else
+ texsprint(tex.ctxcatcodes,string.format(
+ "\\NC 0x%04X\\NC $%s$\\NC %s\\NC 0x%04X\\NC\\NC\\NC %s\\NC %s\\NC %s\\NC\\NR",
+ v,u,t[1],t[2],class,name,description))
+ end
+ end
+ tex.sprint(tex.ctxcatcodes,"\\stoptabulate")
+end
+\stopluacode
+
+\setuplayout
+ [backspace=1cm,
+ topspace=1cm,
+ footer=1cm,
+ header=0cm,
+ height=middle,
+ width=middle]
+
+\setupbodyfont
+ [9pt]
+
+\setupfootertexts
+ []
+ [math characters -- \pagenumber]
+
+\starttext
+\ctxlua{showmath()}
+\stoptext
diff --git a/tex/context/base/scrn-bar.mkiv b/tex/context/base/scrn-bar.mkiv
new file mode 100644
index 000000000..dbeaf6d7f
--- /dev/null
+++ b/tex/context/base/scrn-bar.mkiv
@@ -0,0 +1,398 @@
+%D \module
+%D [ file=scrn-bar, % was part of scrn-int
+%D version=1995.01.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Progress Bars,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Screen Macros / Progress Bars}
+
+\unprotect
+
+%D The code is a bit upgraded to \MKIV\ but the output is mostly the same.
+%D In retrospect this shoul dhave been a module.
+
+% todo: replace blackrule by stupid rules
+
+% \setupinteraction[state=start]
+% \setupsubpagenumber[state=start]
+%
+% \startsetups bars
+% \vbox
+% {\hsize 5cm
+% \hbox{\interactionbar[a]}\blank
+% \hbox{\interactionbar[b]}\blank
+% \hbox{\interactionbar[c]}\blank
+% \hbox{\interactionbar[d]}\blank
+% \hbox{\interactionbar[e]}\blank
+% \hbox{\interactionbar[f]}\blank
+% \hbox{\interactionbar[g]}\blank
+% }
+% \stopsetups
+%
+% \setupheadertexts[\setups{bars}]
+%
+% \starttext
+% \dorecurse{10}{test \page }
+% \stoptext
+
+\presetlocalframed[\??ib]
+
+%D First the usual definition code.
+
+\let\currentinteractionbar\empty
+
+\def\setinteractionbarparameter#1#2#3{\@EA\def\csname\??ib#1#2\endcsname{#3}}
+\def\letinteractionbarparameter #1#2{\@EA\let\csname\??ib#1#2\endcsname}
+
+\def\interactionbarparameter #1{\csname\dointeractionbarparameter{\??ib\currentinteractionbar}#1\endcsname}
+\def\namedinteractionbarparameter#1#2{\csname\dointeractionbarparameter{\??ib#1}#2\endcsname}
+\def\interactionbarparameterhash #1{\dointeractionbarparameterhash {\??ib\currentinteractionbar}#1}
+
+\def\dointeractionbarparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointeractionbarparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dointeractionbarparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dointeractionbarparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dointeractionbarparentparameter #1#2{\ifx#1\relax\s!empty\else\dointeractionbarparameter #1#2\fi}
+\def\dointeractionbarparentparameterhash#1#2{\ifx#1\relax \else\dointeractionbarparameterhash#1#2\fi}
+
+\unexpanded\def\defineinteractionbar{\dodoubleargument\dodefineinteractionbar}
+\unexpanded\def\setupinteractionbar {\dodoubleempty \dosetupinteractionbar}
+\def\interactionbar {\dodoubleempty \dointeractionbar}
+
+\def\dosetupinteractionbar[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??ib#1][#2]%
+ \else
+ \getparameters[\??ib][#1]%
+ \fi}
+
+\def\dodefineinteractionbar[#1][#2]%
+ {\getparameters
+ [\??ib#1]%
+ [\s!parent=\??ib,%
+% \c!foregroundcolor=\interactionbarparameter\c!color,%
+% \c!foregroundstyle=\interactionbarparameter\c!style,%
+ #2]}
+
+\def\dointeractionbar[#1][#2]%
+ {\iflocation
+ \begingroup
+ \doifnot{#1}\v!reset % obsolete, no caching any more
+ {\doifassignmentelse{#1}
+ {\getparameters[\??ib][#2]%
+ \edef\currentinteractionbar{\interactionbarparameter\c!alternative}}%
+ {\edef\currentinteractionbar{#1}%
+ \ifsecondargument\getparameters[\??ib#1][#2]\fi}%
+ \doif{\interactionbarparameter\c!state}\v!start
+ {\interactionbarparameter\c!command}}%
+ \endgroup
+ \fi}
+
+\newdimen\interactionbarwidth
+\newdimen\interactionbarheight
+\newdimen\interactionbardepth
+\newdimen\interactionbardistance
+
+%D Interaction buttons, in fact a row of tiny buttons, are
+%D typically only used for navigational purposed. The next
+%D macro builds such a row based on a specification list.
+%D
+%D \startbuffer
+%D \interactionbuttons[width=\hsize][page,PreviousJump,ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D Apart from individual entries, one can use \type{page} and
+%D \type {subpage} as shortcuts to their four associated buttons.
+%D The symbols are derived from the symbols linked to the
+%D entries.
+
+\def\interactionbuttons
+ {\dodoubleempty\dointeractionbuttons}
+
+\def\dointeractionbuttons[#1][#2]% er is een verdeel macro \horizontalfractions
+ {\iflocation
+ \begingroup
+ % beware, is already set \let\currentinteractionbar\empty
+ \doif{\interactionbarparameter\c!state}\v!stop\locationfalse
+ \iflocation
+ \ifsecondargument
+ \let\menuparameter\interactionbarparameter
+ \setupinteractionbar[#1]%
+ \interactionbarwidth\interactionbarparameter\c!width
+ \ifdim\interactionbarwidth=\zeropoint
+ \interactionbarwidth1.5\emwidth
+ \fi
+ \doifnothing\@@ibheight{\letinteractionbarparameter\c!height\v!broad}%
+ \doifnothing\@@ibdepth {\letinteractionbarparameter\c!depth\!!zeropoint}%%%
+ \setbox2\hbox{\localframed[\??ib\currentinteractionbar][\c!background=]{\symbol[\@@iasymbolset][\v!previouspage]}}%
+ \!!heighta\ht2 % needed because we default to nothing
+ \setupinteractionbar[\c!strut=\v!no]%
+ \setinteractionparameter\c!width\!!zeropoint
+ \!!counta\zerocount % new, was 1
+ \processallactionsinset
+ [#2]
+ [ \v!page=>\advance\!!counta 4,
+ \v!subpage=>\advance\!!counta 4,
+ \s!unknown=>\advance\!!counta 1]%
+ \ifdim\interactionbarwidth=\zeropoint
+ \!!widtha\dimexpr2\emwidth+\interactionbardistance\relax
+ \!!widthb\dimexpr\!!counta\!!widtha-\interactionbardistance\relax
+ \else
+ \!!widtha\interactionbarwidth
+ \!!widthb\dimexpr\!!counta\interactionbardistance-\interactionbardistance\relax
+ \advance\!!widtha -\!!widthb
+ \divide\!!widtha \!!counta
+ \!!widthb\interactionbarwidth
+ \fi
+ \hbox to \!!widthb
+ {\setnostrut
+ \processallactionsinset
+ [#2]
+ [ \v!page=>\interactionbargotox\v!firstpage \interactionbargotox\v!nextpage \interactionbargotox\v!previouspage \interactionbargotox\v!lastpage,
+ \v!subpage=>\interactionbargotox\v!firstsubpage\interactionbargotox\v!nextsubpage\interactionbargotox\v!previoussubpage\interactionbargotox\v!lastsubpage,
+ \s!unknown=>\interactionbargotox\commalistelement]%
+ \unskip}%
+ \else
+ \interactionbuttons[][#1]%
+ \fi
+ \fi
+ \endgroup
+ \fi}
+
+\def\interactionbargotox#1%
+ {\normalexpanded{\noexpand\dodocomplexbutton
+% {\??ib\currentinteractionbar}%
+ {\??ib}%
+ [\c!height=\the\!!heighta,\c!width=\the\!!widtha]%
+ {\noexpand\symbol[\@@iasymbolset][#1]}%
+ [#1]}%
+ \hss}
+
+\def\interactionbara
+ {\iflocation
+ \interactionbarwidth \interactionbarparameter\c!width
+ \interactionbardistance\interactionbarparameter\c!distance
+ \interactionbarheight \interactionbarparameter\c!height
+ \interactionbardepth \interactionbarparameter\c!depth
+ \noindent\hbox to \interactionbarwidth \bgroup
+ \dontcomplain
+ \setupblackrules[\c!height=\v!max,\c!depth=\v!max]%
+ \!!widthb\dimexpr\interactionbarwidth-4\emwidth\relax
+ \processaction
+ [\interactionbarparameter\c!step]
+ [ \v!small=>\scratchcounter 20,
+ \v!medium=>\scratchcounter 10,
+ \v!big=>\scratchcounter 5,
+ \s!unknown=>\scratchcounter 10]%
+ \!!widtha\dimexpr\!!widthb/\scratchcounter\relax
+ \setupblackrules[\c!width=\!!widtha]%
+ \setbox\scratchbox\hbox to \interactionbarwidth
+ {\hskip2\emwidth
+ \setbox\scratchbox\hbox{\blackrule[\c!color=\interactionbarparameter\c!backgroundcolor]}%
+ \dorecurse\scratchcounter
+ {\hss\normalexpanded{\directgotodumbbox{\copy\scratchbox}[page(\the\numexpr\recurselevel*\lastpage/\scratchcounter\relax)]}}%
+ \hss
+ \hskip2\emwidth}%
+ \wd\scratchbox\zeropoint
+ \box \scratchbox
+ \setupblackrules[\c!width=\emwidth]%
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!firstpage]}%
+ \hskip\emwidth
+ \ifnum\realpageno>\plusone
+ \hskip\zeropoint\!!plus\numexpr\realpageno-\plustwo\relax \s!sp\relax % cm gives overflow
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!previouspage)]}%
+ \fi
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[page(\number\realpageno)]}% todo: \v!currentpage
+ \ifnum\realpageno<\lastpage\relax
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!nextpage]}%
+ \hskip\zeropoint\!!plus\numexpr\lastpage-\realpageno-\plusone\relax \s!sp\relax % cm gives overflow
+ \fi
+ \hskip\emwidth
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!lastpage]}%
+ \egroup
+ \fi}
+
+\def\interactionbarb
+ {\ifnum\lastpage>\firstpage\relax
+ \interactionbuttons[\v!firstpage,\v!previouspage,\v!nextpage,\v!lastpage]%
+ \fi}
+
+\def\interactionbarc
+ {\iflocation \ifnum\lastpage>\plusone
+ \interactionbarwidth\interactionbarparameter\c!width
+ \hbox to \interactionbarwidth
+ {\setupblackrules[\c!height=\interactionbarparameter\c!height,\c!depth=\interactionbarparameter\c!depth,\c!width=\emwidth]%
+ \scratchdimen\dimexpr(\interactionbarwidth-4\emwidth)/\numexpr\lastpage+\minusone\relax\relax
+ \!!widtha\numexpr\realpageno+\minusone\relax\scratchdimen
+ \!!widthb\numexpr\lastpage-\realpageno\relax\scratchdimen
+ \directgotospecbox\interactionbarparameter{\blackrule}[\v!firstpage]%
+ \hss
+ \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widtha]}[\v!previouspage]%
+ \blackrule[\c!color=\interactionbarparameter\c!contrastcolor]%
+ \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widthb]}[\v!nextpage]%
+ \hss
+ \directgotospecbox\interactionbarparameter{\blackrule}[\v!lastpage]}%
+ \fi \fi}
+
+\unexpanded\def\@@commoninteractionbargotoa#1%
+ {\symbol[\ifcase#1\v!previous\or\v!somewhere\or\v!next\fi]}
+
+\unexpanded\def\@@commoninteractionbargotob#1%
+ {\vrule\!!height\interactionbarheight\!!depth\interactionbardepth\!!width\!!widtha\relax}
+
+\unexpanded\def\@@commoninteractionbargotoc#1%
+ {\symbol[\ifcase#1\v!previous\or\v!somewhere\or\v!somewhere\or\v!somewhere\or\v!next\fi}
+
+\unexpanded\def\@@commoninteractionbargotod#1%
+ {\vrule \!!width\!!widtha \ifcase#1%
+ \!!height \interactionbarheight \!!depth \interactionbardepth \or
+ \!!height.5\interactionbarheight \!!depth.5\interactionbardepth \or
+ \!!height \interactionbarheight \!!depth \interactionbardepth \or
+ \!!height.5\interactionbarheight \!!depth.5\interactionbardepth \else
+ \!!height \interactionbarheight \!!depth \interactionbardepth \fi}
+
+\unexpanded\def\@@commoninteractionbarx#1%
+ {\doifelse{\interactionbarparameter\c!symbol}\v!yes
+ {\setupsymbolset[\@@iasymbolset]%
+ \let\dogotox\@@commoninteractionbargotoa}
+ {\let\dogotox\@@commoninteractionbargotob}%
+ \dorecurse\nofsubpages
+ {\scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax
+ \chardef\what
+ \ifnum\scratchcounter<\realpageno \zerocount \else
+ \ifnum\scratchcounter=\realpageno \plusone \else
+ \plustwo \fi\fi
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\dogotox\what}[page(\the\scratchcounter)]}%
+ #1}%
+ \unskip}
+
+\def\interactionbard
+ {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
+ \interactionbarwidth \interactionbarparameter\c!width
+ \interactionbardistance\interactionbarparameter\c!distance
+ \interactionbarheight \interactionbarparameter\c!height
+ \interactionbardepth \interactionbarparameter\c!depth
+ \!!widtha\interactionbarwidth
+ \noindent\hbox{\@@commoninteractionbarx{\hskip\interactionbardistance}}%
+ }\fi \fi}
+
+\def\interactionbare
+ {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
+ \begingroup
+ \interactionbarwidth \interactionbarparameter\c!width
+ \interactionbardistance\interactionbarparameter\c!distance
+ \interactionbarheight \interactionbarparameter\c!height
+ \interactionbardepth \interactionbarparameter\c!depth
+ \!!widthb\dimexpr\nofsubpages\interactionbardistance-\interactionbardistance\relax % (n-1)
+ \!!widtha\dimexpr(\interactionbarwidth-\!!widthb)/\nofsubpages\relax
+ \ifdim\!!widtha<\interactionbardistance
+ \interactionbarf
+ \else
+ \noindent\hbox to \interactionbarwidth{\@@commoninteractionbarx{\hss}\unskip}%
+ \fi
+ \endgroup
+ }\fi\fi}
+
+\def\interactionbarf
+ {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
+ \interactionbarwidth \interactionbarparameter\c!width
+ \interactionbardistance\interactionbarparameter\c!distance
+ \interactionbarheight \interactionbarparameter\c!height
+ \interactionbardepth \interactionbarparameter\c!depth
+ \noindent \hbox to \interactionbarwidth \bgroup
+ \doloop
+ {\!!countc\numexpr(\nofsubpages/\recurselevel)+\plusone\relax % rounding
+ \!!widthb\interactionbardistance
+ \multiply\!!widthb \!!countc
+ \advance\!!widthb -\interactionbardistance
+ \!!widtha\interactionbarwidth
+ \advance\!!widtha -\!!widthb
+ \divide\!!widtha \!!countc
+ \ifdim\!!widtha<\interactionbardistance\else
+ \!!countb\recurselevel
+ \exitloop
+ \fi}%
+ \ifnum\!!countc>\plusone
+ % this is not that well tested
+ \advance\!!countc \minustwo
+ \!!widtha-\interactionbardistance
+ \!!widtha\!!countc\!!widtha
+ \advance\!!widtha \interactionbarwidth
+ \advance\!!countc \plusone
+ \divide\!!widtha \!!countc
+ \fi
+ \doifelse{\interactionbarparameter\c!symbol}\v!yes
+ {\setupsymbolset[\@@iasymbolset]%
+ \let\dogotox\@@commoninteractionbargotoc}%
+ {\let\dogotox\@@commoninteractionbargotod}%
+ \!!countc\numexpr\realpageno-\plustwo\relax
+ \!!countd\numexpr\realpageno+\plustwo\relax
+ \ifnum\!!countc<\plusone \!!countc\plusone \fi
+ \!!countf\zerocount
+ \dostepwiserecurse\firstsubpage\lastsubpage\plusone
+ {\!!doneafalse
+ \advance\!!countf \plusone
+ \ifnum\recurselevel=\firstsubpage\relax \!!doneatrue \fi
+ \ifnum\recurselevel=\lastsubpage \relax \!!doneatrue \fi
+ \chardef\what \if!!donea
+ \ifnum\recurselevel<\realpageno \zerocount \else
+ \ifnum\recurselevel>\realpageno \plustwo \else
+ \plusfour \fi\fi
+ \else \ifnum\!!countf=\!!countb
+ \ifnum\recurselevel<\realpageno \plusone \else
+ \ifnum\recurselevel>\realpageno \plusthree \else
+ \plustwo \fi\fi
+ \fi \fi
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\dogotox\what}[page(\recurselevel)]}%
+ \hss
+ \!!countf\zerocount}%
+ \unskip
+ \egroup
+ }\fi\fi}
+
+\def\interactionbarg
+ {\iflocation \ifnum\lastsubpage>\firstsubpage\relax % no test for state?
+ \interactionbuttons[\v!firstsubpage,\v!previoussubpage,\v!nextsubpage,\v!lastsubpage]%
+ \fi \fi}
+
+\setupinteractionbar
+ [\c!state=\v!start,
+ \c!alternative=a,
+ \c!symbol=\v!no,
+ \c!width=10\emwidth,
+ \c!height=.5\emwidth,
+ \c!depth=\zeropoint,
+ \c!distance=.5\emwidth,
+ \c!step=\v!medium,
+ \c!foregroundcolor=\interactionbarparameter\c!color,
+ \c!foregroundstyle=\interactionbarparameter\c!style,
+ \c!color=\@@iacolor,
+ \c!contrastcolor=\@@iacontrastcolor,
+ \c!style=,
+ \c!frame=\v!on,
+ \c!background=color,
+ \c!backgroundcolor=gray,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!yes]
+
+\defineinteractionbar[a][\c!command=\interactionbara]
+\defineinteractionbar[b][\c!command=\interactionbarb,\c!height=\v!broad]
+\defineinteractionbar[c][\c!command=\interactionbarc,\c!height=\v!max,\c!depth=\v!max]
+\defineinteractionbar[d][\c!command=\interactionbard,\c!width=.5\emwidth]
+\defineinteractionbar[e][\c!command=\interactionbare]
+\defineinteractionbar[f][\c!command=\interactionbarf]
+\defineinteractionbar[g][\c!command=\interactionbarg,\c!height=\v!broad]
+
+\protect \endinput
diff --git a/tex/context/base/scrn-but.mkiv b/tex/context/base/scrn-but.mkiv
new file mode 100644
index 000000000..9a72a756b
--- /dev/null
+++ b/tex/context/base/scrn-but.mkiv
@@ -0,0 +1,127 @@
+%D \module
+%D [ file=scrn-but, % moved code
+%D version=1995.01.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Interaction,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Screen Macros / Buttons}
+
+\unprotect
+
+%D Buttons are just what their names says: things that can be
+%D clicked (pushed) on. They are similar to \type{\goto},
+%D except that the text argument is not interpreted.
+%D Furthermore one can apply anything to them that can be done
+%D with \type{\framed}.
+%D
+%D \startbuffer
+%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D This command is formally specified as:
+%D
+%D \showsetup{button}
+%D
+%D The characteristics can be set with:
+%D
+%D \showsetup{setupbuttons}
+
+\unexpanded\def\setupbuttons
+ {\dodoubleargument\getparameters[\??bt]}
+
+\definecomplexorsimpleempty\button
+
+\def\complexbutton
+ {\docomplexbutton\??bt}
+
+\presetlocalframed[\??bt]
+
+\def\buttonparameter#1{\csname\??bt#1\endcsname} % simple version
+
+\long\def\docomplexbutton#1[#2]#3#4% get rid of possible space before [#4]
+ {\dodocomplexbutton#1[#2]{#3}#4} % #4 == [
+
+\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
+
+% #3=none is obsolete, just use empty=yes
+
+\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later
+ {\begingroup
+ \let\menuparameter\buttonparameter
+ \doif{\buttonparameter\c!state}\v!stop\locationfalse
+ \iflocation
+ \setlocationboxyes#1[#2]{#3}[#4]%
+ \fi
+ \endgroup}
+
+%D \macros
+%D {overlaybutton}
+%D
+%D For converience we provide:
+%D
+%D \starttyping
+%D \overlaybutton[reference]
+%D \stoptyping
+%D
+%D This command can be used to define overlays an/or can be
+%D used in the whatevertext areas, like:
+%D
+%D \starttyping
+%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}]
+%D \setupbackgrounds[page][background=PrevPage]
+%D \setuptexttexts[\overlaybutton{NextPage}]
+%D \stoptyping
+%D
+%D For practical reasons, this macro accepts square brackets
+%D as well as braces.
+
+\definecomplexorsimple\overlaybutton
+
+\def\simpleoverlaybutton#1%
+ {\complexoverlaybutton[#1]}
+
+\def\complexoverlaybutton[#1]%
+ {\iflocation
+ \gotobox{\overlayfakebox}[#1]%
+ \fi}
+
+\def\overlayfakebox
+ {\hbox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\overlaywidth
+ \ht\scratchbox\overlayheight
+ \box\scratchbox}}
+
+%D Done.
+
+\setupbuttons
+ [\c!state=\v!start,
+ \c!width=\v!fit,
+ \c!height=\v!broad,
+ \c!offset=0.25em,
+ \c!frame=\v!on,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!foregroundstyle=\buttonparameter\c!style,
+ \c!foregroundcolor=\buttonparameter\c!color,
+ \c!style=\@@iastyle,
+ \c!color=\@@iacolor,
+ \c!contrastcolor=\@@iacontrastcolor,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!yes,
+ \c!distance=\zeropoint] % for menubuttons
+
+\protect \endinput
diff --git a/tex/context/base/scrn-fld.mkii b/tex/context/base/scrn-fld.mkii
new file mode 100644
index 000000000..4e1b34fa9
--- /dev/null
+++ b/tex/context/base/scrn-fld.mkii
@@ -0,0 +1,1247 @@
+%D \module
+%D [ file=scrn-fld,
+%D version=1997.05.18,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Fields,
+%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.
+
+% \appendtocommalist versus \addtocommalist
+%
+% * as default trigger in radiofields ?
+%
+% beware: weblink plugin truncates on length, while save as doesn't;
+% more precise: (1) first time right string is sent, (2)
+% internal string truncated, (3) second time truncated
+% string is sent.
+
+\writestatus{loading}{ConTeXt Screen Macros / Fields}
+
+% messages
+
+\definemessageconstant{fields}
+
+\unprotect
+
+%D First we hook fields into the (viewer based) layering mechanism
+%D (implemented as properties).
+
+\ifx\currentlayerproperty\undefined\else \let\currentlayerproperty\empty\fi
+
+\appendtoks
+ \doif\@@iafieldlayer\v!auto
+ {\def\@@iafieldlayer{\currentlayerproperty}}%
+\to \everysetupinteraction
+
+\setupinteraction
+ [\c!fieldlayer=\v!auto] % auto by default
+
+%D Internal command, linked to \type{\definesymbol}.
+
+\def\dogetfieldsymbol#1%
+ {\getobject{SYM}{#1}}
+
+\def\dopresetfieldsymbol#1%
+ {\checkobjectreferences
+ \doifobjectfoundelse{SYM}{#1}
+ {}
+ {\settightobject{SYM}{#1}\hbox{\symbol[#1]}%
+ \flushatshipout
+ {\setbox0\hbox{\hskip-\maxdimen\getobject{SYM}{#1}}%
+ \smashbox0\box0}}}
+
+\def\presetfieldsymbols[#1]% slow
+ {\def\dopresetfieldsymbols##1%
+ {\processcommalist[##1]\dopresetfieldsymbol}%
+ \@EA\processcommalist\@EA[#1]\dopresetfieldsymbols}
+
+\def\definedefaultsymbols
+ {\definesymbol[defaultyes][$\times$]%
+ \definesymbol[defaultno][$\cdot$]}
+
+\def\resetfieldsymbol[#1]% for experimental usage only
+ {\resetobject{SYM}{#1}}
+
+%D The interface to the specials. DEFAULT NOG ANDERS
+
+\def\preparefieldvariables % evt \def's at the outer level (test) or \edef's here for fast testing
+ {\let\@@DriverFieldNumber \@@fdn
+ \let\@@DriverFieldStyle \@@fdstyle
+ \let\@@DriverFieldColor \@@fdcolor
+ \let\@@DriverFieldBackgroundColor\@@fdfieldbackgroundcolor
+ \let\@@DriverFieldFrameColor \@@fdfieldframecolor
+ \let\@@DriverFieldLayer \@@fdfieldlayer
+ \let\@@DriverFieldOption \@@fdoption
+ \let\@@DriverFieldAlign \@@fdalign
+ \let\@@DriverFieldClickIn \@@fdclickin
+ \let\@@DriverFieldClickOut \@@fdclickout
+ \let\@@DriverFieldRegionIn \@@fdregionin
+ \let\@@DriverFieldRegionOut \@@fdregionout
+ \let\@@DriverFieldAfterKey \@@fdafterkey
+ \let\@@DriverFieldFormat \@@fdformat
+ \let\@@DriverFieldValidate \@@fdvalidate
+ \let\@@DriverFieldCalculate \@@fdcalculate
+ \let\@@DriverFieldFocusIn \@@fdfocusin
+ \let\@@DriverFieldFocusOut \@@fdfocusout}
+
+% todo : remove arguments, consider DriverField a namespace
+
+\def\presetlinefield
+ {\preparefieldvariables
+ \dopresetlinefield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldNumber}
+ {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldAlign}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presettextfield
+ {\preparefieldvariables
+ \dopresettextfield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldNumber}
+ {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldAlign}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presetchoicefield
+ {\preparefieldvariables
+ \dopresetchoicefield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldValues}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presetpopupfield
+ {\preparefieldvariables
+ \dopresetpopupfield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldValues}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presetcombofield
+ {\preparefieldvariables
+ \dopresetcombofield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldStyle,\@@DriverFieldColor,\@@DriverFieldBackgroundColor,\@@DriverFieldFrameColor}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldValues}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presetcheckfield
+ {\preparefieldvariables
+ \presetfieldsymbols[\@@DriverFieldValues]%
+ \dopresetcheckfield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldValues}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presetpushfield
+ {\preparefieldvariables
+ %\edef\@@DriverFieldValues{{\@@DriverFieldValues}}% makes sure {a,b,c} is passed
+ \presetfieldsymbols[\@@DriverFieldValues]%
+ \dopresetpushfield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldValues}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presetradiofield
+ {\preparefieldvariables
+ \presetfieldsymbols[\@@DriverFieldValues]%
+ \dopresetradiofield
+ {\@@DriverFieldName}
+ {\@@DriverFieldWidth}
+ {\@@DriverFieldHeight}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldRoot}
+ {\@@DriverFieldValues}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\presetradiorecord
+ {\preparefieldvariables
+ \dopresetradiorecord
+ {\@@DriverFieldName}
+ {\@@DriverFieldDefault}
+ {\@@DriverFieldOption}
+ {\@@DriverFieldKids}
+ {\@@DriverFieldClickIn,\@@DriverFieldClickOut,\@@DriverFieldRegionIn,\@@DriverFieldRegionOut,%
+ \@@DriverFieldAfterKey,\@@DriverFieldFormat,\@@DriverFieldValidate,\@@DriverFieldCalculate,%
+ \@@DriverFieldFocusIn,\@@DriverFieldFocusOut}}
+
+\def\setfieldmodes#1#2#3%
+ {\xdef\@@DriverFieldMode{#1}% % 0 1 2 3
+ \xdef\@@DriverFieldFree{#2}% % 0 1
+ \xdef\@@DriverFieldAuto{#3}} % 0 1
+
+\newevery\everysetfield\relax
+
+\def\doiffieldelse#1{\doifdefinedelse{fielddata#1}}
+
+\def\setfield#1#2#3#4#5#6#7#8#9%
+ {\bgroup
+ \doglobal\increment\numberoffields
+ \iftracefields
+ \doglobal\addtocommalist{#1}\collectedfields
+ \fi
+ \the\everysetfield
+ \setxvalue{fielddata#1}% kortere tag #7 needs expansion etc
+ {\noexpand\dosetfield{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}%
+ \egroup}
+
+\def\dosetfield#1#2#3#4#5#6#7#8#9%
+ {\xdef\@@DriverFieldName {#1}%
+ \xdef\@@DriverFieldType {#2}%
+ \xdef\@@DriverFieldRoot {#3}%
+ \xdef\@@DriverFieldParent {#4}%
+ \xdef\@@DriverFieldKids {#5}%
+ \xdef\@@DriverFieldGroup {#6}%
+ \setfieldmodes #7%
+ \bgroup
+ \def\par{\string\n\string\n}%
+ \xdef\@@DriverFieldValues {#8}%
+ \xdef\@@DriverFieldDefault{#9}%
+ \egroup}
+
+\def\changefield#1%
+ {\setfield{#1}\@@DriverFieldType\@@DriverFieldRoot\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldGroup
+ {\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}\@@DriverFieldValues\@@DriverFieldDefault}
+
+\def\getfield#1% name
+ {\doifundefinedelse{fielddata#1}
+ {\dosetfield{#1}\empty\empty\empty\empty\empty{\empty00}\empty\empty}
+ {\getvalue{fielddata#1}}}
+
+\newif\iftracefields \tracefieldsfalse
+
+\let\tracefields\tracefieldstrue
+
+\def\doshowfields[#1]% todo: tabulate van maken en runtime
+ {\bgroup
+ \switchtobodyfont[8pt,tt]%
+ \doifsomething{#1}{\def\collectedfields{#1}}%
+ \ifx\collectedfields\empty
+ \par specify [fieldlist] or say \type{\tracefieldstrue} first\par
+ \else
+ \def\normalizedfieldmode##1##2##3%
+ {\ifcase0##2 \else\sl\fi
+ \ifcase0##1 loner\or parent\or clone\or copy\fi}%
+ \def\dosetfield##1##2##3##4##5##6##7##8##9%
+ {##1&##2&##3&##4&##5&##6&\normalizedfieldmode##7&##8&##9\cr}%
+ \halign
+ {&##\strut\hss\quad\cr
+ \noalign{\hrule}%
+ NAME &TYPE &ROOT &
+ PARENT&KIDS &GROUP &
+ MODE &VALUES&DEFAULT\cr
+ \noalign{\hrule}%
+ \@EA\globalprocesscommalist\@EA[\collectedfields]\getfield
+ \noalign{\hrule}}%
+ \fi
+ \egroup}
+
+\def\showfields
+ {\dosingleempty\doshowfields}
+
+\def\dologfields[#1]%
+ {\bgroup
+ \immediate\openout\scratchwrite=fields.log
+ \doifsomething{#1}{\def\collectedfields{#1}}%
+ \ifx\colledtedfields\empty
+ \immediate\write\scratchwrite{use \tracefieldstrue}%
+ \else
+ \def\normalizedfieldmode##1##2##3%
+ {\edef\@@DriverFieldMode
+ {\ifcase##1 loner \or parent \or clone \or copy \fi
+ \ifcase##2 \else(done)\fi}}%
+ \def\dosetfield##1##2##3##4##5##6##7##8##9%
+ {\normalizedfieldmode##7%
+ \immediate\write\scratchwrite
+ {N=##1 / T=##2 / R=##3 / P=##4 / K=##5 / G=##6 /
+ M=\@@DriverFieldMode\space/ V=##8 / D=##9}}%
+ \processcommacommand[\collectedfields]\getfield
+ \fi
+ \immediate\closeout\scratchwrite
+ \egroup}
+
+\def\logfields
+ {\dosingleempty\doLogFields}
+
+%D \starttyping
+%D \definefield [name] [type] [group] [values] [default]
+%D
+%D \definefield [WWWW] [text] [textsetup] [default text]
+%D \definefield [XXXX] [push] [pushsetup] [yes,no] [yes]
+%D \definefield [XXXX] [check] [checksetup] [yes,no] [yes]
+%D \definefield [YYYY] [combo] [combosetup] [a,b,c,d] [b]
+%D \definefield [ZZZZ] [radio] [radiosetup] [W,X,Y,Z] [Y]
+%D
+%D \definesubfield [W] [subsetup] [p,q]
+%D \definesubfield [X,Y] [subsetup] [p,r]
+%D \definesubfield [Z] [subsetup] [y,z]
+%D
+%D evt \definemainfield ... wanneer geplaatst voor subs gegeven
+%D
+%D \clonefield [XXXX] [XX,YY] [mysetup] [on,off]
+%D \clonefield [Z] [AA,BB] [somesetup] [true,false]
+%D \clonefield [Z] [CC,DD] [anothersetup]
+%D
+%D \copyfield [XXXX] [PP,QQ,RR]
+%D
+%D \field[XXXX]
+%D \fitfield[XXXX]
+%D \stoptyping
+%D
+%D Beware, in \MKII\ we don't support autocloning for radiofields.
+
+\newif\ifdefinemainfield \definemainfieldfalse
+
+%D We need to keep track of cloned (related) fields and so by
+%D maintaining lists of field clones.
+%D
+%D The first alternative used a two pass data list and was
+%D implemented as follows:
+%D
+%D \starttyping
+%D \def\getmainfieldkids#1%
+%D {\let\@@DriverFieldKids\empty
+%D \ifdefinemainfield
+%D \definetwopasslist{fld:#1}% defined by system
+%D \doloop
+%D {\gettwopassdata{fld:#1}%
+%D \iftwopassdatafound
+%D %\addtocommalist\twopassdata\@@DriverFieldKids
+%D \appendtocommalist\twopassdata\@@DriverFieldKids
+%D \else
+%D \exitloop
+%D \fi}%
+%D \fi}
+%D \stoptyping
+%D
+%D However, the next alternative is much faster when we have
+%D a field with thousands of clones, something not that
+%D imaginary.
+%D
+%D \starttyping
+%D \def\getmainfieldkids#1%
+%D {\let\@@DriverFieldKids\empty
+%D \ifdefinemainfield
+%D \definetwopasslist{fld:#1}% runtime defined by system
+%D \getnamedtwopassdatalist{fld:#1}\@@DriverFieldKids
+%D \fi}
+%D \stoptyping
+%D
+%D The data is written by file using:
+%D
+%D \starttyping
+%D \newcounter\nofmainfieldkids
+%D
+%D \def\setmainfieldkid#1#2%
+%D {\doglobal\increment\nofmainfieldkids
+%D \savetwopassdata{fld:#1}{\nofmainfieldkids}{#2}}
+%D \stoptyping
+%D
+%D The trade of of this mechanism is that for each cloned or
+%D copied field, the uitlity file is to be read in order to
+%D fetch the data.
+%D
+%D The next, much faster alternative uses a dedicated %
+%D reference mechanism.
+
+\def\setmainfieldkid#1#2%
+ {\immediatewriteutilitycommand{\fieldreference{#1}{#2}}}
+
+\def\checkfieldreferences
+ {\startnointerference
+ \protectlabels
+ \doutilities{fieldreferences}\jobname\empty\relax\relax
+ \global\let\checkfieldreferences\relax
+ \stopnointerference}
+
+\def\setfieldreferences
+ {\def\fieldreference##1##2%
+ {\ifundefined{\r!widget##1}%
+ \setxvalue{\r!widget##1}{##2}%
+ \else
+ \edef\!!stringa{\getvalue{\r!widget##1}}%
+ \setxvalue{\r!widget##1}{\!!stringa,##2}%
+ \fi}}
+
+\def\resetfieldreferences
+ {\let\fieldreference\gobbletwoarguments}
+
+\def\getmainfieldkids#1%
+ {\checkfieldreferences
+ \ifdefinemainfield
+ \doifundefinedelse{\r!widget#1}%
+ {\let\@@DriverFieldKids\empty}
+ {\@EA\let\@EA\@@DriverFieldKids\csname\r!widget#1\endcsname}%
+ \else
+ \let\@@DriverFieldKids\empty
+ \fi}
+
+\resetfieldreferences
+
+%D Of course it costs a few more tokens to implement, but it's
+%D worth the memory: running for instance the 2000 page
+%D english examns publishing on demand document went down from
+%D 1350 seconds to less than 950 on a 650 Mhz pentium.
+
+\def\definefield
+ {\definemainfieldfalse\doquintupleempty\dodefinefield}
+
+\def\definemainfield
+ {\definemainfieldtrue \doquintupleempty\dodefinefield}
+
+\let\collectedfields\empty
+\newcounter\numberoffields
+\newcounter\totalnumberoffields
+
+\def\savenumberoffields
+ {\ifcase\numberoffields\relax\else
+ \savecurrentvalue\totalnumberoffields\numberoffields
+ \fi}
+
+\appendtoks \savenumberoffields \to \everybye % \everylastshipout
+
+% \def\presetfieldreferences
+% {\ifnum\totalnumberoffields>0
+% \definereference[AtOpenInitializeForm][\v!ResetForm]%
+% \fi}
+%
+% \definereference[AtOpenInitializeForm][\v!geen]
+%
+% \appendtoks \presetfieldreferences \to \everycheckreferences
+
+\def\dodefinefield[#1][#2][#3][#4][#5]%
+ {\ifsecondargument
+ \edef\currentfieldname{#1}% just in case we're inside a loop
+ \doifundefinedelse{define#2field}
+ {\writestatus\m!fields{unknown field type #2}}
+ {\doifundefined{fielddata\currentfieldname}
+ {\getmainfieldkids\currentfieldname
+ \ifdefinemainfield
+ \ifx\@@DriverFieldKids\empty
+ \let\@@DriverFieldMode\fieldlonermode
+ \else
+ \let\@@DriverFieldMode\fieldparentmode
+ \fi
+ \def\@@DriverFieldAuto{1}%
+ \else
+ \let\@@DriverFieldMode\fieldlonermode
+ \def\@@DriverFieldAuto{0}%
+ \fi
+ \def\@@DriverFieldFree{0}%
+ \getvalue{define#2field}{\currentfieldname}{#2}{#3}{#4}{#5}}}%
+ \else
+ \writestatus\m!fields{pass fieldname and fieldtype}%
+ \fi}
+
+\def\definelinefield#1#2#3#4#5%
+ {\setfield{#1}{#2}{}{}{\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{#4}}
+
+\let\definetextfield=\definelinefield
+
+\def\definechoicefield#1#2#3#4#5%
+ {\doifelsenothing{#4}
+ {\def\@@DriverFieldValues{yes,no}}
+ {\def\@@DriverFieldValues{#4}}%
+ \doifelsenothing{#5}
+ {\dogetcommacommandelement2\from\@@DriverFieldValues \to\@@DriverFieldDefault
+ \dogetcommacommandelement1\from\@@DriverFieldDefault\to\@@DriverFieldDefault}
+ {\def\@@DriverFieldDefault{#5}}%
+ \setfield{#1}{#2}{}{}{\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{\@@DriverFieldValues}{\@@DriverFieldDefault}}
+
+\let\definepopupfield=\definechoicefield
+\let\definecombofield=\definechoicefield
+
+%\def\definecheckfield#1#2#3#4#5%
+% {\doifelsenothing{#4}
+% {\definedefaultsymbols
+% \def\@@DriverFieldValues{defaultyes}}
+% {\def\@@DriverFieldValues{#4}}%
+% \doifelsenothing{#5}
+% {\dogetcommacommandelement2\from\@@DriverFieldValues\to\@@DriverFieldDefault
+% \dogetcommacommandelement1\from\@@DriverFieldDefault\to\@@DriverFieldDefault}
+% {\def\@@DriverFieldDefault{#5}}%
+% \setfield{#1}{#2}{}{}{\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{\@@DriverFieldValues}{\@@DriverFieldDefault}}
+
+%D Since these fields have an on/off state only, we pass 1/0
+%D to the driver as default values.
+
+\def\definecheckfield#1#2#3#4#5%
+ {\doifelsenothing{#4}
+ {\definedefaultsymbols
+ \def\@@DriverFieldValues{defaultyes}}
+ {\def\@@DriverFieldValues{#4}}%
+ \doifelsenothing{#5}
+ {\def\@@DriverFieldDefault{2}}
+ {\dogetcommacommandelement1\from\@@DriverFieldValues\to\@@DriverFieldDefault
+ \doifinstringelse{#5}{\@@DriverFieldDefault}
+ {\def\@@DriverFieldDefault{1}}
+ {\def\@@DriverFieldDefault{0}}}%
+ \setfield
+ {#1}{#2}{}{}{\@@DriverFieldKids}{#3}%
+ {\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}%
+ {\@@DriverFieldValues}{\@@DriverFieldDefault}}
+
+\let\definepushfield=\definecheckfield
+
+\def\defineradiofield#1#2#3#4#5%
+ {\iffourthargument
+ \doifelsenothing{#5}
+ {\dogetcommacommandelement1\from#4\to\SavedFieldDefault
+ \dogetcommacommandelement1\from\SavedFieldDefault\to\SavedFieldDefault}
+ {\def\SavedFieldDefault{#5}}%
+% when opt works
+% \@EA\beforesplitstring\SavedFieldDefault\at=>\to\SavedFieldDefault
+ \ifx\@@DriverFieldKids\empty
+ \setfield{#1}{#2}{}{}{#4}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\SavedFieldDefault}%
+ \else
+ \setfield{#1}{#2}{}{}{#4,\@@DriverFieldKids}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\SavedFieldDefault}%
+ \fi
+%
+ \def\docommand##1%
+ {\doifelse{##1}\SavedFieldDefault
+ {\def\@@DriverFieldDefault{##1}}%
+ {\let\@@DriverFieldDefault\empty}%
+ \setfield{##1}{#2}{#1}{}{}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\@@DriverFieldDefault}}%
+% when opt works
+% \def\docommand##1%
+% {\@EA\beforesplitstring##1\at=>\to\FieldValue
+% \doifelse\FieldValue\SavedFieldDefault
+% {\let\@@DriverFieldDefault\FieldValue}%
+% {\let\@@DriverFieldDefault\empty}%
+% \setfield\FieldValue{#2}{#1}{}{}{#3}{\@@DriverFieldMode\@@DriverFieldFree\@@DriverFieldAuto}{}{\@@DriverFieldDefault}}%
+ \processcommalist[#4]\docommand
+ \else
+ \writestatus\m!fields{pass values too}%
+ \fi}
+
+\def\definesubfield
+ {\dotripleempty\dodefinesubfield}
+
+\def\dodefinesubfield[#1][#2][#3]% for the moment only radio ones
+ {\ifsecondargument
+ \def\docommand##1%
+ {\getfield{##1}%
+ \ifx\@@DriverFieldType\empty
+ \writestatus\m!fields{unknown field ##1}% to do
+ \else
+ \doifsomething{#2}
+ {\edef\@@DriverFieldGroup{#2}}%
+ \doifelsenothing{#3}
+ {\definedefaultsymbols
+ \def\@@DriverFieldValues{defaultyes}}
+ {\def\@@DriverFieldValues{#3}}%
+ \changefield{##1}%
+ \fi}%
+ \processcommalist[#1]\docommand
+ \else
+ \writestatus\m!fields{pass fieldname, setupgroup, values and default}%
+ \fi}
+
+\def\doclonefield[#1][#2][#3][#4]% parent children setupgroup values
+ {\ifsecondargument
+ \getfield{#1}%
+\iftrialtypesetting\else
+ \ifx\@@DriverFieldType\empty
+ \writestatus\m!fields{unknown field #1}%
+ \else
+ \let\@@DriverFieldMode\fieldparentmode
+ %\def\docommand##1{\addtocommalist{##1}\@@DriverFieldKids}%
+ \def\docommand##1{\appendtocommalist{##1}\@@DriverFieldKids}%
+ \processcommalist[#2]\docommand
+ \changefield{#1}%
+ \let\@@DriverFieldAutoParent\@@DriverFieldAuto
+ \def\@@DriverFieldParent{#1}%
+ \let\@@DriverFieldKids\empty
+ \let\@@DriverFieldRoot\empty
+ \let\@@DriverFieldMode\fieldchildmode
+ \def\@@DriverFieldFree{0}%
+ \def\@@DriverFieldAuto{0}%
+ \doifsomething{#3}{\edef\@@DriverFieldGroup{#3}}%
+ \doifsomething{#4}{\edef\@@DriverFieldValues{#4}}%
+ \def\docommand##1%
+ {\ifcase\@@DriverFieldAutoParent\else
+ \setmainfieldkid{\@@DriverFieldParent}{##1}%
+ \fi
+ \changefield{##1}}%
+ \processcommalist[#2]\docommand
+ \fi
+\fi
+ \else
+ \writestatus\m!fields{pass parent field and clones}%
+ \fi}
+
+\def\clonefield
+ {\doquadrupleempty\doclonefield}
+
+\def\docopyfield[#1][#2]% parent children
+ {\ifsecondargument
+ \getfield{#1}%
+\iftrialtypesetting\else
+ \ifx\@@DriverFieldType\empty
+ \writestatus\m!fields{unknown field #1}%
+ \else
+ \let\@@DriverFieldMode\fieldparentmode
+ %\def\docommand##1{\addtocommalist{##1}\@@DriverFieldKids}%
+ \def\docommand##1{\appendtocommalist{##1}\@@DriverFieldKids}%
+ \processcommalist[#2]\docommand
+ \changefield{#1}%
+ \let\@@DriverFieldAutoParent\@@DriverFieldAuto
+ \def\@@DriverFieldParent{#1}%
+ \let\@@DriverFieldKids\empty
+ \let\@@DriverFieldRoot\empty
+ \let\@@DriverFieldMode\fieldcopymode
+ \def\@@DriverFieldFree{0}%
+ \def\@@DriverFieldAuto{0}%
+ \def\docommand##1%
+ {\ifcase\@@DriverFieldAutoParent\else
+ \setmainfieldkid{\@@DriverFieldParent}{##1}%
+ \fi
+ \changefield{##1}}%
+ \processcommalist[#2]\docommand
+ \fi
+\fi
+ \else
+ \writestatus\m!fields{pass parent field and copies}%
+ \fi}
+
+\def\copyfield{\dodoubleempty\docopyfield}
+
+\unexpanded\def\field {\dotripleempty\dofield[\dohandlefield]}
+\unexpanded\def\fitfield{\dotripleempty\dofield[\dohandlefitfield]}
+
+\def\dofield[#1][#2][#3]%
+ {\iffirstargument
+ \bgroup
+ \getfield{#2}%
+ \ifsecondargument
+ \def\@@DriverFieldLabel{#3}%
+ \else
+ \let\@@DriverFieldLabel\@@DriverFieldName
+ \fi
+ \ifx\@@DriverFieldType\empty
+ \writestatus\m!fields{unknown field #2}%
+ \else\ifcase\@@DriverFieldFree\relax
+ \doifdefinedelse{\strippedcsname\setupfield\@@DriverFieldGroup}
+ {\let\dosetupfield=#1\getvalue{\strippedcsname\setupfield\@@DriverFieldGroup}}
+ {#1[\@@DriverFieldName][\v!label,\v!frame,\v!horizontal][][][]}%
+\iftrialtypesetting\else
+ \def\@@DriverFieldFree{1}%
+ \changefield{#2}%
+\fi
+ \else\ifcase\@@DriverFieldAuto\relax
+ % \writestatus\m!fields{field #2 already typeset}%
+ \else
+ % \writestatus\m!fields{field #2 automatically copied}%
+ \nextsystemfield
+ \copyfield[\@@DriverFieldName][\currentsystemfield]%
+ \dotripleempty\dofield[#1][\currentsystemfield][#3]% get the if's right
+ \fi\fi\fi
+ \egroup
+ \fi}
+
+\def\typesetfield
+ {\useJSscripts[fld]%
+ \ifx\@@DriverFieldRoot\empty \else
+ \let\@@SavedFieldName\@@DriverFieldName
+ \getfield\@@DriverFieldRoot
+ \ifcase\@@DriverFieldFree\relax
+ \dosetfieldstatus\@@DriverFieldMode\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldRoot
+ \dopresetrecord
+\iftrialtypesetting\else
+ \def\@@DriverFieldFree{1}%
+ \changefield\@@DriverFieldName
+\fi
+ \fi
+ \getfield\@@SavedFieldName
+ \fi
+ \ifx\@@DriverFieldKids\empty
+ \donefalse
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \let\@@DriverFieldParent\@@DriverFieldName
+ %\addtocommalist\@@DriverFieldParent\@@DriverFieldKids
+ \appendtocommalist\@@DriverFieldParent\@@DriverFieldKids
+ \dosetfieldstatus\@@DriverFieldMode\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldRoot
+ \dopresetfield
+ \let\@@DriverFieldMode\fieldchildmode
+ \fi
+ \dosetfieldstatus\@@DriverFieldMode\@@DriverFieldParent\@@DriverFieldKids\@@DriverFieldRoot
+ \dopresetfield}
+
+\def\dopresetfield
+ {\iftrialtypesetting\else\iflocation\getvalue{preset\@@DriverFieldType field}\fi\fi}
+
+\def\dopresetrecord
+ {\iftrialtypesetting\else\iflocation\getvalue{preset\@@DriverFieldType record}\fi\fi}
+
+\def\dodefinethefieldset[#1][#2]%
+ {\dodefinefieldset{#1}{#2}}
+
+\def\definefieldset%
+ {\dodoubleargument\dodefinethefieldset}
+
+\def\normaldodosetupfield[#1][#2][#3][#4][#5]%
+ {\doifdefinedelse{\strippedcsname\setupfield#1}
+ {\pushmacro\dosetupfield
+ \def\dosetupfield[##1][##2][##3][##4][##5]%
+ {\setvalue{\strippedcsname\setupfield#1}{\dosetupfield[#1][##2,#2][##3,#3][##4,#4][##5,#5]}}%
+ \getvalue{\strippedcsname\setupfield#1}%
+ \popmacro\dosetupfield}
+ {\setvalue{\strippedcsname\setupfield#1}{\dosetupfield[#1][#2][#3][#4][#5]}}}
+
+\let\dodosetupfield\normaldodosetupfield
+
+\def\donosetupfield[#1][#2][#3][#4][#5]%
+ {\setvalue{\strippedcsname\setupfield#1}{\dosetupfield[#1][#2][#3][#4][#5]}}
+
+\def\dosetupfield[#1][#2][#3][#4][#5]%
+ {\iffifthargument
+ \def\docommand##1{\dodosetupfield[##1][#2][#3][#4][#5]}%
+ \processcommalist[#1]\docommand
+ \else\ifthirdargument
+ \def\docommand##1{\dodosetupfield[##1][#2][][][#3]}%
+ \processcommalist[#1]\docommand
+ \else\ifsecondargument
+ \doifelse{#2}\v!reset
+ {\def\docommand##1{\donosetupfield[#1][][][][]}}
+ {\def\docommand##1{\dodosetupfield[##1][][][][#2]}}%
+ \processcommalist[#1]\docommand
+ \else\iffirstargument
+ \def\docommand##1{\dodosetupfield[##1][][][][]}%
+ \processcommalist[#1]\docommand
+ \else
+ \writestatus\m!fields{provide either 1, 2, 3 or 5 arguments}%
+ \fi\fi\fi\fi}
+
+\def\setupfield
+ {\doquintupleempty\dosetupfield}
+
+\def\dosetupfields[#1][#2][#3][#4]%
+ {\ifsecondargument
+ \def\dodosetupfield[##1][##2][##3][##4][##5]%
+ {\doifdefinedelse{\strippedcsname\setupfield##1}
+ {\def\dosetupfield[####1][####2][####3][####4][####5]%
+ {\setvalue{\strippedcsname\setupfield##1}{\dosetupfield[##1][#1,####2,##2][#2,####3,##3][#3,####4,##4][#4,####5,##5]}}%
+ \getvalue{\strippedcsname\setupfield##1}}
+ {\setvalue{\strippedcsname\setupfield##1}{\dosetupfield[##1][#1,##2][#2,##3][#3,##4][#4,##5]}}}%
+ \else\iffirstargument
+ \doifelse{#1}\v!reset
+ {\resetfields}
+ {\setupfields[][][][#1]}% checken
+ \else
+ \writestatus\m!fields{provide either 1 or 4 arguments}%
+ \fi\fi}
+
+\def\setupfields
+ {\doquadrupleempty\dosetupfields}
+
+\def\resetfields
+ {\let\dodosetupfield\normaldodosetupfield}
+
+% \setupfields[\v!reset]
+
+% opties: veld, label, kader, vertikaal/horizontaal
+
+\newif\ifShowFieldLabel
+\newif\ifShowFieldFrame
+\newif\ifVerticalField
+\newif\ifHorizontalField
+
+% way to slow/complicated, we need some simple alternative
+% as well
+
+\def\dohandlefield[#1][#2][#3][#4][#5]%
+ {\presetlocalframed[\??fd]%
+ \processallactionsinset
+ [#2]
+ [ \v!reset=>\ShowFieldLabelfalse\ShowFieldFramefalse
+ \HorizontalFieldfalse\VerticalFieldfalse,
+ \v!label=>\ShowFieldLabeltrue,
+ \v!frame=>\ShowFieldFrametrue,
+ \v!horizontal=>\HorizontalFieldtrue,
+ \v!vertical=>\VerticalFieldtrue]%
+ \ifVerticalField
+ \getparameters[\??fd]
+ [\c!distance=\!!zeropoint,\c!inbetween=\vskip\@@localoffset,
+ \c!align=\v!right,\c!width=20em]%
+ \else\ifHorizontalField
+ \getparameters[\??fd]
+ [\c!distance=\@@localoffset,\c!inbetween=,\c!align=\c!left,
+ \c!height=10ex]%
+ \else
+ \getparameters[\??fd]
+ [\c!distance=\!!zeropoint,\c!inbetween=,\c!align=\c!left]%
+ \fi\fi
+ \getparameters[\??fd]
+ [\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=,#3]%
+ \reshapeframeboxfalse % else ugly spacing
+ \ifShowFieldFrame
+ \localframed[\??fd][\c!strut=\v!no,\c!align=]\bgroup
+ \else
+ \vbox\bgroup
+ \fi
+ \dontcomplain
+ \ifShowFieldLabel
+ \setbox0\hbox
+ {\reshapeframeboxtrue % else wrong dimensions
+ \framed
+ [\c!style=,\c!color=,\c!align=\c!right,#4]
+ {\@@DriverFieldLabel}}%
+ \fi
+ \setbox2\hbox
+ {\reshapeframeboxtrue % else wrong dimensions
+ \ifVerticalField
+ \setupframed[\c!height=6ex,\c!width=\hsize]%
+ \else\ifHorizontalField
+ \setupframed[\c!height=\vsize,\c!width=20em]%
+ \else
+ \setupframed[\c!height=2cm,\c!width=2cm]%
+ \fi\fi
+ \framed
+ [\c!align=\v!right,\c!strut=\v!no,#5]
+ {\getparameters
+ [\??fd]
+ [\c!color=,\c!style=,\c!align=\v!right,\c!option=,
+ \c!clickin=,\c!clickout=,\c!regionin=,\c!regionout=,
+ \c!afterkey=,\c!format=,\c!validate=,\c!calculate=,
+ \c!focusin=,\c!focusout=,
+ \c!fieldoffset=\!!zeropoint,\c!fieldbackgroundcolor=,
+ \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5]%
+ \scratchdimen\framedwidth \edef\@@DriverFieldWidth {\the\scratchdimen}%
+ \scratchdimen\framedheight\edef\@@DriverFieldHeight{\the\scratchdimen}%
+ \vfill
+ \hbox{\lower\@@fdfieldoffset\hbox{\typesetfield}}
+ \vss}}%
+ \ifShowFieldLabel
+ \ifVerticalField
+ \vbox
+ {\copy0
+ \@@fdinbetween
+ \copy2}%
+ \else
+ \hbox
+ {\vbox \ifdim\ht2>\ht0 to \ht2 \fi
+ {\@@fdbefore
+ \copy0
+ \@@fdafter}%
+ \hskip\@@fddistance
+ \vbox \ifdim\ht0>\ht2 to \ht0 \fi
+ {\@@fdbefore
+ \box2
+ \@@fdafter}}%
+ \fi
+ \else
+ \box2
+ \fi
+ \egroup}
+
+\chardef\fitfieldmode\plusone % 3 = best
+
+\def\dohandlefitfield[#1][#2][#3][#4][#5]% alleen check
+ {\presetlocalframed[\??fd]%
+ \localframed
+ [\??fd]
+ [\c!n=1024, % beware: weblink plug in truncates
+ \c!strut=\v!no,\c!color=,\c!style=,\c!option=,
+ \c!clickin=,\c!clickout=,\c!regionin=,\c!regionout=,
+ \c!focusin=,\c!focusout=,
+ \c!afterkey=,\c!format=,\c!validate=,\c!calculate=,
+ \c!fieldoffset=\!!zeropoint,\c!fieldbackgroundcolor=,
+ \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5,\c!align=]
+ {\dogetcommacommandelement1\from\@@DriverFieldValues\to\@@DriverFieldValue
+ \ifx\@@DriverFieldValue\empty
+ \let\@@DriverFieldValue\@@DriverFieldDefault
+ \fi
+ \dopresetfieldsymbol\@@DriverFieldValue
+ \setbox\scratchbox\hbox{\dogetfieldsymbol\@@DriverFieldValue}%
+ \scratchdimen\wd\scratchbox \edef\@@DriverFieldWidth {\the\scratchdimen}%
+ \scratchdimen\ht\scratchbox \edef\@@DriverFieldHeight{\the\scratchdimen}%
+ \ifcase\fitfieldmode
+ \typesetfield
+ \or % 1 = ignore depth (original, assumed no depth, actually a bug)
+ \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}%
+ \or % 2 = add depth to height, but no depth in result
+ \advance\scratchdimen\dp\scratchbox \edef\@@DriverFieldHeight{\the\scratchdimen}%
+ \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}%
+ \or % 3 = add depth to height, and apply depth to result
+ \advance\scratchdimen\dp\scratchbox \edef\@@DriverFieldHeight{\the\scratchdimen}%
+ \hbox to \wd\scratchbox{\lower\dp\scratchbox\hbox{\typesetfield}\hfill}%
+ \fi}}
+
+%D Common stuff
+
+\newcounter\nofsystemfields
+
+\def\nextsystemfield
+ {\doglobal\increment\nofsystemfields
+ \def\currentsystemfield{sys::\nofsystemfields}}
+
+%D An example:
+
+\def\fillinfield
+ {\dosingleempty\dofillinfield}
+
+\def\dofillinfield[#1]#2%
+ {\dontleavehmode
+ \hbox
+ {\forgetall
+ \setupfields[\v!reset]%
+ \nextsystemfield
+ \useJSscripts[ans]%
+ \doifelsenothing{#1}
+ {\def\therightanswer{#2}}
+ {\def\therightanswer{#1}}%
+ \setbox0\hbox{#2}%
+ \setbox2\hbox{\therightanswer}%
+ \dimen0=\ifdim\wd0>\wd2 \wd0 \else \wd2 \fi
+ \advance\dimen0 .2em
+ \definefield
+ [\currentsystemfield][line][systemfield]%
+ \setupfield
+ [systemfield]
+ [\c!n=1024, % beware: weblink plugin truncates
+ \c!location=\v!low,\c!strut=\v!yes,\c!fieldoffset=0pt,
+ \c!height=1.2\openlineheight,\c!width=\dimen0,\c!offset=\v!overlay,
+ \c!style=,\c!align=\v!middle,\c!frame=\v!off,
+ \c!color=red,\c!fieldbackgroundcolor=\s!white,\c!fieldframecolor=blue,
+ \c!validate=JS(Check_Answer{\currentsystemfield,\therightanswer})]%
+ \switchtobodyfont
+ [\c!small]%
+ \hbox to \wd0
+ {\copy0\hskip-\wd0\hss\field[\currentsystemfield]\hss}}}
+
+%D and another one:
+
+\def\tooltip
+ {\dosingleempty\dotooltip}
+
+\def\dotooltip[#1]#2#3%
+ {\bgroup
+ \setupfields[\v!reset]%
+ \useJSscripts[fld]%
+ \setbox0\hbox
+ {\dontcomplain
+ \nextsystemfield
+ \setbox0\hbox{#2}%
+ \definesymbol
+ [\currentsystemfield:txt]
+ [{\inframed[\c!frame=\v!off,\c!background=\v!screen]{#3}}]%
+ \setbox2\hbox{\symbol[\currentsystemfield:txt]}%
+ \definefield
+ [\currentsystemfield:txt][check]
+ [dummy][\currentsystemfield:txt][\currentsystemfield:txt]%
+ \setupfield
+ [dummy]
+ [\c!frame=\v!off,
+ \c!regionout=JS(Hide_Field{\currentsystemfield:txt}),
+ \c!option=\v!hidden]%
+ \hbox to \zeropoint
+ {\dimen0\wd2\advance\dimen0 -\wd0
+ \doifelse{#1}\v!left
+ {\hskip-\dimen0}
+ {\doif{#1}\v!middle
+ {\hskip-.5\dimen0}}%
+ \lower\openlineheight\hbox to \zeropoint
+ {\fitfield[\currentsystemfield:txt]}}%
+ \dimen0=\ifdim\wd0=\zeropoint 3em\else\wd0\fi
+ \definesymbol
+ [\currentsystemfield:but]
+ [{\framed[\c!height=2ex,\c!width=\dimen0,\c!frame=\v!off]{}}]%
+ \definefield
+ [\currentsystemfield:but][push]
+ [dummy][\currentsystemfield:but][\currentsystemfield:but]%
+ \setupfield
+ [dummy]
+ [\c!frame=\v!off,
+ \c!option=,
+ \c!regionin=JS(Vide_Field{\currentsystemfield:txt}),
+ \c!regionout=JS(Hide_Field{\currentsystemfield:txt}),
+ \c!fieldlayer=\@@iafieldlayer]%
+ \lower2ex\hbox to \zeropoint
+ {\fitfield[\currentsystemfield:but]}%
+ #2}%
+ \ht0\strutht\dp0\strutdp\box0
+ \egroup}
+
+%D And one more:
+
+\def\definefieldstack
+ {\dotripleargument\dodefinefieldstack}
+
+\def\dodefinefieldstack[#1][#2][#3]% name, symbols, settings
+ {\doifundefined{fieldstack:#1}
+ {\setgvalue{fieldstack:#1}{\dodofieldstack[#1][#2][#3]}}}
+
+\def\dodofieldstack[#1][#2][#3]% start=n, 0 == leeg
+ {\bgroup
+ \getparameters[\??fd][\c!start=1,#3]%
+ \setupfields[\v!reset]%
+ \definesymbol[\v!empty][]%
+ \useJSscripts[fld][FieldStack]%
+ \newcounter\stackedfieldnumber
+ \def\dododofieldstack##1%
+ {\increment\stackedfieldnumber
+ \ifnum\stackedfieldnumber=\@@fdstart\relax
+ \definefield[#1:\stackedfieldnumber][check][#1][##1,\v!empty][##1]%
+ \else
+ \definefield[#1:\stackedfieldnumber][check][#1][##1,\v!empty][\v!empty]%
+ \fi}%
+ \processcommalist[#2]\dododofieldstack
+ \setupfield[#1][\v!reset]% added
+ \setupfield[#1][\c!option=\v!readonly,#3]% #3 swapped
+ \newcounter\stackedfieldnumber
+ \def\dododofieldstack##1%
+ {\doglobal\increment\stackedfieldnumber
+ \fitfield[#1:\stackedfieldnumber]\egroup\bgroup}%
+ \startoverlay
+ \bgroup
+ \globalprocesscommalist[#2]\dododofieldstack
+ \egroup
+ \stopoverlay
+ \egroup}
+
+\def\dofieldstack[#1][#2][#3]%
+ {\ifsecondargument
+ \dodefinefieldstack[#1][#2][#3]\fieldstack[#1]%
+ \else
+ \getvalue{fieldstack:#1}\setgvalue{fieldstack:#1}{[#1]}%
+ \fi}
+
+\def\fieldstack
+ {\dotripleempty\dofieldstack}
+
+%D When submitting a form, we need to tell the driver module
+%D that we want \FDF\ or \HTML.
+
+\def\setupforms
+ {\dodoubleargument\getparameters[\??fr]}
+
+\def\checksubmitform#1%
+ {\setsubmitoutputformat\@@frmethod}
+
+\setexecutecommandcheck {submitform} \checksubmitform
+
+\setupforms
+ [\c!method=HTML]
+
+%D Goodie:
+
+\def\definepushbutton % name optional setup
+ {\dodoubleempty\dodefinepushbutton}
+
+\def\dodefinepushbutton[#1][#2]% name setup
+ {\dododefinepushbutton{#1}{n}{push}%
+ \dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}%
+ \dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}%
+ \setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}}
+
+\def\dododefinepushbutton#1#2#3%
+ {\doifsymboldefinedelse{psym:#1:#2}%
+ \donothing{\definesymbol[psym:#1:#2][{#3}]}}
+
+\def\definepushsymbol
+ {\dotripleargument\dodefinepushsymbol}
+
+\def\dodefinepushsymbol[#1][#2]% [#3]
+ {\definesymbol[psym:#1:#2]}
+
+\def\dopushbutton[#1][#2]%
+ {\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}}
+
+\def\pushbutton
+ {\dodoubleargument\dopushbutton}
+
+\def\dohandlepushbutton#1#2#3% identifier setup script
+ {\bgroup
+ \nextsystemfield
+ \setupfield
+ [pushbutton]
+ [\c!frame=\v!overlay,
+ \c!offset=\v!overlay,
+ \c!clickout=#3,#2]%
+ \definefield
+ [\currentsystemfield]
+ [push]
+ [pushbutton]
+ [psym:#1:n,psym:#1:r,psym:#1:d]%
+ \fitfield
+ [\currentsystemfield]%
+ \egroup}
+
+% \def\do@@ampsh
+% {\dodoubleargument\dodo@@ampsh}
+%
+% \def\dodo@@ampsh[#1][#2]#3\\%
+% {\txt\pushbutton[#1][#2]\\}%
+%
+%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands
+
+\def\@@ampsh{\txt\pushbutton}
+
+\appendtoks \let\psh\@@ampsh \to \everysetmenucommands
+
+% \definepushbutton [reset]
+%
+% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}]
+% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}]
+%
+% \startinteractionmenu[bottom]
+% \psh [reset] [JS(reset_something)] \\
+% \stopinteractionmenu
+
+%D Another goodie:
+
+% \definecolor[rollover:n][red]
+% \definecolor[rollover:r][green]
+% \definecolor[rollover:d][blue]
+
+\definepalet
+ [rollover]
+ [n=red,
+ r=green,
+ d=blue]
+
+\newcounter\nofrollovers
+\newcounter\nofrollbuttons
+
+\def\dorollbutton[#1][#2]#3[#4]%
+ {\dontleavehmode
+ \bgroup
+ \doglobal\increment\nofrollovers
+ \doglobal\increment\nofrollbuttons
+ \unexpanded\def\dosetlocationbox[##1]##2[##3]%
+ {\getparameters[##1][##3]%
+ \definecolor[rollover][rollover:##2]%
+ \doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox
+ {\localframed[##1]
+ [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
+ {\dolocationattributes{##1}\c!style\c!color{#3}}}}%
+ \iffirstargument
+ \ifsecondargument
+ \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}%
+ \else
+ \doifassignmentelse{#1}
+ {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}}
+ {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}%
+ \fi
+ \else
+ \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}%
+ \fi
+ % todo: share symbols, tricky since different dimensions
+ \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]%
+ \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]%
+ \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]%
+ \setupfield
+ [rollbutton]
+ [\c!frame=\v!off,
+ \c!offset=\v!overlay,
+ \c!clickout={#4}]%
+ \definefield
+ [roll:\nofrollbuttons][push][rollbutton]
+ [rsym:\nofrollovers:n,%
+ rsym:\nofrollovers:r,%
+ rsym:\nofrollovers:d]%
+ \fitfield[roll:\nofrollbuttons]%
+ \egroup}
+
+\unexpanded\def\rollbutton
+ {\dodoubleempty\dorollbutton}
+
+\def\menu@rob[#1]#2\\%
+ {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}%
+
+\appendtoks \let\rob\menu@rob \to \everysetmenucommands
+
+% calls:
+% {..} [JS..]
+% [left] {..} [JS..]
+% [a=b] {..} [JS..]
+% [left] [a=b] {..} [JS..]
+%
+% \setupbuttons[offset=0pt,frame=off] % alternative=hidden
+%
+% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})]
+% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})]
+% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})]
+% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})]
+% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})]
+%
+% \rob [JS(...)] bla bla \\
+
+\unexpanded\def\overlayrollbutton
+ {\dodoubleargument\dooverlayrollbutton}
+
+\def\dooverlayrollbutton[#1][#2]%
+ {\bgroup
+ \nextsystemfield
+ \setupfield
+ [overlayrollbutton]
+ [\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]%
+ \definesymbol
+ [\currentsystemfield]
+ [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]%
+ \definefield
+ [\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]%
+ \fitfield[\currentsystemfield]%
+ \egroup}
+
+% \defineoverlay
+% [ShowMenu]
+% [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}]
+
+\protect \endinput
diff --git a/tex/context/base/scrn-fld.mkiv b/tex/context/base/scrn-fld.mkiv
new file mode 100644
index 000000000..f895089e8
--- /dev/null
+++ b/tex/context/base/scrn-fld.mkiv
@@ -0,0 +1,686 @@
+%D \module
+%D [ file=scrn-fld,
+%D version=1997.05.18,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Fields,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Screen Macros / Fields}
+
+\unprotect
+
+%D First we hook fields into the (viewer based) layering mechanism
+%D (implemented as properties).
+
+\appendtoks
+ \doif\@@iafieldlayer\v!auto{\def\@@iafieldlayer{\currentviewerlayer}}%
+\to \everysetupinteraction
+
+\setupinteraction
+ [\c!fieldlayer=\v!auto] % auto by default
+
+%D \starttyping
+%D \definefield [name] [type] [group] [values] [default]
+%D
+%D \definefield [WWWW] [text] [textsetup] [default text]
+%D \definefield [XXXX] [push] [pushsetup] [yes,no] [yes]
+%D \definefield [XXXX] [check] [checksetup] [yes,no] [yes]
+%D \definefield [YYYY] [combo] [combosetup] [a,b,c,d] [b]
+%D \definefield [ZZZZ] [radio] [radiosetup] [W,X,Y,Z] [Y]
+%D
+%D \definesubfield [W] [subsetup] [p,q]
+%D \definesubfield [X,Y] [subsetup] [p,r]
+%D \definesubfield [Z] [subsetup] [y,z]
+%D
+%D evt \definemainfield ... wanneer geplaatst voor subs gegeven
+%D
+%D \clonefield [XXXX] [XX,YY] [mysetup] [on,off]
+%D \clonefield [Z] [AA,BB] [somesetup] [true,false]
+%D \clonefield [Z] [CC,DD] [anothersetup]
+%D
+%D \copyfield [XXXX] [PP,QQ,RR]
+%D
+%D \field[XXXX]
+%D \fitfield[XXXX]
+%D \stoptyping
+
+%D Internal command, linked to \type{\definesymbol}.
+
+\def\dogetfieldsymbol#1%
+ {\getobject{SYM}{#1}}
+
+\def\dopresetfieldsymbol#1%
+ {\doifobjectfoundelse{SYM}{#1}
+ {}
+ {\settightobject{SYM}{#1}\hbox{\symbol[#1]}%
+ \flushatshipout
+ {\setbox0\hbox{\hskip-\maxdimen\getobject{SYM}{#1}}%
+ \smashbox0\box0}}}
+
+\def\presetfieldsymbols[#1]% slow
+ {\def\dopresetfieldsymbols##1{\processcommalist[##1]\dopresetfieldsymbol}%
+ \@EA\processcommalist\@EA[#1]\dopresetfieldsymbols}
+
+\unexpanded\def\definedefaultsymbols
+ {\definesymbol[defaultyes][\mathematics{\times}]%
+ \definesymbol[defaultno ][\mathematics{\cdot }]}
+
+\def\resetfieldsymbol[#1]% for experimental usage only
+ {\resetobject{SYM}{#1}}
+
+%D The interface to the specials. DEFAULT NOG ANDERS
+
+\def\typesetfield
+ {\bgroup
+ \dosetfontattribute\??fd\c!style
+ \ctxlua{backends.codeinjections.typesetfield("\currentfieldname", {
+ title = "\currentfieldname",
+ width = \number\dimexpr\@@fdwidth\relax,
+ height = \number\dimexpr\@@fdheight\relax,
+ align = "\@@fdalign",
+ length = tonumber("\@@fdn") or 0,
+ style = "\@@fdstyle",
+ fontstyle = "\fontstyle",
+ fontalternative = "\fontalternative",
+ fontsize = "\currentfontbodysize",
+ color = "\@@fdcolor",
+ backgroundcolor = "\@@fdfieldbackgroundcolor",
+ framecolor = "\@@fdfieldframecolor",
+ layer = "\@@fdfieldlayer",
+ options = "\@@fdoption",
+ align = "\@@fdalign",
+ clickin = "\@@fdclickin",
+ clickout = "\@@fdclickout",
+ regionin = "\@@fdregionin",
+ regionout = "\@@fdregionout",
+ afterkey = "\@@fdafterkey",
+ format = "\@@fdformat",
+ validate = "\@@fdvalidate",
+ calculate = "\@@fdcalculate",
+ focusin = "\@@fdfocusin",
+ focusout = "\@@fdfocusout",
+ }) }%
+ \egroup}
+
+\unexpanded\def\definefieldset {\dodoubleargument\dodefinefieldset}
+\unexpanded\def\definefield {\doquintupleempty\dodefinefield}
+\unexpanded\def\definemainfield{\doquintupleempty\dodefinefield} % redundant
+\unexpanded\def\definesubfield {\dotripleempty \dodefinesubfield}
+\unexpanded\def\clonefield {\doquadrupleempty\doclonefield}
+\unexpanded\def\copyfield {\dodoubleempty \docopyfield}
+\unexpanded\def\field {\dodoubleempty \donormalfield}
+\unexpanded\def\fitfield {\dodoubleempty \dofitfield}
+\unexpanded\def\setupfield {\doquintupleempty\dosetupfield}
+\unexpanded\def\setupfields {\doquadrupleempty\dosetupfields}
+
+% misc
+
+% \appendtoks\ctxlua{backends.codeinjections.finishfields()}\to\everylastshipout
+
+% testing
+
+\def\doiffieldelse #1{\ctxlua{backends.codeinjections.doiffieldelse("#1")}}
+\def\doiffieldgroupelse#1{\ctxlua{backends.codeinjections.doiffieldgroupelse("#1")}}
+
+% definition
+
+\def\dodefinefield[#1][#2][#3][#4][#5]% [name] [kind] [group] [values] [default] | [name] [kind] [group] [default]
+ {\ctxlua{backends.codeinjections.definefield{ variant="normal", name="#1", kind="#2", group="#3", values=\!!bs#4\!!es, default=\!!bs#5\!!es }}}
+
+\def\dodefinesubfield[#1][#2][#3]% [name] [group] [values]
+ {\ctxlua{backends.codeinjections.definefield{ variant="normal", name="#1", kind="sub", group="#2", values=\!!bs#3\!!es }}}
+
+\def\doclonefield[#1][#2][#3][#4]% [parent] [children] [group] [values]
+ {\ctxlua{backends.codeinjections.clonefield{ variant="clone", parent="#1", children="#2", group="#3", values=\!!bs#4\!!es }}}
+
+\def\docopyfield[#1][#2]% [parent] [children]
+ {\ctxlua{backends.codeinjections.clonefield{ variant="copy", parent="#1", children="#2" }}}
+
+\def\dodefinefieldset[#1][#2]%
+ {\ctxlua{backends.codeinjections.definefieldset("#1","#2")}}
+
+% usage
+%
+% \iftrialtypesetting
+%
+% just a default setup
+
+\def\loadfieldscripts{\useJSscripts[fld]\globallet\loadfieldscripts\relax}
+
+\def\donormalfield{\doprocessfield\dohandlefield}
+\def\dofitfield {\doprocessfield\dohandlefitfield}
+
+\def\dosetupfieldindeed#1#2[#3]% [#4][#5][#6][#7]%
+ {#1[#2]} % [#4][#5][#6][#7]}
+
+\def\doprocessfield#1[#2][#3]% \method [name] [label]
+ {\dontleavehmode
+ \begingroup
+ \loadfieldscripts
+ \edef\currentfieldname {#2}%
+ \edef\currentfieldlabel{#3}%
+ \edef\currentfieldgroup{\ctxlua{backends.codeinjections.getfieldgroup("#2")}}%
+ \ifx\currentfieldlabel\empty
+ \let\currentfieldlabel\currentfieldname
+ \fi
+ \ifx\currentfieldgroup\empty
+ #1[#2][\v!label,\v!frame,\v!horizontal][][][]%
+ \else
+ \def\dosetupfield{\dosetupfieldindeed{#1}{#2}}%
+ \getvalue{\??fd::\currentfieldgroup}%
+ \fi
+ \endgroup}
+
+% setups
+
+\def\dosetupfield[#1][#2][#3][#4][#5]%
+ {\iffifthargument
+ \def\docommand##1{\dodosetupfield[##1][#2][#3][#4][#5]}%
+ \processcommalist[#1]\docommand
+ \else\ifthirdargument
+ \def\docommand##1{\dodosetupfield[##1][#2][][][#3]}%
+ \processcommalist[#1]\docommand
+ \else\ifsecondargument
+ \doifelse{#2}\v!reset
+ {\def\docommand##1{\donosetupfield[#1][][][][]}}
+ {\def\docommand##1{\dodosetupfield[##1][][][][#2]}}%
+ \processcommalist[#1]\docommand
+ \else\iffirstargument
+ \def\docommand##1{\dodosetupfield[##1][][][][]}%
+ \processcommalist[#1]\docommand
+ \else
+ \writestatus\m!fields{provide either 1, 2, 3 or 5 arguments}%
+ \fi\fi\fi\fi}
+
+\def\normaldodosetupfield[#1][#2][#3][#4][#5]%
+ {\ifcsname\??fd::#1\endcsname
+ \pushmacro\dosetupfield
+ \def\dosetupfield[##1][##2][##3][##4][##5]{\setvalue{\??fd::#1}{\dosetupfield[#1][##2,#2][##3,#3][##4,#4][##5,#5]}}%
+ \getvalue{\??fd::#1}%
+ \popmacro\dosetupfield
+ \else
+ \setvalue{\??fd::#1}{\dosetupfield[#1][#2][#3][#4][#5]}%
+ \fi}
+
+\let\dodosetupfield\normaldodosetupfield
+
+\def\donosetupfield[#1][#2][#3][#4][#5]%
+ {\setvalue{\??fd::#1}{\dosetupfield[#1][#2][#3][#4][#5]}}
+
+\def\dosetupfields[#1][#2][#3][#4]%
+ {\ifsecondargument
+ \def\dodosetupfield[##1][##2][##3][##4][##5]%
+ {\ifcsname\??fd::##1\endcsname
+ \def\dosetupfield[####1][####2][####3][####4][####5]%
+ {\setvalue{\??fd::##1}{\dosetupfield[##1][#1,####2,##2][#2,####3,##3][#3,####4,##4][#4,####5,##5]}}%
+ \getvalue{\??fd::##1}%
+ \else
+ \setvalue{\??fd::##1}{\dosetupfield[##1][#1,##2][#2,##3][#3,##4][#4,##5]}%
+ \fi}%
+ \else\iffirstargument
+ \doifelse{#1}\v!reset
+ {\resetfields}
+ {\setupfields[][][][#1]}% checken
+ \else
+ \writestatus\m!fields{provide either 1 or 4 arguments}%
+ \fi\fi}
+
+\def\resetfields
+ {\let\dodosetupfield\normaldodosetupfield}
+
+% \setupfields[\v!reset]
+
+% opties: veld, label, kader, vertikaal/horizontaal
+
+\newif\ifShowFieldLabel
+\newif\ifShowFieldFrame
+\newif\ifVerticalField
+\newif\ifHorizontalField
+
+% way to slow/complicated, we need some simple alternative
+% as well
+
+\def\dohandlefield[#1][#2][#3][#4][#5]%
+ {\presetlocalframed[\??fd]%
+ \processallactionsinset
+ [#2]
+ [ \v!reset=>\ShowFieldLabelfalse\ShowFieldFramefalse\HorizontalFieldfalse\VerticalFieldfalse,
+ \v!label=>\ShowFieldLabeltrue,
+ \v!frame=>\ShowFieldFrametrue,
+ \v!horizontal=>\HorizontalFieldtrue,
+ \v!vertical=>\VerticalFieldtrue]%
+ \ifVerticalField
+ \getparameters[\??fd][\c!distance=\zeropoint,\c!inbetween=\vskip\@@localoffset,\c!align=\v!right,\c!width=20em]%
+ \else\ifHorizontalField
+ \getparameters[\??fd][\c!distance=\@@localoffset,\c!inbetween=,\c!align=\c!left,\c!height=10ex]%
+ \else
+ \getparameters[\??fd][\c!distance=\zeropoint,\c!inbetween=,\c!align=\c!left]%
+ \fi\fi
+ \getparameters[\??fd][\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=,#3]%
+ \ifShowFieldFrame
+ \localframed[\??fd][\c!strut=\v!no,\c!align=]\bgroup
+ \else
+ \vbox\bgroup
+ \fi
+ \dontcomplain
+ \ifShowFieldLabel
+ \setbox0\hbox
+ {\reshapeframeboxtrue % else wrong dimensions
+ \framed
+ [\c!style=,\c!color=,\c!align=\c!right,#4]
+ {\currentfieldlabel}}%
+ \fi
+ \setbox2\hbox
+ {\reshapeframeboxtrue % else wrong dimensions
+ \ifVerticalField
+ \setupframed[\c!height=6ex,\c!width=\hsize]%
+ \else\ifHorizontalField
+ \setupframed[\c!height=\vsize,\c!width=20em]%
+ \else
+ \setupframed[\c!height=2cm,\c!width=2cm]%
+ \fi\fi
+ \framed
+ [\c!align=\v!right,\c!strut=\v!no,#5]
+ {\getparameters
+ [\??fd]
+ [\c!color=,\c!style=,\c!align=\v!right,\c!option=,
+ \c!clickin=,\c!clickout=,\c!regionin=,\c!regionout=,
+ \c!afterkey=,\c!format=,\c!validate=,\c!calculate=,
+ \c!focusin=,\c!focusout=,
+ \c!fieldoffset=-\framedoffset,\c!fieldbackgroundcolor=,
+ \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5]%
+ \scratchdimen\framedwidth \edef\@@fdwidth {\the\scratchdimen}%
+ \scratchdimen\framedheight\edef\@@fdheight{\the\scratchdimen}%
+ \vfill
+ \hbox{\lower\@@fdfieldoffset\hbox{\typesetfield}}
+ \vss}}%
+ \ifShowFieldLabel
+ \ifVerticalField
+ \vbox
+ {\copy0
+ \@@fdinbetween
+ \copy2}%
+ \else
+ \hbox
+ {\vbox \ifdim\ht2>\ht0 to \ht2 \fi
+ {\@@fdbefore
+ \copy0
+ \@@fdafter}%
+ \hskip\@@fddistance
+ \vbox \ifdim\ht0>\ht2 to \ht0 \fi
+ {\@@fdbefore
+ \box2
+ \@@fdafter}}%
+ \fi
+ \else
+ \box2
+ \fi
+ \egroup}
+
+\chardef\fitfieldmode\plusone % 3 = best
+
+\def\dohandlefitfield[#1][#2][#3][#4][#5]% alleen check
+ {\presetlocalframed[\??fd]%
+ \localframed
+ [\??fd]
+ [\c!n=1024, % beware: weblink plug in truncates
+ \c!strut=\v!no,\c!color=,\c!style=,\c!option=,
+ \c!clickin=,\c!clickout=,\c!regionin=,\c!regionout=,
+ \c!focusin=,\c!focusout=,
+ \c!afterkey=,\c!format=,\c!validate=,\c!calculate=,
+ \c!fieldoffset=\zeropoint,\c!fieldbackgroundcolor=,
+ \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5,\c!align=]
+ {\edef\defaultfield{\ctxlua{backends.codeinjections.getdefaultfieldvalue("#1")}}%
+ % \dopresetsymbol\defaultfield
+ \setbox\scratchbox\hbox{\symbol[\defaultfield]}%
+ \edef\@@fdwidth {\the\wd\scratchbox}%
+ \ifcase\fitfieldmode
+ \edef\@@fdheight{\the\ht\scratchbox}%
+ \typesetfield
+ \or % 1 = ignore depth (original, assumed no depth, actually a bug)
+ \edef\@@fdheight{\the\ht\scratchbox}%
+ \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}%
+ \or % 2 = add depth to height, but no depth in result
+ \edef\@@fdheight{\the\htdp\scratchbox}%
+ \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}%
+ \or % 3 = add depth to height, and apply depth to result
+ \edef\@@fdheight{\the\htdp\scratchbox}%
+ \hbox to \wd\scratchbox{\lower\dp\scratchbox\hbox{\typesetfield}\hfill}%
+ \fi}}
+
+%D Common stuff
+
+\newcount\nofsystemfields
+
+\def\nextsystemfield
+ {\global\advance\nofsystemfields\plusone
+ \def\currentsystemfield{sys::\number\nofsystemfields}}
+
+%D An example:
+
+\def\fillinfield
+ {\dosingleempty\dofillinfield}
+
+\def\dofillinfield[#1]#2%
+ {\dontleavehmode
+ \hbox
+ {\forgetall
+ \setupfields[\v!reset]%
+ \nextsystemfield
+ \useJSscripts[ans]%
+ \doifelsenothing{#1}
+ {\def\therightanswer{#2}}
+ {\def\therightanswer{#1}}%
+ \setbox0\hbox{#2}%
+ \setbox2\hbox{\therightanswer}%
+ \dimen0=\ifdim\wd0>\wd2 \wd0 \else \wd2 \fi
+ \advance\dimen0 .2em
+ \definefield
+ [\currentsystemfield][line][systemfield]%
+ \setupfield
+ [systemfield]
+ [\c!n=1024, % beware: weblink plugin truncates
+ \c!location=\v!low,\c!strut=\v!yes,\c!fieldoffset=\zeropoint,
+ \c!height=1.2\openlineheight,\c!width=\dimen0,\c!offset=\v!overlay,
+ \c!style=,\c!align=\v!middle,\c!frame=\v!off,
+ \c!color=red,\c!fieldbackgroundcolor=\s!white,\c!fieldframecolor=blue,
+ \c!validate=JS(Check_Answer{\currentsystemfield,\therightanswer})]%
+ \switchtobodyfont
+ [\c!small]%
+ \hbox to \wd0
+ {\copy0\hskip-\wd0\hss\field[\currentsystemfield]\hss}}}
+
+%D and another one:
+
+\def\tooltip
+ {\dosingleempty\dotooltip}
+
+\def\dotooltip[#1]#2#3%
+ {\dontleavehmode
+ \begingroup
+ \setupfields[\v!reset]%
+ \useJSscripts[fld]%
+ \setbox0\hbox
+ {\dontcomplain
+ \nextsystemfield
+ \setbox0\hbox{#2}%
+ \definesymbol
+ [\currentsystemfield:txt]
+ [{\inframed[\c!frame=\v!off,\c!background=\v!screen]{#3}}]%
+ \setbox2\hbox{\symbol[\currentsystemfield:txt]}%
+ \definefield
+ [\currentsystemfield:txt][check]
+ [dummy][\currentsystemfield:txt][\currentsystemfield:txt]%
+ \setupfield
+ [dummy]
+ [\c!frame=\v!off,
+ \c!regionout=JS(Hide_Field{\currentsystemfield:txt}),
+ \c!option=\v!hidden]%
+ \hbox to \zeropoint
+ {\dimen0\wd2\advance\dimen0 -\wd0
+ \doifelse{#1}\v!left
+ {\hskip-\dimen0}
+ {\doif{#1}\v!middle
+ {\hskip-.5\dimen0}}%
+ \lower\openlineheight\hbox to \zeropoint
+ {\fitfield[\currentsystemfield:txt]}}%
+ \dimen0=\ifdim\wd0=\zeropoint 3em\else\wd0\fi
+ \definesymbol
+ [\currentsystemfield:but]
+ [{\framed[\c!height=2ex,\c!width=\dimen0,\c!frame=\v!off]{}}]%
+ \definefield
+ [\currentsystemfield:but][push]
+ [dummy][\currentsystemfield:but][\currentsystemfield:but]%
+ \setupfield
+ [dummy]
+ [\c!frame=\v!off,
+ \c!option=,
+ \c!regionin=JS(Vide_Field{\currentsystemfield:txt}),
+ \c!regionout=JS(Hide_Field{\currentsystemfield:txt}),
+ \c!fieldlayer=\@@iafieldlayer]%
+ \lower2ex\hbox to \zeropoint
+ {\fitfield[\currentsystemfield:but]}%
+ #2}%
+ \ht0\strutht\dp0\strutdp\box0
+ \endgroup}
+
+%D And one more:
+
+\unexpanded\def\definefieldstack
+ {\dotripleargument\dodefinefieldstack}
+
+\def\dodefinefieldstack[#1][#2][#3]% name, symbols, settings
+ {\ifcsname fieldstack:#1\endcsname \else
+ \setgvalue{fieldstack:#1}{\dodofieldstack[#1][#2][#3]}%
+ \fi}
+
+\def\fieldstack
+ {\dotripleempty\dofieldstack}
+
+\def\dofieldstack[#1][#2][#3]%
+ {\ifsecondargument
+ \dodefinefieldstack[#1][#2][#3]\fieldstack[#1]%
+ \else
+ \getvalue {fieldstack:#1}%
+ \setgvalue{fieldstack:#1}{[#1]}%
+ \fi}
+
+\def\dodofieldstack[#1][#2][#3]% start=n, 0 == leeg
+ {\dontleavehmode
+ \begingroup
+ \getparameters[\??fd][\c!start=1,#3]%
+ \setupfields[\v!reset]%
+ % \definesymbol[\v!empty][]%
+ \useJSscripts[fld][FieldStack]%
+ \newcounter\stackedfieldnumber
+ \def\dododofieldstack##1%
+ {\increment\stackedfieldnumber
+ \ifnum\stackedfieldnumber=\@@fdstart\relax
+ \definefield[#1:\stackedfieldnumber][check][#1][##1,\empty][##1]% \v!empty fails
+ \else
+ \definefield[#1:\stackedfieldnumber][check][#1][##1,\empty][\empty]% \v!empty fails
+ \fi}%
+ \processcommalist[#2]\dododofieldstack
+ \setupfield[#1][\v!reset]% added
+ \setupfield[#1][\c!option=\v!readonly,#3]% #3 swapped
+ \newcounter\stackedfieldnumber
+ \def\dododofieldstack##1%
+ {\doglobal\increment\stackedfieldnumber
+ \fitfield[#1:\stackedfieldnumber]\egroup\bgroup}%
+ \startoverlay
+ \bgroup
+ \globalprocesscommalist[#2]\dododofieldstack
+ \egroup
+ \stopoverlay
+ \endgroup}
+
+%D When submitting a form, we need to tell the driver module
+%D that we want \FDF\ or \HTML.
+
+\newtoks\everysetupforms
+
+\unexpanded\def\setupforms{\dosingleempty\dosetupforms}
+
+\def\dosetupforms[#1]
+ {\getparameters[\??fr][#1]%
+ \the\everysetupforms}
+
+\appendtoks
+ \ctxlua{backends.codeinjections.setformsmethod("@@frmethod")}%
+\to \everysetupforms
+
+\setupforms
+ [\c!method=XML] % no need for everyjob initialization as this is the default
+
+%D Goodie: (unchecked in \MKIV)
+
+\unexpanded\def\definepushbutton % name optional setup
+ {\dodoubleempty\dodefinepushbutton}
+
+\def\dodefinepushbutton[#1][#2]% name setup
+ {\dododefinepushbutton{#1}{n}{push}%
+ \dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}%
+ \dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}%
+ \setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}}
+
+\def\dododefinepushbutton#1#2#3%
+ {\doifsymboldefinedelse{psym:#1:#2}%
+ \donothing{\definesymbol[psym:#1:#2][{#3}]}}
+
+\unexpanded\def\definepushsymbol
+ {\dotripleargument\dodefinepushsymbol}
+
+\def\dodefinepushsymbol[#1][#2]% [#3]
+ {\definesymbol[psym:#1:#2]}
+
+\def\dopushbutton[#1][#2]%
+ {\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}}
+
+\def\pushbutton
+ {\dodoubleargument\dopushbutton}
+
+\def\dohandlepushbutton#1#2#3% identifier setup script
+ {\bgroup
+ \nextsystemfield
+ \setupfield
+ [pushbutton]
+ [\c!frame=\v!overlay,
+ \c!offset=\v!overlay,
+ \c!clickout=#3,#2]%
+ \definefield
+ [\currentsystemfield]
+ [push]
+ [pushbutton]
+ [psym:#1:n,psym:#1:r,psym:#1:d]%
+ \fitfield
+ [\currentsystemfield]%
+ \egroup}
+
+% \def\menu@psh
+% {\dodoubleargument\domenu@psh}
+%
+% \def\domenu@psh[#1][#2]#3\\%
+% {\txt\pushbutton[#1][#2]\\}%
+%
+%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands
+
+\unexpanded\def\menu@psh{\txt\pushbutton}
+
+\appendtoks \let\psh\menu@psh \to \everysetmenucommands
+
+% \definepushbutton [reset]
+%
+% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}]
+% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}]
+%
+% \startinteractionmenu[bottom]
+% \psh [reset] [JS(reset_something)] \\
+% \stopinteractionmenu
+
+%D Another goodie: (unchecked in \MKIV)
+
+% \definecolor[rollover:n][red]
+% \definecolor[rollover:r][green]
+% \definecolor[rollover:d][blue]
+
+\definepalet
+ [rollover]
+ [n=red,
+ r=green,
+ d=blue]
+
+\newcounter\nofrollovers
+\newcounter\nofrollbuttons
+
+\def\dorollbutton[#1][#2]#3[#4]%
+ {\dontleavehmode
+ \bgroup
+ \doglobal\increment\nofrollovers
+ \doglobal\increment\nofrollbuttons
+ \unexpanded\def\dosetlocationbox[##1]##2[##3]%
+ {\getparameters[##1][##3]%
+ \definecolor[rollover][rollover:##2]%
+ \doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox
+ {\localframed[##1]
+ [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
+ {\dolocationattributes{##1}\c!style\c!color{#3}}}}%
+ \iffirstargument
+ \ifsecondargument
+ \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}%
+ \else
+ \doifassignmentelse{#1}
+ {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}}
+ {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}%
+ \fi
+ \else
+ \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}%
+ \fi
+ % todo: share symbols, tricky since different dimensions
+ \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]%
+ \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]%
+ \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]%
+ \setupfield
+ [rollbutton]
+ [\c!frame=\v!off,
+ \c!offset=\v!overlay,
+ \c!clickout={#4}]%
+ \definefield
+ [roll:\nofrollbuttons][push][rollbutton]
+ [rsym:\nofrollovers:n,%
+ rsym:\nofrollovers:r,%
+ rsym:\nofrollovers:d]%
+ \fitfield[roll:\nofrollbuttons]%
+ \egroup}
+
+\unexpanded\def\rollbutton
+ {\dodoubleempty\dorollbutton}
+
+\def\menu@rob[#1]#2\\%
+ {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}%
+
+\appendtoks \let\rob\menu@rob \to \everysetmenucommands
+
+% calls:
+% {..} [JS..]
+% [left] {..} [JS..]
+% [a=b] {..} [JS..]
+% [left] [a=b] {..} [JS..]
+%
+% \setupbuttons[offset=0pt,frame=off] % alternative=hidden
+%
+% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})]
+% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})]
+% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})]
+% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})]
+% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})]
+%
+% \rob [JS(...)] bla bla \\
+
+\unexpanded\def\overlayrollbutton
+ {\dodoubleargument\dooverlayrollbutton}
+
+\def\dooverlayrollbutton[#1][#2]%
+ {\bgroup
+ \nextsystemfield
+ \setupfield
+ [overlayrollbutton]
+ [\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]%
+ \definesymbol
+ [\currentsystemfield]
+ [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]%
+ \definefield
+ [\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]%
+ \fitfield[\currentsystemfield]%
+ \egroup}
+
+% \defineoverlay
+% [ShowMenu]
+% [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}]
+
+\protect \endinput
diff --git a/tex/context/base/scrn-hlp.mkii b/tex/context/base/scrn-hlp.mkii
new file mode 100644
index 000000000..c9fcbd29a
--- /dev/null
+++ b/tex/context/base/scrn-hlp.mkii
@@ -0,0 +1,171 @@
+%D \module
+%D [ file=scrn-hlp,
+%D version=1998.10.10,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Help (Experimental),
+%D author={Hans Hagen \& Ton Otten},
+%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.
+
+% todo : dedicated vide/hide voor helps
+
+\writestatus{loading}{ConTeXt Screen Macros / Help popups}
+
+%D This is an experimental and private module, so the interface
+%D and functionality can change. Pieces of code will be moved
+%D to other modules. More features are possible but will be
+%D interfaces later. See m-chart for an application as well
+%D as the second tno-tpd manual (graphic in margin, click
+%D on it, pop up big one, use menu with hides, as well as
+%D background, etc. etc.
+
+\unprotect
+
+\defineframedtext
+ [\v!helptext]
+
+\setupframedtexts
+ [\v!helptext]
+ [\c!width=.75\textwidth,
+ \c!align=\v!normal,
+ \c!frame=\v!off,
+ \c!background=\v!screen]
+
+\newcounter \nofhelpdataentries
+\newconditional \somehelpdatadefined
+
+\appendtoks \getpagehelpdata \to \beforeeverypage
+\appendtoks \synchronizepagehelpdata \to \aftereverypage
+
+% will be proper state variable
+
+\let\pagehelpdata\empty
+
+\def\dontresetpagedata
+ {\let\synchronizepagehelpdata\relax}
+
+\def\resetpagehelpdata
+ {\iflocation
+ \let\synchronizepagehelpdata\resetpagehelpdata
+ \global\let\pagehelpdata\empty
+ \resetreference[HideHelp]%
+ \fi}
+
+\let\synchronizepagehelpdata\resetpagehelpdata
+
+\resetreference[HideHelp]
+
+\def\getpagehelpdata
+ {\iflocation\ifcase\nofhelpdataentries\else
+ \let\pagehelpdata\empty
+ \ifconditional\somehelpdatadefined
+ \definetwopasslist{hlp:\realfolio}%
+ \doloop
+ {\gettwopassdata{hlp:\realfolio}%
+ \iftwopassdatafound
+ \addtocommalist\twopassdata\pagehelpdata
+ \else
+ \exitloop
+ \fi}%
+ \fi
+ \ifx\pagehelpdata\empty \else
+ \useJSscripts[fld]%
+ \definereference[HideHelp][JS(Hide_Fields)]% for the moment
+ \fi
+ \fi\fi}
+
+\def\setpagehelpdata[#1]%
+ {\iflocation\expanded{\dosetpagehelpdata{#1}}\fi}
+
+\def\dosetpagehelpdata#1%
+ {\doglobal\increment\nofhelpdataentries
+ \savetwopassdata{hlp:\realfolio}{\nofhelpdataentries}{#1}}
+
+\setvalue{\e!start\v!helptext}[#1]%
+ {\iflocation
+ \global\settrue\somehelpdatadefined
+ \setvalue{\e!stop\v!helptext}%
+ %{\definesymbol[helpinfo:#1][{\doframedtext[\v!helptext]{\getbuffer[\v!helptext]}}]%
+ % \dopresetfieldsymbol{helpinfo:#1}}%
+ {\definesymbol[\v!helptext:#1][{\doframedtext[\v!helptext]{\getbuffer[\v!helptext]}}]%
+ \dopresetfieldsymbol{\v!helptext:#1}}%
+ \else
+ \letvalue{\e!stop\v!helptext}\relax
+ \fi
+ \dostartbuffer[\v!helptext][\e!start\v!helptext][\e!stop\v!helptext]}
+
+\long\def\helptext[#1]#2%
+ {\iflocation
+ \global\settrue\somehelpdatadefined
+ %\definesymbol[helpinfo:#1][{\doframedtext[\v!helptext]{#2}}]%
+ %\dopresetfieldsymbol{helpinfo:#1}%
+ \definesymbol[\v!helptext:#1][{\doframedtext[\v!helptext]{#2}}]%
+ \dopresetfieldsymbol{\v!helptext:#1}%
+ \fi}
+
+\let\definehelptext\helptext % for backward compabilities sake
+
+\def\dohelpdata#1%
+ {\setbox\scratchbox\hbox
+ {\startoverlay
+ {\box\scratchbox}
+ %{\definemainfield[help:#1][check][helpsetup][helpinfo:#1][helpinfo:#1]%
+ {\definemainfield[help:#1][check][helpsetup][\v!helptext:#1][\v!helptext:#1]%
+ \fitfield[help:#1]}
+ \stopoverlay}}
+
+\def\helpdata
+ {\iflocation
+ \bgroup
+ %\getpagehelpdata
+ \ifx\pagehelpdata\empty \else
+ \setupfields[\v!reset]%
+ \setupfield
+ [helpsetup]
+ [\c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!frame=\v!off,
+ \c!clickin=JS(Hide_Fields),
+ \c!option={\v!readonly,\v!hidden}]%
+ \setbox\scratchbox\emptybox
+ \processcommacommand[\pagehelpdata]\dohelpdata
+ \box\scratchbox
+ \fi
+ \egroup
+ \fi}
+
+\def\helpbutton % also gobble spaces between [][]
+ {\dodoubleempty\dohelpbutton}
+
+\def\dohelpbutton
+ {\ifsecondargument
+ \expandafter\donohelpbutton
+ \else
+ \expandafter\dodohelpbutton
+ \fi}
+
+\def\dodohelpbutton[#1][#2]#3[#4]% #2 is space gobbling dummy
+ {\iflocation
+ \setpagehelpdata[#4]%
+ \useJSscripts[fld]%
+ \button[#1]{#3}[JS(Vide_Hide_Fields{help:#4})]%
+ \fi}
+
+\def\donohelpbutton[#1][#2]%
+ {\dodohelpbutton[#1][]{}[#2]}
+
+\def\doifhelpinfo#1#2%
+ {\iflocation
+ \doifsymboldefinedelse{helpinfo:#1}{#2}\donothing
+ \fi}
+
+\def\doifelsehelpinfo#1#2#3%
+ {\iflocation
+ \doifsymboldefinedelse{helpinfo:#1}{#2}{#3}%
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/scrn-hlp.mkiv b/tex/context/base/scrn-hlp.mkiv
new file mode 100644
index 000000000..4eaa340ca
--- /dev/null
+++ b/tex/context/base/scrn-hlp.mkiv
@@ -0,0 +1,179 @@
+%D \module
+%D [ file=scrn-hlp,
+%D version=1998.10.10,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Help (Experimental),
+%D author={Hans Hagen \& Ton Otten},
+%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.
+
+% todo : dedicated vide/hide voor helps
+
+\writestatus{loading}{ConTeXt Screen Macros / Help popups}
+
+%D This is an experimental and private module, so the interface
+%D and functionality can change. Pieces of code will be moved
+%D to other modules. More features are possible but will be
+%D interfaces later. See m-chart for an application as well
+%D as the second tno-tpd manual (graphic in margin, click
+%D on it, pop up big one, use menu with hides, as well as
+%D background, etc. etc.
+
+\unprotect
+
+\defineframedtext
+ [\v!helptext]
+
+\setupframedtexts
+ [\v!helptext]
+ [\c!width=.75\textwidth,
+ \c!align=\v!normal,
+ \c!frame=\v!off,
+ \c!background=\v!screen]
+
+\newcounter \nofhelpdataentries
+\newconditional \somehelpdatadefined
+
+\let\getpagehelpdata \relax
+\let\synchronizepagehelpdata\relax
+
+\appendtoks \getpagehelpdata \to \beforeeverypage
+\appendtoks \synchronizepagehelpdata \to \aftereverypage
+
+% will be proper state variable
+
+\let\pagehelpdata\empty
+
+\def\dontresetpagedata
+ {\let\synchronizepagehelpdataindeed\relax}
+
+\def\resetpagehelpdata
+ {\iflocation
+ \let\synchronizepagehelpdataindeed\resetpagehelpdata
+ \global\let\pagehelpdata\empty
+ \resetreference[HideHelp]%
+ \fi}
+
+\let\synchronizepagehelpdataindeed\resetpagehelpdata
+
+\resetreference[HideHelp]
+
+\def\getpagehelpdataindeed
+ {\iflocation\ifcase\nofhelpdataentries\else
+ \dogetpagehelpdataindeed
+ \fi\fi}
+
+\def\dogetpagehelpdataindeed
+ {\let\pagehelpdata\empty
+ \ifconditional\somehelpdatadefined
+ \definetwopasslist{hlp:\realfolio}%
+ \doloop
+ {\gettwopassdata{hlp:\realfolio}%
+ \iftwopassdatafound
+ \addtocommalist\twopassdata\pagehelpdata
+ \else
+ \exitloop
+ \fi}%
+ \fi
+ \ifx\pagehelpdata\empty \else
+ \useJSscripts[fld]%
+ \definereference[HideHelp][JS(Hide_Fields)]% for the moment
+ \fi}
+
+\def\setpagehelpdata[#1]%
+ {\iflocation\expanded{\dosetpagehelpdata{#1}}\fi}
+
+\def\dosetpagehelpdata#1%
+ {\doglobal\increment\nofhelpdataentries
+ \global\let\getpagehelpdata\getpagehelpdataindeed
+ \global\let\synchronizepagehelpdata\synchronizepagehelpdataindeed
+ \savetwopassdata{hlp:\realfolio}{\nofhelpdataentries}{#1}}
+
+\setvalue{\e!start\v!helptext}[#1]%
+ {\iflocation
+ \global\settrue\somehelpdatadefined
+ \setvalue{\e!stop\v!helptext}%
+ %{\definesymbol[helpinfo:#1][{\doframedtext[\v!helptext]{\getbuffer[\v!helptext]}}]%
+ % \dopresetfieldsymbol{helpinfo:#1}}%
+ {\definesymbol[\v!helptext:#1][{\doframedtext[\v!helptext]{\getbuffer[\v!helptext]}}]%
+ \dopresetfieldsymbol{\v!helptext:#1}}%
+ \else
+ \letvalue{\e!stop\v!helptext}\relax
+ \fi
+ \dostartbuffer[\v!helptext][\e!start\v!helptext][\e!stop\v!helptext]}
+
+\long\def\helptext[#1]#2%
+ {\iflocation
+ \global\settrue\somehelpdatadefined
+ %\definesymbol[helpinfo:#1][{\doframedtext[\v!helptext]{#2}}]%
+ %\dopresetfieldsymbol{helpinfo:#1}%
+ \definesymbol[\v!helptext:#1][{\doframedtext[\v!helptext]{#2}}]%
+ \dopresetfieldsymbol{\v!helptext:#1}%
+ \fi}
+
+\let\definehelptext\helptext % for backward compabilities sake
+
+\def\dohelpdata#1%
+ {\setbox\scratchbox\hbox
+ {\startoverlay
+ {\box\scratchbox}
+ %{\definemainfield[help:#1][check][helpsetup][helpinfo:#1][helpinfo:#1]%
+ {\definemainfield[help:#1][check][helpsetup][\v!helptext:#1][\v!helptext:#1]%
+ \fitfield[help:#1]}
+ \stopoverlay}}
+
+\def\helpdata
+ {\iflocation
+ \bgroup
+ %\getpagehelpdata
+ \ifx\pagehelpdata\empty \else
+ \setupfields[\v!reset]%
+ \setupfield
+ [helpsetup]
+ [\c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!frame=\v!off,
+ \c!clickin=JS(Hide_Fields),
+ \c!option={\v!readonly,\v!hidden}]%
+ \setbox\scratchbox\emptybox
+ \processcommacommand[\pagehelpdata]\dohelpdata
+ \box\scratchbox
+ \fi
+ \egroup
+ \fi}
+
+\def\helpbutton % also gobble spaces between [][]
+ {\dodoubleempty\dohelpbutton}
+
+\def\dohelpbutton
+ {\ifsecondargument
+ \expandafter\donohelpbutton
+ \else
+ \expandafter\dodohelpbutton
+ \fi}
+
+\def\dodohelpbutton[#1][#2]#3[#4]% #2 is space gobbling dummy
+ {\iflocation
+ \setpagehelpdata[#4]%
+ \useJSscripts[fld]%
+ \button[#1]{#3}[JS(Vide_Hide_Fields{help:#4})]%
+ \fi}
+
+\def\donohelpbutton[#1][#2]%
+ {\dodohelpbutton[#1][]{}[#2]}
+
+\def\doifhelpinfo#1#2%
+ {\iflocation
+ \doifsymboldefinedelse{helpinfo:#1}{#2}\donothing
+ \fi}
+
+\def\doifelsehelpinfo#1#2#3%
+ {\iflocation
+ \doifsymboldefinedelse{helpinfo:#1}{#2}{#3}%
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/scrn-int.lua b/tex/context/base/scrn-int.lua
new file mode 100644
index 000000000..7036bbf6a
--- /dev/null
+++ b/tex/context/base/scrn-int.lua
@@ -0,0 +1,111 @@
+if not modules then modules = { } end modules ['scrn-int'] = {
+ version = 1.001,
+ comment = "companion to scrn-int.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+local texsprint, texcount, ctxcatcodes = tex.sprint, tex.count, tex.ctxcatcodes
+
+interactions = interactions or { }
+
+local attachments = { }
+
+function interactions.registerattachment(specification)
+ if specification.label then
+ specification.filename = specification.filename or specification.label
+ specification.newname = specification.newname or specification.filename
+ specification.title = specification.title or specification.filename
+ specification.newname = file.addsuffix(specification.newname,file.extname(specification.filename))
+ attachments[specification.label] = specification
+ return specification
+ end
+end
+
+function interactions.attachment(label)
+ local at = attachments[label]
+ if not at then
+ interfaces.showmessage("interactions",6,label)
+ return interactions.registerattachment { label = label }
+ else
+ return at
+ end
+end
+
+function interactions.attachmentvar(label,key)
+ local at = attachments[label]
+ texsprint(ctxcatcodes,at and at[key] or "")
+end
+
+local soundclips = { }
+
+function interactions.registersoundclip(specification)
+ if specification.label then
+ specification.filename = specification.filename or specification.label
+ soundclips[specification.label] = specification
+ return specification
+ end
+end
+
+function interactions.soundclip(label)
+ local sc = soundclips[label]
+ if not sc then
+ -- todo: message
+ return interactions.registersoundclip { label = label }
+ else
+ return sc
+ end
+end
+
+local renderings = { }
+
+function interactions.registerrendering(specification)
+ if specification.label then
+ renderings[specification.label] = specification
+ return specification
+ end
+end
+
+function interactions.rendering(label)
+ local rn = renderings[label]
+ if not rn then
+ -- todo: message
+ return interactions.registerrendering { label = label }
+ else
+ return rn
+ end
+end
+
+function interactions.renderingvar(label,key)
+ local rn = renderings[label]
+ texsprint(ctxcatcodes,rn and rn[key] or "")
+end
+
+-- linked lists
+
+function interactions.definelinkedlist(name)
+ -- no need
+end
+
+function interactions.addlinktolist(name)
+ local tobesaved = jobpasses.gettobesaved(name)
+ local collected = jobpasses.getcollected(name) or { }
+ local currentlink = #tobesaved + 1
+ local noflinks = #collected
+ tobesaved[currentlink] = 0
+ local f = collected[1] or 0
+ local l = collected[noflinks] or 0
+ local p = collected[currentlink-1] or f
+ local n = collected[currentlink+1] or l
+ texsprint(ctxcatcodes,format("\\setlinkproperties{%s}{%s}{%s}{%s}{%s}{%s}",currentlink,noflinks,f,p,n,l))
+end
+
+function interactions.enhancelinkoflist(name,n)
+ local ll = jobpasses.gettobesaved(name)
+ if ll then
+ ll[n] = texcount.realpageno
+ end
+end
+
diff --git a/tex/context/base/scrn-int.mkii b/tex/context/base/scrn-int.mkii
new file mode 100644
index 000000000..cf55f864a
--- /dev/null
+++ b/tex/context/base/scrn-int.mkii
@@ -0,0 +1,2311 @@
+%D \module
+%D [ file=scrn-int,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Interaction,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% evt interactionbaren runtime laden (scheelt 8K)
+
+%D Still to be done properly.
+
+\writestatus{loading}{ConTeXt Screen Macros / Interaction}
+
+\unprotect
+
+% \expand vs \expanded
+
+% linked registers implementeren als een koppeling == mooier
+
+\presetlocalframed[\??lk]
+
+\newcounter\numberoflinks
+
+\def\stelkoppelingenin
+ {\dodoubleargument\getparameters[\??lk]}
+
+\def\definieerkoppeling[#1]% % local loading !
+ {\doifundefined{\s!link:#1:\s!list}
+ {\expanded{\definetwopasslist{\s!link:#1}}% \expanded{\doloadtwopassdata{\s!link:#1}}%
+ \getfirsttwopassdata{\s!link:#1}%
+ \let\firstlink\twopassdata
+ \getlasttwopassdata{\s!link:#1}%
+ \let\lastlink\twopassdata
+ \let\noflinks\noftwopassitems
+ \gettwopassdata{\s!link:#1}%
+ \let\currentlink\twopassdata
+ \let\nextlink\twopassdata
+ \setxvalue{\s!link:#1:}{\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}}}
+
+\def\koppeling[#1]#2%
+ {\bgroup
+ \definieerkoppeling[#1]%
+ \doglobal\increment\numberoflinks
+ \gettwopassdata{\s!link:#1}%
+ \def\next[##1:##2:##3:##4:##5]%
+ {\edef\firstlink {0##1}%
+ \edef\lastlink {0##2}%
+ \edef\noflinks {0##3}%
+ \edef\prevlink {0##4}%
+ \edef\currentlink{0##5}}%
+ \expanded{\next[\getvalue{\s!link:#1:}]}%
+ \edef\nextlink{0\iftwopassdatafound\twopassdata\else\lastlink\fi}%
+ \setxvalue{\s!link:#1:}{\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}%
+ \lazysavetwopassdata{\s!link:#1}{\numberoflinks}{\noexpand\realfolio}%
+ \ifnum\noflinks<\plustwo
+ \locationfalse
+ \fi
+ \iflocation
+ \hbox
+ {\setinteractionparameter\c!width\!!zeropoint
+ #2\relax
+ \hskip\@@lkdistance
+ \dogotosomepage\??lk\gotobegincharacter\firstlink\hss
+ \ifnum\noflinks>\plustwo
+ \dogotosomepage\??lk\gobackwardcharacter\prevlink\hss
+ \fi
+ \ifnum\noflinks>\plustwo
+ \dogotosomepage\??lk\goforwardcharacter\nextlink\hss
+ \hskip\@@lkdistance
+ \fi
+ \dogotosomepage\??lk\gotoendcharacter\lastlink}%
+ \else
+ \hbox{#2}%
+ \fi
+ \egroup}
+
+\let\setupinteractionscreens\empty
+
+\def\docalculateinteractionscreen
+ {\doifelse\@@scwidth\v!fit
+ {\!!widtha\leftcombitotal
+ \ifdim\backspace>\!!widtha\ifdim\backspace>\zeropoint\relax
+ \advance\backspace -\!!widtha
+ \fi\fi
+ \advance\!!widtha\rightcombitotal
+ \advance\!!widtha 2\dimexpr\@@scbackspace+\@@schoroffset\relax}
+ {\doifelse\@@scwidth\v!max
+ {\!!widtha\printpaperwidth}
+ {\!!widtha\@@scwidth}}%
+ \doifelse\@@scheight\v!fit
+ {\!!heighta\dimexpr\topheight+\topdistance\relax
+ \ifdim\topspace>\!!heighta\ifdim\topspace>\zeropoint\relax
+ \advance\topspace -\!!heighta
+ \fi\fi
+ \advance\!!heighta \dimexpr\makeupheight+\bottomdistance+\bottomheight\relax
+ \advance\!!heighta 2\dimexpr\@@sctopspace+\@@scveroffset\relax}
+ {\doifelse\@@scheight\v!max
+ {\!!heighta\printpaperheight}
+ {\!!heighta\@@scheight}}%
+ \doif\@@scdelay\v!none{\let\@@scdelay\zerocountervalue}}
+
+% The macro is not to be changed; only the \@@ia-variables
+% may be set! ConTeXt is the producer but we no longer
+% mention the pragma site, since we don't want to be bothered
+% with remarks about third party documents and/or associated
+% with documents produced outside our control.
+
+\def\doprepareidentity % beware, we need to construct
+ {\let\!!stringa\@@iakeyword % an unexpanded space separated
+ \let\@@iakeyword\empty % list of keywords from a comma
+ \def\doprepareidentity##1% % separated one
+ {\ifx\@@iakeyword\empty
+ \appended\def\@@iakeyword{##1}%
+ \else
+ \appended\def\@@iakeyword{ ##1}%
+ \fi}%
+ \@EA\processcommalist\@EA[\!!stringa]\doprepareidentity
+ \global\let\doprepareidentity\relax}
+
+%D The Creator field is changed per 12/04/2006 due to user presure. This
+%D means that I need to put my own status info someplace else.
+
+\def\initializeidentity
+ {\doprepareidentity
+ \dosetupidentity % no \expanded{..} will be done in special (else no pdfdoc)
+ {\@@iatitle}{\@@iasubtitle}{\@@iaauthor}%
+ {ConTeXt - \contextversion}%
+ {\@@iadate}{\@@iakeyword}%
+ \global\let\initializeidentity\relax}
+
+\appendtoks \initializeidentity \to \everyshipout
+
+\def\initializepaper
+ {\bgroup
+ \ifx\@@ppleft \empty
+ \ifx\@@ppright\empty
+ \ifx\@@pptop \empty
+ \ifx\@@ppbottom \empty
+ \ifx\@@pcstate\v!start
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi
+ \iflocation % without screen settings
+ \egroup
+ \dosetuppaper\papersize\paperwidth\paperheight
+ \else
+ \egroup
+ \dosetuppaper\printpapersize\printpaperwidth\printpaperheight
+ \fi}
+
+\appendtoks \initializepaper \to \everyshipout
+
+\def\doinitializepaper
+ {\bgroup
+ \docalculateinteractionscreen
+ \ifdim\!!widtha>\paperwidth\ifdim\!!widtha>\zeropoint
+ \paperwidth\!!widtha
+ \fi\fi
+ \ifdim\!!heighta>\paperheight\ifdim\!!heighta>\zeropoint
+ \paperheight\!!heighta
+ \fi\fi
+ \dosetuppaper
+ {\printpapersize}
+ {\the\paperwidth}
+ {\the\paperheight}%
+ \egroup}
+
+\let\@@pcscreendata\empty
+
+\def\dosetupinteractionscreens % met a, b en \number
+ {\doifnot\@@pcstate\v!start\dodosetupinteractionscreens}
+
+\setvalue{\??sc\c!option\v!max }{1} % tzt share with driver
+\setvalue{\??sc\c!option\v!bookmark }{2} % tzt share with driver
+\setvalue{\??sc\c!option\v!fit }{3} % tzt share with driver
+\setvalue{\??sc\c!option\v!doublesided}{4} % tzt share with driver
+
+\def\dodosetupinteractionscreens % met a, b en \number
+ {\bgroup
+ \docalculateinteractionscreen
+ \!!counte=0\getvalue{\??sc\c!option\@@scoption}\relax
+ % niet waterdicht
+ \doifnot{\the\!!widtha\the\!!heighta}\@@pcscreendata
+ {\xdef\@@pcscreendata{\the\!!widtha\the\!!heighta}%
+ \showmessage\m!interactions1{\withoutpt\the\!!widtha,\withoutpt\the\!!heighta}}%
+ % needs to be split: dimensions for each page
+ % and mode per document and only once !
+ \dosetupscreen \backoffset\topoffset\!!widtha\!!heighta{\the\!!counte}%
+ \dosetupcropbox\backoffset\topoffset\!!widtha\!!heighta
+ \egroup}
+
+\def\dosetupinteractionscreen[#1]%
+ {\getparameters[\??sc][#1]%
+ \ifproductionrun
+ \let\initializepaper\doinitializepaper
+ \let\setupinteractionscreens\dosetupinteractionscreens
+ \fi}
+
+\appendtoks \setupinteractionscreens \to \everyfirstshipout % needed to get option=max etc working
+\appendtoks \setupinteractionscreens \to \everyshipout % needed for page/screen dimensions
+
+\def\setupinteractionscreen
+ {\dosingleempty\dosetupinteractionscreen}
+
+%D Due to requests I finally decided to support bookmarks, a
+%D driver dependant way of showing tables of content. The most
+%D simple way of support is hooking bookmark generation into
+%D the existing list mechanisms. That way users can generate
+%D bookmarks automatically, although its entirely valid to add
+%D bookmarks by defining alternative ones. These will be added
+%D at the appropriate place in the list.
+
+% \hoofdstuk{het eerste hoofdstuk}
+%
+% \bookmark {de eerste bookmark} % optional overruled hoofdstuk
+%
+% .... text ....
+%
+% \placebookmarks [hoofdstuk,paragraaf,subparagraaf,subsubparagraaf,mylist]
+% [open list]
+%
+% \bookmark[mylist]{whatever}
+
+\def\@@bookmark {bm::}
+\def\@@booklevel{bl::}
+\def\@@bookcount{bc::}
+
+\definelist[\@@bookmark]
+
+\newtoks\postponedbookmarks
+
+\def\flushpostponedbookmark
+ {\the\postponedbookmarks
+ \global\postponedbookmarks\emptytoks}
+
+\def\simplebookmark#1%
+ {\doglobal\prependtoks
+ \writetolist[\@@bookmark]{}{#1}%
+ \to\postponedbookmarks}
+
+\def\complexbookmark[#1]#2%
+ {\doglobal\appendtoks\writetolist[#1]{}{#2}\to\postponedbookmarks}
+
+\definecomplexorsimple\bookmark
+
+\newif\iftracebookmarks \tracebookmarksfalse
+
+\let\tracebookmarks\tracebookmarkstrue
+
+\def\placebookmarks
+ {\dodoubleempty\doplacebookmarks}
+
+\def\doplacebookmarks[#1][#2]%
+ {\iflocation
+ \iffirstargument
+ \bgroup
+ \ifsecondargument
+ \doifelse{#2}\v!all
+ {\edef\openbookmarklist{#1}}
+ {\edef\openbookmarklist{#2}}%
+ \else
+ \let\openbookmarklist\empty
+ \fi
+ \xdef\doplacebookmarksindeed{\noexpand\dodoplacebookmarksindeed[#1][\openbookmarklist]}
+ \egroup
+ \else
+ \expanded{\placebookmarks\@EA[\getvalue{\??ih\v!content\c!list}]}%
+ \fi
+ \fi}
+
+\def\dodoplacebookmarksindeed[#1][#2]%
+ {\bgroup
+ \edef\openbookmarklist{#2}%
+ \global\let\bookmarklevellist\empty
+ \def\bookmarklevelcount{0}%
+ \doprocessbookmarks[#1]\dogetbookmarkelement
+ \dolistelement{}{}{}{}{}{}% needed to finish the first pass
+ \doprocessbookmarks[#1]\doputbookmarkelement
+ \flushbookmark
+ \egroup}
+
+\let\doplacebookmarksindeed\relax
+
+\prependtoks
+ \doplacebookmarksindeed % new, now postponed so that halfway defined commands work out ok
+\to \everystoptext
+
+\def\doprocessbookmarks[#1]#2%
+ {\let\dolistelement#2\relax
+ \scratchcounter\zerocount
+ \def\docommand##1%
+ {\advance\scratchcounter \plusone
+ \getlistlevel[##1]\listlevel{\the\scratchcounter}%
+ \setxvalue{\@@bookcount\the\scratchcounter}{1}%
+ \setxvalue{\@@booklevel##1}{\listlevel}}%
+ \processcommalist[#1]\docommand
+ \setxvalue{\@@bookcount0}{1}%
+ \global\chardef\currentbookmarklevel\zerocount
+ \global\chardef\previousbookmarklevel\zerocount
+ \doutilities{listentries,#1,\@@bookmark}\jobname{#1}\relax\relax}
+
+\def\dodogetbookmarkelement#1#2#3#4#5#6%
+ {\doifelsenothing{#1}
+ {\global\chardef\currentbookmarklevel\zerocount}
+ {\global\chardef\currentbookmarklevel\getvalue{\@@booklevel#1}\relax}%
+ \ifnum\currentbookmarklevel>\previousbookmarklevel
+ \setxvalue{\@@bookcount\the\currentbookmarklevel}{1}%
+ \else\ifnum\currentbookmarklevel<\previousbookmarklevel
+ \bgroup
+ \!!counta\previousbookmarklevel
+ \doloop
+ {\let\bookmarktag\empty
+ \!!countb\!!counta
+ \advance\!!countb \minusone
+ \dorecurse\!!countb
+ {\edef\bookmarktag
+ {\bookmarktag\getvalue{\@@bookcount\recurselevel}:}}%
+ \edef\bookmarklevelcount
+ {\getvalue{\@@bookcount\the\!!counta}}%
+ \xdef\bookmarklevellist
+ {\bookmarklevellist/\bookmarktag:\bookmarklevelcount/}%
+ \advance\!!counta \minusone
+ \ifnum\!!counta=\currentbookmarklevel
+ \exitloop
+ \fi}%
+ \egroup
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\currentbookmarklevel\endcsname\relax
+ \else
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\previousbookmarklevel\endcsname\relax
+ \fi\fi
+ \global\utilitydonetrue
+ \global\chardef\previousbookmarklevel\currentbookmarklevel}
+
+\def\getbookmarklevelcount
+ {\@EA\def\@EA\docommand\@EA[\@EA##\@EA1\@EA/\bookmarktag:##2/##3]%
+ {\def\bookmarklevelcount{##2}}%
+ \@EA\@EA\@EA\docommand\@EA\@EA\@EA[\@EA\bookmarklevellist\@EA/\bookmarktag:0/]}
+
+\def\dodoputbookmarkelement#1#2#3#4#5#6%
+ {\doifelsenothing{#1}
+ {\global\chardef\currentbookmarklevel\zerocount}
+ {\global\chardef\currentbookmarklevel\getvalue{\@@booklevel#1}\relax}%
+ \ifnum\currentbookmarklevel>\previousbookmarklevel
+ \setxvalue{\@@bookcount\the\currentbookmarklevel}{1}%
+ \else\ifnum\currentbookmarklevel<\previousbookmarklevel
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\currentbookmarklevel\endcsname\relax
+ \else
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\previousbookmarklevel\endcsname\relax
+ \fi\fi
+ \let\bookmarktag\empty
+ \!!countb\currentbookmarklevel
+ \dorecurse\!!countb
+ {\edef\bookmarktag
+ {\bookmarktag\getvalue{\@@bookcount\recurselevel}:}}%
+ \getbookmarklevelcount
+ \iftracebookmarks
+ \bgroup
+ \par
+ \bookmarktag\quad
+ \dorecurse\currentbookmarklevel{\quad}\unskip#1\quad
+ (\bookmarklevelcount)\quad
+ \egroup
+ \fi
+ \global\chardef\previousbookmarklevel\currentbookmarklevel
+ \global\utilitydonetrue
+ \insertsomebookmark{#1}{\the\currentbookmarklevel}{\bookmarklevelcount}{#4}{#6}}
+
+\def\dogetbookmarkelement#1#2#3#4#5#6%
+ {\doifnot{#1}\@@bookmark
+ {\dodogetbookmarkelement{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\doputbookmarkelement#1#2#3#4#5#6%
+ {\doifelse{#1}\@@bookmark
+ {\localbookmark{#4}}
+ {\flushbookmark
+ \dodoputbookmarkelement{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\let\flushbookmark\relax
+\let\localbookmark\gobbleoneargument
+
+\def\insertsomebookmark#1#2#3#4#5%
+ {\gdef\flushbookmark
+ {\doinsertsomebookmark{#1}{#2}{#3}{#4}{#5}{g}}%
+ \gdef\localbookmark##1%
+ {\doinsertsomebookmark{#1}{#2}{#3}{##1}{#5}{l}}}
+
+\def\doinsertsomebookmark#1#2#3#4#5#6%
+ {\global\utilitydonetrue
+ \global\let\localbookmark\gobbleoneargument
+ \global\let\flushbookmark\relax
+ \doifinstringelse{#1}\openbookmarklist
+ {\chardef\openbookmark\plusone}
+ {\chardef\openbookmark\zerocount}%
+ \iftracebookmarks(#6: #4)\quad(\the\openbookmark)\par\fi
+ \doinsertbookmark{#2}{#3}{#4}{#5}{\openbookmark}}
+
+% \startinteractionmenu[rechts]
+% \but [eerste] eerste \\
+% \txt hello world \\
+% \but [tweede] tweede \\
+% \nop \\
+% \but [tweede] tweede \\
+% \rul whow \\
+% \but [tweede] tweede \\
+% \raw hello world \\
+% \but [tweede] tweede \\
+% \com \vfill \\
+% \but [derde] derde \\
+% \stopinteractionmenu
+
+\newif\iflocationmenupermitted
+
+\def\testinteractionmenu#1%
+ {\iflocation
+ \doifelse\@@iamenu\v!on
+ {\doifelsevalue{\??am#1\c!state}\v!start
+ {\global\locationmenupermittedtrue}
+ {\global\locationmenupermittedfalse}}
+ {\global\locationmenupermittedfalse}%
+ \else
+ \global\locationmenupermittedfalse
+ \fi}
+
+\def\dodisableinteractionmenu[#1][#2][#3]%
+ {\def\dododisableinteractionmenu##1%
+ {\doifelse{#3}{}
+ {\letvalue{\??am##1\c!obstruction}\empty}
+ {\edef\interactieblokkade{\getvalue{\??am##1\c!obstruction}}
+ \def\docommand####1{#1{####1}{\interactieblokkade}}% #1 = \remove or \add
+ \processcommalist[#3]\docommand
+ \setevalue{\??am##1\c!obstruction}{\interactieblokkade}}}%
+ \processcommalist[#2]\dododisableinteractionmenu}
+
+\def\disableinteractionmenu
+ {\dotripleempty\dodisableinteractionmenu[\addtocommalist]}
+
+\def\enableinteractionmenu
+ {\dotripleempty\dodisableinteractionmenu[\removefromcommalist]}
+
+% ja : kader/achtergrond met tekst
+% leeg : kader/achtergrond maar geen tekst
+% nee : alleen ruimte reserveren
+% geen : helemaal weglaten
+
+\newif\iflocationdummy
+\newif\ifskippedmenuitem
+
+\newif\iflocationempty
+\newif\iflocationclick
+
+% ja : kader/achtergrond met tekst
+% leeg : kader/achtergrond maar geen tekst
+% nee : alleen ruimte reserveren
+% geen : helemaal weglaten
+%
+% \setupinteractionmenu[right][samepage=yes, unknownreference=yes]
+% \setupinteractionmenu[right][samepage=empty,unknownreference=empty]
+% \setupinteractionmenu[right][samepage=no, unknownreference=no]
+% \setupinteractionmenu[right][samepage=none, unknownreference=none]
+%
+% \startinteractionmenu[right]
+% \but [firstpage] first \\
+% \but [lastpage] last \\
+% \but [somepage] crap \\
+% \stopinteractionmenu
+
+\def\dosetlocationboxcontent#1[#2]#3[#4]%
+ {\global\skippedmenuitemfalse
+ \setbox\locationbox\hbox
+ {\resetgoto % anders cyclische aanroep !
+ \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}}%
+ \iflocationclick
+ \hbox{\gotolocation{#4}{\box\locationbox}}%
+ \else
+ \hbox{\box\locationbox}%
+ \fi}
+
+\let\dosetlocationboxyes\dosetlocationboxcontent
+
+\def\dosetlocationboxempty#1[%
+ {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,}
+
+\def\dosetlocationboxno#1[%
+ {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,\c!frame=,\c!background=,}
+
+\def\dosetlocationboxnone#1[#2]#3[#4]%
+ {\global\skippedmenuitemtrue}
+
+\def\setlocationboxyes#1[#2]#3[#4]%
+ {\locationclicktrue
+ \setbox\locationbox\hbox
+ {\resetgoto % anders cyclische aanroep !
+ \global\skippedmenuitemfalse
+ \gotolocation
+ {#4}% % needed
+ {\ifrealreferencepage
+ \ifcase\csname\??am\??am\csname#1\c!samepage\endcsname\endcsname\relax
+ \copycsname#1\c!color\endcsname\csname#1\c!contrastcolor\endcsname
+ \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}%
+ \or
+ \localframed[#1][\c!empty=\v!yes,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}%
+ \or
+ \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}%
+ \or
+ \global\skippedmenuitemtrue
+ \fi
+ \else
+ \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}%
+ \fi}}%
+ \ifskippedmenuitem\else\box\locationbox\fi}
+
+\def\setlocationboxnop#1[#2]#3[#4]% inefficient as text can be outside box
+ {\locationclickfalse
+ \setbox\locationbox\hbox
+ {\resetgoto % anders cyclische aanroep !
+ \global\skippedmenuitemfalse
+ \ifcase\csname\??am\??am\csname#1\c!unknownreference\endcsname\endcsname\relax
+ \localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}%
+ \or
+ \localframed[#1][\c!empty=\v!yes,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}%
+ \or
+ \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{\dolocationattributes{#1}\c!style\c!color{#3}}%
+ \or
+ \global\skippedmenuitemtrue
+ \fi}%
+ \ifskippedmenuitem\else\box\locationbox\fi}
+
+\def\setlocationboxraw#1[#2]#3[#4]%
+ {\localframed[#1][#2]{\dolocationattributes{#1}\c!style\c!color{#3}}}
+
+\def\setlocationbox#1[#2]#3[#4]%
+ {\bgroup % really needed !
+ \edef\permittedreferences{\csname#1\c!obstruction\endcsname}%
+ \doifreferencepermittedelse{#4}%
+ {\setlocationboxyes{#1}[#2]{#3}[#4]}%
+ {\setlocationboxnop{#1}[#2]{#3}[#4]}%
+ \egroup}
+
+\def\setlocationnop#1[#2]#3%
+ {\localframed[#1][#2]{#3}}
+
+\def\executeamboxcommands#1#2#3#4#5%
+ {%\processaction
+ % [\getvalue{\??am#1\c!dummy}]
+ % [ \v!yes=>\chardef\handleunknownmenuitem=0\relax,
+ % \v!empty=>\chardef\handleunknownmenuitem=1\relax,
+ % \v!no=>\chardef\handleunknownmenuitem=2\relax]%
+ \getvalue{\??am#1#3}\relax
+ \setamboxcommands{#1}{#4}%
+ \ignorespaces#2\unskip
+ \getvalue{\??am#1#5}}
+
+\newcounter\currentamposition
+
+\newtoks\everysetmenucommands
+
+\def\setamboxcommands#1#2%
+ {\def\currentmenu{#1}% % kan nog eerder
+ \def\currentsubmenu{#2}% % ? ?
+ \doglobal\newcounter\currentamposition
+ \the\everysetmenucommands}
+
+\def\menu@@amboxcommand#1\\%
+ {\dontleavehmode
+ \bgroup
+ \ignorespaces#1\unskip\relax
+ \ifskippedmenuitem \else
+ \getvalue{\??am\currentmenu\currentsubmenu}%
+ \fi
+ \egroup
+ \ignorespaces}
+
+\appendtoks
+ \let\@@amboxcommand\menu@@amboxcommand
+\to \everysetmenucommands
+
+\def\menu@raw[#1]#2\\%
+ {\@@amboxcommand\gotobox{\ignorespaces#2\unskip}[#1]\\}%
+
+\def\menu@but[#1]#2\\%
+ {\@@amboxcommand\do@@amposition\currentmenu{#1}{\setlocationbox{\??am\currentmenu}[]{\ignorespaces#2\unskip}[#1]}\\}%
+
+\def\menu@got[#1]#2\\% pas op! offset
+ {\@@amboxcommand\setlocationbox{\??am\currentmenu}[\c!frame=\v!off,\c!background=]{\ignorespaces#2\unskip}[#1]\\}%
+
+\def\menu@nop#1\\%
+ {\@@amboxcommand\setlocationboxraw{\??am\currentmenu}[\c!frame=\v!off,\c!background=,\c!empty=\v!yes]{\ignorespaces#1\unskip}[]\\}%
+
+\def\menu@txt#1\\%
+ {\@@amboxcommand\localframed[\??am\currentmenu][\c!frame=\v!off,\c!background=]{\ignorespaces#1\unskip}\\}%
+
+\def\menu@rul#1\\% ook \do@@amposition !
+ {\@@amboxcommand\localframed[\??am\currentmenu][]{\ignorespaces#1\unskip}\\}%
+
+\def\menu@com#1\\%
+ {\ignorespaces#1\unskip\ignorespaces}%
+
+\appendtoks
+ \let\raw\menu@raw
+ \let\but\menu@but
+ \let\got\menu@got
+ \let\nop\menu@nop
+ \let\txt\menu@txt
+ \let\rul\menu@rul
+ \let\com\menu@com
+\to \everysetmenucommands
+
+\ifx\do@@amposition\undefined
+ \let\do@@amposition\gobbletwoarguments % hook for positional thingies
+\fi
+
+\let\currentmenu\empty
+
+% beware : never change the concept of pbgoffset
+
+\def\menuparameter#1{\csname\??am\currentmenu#1\endcsname}
+
+\def\@@amhbox#1#2#3#4%
+ {\def\currentmenu{#3}%
+ \testinteractionmenu{#3}%
+ \iflocationmenupermitted
+ \bgroup
+ \showcomposition
+ \scratchdimen\dimexpr
+ \makeupwidth
+ +\pagebackgroundhoffset
+ +\pagebackgroundhoffset
+ -\menuparameter\c!leftoffset
+ -\menuparameter\c!rightoffset
+ \relax
+ \setbox\scratchbox\hbox to \scratchdimen
+ {\forgetall\executeamboxcommands{#3}{#4}\c!left\c!middle\c!right}%
+ \setbox\scratchbox\hbox{\do@@ammenuposition{#3}{\box\scratchbox}}%
+ \wd\scratchbox\makeupwidth % geen \ht=#2 setting (yet)
+ \hskip\dimexpr-\pagebackgroundhoffset+\menuparameter\c!leftoffset\relax
+ \box\scratchbox
+ \egroup
+ \else
+ #1\relax
+ \fi}
+
+\def\@@amvbox#1#2#3#4% don't change skipping, this one works!
+ {\def\currentmenu{#3}%
+ \testinteractionmenu{#3}%
+ \iflocationmenupermitted
+ \bgroup
+ \showcomposition
+ \scratchdimen\dimexpr
+ \textheight
+ +\pagebackgroundvoffset
+ +\pagebackgroundvoffset
+ +\pagebackgrounddepth
+ -\menuparameter\c!topoffset
+ -\menuparameter\c!bottomoffset
+ \relax
+ \setbox\scratchbox\vbox to \scratchdimen
+ {\forgetall % Voor't geval de afstand
+ %\setupblank[\v!standard]% % (tijdelijk) is aangepast.
+ \restorestandardblank
+ \hsize#2\relax
+ \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after}%
+ \setbox\scratchbox\vbox{\hbox{\do@@ammenuposition{#3}{\box\scratchbox}}}%
+ \setbox\scratchbox\vbox
+ {\ht\scratchbox\zeropoint
+ \vskip\dimexpr-\pagebackgroundvoffset+\menuparameter\c!topoffset\relax
+ \box\scratchbox
+ \vskip\pagebackgroundvoffset}% overbodig
+ \ht\scratchbox\textheight
+ \wd\scratchbox#2\relax
+ \box\scratchbox
+ \egroup
+ \else
+ #1\relax
+ \fi}
+
+\ifx\do@@ammenuposition\undefined
+ \let\do@@ammenuposition\gobbleoneargument % hook for positional thingies
+\fi
+
+\setvalue{\??am\s!do\v!right }{\@@amvbox{\dodummypageskip\v!right }\rightedgewidth}
+\setvalue{\??am\s!do\v!left }{\@@amvbox{\dodummypageskip\v!left }\leftedgewidth }
+\setvalue{\??am\s!do\v!top }{\@@amhbox{\dodummypageskip\v!top }\topheight }
+\setvalue{\??am\s!do\v!bottom}{\@@amhbox{\dodummypageskip\v!bottom}\bottomheight }
+
+\def\dointeractionmenu#1#2%
+ {\getvalue{\??am\s!do\getvalue{\??am#1\c!location}}{#1}{#2}}
+
+\unexpanded\def\interactionmenu[#1]%
+ {\getvalue{\??am\c!menu#1}}
+
+\def\horizontalinteractionmenu#1#2#3#4%
+ {\ifdim#2>\zeropoint % new
+ \scratchdimen\zeropoint
+ \setbox\scratchbox\hbox
+ {\def\docommand##1%
+ {\doifnotvalue{\??am##1\c!state}\v!none
+ {\hskip\scratchdimen
+ \setbox2\hbox to #2
+ {\getvalue{\??am##1#3}\interactionmenu[##1]\getvalue{\??am##1#4}}%
+ \doifelsevalue{\??am##1\c!distance}\v!overlay
+ {\scratchdimen\zeropoint
+ \wd2\zeropoint}%
+ {\scratchdimen\getvalue{\??am##1\c!distance}}%
+ \box2}}%
+ \startinteraction
+ \processcommacommand[\getvalue{\??am#1}]\docommand
+ \stopinteraction}%
+ \wd\scratchbox#2\relax
+ \box\scratchbox
+ \fi}
+
+\def\verticalinteractionmenu#1#2#3#4%
+ {\ifdim#2>\zeropoint % new
+ \scratchdimen\zeropoint
+ \setbox\scratchbox\vbox
+ {\def\docommand##1%
+ {\doifnotvalue{\??am##1\c!state}\v!none
+ {\vskip\scratchdimen
+ \setbox2\vbox to #2
+ {\getvalue{\??am##1#3}\interactionmenu[##1]\getvalue{\??am##1#4}}%
+ \doifelsevalue{\??am##1\c!distance}\v!overlay
+ {\scratchdimen\zeropoint
+ \offinterlineskip
+ \dp2\zeropoint
+ \ht2\zeropoint}%
+ {\scratchdimen\getvalue{\??am##1\c!distance}}%
+ \box2}}%
+ \startinteraction
+ \processcommacommand[\getvalue{\??am#1}]\docommand
+ \stopinteraction}%
+ \ht\scratchbox#2\relax
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \fi}
+
+\letvalue{\??am\v!left }\empty
+\letvalue{\??am\v!right}\empty
+\letvalue{\??am\v!top }\empty
+\letvalue{\??am\v!bottom }\empty
+
+% todo : \defineinteractionmenuclass
+
+\def\interactionmenus[#1]%
+ {\iflocation
+ \getvalue{\??am\??am\c!menu#1}%
+ \else
+ \dodummypageskip{#1}%
+ \fi}
+
+\setvalue{\??am\??am\c!menu\v!left }{\horizontalinteractionmenu\v!left \leftedgewidth \c!left \c!right}
+\setvalue{\??am\??am\c!menu\v!right }{\horizontalinteractionmenu\v!right \rightedgewidth\c!left \c!right}
+\setvalue{\??am\??am\c!menu\v!top }{\verticalinteractionmenu \v!top \topheight \c!before\c!after}
+\setvalue{\??am\??am\c!menu\v!bottom}{\verticalinteractionmenu \v!bottom\bottomheight \c!before\c!after}
+
+% this can be implemented with the following command (which
+% is new, undocumented, experimental, untested, etc etc)
+
+\def\defineinteractionmenuclass
+ {\dodoubleargument\dodefineinteractionmenuclass}
+
+\def\dodefineinteractionmenuclass[#1][#2]% tag hori|veri
+ {\doifelse{#2}\v!vertical
+ {\setvalue{\??am\??am\c!menu#1}{\verticalinteractionmenu {#1}{\getvalue{\??am#1\c!width }}\c!before\c!after}}
+ {\setvalue{\??am\??am\c!menu#1}{\horizontalinteractionmenu{#1}{\getvalue{\??am#1\c!height}}\c!left\c!right }}}
+
+% \setupinteraction[menu=on,state=start]
+%
+% \defineinteractionmenuclass[test] [vertical]
+% \defineinteractionmenuclass[another][horizontal]
+%
+% \defineinteractionmenu[test] [left][state=start,width=4cm]
+% \defineinteractionmenu[another][top] [state=start,height=1cm]
+%
+% \startinteractionmenu[test]
+% \but [firstpage] test-a \\
+% \but [nextpage] test-b \\
+% \stopinteractionmenu
+%
+% \startinteractionmenu[another]
+% \but [firstpage] test-a \\
+% \but [nextpage] test-b \\
+% \stopinteractionmenu
+%
+% \setupheadertexts[{\interactionmenu[another]}]
+%
+% \starttext
+%
+% test \interactionmenu[test] \page
+% test \interactionmenu[test] \page
+%
+% \stoptext
+
+%D This can save complicated menu macros when one want to
+%D keep control over parts of a menu (i.e.\ turn them on and
+%D off). We could have achieved something similar with modes.
+
+\def\local@@ambox#1#2#3#4% don't change skipping, this one works!
+ {\bgroup
+ \testinteractionmenu{#3}%
+ \iflocationmenupermitted
+ \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after
+ \else
+ #1\relax
+ \fi
+ \egroup}
+
+\def\includemenu[#1]%
+ {\doifvalue{\??am#1\c!state}\v!local
+ {\bgroup
+ \letvalue{\??am#1\c!state}\v!start
+ \let\@@amvbox\local@@ambox
+ \let\@@amhbox\local@@ambox
+ \getvalue{\??am\c!menu#1}%
+ \egroup}}
+
+%D We also need an explicit position control some day. I'll
+%D do that when I need it. [The stacking order.]
+
+\newif\ifextendedmenu
+
+% [name] [location]
+% [name] [location] [pars]
+
+\def\defineinteractionmenu
+ {\dotripleempty\dodefineinteractionmenu}
+
+\def\dodefineinteractionmenu[#1][#2][#3]%
+ {% main settings
+ \letvalue{\??am\c!menu#1}\empty
+ \setvalue{\@@dodolistelement#1}{\def\dosomelistelement{\dodomenulistelement{#1}}}%
+ \presetlocalframed[\??am#1]%
+ % register location
+ \expanded{\addtocommalist{#1}\@EA\noexpand\csname\??am#2\endcsname}%
+ % inherit settings
+ \doifnot{#1}{#2}
+ {\copyparameters[\??am#1][\??am#2]
+ [\c!left,\c!middle,\c!right,\c!before,\c!after,\c!inbetween,%
+ \c!width,\c!height,\c!distance,\c!offset,%
+ \c!frame,\c!framecolor,\c!rulethickness,%
+ \c!background,\c!backgroundcolor,\c!backgroundscreen,%
+ \c!style,\c!color,\c!contrastcolor,\c!samepage,\c!unknownreference,%
+ \c!leftoffset,\c!rightoffset,\c!topoffset,\c!bottomoffset]}%
+ % additional settings
+ \getparameters[\??am#1][\c!location=#2,\c!obstruction=,#3]}
+
+\def\setupinteractionmenu
+ {\dodoubleargument\dosetupinteractionmenu}
+
+\def\dosetupinteractionmenu[#1][#2]%
+ {\def\docommand##1{\getparameters[\??am##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\expandafter\chardef\csname\??am\??am\v!yes \endcsname\zerocount
+\expandafter\chardef\csname\??am\??am\v!empty\endcsname\plusone
+\expandafter\chardef\csname\??am\??am\v!no \endcsname\plustwo
+\expandafter\chardef\csname\??am\??am\v!none \endcsname\plusthree
+\expandafter\chardef\csname\??am\??am \endcsname\plusone % default
+
+\processbetween{\v!interactionmenu}\dostartinteractionmenu
+
+\def\dostartinteractionmenu#1%
+ {\dodostartinteractionmenu#1\dodostopinteractionmenu}
+
+\def\dodostartinteractionmenu[#1]#2\dodostopinteractionmenu
+ {\setvalue{\??am\c!menu#1}{\extendedmenutrue\dointeractionmenu{#1}{#2}}}
+
+\def\resetinteractionmenu[#1]%
+ {\letvalue{\??am\c!menu#1}\empty}
+
+\def\dodomenulistelement#1#2#3#4#5#6#7%
+ {\setbox0=\hbox
+ {\let\gotolocation\gobbleoneargument % hack to catch last []
+ %\locationclickfalse % ipv ^
+ \docheckrealreferencepage{#7}%
+ \setlocationboxyes
+ {\??am#1}% % needed !
+ []% no settings
+ {\limitatetext{#5}{\getvalue{\??li#2\c!maxwidth}}{\unknown}}% % needed !
+ []}% normally the destination, catch by gobble
+ \@@amboxcommand\do@@amposition{#1}{#7}% beware, we pass the pagenumber
+ {\ignorespaces\linklisttoelement{#3}{#6}{#7}{\box0}\unskip}\\}
+
+% \scherm moet worden als \page
+
+\def\screen
+ {\dosingleempty\doscreen}
+
+\def\doscreen[#1]%
+ {\iflocation\page[#1]\fi}
+
+\unexpanded\def\menubutton
+ {\dodoubleempty\domenubutton}
+
+\def\domenubutton[#1]%
+ {\iffirstargument
+ \ifsecondargument
+ \@EAEAEA\domenubuttonB
+ \else
+ \doifassignmentelse{#1}
+ {\@EAEAEA\domenubuttonC}
+ {\@EAEAEA\domenubuttonD}%
+ \fi
+ \else
+ \@EA\domenubuttonA
+ \fi[#1]}
+
+\def\domenubuttonA[#1][#2]#3[#4]% normal button, no parameters
+ {\bgroup
+ %\locationdummytrue
+ \setlocationbox\??bt[]{#3}[#4]%
+ \egroup}
+
+\def\domenubuttonB[#1][#2]#3[#4]% menu button, with parameters
+ {\bgroup
+ %\locationdummytrue
+ \setlocationbox{\??am#1}[#2]{#3}[#4]%
+ \egroup}
+
+\def\domenubuttonC[#1][#2]#3[#4]% normal button, with parameters
+ {\bgroup
+ %\locationdummytrue
+ \setlocationbox\??bt[#1]{#3}[#4]%
+ \egroup}
+
+\def\domenubuttonD[#1][#2]#3[#4]% menu button, no parameters
+ {\bgroup
+ %\locationdummytrue
+ \setlocationbox{\??am#1}[]{#3}[#4]%
+ \egroup}
+
+\def\menubox
+ {\dodoubleempty\domenubox}
+
+\def\domenubox[#1][#2]#3%
+ {\bgroup
+ \let\setlocationbox\setlocationboxraw
+ \domenubutton[#1][#2]#3[]%
+ \egroup}
+
+% Hier volgen de synchronisatiemacro's:
+
+\def\syncprefix{sync}
+
+%def\syncmarker{syncmark}
+%\definemarking[\syncmarker]
+%\setupmarking[\syncmarker][\c!expansie=\v!ja]
+
+\newmark\syncmarker
+
+\newcounter\synccounter
+
+\newif\ifsynchronisation
+
+\def\startsynchronization%
+ {\iflocation\ifsynchronisation
+ \doglobal\increment\synccounter
+ \fi\fi}
+
+\def\stopsynchronization%
+ {\iflocation\ifsynchronisation
+ %\thisisdestination{\syncprefix:\synccounter}%
+ \pagereference[\syncprefix:\synccounter]%
+ \ifvmode
+ \@EA\setmark\@EA\syncmarker\@EA{\synccounter} % \marking[\syncmarker]{\synccounter}%
+ \else
+ \showmessage\m!interactions4\synccounter
+ \fi
+ \fi\fi}
+
+\def\synchronize%
+ {\startsynchronization
+ \stopsynchronization}
+
+\def\dosetupsynchronization[#1]%
+ {\getparameters[\??sy][#1]%
+ \doifelse\@@systate\v!start
+ \synchronisationtrue
+ \synchronisationfalse}
+
+\def\setupsynchronization
+ {\dosingleargument\dosetupsynchronization}
+
+\def\definesynchronization
+ {\dosingleargument\dodefinesynchronization}
+
+\def\setupsynchronizationbar
+ {\dodoubleargument\getparameters[\??ba]}
+
+\presetlocalframed[\??ba]
+
+\setvalue{synchronisatie\v!page}[#1]%
+ {\bgroup
+ %\setupinteraction[\c!width=\!!zeropoint]%
+ \setinteractionparameter\c!width\!!zeropoint
+ \setbox0\hbox
+ {\localframed[\??ba][]{\dolocationattributes\??ba\c!style\c!color{\strut\@@batext}}}%
+ \dontcomplain
+ \def\atthebottom
+ {\leaders\hrule\!!depth1ex\!!height-.5ex\hfil}%
+ \def\atthetop##1##2##3%
+ {\dimen0=\wd0
+ \divide\dimen0 3
+ \multiply\dimen0 ##2\relax
+ \dimen2=.25em % brrr
+ \advance\dimen0 -##3\dimen2
+ %\gotodestination
+ % {}{#1}{\syncprefix:##1}{}
+ % {\hbox to \dimen0{\color[\locationcolor\@@bacolor]{\atthebottom}}}}%
+ \gotobox
+ {\hbox to \dimen0{\color[\locationcolor\@@bacolor]{\atthebottom}}}%
+ [#1::\syncprefix:##1]}%
+ \hbox
+ {\def\check##1##2%
+ {\edef##2{0##1\syncmarker}%
+ \ifnum0##2=0 \def##2{1}\fi}%
+ \check\gettopmark\top
+ \check\getfirstmark\first
+ \check\getbotmark\bot
+ \setbox2\hbox to \wd0
+ {\ifnum\top=\first\relax
+ \ifnum\first=\bot\relax
+ \atthetop\first30\relax
+ \else
+ \atthetop\first21\hss\atthetop\bot11\relax
+ \fi
+ \else
+ \ifnum\first=\bot\relax
+ \atthetop\top11\hss\atthetop\first21\relax
+ \else
+ \atthetop\top11\hss\atthetop\first11\hss\atthetop\bot11\relax
+ \fi
+ \fi}%
+ \wd2=\zeropoint\box2
+ \box0\relax}%
+ \egroup}
+
+\setvalue{synchronisatie\v!local}[#1]%
+ {\bgroup
+ %\setupinteraction[\c!width=\!!zeropoint]%
+ \setinteractionparameter\c!width\!!zeropoint
+ \def\blackrule{\hbox{\vrule\!!height.5em\!!width.5em}}%
+ %\gotodestination
+ % {}{##1}{\syncprefix:#1}{0}
+ % {\color[\locationcolor\@@bacolor]{\blackrule}}%
+ \gotobox %
+ {\color[\locationcolor\@@bacolor]{\blackrule}}%
+ [#1::\syncprefix:\synccounter]%
+ \egroup}
+
+\def\synchronizationbar[#1][#2]%
+ {\iflocation\ifsynchronisation
+ \bgroup
+ \setupsynchronizationbar
+ [\c!text=\getvalue{doc:des:#1},#2]%
+ \getvalue{synchronisatie\@@baalternative}[#1]%
+ \egroup
+ \fi\fi}
+
+% A nice application of glue. All this code will be rewritten and
+% generalized.
+
+\newbox\interactionbarbox
+
+\newif\ifbarsymbol
+
+\def\dogotosomepage#1#2#3% nog checken !
+ {\checkreferences % nodig ??
+ \hbox
+ {\iflocation
+ \ifnum#3=\realpageno
+ #2%
+ \else
+ \gotorealpage\empty\empty{#3}{\doifsomething{#1}{\dolocationattributes{#1}\c!style\c!color}{#2}}%
+ \fi
+ \else
+ #2%
+ \fi}}
+
+\def\dogotosomecontrastpage#1#2#3% nog checken, may replace previous
+ {\checkreferences % nodig ??
+ \hbox
+ {\iflocation
+ \ifnum#3=\realpageno
+ \gotorealpage\empty\empty{#3}{\doifsomething{#1}{\dolocationattributes{#1}\c!style\c!contrastcolor}{#2}}%
+ \else
+ \gotorealpage\empty\empty{#3}{\doifsomething{#1}{\dolocationattributes{#1}\c!style\c!color}{#2}}%
+ \fi
+ \else
+ #2%
+ \fi}}
+
+\presetlocalframed[\??ib]
+
+\def\interactionbara % we need better control over contrastcolor
+ {\iflocation % maybe just use gotopage and set colors
+ \bgroup
+ \setinteractionparameter\c!width\zeropoint
+ \setupblackrules[\c!height=\v!max,\c!depth=\v!max]%
+ \!!widthb\dimexpr\@@ibwidth-2.75\emwidth\relax
+ \!!widtha\dimexpr\!!widthb/\lastpage\relax
+ \bgroup
+ \advance\realpageno\minusone
+ \ifvoid\interactionbarbox
+ \bgroup
+ \processaction
+ [\@@ibstep]
+ [ \v!small=>\scratchdimen.25\emwidth,
+ \v!medium=>\scratchdimen.5\emwidth,
+ \v!big=>\scratchdimen\emwidth,
+ \s!unknown=>\scratchdimen\!!widtha]%
+ \ifdim\!!widtha<\scratchdimen\relax
+ \!!counta\numexpr\scratchdimen/\!!widtha\relax
+ \else
+ \!!counta\@@ibstep\relax
+ \fi
+ \!!widtha\!!counta\!!widtha
+ \setbox\scratchbox\hbox{\blackrule[\c!width=\!!widtha,\c!color=middlegray]}% color here, else no mkiv
+ \global\setbox\interactionbarbox\hbox to \!!widthb
+ {\hss
+ \dostepwiserecurse\plusone\lastpage\!!counta
+ {\gotorealpage\empty\empty\recurselevel{\copy\scratchbox}}%
+ \hss}%
+ \global\wd\interactionbarbox\zeropoint
+ \egroup
+ \fi
+ \egroup
+ \noindent
+ \strut
+ \hbox to \@@ibwidth
+ {\dontcomplain
+ \setupblackrules[\c!width=\emwidth]%
+ \dogotosomecontrastpage\??ib\blackrule\firstpage
+ \hss
+ \copy\interactionbarbox
+ \hbox to \!!widthb
+ {\ifdim\!!widtha<\emwidth
+ \!!widtha\emwidth
+ \fi
+ \setupblackrules[\c!width=\!!widtha]%
+ \ifnum\realpageno>\plusone
+ \!!counta\numexpr\realpageno-\plustwo\relax
+ \hskip\zeropoint\!!plus\!!counta \s!sp\relax % cm gives overflow
+ \dogotosomepage\??ib\blackrule\prevpage
+ \fi
+ \dogotosomecontrastpage\??ib{\blackrule[\c!width=.5em]}\realpageno
+ \ifnum\realpageno<\lastpage\relax
+ \dogotosomepage\??ib\blackrule\nextpage
+ \!!counta\numexpr\lastpage-\realpageno-\plusone\relax
+ \hskip\zeropoint\!!plus\!!counta \s!sp\relax % cm gives overflow
+ \fi}%
+ \hss
+ \dogotosomecontrastpage\??ib\blackrule\lastpage}%
+ \egroup
+ \fi}
+
+\def\interactionbarb
+ {\ifnum\lastpage>\firstpage\relax
+ \interactionbuttons[\v!firstpage,\v!previouspage,\v!nextpage,\v!lastpage]%
+ \fi}
+
+\def\interactionbarc
+ {\iflocation
+ \ifnum\lastpage>\plusone
+ \hbox to \@@ibwidth
+ {\setupblackrules[\c!height=\@@ibheight,\c!depth=\@@ibdepth]%
+ \scratchdimen\dimexpr(\@@ibwidth-4\emwidth)/\numexpr\lastpage+\minusone\relax\relax
+ \!!widtha\numexpr\realpageno+\minusone\relax\scratchdimen
+ \!!widthb\numexpr\lastpage-\realpageno\relax\scratchdimen
+ \startcolor[\locationcolor\@@ibcolor]%
+ \dogotosomepage\empty{\blackrule[\c!width=\emwidth]}\firstpage
+ \hss
+ \dogotosomepage\empty{\blackrule[\c!width=\!!widtha]}\prevpage
+ \color[\@@ibcontrastcolor]{\blackrule[\c!width=\emwidth]}%
+ \dogotosomepage\empty{\blackrule[\c!width=\!!widthb]}\nextpage
+ \hss
+ \dogotosomepage\empty{\blackrule[\c!width=\emwidth]}\lastpage
+ \stopcolor}%
+ \fi
+ \fi}
+
+\def\interactionbard
+ {\iflocation\ifshowingsubpage
+ \ifnum\nofsubpages>\plusone
+ \hbox \bgroup
+ \setinteractionparameter\c!width\!!zeropoint
+ \ifbarsymbol
+ \setupsymbolset[\@@iasymbolset]%
+ \def\dogotox##1%
+ {\hbox{\symbol[\ifcase##1 \v!previous\or\v!somewhere\or\v!next\fi]}}%
+ \else
+ \def\dogotox##1%
+ {\hbox{\vrule\!!height\@@ibheight\!!depth \@@ibdepth\!!width \@@ibwidth}}%
+ \fi
+ \dostepwiserecurse\plusone\nofsubpages\plusone
+ {\bgroup
+ \scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax
+ \ifnum\scratchcounter<\realpageno\relax
+ \dogotosomecontrastpage\??ib{\dogotox0}\scratchcounter
+ \else\ifnum\scratchcounter=\realpageno\relax
+ \dogotosomecontrastpage\??ib{\dogotox1}\scratchcounter
+ \else
+ \dogotosomecontrastpage\??ib{\dogotox2}\scratchcounter
+ \fi\fi
+ \egroup
+ \hskip\@@ibdistance}%
+ \unskip % not needed
+ \egroup
+ \fi
+ \fi\fi}
+
+\def\interactionbare% KAN WORDEN GECOMBINEERD MET D
+ {\iflocation\ifshowingsubpage
+ \ifnum\nofsubpages>\plusone
+ \bgroup
+ \!!widthb\dimexpr\nofsubpages\dimexpr\@@ibdistance\relax-\@@ibdistance\relax % (n-1)
+ \!!widtha\dimexpr(\@@ibwidth-\!!widthb)/\nofsubpages\relax
+ \ifdim\!!widtha<\@@ibdistance\relax
+ \interactionbarf
+ \else
+ \setinteractionparameter\c!width\!!zeropoint
+ \noindent
+ \hbox to \@@ibwidth
+ \bgroup
+ \ifbarsymbol
+ \setupsymbolset[\@@iasymbolset]%
+ \def\dogotox##1%
+ {\hbox{\symbol[\ifcase##1 \v!previous\or\v!somewhere\or\v!next\fi}}%
+ \else
+ \def\dogotox##1%
+ {\hbox{\vrule\!!height\@@ibheight\!!depth\@@ibdepth\!!width\!!widtha}}%
+ \fi
+ \dostepwiserecurse\plusone\nofsubpages\plusone
+ {\bgroup
+ \scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax
+ \ifnum\scratchcounter<\realpageno\relax
+ \dogotosomecontrastpage\??ib{\dogotox0}\scratchcounter
+ \else\ifnum\scratchcounter=\realpageno\relax
+ \dogotosomecontrastpage\??ib{\dogotox1}\scratchcounter
+ \else
+ \dogotosomecontrastpage\??ib{\dogotox2}\scratchcounter
+ \fi\fi
+ \egroup
+ \hss}%
+ \unskip
+ \egroup
+ \fi
+ \egroup
+ \fi
+ \fi\fi}
+
+\def\interactionbarf % !! KAN WORDEN GECOMBINEERD MET D !!
+ {\iflocation\ifshowingsubpage
+ \ifnum\nofsubpages>\plusone
+ \setinteractionparameter\c!width\!!zeropoint
+ \noindent
+ \hbox to \@@ibwidth
+ \bgroup
+ \!!countb\zerocount
+ \loop % todo: \doloop
+ \advance\!!countb \plusone
+ %\!!countc\nofsubpages \divide\!!countc \!!countb \advance\!!countc \plusone
+ \!!countc\numexpr(\nofsubpages/\!!countb)+\plusone\relax % rounding
+ \!!widthb\@@ibdistance
+ \multiply\!!widthb \!!countc
+ \advance\!!widthb -\@@ibdistance
+ \!!widtha\@@ibwidth
+ \advance\!!widtha -\!!widthb
+ \divide\!!widtha \!!countc
+ \ifdim\!!widtha<\@@ibdistance\relax
+ \repeat
+ \ifnum\!!countc>\plusone
+ % this is not that well tested
+ \advance\!!countc \minustwo
+ \!!widtha-\@@ibdistance
+ \!!widtha\!!countc\!!widtha
+ \advance\!!widtha \@@ibwidth
+ \advance\!!countc \plusone
+ \divide\!!widtha \!!countc
+ \fi
+ \ifbarsymbol
+ \setupsymbolset[\@@iasymbolset]%
+ \def\dogotox##1%
+ {\hbox{\symbol[\ifcase##1 \v!previous\or\v!somewhere\or\v!somewhere\or\v!somewhere\or\v!next\fi}}%
+ \else
+ \def\dogotox##1%
+ {\hbox
+ {\!!heighta\@@ibheight
+ \!!deptha\@@ibdepth
+ \ifcase##1\relax
+ \vrule\!!height \!!heighta\!!depth \!!deptha\!!width\!!widtha
+ \or
+ \vrule\!!height.5\!!heighta\!!depth.5\!!deptha\!!width\!!widtha
+ \or
+ \vrule\!!height \!!heighta\!!depth \!!deptha\!!width\!!widtha
+ \or
+ \vrule\!!height.5\!!heighta\!!depth.5\!!deptha\!!width\!!widtha
+ \or
+ \vrule\!!height \!!heighta\!!depth \!!deptha\!!width\!!widtha
+ \fi}}%
+ \fi
+ \!!countc\numexpr\realpageno-\plustwo\relax
+ \!!countd\numexpr\realpageno+\plustwo\relax
+ \ifnum\!!countc<\plusone \!!countc\plusone \fi
+ \!!countf\zerocount
+ \dostepwiserecurse\firstsubpage\lastsubpage\plusone
+ {\!!doneafalse
+ \advance\!!countf \plusone
+ \ifnum\recurselevel=\firstsubpage\relax \!!doneatrue \fi
+ \ifnum\recurselevel=\lastsubpage\relax \!!doneatrue \fi
+ \if!!donea
+ \ifnum\recurselevel<\realpageno
+ \dogotosomecontrastpage\??ib{\dogotox0}\recurselevel
+ \else\ifnum\recurselevel>\realpageno
+ \dogotosomecontrastpage\??ib{\dogotox2}\recurselevel
+ \else
+ \dogotosomecontrastpage\??ib{\dogotox4}\recurselevel
+ \fi\fi
+ \hss
+ \!!countf\zerocount
+ \else\ifnum\!!countf=\!!countb
+ \ifnum\recurselevel<\realpageno
+ \dogotosomecontrastpage\??ib{\dogotox1}\recurselevel
+ \else\ifnum\recurselevel>\realpageno
+ \dogotosomecontrastpage\??ib{\dogotox3}\recurselevel
+ \else
+ \dogotosomecontrastpage\??ib{\dogotox2}\recurselevel
+ \fi\fi
+ \hss
+ \!!countf\zerocount
+ \fi\fi}%
+ \unskip
+ \egroup
+ \fi
+ \fi\fi}
+
+\def\interactionbarg
+ {\ifnum\lastsubpage>\firstsubpage\relax
+ \interactionbuttons[\v!firstsubpage,\v!previoussubpage,\v!nextsubpage,\v!lastsubpage]%
+ \fi}
+
+\def\checkinteractionbar#1#2#3%
+ {\ifdim\@@ibwidth=\zeropoint\def\@@ibwidth{#1}\fi
+ \doifnothing\@@ibheight{\def\@@ibheight{#2}}%
+ \doifnothing\@@ibdepth{\def\@@ibdepth{#3}}}
+
+\def\complexinteractionbar[#1]%
+ {\doifelse{#1}\v!reset
+ {\global\setbox\interactionbarbox\emptybox}%
+ {\bgroup
+ \iflocation
+ \checksubpages % goes wrong / loads \numberofpages too
+ \getparameters[\??ib][#1]%
+ \doif\@@ibstate\v!start
+ {\startinteraction
+ \processaction % breedte defaults !
+ [\@@ibalternative]
+ [ c=>\checkinteractionbar{10em}\v!max \v!max,
+ d=>\checkinteractionbar{.5em}{.5em} \!!zeropoint,
+ e=>\checkinteractionbar{10em}{.5em} \!!zeropoint,
+ f=>\checkinteractionbar{10em}{.5em} \!!zeropoint,
+ \s!default=>\checkinteractionbar{10em}\v!broad\!!zeropoint,
+ \s!unknown=>\checkinteractionbar{10em}\v!broad\!!zeropoint]%
+ \doifelse\@@ibsymbol\v!yes
+ \barsymboltrue\barsymbolfalse
+ \getvalue{interactionbar\@@ibalternative}%
+ \stopinteraction}%
+ \fi
+ \egroup}}
+
+\definecomplexorsimpleempty\interactionbar
+
+\def\setupinteractionbar
+ {\dodoubleargument\getparameters[\??ib]}
+
+% Er wordt vooralsnog uitgegaan van een symmetrische
+% start-stop situatie.
+
+\def\c!profiel!! {profiel:} % brrr
+\def\c!versie!! {versie:}
+
+\def\dodefineprofile[#1][#2]%
+ {\iflocation
+ \def\dododefineprofile##1%
+ {\def\dodododefineprofile####1%
+ {\doifdefinedelse{\c!profiel!!####1}%
+ {\edef\!!stringa{\getvalue{\c!profiel!!####1}}%
+ \setevalue{\c!profiel!!####1}{\!!stringa,##1}}%
+ {\setevalue{\c!profiel!!####1}{##1}}}%
+ \processcommalist[#2]\dodododefineprofile}%
+ \processcommalist[#1]\dododefineprofile
+ \fi}
+
+\def\defineprofile%
+ {\dodoubleargument\dodefineprofile}
+
+% Als met \getpar wordt gewerkt, dan moet \next worden toegepast.
+
+% TZT initialisatie!
+
+\def\profilepage{}
+
+\let\dosetprofilepage\relax
+\let\dogetprofilepage\relax
+
+\def\processprofile#1[#2]%
+ {\iflocation
+ \par % needed for pdftex
+ \bgroup
+ \dosetprofilepage
+ \dogetprofilepage
+ \def\processoneprofile##1##2%
+ {\ExpandBothAfter\doifinsetelse{##2}{\processedprofiles}%
+ {\doifsomething{##1}{(##1)}}%
+ {\addtocommalist{##2}\processedprofiles
+ ##1\relax
+ \ifcase#1\relax
+ \dobeginofprofile{##2}\paperwidth\paperheight\profilepage
+ \else
+ \doendofprofile
+ \fi}}%
+ \let\processedprofiles\empty
+ \def\doprocessprofile##1%
+ {\doifelse{\@@pfoption}{\v!test}%
+ {\goodbreak\blank\nobreak\tt[\space
+ \ifcase#1\v!start\else\v!stop\fi profiel\space ##1:\space
+ \doifdefinedelse{\c!profiel!!##1}%
+ {\def\dodoprocessprofile####1%
+ {\processoneprofile
+ {\goto{####1}[\c!profiel!!####1]}%
+ {####1}%
+ \space}%
+ \processcommacommand
+ [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}%
+ {- }%
+ ]\nobreak\blank}%
+ {\doifdefined{\c!profiel!!##1}%
+ {\def\dodoprocessprofile####1%
+ {\processoneprofile{}{####1}}%
+ \processcommacommand
+ [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}}}%
+ \processcommalist[#2]\doprocessprofile
+ \egroup
+ \par % needed for pdftex
+ \fi}
+
+\def\startprofile[#1]%
+ {\iflocation
+ \bgroup
+ \addtocommalist{#1}\actualprofile
+ \def\stopprofile%
+ {\processprofile1[#1]%
+ \egroup}%
+ \def\next{\processprofile0[#1]}% % \DoAfterFi \processprofile0[#1]%
+ \else % ^^^^^^^^^^ will be obsolete
+ \let\next\relax % since ugly and never used
+ \fi
+ \next}
+
+\let\stopprofile\relax
+
+\def\dofollowprofile#1[#2]%
+ {\iflocation
+ \hbox
+ {\dohandlegoto
+ {\dolocationattributes\??ia\c!style\c!color{#1\presetgoto}}%
+ {\dostartgotoprofile\buttonwidth\buttonheight{#2}}%
+ {\dostopgotoprofile}}%
+ \else
+ {#1}%
+ \fi}
+
+\def\followprofile#1[#2]%
+ {\iflocation
+ \doif\@@pfoption\v!test{\pagereference[\c!profiel!!#2]}%
+ \dofollowprofile{#1}[#2]%
+ \fi}
+
+\def\setupprofiles%
+ {\dodoubleargument\getparameters[\??pf]}
+
+% Als er nog geen tekst op de pagina staat, dan heeft het
+% profiel betrekking op het bovenstaande, dus soms een vorige
+% pagina! Vreemd, omdat PDF paginagewijs werkt. Gelukkig
+% biedt /page een oplossing. Echter: expansie van een
+% \special kan niet worden uitgesteld, zodat alleen een
+% two-pass een oplossing vormt. Het onderstaande kan komen
+% te vervallen als Acrobat dit ondervangt. Het scheelt een
+% pass en een lijst.
+%
+% Er kunnen eventueel twee lijsten worden gebruikt. Een voor
+% het begin (start) en een voor het eind (stop). Nu staat
+% alles in een lijst.
+
+\definetwopasslist\s!profile
+
+\newcounter\currentprofile
+
+\def\dosetprofilepage%
+ {\doglobal\increment\currentprofile
+ \lazysavetwopassdata{\s!profile}{\currentprofile}{\noexpand\realfolio}}
+
+\def\dogetprofilepage%
+ {\gettwopassdata{\s!profile}%
+ \let\profilepage=\twopassdata}
+
+% is this stuff used at all
+
+\newcounter\versionlevel
+\newcounter\versionorder
+
+\newif\ifrecentversion
+
+\let\oldatcharacter=@
+
+\def\minimumversion{0}
+\def\actualversion{0}
+
+\def\dosetupversions[#1]%
+ {\getparameters[\??ve][#1]
+ \stripcharacter.\from\@@venumber\to\minimumversion}
+
+\def\setupversions
+ {\dosingleargument\dosetupversions}
+
+\definetwopasslist\s!versionbegin
+\definetwopasslist\s!versionend
+
+\let\actualprofile\empty
+
+\def\doresetpageversion
+ {\lazysavetwopassdata{\s!versionend}{\versionorder}{\noexpand\realfolio}}
+
+\def\dosetpageversion#1%
+ {\recentversiontrue
+ \doglobal\increment\versionorder\relax
+ \lazysavetwopassdata{\s!versionbegin}{\versionorder}{\noexpand\realfolio}%
+ \let\resetpageversion\doresetpageversion}
+
+\def\recentcontributions{}
+
+\def\checkrecentcontributions%
+ {\gettwopassdata{\s!versionbegin}%
+ \iftwopassdatafound
+ \!!counta\twopassdata\relax
+ \gettwopassdata{\s!versionend}%
+ \iftwopassdatafound
+ \!!countb\twopassdata\relax
+ \doglobal\increment\versionorder\relax
+ \savetwopassdata{\s!versionbegin}{\versionorder}{\the\!!counta}%
+ \savetwopassdata{\s!versionend }{\versionorder}{\the\!!countb}%
+ \dostepwiserecurse\!!counta\!!countb\plusone
+ {\@EA\doglobal\@EA\addtocommalist\@EA{\recurselevel}{\recentcontributions}}%
+ \let\next\checkrecentcontributions
+ \else
+ \let\next\relax
+ \fi
+ \else
+ \let\next\relax
+ \fi
+ \next}
+
+\def\docheckpageversion
+ {\ExpandBothAfter\doifinsetelse{\realfolio}{\recentcontributions}
+ {\pageselectedtrue}%
+ {\pageselectedfalse}}
+
+\let\setpageversion \gobbleoneargument
+\let\resetpageversion \relax
+\let\checkpageversion \relax
+
+\def\complexstartversion[#1]%
+ {\bgroup
+ \doifelsenothing\actualprofile
+ {\startprofile[#1]}%
+ {\startprofile[#1,\actualprofile]}%
+ \def\docomplexstartversie##1%
+ {\stripcharacter.\from##1\to\actualversion
+ \ifnum\versionlevel>\zerocount\relax
+ \ifnum\actualversion=\zerocount
+ \setpageversion\actualversion % unknown version
+ \else
+ \ifnum\actualversion<\minimumversion\relax
+ \relax % old version
+ \else
+ \setpageversion\actualversion % new version
+ \fi
+ \fi
+ \fi}%
+ \doglobal\increment\versionlevel\relax
+ \doifelsenothing{#1}
+ {\docomplexstartversie{0}}%
+ {\processcommalist[#1]\docomplexstartversie}}
+
+\definecomplexorsimpleempty\startversion
+
+\def\stopversion
+ {\stopprofile
+ \doglobal\decrement\versionlevel
+ \ifnum\versionlevel<\zerocount
+ \showmessage\m!versions1\empty
+ \else
+ \resetpageversion
+ \egroup
+ \fi}
+
+\def\markversion
+ {\showmessage\m!versions2\empty
+ \let\setpageversion\dosetpageversion
+ \let\resetpageversion\relax
+ \let\checkpageversion\relax}
+
+\def\selectversion
+ {\checkrecentcontributions
+ \showmessage\m!versions3\recentcontributions
+ \let\setpageversio\gobbleoneargument
+ \let\resetpageversion\relax
+ \let\checkpageversion\docheckpageversion}
+
+\def\dodefineversion[#1][#2]%
+ {\setvalue{\c!versie!!#1}{#2}%
+ \defineprofile[#1][#2]}
+
+\def\defineversion
+ {\dodoubleargument\dodefineversion}
+
+\def\followversion
+ {\followprofile}
+
+\def\followprofileversion#1[#2][#3]%
+ {\def\docommand##1%
+ {\defineprofile[#2#3][##1]}%
+ \processcommacommand[\getvalue{\c!versie!!#3}]\docommand
+ \followprofile#1[#2#3]}
+
+\newcounter\currentpagetransition
+
+\newif\ifrandomtransitions
+
+\def\setuppagetransitions%
+ {\dosingleempty\dosetuppagetransitions}
+
+\def\dosetuppagetransitions[#1]%
+ {\doifelsenothing{#1}
+ {\doifnot\@@scdelay\v!none
+ {\let\setpagetransition\setsomepagedelay}}
+ {\doifelse{#1}\v!start
+ {\doifnot\@@scdelay\v!none
+ {\let\setpagetransition\setsomepagedelay}}
+ {\doglobal\newcounter\currentpagetransition
+ \doifinsetelse{#1}{\v!reset,\v!stop}
+ {\let\setpagetransition\relax}
+ {\let\setpagetransition\setsomepagetransition
+ \doifinsetelse\v!random{#1}
+ {\randomtransitionstrue}{\randomtransitionsfalse}%
+ \edef\userpagetransitions{#1}%
+ \@EA\removefromcommalist\@EA{\v!random}\userpagetransitions
+ \ifx\userpagetransitions\empty
+ \let\userpagetransitions\pagetransitions
+ \fi}}}}
+
+\def\setsomepagedelay
+ {\expanded{\dosetpagetransition{0}{\@@scdelay}}}
+
+\def\setsomepagetransition
+ {\iflocation
+ \ifrandomtransitions
+ \expanded{\getcommalistsize[\userpagetransitions]}%
+ \getrandomnumber\currentpagetransition1\commalistsize
+ \else
+ \doglobal\increment\currentpagetransition
+ \fi
+ \expanded{\getfromcommalist[\userpagetransitions][\currentpagetransition]}%
+ \doifnumberelse\commalistelement
+ {\expanded{\getfromcommalist[\pagetransitions][\commalistelement]}}
+ {}%
+ \ifx\commalistelement\empty
+ \doglobal\newcounter\currentpagetransition
+ \setsomepagetransition
+ \else
+ \doifelse\@@scdelay\v!none
+ {\expanded{\dosetpagetransition{\commalistelement}{0}}}
+ {\expanded{\dosetpagetransition{\commalistelement}{\@@scdelay}}}%
+ \fi
+ \fi}
+
+\prependtoks \setpagetransition \to \everyshipout
+
+% temporary here
+
+%D \startbuffer
+%D \dorecurse{10}
+%D {\horizontalpositionbar
+%D \pos\recurselevel \min1 \max10
+%D \token\framed{\recurselevel}%
+%D \\}
+%D
+%D \hbox to 15em
+%D {\hss
+%D \dorecurse{10}
+%D {\verticalpositionbar\pos\recurselevel\min1\max10\token\blackrule\\
+%D \hss}}
+%D \stopbuffer
+
+\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\%
+ {\hbox to \hsize
+ {\hskip\zeropoint\!!plus #1\!!fill
+ \hskip\zeropoint\!!plus-#2\!!fill
+ #4\relax
+ \hskip\zeropoint\!!plus #3\!!fill
+ \hskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalpositionbar\pos#1\min#2\max#3\token#4\\%
+ {\vbox to \vsize
+ {\vskip\zeropoint\!!plus #1\!!fill
+ \vskip\zeropoint\!!plus-#2\!!fill
+ \hbox{#4}\relax
+ \vskip\zeropoint\!!plus #3\!!fill
+ \vskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\horizontalgrowingbar\pos#1\min#2\max#3\height#4\depth#5\\%
+ {\hbox to \hsize
+ {\scratchcounter#1%
+ \advance\scratchcounter -#2%
+ \advance\scratchcounter \plusone
+ \leaders\vrule\hskip\zeropoint\!!plus \scratchcounter\!!fill
+ \vrule\!!width\zeropoint\!!height#4\!!depth#5%
+ \hskip\zeropoint\!!plus #3\!!fill
+ \hskip\zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalgrowingbar\pos#1\min#2\max#3\width#4\\%
+ {\vbox to \vsize
+ {\scratchcounter#1%
+ \advance\scratchcounter -#2%
+ \advance\scratchcounter \plusone
+ \leaders\hrule\vskip\zeropoint\!!plus\scratchcounter\!!fill
+ \hrule\!!width#4\!!height\zeropoint\!!depth\zeropoint
+ \vskip\zeropoint\!!plus #3\!!fill
+ \vskip\zeropoint\!!plus-#1\!!fill}}
+
+\newbox\commentbox
+
+\def\doflushcommentanchors
+ {\let\next\relax % new
+ \processaction
+ [\@@cclocation]
+ [% \v!text=>\let\next\relax, % new
+ \v!inmargin=>\let\next\inmargin, % brr not the same as inleft|rightmargin
+ \v!leftedge=>\let\next\inleftedge,
+ \v!rightedge=>\let\next\inrightedge,
+ \v!leftmargin=>\let\next\inleftmargin,
+ \v!rightmargin=>\let\next\inrightmargin]%
+ \next{\hbox{\raise\strutht\box\commentbox}}}
+
+\def\flushcommentanchors % in everypar so indirect
+ {\ifvoid\commentbox\else \doflushcommentanchors \fi}
+
+\def\setupcomment
+ {\dodoubleargument\getparameters[\??cc]}
+
+\setvalue{\e!start\v!comment}% the dummy triple gobbles trailing spaces
+ {\dotripleempty\dostartcommentaar}
+
+\def\comment
+ {\dodoubleempty\docomment}
+
+\def\dodocomment#1%
+ {\!!widtha\@@ccwidth
+ \!!heighta\@@ccheight
+ \doifelse\@@ccoption\v!max
+ {\let\@@ccopen \!!plusone}{\let\@@ccopen \!!zerocount}%
+ \doifelse\@@ccoption\v!buffer
+ {\let\@@cccollect\!!plusone}{\let\@@cccollect\!!zerocount}%
+ \preparecommentvariables
+ \doinsertcomment
+ \@@cctitle\!!widtha\!!heighta
+ \@@cccolor\@@ccopen\@@ccsymbol
+ \@@cccollect{#1}}
+
+\def\preparecommentvariables % more will move here as with fields
+ {\let\@@DriverCommentLayer\@@cctextlayer}
+
+\def\dopreparecommentaar#1#2%
+ {\doifassignmentelse{#1}
+ {\getparameters[\??cc][#1]}
+ {\getparameters[\??cc][\c!title=#1,#2]}%
+ \obeylines
+ \doif\@@ccspace\v!yes\obeyspaces}
+
+\def\dostartcommentaar[#1][#2][#3]%
+ {\bgroup
+ \doifelse\@@ccstate\v!start
+ {\dopreparecommentaar{#1}{#2}%
+ \long\def\docommand##1%
+ {\global\setbox\commentbox\frozenhbox
+ {\hbox to \zeropoint
+ {\struttedbox{\tbox{\dodocomment{##1}}}\hss}%
+ \hskip\ifvoid\commentbox\@@ccmargin\else\@@ccdistance\fi
+ \box\commentbox}%
+ \egroup}}%
+ {\long\def\docommand##1%
+ {\egroup}}%
+ \grabuntil{\e!stop\v!comment}\docommand}
+
+\letvalue{\e!stop\v!comment}\relax % handy for \expanded{...}
+
+\def\docomment[#1][#2]#3%
+ {\doif\@@ccstate\v!start
+ {\hbox to \zeropoint
+ {\dopreparecommentaar{#1}{#2}%
+ \hskip-\@@ccmargin
+ \struttedbox{\tbox{\dodocomment{#3}}\hss}}}%
+ \ignorespaces}
+
+% \startcomment
+% hello beautiful\\world
+% \stopcomment
+%
+% \startcomment[hello]
+% hello << \'e\'erste >>
+% beautiful
+% world
+% \stopcomment
+%
+% \startcomment[hello][color=green,width=4cm,height=3cm]
+% hello \leftguillemot\ \'e\'erste \rightguillemot\
+% beautiful
+% world
+% \stopcommentaar
+%
+% \startcomment[hello][color=green,width=4cm,height=3cm]
+% hello \leftguillemot\ \'e\'erste \rightguillemot\ test
+%
+% beautiful
+%
+% world
+% \stopcomment
+%
+% \startcomment[symbol=Balloon]
+% Do we want this kind of rubish? And, why isn't this and
+% some more features related to text annotations so poorly
+% (actually not) documented? Anyhow, by providing this
+% functionality we demonstrate that \pdfTeX\ can do it. By
+% the way, it's funny that when in Acrobat we scale up the
+% text, the symbols scale down.
+% \stopcomment
+
+% \definesymbol [comment-normal][{\externalfigure[cow.pdf]}]
+% \definesymbol [comment-down] [{\externalfigure[cow.pdf]}]
+%
+% \def\CowSymbol#1#2%
+% {\scale
+% [\c!height=#1]
+% {\startMPcode
+% loadfigure "koe.mp" number 1 ;
+% refill currentpicture withcolor #2 ;
+% \stopMPcode}}
+%
+% \definesymbol [comment-normal]
+% [\CowSymbol{4ex}{red}]
+%
+% \definesymbol [comment-down]
+% [\CowSymbol{4ex}{green}]
+%
+% \setupcomment
+% [\c!symbol={comment-normal,comment-down},
+% \c!option=\v!buffer]
+%
+% \setupfootertexts[\placecomments]
+
+\def\placecomments
+ {\doflushcomments}
+
+% \setupinteraction[state=start]
+%
+% \useattachment[test.tex]
+% \useattachment[whatever][test.tex]
+% \useattachment[whatever][newname][test.tex]
+% \useattachment[whatever][title][newname][test.tex]
+%
+% % \setupattachments[\c!symbol={symbol-normal,symbol-down}]
+%
+% \starttext \attachment[whatever] \stoptext
+
+
+\def\useattachment
+ {\doquadrupleempty\douseattachment}
+
+\def\douseattachment[#1][#2][#3][#4]% tag title newname filename
+ {\iffourthargument
+ \setgvalue{\??at:#1}{{#2}{#3}{#4}}% tooltip kind of case
+ \else\ifthirdargument
+ \setgvalue{\??at:#1}{{#2}{#2}{#3}}% full path case
+ \else\ifsecondargument
+ \setgvalue{\??at:#1}{{#2}{#2}{#2}}% obvious case
+ \else
+ \setgvalue{\??at:#1}{{#1}{#1}{#1}}% worst case
+ \fi\fi\fi}
+
+\let\attachmenttitle\empty
+\let\attachmentname \empty
+\let\attachmentfile \empty
+
+\def\getattachmentdata[#1]%
+ {\edef\attachmenttitle{\filterfromvalue{\??at:#1}31}% description
+ \edef\attachmentname {\filterfromvalue{\??at:#1}32}% new name
+ \edef\attachmentfile {\filterfromvalue{\??at:#1}33}% original
+ \expandafter\splitstring\attachmentname\at.\to\!!stringa\and\!!stringb
+ \ifx\!!stringb\empty % no suffix, so we need to inherit it
+ \expandafter\splitstring\attachmentfile\at.\to\!!stringc\and\!!stringd
+ \edef\attachmentname{\attachmentname.\!!stringd}%
+ \fi}
+
+\def\attachment
+ {\dodoubleempty\doattachment}
+
+\def\doattachment[#1][#2]% currently title equals newname
+ {\iflocation
+ \ifsecondargument
+ \doifundefined{\??at:#2}
+ {\showmessage\m!interactions6{#2}%
+ \useattachment[#2]}%
+ \doif\@@atstate\v!start
+ {\bgroup
+ \getattachmentdata[#2]%
+ \doiffileelse\attachmentfile
+ {\setupattachments[#1]%
+ \presetattachmentvariables
+\struttedbox{\tbox{%
+ \doattachfile
+ \attachmenttitle
+ {1em}\strutheight\strutdepth\@@atcolor\@@atsymbol
+ \attachmentname
+ \attachmentfile}%
+}}%
+ {\showmessage\m!interactions5\attachmentfile}%
+ \egroup}%
+ \else\iffirstargument
+ \attachment[][#1]%
+ \fi\fi
+ \fi}
+
+\def\presetattachmentvariables
+ {\let\@@DriverAttachmentLayer\@@attextlayer}
+
+\def\setupattachments
+ {\dodoubleempty\getparameters[\??at]}
+
+\setupattachments
+ [\c!state=\v!start,
+ \c!color=\@@iacolor,
+ \c!textlayer=,
+ \c!symbol=]
+
+% jammer, tussen/midden had erin gemoeten; \c!commando toevoegen
+
+\def\registermenucommand#1%
+ {{\textonly\noindent#1\space}} % no math switching
+
+\def\doregistermenubuttons[#1][#2]% [menu id] [register]
+ {\bgroup
+ \ifsecondargument
+ \setupinteractionmenu
+ [#1][\c!unknownreference=\v!yes,\c!samepage=\v!yes]%
+ \def\docommand##1%
+ {\registermenucommand{\menubutton[#1]{##1}[#2:##1]}}%
+ \else
+ \def\docommand##1%
+ {\registermenucommand
+ {\button
+ [\c!unknownreference=\v!yes,\c!samepage=\v!yes]
+ {##1}[#1:##1]}}%
+ \fi
+ \handletokens abcdefghijklmnopqrstuvwxyz\with\docommand % moet anders
+ \egroup}
+
+\def\registermenubuttons
+ {\dodoubleempty\doregistermenubuttons}
+
+% It took quite a while to figure this out (using the preliminary 1.5
+% spec). There are still a lot of things to be implemented. This is
+% the third alternative.
+
+% todo: multiple instances, dus indirect
+
+\let\currentrendering\empty
+
+\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}]
+\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}]
+\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}]
+\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}]
+
+\newcounter\nofexternalrenderings
+
+\def\useexternalrendering{\doquadrupleempty\douseexternalrendering}
+\def\setinternalrendering{\dodoubleempty \dosetinternalrendering}
+
+\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options
+ {\setgvalue{\??rd:#1}{\plusone{#1}{#2}{#3}{#4}}}
+
+\def\dosetinternalrendering[#1][#2]% tag options {content}
+ {\bgroup
+ \dowithnextbox
+ {\setgvalue{\??rd:#1}{\plustwo{#1}{IRO}{#1}{#2}}%
+ \let\objectoffset\zeropoint
+ \setobject{IRO}{#1}\hbox{\box\nextbox}%
+ \egroup}%
+ \hbox}
+
+\def\checkrendering#1% let's hope that \next is not used
+ {\iflocation
+ \doifsomething{#1}%
+ {\doifdefined{\??rd:#1}%
+ {\expanded{\getvalue{\??rd::\number\renderingtype{#1}}%
+ {\filterfromvalue{\??rd:#1}52}{\filterfromvalue{\??rd:#1}53}%
+ {\filterfromvalue{\??rd:#1}54}{\filterfromvalue{\??rd:#1}55}}}}%
+ \fi}
+
+\setvalue{\??rd::1}{\doinsertrendering}
+\setvalue{\??rd::2}{\doinsertrenderingobject}
+
+\def\renderingtype #1{\filterfromvalue{\??rd:#1}51}
+\def\renderingoptions#1{\filterfromvalue{\??rd:#1}55}
+
+\setexecutecommandcheck {startrendering} \checkrendering
+\setexecutecommandcheck {stoprendering} \checkrendering
+\setexecutecommandcheck {pauserendering} \checkrendering
+\setexecutecommandcheck {resumerendering} \checkrendering
+
+% by using a nice trick (used in other places of context as well) we
+% can easily overload the default size to match the opbject size
+
+\def\renderingwidth {8cm}
+\def\renderingheight{6cm}
+
+\def\definerenderingwindow
+ {\dodoubleempty\dodefinerenderingwindow}
+
+\def\dodefinerenderingwindow[#1][#2]%
+ {\presetlocalframed[\??rw#1]%
+ \getparameters%
+ [\??rw#1]%
+ [\c!openpageaction=,\c!closepageaction=,%
+ \c!width=\renderingwidth,\c!height=\renderingheight,%
+ #2]}
+
+\def\setuprenderingwindow
+ {\dodoubleargument\dosetuprenderingwindow}
+
+\def\dosetuprenderingwindow[#1]%
+ {\getparameters[\??rw#1]}
+
+\def\placerenderingwindow
+ {\dodoubleempty\doplacerenderingwindow}
+
+\def\doplacerenderingwindow[#1][#2]%
+ {\bgroup
+ \edef\currentrendering{\ifsecondargument#2\else#1\fi}%
+ \ifcase\renderingtype\currentrendering\or
+ % a file
+ \or
+ % an object
+ \getobjectdimensions{IRO}\currentrendering
+ \scratchdimen\objectheight
+ \advance\scratchdimen\objectdepth
+ \edef\renderingheight{\the\scratchdimen}%
+ \edef\renderingwidth{\objectwidth}%
+ \fi
+ % create fall back if needed
+ \doifdefinedelse{\??rw#1\c!width}
+ {\def\currentrenderingwindow{#1}}
+ {\let\currentrenderingwindow\s!default
+ \definerenderingwindow[\currentrenderingwindow]}%
+ \checkrendering\currentrendering
+ \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction
+ \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction
+ \localframed
+ [\??rw\currentrenderingwindow][\c!offset=\v!overlay]%
+ {\expanded{\doinsertrenderingwindow
+ \noexpand\currentrendering\hsize\vsize{\renderingoptions\currentrendering}}}%
+ \egroup}
+
+% todo:
+%
+% \setinternalrendering[example-1][options]{}
+
+% test file:
+%
+% \definerenderingwindow
+% [example]
+% [width=320pt,height=150pt,frame=off,
+% background=color,backgroundcolor=gray,
+% openpageaction=StartCurrentRendering,
+% closepageaction=NextPage]% StopCurrentRendering]
+%
+% \useexternalrendering[example-1][audio/mpeg] [eldorado.mp3]
+% \useexternalrendering[example-2][audio/mpeg] [myst-12.mp3]
+% \useexternalrendering[example-3][application/x-shockwave-flash][http://localhost/mb.swf] [auto]
+% \useexternalrendering[example-4][application/x-shockwave-flash][celebration.swf]
+% \useexternalrendering[example-5][video/quicktime] [p1000726.mov]
+% \useexternalrendering[example-6][application/smil] [quadratic_map.smi]
+%
+% \def\renderingmenu[#1]%
+% {\hbox
+% {\setupbuttons[width=2.5em]%
+% \button{\symbol[StartRendering]} [StartRendering{#1}]\enspace
+% \button{\symbol[StopRendering]} [StopRendering{#1}]\enspace
+% \button{\symbol[PauseRendering]} [PauseRendering{#1}]\enspace
+% \button{\symbol[ResumeRendering]}[ResumeRendering{#1}]}}
+%
+% \renderingmenu[example-1]\blank
+% \renderingmenu[example-2]\blank
+% \renderingmenu[example-3]\blank
+% \renderingmenu[example-4] \placefigure{A ShockWave}{\placerenderingwindow[example][example-4]} \page
+% \renderingmenu[example-5] \placefigure{A Movie}{\placerenderingwindow[example][example-5]} \page
+% \renderingmenu[example-6] \placefigure{A Smile}{\placerenderingwindow[example][example-6]}
+
+\stelkoppelingenin
+ [\c!distance=.25em,
+ \c!width=\v!fit,
+ \c!location=\v!low,
+ \c!color=\@@iacolor,
+ \c!frame=\v!off,
+ \c!background=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=]
+
+\defineinteractionmenu
+ [\v!right]
+ [\v!right]
+ [\c!before=,
+ \c!after=\vfil,
+ \c!inbetween=\blank,
+ \c!distance=\bodyfontsize, % 12pt
+ \c!left=\hss,
+ \c!right=\hss,
+ \c!width=\rightedgewidth,
+ \c!height=\v!broad]
+
+\defineinteractionmenu
+ [\v!left]
+ [\v!left]
+ [\c!before=,
+ \c!after=\vfil,
+ \c!inbetween=\blank,
+ \c!distance=\bodyfontsize, % 12pt
+ \c!left=\hss,
+ \c!right=\hss,
+ \c!width=\leftedgewidth,
+ \c!height=\v!broad]
+
+\defineinteractionmenu
+ [\v!bottom]
+ [\v!bottom]
+ [\c!before=\vss,
+ \c!after=\vss,
+ \c!middle=\hfil,
+ \c!distance=\bodyfontsize, % 12pt
+ \c!width=\v!fit,
+ \c!height=\v!broad]
+
+\defineinteractionmenu
+ [\v!top]
+ [\v!top]
+ [\c!before=\vss,
+ \c!after=\vss,
+ \c!middle=\hfil,
+ \c!distance=\bodyfontsize, % 12pt
+ \c!width=\v!fit,
+ \c!height=\v!broad]
+
+\setupinteractionmenu
+ [\v!left,\v!right,\v!top,\v!bottom]
+ [\c!offset=.25em,
+ \c!position=\v!no,
+ \c!frame=\v!on,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!style=\@@iastyle,
+ \c!color=\@@iacolor,
+ \c!contrastcolor=\@@iacontrastcolor,
+ \c!state=\v!start,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!empty,
+ \c!topoffset=\!!zeropoint,
+ \c!bottomoffset=\!!zeropoint,
+ \c!leftoffset=\!!zeropoint,
+ \c!rightoffset=\!!zeropoint]
+
+\def\placeleftedgetextblock % Is \hss/\hsize really needed here?
+ {\hbox to \leftedgewidth % (check outer level and settings)
+ {\hsize\leftedgewidth\hss\interactionmenus[\v!left]}}
+
+\def\placerightedgetextblock % Is \hss/\hsize really needed here?
+ {\hbox to \rightedgewidth % (check outer level and settings)
+ {\hsize\rightedgewidth\interactionmenus[\v!right]\hss}}
+
+\def\placetoptextblock
+ {\vbox to \topheight
+ {\vsize\topheight
+ \csname\??tk\v!top\c!before\endcsname
+ \interactionmenus[\v!top]%
+ \csname\??tk\v!top\c!after\endcsname
+ \kern\zeropoint}}
+
+\def\placebottomtextblock
+ {\vbox to \bottomheight
+ {\vsize\bottomheight
+ \csname\??tk\v!bottom\c!before\endcsname
+ \interactionmenus[\v!bottom]%
+ \csname\??tk\v!bottom\c!after\endcsname
+ \kern\zeropoint}}
+
+\ifx\leftedgetextcontent\undefined \else
+
+ \appendtoks \placeleftedgetextblock \hskip-\leftedgewidth \to \leftedgetextcontent
+ \appendtoks \placerightedgetextblock \hskip-\rightedgewidth \to \rightedgetextcontent
+ \appendtoks \placetoptextblock \vskip-\topheight \to \toptextcontent
+ \appendtoks \placebottomtextblock \vskip-\bottomheight \to \bottomtextcontent
+
+\fi
+
+\setupinteractionscreen
+ [\c!width=\printpaperwidth,
+ \c!height=\printpaperheight,
+ \c!horoffset=\!!zeropoint,
+ \c!veroffset=\!!zeropoint,
+ \c!backspace=\backspace,
+ \c!topspace=\topspace,
+ \c!option=\v!min,
+ \c!delay=\v!none]
+
+\setupbuttons
+ [\c!state=\v!start,
+ \c!width=\v!fit,
+ \c!height=\v!broad,
+ \c!offset=0.25em,
+ \c!frame=\v!on,
+ \c!background=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=,
+ \c!style=\@@iastyle,
+ \c!color=\@@iacolor,
+ \c!contrastcolor=\@@iacontrastcolor,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!yes]
+
+\setupinteractionbar
+ [\c!state=\v!start,
+ \c!alternative=a,
+ \c!symbol=\v!no,
+ \c!width=\rightedgewidth,
+ \c!height=, % these are taken care
+ \c!depth=, % of at calling time
+ \c!distance=.5em, % beter relateren aan breedte
+ \c!step=1,
+ \c!color=\@@iacolor,
+ \c!contrastcolor=\@@iacontrastcolor,
+ \c!frame=\v!on,
+ \c!background=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!yes]
+
+\setupsynchronizationbar
+ [\c!alternative=\v!page,
+ \c!width=\rightedgewidth,
+ \c!style=\@@iastyle,
+ \c!color=\@@iacolor,
+ \c!background=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=]
+
+\setupsynchronization
+ [\c!state=\v!stop]
+
+\setupprofiles
+ [\c!option=]
+
+\setuppagetransitions
+ [\v!reset]
+
+\setupcomment
+ [\c!state=\v!start,
+ \c!margin=2.5em,
+ \c!distance=1em,
+ \c!width=.3\textwidth,
+ \c!height=.2\textheight,
+ \c!color=\@@iacolor,
+ \c!title=,
+ \c!space=\v!no,
+ \c!symbol=\v!normal,
+ \c!location=\v!inmargin,
+ \c!option=,
+ \c!textlayer=]
+
+\setupversions % beware, @ is made active here,
+ [\c!number=1, % therefore we set this one at the end
+ \c!style=\ss,
+ \c!color=]
+
+\protect \endinput
diff --git a/tex/context/base/scrn-int.mkiv b/tex/context/base/scrn-int.mkiv
new file mode 100644
index 000000000..11734e0d7
--- /dev/null
+++ b/tex/context/base/scrn-int.mkiv
@@ -0,0 +1,610 @@
+%D \module
+%D [ file=scrn-int,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Interaction,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Screen Macros / Interaction}
+
+\registerctxluafile{scrn-int}{1.001}
+
+\unprotect
+
+%D This is an update of \MKII\ code. In the process profiles and versions
+%D were removed as I never used them (although they were kind of cool at
+%D that time).
+
+% a bit complex due to papercomment (see imposition code)
+
+\newtoks\everysetupinteractionscreen
+
+\unexpanded\def\setupinteractionscreen
+ {\dosingleempty\dosetupinteractionscreen}
+
+\def\dosetupinteractionscreen[#1]%
+ {\getparameters[\??sc][#1]%
+ \the\everysetupinteractionscreen}
+
+\def\synchronizepaperdimensionssimple % simple version
+ {\bgroup
+ \ifx\@@ppleft \empty
+ \ifx\@@ppright \empty
+ \ifx\@@pptop \empty
+ \ifx\@@ppbottom \empty
+ \ifx\@@pcstate\v!start
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi
+ \iflocation % without screen settings
+ \ctxlua{backends.codeinjections.setupcanvas {
+ paperwidth = \number\paperwidth,
+ paperheight = \number\paperheight
+ }}%
+ \else
+ \ctxlua{backends.codeinjections.setupcanvas {
+ paperwidth = \number\printpaperwidth,
+ paperheight = \number\printpaperheight
+ }}%
+ \fi
+ \egroup}
+
+\def\synchronizepaperdimensionscomplex % complex version
+ {\bgroup
+ \edef\@@scwidth {\@@scwidth}%
+ \edef\@@scheight{\@@scheight}%
+ \ifx\@@scwidth\v!fit
+ \!!widtha\leftcombitotal
+ \ifdim\backspace>\!!widtha\ifdim\backspace>\zeropoint\relax
+ \advance\backspace -\!!widtha
+ \fi\fi
+ \advance\!!widtha\dimexpr\rightcombitotal+2\dimexpr\@@scbackspace+\@@schoroffset\relax\relax
+ \else\ifx\@@scwidth\v!max
+ \!!widtha\printpaperwidth
+ \else
+ \!!widtha\@@scwidth
+ \fi\fi
+ \ifx\@@scheight\v!fit
+ \!!heighta\dimexpr\topheight+\topdistance\relax
+ \ifdim\topspace>\!!heighta\ifdim\topspace>\zeropoint\relax
+ \advance\topspace -\!!heighta
+ \fi\fi
+ \advance\!!heighta\dimexpr\makeupheight+\bottomdistance+\bottomheight+2\dimexpr\@@sctopspace+\@@scveroffset\relax\relax
+ \else\ifx\@@scheight\v!max
+ \!!heighta\printpaperheight
+ \else
+ \!!heighta\@@scheight
+ \fi\fi
+ \doif\@@scdelay\v!none{\let\@@scdelay\zerocountervalue}%
+ \ifdim\!!widtha>\paperwidth\ifdim\!!widtha>\zeropoint
+ \paperwidth\!!widtha
+ \fi\fi
+ \ifdim\!!heighta>\paperheight\ifdim\!!heighta>\zeropoint
+ \paperheight\!!heighta
+ \fi\fi
+ \ctxlua{backends.codeinjections.setupcanvas {
+ mode = "\@@scoption",
+ % doublesided = \ifsinglesided false\else\ifdoublesided true\else false\fi\fi,
+ singlesided = \ifsinglesided true\else false\fi,
+ doublesided = \ifdoublesided true\else false\fi,
+ leftoffset = \number\dimexpr\backoffset\relax,
+ topoffset = \number\dimexpr\topoffset \relax,
+ width = \number\dimexpr\!!widtha \relax,
+ height = \number\dimexpr\!!heighta \relax,
+ paperwidth = \number\paperwidth,
+ paperheight = \number\paperheight
+ }}%
+ \egroup}
+
+\let\synchronizepaperdimensions \synchronizepaperdimensionscomplex
+
+\appendtoks
+ \ifproductionrun
+ \doifelse\@@pcstate\v!start
+ {\let\synchronizepaperdimensions\synchronizepaperdimensionssimple}
+ {\let\synchronizepaperdimensions\synchronizepaperdimensionscomplex}%
+ \fi
+\to \everysetupinteractionscreen
+
+\appendtoks \synchronizepaperdimensions \to \everyshipout
+
+%D The next mechanism, linked lists, is quite old and
+%D is \MKIV'd for completeness. I will finish the
+%D confuguration part when I need it.
+
+% todo: a kind of button that gets a tag passed (\??tk)
+
+% \starttext
+% \setupinteraction[state=start]
+% \definelinkedlist[demo]
+% \dorecurse{10}{\linkedlistelement[demo]{link \recurselevel} \page}
+% \stoptext
+
+\def\linkedlistparameter #1{\csname\dolinkedlistparameter{\??lk\currentlinkedlist}#1\endcsname}
+\def\dolinkedlistparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dolinkedlistparentparameter\csname#1\s!parent\endcsname#2\fi}
+\def\dolinkedlistparentparameter#1#2{\ifx#1\relax\s!empty\else\dolinkedlistparameter#1#2\fi}
+
+\unexpanded\def\definelinkedlist{\dodoubleargument\dodefinelinkedlist}
+\unexpanded\def\setuplinkedlist {\dodoubleargument\dosetuplinkedlist }
+\unexpanded\def\setuplinkedlists{\dosingleargument\dosetuplinkedlists}
+
+\def\dodefinelinkedlist[#1][#2]%
+ {\ctxlua{interactions.definelinkedlist("#1")}%
+ \getparameters[\??lk#1][\s!parent=\??lk,#2]}
+
+\def\dosetuplinkedlist[#1][#2]%
+ {\getparameters[\??lk#1][#2]}
+
+\def\dosetuplinkedlists[#1]%
+ {\getparameters[\??lk][#1]}
+
+\def\setlinkproperties#1#2#3#4#5#6%
+ {\def\currentlink {#1}%
+ \def\noflinks {#2}%
+ \def\firstlink {#3}%
+ \def\previouslink{#4}%
+ \def\nextlink {#5}%
+ \def\lastlink {#6}}
+
+\def\linkedlistelement[#1]#2% currently no view support
+ {\dontleavehmode\hbox\bgroup
+ #2%
+ \iflocation
+ \edef\currentlinkedlist{#1}%
+ \ifcsname\??lk\currentlinkedlist\s!parent\endcsname
+ \hskip\linkedlistparameter\c!distance
+ \ctxlua{interactions.addlinktolist("\currentlinkedlist")}%
+ \expanded{\ctxlatelua{interactions.enhancelinkoflist("\currentlinkedlist",\currentlink)}}%
+ \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink
+ \ifnum\noflinks>\plustwo
+ \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink
+ \dogotosomepage{\??lk\currentlinkedlist}\goforwardcharacter \nextlink
+ \fi
+ \dogotosomepage {\??lk\currentlinkedlist}\gotoendcharacter \lastlink
+ \else
+ \writestatus\m!interactions{no such linked list: \currentlinkedlist}%
+ \fi
+ \fi
+ \egroup}
+
+\setuplinkedlists
+ [\c!distance=.25em,
+ \c!width=\v!fit,
+ \c!location=\v!low,
+ \c!color=\@@iacolor,
+ \c!frame=\v!off,
+ \c!background=,
+ \c!backgroundcolor=]
+
+\def\koppeling {\linkedlistelement}
+\def\stelkoppelingenin {\setuplinkedlists}
+\def\definieerkoppeling{\definelinkedlist}
+
+%D Conditional page breaks:
+
+\def\screen
+ {\dosingleempty\doscreen}
+
+\def\doscreen[#1]%
+ {\iflocation\page[#1]\fi}
+
+%D Page transitions:
+
+\let\askedpagetransitions\empty
+
+\unexpanded\def\setuppagetransitions
+ {\dosingleempty\dosetuppagetransitions}
+
+\def\dosetuppagetransitions[#1]%
+ {\edef\askedpagetransitions{#1}}
+
+\def\setpagetransition
+ {\iflocation \ifx\askedpagetransitions\empty \else
+ \ctxlua{backends.codeinjections.setpagetransition{ n = "\askedpagetransitions", delay = "\@@scdelay" }}%
+ \fi \fi}
+
+\prependtoks \setpagetransition \to \everyshipout
+
+\setuppagetransitions
+ [\v!reset]
+
+%D Comments:
+
+\newbox\commentcollection
+\newbox\commentbox
+\newbox\commentboxone
+\newbox\commentboxtwo
+
+\def\raisedcommentanchors#1#2{#1{\hbox{\raise\strutht#2}}}
+
+\setvalue{\??cc:\c!location:\v!inmargin }{\raisedcommentanchors\inmargin }
+\setvalue{\??cc:\c!location:\v!leftedge }{\raisedcommentanchors\inleftedge }
+\setvalue{\??cc:\c!location:\v!rightedge }{\raisedcommentanchors\inrightedge }
+\setvalue{\??cc:\c!location:\v!leftmargin }{\raisedcommentanchors\inleftmargin }
+\setvalue{\??cc:\c!location:\v!rightmargin}{\raisedcommentanchors\inrightmargin}
+
+\let\flushcommentanchors\relax
+
+\def\doflushcommentanchors
+ {\global\let\flushcommentanchors\relax
+ \ifvoid\commentbox\else\dodoflushcommentanchors\fi} % in everypar so indirect
+
+\def\dodoflushcommentanchors
+ {\executeifdefined{\??cc:\c!location:\@@cclocation}\hbox{\box\commentbox}}
+
+\unexpanded\def\setupcomment
+ {\dodoubleargument\getparameters[\??cc]}
+
+\unexpanded\def\placecomments{\box\commentcollection} % when option=buffer
+
+\def\doinsertcomment#1%
+ {\begingroup
+ \ctxlua{backends.codeinjections.presetsymbollist("\@@ccsymbol")}%
+ % in between predefined symbols are dealt with
+ \ctxlua{backends.codeinjections.registercomment {
+ title = "\@@cctitle",
+ width = \number\dimexpr\@@ccwidth \relax,
+ height = \number\dimexpr\@@ccheight\relax,
+ colormodel = \number\currentcolormodel,
+ colorvalue = \thecolorattribute{\@@cccolor},
+ open = \@@ccopen,
+ symbol = "\@@ccsymbol",
+ buffer = "#1",
+ layer = "\@@cctextlayer"
+ }}%
+ \box\commentboxone
+ \doif\@@ccoption\v!buffer
+ {\setbox\scratchbox\vbox to \@@ccheight{\forgetall\vss\box\commentboxtwo}%
+ \wd\scratchbox\@@ccwidth
+ \global\setbox\commentcollection\vbox
+ {\startoverlay{\box\commentcollection}{\box\scratchbox}\stopoverlay}}%
+ \endgroup}
+
+\setvalue{\e!start\v!comment}{\dotripleempty\dostartcomment}% the dummy triple gobbles trailing spaces
+
+\def\dostartcomment[#1][#2][#3]%
+ {\bgroup
+ \doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}%
+ \doifelse\@@ccoption\v!max{\let\@@ccopen\s!true}{\let\@@ccopen\s!false}%
+ \setcurrentbuffer{\v!comment\v!buffer}%
+ \dostartbuffer[\v!comment\v!buffer][\v!comment\v!buffer][\e!start\v!comment][\e!stop\v!comment]}
+
+\unexpanded\def\stopcomment
+ {\doif\@@ccstate\v!start
+ {\global\let\flushcommentanchors\doflushcommentanchors
+ \global\setbox\commentbox\frozenhbox
+ {\hbox to \zeropoint{\struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}}\hss}%
+ \hskip\ifvoid\commentbox\@@ccmargin\else\@@ccdistance\fi
+ \box\commentbox}}%
+ \egroup}
+
+\def\comment
+ {\dodoubleempty\docomment}
+
+\def\docomment[#1][#2]#3%
+ {\doif\@@ccstate\v!start
+ {\hbox to \zeropoint
+ {\doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}%
+ \hskip-\@@ccmargin
+ \ctxlua{buffers.set("\v!comment\v!buffer", \!!bs\detokenize{#3}\!!es)}%
+ \struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}\hss}}}%
+ \ignorespaces}
+
+% test
+%
+% \startcomment
+% hello beautiful\\world
+% \stopcomment
+%
+% test
+%
+% \startcomment[hello]
+% hello << eerste >>
+% beautiful
+% world
+% \stopcomment
+%
+% test
+%
+% \startcomment[hello][color=green,width=10cm,height=3cm]
+% hello \leftguillemot\ \'e\'erste \rightguillemot\
+% beautiful
+% world
+% \stopcomment
+%
+% test
+%
+% \startcomment[hello][color=red,width=4cm,height=3cm]
+% hello \leftguillemot\ \'e\'erste \rightguillemot\ test
+%
+% beautiful
+%
+% world
+% \stopcomment
+%
+% test
+%
+% \startcomment[symbol=Balloon]
+% Do we want this kind of rubish? And, why isn't this and
+% some more features related to text annotations so poorly
+% (actually not) documented? Anyhow, by providing this
+% functionality we demonstrate that \pdfTeX\ can do it. By
+% the way, it's funny that when in Acrobat we scale up the
+% text, the symbols scale down.
+% \stopcomment
+%
+% test
+%
+% \definesymbol [comment-normal][{\externalfigure[cow.pdf]}]
+% \definesymbol [comment-down] [{\externalfigure[cow.pdf]}]
+%
+% \def\CowSymbol#1#2%
+% {\scale
+% [\c!height=#1]
+% {\startMPcode
+% loadfigure "koe.mp" number 1 ;
+% refill currentpicture withcolor #2 ;
+% \stopMPcode}}
+%
+% \definesymbol [comment-normal]
+% [\CowSymbol{4ex}{red}]
+%
+% \definesymbol [comment-down]
+% [\CowSymbol{4ex}{green}]
+%
+% \setupcomment
+% [\c!symbol={comment-normal,comment-down},
+% \c!option=\v!buffer]
+%
+% \startcomment[hello]
+% oeps
+% \stopcomment
+%
+% test
+%
+% \setupcomment
+% [\c!symbol=normal,
+% \c!option=max,width=10cm]
+%
+% \startcomment[hello]
+% oeps
+% \stopcomment
+%
+% test
+
+\setupcomment
+ [\c!state=\v!start,
+ \c!margin=2.5em,
+ \c!distance=1em,
+ \c!width=.3\textwidth,
+ \c!height=.2\textheight,
+ \c!color=\@@iacolor,
+ \c!title=,
+ \c!space=\v!no,
+ \c!symbol=\v!normal,
+ \c!location=\v!inmargin,
+ \c!option=,
+ \c!textlayer=]
+
+%D Attachments:
+
+% \setupinteraction[state=start]
+%
+% \useattachment[test.tex]
+% \useattachment[whatever][test.tex]
+% \useattachment[whatever][newname][test.tex]
+% \useattachment[whatever][title][newname][test.tex]
+%
+% % \setupattachments[\c!symbol={symbol-normal,symbol-down}]
+%
+% \starttext \attachment[whatever] \stoptext
+
+\def\useattachment
+ {\doquadrupleempty\douseattachment}
+
+\def\douseattachment[#1][#2][#3][#4]% tag title newname filename
+ {\iffourthargument
+ \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#3", filename="#4" }}%
+ \else\ifthirdargument
+ \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#3" }}%
+ \else\ifsecondargument
+ \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#2" }}%
+ \else
+ \ctxlua{interactions.registerattachment{ label="#1", title="#1", newname="#1", filename="#1" }}%
+ \fi\fi\fi}
+
+\def\attachment
+ {\dodoubleempty\doattachment}
+
+\def\doattachment[#1][#2]% [tag] [settings]
+ {\iflocation
+ \doif\@@atstate\v!start
+ {\bgroup
+ \setupattachments[#2]%
+ \ctxlua{backends.codeinjections.presetsymbollist("\@@atsymbol")}%
+ % we cannot yet ask for the wd/ht/dp of an xform else we could use those
+ \setbox\scratchbox\hbox{\symbol[\lastpredefinedsymbol]}%
+ \doif\@@atwidth \v!fit{\edef\@@atwidth {\the\wd\scratchbox}}%
+ \doif\@@atheight\v!fit{\edef\@@atheight{\the\ht\scratchbox}}%
+ \doif\@@atdepth \v!fit{\edef\@@atdepth {\the\dp\scratchbox}}%
+ %
+ \setbox\scratchbox\hbox
+ {\getvalue{\??at:\@@atalternative}{\ctxlua{backends.codeinjections.attachfile{
+ label = "#1",
+ width = \number\dimexpr\@@atwidth \relax,
+ height = \number\dimexpr\@@atheight\relax,
+ depth = \number\dimexpr\@@atdepth \relax,
+ color = "\@@atcolor",
+ symbol = "\@@atsymbol",
+ layer = "\@@attextlayer",
+ }}}}%
+ \wd\scratchbox\@@atwidth
+ \ht\scratchbox\@@atheight
+ \dp\scratchbox\@@atdepth
+ \box\scratchbox
+ \egroup}%
+ \fi}
+
+\setvalue{\??at:\v!high}#1{\struttedbox{\tbox{#1}}}
+
+\unexpanded\def\setupattachments
+ {\dodoubleempty\getparameters[\??at]}
+
+\setupattachments
+ [\c!state=\v!start,
+ \c!color=\@@iacolor,
+ \c!textlayer=,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!depth=\v!fit,
+ \c!alternative=\v!high,
+ \c!symbol=]
+
+%D Defining sound tracks:
+%D
+%D \starttyping
+%D \useexternalsoundtrack[label][file]
+%D \stoptyping
+%D
+%D associated actions: StartSound StopSound PauseSound ResumeSound
+%D
+%D Todo: like external figures, also search on path,
+%D although, they need to be present ar viewing time, so ...
+
+\def\useexternalsoundtrack
+ {\dodoubleargument\douseexternalsoundtrack}
+
+\def\douseexternalsoundtrack[#1][#2]%
+ {\ctxlua{interactions.registersound{ label="#1", filename="#2" }}}
+
+\def\checksoundtrack#1% yet untested in mkiv (also move management to lua)
+ {\iflocation
+ \ctxlua{codeinjections.insertsound{
+ label = "#1",
+ repeat = "\@@sdoption", % not entirely ok but works
+ }}%
+ \fi}
+
+\unexpanded\def\setupexternalsoundtracks
+ {\dodoubleargument\getparameters[\??sd]}
+
+\setupexternalsoundtracks
+ [\c!option=]
+
+%D Multi Media:
+
+% todo: multiple instances, dus indirect
+
+\let\currentrendering\empty
+
+\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}]
+\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}]
+\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}]
+\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}]
+
+\newcounter\nofexternalrenderings
+
+\def\useexternalrendering{\doquadrupleempty\douseexternalrendering}
+\def\setinternalrendering{\dodoubleempty \dosetinternalrendering}
+
+\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options
+ {\ctxlua{interactions.registerrendering {
+ kind = "external",
+ label = "#1",
+ mime = "#2",
+ filename = "#3",
+ options = "#4",
+ }}}
+
+\def\dosetinternalrendering[#1][#2]% tag options {content}
+ {\bgroup
+ \dowithnextbox
+ {\ctxlua{interactions.registerrendering {
+ kind = "internal",
+ label = "#1",
+ mime = "IRO",
+ filename = "#1",
+ options = "#2",
+ }}%
+ \let\objectoffset\zeropoint
+ \setobject{IRO}{#1}\hbox{\box\nextbox}%
+ \egroup}%
+ \hbox}
+
+\def\renderingtype #1{\ctxlua{interactions.renderingvar("#1","kind")}}
+\def\renderingoptions#1{\ctxlua{interactions.renderingvar("#1","options")}}
+
+\def\renderingwidth {8cm}
+\def\renderingheight {6cm}
+
+\unexpanded\def\definerenderingwindow
+ {\dodoubleempty\dodefinerenderingwindow}
+
+\def\dodefinerenderingwindow[#1][#2]%
+ {\presetlocalframed[\??rw#1]%
+ \getparameters
+ [\??rw#1]%
+ [\c!openpageaction=,\c!closepageaction=,%
+ \c!width=\renderingwidth,\c!height=\renderingheight,%
+ #2]}
+
+\unexpanded\def\setuprenderingwindow
+ {\dodoubleargument\dosetuprenderingwindow}
+
+\def\dosetuprenderingwindow[#1]%
+ {\getparameters[\??rw#1]}
+
+\unexpanded\def\placerenderingwindow
+ {\dodoubleempty\doplacerenderingwindow}
+
+\def\doplacerenderingwindow[#1][#2]%
+ {\bgroup
+ \edef\currentrendering{\ifsecondargument#2\else#1\fi}%
+ \doifelse{\renderingtype\currentrendering}{internal} % an object
+ {\getobjectdimensions{IRO}\currentrendering
+ \edef\renderingheight{\the\dimexpr\objectheight+\objectdepth\relax}%
+ \edef\renderingwidth{\objectwidth}%
+ \dogetobjectreferencepage{IRO}\currentrendering\renderingpage}%
+ {\def\renderingheight{\vsize}%
+ \def\renderingwidth{\hsize}%
+ \def\renderingpage{\realpageno}}%
+ % create fall back if needed
+ \ifcsname\??rw#1\c!width\endcsname
+ \def\currentrenderingwindow{#1}%
+ \else
+ \let\currentrenderingwindow\s!default
+ \definerenderingwindow[\currentrenderingwindow]%
+ \fi
+% todo
+% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction
+% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction
+ \localframed
+ [\??rw\currentrenderingwindow][\c!offset=\v!overlay]%
+ {\ctxlua{backends.codeinjections.insertrenderingwindow {
+ label = "\currentrendering",
+ width = \number\dimexpr\renderingwidth\relax,
+ height = \number\dimexpr\renderingheight\relax,
+ options = "\renderingoptions\currentrendering",
+ page = \number\renderingpage,
+ }}}%
+ \egroup}
+
+\setupinteractionscreen
+ [\c!width=\printpaperwidth,
+ \c!height=\printpaperheight,
+ \c!horoffset=\!!zeropoint,
+ \c!veroffset=\!!zeropoint,
+ \c!backspace=\backspace,
+ \c!topspace=\topspace,
+ \c!option=\v!auto,
+ \c!delay=\v!none]
+
+\protect \endinput
diff --git a/tex/context/base/scrn-men.mkiv b/tex/context/base/scrn-men.mkiv
new file mode 100644
index 000000000..246d31bfd
--- /dev/null
+++ b/tex/context/base/scrn-men.mkiv
@@ -0,0 +1,615 @@
+%D \module
+%D [ file=scrn-bar, % was part of scrn-int
+%D version=1995.01.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Menus,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Screen Macros / Menus}
+
+\unprotect
+
+% \startinteractionmenu[rechts]
+% \but [eerste] eerste \\
+% \txt hello world \\
+% \but [tweede] tweede \\
+% \nop \\
+% \but [tweede] tweede \\
+% \rul whow \\
+% \but [tweede] tweede \\
+% \raw hello world \\
+% \but [tweede] tweede \\
+% \com \vfill \\
+% \but [derde] derde \\
+% \stopinteractionmenu
+
+% \setupinteraction[menu=on,state=start]
+%
+% \defineinteractionmenuclass[test] [vertical]
+% \defineinteractionmenuclass[another][horizontal]
+%
+% \defineinteractionmenu[test] [left][state=start,width=4cm]
+% \defineinteractionmenu[another][top] [state=start,height=1cm]
+%
+% \startinteractionmenu[test]
+% \but [firstpage] test-a \\
+% \but [nextpage] test-b \\
+% \stopinteractionmenu
+%
+% \startinteractionmenu[another]
+% \but [firstpage] test-a \\
+% \but [nextpage] test-b \\
+% \stopinteractionmenu
+%
+% \setupheadertexts[{\interactionmenu[another]}]
+%
+% \starttext
+%
+% test \interactionmenu[test] \page
+% test \interactionmenu[test] \page
+%
+% \stoptext
+
+% ja : kader/achtergrond met tekst
+% leeg : kader/achtergrond maar geen tekst
+% nee : alleen ruimte reserveren
+% geen : helemaal weglaten
+%
+% \setupinteractionmenu[right][samepage=yes, unknownreference=yes]
+% \setupinteractionmenu[right][samepage=empty,unknownreference=empty]
+% \setupinteractionmenu[right][samepage=no, unknownreference=no]
+% \setupinteractionmenu[right][samepage=none, unknownreference=none]
+%
+% \startinteractionmenu[right]
+% \but [firstpage] first \\
+% \but [lastpage] last \\
+% \but [somepage] crap \\
+% \stopinteractionmenu
+
+%D Define menus:
+
+\def\setmenuparameter#1#2#3{\@EA\def\csname\??am#1#2\endcsname{#3}}
+\def\letmenuparameter #1#2{\@EA\let\csname\??am#1#2\endcsname}
+
+\def\menuparameter #1{\csname\domenuparameter{\??am\currentmenu}#1\endcsname}
+\def\namedmenuparameter#1#2{\csname\domenuparameter{\??am #1}#2\endcsname}
+\def\menuparameterhash #1{\domenuparameterhash {\??am\currentmenu}#1}
+
+\def\domenuparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\domenuparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\domenuparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\domenuparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\domenuparentparameter #1#2{\ifx#1\relax\s!empty\else\domenuparameter #1#2\fi}
+\def\domenuparentparameterhash#1#2{\ifx#1\relax \else\domenuparameterhash#1#2\fi}
+
+\unexpanded\def\defineinteractionmenu
+ {\dotripleempty\dodefineinteractionmenu}
+
+\def\dodefineinteractionmenu[#1][#2][#3]% [name] [location] [settings]
+ {\ifsecondargument
+ \ifcsname\??am:\c!list:#2\endcsname \else
+ \letvalue{\??am:\c!list:#2}\empty
+ \fi
+ \normalexpanded{\noexpand\addtocommalist{#1}\@EA\noexpand\csname\??am:\c!list:#2\endcsname}%
+ \setvalue{\@@dodolistelement#1}{\def\dosomelistelement{\dodomenulistelement{#1}}}%
+ \ifthirdargument
+ \presetlocalframed[\??am#1]%
+ \doifassignmentelse{#3}
+ {\doifelse{#1}{#2}
+ {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am,#3]}
+ {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#2,#3]}}%
+ {\doifelsenothing{#3}
+ {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am]}
+ {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#3]}}%
+ \else
+ \getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#2]%
+ \fi
+ \else
+ \getparameters[\??am#1][\s!parent=\??am]% simple cloning
+ \fi}
+
+\def\currentmenulist{\ifcsname\??am:\c!list:\currentmenu\endcsname\csname\??am:\c!list:\currentmenu\endcsname\fi}
+
+%D Setup menus:
+
+\unexpanded\def\setupinteractionmenu
+ {\dodoubleargument\dosetupinteractionmenu}
+
+\def\dosetupinteractionmenu[#1][#2]%
+ {\def\docommand##1{\getparameters[\??am##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\unexpanded\def\setupinteractionmenus[#1]%
+ {\getparameters[\??am][#1]}
+
+%D Fill menus:
+
+\normalexpanded{\long\def\expandafter\noexpand\csname\e!start\v!interactionmenu\endcsname[#1]#2\expandafter\noexpand\csname\e!stop\v!interactionmenu\endcsname}%
+ {\long\setmenuparameter{#1}\c!menu{\dointeractionmenu{#1}{#2}}}
+
+\def\resetinteractionmenu[#1]%
+ {\letmenuparameter{#1}\c!menu\empty}
+
+%D Check if menus permitted:
+
+\newif\iflocationmenupermitted
+
+\def\testinteractionmenu
+ {\iflocation
+ \doifelse\@@iamenu\v!on
+ {\doifelse{\menuparameter\c!state}\v!start
+ {\global\locationmenupermittedtrue}
+ {\global\locationmenupermittedfalse}}
+ {\global\locationmenupermittedfalse}%
+ \else
+ \global\locationmenupermittedfalse
+ \fi}
+
+%D Placement of menus:
+
+\def\interactionmenus[#1]% location
+ {\iflocation
+ \csname\??am:\c!menu:#1\endcsname
+ \fi}
+
+% \unexpanded\def\defineinteractionmenuclass
+% {\dodoubleargument\dodefineinteractionmenuclass}
+%
+% \def\dodefineinteractionmenuclass[#1][#2]% tag hori|veri
+% {\doifelse{#2}\v!vertical
+% {\setvalue{\??am:\c!menu:#1}{\verticalinteractionmenu {#1}{\getvalue{\??am#1\c!width }}}}
+% {\setvalue{\??am:\c!menu:#1}{\horizontalinteractionmenu{#1}{\getvalue{\??am#1\c!height}}}}}
+%
+% \defineinteractionmenuclass[\v!left ][\v!horizontal]
+% \defineinteractionmenuclass[\v!right ][\v!horizontal]
+% \defineinteractionmenuclass[\v!top ][\v!vertical]
+% \defineinteractionmenuclass[\v!bottom][\v!vertical]
+
+\setvalue{\??am:\c!menu :\v!left }{\horizontalinteractionmenu\v!left \leftedgewidth }
+\setvalue{\??am:\c!menu :\v!right }{\horizontalinteractionmenu\v!right \rightedgewidth}
+\setvalue{\??am:\c!menu :\v!top }{\verticalinteractionmenu \v!top \topheight }
+\setvalue{\??am:\c!menu :\v!bottom}{\verticalinteractionmenu \v!bottom\bottomheight }
+
+\setvalue{\??am:\c!command:\v!right }{\@@amvbox{}\rightedgewidth}
+\setvalue{\??am:\c!command:\v!left }{\@@amvbox{}\leftedgewidth }
+\setvalue{\??am:\c!command:\v!top }{\@@amhbox{}\topheight }
+\setvalue{\??am:\c!command:\v!bottom}{\@@amhbox{}\bottomheight }
+
+\def\dointeractionmenu#1#2%
+ {\edef\currentmenu{#1}%
+ \getvalue{\??am:\c!command:\menuparameter\c!location}\currentmenu{#2}}
+
+\unexpanded\def\interactionmenu[#1]%
+ {\def\currentmenu{#1}%
+ \menuparameter\c!menu}
+
+\newdimen \intermenudistance
+\newdimen \finalmenuwidth
+\newdimen \finalmenuheight
+
+\newcounter\currentamposition % better \currentmenuposition
+\newtoks \everysetmenucommands
+
+\def\horizontalinteractionmenu#1#2% location vhsize before/after
+ {\ifdim#2>\zeropoint
+ \edef\currentmenu{#1}%
+ \finalmenuwidth#2\relax
+ \horizontalinteractionmenuindeed
+ \fi}
+
+\def\verticalinteractionmenu#1#2%
+ {\ifdim#2>\zeropoint
+ \edef\currentmenu{#1}%
+ \finalmenuheight#2\relax
+ \verticalinteractionmenuindeed
+ \fi}
+
+\def\horizontalinteractionmenuindeed
+ {\global\intermenudistance\zeropoint
+ \setbox\scratchbox\hbox
+ {\processcommacommand[\currentmenulist]\somehorizontalinteractionmenu}%
+ \wd\scratchbox\finalmenuwidth\relax
+ \box\scratchbox}
+
+\def\verticalinteractionmenuindeed
+ {\global\intermenudistance\zeropoint
+ \setbox\scratchbox\vbox
+ {\processcommacommand[\currentmenulist]\someverticalinteractionmenu}%
+ \ht\scratchbox\finalmenuheight
+ \dp\scratchbox\zeropoint
+ \box\scratchbox}
+
+\def\somehorizontalinteractionmenu#1%
+ {\begingroup
+ \edef\currentmenu{#1}%
+ \doifnot{\menuparameter\c!state}\v!none
+ {\hskip\intermenudistance
+ \setbox\scratchbox\hbox to \finalmenuwidth
+ {\menuparameter\c!left
+ \interactionmenu[#1]%
+ \menuparameter\c!right}%
+ \doifelse{\menuparameter\c!distance}\v!overlay
+ {\global\intermenudistance\zeropoint
+ \wd\scratchbox\zeropoint}%
+ {\global\intermenudistance\menuparameter\c!distance}%
+ \box\scratchbox}%
+ \endgroup}
+
+\def\someverticalinteractionmenu#1%
+ {\begingroup
+ \edef\currentmenu{#1}%
+ \doifnot{\menuparameter\c!state}\v!none
+ {\vskip\intermenudistance
+ \setbox\scratchbox\vbox to \finalmenuheight
+ {\menuparameter\c!before
+ \interactionmenu[#1]%
+ \menuparameter\c!after}%
+ \doifelse{\menuparameter\c!distance}\v!overlay
+ {\global\intermenudistance\zeropoint
+ \offinterlineskip
+ \dp\scratchbox\zeropoint
+ \ht\scratchbox\zeropoint}%
+ {\global\intermenudistance\menuparameter\c!distance}%
+ \box\scratchbox}%
+ \endgroup}
+
+% don't change skipping, this one works! \showcomposition removed
+
+\def\@@amhbox#1#2#3#4% #1 obsolete, #3 is redundant
+ {\edef\currentmenu{#3}%
+ \testinteractionmenu
+ \iflocationmenupermitted
+ \begingroup
+ \forgetall
+ \scratchdimen\dimexpr\makeupwidth+\pagebackgroundhoffset*2-\menuparameter\c!leftoffset-\menuparameter\c!rightoffset\relax
+ \setbox\scratchbox\hbox to \scratchdimen
+ {\executeamboxcommands{#3}{#4}\c!left\c!middle\c!right}%
+ \setbox\scratchbox\hbox{\dowholemenuposition{#3}{\box\scratchbox}}% cannot happen in previous due to align
+ \wd\scratchbox\makeupwidth % geen \ht=#2 setting (yet)
+ \hskip\dimexpr-\pagebackgroundhoffset+\menuparameter\c!leftoffset\relax
+ \box\scratchbox
+ \endgroup
+ \fi}
+
+\def\@@amvbox#1#2#3#4% #1 obsolete, #3 is redundant
+ {\edef\currentmenu{#3}%
+ \testinteractionmenu
+ \iflocationmenupermitted
+ \bgroup
+ \forgetall
+ \scratchdimen\dimexpr\textheight+\pagebackgroundvoffset*2+\pagebackgrounddepth-\menuparameter\c!topoffset-\menuparameter\c!bottomoffset\relax
+ \setbox\scratchbox\vbox to \scratchdimen
+ {\restorestandardblank % todo: vspacing
+ \hsize#2\relax
+ \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after}%
+ % strange: when we mnake this a hbox the content disappears
+ \setbox\scratchbox\vbox{\dowholemenuposition{#3}{\box\scratchbox}}% cannot happen in previous due to align
+ \setbox\scratchbox\vbox
+ {\ht\scratchbox\zeropoint
+ \vskip\dimexpr-\pagebackgroundvoffset+\menuparameter\c!topoffset\relax
+ \box\scratchbox
+ \vskip\pagebackgroundvoffset}% overbodig
+ \ht\scratchbox\textheight
+ \wd\scratchbox#2\relax
+ \box\scratchbox
+ \egroup
+ \fi}
+
+\def\executeamboxcommands#1#2#3#4#5%
+ {\begingroup
+ \edef\currentmenu{#1}%
+ \menuparameter#3\relax
+ \setamboxcommands{#1}{#4}%
+ \ignorespaces#2\unskip
+ \menuparameter#5\relax
+ \endgroup}
+
+\def\setamboxcommands#1#2%
+ {\edef\currentmenu{#1}%
+ \edef\betweenmenu{#2}%
+ \doglobal\newcounter\currentamposition
+ \the\everysetmenucommands}
+
+\def\addsomemenuitem#1%
+ {\dontleavehmode
+ \begingroup
+ \ignorespaces#1\unskip\relax
+ \ifconditional\skippedmenuitem \else
+ \menuparameter\betweenmenu
+ \fi
+ \endgroup
+ \ignorespaces}
+
+%D This can save complicated menu macros when one want to
+%D keep control over parts of a menu (i.e.\ turn them on and
+%D off). We could have achieved something similar with modes.
+
+\def\local@@ambox#1#2#3#4% don't change skipping, this one works!
+ {\begingroup
+ \edef\currentmenu{#3}%
+ \iflocationmenupermitted
+ \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after
+ \fi
+ \endgroup}
+
+\def\includemenu[#1]%
+ {\begingroup
+ \edef\currentmenu{#1}%
+ \doif{\menuparameter\c!state}\v!local
+ {\letmenuparameter\currentmenu\c!state\v!start
+ \let\@@amvbox\local@@ambox
+ \let\@@amhbox\local@@ambox
+ \menuparameter\c!menu}%
+ \endgroup}
+
+%D The menu commands:
+
+% ja : kader/achtergrond met tekst
+% leeg : kader/achtergrond maar geen tekst
+% nee : alleen ruimte reserveren
+% geen : helemaal weglaten
+
+\newconditional\skippedmenuitem
+\newconditional\usemenuclick
+
+\def\dosetlocationboxcontent#1[#2]#3[#4]% to be checked
+ {\global\setfalse\skippedmenuitem
+ \setbox\locationbox\hbox{\localframed[#1][#2]{#3}}%
+ \ifconditional\usemenuclick
+ \gotobox{\box\locationbox}[#4]%
+ \else
+ \box\locationbox
+ \fi}
+
+\def\dosetlocationboxempty#1[%
+ {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,}
+
+\def\dosetlocationboxno#1[%
+ {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,\c!frame=,\c!background=,}
+
+\def\dosetlocationboxnone#1[#2]#3[#4]%
+ {\global\settrue\skippedmenuitem}
+
+% make two sub macros
+
+% \dosetfontattribute {#1}{#2}%
+% \dosetcolorattribute{#1}{#3}%
+
+\def\setlocationboxyes#1[#2]#3[#4]% needs to be split as the attr is not applicable to the box
+ {\begingroup
+ \settrue\usemenuclick
+ \global\setfalse\skippedmenuitem
+ \attribute\referenceattribute\attributeunsetvalue
+ \doifreferencefoundelse{#4}
+ {\analyzecurrentreference % we need to act on the state
+ \ifcase\referencepagestate
+ % something else than a page reference
+ \ctxlua{jobreferences.injectcurrentset(nil,nil)}%
+ \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2]{#3}}%
+ \else\ifcase\csname\??am:\c!location:\menuparameter\c!samepage\endcsname\relax
+ % yes: same page or not ... todo
+ \ctxlua{jobreferences.injectcurrentset(nil,nil)}%
+ \ifnum\referencepagestate=\plusone % same page
+ \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2,\c!color=\menuparameter\c!contrastcolor]{#3}}%
+ \else % elsewhere
+ \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2]{#3}}%
+ \fi
+ \or
+ % empty but frame: no click
+ \localframed[#1][\c!empty=\v!yes,#2]{#3}%
+ \or
+ % empty no frame: no
+ \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{#3}%
+ \or
+ % nothing at all
+ \global\settrue\skippedmenuitem
+ \fi\fi}%
+ {\unknownreference{#4}%
+ \ifcase\csname\??am:\c!location:\menuparameter\c!unknownreference\endcsname\relax
+ \localframed[#1][#2]{#3}%
+ \or
+ \localframed[#1][\c!empty=\v!yes,#2]{#3}%
+ \or
+ \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{#1}%
+ \or
+ \global\skippedmenuitemtrue
+ \fi}%
+ \endgroup}
+
+\def\setlocationboxraw#1[#2]#3[#4]%
+ {\localframed[#1][#2]{#3}}
+
+\def\setlocationnop#1[#2]#3%
+ {\localframed[#1][#2]{#3}}
+
+\def\menu@raw[#1]#2\\%
+ {\addsomemenuitem{\gotobox{\ignorespaces#2\unskip}[#1]}}
+
+\def\menu@but[#1]#2\\%
+ {\addsomemenuitem{\domenuitemposition\currentmenu{#1}{\setlocationboxyes{\??am\currentmenu}[]{\ignorespaces#2\unskip}[#1]}}}
+
+\def\menu@got[#1]#2\\%
+ {\addsomemenuitem{\setlocationboxyes{\??am\currentmenu}[\c!frame=\v!off,\c!background=]{\ignorespaces#2\unskip}[#1]}}
+
+\def\menu@nop#1\\%
+ {\addsomemenuitem{\setlocationboxraw{\??am\currentmenu}[\c!frame=\v!off,\c!background=,\c!empty=\v!yes]{\ignorespaces#1\unskip}[]}}
+
+\def\menu@txt#1\\%
+ {\addsomemenuitem{\localframed[\??am\currentmenu][\c!frame=\v!off,\c!background=]{\ignorespaces#1\unskip}}}
+
+\def\menu@rul#1\\%
+ {\addsomemenuitem{\localframed[\??am\currentmenu][]{\ignorespaces#1\unskip}}}
+
+\def\menu@com#1\\%
+ {\ignorespaces#1\unskip\ignorespaces}
+
+\appendtoks
+ \let\raw\menu@raw \let\but\menu@but \let\got\menu@got \let\nop\menu@nop
+ \let\txt\menu@txt \let\rul\menu@rul \let\com\menu@com
+\to \everysetmenucommands
+
+\ifdefined\domenuitemposition \else \let\domenuitemposition \gobbletwoarguments \fi
+\ifdefined\dowholemenuposition \else \let\dowholemenuposition\gobbleoneargument \fi
+
+%D We also need an explicit position control some day. I'll
+%D do that when I need it. [The stacking order.]
+
+% [name] [location]
+% [name] [location] [pars]
+
+\expandafter\chardef\csname\??am:\c!location:\v!yes \endcsname\zerocount
+\expandafter\chardef\csname\??am:\c!location:\v!empty \endcsname\plusone
+\expandafter\chardef\csname\??am:\c!location:\v!no \endcsname\plustwo
+\expandafter\chardef\csname\??am:\c!location:\v!none \endcsname\plusthree
+
+\expandafter\chardef\csname\??am:\c!location:\v!normal \endcsname\plusone % default
+\expandafter\chardef\csname\??am:\c!location:\s!default\endcsname\plusone % default
+\expandafter\chardef\csname\??am:\c!location:\s!empty \endcsname\plusone % default
+
+\def\dodomenulistelement#1#2#3#4#5#6#7%
+ {\addsomemenuitem{\domenuitemposition\currentmenu{internal(#3)}%
+ {\setlocationboxyes{\??am\currentmenu}[]{\limitatetext{#5}{\namedlistparameter{#2}\c!maxwidth}{\unknown}}[internal(#3)]}}}
+
+\unexpanded\def\menubutton
+ {\dodoubleempty\domenubutton}
+
+\def\domenubutton[#1]%
+ {\iffirstargument
+ \ifsecondargument
+ \@EAEAEA\domenubuttonB
+ \else
+ \doifassignmentelse{#1}
+ {\@EAEAEA\domenubuttonC}
+ {\@EAEAEA\domenubuttonD}%
+ \fi
+ \else
+ \@EA\domenubuttonA
+ \fi[#1]}
+
+\def\domenubuttonA[#1][#2]#3[#4]{\setlocationboxyes\??bt[]{#3}[#4]} % normal button, no parameters
+\def\domenubuttonB[#1][#2]#3[#4]{\setlocationboxyes{\??am#1}[#2]{#3}[#4]} % menu button, with parameters
+\def\domenubuttonC[#1][#2]#3[#4]{\setlocationboxyes\??bt[#1]{#3}[#4]} % normal button, with parameters
+\def\domenubuttonD[#1][#2]#3[#4]{\setlocationboxyes{\??am#1}[]{#3}[#4]} % menu button, no parameters
+
+\def\menubox
+ {\dodoubleempty\domenubox}
+
+\def\domenubox[#1][#2]#3%
+ {\bgroup
+ \let\setlocationboxyes\setlocationboxraw
+ \domenubutton[#1][#2]#3[]%
+ \egroup}
+
+% jammer, tussen/midden had erin gemoeten; \c!commando toevoegen
+
+\def\registermenucommand#1%
+ {{\textonly\noindent#1\space}} % no math switching
+
+\def\doregistermenubuttons[#1][#2]% [menu id] [register]
+ {\bgroup
+ \ifsecondargument
+ \setupinteractionmenu[#1][\c!unknownreference=\v!yes,\c!samepage=\v!yes]%
+ \def\docommand##1{\registermenucommand{\menubutton[#1]{##1}[#2:##1]}}%
+ \else
+ \def\docommand##1{\registermenucommand{\button[\c!unknownreference=\v!yes,\c!samepage=\v!yes]{##1}[#1:##1]}}%
+ \fi
+ \handletokens abcdefghijklmnopqrstuvwxyz\with\docommand % moet anders
+ \egroup}
+
+\def\registermenubuttons
+ {\dodoubleempty\doregistermenubuttons}
+
+\defineinteractionmenu [\v!vertical] % we happen to know that this works out ok (just a setup set)
+\defineinteractionmenu [\v!horizontal] % we happen to know that this works out ok (just a setup set)
+
+\defineinteractionmenu [\v!right ] [\v!right ] [\v!vertical ] % we share a setup set
+\defineinteractionmenu [\v!left ] [\v!left ] [\v!vertical ] % we share a setup set
+\defineinteractionmenu [\v!top ] [\v!top ] [\v!horizontal] % we share a setup set
+\defineinteractionmenu [\v!bottom] [\v!bottom] [\v!horizontal] % we share a setup set
+
+\setupinteractionmenus
+ [\c!offset=.25em,
+ \c!position=\v!no,
+ \c!frame=\v!on,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!foregroundstyle=\menuparameter\c!style,
+ \c!foregroundcolor=\menuparameter\c!color,
+ \c!style=\@@iastyle,
+ \c!color=\@@iacolor,
+ \c!contrastcolor=\@@iacontrastcolor,
+ \c!state=\v!start,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!empty,
+ \c!distance=\bodyfontsize, % 12pt
+ \c!topoffset=\zeropoint,
+ \c!bottomoffset=\zeropoint,
+ \c!leftoffset=\zeropoint,
+ \c!rightoffset=\zeropoint]
+
+\setupinteractionmenu
+ [\v!vertical] % not really a menu
+ [\c!before=,
+ \c!after=\vfil,
+ \c!inbetween=\blank,
+ \c!left=\hss,
+ \c!right=\hss,
+ \c!height=\v!broad]
+
+\setupinteractionmenu
+ [\v!horizontal] % not really a menu
+ [\c!before=\vss,
+ \c!after=\vss,
+ \c!middle=\hfil,
+ \c!width=\v!fit,
+ \c!height=\v!broad]
+
+\setupinteractionmenu[\v!left ][\c!width=\leftedgewidth ]
+\setupinteractionmenu[\v!right ][\c!width=\rightedgewidth]
+% \setupinteractionmenu[\v!top ] [\c!height=\topheight ]
+% \setupinteractionmenu[\v!bottom] [\c!height=\bottomheight ]
+
+\unexpanded\def\placeleftedgetextblock % Is \hss/\hsize really needed here? (check outer level and settings)
+ {\hbox to \leftedgewidth{\hsize\leftedgewidth\hss\interactionmenus[\v!left]}}
+
+\unexpanded\def\placerightedgetextblock % Is \hss/\hsize really needed here? (check outer level and settings)
+ {\hbox to \rightedgewidth{\hsize\rightedgewidth\interactionmenus[\v!right]\hss}}
+
+\unexpanded\def\placetoptextblock
+ {\vbox to \topheight
+ {\vsize\topheight
+ \csname\??tk\v!top\c!before\endcsname
+ \interactionmenus[\v!top]%
+ \csname\??tk\v!top\c!after\endcsname
+ \kern\zeropoint}}
+
+\unexpanded\def\placebottomtextblock
+ {\vbox to \bottomheight
+ {\vsize\bottomheight
+ \csname\??tk\v!bottom\c!before\endcsname
+ \interactionmenus[\v!bottom]%
+ \csname\??tk\v!bottom\c!after\endcsname
+ \kern\zeropoint}}
+
+\ifdefined\leftedgetextcontent
+
+ \appendtoks \iflocation\placeleftedgetextblock \hskip-\leftedgewidth \fi\to \leftedgetextcontent
+ \appendtoks \iflocation\placerightedgetextblock \hskip-\rightedgewidth \fi\to \rightedgetextcontent
+ \appendtoks \iflocation\placetoptextblock \vskip-\topheight \fi\to \toptextcontent
+ \appendtoks \iflocation\placebottomtextblock \vskip-\bottomheight \fi\to \bottomtextcontent
+
+\fi
+
+%D Enable and disable menus \unknown\ obsolete:
+
+\def\gobbletwoparameters[#1][#2]{}
+
+\def\disableinteractionmenu{\dodoubleempty\gobbletwoparameters}
+\def\enableinteractionmenu {\dodoubleempty\gobbletwoparameters}
+
+\protect \endinput
diff --git a/tex/context/base/scrn-nav.mkii b/tex/context/base/scrn-nav.mkii
new file mode 100644
index 000000000..591d4134c
--- /dev/null
+++ b/tex/context/base/scrn-nav.mkii
@@ -0,0 +1,379 @@
+%D \module
+%D [ file=scrn-nav,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Navigation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Screen Macros / Navigation}
+
+\unprotect
+
+%D Support for interactive document is very present in
+%D \CONTEXT\ and interwoven in many modules. This means that in
+%D this module, where we deal with some common navigational
+%D features, there will be quite some forward references.
+%D
+%D When I started implementing hypertext support, the macros
+%D were mostly dealing with things related to locations, that
+%D is click in this location and goto that one. The
+%D functionality of many macro depends on the output medium:
+%D paper or screen. The next boolean holds the state:
+
+\newif\iflocation \def\ifinteractief{\iflocation} % upw comp
+
+%D We also allocate a scratchbox:
+
+\newbox\locationbox
+
+%D There is no interaction at all unless enabled by saying:
+%D
+%D \starttyping
+%D \setupinteraction[state=start]
+%D \stoptyping
+%D
+%D The other settings are:
+%D
+%D \showsetup{setupinteraction}
+%D
+%D In the special driver modules we introduced a switch that
+%D forces page destinations (instead of named ones). We set
+%D this switch here.
+
+\def\setinteractionparameter#1#2% use with case, no checking done
+ {\setvalue{\??ia#1}{#2}} % pass #2, can be \blabla
+
+\def\resetinteractionparameter#1% use with case, no checking done
+ {\letvalue{\??ia#1}\empty}
+
+% \def\interactionparameter#1%
+% {\csname\??ia#1\endcsname}
+
+\newtoks\everysetupinteraction
+
+\def\setupinteraction
+ {\dosingleargument\dodosetupinteraction}
+
+\def\dodosetupinteraction[#1]% % \dosetupinteraction == special
+ {\getparameters[\??ia][#1]%
+ \the\everysetupinteraction}
+
+% todo, move partial append to where the action happens
+
+\appendtoks
+ \doifelse\@@iastate\v!start
+ {\iflocation\else
+ \showmessage\m!interactions2{\ifusepagedestinations\space(PAGE)\fi}%
+ \global\locationtrue
+ \fi}
+ {\iflocation
+ \showmessage\m!interactions3{\ifusepagedestinations\space(PAGE)\fi}%
+ \global\locationfalse
+ \fi}%
+ \iflocation
+ \setsystemmode \v!interaction
+ \else
+ \resetsystemmode\v!interaction
+ \fi
+ \dosetuppageview\@@iafocus
+ \doifsomething\@@iacalculate
+ {\doregistercalculationset\@@iacalculate}%
+ \doifelse\@@iastrut\v!yes
+ \locationstruttrue
+ \locationstrutfalse
+ \doifelse\@@iaclick\v!yes
+ \highlighthyperlinkstrue
+ \highlighthyperlinksfalse
+ \doifelse\@@iasplit\v!yes
+ \locationsplittrue
+ \locationsplitfalse
+ \doifelse\@@iadisplay\v!new
+ \gotonewwindowtrue
+ \gotonewwindowfalse
+ \doifelse\@@iapage\v!yes
+ {\global\usepagedestinationstrue}
+ {\global\usepagedestinationsfalse}%
+\to \everysetupinteraction
+
+%D We have to make sure of some settings:
+
+\def\dolocationstartup
+ {\iflocation
+ \dosetupinteraction
+ \handlereferenceactions\@@iaopenaction \dosetupopenaction
+ \handlereferenceactions\@@iacloseaction\dosetupcloseaction
+ \setupinteractionscreens
+ \global\let\dolocationstartup\relax
+ \fi}
+
+\appendtoks \dolocationstartup \to \everyshipout
+
+\def\dolocationpagecheck % brr pdf dependent
+ {\iflocation
+ \handlereferenceactions\@@iaopenpageaction \dosetupopenpageaction
+ \handlereferenceactions\@@iaclosepageaction\dosetupclosepageaction
+ \fi}
+
+\appendtoks \dolocationpagecheck \to \everyshipout
+
+%D The next few macros are really horrible. For proper
+%D navigation a in||line hypertext fragment must have
+%D comfortable properties, so we must force some minimal
+%D dimensions. On the other hand button, and here I mean those
+%D pieces of text with fancy outlines and/or backgrounds, often
+%D have fixed, preset dimensions.
+%D
+%D To make things even worse, if we choose to let the optimal
+%D dimensions depend on the height and depth of a strut, a not
+%D too uncommon practice in \TEX, we have to deal with the fact
+%D that such a strut, set inside a box, is unknown too the
+%D outside world.
+%D
+%D The solution lays in passing the strut characteristics in
+%D a proper way, in our case by applying \type{\presetgoto}:
+%D
+%D \starttyping
+%D {some piece of text \presetgoto}
+%D \stoptyping
+%D
+%D This macro stores the current strut values.
+
+\newif\iflocationstrut
+\newif\iflocationsplit
+
+\def\resetgoto
+ {\globallet\@@ia@@hoogte\!!zeropoint
+ \globallet\@@ia@@diepte\!!zeropoint}
+
+\resetgoto
+
+\def\presetgoto
+ {\iflocationstrut
+ \setstrut
+ %\xdef\@@ia@@hoogte{\the\strutht}%
+ %\xdef\@@ia@@diepte{\the\strutdp}%
+ \globallet\@@ia@@hoogte\strutheight
+ \globallet\@@ia@@diepte\strutdepth
+ \else
+ \globallet\@@ia@@hoogte\@@iaheight
+ \globallet\@@ia@@diepte\@@iadepth
+ \fi}
+
+%D In the macros that deal with making areas into hyperlinks,
+%D we use:
+
+\newbox\driverresources
+
+\def\collectdriverresource#1%
+ {\global\setbox\driverresources\hbox{\box\driverresources#1}}
+
+\def\flushdriverresources
+ {\ifvoid\driverresources\else\box\driverresources\fi}
+
+\def\dohandlegoto#1#2#3%
+ {\ifsecondaryreference
+ \bgroup\setbox0\hbox{#2#3}\egroup
+ \else
+ \hbox
+ {\setbox0\hbox{#1}%
+ \ifdim\wd0<\@@iawidth\relax
+ \buttonwidth\@@iawidth\relax
+ \else
+ \buttonwidth\wd0
+ \fi
+ \ifdim\ht0<\@@ia@@hoogte\relax
+ \buttonheight\@@ia@@hoogte\relax
+ \else
+ \buttonheight\ht0
+ \fi
+ \ifdim\dp0<\@@ia@@diepte\relax
+ \dimen0=\@@ia@@diepte\relax % = !
+ \else
+ \dimen0\dp0
+ \fi
+ \advance\buttonheight \dimen0
+ \setbox2\hbox
+ {\lower\dimen0\hbox
+ {\dontcomplain
+ \dimen0=.5\wd0 % direct skipping is faster of course
+ \advance\dimen0 -.5\buttonwidth % buts this is nicer
+ \hskip\dimen0#2#3}}% when visualizing things
+ \naturalhbox % needed for omega / moved from plus-omg
+ {\ifreversegoto
+ \dimen0\wd0\box0\kern-\dimen0\smashbox2\box2\kern\dimen0
+ \else
+ \smashbox2\box2\box0
+ \fi
+ \flushdriverresources}%
+ \resetgoto}%
+ \fi}
+
+%D The secondary references are processed but not typeset. The
+%D special driver must collect the data needed.
+
+%D The width of the active area depends on the dimensions
+%D preset, the actual dimens and/or the height and depth of the
+%D strut.
+%D
+%D Normally the hyper active area is laid on top of the text.
+%D This enables stacking hyperlinks on top of each other. When,
+%D for some reason the opposite is prefered, one can use the
+%D next boolean to signal this wish.
+
+\newif\ifreversegoto \reversegotofalse
+
+%D As long as there a natural feeling of what can be considered
+%D hyper active or not, we have to tell users where they can
+%D possibly click. We've already seen a few macros that deal
+%D with this visualization, something we definitely do not let
+%D up to the viewer. One way of telling is using a distinctive
+%D typeface, another way is using color.
+%D
+%D There are two colors involved: one for normal hyperlinks,
+%D and one for those that point to the currentpage, the
+%D contrast color.
+
+\definecolor [interactioncolor] [r=0, g=.6, b=0]
+\definecolor [interactioncontrastcolor] [r=.8, g=0, b=0]
+
+\definecolor [interactiekleur] [interactioncolor]
+\definecolor [interactiecontrastkleur] [interactioncontrastcolor]
+
+%D The next few macros are responsible for highlighting hyper
+%D links. The first one, \type{\showlocation}, is used in those
+%D situations where the typeface is handled by the calling
+%D macro.
+
+\def\interactioncolor % todo \??ia as argument
+ {\iflocation
+ \ifrealreferencepage
+ \@@iacontrastcolor
+ \else
+ \@@iacolor
+ \fi
+ \fi}
+
+%D CHECK WHERE USED / CONSISTENCY
+
+\def\showlocation#1%
+ {\iflocation\color[\@@iacolor]{#1\presetgoto}\else#1\fi}
+
+%D When local color settings are to be used, we can use the
+%D next macro, where \type{#1} is a tag like \type{\??tg} and
+%D \type{#2} some text.
+
+\def\showcoloredlocation#1#2%
+ {\iflocation
+ \color[\getvalue{#1\c!color}]{#2\presetgoto}%
+ \else
+ #2%
+ \fi}
+
+%D When we're dealing with pure page references, contrast
+%D colors are used when we are already at the page mentioned.
+
+\def\showcontrastlocation#1#2#3% the \@EA is needed
+ {\iflocation
+ \ifnum#2=\realpageno\relax
+ \doifelsevaluenothing{#1\c!color}
+ {#3\presetgoto}
+ {\color[\getvalue{#1\c!contrastcolor}]{#3\presetgoto}}%
+ \else
+ \color[\getvalue{#1\c!color}]{#3\presetgoto}%
+ \fi
+ \else
+ #3%
+ \fi}
+
+%D The next simple macro can be used in color specifications,
+%D like \type{\color[\locationcolor{green}]}.
+
+\def\locationcolor#1%
+ {\iflocation#1\fi}
+
+%D More tokens are spend when we want both typeface and color
+%D highlighting.
+
+\def\dolocationattributes#1#2#3#4%
+ {\bgroup
+ \let\fontattribute\empty
+ \let\colorattribute\empty
+ \doifdefined{#1#2}{\def\fontattribute{\getvalue{#1#2}}}%
+ \iflocation
+ \doifdefined{#1#3}{\def\colorattribute{\getvalue{#1#3}}}%
+ \fi
+ \startcolor[\colorattribute]%
+ \@EA\doconvertfont\@EA{\fontattribute}{#4}% no \edef, but \@EA here
+ \stopcolor
+ \egroup}
+
+\def\navigating
+ {\dolocationattributes\??ia\c!style\c!color}
+
+%D Although not decently supported in current viewers, a
+%D provisory hiding mechanims is implemented. Areas marked as
+%D such, are visible on screen, but invisible on paper. Don't
+%D trust this mechanism yet!
+
+\def\dostartinteraction
+ {\bgroup
+ \let\stopinteraction\egroup
+ \dowithnextbox{\dostarthide\flushnextbox\dostophide\egroup}\hbox}
+
+\let\startinteraction = \relax
+\let\stopinteraction = \relax
+
+% in the future:
+%
+% eerst boolean invoeren bij menu, achtergrond, balk, button
+% enz; verder startinteractie een argument meegeven {#1} ->
+% \getvalue{#1\c!print}=={\v!ja} enz. Consequent menubutton
+% gebruiken!
+
+\def\@@iatimestamp
+ {\the\normalyear
+ \ifnum\normalmonth<10 0\fi\the\normalmonth
+ \ifnum\normalday <10 0\fi\the\normalday}
+
+% happens in core-fld
+%
+% \definereference [AtOpenInitializeForm] [\v!geen]
+
+\setupinteraction % start fit page and reset form
+ [\c!state=\v!stop,
+ \c!page=\v!no,
+ \c!click=\v!yes,
+ \c!display=,
+ %\c!openaction={\v!firstpage,AtOpenInitializeForm},
+ %\c!openaction={\v!firstpage,\v!ResetForm},
+ %\c!openaction=\v!ResetForm, % too buggy in reader 4.05
+ \c!openaction=,
+ \c!closeaction=,
+ \c!openpageaction=,
+ \c!closepageaction=,
+ \c!display=\v!normal,
+ \c!focus=\v!fit,
+ \c!menu=\v!off,
+ \c!style=\v!bold,
+ \c!calculate=,
+ \c!strut=\v!yes,
+ \c!split=\v!yes,
+ \c!color=interactioncolor,
+ \c!contrastcolor=interactioncontrastcolor,
+ \c!symbolset=,
+ \c!width=1em,
+ \c!height=\!!zeropoint,
+ \c!depth=\!!zeropoint,
+ \c!title=\jobname, % needed for fdf/x
+ \c!subtitle=,
+ \c!author=,
+ \c!keyword=,
+ \c!date=\@@iatimestamp]
+
+\protect \endinput
diff --git a/tex/context/base/scrn-nav.mkiv b/tex/context/base/scrn-nav.mkiv
new file mode 100644
index 000000000..264e3ded2
--- /dev/null
+++ b/tex/context/base/scrn-nav.mkiv
@@ -0,0 +1,256 @@
+%D \module
+%D [ file=scrn-nav,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Navigation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Screen Macros / Navigation}
+
+\unprotect
+
+%D Support for interactive document is very present in
+%D \CONTEXT\ and interwoven in many modules. This means that in
+%D this module, where we deal with some common navigational
+%D features, there will be quite some forward references.
+%D
+%D The current support in \MKIV\ is mostly the same as in
+%D \MKII\ and the old files have some more detailed
+%D (sometimes historic) information.
+
+%D There is no interaction at all unless enabled by saying:
+%D
+%D \starttyping
+%D \setupinteraction[state=start]
+%D \stoptyping
+%D
+%D The other settings are:
+%D
+%D \showsetup{setupinteraction}
+
+% use with care, no checking done
+
+\def\setinteractionparameter#1#2%
+ {\expandafter\def\csname\??ia#1\endcsname{#2}}
+
+\def\resetinteractionparameter#1%
+ {\expandafter\let\csname\??ia#1\endcsname\empty}
+
+\newtoks\everysetupinteraction
+
+\unexpanded\def\setupinteraction
+ {\dosingleargument\dodosetupinteraction}
+
+\def\dodosetupinteraction[#1]% % \dosetupinteraction == special
+ {\getparameters[\??ia][#1]%
+ \the\everysetupinteraction}
+
+% todo, move partial append to where the action happens
+
+\appendtoks
+ \doifelse\@@iastate\v!start
+ {\iflocation\else
+ \showmessage\m!interactions2{\ifusepagedestinations\space(PAGE)\fi}%
+ \global\locationtrue
+ \fi}%
+ {\iflocation
+ \showmessage\m!interactions3{\ifusepagedestinations\space(PAGE)\fi}%
+ \global\locationfalse
+ \fi}%
+ \iflocation
+ \setsystemmode \v!interaction
+ \else
+ \resetsystemmode\v!interaction
+ \fi
+ \doifsomething\@@iacalculate
+ {\doregistercalculationset\@@iacalculate}%
+ \doifelse\@@iastrut \v!yes \settrue \setfalse \uselocationstrut
+ \doifelse\@@iaclick \v!yes \settrue \setfalse \highlighthyperlinks
+ \doifelse\@@iadisplay\v!new \settrue \setfalse \gotonewwindow
+ \doifelse\@@iapage \v!yes \settrue \setfalse \usepagedestinations
+\to \everysetupinteraction
+
+\def\synchronizebackendidentity
+ {\ctxlua{backends.codeinjections.setupidentity{
+ title = \!!bs\@@iatitle\!!es,
+ subject = \!!bs\@@iasubtitle\!!es,
+ author = \!!bs\@@iaauthor\!!es,
+ creator = \!!bs ConTeXt - \contextversion\!!es,
+ date = \!!bs\@@iadate\!!es,
+ keywords = \!!bs\@@iakeyword\!!es,
+ }}}
+
+\appendtoks
+ \synchronizebackendidentity
+\to \everyfirstshipout
+
+%D We have to make sure of some settings:
+
+\def\dolocationstartup
+ {\iflocation
+ \donefalse
+ \ifx\@@iaopenaction\empty \else \donetrue
+ \ctxlua{jobreferences.checkopendocumentactions("\@@iaopenaction")}%
+ \ctxlua{jobreferences.expandcurrent()}%
+ \fi
+ \ifx\@@iacloseaction\empty \else \donetrue
+ \ctxlua{jobreferences.checkclosedocumentactions("\@@iacloseaction")}%
+ \ctxlua{jobreferences.expandcurrent()}%
+ \fi
+ \ifdone
+ \ctxlua{jobreferences.flushdocumentactions()}%
+ \fi
+ \global\let\dolocationstartup\relax
+ \fi}
+
+\def\dolocationpagecheck
+ {\iflocation
+ \donefalse
+ \ifx\@@iaopenpageaction\empty \else \donetrue
+ \ctxlua{jobreferences.checkopenpageactions("\@@iaopenpageaction")}%
+ \ctxlua{jobreferences.expandcurrent()}%
+ \fi
+ \ifx\@@iaclosepageaction\empty \else \donetrue
+ \ctxlua{jobreferences.checkclosepageactions("\@@iaclosepageaction")}%
+ \ctxlua{jobreferences.expandcurrent()}%
+ \fi
+ \ifdone
+ \ctxlua{jobreferences.flushpageactions()}%
+ \fi
+ \fi}
+
+\appendtoks \dolocationstartup \to \everyshipout
+\appendtoks \dolocationpagecheck \to \everyshipout
+
+%D As long as there a natural feeling of what can be considered
+%D hyper active or not, we have to tell users where they can
+%D possibly click. We've already seen a few macros that deal
+%D with this visualization, something we definitely do not let
+%D up to the viewer. One way of telling is using a distinctive
+%D typeface, another way is using color.
+%D
+%D There are two colors involved: one for normal hyperlinks,
+%D and one for those that point to the currentpage, the
+%D contrast color.
+
+\definecolor [interactioncolor] [r=0, g=.6, b=0]
+\definecolor [interactioncontrastcolor] [r=.8, g=0, b=0]
+
+\definecolor [interactiekleur] [interactioncolor]
+\definecolor [interactiecontrastkleur] [interactioncontrastcolor]
+
+%D The next few macros are responsible for highlighting hyper
+%D links. The first one, \type{\showlocation}, is used in those
+%D situations where the typeface is handled by the calling
+%D macro.
+
+%D When we're dealing with pure page references, contrast
+%D colors are used when we are already at the page mentioned.
+
+\def\setlocationcolor#1% not grouped !
+ {\ifnum\referencepagestate=\plusone
+ \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}%
+ \ifx\askedcontrastcolor\empty
+ \dosetcolorattribute{#1}\c!color
+ \else
+ \dosetcolorattribute{#1}\c!contrastcolor
+ \fi
+ \else % we could just set and if > 0 set again
+ \dosetcolorattribute{#1}\c!color
+ \fi}
+
+\def\setlocationfont#1%
+ {\dosetfontattribute{#1}\c!style}
+
+\def\setlocationattributes#1%
+ {\ifnum\referencepagestate=\plusone
+ \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}%
+ \ifx\askedcontrastcolor\empty
+ \dosetcolorattribute{#1}\c!color
+ \else
+ \dosetcolorattribute{#1}\c!contrastcolor
+ \fi
+ \else % we could just set and if > 0 set again
+ \dosetcolorattribute{#1}\c!color
+ \fi
+ \dosetfontattribute{#1}\c!style}
+
+\def\setlocationcolorspec#1% \resolver
+ {\ifnum\referencepagestate=\plusone
+ \edef\askedcontrastcolor{#1\c!contrastcolor}%
+ \ifx\askedcontrastcolor\empty
+ \doactivatecolor{#1\c!color}%
+ \else
+ \doactivatecolor\askedcontrastcolor
+ \fi
+ \else
+ \doactivatecolor{#1\c!color}%
+ \fi}
+
+%D delayed ...
+
+\def\enableinteractivereferences
+ {\ifproductionrun
+ \ctxlua{jobreferences.enable_interaction()}%
+ \globallet\enableinteractivereferences\relax
+ \fi}
+
+\appendtoks
+ \enableinteractivereferences
+\to \everysetupinteraction
+
+%D More tokens are spend when we want both typeface and color
+%D highlighting.
+
+\def\@@iatimestamp
+ {\the\normalyear
+ \ifnum\normalmonth<10 0\fi\the\normalmonth
+ \ifnum\normalday <10 0\fi\the\normalday}
+
+\setupinteraction % start fit page and reset form
+ [\c!state=\v!stop,
+ \c!page=\v!no,
+ \c!click=\v!yes,
+ \c!display=,
+ \c!openaction=,
+ \c!closeaction=,
+ \c!openpageaction=,
+ \c!closepageaction=,
+ \c!display=\v!normal,
+ \c!focus=\v!fit,
+ \c!menu=\v!off,
+ \c!style=\v!bold,
+ \c!calculate=,
+ \c!strut=\v!yes,
+ \c!split=\v!yes,
+ \c!color=interactioncolor,
+ \c!contrastcolor=interactioncontrastcolor,
+ \c!symbolset=,
+ \c!width=1em,
+ \c!height=\!!zeropoint,
+ \c!depth=\!!zeropoint,
+ \c!title=\jobname, % needed for fdf/x
+ \c!subtitle=,
+ \c!author=,
+ \c!keyword=,
+ \c!date=\@@iatimestamp]
+
+%D XMP support:
+
+\setupinteraction
+ [xmpfile=]
+
+\appendtoks
+ % this will move as it is a backend issue
+ \doifsomething\@@iaxmpfile
+ {\ctxlua{if lpdf then lpdf.setxmpfile("\@@iaxmpfile") end}%
+ \globallet\@@iaxmpfile\empty}%
+\to \everysetupinteraction
+
+\protect \endinput
diff --git a/tex/context/base/scrp-cjk.lua b/tex/context/base/scrp-cjk.lua
new file mode 100644
index 000000000..997baaa96
--- /dev/null
+++ b/tex/context/base/scrp-cjk.lua
@@ -0,0 +1,577 @@
+if not modules then modules = { } end modules ['scrp-cjk'] = {
+ version = 1.001,
+ comment = "companion to scrp-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local has_attribute = node.has_attribute
+local make_glue_node = nodes.glue
+local make_penalty_node = nodes.penalty
+local insert_node_after = node.insert_after
+local insert_node_before = node.insert_before
+local remove_node = nodes.remove
+
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local penalty = node.id('penalty')
+
+local preproc = attributes.private('preproc')
+local prestat = attributes.private('prestat')
+
+scripts.cjk = scripts.cjk or { }
+
+local kind_to_number = scripts.kind_to_number
+local number_to_kind = scripts.number_to_kind
+local hash = scripts.hash
+local cjk = scripts.cjk
+
+local fontdata = fonts.identifiers
+local quaddata = fonts.quads
+
+-- raggedleft is controlled by leftskip and we might end up with a situation where
+-- the intercharacter spacing interferes with this; the solution is to patch the
+-- nodelist but better is to use veryraggedleft
+
+local inter_char_stretch = 0
+local inter_char_half_shrink = 0
+local inter_char_hangul_penalty = 0
+
+local function set_parameters(font,data)
+ -- beware: parameters can be nil in e.g. punk variants
+ local quad = quaddata[font]
+ inter_char_half_shrink = data.inter_char_half_shrink_factor * quad
+ inter_char_stretch = data.inter_char_stretch_factor * quad
+ inter_char_hangul_penalty = data.inter_char_hangul_penalty
+end
+
+-- a test version did compensate for crappy halfwidth but we can best do that
+-- at font definition time and/or just assume a correct font
+
+local function nobreak(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+end
+local function stretch_break(head,current)
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+end
+local function shrink_break(head,current)
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+end
+local function nobreak_stretch(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+end
+local function korean_break(head,current)
+ insert_node_before(head,current,make_penalty_node(inter_char_hangul_penalty))
+end
+
+local function nobreak_shrink(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+end
+local function nobreak_autoshrink(head,current)
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+end
+
+local function nobreak_stretch_nobreak_shrink(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+end
+local function nobreak_stretch_nobreak_autoshrink(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+end
+
+local function nobreak_shrink_nobreak_stretch(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+end
+local function nobreak_autoshrink_nobreak_stretch(head,current)
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+end
+
+local function nobreak_shrink_break_stretch(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+end
+local function nobreak_autoshrink_break_stretch(head,current)
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+end
+
+local function nobreak_shrink_break_stretch_nobreak_shrink(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+end
+local function nobreak_autoshrink_break_stretch_nobreak_autoshrink(head,current)
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+end
+local function nobreak_autoshrink_break_stretch_nobreak_shrink(head,current)
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+end
+local function nobreak_shrink_break_stretch_nobreak_autoshrink(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ if true then
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ end
+end
+
+local function nobreak_stretch_break_shrink(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+end
+local function nobreak_stretch_break_autoshrink(head,current)
+ insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ if true then
+ insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ end
+end
+
+-- hangul (korean)
+
+local injectors = { -- [previous] [current]
+ jamo_final = {
+ jamo_initial = korean_break,
+ korean = korean_break,
+ chinese = korean_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak,
+ full_width_open = stretch_break,
+ full_width_close = nobreak,
+ -- hyphen = nil,
+ non_starter = korean_break,
+ other = korean_break,
+ },
+ korean = {
+ jamo_initial = korean_break,
+ korean = korean_break,
+ chinese = korean_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak,
+ full_width_open = stretch_break,
+ full_width_close = nobreak,
+ -- hyphen = nil,
+ non_starter = korean_break,
+ other = korean_break,
+ },
+ chinese = {
+ jamo_initial = korean_break,
+ korean = korean_break,
+ chinese = korean_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak,
+ full_width_open = stretch_break,
+ full_width_close = nobreak,
+ -- hyphen = nil,
+ non_starter = korean_break,
+ other = korean_break,
+ },
+ hyphen = {
+ jamo_initial = stretch_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak,
+ full_width_open = stretch_break,
+ full_width_close = nobreak,
+ -- hyphen = nil,
+ non_starter = stretch_break,
+ other = stretch_break,
+ },
+ start = {
+ -- jamo_initial = nil,
+ -- korean = nil,
+ -- chinese = nil,
+ -- half_width_open = nil,
+ -- half_width_close = nil,
+ -- full_width_open = nil,
+ -- full_width_close = nil,
+ -- hyphen = nil,
+ -- non_starter = nil,
+ -- other = nil,
+ },
+ other = {
+ jamo_initial = stretch_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak,
+ full_width_open = stretch_break,
+ full_width_close = nobreak,
+ -- hyphen = nil,
+ non_starter = stretch_break,
+ other = stretch_break,
+ },
+ non_starter = {
+ jamo_initial = stretch_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak,
+ full_width_open = stretch_break,
+ full_width_close = nobreak,
+ -- hyphen = nil,
+ non_starter = nobreak,
+ other = nobreak,
+ },
+ full_width_open = {
+ jamo_initial = nobreak,
+ korean = nobreak,
+ chinese = nobreak,
+ half_width_open = nobreak,
+ half_width_close = nobreak,
+ full_width_open = nobreak,
+ full_width_close = nobreak,
+ hyphen = nobreak,
+ non_starter = nobreak,
+ other = nobreak,
+ },
+ half_width_open = {
+ jamo_initial = nobreak,
+ korean = nobreak,
+ chinese = nobreak,
+ half_width_open = nobreak,
+ half_width_close = nobreak,
+ full_width_open = nobreak,
+ full_width_close = nobreak,
+ hyphen = nobreak,
+ non_starter = nobreak,
+ other = nobreak,
+ },
+ full_width_close = {
+ jamo_initial = stretch_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak_stretch,
+ full_width_open = stretch_break,
+ full_width_close = nobreak_stretch,
+ hyphen = nobreak_stretch,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+ half_width_close = {
+ jamo_initial = stretch_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = stretch_break,
+ half_width_close = nobreak_stretch,
+ full_width_open = stretch_break,
+ full_width_close = nobreak_stretch,
+ hyphen = nobreak_stretch,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+}
+
+local dataset = {
+ inter_char_stretch_factor = 0.50, -- of quad
+ inter_char_half_shrink_factor = 0.50, -- of quad
+ inter_char_hangul_penalty = 50,
+}
+
+local function process(head,first,last)
+ if first ~= last then
+ local lastfont, previous, originals, last = nil, "start", nil, nil
+ while true do
+ local upcoming, id = first.next, first.id
+ if id == glyph then
+ local a = has_attribute(first,prestat)
+ local current = number_to_kind[a]
+ local action = injectors[previous]
+ if action then
+ action = action[current]
+ if action then
+ local font = first.font
+ if font ~= lastfont then
+ lastfont, done = font, true
+ set_parameters(font,dataset)
+ end
+ action(head,first)
+ end
+ end
+ previous = current
+ else -- glue
+ local p, n = first.prev, upcoming
+ if p and n then
+ local pid, nid = p.id, n.id
+ if pid == glyph and nid == glyph then
+ local pa, na = has_attribute(p,prestat), has_attribute(n,prestat)
+ local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na]
+ if not pcjk or not ncjk
+ or pcjk == "korean" or ncjk == "korean"
+ or pcjk == "other" or ncjk == "other"
+ or pcjk == "jamo_final" or ncjk == "jamo_initial" then
+ previous = "start"
+ else -- if head ~= first then
+ remove_node(head,first,true)
+ previous = pcjk
+ -- else
+ -- previous = pcjk
+ end
+ else
+ previous = "start"
+ end
+ else
+ previous = "start"
+ end
+ end
+ if upcoming == stop then
+ break
+ else
+ first = upcoming
+ end
+ end
+ end
+end
+
+scripts.install {
+ name = "hangul",
+ process = process,
+}
+
+-- hanzi (chinese)
+
+local injectors = { -- [previous] [current]
+ jamo_final = {
+ jamo_initial = korean_break,
+ korean = korean_break,
+ chinese = stretch_break,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_break_shrink,
+ full_width_close = nobreak_stretch,
+ -- hyphen = nil,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+ korean = {
+ jamo_initial = korean_break,
+ korean = korean_break,
+ chinese = stretch_break,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_break_shrink,
+ full_width_close = nobreak_stretch,
+ -- hyphen = nil,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+ chinese = {
+ jamo_initial = korean_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_break_shrink,
+ full_width_close = nobreak_stretch,
+ hyphen = nobreak_stretch,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+ hyphen = {
+ jamo_initial = korean_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_break_shrink,
+ full_width_close = nobreak_stretch,
+ -- hyphen = nil,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+ start = {
+ -- jamo_initial = nil,
+ -- korean = nil,
+ -- chinese = nil,
+ half_width_open = nobreak_autoshrink,
+ half_width_close = nil,
+ full_width_open = nobreak_shrink,
+ full_width_close = nobreak,
+ -- hyphen = nil,
+ non_starter = nobreak,
+ -- other = nil,
+ },
+ other = {
+ jamo_initial = stretch_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_break_shrink,
+ full_width_close = nobreak_stretch,
+ -- hyphen = nil,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+ non_starter = {
+ jamo_initial = stretch_break,
+ korean = stretch_break,
+ chinese = stretch_break,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_break_shrink,
+ full_width_close = nobreak_stretch,
+ -- hyphen = nil,
+ non_starter = nobreak_stretch,
+ other = stretch_break,
+ },
+ full_width_open = {
+ jamo_initial = nobreak_stretch,
+ korean = nobreak_stretch,
+ chinese = nobreak_stretch,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_break_shrink,
+ full_width_close = nobreak_stretch,
+ hyphen = nobreak_stretch,
+ non_starter = nobreak_stretch,
+ other = nobreak_stretch,
+ },
+ half_width_open = {
+ jamo_initial = nobreak_stretch,
+ korean = nobreak_stretch,
+ chinese = nobreak_stretch,
+ half_width_open = nobreak_stretch_break_autoshrink,
+ half_width_close = nobreak_stretch,
+ full_width_open = nobreak_stretch_nobreak_shrink,
+ full_width_close = nobreak_stretch,
+ hyphen = nobreak_stretch,
+ non_starter = nobreak_stretch,
+ other = nobreak_stretch,
+ },
+ full_width_close = {
+ jami_initial = nobreak_shrink_break_stretch,
+ korean = nobreak_shrink_break_stretch,
+ chinese = stretch_break, -- nobreak_shrink_break_stretch,
+ half_width_open = nobreak_shrink_break_stretch_nobreak_autoshrink,
+ half_width_close = nobreak_shrink_nobreak_stretch,
+ full_width_open = nobreak_shrink_break_stretch_nobreak_shrink,
+ full_width_close = nobreak_shrink_nobreak_stretch,
+ hyphen = nobreak_shrink_break_stretch,
+ non_starter = nobreak_shrink_break_stretch,
+ other = nobreak_shrink_break_stretch,
+ },
+ half_width_close = {
+ jami_initial = nobreak_shrink_break_stretch,
+ korean = nobreak_autoshrink_break_stretch,
+ chinese = stretch_break, -- nobreak_autoshrink_break_stretch,
+ half_width_open = nobreak_autoshrink_break_stretch_nobreak_autoshrink,
+ half_width_close = nobreak_autoshrink_nobreak_stretch,
+ full_width_open = nobreak_autoshrink_break_stretch_nobreak_shrink,
+ full_width_close = nobreak_autoshrink_nobreak_stretch,
+ hyphen = nobreak_autoshrink_break_stretch,
+ non_starter = nobreak_autoshrink_break_stretch,
+ other = nobreak_autoshrink_break_stretch,
+ },
+}
+
+local dataset = {
+ inter_char_stretch_factor = 0.50, -- of quad
+ inter_char_half_shrink_factor = 0.50, -- of quad
+ inter_char_hangul_penalty = 50,
+}
+
+local function process(head,first,last)
+ if first ~= last then
+ local lastfont, previous, originals, last = nil, "start", nil, nil
+ while true do
+ local upcoming, id = first.next, first.id
+ if id == glyph then
+ local a = has_attribute(first,prestat)
+ local current = number_to_kind[a]
+ local action = injectors[previous]
+ if action then
+ action = action[current]
+ if action then
+ local font = first.font
+ if font ~= lastfont then
+ lastfont, done = font, true
+ set_parameters(font,dataset)
+ end
+ action(head,first)
+ end
+ end
+ previous = current
+ else -- glue
+ local p, n = first.prev, upcoming
+ if p and n then
+ local pid, nid = p.id, n.id
+ if pid == glyph and nid == glyph then
+ local pa, na = has_attribute(p,prestat), has_attribute(n,prestat)
+ local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na]
+ if not pcjk or not ncjk
+ or pcjk == "korean" or ncjk == "korean"
+ or pcjk == "other" or ncjk == "other"
+ or pcjk == "jamo_final" or ncjk == "jamo_initial" then
+ previous = "start"
+ else -- if head ~= first then
+ remove_node(head,first,true)
+ previous = pcjk
+ -- else
+ -- previous = pcjk
+ end
+ else
+ previous = "start"
+ end
+ else
+ previous = "start"
+ end
+ end
+ if upcoming == stop then
+ break
+ else
+ first = upcoming
+ end
+ end
+ end
+end
+
+scripts.install {
+ name = "hanzi",
+ process = process,
+}
diff --git a/tex/context/base/scrp-ini.lua b/tex/context/base/scrp-ini.lua
new file mode 100644
index 000000000..b28c297d0
--- /dev/null
+++ b/tex/context/base/scrp-ini.lua
@@ -0,0 +1,388 @@
+if not modules then modules = { } end modules ['scrp-ini'] = {
+ version = 1.001,
+ comment = "companion to scrp-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_analyzing = false trackers.register("scripts.analyzing", function(v) trace_analyzing = v end)
+local trace_injections = false trackers.register("scripts.injections", function(v) trace_injections = v end)
+
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local first_character = node.first_character
+local traverse_id = node.traverse_id
+
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local penalty = node.id('penalty')
+
+local fcs = (fonts.color and fonts.color.set) or function() end
+local fcr = (fonts.color and fonts.color.reset) or function() end
+
+local state = attributes.private('state')
+local preproc = attributes.private('preproc')
+local prestat = attributes.private('prestat')
+
+local fontdata = fonts.ids
+
+scripts = scripts or { }
+scripts.handlers = scripts.handlers or { }
+
+scripts.names = scripts.names or { }
+scripts.numbers = scripts.numbers or { }
+scripts.hash = scripts.hash or { }
+
+storage.register("scripts/hash", scripts.hash, "scripts.hash")
+
+if not next(scripts.hash) then
+
+ local hash = {
+ --
+ -- half width opening parenthesis
+ [0x0028] = "half_width_open",
+ [0x005B] = "half_width_open",
+ [0x007B] = "half_width_open",
+ [0x2018] = "half_width_open", -- ‘
+ [0x201C] = "half_width_open", -- “
+ --
+ -- full width opening parenthesis
+ --
+ [0x3008] = "full_width_open", -- 〈 Left book quote
+ [0x300A] = "full_width_open", -- 《 Left double book quote
+ [0x300C] = "full_width_open", -- 「 left quote
+ [0x300E] = "full_width_open", -- 『 left double quote
+ [0x3010] = "full_width_open", -- 【 left double book quote
+ [0x3014] = "full_width_open", -- 〔 left book quote
+ [0x3016] = "full_width_open", --〖 left double book quote
+ [0x3018] = "full_width_open", -- left tortoise bracket
+ [0x301A] = "full_width_open", -- left square bracket
+ [0x301D] = "full_width_open", -- reverse double prime qm
+ [0xFF08] = "full_width_open", -- ( left parenthesis
+ [0xFF3B] = "full_width_open", -- [ left square brackets
+ [0xFF5B] = "full_width_open", -- { left curve bracket
+ [0xFF62] = "full_width_open", -- left corner bracket
+ --
+ -- half width closing parenthesis
+ [0x0029] = "half_width_close",
+ [0x005D] = "half_width_close",
+ [0x007D] = "half_width_close",
+ [0x2019] = "half_width_close", -- ’ right quote, right
+ [0x201D] = "half_width_close", -- ” right double quote
+ --
+ -- full width closing parenthesis
+ --
+ [0x3009] = "full_width_close", -- 〉 book quote
+ [0x300B] = "full_width_close", -- 》 double book quote
+ [0x300D] = "full_width_close", -- 」 right quote, right
+ [0x300F] = "full_width_close", -- 』 right double quote
+ [0x3011] = "full_width_close", -- 】 right double book quote
+ [0x3015] = "full_width_close", -- 〕 right book quote
+ [0x3017] = "full_width_close", -- 〗 right double book quote
+ [0x3019] = "full_width_close", -- right tortoise bracket
+ [0x301B] = "full_width_close", -- right square bracket
+ [0x301E] = "full_width_close", -- double prime qm
+ [0x301F] = "full_width_close", -- low double prime qm
+ [0xFF09] = "full_width_close", -- ) right parenthesis
+ [0xFF3D] = "full_width_close", -- ] right square brackets
+ [0xFF5D] = "full_width_close", -- } right curve brackets
+ [0xFF63] = "full_width_close", -- right corner bracket
+ --
+ -- vertical opening vertical
+ --
+ -- 0xFE35, 0xFE37, 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, 0xFE47,
+ --
+ -- vertical closing
+ --
+ -- 0xFE36, 0xFE38, 0xFE3A, 0xFE3C, 0xFE3E, 0xFE40, 0xFE42, 0xFE44, 0xFE48,
+ --
+ -- half width opening punctuation
+ --
+ -- <empty>
+ --
+ -- full width opening punctuation
+ --
+ -- 0x2236, -- ∶
+ -- 0xFF0C, -- ,
+ --
+ -- half width closing punctuation_hw
+ --
+ [0x0021] = "half_width_close", -- !
+ [0x002C] = "half_width_close", -- ,
+ [0x002E] = "half_width_close", -- .
+ [0x003A] = "half_width_close", -- :
+ [0x003B] = "half_width_close", -- ;
+ [0x003F] = "half_width_close", -- ?
+ [0xFF61] = "half_width_close", -- hw full stop
+ --
+ -- full width closing punctuation
+ [0x3001] = "full_width_close", -- 、
+ [0x3002] = "full_width_close", -- 。
+ [0xFF01] = "full_width_close", -- !
+ [0xFF0C] = "full_width_close", -- ,
+ [0xFF0E] = "full_width_close", -- .
+ [0xFF1A] = "full_width_close", -- :
+ [0xFF1B] = "full_width_close", -- ;
+ [0xFF1F] = "full_width_close", -- ?
+ --
+ -- non starter
+ --
+ [0x3005] = "non_starter", [0x3041] = "non_starter", [0x3043] = "non_starter", [0x3045] = "non_starter", [0x3047] = "non_starter",
+ [0x3049] = "non_starter", [0x3063] = "non_starter", [0x3083] = "non_starter", [0x3085] = "non_starter", [0x3087] = "non_starter",
+ [0x308E] = "non_starter", [0x3095] = "non_starter", [0x3096] = "non_starter", [0x309B] = "non_starter", [0x309C] = "non_starter",
+ [0x309D] = "non_starter", [0x309E] = "non_starter", [0x30A0] = "non_starter", [0x30A1] = "non_starter", [0x30A3] = "non_starter",
+ [0x30A5] = "non_starter", [0x30A7] = "non_starter", [0x30A9] = "non_starter", [0x30C3] = "non_starter", [0x30E3] = "non_starter",
+ [0x30E5] = "non_starter", [0x30E7] = "non_starter", [0x30EE] = "non_starter", [0x30F5] = "non_starter", [0x30F6] = "non_starter",
+ [0x30FC] = "non_starter", [0x30FD] = "non_starter", [0x30FE] = "non_starter", [0x31F0] = "non_starter", [0x31F1] = "non_starter",
+ [0x30F2] = "non_starter", [0x30F3] = "non_starter", [0x30F4] = "non_starter", [0x31F5] = "non_starter", [0x31F6] = "non_starter",
+ [0x30F7] = "non_starter", [0x30F8] = "non_starter", [0x30F9] = "non_starter", [0x31FA] = "non_starter", [0x31FB] = "non_starter",
+ [0x30FC] = "non_starter", [0x30FD] = "non_starter", [0x30FE] = "non_starter", [0x31FF] = "non_starter",
+ --
+ -- hyphenation
+ --
+ [0x2026] = "hyphen", -- … ellipsis
+ [0x2014] = "hyphen", -- — hyphen
+ }
+
+ for i=0x03040,0x0309F do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x030A0,0x030FF do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x031F0,0x031FF do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x03400,0x04DFF do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x04E00,0x09FFF do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x0F900,0x0FAFF do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x0FF00,0x0FFEF do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x20000,0x2A6DF do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x2F800,0x2FA1F do if not hash[i] then hash[i] = "chinese" end end
+ for i=0x0AC00,0x0D7A3 do if not hash[i] then hash[i] = "korean" end end
+ for i=0x01100,0x0115F do if not hash[i] then hash[i] = "jamo_initial" end end
+ for i=0x01160,0x011A7 do if not hash[i] then hash[i] = "jamo_medial" end end
+ for i=0x011A8,0x011FF do if not hash[i] then hash[i] = "jamo_final" end end
+
+ scripts.hash = hash
+
+end
+
+scripts.colors = { -- todo: just named colors
+ korean = "font:isol",
+ chinese = "font:rest",
+ full_width_open = "font:init",
+ full_width_close = "font:fina",
+ half_width_open = "font:init",
+ half_width_close = "font:fina",
+ hyphen = "font:medi",
+ non_starter = "font:isol",
+ jamo_initial = "font:init",
+ jamo_medial = "font:medi",
+ jamo_final = "font:fina",
+
+}
+
+scripts.number_to_kind = {
+ "korean",
+ "chinese",
+ "full_width_open",
+ "full_width_close",
+ "half_width_open",
+ "half_width_close",
+ "hyphen",
+ "non_starter",
+ "jamo_initial",
+ "jamo_medial",
+ "jamo_final",
+}
+
+scripts.kind_to_number = {
+ korean = 1,
+ chinese = 2,
+ full_width_open = 3,
+ full_width_close = 4,
+ half_width_open = 5,
+ half_width_close = 6,
+ hyphen = 7,
+ non_starter = 8,
+ jamo_initial = 9,
+ jamo_medial = 10,
+ jamo_final = 11,
+}
+
+local kind_to_number = scripts.kind_to_number
+local number_to_kind = scripts.number_to_kind
+
+-- no, this time loading the lua always precedes the definitions
+--
+-- storage.register("scripts/names", scripts.names, "scripts.names")
+-- storage.register("scripts/numbers", scripts.numbers, "scripts.numbers")
+
+local handlers = scripts.handlers
+local names = scripts.names
+local numbers = scripts.numbers
+local hash = scripts.hash
+local colors = scripts.colors
+
+-- maybe also process
+
+function scripts.install(handler)
+ local name = handler.name
+ if not names[name] then
+ local n = #numbers + 1
+ numbers[n] = name
+ names[name] = n
+ handlers[n] = handler
+ end
+ return names[name]
+end
+
+function scripts.define(name)
+ tex.write(names[name] or attributes.unsetvalue)
+end
+
+-- some time i will make a fonts.originals[id]
+
+local function colorize(start,stop)
+ for n in traverse_id(glyph,start) do
+ local kind = number_to_kind[has_attribute(n,prestat)]
+ if kind then
+ local ac = colors[kind]
+ if ac then
+ fcs(n,ac)
+ end
+ end
+ if n == stop then
+ break
+ end
+ end
+end
+
+local function traced_process(head,first,last,process,a)
+ if start ~= last then
+ local f, l = first, last
+ logs.report("preprocess","before %s: %s",names[a] or "?",nodes.tosequence(f,l))
+ process(head,first,last)
+ logs.report("preprocess","after %s: %s", names[a] or "?",nodes.tosequence(f,l))
+ end
+end
+
+-- eventually we might end up with more extensive parsing
+-- todo: pass t[start..stop] == original
+--
+-- one of the time consuming functiions:
+
+function scripts.preprocess(head)
+ local start = first_character(head)
+ if not start then
+ return head, false
+ else
+ local last_a, normal_process, lastfont, originals = nil, nil, nil, nil
+ local done, first, last, ok = false, nil, nil, false
+ while start do
+ local id = start.id
+ if id == glyph then
+ local a = has_attribute(start,preproc)
+ if a then
+ if a ~= last_a then
+ if first then
+ if ok then
+ if trace_analyzing then
+ colorize(first,last)
+ end
+ if trace_injections then
+ traced_process(head,first,last,normal_process,last_a)
+ else
+ normal_process(head,first,last)
+ end
+ ok, done = false, true
+ end
+ first, last = nil, nil
+ end
+ last_a = a
+ local handler = handlers[a]
+ normal_process = handler.process
+ end
+ if normal_process then
+ local f = start.font
+ if f ~= lastfont then
+ originals = fontdata[f].originals
+ lastfont = f
+ end
+ local c = start.char
+ if originals then c = originals[c] or c end
+ local h = hash[c]
+ if h then
+ set_attribute(start,prestat,kind_to_number[h])
+ if not first then
+ first, last = start, start
+ else
+ last = start
+ end
+ -- if cjk == "chinese" or cjk == "korean" then -- we need to prevent too much ( ) processing
+ ok = true
+ -- end
+ elseif first then
+ if ok then
+ if trace_analyzing then
+ colorize(first,last)
+ end
+ if trace_injections then
+ traced_process(head,first,last,normal_process,last_a)
+ else
+ normal_process(head,first,last)
+ end
+ ok, done = false, true
+ end
+ first, last = nil, nil
+ end
+ end
+ elseif first then
+ if ok then
+ if trace_analyzing then
+ colorize(first,last)
+ end
+ if trace_injections then
+ traced_process(head,first,last,normal_process,last_a)
+ else
+ normal_process(head,first,last)
+ end
+ ok, done = false, true
+ end
+ first, last = nil, nil
+ end
+ elseif id == glue then
+ if ok then
+ -- continue
+ elseif first then
+ -- no chinese or korean
+ first, last = nil, nil
+ end
+ elseif first then
+ if ok then
+ -- some chinese or korean
+ if trace_analyzing then
+ colorize(first,last)
+ end
+ if trace_injections then
+ traced_process(head,first,last,normal_process,last_a)
+ else
+ normal_process(head,first,last)
+ end
+ first, last, ok, done = nil, nil, false, true
+ elseif first then
+ first, last = nil, nil
+ end
+ end
+ start = start.next
+ end
+ if ok then
+ if trace_analyzing then
+ colorize(first,last)
+ end
+ if trace_injections then
+ traced_process(head,first,last,normal_process,last_a)
+ else
+ normal_process(head,first,last)
+ end
+ done = true
+ end
+ return head, done
+ end
+end
diff --git a/tex/context/base/scrp-ini.mkiv b/tex/context/base/scrp-ini.mkiv
new file mode 100644
index 000000000..6e6b10610
--- /dev/null
+++ b/tex/context/base/scrp-ini.mkiv
@@ -0,0 +1,91 @@
+%D \module
+%D [ file=scrp-ini,
+%D version=2009.02.06,
+%D title=\CONTEXT\ Script Macros,
+%D subtitle=Initialization,
+%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.
+
+% here we collect code from other places (was organized differently)
+
+\registerctxluafile{scrp-ini}{1.001}
+\registerctxluafile{scrp-cjk}{1.001}
+
+\definesystemattribute[preproc] \chardef\preprocattribute \dogetattributeid{preproc}
+\definesystemattribute[prestat] \chardef\prestatattribute \dogetattributeid{prestat}
+
+%D Since scripts need specific \LUA\ code we use hard coded attribute
+%D values, but we might have more tricks at some time, so we use a
+%D proper define macro too.
+
+\unprotect
+
+\def\s!attribute{attribute}
+
+\def\namedscriptparameter#1#2%
+ {\csname\doscriptparameter{\??ls#1}#2\endcsname}
+
+\def\scriptparameter#1%
+ {\csname\doscriptparameter{\??ls\currentscript}#1\endcsname}
+
+\def\doscriptparameter#1#2%
+ {\ifcsname#1#2\endcsname#1#2\else\expandafter\doscriptparentparameter\csname#1\s!parent\endcsname#2\fi}
+
+\def\doscriptparentparameter#1#2%
+ {\ifx#1\relax\s!empty\else\doscriptparameter#1#2\fi}
+
+% \def\scriptparameterhash#1%
+% {\doscriptparameterhash{\??ls\currentscript}#1}
+%
+% \def\doscriptparameterhash#1#2%
+% {\ifcsname#1#2\endcsname#1\else\expandafter\doscriptparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+%
+% \def\doscriptparentparameterhash#1#2%
+% {\ifx#1\relax\else\doscriptparameterhash#1#2\fi}
+
+% when #2 == string, then only synonym, no settings
+
+\unexpanded\def\definescript
+ {\dodoubleargument\dodefinescript}
+
+\def\dodefinescript[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\getparameters[\??ls#1][\c!method=,\s!parent=,#2]%
+ \doifelsenothing{\namedscriptparameter{#1}\c!method}
+ {\letvalue {\??ls#1\s!attribute}\attributeunsetvalue}%
+ {\setevalue{\??ls#1\s!attribute}{\ctxlua{scripts.define("\namedscriptparameter{#1}\c!method")}}}}%
+ {\getparameters[\??ls#1][\s!parent=#2]}%
+ \setvalue{#1}{\dosetscript{#1}}}
+
+\unexpanded\def\setupscript
+ {\dodoubleargument\dosetupscript}
+
+\def\dosetupscript[#1][#2]%
+ {\getparameters[\??ls#1][#2]}
+
+\def\dosetscript#1%
+ {\def\currentscript{#1}%
+ \edef\currentscriptattribute{\scriptparameter\s!attribute}%
+ \ifx\currentscriptattribute\empty
+ \let\currentscript\empty
+ \attribute\preprocattribute\attributeunsetvalue
+ \else
+ \attribute\preprocattribute\currentscriptattribute\relax % we can speed this up by storing the attribute in ??ls:a:#1
+ \fi}
+
+\def\setscript [#1]{\dosetscript{#1}}
+\unexpanded\def\startscript[#1]{\begingroup\dosetscript{#1}}
+\unexpanded\def\stopscript {\endgroup}
+
+% \setscript[hangul] \hangul \startscript[hangul]
+
+\definescript[latin] [\c!method=] % resets the attribute
+\definescript[hangul][\c!method=hangul]
+\definescript[hanzi] [\c!method=hanzi]
+
+\protect \endinput
diff --git a/tex/context/base/sort-def.mkii b/tex/context/base/sort-def.mkii
new file mode 100644
index 000000000..10dc31b14
--- /dev/null
+++ b/tex/context/base/sort-def.mkii
@@ -0,0 +1,450 @@
+%D \module
+%D [ file=sort-def,
+%D version=2005.08.08,
+%D title=\CONTEXT\ Sort Macros,
+%D subtitle=Defaults,
+%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 replaces existing sort key handling and is meant to be
+%D used with the new texutil functionality. Here we define the default
+%D mappings
+
+\exportsortexpansion{aeligature} {ae}
+\exportsortexpansion{AEligature} {AE}
+\exportsortexpansion{ijligature} {ij}
+\exportsortexpansion{IJligature} {IJ}
+\exportsortexpansion{oeligature} {oe}
+\exportsortexpansion{OEligature} {OE}
+
+\exportsortexpansion{ssharp} {ss}
+\exportsortexpansion{Ssharp} {SS}
+
+\exportsortexpansion{thorn} {}
+\exportsortexpansion{Thorn} {}
+
+\exportsortexpansion{eth} {}
+\exportsortexpansion{Eth} {}
+
+\exportsortexpansion{dj} {dstroke}
+\exportsortexpansion{Dj} {Dstroke}
+
+\exportsortexpansion{Acircumflex} {}
+\exportsortexpansion{acircumflex} {}
+\exportsortexpansion{Ccircumflex} {}
+\exportsortexpansion{ccircumflex} {}
+\exportsortexpansion{Ecircumflex} {}
+\exportsortexpansion{ecircumflex} {}
+\exportsortexpansion{Gcircumflex} {}
+\exportsortexpansion{gcircumflex} {}
+\exportsortexpansion{Hcircumflex} {}
+\exportsortexpansion{hcircumflex} {}
+\exportsortexpansion{Icircumflex} {}
+\exportsortexpansion{icircumflex} {}
+\exportsortexpansion{Jcircumflex} {}
+\exportsortexpansion{jcircumflex} {}
+\exportsortexpansion{Ocircumflex} {}
+\exportsortexpansion{ocircumflex} {}
+\exportsortexpansion{Scircumflex} {}
+\exportsortexpansion{scircumflex} {}
+\exportsortexpansion{Ucircumflex} {}
+\exportsortexpansion{ucircumflex} {}
+\exportsortexpansion{Wcircumflex} {}
+\exportsortexpansion{wcircumflex} {}
+\exportsortexpansion{Ycircumflex} {}
+\exportsortexpansion{ycircumflex} {}
+
+\exportsortexpansion{Agrave} {}
+\exportsortexpansion{agrave} {}
+\exportsortexpansion{Egrave} {}
+\exportsortexpansion{egrave} {}
+\exportsortexpansion{Igrave} {}
+\exportsortexpansion{igrave} {}
+\exportsortexpansion{Ograve} {}
+\exportsortexpansion{ograve} {}
+\exportsortexpansion{Ugrave} {}
+\exportsortexpansion{ugrave} {}
+\exportsortexpansion{Ygrave} {}
+\exportsortexpansion{ygrave} {}
+
+\exportsortexpansion{Atilde} {}
+\exportsortexpansion{atilde} {}
+\exportsortexpansion{Itilde} {}
+\exportsortexpansion{itilde} {}
+\exportsortexpansion{Ntilde} {}
+\exportsortexpansion{ntilde} {}
+\exportsortexpansion{Otilde} {}
+\exportsortexpansion{otilde} {}
+\exportsortexpansion{Utilde} {}
+\exportsortexpansion{utilde} {}
+\exportsortexpansion{Ytilde} {}
+\exportsortexpansion{ytilde} {}
+
+\exportsortexpansion{Adiaeresis} {}
+\exportsortexpansion{adiaeresis} {}
+\exportsortexpansion{Ediaeresis} {}
+\exportsortexpansion{ediaeresis} {}
+\exportsortexpansion{Idiaeresis} {}
+\exportsortexpansion{idiaeresis} {}
+\exportsortexpansion{Odiaeresis} {}
+\exportsortexpansion{odiaeresis} {}
+\exportsortexpansion{Udiaeresis} {}
+\exportsortexpansion{udiaeresis} {}
+\exportsortexpansion{Ydiaeresis} {}
+\exportsortexpansion{ydiaeresis} {}
+
+\exportsortexpansion{Aacute} {}
+\exportsortexpansion{aacute} {}
+\exportsortexpansion{Cacute} {}
+\exportsortexpansion{cacute} {}
+\exportsortexpansion{Eacute} {}
+\exportsortexpansion{eacute} {}
+\exportsortexpansion{Iacute} {}
+\exportsortexpansion{iacute} {}
+\exportsortexpansion{Lacute} {}
+\exportsortexpansion{lacute} {}
+\exportsortexpansion{Nacute} {}
+\exportsortexpansion{nacute} {}
+\exportsortexpansion{Oacute} {}
+\exportsortexpansion{oacute} {}
+\exportsortexpansion{Racute} {}
+\exportsortexpansion{racute} {}
+\exportsortexpansion{Sacute} {}
+\exportsortexpansion{sacute} {}
+\exportsortexpansion{Uacute} {}
+\exportsortexpansion{uacute} {}
+\exportsortexpansion{Yacute} {}
+\exportsortexpansion{yacute} {}
+\exportsortexpansion{Zacute} {}
+\exportsortexpansion{zacute} {}
+
+\exportsortexpansion{dstroke} {}
+\exportsortexpansion{Dstroke} {}
+\exportsortexpansion{Hstroke} {}
+\exportsortexpansion{hstroke} {}
+\exportsortexpansion{Tstroke} {}
+\exportsortexpansion{tstroke} {}
+
+\exportsortexpansion{Cdotaccent} {}
+\exportsortexpansion{cdotaccent} {}
+\exportsortexpansion{Edotaccent} {}
+\exportsortexpansion{edotaccent} {}
+\exportsortexpansion{Gdotaccent} {}
+\exportsortexpansion{gdotaccent} {}
+\exportsortexpansion{Idotaccent} {}
+\exportsortexpansion{idotaccent} {}
+\exportsortexpansion{Zdotaccent} {}
+\exportsortexpansion{zdotaccent} {}
+
+\exportsortexpansion{Amacron} {}
+\exportsortexpansion{amacron} {}
+\exportsortexpansion{Emacron} {}
+\exportsortexpansion{emacron} {}
+\exportsortexpansion{Imacron} {}
+\exportsortexpansion{imacron} {}
+\exportsortexpansion{Omacron} {}
+\exportsortexpansion{omacron} {}
+\exportsortexpansion{Umacron} {}
+\exportsortexpansion{umacron} {}
+
+\exportsortexpansion{Ccedilla} {}
+\exportsortexpansion{ccedilla} {}
+\exportsortexpansion{Kcedilla} {}
+\exportsortexpansion{kcedilla} {}
+\exportsortexpansion{Lcedilla} {}
+\exportsortexpansion{lcedilla} {}
+\exportsortexpansion{Ncedilla} {}
+\exportsortexpansion{ncedilla} {}
+\exportsortexpansion{Rcedilla} {}
+\exportsortexpansion{rcedilla} {}
+\exportsortexpansion{Scedilla} {}
+\exportsortexpansion{scedilla} {}
+\exportsortexpansion{Tcedilla} {}
+\exportsortexpansion{tcedilla} {}
+
+\exportsortexpansion{Ohungarumlaut} {}
+\exportsortexpansion{ohungarumlaut} {}
+\exportsortexpansion{Uhungarumlaut} {}
+\exportsortexpansion{uhungarumlaut} {}
+
+\exportsortexpansion{Aogonek} {}
+\exportsortexpansion{aogonek} {}
+\exportsortexpansion{Eogonek} {}
+\exportsortexpansion{eogonek} {}
+\exportsortexpansion{Iogonek} {}
+\exportsortexpansion{iogonek} {}
+\exportsortexpansion{Uogonek} {}
+\exportsortexpansion{uogonek} {}
+
+\exportsortexpansion{Aring} {}
+\exportsortexpansion{aring} {}
+\exportsortexpansion{Uring} {}
+\exportsortexpansion{uring} {}
+
+\exportsortexpansion{Abreve} {}
+\exportsortexpansion{abreve} {}
+\exportsortexpansion{Ebreve} {}
+\exportsortexpansion{ebreve} {}
+\exportsortexpansion{Gbreve} {}
+\exportsortexpansion{gbreve} {}
+\exportsortexpansion{Ibreve} {}
+\exportsortexpansion{ibreve} {}
+\exportsortexpansion{Obreve} {}
+\exportsortexpansion{obreve} {}
+\exportsortexpansion{Ubreve} {}
+\exportsortexpansion{ubreve} {}
+
+\exportsortexpansion{Ccaron} {}
+\exportsortexpansion{ccaron} {}
+\exportsortexpansion{Dcaron} {}
+\exportsortexpansion{dcaron} {}
+\exportsortexpansion{Ecaron} {}
+\exportsortexpansion{ecaron} {}
+\exportsortexpansion{Lcaron} {}
+\exportsortexpansion{lcaron} {}
+\exportsortexpansion{Ncaron} {}
+\exportsortexpansion{ncaron} {}
+\exportsortexpansion{Rcaron} {}
+\exportsortexpansion{rcaron} {}
+\exportsortexpansion{Scaron} {}
+\exportsortexpansion{scaron} {}
+\exportsortexpansion{Tcaron} {}
+\exportsortexpansion{tcaron} {}
+\exportsortexpansion{Ycaron} {}
+\exportsortexpansion{ycaron} {}
+\exportsortexpansion{Zcaron} {}
+\exportsortexpansion{zcaron} {}
+
+\exportsortexpansion{Lstroke} {}
+\exportsortexpansion{lstroke} {}
+\exportsortexpansion{Ostroke} {}
+\exportsortexpansion{ostroke} {}
+
+\exportsortexpansion{aumlaut} {}
+\exportsortexpansion{eumlaut} {}
+\exportsortexpansion{iumlaut} {}
+\exportsortexpansion{oumlaut} {}
+\exportsortexpansion{uumlaut} {}
+
+\exportsortexpansion{Aumlaut} {}
+\exportsortexpansion{Eumlaut} {}
+\exportsortexpansion{Iumlaut} {}
+\exportsortexpansion{Oumlaut} {}
+\exportsortexpansion{Uumlaut} {}
+
+\exportsortexpansion{scommaaccent} {}
+\exportsortexpansion{Scommaaccent} {}
+\exportsortexpansion{tcommaaccent} {}
+\exportsortexpansion{Tcommaaccent} {}
+
+\exportsortexpansion{Etilde} {}
+\exportsortexpansion{etilde} {}
+
+\exportsortexpansion{Ahook} {}
+\exportsortexpansion{ahook} {}
+\exportsortexpansion{Ehook} {}
+\exportsortexpansion{ehook} {}
+\exportsortexpansion{Ihook} {}
+\exportsortexpansion{ihook} {}
+\exportsortexpansion{Ohook} {}
+\exportsortexpansion{ohook} {}
+\exportsortexpansion{Uhook} {}
+\exportsortexpansion{uhook} {}
+\exportsortexpansion{Yhook} {}
+\exportsortexpansion{yhook} {}
+
+\exportsortexpansion{Acircumflexgrave} {}
+\exportsortexpansion{Acircumflexacute} {}
+\exportsortexpansion{Acircumflextilde} {}
+\exportsortexpansion{Acircumflexhook} {}
+\exportsortexpansion{acircumflexgrave} {}
+\exportsortexpansion{acircumflexacute} {}
+\exportsortexpansion{acircumflextilde} {}
+\exportsortexpansion{acircumflexhook} {}
+\exportsortexpansion{Ecircumflexgrave} {}
+\exportsortexpansion{Ecircumflexacute} {}
+\exportsortexpansion{Ecircumflextilde} {}
+\exportsortexpansion{Ecircumflexhook} {}
+\exportsortexpansion{ecircumflexgrave} {}
+\exportsortexpansion{ecircumflexacute} {}
+\exportsortexpansion{ecircumflextilde} {}
+\exportsortexpansion{ecircumflexhook} {}
+\exportsortexpansion{Ocircumflexgrave} {}
+\exportsortexpansion{Ocircumflexacute} {}
+\exportsortexpansion{Ocircumflextilde} {}
+\exportsortexpansion{Ocircumflexhook} {}
+\exportsortexpansion{ocircumflexgrave} {}
+\exportsortexpansion{ocircumflexacute} {}
+\exportsortexpansion{ocircumflextilde} {}
+\exportsortexpansion{ocircumflexhook} {}
+
+\exportsortexpansion{Abrevegrave} {}
+\exportsortexpansion{Abreveacute} {}
+\exportsortexpansion{Abrevetilde} {}
+\exportsortexpansion{Abrevehook} {}
+\exportsortexpansion{abrevegrave} {}
+\exportsortexpansion{abreveacute} {}
+\exportsortexpansion{abrevetilde} {}
+\exportsortexpansion{abrevehook} {}
+
+\exportsortexpansion{Adotbelow} {}
+\exportsortexpansion{adotbelow} {}
+\exportsortexpansion{Edotbelow} {}
+\exportsortexpansion{edotbelow} {}
+\exportsortexpansion{Idotbelow} {}
+\exportsortexpansion{idotbelow} {}
+\exportsortexpansion{Odotbelow} {}
+\exportsortexpansion{odotbelow} {}
+\exportsortexpansion{Udotbelow} {}
+\exportsortexpansion{udotbelow} {}
+\exportsortexpansion{Ydotbelow} {}
+\exportsortexpansion{ydotbelow} {}
+\exportsortexpansion{Ohorndotbelow} {}
+\exportsortexpansion{ohorndotbelow} {}
+\exportsortexpansion{Uhorndotbelow} {}
+\exportsortexpansion{uhorndotbelow} {}
+
+\exportsortexpansion{Acircumflexdotbelow} {}
+\exportsortexpansion{acircumflexdotbelow} {}
+\exportsortexpansion{Ecircumflexdotbelow} {}
+\exportsortexpansion{ecircumflexdotbelow} {}
+\exportsortexpansion{Ocircumflexdotbelow} {}
+\exportsortexpansion{ocircumflexdotbelow} {}
+\exportsortexpansion{Abrevedotbelow} {}
+\exportsortexpansion{abrevedotbelow} {}
+
+\exportsortexpansion{Ohorn} {}
+\exportsortexpansion{Ohorngrave} {}
+\exportsortexpansion{Ohornacute} {}
+\exportsortexpansion{Ohorntilde} {}
+\exportsortexpansion{Ohornhook } {}
+\exportsortexpansion{ohorn} {}
+\exportsortexpansion{ohorngrave} {}
+\exportsortexpansion{ohornacute} {}
+\exportsortexpansion{ohorntilde} {}
+\exportsortexpansion{ohornhook } {}
+\exportsortexpansion{Uhorn} {}
+\exportsortexpansion{Uhorngrave} {}
+\exportsortexpansion{Uhornacute} {}
+\exportsortexpansion{Uhorntilde} {}
+\exportsortexpansion{Uhornhook } {}
+\exportsortexpansion{uhorn} {}
+\exportsortexpansion{uhorngrave} {}
+\exportsortexpansion{uhornacute} {}
+\exportsortexpansion{uhorntilde} {}
+\exportsortexpansion{uhornhook} {}
+
+\exportsortexpansion{eszett} {ssharp}
+\exportsortexpansion{Eszett} {Ssharp}
+
+\exportsortexpansion{lslash} {lstroke}
+\exportsortexpansion{Lslash} {Lstroke}
+\exportsortexpansion{dslash} {dstroke}
+\exportsortexpansion{Dslash} {Dstroke}
+\exportsortexpansion{oslash} {ostroke}
+\exportsortexpansion{Oslash} {Ostroke}
+
+\exportsortexpansion{dcroat} {dstroke}
+\exportsortexpansion{Dcroat} {Dstroke}
+
+% more
+
+\exportsortshortcut{\^ A} {\Acircumflex} \exportsortshortcut{\^ a} {\acircumflex}
+\exportsortshortcut{\^ C} {\Ccircumflex} \exportsortshortcut{\^ c} {\ccircumflex}
+\exportsortshortcut{\^ E} {\Ecircumflex} \exportsortshortcut{\^ e} {\ecircumflex}
+\exportsortshortcut{\^ G} {\Gcircumflex} \exportsortshortcut{\^ g} {\gcircumflex}
+\exportsortshortcut{\^ H} {\Hcircumflex} \exportsortshortcut{\^ h} {\hcircumflex}
+\exportsortshortcut{\^ I} {\Icircumflex} \exportsortshortcut{\^ i} {\icircumflex} \exportsortshortcut{\^\i} {\icircumflex}
+\exportsortshortcut{\^ J} {\Jcircumflex} \exportsortshortcut{\^ j} {\jcircumflex} \exportsortshortcut{\^\j} {\jcircumflex}
+\exportsortshortcut{\^ O} {\Ocircumflex} \exportsortshortcut{\^ o} {\ocircumflex}
+\exportsortshortcut{\^ S} {\Scircumflex} \exportsortshortcut{\^ s} {\scircumflex}
+\exportsortshortcut{\^ U} {\Ucircumflex} \exportsortshortcut{\^ u} {\ucircumflex}
+\exportsortshortcut{\^ W} {\Wcircumflex} \exportsortshortcut{\^ w} {\wcircumflex}
+\exportsortshortcut{\^ Y} {\Ycircumflex} \exportsortshortcut{\^ y} {\ycircumflex}
+
+\exportsortshortcut{\` A} {\Agrave} \exportsortshortcut{\` a} {\agrave}
+\exportsortshortcut{\` E} {\Egrave} \exportsortshortcut{\` e} {\egrave}
+\exportsortshortcut{\` I} {\Igrave} \exportsortshortcut{\` i} {\igrave} \exportsortshortcut{\`\i} {\igrave}
+\exportsortshortcut{\` O} {\Ograve} \exportsortshortcut{\` o} {\ograve}
+\exportsortshortcut{\` U} {\Ugrave} \exportsortshortcut{\` u} {\ugrave}
+\exportsortshortcut{\` Y} {\Ygrave} \exportsortshortcut{\` y} {\ygrave}
+
+\exportsortshortcut{\~ A} {\Atilde} \exportsortshortcut{\~ a} {\atilde}
+\exportsortshortcut{\~ I} {\Itilde} \exportsortshortcut{\~ i} {\itilde} \exportsortshortcut{\~\i} {\itilde}
+\exportsortshortcut{\~ O} {\Otilde} \exportsortshortcut{\~ o} {\otilde}
+\exportsortshortcut{\~ U} {\Utilde} \exportsortshortcut{\~ u} {\utilde}
+
+\exportsortshortcut{\" A} {\Adiaeresis} \exportsortshortcut{\" a} {\adiaeresis}
+\exportsortshortcut{\" E} {\Ediaeresis} \exportsortshortcut{\" e} {\ediaeresis}
+\exportsortshortcut{\" I} {\Idiaeresis} \exportsortshortcut{\" i} {\idiaeresis} \exportsortshortcut{\"\i} {\idiaeresis}
+\exportsortshortcut{\" O} {\Odiaeresis} \exportsortshortcut{\" o} {\odiaeresis}
+\exportsortshortcut{\" U} {\Udiaeresis} \exportsortshortcut{\" u} {\udiaeresis}
+\exportsortshortcut{\" Y} {\Ydiaeresis} \exportsortshortcut{\" y} {\ydiaeresis}
+
+\exportsortshortcut{\' A} {\Aacute} \exportsortshortcut{\' a} {\aacute}
+\exportsortshortcut{\' C} {\Cacute} \exportsortshortcut{\' c} {\cacute}
+\exportsortshortcut{\' E} {\Eacute} \exportsortshortcut{\' e} {\eacute}
+\exportsortshortcut{\' I} {\Iacute} \exportsortshortcut{\' i} {\iacute} \exportsortshortcut{\'\i} {\iacute}
+\exportsortshortcut{\' L} {\Lacute} \exportsortshortcut{\' l} {\lacute}
+\exportsortshortcut{\' N} {\Nacute} \exportsortshortcut{\' n} {\nacute}
+\exportsortshortcut{\' O} {\Oacute} \exportsortshortcut{\' o} {\oacute}
+\exportsortshortcut{\' R} {\Racute} \exportsortshortcut{\' r} {\racute}
+\exportsortshortcut{\' S} {\Sacute} \exportsortshortcut{\' s} {\sacute}
+\exportsortshortcut{\' U} {\Uacute} \exportsortshortcut{\' u} {\uacute}
+\exportsortshortcut{\' Y} {\Yacute} \exportsortshortcut{\' y} {\yacute}
+\exportsortshortcut{\' Z} {\Zacute} \exportsortshortcut{\' z} {\zacute}
+
+\exportsortshortcut{\. C} {\Cdotaccent} \exportsortshortcut{\. c} {\cdotaccent}
+\exportsortshortcut{\. E} {\Edotaccent} \exportsortshortcut{\. e} {\edotaccent}
+\exportsortshortcut{\. G} {\Gdotaccent} \exportsortshortcut{\. g} {\gdotaccent}
+\exportsortshortcut{\. I} {\Idotaccent} \exportsortshortcut{\. i} {\idotaccent} \exportsortshortcut{\.\i} {\idotaccent}
+\exportsortshortcut{\. Z} {\Zdotaccent} \exportsortshortcut{\. z} {\zdotaccent}
+
+\exportsortshortcut{\= A} {\Amacron} \exportsortshortcut{\= a} {\amacron}
+\exportsortshortcut{\= E} {\Emacron} \exportsortshortcut{\= e} {\emacron}
+\exportsortshortcut{\= I} {\Imacron} \exportsortshortcut{\= i} {\imacron} \exportsortshortcut{\=\i} {\imacron}
+\exportsortshortcut{\= O} {\Omacron} \exportsortshortcut{\= o} {\omacron}
+\exportsortshortcut{\= U} {\Umacron} \exportsortshortcut{\= u} {\umacron}
+
+\exportsortshortcut{\c C} {\Ccedilla} \exportsortshortcut{\c c} {\ccedilla}
+\exportsortshortcut{\c K} {\Kcedilla} \exportsortshortcut{\c k} {\kcedilla}
+\exportsortshortcut{\c L} {\Lcedilla} \exportsortshortcut{\c l} {\lcedilla}
+\exportsortshortcut{\c N} {\Ncedilla} \exportsortshortcut{\c n} {\ncedilla}
+\exportsortshortcut{\c R} {\Rcedilla} \exportsortshortcut{\c r} {\rcedilla}
+\exportsortshortcut{\c S} {\Scedilla} \exportsortshortcut{\c s} {\scedilla}
+\exportsortshortcut{\c T} {\Tcedilla} \exportsortshortcut{\c t} {\tcedilla}
+
+\exportsortshortcut{\H O} {\Ohungarumlaut} \exportsortshortcut{\H o} {\ohungarumlaut}
+\exportsortshortcut{\H u} {\uhungarumlaut} \exportsortshortcut{\H U} {\Uhungarumlaut}
+
+\exportsortshortcut{\k A} {\Aogonek} \exportsortshortcut{\k a} {\aogonek}
+\exportsortshortcut{\k E} {\Eogonek} \exportsortshortcut{\k e} {\eogonek}
+\exportsortshortcut{\k I} {\Iogonek} \exportsortshortcut{\k i} {\iogonek}
+\exportsortshortcut{\k U} {\Uogonek} \exportsortshortcut{\k u} {\uogonek}
+
+\exportsortshortcut{\r A} {\Aring} \exportsortshortcut{\r a} {\aring}
+\exportsortshortcut{\r U} {\Uring} \exportsortshortcut{\r u} {\uring}
+
+\exportsortshortcut{\u A} {\Abreve} \exportsortshortcut{\u a} {\abreve}
+\exportsortshortcut{\u E} {\Ebreve} \exportsortshortcut{\u e} {\ebreve}
+\exportsortshortcut{\u G} {\Gbreve} \exportsortshortcut{\u g} {\gbreve}
+\exportsortshortcut{\u I} {\Ibreve} \exportsortshortcut{\u i} {\ibreve} \exportsortshortcut{\u\i} {\ibreve}
+\exportsortshortcut{\u O} {\Obreve} \exportsortshortcut{\u o} {\obreve}
+\exportsortshortcut{\u U} {\Ubreve} \exportsortshortcut{\u u} {\ubreve}
+
+\exportsortshortcut{\v C} {\Ccaron} \exportsortshortcut{\v c} {\ccaron}
+\exportsortshortcut{\v D} {\Dcaron} \exportsortshortcut{\v d} {\dcaron}
+\exportsortshortcut{\v E} {\Ecaron} \exportsortshortcut{\v e} {\ecaron}
+\exportsortshortcut{\v L} {\Lcaron} \exportsortshortcut{\v l} {\lcaron}
+\exportsortshortcut{\v N} {\Ncaron} \exportsortshortcut{\v n} {\ncaron}
+\exportsortshortcut{\v R} {\Rcaron} \exportsortshortcut{\v r} {\rcaron}
+\exportsortshortcut{\v S} {\Scaron} \exportsortshortcut{\v s} {\scaron}
+\exportsortshortcut{\v T} {\Tcaron} \exportsortshortcut{\v t} {\tcaron}
+\exportsortshortcut{\v Z} {\Zcaron} \exportsortshortcut{\v z} {\zcaron}
+
+\endinput
diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua
new file mode 100644
index 000000000..b745c9aa5
--- /dev/null
+++ b/tex/context/base/sort-ini.lua
@@ -0,0 +1,317 @@
+if not modules then modules = { } end modules ['sort-ini'] = {
+ version = 1.001,
+ comment = "companion to sort-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- It took a while to get there, but with Fleetwood Mac's "Don't Stop"
+-- playing in the background we sort of got it done.
+
+-- todo: cleanup splits (in other modules)
+
+local utf = unicode.utf8
+local gsub, rep, sort, concat = string.gsub, string.rep, table.sort, table.concat
+local utfbyte, utfchar = utf.byte, utf.char
+local utfcharacters, utfvalues, strcharacters = string.utfcharacters, string.utfvalues, string.characters
+local chardata = characters.data
+local next, type, tonumber = next, type, tonumber
+
+local trace_tests = false trackers.register("sorters.tests", function(v) trace_tests = v end)
+
+sorters = { }
+sorters.comparers = { }
+sorters.splitters = { }
+sorters.entries = { }
+sorters.mappings = { }
+sorters.replacements = { }
+
+sorters.ignored_offset = 0x10000
+sorters.replacement_offset = 0x10000
+sorters.digits_offset = 0x20000
+sorters.digits_maximum = 0xFFFFF
+
+local ignored_offset = sorters.ignored_offset
+local digits_offset = sorters.digits_offset
+local digits_maximum = sorters.digits_maximum
+
+local mappings = sorters.mappings
+local entries = sorters.entries
+local replacements = sorters.replacements
+
+local language, defaultlanguage, dummy = 'en', 'en', { }
+
+local currentreplacements, currentmappings, currententries
+
+function sorters.setlanguage(lang)
+ language = lang or language or defaultlanguage
+ currentreplacements = replacements[language] or replacements[defaultlanguage] or dummy
+ currentmappings = mappings [language] or mappings [defaultlanguage] or dummy
+ currententries = entries [language] or entries [defaultlanguage] or dummy
+ return currentreplacements, currentmappings, currententries
+end
+
+sorters.setlanguage()
+
+-- maybe inline code if it's too slow
+
+local function basicsort(sort_a,sort_b)
+ if not sort_a or not sort_b then
+ return 0
+ elseif #sort_a > #sort_b then
+ if #sort_b == 0 then
+ return 1
+ else
+ for i=1,#sort_b do
+ local ai, bi = sort_a[i], sort_b[i]
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
+ end
+ end
+ return 1
+ end
+ elseif #sort_a < #sort_b then
+ if #sort_a == 0 then
+ return -1
+ else
+ for i=1,#sort_a do
+ local ai, bi = sort_a[i], sort_b[i]
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
+ end
+ end
+ return -1
+ end
+ elseif #sort_a == 0 then
+ return 0
+ else
+ for i=1,#sort_a do
+ local ai, bi = sort_a[i], sort_b[i]
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
+ end
+ end
+ return 0
+ end
+end
+
+function sorters.comparers.basic(a,b)
+ local ea, eb = a.split, b.split
+ local na, nb = #ea, #eb
+ if na == 0 and nb == 0 then
+ -- simple variant (single word)
+ local result = basicsort(ea.e,eb.e)
+ return result == 0 and result or basicsort(ea.m,eb.m)
+ else
+ -- complex variant, used in register (multiple words)
+ local result = 0
+ for i=1,nb < na and nb or na do
+ local eai, ebi = ea[i], eb[i]
+ result = basicsort(eai.e,ebi.e)
+ if result == 0 then
+ result = basicsort(eai.m,ebi.m) -- only needed it there are m's
+ end
+ if result ~= 0 then
+ break
+ end
+ end
+ if result ~= 0 then
+ return result
+ elseif na > nb then
+ return 1
+ elseif nb > na then
+ return -1
+ else
+ return 0
+ end
+ end
+end
+
+local function numify(s)
+ return rep(" ",10-#s) .. s -- or format with padd
+end
+
+local function numify(s)
+ s = digits_offset + tonumber(s)
+ if s > digits_maximum then
+ s = digits_maximum
+ end
+ return utfchar(s)
+end
+
+function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])","")
+ if str then
+ str = gsub(str,"\\%S*","")
+ str = gsub(str,"[%s%[%](){}%$\"\']*","")
+ str = gsub(str,"(%d+)",numify) -- sort numbers properly
+ return str
+ else
+ return ""
+ end
+end
+
+local function firstofsplit(entry)
+ -- numbers are left padded by spaces
+ local split = entry.split
+ if #split > 0 then
+ split = split[1].s
+ else
+ split = split.s
+ end
+ local entry = split and split[1] or ""
+ return entry, currententries[entry] or "\000"
+end
+
+sorters.firstofsplit = firstofsplit
+
+-- beware, numbers get spaces in front
+
+function sorters.splitters.utf(str)
+ if #currentreplacements > 0 then
+ for k=1,#currentreplacements do
+ local v = currentreplacements[k]
+ str = gsub(str,v[1],v[2])
+ end
+ end
+ local s, e, m, n = { }, { }, { }, 0
+ for sc in utfcharacters(str) do -- maybe an lpeg
+ local ec, mc = currententries[sc], currentmappings[sc] or utfbyte(sc)
+ n = n + 1
+ s[n] = sc
+ e[n] = currentmappings[ec] or mc
+ m[n] = mc
+ end
+ return { s = s, e = e, m = m }
+end
+
+-- we can use one array instead (sort of like in mkii)
+-- but for the moment we do it this way as it is more
+-- handy for tracing
+
+-- function sorters.splitters.utf(str)
+-- if #currentreplacements > 0 then
+-- for k=1,#currentreplacements do
+-- local v = currentreplacements[k]
+-- str = gsub(str,v[1],v[2])
+-- end
+-- end
+-- local s, e, m, n = { }, { }, { }, 0
+-- for sc in utfcharacters(str) do -- maybe an lpeg
+-- local ec, mc = currententries[sc], currentmappings[sc] or utfbyte(sc)
+-- n = n + 1
+-- ec = currentmappings[ec] or mc
+-- s[n] = sc
+-- e[n] = ec
+-- if ec ~= mc then
+-- n = n + 1
+-- e[n] = mc
+-- end
+-- end
+-- return { s = s, e = e }
+-- end
+
+function table.remap(t)
+ local tt = { }
+ for k,v in next, t do
+ tt[v] = k
+ end
+ return tt
+end
+
+local function pack(entry)
+ local t = { }
+ local split = entry.split
+ if #split > 0 then
+ for i=1,#split do
+ local tt, li = { }, split[i].s
+ for j=1,#li do
+ local lij = li[j]
+ tt[j] = utfbyte(lij) > ignored_offset and "[]" or lij
+ end
+ t[i] = concat(tt)
+ end
+ return concat(t," + ")
+ else
+ local t, li = { }, split.s
+ for j=1,#li do
+ local lij = li[j]
+ t[j] = utfbyte(lij) > ignored_offset and "[]" or lij
+ end
+ return concat(t)
+ end
+end
+
+function sorters.sort(entries,cmp)
+ if trace_tests then
+ sort(entries,function(a,b)
+ local r = cmp(a,b)
+ logs.report("sorter","%s %s %s",pack(a),(not r and "?") or (r<0 and "<") or (r>0 and ">") or "=",pack(b))
+ return r == -1
+ end)
+ local s
+ for i=1,#entries do
+ local entry = entries[i]
+ local letter, first = firstofsplit(entry)
+ if first == s then
+ first = " "
+ else
+ s = first
+ logs.report("sorter",">> %s 0x%05X (%s 0x%05X)",first,utfbyte(first),letter,utfbyte(letter))
+ end
+ logs.report("sorter"," %s",pack(entry))
+ end
+ else
+ sort(entries,function(a,b)
+ return cmp(a,b) == -1
+ end)
+ end
+end
+
+-- some day we can have a characters.upper and characters.lower
+
+function sorters.add_uppercase_replacements(what)
+ local rep, new = replacements[what], { }
+ for i=1,#rep do
+ local r = rep[i]
+ local u = chardata[utfbyte(r[1])].uccode
+ if u then
+ new[utfchar(u)] = r[2]
+ end
+ end
+ for k, v in next, new do
+ rep[k] = v
+ end
+end
+
+function sorters.add_uppercase_entries(what)
+ local ent, new = entries[what], { }
+ for k, v in next, ent do
+ local u = chardata[utfbyte(k)].uccode
+ if u then
+ new[utfchar(u)] = v
+ end
+ end
+ for k, v in next, new do
+ ent[k] = v
+ end
+end
+
+function sorters.add_uppercase_mappings(what,offset)
+ local map, new, offset = mappings[what], { }, offset or 0
+ for k, v in next, map do
+ local u = chardata[utfbyte(k)].uccode
+ if u then
+ new[utfchar(u)] = v + offset
+ end
+ end
+ for k, v in next, new do
+ map[k] = v
+ end
+end
diff --git a/tex/context/base/sort-ini.mkii b/tex/context/base/sort-ini.mkii
new file mode 100644
index 000000000..f1ed1c316
--- /dev/null
+++ b/tex/context/base/sort-ini.mkii
@@ -0,0 +1,161 @@
+%D \module
+%D [ file=sort-ini,
+%D version=2005.08.08,
+%D title=\CONTEXT\ Sorting 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.
+
+% todo: autokeyexpansion => igv utf: \setupregister[index][keyexpansion=yes]
+
+%D This module replaces existing sort key handling and is meant to be
+%D used with the new texutil functionality. This module defines a few
+%D auxiliary macros.
+
+\writestatus{loading}{ConTeXt Sorting Macros / Initialization}
+
+%D This module replaces existing sort key handling and is meant to be
+%D used with the new texutil functionality. This module defines a few
+%D auxiliary macros.
+
+\ifx\exportsortaction\undefined \else \endinput \fi
+
+%D The sorting method is largely bases on the one used in the old version
+%D of texutil but i've changed the interface a bit. It all boils down to
+%D a bunch of substitutions. The reimplementation makes it easier to extend
+%D the rules. Currently we have multipass substitution and onepass sorting,
+%D but we may change this some day. Since there is a plugin mechanism, using
+%D an external sorter is also possible.
+
+% test file:
+%
+% \mainlanguage[sl] \readfile{sort-ini}{}{}
+%
+% \starttext
+% test \index {aa1} test \index {ab1} test \index {aa2}
+% test \index {ab2} test \index {aa10} test \index {aa8}
+% test \index {aa9} test \index {aa11} test \index {aa10}
+% test \index {cccc} test \index {\ccaron ccc} test \index {\cacute ccc}
+% test \index {caaa} test \index {\ccaron aaa} test \index {\cacute aaa}
+% \placeindex
+% \stoptext
+
+% definitions:
+%
+% \exportsortshortcut{\\\'\\i}{iacute}
+% \exportsortshortcut{\\\'i} {iacute}
+% \exportsortshortcut{\\\"e} {ediaeresis}
+% \exportsortshortcut{\\\'o} {oacute}
+%
+% \exportsortexpansion{aeligature}{ae}
+% \exportsortexpansion{ijligature}{y}
+% \exportsortexpansion{oacute} {oz}
+% \exportsortexpansion{eacute} {ezzz} % or e3
+% \exportsortexpansion{egrave} {ezz} % or e2
+% \exportsortexpansion{ediaeresis}{ez} % or e1
+% \exportsortexpansion{adiaeresis}{az}
+% \exportsortreduction{ch} {c}
+% \exportsortreduction{ij} {y}
+%
+% \exportsortexpansion{ccaron} {cz}
+% \exportsortexpansion{cacute} {czz}
+% \exportsortexpansion{dstroke} {dz}
+% \exportsortexpansion{scaron} {sz}
+% \exportsortexpansion{zcaron} {zz}
+%
+% \exportsortreduction{ch}{c}
+% \exportsortreduction{ij}{y}
+%
+% \exportsortexpansion {ccaron} {c+1}
+% \exportsortdivision {c+1} {ccaron}
+% ==
+% \exportsortrule {ccaron} {c+1}
+
+\unprotect
+
+\def\savesortkeys
+ {\ifproductionrun
+ \the\everysavesortkeys
+ \global\everysavesortkeys\emptytoks
+ \fi}
+
+\appendtoks \savesortkeys \to \everyshipout
+
+\let\currentexportclass\empty
+
+\def\exportsortaction#1#2#3%
+ {\defconvertedargument\asciia{#2}%
+ \defconvertedargument\asciib{#3}%
+ \immediatewriteutility{x #1 {\currentexportclass} {\asciia} {\asciib}}}
+
+\def\exportsortshortcut {\exportsortaction s}
+\def\exportsortexpansion{\exportsortaction e}
+\def\exportsortreduction{\exportsortaction r}
+\def\exportsortdivision {\exportsortaction d}
+
+\def\exportsortrule#1#2%
+ {\exportsortexpansion{#1}{#2}%
+ \exportsortdivision {#2}{#1}}
+
+\def\exportutfsortexpansion#1#2#3%
+ {\bgroup
+ \edef\utfsorta{\string\unknownchar}%
+ \dostepwiserecurse{#2}{#3}\plusone
+ {\edef\utfsortb{\@EA\string\csname\doutfunihash{#1}{\recurselevel}\endcsname}%
+ \ifx\utfsortb\utfsorta \else
+ \edef\utfsortc{\numbertoutf{\numexpr#1*256+\recurselevel\relax}}%
+ \expanded{\exportsortshortcut{\utfsortc}{\utfsortb\space}}% space is really needed
+ \fi}%
+ \egroup}
+
+\def\savesortdefinitions
+ {\bgroup
+ \doifelse \currentregime {utf}
+ {\exportutfsortexpansion{0}{128}{255}%
+ \exportutfsortexpansion{1}{0}{255}}
+ {\def\defineactivecharacter##1 ##2% mkii code !
+ {\doifnumberelse{##1}
+ {\expanded{\exportsortshortcut{\rawcharacter{##1}}}{##2}}%
+ {\expanded{\exportsortshortcut{\rawcharacter{\number`##1}}}{##2}}}%
+ \doifelsenothing\currentregime
+ {\doifnot\characterencoding\nocharacterencoding % to be sure, autoregime
+ {\dowalkregime\characterencoding}}%
+ {\dowalkregime\characterencoding}}%
+ \egroup
+ \startnointerference
+ \setcatcodetable\ctxcatcodes
+ \readsysfile{\f!sortprefix def.mkii}\donothing\donothing % default
+ \stopnointerference
+ \global\let\savesortdefinitions\relax}
+
+\def\savesortlanguage#1% language specifics
+ {\doifsomething{#1}
+ {\doifundefined{\f!sortprefix::#1}%
+ {\startnointerference
+ \global\letvalue{\f!sortprefix::#1}\empty
+ \def\currentexportclass{#1}%
+ \enablemode[sortorder-#1]%
+ \setcatcodetable\ctxcatcodes
+ \readsysfile{\f!sortprefix lan.mkii}\donothing\donothing
+ \stopnointerference}}}
+
+\prependtoks
+ \savesortdefinitions
+\to \everysavesortkeys
+
+% \defineregister[one]
+% \defineregister[two] \setupregister[two][language=cz]
+%
+% \starttext
+% test \one{one} test \one{two} test \one {\aacute} test \one{alpha} test \one{chow}
+% test \two{one} test \two{two} test \two {\aacute} test \two{alpha} test \two{chow}
+% \blank[3*big] \placeregister[one]
+% \blank[3*big] \placeregister[two]
+% \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/sort-ini.mkiv b/tex/context/base/sort-ini.mkiv
new file mode 100644
index 000000000..a4dc2f6ba
--- /dev/null
+++ b/tex/context/base/sort-ini.mkiv
@@ -0,0 +1,19 @@
+%D \module
+%D [ file=sort-ini,
+%D version=2005.08.08,
+%D title=\CONTEXT\ Sort 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 Sorting Macros / Initialization}
+
+\registerctxluafile{sort-ini}{1.001}
+\registerctxluafile{sort-lan}{1.001}
+
+\endinput
diff --git a/tex/context/base/sort-lan.lua b/tex/context/base/sort-lan.lua
new file mode 100644
index 000000000..ed7e8ba35
--- /dev/null
+++ b/tex/context/base/sort-lan.lua
@@ -0,0 +1,319 @@
+if not modules then modules = { } end modules ['sort-lan'] = {
+ version = 1.001,
+ comment = "companion to sort-lan.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this is a rather preliminary and incomplete file
+-- maybe we should load this kind of stuff runtime
+
+-- replacements are indexed as they need to be applied in sequence
+
+local utf = unicode.utf8
+local uc = utf.char
+local ub = utf.byte
+
+local mappings = sorters.mappings
+local entries = sorters.entries
+local replacements = sorters.replacements
+
+local add_uppercase_replacements = sorters.add_uppercase_replacements
+local add_uppercase_entries = sorters.add_uppercase_entries
+local add_uppercase_mappings = sorters.add_uppercase_mappings
+
+local replacement_offset = sorters.replacement_offset
+
+-- english
+
+entries['en'] = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
+ ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["z"] = "z",
+ ["A"] = "a", ["B"] = "b", ["C"] = "c", ["D"] = "d", ["E"] = "e",
+ ["F"] = "f", ["G"] = "g", ["H"] = "h", ["I"] = "i", ["J"] = "j",
+ ["K"] = "k", ["L"] = "l", ["M"] = "m", ["N"] = "n", ["O"] = "o",
+ ["P"] = "p", ["Q"] = "q", ["R"] = "r", ["S"] = "s", ["T"] = "t",
+ ["U"] = "u", ["V"] = "v", ["W"] = "w", ["X"] = "x", ["Y"] = "y",
+ ["Z"] = "z",
+}
+
+mappings['en'] = {
+ ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9,
+ ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19,
+ ["k"] = 21, ["l"] = 23, ["m"] = 25, ["n"] = 27, ["o"] = 29,
+ ["p"] = 31, ["q"] = 33, ["r"] = 35, ["s"] = 37, ["t"] = 39,
+ ["u"] = 41, ["v"] = 43, ["w"] = 45, ["x"] = 47, ["y"] = 49,
+ ["z"] = 51,
+ ["A"] = 1, ["B"] = 3, ["C"] = 5, ["D"] = 7, ["E"] = 9,
+ ["F"] = 11, ["G"] = 13, ["H"] = 15, ["I"] = 17, ["J"] = 19,
+ ["K"] = 21, ["L"] = 23, ["M"] = 25, ["N"] = 27, ["O"] = 29,
+ ["P"] = 31, ["Q"] = 33, ["R"] = 35, ["S"] = 37, ["T"] = 39,
+ ["U"] = 41, ["V"] = 43, ["W"] = 45, ["X"] = 47, ["Y"] = 49,
+ ["Z"] = 51,
+ --
+ -- uppercase after lowercase
+ --
+ -- ["A"] = 2, ["B"] = 4, ["C"] = 6, ["D"] = 8, ["E"] = 10,
+ -- ["F"] = 12, ["G"] = 14, ["H"] = 16, ["I"] = 18, ["J"] = 20,
+ -- ["K"] = 22, ["L"] = 24, ["M"] = 26, ["N"] = 28, ["O"] = 30,
+ -- ["P"] = 32, ["Q"] = 34, ["R"] = 36, ["S"] = 38, ["T"] = 40,
+ -- ["U"] = 42, ["V"] = 44, ["W"] = 46, ["X"] = 48, ["Y"] = 50,
+ -- ["Z"] = 52,
+}
+
+-- dutch
+
+replacements['nl'] = { { "ij", 'y' }, { "IJ", 'Y' } }
+entries ['nl'] = entries ['en']
+mappings ['nl'] = mappings['en']
+
+-- czech
+
+local cz_ch = uc(replacement_offset + 1)
+local cz_CH = uc(replacement_offset + 2)
+
+replacements['cz'] = {
+ [1] = { "ch", cz_ch }
+}
+
+entries['cz'] = {
+ ['a'] = "a", -- a
+ [uc(0x00E1)] = "a", -- aacute
+ ['b'] = "b", -- b
+ ['c'] = "c", -- c
+ [uc(0x010D)] = uc(0x010D), -- ccaron
+ ['d'] = "d", -- d
+ [uc(0x010F)] = "d", -- dcaron
+ ['e'] = "e", -- e
+ [uc(0x00E9)] = "e", -- eacute
+ [uc(0x011B)] = "e", -- ecaron
+ ['f'] = "f", -- f
+ ['g'] = "g", -- g
+ ['h'] = "h", -- h
+ [cz_ch] = "ch", -- ch
+ ['i'] = "i", -- i
+ [uc(0x00ED)] = "i", -- iacute
+ ['j'] = "j", -- j
+ ['k'] = "k", -- k
+ ['l'] = "l", -- l
+ ['m'] = "m", -- m
+ ['n'] = "n", -- n
+ ['ň'] = "n", -- ncaron
+ ['o'] = "o", -- o
+ ['p'] = "p", -- p
+ ['q'] = "q", -- q
+ ['r'] = "r", -- r
+ ['ř'] = "ř", -- rcaron
+ ['s'] = "s", -- s
+ [uc(0x0161)] = uc(0x0161), -- scaron
+ ['t'] = "t", -- t
+ [uc(0x0165)] = "t", -- tcaron
+ ['u'] = "u", -- u
+ [uc(0x00FA)] = "u", -- uacute
+ [uc(0x016F)] = "u", -- uring
+ ['v'] = "v", -- v
+ ['w'] = "w", -- w
+ ['x'] = "x", -- x
+ ['y'] = "y", -- y
+ [uc(0x00FD)] = "y", -- yacute
+ ['z'] = "z", -- z
+ [uc(0x017E)] = uc(0x017E), -- zcaron
+}
+
+mappings['cz'] = {
+ ['a'] = 1, -- a
+ [uc(0x00E1)] = 3, -- aacute
+ ['b'] = 5, -- b
+ ['c'] = 7, -- c
+ [uc(0x010D)] = 9, -- ccaron
+ ['d'] = 11, -- d
+ [uc(0x010F)] = 13, -- dcaron
+ ['e'] = 15, -- e
+ [uc(0x00E9)] = 17, -- eacute
+ [uc(0x011B)] = 19, -- ecaron
+ ['f'] = 21, -- f
+ ['g'] = 23, -- g
+ ['h'] = 25, -- h
+ [cz_ch] = 27, -- ch
+ ['i'] = 29, -- i
+ [uc(0x00ED)] = 31, -- iacute
+ ['j'] = 33, -- j
+ ['k'] = 35, -- k
+ ['l'] = 37, -- l
+ ['m'] = 39, -- m
+ ['n'] = 41, -- n
+ ['ň'] = 43, -- ncaron
+ ['o'] = 45, -- o
+ ['p'] = 47, -- p
+ ['q'] = 49, -- q
+ ['r'] = 51, -- r
+ ['ř'] = 53, -- rcaron
+ ['s'] = 55, -- s
+ [uc(0x0161)] = 57, -- scaron
+ ['t'] = 59, -- t
+ [uc(0x0165)] = 61, -- tcaron
+ ['u'] = 63, -- u
+ [uc(0x00FA)] = 65, -- uacute
+ [uc(0x016F)] = 67, -- uring
+ ['v'] = 69, -- v
+ ['w'] = 71, -- w
+ ['x'] = 73, -- x
+ ['y'] = 75, -- y
+ [uc(0x00FD)] = 77, -- yacute
+ ['z'] = 79, -- z
+ [uc(0x017E)] = 81, -- zcaron
+}
+
+add_uppercase_entries ("cz")
+add_uppercase_mappings("cz") -- 1 can be option (but then we need a runtime variant)
+
+entries ['cz'][cz_CH] = entries ['cz'][cz_ch]
+mappings['cz'][cz_CH] = mappings['cz'][cz_ch]
+
+replacements['cs'] = replacements['cz']
+entries ['cs'] = entries ['cz']
+mappings ['cs'] = mappings ['cz']
+
+--~ print(table.serialize(mappings.cs))
+
+-- French
+
+entries ['fr'] = entries ['en']
+mappings['fr'] = mappings['en']
+
+-- German (by Wolfgang Schuster)
+
+-- DIN 5007-1
+
+entries ['DIN 5007-1'] = entries ['en']
+mappings ['DIN 5007-1'] = mappings['en']
+
+-- DIN 5007-2
+
+replacements['DIN 5007-2'] = { -- todo: add_uppercase_replacements
+ { "ä", 'ae' },
+ { "ö", 'oe' },
+ { "ü", 'ue' },
+ { "Ä", 'Ae' },
+ { "Ö", 'Oe' },
+ { "Ü", 'Ue' },
+}
+
+--~ add_uppercase_replacements('DIN 5007-2')
+
+entries ['DIN 5007-2'] = entries ['en']
+mappings ['DIN 5007-2'] = mappings['en']
+
+-- Duden
+
+replacements['Duden'] = { { "ß", 's' } }
+entries ['Duden'] = entries ['en']
+mappings ['Duden'] = mappings['en']
+
+-- new german
+
+entries ['de'] = entries ['en']
+mappings ['de'] = mappings['en']
+
+-- old german
+
+entries ['deo'] = entries ['de']
+mappings ['deo'] = mappings['de']
+
+-- german - Germany
+
+entries ['de-DE'] = entries ['de']
+mappings ['de-DE'] = mappings['de']
+
+-- german - Swiss
+
+entries ['de-CH'] = entries ['de']
+mappings ['de-CH'] = mappings['de']
+
+-- german - Austria
+
+entries['de-AT'] = {
+ ["a"] = "a", ["ä"] = "ä", ["b"] = "b", ["c"] = "c", ["d"] = "d",
+ ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i",
+ ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n",
+ ["o"] = "o", ["ö"] = "ö", ["p"] = "p", ["q"] = "q", ["r"] = "r",
+ ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ü"] = "ü", ["v"] = "v",
+ ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
+-- ["A"] = "a", ["Ä"] = "ä", ["B"] = "b", ["C"] = "c", ["D"] = "d",
+-- ["E"] = "e", ["F"] = "f", ["G"] = "g", ["H"] = "h", ["I"] = "i",
+-- ["J"] = "j", ["K"] = "k", ["L"] = "l", ["M"] = "m", ["N"] = "n",
+-- ["O"] = "o", ["Ö"] = "ö", ["P"] = "p", ["Q"] = "q", ["R"] = "r",
+-- ["S"] = "s", ["T"] = "t", ["U"] = "u", ["Ü"] = "ü", ["V"] = "v",
+-- ["W"] = "w", ["X"] = "x", ["Y"] = "y", ["Z"] = "z",
+}
+
+mappings['de-AT'] = {
+ ["a"] = 1, ["ä"] = 3, ["b"] = 5, ["c"] = 7, ["d"] = 9,
+ ["e"] = 11, ["f"] = 13, ["g"] = 15, ["h"] = 17, ["i"] = 19,
+ ["j"] = 21, ["k"] = 23, ["l"] = 25, ["m"] = 27, ["n"] = 29,
+ ["o"] = 31, ["ö"] = 33, ["p"] = 35, ["q"] = 37, ["r"] = 39,
+ ["s"] = 41, ["t"] = 43, ["u"] = 45, ["ü"] = 47, ["v"] = 49,
+ ["w"] = 51, ["x"] = 53, ["y"] = 55, ["z"] = 57,
+-- ["A"] = 2, ["Ä"] = 4, ["B"] = 6, ["C"] = 8, ["D"] = 10,
+-- ["E"] = 12, ["F"] = 14, ["G"] = 16, ["H"] = 18, ["I"] = 20,
+-- ["J"] = 22, ["K"] = 24, ["L"] = 26, ["M"] = 28, ["N"] = 30,
+-- ["O"] = 32, ["Ö"] = 34, ["P"] = 36, ["Q"] = 38, ["R"] = 40,
+-- ["S"] = 42, ["T"] = 44, ["U"] = 46, ["Ü"] = 48, ["V"] = 50,
+-- ["W"] = 52, ["X"] = 54, ["Y"] = 56, ["Z"] = 58,
+}
+
+add_uppercase_entries ('de-AT')
+add_uppercase_mappings('de-AT',1)
+
+-- finish (by Wolfgang Schuster)
+
+entries['fi'] = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
+ ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["z"] = "z", ["å"] = "å", ["ä"] = "ä", ["ö"] = "ö",
+}
+
+mappings['fi'] = {
+ ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9,
+ ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19,
+ ["k"] = 21, ["l"] = 23, ["m"] = 25, ["n"] = 27, ["o"] = 29,
+ ["p"] = 31, ["q"] = 33, ["r"] = 35, ["s"] = 37, ["t"] = 39,
+ ["u"] = 41, ["v"] = 43, ["w"] = 45, ["x"] = 47, ["y"] = 49,
+ ["z"] = 51, ["å"] = 53, ["ä"] = 55, ["ö"] = 57,
+}
+
+add_uppercase_entries ("fi")
+add_uppercase_mappings("fi")
+
+-- slovenian
+--
+-- MM: this will change since we need to add accented vowels
+
+entries['sl'] = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["č"] = "č", ["ć"] = "ć", ["d"] = "d",
+ ["đ"] = "đ", ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i",
+ ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["š"] = "š", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
+ ["ž"] = "ž",
+}
+
+mappings['sl'] = {
+ ["a"] = 1, ["b"] = 3, ["c"] = 5, ["č"] = 7, ["ć"] = 9, ["d"] = 11,
+ ["đ"] = 13, ["e"] = 15, ["f"] = 17, ["g"] = 19, ["h"] = 21, ["i"] = 23,
+ ["j"] = 25, ["k"] = 27, ["l"] = 29, ["m"] = 31, ["n"] = 33, ["o"] = 35,
+ ["p"] = 37, ["q"] = 39, ["r"] = 41, ["s"] = 43, ["š"] = 45, ["t"] = 47,
+ ["u"] = 49, ["v"] = 51, ["w"] = 53, ["x"] = 55, ["y"] = 57, ["z"] = 59,
+ ["ž"] = 61,
+}
+
+add_uppercase_entries ("sl")
+add_uppercase_mappings("sl") -- cf. MM
diff --git a/tex/context/base/sort-lan.mkii b/tex/context/base/sort-lan.mkii
new file mode 100644
index 000000000..db52c63fb
--- /dev/null
+++ b/tex/context/base/sort-lan.mkii
@@ -0,0 +1,217 @@
+%D \module
+%D [ file=sort-lan,
+%D version=2005.08.08,
+%D title=\CONTEXT\ Sort Macros,
+%D subtitle=Language 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.
+
+% for testing:
+
+\startmode[sortorder-en]
+ \exportsortexpansion{aacute}{a+1}
+ \exportsortexpansion{Aacute}{A+2}
+ \exportsortexpansion{agrave}{a+1}
+ \exportsortexpansion{Agrave}{A+2}
+\stopmode
+
+%D This module replaces existing sort key handling and is meant to be
+%D used with the new texutil functionality. Here we define the language
+%D specific sort rules.
+
+% slovenian
+%
+% a-c, ccaron, cacute, d, dstroke, e-s, scaron, t-z, zcaron
+
+% \enableregime[utf]
+% \mainlanguage[sl]
+% \starttext
+% \ccaron\index{\ccaron\space 1}
+% \Ccaron\index{\Ccaron\space 1}
+% č\index{č 2}
+% Č\index{Č 2}
+% \v c\index{\v c 3}
+% \v C\index{\v C 3}
+% \placeindex
+% \stoptext
+
+% \startmode[sortorder-sl]
+% \exportsortexpansion {ccaron} {cz}
+% \exportsortexpansion {cacute} {czz}
+% \exportsortexpansion {dstroke} {dz}
+% \exportsortexpansion {scaron} {sz}
+% \exportsortexpansion {zcaron} {zz}
+
+% \exportsortdivision {cz} {ccaron}
+% \exportsortdivision {czz} {cacute}
+% \exportsortdivision {dz} {dstroke}
+% \exportsortdivision {sz} {scaron}
+% \exportsortdivision {zz} {zcaron}
+% \stopmode
+%
+% \startmode[sortorder-sl]
+% \exportsortexpansion {ccaron} {c+1}
+% \exportsortexpansion {cacute} {c+2}
+% \exportsortexpansion {dstroke} {d+1}
+% \exportsortexpansion {scaron} {s+1}
+% \exportsortexpansion {zcaron} {z+1}
+%
+% \exportsortdivision {c+1} {ccaron}
+% \exportsortdivision {c+2} {cacute}
+% \exportsortdivision {d+1} {dstroke}
+% \exportsortdivision {s+1} {scaron}
+% \exportsortdivision {z+1} {zcaron}
+% \stopmode
+
+\startmode[sortorder-sl]
+ \exportsortrule {ccaron} {c+1}
+ \exportsortrule {cacute} {c+2}
+ \exportsortrule {dstroke} {d+1}
+ \exportsortrule {scaron} {s+1}
+ \exportsortrule {zcaron} {z+1}
+\stopmode
+
+% finnish
+%
+% a-u, v+w sorted together, x-z, aring, adiaeresis, odiaeresis
+
+\startmode[sortorder-fi]
+ \exportsortrule {v} {w}
+ \exportsortrule {aring} {z+1}
+ \exportsortrule {adiaeresis} {z+2}
+ \exportsortrule {odiaeresis} {z+3}
+\stopmode
+
+% swedish
+%
+% a-z, aring, adiaeresis, odiaeresis
+
+% \mainlanguage[sv]
+% \starttext
+% a\index{a}
+% a\index{a}
+% z\index{z}
+% z\index{z}
+% q\index{q}
+% q\index{q}
+% \index{}
+% \index{}
+% \index{}
+% \index{}
+% \index{}
+% \index{}
+% \index{}
+% \index{}
+% \index{}
+% \aring\index{\aring}
+% \adiaeresis\index{\adiaeresis}
+% \odiaeresis\index{\odiaeresis}
+% A\index{A}
+% \index{}
+% \index{}
+% \index{}
+% \Aring\index{\Aring}
+% \Adiaeresis\index{\Adiaeresis}
+% \Odiaeresis\index{\Odiaeresis}
+% \placeindex
+% \stoptext
+
+\startmode[sortorder-sv]
+ \exportsortrule {aring} {z+1}
+ \exportsortrule {adiaeresis} {z+2}
+ \exportsortrule {odiaeresis} {z+3}
+\stopmode
+
+% norwegian, danish
+%
+% a-z, aeligature, oslash, aring
+
+\startmode[sortorder-no,sortorder-da]
+ \exportsortrule {aeligature} {z+1}
+ \exportsortrule {oslash} {z+2}
+ \exportsortrule {aring} {z+3}
+\stopmode
+
+% islandic
+%
+% a, aacute, b, c, d, eth, e, eacute, f-i, iacute, j-o, oacute, p-u, uacute, v, w (?), x, y, yacute, z, aeligature, oslash, thorn
+
+% estonian
+%
+% a-s, scaron, z, zcaron, t-w, otilde, adiaeresis, odiaeresis, udiaeresis, x, y
+
+% czech
+%
+% a) make a single group for: "a", "", "A", ""
+% b) make a different two groups for: "c", "C" and "c", "C"
+% c) sorting rule: "A" < "" < "a" < "" < "C" < "c" < "C" < "c"
+% d) sorting rule: "h" < "ch" < "i" ("c" < "h")
+
+\gdef\czsortdivisionch{ch}
+\gdef\czsortdivisionCh{Ch}
+
+\startmode[sortorder-cz]
+ \exportsortexpansion {aacute} {a}
+ \exportsortexpansion {Aacute} {A}
+ \exportsortexpansion {ccaron} {c+1}
+ \exportsortexpansion {Ccaron} {C+1}
+ \exportsortdivision {c+1} {ccaron}
+ \exportsortexpansion {dcaron} {d}
+ \exportsortexpansion {Dcaron} {D}
+ %\exportsortdivision {d+1} {dcaron}
+ \exportsortexpansion {eacute} {e}
+ \exportsortexpansion {Eacute} {E}
+ \exportsortexpansion {ecaron} {e}
+ \exportsortexpansion {Ecaron} {E}
+ \exportsortreduction {ch} {h+1}
+ \exportsortexpansion {ch} {h+1}
+ \exportsortreduction {Ch} {H+1}
+ \exportsortexpansion {Ch} {H+1}
+ \exportsortdivision {h+1} {czsortdivisionch}
+ \exportsortexpansion {iacute} {i}
+ \exportsortexpansion {Iacute} {I}
+ \exportsortexpansion {ncaron} {n}
+ \exportsortexpansion {Ncaron} {N}
+ %\exportsortdivision {n+1} {ncaron}
+ \exportsortexpansion {oacute} {o}
+ \exportsortexpansion {Oacute} {O}
+ \exportsortexpansion {rcaron} {r+1}
+ \exportsortexpansion {Rcaron} {R+1}
+ \exportsortdivision {r+1} {rcaron}
+ \exportsortexpansion {scaron} {s+1}
+ \exportsortexpansion {Scaron} {S+1}
+ \exportsortdivision {s+1} {scaron}
+ \exportsortexpansion {tcaron} {t}
+ \exportsortexpansion {Tcaron} {T}
+ %\exportsortdivision {t+1} {tcaron}
+ \exportsortexpansion {uacute} {u}
+ \exportsortexpansion {Uacute} {U}
+ \exportsortexpansion {uring} {u}
+ \exportsortexpansion {Uring} {U}
+ \exportsortexpansion {yacute} {y}
+ \exportsortexpansion {Yacute} {Y}
+ \exportsortexpansion {zcaron} {z+1}
+ \exportsortexpansion {Zcaron} {Z+1}
+ \exportsortdivision {z+1} {zcaron}
+\stopmode
+
+% Polish:
+
+\startmode[sortorder-pl]
+ \exportsortrule {aogonek} {a+1}
+ \exportsortrule {cacute} {c+1}
+ \exportsortrule {eogonek} {e+1}
+ \exportsortrule {lstroke} {l+1}
+ \exportsortrule {nacute} {n+1}
+ \exportsortrule {oacute} {o+1}
+ \exportsortrule {sacute} {s+1}
+ \exportsortrule {zacute} {z+1}
+ \exportsortrule {zdotaccent} {z+2}
+\stopmode
+
+\endinput
diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv
new file mode 100644
index 000000000..b168a02be
--- /dev/null
+++ b/tex/context/base/spac-ali.mkiv
@@ -0,0 +1,677 @@
+%D \module
+%D [ file=spac-ali,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Alignments,
+%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 Spacing Macros / Alignments}
+
+\unprotect
+
+% We will not use bodydir and pagedir so we disable them. That way we get
+% normal hyperlink support.
+
+\let\@@bodydir\normalbodydir
+\let\@@pagedir\normalpagedir
+
+\unexpanded\def\bodydir{\afterassignment\do@@bodydir\@@bodydir} \let\normalbodydir\bodydir
+\unexpanded\def\pagedir{\afterassignment\do@@pagedir\@@pagedir} \let\normalpagedir\pagedir
+
+\def\do@@bodydir{\@@bodydir TLT\relax}
+\def\do@@pagedir{\@@pagedir TLT\relax}
+
+% This will become a more advanced layout controller soon:
+
+\newconditional\layoutlefttoright \settrue\layoutlefttoright
+\newconditional\displaylefttoright \settrue\displaylefttoright
+\newconditional\inlinelefttoright \settrue\inlinelefttoright
+
+\unexpanded\def\lefttoright
+ {\ifvmode
+ \settrue\displaylefttoright
+ \settrue\inlinelefttoright
+ \textdir TLT\relax
+ \pardir TLT\relax
+ \else
+ \settrue\inlinelefttoright
+ \textdir TLT\relax
+ \fi}
+
+\unexpanded\def\righttoleft
+ {\ifvmode
+ \setfalse\displaylefttoright
+ \setfalse\inlinelefttoright
+ \textdir TRT\relax
+ \pardir TRT\relax
+ \else
+ \textdir TRT\relax
+ \setfalse\inlinelefttoright
+ \fi}
+
+\def\currentdirectionparameters
+ {\ifconditional\inlinelefttoright \else
+ idir="r2l",
+ \fi
+ \ifconditional\displaylefttoright \else
+ ddir="r2l",
+ \fi}
+
+\def\dodefinehbox[#1][#2]%
+ {\setvalue{hbox#1}##1{\hbox to #2{\begstrut##1\endstrut\hss}}}
+
+\unexpanded\def\definehbox
+ {\dodoubleargument\dodefinehbox}
+
+\def\iobox#1#2#3#% here #3# is not really needed
+ {\vbox\bgroup % we want to return a vbox like the others
+ \hbox\bgroup% we need to pack the signal with the box
+ \signalrightpage
+ \dowithnextboxcontent
+ {\let\\=\endgraf\forgetall\doifrightpageelse#1#2}
+ {\box\nextbox\egroup\egroup}
+ \vbox#3}
+
+\def\obox{\iobox\raggedleft \raggedright} % outerbox
+\def\ibox{\iobox\raggedright\raggedleft} % innerbox
+
+\def\dosetraggedvbox#1%
+ {\let\raggedbox\vbox
+ \processfirstactioninset
+ [#1]
+ [ \v!left=>\let\raggedbox\lbox,
+ \v!right=>\let\raggedbox\rbox,
+ \v!middle=>\let\raggedbox\cbox,
+ \v!inner=>\let\raggedbox\ibox,
+ \v!outer=>\let\raggedbox\obox,
+ \v!flushleft=>\let\raggedbox\rbox,
+ \v!flushright=>\let\raggedbox\lbox,
+ \v!center=>\let\raggedbox\cbox,
+ \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]}
+
+\def\dosetraggedhbox#1%
+ {\let\raggedbox\hbox
+ \processaction % slow
+ [#1]
+ [ \v!left=>\def\raggedbox{\doalignedline\v!left },
+ \v!right=>\def\raggedbox{\doalignedline\v!right },
+ \v!middle=>\def\raggedbox{\doalignedline\v!middle},
+ \v!inner=>\def\raggedbox{\doalignedline\v!inner },
+ \v!outer=>\def\raggedbox{\doalignedline\v!outer },
+ \v!flushleft=>\def\raggedbox{\doalignedline\v!right },
+ \v!flushright=>\def\raggedbox{\doalignedline\v!left },
+ \v!center=>\def\raggedbox{\doalignedline\v!middle}]}
+
+\def\dosetraggedcommand#1%
+ {\normalexpanded{\noexpand\dodosetraggedcommand{#1}}}
+
+\newtoks\everyraggedcommand
+
+\def\raggedcommand{\the\everyraggedcommand}
+
+\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that!
+ {\everyraggedcommand\emptytoks
+ \let\raggedtopcommand\empty
+ \let\raggedbottomcommand\empty
+ \chardef\raggedoneliner\zerocount
+ \doifsomething{#1}
+ {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse
+ \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse
+ \!!donectrue
+ \rawprocesscommalist[#1]\dododosetraggedcommand}}
+
+\def\dododosetraggedcommand#1%
+ {\executeifdefined{\@@ragged@@command\string#1}\relax}
+
+\def\@@ragged@@command{@@raggedcommand}
+
+\setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nohz }{\appendtoks\disableadjusting \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!spacing }{\appendtoks\enablespacehandling
+ \enablekernhandling \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nospacing }{\appendtoks\disablespacehandling
+ \disablekernhandling \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!hyphenated }{\appendtoks\dohyphens \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nothyphenated}{\appendtoks\nohyphens \to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!tolerant }{\appendtoks\tolerance3000\relax \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!verytolerant}{\appendtoks\tolerance4500\relax \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!stretch }{\appendtoks\emergencystretch\bodyfontsize\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!left}%
+ {\if!!donea \appendtoks\veryraggedleft\to\everyraggedcommand
+ \else \appendtoks\raggedleft \to\everyraggedcommand
+ \fi
+ \!!donecfalse}
+
+\setvalue{\@@ragged@@command\v!right}%
+ {\if!!donea \appendtoks\veryraggedright\to\everyraggedcommand
+ \else \appendtoks\raggedright \to\everyraggedcommand
+ \fi
+ \!!donecfalse}
+
+\setvalue{\@@ragged@@command\v!middle}%
+ {\if!!donec
+ \if!!doneb \appendtoks\raggedwidecenter\to\everyraggedcommand
+ \else\if!!donea \appendtoks\veryraggedcenter\to\everyraggedcommand
+ \else \appendtoks\raggedcenter \to\everyraggedcommand
+ \fi\fi
+ \!!donecfalse
+ \else
+ \let\raggedbottomcommand\vfilll % bonus, pretty strong
+ \let\raggedtopcommand \vfilll % used with \framed for
+ \fi} % instance in tables
+
+\setvalue{\@@ragged@@command\v!flushleft }{\getvalue{\@@ragged@@command\v!right }}
+\setvalue{\@@ragged@@command\v!flushright}{\getvalue{\@@ragged@@command\v!left }}
+\setvalue{\@@ragged@@command\v!center }{\getvalue{\@@ragged@@command\v!middle}}
+
+\setvalue{\@@ragged@@command\v!high}%
+ {\let\raggedbottomcommand\vfilll} % and since we lack a
+
+\setvalue{\@@ragged@@command\v!low}%
+ {\let\raggedtopcommand\vfilll} % proper keyword, but
+
+\setvalue{\@@ragged@@command\v!lohi}%
+ {\let\raggedbottomcommand\vfilll % we do support the
+ \let\raggedtopcommand\vfilll} % ugly laho (lohi)
+
+\setvalue{\@@ragged@@command\v!no}%
+ {\appendtoks\raggedright\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!yes}%
+ {\appendtoks\notragged\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!normal}%
+ {\appendtoks\notragged\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!inner}% not yet perfect
+ {\signalrightpage % may interfere
+ \doifrightpageelse
+ {\getvalue{\@@ragged@@command\v!right}}
+ {\getvalue{\@@ragged@@command\v!left}}}
+
+\setvalue{\@@ragged@@command\v!outer}% not yet perfect
+ {\signalrightpage % may interfere
+ \doifrightpageelse
+ {\getvalue{\@@ragged@@command\v!left}}
+ {\getvalue{\@@ragged@@command\v!right}}}
+
+\setvalue{\@@ragged@@command\v!lesshyphenation}%
+ {\appendtoks\lesshyphens\to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!morehyphenation}%
+ {\appendtoks\morehyphens\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!lefttoright}{\appendtoks\lefttoright\to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!righttoleft}{\appendtoks\righttoleft\to\everyraggedcommand}
+\setvalue{\@@ragged@@command l2r}{\appendtoks\lefttoright\to\everyraggedcommand}
+\setvalue{\@@ragged@@command r2l}{\appendtoks\righttoleft\to\everyraggedcommand}
+
+% compare:
+%
+% \framed[width=4cm,align=no] {\hfil xxx}
+% \framed[width=4cm,align=disable]{\hfil xxx}
+
+\setvalue{\@@ragged@@command\v!disable}% for one liners
+ {\appendtoks\raggedright\parfillskip\zeropoint\to\everyraggedcommand}
+
+\chardef\raggedoneliner\zerocount
+
+\setvalue{\@@ragged@@command\v!line}%
+ {\chardef\raggedoneliner\plusone}
+
+% More alignments:
+
+% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness
+% \tolerance >= 1500 % was 200
+% \raggedness = 2 .. 6\bodyfontsize
+
+\chardef\raggedstatus=0 % normal left center right
+
+\def\leftraggedness {2\bodyfontsize}
+\def\rightraggedness {2\bodyfontsize}
+\def\middleraggedness {6\bodyfontsize}
+
+\def\middleraggedness {.5\hsize} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{}
+
+% oeps, hsize can be 0pt in which case we get a strange division
+
+\def\middleraggedness {\ifdim\hsize=\zeropoint6\bodyfontsize\else.5\hsize\fi} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{}
+
+%D More hyphenation control, will be combined with align
+%D setup.
+
+\def\nohyphens
+ {\ifx\dohyphens\relax
+ \edef\dohyphens
+ {\hyphenpenalty\the\hyphenpenalty
+ \exhyphenpenalty\the\exhyphenpenalty\relax}%
+ \fi
+ \hyphenpenalty\plustenthousand
+ \exhyphenpenalty\plustenthousand}
+
+\let\dohyphens\relax
+
+%D To prevent unwanted side effects, we also have to check
+%D for hyphens here:
+
+\newskip\@@raggedskipa
+\newskip\@@raggedskipb
+
+\def\setraggedness#1%
+ {\ifnum\tolerance<1500\relax % small values have
+ \tolerance1500\relax % unwanted side effects
+ \fi
+ \ifx\dohyphens\relax
+ % this code will be reconsidered / kind of fuzzy (and old)
+ \@@raggedskipa 2.5\hsize
+ \@@raggedskipb #1\relax
+ \divide\@@raggedskipa \@@raggedskipb
+ \hyphenpenalty\@@raggedskipa
+ \fi}
+
+\let\updateraggedskips\relax
+
+\def\setraggedskips#1#2#3#4#5#6#7% never change this name
+ {\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}%
+ \updateraggedskips}
+
+\def\dosetraggedskips#1#2#3#4#5#6#7%
+ {\chardef \raggedstatus#1\relax
+ \leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3
+ \rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3
+ \spaceskip #4\relax
+ \xspaceskip #5\relax
+ \parfillskip\zeropoint\!!plus#6\relax
+ \parindent #7\relax}
+
+% \def\notragged%
+% {\setraggedskips{0}{0em}{0em}{0em}{0em}{1fil}{\parindent}}
+
+% older (context) names:
+
+\let\spaceamount \interwordspace
+\let\emspaceamount\emwidth
+
+% tracing:
+
+\def\doshowpardata#1%
+ {\ifx#1\relax\else
+ \hbox{\string#1: \the#1}\endgraf
+ \expandafter\doshowpardata
+ \fi}
+
+\def\showpardata
+ {\edef\thepardata
+ {\hbox{font: \fontname\font}\endgraf
+ \doshowpardata
+ \interwordspace \interwordstretch \interwordshrink \emwidth \exheight \extraspace
+ \hsize \vsize
+ \leftskip \rightskip
+ \spaceskip \xspaceskip
+ \parindent \parfillskip
+ \hyphenpenalty \exhyphenpenalty
+ \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty
+ \doublehyphendemerits \finalhyphendemerits \adjdemerits
+ \relax}%
+ \begingroup
+ \dontshowcomposition
+ \inleftmargin{\vsmash
+ {\switchtobodyfont[7pt,tt]%
+ \framed[\c!align=\v!right]{\thepardata}}}%
+ \endgroup}
+
+\unexpanded\def\startshowpardata
+ {\begingroup
+ \showcomposition
+ \showstruts\tracepositionstrue \tracingparagraphs\maxdimen
+ \appendtoksonce\showpardata\let\showpardata\relax\to\everypar}
+
+\unexpanded\def\stopshowpardata
+ {\endgraf
+ \endgroup}
+
+% defaults
+
+\def\raggedfillamount {1fil}
+\def\raggedhalffillamount{.5fil}
+\def\raggedspaceamount {\interwordspace} % {.3333em}
+\def\raggedxspaceamount {.5em}
+
+\unexpanded\def\notragged
+ {\chardef\raggedstatus\zerocount
+ \leftskip 1\leftskip
+ \rightskip 1\rightskip
+ \spaceskip \zeropoint
+ \xspaceskip \zeropoint
+ \parfillskip\zeropoint\!!plus\raggedfillamount\relax
+ \let\updateraggedskips\relax} % new
+
+\let\forgetragged\notragged
+
+\unexpanded\def\raggedleft
+ {\setraggedness\leftraggedness
+ \setraggedskips1\leftraggedness\zeropoint\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+\unexpanded\def\raggedcenter
+ {\setraggedness\middleraggedness
+ \setraggedskips2\middleraggedness\middleraggedness\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+%D We used to have:
+%D
+%D \starttyping
+%D \def\raggedright
+%D {\setraggedness\rightraggedness
+%D \setraggedskips{3}{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}}
+%D \stoptyping
+%D
+%D However, the next alternative, suggested by Taco, is better.
+
+\unexpanded\def\raggedright
+ {\setraggedness\rightraggedness
+ \setraggedskips3\zeropoint\rightraggedness\raggedspaceamount
+ \raggedxspaceamount\raggedfillamount\parindent}
+
+\unexpanded\def\veryraggedleft
+ {\setraggedskips1\raggedfillamount\zeropoint\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+%D When we want the last line to have a natural width:
+%D
+%D \starttyping
+%D \def\veryraggedleft%
+%D {\setraggedskips{1}{1fil}{0em}{.3333em}{.5em}{0em}{-1fil}}
+%D \stoptyping
+%D
+%D but this one is not accepted by the macros.
+
+\unexpanded\def\veryraggedcenter
+ {\setraggedskips2\raggedfillamount\raggedfillamount\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+\unexpanded\def\veryraggedright
+ {\setraggedskips3\zeropoint\raggedfillamount\raggedspaceamount
+ \raggedxspaceamount\zeropoint\parindent}
+
+\unexpanded\def\ttraggedright
+ {\tttf
+ \setraggedskips3\zeropoint\rightraggedness
+ \zeropoint\zeropoint\zeropoint\parindent} % \ctxparindent
+
+%D A bonus one:
+
+\unexpanded\def\raggedwidecenter
+ {\setraggedness\middleraggedness
+ \setraggedskips2\raggedhalffillamount\raggedhalffillamount
+ \raggedspaceamount\raggedxspaceamount\zeropoint\zeropoint}
+
+\newif\if@@asragged \@@asraggedtrue % old method
+
+% todo
+%
+% \setuplayout[grid=yes,lines=44] \showgrid
+% \starttext
+% test \vfill test \endgraf \strut \endgraf \vskip-\lineheight \removedepth \pagina test
+% \stoptext
+
+% \setupalign[reset,new,right,old]
+
+\def\@@align@@rl{\if!!donea\veryraggedleft \else\raggedleft \fi}
+\def\@@align@@rr{\if!!donea\veryraggedright \else\raggedright \fi}
+\def\@@align@@rc{\if!!donea\veryraggedcenter\else\raggedcenter\fi}
+
+\setvalue{@@ngila@@\v!broad }{\!!doneatrue}
+\setvalue{@@ngila@@\v!wide }{\!!donebtrue}
+
+\def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads
+
+\installalign \v!new {\@@asraggedfalse}
+\installalign \v!old {\@@asraggedtrue}
+\installalign \empty {}
+
+\installalign \v!line {\baselinebottom}
+\installalign \v!bottom {\raggedbottom}
+\installalign \v!height {\normalbottom}
+\installalign \v!width {\notragged}
+\installalign \v!normal {\notragged}
+\installalign \v!yes {\notragged}
+\installalign \v!no {\raggedright}
+\installalign \v!inner {\if@@asragged \setraggedparagraphmode\@@align@@rl\@@align@@rr \else
+ \setraggedparagraphmode\@@align@@rr\@@align@@rl \fi}
+\installalign \v!outer {\if@@asragged \setraggedparagraphmode\@@align@@rr\@@align@@rl \else
+ \setraggedparagraphmode\@@align@@rl\@@align@@rr \fi}
+\installalign \v!left {\if@@asragged\@@align@@rl\else\@@align@@rr\fi}
+\installalign \v!right {\if@@asragged\@@align@@rr\else\@@align@@rl\fi}
+\installalign \v!middle {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi}
+\installalign \v!flushleft {\if!!donea\veryraggedright \else\raggedright\fi}
+\installalign \v!flushright {\if!!donea\veryraggedleft \else\raggedleft \fi}
+\installalign \v!flushouter {\setraggedparagraphmode\raggedleft\raggedright}
+\installalign \v!flushinner {\setraggedparagraphmode\raggedright\raggedleft}
+\installalign \v!center {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi}
+\installalign \v!hanging {\enableprotruding}
+\installalign \v!nothanging {\disableprotruding}
+\installalign \v!hz {\enableadjusting}
+\installalign \v!nohz {\disableadjusting}
+\installalign \v!spacing {\enablespacehandling \enablekernhandling}
+\installalign \v!nospacing {\disablespacehandling\disablekernhandling}
+\installalign \v!hyphenated {\dohyphens}
+\installalign \v!nothyphenated {\nohyphens}
+\installalign \v!new {\@@asraggedfalse} % so new will give you consistency
+\installalign \v!reset {\notragged\normalbottom}
+
+\installalign \v!tolerant {\tolerance3000 \relax}
+\installalign \v!verytolerant {\tolerance4500 \relax}
+\installalign \v!stretch {\emergencystretch\bodyfontsize}
+
+\installalign \v!righttoleft {\lefttoright}
+\installalign \v!lefttoright {\righttoleft}
+\installalign {l2r} {\lefttoright}
+\installalign {r2l} {\righttoleft}
+
+\newcount\hyphenminoffset
+
+\ifx\sethyphenationvariables\undefined \let\sethyphenationvariables\relax \fi
+
+\unexpanded\def\lesshyphens
+ {\advance\hyphenminoffset\plusone
+ \sethyphenationvariables}
+
+\unexpanded\def\morehyphens
+ {\ifcase\hyphenminoffset \else
+ \advance\hyphenminoffset\minusone
+ \fi
+ \sethyphenationvariables}
+
+\installalign \v!lesshyphenation {\lesshyphens}
+\installalign \v!morehyphenation {\morehyphens}
+
+\def\dodosetupalign#1{\csname @@align@@#1\endcsname}
+\def\dodosetupngila#1{\csname @@ngila@@#1\endcsname}
+
+\unexpanded\def\setupalign
+ {\dosingleargument\dosetupalign}
+
+\def\dosetupalign[#1]% can be made faster by checking for defined #1
+ {\!!doneafalse
+ \!!donebfalse
+ \processcommacommand[#1]\dodosetupngila
+ \processcommacommand[#1]\dodosetupalign}
+
+% \setupalign[flushleft] \input ward \par % lijnlinks
+% \setupalign[right] \input ward \par
+
+% \setupalign[flushright] \input ward \par % lijnrechts
+% \setupalign[left] \input ward \par
+
+% \setupalign[middle] \input ward \par % centreer
+% \setupalign[center] \input ward \par
+
+\unexpanded\def\startalignment
+ {\bgroup
+ \setupalign}
+
+\unexpanded\def\stopalignment
+ {\par
+ \egroup}
+
+\chardef\alignstrutmode=1
+
+% see later for the real definition, which in the simple case is:
+
+\newtoks \everyleftofalignedline
+\newtoks \everyrightofalignedline
+
+\def\shiftalignedline#1#2#3#4% left, right, inner, outer
+ {\rightorleftpageaction
+ {\everyleftofalignedline {\hskip\dimexpr#1+#3\relax}%
+ \everyrightofalignedline{\hskip\dimexpr#2+#4\relax}}
+ {\everyleftofalignedline {\hskip\dimexpr#1+#4\relax}%
+ \everyrightofalignedline{\hskip\dimexpr#2+#3\relax}}}
+
+\def\doalignline#1#2% \\ == newline
+ {\noindentation % was \noindent
+ \dontleavehmode % added in marrakesch at TUG 2006\begingroup
+ \begingroup
+ \setlocalhsize % new
+ \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}%
+ \dowithnextbox
+ {\hbox to \localhsize
+ {\ifcase\alignstrutmode\or\strut\fi
+ \the\everyleftofalignedline
+ #1\unhbox\nextbox#2\relax
+ \the\everyrightofalignedline}%
+ \endgroup}
+ \hbox}
+
+% plain commands
+
+\ifdefined\line \else \def\line {\hbox to\hsize} \fi
+\ifdefined\leftline \else \def\leftline #1{\line{#1\hss}} \fi
+\ifdefined\rightline \else \def\rightline #1{\line{\hss#1}} \fi
+\ifdefined\centerline \else \def\centerline#1{\line{\hss#1\hss}} \fi
+
+% directe commando's
+
+\def\leftaligned {\doalignline \relax \hss }
+\def\midaligned {\doalignline \hss \hss }
+\def\rightaligned{\doalignline \hss \relax}
+
+\let\centeraligned\midaligned
+
+\def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated
+
+% indirecte commando's
+
+\letvalue{\s!do\v!line\v!left }\leftaligned
+\letvalue{\s!do\v!line\v!right }\rightaligned
+\letvalue{\s!do\v!line\v!middle }\midaligned
+\letvalue{\s!do\v!line\v!flushleft }\rightaligned
+\letvalue{\s!do\v!line\v!flushright}\leftaligned
+\letvalue{\s!do\v!line\v!center }\midaligned
+
+\def\doalignedline#1{\csname\s!do\v!line#1\endcsname}
+
+%D Experimental:
+
+\def\doxalignline#1#2#3#4#5#6%
+ {\noindentation % was \noindent
+ \dontleavehmode % added in marrakesch at TUG 2006\begingroup
+ \begingroup
+ \setlocalhsize
+ \def\\{\egroup\par\doxalignline#1#2#3#4#5#6\bgroup}% inefficient
+ \dowithnextbox
+ {%\noindent moved up
+ \hbox to \localhsize
+ {#1\hskip\ifdone#2\else#3\fi#4%
+ \hbox to \localhsize
+ {\the\everyleftofalignedline
+ \ifcase\alignstrutmode\or\strut\fi
+ \ifdone#5\unhbox\nextbox#6\else#6\unhbox\nextbox#5\fi
+ \the\everyrightofalignedline}%
+ \hss}%
+ \endgroup}
+ \hbox}
+
+\def\doxcheckline
+ {\signalrightpage\doifrightpageelse\donetrue\donefalse}
+
+\setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss }
+\setvalue{\s!do\v!line\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax}
+\setvalue{\s!do\v!line\v!innermargin}{\doxalignline\doxcheckline-+\innermargintotal\relax\hss }
+\setvalue{\s!do\v!line\v!outermargin}{\doxalignline\doxcheckline+-\outermargintotal\hss \relax}
+\setvalue{\s!do\v!line\v!inneredge }{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss }
+\setvalue{\s!do\v!line\v!outeredge }{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax}
+\setvalue{\s!do\v!line\v!backspace }{\doxalignline\doxcheckline-+\backspace \relax\hss }
+\setvalue{\s!do\v!line\v!cutspace }{\doxalignline\doxcheckline+-\cutspace \hss \relax}
+
+\setvalue{\s!do\v!line\v!leftmargin }{\doxalignline\donefalse --\leftmargintotal \hss \relax}
+\setvalue{\s!do\v!line\v!rightmargin}{\doxalignline\donefalse ++\rightmargintotal\relax\hss }
+\setvalue{\s!do\v!line\v!leftedge }{\doxalignline\donefalse --\leftedgetotal \hss \relax}
+\setvalue{\s!do\v!line\v!rightedge }{\doxalignline\donefalse ++\rightedgetotal \relax\hss }
+
+% ! ! ! beware, redefining \doalignline gives the wrong results ! ! !
+%
+% \def\doalignline{\doxalignline\donefalse++\zeropoint}
+
+%D Better:
+
+\def\doalignedline#1{\csname\s!do\v!line#1\endcsname}
+
+\def\alignedline#1#2% setting default
+ {\csname\s!do\v!line\ifcsname\s!do\v!line#1\endcsname#1\else#2\fi\endcsname}
+
+% \def\woordrechts
+% {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}}
+
+% beware: \wordright{whatever\kern-\rightskip} should work!
+% so, no funny boxing here
+
+\def\dowordright[#1]%
+ {% don't change
+ \groupedcommand
+ {\removeunwantedspaces
+ \hfill
+ \allowbreak % changed back from \hskip\zeropoint
+ \strut
+ \hfill
+ \quad % decent spacing
+ \hbox}
+ {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}%
+ \parfillskip\zeropoint
+ \finalhyphendemerits\zerocount % yes or no (see hyhenation/specialcases-001.tex)
+ \par}}
+
+\unexpanded\def\wordright
+ {\dosingleempty\dowordright}
+
+% \dorecurse{5}{something } \wordright{--someone} \endgraf
+% \dorecurse{6}{something } \wordright{--someone} \endgraf
+% \dorecurse{7}{something } \wordright{--someone} \endgraf
+%
+% \dorecurse{5}{something } \wordright{--someone else entirely} \endgraf
+% \dorecurse{6}{something } \wordright{--someone else entirely} \endgraf
+% \dorecurse{7}{something } \wordright{--someone else entirely} \endgraf
+%
+% \wordright[\rightskip]{whatever}
+
+% \simplealignedbox{2cm}{right}{x}
+
+\setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}}
+\setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}}
+\setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}}
+\setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}}
+\setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}}
+
+\unexpanded\def\simplealignedbox#1{\executeifdefined{\s!simple\c!align#1}{\getvalue{\s!simple\c!align\v!right}}}
+
+\protect \endinput
diff --git a/tex/context/base/spac-def.mkiv b/tex/context/base/spac-def.mkiv
new file mode 100644
index 000000000..3aa85dda5
--- /dev/null
+++ b/tex/context/base/spac-def.mkiv
@@ -0,0 +1,118 @@
+%D \module
+%D [ file=spac-def,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing 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.
+
+\writestatus{loading}{ConTeXt Spacing Macros / Definitions}
+
+\unprotect
+
+\def\forgeteverypar
+ {\everypar{\the\neverypar}}
+
+\def\forgetparindent
+ {\forgeteverypar
+ \indentfirstparagraphtrue % recently added
+ \let\currentindentation\v!none
+ \ctxparindent\zeropoint
+ \parindent\zeropoint\relax}
+
+\def\forgetparskip
+ {\let\currentwhitespace\v!none
+ \ctxparskip\zeropoint
+ \parskip\zeropoint\relax}
+
+\def\forgetbothskips
+ {\tolerance1500
+ \leftskip\zeropoint
+ \rightskip\zeropoint\relax}
+
+\def\forgetspacing
+ {\emergencystretch\zeropoint}
+
+\newif\ifforgotten % rather good signal for inner
+
+\appendtoks \forgottentrue \to \everyforgetall
+\appendtoks \forgetragged \to \everyforgetall
+\appendtoks \forgetparskip \to \everyforgetall
+\appendtoks \forgetparindent \to \everyforgetall
+\appendtoks \forgetbothskips \to \everyforgetall
+\appendtoks \forgetspacing \to \everyforgetall % i.v.m. funny spacing in pagebody
+\appendtoks \spacing\plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed
+\appendtoks \everypar\emptytoks \to \everyforgetall % indeed!
+
+
+\appendtoks \spacing\plusone \to \everybodyfont
+\appendtoks \presetnormallineheight \to \everybodyfont
+\appendtoks \setnormalbaselines \to \everybodyfont % check if redundant
+\appendtoks \setstrut \to \everybodyfont % check if redundant
+\appendtoks \settopskip \to \everybodyfont
+\appendtoks \setmaxdepth \to \everybodyfont
+\appendtoks \simplesetupindenting \to \everybodyfont
+\appendtoks \simplesetupblank \to \everybodyfont
+\appendtoks \simplesetupwhitespace \to \everybodyfont
+\appendtoks \simplesetupspacing \to \everybodyfont % nieuw
+\appendtoks \setrelativeinterlinespace \to \everybodyfont
+
+\appendtoks \updateraggedskips \to \everyfontswitch % under test
+\prependtoks \let\par\endgraf \to \everypagebody % see \fillinline
+\appendtoks \simplesetupspacing \to \everydefinedfont
+
+\setupwhitespace
+ [\v!none]
+
+\indenting
+ [\v!never]
+
+\setupindenting
+ [\v!none]
+
+\setupvspacing
+ [\v!standard,
+ \v!big]
+
+\definevspacing[\v!default] [\currentblank]
+\definevspacing[\v!before] [\v!default]
+\definevspacing[\v!inbetween][\v!default]
+\definevspacing[\v!after] [\v!before]
+
+\setupinterlinespace
+ [\c!minheight=0pt, % only special purpose
+ \c!mindepth=0pt, % only special purpose
+ \c!height=.72,
+ \c!depth=.28,
+ \c!top=1.0,
+ \c!bottom=0.4,
+ \c!distance=1pt,
+ \c!line=2.8ex,
+ \c!stretch=0]
+
+\setupnarrower
+ [\c!before=\endgraf,
+ \c!after=\endgraf,
+ \c!left=1.5em,
+ \c!right=1.5em,
+ \c!middle=1.5em]
+
+\setuptolerance
+ [\v!horizontal,\v!verystrict]
+
+\setuptolerance
+ [\v!vertical,\v!strict]
+
+\setupalign
+ [\v!bottom,
+ \v!width]
+
+\setupspacing
+ [\v!packed]
+
+\protect \endinput
diff --git a/tex/context/base/spac-fnt.mkiv b/tex/context/base/spac-fnt.mkiv
new file mode 100644
index 000000000..c268d7893
--- /dev/null
+++ b/tex/context/base/spac-fnt.mkiv
@@ -0,0 +1,94 @@
+%D \module
+%D [ file=spac-fnt,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Spacing Macros / Fonts}
+
+%D For historic reasons here, will move and/or disappear:
+
+\unprotect
+
+\let\dostopattributes\relax % in case these commands end up in an edef
+
+\unexpanded\def\@@dostopattributes
+ {\stopcolor
+ \finishparbasedattributes
+ \endgroup}
+
+\unexpanded\def\@@nostopattributes
+ {\finishparbasedattributes
+ \endgroup}
+
+\unexpanded\def\doattributes#1#2#3#4%
+ {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes}
+
+% An even faster \ETEX\ version:
+
+\unexpanded\def\dostartattributes#1#2#3%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \ifincolor
+ \ifcsname#1#3\endcsname
+ \let\dostopattributes\@@dostopattributes
+ \faststartcolor[\csname#1#3\endcsname]%
+ \else
+ \let\dostopattributes\@@nostopattributes
+ \fi
+ \else
+ \let\dostopattributes\@@nostopattributes
+ \fi
+ \ifcsname#1#2\endcsname
+ % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname
+ \@EA\doconvertfont\csname#1#2\@EA\endcsname
+ \fi}
+
+\unexpanded\def\@@dostopattributes
+ {\faststopcolor
+ \finishparbasedattributes
+ \endgroup}
+
+\unexpanded\def\@@nostopattributes
+ {\finishparbasedattributes
+ \endgroup}
+
+%D Bonus macro, see core-sec.tex
+
+\newconditional\fontattributeisset
+
+\unexpanded\def\dosetfontattribute#1#2%
+ {\ifcsname#1#2\endcsname
+ \settrue\fontattributeisset % reset is done elsewhere
+ \@EA\doconvertfont\csname#1#2\@EA\endcsname
+ \fi\empty}
+
+%D Since this happens a lot, and sometimes large arguments
+%D are passed in \type {#4}, we just copy some code:
+
+\unexpanded\def\doattributes#1#2#3#4%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \ifincolor
+ \ifcsname#1#3\endcsname
+ \let\dostopattributes\@@dostopattributes
+ \faststartcolor[\csname#1#3\endcsname]%
+ \else
+ \let\dostopattributes\endgroup
+ \fi
+ \else
+ \let\dostopattributes\endgroup
+ \fi
+ \ifcsname#1#2\endcsname
+ % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname
+ \@EA\doconvertfont\csname#1#2\@EA\endcsname
+ \fi
+ {#4}%
+ \dostopattributes}
+
+\protect \endinput
diff --git a/tex/context/base/spac-gen.mkii b/tex/context/base/spac-gen.mkii
new file mode 100644
index 000000000..8274db1b9
--- /dev/null
+++ b/tex/context/base/spac-gen.mkii
@@ -0,0 +1,4652 @@
+%D \module
+%D [ file=core-spa,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Spacing,
+%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 / Spacing}
+
+% to be sorted out: dependencies, order of initialization / also some dutch code here
+
+\unprotect
+
+% some will move to core-var
+
+\newif \ifgridsnapping
+\newif \iffuzzyvskip
+\let \fuzzyvskip \gobbleoneargument
+\let \removelastfuzzyvskip \relax
+
+\let \startbaselinecorrection \relax
+\let \stopbaselinecorrection \relax
+\let \baselinecorrection \relax
+\let \offbaselinecorrection \relax
+
+\appendtoks \spacing 1\to \everybodyfont
+\appendtoks \presetnormallineheight \to \everybodyfont
+\appendtoks \setnormalbaselines \to \everybodyfont % check if redundant
+\appendtoks \setstrut \to \everybodyfont % check if redundant
+\appendtoks \settopskip \to \everybodyfont
+\appendtoks \setmaxdepth \to \everybodyfont
+%appendtoks \spacing 1\to \everybodyfont
+\appendtoks \simplesetupindenting \to \everybodyfont
+\appendtoks \simplesetupblank \to \everybodyfont
+\appendtoks \simplesetupwhitespace \to \everybodyfont
+%appendtoks \checknotes \to \everybodyfont % not
+\appendtoks \simplesetupspacing \to \everybodyfont % nieuw
+\appendtoks \setrelativeinterlinespace \to \everybodyfont
+
+\appendtoks \updateraggedskips \to \everyfontswitch % under test
+\prependtoks \let\par\endgraf \to \everypagebody % see \fillinline
+\appendtoks \simplesetupspacing \to \everydefinedfont
+
+% if you want to hyphenate the first word of a paragraph ... \appendtoks\hskip0pt\to\everypar
+
+\def\stelfactorenin
+ {\simplesetupwhitespace
+ \simplesetupblank
+ \settopskip
+ \setmaxdepth}
+
+\def\softbreak
+ {\relax\ifhmode\hskip\parfillskip\break\fi}
+
+\let\poplastnode\relax
+
+\def\pushlastnode
+ {\ifdim\lastskip=\zeropoint
+ \ifnum\lastpenalty=\zerocount
+ \ifnum\lastkern=\zerocount
+ \let\poplastnode\relax
+ \else
+ \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested
+ \fi
+ \else
+ \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested
+ \fi
+ \else
+ \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip
+ \fi}
+
+%D The dreadful sequence \type {\bgroup} \unknown\
+%D \type {\carryoverpar} \unknown\ \type {\egroup} is needed
+%D when for instance sidefloats are used in combination with
+%D something that starts with a group. This is because
+%D otherwise the indentation as set (by the output routine)
+%D inside the group are forgotten afterwards. (I must
+%D not forget its existence).
+
+\global\let\carriedoverpar\relax
+
+\def\carryoverpar#1%
+ {\expanded % \scratchtoks{#1}%
+ {\noexpand#1% \the\scratchtoks
+ \hangindent\the\hangindent
+ \hangafter \the\hangafter
+ \parskip \the\parskip
+ \leftskip \the\leftskip
+ \rightskip \the\rightskip}}
+
+%D A quick way to determine left|/|middle|/|right states
+%D (experimental).
+
+\setvalue{\??as\v!left }{0}
+\setvalue{\??as\v!middle}{1}
+\setvalue{\??as\v!right }{2}
+
+\def\setalignmentswitch#1%
+ {\chardef\alignmentswitch0\csname\??as#1\endcsname\relax}
+
+%D There are two ways to influence the interline spacing. The
+%D most general and often most consistent way is using
+%D
+%D \showsetup{setupinterlinespace}
+%D
+%D For instance
+%D
+%D \starttyping
+%D \setupinterlinespace[line=2.8ex]
+%D \stoptyping
+%D
+%D This setting adapts itself to the bodyfontsize, while for
+%D instance saying
+%D
+%D \starttyping
+%D \setupinterlinespace[line=12pt]
+%D \stoptyping
+%D
+%D sets things fixed for all sizes, which is definitely not
+%D what we want. Therefore one can also say:
+%D
+%D \starttyping
+%D \definebodyfontenvironment[9pt][interlinespace=11pt]
+%D \stoptyping
+%D
+%D One can still use \type{\setupinterlinespace} (without
+%D arguments) to set the interline space according to the
+%D current font, e.g. a \type{\bfa}.
+
+\newif\iflocalinterlinespace
+
+% font-ini
+
+\ifx\bodyfontinterlinespecs\undefined
+
+ \let\bodyfontinterlinespecs\empty
+ \let\bodyfontinterlinespace\empty
+
+\fi
+
+\def\presetnormallineheight
+ {\edef\normallineheight{\@@itline}%
+% done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
+ \iflocalinterlinespace \else
+ \doifdefined\bodyfontinterlinespecs
+ {\doifsomething\bodyfontinterlinespace
+ {\edef\normallineheight{\bodyfontinterlinespace}}}%
+ \fi}
+
+\def\setupspecifiedinterlinespace[#1]%
+ {\getparameters[\??it][#1]%
+ \scratchdimen0\@@itheight\points
+ \advance\scratchdimen 0\@@itdepth\points
+ \ifdim\scratchdimen>\onepoint
+ \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}%
+ \let\@@itheight\strutheightfactor
+ \let\@@itdepth \strutdepthfactor
+ \else
+ \let\strutheightfactor\@@itheight
+ \let\strutdepthfactor \@@itdepth
+ \fi
+ \let\minimumstrutheight \@@itminheight
+ \let\minimumstrutdepth \@@itmindepth
+ \let\minimumlinedistance\@@itdistance
+ \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex
+ \doifelse\@@ittop\v!height % new, topskip does more bad than good
+ {\let\topskipfactor \@@itheight}
+ {\let\topskipfactor \@@ittop }%
+ \let\maxdepthfactor \@@itbottom
+ \let\baselinegluefactor \@@itstretch
+ \setfontparameters % redundant, can be \setstrut, test first
+ \updateraggedskips} % yes indeed
+
+% \let\currentrelativeinterlinespace\empty
+%
+% \def\setuprelativeinterlinespace[#1]%
+% {\processallactionsinset
+% [#1]
+% [ \v!on=>\oninterlineskip,
+% \v!off=>\offinterlineskip,
+% \v!reset=>\let\currentrelativeinterlinespace\empty
+% \setfontparameters,% just \setstrut, test first
+% \s!unknown=>\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+% \spacing\currentrelativeinterlinespace]}
+
+% \setupinterlinespace[big] \switchtobodyfont[11pt] -> forgotten
+% \setupinterlinespace[auto,big] \switchtobodyfont[11pt] -> remembered
+
+\let\currentrelativeinterlinespace\empty
+
+\def\setuprelativeinterlinespace[#1]%
+ {\processallactionsinset
+ [#1]
+ [ \v!on=>\oninterlineskip,
+ \v!off=>\offinterlineskip,
+ \v!reset=>\let\currentrelativeinterlinespace\empty
+ \let\setrelativeinterlinespace\relax
+ \setfontparameters,
+ \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace,
+ \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+ \spacing\currentrelativeinterlinespace]}
+
+\def\dosetrelativeinterlinespace
+ {\ifx\currentrelativeinterlinespace\empty\else
+ \spacing\currentrelativeinterlinespace
+ \fi}
+
+\let\setrelativeinterlinespace\relax
+
+% \appendtoks \setrelativeinterlinespace \to \everybodyfont
+
+\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1
+ {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]}
+
+\def\setuplocalinterlinespace[#1]%
+ {\localinterlinespacetrue
+ \setupinterlinespace[#1]%
+ \localinterlinespacefalse}
+
+\def\simplesetupinterlinespace
+ {\localinterlinespacetrue
+ \setfontparameters
+ \updateraggedskips % funny one here
+ \localinterlinespacefalse}
+
+\definecomplexorsimple\setupinterlinespace
+
+% In earlier versions \type{\bigskipamount} was
+% \type{\ht\strutbox} and the stretch was plus or minus
+% \type{.4\dp\strutbox}. Don't ask me why. The most recent
+% implementation is based on a user supplied distance, which
+% is by default \type{.75\normalskipamount} where
+% \type{\normalskipamount} equals the current baseline
+% distance.
+
+% \lineskiplimit = -\maxdimen -> freezes baselineskip
+
+% can be conditionals
+
+\newif\ifblanknowhite \blanknowhitefalse
+\newif\ifblankindeed \blankindeedfalse
+\newif\ifblankreset \blankresetfalse
+\newif\ifblankdisable \blankdisablefalse
+\newif\ifblankflexible \blankflexibletrue
+\newif\ifblankouter
+\newif\ifblankforce
+\newif\ifblankgoback
+
+\newskip\blankskip \blankskip=\bigskipamount
+\newskip\blankskipamount
+
+\def\skipfactor {.75}
+\def\skipgluefactor{.25}
+
+\def\normalskipamount
+ {\openlineheight
+ \ifgridsnapping \else \ifblankflexible
+ \!!plus \skipgluefactor\openlineheight
+ \!!minus\skipgluefactor\openlineheight
+ \fi \fi
+ \relax}
+
+\def\linedistance {\normalskipamount}
+\def\appliedblankskip{\skipfactor\linedistance}
+\def\lastblankskip {\blankskip}
+\def\currentblank {\v!big}
+\def\oldprevdepth {\prevdepth}
+\def\newprevdepth {-1001pt}
+\def\mindimen {1sp} % was: 0.00002pt
+
+\newif\iflocalblankfixed
+\newif\iflocalblankflexible
+
+\def\geenblanko{\removelastskip} % will become obsolete
+
+%%%% pas op, wordt ook in core-pos gebruikt
+
+\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap
+ {\doifelse{#1}\v!line
+ {#2\openlineheight}
+ {\ifgridsnapping
+ \assigndimension{#1}{#2}{.25\openlineheight}{.5\openlineheight}\openlineheight
+ \else
+ \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount
+ \fi}%
+ \relax}
+
+% \relax is really needed, else we may loose stretch due to lookahead; somehow
+% this bug was introduced a while ago but somehow went unnoticed; fixed 2/7/2008
+
+\def\addblankskip#1#2#3{\global\advance\blankskip#1\ifgridsnapping#3\else#2\fi\relax}
+
+\def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}}
+
+\defineblankmethod [\v!big] {\addblankskip+\bigskipamount \openlineheight}
+\defineblankmethod [-\v!big] {\addblankskip-\bigskipamount \openlineheight}
+\defineblankmethod [\v!medium] {\addblankskip+\medskipamount {.5\openlineheight}}
+\defineblankmethod [-\v!medium] {\addblankskip-\medskipamount {.5\openlineheight}}
+\defineblankmethod [\v!small] {\addblankskip+\smallskipamount{.25\openlineheight}}
+\defineblankmethod [-\v!small] {\addblankskip-\smallskipamount{.25\openlineheight}}
+\defineblankmethod [\v!white] {\addblankskip+\parskip \openlineheight}
+\defineblankmethod [-\v!white] {\addblankskip-\parskip \openlineheight}
+\defineblankmethod [\v!line] {\addblankskip+\openlineheight \openlineheight}
+\defineblankmethod [-\v!line] {\addblankskip-\openlineheight \openlineheight}
+
+\defineblankmethod [\v!formula] {\global\advance\blankskip\medskipamount}
+\defineblankmethod [\v!nowhite] {\global\blanknowhitetrue}
+\defineblankmethod [\v!disable] {\global\blankdisabletrue}
+\defineblankmethod [\v!force] {\global\blankforcetrue}
+\defineblankmethod [\v!outer] {\ifvmode\ifinner\blankoutertrue\fi\fi}
+\defineblankmethod [\v!reset] {\global\blankresettrue}
+\defineblankmethod [\v!flexible] {\global\localblankflexibletrue}
+\defineblankmethod [\v!fixed] {\global\localblankfixedtrue}
+\defineblankmethod [\v!back] {\global\blankgobacktrue} % {\geenblanko}
+\defineblankmethod [\v!halfline] {\ifgridsnapping\global\fuzzyvskiptrue\fi
+ \global\advance\blankskip .5\lineheight}
+\defineblankmethod [\v!none] {\global\blankresettrue}
+\defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi}
+\defineblankmethod[\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut}
+
+% \vtop{\blank[synchronize]\blank[line]test}
+
+\defineblankmethod [\v!always] {\redowhitespace} % experimental
+
+% happens often, so we speed this up:
+%
+% \defineblankmethod [2*\v!line] {\addblankskip+{2\openlineheight}{2\openlineheight}}
+% \defineblankmethod [2*\v!big] {\addblankskip+{2\bigskipamount }{2\openlineheight}}
+%
+% no, with 2\whatever we loose the stretch and shrink! Taco's alternative:
+
+\defineblankmethod
+ [2*\v!line]
+ {\addblankskip+\openlineheight\openlineheight
+ \addblankskip+\openlineheight\openlineheight}
+
+\defineblankmethod
+ [2*\v!big]
+ {\addblankskip+\bigskipamount\openlineheight
+ \addblankskip+\bigskipamount\openlineheight}
+
+\def\doblank#1%
+ {\edefconvertedargument\ascii{#1}%
+ \ifx\ascii\empty\else
+ \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
+ \dorepeatwithcommand[#1]\redoblank
+ \fi\fi
+ \fi
+ \relax}
+
+\def\redoblank#1%
+ {\edefconvertedargument\ascii{#1}%
+ \ifx\ascii\empty\else
+ \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
+ \global\advance\blankskip#1\relax
+ \fi\fi
+ \fi
+ \relax}
+
+\unexpanded\def\blank % the \relax is definitely needed due to the many \if's
+ {\relax\complexorsimple\doblank}
+
+\def\complexdoblank
+ {\flushnotes
+ \ifmmode
+ \@EA\nocomplexdoblank
+ \else
+ \ifopelkaar
+ \ifinpagebody
+ \@EA\@EAEAEA\@EA\docomplexdoblank
+ \else
+ \@EA\@EAEAEA\@EA\nocomplexdoblank
+ \fi
+ \else
+ \@EAEAEA\docomplexdoblank
+ \fi
+ \fi}
+
+\def\nocomplexdoblank[#1]%
+ {% evt blokkeerfalse
+ \ifmmode\else\par\fi}
+
+% Overloaded in cont-new!
+
+\newsignal\noblanksignal
+
+% \def\doinhibitblank
+% {\kern\noblanksignal}
+
+% \def\inhibitblank% the fast, local way
+% {\endgraf\ifvmode\prevdepth\newprevdepth\fi}
+
+% \def\docomplexdoblank[#1]% pas op \relax's zijn nodig ivm volgende \if
+% {\global\blankresetfalse
+% \global\blankdisablefalse
+% \global\blanknowhitefalse
+% \global\localblankflexiblefalse
+% \global\localblankfixedfalse
+% \global\blankskip\zeropoint
+% \global\blankforcefalse
+% \global\blankgobackfalse
+% \blankouterfalse
+% \expanded{\rawprocesscommalist[#1]}\doblank
+% \ifdim\blankskip=\zeropoint\relax
+% \iflocalblankflexible
+% \doglobal\advance\blankskip \currentblank
+% \else\iflocalblankfixed
+% \doglobal\advance\blankskip \currentblank
+% \fi\fi
+% \fi
+% \ifblankouter
+% \else
+% \par
+% \ifvmode
+% \ifblankgoback
+% \removelastskip
+% \fi
+% \ifblankforce
+% % dit gaat mis in pos fonts
+% % \ifdim\prevdepth>\zeropoint\else ...
+% % -1000pt signals top of page or column (\ejectcolumn)
+% \bgroup\forgeteverypar\verticalstrut\egroup\kern-\struttotal
+% \fi
+% \ifblankdisable
+% \global\blankindeedfalse
+% \ifgridsnapping
+% \ifdim\prevdepth<\zeropoint
+% % brrr
+% \else
+% % dirty trick: smaller blanks are ignored after
+% % a larger one, so 10 lines is probably safe; first make
+% % sure that we honor penalties
+% \scratchcounter\lastpenalty
+% % now comes the trick (cross our fingers that this works
+% % well in multi columns; maybe an ifinner test is needed
+% % \vskip-10\lineheight
+% % \ifnum\scratchcounter=\zerocount \else \penalty\lastpenalty \fi
+% % \vskip 10\lineheight
+% % allas, this leads to overfull pages, so we try this:
+% \kern-\noblanksignal
+% \ifnum\scratchcounter=\zerocount
+% \else
+% \penalty\lastpenalty
+% \fi
+% \kern\noblanksignal
+% % end-of-dirty-trick
+% \fi
+% \else
+% \ifdim\prevdepth<\zeropoint
+% % brrr
+% \else
+% % ensure at least a proper prevdepth, this should be
+% % an option
+% \vskip-\prevdepth
+% \vskip\strutdepth
+% \prevdepth\strutdepth
+% \fi
+% % the old crappy piece of code
+% \edef\oldprevdepth{\the\prevdepth}%
+% \prevdepth\newprevdepth
+% \fi
+% \else
+% \global\blankindeedtrue
+% \fi
+% \ifblankreset
+% \global\blankindeedtrue
+% \ifgridsnapping
+% % let's play safe and not fool around with the depth, if
+% % only because it took a lot of effort to sort out the grid
+% % stuff in the first place
+% \else
+% \ifdim\prevdepth=\newprevdepth
+% \prevdepth\oldprevdepth
+% \fi
+% \fi
+% \fi
+% \ifblankindeed
+% \ifdim1\lastskip<1\blankskip\relax
+% % else when \blanko[2*groot] + \blanko[3*groot] with parskip
+% % equaling 1*groot, gives a groot=\parskip so adding a small
+% % value makes it distinguishable; can also be done at parskip
+% % setting time (better)
+% \global\advance\blankskip \mindimen\relax % = skip
+% % test this on 2* + 3* and parskip groot
+% \ifblanknowhite
+% \global\advance\blankskip -\parskip
+% \else
+% \ifdim\lastskip=\parskip
+% \else % force this due to previous comment
+% \ifdim\parskip>\zeropoint\relax
+% \ifdim\blankskip<\parskip\relax
+% \global\blankskip\zeropoint
+% \else
+% \global\advance\blankskip -\parskip
+% \fi
+% \fi
+% \fi
+% \fi
+% \ifblankflexible \else
+% \blankskip1\blankskip
+% \fi
+% \iflocalblankfixed
+% \blankskip1\blankskip
+% \fi
+% \iflocalblankflexible
+% \blankskip1\blankskip
+% \!!plus\skipgluefactor\blankskip
+% \!!minus\skipgluefactor\blankskip
+% \fi
+% \ifdim\lastkern=\noblanksignal % controled and grid
+% \global\blankindeedfalse
+% \else\ifgridsnapping\else\ifdim\prevdepth=\newprevdepth
+% \global\blankindeedfalse
+% \fi\fi\fi
+% \ifblankindeed
+% \iffuzzyvskip
+% \removelastfuzzyvskip
+% \fuzzyvskip\blankskip\relax
+% \else
+% \removelastskip
+% \vskip\blankskip\relax
+% \fi
+% \fi
+% \else
+% \iffuzzyvskip
+% \removelastfuzzyvskip
+% \fuzzyvskip\blankskip\relax
+% \else
+% % new, test this on pascal
+% \ifdim\blankskip<\zeropoint
+% \advance\blankskip-\lastskip
+% \removelastskip
+% \ifdim\blankskip>\zeropoint
+% \vskip\blankskip
+% \else
+% \vskip\zeropoint
+% \fi
+% \else
+% % also new
+% \ifdim\blankskip=\zeropoint
+% \ifblanknowhite
+% \geenwitruimte
+% \fi
+% \fi
+% \fi
+% \fi
+% \fi
+% \fi
+% \fi
+% \fi
+% \global\fuzzyvskipfalse
+% \presetindentation}
+
+% goback was broken:
+
+% \def\doinhibitblank
+% {\kern\noblanksignal}
+
+% \def\inhibitblank% the fast, local way
+% {\endgraf\ifvmode\prevdepth\newprevdepth\fi}
+
+% problem: we cannot look back in the mvl so we need 3 kinds of signals
+
+\def\noblankpsignal{1010101}
+
+\def\inhibitgridblank % was doinhibitblank
+ {\ifvmode\else\endgraf\fi
+ \ifvmode
+ \ifnum\lastpenalty<10000
+ \kern-\noblanksignal % new
+ \kern \noblanksignal
+ \else
+ \penalty\noblankpsignal
+ \fi
+ \fi}
+
+\def\inhibittextblank % was inhibitblank
+ {\endgraf
+ \ifvmode
+ \prevdepth\newprevdepth
+ \fi}
+
+% new macro
+%
+% \def\inhibitblank % need some work
+% {\endgraf
+% \ifvmode
+% \ifgridsnapping
+% \inhibitgridblank
+% \else
+% % this one spoils the grid
+% \inhibittextblank
+% \fi
+% \fi}
+
+\def\doinhibitblank{\inhibitgridblank}
+\def\inhibitblank {\inhibittextblank}
+
+% will become obsolete
+
+\ifx\undefined\savedlastskip \newskip \savedlastskip \fi
+\ifx\undefined\savedlastpenalty \newcount\savedlastpenalty \fi
+
+% beware, prevdepth can have funny values (e.g. mvl value when in box)
+
+\def\docomplexdoblank[#1]% pas op \relax's zijn nodig ivm volgende \if
+ {\global\blankresetfalse
+ \global\blankdisablefalse
+ \global\blanknowhitefalse
+ \global\localblankflexiblefalse
+ \global\localblankfixedfalse
+ \global\blankforcefalse
+ \global\blankgobackfalse
+ \blankouterfalse
+ \global\blankskip\zeropoint
+%
+\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
+ \doglobal\advance\blankskip \currentblank
+ \else\iflocalblankfixed
+ \doglobal\advance\blankskip \currentblank
+ \fi\fi
+ \fi
+ \relax % to be sure
+ \ifblankouter
+ % do nothing
+ \else
+ \par
+ \ifvmode
+ \ifblankgoback
+ \ifdim\lastskip>\zeropoint \vskip-\lastskip \fi
+ \savedlastskip\zeropoint
+ \else\ifdim\lastskip>\zeropoint
+ \savedlastskip\lastskip
+ \else % todo: lastnode, dan namelijk geen skip !
+ \savedlastskip\zeropoint
+ \fi\fi
+ \ifblankforce
+ % dit gaat mis in pos fonts
+ % \ifdim\prevdepth>\zeropoint\else ...
+ % -1000pt signals top of page or column (\ejectcolumn)
+ \bgroup\forgeteverypar\verticalstrut\egroup\kern-\struttotal
+ \savedlastskip\zeropoint
+ \fi
+ \savedlastpenalty\lastpenalty % hm, now it gets lost
+ \ifblankdisable
+ \global\blankindeedfalse % keep this, i.e. disable current too
+ \ifgridsnapping
+ \ifdim\prevdepth<\zeropoint
+ % brrr
+ \else
+ % dirty trick: smaller blanks are ignored after a
+ % larger one, so 10 lines is probably safe; we need
+ % to make sure that we honor penalties; here comes the
+ % trick (cross our fingers that this works well in
+ % multi columns; maybe an ifinner test is needed
+ % \scratchcounter\lastpenalty
+ % \vskip-10\lineheight
+ % \ifnum\scratchcounter=\zerocount \else \penalty\lastpenalty \fi
+ % \vskip 10\lineheight
+ % alas, this leads to overfull pages, so we try this:
+ \inhibitgridblank
+ \fi
+ \else
+ \ifdim\prevdepth<\zeropoint
+ % brrr
+ \else
+ % ensure at least a proper prevdepth, this should be
+ % an option
+ \vskip-\prevdepth
+ \vskip\strutdepth
+ \prevdepth\strutdepth
+ \fi
+ % the old crappy piece of code
+ \edef\oldprevdepth{\the\prevdepth}%
+ \prevdepth\newprevdepth % == \inhibittextblank
+ \fi
+ \else
+ \global\blankindeedtrue
+ \fi
+ \ifblankreset
+ \global\blankindeedtrue
+ \ifgridsnapping
+ % let's play safe and not fool around with the depth, if
+ % only because it took a lot of effort to sort out the grid
+ % stuff in the first place
+ \else
+ \ifdim\prevdepth=\newprevdepth
+ \prevdepth\oldprevdepth
+ \fi
+ \fi
+ \fi
+ \ifblankindeed
+ \ifdim1\savedlastskip<1\blankskip\relax
+ % else when \blank[2*groot] + \blank[3*groot] with parskip
+ % equaling 1*groot, gives a groot=\parskip so adding a small
+ % value makes it distinguishable; can also be done at parskip
+ % setting time (better)
+ \global\advance\blankskip \mindimen\relax % = skip
+ % test this on 2* + 3* and parskip groot
+ \ifblanknowhite
+ \global\advance\blankskip -\parskip
+ \else
+ \ifdim\savedlastskip=\parskip
+ \else % force this due to previous comment
+ \ifdim\parskip>\zeropoint\relax
+ \ifdim\blankskip<\parskip\relax
+ \global\blankskip\zeropoint
+ \else
+ \global\advance\blankskip -\parskip
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifblankflexible \else
+ \blankskip1\blankskip
+ \fi
+ \iflocalblankfixed
+ \blankskip1\blankskip
+ \fi
+ \iflocalblankflexible
+ \blankskip1\blankskip
+ \!!plus \skipgluefactor\blankskip
+ \!!minus\skipgluefactor\blankskip
+ \fi
+ \ifdim\lastkern=\noblanksignal\relax % controlled and grid
+ \global\blankindeedfalse
+ \else\ifnum\savedlastpenalty=\noblankpsignal\relax % controlled and grid
+ \global\blankindeedfalse
+ \else\ifgridsnapping\else\ifdim\prevdepth=\newprevdepth
+ \global\blankindeedfalse
+ \fi\fi\fi\fi
+ \ifblankindeed
+ \iffuzzyvskip
+ \removelastfuzzyvskip
+ \fuzzyvskip\blankskip\relax
+ \else
+ \relax\ifdim\savedlastskip=\zeropoint\else
+ \vskip-\savedlastskip
+ \fi
+ \vskip\blankskip\relax
+ \fi
+ \fi
+ \else
+ \iffuzzyvskip
+ \removelastfuzzyvskip
+ \fuzzyvskip\blankskip\relax
+ \else
+ % new, test this on pascal
+ \ifdim\blankskip<\zeropoint
+ \relax\ifdim\savedlastskip=\zeropoint\else
+ \advance\blankskip-\savedlastskip
+ \vskip-\savedlastskip
+ \fi
+ \ifdim\blankskip>\zeropoint
+ \vskip\blankskip
+ \else
+ \vskip\zeropoint
+ \fi
+ \else
+ % also new
+ \ifdim\blankskip=\zeropoint
+ \ifblanknowhite
+ \nowhitespace
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \global\fuzzyvskipfalse
+ \presetindentation}
+
+%D For a long time we had:
+%D
+%D \starttyping
+%D \def\simpledoblank%
+%D {\doifelse{\currentwhitespace}{\v!geen}
+%D {\blank[\currentblank]}
+%D {\blank[\currentwhitespace]}}
+%D \stoptyping
+%D
+%D But Berend de Boer wanted more control, so now we have:
+
+\def\simpledoblank % ...
+ {\doifelse\currentwhitespace\v!none
+ {\blank[\currentblank]}
+ {\blank[\s!default]}}
+
+%D Another useful definition would be:
+%D
+%D \starttyping
+%D \defineblank
+%D [\s!default]
+%D [\v!groot]
+%D \stoptyping
+
+\def\dosetupblank#1% amount are an plain inheritance
+ {\bigskipamount#1\relax
+ \ifblankflexible \else
+ \bigskipamount1\bigskipamount
+ \fi
+ \medskipamount \bigskipamount \divide\medskipamount \plustwo
+ \smallskipamount\bigskipamount \divide\smallskipamount\plusfour}%
+
+\def\complexsetupblank[#1]% more \let's -> this also wil become installable
+ {\ifgridsnapping
+ \blankflexiblefalse
+ \else
+ \ExpandFirstAfter\processallactionsinset
+ [#1]
+ [ \v!flexible=>\blankflexibletrue,
+ \v!fixed=>\blankflexiblefalse]%
+ \fi
+ \ExpandFirstAfter\processallactionsinset
+ [#1]
+ [ \v!flexible=>\dosetupblank\appliedblankskip,
+ \v!fixed=>\dosetupblank\appliedblankskip,
+ \v!line=>\edef\appliedblankskip{\linedistance}%
+ \dosetupblank\appliedblankskip,
+ \v!halfline=>\scratchskip.5\linedistance
+ \edef\appliedblankskip{\the\scratchskip}%
+ \dosetupblank\appliedblankskip,
+ \v!big=>\ifgridsnapping
+ \edef\appliedblankskip{\linedistance}%
+ \dosetupblank\appliedblankskip
+ \fi
+ \let\currentblank\v!big,
+ \v!medium=>\let\currentblank\v!medium,
+ \v!small=>\let\currentblank\v!small,
+ \v!global=>\let\currentblank\v!global,
+ \v!normal=>\dosetupblank\appliedblankskip,
+ \v!standard=>\edef\appliedblankskip{\skipfactor\linedistance}%
+ \dosetupblank\appliedblankskip,
+ \s!default=>\dosetupblank\appliedblankskip,
+ \s!unknown=>\let\appliedblankskip\commalistelement
+ \dosetupblank\appliedblankskip]%
+ \simplesetupwhitespace}
+
+% \definecomplexorsimpleempty\setupblank
+%
+% speed gain: 60 sec -> 30 sec
+
+\definecomplexorsimple\setupblank
+
+\def\simplesetupblank % == snelle \setupblank[\s!default]
+ {\ifgridsnapping
+ \blankflexiblefalse
+ \fi
+ \dosetupblank\appliedblankskip
+ % \let\deblanko\v!big
+ \simplesetupwhitespace}
+
+\def\restorestandardblank% \v!standard
+ {\edef\appliedblankskip{\skipfactor\linedistance}%
+ \dosetupblank\appliedblankskip
+ }%\let\deblanko\v!big}
+
+\def\dodefineblank[#1][#2]%
+ {\def\docommand##1{\setvalue{\??bo##1}{#2}}%
+ \processcommalist[#1]\docommand}
+
+\def\defineblank
+ {\dodoubleargument\dodefineblank}
+
+\def\savecurrentblank
+ {\edef\restorecurrentblank
+ {\bigskipamount\the\bigskipamount
+ \medskipamount\the\medskipamount
+ \smallskipamount\the\smallskipamount
+ \noexpand\def\noexpand\currentblank{\currentblank}%
+ \ifblankflexible
+ \noexpand\blankflexibletrue
+ \else
+ \noexpand\blankflexiblefalse
+ \fi}}
+
+%D Now.
+
+\defineblank [\s!default] [\v!white]
+\defineblank [\v!height] [\strutheight]
+\defineblank [\v!depth] [\strutdepth]
+
+% old implementation
+%
+% \let\currentindentation=\empty
+%
+% \newdimen\ctxparindent
+%
+% \newif\ifindentfirstparagraph % \indentfirstparagraphtrue
+%
+% \def\presetindentation
+% {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}}
+%
+% \definecomplexorsimple\setupindenting
+%
+% \def\complexsetupindenting[#1]%
+% {\processallactionsinset
+% [#1]
+% [ \v!first=>\indentfirstparagraphtrue,
+% \v!next=>\indentfirstparagraphfalse,
+% \s!default=>\simplesetupindenting,
+% \s!unknown=>\edef\currentindentation{\commalistelement}%
+% \simplesetupindenting]}
+%
+% \def\simplesetupindenting
+% {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}%
+% \parindent\ctxparindent\relax}
+%
+% \def\indenting % watch out: \dodo and no \do
+% {\dosingleargument\dodoindenting}
+%
+% \def\dodoindenting[#1]% oeps, we needed a commalist handler here!
+% {\edef\currentindenting{#1}%
+% \processcommacommand[#1]\dododoindenting}
+%
+% \def\dododoindenting#1%
+% {\executeifdefined{\??in:#1}\donothing}
+%
+% \let\currentindenting\empty
+%
+% \def\defineindentingmethod[#1]#2%
+% {\setvalue{\??in:#1}{#2}}
+%
+% \defineindentingmethod [\v!no] {\parindent\ctxparindent\noindent}
+% \defineindentingmethod [\v!not] {\parindent\ctxparindent\noindent}
+%
+% \defineindentingmethod [\v!first] {\indentfirstparagraphtrue}
+% \defineindentingmethod [\v!next] {\indentfirstparagraphfalse}
+%
+% \defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent !
+% \defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent !
+%
+% \defineindentingmethod [\v!never] {\parindent\zeropoint\relax} % no \indent !
+%
+% \def\noindenting{\indenting[\v!no,\v!next]} % was \nietinspringen
+% \def\doindenting{\indenting[\v!yes,\v!first]} % was \welinspringen
+%
+% \def\dochecknextindentation#1% internal one
+% {\checknextindentation[\getvalue{#1\c!indentnext}]}
+%
+% \def\checknextindentation[#1]%
+% {\processaction[#1][%\v!keep=>,
+% \v!yes=>\doindentation,
+% \v!no=>\noindentation,
+% \v!auto=>\autoindentation]}
+%
+% \def\doindentation% too simple
+% {\gdef\checkindentation{\global\indentationtrue}}
+%
+% \ifx\autoindentation\undefined
+% \let\autoindentation\relax
+% \fi
+%
+% \newif\ifindentation \indentationtrue % documenteren, naar buiten
+%
+% \let\checkindentation=\relax
+%
+% \def\donoindentation
+% {\ifdim\parindent=\zeropoint \else
+% \bgroup \setbox\scratchbox\lastbox \egroup
+% \fi}
+%
+% \def\noindentation % made global
+% {\ifinpagebody \else
+% \global\indentationfalse
+% \gdef\checkindentation
+% {\donoindentation
+% \gdef\checkindentation{\global\indentationtrue}}%
+% \fi}
+%
+% \def\nonoindentation % bv bij floats
+% {\ifinpagebody \else
+% \global\indentationtrue
+% \gdef\checkindentation{\global\indentationtrue}%
+% \fi}
+%
+% \def\indentation
+% {\ifvmode \ifdim\parindent=\zeropoint \else
+% % was : \hskip\parindent
+% % can be: \indent
+% % but we test:
+% \noindent\hskip\parindent
+% \fi \fi}
+
+\let\currentindentation\empty % amount/keyword
+% \let\normalindentation \empty % used for reinstating normal indentation
+\let\currentindenting \empty % method
+
+\newdimen\ctxparindent
+
+\newif\ifindentfirstparagraph % \indentfirstparagraphtrue
+
+\chardef\indentingtoggle\zerocount
+
+%D After a blank or comparable situation (left side floats) we
+%D need to check if the next paragraph has to be indented.
+
+\def\presetindentation
+ {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}}
+
+%D This sets up the (normally) global indentation behavior as well
+%D as the amounts.
+
+\definecomplexorsimple\setupindenting
+
+% \def\complexsetupindenting[#1]%
+% {\edef\currentindenting{#1}%
+% \indentfirstparagraphtrue
+% \parindent\ctxparindent
+% \chardef\indentingtoggle\zerocount
+% \processcommalist[#1]\docomplexsetupindenting
+% \ifindentfirstparagraph\else\noindentation\fi % added
+% \toggleindentation}
+
+\indentfirstparagraphtrue
+\parindent\ctxparindent
+\chardef\indentingtoggle\zerocount
+
+% \newtoks\savedeverypar \savedeverypar\everypar
+% \def\restoreeverypar{\everypar\savedeverypar}
+
+% we need a better everypar model: for each option a switch, which we
+% set to false with \forgetall and can enable when needed (context 4);
+% that way we can control the order of execution of options
+
+\def\checkeverypar % currently a hack
+ {\ifzeropt\parindent\else
+ \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}%
+ \fi}
+
+\def\complexsetupindenting[#1]%
+ {\edef\currentindenting{#1}%
+ \doifsomething\currentindenting % handy when a parameter is passed
+ {% not here: \indentfirstparagraphtrue
+ % not here: \parindent\ctxparindent
+ % not here: \chardef\indentingtoggle\zerocount
+ % we use commacommand in order to catch #1 being a command (expanded parameter)
+ \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc
+ \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest
+ \checkeverypar % only when non-empty #1
+ \ifindentfirstparagraph\else\noindentation\fi % added
+ \toggleindentation}}
+
+\def\docomplexsetupindentingA#1%
+ {\edefconvertedargument\!!stringa{#1}%
+ \doifundefined{\??in:\!!stringa}%
+ {\edef\currentindentation{#1}%
+ \let\normalindentation\currentindentation
+ \simplesetupindenting}}
+
+\def\docomplexsetupindentingB#1%
+ {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen
+ \executeifdefined{\??in:\!!stringa}\donothing}
+
+\def\simplesetupindenting % empty case, a it strange, needed this way?
+ {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}}
+
+\def\indenting % kind of obsolete
+ {\dosingleargument\complexsetupindenting}
+
+% use \noindentation to suppress next indentation
+
+\def\defineindentingmethod[#1]#2%
+ {\setvalue{\??in:#1}{#2}}
+
+\defineindentingmethod [\v!no] {\parindent\zeropoint}% was: \ctxparindent\noindent}
+\defineindentingmethod [\v!not] {\parindent\zeropoint}% was: \ctxparindent\noindent}
+
+\defineindentingmethod [\v!first] {\indentfirstparagraphtrue}
+\defineindentingmethod [\v!next] {\indentfirstparagraphfalse}
+
+\defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent !
+\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent !
+
+\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent !
+ \chardef\indentingtoggle\zerocount}
+
+\defineindentingmethod [\v!odd] {\chardef\indentingtoggle\plusone}
+\defineindentingmethod [\v!even] {\chardef\indentingtoggle\plustwo}
+
+\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else
+ \let\currentindentation\normalindentation
+ \simplesetupindenting
+ \fi}
+
+\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue
+ \parindent\zeropoint
+ \chardef\indentingtoggle\zerocount}
+
+\def\noindenting{\indenting[\v!no, \v!next ]}
+\def\doindenting{\indenting[\v!yes,\v!first]}
+
+%D This one sets up the local indentation behaviour (i.e. either or not
+%D a next paragraph will be indented).
+
+\def\dochecknextindentation#1% internal one
+ {\checknextindentation[\getvalue{#1\c!indentnext}]}
+
+\def\checknextindentation[#1]%
+ {\processaction
+ [#1]
+ [%\v!keep=>,
+ \v!yes=>\doindentation,
+ \v!no=>\noindentation,
+ \v!auto=>\autoindentation]}
+
+%D Here come the handlers.
+
+\newif\ifindentation \indentationtrue % documenteren, naar buiten
+
+\let\checkindentation\relax
+
+\ifx\autoindentation\undefined \let\autoindentation\relax \fi % hook
+
+\def\doindentation
+ {\gdef\checkindentation{\global\indentationtrue}}
+
+\def\noindentation % made global
+ {\ifinpagebody \else
+ \global\indentationfalse
+ \gdef\checkindentation
+ {\donoindentation
+ \gdef\checkindentation{\global\indentationtrue}}%
+ \fi}
+
+\def\nonoindentation % bv bij floats
+ {\ifinpagebody \else
+ \global\indentationtrue
+ \gdef\checkindentation{\global\indentationtrue}%
+ \fi}
+
+\def\donoindentation
+ {\ifdim\parindent=\zeropoint \else
+ \bgroup \setbox\scratchbox\lastbox \egroup
+ \fi}
+
+\def\indentation
+ {\ifvmode \ifdim\parindent=\zeropoint \else
+ % was : \hskip\parindent
+ % can be: \indent
+ % but we test:
+ \noindent\hskip\parindent
+ \fi \fi}
+
+\def\toggleindentation
+ {\ifcase\indentingtoggle
+ % nothing
+ \or
+ \notoggleindentation
+ \or
+ \dotoggleindentation
+ \fi}
+
+\def\dokillindentation
+ {\gdef\checkindentation{\global\indentationfalse\donoindentation}}
+
+\def\dotoggleindentation
+ {\gdef\checkindentation{\global\indentationfalse\notoggleindentation\donoindentation}}
+
+\def\notoggleindentation
+ {\gdef\checkindentation{\global\indentationtrue\dotoggleindentation}}
+
+\appendtoks
+ \pushmacro\checkindentation
+ \pushmacro\ifindentation
+\to \everypushsomestate
+
+\appendtoks
+ \popmacro\ifindentation
+ \popmacro\checkindentation
+\to \everypopsomestate
+
+% we need to save the state if we want to adapt behaviour to empty lines
+%
+% \def\setlasthvmode
+% {\global\chardef\savedhvmode\ifhmode\plusone\else\ifvmode\plustwo\else\zerocount\fi\fi}
+%
+% \def\resetlasthvmode
+% {\global\chardef\savedhvmode\zerocount}
+%
+% \chardef\savedhvmode\zerocount
+
+% This is a user requested hack (using the auto-hook).
+
+\chardef\recheckindentationmode\zerocount
+
+\def\dontrechecknextindentation
+ {\global\chardef\recheckindentationmode\zerocount}
+
+\def\dorechecknextindentation
+ {\ifcase\recheckindentationmode
+ % nothing
+ \or
+ \dontrechecknextindentation
+ \expandafter\doautoindentation
+ \fi}
+
+\def\doautoindentation
+ {\doifnextcharelse\par\donothing\noindentation}
+
+\def\autoindentation
+ {\global\chardef\recheckindentationmode\plusone}
+
+%D An example of usage:
+%D
+%D \starttyping
+%D \setupindenting[small,yes]
+%D
+%D \setupitemize [indentnext=auto]
+%D \setuptyping [indentnext=auto]
+%D \setupformulas[indentnext=auto]
+%D
+%D \input tufte
+%D
+%D \startitemize
+%D \item itemize
+%D \stopitemize
+%D \input tufte
+%D
+%D \startitemize
+%D \item itemize
+%D \stopitemize
+%D
+%D \input tufte
+%D
+%D \startitemize
+%D \item itemize
+%D \stopitemize
+%D
+%D \page
+%D
+%D \input tufte
+%D
+%D \starttyping
+%D verbatim
+%D \stoptyping
+%D \input tufte
+%D
+%D \starttyping
+%D verbatim
+%D \stoptyping
+%D
+%D \input tufte
+%D
+%D \starttyping
+%D verbatim
+%D \stoptyping
+%D
+%D \page
+%D
+%D \input tufte
+%D
+%D \startformula
+%D a = b
+%D \stopformula
+%D \input tufte
+%D
+%D \startformula
+%D a = b
+%D \stopformula
+%D
+%D \input tufte
+%D
+%D \startformula
+%D a = b
+%D \stopformula
+
+
+%D \macros
+%D {frenchspacing,nonfrenchspacing}
+%D
+%D Smehow \type{\frenchspacing} can lead to hyphenation between
+%D dashes so we now have \type {\newfrenchspacing} (moved from
+%D \type {syst-chr}).
+
+%D Hm ... todo:
+
+\sfcode`\)=0
+\sfcode`\'=0
+\sfcode`\]=0
+
+\def\setfrenchspacing#1%
+ {\sfcode`\.#1 \sfcode`\,#1\relax
+ \sfcode`\?#1 \sfcode`\!#1\relax
+ \sfcode`\:#1 \sfcode`\;#1\relax}
+
+\def\frenchspacing
+ {\setfrenchspacing{1000}}
+
+\def\resetfrenchspacing
+ {\sfcode`\.3000 \sfcode`\,1250
+ \sfcode`\?3000 \sfcode`\!3000
+ \sfcode`\:2000 \sfcode`\;1500 }
+
+\def\frenchspacing {\setfrenchspacing{1000}}
+\def\newfrenchspacing{\setfrenchspacing{1050}}
+\def\nonfrenchspacing{\resetfrenchspacing}
+
+\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}}
+
+\definespacingmethod[\v!packed]{\newfrenchspacing}
+\definespacingmethod[\v!broad ]{\nonfrenchspacing}
+
+\def\complexsetupspacing[#1]%
+ {\executeifdefined{\??sg\??sg#1}\relax
+ \updateraggedskips}
+
+\def\simplesetupspacing
+ {\updateraggedskips}
+
+\definecomplexorsimple\setupspacing
+
+\let\normalspaceprimitive=\ % space-comment is really needed else \<newline>
+
+\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\normalspaceprimitive}
+
+\letcatcodecommand \ctxcatcodes `\~ \nonbreakablespace
+
+\def\space { }
+\def\removelastspace{\ifhmode\unskip\fi}
+\def\nospace {\removelastspace\ignorespaces}
+
+% in tables we need:
+%
+% \def\fixedspace {\hskip.5em\relax}
+%
+% but, since not all fonts have .5em digits:
+
+\unexpanded\def\fixedspace
+ {\setbox\scratchbox\normalhbox{\mathortext{0}{0}}%
+ \hskip\wd\scratchbox\relax}
+
+\def\fixedspaces
+ {\letcatcodecommand \ctxcatcodes `\~ \fixedspace}
+
+\def\removeunwantedspaces
+ {\ifhmode % we also need to unskip 0pt skips
+ \unskip\unskip\unskip\unskip\unskip
+ \unskip\unskip\unskip\unskip\unskip
+ \fi}
+
+\appendtoks
+ \let~\space
+ \let\ \space
+\to\simplifiedcommands
+
+% still not fixed in aleph / luatex
+%
+% \def\removeunwantedspaces
+% {\ifhmode \ifnum\lastnodetype=\@@gluenode
+% \unskip \@EAEAEA\removeunwantedspaces
+% \fi \fi}
+
+%D For old time sake, will disappear soon.
+
+\let\hardespatie\fixedspace
+\let\geenspatie \nospace
+
+% \startbuffer
+% \startlines \tt \fixedspaces
+% 0~1~~2~~~3~~~~4~~~~~5
+% 0~~~~~~~~~~~~~~~~~~~5
+% $0~1~~2~~~3~~~~4~~~~~5$
+% $0~~~~~~~~~~~~~~~~~~~5$
+% \stoplines
+%
+% \starttabulate[|~|]
+% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \NR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \NR
+% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \NR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \NR
+% \stoptabulate
+%
+% \starttable[||]
+% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \AR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \AR
+% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \AR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \AR
+% \stoptable
+% \stopbuffer
+%
+% \setupbodyfont[cmr] \getbuffer
+% \setupbodyfont[lbr] \getbuffer
+
+\def\packed
+ {\nointerlineskip}
+
+\def\godown[#1]%
+ {\relax
+ \ifhmode\endgraf\fi
+ \ifvmode\nointerlineskip\vskip#1\relax\fi}
+
+%D A couple of plain macros:
+
+\ifx\thinspace\undefined
+
+ \def\thinspace {\kern .16667em }
+ \def\negthinspace{\kern-.16667em }
+ \def\enspace {\kern .5em }
+
+ \def\thinspace {\kern .16667\emwidth}
+ \def\negthinspace{\kern-.16667\emwidth}
+ \def\enspace {\kern .5\emwidth}
+
+\fi
+
+\ifx\quad\undefined
+
+ \def\enskip{\hskip.5em\relax}
+ \def\quad {\hskip 1em\relax}
+ \def\qquad {\hskip 2em\relax}
+
+ \def\enskip{\hskip.5\emwidth}
+ \def\quad {\hskip \emwidth}
+ \def\qquad {\hskip 2\emwidth}
+
+\fi
+
+\let\emspace\quad
+
+\ifx\smallskip\undefined
+
+ \def\smallskip{\vskip\smallskipamount}
+ \def\medskip {\vskip\medskipamount}
+ \def\bigskip {\vskip\bigskipamount}
+
+\fi
+
+\ifx\allowbreak\undefined
+
+ \def\break {\penalty\ifhmode-\plustenthousand\else\ejectpenalty\fi}
+ \def\nobreak {\penalty \plustenthousand}
+ \def\allowbreak{\penalty \zeropoint}
+ \def\filbreak {\par\vfil\penalty-200\vfilneg}
+ \def\goodbreak {\par\penalty-500 }
+
+\fi
+
+%D Made slightly more readable:
+
+\ifx\vglue\undefined
+
+ \def\vglue {\afterassignment\dovglue\scratchskip=}
+ \def\hglue {\afterassignment\dohglue\scratchskip=}
+ \def\topglue{\nointerlineskip\vglue-\topskip\vglue}
+
+ \def\dovglue
+ {\par
+ \scratchdimen\prevdepth
+ \hrule\!!height\zeropoint
+ \nobreak\vskip\scratchskip
+ \prevdepth\scratchdimen}
+
+ \def\dohglue
+ {\dontleavehmode % \leavevmode
+ \scratchcounter\spacefactor
+ \vrule\!!width\zeropoint
+ \nobreak\hskip\scratchskip
+ \spacefactor\scratchcounter}
+
+\fi
+
+\ifx\eject\undefined
+
+ \def\eject{\par\break}
+
+\fi
+
+\ifx\supereject\undefined
+
+ \def\supereject{\par\penalty\superpenalty}
+
+\fi
+
+\ifx\dosupereject\undefined
+
+ \def\dosupereject
+ {\ifnum\insertpenalties>\zerocount % something is being held over
+ \line{}
+ \kern-\topskip
+ \nobreak
+ \vfill\supereject
+ \fi}
+
+\fi
+
+%D We adapt plain's \type {\removelastskip} a bit:
+
+\ifx\removelastskip\undefined
+
+ \def\removelastskip
+ {\ifvmode \ifdim\lastskip=\zeropoint \else
+ \vskip-\lastskip
+ \fi \fi}
+
+\fi
+
+\ifx\smallbreak\undefined
+
+\def\smallbreak
+ {\par
+ \ifdim\lastskip<\smallskipamount
+ \removelastskip
+ \penalty-50
+ \smallskip
+ \fi}
+
+\def\medbreak
+ {\par
+ \ifdim\lastskip<\medskipamount
+ \removelastskip
+ \penalty-100
+ \medskip
+ \fi}
+
+\def\bigbreak
+ {\par
+ \ifdim\lastskip<\bigskipamount
+ \removelastskip
+ \penalty-200
+ \bigskip
+ \fi}
+
+\fi
+
+\newskip\ctxparskip \ctxparskip\zeropoint
+
+\newconditional \flexiblewhitespace \settrue\flexiblewhitespace
+
+\def\blankokleinmaat {\smallskipamount}
+\def\blankomiddelmaat {\medskipamount}
+\def\blankogrootmaat {\bigskipamount}
+\def\currentwhitespace {\zeropoint}
+
+\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]%
+ {\edef\nextcurrentwhitespace{#1}%
+ \ifx\nextcurrentwhitespace\empty
+ \simplesetupwhitespace
+ \else
+ \let\currentwhitespace\nextcurrentwhitespace
+ \dosetupwhitespace
+ \fi}
+
+\def\dosetupwhitespace % quick test for no list
+ {\doifdefinedelse{\??ws\??ws\currentwhitespace}% no ifcsname due to nested \lineheight
+ {\getvalue{\??ws\??ws\currentwhitespace}}%
+ {\processcommacommand[\currentwhitespace]\dowhitespacemethod}%
+ \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
+
+\def\dodosetupwhitespace
+ {\ifgridsnapping
+ \setfalse\flexiblewhitespace
+ \ctxparskip1\ctxparskip
+ \ifdim\ctxparskip>\zeropoint
+ \ifcase\baselinegridmode
+ \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \or
+ \ifdim\scratchdimen=\baselineskip % maybe range
+ \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \else
+ \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax
+ \fi
+ \else
+ \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \fi
+ \fi
+ \else
+ \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi
+ \fi
+ \parskip\ctxparskip}
+
+\definesystemvariable {ws} % whitespace
+
+\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#1}{#2}}
+
+\definewhitespacemethod [\v!fix] {}
+\definewhitespacemethod [\v!fixed] {\setfalse\flexiblewhitespace}
+\definewhitespacemethod [\v!flexible] {\settrue\flexiblewhitespace}
+\definewhitespacemethod [\v!line] {\ctxparskip \baselineskip}
+\definewhitespacemethod [\v!halfline] {\ctxparskip.5\baselineskip}
+\definewhitespacemethod [\v!none] {\ctxparskip \zeropoint}
+\definewhitespacemethod [\v!big] {\ctxparskip \bigskipamount}
+\definewhitespacemethod [\v!medium] {\ctxparskip \medskipamount}
+\definewhitespacemethod [\v!small] {\ctxparskip \smallskipamount}
+
+\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin}
+
+% \def\dowhitespacemethod#1%
+% {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax}
+
+\def\dowhitespacemethod#1% \doifdefined because of \lineheight
+ {\doifdefinedelse{\??ws\??ws#1}{\getvalue{\??ws\??ws#1}}{\ctxparskip#1}\relax}
+
+\def\nowhitespace
+ {\ifdim\parskip>\zeropoint\relax
+ \ifdim\lastskip=-\parskip
+ \else
+ \vskip-\parskip
+ \fi
+ \fi}
+
+\def\nowhitespaceunlessskip
+ {\ifdim\lastskip>\zeropoint \else
+ \nowhitespace
+ \fi}
+
+\def\redowhitespace
+ {\ifdim\lastskip>-\parskip \else
+ \vskip\parskip
+ \fi}
+
+\def\savecurrentwhitespace
+ {\edef\restorecurrentwhitespace
+ {\ctxparskip\the\ctxparskip
+ \parskip\the\parskip
+ \noexpand\def\noexpand\currentwhitespace{\currentwhitespace}%
+ \ifconditional\flexiblewhitespace
+ \noexpand\settrue\flexiblewhitespace
+ \else
+ \noexpand\setfalse\flexiblewhitespace
+ \fi}}
+
+% deze variant is nodig binnen \startopelkaar
+% steeds testen:
+%
+% \hoofdstuk{..}
+% \plaatslijst[..]
+% \hoofdstuk{..}
+% \input tufte
+%
+% met/zonder witruimte
+
+\def\whitespace
+ {\par
+ \ifdim\parskip>\zeropoint\relax
+ %\ifdim\lastskip>\parskip \else
+ % \removelastskip interferes with blanko blokkeer en klein
+ \vskip\parskip
+ %\fi
+ \fi}
+
+\def\nonoblanko[#1]%
+ {\par}
+
+\def\noblanko
+ {\dosingleempty\nonoblanko}
+
+% De onderstaande macro handelt ook de situatie dat er geen
+% tekst tussen \start ... \stop is geplaatst. Daartoe wordt de
+% laatste skip over de lege tekst heen gehaald. Dit komt goed
+% van pas bij het plaatsen van (mogelijk lege) lijsten.
+
+\newif\ifopelkaar
+
+\newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt}
+\def\lastdoneparskip {0pt}
+
+\def\startpacked
+ {\dosingleempty\dostartpacked}
+
+\def\dostartpacked[#1]% nesting afvangen
+ {\par
+ \ifvmode
+ \edef\lastdoneparskip {\the\lastskip}%
+ \edef\lastdoneprevdepth{\the\prevdepth}% zeer recent toegevoegd
+ \ifdim\prevdepth=-\thousandpoint % toegevoegd omdat binnen
+ \else % een vbox een extra skip
+ \whitespace % ongewenst is; dit kan
+ \baselinecorrection %% zie in \placeregister[n=1]
+ \vskip\noparskipsignal % waarschijnlijk ook in
+ \fi % blanko blokkeer
+ \bgroup
+ \doifelse{#1}\v!blank
+ \opelkaarfalse
+ \opelkaartrue
+ \blank[\v!disable] % dit is nog niet ok, gaat fout
+ \setupwhitespace[\v!none] % bovenin vtop (dwz, baseline)
+ \fi}
+
+\def\stoppacked
+ {\par
+ \ifvmode
+ \egroup
+ \ifdim\lastskip=\noparskipsignal\relax
+ \removelastskip
+ \nowhitespace
+ \vskip-\lastdoneparskip
+ \vskip+\lastdoneparskip
+ \prevdepth-\lastdoneprevdepth % zeer recent toegevoegd
+ \fi
+ \fi}
+
+\def\startunpacked
+ {\blank
+ \leavevmode
+ \bgroup}
+
+\def\stopunpacked
+ {\egroup
+ \blank}
+
+% De onderstaande macro's moeten nog eens nader worden uitgewerkt.
+% Ze spelen een rol bij de spatiering rond omkaderde teksten
+% en/of boxen zonder diepte.
+
+\def\toonregelcorrectie{\showbaselinecorrection}
+\def\regelcorrectie {\baselinecorrection}
+
+% \prevdepth crosses pageboundaries!
+%
+% todo: a version that works ok inside a box
+
+\let\doaroundlinecorrection\relax
+
+\def\startlinecorrection
+ {\dodoubleempty\dostartlinecorrection}
+
+\def\dostartlinecorrection[#1][#2]% #2 gobbles spaces
+ {\bgroup
+ \processaction
+ [#1]
+ [ \v!blank=>\let\doaroundlinecorrection\blank,
+ \s!default=>\let\doaroundlinecorrection\relax,
+ \s!unknown=>{\def\doaroundlinecorrection{\blank[#1]}}]%
+ \doaroundlinecorrection
+ \startbaselinecorrection
+ \offbaselinecorrection
+ \ignorespaces}
+
+\def\stoplinecorrection
+ {\stopbaselinecorrection
+ \doaroundlinecorrection
+ \egroup}
+
+\def\correctwhitespace
+ {\dowithnextbox
+ {\startbaselinecorrection
+ \flushnextbox
+ \stopbaselinecorrection}%
+ \vbox}
+
+\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}}
+\def\horizontalstrut{\normalhbox {\strut}}
+
+% Hieronder volgen enkele instellingen en macro's ten behoeve
+% van de interlinie en \strut. De waarden 2.8, 0.07, 0.72 en
+% 0.28 zijn ooit eens ontleend aan INRS-TEX en moeten wellicht
+% nog eens instelbaar worden.
+%
+% \lineheight : de hoogte van een regel
+% \spacing{getal} : instellen interlinie
+% \normalbaselines : instellen regelafstend
+%
+% \setstrut : instellen \strut
+% \setnostrut : resetten \strut, \endstrut, \begstrut
+%
+% \setteststrut : instellen zichtbare struts
+% \resetteststrut : instellen onzichtbare struts
+%
+% \setfontparameters : instellen na fontset
+%
+% De hoogte van een regel (\lineheight) is gelijk aan de
+% som van de hoogte (\ht) en diepte (\dp) van \strutbox.
+%
+% \strut : denkbeeldig blokje met hoogte en diepte
+%
+% Een \hbox kan als deze aan het begin van een regel staat
+% een breedte \hsize krijgen. Dit is soms te voorkomen met het
+% commando \leavevmode. Binnen een \vbox geeft dit echter
+% niet altijd het gewenste resultaat, vandaar het commando
+%
+% \leaveoutervmode
+
+% Pas op: niet zomaar \topskip en \baselineskip aanpassen
+% en zeker niet \widowpenalty. Dit kan ernstige gevolgen
+% hebben voor kolommen.
+%
+% Enige glue kan op zich geen kwaad, echter als blanko=vast,
+% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook
+% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet,
+% omdat een positieve glue eindeloos rekbaar is.
+
+\newdimen\strutdimen
+\newdimen\lineheight
+\newdimen\openlineheight
+\newdimen\openstrutheight
+\newdimen\openstrutdepth
+\newdimen\topskipgap
+\newdimen\struttotal
+
+\def\strutheightfactor {.72}
+\def\strutdepthfactor {.28}
+
+\def\baselinefactor {2.8}
+\def\baselinegluefactor {0}
+
+\def\minimumstrutheight {0pt}
+\def\minimumstrutdepth {0pt}
+
+\def\normallineheight {\baselinefactor ex}
+\def\minimumlinedistance {\lineskip}
+
+\def\strutheight {0pt}
+\def\strutdepth {0pt}
+\def\strutwidth {0pt}
+
+\def\spacingfactor {1}
+
+\def\topskipfactor {1.0}
+\def\maxdepthfactor {0.5}
+
+\def\systemtopskipfactor {\topskipfactor}
+\def\systemmaxdepthfactor {\maxdepthfactor}
+
+% De onderstaande definitie wordt in de font-module overruled
+
+\ifdefined\globalbodyfontsize\else
+ \newdimen\globalbodyfontsize
+ \globalbodyfontsize=12pt
+\fi
+
+\ifx\normalizedbodyfontsize\undefined
+ \def\normalizedbodyfontsize{12pt}
+\fi
+
+% door een \dimen. Dit is geen probleem omdat (1) de default
+% korpsgrootte 12pt is en (2) de fonts nog niet geladen zijn
+% en de instellingen bij het laden nogmaals plaatsvinden.
+
+% \def\topskipcorrection
+% {\ifdim\topskip>\openstrutheight
+% % == \vskip\topskipgap
+% \vskip\topskip
+% \vskip-\openstrutheight
+% \fi
+% \verticalstrut
+% \vskip-\struttotal}
+
+\def\topskipcorrection
+ {\simpletopskipcorrection
+ \vskip-\struttotal
+ \verticalstrut}
+
+\def\simpletopskipcorrection
+ {\ifdim\topskip>\openstrutheight
+ % == \vskip\topskipgap
+ \vskip\topskip
+ \vskip-\openstrutheight
+ \fi}
+
+% \def\settopskip % the extra test is needed for the lbr family
+% {\topskip\systemtopskipfactor\globalbodyfontsize
+% \ifgridsnapping \else
+% \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi
+% \fi
+% \relax % the skip
+% \topskipgap\topskip
+% \advance\topskipgap -\openstrutheight\relax
+% \ifdim\topskip<\strutheightfactor\openlineheight
+% \topskip\strutheightfactor\openlineheight\relax
+% \fi}
+
+\def\settopskip % the extra test is needed for the lbr family
+ {\topskip\systemtopskipfactor\globalbodyfontsize
+ \ifgridsnapping \else
+ \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi
+ \fi
+ \relax % the skip
+ \topskipgap\topskip
+ \advance\topskipgap -\openstrutheight\relax
+\ifdim\minimumstrutheight>\zeropoint
+ \ifdim\topskip<\minimumstrutheight
+ \topskip\minimumstrutheight\relax
+ \fi
+\else
+ \ifdim\topskip<\strutheightfactor\openlineheight
+ \topskip\strutheightfactor\openlineheight\relax
+ \fi
+\fi}
+
+\def\setmaxdepth
+ {\maxdepth\systemmaxdepthfactor\globalbodyfontsize}
+
+\def\normalbaselines
+ {\baselineskip \normalbaselineskip
+ \lineskip \normallineskip
+ \lineskiplimit\normallineskiplimit}
+
+% \def\setnormalbaselines
+% {\ifdim\normallineheight>\zeropoint
+% \lineheight\normallineheight
+% \fi
+% \openlineheight\spacingfactor\lineheight
+% \openstrutheight\strutheightfactor\openlineheight
+% \openstrutdepth \strutdepthfactor \openlineheight
+% \normalbaselineskip\openlineheight
+% \!!plus\baselinegluefactor\openlineheight
+% \!!minus\baselinegluefactor\openlineheight
+% \normallineskip\minimumlinedistance\relax % \onepoint\relax
+% \normallineskiplimit\zeropoint\relax
+% \normalbaselines}
+
+\def\setnormalbaselines
+ {\ifdim\normallineheight>\zeropoint
+ \lineheight\normallineheight
+ \fi
+ \openlineheight\spacingfactor\lineheight
+ \openstrutheight \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight % new
+ \else
+ \strutheightfactor\openlineheight
+ \fi
+ \openstrutdepth \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth % new
+ \else
+ \strutdepthfactor \openlineheight
+ \fi
+ \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint
+ \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new
+ \fi
+ \normalbaselineskip\openlineheight
+ \ifgridsnapping\else
+ \!!plus \baselinegluefactor\openlineheight
+ \!!minus\baselinegluefactor\openlineheight
+ \fi
+ \normallineskip\minimumlinedistance\relax % \onepoint\relax
+ \normallineskiplimit\zeropoint\relax
+ \normalbaselines}
+
+% \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
+ \ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{#1}\fi
+ \edef\spacingfactor{1}%
+ \else
+ \edef\spacingfactor{#1}%
+ \fi
+ %\setspacingfactor\systemtopskipfactor \topskipfactor {#1}% why no \spacingfactor ?
+ %\setspacingfactor\systemmaxdepthfactor\maxdepthfactor{#1}% why no \spacingfactor ?
+ \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}%
+ \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}%
+ \setnormalbaselines
+ \setstrut}
+
+%D Sometimes one needs to freeze the interlinespacing
+%D
+%D \starttyping
+%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf}
+%D \stoptyping
+
+\let\restoreinterlinespace\relax
+
+\def\saveinterlinespace
+ {\edef\restoreinterlinespace
+ {\lineheight \the\lineheight
+ \openstrutheight \the\openstrutheight
+ \openstrutdepth \the\openstrutdepth
+ \openlineheight \the\openlineheight
+ \normalbaselineskip \the\normalbaselineskip
+ \normallineskip \the\normallineskip
+ \normallineskiplimit\the\normallineskiplimit
+ \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}%
+ \noexpand\normalbaselines}}
+
+% plain definition:
+%
+% \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+%
+% could be:
+%
+% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+
+\ifx\strutbox\undefined
+
+ \newbox\strutbox
+
+ \setbox\strutbox=\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint}
+
+ %\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+ \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+
+\fi
+
+\let\normalstrut\strut
+
+% 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
+% \let\strut=\normalstrut
+% \setbox\strutbox=\normalhbox
+% {\normalhbox
+% {\vrule
+% \!!width \strutwidth
+% \!!height \strutheight
+% \!!depth \strutdepth
+% \normalkern-\strutwidth}}}
+
+% \def\setstrut
+% {\setstrutdimen\strutheight\strutheightfactor\spacingfactor
+% \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor
+% \dosetstrut}
+
+% \def\setstrut
+% {\strutdimen\normallineheight
+% \strutdimen\strutheightfactor\strutdimen
+% \strutdimen\spacingfactor\strutdimen
+% \edef\strutheight{\the\strutdimen}%
+% \strutdimen\normallineheight
+% \ifgridsnapping
+% \advance\strutdimen-\strutheight
+% \else
+% \strutdimen\strutdepthfactor\strutdimen
+% \strutdimen\spacingfactor\strutdimen
+% \fi
+% \edef\strutdepth{\the\strutdimen}%
+% \dosetstrut}
+
+% interesting, strutdepth is 4.05064pt vs 4.05066pt depending on grid
+% nasty rounding problem
+
+% \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
+ \edef\strutheight
+ {\the\dimexpr\spacingfactor\dimexpr
+ \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight
+ \else
+ \strutheightfactor\dimexpr\normallineheight
+ \fi}%
+ % depth
+ \edef\strutdepth
+ {\the\dimexpr
+ \ifgridsnapping
+ \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth
+ \else
+ \normallineheight-\strutheight
+ \fi
+ \else
+ \spacingfactor\dimexpr
+ \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth
+ \else
+ \strutdepthfactor\dimexpr\normallineheight
+ \fi
+ \fi}%
+ % finish
+ \dosetstrut}
+
+\unexpanded\def\setcharstrut#1%
+ {\setbox\strutbox\normalhbox{#1}%
+ \edef\strutheight{\the\strutht}%
+ \edef\strutdepth {\the\strutdp}%
+ \dosetstrut}
+
+% \def\setfontstrut
+% {\setcharstrut{(}}
+%
+% better, since some fonts have small (but descending Q etc)
+
+\unexpanded\def\setfontstrut
+ {\setcharstrut{(gplQT}}
+
+\unexpanded\def\setcapstrut% could be M, but Q has descender
+ {\setcharstrut{Q}}
+
+%D Handy for math (used in mathml):
+
+\def\charhtstrut
+ {\begingroup
+ \setcharstrut{GJY}%
+ \vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht
+ \endgroup}
+
+\def\chardpstrut
+ {\begingroup
+ \setcharstrut{gjy}%
+ \vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint
+ \endgroup}
+
+%D Centered looks nicer:
+
+% \def\dosetstrut
+% {\let\strut\normalstrut
+% \setbox\strutbox\normalhbox
+% {\normalhbox to \zeropoint
+% {% \hss % new, will be option
+% \vrule
+% \!!width \strutwidth
+% \!!height\strutheight
+% \!!depth \strutdepth
+% \hss}}%
+% \struttotal\dimexpr\strutht+\strutdp\relax}
+%
+% because of all the callbacks in mkiv, we avoid unnecessary boxes ...
+% maybe use an attribute so that we can tag boxes that don't need a
+% treatment; tests with using an attribute so far have shown that
+% it's slower because testing the attribute takes time too
+
+\def\dosetstrut
+ {\let\strut\normalstrut
+ \ifdim\strutwidth=\zeropoint
+ \setbox\strutbox\normalhbox
+ {\vrule
+ \!!width \zeropoint
+ \!!height\strutheight
+ \!!depth \strutdepth}%
+ \else
+ \setbox\strutbox\normalhbox
+ {\normalhbox to \zeropoint
+ {% \hss % new, will be option
+ \vrule
+ \!!width \strutwidth
+ \!!height\strutheight
+ \!!depth \strutdepth
+ \hss}}%
+ \fi
+ \struttotal\dimexpr\strutht+\strutdp\relax}
+
+%D The dimen \type {\struttotal} holds the exact size of the
+%D strut; occasionally a one scaled point difference can show
+%D up with the lineheight.
+
+%D Sometimes a capstrut comes in handy
+%D
+%D \starttabulate[|Tl|l|l|]
+%D \NC yes \NC normal strut \NC {\showstruts\setupstrut[yes]\strut} \NC \NR
+%D \NC no \NC no strut \NC {\showstruts\setupstrut[no]\strut} \NC \NR
+%D \NC kap \NC a capital strut (i.e. Q) \NC {\showstruts\setupstrut[cap]\strut} \NC \NR
+%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR
+%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR
+%D \stoptabulate
+
+\def\setupstrut
+ {\dosingleempty\dosetupstrut}
+
+\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut
+ {\processaction
+ [#1]
+ [ \v!yes=>\setstrut,
+ \v!auto=>\setautostrut,
+ \v!no=>\setnostrut,
+ \v!cap=>\setcapstrut,
+ \v!fit=>\setfontstrut,
+ \v!line=>\setstrut,
+ \s!default=>\setstrut,
+ \s!unknown=>\setcharstrut\commalistelement]}
+
+\def\setteststrut
+ {\def\strutwidth{.8pt}%
+ \setstrut}
+
+\def\autostrutfactor{1.1}
+
+\def\setautostrut
+ {\begingroup
+ \setbox\scratchbox\copy\strutbox
+ \setstrut
+ \ifdim\ht\strutbox>\autostrutfactor\ht\scratchbox
+ \endgroup \setstrut
+ \else\ifdim\dp\strutbox>\autostrutfactor\dp\scratchbox
+ \endgroup \setstrut
+ \else
+ \endgroup
+ \fi\fi}
+
+% simple version
+%
+% \def\begstrut
+% {\relax\ifcase\strutht\else
+% \strut
+% \normalpenalty\plustenthousand
+% \normalhskip\zeropoint
+% \ignorespaces
+% \fi}
+%
+% \def\endstrut
+% {\relax\ifhmode\ifcase\strutht\else
+% \removeunwantedspaces
+% \normalpenalty\plustenthousand
+% \normalhskip\zeropoint
+% \strut
+% \fi\fi}
+
+% when enabled, sigstruts will remove themselves if nothing
+% goes inbetween
+
+\newsignal\strutsignal \setfalse\sigstruts
+
+\def\begstrut
+ {\relax\ifcase\strutht\else
+ \ifconditional\sigstruts
+ \noindent\horizontalstrut
+ \normalpenalty\plustenthousand
+ \normalhskip-\strutsignal
+ \normalhskip\strutsignal
+ \else
+ \strut
+ \normalpenalty\plustenthousand
+ \normalhskip\zeropoint
+ \fi
+ \expandafter \ignorespaces
+ \fi}
+
+\def\endstrut
+ {\relax\ifhmode\ifcase\strutht\else
+ \ifconditional\sigstruts
+ \ifdim\lastskip=\strutsignal
+ \unskip\unskip\unpenalty\setbox\scratchbox\lastbox
+ \else
+ \normalpenalty\plustenthousand
+ \normalhskip\zeropoint
+ \strut
+ \fi
+ \else
+ \removeunwantedspaces
+ \normalpenalty\plustenthousand
+ \normalhskip\zeropoint
+ \strut
+ \fi
+ \fi\fi}
+
+\newbox\nostrutbox \setbox\nostrutbox\normalhbox{} % {\normalhbox{}}
+
+\def\setnostrut
+ {\setbox\strutbox\copy\nostrutbox
+ \let\strut\empty
+ \let\endstrut\empty
+ \let\begstrut\empty
+ \let\crlfplaceholder\empty}
+
+% unsave:
+%
+% \def\pseudostrut
+% {\bgroup
+% \setnostrut
+% \normalstrut
+% \egroup}
+%
+% try:
+%
+% \startchemie
+% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C]
+% \stopchemie
+%
+% so:
+
+\def\pseudostrut
+ {\noindent} % better: \dontleavehmode
+
+\let\pseudobegstrut\pseudostrut
+
+\let\pseudoendstrut\removeunwantedspaces
+
+\def\resetteststrut
+ {\let\strutwidth\zeropoint
+ \setstrut}
+
+\ifx\setfontparameters\undefined
+ % problems ! ! ! !
+ \def\setfontparameters{\the\everybodyfont}
+\fi
+
+%D Handy:
+
+\def\baselinedistance{\the\lineheight}
+
+%D We need \type{\normaloffinterlineskip} because the new
+%D definition contains an assignment, and |<|don't ask me
+%D why|>| this assignment gives troubles in for instance the
+%D visual debugger.
+
+%D The plain ones:
+
+\def\offinterlineskip
+ {\baselineskip-\thousandpoint
+ \lineskip\zeropoint
+ \lineskiplimit\maxdimen}
+
+\def\nointerlineskip
+ {\prevdepth-\thousandpoint}
+
+\let\normaloffinterlineskip=\offinterlineskip % knuth's original
+
+%D My own one:
+
+\def\offinterlineskip
+ {\ifdim\baselineskip>\zeropoint
+ \edef\oninterlineskip
+ {\baselineskip\the\baselineskip
+ \lineskip\the\lineskip
+ \lineskiplimit\the\lineskiplimit
+ \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}%
+ \else
+ \let\oninterlineskip\setnormalbaselines
+ \fi
+ \normaloffinterlineskip}
+
+\let\oninterlineskip=\relax
+
+\def\leaveoutervmode
+ {\ifvmode\ifinner\else
+ \leavevmode
+ \fi\fi}
+
+% We stellen enkele penalties anders in dan Plain TEX:
+
+% oud
+%
+% \widowpenalty=\defaultwidowpenalty\relax
+% \clubpenalty =\defaultclubpenalty \relax
+
+\def\resetpenalties#1%
+ {\ifx#1\undefined\else
+ #1\minusone
+ \fi}
+
+\def\setpenalties#1#2#3%
+ {\ifx#1\undefined\else % space before #3 prevents lookahead problems, needed when #3=text
+ #1\numexpr#2+\plusone\relax\space\doexpandedrecurse{\the\numexpr#2\relax}{ #3}\zerocount\relax
+ \fi}
+
+\def\doexpandedrecurse#1#2%
+ {\ifnum#1>\zerocount#2\@EA\doexpandedrecurse\@EA{\the\numexpr#1-1\relax}{#2}\fi}
+
+%D \macros
+%D {keeplinestogether}
+%D
+%D Dirty hack, needed in margin content that can run of a page.
+
+\def\keeplinestogether#1%
+ {\xdef\restoreinterlinepenalty{\global\resetpenalties\interlinepenalties}%
+ \global\setpenalties\interlinepenalties{#1}\plustenthousand}
+
+\newif\ifgridsnapping % to be sure
+
+\def\defaultwidowpenalty {2000} % was: 1000
+\def\defaultclubpenalty {2000} % was: 800
+\def\defaultdisplaywidowpenalty {50}
+\def\defaultbrokenpenalty {100}
+
+\def\defaultgridwidowpenalty {0}
+\def\defaultgridclubpenalty {0}
+\def\defaultgriddisplaywidowpenalty {0}
+\def\defaultgridbrokenpenalty {0}
+
+% The original approach:
+%
+% \def\setdefaultpenalties
+% {\ifgridsnapping
+% \widowpenalty\defaultgridwidowpenalty
+% \clubpenalty \defaultgridclubpenalty
+% \else
+% \widowpenalty\defaultwidowpenalty
+% \clubpenalty \defaultclubpenalty
+% \fi}
+%
+% However, we will use setups:
+
+% to be documented
+
+\def\nopenalties
+ {\widowpenalty \zerocount
+ \clubpenalty \zerocount
+ \brokenpenalty \zerocount
+ \doublehyphendemerits\zerocount
+ \finalhyphendemerits \zerocount
+ \adjdemerits \zerocount}
+
+\def\setdefaultpenalties
+ {\directsetup{\systemsetupsprefix\s!default}}
+
+\startsetups [\systemsetupsprefix\s!reset]
+ \resetpenalties\widowpenalties
+ \resetpenalties\clubpenalties
+ \resetpenalties\interlinepenalties
+\stopsetups
+
+% we use \directsetup because it's faster and we know there is no csl
+
+\startsetups [\systemsetupsprefix\s!default]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \widowpenalty \defaultwidowpenalty
+ \clubpenalty \defaultclubpenalty
+ \displaywidowpenalty\defaultdisplaywidowpenalty
+ \brokenpenalty \defaultbrokenpenalty
+
+\stopsetups
+
+\startsetups [\v!grid] [\systemsetupsprefix\s!default]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \widowpenalty \defaultgridwidowpenalty
+ \clubpenalty \defaultgridclubpenalty
+ \displaywidowpenalty\defaultgriddisplaywidowpenalty
+ \brokenpenalty \defaultgridbrokenpenalty
+
+\stopsetups
+
+% as an illustration:
+
+\startsetups [\systemsetupsprefix\v!strict]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \setpenalties\widowpenalties2\maxdimen
+ \setpenalties\clubpenalties 2\maxdimen
+ \brokenpenalty \maxdimen
+
+\stopsetups
+
+\setdefaultpenalties % will happen later in \setuplayout
+
+% Suggested by GB (not the name -):
+
+\def\rapfillskip{.5\hsize plus .092\hsize minus .5\hsize} % D.A.'s value
+
+% Bovendien definieren we enkele extra \fill's:
+
+\def\hfilll{\hskip\zeropoint\!!plus1filll\relax}
+\def\vfilll{\vskip\zeropoint\!!plus1filll\relax}
+
+% De onderstaande hulpmacro's moeten nog eens instelbaar worden
+% gemaakt.
+
+\def\tfskipsize{1em\relax}
+\def\tfkernsize{1ex\relax}
+
+\def\tfskip{\dotfskip\tfskipsize}
+\def\tfkern{\dotfkern\tfkernsize}
+
+\def\dotfskip#1{{\tf\hskip#1}}
+\def\dotfkern#1{{\tf\kern #1}}
+
+% needs a proper \definenarrower or installnarrower
+
+\newskip\ctxleftskip
+\newskip\ctxrightskip
+\newskip\ctxmidskip
+
+\def\dosinglenarrower#1%
+ {\processaction
+ [#1]
+ [ \v!left=>\global\advance\ctxleftskip \@@slleft,
+ \v!middle=>\global\advance\ctxmidskip \@@slmiddle,
+ \v!right=>\global\advance\ctxrightskip \@@slright,
+ -\v!left=>\global\advance\ctxleftskip -\@@slleft,
+ -\v!middle=>\global\advance\ctxmidskip -\@@slmiddle,
+ -\v!right=>\global\advance\ctxrightskip-\@@slright,
+ \v!reset=>\global\ctxleftskip \zeropoint
+ \global\ctxmidskip \zeropoint
+ \global\ctxrightskip\zeropoint,
+ \v!none=>,
+ \s!unknown=>\global\advance\ctxmidskip \commalistelement]}
+
+% \def\donarrower[#1]% hm, can be dorepeat directly
+% {\processaction
+% [#1]
+% [ \v!left=>\global\advance\ctxleftskip \@@slleft,
+% \v!middle=>\global\advance\ctxmidskip \@@slmiddle,
+% \v!right=>\global\advance\ctxrightskip \@@slright,
+% \v!none=>,% handy for delimitedtexts
+% \s!unknown=>{\dorepeatwithcommand[#1]\dosinglenarrower}]}
+
+\def\donarrower[#1]% hm, can be dorepeat directly
+ {\dorepeatwithcommand[#1]\dosinglenarrower}
+
+\def\complexstartnarrower[#1]%
+ {\@@slbefore % was hard coded \par
+ \bgroup
+ \global\ctxleftskip \zeropoint
+ \global\ctxrightskip\zeropoint
+ \global\ctxmidskip \zeropoint
+ \processcommalistwithparameters[#1]\donarrower
+ \advance\leftskip \ctxleftskip
+ \advance\rightskip \ctxrightskip
+ \advance\leftskip \ctxmidskip
+ \advance\rightskip \ctxmidskip
+ \seteffectivehsize}
+
+% todo: definenarrower
+
+\def\simplestartnarrower
+ {\startnarrower[\v!middle]}
+
+\definecomplexorsimple\startnarrower
+
+\def\stopnarrower
+ {\@@slafter % was hard coded \par / needed, else skips forgotten
+ \egroup}
+
+\def\setupnarrower
+ {\dodoubleargument\getparameters[\??sl]}
+
+\newdimen\@@effectivehsize \def\effectivehsize {\hsize}
+\newdimen\@@effectiveleftskip \def\effectiveleftskip {\leftskip}
+\newdimen\@@effectiverightskip \def\effectiverightskip{\rightskip}
+
+\def\seteffectivehsize
+ {\setlocalhsize
+ \@@effectivehsize \localhsize
+ \@@effectiveleftskip \leftskip
+ \@@effectiverightskip \rightskip
+ \let\effectivehsize \@@effectivehsize
+ \let\effectiveleftskip \@@effectiveleftskip
+ \let\effectiverightskip\@@effectiverightskip}
+
+\def\dodefinehbox[#1][#2]%
+ {\setvalue{hbox#1}##1%
+ {\hbox to #2{\begstrut##1\endstrut\hss}}}
+
+\def\definehbox
+ {\dodoubleargument\dodefinehbox}
+
+\def\iobox#1#2#3#% here #3# is not really needed
+ {\vbox\bgroup % we want to return a vbox like the others
+ \hbox\bgroup% we need to pack the signal with the box
+ \signalrightpage
+ \dowithnextboxcontent
+ {\let\\=\endgraf\forgetall\doifrightpageelse#1#2}
+ {\box\nextbox\egroup\egroup}
+ \vbox#3}
+
+\def\obox{\iobox\raggedleft \raggedright} % outerbox
+\def\ibox{\iobox\raggedright\raggedleft} % innerbox
+
+\def\dosetraggedvbox#1%
+ {\let\raggedbox\vbox
+ \processfirstactioninset
+ [#1]
+ [ \v!left=>\let\raggedbox\lbox,
+ \v!right=>\let\raggedbox\rbox,
+ \v!middle=>\let\raggedbox\cbox,
+ \v!inner=>\let\raggedbox\ibox,
+ \v!outer=>\let\raggedbox\obox,
+ \v!flushleft=>\let\raggedbox\rbox,
+ \v!flushright=>\let\raggedbox\lbox,
+ \v!center=>\let\raggedbox\cbox,
+ \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]}
+
+\def\dosetraggedhbox#1%
+ {\let\raggedbox\hbox
+ \processaction % slow
+ [#1]
+ [ \v!left=>\def\raggedbox{\doalignedline\v!left },
+ \v!right=>\def\raggedbox{\doalignedline\v!right },
+ \v!middle=>\def\raggedbox{\doalignedline\v!middle},
+ \v!inner=>\def\raggedbox{\doalignedline\v!inner },
+ \v!outer=>\def\raggedbox{\doalignedline\v!outer },
+ \v!flushleft=>\def\raggedbox{\doalignedline\v!right },
+ \v!flushright=>\def\raggedbox{\doalignedline\v!left },
+ \v!center=>\def\raggedbox{\doalignedline\v!middle}]}
+
+\def\dosetraggedcommand#1%
+ {\expanded{\dodosetraggedcommand{#1}}}
+
+% \def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that!
+% {\let\raggedcommand \relax
+% \let\raggedtopcommand \empty
+% \let\raggedbottomcommand\empty
+% \chardef\raggedoneliner\zerocount
+% \doifsomething{#1}
+% {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse
+% \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse
+% \!!donectrue
+% \rawprocesscommalist[#1]\dododosetraggedcommand}}
+
+\newtoks\everyraggedcommand
+
+\def\raggedcommand{\the\everyraggedcommand}
+
+\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that!
+ {\everyraggedcommand \emptytoks
+ \let\raggedtopcommand \empty
+ \let\raggedbottomcommand\empty
+ \chardef\raggedoneliner\zerocount
+ \doifsomething{#1}
+ {\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse
+ \doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse
+ \!!donectrue
+ \rawprocesscommalist[#1]\dododosetraggedcommand}}
+
+\def\dododosetraggedcommand#1%
+ {\executeifdefined{\@@ragged@@command\string#1}\relax}
+
+\def\@@ragged@@command{@@raggedcommand}
+
+\setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nohz }{\appendtoks\disableadjusting \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!spacing }{\appendtoks\enablespacehandling
+ \enablekernhandling \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nospacing }{\appendtoks\disablespacehandling
+ \disablekernhandling \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!hyphenated }{\appendtoks\dohyphens \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!nothyphenated}{\appendtoks\nohyphens \to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!tolerant }{\appendtoks\tolerance3000\relax \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!verytolerant}{\appendtoks\tolerance4500\relax \to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!stretch }{\appendtoks\emergencystretch\bodyfontsize\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!left}%
+ {\if!!donea \appendtoks\veryraggedleft\to\everyraggedcommand
+ \else \appendtoks\raggedleft \to\everyraggedcommand
+ \fi
+ \!!donecfalse}
+
+\setvalue{\@@ragged@@command\v!right}%
+ {\if!!donea \appendtoks\veryraggedright\to\everyraggedcommand
+ \else \appendtoks\raggedright \to\everyraggedcommand
+ \fi
+ \!!donecfalse}
+
+\setvalue{\@@ragged@@command\v!middle}%
+ {\if!!donec
+ \if!!doneb \appendtoks\raggedwidecenter\to\everyraggedcommand
+ \else\if!!donea \appendtoks\veryraggedcenter\to\everyraggedcommand
+ \else \appendtoks\raggedcenter \to\everyraggedcommand
+ \fi\fi
+ \!!donecfalse
+ \else
+ \let\raggedbottomcommand\vfilll % bonus, pretty strong
+ \let\raggedtopcommand \vfilll % used with \framed for
+ \fi} % instance in tables
+
+\setvalue{\@@ragged@@command\v!flushleft }{\getvalue{\@@ragged@@command\v!right }}
+\setvalue{\@@ragged@@command\v!flushright}{\getvalue{\@@ragged@@command\v!left }}
+\setvalue{\@@ragged@@command\v!center }{\getvalue{\@@ragged@@command\v!middle}}
+
+\setvalue{\@@ragged@@command\v!high}%
+ {\let\raggedbottomcommand\vfilll} % and since we lack a
+
+\setvalue{\@@ragged@@command\v!low}%
+ {\let\raggedtopcommand\vfilll} % proper keyword, but
+
+\setvalue{\@@ragged@@command\v!lohi}%
+ {\let\raggedbottomcommand\vfilll % we do support the
+ \let\raggedtopcommand\vfilll} % ugly laho (lohi)
+
+\setvalue{\@@ragged@@command\v!no}%
+ {\appendtoks\raggedright\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!yes}%
+ {\appendtoks\notragged\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!normal}%
+ {\appendtoks\notragged\to\everyraggedcommand}
+
+\setvalue{\@@ragged@@command\v!inner}% not yet perfect
+ {\signalrightpage % may interfere
+ \doifrightpageelse
+ {\getvalue{\@@ragged@@command\v!right}}
+ {\getvalue{\@@ragged@@command\v!left}}}
+
+\setvalue{\@@ragged@@command\v!outer}% not yet perfect
+ {\signalrightpage % may interfere
+ \doifrightpageelse
+ {\getvalue{\@@ragged@@command\v!left}}
+ {\getvalue{\@@ragged@@command\v!right}}}
+
+\setvalue{\@@ragged@@command\v!lesshyphenation}%
+ {\appendtoks\lesshyphens\to\everyraggedcommand}
+\setvalue{\@@ragged@@command\v!morehyphenation}%
+ {\appendtoks\morehyphens\to\everyraggedcommand}
+
+% compare:
+%
+% \framed[width=4cm,align=no] {\hfil xxx}
+% \framed[width=4cm,align=disable]{\hfil xxx}
+
+\setvalue{\@@ragged@@command\v!disable}% for one liners
+ {\appendtoks\raggedright\parfillskip\zeropoint\to\everyraggedcommand}
+
+\chardef\raggedoneliner\zerocount
+
+\setvalue{\@@ragged@@command\v!line}%
+ {\chardef\raggedoneliner\plusone}
+
+%D Unofficial, may disappear. Now handled directly in the
+%D core-rul module.
+
+% \def\@@startraggedoneliner
+% {\ifcase\raggedoneliner\else
+% \dontleavehmode\hbox to \hsize \bgroup % hsize added, else useless
+% \ifcase\raggedstatus\or\hss\or\hss\fi
+% \ignorespaces
+% \bgroup
+% \aftergroup\removeunwantedspaces
+% \fi}
+
+% \def\@@stopraggedoneliner
+% {\ifcase\raggedoneliner\else
+% \egroup
+% \ifcase\raggedstatus\or\or\hss\or\hss\fi
+% \egroup
+% \ignorespaces % ? ? ?
+% \fi}
+
+% \def\@@handleoneliner
+% {\ifcase\raggedoneliner\else
+% \@@startraggedoneliner
+% \aftergroup\@@stopraggedoneliner
+% \fi}
+
+% Nog doen:
+%
+% \goodbreak -> \allowbreak en \dosomebreak{..} in koppen
+%
+% bij koppen zowieso: \blanko[reset]
+
+% Nog in commando verwerken:
+%
+% \voorkeur la \blanko
+%
+% Om ongewenste witruimte te voorkomen kan met \dosomebreak{\break}
+% een \penalty voor witruimte worden geplaatst.
+
+\def\removelastskip % a redefinition of plain
+ {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi}
+
+% first version:
+%
+% \def\dosomebreak#1%
+% {\scratchskip\lastskip
+% \removelastskip
+% %\type{#1}%
+% #1\relax
+% \ifdim\scratchskip=\zeropoint \else
+% \vskip\scratchskip
+% \fi}
+%
+% don't change the next improvement:
+
+% \def\dosomebreak#1%
+% {\endgraf % beware, this forces a newline
+% \ifvmode
+% \ifdim\lastskip=\zeropoint
+% #1\relax
+% \else
+% \scratchskip\lastskip
+% \removelastskip
+% #1\relax
+% \vskip\scratchskip
+% \fi
+% \fi}
+
+% beter, vooral in \vbox; nog in \pagina toepassen s!
+
+\def\doifoutervmode#1%
+ {\ifvmode\ifinner\else#1\fi\fi}
+
+\ifx\dosomebreak\undefined % defined in mkiv
+
+ \def\dosomebreak#1%
+ {\doifoutervmode
+ {\scratchskip\lastskip
+ \removelastskip
+ %\leavevmode\type{#1}%
+ #1\relax
+ \ifdim\scratchskip=\zeropoint % else interference with footnotes
+ \else
+ \vskip\scratchskip
+ \fi}}
+
+\fi
+
+\def\forgeteverypar
+ {\everypar{\the\neverypar}}
+
+%\def\forgetparindent
+% {\forgeteverypar
+% \indentfirstparagraphtrue % recently added
+% \setupindenting[\v!geen]}
+
+%\def\forgetparskip
+% {\setupwhitespace[\v!geen]}
+
+\def\forgetparindent
+ {\forgeteverypar
+ \indentfirstparagraphtrue % recently added
+ \let\currentindentation\v!none
+ \ctxparindent\zeropoint
+ \parindent\zeropoint\relax}
+
+\def\forgetparskip
+ {\let\currentwhitespace\v!none
+ \ctxparskip\zeropoint
+ \parskip\zeropoint\relax}
+
+\def\forgetbothskips
+ {\tolerance1500
+ \leftskip\zeropoint
+ \rightskip\zeropoint\relax}
+
+\def\forgetspacing
+ {\emergencystretch\zeropoint}
+
+\newif\ifforgotten % rather good signal for inner
+
+\appendtoks \forgottentrue \to \everyforgetall
+\appendtoks \forgetragged \to \everyforgetall
+\appendtoks \forgetparskip \to \everyforgetall
+\appendtoks \forgetparindent \to \everyforgetall
+\appendtoks \forgetbothskips \to \everyforgetall
+\appendtoks \forgetspacing \to \everyforgetall % i.v.m. funny spacing in pagebody
+\appendtoks \spacing\!!plusone \to \everyforgetall % new per 10/08/2004, else problems in otr / !! needed
+\appendtoks \everypar\emptytoks \to \everyforgetall % indeed!
+
+\def\localvbox#1#%
+ {\vbox#1\bgroup
+ \forgetparskip
+ \setlocalhsize
+ \hsize\localhsize
+ \forgetparindent
+ \forgetbothskips
+ \forgeteverypar
+ \let\next=}
+
+% ach ja, hoort niet hier
+
+% \unexpanded\def\dostartattributes#1#2#3%
+% {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+% \doifdefinedelse{#1#2}
+% {\def\fontattribute{\getvalue{#1#2}}}
+% {\let\fontattribute=\empty}%
+% \doifdefinedelse{#1#3}
+% {\def\colorattribute{\getvalue{#1#3}}}
+% {\let\colorattribute=\empty}%
+% \startcolor[\colorattribute]%
+% \@EA\doconvertfont\@EA{\fontattribute}}
+%
+% \unexpanded\def\dostopattributes%
+% {\stopcolor
+% \endgroup}
+%
+% \unexpanded\def\doattributes#1#2#3#4%
+% {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes}
+
+%D A hardly faster implementation follows. We cannot use
+%D \type {csname} testing since the first argument can be
+%D anything, even a raw fontswitch. No a real improvement
+%D (some 5 seconds on 260 seconds for the maps bibliography).
+
+\let\dostopattributes\relax % in case these commands end up in an edef
+
+\unexpanded\def\dostartattributes#1#2#3%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \ifcsname#1#3\endcsname
+ \let\dostopattributes\@@dostopattributes
+ \startcolor[\csname#1#3\endcsname]%
+ \else
+ \let\dostopattributes\@@nostopattributes
+ \fi
+ \ifcsname#1#2\endcsname
+ \expandafter\doconvertfont
+ \else
+ \expandafter\gobbleoneargument
+ \fi{\csname#1#2\endcsname}}
+
+\newconditional \parbasedattributes
+
+\def\finishparbasedattributes
+ {\ifconditional\parbasedattributes
+ \setfalse\parbasedattributes
+ \par
+ \fi}
+
+\def\dostopparbasedattributes
+ {\settrue\parbasedattributes
+ \dostopattributes}
+
+\unexpanded\def\@@dostopattributes
+ {\stopcolor
+ \finishparbasedattributes
+ \endgroup}
+
+\unexpanded\def\@@nostopattributes
+ {\finishparbasedattributes
+ \endgroup}
+
+\unexpanded\def\doattributes#1#2#3#4%
+ {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes}
+
+% An even faster \ETEX\ version:
+
+\unexpanded\def\dostartattributes#1#2#3%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \ifincolor
+ \ifcsname#1#3\endcsname
+ \let\dostopattributes\@@dostopattributes
+ \faststartcolor[\csname#1#3\endcsname]%
+ \else
+ \let\dostopattributes\@@nostopattributes
+ \fi
+ \else
+ \let\dostopattributes\@@nostopattributes
+ \fi
+ \ifcsname#1#2\endcsname
+ % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname
+ \@EA\doconvertfont\csname#1#2\@EA\endcsname
+ \fi}
+
+\unexpanded\def\@@dostopattributes
+ {\faststopcolor
+ \finishparbasedattributes
+ \endgroup}
+
+\unexpanded\def\@@nostopattributes
+ {\finishparbasedattributes
+ \endgroup}
+
+%D Bonus macro, see core-sec.tex
+
+\unexpanded\def\dosetfontattribute#1#2%
+ {\ifcsname#1#2\endcsname
+ \@EA\doconvertfont\csname#1#2\@EA\endcsname
+ \fi\empty}
+
+%D Since this happens a lot, and sometimes large arguments
+%D are passed in \type {#4}, we just copy some code:
+
+\unexpanded\def\doattributes#1#2#3#4%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \ifincolor
+ \ifcsname#1#3\endcsname
+ \let\dostopattributes\@@dostopattributes
+ \faststartcolor[\csname#1#3\endcsname]%
+ \else
+ \let\dostopattributes\endgroup
+ \fi
+ \else
+ \let\dostopattributes\endgroup
+ \fi
+ \ifcsname#1#2\endcsname
+ % \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname
+ \@EA\doconvertfont\csname#1#2\@EA\endcsname
+ \fi
+ {#4}%
+ \dostopattributes}
+
+% Kan vaker worden toegepast en moet bovendien sneller!
+
+\newskip\leftskipadaption
+\newskip\rightskipadaption
+
+\def\doadaptleftskip#1%
+ {\dosetleftskipadaption{#1}%
+ \advance\leftskip \leftskipadaption}
+
+\def\doadaptrightskip#1%
+ {\dosetrightskipadaption{#1}%
+ \advance\rightskip \rightskipadaption}
+
+\setvalue{@lsa@\v!standard}{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi}
+\setvalue{@lsa@\v!yes }{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi}
+\letvalue{@lsa@\v!no }\zeropoint
+\letvalue{@lsa@\empty }\zeropoint
+\setvalue{@rsa@\v!standard}{\@@slright}
+\setvalue{@rsa@\v!yes }{\@@slright}
+\letvalue{@rsa@\v!no }\zeropoint
+\letvalue{@rsa@\empty }\zeropoint
+
+% not safe for 2\parindent
+%
+% \def\dosetleftskipadaption#1%
+% {\leftskipadaption
+% \ifcsname @lsa@#1\endcsname
+% \csname @lsa@#1\endcsname
+% \else
+% #1%
+% \fi
+% \relax}
+
+\def\dosetleftskipadaption#1%
+ {\edefconvertedargument\ascii{@lsa@#1}%
+ \leftskipadaption
+ \ifcsname\ascii\endcsname
+ \csname\ascii\endcsname
+ \else
+ #1%
+ \fi
+ \relax}
+
+\def\dosetrightskipadaption#1%
+ {\edefconvertedargument\ascii{@rsa@#1}%
+ \rightskipadaption
+ \ifcsname\ascii\endcsname
+ \csname\ascii\endcsname
+ \else
+ #1%
+ \fi
+ \relax}
+
+\newcount \noftrackedpagestates
+\newif \ifpagestatemismatch
+\newcount \realpagestateno
+\chardef \frozenpagestate \zerocount
+
+\def\dotrackpagestate#1#2%
+ {\ifdoublesided \ifinpagebody \else
+ \doforcedtrackpagestate{#1}{#2}%
+ \fi \fi}
+
+\def\doforcedtrackpagestate#1#2%
+ {\ifcase\frozenpagestate
+ \global\advance\noftrackedpagestates\plusone
+ \global\advance#2\plusone
+ \lazysavetaggedtwopassdata{#1}{\number\noftrackedpagestates}{\number#2}{\noexpand\realfolio}%
+ %\llap{\infofont\number\noftrackedpagestates/\number#2}% tracing
+ \fi}
+
+\def\doifrightpagestateelse#1#2%
+ {\ifcase\frozenpagestate
+ \pagestatemismatchfalse
+ \realpagestateno\realfolio
+ \ifinpagebody
+ \ifdoublesided
+ \ifodd\realpageno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \twopassdatafoundtrue
+ \fi
+ \else\ifdoublesided
+ \findtwopassdata{#1}{\number#2}%
+ \iftwopassdatafound
+ \realpagestateno\twopassdata\relax
+ \ifnum\twopassdata=\realpageno \else
+ \pagestatemismatchtrue
+ \fi
+ \ifodd\twopassdata\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \ifodd\realpageno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \else
+ \twopassdatafoundtrue
+ \fi\fi
+ \else
+ \ifodd\realpagestateno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \iftwopassdatafound
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\doifforcedrightpagestateelse#1#2%
+ {\ifcase\frozenpagestate
+ \pagestatemismatchfalse
+ \realpagestateno\realfolio
+ \findtwopassdata{#1}{\number#2}%
+ \iftwopassdatafound
+ \realpagestateno\twopassdata\relax
+ \ifnum\twopassdata=\realpageno \else
+ \pagestatemismatchtrue
+ \fi
+ \ifodd\twopassdata\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \ifodd\realpageno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \else
+ \ifodd\realpagestateno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \iftwopassdatafound
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\freezepagestate {\chardef\frozenpagestate\plusone }
+\def\defrostpagestate{\chardef\frozenpagestate\zerocount}
+
+% we can make more of these on top, but how to deal with mixed frozen states
+
+\definetwopasslist\s!paragraph \newcount \nofraggedparagraphs
+
+\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs}
+\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs}
+
+\newcount\pagesignallevel
+
+\def\startsignalrightpage % one may do a \postsignalrightplace
+ {\advance\pagesignallevel\plusone
+ \presignalrightpage
+ \let\signalrightpage\relax
+ \let\presignalrightpage\relax
+ \let\startsignalrightpage\relax
+ \doifrightpageelse\donothing\donothing
+ \freezepagestate}
+
+\def\stopsignalrightpage
+ {\ifcase\pagesignallevel\or\postsignalrightpage\fi
+ \advance\pagesignallevel\minusone}
+
+\def\setraggedparagraphmode
+ {\signalrightpage\doifrightpageelse} % move it there
+
+\ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo
+
+\def\doifswappedrightpageelse#1#2% alleen in box construction !
+ {\doifrightpageelse
+ {#1}
+ {\scratchcounter\realpageno
+ \realpageno\realpagestateno\relax
+ \swapmargins
+ \realpageno\scratchcounter
+ #2}}
+
+\newbox\signaledrightpage % this way we can avoid interference, i.e. postpone placement
+
+\def\presignalrightpage {\global\setbox\signaledrightpage\hbox{\signalrightpage}}
+\def\postsignalrightpage{\ifvoid\signaledrightpage\else\box\signaledrightpage\fi}
+
+% The next feature is is used in:
+%
+% \definenumber[test][way=bypage]
+%
+% \def\Test
+% {\incrementnumber[test]\rawnumber[test]/%
+% \incrementnumber[test]\rawnumber[test]/%
+% \incrementnumber[test]\rawnumber[test]\space
+% \checkpagechange{oeps}\changedpage{oeps}\space
+% \ifpagechanged TRUE\else FALSE\fi}
+%
+% \Test\page \Test\par \Test\page \Test\par \Test\page \Test\page
+%
+% (adapted from cont-new.tex:)
+
+\newif\ifpagechanged \let\lastchangedpage\empty
+
+\def\docheckpagestatechange#1#2#3%
+ {\pagechangedfalse
+ \doforcedtrackpagestate{#2}{#3}%
+ \findtwopassdata{#2}{\number#3}%
+ \iftwopassdatafound
+ \ifnum\twopassdata>0\getvalue{#2:p:#1}\relax
+ \pagechangedtrue
+ \fi
+ \fi
+ \ifpagechanged
+ \letgvalue{#2:p:#1}\twopassdata
+ \globallet\lastchangedpage\twopassdata
+ \else
+ \globallet\lastchangedpage\realfolio
+ \fi}
+
+\def\changedpagestate#1#2%
+ {\executeifdefined{#2:p:#1}{0}}
+
+\def\checkpagechange#1{\docheckpagestatechange{#1}\s!paragraph\nofraggedparagraphs}
+\def\changedpage #1{\changedpagestate{#1}\s!paragraph}
+
+% saved struts
+
+\ifx\savedstrutbox\undefined \newbox\savedstrutbox \fi
+
+\def\savestrut {\setbox\savedstrutbox\copy\strutbox}
+\def\savedstrut{\copy \savedstrutbox}
+
+% De onderstaande macro's zijn opgenomen in Plain TeX.
+%
+% \def\raggedright%
+% {\rightskip\zeropoint plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+%
+% \def\ttraggedright%
+% {\tttf\rightskip\zeropoint plus2em\relax}
+%
+% \newif\ifr@ggedbottom
+%
+% \def\raggedbottom%
+% {\topskip 10\points plus60\points \r@ggedbottomtrue}
+%
+% \def\normalbottom%
+% {\topskip 10\points \r@ggedbottomfalse}
+%
+% en worden hieronder wat aangepast.
+
+% the three boolean will become obsolete some day in favour
+% of \bottomraggedness
+
+\chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline
+
+\def\bottomalignlimit{3\lineheight}
+
+\newif\ifn@rmalbottom
+\newif\ifr@ggedbottom
+\newif\ifb@selinebottom
+
+\def\normalbottom
+ {% \topskip 10pt
+ \r@ggedbottomfalse}
+
+\def\raggedbottom
+ {\chardef\bottomraggedness\zerocount
+ \n@rmalbottomfalse
+ \r@ggedbottomtrue
+ \b@selinebottomfalse
+ \settopskip}
+
+\def\alignbottom
+ {\chardef\bottomraggedness\plusone
+ \n@rmalbottomtrue
+ \r@ggedbottomfalse
+ \b@selinebottomfalse
+ \settopskip}
+
+\def\baselinebottom
+ {\chardef\bottomraggedness\plustwo
+ \n@rmalbottomfalse
+ \r@ggedbottomfalse
+ \b@selinebottomtrue
+ \settopskip}
+
+\let\normalbottom=\alignbottom % downward compatible
+
+% so, the new one will be
+%
+% \chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline
+%
+% \def\bottomalignlimit{3\lineheight} % will be settable
+%
+% \def\raggedbottom {\chardef\bottomraggedness=0 \settopskip}
+% \def\alignbottom {\chardef\bottomraggedness=1 \settopskip}
+% \def\baselinebottom{\chardef\bottomraggedness=2 \settopskip}
+%
+% \let\normalbottom =\alignbottom
+
+% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness
+% \tolerance >= 1500 % was 200
+% \raggedness = 2 .. 6\bodyfontsize
+
+\chardef\raggedstatus=0 % normal left center right
+
+\def\leftraggedness {2\bodyfontsize}
+\def\rightraggedness {2\bodyfontsize}
+\def\middleraggedness {6\bodyfontsize}
+
+\def\middleraggedness {.5\hsize} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{}
+
+% oeps, hsize can be 0pt in which case we get a strange division
+
+\def\middleraggedness {\ifdim\hsize=\zeropoint6\bodyfontsize\else.5\hsize\fi} % was: 6\bodyfontsize, fails on: \placefigure{x $x=x$ x}{}
+
+%D More hyphenation control, will be combined with align
+%D setup.
+
+\def\nohyphens
+ {\ifx\dohyphens\relax
+ \edef\dohyphens
+ {\hyphenpenalty\the\hyphenpenalty
+ \exhyphenpenalty\the\exhyphenpenalty\relax}%
+ \fi
+ \hyphenpenalty\plustenthousand
+ \exhyphenpenalty\plustenthousand}
+
+\let\dohyphens\relax
+
+%D To prevent unwanted side effects, we also have to check
+%D for hyphens here:
+
+% \def\setraggedness#1%
+% {\ifnum\tolerance<1500\relax % small values have
+% \tolerance1500\relax % unwanted side effects
+% \fi
+% \spaceskip2.5\hsize % we misuse these registers
+% \xspaceskip#1\relax % for temporary storage;
+% \divide\spaceskip \xspaceskip % they are changed anyway
+% \ifx\dohyphens\relax
+% \hyphenpenalty\spaceskip % \else no hyphens is active
+% \fi}
+
+\newskip\@@raggedskipa
+\newskip\@@raggedskipb
+
+\def\setraggedness#1%
+ {\ifnum\tolerance<1500\relax % small values have
+ \tolerance1500\relax % unwanted side effects
+ \fi
+ \ifx\dohyphens\relax
+ % this code will be reconsidered / kind of fuzzy (and old)
+ \@@raggedskipa 2.5\hsize
+ \@@raggedskipb #1\relax
+ \divide\@@raggedskipa \@@raggedskipb
+ \hyphenpenalty\@@raggedskipa
+ \fi}
+
+\let\updateraggedskips\relax
+
+\def\setraggedskips#1#2#3#4#5#6#7% never change this name
+ {\def\updateraggedskips{\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}{#7}}%
+ \updateraggedskips}
+
+\def\dosetraggedskips#1#2#3#4#5#6#7%
+ {\chardef \raggedstatus#1\relax
+ \leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3
+ \rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3
+ \spaceskip #4\relax
+ \xspaceskip #5\relax
+ \parfillskip\zeropoint\!!plus#6\relax
+ \parindent #7\relax}
+
+% \def\notragged%
+% {\setraggedskips{0}{0em}{0em}{0em}{0em}{1fil}{\parindent}}
+
+% older (context) names:
+
+\let\spaceamount \interwordspace
+\let\emspaceamount\emwidth
+
+% tracing:
+
+\def\doshowpardata#1%
+ {\ifx#1\relax\else
+ \hbox{\string#1: \the#1}\endgraf
+ \expandafter\doshowpardata
+ \fi}
+
+\def\showpardata
+ {\edef\thepardata
+ {\hbox{font: \fontname\font}\endgraf
+ \doshowpardata
+ \interwordspace \interwordstretch \interwordshrink \emwidth \exheight \extraspace
+ \hsize \vsize
+ \leftskip \rightskip
+ \spaceskip \xspaceskip
+ \parindent \parfillskip
+ \hyphenpenalty \exhyphenpenalty
+ \displaywidowpenalty \widowpenalty \clubpenalty \brokenpenalty
+ \doublehyphendemerits \finalhyphendemerits \adjdemerits
+ \relax}%
+ \begingroup
+ \dontshowcomposition
+ \inleftmargin{\vsmash
+ {\switchtobodyfont[7pt,tt]%
+ \framed[\c!align=\v!right]{\thepardata}}}%
+ \endgroup}
+
+\def\startshowpardata
+ {\begingroup
+ \showcomposition
+ \showstruts\tracepositionstrue \tracingparagraphs\maxdimen
+ \appendtoksonce\showpardata\let\showpardata\relax\to\everypar}
+
+\def\stopshowpardata
+ {\endgraf
+ \endgroup}
+
+% \defineXMLenvironment[showpardata] \startshowpardata \stopshowpardata
+% \defineXMLsingular [showpardata] \showpardata
+
+% defaults
+
+\def\raggedfillamount {1fil}
+\def\raggedhalffillamount{.5fil}
+\def\raggedspaceamount {\interwordspace} % {.3333em}
+\def\raggedxspaceamount {.5em}
+
+\def\notragged
+ {\chardef\raggedstatus\zerocount
+ \leftskip 1\leftskip
+ \rightskip 1\rightskip
+ \spaceskip \zeropoint
+ \xspaceskip \zeropoint
+ \parfillskip\zeropoint\!!plus\raggedfillamount\relax
+ \let\updateraggedskips\relax} % new
+
+\let\forgetragged\notragged
+
+\def\raggedleft
+ {\setraggedness\leftraggedness
+ \setraggedskips1\leftraggedness\zeropoint\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+\def\raggedcenter
+ {\setraggedness\middleraggedness
+ \setraggedskips2\middleraggedness\middleraggedness\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+%D We used to have:
+%D
+%D \starttyping
+%D \def\raggedright
+%D {\setraggedness\rightraggedness
+%D \setraggedskips{3}{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}}
+%D \stoptyping
+%D
+%D However, the next alternative, suggested by Taco, is better.
+
+\def\raggedright
+ {\setraggedness\rightraggedness
+ \setraggedskips3\zeropoint\rightraggedness\raggedspaceamount
+ \raggedxspaceamount\raggedfillamount\parindent}
+
+\def\veryraggedleft
+ {\setraggedskips1\raggedfillamount\zeropoint\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+%D When we want the last line to have a natural width:
+%D
+%D \starttyping
+%D \def\veryraggedleft%
+%D {\setraggedskips{1}{1fil}{0em}{.3333em}{.5em}{0em}{-1fil}}
+%D \stoptyping
+%D
+%D but this one is not accepted by the macros.
+
+\def\veryraggedcenter
+ {\setraggedskips2\raggedfillamount\raggedfillamount\raggedspaceamount
+ \raggedxspaceamount\zeropoint\zeropoint}
+
+\def\veryraggedright
+ {\setraggedskips3\zeropoint\raggedfillamount\raggedspaceamount
+ \raggedxspaceamount\zeropoint\parindent}
+
+\def\ttraggedright
+ {\tttf
+ \setraggedskips3\zeropoint\rightraggedness
+ \zeropoint\zeropoint\zeropoint\parindent} % \ctxparindent
+
+%D A bonus one:
+
+\def\raggedwidecenter
+ {\setraggedness\middleraggedness
+ \setraggedskips2\raggedhalffillamount\raggedhalffillamount
+ \raggedspaceamount\raggedxspaceamount\zeropoint\zeropoint}
+
+\newif\if@@asragged \@@asraggedtrue % old method
+
+% todo
+%
+% \setuplayout[grid=yes,lines=44] \showgrid
+% \starttext
+% test \vfill test \endgraf \strut \endgraf \vskip-\lineheight \removedepth \pagina test
+% \stoptext
+
+% \setupalign[reset,new,right,old]
+
+\def\@@align@@rl{\if!!donea\veryraggedleft \else\raggedleft \fi}
+\def\@@align@@rr{\if!!donea\veryraggedright \else\raggedright \fi}
+\def\@@align@@rc{\if!!donea\veryraggedcenter\else\raggedcenter\fi}
+
+\setvalue{@@ngila@@\v!broad }{\!!doneatrue}
+\setvalue{@@ngila@@\v!wide }{\!!donebtrue}
+
+\def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads
+
+\installalign \v!new {\@@asraggedfalse}
+\installalign \v!old {\@@asraggedtrue}
+\installalign \empty {}
+
+\installalign \v!line {\baselinebottom}
+\installalign \v!bottom {\raggedbottom}
+\installalign \v!height {\normalbottom}
+\installalign \v!width {\notragged}
+\installalign \v!normal {\notragged}
+\installalign \v!yes {\notragged}
+\installalign \v!no {\raggedright}
+\installalign \v!inner {\if@@asragged \setraggedparagraphmode\@@align@@rl\@@align@@rr \else
+ \setraggedparagraphmode\@@align@@rr\@@align@@rl \fi}
+\installalign \v!outer {\if@@asragged \setraggedparagraphmode\@@align@@rr\@@align@@rl \else
+ \setraggedparagraphmode\@@align@@rl\@@align@@rr \fi}
+\installalign \v!left {\if@@asragged\@@align@@rl\else\@@align@@rr\fi}
+\installalign \v!right {\if@@asragged\@@align@@rr\else\@@align@@rl\fi}
+\installalign \v!middle {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi}
+\installalign \v!flushleft {\if!!donea\veryraggedright \else\raggedright\fi}
+\installalign \v!flushright {\if!!donea\veryraggedleft \else\raggedleft \fi}
+\installalign \v!flushouter {\setraggedparagraphmode\raggedleft\raggedright}
+\installalign \v!flushinner {\setraggedparagraphmode\raggedright\raggedleft}
+\installalign \v!center {\if!!doneb\raggedwidecenter\else\@@align@@rc\fi}
+\installalign \v!hanging {\enableprotruding}
+\installalign \v!nothanging {\disableprotruding}
+\installalign \v!hz {\enableadjusting}
+\installalign \v!nohz {\disableadjusting}
+\installalign \v!spacing {\enablespacehandling \enablekernhandling}
+\installalign \v!nospacing {\disablespacehandling\disablekernhandling}
+\installalign \v!hyphenated {\dohyphens}
+\installalign \v!nothyphenated {\nohyphens}
+\installalign \v!new {\@@asraggedfalse} % so new will give you consistency
+\installalign \v!reset {\notragged\normalbottom}
+
+\installalign \v!tolerant {\tolerance3000 \relax}
+\installalign \v!verytolerant {\tolerance4500 \relax}
+\installalign \v!stretch {\emergencystretch\bodyfontsize}
+
+\newcount\hyphenminoffset
+
+\ifx\sethyphenationvariables\undefined \let\sethyphenationvariables\relax \fi
+
+\def\lesshyphens
+ {\advance\hyphenminoffset\plusone
+ \sethyphenationvariables}
+
+\def\morehyphens
+ {\ifcase\hyphenminoffset \else
+ \advance\hyphenminoffset\minusone
+ \fi
+ \sethyphenationvariables}
+
+\installalign \v!lesshyphenation {\lesshyphens}
+\installalign \v!morehyphenation {\morehyphens}
+
+\def\dodosetupalign#1{\csname @@align@@#1\endcsname}
+\def\dodosetupngila#1{\csname @@ngila@@#1\endcsname}
+
+\def\setupalign
+ {\dosingleargument\dosetupalign}
+
+\def\dosetupalign[#1]% can be made faster by checking for defined #1
+ {\!!doneafalse
+ \!!donebfalse
+ \processcommacommand[#1]\dodosetupngila
+ \processcommacommand[#1]\dodosetupalign}
+
+% \setupalign[flushleft] \input ward \par % lijnlinks
+% \setupalign[right] \input ward \par
+
+% \setupalign[flushright] \input ward \par % lijnrechts
+% \setupalign[left] \input ward \par
+
+% \setupalign[middle] \input ward \par % centreer
+% \setupalign[center] \input ward \par
+
+\def\startalignment
+ {\bgroup
+ \setupalign}
+
+\def\stopalignment
+ {\par
+ \egroup}
+
+\chardef\alignstrutmode=1
+
+% see later for the real definition, which in the simple case is:
+
+\newtoks \everyleftofalignedline
+\newtoks \everyrightofalignedline
+
+\def\shiftalignedline#1#2#3#4% left, right, inner, outer
+ {\rightorleftpageaction
+ {\everyleftofalignedline {\hskip\dimexpr#1+#3\relax}%
+ \everyrightofalignedline{\hskip\dimexpr#2+#4\relax}}
+ {\everyleftofalignedline {\hskip\dimexpr#1+#4\relax}%
+ \everyrightofalignedline{\hskip\dimexpr#2+#3\relax}}}
+
+% \def\doalignline#1#2% \\ == newline
+% {\begingroup
+% \setlocalhsize % new
+% \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}%
+% \dowithnextbox
+% {\noindentation % was \noindent
+% \dontleavehmode % added in marrakesch at TUG 2006
+% \hbox to \localhsize
+% {\ifcase\alignstrutmode\or\strut\fi
+% \the\everyleftofalignedline
+% #1\unhbox\nextbox#2\relax
+% \the\everyrightofalignedline}%
+% \endgroup}
+% \hbox}
+
+\def\doalignline#1#2% \\ == newline
+ {\noindentation % was \noindent
+ \dontleavehmode % added in marrakesch at TUG 2006\begingroup
+ \begingroup
+ \setlocalhsize % new
+ \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}%
+ \dowithnextbox
+ {\hbox to \localhsize
+ {\ifcase\alignstrutmode\or\strut\fi
+ \the\everyleftofalignedline
+ #1\unhbox\nextbox#2\relax
+ \the\everyrightofalignedline}%
+ \endgroup}
+ \hbox}
+
+% plain commands
+
+\ifx\undefined\line \def\line {\hbox to\hsize} \fi
+\ifx\undefined\leftline \def\leftline #1{\line{#1\hss}} \fi
+\ifx\undefined\rightline \def\rightline #1{\line{\hss#1}} \fi
+\ifx\undefined\centerline \def\centerline#1{\line{\hss#1\hss}} \fi
+
+% directe commando's
+
+\def\leftaligned {\doalignline \relax \hss }
+\def\midaligned {\doalignline \hss \hss }
+\def\rightaligned{\doalignline \hss \relax}
+
+\let\centeraligned\midaligned
+
+\def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated
+
+% indirecte commando's
+
+\letvalue{\s!do\v!line\v!left }\leftaligned
+\letvalue{\s!do\v!line\v!right }\rightaligned
+\letvalue{\s!do\v!line\v!middle }\midaligned
+\letvalue{\s!do\v!line\v!flushleft }\rightaligned
+\letvalue{\s!do\v!line\v!flushright}\leftaligned
+\letvalue{\s!do\v!line\v!center }\midaligned
+
+\def\doalignedline#1{\csname\s!do\v!line#1\endcsname}
+
+%D Experimental:
+
+% simple version
+%
+% \def\doxalignline#1#2%
+% {\bgroup
+% \setlocalhsize
+% \def\\{\egroup\par\doxalignline{#1}{#2}\bgroup}% inefficient
+% \dowithnextbox
+% {\noindent\hbox to \localhsize
+% {\ifcase\alignstrutmode\or\strut\fi
+% \signalrightpage
+% \doifrightpageelse{#1\unhbox\nextbox#2}{#2\unhbox\nextbox#1}}%
+% \egroup}
+% \hbox}
+%
+% \setvalue{\s!do\v!regel\v!binnen}{\doxalignline\relax\hss}
+% \setvalue{\s!do\v!regel\v!buiten}{\doxalignline\hss\relax}
+%
+% more extensive:
+
+\def\doxalignline#1#2#3#4#5#6%
+ {\noindentation % was \noindent
+ \dontleavehmode % added in marrakesch at TUG 2006\begingroup
+ \begingroup
+ \setlocalhsize
+ \def\\{\egroup\par\doxalignline#1#2#3#4#5#6\bgroup}% inefficient
+ \dowithnextbox
+ {%\noindent moved up
+ \hbox to \localhsize
+ {#1\hskip\ifdone#2\else#3\fi#4%
+ \hbox to \localhsize
+ {\the\everyleftofalignedline
+ \ifcase\alignstrutmode\or\strut\fi
+ \ifdone#5\unhbox\nextbox#6\else#6\unhbox\nextbox#5\fi
+ \the\everyrightofalignedline}%
+ \hss}%
+ \endgroup}
+ \hbox}
+
+\def\doxcheckline
+ {\signalrightpage\doifrightpageelse\donetrue\donefalse}
+
+\setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss }
+\setvalue{\s!do\v!line\v!outer }{\doxalignline\doxcheckline++\zeropoint \hss \relax}
+\setvalue{\s!do\v!line\v!innermargin}{\doxalignline\doxcheckline-+\innermargintotal\relax\hss }
+\setvalue{\s!do\v!line\v!outermargin}{\doxalignline\doxcheckline+-\outermargintotal\hss \relax}
+\setvalue{\s!do\v!line\v!inneredge }{\doxalignline\doxcheckline-+\inneredgetotal \relax\hss }
+\setvalue{\s!do\v!line\v!outeredge }{\doxalignline\doxcheckline+-\outeredgetotal \hss \relax}
+\setvalue{\s!do\v!line\v!backspace }{\doxalignline\doxcheckline-+\backspace \relax\hss }
+\setvalue{\s!do\v!line\v!cutspace }{\doxalignline\doxcheckline+-\cutspace \hss \relax}
+
+\setvalue{\s!do\v!line\v!leftmargin }{\doxalignline\donefalse --\leftmargintotal \hss \relax}
+\setvalue{\s!do\v!line\v!rightmargin}{\doxalignline\donefalse ++\rightmargintotal\relax\hss }
+\setvalue{\s!do\v!line\v!leftedge }{\doxalignline\donefalse --\leftedgetotal \hss \relax}
+\setvalue{\s!do\v!line\v!rightedge }{\doxalignline\donefalse ++\rightedgetotal \relax\hss }
+
+% ! ! ! beware, redefining \doalignline gives the wrong results ! ! !
+%
+% \def\doalignline{\doxalignline\donefalse++\zeropoint}
+
+%D Better:
+
+\def\doalignedline#1{\csname\s!do\v!line#1\endcsname}
+
+% \def\alignedline#1#2% setting default
+% {\csname
+% \s!do\v!line
+% \ifundefined{\s!do\v!line#1}#2\else#1\fi
+% \endcsname}
+
+\def\alignedline#1#2% setting default
+ {\csname\s!do\v!line\ifcsname\s!do\v!line#1\endcsname#1\else#2\fi\endcsname}
+
+%D ...
+
+\def\dosetuptolerance[#1]%
+ {\doifinsetelse\v!vertical{#1}%
+ {\ExpandFirstAfter\processallactionsinset
+ [#1]
+ [ \v!verystrict=>\def\bottomtolerance{},
+ \v!strict=>\def\bottomtolerance{.050},
+ \v!tolerant=>\def\bottomtolerance{.075},
+ \v!verytolerant=>\def\bottomtolerance{.100}]}%
+ {\ExpandFirstAfter\processallactionsinset
+ [#1]
+ [ \v!stretch=>\emergencystretch\bodyfontsize,
+ \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax,
+ \v!verystrict=>\tolerance 200,
+ \v!strict=>\tolerance1500,
+ \v!tolerant=>\tolerance3000,
+ \v!verytolerant=>\tolerance4500]}}
+
+\def\setuptolerance
+ {\dosingleargument\dosetuptolerance}
+
+% \def\woordrechts
+% {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}}
+
+% beware: \wordright{whatever\kern-\rightskip} should work!
+% so, no funny boxing here
+
+\def\dowordright[#1]%
+ {% don't change
+ \groupedcommand
+ {\removeunwantedspaces
+ \hfill
+ \allowbreak % changed back from \hskip\zeropoint
+ \strut
+ \hfill
+ \quad % decent spacing
+ \hbox}
+ {\doifelse{#1}\v!right{\kern-\rightskip}{\doifsomething{#1}{\kern-#1}}%
+ \parfillskip\zeropoint
+ %\finalhyphendemerits\zerocount % yes or no
+ \par}}
+
+\def\wordright
+ {\dosingleempty\dowordright}
+
+% \dorecurse{5}{something } \wordright{--someone} \endgraf
+% \dorecurse{6}{something } \wordright{--someone} \endgraf
+% \dorecurse{7}{something } \wordright{--someone} \endgraf
+%
+% \dorecurse{5}{something } \wordright{--someone else entirely} \endgraf
+% \dorecurse{6}{something } \wordright{--someone else entirely} \endgraf
+% \dorecurse{7}{something } \wordright{--someone else entirely} \endgraf
+%
+% \wordright[\rightskip]{whatever}
+
+% \simplealignedbox{2cm}{right}{x}
+
+\setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}}
+\setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}}
+\setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}}
+\setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}}
+\setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}}
+
+\def\simplealignedbox#1{\executeifdefined{\s!simple\c!align#1}{\getvalue{\s!simple\c!align\v!right}}}
+
+%D \macros
+%D {pushindentation,popindentation}
+%D
+%D The pushing and popping is done by:
+
+\newbox\indentationboxA
+\newbox\indentationboxB
+
+\def\pushindentation
+ {\bgroup
+ \ifhmode
+ \unskip
+ \setbox\indentationboxA\lastbox % get \strut if present
+ \unskip
+ \setbox\indentationboxB\lastbox % get \indent generated box
+ \unskip
+ \else
+ \hskip\zeropoint % switch to horizontal mode
+ \unskip
+ \setbox\indentationboxA\lastbox % get \indent generated box
+ \setbox\indentationboxB\emptybox
+ \fi}
+
+\def\popindentation
+ {\box\indentationboxB\box\indentationboxA % put back the boxes
+ \egroup}
+
+%D The only complication lays in \type{\strut}. In \PLAIN\
+%D \TEX\ a \type{\strut} is defined as:
+%D
+%D \starttyping
+%D \def\strut%
+%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+%D \stoptyping
+%D
+%D But what is a \type{\strut}? Normally it's a rule of width
+%D zero, but when made visual, it's a rule and a negative skip.
+%D The mechanism for putting things in the margins described
+%D here cannot handle this situation very well. One
+%D characteristic of \type{\strut} is that the \type{\unhcopy}
+%D results in entering horizontal mode, which in return leads
+%D to some indentation.
+%D
+%D To serve our purpose a bit better, the macro \type{\strut}
+%D can be redefined as:
+%D
+%D \starttyping
+%D \def\strut
+%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox}
+%D \stoptyping
+%D
+%D Or more compatible:
+%D
+%D \starttyping
+%D \def\strut
+%D {\relax\ifmmode
+%D \copy\strutbox
+%D \else
+%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup
+%D \fi}
+%D \stoptyping
+%D
+%D In \CONTEXT\ however we save some processing time by putting
+%D an extra \type{\hbox} around the \type{\strutbox}.
+
+% moved from page-lin.tex to here (due to visualization added
+% in august 2003)
+%
+% \unexpanded \def\crlf
+% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break}
+
+\unexpanded \def\crlf
+ {\ifhmode
+ \unskip
+ \prewordbreak\crlfplaceholder
+ \ifcase\raggedstatus\hfil\or\or\or\hfil\fi
+ \break
+ \else
+ \crlfplaceholder
+ \endgraf
+ \fi}
+
+\def\crlfplaceholder
+ {\strut}
+
+\def\settestcrlf
+ {\def\crlfplaceholder
+ {\hbox to \zeropoint
+ {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}}
+
+%D \starttyping
+%D % \setuplayout[gridgrid=yes] \showgrid
+%D
+%D \startbuffer
+%D test 1\crlf
+%D test 2\crlf
+%D
+%D \crlf test 3
+%D
+%D test 4\crlf
+%D test 5
+%D
+%D \crlf
+%D \crlf
+%D \crlf
+%D test 6
+%D \stopbuffer
+%D
+%D \hbox
+%D {\hsize5em
+%D \ruledvtop{\getbuffer}\enspace
+%D \ruledvtop{\showstruts\getbuffer}\enspace
+%D \hsize15em \setuptyping[before=,after=]%
+%D \ruledvtop{\typebuffer}}
+%D \stoptyping
+
+\def\opeenregel % to be used grouped
+ {\def\crlf{\removelastspace\space}\let\\\crlf}
+
+\def\showstruts
+ {\setteststrut
+ \settestcrlf}
+
+\def\definehspace
+ {\dotripleempty\dodefinehspace}
+
+\def\dodefinehspace[#1][#2][#3]% #1 = optional namespace
+ {\ifthirdargument
+ \setvalue{\??hs#1:#2}{#3}%
+ \else
+ \setvalue{\??hs:#1}{#2}%
+ \fi}
+
+\unexpanded\def\hspace
+ {\dodoubleempty\dohspace}
+
+%\def\dohspace[#1][#2]%
+% {\ifhmode
+% \removeunwantedspaces
+% \hskip
+% \ifsecondargument
+% \hspaceamount{#1}{#2}%
+% \else
+% \hspaceamount\empty{\iffirstargument#1\else\s!default\fi}%
+% \fi
+% \expandafter\ignorespaces
+% \fi}
+
+\def\dohspace[#1][#2]%
+ {\ifsecondargument
+ \dodohspace[#1][#2]%
+ \else\iffirstargument
+ \hspace[][#1]%
+ \else
+ \hspace[][\s!default]%
+ \fi\fi}
+
+% \def\dodohspace[#1][#2#3]%
+% {\ifhmode
+% \removeunwantedspaces
+% \doifelse{#2}{-}
+% {{\scratchskip\hspaceamount{#1}{#3}\hskip-\scratchskip}}
+% {\hskip\hspaceamount{#1}{#2#3}}%
+% \expandafter\ignorespaces
+% \fi}
+%
+% not needed, tex handles -- as +
+
+\def\dodohspace[#1][#2]%
+ {\ifhmode
+ \removeunwantedspaces
+ \hskip\hspaceamount{#1}{#2}%
+ \expandafter\ignorespaces
+ \fi}
+
+\def\hspaceamount#1#2%
+ {\executeifdefined{\??hs#1:#2}{\executeifdefined{\??hs:#2}\zeropoint}}
+
+\definehspace [\v!small] [.25\emspaceamount]
+\definehspace [\v!medium] [.5\emspaceamount]
+\definehspace [\v!big] [1\emspaceamount]
+\definehspace [\v!normal] [1\spaceamount]
+\definehspace [\v!default] [\spaceamount]
+
+%D Taken from Taco's math module (cq. \AMS\ macros), but
+%D adapted to \type {\hspace}:
+
+\unexpanded\def\textormathspace#1#2#3%
+ {\ifmmode\mskip#1#2\else\kern#1\hspaceamount\empty{#3}\fi\relax}
+
+\newmuskip\hairmuskip \hairmuskip=.15mu
+
+\def\hairspace {\textormathspace+\hairmuskip{.5}}
+\def\thinspace {\textormathspace+\thinmuskip 1}
+\def\medspace {\textormathspace+\medmuskip 2}
+\def\thickspace {\textormathspace+\thickmuskip3}
+\def\neghairspace {\textormathspace-\thinmuskip{.5}}
+\def\negthinspace {\textormathspace-\thinmuskip 1}
+\def\negmedspace {\textormathspace-\medmuskip 2}
+\def\negthickspace{\textormathspace-\thickmuskip3}
+
+% needed for unicode:
+
+\def\twoperemspace {\hskip\dimexpr\emwidth/2\relax} % == \enspace
+\def\threeperemspace {\hskip\dimexpr\emwidth/3\relax}
+\def\fourperemspace {\hskip\dimexpr\emwidth/4\relax}
+\def\fiveperemspace {\hskip\dimexpr\emwidth/5\relax} % goodie
+\def\sixperemspace {\hskip\dimexpr\emwidth/6\relax}
+\def\figurespace {\begingroup\setbox\scratchbox\hbox{0}\hskip\wd\scratchbox\endgroup} % there is a command for this
+\def\punctuationspace {\begingroup\setbox\scratchbox\hbox{.}\hskip\wd\scratchbox\endgroup}
+\def\ideographicspace {\hskip\dimexpr\emwidth/1\relax}
+\def\ideographichalffillspace{\hskip\dimexpr\emwidth/2\relax}
+%def\nobreakspace {\penalty\plustenthousand\space}
+\def\nobreakspace {\penalty\plustenthousand\kern\interwordspace}
+\def\narrownobreakspace {\penalty\plustenthousand\thinspace}
+%def\zerowidthnobreakspace {\penalty\plustenthousand\hskip\zeropoint}
+\def\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint}
+\def\zerowidthspace {\hskip\zeropoint}
+
+\definehspace[.5][.1250\emspaceamount] % could also be [.1250\spaceamount]
+\definehspace[1] [.1667\emspaceamount]
+\definehspace[2] [.2222\emspaceamount]
+\definehspace[3] [.2777\emspaceamount]
+
+\let \, \thinspace
+\let \: \medspace
+\let \; \thickspace
+\let \! \negthinspace
+
+% this will become an alternative bunch of \blank settings
+%
+% \startlines
+% \scratchskip=.23pt plus 10pt minus 4pt \relax \number\scratchskip \space \the\scratchskip
+% \setsimplifiedskip\scratchskip1 \number\scratchskip \space \the\scratchskip
+% \setsimplifiedskip\scratchskip2 \number\scratchskip \space \the\scratchskip
+% \getsimplifiedskip\scratchskip\scratchcounter \number\scratchcounter
+% \stoplines
+%
+% \hrule width10cm \endgraf
+% \discardedskip{10pt}
+% \retainedskip {4pt}
+% \discardedskip {5pt}
+% \hrule width10cm \endgraf
+% \blockedskip{0pt}
+% \discardedskip{10pt}
+% \retainedskip {4pt}
+% \discardedskip {5pt}
+% \hrule width10cm \endgraf
+% \frozenskip {4cm}
+% \hrule width10cm \endgraf
+% \vskip10pt
+% \hrule width10cm \endgraf
+
+% ! ! ! etex only, evt splitskip macro gebruiken (syst-new)
+
+\newskip\simplifiedskip
+\newskip\simplifiedcounter
+
+\chardef\@@discardedskip1
+\chardef\@@retainedskip 2
+\chardef\@@forcedskip 3
+\chardef\@@blockedskip 4
+\chardef\@@frozenskip 5 % after heads, no break
+
+\def\setsimplifiedskip#1#2%
+ {#1\dimexpr(10\dimexpr(#1/10)) plus \gluestretch#1 minus \glueshrink#1\relax
+ \advance#1\numexpr(#2)sp\relax}
+
+\def\getsimplifiedskip#1#2%
+ {\simplifiedskip#1\relax
+ \ifzeropt\simplifiedskip % \ifdim\simplifiedskip=\zeropoint
+ #2\zerocount
+ \else
+ \simplifiedcounter\dimexpr10\dimexpr#1/10\relax\relax
+ \advance\simplifiedskip-\simplifiedcounter
+ #2\number\simplifiedskip\relax
+ \fi}
+
+\def\conditionalskip#1#2%
+ {\scratchskip#1\relax
+ \setsimplifiedskip\scratchskip#2\relax
+ \vskip\scratchskip\relax}
+
+\def\defrostskip
+ {\scratchskip\lastskip\penalty50000\normalvskip-\scratchskip\penalty50000\relax}
+
+\def\frozenskip#1%
+ {\endgraf
+ \ifvmode
+ \getsimplifiedskip\lastskip\scratchcounter
+ \ifdim\lastskip>#1\else
+ \defrostskip
+ \conditionalskip{#1}\@@frozenskip
+ \fi
+ \fi}
+
+\def\discardedskip#1%
+ {\endgraf
+ \ifvmode
+ \getsimplifiedskip\lastskip\scratchcounter
+ \ifcase\scratchcounter
+ \conditionalskip{#1}\@@discardedskip
+ \or % discard
+ \ifdim\lastskip>#1\else
+ \normalvskip-\lastskip
+ \conditionalskip{#1}\@@discardedskip
+ \fi
+ \or % retain
+ \ifdim\lastskip>#1\else
+ \normalvskip-\lastskip
+ \conditionalskip{#1}\@@discardedskip
+ \fi
+ \or % forced
+ \conditionalskip{#1}\@@discardedskip
+ \or % ignored
+ \or % frozen
+ \ifdim\lastskip>#1\else
+ \defrostskip
+ \conditionalskip{#1}\@@frozenskip
+ \fi
+ \else\ifdim#1=\zeropoint\else
+ \vskip#1\relax
+ \fi\fi
+ \fi}
+
+\def\retainedskip#1%
+ {\endgraf
+ \ifvmode
+ \getsimplifiedskip\lastskip\scratchcounter
+ \ifcase\scratchcounter
+ \conditionalskip{#1}\@@retainedskip
+ \or % discard
+ \normalvskip-\lastskip
+ \conditionalskip{#1}\@@retainedskip
+ \or % retain
+ \ifdim\lastskip>#1\else
+ \normalvskip-\lastskip
+ \conditionalskip{#1}\@@retainedskip
+ \fi
+ \or % forced
+ \conditionalskip{#1}\@@retainedskip
+ \or % ignored
+ \or % frozen
+ \ifdim\lastskip>#1\else
+ \defrostskip
+ \conditionalskip{#1}\@@frozenskip
+ \fi
+ \else\ifdim#1=\zeropoint\else
+ \vskip#1\relax
+ \fi\fi
+ \fi}
+
+\def\forcedskip#1%
+ {\endgraf
+ \ifvmode
+ \conditionalskip{#1}\@@forcedskip
+ \fi}
+
+\def\blockedskip#1%
+ {\endgraf
+ \ifvmode
+ \getsimplifiedskip\lastskip\scratchcounter
+ \ifcase\scratchcounter
+ \conditionalskip{#1}\@@blockedskip
+ \or % discard
+ \conditionalskip{#1}\@@blockedskip
+ \or % retain
+ \conditionalskip{#1}\@@blockedskip
+ \or % forced
+ \conditionalskip{#1}\@@blockedskip
+ \or % ignored
+ \or % frozen
+ \ifdim\lastskip>#1\else
+ \defrostskip
+ \conditionalskip{#1}\@@frozenskip
+ \fi
+ \else\ifdim#1=\zeropoint\else
+ \vskip#1\relax
+ \fi\fi
+ \fi}
+
+% beware, changing this will break some code (like pos/backgrounds)
+
+\newtoks\everyfirstparagraphintro
+\newtoks\everynextparagraphintro
+\newtoks\@@everyparagraphtoks
+
+\chardef\everyparagraphintro\zerocount
+
+\def\setupparagraphintro
+ {\dodoubleempty\dosetupparagraphintro}
+
+\def\dosetupparagraphintro[#1][#2]%
+ {\processallactionsinset
+ [#1]
+ [ \v!reset=>\global\chardef\everyparagraphintro\zerocount
+ \global\everyfirstparagraphintro\emptytoks
+ \global\everynextparagraphintro \emptytoks,
+ \v!first=>\global\chardef\everyparagraphintro\plusone
+ \doglobal\appendtoks#2\to\everyfirstparagraphintro,
+ \v!next=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plusone\fi
+ \doglobal\appendtoks#2\to\everynextparagraphintro,
+ \v!each=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plustwo\fi
+ \doglobal\appendtoks#2\to\everyfirstparagraphintro
+ \doglobal\appendtoks#2\to\everynextparagraphintro]}
+
+%D We can say:
+%D
+%D \starttyping
+%D \setupparagraphintro[first][\index{Knuth}]
+%D \stoptyping
+%D
+%D Maybe more convenient is:
+%D
+%D \starttyping
+%D \flushatparagraph{\index{Zapf}}
+%D \stoptyping
+
+\def\flushatparagraph#1%
+ {\global\chardef\everyparagraphintro\plusone
+ \global\appendtoks{#1}\to\everyfirstparagraphintro}
+
+% \def\doinsertparagraphintro
+% {\ifcase\everyparagraphintro\relax
+% % no data
+% \@@everyparagraphtoks\emptytoks
+% \or
+% % first data
+% \global\chardef\everyparagraphintro\plustwo
+% \@@everyparagraphtoks\everyfirstparagraphintro
+% \global\everyfirstparagraphintro\emptytoks
+% \or
+% % next data
+% \@@everyparagraphtoks\everynextparagraphintro
+% \fi
+% \the\@@everyparagraphtoks}
+
+\def\doinsertparagraphintro
+ {\begingroup
+ \everypar\emptytoks
+ \ifcase\everyparagraphintro\relax
+ % no data
+ \@@everyparagraphtoks\emptytoks
+ \or
+ % first data
+ \global\chardef\everyparagraphintro\plustwo
+ \@@everyparagraphtoks\everyfirstparagraphintro
+ \global\everyfirstparagraphintro\emptytoks
+ \or
+ % next data
+ \@@everyparagraphtoks\everynextparagraphintro
+ \fi
+ \the\@@everyparagraphtoks
+ \endgroup}
+
+\def\insertparagraphintro
+ {\ifcase\everyparagraphintro\else\@EA\doinsertparagraphintro\fi}
+
+% \appendtoksonce\insertparagraphintro\to\everypar % should come last
+
+%D \starttyping
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}]
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}]
+%D \setupparagraphintro[next] [\hbox to 3.5em{\tt NEXT \hss}]
+%D \setupparagraphintro[next] [\hbox to 3.5em{\tt TXEN \hss}]
+%D \setupparagraphintro[each] [\hbox to 3.0em{\tt EACH \hss}]
+%D \setupparagraphintro[each] [\hbox to 3.0em{\tt HCEA \hss}]
+%D
+%D some paragraph \par
+%D some paragraph \par
+%D some paragraph \par
+%D
+%D \definelabel[parnumber]
+%D
+%D \setupparagraphintro[reset,each][\inleft{\slxx\parnumber}]
+%D
+%D some paragraph \par
+%D some paragraph \par
+%D some paragraph \par
+%D \stoptyping
+
+%D \macros
+%D {flushatnextpar}
+%D
+%D This macro collects data that will be flushed at the next paragraph.
+%D By using this macro you can avoid interfering nodes (writes, etc).
+
+\newbox \postponednodedata
+
+\def\flushatnextpar
+ {\bgroup
+ \dowithnextbox
+ {\global\setbox\postponednodedata\hbox{\box\postponednodedata\box\nextbox}\egroup}%
+ \hbox}
+
+\def\flushpostponednodedata
+ {\ifvoid\postponednodedata\else
+ \hbox{\smashedbox\postponednodedata}%
+ \fi}
+
+% Very nasty but needed for margin stuff inside colored
+% paragraphs.
+
+\let\normalvadjust\vadjust
+
+% \def\graphicvadjust % bad, those low level color calls here
+% {\dowithnextbox
+% {\normalvadjust
+% {\dostartgraphicgroup
+% \localstarttextcolor
+% \unvbox\nextbox
+% \localstoptextcolor
+% \dostopgraphicgroup}}%
+% \vbox}
+
+% test this prikkels/pascal margin text before heads (mode
+% 1) as well as uitwerkingen (mode 2)
+
+%chardef\graphicvadjustmode=0 % fake
+%chardef\graphicvadjustmode=1 % normal
+\chardef\graphicvadjustmode=2 % normal + compensate (== default)
+
+\def\graphicvadjust % bad, those low level color calls here
+ {\dowithnextboxcontent
+ {\forgetall}
+ {\ifcase\graphicvadjustmode \@EA \fakedvadjust \else \@EA\normalvadjust \fi
+ {\dostartgraphicgroup % don't ask
+ \localstarttextcolor
+ \unvbox\nextbox
+ \localstoptextcolor % don't ask
+ \dostopgraphicgroup
+ \ifcase\graphicvadjustmode \or \or
+ % corrects for one line paragraphs
+ \nointerlineskip
+ \kern-\struttotal
+ \nointerlineskip
+ \verticalstrut
+ \fi}}%
+ \vbox}
+
+%D This works only in a properly strutted line, and is meant
+%D for deeply burried operations, like in heads.
+
+\def\fakedvadjust
+ {\dowithnextbox
+ {\setbox\nextbox\hbox{\llap{\lower\strutdepth\box\nextbox}}%
+ \smashedbox\nextbox}%
+ \vtop}
+
+\def\flexiblespaceamount#1#2#3%
+ {#1\interwordspace
+ \!!plus#2\interwordstretch
+ \!!minus#3\interwordshrink}
+
+\def\fixedspaceamount#1%
+ {#1\interwordspace}
+
+%D This is a dangerous feature because it makes the \TEX\ source
+%D less portable, i.e. any parser now needs to apply exactly the
+%D same algorithm when it wants to interpret the source. We
+%D strongly recommend not to mention this feature in manuals! It's
+%D provided for users who are hooked to such a mechanism.
+%D
+%D \starttyping
+%D \setupsorting[logo][next=\autoinsertnextspace] \logo[TEX]{\TeX}
+%D
+%D bla bla \TEX bla bla \TEX (bla) bla (\TEX)
+%D \stoptyping
+
+\def\autoinsertnextspace{\futurelet\nexttoken\doautoinsertnextspace}
+
+\def\doautoinsertnextspace % slightly extended version of a user supplied macro
+ {\ifx\nexttoken \bgroup\else \ifx\nexttoken\begingroup\else
+ \ifx\nexttoken \egroup\else \ifx\nexttoken \endgroup\else
+ \ifx\nexttoken \/\else \ifx\nexttoken /\else \ifx\nexttoken ~\else
+ \ifx\nexttoken \ \else \ifx\nexttoken \blankspace\else \ifx\nexttoken \space\else
+ \ifx\nexttoken .\else \ifx\nexttoken ,\else
+ \ifx\nexttoken !\else \ifx\nexttoken ?\else
+ \ifx\nexttoken :\else \ifx\nexttoken ;\else
+ \ifx\nexttoken '\else \ifx\nexttoken "\else
+ \ifx\nexttoken )\else \ifx\nexttoken -\else \ifx\nexttoken |\else
+ \ifx\nexttoken \%\else \ifx\nexttoken \&\else
+ \space
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% moved from page-lin
+
+\def\installspacehandler#1#2% needs to set \obeyedspace
+ {\setvalue{\??sr#1}{#2}}
+
+\installspacehandler \v!on
+ {\obeyspaces
+ \def\obeyedspace{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}%
+ \let\ =\obeyedspace}
+
+\installspacehandler \v!yes
+ {\obeyspaces
+ \def\obeyedspace{\mathortext\normalspace{\dontleavehmode \normalspace }}%
+ \let\ =\obeyedspace}
+
+\installspacehandler \v!off % == default
+ {\normalspaces
+ \let\obeyedspace\normalspace
+ \let\ =\normalspaceprimitive} % was \normalspace
+
+\installspacehandler \v!fixed
+ {\obeyspaces
+ \def\obeyedspace{\mathortext\normalspace{\dontleavehmode\fixedspace}}%
+ \let\ =\obeyedspace}
+
+\def\activatespacehandler#1%
+ {\executeifdefined{\??sr#1}{\activatespacehandler\v!off}}
+
+% moved from page-lin
+
+%D When spacing is active we need to handle commands in
+%D a special way:
+%D
+%D \starttyping
+%D \setuplines[space=on]
+%D
+%D \startlines
+%D Let's talk about this{\ttsl\gobbleoneargument or}that.
+%D \stoplines
+%D
+%D \startlines
+%D Let's talk about this{\getvalue{ttsl}or}that.
+%D \stoplines
+%D \stoptyping
+%D
+%D One can indent in several ways:
+%D
+%D \starttyping
+%D \setupindenting[medium] \setuplines[indenting=odd] % no yes odd even
+%D
+%D \startlines
+%D first
+%D second
+%D third
+%D fourth
+%D \stoplines
+%D \stoptyping
+
+\def\setuplines
+ {\dodoubleargument\getparameters[\??rg]}
+
+\def\startlines
+ {\@@rgbefore
+ \pushmacro\checkindentation
+ \whitespace
+ %\page[\v!preference]} gaat mis na koppen, nieuw: later \nobreak
+ \begingroup
+ \setupindenting[\@@rgindenting]%
+ \typesettinglinestrue
+ \setupwhitespace[\v!none]%
+ \obeylines
+ \ignorespaces
+ \gdef\afterfirstobeyedline % tzt two pass, net als opsomming
+ {\gdef\afterfirstobeyedline
+ {\nobreak
+ \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}%
+ \def\obeyedline
+ {\par
+ \futurelet\next\dobetweenthelines}%
+ \activatespacehandler\@@rgspace
+ \GotoPar}
+
+\def\stoplines
+ {\endgroup
+ \popmacro\checkindentation
+ \@@rgafter}
+
+\def\dobetweenthelines
+ {\doifmeaningelse\next\obeyedline
+ {\@@rginbetween}
+ {\afterfirstobeyedline}}
+
+\setuplines
+ [\c!option=,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!inbetween=\blank,
+ \c!indenting=\v!no,
+ \c!space=\v!default]
+
+\def\emptylines
+ {\dosingleempty\doemptylines}
+
+\def\doemptylines[#1]%
+ {\endgraf\dorecurse{\iffirstargument#1\else3\fi}\crlf}
+
+\setupwhitespace
+ [\v!none]
+
+% still old-fashioned
+
+\indenting
+ [\v!never]
+
+\setupindenting
+ [\v!none]
+
+\setupblank
+ [\v!standard,
+ \v!big]
+
+\defineblank[\v!default] [\currentblank]
+\defineblank[\v!before] [\v!default]
+\defineblank[\v!inbetween][\v!default]
+\defineblank[\v!after] [\v!before]
+
+\setupinterlinespace
+ [\c!minheight=0pt, % only special purpose
+ \c!mindepth=0pt, % only special purpose
+ \c!height=.72,
+ \c!depth=.28,
+ \c!top=1.0,
+ \c!bottom=0.4,
+ \c!distance=1pt,
+ \c!line=2.8ex,
+ \c!stretch=0]
+
+\setupnarrower
+ [\c!before=\endgraf,
+ \c!after=\endgraf,
+ \c!left=1.5em,
+ \c!right=1.5em,
+ \c!middle=1.5em]
+
+\setuptolerance
+ [\v!horizontal,\v!verystrict]
+
+\setuptolerance
+ [\v!vertical,\v!strict]
+
+\setupalign
+ [\v!bottom,
+ \v!width]
+
+\setupspacing
+ [\v!packed]
+
+\protect \endinput
diff --git a/tex/context/base/spac-grd.mkii b/tex/context/base/spac-grd.mkii
new file mode 100644
index 000000000..249e2e430
--- /dev/null
+++ b/tex/context/base/spac-grd.mkii
@@ -0,0 +1,1074 @@
+%D \module
+%D [ file=core-grd,
+%D version=1998.03.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Grid Snapping (Experimental),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Core Macros / Grid Snapping}
+
+\unprotect
+
+%D Moved from supp-box:
+
+%D \macros
+%D {startbaselinecorrection,baselinecorrection,
+%D showbaselinecorrection,offbaselinecorrection}
+%D
+%D Spacing around ruled boxes can get pretty messed up. The
+%D next macro tries as good as possible to fix this.
+%D
+%D \startbuffer[1]
+%D \startbaselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \stopbaselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[1]
+%D
+%D The macros put some white space around the box:
+%D
+%D \getbuffer[1]
+%D
+%D A simple alternative is \type {\baselinecorrection}, which
+%D only looks at the previous line.
+%D
+%D \startbuffer[2]
+%D \baselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \baselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[2]
+%D
+%D This time the last preceding line gets a correction,%
+%D dependant on the depth.
+%D
+%D \getbuffer[2]
+%D
+%D One can make the correction visible by saying \type
+%D {\showbaselinecorrection}. Part of the correction is
+%D calculated from the dimensions of a~(. One can disble the
+%D correction by calling \type {\offbaselinecorrection}.
+%D
+%D When visualize the first example looks like:
+%D
+%D {\showbaselinecorrection\getbuffer[1]}
+%D
+%D and the second one comes out as:
+%D
+%D {\showbaselinecorrection\getbuffer[2]}
+
+% \definecolor[GridLineColor][red]
+% \definecolor[GridTextColor][blue]
+
+\definepalet
+ [grid]
+ [ one=red,
+ two=green,
+ three=blue,
+ four=gray]
+
+\def\setbaselinecorrections
+ {\setbox0\hbox{\setstrut\strut}%
+ \setbox2\hbox{(}%
+ \dimen0\ht0\advance\dimen0 -\ht2
+ \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi
+ \dimen2\dp0\advance\dimen2 -\dp2
+ \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi
+ \edef\thetopbaselinecorrection {\the\dimen0}\dimen0-\dimen0
+ \edef\thebotbaselinecorrection {\the\dimen2}\dimen2-\dimen2
+ \edef\thenegtopbaselinecorrection{\the\dimen0}%
+ \edef\thenegbotbaselinecorrection{\the\dimen2}}
+
+\def\dotopbaselinecorrection {\kern\thetopbaselinecorrection}
+\def\dobotbaselinecorrection {\kern\thebotbaselinecorrection}
+\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection}
+\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection}
+
+\def\showbaselinecorrection
+ {\def\dobaselinecorrection % visualization is not watertight!
+ {\bgroup
+\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+ \setbox0\null
+ \wd0\hsize
+ \dp0\strutdp
+ \nointerlineskip
+ \forgetall
+ \ruledvbox{\box0}%
+ \egroup
+ \prevdepth\strutdp}%
+ \def\dotopbaselinecorrection
+ {\hrule\!!height\thetopbaselinecorrection}%
+ \def\dobotbaselinecorrection
+ {\hrule\!!height\thebotbaselinecorrection}}
+
+\def\dobaselinecorrection
+ {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+ \kern\strutdp
+ \prevdepth\strutdp}
+
+% \def\baselinecorrection
+% {\endgraf
+% \ifvmode
+% \ifdim\prevdepth<\maxdimen
+% \ifdim\prevdepth<\zeropoint \else
+% \ifdim\prevdepth<\strutdp
+% \dobaselinecorrection
+% \fi
+% \fi
+% \fi
+% \fi}
+
+\def\baselinecorrection
+ {\endgraf
+ \ifvmode
+ \ifdim\prevdepth<\maxdimen
+ \ifdim\prevdepth<\zeropoint \else
+ \ifdim\prevdepth<\strutdepth \relax
+ \pushlastnode
+ \dobaselinecorrection
+ \poplastnode
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def\pagebaselinecorrection
+ {\ifdim\pagegoal<\maxdimen
+ \ifdim\pagetotal>\lineheight % or \topskip
+ \scratchdimen\pagetotal
+ \advance\scratchdimen\lineheight
+ \ifdim\scratchdimen<\pagegoal
+ \baselinecorrection
+ \fi
+ \fi
+ \fi}
+
+% Beware, keep this one as it is, see for instance module
+% m-steps.tex, where we apply a \localhsize to the \vbox, in
+% order to follow narrower and side floats !
+
+% \def\startbaselinecorrection
+% {\baselinecorrection
+% \ifvmode
+% \bgroup
+% \setbox\scratchbox\vbox\bgroup
+% \ignorespaces
+% \let\stopbaselinecorrection\dostopbaselinecorrection
+% \else
+% \let\stopbaselinecorrection\relax
+% \fi}
+
+% \def\dostopbaselinecorrection % I have to check columns yet.
+% {\endgraf
+% \egroup
+% \topbaselinecorrection
+% \box\scratchbox
+% \botbaselinecorrection
+% \egroup}
+
+% \let\stopbaselinecorrection=\relax
+
+\def\startbaselinecorrection
+ {\bgroup
+ \let\stopbaselinecorrection\egroup
+ \ifcase\baselinecorrectionmode
+ \or % normal
+ \baselinecorrection
+ \ifvmode
+ \setbox\scratchbox\vbox\bgroup\ignorespaces
+ \let\stopbaselinecorrection\donormalstopbaselinecorrection
+ \fi
+ \or % off
+ \or % force
+ \baselinecorrection
+ \ifvmode
+ \setbox\scratchbox\vbox\bgroup\ignorespaces
+ \let\stopbaselinecorrection\doforcedstopbaselinecorrection
+ \fi
+ \fi}
+
+\let\stopbaselinecorrection\relax
+
+\def\donormalstopbaselinecorrection % I have to check columns yet.
+ {\egroup
+ \topbaselinecorrection
+ \box\scratchbox
+ \botbaselinecorrection
+ \egroup}
+
+\def\doforcedstopbaselinecorrection % I have to check columns yet.
+ {\egroup
+ \forcedtopbaselinecorrection
+ \box\scratchbox
+ \forcedbotbaselinecorrection
+ \egroup}
+
+%D We do a bit more checking than needed. The pageborder check
+%D is not needed, but I want to look the visualization as good
+%D as possible too.
+
+% \def\offbaselinecorrection % Can be used inside correction.
+% {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}}
+
+\chardef\baselinecorrectionmode\plusone
+
+\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone }
+\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo }
+\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree}
+
+%D \macros
+%D {topbaselinecorrection,botbaselinecorrection}
+%D
+%D The actual top and bottom corrections are implemented as:
+
+% \def\topbaselinecorrection
+% {\ifvmode \ifdim\pagegoal<\maxdimen
+% \bgroup
+% \setbaselinecorrections
+% \whitespace
+% \nointerlineskip
+% \dotopbaselinecorrection
+% \egroup
+% \fi \fi}
+
+
+\def\topbaselinecorrection
+ {\ifvmode \ifdim\pagegoal<\maxdimen
+ \forcedtopbaselinecorrection
+ \fi \fi}
+
+\def\forcedtopbaselinecorrection
+ {\ifvmode
+ \bgroup
+ \setbaselinecorrections
+ \whitespace
+ \nointerlineskip
+ \dotopbaselinecorrection
+ \egroup
+ \fi}
+
+\def\botbaselinecorrection
+ {\ifvmode
+ \bgroup
+ \setbaselinecorrections
+ \dobotbaselinecorrection
+ \allowbreak % new, otherwise problems when many in a row
+ \prevdepth\strutdp
+ \egroup
+ \fi}
+
+\let\forcedbotbaselinecorrection\botbaselinecorrection
+
+%D Still very experimental and therefore undocumented.
+
+\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE
+\newif\ifforcepresnap \forcepresnaptrue % false in mixed single/double
+\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false
+
+\def\positiveextrasnap {\gdef\extrasnapsign{+}}
+\def\negativeextrasnap {\gdef\extrasnapsign{-}}
+
+\def\extrasnapreset {\global\chardef\@@extrasnap0
+ \positiveextrasnap}
+\def\extrasnapbefore {\global\chardef\@@extrasnap1 }
+\def\extrasnaparound {\global\chardef\@@extrasnap2 }
+\def\extrasnapafter {\global\chardef\@@extrasnap3 }
+
+\def\enablepresnapcorrection {\global\chardef\@@presnap\zerocount}
+\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone}
+
+\extrasnapreset \enablepresnapcorrection
+
+\newif\iftracegridsnapping
+\newif\ifshowgridboxes
+\newif\ifshowfuzzyskips
+
+\let\showgridboxes\showgridboxestrue
+
+\def\showgridsnapping
+ {\tracegridsnappingtrue
+ \showgridboxestrue}
+
+\chardef\@@alignsnap =0
+\chardef\@@alignsnapbox =0
+\chardef\@@alignsnapmethod=0
+
+\let\presnapskip \!!zeropoint \def\presnap {-}
+\let\postsnapskip\!!zeropoint \let\postsnap\presnap
+
+\newcount\currentgridsnap
+
+\def\tracedsnapping
+ {\iftracegridsnapping
+ \llap
+ {\startlayoutcomponent{gridsnaps}{grid snaps}%
+ \infofont
+ \global\advance\currentgridsnap\plusone
+ \color[grid:three]{\vl\presnapskip
+ \vl\presnap
+ \vl\postsnap
+ \ifcase\@@alignsnapbox\relax
+ \vl\ifcase\@@extrasnap
+ 00\or
+ \extrasnapsign0\or
+ \extrasnapsign\extrasnapsign\or
+ 0\extrasnapsign\fi
+ \fi
+ \vl\the\currentgridsnap\vl}%
+ \stoplayoutcomponent}%
+ \fi}
+
+\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox
+ {\dosingleempty\dosnaptogrid}
+
+% \def\dosnaptogrid[#1]%
+% {\ifgridsnapping
+% \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi
+% \expandafter\dodosnaptogrid
+% \fi}
+
+% \def\dosnaptogrid[#1]%
+% {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
+% \ifgridsnapping
+% \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
+% \expandafter\dodosnaptogrid
+% \fi}
+
+\def\dosnaptogrid[#1]%
+ {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up
+ \doifinsetelse\v!force{#1}%
+ {\moveongrid[#1]%
+ \dodosnaptogrid}
+ {\ifgridsnapping
+ \doifsomething{#1}{\moveongrid[#1]}%
+ \expandafter\dodosnaptogrid
+ \fi}}
+
+% \def\forcedpresnapcorrection % test this on 'details'
+% {\ifforcepresnap
+% \ifvmode \else \par \fi % new
+% % we don't want top of page space when 'top' option
+% %\verticalstrut\nobreak\vskip-\struttotal
+% %\verticalstrut\vskip-\struttotal
+% % nobreak really needed
+% \allowbreak\verticalstrut\nobreak\vskip-\struttotal
+% %\ifdim\pagetotal>\topskip \else
+% % eigenlijk signal
+% %\writestatus{grid}{removing dummy at top of page}%
+% %\bgroup
+% %\output{\setbox\scratchbox\box255}%
+% %\penalty\outputpenalty
+% %\egroup
+% %\fi
+% \fi}
+
+\def\forcedpresnapcorrection % test this on 'details'
+ {\ifforcepresnap
+ \ifvmode \else \par \fi % new
+ % we don't want top of page space when 'top' option
+ % \verticalstrut\nobreak\vskip-\struttotal
+ % \verticalstrut\vskip-\struttotal
+ % \nobreak really needed
+ % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper
+ \verticalstrut
+ \nobreak
+ \vskip-\struttotal
+ %\ifdim\pagetotal>\topskip \else
+ % eigenlijk signal
+ %\writestatus{grid}{removing dummy at top of page}%
+ %\bgroup
+ %\output{\setbox\scratchbox\box255}%
+ %\penalty\outputpenalty
+ %\egroup
+ %\fi
+ \fi}
+
+\def\setgridtracebox#1[#2]% % maybe reverse the order
+ {\setbox\nextbox#1%
+ {\hbox
+ {\hbox to \zeropoint
+ {\startlayoutcomponent{gridsnaps}{grid snaps}%
+ \color[grid:#2]{\ruledhbox{\fakebox\nextbox}}%
+ \stoplayoutcomponent
+ \hss}%
+ \flushnextbox}}}
+
+\newif\ifboxedsnapping \boxedsnappingtrue
+
+\chardef\depthsnapmethod \plusone % downward compatible, minus one line
+\chardef\heightsnapmethod\plusone % downward compatible, minus one line
+
+\def\dodosnaptogrid
+ {\dowithnextbox
+ {\bgroup
+ \ifcase\@@alignsnapmethod \or
+ % we're dealing with text with a possible big depth/height
+ \chardef\depthsnapmethod \plustwo
+ \chardef\heightsnapmethod\plustwo
+ \fi
+ \ifdim\nextboxht<\textheight % handle special case (like page fig)
+ \ifcase\@@alignsnapbox\relax
+ \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low
+ \ifshowgridboxes
+ \setgridtracebox\hbox[two]%
+ \fi
+ %\getnoflines{\nextboxht}%
+ \getnoflines\nextboxht
+ \setbox\nextbox\vbox to \noflines\lineheight
+ {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi
+ \ifnum\@@alignsnap>2 \vfill\fi
+ \flushnextbox
+ \ifnum\@@alignsnap<4 \vfill\fi}%
+ \fi
+ \ifshowgridboxes
+ \setgridtracebox\hbox[three]%
+ \fi
+ \forgetall
+ \par
+ \ifvbox\nextbox
+ \setbox\nextbox\hbox{\flushnextbox}% don't ask
+ \fi
+ \scratchskip\lastskip
+ \edef\presnapskip{\the\lastskip}%
+ % mixing single/double columns sometimes goes wrong,
+ % check 'som' document
+ \ifinsidecolumns
+ \forcepresnaptrue
+ \fi
+ \forcedpresnapcorrection
+ \ifdim\nextboxht>\strutht
+ \scratchdimen\nextboxht
+ \ifcase\@@presnap\relax
+ \ifdim\scratchskip>\zeropoint\relax
+ \scratchcounter\scratchskip
+ \advance\scratchcounter -\openlineheight
+ \ifnum\scratchcounter<0
+ \scratchcounter-\scratchcounter
+ \fi
+ \ifnum\scratchcounter<10 % \lastkip is about \openlineheight
+ \advance\scratchdimen -\openstrutdepth
+ \edef\presnapskip{*\presnapskip}%
+ \else\ifdim\scratchskip>\openlineheight
+ %<\openlineheight \else
+ \advance\scratchdimen -\openstrutdepth
+ \edef\presnapskip{*\presnapskip}%
+ \fi\fi
+ \fi
+ \fi
+ % \getnoflines\scratchdimen % maybe raw ?
+ % \advance\noflines -1
+ \ifcase\heightsnapmethod
+ % raw
+ \or
+ \advance\scratchdimen-\lineheight % tight (default)
+ \or
+ \advance\scratchdimen-\strutheight % fit (text)
+ \or
+ \advance\scratchdimen-\strutheight % tolerant
+ \advance\scratchdimen-\roundingeps
+ \fi
+ \getnoflines\scratchdimen
+ \ifnum\noflines>0
+ \scratchdimen\noflines\lineheight
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign \lineheight \fi
+ \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
+ \edef\presnap{\the\scratchdimen}%
+ \ifstrutsnapping
+ \ifboxedsnapping
+ \getrawnoflines\scratchdimen
+ \advance\scratchdimen-\noflines\lineheight
+ \vskip\scratchdimen % disappears at top of page
+ \dorecurse\noflines{\verticalstrut\nobreak}%
+ \else \ifdim\scratchdimen=\zeropoint
+ % nothing to skip
+ \else % disappears at top of page
+ \vskip\scratchdimen
+ \fi \fi
+ \fi
+ \ifdim\nextboxdp>\strutdp
+ % \getnoflines\nextboxdp
+ % \advance\noflines \minusone
+ \scratchdimen\nextboxdp\relax
+ \ifcase\depthsnapmethod
+ % raw
+ \or
+ \advance\scratchdimen-\lineheight % tight (default)
+ \or
+ \advance\scratchdimen-\strutdepth % fit (text)
+ \or
+ \advance\scratchdimen-\strutdepth % tolerant
+ \advance\scratchdimen-\roundingeps
+ \fi
+ \getnoflines\scratchdimen
+ \ifnum\noflines>0
+ \scratchdimen\noflines\lineheight
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi
+ \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign \lineheight \fi
+ \edef\postsnap{\the\scratchdimen}%
+ \ifstrutsnapping
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \else
+ \scratchdimen\presnap
+ \advance\scratchdimen \strutht
+ \nextboxht\scratchdimen
+ \scratchdimen\postsnap
+ \advance\scratchdimen \strutdp
+ \nextboxdp\scratchdimen
+ \fi
+ \hbox{\tracedsnapping\flushnextbox}%
+ \ifstrutsnapping
+ \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi
+ \fi
+ \else
+ \scratchdimen\nextboxht\relax
+ \ifcase\@@alignsnapbox
+ % can't happen here
+ \or
+ \getrawnoflines\scratchdimen
+ \else
+ \getnoflines \scratchdimen
+ \fi
+ \scratchdimen\noflines\lineheight\relax
+ \advance\scratchdimen-\strutdepth
+ % spoils the whole game (fit/broad/line)
+ % \ifnum\pagetotal>\zeropoint \else % disable this as option
+ % \advance\scratchdimen-\strutheight
+ % \advance\scratchdimen+\topskip
+ % \fi
+ \dimen0=\scratchdimen
+ \dimen2=\strutdepth
+ \ifshowgridboxes
+ \setgridtracebox\hbox[two]%
+ \fi
+ \nextboxdp\strutdp
+ \dimen4=\nextboxht
+ \dimen6=\nextboxdp
+ \iftracegridsnapping
+ \setbox\scratchbox\hbox
+ {\scratchdimen\@@alignsnapamount\relax
+ \ifdim\scratchdimen<\zeropoint
+ \tracedgridamount\zeropoint{-\scratchdimen}%
+ \else
+ \tracedgridamount\scratchdimen\zeropoint
+ \fi}%
+ \smashbox\scratchbox
+ \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}%
+ \fi
+ \setbox\nextbox\hbox
+ {\scratchdimen\@@alignsnapamount\relax
+ \ifcase\@@alignsnapdepth\or
+ % don't change this ever !
+ \ifdim\dimen0<\lineheight
+ % otherwise it is ok, but ending up inside
+ % the next paragraph is seldom what we want,
+ % so we move one line up
+ \advance\scratchdimen-\lineheight
+ \advance\scratchdimen\strutheight
+ \else
+ % otherwise we can move down to the
+ % baseline
+ \advance\scratchdimen\dimen6 % == \strutdepth
+ \fi
+ \fi
+ \lower\scratchdimen\flushnextbox}%
+ \nextboxht\dimen4
+ \nextboxdp\dimen6
+ \ifnum\@@alignsnap<4 % 4 = regel
+ \setbox\nextbox\vbox to \scratchdimen
+ {\forgetall
+ \ifnum\@@alignsnap>2 \vfill\fi % 3 4
+ \flushnextbox
+ \nointerlineskip % \offinterlineskip
+ \ifnum\@@alignsnap<4 \vfill\fi % 2 3
+ \kern\zeropoint}%
+ \fi
+ \ifshowgridboxes
+ \setgridtracebox\vbox[three]%
+ \fi
+ \scratchdimen\@@alignsnapamount
+ \edef\presnapskip{\the\scratchdimen}%
+ \ifnum\@@alignsnap>2 \def\presnap {+}\fi
+ \ifnum\@@alignsnap<4 \def\postsnap{+}\fi
+ \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}%
+ \par
+ \nextboxht\dimen0
+ \nextboxdp\dimen2
+ \forcedpresnapcorrection
+ \nointerlineskip
+ \flushnextbox
+ \fi
+ \else
+ \setbox\nextbox\vbox to \textheight
+ {\ifdim\nextboxdp=\zeropoint
+ \hbox{\lower\strutdepth\flushnextbox}
+ \else % this branch is yet untested
+ \vss
+ \hbox{\lower\nextboxdp\flushnextbox}
+ \vskip-\strutdepth
+ \fi}%
+ \nextboxdp\strutdepth
+ \flushnextbox
+ \fi
+ \extrasnapreset
+ \enablepresnapcorrection
+ \global\chardef\@@alignsnap\zerocount
+ \global\chardef\@@alignsnapbox\zerocount
+ \egroup}}
+
+\def\tracedgridamount#1#2%
+ {\startlayoutcomponent{gridsnaps}{grid snaps}%
+ \color[grid:four]{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}%
+ \stoplayoutcomponent}
+
+\def\snaptomathgrid % probably not working ok, also kind of obsolete
+ {\ifgridsnapping
+ \dowithnextbox
+ {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]}
+ \vbox\bgroup
+ \forgetdisplayskips
+ \@EA\let\@EA\next
+ \fi}
+
+\def\topsnaptogrid
+ {\ifgridsnapping
+ \dowithnextbox
+ {\scratchdimen\nextboxht
+ \advance\scratchdimen -\strutht
+ \advance\scratchdimen \topskip
+ \nextboxht\scratchdimen
+ \nextboxdp\zeropoint
+ \flushnextbox
+ \kern\lineheight
+ \kern-\topskip
+ \nointerlineskip}
+ \hbox
+ \fi}
+
+% \def\centertogrid % meant for special situations
+% {\ifgridsnapping
+% \dowithnextboxcontent
+% {\ignorespaces}
+% {\bgroup
+% \par
+% \scratchdimen\nextboxht
+% \advance\scratchdimen \nextboxdp
+% \getnoflines\scratchdimen
+% \setbox\nextbox\vbox to \noflines\lineheight
+% {\forgetall
+% \vskip\zeropoint \!!plus \nextboxht
+% \copy\nextbox
+% \kern.5\strutdp % VOORLOPIGE WAARDE
+% \vskip\zeropoint \!!plus \nextboxdp}%
+% \noindent\snaptogrid\vbox{\flushnextbox}%
+% \egroup}
+% \vbox % was \hbox
+% \fi}
+
+% The next implementation is sub-optimal
+%
+% \def\centertogrid % usage: see ie pascal / stepcharts
+% {\snaptogrid[\v!midden,.5\strutdp]\vbox}
+
+\def\centertogrid % meant for special situations
+ {\ifgridsnapping
+ \dowithnextboxcontent
+ {\ignorespaces}
+ {\bgroup
+ \par
+ \scratchdimen\nextboxht
+ \advance\scratchdimen \nextboxdp
+ \getnoflines\scratchdimen
+ \setbox\nextbox\vbox to \noflines\lineheight
+ {\forgetall
+ \vss
+ \topbaselinecorrection
+ \copy\nextbox
+ \botbaselinecorrection
+ \vss}%
+ \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}%
+ \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace
+ \noindent\snaptogrid\vbox{\flushnextbox}%
+ \egroup}
+ \vbox % was \hbox
+ \fi}
+
+% testbed for \centertogrid
+%
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination
+% {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination[2*2]
+% {\framed{test}} {} {\framed{test}} {}
+% {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination
+% {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination[2*2]
+% {\framed{test}} {} {\framed{test}} {}
+% {\framed{test}} {} {\framed{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination
+% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection
+% \startcombination[2*2]
+% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination
+% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+% \strut Bruggetje
+% \startlinecorrection[blank]
+% \startcombination[2*2]
+% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {}
+% \stopcombination
+% \stoplinecorrection
+
+\ifx\startbaselinecorrection\undefined \wait \fi % change order
+
+\let\normalstartbaselinecorrection=\startbaselinecorrection
+
+\def\startbaselinecorrection
+ {\ifgridsnapping
+ \centertogrid\bgroup
+ \let\stopbaselinecorrection\egroup
+ \else
+ \normalstartbaselinecorrection
+ \fi}
+
+\chardef\gridboxlinenomode\plusone
+\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame
+
+\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi}
+\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth}
+
+\def\setgridbox#1#2#3%
+ {\setbox#1\gridboxvbox to #3 % given size
+ {\forgetall
+ \resetteststrut
+ \offinterlineskip
+ \hsize#2%
+ \baselinerulefalse
+ \gridboxvbox % calculated size
+ {\getrawnoflines{#3}% \getnoflines{#3}%
+ \vskip\topskip
+ \vskip-\strutht
+ \scratchdimen#2\advance\scratchdimen \lineheight
+ \dorecurse\noflines
+ {\strut
+ \hskip-.5\lineheight
+ \ifcase\gridboxlinenomode\or
+ \rlap
+ {\hskip.2\bodyfontsize\hskip\scratchdimen
+ \infofont\hbox to 1em{\hss\recurselevel}}%
+ \or
+ \llap
+ {\infofont\hbox to 1em{\hss\recurselevel}%
+ \hskip.2\bodyfontsize}%
+ \fi
+ \vrule
+ \!!height \gridboxwidth
+ \!!depth \gridboxwidth
+ \!!width \scratchdimen
+ \par}}
+ \vfill}}
+
+%D Some intervention macros:
+
+\def\gridwarning#1{\message{[beware of #1 extra snap]}}
+
+\global\let\@@alignsnapamount\!!zeropoint
+\global\chardef\@@alignsnapdepth0
+
+\def\@@unknowngriddisplacement
+ {\global\chardef\@@alignsnapbox\plusthree
+ \global\let\@@alignsnapamount\commalistelement}
+
+\def\domoveongrid[#1]%
+ {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi}
+
+\def\dodomoveongrid[#1]% some day : speed up
+ {\global\chardef\@@alignsnap\zerocount
+ \global\chardef\@@alignsnapbox\zerocount
+ \global\chardef\@@alignsnapdepth\zerocount
+ \global\chardef\@@alignsnapmethod\zerocount
+ \global\let\@@alignsnapamount\!!zeropoint
+ \donefalse
+ \expanded{\processallactionsinset[#1]}
+ [\v!standard=>,
+ \v!normal=>, % to be sure
+ \v!yes=>, % to be sure
+ \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore,
+ \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter,
+ \v!both=>\positiveextrasnap\extrasnaparound,
+ -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore,
+ -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter,
+ -\v!both=>\negativeextrasnap\extrasnaparound,
+ \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations
+ \v!page=>\global\chardef\@@alignsnap\plusone, % topskip
+ \v!high=>\global\chardef\@@alignsnap\plustwo,
+ \v!middle=>\global\chardef\@@alignsnap\plusthree,
+ \v!low=>\global\chardef\@@alignsnap\plusfour,
+ \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new
+ \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new
+ \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new
+ \v!line=>\global\chardef\@@alignsnapbox\plusthree
+% \global\chardef\@@alignsnapdepth\plusone
+ \global\chardef\@@alignsnap\plusfour,
+ \v!reset=>\positiveextrasnap\extrasnapreset,
+ \v!none=>\global\chardef\@@alignsnap\zerocount
+ \global\chardef\@@alignsnapbox\zerocount,
+ \v!force=>, % turns on grid snapping even when not on
+ \s!default=>,
+ \s!unknown=>\@@unknowngriddisplacement]}
+
+\def\moveongrid
+ {\dosingleempty\domoveongrid}
+
+\def\doplaceongrid[#1]%
+ {\domoveongrid[#1]\snaptogrid\vbox}
+
+\def\placeongrid
+ {\dosingleempty\doplaceongrid}
+
+%D Snapping is rather robust as long as we use whole lines.
+%D Half lines of white space can however be handled when they
+%D come in pairs. The corrections needed when crossing page
+%D boundaries in the middle of such a pair, are handled by
+%D macros that are (named) sort of fuzzy. This fuzzy mechanism
+%D was written as an extension to the grid typesetting needed
+%D for typesetting (part of) the \MAPS.
+%D
+%D \starttyping
+%D \setuptyping
+%D [before={\blank[halfline]},
+%D after={\blank[halfline]}]
+%D \stoptyping
+
+\newif \iffuzzyvskip
+\newif \iffuzzysnapdone
+\newif \iffuzzysnapping
+\newif \iffuzzysnapped
+\chardef \fuzzysnappedleft=0 % ==1 when fuzzybegin still open
+\newpersistentmark\fuzzymark % (!)
+\newcount \fuzzymarker
+\newbox \fuzzysnapbox
+\newbox \fuzzysnapsplit
+
+\def\dosyncfuzzyvskip
+ {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint
+ \bgroup % - added 28/2/2003: check this, there was no -
+ \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal
+ \egroup
+ \fi\fi\fi}
+
+\def\fuzzyvskip#1%
+ {\iffuzzysnapdone
+ \dosyncfuzzyvskip % NEWER
+ \endfuzzysnapping
+ \vskip#1\relax
+ \global\fuzzysnapdonefalse
+ \else
+ \vskip#1\relax
+ \beginfuzzysnapping
+ \global\fuzzysnapdonetrue
+ \fi}
+
+\def\setfuzzymark#1#2#3% #1/#2 => error recovery
+ {\ifgridsnapping
+ \global\fuzzysnappingtrue
+ \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi
+ \nobreak
+ \ifshowfuzzyskips
+ \hbox{\color[grid:three]
+ {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak
+ \vrule\!!width\hsize\!!height.1\lineheight}}
+ \nobreak
+ \fi
+ %[\the\fuzzymarker]
+ %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
+ \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}%
+ \nobreak
+ \fi}
+
+\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd
+\def\endfuzzysnapping {\setfuzzymark12\v!stop } % even
+
+\def\removelastfuzzyvskip
+ {\ifgridsnapping
+ \iffuzzysnapping
+ \ifdim\lastskip<\openlineheight
+ \else
+ \removelastskip
+ \fi
+ \else
+ \removelastskip
+ \fi
+ \else
+ \removelastskip
+ \fi}
+
+\def\docheckfuzzysnap#1%
+ {\bgroup
+ \dontcomplain
+ \setbox\fuzzysnapbox\copy#1\relax
+ \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight
+ \let\topfuzzymark\empty % indeed here ... no real mark
+ \getsplitmarks\fuzzymark
+% \ifcase0\topfuzzymark
+ \ifcase0\rawgetsplittopmark\fuzzymark
+ \global\chardef\fuzzysnappedleft\zerocount
+ \global\fuzzysnappedfalse
+% \else\ifodd\topfuzzymark
+ \else\ifodd\rawgetsplittopmark\fuzzymark
+ \global\chardef\fuzzysnappedleft\plusone
+ \global\fuzzysnappedtrue
+ \else
+ \global\chardef\fuzzysnappedleft=2
+ \global\fuzzysnappedtrue
+ \fi\fi
+ \iffuzzysnapped \else
+ \doloop
+ {\ifvoid\fuzzysnapbox
+ \exitloop
+ \else
+ \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight
+ %\let\topfuzzymark=\empty % ... but not here
+ \getsplitmarks\fuzzymark
+% \ifcase0\topfuzzymark
+ \ifcase0\rawgetsplittopmark\fuzzymark
+ % continue
+% \else\ifodd\topfuzzymark
+ \else\ifodd\rawgetsplittopmark\fuzzymark
+ \exitloop
+ \else
+ \global\chardef\fuzzysnappedleft\plusone
+ \global\fuzzysnappedtrue
+ \exitloop
+ \fi\fi
+ \fi}%
+ \fi
+ \egroup}
+
+\def\getfuzzysnapcorrection#1%
+ {\global\let\presnapcorrection \relax
+ \global\let\postsnapcorrection\relax
+ \ifgridsnapping\iffuzzysnapping
+ \docheckfuzzysnap{#1}%
+ \iffuzzysnapped
+ \iftracegridsnapping
+ \gdef\presnapcorrection
+ {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}%
+ \else
+ \gdef\presnapcorrection{\kern.5\openlineheight}%
+ \fi
+ \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok
+ \fi
+ \fi\fi}
+
+\def\fuzzysnappedbox#1#2% \box<n> \unvbox<n>
+ {\getfuzzysnapcorrection{#2}%
+ \presnapcorrection
+ #1#2%
+ \postsnapcorrection}
+
+\def\adaptfuzzypagegoal
+ {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents
+ \scratchdimen\pagegoal
+ \advance\scratchdimen -.5\openlineheight
+ \global\pagegoal\scratchdimen
+ \global\advance\vsize -.5\openlineheight
+ \global\chardef\fuzzysnappedleft0
+ \fi\fi\fi}
+
+%D New, experimental, used in caption snapping:
+%D
+%D \starttyping
+%D \startcolumnset
+%D
+%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top]
+%D
+%D \placefigure [lrtb] {\dorecurse{5}{green gras}}
+%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D \placefigure [lrtb] {\dorecurse{15}{green gras}}
+%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D
+%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom]
+%D
+%D \placefigure [rltb] {\dorecurse{5}{green gras}}
+%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D \placefigure [rltb] {\dorecurse{15}{green gras}}
+%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]}
+%D
+%D \input thuan
+%D
+%D \stopcolumnset
+%D \stoptyping
+
+\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! !
+ {\doifsomething{#2}
+ {\getnoflines{\ht#1}% no depth taken into account, depth preserved
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen-\strutdp
+ \bgroup
+ \advance\scratchdimen-\onepoint % be a bit tolerant
+ \ifdim\scratchdimen>\ht#1\relax
+ \egroup
+ \doif{#2}\v!top {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}%
+ \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}%
+ \dp#1\strutdp
+ \else
+ \egroup
+ \ht#1\scratchdimen
+ \dp#1\strutdp
+ \fi}}
+
+%D New:
+
+\let\checkgridsnapping\relax
+
+\protect \endinput
diff --git a/tex/context/base/spac-grd.mkiv b/tex/context/base/spac-grd.mkiv
new file mode 100644
index 000000000..bd5c51a85
--- /dev/null
+++ b/tex/context/base/spac-grd.mkiv
@@ -0,0 +1,259 @@
+%D \module
+%D [ file=spac-grd,
+%D version=2009.10.16, % 1998.03.10, was core-grd.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Grid Snapping,
+%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 will be merged intio spac-ver.mkiv.
+
+\writestatus{loading}{ConTeXt Spacing Macros / Grid Snapping}
+
+% buff-ver.mkiv: halfline spacing
+% strc-mat.mkiv: configure math grid (new code needed)
+% page-one.mkiv: to be checked
+% page-mul.mkiv: to be checked and redone
+% page-sid.mkiv: to be checked
+% page-set.mkiv: to be checked
+% strc-not.mkiv: to be checked
+% strc-ren.mkiv: to be checked
+% strc-flt.mkiv: to be checked (captions, probably top/bottom)
+% core-mis.mkiv: to be checked (placement, probbaly harmless)
+
+\unprotect
+
+%D Helpers:
+
+\let\poplastnode\relax
+
+\def\pushlastnode
+ {\ifdim\lastskip=\zeropoint
+ \ifnum\lastpenalty=\zerocount
+ \ifnum\lastkern=\zerocount
+ \let\poplastnode\relax
+ \else
+ \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested
+ \fi
+ \else
+ \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested
+ \fi
+ \else
+ \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip
+ \fi}
+
+%D Moved from supp-box:
+
+%D \macros
+%D {startbaselinecorrection,baselinecorrection,
+%D showbaselinecorrection,offbaselinecorrection}
+%D
+%D Spacing around ruled boxes can get pretty messed up. The
+%D next macro tries as good as possible to fix this.
+%D
+%D \startbuffer[1]
+%D \startbaselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \stopbaselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[1]
+%D
+%D The macros put some white space around the box:
+%D
+%D \getbuffer[1]
+%D
+%D A simple alternative is \type {\baselinecorrection}, which
+%D only looks at the previous line.
+%D
+%D \startbuffer[2]
+%D \baselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \baselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[2]
+%D
+%D This time the last preceding line gets a correction,%
+%D dependant on the depth.
+%D
+%D \getbuffer[2]
+%D
+%D One can make the correction visible by saying \type
+%D {\showbaselinecorrection}. Part of the correction is
+%D calculated from the dimensions of a~(. One can disble the
+%D correction by calling \type {\offbaselinecorrection}.
+%D
+%D When visualize the first example looks like:
+%D
+%D {\showbaselinecorrection\getbuffer[1]}
+%D
+%D and the second one comes out as:
+%D
+%D {\showbaselinecorrection\getbuffer[2]}
+
+% \definecolor[GridLineColor][red]
+% \definecolor[GridTextColor][blue]
+
+\let\thetopbaselinecorrection \!!zeropoint
+\let\thebotbaselinecorrection \!!zeropoint
+\let\thenegtopbaselinecorrection\!!zeropoint
+\let\thenegbotbaselinecorrection\!!zeropoint
+
+\def\setbaselinecorrections
+ {\setbox0\hbox{\setstrut\strut}%
+ \setbox2\hbox{(}%
+ \dimen0\ht0\advance\dimen0 -\ht2
+ \ifdim\dimen0<\zeropoint\dimen0\zeropoint\fi
+ \dimen2\dp0\advance\dimen2 -\dp2
+ \ifdim\dimen2<\zeropoint\dimen2\zeropoint\fi
+ \edef\thetopbaselinecorrection {\the\dimen0}\dimen0-\dimen0
+ \edef\thebotbaselinecorrection {\the\dimen2}\dimen2-\dimen2
+ \edef\thenegtopbaselinecorrection{\the\dimen0}%
+ \edef\thenegbotbaselinecorrection{\the\dimen2}}
+
+\def\dotopbaselinecorrection {\kern\thetopbaselinecorrection}
+\def\dobotbaselinecorrection {\kern\thebotbaselinecorrection}
+\def\donegtopbaselinecorrection{\kern\thenegtopbaselinecorrection}
+\def\donegbotbaselinecorrection{\kern\thenegbotbaselinecorrection}
+
+\def\showbaselinecorrection
+ {\def\dobaselinecorrection % visualization is not watertight!
+ {\bgroup
+\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+ \setbox0\null
+ \wd0\hsize
+ \dp0\strutdp
+ \nointerlineskip
+ \forgetall
+ \ruledvbox{\box0}%
+ \egroup
+ \prevdepth\strutdp}%
+ \def\dotopbaselinecorrection
+ {\hrule\!!height\thetopbaselinecorrection}%
+ \def\dobotbaselinecorrection
+ {\hrule\!!height\thebotbaselinecorrection}}
+
+\def\dobaselinecorrection
+ {\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
+ \kern\strutdp
+ \prevdepth\strutdp}
+
+\def\baselinecorrection
+ {\endgraf
+ \ifvmode
+ \ifdim\prevdepth<\maxdimen
+ \ifdim\prevdepth<\zeropoint \else
+ \ifdim\prevdepth<\strutdepth \relax
+ \pushlastnode
+ \dobaselinecorrection
+ \poplastnode
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def\pagebaselinecorrection
+ {\ifdim\pagegoal<\maxdimen
+ \ifdim\pagetotal>\lineheight % or \topskip
+ \scratchdimen\pagetotal
+ \advance\scratchdimen\lineheight
+ \ifdim\scratchdimen<\pagegoal
+ \baselinecorrection
+ \fi
+ \fi
+ \fi}
+
+\unexpanded\def\startbaselinecorrection
+ {\bgroup
+ \let\stopbaselinecorrection\egroup
+ \ifcase\baselinecorrectionmode
+ \or % normal
+ \baselinecorrection
+ \ifvmode
+ \setbox\scratchbox\vbox\bgroup\ignorespaces
+ \let\stopbaselinecorrection\donormalstopbaselinecorrection
+ \fi
+ \or % off
+ \or % force
+ \baselinecorrection
+ \ifvmode
+ \setbox\scratchbox\vbox\bgroup\ignorespaces
+ \let\stopbaselinecorrection\doforcedstopbaselinecorrection
+ \fi
+ \fi}
+
+\let\stopbaselinecorrection\relax
+
+\def\donormalstopbaselinecorrection % I have to check columns yet.
+ {\egroup
+ \topbaselinecorrection
+ \box\scratchbox
+ \botbaselinecorrection
+ \egroup}
+
+\def\doforcedstopbaselinecorrection % I have to check columns yet.
+ {\egroup
+ \forcedtopbaselinecorrection
+ \box\scratchbox
+ \forcedbotbaselinecorrection
+ \egroup}
+
+%D We do a bit more checking than needed. The pageborder check
+%D is not needed, but I want to look the visualization as good
+%D as possible too.
+
+\chardef\baselinecorrectionmode\plusone
+
+\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone }
+\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo }
+\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree}
+
+%D \macros
+%D {topbaselinecorrection,botbaselinecorrection}
+%D
+%D The actual top and bottom corrections are implemented as:
+
+\def\topbaselinecorrection
+ {\ifvmode \ifdim\pagegoal<\maxdimen
+ \forcedtopbaselinecorrection
+ \fi \fi}
+
+\def\forcedtopbaselinecorrection
+ {\ifvmode
+ \bgroup
+ \setbaselinecorrections
+ \whitespace
+ \nointerlineskip
+ \dotopbaselinecorrection
+ \egroup
+ \fi}
+
+\def\botbaselinecorrection
+ {\ifvmode
+ \bgroup
+ \setbaselinecorrections
+ \dobotbaselinecorrection
+ \allowbreak % new, otherwise problems when many in a row
+ \prevdepth\strutdp
+ \egroup
+ \fi}
+
+\let\forcedbotbaselinecorrection\botbaselinecorrection
+
+\let\normalstartbaselinecorrection\startbaselinecorrection
+
+\unexpanded\def\startbaselinecorrection
+ {\ifgridsnapping
+ \snaptogrid[v!normal]\vbox\bgroup
+ \let\stopbaselinecorrection\egroup
+ \else
+ \normalstartbaselinecorrection
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/spac-hor.lua b/tex/context/base/spac-hor.lua
new file mode 100644
index 000000000..6cb6e3f49
--- /dev/null
+++ b/tex/context/base/spac-hor.lua
@@ -0,0 +1,32 @@
+if not modules then modules = { } end modules ['spac-hor'] = {
+ version = 1.001,
+ comment = "companion to spac-hor.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local match = string.match
+local utfbyte = utf.byte
+local chardata = characters.data
+
+local can_have_space = table.tohash {
+ "lu", "ll", "lt", "lm", "lo", -- letters
+ -- "mn", "mc", "me", -- marks
+ "nd", "nl", "no", -- numbers
+ "ps", "pi", -- initial
+ -- "pe", "pf", -- final
+ -- "pc", "pd", "po", -- punctuation
+ "sm", "sc", "sk", "so", -- symbols
+ -- "zs", "zl", "zp", -- separators
+ -- "cc", "cf", "cs", "co", "cn", -- others
+}
+
+function commands.autonextspace(str) -- todo: use nexttoken
+ local ch = match(str,"the letter (.)") or match(str,"the character (.)")
+ ch = ch and chardata[utfbyte(ch)]
+ if ch and can_have_space[ch.category] then
+ -- texsprint(ctxcatcodes,"\\space") -- faster
+ context.space()
+ end
+end
diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv
new file mode 100644
index 000000000..9f902678a
--- /dev/null
+++ b/tex/context/base/spac-hor.mkiv
@@ -0,0 +1,946 @@
+%D \module
+%D [ file=spac-hor,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Horizontal,
+%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 Spacing Macros / Horizontal}
+
+\unprotect
+
+\registerctxluafile{spac-hor}{1.001}
+
+\let\currentindentation\empty % amount/keyword
+\let\currentindenting \empty % method
+
+\newdimen \ctxparindent
+\parindent\ctxparindent % for the show
+
+\newif \ifindentfirstparagraph \indentfirstparagraphtrue
+\chardef\indentingtoggle\zerocount
+
+%D After a blank or comparable situation (left side floats) we
+%D need to check if the next paragraph has to be indented.
+
+\def\presetindentation
+ {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}}
+
+% we need a better everypar model: for each option a switch, which we
+% set to false with \forgetall and can enable when needed (context 4);
+% that way we can control the order of execution of options
+
+\def\checkeverypar % currently a hack
+ {\ifzeropt\parindent\else
+ \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}%
+ \fi}
+
+\definecomplexorsimple\setupindenting
+
+\def\complexsetupindenting[#1]%
+ {\edef\currentindenting{#1}%
+ \doifsomething\currentindenting % handy when a parameter is passed
+ {% not here: \indentfirstparagraphtrue
+ % not here: \parindent\ctxparindent
+ % not here: \chardef\indentingtoggle\zerocount
+ % we use commacommand in order to catch #1 being a command (expanded parameter)
+ \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc
+ \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest
+ \checkeverypar % only when non-empty #1
+ \ifindentfirstparagraph\else\noindentation\fi % added
+ \toggleindentation}}
+
+\def\docomplexsetupindentingA#1%
+ {\edefconvertedargument\!!stringa{#1}% can this be done differently now?
+ \ifcsname\??in:\!!stringa\endcsname \else
+ \edef\currentindentation{#1}%
+ \let\normalindentation\currentindentation
+ \simplesetupindenting
+ \fi}
+
+\def\docomplexsetupindentingB#1%
+ {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen
+ \executeifdefined{\??in:\!!stringa}\donothing}
+
+\def\simplesetupindenting % empty case, a it strange, needed this way?
+ {\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}}
+
+\def\indenting % kind of obsolete
+ {\dosingleargument\complexsetupindenting}
+
+% use \noindentation to suppress next indentation
+
+\unexpanded\def\defineindentingmethod[#1]#2%
+ {\setvalue{\??in:#1}{#2}}
+
+\defineindentingmethod [\v!no] {\parindent\zeropoint}% was: \ctxparindent\noindent}
+\defineindentingmethod [\v!not] {\parindent\zeropoint}% was: \ctxparindent\noindent}
+
+\defineindentingmethod [\v!first] {\indentfirstparagraphtrue}
+\defineindentingmethod [\v!next] {\indentfirstparagraphfalse}
+
+\defineindentingmethod [\v!yes] {\parindent\ctxparindent\relax} % no \indent !
+\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent !
+
+\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent !
+ \chardef\indentingtoggle\zerocount}
+
+\defineindentingmethod [\v!odd] {\chardef\indentingtoggle\plusone}
+\defineindentingmethod [\v!even] {\chardef\indentingtoggle\plustwo}
+
+\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else
+ \let\currentindentation\normalindentation
+ \simplesetupindenting
+ \fi}
+
+\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue
+ \parindent\zeropoint
+ \chardef\indentingtoggle\zerocount}
+
+\def\noindenting{\indenting[\v!no, \v!next ]}
+\def\doindenting{\indenting[\v!yes,\v!first]}
+
+%D This one sets up the local indentation behaviour (i.e. either or not
+%D a next paragraph will be indented).
+
+\def\dochecknextindentation#1% internal one
+ {\checknextindentation[\csname#1\c!indentnext\endcsname]}
+
+\setvalue{\??in->\s!empty}{}
+\setvalue{\??in->\v!yes }{\doindentation}
+\setvalue{\??in->\v!no }{\noindentation}
+\setvalue{\??in->\v!auto }{\autoindentation}
+
+\unexpanded\def\checknextindentation[#1]%
+ {\csname\??in->\ifcsname\??in->#1\endcsname#1\else\s!empty\fi\endcsname}
+
+%D Here come the handlers.
+
+\newif\ifindentation \indentationtrue % documenteren, naar buiten
+
+\let\checkindentation\relax
+
+\ifx\autoindentation\undefined \let\autoindentation\relax \fi % hook
+
+\def\doindentation
+ {\gdef\checkindentation{\global\indentationtrue}}
+
+\def\noindentation % made global
+ {\ifinpagebody \else
+ \global\indentationfalse
+ \gdef\checkindentation
+ {\donoindentation
+ \gdef\checkindentation{\global\indentationtrue}}%
+ \fi}
+
+\def\nonoindentation % bv bij floats
+ {\ifinpagebody \else
+ \global\indentationtrue
+ \gdef\checkindentation{\global\indentationtrue}%
+ \fi}
+
+\def\donoindentation
+ {\ifdim\parindent=\zeropoint \else
+ \bgroup \setbox\scratchbox\lastbox \egroup
+ \fi}
+
+\def\indentation
+ {\ifvmode \ifdim\parindent=\zeropoint \else
+ % was : \hskip\parindent
+ % can be: \indent
+ % but we test:
+ \noindent\hskip\parindent
+ \fi \fi}
+
+\def\toggleindentation % does not play well with noindentation
+ {\ifcase\indentingtoggle
+ % nothing
+ \or
+ \notoggleindentation
+ \or
+ \dotoggleindentation
+ \fi}
+
+\def\dokillindentation
+ {\gdef\checkindentation{\global\indentationfalse\donoindentation}}
+
+\def\dotoggleindentation
+ {\gdef\checkindentation{\global\indentationfalse\notoggleindentation\donoindentation}}
+
+\def\notoggleindentation
+ {\gdef\checkindentation{\global\indentationtrue\dotoggleindentation}}
+
+\appendtoks
+ \pushmacro\checkindentation
+ \pushmacro\ifindentation
+\to \everypushsomestate
+
+\appendtoks
+ \popmacro\ifindentation
+ \popmacro\checkindentation
+\to \everypopsomestate
+
+% we need to save the state if we want to adapt behaviour to empty lines
+%
+% \def\setlasthvmode
+% {\global\chardef\savedhvmode\ifhmode\plusone\else\ifvmode\plustwo\else\zerocount\fi\fi}
+%
+% \def\resetlasthvmode
+% {\global\chardef\savedhvmode\zerocount}
+%
+% \chardef\savedhvmode\zerocount
+
+% This is a user requested hack (using the auto-hook).
+
+\chardef\recheckindentationmode\zerocount
+
+\def\dontrechecknextindentation
+ {\global\chardef\recheckindentationmode\zerocount}
+
+\def\dorechecknextindentation
+ {\ifcase\recheckindentationmode
+ % nothing
+ \or
+ \dontrechecknextindentation
+ \expandafter\doautoindentation
+ \fi}
+
+\def\doautoindentation
+ {\doifnextcharelse\par\donothing\noindentation}
+
+\def\autoindentation
+ {\global\chardef\recheckindentationmode\plusone}
+
+%D An example of usage:
+%D
+%D \starttyping
+%D \setupindenting[small,yes]
+%D
+%D \setupitemize [indentnext=auto]
+%D \setuptyping [indentnext=auto]
+%D \setupformulas[indentnext=auto]
+%D
+%D \input tufte \startitemize \item itemize \stopitemize
+%D \input tufte \startitemize \item itemize \stopitemize
+%D \input tufte \startitemize \item itemize \stopitemize
+%D
+%D \page
+%D
+%D \input tufte
+%D \starttyping
+%D verbatim
+%D \stoptyping
+%D
+%D \input tufte
+%D \starttyping
+%D verbatim
+%D \stoptyping
+%D
+%D \input tufte
+%D \starttyping
+%D verbatim
+%D \stoptyping
+%D
+%D \page
+%D
+%D \input tufte \startformula a = b \stopformula
+%D \input tufte \startformula a = b \stopformula
+%D \input tufte \startformula a = b \stopformula
+%D \stoptyping
+
+\def\softbreak
+ {\relax\ifhmode\hskip\parfillskip\break\fi}
+
+%D \macros
+%D {frenchspacing,nonfrenchspacing}
+%D
+%D Smehow \type{\frenchspacing} can lead to hyphenation between
+%D dashes so we now have \type {\newfrenchspacing} (moved from
+%D \type {syst-chr}).
+
+%D Hm ... todo:
+
+\sfcode`\)=0
+\sfcode`\'=0
+\sfcode`\]=0
+
+\def\setfrenchspacing#1%
+ {\sfcode`\.#1 \sfcode`\,#1\relax
+ \sfcode`\?#1 \sfcode`\!#1\relax
+ \sfcode`\:#1 \sfcode`\;#1\relax}
+
+\def\frenchspacing
+ {\setfrenchspacing{1000}}
+
+\def\resetfrenchspacing
+ {\sfcode`\.3000 \sfcode`\,1250
+ \sfcode`\?3000 \sfcode`\!3000
+ \sfcode`\:2000 \sfcode`\;1500 }
+
+\def\frenchspacing {\setfrenchspacing{1000}}
+\def\newfrenchspacing{\setfrenchspacing{1050}}
+\def\nonfrenchspacing{\resetfrenchspacing}
+
+\unexpanded\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}}
+
+\definespacingmethod[\v!packed]{\newfrenchspacing}
+\definespacingmethod[\v!broad ]{\nonfrenchspacing}
+
+\def\complexsetupspacing[#1]%
+ {\executeifdefined{\??sg\??sg#1}\relax
+ \updateraggedskips}
+
+\def\simplesetupspacing
+ {\updateraggedskips}
+
+\definecomplexorsimple\setupspacing
+
+% \dorecurse{100}{\recurselevel\spacefactor 800 \space} \par
+% \dorecurse{100}{\recurselevel\spacefactor1200 \space} \par
+% \dorecurse{100}{\recurselevel\spacefactor 800 \normalspaceprimitive} \par
+% \dorecurse{100}{\recurselevel\spacefactor1200 \normalspaceprimitive} \par
+
+% When we don't add the % here, we effectively get \<endlinechar> and
+% since we have by default \def\^^M{\ } we get into a loop.
+
+\let\normalspaceprimitive=\ % space-comment is really needed
+
+% hm ...
+
+% \unexpanded\def\normalnotobeyedspace{\mathortext\normalspaceprimitive\space} % no \dontleavehmode\space (else no frenchspacing)
+% \let\ =\normalnotobeyedspace
+
+% Because I strip spaces at the end of lines (in the editor) we need a bit of
+% a trick to define slash+newline, so \space and \<newline> are the same
+
+% We need to be careful with \ and \space and the definition of ~ which uses \ as
+% we need to associate unicode spacing with it. There is some messy thing that that
+% I forgot to note down so I will revision the \ once I ran into it again.
+
+% \ruledhbox spread 10pt {\frenchspacing xx xx\ X}
+% \ruledhbox spread 10pt {\nonfrenchspacing xx xx\ X}
+% \ruledhbox spread 10pt {\frenchspacing xx xx X}
+% \ruledhbox spread 10pt {\nonfrenchspacing xx xx X}
+% \ruledhbox spread 10pt {\frenchspacing xx xx~X}
+% \ruledhbox spread 10pt {\nonfrenchspacing xx xx~X}
+
+% \ruledhbox spread 10pt {\frenchspacing xx dr.\ X}
+% \ruledhbox spread 10pt {\nonfrenchspacing xx dr.\ X}
+% \ruledhbox spread 10pt {\frenchspacing xx dr. X}
+% \ruledhbox spread 10pt {\nonfrenchspacing xx dr. X}
+% \ruledhbox spread 10pt {\frenchspacing xx dr.~X}
+% \ruledhbox spread 10pt {\nonfrenchspacing xx dr.~X}
+
+\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\normalspaceprimitive} % no space in math
+
+\letcatcodecommand \ctxcatcodes `\~ \nonbreakablespace % overloaded later
+
+\def\space { }
+\def\removelastspace{\ifhmode\unskip\fi}
+\def\nospace {\removelastspace\ignorespaces}
+
+\ifdefined\softhyphen \else \let\softhyphen\- \fi
+
+\ctxlua{tex.sprint(tex.ctxcatcodes,"\string\\unexpanded\string\\def\string\\\string\n{\string\\space}")}
+% \ctxlua{tex.sprint(tex.ctxcatcodes,"\string\\let\string\\\string\n=\string\\space")}
+
+% in tables we need:
+%
+% \def\fixedspace {\hskip.5em\relax}
+%
+% but, since not all fonts have .5em digits:
+
+\unexpanded\def\fixedspace
+ {\setbox\scratchbox\normalhbox{\mathortext{0}{0}}%
+ \hskip\wd\scratchbox\relax}
+
+\def\fixedspaces
+ {\letcatcodecommand \ctxcatcodes `\~ \fixedspace}
+
+\appendtoks
+ \let~\space
+ \let\ \space
+\to\simplifiedcommands
+
+\unexpanded\def\removeunwantedspaces
+ {\ifhmode
+ \expandafter \doremoveunwantedspace
+ \fi}
+
+\def\doremoveunwantedspace
+ {\ifnum\lastnodetype=\@@gluenode
+ \unskip \expandafter\doremoveunwantedspace
+ \fi}
+
+% \startbuffer
+% \startlines \tt \fixedspaces
+% 0~1~~2~~~3~~~~4~~~~~5
+% 0~~~~~~~~~~~~~~~~~~~5
+% $0~1~~2~~~3~~~~4~~~~~5$
+% $0~~~~~~~~~~~~~~~~~~~5$
+% \stoplines
+%
+% \starttabulate[|~|]
+% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \NR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \NR
+% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \NR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \NR
+% \stoptabulate
+%
+% \starttable[||]
+% \NC 0~1~~2~~~3~~~~4~~~~~5 \NC \AR \NC 0~~~~~~~~~~~~~~~~~~~5 \NC \AR
+% \NC $0~1~~2~~~3~~~~4~~~~~5$ \NC \AR \NC $0~~~~~~~~~~~~~~~~~~~5$ \NC \AR
+% \stoptable
+% \stopbuffer
+%
+% \setupbodyfont[cmr] \getbuffer
+% \setupbodyfont[lbr] \getbuffer
+
+%D A couple of plain macros:
+
+\ifx\thinspace\undefined
+
+ \def\thinspace {\kern .16667\emwidth}
+ \def\negthinspace{\kern-.16667\emwidth}
+ \def\enspace {\kern .5\emwidth}
+
+\fi
+
+\ifx\quad\undefined
+
+ \def\enskip{\hskip.5\emwidth}
+ \def\quad {\hskip \emwidth}
+ \def\qquad {\hskip 2\emwidth}
+
+\fi
+
+\let\emspace\quad
+
+% Suggested by GB (not the name -):
+
+\def\rapfillskip{.5\hsize plus .092\hsize minus .5\hsize} % D.A.'s value
+
+% Bovendien definieren we enkele extra \fill's:
+
+\def\hfilll{\hskip\zeropoint\!!plus1filll\relax}
+\def\vfilll{\vskip\zeropoint\!!plus1filll\relax}
+
+% De onderstaande hulpmacro's moeten nog eens instelbaar worden
+% gemaakt.
+
+\def\tfskipsize{1em\relax}
+\def\tfkernsize{1ex\relax}
+
+\def\tfskip{\dotfskip\tfskipsize}
+\def\tfkern{\dotfkern\tfkernsize}
+
+\def\dotfskip#1{{\tf\hskip#1}}
+\def\dotfkern#1{{\tf\kern #1}}
+
+% needs a proper \definenarrower or installnarrower
+
+\newskip\ctxleftskip
+\newskip\ctxrightskip
+\newskip\ctxmidskip
+
+% \def\dosinglenarrower#1%
+% {\processaction
+% [#1]
+% [ \v!left=>\global\advance\ctxleftskip \@@slleft,
+% \v!middle=>\global\advance\ctxmidskip \@@slmiddle,
+% \v!right=>\global\advance\ctxrightskip \@@slright,
+% \v!reset=>\global\ctxleftskip \zeropoint
+% \global\ctxmidskip \zeropoint
+% \global\ctxrightskip\zeropoint,
+% \v!none=>,
+% \s!unknown=>\global\advance\ctxmidskip \commalistelement]}
+
+\def\donarrower[#1]% hm, can be dorepeat directly
+ {\dorepeatwithcommand[#1]\donarrowermethod}
+
+\unexpanded\def\definenarrowermethod[#1]#2%
+ {\setvalue{\??sl:#1}{#2}}
+
+\def\donarrowermethod#1%
+ {\ifcsname\??sl:#1\endcsname\csname\??sl:#1\endcsname\else\global\advance\ctxmidskip#1\relax\fi}
+
+\definenarrowermethod[\v!left ]{\global\advance\ctxleftskip \@@slleft \relax}
+\definenarrowermethod[\v!middle ]{\global\advance\ctxmidskip \@@slmiddle\relax}
+\definenarrowermethod[\v!right ]{\global\advance\ctxrightskip \@@slright \relax}
+\definenarrowermethod[-\v!left ]{\global\advance\ctxleftskip -\@@slleft \relax}
+\definenarrowermethod[-\v!middle]{\global\advance\ctxmidskip -\@@slmiddle\relax}
+\definenarrowermethod[-\v!right ]{\global\advance\ctxrightskip-\@@slright \relax}
+\definenarrowermethod[\v!reset ]{\global\ctxleftskip \zeropoint
+ \global\ctxmidskip \zeropoint
+ \global\ctxrightskip\zeropoint\relax}
+\definenarrowermethod[\v!none ]{}
+
+% todo: definenarrower
+%
+% \definecomplexorsimple\startnarrower
+%
+% \def\simplestartnarrower
+% {\startnarrower[\v!middle]}
+%
+% \def\complexstartnarrower[#1]%
+% {\@@slbefore % was hard coded \par
+% \bgroup
+% \global\ctxleftskip \zeropoint
+% \global\ctxrightskip\zeropoint
+% \global\ctxmidskip \zeropoint
+% \processcommalistwithparameters[#1]\donarrower
+% \advance\leftskip \dimexpr\ctxleftskip +\ctxmidskip\relax
+% \advance\rightskip \dimexpr\ctxrightskip+\ctxmidskip\relax
+% \seteffectivehsize}
+%
+% \unexpanded\def\stopnarrower
+% {\@@slafter % was hard coded \par / needed, else skips forgotten
+% \egroup}
+%
+% \unexpanded\def\setupnarrower
+% {\dodoubleargument\getparameters[\??sl]}
+
+%D Contrary to \MKII\ we can now define classes of narrower (generalized
+%D by Wolfgang). This environment will be enhanced for bidi.
+
+\def\narrowerparameter #1{\csname\donarrowerparameter{\??sl\@@narrower}#1\endcsname}
+\def\donarrowerparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\donarrowerparentparameter\csname#1\s!parent\endcsname#2\fi}
+\def\donarrowerparentparameter#1#2{\ifx#1\relax\s!empty\else\donarrowerparameter#1#2\fi}
+
+\getparameters
+ [\??sl]
+ [\c!before=\endgraf,
+ \c!after=\endgraf,
+ \c!left=1.5em,
+ \c!right=1.5em,
+ \c!middle=1.5em]
+
+\unexpanded\def\definenarrower
+ {\dodoubleempty\dodefinenarrower}
+
+\def\dodefinenarrower[#1][#2]%
+ {\getparameters[\??sl#1][\s!parent=\??sl,#2]%
+ \setvalue{\e!start#1}{\dodoubleempty\dostartnarrower[#1]}%
+ \setvalue{\e!stop #1}{\dostopnarrower}}
+
+\unexpanded\def\setupnarrower
+ {\dodoubleempty\dosetupnarrower}
+
+\def\dosetupnarrower[#1][#2]%
+ {\doifelsenothing{#2}
+ {\getparameters[\??sl][#1]}
+ {\def\docommand##1{\getparameters[\??sl##1][#2]}%
+ \processcommacommand[#1]\docommand}}
+
+\definenarrowermethod[\v!left ]{\global\advance\ctxleftskip \narrowerparameter\c!left \relax}
+\definenarrowermethod[\v!middle ]{\global\advance\ctxmidskip \narrowerparameter\c!middle\relax}
+\definenarrowermethod[\v!right ]{\global\advance\ctxrightskip \narrowerparameter\c!right \relax}
+\definenarrowermethod[-\v!left ]{\global\advance\ctxleftskip -\narrowerparameter\c!left \relax}
+\definenarrowermethod[-\v!middle]{\global\advance\ctxmidskip -\narrowerparameter\c!middle\relax}
+\definenarrowermethod[-\v!right ]{\global\advance\ctxrightskip-\narrowerparameter\c!right \relax}
+\definenarrowermethod[\v!reset ]{\global\ctxleftskip \zeropoint
+ \global\ctxmidskip \zeropoint
+ \global\ctxrightskip\zeropoint\relax}
+\definenarrowermethod[\v!none ]{}
+
+\def\dostartnarrower[#1][#2]%
+ {\bgroup
+ \ifsecondargument % \doifsomethingelse{#2}?
+ \dodostartnarrower[#1][#2]%
+ \else
+ \dodostartnarrower[#1][\v!middle]%
+ \fi}
+
+\def\dodostartnarrower[#1][#2]%
+ {\edef\@@narrower{#1}%
+ \narrowerparameter\c!before
+ \global\ctxleftskip \zeropoint
+ \global\ctxrightskip\zeropoint
+ \global\ctxmidskip \zeropoint
+ \processcommalistwithparameters[#2]\donarrower
+ \advance\leftskip \dimexpr\ctxleftskip +\ctxmidskip\relax
+ \advance\rightskip\dimexpr\ctxrightskip+\ctxmidskip\relax
+ \seteffectivehsize}
+
+\def\dostopnarrower
+ {\narrowerparameter\c!after
+ \egroup}
+
+\def\v!narrower{narrower}
+
+\definenarrower[\v!narrower]
+
+\newdimen\@@effectivehsize \def\effectivehsize {\hsize}
+\newdimen\@@effectiveleftskip \def\effectiveleftskip {\leftskip}
+\newdimen\@@effectiverightskip \def\effectiverightskip{\rightskip}
+
+\def\seteffectivehsize
+ {\setlocalhsize
+ \@@effectivehsize \localhsize
+ \@@effectiveleftskip \leftskip
+ \@@effectiverightskip \rightskip
+ \let\effectivehsize \@@effectivehsize
+ \let\effectiveleftskip \@@effectiveleftskip
+ \let\effectiverightskip\@@effectiverightskip}
+
+\newskip\leftskipadaption
+\newskip\rightskipadaption
+
+\def\doadaptleftskip#1%
+ {\dosetleftskipadaption{#1}%
+ \advance\leftskip \leftskipadaption}
+
+\def\doadaptrightskip#1%
+ {\dosetrightskipadaption{#1}%
+ \advance\rightskip \rightskipadaption}
+
+\setvalue{@lsa@\v!standard}{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi}
+\setvalue{@lsa@\v!yes }{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi}
+\letvalue{@lsa@\v!no }\zeropoint
+\letvalue{@lsa@\empty }\zeropoint
+\setvalue{@rsa@\v!standard}{\@@slright}
+\setvalue{@rsa@\v!yes }{\@@slright}
+\letvalue{@rsa@\v!no }\zeropoint
+\letvalue{@rsa@\empty }\zeropoint
+
+\def\dosetleftskipadaption#1%
+ {\edefconvertedargument\ascii{@lsa@#1}%
+ \leftskipadaption
+ \ifcsname\ascii\endcsname
+ \csname\ascii\endcsname
+ \else
+ #1%
+ \fi
+ \relax}
+
+\def\dosetrightskipadaption#1%
+ {\edefconvertedargument\ascii{@rsa@#1}%
+ \rightskipadaption
+ \ifcsname\ascii\endcsname
+ \csname\ascii\endcsname
+ \else
+ #1%
+ \fi
+ \relax}
+
+%D Tolerance:
+
+\unexpanded\def\definetolerancemethod
+ {\dodoubleargument\dodefinetolerancemethod}
+
+\def\dodefinetolerancemethod[#1][#2]#3%
+ {\setvalue{\??to:#1:#2}{#3}}
+
+\definetolerancemethod [\v!vertical] [\v!verystrict ] {\let\bottomtolerance\empty}
+\definetolerancemethod [\v!vertical] [\v!strict ] {\def\bottomtolerance{.050}}
+\definetolerancemethod [\v!vertical] [\v!tolerant ] {\def\bottomtolerance{.075}}
+\definetolerancemethod [\v!vertical] [\v!verytolerant] {\def\bottomtolerance{.100}}
+
+\definetolerancemethod [\v!horizontal] [\v!stretch ] {\emergencystretch\bodyfontsize}
+\definetolerancemethod [\v!horizontal] [\v!space ] {\spaceskip.5em\!!plus.25em\!!minus.25em\relax}
+\definetolerancemethod [\v!horizontal] [\v!verystrict ] {\tolerance 200 }
+\definetolerancemethod [\v!horizontal] [\v!strict ] {\tolerance1500 }
+\definetolerancemethod [\v!horizontal] [\v!tolerant ] {\tolerance3000 }
+\definetolerancemethod [\v!horizontal] [\v!verytolerant] {\tolerance4500 }
+
+\def\dotolerancencemethodvertical #1{\csname\??to:\v!vertical :#1\endcsname}
+\def\dotolerancencemethodhorizontal#1{\csname\??to:\v!horizontal:#1\endcsname}
+
+\def\dosetuptolerance[#1]%
+ {\doifinsetelse\v!vertical{#1}%
+ {\processcommacommand[#1]\dotolerancencemethodvertical}
+ {\processcommacommand[#1]\dotolerancencemethodhorizontal}}
+
+\unexpanded\def\setuptolerance
+ {\dosingleargument\dosetuptolerance}
+
+%D \macros
+%D {pushindentation,popindentation}
+%D
+%D The pushing and popping is done by:
+
+\newbox\indentationboxA
+\newbox\indentationboxB
+
+\def\pushindentation
+ {\bgroup
+ \ifhmode
+ \unskip
+ \setbox\indentationboxA\lastbox % get \strut if present
+ \unskip
+ \setbox\indentationboxB\lastbox % get \indent generated box
+ \unskip
+ \else
+ \hskip\zeropoint % switch to horizontal mode
+ \unskip
+ \setbox\indentationboxA\lastbox % get \indent generated box
+ \setbox\indentationboxB\emptybox
+ \fi}
+
+\def\popindentation
+ {\box\indentationboxB\box\indentationboxA % put back the boxes
+ \egroup}
+
+%D The only complication lays in \type{\strut}. In \PLAIN\
+%D \TEX\ a \type{\strut} is defined as:
+%D
+%D \starttyping
+%D \def\strut%
+%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+%D \stoptyping
+%D
+%D But what is a \type{\strut}? Normally it's a rule of width
+%D zero, but when made visual, it's a rule and a negative skip.
+%D The mechanism for putting things in the margins described
+%D here cannot handle this situation very well. One
+%D characteristic of \type{\strut} is that the \type{\unhcopy}
+%D results in entering horizontal mode, which in return leads
+%D to some indentation.
+%D
+%D To serve our purpose a bit better, the macro \type{\strut}
+%D can be redefined as:
+%D
+%D \starttyping
+%D \def\strut
+%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox}
+%D \stoptyping
+%D
+%D Or more compatible:
+%D
+%D \starttyping
+%D \def\strut
+%D {\relax\ifmmode
+%D \copy\strutbox
+%D \else
+%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup
+%D \fi}
+%D \stoptyping
+%D
+%D In \CONTEXT\ however we save some processing time by putting
+%D an extra \type{\hbox} around the \type{\strutbox}.
+
+% moved from page-lin.tex to here (due to visualization added
+% in august 2003)
+%
+% \unexpanded \def\crlf
+% {\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break}
+
+\unexpanded \def\crlf
+ {\ifhmode
+ \unskip
+ \prewordbreak\crlfplaceholder
+ \ifcase\raggedstatus\hfil\or\or\or\hfil\fi
+ \break
+ \else
+ \crlfplaceholder
+ \endgraf
+ \fi}
+
+\def\crlfplaceholder
+ {\strut}
+
+\def\settestcrlf
+ {\def\crlfplaceholder
+ {\hbox to \zeropoint
+ {\strut{\infofont\kern.25em}\lohi{\infofont CR}{\infofont LF}\hss}}}
+
+%D \starttyping
+%D % \setuplayout[gridgrid=yes] \showgrid
+%D
+%D \startbuffer
+%D test 1\crlf
+%D test 2\crlf
+%D
+%D \crlf test 3
+%D
+%D test 4\crlf
+%D test 5
+%D
+%D \crlf
+%D \crlf
+%D \crlf
+%D test 6
+%D \stopbuffer
+%D
+%D \hbox
+%D {\hsize5em
+%D \ruledvtop{\getbuffer}\enspace
+%D \ruledvtop{\showstruts\getbuffer}\enspace
+%D \hsize15em \setuptyping[before=,after=]%
+%D \ruledvtop{\typebuffer}}
+%D \stoptyping
+
+\unexpanded\def\justonespace{\removeunwantedspaces\space}
+%unexpanded\def\justaperiod {\removeunwantedspaces.}
+%unexpanded\def\justacomma {\removeunwantedspaces,}
+
+\def\ignorecrlf
+ {\let\crlf\justonespace\let\\\crlf}
+
+\unexpanded\def\definehspace
+ {\dotripleempty\dodefinehspace}
+
+\def\dodefinehspace[#1][#2][#3]% #1 = optional namespace
+ {\ifthirdargument
+ \setvalue{\??hs#1:#2}{#3}%
+ \else
+ \setvalue{\??hs:#1}{#2}%
+ \fi}
+
+\unexpanded\def\hspace
+ {\dodoubleempty\dohspace}
+
+\def\dohspace[#1][#2]%
+ {\ifsecondargument
+ \dodohspace[#1][#2]%
+ \else\iffirstargument
+ \hspace[][#1]%
+ \else
+ \hspace[][\s!default]%
+ \fi\fi}
+
+\def\dodohspace[#1][#2]%
+ {\ifhmode
+ \removeunwantedspaces
+ \hskip\hspaceamount{#1}{#2}%
+ \expandafter\ignorespaces
+ \fi}
+
+\def\hspaceamount#1#2%
+ {\executeifdefined{\??hs#1:#2}{\executeifdefined{\??hs:#2}\zeropoint}}
+
+\definehspace [\v!small] [.25\emspaceamount]
+\definehspace [\v!medium] [.5\emspaceamount]
+\definehspace [\v!big] [1\emspaceamount]
+\definehspace [\v!normal] [1\spaceamount]
+\definehspace [\v!default] [\spaceamount]
+
+%D Taken from Taco's math module (cq. \AMS\ macros), but
+%D adapted to \type {\hspace}:
+
+\unexpanded\def\textormathspace #1#2#3{\ifmmode\mskip#1#2\else\kern #1\hspaceamount\empty{#3}\fi\relax}
+\unexpanded\def\breakabletextormathspace#1#2#3{\ifmmode\mskip#1#2\else\hskip#1\hspaceamount\empty{#3}\fi\relax}
+
+\newmuskip\hairmuskip \hairmuskip=.15mu
+
+\unexpanded\def\hairspace {\textormathspace+\hairmuskip{.5}}
+\unexpanded\def\thinspace {\textormathspace+\thinmuskip 1}
+\unexpanded\def\medspace {\textormathspace+\medmuskip 2}
+\unexpanded\def\thickspace {\textormathspace+\thickmuskip3}
+\unexpanded\def\neghairspace {\textormathspace-\thinmuskip{.5}}
+\unexpanded\def\negthinspace {\textormathspace-\thinmuskip 1}
+\unexpanded\def\negmedspace {\textormathspace-\medmuskip 2}
+\unexpanded\def\negthickspace{\textormathspace-\thickmuskip3}
+
+% needed for unicode:
+
+\unexpanded\def\breakablethinspace {\breakabletextormathspace+\thinmuskip 1}
+
+\unexpanded\def\twoperemspace {\hskip\dimexpr\emwidth/2\relax} % == \enspace
+\unexpanded\def\threeperemspace {\hskip\dimexpr\emwidth/3\relax}
+\unexpanded\def\fourperemspace {\hskip\dimexpr\emwidth/4\relax}
+\unexpanded\def\fiveperemspace {\hskip\dimexpr\emwidth/5\relax} % goodie
+\unexpanded\def\sixperemspace {\hskip\dimexpr\emwidth/6\relax}
+\unexpanded\def\figurespace {\begingroup\setbox\scratchbox\hbox{0}\hskip\wd\scratchbox\endgroup} % there is a command for this
+\unexpanded\def\punctuationspace {\begingroup\setbox\scratchbox\hbox{.}\hskip\wd\scratchbox\endgroup}
+\unexpanded\def\ideographicspace {\hskip\dimexpr\emwidth/1\relax}
+\unexpanded\def\ideographichalffillspace{\hskip\dimexpr\emwidth/2\relax}
+%unexpanded\def\nobreakspace {\penalty\plustenthousand\space}
+\unexpanded\def\nobreakspace {\penalty\plustenthousand\kern\interwordspace}
+\unexpanded\def\narrownobreakspace {\penalty\plustenthousand\thinspace}
+%unexpanded\def\zerowidthnobreakspace {\penalty\plustenthousand\hskip\zeropoint}
+\unexpanded\def\zerowidthnobreakspace {\penalty\plustenthousand\kern\zeropoint}
+\unexpanded\def\zerowidthspace {\hskip\zeropoint}
+
+\definehspace[.5][.1250\emspaceamount] % could also be [.1250\spaceamount]
+\definehspace[1] [.1667\emspaceamount]
+\definehspace[2] [.2222\emspaceamount]
+\definehspace[3] [.2777\emspaceamount]
+
+\let \, \thinspace
+\let \: \medspace
+\let \; \thickspace
+\let \! \negthinspace
+
+\def\flexiblespaceamount#1#2#3%
+ {#1\interwordspace
+ \!!plus#2\interwordstretch
+ \!!minus#3\interwordshrink}
+
+\def\fixedspaceamount#1%
+ {#1\interwordspace}
+
+% moved from page-lin
+%
+% the following code is used in startlines\stoplines
+%
+% do we need \normalspaceprimitive here?
+
+\def\installspacehandler#1#2% needs to set \obeyedspace
+ {\setvalue{\??sr#1}{#2}}
+
+\installspacehandler \v!on
+ {\obeyspaces
+ \unexpanded\def\obeyedspace{\mathortext\normalspace{\dontleavehmode{\tt\controlspace}}}%
+ \let\ =\obeyedspace}
+
+\installspacehandler \v!yes
+ {\obeyspaces
+ \unexpanded\def\obeyedspace{\mathortext\normalspace{\dontleavehmode\normalspace}}%
+ \let\ =\obeyedspace}
+
+\installspacehandler \v!off % == default
+ {\normalspaces
+ \let\obeyedspace\normalspace
+ \let\ =\normalspaceprimitive} % was \normalspace
+
+\installspacehandler \v!fixed
+ {\obeyspaces
+ \unexpanded\def\obeyedspace{\mathortext\normalspace{\dontleavehmode\fixedspace}}%
+ \let\ =\obeyedspace}
+
+\def\activatespacehandler#1%
+ {\executeifdefined{\??sr#1}{\activatespacehandler\v!off}}
+
+\appendtoks
+ \normalspaces % to be sure
+\to \everybeforeoutput
+
+%D A more robust variant ofthe \MKII\ one:
+%D
+%D \startbuffer
+%D bla \TEX\autoinsertnextspace bla
+%D bla \TEX\autoinsertnextspace (bla)
+%D bla (\TEX\autoinsertnextspace) bla
+%D bla \TEX\autoinsertnextspace\ bla
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% unexpanded is important here as it prevents premature expansion in
+% e.g. \normalexpanded{\egroup\sortingparameter\c!next}
+
+\unexpanded\def\autoinsertnextspace
+ {\futurelet\nexttoken\doautoinsertnextspace}
+
+\def\doautoinsertnextspace
+ {\ctxlua{commands.autonextspace("\meaning\nexttoken")}} % todo, just consult nexttoken at the lua end
+
+%D Moved from bib module:
+
+\def\outdented#1%
+ {\hskip-\hangindent#1\relax}
+
+%D Beware: due to char-def this becomes an active character but that
+%D might change sometime when we will replace all these specials to
+%D node insertions. We might even expand it to utf then as it then
+%D can be used in string comparison (not that much needed anyway).
+
+\chardef\zwnj="200C
+\chardef\zwj ="200D
+
+\protect \endinput
diff --git a/tex/context/base/spac-pag.mkiv b/tex/context/base/spac-pag.mkiv
new file mode 100644
index 000000000..353afa536
--- /dev/null
+++ b/tex/context/base/spac-pag.mkiv
@@ -0,0 +1,199 @@
+%D \module
+%D [ file=spac-pag,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Pages,
+%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 Spacing Macros / Pages}
+
+\unprotect
+
+%D A quick way to determine left|/|middle|/|right states
+%D (experimental).
+
+\setvalue{\??as\v!left }{0}
+\setvalue{\??as\v!middle}{1}
+\setvalue{\??as\v!right }{2}
+
+\def\setalignmentswitch#1%
+ {\chardef\alignmentswitch0\csname\??as#1\endcsname\relax}
+
+\newcount \noftrackedpagestates
+\newif \ifpagestatemismatch
+\newcount \realpagestateno
+\chardef \frozenpagestate \zerocount
+
+\def\dotrackpagestate#1#2%
+ {\ifdoublesided \ifinpagebody \else
+ \doforcedtrackpagestate{#1}{#2}%
+ \fi \fi}
+
+\def\doforcedtrackpagestate#1#2%
+ {\ifcase\frozenpagestate
+ \global\advance\noftrackedpagestates\plusone
+ \global\advance#2\plusone
+ \lazysavetaggedtwopassdata{#1}{\number\noftrackedpagestates}{\number#2}{\noexpand\realfolio}%
+ %\llap{\infofont\number\noftrackedpagestates/\number#2}% tracing
+ \fi}
+
+\def\doifrightpagestateelse#1#2%
+ {\ifcase\frozenpagestate
+ \pagestatemismatchfalse
+ \realpagestateno\realfolio
+ \ifinpagebody
+ \ifdoublesided
+ \ifodd\realpageno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \twopassdatafoundtrue
+ \fi
+ \else\ifdoublesided
+ \findtwopassdata{#1}{\number#2}%
+ \iftwopassdatafound
+ \realpagestateno\twopassdata\relax
+ \ifnum\twopassdata=\realpageno \else
+ \pagestatemismatchtrue
+ \fi
+ \ifodd\twopassdata\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \ifodd\realpageno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \else
+ \twopassdatafoundtrue
+ \fi\fi
+ \else
+ \ifodd\realpagestateno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \iftwopassdatafound
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\doifforcedrightpagestateelse#1#2%
+ {\ifcase\frozenpagestate
+ \pagestatemismatchfalse
+ \realpagestateno\realfolio
+ \findtwopassdata{#1}{\number#2}%
+ \iftwopassdatafound
+ \realpagestateno\twopassdata\relax
+ \ifnum\twopassdata=\realpageno \else
+ \pagestatemismatchtrue
+ \fi
+ \ifodd\twopassdata\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \ifodd\realpageno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \else
+ \ifodd\realpagestateno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \iftwopassdatafound
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\freezepagestate {\chardef\frozenpagestate\plusone }
+\def\defrostpagestate{\chardef\frozenpagestate\zerocount}
+
+% we can make more of these on top, but how to deal with mixed frozen states
+
+\definetwopasslist\s!paragraph \newcount \nofraggedparagraphs
+
+\def\signalrightpage {\dotrackpagestate \s!paragraph\nofraggedparagraphs}
+\def\doifrightpageelse{\doifrightpagestateelse\s!paragraph\nofraggedparagraphs}
+
+\newcount\pagesignallevel
+
+\unexpanded\def\startsignalrightpage % one may do a \postsignalrightplace
+ {\advance\pagesignallevel\plusone
+ \presignalrightpage
+ \let\signalrightpage\relax
+ \let\presignalrightpage\relax
+ \let\startsignalrightpage\relax
+ \doifrightpageelse\donothing\donothing
+ \freezepagestate}
+
+\unexpanded\def\stopsignalrightpage
+ {\ifcase\pagesignallevel\or\postsignalrightpage\fi
+ \advance\pagesignallevel\minusone}
+
+\def\setraggedparagraphmode
+ {\signalrightpage\doifrightpageelse} % move it there
+
+\ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo
+
+\def\doifswappedrightpageelse#1#2% alleen in box construction !
+ {\doifrightpageelse
+ {#1}
+ {\scratchcounter\realpageno
+ \realpageno\realpagestateno\relax
+ \swapmargins
+ \realpageno\scratchcounter
+ #2}}
+
+\newbox\signaledrightpage % this way we can avoid interference, i.e. postpone placement
+
+\def\presignalrightpage {\global\setbox\signaledrightpage\hbox{\signalrightpage}}
+\def\postsignalrightpage{\ifvoid\signaledrightpage\else\box\signaledrightpage\fi}
+
+% The next feature is is used in:
+%
+% \definenumber[test][way=bypage]
+%
+% \def\Test
+% {\incrementnumber[test]\rawnumber[test]/%
+% \incrementnumber[test]\rawnumber[test]/%
+% \incrementnumber[test]\rawnumber[test]\space
+% \checkpagechange{oeps}\changedpage{oeps}\space
+% \ifpagechanged TRUE\else FALSE\fi}
+%
+% \Test\page \Test\par \Test\page \Test\par \Test\page \Test\page
+%
+% (adapted from cont-new.tex:)
+
+\newif\ifpagechanged \let\lastchangedpage\empty
+
+\def\docheckpagestatechange#1#2#3%
+ {\pagechangedfalse
+ \doforcedtrackpagestate{#2}{#3}%
+ \findtwopassdata{#2}{\number#3}%
+ \iftwopassdatafound
+ \ifnum\twopassdata>0\getvalue{#2:p:#1}\relax
+ \pagechangedtrue
+ \fi
+ \fi
+ \ifpagechanged
+ \letgvalue{#2:p:#1}\twopassdata
+ \globallet\lastchangedpage\twopassdata
+ \else
+ \globallet\lastchangedpage\realfolio
+ \fi}
+
+\def\changedpagestate#1#2%
+ {\executeifdefined{#2:p:#1}{0}}
+
+\def\checkpagechange#1{\docheckpagestatechange{#1}\s!paragraph\nofraggedparagraphs}
+\def\changedpage #1{\changedpagestate{#1}\s!paragraph}
+
+\protect \endinput
diff --git a/tex/context/base/spac-par.mkiv b/tex/context/base/spac-par.mkiv
new file mode 100644
index 000000000..3477b1c1b
--- /dev/null
+++ b/tex/context/base/spac-par.mkiv
@@ -0,0 +1,192 @@
+%D \module
+%D [ file=spac-par,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Paragraphs,
+%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 Spacing Macros / Paragraphs}
+
+\unprotect
+
+%D The dreadful sequence \type {\bgroup} \unknown\
+%D \type {\carryoverpar} \unknown\ \type {\egroup} is needed
+%D when for instance sidefloats are used in combination with
+%D something that starts with a group. This is because
+%D otherwise the indentation as set (by the output routine)
+%D inside the group are forgotten afterwards. (I must
+%D not forget its existence).
+
+\global\let\carriedoverpar\relax
+
+\def\carryoverpar#1%
+ {\normalexpanded % \scratchtoks{#1}%
+ {\noexpand#1% \the\scratchtoks
+ \hangindent\the\hangindent
+ \hangafter \the\hangafter
+ \parskip \the\parskip
+ \leftskip \the\leftskip
+ \rightskip \the\rightskip}}
+
+\newconditional \parbasedattributes
+
+\def\finishparbasedattributes
+ {\ifconditional\parbasedattributes
+ \setfalse\parbasedattributes
+ \par
+ \fi}
+
+\def\dostopparbasedattributes
+ {\settrue\parbasedattributes
+ \dostopattributes}
+
+% beware, changing this will break some code (like pos/backgrounds)
+
+\newtoks\everyfirstparagraphintro
+\newtoks\everynextparagraphintro
+\newtoks\@@everyparagraphtoks
+
+\chardef\everyparagraphintro\zerocount
+
+\unexpanded\def\setupparagraphintro
+ {\dodoubleempty\dosetupparagraphintro}
+
+\def\dosetupparagraphintro[#1][#2]%
+ {\processallactionsinset
+ [#1]
+ [ \v!reset=>\global\chardef\everyparagraphintro\zerocount
+ \global\everyfirstparagraphintro\emptytoks
+ \global\everynextparagraphintro \emptytoks,
+ \v!first=>\global\chardef\everyparagraphintro\plusone
+ \doglobal\appendtoks#2\to\everyfirstparagraphintro,
+ \v!next=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plusone\fi
+ \doglobal\appendtoks#2\to\everynextparagraphintro,
+ \v!each=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plustwo\fi
+ \doglobal\appendtoks#2\to\everyfirstparagraphintro
+ \doglobal\appendtoks#2\to\everynextparagraphintro]}
+
+%D We can say:
+%D
+%D \starttyping
+%D \setupparagraphintro[first][\index{Knuth}]
+%D \stoptyping
+%D
+%D Maybe more convenient is:
+%D
+%D \starttyping
+%D \flushatparagraph{\index{Zapf}}
+%D \stoptyping
+
+\def\flushatparagraph#1%
+ {\global\chardef\everyparagraphintro\plusone
+ \global\appendtoks{#1}\to\everyfirstparagraphintro
+ \global\let\insertparagraphintro\doinsertparagraphintro}
+
+\def\doinsertparagraphintro % can be merged with the next
+ {\ifcase\everyparagraphintro\else\@EA\dodoinsertparagraphintro\fi}
+
+\def\dodoinsertparagraphintro
+ {\begingroup
+ \everypar\emptytoks
+ \ifcase\everyparagraphintro\relax
+ % no data
+ \@@everyparagraphtoks\emptytoks
+ \or
+ % first data
+ \global\chardef\everyparagraphintro\plustwo
+ \@@everyparagraphtoks\everyfirstparagraphintro
+ \global\everyfirstparagraphintro\emptytoks
+ \or
+ % next data
+ \@@everyparagraphtoks\everynextparagraphintro
+ \fi
+ \the\@@everyparagraphtoks
+ \global\let\insertparagraphintro\relax
+ \endgroup}
+
+\let\insertparagraphintro\relax
+
+%D \starttyping
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt FIRST \hss}]
+%D \setupparagraphintro[first][\hbox to 3.5em{\tt TSRIF \hss}]
+%D \setupparagraphintro[next] [\hbox to 3.5em{\tt NEXT \hss}]
+%D \setupparagraphintro[next] [\hbox to 3.5em{\tt TXEN \hss}]
+%D \setupparagraphintro[each] [\hbox to 3.0em{\tt EACH \hss}]
+%D \setupparagraphintro[each] [\hbox to 3.0em{\tt HCEA \hss}]
+%D
+%D some paragraph \par
+%D some paragraph \par
+%D some paragraph \par
+%D
+%D \definelabel[parnumber]
+%D
+%D \setupparagraphintro[reset,each][\inleft{\slxx\parnumber}]
+%D
+%D some paragraph \par
+%D some paragraph \par
+%D some paragraph \par
+%D \stoptyping
+
+%D \macros
+%D {flushatnextpar}
+%D
+%D This macro collects data that will be flushed at the next paragraph.
+%D By using this macro you can avoid interfering nodes (writes, etc).
+
+\newbox\postponednodedata
+\let\flushpostponednodedata\relax
+
+\def\flushatnextpar
+ {\bgroup
+ \global\let\flushpostponednodedata\doflushpostponednodedata
+ \dowithnextbox{\global\setbox\postponednodedata\hbox{\box\postponednodedata\box\nextbox}\egroup}\hbox}
+
+\def\doflushpostponednodedata
+ {\ifvoid\postponednodedata\else
+ \hbox{\smashedbox\postponednodedata}%
+ \fi
+ \global\let\flushpostponednodedata\relax}
+
+% Very nasty but needed for margin stuff inside colored
+% paragraphs.
+
+\let\normalvadjust\vadjust
+
+\def\graphicvadjust % nasty bidi handling
+ {\dowithnextboxcontent
+ {\forgetall}
+ {\vadjust{\vbox attr \graphicvadjustattribute \plusone
+ {\unvbox\nextbox
+ % corrects for one line paragraphs
+ \nointerlineskip
+ \kern-\struttotal
+ \nointerlineskip
+ \verticalstrut}}}%
+ \vbox}
+
+%D This works only in a properly strutted line, and is meant
+%D for deeply burried operations, like in heads.
+
+\def\fakedvadjust
+ {\dowithnextbox
+ {\setbox\nextbox\hbox{\llap{\lower\strutdepth\box\nextbox}}%
+ \smashedbox\nextbox}%
+ \vtop}
+
+\def\localvbox#1#% used?
+ {\vbox#1\bgroup
+ \forgetparskip
+ \setlocalhsize
+ \hsize\localhsize
+ \forgetparindent
+ \forgetbothskips
+ \forgeteverypar
+ \let\next=}
+
+\protect \endinput
diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua
new file mode 100644
index 000000000..c75eb1baa
--- /dev/null
+++ b/tex/context/base/spac-ver.lua
@@ -0,0 +1,1185 @@
+if not modules then modules = { } end modules ['spac-ver'] = {
+ version = 1.001,
+ comment = "companion to spac-ver.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- we also need to call the spacer for inserts!
+
+-- this code dates from the beginning and is kind of experimental; it
+-- will be optimized and improved soon
+--
+-- the collapser will be redone with user nodes; also, we might get make
+-- parskip into an attribute and appy it explicitly thereby getting rid
+-- of automated injections; eventually i want to get rid of the currently
+-- still needed tex -> lua -> tex > lua chain (needed because we can have
+-- expandable settings at the tex end
+
+-- todo: strip baselineskip around display math
+
+local next, type, tonumber = next, type, tonumber
+local format, gmatch, concat, match = string.format, string.gmatch, table.concat, string.match
+local ceil, floor, max, min, round = math.ceil, math.floor, math.max, math.min, math.round
+local texsprint, texlists, texdimen, texbox = tex.sprint, tex.lists, tex.dimen, tex.box
+local lpegmatch = lpeg.match
+local unpack = unpack or table.unpack
+
+local ctxcatcodes = tex.ctxcatcodes
+local variables = interfaces.variables
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+-- vertical space handler
+
+local trace_vbox_vspacing = false trackers.register("nodes.vbox_vspacing", function(v) trace_vbox_vspacing = v end)
+local trace_page_vspacing = false trackers.register("nodes.page_vspacing", function(v) trace_page_vspacing = v end)
+local trace_collect_vspacing = false trackers.register("nodes.collect_vspacing", function(v) trace_collect_vspacing = v end)
+local trace_vspacing = false trackers.register("nodes.vspacing", function(v) trace_vspacing = v end)
+local trace_vsnapping = false trackers.register("nodes.vsnapping", function(v) trace_vsnapping = v end)
+
+local skip_category = attributes.private('skip-category')
+local skip_penalty = attributes.private('skip-penalty')
+local skip_order = attributes.private('skip-order')
+local snap_category = attributes.private('snap-category')
+local display_math = attributes.private('display-math')
+local snap_method = attributes.private('snap-method')
+local snap_done = attributes.private('snap-done')
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local find_node_tail = node.tail
+local free_node = node.free
+local copy_node = node.copy
+local traverse_nodes = node.traverse
+local traverse_nodes_id = node.traverse_id
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local remove_node = nodes.remove
+local make_penalty_node = nodes.penalty
+local make_kern_node = nodes.kern
+local make_rule_node = nodes.rule
+local count_nodes = nodes.count
+local node_ids_to_string = nodes.ids_to_string
+local hpack_node = node.hpack
+local vpack_node = node.vpack
+local writable_spec = nodes.writable_spec
+
+local glyph = node.id("glyph")
+local penalty = node.id("penalty")
+local kern = node.id("kern")
+local glue = node.id('glue')
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+local adjust = node.id('adjust')
+
+vspacing = vspacing or { }
+vspacing.data = vspacing.data or { }
+
+vspacing.data.snapmethods = vspacing.data.snapmethods or { }
+
+storage.register("vspacing/data/snapmethods", vspacing.data.snapmethods, "vspacing.data.snapmethods")
+
+local snapmethods = vspacing.data.snapmethods --maybe some older code can go
+
+local default = {
+ maxheight = true,
+ maxdepth = true,
+ strut = true,
+ hfraction = 1,
+ dfraction = 1,
+}
+
+local fractions = {
+ minheight = "hfraction", maxheight = "hfraction",
+ mindepth = "dfraction", maxdepth = "dfraction",
+ top = "tlines", bottom = "blines",
+}
+
+local values = {
+ offset = "offset"
+}
+
+local colonsplitter = lpeg.splitat(":")
+
+local function listtohash(str)
+ local t = { }
+ for s in gmatch(str,"[^, ]+") do
+ local key, detail = lpegmatch(colonsplitter,s)
+ local v = variables[key]
+ if v then
+ t[v] = true
+ if detail then
+ local k = fractions[key]
+ if k then
+ detail = tonumber("0" .. detail)
+ if detail then
+ t[k] = detail
+ end
+ else
+ k = values[key]
+ if k then
+ detail = string.todimen(detail)
+ if detail then
+ t[k] = detail
+ end
+ end
+ end
+ end
+ else
+ detail = tonumber("0" .. key)
+ if detail then
+ t.hfraction, t.dfraction = detail, detail
+ end
+ end
+ end
+ if next(t) then
+ t.hfraction = t.hfraction or 1
+ t.dfraction = t.dfraction or 1
+ return t
+ else
+ return default
+ end
+end
+
+function vspacing.define_snap_method(name,method)
+ local n = #snapmethods + 1
+ local t = listtohash(method)
+ snapmethods[n] = t
+ t.name, t.specification = name, method
+ tex.write(n)
+end
+
+--~ local rule_id = node.id("rule")
+--~ local vlist_id = node.id("vlist")
+--~ function nodes.makevtop(n)
+--~ if n.id == vlist_id then
+--~ local list = n.list
+--~ local height = (list and list.id <= rule_id and list.height) or 0
+--~ n.depth = n.depth - height + n.height
+--~ n.height = height
+--~ end
+--~ end
+
+local function snap_hlist(current,method,height,depth) -- method.strut is default
+ local snapht, snapdp
+--~ print(table.serialize(method))
+ if method["local"] then
+ -- snapping is done immediately here
+ snapht, snapdp = texdimen.bodyfontstrutheight, texdimen.bodyfontstrutdepth
+ elseif method["global"] then
+ snapht, snapdp = texdimen.globalbodyfontstrutheight, texdimen.globalbodyfontstrutdepth
+ else
+ -- maybe autolocal
+ -- snapping might happen later in the otr
+ snapht, snapdp = texdimen.globalbodyfontstrutheight, texdimen.globalbodyfontstrutdepth
+ local lsnapht, lsnapdp = texdimen.bodyfontstrutheight, texdimen.bodyfontstrutdepth
+ if snapht ~= lsnapht and snapdp ~= lsnapdp then
+ snapht, snapdp = lsnapht, lsnapdp
+ end
+ end
+ local h, d = height or current.height, depth or current.depth
+ local hr, dr, ch, cd = method.hfraction or 1, method.dfraction or 1, h, d
+ local tlines, blines = method.tlines or 1, method.blines or 1
+ local done, plusht, plusdp = false, snapht, snapdp
+ local snaphtdp = snapht + snapdp
+ if method.none then
+ plusht, plusdp = 0, 0
+ end
+ if method.halfline then
+ plusht, plusdp = plusht + snaphtdp/2, plusdp + snaphtdp/2
+ end
+ if method.line then
+ plusht, plusdp = plusht + snaphtdp, plusdp + snaphtdp
+ end
+
+ if method.first then
+ if current.id == vlist then
+ local list, lh, ld = current.list
+ for n in traverse_nodes_id(hlist,list) do
+ lh, ld = n.height, n.depth
+ break
+ end
+ if lh then
+ local x = max(ceil((lh-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+ local n = make_kern_node(x-lh)
+ n.next, list.prev, current.list = list, n, n
+ ch = x + snaphtdp
+ cd = max(ceil((d+h-lh-dr*snapdp-hr*snapht)/snaphtdp),0)*snaphtdp + plusdp
+ done = true
+ end
+ end
+ elseif method.last then
+ if current.id == vlist then
+ local list, lh, ld = current.list
+ for n in traverse_nodes_id(hlist,list) do
+ lh, ld = n.height, n.depth
+ end
+ if lh then
+ local baseline_till_top = h + d - ld
+ local x = max(ceil((baseline_till_top-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+ local n = make_kern_node(x-baseline_till_top)
+ n.next, list.prev, current.list = list, n, n
+ ch = x
+ cd = max(ceil((ld-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+ done = true
+ end
+ end
+ end
+
+ if done then
+ -- first or last
+ elseif method.minheight then
+ ch = max(floor((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+ elseif method.maxheight then
+ ch = max(ceil((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+ else
+ ch = plusht
+ end
+ if done then
+ -- first or last
+ elseif method.mindepth then
+ cd = max(floor((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+ elseif method.maxdepth then
+ cd = max(ceil((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+ else
+ cd = plusdp
+ end
+ if method.top then
+ ch = ch + tlines * snaphtdp
+ end
+ if method.bottom then
+ cd = cd + blines * snaphtdp
+ end
+
+ local offset = method.offset
+ if offset then
+ -- we need to set the attr
+ local shifted = vpack_node(current.list)
+ shifted.shift = offset
+ current.list = shifted
+ end
+ if not height then
+ current.height = ch
+ end
+ if not depth then
+ current.depth = cd
+ end
+ -- set_attribute(current,snap_method,0)
+ return h, d, ch, cd, (ch+cd)/snaphtdp
+end
+
+--~ local function snap_topskip(current,method)
+--~ local spec = current.spec
+--~ local w = spec.width
+--~ local wd = w
+--~ if spec then
+--~ wd = 0
+--~ spec = writable_spec(current)
+--~ spec.width = wd
+--~ end
+--~ return w, wd
+--~ end
+
+local function snap_topskip(current,method)
+ local spec = current.spec
+ local w = spec.width
+ local wd = w
+ if spec.writable then
+ spec.width, wd = 0, 0
+ end
+ return w, wd
+end
+
+vspacing.categories = {
+ [0] = 'discard',
+ [1] = 'largest',
+ [2] = 'force' ,
+ [3] = 'penalty',
+ [4] = 'add' ,
+ [5] = 'disable',
+ [6] = 'nowhite',
+ [7] = 'goback',
+ [8] = 'together'
+}
+
+local categories = vspacing.categories
+
+function vspacing.tocategories(str)
+ local t = { }
+ for s in gmatch(str,"[^, ]") do
+ local n = tonumber(s)
+ if n then
+ t[categories[n]] = true
+ else
+ t[b] = true
+ end
+ end
+ return t
+end
+
+function vspacing.tocategory(str)
+ if type(str) == "string" then
+ return set.tonumber(vspacing.tocategories(str))
+ else
+ return set.tonumber({ [categories[str]] = true })
+ end
+end
+
+vspacing.data.map = vspacing.data.map or { }
+vspacing.data.skip = vspacing.data.skip or { }
+
+storage.register("vspacing/data/map", vspacing.data.map, "vspacing.data.map")
+storage.register("vspacing/data/skip", vspacing.data.skip, "vspacing.data.skip")
+
+do -- todo: interface.variables
+
+ local function logger(c,...)
+ logs.report("vspacing",concat {...})
+ texsprint(c,...)
+ end
+
+ vspacing.fixed = false
+
+ local map = vspacing.data.map
+ local skip = vspacing.data.skip
+
+ local multiplier = lpeg.C(lpeg.S("+-")^0 * lpeg.R("09")^1) * lpeg.P("*")
+ local category = lpeg.P(":") * lpeg.C(lpeg.P(1)^1)
+ local keyword = lpeg.C((1-category)^1)
+ local splitter = (multiplier + lpeg.Cc(1)) * keyword * (category + lpeg.Cc(false))
+
+ local k_fixed, k_flexible, k_category, k_penalty, k_order = variables.fixed, variables.flexible, "category", "penalty", "order"
+
+ -- This will change: just node.write and we can store the values in skips which
+ -- then obeys grouping
+
+ local function analyse(str,oldcategory,texsprint) -- we could use shorter names
+ for s in gmatch(str,"([^ ,]+)") do
+ local amount, keyword, detail = lpegmatch(splitter,s)
+ if not keyword then
+ logs.report("vspacing","unknown directive: %s",s)
+ else
+ local mk = map[keyword]
+ if mk then
+ category = analyse(mk,category,texsprint)
+ elseif keyword == k_fixed then
+ texsprint(ctxcatcodes,"\\fixedblankskip")
+ elseif keyword == k_flexible then
+ texsprint(ctxcatcodes,"\\flexibleblankskip")
+ elseif keyword == k_category then
+ local category = tonumber(detail)
+ if category then
+ texsprint(ctxcatcodes,"\\setblankcategory{",category,"}")
+ if category ~= oldcategory then
+ texsprint(ctxcatcodes,"\\flushblankhandling")
+ oldcategory = category
+ end
+ end
+ elseif keyword == k_order and detail then
+ local order = tonumber(detail)
+ if order then
+ texsprint(ctxcatcodes,"\\setblankorder{",order,"}")
+ end
+ elseif keyword == k_penalty and detail then
+ local penalty = tonumber(detail)
+ if penalty then
+ texsprint(ctxcatcodes,"\\setblankpenalty{",penalty,"}")
+ end
+ else
+ amount = tonumber(amount) or 1
+ local sk = skip[keyword]
+ if sk then
+ texsprint(ctxcatcodes,"\\addpredefinedblankskip{",amount,"}{",keyword,"}")
+ else -- no check
+ texsprint(ctxcatcodes,"\\addaskedblankskip{",amount,"}{",keyword,"}")
+ end
+ end
+ end
+ end
+ return category
+ end
+
+ function vspacing.analyse(str)
+ local texsprint = (trace_vspacing and logger) or texsprint
+ texsprint(ctxcatcodes,"\\startblankhandling")
+ analyse(str,1,texsprint)
+ texsprint(ctxcatcodes,"\\stopblankhandling")
+ end
+
+ --
+
+ function vspacing.setmap(from,to)
+ map[from] = to
+ end
+
+ function vspacing.setskip(key,value,grid)
+ if value ~= "" then
+ if grid == "" then grid = value end
+ skip[key] = { value, grid }
+ end
+ end
+
+end
+
+-- implementation
+
+--~ nodes.snapvalues = { }
+
+--~ function nodes.setsnapvalue(n,ht,dp)
+--~ nodes.snapvalues[n] = { ht, dp, ht+dp }
+--~ end
+
+local trace_list, tracing_info, before, after = { }, false, "", ""
+
+local function glue_to_string(glue)
+ local spec = glue.spec
+ local t = { }
+ t[#t+1] = aux.strip_zeros(number.topoints(spec.width))
+ if spec.stretch_order and spec.stretch_order ~= 0 then
+ t[#t+1] = format("plus -%sfi%s",spec.stretch/65536,string.rep("l",math.abs(spec.stretch_order)-1))
+ elseif spec.stretch and spec.stretch ~= 0 then
+ t[#t+1] = format("plus %s",aux.strip_zeros(number.topoints(spec.stretch)))
+ end
+ if spec.shrink_order and spec.shrink_order ~= 0 then
+ t[#t+1] = format("minus -%sfi%s",spec.shrink/65536,string.rep("l",math.abs(spec.shrink_order)-1))
+ elseif spec.shrink and spec.shrink ~= 0 then
+ t[#t+1] = format("minus %s",aux.strip_zeros(number.topoints(spec.shrink)))
+ end
+ return concat(t," ")
+end
+
+local function nodes_to_string(head)
+ local current, t = head, { }
+ while current do
+ local id = current.id
+ local ty = node.type(id)
+ if id == penalty then
+ t[#t+1] = format("%s:%s",ty,current.penalty)
+ elseif id == glue then
+ t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.spec.width)))
+ elseif id == kern then
+ t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.kern)))
+ else
+ t[#t+1] = ty
+ end
+ current = current.next
+ end
+ return concat(t," + ")
+end
+
+local function reset_tracing(head)
+ trace_list, tracing_info, before, after = { }, false, nodes_to_string(head), ""
+end
+
+local function trace_skip(str,sc,so,sp,data)
+ trace_list[#trace_list+1] = { "skip", format("%s | %s | category %s | order %s | penalty %s", str, glue_to_string(data), sc or "-", so or "-", sp or "-") }
+ tracing_info = true
+end
+
+local function trace_natural(str,data)
+ trace_list[#trace_list+1] = { "skip", format("%s | %s", str, glue_to_string(data)) }
+ tracing_info = true
+end
+
+local function trace_info(message, where, what)
+ trace_list[#trace_list+1] = { "info", format("%s: %s/%s",message,where,what) }
+end
+
+local function trace_node(what)
+ local nt = node.type(what.id)
+ local tl = trace_list[#trace_list]
+ if tl and tl[1] == "node" then
+ trace_list[#trace_list] = { "node", tl[2] .. " + " .. nt }
+ else
+ trace_list[#trace_list+1] = { "node", nt }
+ end
+end
+
+local function trace_done(str,data)
+ if data.id == penalty then
+ trace_list[#trace_list+1] = { "penalty", format("%s | %s", str, data.penalty) }
+ else
+ trace_list[#trace_list+1] = { "glue", format("%s | %s", str, glue_to_string(data)) }
+ end
+ tracing_info = true
+end
+
+local function show_tracing(head)
+ if tracing_info then
+ after = nodes_to_string(head)
+ for i=1,#trace_list do
+ local tag, text = unpack(trace_list[i])
+ if tag == "info" then
+ logs.report("collapse",text)
+ else
+ logs.report("collapse"," %s: %s",tag,text)
+ end
+ end
+ logs.report("collapse","before: %s",before)
+ logs.report("collapse","after : %s",after)
+ end
+end
+
+-- alignment box begin_of_par vmode_par hmode_par insert penalty before_display after_display
+
+local user_skip = 0
+local line_skip = 1
+local baseline_skip = 2
+local par_skip = 3
+local above_display_skip = 4
+local below_display_skip = 5
+local above_display_short_skip = 6
+local below_display_short_skip = 7
+local left_skip_code = 8
+local right_skip_code = 9
+local top_skip_code = 10
+local split_top_skip_code = 11
+local tab_skip_code = 12
+local space_skip_code = 13
+local xspace_skip_code = 14
+local par_fill_skip_code = 15
+local thin_mu_skip_code = 16
+local med_mu_skip_code = 17
+local thick_mu_skip_code = 18
+
+local skips = {
+ [ 0] = "user_skip",
+ [ 1] = "line_skip",
+ [ 2] = "baseline_skip",
+ [ 3] = "par_skip",
+ [ 4] = "above_display_skip",
+ [ 5] = "below_display_skip",
+ [ 6] = "above_display_short_skip",
+ [ 7] = "below_display_short_skip",
+ [ 8] = "left_skip_code",
+ [ 9] = "right_skip_code",
+ [10] = "top_skip_code",
+ [11] = "split_top_skip_code",
+ [12] = "tab_skip_code",
+ [13] = "space_skip_code",
+ [14] = "xspace_skip_code",
+ [15] = "par_fill_skip_code",
+ [16] = "thin_mu_skip_code",
+ [17] = "med_mu_skip_code",
+ [18] = "thick_mu_skip_code",
+}
+
+local free_glue_node = free_node
+local discard, largest, force, penalty, add, disable, nowhite, goback, together = 0, 1, 2, 3, 4, 5, 6, 7, 8
+
+--~ local function free_glue_node(n) free_node(n.spec) free_node(n) end
+
+function vspacing.snap_box(n,how)
+ local sv = snapmethods[how]
+ if sv then
+ local box = texbox[n]
+ local list = box.list
+--~ if list and (list.id == hlist or list.id == vlist) then
+ if list then
+ local s = has_attribute(list,snap_method)
+ if s == 0 then
+ if trace_vsnapping then
+ -- logs.report("snapper", "hlist not snapped, already done")
+ end
+ else
+ local h, d, ch, cd, lines = snap_hlist(box,sv,box.height,box.depth)
+ box.height, box.depth = ch, cd
+ if trace_vsnapping then
+ logs.report("snapper", "hlist snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines)",h,d,ch,cd,sv.name,sv.specification,"direct",lines)
+ end
+ set_attribute(list,snap_method,0)
+ end
+ end
+ end
+end
+
+local function forced_skip(head,current,width,where,trace)
+ if where == "after" then
+ head, current = insert_node_after(head,current,make_rule_node(0,0,0))
+ head, current = insert_node_after(head,current,make_kern_node(width))
+ head, current = insert_node_after(head,current,make_rule_node(0,0,0))
+ else
+ local c = current
+ head, current = insert_node_before(head,current,make_rule_node(0,0,0))
+ head, current = insert_node_before(head,current,make_kern_node(width))
+ head, current = insert_node_before(head,current,make_rule_node(0,0,0))
+ current = c
+ end
+ if trace then
+ logs.report("vspacing", "inserting forced skip of %s",width)
+ end
+ return head, current
+end
+
+local function collapser(head,where,what,trace,snap) -- maybe also pass tail
+ if trace then
+ reset_tracing(head)
+ end
+ local current, oldhead = head, head
+ local glue_order, glue_data, force_glue = 0, nil, false
+ local penalty_order, penalty_data, natural_penalty = 0, nil, nil
+ local parskip, ignore_parskip, ignore_following, ignore_whitespace, keep_together = nil, false, false, false, false
+ --
+ -- todo: keep_together: between headers
+ --
+ local function flush(why)
+ if penalty_data then
+ local p = make_penalty_node(penalty_data)
+ if trace then trace_done("flushed due to " .. why,p) end
+ head, _ = insert_node_before(head,current,p)
+ end
+ if glue_data then
+ if force_glue then
+ if trace then trace_done("flushed due to " .. why,glue_data) end
+ head, _ = forced_skip(head,current,glue_data.spec.width,"before",trace)
+ free_glue_node(glue_data)
+ elseif glue_data.spec.writable then
+ if trace then trace_done("flushed due to " .. why,glue_data) end
+ head, _ = insert_node_before(head,current,glue_data)
+ else
+ free_glue_node(glue_data)
+ end
+ end
+ if trace then trace_node(current) end
+ glue_order, glue_data, force_glue = 0, nil, false
+ penalty_order, penalty_data, natural_penalty = 0, nil, nil
+ parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false
+ end
+ if trace_vsnapping then
+ logs.report("snapper", "global ht/dp = %s/%s, local ht/dp = %s/%s",
+ texdimen.globalbodyfontstrutheight, texdimen.globalbodyfontstrutdepth,
+ texdimen.bodyfontstrutheight, texdimen.bodyfontstrutdepth)
+ end
+ if trace then trace_info("start analyzing",where,what) end
+ while current do
+ local id, subtype = current.id, current.subtype
+ if id == hlist or id == vlist then
+-- needs checking, why so many calls
+ if snap then
+ local s = has_attribute(current,snap_method)
+ if not s then
+ -- if trace_vsnapping then
+ -- logs.report("snapper", "hlist not snapped")
+ -- end
+ elseif s == 0 then
+ if trace_vsnapping then
+ -- logs.report("snapper", "hlist not snapped, already done")
+ end
+ else
+ local sv = snapmethods[s]
+ if sv then
+ local h, d, ch, cd, lines = snap_hlist(current,sv)
+ if trace_vsnapping then
+ logs.report("snapper", "hlist snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines)",h,d,ch,cd,sv.name,sv.specification,where,lines)
+ end
+ elseif trace_vsnapping then
+ logs.report("snapper", "hlist not snapped due to unknown snap specification")
+ end
+ set_attribute(current,snap_method,0)
+ end
+ else
+ --
+ end
+ -- tex.prevdepth = 0
+ flush("list")
+ current = current.next
+ elseif id == penalty then
+ --~ natural_penalty = current.penalty
+ --~ if trace then trace_done("removed penalty",current) end
+ --~ head, current = remove_node(head, current, true)
+ current = current.next
+ elseif id == kern then
+ if snap and trace_vsnapping and current.kern ~= 0 then
+ --~ current.kern = 0
+ logs.report("snapper", "kern of %s (kept)",current.kern)
+ end
+ flush("kern")
+ current = current.next
+ elseif id ~= glue then
+ flush("something else")
+ current = current.next
+ elseif subtype == user_skip then -- todo, other subtypes, like math
+ local sc = has_attribute(current,skip_category) -- has no default, no unset (yet)
+ local so = has_attribute(current,skip_order ) or 1 -- has 1 default, no unset (yet)
+ local sp = has_attribute(current,skip_penalty ) -- has no default, no unset (yet)
+ if sp and sc == penalty then
+ if not penalty_data then
+ penalty_data = sp
+ elseif penalty_order < so then
+ penalty_order, penalty_data = so, sp
+ elseif penalty_order == so and sp > penalty_data then
+ penalty_data = sp
+ end
+ if trace then trace_skip('penalty in skip',sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ elseif not sc then -- if not sc then
+ if glue_data then
+ if trace then trace_done("flush",glue_data) end
+ head, current = nodes.before(head,current,glue_data)
+ if trace then trace_natural("natural",current) end
+ current = current.next
+ else
+ -- not look back across head
+ local previous = current.prev
+ if previous and previous.id == glue and previous.subtype == 0 then
+ local ps = previous.spec
+ if ps.writable then
+ local cs = current.spec
+ if cs.writable and ps.stretch_order == 0 and ps.shrink_order == 0 and cs.stretch_order == 0 and cs.shrink_order == 0 then
+ local pw, pp, pm = ps.width, ps.stretch, ps.shrink
+ local cw, cp, cm = cs.width, cs.stretch, cs.shrink
+ ps = writable_spec(previous) -- no writable needed here
+ ps.width, ps.stretch, ps.shrink = pw + cw, pp + cp, pm + cm
+ if trace then trace_natural("removed",current) end
+ head, current = remove_node(head, current, true)
+ -- current = previous
+ if trace then trace_natural("collapsed",previous) end
+ -- current = current.next
+ else
+ if trace then trace_natural("filler",current) end
+ current = current.next
+ end
+ else
+ if trace then trace_natural("natural (no prev spec)",current) end
+ current = current.next
+ end
+ else
+ if trace then trace_natural("natural (no prev)",current) end
+ current = current.next
+ end
+ end
+ glue_order, glue_data = 0, nil
+ elseif sc == disable then
+ ignore_following = true
+ if trace then trace_skip("disable",sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ elseif sc == together then
+ keep_together = true
+ if trace then trace_skip("together",sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ elseif sc == nowhite then
+ ignore_whitespace = true
+ head, current = remove_node(head, current, true)
+ elseif sc == discard then
+ if trace then trace_skip("discard",sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ elseif ignore_following then
+ if trace then trace_skip("disabled",sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ elseif not glue_data then
+ if trace then trace_skip("assign",sc,so,sp,current) end
+ glue_order = so
+ head, current, glue_data = remove_node(head, current)
+ elseif glue_order < so then
+ if trace then trace_skip("force",sc,so,sp,current) end
+ glue_order = so
+ free_glue_node(glue_data)
+ head, current, glue_data = remove_node(head, current)
+ elseif glue_order == so then
+ -- is now exclusive, maybe support goback as combi, else why a set
+ if sc == largest then
+ local cs, gs = current.spec, glue_data.spec
+ local cw, gw = cs.width, gs.width
+ if cw > gw then
+ if trace then trace_skip('largest',sc,so,sp,current) end
+ free_glue_node(glue_data) -- also free spec
+ head, current, glue_data = remove_node(head, current)
+ else
+ if trace then trace_skip('remove smallest',sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ end
+ elseif sc == goback then
+ if trace then trace_skip('goback',sc,so,sp,current) end
+ free_glue_node(glue_data) -- also free spec
+ head, current, glue_data = remove_node(head, current)
+ elseif sc == force then
+ -- last one counts, some day we can provide an accumulator and largest etc
+ -- but not now
+ if trace then trace_skip('force',sc,so,sp,current) end
+ free_glue_node(glue_data) -- also free spec
+ head, current, glue_data = remove_node(head, current)
+ elseif sc == penalty then
+ -- ? ? ? ?
+ if trace then trace_skip('penalty',sc,so,sp,current) end
+ free_glue_node(glue_data) -- also free spec
+ glue_data = nil
+ head, current = remove_node(head, current, true)
+ elseif sc == add then
+ if trace then trace_skip('add',sc,so,sp,current) end
+--~ local old, new = glue_data.spec, current.spec
+ local old, new = writable_spec(glue_data), current.spec
+ old.width = old.width + new.width
+ old.stretch = old.stretch + new.stretch
+ old.shrink = old.shrink + new.shrink
+ -- toto: order
+ head, current = remove_node(head, current, true)
+ else
+ if trace then trace_skip("unknown",sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ end
+ else
+ if trace then trace_skip("unknown",sc,so,sp,current) end
+ head, current = remove_node(head, current, true)
+ end
+ if sc == force then
+ force_glue = true
+ end
+ elseif subtype == line_skip then
+ if snap then
+ local s = has_attribute(current,snap_method)
+ if s and s ~= 0 then
+ set_attribute(current,snap_method,0)
+ if current.spec.writable then
+ local spec = writable_spec(current)
+ spec.width = 0
+ if trace_vsnapping then
+ logs.report("snapper", "lineskip set to zero")
+ end
+ end
+ else
+ if trace then trace_skip("lineskip",sc,so,sp,current) end
+ flush("lineskip")
+ end
+ else
+ if trace then trace_skip("lineskip",sc,so,sp,current) end
+ flush("lineskip")
+ end
+ current = current.next
+ elseif subtype == baseline_skip then
+ if snap then
+ local s = has_attribute(current,snap_method)
+ if s and s ~= 0 then
+ set_attribute(current,snap_method,0)
+ if current.spec.writable then
+ local spec = writable_spec(current)
+ spec.width = 0
+ if trace_vsnapping then
+ logs.report("snapper", "baselineskip set to zero")
+ end
+ end
+ else
+ if trace then trace_skip("baselineskip",sc,so,sp,current) end
+ flush("baselineskip")
+ end
+ else
+ if trace then trace_skip("baselineskip",sc,so,sp,current) end
+ flush("baselineskip")
+ end
+ current = current.next
+ elseif subtype == par_skip then
+ -- parskip always comes later
+ if ignore_whitespace then
+ if trace then trace_natural("ignored parskip",current) end
+ head, current = remove_node(head, current, true)
+ elseif glue_data then
+ local ps, gs = current.spec, glue_data.spec
+ if ps.writable and gs.writable and ps.width > gs.width then
+ glue_data.spec = copy_node(ps)
+ if trace then trace_natural("taking parskip",current) end
+ else
+ if trace then trace_natural("removed parskip",current) end
+ end
+ head, current = remove_node(head, current, true)
+ else
+ if trace then trace_natural("honored parskip",current) end
+ head, current, glue_data = remove_node(head, current)
+ end
+ elseif subtype == top_skip_code or subtype == split_top_skip_code then
+ if snap then
+ local s = has_attribute(current,snap_method)
+ if s and s ~= 0 then
+ set_attribute(current,snap_method,0)
+ local sv = snapmethods[s]
+ local w, cw = snap_topskip(current,sv)
+ if trace_vsnapping then
+ logs.report("snapper", "topskip snapped from %s to %s for '%s'",w,cw,where)
+ end
+ else
+ if trace then trace_skip("topskip",sc,so,sp,current) end
+ flush("topskip")
+ end
+ else
+ if trace then trace_skip("topskip",sc,so,sp,current) end
+ flush("topskip")
+ end
+ current = current.next
+ elseif subtype == above_display_skip then
+ --
+ if trace then trace_skip("above display skip (normal)",sc,so,sp,current) end
+ flush("above display skip (normal)")
+ current = current.next
+ --
+ elseif subtype == below_display_skip then
+ --
+ if trace then trace_skip("below display skip (normal)",sc,so,sp,current) end
+ flush("below display skip (normal)")
+ current = current.next
+ --
+ elseif subtype == above_display_short_skip then
+ --
+ if trace then trace_skip("above display skip (short)",sc,so,sp,current) end
+ flush("above display skip (short)")
+ current = current.next
+ --
+ elseif subtype == below_display_short_skip then
+ --
+ if trace then trace_skip("below display skip (short)",sc,so,sp,current) end
+ flush("below display skip (short)")
+ current = current.next
+ --
+ else -- other glue
+ if snap and trace_vsnapping and current.spec.writable and current.spec.width ~= 0 then
+ logs.report("snapper", "%s of %s (kept)",skips[subtype],current.spec.width)
+ --~ current.spec.width = 0
+ end
+ if trace then trace_skip(format("some glue (%s)",subtype),sc,so,sp,current) end
+ flush("some glue")
+ current = current.next
+ end
+ end
+ if trace then trace_info("stop analyzing",where,what) end
+ --~ if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then
+ --~ penalty_data = natural_penalty
+ --~ end
+ if trace and (glue_data or penalty_data) then
+ trace_info("start flushing",where,what)
+ end
+ local tail
+ if penalty_data then
+ tail = find_node_tail(head)
+ local p = make_penalty_node(penalty_data)
+ if trace then trace_done("result",p) end
+ head, tail = insert_node_after(head,tail,p)
+ end
+ if glue_data then
+ if not tail then tail = find_node_tail(head) end
+ if trace then trace_done("result",glue_data) end
+ if force_glue then
+ head, tail = forced_skip(head,tail,glue_data.spec.width,"after",trace)
+ free_glue_node(glue_data)
+ else
+ head, tail = insert_node_after(head,tail,glue_data)
+ end
+ end
+ if trace then
+ if glue_data or penalty_data then
+ trace_info("stop flushing",where,what)
+ end
+ show_tracing(head)
+ if oldhead ~= head then
+ trace_info("head has been changed from '%s' to '%s'",node.type(oldhead.id),node.type(head.id))
+ end
+ end
+ return head, true
+end
+
+-- alignment after_output end box new_graf vmode_par hmode_par insert penalty before_display after_display
+-- \par -> vmode_par
+--
+-- status.best_page_break
+-- tex.lists.best_page_break
+-- tex.lists.best_size (natural size to best_page_break)
+-- tex.lists.least_page_cost (badness of best_page_break)
+-- tex.lists.page_head
+-- tex.lists.contrib_head
+
+local stackhead, stacktail, stackhack = nil, nil, false
+
+local function report(message,lst)
+ logs.report("vspacing",message,count_nodes(lst,true),node_ids_to_string(lst))
+end
+
+function nodes.handle_page_spacing(newhead,where)
+--~ local newhead = texlists.contrib_head
+ if newhead then
+--~ starttiming(vspacing)
+ local newtail = find_node_tail(newhead)
+ local flush = false
+ stackhack = true -- todo: only when grid snapping once enabled
+ for n in traverse_nodes(newhead) do -- we could just look for glue nodes
+ local id = n.id
+ if id == glue then
+ if n.subtype == 0 then
+ if has_attribute(n,skip_category) then
+ stackhack = true
+ else
+ flush = true
+ end
+ else
+ -- tricky
+ end
+ else
+ flush = true
+ end
+ end
+ if flush then
+ if stackhead then
+ if trace_collect_vspacing then report("appending %s nodes to stack (final): %s",newhead) end
+ stacktail.next = newhead
+ newhead.prev = stacktail
+ newhead = stackhead
+ stackhead, stacktail = nil, nil
+ end
+ if stackhack then
+ stackhack = false
+ if trace_collect_vspacing then report("processing %s nodes: %s",newhead) end
+--~ texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true)
+newhead = collapser(newhead,"page",where,trace_page_vspacing,true)
+ else
+ if trace_collect_vspacing then report("flushing %s nodes: %s",newhead) end
+--~ texlists.contrib_head = newhead
+ end
+ else
+ if stackhead then
+ if trace_collect_vspacing then report("appending %s nodes to stack (intermediate): %s",newhead) end
+ stacktail.next = newhead
+ newhead.prev = stacktail
+ else
+ if trace_collect_vspacing then report("storing %s nodes in stack (initial): %s",newhead) end
+ stackhead = newhead
+ end
+ stacktail = newtail
+--~ texlists.contrib_head = nil
+newhead = nil
+ end
+--~ stoptiming(vspacing)
+ end
+return newhead
+end
+
+local ignore = table.tohash {
+ "split_keep",
+ "split_off",
+ -- "vbox",
+}
+
+function nodes.handle_vbox_spacing(head,where)
+ if head and not ignore[where] and head.next then
+ -- starttiming(vspacing)
+ head = collapser(head,"vbox",where,trace_vbox_vspacing,false)
+ -- stoptiming(vspacing)
+ end
+ return head
+end
+
+function nodes.collapse_vbox(n) -- for boxes
+ local list = texbox[n].list
+ if list then
+ -- starttiming(vspacing)
+ texbox[n].list = vpack_node(collapser(list,"snapper","vbox",trace_vbox_vspacing,true))
+ -- stoptiming(vspacing)
+ end
+end
+
+-- we will split this module hence the locals
+
+local attribute = attributes.private('graphicvadjust')
+
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+
+local remove_node = nodes.remove
+local hpack_node = node.hpack
+local vpack_node = node.vpack
+local has_attribute = node.has_attribute
+
+function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only
+ if groupcode == "" then -- mvl only
+ local h, p, done = head, nil, false
+ while h do
+ local id = h.id
+ if id == hlist or id == vlist then
+ local a = has_attribute(h,attribute)
+ if a then
+ if p then
+ local n
+ head, h, n = remove_node(head,h)
+ local pl = p.list
+ if n.width ~= 0 then
+ n = hpack_node(n,0,'exactly') -- todo: dir
+ end
+ if pl then
+ pl.prev = n
+ n.next = pl
+ end
+ p.list = n
+ done = true
+ else
+ -- can't happen
+ end
+ else
+ p = h
+ h = h.next
+ end
+ else
+ h = h.next
+ end
+ end
+ return head, done
+ else
+ return head, false
+ end
+end
+
+--~ function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only
+--~ if groupcode == "" then -- mvl only
+--~ return head, false
+--~ else
+--~ return head, false
+--~ end
+--~ end
+
+--~ tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust")
+
+nodes.builders = nodes.builder or { }
+
+local builders = nodes.builders
+
+local actions = tasks.actions("vboxbuilders",5)
+
+function nodes.builders.vpack_filter(head,groupcode,size,packtype,maxdepth,direction)
+ local done = false
+ if head then
+ starttiming(builders)
+ if trace_callbacks then
+ local before = nodes.count(head)
+ head, done = actions(head,groupcode,size,packtype,maxdepth,direction)
+ local after = nodes.count(head)
+ if done then
+ tracer("vpack","changed",head,groupcode,before,after,true)
+ else
+ tracer("vpack","unchanged",head,groupcode,before,after,true)
+ end
+ stoptiming(builders)
+ else
+ head, done = actions(head,groupcode)
+ stoptiming(builders)
+ end
+ end
+ return head, done
+end
+
+-- This one is special in the sense that it has no head
+-- and we operate on the mlv. Also, we need to do the
+-- vspacing last as it removes items from the mvl.
+
+local actions = tasks.actions("mvlbuilders",1)
+
+function nodes.builders.buildpage_filter(groupcode)
+ starttiming(builders)
+ local head = texlists.contrib_head
+ local head, done = actions(head,groupcode)
+ texlists.contrib_head = head
+ stoptiming(builders)
+ return (done and head) or true
+end
+
+callbacks.register('vpack_filter', nodes.builders.vpack_filter, "vertical spacing etc")
+callbacks.register('buildpage_filter', nodes.builders.buildpage_filter, "vertical spacing etc (mvl)")
+
+statistics.register("v-node processing time", function()
+ return statistics.elapsedseconds(builders)
+end)
diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv
new file mode 100644
index 000000000..75af82df7
--- /dev/null
+++ b/tex/context/base/spac-ver.mkiv
@@ -0,0 +1,2078 @@
+%D \module
+%D [ file=spac-ver,
+%D version=2009.10.16, % 1997.03.31, was core-spa.tex
+%D title=\CONTEXT\ Spacing Macros,
+%D subtitle=Vertical,
+%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 Spacing Macros / Vertical}
+
+\unprotect
+
+\registerctxluafile{spac-ver}{1.001}
+
+\newskip\blankskip \blankskip=\bigskipamount
+
+\def\skipfactor {.75}
+\def\skipgluefactor{.25}
+
+\def\normalskipamount
+ {\openlineheight
+ \ifgridsnapping \else \ifblankflexible
+ \!!plus \skipgluefactor\openlineheight
+ \!!minus\skipgluefactor\openlineheight
+ \fi \fi
+ \relax}
+
+\def\linedistance {\normalskipamount}
+\def\appliedblankskip{\skipfactor\linedistance}
+\def\lastblankskip {\blankskip}
+\def\currentblank {\v!big}
+\def\oldprevdepth {\prevdepth}
+\def\newprevdepth {-1001pt}
+\def\mindimen {1sp} % was: 0.00002pt
+
+%D There are two ways to influence the interline spacing. The
+%D most general and often most consistent way is using
+%D
+%D \showsetup{setupinterlinespace}
+%D
+%D For instance
+%D
+%D \starttyping
+%D \setupinterlinespace[line=2.8ex]
+%D \stoptyping
+%D
+%D This setting adapts itself to the bodyfontsize, while for
+%D instance saying
+%D
+%D \starttyping
+%D \setupinterlinespace[line=12pt]
+%D \stoptyping
+%D
+%D sets things fixed for all sizes, which is definitely not
+%D what we want. Therefore one can also say:
+%D
+%D \starttyping
+%D \definebodyfontenvironment[9pt][interlinespace=11pt]
+%D \stoptyping
+%D
+%D One can still use \type{\setupinterlinespace} (without
+%D arguments) to set the interline space according to the
+%D current font, e.g. a \type{\bfa}.
+
+\newif\iflocalinterlinespace
+
+% font-ini
+
+\ifx\bodyfontinterlinespecs\undefined
+
+ \let\bodyfontinterlinespecs\empty
+ \let\bodyfontinterlinespace\empty
+
+\fi
+
+% \def\presetnormallineheight
+% {\edef\normallineheight{\@@itline}%
+% %done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
+% \iflocalinterlinespace \else
+% \doifdefined\bodyfontinterlinespecs
+% {\doifsomething\bodyfontinterlinespace
+% {\edef\normallineheight{\bodyfontinterlinespace}}}%
+% \fi}
+
+% \unexpanded\def\setupspecifiedinterlinespace[#1]%
+% {\getparameters[\??it][#1]%
+% \scratchdimen0\@@itheight\points
+% \advance\scratchdimen 0\@@itdepth\points
+% \ifdim\scratchdimen>\onepoint
+% \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}%
+% \let\@@itheight\strutheightfactor
+% \let\@@itdepth \strutdepthfactor
+% \else
+% \let\strutheightfactor\@@itheight
+% \let\strutdepthfactor \@@itdepth
+% \fi
+% \let\minimumstrutheight \@@itminheight
+% \let\minimumstrutdepth \@@itmindepth
+% \let\minimumlinedistance\@@itdistance
+% \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex
+% \doifelse\@@ittop\v!height % new, topskip does more bad than good
+% {\let\topskipfactor \@@itheight}
+% {\let\topskipfactor \@@ittop }%
+% \let\maxdepthfactor \@@itbottom
+% \let\baselinegluefactor \@@itstretch
+% \setfontparameters % redundant, can be \setstrut, test first
+% \updateraggedskips} % yes indeed
+
+\def\presetnormallineheight
+ {\edef\normallineheight{\interlinespaceparameter\c!line}%
+ %done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
+ \iflocalinterlinespace \else
+ \doifdefined\bodyfontinterlinespecs
+ {\doifsomething\bodyfontinterlinespace
+ {\edef\normallineheight{\bodyfontinterlinespace}}}%
+ \fi}
+
+\unexpanded\def\setupspecifiedinterlinespace[#1]%
+ {\getparameters[\??it\currentinterlinespace][#1]%
+ \dosetupspecifiedinterlinespaceindeed}
+
+\def\dosetupspecifiedinterlinespaceindeed
+ {\edef\strutheightfactor {\interlinespaceparameter\c!height}%
+ \edef\strutdepthfactor {\interlinespaceparameter\c!depth}%
+ \edef\minimumstrutheight {\interlinespaceparameter\c!minheight}%
+ \edef\minimumstrutdepth {\interlinespaceparameter\c!mindepth}%
+ \edef\minimumlinedistance{\interlinespaceparameter\c!distance}%
+ \edef\normallineheight {\interlinespaceparameter\c!line}%
+ \edef\topskipfactor {\interlinespaceparameter\c!top}%
+ \edef\maxdepthfactor {\interlinespaceparameter\c!bottom}%
+ \edef\baselinegluefactor {\interlinespaceparameter\c!stretch}%
+ % often topskip does more bad than good, so:
+ \ifx\topskipfactor\v!height
+ \let\topskipfactor\strutheightfactor
+ \fi
+ \setfontparameters % redundant, can be \setstrut, test first
+ \updateraggedskips} % yes indeed
+
+\let\currentrelativeinterlinespace\empty
+
+\setvalue{\??it::\v!on }{\oninterlineskip}
+\setvalue{\??it::\v!off }{\offinterlineskip}
+\setvalue{\??it::\v!reset}{\let\currentrelativeinterlinespace\empty
+ \let\setrelativeinterlinespace\relax
+ \setfontparameters}
+\setvalue{\??it::\v!auto }{\let\setrelativeinterlinespace\dosetrelativeinterlinespace}
+
+% \def\dosetspecifiedrelativeinterlinespace#1%
+% {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+% \spacing\currentrelativeinterlinespace}
+
+% \def\dosetspecifiedrelativeinterlinespace#1% fragile?
+% {\doifdimensionelse{#1}
+% {\setupspecifiedinterlinespace[\c!line=#1]}
+% {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+% \spacing\currentrelativeinterlinespace}}
+
+\def\dosetspecifiedrelativeinterlinespace#1% fragile?
+ {\doifdimenstringelse{#1}
+ {\setupspecifiedinterlinespace[\c!line=#1]}
+ {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
+ \spacing\currentrelativeinterlinespace}}
+
+\unexpanded\def\setuprelativeinterlinespace[#1]%
+ {\processcommalist[#1]\dosetuprelativeinterlinespace}
+
+\def\dosetuprelativeinterlinespace#1%
+ {\ifcsname\??it::#1\endcsname
+ \csname\??it::#1\endcsname
+ \else
+ \dosetspecifiedrelativeinterlinespace{#1}%
+ \fi}
+
+\def\dosetrelativeinterlinespace
+ {\ifx\currentrelativeinterlinespace\empty\else
+ \spacing\currentrelativeinterlinespace
+ \fi}
+
+\let\setrelativeinterlinespace\relax
+
+% \appendtoks \setrelativeinterlinespace \to \everybodyfont
+
+\newtoks \everysetupglobalinterlinespace
+\newtoks \everysetuplocalinterlinespace
+
+% \def\complexsetupinterlinespace[#1]% \commalistelement ipv #1
+% {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
+% \the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
+
+\def\interlinespaceparameter #1{\csname\dointerlinespaceparameter{\??it\currentinterlinespace}#1\endcsname}
+\def\dointerlinespaceparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointerlinespaceparentparameter\csname#1\s!parent\endcsname#2\fi}
+\def\dointerlinespaceparentparameter#1#2{\ifx#1\relax\s!empty\else\dointerlinespaceparameter#1#2\fi}
+
+\newconditional\interlinespaceisset
+
+\let\currentinterlinespace\empty
+
+\unexpanded\def\defineinterlinespace
+ {\dodoubleempty\dodefineinterlinespace}
+
+\def\dodefineinterlinespace[#1][#2]%
+ {\getparameters[\??it#1][\s!parent=\??it,#2]}
+
+\unexpanded\def\setupinterlinespace
+ {\dodoubleempty\dosetupinterlinespace}
+
+\def\dosetupinterlinespace[#1][#2]%
+ {\settrue\interlinespaceisset % reset has to be done when needed
+ \ifsecondargument
+ \getparameters[\??it#1][#2]%
+ \else\iffirstargument
+ \edef\currentinterlinespace{\ifcsname\??it#1\s!parent\endcsname#1\fi}%
+ \ifx\currentinterlinespace\empty
+ \complexsetupinterlinespace[#1]%
+ \else
+ \dosetupspecifiedinterlinespaceindeed
+ \fi
+ \else
+ \let\currentinterlinespace\empty
+ \simplesetupinterlinespace
+ \fi\fi}
+
+\def\complexsetupinterlinespace[#1]% \commalistelement ipv #1
+ {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
+ \the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
+
+\def\simplesetupinterlinespace % adapts to the font
+ {\localinterlinespacetrue
+ \setfontparameters
+ \updateraggedskips % funny one here
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse}
+
+% \def\dosetupcheckedinterlinespace#1% often a chain
+% {\edef\askedinterlinespace{#1}%
+% \ifx\askedinterlinespace\empty
+% \simplesetupinterlinespace
+% \else
+% \normalexpanded{\noexpand\doifassignmentelse{\askedinterlinespace}%
+% \noexpand\setupspecifiedinterlinespace
+% \noexpand\setuprelativeinterlinespace[\askedinterlinespace]}%
+% \iflocalinterlinespace
+% \the\everysetuplocalinterlinespace
+% \else
+% \localinterlinespacetrue
+% \the\everysetuplocalinterlinespace
+% \localinterlinespacefalse
+% \fi
+% \fi}
+
+\def\dosetupcheckedinterlinespace#1% often a chain
+ {\edef\askedinterlinespace{#1}%
+ \ifx\askedinterlinespace\empty
+ \simplesetupinterlinespace
+ \else\ifcsname\??it\askedinterlinespace\s!parent\endcsname
+ \pushmacro\currentinterlinespace
+ \let\currentinterlinespace\askedinterlinespace
+ \dosetupspecifiedinterlinespaceindeed
+ \iflocalinterlinespace
+ \the\everysetuplocalinterlinespace
+ \else
+ \localinterlinespacetrue
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse
+ \fi
+ \popmacro\currentinterlinespace
+ \else
+ \normalexpanded{\noexpand\doifassignmentelse{\askedinterlinespace}%
+ \noexpand\setupspecifiedinterlinespace
+ \noexpand\setuprelativeinterlinespace[\askedinterlinespace]}%
+ \iflocalinterlinespace
+ \the\everysetuplocalinterlinespace
+ \else
+ \localinterlinespacetrue
+ \the\everysetuplocalinterlinespace
+ \localinterlinespacefalse
+ \fi
+ \fi\fi}
+
+% \unexpanded\def\setuplocalinterlinespace[#1]%
+% {\localinterlinespacetrue
+% \let\@@saveditheight \@@itheight
+% \let\@@saveditdepth \@@itdepth
+% \let\@@saveditline \@@itline
+% \let\@@saveditminheight\@@itminheight
+% \let\@@saveditmindepth \@@itmindepth
+% \let\@@saveditdistance \@@itdistance
+% \let\@@savedittop \@@ittop
+% \let\@@saveditbottom \@@itbottom
+% \let\@@saveditstretch \@@itstretch
+% \setupinterlinespace[#1]%
+% \let\@@itheight \@@saveditheight
+% \let\@@itdepth \@@saveditdepth
+% \let\@@itline \@@saveditline
+% \let\@@itminheight\@@saveditminheight
+% \let\@@itmindepth \@@saveditmindepth
+% \let\@@itdistance \@@saveditdistance
+% \let\@@ittop \@@savedittop
+% \let\@@itbottom \@@saveditbottom
+% \let\@@itstretch \@@saveditstretch
+% \localinterlinespacefalse}
+
+\unexpanded\def\setuplocalinterlinespace[#1]%
+ {\localinterlinespacetrue
+ \pushmacro\currentinterlinespace
+ \setupinterlinespace[#1]%
+ \popmacro\currentinterlinespace
+ \localinterlinespacefalse}
+
+\let\switchtointerlinespace\setuplocalinterlinespace
+
+\definecomplexorsimple\setupinterlinespace
+
+\def\removelastskip % a redefinition of plain
+ {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi}
+
+\def\doifoutervmode#1%
+ {\ifvmode\ifinner\else#1\fi\fi}
+
+\def\dosomebreak#1%
+ {\doifoutervmode
+ {\scratchskip\lastskip
+ \removelastskip
+ %\leavevmode\type{#1}%
+ #1\relax
+ \ifdim\scratchskip=\zeropoint % else interference with footnotes
+ \else
+ \vskip\scratchskip
+ \fi}}
+
+\def\packed
+ {\nointerlineskip}
+
+\def\godown[#1]%
+ {\relax
+ \ifhmode\endgraf\fi
+ \ifvmode\nointerlineskip\vskip#1\relax\fi}
+
+\ifx\smallskip\undefined
+
+ \def\smallskip{\vskip\smallskipamount}
+ \def\medskip {\vskip\medskipamount}
+ \def\bigskip {\vskip\bigskipamount}
+
+\fi
+
+\ifx\allowbreak\undefined
+
+ \def\break {\penalty\ifhmode-\plustenthousand\else\ejectpenalty\fi}
+ \def\nobreak {\penalty \plustenthousand}
+ \def\allowbreak{\penalty \zeropoint}
+ \def\filbreak {\par\vfil\penalty-200\vfilneg}
+ \def\goodbreak {\par\penalty-500 }
+
+\fi
+
+%D Made slightly more readable:
+
+\ifx\vglue\undefined
+
+ \def\vglue {\afterassignment\dovglue\scratchskip=}
+ \def\hglue {\afterassignment\dohglue\scratchskip=}
+ \def\topglue{\nointerlineskip\vglue-\topskip\vglue}
+
+ \def\dovglue
+ {\par
+ \scratchdimen\prevdepth
+ \hrule\!!height\zeropoint
+ \nobreak
+ \vskip\scratchskip
+ \prevdepth\scratchdimen}
+
+ \def\dohglue
+ {\dontleavehmode % \leavevmode
+ \scratchcounter\spacefactor
+ \vrule\!!width\zeropoint
+ \nobreak
+ \hskip\scratchskip
+ \spacefactor\scratchcounter}
+
+\fi
+
+\ifx\eject\undefined
+
+ \def\eject{\par\break}
+
+\fi
+
+\ifx\supereject\undefined
+
+ \def\supereject{\par\penalty\superpenalty}
+
+\fi
+
+\ifx\dosupereject\undefined
+
+ \def\dosupereject
+ {\ifnum\insertpenalties>\zerocount % something is being held over
+ \line{}
+ \kern-\topskip
+ \nobreak
+ \vfill\supereject
+ \fi}
+
+\fi
+
+%D We adapt plain's \type {\removelastskip} a bit:
+
+\ifx\removelastskip\undefined
+
+ \def\removelastskip
+ {\ifvmode \ifdim\lastskip=\zeropoint \else
+ \vskip-\lastskip
+ \fi \fi}
+
+\fi
+
+\ifx\smallbreak\undefined
+
+\def\smallbreak
+ {\par
+ \ifdim\lastskip<\smallskipamount
+ \removelastskip
+ \penalty-50
+ \smallskip
+ \fi}
+
+\def\medbreak
+ {\par
+ \ifdim\lastskip<\medskipamount
+ \removelastskip
+ \penalty-100
+ \medskip
+ \fi}
+
+\def\bigbreak
+ {\par
+ \ifdim\lastskip<\bigskipamount
+ \removelastskip
+ \penalty-200
+ \bigskip
+ \fi}
+
+\fi
+
+\newskip\ctxparskip \ctxparskip\zeropoint
+
+\newconditional \flexiblewhitespace \settrue\flexiblewhitespace
+
+\def\currentwhitespace {\zeropoint}
+
+\definecomplexorsimple\setupwhitespace
+
+\def\simplesetupwhitespace
+ {\doifnot\currentwhitespace\v!none\dosetupwhitespace}
+
+\def\complexsetupwhitespace[#1]%
+ {\edef\nextcurrentwhitespace{#1}%
+ \ifx\nextcurrentwhitespace\empty
+ \simplesetupwhitespace
+ \else
+ \let\currentwhitespace\nextcurrentwhitespace
+ \dosetupwhitespace
+ \fi}
+
+\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
+
+\def\dodosetupwhitespace
+ {\ifgridsnapping
+ \setfalse\flexiblewhitespace
+ \ctxparskip1\ctxparskip
+ \ifdim\ctxparskip>\zeropoint
+ \ifcase\baselinegridmode
+ \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \or
+ \ifdim\scratchdimen=\baselineskip % maybe range
+ \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \else
+ \ctxparskip\numexpr\ctxparskip/\dimexpr.5\lineheight\relax\relax\dimexpr.5\lineheight\relax
+ \fi
+ \else
+ \ctxparskip\baselineskip % normal ! ! ! ! !!
+ \fi
+ \fi
+ \else
+ \ifconditional\flexiblewhitespace \else \ctxparskip1\ctxparskip \fi
+ \fi
+ \parskip\ctxparskip}
+
+\definesystemvariable {ws} % whitespace
+
+\unexpanded\def\definewhitespacemethod[#1]#2{\setvalue{\??ws\??ws#1}{#2}}
+
+\definewhitespacemethod [\v!fix] {}
+\definewhitespacemethod [\v!fixed] {\setfalse\flexiblewhitespace}
+\definewhitespacemethod [\v!flexible] {\settrue\flexiblewhitespace}
+\definewhitespacemethod [\v!line] {\ctxparskip \baselineskip}
+\definewhitespacemethod [\v!halfline] {\ctxparskip.5\baselineskip}
+\definewhitespacemethod [\v!none] {\ctxparskip \zeropoint}
+\definewhitespacemethod [\v!big] {\ctxparskip \bigskipamount}
+\definewhitespacemethod [\v!medium] {\ctxparskip \medskipamount}
+\definewhitespacemethod [\v!small] {\ctxparskip \smallskipamount}
+
+\definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin}
+
+\def\dowhitespacemethod#1%
+ {\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax}
+
+% \def\nowhitespace
+% {\ifdim\parskip>\zeropoint\relax
+% \ifdim\lastskip=-\parskip
+% \else
+% \vskip-\parskip
+% \fi
+% \fi}
+%
+% \def\nowhitespaceunlessskip
+% {\ifdim\lastskip>\zeropoint \else
+% \nowhitespace
+% \fi}
+%
+% \def\whitespace
+% {\par
+% \ifdim\parskip>\zeropoint\relax
+% %\ifdim\lastskip>\parskip \else
+% % \removelastskip interferes with blanko blokkeer en klein
+% \vskip\parskip
+% %\fi
+% \fi}
+
+\def\nowhitespace{\vspacing[\v!nowhite]}
+\def\whitespace {\vspacing[\v!white]}
+
+% obsolete:
+%
+% \def\savedcurrentwhitespace{\currentwhitespace}
+% \def\savecurrentwhitespace {\edef\savedcurrentwhitespace{\currentwhitespace}}
+% \def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}}
+
+% De onderstaande macro handelt ook de situatie dat er geen
+% tekst tussen \start ... \stop is geplaatst. Daartoe wordt de
+% laatste skip over de lege tekst heen gehaald. Dit komt goed
+% van pas bij het plaatsen van (mogelijk lege) lijsten.
+
+\newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt}
+\def\lastdoneparskip {0pt}
+
+\newconditional\noblankinpacked
+\newcount\packeddepth
+
+\unexpanded\def\startpacked
+ {\dosingleempty\dostartpacked}
+
+\def\dostartpacked[#1]% nesting afvangen
+ {\global\advance\packeddepth\plusone
+ \par
+ \ifnum\packeddepth=\plusone \ifvmode
+ \bgroup
+ \whitespace % not combined
+ \blank[\v!disable]%
+ \doifelse{#1}\v!blank\setfalse\settrue\noblankinpacked
+ \setupwhitespace[\v!none]%
+ \fi \fi}
+
+\unexpanded\def\stoppacked
+ {\par
+ \ifnum\packeddepth=\plusone \ifvmode
+ \egroup
+ \fi \fi
+ \global\advance\packeddepth\minusone}
+
+\unexpanded\def\startunpacked
+ {\blank
+ \bgroup}
+
+\unexpanded\def\stopunpacked
+ {\egroup
+ \blank}
+
+% De onderstaande macro's moeten nog eens nader worden uitgewerkt.
+% Ze spelen een rol bij de spatiering rond omkaderde teksten
+% en/of boxen zonder diepte.
+
+% \prevdepth crosses pageboundaries!
+%
+% todo: a version that works ok inside a box
+
+\let\doaroundlinecorrection\relax
+
+\unexpanded\def\startlinecorrection
+ {\dodoubleempty\dostartlinecorrection}
+
+\def\dostartlinecorrection[#1][#2]% #2 gobbles spaces
+ {\bgroup
+ \processaction
+ [#1]
+ [ \v!blank=>\let\doaroundlinecorrection\blank,
+ \s!default=>\let\doaroundlinecorrection\relax,
+ \s!unknown=>{\def\doaroundlinecorrection{\blank[#1]}}]%
+ \doaroundlinecorrection
+ \startbaselinecorrection
+ \offbaselinecorrection
+ \ignorespaces}
+
+\unexpanded\def\stoplinecorrection
+ {\stopbaselinecorrection
+ \doaroundlinecorrection
+ \egroup}
+
+\def\correctwhitespace
+ {\dowithnextbox
+ {\startbaselinecorrection
+ \flushnextbox
+ \stopbaselinecorrection}%
+ \vbox}
+
+\def\verticalstrut {\normalvbox{\hsize\zeropoint\forgetall\strut}}
+\def\horizontalstrut{\normalhbox {\strut}}
+
+% Hieronder volgen enkele instellingen en macro's ten behoeve
+% van de interlinie en \strut. De waarden 2.8, 0.07, 0.72 en
+% 0.28 zijn ooit eens ontleend aan INRS-TEX en moeten wellicht
+% nog eens instelbaar worden.
+%
+% \lineheight : de hoogte van een regel
+% \spacing{getal} : instellen interlinie
+% \normalbaselines : instellen regelafstend
+%
+% \setstrut : instellen \strut
+% \setnostrut : resetten \strut, \endstrut, \begstrut
+%
+% \setteststrut : instellen zichtbare struts
+% \resetteststrut : instellen onzichtbare struts
+%
+% \setfontparameters : instellen na fontset
+%
+% De hoogte van een regel (\lineheight) is gelijk aan de
+% som van de hoogte (\ht) en diepte (\dp) van \strutbox.
+%
+% \strut : denkbeeldig blokje met hoogte en diepte
+%
+% Een \hbox kan als deze aan het begin van een regel staat
+% een breedte \hsize krijgen. Dit is soms te voorkomen met het
+% commando \leavevmode. Binnen een \vbox geeft dit echter
+% niet altijd het gewenste resultaat, vandaar het commando
+%
+% \dontleavehmode
+
+% Pas op: niet zomaar \topskip en \baselineskip aanpassen
+% en zeker niet \widowpenalty. Dit kan ernstige gevolgen
+% hebben voor kolommen.
+%
+% Enige glue kan op zich geen kwaad, echter als blanko=vast,
+% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook
+% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet,
+% omdat een positieve glue eindeloos rekbaar is.
+
+\newdimen\strutdimen
+\newdimen\lineheight
+\newdimen\openlineheight
+\newdimen\openstrutheight
+\newdimen\openstrutdepth
+\newdimen\topskipgap
+\newdimen\struttotal
+
+\def\strutheightfactor {.72}
+\def\strutdepthfactor {.28}
+
+\def\baselinefactor {2.8}
+\def\baselinegluefactor {0}
+
+\def\minimumstrutheight {0pt}
+\def\minimumstrutdepth {0pt}
+
+\def\normallineheight {\baselinefactor ex}
+\def\minimumlinedistance {\lineskip}
+
+\def\strutheight {0pt}
+\def\strutdepth {0pt}
+\def\strutwidth {0pt}
+
+\let\spacingfactor \plusone
+
+\def\topskipfactor {1.0}
+\def\maxdepthfactor {0.5}
+
+\def\systemtopskipfactor {\topskipfactor}
+\def\systemmaxdepthfactor {\maxdepthfactor}
+
+\ifdefined\globalbodyfontsize\else
+ \newdimen\globalbodyfontsize
+ \globalbodyfontsize=12pt
+\fi
+
+\ifdefined\normalizedbodyfontsize\else
+ \def\normalizedbodyfontsize{12pt}
+\fi
+
+% door een \dimen. Dit is geen probleem omdat (1) de default
+% korpsgrootte 12pt is en (2) de fonts nog niet geladen zijn
+% en de instellingen bij het laden nogmaals plaatsvinden.
+
+\def\topskipcorrection
+ {\simpletopskipcorrection
+ \vskip-\struttotal
+ \verticalstrut}
+
+\def\simpletopskipcorrection
+ {\ifdim\topskip>\openstrutheight
+ % == \vskip\topskipgap
+ \vskip\topskip
+ \vskip-\openstrutheight
+ \fi}
+
+\def\settopskip % the extra test is needed for the lbr family
+ {\topskip\systemtopskipfactor\globalbodyfontsize
+ \ifgridsnapping \else
+ \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi
+ \fi
+\ifgridsnapping
+ \topskip\zeropoint
+\fi
+ \relax % the skip
+ \topskipgap\topskip
+ \advance\topskipgap -\openstrutheight\relax
+ \ifdim\minimumstrutheight>\zeropoint
+ \ifdim\topskip<\minimumstrutheight
+ \topskip\minimumstrutheight\relax
+ \fi
+ \else
+ \ifdim\topskip<\strutheightfactor\openlineheight
+ \topskip\strutheightfactor\openlineheight\relax
+ \fi
+ \fi}
+
+\def\setmaxdepth
+ {\maxdepth\systemmaxdepthfactor\globalbodyfontsize}
+
+\def\normalbaselines
+ {\baselineskip \normalbaselineskip
+ \lineskip \normallineskip
+ \lineskiplimit\normallineskiplimit}
+
+\def\setnormalbaselines
+ {\ifdim\normallineheight>\zeropoint
+ \lineheight\normallineheight
+ \fi
+ \openlineheight\spacingfactor\lineheight
+ \openstrutheight \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight % new
+ \else
+ \strutheightfactor\openlineheight
+ \fi
+ \openstrutdepth \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth % new
+ \else
+ \strutdepthfactor \openlineheight
+ \fi
+ \ifdim\dimexpr\minimumstrutdepth+\minimumstrutheight\relax>\zeropoint
+ \openlineheight\dimexpr\openstrutheight+\openstrutdepth\relax % new
+ \fi
+ \normalbaselineskip\openlineheight
+ \ifgridsnapping\else
+ \!!plus \baselinegluefactor\openlineheight
+ \!!minus\baselinegluefactor\openlineheight
+ \fi
+ \normallineskip\minimumlinedistance\relax % \onepoint\relax
+ \normallineskiplimit\zeropoint\relax
+ \normalbaselines
+ %\dosetupgridsnapping
+ }
+
+\def\spacing#1%
+ {\ifgridsnapping
+ %\ifdim#1\points=\onepoint\else\showmessage\m!layouts{11}{\withoutpt\the\dimexpr#1\points\relax}\fi
+ \let\spacingfactor\plusone
+ \else
+ \edef\spacingfactor{#1}%
+ \fi
+ \edef\systemtopskipfactor {\withoutpt\the\dimexpr#1\dimexpr\topskipfactor \points}%
+ \edef\systemmaxdepthfactor{\withoutpt\the\dimexpr#1\dimexpr\maxdepthfactor\points}%
+ \setnormalbaselines
+ \setstrut}
+
+%D Sometimes one needs to freeze the interlinespacing
+%D
+%D \starttyping
+%D \rm \saveinterlinespace .... {\ss \restoreinterlinespace .... \endgraf}
+%D \stoptyping
+
+\let\restoreinterlinespace\relax
+
+\def\saveinterlinespace
+ {\edef\restoreinterlinespace
+ {\lineheight \the\lineheight
+ \openstrutheight \the\openstrutheight
+ \openstrutdepth \the\openstrutdepth
+ \openlineheight \the\openlineheight
+ \normalbaselineskip \the\normalbaselineskip
+ \normallineskip \the\normallineskip
+ \normallineskiplimit\the\normallineskiplimit
+ \noexpand\def\noexpand\normallineheight{\the\dimexpr\normallineheight}%
+ \noexpand\normalbaselines}}
+
+% plain definition:
+%
+% \def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+%
+% could be:
+%
+% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+
+\ifx\strutbox\undefined
+
+ \newbox\strutbox
+
+ \setbox\strutbox\normalhbox{\vrule height8.5pt depth3.5pt width\zeropoint}
+
+ \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+
+\fi
+
+\let\normalstrut\strut
+
+% The double \hbox construction enables us to \backtrack
+% boxes.
+
+\let\strutht\undefined \newdimen\strutht
+\let\strutdp\undefined \newdimen\strutdp
+
+\unexpanded\def\setstrut
+ {\ifgridsnapping
+ \setstrutgridyes
+ \else
+ \setstrutgridnop
+ \fi}
+
+\unexpanded\def\setstrutgridyes
+ {\strutht\spacingfactor\dimexpr
+ \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight
+ \else
+ \strutheightfactor\dimexpr\normallineheight
+ \fi
+ \strutdp\dimexpr
+ \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth
+ \else
+ \normallineheight-\strutht
+ \fi
+ \dosetstrut}
+
+\unexpanded\def\setstrutgridnop
+ {\strutht\spacingfactor\dimexpr
+ \ifdim\minimumstrutheight>\zeropoint
+ \minimumstrutheight
+ \else
+ \strutheightfactor\dimexpr\normallineheight
+ \fi
+ \strutdp\spacingfactor\dimexpr
+ \ifdim\minimumstrutdepth>\zeropoint
+ \minimumstrutdepth
+ \else
+ \strutdepthfactor\dimexpr\normallineheight
+ \fi
+ \dosetstrut}
+
+\unexpanded\def\setcharstrut#1%
+ {\setbox\strutbox\normalhbox{#1}%
+ \strutht\ht\strutbox
+ \strutdp\dp\strutbox
+ \dosetstrut}
+
+\unexpanded\def\setfontstrut
+ {\setcharstrut{(gplQT}}
+
+\unexpanded\def\setcapstrut% could be M, but Q has descender
+ {\setcharstrut{Q}}
+
+%D Handy for math (used in mathml):
+
+\def\charhtstrut
+ {\begingroup
+ \setcharstrut{GJY}%
+ \vrule\!!width\zeropoint\!!depth\zeropoint\!!height\strutht
+ \endgroup}
+
+\def\chardpstrut
+ {\begingroup
+ \setcharstrut{gjy}%
+ \vrule\!!width\zeropoint\!!depth\strutdp\!!height\zeropoint
+ \endgroup}
+
+% because of all the callbacks in mkiv, we avoid unnecessary boxes ...
+% maybe use an attribute so that we can tag boxes that don't need a
+% treatment; tests with using an attribute so far have shown that
+% it's slower because testing the attribute takes time too
+
+\newdimen\tempstrutdimen
+
+\def\dosetstrut
+ {\let\strut\normalstrut
+ \tempstrutdimen\dimexpr\strutht+\strutdp-\lineheight\relax
+ \ifabsnum\tempstrutdimen<\plustwo
+ % compensate rounding error /- 1sp to avoid too many
+ % 1sp baselineskips in for instance verbatim
+ \strutht\dimexpr\strutht-\tempstrutdimen\relax
+ \fi
+ \edef\strutheight{\the\strutht}% maybe better \number\strutht sp
+ \edef\strutdepth {\the\strutdp}%
+ \ifdim\strutwidth=\zeropoint
+ \dosetstruthide
+ \else
+ \dosetstrutvide
+ \fi
+ \struttotal\dimexpr\strutht+\strutdp\relax}
+
+\def\dosetstruthide
+ {\setbox\strutbox\normalhbox
+ {\vrule
+ \!!width \zeropoint
+ \!!height\strutht
+ \!!depth \strutdp}}
+
+\def\dosetstrutvide
+ {\setbox\strutbox\normalhbox
+ {\normalhbox to \zeropoint
+ {% \hss % new, will be option
+ \vrule
+ \!!width \strutwidth
+ \!!height\strutht
+ \!!depth \strutdp
+ \hss}}}
+
+%D The dimen \type {\struttotal} holds the exact size of the
+%D strut; occasionally a one scaled point difference can show
+%D up with the lineheight.
+
+% experiment
+
+\newbox\emptystrutbox \setbox\emptystrutbox\hbox{}
+
+\def\dosetstruthide
+ {\setbox\strutbox\copy\emptystrutbox
+ \ht\strutbox\strutht
+ \dp\strutbox\strutdp}
+
+\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut}
+
+
+\let\normalstrut\strut
+
+%D Sometimes a capstrut comes in handy
+%D
+%D \starttabulate[|Tl|l|l|]
+%D \NC yes \NC normal strut \NC {\showstruts\setupstrut[yes]\strut} \NC \NR
+%D \NC no \NC no strut \NC {\showstruts\setupstrut[no]\strut} \NC \NR
+%D \NC kap \NC a capital strut (i.e. Q) \NC {\showstruts\setupstrut[cap]\strut} \NC \NR
+%D \NC A B \unknown \NC a character strut (e.g. A) \NC {\showstruts\setupstrut[A]\strut} \NC \NR
+%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR
+%D \stoptabulate
+
+\unexpanded\def\setupstrut
+ {\dosingleempty\dosetupstrut}
+
+\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut
+ {\processaction
+ [#1]
+ [ \v!yes=>\setstrut,
+ \v!auto=>\setautostrut,
+ \v!no=>\setnostrut,
+ \v!cap=>\setcapstrut,
+ \v!fit=>\setfontstrut,
+ \v!line=>\setstrut,
+ \s!default=>\setstrut,
+ \s!unknown=>\setcharstrut\commalistelement]}
+
+\def\showstruts
+ {\setteststrut
+ \settestcrlf}
+
+\def\setteststrut
+ {\def\strutwidth{.8pt}%
+ \setstrut}
+
+\def\autostrutfactor{1.1}
+
+\def\setautostrut
+ {\begingroup
+ \setbox\scratchbox\copy\strutbox
+ \setstrut
+ \ifdim\strutht>\autostrutfactor\ht\scratchbox
+ \endgroup \setstrut
+ \else\ifdim\strutdp>\autostrutfactor\dp\scratchbox
+ \endgroup \setstrut
+ \else
+ \endgroup
+ \fi\fi}
+
+% when enabled, sigstruts will remove themselves if nothing
+% goes inbetween
+
+\newsignal\strutsignal \setfalse\sigstruts
+
+\def\begstrut
+ {\relax\ifcase\strutht\else
+ \ifconditional\sigstruts
+ \noindent\horizontalstrut
+ \normalpenalty\plustenthousand
+ \normalhskip-\strutsignal
+ \normalhskip\strutsignal
+ \else
+ \strut
+ \normalpenalty\plustenthousand
+ \normalhskip\zeropoint
+ \fi
+ \expandafter \ignorespaces
+ \fi}
+
+\def\endstrut
+ {\relax\ifhmode\ifcase\strutht\else
+ \ifconditional\sigstruts
+ \ifdim\lastskip=\strutsignal
+ \unskip\unskip\unpenalty\setbox\scratchbox\lastbox
+ \else
+ \normalpenalty\plustenthousand
+ \normalhskip\zeropoint
+ \strut
+ \fi
+ \else
+ \removeunwantedspaces
+ \normalpenalty\plustenthousand
+ \normalhskip\zeropoint
+ \strut
+ \fi
+ \fi\fi}
+
+\newbox\nostrutbox \setbox\nostrutbox\normalhbox{} % {\normalhbox{}}
+
+\def\setnostrut
+ {\setbox\strutbox\copy\nostrutbox
+ \let\strut\empty
+ \let\endstrut\empty
+ \let\begstrut\empty
+ \let\crlfplaceholder\empty}
+
+% unsave:
+%
+% \def\pseudostrut
+% {\bgroup
+% \setnostrut
+% \normalstrut
+% \egroup}
+%
+% try:
+%
+% \startchemie
+% \chemie[ONE,Z0,SB15,MOV1,SB15,Z0][C,C]
+% \stopchemie
+%
+% so:
+
+\def\pseudostrut
+ {\noindent} % better: \dontleavehmode
+
+\let\pseudobegstrut\pseudostrut
+
+\let\pseudoendstrut\removeunwantedspaces
+
+\def\resetteststrut
+ {\def\strutwidth{\zeropoint}% no let
+ \setstrut}
+
+\ifdefined\setfontparameters\else
+ % problems ! ! ! !
+ \def\setfontparameters{\the\everybodyfont}
+\fi
+
+%D Handy:
+
+\def\baselinedistance{\the\lineheight}
+
+%D We need \type{\normaloffinterlineskip} because the new
+%D definition contains an assignment, and |<|don't ask me
+%D why|>| this assignment gives troubles in for instance the
+%D visual debugger.
+
+%D The plain ones:
+
+% \def\offinterlineskip
+% {\baselineskip-\thousandpoint
+% \lineskip\zeropoint
+% \lineskiplimit\maxdimen}
+
+\def\offinterlineskip
+ {\baselineskip-\thousandpoint
+ \lineskip\zeropoint
+ \lineskiplimit\maxdimen
+ % We also need this here now; thanks to taco for figuring that out!
+ \def\minimumlinedistance{\zeropoint}}
+
+\def\nointerlineskip
+ {\prevdepth-\thousandpoint}
+
+\let\normaloffinterlineskip=\offinterlineskip % knuth's original
+
+%D My own one:
+
+\def\dopushinterlineskip
+ {\edef\oninterlineskip
+ {\baselineskip\the\baselineskip
+ \lineskip\the\lineskip
+ \lineskiplimit\the\lineskiplimit
+ \noexpand\edef\noexpand\minimumlinedistance{\the\dimexpr\minimumlinedistance}%
+ \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}}
+
+\def\nopushinterlineskip
+ {\let\oninterlineskip\setnormalbaselines}
+
+\def\offinterlineskip
+ {\ifdim\baselineskip>\zeropoint
+ \dopushinterlineskip
+ \else
+ \nopushinterlineskip
+ \fi
+ \normaloffinterlineskip}
+
+\let\oninterlineskip=\relax
+
+\def\leaveoutervmode
+ {\ifvmode\ifinner\else
+ \leavevmode
+ \fi\fi}
+
+% We stellen enkele penalties anders in dan Plain TEX:
+%
+% \widowpenalty=\defaultwidowpenalty\relax
+% \clubpenalty =\defaultclubpenalty \relax
+
+\def\resetpenalties#1%
+ {\ifdefined#1%
+ #1\minusone
+ \fi}
+
+\def\setpenalties#1#2#3%
+ {\ifdefined#1% space before #3 prevents lookahead problems, needed when #3=text
+ #1\numexpr#2+\plusone\relax\space\doexpandedrecurse{\the\numexpr#2\relax}{ #3}\zerocount\relax
+ \fi}
+
+\def\doexpandedrecurse#1#2%
+ {\ifnum#1>\zerocount#2\@EA\doexpandedrecurse\@EA{\the\numexpr#1-1\relax}{#2}\fi}
+
+%D \macros
+%D {keeplinestogether}
+%D
+%D Dirty hack, needed in margin content that can run of a page.
+
+% just before margintexts ... will eventually be done differently in mkiv using
+% attributes
+
+\newcount\nofkeeplinestogether
+\let\restoreinterlinepenalty\relax
+
+\def\dorestoreinterlinepenalty
+ {\global\let\restoreinterlinepenalty\relax
+ \global\resetpenalties\interlinepenalties
+ \global\nofkeeplinestogether\zerocount}
+
+\def\keeplinestogether#1%
+ {\ifnum#1>\nofkeeplinestogether
+ \global\nofkeeplinestogether#1%
+ \global\setpenalties\interlinepenalties\nofkeeplinestogether\plustenthousand
+ \global\let\restoreinterlinepenalty\dorestoreinterlinepenalty
+ \fi}
+
+\newif\ifgridsnapping % to be sure
+
+\def\defaultwidowpenalty {2000} % was: 1000
+\def\defaultclubpenalty {2000} % was: 800
+\def\defaultdisplaywidowpenalty {50}
+\def\defaultbrokenpenalty {100}
+
+\def\defaultgridwidowpenalty {0}
+\def\defaultgridclubpenalty {0}
+\def\defaultgriddisplaywidowpenalty {0}
+\def\defaultgridbrokenpenalty {0}
+
+\def\nopenalties
+ {\widowpenalty \zerocount
+ \clubpenalty \zerocount
+ \brokenpenalty \zerocount
+ \doublehyphendemerits\zerocount
+ \finalhyphendemerits \zerocount
+ \adjdemerits \zerocount}
+
+\def\setdefaultpenalties
+ {\directsetup{\systemsetupsprefix\s!default}}
+
+\startsetups [\systemsetupsprefix\s!reset]
+ \resetpenalties\widowpenalties
+ \resetpenalties\clubpenalties
+ \resetpenalties\interlinepenalties
+\stopsetups
+
+% we use \directsetup because it's faster and we know there is no csl
+
+\startsetups [\systemsetupsprefix\s!default]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \widowpenalty \defaultwidowpenalty
+ \clubpenalty \defaultclubpenalty
+ \displaywidowpenalty\defaultdisplaywidowpenalty
+ \brokenpenalty \defaultbrokenpenalty
+
+\stopsetups
+
+\startsetups [\v!grid] [\systemsetupsprefix\s!default]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \widowpenalty \defaultgridwidowpenalty
+ \clubpenalty \defaultgridclubpenalty
+ \displaywidowpenalty\defaultgriddisplaywidowpenalty
+ \brokenpenalty \defaultgridbrokenpenalty
+
+\stopsetups
+
+% as an illustration:
+
+\startsetups [\systemsetupsprefix\v!strict]
+
+ \directsetup{\systemsetupsprefix\s!reset}
+
+ \setpenalties\widowpenalties2\maxdimen
+ \setpenalties\clubpenalties 2\maxdimen
+ \brokenpenalty \maxdimen
+
+\stopsetups
+
+\setdefaultpenalties % will happen later in \setuplayout
+
+%D To be checked:
+
+\ifx\savedstrutbox\undefined \newbox\savedstrutbox \fi
+
+\def\savestrut {\setbox\savedstrutbox\copy\strutbox}
+\def\savedstrut{\copy \savedstrutbox}
+
+%D Page spacing
+
+\chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline
+
+\def\bottomalignlimit{3\lineheight}
+
+\newif\ifn@rmalbottom
+\newif\ifr@ggedbottom
+\newif\ifb@selinebottom
+
+\def\normalbottom
+ {% \topskip 10pt
+ \r@ggedbottomfalse}
+
+\def\raggedbottom
+ {\chardef\bottomraggedness\zerocount
+ \n@rmalbottomfalse
+ \r@ggedbottomtrue
+ \b@selinebottomfalse
+ \settopskip}
+
+\def\alignbottom
+ {\chardef\bottomraggedness\plusone
+ \n@rmalbottomtrue
+ \r@ggedbottomfalse
+ \b@selinebottomfalse
+ \settopskip}
+
+\def\baselinebottom
+ {\chardef\bottomraggedness\plustwo
+ \n@rmalbottomfalse
+ \r@ggedbottomfalse
+ \b@selinebottomtrue
+ \settopskip}
+
+\let\normalbottom=\alignbottom % downward compatible
+
+% so, the new one will be
+%
+% \chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline
+%
+% \def\bottomalignlimit{3\lineheight} % will be settable
+%
+% \def\raggedbottom {\chardef\bottomraggedness=0 \settopskip}
+% \def\alignbottom {\chardef\bottomraggedness=1 \settopskip}
+% \def\baselinebottom{\chardef\bottomraggedness=2 \settopskip}
+%
+% \let\normalbottom =\alignbottom
+
+%D Good old blank redone:
+
+\definesystemattribute[kern-chars]
+\definesystemattribute[skip-category] \chardef\skipcategoryattribute \dogetattributeid{skip-category}
+\definesystemattribute[skip-penalty] \chardef\skippenaltyattribute \dogetattributeid{skip-penalty}
+\definesystemattribute[skip-order] \chardef\skiporderattribute \dogetattributeid{skip-order}
+\definesystemattribute[display-math] \chardef\displaymathattribute \dogetattributeid{display-math}
+\definesystemattribute[snap-method] \chardef\snapmethodattribute \dogetattributeid{snap-method}
+\definesystemattribute[snap-done] \chardef\snapdoneattribute \dogetattributeid{snap-done}
+
+%definesystemattribute[snap-category] \chardef\snapcategoryattribute \dogetattributeid{snap-category}
+
+% TODO: NAMED SNAPPERS
+
+\newskip \bodyfontlineheight
+\newdimen \bodyfontstrutheight
+\newdimen \bodyfontstrutdepth
+
+\newskip \globalbodyfontlineheight
+\newdimen \globalbodyfontstrutheight
+\newdimen \globalbodyfontstrutdepth
+
+% \appendtoks
+% \dosetupgridsnapping
+% \to \everysetupbodyfont
+
+\def\installsnapvalues#1#2% todo: a proper define
+ {\edef\currentsnapper{#1:#2}%
+ \ifcsname\currentsnapper\endcsname \else
+ \setevalue\currentsnapper{\ctxlua{vspacing.define_snap_method("#1","#2")}}%
+ \fi
+ \setevalue{\??gr:#1}{\attribute\snapmethodattribute\csname\currentsnapper\endcsname\space}}
+
+\unexpanded\def\definegridsnapping
+ {\dodoubleargument\dodefinegridsnapping}
+
+\def\dodefinegridsnapping[#1][#2]%
+ {\installsnapvalues{#1}{#2}}
+
+\edef\resetsnapvalue
+ {%\gridsnappingfalse
+ \attribute\snapmethodattribute\attributeunsetvalue}
+
+\def\setsnapvalue#1%
+ {%\gridsnappingtrue
+ \ifcsname\??gr:#1\endcsname\csname\??gr:#1\endcsname\fi}
+
+\def\autosetsnapvalue#1%
+ {\ifcsname\??gr:#1\endcsname
+ \csname\??gr:#1\endcsname
+ \else
+ \installsnapvalues\s!dummy{#1}%
+ \csname\??gr:\s!dummy\endcsname
+ \fi}
+
+% \installsnapvalues{loose} {\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut}
+% \installsnapvalues{normal}{\v!maxdepth:1.0,\v!maxheight:1.0,\v!strut}
+% \installsnapvalues{tight} {\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut}
+
+% none don't enlarge
+% halfline enlarge by halfline/halfline
+% line enlarge by line/line
+% strut enlarge by ht/dp (default)
+% first align to top line
+% last align to bottom line
+% mindepth round depth down
+% maxdepth round depth up
+% minheight round height down
+% maxheight round height up
+% local use local interline space
+% shift:-3tp vertical shift within box
+
+%D We're not downward compatible with \MKII !
+
+\definegridsnapping[\v!normal] [\v!maxheight,\v!maxdepth,\v!strut]
+\definegridsnapping[\v!standard] [\v!maxheight,\v!maxdepth,\v!strut]
+\definegridsnapping[\v!yes] [\v!maxheight,\v!maxdepth,\v!strut]
+
+\definegridsnapping[\v!strict] [\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut]
+\definegridsnapping[\v!tolerant] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut]
+
+\definegridsnapping[\v!top] [\v!minheight,\v!maxdepth,\v!strut]
+\definegridsnapping[\v!bottom] [\v!maxheight,\v!mindepth,\v!strut]
+\definegridsnapping[\v!both] [\v!minheight,\v!mindepth,\v!strut]
+
+\definegridsnapping[\v!broad] [\v!maxheight,\v!maxdepth,\v!strut,0.8] % maybe 0.85
+\definegridsnapping[\v!fit] [\v!maxheight,\v!maxdepth,\v!strut,1.2] % tight 0.15
+
+\definegridsnapping[\v!first] [\v!first]
+\definegridsnapping[\v!last] [\v!last]
+\definegridsnapping[\v!high] [\v!minheight,\v!maxdepth,\v!none]
+\definegridsnapping[\v!low] [\v!maxheight,\v!mindepth,\v!none]
+\definegridsnapping[\v!line] [\v!line]
+\definegridsnapping[\v!strut] [\v!strut]
+
+\definegridsnapping[\v!max] [\v!maxdepth,\v!maxheight,\v!strut]
+\definegridsnapping[\v!min] [\v!mindepth,\v!minheight,\v!strut]
+
+\newtoks\everysetupgridsnapping % this only happens at the setuplayout level
+
+\def\dosetupgridsnapping{\the\everysetupgridsnapping} % not used !
+
+\def\synchronizelocallinespecs
+ {\bodyfontlineheight \normallineheight
+ \bodyfontstrutheight\strutheight
+ \bodyfontstrutdepth \strutdepth}
+
+\def\synchronizegloballinespecs
+ {\global\globalbodyfontlineheight \normallineheight
+ \global\globalbodyfontstrutheight\strutheight
+ \global\globalbodyfontstrutdepth \strutdepth}
+
+% \appendtoks
+% \synchronizegloballinespecs
+% \synchronizelocallinespecs
+% \to \everysetupgridsnapping
+
+\appendtoks
+ \synchronizegloballinespecs
+ \synchronizelocallinespecs
+\to \everysetupglobalinterlinespace
+
+\appendtoks
+ \synchronizelocallinespecs
+\to \everysetuplocalinterlinespace
+
+% \appendtoks
+% \resetsnapvalues
+% \to \everyforgetall
+
+%D Snapping.
+
+\newif\ifgridsnapping
+
+\let\showgridsnapping\relax
+
+\def\snaptogrid {\dosingleempty\dosnaptogrid}
+\def\moveongrid {\dosingleempty\domoveongrid}
+\unexpanded\def\placeongrid{\dosingleempty\doplaceongrid}
+
+\def\dodomoveongrid[#1]%
+ {} % gone, unless we set an attribute
+
+\def\doplaceongrid[#1]%
+ {\snaptogrid[#1]\vbox}
+
+\def\dosnaptogrid[#1]% list or predefined
+ {\ifgridsnapping
+ \expandafter\dodosnaptogrid
+ \else
+ \expandafter\gobbleoneargument
+ \fi{#1}}
+
+\def\dodosnaptogrid#1%
+ {\bgroup
+ \resetsnapvalue
+ \dowithnextbox{\dododosnaptogrid{#1}}}
+
+% eventually there will always be a line snap
+
+\def\dododosnaptogrid#1%
+ {\ifvbox\nextbox
+ \ctxlua{nodes.collapse_vbox(\number\nextbox)}%
+ \fi
+ \doifelsenothing{#1}{\setsnapvalue\v!normal}{\autosetsnapvalue{#1}}%
+ \ctxlua{vspacing.snap_box(\number\nextbox,\number\attribute\snapmethodattribute)}%
+% \ifzeropt\ht\nextbox
+% \ifzeropt\dp\nextbox
+% \box\nextbox % here, else empty and zero
+% \kern-\bodyfontlineheight
+% \else
+% \box\nextbox
+% \fi
+% \else
+ \box\nextbox
+% \fi
+ \egroup}
+
+\def\docheckgridsnapping
+ {\edef\askedgridmode{\layoutparameter\c!grid}% needs checking by WS
+ \doifelse\askedgridmode\v!no
+ {\gridsnappingfalse
+ \resetsystemmode\v!grid
+ \resetsnapvalue}
+ {\gridsnappingtrue
+ \setsystemmode\v!grid
+ \autosetsnapvalue\askedgridmode}}
+
+%D Visualization:
+
+\definepalet
+ [grid]
+ [ one=red,
+ two=green,
+ three=blue,
+ four=gray]
+
+\def\setgridtracebox#1[#2]% % maybe reverse the order
+ {\setbox\nextbox#1%
+ {\hbox
+ {\hbox to \zeropoint
+ {\setlayoutcomponentattribute\v!grid\v!test
+ \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}%
+ \hss}%
+ \flushnextbox}}}
+
+\chardef\gridboxlinenomode\plusone % 0:nothing 1:all 2:lines 3:frame 4:l/r
+\chardef\gridboxlinemode \plusone
+
+\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi}
+\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth}
+
+\def\setgridbox#1#2#3% maybe ifgridsnapping at outer level
+ {\setbox#1\gridboxvbox to #3 % given size
+ {\forgetall
+ \resetteststrut
+ \offinterlineskip
+ \hsize#2%
+ \baselinerulefalse
+ \ifnum\gridboxlinenomode=\plusthree
+ \chardef\gridboxlinenomode\ifodd\realpageno\plusone\else\plustwo\fi
+ \fi
+ \gridboxvbox % calculated size
+ {\getrawnoflines{#3}% \getnoflines{#3}%
+% \ifgridsnapping \else
+% \vskip\topskip
+% \vskip-\strutht
+% \fi
+ \scratchdimen#2\advance\scratchdimen \lineheight
+ \dorecurse\noflines
+ {\strut
+ \hskip-.5\lineheight
+ \ifcase\gridboxlinenomode\or
+ \rlap
+ {\hskip.2\bodyfontsize\hskip\scratchdimen
+ \infofont\hbox to 1em{\hss\recurselevel}}%
+ \or
+ \llap
+ {\infofont\hbox to 1em{\hss\recurselevel}%
+ \hskip.2\bodyfontsize}%
+ \fi
+ \vrule
+ \!!height \gridboxwidth
+ \!!depth \gridboxwidth
+ \!!width \scratchdimen
+ \par}}
+ \vfill}}
+
+%D This has become obsolete:
+
+\def\fuzzysnappedbox#1#2% \box<n> \unvbox<n>
+ {#1#2}
+
+% \def\moveboxontogrid#1#2#3% will become obsolete
+% {\doif{#2}\v!top {\setbox#1\hbox{\snaptogrid[\v!first]\box#1}}%
+% \doif{#2}\v!bottom{\setbox#1\hbox{\snaptogrid[\v!last ]\box#1}}}
+
+\def\moveboxontogrid#1#2#3% will become obsolete
+ {}
+
+%D Helper:
+
+\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap
+ {\doifelse{#1}\v!line
+ {#2\ifgridsnapping
+ \bodyfontlineheight
+ \else
+ \openlineheight
+ \fi}
+ {\ifgridsnapping
+ \assigndimension{#1}{#2}{.25\bodyfontlineheight}{.5\bodyfontlineheight}\bodyfontlineheight
+ \else
+ \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount
+ \fi}%
+ \relax}
+
+% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop
+% \start \dosetstretch{.5em} effe flink doorfietsen \stop
+
+% \def\dosetupgridsnapping % calls too often, only needed in gridsnapping
+% {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}}
+%
+% \def\doenablegridsnapping
+% {\attribute\snapcategoryattribute\plusone
+% \topskip\strutht
+% \offinterlineskip}
+%
+% \def\dodisablegridsnapping
+% {\attribute\snapcategoryattribute\attributeunsetvalue
+% % reset topskip
+% \oninterlineskip}
+
+% experimental code, not yet interfaced:
+
+% category:
+% 0 == discard discard
+% 1 == only if larger largest
+% 2 == force even if smaller force
+% 3 == only take penalty component penalty
+% 4 == add to existing skip add
+% 5 == disable (ignore following) disable
+% 6 == kill whitespace nowhite
+% 7 == discard previous back
+%
+% penalty: larger wins
+% order: larger wins
+% category:2,order:5,penalty:10000,skip:value|kw
+%
+% \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi}
+
+% todo, in grid mode: vspacing.fixed = false
+
+\let\saveouterspacing \relax % for old times sake
+\let\restoreouterspacing\relax % for old times sake
+
+\newtoks\everybeforeblankhandling
+\newtoks\everyafterblankhandling
+
+\newconditional\someblankdone
+
+\appendtoks
+ \blankskip\zeropoint
+ \attribute\skipcategoryattribute\plusone
+ \attribute\skippenaltyattribute \attributeunsetvalue
+ \attribute\skiporderattribute \attributeunsetvalue
+ \ifgridsnapping % \ifblankflexible
+ \setfalse\blankisfixed
+ \else
+ \settrue\blankisfixed
+ \fi
+\to \everybeforeblankhandling
+
+\appendtoks
+ \ifconditional\blankisfixed
+ \blankskip1\blankskip
+ \else
+ \blankskip1\blankskip\!!plus\skipgluefactor\blankskip\!!minus\skipgluefactor\blankskip
+ \fi
+\to \everyafterblankhandling
+
+% \ifgridsnapping will go
+
+\appendtoks
+ \ifgridsnapping
+ \settrue\blankisfixed
+ \else
+ \setfalse\blankisfixed
+ \fi
+\to \everybeforeblankhandling
+
+\def\setblankcategory#1%
+ {\settrue\someblankdone
+ \attribute\skipcategoryattribute#1\relax}
+
+\def\setblankorder#1%
+ {\attribute\skiporderattribute#1\relax}
+
+\def\fixedblankskip
+ {\settrue\blankisfixed}
+
+\def\flexibleblankskip
+ {\setfalse\blankisfixed}
+
+\def\addblankskip#1#2#3%
+ {\settrue\someblankdone
+ \advance\blankskip#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax}
+
+\def\setblankpenalty #1%
+ {\flushblankhandling
+ \settrue\someblankdone
+ \attribute\skipcategoryattribute \plusthree
+ \attribute\skippenaltyattribute #1\relax
+ \flushblankhandling}
+
+\unexpanded\def\startblankhandling
+ {\par
+ \ifvmode
+ \expandafter\dostartblankhandling
+ \else
+ \expandafter\nostartblankhandling
+ \fi}
+
+\def\nostartblankhandling#1\stopblankhandling
+ {}
+
+\def\dostartblankhandling
+ {\begingroup
+ \setfalse\someblankdone
+ \the\everybeforeblankhandling}
+
+\unexpanded\def\stopblankhandling
+ {\the\everyafterblankhandling
+ \ifconditional\someblankdone
+ \vskip\blankskip
+ \fi
+ \endgroup}
+
+\def\flushblankhandling
+ {\the\everyafterblankhandling
+ \ifconditional\someblankdone
+ \vskip\blankskip
+ \fi
+ \setfalse\someblankdone
+ \the\everybeforeblankhandling}
+
+% % % % we can move much to lua once we can expand there % % % %
+
+\unexpanded\def\definevspacingamount
+ {\dotripleempty\dodefinevspacingamount}
+
+% \def\dodefinevspacingamount[#1][#2][#3]%
+% {\ctxlua{vspacing.setskip("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
+
+\def\dodefinevspacingamount[#1][#2][#3]% can be combined
+ {\setvalue{\??vs:#1}{\ifgridsnapping#3\else#2\fi}%
+ \ctxlua{vspacing.setskip("#1")}}
+
+\def\addpredefinedblankskip#1#2%
+ {\settrue\someblankdone
+ \advance\blankskip#1\dimexpr\csname\??vs:#2\endcsname\relax}
+
+\def\addaskedblankskip#1#2%
+ {\settrue\someblankdone
+ \advance\blankskip#1\dimexpr#2\relax}
+
+\unexpanded\def\definevspacing
+ {\dodoubleempty\dodefinevspacing}
+
+\def\dodefinevspacing[#1][#2]%
+ {\ctxlua{vspacing.setmap("#1","#2")}}
+
+\unexpanded\def\vspacing
+ {\dosingleempty\dovspacing}
+
+% todo: when packed blocks blank, we need to enable forced
+
+\def\dovspacing % blank also has a \flushnotes
+ {\ifinpagebody
+ \expandafter\dovspacingyes
+ \else\ifconditional\noblankinpacked % todo: better reset this conditional in pagebody
+ \expandafter\expandafter\expandafter\dovspacingnop
+ \else
+ \expandafter\expandafter\expandafter\dovspacingyes
+ \fi\fi}
+
+\def\dovspacingyes[#1]%
+ {\ifmmode\else\ctxlua{vspacing.analyse("\iffirstargument#1\else\s!default\fi")}\fi}
+
+\def\dovspacingnop[#1]%
+ {\ifmmode\else\par\fi}
+
+% todo: check them and make them faster:
+
+\definecomplexorsimple\setupvspacing
+
+\let\currentvspacing\empty
+
+\def\complexsetupvspacing[#1]%
+ {\edef\currentvspacing{#1}}
+
+\def\simplesetupvspacing
+ {\ifx\empty\currentvspacing\else
+ \let\currentvspacing\s!default
+ \fi
+ \simplesetupwhitespace}
+
+\def\restorestandardblank
+ {\let\currentvspacing\v!standard}
+
+% used both
+
+\def\doinhibitblank{\vspacing[\v!disable]} % can be made faster
+\def\inhibitblank {\vspacing[\v!disable]} % can be made faster
+
+\let\setupblank \setupvspacing
+\let\simplesetupblank\simplesetupvspacing
+\let\blank \vspacing
+
+% category:4 is default
+
+% \definevspacingamount[\v!big] [\bigskipamount] [\openlineheight]
+% \definevspacingamount[\v!medium] [\medskipamount] [0.50\openlineheight]
+% \definevspacingamount[\v!small] [\smallskipamount] [0.25\openlineheight]
+% \definevspacingamount[\v!line] [\openlineheight] [\openlineheight]
+% \definevspacingamount[\v!halfline][0.50\openlineheight][0.50\openlineheight]
+% \definevspacingamount[\v!formula] [\medskipamount] [0.50\openlineheight]
+% \definevspacingamount[\v!white] [\parskip] [\openlineheight]
+% \definevspacingamount[\v!height] [\strutheight] [\strutheight]
+% \definevspacingamount[\v!depth] [\strutdepth] [\strutdepth]
+
+\definevspacingamount[\v!none] [\zeropoint] [\zeropoint]
+\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight]
+\definevspacingamount[\v!medium] [\medskipamount] [0.50\bodyfontlineheight]
+\definevspacingamount[\v!small] [\smallskipamount] [0.25\bodyfontlineheight]
+\definevspacingamount[\v!line] [\openlineheight] [\bodyfontlineheight]
+\definevspacingamount[\v!halfline][0.50\openlineheight][0.50\bodyfontlineheight]
+\definevspacingamount[\v!formula] [\medskipamount] [0.50\bodyfontlineheight]
+\definevspacingamount[\v!white] [\parskip] [\bodyfontwhitespace]
+\definevspacingamount[\v!height] [\strutheight] [\bodyfontstrutheight]
+\definevspacingamount[\v!depth] [\strutdepth] [\bodyfontstrutdepth]
+
+\def\bodyfontwhitespace
+ {\dimexpr
+ \ifdim\parskip=\zeropoint
+ \zeropoint
+ \else\ifgridsnapping
+ \bodyfontlineheight
+ \else
+ \parskip
+ \fi\fi
+ \relax}
+
+\definevspacing[\v!preference][penalty:-500] % goodbreak
+\definevspacing[\v!samepage] [penalty:10000] % real strong
+\definevspacing[\v!max] [category:1]
+\definevspacing[\v!force] [category:2]
+\definevspacing[\v!disable] [category:5]
+\definevspacing[\v!nowhite] [category:6]
+\definevspacing[\v!back] [category:7]
+\definevspacing[\v!always] [category:0]
+\definevspacing[\v!weak] [order:0]
+\definevspacing[\v!strong] [order:100]
+
+\definevspacing[\s!default] [\v!white] % was big for a while
+
+\dorecurse{10} % todo: other values < 4000
+ {\expanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr4000+250*\recurselevel\relax]}}
+
+% \setfalse\vspacingenabled
+%
+% \newtoks\everyenablevspacing
+% \newtoks\everydisablevspacing
+%
+% \def\enablevspacing {\the\everyenablevspacing}
+% \def\disablevspacing{\the\everydisablevspacing}
+%
+% \appendtoks
+% \writestatus\m!systems{! ! enabling vspacing ! !}%
+% \settrue\vspacingenabled
+% \ctxlua{vspacing.enable()}%
+% \to \everyenablevspacing
+%
+% \appendtoks
+% \writestatus\m!systems{! ! disabling vspacing ! !}%
+% \setfalse\vspacingenabled
+% \ctxlua{vspacing.disable()}%
+% \to \everydisablevspacing
+
+\let\blank \vspacing
+\let\defineblank \definevspacing
+\let\defineblankmethod\definevspacingamount
+
+%D The following command is for Wolfgang. It has to be used with
+%D care as it does {\em not} work in tandem with the other spacing
+%D commands.
+
+\unexpanded\def\definevspace
+ {\dotripleempty\dodefinevspace}
+
+\def\dodefinevspace[#1][#2][#3]%
+ {\ifthirdargument
+ \setvalue{\??va#1:#2}{#3}%
+ \else
+ \setvalue{\??va:#1}{#2}%
+ \fi}
+
+\unexpanded\def\vspace
+ {\dodoubleempty\dovspace}
+
+\def\dovspace[#1][#2]%
+ {\ifsecondargument
+ \dodovspace[#1][#2]%
+ \else\iffirstargument
+ \vspace[][#1]%
+ \else
+ \vspace[][\s!default]%
+ \fi\fi}
+
+\def\dodovspace[#1][#2]%
+ {\par
+ \ifvmode
+ \removelastskip
+ \vskip\vspaceamount{#1}{#2}\relax
+ \fi}
+
+\def\vspaceamount#1#2%
+ {\executeifdefined{\??va#1:#2}{\executeifdefined{\??va:#2}\zeropoint}}
+
+%D When spacing is active we need to handle commands in
+%D a special way:
+%D
+%D \starttyping
+%D \setuplines[space=on]
+%D
+%D \startlines
+%D Let's talk about this{\ttsl\gobbleoneargument or}that.
+%D \stoplines
+%D
+%D \startlines
+%D Let's talk about this{\getvalue{ttsl}or}that.
+%D \stoplines
+%D \stoptyping
+%D
+%D One can indent in several ways:
+%D
+%D \starttyping
+%D \setupindenting[medium] \setuplines[indenting=odd] % no yes odd even
+%D
+%D \startlines
+%D first
+%D second
+%D third
+%D fourth
+%D \stoplines
+%D \stoptyping
+
+% \unexpanded\def\setuplines
+% {\dodoubleargument\getparameters[\??rg]}
+%
+% \unexpanded\def\startlines
+% {\@@rgbefore
+% \pushmacro\checkindentation
+% \whitespace
+% %\page[\v!preference]} gaat mis na koppen, nieuw: later \nobreak
+% \begingroup
+% \setupindenting[\@@rgindenting]%
+% \typesettinglinestrue
+% \setupwhitespace[\v!none]%
+% \obeylines
+% \ignorespaces
+% \gdef\afterfirstobeyedline % tzt two pass, net als opsomming
+% {\gdef\afterfirstobeyedline
+% {\nobreak
+% \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}%
+% \def\obeyedline
+% {\par
+% \futurelet\next\dobetweenthelines}%
+% \activatespacehandler\@@rgspace
+% \GotoPar}
+%
+% \unexpanded\def\stoplines
+% {\endgroup
+% \popmacro\checkindentation
+% \@@rgafter}
+%
+% \def\dobetweenthelines
+% {\doifmeaningelse\next\obeyedline
+% {\@@rginbetween}
+% {\afterfirstobeyedline}}
+%
+% \setuplines
+% [\c!option=,
+% \c!before=\blank,
+% \c!after=\blank,
+% \c!inbetween=\blank,
+% \c!indenting=\v!no,
+% \c!space=\v!default]
+
+%D Contrary to \MKII\ we can now define classes of lines (generalized by
+%D Wolfgang). I will probably rewrite bits in \LUA.
+
+\let\currentlines\empty
+
+\def\linesparameter #1{\csname\dolinesparameter{\??rg\currentlines}#1\endcsname}
+\def\linesparameterhash#1{\dolinesparameterhash {\??rg\currentlines}#1}
+
+\def\dolinesparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dolinesparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dolinesparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dolinesparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dolinesparentparameter #1#2{\ifx#1\relax\s!empty\else\dolinesparameter #1#2\fi}
+\def\dolinesparentparameterhash#1#2{\ifx#1\relax \else\dolinesparameterhash#1#2\fi}
+
+\def\dosetlinesattributes#1#2% style color
+ {\edef\fontattributehash {\linesparameterhash#1}%
+ \edef\colorattributehash{\linesparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\getparameters
+ [\??rg]
+ [\c!option=,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!inbetween=\blank,
+ \c!indenting=\v!no,
+ \c!space=\v!default]
+
+\unexpanded\def\definelines
+ {\dodoubleempty\dodefinelines}
+
+\def\dodefinelines[#1][#2]%
+ {\getparameters[\??rg#1][\s!parent=\??rg,#2]%
+ \setvalue{\e!start#1}{\dostartlines[#1]}%
+ \setvalue{\e!stop #1}{\dostoplines}}
+
+\unexpanded\def\setuplines
+ {\dodoubleempty\dosetuplines}
+
+\def\dosetuplines[#1][#2]%
+ {\doifelsenothing{#2}
+ {\getparameters[\??rg][#1]}
+ {\def\docommand##1{\getparameters[\??rg##1][#2]}%
+ \processcommacommand[#1]\docommand}}
+
+\def\dostartlines[#1]%
+ {\bgroup
+ \edef\currentlines{#1}%
+ \linesparameter\c!before
+ \pushmacro\checkindentation
+ \whitespace
+ \begingroup
+ \dosetlinesattributes\c!style\c!color
+ \setupindenting[\linesparameter\c!indenting]%
+ \setupalign[\linesparameter\c!align]%
+ \typesettinglinestrue
+ \setupwhitespace[\v!none]%
+ \obeylines
+ \ignorespaces
+ \gdef\afterfirstobeyedline % tzt two pass, net als opsomming
+ {\gdef\afterfirstobeyedline
+ {\nobreak
+ \doifnot{\linesparameter\c!option}\v!packed{\global\let\afterfirstobeyedline\relax}}}%
+ \def\obeyedline
+ {\par
+ \futurelet\next\dobetweenthelines}%
+ \activatespacehandler{\linesparameter\c!space}%
+ \GotoPar}
+
+\def\dostoplines
+ {\endgroup
+ \popmacro\checkindentation
+ \linesparameter\c!after
+ \egroup}
+
+\def\dobetweenthelines
+ {\doifmeaningelse\next\obeyedline
+ {\linesparameter\c!inbetween}
+ {\afterfirstobeyedline}}
+
+\definelines[\v!lines]
+
+\def\emptylines
+ {\dosingleempty\doemptylines}
+
+\def\doemptylines[#1]%
+ {\endgraf\dorecurse{\iffirstargument#1\else3\fi}\crlf}
+
+\protect \endinput
diff --git a/tex/context/base/spec-def.mkii b/tex/context/base/spec-def.mkii
new file mode 100644
index 000000000..ad1a9bb1d
--- /dev/null
+++ b/tex/context/base/spec-def.mkii
@@ -0,0 +1,1016 @@
+%D \module
+%D [ file=spec-def,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special 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.
+
+%D This module used to be integrated in \type {spec-ini},
+%D but testing optimization is more convenient this way.
+
+\writestatus{loading}{ConTeXt Special Macros / Definitions}
+
+\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.
+%D
+%D \startlinecorrection
+%D \starttable[|l|l|l|l|l|]
+%D \HL
+%D \NC \bf file \NC
+%D \bf name \NC
+%D \bf calls \NC
+%D \bf support \NC
+%D \bf program / driver \NC\SR
+%D \HL
+%D \NC \tttf spec-tex \NC
+%D \tttf tex \NC
+%D \NC
+%D Generic \TEX\ (\DVI) \NC
+%D (default) \NC\FR
+%D \NC \tttf spec-tpd \NC
+%D \tttf \PDF \NC
+%D \NC
+%D Han The Thanh \NC
+%D (pdftex) \NC\MR
+%D \NC \tttf spec-ps \NC
+%D \tttf postscript \NC
+%D \NC
+%D Adobe PostScript \NC
+%D (default) \NC\MR
+%D \NC \tttf spec-tr \NC
+%D \tttf rokicki \NC
+%D \tttf postscript \NC
+%D Thomas Rokicki \NC
+%D (dvips) \NC\MR
+%D \NC \tttf spec-yy \NC
+%D \tttf yandy \NC
+%D \tttf postscript \NC
+%D YandY \NC
+%D (dvipsone, dviwindo) \NC\MR
+%D \NC \tttf spec-pdf \NC
+%D \tttf pdf \NC
+%D \NC
+%D Adobe PDF \NC
+%D (Acrobat) \NC\MR
+%D \NC \tttf spec-win \NC
+%D \tttf dviwindo \NC
+%D YandY \NC
+%D (dviwindo) \NC\MR
+%D \NC \tttf spec-htm \NC
+%D \tttf html \NC
+%D \NC
+%D HTML V 2.0 \NC
+%D (dvips) \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode}
+%D
+%D Switching to and from color can be done in two ways:
+%D
+%D \startitemize[packed,n]
+%D \item insert driver specific commands
+%D \item pass instructions to the output device
+%D \stopitemize
+%D
+%D The first approach is more general and lays the
+%D responsibility at the driver side. Probably due to the fact
+%D that \TEX\ does not directly support color, we have been
+%D confronted for the last few years with changing special
+%D definitions. The need for support depends on how a macro
+%D package handles colored text that crosses the page boundary.
+%D Again, there are two approaches.
+%D
+%D \startitemize[packed,n]
+%D \item let \TEX\ do the job
+%D \item let the driver handle things
+%D \stopitemize
+%D
+%D The first approach is as driver independant as possible and
+%D can easily be accomplished by using \TEX's mark mechanism.
+%D In \CONTEXT\ we follow this approach. More and more, drivers
+%D are starting to support color, including stacking them.
+%D
+%D Colors as well as grayscales can be represented in scales
+%D from~0 to~1. When drivers use values in the range 0..255,
+%D this value has to be adapted in the translation process.
+%D Technically it's possible to get a grayscale from combining
+%D colors. In the \cap{RGB} color system, a color with Red,
+%D Green and Blue components of 0.80 show the same gray as a
+%D Gray Scale specified 0.80. The \cap{CMYK} color system
+%D supports a Black component apart from Cyan, Magenta and
+%D Yellow.
+%D
+%D Depending on the target format, color support differs from
+%D gray support. PostScript for example offers different
+%D operators for setting gray and color. This is because
+%D printing something using three colors is someting else than
+%D printing with just black.
+%D
+%D In \CONTEXT\ we have implemented a color subsystem that
+%D supports the use of well defined colors that, when printed
+%D in black and white, still can be distinguished. This
+%D approach enables us to serve both printed and electronic
+%D versions, using colored text and illustrations. More on the
+%D fundamentals of this topic can be found in the \cap{MAPS} of
+%D the Dutch User Group, 14 (95.1).
+%D
+%D To satisfy all those needs, we define four specials which
+%D supply enough information for drivers to act upon. We
+%D could have used more general commands with the keywords
+%D 'rgb' and 'gray', but because these specials are used often,
+%D we prefer the more direct and shorter alternative.
+%D
+%D We start with the installation of color and grayscale
+%D specials. The values are in the range 0..1 (e.g. 0.25).
+%D
+%D \starttyping
+%D \dostartgraymode {gray} ... \dostopgraymode
+%D \dostartrgbcolormode {red} {green} {blue} ... \dostopcolormode
+%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode
+%D \dostartgraycolormode {gray} ... \dostopcolormode
+%D \stoptyping
+%D
+%D Because we can expect conflicts between drivers, we
+%D implement them as category \type{or}. In previous versions
+%D of \DVIPSONE\ the use of their color||specials did not
+%D interfere with the PostScript ones, but recent versions do.
+
+\installspecial [\dostartgraymode] [or] [1]
+\installspecial [\dostopgraymode] [or] [0]
+
+\installspecial [\dostartrgbcolormode] [or] [3]
+\installspecial [\dostartcmykcolormode] [or] [4]
+\installspecial [\dostartgraycolormode] [or] [1]
+\installspecial [\dostopcolormode] [or] [0]
+
+%D New and experimental:
+
+\installspecial [\dostartspotcolormode] [or] [2]
+
+\installspecial [\doregisterrgbspotcolor] [or] [7]
+\installspecial [\doregistercmykspotcolor] [or] [8]
+\installspecial [\doregistergrayspotcolor] [or] [5]
+
+\installspecial [\doregisterrgbindexcolor] [or] [7]
+\installspecial [\doregistercmykindexcolor] [or] [8]
+\installspecial [\doregistergrayindexcolor] [or] [5]
+
+\installspecial [\doregisterspotcolorname] [or] [2]
+
+\installspecial [\dostartnonecolormode] [or] [0]
+\installspecial [\doregisternonecolor] [or] [0]
+
+%D For some drivers, the stop special is of no use and can
+%D simply call the start one with zero arguments.
+
+%D \macros
+%D {dogetfiguresize,doinsertfile,doinsertMPfile}
+%D
+%D Probably the most problematic special is the following
+%D one. Because we want to be able to support different
+%D schemes, we pass a lot of data to it.
+%D
+%D The support of inserting files (like illustrations) comes in
+%D many flavors. Some drivers use scales, some take dimensions.
+%D Some need offsets and others act on stored characteristics.
+%D They need one thing in common: a filename. Although separate
+%D specials for different formats sometimes are more clear, we
+%D decided to combine them all in one:
+%D
+%D \starttyping
+%D \doinsertfile {type,method} {file,label}
+%D {xscale} {yscale} {x} {y} {w} {h}
+%D {options}
+%D \stoptyping
+%D
+%D The scale is given percents, the other values are base
+%D points.
+%D
+%D Per 2006 we have simplified this model. The amount of drivers
+%D is not growing and all support scaling. We pass variables via
+%D Driver specific macros.
+%D
+%D \starttyping
+%D \doinsertfile
+%D \stoptyping
+%D
+%D The special is implemented as \type{or}. Because \DVIPSONE\
+%D understands them all, a chain of alternatives would generate
+%D multiple occurrences of the same illustration.
+%D
+%D When option 1 is passed, the viewers is asked to present a
+%D preview, like the first frame of a movie.
+
+\installspecial [\dogetfiguresize][or] [0] % now a special
+\installspecial [\doinsertfile] [or] [0] % [9]
+\installspecial [\doinsertMPfile] [or] [1] % speed up
+
+%D No start||stop construction is needed here, because there in
+%D no further interference of \TEX. All dimensions are output
+%D in points and scales as a number, where 100 equal 100\%. (We
+%D used to pass scaled points).
+
+%D \macros
+%D {doinsertsoundtrack}
+%D
+%D Sounds are (for the moment) just files with
+%D associated options.
+%D
+%D \starttyping
+%D \doinsertsoundtrack {file} {label} {options}
+%D \stoptyping
+
+\installspecial [\doinsertsoundtrack] [or] [3]
+
+%D \macros
+%D {dogetnofinsertpages}
+%D
+%D Some file formats support more than one page, like \PDF,
+%D and for special applications, one may want to have access
+%D to the total number of pages.
+%D
+%D \starttyping
+%D \dogetnofinsertpages{filename}
+%D \stoptyping
+%D
+%D The number is also available after the insert is placed,
+%D since inclusion may take place immediate when an insert is
+%D called upon.
+
+\def\nofinsertpages{1} % one of the few 'talk backs'
+
+\installspecial [\dogetnofinsertpages] [or] [1]
+
+%D \macros
+%D {dostartrotation,
+%D dostoprotation}
+%D
+%D We support rotation with the special:
+%D
+%D \starttyping
+%D \dostartrotation {angle} ... \dostoprotation
+%D \stoptyping
+%D
+%D For the moment these specials are installed as
+%D category \type{or}.
+
+\installspecial [\dostartrotation] [or] [1]
+\installspecial [\dostoprotation] [or] [0]
+
+%D \macros
+%D {dostartscaling,
+%D dostopscaling}
+%D
+%D Scaling is also supported:
+%D
+%D \starttyping
+%D \dostartscaling {x} {y} ... \dostopscaling
+%D \stoptyping
+%D
+%D Like the previous one, these specials are of category
+%D \type{or}.
+
+\installspecial [\dostartscaling] [or] [2]
+\installspecial [\dostopscaling] [or] [0]
+
+%D \macros
+%D {dostartmirroring,
+%D dostopmirroring}
+%D
+%D And indeed, mirroring is there too:
+%D
+%D \starttyping
+%D \dostartmirroring {x} {y} ... \dostopmirroring
+%D \stoptyping
+%D
+%D Again these specials are installed as category \type{or}.
+
+\installspecial [\dostartmirroring] [or] [0]
+\installspecial [\dostopmirroring] [or] [0]
+
+%D \macros
+%D {dostartnegative,
+%D dostopnegative}
+%D
+%D When producing output for an image setter, negating the
+%D page comes into view. Here are the tools:
+
+\installspecial [\dostartnegative] [or] [0]
+\installspecial [\dostopnegative] [or] [0]
+
+%D \macros
+%D {dostartoverprint,
+%D dostopoverprint}
+%D
+%D Rudimentary overprint (knockout) control is implemented
+%D using:
+
+\installspecial [\dostartoverprint] [or] [0]
+\installspecial [\dostopoverprint] [or] [0]
+
+%D The following two specials are used in for instance \type
+%D {\vadjust}'d margin material inside colored paragraphs.
+
+\installspecial [\dostartgraphicgroup] [or] [0]
+\installspecial [\dostopgraphicgroup ] [or] [0]
+
+%D \macros
+%D {doselectfirstpaperbin,
+%D doselectsecondpaperbin}
+%D
+%D Here are some very printer||specific ones. No further
+%D comment.
+
+\installspecial [\doselectfirstpaperbin] [or] [0]
+\installspecial [\doselectsecondpaperbin] [or] [0]
+
+%D \macros
+%D {doovalbox}
+%D
+%D When we look at the implementation, this is a complicated
+%D one. There are seven arguments.
+%D
+%D \starttyping
+%D \doovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill} {variant}
+%D \stoptyping
+%D
+%D This command has to return a \type{\vbox} which can be used
+%D to lay over another one (with text). The radius is in
+%D degrees, the stroke and fill are~\type{1} (true) of~\type{0}
+%D (false).
+
+\installspecial [\doovalbox] [or] [8]
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D Clipping is implemented in such a way that an arbitrary
+%D can be fed.
+%D
+%D \starttyping
+%D \dostartclipping {pathname}{width} {height}
+%D \dostopclipping
+%D \stoptyping
+%D
+%D
+
+\installspecial [\dostartclipping] [or] [3]
+\installspecial [\dostopclipping] [or] [0]
+
+%D \macros
+%D {dosetupidentity}
+%D
+%D We can declare some characteristics of the document with
+%D
+%D \starttyping
+%D \dosetupidentity {title} {subject} {author} {creator} {date} {keys}
+%D \stoptyping
+%D
+%D All data is in string format.
+
+\installspecial [\dosetupidentity] [and] [6]
+
+%D \macros
+%D {dosetuppaper}
+%D
+%D This special can be used to tell the driver what page size
+%D to use. The special takes three arguments.
+%D
+%D \starttyping
+%D \dosetuppaper {type} {width} {height}
+%D \stoptyping
+%D
+%D The type is one of the common identifiers, like A4, A5 or
+%D B2.
+
+\installspecial [\dosetuppaper] [and] [3]
+
+%D \macros
+%D {dosetupprinter}
+%D
+%D Some drivers enable the user to specify the paper type
+%D used and/or page dimensions to be taken into account.
+%D
+%D \starttyping
+%D \dosetupprinter {type} {hoffset} {voffset} {width} {height}
+%D \stoptyping
+%D
+%D The first argument is one of \type{letter}, \type{legal},
+%D \type{A4}, \type{A5} etc. The dimensions are in
+%D basepoints.
+
+\installspecial [\dosetupprinter] [and] [5]
+
+%D \macros
+%D {dosetupopenaction, dosetupclosaction,
+%D dosetupopenpageaction, dosetupclospageaction,
+%D dosetupinteraction,
+%D dosetupscreen,
+%D dosetupviewmode}
+%D
+%D Here come some obscure interactive commands. Probably the
+%D specs will change with the development of the macros that
+%D use them.
+%D
+%D The first ones can be used to set up the interaction.
+%D
+%D \starttyping
+%D \dosetupinteraction
+%D \stoptyping
+%D
+%D Normally this command does nothing but giving a message
+%D that some scheme is supported.
+%D
+%D \starttyping
+%D \dosetupstartaction
+%D \dosetupstopaction
+%D \stoptyping
+%D
+%D These two setup the actions to be executed when the document
+%D is opened and closed.
+%D
+%D The next commands sets up the page and screen. They are
+%D kind of related.
+%D
+%D \starttyping
+%D \dosetuppage {hoffset} {voffset} {width} {height} {options}
+%D \dosetupscreen {hoffset} {voffset} {width} {height} {options}
+%D \stoptyping
+%D
+%D The first four arguments are in points. Option~1 results in a
+%D full screen launch.
+%D
+%D \starttyping
+%D \dosetuppageview {keyword}
+%D \stoptyping
+%D
+%D For the moment we only support \type{fit}.
+
+\installspecial [\dosetupinteraction] [and] [0]
+
+\installspecial [\dosetupopenaction] [and] [0]
+\installspecial [\dosetupscreen] [and] [5]
+\installspecial [\dosetuppageview] [and] [1]
+
+\installspecial [\dosetupcloseaction] [and] [0]
+\installspecial [\dosetupopenpageaction] [and] [0]
+\installspecial [\dosetupclosepageaction] [and] [0]
+\installspecial [\dosetuprenderingopenpageaction] [and] [0]
+\installspecial [\dosetuprenderingclosepageaction] [and] [0]
+
+% new, yet undocumented, replaces \dosetupscreen
+
+\installspecial [\dosetupcropbox] [and] [4]
+\installspecial [\dosetuptrimbox] [and] [4]
+\installspecial [\dosetupartbox] [and] [4]
+\installspecial [\dosetupbleedbox] [and] [4]
+
+%D \macros
+%D {dostarthide,
+%D dostophide}
+%D
+%D Not every part of the screen is suitable for paper. Menus
+%D for instance have no meaning on an non||interactive medium.
+%D These elements are hidden by means of:
+%D
+%D \starttyping
+%D \dostarthide
+%D \dostophide
+%D \stoptyping
+
+\installspecial [\dostarthide] [or] [0]
+\installspecial [\dostophide] [or] [0]
+
+%D \macros
+%D {dostartgotolocation, dostopgotolocation,
+%D dostartgotorealpage, dostopgotorealpage}
+%D
+%D When we want to support hypertext buttons, again we have
+%D to deal with two concepts.
+%D
+%D \startitemize[packed,n]
+%D \item let \TEX\ highlight the text
+%D \item let the driver show us where to click
+%D \stopitemize
+%D
+%D The first approach is the most secure one. It gives us
+%D complete control over the visual appearance of hyper
+%D buttons. The second alternative lets the driver guess what
+%D part of the text needs highlighting. As long as we deal with
+%D not too complicated textual buttons, this is no problem.
+%D It's even a bit more efficient when we take long mid
+%D paragraph active regions into account. When we let \TEX\
+%D handle active sentences {\em for instance marked like this
+%D one}, we have to take care of line- and pagebreaks ourselve.
+%D However, it's no trivial matter to let a driver find out
+%D where things begin and end. Because most hyperlinks can be
+%D found in tables of contents and registers, the saving in
+%D terms of bytes can be neglected and the first approach is a
+%D clear winner.
+%D
+%D The most convenient way of cross||referencing is using named
+%D destinations. A more simple scheme is using page numbers as
+%D destinations. Because the latter alternative can often be
+%D implemented more efficient, and because we cannot be sure
+%D what scheme a driver supports, we always have to supply a
+%D pagenumber, even when we use named destinations.
+%D
+%D To enable a driver to find out what to make active, we have
+%D to provide begin and endpoints, so like with color, we use
+%D pairs of specials. The first scheme can be satisfied with
+%D proper dimensions of the areas to be made active.
+%D
+%D The interactive real work is done by the following four
+%D specials. The reason for providing the first one with both
+%D a label and a number, is a result of the quite poor
+%D implementation of \type{pdfmarks} in version 1.0 of
+%D Acrobat. Because only pagenumbers were supported as
+%D destination, we had to provide both labels (\DVIWINDO) and
+%D pagenumbers (\PDF). Some drivers use start stop pairs.
+%D
+%D \starttyping
+%D \dostartgotolocation {w} {h} {url} {file} {label} {page}
+%D \dostartgotorealpage {w} {h} {url} {file} {page}
+%D \stoptyping
+%D
+%D Their counterparts are:
+%D
+%D \starttyping
+%D \dostopgotolocation
+%D \dostopgotorealpage
+%D \stoptyping
+%D
+%D The internal alternative is used for system||generated
+%D links, the external one for user||generated links. The
+%D Uniform Resource Locator can be used to let the reader
+%D surf the net.
+
+\installspecial [\dostartgotolocation] [and] [6]
+\installspecial [\dostopgotolocation] [and] [0]
+\installspecial [\dostartgotorealpage] [and] [5]
+\installspecial [\dostopgotorealpage] [and] [0]
+
+%D One may wonder why jumps to page and location are not
+%D combined. By splitting them, we enable macro||packages to
+%D force the prefered alternative, while on the other hand
+%D drivers can pick up the alternative desired most.
+
+%D \macros
+%D {dostartgotoJS, doflushJSpreamble}
+%D
+%D Rather special is the option to include and execute
+%D JavaScript code. This is a typical \PDF\ option.
+%D
+%D \starttyping
+%D \dostartgotoJS {w} {h} {script}
+%D \stoptyping
+%D
+%D This not so standard \TEX\ feature should be used with
+%D care. Preamble scripts are flushed by
+%D
+%D \doflushJSpreamble {script}
+
+\installspecial [\dostartgotoJS] [and] [3]
+\installspecial [\dostopgotoJS] [and] [0]
+\installspecial [\doflushJSpreamble][and] [1]
+
+%D \macros
+%D {dostartthisislocation, dostopthisislocation,
+%D dostartthisisrealpage, dostopthisisrealpage}
+%D
+%D Before we can goto some location or page, we have to tell
+%D the system where it can be found. Because some drivers
+%D follow the \SGML\ approach of begin||end tags, we have to
+%D support pairs. A possible extension to this scheme is
+%D supplying coordinates for viewing the text.
+%D
+%D The opposite commands of \type{\dogotosomething} have only
+%D one argument:
+%D
+%D \starttyping
+%D \dostartthisislocation {label}
+%D \dostartthisisrealpage {page}
+%D \stoptyping
+%D
+%D These commands are accompanied by:
+%D
+%D \starttyping
+%D \dostopthisislocation
+%D \dostopthisisrealpage
+%D \stoptyping
+%D
+%D As with all interactive commands's they are installed as
+%D \type{and} category specials.
+
+\installspecial [\dostartthisislocation] [and] [1]
+\installspecial [\dostopthisislocation] [and] [0]
+\installspecial [\dostartthisisrealpage] [and] [1]
+\installspecial [\dostopthisisrealpage] [and] [0]
+
+%D In \CONTEXT\ we don't use the \type{\stopsomething}
+%D macros because we let \TEX\ take care of typographic
+%D issues.
+
+%D \macros
+%D {doresetgotowhereever}
+%D
+%D These and others need:
+
+\installspecial [\doresetgotowhereever] [and] [0]
+
+%D \macros
+%D {dostartexecutecommand, dostopexecutecommand}
+%D
+%D The actual behavior of the next pair of commands depends
+%D much on the viewing engine. Therefore one cannot depend
+%D too much on their support.
+%D
+%D \starttyping
+%D \dostartexecutecommand {w} {h} {command} {options}
+%D \stoptyping
+%D
+%D At least the next commands are supported (more examples
+%D can be found in \type {spec-fdf.tex}:
+%D
+%D \startlinecorrection\setupalign[middle]\leavevmode
+%D \starttable[|l|l|]
+%D \HL
+%D \NC \bf command \NC \bf action \NC\SR
+%D \HL
+%D \NC first \NC go to the first page \NC\FR
+%D \NC previous \NC go to the previous page \NC\MR
+%D \NC next \NC go to the next page \NC\MR
+%D \NC last \NC go to the last page \NC\MR
+%D \NC backward \NC go back to the link list \NC\MR
+%D \NC forward \NC go forward in the link list \NC\MR
+%D \NC print \NC enter print mode \NC\MR
+%D \NC exit \NC exit viewer \NC\MR
+%D \NC close \NC close document \NC\MR
+%D \NC enter \NC enter viewer \NC\MR
+%D \NC help \NC show help on the viewer \NC\LR
+%D \HL
+%D \stoptable
+%D \stoplinecorrection
+%D
+%D Options are to be passed as a comma separated list of
+%D assignments.
+
+\installspecial [\dostartexecutecommand] [and] [4]
+\installspecial [\dostopexecutecommand] [and] [0]
+
+%D \macros
+%D {dostartobject,
+%D dostopobject,
+%D doresetobjects,
+%D doinsertobject}
+%D
+%D Reuse of object can reduce the output filesize
+%D considerably. Reusable objects are implemented with:
+%D
+%D \starttyping
+%D \dostartobject{class}{name}{width}{height}{depth}
+%D some typeset material
+%D \dostopobject
+%D \stoptyping
+%D
+%D \starttyping
+%D \doinsertobject{class}{name}
+%D \stoptyping
+%D
+%D The savings can be huge in interactive texts. The next macro needs
+%D to be called after a graphic is inserted (in order to clean up
+%D global references).
+%D
+%D \starttyping
+%D \doresetobjects
+%D \stoptyping
+
+\installspecial [\dostartobject] [or] [5]
+\installspecial [\dostopobject] [or] [0]
+\installspecial [\doinsertobject] [or] [2]
+\installspecial [\doresetobjects] [or] [0]
+
+%D \macros
+%D {doregisterfigure, doregisterfigurecolor}
+%D
+%D Images can be objects as well and it's up to the driver to
+%D handle this. Alternative images are also up to the driver,
+%D and the next macro tells the driver that the previous image
+%D is somehow followed by another and that both have to be
+%D handled together. This is a rather fuzzy model, but for the
+%D moment it suits its purpose: low res screen versions combined
+%D with high res printable ones.
+
+\installspecial [\doregisterfigure] [or] [2]
+\installspecial [\doregisterfigurecolor][or] [1]
+
+% %D \macros
+% %D {dogetobjectreference}
+% %D
+% %D For very special purposes, one can ask for the internal
+% %D reference to the object. Beware!
+%
+% \installspecial [\dogetobjectreference] [or] [3]
+%
+% %D The first argument is the name, the second a macro that
+% %D gets the associated value.
+
+%D \macros
+%D {dostartrunprogram, dostoprunprogram,
+%D dostartgotoprofile, dostopgotoprofile,
+%D dobeginofprofile,
+%D doendofprofile}
+%D
+%D These specials are still experimental. They are not yet
+%D supported by the programs the way they should be.
+%D
+%D {\em --- still undocumented ---}
+
+\installspecial [\dostartrunprogram] [and] [4]
+\installspecial [\dostoprunprogram] [and] [0]
+\installspecial [\dostartgotoprofile] [and] [3]
+\installspecial [\dostopgotoprofile] [and] [0]
+\installspecial [\dobeginofprofile] [and] [4]
+\installspecial [\doendofprofile] [and] [0]
+
+%D \macros
+%D {doinsertbookmark}
+%D
+%D Bookmarks, that is viewer generated tables of contents, are
+%D a strange phenomena, mainly because \TEX\ can provide
+%D whatever kind of table in much better quality.
+
+\installspecial [\doinsertbookmark] [and] [5]
+
+%D This special is called as:
+%D
+%D \starttyping
+%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open}
+%D \stoptyping
+%D
+%D This definition is very \PDF\ oriented, so for more
+%D information we kindly refer to the \PDF\ manuals.
+
+%D \macros
+%D {dosetpagetransition}
+%D
+%D In presentations, fancy page transitions can, at least for a
+%D short moment, let the audience focus at the screen. Like the
+%D previous one, this special is very \PDF.
+%D
+%D \starttyping
+%D \dosetpagetransition{dissolve}{0}
+%D \stoptyping
+%D
+%D Transitions have symbolic names, like dissolve, box, split,
+%D blinds, wipe and glitter. The second argument determines
+%D the wait time (unless zero).
+
+\installspecial [\dosetpagetransition] [or] [2]
+
+%D \macros
+%D {dopresettextfield,dopresetlinefield,
+%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
+%D dopresetbuttonfield,dopresetcheckfield,
+%D dopresetradiofield,dopresetradiorecord}
+%D
+%D The special drivers are programmed independant from their
+%D calling macros are thereby use the standard \TEX\ way of
+%D passing parameters. Unfortunately fields often have more
+%D than nine characteristics, so we pack some arguments in one.
+%D
+%D \starttyping
+%D \dopresettextfield / \dopresetlinefield
+%D {name} {width} {height} {default} {length}
+%D {style,color} {options} {alignment} {actions}
+%D
+%D \dopresetchoicefield / \dopresetpopupfield / \dopresetcombofield
+%D {name} {width} {height} {default}
+%D {style,color} {options} {values} {actions}
+%D
+%D \dopresetpushfield
+%D {name} {width} {height} {default}
+%D {options} {values} {actions}
+%D
+%D \dopresetcheckfield
+%D {name} {width} {height} {default}
+%D {options} {values} {actions}
+%D
+%D \dopresetradiofield
+%D {name} {width} {height} {default}
+%D {options} {parent} {values} {actions}
+%D
+%D \dopresetradiorecord
+%D {name} {top} {options} {kids} {actions}
+%D \stoptyping
+
+\installspecial [\dopresetlinefield] [or] [9]
+\installspecial [\dopresettextfield] [or] [9]
+\installspecial [\dopresetchoicefield] [or] [8]
+\installspecial [\dopresetpopupfield] [or] [8]
+\installspecial [\dopresetcombofield] [or] [8]
+\installspecial [\dopresetpushfield] [or] [7]
+\installspecial [\dopresetcheckfield] [or] [7]
+\installspecial [\dopresetradiofield] [or] [8]
+\installspecial [\dopresetradiorecord] [or] [5]
+
+%D \macros
+%D {dodefinefieldset,dogetfieldset,doiffieldset}
+%D
+%D Field sets, used in resetting and submitting, are handled
+%D by:
+
+\installspecial [\dodefinefieldset] [or] [2]
+\installspecial [\dogetfieldset] [or] [1]
+\installspecial [\doiffieldset] [or] [2]
+
+%D \macros
+%D {dosetfieldstatus}
+%D
+%D For practical reasons we set some field characteristics
+%D using:
+%D
+%D \starttyping
+%D \dosetfieldstatus {mode} {parent} {kids} {root}
+%D \stoptyping
+
+\installspecial [\dosetfieldstatus] [or] [4]
+
+%D with:
+
+\def\fieldlonermode {0} % no \chardef here
+\def\fieldparentmode{1} % no \chardef here
+\def\fieldchildmode {2} % no \chardef here
+\def\fieldcopymode {3} % no \chardef here
+
+%D \macros
+%D {doregistercalculationset}
+%D
+%D We can define a calculation order list with:
+%D
+%D \starttyping
+%D \doregistercalculationset {set identifier}
+%D \stoptyping
+
+\installspecial [\doregistercalculationset] [or] [1]
+
+%D \macros
+%D {doinsertcomment, doflushcomments}
+%D
+%D Not so much out of need, but to be complete, we also
+%D implement text annotations, so called comment:
+%D
+%D \starttyping
+%D \doinsertcomment
+%D {title} {width} {height} {color} {open} {symbol} {collect} {data}
+%D \stoptyping
+%D
+%D When enables, comments can be collected and flushed:
+%D
+%D \starttyping
+%D \doflushcomments
+%D \stoptyping
+
+\installspecial[\doinsertcomment] [and] [8]
+\installspecial[\doflushcomments] [and] [0]
+
+%D \macros
+%D {dosetposition, dosetpositionwhd, dosetpositionplus,
+%D dosetpositionpapersize}
+%D
+%D Not natural to \TEX, but available in \PDFTEX, and by
+%D means of postprocessed \DVI, we can save and call upon
+%D positions.
+%D
+%D \starttyping
+%D \dosetposition {identifier}
+%D \dosetpositionwhd {identifier} {width} {height} {depth}
+%D \dosetpositionplus {identifier} {width} {height} {depth} {list}
+%D \dosetpositionpapersize {width} {height}
+%D \stoptyping
+%D
+%D This is one of the few specials where when using \PDFTEX\
+%D the driver directly deals with the utility file.
+
+%D Support is moved to spec-mis.tex. The whole idea originates
+%D and was implemented first in \PDFTEX. Later \DVIPDFMX\
+%D supported the \CONTEXT\ specific specials and nowadays
+%D \PDFTEX\ supports this feature in \DVI\ mode and \XETEX\
+%D implements it as well. This means that only \ALEPH\ is
+%D still dependent on specials, but that variant of \TEX\ has
+%D become obsolete anyway.
+
+% \installspecial [\dosetposition] [or] [1]
+% \installspecial [\dosetpositionwhd] [or] [4]
+% \installspecial [\dosetpositionplus] [or] [5]
+
+% \installspecial [\dosetpositionpapersize] [or] [2]
+
+%D \macros
+%D {dostarttransparency,dostoptransparency}
+%D
+%D \starttyping
+%D \dostarttransparency{fraction}{type}
+%D \dostoptransparency
+%D \stoptyping
+%D
+%D Although in \CONTEXT\ transparency is closely integrated
+%D in the color drivers, in the end it is an independent
+%D feature.
+
+\installspecial [\dostarttransparency] [or] [2]
+\installspecial [\dostoptransparency] [or] [0]
+
+%D \macros
+%D {doattachfile}
+%D
+%D \starttyping
+%D \doattachfile{title}{width}{height}{depth}{color}{symbol}{filename}{source}
+%D \stoptyping
+
+\installspecial [\doattachfile] [or] [8]
+
+%D Experimental (properties):
+
+\installspecial[\dostartviewerlayer] [or] [1]
+\installspecial[\dostopviewerlayer] [or] [0]
+\installspecial[\dodefineviewerlayer] [or] [5]
+%installspecial[\doflushviewertextlayers] [or] [0]
+%installspecial[\doflushviewerpagelayers] [or] [0]
+\installspecial[\domakeviewerlayerlist] [or] [1]
+
+\installspecial[\doinsertrenderingwindow] [or] [4]
+\installspecial[\doinsertrendering] [or] [4]
+\installspecial[\doinsertrenderingobject] [or] [4]
+\installspecial[\doinsertrenderingobject] [or] [4]
+
+\installspecial[\dostartfonteffect] [or] [3]
+\installspecial[\dostopfonteffect] [or] [0]
+
+%D From now on, mapfile loading is also a special; we assume the
+%D more or less standard dvips syntax.
+
+\installspecial[\doresetmapfilelist] [and] [0]
+\installspecial[\doloadmapfile] [and] [2] % + - = | filename
+\installspecial[\doloadmapline] [and] [2] % + - = | fileline
+
+%D We define a couple of backends:
+
+\defineoutput [dvipsone] [dvi,ps,yy]
+\defineoutput [dviwindo] [dvi,ps,yy,win]
+\defineoutput [dvips] [dvi,ps,tr]
+\defineoutput [dviview] [dvi,ps,tr,dv]
+\defineoutput [pdftex] [tpd]
+\defineoutput [pdf] [tpd]
+\defineoutput [dvipdfm] [dpm]
+\defineoutput [dpm] [dpm]
+\defineoutput [dvipdfmx] [dpx]
+\defineoutput [dpx] [dpx]
+\defineoutput [acrobat] [pdf,ps,tr]
+
+\defineoutput [xetex] [dpx,xet]
+\defineoutput [xtx] [dpx,xet]
+\defineoutput [xdv] [dvi,xtx,xet]
+\defineoutput [xdv2pdf] [dvi,xtx,xet]
+
+%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:
+%D
+%D \starttyping
+%D \setupoutput [dvipsone,acrobat]
+%D \setupoutput [dviwindo,acrobat]
+%D \stoptyping
+%D
+%D Although, better is:
+%D
+%D \starttyping
+%D \setupoutput [pdftex]
+%D \stoptyping
+
+%D Please let me know if we need more. From now on we default
+%D to:
+
+\appendtoks
+ \setupoutput[dvips]%
+\to \everydump
+
+\protect \endinput
diff --git a/tex/context/base/spec-dpm.mkii b/tex/context/base/spec-dpm.mkii
new file mode 100644
index 000000000..efecd7928
--- /dev/null
+++ b/tex/context/base/spec-dpm.mkii
@@ -0,0 +1,446 @@
+%D \module
+%D [ file=spec-dpm,
+%D version=1998.11.24,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=DVIPDFM 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.
+
+\unprotect
+
+%D This driver is build on top of the general \PDF\ macros,
+%D as defined in \type{spec-fdf}, so we inherit that one. Remark:
+%D this driver is no longer actively maintained, use the dpx one
+%D instead!
+
+\startspecials[dpm][reset,fdf]
+
+%D \macros
+%D {jobsuffix}
+%D
+%D Because no intermediate output format is used, we set the
+%D jobsuffix to \PDF.
+
+\setjobsuffix{pdf}
+
+%D Literal \PDF\ inclusion is implemented as:
+
+\def\PDFcode #1{\special{pdf: content #1}}
+\def\PDFcontentcode#1{\special{pdf: content #1}}
+\def\PDFdirectcode #1{\special{pdf: literal #1}}
+
+%D \macros
+%D {dosetuppaper}
+%D
+%D A simple one.
+
+\def\doDPMsetuppaper#1#2#3%
+ {\bgroup
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \special{pdf: pagesize width \width height \height}%
+ \global\let\doDPMsetuppaper\gobblethreearguments
+ \egroup}
+
+\definespecial\dosetuppaper#1#2#3%
+ {\doDPMsetuppaper{#1}{#2}{#3}}
+
+%D \macros
+%D {doinsertfile}
+%D
+%D Only \METAPOST, \JPG\ and \PDF\ inclusion are supported.
+
+\definespecial\doinsertfile
+ {\dofileinsertion{dpm}\@@DriverImageType}
+
+\definefileinsertion{dpm}{mps}%
+ {\PointsToWholeBigPoints\@@DriverImageWidth \width
+ \PointsToWholeBigPoints\@@DriverImageHeight\height
+ \special
+ {PSfile="\@@DriverImageFile"\space
+ llx=\EPSllx\space lly=\EPSlly\space
+ urx=\EPSurx\space ury=\EPSury\space
+ rwi=\width0\space rhi=\height0}}
+
+\definefileinsertion{dpm}{pdf}%
+ {\special{pdf: epdf
+ width \@@DriverImageWidth \space
+ height \@@DriverImageHeight\space
+ (\@@DriverImageFile)}}
+
+\definefileinsertion{dpm}{jpg}%
+ {\special{pdf: image
+ width \@@DriverImageWidth \space
+ height \@@DriverImageHeight\space
+ (\@@DriverImageFile)}}
+
+\definefileinsertion{dpm}{mov}{\doPDFinsertmov}
+\definefileinsertion{dpm}{avi}{\doPDFinsertmov}
+
+%D \macros
+%D {doinsertsoundtrack}
+%D
+%D Sounds are supported too.
+
+\definespecial\doinsertsoundtrack{\doPDFinsertsoundtrack}
+
+%D \macros
+%D {doovalbox}
+
+\definespecial\doovalbox{\doPDFovalbox}
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,
+%D dostopcolormode,
+%D dostartrotation,dostoprotation,
+%D dostartscaling,dostopscaling,
+%D dostartmirroring,dostopmirroring,
+%D dostartnegative,dostopnegative}
+%D
+%D Unfortunately the direct \PDF\ inclusion is not suited
+%D for the next macros, which means that we cannot use the
+%D \type {\doPDF..} alternatives. Since \CONTEXT\ maintains
+%D its own colorstack, we use the \DVIPS\ alternatives.
+
+\definespecial\dostartgraymode #1{\special{color gray #1}}
+\definespecial\dostopgraymode {\special{color gray 0}}
+\definespecial\dostartrgbcolormode #1#2#3{\special{color rgb #1 #2 #3}}
+\definespecial\dostartcmykcolormode#1#2#3#4{\special{color cmyk #1 #2 #3 #4}}
+\definespecial\dostartgraycolormode #1{\special{color gray #1}}
+\definespecial\dostopcolormode {\special{color gray 0}}
+\definespecial\dostartrotation #1{\special{pdf: bt rotate #1}}
+\definespecial\dostoprotation {\special{pdf: et}}
+\definespecial\dostartscaling #1#2{\special{pdf: bt xscale #1 yscale #2}}
+\definespecial\dostopscaling {\special{pdf: et}}
+\definespecial\dostartmirroring {\special{pdf: bt xscale -1}} % ?
+\definespecial\dostopmirroring {\special{pdf: et}}
+
+%D Negation is not (yet) supported:
+
+% \definespecial\dostartnegative {}
+% \definespecial\dostopnegative {}
+% \definespecial\dostarttransparency {}
+% \definespecial\dostoptransparency {}
+
+
+%D \macros
+%D {dosetupinteraction,
+%D dosetupopenaction,dosetupcloseaction}
+
+\definespecial\dosetupinteraction%
+ {\showmessage\m!interactions{21}{DVIPDFM}}
+
+\definespecial\dosetupopenaction {\doPDFsetupopenaction}
+\definespecial\dosetupcloseaction{\doPDFsetupcloseaction}
+
+%D \macros
+%D {doresetgotowhereever,
+%D dostartthisisrealpage,dostartthisislocation,
+%D dostartgotorealpage,dostartgotolocation,dostartgotoJS}
+
+\definespecial\doresetgotowhereever {\doPDFresetgotowhereever}
+\definespecial\dostartthisislocation{\doPDFstartthisislocation}
+
+\definespecial\dostartgotolocation{\doPDFstartgotolocation}
+\definespecial\dostartgotorealpage{\doPDFstartgotorealpage}
+\definespecial\dostartgotoJS {\doPDFstartgotoJS}
+
+%D \macros
+%D {doflushJSpreamble}
+
+\definespecial\doflushJSpreamble#1%
+ {\bgroup
+ \let\compositeJScode=\empty
+ \def\docommand##1%
+ {\edef\sanitizedJScode{\getJSpreamble{##1}}%
+ \@EA\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode
+ \special{pdf: object @JS:#1 <</S /JavaScript /JS (\sanitizedJScode)>>}%
+ \edef\compositeJScode{\compositeJScode\space (##1) @JS:#1}}%
+ \processcommalist[#1]\docommand
+ \special{pdf: object @JS:JS <</Names [\compositeJScode]>>}%
+ \special{pdf: put @names <</JavaScript @JS:JS>>}%
+ \egroup}
+
+%D \macros
+%D {dostarthide,dostophide}
+
+\definespecial\dostarthide{}
+\definespecial\dostophide {}
+
+%D \macros
+%D {dosetupscreen}
+
+\definespecial\dosetupscreen {\doPDFsetupscreen \printpaperheight}
+
+\definespecial\dosetupartbox {\doPDFsetupartbox \printpaperheight}
+\definespecial\dosetupcropbox {\doPDFsetupcropbox \printpaperheight}
+\definespecial\dosetupbleedbox{\doPDFsetupbleedbox\printpaperheight}
+\definespecial\dosetuptrimbox {\doPDFsetuptrimbox \printpaperheight}
+
+%D \macros
+%D {dostartexecutecommand}
+
+\definespecial\dostartexecutecommand{\doPDFstartexecutecommand}
+
+%D \macros
+%D {dosetupidentity}
+
+\definespecial\dosetupidentity{\doPDFsetupidentity}
+
+%D \macros
+%D {dostartrunprogam}
+
+\definespecial\dostartrunprogram{\doPDFstartrunprogram}
+
+%D \macros
+%D {dostartgotoprofile, dostopgotoprofile,
+%D dobeginofprofile, doendofprofile}
+
+\definespecial\dostartgotoprofile{\doPDFstartgotoprofile}
+
+\definespecial\dobeginofprofile#1#2#3#4%
+ {\bgroup
+ \setPDFdestination{#1}%
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \doifsomething{\PDFdestination}
+ {\special
+ {pdf: thread @ART::\PDFdestination\space
+ width \width height \height
+ <</Title (\PDFdestination)>>}}%
+ \egroup}
+
+\definespecial\doendofprofile%
+ {}
+
+%D \macros
+%D {doinsertbookmark}
+
+\definespecial\doinsertbookmark{\doPDFinsertbookmark}
+
+%D \macros
+%D {dostartobject,dostopobject,doinsertobject}
+
+% \definespecial\dostartobject#1#2#3#4#5%
+% {\bgroup
+% \setbox\nextbox=\hbox\bgroup
+% \dosetobjectreference{#1}{#2}{#1::#2}%
+% \scratchdimen#3\edef\width {\the\scratchdimen\space}%
+% \scratchdimen#4\edef\height{\the\scratchdimen\space}%
+% \special{pdf: bxobj @#1::#2 width \width height \height}}
+
+% \definespecial\dostopobject%
+% {\special{pdf: exobj}%
+% \egroup
+% \smashbox\nextbox
+% \flushatshipout{\box\nextbox}%
+% \egroup}
+
+\definespecial\dostartobject#1#2#3#4#5%
+ {\bgroup
+ \dowithnextbox
+ {\dosetobjectreference{#1}{#2}{#1::#2}%
+ \scratchdimen#3\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#4\edef\height{\the\scratchdimen\space}%
+ \setbox\nextbox\vbox
+ {\special{pdf: bxobj @#1::#2 width \width height \height}%
+ % we need to compensate for the box offset (ugly, sigh)
+ \scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \advance\scratchdimen-#4\relax
+ \nextboxdp\zeropoint
+ \nextboxht\zeropoint
+ \hbox to #3{\hss\lower.5\scratchdimen\box\nextbox\hss}%
+ \special{pdf: exobj}%
+ \global\let\currentPDFresources\empty}%
+ \smashbox\nextbox
+ \flushatshipout{\box\nextbox}%
+ \egroup}%
+ \hbox\bgroup}
+
+\definespecial\dostopobject
+ {\egroup}
+
+
+\definespecial\doinsertobject#1#2%
+ {\hbox
+ {\dogetobjectreference{#1}{#2}\PDFobjectreference
+ \ifx\PDFobjectreference\empty \else
+ \special{pdf: usexobj @#1::#2}%
+ \fi}}
+
+%D \macros
+%D {dosetpagetransition}
+
+\definespecial\dosetpagetransition{\doPDFsetpagetransition}
+
+%D \macros
+%D {doinsertcomment, doflushcomments}
+
+\definespecial\doinsertcomment{\doPDFinsertcomment}
+\definespecial\doflushcomments{\doPDFflushcomments}
+
+%D \macros
+%D {dopresetlinefield,dopresettextfield,
+%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
+%D dopresetpushfield,dopresetcheckfield,
+%D dopresetradiofield,dopresetradiorecord}
+
+\definespecial\dopresetlinefield {\doFDFpresetlinefield}
+\definespecial\dopresettextfield {\doFDFpresettextfield}
+\definespecial\dopresetchoicefield{\doFDFpresetchoicefield}
+\definespecial\dopresetpopupfield {\doFDFpresetpopupfield}
+\definespecial\dopresetcombofield {\doFDFpresetcombofield}
+\definespecial\dopresetpushfield {\doFDFpresetpushfield}
+\definespecial\dopresetcheckfield {\doFDFpresetcheckfield}
+\definespecial\dopresetradiofield {\doFDFpresetradiofield}
+\definespecial\dopresetradiorecord{\doFDFpresetradiorecord}
+
+%D \macros
+%D {dodefinefieldset,dogetfieldset,doiffieldset}
+
+\definespecial\dodefinefieldset{\doFDFdefinefieldset}
+\definespecial\dogetfieldset {\doFDFgetfieldset}
+\definespecial\doiffieldset {\doFDFiffieldset}
+
+%D \macros
+%D {doregistercalculationset}
+
+\definespecial\doregistercalculationset{\doFDFregistercalculationset}
+
+%D \macros
+%D {doPDFdestination}
+
+\def\doPDFdestination#1%
+ {\special{pdf: dest (#1) [@thispage /View [/Fit]]}}
+
+%D \macros
+%D {doPDFaction,doPDFannotation,ifsharePDFactions}
+%D
+%D Sharing is not yet supported.
+
+\newif\ifsharePDFactions \sharePDFactionsfalse
+
+\def\dodoPDFaction#1#2#3#4%
+ {\ifcollectreferenceactions
+ \xdef\lastPDFaction{#4}%
+ \else
+ \bgroup
+ % this is yet untested
+ %\ifsharePDFactions
+ % \ifcase\similarreference\relax
+ % \xdef\lastPDFaction{<<#4>>}%
+ % \or
+ % \global\advance\nofPDFsimilar by 1
+ % \special{pdf: object @PDF::sim:\the\nofPDFsimilar\space<<#4>>}%
+ % \xdef\lastPDFaction{@PDF::sim:\the\nofPDFsimilar}%
+ % \else
+ % % leave \lastPDFaction untouched
+ % \fi
+ %\else
+ \xdef\lastPDFaction{<<#4>>}%
+ %\fi
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \special{pdf: ann #1 width \width height \height
+ <</Subtype /Link /Border [0 0 0]
+ \ifhighlighthyperlinks \else /H /N \fi
+ /A \lastPDFaction\space>>}%
+ \egroup
+ \fi}
+
+\def\doPDFaction#1#2#3%
+ {\dodoPDFaction\empty{#1}{#2}{#3}}
+
+\def\doPDFannotation#1#2#3%
+ {\bgroup
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
+ \special{pdf: ann width \width height \height
+ <</Subtype /Link /Border [0 0 0] /A <<#3>>}%
+ \egroup}
+
+%D \macros
+%D {doPDFannotationobject,doPDFactionobject}
+
+\def\doPDFannotationobject#1#2#3#4#5%
+ {\bgroup
+ \scratchdimen#3\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#4\edef\height{\the\scratchdimen\space}%
+ \special{pdf: ann @#1::#2 width \width height \height <<#5>>}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}%
+ \egroup}
+
+\def\doPDFactionobject#1#2#3#4#5%
+ {\dodoPDFaction{@#1::#2}{#3}{#4}{#5}%
+ \dosetobjectreference{#1}{#2}{#1::#2}}
+
+%D \macros
+%D {doPDFaddtocatalog,doPDFaddtoinfo,
+%D doPDFpageattribute,doPDFpagesattribute}
+
+\def\doPDFaddtocatalog#1%
+ {\special{pdf: put @catalog <<#1>>}}
+
+\def\doPDFaddtoinfo#1% Is this auto appended? Not checked!
+ {\special{pdf: docinfo <<#1>>}} % put @docinfo <<#1>>}}
+
+\def\doPDFpageattribute#1%
+ {\special{pdf: put @thispage <<#1>>}}
+
+\def\doPDFpagesattribute#1%
+ {\special{pdf: put @pages <<#1>>}}
+
+\def\doPDFpageresource#1%
+ {\message{[skipping PDF resource]}}
+
+\let\doPDFresetpageresources \relax
+\let\doPDFresetpageattributes\relax
+
+%D \macros
+%D {doPDFbookmark}
+
+\def\doPDFbookmark#1#2#3#4#5%
+ {\ifcase#2\else
+ \scratchcounter#4\advance\scratchcounter\minusone
+ \special{pdf: out \ifcase#5-\fi#2
+ % <</Page \the\scratchcounter\space /View [/Fit] /Title (#3)>>}%
+ % <</Title (#3) /A <</S /GoTo /D [@page\number#4\space\PDFpageviewwrd]>> >>}%
+ <</Title \ifPDFunicode<#3>\else(#3)\fi\space /A <</S /GoTo /D [@page\number#4\space\PDFpageviewwrd]>> >>}%
+ \fi}
+
+%D \macros
+%D {doPDFdictionaryobject,doPDFarrayobject}
+
+\def\doPDFdictionaryobject#1#2#3%
+ {\special{pdf: object @#1::#2 <<#3>>}}
+
+\def\doPDFarrayobject#1#2#3%
+ {\special{pdf: object @#1::#2 [#3]}}
+
+%D \macros
+%D {defaultobjectreference,doPDFgetobjectreference}
+
+\def\defaultobjectreference#1#2{#1::#2}
+
+\def\doPDFgetobjectreference#1#2#3%
+ {\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}}
+
+%D Done.
+
+\stopspecials
+
+\protect \endinput
diff --git a/tex/context/base/spec-dpx.mkii b/tex/context/base/spec-dpx.mkii
new file mode 100644
index 000000000..c521da8c7
--- /dev/null
+++ b/tex/context/base/spec-dpx.mkii
@@ -0,0 +1,794 @@
+%D \module
+%D [ file=spec-dpx,
+%D version=2005.08.12,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=DVIPDFMx support,
+%D author=Jin-Hwan Cho,
+%D date=\currentdate,
+%D copyright={Jin-Hwan Cho \& Hans Hagen}]
+%C
+%C DVIPDFMx is an eXtended version of the DVIPDFM, a DVI to PDF
+%C translator, still under construction by Jin-Hwan Cho and
+%C Shunsaku Hirata.
+%C
+%C It supports multi-byte character encodings and large character
+%C sets for East Asian languages by CID-keyed font technology,
+%C and many features including PDF encryption, PDF bookmarks and
+%C annotations with Chinese, Japanese, Korean characters, etc.
+%C
+%C DVIPDFMx (and information) can be downloaded from:
+%C
+%C http://project.ktug.or.kr/dvipdfmx/
+
+\unprotect
+
+%D This driver is built on top of the general \PDF\ macros,
+%D as defined in \type{spec-fdf}, so we inherit that one.
+
+\startspecials[dpx][reset,fdf]
+
+%D 1. Modified codes from \type{spec-dpm}
+
+%D \macros
+%D {jobsuffix}
+%D
+%D Because no intermediate output format is used, we set the
+%D jobsuffix to \PDF.
+
+\setjobsuffix{pdf}
+
+%D Map files (experimental)
+
+\definespecial\doloadmapfile#1#2%
+ {\flushatshipout{\special{pdf:mapfile +#2}}}
+
+%D DVIPDFMx supports the special command \type{pdf: literal ...}
+%D since the version \type{dvipdfmx-20021028}.
+%D
+%D 1. \type{pdf: literal #1} puts the given PDF commands \#1
+%D after changing the text matrix with \type{"1 0 0 1 x y cm"}
+%D to set the current DVI position $(x,y)$ to the origin.
+%D
+%D 2. \type{pdf: literal reverse #1} puts the given PDF commands \#1
+%D after changing the text matrix with \type{"1 0 0 1 -x -y cm"}.
+%D
+%D 3. \type{pdf: literal direct #1} puts directly the given PDF
+%D commands \#1 without changing the text matrix.
+%D
+%D Since the version \type{dvipdfmx-20050812}, the role of the special
+%D command \type{pdf:literal} is changed so that
+%D
+%D 1. \type{pdf:literal #1} puts the given PDF commands \#1
+%D after changing the text matrix with \type{"1 0 0 1 x y cm"}
+%D to set the current DVI position $(x,y)$ to the origin. After that
+%D it restores the previous setting by changing the text matrix with
+%D \type{"1 0 0 1 -x -y cm"}.
+%D
+%D 2. \type{pdf:literal direct #1} puts directly the given PDF commands
+%D \type {#1} without changing the text matrix.
+%D
+%D Literal \PDF\ inclusion is implemented as:
+
+\def\PDFcode #1{\special{pdf:literal #1}}
+\def\PDFcontentcode#1{\special{pdf:content #1}}
+\def\PDFdirectcode #1{\special{pdf:literal direct #1}}
+
+%D \type{\dosetuppaper} in \type{spec-dpm} did not work properly
+%D because DVIPDFM did not permit changing the page size.
+%D
+%D However, DVIPDFMx permits different page size in each page
+%D since the version \type{dvipdfmx-20021028}.
+%D
+%D \macros
+%D {dosetuppaper}
+%D
+%D A simple one.
+
+\let\PDFpagexyzspec\relax \def\PDFpagexyzspec{@xpos @ypos 0} % untested
+
+\definespecial\dosetuppaper#1#2#3%
+ {\bgroup
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \special{pdf:pagesize width \width height \height}%
+ \egroup}
+
+%D \macros
+%D {doinsertfile}
+%D
+%D Only \METAPOST, \BMP\ \JPG\ \PNG\ and \PDF\ inclusion are supported.
+
+\definespecial\doinsertfile
+ {\dofileinsertion{dpx}\@@DriverImageType}
+
+%D Even though DVIPDFM supports \METAPOST directly, the funtionality
+%D is not good. It conflicts much with \CONTEXT.
+%D
+%D So, \METAPOST will be treated as the same way as PDFTeX using
+%D MPtoPDF in DVIPDFMx since the version \type{dvipdfmx-20021028}.
+
+%D DVIPDFM (and DVIPDFMx too) supports the image files with
+%D the extension, \PDF, \JPG, \PNG, \BMP, and \EPS.
+
+% \def\handleepsimage
+% {\PointsToWholeBigPoints\@@DriverImageWidth \width
+% \PointsToWholeBigPoints\@@DriverImageHeight\height
+% \special
+% {PSfile="\@@DriverImageFile"\space
+% llx=\EPSllx\space lly=\EPSlly\space
+% urx=\EPSurx\space ury=\EPSury\space
+% rwi=\width0\space rhi=\height0}}
+
+% \definefileinsertion{dpx}{mps}{\handleepsimage}
+
+\definefileinsertion{dpx}{mps}
+ {\hbox
+ {\convertMPtoPDF\@@DriverImageFile{1}{1}%
+ \global\let\PDFimagereference\empty}}
+
+\def\handlebmpimage
+ {\special{pdf: image
+ width \@@DriverImageWidth \space
+ height \@@DriverImageHeight\space
+ (\@@DriverImageFile)}}
+
+\definefileinsertion{dpx}{pdf}{\handlebmpimage}
+\definefileinsertion{dpx}{jpg}{\handlebmpimage}
+\definefileinsertion{dpx}{png}{\handlebmpimage}
+\definefileinsertion{dpx}{bmp}{\handlebmpimage}
+
+\definefileinsertion{dpx}{mov}{\doPDFinsertmov}
+\definefileinsertion{dpx}{avi}{\doPDFinsertmov}
+
+%D \macros
+%D {doinsertsoundtrack}
+%D
+%D Sounds are supported too.
+
+\definespecial\doinsertsoundtrack{\doPDFinsertsoundtrack}
+
+%D \macros
+%D {doovalbox}
+
+\definespecial\doovalbox{\doPDFovalbox}
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,
+%D dostopcolormode,
+%D dostartrotation,dostoprotation,
+%D dostartscaling,dostopscaling,
+%D dostartmirroring,dostopmirroring,
+%D dostartnegative,dostopnegative}
+%D
+%D Unfortunately the direct \PDF\ inclusion is not suited
+%D for the next macros, which means that we cannot use the
+%D \type {\doPDF..} alternatives. Since \CONTEXT\ maintains
+%D its own colorstack, we use the \DVIPS\ alternatives.
+
+\definespecial\dostartgraymode {\doPDFstartgraymode}
+\definespecial\dostopgraymode {\doPDFstopgraymode}
+\definespecial\dostartrgbcolormode {\doPDFstartrgbcolormode}
+\definespecial\dostartcmykcolormode{\doPDFstartcmykcolormode}
+\definespecial\dostartgraycolormode{\doPDFstartgraycolormode}
+\definespecial\dostartspotcolormode{\doPDFstartspotcolormode}
+\definespecial\dostopcolormode {\doPDFstopcolormode}
+
+\definespecial\doregistercmykspotcolor{\doPDFregistercmykspotcolor}
+\definespecial\doregisterrgbspotcolor {\doPDFregisterrgbspotcolor}
+\definespecial\doregistergrayspotcolor{\doPDFregistergrayspotcolor}
+
+\definespecial\doregistercmykindexcolor{\doPDFregistercmykindexcolor}
+\definespecial\doregisterrgbindexcolor {\doPDFregisterrgbindexcolor}
+\definespecial\doregistergrayindexcolor{\doPDFregistergrayindexcolor}
+
+\definespecial\doregisterfigurecolor{\doPDFregisterfigurecolor}
+
+\definespecial\dostartnonecolormode{\doPDFstartnonecolormode}
+\definespecial\doregisternonecolor {\doPDFregisternonecolor}
+
+\definespecial\dostartrotation #1{\special{pdf:btrans rotate #1}}
+\definespecial\dostoprotation {\special{pdf:etrans}}
+\definespecial\dostartscaling#1#2{\special{pdf:btrans xscale #1 yscale #2}}
+\definespecial\dostopscaling {\special{pdf:etrans}}
+\definespecial\dostartmirroring {\special{pdf:btrans xscale -1}}
+\definespecial\dostopmirroring {\special{pdf:etrans}}
+
+%D Negation is not (yet) supported:
+\definespecial\dostartnegative {\doPDFstartnegative}
+\definespecial\dostopnegative {\doPDFstopnegative}
+\definespecial\dostartoverprint {\doPDFstartoverprint}
+\definespecial\dostopoverprint {\doPDFstopoverprint}
+
+\definespecial\dostarttransparency{\doPDFstarttransparency}
+\definespecial\dostoptransparency {\doPDFstoptransparency}
+
+\PDFtransparencysupportedtrue
+
+\def\@@PDT{@PDT@}
+
+\ifx\PDFcurrenttransparency\undefined
+ \newcount\PDFcurrenttransparency \PDFcurrenttransparency=0 % -1
+\fi
+
+\def\assignPDFtransparency#1#2%
+ {\def\PDFtransparencyidentifier{/Tr#1}%
+ \def\PDFtransparencyreference{@TR:#2}} % todo: \PDFobjref{TR:#2}
+
+\def\presetPDFtransparency#1#2%
+ {\initializePDFtransparency
+ \executeifdefined{\@@PDT#1:#2}{\dopresetPDFtransparency{#1}{#2}}}
+
+\def\dopresetPDFtransparency#1#2%
+ {\global\advance\PDFcurrenttransparency \plusone
+ \doPDFreserveDPXobject{TR:\the\PDFcurrenttransparency}{<< >>}% hack
+ \special{pdf:\doPDFcheckedDPXobject{TR:\the\PDFcurrenttransparency}\PDFtransparancydictionary{#1}{#2}{}}%
+ \edef\PDFtransparencyidentifier{/Tr\the\PDFcurrenttransparency}%
+ \edef\PDFtransparencyreference {@TR:\the\PDFcurrenttransparency}%
+ \setxvalue{\@@PDT#1:#2}%
+ {\noexpand\assignPDFtransparency{\the\PDFcurrenttransparency}{\the\PDFcurrenttransparency}}%
+ \appendtoPDFdocumentextgstates
+ {\PDFtransparencyidentifier\space
+ \PDFtransparencyreference\space}}
+
+\def\initializePDFtransparency
+ {\doPDFreserveDPXobject{TR:0}{<< >>}% hack
+ \special{pdf:\doPDFcheckedDPXobject{TR:0}\PDFtransparancydictionary{1}{1}{/AIS false}}%
+ \xdef\PDFtransparencyresetidentifier{/Tr0}%
+ \xdef\PDFtransparencyresetreference{@TR:0}%
+ \setxvalue{\@@PDT0:0}%
+ {\noexpand\assignPDFtransparency{0}{0}}%
+ \appendtoPDFdocumentextgstates
+ {\PDFtransparencyresetidentifier\space
+ \PDFtransparencyresetreference\space}%
+ \global\let\initializePDFtransparency\relax}
+
+%D \macros
+%D {dosetupinteraction,
+%D dosetupopenaction,dosetupcloseaction}
+
+\definespecial\dosetupinteraction
+ {\showmessage\m!interactions{21}{DVIPDFMx}}
+
+\definespecial\dosetupopenaction {\doPDFsetupopenaction}
+\definespecial\dosetupcloseaction{\doPDFsetupcloseaction}
+
+%D \macros
+%D {doresetgotowhereever,
+%D dostartthisisrealpage,dostartthisislocation,
+%D dostartgotorealpage,dostartgotolocation,dostartgotoJS}
+
+\definespecial\doresetgotowhereever {\doPDFresetgotowhereever}
+\definespecial\dostartthisislocation{\doPDFstartthisislocation}
+
+\definespecial\dostartgotolocation{\doPDFstartgotolocation}
+\definespecial\dostartgotorealpage{\doPDFstartgotorealpage}
+\definespecial\dostartgotoJS {\doPDFstartgotoJS}
+
+%D \macros
+%D {doflushJSpreamble}
+
+\definespecial\doflushJSpreamble#1%
+ {\bgroup
+ \let\compositeJScode\empty
+ \def\docommand##1%
+ {\edef\sanitizedJScode{\getJSpreamble{##1}}%
+ \@EA\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode
+ \special{pdf:object @JS:##1 <</S /JavaScript /JS (\sanitizedJScode)>>}%
+ \edef\compositeJScode{\compositeJScode\space (##1) @JS:##1}}%
+ \processcommalist[#1]\docommand
+ \special{pdf:names /JavaScript [\compositeJScode]}%
+ \egroup}
+
+%D \macros
+%D {dostarthide,dostophide}
+
+\definespecial\dostarthide{}
+\definespecial\dostophide {}
+
+%D \macros
+%D {dosetupscreen}
+
+\definespecial\dosetupscreen {\doPDFsetupscreen \printpaperheight}
+
+\definespecial\dosetupartbox {\doPDFsetupartbox \printpaperheight}
+\definespecial\dosetupcropbox {\doPDFsetupcropbox \printpaperheight}
+\definespecial\dosetupbleedbox{\doPDFsetupbleedbox\printpaperheight}
+\definespecial\dosetuptrimbox {\doPDFsetuptrimbox \printpaperheight}
+
+%D \macros
+%D {dostartexecutecommand}
+
+\definespecial\dostartexecutecommand{\doPDFstartexecutecommand}
+
+%D \macros
+%D {dosetupidentity}
+
+\definespecial\dosetupidentity{\doPDFsetupidentity}
+
+%D \macros
+%D {dostartrunprogam}
+
+\definespecial\dostartrunprogram{\doPDFstartrunprogram}
+
+%D \macros
+%D {dostartgotoprofile, dostopgotoprofile,
+%D dobeginofprofile, doendofprofile}
+
+\definespecial\dostartgotoprofile{\doPDFstartgotoprofile}
+
+\definespecial\dobeginofprofile#1#2#3#4%
+ {\bgroup
+ \setPDFdestination{#1}%
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \doifsomething{\PDFdestination}
+ {\special
+ {pdf:thread @ART::\PDFdestination\space
+ width \width height \height
+ <</Title (\PDFdestination)>>}}%
+ \egroup}
+
+\definespecial\doendofprofile
+ {}
+
+%D \macros
+%D {doinsertbookmark}
+
+\definespecial\doinsertbookmark{\doPDFinsertbookmark}
+
+%D \macros
+%D {dostartobject,dostopobject,doinsertobject}
+%D
+%D Modified to support the color shading feature since version
+%D \type{dvipdfmx-20021128}.
+
+% wd nextbox > #3 ivm offset
+
+% \definespecial\dostartobject#1#2#3#4#5%
+% {\bgroup
+% \dowithnextbox
+% {\dosetobjectreference{#1}{#2}{@#1::#2}%
+% \scratchdimen#3\edef\width {\the\scratchdimen\space}%
+% \scratchdimen#4\edef\height{\the\scratchdimen\space}%
+% \setbox\nextbox\vbox
+% {\special{pdf:bxobj @#1::#2 width \width height \height}%
+% % we need to compensate for the box offset (ugly, sigh)
+% \scratchdimen\nextboxht
+% \advance\scratchdimen\nextboxdp
+% \advance\scratchdimen-#4\relax
+% \nextboxdp\zeropoint
+% \nextboxht\zeropoint
+% \hbox to #3{\hss\lower.5\scratchdimen\box\nextbox\hss}%
+% \ifx\currentPDFresources\empty
+% \else
+% \special{pdf:put @resources <<\currentPDFresources>>}%
+% \global\let\currentPDFresources\empty
+% \fi
+% \special{pdf:exobj}}%
+% \smashbox\nextbox
+% \flushatshipout{\box\nextbox}%
+% \egroup}%
+% \hbox\bgroup}
+
+% \definespecial\dostopobject
+% {\egroup}
+
+\def\doDVIPDFMXstartobject#1#2#3#4#5#6%
+ {\bgroup
+ \dowithnextbox
+ {\ifcase#1\or\dosetobjectreference{#2}{#3}{@#2::#3}\fi
+ \scratchdimen#4\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#5\edef\height{\the\scratchdimen\space}%
+ \setbox\nextbox\vbox
+ {\special{pdf:bxobj @#2::#3 width \width height \height}%
+ % we need to compensate for the box offset (ugly, sigh)
+ \scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \advance\scratchdimen-#5\relax
+ \nextboxdp\zeropoint
+ \nextboxht\zeropoint
+ \hbox to #4{\hss\lower.5\scratchdimen\box\nextbox\hss}%
+ \ifx\currentPDFresources\empty
+ \else
+ \special{pdf:put @resources <<\currentPDFresources>>}%
+ \global\let\currentPDFresources\empty
+ \fi
+ \special{pdf:exobj}}%
+ \finalizeobjectbox\nextbox
+ \smashbox\nextbox
+ \flushatshipout{\box\nextbox}%
+ \egroup}%
+ \hbox\bgroup}
+
+\def\doDVIPDFMXstopobject
+ {\egroup}
+
+\definespecial\dostartobject#1#2#3#4#5%
+ {\doDVIPDFMXstartobject\plusone{#1}{#2}{#3}{#4}{#5}}
+
+\definespecial\dostopobject
+ {\doDVIPDFMXstopobject}
+
+\definespecial\doinsertobject#1#2%
+ {\hbox
+ {\doPDFgetobjectreference{#1}{#2}\PDFobjectreference
+ \ifx\PDFobjectreference\empty \else
+ \special{pdf:uxobj @#1::#2}%
+ \fi}}
+
+%D \macros
+%D {dosetpagetransition}
+
+\definespecial\dosetpagetransition{\doPDFsetpagetransition}
+
+%D \macros
+%D {doinsertcomment, doflushcomments}
+
+\definespecial\doinsertcomment{\doPDFinsertcomment}
+\definespecial\doflushcomments{\doPDFflushcomments}
+
+%D \macros
+%D {dopresetlinefield,dopresettextfield,
+%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
+%D dopresetpushfield,dopresetcheckfield,
+%D dopresetradiofield,dopresetradiorecord}
+
+\definespecial\dopresetlinefield {\doFDFpresetlinefield}
+\definespecial\dopresettextfield {\doFDFpresettextfield}
+\definespecial\dopresetchoicefield{\doFDFpresetchoicefield}
+\definespecial\dopresetpopupfield {\doFDFpresetpopupfield}
+\definespecial\dopresetcombofield {\doFDFpresetcombofield}
+\definespecial\dopresetpushfield {\doFDFpresetpushfield}
+\definespecial\dopresetcheckfield {\doFDFpresetcheckfield}
+\definespecial\dopresetradiofield {\doFDFpresetradiofield}
+\definespecial\dopresetradiorecord{\doFDFpresetradiorecord}
+
+%D \macros
+%D {dodefinefieldset,dogetfieldset,doiffieldset}
+
+\definespecial\dodefinefieldset{\doFDFdefinefieldset}
+\definespecial\dogetfieldset {\doFDFgetfieldset}
+\definespecial\doiffieldset {\doFDFiffieldset}
+
+%D \macros
+%D {doregistercalculationset}
+
+\definespecial\doregistercalculationset{\doFDFregistercalculationset}
+
+%D \type{\doPDFdestination} in \type{spec-dpm} had a bug.
+%D
+%D \macros
+%D {doPDFdestination}
+
+\def\doPDFdestination#1%
+ {\special{pdf:names /Dests (#1) [@thispage \PDFpageviewwrd]}}
+
+%D \macros
+%D {doPDFaction,doPDFannotation,ifsharePDFactions}
+%D
+%D Sharing is not yet supported.
+
+\newif\ifsharePDFactions \sharePDFactionsfalse
+
+\def\dodoPDFaction#1#2#3#4%
+ {\ifcollectreferenceactions
+ \xdef\lastPDFaction{#4}%
+ \else
+ \bgroup
+ % this is yet untested
+ %\ifsharePDFactions
+ % \ifcase\similarreference\relax
+ % \xdef\lastPDFaction{<<#4>>}%
+ % \or
+ % \global\advance\nofPDFsimilar by 1
+ % \special{pdf: object @PDF::sim:\the\nofPDFsimilar\space<<#4>>}%
+ % \xdef\lastPDFaction{@PDF::sim:\the\nofPDFsimilar}%
+ % \else
+ % % leave \lastPDFaction untouched
+ % \fi
+ %\else
+ \xdef\lastPDFaction{<<#4>>}%
+ %\fi
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
+ \special{pdf:ann #1 width \width height \height
+ <</Subtype /Link /Border [0 0 0]
+ \ifhighlighthyperlinks \else /H /N \fi
+ /A \lastPDFaction\space>>}%
+ \egroup
+ \fi}
+
+\def\doPDFaction#1#2#3%
+ {\dodoPDFaction\empty{#1}{#2}{#3}}
+
+%D \type{\doPDFannotation} in \type{spec-dpm} had a bug.
+%D
+%D \type{\doPDFannotation} conflicts with \type{\doPDFinsertmov},
+%D since width and height also defined in \type{\doPDFinsertmov}.
+
+\def\doPDFannotation#1#2#3%
+ {\bgroup
+ \edef\data{#3}%
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
+ \special{pdf:ann width \width height \height <<\data>>}%
+ \egroup}
+
+%D \macros
+%D {doPDFannotationobject,doPDFactionobject}
+
+\def\doPDFannotationobject#1#2#3#4#5%
+ {\bgroup
+ \scratchdimen#3\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#4\edef\height{\the\scratchdimen\space}%
+ \special{pdf:ann @#1::#2 width \width height \height <<#5>>}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}%
+ \egroup}
+
+\def\doPDFactionobject#1#2#3#4#5%
+ {\dodoPDFaction{@#1::#2}{#3}{#4}{#5}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}}
+
+%D \macros
+%D {doPDFaddtocatalog,doPDFaddtoinfo,
+%D doPDFpageattribute,doPDFpagesattribute}
+
+% we could move much more to spec-fdf
+
+% \ifx\pdfcatalog \undefined \newtoks\pdfcatalog \fi
+% \ifx\pdfinfo \undefined \newtoks\pdfinfo \fi
+% \ifx\pdfpageattr \undefined \newtoks\pdfpageattr \fi
+% \ifx\pdfpageresources\undefined \newtoks\pdfpageresources \fi
+% \ifx\pdfpagesattr \undefined \newtoks\pdfpagesattr \fi
+
+% \def\doPDFaddtocatalog #1{\expanded{\global\pdfcatalog {#1\the\pdfcatalog }}}
+% \def\doPDFaddtoinfo #1{\expanded{\global\pdfinfo {#1\the\pdfinfo }}}
+% \def\doPDFpageattribute #1{\expanded{\global\pdfpageattr {#1\the\pdfpageattr }}}
+% \def\doPDFpageresource #1{\expanded{\global\pdfpageresources{#1\the\pdfpageresources}}}
+% \def\doPDFpagesattribute#1{\expanded{\global\pdfpagesattr {#1\the\pdfpagesattr }}}
+
+% \def\doPDFresetpageattributes{\global\pdfpageattr\emptytoks}
+% \def\doPDFresetpageresources {\global\pdfpageresources\emptytoks}
+
+% \appendtoks
+% \special{pdf: put @catalog <<#1>>}%
+% \special{pdf: docinfo <<#1>>}%
+% \special{pdf: put @pages <<#1>>}%
+% \to \everylastshipout
+
+% \appendtoks
+% \special{pdf: put @thispage <<#1>>}%
+% \to\everyshipout
+
+\def\doPDFaddtocatalog#1%
+ {\special{pdf:put @catalog <<#1>>}}
+
+\def\doPDFaddtoinfo#1%
+ {\special{pdf:put @docinfo <<#1>>}}
+
+\def\doPDFpageattribute#1%
+ {\special{pdf:put @thispage <<#1>>}}
+
+\def\doPDFpagesattribute#1%
+ {\special{pdf:put @pages <<#1>>}}
+
+\def\doPDFpageresource#1%
+ {\special{pdf:put @resources <<#1>>}}
+
+\let\doPDFresetpageresources \relax
+\let\doPDFresetpageattributes\relax
+
+%D \type{\doPDFbookmark} in \type{spec-dpm} had a bug.
+%D The openbookmark option \#5 is not supported yet.
+%D
+%D \macros
+%D {doPDFbookmark}
+
+\def\doPDFbookmark#1#2#3#4#5%
+ {\ifcase#1\else
+ %\scratchcounter#4\advance\scratchcounter\minusone
+ \special{pdf:outline #1 %\ifcase#5 opened\fi
+ % <</Title (#3) /A <</S /GoTo /D (page:\the\scratchcounter)>>>>}%
+ % <</Title (#3) /A <</S /GoTo /D [@page\number#4\space\PDFpageviewwrd]>> >>}%
+ <</Title \ifPDFunicode<#3>\else(#3)\fi\space /A <</S /GoTo /D [@page\number#4\space\PDFpageviewwrd]>> >>}%
+ \fi}
+
+%D \macros
+%D {doPDFdictionaryobject,doPDFarrayobject}
+
+% Dvipdfmx can't handle
+%
+% \special{pdf:put @foo << /Bar @bar >>}
+% \special{pdf:put @bar << /Foo @foo >>}
+%
+% Objects must be defined before they are used.
+%
+% \special{pdf:obj @foo << >>}
+% \special{pdf:obj @bar << >>}
+% \special{pdf:put @foo << /Bar @bar >>}
+% \special{pdf:put @bar << /Foo @foo >>}
+%
+% However, this only works for dictionary and array.
+
+\def\doPDFreserveDPXobject#1#2%
+ {\ifundefined{r:pdx:d:#1}%
+ % we need a \flushatshipoutprep (prepended, normally appended)
+ \flushatshipout{\special{pdf:object @#1 #2}}%
+ \global\letvalue{r:pdx:d:#1}\empty
+ \fi}
+
+\def\doPDFreserveDPXobjectfirst#1#2%
+ {\ifundefined{r:pdx:d:#1}%
+ \doglobal\prependtoks\special{pdf:object @#1 #2}\to\everyfirstshipout
+ \global\letvalue{r:pdx:d:#1}\empty
+ \fi}
+
+\def\doPDFcheckedDPXobject#1{\ifundefined{r:pdx:d:#1}object\else put\fi\space @#1\space}
+
+% new, experimental, can save a run, bugged, too many xforms now
+%
+% \def\doreservePDFobject#1#2%
+% {\dosetobjectreference{#1}{#2}{@#1::#2}}
+%
+% \def\doPDFreserveddictionaryobject#1#2#3%
+% {\flushatshipout{\special{pdf:object @#1::#2 << #3 >>}}}
+%
+% \def\doPDFreservedarrayobject#1#2#3%
+% {\flushatshipout{\special{pdf:object @#1::#2 [ #3 ]}}}
+%
+% \doreservePDFobject{FDF}{docuextgstates}
+% \doreservePDFobject{FDF}{colorspaces}
+% \doreservePDFobject{FDF}{docushades}
+
+% so this is to be checked
+
+\def\doPDFdictionaryobject#1#2#3%
+ {\flushatshipout
+ {\special{pdf:\doPDFcheckedDPXobject{#1::#2}<<#3>>}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}}}
+
+\def\doPDFarrayobject#1#2#3%
+ {\flushatshipout
+ {\special{pdf:\doPDFcheckedDPXobject{#1::#2}[#3]}%
+ \dosetobjectreference{#1}{#2}{@#1::#2}}}
+
+%D \macros
+%D {defaultobjectreference,doPDFgetobjectreference}
+
+\def\defaultobjectreference#1#2{@#1::#2}
+
+%D \type{\doPDFgetobjectreference} in \type{spec-dpm} had a bug.
+
+\def\doPDFgetobjectreference#1#2#3%
+ {\dogetobjectreference{#1}{#2}#3%
+ \ifx#3\empty\else\edef#3{#3}\fi}
+
+\def\doPDFgetpagereference#1#2%
+ {\edef#2{@page#1}}
+
+%D Done.
+
+% %D 2. Modified codes from \type{spec-fdf}
+%
+% \definespecial\dostartgraphicgroup{\special{pdf: literal direct q}}
+% \definespecial\dostopgraphicgroup {\special{pdf: literal direct Q}}
+
+%D 3. Copied codes from \type{spec-tpd}
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D Clipping in \PDFTEX\ is rather trivial. We can even hook
+%D in \METAPOST\ without problems.
+
+\definespecial\dostartclipping#1#2#3%
+ {\PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#3}\height
+ \grabMPclippath{#1}{1}\width\height
+ {0 0 m \width\space 0 l \width \height l 0 \height l}%
+ \PDFcode
+ {q 0 w \MPclippath\space W n}}
+
+\definespecial\dostopclipping
+ {\PDFcode{Q n}}
+
+%D 4. Modified codes from \type{supp-pdf}
+
+\def\dosetMPsomePDFshade#1#2%
+ {\global\advance\currentPDFshade \plusone
+ \special{pdf:object @ftn:Sh:\currentPDFshade\space
+ <</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \special{pdf:object @obj:Sh:\currentPDFshade\space
+ <</ShadingType #1
+ /ColorSpace /\MPresolvedspace
+ /Function @ftn:Sh:\currentPDFshade\space
+ /Coords [\MPshadeC]
+ /Extend [true true]>>}%
+ \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}
+ {\vbox to \zeropoint
+ {\vss
+ \hbox to \zeropoint
+ {\special{pdf:btrans matrix #1 #2 #3 #4 #5 #6}%
+ \rlap{\special{pdf:image width 1bp height 1bp (#7)}}
+ \special{pdf:etrans}\hss}}}
+ {\message{[unknown figure #7]}}}
+
+%D 5. Modified codes from \type{supp-pdf}
+
+\let\handleMPfshow\dohandleMPfshow
+
+\newcounter\MPPDFcounter
+
+\newcounter\MPPDFobjectcounter
+
+\def\setMPPDFobject#1#2% resources boxnumber
+ {\doglobal\increment\MPPDFobjectcounter
+ \xdef\getMPPDFobject
+ {\vbox to \the\ht#2%
+ {\vss
+ \hbox to \the\wd#2%
+ {%\scratchdimen\wd#2\scratchdimen.5\scratchdimen\hskip-\the\scratchdimen
+ \special{pdf:uxobj @MPPDF::\MPPDFobjectcounter}}}}%
+ \expanded{\doDVIPDFMXstartobject\zerocount{MPPDF}\MPPDFobjectcounter{\the\wd#2}{\the\ht#2}{\the\dp#2}}%
+ \finalizeobjectbox#2%
+ \box#2%
+ \doDVIPDFMXstopobject}
+
+\let\getMPPDFobject\gobbletwoarguments
+
+\definespecial\doinsertMPfile#1%
+ {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}}
+
+%D Experimental (untested):
+
+\definespecial\dostartfonteffect#1#2#3%
+ {\ifdim#2>\zeropoint
+ \PointsToBigPoints{#2}\ascii
+ \PDFdirectcode{\ascii\space w}%
+ \fi
+ \ifdim#3\points=\onepoint\else
+ \scratchdimen#3\points
+ \PDFdirectcode{\withoutpt{\the\scratchdimen}\space Tc}%
+ \fi
+ \PDFdirectcode{\purenumber#1 Tr}}
+
+\definespecial\dostopfonteffect
+ {\PDFdirectcode{1 w 0 Tc 0 Tr}}
+
+%D 6. Modified codes from \type{core-obj}
+%D
+%D In the viewpoint of TeX, the special command \type{pdf:uxobj @obj}
+%D generates a box with zero point width and zero point height so that
+%D it must be careful to place the box at the reference point.
+
+\def\dogetobject#1#2#3#4#5#6#7% don't change this, should work for dvi & pdf
+ {\initializepaper
+ \forgetall
+ \dontshowcomposition
+ \setbox\scratchbox\vbox
+ {\doinsertobject{#1}{#2}}%
+ \setbox\scratchbox#3%
+ {\vbox to #5\scaledpoint
+ {\ifdim\ht\scratchbox>#5\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else\ifdim\wd\scratchbox>#4\scaledpoint
+ \vss\hbox to #4\scaledpoint{\hss\box\scratchbox\hss}\vss
+ \else
+ %\vss\box\scratchbox
+ \vss\hbox to #4\scaledpoint{\box\scratchbox\hss}%
+ \fi\fi}}%
+ \box\scratchbox
+ \elabelgroup}
+
+\stopspecials
+
+\protect \endinput
diff --git a/tex/context/base/spec-dvi.mkii b/tex/context/base/spec-dvi.mkii
new file mode 100644
index 000000000..1a8f653f0
--- /dev/null
+++ b/tex/context/base/spec-dvi.mkii
@@ -0,0 +1,118 @@
+%D \module
+%D [ file=spec-dvi,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Generic \TEX\ Solutions,
+%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
+
+%D \macros
+%D {dostartobject,
+%D dostopobject,
+%D doinsertobject}
+%D
+%D Reuse of object is not supported by the \DVI\ format. We
+%D therefore just duplicate them using boxes.
+
+\setjobsuffix{dvi} % can be overloaded in other spec's
+
+\startspecials[tex]
+
+\newbox\DVIobjects \newcounter\DVIobjectcounter
+
+\definespecial\dostartobject#1#2#3#4#5%
+ {\setbox\nextbox\vbox\bgroup
+ \def\dodostopobject
+ {\egroup
+ \doglobal\increment\DVIobjectcounter
+ \global\setbox\DVIobjects\vbox
+ {\offinterlineskip
+ \forgetall
+ \unvbox\DVIobjects
+ \setbox\nextbox\hbox{\box\nextbox}%
+ \wd\nextbox\zeropoint
+ \dp\nextbox\zeropoint
+ \ht\nextbox\onepoint
+ \allowbreak
+ \box\nextbox}%
+ \dosetobjectreference{#1}{#2}{\DVIobjectcounter}}}
+
+\definespecial\dostopobject
+ {\dodostopobject}
+
+\definespecial\doinsertobject#1#2%
+ {\bgroup
+ \dogetobjectreference{#1}{#2}\DVIobjectreference
+ \splittopskip\zeropoint
+ \setbox0=\copy\DVIobjects
+ \dimen0=\DVIobjectreference\onepoint
+ \advance\dimen0 -\onepoint
+ \setbox2\vsplit0 to \dimen0
+ \ifdim\ht0>\onepoint
+ \setbox0\vsplit0 to \onepoint
+ \fi
+ \unvbox0
+ \setbox0\lastbox
+ \hbox{\unhbox0}% the \hbox is really needed!
+ \egroup}
+
+%D \macros
+%D {dosetposition,
+%D dosetpositionwhd,
+%D dosetpositionplus}
+%D
+%D The next specials only identify a position. It is up to
+%D a \DVI\ postprocessing utility to merge the right commands
+%D into the utility file. Since in \CONTEXT, we only deal
+%D with relative positions, the reference point is not so
+%D important.
+%D
+%D The postprocessor should translate the specials into
+%D commands and append these to \type {jobname.tuo} using the
+%D format:
+%D
+%D \starttyping
+%D \pospxy {identifier}{page}{x}{y}
+%D \pospxywhd {identifier}{page}{x}{y}{w}{h}{d}
+%D \pospxyplus{identifier}{page}{x}{y}{w}{h}{d}{list}
+%D \stoptyping
+%D
+%D The postprocessor should, of course, provide the \type
+%D {page}, \type {x}, and \type {y} values.
+
+%D Now in spec-mis.tex:
+
+% \definespecial\dosetposition#1%
+% {\special{pos:pxy "#1"}}
+%
+% \definespecial\dosetpositionwhd#1#2#3#4%
+% {\special{pos:pxywhd "#1" #2 #3 #4}}
+%
+% \definespecial\dosetpositionplus#1#2#3#4#5%
+% {\special{pos:pxyplus "#1" #2 #3 #4 #5}}
+
+%D The next special tells the position postprocessor what
+%D page dimensions were used.
+
+%D Also in spec-mis.tex:
+
+% \let\flushDVIpositionpapersize\relax
+%
+% \definespecial\dosetpositionpapersize#1#2%
+% {\xdef\flushDVIpositionpapersize%
+% {\special{pos:papersize \number#1 \number#2}%
+% \noexpand\installprogram{dvipos -o \jobname.tuo \jobname.dvi }%
+% \global\noexpand\let\noexpand\flushDVIpositionpapersize\relax}}
+%
+% \prependtoksonce \flushDVIpositionpapersize \to \everyshipout
+
+\stopspecials
+
+\protect \endinput
diff --git a/tex/context/base/spec-fdf.mkii b/tex/context/base/spec-fdf.mkii
new file mode 100644
index 000000000..30e15ff34
--- /dev/null
+++ b/tex/context/base/spec-fdf.mkii
@@ -0,0 +1,3531 @@
+%D \module
+%D [ file=spec-fdf,
+%D version=1998.05.18,
+%D title=\CONTEXT\ \PDF\ Macros,
+%D subtitle=Support Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The name of this module is a bit strange but it started with fields
+%D so we keep the name.
+
+%D When dealing with resources, we share the resource dictionaries
+%D between all xforms. This is inefficent in the sense that when no
+%D resources are used, redundant entries take space, but on the other
+%D hand we save redundant dictionaries so it's a nice compromise. Maybe
+%D that in \LUATEX\ I will reimplement most of the code here anyway.
+
+%D We need to check if we can use \type {\driverreferenced}
+%D object in more places.
+
+%D Initialization of fields is tricky. If a field has no
+%D value, it is kind of not there. If ResetForm is used, the
+%D default is assigned, but pushbuttons are spoiled. Adding a
+%D \type {/MK} dictionary helps, but gives ugly down
+%D appearances (displaced with background). What a mess.
+%D Also, in order to get at least something, the \type {/AS}
+%D key should be provided.
+
+% to do : /IF << /SW /N >> == no scaling / clipping of widget
+
+\unprotect
+
+%D \macros
+%D {PDFobjref}
+%D
+%D Just a shortcut.
+
+% Watch out, \def\PDFobjref#1{\purenumber#1 0 R} also works, but not when
+% #1 == \the\whatever
+
+\def\PDFobjref#1{\purenumber{#1} 0 R}
+
+%D \macros
+%D {PDFswapdir}
+
+\let\PDFswapdir\empty \def\PDFswapdir{\ifcase\inlinedirection\or\or-\fi}
+
+% the pdf spec changed cq. viewers started behaving differently / 5+
+
+\chardef\overcomePDFpage\plusone % page numbers/ beware: optimizers remove this one
+\chardef\overcomePDFpage\plustwo % page:number
+%chardef\overcomePDFpage\plusthree % pdftex page ref feature
+
+\ifx\pdfpageref\undefined \else \chardef\overcomePDFpage\plusthree \fi
+
+%D \macros
+%D {setPDFdestination}
+%D
+%D \PDF\ destinations should obey the specifications laid down
+%D in the \PDF\ reference manual. The next macro strips illegal
+%D characters from the destination name.
+%D
+%D The \ACROBAT\ programs are not bug free. By setting the next
+%D switches, we will at least try to prevent problems.
+
+\newif\ifovercomePDFbugs \overcomePDFbugsfalse % dest sort problem / 3-
+\newif\ifovercomePDFspace \overcomePDFspacetrue % dest sort problem / 3-
+
+\let\setPDFdestination\gobbleoneargument % a MK specific definition
+
+%D \macros
+%D {sanitizePDFstring}
+%D
+%D This macro at least tries to convert a arbitrary string
+%D into a sequence of characters valid for \PDF\ bookmarks and
+%D alike.
+
+\def\sanitizePDFstring#1\to#2{}
+
+%D \macros
+%D {doPDFdestination,
+%D doPDFaction,
+%D doPDFannotation,
+%D doPDFannotationobject,
+%D doPDFdictionaryobject,
+%D doPDFarrayobject,
+%D doPDFaddtocatalog,
+%D doPDFaddtoinfo,
+%D doPDFpageattribute,
+%D doPDFpageresource,
+%D doPDFpagesattribute,
+%D doPDFbookmark,
+%D defaultobjectreference,
+%D doPDFgetobjectreference}
+%D
+%D This module deals with \PDF\ support, including fill||in
+%D forms. Before we present the largely unreadable bunch of
+%D macros, we introduce the here||not||defined low level
+%D interface macros. These must be provided by the special
+%D drivers \type{pdf} (\ACROBAT) and \type{tpd} (\PDFTEX).
+%D
+%D \starttyping
+%D \doPDFdestination #1 name
+%D \doPDFaction #1#2#3 width height action
+%D \doPDFannotation #1#2#3 width height data
+%D \doPDFannotationobject #1#2#3#4#5 class name width height data
+%D \doPDFdictionaryobject #1#2#3 class name data
+%D \doPDFarrayobject #1#2#3 class name data
+%D \doPDFaddtocatalog #1
+%D \doPDFaddtoinfo #1
+%D \doPDFpageattribute #1
+%D \doPDFpageresource #1
+%D \doPDFpagesattribute #1
+%D \doPDFbookmark #1#2#3#4#5 level n text page open
+%D
+%D \defaultobjectreference #1#2 class name
+%D \doPDFgetobjectreference #1#2#3 class name \PDFobjectreference
+%D \doPDFgetobjectpagereference #1#2#3 class name \PDFobjectreference
+%D \stoptyping
+%D
+%D The keywords reflect their use. For the moment we stick to
+%D keywords, because that way at we get an indication of what
+%D we're doing.
+
+\startspecials[fdf]
+
+%D Common:
+
+% \def\doPDFgetobjectreference#1#2#3%
+% {\def#3{..}}
+
+\def\doPDFgetobjectpage#1#2#3%
+ {\dogetobjectreferencepage{#1}{#2}#3%
+ \ifx#3\empty\def#3{\realfolio}\fi}
+
+\def\doPDFgetobjectpagereference#1#2#3%
+ {\dogetobjectreferencepage{#1}{#2}#3%
+ \ifx#3\empty
+ \doPDFgetpagereference\realfolio#3%
+ \else
+ \doPDFgetpagereference#3#3% we assume that #3 gets expanded
+ \fi}
+
+% \def\doPDFgetpagereference#1#2%%%%%%%%%%%%%%%
+% {\def#2{...}}
+
+%D Due to the fact that \PDFTEX\ has a different concept of
+%D page attributes, we need:
+
+\let\doPDFresetpageattributes\relax
+\let\doPDFresetpageresources \relax
+
+\appendtoksonce
+ \doPDFresetpageattributes
+ \doPDFresetpageresources
+\to \everyaftershipout
+
+\ifx\PDFcode\undefined
+ \ifx\pdfliteral\undefined
+ \def\PDFcode#1{\message{[ignored pdfliteral: #1]}}
+ \else
+ \let\PDFcode\pdfliteral
+ \fi
+\fi
+
+%D For special (\METAPOST) effects, we need to build
+%D resource dictionaries. Here is the framework.
+
+\let\docuPDFextgstates\empty
+%let\pagePDFextgstates\empty
+
+\def\checkPDFextgstates
+ {\ifx\docuPDFextgstates\empty \else
+ \ifnum\realpageno=\lastpage\relax
+ %\doPDFreserveddictionaryobject{FDF}{docuextgstates}{\docuPDFextgstates}%
+ \doPDFdictionaryobject{FDF}{docuextgstates}{\docuPDFextgstates}%
+ \fi
+ \doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference
+ \doPDFpageresource{/ExtGState \PDFobjectreference}%
+ \fi}
+
+\appendtoksonce
+ \checkPDFextgstates
+\to \everyshipout
+
+\def\appendtoPDFdocumentextgstates#1%
+ {\xdef\docuPDFextgstates{\docuPDFextgstates\space#1}}
+
+%D Patterns (for tikz)
+
+\let\docuPDFpatterns\empty
+
+\def\checkPDFpatterns
+ {\ifx\docuPDFpatterns\empty \else
+ \ifnum\realpageno=\lastpage\relax
+ \doPDFdictionaryobject{FDF}{docupatterns}{\docuPDFpatterns}%
+ \fi
+ \doPDFgetobjectreference{FDF}{docupatterns}\PDFobjectreference
+ \doPDFpageresource{/Pattern \PDFobjectreference}%
+ \fi}
+
+\appendtoksonce
+ \checkPDFpatterns
+\to \everyshipout
+
+\def\appendtoPDFdocumentpatterns#1%
+ {\xdef\docuPDFpatterns{\docuPDFpatterns\space#1}}
+
+%D Another special mechanism (needed for color separation):
+
+\let\docuPDFcolorspaces\empty
+
+\def\checkPDFcolorspaces
+ {\ifx\docuPDFcolorspaces\empty \else
+ \ifnum\realpageno=\lastpage\relax
+ %\doPDFreserveddictionaryobject{FDF}{colorspaces}{\docuPDFcolorspaces}%
+ \doPDFdictionaryobject{FDF}{colorspaces}{\docuPDFcolorspaces}%
+ \fi
+ \doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference
+ \doPDFpageresource{/ColorSpace \PDFobjectreference}%
+ \fi}
+
+\appendtoksonce
+ \checkPDFcolorspaces
+\to \everyshipout
+
+\def\appendtoPDFdocumentcolorspaces#1%
+ {\xdef\docuPDFcolorspaces{\docuPDFcolorspaces\space#1}}
+
+%D And another one (used to be in spec-pdf)
+
+\let\docuPDFshades\empty
+
+\def\checkPDFshades
+ {\ifx\docuPDFshades\empty \else
+ \ifnum\realpageno=\lastpage\relax
+ %\doPDFreserveddictionaryobject{FDF}{docushades}{\docuPDFshades}%
+ \doPDFdictionaryobject{FDF}{docushades}{\docuPDFshades}%
+ \fi
+ \doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference
+ \doPDFpageresource{/Shading \PDFobjectreference}%
+ \fi}
+
+\appendtoksonce
+ \checkPDFshades
+\to \everyshipout
+
+\def\appendtoPDFdocumentshades#1%
+ {\xdef\docuPDFshades{\docuPDFshades\space#1}}
+
+%D \macros
+%D {doPDFsetupscreen,doPDFsetupidentity}
+%D
+%D Opposite to \DVI\ drivers, \PDF\ ones must know which what
+%D page dimensions they are dealing. We also use the
+%D opportunity to launch full screen (1) or show bookmarks (2).
+
+\let\currentPDFpagemode \empty % document catalog
+\let\currentPDFviewerprefs\empty % document catalog
+
+\let\currentPDFcropbox \empty % page attributes
+\let\currentPDFbleedbox \empty % page attributes
+\let\currentPDFartbox \empty % page attributes
+\let\currentPDFtrimbox \empty % page attributes
+
+\def\doPDFsetupscreen#1#2#3#4#5#6% watch the extra argument
+ {\bgroup
+% \!!widtha#4%
+% \advance\!!widtha#2%
+% \!!heighta-#5%
+% \!!heightb#1% extra argument
+% \advance\!!heightb -#3%
+% \advance\!!heighta \!!heightb
+% % sometimes whole values give better results
+% % \PointsToWholeBigPoints{#2}\left
+% % \PointsToWholeBigPoints\!!heighta\bottom
+% % \PointsToWholeBigPoints\!!widtha \width
+% % \PointsToWholeBigPoints\!!heightb\height
+% % but since pdf/x does not round when checking if
+% % the boxes fit inside the media box ...
+% \PointsToBigPoints{#2}\left
+% \PointsToBigPoints\!!heighta\bottom
+% \PointsToBigPoints\!!widtha \width
+% \PointsToBigPoints\!!heightb\height
+% \xdef\currentPDFcropboxspec
+% {[\left\space\bottom\space\width\space\height]}%
+% \global\let\currentPDFtrimboxspec\currentPDFcropboxspec
+%
+% \xdef\currentPDFpagemode
+% {/PageMode \ifcase#6
+% /UseNone\or/FullScreen\or/UseOutlines\else/UseNone\fi}%
+%
+ \xdef\currentPDFpagemode
+ {\ifnum#6=4
+ /PageLayout /TwoColumnRight
+ \else
+ /PageMode \ifcase#6
+ /UseNone\or/FullScreen\or/UseOutlines\else/UseNone\fi
+ \fi}%
+ \xdef\currentPDFviewerprefs % space after #6 needed, else \relax
+ {\ifcase#6 \or\or\else /ViewerPreferences << /FitWindow true >>\fi}%
+ \egroup}
+
+% not that good if we switch drivers
+
+\def\addPDFdocumentinfo
+ {\doPDFaddtocatalog{\currentPDFpagemode\currentPDFviewerprefs}%
+ \doPDFaddtocatalog{/Version /\PDFversion}%
+ \doPDFaddtoinfo{/Trapped /False}%
+ \doPDFaddtoinfo{/ConTeXt.Version (\contextversion)}%
+ \doPDFaddtoinfo{/ConTeXt.Time (\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute)}%
+ \doPDFaddtoinfo{/ConTeXt.Jobname (\jobname)}%
+ \doPDFaddtoinfo{/ConTeXt.Url (www.pragma-ade.com)}}
+
+\appendtoksonce % hack to prevent duplicates
+ \addPDFdocumentinfo
+\to \everyfirstshipout
+
+\ifx\pdfminorversion\undefined
+ \ifx\pdfoptionpdfminorversion\undefined
+ \newcount\pdfminorversion
+ \else
+ \let\pdfminorversion\pdfoptionpdfminorversion
+ \fi
+\fi
+
+\pdfminorversion=5
+
+\def\PDFversion{1.\number\pdfminorversion}
+
+\appendtoksonce
+ \def\PDFversion{1.\the\pdfminorversion}%
+ \let\addPDFdocumentinfo\relax
+\to \everyresetspecials
+
+\def\doPDFsetupwhateverbox#1#2#3#4#5#6% watch the extra arguments
+ {\bgroup
+ \!!widtha \dimexpr#5+#3\relax
+ \!!heightb\dimexpr#2-#4\relax
+ \!!heighta\dimexpr\!!heightb-#6\relax
+ % sometimes whole values give better results
+ % \PointsToWholeBigPoints{#3}\left
+ % \PointsToWholeBigPoints\!!heighta\bottom
+ % \PointsToWholeBigPoints\!!widtha \width
+ % \PointsToWholeBigPoints\!!heightb\height
+ % but since pdf/x does not round when checking if
+ % the boxes fit inside the media box ...
+ \PointsToBigPoints{#3}\left
+ \PointsToBigPoints\!!heighta\bottom
+ \PointsToBigPoints\!!widtha \width
+ \PointsToBigPoints\!!heightb\height
+ \xdef#1{[\left\space\bottom\space\width\space\height]}%
+ \egroup}
+
+\def\doPDFsetupartbox {\doPDFsetupwhateverbox\currentPDFartbox }
+\def\doPDFsetupcropbox {\doPDFsetupwhateverbox\currentPDFcropbox }
+\def\doPDFsetupbleedbox{\doPDFsetupwhateverbox\currentPDFbleedbox}
+\def\doPDFsetuptrimbox {\doPDFsetupwhateverbox\currentPDFtrimbox }
+
+\gdef\currentPDFtrimbox{\currentPDFcropbox} % default, needed for pdf/x
+
+\def\flushPDFwhateverbox#1#2%
+ {\doifsomething{#1}{\doPDFpageattribute{/#2Box #1}}}
+
+\def\flushPDFpageboxes
+ {\flushPDFwhateverbox\currentPDFartbox {Art}%
+ \flushPDFwhateverbox\currentPDFcropbox {Crop}%
+ \flushPDFwhateverbox\currentPDFbleedbox{Bleed}%
+ \flushPDFwhateverbox\currentPDFtrimbox {Trim}}
+
+\appendtoksonce
+ \flushPDFpageboxes
+\to \everyshipout
+
+% \def\doPDFsetupidentity#1#2#3#4#5#6%
+% {\bgroup
+% \enablePDFdocencoding
+% \edef\!!stringa{#5}%
+% \ifx\!!stringa\empty \ifx\pdfdate\undefined\else
+% \edef\!!stringa{D:\pdfdate}%
+% \fi \fi
+% \expanded{\doPDFaddtoinfo
+% {/Title (#1)
+% /Subject (#2)
+% /Author (#3)
+% /Creator (#4)
+% /ModDate (\!!stringa)
+% /ID (\jobname.\!!stringa) % needed for pdf/x
+% /Keywords (#6)}}%
+% \egroup}
+
+\def\doPDFsetupidentity#1#2#3#4#5#6%
+ {\bgroup
+ \enablePDFdocencoding
+ \sanitizePDFencoding#1\to\idtitle \stripstring\idtitle
+ \sanitizePDFencoding#2\to\idsubject\stripstring\idsubject
+ \sanitizePDFencoding#3\to\idauthor \stripstring\idauthor
+ \sanitizePDFencoding#4\to\idcreator\stripstring\idcreator
+ \sanitizePDFencoding#6\to\idkeyword\stripstring\idkeyword
+ \expanded{\doPDFaddtoinfo
+ {/Title \ifPDFunicode<\idtitle >\else(\idtitle )\fi
+ /Subject \ifPDFunicode<\idsubject>\else(\idsubject)\fi
+ /Author \ifPDFunicode<\idauthor >\else(\idauthor )\fi
+ /Creator \ifPDFunicode<\idcreator>\else(\idcreator)\fi
+ /ModDate (#4)
+ /ID (\jobname.#5) % needed for pdf/x
+ /Keywords \ifPDFunicode<\idkeyword>\else(\idkeyword)\fi}}%
+ \egroup}
+
+%D \macros
+%D {doPDFsetupopenaction,doPDFsetupcloseaction,
+%D doPDFsetupopenpageaction,doPDFsetupclosepageaction}
+%D
+%D Setting the open and close actions is kind of fuzzy
+%D because action chains are derived from the reference
+%D mechanism.
+
+%D Starting with version~5 viewers, when the open actions
+%D started yto give problems, for testing purposes we
+%D decided use indirect actions.
+
+% \definespecial\dosetupopenaction {\doPDFsetupopenaction}
+% \definespecial\dosetupcloseaction {\doPDFsetupcloseaction}
+% \definespecial\dosetupopenpageaction {\doPDFsetupopenpageaction}
+% \definespecial\dosetupclosepageaction{\doPDFsetupclosepageaction}
+
+\let\lastPDFaction\empty
+
+%D We can safe a couple of references by moving this code
+%D to the specific drivers.
+%D
+%D The following code used to work okay, but as with any
+%D update of Acrobat Viewers, upward compatibility was
+%D just a dream.
+
+\definespecial\dosetupopenaction {\doPDFaddtocatalog{/OpenAction <<\lastPDFaction>>}}
+\definespecial\dosetupcloseaction{\doPDFaddtocatalog{/CloseAction <<\lastPDFaction>>}}
+
+% todo: /AA << dictionary in catalog >>
+
+% \globalletempty\PDFdocumentclose
+% \globalletempty\PDFwillsave
+% \globalletempty\PDFdidsave
+% \globalletempty\PDFwillprint
+% \globalletempty\PDFdidprint
+
+% \definespecial\dosetupdocumentcloseaction {\global\let\PDFdocumentclose\lastPDFaction}
+% \definespecial\dosetupwillsaveaction {\global\let\PDFwillsave \lastPDFaction}
+% \definespecial\dosetupdidsaveaction {\global\let\PDFdidsave \lastPDFaction}
+% \definespecial\dosetupwillprintaction {\global\let\PDFwillprint \lastPDFaction}
+% \definespecial\dosetupdidprintaction {\global\let\PDFdidprint \lastPDFaction}
+
+% \def\checkPDFdocumentactions
+% {\iflocation
+% \doPDFpageattribute
+% {/AA <<\ifx\PDFdocumentclose\empty \else /DC <<\PDFdocumentclose>> \fi
+% \ifx\PDFwillsave \empty \else /WS <<\PDFwillsave >> \fi
+% \ifx\PDFdidsave \empty \else /DS <<\PDFdidsave >> \fi
+% \ifx\PDFwillprint \empty \else /WP <<\PDFwillprint >> \fi
+% \ifx\PDFdidprint \empty \else /DP <<\PDFdidprint >> \fi>>}%
+% % \globalletempty\PDFdocumentclose
+% % \globalletempty\PDFwillsave
+% % \globalletempty\PDFdidsave
+% % \globalletempty\PDFwillprint
+% % \globalletempty\PDFdidprint
+% \global\let\checkPDFdocumentactions\relax
+% \fi}
+
+% \appendtoksonce
+% \checkPDFdocumentactions
+% \to \everylastshipout
+
+%\def\doPDFsetupopenaction%
+% {\doPDFdictionaryobject{FDF}{local:openaction}\lastPDFaction
+% \doPDFgetobjectreference{FDF}{local:openaction}\PDFobjectreference
+% \doPDFaddtocatalog{/OpenAction \PDFobjectreference}}
+%
+%\def\doPDFsetupcloseaction%
+% {\doPDFdictionaryobject{FDF}{local:closeaction}\lastPDFaction
+% \doPDFgetobjectreference{FDF}{local:closeaction}\PDFobjectreference
+% \doPDFaddtocatalog{/CloseAction \PDFobjectreference}}
+
+\let\PDFopenpageaction \empty
+\let\PDFclosepageaction\empty
+
+\definespecial\dosetupopenpageaction {\global\let\PDFopenpageaction \lastPDFaction}
+\definespecial\dosetupclosepageaction{\global\let\PDFclosepageaction\lastPDFaction}
+
+\def\checkPDFpageactions
+ {\iflocation % important since direct -)
+ \donefalse
+ \ifx\PDFopenpageaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi
+ \ifx\PDFclosepageaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi
+ \ifdone
+ \doPDFpageattribute
+ {/AA <<\if!!donea/O <<\PDFopenpageaction >> \fi
+ \if!!doneb/C <<\PDFclosepageaction>> \fi>>}%
+ \fi
+ \global\let\PDFopenpageaction \empty
+ \global\let\PDFclosepageaction\empty
+ \fi}
+
+\appendtoksonce
+ \checkPDFpageactions
+\to \everyshipout
+
+%D \macros
+%D {doPDFstartthisislocation}
+%D
+%D Next we define the macros that deal with hyperreferencing,
+%D graphic inclusion and general document features. These are
+%D the olderst ones. I won't comment much because one needs
+%D knowledge of \PDF\ itself, and explaning \PDF\ is beyond
+%D this documentation.
+
+\def\doPDFstartthisislocation#1%
+ {\bgroup
+ \setPDFdestination{#1}%
+ \ifx\PDFdestination\empty \else
+ \doPDFdestination{\PDFdestination}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {doPDFstartgotolocation,
+%D doPDFstartgotorealpage,
+%D doPDFstartgotoJS}
+%D
+%D The goto macros use the switch \type{\ifsecondaryreference}
+%D to determine if actions should be linked.
+
+\def\locationfilesuffix{pdf}
+
+% \def\preparePDFlocationfile#1#2%
+% {\setreferencefilename#1\to#2%
+% \expanded{\doifnotinstring{.\locationfilesuffix}{#2}}
+% {\edef#2{#2.\locationfilesuffix}}}
+%
+% \def\preparePDFlocationfile#1\to#2%
+% {\setreferencefilename#1\to#2%
+% \expanded{\doifnotinstring{.pdf}{#2}}{\edef#2{#2.pdf}}}
+
+\def\doPDFstartgotolocation#1#2#3#4#5#6%
+ {\bgroup
+ \doifelsenothing{#3}
+ {\setPDFdestination{#5}%
+ \doifelsenothing\PDFdestination
+ {\let\action\empty}
+ {\doifelsenothing{#4}
+ {\let\PDFfile\empty}
+ {\expanded{\beforesplitstring#4}\at.\to\PDFfile
+ \doifparentfileelse\PDFfile % {#4}
+ {\let\PDFfile\empty}
+ %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile
+ {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile
+ \edef\PDFfile
+ {R /F (\PDFfile)\ifgotonewwindow\space/NewWindow true \fi}}}%
+ \edef\action%
+ {/S /GoTo\PDFfile\space /D (\PDFdestination)}}}
+ {\doifelsenothing{#4}
+ {\let\PDFfile\empty
+ \let\PDFdestination\empty}
+ {\setreferencefilename/#4\to\PDFfile
+ \setPDFdestination{#5}%
+ \doifsomething\PDFdestination
+ {\edef\PDFdestination{\URLhash\PDFdestination}}}%
+ \edef\action{/S /URI /URI (#3\PDFfile\PDFdestination)}}%
+ \ifx\action\empty\else
+ \ifsecondaryreference
+ \savesecondaryPDFreference\action
+ \else
+ \getsecondaryPDFreferences
+ \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
+ \fi
+ \fi
+ \egroup}
+
+\def\PDFgotonewwindow{\ifgotonewwindow\space/NewWindow true \fi}
+
+% optimization in tpd driver
+%
+% \edef\PDFdestination{(page:\the\scratchcounter)}%
+%
+% ==>
+%
+% \advance\scratchcounter 1
+% \edef\PDFdestination{[\pdfpageref \PDFobjref\scratchcounter\PDFpageviewwrd]}%
+%
+% \doPDFgetpagedestination#1#2% pagenumber macro % % fuzzy hack
+
+\def\doPDFstartgotorealpage#1#2#3#4#5% watch the R append trick
+ {\bgroup
+ \doifelsenothing{#3}% #1 = url
+ {\scratchcounter0#5\relax
+ \ifnum\scratchcounter>0
+ \doifelsenothing{#4}
+ {\let\PDFfile\empty}
+ {\expanded{\beforesplitstring#4}\at.\to\PDFfile
+ \doifparentfileelse\PDFfile % {#4}
+ {\let\PDFfile\empty}
+ %{\setreferencefilename#4.\locationfilesuffix\to\PDFfile
+ {\@EA\setreferencefilename\PDFfile.\locationfilesuffix\to\PDFfile
+ \edef\PDFfile{R /F (\PDFfile)\PDFgotonewwindow}}}%
+ \ifx\PDFfile\empty
+ \ifcase\overcomePDFpage
+ \or % pdf starts numbering at zero
+ \advance\scratchcounter \minusone
+ \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}%
+ \or % pdf starts numbering at zero
+ \advance\scratchcounter \minusone
+ \edef\PDFdestination{(page:\the\scratchcounter)}%
+ \or % pdftex starts numbering at one
+ \edef\PDFdestination{[\pdfpageref\scratchcounter\space0 R \PDFpageviewwrd]}%
+ \fi
+ \else % across files it's a page number / pdf starts numbering at zero
+ \advance\scratchcounter \minusone
+ \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}%
+ \fi
+ \edef\action{/S /GoTo\PDFfile\space /D \PDFdestination}%
+ \else
+ \let\action\empty
+ \fi}
+ {\doifelsenothing{#4}
+ {\let\PDFfile\empty}
+ {\setreferencefilename/#4\to\PDFfile}%
+ \edef\action{/S /URI /URI (#3\PDFfile)}}%
+ \ifx\action\empty\else
+ \ifsecondaryreference
+ \savesecondaryPDFreference\action
+ \else
+ \getsecondaryPDFreferences
+ \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
+ \fi
+ \fi
+ \egroup}
+
+\let\lastfakedPDFpage\!!zerocount
+
+\def\fakePDFpagedestination % as in pdf, we start numbering at zero
+ {\iflocation \ifarrangingpages \else \ifnum\overcomePDFpage=\plustwo
+ \ifnum\lastfakedPDFpage<\realpageno
+ \bgroup
+ \xdef\lastfakedPDFpage{\realfolio}%
+ \advance\realpageno \minusone % is \expanded needed ?
+ \expanded{\doPDFdestination{page:\realfolio}}%
+ \egroup
+ \fi
+ \fi \fi \fi}
+
+\appendtoksonce
+ \fakePDFpagedestination
+\to \everyshipout
+
+\def\doPDFstartgotoJS#1#2#3%
+ {\bgroup
+ \doPSsanitizeJScode#3\to\sanitizedJScode
+ \edef\action
+ {/S /JavaScript /JS (\sanitizedJScode)}%
+ \ifsecondaryreference
+ \savesecondaryPDFreference\action
+ \else
+ \getsecondaryPDFreferences
+ \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {doPDFstartexecutecommand}
+%D
+%D At the cost of much auxiliary placeholders, we can pretty
+%D fast convert the command asked for. This is how the \PDF\
+%D code looks like.
+
+\def\PDFmoviecode#1#2#3%
+ {/Movie
+ /T (\ifcase#1movie \else sound \fi\ifx\argumentA\empty#2\else\argumentA\fi)
+ /Operation /\ifcase#3Play\or Stop\or Pause\or Resume\fi\space}
+
+\def\PDFexecutestartmovie {\PDFmoviecode0\currentmovie0}
+\def\PDFexecutestopmovie {\PDFmoviecode0\currentmovie1}
+\def\PDFexecutepausemovie {\PDFmoviecode0\currentmovie2}
+\def\PDFexecuteresumemovie {\PDFmoviecode0\currentmovie3}
+
+\def\PDFexecutestartsound {\PDFmoviecode1\currentsound0}
+\def\PDFexecutestopsound {\PDFmoviecode1\currentsound1}
+\def\PDFexecutepausesound {\PDFmoviecode1\currentsound2}
+\def\PDFexecuteresumesound {\PDFmoviecode1\currentsound3}
+
+\def\PDFformcode#1%
+ {\doFDFiffieldset{#1}{/Field [\doFDFgetfieldset{#1}]}}
+
+% bit 3 = html
+% bit 6 = xml
+% bit 4 = get
+
+\ifx\PDFsubmitfiller\undefined \let\PDFsubmitfiller\empty \fi
+
+\chardef\PDFformmethod=1 % 0=GET 1=POST
+
+\def\PDFformflag#1#2{\ifcase\PDFformmethod#1\else#2\fi}
+
+\def\PDFexecuteimportform {/Named /N /AcroForm:ImportFDF}
+\def\PDFexecuteexportform {/Named /N /AcroForm:ExportFDF}
+\def\PDFexecuteresetform {/ResetForm \PDFformcode\argumentA}
+\def\PDFexecutesubmitform {/SubmitForm \PDFformcode\argumentB
+ /Flags \ifcase\submitoutputformat\space
+ \PDFformflag{12} {4} % 0=unknown
+ \or \PDFformflag{12} {4} % 1=HTML
+ \or \PDFformflag {8} {0} % 2=FDF
+ \or \PDFformflag{40}{32} % 3=XML
+ \else \PDFformflag{12} {4} % ?=unknown
+ \fi
+ /F (\argumentA)\PDFsubmitfiller}
+
+% urifill permits url substitution
+
+\def\PDFexecutehide {/Hide /T (\argumentA) /H true}
+\def\PDFexecuteshow {/Hide /T (\argumentA) /H false}
+
+\def\PDFexecutefirst {/Named /N /FirstPage}
+\def\PDFexecuteprevious {/Named /N /PrevPage}
+\def\PDFexecutenext {/Named /N /NextPage}
+\def\PDFexecutelast {/Named /N /LastPage}
+\def\PDFexecutebackward {/Named /N /GoBack}
+\def\PDFexecuteforward {/Named /N /GoForward}
+\def\PDFexecuteprint {/Named /N /Print}
+\def\PDFexecuteexit {/Named /N /Quit}
+\def\PDFexecuteclose {/Named /N /Close}
+\def\PDFexecutesave {/Named /N /Save}
+\def\PDFexecutesavenamed {/Named /N /SaveAs}
+\def\PDFexecuteopennamed {/Named /N /Open}
+\def\PDFexecutehelp {/Named /N /HelpUserGuide}
+\def\PDFexecutetoggle {/Named /N /FullScreen}
+\def\PDFexecutesearch {/Named /N /Find}
+\def\PDFexecutesearchagain {/Named /N /FindAgain}
+\def\PDFexecutegotopage {/Named /N /GoToPage}
+\def\PDFexecutequery {/Named /N /AcroSrch:Query}
+\def\PDFexecutequeryagain {/Named /N /AcroSrch:NextHit}
+\def\PDFexecutefitwidth {/Named /N /FitWidth}
+\def\PDFexecutefitheight {/Named /N /FitHeight}
+
+\let\PDFobjectclass\empty
+\let\PDFobjectname \empty
+
+\def\doPDFstartexecutecommand#1#2#3#4%
+ {\doifdefined{PDFexecute#3}
+ {\bgroup
+ \edef\argument{#4}%
+ \ifx\argument\empty
+ \let\argumentA\empty
+ \let\argumentB\empty
+ \else
+ \@EA\dogetcommalistelement\@EA1\@EA\from#4\to\argumentA
+ \@EA\dogetcommalistelement\@EA2\@EA\from#4\to\argumentB
+ \fi
+ \edef\action%
+ {/S \getvalue{PDFexecute#3}}%
+ \ifsecondaryreference
+ \savesecondaryPDFreference\action
+ \else
+ \getsecondaryPDFreferences
+% \ifx\PDFobjectclass\empty
+% \let\next\doPDFaction
+% \else
+% \edef\next{\doPDFactionobject{\PDFobjectclass}{\PDFobjectname}}%
+% \globalletempty\PDFobjectclass
+% \globalletempty\PDFobjectname
+% \fi
+% \next
+ \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
+ \fi
+ \egroup}}
+
+%D \macros
+%D {doPDFstartrunprogram}
+%D
+%D Running programs is possible, but is non that portable, and
+%D therefore dangerous.
+
+\def\doPDFstartrunprogram#1#2#3#4% new: #3 => #3#4
+ {\bgroup
+ %\edef\string{#3}%
+ %\@EA\beforesplitstring\string\at{ }\to\program
+ %\@EA\aftersplitstring \string\at{ }\to\parameters
+ %\edef\action%
+ % {/S /Launch /F (\program) /P (\parameters) /D (.)}%
+ \edef\action
+ {/S /Launch /F (#3) /P (#4) /D (.)}%
+ \ifsecondaryreference
+ \savesecondaryPDFreference\action
+ \else
+ \getsecondaryPDFreferences
+ \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {doPDFstartgotoprofile}
+%D
+%D Far from perfect, but nevertheless present, is the profile
+%D handler. We want to misuse article threads for reder
+%D profiles.
+
+\def\doPDFstartgotoprofile#1#2#3% to be done: file
+ {\bgroup
+ \setPDFdestination{#3}%
+ \doifsomething\PDFdestination
+ {\edef\action
+ {/S /Thread /D (\PDFdestination)}%
+ \ifsecondaryreference
+ \savesecondaryPDFreference\action
+ \else
+ \getsecondaryPDFreferences
+ \doPDFaction{\PDFswapdir#1}{#2}{\action \secondaryPDFreferences}%
+ \fi}%
+ \egroup}
+
+%D \macros
+%D {doPDFsetpagetransition}
+%D
+%D This array holds a reasonable selection of transitions
+%D (watch out: \type{replace} is not in this list). Most of
+%D the transitions look awful anyway. By the way, \CONTEXT\ is
+%D able to select transitions randomly.
+
+% some day, when 1.5 is on linux and apple, we will add:
+%
+% \def\pagetransitions
+% {{split,in,vertical},{split,in,horizontal},
+% {split,out,vertical},{split,out,horizontal},
+% {blinds,horizontal},{blinds,vertical},
+% {box,in},{box,out},
+% {wipe,east},{wipe,west},{wipe,north},{wipe,south},
+% dissolve,
+% {glitter,east},{glitter,south},
+% {fly,in,east},{fly,in,west},{fly,in,north},{fly,in,south},
+% {fly,out,east},{fly,out,west},{fly,out,north},{fly,out,south},
+% {push,east},{push,west},{push,north},{push,south},
+% {cover,east},{cover,west},{cover,north},{cover,south},
+% {uncover,east},{uncover,west},{uncover,north},{uncover,south},
+% fade}
+
+\def\pagetransitions
+ {{split,in,vertical},{split,in,horizontal},
+ {split,out,vertical},{split,out,horizontal},
+ {blinds,horizontal},{blinds,vertical},
+ {box,in},{box,out},
+ {wipe,east},{wipe,west},{wipe,north},{wipe,south},
+ dissolve,
+ {glitter,east},{glitter,south}}
+
+%D Again, we use macros as placeholders for \PDF\ key||value
+%D pairs.
+
+\def\PDFpagesplit {/S /Split }
+\def\PDFpageblinds {/S /Blinds }
+\def\PDFpagebox {/S /Box }
+\def\PDFpagewipe {/S /Wipe }
+\def\PDFpagedissolve {/S /Dissolve }
+\def\PDFpageglitter {/S /Glitter }
+\def\PDFpagereplace {/S /R }
+
+\def\PDFpagefly {/S /Fly } % 1.5
+\def\PDFpagepush {/S /Push } % 1.5
+\def\PDFpagecover {/S /Cover } % 1.5
+\def\PDFpageuncover {/S /Uncover } % 1.5
+\def\PDFpagefade {/S /Fade } % 1.5
+
+\def\PDFpagehorizontal {/Dm /H }
+\def\PDFpagevertical {/Dm /V }
+\def\PDFpagein {/M /I }
+\def\PDFpageout {/M /O }
+\def\PDFpageeast {/Di 0 }
+\def\PDFpagenorth {/Di 90 }
+\def\PDFpagewest {/Di 180 }
+\def\PDFpagesouth {/Di 270 }
+
+\def\dodoPDFsetpagetransition#1%
+ {\doifdefined{PDFpage#1}
+ {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}}
+
+\def\doPDFsetpagetransition#1#2%
+ {\let\PDFpagetransitions\empty
+ \processcommalist[#1]\dodoPDFsetpagetransition
+ \doPDFpageattribute
+ %{\ifnum#2>0 /Dur #2 \fi
+ {\ifnum0<0#2 /Dur #2 \fi
+ \ifx\PDFpagetransitions\empty\else/Trans <<\PDFpagetransitions>>\fi}}
+% \ifx\PDFpagetransitions\empty\else/Trans <</Type /Trans \PDFpagetransitions>>\fi}}
+
+%D \macros
+%D {doPDFinsertmov}
+%D
+%D Most of the annotations we use here are of type {\em
+%D link}, but here is another one: the {\em movie} annotation.
+%D The driver module must implement \type {setcurrentmovie}.
+
+%D Great: this will become an obsolete pdf feature; why did we have to
+%D keep up with the bugs ... and by the time acrobat gets better in
+%D handling it have to drop it.
+
+\let\currentmovie\s!unknown
+
+\def\doPDFinsertmov
+ {\bgroup
+ \xdef\currentmovie{\@@DriverImageLabel}%
+ \PointsToBigPoints\@@DriverImageWidth \width
+ \PointsToBigPoints\@@DriverImageHeight\height
+ \let\pdf@@options\empty
+ \let\pdf@@actions\empty
+ \donefalse
+ \expanded{\processallactionsinset[\@@DriverImageOptions]}
+ [\v!controls=>\donetrue,
+ \v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat },
+ \v!preview=>\edef\pdf@@options{\pdf@@options /Poster true }]%
+ \edef\pdf@@actions{\pdf@@actions /ShowControls \ifdone true\else false\fi}%
+ \doPDFannotation\@@DriverImageWidth\@@DriverImageHeight
+ {/Subtype /Movie
+ /Border [0 0 0]
+ /T (movie \currentmovie)
+ /Movie << /F (\@@DriverImageFile) /Aspect [\width\space\height] \pdf@@options >>
+ /A << \pdf@@actions >>}%
+ \egroup}
+
+%D \macros
+%D {doPDFinsertsoundtrack}
+%D
+%D In \PDF\ sounds can be embedded like movies.
+
+\ifx\everygoto\undefined \newtoks\everygoto \fi
+
+\let\currentsound\s!unknown
+
+\def\doPDFinsertsoundtrack#1#2#3%
+ {\bgroup
+ \xdef\currentsound{#2}%
+ \let\pdf@@actions\empty
+ \@EA\processallactionsinset\@EA
+ [#3]
+ [\v!repeat=>\edef\pdf@@actions{\pdf@@actions /Mode /Repeat }]%
+ \collectdriverresource
+ %\flushatshipout % since it can be buried in a chained box
+ {\doPDFannotation{0pt}{0pt}
+ {/Subtype /Movie
+ /Border [0 0 0]
+ /T (sound \currentsound)
+ /Movie <</F (#1)>>%
+ \ifx\pdf@@actions\empty\else/A << \pdf@@actions >>\fi}}%
+ \egroup}
+
+%D \macros
+%D {doPDFattachfile}
+
+\def\doPDFfilestreamobject#1#2#3#4%
+ {}
+
+\def\doPDFfilestreamidentifier#1%
+ {0}
+
+\def\doPDFgetfilestreamreference#1#2%
+ {0 0 R}
+
+\def\doPDFattachfile#1#2#3#4#5#6#7#8%
+ {\bgroup % title width height color symbol file
+ \edefconvertedargument\PDFfile{#8}%
+ % beware: the symbol may (indirectly) use the file
+ % reference when typesetting the object number;
+ \presetPDFsymbolappearance{#5}{#6}{#2}{#3}{#4}% sets width/height
+ \startPDFsymbolappearance
+ \doPDFembedfile\PDFfile{#7}{#8}%
+ \doPDFgetembeddedfilereference\PDFfile\PDFobjectreference
+ \setFDFlayer\@@DriverAttachmentLayer
+ \doPDFannotation{\width}{\totalheight}
+ {/Subtype /FileAttachment
+ /FS \PDFobjectreference\space
+ /Contents (#1)
+ \PDFsymbol
+ \FDFlayer
+ \PDFattributes}%
+ \stopPDFsymbolappearance
+ \egroup}
+
+% semi-public
+
+\def\doPDFembedfile#1#2#3% symbolic name | filename | user name
+ {\edefconvertedargument\PDFfile{#1}%
+ \doifnotflagged{a:\PDFfile}%
+ {\doPDFfilestreamobject{PDFEF}{\PDFfile}{#2}{#3}%
+ \doglobal\setflag{a:\PDFfile}}}
+
+\def\doPDFgetembeddedfilereference#1#2%
+ {\edefconvertedargument\PDFfile{#1}%
+ \doPDFgetobjectreference{PDFEF}\PDFfile#2}
+
+\def\doPDFgetembeddedfilestreamreference#1#2%
+ {\edefconvertedargument\PDFfile{#1}%
+ \doPDFgetfilestreamreference\PDFfile#2} % == \doPDFgetobjectreference{PDFFS}\PDFfile#2
+
+\definespecial \doattachfile {\doPDFattachfile}
+
+% requested by Jens-Uwe Morawski: permits usage of pdftosrc
+% in viewers that don't support attachments:
+%
+% \definesymbol
+% [ObjectNumber]
+% % [object number {\PDFattachmentnumber[xx]}] % named
+% [object number \PDFattachmentnumber] % current
+%
+% \useattachment[test][xx][test.tex]
+% \setupattachments[symbol=ObjectNumber]
+% \attachment[test]
+
+\def\PDFattachmentnumber
+ {\dosingleargument\doPDFattachmentnumber}
+
+\def\doPDFattachmentnumber[#1]%
+ {\iffirstargument
+ \doPDFfilestreamidentifier{#1}%
+ \else
+ \doPDFfilestreamidentifier\PDFfile
+ \fi}
+
+%D \macros
+%D {...}
+%D
+%D Rather preliminary. We have to wait till the complete specs
+%D show up. As usual, we cannot really check it (Acrobat 6.0
+%D has a bug that inhibits us to make a test file). Half a day
+%D of testing made clear that trying to control the plugin fails
+%D in most cases (we need plugin specs -). We also miss a feature
+%D to let acrobat wait with proceeding (action processing) till
+%D the media clip is ready.
+
+% aiff audio/aiff
+% au audio/basic
+% avi video/avi
+% mid audio/midi
+% mov video/quicktime
+% mp3 audio/x-mp3 (mpeg)
+% mp4 audio/mp4
+% mp4 video/mp4
+% mpeg video/mpeg
+% smil application/smil
+% swf application/x-shockwave-flash
+
+% beware, this is preliminary code, should be improved
+
+\def\PDFrenderingspecs#1{\executeifdefined{PDFMR:#1}\empty}
+
+\def\PDFexecutestartrendering {/Rendition /OP 0 \PDFrenderingspecs\argumentA}
+\def\PDFexecutestoprendering {/Rendition /OP 1 \PDFrenderingspecs\argumentA}
+\def\PDFexecutepauserendering {/Rendition /OP 2 \PDFrenderingspecs\argumentA}
+\def\PDFexecuteresumerendering {/Rendition /OP 3 \PDFrenderingspecs\argumentA}
+
+% todo : sub files
+%
+% \doPDFembedfile{pier-39.png}{pier-39.png}{pier-39.png}%
+% \doPDFgetembeddedfilestreamreference{pier-39.png}\xPDFobjectreference
+% \edef\xxxx{/RF [(pier-39.png) \xPDFobjectreference]}%
+
+% todo: alternative renderings
+%
+% object_1 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >>
+% object_2 -> <</Type /Rendition /S /MR /C << /Type /MediaClip ... >> >>
+%
+% rendering -> <</Type /Rendition /S /MS [objref_1 objref_2]>>
+
+% todo: embedded files (too buggy)
+%
+% \let\PDFattribute\empty
+% % /D \PDFobjectreference
+% % test one, no error, but ignored
+% \doifinset\v!file{#4}
+% {\doPDFembedfile{#3}{#3}{#3}%
+% \doPDFgetembeddedfilestreamreference{#3}\PDFobjectreference
+% \edef\PDFattribute{/EF \PDFobjectreference}}%
+% % official, does not work either
+% \doifinset\v!file{#4}
+% {\doPDFembedfile{#3}{#3}{#3}%
+% \doPDFgetembeddedfilereference{#3}\PDFobjectreference}
+% % do we play the game as follows
+
+\definespecial\doinsertrendering#1#2#3#4% tag mime file options
+ {\ifundefined{PDFMR:#1}%
+ \doifinstringelse{://}{#3}\donetrue\donefalse % evt url as keyword
+ \doPDFdictionaryobject{PDFMF}{#1}
+ {/Type /Rendition
+ /S /MR
+ % does not work: /SP << /Type /MediaScreenParam /BE << /B [1 0 0] /O 0.5 >> >>
+ /C << /Type /MediaClip
+ /S /MCD
+ /N (#1)
+ /Alt [() (file not found)] % language id + message
+ /D << /Type /Filespec
+ /F (#3)
+ \ifdone/FS /URL\fi >>
+ /CT (#2) >>}%
+ % common code
+ \doifobjectreferencefoundelse{PDFMS}{#1}
+ {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB}
+ {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}%
+ \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA
+ \setxvalue{PDFMR:#1}% needed /AA actions in /Screen
+ {/R \PDFobjectreferenceA
+ /AN \PDFobjectreferenceB}%
+ \doifobjectreferencefoundelse{PDFMS}{#1}\donothing
+ {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}%
+ \fi}
+
+\definespecial\doinsertrenderingobject#1#2#3#4% tag class objectname options
+ {\ifundefined{PDFMR:#1}%
+ \doPDFgetobjectreference{#2}{#3}\PDFobjectreference
+ \doPDFdictionaryobject{PDFMF}{#1}
+ {/Type /Rendition
+ /S /MR
+ /C << /Type /MediaClip
+ /S /MCD
+ /N (#1)
+ /D \PDFobjectreference>>}%
+ % common code
+ \doifobjectreferencefoundelse{PDFMS}{#1}
+ {\doPDFgetobjectreference{PDFMS}{#1}\PDFobjectreferenceB}
+ {\doPDFgetobjectreference{PDFMU}{#1}\PDFobjectreferenceB}%
+ \doPDFgetobjectreference{PDFMF}{#1}\PDFobjectreferenceA
+ \setxvalue{PDFMR:#1}% needed /AA actions in /Screen
+ {/R \PDFobjectreferenceA
+ /AN \PDFobjectreferenceB}%
+ \doifobjectreferencefoundelse{PDFMS}{#1}\donothing
+ {\dodoinsertrenderingwindow{PDFMU}{#1}\zeropoint\zeropoint{#4}}%
+ \fi}
+
+\definespecial\doinsertrenderingwindow
+ {\dodoinsertrenderingwindow{PDFMS}}
+
+\def\dodoinsertrenderingwindow#1#2#3#4#5%
+ {\vbox to #4 \bgroup
+ \checkPDFscreenactions{#2}{#5}%
+ \doPDFgetobjectpagereference{PDFMF}{#2}\PDFobjectreferenceA
+ \doPDFgetobjectreference {PDFMF}{#2}\PDFobjectreferenceB
+ \vss
+ \hbox to #3 \bgroup
+ \doPDFannotationobject{#1}{#2}{#3}{#4}
+ {/Subtype /Screen
+ /P \PDFobjectreferenceA
+ /A \PDFobjectreferenceB
+ \PDFattributes
+ /Border [0 0 0]}%
+ \hss
+ \egroup
+ \egroup}
+
+\global\let\PDFrenderingopenpageaction \empty
+\global\let\PDFrenderingclosepageaction\empty
+
+\def\checkPDFscreenactions#1#2%
+ {\let\PDFattributes\empty
+ \iflocation % important since direct -)
+ % the action can either (already) be set by the window handler
+ % or (normally when no window [i.e a zero dimensions one] is present) by keyword
+ \doifinset\v!auto{#2}
+ {% brrr, here instead of in navigation module, must move and become special
+ % now two sided dependency
+ \let\checkrendering\gobbleoneargument
+ \ifx\PDFrenderingopenpageaction \empty
+ \handlereferenceactions{\v!StartRendering{#1}}\dosetuprenderingopenpageaction
+ \fi
+ \ifx\PDFrenderingclosepageaction\empty
+ \handlereferenceactions{\v!StopRendering {#1}}\dosetuprenderingclosepageaction
+ \fi
+ }%
+ \donefalse
+ \ifx\PDFrenderingopenpageaction \empty\!!doneafalse\else\donetrue\!!doneatrue\fi
+ \ifx\PDFrenderingclosepageaction\empty\!!donebfalse\else\donetrue\!!donebtrue\fi
+ \ifdone
+ \edef\PDFattributes
+ {/AA <<\if!!donea/PO <<\PDFrenderingopenpageaction >> \fi
+ \if!!doneb/PC <<\PDFrenderingclosepageaction>> \fi>>}%
+ \fi
+ \global\let\PDFrenderingopenpageaction \empty
+ \global\let\PDFrenderingclosepageaction\empty
+ \fi}
+
+\definespecial\dosetuprenderingopenpageaction {\global\let\PDFrenderingopenpageaction \lastPDFaction}
+\definespecial\dosetuprenderingclosepageaction{\global\let\PDFrenderingclosepageaction\lastPDFaction}
+
+%D \macros
+%D {doPDFinsertbookmark}
+%D
+%D Well, here is the dreadfull bookmark, rather useless because
+%D only standard encoding is possible, no typography is done,
+%D and a maximum of 32~characters is advized.
+
+\def\doPDFinsertbookmark#1#2#3#4#5% level sublevels text page open=1
+ {\bgroup
+ \sanitizePDFencoding#3\to\bookmarktext % uses scratchcounter
+ \stripstring\bookmarktext
+ \doPDFbookmark{#1}{#2}{\bookmarktext}{#4}{#5}%
+ \egroup}
+
+%D The next section of this module is dedicated to form
+%D support. These macros are complicated by the fact that
+%D cloning is possible.
+
+%D \macros
+%D {FDFflag...,FDFplus...}
+%D
+%D The \type{/FT} key determines the type of field: text,
+%D button or choice. The latter two come in several disguises,
+%D which are set by flipping bits in the \type{/Ff}. Other bits
+%D are used to set states. Personally I hate this bitty way of
+%D doing things. The next six bit determine the field sub type:
+
+\def\FDFflagMultiLine {4096} % 13
+\def\FDFflagNoToggleToOff {16384} % 15
+\def\FDFflagRadio {32768} % 16 (not used as such)
+\def\FDFflagPushButton {65536} % 17
+\def\FDFflagPopUp {131072} % 18
+\def\FDFflagEdit {262144} % 19
+
+% bugged anyway, so we need to drop it:
+
+\def\FDFflagRadiosInUnison {33554432} % 26
+
+%D A few more (pdf 1.4) flags, what the spell check one: for
+%D obscure reasons for Adobe downward compatibility means
+%D enabling features that harm old applications like testing.
+
+\def\FDFflagDoNotSpellCheck {4194304} % 23
+\def\FDFflagDoNotScroll {8388608} % 24
+
+%D The next bits (watch how strange the bits are organized)
+%D take care of the states:
+
+\def\FDFflagReadOnly {1} % 1
+\def\FDFflagRequired {2} % 2
+\def\FDFflagNoExport {4} % 3
+\def\FDFflagPassword {8192} % 14
+\def\FDFflagSort {524288} % 20
+\def\FDFflagFileSelect {1048576} % 21
+
+%D There is a second, again bitset oriented, \type{/F} flag:
+
+\def\FDFplusInvisible {1} % 1
+\def\FDFplusHidden {2} % 2
+\def\FDFplusPrintable {4} % 3
+
+%def\FDFplusNoView {32} % 6
+%def\FDFplusToggleNoView {256} % 9
+
+\def\FDFplusAutoView {256} % {288} % 6+9
+
+%D \macros
+%D {setFDFswitches}
+%D
+%D The non||type bits are mapped onto user||interface
+%D swithes, to be used later on:
+
+\def\@@FDFflag{FDFflag}
+\def\@@FDFplus{FDFplus}
+
+\letvalue {\@@FDFflag\v!readonly}=\FDFflagReadOnly
+\letvalue {\@@FDFflag\v!required}=\FDFflagRequired
+\letvalue {\@@FDFflag\v!protected}=\FDFflagPassword
+\letvalue {\@@FDFflag\v!sorted}=\FDFflagSort
+\letvalue {\@@FDFflag\v!unavailable}=\FDFflagNoExport
+\letvalue {\@@FDFflag\v!nocheck}=\FDFflagDoNotSpellCheck
+\letvalue {\@@FDFflag\v!fixed}=\FDFflagDoNotScroll
+\letvalue {\@@FDFflag\v!file}=\FDFflagFileSelect
+
+\letvalue {\@@FDFplus\v!hidden}=\FDFplusHidden
+\letvalue {\@@FDFplus\v!printable}=\FDFplusPrintable
+
+\letvalue {\@@FDFplus\v!auto}=\FDFplusAutoView
+
+%D A set of switches is collected into the flags we mentioned
+%D before by the next macro (we don't handle negations yet,
+%D but do take care of redundancy):
+
+\def\FDFflag{0}
+\def\FDFplus{0}
+
+\def\setFDFswitches[#1]%
+ {\bgroup
+ \!!counta\zerocount
+ \!!countb\zerocount
+ \def\docommand##1%
+ {\doifsomething{##1}
+ {\advance\!!counta 0\getvalue{\@@FDFflag##1}%
+ \setvalue{\@@FDFflag##1}{0}%
+ \advance\!!countb 0\getvalue{\@@FDFplus##1}%
+ \setvalue{\@@FDFplus##1}{0}}}%
+ \processcommacommand[#1]\docommand
+ \xdef\FDFflag{\the\!!counta}%
+ \xdef\FDFplus{\the\!!countb}%
+ \egroup}
+
+%D \macros
+%D {setFDFvalues}
+%D
+%D Menu items are passed as an array of \type{(string)}'s and
+%D the content of this array is build with:
+
+\let\FDFvalues \empty
+\let\FDFfirstvalues \empty
+\let\FDFsecondvalues\empty
+\let\FDFkidlist \empty
+\let\FDFdefaultindex\!!zerocount
+\let\FDFdefaultvalue\empty
+
+% Why do we need to tweak this mechanism each time acrobat updates ...
+% it would make sense to have version specific sections in pdf files
+% since my guess is that it never will be done right since each year
+% new programmers have new ideas about what is supposed to happen with
+% kids. So .. best is not to trust this feature esp not for radio
+% widgets. (new flags, different interpretation of AS etc etc)
+
+\def\setFDFvalues[#1][#2]% #1 = list (item=>value) #2 = default
+ {\let\FDFvalues \empty
+ %when radio opt works ok
+ %\let\FDFfirstvalues \empty
+ %\let\FDFsecondvalues\empty
+ \let\FDFkidlist \empty
+ %\let\FDFdefaultindex\!!zerocount
+ %\let\FDFdefaultvalue\empty
+ %\scratchcounter\zerocount
+ \def\dodocommand##1=>##2=>##3\end
+ {\addtocommalist{##1}\FDFkidlist
+ %\edef\FDFfirstvalues{\FDFfirstvalues(##1)}%
+ %\doif{##1}{#2}{\edef\FDFdefaultindex{\the\scratchcounter}}%
+ %\advance\scratchcounter\plusone
+ \doifelsenothing{##2}
+ {\doif{##1}{#2}{\edef\FDFdefaultvalue{##1}}%
+ %\edef\FDFsecondvalues{\FDFsecondvalues(##1)}%
+ \edef\FDFvalues{\FDFvalues [(##1)(##1)] }}
+ {\doif{##1}{#2}{\edef\FDFdefaultvalue{##2}}%
+ %\edef\FDFsecondvalues{\FDFsecondvalues(##2)}%
+ \edef\FDFvalues{\FDFvalues [(##2)(##1)] }}}% ! ##1 is shown
+ \def\docommand##1%
+ {\dodocommand##1=>=>\end}%
+ \expanded{\processcommalist[#1]}\docommand}
+
+%D This macro accepts comma separated \type{visual=>result}
+%D pairs.
+
+%D \macros
+%D {setFDFalignment}
+%D
+%D Text and line fields can be entered and showed in three
+%D alternative alingments, indicated by a digit:
+
+\def\FDFalign{0}
+
+\def\setFDFalignment[#1]%
+ {\processaction
+ [#1]
+ [ \v!left=>\edef\FDFalign{2}, % raggedleft
+ \v!middle=>\edef\FDFalign{1}, % raggedcenter
+ \v!right=>\edef\FDFalign{0}]} % raggedright
+
+%D \macros
+%D {setFDFattributes}
+%D
+%D The weak part of (at least version 2.1 \PDF) is that only
+%D default fonts are handled well. Another restriction is that
+%D the encoding vector must be the standard \PDF\ document one.
+%D Although the \PDF\ reference explictly states that one could
+%D use the normal text operators, leading is not yet handled.
+%D
+%D For the moment the current \CONTEXT\ font is mapped onto
+%D one best suitable default font. The color attribute is
+%D less problematic and is directly derived from the \CONTEXT\
+%D color.
+
+\def\FDFattributes{/Helv 12 Tf 0 g 14.4 TL}
+
+\def\FDFrm {TiRo} \def\FDFss {Helv} \def\FDFtt {Cour}
+\def\FDFrmtf{TiRo} \def\FDFsstf{Helv} \def\FDFtttf{Cour}
+\def\FDFrmbf{TiBo} \def\FDFssbf{HeBo} \def\FDFttbf{CoBo}
+\def\FDFrmit{TiIt} \def\FDFssit{HeOb} \def\FDFttit{CoOb}
+\def\FDFrmsl{TiIt} \def\FDFsssl{HeOb} \def\FDFttsl{CoOb}
+\def\FDFrmbi{TiBI} \def\FDFssbi{HeBO} \def\FDFttbi{CoBO}
+\def\FDFrmbs{TiBI} \def\FDFssbs{HeBO} \def\FDFttbs{CoBO}
+
+\let\FDFusedfonts=\FDFsstf
+
+\def\setFDFattributes[#1,#2,#3,#4]% style, color, backgroundcolor, framecolor
+ {\bgroup % nog interlinie: n TL
+ \setbox\scratchbox\hbox
+ \bgroup
+ \doconvertfont{#1}{}%
+ \PointsToBigPoints\bodyfontsize\size % x/xx, so better the actual size
+ \doifdefinedelse{FDF\fontstyle\fontalternative}
+ {\xdef\FDFattributes{\getvalue{FDF\fontstyle\fontalternative}}}
+ {\doifdefinedelse{FDF\fontstyle}
+ {\xdef\FDFattributes{\getvalue{FDF\fontstyle}}}
+ {\xdef\FDFattributes{\FDFrm}}}%
+ \doglobal\addtocommalist\FDFattributes\FDFusedfonts
+ \xdef\FDFattributes% move up with "x.y Ts"
+ {/\FDFattributes\space\size\space Tf\space\PDFcolor{#2}}%
+ \doifelsenothing{#3}
+ {\global\let\FDFsurroundings\empty}
+ {\xdef\FDFsurroundings{/BG \FDFcolor{#3}}}%
+ \doifsomething{#4}
+ {\xdef\FDFsurroundings{\FDFsurroundings\space /BC \FDFcolor{#4}}}%
+ \ifx\FDFsurroundings\empty \else
+ \xdef\FDFsurroundings{/MK << \FDFsurroundings\space>>}%
+ \fi
+ \egroup
+ \egroup}
+
+%D \macros
+%D {setFDFactions}
+%D
+%D Depending on the type of the field, one can assign
+%D \JAVASCRIPT\ code to a mouse event or keystroke. The next
+%D preparation macro shows what events are handled.
+
+\let\FDFactions\empty
+
+\def\setFDFactions[#1,#2,#3,#4,#5,#6,#7,#8,%
+ {\global\let\FDFactions\empty
+ \setFDFaction D#1\relax% mousedown
+ \setFDFaction U#2\relax% mouseup
+ \setFDFaction E#3\relax% enterregion
+ \setFDFaction X#4\relax% exitregion
+ \setFDFaction K#5\relax% afterkeystroke
+ \setFDFaction F#6\relax% formatresult
+ \setFDFaction V#7\relax% validateresult
+ \setFDFaction C#8\relax% calculatewhatever
+ \setFDFactionsmore}
+
+\def\setFDFactionsmore#1,#2]%
+ {\setFDFaction{Fo}#1\relax% focusin
+ \setFDFaction{Bl}#2\relax% focusout % was I (now pdf ref manual explicitly talks about lowercase l)
+ \ifx\FDFactions\empty\else
+ \xdef\FDFactions{/AA << \FDFactions >>}% since 1.3 no longer inherited
+ \fi}
+
+% todo, when new var scheme is implemented
+%
+% \setFDFaction{PO}\@@DriverFieldPageOpen\relax
+% \setFDFaction{PC}\@@DriverFieldPageClose\relax
+% \setFDFaction{PV}\@@DriverFieldPageVisible\relax
+% \setFDFaction{PI}\@@DriverFieldPageInVisible\relax
+
+%D The event handler becomes something:
+%D
+%D \starttyping
+%D /AA << /D << /S ... >> ... /C << /S ... >>
+%D /A << /S /JavaScript /JS (...) >>
+%D \stoptyping
+
+% \def\setFDFaction#1#2\relax%
+% {\bgroup
+% \global\let\sanitizedJScode\empty
+% \def\setFDFaction##1%
+% {\doifreferencefoundelse{##1}
+% {\doifelse{\currentreferencespecial}{JS} % filter non-js
+% {\presetJScode
+% \currentreferenceoperation
+% \currentreferencearguments
+% \doPSsanitizeJScode\JScode\to\JScode
+% \xdef\sanitizedJScode{\sanitizedJScode\space\JScode}}
+% {\illegalreference{##1}}}
+% {\unknownreference{##1}}}%
+% \@EA\processcommalist\@EA[#2]\setFDFaction % one level expansion
+% \ifx\sanitizedJScode\empty \else
+% \xdef\FDFactions%
+% {\FDFactions /#1 << /S /JavaScript /JS (\sanitizedJScode) >> }%
+% \fi
+% \egroup}
+%
+% acrobat 5 supports other that JS actions too
+
+\def\setFDFaction#1#2\relax%
+ {\bgroup
+ \def\docommand{\xdef\FDFactions{\FDFactions /#1 << \lastPDFaction >> }}%
+ \@EA\handlereferenceactions\@EA{#2}\docommand % one level expansion
+ \egroup}
+
+%D \macros
+%D {testFDFactions}
+%D
+%D This rather confusion prone series of script can be tested
+%D with:
+%D
+%D \starttyping
+%D \testFDFactions
+%D \stoptyping
+%D
+%D which simply redefined the previous macro to one that prints
+%D a message to the console.
+
+\def\testFDFactions
+ {\def\setFDFaction##1##2\relax%
+ {\doPSsanitizeJScode console.show();console.println("executing:##1"); \to\sanitizedJScode
+ \edef\FDFactions{\FDFactions /##1 << /S /JavaScript /JS (\sanitizedJScode) >> }}}
+
+%D \macros
+%D {doFDFregistercalculationset}
+%D
+%D There is at most one calculation order list, which defines
+%D the order in which fields are calculated.
+
+\let\PDFcalculationset\empty
+
+\def\doFDFregistercalculationset#1%
+ {\def\PDFcalculationset{#1}}
+
+%D \macros
+%D {registerFDFobject,everylastshipout}
+%D
+%D Officially one needs to embed some general datastructures
+%D that tell the viewer what fields are present in the file, as
+%D well as what resources they use. The next mechanism does that
+%D job automatically when one registers the field.
+
+\def\flushFDFnames
+ {\ifbuildFDFdictionary
+ \ifx\FDFcollection\empty\else
+ \ifbuildFDFencodingvector
+ \doPDFdictionaryobject{FDF}{local:encodingvector}{\FDFencodingvector}%
+ \fi
+ \defineFDFfonts
+ \doPDFarrayobject{FDF}{local:fields}{\FDFcollection}%
+ \doPDFgetobjectreference{FDF}{local:fields}\PDFobjectreference
+ % The /NeedAppearances is pretty important because
+ % otherwise Acrobat 5 blows up on cloned radio widgets
+ \doPDFdictionaryobject{FDF}{local:acroform}
+ {/Fields \PDFobjectreference\space
+ /NeedAppearances true
+ \doFDFiffieldset\PDFcalculationset{/CO [\doFDFgetfieldset\PDFcalculationset]}
+ /DR << /Font << \FDFfonts >> >>
+ /DA (/Helv 10 Tf 0 g)}%
+ \doPDFgetobjectreference{FDF}{local:acroform}\PDFobjectreference
+ \doPDFaddtocatalog
+ {/AcroForm \PDFobjectreference}%
+ \global\let\FDFcollection\empty
+ \global\let\flushFDFnames\relax
+ \fi
+ \fi}
+
+\let\FDFcollection\empty
+
+\def\registerFDFobject#1%
+ {\ifbuildFDFdictionary
+ \ifx\flushFDFnames\relax
+ \writestatus{FDF}{second run needed for field list (#1)}%
+ \fi
+ \doPDFgetobjectreference{FDF}{#1}\PDFobjectreference
+ \xdef\FDFcollection{\FDFcollection\space\PDFobjectreference}%
+ \fi}
+
+\appendtoksonce \flushFDFnames \to \everylastshipout % test \everybye / was \prependtoksonce
+
+%D \macros
+%D {defineFDFfonts,
+%D ifbuildFDFdictionary,
+%D ifbuildFDFencodingvector}
+%D
+%D Another datastruture concerns the fonts used. We only
+%D define the fonts we use.
+
+\newif\ifbuildFDFdictionary \buildFDFdictionarytrue
+\newif\ifbuildFDFencodingvector \buildFDFencodingvectortrue
+
+\def\defineFDFfonts
+ {\let\FDFfonts\empty
+ \processcommacommand[\FDFusedfonts]\defineFDFfont}
+
+\def\defineFDFfont#1%
+ {\ifbuildFDFencodingvector
+ \doPDFgetobjectreference{FDF}{local:encodingvector}\PDFobjectreference
+ \fi
+ \doPDFdictionaryobject{FDF}{local:#1}
+ {/Type /Font
+ /Subtype /Type1
+ /Name /#1
+ \ifbuildFDFencodingvector /Encoding \PDFobjectreference\space\fi
+ /BaseFont /\getvalue{FDFname#1}}%
+ \doPDFgetobjectreference{FDF}{local:#1}\PDFobjectreference
+ \edef\FDFfonts{\FDFfonts \space/#1 \PDFobjectreference}}
+
+%D Another list of constants:
+
+\def\FDFnameTiRo {Times-Roman}
+\def\FDFnameTiBo {Times-Bold}
+\def\FDFnameTiIt {Times-Italic}
+\def\FDFnameTiBI {Times-BoldItalic}
+\def\FDFnameHelv {Helvetica}
+\def\FDFnameHeBo {Helvetica-Bold}
+\def\FDFnameHeOb {Helvetica-Oblique}
+\def\FDFnameHeBO {Helvetica-BoldOblique}
+\def\FDFnameCour {Courier}
+\def\FDFnameCoBo {Courier-Bold}
+\def\FDFnameCoOb {Courier-Oblique}
+\def\FDFnameCoBO {Courier-BoldOblique}
+
+%D And a big one: (should be run time loaded (spec-run or
+%D so)).
+
+\def\FDFencodingvector
+ {/Type /Encoding
+ /Differences
+ [ 24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek
+ /ring /tilde
+ 39 /quotesingle
+ 96 /grave
+ 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash /florin
+ /fraction /guilsinglleft /guilsinglright /minus /perthousand
+ /quotedblbase /quotedblleft /quotedblright /quoteleft
+ /quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE
+ /Scaron /Ydieresis /Zcaron /dotlessi /lslash /oe /scaron
+ /zcaron
+ 164 /currency
+ 166 /brokenbar
+ 168 /dieresis /copyright /ordfeminine
+ 172 /logicalnot /.notdef /registered /macron /degree /plusminus
+ /twosuperior /threesuperior /acute /mu
+ 183 /periodcentered /cedilla /onesuperior /ordmasculine
+ 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute
+ /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave
+ /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex
+ /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde
+ /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Yacute /Thorn /germandbls /agrave /aacute
+ /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave
+ /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex
+ /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde
+ /odieresis /divide /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /ydieresis ]}
+
+%D \macros
+%D {currentFDFmode,currentFDFparent,currentFDFkids,currenrFDFroot}
+%D
+%D There are three more quasi global interfacing variables
+%D that need to be set.
+
+\let\currentFDFmode =\fieldlonermode
+\let\currentFDFkids =\empty
+\let\currentFDFparent=\empty
+\let\currentFDFroot =\empty
+
+%D \macros
+%D {dosetfieldstatus}
+%D
+%D And here comes the special that deals with them.
+
+\definespecial\dosetfieldstatus#1#2#3#4%
+ {\chardef\currentFDFmode #1%
+ \edef\currentFDFparent {#2}%
+ \edef\currentFDFkids {#3}%
+ \edef\currentFDFroot {#4}}
+
+%D \macros
+%D {dosetuppageview}
+%D
+%D Because this command will seldom be called, we can permit
+%D slow action processing. We need three settings, one for
+%D direct \PDF\ inclusion, the other as \PDFTEX\ keyword, an
+%D a last one for form. All determine in what way the
+%D screen is adapted when going to a destination. Watch the
+%D space.
+
+\def\PDFpageviewkey{fit}
+\def\PDFpageviewwrd{/Fit}
+\def\PDFpageview {/View [\PDFpageviewwrd] }
+\let\PDFpagexyzspec\relax % 0 0 0 hack, pdftex does handle this, for dvipdfmx we need height
+
+\def\dosetuppageview#1% watch the v-h swapping here
+ {\processaction
+ [#1]
+ [ \v!fit=>\def\PDFpageviewkey {fit}\def\PDFpageviewwrd{/Fit},
+ \v!width=>\def\PDFpageviewkey {fith}\def\PDFpageviewwrd{/FitH},
+ \v!height=>\def\PDFpageviewkey {fitv}\def\PDFpageviewwrd{/FitV},
+ \v!minwidth=>\def\PDFpageviewkey{fitbh}\def\PDFpageviewwrd{/FitBH},
+ \v!minheight=>\def\PDFpageviewkey{fitbv}\def\PDFpageviewwrd{/FitBV},
+ \v!standard=>\ifx\PDFpagexyzspec\relax
+ % empty does not work too wel with dpx
+ \def\PDFpageviewkey{fit}%
+ \def\PDFpageviewwrd{/Fit}%
+ \else
+ \edef\PDFpageviewkey{xyz \PDFpagexyzspec}%
+ \edef\PDFpageviewwrd{/XYZ \PDFpagexyzspec}%
+ \fi,
+ \s!unknown=>\def\PDFpageviewkey {fit}\def\PDFpageviewwrd{/Fit}]%
+ \edef\PDFpageview{\ifx\PDFpageviewwrd\empty\else/View [\PDFpageviewwrd]\fi}}
+
+%D \macros
+%D {setFDFkids}
+%D
+%D Clones as well as radiofields (which themselves can have
+%D cloned components) need a list of kids. The next macro
+%D builds one.
+
+\def\setFDFkids[#1][#2]% tag commalist
+ {\let\FDFkids\empty
+ \def\docommand##1%
+ {\doPDFgetobjectreference{FDF}{#1##1}\PDFobjectreference
+ \edef\FDFkids{\FDFkids\PDFobjectreference\space}}%
+ \@EA\processcommalist\@EA[#2]\docommand
+ \ifx\FDFkids\empty\else\edef\FDFkids{/Kids [\FDFkids]}\fi
+% \edef\FDFkids{/Kids [\FDFkids]}%
+ }
+
+%D \macros
+%D {doFDFpresetlinefield,doFDFpresettextfield,
+%D doFDFpresetchoicefield,doFDFpresetpopupfield,doFDFpresetcombofield,
+%D doFDFpresetpushfield,doFDFpresetcheckfield,
+%D doFDFpresetfield,doFDFpresetradiorecord}
+%D
+%D I would say: read the \PDF\ reference manual first and see
+%D what happens here next. Lucky us that they have so much in
+%D common.
+
+\def\doFDFpresetlinefield#1#2#3#4#5#6#7#8#9%
+ {\bgroup
+ \setFDFlayer\@@DriverFieldLayer
+ \setFDFswitches[#7]%
+ \setFDFattributes[#6]%
+ \setFDFalignment[#8]%
+ \setFDFactions[#9]%
+ \expanded{\escapePSstring#4}\to\FDFtext
+ \ifcase\currentFDFmode
+ \doPDFannotationobject{FDF}{#1}{#2}{#3}
+ {/Subtype /Widget /T (#1) /FT /Tx
+ /MaxLen \ifcase0#5 1000 \else#5 \fi
+ %/DV (#4) /V (#4) % value added
+ /DV (\FDFtext) /V (\FDFtext) % value added
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ /DA (\FDFattributes)
+ \FDFlayer\space
+ \FDFsurroundings\space
+ /Q \FDFalign\space
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or
+ \setFDFkids[kids:][\currentFDFkids]%
+ \doPDFdictionaryobject{FDF}{#1}
+ {/T (#1) /FT /Tx
+ /MaxLen \ifcase0#5 1000 \else#5 \fi
+ \FDFkids\space
+ %/DV (#4) /V (#4) % value added
+ /DV (\FDFtext) /V (\FDFtext) % value added
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ /DA (\FDFattributes)
+ \FDFlayer\space
+ \FDFsurroundings\space
+ /Q \FDFalign\space
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ /DA (\FDFattributes)
+ \FDFlayer\space
+ \FDFsurroundings\space
+ /Q \FDFalign\space
+ \FDFactions}%
+ \or
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference
+ /F \FDFplus
+ \FDFactions}%
+ \fi
+ \egroup}
+
+\def\doFDFpresettextfield#1#2#3#4#5#6#7#8#9%
+ {\doFDFpresetlinefield{#1}{#2}{#3}{#4}{#5}{#6}{MultiLine,#7}{#8}{#9}}
+
+\def\doFDFpresetchoicefield#1#2#3#4#5#6#7#8%
+ {\bgroup
+ \setFDFlayer\@@DriverFieldLayer
+ \setFDFswitches[#6]%
+ \setFDFattributes[#5]%
+ \setFDFvalues[#7][#4]%
+ \setFDFactions[#8]%
+ \ifcase\currentFDFmode
+ \doPDFannotationobject{FDF}{#1}{#2}{#3}
+ {/Subtype /Widget
+ /T (#1) /FT /Ch
+ /DV (#4) /V (#4)
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ /DA (\FDFattributes)
+ \FDFlayer\space
+ \FDFsurroundings\space
+ /Opt [\FDFvalues]
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or
+ \setFDFkids[kids:][\currentFDFkids]%
+ \doPDFdictionaryobject{FDF}{#1}
+ {/T (#1) /FT /Ch
+ \FDFkids\space
+ /DV (#4) /V (#4)
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ /DA (\FDFattributes)
+ \FDFlayer\space
+ \FDFsurroundings\space
+ /Opt [\FDFvalues]
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ /DA (\FDFattributes)
+ \FDFlayer\space
+ \FDFsurroundings\space
+ \FDFactions}%
+ \or
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference
+ /F \FDFplus
+ \FDFactions}%
+ \fi
+ \egroup}
+
+\def\doFDFpresetpopupfield#1#2#3#4#5#6#7#8%
+ {\doFDFpresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,#6}{#7}{#8}}
+
+\def\doFDFpresetcombofield#1#2#3#4#5#6#7#8%
+ {\doFDFpresetchoicefield{#1}{#2}{#3}{#4}{#5}{PopUp,Edit,#6}{#7}{#8}}
+
+\newif\ifFDFvalues
+
+\def\doFDFpresetpushcheckfield#1#2#3#4#5#6#7#8% in acro<5 (\FDFdefault)
+ {\bgroup % in acro>5 /\FDFdefault
+ \setFDFlayer\@@DriverFieldLayer
+ \ifcase#8\relax\FDFvaluesfalse\else\FDFvaluestrue\fi
+ \setFDFswitches[#5]%
+ \setFDFactions[#7]%
+ \doifelse{#4}{1}
+ {\def\FDFdefault{On}}
+ {\def\FDFdefault{Off}}%
+ \ifcase\currentFDFmode
+ \doFDFappearance{On}{#6}{#8}%
+ \doPDFannotationobject{FDF}{#1}{#2}{#3}
+ {/Subtype /Widget /T (#1) /FT /Btn
+ \ifFDFvalues
+ /DV /\FDFdefault\space
+ /V /\FDFdefault\space
+ /AS /\FDFdefault\space
+ \fi
+ \FDFlayer
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ \FDFlayer\space
+ \FDFappearance\space
+% /IF << /SW /N >> % strange, only works for stupid buttons
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or % no appearance and layer ?
+ \setFDFkids[kids:][\currentFDFkids]%
+ \doPDFdictionaryobject{FDF}{#1}
+ {/T (#1) /FT /Btn
+ \FDFkids\space
+ \ifFDFvalues
+ /DV /\FDFdefault\space
+ /V /\FDFdefault\space
+ /AS /\FDFdefault\space
+ \fi
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or
+ \doFDFappearance{On}{#6}{#8}%
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference\space
+ \ifFDFvalues
+ /DV /\FDFdefault\space
+ /V /\FDFdefault\space
+ /AS /\FDFdefault\space
+ \fi
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ \FDFlayer\space
+ \FDFappearance\space
+ \FDFactions}%
+ \or
+ \doFDFappearance{On}{#6}{#8}%
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference\space
+ /F \FDFplus\space
+ \ifFDFvalues
+ /DV /\FDFdefault\space
+ /V /\FDFdefault\space
+ /AS /\FDFdefault\space
+ \fi
+ \FDFlayer\space
+ \FDFappearance
+ \FDFactions}%
+ \fi
+ \egroup}
+
+\def\doFDFpresetpushfield#1#2#3#4#5#6#7%
+ {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{PushButton,#5}{#6}{#7}{0}}
+
+\def\doFDFpresetcheckfield#1#2#3#4#5#6#7%
+ {\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{#5}{#6}{#7}{1}}
+
+% As pdf widgets are rather consistently upward incompatible
+% especially with regards to inheritance, the following code is not
+% quite okay. I've decided no longer to bother about in it in MkII
+% and use a flat model in MkIV which somehow seems to work better.
+
+\def\doFDFpresetradiofield#1#2#3#4#5#6#7#8%
+ {\bgroup
+ \setFDFlayer\@@DriverFieldLayer
+ \FDFvaluestrue
+ \setFDFswitches[#5]%
+ \setFDFactions[#8]%
+ \doifelsenothing{#4}
+ {\def\FDFdefault{Off}}
+ {\def\FDFdefault{#4}}%
+ \@EA\aftersplitstring\FDFdefault\at=>\to\FDFdefaultvalue
+ \ifx\FDFdefaultvalue\empty\else\let\FDFdefault\FDFdefaultvalue\fi
+ \ifcase\currentFDFmode
+ \doFDFappearance{#1}{#7}{1}%
+ \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference
+ \doPDFannotationobject{FDF}{#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference\space
+ /F \FDFplus\space
+ /AS /\FDFdefault\space
+ \FDFlayer\space
+ \FDFappearance\space
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or
+ \setFDFkids[kids:][\currentFDFkids]%
+ \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference
+ \doPDFdictionaryobject{FDF}{#1}
+ {/Parent \PDFobjectreference\space
+ \FDFkids\space
+ /F \FDFplus\space
+ \FDFactions}%
+ \registerFDFobject{#1}%
+ \or
+ %\doFDFappearance{#1}{#7}{1}%
+ \doFDFappearance{\currentFDFparent}{#7}{1}%
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue % nb
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference\space
+ /AS /\FDFdefault\space
+ /F \FDFplus\space
+ \FDFlayer\space
+ \FDFappearance\space
+ \FDFactions}%
+ \or
+ %\doFDFappearance{#1}{#7}{1}%
+ \doFDFappearance{\currentFDFparent}{#7}{1}%
+ \doPDFgetobjectreference{FDF}\currentFDFparent\PDFobjectreference
+ %\global\objectreferencingtrue
+ \doPDFannotationobject{FDF}{kids:#1}{#2}{#3}
+ {/Subtype /Widget
+ /Parent \PDFobjectreference\space
+ /AS /\FDFdefault\space
+ /F \FDFplus\space
+ \FDFlayer\space
+ \FDFappearance\space
+ \FDFactions}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {setFDFstrings}
+%D
+%D This one creates a string array.
+
+%\def\setFDFstrings[#1]%
+% {\let\FDFstrings\empty
+% \def\docommand##1{\edef\FDFstrings{\FDFstrings(##1)}}%
+% \processcommacommand[#1]\docommand}
+
+% Beware, RadiosInUnison is really needed in the pre 1.5/6 time this
+% was the default but out of a sudden it's no longer the case. Also
+% the NoToggleToOff interferes with kids of kids and both it will
+% break older documents, i.e. so much for pdf as standard. With
+% features like widgets we can probably best wait till adobe tools
+% themselves support it because that's probably the moment that
+% functionality gets frozen/becomes definitive. Actually, acrobat
+% flattens the kids tree, so that's yet another situation. The
+% interesting thing is that it worked ok in acrobat 2/3 but got bugged
+% in later versions. [The rationale is in html compatibility, which
+% seems to be more important than compatibility of documents, which in
+% turn renders acrobat useless for forms.] Anyway, synchronization is
+% broken or not depending on the combination pdfversion/acrobatversion.
+%
+% Hm, nowadays Radio will overload RadiosInUnison so we need to use only one
+% of them.
+
+\def\doFDFpresetradiorecord#1#2#3#4#5%
+ {\bgroup
+ % < pdf 1.5 (1.5 was broken)
+ % \setFDFswitches[Radio,NoToggleToOff,RadiosInUnison,#3]%
+ % > pdf 1.5
+ % \setFDFswitches[Radio,RadiosInUnison,#3]%
+ % > pdf 1.6
+ \setFDFswitches[RadiosInUnison,#3]%
+ %setFDFswitches[PushButton,RadiosInUnison,#3]% this is what acrobat itself does
+ % older, else fatal error
+ % \setFDFkids[#4][]%
+ % newer
+ \setFDFvalues[#4][#2]% inits kidlist
+ \expanded{\setFDFkids[][\FDFkidlist]}%
+ %
+ \setFDFactions[#5]%
+ \doPDFdictionaryobject{FDF}{#1}
+ {%/Subtype /Widget
+ /FT /Btn /T (#1) /Rect [0 0 0 0]
+ % used to be this
+ % /V (#2)
+ % then this
+ % /DV (#2)
+ % since this bomded in 5
+ % /V (#2)
+ % and now finally this works
+ /H /N
+ % /opt is buggy in 5.05, only works once, sigh
+ %\ifx\FDFfirstvalues\FDFsecondvalues
+ /V /#2
+ %\else
+ % /V /\FDFdefaultindex\space
+ % /Opt [\FDFsecondvalues]
+ %\fi
+ /Ff \FDFflag\space
+ /F \FDFplus\space
+ \FDFkids\space
+ \FDFactions}%
+ \egroup}
+
+%D At the cost of some more references, we can save bytes,
+%D by sharing appearance dictionaries. This code needs more
+%D documentation. Surprise:
+
+\def\dodoFDFappearance#1#2%
+ {\ifx#2\empty\else
+ \dogetcommacommandelement1\from#2\to\commalistelement
+ \ifx\commalistelement\empty\else
+ \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference
+ \edef\N{\ifFDFvalues\N /#1 \fi\PDFobjectreference\space}%
+ \fi
+ \dogetcommacommandelement2\from#2\to\commalistelement
+ \ifx\commalistelement\empty\else
+ \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference
+ \edef\R{\ifFDFvalues\R /#1 \fi\PDFobjectreference\space}%
+ \fi
+ \dogetcommacommandelement3\from#2\to\commalistelement
+ \ifx\commalistelement\empty\else
+ \doPDFgetobjectreference{SYM}\commalistelement\PDFobjectreference
+ \edef\D{\ifFDFvalues\D /#1 \fi\PDFobjectreference\space}%
+ \def\FDFappearance{/H /P }%
+ \fi
+ \fi}
+
+\def\redoFDFappearance#1%
+ {\ifx#1\empty\else
+ \dogetcommacommandelement3\from#1\to\commalistelement
+ \ifx\commalistelement\empty\else
+ \def\FDFappearance{/H /P }%
+ \fi
+ \fi}
+
+\def\doFDFappearance#1#2#3%
+ {\ifcase#3\relax % push only field
+ \edef\yes{#2}%
+ \let\no\empty
+ \else % on / off field
+ \dogetcommacommandelement1\from#2,\to\yes
+ \dogetcommacommandelement2\from#2,\to\no
+ \fi
+ \def\FDFappearance{/H /N}%
+ \doifobjectfoundelse{FDF}{ap:#1:\yes:\no}
+ {\redoFDFappearance\yes
+ \redoFDFappearance\no}
+ {\presetobject{FDF}{ap:#1:\yes:\no}% funny hack
+ \let\N\empty\let\R\empty\let\D\empty
+ \dodoFDFappearance{#1}\yes
+ \dodoFDFappearance{Off}\no
+ \doPDFdictionaryobject{FDF}{ap:#1:\yes:\no}
+ {\ifx\N\empty\else/N \ifFDFvalues<<\N>>\else\N\fi\fi
+ \ifx\R\empty\else/R \ifFDFvalues<<\R>>\else\R\fi\fi
+ \ifx\D\empty\else/D \ifFDFvalues<<\D>>\else\D\fi\fi}}%
+ \doPDFgetobjectreference{FDF}{ap:#1:\yes:\no}\PDFobjectreference
+ \edef\FDFappearance{\FDFappearance /AP \PDFobjectreference}}
+
+%\def\doFDFdefault#1#2%
+% {\dogetcommacommandelement1\from#1,\to\commalistelement
+% \dogetcommacommandelement1\from\commalistelement\to\commalistelement
+% \doifelse{\commalistelement}{#2} % kan ook met \ifx
+% {\def\FDFdefault{On}}{\def\FDFdefault{Off}}}
+
+\def\doFDFdefault#1#2%
+ {\doifelse{#2}{1}{\def\FDFdefault{On}}{\def\FDFdefault{Off}}}
+
+%D Layer support:
+
+\def\setFDFlayer#1% todo : \ifx\PDFobjectreference\noPDFobjectreference ipv found
+ {\letempty\FDFlayer
+ \doifsomething{#1}%
+ {\checkproperty[#1]% == \dodocheckproperty\@@DriverFieldLayer
+ \doifobjectreferencefoundelse{PDLN}{#1}
+ {\doPDFgetobjectreference{PDLN}{#1}\!!stringa % we need to avoid a clash with other macros
+ \edef\FDFlayer{/OC \!!stringa}}%
+ \donothing}}
+
+%D The three appearances {\em normal}, \type{roll over} and
+%D \type{push down} are passed as comma separated triplets,
+%D that is, the second argument can look like:
+%D
+%D \starttyping
+%D {yes,ok,fine},{no,rubish,awful}
+%D \stoptyping
+
+%D \macros
+%D {doFDFdefinefieldset,doFDFgetfieldset,doFDFiffieldset}
+%D
+%D Field sets, the ones we use in submitting and resetting
+%D fields, are implemented using the next low level specials:
+%D
+%D \starttyping
+%D \doFDFdefinefieldset{TAG}{name,name,...}
+%D \doFDFgetfieldset{TAG}
+%D \doFDFiffieldset{TAG}{sequence}
+%D \stoptyping
+
+\def\doFDFdefinefieldset#1#2% tag commalist
+ {\let\FDFfieldset\empty
+ \def\docommand##1%
+ {\doPDFgetobjectreference{FDF}{##1}\PDFobjectreference
+ \edef\FDFfieldset{\FDFfieldset\PDFobjectreference\space}}%
+ \processcommacommand[#2]\docommand % nb: command
+ \setevalue{FDF:set:#1}{\FDFfieldset}}
+
+\def\doFDFgetfieldset#1%
+ {\getvalue{FDF:set:#1}}
+
+\def\doFDFiffieldset#1#2%
+ {\ifundefined{FDF:set:#1}\else#2\fi}
+
+%D In the goto specials we took care of secondary references.
+%D Here we define the macros used.
+
+\def\doPDFresetgotowhereever
+ {\global\let\secondaryPDFreferences\empty}
+
+\doPDFresetgotowhereever % just to be sure
+
+% we can (in etex) share more by testing on this
+
+\def\savesecondaryPDFreference#1%
+ {\@EA\xdef\csname PDF-SR:\the\nofsecondaryreferences\endcsname{#1}}
+
+\def\savesecondaryPDFreference % #1 == \action
+ {\global\@EA\let\csname PDF-SR:\the\nofsecondaryreferences\endcsname}
+
+%\def\getsecondaryPDFreferences%
+% {\ifcase\nofsecondaryreferences\else
+% %\doifdefined{PDF-SR:\the\nofsecondaryreferences}
+% \xdef\secondaryPDFreferences%
+% {/Next << \csname PDF-SR:\the\nofsecondaryreferences\endcsname\space
+% \secondaryPDFreferences >>}%
+% \global\advance\nofsecondaryreferences \minusone
+% \expandafter\getsecondaryPDFreferences
+% \fi}
+
+% test should happen in core-ref
+
+\def\getsecondaryPDFreferences
+ {\ifcase\nofsecondaryreferences\else
+ \ifcsname PDF-SR:\the\nofsecondaryreferences\endcsname
+ \xdef\secondaryPDFreferences
+ {/Next << \csname PDF-SR:\the\nofsecondaryreferences\endcsname\space
+ \secondaryPDFreferences >>}%
+ \fi
+ \global\advance\nofsecondaryreferences \minusone
+ \expandafter\getsecondaryPDFreferences
+ \fi}
+
+%D \macros
+%D {loadFDFfields, showFDFfields,
+%D getFDFfield, setFDFfield}
+%D
+%D Once filled in, we can export or submit the field in the
+%D \FDF\ file format. Such a file can be loaded by
+%D
+%D \starttyping
+%D \loadFDFfields{fiel-ini}
+%D \stoptyping
+%D
+%D or inspected by
+%D
+%D \starttyping
+%D \showFDFfields{fiel-ini}
+%D \stoptyping
+%D
+%D After both commands, one can use
+%D
+%D \starttyping
+%D \getFDFfield{name}
+%D \setFDFfield{name}{value}
+%D \stoptyping
+%D
+%D to inspect and overrule the data.
+%D
+%D By default \CONTEXT\ calls the perl script \type{fdf2tex}.
+%D This script reads the \type{fdf} file and produces a file
+%D named \type{filename.fdt}. If one disables the call to this
+%D script, by saying:
+%D
+%D \starttyping
+%D \runFDFconverterfalse
+%D \stoptyping
+%D
+%D or when \CONTEXT\ cannot find the \type{fdt} file, it tries
+%D to interpret the \type{fdf} file directly. Both mechanisms
+%D are rather crude.
+
+\newif\ifrunFDFconverter \runFDFconvertertrue
+
+%D The \PERL\ script produces a file formatted as:
+%D
+%D \starttyping
+%D \beginFDFobject
+%D \beginFDFdata
+%D \beginFDFfields
+%D \FDFfield[name=,value=]
+%D \endFDFfields
+%D \endFDFdata
+%D \endFDFobject
+%D \stoptyping
+%D
+%D One reason for using key value pairs is that we cannot be
+%D sure or the order in which the name and value are given
+%D (actually the reverse).
+
+\def\PERLloadFDFfields#1% will become obsolete soon
+ {\bgroup
+ \global\let\allFDFfields\empty
+ \ifrunFDFconverter
+ \executesystemcommand{fdf2tex #1}%
+ \let\beginFDFobject\relax \let\endFDFobject\relax
+ \let\beginFDFdata \relax \let\endFDFdata \relax
+ \let\beginFDFfields\relax \let\endFDFfields\relax
+ \def\FDFfield[##1]%
+ {\getparameters[FDF][##1]%
+ \doglobal\addtocommalist\FDFname\allFDFfields
+ \global\setFDFfield{\FDFname}{\FDFvalue}}%
+ \ReadFile{#1.fdt}%
+ \fi
+ \egroup}
+
+%D The next macro does the same job, but now in the \TEX\ way
+%D of doing things. Easy eh? Will become obsolete!
+
+\bgroup
+
+\catcode`\/=\@@other
+\global\let\normalslash=/
+\catcode`\/=\@@escape
+
+\gdef\TEXloadFDFfields#1% will become obsolete due to XFDF
+ {\bgroup
+ \setbox0=\hbox
+ {\global\let\allFDFfields\empty
+ \scratchcounter=0
+ \escapechar=-1
+ \catcode`\/=\@@escape
+ \catcode`\(=\@@begingroup
+ \catcode`\)=\@@endgroup
+ \catcode`\%=\@@letter
+ \let/A =\relax \let/AS =\relax \let/Kids=\relax \let/Fields=\relax
+ \let/F =\relax \let/ID =\relax \let/SetF=\relax \let/setFf =\relax
+ \let/Ff=\relax \let/Opt=\relax \let/ClrF=\relax \let/ClrFf =\relax
+ \let/AP=\relax \let/FDF=\relax \let/Root=\relax
+ \def/T##1{\check\Title{##1}}
+ \def/V{\bgroup\catcode`\/=\@@other\futurelet\next/doV}
+ \def/doV{\ifx\next\normalslash\@EA/doVb\else\@EA/doVa\fi}
+ \def/doVa##1{\egroup\check\Value{##1}}
+ \def/doVb##1##2 {\egroup\check\Value{##2}} % watch the space
+ \def\check##1##2%
+ {\def##1{##2}
+ \advance\scratchcounter\plusone\relax
+ \ifodd\scratchcounter \else
+ \defconvertedcommand\asciia\Title
+ \global\setFDFfield{\asciia}{\Value}
+ \doglobal\addtocommalist\Title\allFDFfields
+ \fi}
+ \ReadFile{#1.fdf}}%
+ \egroup}
+
+\egroup
+
+%D Whatever mechanism is used, the next macros can be used to
+%D fetch the values.
+
+\def\getFDFfield #1{\getvalue {FDFfield::#1}}
+\def\setFDFfield#1#2{\setevalue{FDFfield::#1}{#2}}
+
+%D Of course the fields are only present when the file is
+%D loaded.
+
+\def\loadFDFfields#1%
+ {\PERLloadFDFfields{#1}%
+ \ifx\allFDFfields\empty
+ \TEXloadFDFfields{#1}%
+ \fi}
+
+\def\showFDFfields#1%
+ {\bgroup
+ \loadFDFfields{#1}
+ \def\docommand##1{\par##1 = \getFDFfield{##1}\par}%
+ \processcommacommand[\allFDFfields]\docommand
+ \egroup}
+
+%D \macros
+%D {sanitizePDFencoding,sanitizePDFdocencoding}
+%D
+%D We already dealt with the encoding vector. Conversion from
+%D \TEX\ \ASCII\ encoding to the other one, is accomplished by
+%D the next few macros. Wach out: we don't group here.
+
+%D This will be reimplemented using the mapping mechanism.
+
+% \def\enablePDFdocencoding
+% {\reducetocoding[pdfdoc]\simplifycommands}
+
+\def\enablePDFdocencoding
+ {\enablecoding[pdfdoc]%
+ \enablelanguagespecifics[\currentlanguage]% redundant ?
+ \simplifycommands}
+
+\long\def\sanitizePDFdocencoding#1\to#2%
+ {\enablePDFcrlf
+ \enablePDFdocencoding
+ %\honorunexpanded % otherwise problems with "e etc in de
+ \edef#2{#1}}
+
+\bgroup
+\catcode`\^^M=\@@active
+\gdef\enablePDFcrlf%
+ {\def\\{\string\r}%
+ \def\par{\\\\}%
+ \def\endgraf{\\\\}%
+ \catcode`\^^M=\@@active%
+ \let^^M=\\}
+\egroup
+
+% \let\sanitizePDFencoding\sanitizePDFdocencoding
+
+%D The conversions comes down to (for the sake of speed the
+%D implementation combines steps):
+%D
+%D \startitemize
+%D \item we expand the \UTF\ sequences into \type {\unicodechar}'s
+%D \item spaces become character 255's (so that they are not
+%D gobbled in argument fetching
+%D \item normal \ASCII\ chars are unchanged
+%D \item \par's and alike are converted to \type {\unicodechar}'s
+%D \stopitemize
+%D
+%D This happens by expansion; next we convert the resulting
+%D sequence by interpreting the stream.
+
+\long\def\sanitizePDFuniencoding#1\to#2%
+ {\enablePDFunicrlf
+ \simplifycommands % added due to Dohyun Kim
+ \let\unicodechar\relax % prevent further expansion
+ \retainlccodes\lccode32=255 % slooow
+ \lowercasestring\PDFunicodetrigger#1\to#2%
+ \edef#2{\expandafter\doPDFuni#2\empty\empty}} % slooow
+
+%D Handling of empty lines:
+
+\bgroup
+\catcode`\^^M=\@@active
+\gdef\enablePDFunicrlf%
+ {\def\\{\unicodechar{13}}%
+ \def\par{\\\\}%
+ \catcode`\^^M=\@@active%
+ \let^^M=\\}
+\egroup
+
+%D Conversion to 16 bit \UNICODE:
+
+\def\PDFunicodechar#1%
+ {\@EA\lchexnumbers\@EA{\number\utfdiv{#1}}%
+ \@EA\lchexnumbers\@EA{\number\utfmod{#1}}}
+
+\def\PDFunicodetrigger
+ {\unicodechar{65279}}
+
+%D The postprocessor:
+
+\def\doPDFuni#1%
+ {\ifx#1\relax
+ \@EA\dodoPDFuni
+ \else\ifx#1\empty
+ % quit
+ \else
+ \@EAEAEA\nodoPDFuni
+ \fi\fi#1}
+
+\def\nodoPDFuni#1%
+ {\PDFunicodechar{\ifnum`#1=255 32\else`#1\fi}\doPDFuni}
+
+\def\dodoPDFuni#1#2%
+ {\PDFunicodechar{#2}\doPDFuni}
+
+\def\sanitizePDFencoding
+ {\doifelse\currentregime{utf}{\PDFunicodetrue\sanitizePDFuniencoding}\sanitizePDFdocencoding}
+
+%D A bit out of place, but useful:
+
+\ifdefined\everysetfield \else \newtoks\everysetfield \fi
+
+\appendtoksonce
+ \enablePDFdocencoding
+ \enablePDFcrlf
+\to \everysetfield
+
+%D \macros
+%D {doPDFinsertcomment}
+%D
+%D An example its use is the next special, one that deals with
+%D text annotations.
+
+% starting point (keep this)
+%
+% \long\def\doPDFinsertcomment#1#2#3#4#5#6#7#8%
+% {\bgroup % title width height color open symbol collect data
+% \doifelsenothing{#1}
+% {\let\PDFidentifier\empty}
+% {\def\PDFidentifier{/T (#1)}}%
+% \doifelsenothing{#4}
+% {\let\PDFattributes\empty}
+% {\def\PDFattributes{/C \FDFcolor{#4}}}%
+% \doifundefinedelse{PDFsymbol#6}
+% {\let\PDFsymbol\empty}
+% {\def\PDFsymbol{/Name \getvalue{PDFsymbol#6} }}%
+% \sanitizePDFencoding#8\to\PDFdata
+% \setbox\scratchbox\vbox to #3
+% {\vfill
+% \doPDFannotation{#2}{#3}
+% {/Subtype /Text
+% \ifcase#5 \else/Open true\fi
+% /Contents \ifPDFunicode <\PDFdata> \else(\PDFdata) \fi
+% \PDFsymbol
+% \PDFidentifier
+% \PDFattributes}}%
+% \wd\scratchbox\zeropoint
+% \ht\scratchbox\zeropoint
+% \dp\scratchbox\zeropoint
+% \box\scratchbox
+% \egroup}
+
+\newcounter\nofFDFcomments
+
+\newif\ifPDFpopupcomments \PDFpopupcommentstrue
+
+\def\doPDFflushcomments
+ {\box\PDFsymbolbox}
+
+\long\def\doPDFinsertcomment#1#2#3#4#5#6#7#8% % \@@DriverCommentLayer set otherwise
+ {\bgroup % title width height color open symbol collect data
+ \presetPDFsymbolappearance{#4}{#6}{#2}{#3}\!!zeropoint% sets width/height
+% \doifelsenothing{#1}
+% {\let\PDFidentifier\empty}
+% {\def\PDFidentifier{/T (#1)}}%
+ \doifelsenothing{#1}
+ {\let\PDFidentifier\empty}
+ {\sanitizePDFencoding#1\to\PDFcommenttitle
+ \def\PDFidentifier{/T \ifPDFunicode <\PDFcommenttitle>\else (\PDFcommenttitle)\fi}}%
+ \sanitizePDFencoding#8\to\PDFdata
+ \setFDFlayer\@@DriverCommentLayer
+ \startPDFsymbolappearance
+ \ifPDFpopupcomments
+ \doglobal\increment\nofFDFcomments
+ \doifobjectreferencefoundelse{FDF}{c:\nofFDFcomments}
+ {\doPDFgetobjectreference{FDF}{c:\nofFDFcomments}\PDFobjectreference
+ \donetrue}
+ \donefalse
+ \ifdone
+ \setbox\scratchbox\hbox
+ {\doPDFannotationobject{FDF}{c::\nofFDFcomments}{#2}{#3}% text window, size does not work
+ {/Subtype /Popup
+ /Parent \PDFobjectreference}}%
+ \ifcase#7\relax
+ \vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}%
+ \else % incredible trial and error hack
+ % it's quite a mess, the annot width cannot be set, well, it can
+ % but the appearance and text sizes get mixed up
+% \setbox\scratchbox\vbox to \height{\forgetall\vskip#3\box\scratchbox\vss}%
+% \global\setbox\PDFsymbolbox\vbox
+% {\hsize#2%
+% \forgetall
+% \vsmash{\box\PDFsymbolbox}
+% \box\scratchbox}%
+ % this may change when acrobat gets less bugged
+ \setbox\scratchbox\vbox to #3{\forgetall\vss\box\scratchbox}%
+ \wd\scratchbox#2%
+ \global\setbox\PDFsymbolbox\vbox
+ {\startoverlay{\box\PDFsymbolbox}{\box\scratchbox}\stopoverlay}%
+ \fi
+ \fi
+ % generic
+ \doifobjectreferencefoundelse{FDF}{c::\nofFDFcomments}
+ {\doPDFgetobjectreference{FDF}{c::\nofFDFcomments}\PDFobjectreference
+ \donetrue}
+ \donefalse
+ \doPDFannotationobject{FDF}{c:\nofFDFcomments}{\width}{\height}
+ {/Subtype /Text
+ \ifcase#5 \else/Open true\fi
+ % pdftex (efficient)
+ % \ifdone /Popup \PDFobjref\pdflastannot\fi
+ % generic (less efficient)
+ \ifdone /Popup \PDFobjectreference\fi
+ /Contents \ifPDFunicode <\PDFdata> \else(\PDFdata) \fi
+ \PDFidentifier
+ \FDFlayer
+ \PDFsymbol
+ \PDFattributes}%
+ \else
+ \doPDFannotation{#2}{#3}
+ {/Subtype /Text
+ \ifcase#5 \else/Open true\fi
+ /Contents \ifPDFunicode <\PDFdata> \else(\PDFdata) \fi
+ \FDFlayer
+ \PDFsymbol
+ \PDFidentifier
+ \PDFattributes}%
+ \fi
+ \stopPDFsymbolappearance
+ \egroup}
+
+% symbols with a reasonable default of 18/24 pt
+
+\newbox\PDFsymbolbox
+
+\def\PDFsymbolNew {/Insert}
+\def\PDFsymbolBalloon {/Comment}
+\def\PDFsymbolAddition {/NewParagraph}
+\def\PDFsymbolHelp {/Help}
+\def\PDFsymbolParagraph {/Paragraph}
+\def\PDFsymbolKey {/Key }
+
+\def\PDFsymbolGraph {/Graph}
+\def\PDFsymbolPaperclip {/Paperclip}
+\def\PDFsymbolAttachment{/Attachment}
+\def\PDFsymbolTag {/Tag}
+
+\def\startPDFsymbolappearance
+ {\setbox\scratchbox\vbox to \totalheight \bgroup \vfill}
+
+\def\stopPDFsymbolappearance
+ {\egroup
+ \setbox\scratchbox\hbox{\lower\depth\box\scratchbox}%
+ \wd\scratchbox\width
+ \ht\scratchbox\height
+ \dp\scratchbox\depth
+ \box\scratchbox}
+
+\def\presetPDFsymbolappearance#1#2#3#4#5% symbol color width height depth
+ {\doifelsenothing{#1}
+ {\let\PDFattributes\empty}
+ {\def\PDFattributes{/C \FDFcolor{#1}}}%
+ \scratchdimen#3\edef\width {\the\scratchdimen}%
+ \scratchdimen#4\edef\height{\the\scratchdimen}%
+ \scratchdimen#5\edef\depth {\the\scratchdimen}%
+ \advance\scratchdimen\height\edef\totalheight{\the\scratchdimen}%
+ \doifelsenothing{#2}
+ {\let\PDFsymbol\empty}
+ {\ifundefined{PDFsymbol#2}%
+ \getfromcommacommand[#2][1]\let\PDFsymbolnormalsymbol\commalistelement
+ \getfromcommacommand[#2][2]\let\PDFsymboldownsymbol \commalistelement
+ \doifsymboldefinedelse\PDFsymbolnormalsymbol
+ {\doifsymboldefinedelse\PDFsymboldownsymbol
+ {\dopresetPDFsymbolappearance
+ \PDFsymbolnormalsymbol\PDFsymboldownsymbol}
+ {\dopresetPDFsymbolappearance
+ \PDFsymbolnormalsymbol\PDFsymbolnormalsymbol}}
+ {\doifsymboldefinedelse\PDFsymboldownsymbol
+ {\dopresetPDFsymbolappearance
+ \PDFsymboldownsymbol\PDFsymboldownsymbol}
+ {\let\PDFsymbol\empty}}%
+ \else
+ \def\PDFsymbol{/Name \getvalue{PDFsymbol#2} }%
+ \fi}}
+
+\def\dopresetPDFsymbolappearance#1#2%
+ {\dopresetfieldsymbol{#1}%
+ \dopresetfieldsymbol{#2}%
+ \setbox\scratchbox\hbox{\symbol[#1]}%
+ \edef\width {\the\wd\scratchbox}%
+ \edef\height{\the\ht\scratchbox}%
+ \edef\depth {\the\dp\scratchbox}%
+ \scratchdimen\height \advance\scratchdimen\depth
+ \edef\totalheight{\the\scratchdimen}%
+ \doPDFgetobjectreference{SYM}{#1}\FDFsymbolNappearance
+ \doPDFgetobjectreference{SYM}{#2}\FDFsymbolDappearance
+ \edef\PDFsymbol
+ {/AP <</N \FDFsymbolNappearance /D \FDFsymbolDappearance>>}}
+
+%D Hooked into \CONTEXT, this special supports
+%D
+%D \starttyping
+%D \startcomment
+%D hello beautiful\\world
+%D \stopcomment
+%D
+%D \startcomment[hello]
+%D de \'e\'erste keer
+%D the f\'irst time
+%D \stopcommen
+%D
+%D \startcommentaar[hallo][color=green,width=4cm,height=3cm]
+%D first
+%D
+%D second
+%D \stopcommentaar
+%D \stoptyping
+%D
+%D So, special characters, forced linebreaks using \type{\\}
+%D and \type{\par} are handled in the appropriate way.
+
+%D \macros
+%D {doPDFovalbox}
+%D
+%D For drawing ovals we use quite raw \PDF\ code. The next
+%D implementation does not differ that much from the one
+%D implemented in the \POSTSCRIPT\ driver.
+
+\def\doPDFovalcalc#1#2#3%
+ {\dimen2=#1%
+ \advance\dimen2 #2\relax
+ \PointsToBigPoints{\dimen2}#3}
+
+\def\doPDFovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox
+ {\forcecolorhack
+ \bgroup
+ \dimen0=#4\divide\dimen0 \plustwo
+ \doPDFovalcalc{0pt}{+\dimen0}\xmin
+ \doPDFovalcalc{#1}{-\dimen0}\xmax
+ \doPDFovalcalc{#2}{-\dimen0}\ymax
+ \doPDFovalcalc{-#3}{+\dimen0}\ymin
+ \advance\dimen0 by #5%
+ \doPDFovalcalc{0pt}{+\dimen0}\xxmin
+ \doPDFovalcalc{#1}{-\dimen0}\xxmax
+ \doPDFovalcalc{#2}{-\dimen0}\yymax
+ \doPDFovalcalc{-#3}{+\dimen0}\yymin
+ \doPDFovalcalc{#4}{\zeropoint}\stroke
+ \doPDFovalcalc{#5}{\zeropoint}\radius
+ \edef\dostroke{#6}%
+ \edef\dofill{#7}%
+ \edef\mode{\number#8 \space}%
+ % no \ifcase, else \relax in pdfcode
+ \setbox\scratchbox\hbox
+ {\ifnum\dostroke\dofill>\zerocount
+ \ifPDFstrokecolor\else\ifnum\dostroke=\plusone
+ \writestatus\m!colors{pdf stroke color will fail}\wait
+ \fi\fi
+ \PDFcode
+ {q
+ \stroke\space w
+ \ifcase\mode
+ \xxmin\space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 1
+ \xxmin\space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 2
+ \xxmin\space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 3
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ h
+ \or % 4
+ \xmin \space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xmin \space \ymax \space l
+ \xmin \space \ymin\space l
+ h
+ \or % 5
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xmin \space \ymax \space l
+ \xmin \space \ymin \space l
+ h
+ \or % 6
+ \xmin \space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \ymin \space l
+ h
+ \or
+ \xxmin\space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ h
+ \or % 9 top open
+ \xmin \space \ymax \space m
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \or % 10 right open
+ \xmax \space \ymax \space m
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ \xmax\space \ymin \space l
+ \or % 11 bottom open
+ \xmax \space \ymin \space m
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax \space \ymax\space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ \or % 12 left open
+ \xmin \space \ymax \space m
+ \xxmax\space \ymax \space l
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space l
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \ymin \space l
+ \or % 13
+ \xmin \space \ymax \space m
+ \xxmax\space \ymax \space l
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax\space \ymin \space l
+ \or % 14
+ \xmax \space \ymax \space m
+ \xmax \space \yymin\space l
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \ymin \space l
+ \or % 15
+ \xmax \space \ymin \space m
+ \xxmin\space \ymin \space l
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \ymax \space l
+ \or % 16
+ \xmin \space \ymin \space m
+ \xmin \space \yymax\space l
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \xmax \space \ymax \space l
+ \or % 17
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \or % 18
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \or % 19
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 20
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 21
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 22
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \or % 23
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 24
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 25
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 26
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 27
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 28
+ \fi
+ \ifnum\mode>8
+ S
+ \else
+ \ifnum\dostroke=\plusone S \fi
+ \ifnum\dofill =\plusone f \fi
+ \fi
+ Q}%
+ \fi}%
+ \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox
+ \egroup}
+
+%D \macros
+%D {doPDFstartgraymode,doPDFstopgraymode,
+%D doPDFstartrgbcolormode,doPDFstartcmykcolormode,doPDFstartgraycolormode,
+%D doPDFstopcolormode}
+%D
+%D In \PDF\ there are two color states, one for strokes and one
+%D for fills. This means that we have to set the color in a
+%D rather redundant looking way. Unfortunately this makes the
+%D \PDF\ file much larger than needed. We can save few bytes
+%D by not setting the stroke color. Due to zip compression we
+%D only save a few percent.
+
+% \newif\ifPDFstrokecolor \PDFstrokecolortrue
+
+\def\doPDFstartgraymode#1%
+% {\PDFdirectcode{#1 g\ifPDFstrokecolor\space#1 G\fi}}
+ {\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}}
+
+\def\doPDFstopgraymode
+% {\PDFdirectcode{0 g\ifPDFstrokecolor\space0 G\fi}}
+ {\PDFcode{0 g\ifPDFstrokecolor\space0 G\fi}}
+
+\def\doPDFstartrgbcolormode#1#2#3%
+% {\PDFdirectcode{#1 #2 #3 rg\ifPDFstrokecolor\space#1 #2 #3 RG\fi}}
+ {\PDFcode{#1 #2 #3 rg\ifPDFstrokecolor\space#1 #2 #3 RG\fi}}
+
+\def\doPDFstartcmykcolormode#1#2#3#4%
+% {\PDFdirectcode{#1 #2 #3 #4 k\ifPDFstrokecolor\space#1 #2 #3 #4 K\fi}}
+ {\PDFcode{#1 #2 #3 #4 k\ifPDFstrokecolor\space#1 #2 #3 #4 K\fi}}
+
+\def\doPDFstartgraycolormode#1%
+% {\PDFdirectcode{#1 g\ifPDFstrokecolor\space#1 G\fi}}
+ {\PDFcode{#1 g\ifPDFstrokecolor\space#1 G\fi}}
+
+\def\doPDFstartspotcolormode#1#2% redefining spotcolors is not possible anyway
+ {\ifundefined{pdf:scs:#2}%
+ \bgroup
+ \getcommacommandsize[#2]%
+ \ifcase\commalistsize\or
+ \setxvalue{pdf:scs:#2}{#2 SCN #2 scn}% \setxvalue{pdf:scs:#2}{#2 SC #2 sc}%
+ \else
+ \let\PDFspotcolorspecs\empty
+ \def\dospotcolorcommand##1{\edef\PDFspotcolorspecs{\PDFspotcolorspecs##1\space}}%
+ \processcommacommand[#2]\dospotcolorcommand
+ \setxvalue{pdf:scs:#2}{\PDFspotcolorspecs SCN \PDFspotcolorspecs scn}%
+ \fi
+ \egroup
+ \fi
+% \PDFdirectcode{/#1 cs /#1 CS \PDFgetspotcolorspec{#2}}}
+ \PDFcode{/#1 cs /#1 CS \PDFgetspotcolorspec{#2}}}
+
+\def\PDFgetspotcolorspec#1%
+ {\executeifdefined{pdf:scs:#1}\empty} % better no default than one with too less args
+
+\def\doPDFstartnonecolormode
+% {\PDFdirectcode{/None CS 1 SC /None cs 1 sc}}
+ {\PDFcode{/None CS 1 SC /None cs 1 sc}}
+
+\def\doPDFstopcolormode
+% {\PDFdirectcode{0 g\ifPDFstrokecolor\space0 G\fi}}
+ {\PDFcode{0 g\ifPDFstrokecolor\space0 G\fi}}
+
+%D We need to register the spot colors and their fallbacks.
+
+% we cannot use /DeviceN since GS <=7.21 breaks on it
+% and Jaws does not handle it at all {[/DeviceN [/All|/None]
+% /Device#2 \PDFobjref\pdflastobj]} so we use separation
+% colors that work and print ok
+
+\def\doPDFregistersomespotcolor#1#2#3#4% implemented in the driver
+ {\writestatus\m!systems{missing spot color definition}\wait}
+
+\def\doPDFregisternonecolor % internal command
+ {\doPDFregistergrayspotcolor{None}{1}%
+ \globallet\doPDFregisternonecolor\relax}
+
+\def\doPDFregisterspotcolorname#1#2% implemented in the driver
+ {}
+
+\definespecial\doregisterspotcolorname{\doPDFregisterspotcolorname}
+
+\def\dodoPDFregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b
+ {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}%
+ {\ifcase#2\or dup #5 mul exch dup #6 mul exch #7 mul\else#5 #6 #7\fi}}
+
+\def\dodoPDFregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k
+ {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}%
+ {\ifcase#2\or dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul\else #5 #6 #7 #8\fi}}
+
+\def\dodoPDFregistergrayspotcolor#1#2#3#4#5% name noffractions names p's s
+ {\doPDFregistersomespotcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}%
+ {\ifcase#2\or #5 mul\else #5\fi}}
+
+% \let\doPDFregisterrgbspotcolor \dodoPDFregisterrgbspotcolor
+% \let\doPDFregistercmykspotcolor\dodoPDFregistercmykspotcolor
+% \let\doPDFregistergrayspotcolor\dodoPDFregistergrayspotcolor
+
+\def\doPDFregisterrgbspotcolor#1#2#3#4#5#6#7% name noffractions names p's r g b
+ {\ifRGBsupported
+ \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}%
+ \else
+ \edef\@@cl@@r{#5}\edef\@@cl@@g{#6}\edef\@@cl@@b{#7}%
+ \ifCMYKsupported
+ \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
+ \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \else
+ \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
+ \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s
+ \fi
+ \fi}
+
+\def\doPDFregistercmykspotcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k
+ {\ifCMYKsupported
+ \dodoPDFregistercmykspotcolor{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
+ \else
+ \edef\@@cl@@c{#5}\edef\@@cl@@m{#6}\edef\@@cl@@y{#7}\edef\@@cl@@k{#8}%
+ \ifRGBsupported
+ \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \dodoPDFregisterrgbspotcolor{#1}{#2}{#3}{#4}\@@cl@@r\@@cl@@g\@@cl@@b
+ \else
+ \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \dodoPDFregistergrayspotcolor{#1}{#2}{#3}{#4}\@@cl@@s
+ \fi
+ \fi}
+
+\def\doPDFregistergrayspotcolor{\dodoPDFregistergrayspotcolor}
+
+%D New and very experimental.
+
+\def\doPDFregistercmykindexcolor#1#2#3#4#5#6#7#8% name noffractions names p's c m y k
+ {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{CMYK}{0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0}%
+ {dup #5 mul exch dup #6 mul exch dup #7 mul exch #8 mul}}
+
+\def\doPDFregisterrgbindexcolor#1#2#3#4#5#6#7% name noffractions names p's r g b
+ {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{RGB}{0.0 1.0 0.0 1.0 0.0 1.0}%
+ {dup #5 mul exch dup #6 mul exch #7 mul}}
+
+\def\doPDFregistergrayindexcolor#1#2#3#4#5% name noffractions names p's s
+ {\doPDFregistersomeindexcolor{#1}{#2}{#3}{#4}{Gray}{0.0 1.0}%
+ {pop}}
+
+\let\checkpredefinedcolor\predefineindexcolor % we need an index in order to negate bitmaps
+
+\def\doPDFregisterfigurecolor#1% always an index color
+ {\dogetobjectreference
+ {PDFIX}
+ {\internalspotcolorname{#1}}
+ \PDFimagecolorreference}
+
+%D \macros
+%D {doPDFstartrotation,doPDFstoprotation}
+%D
+%D Rotating some text can be accomplished by setting the first
+%D four elements of the transform matrix. We only support some
+%D fixed angles. The \type{q}'s take care of grouping.
+
+% The original:
+%
+% \def\doPDFstartrotation#1%
+% {\PDFcode{q}%
+% \processaction
+% [#1]
+% [ 90=>\PDFcode{ 0 1 -1 0 0 0 cm},
+% 180=>\PDFcode{-1 0 0 -1 0 0 cm},
+% 270=>\PDFcode{ 0 -1 1 0 0 0 cm},
+% 360=>\PDFcode{ 1 0 0 1 0 0 cm}]}
+%
+% We cannot directly pass an angle, but have to calculate
+% factors (rx and ry). As in the \METAPOST\ to \PDF\
+% converter module we need to compensate the deformation
+% by setting (sx and sy).
+%
+% Optimized but bigger:
+%
+% \def\doPDFstartrotation#1%
+% {\PDFcode{q}%
+% \processaction
+% [#1]
+% [ 0=>\PDFcode{ 1 0 0 1 0 0 cm},
+% 90=>\PDFcode{ 0 1 -1 0 0 0 cm},
+% 180=>\PDFcode{-1 0 0 -1 0 0 cm},
+% 270=>\PDFcode{ 0 -1 1 0 0 0 cm},
+% 360=>\PDFcode{ 1 0 0 1 0 0 cm},
+% #1=>\setcalculatedcos\cos{#1}%
+% \setcalculatedsin\sin{#1}%
+% \PDFcode{\cos \space % cos
+% \sin \space % sin
+% \negated\sin\space % -sin
+% \cos \space % cos
+% 0 0 cm}]}
+%
+% Since the sine and cosine values are preset and rounded we
+% can use the next alternative without running into inaccuracies.
+
+\def\doPDFstartrotation#1% grouped
+ {\setcalculatedcos\cos{#1}%
+ \setcalculatedsin\sin{#1}%
+ \forcecolorhack
+ \PDFcode{q \cos\space\sin\space\negated\sin\space\cos\space0 0 cm}}
+
+\def\doPDFstoprotation
+ {\PDFcode{Q}}
+
+%D \macros
+%D {doPDFstartscaling,doPDFstopscaling}
+%D
+%D Scaling is rather straightforward:
+
+\def\@@PDFzeroscale{.0001}
+
+\def\doPDFstartscaling#1#2% the test is needed because acrobat is bugged!
+ {\forcecolorhack
+ \PDFcode{q \ifdim#1\points=\zeropoint\@@PDFzeroscale\else#1\fi\space 0 0
+ \ifdim#2\points=\zeropoint\@@PDFzeroscale\else#2\fi\space 0 0 cm}}
+
+% \def\doPDFstartscaling#1#2% the test is needed because acrobat is bugged!
+% {\PDFcode{q\ifdim#1\points=\zeropoint\else\ifdim#2\points=\zeropoint\else
+% \space#1\space 0 0 #2\space 0 0 cm\fi\fi}}
+
+\def\doPDFstopscaling
+ {\PDFcode{Q}}
+
+%D \macros
+%D {doPDFstartmirroring,doPDFstopmirroring}
+%D
+%D Mirroring is implemented in a similar way:
+
+\def\doPDFstartmirroring
+ {\PDFcode{-1 0 0 1 0 0 cm}}
+
+\def\doPDFstopmirroring
+ {\PDFcode{-1 0 0 1 0 0 cm}}
+
+%D \macros
+%D {doPDFstartnegative,doPDFstopnegative}
+%D
+%D When producing output for an image setter, sometimes negative
+%D output is needed.
+
+\def\doPDFstartnegative
+ {\ifx\initializePDFnegative\undefined\else
+ \initializePDFnegative
+% \PDFdirectcode{/GSnegative gs}%
+ \PDFcode{/GSnegative gs}%
+ \fi}
+
+\def\doPDFstopnegative
+ {\ifx\initializePDFnegative\undefined\else
+ \initializePDFnegative
+% \PDFdirectcode{/GSpositive gs}%
+ \PDFcode{/GSpositive gs}%
+ \fi}
+
+%D \macros
+%D {doPDFstartoverprint,doPDFstopoverprint}
+%D
+%D Some printers like overprint more than knockout.
+
+\def\doPDFstartoverprint
+ {\ifx\initializePDFoverprint\undefined\else
+ \initializePDFoverprint
+% \PDFdirectcode{/GSoverprint gs}%
+ \PDFcode{/GSoverprint gs}%
+ \fi}
+
+\def\doPDFstopoverprint
+ {\ifx\initializePDFoverprint\undefined\else
+ \initializePDFoverprint
+% \PDFdirectcode{/GSknockout gs}%
+ \PDFcode{/GSknockout gs}% wrong
+ \fi}
+
+%D Transparency support:
+
+\newif\ifPDFtransparencysupported
+
+\def\PDFtransparancydictionary#1#2#3% type fraction extras
+ {<</Type /ExtGState
+ /ca #2 /CA #2
+ /BM /\ifcase#1 Normal\or Normal\or Multiply\or Screen\or
+ Overlay\or SoftLight\or HardLight\or ColorDodge\or
+ ColorBurn\or Darken\or Lighten\or Difference\or
+ Exclusion\else Compatible\fi
+ #3>>}
+
+\def\dodoPDFstarttransparency#1#2%
+ {\presetPDFtransparency{#1}{#2}%
+ \PDFcode{\PDFtransparencyidentifier\space gs }}
+
+\def\dodoPDFstoptransparency
+ {\PDFcode{/Tr0 gs }}
+
+\def\doPDFstarttransparency
+ {\ifPDFtransparencysupported
+ \global\let\doPDFstarttransparency\dodoPDFstarttransparency
+ \global\let\doPDFstoptransparency \dodoPDFstoptransparency
+ \initializetransparency
+ \expandafter\doPDFstarttransparency
+ \else
+ \expandafter\gobbletwoarguments
+ \fi}
+
+% \let\doPDFstoptransparency\relax
+%
+% This is tricky: because a text stream is handled before
+% the page body is built, we can run into stops that will
+% match an outer start; however, the stop is needed in case
+% of a text color: [text color text] [other color text] on a
+% first page combined with color splitting will go wrong if
+% we stick to the relaxing method.
+
+\def\doPDFstoptransparency
+ {\ifPDFtransparencysupported
+ \initializetransparency
+ \dodoPDFstoptransparency
+ \fi}
+
+%D These use:
+
+\let\PDFtransparencyresetreference \empty
+\let\PDFtransparencyresetidentifier\empty
+
+\let\PDFtransparencyreference \empty
+\let\PDFtransparencyidentifier\empty
+
+\let\presetPDFtransparency \gobbletwoarguments
+\let\initializetransparency\relax
+
+%D New trickery:
+
+\definespecial\dostartgraphicgroup{\PDFcode{q}}
+\definespecial\dostopgraphicgroup {\PDFcode{Q}}
+
+%D Even newer trickery:
+
+\definespecial\dostartviewerlayer {\doPDFstartlayer}
+\definespecial\dostopviewerlayer {\doPDFstoplayer}
+\definespecial\dodefineviewerlayer{\doPDFdefinelayer}
+
+\let\PDFtextlayers\empty
+\let\PDFpagelayers\empty
+\let\PDFhidelayers\empty
+\let\PDFvidelayers\empty
+
+% \def\doPDFstartlayer#1{\PDFdirectcode{/OC /#1 BDC}}
+% \def\doPDFstoplayer {\PDFdirectcode {EMC}}
+
+\def\doPDFstartlayer#1{\PDFcode{/OC /#1 BDC}}
+\def\doPDFstoplayer {\PDFcode {EMC}}
+
+% resource -> prop -> mc's -> OCG|OCMD (nested)
+
+% ocg:
+
+% /Intent/Design
+
+% ocmd
+
+% /P /AllOn
+
+% kan zelf ocmd bevatten
+
+\def\doPDFdefinelayer#1#2#3#4#5% tag title visible type printable
+ {\doPDFdictionaryobject{PDLN}{#1}
+ {/Type /OCG
+ \ifcase#4 \or
+ /Intent /Design % disable layer hiding by user
+ \fi
+ \ifnum#5=\zerocount
+ /Usage << /Print << /PrintState /OFF >> >> % printable or not
+ \fi
+ /Name (#2)}%
+ \doPDFgetobjectreference{PDLN}{#1}\PDFobjectreference
+ \xdef\PDFtextlayers{\PDFtextlayers\space\PDFobjectreference}%
+ \doifelse{#3}\v!start
+ {\xdef\PDFvidelayers{\PDFvidelayers\space\PDFobjectreference}}%
+ {\xdef\PDFhidelayers{\PDFhidelayers\space\PDFobjectreference}}%
+ \doPDFdictionaryobject{PDLD}{#1}
+ {/Type /OCMD
+ /OCGs [\PDFobjectreference]}%
+ \doPDFgetobjectreference{PDLD}{#1}\PDFobjectreference
+ \xdef\PDFpagelayers{\PDFpagelayers\space /#1 \PDFobjectreference}}
+
+\def\flushPDFtextlayers
+ {\ifx\PDFtextlayers\empty \else
+ \driverreferenced \doPDFarrayobject{PDF}{textlayers}{\PDFtextlayers}%
+ \doPDFgetobjectreference{PDF}{textlayers}\!!stringa
+ \ifx\PDFvidelayers\empty
+ \def\!!stringb{[null]}%
+ \else
+ \driverreferenced \doPDFarrayobject{PDF}{videlayers}{\PDFvidelayers}%
+ \doPDFgetobjectreference{PDF}{videlayers}\!!stringb
+ \fi
+ \ifx\PDFhidelayers\empty
+ \def\!!stringc{[null]}%
+ \else
+ \driverreferenced \doPDFarrayobject{PDF}{hidelayers}{\PDFhidelayers}%
+ \doPDFgetobjectreference{PDF}{hidelayers}\!!stringc
+ \fi
+ \doPDFaddtocatalog
+ {/OCProperties
+ << % display in menu
+ /D << /Order \!!stringa
+ /ON \!!stringb
+ /OFF \!!stringc >>
+ % used properties
+ /OCGs \!!stringa >>}%
+ \globallet\flushPDFtextlayers\relax
+ \fi}
+
+\def\flushPDFpagelayers
+ {\ifx\PDFpagelayers\empty \else
+ \doPDFpageresource{/Properties <<\PDFpagelayers>>}%
+ \fi}
+
+\prependtoksonce \flushPDFpagelayers \to \everyshipout
+\prependtoksonce \flushPDFtextlayers \to \everylastshipout
+
+\def\PDFlayeractionlist{null}
+
+\def\PDFexecutehidelayer {/SetOCGState /State [/OFF \PDFlayeractionlist]}
+\def\PDFexecutevidelayer {/SetOCGState /State [/ON \PDFlayeractionlist]}
+\def\PDFexecutetogglelayer {/SetOCGState /State [/Toggle \PDFlayeractionlist]}
+
+\def\domakeviewerlayerlist#1%
+ {\bgroup
+ \globallet\PDFlayeractionlist\empty
+ \def\docommand##1%
+ {\doPDFgetobjectreference{PDLN}{##1}\PDFobjectreference
+ \xdef\PDFlayeractionlist{\PDFlayeractionlist\space\PDFobjectreference}}%
+ \processcommalist[#1]\docommand
+ \egroup}
+
+%D Something rather pdf dependent:
+
+% #1 => 1=fill 2=stroke 3=strokedfill 4=invisible
+% #2 => linewidth
+% #3 => spacing (beware, one needs to set the hsize as well)
+
+\def\doPDFstartfonteffect#1#2#3%
+ {\ifdim#2>\zeropoint
+ \PointsToBigPoints{#2}\ascii
+% \PDFdirectcode{\ascii\space w}%
+ \PDFcode{\ascii\space w}%
+ \fi
+ \ifdim#3\points=\onepoint\else
+ \scratchdimen#3\points
+% \PDFdirectcode{\withoutpt{\the\scratchdimen}\space Tc}%
+ \PDFcode{\withoutpt{\the\scratchdimen}\space Tc}%
+ \fi
+% \PDFdirectcode{\purenumber#1 Tr}}
+ \PDFcode{\purenumber#1 Tr}}
+
+\def\doPDFstopfonteffect
+% {\PDFdirectcode{1 w 0 Tc 0 Tr}}
+ {\PDFcode{1 w 0 Tc 0 Tr}}
+
+%D Handy for the \METAPOST\ to \PDF\ converter:
+
+\ifdefined\everyPDFximage \else \newtoks\everyPDFximage \fi
+\ifdefined\everyPDFxform \else \newtoks\everyPDFxform \fi
+
+\appendtoksonce
+ \collectPDFresources
+ \global\let\currentPDFresources\collectedPDFresources
+\to \everyPDFxform
+
+\let\collectedPDFresources\empty
+
+\def\collectPDFresources % suboptimal
+ {\doifobjectreferencefoundelse{FDF}{docushades} % redundant, we have an reserved object now
+ {\doPDFgetobjectreference{FDF}{docushades}\PDFobjectreference
+ \xdef\collectedPDFresources{\collectedPDFresources/Shading \PDFobjectreference}}\donothing
+ \doifobjectreferencefoundelse{FDF}{docuextgstates}
+ {\doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference
+ \xdef\collectedPDFresources{\collectedPDFresources/ExtGState \PDFobjectreference}}\donothing
+ \doifobjectreferencefoundelse{FDF}{docupatterns}
+ {\doPDFgetobjectreference{FDF}{docupatterns}\PDFobjectreference
+ \xdef\collectedPDFresources{\collectedPDFresources/Pattern \PDFobjectreference}}\donothing
+ \doifobjectreferencefoundelse{FDF}{colorspaces}
+ {\doPDFgetobjectreference{FDF}{colorspaces}\PDFobjectreference
+ \xdef\collectedPDFresources{\collectedPDFresources/ColorSpace \PDFobjectreference}}\donothing
+ \global\let\collectPDFresources\relax}
+
+%D And that was about all.
+
+\stopspecials
+
+\ifx\fullytransparentcolor\undefined \else
+
+ \def\fullytransparentcolor
+ {\doPDFregisternonecolor
+ \doPDFstartnonecolormode}
+
+ \let\doPDFstarttransparency\gobbletwoarguments
+ \let\doPDFstoptransparency\relax
+
+\fi
+
+%D Temporary hack:
+
+\def\TransparencyHack % png: /CS /DeviceRGB /I true
+ {\appendtoks
+ \doPDFpageattribute{/Group << /S /Transparency /I true /K true>>}%
+ \to \everyPDFxform
+ \appendtoks
+ \doPDFpageattribute{/Group << /S /Transparency /I true /K true>>}%
+ \to \everyshipout}
+
+%D We still need to implement a few helpers:
+
+\chardef\safePDFcode=`-
+
+\def\setPDFdestination#1%
+ {\bgroup
+ \retainlccodes
+ \lccode`\/\safePDFcode \lccode`\#\safePDFcode
+ \lccode`\<\safePDFcode \lccode`\>\safePDFcode
+ \lccode`\[\safePDFcode \lccode`\]\safePDFcode
+ \lccode`\(\safePDFcode \lccode`\)\safePDFcode
+ \ifovercomePDFspace
+ \lccode`\ \safePDFcode
+ \fi
+ \ifovercomePDFbugs
+ \xdef\PDFdestination{'#1'}%
+ \else
+ \xdef\PDFdestination{#1}%
+ \fi
+ % nicer \xdef\PDFdestination{\ifovercomePDFbugs'\fi#1\ifovercomePDFbugs'\fi}%
+ \lowercase\@EA{\@EA\xdef\@EA\PDFdestination\@EA{\PDFdestination}}%
+ \egroup}
+
+%D This is much faster since we don't have to set the full
+%D range of lc-codes; about 5 sec on a 1000mhz PIII for
+%D 20K named destinations "x(x) x"). Of course when you use
+%D page destinations, the saving is nil.
+
+% \doifnotmode{atpragma}{\let\next\setPDFdestination} % experimental
+%
+% \catcode`\/=\@@active \catcode`\#=\@@active
+% \catcode`\<=\@@active \catcode`\>=\@@active
+% \catcode`\[=\@@active \catcode`\]=\@@active
+% \catcode`\(=\@@active \catcode`\)=\@@active
+%
+% \gdef\PDFrepchar{-}
+%
+% \gdef\setPDFdcharacters
+% {\catcode`\/=\@@active \let/\PDFrepchar
+% \catcode`\#=\@@active \let#\PDFrepchar
+% \catcode`\<=\@@active \let<\PDFrepchar
+% \catcode`\>=\@@active \let>\PDFrepchar
+% \catcode`\[=\@@active \let[\PDFrepchar
+% \catcode`\]=\@@active \let]\PDFrepchar
+% \catcode`\(=\@@active \let(\PDFrepchar
+% \catcode`\)=\@@active \let)\PDFrepchar}
+%
+% \egroup
+%
+% \def\setPDFdestination#1% expansion is needed, otherwise embedded
+% {\bgroup % macros will not expand under the new
+% \setPDFdcharacters % catcode regime
+% \ifovercomePDFspace
+% \catcode32=\@@ignore
+% \fi
+% \xdef\PDFdestination{\ifovercomePDFbugs'\fi#1\ifovercomePDFbugs'\fi}%
+% \scantokens\@EA{\@EA\xdef\@EA\PDFdestination\@EA{\PDFdestination}}%
+% \egroup}
+%
+% \doifnotmode{atpragma}{\let\setPDFdestination\next} % experimental
+
+%D This is a slow one, that uses \type{\lccode}'s to
+%D change the glyph as well as converts sensisitve ones into a
+%D \PDF\ command sequence, so \type{(} becomes \type{\(}. In
+%D fact we translate the string to lowercase inactive and non
+%D special characters, limit their number and finaly convert
+%D some of the characters to save ones.
+
+\chardef\maxPDFstringsize=60
+
+\def\sanitizePDFstring#1\to#2% bugged
+ {\bgroup
+ \retainlccodes
+ \lccode`( \zerocount \lccode`) \zerocount
+ \lccode`< \zerocount \lccode`> \zerocount
+ \lccode`[ \zerocount \lccode`] \zerocount
+ \lccode`\\\zerocount \lccode`/ \zerocount
+ \lowercase{\defconvertedargument\ascii{#1}}%
+ % by integrating the split in the loop below
+ % \splitofftokens\maxPDFstringsize\from\ascii\to\ascii
+ % we diminish the processing time considerably
+ \scratchcounter\maxPDFstringsize
+ \def\docommand##1%
+ {\ifcase\scratchcounter\else
+ \advance\scratchcounter \minusone
+ \ifcase\lccode`##1\relax
+ \xdef#2{#2\expandafter\string\csname##1\endcsname}%
+ \else
+ \xdef#2{#2##1}%
+ \fi
+ \fi}%
+ %\global\let#2=\empty
+ % or to permit #2 to be \ascii too:
+ \global\@EA\let\@EA#2\@EA\empty
+ \@EA\handletokens\ascii\with\docommand
+ \egroup}
+
+% \doifnotmode{atpragma}{\let\next\sanitizePDFstring} % experimental
+%
+% \bgroup
+%
+% \catcode`\.=\@@escape
+%
+% .catcode`./=.@@active
+% .catcode`.<=.@@active .catcode`.>=.@@active
+% .catcode`.[=.@@active .catcode`.]=.@@active
+% .catcode`.(=.@@active .catcode`.)=.@@active
+%
+% .gdef.setPDFscharacters%
+% {.catcode`.\=.@@other
+% .catcode`./=.@@active .def/{.noexpand./}%
+% .catcode`.<=.@@active .def<{.noexpand.<}%
+% .catcode`.>=.@@active .def>{.noexpand.>}%
+% .catcode`.[=.@@active .def[{.noexpand.[}%
+% .catcode`.]=.@@active .def]{.noexpand.]}%
+% .catcode`.(=.@@active .def({.noexpand.(}%
+% .catcode`.)=.@@active .def){.noexpand.)}}
+%
+% .gdef.sanitizePDFstring#1.to#2%
+% {.bgroup
+% .setPDFscharacters
+% .catcode`=.@@escape
+% .edef.next{.strippedcsname#2}%
+% .scantokens{setxvalue{next}{#1}}%
+% .egroup}
+%
+% .egroup
+%
+% \doifnotmode{atpragma}{\let\sanitizePDFstring\next} % experimental
+%
+% There is an unicode variant in spec-tst!
+
+\protect \endinput
diff --git a/tex/context/base/spec-ini.mkii b/tex/context/base/spec-ini.mkii
new file mode 100644
index 000000000..0229a0e3d
--- /dev/null
+++ b/tex/context/base/spec-ini.mkii
@@ -0,0 +1,559 @@
+%D \module
+%D [ file=spec-ini,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special 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.
+
+% todo: make this one more plain so that i can use it in plain jobs
+% todo: no args, named vars instead
+% maybe also drop multiple drivers and make simplify the default, then simplier defs
+
+\newif\ifsimplifyspecials \simplifyspecialstrue % see later
+
+%D We will forbid loading specials after the first page is
+%D shipped out.
+
+\ifx\realpageno\undefined
+ \countdef\realpageno=0 \realpageno=1
+\fi
+
+%D Specials are \TEX's channel to the outside world. They make
+%D \TEX\ even more platform independant and permit easy
+%D adaption to new developments. One major drawback of specials
+%D is that they have to be supported by printer drivers. We've
+%D tried to overcome this problem by implementing specials as
+%D a sort of drivers themselves.
+
+\writestatus{loading}{ConTeXt Special Macros / Initialization}
+
+\unprotect
+
+%D \TEX\ produces files in the \DVI\ format. This format is
+%D well defined and stable. In this format one||byte commands
+%D are used which can optionally be followed by length
+%D specifiers and arguments. The \DVI||format incorporates a
+%D channel to the outside world. This channel is activated by
+%D the \TEX\ primitive \type {\special}. The sequence
+%D
+%D \starttyping
+%D \special{Hello here I am.}
+%D \stoptyping
+%D
+%D results in \DVI||codes:
+%D
+%D \starttyping
+%D xxx1 16 Hello here I am.
+%D \stoptyping
+%D
+%D The \type {xxx1} is represented in byte code 239 and the
+%D number of following bytes in a~1, 2, 3 or~4 byte number. So
+%D here we get $1+1+16$ bytes of code.
+%D
+%D Translating these codes is upto the \DVI\ driver. It's
+%D common use to ignore specials that cannot be interpreted, so
+%D the example string should have no consequences for the
+%D output.
+
+%D \macros
+%D {jobsuffix}
+%D
+%D By default, \TEX\ produces \DVI\ files which can be
+%D converted to other filetypes. Sometimes it is handy to
+%D know what the target file will be. In other driver
+%D modules we wil set \type {\jobsuffix} to \type {pdf}.
+
+\def\jobsuffix{dvi}
+
+\def\setjobsuffix#1%
+ {\resetsystemmode\jobsuffix
+ \edef\jobsuffix{#1}%
+ \setsystemmode\jobsuffix}
+
+%D \macros
+%D {everyresetspecials}
+%D
+%D Now what will this one do? We'll see in a few lines.
+
+\newtoks \everyresetspecials
+
+\appendtoksonce
+ \ifx\setjobsuffix\undefined\else\setjobsuffix{dvi}\fi
+\to \everyresetspecials
+
+%D A rather fundamental difference between special and direct
+%D settings is that the latter don't interfere with typesetting
+%D but must be set before the first shipout, while the specials
+%D must be packaged in the shipped out box in such a way that
+%D they don't interfere.
+
+\newif\ifspecialbasedsettings \specialbasedsettingstrue
+
+\appendtoksonce
+ \specialbasedsettingstrue
+\to \everyresetspecials
+
+%D Because there is no standardization in the use of specials,
+%D more than one driver or program can be supported. The
+%D specials are grouped in libraries. Some of these are
+%D general, such as the \type{postscript} library, some are
+%D tuned to a special kind of program, like the \type{pdf}
+%D ones, and some support a specific driver, as we can see in
+%D the \type{yandy} library. A library is build with the
+%D commands:
+%D
+%D \starttyping
+%D \startspecials[name][inheritance]
+%D
+%D \definespecial\none{...}
+%D \definespecial\onlyone#1{...}
+%D \definespecial\alot#1#2#3#4{...}
+%D
+%D \stopspecials
+%D \stoptyping
+%D
+%D Because drivers can have overlap in low level macros, a
+%D mechanism of inheritance is implemented. The libraries
+%D defined as second argument are loaded first.
+%D
+%D Every special has to be predefined first. We do this with
+%D the command:
+%D
+%D \starttyping
+%D \installspecial [\none] [and] [0]
+%D \installspecial [\onlyone] [and] [1]
+%D \installspecial [\alot] [or] [4]
+%D \stoptyping
+%D
+%D This means as much as: there is a special names
+%D \type{\none} which has no arguments and has more than one
+%D appearance. The special \type{\alot} on the other hand has
+%D four arguments and is only defined once. Every instance in
+%D the libraries of a special of category \type{and} is
+%D executed when called upon, but only one special of
+%D category \type{or} can be active. Most of the
+%D \type{postscript}||specials are of category \type{or},
+%D because they tend to interfere with driver specific ones.
+%D The interactive specials of \type{dviwindo} and \type{pdf}
+%D are an example of specials that can be called both.
+%D
+%D A library is defined in a file with the name
+%D \type{spec-...}. We load a library with the command:
+%D
+%D \starttyping
+%D \usespecials [list]
+%D \stoptyping
+%D
+%D where the list can contain one or more file tags, the
+%D \type{...} in the filename. The keyword \type{reset}
+%D resets all loaded specials. This is equivalent to
+%D \type{\resetspecials}.
+
+%D Although a mechanism of nesting can be implemented, we
+%D prefer to use a inheritance mechanism as mentioned. Calls
+%D upon \type{\usespecials} within a \type{\startspecials}
+%D would lead to confusion and errors.
+
+\newif\ifinheritspecials
+
+%D We define some local constants and variables. They look a
+%D bit horrible but we don't want conflicts.
+
+\def\@@specfil@@{@@spcfil@@}
+\def\@@speclst@@{@@spclst@@}
+\def\@@speccat@@{@@spccat@@}
+\def\@@specarg@@{@@spcarg@@}
+\def\@@specexc@@{@@spcexc@@}
+
+% not faster
+%
+% \def\@@specfil@@{@sp@f@}
+% \def\@@speclst@@{@sp@l@}
+% \def\@@speccat@@{@sp@c@}
+% \def\@@specarg@@{@sp@a@}
+% \def\@@specexc@@{@sp@e@}
+
+\let\currentspecial \empty
+\let\currentspecialfile\empty
+
+%D \macros
+%D {startspecials}
+%D
+%D Every library has a unique name, which is given as the first
+%D argument to \type{\startspecials}. When another library is
+%D defined with the same name, previous specials can be
+%D overruled. The name may differ from the file||tag.
+%D
+%D The optional second argument can consist of a list of
+%D libraries that are to be loaded first.
+
+\def\dostartspecials[#1][#2]%
+ {\doifsomething{#2}
+ {\processcommalist[#2]\dousespecials}%
+ \doifelsenothing{#1}
+ {\let\currentspecial\s!unknown}
+ {\def\currentspecial{#1}}%
+ \unprotect}
+
+\def\startspecials
+ {\localpushmacro\currentspecial
+ \dodoubleempty\dostartspecials}
+
+\def\stopspecials
+ {\localpopmacro\currentspecial
+ \protect}
+
+%D \macros
+%D {installspecial,
+%D resetspecials}
+%D
+%D We have to install specials before we can define and use
+%D them. The command itself is defined as a call to another
+%D command that executes one or more user||defined specials,
+%D depending of it's category: \type{or} versus \type{and}.
+%D
+%D The command \type{\installspecial} takes three
+%D (non||optional) arguments: the name of the command, the
+%D category it belongs to and the number of arguments it
+%D takes.
+%D
+%D With \type{\resetspecials} we can unload the predefined
+%D specials. Special reset actions |<|look in \type{spec-mis}
+%D for an example|>| can be assigned to the token register
+%D \type{\everyresetspecials}.
+
+\let\@@allspecials=\empty
+
+\def\doinstallspecial[#1][#2][#3]%
+ {\letvalue{\@@speclst@@\string#1}\empty
+ \setvalue{\@@speccat@@\string#1}{#2}%
+ \setvalue{\@@specarg@@\string#1}{#3}%
+ \addtocommalist{\string#1}\@@allspecials
+ \def#1{\executespecial#1}}
+
+\def\installspecial
+ {\dotripleargument\doinstallspecial}
+
+\def\resetspecials
+ {\the\everyresetspecials
+ \def\docommand##1%
+ {\letvalue{\@@speclst@@##1}\empty}%
+ \processcommacommand[\@@allspecials]\docommand}
+
+%D \macros
+%D {definespecial}
+%D
+%D The command \type{\definespecial} take the place of
+%D \type{\def} in the definition of a special. Just to be
+%D sure, we first check if the command is permitted, i.e.
+%D installed. If not, we give a warning and gobble the
+%D illegal command in an quite elegant way.
+%D
+%D If the command can be combined (\type{and}) with others,
+%D we append it to a list, otherwise (\type{or}) it becomes
+%D the only item in the list.
+
+\def\definespecial#1%
+ {\ifx#1\undefined
+ \showmessage\m!specials4{\string#1}%
+ \def\next
+ {\def\@@illegalspecial@@}%
+ \else
+ \def\next
+ {\doifelsevalue{\@@speccat@@\string#1}{or}
+ {\edef\@@newspeclst@@{\currentspecial}}
+ {\edef\@@newspeclst@@{\getvalue{\@@speclst@@\string#1}}%
+ \addtocommalist\currentspecial\@@newspeclst@@}%
+ \setevalue{\@@speclst@@\string#1}{\@@newspeclst@@}%
+ \setvalue{\currentspecial\string#1}}%
+ \fi
+ \next}
+
+%D \macros
+%D {usespecials}
+%D
+%D We use \type{\usespecials} to load a specific library.
+%D This command is only permitted outside the definition part.
+
+\def\dousespecials#1%
+ {\doifelse{#1}\v!reset
+ {\resetspecials}
+ {\doifdefinedelse{\@@specfil@@#1}
+ {\edef\currentspecialfile{\getvalue{\@@specfil@@#1}}}
+ {\edef\currentspecialfile{#1}}%
+ \makeshortfilename[\truefilename{\f!specialprefix\currentspecialfile}]%
+ \startreadingfile
+ \readsysfile{\shortfilename.mkii}{\showmessage\m!specials5\currentspecialfile}\donothing
+ \stopreadingfile}}
+
+\def\usespecials[#1]%
+ {\ifnum\realpageno<2
+ \doifelsenothing\currentspecial
+ {\processcommalist[#1]\dousespecials}
+ {\showmessage\m!specials6\empty}%
+ \fi}
+
+%D \macros
+%D {executespecials}
+%D
+%D The command \type{\executespecials} is used to execute the
+%D defined specials. Once a special is installed, the special
+%D itself calls for this command, so it's not needed outside
+%D this module. One can use it if wanted.
+%D
+%D A former implementation grouped the execution. Recent
+%D additions however |<|like the specials that implement object
+%D handling|>| asked for non||grouped execution.
+
+%D \starttyping
+%D \def\executespecials#1#2%
+%D {\def\doonespecial##1%
+%D {\getvalue{##1\string#1}#2\relax}%
+%D \processcommacommand
+%D [\getvalue{\@@speclst@@\string#1}]\doonespecial}
+%D
+%D \def\executespecial#1%
+%D {\expandafter\ifcase\getvalue{\@@specarg@@\string#1}\relax
+%D \def\next%
+%D {\executespecials#1{}}%
+%D \or
+%D \def\next##1%
+%D {\executespecials#1{{##1}}}%
+%D \or
+%D \def\next##1##2%
+%D {\executespecials#1{{##1}{##2}}}%
+%D \or
+%D \def\next##1##2##3%
+%D {\executespecials#1{{##1}{##2}{##3}}}%
+%D \or
+%D \def\next##1##2##3##4%
+%D {\executespecials#1{{##1}{##2}{##3}{##4}}}%
+%D \or
+%D \def\next##1##2##3##4##5%
+%D {\executespecials#1{{##1}{##2}{##3}{##4}{##5}}}%
+%D \or
+%D \def\next##1##2##3##4##5##6%
+%D {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}}}%
+%D \or
+%D \def\next##1##2##3##4##5##6##7%
+%D {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}}}%
+%D \or
+%D \def\next##1##2##3##4##5##6##7##8%
+%D {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}}}%
+%D \or
+%D \def\next##1##2##3##4##5##6##7##8##9%
+%D {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}{##9}}}%
+%D \else
+%D \def\next%
+%D {\message{illegal special: \string#1}}%
+%D \fi
+%D \next}
+%D \stoptyping
+%D
+%D Because specials happen quite often, we will use a bit more
+%D brute force. Keep in mind that we have to collect the
+%D arguments because we want to support more drivers at once.
+%D
+%D I tested this on the next test. Where the previous alternative
+%D took about 32 seconds, the new alternative takes 25 seconds.
+%D
+%D \starttyping
+%D \testfeature{10000}{\setbox0=\hbox{test \color[red]{oeps} test}}
+%D \stoptyping
+
+\def\@@exsp{exsp}
+
+\setvalue{\@@exsp0}{{}}
+\setvalue{\@@exsp1}#1{{{#1}}}
+\setvalue{\@@exsp2}#1#2{{{#1}{#2}}}
+\setvalue{\@@exsp3}#1#2#3{{{#1}{#2}{#3}}}
+\setvalue{\@@exsp4}#1#2#3#4{{{#1}{#2}{#3}{#4}}}
+\setvalue{\@@exsp5}#1#2#3#4#5{{{#1}{#2}{#3}{#4}{#5}}}
+\setvalue{\@@exsp6}#1#2#3#4#5#6{{{#1}{#2}{#3}{#4}{#5}{#6}}}
+\setvalue{\@@exsp7}#1#2#3#4#5#6#7{{{#1}{#2}{#3}{#4}{#5}{#6}{#7}}}
+\setvalue{\@@exsp8}#1#2#3#4#5#6#7#8{{{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}
+\setvalue{\@@exsp9}#1#2#3#4#5#6#7#8#9{{{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}}
+
+%D \starttyping
+%D \def\executespecials#1%
+%D {\def\doonespecial##1%
+%D {\csname##1\xspecialcommand\endcsname#1\relax}%
+%D \@EA\rawprocesscommalist\@EA
+%D [\csname\@@speclst@@\xspecialcommand\endcsname]\doonespecial}
+%D
+%D \def\executespecial#1%
+%D {\def\xspecialcommand{\string#1}%
+%D \@EA\@EA\@EA\executespecials\csname\@@exsp\csname\@@specarg@@\xspecialcommand\endcsname\endcsname}
+%D \stoptyping
+
+%D Some more speed can be gained by using a dedicated string
+%D processing routine. Now we can bring down the execution
+%D time to 21 seconds, one third less than the original run time.
+
+\def\executespecials#1%
+ {\@EA\let\@EA\speciallist\csname\@@speclst@@\xspecialcommand\endcsname
+ \ifx\speciallist\empty\else
+ \def\doonespecial##1%
+ {\csname##1\xspecialcommand\endcsname#1\relax}%
+ \@EA\dodoonespecial\speciallist,\end,%
+ \fi}
+
+\def\executespecial#1%
+ {\def\xspecialcommand{\string#1}%
+ \@EA\@EA\@EA\executespecials\csname\@@exsp\csname\@@specarg@@\xspecialcommand\endcsname\endcsname}
+
+\def\dodoonespecial#1,%
+ {\ifx\end#1\else
+ \doonespecial{#1}\expandafter\dodoonespecial
+ \fi}
+
+%D This kind of saving only shows up when making interative
+%D documents with lots of color switches. In such documents
+%D tens of thousands of special calls are rather normal.
+%D On a 650 Mhz Pentium, the previous test takes 15 seconds
+%D less (on about 65 seconds). When processing 2000 page
+%D interactive documents this saving can be neglected.
+
+%D In the previous macros, the \type{{{...}}} are needed
+%D because we pass all those arguments to the specials support
+%D macro.
+
+\let\openspecialfile \relax
+\let\closespecialfile \relax
+
+%D \macros
+%D {doifspecialavailableelse}
+%D
+%D For testing purposes (this was first needed when object
+%D support was implemented) we have:
+%D
+%D \starttyping
+%D \doifspecialavailableelse\specialcommand{true}{false}
+%D \stoptyping
+%D
+%D e.g:
+%D
+%D \starttyping
+%D \doifspecialavailableelse\doinsertobject{...}{...}
+%D \stoptyping
+
+\def\doifspecialavailableelse#1#2#3%
+ {\doifelsevaluenothing{\@@speclst@@\string#1}{#3}{#2}}
+
+%D So far for the macros that deal with installing specials.
+%D In the file \type {spec-def} you will find the predefined
+%D specials.
+
+%D Now that we have seen the flexible way (permitting
+%D special chains) we will implement a faster and flat
+%D alternative. But only if flag si set.
+
+\ifsimplifyspecials
+
+ \def\doinstallspecial[#1][#2][#3]%
+ {\appendtoks\forgetspecial#1{#3}\to\everyresetspecials
+ \@EA\chardef\csname\@@speclst@@\string#1\endcsname\zerocount
+ \forgetspecial#1{#3}}
+
+ \def\forgetspecial#1#2%
+ {\ifcase#2\relax
+ \let#1\relax \or
+ \let#1\gobbleoneargument \or
+ \let#1\gobbletwoarguments \or
+ \let#1\gobblethreearguments \or
+ \let#1\gobblefourarguments \or
+ \let#1\gobblefivearguments \or
+ \let#1\gobblesixarguments \or
+ \let#1\gobblesevenarguments \or
+ \let#1\gobbleeightarguments \or
+ \let#1\gobbleninearguments \or
+ \let#1\gobbletenarguments \fi}
+
+ \def\resetspecials
+ {\the\everyresetspecials}
+
+ \def\definespecial#1%
+ {\@EA\chardef\csname\@@speclst@@\string#1\endcsname=1
+ \def#1}
+
+ \def\doifspecialavailableelse#1%
+ {\ifcase\csname\@@speclst@@\string#1\endcsname
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\fi
+
+%D For quite some time the \CONTEXT\ way of specifying the
+%D output format has been:
+%D
+%D \starttyping
+%D \usespecials[ps,yy,win,pdf]
+%D \stoptyping
+%D
+%D Because at \PRAGMA\ we use \DVIPSONE, this was a suitable
+%D setting, but with \CONTEXT\ going public, the next sequence
+%D is more suitable for \DVIPS\ users:
+%D
+%D \starttyping
+%D \usespecials[reset,ps,tr,pdf]
+%D \stoptyping
+%D
+%D On the other hand, for \PDFTEX\ we needed:
+%D
+%D \starttyping
+%D \usespecials[tpd]
+%D \stoptyping
+%D
+%D To simplify things, I decided to provide a higher level
+%D command.
+%D
+%D \starttyping
+%D \defineoutput[name][specials]
+%D \setupoutput[name,...]
+%D \stoptyping
+%D
+%D In a \type {spec-def} you can find some examples.
+
+\def\defineoutput
+ {\dodoubleargument\dodefineoutput}
+
+\def\dodefineoutput[#1][#2]%
+ {\setvalue{\??ui#1}{#2}}
+
+\def\dosetupoutput#1%
+ {\doifdefinedelse{\??ui#1}
+ {\processcommacommand[\getvalue{\??ui#1}]\dousespecials}
+ {\doifdefinedelse{\@@specfil@@#1}
+ {\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]%
+ {\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-mis.mkii b/tex/context/base/spec-mis.mkii
new file mode 100644
index 000000000..3d263eace
--- /dev/null
+++ b/tex/context/base/spec-mis.mkii
@@ -0,0 +1,286 @@
+%D \module
+%D [ file=spec-mis,
+%D version=1997.04.01,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Miscellaneous Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Quite some modules in this group are dedicated to supporting
+%D \PDF\ directly by means of \PDFTEX or indirectly by using
+%D Acrobat Distiller. This module implements some common
+%D features.
+
+\writestatus{loading}{ConTeXt Special Macros / Miscellaneous Macros}
+
+\unprotect
+
+%D \macros
+%D {URLhash}
+%D
+%D A rather trivial macro:
+
+\expandafter\def\expandafter\URLhash\expandafter{\string#}
+
+%D \macros
+%D {ifusepagedestinations}
+%D
+%D In \PDF\ version 1.0 only page references were supported,
+%D while in \DVIWINDO\ 1.N only named references were accepted.
+%D Therefore \CONTEXT\ supports both methods of referencing. In
+%D \PDF\ version 1.1 named destinations arrived. Lack of
+%D continuous support of version 1.1 viewers for \MSDOS\
+%D therefore sometimes forces us to prefer page references. As
+%D a bonus, they are faster too and have no limitations. How
+%D fortunate we were having both mechanisms available when the
+%D version 3.0 (\PDF\ version 1.2) viewers proved to be too
+%D bugged to support named destinations.
+
+\newif\ifusepagedestinations
+
+%D \macros
+%D {ifhighlighthyperlinks}
+%D
+%D The next switch can be used to make user hyperlinks are
+%D not highlighted when clicked on.
+
+\newif\ifhighlighthyperlinks
+
+%D \macros
+%D {ifgotonewwindow}
+%D
+%D To make the {\em goto previous jump} feature more
+%D convenient when using more than one file, it makes sense
+%D to force the viewer to open a new window for each file
+%D opened.
+
+\newif\ifgotonewwindow
+
+%D \macros
+%D {ifPDFstrokecolor}
+%D
+%D We can reduce the filesize a bit by setting the next switch
+%D to false. The amount of reduction depends on the use of
+%D color, but don't expect more than a few percent. Zip
+%D compression is already rather efficient in itself.
+
+\newif\ifPDFstrokecolor \PDFstrokecolortrue
+
+%D \macros
+%D {dofileinsertion,definefileinsertion,doiffileinsertionsupported}
+%D
+%D File insertion depend on the driver or \TEX\ variant used.
+%D All driver modules use the same scheme for file insertion,
+%D and therefore have the next macro in common (stupified
+%D per august 2006):
+
+\let\supportedfileinsertions\empty
+\let\supportedfilecheckers \empty
+
+\def\definefileinsertion#1#2#3%
+ {\addtocommalist{#2}\supportedfileinsertions
+ \setvalue{do#1insert#2}{#3}}
+
+\def\definefilechecker#1#2#3%
+ {\addtocommalist{#2}\supportedfilecheckers
+ \setvalue{do#1check#2}{#3}}
+
+\def\dofileinsertion#1#2{\executeifdefined{do#1insert#2}\donothing}
+\def\dofilechecker #1#2{\executeifdefined{do#1check#2} \donothing}
+
+\appendtoks \let\supportedfileinsertions\empty \to \everyresetspecials
+\appendtoks \let\supportedfilecheckers \empty \to \everyresetspecials
+
+% \def\doiffileinsertionsupportedelse#1%
+% {\expanded{\doifinstringelse{#1}{\c!tex,\c!tmp,\supportedfileinsertions}}}
+
+\def\doiffileinsertionsupportedelse#1% lowercasing happens at tex end
+ {\expanded{\doifinstringelse{\truegraphictype{#1}}{\c!tex,\c!tmp,\supportedfileinsertions}}}
+
+%D This macro is called with 10 arguments, where the first
+%D one specifies the driver, like \type{yy} or \type{tr}. The
+%D second argument is a \type{{type,method}} pair and the
+%D third the filename.
+
+%D Just in case this one is undefined (which can happen if
+%D this module is used outside \CONTEXT):
+
+\ifx\setreferencefilename\undefined
+
+ \def\setreferencefilename#1\to#2{\edef#2{#1}}
+
+\fi
+
+%D When submitting forms, we need to communicate the format.
+
+\chardef\submitoutputformat=0 % 0=unknown 1=HTML 2=FDF 3=XML
+
+\def\setsubmitoutputformat#1%
+ {\doifinsetelse{#1}{FDF,fdf}
+ {\chardef\submitoutputformat2}
+ {\doifinsetelse{#1}{XML,xml}
+ {\chardef\submitoutputformat3}
+ {\chardef\submitoutputformat1}}%
+ \relax}
+
+%D \macros
+%D {escapePSstring}
+%D
+%D \starttyping
+%D \escapePSstring(t\e\1st)))))\to\crap \crap
+%D \stoptyping
+
+% testcase: webschrift met lege regels en unbalanced ()
+
+\bgroup
+
+\catcode`\*=\@@escape
+\catcode`\\=\@@letter
+
+*long*gdef*escapedPSstring#1%
+ {*aftergroup*string
+ *ifnum`#1=12
+ *aftergroup*n%
+ *else*ifnum`#1=13
+ *aftergroup*n%
+ *else*if#1(%
+ *aftergroup*(%
+ *else*if#1)%
+ *aftergroup*)%
+ *else*if#1\%
+ *aftergroup*\%
+ *else
+ *aftergroup#1%
+ *fi*fi*fi*fi*fi}
+
+*egroup
+
+\long\def\escapePSstring#1\to#2%
+ {\defconvertedargument#2{#1}%
+ \bgroup
+ \ifx#2\empty \else
+ \setverbosecscharacters
+ \aftergroup\edef
+ \aftergroup#2%
+ \aftergroup{%
+ \expandafter\handletokens#2\with\escapedPSstring
+ \aftergroup}%
+ \fi
+ \egroup}
+
+% \long\def\preservePSpar#1\to#2%
+% {\bgroup
+% \def\par{\rawcharacter{12}}%
+% \expanded{\egroup\noexpand\def\noexpand#2{#1}}}
+
+\long\def\preservePSpar#1\to#2%
+ {\bgroup
+ \def\par{\rawcharacter{12}\rawcharacter{12}}% hm, should be one 13 but 12 ff is platform safe
+ \expanded{\egroup\noexpand\def\noexpand#2{#1}}}
+
+%D \macros
+%D {ifPDFunicode}
+%D
+%D We can use this switch to signal that content streams has
+%D to be unicoded.
+
+\newif\ifPDFunicode
+
+%D \macros
+%D {makeMPintoPDFobject, handleMPfshow, setMPPDFobject, getMPPDFobject}
+%D
+%D \METAPOST\ support.
+
+\appendtoks
+ \chardef\makeMPintoPDFobject\zerocount
+ \def\setMPPDFobject#1#2{\def\getMPPDFobject{\box#2}}%
+\to \everyresetspecials
+
+\appendtoks
+ \let\handleMPfshow\dohandleMPfshow
+\to \everyresetspecials
+
+%D
+
+%D \macros
+%D {dosetposition, dosetpositionwdh, dosetpositionplus}
+%D
+%D Opposite to its \DVI\ counterpart, the \PDFTEX\ backend
+%D can provide positional information directly. Since
+%D \CONTEXT\ only uses relative positions, the origin is of
+%D less importance. Nowadays \XETEX\ also supports this
+%D feature.
+
+\ifx\pdfsavepos\undefined
+
+ % only for ancient pdftex, less old xetex and current aleph
+
+ \def\dosetposition #1{\special{pos:pxy "#1"}}
+ \def\dosetpositionwhd #1#2#3#4{\special{pos:pxywhd "#1" #2 #3 #4}}
+ \def\dosetpositionplus#1#2#3#4#5{\special{pos:pxyplus "#1" #2 #3 #4 #5}}
+
+ \let\flushDVIpositionpapersize\relax
+
+ \def\dosetpositionpapersize#1#2%
+ {\xdef\flushDVIpositionpapersize
+ {\special{pos:papersize \number#1 \number#2}%
+ \noexpand\installprogram{dvipos -o \jobname.tuo \jobname.dvi }%
+ \global\noexpand\let\noexpand\flushDVIpositionpapersize\relax}}
+
+ % kind of obsolete since nowadays xetex supports \pdfsavepos as well
+
+ \ifnum\texengine=\xetexengine
+
+ \def\dosetpositionpapersize#1#2%
+ {\xdef\flushDVIpositionpapersize
+ {\special{pos:papersize \number#1 \number#2}%
+ \noexpand\installprogram{dvipos -o \jobname.tuo \jobname.xdv }%
+ \global\noexpand\let\noexpand\flushDVIpositionpapersize\relax}}
+
+ \fi
+
+ \prependtoksonce \flushDVIpositionpapersize \to \everyshipout
+
+\else
+
+ \def\dosetposition#1%
+ {\pdfsavepos
+ \dolazysaveposition
+ {#1}%
+ {\noexpand\realfolio}%
+ {\noexpand\the\dimexpr\pdflastxpos\scaledpoint\relax}%
+ {\noexpand\the\dimexpr\pdflastypos\scaledpoint\relax}}%
+
+ \def\dosetpositionwhd#1#2#3#4%
+ {\pdfsavepos
+ \dolazysavepositionwhd
+ {#1}%
+ {\noexpand\realfolio}%
+ {\noexpand\the\dimexpr\pdflastxpos\scaledpoint\relax}%
+ {\noexpand\the\dimexpr\pdflastypos\scaledpoint\relax}%
+ {#2}{#3}{#4}}
+
+ \def\dosetpositionplus#1#2#3#4#5%
+ {\pdfsavepos
+ \dolazysavepositionplus
+ {#1}%
+ {\noexpand\realfolio}%
+ {\noexpand\the\dimexpr\pdflastxpos\scaledpoint\relax}%
+ {\noexpand\the\dimexpr\pdflastypos\scaledpoint\relax}%
+ {#2}{#3}{#4}{#5}}
+
+ \let\dosetpositionpapersize\gobbletwoarguments
+
+\fi
+
+%D Handy to have this available asap:
+
+\ifdefined\everyPDFxform \newtoks\everyPDFxform \fi
+\ifdefined\everyPDFximage \newtoks\everyPDFximage \fi
+
+\protect \endinput
diff --git a/tex/context/base/spec-pdf.mkii b/tex/context/base/spec-pdf.mkii
new file mode 100644
index 000000000..2191eaeae
--- /dev/null
+++ b/tex/context/base/spec-pdf.mkii
@@ -0,0 +1,484 @@
+%D \module
+%D [ file=spec-pdf,
+%D version=1997.09.20,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Adobe \ACROBAT\ version 2.1,
+%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.
+
+% funny things: mail to yeny: "please geen auto-crlf in special"
+
+\unprotect
+
+%D This driver is build on top of the general \PDF\ macros,
+%D as defined in \type{spec-fdf}, so we inherit that one.
+
+\startspecials[pdf][fdf]
+
+%D \macros
+%D {dosetupinteraction,
+%D doPDFsetopenaction,doPDFsetcloseaction}
+%D
+%D Instead of a prolog, we can put the code in the file
+%D ourselve.
+%D
+%D \starttyping
+%D \definespecial\dosetupinteraction%
+%D {\special
+%D {\@@insertpostscriptretain
+%D /pdfmark where
+%D {pop}
+%D {userdict /pdfmark /cleartomark load put}
+%D ifelse}}
+%D \stoptyping
+%D
+%D We decided to use a prolog file. The following code has to
+%D be put somewhere, e.g.\ in the startup directory of
+%D \DISTILLER. To overcome problems, we always embed the fonts,
+%D but copyrights force us always to make subsets.
+%D
+%D \starttyping
+%D /currentdistillerparams where
+%D { pop } { userdict /currentdistillerparams { 1 dict } put } ifelse
+%D
+%D /setdistillerparams where
+%D { pop } { userdict /setdistillerparams { pop } put } ifelse
+%D
+%D << /AntiAliasColorImages true
+%D /AntiAliasGrayImages true
+%D /AntiAliasMonoImages true
+%D /ConvertCMYKImagesToRGB true
+%D /MaxSubsetPct 99
+%D /EmbedAllFonts true
+%D /SubSetFonts true >> setdistillerparams
+%D \stoptyping
+%D
+%D Beware, this is the PostScript Level 2 way of doing things.
+
+\definespecial\dosetupinteraction
+ {\showmessage\m!interactions{21}{acrobat}}
+
+\definespecial\dosetupopenaction {\doPDFsetupopenaction}
+\definespecial\dosetupcloseaction{\doPDFsetupcloseaction}
+
+%D \macros
+%D {dostartthisislocation}
+%D
+%D We share a lot of macros with the \PDFTEX\ driver. First
+%D the one that handles named destinations.
+
+\definespecial\dostartthisislocation {\doPDFstartthisislocation}
+
+%D \macros
+%D {doresetgotowhereever,
+%D dostartgotolocation,dostartgotorealpage,dostartgotoJS,
+%D dostartexecutecommand,dostartrunprogram,dostartgotoprofile}
+%D
+%D The next specials are responsible for handling references.
+%D Each goto handler can handle multiple references.
+
+\definespecial\doresetgotowhereever {\doPDFresetgotowhereever}
+\definespecial\dostartgotolocation {\doPDFstartgotolocation}
+\definespecial\dostartgotorealpage {\doPDFstartgotorealpage}
+\definespecial\dostartgotoJS {\doPDFstartgotoJS}
+\definespecial\dostartexecutecommand{\doPDFstartexecutecommand}
+\definespecial\dostartrunprogram {\doPDFstartrunprogram}
+\definespecial\dostartgotoprofile {\doPDFstartgotoprofile}
+
+%D \macros
+%D {doflushJSpreamble}
+%D
+%D Thanks to the fact that \DISTILLER\ cannot handle multiple
+%D names entries in the document catalog, for the moment we
+%D have to misuse the page attributes. Beware, the preambles
+%D must be packed.
+
+\definespecial\doflushJSpreamble#1%
+ {\bgroup
+ \ifoneJSpreamble
+ \edef\sanitizedJScode{\getJSpreamble{#1}}%
+ \expandafter\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode
+ \special % nota bene, the page starts at 1
+ {\@@insertpostscriptretain
+ [ /_objdef{JS:#1} /type /dict /OBJ pdfmark
+ [ {JS:#1} << /S /JavaScript /JS (\sanitizedJScode) >> /PUT pdfmark
+ [ {Page1} << /AA << /O {JS:#1} >> >> /PUT pdfmark}%
+ \else % temporary message
+ \writestatus{\m!specials}{Acrobat workaround needed: please pack JS preambles}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {dostarthide,dostophide}
+%D
+%D Hopefully some day hiding navigational things when
+%D printing \PDF\ files will be supported properly.
+
+\definespecial\dostarthide%
+ {\special
+ {\@@insertpostscriptretain
+ [ /DataSource (false \iftrue\string{\else}\fi)
+ /PS
+ pdfmark}}
+
+\definespecial\dostophide%
+ {\special
+ {\@@insertpostscriptretain
+ [ /DataSource (\iffalse{\else\string}\fi if)
+ /PS
+ pdfmark}}
+
+%D \macros
+%D {dosetupscreen,
+%D dosetupidentity}
+%D
+%D We can set up the page dimensions, full screen start up
+%D mode and identify the file with:
+
+\definespecial\dosetupscreen {\doPDFsetupscreen \printpaperheight}
+
+\definespecial\dosetupartbox {\doPDFsetupartbox \printpaperheight}
+\definespecial\dosetupcropbox {\doPDFsetupcropbox \printpaperheight}
+\definespecial\dosetupbleedbox{\doPDFsetupbleedbox\printpaperheight}
+\definespecial\dosetuptrimbox {\doPDFsetuptrimbox \printpaperheight}
+
+\definespecial\dosetupidentity{\doPDFsetupidentity}
+
+%D \macros
+%D {dobeginofprofile,doendofprofile}
+%D
+%D Profile support is still far from perfect. This is
+%D especially due to the fact that the specification of
+%D threads are sort of fuzzy and depend on the viewer.
+
+\definespecial\dobeginofprofile#1#2#3#4% label width height page
+ {\bgroup
+ \setPDFdestination{#1}%
+ \doifsomething{\PDFdestination}
+ {\PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#3}\height
+ \special
+ {\@@insertpostscriptretain
+ [ /Title (\PDFdestination)
+ /Rect [0 0 \width\space\height]
+ /ARTICLE
+ pdfmark}}%
+ \egroup}
+
+\definespecial\doendofprofile%
+ {}
+
+%D Apart from movies, graphic inclusion is handled in the
+%D \POSTSCRIPT\ drivers. We just link the movie annotation
+%D handled to the file inclusion system.
+
+\definefileinsertion{yy}{mov}{\doPDFinsertmov}
+\definefileinsertion{tr}{mov}{\doPDFinsertmov}
+
+\definefileinsertion{yy}{avi}{\doPDFinsertmov}
+\definefileinsertion{tr}{avi}{\doPDFinsertmov}
+
+%D \macros
+%D {doinsertsoundtrack}
+%D
+%D Sounds look much like movies:
+
+\definespecial\doinsertsoundtrack{\doPDFinsertsoundtrack}
+
+%D \macros
+%D {dostartobject,dostopobject,
+%D doinsertobject}
+%D
+%D Objects, those nice reusable pieces of text and graphics,
+%D are handled by three specials:
+
+\definespecial\dostartobject#1#2#3#4#5%
+ {\bgroup
+ \setbox\nextbox=\hbox\bgroup
+ \bgroup
+ \PointsToBigPoints{#3}\width
+ \PointsToBigPoints{#4}\height
+ \PointsToBigPoints{#5}\depth
+ \dosetobjectreference{#1}{#2}{#1::#2}%
+ \special
+ {\@@insertpostscriptretain
+ [ /BBox [0 -\depth\space \width\space \height]
+ /_objdef {#1::#2}
+ /BP
+ pdfmark}%
+ \egroup}
+
+\definespecial\dostopobject%
+ {\special
+ {\@@insertpostscriptretain
+ [ /EP
+ pdfmark}%
+ \egroup
+ \smashbox\nextbox
+ \flushatshipout{\box\nextbox}%
+ \egroup}
+
+\definespecial\doinsertobject#1#2%
+ {\hbox
+ {\dogetobjectreference{#1}{#2}\PDFobjectreference
+ \ifx\PDFobjectreference\empty \else
+ \special
+ {\@@insertpostscriptretain
+ [ {\PDFobjectreference}
+ /SP
+ pdfmark}%
+ \fi}}
+
+%D \macros
+%D {doinsertbookmark}
+%D
+%D Although personally I never use bookmarks, \CONTEXT\ does
+%D support them, due to user requests.
+
+\definespecial\doinsertbookmark {\doPDFinsertbookmark}
+
+%D \macros
+%D {dosetpagetransition}
+%D
+%D Page transitions, again a user wish, is taken care of by:
+
+\definespecial\dosetpagetransition{\doPDFsetpagetransition}
+
+%D \macros
+%D {doinsertcomment, doflushcomments}
+%D
+%D I never needed (and used) one until now, but here is the
+%D text annotation special:
+
+\definespecial\doinsertcomment{\doPDFinsertcomment}
+\definespecial\doflushcomments{\doPDFflushcomments}
+
+%D \macros
+%D {dopresetlinefield,dopresettextfield,
+%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
+%D dopresetpushfield,dopresetcheckfield,
+%D dopresetradiofield,dopresetradiorecord}
+%D
+%D There is nothing enervating to the next few mappings.
+
+\definespecial\dopresetlinefield {\doFDFpresetlinefield}
+\definespecial\dopresettextfield {\doFDFpresettextfield}
+\definespecial\dopresetchoicefield{\doFDFpresetchoicefield}
+\definespecial\dopresetpopupfield {\doFDFpresetpopupfield}
+\definespecial\dopresetcombofield {\doFDFpresetcombofield}
+\definespecial\dopresetpushfield {\doFDFpresetpushfield}
+\definespecial\dopresetcheckfield {\doFDFpresetcheckfield}
+\definespecial\dopresetradiofield {\doFDFpresetradiofield}
+\definespecial\dopresetradiorecord{\doFDFpresetradiorecord}
+
+%D \macros
+%D {dodefinefieldset,dogetfieldset,doiffieldset}
+%D
+%D Field sets, used in resetting and submitting, are handled
+%D by:
+
+\definespecial\dodefinefieldset{\doFDFdefinefieldset}
+\definespecial\dogetfieldset {\doFDFgetfieldset}
+\definespecial\doiffieldset {\doFDFiffieldset}
+
+%D \macros
+%D {doregistercalculationset}
+%D
+%D The calculation order is defined using:
+
+\definespecial\doregistercalculationset{\doFDFregistercalculationset}
+
+%D \macros
+%D {doPDFdestination}
+%D
+%D Last we implement the low level pdfmark macros. The
+%D definitions are rather verbose. First the destination
+%D macro.
+
+\def\doPDFdestination#1%
+ {\special
+ {\@@insertpostscriptretain
+ [ /Dest /#1\space
+ \PDFpageview
+ /DEST
+ pdfmark}}
+
+%D \macros
+%D {doPDFaction,doPDFannotation,doPDFannotationobject,
+%D ifsharePDFactions}
+%D
+%D We have three alternative annotation macros. The first
+%D handles the goto ones, the second takes care of for instance
+%D movies and the third is used in fields.
+
+\newcount\nofPDFsimilar
+
+\newif\ifsharePDFactions \sharePDFactionstrue
+
+\def\dodoPDFaction#1#2#3#4%
+ {\ifcollectreferenceactions
+ \xdef\lastPDFaction{#4}%
+ \else
+ \bgroup
+ % does not work well with distiller 4
+ %\ifsharePDFactions
+ % \ifcase\similarreference\relax
+ % \xdef\lastPDFaction{<<#4>>}%
+ % \or
+ % \global\advance\nofPDFsimilar by 1
+ % \special
+ % {\@@insertpostscriptretain
+ % [ /_objdef {PDF::sim:\the\nofPDFsimilar} /type /dict /OBJ pdfmark
+ % [ {PDF::sim:\the\nofPDFsimilar} <<#4>>\space /PUT pdfmark}%
+ % \xdef\lastPDFaction{{PDF::sim:\the\nofPDFsimilar}}%
+ % \else
+ % % leave \lastPDFaction untouched
+ % \fi
+ %\else
+ \xdef\lastPDFaction{<<#4>>}%
+ %\fi
+ \PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#1}\height
+ \special
+ {\@@insertpostscriptretain
+ [ #1
+ /Action \lastPDFaction\space
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ \ifhighlighthyperlinks \else /H /N \fi
+ /Subtype /Link
+ /ANN
+ pdfmark}%
+ \egroup
+ \fi}
+
+\def\doPDFaction#1#2#3%
+ {\dodoPDFaction\empty{#1}{#2}{#3}}
+
+\def\doPDFannotation#1#2#3%
+ {\bgroup
+ \PointsToBigPoints{#1}\width
+ \PointsToBigPoints{#2}\height
+ \special
+ {\@@insertpostscriptretain
+ [ /Rect [0 0 \width\space \height] #3
+ /ANN
+ pdfmark}%
+ \egroup}
+
+\def\doPDFannotationobject#1#2#3#4#5%
+ {\bgroup
+ \PointsToBigPoints{#3}\width
+ \PointsToBigPoints{#4}\height
+ \special
+ {\@@insertpostscriptretain
+ [ /_objdef {#1::#2}
+ /Rect [0 0 \width\space \height] #5
+ /ANN
+ pdfmark}%
+ \egroup
+ \dosetobjectreference{#1}{#2}{#1::#2}}
+
+\def\doPDFactionobject#1#2#3#4#5%
+ {\dodoPDFaction{/_objdef {#1::#2}}{#3}{#4}{#5}%
+ \dosetobjectreference{#1}{#2}{#1::#2}}
+
+%D \macros
+%D {doPDFdictionaryobject,doPDFarrayobject}
+%D
+%D These two macros are used to build low level objects.
+
+\def\doPDFdictionaryobject#1#2#3%
+ {\special
+ {\@@insertpostscriptretain
+ [ /_objdef {#1::#2} /type /dict /OBJ pdfmark
+ [ {#1::#2} << #3 >> /PUT pdfmark}%
+ \dosetobjectreference{#1}{#2}{#1::#2}}
+
+\def\doPDFarrayobject#1#2#3%
+ {\special
+ {\@@insertpostscriptretain
+ [ /_objdef {#1::#2} /type /array /OBJ pdfmark
+ [ {#1::#2} 0 [#3] /PUTINTERVAL pdfmark}%
+ \dosetobjectreference{#1}{#2}{#1::#2}}
+
+%D \macros
+%D {doPDFaddtocatalog,doPDFaddtoinfo,
+%D doPDFpageattribute,doPDFpagesattribute}
+%D
+%D Next come our housekeeping macros.
+
+\def\doPDFaddtocatalog#1%
+ {\doifsomething{#1}
+ {\special
+ {\@@insertpostscriptretain
+ [ {Catalog} << #1 >> /PUT pdfmark}}}
+
+\def\doPDFaddtoinfo#1% unchecked
+ {\special
+ {\@@insertpostscriptretain
+ [ #1 /DOCINFO pdfmark}} % [ {DocInfo} << #1 >> /PUT pdfmark}}
+
+\def\doPDFpageattribute#1%
+ {\doifsomething{#1}
+ {\special
+ {\@@insertpostscriptretain
+ [ {ThisPage} << #1 >> /PUT pdfmark}}}
+
+\def\doPDFpageresource#1%
+ {\message{[skipping PDF resource]}}
+
+\def\doPDFpagesattribute#1%
+ {\doifsomething{#1}
+ {\special
+ {\@@insertpostscriptretain
+ [ #1 /PAGES pdfmark}}}
+
+\let\doPDFresetpageresources \relax
+\let\doPDFresetpageattributes\relax
+
+%D \macros
+%D {doPDFbookmark}
+%D
+%D This is how we force bookmarks entries in the file.
+
+\def\doPDFbookmark#1#2#3#4#5%
+ {\scratchcounter#4\advance\scratchcounter\minusone
+ \special
+ {\@@insertpostscriptretain
+ [ /Page \the\scratchcounter\space
+ \ifcase#2 \else/Count \ifcase#5-\fi#2 \fi
+ \PDFpageview
+ /Title (#3)
+ /OUT
+ pdfmark}}
+
+%D \macros
+%D {defaultobjectreference,doPDFgetobjectreference}
+%D
+%D The object references are \type{{named}}, that is, no hard
+%D coded numbers are needed (opposite to \PDFTEX).
+
+\def\defaultobjectreference#1#2{#1::#2}
+
+\def\doPDFgetobjectreference#1#2#3%
+ {\dogetobjectreference{#1}{#2}#3%
+ \ifx#3\empty\else\edef#3{{#3}}\fi}
+ %\edef#3{\ifx#3\empty null\else{#3}\fi}}
+
+% \def\doPDFgetobjectpage #1#2#3{..}
+% \def\doPDFgetobjectpagereference#1#2#3{..}
+
+\def\doPDFgetpagereference#1#2%
+ {\edef#2{{page#1}}}
+
+%D Done.
+
+\stopspecials
+
+\protect \endinput
diff --git a/tex/context/base/spec-ps.mkii b/tex/context/base/spec-ps.mkii
new file mode 100644
index 000000000..803defe02
--- /dev/null
+++ b/tex/context/base/spec-ps.mkii
@@ -0,0 +1,229 @@
+%D \module
+%D [ file=spec-ps,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Adobe PostScript,
+%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 \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode,
+%D dostartrotation,dostoprotation,
+%D dostartscaling,dostopscaling,
+%D dostartmirroring,dostopmirroring,
+%D dostartnegative,dostopnegative,
+%D dostartoverprint,dostopoverprint,
+%D doselectfirstpaperbin,
+%D doselectsecondpaperbin}
+%D
+%D This implementation is straightforward and can be used as
+%D a default with postscript||drivers. We use \type{ps:} as
+%D opening, because most drivers support this.
+
+\startspecials[postscript]
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {" }
+
+\definespecial\dostartgraymode#1%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space setgray}}
+
+\definespecial\dostopgraymode
+ {\special
+ {\@@insertpostscriptliteral
+ 0 setgray}}
+
+\definespecial\dostartrgbcolormode#1#2#3%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space #2\space #3\space setrgbcolor}}
+
+\definespecial\dostartcmykcolormode#1#2#3#4%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space #2\space #3\space #4\space setcmykcolor}}
+
+\definespecial\dostartgraycolormode#1%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space setgray}}
+
+\definespecial\dostopcolormode
+ {\special
+ {\@@insertpostscriptliteral
+ 0 setgray}}
+
+\definespecial\doselectfirstpaperbin
+ {\special
+ {\@@insertpostscriptliteral
+ statusdict begin 1 setpapertray end}} % checken
+
+\definespecial\doselectsecondpaperbin
+ {\special
+ {\@@insertpostscriptliteral
+ statusdict begin 0 setpapertray end}} % checken
+
+\definespecial\dostartrotation#1% straight from the YandY manual
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ \number#1\space\space rotate neg exch neg exch translate}}
+
+\definespecial\dostoprotation
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+\definespecial\dostartscaling#1#2% conforming the YandY manual
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ #1\space #2\space scale neg exch neg exch translate}}
+
+\definespecial\dostopscaling
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+\definespecial\dostartmirroring % some translate and exch stuff from YandY
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ [-1 0 0 1 0 0] concat neg exch neg exch translate}}
+
+\definespecial\dostopmirroring
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+\definespecial\dostartnegative
+ {\special{\@@insertpostscriptliteral gsave {1 exch sub} settransfer}}
+
+\definespecial\dostopnegative
+ {\special{\@@insertpostscriptliteral grestore}}
+
+\definespecial\dostartoverprint
+ {\special{\@@insertpostscriptliteral true setoverprint}}
+
+\definespecial\dostopoverprint
+ {\special{\@@insertpostscriptliteral false setoverprint}}
+
+\definespecial\dostartgraphicgroup
+ {\special{\@@insertpostscriptliteral gsave}}
+
+\definespecial\dostopgraphicgroup
+ {\special{\@@insertpostscriptliteral grestore}}
+
+%D \macros
+%D {doovalbox}
+%D
+%D This implementation is a mixture of several possible
+%D implementations. We use some constants that may not be
+%D changed. It took some time to find them, but these values
+%D offer quite accurate results. The macro calls for
+%D \type{\forgetall}, which resets indentation, skips and
+%D \type{\everypar}.
+%D
+%D Because a stroke follows the line, we correct for half of
+%D the linewidth. Furthermore we use scaling to overcome some
+%D limitations in the precision ($<1$~sp) and to prevent
+%D rounding errors. We also do some correction for large
+%D values. We let PostScript compare some arguments with
+%D \type{a b eq {action} fi}.
+%D
+%D The path is based on a macro of J.~Hefferon cs. We also
+%D tried the D.~Salomon implementation, but this did not work
+%D well, just like some other alternatives.
+
+% #1 = width #2 = height #3 = depth
+% #4 = linewidth #5 = radius
+% #5 = stroke (ja,nee) #7 = fill (ja,nee)
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {postscript } % unknown
+
+\def\dosomeovalcalc#1#2#3%
+ {\dimen2=#1%
+ \advance\dimen2 #2%
+ \PointsToBigPoints{\dimen2}#3}
+
+\def\dosomeovalbox#1#2#3#4#5#6#7#8% variant not yet supported
+ {\bgroup
+ \dimen0=#4\divide\dimen0 2
+ \dosomeovalcalc{0pt}{+\dimen0}\xmin
+ \dosomeovalcalc{#1}{-\dimen0}\xmax
+ \dosomeovalcalc{#2}{-\dimen0}\ymax
+ \dosomeovalcalc{-#3}{+\dimen0}\ymin
+ \dosomeovalcalc{#4}{0pt}\stroke
+ \dosomeovalcalc{#5}{0pt}\radius
+ \edef\dostroke{#6}%
+ \edef\dofill{#7}%
+ \setbox\nextbox\hbox
+ {\ifnum\dostroke\dofill>0
+ \special
+ {\@@insertpostscriptretain
+ gsave
+ newpath
+ \xmin\space \radius\space add \ymin\space moveto
+ \xmax\space \ymin\space \xmax\space \ymax\space \radius\space arcto
+ \xmax\space \ymax\space \xmin\space \ymax\space \radius\space arcto
+ \xmin\space \ymax\space \xmin\space \ymin\space \radius\space arcto
+ \xmin\space \ymin\space \xmax\space \ymin\space \radius\space arcto
+ \xmin\space \radius\space add \ymin\space moveto
+ 16 {pop} repeat
+ closepath
+ (\dostroke) (1) eq
+ {\stroke\space 0 ne
+ {gsave
+ \stroke\space setlinewidth
+ stroke
+ grestore} if} if
+ (\dofill) (1) eq
+ {fill} if
+ grestore}%
+ \fi}%
+ \nextboxwd#1%
+ \nextboxht#2%
+ \nextboxdp#3%
+ \flushnextbox
+ \egroup}
+
+%D The indirect call permits a (rather) dirty hack, needed
+%D for \DVIPS\ support.
+
+\definespecial\doovalbox
+ {\dosomeovalbox}
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D These two specials are not yet working as expected.
+
+\definespecial\dostartclipping#1#2#3%
+ {\PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#3}\height
+ \grabMPclippath{#1}{0}{\width}{\height}
+ {0 0 moveto \width 0 lineto \width \height lineto 0 \height\space lineto}%
+ \special
+ {\@@insertpostscriptliteral\space
+ save newpath \MPclippath\space closepath clip}}
+
+\definespecial\dostopclipping
+ {\special{\@@insertpostscriptliteral\space restore}}
+
+%D Some MP stuff:
+
+\definespecial\doinsertMPfile#1%
+ {\doiffileelse{./#1}{\includeMPasEPS{./#1}}{\message{[MP #1]}}}
+
+\stopspecials
+
+\endinput
diff --git a/tex/context/base/spec-tpd.mkii b/tex/context/base/spec-tpd.mkii
new file mode 100644
index 000000000..6af3b1272
--- /dev/null
+++ b/tex/context/base/spec-tpd.mkii
@@ -0,0 +1,1334 @@
+%D \module
+%D [ file=spec-tpd,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\PDFTEX,
+%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.
+
+% once we can be sure that the latest versions of pdftex are
+% available we can use:
+%
+% \pdfobj reserveobjnum \edef\one{\the\pdflastobj}
+% \pdfobj reserveobjnum \edef\two{\the\pdflastobj}
+%
+% \pdfobj useobjnum \one {x}
+% \pdfobj useobjnum \two {x}
+%
+% we then can rewrite part of spec-fdf because the other drivers
+% already support symbolic references
+
+% layers and links don't work while the spec says they should
+
+% method = auto
+%
+% \definefileinsertion{tpd}{auto}%
+% {\executesystemcommand{t:/ruby/pstopdf.rb #2}%
+% \dofileinsertion{tpd}{pdf}}
+
+% \let\PDFdestvoffset\zeropoint
+% \newbox\pdfdestbox
+%
+% \def\doPDFdestination#1%
+% {\ifdim\PDFdestvoffset=\zeropoint\relax
+% \pdfdest name {#1}\PDFpageviewkey
+% \else
+% \setbox\pdfdestbox\hbox to \zeropoint
+% {\raise\PDFdestvoffset\hbox{\pdfdest name {#1}\PDFpageviewkey}}%
+% \ht\pdfdestbox\zeropoint
+% \box\pdfdestbox
+% \fi}
+%
+% \def\PDFdestvoffset{2\lineheight} % {1.5\strutht}
+
+%D \macros
+%D {jobsuffix}
+%D
+%D Being one of the first typographical systems able to support
+%D advances \PDF\ support, \TEX\ is also one of the first
+%D systems to produce high quality \PDF\ code directly. Thanks
+%D to Han The Thanh c.s. the \TEX\ community can leap forward
+%D once again.
+%D
+%D One important characteristic of \PDFTEX\ is that is can
+%D produce standard \DVI\ code as well as \PDF\ code. This
+%D enables us to use one format file to support both output
+%D formats.
+
+%D All modules in this group use specials to tell drivers what
+%D non||\TEX\ actions to take. Because from the \TEX\ point of
+%D view, there is no difference between \DVI\ and \PDF, we
+%D therefore only have to bend the \DVI\ driver support into
+%D \PDF\ support. Technically spoken, specials no longer serve
+%D a purpose, except from ending up as comment in the \PDF\
+%D file.
+%D
+%D Before we continue we need to make sure if indeed those
+%D \PDFTEX\ primitives are permitted. If no primitives are
+%D available, we just stop reading any further.
+
+\unprotect
+
+\ifx\pdftexversion\undefined
+ \writestatus\m!systems{you should use pdfTeX binaries}\wait
+ \protect\expandafter\endinput
+\fi
+
+\ifnum\pdftexversion<13
+ \writestatus\m!systems{your pdfTeX version is much too old}\wait
+ \protect\expandafter\endinput
+\fi
+
+\ifnum\pdftexversion<14
+ \writestatus\m!systems{please update your pdfTeX binaries}
+\fi
+
+\ifnum\pdftexversion>19
+ \pdfhorigin=1 true in
+ \pdfvorigin=1 true in
+\fi
+
+%D We default to 300 dots per inch image resolution and 600 dpi
+%D bitmap fonts (when asked for).
+
+\ifx\pdfimageresolution\undefined \newcount\pdfimageresolution \fi
+\ifx\pdfpkresolution \undefined \newcount\pdfpkresolution \fi
+
+\pdfimageresolution=300
+\pdfpkresolution =600
+
+%D Another downward compatible hack:
+
+\ifx\pdflastximagepages\undefined
+ \newcount\pdflastximagepages \pdflastximagepages=1
+\fi
+
+%D And:
+
+\ifx\pdfpageresources\undefined
+ \newtoks\pdfpageresources
+\fi
+
+%D In order to get high quality \METAPOST\ inclusion, we set
+%D the number of digits to~5 (prevents rounding errors).
+
+\ifx\pdfdecimaldigits\undefined
+ \newcount\pdfdecimaldigits
+\fi
+
+\pdfdecimaldigits=10
+
+\ifx\pdfinclusionerrorlevel\undefined
+ \ifx\pdfoptionpdfinclusionerrorlevel\undefined
+ \newcount\pdfinclusionerrorlevel
+ \else
+ \let\pdfinclusionerrorlevel\pdfoptionpdfinclusionerrorlevel
+ \fi
+\fi
+
+\pdfinclusionerrorlevel=0
+
+\ifx\pdfminorversion\undefined
+ \ifx\pdfoptionpdfminorversion\undefined
+ \newcount\pdfminorversion
+ \else
+ \let\pdfminorversion\pdfoptionpdfminorversion
+ \fi
+\fi
+
+\pdfminorversion=5
+
+\def\PDFversion{1.\number\pdfminorversion}
+
+% %D Why are the Acrobat viewers so buggy? To prevent font cache
+% %D mismatches, we say:
+%
+% \ifx\pdfuniqueresname\undefined \else
+% \pdfuniqueresname=1
+% \fi
+
+%D Once we are sure that we're indeed supporting \PDFTEX, we
+%D force \PDF\ output at the highest compression. For debugging
+%D purposes one can set the compresslevel to~0. We also have to
+%D make sure no other specials are supported, else \PDFTEX\
+%D will keep on telling us that we're wrong. We also load the
+%D general \PDF\ macros that are shared between this driver and
+%D the \ACROBAT\ one.
+
+\startspecials[tpd][reset,fdf]
+
+%D This means that by saying
+%D
+%D \starttyping
+%D \usespecials[tpd]
+%D \stoptyping
+%D
+%D we get ourselves full \PDF\ output.
+
+%D For some internal testing we need to know the output
+%D suffix.
+
+\setjobsuffix{pdf}
+
+%D We don't use specials here, which means that we must flush
+%D settings before the page is shipped out.
+
+\specialbasedsettingsfalse
+
+%D Some more internal settings.
+
+\appendtoksonce
+ \pdfoutput\zerocount
+\to \everyresetspecials
+
+\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.
+
+\let\defaultspecial=\gobbleoneargument
+
+\appendtoksonce
+ \let\defaultspecial\normalspecial
+\to \everyresetspecials
+
+\let\PDFcode \pdfliteral
+\def\PDFcontentcode{\pdfliteral}
+\def\PDFdirectcode {\pdfliteral direct}
+
+%D \macros
+%D {everyPDFximage}
+%D
+%D This token register is flushed before an ximage is loaded.
+
+\ifdefined\everyPDFximage \else \newtoks\everyPDFximage \fi
+\ifdefined\everyPDFxform \else \newtoks\everyPDFxform \fi
+
+%D \macros
+%D {dosetuppaper}
+%D
+%D If we don't set the paper size, \PDFTEX\ will certainly do
+%D it in a way we don't want, therefore we need:
+
+\definespecial\dosetuppaper#1#2#3%
+ {\global\pdfpagewidth #2\relax
+ \global\pdfpageheight#3\relax}
+
+%D \macros
+%D {doloadmapfile,doloadmapline,doresetmapfilelist}
+
+\ifx\pdfmapfile\undefined \let\pdfmapfile\gobbletwoarguments \fi
+\ifx\pdfmapline\undefined \let\pdfmapline\gobbletwoarguments \fi
+
+\definespecial\doresetmapfilelist
+ {\global\let\doresetmapfilelist\relax
+ \pdfmapfile{original-empty.map}}
+
+\ifnum\pdftexversion<120
+
+ \definespecial\doloadmapfile #1#2{\pdfmapfile{+#2}}
+ \definespecial\doloadmapline #1#2{}
+
+\else
+
+ \definespecial\doloadmapfile #1#2{\pdfmapfile{#1#2}}
+ \definespecial\doloadmapline #1#2{\pdfmapline{#1#2}}
+
+\fi
+
+%D nasty but needed
+
+\appendtoksonce \loadallfontmapfiles \to \everyPDFximage
+\appendtoksonce \loadallfontmapfiles \to \everyPDFxform
+
+%D \macros
+%D {doinsertfile,dogetnofinsertpages}
+%D
+%D Graphics are not part of \TEX\ and therefore not part of the
+%D \DVI\ standard. \PDF\ on the other hand has several graphic
+%D primitives. During the multi||step process \TEX\
+%D $\rightarrow$ \DVI\ $\rightarrow$ \POSTSCRIPT\ $\rightarrow$
+%D \PDF\ one can insert graphics using specials. In \PDFTEX\
+%D however there is only one step! This means that \PDFTEX\
+%D itself has to do the inclusion.
+%D
+%D At the moment \PDFTEX\ supports inclusion of bitmap \PNG\
+%D graphics as well as not too complicated \PDF\ code. Using
+%D this last option, we are able to include both \METAPOST\ and
+%D \PDF\ output produced by \GHOSTSCRIPT.
+%D
+%D We fall back on the generic \CONTEXT\ module supp-pdf to
+%D accomplish \PDF\ inclusion. The methods implemented there
+%D are hooked into both the figure placement mechanisms of
+%D \CONTEXT\ and the specials inclusion mechanism.
+
+\definespecial\doinsertfile
+ {\dofileinsertion{tpd}{\truegraphictype\@@DriverImageType}}
+
+%D The number of pages in (for instance an \PDF) insert
+%D file, can be asked for using:
+
+\definespecial\dogetnofinsertpages#1%
+ {\xdef\nofinsertpages{1}% global
+ \doifvalidpdfimagefileelse{#1}%
+ {\pdfximage{#1}\xdef\nofinsertpages{\the\pdflastximagepages}}
+ {}}
+
+%D Currently we support \type{pdf} for \PDF\ files, \type{mps}
+%D for \METAPOST\ graphics, \type{png} and \type{jpg} for
+%D bitmap graphics.
+
+\definefileinsertion{tpd}{mps}
+ {\hbox
+ {\convertMPtoPDF\@@DriverImageFile{1}{1}%
+ \global\let\PDFimagereference\empty}}
+
+\definefileinsertion{tpd}{pdf}{\handlepdfimage}
+\definefileinsertion{tpd}{png}{\handlepdfimage}
+\definefileinsertion{tpd}{jpg}{\handlepdfimage}
+\definefileinsertion{tpd}{jb2}{\handlepdfimage}
+
+% \definefileinsertion{tpd}{jpeg} {\handlepdfimage}
+% \definefileinsertion{tpd}{jbig2}{\handlepdfimage}
+
+%D Experimental:
+
+%D The main file insertion macro is as follows. Because
+%D \PDFTEX\ does not support arbitrary suffixes, we double
+%D check on a user supplied filename, because \PDFTEX\ chokes
+%D on unknown suffixes.
+
+\def\doifvalidpdfimagefileelse#1% todo: greedy split
+ {\doiffileelse{#1}
+ {\edef\filesuffix{#1}%
+ \doloop
+ {\@EA\aftersplitstring\filesuffix\at.\to\temp
+ \ifx\temp\empty
+ \exitloop
+ \else
+ \lowercasestring\temp\to\filesuffix % insertion check also needs lowercase
+ % a temporary hack
+ \doif\filesuffix{pdf}{\pdfimageresolution72}%
+ % because pdfTeX scales back
+ \fi}}
+ {\let\filesuffix\s!unknown}%
+ \doiffileinsertionsupportedelse\filesuffix}
+
+\ifx\pdflastximagepages\undefined \chardef\pdflastximagepages=1 \fi
+
+\def\checkpdfimagepagenumber
+ {\edef\pdfimagepagenumber
+ {\ifx\@@DriverImagePage\empty\else\ifnum\@@DriverImagePage>\zerocount
+ \space page\space\@@DriverImagePage\space
+ \fi\fi}}
+
+\ifnum\pdftexversion>13
+
+ \def\handlepdfimage
+ {\bgroup
+ \the\everyPDFximage
+ \doifvalidpdfimagefileelse\@@DriverImageFile
+ {\checkpdfimagepagenumber
+ \ifx\pdfimagepagenumber\empty\@EA\pdfimmediateximage\else\@EA\pdfximage\fi
+ \ifdim\@@DriverImageWidth >\zeropoint \!!width \@@DriverImageWidth \fi
+ \ifdim\@@DriverImageHeight>\zeropoint \!!height\@@DriverImageHeight\fi
+ \pdfimagepagenumber
+ \@@DriverImageBox
+ {\@@DriverImageFile}
+ \xdef\PDFimagereference{\the\pdflastximage}%
+ \xdef\nofinsertpages{\the\pdflastximagepages}%
+ \pdfrefximage\pdflastximage}
+ {\framed[\c!width=\@@DriverImageWidth,\c!height=\@@DriverImageHeight]{\@@DriverImageFile}}%
+ \egroup}
+
+\else
+
+ \def\handlepdfimage
+ {\bgroup
+ \doifvalidpdfimagefileelse\@@DriverImageFile
+ {\pdfimage
+ \ifdim\@@DriverImageWidth >\zeropoint \!!width \@@DriverImageWidth \fi
+ \ifdim\@@DriverImageHeight>\zeropoint \!!height \@@DriverImageHeight\fi
+ {\@@DriverImageFile}}%
+ {\framed[\c!width=\@@DriverImageWidth,\c!height=\@@DriverImageHeight]{\@@DriverImageFile}}%
+ \egroup}
+
+\fi
+
+%D As we will see now, \PDFTEX\ not only directly supports
+%D \type{mps}, \type{png}, \type{pdf}, \type{jpg} but also
+%D \type{mov}. In \CONTEXT\ we support movie inserts in a way
+%D similar to figure inclusion. The next macro calls the
+%D general \PDF\ one.
+
+\definefileinsertion{tpd}{mov}{\doPDFinsertmov}
+\definefileinsertion{tpd}{avi}{\doPDFinsertmov}
+
+%D \macros
+%D {doinsertsoundtrack}
+%D
+%D We use numbers instead of labels to keep track of sounds.
+
+\definespecial\doinsertsoundtrack{\doPDFinsertsoundtrack}
+
+%D For the moment we don't test for alternatives that
+%D themselves have alternatives, especially cylcic
+%D dependencies.
+
+% some day we will do a proper check on bitmap depth,
+%
+% \pdfobj reserveobjnum\relax
+% \pdfximage colorspace \pdflastobj {some file}
+% ... \pdflastximagecolordepth ...
+% \immediate\pdfobj useobjnum \pdflastobj {some spec}
+
+\ifx\@@DriverImageBox\undefined \def\@@DriverImageBox{artbox} \fi
+
+\def\pdfimmediateximage{\immediate\pdfximage}
+
+\ifnum\pdftexversion>13
+
+ \def\checkpdfimageattributes
+ {\ifx\PDFfigurereference\empty
+ \global\let\pdfimageattributes\empty
+ \else
+ \immediate\pdfobj
+ {[ << /Image \PDFobjref\PDFfigurereference
+ /DefaultForPrinting true >> ]}%
+ \xdef\pdfimageattributes
+ {attr {/Alternates \PDFobjref\pdflastobj}}%
+ \fi}
+
+ \global\let\PDFimagecolorreference\empty
+
+ \def\checkpdfimagecolorspecs
+ {\ifx\pdflastximagecolordepth \undefined
+ \global\let\pdfimagecolorspecs\empty
+ \else\ifx\PDFimagecolorreference\empty
+ \global\let\pdfimagecolorspecs\empty
+ \else
+ \xdef\pdfimagecolorspecs{colorspace \PDFimagecolorreference\space}%
+ \fi\fi
+ \global\let\PDFimagecolorreference\empty}
+
+ \def\dogetTPDfiguresize
+ {\doifvalidpdfimagefileelse\@@DriverImageFile
+ {\ifvoid\foundexternalfigure
+ \donetrue
+ \else\ifx\PDFfigurereference\empty
+ \donetrue
+ \else
+ % hm, is this still needed
+ \doifinstringelse\filesuffix{\c!png,\c!jpg}\donetrue\donefalse
+ \fi\fi}
+ {\donefalse}%
+ \ifdone
+ \the\everyPDFximage
+ \checkpdfimageattributes
+ \checkpdfimagecolorspecs
+ \checkpdfimagepagenumber
+ \global\setbox\foundexternalfigure\hbox
+ {\ifx\pdfimagepagenumber\empty\@EA\pdfimmediateximage\else\@EA\pdfximage\fi
+ \pdfimageattributes
+ \pdfimagecolorspecs
+ \pdfimagepagenumber
+ \@@DriverImageBox
+ {\@@DriverImageFile}%
+ \xdef\PDFimagereference{\the\pdflastximage}%
+ \xdef\nofinsertpages{\the\pdflastximagepages}%
+ \pdfrefximage\pdflastximage}%
+ \xdef\analyzedfigurewidth {\the\wd\foundexternalfigure}%
+ \xdef\analyzedfigureheight{\the\ht\foundexternalfigure}%
+ \global\let\PDFfigurereference\empty
+ \global\let\PDFimageattributes\empty
+ \else
+ \global\let\analyzedfigurewidth \!!zeropoint
+ \global\let\analyzedfigureheight\!!zeropoint
+ \fi}
+
+\else
+
+ \def\dogetTPDfiguresize
+ {\doifvalidpdfimagefileelse\@@DriverImageFile
+ {\global\setbox\foundexternalfigure\vbox{\pdfimage{\@@DriverImageFile}}%
+ \xdef\analyzedfigurewidth {\the\wd\foundexternalfigure}%
+ \xdef\analyzedfigureheight{\the\ht\foundexternalfigure}}
+ {\global\let\analyzedfigurewidth \!!zeropoint
+ \global\let\analyzedfigureheight\!!zeropoint}}
+
+\fi
+
+\definefilechecker{tpd}{pdf}{\dogetTPDfiguresize}
+\definefilechecker{tpd}{png}{\dogetTPDfiguresize}
+\definefilechecker{tpd}{jpg}{\dogetTPDfiguresize}
+\definefilechecker{tpd}{jb2}{\dogetTPDfiguresize}
+
+\definespecial\dogetfiguresize
+ {\dofilechecker{tpd}{\truegraphictype\@@DriverImageType}}
+
+%D \macros
+%D {doregisterfigure}
+%D
+%D Here is the fuzzy, very special dependant figure
+%D registration special. We need to refer to the innermost
+%D object (ximage).
+
+\ifnum\pdftexversion>13
+
+ \definespecial\doregisterfigure#1#2%
+ {\doifundefined{IM::#1::#2}
+ {\setxvalue{IM::#1::#2}{\the\pdflastximage}}%
+ \xdef\PDFfigurereference{\getvalue{IM::#1::#2}}}
+
+\fi
+
+%D \macros
+%D {doovalbox}
+%D
+%D Drawing frames with round corners is inherited from the
+%D main module.
+
+\definespecial\doovalbox {\doPDFovalbox}
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,
+%D dostopcolormode,
+%D dostartrotation,dostoprotation,
+%D dostartscaling,dostopscaling,
+%D dostartmirroring,dostopmirroring,
+%D dostartnegative,dostopnegative,
+%D dostartoverprint,dostopoverprint}
+%D
+%D These are implemented in the main \PDF\ module.
+
+\definespecial\dostartgraymode {\doPDFstartgraymode}
+\definespecial\dostopgraymode {\doPDFstopgraymode}
+\definespecial\dostartrgbcolormode {\doPDFstartrgbcolormode}
+\definespecial\dostartcmykcolormode{\doPDFstartcmykcolormode}
+\definespecial\dostartgraycolormode{\doPDFstartgraycolormode}
+\definespecial\dostartspotcolormode{\doPDFstartspotcolormode}
+\definespecial\dostopcolormode {\doPDFstopcolormode}
+\definespecial\dostartrotation {\doPDFstartrotation}
+\definespecial\dostoprotation {\doPDFstoprotation}
+\definespecial\dostartscaling {\doPDFstartscaling}
+\definespecial\dostopscaling {\doPDFstopscaling}
+\definespecial\dostartmirroring {\doPDFstartmirroring}
+\definespecial\dostopmirroring {\doPDFstopmirroring}
+\definespecial\dostartnegative {\doPDFstartnegative}
+\definespecial\dostopnegative {\doPDFstopnegative}
+\definespecial\dostartoverprint {\doPDFstartoverprint}
+\definespecial\dostopoverprint {\doPDFstopoverprint}
+
+\definespecial\doregistercmykspotcolor{\doPDFregistercmykspotcolor}
+\definespecial\doregisterrgbspotcolor {\doPDFregisterrgbspotcolor}
+\definespecial\doregistergrayspotcolor{\doPDFregistergrayspotcolor}
+
+\definespecial\doregistercmykindexcolor{\doPDFregistercmykindexcolor}
+\definespecial\doregisterrgbindexcolor {\doPDFregisterrgbindexcolor}
+\definespecial\doregistergrayindexcolor{\doPDFregistergrayindexcolor}
+
+\definespecial\doregisterfigurecolor{\doPDFregisterfigurecolor}
+
+\definespecial\dostartnonecolormode{\doPDFstartnonecolormode}
+\definespecial\doregisternonecolor {\doPDFregisternonecolor}
+
+\def\doPDFregisterspotcolorname#1#2% no need for escape in luatex
+ {\bgroup
+ \let\ascii\empty
+ \def\docommand##1%
+ {\edef\ascii{\ascii
+ \ifx\nexthandledtoken\space
+ \letterhash20%
+ \else\ifx\nexthandledtoken\blankspace
+ \letterhash20%
+ \else
+ ##1%
+ \fi\fi}}%
+ \expanded{\handletokens#2}\with\docommand
+ \letgvalue{@@pdf@@scn@@#1}\ascii
+ \egroup}
+
+\def\doPDFregistersomespotcolor#1#2#3#4#5#6#7% name fractions names p's space domain function
+ {\bgroup
+ \let\spotpops\empty
+ \ifcase#2\or
+ %def\PDFspotcolornames{/Separation /#1}%
+ \edef\PDFspotcolornames{/Separation /\executeifdefined{@@pdf@@scn@@#1}{#1}}%
+ \def\PDFspotcolordomain{0.0 1.0}%
+ \else
+ \dorecurse{#2}{\edef\spotpops{\spotpops pop }}%
+ \let\PDFspotcolornames \empty
+ \let\PDFspotcolordomain\empty
+ \def\dospotcolorcommand##1%
+ {\edef\PDFspotcolornames {\PDFspotcolornames/\executeifdefined{@@pdf@@scn@@##1}{##1}\space}%
+ \edef\PDFspotcolordomain{\PDFspotcolordomain 0.0 1.0\space}}%
+ \processcommacommand[#3]\dospotcolorcommand
+ \edef\PDFspotcolornames{/DeviceN [\PDFspotcolornames]}%
+ \fi
+ \immediate \pdfobj stream attr
+ {/FunctionType 4 /Domain [\PDFspotcolordomain] /Range [#6]}{{\spotpops#7}}%
+ \immediate \pdfobj
+ {[\PDFspotcolornames\space /Device#5 \PDFobjref\pdflastobj]}%
+ \dosetobjectreference{PDFCS}{#1}{\the\pdflastobj}%
+ \appendtoPDFdocumentcolorspaces{/#1 \PDFobjref\pdflastobj}%
+ \egroup}
+
+%D New and very experimental.
+
+% \def\doPDFregistersomeindexcolor#1#2#3#4#5#6#7% name fractions names p's space domain function
+% {\bgroup
+% \let\spotpops\empty
+% \dorecurse{#2}{\edef\spotpops{\spotpops exch pop\space}}%
+% \let\PDFspotcolornames \empty
+% \let\PDFspotcolordomain\empty
+% \def\docommand##1%
+% {\edef\PDFspotcolornames{\PDFspotcolornames/\executeifdefined{@@pdf@@scn@@##1}{##1}\space}%
+% \edef\PDFspotcolordomain{\PDFspotcolordomain 0.0 1.0\space}}%
+% \processcommacommand[#3,None]\docommand
+% \let\PDFcolorindexvector\empty
+% \def\docommand##1%
+% {\scratchdimen##1\points
+% \scratchdimen\recurselevel\scratchdimen
+% \scratchcounter\scratchdimen
+% \divide\scratchcounter \maxcard
+% \edef\PDFcolorindexvector{\PDFcolorindexvector\uchexnumbers\scratchcounter}}%
+% \dostepwiserecurse\zerocount{255}\plusone
+% {\rawprocesscommacommand[#4,1]\docommand
+% \xdef\PDFcolorindexvector{\PDFcolorindexvector\space}}%
+% \immediate \pdfobj stream attr
+% {/FunctionType 4 /Domain [\PDFspotcolordomain] /Range [#6]}{{\spotpops#7}}%
+% \immediate \pdfobj
+% {[/Indexed
+% [/DeviceN [\PDFspotcolornames] /Device#5 \PDFobjref\pdflastobj] %
+% 255 <\PDFcolorindexvector>]}%
+% \dosetobjectreference{PDFIX}{#1}{\the\pdflastobj}%
+% \appendtoPDFdocumentcolorspaces{/#1_INDEXED \PDFobjref\pdflastobj}%
+% \egroup}
+
+% we reverse the index; an alternative is to negate the graphic itself (\start/stop negative)
+
+\def\doPDFregistersomeindexcolor#1#2#3#4#5#6#7% name fractions names p's space domain function
+ {\bgroup
+ \let\spotpops\empty
+ \dorecurse{#2}{\edef\spotpops{\spotpops exch pop\space}}%
+ \let\PDFspotcolornames \empty
+ \let\PDFspotcolordomain\empty
+ \def\docommand##1%
+ {%\edef\PDFspotcolornames {\PDFspotcolornames/##1\space}%
+ \edef\PDFspotcolornames{\PDFspotcolornames/\executeifdefined{@@pdf@@scn@@##1}{##1}\space}%
+ \edef\PDFspotcolordomain{\PDFspotcolordomain 0.0 1.0\space}}%
+ \processcommacommand[#3,None]\docommand
+ \let\PDFcolorindexvector\empty
+ \def\docommand##1%
+ {\scratchdimen##1\points
+ \scratchdimen\recurselevel\scratchdimen
+ \scratchcounter\scratchdimen
+ \divide\scratchcounter \maxcard
+ \edef\PDFcolorindexvector{\PDFcolorindexvector\uchexnumbers\scratchcounter}}%
+ %\dostepwiserecurse\zerocount{255}\plusone
+ \dostepwiserecurse{255}\zerocount\minusone % we need to negate
+ {\rawprocesscommacommand[#4,1]\docommand
+ \xdef\PDFcolorindexvector{\PDFcolorindexvector\space}}%
+ \immediate \pdfobj stream attr
+ {/FunctionType 4 /Domain [\PDFspotcolordomain] /Range [#6]}{{\spotpops#7}}%
+ \immediate \pdfobj
+ {[/Indexed
+ [/DeviceN [\PDFspotcolornames] /Device#5 \the\pdflastobj\space0 R] %
+ 255 <\PDFcolorindexvector>]}%
+ \dosetobjectreference{PDFIX}{#1}{\the\pdflastobj}%
+ \appendtoPDFdocumentcolorspaces{/#1_INDEXED \the\pdflastobj\space0 R}%
+ \egroup}
+
+%D \macros
+%D {dostarttransparency,dostoptransparency}
+%D
+%D For transparency, we need to implement a couple of
+%D auxiliary macros. If needed, we will generalize them later.
+
+\definespecial\dostarttransparency{\doPDFstarttransparency}
+\definespecial\dostoptransparency {\doPDFstoptransparency}
+
+\PDFtransparencysupportedtrue
+
+\def\@@PDT{@PDT@}
+
+\ifx\PDFcurrenttransparency\undefined
+ \newcount\PDFcurrenttransparency \PDFcurrenttransparency=0 % -1
+\fi
+
+\def\assignPDFtransparency#1#2%
+ {\edef\PDFtransparencyidentifier{/Tr#1}%
+ \edef\PDFtransparencyreference{\PDFobjref{#2}}}
+
+\def\presetPDFtransparency#1#2%
+ {\initializePDFtransparency
+ \executeifdefined{\@@PDT#1:#2}{\dopresetPDFtransparency{#1}{#2}}}
+
+\def\dopresetPDFtransparency#1#2%
+ {\global\advance\PDFcurrenttransparency \plusone
+ \immediate\pdfobj{\PDFtransparancydictionary{#1}{#2}{}}%
+ \edef\PDFtransparencyidentifier{/Tr\the\PDFcurrenttransparency}%
+ \edef\PDFtransparencyreference {\PDFobjref\pdflastobj}%
+ \setxvalue{\@@PDT#1:#2}%
+ {\noexpand\assignPDFtransparency{\the\PDFcurrenttransparency}{\the\pdflastobj}}%
+ \appendtoPDFdocumentextgstates
+ {\PDFtransparencyidentifier\space
+ \PDFtransparencyreference\space}}
+
+\def\initializePDFtransparency
+ {\immediate\pdfobj{\PDFtransparancydictionary{1}{1}{/AIS false}}%
+ \xdef\PDFtransparencyresetidentifier{/Tr0}%
+ \xdef\PDFtransparencyresetreference{\PDFobjref\pdflastobj}%
+ \setxvalue{\@@PDT0:0}%
+ {\noexpand\assignPDFtransparency{0}{\the\pdflastobj}}%
+ \appendtoPDFdocumentextgstates
+ {\PDFtransparencyresetidentifier\space
+ \PDFtransparencyresetreference\space}%
+ \global\let\initializePDFtransparency\relax}
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D Clipping in \PDFTEX\ is rather trivial. We can even hook
+%D in \METAPOST\ without problems.
+
+\definespecial\dostartclipping#1#2#3%
+ {\PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#3}\height
+ \grabMPclippath{#1}{1}\width\height
+ {0 0 m \width\space 0 l \width \height l 0 \height l}%
+ \pdfliteral % PDFcode ?
+ {q 0 w \MPclippath\space W n}}
+
+\definespecial\dostopclipping
+ {\pdfliteral{Q n}} % PDFcode
+
+%D \macros
+%D {dosetupinteraction}
+%D
+%D Nothing special is needed to enable \PDF\ commands and
+%D interaction. We stick with a message.
+
+\definespecial\dosetupinteraction
+ {\showmessage\m!interactions{21}{pdftex}}
+
+%D \macros
+%D {doresetgotowhereever,
+%D dostartthisisrealpage,dostartthisislocation,
+%D dostartgotorealpage,dostartgotolocation,dostartgotoJS}
+%D
+%D The interactions macros are the core of this module. We
+%D support both page destinations and named ones. We don't
+%D need the \type{\stop}||alternatives. We also don't need
+%D to set the special that sets the real page number.
+
+\definespecial\doresetgotowhereever {\doPDFresetgotowhereever}
+\definespecial\dostartthisislocation{\doPDFstartthisislocation}
+
+%D When going to a location, we obey the time and space saving
+%D boolean \type{\ifusepagedestination}. Named destinations are
+%D stripped and made robust. This all happens in the macros
+%D called for.
+
+\definespecial\dostartgotolocation{\doPDFstartgotolocation}
+\definespecial\dostartgotorealpage{\doPDFstartgotorealpage}
+\definespecial\dostartgotoJS {\doPDFstartgotoJS}
+
+\let\PDFpagexyzspec\empty % pdftex does not accept spec
+
+%D \macros
+%D {doflushJSpreamble}
+%D
+%D It does not make sense to duplicate common \JAVASCRIPT\
+%D functions, and therefore they can be predefined and must be
+%D output separately. Currently this special is not shared
+%D with the \ACROBAT\ one, simply because \DISTILLER\ does not
+%D yet support something \type{\pdfnames}.
+
+% \oneJSpreamblefalse % buggy in acrobat
+
+\definespecial\doflushJSpreamble#1%
+ {\bgroup
+ \let\compositeJScode\empty
+ \def\docommand##1%
+ {\edef\sanitizedJScode{\getJSpreamble{##1}}%
+ \@EA\doPSsanitizeJScode\sanitizedJScode\to\sanitizedJScode
+ \immediate\pdfobj {<< /S /JavaScript /JS (\sanitizedJScode) >>}%
+ \edef\compositeJScode
+ {\compositeJScode\space (##1) \PDFobjref\pdflastobj}}%
+ \processcommalist[#1]\docommand
+ \immediate\pdfobj{<< /Names [ \compositeJScode ] >>}%
+ \pdfnames{/JavaScript \PDFobjref\pdflastobj}%
+ \egroup}
+
+%D \macros
+%D {dostarthide,dostophide}
+%D
+%D Hiding parts of the document for printing is not yet
+%D supported by \PDF\ and therefore \PDFTEX.
+
+\definespecial\dostarthide{}
+\definespecial\dostophide {}
+
+%D \macros
+%D {dosetupscreen}
+%D
+%D Setting of the screen boundingbox involves some
+%D calculations. Here we also take care of (non) full screen
+%D startup. The dimensions are rounded. Because \PDFTEX\ and
+%D \ACROBAT\ handle setting the page dimensions in a
+%D different way, we do not share this special.
+
+\definespecial\dosetupscreen {\doPDFsetupscreen \pdfpageheight}
+
+\definespecial\dosetupartbox {\doPDFsetupartbox \pdfpageheight}
+\definespecial\dosetupcropbox {\doPDFsetupcropbox \pdfpageheight}
+\definespecial\dosetupbleedbox{\doPDFsetupbleedbox\pdfpageheight}
+\definespecial\dosetuptrimbox {\doPDFsetuptrimbox \pdfpageheight}
+
+%D \macros
+%D {dostartexecutecommand}
+%D
+%D \PDF\ viewers enable us to navigate using menus and shortcut
+%D keys. These navigational tools can also be accessed by using
+%D annotations. The next special takes care of inserting them.
+
+\definespecial\dostartexecutecommand{\doPDFstartexecutecommand}
+
+%D \macros
+%D {dosetupidentity}
+%D
+%D Documents can be tagged with an application accessible title
+%D and subtitle, the authorname, a date, the creator, keywords
+%D etc. For the moment \PDFTEX\ only supports the first three
+%D of these.
+
+\definespecial\dosetupidentity{\doPDFsetupidentity}
+
+%D \macros
+%D {dostartrunprogam}
+%D
+%D We can run a program form within a document, although this
+%D feature is rather weak, due to path problems and buggy
+%D argument passing.
+
+\definespecial\dostartrunprogram{\doPDFstartrunprogram}
+
+%D \macros
+%D {dostartgotoprofile, dostopgotoprofile,
+%D dobeginofprofile, doendofprofile}
+%D
+%D \CONTEXT\ user profiles and version control fall back on
+%D \PDF\ article threads. Unfortunately one cannot influence
+%D the view yet in an (for me) acceptable way.
+
+\definespecial\dostartgotoprofile{\doPDFstartgotoprofile}
+
+%D Some day, I'll reimplement threading in a useful way.
+%D Currently the viewers handle threads rather diffuse.
+
+\ifnum\pdftexversion>13
+
+\definespecial\dobeginofprofile#1#2#3#4%
+ {\setPDFdestination{#1}%
+ \doifsomething\PDFdestination
+ {\pdfthread
+ width #2 height #3
+ attr {/Title (\PDFdestination)} % can be omitted
+ name {\PDFdestination}}}
+
+\definespecial\doendofprofile%
+ {}
+
+\fi
+
+%D \macros
+%D {doinsertbookmark}
+%D
+%D In \PDF\ bookmarks are the building blocks of a viewer
+%D provided sort of table of contents. \TEX\ has to provide
+%D the entry as well as the number of child entries. Strings
+%D need to be sanatized as good as possible to suit the default
+%D encoding. In \CONTEXT\ users can overrule this string by
+%D supplying an alternative one. Look at the macro called for
+%D to see how funny these bookmarks are defined.
+
+\definespecial\doinsertbookmark{\doPDFinsertbookmark}
+
+%D \macros
+%D {dostartobject,dostopobject,doinsertobject}
+%D
+%D Due to \PDF's object oriented character, we can include and
+%D reuse objects. These can be compared with \TEX's boxes. The
+%D \TEX\ counterpart is defined in the module \type{spec-dvi}.
+%D We don't use the dimensions here.
+%D
+%D The next solution is not that beautiful. Because objects are
+%D containers for whatever kind of content, graphics can be
+%D part of this content, and a graphic object can be part of
+%D the more general type. In practice this means that an ximage
+%D would be embedded in an xform, which in itself is not that
+%D big a problem, apart from a few bytes overhead. However, for
+%D reasons unknown to me alternative images must be pure
+%D ximages |<|indeed, somehow one cannot use a vector graphic
+%D as alternative|>| that are not embedded into forms, so this
+%D is why the object handler treats them different. This
+%D implies knowledge of the calling routines, especially the
+%D \type{FIG} trigger, that signals that we just embedded an
+%D image. Alternatively I could have introduced a dual object
+%D system, but the overhead in duplicate specials is currently
+%D not what we want. I'd rather implement a more mature
+%D object support system from scratch.
+
+\let\currentPDFresources\empty
+\let\PDFimageattributes \empty
+\let\PDFfigurereference \empty
+\let\PDFimagereference \empty
+
+\ifnum\pdftexversion>13
+
+ \definespecial\dostartobject#1#2#3#4#5%
+ {\bgroup
+ \setbox\nextbox\vbox\bgroup
+ \def\dodostopobject
+ {\egroup
+ \ifx\PDFimagereference\empty
+ % We also flush page resources, since shared
+ % resources end up there; otherwise transparencies
+ % won't work in xforms; some day I will optimize
+ % this.
+ \the\everyPDFxform
+ \finalizeobjectbox\nextbox
+ \immediate\pdfxform
+ resources {\currentPDFresources\the\pdfpageresources}%
+ \nextbox
+ \global\let\currentPDFresources\empty
+ \dosetobjectreference{#1}{#2}{\the\pdflastxform}%
+ \else
+ \dosetobjectreference{#1}{#2}{-\PDFimagereference}%
+ \global\let\PDFimagereference\empty
+ \fi}}
+
+ \definespecial\dostopobject
+ {\dodostopobject
+ \egroup}
+
+ \definespecial\doresetobjects
+ {\global\let\PDFimagereference\empty}
+
+ \definespecial\doinsertobject#1#2%
+ {\bgroup
+ \doifobjectreferencefoundelse{#1}{#2}
+ {\dogetobjectreference{#1}{#2}\PDFobjectreference
+ \ifnum\PDFobjectreference<0
+ \@EA\@EA\@EA\pdfrefximage\@EA\gobbleoneargument\PDFobjectreference
+ \else
+ \pdfrefxform\PDFobjectreference
+ \fi}%
+ {}%
+ \egroup}
+
+\else
+
+ \definespecial\dostartobject#1#2#3#4#5%
+ {\bgroup
+ \setbox\nextbox\vbox\bgroup
+ \def\dodostopobject
+ {\egroup
+ \the\everyPDFxform
+ \pdfform\nextbox
+ \dosetobjectreference{#1}{#2}{\the\pdflastform}}}
+
+ \definespecial\dostopobject
+ {\dodostopobject
+ \egroup}
+
+ \definespecial\doinsertobject#1#2%
+ {\bgroup
+ \dogetobjectreference{#1}{#2}\PDFobjectreference
+ \pdfrefform\PDFobjectreference
+ \egroup}
+
+\fi
+
+\appendtoksonce
+ \collectPDFresources
+ \global\let\currentPDFresources\collectedPDFresources
+\to \everyPDFxform
+
+%D \macros
+%D {dosetpagetransition}
+%D
+%D Page transitions only make sence in presentations. They are
+%D passed as raw \PDF\ code to the page object. Take a look
+%D at the implementation to get an impression of the rubish
+%D passed on.
+
+\definespecial\dosetpagetransition{\doPDFsetpagetransition}
+
+%D The expansion is needed because else the \type{\pdfpageattr}
+%D token list flushes an unexpanded \type{\csname}. The
+%D \type{\global} is needed because the assignment can take
+%D place deeply buried (for instance in the \type{\shipout}
+%D box.
+
+%D \macros
+%D {doinsertcomment, doflushcomments}
+%D
+%D Text annotation, or comments, are provided too:
+
+\definespecial\doinsertcomment{\doPDFinsertcomment}
+\definespecial\doflushcomments{\doPDFflushcomments}
+
+%D \macros
+%D {dopresetlinefield,dopresettextfield,
+%D dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
+%D dopresetpushfield,dopresetcheckfield,
+%D dopresetradiofield,dopresetradiorecord}
+%D
+%D \PDF\ offers extensive field support. The next bunch of
+%D definitions map the specials.
+
+\definespecial\dopresetlinefield {\doFDFpresetlinefield}
+\definespecial\dopresettextfield {\doFDFpresettextfield}
+\definespecial\dopresetchoicefield{\doFDFpresetchoicefield}
+\definespecial\dopresetpopupfield {\doFDFpresetpopupfield}
+\definespecial\dopresetcombofield {\doFDFpresetcombofield}
+\definespecial\dopresetpushfield {\doFDFpresetpushfield}
+\definespecial\dopresetcheckfield {\doFDFpresetcheckfield}
+\definespecial\dopresetradiofield {\doFDFpresetradiofield}
+\definespecial\dopresetradiorecord{\doFDFpresetradiorecord}
+
+%D \macros
+%D {dodefinefieldset,dogetfieldset,doiffieldset}
+%D
+%D Field sets, needed for reset and submit handling, are
+%D taken care of by:
+
+\definespecial\dodefinefieldset{\doFDFdefinefieldset}
+\definespecial\dogetfieldset {\doFDFgetfieldset}
+\definespecial\doiffieldset {\doFDFiffieldset}
+
+%D \macros
+%D {doregistercalculationset}
+%D
+%D The calculation order is defined using:
+
+\definespecial\doregistercalculationset{\doFDFregistercalculationset}
+
+%D \macros
+%D {doPDFdestination}
+%D
+%D Finally we implement some low level macros to deal with
+%D flushing \PDF\ code. First we handle the named destinations.
+
+\def\doPDFdestination#1%
+ {\pdfdest name {#1}\PDFpageviewkey}
+
+%D \macros
+%D {doPDFaction,doPDFannotation,ifsharePDFactions}
+%D
+%D Next we handle annotations. All link annotations are
+%D implemented using the action dictionary. This enables us to
+%D use multiple actions. The second macro is for instance
+%D used for movie inclusion.
+
+\newif\ifsharePDFactions \sharePDFactionstrue
+
+% hm, due to some stupid optimization this feature has been
+% disabled for some time, watch out \lastPDFaction is to be
+% persistent
+
+\ifnum\pdftexversion>13
+
+ \def\doPDFaction#1#2#3%
+ {\xdef\lastPDFcontent{#3}%
+ \ifcollectreferenceactions
+ \global\let\lastPDFaction\lastPDFcontent
+ \else
+ \ifsharePDFactions
+ \ifcase\similarreference\relax
+ \xdef\lastPDFaction{<<\lastPDFcontent>>}%
+ \or
+ \immediate\pdfobj{<<\lastPDFcontent>>}%
+ \xdef\lastPDFaction{\PDFobjref\pdflastobj}%
+ \else
+ % leave \lastPDFaction untouched
+ \fi
+ \else
+ \xdef\lastPDFaction{<<\lastPDFcontent>>}%
+ \fi
+ \pdfannot
+ width #1 height #2 depth \zeropoint
+ {/Subtype /Link
+ /Border [0 0 0]
+ \ifhighlighthyperlinks \else /H /N \fi
+ /A \lastPDFaction}%
+ \fi}
+
+\else
+
+ \def\doPDFaction#1#2#3%
+ {\ifcollectreferenceactions
+ \xdef\lastPDFaction{#3}%
+ \else
+ \ifsharePDFactions
+ \ifcase\similarreference\relax
+ \xdef\lastPDFaction{<<#3>>}%
+ \or
+ \immediate\pdfobj{<<#3>>}%
+ \xdef\lastPDFaction{\PDFobjref\pdflastobj}%
+ \else
+ % leave \lastPDFaction untouched
+ \fi
+ \else
+ \xdef\lastPDFaction{<<#3>>}%
+ \fi
+ \pdfannotlink % could be \pdfannot if not the - problem was there
+ width #1 height #2 depth \zeropoint
+ user {/Subtype /Link
+ /Border [0 0 0]
+ \ifhighlighthyperlinks \else /H /N \fi
+ /A \lastPDFaction}%
+ \pdfendlink
+ \fi}
+
+\fi
+
+% pdftex and viewers give problems with this one (printing forms)
+%
+%\def\doPDFannotation#1#2#3%
+% {\pdfannot width #1sp height -#2sp depth \zeropoint{#3}}
+%
+% This is corrected in version 14. When this version is wide
+% spread, this will be cleaned up.
+
+\ifnum\pdftexversion>13
+
+ \def\doPDFannotation#1#2#3%
+ {\pdfannot width #1 height #2 depth \zeropoint{#3}}
+
+\else
+
+ \def\doPDFannotation#1#2#3%
+ {\hbox{\raise#2\hbox{\pdfannot width #1 height #2 depth \zeropoint{#3}}}}
+
+\fi
+
+%D \macros
+%D {doPDFannotationobject,doPDFactionobject}
+%D
+%D For field support we need annotation objects. Although in
+%D many cases we can do without indirect references (and use
+%D the last annotation object number directly), we take the
+%D save route.
+
+\def\doPDFannotationobject#1#2#3#4#5%
+ {\doPDFannotation{#3}{#4}{#5}%
+ \dosetobjectreference{#1}{#2}{\the\pdflastannot}}
+
+\def\doPDFactionobject#1#2#3#4#5%
+ {\doPDFaction{#3}{#4}{#5}%
+ \dosetobjectreference{#1}{#2}{\the\pdflastannot}}
+
+%D \macros
+%D {doPDFaddtocatalog,doPDFaddtoinfo,
+%D doPDFpageattribute,doPDFpagesattribute}
+%D
+%D Next some simple ones. Watch the global directive and the
+%D expansion in the page attribute macro.
+
+\def\doPDFaddtocatalog
+ {\pdfcatalog}
+
+\def\doPDFaddtoinfo
+ {\pdfinfo}
+
+\def\doPDFpageattribute#1%
+ {\expanded{\global\pdfpageattr{#1\the\pdfpageattr}}}
+
+\def\doPDFpageresource#1%
+ {\expanded{\global\pdfpageresources{#1\the\pdfpageresources}}}
+
+\def\doPDFpagesattribute#1%
+ {\expanded{\global\pdfpagesattr{#1\the\pdfpagesattr}}}
+
+\def\doPDFresetpageattributes
+ {\global\pdfpageattr\emptytoks}
+
+\def\doPDFresetpageresources
+ {\global\pdfpageresources\emptytoks}
+
+%D \macros
+%D {doPDFbookmark}
+%D
+%D Well, isn't the next one ugly? Thanks to the \PDF\
+%D standard.
+
+\def\doPDFbookmark#1#2#3#4#5%
+ {\doPDFgetpagereference{#4}\PDFobjectreference
+ \pdfoutline
+ user {<</S /GoTo /D [\PDFobjectreference\space\PDFpageviewwrd]>>}%
+ \ifcase#2 \else count \ifcase#5-\fi#2 \fi
+ {\ifPDFunicode<#3>\else#3\fi}}
+
+%D \macros
+%D {doPDFdictionaryobject,doPDFarrayobject}
+%D
+%D Where \PDFTEX\ has only one object primitive, optionally a
+%D stream one, \ACROBAT\ has several operators.
+
+\def\doPDFdictionaryobject#1#2#3%
+ {\flushatshipout
+ {\immediate\pdfobj{<< #3 >>}%
+ \dosetobjectreference{#1}{#2}{\the\pdflastobj}}}
+
+\def\doPDFarrayobject#1#2#3%
+ {\flushatshipout
+ {\immediate\pdfobj{[ #3 ]}%
+ \dosetobjectreference{#1}{#2}{\the\pdflastobj}}}
+
+% tricky .. too many xforms now
+%
+% \def\doreservePDFobject#1#2%
+% {\pdfobj reserveobjnum{}%
+% \driverreferenced\dosetobjectreference{#1}{#2}{\the\pdflastobj}}
+%
+% \def\doPDFreserveddictionaryobject#1#2#3%
+% {\doPDFgetobjectnumber{#1}{#2}\PDFobjectnumber
+% \immediate\pdfobj useobjnum \PDFobjectnumber {<< #3 >>}}
+%
+% \def\doPDFreservedarrayobject#1#2#3%
+% {\doPDFgetobjectnumber{#1}{#2}\PDFobjectnumber
+% \immediate\pdfobj useobjnum \PDFobjectnumber {[ #3 ]}}
+
+% \doreservePDFobject{FDF}{docuextgstates}
+% \doreservePDFobject{FDF}{colorspaces}
+% \doreservePDFobject{FDF}{docushades}
+
+%D \macros
+%D {defaultobjectreference,doPDFgetobjectreference}
+%D
+%D Because in \PDFTEX\ we have to construct the object
+%D references \type{N 0 R}, we can default to the non existing
+%D zero object number.
+
+\def\defaultobjectreference#1#2%
+ {0}
+
+\def\doPDFgetobjectreference#1#2#3%
+ {\dogetobjectreference{#1}{#2}#3%
+ \edef#3{\ifx#3\empty null\else\PDFobjref{#3}\fi}}
+
+\def\doPDFgetobjectnumber#1#2#3%
+ {\dogetobjectreference{#1}{#2}#3%
+ \edef#3{\ifx#3\empty 0\else#3\fi}}
+
+% \def\doPDFgetobjectpage #1#2#3{..}
+% \def\doPDFgetobjectpagereference#1#2#3{..}
+
+\ifx\pdfpageref\undefined
+
+ \def\doPDFgetpagereference % number macro
+ {\installprogram{texutil --filter \jobname}%
+ \gdef\doPDFgetpagereference##1{\doPDFgetobjectreference{PDFP}{\number##1}}% {##2}
+ \doPDFgetpagereference}
+
+\else
+
+ \def\doPDFgetpagereference#1#2% number macro
+ {\edef#2{\ifnum#1>\zerocount\PDFobjref{\pdfpageref#1}\else null\fi}}
+
+\fi
+
+%D \macros
+%D {initializePDFnegative,initializePDFoverprint}
+%D
+%D Here follow some rather obscure macros. They will only
+%D come into action when one wants negated output.
+
+%D Todo: move code to fdf module
+
+\def\initializePDFnegative
+ {\immediate\pdfobj stream attr {/FunctionType 4 /Range [0 1] /Domain [0 1]} {{1 exch sub}}%
+ \immediate\pdfobj{<</Type /ExtGState /TR \PDFobjref\pdflastobj>>}%
+ \appendtoPDFdocumentextgstates{/GSnegative \PDFobjref\pdflastobj}%
+ \immediate\pdfobj{<</Type /ExtGState /TR /Identity>>}%
+ \appendtoPDFdocumentextgstates{/GSpositive \PDFobjref\pdflastobj}%
+ \global\let\initializePDFnegative\relax}
+
+\def\initializePDFoverprint
+ {\immediate\pdfobj{<</Type /ExtGState /OP false /OPM 0>>}% /op defaults to /OP
+ \appendtoPDFdocumentextgstates{/GSknockout \PDFobjref\pdflastobj}%
+ \immediate\pdfobj{<</Type /ExtGState /OP true /OPM 1>>}% /op defaults to /OP
+ \edef\PDFobjectreferenceB{\the\pdflastobj}%
+ \appendtoPDFdocumentextgstates{/GSoverprint \PDFobjref\pdflastobj}%
+ \global\let\initializePDFoverprint\relax}
+
+%D File embedding. Storing the stream identifier is needed
+%D to get access to the number. When typeset, the user can
+%D feed this number to \type {pdftosrc} and filter the
+%D file from the \PDF\ file.
+
+\let\PDFlaststreamobject \s!unknown
+%def\PDFlaststreamreference{0 0 R}
+
+\def\doPDFfilestreamobject#1#2#3#4%
+ {\immediate\pdfobj stream file{#4}%
+ \edef\PDFlaststreamobject{\the\pdflastobj}%
+ \dosetobjectreference{PDFFS}{#2}{\PDFlaststreamobject}%
+ \doPDFdictionaryobject{#1}{#2}{/Type /Filespec /F (#3) /EF <</F \PDFobjref\PDFlaststreamobject>>}}
+
+\def\doPDFgetfilestreamreference#1#2%
+ {\doPDFgetobjectreference{PDFFS}{#1}#2}
+
+\def\doPDFfilestreamidentifier#1%
+ {\doifsomething{#1}
+ {\doPDFgetfilestreamreference{#1}\PDFobjectreference
+ \@EA\beforesplitstring\PDFobjectreference\at{ }\to\PDFlaststreamobject
+ \PDFlaststreamobject}}
+
+% %D We can set \METAPOST\ prologues to~1:
+
+\def\MPprologues{1}
+
+%D Experimental:
+
+\definespecial\dostartfonteffect{\doPDFstartfonteffect}
+\definespecial\dostopfonteffect {\doPDFstopfonteffect}
+
+%D Some MP stuff:
+
+\let\handleMPfshow\dohandleMPfshow % default anyway
+
+\ifnum\pdftexversion<14
+
+ \def\setMPPDFobject#1#2% resources boxnumber
+ {\def\getMPPDFobject{\box#2}}
+
+\else
+
+ \def\setMPPDFobject#1#2% resources boxnumber
+ {\the\everyPDFxform
+ \finalizeobjectbox{#2}%
+ \immediate\pdfxform resources{#1}#2%
+ \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}}
+
+\fi
+
+\let\getMPPDFobject\relax
+
+\definespecial\doinsertMPfile#1%
+ {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}}
+
+%D Now we can finish this module.
+
+\stopspecials
+
+\protect \endinput
diff --git a/tex/context/base/spec-tr.mkii b/tex/context/base/spec-tr.mkii
new file mode 100644
index 000000000..c1f997bca
--- /dev/null
+++ b/tex/context/base/spec-tr.mkii
@@ -0,0 +1,107 @@
+%D \module
+%D [ file=spec-tr,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Thomas Rokicki's \DVIPS,
+%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 Especially the rotation proved to be incompatible with
+%D the default \POSTSCRIPT\ special driver. Many thanks to
+%D Gilbert van den Dobbelsteen for testing and hacking the
+%D \DVIPS\ source and pinpointing the problem.
+
+%D \macros
+%D {doinsertfile}
+%D
+%D We overrule the figure||insertion special. Things should
+%D be more accurate, but maybe someday \unknown
+
+\startspecials[rokicki]
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {" }
+
+%D Ugly but useful:
+
+\definefileinsertion{tr}{eps}
+ {\bgroup
+ \PointsToWholeBigPoints\@@DriverImageWidth \width
+ \PointsToWholeBigPoints\@@DriverImageHeight\height
+ \special
+ {PSfile="\@@DriverImageFile"\space
+ llx=\EPSllx\space
+ lly=\EPSlly\space
+ urx=\EPSurx\space
+ ury=\EPSury\space
+ \ifdim\@@DriverImageWidth >\zeropoint rwi=\width 0\space\fi
+ \ifdim\@@DriverImageHeight>\zeropoint rhi=\height0 \fi}%
+ \egroup}
+
+\definefileinsertion{tr}{mps}
+ {\hbox
+ {\convertMPcolors\@@DriverImageFile
+ \dofileinsertion{tr}{eps}}}
+
+\definespecial\doinsertfile
+ {\dofileinsertion{tr}\@@DriverImageType}
+
+%D Some MP stuff:
+
+\definespecial\doinsertMPfile#1%
+ {\doiffileelse{./#1}{\includeMPasEPS{./#1}}{\message{[MP #1]}}}
+
+%D \macros
+%D {dostartrotation}
+%D
+%D Because \DVIPS\ uses a reverse rotation scheme, we have
+%D to add an extra \type{neg} to the default \POSTSCRIPT\
+%D rotation definition:
+
+\definespecial\dostartrotation#1% straight from the YandY manual / 1st neg added
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ \number#1\space\space neg rotate neg exch neg exch translate}}
+
+\definespecial\dostoprotation
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+%D Drawing ovals in \DVIPS\ is complicated by the fact that
+%D the colors get reset. Therefore we need a more literal
+%D approach and therefore scale to local units. By redefining
+%D the retain constant into a macro, we can use the already
+%D present \POSTSCRIPT\ definition (see \type{spec-ps}).
+
+\definespecial\doovalbox#1#2#3#4#5#6#7#8% variant not yet supported
+ {\bgroup
+ \edef\@@insertpostscriptretain gsave%
+ {\@@insertpostscriptliteral
+ gsave
+ Resolution 72 div
+ VResolution 72 div neg scale currentpoint translate}%
+ \dosomeovalbox{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
+ \egroup}
+
+%D \macros
+%D {dosetuppaper}
+%D
+%D Relatively new:
+
+\definespecial\dosetuppaper#1#2#3%
+ {\begingroup
+ \!!dimena#2%
+ \!!dimenb#3%
+ \special{papersize=\the\!!dimena,\the\!!dimenb}%
+ \endgroup}
+
+\stopspecials
+
+\endinput
diff --git a/tex/context/base/spec-tst.mkii b/tex/context/base/spec-tst.mkii
new file mode 100644
index 000000000..543baa647
--- /dev/null
+++ b/tex/context/base/spec-tst.mkii
@@ -0,0 +1,52 @@
+%D \module
+%D [ file=spec-tst,
+%D version=2002.12.08,
+%D title=\CONTEXT\ \PDF\ Macros,
+%D subtitle=Special Test Macro,
+%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
+
+%D The code is now merged into spec-*.mkii
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\mainlanguage[vn]
+\enableregime[utf]
+\usetypescript[all][computer-modern][t5]
+
+\setupinteraction
+ [state=start,
+ title={Thử tiếng Việt},
+ author={Tác Văn Giả},
+ keyword={Thử tiếng Việt}]
+
+\placebookmarks[chapter,section,subsection]
+
+\starttext
+
+\placelist[chapter,section,subsection][alternative=c]
+
+\chapter{Thử tiếng Việt}
+
+\section {Mục thứ nhất}
+\subsection{Mục nhỏ thứ nhất} Thử tiếng Việt
+\subsection{Mục nhỏ thứ hai} Thử tiếng Việt
+
+\section {Mục thứ hai}
+\subsection{Mục nhỏ thứ nhất} Thử tiếng Việt
+\subsection{Mục nhỏ thứ hai} Thử tiếng Việt
+
+\section {Mục thứ ba}
+\subsection{Mục nhỏ thứ nhất} Thử tiếng Việt
+\subsection{Mục nhỏ thứ hai} Thử tiếng Việt
+
+\stoptext
diff --git a/tex/context/base/spec-var.mkii b/tex/context/base/spec-var.mkii
new file mode 100644
index 000000000..8d561dc6f
--- /dev/null
+++ b/tex/context/base/spec-var.mkii
@@ -0,0 +1,83 @@
+%D \module
+%D [ file=spec-var,
+%D version=2003.10.10,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Variables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module used to be integrated in \type {spec-ini},
+%D but testing optimization is more convenient this way.
+
+\writestatus{loading}{ConTeXt Special Macros / Variables}
+
+% new approach, 'global' variables, since we run out of
+% arguments
+
+\unprotect
+
+% This variable holds a comma separated list of (supported) figure
+% types. It may be changes by other modules.
+
+\let\figuretypes\empty
+
+\ifx\undefined\@@DriverFieldName
+
+ \letempty \@@DriverFieldName
+ \letempty \@@DriverFieldWidth
+ \letempty \@@DriverFieldHeight
+ \letempty \@@DriverFieldDefault
+ \letempty \@@DriverFieldNumber
+ \letempty \@@DriverFieldNumber
+ \letempty \@@DriverFieldStyle
+ \letempty \@@DriverFieldColor
+ \letempty \@@DriverFieldBackgroundColor
+ \letempty \@@DriverFieldFrameColor
+ \letempty \@@DriverFieldLayer
+ \letempty \@@DriverFieldOption
+ \letempty \@@DriverFieldAlign
+ \letempty \@@DriverFieldClickIn
+ \letempty \@@DriverFieldClickOut
+ \letempty \@@DriverFieldRegionIn
+ \letempty \@@DriverFieldRegionOut
+ \letempty \@@DriverFieldAfterKey
+ \letempty \@@DriverFieldFormat
+ \letempty \@@DriverFieldValidate
+ \letempty \@@DriverFieldCalculate
+ \letempty \@@DriverFieldFocusIn
+ \letempty \@@DriverFieldFocusOut
+
+\fi
+
+\ifx\undefined\@@DriverCommentLayer
+
+ \letempty \@@DriverCommentLayer
+
+\fi
+
+\ifx\undefined\@@DriverAttachmentLayer
+
+ \letempty \@@DriverAttachmentLayer
+
+\fi
+
+\ifx\undefined\@@DriverImageBox
+
+ \letempty \@@DriverImageBox
+ \letempty \@@DriverImageOptions
+ \letempty \@@DriverImageWidth
+ \letempty \@@DriverImageHeight
+ \letempty \@@DriverImageFile
+ \letempty \@@DriverImageLabel
+ \letempty \@@DriverImageType
+ \letempty \@@DriverImageMethod
+ \letempty \@@DriverImagePage
+
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/spec-win.mkii b/tex/context/base/spec-win.mkii
new file mode 100644
index 000000000..73db8830e
--- /dev/null
+++ b/tex/context/base/spec-win.mkii
@@ -0,0 +1,99 @@
+%D \module
+%D [ file=spec-win,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\YandY's \DVIWINDO,
+%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
+
+%D Remark: chained references are not yet implemented.
+
+%D \macros
+%D {dosetupinteraction,
+%D dostartthisislocation,
+%D dostartthisisrealpage,
+%D dostartgotolocation,
+%D dostartgotorealpage,
+%D dostartrunprogram,
+%D usepagedestinations}
+%D {}
+%D
+%D As told before, these were the first interactive specials.
+%D In those days, these kind of specials were still elegant
+%D and straightforward.
+
+\startspecials[dviwindo]
+
+\definespecial\dosetupinteraction%
+ {\showmessage\m!interactions{21}{dviwindo}}
+
+\definespecial\dostartgotolocation#1#2#3#4#5#6%
+ {\bgroup
+ \doifelsenothing{#3}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \setreferencefilename#4\to\DVIfile
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
+ \special
+ {button:
+ \width \height
+ \if!!donea
+ file: \DVIfile,
+ \fi
+ "#5"}}
+ {}% nog uri afhandelen
+ \egroup}
+
+\definespecial\dostartgotorealpage#1#2#3#4#5%
+ {\bgroup
+ \doifelsenothing{#3}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \setreferencefilename#4\to\DVIfile
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
+ \special
+ {button:
+ \width \height
+ \if!!donea
+ file: \DVIfile,
+ \fi
+ \ifnum0#5=0 \else
+ page: #5
+ \fi}}
+ {}% nog uri afhandelen
+ \egroup}
+
+\definespecial\dostartthisislocation#1%
+ {\special{mark: "#1"}}
+
+\definespecial\dostartthisisrealpage#1%
+ {}
+
+\definespecial\dostartrunprogram#1#2#3#4%
+ {\bgroup
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
+ \special{button: \width \height launch: #3 #4}%
+ \egroup}
+
+\let\doyandyinsertmov = \docommoninsertmov
+\let\dotrinsertmov = \docommoninsertmov
+
+\stopspecials
+
+\protect \endinput
diff --git a/tex/context/base/spec-xet.mkii b/tex/context/base/spec-xet.mkii
new file mode 100644
index 000000000..0cbd55ba7
--- /dev/null
+++ b/tex/context/base/spec-xet.mkii
@@ -0,0 +1,66 @@
+%D \module
+%D [ file=spec-xtx,
+%D version=2004.11.08,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\XETEX\ support,
+%D author={Adam Lindsay \& Hans Hagen \& \unknown},
+%D date=\currentdate,
+%D copyright={Adam Lindsay \& Hans Hagen}]
+
+\unprotect
+
+\definespecial\doinsertfile
+ {\dofileinsertion{xtx}\@@DriverImageType}
+
+\definefileinsertion{xtx}{jpg}{\xtxhandleotherimage}
+\definefileinsertion{xtx}{png}{\xtxhandleotherimage}
+\definefileinsertion{xtx}{gif}{\xtxhandleotherimage}
+\definefileinsertion{xtx}{tif}{\xtxhandleotherimage}
+\definefileinsertion{xtx}{pdf}{\xtxhandlepdfimage }
+
+\def\checkpdfimagepagenumber
+ {\edef\pdfimagepagenumber
+ {\ifx\@@DriverImagePage\empty\else\ifnum\@@DriverImagePage>\zerocount
+ \space page\space\@@DriverImagePage\space
+ \fi\fi}}
+
+\def\xtxhandleotherimage
+ {\XeTeXpicfile "\@@DriverImageFile"
+ \ifdim\@@DriverImageWidth >\zeropoint \!!width \@@DriverImageWidth \space\fi
+ \ifdim\@@DriverImageHeight>\zeropoint \!!height \@@DriverImageHeight \fi
+ \relax}
+
+\def\xtxhandlepdfimage
+ {\checkpdfimagepagenumber
+ \XeTeXpdffile "\@@DriverImageFile"
+ \pdfimagepagenumber
+ \ifdim\@@DriverImageWidth >\zeropoint \!!width \@@DriverImageWidth \space\fi
+ \ifdim\@@DriverImageHeight>\zeropoint \!!height \@@DriverImageHeight \fi
+ \relax}
+
+\def\dogetXTXfiguresize
+ {\setbox\foundexternalfigure\vbox{\XeTeXpicfile "\@@DriverImageFile"\relax}%
+ \xdef\analyzedfigurewidth {\the\wd\foundexternalfigure}%
+ \xdef\analyzedfigureheight{\the\ht\foundexternalfigure}}
+
+\def\dogetXTXpdfsize
+ {\checkpdfimagepagenumber
+ \setbox\foundexternalfigure\vbox{\XeTeXpdffile "\@@DriverImageFile" \pdfimagepagenumber\relax}%
+ \xdef\analyzedfigurewidth {\the\wd\foundexternalfigure}%
+ \xdef\analyzedfigureheight{\the\ht\foundexternalfigure}}
+
+\definefilechecker{xtx}{png}{\dogetXTXfiguresize}
+\definefilechecker{xtx}{jpg}{\dogetXTXfiguresize}
+\definefilechecker{xtx}{gif}{\dogetXTXfiguresize}
+\definefilechecker{xtx}{tif}{\dogetXTXfiguresize}
+\definefilechecker{xtx}{pdf}{\dogetXTXpdfsize }
+
+\definespecial\dogetfiguresize
+ {\dofilechecker{xtx}\@@DriverImageType}
+
+%D The figure object system caused no end of headaches. They all
+%D went away with this single line:
+
+\setupexternalfigures[\c!object=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/spec-xtx.mkii b/tex/context/base/spec-xtx.mkii
new file mode 100644
index 000000000..799c6ca8d
--- /dev/null
+++ b/tex/context/base/spec-xtx.mkii
@@ -0,0 +1,87 @@
+%D \module
+%D [ file=spec-xtx,
+%D version=2004.11.08,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\XETEX\ support,
+%D author={Adam Lindsay \& Hans Hagen \& \unknown},
+%D date=\currentdate,
+%D copyright={Adam Lindsay \& Hans Hagen}]
+
+\unprotect
+
+\startspecials[xetex][reset,dpx]
+
+%D Actually, there's an intermediate ``\type{xdv}''
+%D output format, but by default, it's tranparently
+%D converted to \PDF\ by \XETEX.
+
+\setjobsuffix{pdf}
+
+%D Rotation looks fine.
+
+\definespecial\dostartrotation#1%
+ {\special{x:gsave}\special{x:rotate #1}}
+
+\definespecial\dostoprotation
+ {\special{x:grestore}}
+
+%D Scaling and mirroring are also fine.
+
+\definespecial\dostartscaling#1#2%
+ {\special{x:gsave}\special{x:scale #1 #2}}
+
+\definespecial\dostopscaling
+ {\special{x:grestore}}
+
+\definespecial\dostartmirroring
+ {\special{x:gsave}\special{x:scale -1 1}}
+
+\definespecial\dostopmirroring
+ {\special{x:grestore}}
+
+%D Colors are done with the \DVIPDFMX\ color model, which are
+%D inherited.
+
+%D Although hex colors were accommodated by Hans, we'll try the
+%D more familiar \DVIPDFMX\ ones. One good side-effect of the
+%D previous approach was that it kept track of the color state
+%D (transparency in XeTeX is accomplished setting the color to
+%D an RGBA quadruple, rather than an RGB triple). So transparency
+%D will need another plan.
+
+% \macros
+% {dostarttransparency,dostoptransparency}
+%
+% \starttypen
+% \dostarttransparency{fraction}{type}
+% \dostoptransparency
+% \stoptypen
+%
+% Although in \CONTEXT\ transparency is closely integrated
+% in the color drivers, in the end it is an independent
+% feature.
+
+%\installspecial [\dostarttransparency] [or] [2]
+%\installspecial [\dostoptransparency] [or] [0]
+
+%D \macros
+%D {doloadmapfile,doloadmapline,doresetmapfilelist}
+%D
+%D \XETEX\ 0.91 allows map file additions, via a special.
+
+\definespecial\doresetmapfilelist{\special{x:fontmapfile original-empty.map}}
+\definespecial\doloadmapfile #1#2{\special{x:fontmapfile #1#2}}
+\definespecial\doloadmapline #1#2{\special{x:fontmapline #1#2}}
+
+%D \macros
+%D {dosetuppaper}
+
+\ifx\pdfpagewidth\undefined \else
+ \definespecial\dosetuppaper#1#2#3%
+ {\global\pdfpagewidth #2\relax
+ \global\pdfpageheight#3\relax}
+\fi
+
+\stopspecials
+
+\protect \endinput
diff --git a/tex/context/base/spec-yy.mkii b/tex/context/base/spec-yy.mkii
new file mode 100644
index 000000000..beec95493
--- /dev/null
+++ b/tex/context/base/spec-yy.mkii
@@ -0,0 +1,90 @@
+%D \module
+%D [ file=spec-yy,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\YandY's \DVIPSONE\ and \DVIWINDO,
+%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 \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode,
+%D doinsertfile}
+%D
+%D We implement a nice and simple figure||insertion special
+%D and make use of \YandY's color specials. Otherwise \DVIWINDO\
+%D would not show colors.
+
+\startspecials[yandy]
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {" } % this was: {postscript}
+
+\definespecial\dostartgraymode#1%
+ {\special{color gray #1}}
+
+\definespecial\dostopgraymode%
+ {\special{color gray 0}}
+
+\definespecial\dostartrgbcolormode#1#2#3%
+ {\special{color rgb #1 #2 #3}}
+
+\definespecial\dostartcmykcolormode#1#2#3#4%
+ {\special{color cmyk #1 #2 #3 #4}}
+
+\definespecial\dostartgraycolormode#1%
+ {\special{color gray #1}}
+
+\definespecial\dostopcolormode%
+ {\special{color gray 0}}
+
+% \definefileinsertion{yy}{eps}%
+% {\PointsToBigPoints\@@DriverImageWidth \width
+% \PointsToBigPoints\@@DriverImageHeight\height
+% \special
+% {psfile=\@@DriverImageFile\space
+% %hscale=100\space
+% %vscale=100\space
+% hoffset=\width\space
+% voffset=\height}}
+
+\definefileinsertion{tr}{eps}
+ {\bgroup
+ \PointsToWholeBigPoints\@@DriverImageWidth \width
+ \PointsToWholeBigPoints\@@DriverImageHeight\height
+ \special
+ {PSfile="\@@DriverImageFile"\space
+ llx=\EPSllx\space
+ lly=\EPSlly\space
+ urx=\EPSurx\space
+ ury=\EPSury\space
+ \ifdim\@@DriverImageWidth >\zeropoint rwi=\width 0\space\fi
+ \ifdim\@@DriverImageHeight>\zeropoint rhi=\height0 \fi}%
+ \egroup}
+
+\definefileinsertion{yy}{mps}
+ {\hbox
+ {\includeMPfonts \@@DriverImageFile
+ \convertMPcolors\@@DriverImageFile
+ \dofileinsertion{yy}{eps}}}
+
+\definefileinsertion{yy}{tif}
+ {\special{insertimage:
+ \@@DriverImageFile \space
+ \@@DriverImageWidth\space
+ \@@DriverImageHeight}}
+
+\definespecial\doinsertfile
+ {\dofileinsertion{yy}\@@DriverImageType}
+
+\def\MPprologues{1}
+\def\MPOSTdriver{dvipsone}
+
+\stopspecials
+
+\endinput
diff --git a/tex/context/base/strc-bkm.lua b/tex/context/base/strc-bkm.lua
new file mode 100644
index 000000000..f34d83ec5
--- /dev/null
+++ b/tex/context/base/strc-bkm.lua
@@ -0,0 +1,131 @@
+if not modules then modules = { } end modules ['strc-bkm'] = {
+ version = 0.200,
+ comment = "companion to strc-bkm.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Future version will support adding arbitrary bookmarks with
+-- associated complex actions (rather trivial to implement).
+
+local format, concat, gsub = string.format, table.concat, string.gsub
+local texsprint, utfvalues = tex.sprint, string.utfvalues
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local lists = structure.lists
+local levelmap = structure.sections.levelmap
+
+structure.bookmarks = structure.bookmarks or { }
+
+local bookmarks = structure.bookmarks
+
+bookmarks.method = "internal" -- or "page"
+
+local names, opened = "", ""
+
+function bookmarks.register(n,o)
+ if names == "" then names = n else names = names .. "," .. n end
+ if opened == "" then opened = o else opened = opened .. "," .. o end
+end
+
+function bookmarks.overload(name,text)
+ local l, ls = lists.tobesaved, nil
+ if #l == 0 then
+ -- no entries
+ elseif name == "" then
+ ls = l[#l]
+ else
+ for i=#l,0,-1 do
+ local li = l[i]
+ local metadata = li.metadata
+ if metadata and not metadata.nolist and metadata.name == name then
+ ls = li
+ break
+ end
+ end
+ end
+ if ls then
+ ls.titledata.bookmark = text
+ end
+end
+
+local function stripped(str) -- kind of generic
+ str = gsub(str,"\\([A-Z]+)","%1") -- \LOGO
+ str = gsub(str,"\\ "," ") -- \
+ str = gsub(str,"\\([A-Za-z]+) *{(.-)}","%1") -- \bla{...}
+ str = gsub(str," +"," ") -- spaces
+ return str
+end
+
+-- todo: collect specs and collect later i.e. multiple places
+
+function bookmarks.place()
+ if names ~= "" then
+ local list = lists.filter(names,"all",nil,lists.collected)
+ local lastlevel = 1
+ if #list > 0 then
+ local opened, levels = aux.settings_to_set(opened), { }
+ for i=1,#list do
+ local li = list[i]
+ local metadata = li.metadata
+ local name = metadata.name
+ if not metadata.nolist then -- and levelmap[name] then
+ local titledata = li.titledata
+ if titledata then
+ local structural = levelmap[name]
+ lastlevel = structural or lastlevel
+ local title = titledata.bookmark
+ if not title or title == "" then
+ if not structural then
+ -- placeholder, todo: bookmarklabel
+ title = name .. ": " .. (titledata.title or "?")
+ else
+ title = titledata.title or "?"
+ end
+ end
+ levels[#levels+1] = {
+ lastlevel,
+ stripped(title),
+ li.references, -- has internal and realpage
+ allopen or opened[name]
+ }
+ end
+ end
+ end
+ backends.codeinjections.addbookmarks(levels,bookmarks.method)
+ end
+ function bookmarks.place() end -- prevent second run
+ end
+end
+
+lpdf.registerdocumentfinalizer(function() structure.bookmarks.place() end,1)
+
+-- bkm
+--~ function nodes.toutf(list)
+--~ local t= { }
+--~ for n in node.traverse(list) do
+--~ local id = n.id
+--~ if id == node.id("glyph") then
+--~ local c = n.char
+--~ local f = fonts.ids[n.font]
+--~ if f then
+--~ local u = f.characters[c].tounicode
+--~ if u then
+--~ for s in string.gmatch(u,"..") do
+--~ t[#t+1] = utf.char(tonumber(s,16))
+--~ end
+--~ else
+--~ t[#t+1] = utf.char(c)
+--~ end
+--~ else
+--~ t[#t+1] = utf.char(c)
+--~ end
+--~ elseif id == node.id("glue") then
+--~ t[#t+1] = " "
+--~ end
+--~ end
+--~ return table.concat(t,"")
+--~ end
+--~ print(nodes.toutf(tex.box[999].list))
diff --git a/tex/context/base/strc-bkm.mkiv b/tex/context/base/strc-bkm.mkiv
new file mode 100644
index 000000000..77854738d
--- /dev/null
+++ b/tex/context/base/strc-bkm.mkiv
@@ -0,0 +1,93 @@
+%D \module
+%D [ file=strc-bkm,
+%D version=2009.04.01,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Bookmarks,
+%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.
+
+%D This might become scrn-bkm.mkiv.
+
+\writestatus{loading}{ConTeXt Structure Macros / Bookmarks}
+
+\registerctxluafile{strc-bkm}{1.001}
+
+\unprotect
+
+%D Due to requests I finally decided to support bookmarks, a
+%D driver dependant way of showing tables of content. The most
+%D simple way of support is hooking bookmark generation into
+%D the existing list mechanisms. That way users can generate
+%D bookmarks automatically, although its entirely valid to add
+%D bookmarks by defining alternative ones. These will be added
+%D at the appropriate place in the list.
+
+% \hoofdstuk{het eerste hoofdstuk}
+%
+% \bookmark {de eerste bookmark} % optional overruled hoofdstuk
+%
+% .... text ....
+%
+% \placebookmarks [hoofdstuk,paragraaf,subparagraaf,subsubparagraaf,mylist]
+% [open list]
+%
+% \bookmark[mylist]{whatever}
+
+%D This will go away.
+
+\let\flushpostponedbookmark\relax
+
+%D We have better ways now.
+
+\unexpanded\def\bookmark
+ {\dosingleempty\dobookmark}
+
+\def\dobookmark[#1]#2%
+ {\begingroup
+ \simplifycommands
+ \ctxlua{structure.bookmarks.overload("#1",\!!bs\detokenize\expandafter{\normalexpanded{#2}}\!!es)}%
+ \endgroup}
+
+%D Placement \unknown\ look how simple compared to \MKII:
+
+\unexpanded\def\placebookmarks
+ {\dodoubleempty\doplacebookmarks}
+
+\def\doplacebookmarks[#1][#2]%
+ {\iflocation
+ \iffirstargument
+ \ctxlua{structure.bookmarks.register("#1","#2")}%
+ \else
+ \normalexpanded{\noexpand\placebookmarks[\getvalue{\??ih\v!content\c!list}]}%
+ \fi
+ \fi}
+
+% \prependtoks\ctxlua{structure.bookmarks.place()}\to\everystoptext % too late
+% \prependtoks\ctxlua{structure.bookmarks.place()}\to\everylastbackendshipout % okay but not nice
+
+\protect \endinput
+
+% \starttext
+% \setupinteraction[state=start]\setupinteractionscreen[option=bookmark]
+% \placebookmarks[chapter,section,subsection][chapter]
+% \chapter{First}
+% \bookmark{The First Indeed}
+% \section{alpha}
+% \bookmark[chapter]{The First Indeed Again}
+% \section{beta}
+% \chapter{Second}
+% \bookmark{The Second Indeed}
+% \section{gamma \tex{radiation}}
+% \subsection{a}
+% \subsection{b}
+% \section{delta}
+% \section{epsilon}
+% \chapter{Third \relax}
+% \chapter{我〈能吞下玻璃而不傷身〉體。} % whatever that means
+% \chapter{Idris Samawi Hamid ادريس سماوي حامد}
+% \stoptext
diff --git a/tex/context/base/strc-blk.lua b/tex/context/base/strc-blk.lua
new file mode 100644
index 000000000..2589190eb
--- /dev/null
+++ b/tex/context/base/strc-blk.lua
@@ -0,0 +1,146 @@
+if not modules then modules = { } end modules ['strc--blk'] = {
+ version = 1.001,
+ comment = "companion to strc-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, gmatch, find = tex.print, string.format, string.gmatch, string.find
+local lpegmatch = lpeg.match
+
+local ctxcatcodes = tex.ctxcatcodes
+
+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()
+ collected, tobesaved = blocks.collected, blocks.tobesaved
+end
+
+job.register('structure.blocks.collected', structure.blocks.tobesaved, initializer)
+
+local printer = (lpeg.patterns.textline/texprint)^0 -- can be shared
+
+function blocks.print(name,data,hide)
+ if hide then
+ texprint(ctxcatcodes,format("\\dostarthiddenblock{%s}",name))
+ else
+ texprint(ctxcatcodes,format("\\dostartnormalblock{%s}",name))
+ end
+ if type(data) == "table" then
+ for i=1,#data do
+ texprint(data[i])
+ end
+ else
+ lpegmatch(printer,data)
+ end
+ if hide then
+ texprint(ctxcatcodes,"\\dostophiddenblock")
+ else
+ texprint(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 gmatch(name,"%s*([^,]+)") do
+ local sn = states[n]
+ if not sn then
+ -- error
+ elseif all then
+ sn.all = state
+ else
+ for _, tag in next, tags do
+ sn[tag] = state
+ end
+ end
+ end
+end
+
+--~ filter_collected(names, criterium, number, collected)
+
+function blocks.select(state,name,tag,criterium)
+ criterium = criterium or "text"
+ if find(tag,"=") 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, collected)
+ for i=1,#result do
+ local ri = result[i]
+ local metadata = ri.metadata
+ if names[metadata.name] then
+ if all then
+ blocks.print(name,ri.data,hide)
+ else
+ local mtags = metadata.tags
+ for tag, sta in next, tags do
+ if mtags[tag] then
+ blocks.print(name,ri.data,hide)
+ break
+ end
+ end
+ end
+ end
+ end
+end
+
+function blocks.save(name,tag,buffer) -- wrong, not yet adapted
+ 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
+ tobesaved[#tobesaved+1] = {
+ metadata = {
+ name = name,
+ tags = tags,
+ plus = plus,
+ minus = minus,
+ },
+ references = {
+ section = structure.sections.currentid(),
+ },
+ data = data or "error",
+ }
+ 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 next, 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
diff --git a/tex/context/base/strc-blk.mkii b/tex/context/base/strc-blk.mkii
new file mode 100644
index 000000000..c4e38a607
--- /dev/null
+++ b/tex/context/base/strc-blk.mkii
@@ -0,0 +1,548 @@
+%D \module
+%D [ file=strc-blk, % split off core-buf.tex
+%D version=2000.01.05,
+%D title=\CONTEXT\ Structure 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.
+
+% investigate etex's \readline and \scantokens
+
+\writestatus{loading}{ConTeXt Structure Macros / Blockmoves}
+
+\unprotect
+
+\def\blockversion {1996.03.10}
+
+\def\@@blockerrormessage
+ {\showmessage\m!textblocks1\empty
+ \global\let\@@blockerrormessage\relax}
+
+\def\thisisblockversion#1%
+ {\doifnot\blockversion{#1}{\@@blockerrormessage\endinput}}
+
+\def\stopcopyingblocks
+ {\ifcopyingblocks
+ \immediate\closeout\outblocks
+ \copyblockfile
+ \global\copyingblocksfalse
+ \fi}
+
+\def\dodosetblockcounters[#1]#2%
+ {\expanded{\setvalue{\??se\s!old#2}{\@@filterheadpart[#1]}}%
+ \doifnot{#2}\lastsection
+ {\expanded{\dodosetblockcounters[\@@filtertailpart[#1]]}%
+ {\getvalue{\??se#2\c!after}}}} % ????
+
+\def\dosetblockcounters[#1]%
+ {\ifblockpermitted
+ \expanded{\dodosetblockcounters[\@@filtersecondpart[#1]]}\firstsection
+ \expanded{\setsectiontype[\@@filterfirstpart[#1]]}%
+ \def\@@sectionvalue##1{\getvalue{\??se\s!old##1}}%
+ \let\@@sectionconversion\secondoftwoarguments
+ \fi}
+
+\let\blockstatus\empty
+
+\def\setblockcounters
+ {\ifx\blockstatus\empty \else
+ \@EA\dosetblockcounters\@EA[\blockstatus]%
+ \fi}
+
+\def\getblockstatus#1%
+ {\dosetfilterlevel{\@@bscriterium}\empty
+ \expanded{\doifblklevelelse[#1\sectionseparator\sectionseparator0]}
+ {\global\blockpermittedtrue}
+ {\global\blockpermittedfalse}%
+ \def\blockstatus{#1}}
+
+\def\setupblockparameters
+ {\dodoubleargument\dosetupblockparameters}
+
+\def\dosetupblockparameters[#1][#2]%
+ {\getparameters[\??tb#1][#2]}
+
+\def\blockparameter#1#2%
+ {\@EA\csname\ifcsname\??tb#1#2\endcsname\??tb#1#2\else\s!empty\fi\endcsname}
+
+\ifx\outblocks\undefined \newwrite\outblocks \fi
+\ifx\inpblocks\undefined \newread \inpblocks \fi
+\ifx\tmpblocks\undefined \newwrite\tmpblocks \fi
+\ifx\blockbox \undefined \newbox \blockbox \fi
+
+\newif\ifcopyingblocks
+\newif\ifblockpermitted
+\newif\iftmpblockstarted
+\newif\ifoldinbijlagen
+\newif\ifdoingblocks
+
+\newcount\blocklevel
+
+\def\setblocklevel#1% sign
+ {\global\advance\blocklevel #11
+ \ifcase\blocklevel\doingblocksfalse\else\doingblockstrue\fi}
+
+\def\opentmpblock
+ {\immediate\openout\tmpblocks\TEXbufferfile{\f!utilityfilename\the\blocklevel}}
+
+\def\closetmpblock
+ {\immediate\write\tmpblocks{}% een lege regel is handig voor \par commando's
+ \immediate\closeout\tmpblocks}
+
+\def\writetmpblock#1%
+ {\iftmpblockstarted
+ \immediate\write\tmpblocks{#1}%
+ \else
+ \doifsomething{#1}
+ {\tmpblockstartedtrue
+ \immediate\write\tmpblocks{\string#1}}%
+ \fi}
+
+\def\startcopyingblocks
+ {\global\copyingblocksfalse}
+
+\def\checkcopyingblocks
+ {\ifcopyingblocks
+ \else
+ \immediate\openout\outblocks\f!utilityfilename.\f!blockextension%
+ \immediate\write\outblocks{\string\thisisblockversion{\blockversion}}%
+ \immediate\write\outblocks{\string\thisissectionseparator{\sectionseparator}}%
+ \global\copyingblockstrue
+ \fi}
+
+\def\stopcopyingblocks
+ {\ifcopyingblocks
+ \immediate\closeout\outblocks
+ \copyblockfile
+ \global\copyingblocksfalse
+ \fi}
+
+\def\nomoreblocks
+ {\stopcopyingblocks}
+
+\def\copyblockfile
+ {\ifcopyingblocks
+ \begingroup
+ \showmessage\m!textblocks2{\jobname.\f!blockextension}%
+ \openlocin\inpblocks{\f!utilityfilename.\f!blockextension}%
+ \immediate\openout\outblocks\jobname.\f!blockextension
+ \setupcopyblock
+ \catcode`\^^M=\@@ignore\relax
+ \def\copynextline
+ {\read\inpblocks to \!!stringa
+ \immediate\write\outblocks{\!!stringa}%
+ \ifeof\inpblocks\else\expandafter\copynextline\fi}%
+ \copynextline
+ \immediate\closein\inpblocks
+ \immediate\closeout\outblocks
+ \immediate\openout\tmpblocks\f!utilityfilename.\f!blockextension
+ \immediate\closeout\tmpblocks
+ \endgroup
+ \fi}
+
+\def\loadallblocks#1%
+ {\beginrestorecatcodes
+ \catcode`\^^M=\@@endofline\relax
+ \readjobfile{#1.\f!blockextension}
+ {\showmessage\m!textblocks3{#1.\f!blockextension}}
+ {\showmessage\m!textblocks4\empty}%
+ \endrestorecatcodes}
+
+\def\setupcopyblock
+ {\setcatcodetable\vrbcatcodes
+ \obeylines}
+
+\def\writeoutblocks
+ {\immediate\write\outblocks}
+
+\long\def\processnextblocklineAB#1% #2#3%
+ {\defconvertedargument\next{#1 }%
+ \doifinstringelse\endofblockA\next
+ \firstoftwoarguments
+ {\doifinstringelse\endofblockB\next
+ \firstoftwoarguments\secondoftwoarguments}}
+
+\bgroup
+\obeylines
+\long\gdef\copyblocklineAB#1
+ {\processnextblocklineAB{#1}\closeblock{\writeoutblocks{#1}\writetmpblock{#1}\copyblocklineAB}}
+\long\gdef\skipblocklineAB#1
+ {\processnextblocklineAB{#1}\closeblock\skipblocklineAB}
+\egroup
+
+\long\def\processnextblockline#1% #2#3%
+ {\defconvertedargument\next{#1 }%
+ \ifx\next\emptybufferline
+ \expandafter\secondoftwoarguments% #3%
+ \else
+ \emptybufferlinefalse
+ \doifinstringelse\endofblock\next
+ {\expandafter\firstoftwoarguments }% #2}
+ {\expandafter\secondoftwoarguments}% #3}%
+ \fi}
+
+\bgroup
+\obeylines
+\long\gdef\copyblockline#1
+ {\processnextblockline{#1}\closeblock{\writeoutblocks{#1}\writetmpblock{#1}\copyblockline}}
+\long\gdef\skipblockline#1
+ {\processnextblockline{#1}\closeblock\skipblockline}
+\egroup
+
+\def\skipblock#1%
+ {\checkcopyingblocks
+ \defconvertedcommand\endofblock{\string\thiswasblock{#1}}% command expands once !
+ \let\openblock\begingroup
+ \let\closeblock\endgroup
+ \openblock
+ \setupcopyblock
+ \skipblockline}
+
+\let\doafterblock \gobbletwoarguments
+\let\dobeforeblock\gobbletwoarguments
+
+\def\thisisblock#1%
+ {\executeifdefined{\s!thisisblock#1}{\skipblock{#1}}}
+
+\def\thiswasblock#1%
+ {\getvalue{\s!thiswasblock#1}}
+
+\def\saveblock#1#2%
+ {\checkcopyingblocks
+ \obeylines
+ \@EA\defconvertedcommand\@EA\endofblockA\@EA{\@EA\string\csname\e!end#1\endcsname}%
+ \defconvertedcommand\endofblockB{\string\endblock[#1]}% % MULTI LINGUAL MAKEN
+ \def\openblock
+ {\dobeforeblock{#1}{#2}%
+ \opentmpblock
+ \begingroup
+ \makesectionformat
+ \immediate\write\outblocks{}%
+ \immediate\write\outblocks{\string\thisisblock{#1}{\sectionformat}[#2]}}%
+ \def\closeblock
+ {\immediate\write\outblocks{}% handig voor \par commando's
+ \immediate\write\outblocks{\string\thiswasblock{#1}}%
+ \endgroup
+ \closetmpblock
+ \doafterblock{#1}{#2}%
+ \egroup}%
+ \openblock
+ \setupcopyblock
+ \copyblocklineAB}
+
+\def\copyblock
+ {\let\opentmpblock\empty
+ \let\closetmpblock\empty
+ \let\writetmpblock\gobbleoneargument
+ \saveblock}
+
+\def\loadoneblock
+ {\edef\blockfilename{\TEXbufferfile{\f!utilityfilename\the\blocklevel}}%
+ \setblocklevel+%
+ \readjobfile\blockfilename\donothing\donothing
+ \setblocklevel-}%
+
+\def\dodefineblock[#1]%
+ {\bypassblock[#1]%
+ \keepblocks[#1]%
+ \setupblock
+ [#1]
+ [\c!before=\blank,
+ \c!after=\blank,
+ \c!inner=,
+ \c!style=,
+ \c!file=\jobname]}
+
+% \def\defineblock
+% {\dosingleargumentwithset\dodefineblock}
+
+\def\defineblock
+ {\dosingleargument\dodefineblock}
+
+\def\dosetupblock[#1][#2]%
+ {\getparameters[\??tb#1][#2]}
+
+\def\setupblock
+ {\dodoubleargumentwithset\dosetupblock}
+
+\def\bypassblock[#1]%
+ {\setvalue{\s!thisisblock#1}##1[##2]{\skipblock{#1}}}
+
+\def\dohideblock[#1][#2][#3]%
+ {\doifassignmentelse{#3}
+ {\dodohideblock[#1][#2][][#3]}
+ {\dodohideblock[#1][#2][#3][]}}
+
+\def\dodohideblock[#1][#2][#3][#4]%
+ {\doifelsenothing{#2}
+ {\global\blockpermittedfalse
+ \edef\blocktitle{#1}}
+ {\doifelsenothing{#3}
+ {\global\blockpermittedtrue
+ \edef\blocktitle{#1}}
+ {\doifcommonelse{#2}{#3}
+ {\global\blockpermittedfalse
+ \edef\blocktitle{#1:#2}}
+ {\global\blockpermittedtrue
+ \edef\blocktitle{#1:#3}}}}%
+ \ifblockpermitted
+ \showwarning\m!textblocks5\blocktitle
+ \def\next
+ {\def\dobeforeblock####1####2%
+ {\begingroup}%
+ \def\doafterblock####1####2%
+ {\endgroup
+ \doexecuteloadedblock{#1}{#4}}%
+ \saveblock{#1}{#3#4}}%
+ \else
+ \doifinsetelse{+}{#3}
+ {\showwarning\m!textblocks6\blocktitle
+ \def\next
+ {\def\dobeforeblock####1####2%
+ {\begingroup
+ \visiblefalse}%
+ \def\doafterblock####1####2%
+ {{\setbox0\vbox
+ {\catcode`\^^M=\@@endofline\relax
+ \loadoneblock
+ \par}}%
+ \endgroup}%
+ \saveblock{#1}{#3#4}}}%
+ {\showwarning\m!textblocks7\blocktitle
+ \def\next
+ {\def\dobeforeblock####1####2%
+ {\begingroup
+ \globaldefs\minusone}%
+ \def\doafterblock####1####2%
+ {\endgroup}%
+ \copyblock{#1}{#3#4}}}%
+ \fi
+ \next}
+
+\def\dohideblocks[#1][#2]%
+ {\def\docommand##1%
+ {\setvalue{\e!begin##1}%
+ {\bgroup\obeylines\dotripleempty\dohideblock[##1][#2]}}%
+ \processcommalist[#1]\docommand}
+
+\def\hideblocks
+ {\dodoubleempty\dohideblocks}
+
+\def\doexecuteloadedblock#1#2%
+ {\blockpermittedtrue % ?
+ \bgroup % before \c!before (think of: \c!before=\startitemize)
+ \dosetupblockparameters[#1][#2]% voor 'voor'?
+ \getvalue{\??tb#1\c!before}%
+ \dostartattributes{\??tb#1}\c!style\c!color\empty
+ \visibletrue
+ \catcode`\^^M=\@@endofline\relax
+ \getvalue{\??tb#1\c!inner}%
+ \ignorespaces
+ \loadoneblock
+ % \par moved
+ \dostopattributes
+ \getvalue{\??tb#1\c!after}%
+ \par
+ \egroup}
+
+\def\dokeepblock[#1][#2][#3]%
+ {\doifassignmentelse{#3}
+ {\dodokeepblock[#1][#2][][#3]}
+ {\dodokeepblock[#1][#2][#3][]}}
+
+\def\dodokeepblock[#1][#2][#3][#4]%
+ {\doifelsenothing{#2}
+ {\global\blockpermittedtrue
+ \edef\blocktitle{#1}}
+ {\doifcommonelse{#2}{#3}
+ {\global\blockpermittedtrue
+ \edef\blocktitle{#1:#2}}
+ {\doifinsetelse\v!all{#2}
+ {\doifelsenothing{#3}
+ {\global\blockpermittedtrue
+ \edef\blocktitle{#1}}
+ {\global\blockpermittedfalse
+ \edef\blocktitle{#1:#3}}}
+ {\global\blockpermittedfalse
+ \doifelsenothing{#3}
+ {\edef\blocktitle{#1}}
+ {\edef\blocktitle{#1:#3}}}}}%
+ \ifblockpermitted
+ \showwarning\m!textblocks8\blocktitle
+ \def\dobeforeblock##1##2%
+ {\begingroup}%
+ \def\doafterblock##1##2%
+ {\endgroup
+ \doexecuteloadedblock{#1}{#4}}%
+ \else
+ \showwarning\m!textblocks9\blocktitle
+ \fi
+ \saveblock{#1}{#3#4}}
+
+\def\dokeepblocks[#1][#2]%
+ {\def\docommand##1%
+ {\setvalue{\e!begin##1}%
+ {\bgroup\obeylines\dotripleempty\dokeepblock[##1][#2]}}%
+ \processcommalist[#1]\docommand}
+
+\def\keepblocks
+ {\dodoubleempty\dokeepblocks}
+
+\newconditional\processblockstatus
+\newconditional\dummyblockstatus
+\newconditional\blockassignmentstatus
+
+\def\dodouseblock#1#2#3#4%
+ {\getblockstatus{#2}%
+ \ifblockpermitted
+ \setfalse\dummyblockstatus
+ \doifassignmentelse{#3}
+ {\settrue \blockassignmentstatus}
+ {\setfalse\blockassignmentstatus}%
+ \doifelsenothing{#4}
+ {\edef\blocktitle{#1}}
+ {\ifconditional\blockassignmentstatus
+ \edef\blocktitle{#1}%
+ \else
+ \doifnotcommon{#3}{#4}
+ {\ifconditional\processblockstatus
+ \settrue\dummyblockstatus
+ \else
+ \global\blockpermittedfalse
+ \fi}%
+ \edef\blocktitle{#1:#3}%
+ \fi}%
+ \else
+ \edef\blocktitle{#1}%
+ \fi
+ \ifblockpermitted
+ \setblocklevel+%
+ \ifconditional\blockassignmentstatus \else
+ \doifinset{-}{#3}{\settrue\dummyblockstatus}%
+ \fi
+ \ifconditional\dummyblockstatus
+ \showwarning\m!textblocks{10}\blocktitle
+ \setvalue{\s!thiswasblock#1}%
+ {\removeunwantedspaces
+ \par
+ \egroup
+ \setblocklevel-}%
+ \def\next
+ {\setbox0\vbox\bgroup
+ \ifconditional\blockassignmentstatus
+ \dosetupblockparameters[#1][#3]%
+ \fi}%
+ \else
+ \showwarning\m!textblocks{11}\blocktitle
+ \setvalue{\s!thiswasblock#1}%
+ {\removeunwantedspaces
+ % \par moved
+ \dostopattributes
+ \getvalue{\??tb#1\c!after}%
+ \par
+ \egroup
+ \setblocklevel-}%
+ \def\next
+ {\bgroup
+ \ifconditional\blockassignmentstatus
+ \dosetupblockparameters[#1][#3]%
+ \fi
+ \getvalue{\??tb#1\c!before}%
+ \dostartattributes{\??tb#1}\c!style\c!color\empty
+ \visibletrue
+ \getvalue{\??tb#1\c!inner}%
+ \ignorespaces}%
+ \fi
+ \else
+ \def\next
+ {\showwarning\m!textblocks{12}\blocktitle
+ \skipblock{#1}}%
+ \fi
+ \next}
+
+\def\douseblock[#1][#2]%
+ {\setvalue{\s!thisisblock#1}##1[##2]{\dodouseblock{#1}{##1}{##2}{#2}}}
+
+\def\dodouseblocks[#1][#2]%
+ {\def\docommand##1%
+ {\douseblock[##1][#2]}%
+ \processcommalist[#1]\docommand
+ \dogetcommalistelement1\from#1\to\commalistelement
+ \doifdefined{\??tb\commalistelement\c!file}
+ {\loadallblocks{\getvalue{\??tb\commalistelement\c!file}}}%
+ \endgroup}
+
+\def\douseblocks
+ {\begingroup
+ \doassign[\??bs][\c!criterium=\v!all]%
+ \dodoubleempty\dodouseblocks}
+
+\def\useblocks
+ {\setfalse\processblockstatus\douseblocks}
+
+\def\processblocks
+ {\settrue \processblockstatus\douseblocks}
+
+\def\doselectblocks[#1][#2][#3]%
+ {\begingroup
+ \doifelsenothing{#3}
+ {\getparameters[\??bs][\c!criterium=\v!all,#2]%
+ \dodouseblocks[#1][]}
+ {\getparameters[\??bs][\c!criterium=\v!all,#3]%
+ \dodouseblocks[#1][#2]}}%
+
+\def\selectblocks
+ {\dotripleempty\doselectblocks}
+
+\def\beginblock[#1]% % we also check \endblock[..]
+ {\getvalue{\e!begin#1}}
+
+\def\forceblocks[#1]%
+ {\def\docommand##1%
+ {\setvalue{\e!begin##1}%
+ {\setblocklevel+\bgroup
+ \dodoubleempty\doforceblock[##1]}%
+ \setvalue{\e!end##1}%
+ {\dostopattributes
+ \getvalue{\??tb##1\c!after}%
+ \egroup\setblocklevel-}}%
+ \processcommalist[#1]\docommand}
+
+\def\doforceblock[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\settrue \blockassignmentstatus}
+ {\setfalse\blockassignmentstatus}%
+ \ifconditional\blockassignmentstatus
+ \dosetupblockparameters[#1][#2]%
+ \fi
+ \getvalue{\??tb#1\c!before}%
+ \dostartattributes{\??tb#1}\c!style\c!color\empty
+ \getvalue{\??tb#1\c!inner}%
+ \ignorespaces}
+
+\def\bypassblocks[#1]%
+ {\def\docommand##1%
+ {\setvalue{\e!begin##1}%
+ {\setblocklevel+\bgroup
+ \obeylines % here, since we look ahead
+ \dodoubleempty\dobypassblock[##1]}%}%
+ \setvalue{\e!end##1}%
+ {}}%
+ \processcommalist[#1]\docommand}
+
+\def\dobypassblock[#1][#2]%
+ {\def\closeblock
+ {\egroup\setblocklevel-}%
+ \checkcopyingblocks
+ \obeylines
+ \@EA\defconvertedcommand\@EA\endofblockA\@EA{\@EA\string\csname\e!end#1\endcsname}%
+ \defconvertedcommand\endofblockB{\string\endblock[#1]} % MULTI LINGUAL MAKEN
+ \setupcopyblock
+ \skipblocklineAB}
+
+\protect \endinput
diff --git a/tex/context/base/strc-blk.mkiv b/tex/context/base/strc-blk.mkiv
new file mode 100644
index 000000000..8aa856840
--- /dev/null
+++ b/tex/context/base/strc-blk.mkiv
@@ -0,0 +1,112 @@
+%D \module
+%D [ file=strc-blk,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Blockmoves,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Blockmoves}
+
+\registerctxluafile{strc-blk}{1.001}
+
+\unprotect
+
+% 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}
+
+\unexpanded\def\setupblockparameters{\dodoubleargument \dosetupblock} % fast one (for compatibility)
+\unexpanded\def\setupblock {\dodoubleargumentwithset\dosetupblock} % handles set
+
+\def\dosetupblock[#1]{\getparameters[\??tb#1]} % [#1][#2]}
+
+\unexpanded\def\defineblock[#1]%
+ {\processcommalist[#1]\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]%
+ {\normalexpanded{\noexpand\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)
+
+% no \endgroups
+
+\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
+ {\bgroup
+ \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")}}%
+ \egroup}
+
+% 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 \endinput
diff --git a/tex/context/base/strc-def.mkiv b/tex/context/base/strc-def.mkiv
new file mode 100644
index 000000000..77793c7eb
--- /dev/null
+++ b/tex/context/base/strc-def.mkiv
@@ -0,0 +1,309 @@
+%D [ file=strc-def,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Definitions}
+
+% \registerctxluafile{strc-def}{1.001}
+
+\unprotect
+
+% \def\installparameterhandler#1#2#3#4#5#6#7#8#9{%
+% \def#3##1{\csname#5{#1#2}##1\endcsname}%
+% \def#4##1{#6{#1#2}##1}%
+% %
+% \def#5##1##2{\ifcsname##1##2\endcsname##1##2\else\expandafter#7\csname##1\s!parent\endcsname##2\fi}%
+% \def#6##1##2{\ifcsname##1##2\endcsname ##1\else\expandafter#8\csname##1\s!parent\endcsname##2\fi}%
+% %
+% \def#7##1##2{\ifx##1\relax\s!empty\else#5##1##2\fi}%
+% \def#8##1##2{\ifx##1\relax \else#6##1##2\fi}%
+% %
+% \def#9##1##2% style color
+% {\edef\fontattributehash {#4##1}%
+% \edef\colorattributehash{#4##2}%
+% \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash ##1\fi
+% \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash##2\fi}%
+% %
+% }
+
+% \installparameterhandler
+% \empty
+% \@@framed
+% \framedparameter
+% \framedparameterhash
+% \doframedparameter
+% \doframedparameterhash
+% \doframedparentparameter
+% \doframedparentparameterhash
+% \dosetframedattributes
+
+
+% \setupheads
+
+\setupstructureheads[%
+ %\c!after=,
+ %\c!align=,
+ %\c!aligntitle=,
+ \c!alternative=\v!normal,
+ %\c!before=,
+ %\c!color=,
+ \c!command=\normalplacehead,
+ \c!continue=\v!yes,
+ %\c!coupling=,
+ %\c!deepnumbercommand=,
+ %\c!deeptextcommand=,
+ %\c!default=,
+ \c!distance=\!!zeropoint,
+ \c!expansion=\v!no,
+ %\c!file=,
+ %\c!footer=,
+ %\c!grid=,
+ \c!hang=\v!none,
+ %\c!header=,
+ \c!incrementnumber=\v!yes,
+ \c!indentnext=\v!no,
+ %\c!label=,
+ \c!limittext=\v!yes,
+ \c!margin=\zeropoint,
+ %\c!margintext=,
+ \c!number=\v!yes,
+ \c!numbercolor=\structureheadparameter\c!color,
+ \c!textcolor=\structureheadparameter\c!color,
+ \c!numberstyle=\structureheadparameter\c!style,
+ \c!textstyle=\structureheadparameter\c!style,
+ %\c!numbercommand=,
+ %\c!textcommand=,
+ \c!ownnumber=\v!no,
+ %\c!page=,
+ \c!placehead=\v!yes,
+ \c!sectionconversionset=\s!default,
+ \c!sectionnumber=\v!yes,
+ %\c!sectionsegments=,
+ \c!sectionseparatorset=\s!default,
+ \c!sectionset=\v!all,
+ \c!interlinespace=,
+ %\c!sectionstopper=,
+ %\c!sectionstarter=,
+ %\c!strut=,
+ %\c!style=,
+ %\c!text=,
+ %\c!tolerance=
+ ]
+
+% \setupstructureblock[appendix][sectionconversionset=appendix]
+% \setupstructurehead[chapter][sectionconversionset=\structureblockparameter\c!sectionconversionset] % \structureblockparameter]
+
+% \definestructureresetset[default][0,1,1,0][1] % this will not reset parts and subsections
+% \setuphead[part][sectionresetset=default]
+% \starttext
+% \placelist[chapter,section,subsection][criterium=all,width=3cm]
+% \part{first} \chapter{alpha} \section{a} \section{b} \subsection{x} \subsection{y} \chapter{beta}
+% \part{second} \chapter{gamma} \section{a} \section{b} \subsection{x} \subsection{y} \chapter{delta}
+% \stoptext
+
+\definestructureseparatorset [\s!default] [] [.]
+\definestructureconversionset [\s!default] [] [numbers]
+\definestructureresetset [\s!default] [] [1] % each level
+\definestructureprefixset [\s!default] [section-1,section-2,section-3] []
+
+\definestructureprefixset [\v!all] [section-1,section-2,section-3,section-4,section-5,section-6,section-7,section-8] []
+\definestructureprefixset [\v!none] [] []
+
+\definestructureprefixset [\v!part] [section-1] []
+\definestructureprefixset [\v!chapter] [section-2] []
+
+\definestructureseparatorset [\v!appendix:\s!default] [] [.]
+\definestructureconversionset [\v!appendix:\s!default] [Romannumerals,Characters] [numbers]
+\definestructureresetset [\v!appendix:\s!default] [] [1] % why was this 0
+
+% \definesectionblock
+
+\definestructureblock [\v!frontpart] [\v!frontmatter] [\c!number=\v!no]
+\definestructureblock [\v!bodypart] [\v!bodymatter] [\c!number=\v!yes]
+\definestructureblock [\v!appendix] [\v!appendices] [\c!number=\v!yes]
+\definestructureblock [\v!backpart] [\v!backmatter] [\c!number=\v!no]
+
+\setstructureblock [\v!bodypart] % default
+
+\appendtoks
+ \setstructureblock [\v!bodypart]% default
+\to \everyjob
+
+% \definesection
+
+\definestructuresection[\s!section-1] % part
+\definestructuresection[\s!section-2] % chapter
+\definestructuresection[\s!section-3] % section
+\definestructuresection[\s!section-4] % subsection
+\definestructuresection[\s!section-5] % subsubsection
+\definestructuresection[\s!section-6] % subsubsubsection
+\definestructuresection[\s!section-7] % subsubsubsubsection
+
+% \definehead
+
+\definestructurehead
+ [\v!part]
+ [\c!section=\s!section-1]
+
+\definestructurehead
+ [\v!chapter]
+ [\c!section=\s!section-2]
+
+\definestructurehead
+ [\v!section]
+ [\c!section=\s!section-3]
+
+\definestructurehead
+ [\v!subsection]
+ [\c!section=\s!section-4,
+ \c!default=\v!section]
+
+\definestructurehead
+ [\v!subsubsection]
+ [\c!section=\s!section-5,
+ \c!default=\v!subsection]
+
+\definestructurehead
+ [\v!subsubsubsection]
+ [\c!section=\s!section-6,
+ \c!default=\v!subsubsection]
+
+\definestructurehead
+ [\v!subsubsubsubsection]
+ [\c!section=\s!section-7,
+ \c!default=\v!subsubsubsection]
+
+\definestructurehead
+ [\v!title]
+ [\c!coupling=\v!chapter,
+ \c!default=\v!chapter,
+ \c!incrementnumber=\v!no]
+
+\definestructurehead
+ [\v!subject]
+ [\c!coupling=\v!section,
+ \c!default=\v!section,
+ \c!incrementnumber=\v!no]
+
+\definestructurehead
+ [\v!subsubject]
+ [\c!coupling=\v!subsection,
+ \c!default=\v!subsection,
+ \c!incrementnumber=\v!no]
+
+\definestructurehead
+ [\v!subsubsubject]
+ [\c!coupling=\v!subsubsection,
+ \c!default=\v!subsubsection,
+ \c!incrementnumber=\v!no]
+
+\definestructurehead
+ [\v!subsubsubsubject]
+ [\c!coupling=\v!subsubsubsection,
+ \c!default=\v!subsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definestructurehead
+ [\v!subsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsection,
+ \c!default=\v!subsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\setupstructurehead
+ [\v!part]
+ [\c!placehead=\v!no]
+
+\setupstructurehead
+ [\v!chapter]
+ [\v!appendix\c!label=\v!appendix,
+ \v!bodypart\c!label=\v!chapter] % bijlageconversie=\Character
+
+\setupstructurehead
+ [\v!section]
+ [\v!appendix\c!label=\v!section,
+ \v!bodypart\c!label=\v!section] % bijlageconversie=\Character
+
+\setupstructurehead
+ [\v!subsection]
+ [\v!appendix\c!label=\v!subsection,
+ \v!bodypart\c!label=\v!subsection] % bijlageconversie=\Character
+
+\setupstructurehead
+ [\v!subsubsection]
+ [\v!appendix\c!label=\v!subsubsection,
+ \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character
+
+% \setuphead
+
+\setupstructurehead
+ [\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]}]
+
+\setupstructurehead
+ [\v!section]
+ [%\c!align=,
+ %\c!indentnext=\v!no,
+ \c!style=\tfa,
+ \c!distance=.75em,
+ \c!before={\blank[2*\v!big]},
+ \c!after=\blank]
+
+\setupstructurehead % nieuw
+ [\v!subsection]
+ [\c!page=]
+
+% brrr
+
+% \definestructurecounter[\v!page][\c!start=1] % todo: setup
+
+% lists
+
+\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[\v!preference,\v!big]}, % sort of mkii compatible, watch columns
+ \c!after=\blank,
+ \c!label=\v!yes,
+ \c!distance=1em]
+
+\setuplist
+ [\v!chapter]
+ [\c!before={\blank[\v!preference,\v!big]}, % sort of mkii compatible, watch columns
+ \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]
+
+\protect \endinput
diff --git a/tex/context/base/strc-des.lua b/tex/context/base/strc-des.lua
new file mode 100644
index 000000000..ee5fe702b
--- /dev/null
+++ b/tex/context/base/strc-des.lua
@@ -0,0 +1,9 @@
+if not modules then modules = { } end modules ['strc-des'] = {
+ version = 1.001,
+ comment = "companion to strc-des.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- empty
diff --git a/tex/context/base/strc-des.mkii b/tex/context/base/strc-des.mkii
new file mode 100644
index 000000000..0c34e9ef9
--- /dev/null
+++ b/tex/context/base/strc-des.mkii
@@ -0,0 +1,921 @@
+%D \module
+%D [ file=strc-des,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Descriptions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Descriptions}
+
+%D In order to be more flexible with theorems Aditya Mahajan added
+%D support for titles and endsymbols. At the same time we some more
+%D flexible support for inheriting numbers was added.
+
+%D \startbuffer
+%D \defineenumeration[one]
+%D \defineenumeration[two] [one]
+%D \defineenumeration[three] [number=one,style=slanted]
+%D \defineenumeration[four] [three]
+%D \defineenumeration[five] [three] [number=five]
+%D
+%D \startone test test 1 \stopone
+%D \starttwo test test 2 \stoptwo
+%D \startthree test test 3 \stopthree
+%D \startfour test test 4 \stopfour
+%D \startfive test test 1 \stopfive
+%D \stopbuffer
+%D
+%D \typebuffer \start \getbuffer \stop
+
+\unprotect
+
+% Dit kan en moet dus anders:
+%
+% \start... : \vbox\bgroup
+% \stop... : \egroup
+% llap enz.
+% geen indent!
+%
+% enz. enz.
+%
+% Op die manier is meer mogelijk en worden \par's geskipt.
+%
+% De macro \??dd#1\s!do\c!commando levert de koppeling tussen
+% \doornumberen en \doordefinieren. Deze constructie is nodig
+% omdat doornummeren geen argument heeft en omdat subnummers
+% niet worden genest binnen het hogere niveau.
+%
+% herimplementeren met \nextbox en \unhbox\unvbox
+
+% list and titles are experiental
+%
+% \definedescription[test] [location=left,hang=4,headalign={right},distance=1em,list=test]
+% \defineenumeration[lemma][title=yes,right=:,textdistance=1em, location=top, titlestyle=\bs,list=lemma]
+% \defineenumeration[ammel][title=yes,right=:,textdistance=.5em,location=left,titlestyle=\it,width=9em]
+%
+% \placelist[enumeration:lemma]
+% \placelist[description:test][width=0pt]
+%
+% \starttest {something something something} \input zapf \stoptest
+% \startlemma {with a title of a certain length} \input tufte \stoplemma
+% \startammel {with a title} \input zapf \stopammel
+%
+% \defineenumeration[lemma][...]
+% \defineenumeration[titledlemma][lemma][title=yes,right=:,text=lemma,list=lemma]
+
+\newbox\@@descriptionbox
+
+\def\descriptionparameter#1{\csname\??dd\currentdescription#1\endcsname}
+
+\def\@@descriptionhandler{\descriptionparameter{\s!do\c!command}}
+
+% \def\normal@@descriptionhandler[#1]#2#3%
+% {\doattributes
+% {\??dd\currentdescription}\c!headstyle\c!headcolor
+% {\descriptionparameter\c!command{#3}}% NAAR BUITENSTE NIVEAU !
+% \rawreference\s!def{#1}{#2}} % brrr moet in #4
+
+\def\normal@@descriptionhandler[#1]#2#3%
+ {\doattributes
+ {\??dd\currentdescription}\c!headstyle\c!headcolor
+ {\descriptionparameter\c!command{#3}}% NAAR BUITENSTE NIVEAU !
+ \doifsomething{\descriptionparameter\c!list}
+ {\dowritetolist
+ {\descriptionparameter\c!type:\descriptionparameter\c!list}
+ {}{#2}{\currentdescription}}%
+ % 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}
+
+\setvalue{@@description\v!right}%
+ {\@@descriptionhang\@@descriptionrightpure\@@descriptionrighthang}
+
+\def\@@descriptionhang#1#2%
+ {\processaction
+ [\descriptionparameter\c!hang]
+ [ \v!none=>\let\next#1,%
+ 0=>\let\next#1,%
+ \s!unknown=>\let\next#2,%
+ \s!default=>\let\next#1]%
+ \next}
+
+\def\@@descriptionleftpure[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
+ \noindent\ignorespaces
+ \leftskip\@@leftdescriptionskip
+ \rightskip\@@rightdescriptionskip
+ \advance\leftskip \!!widtha
+ \@@makedescriptionpurebox\raggedright
+ \advance\leftskip \!!widthb
+ \llap
+ {\hbox to \leftskip
+ {\hskip\@@leftdescriptionskip
+ \copy\@@descriptionbox\hss}}%
+ \@@dodescription}
+
+\def\@@descriptionrightpure[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
+ \noindent\ignorespaces
+ \leftskip\@@leftdescriptionskip
+ \rightskip\@@rightdescriptionskip
+ \advance\rightskip \!!widtha
+ \@@makedescriptionpurebox\raggedleft
+ \rlap
+ {\hskip\hsize
+ \hskip-\leftskip
+ \hskip-\rightskip
+ \copy\@@descriptionbox
+ \hskip\@@rightdescriptionskip}%
+ \advance\rightskip \!!widthb
+ \@@dodescription}
+
+\def\@@makedescriptionpurebox#1%
+ {\setbox\@@descriptionbox\vtop
+ {\dontcomplain
+ \hsize\!!widtha
+ \leftskip\zeropoint
+ \rightskip\zeropoint
+ #1\setupalign[\descriptionparameter\c!align]%
+ \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox}%
+ \ht\@@descriptionbox\strutht
+ \dp\@@descriptionbox\strutdp}
+
+\def\@@descriptionlefthang[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
+ \dontcomplain
+ \advance\!!widtha \!!widthb
+ \hangindent\!!widtha
+ \@@makedescriptionhangbox\raggedright{\advance\rightskip \!!widthb}%
+ \noindent\ignorespaces
+ \llap
+ {\dontshowcomposition
+ \vtop to \zeropoint{\box\@@descriptionbox}}%
+ \@@dodescription}
+
+\def\@@descriptionrighthang[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
+ \dontcomplain
+ \advance\!!widtha \!!widthb
+ \hangindent-\!!widtha
+ \@@makedescriptionhangbox\raggedleft{\advance\leftskip \!!widthb}%
+ \noindent\ignorespaces
+ \rlap
+ {\dontcomplain
+ \dontshowcomposition
+ \scratchdimen\hsize
+ \advance\scratchdimen -\leftskip
+ \advance\scratchdimen -\rightskip
+ \hbox to \scratchdimen
+ {\hss\vtop to \zeropoint{\box\@@descriptionbox}}}%
+ \@@dodescription}
+
+\def\@@makedescriptionhangbox#1#2%
+ {\setbox\@@descriptionbox\vtop % \vbox gaat fout in hang
+ {\forgetall
+ \dontcomplain
+ \hsize\!!widtha
+ #1\setupalign[\descriptionparameter\c!align]#2%
+ \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox}%
+ \ht\@@descriptionbox\strutht
+ \dp\@@descriptionbox\strutdp
+ \doifsomething{\descriptionparameter\c!hang}
+ {\doifinsetelse{\descriptionparameter\c!hang}{\v!fit,\v!broad}
+ {\scratchdimen\ht\@@descriptionbox
+ \advance\scratchdimen \dp\@@descriptionbox
+ \doif{\descriptionparameter\c!hang}\v!broad
+ {\advance\scratchdimen .5\strutht}%
+ \getnoflines\scratchdimen
+ \hangafter-\noflines}
+ {\hangafter-\descriptionparameter\c!hang}}}
+
+\setvalue{@@description\v!top}[#1]#2%
+ {%\page[\v!preference]% % Weg ermee!
+ %\dosomebreak{\goodbreak}% % Dit is beter en nodig!
+ \dohandlepagebreakX\plusone % En dit moet het maar worden.
+ \@@dostartdescription[#1]{\let\\=\space}{#2}%
+ \noindent\ignorespaces
+ \copy\@@descriptionbox\par
+ \nobreak
+ \descriptionparameter\c!inbetween
+ \nobreak
+ \@@dodescription}
+
+\def\do@@description#1[#2]#3%
+ {\@@dostartdescription[#2]{\def\\{\crlf}}{#3}%
+ \noindent\ignorespaces % not needed this ignore
+ #1{\ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox}%
+ \@@dodescription}
+
+\setvalue{@@description\v!inmargin }{\do@@description\inmargin}
+\setvalue{@@description\v!inleft }{\do@@description\inleft }
+\setvalue{@@description\v!inright }{\do@@description\inright }
+\setvalue{@@description\v!margin }{\do@@description\inmargin}
+\setvalue{@@description\v!leftmargin }{\do@@description\inleft }
+\setvalue{@@description\v!rightmargin }{\do@@description\inright }
+\setvalue{@@description\v!innermargin }{\do@@description\ininner }
+\setvalue{@@description\v!outermargin }{\do@@description\inouter }
+
+\setvalue{@@description\v!serried\v!fit}[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
+ \noindent\ignorespaces
+ \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox
+ \hskip\!!widthb % toegevoegd
+ \@@dodescription}
+
+\setvalue{@@description\v!serried\v!broad}[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
+ \noindent\ignorespaces
+ \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox
+ \hskip\!!widthb \!!plus .5\!!widthb \!!minus .25\!!widthb
+ \@@dodescription}
+
+\setvalue{@@description\v!serried\v!wide}[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
+ \noindent\ignorespaces
+ \hbox to \!!widtha
+ {\ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox\hss}%
+ \hskip\!!widthb
+ \ignorespaces
+ \@@dodescription}
+
+\setvalue{@@description\v!serried}[#1]#2%
+ {\processaction
+ [\descriptionparameter\c!width]
+ [ \v!fit=>\let\next\v!fit,
+ \v!broad=>\let\next\v!broad,
+ \s!unknown=>\let\next\v!wide,
+ \s!default=>\let\next\v!broad]%
+ \getvalue{@@description\v!serried\next}[#1]{#2}}
+
+\setvalue{@@description\v!hanging}[#1]#2%
+ {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}% % adds \c!margin to \leftskip
+ \noindent\ignorespaces
+ \advance\leftskip -\leftskipadaption \relax
+ \ifdim\leftskipadaption=\zeropoint
+ \leftskipadaption1.5em % just some default
+ \ifnum\nesteddescriptionstate=\plusone
+ \ifdim\leftskip>\zeropoint \relax
+ \leftskipadaption\leftskip
+ \fi
+ \fi
+ \fi
+ \ifnum\nesteddescriptionstate>\zerocount % was \ifnum\nesteddescriptionstate=\plusone
+ \advance\leftskip \leftskipadaption % but we're already further on
+ \fi
+ \hskip-\leftskipadaption
+ \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox
+ \kern\ifdim\!!widthb=\zeropoint .75em\else\!!widthb\fi
+ \ignorespaces
+ \@@dodescription}
+
+%D A bonus definition
+%D
+%D \starttyping
+%D \setupfootnotedefinition[location=command,headcommand=\llap]
+%D \stoptyping
+
+\setvalue{@@description\v!command}#1%
+ {\do@@description{\executeifdefined{\??dd#1\c!headcommand}\framed}{#1}}
+
+%D A new key 'headalign' in definitions.
+
+\def\resetdescriptions % to be used in e.g. footnotes
+ {\chardef\nesteddescriptionstate\zerocount}
+
+\resetdescriptions
+
+\let\@@leftdescriptionskip \!!zeropoint
+\let\@@rightdescriptionskip\!!zeropoint
+
+\def\@@dostartdescription[#1]#2#3%
+ {\descriptionparameter\c!before
+ \begingroup
+ \doadaptleftskip{\descriptionparameter\c!margin}%
+ \showcomposition
+ \!!widthb\descriptionparameter\c!distance\relax
+ \ifdim\!!widthb=\zeropoint\relax
+ \doif{\descriptionparameter\c!width}\v!broad{\!!widthb=1em}%
+ \fi
+ % temp hack, we need to avoid this kind of preprocessing
+ \setbox\@@descriptionbox\hbox % preroll
+ {\forgetall
+ \trialtypesettingtrue
+ \dontcomplain
+ #2% sets \\ to space or \crlf
+ \@@descriptionhandler[#1]{#3}{\begstrut\descriptionparameter\c!text\ignorespaces#3\endstrut}}%
+ % so far
+ \assignwidth
+ \!!widtha
+ {\descriptionparameter\c!width}%
+ {\doifelsenothing{\descriptionparameter\c!sample}%
+ {% preroll can move here (test first)
+ \ifhbox\@@descriptionbox\unhcopy\else\copy\fi \@@descriptionbox}%
+ {\@@descriptionhandler[#1]{#3}{\descriptionparameter\c!text\descriptionparameter\c!sample}}}
+ \!!widthb
+ \setbox\@@descriptionbox\hbox
+ {\forgetall
+ \dontcomplain
+ #2% sets \\ to space or \crlf
+ \doifelse{\descriptionparameter\c!location}\v!serried
+ {\@@descriptionhandler[#1]{#3}{\begstrut\descriptionparameter\c!text#3\endstrut}}
+ {\@@descriptionhandler[#1]{#3}{\vtop{\hsize\!!widtha\advance\hsize-\!!widthb
+ \begstrut\descriptionparameter\c!text\ignorespaces#3\endstrut}}}}%
+ \doifelse{\descriptionparameter\c!aligntitle}\v!no
+ {\edef\@@leftdescriptionskip {\the\leftskip }%
+ \edef\@@rightdescriptionskip{\the\rightskip}}
+ {\ifcase\nesteddescriptionstate
+ \edef\@@leftdescriptionskip {\the\leftskip }%
+ \edef\@@rightdescriptionskip{\the\rightskip}%
+ \fi}%
+ \expanded{\indenting[\descriptionparameter\c!indenting]}%
+ % better a system mode
+ \ifcase\nesteddescriptionstate
+ \chardef\nesteddescriptionstate\plusone
+ \or
+ \chardef\nesteddescriptionstate\plustwo
+ \fi% now happens elsewhere : \noindent\ignorespaces
+ \@@resetdescriptionclosesymbol}
+
+\def\@@stopdescription#1%
+ {\def\currentdescription{#1}%
+ \@@placedescriptionclosesymbol
+ % was \par \dostopattributes % here, else problems with interlinespace and font change
+ \dostopparbasedattributes % == \settrue\parbasedattributes \dostopattributes
+ \endgroup
+ \descriptionparameter\c!after %hm, which currentdescription?
+ \egroup % temporary hack
+ \def\currentdescription{#1}%
+ \dochecknextindentation{\??dd\currentdescription}%
+ \dorechecknextindentation}
+
+\def\@@dodescription
+ {\dostartattributes{\??dd\currentdescription}\c!style\c!color\empty
+ \ignorespaces}
+
+% starters:
+
+\def\@@startdescription[#1][#2]%
+ {\def\currentdescription{#1}%
+ \doifelse{\descriptionparameter\c!title}\v!yes
+ % {\dowithwargument{\@@startsomedescription{#1}[#2]}} % patched for theorems
+ {\permitspacesbetweengroups
+ \dodoublegroupempty{\@@startsomedescription{#1}[#2]}}
+ {\@@startsomedescription{#1}[#2]{}}}
+
+\def\@@description[#1][#2]%
+ {\def\currentdescription{#1}%
+ \doifelse{\descriptionparameter\c!title}\v!yes
+ % {\dowithwargument{\@@somedescription{#1}[#2]}} % patched for theorems
+ {\permitspacesbetweengroups
+ \dodoublegroupempty{\@@somedescription{#1}[#2]}}
+ {\@@somedescription{#1}[#2]{}}}
+
+% these call:
+
+\def\@@somedescription#1[#2]#3%
+ {\dowithpar
+ {\bgroup\@@makedescription{#1}[#2]{#3}}%
+ {\@@stopdescription{#1}}}
+
+\def\@@startsomedescription#1[#2]#3%
+ {\bgroup % temporary hack
+ \BeforePar{\@@makedescription{#1}[#2]{#3}}%
+ \GotoPar}
+
+% which calls:
+
+\def\@@makedescription#1%
+ {\postponenotes % new, assumes grouping
+ \def\currentdescription{#1}%
+ \executeifdefined
+ {@@description\descriptionparameter\c!location}
+ {\getvalue{@@description\v!left}}}
+
+% \def\@@makedescription#1%
+% {\def\currentdescription{#1}%
+% \ifundefined{@@description\descriptionparameter\c!location}%
+% \letvalue{\??dd#1\c!location}\v!left
+% \fi
+% \getvalue{@@description\descriptionparameter\c!location}}
+
+% definitions
+
+\def\setupdescriptions
+ {\dodoubleempty\dosetupdescriptions}
+
+\def\dosetupdescriptions[#1][#2]% % beter: \iffirstargument
+ {\ConvertToConstant\doifelse{#2}{}
+ {\dodosetupdescriptions[][#1]}
+ {\dodoubleargumentwithset\dodosetupdescriptions[#1][#2]}}
+
+\def\dodosetupdescriptions[#1]% [#2]%
+ {\getparameters[\??dd#1]} % [#2]}
+
+\def\dodefinedescription[#1][#2]%
+ {\copyparameters[\??dd#1][\??dd]
+ [\c!location,\c!headstyle,\c!style,\c!color,\c!headcolor,\c!title,
+ \c!width,\c!hang,\c!sample,\c!before,\c!inbetween,\c!after,\c!margin,
+ \c!indenting,\c!indentnext,\c!align,\c!text,\c!distance,\c!titledistance,\c!command,
+ \c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]%
+ \getparameters[\??dd#1]
+ [\c!title=\v!yes,\s!do\c!command=\normal@@descriptionhandler,
+ \c!type=\v!description,\c!list=,\c!listtext=,
+ \c!level=,#2]%AM?? Why do we have title=yes here?
+ %\doifvalue{\??dd#1\c!location}\v!top{\doassign[\??dd#1][\c!inbetween=\blank]}%
+ \doifvalue{\??dd#1\c!location}\v!top % we actually need more granularity
+ {\doifnotvalue{\??dd#1\c!inbetween}{\doassign[\??dd#1][\c!inbetween=\blank]}}%
+ \doifvaluesomething{\??dd#1\c!list}
+ {\definelist[\getvalue{\??dd#1\c!type}:\getvalue{\??dd#1\c!list}]}% new
+ \setvalue {#1}{\dodoubleempty\@@description[#1]}%
+ \setvalue{\e!start#1}{\dodoubleempty\@@startdescription[#1]}%
+ \setvalue{\e!stop #1}{\@@stopdescription{#1}}}
+
+\def\definedescription
+ {\dodoubleemptywithset\dodefinedescription}
+
+\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
+
+\def\special@@descriptionhandler[#1]#2#3%
+ {\strut
+ \doifelse{\descriptionparameter\c!number}\v!no
+ \!!doneafalse{\doifelse{#1}{-}\!!doneafalse\!!doneatrue}%
+ \chardef\descriptioncoupling\zerocount
+ \iflocation
+ \doifsomething{\descriptionparameter\c!coupling}
+ {\processaction % genereert > of <
+ [\descriptionparameter\c!couplingway]
+ [ \v!local=>\chardef\descriptioncoupling\plusone, % old: default
+ \v!global=>\chardef\descriptioncoupling\plustwo]}% new: global crosslinking
+ \fi
+ \setupnumber % the number is called indirectly
+ [\currentdescriptionnumber]
+ [\c!sectionnumber=\descriptionparameter\c!sectionnumber]%
+ \if!!donea
+ \makeprecedingsectionnumber[\currentdescriptionnumber]%
+ \prepareprefixnumber{\??dd\currentdescription}\precedingsectionnumber\preparednumber
+ \iftrialtypesetting\startlocal\fi
+ \getvalue{\e!next\currentdescription}% tricky but we need the preroll
+ \iftrialtypesetting\stoplocal\fi
+ % \getvalue{\e!next#2#1}%
+ \iflocation
+ \bgroup
+ \letvalue{\??dd\currentdescription\c!sectionnumber}\v!yes
+ \protectconversion
+ \makeprecedingsectionnumber[\currentdescriptionnumber]%
+ \prepareprefixnumber{\??dd\currentdescription}\precedingsectionnumber\preparednumber
+ \ifcase\descriptioncoupling \or
+ \xdef\@@internalenumber{\doshowdnnumber}%
+ \rawreference\s!num{#1:\@@internalenumber}{}%
+ \or
+ \xdef\@@internalenumber{\countervalue{\??dd\c!coupling\currentdescription}}%
+ \rawreference\s!num{\currentdescription:\@@internalenumber}{}%
+ \fi
+ \egroup
+ \fi
+ %\makeprecedingsectionnumber[\currentdescriptionnumber]%
+ %\prepareprefixnumber{\??dd\currentdescription}\precedingsectionnumber\preparednumber
+ \disablepseudocaps % sorry, uppercase causes troubles
+ \doattributes % \nocase primitive needed
+ {\??dd\currentdescription}\c!headstyle\c!headcolor % todo: sub as well
+ {\descriptionparameter\c!command
+ {\showdntext
+ \descriptionparameter\c!left
+ \strut\doshowdnnumber
+ \showdntitle{#2}%
+ \descriptionparameter\c!stopper
+ \descriptionparameter\c!right}}%
+ \doifsomething{\descriptionparameter\c!list}
+ {\dowritetolist
+ {\descriptionparameter\c!type:\descriptionparameter\c!list}
+ {\showdnlisttext\doshowdnnumber}{#2}{\currentdescription}}%
+ \iflocation\ifcase\descriptioncoupling \else
+ \edef\localconnection{\descriptionparameter\c!coupling:\@@internalenumber}%
+ \doifreferencefoundelse\localconnection
+ {\in[\localconnection]}\donothing % genereert > of <
+ \fi\fi
+ \doifnot{#1}{-}{\rawreference\s!num{#1}{{\doshowdnnumber}{#2}}}%
+ \else
+ \doattributes{\??dd\currentdescription}\c!headstyle\c!headcolor
+ {\descriptionparameter\c!command
+ {\showdnpuretext
+ \descriptionparameter\c!left
+ \showdntitle{#2}%
+ \descriptionparameter\c!stopper
+ \descriptionparameter\c!right}}%
+ \doifnot{#1}{-}{\rawreference\s!num{#1}{{}{#2}}}%
+ \fi}
+
+\def\showdntitle#1%
+ {\doif{\descriptionparameter\c!title}\v!yes % new, for david antos
+ {\doifsomething{#1}
+ {\doattributes{\??dd\currentdescription}\c!titlestyle\c!titlecolor
+ {\hskip\descriptionparameter\c!titledistance
+ \descriptionparameter\c!titlecommand
+ {\descriptionparameter\c!titleleft
+ \begstrut#1\endstrut
+ \descriptionparameter\c!titleright}}}}}
+
+
+\def\showdnpuretext
+ {\strut\descriptionparameter\c!text} % geen spatie
+
+\def\showdnlisttext
+ {\descriptionparameter\c!listtext} % space in default
+
+\def\showdntext
+ {\doifelsenothing{\descriptionparameter\c!text}
+ {\ignorespaces}
+ {\strut
+ \descriptionparameter\c!text
+ \removeunwantedspaces\fixedspace}}
+
+\def\doshowdnnumber
+ {\getvalue{showdn\descriptionparameter\c!level\c!number}}
+
+% maybe recursive until end condition undefined
+
+\setvalue{showdn\c!number}%
+ {\preparednumber
+ \convertednumber[\currentdescriptionnumber]}
+
+\setvalue{showdn\v!sub\c!number}%
+ {\getvalue{showdn\c!number}%
+ \spr{\descriptionparameter\c!separator}%
+ \convertednumber[\v!sub\currentdescriptionnumber]}
+
+\setvalue{showdn\v!sub\v!sub\c!number}%
+ {\getvalue{showdn\v!sub\c!number}%
+ \spr{\descriptionparameter\c!separator}%
+ \convertednumber[\v!sub\v!sub\currentdescriptionnumber]}
+
+\setvalue{showdn\v!sub\v!sub\v!sub\c!number}%
+ {\getvalue{showdn\v!sub\v!sub\c!number}%
+ \spr{\descriptionparameter\c!separator}%
+ \convertednumber[\v!sub\v!sub\v!sub\currentdescriptionnumber]}
+
+\def\domakednnumber
+ {\descriptionparameter\c!left
+ \strut\doshowdnnumber
+ \descriptionparameter\c!stopper
+ \descriptionparameter\c!right}
+
+\setvalue{\??dd\s!set\v!sub\s!sub\s!sub\c!number}#1%
+ {\edef\@@descriptionnumber{\directcurrentdescriptionnumber{#1}}%
+ \setnumber[\v!sub\v!sub\v!sub\@@descriptionnumber]}
+
+\setvalue{\??dd\s!set\v!sub\s!sub\c!number}#1%
+ {\getvalue{\??dd\s!reset\v!sub\v!sub\v!sub\c!number}{#1}%
+ \setnumber[\v!sub\v!sub\@@descriptionnumber]}
+
+\setvalue{\??dd\s!set\v!sub\c!number}#1%
+ {\getvalue{\??dd\s!reset\v!sub\v!sub\c!number}{#1}%
+ \setnumber[\v!sub\@@descriptionnumber]}
+
+\setvalue{\??dd\s!set\c!number}#1%
+ {\getvalue{\??dd\s!reset\v!sub\c!number}{#1}%
+ \setnumber[\@@descriptionnumber]}
+
+\setvalue{\??dd\s!reset\v!sub\v!sub\v!sub\c!number}#1%
+ {\edef\@@descriptionnumber{\directcurrentdescriptionnumber{#1}}%
+ \resetnumber[\v!sub\v!sub\v!sub\@@descriptionnumber]}
+
+\setvalue{\??dd\s!reset\v!sub\v!sub\c!number}#1%
+ {\getvalue{\??dd\s!reset\v!sub\v!sub\v!sub\c!number}{#1}%
+ \resetnumber[\v!sub\v!sub\@@descriptionnumber]}
+
+\setvalue{\??dd\s!reset\v!sub\c!number}#1%
+ {\getvalue{\??dd\s!reset\v!sub\v!sub\c!number}{#1}%
+ \resetnumber[\v!sub\@@descriptionnumber]}
+
+\setvalue{\??dd\s!reset\c!number}#1%
+ {\getvalue{\??dd\s!reset\v!sub\c!number}{#1}%
+ \resetnumber[\@@descriptionnumber]}
+
+\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{#2}{\getvalue{showdn\v!sub\v!sub\v!sub\c!number}}}%
+
+\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{#2}{\getvalue{showdn\v!sub\v!sub\c!number}}}%
+
+\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{#2}{\getvalue{showdn\v!sub\c!number}}}%
+
+\setvalue{\??dd\e!next\c!number}#1#2%
+ {\getvalue{\??dd\s!reset\v!sub\c!number}{#1}%
+ \incrementnumber[\@@descriptionnumber]%
+ \rawreference\s!num{#2}{\getvalue{showdn\c!number}}}%
+
+\def\dodosetupenumerations[#1][#2]%
+ {\getparameters[\??dd#1][#2]%
+ \doifdefined{\??dd#1\c!start}
+ {\setupnumber[#1][\c!start=\getvalue{\??dd#1\c!start}]}%
+ \setupnumber[#1][\c!conversion=\getvalue{\??dd#1\c!conversion}]}
+
+\def\dosetupenumerations[#1][#2]%
+ {\ConvertToConstant\doifelse{#2}{}
+ {\getparameters[\??dn][#1]}
+ {\dodoubleargumentwithset\dodosetupenumerations[#1][#2]}}
+
+\def\setupenumerations
+ {\dodoubleempty\dosetupenumerations}
+
+\def\docheckenumerationnumber#1#2#3%
+ {\processaction
+ [\getvalue{\??dd#2\c!number}]
+ [ \v!yes=>\setvalue{\??dd#2\??dd\c!number}{#3},%
+ \v!no=>\setvalue{\??dd#2\??dd\c!number}{#3},%
+ \v!default=>\setvalue{\??dd#2\??dd\c!number}{#3},%
+ \v!unknown=>\letvalue{\??dd#2\??dd\c!number}\commalistelement]}
+
+\def\dododefineenumeration#1#2#3[#4][#5]%
+ {\makecounter{\??dd\c!coupling#1}% new: global cross linking
+ \dodefinedescription[#3#1]%
+ [\c!title=\v!no,\c!level=#3,\c!type=\v!enumeration,\c!list=,%
+ \s!do\c!command=\special@@descriptionhandler]%
+ \copyparameters[\??dd#3#1][\??dn]
+ [\c!location,\c!headstyle,\c!style,\c!color,\c!headcolor,
+ \c!width,\c!number,\c!distance,\c!titledistance,\c!command,
+ \c!sample,\c!hang,\c!align,\c!before,\c!inbetween,\c!after,
+ \c!levels,\c!way,\c!blockway,\c!separator,\c!margin,
+ \c!indenting,\c!indentnext,\c!stopper,\c!sectionnumber,
+ \c!title,\c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]%
+ \doifassignmentelse{#4}
+ {\getparameters[\??dd#3#1]%
+ [\c!text=#1,\??dd\c!number=#1,\c!conversion=,\c!listtext=#1\space,
+ \c!left=,\c!right=,\c!coupling=,\c!couplingway=\v!local,#4]%
+ \docheckenumerationnumber{#1}{#3#1}{#1}}%
+ {\doifelsenothing{#4}
+ {\getparameters[\??dd#3#1]%
+ [\c!text=#1,\??dd\c!number=#1,\c!conversion=,
+ \c!stopper=,
+ \c!left=,\c!right=,\c!coupling=,\c!couplingway=,#4]%
+ \docheckenumerationnumber{#1}{#3#1}{#1}}%
+ {\copyparameters[\??dd#3#1][\??dd#3#4]
+ [\c!location,\c!headstyle,\c!style,\c!color,\c!headcolor,
+ \c!width,\c!number,\c!distance,\c!titledistance,\c!command,\c!margin,
+ \c!sample,\c!hang,\c!align,\c!before,\c!inbetween,\c!after,
+ \c!stopper,\c!indenting,\c!indentnext,\c!left,\c!right,
+ \c!coupling,\c!couplingway,
+ \c!title,\c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]%
+ \getparameters[\??dd#3#1]
+ [\c!text=#1,\??dd\c!number=#4,\c!conversion=,#5]%
+ %docheckenumerationnumber{#1}{#3#1}{#4}}}%
+ \docheckenumerationnumber{#1}{#3#1}{\getvalue{\??dd#3#4\??dd\c!number}}}}%
+ \doifvalue{\??dd#3#1\??dd\c!number}{#1}
+ {\definenumber
+ [#3#1]
+ [\c!way=\descriptionparentparameter\c!way,
+ \c!blockway=\descriptionparentparameter\c!blockway,
+ \c!conversion=\descriptionparentparameter\c!conversion,
+ \c!sectionnumber=\descriptionparentparameter\c!sectionnumber]%
+ \doifvalue{\??dd#1\c!levels}{#2}% % for
+ {\doifsomething{\getvalue{\??dd#1\c!conversion}}% % old
+ {\setupnumber[#3#1] % times
+ [\c!conversion=\descriptionparameter\c!conversion]}}}% % sake
+ \doifvaluesomething{\??dd#3#1\c!list}
+ {\definelist[\getvalue{\??dd#3#1\c!type}:\getvalue{\??dd#3#1\c!list}]}% new
+ % should work ...
+ %setvalue{\s!set #3#1}{\dosetenumerationnumber[#1][#3]}%
+ %setvalue{\s!reset#3#1}{\doresetenumerationnumber[#1][#3]}%
+ %setvalue{\e!next #3#1}{\dotripleempty\donextenumerationnumber[#1][#3]}}
+ % but since we use \currentdescription, we need ...
+ \setevalue{\s!set #3#1}{\noexpand \dosetenumerationnumber [#1][#3]}%
+ \setevalue{\s!reset#3#1}{\noexpand \doresetenumerationnumber[#1][#3]}%
+ \setevalue{\e!next #3#1}{\noexpand\dotripleempty\noexpand\donextenumerationnumber [#1][#3]}}
+
+\def\descriptionparentparameter#1{\csname\??dd\currentdescriptionnumber#1\endcsname}
+
+\def\dodefineenumeration[#1][#2][#3]%
+ {\dododefineenumeration{#1}{1}{}[#2][#3]%
+ \dododefineenumeration{#1}{2}{\v!sub}[#2][#3]%
+ \dododefineenumeration{#1}{3}{\v!sub\v!sub}[#2][#3]%
+ \dododefineenumeration{#1}{4}{\v!sub\v!sub\v!sub}[#2][#3]}
+
+\def\defineenumeration
+ {\dotripleemptywithset\dodefineenumeration}
+
+\def\doresetenumerationnumber[#1][#2]% name level
+ {\getvalue{\??dd\s!reset#2\c!number}{#1}}%
+
+\def\dosetenumerationnumber[#1][#2]% name level
+ {\getvalue{\??dd\s!set#2\c!number}{#1}}%
+
+\def\donextenumerationnumber[#1][#2][#3]% name level reference
+ {\pluscounter{\??dd\c!coupling#1}% new: global crosslinking
+ \getvalue{\??dd\e!next#2\c!number}{#1}{#3}}%
+
+\def\@@resetdescriptionclosesymbol
+ {\global\@EA\settrue\csname\??dd\currentdescription:mrk\endcsname
+ \let\placeclosesymbol\@@placedescriptionclosesymbol
+ \let\qed \@@placedescriptionclosesymbol}
+
+\def\@@placedescriptionclosesymbol
+ {\ifconditional\csname\??dd\currentdescription:mrk\endcsname
+ \global\@EA\setfalse\csname\??dd\currentdescription:mrk\endcsname
+ \doifsomething{\descriptionparameter\c!closesymbol}{\descriptionparameter\c!closecommand{\descriptionparameter\c!closesymbol}}%
+ \fi}
+
+% Het default-mechanisme kan mooier: leegtest, enz.
+%
+% Werkprocedure buiten description
+
+\def\dodosetupindentations[#1][#2]%
+ {\getparameters[\??ds#1][#2]}
+
+\def\dosetupindentations[#1][#2]%
+ {\ConvertToConstant\doifelse{#2}{}
+ {\dodosetupindentations[][#1]}
+ {\dodoubleargumentwithset\dodosetupindentations[#1][#2]}}
+
+\def\setupindentations
+ {\dodoubleempty\dosetupindentations}
+
+% what to do with this
+
+\def\startdoorspringen
+ {\whitespace
+ \@@dsbefore
+ \dosomebreak\goodbreak % \page[\v!preference]
+ \begingroup
+ \parskip\zeropoint\relax}
+
+\def\stopdoorspringen
+ {\endgroup
+ \@@dsafter}
+
+%
+
+\def\dododefineindenting#1#2#3%
+ {\par
+ \getvalue{\??ds#1\c!before}%
+ \begingroup
+ \doifvaluenothing{\??ds#1\c!sample}
+ {\setvalue{\??ds#1\c!sample}%
+ {\getvalue{\??ds#1\c!text}}}%
+ \assignwidth
+ {\!!widtha}
+ {\getvalue{\??ds#1\c!width}}
+ {\doattributes
+ {\??ds#1}\c!headstyle\c!headcolor
+ {\getvalue{\??ds#1\c!sample}%
+ \spr{\getvalue{\??ds#1\c!separator}}}}
+ {\getvalue{\??ds#1\c!distance}}%
+ \advance\!!widtha \getvalue{\??ds#1\c!distance}%
+ \setbox2\hbox to \!!widtha
+ {\doattributes
+ {\??ds#1}\c!headstyle\c!headcolor
+ {\strut
+ \getvalue{\??ds#1\c!text}%
+ \hss
+ \spr{\getvalue{\??ds#1\c!separator}}%
+ \hskip\getvalue{\??ds#1\c!distance}}}%
+ \parindent\zeropoint
+ \hskip#2\!!widtha\indent\box2%
+ \hangindent#3\!!widtha
+ \doattributes{\??ds#1}\c!style\c!color\empty
+ \AfterPar{\endgroup\getvalue{\??ds#1\c!after}}% must be redone
+ \GetPar}
+
+\def\dodefineindenting[#1][#2]%
+ {\copyparameters[\??ds#1][\??ds]
+ [\c!text,\c!separator,\c!width,\c!style,\c!color,
+ \c!headstyle,\c!sample,\c!before,\c!after,\c!distance]%
+ \getparameters[\??ds#1][#2]%
+ \setvalue {#1}{\dododefineindenting{#1}{0}{1}}%
+ \setvalue {\v!sub#1}{\dododefineindenting{#1}{1}{2}}%
+ \setvalue{\v!sub\v!sub#1}{\dododefineindenting{#1}{2}{3}}}
+
+\def\defineindenting
+ {\dodoubleargumentwithset\dodefineindenting}
+
+\def\definelabel
+ {\dodoubleargumentwithset\dodefinelabel}
+
+\def\dodefinelabel[#1][#2]%
+ {\definenumber
+ [#1]
+ [\c!command=,\c!location=,#2]%
+ % downward compatible
+ \processaction
+ [\numberparameter{#1}\c!location]
+ [ \v!inmargin=>{\setupnumber[#1][\c!command=\inmargin]},
+ \v!inleft=>{\setupnumber[#1][\c!command=\inleft ]},
+ \v!inright=>{\setupnumber[#1][\c!command=\inright ]},
+ \v!margin=>{\setupnumber[#1][\c!command=\inmargin]}]%
+ % generated commands (in addition to the number ones)
+ \setvalue {#1}{\dodoubleempty\do@@label[#1]}%
+ \setvalue{\s!reset #1}{\resetnumber[#1]}%
+ \setvalue{\e!increment#1}{\incrementnumber[#1]}%
+ \setvalue{\e!next #1}{\dodoubleempty\do@@nextlabel[#1]}%
+ \setvalue{\c!current #1}{\currentnumber[#1]}}
+
+\def\do@@label[#1][#2]%
+ {\numberparameter{#1}\c!before
+ \numberparameter{#1}\c!command{\doattributes{\@@thenumber{#1}}\c!headstyle\c!headcolor{\getvalue{\e!next#1}[#2]}}%
+ \numberparameter{#1}\c!after}%
+
+\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,
+ \c!headstyle=\v!bold,
+ \c!titlestyle=\v!bold,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!headcolor=,
+ \c!titlecolor=,
+ \c!width=8em,
+ \c!distance=0pt,
+ \c!titledistance=0.5em,
+ \c!hang=,
+ \c!sample=,
+ \c!align=,
+ \c!margin=\v!no,
+ \c!before=\blank,
+ \c!inbetween=\blank,
+ \c!after=\blank,
+ \c!indentnext=\v!yes,
+ \c!indenting=\v!never,
+ \c!titleleft=(,
+ \c!titleright=),
+ \c!closesymbol=,
+ \c!closecommand=\wordright,
+ \c!command=,
+ \c!titlecommand=]
+
+\setupenumerations
+ [\c!location=\v!top,
+ \c!headstyle=\v!bold,
+ \c!headcolor=,
+ \c!titlestyle=\v!bold,
+ \c!titlecolor=,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!width=8em,
+ \c!distance=0pt,
+ \c!titledistance=0.5em,
+ \c!hang=,
+ \c!sample=,
+ \c!align=,
+ \c!margin=\v!no,
+ \c!before=\blank,
+ \c!inbetween=\blank,
+ \c!after=\blank,
+ \c!indentnext=\v!yes,
+ \c!indenting=\v!never,
+ \c!text=,
+ \c!levels=3, % to be upward compatible
+ \c!conversion=, % to be upward compatible
+ \c!way=\v!by\v!text,
+ \c!sectionnumber=\v!yes,
+ \c!separator=\@@koseparator, % per 2006.06.23, was .
+ \c!stopper=,
+ \c!titleleft=(,
+ \c!titleright=),
+ \c!closesymbol=,
+ \c!closecommand=\wordright,
+ \c!number=,
+ \c!command=,
+ \c!titlecommand=]
+
+\setupindentations
+ [\c!style=\v!normal,
+ \c!headstyle=\v!normal,
+ \c!color=,
+ \c!headcolor=,
+ \c!width=\v!fit,
+ \c!text=\unknown,
+ \c!sample=,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!distance=1em,
+ \c!separator={ :}]
+
+\protect \endinput
diff --git a/tex/context/base/strc-des.mkiv b/tex/context/base/strc-des.mkiv
new file mode 100644
index 000000000..29e4ea36c
--- /dev/null
+++ b/tex/context/base/strc-des.mkiv
@@ -0,0 +1,1097 @@
+%D \module
+%D [ file=strc-des,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Descriptions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Descriptions}
+
+\registerctxluafile{strc-des}{1.001}
+
+%D In order to be more flexible with theorems Aditya Mahajan added
+%D support for titles and endsymbols. At the same time we added more
+%D flexible support for inheriting numbers.
+%D
+%D \startbuffer
+%D \defineenumeration[one]
+%D \defineenumeration[two] [one] % clone one
+%D \defineenumeration[three] [counter=one,style=slanted] % only use counter of one
+%D \defineenumeration[four] [three] % clone three
+%D \defineenumeration[five] [three] [counter=five] % clone three and use own counter
+%D \defineenumeration[six] [three] [counter=four] % clone tree and use counter four (undefined)
+%D
+%D \startone test test 6 \stopone
+%D \starttwo test test 7 \stoptwo
+%D \startthree test test 8 \stopthree
+%D \startfour test test 9 \stopfour
+%D \startfive test test 2 \stopfive
+%D \startsix test test 10 \stopsix
+%D \stopbuffer
+%D
+%D \typebuffer \start \getbuffer \stop
+%D
+%D \starttyping
+%D \setupenumerations[one] [prefix=yes,prefixsegments=section]
+%D \setupenumerations[two] [prefix=yes,prefixsegments=section]
+%D \setupenumerations[three][prefix=yes,prefixsegments=section]
+%D \setupenumerations[four] [prefix=yes,prefixsegments=chapter:section]
+%D \setupenumerations[five] [prefix=yes,prefixsegments=chapter:section]
+%D \setupenumerations[six] [prefix=yes,prefixsegments=chapter:section]
+%D \stoptyping
+
+% list and titles are experimental
+%
+% \definedescription[test] [location=left,hang=4,headalign={right},distance=1em,list=test]
+% \defineenumeration[lemma][title=yes,right=:,textdistance=1em, location=top, titlestyle=\bs,list=lemma]
+% \defineenumeration[ammel][title=yes,right=:,textdistance=.5em,location=left,titlestyle=\it,width=9em]
+%
+% \placelist[enumeration:lemma]
+% \placelist[description:test][width=0pt]
+%
+% \starttest {something something something} \input zapf \stoptest
+% \startlemma {with a title of a certain length} \input tufte \stoplemma
+% \startammel {with a title} \input zapf \stopammel
+%
+% \defineenumeration[lemma][...]
+% \defineenumeration[titledlemma][lemma][title=yes,right=:,text=lemma,list=lemma]
+
+\unprotect
+
+% description parameters
+
+\def\descriptionparameter #1{\csname\dodescriptionparameter{\??dd\currentdescription }#1\endcsname}
+\def\descriptionmainparameter #1{\csname\dodescriptionparameter{\??dd\currentdescriptionmain }#1\endcsname}
+\def\descriptionnumberparameter#1{\csname\dodescriptionparameter{\??dd\currentdescriptionnumber}#1\endcsname}
+
+\def\detokenizeddescriptionparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??dd\currentdescription#1\endcsname}}
+
+\def\dodescriptionparameter#1#2%
+ {\ifcsname#1#2\endcsname#1#2\else\expandafter\dodescriptionparentparameter\csname#1\s!parent\endcsname#2\fi}
+
+\def\dodescriptionparentparameter#1#2%
+ {\ifx#1\relax\s!empty\else\dodescriptionparameter#1#2\fi}
+
+\def\descriptionlocationparameter#1{\csname\dodescriptionlocationparameter{\??dd\currentdescription}#1\endcsname}
+
+\def\dodescriptionlocationparameter#1#2%
+ {\ifcsname#1#2:\descriptionparameter\c!location\endcsname
+ #1#2:\descriptionparameter\c!location
+ \else\ifcsname#1\s!parent\endcsname
+ \expandafter\dodescriptionlocationparameter\csname#1\s!parent\endcsname#2%
+ \else
+ \dodescriptionparameter{\??dd\currentdescription}#2%
+ \fi\fi}
+
+% description hashes (needed for style/color)
+
+\def\descriptionparameterhash #1{\dodescriptionparameterhash{\??dd\currentdescription }#1}
+\def\descriptionmainparameterhash#1{\dodescriptionparameterhash{\??dd\currentdescriptionmain}#1}
+
+\def\dodescriptionparameterhash#1#2%
+ {\ifcsname#1#2\endcsname#1\else\expandafter\dodescriptionparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dodescriptionparentparameterhash#1#2%
+ {\ifx#1\relax\else\dodescriptionparameterhash#1#2\fi}
+
+\def\dosetdescriptionattributes#1#2% style color
+ {\edef\fontattributehash {\descriptionparameterhash#1}%
+ \edef\colorattributehash{\descriptionparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+% typesetting code
+
+\newbox \descriptionheadbox
+\newskip \leftdescriptionskip
+\newskip \rightdescriptionskip
+\newdimen \descriptionsheadwidth % replaces \!!widtha
+\newdimen \descriptionsheaddistance % replaces \!!widthb
+
+\setvalue{@@description\v!left }{\@@descriptionhang\@@descriptionleftpure \@@descriptionlefthang \@@descriptionleftmargin }
+\setvalue{@@description\v!right}{\@@descriptionhang\@@descriptionrightpure\@@descriptionrighthang\@@descriptionrightmargin}
+
+\def\@@descriptionhang#1#2#3% \next still needed?
+ {\processaction
+ [\descriptionparameter\c!hang]
+ [ \v!none=>\let\next#1,%
+ 0=>\let\next#1,%
+ \v!margin=>\let\next#3,%
+ \s!unknown=>\let\next#2,%
+ \s!default=>\let\next#1]%
+ \next}
+
+\def\@@descriptionleftpure
+ {\def\\{\crlf}%
+ \noindent
+ \leftskip\dimexpr\leftdescriptionskip+\descriptionsheadwidth\relax
+ \rightskip\rightdescriptionskip
+ \@@makedescriptionpurebox\raggedright
+ \advance\leftskip\descriptionsheaddistance
+ \llap
+ {\hbox to \leftskip
+ {\hskip\leftdescriptionskip
+ \copy\descriptionheadbox\hss}}%
+ \@@dodescription}
+
+\def\@@descriptionrightpure
+ {\def\\{\crlf}%
+ \noindent
+ \leftskip\leftdescriptionskip
+ \rightskip\dimexpr\rightdescriptionskip+\descriptionsheadwidth\relax
+ \@@makedescriptionpurebox\raggedleft
+ \rlap
+ {\hskip\dimexpr\hsize-\leftskip-\rightskip\relax
+ \copy\descriptionheadbox
+ \hskip\rightdescriptionskip}%
+ \advance\rightskip \descriptionsheaddistance
+ \@@dodescription}
+
+\def\@@descriptionleftmargin
+ {\def\\{\crlf}%
+ \noindent
+ \llap
+ {\@@makedescriptionpurebox\raggedright
+ \hbox to \descriptionsheadwidth{\copy\descriptionheadbox\hss}%
+ \hskip\descriptionsheaddistance}%
+ \@@dodescription}
+
+\def\@@descriptionrightmargin % whatever this means
+ {\def\\{\crlf}%
+ \noindent
+ \rlap
+ {\hskip\descriptionsheaddistance
+ \@@makedescriptionpurebox\raggedright
+ \hbox to \descriptionsheadwidth{\copy\descriptionheadbox\hss}}%
+ \@@dodescription}
+
+\def\@@makedescriptionpurebox#1%
+ {\setbox\descriptionheadbox\vtop
+ {\dontcomplain
+ \hsize\descriptionsheadwidth
+ \leftskip\zeropoint
+ \rightskip\zeropoint
+ #1\setupalign[\descriptionparameter\c!headalign]%
+ \ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}%
+ \ht\descriptionheadbox\strutht
+ \dp\descriptionheadbox\strutdp}
+
+\def\@@descriptionlefthang
+ {\def\\{\crlf}%
+ \dontcomplain
+ \advance\descriptionsheadwidth \descriptionsheaddistance
+ \hangindent\descriptionsheadwidth
+ \@@makedescriptionhangbox\raggedright{\advance\rightskip \descriptionsheaddistance}%
+ \noindent
+ \llap
+ {\dontshowcomposition
+ \vtop to \zeropoint{\box\descriptionheadbox}}%
+ \@@dodescription}
+
+\def\@@descriptionrighthang
+ {\def\\{\crlf}%
+ \dontcomplain
+ \advance\descriptionsheadwidth \descriptionsheaddistance
+ \hangindent-\descriptionsheadwidth
+ \@@makedescriptionhangbox\raggedleft{\advance\leftskip \descriptionsheaddistance}%
+ \noindent
+ \rlap
+ {\dontcomplain
+ \dontshowcomposition
+ \hbox to \dimexpr\hsize-\leftskip-\rightskip\relax % can be a macro
+ {\hss\vtop to \zeropoint{\box\descriptionheadbox}}}%
+ \@@dodescription}
+
+\def\@@makedescriptionhangbox#1#2%
+ {\setbox\descriptionheadbox\vtop % \vbox gaat fout in hang
+ {\forgetall
+ \dontcomplain
+ \hsize\descriptionsheadwidth
+ #1\setupalign[\descriptionparameter\c!headalign]#2%
+ \ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}%
+ \ht\descriptionheadbox\strutht
+ \dp\descriptionheadbox\strutdp
+ \doifsomething{\descriptionparameter\c!hang}
+ {\doifinsetelse{\descriptionparameter\c!hang}{\v!fit,\v!broad}
+ {\scratchdimen\htdp\descriptionheadbox
+ \doif{\descriptionparameter\c!hang}\v!broad
+ {\advance\scratchdimen .5\strutht}%
+ \getnoflines\scratchdimen
+ \hangafter-\noflines}
+ {\hangafter-\descriptionparameter\c!hang}}}
+
+\setvalue{@@description\v!top}%
+ {%\page[\v!preference]% % Weg ermee!
+ %\dosomebreak{\goodbreak}% % Dit is beter en nodig!
+ \dohandlepagebreakX\plusone % En dit moet het maar worden.
+ \let\\=\space
+ \noindent
+ \copy\descriptionheadbox\par
+ \nobreak
+ %\descriptionparameter\c!inbetween % .. brrrr ... :
+ \doifelsenothing{\descriptionparameter\c!inbetween}{\blank}{\descriptionparameter\c!inbetween}%
+ \nobreak
+ \@@dodescription}
+
+\def\do@@description#1%
+ {\def\\{\crlf}%
+ \noindent
+ #1{\ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}%
+ \@@dodescription}
+
+\setvalue{@@description\v!inmargin }{\do@@description\inmargin}
+\setvalue{@@description\v!inleft }{\do@@description\inleft }
+\setvalue{@@description\v!inright }{\do@@description\inright }
+\setvalue{@@description\v!margin }{\do@@description\inmargin}
+\setvalue{@@description\v!leftmargin }{\do@@description\inleft }
+\setvalue{@@description\v!rightmargin }{\do@@description\inright }
+\setvalue{@@description\v!innermargin }{\do@@description\ininner }
+\setvalue{@@description\v!outermargin }{\do@@description\inouter }
+
+\setvalue{@@description\v!serried\v!fit}%
+ {\def\\{\crlf}%
+ \noindent
+ \ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox
+ \hskip\descriptionsheaddistance % toegevoegd
+ \@@dodescription}
+
+\setvalue{@@description\v!serried\v!broad}%
+ {\def\\{\crlf}%
+ \noindent
+ \ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox
+ \hskip\descriptionsheaddistance \!!plus .5\descriptionsheaddistance \!!minus .25\descriptionsheaddistance
+ \@@dodescription}
+
+\setvalue{@@description\v!serried\v!wide}%
+ {\def\\{\crlf}%
+ \noindent
+ \hbox to \descriptionsheadwidth
+ {\ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox\hss}%
+ \hskip\descriptionsheaddistance
+ \@@dodescription}
+
+\setvalue{@@description\v!serried}%
+ {\processaction
+ [\descriptionlocationparameter\c!width]
+ [ \v!fit=>\let\next\v!fit,
+ \v!broad=>\let\next\v!broad,
+ \s!unknown=>\let\next\v!wide,
+ \s!default=>\let\next\v!broad]%
+ \getvalue{@@description\v!serried\next}}
+
+\setvalue{@@description\v!hanging}%
+ {\def\\{\crlf}%
+ \noindent
+ \advance\leftskip -\leftskipadaption \relax
+ \ifdim\leftskipadaption=\zeropoint
+ \leftskipadaption1.5em\relax % just some default
+ \ifnum\nesteddescriptionstate=\plusone
+ \ifdim\leftskip>\zeropoint \relax
+ \leftskipadaption\leftskip
+ \fi
+ \fi
+ \fi
+ \ifnum\nesteddescriptionstate>\zerocount % was \ifnum\nesteddescriptionstate=\plusone
+ \advance\leftskip \leftskipadaption % but we're already further on
+ \fi
+ \hskip-\leftskipadaption
+ \ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox
+ \kern\ifdim\descriptionsheaddistance=\zeropoint .75em\else\descriptionsheaddistance\fi
+ \@@dodescription}
+
+%D A bonus definition
+%D
+%D \starttyping
+%D \setupfootnotedefinition[location=command,headcommand=\llap]
+%D \stoptyping
+
+% \setvalue{@@description\v!command}%
+% {\do@@description{\executeifdefined{\descriptionparameterhash\c!headcommand}\framed}}
+
+\setvalue{@@description\v!command}%
+ {\noindent
+ \descriptionparameter\c!headcommand{\ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}%
+ \@@dodescription}
+
+%D A new key 'headalign' in definitions.
+
+\def\resetdescriptions % to be used in e.g. footnotes
+ {\chardef\nesteddescriptionstate\zerocount}
+
+\resetdescriptions
+
+\def\@@dostartdescription
+ {\descriptionparameter\c!before
+ \begingroup
+ \doadaptleftskip{\descriptionparameter\c!margin}%
+ \showcomposition
+ \setlocalhsize % so we can use \localhsize in width assignments
+ \descriptionsheaddistance\descriptionlocationparameter\c!distance\relax
+ \ifdim\descriptionsheaddistance=\zeropoint\relax
+ \doif{\descriptionlocationparameter\c!width}\v!broad{\descriptionsheaddistance=1em}%
+ \fi
+ \setbox\descriptionheadbox\hbox
+ {\forgetall\dontcomplain
+ \trialtypesettingtrue
+ \doifelsenothing{\descriptionparameter\c!sample}
+ {\dodescriptionhandler\currentdescriptiontext}%
+ {\dodescriptionhandler\currentdescriptionsample}}%
+ \assignwidth
+ \descriptionsheadwidth
+ {\descriptionlocationparameter\c!width}
+ {\unhcopy\descriptionheadbox}
+ \descriptionsheaddistance
+ \setbox\descriptionheadbox\hbox
+ {\forgetall\dontcomplain
+ \doifelse{\descriptionparameter\c!location}\v!serried % brrr, hack
+ {\dodescriptionhandler\currentdescriptiontext}
+ {\dodescriptionhandler{\boxeddescriptionhead\currentdescriptiontext}}}%
+ \doifelse{\descriptionparameter\c!aligntitle}\v!no
+ {\leftdescriptionskip\leftskip\rightdescriptionskip\rightskip}
+ {\ifcase\nesteddescriptionstate\leftdescriptionskip\leftskip\rightdescriptionskip\rightskip\fi}%
+ \doifsomething{\descriptionparameter\c!align}{\setupalign[\descriptionparameter\c!align]}%
+ \normalexpanded{\noexpand\indenting[\descriptionparameter\c!indenting]}%
+ % better a system mode
+ \ifcase\nesteddescriptionstate
+ \chardef\nesteddescriptionstate\plusone
+ \or
+ \chardef\nesteddescriptionstate\plustwo
+ \fi % now happens elsewhere : \noindent\ignorespaces
+ \@@resetdescriptionclosesymbol}
+
+\def\boxeddescriptionhead#1%
+ {\vtop
+ %{\hsize\dimexpr\descriptionsheadwidth-\descriptionsheaddistance\relax
+ {\hsize\descriptionsheadwidth
+ \doifsomething{\descriptionparameter\c!headalign}{\setupalign[\descriptionparameter\c!headalign]}%
+ #1}}
+
+\def\@@stopdescription
+ {\@@placedescriptionclosesymbol
+ \par % else we loose
+ \endgroup
+ \descriptionparameter\c!after % which currentdescription is taken here?
+ \egroup % temporary hack
+ \checknextindentation[\descriptionparameter\c!indentnext]
+ \dorechecknextindentation}
+
+\def\@@dodescription
+ {\dosetdescriptionattributes\c!style\c!color
+ \ignorespaces}
+
+% starters:
+
+\def\@@startdescription[#1]%
+ {\doifelse{\descriptionparameter\c!title}\v!yes
+ {\permitspacesbetweengroups
+ \dodoublegroupempty{\dohandledescriptionstart[#1]}}
+ {\dohandledescriptionstart[#1]{}}}
+
+\def\@@description[#1]%
+ {\doifelse{\descriptionparameter\c!title}\v!yes
+ {\permitspacesbetweengroups
+ \dodoublegroupempty{\dohandledescriptiondo[#1]}}
+ {\dohandledescriptiondo[#1]{}}}
+
+% these call:
+
+\long\def\@@somedescription[#1]#2%
+ {\dowithpar
+ {\bgroup % temporary hack
+ \@@makedescription[#1]{#2}}%
+ {\@@stopdescription}}
+
+\long\def\@@startsomedescription[#1]#2%
+ {\bgroup % temporary hack
+ \BeforePar{\@@makedescription[#1]{#2}}%
+ \GotoPar}
+
+\def\@@dostartdescriptionindeed
+ {\edef\currentdescriptionlocation{\descriptionparameter\c!location}%
+ \ifx\currentdescriptionlocation\empty
+ \let\currentdescriptionlocation\v!left
+ \fi
+ \ifcsname @@description\currentdescriptionlocation\endcsname \else
+ \let\currentdescriptionlocation\v!left
+ \fi
+ \@@dostartdescription
+ \csname @@description\currentdescriptionlocation\endcsname} % args not needed
+
+\def\@@makedescription[#1]#2%
+ {\postponenotes % new, assumes grouping
+ \edef\currentdescriptionreference{#1}%
+ \doenumerationcheckconditions
+ \dodescriptioncomponent[\c!reference=#1,\c!label={\descriptionparameter\c!text},\c!title={#2},\c!bookmark=,\c!list=][]%
+ \@@dostartdescriptionindeed}
+
+\def\dostartstoreddescription
+ {\@@dostartdescriptionindeed}
+
+\def\dostopstoreddescription
+ {\@@stopdescription}
+
+% % % % % % % % % % % %
+
+% helpers
+
+% todo: \dosetfontattributewithhash \descriptionparameterhash\c!headstyle
+
+% setup descriptions
+
+\unexpanded\def\setupdescriptions
+ {\dodoubleempty\dosetupdescriptions}
+
+\def\dosetupdescriptions[#1][#2]% % beter: \iffirstargument
+ {\ifsecondargument
+ \dodoubleargumentwithset\dodosetupdescriptions[#1][#2]%
+ \else
+ \dodosetupdescriptions[][#1]%
+ \fi}
+
+\def\dodosetupdescriptions[#1]% [#2]%
+ {\getparameters[\??dd#1]} % [#2]}
+
+% define descriptions
+
+\unexpanded\def\definedescription
+ {\dotripleemptywithset\dodefinedescription}
+
+\def\dodefinedescription[#1][#2][#3]% to be simplified cf enumeration
+ {\dodescriptioninit{#1}%
+ \getparameters[\??dd#1][\c!text=,\s!handler=\v!description,\c!title=\v!yes]%
+ \ifsecondargument\doifassignmentelse{#2}\donetrue\donefalse\else\donetrue\fi
+ \ifdone
+ \getparameters[\??dd#1][\s!parent=\??dd,\c!text=,\s!handler=\v!description,#2]%
+ \dodefinedescriptioncommands{#1}{\??dd}%
+ \else % clone
+ \getparameters[\??dd#1][\s!parent=\??dd#2,\c!text=,\s!handler=\v!description,#3]% clone
+ \dodefinedescriptioncommands{#1}{\??dd#2}%
+ \fi}
+
+\def\dodefinedescriptioncommands#1#2%
+ {\setuevalue {#1}{\noexpand\dodescriptioncommand{#1}}%
+ \setuevalue{\e!start#1}{\noexpand\dodescriptionstart {#1}}%
+ \setuevalue{\e!stop #1}{\noexpand\dodescriptionstop {#1}}}
+
+% handle descriptions
+
+\def\dodescriptioninit#1%
+ {\let\currentdescriptionmain \empty
+ \let\currentdescriptionlevel \empty
+ \edef\currentdescriptionname {#1}%
+ \edef\currentdescription {#1}}
+
+\def\dodescriptioncommand#1{\dodescriptioninit{#1}\dosingleempty\@@description}
+\def\dodescriptionstart #1{\dodescriptioninit{#1}\dosingleempty\@@startdescription}
+\def\dodescriptionstop #1{\dodescriptioninit{#1}\@@stopdescription}
+
+\def\dodescriptiontext {\csname\??dd:\descriptionparameter\s!handler:\s!handler:\s!text \endcsname}
+\def\dodescriptionnumber {\csname\??dd:\descriptionparameter\s!handler:\s!handler:\s!number\endcsname}
+\def\dodescriptionhandler {\csname\??dd:\descriptionparameter\s!handler:\s!handler \endcsname}
+\def\dohandledescriptiondo {\csname\??dd:\descriptionparameter\s!handler:\s!handler:\s!do \endcsname}
+\def\dohandledescriptionstart{\csname\??dd:\descriptionparameter\s!handler:\s!handler:\s!start \endcsname}
+
+\def\currentdescriptiontext {\begstrut\dodescriptiontext\endstrut}
+\def\currentdescriptionsample{\begstrut\descriptionparameter\c!text\descriptionparameter\c!sample\endstrut}
+
+% implementation
+
+% beware: with footnotes #2 can be something messy but then #1 is
+% empty anyway, so we have an extra safeguard
+
+\newtoks \everydescription
+
+\setvalue{\??dd:\v!description:\s!handler:\s!text }{\@@dodescriptiontext}
+\setvalue{\??dd:\v!description:\s!handler }{\@@dodescriptionhandler}
+\setvalue{\??dd:\v!description:\s!handler:\s!do }{\@@somedescription}
+\setvalue{\??dd:\v!description:\s!handler:\s!start}{\@@startsomedescription}
+
+\def\@@dodescriptionhandler#1%
+ {\iftrialtypesetting \else
+ \begingroup
+ \currentdescriptionsynchronize
+ \attribute\destinationattribute\currentdescriptionattribute\relax % todo, whole text
+ \forcecolorhack
+ \endgroup
+ \fi#1}
+
+\def\@@dododescriptiontext
+ {\ctxlua{structure.lists.savedtitle("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+
+\def\@@dodescriptiontext
+ {\begingroup
+ \dosetdescriptionattributes\c!headstyle\c!headcolor
+ \the\everydescription
+ \descriptionparameter\c!command{\strut\descriptionparameter\c!text\ignorespaces\@@dododescriptiontext}% probably incomplete
+ \endgroup}
+
+% setup enumerations
+
+\unexpanded\def\setupenumerations
+ {\dodoubleempty\dosetupenumerations}
+
+\def\dodosetupenumerations[#1][#2]%
+ {\doenumerationinit{#1}{1}\empty
+ \getparameters[\??dd#1][#2]%
+ \dosetupenumerationcounter{#1}}
+
+\def\dosetupenumerations[#1][#2]%
+ {\ifsecondargument
+ \dodoubleargumentwithset\dodosetupenumerations[#1][#2]%
+ \else
+ \getparameters[\??dn][#1]%
+ \fi}
+
+% define enumerations
+
+\unexpanded\def\defineenumeration
+ {\dotripleemptywithset\dodefineenumeration}
+
+\def\dodefineenumeration[#1][#2][#3]% #2 or #3 assignment
+ {\doenumerationinit{#1}{1}\empty
+ \getparameters[\??dd#1][\c!text=#1,\c!state=\v!start,\s!handler=\v!enumeration,\c!levels=4]%
+ \ifsecondargument\doifassignmentelse{#2}\donetrue\donefalse\else\donetrue\fi
+ \ifdone % independent
+ \getparameters[\??dd#1][\s!counter=#1,#2]%
+ \dodefineenumerationcommands{#1}{1}{}{\??dn}%
+ \let\@@subslevel\empty
+ \dostepwiserecurse{2}{\descriptionparameter\c!levels}{1}
+ {\normalexpanded{\noexpand\dodefineenumerationcommands{#1}{\recurselevel}{\@@subslevel\v!sub}{\??dd\@@subslevel#1}}%
+ \edef\@@subslevel{\@@subslevel\v!sub}}%
+ \else % clone
+ \getparameters[\??dd#1][\s!parent=\??dd#2,#3]%
+ \let\@@subslevel\empty
+ \dorecurse{\descriptionparameter\c!levels}
+ {\normalexpanded{\noexpand\dodefineenumerationcommands{#1}{\recurselevel}{\@@subslevel}{\??dd\@@subslevel#2}}%
+ \edef\@@subslevel{\@@subslevel\v!sub}}%
+ \fi
+ \edef\currentdescriptioncounter{\descriptionparameter\s!counter}%
+ \ifx\currentdescriptioncounter\empty
+ \ifdone\dodefineenumerationcounter{#1}\fi
+ \else\ifx\currentdescriptioncounter\v!yes
+ \ifdone\dodefineenumerationcounter{#1}\fi
+ \else\ifx\currentdescriptioncounter\v!no
+ \ifdone\dodefineenumerationcounter{#1}\fi
+ \else
+ \letvalue{\??dd#1\s!counter}\currentdescriptioncounter % ?
+ %[[#1:\currentdescriptioncounter]]
+ \doifstructurecounterelse{\currentdescriptioncounter}{}{\dodefineenumerationcounter\currentdescriptioncounter}%
+ \fi\fi\fi
+ \dosetupenumerationcounter{#1}} % new
+
+\newtoks\everysetupenumerationcounter
+\let\currentenumerationcountername\empty
+
+\def\dosetupenumerationcounter#1%
+ {\edef\currentenumerationcountername{#1}% only used in the token list
+ \edef\currentdiscription{#1}%
+ \the\everysetupenumerationcounter}
+
+\appendtoks
+ \dostructurecountersetup\currentenumerationcountername\descriptionparameter
+\to \everysetupenumerationcounter
+
+\def\dodefineenumerationcounter#1% todo: fast inheritance (was mainparameter
+ {\definestructurecounter[#1]%
+ \dosetupenumerationcounter{#1}}
+
+\def\dodefineenumerationcommands#1#2#3#4% since we use \currentdescription, we need an edef
+ {\setevalue{\??dd#3#1\s!parent}{#4}%
+ \setuevalue {#3#1}{\noexpand\doenumerationcommand{#1}{#2}{#3}}%
+ \setuevalue{\e!start#3#1}{\noexpand\doenumerationstart {#1}{#2}{#3}}%
+ \setuevalue{\e!stop #3#1}{\noexpand\doenumerationstop {#1}{#2}{#3}}}
+
+% handle enumeration
+
+\def\currentdescriptionnumber {\csname\??dd\currentdescriptionmain\s!counter\endcsname}% no edef (yet)
+\def\specificdescriptionnumber#1{\csname\??dd#1\s!counter\endcsname}% no edef (yet)
+
+\def\doenumerationinit#1#2#3%
+ {\edef\currentdescriptionmain {#1}%
+ \edef\currentdescriptionlevel{#2}%
+ \edef\currentdescriptionname {#1}%
+ \edef\currentdescription {#3#1}}
+
+\def\doenumerationcommand#1#2#3{\doenumerationinit{#1}{#2}{#3}\dosingleempty\@@description}
+\def\doenumerationstart #1#2#3{\doenumerationinit{#1}{#2}{#3}\dosingleempty\@@startdescription}
+\def\doenumerationstop #1#2#3{\doenumerationinit{#1}{#2}{#3}\@@stopdescription}
+
+\def\doresetenumerationnumber#1#2#3{\doresetsubstructurecounter [\specificdescriptionnumber{#1}][#2]}
+\def\dosetenumerationnumber#1#2#3#4{\dosetsubstructurecounter [\specificdescriptionnumber{#1}][#2]{#4}}
+\def\donextenumerationnumber #1#2#3{\doincrementsubstructurecounter[\specificdescriptionnumber{#1}][#2]}
+
+% implementation
+
+\newtoks \everyenumeration
+\newconditional\enumerationnumberenabled
+\def \enumerationdisablenumbersignal {-}
+
+\appendtoks \disablepseudocaps \to \everyenumeration % sorry, uppercase causes troubles
+
+\setvalue{\??dd:\v!enumeration:\s!handler:\s!number}{\@@doenumerationnumber}
+\setvalue{\??dd:\v!enumeration:\s!handler:\s!text }{\@@doenumerationtext}
+\setvalue{\??dd:\v!enumeration:\s!handler }{\@@doenumerationhandler}
+\setvalue{\??dd:\v!enumeration:\s!handler:\s!do }{\@@somedescription}
+\setvalue{\??dd:\v!enumeration:\s!handler:\s!start }{\@@startsomedescription}
+
+\let\@@doenumerationhandler\@@dodescriptionhandler
+
+% \def\currentenumerationfullnumber
+% {\ctxlua{structure.lists.savedprefixednumber("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+
+\def\@@doenumerationnumber
+ {\ctxlua{structure.lists.savedprefixednumber("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+
+\def\@@dodoenumerationtext
+ {\ctxlua{structure.lists.savedtitle("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+
+\def\doenumerationnumber
+ {\descriptionparameter\c!left
+ \descriptionparameter\c!starter
+ \dodescriptionnumber
+ \descriptionparameter\c!stopper
+ \descriptionparameter\c!right}
+
+\def\@@doenumerationtext
+ {\ifconditional\enumerationnumberenabled
+ \iftrialtypesetting
+ \doenumerationfullnumber\showdntext
+ \doenumerationcouplingsymbol
+ \else
+ \doenumerationregistercoupling
+ \doenumerationfullnumber\showdntext
+ \doenumerationcouplingsymbol
+ \fi
+ \else
+ \doenumerationfullnumber\showdnpuretext
+ \fi}
+
+\def\doenumerationfullnumber#1% text, title
+ {\begingroup
+ \dosetdescriptionattributes\c!headstyle\c!headcolor
+ \the\everyenumeration
+ \descriptionparameter\c!command{\strut#1\doenumerationnumber\doenumerationextratext}%
+ \endgroup}
+
+\def\doenumerationextratext
+ {\doif{\descriptionparameter\c!title}\v!yes
+ {\begingroup
+ \dosetdescriptionattributes\c!titlestyle\c!titlecolor
+ \hskip\descriptionparameter\c!titledistance
+ \descriptionparameter\c!titlecommand
+ {\descriptionparameter\c!titleleft
+ \begstrut\@@dodoenumerationtext\endstrut
+ \descriptionparameter\c!titleright}%
+ \endgroup}}
+
+\def\doenumerationsavecounter {\savestructurecounter[\currentdescriptionnumber]}
+\def\doenumerationrestorecounter {\restorestructurecounter[\currentdescriptionnumber]}
+\def\doenumerationincrementcounter{\doincrementsubstructurecounter[\currentdescriptionnumber][\currentdescriptionlevel]}
+
+% to be used in for instance:
+%
+% coupling=questions .... coupling=answers
+%
+% we will provide some more control, like skipping etc or reference relates
+
+\def\doenumerationcheckconditions
+ {\doifelse{\descriptionparameter\c!number}\v!yes
+ {\ifx\currentdescriptionreference\enumerationdisablenumbersignal
+ \setfalse\enumerationnumberenabled \else \settrue\enumerationnumberenabled
+ \fi}%
+ {\setfalse\enumerationnumberenabled}%
+ \edef\currentenumerationcoupling{\descriptionparameter\c!coupling}}
+
+\def\doenumerationregistercoupling
+ {\iflocation
+ % no area yet, we will provide variants some day
+ \fi}
+
+\def\doenumerationcouplingsymbol
+ {\iflocation \ifx\currentenumerationcoupling\empty\else
+ \symbolreference[order(description:\currentenumerationcoupling:\nextinternalorderreference)]%
+ \fi \fi}
+
+\def\skipenumerationcoupling[#1]% e.g. for questions with no answer
+ {\ctxlua{jobreferences.setnextorder("description","#1")}}
+
+\def\showdnpuretext{\strut\descriptionparameter\c!text} % geen spatie
+\def\showdnlisttext{\descriptionparameter\c!listtext} % space in default
+\def\showdntext {\doifsomething{\descriptionparameter\c!text}{\descriptionparameter\c!text\removeunwantedspaces\fixedspace}}
+
+\unexpanded\def\structurecounterreference#1%
+ {[enumref: #1]}
+
+% you can use \placeclosesymbol or \qed to place a symbol at the end of a
+% description
+
+\def\@@resetdescriptionclosesymbol
+ {\global\@EA\settrue\csname\??dd\currentdescription:mrk\endcsname
+ \let\placeclosesymbol\@@placedescriptionclosesymbol
+ \let\qed \@@placedescriptionclosesymbol}
+
+\def\@@placedescriptionclosesymbol
+ {\ifconditional\csname\??dd\currentdescription:mrk\endcsname
+ \global\@EA\setfalse\csname\??dd\currentdescription:mrk\endcsname
+ \doifsomething{\descriptionparameter\c!closesymbol}{\descriptionparameter\c!closecommand{\descriptionparameter\c!closesymbol}}%
+ \fi}
+
+\newif\ifnodescriptioncaption
+
+\def\doifelsedescriptioncomponent
+ {\ctxlua{structure.lists.doifstoredelse(currentdescriptionnumberentry)}}
+
+\def\dodescriptioncomponent
+ {\doifelsedescriptioncomponent\nododescriptioncomponent\dododescriptioncomponent}
+
+\def\nododescriptioncomponent[#1][#2]% #1=interfaced-settings, #2=optional user data
+ {}
+
+\def\dododescriptioncomponent[#1][#2]% #1=interfaced-settings, #2=optional user data
+ {\begingroup % similar to structure so we might generalize this
+ \getparameters[\??dd\currentdescription][#1]%
+ %
+ \xdef\currentdescriptionexpansion {\descriptionparameter\c!expansion}%
+ \xdef\currentdescriptionxmlsetup {\descriptionparameter\c!xmlsetup}%
+ \xdef\currentdescriptioncatcodes {\descriptionparameter\s!catcodes}%
+ \xdef\currentdescriptionlabel {\descriptionparameter\c!label}%
+ \xdef\currentdescriptionreference {\descriptionparameter\c!reference}%
+ \xdef\currentdescriptionreferenceprefix{\descriptionparameter\c!referenceprefix}%
+ %xdef\currentdescriptionshownumber {\descriptionparameter\c!number}%
+ \xdef\currentdescriptionsaveinlist {\descriptionparameter\c!saveinlist}%
+ \xdef\currentdescriptionincrementnumber{\descriptionparameter\c!incrementnumber}%
+ %
+ \ifx\currentdescriptionexpansion\empty
+ \glet\currentdescriptionexpansion\v!no
+ \fi
+ %
+ \ifx\currentdescriptionexpansion\s!xml
+ \xmlstartraw
+ \xdef\currentdescriptiontitle {\descriptionparameter\c!title}%
+ \xdef\currentdescriptionbookmark{\descriptionparameter\c!bookmark}%
+ \xdef\currentdescriptionmarking {\descriptionparameter\c!marking}%
+ \xdef\currentdescriptionlist {\descriptionparameter\c!list}%
+ \xmlstopraw
+ \ifx\currentdescriptionlist\empty
+ \globallet\currentdescriptionlist\currentdescriptiontitle
+ \fi
+ \globallet\currentdescriptioncoding\s!xml
+ \else
+ \ifx\currentdescriptionexpansion\v!yes
+ \xdef\currentdescriptiontitle {\descriptionparameter\c!title}%
+ \xdef\currentdescriptionbookmark{\descriptionparameter\c!bookmark}%
+ \xdef\currentdescriptionmarking {\descriptionparameter\c!marking}%
+ \xdef\currentdescriptionlist {\descriptionparameter\c!list}%
+ \else
+ \xdef\currentdescriptiontitle {\detokenizeddescriptionparameter\c!title}%
+ \xdef\currentdescriptionbookmark{\detokenizeddescriptionparameter\c!bookmark}%
+ \xdef\currentdescriptionmarking {\detokenizeddescriptionparameter\c!marking}%
+ \xdef\currentdescriptionlist {\detokenizeddescriptionparameter\c!list}%
+ \iflocation \ifx\currentdescriptionbookmark\empty
+ \begingroup
+ \simplifycommands
+ \xdef\currentdescriptionbookmark{\detokenize\expandafter{\normalexpanded{\descriptionparameter\c!title}}}%
+ \endgroup
+ \fi \fi
+ \fi
+ \ifx\currentdescriptionlist\empty
+ \globallet\currentdescriptionlist\currentdescriptiontitle
+ \fi
+ \globallet\currentdescriptioncoding\s!tex
+ \fi
+ %
+ \ifx\currentdescriptiontitle\v!none % will become obsolete
+ \global\nodescriptioncaptiontrue\global\nodescriptionnumbertrue
+ \fi
+ %
+ \ifconditional\enumerationnumberenabled
+ \doifelsedescriptioncomponent\donothing\doenumerationincrementcounter
+ \fi
+ %
+ \ifnodescriptioncaption
+ \glet\currentdescriptionlistnumber \relax
+ \glet\currentdescriptionsynchronize\relax
+ \glet\currentdescriptionattribute \relax
+ \else
+ %\setnextinternalreference
+ \setnextinternalreferences{description}\currentdescriptionname % plural
+ \xdef\currentdescriptionnumberentry{\ctxlua{structure.lists.push{
+ metadata = {
+ kind = "description",
+ name = "\currentdescriptionname",
+ level = structure.sections.currentlevel(),
+ catcodes = \the\catcodetable,
+ % \currentdirectionparameters
+ },
+ references = {
+ internal = \nextinternalreference,
+ order = \nextinternalorderreference,
+ reference = "\currentdescriptionreference",
+ referenceprefix = "\referenceprefix",
+ block = "\currentstructureblock",
+ section = structure.sections.currentid(),
+ },
+ titledata = {
+ label = \!!bs\detokenize\expandafter{\currentdescriptionlabel }\!!es,
+ title = \!!bs\detokenize\expandafter{\currentdescriptiontitle }\!!es,
+ \ifx\currentdescriptionbookmark\currentdescriptiontitle \else
+ bookmark = \!!bs\detokenize\expandafter{\currentdescriptionbookmark}\!!es,
+ \fi
+ \ifx\currentdescriptionlist\currentdescriptiontitle \else % \ifx\currentdescriptionsaveinlist\v!no
+ list = \!!bs\detokenize\expandafter{\currentdescriptionlist }\!!es,
+ \fi % \fi
+ },
+ \ifconditional\enumerationnumberenabled
+ prefixdata = {
+ prefix = "\descriptionparameter\c!prefix",
+ separatorset = "\descriptionparameter\c!prefixseparatorset",
+ conversion = \!!bs\descriptionparameter\c!prefixconversion\!!es,
+ conversionset = "\descriptionparameter\c!prefixconversionset",
+ set = "\descriptionparameter\c!prefixset",
+ segments = "\descriptionparameter\c!prefixsegments",
+ connector = \!!bs\descriptionparameter\c!prefixconnector\!!es,
+ },
+ numberdata = {
+ numbers = structure.counters.compact("\currentdescriptionnumber",nil,true), % ! number can be cloned
+ separatorset = "\descriptionparameter\c!numberseparatorset",
+ conversion = "\descriptionparameter\c!numberconversion",
+ conversionset = "\descriptionparameter\c!numberconversionset",
+ starter = \!!bs\descriptionparameter\c!numberstarter\!!es,
+ stopper = \!!bs\descriptionparameter\c!numberstopper\!!es,
+ segments = "\descriptionparameter\c!numbersegments",
+ },
+ \fi
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#2}\!!es)
+ }
+ }}%
+ \xdef\currentdescriptionattribute {\ctxlua {tex.write(jobreferences.setinternalreference("\referenceprefix","\currentdescriptionreference",\nextinternalreference,"\@@iafocus"))}}%
+ \xdef\currentdescriptionsynchronize{\ctxlatelua{structure.lists.enhance(\currentdescriptionnumberentry)}}%
+ \fi
+ \endgroup}
+
+% This is not so nice, some day i'll just store the number with the entry
+% and deal with all at the Lua end, but first we need to be able to set
+% macros.
+
+\def\reinstatedescriptionnumberentry#1%
+ {\xdef\currentdescriptionattribute {\ctxlua {tex.write(jobreferences.getinternalreference(#1))}}%
+ \xdef\currentdescriptionsynchronize{\ctxlatelua{structure.lists.enhance(#1)}}}
+
+\installstructurelistprocessor{description}{\usestructurelistprocessor{number+title}}
+
+% labels, we could share with enumerations and forget about the text; anyhow, figure
+% labels etc can use enumerations; we keep labels for compatibility reasons; we need
+% the slightly different namespace; we can still define structure counters directly
+% (multiple levels) and use an enumeration without following text
+
+% unfinished
+
+\unexpanded\def\setuplabels
+ {\getparameters[\??db]}
+
+\unexpanded\def\definelabel
+ {\dotripleargumentwithset\dodefinelabel}
+
+\def\dodefinelabel[#1][#2][#3]% #2 or #3 assignment
+ {\doenumerationinit{#1}{1}\empty
+ \getparameters[\??dd#1][\c!command=,\c!state=\v!start,\c!location=,\c!text=#1]%
+ \ifsecondargument\doifassignmentelse{#2}\donetrue\donefalse\else\donetrue\fi
+ \ifdone
+ % an independent one
+ \getparameters[\??dd#1][\s!counter=#1,\s!parent=\??db,#2]%
+ \dodefinelabelcommands{#1}{\??db}%
+ \dodefineenumerationcounter{#1}%
+ \else
+ \getparameters[\??dd#1][\s!counter=#1,\s!parent=\??dd#2,#3]%
+ \dodefinelabelcommands{#1}{\??dd#2}%
+ \fi}
+
+\def\dodefinelabelcommands#1#2%
+ {\setuevalue {#1}{\noexpand\dolabelnumbercommand {#1}}%
+ \setuevalue{\c!reset #1}{\noexpand\doresetlabelnumber {#1}}%
+ %\setuevalue{\c!set #1}{\noexpand\dosetlabelnumber {#1}}% [#2] or {#2} ?
+ \setuevalue{\e!next #1}{\noexpand\donextlabelnumber {#1}}%
+ \setuevalue{\e!increment#1}{\noexpand\doincrementlabelnumber{#1}}%
+ \setuevalue{\c!current #1}{\noexpand\docurrentlabelnumber {#1}}}
+
+% this is just for downward compatibility, we might drop it
+
+\setvalue{\??db:\c!location:\v!inmargin}{\inmargin}
+\setvalue{\??db:\c!location:\v!inleft }{\inleft}
+\setvalue{\??db:\c!location:\v!inright }{\inright}
+\setvalue{\??db:\c!location:\v!margin }{\inmargin}
+
+\def\dolabelinit#1%
+ {\def\currentdescriptionmain{#1}%
+ \def\currentdescription {#1}%
+ \def\currentdescriptionlevel{1}}
+
+\def\docurrentlabelnumber #1{\dolabelinit{#1}\dosingleempty\dodocurrentlabelnumber}
+\def\donextlabelnumber #1{\dolabelinit{#1}\dosingleempty\dodonextlabelnumber}
+\def\dolabelnumbercommand #1{\dolabelinit{#1}\dosingleempty\dodolabelnumbercommand}
+
+\def\doresetlabelnumber #1{\dolabelinit{#1}\doresetsubstructurecounter [\currentdescriptionnumber][\currentdescriptionlevel]}
+\def\dosetlabelnumber #1#2{\dolabelinit{#1}\dosetsubstructurecounter [\currentdescriptionnumber][\currentdescriptionlevel]{#2}}
+\def\doincrementlabelnumber #1{\dolabelinit{#1}\doincrementsubstructurecounter[\currentdescriptionnumber][\currentdescriptionlevel]}
+
+\def\dodocurrentlabelnumber[#1]%
+ {\dontleavehmode
+ \writestatus{!!!}{todo: reference of label}%
+ \dotextprefix{\descriptionparameter\c!text}%
+ \convertedsubstructurecounter[\currentdescriptionnumber][\currentdescriptionlevel]}
+
+\def\dodonextlabelnumber[#1]% todo: ref
+ {\doincrementsubstructurecounter[\currentdescriptionnumber][\currentdescriptionlevel]%
+ \dodocurrentlabelnumber[\currentdescriptionnumber]}
+
+\def\dodolabelnumbercommand[#1]% todo: ref
+ {\dontleavehmode
+ \descriptionparameter\c!before
+ \begingroup
+ \doincrementsubstructurecounter[\currentdescriptionnumber][\currentdescriptionlevel]%
+ \dosetdescriptionattributes\c!headstyle\c!headcolor
+ \executeifdefined{\??db:\c!location:\descriptionparameter\c!location}{\descriptionparameter\c!command}{\dodocurrentlabelnumber[#1]}%
+ \endgroup
+ \descriptionparameter\c!after}
+
+% to be reimplmented
+
+\unexpanded\def\setupindentations
+ {\dodoubleempty\dosetupindentations}
+
+\def\dosetupindentations[#1][#2]%
+ {\ifsecondargument
+ \dodoubleargumentwithset\dodosetupindentations[#1][#2]%
+ \else
+ \dodosetupindentations[][#1]%
+ \fi}
+
+\def\dodosetupindentations[#1][#2]%
+ {\getparameters[\??ds#1][#2]}
+
+\unexpanded\def\defineindenting
+ {\dodoubleargumentwithset\dodefineindenting}
+
+\def\dodefineindenting[#1][#2]%
+ {\copyparameters[\??ds#1][\??ds]
+ [\c!text,\c!separator,\c!width,\c!style,\c!color,
+ \c!headstyle,\c!sample,\c!before,\c!after,\c!distance]%
+ \getparameters[\??ds#1][#2]%
+ \setuvalue {#1}{\dododefineindenting{#1}{0}{1}}%
+ \setuvalue {\v!sub#1}{\dododefineindenting{#1}{1}{2}}%
+ \setuvalue{\v!sub\v!sub#1}{\dododefineindenting{#1}{2}{3}}}
+
+\def\dododefineindenting#1#2#3%
+ {\par
+ \getvalue{\??ds#1\c!before}%
+ \begingroup
+ \doifvaluenothing{\??ds#1\c!sample}
+ {\setvalue{\??ds#1\c!sample}{\getvalue{\??ds#1\c!text}}}%
+ \assignwidth
+ {\descriptionsheadwidth}
+ {\getvalue{\??ds#1\c!width}}
+ {\doattributes
+ {\??ds#1}\c!headstyle\c!headcolor
+ {\getvalue{\??ds#1\c!sample}%
+ \spr{\getvalue{\??ds#1\c!separator}}}}
+ {\getvalue{\??ds#1\c!distance}}%
+ \advance\descriptionsheadwidth \getvalue{\??ds#1\c!distance}%
+ \setbox\scratchbox\hbox to \descriptionsheadwidth
+ {\doattributes
+ {\??ds#1}\c!headstyle\c!headcolor
+ {\strut
+ \getvalue{\??ds#1\c!text}%
+ \hss
+ \spr{\getvalue{\??ds#1\c!separator}}%
+ \hskip\getvalue{\??ds#1\c!distance}}}%
+ \parindent\zeropoint
+ \hskip#2\descriptionsheadwidth\indent\box\scratchbox
+ \hangindent#3\descriptionsheadwidth
+ \doattributes{\??ds#1}\c!style\c!color\empty
+ \AfterPar{\endgroup\getvalue{\??ds#1\c!after}}% must be redone
+ \GetPar}
+
+\setupdescriptions
+ [\c!location=\v!left,
+ \c!headstyle=\v!bold,
+ \c!titlestyle=\v!bold,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!headcolor=,
+ \c!titlecolor=,
+ \c!width=8em,
+ \c!distance=0pt,
+ \c!titledistance=0.5em,
+ \c!hang=,
+ \c!sample=,
+ \c!align=,
+ \c!headalign=,
+ \c!margin=\v!no,
+ \c!before=\blank,
+ \c!inbetween=\blank,
+ \c!after=\blank,
+ \c!indentnext=\v!yes,
+ \c!indenting=\v!never,
+ \c!titleleft=(,
+ \c!titleright=),
+ \c!closesymbol=,
+ \c!closecommand=\wordright,
+ \c!command=,
+ \c!titlecommand=]
+
+\setupenumerations
+ [\c!location=\v!top,
+ \c!text=,
+ \c!way=\v!by\v!text,
+ \c!prefix=\v!no,
+ \c!prefixconnector=.,
+ \c!starter=,
+ \c!stopper=,
+ \c!number=\v!yes, % else description
+ \c!start=0,
+ \s!parent=\??dd]
+
+\setupdescriptions
+ [\c!expansion=\v!no,
+ \c!xmlsetup=,
+ \s!catcodes=,
+ \c!saveinlist=\v!yes]
+
+\setupenumerations
+ [\c!expansion=\v!no,
+ \c!xmlsetup=,
+ \s!catcodes=,
+ \c!saveinlist=\v!yes]
+
+\setupdescriptions
+ [\c!width=7em,
+ \c!distance=1em]
+
+\setupdescriptions[\c!width:\c!top=\localhsize] % undocumented, only width and distance
+% \setupdescriptions[\c!width:\c!left=7em,\c!distance=1em]
+% \setupdescriptions[\c!width:\c!right=7em,\c!distance=1em]
+
+
+\setuplabels
+ [\s!parent=\??dn]
+
+\setupindentations
+ [\c!style=\v!normal,
+ \c!headstyle=\v!normal,
+ \c!color=,
+ \c!headcolor=,
+ \c!width=\v!fit,
+ \c!text=\unknown,
+ \c!sample=,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!distance=1em,
+ \c!separator={ :}]
+
+\protect \endinput
diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua
new file mode 100644
index 000000000..7faf0d5b3
--- /dev/null
+++ b/tex/context/base/strc-doc.lua
@@ -0,0 +1,702 @@
+if not modules then modules = { } end modules ['strc-doc'] = {
+ version = 1.001,
+ comment = "companion to strc-doc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: associate counter with head
+
+-- we need to freeze and document this module
+
+local next, type = next, type
+local format, gsub, find, concat, gmatch, match = string.format, string.gsub, string.find, table.concat, string.gmatch, string.match
+local texsprint, texwrite = tex.sprint, tex.write
+local concat = table.concat
+local max, min = math.max, math.min
+
+local ctxcatcodes = tex.ctxcatcodes
+local variables = interfaces.variables
+
+--~ if not trackers then trackers = { register = function() end } end
+
+local trace_sectioning = false trackers.register("structure.sectioning", function(v) trace_sectioning = v end)
+local trace_detail = false trackers.register("structure.detail", function(v) trace_detail = v end)
+
+local function report(...)
+--~ print(...)
+ logs.report("sectioning:",...)
+end
+
+structure = structure or { }
+structure.helpers = structure.helpers or { }
+structure.documents = structure.documents or { }
+structure.sections = structure.sections or { }
+structure.sets = structure.sets or { }
+structure.processors = structure.processors or { }
+
+local helpers = structure.helpers
+local documents = structure.documents
+local sections = structure.sections
+local sets = structure.sets
+local processors = structure.processors
+
+-- -- -- document -- -- --
+
+local data
+
+function documents.initialize()
+ data = {
+ numbers = { },
+ forced = { },
+ ownnumbers = { },
+ status = { },
+ checkers = { },
+ depth = 0,
+ blocks = { },
+ block = "",
+ }
+ documents.data = data
+end
+
+function documents.reset()
+ data.numbers = { }
+ data.forced = { }
+ data.ownnumbers = { }
+ data.status = { }
+--~ data.checkers = { }
+ data.depth = 0
+end
+
+documents.initialize()
+
+-- -- -- sections -- -- --
+
+jobsections = jobsections or { }
+jobsections.collected = jobsections.collected or { }
+jobsections.tobesaved = jobsections.tobesaved or { }
+
+local collected, tobesaved = jobsections.collected, jobsections.tobesaved
+
+--~ local function initializer()
+--~ collected, tobesaved = jobsections.collected, jobsections.tobesaved
+--~ end
+
+--~ job.register('jobsections.collected', jobsections.tobesaved, initializer)
+
+function sections.currentid()
+ return #tobesaved
+end
+
+function sections.save(sectiondata)
+-- local sectionnumber = helpers.simplify(section.sectiondata) -- maybe done earlier
+ local numberdata = sectiondata.numberdata
+ if not numberdata or sectiondata.metadata.nolist then
+ return #tobesaved
+ else
+ local n = #tobesaved + 1
+ tobesaved[n] = numberdata
+ if not collected[n] then
+ collected[n] = numberdata
+ end
+ return n
+ end
+end
+
+function sections.load()
+ setmetatable(collected,nil)
+ local l = structure.lists.collected
+ for i=1,#l do
+ local li = l[i]
+ local lm = li.metadata
+ if lm and lm.kind == "section" and not lm.nolist then
+ local ln = li.numberdata
+ if ln then
+ collected[#collected+1] = ln
+ end
+ end
+ end
+ sections.load = nil
+end
+
+setmetatable(collected, {
+ __index = function(t,i)
+ sections.load()
+ return t[i] or { }
+ end
+})
+
+--
+
+structure.sections.levelmap = structure.sections.levelmap or { }
+
+local levelmap = structure.sections.levelmap
+
+storage.register("structure/sections/levelmap", structure.sections.levelmap, "structure.sections.levelmap")
+
+sections.verbose = true
+
+levelmap.block = -1
+
+function sections.setlevel(name,level) -- level can be number or parent (=string)
+ local l = tonumber(level)
+ if not l then
+ l = levelmap[level]
+ end
+ if l and l > 0 then
+ levelmap[name] = l
+ else
+ -- error
+ end
+end
+
+function sections.getlevel(name)
+ return levelmap[name] or 0
+end
+
+function sections.way(way,by)
+ texsprint(ctxcatcodes,(gsub(way,"^"..by,"")))
+end
+
+function sections.setblock(name)
+ local block = name or data.block or "unknown" -- can be used to set the default
+ data.block = block
+ texwrite(block)
+end
+
+function sections.pushblock(name)
+ structure.counters.check(0) -- we assume sane usage of \page between blocks
+ local block = name or data.block
+ data.blocks[#data.blocks+1] = block
+ data.block = block
+ documents.reset()
+ texwrite(block)
+end
+
+function sections.popblock()
+ data.blocks[#data.blocks] = nil
+ local block = data.blocks[#data.blocks] or data.block
+ data.block = block
+ documents.reset()
+ texwrite(block)
+end
+
+function sections.currentblock()
+ return data.block or data.blocks[#data.blocks] or "unknown"
+end
+
+function sections.currentlevel()
+ return data.depth
+end
+
+function sections.getcurrentlevel()
+ texwrite(data.depth)
+end
+
+function sections.somelevel(given)
+ -- old number
+ local numbers, ownnumbers, forced, status, olddepth = data.numbers, data.ownnumbers, data.forced, data.status, data.depth
+ local givenname = given.metadata.name
+ local mappedlevel = levelmap[givenname]
+ local newdepth = tonumber(mappedlevel or (olddepth > 0 and olddepth) or 1) -- hm, levelmap only works for section-*
+ local directives = given.directives
+ local resetset = (directives and directives.resetset) or ""
+ -- local resetter = sets.getall("structure:resets",data.block,resetset)
+ -- a trick to permits userdata to overload title, ownnumber and reference
+ -- normally these are passed as argument but nowadays we provide several
+ -- interfaces (we need this because we want to be compatible)
+ if trace_detail then
+ logs.report("structure","name '%s', mapped level '%s', old depth '%s', new depth '%s', reset set '%s'",givenname,mappedlevel,olddepth,newdepth,resetset)
+ end
+ local u = given.userdata
+ if u then
+ -- kind of obsolete as we can pass them directly anyway
+ if u.reference and u.reference ~= "" then given.metadata.reference = u.reference ; u.reference = nil end
+ if u.ownnumber and u.ownnumber ~= "" then given.numberdata.ownnumber = u.ownnumber ; u.ownnumber = nil end
+ if u.title and u.title ~= "" then given.titledata.title = u.title ; u.title = nil end
+ if u.bookmark and u.bookmark ~= "" then given.titledata.bookmark = u.bookmark ; u.bookmark = nil end
+ if u.label and u.label ~= "" then given.titledata.label = u.label ; u.label = nil end
+ end
+ -- so far for the trick
+ if newdepth > olddepth then
+ for i=olddepth+1,newdepth do
+ local s = tonumber(sets.get("structure:resets",data.block,resetset,i))
+ if trace_detail then
+ logs.report("structure","new>old (%s>%s), reset set '%s', reset value '%s', current '%s'",olddepth,newdepth,resetset,s or "?",numbers[i] or "?")
+ end
+ if not s or s == 0 then
+ numbers[i] = numbers[i] or 0
+ ownnumbers[i] = ownnumbers[i] or ""
+ else
+ numbers[i] = s - 1
+ ownnumbers[i] = ""
+ end
+ status[i] = { }
+ end
+ elseif newdepth < olddepth then
+ for i=olddepth,newdepth+1,-1 do
+ local s = tonumber(sets.get("structure:resets",data.block,resetset,i))
+ if trace_detail then
+ logs.report("structure","new<old (%s<%s), reset set '%s', reset value '%s', current '%s'",olddepth,newdepth,resetset,s or "?",numbers[i] or "?")
+ end
+ if not s or s == 0 then
+ numbers[i] = numbers[i] or 0
+ ownnumbers[i] = ownnumbers[i] or ""
+ else
+ numbers[i] = s - 1
+ ownnumbers[i] = ""
+ end
+ status[i] = nil
+ end
+ end
+ structure.counters.check(newdepth)
+ ownnumbers[newdepth] = given.numberdata.ownnumber or ""
+ given.numberdata.ownnumber = nil
+ data.depth = newdepth
+ -- new number
+ olddepth = newdepth
+ if given.metadata.increment then
+ local oldn, newn = numbers[newdepth] or 0, 0
+ local fd = forced[newdepth]
+ if fd then
+ if fd[1] == "add" then
+ newn = oldn + fd[2] + 1
+ else
+ newn = fd[2] + 1
+ end
+ if newn < 0 then
+ newn = 1 -- maybe zero is nicer
+ end
+ forced[newdepth] = nil
+ if trace_detail then
+ logs.report("structure","old depth '%s', new depth '%s, old n '%s', new n '%s', forced '%s'",olddepth,newdepth,oldn,newn,concat(fd,""))
+ end
+ elseif newn then
+ newn = oldn + 1
+ if trace_detail then
+ logs.report("structure","old depth '%s', new depth '%s, old n '%s', new n '%s', increment",olddepth,newdepth,oldn,newn)
+ end
+ else
+ local s = tonumber(sets.get("structure:resets",data.block,resetset,newdepth))
+ if not s then
+ newn = oldn or 0
+ elseif s == 0 then
+ newn = oldn or 0
+ else
+ newn = s - 1
+ end
+ if trace_detail then
+ logs.report("structure","old depth '%s', new depth '%s, old n '%s', new n '%s', reset",olddepth,newdepth,oldn,newn)
+ end
+ end
+ numbers[newdepth] = newn
+ end
+ status[newdepth] = given or { }
+ for k, v in next, data.checkers do
+ if v[1] == newdepth and v[2] then
+ v[2](k)
+ end
+ end
+ local numberdata= given.numberdata
+ if not numberdata then
+ -- probably simplified to nothing
+ numberdata = { }
+ given.numberdata = numberdata
+ end
+ local n = { }
+ for i=1,newdepth do
+ n[i] = numbers[i]
+ end
+ numberdata.numbers = n
+ if #ownnumbers > 0 then
+ numberdata.ownnumbers = table.fastcopy(ownnumbers)
+ end
+ if trace_detail then
+ logs.report("structure","name '%s', numbers '%s', own numbers '%s'",givenname,concat(numberdata.numbers, " "),concat(numberdata.ownnumbers, " "))
+ end
+ given.references.section = sections.save(given)
+ -- given.numberdata = nil
+end
+
+function sections.writestatus()
+ if sections.verbose then
+ local numbers, ownnumbers, status, depth = data.numbers, data.ownnumbers, data.status, data.depth
+ local d = status[depth]
+ local o = concat(ownnumbers,".",1,depth)
+ local n = (numbers and concat(numbers,".",1,min(depth,#numbers))) or 0
+ local l = d.titledata.title or ""
+ local t = (l ~= "" and l) or d.titledata.title or "[no title]"
+ local m = d.metadata.name
+ if o and not find(o,"^%.*$") then
+ commands.writestatus("structure","%s @ level %i : (%s) %s -> %s",m,depth,n,o,t)
+ elseif d.directives and d.directives.hidenumber then
+ commands.writestatus("structure","%s @ level %i : (%s) -> %s",m,depth,n,t)
+ else
+ commands.writestatus("structure","%s @ level %i : %s -> %s",m,depth,n,t)
+ end
+ end
+end
+
+function sections.setnumber(depth,n)
+ local forced, depth, new = data.forced, depth or data.depth, tonumber(n)
+ if type(n) == "string" then
+ if find(n,"^[%+%-]") then
+ forced[depth] = { "add", new }
+ else
+ forced[depth] = { "set", new }
+ end
+ else
+ forced[depth] = { "set", new }
+ end
+end
+
+function sections.number_at_depth(depth)
+ return data.numbers[tonumber(depth) or sections.getlevel(depth) or 0] or 0
+end
+
+function sections.numbers()
+ return data.numbers
+end
+
+function sections.matching_till_depth(depth,numbers,parentnumbers)
+ local dn = parentnumbers or data.numbers
+ local ok = false
+ for i=1,depth do
+ if dn[i] == numbers[i] then
+ ok = true
+ else
+ return false
+ end
+ end
+ return ok
+end
+
+function sections.getnumber(depth) -- redefined later ...
+ texwrite(data.numbers[depth] or 0)
+end
+
+function sections.set(key,value)
+ data.status[data.depth][key] = value -- may be nil for a reset
+end
+
+function sections.cct()
+ local metadata = data.status[data.depth].metadata
+ texsprint((metadata and metadata.catcodes) or ctxcatcodes)
+end
+
+function sections.structuredata(depth,key,default,honorcatcodetable) -- todo: spec table and then also depth
+ if not depth or depth == 0 then depth = data.depth end
+ local data = data.status[depth]
+ local d = data
+ for k in gmatch(key,"([^.]+)") do
+ if type(d) == "table" then
+ d = d[k]
+ if not d then
+ -- unknown key
+ break
+ end
+ end
+ if type(d) == "string" then
+ if honorcatcodetable == true or honorcatcodetable == variables.auto then
+ local metadata = data.metadata
+ texsprint((metadata and metadata.catcodes) or ctxcatcodes,d)
+ elseif not honorcatcodetable then
+ texsprint(ctxcatcodes,d)
+ elseif type(honorcatcodetable) == "number" then
+ texsprint(honorcatcodetable,d)
+ elseif type(honorcatcodetable) == "string" and honorcatcodetable ~= "" then
+ honorcatcodetable = tex[honorcatcodetable] or ctxcatcodes-- we should move ctxcatcodes to another table, ctx or so
+ texsprint(honorcatcodetable,d)
+ else
+ texsprint(ctxcatcodes,d)
+ end
+ return
+ end
+ end
+ if default then
+ texsprint(ctxcatcodes,default)
+ end
+end
+
+function sections.userdata(depth,key,default)
+ if not depth or depth == 0 then depth = data.depth end
+ if depth > 0 then
+ local userdata = data.status[depth]
+ userdata = userdata and userdata.userdata
+ userdata = (userdata and userdata[key]) or default
+ if userdata then
+ texsprint(ctxcatcodes,userdata)
+ end
+ end
+end
+
+function sections.setchecker(name,level,command) -- hm, checkers are not saved
+ data.checkers[name] = (name and command and level >= 0 and { level, command }) or nil
+end
+
+function sections.current()
+ return data.status[data.depth]
+end
+
+function sections.depthnumber(n)
+ local depth = data.depth
+ if not n or n == 0 then
+ n = depth
+ elseif n < 0 then
+ n = depth + n
+ end
+ return texwrite(data.numbers[n] or 0)
+end
+
+function sections.autodepth(numbers)
+ for i=#numbers,1,-1 do
+ if numbers[i] ~= 0 then
+ return i
+ end
+ end
+ return 0
+end
+
+--
+
+function structure.currentsectionnumber() -- brr, namespace wrong
+ local sc = sections.current()
+ return sc and sc.numberdata
+end
+
+-- \dorecurse{3} {
+-- \chapter{Blabla} \subsection{bla 1 1} \subsection{bla 1 2}
+-- \section{bla 2} \subsection{bla 2 1} \subsection{bla 2 2}
+-- }
+
+-- sign=all => also zero and negative
+-- sign=positive => also zero
+-- sign=hang => llap sign
+
+function sections.typesetnumber(entry,kind,...) -- kind='section','number','prefix'
+ if entry and entry.hidenumber ~= true then -- can be nil
+ local separatorset = ""
+ local conversionset = ""
+ local conversion = ""
+ local stopper = ""
+ local starter = ""
+ local connector = ""
+ local set = ""
+ local segments = ""
+ local criterium = ""
+ local dataset = { ... }
+ for d=1,#dataset do
+ local data = dataset[d] -- can be multiple parametersets
+ if data then
+ if separatorset == "" then separatorset = data.separatorset or "" end
+ if conversionset == "" then conversionset = data.conversionset or "" end
+ if conversion == "" then conversion = data.conversion or "" end
+ if stopper == "" then stopper = data.stopper or "" end
+ if starter == "" then starter = data.starter or "" end
+ if connector == "" then connector = data.connector or "" end
+ if set == "" then set = data.set or "" end
+ if segments == "" then segments = data.segments or "" end
+ if criterium == "" then criterium = data.criterium or "" end
+ end
+ end
+ if separatorset == "" then separatorset = "default" end
+ if conversionset == "" then conversionset = "default" end -- not used
+ if conversion == "" then conversion = nil end
+ if stopper == "" then stopper = nil end
+ if starter == "" then starter = nil end
+ if connector == "" then connector = nil end
+ if set == "" then set = "default" end
+ if segments == "" then segments = nil end
+ --
+ if criterium == variables.strict then
+ criterium = 0
+ elseif criterium == variables.positive then
+ criterium = -1
+ elseif criterium == variables.all then
+ criterium = -1000000
+ else
+ criterium = 0
+ end
+ --
+ local firstprefix, lastprefix = 0, 16
+ if segments then
+ local f, l = match(tostring(segments),"^(.-):(.+)$")
+ if f and l then
+ -- 0:100, chapter:subsubsection
+ firstprefix = tonumber(f) or sections.getlevel(f) or 0
+ lastprefix = tonumber(l) or sections.getlevel(l) or 100
+ else
+ -- 3, section
+ local fl = tonumber(segments) or sections.getlevel(segments) -- generalize
+ if fl then
+ firstprefix, lastprefix = fl, fl
+ end
+ end
+ end
+ --
+ local numbers, ownnumbers = entry.numbers, entry.ownnumbers
+ if numbers then
+ local done, preceding = false, false
+ local function process(index) -- move to outer
+ -- todo: too much (100 steps)
+ local number = numbers and (numbers[index] or 0)
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > criterium or (ownnumber ~= "") then
+ local block = (entry.block ~= "" and entry.block) or sections.currentblock() -- added
+ if preceding then
+ local separator = sets.get("structure:separators",block,separatorset,preceding,".")
+ if separator then
+ processors.sprint(ctxcatcodes,separator)
+ end
+ preceding = false
+ end
+ if ownnumber ~= "" then
+ processors.sprint(ctxcatcodes,ownnumber)
+ -- elseif conversion and conversion ~= "" then
+ -- texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
+ elseif conversion and conversion ~= "" then
+ -- traditional (e.g. used in itemgroups)
+ texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
+ else
+ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+ processors.sprint(ctxcatcodes,theconversion,function(str)
+ return format("\\convertnumber{%s}{%s}",str or "numbers",number)
+ end)
+ end
+ preceding, done = index, true
+ else
+ preceding = preceding or false
+ end
+ end
+ --
+ local prefixlist = set and sets.getall("structure:prefixes","",set) -- "" == block
+ if starter then
+ processors.sprint(ctxcatcodes,starter)
+ end
+ if prefixlist and (kind == 'section' or kind == 'prefix') then
+ -- find valid set (problem: for sectionnumber we should pass the level)
+ -- if kind == "section" then
+ -- no holes
+ local b, e, bb, ee = 1, #prefixlist, 0, 0
+ -- find last valid number
+ for k=e,b,-1 do
+ local prefix = prefixlist[k]
+ local index = sections.getlevel(prefix) or k
+ if index >= firstprefix and index <= lastprefix then
+ local number = numbers and numbers[index]
+ if number then
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > 0 or (ownnumber ~= "") then
+ break
+ else
+ e = k -1
+ end
+ end
+ end
+ end
+ -- find valid range
+ for k=b,e do
+ local prefix = prefixlist[k]
+ local index = sections.getlevel(prefix) or k
+ if index >= firstprefix and index <= lastprefix then
+ local number = numbers and numbers[index]
+ if number then
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > 0 or (ownnumber ~= "") then
+ if bb == 0 then bb = k end
+ ee = k
+ else
+ bb, ee = 0, 0
+ end
+ else
+ break
+ end
+ end
+ end
+ -- print valid range
+ for k=bb,ee do
+ local prefix = prefixlist[k]
+ local index = sections.getlevel(prefix) or k
+ if index >= firstprefix and index <= lastprefix then
+ process(index)
+ end
+ end
+ -- else
+ -- for k=1,#prefixlist do
+ -- local prefix = prefixlist[k]
+ -- local index = sections.getlevel(prefix) or k
+ -- if index >= firstprefix and index <= lastprefix then
+ -- process(index)
+ -- end
+ -- end
+ -- end
+ else
+ -- also holes check
+ for prefix=firstprefix,lastprefix do
+ process(prefix)
+ end
+ end
+ --
+ if done and connector and kind == 'prefix' then
+ processors.sprint(ctxcatcodes,connector)
+ elseif done and stopper then
+ processors.sprint(ctxcatcodes,stopper)
+ end
+ else
+ -- report("error: no numbers")
+ end
+ end
+end
+
+function sections.title()
+ local sc = sections.current()
+ if sc then
+ helpers.title(sc.titledata.title,sc.metadata)
+ end
+end
+
+function sections.findnumber(depth,what)
+ local data = data.status[depth or data.depth]
+ if data then
+ local index = data.references.section
+ local collected = jobsections.collected
+ local sectiondata = collected[index]
+ if sectiondata and sectiondata.hidenumber ~= true then -- can be nil
+ if what == variables.first then
+ for i=index,1,-1 do
+ local s = collected[i]
+ local n = s.numbers
+ if #n == depth and n[depth] and n[depth] ~= 0 then
+ sectiondata = s
+ elseif #n < depth then
+ break
+ end
+ end
+ elseif what == variables.last then
+ for i=index,#collected do
+ local s = collected[i]
+ local n = s.numbers
+ if #n == depth and n[depth] and n[depth] ~= 0 then
+ sectiondata = s
+ elseif #n < depth then
+ break
+ end
+ end
+ end
+ return sectiondata
+ end
+ end
+end
+
+function sections.fullnumber(depth,what,raw)
+ local sectiondata = sections.findnumber(depth,what)
+ if sectiondata then
+ sections.typesetnumber(sectiondata,'section',sectiondata)
+ end
+end
+
+function sections.getnumber(depth,what) -- redefined here
+ local sectiondata = sections.findnumber(depth,what)
+ texwrite((sectiondata and sectiondata.numbers[depth]) or 0)
+end
diff --git a/tex/context/base/strc-doc.mkiv b/tex/context/base/strc-doc.mkiv
new file mode 100644
index 000000000..e10efb3f7
--- /dev/null
+++ b/tex/context/base/strc-doc.mkiv
@@ -0,0 +1,216 @@
+%D \module
+%D [ file=strc-doc,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Document Structure,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Document Structure}
+
+\registerctxluafile{strc-doc}{1.001}
+
+\unprotect
+
+\def\c!xmlsetup{xmlsetup}
+
+% We operate in a \type {@@ns} namespace. All data is passed through
+% variables. Of course we can built another interface on top of this
+% that accepts multiple arguments. We might change this approach and
+% remove this layer.
+
+\def\currentstructurecounter{0}
+
+\definesystemvariable {ns}
+
+\def\structureparameter#1{\csname\??ns#1\endcsname}
+
+\def\detokenizedstructureparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??ns#1\endcsname}}
+
+\def\structurecomponent{\dodoubleempty\dostructurecomponent}
+
+\getparameters % initialization, used not grouped anyway
+ [\??ns]
+ [\c!number=,\c!level=,\c!name=,\c!title=,\c!bookmark=,\c!marking=,\c!list=,\c!label=,\c!coupling=,\c!ownnumber=,
+ \c!sectionseparatorset=\s!default,\c!sectionconversionset=\s!default,
+ \c!sectionstopper=,\c!sectionstarter,\c!sectionsegments=,
+ \c!sectionresetset=,\c!reference=,
+ \c!expansion=\v!no,
+ \c!xmlsetup=,
+ \s!catcodes=,
+ \c!saveinlist=\v!yes,
+ \c!command=\showstructuredata]
+
+% maybe flags for list, bm, mark
+%
+% hm messed up
+
+\def\dostructurecomponent[#1][#2]% #1=interfaced-settings, #2=optional user data (not yet supported)
+ {\begingroup
+ \getparameters[\??ns][#1]%
+ \xdef\currentstructurename {\structureparameter\c!name}%
+ \xdef\currentstructurecoupling {\structureparameter\c!coupling}%
+ \xdef\currentstructureownnumber {\structureparameter\c!ownnumber}% optional own number
+ \xdef\currentstructurelevel {\structureparameter\c!level}%
+ \edef\currentstructureexpansion {\structureparameter\c!expansion}%
+ \xdef\currentstructurexmlsetup {\structureparameter\c!xmlsetup}%
+ \xdef\currentstructurecatcodes {\structureparameter\s!catcodes}%
+ \xdef\currentstructurelabel {\structureparameter\c!label}%
+ \xdef\currentstructurereference {\structureparameter\c!reference}%
+ \xdef\currentstructurereferenceprefix{\structureparameter\c!referenceprefix}%
+ \xdef\currentstructureshownumber {\structureparameter\c!number}%
+ \xdef\currentstructuresaveinlist {\structureparameter\c!saveinlist}%
+ \xdef\currentstructureincrementnumber{\structureparameter\c!incrementnumber}%
+ \ifx\currentstructureexpansion\s!xml
+ \xmlstartraw
+ \xdef\currentstructuretitle {\structureparameter\c!title}%
+ \xdef\currentstructurebookmark{\structureparameter\c!bookmark}%
+ \xdef\currentstructuremarking {\structureparameter\c!marking}%
+ \xdef\currentstructurelist {\structureparameter\c!list}%
+ \xmlstopraw
+ \ifx\currentstructurelist\empty
+ \globallet\currentstructurelist\currentstructuretitle
+ \fi
+ \globallet\currentstructurecoding\s!xml
+ \else
+ \ifx\currentstructureexpansion\v!yes
+ \xdef\currentstructuretitle {\structureparameter\c!title}%
+ \xdef\currentstructurebookmark{\structureparameter\c!bookmark}%
+ \xdef\currentstructuremarking {\structureparameter\c!marking}%
+ \xdef\currentstructurelist {\structureparameter\c!list}%
+ \else
+ \xdef\currentstructuretitle {\detokenizedstructureparameter\c!title}%
+ \xdef\currentstructurebookmark{\detokenizedstructureparameter\c!bookmark}%
+ \xdef\currentstructuremarking {\detokenizedstructureparameter\c!marking}%
+ \xdef\currentstructurelist {\detokenizedstructureparameter\c!list}%
+ \iflocation \ifx\currentstructurebookmark\empty
+ \begingroup
+ \simplifycommands
+ \xdef\currentstructurebookmark{\detokenize\expandafter{\normalexpanded{\structureparameter\c!title}}}%
+ \endgroup
+ \fi \fi
+ \fi
+ \ifx\currentstructurelist\empty
+ \globallet\currentstructurelist\currentstructuretitle
+ \fi
+ \globallet\currentstructurecoding\s!tex
+ \fi
+ \setnextinternalreference
+ \xdef\currentstructurenumber{\ctxlua{ % todo: combine with next call, adapt marks accordingly
+ structure.sections.somelevel {
+ references = {
+ internal = \nextinternalreference,
+ block = "\currentstructureblock",
+ reference = "\currentstructurereference",
+ referenceprefix = "\currentstructurereferenceprefix",
+ },
+ directives = {
+ resetset = "\structureparameter\c!sectionresetset",
+ },
+ metadata = {
+ kind = "section",
+ name = "\currentstructurename",
+ catcodes = \the\ifx\currentstructurecatcodes\empty\catcodetable\else\csname\currentstructurecatcodes\endcsname\fi,
+ coding = "\currentstructurecoding",
+ \ifx\currentstructurecoding\s!xml
+ xmlroot = "\xmldocument",
+ \fi
+ \ifx\currentstructurexmlsetup\empty \else
+ xmlsetup = "\currentstructurexmlsetup",
+ \fi
+ \ifx\currentstructuresaveinlist\v!no
+ nolist = true,
+ \fi
+ \ifx\currentstructureincrementnumber\v!yes
+ increment = "\currentstructureincrementnumber",
+ \fi
+ },
+ titledata = { % we can add mark and reference
+ label = \!!bs\detokenize\expandafter{\currentstructurelabel }\!!es,
+ title = \!!bs\detokenize\expandafter{\currentstructuretitle }\!!es,
+ \ifx\currentstructurebookmark\currentstructuretitle \else
+ bookmark = \!!bs\detokenize\expandafter{\currentstructurebookmark }\!!es,
+ \fi
+ \ifx\currentstructuremarking\currentstructuretitle \else
+ marking = \!!bs\detokenize\expandafter{\currentstructuremarking }\!!es,
+ \fi
+ \ifx\currentstructuresaveinlist\v!no \else
+ \ifx\currentstructurelist\currentstructuretitle \else
+ list = \!!bs\detokenize\expandafter{\currentstructurelist}\!!es,
+ \fi
+ \fi
+ },
+ numberdata = {
+ % needed ?
+ block = "\currentstructureblock",
+ hidenumber = \ifx\currentstructureshownumber\v!no true\else nil\fi, % titles
+ % so far
+ separatorset = "\structureparameter\c!sectionseparatorset",
+ conversion = "\structureparameter\c!sectionconversion", % for good old times sake
+ conversionset = "\structureparameter\c!sectionconversionset",
+ starter = \!!bs\structureparameter\c!sectionstarter\!!es,
+ stopper = \!!bs\structureparameter\c!sectionstopper\!!es,
+ set = "\structureparameter\c!sectionset",
+ segments = "\structureparameter\c!sectionsegments",
+ ownnumber = "\currentstructureownnumber",
+ },
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#2}\!!es)
+ }
+ }}%
+ \xdef\currentstructurelistnumber{\ctxlua{structure.lists.push(structure.sections.current())}}%
+ % \currentstructuresynchronize has to be called someplace, since it introduces a node
+ \setstructuresynchronization\currentstructurelistnumber
+ \structureparameter\c!command
+ \endgroup}
+
+\let\currentstructurenumber \!!zerocount
+\let\currentstructurecounter \!!zerocount
+\let\previousstructurecounter\!!zerocount
+
+\def\setstructuresynchronization#1%
+ {\xdef\currentstructureattribute {\ctxlua {tex.write(jobreferences.setinternalreference("\currentstructurereferenceprefix","\currentstructurereference",\nextinternalreference,"\@@iafocus"))}}%
+ \xdef\currentstructuresynchronize{\ctxlatelua{structure.lists.enhance(#1)}}}
+
+\def\reportcurrentstructure{\ctxlua{structure.sections.writestatus()}}
+
+% Beware: we need to flush the data to the list explicitly. This is because
+% node in inserted and we may want control over when that happens.
+
+\def\showstructuredata
+ {\par
+ \dontleavehmode\begingroup
+ \currentstructuresynchronize
+ \currentstructureattribute
+ [\currentstructurename: \showstructurelevel: \currentstructuretitle]
+ \endgroup\par}
+
+% We can access the (stored) data with the following macros.
+%
+% \def\MyHeadCommand #1#2{\framed{#1}\framed{#2 / \structureuservariable{subtitle}}}
+% \def\MyListCommand#1#2#3{\externalfigure[\structurelistuservariable{figure}][height=5mm]#2}
+%
+% \setuphead[chapter][command=\MyHeadCommand]
+% \setuplist[chapter][alternative=command,command=\MyListCommand]
+%
+% \starttext
+% \setupheadertexts[chapter]
+% \setupinteraction[state=start]
+% \placebookmarks[chapter]
+% \placelist[chapter]
+% \startchapter[ownnumber=10,title=Ton,list=Hans,marking=Kees,bookmark=Bram][figure=cow.pdf,subtitle=oeps]
+% \stopchapter
+% \stoptext
+
+\def\structurevariable #1{\ctxlua{structure.sections.structuredata(nil,"#1")}}
+\def\structureuservariable #1{\ctxlua{structure.sections.userdata(nil,"#1")}}
+\def\structurenumber {\ctxlua{structure.sections.fullnumber()}}
+\def\structurecatcodedget #1{\ctxlua{structure.sections.structuredata(nil,"#1",nil,true)}} % bad name
+\def\structuregivencatcodedget#1#2{\ctxlua{structure.sections.structuredata(nil,"#1",nil,\number#2)}} % bad name
+\def\structureautocatcodedget #1#2{\ctxlua{structure.sections.structuredata(nil,"#1",nil,"#2")}}
+
+\protect \endinput
diff --git a/tex/context/base/strc-flt.lua b/tex/context/base/strc-flt.lua
new file mode 100644
index 000000000..466fd515e
--- /dev/null
+++ b/tex/context/base/strc-flt.lua
@@ -0,0 +1,9 @@
+if not modules then modules = { } end modules ['strc-flt'] = {
+ version = 1.001,
+ comment = "companion to strc-flt.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- nothing
diff --git a/tex/context/base/strc-flt.mkii b/tex/context/base/strc-flt.mkii
new file mode 100644
index 000000000..e64a439ec
--- /dev/null
+++ b/tex/context/base/strc-flt.mkii
@@ -0,0 +1,2143 @@
+%D \module
+%D [ file=strc-flt,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Floating Bodies,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Float Numbering}
+
+%D Some of the sidefloat settings should move to page-sid; now it's quite
+%D fuzzy the way the variables are set/reset.
+
+\unprotect
+
+\ifx\addlocalbackgroundtobox\undefined \def\addlocalbackgroundtobox{\resetglobal\gobbleoneargument} \fi
+
+\def\placefloats{\doflushfloats} % keep this one
+
+\def\floatparameter #1{\csname\??fl\currentfloat#1\endcsname}
+\def\floatcaptionparameter#1{\csname\??kj\currentfloat#1\endcsname}
+
+% \def\floatparameter #1{\csname \ifcsname\??fl\currentfloat#1\endcsname\??fl\currentfloat\else\??bk\fi#1\endcsname}
+% \def\floatcaptionparameter#1{\csname\??kj\ifcsname\??kj\currentfloat#1\endcsname \currentfloat \fi#1\endcsname}
+
+% for the moment we need to define the parameters anyway, first we need to implement a
+% proper parent chain (also for framed); no problem now that machines are fast (tests
+% show that this may save 20 k or more in the format)
+%
+% \def\floatparameter #1{\executeifdefined{\??fl\currentfloat#1}{\csname\??fl#1\endcsname}}
+% \def\floatcaptionparameter#1{\executeifdefined{\??kj\currentfloat#1}{\csname\??bk#1\endcsname}}
+
+\def\setupfloats
+ {\dodoubleargument\getparameters[\??bk]} % funny, why not \??fl, must be a reason
+
+\def\setupcaptions
+ {\dodoubleargument\getparameters[\??kj]}
+
+\def\dosetupfloat[#1][#2]%
+ {\def\docommand##1{\getparameters[\??fl##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\def\setupfloat
+ {\dodoubleargument\dosetupfloat}
+
+\def\dosetupcaption[#1][#2]%
+ {\def\docommand##1{\getparameters[\??kj##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\def\setupcaption
+ {\dodoubleargument\dosetupcaption}
+
+\def\doemptyblock#1%
+ {\localframed
+ [\??fl#1]
+ [\c!frame=\v!on,
+ \c!width=\@@bkwidth,
+ \c!height=\@@bkheight,
+ \c!location=\v!normal,
+ \c!offset=\@@bkoffset]%
+ {\getmessage\m!floatblocks{12}\empty}}
+
+% A complication is that we may have to handle a pagebreak
+% first, which in turn may issue a (postponed) float.
+% Therefore we may not trust on variable assignments before
+% we're realy dealing with the float. Some day I'll root out
+% the global settings.
+
+\def\docomplexplacefloat[#1][#2]% [#3]#4%
+ {\edef\currentfloat{#1}%
+ \doifelsenothing\currentfloat
+ {\let\currentfloat\v!figure}
+ {}% {\doifundefined{\??fl#1\c!default}{\let\currentfloat\v!figure}}%
+ \doifelsenothing{#2}
+ {\edef\floatlocation{\floatparameter\c!default}}
+ {\edef\floatlocation{#2}}%
+ \doifinsetelse\v!split{#2}
+ {\expanded{\dodocomplexsplitfloat[\currentfloat][\floatlocation]}}
+ {\expanded{\dodocomplexplacefloat[\currentfloat][\floatlocation]}}}
+
+\long\def\dodocomplexsplitfloat[#1][#2][#3]#4%
+ {\splitfloat{\dodocomplexplacefloat[#1][#2][#3]{#4}}}
+
+\def\flushfloatslist
+ {\v!left,\v!right,\v!inner,\v!outer,%
+ \v!backspace,\v!cutspace,%
+ \v!inleft,\v!inright,\v!inmargin,%
+ \v!leftmargin,\v!rightmargin,\v!leftedge,\v!rightedge,%
+ \v!innermargin,\v!outermargin,\v!inneredge,\v!outeredge,%
+ \v!text,\v!opposite}% \v!page
+
+\long\def\dodocomplexplacefloat[#1][#2][#3]#4%
+ {\flushnotes
+ \flushsidefloats % here !
+ \ifsomefloatwaiting
+ % this was \checkwaitingfloats spread all over
+ \doifinsetelse\v!always{#2}
+ {\showmessage\m!floatblocks5\empty}
+ {\expanded{\doifcommonelse{#2}{\flushfloatslist}}\doflushfloats\donothing}%
+ % but which should be done before using box \floatbox
+ \fi
+ \ifmargeblokken
+ \doifinset\v!margin{#2}\endgraf
+ \fi
+ \global\insidefloattrue
+ \begingroup % **
+ \ifmargeblokken
+ \doifinset\v!margin{#2}{\hsize\@@mbwidth}%
+ \fi
+ \the\everyinsidefloat
+ \let\@@extrafloat\empty
+ \presetmorefloatvariables{#2}%
+ \dowithnextboxcontent % better a \the\everyfloattoks
+ {\setlocalfloathsize
+ \floatparameter\c!inner
+ \fuzzysnappingfalse
+ \postponenotes} % new
+ {\doifsomething{\floatparameter\c!criterium}
+ {\ifdim\wd\nextbox>\floatparameter\c!criterium\relax
+ \edef\forcedfloatmethod{\executeifdefined{\??fl\currentfloat\c!fallback}\v!here}%
+ \fi}%
+ \xdocompletefloat{#1}{#3}{#1}{#2}{#1}{#4}% ** not yet done
+ % we need to carry over the par because of side floats
+ \doifnotinset\v!text{#2}{\carryoverpar\endgroup}%
+ \global\sidefloatdownshift \zeropoint
+ \global\sidefloatextrashift\zeropoint
+ \ifparfloat
+ \doifinset\v!reset{#2}\forgetsidefloats
+ \doinhibitblank
+ \fi}% better move this to side floats
+ \vbox}
+
+\def\xxdocompletefloat#1#2%
+ {\rightorleftpageaction{\let\@@extrafloat#1}{\let\@@extrafloat#2}}
+
+\chardef\textfloatmethod=0 % 0=raw 1=safe (.99) 2=tight (-1pt)
+\chardef\sidefloatmethod=1 % 0=raw 1=safe (.99) 2=tight (-1pt)
+
+\let\floatrotation\!!zerocount
+
+\long\def\presetfloatvariables#1#2#3#4%
+ {\doifcommonelse
+ {#2}
+ {\v!left,\v!right,\v!inner,\v!outer,%
+ \v!inleft,\v!inright,\v!inmargin,%
+ \v!backspace,\v!cutspace,%
+ \v!innermargin,\v!outermargin,\v!inneredge,\v!outeredge,%
+ \v!leftmargin,\v!leftedge,\v!rightmargin,\v!rightedge}
+ {\global\parfloattrue}
+ {\global\parfloatfalse}%
+ \ifinsidecolumns
+ \global\parfloatfalse
+ \fi
+ \global\sidefloatshift\zeropoint
+ \global\sidefloatmaximum\zeropoint
+ \global\chardef\sidefloatmethod\floatparameter\c!sidemethod
+ \global\chardef\textfloatmethod\floatparameter\c!textmethod
+ \global\chardef\sidefloatalign\zerocount
+ \globallet\floatrotation\!!zerocount
+ \calculatefloatskips
+ \ifparfloat
+ \processaction
+ [\floatparameter\c!sidealign]
+ [\v!height=>\global\chardef\sidefloatalign\plusone,%
+ \v!line=>\global\chardef\sidefloatalign\plustwo,% (***)
+ \v!depth=>\global\chardef\sidefloatalign\plusthree,%
+ \v!grid=>\global\chardef\sidefloatalign4,%
+ \v!halfline=>\global\chardef\sidefloatalign5]%
+% todo (test first): \doifinset\v!lokaal{#2}{\chardef\sidefloatalign\zerocount}%
+ \ifcase\sidefloatalign\relax % todo: optie v!lokaal => \else
+ \doifinset\v!height {#2}{\global\chardef\sidefloatalign\plusone}%
+ \doifinset\v!line {#2}{\global\chardef\sidefloatalign\plustwo}%
+ \doifinset\v!depth {#2}{\global\chardef\sidefloatalign\plusthree}%
+ \doifinset\v!grid {#2}{\global\chardef\sidefloatalign4}%
+ \doifinset\v!halfline{#2}{\global\chardef\sidefloatalign5}% meant for 'none'
+ \fi
+ \doifinset\v!high{#2}{\global\sidefloattopskip \zeropoint}%
+ \doifinset\v!low {#2}{\global\sidefloatbottomskip\zeropoint}%
+ \doifinset\v!fit {#2}
+ {\global\sidefloattopskip \zeropoint
+ \global\sidefloatbottomskip\zeropoint
+ \global\floatsideskip \zeropoint}%
+ \else
+ \processallactionsinset
+ [#2]
+ [ 90=>\globallet\floatrotation\commalistelement,%
+ 180=>\globallet\floatrotation\commalistelement,%
+ 270=>\globallet\floatrotation\commalistelement]%
+ \fi
+ \doifinsetelse\v!nonumber{#2}
+ {\global\nofloatnumbertrue}
+ {\doifelse{\floatcaptionparameter\c!number}\v!yes
+ {\global\nofloatnumberfalse}
+ {\global\nofloatnumbertrue}}%
+ \ConvertToConstant\doifelse{#4}{}
+ {\global\emptyfloatcaptiontrue}
+ {\global\emptyfloatcaptionfalse}%
+ \doifinsetelse\v!none{#2}
+ {\global\nofloatcaptiontrue}
+ {\ConvertToConstant\doifelse{#4}\v!none
+ {\global\nofloatcaptiontrue}
+ {\global\nofloatcaptionfalse}}%
+ \doif{\floatcaptionparameter\c!number}\v!none % new
+ {\global\nofloatcaptiontrue}%
+ \ifemptyfloatcaption \ifnofloatnumber
+ \global\nofloatcaptiontrue
+ \fi \fi}
+
+% documenteren in details
+
+\def\presetmorefloatvariables#1%
+ {\doifelse\@@bklocal\v!yes % fout keyword
+ \globalcenterfloatboxtrue
+ \globalcenterfloatboxfalse
+ \ifglobalcenterfloatbox
+ \localcenterfloatboxtrue
+ \else
+ \doifinsetelse\v!local{#1}
+ \localcenterfloatboxtrue
+ \localcenterfloatboxfalse
+ \fi
+ \doifnotcommon{\v!always,\v!here,\v!force}{#1} % ! ! ! ! ! !
+ {\globalcenterfloatboxfalse
+ \localcenterfloatboxfalse}}
+
+\def\setlocalfloathsize
+ {\iflocalcenterfloatbox
+ \seteffectivehsize
+ \hsize\localhsize
+ \fi}
+
+\appendtoks
+ \everyinsidefloat\emptytoks % in case it's called earlier
+ \dogetfloatdata
+\to \everyinsidefloat
+
+%\appendtoks
+% \fuzzysnappingfalse
+%\to \everyinsidefloat
+
+\def\doifrightpagefloatelse
+ {\ifdoublesided
+ \ifsinglesided
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\doifoddfloatpageelse
+ \fi
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
+
+\def\doifoddfloatpageelse
+ {\ifodd\purenumber\twopassfloatdata\space
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\appendtoks
+ \let\rightorleftpageaction\doifrightpagefloatelse
+\to \everyinsidefloat
+
+\newif\ifextrafloatactions \extrafloatactionstrue
+
+% \let\movesidefloat\gobbleoneargument
+
+% new : \place...[leftmargin,-2*line]; we need to catch fxtb:2*3
+% watch out: line alone aligns on the line ! ! !
+
+\def\movesidefloat[#1]% (-)n*line|x=,y=
+ {\global\sidefloatdownshift \zeropoint
+ \global\sidefloatextrashift\zeropoint
+ \doifassignmentelse{#1}%
+ {\bgroup
+ \getparameters[\??fl][\c!x=\zeropoint,\c!y=\zeropoint,#1]%
+ \ifgridsnapping
+ \getnoflines\@@fly
+ \global\sidefloatdownshift\noflines\lineheight
+ \else
+ \global\sidefloatdownshift\@@fly
+ \fi
+ \global\sidefloatextrashift\@@flx
+ \egroup}
+ {\movedownsidefloat[#1]}}
+
+\def\movedownsidefloat[#1]% already in core
+ {\bgroup
+ \cleanupfeatures
+ \doifinstringelse{:}{#1}
+ \donothing
+ {\def\docommand##1%
+ {\processaction
+ [##1]%
+ [ \v!line=>\dodocommand+,%
+ +\v!line=>\dodocommand+,%
+ -\v!line=>\dodocommand-]}%
+ \def\dodocommand##1%
+ {\ifdone\else\global\sidefloatdownshift\zeropoint\donetrue\fi
+ \global\advance\sidefloatdownshift##1\lineheight}%
+ \donefalse\expanded{\dorepeatwithcommand[#1]}\docommand
+ \def\docommand##1%
+ {\processaction
+ [##1]%
+ [ \v!hang=>\dodocommand+,%
+ +\v!hang=>\dodocommand+,%
+ -\v!hang=>\dodocommand-]}%
+ \def\dodocommand##1% inefficient but who cares
+ {\ifdone\else\global\sidefloatsidelines\zeropoint\donetrue\fi
+ \global\advance\sidefloatsidelines\plusone\relax}%
+ \donefalse\expanded{\dorepeatwithcommand[#1]}\docommand}%
+ \egroup}
+
+\def\hangsidefloat[#1]%
+ {\global\sidefloatsidelines#1\relax}
+
+\long\def\xdocompletefloat#1#2#3#4#5#6%
+ {\ifextrafloatactions
+ \doifinsetelse\v!text{#4}
+ {% fuzzy, text overloads left, since then it's a directive
+ \docompletefloat{#1}{#2}{#3}{#4}{#5}{#6}\nextbox}
+ {\let\@@extrafloat\empty
+ % \sidefloatdownshift will be reset afterwards, and can
+ % already be set at this point
+ \processallactionsinset
+ [#4] % ininner/inouter : for old times sake
+ [ \v!inner=>\xxdocompletefloat\v!left \v!right,
+ \v!outer=>\xxdocompletefloat\v!right \v!left,
+ \v!innermargin=>\xxdocompletefloat\v!leftmargin \v!rightmargin,
+ \v!outermargin=>\xxdocompletefloat\v!rightmargin\v!leftmargin,
+ \v!inneredge=>\xxdocompletefloat\v!leftedge \v!rightedge,
+ \v!outeredge=>\xxdocompletefloat\v!rightedge \v!leftedge,
+ \v!backspace=>\xxdocompletefloat\v!backspace \v!cutspace,
+ \v!cutspace=>\xxdocompletefloat\v!cutspace \v!backspace,
+% \v!margin=>\xxdocompletefloat\v!cutspace \v!backspace,
+ \v!left=>\xxdocompletefloat\v!left \v!left,
+ \v!right=>\xxdocompletefloat\v!right \v!right,
+ \v!line=>, % only -n*line is handled (see ***)
+ \s!unknown=>{\movedownsidefloat[\commalistelement]}]%
+ \ifx\@@extrafloat\empty
+ \docompletefloat{#1}{#2}{#3}{#4}{#5}{#6}\nextbox
+ \else
+ \docompletefloat{#1}{#2}{#3}{\@@extrafloat,#4}{#5}{#6}\nextbox
+ \fi}%
+ \else % downward compatible
+ \docompletefloat{#1}{#2}{#3}{#4}{#5}{#6}\nextbox
+ \fi}
+
+% pas op, maxbreedte niet instellen als plaats=links/rechts
+
+\def\setlocalfloatdimensions#1%
+ {\global\sidefloatshift \zeropoint % duplicate
+ \global\sidefloatmaximum\zeropoint\relax % duplicate
+ \ifextrafloatactions
+ \ifdim\sidefloatdownshift=\zeropoint\else
+ \global\setbox\floatbox\vbox
+ {\vskip\sidefloatdownshift\nointerlineskip\box\floatbox}%
+ \fi
+ \doifsomething{\floatparameter\c!minwidth}
+ {\scratchdimen\floatparameter\c!minwidth\relax
+ \ifdim\wd\floatbox<\scratchdimen
+ \global\setbox\floatbox\hbox to \scratchdimen
+ {\doifnot{\floatparameter\c!location}\v!left \hss
+ \box\floatbox%
+ \doifnot{\floatparameter\c!location}\v!right\hss}%
+ \fi}%
+ % todo: rand / rug
+ \doifinset\v!hanging{#1}
+ {\doifcommonelse{\v!inleft,\v!leftmargin}{#1}
+ {\letvalue{\??fl\currentfloat\c!maxwidth}\leftmarginwidth}%
+ {\doifcommon{\v!inright,\v!rightmargin}{#1}
+ {\letvalue{\??fl\currentfloat\c!maxwidth}\rightmarginwidth}}}%
+ \doifsomething{\floatparameter\c!maxwidth}
+ {\scratchdimen\floatparameter\c!maxwidth\relax
+ \ifdim\wd\floatbox>\scratchdimen
+ \doifcommonelse{\v!inright,\v!rightmargin,\v!rightedge
+ \v!inleft,\v!leftmargin,\v!leftedge}{#1}
+ {\global\sidefloatmaximum\scratchdimen}
+ {\global\setbox\floatbox\hbox to \scratchdimen
+ {\doifcommonelse{\v!right,\v!left}{#1}
+ {\doifnotinset\v!right{#1}\hss
+ \box\floatbox
+ \doifnotinset\v!left{#1}\hss}%
+ {\doifnot{\floatparameter\c!location}\v!left\hss
+ \box\floatbox
+ \doifnot{\floatparameter\c!location}\v!right\hss}}}%
+ \fi}%
+ \fi}
+
+\def\docomplexstarttextblock[#1][#2][#3]%
+ {\flushnotes
+ \flushsidefloats % hoort eigenlijk niet hier
+ \docomplexplacefloat[#1][\v!text,#2,\v!left][#3]}
+
+\long\def\docomplexreserveblock[#1][#2][#3][#4]#5%
+ {\getvalue{\e!place#1}[#3][#4]{#5}{\localframed[\??fl#1][#2]{#1}}}
+
+\def\docomplexstartreservetextblock[#1][#2][#3][#4]%
+ {\flushsidefloats % hoort eigenlijk niet hier
+ \docomplexreserveblock[#1][#2][\v!text,#3,\v!left][#4]}
+
+\def\definefloat
+ {\dotripleempty\dodefinefloat}
+
+\def\dodefinefloat[#1][#2][#3]% #1=naam #2=meervoud #3=parent
+ {\ifthirdargument
+ \redodefinefloat[#1][#2][#3]%
+ \else\ifsecondargument
+ \dododefinefloat[#1][#2]%
+ \else
+ \dododefinefloat[#1][#1]%
+ \fi\fi}
+
+% todo: \floatparameter + \currentfloat - saves many hash entries
+
+\def\dododefinefloat[#1][#2]% inherits from kj and not from parent
+ {\def\currentfloat{#1}%
+ \presetlocalframed[\??fl#1]%
+ \setupfloat
+ [#1]
+ [%\c!width=8\lineheight, % 15\bodyfontsize,
+ %\c!height=6\lineheight, % 10\bodyfontsize,
+ \c!offset=\v!overlay,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!minwidth=,
+ \c!maxwidth=,
+ \c!maxheight=,
+ \c!criterium=,
+ % inherited
+ \c!sidespacebefore=\@@bksidespacebefore,
+ \c!sidespaceafter=\@@bksidespaceafter,
+ \c!sidealign=\@@bksidealign, % \v!line
+ \c!margin=\@@bkmargin,
+ \c!leftmargin=\@@bkleftmargin,
+ \c!rightmargin=\@@bkrightmargin,
+ \c!innermargin=\@@bkinnermargin,
+ \c!outermargin=\@@bkoutermargin,
+ \c!leftmargindistance=\@@bkleftmargindistance,
+ \c!rightmargindistance=\@@bkrightmargindistance,
+ \c!frame=\@@bkframe,
+ \c!radius=\@@bkradius,
+ \c!corner=\@@bkcorner,
+ \c!location=\@@bklocation,
+ \c!background=\@@bkbackground,
+ \c!backgroundscreen=\@@bkbackgroundscreen,
+ \c!backgroundcolor=\@@bkbackgroundcolor,
+ \c!backgroundoffset=\@@bkbackgroundoffset,
+ \c!topframe=\@@bktopframe,
+ \c!bottomframe=\@@bkbottomframe,
+ \c!leftframe=\@@bkleftframe,
+ \c!rightframe=\@@bkrightframe,
+ \c!frameoffset=\@@bkframeoffset,
+ \c!framecolor=\@@bkframecolor,
+ %\c!local=\@@bklocal,
+ \c!textmethod=\@@bktextmethod,
+ \c!sidemethod=\@@bksidemethod,
+ \c!method=\@@bkmethod,
+ \c!pageboundaries=,
+ \c!default=]%
+ \setupcaption
+ [#1]
+ [\c!headstyle=\@@kjheadstyle,
+ \c!headcolor=\@@kjheadcolor,
+ \c!textstyle=\@@kjtextstyle,
+ \c!textcolor=\@@kjtextcolor,
+ \c!style=\@@kjstyle,
+ \c!color=\@@kjcolor,
+ \c!location=\@@kjlocation,
+ \c!grid=\@@kjgrid,
+ %\c!before=\@@kjbefore,
+ \c!inbetween=\@@kjinbetween,
+ %\c!after=\@@kjafter,
+ \c!spacebefore=\@@kjspacebefore,
+ \c!spaceinbetween=\@@kjspaceinbetween,
+ \c!spaceafter=\@@kjspaceafter,
+ \c!width=\@@kjwidth,
+ \c!minwidth=\@@kjminwidth,
+ \c!align=\@@kjalign,
+ \c!number=\@@kjnumber,
+ \c!way=\@@kjway,
+ \c!blockway=\@@kjblockway,
+ \c!sectionnumber=\@@kjsectionnumber,
+ \c!distance=\@@kjdistance,
+ \c!separator=\@@kjseparator,
+ \c!stopper=\@@kjstopper,
+ \c!suffix=\@@kjsuffix, % hook
+ \c!command=\@@kjcommand,
+ \c!conversion=\@@kjconversion,
+ \c!leftmargin=\@@kjleftmargin,
+ \c!rightmargin=\@@kjrightmargin,
+ \c!outermargin=\@@kjoutermargin,
+ \c!innermargin=\@@kjinnermargin,
+ \c!setups=\@@kjsetups,
+ ]%
+ \definenumber % \definelabel
+ [#1]
+ [\c!text=#1,
+ \c!location=\v!intext,
+ \c!way=\floatcaptionparameter\c!way,
+ \c!blockway=\floatcaptionparameter\c!blockway,
+ \c!sectionnumber=\floatcaptionparameter\c!sectionnumber,
+ \c!conversion=\floatcaptionparameter\c!conversion]%
+ \presetlabeltext[#1=\Word{#1}~]%
+ \newnodelocation{\v!float\@@thenumber{#1}}%
+ \dodefinefloatcommands[#1][#2]}
+
+\def\dodefinefloatcommands[#1][#2]%
+ {\definelist[#1]%
+ \presetheadtext[#2=\Word{#2}]%
+ \setvalue {\e!place\e!listof#2}{\dodoubleempty\doplacelist[#1]}%
+ \setvalue {\e!complete\e!listof#2}{\dotripleempty\dodocompletelist[#1][#2]}%
+ \setvalue {\e!place#1}{\dotripleempty\docomplexplacefloat[#1]}%
+ \setvalue {\e!reserve#1}{\doquadrupleempty\docomplexreserveblock[#1]}%
+ \setvalue {\e!start#1\e!text}{\dotripleempty\docomplexstarttextblock[#1]}%
+ \setvalue {\e!stop#1\e!text}{\dostoptextfloat}%
+ \setvalue{\e!start\e!reserve#1\e!text}{\doquadrupleempty\docomplexstartreservetextblock[#1]}%
+ \setvalue {\e!stop\e!reserve#1\e!text}{\dostoptextfloat}%
+ \setvalue {\e!emptyone#1}{\doemptyblock{#1}}%
+ \setvalue {\e!emptytwo#1}{\doemptyblock{#1}}}
+
+% \setupfloat[...][leftmargindistance=1cm,default={left,none}]
+
+\def\redodefinefloat[#1][#2][#3]% same label/number
+ {\presetlocalframed[\??fl#1]%
+ \copylocalframed[\??fl#1][\??fl#3]%
+ \copyparameters[\??fl#1][\??fl#3]
+ [\c!width,\c!height,%\c!local,
+ \c!maxwidth,\c!maxheight,\c!minwidth,
+ \c!margin,\c!sidespacebefore,\c!sidespaceafter,\c!sidealign,
+ \c!leftmargindistance,\c!rightmargindistance,\c!criterium,
+ \c!leftmargin,\c!rightmargin,\c!innermargin,\c!outermargin,
+ \c!frame,\c!radius,\c!corner,\c!location,\c!background,\c!framecolor,
+ \c!backgroundscreen,\c!backgroundcolor,\c!backgroundoffset,
+ \c!topframe,\c!bottomframe,\c!leftframe,\c!rightframe,
+ \c!frameoffset,\c!pageboundaries,\c!default,
+ \c!textmethod,\c!sidemethod,\c!method]%
+ \copyparameters[\??kj#1][\??kj#3]
+ [\c!location,\c!before,\c!inbetween,\c!after,
+ \c!spacebefore,\c!spaceinbetween,\c!spaceafter,
+ \c!width,\c!headstyle,\c!headcolor,\c!style,\c!color,
+ \c!textstyle,\c!textcolor,\c!minwidth,
+ \c!leftmargin,\c!rightmargin,\c!innermargin,\c!outermargin,
+ \c!align,\c!number,\c!way,\c!blockway,\c!setups,
+ \c!sectionnumber,\c!separator,\c!stopper,\c!suffix,\c!distance,\c!conversion]%
+ \definenumber[#1][#3]%
+ \presetlabeltext[#1=\labeltext{#3}]%
+ \dodefinefloatcommands[#1][#2]}
+
+\def\placefloat
+ {\dotripleempty\docomplexplacefloat}
+
+\installinsertion\topins
+\installinsertion\botins
+
+\newdimen\botinserted
+\newdimen\topinserted
+
+%D Extra float registers.
+
+\newif\ifsomefloatwaiting \somefloatwaitingfalse
+\newif\ifroomforfloat \roomforfloattrue
+\newif\ifnofloatpermitted \nofloatpermittedfalse
+
+\newcount\totalnoffloats \totalnoffloats =0
+\newcount\savednoffloats \savednoffloats =0
+\newcount\noffloatinserts \noffloatinserts=0
+
+\newbox\floatlist
+\newbox\savedfloatlist
+
+\newif\ifflushingfloats \flushingfloatsfalse
+
+\newbox\floattext
+
+\newdimen\floattextwidth
+\newdimen\floattextheight
+
+\newbox\floatbox
+\newbox\savedfloatbox
+
+\newdimen\floatwidth
+\newdimen\floatheight
+
+% the tricky part of getting float related two pass data is
+% that we should fetch is early but can only save it with
+% the composed float box; this determines the order: get it
+% before saving it
+
+\definetwopasslist{\s!float\s!data} \newcounter\noffloatdata
+
+\let\twopassfloatdata\realpageno
+
+\def\dosavefloatdata % \expanded
+ {\doglobal\increment\noffloatdata
+ \lazysavetaggedtwopassdata{\s!float\s!data}{\noffloatdata}{\noffloatpages}{\noexpand\realfolio}}% later {}{}{}{} and \getfirst...
+
+\def\dogetfloatdata % precedes save !
+ {\doglobal\increment\noffloatpages
+ \findtwopassdata{\s!float\s!data}{\noffloatpages}%
+ \iftwopassdatafound
+ \globallet\twopassfloatdata\twopassdata
+ \else
+ \globallet\twopassfloatdata\realpageno % \realfolio
+ \fi}
+
+\def\tracefloatnumber#1%
+ {\doifnot\@@bknumbering\v!nocheck{\tagnodelocation{\v!float\@@thenumber{#1}}}}
+
+\newconditional\retainfloatnumber
+
+\def\preparefloatnumber#1%
+ {\xdef\floatcaptionnumber{#1}%
+ \doifelsenodelocation{\v!float\@@thenumber{#1}}
+ \donothing {\chardef\nodelocationmode\zerocount}%
+ \doifelse\@@bknumbering\v!nocheck
+ {\incrementnumber[#1]%
+ \makesectionnumber[#1]%
+ \ifconditional\retainfloatnumber\decrementnumber[#1]\fi}
+ {\ifinsidecolumns
+ \chardef\nodelocationmode\zerocount
+ % to be perfected:
+ % \chardef\nodelocationmode\plustwo
+ \fi
+ \ifcase\nodelocationmode
+ \incrementnumber[#1]%
+ \makesectionnumber[#1]%
+ \ifconditional\retainfloatnumber\decrementnumber[#1]\fi
+ \else
+ % force check, so that we get a proper way-sync and
+ % can use the accumulated number
+ % \checknumber[#1]% \incrementnumber does this
+ \incrementnumber[#1]%
+ \savenumber[#1]%
+ % the real work is done here
+ \nextnodelocation{\v!float\@@thenumber{#1}}% better \nextfloatnumber
+ \analyzenodelocation{\v!float\@@thenumber{#1}}%
+ \scratchcounter\getnodelocationo{\v!float\@@thenumber{#1}}%
+ \advance\scratchcounter\minusone
+ % here we correct for 'per whatever handling'
+ \advance\scratchcounter-\accumulatednumber[#1]%
+ \setnumber[#1]\scratchcounter
+ \incrementnumber[#1]%
+ \makesectionnumber[#1]%
+ \restorenumber[#1]%
+ % now we're back to normal numbering
+ \fi}}
+
+%D test case:
+%D
+%D \starttyping
+%D \setupfloat[figure][criterium=\marginwidth,fallback=bottom]
+%D \dorecurse{3}{
+%D \chapter{test}
+%D \placefigure[bottom]{1}{\framed{bottom}}
+%D test
+%D \placetable[bottom]{1}{\framed{table}}
+%D test
+%D \placetable{2}{\framed{table}}
+%D test
+%D \placefigure[left]{2}{\framed{left but way too wide}}
+%D \input tufte
+%D \placefigure[left]{3}{\framed{left but ok}}
+%D \input tufte }
+%D \stoptyping
+
+% In \dofloatinfomessage wordt {{ }} gebruikt omdat anders
+% binnen \startpostponing...\stoppostponing geen goede
+% melding in de marge volgt: \ifinner is dan namelijk true.
+
+\def\dofloatinfomessage#1#2#3%
+ {\bgroup
+ \showmessage\m!floatblocks{#2}{#3}%
+ \setmessagetext\m!floatblocks{#2}%
+ \@EA\floatinfo\@EA#1\@EA{\currentmessagetext}%
+ \egroup}
+
+\def\dosavefloatinfo
+ {\dofloatinfomessage>2{\the\totalnoffloats}}
+
+\def\dofloatflushedinfo
+ {\bgroup
+ \!!counta\totalnoffloats
+ \advance\!!counta -\savednoffloats
+ \dofloatinfomessage<3{\the\!!counta}%
+ \egroup}
+
+\def\doinsertfloatinfo
+ {\dofloatinfomessage<4{\the\totalnoffloats}}
+
+\def\dogetfloat
+ {\ifsomefloatwaiting
+ \global\setbox\floatlist\vbox
+ {\unvbox\floatlist
+ \global\setbox\globalscratchbox\lastbox}%
+ \ifcenterfloatbox
+ \ifdim\wd\globalscratchbox<\hsize
+ \setbox\floatbox\hbox to \hsize{\hss\box\globalscratchbox\hss}%
+ \else
+ \setbox\floatbox\box\globalscratchbox % local !
+ % retain special alignments
+ \ifinsidecolumns
+ \ifdim\wd\floatbox>\makeupwidth
+ \wd\floatbox\makeupwidth
+ \fi
+ \fi
+ \fi
+ \else
+ \setbox\floatbox\box\globalscratchbox % local !
+ \fi
+ \global\advance\savednoffloats \minusone
+ \ifcase\savednoffloats
+ \global\somefloatwaitingfalse
+ \fi
+ \else
+ \global\savednoffloats\zerocount
+ \global\setbox\floatbox\emptybox
+ \fi}
+
+\def\uncenteredfloatbox
+ {\ifcenterfloatbox
+ \ifhbox\floatbox\relax % remove centering
+ \ifdim\wd\floatbox=\hsize
+ \ifhbox\floatbox
+ \setbox\scratchbox\hbox
+ {\unhbox\floatbox
+ \unskip\unskip
+ \global\setbox\globalscratchbox\lastbox}%
+ \box\globalscratchbox
+ \else
+ \box\floatbox
+ \fi
+ \else
+ \box\floatbox
+ \fi
+ \else
+ \box\floatbox
+ \fi
+ \else
+ \box\floatbox
+ \fi}
+
+\def\dosavefloat
+ {\global\setbox\floatlist\vbox
+ {\nointerlineskip
+ \uncenteredfloatbox
+ \unvbox\floatlist}%
+ \global\advance\savednoffloats \plusone
+ \global\somefloatwaitingtrue
+ \dosavefloatinfo
+ \nonoindentation}
+
+\def\doresavefloat
+ {\global\setbox\floatlist\vbox
+ {\nointerlineskip
+ \unvbox\floatlist
+ \uncenteredfloatbox}%
+ \global\advance\savednoffloats \plusone
+ \global\somefloatwaitingtrue}
+
+\def\doreversesavefloat
+ {\global\setbox\floatlist\vbox
+ {\nointerlineskip
+ \unvbox\floatlist
+ \uncenteredfloatbox}%
+ \global\advance\savednoffloats \plusone
+ \global\somefloatwaitingtrue
+ \dosavefloatinfo}
+
+% better (todo): \savednofsavedfloats
+
+\def\dosavefloatstatus
+ {\global\setbox\savedfloatlist\copy\floatlist
+ \global\setbox\savedfloatbox \copy\floatbox
+ \xdef\dorestorefloatstatus
+ {\global\setbox\floatlist\box\savedfloatlist
+ \global\setbox\floatbox \box\savedfloatbox
+ \global\savednoffloats\the\savednoffloats}}
+
+\let\dorestorefloatstatus\relax
+
+\ifx\doflushfloats\undefined \let\doflushfloats\relax \fi
+\ifx\flushfloatbox\undefined \let\flushfloatbox\relax \fi
+
+% needed in the splitter:
+
+\newcount\savedsavednoffloats
+
+\let\dopopsavedfloats\relax
+
+\def\dopushsavedfloats
+ {\global\setbox\savedfloatlist\box\floatlist
+ \global\savedsavednoffloats\savednoffloats
+ \global\savednoffloats\savednoffloats
+ \global\somefloatwaitingfalse
+ \gdef\dopopsavedfloats
+ {\global\advance\savednoffloats\savedsavednoffloats
+ \global\setbox\floatlist\vbox\bgroup
+ \ifvoid\floatlist \else\unvbox\floatlist \fi
+ \ifvoid\savedfloatlist\else\unvbox\savedfloatlist\fi
+ \egroup
+ \global\ifcase\savednoffloats
+ \somefloatwaitingfalse\else\somefloatwaitingtrue\fi
+ \globallet\dopopsavedfloats\relax}}
+
+\def\doflushsavedfloats % simplified \OTRONEdodoflushfloats
+ {\doloop
+ {\ifsomefloatwaiting
+ \dogetfloat
+ \dofloatflushedinfo
+ \docheckiffloatfits
+ \ifroomforfloat
+ \doplacefloatbox
+ \else
+ \doreversesavefloat
+ \exitloop
+ \fi
+ \else
+ \exitloop
+ \fi}}
+
+% top and bottom
+
+\newif\iftopofinsert
+\newif\iftestfloatbox
+\newif\ifcenterfloatbox \centerfloatboxtrue
+\newif\iflocalcenterfloatbox \localcenterfloatboxfalse
+\newif\ifglobalcenterfloatbox \globalcenterfloatboxfalse
+
+% beter de laatste skip buiten de \insert uitvoeren,
+% bovendien bij volle flush onder baseline.
+
+\def\betweenfloatblanko% assumes that \@@bkspaceafter is present
+ {\bgroup
+ \setbox0\vbox{\strut\blank[\@@bkspacebefore]\strut}%
+ \setbox2\vbox{\strut\blank[\@@bkspaceafter ]\strut}%
+ \ifdim\ht0>\ht2
+ \blank[-\@@bkspaceafter,\@@bkspacebefore]%
+ \fi
+ \egroup}
+
+\def\doplacefloatbox
+ {%\forgetall % NJET!
+ \whitespace
+ \blank[\@@bkspacebefore]
+ \flushfloatbox
+ \blank[\@@bkspaceafter]}
+
+\ifx\someherefloat\undefined \let\someherefloat\doplacefloatbox \fi
+\ifx\somefixdfloat\undefined \let\somefixdfloat\doplacefloatbox \fi
+\ifx\somepagefloat\undefined \let\somepagefloat\doplacefloatbox \fi
+\ifx\sometopsfloat\undefined \let\sometopsfloat\doplacefloatbox \fi
+\ifx\somebotsfloat\undefined \let\somebotsfloat\doplacefloatbox \fi
+
+\ifx\somesidefloat\undefined \let\somesidefloat\doplacefloatbox \fi
+\ifx\somefacefloat\undefined \let\somefacefloat\doplacefloatbox \fi
+\ifx\sometextfloat\undefined \let\sometextfloat\doplacefloatbox \fi
+
+% brr, wordt deze niet overladen in page-one? weg er mee
+
+% \def\somepagefloat[#1]% links, rechts, midden, hoog, midden, laag
+% {%\checkwaitingfloats{#1}%
+% \global\setbox\collectedpagefloats\vbox
+% {\unvbox\collectedpagefloats
+% \vbox to \textheight
+% {\doifnotinset\v!high{#1}\vfill
+% \box\floatbox
+% \doifnotinset\v!low{#1}\vfill}%
+% \goodbreak}%
+% \doinsertfloatinfo}
+
+% \def\OTRONEsomepagefloat[#1]%
+% {%\checkwaitingfloats{#1}%
+% \global\setbox\collectedpagefloats\vbox
+% {\ifvoid\collectedpagefloats\else\unvbox\collectedpagefloats\fi
+% \vbox to \textheight % vss and unvbox catch too high and limited floats
+% {\vss
+% \doifnotinset\v!high{#1}\vfill
+% \unvbox\floatbox
+% \doifnotinset\v!low{#1}\vfill
+% \vss}%
+% \goodbreak}%
+% \doinsertfloatinfo}
+
+% test case:
+%
+% \placefigure[page,none]{}{\blackrule[width=\textwidth,height=0.9\textheight,color=green]}
+% \placefigure[page,none]{}{\blackrule[width=\textwidth,height=1.0\textheight,color=green]}
+% \placefigure[page,none]{}{\blackrule[width=\textwidth,height=1.1\textheight,color=green]}
+
+\def\sometextfloat[#1]% lang, links, rechts, hoog, midden, laag, offset
+ {%\checkwaitingfloats{#1}%
+ \gdef\dostoptextfloat{\dodostoptextfloat[#1]}% brr global
+ \global\floattextwidth\hsize
+ \global\floatwidth\wd\floatbox
+ \global\floatheight\ht\floatbox % forget about the depth
+ \global\advance\floattextwidth -\floatwidth
+ \global\advance\floattextwidth -\@@bkmargin\relax % was \tfskipsize
+ \doifinsetelse\v!tall{#1}
+ {\floattextheight\pagegoal
+ \advance\floattextheight -\pagetotal
+ \advance\floattextheight -\bigskipamount % lelijk
+ \ifdim\floattextheight>\textheight
+ \floattextheight\textheight
+ \fi
+ \boxmaxdepth\zeropoint \relax % toegevoegd
+ \ifdim\floattextheight<\floatheight
+ \floattextheight\floatheight
+ \fi
+ \setbox\floattext\vbox to \floattextheight}
+ {\setbox\floattext\vbox}%
+ \bgroup
+ \forgetall \setupblank \setupwhitespace % new, also needed for footnotes
+ \blank[\v!disable]
+ \hsize\floattextwidth
+ \ignorespaces}
+
+\def\dodostoptextfloat[#1]% % de tekst kan beter in een soort
+ {\egroup % kadertekst zonder kader, is flexibeler
+ \doifnotinset\v!tall{#1}% en beter
+ {\ifdim\ht\floattext<\floatheight
+ \floattextheight\floatheight
+ \else
+ \floattextheight\ht\floattext
+ \fi}%
+ \setbox\floatbox\vbox to \floattextheight
+ {\hsize\floatwidth
+ \doifinsetelse\v!both{#1}%
+ {\doifinsetelse\v!low{#1}
+ {\vfill\box\floatbox}
+ {\doifinsetelse\v!middle{#1}
+ {\vfill\box\floatbox\vfill}
+ {\box\floatbox\vfill}}}
+ {\box\floatbox\vfill}}%
+ \setbox\floattext\vbox to \floattextheight
+ {\hsize\floattextwidth
+ \doifinsetelse\v!low{#1}
+ {\vfill
+ \box\floattext
+ \doifinset\c!offset{#1}{\whitespace\blank}}
+ {\doifinsetelse\v!middle{#1}
+ {\vfill
+ \box\floattext
+ \vfill}
+ {\doifinset\v!offset{#1}{\whitespace\blank}%
+ \box\floattext
+ \vfill}}}%
+ \doifinsetelse\v!right{#1}% \floatmethod
+ {\setbox\floatbox\hbox to \hsize
+ {\box\floattext
+ \hfill
+ \box\floatbox}}
+ {\setbox\floatbox\hbox to \hsize
+ {\box\floatbox
+ \hfill
+ \box\floattext}}%
+ \baselinecorrection
+ \whitespace
+ \blank[\@@bkspacebefore]%
+ \doifnotinset\v!tall{#1}%
+ {\dp\floatbox\openstrutdepth}% dp\strutbox}% % toegevoegd
+ \box\floatbox
+ \blank[\@@bkspaceafter]%
+ \endgroup % **
+ \doinsertfloatinfo}
+
+\def\somefacefloat[#1]% links, rechts, midden, hoog, midden, laag
+ {%\checkwaitingfloats{#1}%
+ \startopposite\box\floatbox\stopopposite
+ \doinsertfloatinfo}
+
+\def\someelsefloat[#1]%
+ {\doifinsetelse\v!here{#1}
+ {\doifinsetelse\v!always{#1}
+ {\page[\v!preference]%
+ \docheckiffloatfits
+ \ifroomforfloat
+ \placesomeherefloat[#1]%
+ \else
+ \showmessage\m!floatblocks9\empty
+ \doreversesavefloat
+ \fi}
+ {\ifsomefloatwaiting
+ \dosavefloat
+ \else
+ \page[\v!preference]%
+ \docheckiffloatfits
+ \ifroomforfloat
+ \placesomeherefloat[#1]%
+ \else
+ \dosavefloat
+ \fi
+ \fi}}
+ {\doifinsetelse\v!always{#1}
+ {\docheckiffloatfits
+ \ifroomforfloat
+ \sometopbottomfloat[#1]
+ \else
+ \showmessage\m!floatblocks9\empty
+ \doreversesavefloat
+ \fi}
+ {\docheckiffloatfits
+ \ifroomforfloat
+ \sometopbottomfloat[#1]
+ \else
+ \dosavefloat
+ \fi}}}
+
+\def\floatautofactor{.5}
+
+\def\sometopbottomfloat[#1]%
+ {\doifelse\floatmethod\v!auto
+ {\ifdim\pagetotal<\floatautofactor\pagegoal % when empty page, maxdimen
+ \placesometopsfloat[#1]%
+ \else
+ \placesomebotsfloat[#1]%
+ \fi}
+ {\doifelse\floatmethod\v!top
+ {\placesometopsfloat[#1]}
+ {\doifelse\floatmethod\v!bottom
+ {\placesomebotsfloat[#1]}
+ {\placesomeherefloat[#1]}}}}
+
+% De onderstaande macro wordt gebruikt bij de macros
+% voor het plaatsen van tabellen en figuren (klopt niet
+% meer).
+%
+% \dofloat {plaats} {label1} {label2}
+%
+% \docompletefloat {nummer} {referentie} {lijst}
+% {plaats} {label1} {label2} {inhoud}
+%
+% \box\floatbox inhoud+referentie
+%
+% \do???float#1 #1 = boxnummer
+
+\newdimen\floatsideskip \floatsideskip =12pt
+\newdimen\floattopskip \floattopskip =\floattopskip
+\newdimen\floatbottomskip \floatbottomskip=\floattopskip
+
+\newdimen\sidefloattopskip \sidefloattopskip =\floattopskip
+\newdimen\sidefloatbottomskip \sidefloatbottomskip=\floatbottomskip
+
+\newskip\sidefloatdownshift
+\newskip\sidefloatleftshift
+\newskip\sidefloatrightshift
+
+\def\sidefloattopoffset {\openstrutdepth} % {\strutdp}
+
+\newcount\noftopfloats \noftopfloats=2
+\newcount\nofbotfloats \nofbotfloats=0
+
+\newif\ifnofloatcaption
+\newif\ifnofloatnumber
+\newif\ifemptyfloatcaption
+
+\def\docalculatefloatskip#1#2%
+ {\doifelsenothing{#2}
+ {\global#1\zeropoint}
+ {\doifelse{#2}\v!none
+ {\global#1\zeropoint}
+ {\setbox0\vbox{\whitespace\expanded{\blank[#2]}}%
+ \global#1\ht0}}}
+
+\def\calculatefloatskips
+ {{\docalculatefloatskip\floattopskip \@@bkspacebefore
+ \docalculatefloatskip\floatbottomskip \@@bkspaceafter
+ \docalculatefloatskip\sidefloattopskip {\floatparameter\c!sidespacebefore}%
+ \docalculatefloatskip\sidefloatbottomskip{\floatparameter\c!sidespaceafter }%
+ \gdef \sidefloattopoffset{\openstrutdepth}% was \def
+ \global\floatsideskip \floatparameter\c!margin
+ \global\sidefloatleftshift \floatparameter\c!leftmargindistance
+ \global\sidefloatrightshift\floatparameter\c!rightmargindistance
+ \global\noftopfloats \@@bkntop \relax
+ \global\nofbotfloats \@@bknbottom\relax}}
+
+\let\floatcaptionsuffix\empty % an optional suffix
+\let\floatcaptionnumber\empty % a logical counter
+
+% Quite experimental !
+
+% the split is needed when for instance the float goes into
+% a multi page field and the list of figs becomes larger than
+% one page: cycle between 'only flush when object ref ok'
+% and 'one/many page fig list'; see "uguide finometer"
+%
+% potential sync bug with sectionblocks, see uguide.tex
+
+\def\placefloatcaption
+ {\dodoubleempty\doplacefloatcaption}
+
+\long\def\doplacefloatcaption[#1][#2]#3%
+ {\setfloatcaption[#1][#2]{#3}%
+ \placefloatcaptiontext[#1]%
+ \placefloatcaptionreference[#1]}
+
+\def\setfloatcaption % \dosetfloatcaption already in use
+ {\dodoubleempty\dodosetfloatcaption} % beware, name clash
+
+\long\def\dodosetfloatcaption[#1][#2]#3% to do namespace for number/ascii
+ {\ifnofloatnumber % also handle trialtypesetting
+ \letgvalue{@fl@r@#1}\relax
+ \letgvalue{@fl@t@#1}\relax
+ \else
+ \preparefloatnumber{#1}%
+ \letgvalue{@fl@n@#1}\composedsectionnumber
+ % indirect macro can be more efficient
+ \setgvalue{@fl@r@#1}%
+ {\tracefloatnumber{#1}%
+\ifconditional\retainfloatnumber\else
+ \dowritetolist{#1}{\getvalue{@fl@n@#1}}{#3}{#1}%
+ \gdefconvertedargument\flasciititle{#3}% \asciititle is global
+ \doifsomething{#2}{\rawreference\s!flt{#2}{{\getvalue{@fl@n@#1}}{\flasciititle}}}%
+\fi
+ \letgvalue{@fl@r@#1}\relax}% nils
+ \setgvalue{@fl@t@#1}%
+ {\preparefullnumber{\??kj#1}{\getvalue{@fl@n@#1}}\preparednumber
+ \doattributes{\??kj#1}\c!style\c!color
+ {\doattributes{\??kj#1}\c!headstyle\c!headcolor
+ {\labeltexts{#1}{\preparednumber}}%
+ \doattributes{\??kj#1}\c!textstyle\c!textcolor
+ {\dotfskip{\floatcaptionparameter\c!distance}#3}}}%
+ \fi}
+
+\def\placefloatcaptiontext [#1]{\getvalue{@fl@t@#1}}
+\def\placefloatcaptionnumber [#1]{\getvalue{@fl@n@#1}}
+\def\placefloatcaptionreference[#1]{\getvalue{@fl@r@#1}}
+
+% still needed for uguide
+
+\let\placefloatlabel \placefloatcaption
+\let\placefloatlabeltext \placefloatcaptiontext
+\let\placefloatlabelreference \placefloatcaptionreference
+
+\def\borderedfloatbox
+ {\localframed[\??fl\currentfloat][\c!location=\v!normal]{\box\floatbox}}
+
+\newbox\captionbox
+
+\long\def\putcompletecaption#1#2%
+ {\doifsomething{\floatcaptionparameter\c!spacebefore}{\blank[\floatcaptionparameter\c!spacebefore]}%
+% \floatcaptionparameter\c!before % test for side effects first
+ \noindent
+ \xdef\lastcaptiontag{\strut#1}%
+ \dostartattributes{\??kj\currentfloat}\c!style\c!color\empty
+ \ifnofloatnumber
+ \else
+ \hbox{\doattributes{\??kj\currentfloat}\c!headstyle\c!headcolor{\strut#1}}%
+ \ifnofloatcaption \else \ifemptyfloatcaption \else
+ \doifelsenothing{\floatcaptionparameter\c!spaceinbetween}
+ {\scratchskip\floatcaptionparameter\c!distance\relax
+ \dotfskip\scratchskip\emergencystretch.5\scratchskip}
+ {\blank[\floatcaptionparameter\c!spaceinbetween]}%
+ \fi \fi
+ \fi
+ \ifnofloatcaption
+ \globallet\lastcaptionht\!!zeropoint
+ \globallet\lastcaptiondp\!!zeropoint
+ \else
+ \doattributes{\??kj\currentfloat}\c!textstyle\c!textcolor
+ {\xdef\lastcaptionht{\strutheight}%
+ \xdef\lastcaptiondp{\strutdepth}%
+ \begstrut#2\endstrut\endgraf}%
+ \fi
+ \dostopattributes
+% \floatcaptionparameter\c!after % test for side effects first
+ \doifsomething{\floatcaptionparameter\c!spaceafter}{\blank[\floatcaptionparameter\c!spaceafter]}}
+
+\let\lastcaptionht\!!zeropoint
+\let\lastcaptiondp\!!zeropoint
+
+% new
+
+\newbox\tempfloatbox
+\newbox\tempcaptionbox
+
+\newif\iftracecaptions
+
+\def\settracedcaptionbox
+ {\iftracecaptions\setbox\tempcaptionbox\ruledhbox{\box\tempcaptionbox}\fi}
+
+%\stelblokkopjesin[\c!width=5cm]
+%\stelblokkopjesin[\c!align=\v!left]
+%\stelblokkopjesin[\c!align=\v!right]
+
+
+% \definefloat [figure-1] [figure]
+% \definefloat [figure-2] [figure]
+% \setupfloat [figure-1] [location=left,leftmargin=10mm]
+% \setupfloat [figure-2] [location=left,leftmargin=-5mm]
+% \setupcaption [figure-1] [align=flushleft]
+% \setupcaption [figure-2] [align=flushleft,leftmargin=15mm]
+%
+% \startsetups somefigure
+% \ifdim\wd\nextbox>\textwidth
+% \placefloat[figure-2][][]{}{\box\nextbox}
+% \else
+% \placefloat[figure-1][][]{}{\box\nextbox}
+% \fi
+% \stopsetups
+%
+% \def\setupswithbox[#1]{\dowithnextbox{\setups[#1]}\vbox}
+%
+% test \setupswithbox[somefigure]{\framed[width=3cm] {}} test
+% test \setupswithbox[somefigure]{\framed[width=\dimexpr\textwidth+3cm\relax]{}} test
+
+\def\dosetcaptionthings
+ {\setups[\floatcaptionparameter\c!setups]% expanded ?
+% \advance\leftskip \floatcaptionparameter\c!leftmargin
+% \advance\rightskip\floatcaptionparameter\c!rightmargin
+ \relax}
+
+\def\dofakecaptionthings
+ {\hbox{\dosetcaptionthings\hskip\leftskip\hskip\rightskip}}
+
+\long\def\docheckcaptioncontent#1#2%
+ {\ifnofloatcaption \else
+ \setbox\tempcaptionbox\hbox
+ {\trialtypesettingtrue
+ \notesenabledfalse
+ \putcompletecaption{#1}{#2}}%
+ % new, \placefigure{\XMLflush{somecaption}}{} passes earlier empty check
+ % so here we misuse the scratch box; actually this means that the previous
+ % test can go away (some day, when i redo this module)
+ \ifdim\wd\tempcaptionbox=\zeropoint
+ \global\emptyfloatcaptiontrue
+ \ifnofloatnumber
+ \global\nofloatcaptiontrue
+ \fi
+ \else
+ \setbox\tempcaptionbox\hbox{\dosetcaptionthings\hskip\leftskip\box\tempcaptionbox}% yet incomplete
+ \fi
+ \fi}
+
+% minwidth=fit,width=max : no overshoot, as wide as graphic
+
+\ifx\moveboxontogrid\undefined \let\movecaptionontogrid\gobblethreearguments \fi
+
+\def\locatefloatbox
+ {\chardef\alignstrutmode\zerocount
+ \shiftalignedline
+ {\floatparameter\c!leftmargin }{\floatparameter\c!rightmargin}%
+ {\floatparameter\c!innermargin}{\floatparameter\c!outermargin}%
+ \alignedline{\floatparameter\c!location}\v!middle}
+
+\def\locatecaptionbox
+ {\chardef\alignstrutmode\zerocount
+ \shiftalignedline
+ {\floatcaptionparameter\c!leftmargin }{\floatcaptionparameter\c!rightmargin}%
+ {\floatcaptionparameter\c!innermargin}{\floatcaptionparameter\c!outermargin}%
+ \alignedline{\floatparameter\c!location}\v!middle}
+
+\long\def\dosetpagfloat#1#2#3% \copy wegwerken
+ {\bgroup
+ \setlocalfloathsize
+ \ifnum\floatrotation>0
+ \swapdimens\hsize\vsize
+ \fi
+ \forgetall
+ \postponenotes
+ \dontcomplain
+ \setbox\tempfloatbox\vbox{\borderedfloatbox}%
+ \let\locatefloat \locatefloatbox
+ \let\locatecaption\locatecaptionbox
+ \docheckcaptioncontent{#2}{#3}%
+ \ifcase\floatparameter\c!method
+ \or % automatic
+ \ifnofloatcaption
+ \dopreparenocaption{#1}{#2}{#3}%
+ \edef\width{\the\wd\floatbox}%
+ \doglobal\addlocalbackgroundtobox\floatbox
+ \else
+ % todo: installable maken, variant/method=auto vs macro
+ \dopreparedocaption{#1}{#2}{#3}%
+ \settracedcaptionbox
+ \edef\width{\the\wd\tempfloatbox}%
+ \addlocalbackgroundtobox\tempfloatbox
+ \setbox\tempcaptionbox\hbox
+ {\dosetcaptionthings
+ \floatcaptionparameter\c!command{\box\tempcaptionbox}}%
+ \moveboxontogrid\tempcaptionbox{\floatcaptionparameter\c!grid}\lastcaptionht
+ \addlocalbackgroundtobox\tempcaptionbox
+ \buildfloatbox
+ \fi
+ \or % semi automatic
+ \or % manual
+ \fi
+ \ifnum\floatrotation>0
+ \global\setbox\floatbox\vbox
+ {\rotate[\c!rotation=\floatrotation]{\box\floatbox}}%
+ \edef\width{\the\wd\tempfloatbox}%
+ \else
+ \postcenterfloatbox\width
+ \fi
+ \egroup}
+
+\def\captionminwidth {15\bodyfontsize}
+\def\captionovershoot {2em}
+
+\def\dopreparenocaption#1#2#3%
+ {\global\setbox\floatbox\vbox % pas op als wd groter dan hsize
+ {\ifinsidecolumns\ifdim\wd\tempfloatbox>\hsize
+ \let\locatefloat\relax
+ \fi\fi
+ \locatefloat{\copy\tempfloatbox}}}
+
+\def\dopreparedocaption#1#2#3%
+ {\doifinsetelse{\floatcaptionparameter\c!location}{\v!top,\v!bottom}
+ {\doifinsetelse{\floatcaptionparameter\c!width}{\v!fit,\v!max}
+ {\doifelse{\floatcaptionparameter\c!minwidth}\v!fit
+ {\doifelse{\floatcaptionparameter\c!width}\v!max
+ {\dopreparestackcaptionmax{#1}{#2}{#3}}
+ {\ifdim\wd\tempcaptionbox>\wd\tempfloatbox % wider caption
+ \doifelse{\floatcaptionparameter\c!width}\v!fit
+ {\dopreparestackcaptionaut{#1}{#2}{#3}}
+ {\dopreparestackcaptionwid{#1}{#2}{#3}}%
+ \else
+ \dopreparestackcaptionmin{#1}{#2}{#3}%
+ \fi}}
+ {\dopreparestackcaptionfix{#1}{#2}{#3}}}%
+ {\dopreparesidewidthcaption{#1}{#2}{#3}}}% new, special effects (see icare)
+ {\doifinsetelse{\floatcaptionparameter\c!width}{\v!fit,\v!max}
+ {\dopreparesideautocaption{#1}{#2}{#3}}
+ {\dopreparesidewidthcaption{#1}{#2}{#3}}}}
+
+% \def\dosettempcaptionbox
+% {\dosetraggedvbox{\floatcaptionparameter\c!align}%
+% \setbox\tempcaptionbox\raggedbox}
+
+\def\dosettempcaptionbox
+ {\setbox\tempcaptionbox\vbox\bgroup
+ %expanded{\setupalign[\v!new,\v!reset,\floatcaptionparameter\c!align,\v!old]}% wrong! see icare
+ \expanded{\setupalign[\v!reset,\floatcaptionparameter\c!align]}% i need to check what reset does
+ \dosetcaptionthings
+ \let\next}
+
+\def\dopreparesideautocaption#1#2#3%
+ {\scratchdimen\dimexpr\hsize-\wd\tempfloatbox-\@@bkmargin\relax % was \tfskipsize\relax
+ \ifdim\wd\tempcaptionbox>\scratchdimen
+ \ifdim\wd\tempcaptionbox<1.3\scratchdimen
+ \scratchdimen0.8\scratchdimen
+ \fi
+ \fi
+ \dosettempcaptionbox
+ {\hsize\scratchdimen
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparesidewidthcaption#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!width
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionfix#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!minwidth % special effects
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionmax#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\wd\tempfloatbox
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionwid#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!width
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionmin#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\wd\tempfloatbox
+ \doifnothing{\floatcaptionparameter\c!align}\raggedcenter % on purpose overloads align !
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionaut#1#2#3%
+ {\doifsomething{\floatcaptionparameter\c!align}
+ {\doifnotinset{\v!middle}{\floatcaptionparameter\c!align}%
+ {\let\captionovershoot\!!zeropoint}}%
+ \edef\captionhsize{\the\wd\tempfloatbox}%
+ \ifdim\captionhsize>\hsize
+ % float is wider than \hsize
+ \dosettempcaptionbox
+ {\trialtypesettingtrue
+ \hsize\captionhsize
+ \notesenabledfalse
+ \putcompletecaption{#2}{#3}}%
+ \ifdim\ht\scratchbox>\lineheight % more lines
+ \dosettempcaptionbox
+ {\hsize\captionhsize
+ \advance\hsize -\captionovershoot\relax
+ \ifdim\hsize<\captionminwidth\relax
+ \hsize\captionhsize
+ \fi
+ \putcompletecaption{#2}{#3}}%
+ \else
+ \dosettempcaptionbox
+ {\hsize\captionhsize
+ \putcompletecaption{#2}{#3}}%
+ \fi
+ \else
+ % float is smaller of equal to \hsize
+ \ifdim\captionhsize<\captionminwidth\relax
+ \scratchdimen\captionminwidth % float smaller than min width
+ \edef\captionhsize{\the\scratchdimen}%
+ \fi
+ \setbox\scratchbox\vbox % test with overshoot
+ {\trialtypesettingtrue
+ \scratchdimen\captionhsize
+ \advance\scratchdimen \captionovershoot
+ \advance\scratchdimen 3em % an average word length
+ \ifdim\scratchdimen<\hsize \hsize\scratchdimen \fi
+ \notesenabledfalse
+ \putcompletecaption{#2}{#3}}%
+ \ifdim\ht\scratchbox>\lineheight
+ % at least an average word longer than a line
+ \dosettempcaptionbox
+ {\scratchdimen\captionhsize
+ \advance\scratchdimen \captionovershoot
+ \ifdim\scratchdimen<\hsize \hsize\scratchdimen \fi
+ \putcompletecaption{#2}{#3}}%
+ \else
+ % just over a line, don't use an overshoot % % % todo: outer/inner and such
+ \doifcommonelse{\floatcaptionparameter\c!align}{\v!left,\v!right,\v!flushleft,\v!flushright}
+ {\dosettempcaptionbox
+ {\hsize\captionhsize
+ % strange : \raggedcenter
+ \putcompletecaption{#2}{#3}}}
+ {% nicer
+ \dosettempcaptionbox
+ {\hsize\captionhsize
+ \doifnothing{\floatcaptionparameter\c!align}\raggedcenter% overloads
+ \putcompletecaption{#2}{#3}}}%
+ \fi
+ \fi}
+
+\def\dopreparesidecaption#1#2#3%
+ {\scratchdimen\dimexpr\hsize-\wd\tempfloatbox-\@@bkmargin\relax % was \tfskipsize\relax
+ \ifdim\wd\tempcaptionbox>\scratchdimen
+ \ifdim\wd\tempcaptionbox<1.3\scratchdimen
+ \scratchdimen0.8\scratchdimen
+ \fi
+ \fi
+ \dosettempcaptionbox % \setbox\tempcaptionbox\vbox
+ {\hsize\scratchdimen
+ \doifnothing{\floatcaptionparameter\c!align}\raggedright % on purpose overloads align !
+ \putcompletecaption{#2}{#3}}}
+
+\newdimen\tempfloatheight
+\newdimen\tempfloatwidth
+
+\def\dofloatboxbetweenstack
+ {\endgraf\nointerlineskip\floatcaptionparameter\c!inbetween\endgraf}
+
+\def\dofloatboxdefaultbuilder % done
+ {\locatefloat{\box\tempfloatbox}}
+
+\def\dofloatboxnextrightbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \box\tempfloatbox
+ \expanded{\doifnotinset{\v!hang}{\floatcaptionparameter\c!location}}{\dotfskip{\floatcaptionparameter\c!distance}}%
+ \vbox to\tempfloatheight{#1}}}
+
+\def\dofloatboxnextleftbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \vbox to\tempfloatheight{#1}%
+ \expanded{\doifnotinset{\v!hang}{\floatcaptionparameter\c!location}}{\dotfskip{\floatcaptionparameter\c!distance}}%
+ \box\tempfloatbox}}
+
+\def\dofloatboxnextouterbuilder
+ {\doifrightpagefloatelse\dofloatboxnextrightbuilder\dofloatboxnextleftbuilder}
+\def\dofloatboxnextinnerbuilder
+ {\doifrightpagefloatelse\dofloatboxnextleftbuilder\dofloatboxnextrightbuilder}
+
+\def\dofloatboxnextrighthangbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \box\tempfloatbox
+ \vbox to\tempfloatheight{#1}}}
+
+\def\dofloatboxnextlefthangbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \vbox to\tempfloatheight{#1}%
+ \box\tempfloatbox}}
+
+\def\dodofloatboxnextrightmarginbuilder#1#2%
+ {\ifparfloat
+ \hbox\bgroup
+ \tempfloatheight\ht\tempfloatbox
+ \box\tempfloatbox
+ \hsmash{\hskip#1\vbox to\tempfloatheight{#2}}%
+ \egroup
+ \else
+ \begingroup
+ \tempfloatheight\ht\tempfloatbox
+ \everyrightofalignedline{\hsmash{\hskip#1\vbox to\tempfloatheight{#2}}}%
+ \locatefloat{\box\tempfloatbox}%
+ \endgroup
+ \fi}
+
+\def\dodofloatboxnextleftmarginbuilder#1#2%
+ {\ifparfloat
+ \hbox\bgroup
+ \tempfloatheight\ht\tempfloatbox
+ \hsmash{\hskip-\dimexpr#1+\wd\tempcaptionbox\relax\vbox to\tempfloatheight{#2}}%
+ \box\tempfloatbox
+ \egroup
+ \else
+ \begingroup
+ \tempfloatheight\ht\tempfloatbox
+ \everyleftofalignedline{\hsmash{\hskip-\dimexpr#1+\wd\tempcaptionbox\relax\vbox to\tempfloatheight{#2}}}%
+ \locatefloat{\box\tempfloatbox}%
+ \endgroup
+ \fi}
+
+\def\dofloatboxnextrightmarginbuilder{\dodofloatboxnextrightmarginbuilder\rightmargindistance}
+\def\dofloatboxnextleftmarginbuilder {\dodofloatboxnextleftmarginbuilder \leftmargindistance }
+
+\def\dofloatboxnextoutermarginbuilder
+ {\doifrightpagefloatelse
+ {\dodofloatboxnextrightmarginbuilder\rightmargindistance}
+ {\dodofloatboxnextleftmarginbuilder \rightmargindistance}}
+
+\def\dofloatboxnextinnermarginbuilder
+ {\doifrightpagefloatelse
+ {\dodofloatboxnextleftmarginbuilder \leftmargindistance}
+ {\dodofloatboxnextrightmarginbuilder\leftmargindistance}}
+
+\def\dofloatboxnextbuilder % beware, we first check on left/rightmargin because there can be left/right also
+ {\let\next\dofloatboxnextleftbuilder
+ \expanded{\processallactionsinset[\floatcaptionparameter\c!location]}
+ [ \v!outermargin=>\let\next\dofloatboxnextoutermarginbuilder,
+ \v!innermargin=>\let\next\dofloatboxnextinnermarginbuilder,
+ \v!leftmargin=>\let\next\dofloatboxnextleftmarginbuilder,
+ \v!rightmargin=>\let\next\dofloatboxnextrightmarginbuilder,
+ \v!lefthanging=>\let\next\dofloatboxnextlefthangbuilder,
+ \v!righthanging=>\let\next\dofloatboxnextrighthangbuilder,
+ \v!outer=>\let\next\dofloatboxnextouterbuilder,
+ \v!inner=>\let\next\dofloatboxnextinnerbuilder,
+ \v!left=>\let\next\dofloatboxnextleftbuilder,
+ \v!right=>\let\next\dofloatboxnextrightbuilder]%
+ \next}
+
+\def\dofloatboxsidebuilder
+ {\ifparfloat
+ \let\next\dofloatboxhighbuilder
+ \else
+ \let\next\dofloatboxmiddlebuilder
+ \expanded{\processallactionsinset[\floatcaptionparameter\c!location]}
+ [ \v!low=>\let\next\dofloatboxlowbuilder,
+ \v!middle=>\let\next\dofloatboxmiddlebuilder,
+ \v!high=>\let\next\dofloatboxhighbuilder]%
+ \fi
+ \next}
+
+\def\doflushfloatleftcaptionhang
+ {\hsmash{\llap{\box\tempcaptionbox\dotfskip{\floatcaptionparameter\c!distance}}}}
+\def\doflushfloatrightcaptionhang
+ {\hsmash{\rlap{\dotfskip{\floatcaptionparameter\c!distance}\box\tempcaptionbox}}}
+
+\def\doflushfloatcaptionhang
+ {\expanded{\doifinsetelse{\v!righthanging}{\floatcaptionparameter\c!location}}
+ {\doflushfloatrightcaptionhang}
+ {\expanded{\doifinsetelse{\v!lefthanging}{\floatcaptionparameter\c!location}}
+ {\doflushfloatleftcaptionhang}
+ {\expanded{\doifinsetelse{\v!hang}{\floatcaptionparameter\c!location}}
+ {\expanded{\doifinsetelse{\v!outer}{\floatcaptionparameter\c!location}}
+ {\doifrightpagefloatelse{\doflushfloatrightcaptionhang}{\doflushfloatleftcaptionhang}}
+ {\expanded{\doifinsetelse{\v!right}{\floatcaptiondirectives}}
+ {\doflushfloatrightcaptionhang}
+ {\doflushfloatleftcaptionhang}}}
+ {\box\tempcaptionbox}}}}
+
+\def\dofloatboxhighbuilder
+ {\dofloatboxnextbuilder{\dofloatboxbetweenstack\doflushfloatcaptionhang\vfill}}
+
+\def\dofloatboxlowbuilder
+ {\dofloatboxnextbuilder{\vfill\doflushfloatcaptionhang\dofloatboxbetweenstack}}
+
+\def\dofloatboxmiddlebuilder
+ {\dofloatboxnextbuilder{\vfill\box\tempcaptionbox\vfill}}
+
+% \definefloat
+% [lefty][lefties][figure]
+% \setupfloat
+% [lefty]
+% [default=left,
+% rightmargindistance=-2cm,
+% leftmargindistance=-2cm]
+% \setupcaption
+% [lefty]
+% [location={bottom,overlay}]
+%
+% \starttext
+% \placelefty{}{} \input tufte \input tufte
+% \placelefty{}{} \input tufte \input tufte
+% \stoptext
+
+\def\bothangfloat#1{\ruledvbox to \ht\tempfloatbox{#1\vss}}
+\def\tophangfloat#1{\ruledvbox to \ht\tempfloatbox{\vss#1}}
+
+\def\dofloatboxnormaltopstackbuilder
+ {\expanded{\doifinset{\v!overlay}{\floatcaptionparameter\c!location}}\tophangfloat
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox{\locatesidefloat{\box\tempcaptionbox}}%
+ \dofloatboxbetweenstack
+ \hbox{\hbox {\box\tempfloatbox }}%
+ \else
+ \hbox{\locatetextfloat{\box\tempcaptionbox}}
+ \dofloatboxbetweenstack
+ \hbox{\locatefloat {\box\tempfloatbox }}%
+ \fi}}
+
+\def\dofloatboxnormalbotstackbuilder
+ {\expanded{\doifinset{\v!overlay}{\floatcaptionparameter\c!location}}\bothangfloat
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox{\hbox {\box\tempfloatbox }}%
+ \dofloatboxbetweenstack
+ \hbox{\locatesidefloat{\box\tempcaptionbox}}%
+ \else
+ \hbox{\locatefloat {\box\tempfloatbox }}%
+ \dofloatboxbetweenstack
+ \hbox{\locatetextfloat{\box\tempcaptionbox}}%
+ \fi}}
+
+\def\dofloatboxgridtopstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \locatesidefloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack
+ \hbox {\box\tempfloatbox }%
+ \else
+ \locatetextfloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack
+ \locatefloat {\box\tempfloatbox }%
+ \fi}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight{\unvbox\scratchbox}}
+
+\def\dofloatboxgridbotstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack
+ \locatesidefloat{\box\tempcaptionbox}%
+ \else
+ \locatefloat {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack
+ \locatetextfloat{\box\tempcaptionbox}%
+ \fi}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight{\unvbox\scratchbox}}
+
+\def\dofloatboxstretchtopstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\locatecaption{\copy\tempcaptionbox}%
+ \locatefloat {\copy\tempfloatbox }}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \locatesidefloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack\vss
+ \hbox {\box\tempfloatbox }%
+ \else
+ \locatetextfloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack\vss
+ \locatefloat {\box\tempfloatbox }%
+ \fi}}
+
+\def\dofloatboxstretchbotstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\locatefloat {\copy\tempfloatbox }%
+ \locatecaption{\copy\tempcaptionbox}}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack\vss
+ \locatesidefloat{\box\tempcaptionbox}
+ \else
+ \locatefloat {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack\vss
+ \locatetextfloat{\box\tempcaptionbox}%
+ \fi}}
+
+\def\dofloatboxtopbuilder
+ {\let\next\dofloatboxnormaltopstackbuilder
+ \expanded{\processfirstactioninset[\floatcaptionparameter\c!location]}
+ [ \v!grid=>\let\next\dofloatboxgridstackbuilder,
+ \v!stretch=>\let\next\dofloatboxstretchstackbuilder]%
+ \next}
+
+\def\dofloatboxbottombuilder
+ {\let\next\dofloatboxnormalbotstackbuilder
+ \expanded{\processfirstactioninset[\floatcaptionparameter\c!location]}
+ [ \v!grid=>\let\next\dofloatboxgridstackbuilder,
+ \v!stretch=>\let\next\dofloatboxstretchstackbuilder]%
+ \next}
+
+\def\relocatecaptionright#1{\locatecaption{\hbox to \tempfloatwidth{\hss#1}}}
+\def\relocatecaptionleft #1{\locatecaption{\hbox to \tempfloatwidth{#1\hss}}}
+
+\long\def\installfloatboxbuilder#1#2{\setvalue{\??kj:#1}{#2}}
+
+\def\buildfloatbox
+ {\global\setbox\floatbox\vbox
+ {\setlocalfloathsize
+ \forgetall
+ \let\floatcaptionarrangement\s!default
+ \def\docommand##1%
+ {\doifdefined{\??kj:##1}{\def\floatcaptionarrangement{##1}\quitcommalist}}%
+ \processcommacommand[\floatcaptionparameter\c!location]\docommand
+ \executeifdefined{\??kj:\floatcaptionarrangement}{\getvalue{\??kj:\s!default}}}}
+
+\def\locatetextfloat
+ {\let\next\locatecaption
+ \expanded{\processallactionsinset[\floatcaptionparameter\c!location]}
+ [ \v!left=>\let\next\relocatecaptionleft,
+ \v!right=>\let\next\relocatecaptionright,
+ \v!inner=>\doifrightpagefloatelse{\let\next\relocatecaptionleft }{\let\next\relocatecaptionright},
+ \v!outer=>\doifrightpagefloatelse{\let\next\relocatecaptionright}{\let\next\relocatecaptionleft }]%
+ \next}
+
+\installfloatboxbuilder \v!none \dofloatboxdefaultbuilder
+\installfloatboxbuilder \s!default \dofloatboxdefaultbuilder
+\installfloatboxbuilder \v!high \dofloatboxhighbuilder
+\installfloatboxbuilder \v!low \dofloatboxlowbuilder
+\installfloatboxbuilder \v!middle \dofloatboxmiddlebuilder
+
+\installfloatboxbuilder \v!left \dofloatboxsidebuilder
+\installfloatboxbuilder \v!right \dofloatboxsidebuilder
+
+\installfloatboxbuilder \v!top \dofloatboxtopbuilder
+\installfloatboxbuilder \v!bottom \dofloatboxbottombuilder
+
+% \setuplayout[grid=yes] \showgrid \setupcaptions[style=smallbodyfont,location=grid,inbetween=]
+%
+% \starttext
+% test \placefigure{} {\externalfigure[cow.pdf][frame=on,grid=yes]} test \page
+% test \placefigure{\input zapf\relax}{\externalfigure[cow.pdf][frame=on,grid=yes]} test \page
+% test \placefigure{} {\externalfigure[cow.pdf][frame=on,grid=depth]} test \page
+% test \placefigure{\input zapf\relax}{\externalfigure[cow.pdf][frame=on,grid=depth]} test \page
+% \stoptext
+
+\newif\ifpostponecolumnfloats \postponecolumnfloatsfalse % don't change
+
+\chardef\postcenterfloatmethod\plusone
+
+\def\postcenterfloatbox#1%
+ {\scratchdimen
+ \ifcase\postcenterfloatmethod
+ #1% \wd\floatbox
+ \or\ifinsidecolumns
+ \ifpostponecolumnfloats\makeupwidth\else#1\fi
+ \else\ifdim#1>\hsize
+ \hsize
+ \else
+ \wd\floatbox
+ \fi\fi\fi
+ \global\setbox\floatbox\hbox to \scratchdimen
+ % {\hfill\box\floatbox\hfill}} % geen \hss, gaat mis in kolommen !
+ % {\hss \box\floatbox\hss }} % wel \hss, anders mis in colset
+ {\ifglobalcenterfloatbox
+ \donetrue
+ \else\iflocalcenterfloatbox
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdim\scratchdimen>\effectivehsize
+ \donefalse
+ \fi
+ \hss\ifdone\hskip\effectiveleftskip\fi
+ \box\floatbox
+ \ifdone\hskip\effectiverightskip\fi\hss}}
+
+\long\def\dosetparfloat#1#2#3%
+ {\bgroup
+ \forgetall
+ \postponenotes
+ \dontcomplain
+ %\showcomposition
+ \setbox\tempfloatbox\vbox{\borderedfloatbox}%
+ \addlocalbackgroundtobox\tempfloatbox % no \doglobal
+ \docheckcaptioncontent{#2}{#3}%
+ \ifnofloatcaption
+ \global\setbox\floatbox\vbox{\box\tempfloatbox}%
+ \else
+ \dopreparedosidecaption{#1}{#2}{#3}%
+ \settracedcaptionbox
+ \setbox\tempcaptionbox\hbox{\floatcaptionparameter\c!command{\box\tempcaptionbox}}%
+ \moveboxontogrid\tempcaptionbox{\floatcaptionparameter\c!grid}\lastcaptionht
+ \addlocalbackgroundtobox\tempcaptionbox % no \doglobal
+ \buildsidefloatbox
+ \fi
+ \egroup}
+
+\def\dopreparedosidecaption#1#2#3% will be enhanced
+ {\doifelse{\floatcaptionparameter\c!width}\v!max
+ {\dosettempcaptionbox
+ {\hsize\wd\tempfloatbox
+ \putcompletecaption{#2}{#3}}}%
+ {\doifelse{\floatcaptionparameter\c!width}\v!fit
+ {\ifdim\wd\tempcaptionbox>\wd\tempfloatbox\relax
+ \setbox\tempcaptionbox\vbox
+ {\forgetall % needed?
+ \hsize\wd\tempfloatbox
+ \dosetcaptionthings
+ \putcompletecaption{#2}{#3}}%
+ \else
+ \setbox\tempcaptionbox\hbox to \wd\tempfloatbox
+ {\hss\box\tempcaptionbox\hss}%
+ \fi}
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!width % \wd\tempfloatbox
+ \putcompletecaption{#2}{#3}}}}}
+
+\def\buildsidefloatbox
+ {\let\locatefloat \relax
+ \let\locatecaption\relax
+ \def\locatesidefloat##1%
+ {\begingroup
+ \chardef\alignstrutmode\zerocount
+ \hsize\tempfloatwidth \forgetall
+ \alignedline{\floatparameter\c!location}\v!middle{##1}%
+ \endgroup}%
+ \buildfloatbox}
+
+\newif\ifparfloat
+
+\long\def\dosetfloatbox#1#2#3% todo : \global\setbox
+ {\ifvisible
+ \par
+ \edef\floatcaptiondirectives{\floatparameter\c!location,\floatcaptionparameter\c!location}%
+ \ifparfloat\@EA\dosetparfloat\else\@EA\dosetpagfloat\fi{#1}{#2}{#3}%
+ \setlocalfloatdimensions{#1}%
+ \setbox\floatbox\hbox
+ {\dosavefloatdata\restoretextcolor{\box\floatbox}}%
+ \global\floatheight\ht\floatbox
+ \global\advance\floatheight \dp\floatbox
+ \global\floatwidth\wd\floatbox
+ \global\advance\totalnoffloats \plusone
+ \doifnotinset\v!margin{#1} % gaat namelijk nog fout
+ {\setbox\floatbox\vbox
+ {\parindent\zeropoint
+ \doifconcepttracing{\inleftmargin{\framed{\infofont\the\totalnoffloats}}}%
+ \box\floatbox}}%
+ \wd\floatbox\floatwidth
+ \dimen0=\floatheight
+ \advance\dimen0 \lineheight
+ \ifdim\dimen0<\textheight
+ \else
+ \global\floatheight\textheight
+ \global\advance\floatheight -\lineheight
+ \ht\floatbox\floatheight
+ \dp\floatbox\zeropoint
+ \showmessage\m!floatblocks{10}{\the\totalnoffloats}%
+ \fi
+ \fi}
+
+\newcounter\noxfloatlocations
+
+\long\def\dofloat#1#2#3%
+ {\dosetfloatbox{#1}{#2}{#3}%
+ \dogetfloatbox{#1}\empty}
+
+\let\naturalfloatheight\!!zeropoint
+\let\naturalfloatwidth \!!zeropoint
+\let\naturalfloatdepth \!!zeropoint
+
+\def\setnaturalfloatdimensions#1%
+ {\xdef\naturalfloatheight{\the\ht#1}%
+ \xdef\naturalfloatwidth {\the\wd#1}%
+ \xdef\naturalfloatdepth {\the\dp#1}}
+
+\long\def\doifelsemainfloatbody#1#2%
+ {\ifinsidesplitfloat\ifconditional\splitfloatfirstdone#2\else#1\fi\else#1\fi}
+
+
+\long\def\docompletefloat#1#2#3#4#5#6#7% #7 = box number
+ {%\flushsidefloats % moved
+ \presetfloatvariables{#1}{#4}{#2}{#6}%
+ \bgroup
+ \setnaturalfloatdimensions#7%
+ \global\setbox\floatbox\vbox
+ {\executeifdefined{\??fl#1\c!command}\firstofoneargument{\box#7}}%
+ \setnaturalfloatdimensions\floatbox
+ \dimen0 \ht\floatbox
+ \advance\dimen0 \dp\floatbox
+ \ifdim\dimen0=\zeropoint
+ \showmessage\m!floatblocks{11}\empty
+ \global\setbox\floatbox\vbox{\doemptyblock{#3}}%
+ \fi
+ \ifnofloatcaption
+ \global\setbox\floatbox\vbox
+ {\unvbox\floatbox
+ \doifelsemainfloatbody{\rawpagereference\s!flt{#2}}\donothing
+ \vss}% gets rid of the depth (unless tabulate)
+ \egroup
+ \dofloat{#4}{}{#6}%
+ \else
+ \gdefconvertedargument\asciititle{#6}% \asciititle is global
+ \ifnofloatnumber
+ \global\setbox\floatbox\vbox
+ {\unvbox\floatbox % no \vss, keep the depth
+ \doifelsemainfloatbody{\rawreference\s!flt{#2}{{}{\asciititle}}}\donothing}%
+ \egroup
+ \dofloat{#4}{}{#6}%
+ \else
+ \preparefloatnumber{#1}%
+ \global\setbox\floatbox\vbox
+ {\unvbox\floatbox % no \vss, keep the depth
+ \doifelsemainfloatbody
+ {\tracefloatnumber{#1}%
+ \rawreference\s!flt{#2}{{\composedsectionnumber}{\asciititle}}%
+ \dowritetolist{#3}{\composedsectionnumber}{#6}{#3}}
+ \donothing
+ }%
+ \egroup
+ \preparefullnumber{\??kj#1}\composedsectionnumber\preparednumber
+ \dofloat{#4}{\labeltexts{#5}{\preparednumber}}{#6}%
+ \fi
+ \fi
+ \global\insidefloatfalse}
+
+\def\dooutput{\sidefloatoutput} % redefinition of \dooutput
+
+\definefloat
+ [\v!figure]
+ [\v!figures]
+
+\definefloat
+ [\v!table]
+ [\v!tables]
+
+\setupfloat
+ [\v!table]
+ [\c!frame=\v!off]
+
+\definefloat
+ [\v!intermezzo]
+ [\v!intermezzi]
+
+\definefloat
+ [\v!graphic]
+ [\v!graphics]
+
+\setupcaptions
+ [\c!location=\v!bottom,
+ \c!grid=,
+ \c!before=, % not used (yet)
+ \c!inbetween={\blank[\v!medium]},
+ \c!after=, % not used (yet)
+ \c!spacebefore=,
+ \c!spaceinbetween=, % replaces fuzzy inbetween dual usage
+ \c!spaceafter=,
+ \c!width=\v!fit,
+ \c!minwidth=\v!fit, % id est: the width of the floatbox in some cases
+ \c!headstyle=\v!bold,
+ \c!headcolor=,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\zeropoint,
+ \c!outermargin=\zeropoint,
+ \c!innermargin=\zeropoint,
+ \c!setups=,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!textstyle=,
+ \c!textcolor=,
+ \c!align=,
+ \c!number=\v!yes,
+ \c!way=\@@nrway,
+ \c!blockway=\@@nrblockway,
+ \c!sectionnumber=\@@nrsectionnumber,
+ \c!separator=\@@koseparator,
+ \c!stopper=\@@kostopper,
+ \c!suffix=\floatcaptionsuffix, % hook
+ \c!distance=1em,
+ \c!command=,
+ \c!conversion=\v!numbers]
+
+\setupfloats
+ [\c!location=\v!middle,
+ \c!width=8\lineheight,
+ \c!height=6\lineheight,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!background=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=,
+ \c!backgroundoffset=\!!zeropoint,
+ \c!topframe=,
+ \c!bottomframe=,
+ \c!leftframe=,
+ \c!rightframe=,
+ \c!framecolor=,
+ \c!frameoffset=\!!zeropoint,
+ \c!before=,
+ \c!after=,
+ \c!spacebefore=\v!big,
+ \c!spaceafter=\v!big,
+ \c!sidespacebefore=\@@bkspacebefore,
+ \c!sidespaceafter=\@@bkspaceafter,
+ \c!sidealign=\v!normal,
+ \c!textmethod=\ifgridsnapping2\else0\fi, % 0=raw 1=safe (.99pg) 2=tight (-1pt)
+ \c!sidemethod=\ifgridsnapping2\else1\fi, % 0=raw 1=safe (.99pg) 2=tight (-1pt)
+ \c!indentnext=\v!no,
+ \c!margin=1em,
+ \c!method=1,
+ \c!cache=\v!yes, % when no, then intermediate flush
+ \c!leftmargin=\zeropoint, % displacement in 'normal floats'
+ \c!rightmargin=\zeropoint, % idem
+ \c!innermargin=\zeropoint, % idem
+ \c!outermargin=\zeropoint, % idem
+ \c!leftmargindistance=\zeropoint,
+ \c!rightmargindistance=\@@bkleftmargindistance,
+ \c!ntop=2,
+ \c!nbottom=0,
+ \c!nlines=4,
+ \c!local=,
+ \c!default=\v!figure,
+ \c!numbering=\v!yes]
+
+% float strategy, replaces some of the above macros
+
+\let\floatmethod \empty
+\let\floatcolumn \empty
+\let\floatrow \empty
+\let\forcedfloatmethod\empty
+
+\def\dogetfloatbox#1#2%
+ {\ifvisible
+ \doifelsenothing{#2}
+ {\getfromcommalist[#1][1]%
+ \@EA\beforesplitstring\commalistelement\at:\to\floatmethod
+ \@EA\aftersplitstring \commalistelement\at:\to\floatcolumn
+ \@EA\aftersplitstring \floatcolumn\at*\to\floatrow
+ \@EA\beforesplitstring\floatcolumn\at*\to\floatcolumn
+ % todo: nog algemeen otr
+ \ifx\OTRSETsetpreferedcolumnslot\undefined\else
+ \OTRSETsetpreferedcolumnslot\floatcolumn\floatrow
+ \fi}
+ {\let\floatcolumn\empty
+ \let\floatrow\empty
+ \edef\floatmethod{#2}}%
+ \doifundefined{\string\floatmethod\floatmethod}
+ {\let\floatmethod\v!here}%
+ \doifsomething\forcedfloatmethod
+ {\edef\floatmethod{\forcedfloatmethod}}%
+ %\getvalue{\string\floatmethod\floatmethod}[#1]%
+ \getvalue{\string\floatmethod\floatmethod}[\floatmethod,#1]%
+ \fi}
+
+\def\installfloathandler#1#2% #1=keyword #2=handler
+ {\setvalue{\string\floatmethod#1}{#2}}
+
+\installfloathandler \v!here \someherefloat
+\installfloathandler \v!force \somefixdfloat
+\installfloathandler \v!left \someleftsidefloat
+\installfloathandler \v!right \somerightsidefloat
+\installfloathandler \v!text \sometextfloat
+\installfloathandler \v!top \sometopfloat
+\installfloathandler \v!bottom \somebottomfloat
+\installfloathandler \v!auto \someautofloat
+\installfloathandler \v!margin \somemarginfloat
+\installfloathandler \v!opposite \somefacefloat
+\installfloathandler \v!page \somepagefloat
+\installfloathandler \v!leftpage \someleftpagefloat
+\installfloathandler \v!rightpage \somerightpagefloat
+\installfloathandler \v!inmargin \someinmarginfloat
+\installfloathandler \v!inleft \someinleftmarginfloat
+\installfloathandler \v!inright \someinrightmarginfloat
+\installfloathandler \v!leftmargin \someinleftmarginfloat
+\installfloathandler \v!rightmargin \someinrightmarginfloat
+\installfloathandler \v!leftedge \someinleftedgefloat
+\installfloathandler \v!rightedge \someinrightedgefloat
+
+\installfloathandler \v!backspace \somebackspacefloat
+\installfloathandler \v!cutspace \somecutspacefloat
+
+\installfloathandler {tblr} \someslotfloat
+\installfloathandler {lrtb} \someslotfloat
+\installfloathandler {tbrl} \someslotfloat
+\installfloathandler {rltb} \someslotfloat
+\installfloathandler {btlr} \someslotfloat
+\installfloathandler {lrbt} \someslotfloat
+\installfloathandler {btrl} \someslotfloat
+\installfloathandler {rlbt} \someslotfloat
+\installfloathandler {fxtb} \someslotfloat
+\installfloathandler {fxbt} \someslotfloat
+
+\def\placesomeslotfloat {\OTRcommand\someslotfloat}
+\def\placesomeherefloat {\OTRcommand\someherefloat}
+\def\placesomefixdfloat {\OTRcommand\somefixdfloat}
+\def\placesomepagefloat {\OTRcommand\somepagefloat}
+\def\placesomeleftpagefloat {\OTRcommand\someleftpagefloat}
+\def\placesomerightpagefloat{\OTRcommand\somerightpagefloat}
+\def\placesometopsfloat {\OTRcommand\sometopsfloat}
+\def\placesomebotsfloat {\OTRcommand\somebotsfloat}
+\def\placesomesidefloat {\OTRcommand\somesidefloat}
+\def\placesomefacefloat {\OTRcommand\somefacefloat}
+
+\def\someleftsidefloat [#1]{\somesidefloat[#1]\presetindentation}
+\def\somerightsidefloat [#1]{\somesidefloat[#1]}
+\def\sometopfloat [#1]{\someelsefloat[#1]\nonoindentation}
+\def\somebottomfloat [#1]{\someelsefloat[#1]}
+\def\someautofloat [#1]{\someelsefloat[#1]}
+\def\somemarginfloat [#1]{\somenextfloat[#1]\nonoindentation}
+\def\someinleftmarginfloat [#1]{\somesidefloat[#1]}
+\def\someinrightmarginfloat[#1]{\somesidefloat[#1]}
+\def\someinleftedgefloat [#1]{\somesidefloat[#1]}
+\def\someinrightedgefloat [#1]{\somesidefloat[#1]}
+\def\someinmarginfloat [#1]{\somesidefloat[#1]}
+\def\someherefloat [#1]{\someelsefloat[\v!here,#1]}
+
+\def\somebackspacefloat [#1]{\somesidefloat[#1]}
+\def\somecutspacefloat [#1]{\somesidefloat[#1]}
+
+\def\somefixdfloat {\placesomefixdfloat}
+\def\somepagefloat {\placesomepagefloat}
+\def\someleftpagefloat {\placesomeleftpagefloat}
+\def\somerightpagefloat{\placesomerightpagefloat}
+\def\somefacefloat {\placesomefacefloat}
+\def\someslotfloat {\placesomeslotfloat}
+
+\protect \endinput
diff --git a/tex/context/base/strc-flt.mkiv b/tex/context/base/strc-flt.mkiv
new file mode 100644
index 000000000..67023d701
--- /dev/null
+++ b/tex/context/base/strc-flt.mkiv
@@ -0,0 +1,1964 @@
+%D \module
+%D [ file=strc-flt,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Float Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Float Numbering}
+
+\registerctxluafile{strc-flt}{1.001}
+
+\unprotect
+
+%D This module needs a cleanup and will be split in
+%D strc-flt.tex and page-flt.mkiv cq. page-flt.mkii.
+
+\ifdefined\addlocalbackgroundtobox\else \def\addlocalbackgroundtobox{\resetglobal\gobbleoneargument} \fi
+
+\unexpanded\def\placefloats{\doflushfloats} % keep this one
+
+\let\currentfloat\empty
+
+\def\letfloatparameter #1{\expandafter\csname\??fl\currentfloat#1\endcsname}
+
+\def\floatparameter #1{\csname\dofloatparameter{\??fl\currentfloat}#1\endcsname}
+\def\floatsharedparameter#1{\csname \??fl #1\endcsname}
+\def\floatparameterhash #1{\dofloatparameterhash {\??fl\currentfloat}#1}
+
+\def\dofloatparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dofloatparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dofloatparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dofloatparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dofloatparentparameter #1#2{\ifx#1\relax\s!empty\else\dofloatparameter #1#2\fi}
+\def\dofloatparentparameterhash#1#2{\ifx#1\relax \else\dofloatparameterhash#1#2\fi}
+
+\def\detokenizedfloatparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??fl\currentfloat#1\endcsname}}
+
+\def\dosetfloatattributes#1#2% style color
+ {\edef\fontattributehash {\floatparameterhash#1}%
+ \edef\colorattributehash{\floatparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\def\floatcaptionparameter #1{\csname\dofloatcaptionparameter{\??kj\currentfloat}#1\endcsname}
+\def\floatcaptionparameterhash#1{\dofloatcaptionparameterhash {\??kj\currentfloat}#1}
+
+\def\dofloatcaptionparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dofloatcaptionparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dofloatcaptionparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dofloatcaptionparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dofloatcaptionparentparameter #1#2{\ifx#1\relax\s!empty\else\dofloatcaptionparameter #1#2\fi}
+\def\dofloatcaptionparentparameterhash#1#2{\ifx#1\relax \else\dofloatcaptionparameterhash#1#2\fi}
+
+\def\detokenizedcaptionparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??kj\currentfloat#1\endcsname}}
+
+\def\dosetfloatcaptionattributes#1#2% style color
+ {\edef\fontattributehash {\floatcaptionparameterhash#1}%
+ \edef\colorattributehash{\floatcaptionparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\def\dohandlenextfloatindent
+ {\checknextindentation[\floatparameter\c!indentnext]%
+ \dorechecknextindentation}
+
+%D The two shared (parent) definitions:
+
+% todo: everysetupfloat everysetupcaption for all floats
+
+\unexpanded\def\setupfloats {\dosingleargument\dosetupfloats} % was \??bk
+\unexpanded\def\setupcaptions{\dosingleargument\dosetupcaptions}
+
+\let\alldefinedfloats\empty
+
+\def\doprocessallfloats#1%
+ {\def\doprocesssomefloat##1{\def\currentfloat{##1}#1}%
+ \processcommacommand[\alldefinedfloats]\doprocesssomefloat}
+
+\def\dosetupfloats [#1]{\getparameters[\??fl][#1]\doprocessallfloats{\the\everysetupfloat}}
+\def\dosetupcaptions[#1]{\getparameters[\??kj][#1]\doprocessallfloats{\the\everysetupcaption}}
+
+% \def\dosetupfloats [#1]{\getparameters[\??fl][#1]}
+% \def\dosetupcaptions[#1]{\getparameters[\??kj][#1]}
+
+\setupcaptions
+ [\c!location=\v!bottom,
+ \c!grid=,
+ \c!before=, % not used (yet)
+ \c!inbetween={\blank[\v!medium]},
+ \c!after=, % not used (yet)
+ \c!spacebefore=,
+ \c!spaceinbetween=, % replaces fuzzy inbetween dual usage
+ \c!spaceafter=,
+ \c!width=\v!fit,
+ \c!minwidth=\v!fit, % id est: the width of the floatbox in some cases
+ \c!headstyle=\v!bold,
+ \c!headcolor=,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\zeropoint,
+ \c!outermargin=\zeropoint,
+ \c!innermargin=\zeropoint,
+ \c!setups=,
+ \c!style=\v!normal,
+ \c!color=,
+ \c!textstyle=,
+ \c!textcolor=,
+ \c!align=,
+ \c!number=\v!yes,
+% \c!prefix=\v!no,
+% \c!prefixconnector=.,
+% \c!way=\v!by\v!chapter,
+% \c!prefixsegments=2:2,
+% \c!way=\@@nrway,
+% \c!blockway=\@@nrblockway,
+% \c!sectionnumber=\@@nrsectionnumber,
+% \c!separator=\@@koseparator,
+% \c!starter=\@@kostarter,
+% \c!stopper=\@@kostopper,
+% \c!suffix=\floatcaptionsuffix, % hook
+ \c!distance=1em,
+ \c!conversion=\v!numbers,
+ \c!command=]
+
+% we can comment some of these
+
+\setupfloats
+ [\c!location=\v!middle,
+ \c!width=8\lineheight,
+ \c!height=6\lineheight,
+ \c!offset=\v!overlay,
+ \c!frame=\v!off,
+ \c!strut=\v!no,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!backgroundoffset=\!!zeropoint,
+ \c!topframe=,
+ \c!bottomframe=,
+ \c!leftframe=,
+ \c!rightframe=,
+ \c!frameoffset=\!!zeropoint,
+ \c!before=,
+ \c!after=,
+ \c!spacebefore=\v!big,
+ \c!spaceafter=\v!big,
+ \c!sidespacebefore=\floatsharedparameter\c!spacebefore,
+ \c!sidespaceafter=\floatsharedparameter\c!spaceafter,
+ \c!sidealign=\v!normal,
+ \c!textmethod=\ifgridsnapping2\else0\fi, % 0=raw 1=safe (.99pg) 2=tight (-1pt)
+ \c!sidemethod=\ifgridsnapping2\else1\fi, % 0=raw 1=safe (.99pg) 2=tight (-1pt)
+ \c!indentnext=\v!no,
+ \c!margin=1em,
+ \c!method=1,
+ \c!cache=\v!yes, % when no, then intermediate flush
+ \c!leftmargin=\zeropoint, % displacement in 'normal floats'
+ \c!rightmargin=\zeropoint, % idem
+ \c!innermargin=\zeropoint, % idem
+ \c!outermargin=\zeropoint, % idem
+ \c!leftmargindistance=\zeropoint,
+ \c!rightmargindistance=\floatparameter\c!leftmargindistance,
+ \c!ntop=2,
+ \c!nbottom=0,
+ \c!nlines=4,
+ \c!local=,
+ \c!bottombefore=, % e.g. \vfill
+ \c!bottomafter=,
+ \c!default=\v!figure,
+ \c!numbering=\v!yes]
+
+\def\@@bknumbering {\floatsharedparameter\c!numbering } % global one
+\def\@@bkspaceafter {\floatsharedparameter\c!spaceafter } % global one
+\def\@@bkspacebefore{\floatsharedparameter\c!spacebefore} % global one
+\def\@@bknbottom {\floatsharedparameter\c!nbottom } % global one
+\def\@@bkntop {\floatsharedparameter\c!ntop } % global one
+\def\@@bknlines {\floatsharedparameter\c!nlines } % global one
+\def\@@bkmargin {\floatsharedparameter\c!margin } % global one
+\def\@@bkcache {\floatsharedparameter\c!cache } % global one
+
+% float
+%
+% [%\c!width=8\lineheight, % 15\bodyfontsize,
+% %\c!height=6\lineheight, % 10\bodyfontsize,
+% \c!offset=\v!overlay,
+% \c!width=\v!fit,
+% \c!height=\v!fit,
+% \c!minwidth=,
+% \c!maxwidth=,
+% \c!maxheight=,
+% \c!criterium=,
+% % inherited
+% \c!pageboundaries=,
+% \c!default=]%
+
+% number
+%
+% [\c!text=#1,
+% \c!location=\v!intext,
+% \c!way=\floatcaptionparameter\c!way,
+% \c!blockway=\floatcaptionparameter\c!blockway,
+% \c!sectionnumber=\floatcaptionparameter\c!sectionnumber,
+% \c!conversion=\floatcaptionparameter\c!conversion]%
+
+
+%D Individial settings:
+
+\unexpanded\def\setupfloat {\dodoubleargument\dosetupfloat}
+\unexpanded\def\setupcaption{\dodoubleargument\dosetupcaption}
+
+\newtoks\everysetupfloat
+\newtoks\everysetupcaption
+
+\def\dosetupfloat[#1][#2]%
+ {\def\docommand##1{\getparameters[\??fl##1][#2]\def\currentfloat{##1}\the\everysetupfloat}%
+ \processcommalist[#1]\docommand}
+
+\def\dosetupcaption[#1][#2]%
+ {\def\docommand##1{\getparameters[\??kj##1][#2]\def\currentfloat{##1}\the\everysetupcaption}%
+ \processcommalist[#1]\docommand}
+
+\presetstructurecountersetup\setupcaptions\sharedstructurecounterparameter
+
+\appendtoks
+ \dostructurecountersetup\currentfloat\floatcaptionparameter
+ \docheckstructurecountersetup\currentfloat
+\to \everysetupcaption
+
+%D Definitions:
+
+\unexpanded\def\definefloat
+ {\dotripleempty\dodefinefloat}
+
+\def\dodefinefloat[#1][#2][#3]% #1=naam #2=meervoud #3=parent
+ {\ifthirdargument
+ \redodefinefloat[#1][#2][#3]%
+ \else\ifsecondargument
+ \dododefinefloat[#1][#2]%
+ \else
+ \dododefinefloat[#1][#1]%
+ \fi\fi}
+
+\presetlocalframed[\??fl]
+
+\def\dododefinefloat[#1][#2]%
+ {\copylocalframed[\??fl#1][\??fl]%
+ \definestructurecounter[#1]%
+ \addtocommalist{#1}\alldefinedfloats
+ \setupfloat[#1][\s!parent=\??fl]%
+ \setupcaption[#1][\s!parent=\??kj]%
+ \definelist[#1]%
+ \presetlabeltext[#1=\Word{#1}~]%
+ \presetheadtext[#2=\Word{#2}]%
+ \dodefinefloatcommands[#1][#2]%
+ }% \newnodelocation{\v!float\@@thenumber{#1}}}
+
+\def\redodefinefloat[#1][#2][#3]%
+ {\copylocalframed[\??fl#1][\??fl#3]%
+ \setupfloat[#1][\s!parent=\??fl#3]%
+ \setupcaption[#1][\s!parent=\??kj#3]%
+ \definestructurecounter[#1][#3]%
+ \definelist[#1][#3]%
+ \presetlabeltext[#1=\Word{#3}~]%
+ \presetheadtext[#2=\Word{#2}]%
+ \dodefinefloatcommands[#1][#2]}
+
+\def\dodefinefloatcommands[#1][#2]%
+ {\setuvalue {\e!place\e!listof#2}{\dodoubleempty\doplacelist[#1]}%
+ \setuvalue {\e!complete\e!listof#2}{\dotripleempty\dodocompletelist[#1][#2]}%
+ \setuvalue {\e!place#1}{\dotripleempty\docomplexplacefloat[#1]}%
+ \setuvalue {\e!reserve#1}{\doquadrupleempty\docomplexreserveblock[#1]}%
+ \setuvalue {\e!start#1\e!text}{\dotripleempty\docomplexstarttextblock[#1]}%
+ \setuvalue {\e!stop#1\e!text}{\dostoptextfloat}%
+ \setuvalue{\e!start\e!reserve#1\e!text}{\doquadrupleempty\docomplexstartreservetextblock[#1]}%
+ \setuvalue {\e!stop\e!reserve#1\e!text}{\dostoptextfloat}%
+ \setuvalue {\e!emptyone#1}{\doemptyfloatblock{#1}}%
+ \setuvalue {\e!emptytwo#1}{\doemptyfloatblock{#1}}}
+
+%D Fallback float body:
+
+\def\doemptyfloatblock#1%
+ {\framed
+ [\c!frame=\v!on,
+ \c!width=\floatsharedparameter\c!width,
+ \c!height=\floatsharedparameter\c!height,
+ \c!location=\v!normal,
+ \c!offset=\floatsharedparameter\c!offset]%
+ {\getmessage\m!floatblocks{12}\empty}}
+
+%D Data. We can generalize this to lists.
+
+\newif\ifnofloatcaption
+\newif\ifnofloatnumber
+\newif\ifemptyfloatcaption
+
+\def\getfloatparameters {\getparameters[\??fl\currentfloat]}
+\def\getcaptionparameters{\getparameters[\??kj\currentfloat]}
+
+\installstructurelistprocessor{float}{\usestructurelistprocessor{number+title}}
+
+% \def\thecurrentfloatnumber
+% {\ifnofloatcaption \else \ifnofloatnumber \else
+% % \labeltexts\currentfloat{\convertedstructurecounter[\currentfloat]}% ! ! todo: use a lua call instead
+% \ifx\currentfloatnumber\relax\else
+% \labeltexts\currentfloat{\ctxlua{structure.lists.savednumber("\currentfloat",\currentfloatnumber)}}%
+% \fi
+% \fi \fi}
+
+\def\thecurrentfloatnumber
+ {\ifnofloatcaption \else \ifnofloatnumber \else
+ \ifx\currentfloatnumber\relax\else
+ \labeltexts\currentfloat{\ctxlua{structure.lists.savedprefixednumber("\currentfloat",\currentfloatnumber)}}%
+ \fi
+ \fi \fi}
+
+\def\thecurrentfloatcaption
+ {\ifnofloatcaption \else
+ \ifx\currentfloatnumber\relax\else
+ \ctxlua{structure.lists.savedtitle("\currentfloat",\currentfloatnumber)}%
+ \fi
+ \fi}
+
+%D Captions.
+
+\let\floatcaptionsuffix\empty % an optional suffix
+\let\floatcaptionnumber\empty % a logical counter
+
+% the split is needed when for instance the float goes into
+% a multi page field and the list of figs becomes larger than
+% one page: cycle between 'only flush when object ref ok'
+% and 'one/many page fig list'; see "uguide finometer"
+%
+% potential sync bug with sectionblocks, see uguide.tex
+
+% NOT YET REDONE ! ! ! ! !
+
+ \unexpanded\def\placefloatcaption
+ {\dodoubleempty\doplacefloatcaption}
+
+ \long\def\doplacefloatcaption[#1][#2]#3%
+ {\setfloatcaption[#1][#2]{#3}%
+ \placefloatcaptiontext[#1]%
+ \placefloatcaptionreference[#1]}
+
+ \unexpanded\def\setfloatcaption % \dosetfloatcaption already in use
+ {\dodoubleempty\dodosetfloatcaption} % beware, name clash
+
+ \long\def\dodosetfloatcaption[#1][#2]#3% to do namespace for number/ascii
+ {\ifnofloatnumber % also handle trialtypesetting
+ \letgvalue{@fl@r@#1}\relax
+ \letgvalue{@fl@t@#1}\relax
+ \else
+ \preparefloatnumber{#1}%
+ \letgvalue{@fl@n@#1}\composedsectionnumber
+ % indirect macro can be more efficient
+ \setgvalue{@fl@r@#1}%
+ {\tracefloatnumber{#1}%
+ \ifconditional\retainfloatnumber\else
+ % todo
+ \fi
+ \letgvalue{@fl@r@#1}\relax}% nils
+ \setgvalue{@fl@t@#1}%
+ {\preparefullnumber{\??kj#1}{\getvalue{@fl@n@#1}}\preparednumber
+ \begingroup
+ \dosetfloatcaptionattributes\c!style\c!color
+ \begingroup
+ \dosetfloatcaptionattributes\c!headstyle\c!headcolor
+ \labeltexts{#1}{\preparednumber}%
+ \endgroup
+ \begingroup
+ \dosetfloatcaptionattributes\c!textstyle\c!textcolor
+ \dotfskip{\floatcaptionparameter\c!distance}#3%
+ \endgroup
+ \endgroup}%
+ \fi}
+
+ \long\def\dodosetfloatcaption[#1][#2]#3% to do namespace for number/ascii
+ {\letgvalue{@fl@r@#1}\relax
+ \letgvalue{@fl@t@#1}\relax}
+
+ \unexpanded\def\placefloatcaptiontext [#1]{\getvalue{@fl@t@#1}}
+ \unexpanded\def\placefloatcaptionnumber [#1]{\getvalue{@fl@n@#1}}
+ \unexpanded\def\placefloatcaptionreference[#1]{\getvalue{@fl@r@#1}}
+
+ % still needed for uguide
+
+ \let\placefloatlabel \placefloatcaption
+ \let\placefloatlabeltext \placefloatcaptiontext
+ \let\placefloatlabelreference \placefloatcaptionreference
+
+% TILL HERE
+
+\newbox\captionbox
+
+\long\def\putcompletecaption#1#2%
+ {\doifsomething{\floatcaptionparameter\c!spacebefore}{\blank[\floatcaptionparameter\c!spacebefore]}%
+ %\floatcaptionparameter\c!before % test for side effects first
+ \noindent
+ \gdef\lastcaptiontag{\strut#1}% was xdef
+ \begingroup
+ \dosetfloatcaptionattributes\c!style\c!color
+ \ifnofloatnumber
+ \else
+ \hbox{\dosetfloatcaptionattributes\c!headstyle\c!headcolor\strut#1}%
+ \ifnofloatcaption \else \ifemptyfloatcaption \else
+ \doifelsenothing{\floatcaptionparameter\c!spaceinbetween}
+ {\scratchskip\floatcaptionparameter\c!distance\relax
+ \dotfskip\scratchskip\emergencystretch.5\scratchskip}
+ {\blank[\floatcaptionparameter\c!spaceinbetween]}%
+ \fi \fi
+ \fi
+ \ifnofloatcaption
+ \globallet\lastcaptionht\!!zeropoint
+ \globallet\lastcaptiondp\!!zeropoint
+ \else
+ \dosetfloatcaptionattributes\c!textstyle\c!textcolor
+ \xdef\lastcaptionht{\strutheight}%
+ \xdef\lastcaptiondp{\strutdepth}%
+ \begstrut#2\endstrut\endgraf
+ \fi
+ \endgroup
+ %\floatcaptionparameter\c!after % test for side effects first
+ \doifsomething{\floatcaptionparameter\c!spaceafter}{\blank[\floatcaptionparameter\c!spaceafter]}}
+
+\let\lastcaptionht\!!zeropoint
+\let\lastcaptiondp\!!zeropoint
+
+\newbox\tempcaptionbox
+
+\newif\iftracecaptions
+
+\def\settracedcaptionbox
+ {\iftracecaptions\setbox\tempcaptionbox\ruledhbox{\box\tempcaptionbox}\fi}
+
+% \definefloat [figure-1] [figure]
+% \definefloat [figure-2] [figure]
+% \setupfloat [figure-1] [location=left,leftmargin=10mm]
+% \setupfloat [figure-2] [location=left,leftmargin=-5mm]
+% \setupcaption [figure-1] [align=flushleft]
+% \setupcaption [figure-2] [align=flushleft,leftmargin=15mm]
+%
+% \startsetups somefigure
+% \ifdim\wd\nextbox>\textwidth
+% \placefloat[figure-2][][]{}{\box\nextbox}
+% \else
+% \placefloat[figure-1][][]{}{\box\nextbox}
+% \fi
+% \stopsetups
+%
+% \unexpanded\def\setupswithbox[#1]{\dowithnextbox{\setups[#1]}\vbox}
+%
+% test \setupswithbox[somefigure]{\framed[width=3cm] {}} test
+% test \setupswithbox[somefigure]{\framed[width=\dimexpr\textwidth+3cm\relax]{}} test
+
+\def\dosetcaptionthings
+ {\doprocesslocalsetups{\floatcaptionparameter\c!setups}% expanded ?
+ %\advance\leftskip \floatcaptionparameter\c!leftmargin
+ %\advance\rightskip\floatcaptionparameter\c!rightmargin
+ \relax}
+
+\def\dofakecaptionthings
+ {\hbox{\dosetcaptionthings\hskip\leftskip\hskip\rightskip}}
+
+\long\def\docheckcaptioncontent#1#2%
+ {\ifnofloatcaption \else
+ \setbox\tempcaptionbox\hbox
+ {\trialtypesettingtrue
+ \notesenabledfalse
+ \putcompletecaption{#1}{#2}}%
+ % new, \placefigure{\XMLflush{somecaption}}{} passes earlier empty check
+ % so here we misuse the scratch box; actually this means that the previous
+ % test can go away (some day, when i redo this module)
+ \ifdim\wd\tempcaptionbox=\zeropoint
+ \global\emptyfloatcaptiontrue
+ \ifnofloatnumber
+ \global\nofloatcaptiontrue
+ \fi
+ \else
+ \setbox\tempcaptionbox\hbox{\dosetcaptionthings\hskip\leftskip\box\tempcaptionbox}% yet incomplete
+ \fi
+ \fi}
+
+% the tricky part of getting float related two pass data is
+% that we should fetch is early but can only save it with
+% the composed float box; this determines the order: get it
+% before saving it
+
+\definetwopasslist{\s!float\s!data} \newcounter\noffloatdata
+
+\let\twopassfloatdata\realpageno % used for odd/even determination, can be combined with nodelocation
+
+\def\dosavefloatdata % \expanded ... will change in mkiv
+ {\doglobal\increment\noffloatdata
+ \lazysavetaggedtwopassdata{\s!float\s!data}{\noffloatdata}{\noffloatpages}{\noexpand\realfolio}}% later {}{}{}{} and \getfirst...
+
+\def\dogetfloatdata % precedes save !
+ {\doglobal\increment\noffloatpages
+ \findtwopassdata{\s!float\s!data}{\noffloatpages}%
+ \iftwopassdatafound
+ \globallet\twopassfloatdata\twopassdata
+ \else
+ \globallet\twopassfloatdata\realpageno % \realfolio
+ \fi}
+
+\def\tracefloatnumber#1%
+ {\doifnot{\floatsharedparameter\c!numbering}\v!nocheck{\tagnodelocation{\v!float\@@thenumber{#1}}}}
+
+\newconditional\retainfloatnumber
+
+\def\preparefloatnumber#1%
+ {\xdef\floatcaptionnumber{#1}%
+ \doifelsenodelocation{\v!float\@@thenumber{#1}}
+ \donothing {\chardef\nodelocationmode\zerocount}%
+ \doifelse{\floatsharedparameter\c!numbering}\v!nocheck
+ {\incrementnumber[#1]%
+ \makesectionnumber[#1]%
+ \ifconditional\retainfloatnumber\decrementnumber[#1]\fi}
+ {\ifinsidecolumns
+ \chardef\nodelocationmode\zerocount
+ % to be perfected:
+ % \chardef\nodelocationmode\plustwo
+ \fi
+% FOR THE MOMENT NOT AVAILABLE
+\chardef\nodelocationmode\zerocount
+% BUT NOT THAT HARD TO DO
+ \ifcase\nodelocationmode
+ \incrementnumber[#1]%
+ \makesectionnumber[#1]%
+ \ifconditional\retainfloatnumber\decrementnumber[#1]\fi
+ \else
+ % force check, so that we get a proper way-sync and
+ % can use the accumulated number
+ % \checknumber[#1]% \incrementnumber does this
+ \incrementnumber[#1]%
+ \savenumber[#1]%
+ % the real work is done here
+ \nextnodelocation{\v!float\@@thenumber{#1}}% better \nextfloatnumber
+ \analyzenodelocation{\v!float\@@thenumber{#1}}%
+ \scratchcounter\getnodelocationo{\v!float\@@thenumber{#1}}%
+ \advance\scratchcounter\minusone
+ % here we correct for 'per whatever handling'
+ \advance\scratchcounter-\accumulatednumber[#1]%
+ \setnumber[#1]\scratchcounter
+ \incrementnumber[#1]%
+ \makesectionnumber[#1]%
+ \restorenumber[#1]%
+ % now we're back to normal numbering
+ \fi}}
+
+%D test case:
+%D
+%D \starttyping
+%D \setupfloat[figure][criterium=\marginwidth,fallback=bottom]
+%D \dorecurse{3}{
+%D \chapter{test}
+%D \placefigure[bottom]{1}{\framed{bottom}}
+%D test
+%D \placetable[bottom]{1}{\framed{table}}
+%D test
+%D \placetable{2}{\framed{table}}
+%D test
+%D \placefigure[left]{2}{\framed{left but way too wide}}
+%D \input tufte
+%D \placefigure[left]{3}{\framed{left but ok}}
+%D \input tufte }
+%D \stoptyping
+
+% A complication is that we may have to handle a pagebreak
+% first, which in turn may issue a (postponed) float.
+% Therefore we may not trust on variable assignments before
+% we're realy dealing with the float. Some day I'll root out
+% the global settings.
+
+\def\docomplexplacefloat[#1][#2]% [#3]#4%
+ {\edef\currentfloat{#1}%
+ \doifnothing\currentfloat{\let\currentfloat\v!figure}%
+ \doifelsenothing{#2}
+ {\edef\floatlocation{\floatparameter\c!default}}
+ {\edef\floatlocation{#2}}%
+ \doifinsetelse\v!split{#2}
+ {\normalexpanded{\noexpand\dodocomplexsplitfloat[\currentfloat][\floatlocation]}}
+ {\normalexpanded{\noexpand\dodocomplexplacefloat[\currentfloat][\floatlocation]}}}
+
+\long\def\dodocomplexsplitfloat[#1][#2][#3]#4%
+ {\splitfloat{\dodocomplexplacefloat[#1][#2][#3]{#4}}}
+
+\def\flushfloatslist
+ {\v!left,\v!right,\v!inner,\v!outer,%
+ \v!backspace,\v!cutspace,%
+ \v!inleft,\v!inright,\v!inmargin,%
+ \v!leftmargin,\v!rightmargin,\v!leftedge,\v!rightedge,%
+ \v!innermargin,\v!outermargin,\v!inneredge,\v!outeredge,%
+ \v!text,\v!opposite}% \v!page
+
+\long\def\dodocomplexplacefloat[#1][#2][#3]#4%
+ {\flushnotes
+ \flushsidefloats % here !
+ \ifsomefloatwaiting
+ % this was \checkwaitingfloats spread all over
+ \doifinsetelse\v!always{#2}
+ {\showmessage\m!floatblocks5\empty}
+ {\normalexpanded{\noexpand\doifcommonelse{#2}{\flushfloatslist}}\doflushfloats\donothing}%
+ % but which should be done before using box \floatbox
+ \fi
+ \ifmarginblocks
+ \doifinset\v!margin{#2}\endgraf
+ \fi
+ \global\insidefloattrue
+ \begingroup % **
+ \ifmarginblocks
+ \doifinset\v!margin{#2}{\hsize\@@mbwidth}%
+ \fi
+ \the\everyinsidefloat
+ \let\@@extrafloat\empty
+ \presetmorefloatvariables{#2}%
+ \dowithnextboxcontent % better a \the\everyfloattoks
+ {\setlocalfloathsize
+ \floatparameter\c!inner
+ \postponenotes} % new
+ {\doifsomething{\floatparameter\c!criterium}
+ {\ifdim\wd\nextbox>\floatparameter\c!criterium\relax
+ \edef\forcedfloatmethod{\floatvariable\c!fallback}%
+ \ifx\forcedfloatmethod\empty\let\forcedfloatmethod\v!here\fi
+ \fi}%
+ \xdocompletefloat{#1}{#3}{#2}{#4}% ** not yet done
+ % we need to carry over the par because of side floats
+ \doifnotinset\v!text{#2}{\carryoverpar\endgroup}%
+ \global\sidefloatdownshift \zeropoint
+ \global\sidefloatextrashift\zeropoint
+ \ifparfloat
+ \doifinset\v!reset{#2}\forgetsidefloats
+ \doinhibitblank
+ \fi}% better move this to side floats
+ \vbox}
+
+\def\xxdocompletefloat#1#2%
+ {\rightorleftpageaction{\let\@@extrafloat#1}{\let\@@extrafloat#2}}
+
+\chardef\textfloatmethod=0 % 0=raw 1=safe (.99) 2=tight (-1pt)
+\chardef\sidefloatmethod=1 % 0=raw 1=safe (.99) 2=tight (-1pt)
+
+\let\floatrotation\!!zerocount
+
+\long\def\presetfloatvariables#1#2#3#4%
+ {\doifcommonelse
+ {#2}
+ {\v!left,\v!right,\v!inner,\v!outer,%
+ \v!inleft,\v!inright,\v!inmargin,%
+ \v!backspace,\v!cutspace,%
+ \v!innermargin,\v!outermargin,\v!inneredge,\v!outeredge,%
+ \v!leftmargin,\v!leftedge,\v!rightmargin,\v!rightedge}
+ {\global\parfloattrue}
+ {\global\parfloatfalse}%
+ \ifinsidecolumns
+ \global\parfloatfalse
+ \fi
+ \global\sidefloatshift\zeropoint
+ \global\sidefloatmaximum\zeropoint
+ \global\chardef\sidefloatmethod\floatparameter\c!sidemethod
+ \global\chardef\textfloatmethod\floatparameter\c!textmethod
+ \global\chardef\sidefloatalign\zerocount
+ \globallet\floatrotation\!!zerocount
+ \calculatefloatskips
+ \ifparfloat
+ \processaction
+ [\floatparameter\c!sidealign]
+ [\v!height=>\global\chardef\sidefloatalign\plusone,%
+ \v!line=>\global\chardef\sidefloatalign\plustwo,% (***)
+ \v!depth=>\global\chardef\sidefloatalign\plusthree,%
+ \v!grid=>\global\chardef\sidefloatalign\plusfour,%
+ \v!halfline=>\global\chardef\sidefloatalign\plusfive]%
+ % todo (test first): \doifinset\v!lokaal{#2}{\chardef\sidefloatalign\zerocount}%
+ \ifcase\sidefloatalign\relax % todo: optie v!lokaal => \else
+ \doifinset\v!height {#2}{\global\chardef\sidefloatalign\plusone}%
+ \doifinset\v!line {#2}{\global\chardef\sidefloatalign\plustwo}%
+ \doifinset\v!depth {#2}{\global\chardef\sidefloatalign\plusthree}%
+ \doifinset\v!grid {#2}{\global\chardef\sidefloatalign\plusfour}%
+ \doifinset\v!halfline{#2}{\global\chardef\sidefloatalign\plusfive}% meant for 'none'
+ \fi
+ \doifinset\v!high{#2}{\global\sidefloattopskip \zeropoint}%
+ \doifinset\v!low {#2}{\global\sidefloatbottomskip\zeropoint}%
+ \doifinset\v!fit {#2}
+ {\global\sidefloattopskip \zeropoint
+ \global\sidefloatbottomskip\zeropoint
+ \global\floatsideskip \zeropoint}%
+ \else
+ \processallactionsinset
+ [#2]
+ [ 90=>\globallet\floatrotation\commalistelement,%
+ 180=>\globallet\floatrotation\commalistelement,%
+ 270=>\globallet\floatrotation\commalistelement]%
+ \fi
+ \doifinsetelse\v!nonumber{#2}
+ {\global\nofloatnumbertrue}
+ {\doifelse{\floatcaptionparameter\c!number}\v!yes
+ {\global\nofloatnumberfalse}
+ {\global\nofloatnumbertrue}}%
+ % this has to change
+ \ConvertToConstant\doifelse{#4}{}
+% \ConvertToConstant\doifelse{\detokenize{#4}}{}
+ {\global\emptyfloatcaptiontrue}
+ {\global\emptyfloatcaptionfalse}%
+% \doifinsetelse\v!none{#2}
+% {\global\nofloatcaptiontrue}
+% {\ConvertToConstant\doifelse{#4}\v!none
+% {\global\nofloatcaptiontrue}
+% {\global\nofloatcaptionfalse}}%
+ \doifinsetelse\v!none{#2}
+ {\global\nofloatcaptiontrue}
+ {\global\nofloatcaptionfalse}%
+ \doif{\floatcaptionparameter\c!number}\v!none % new
+ {\global\nofloatcaptiontrue}%
+ \ifemptyfloatcaption \ifnofloatnumber
+ \global\nofloatcaptiontrue
+ \fi \fi}
+
+% documenteren in details
+
+\def\presetmorefloatvariables#1%
+ {\doifelse{\floatparameter\c!local}\v!yes % fout keyword
+ \globalcenterfloatboxtrue
+ \globalcenterfloatboxfalse
+ \ifglobalcenterfloatbox
+ \localcenterfloatboxtrue
+ \else
+ \doifinsetelse\v!local{#1}
+ \localcenterfloatboxtrue
+ \localcenterfloatboxfalse
+ \fi
+ \doifnotcommon{\v!always,\v!here,\v!force}{#1} % ! ! ! ! ! !
+ {\globalcenterfloatboxfalse
+ \localcenterfloatboxfalse}}
+
+\let\naturalfloatheight\!!zeropoint
+\let\naturalfloatwidth \!!zeropoint
+\let\naturalfloatdepth \!!zeropoint
+
+\def\setnaturalfloatdimensions#1%
+ {\xdef\naturalfloatheight{\the\ht#1}%
+ \xdef\naturalfloatwidth {\the\wd#1}%
+ \xdef\naturalfloatdepth {\the\dp#1}}
+
+\long\def\doifelsemainfloatbody#1#2%
+ {\ifinsidesplitfloat\ifconditional\splitfloatfirstdone#2\else#1\fi\else#1\fi}
+
+% todo: optional user pars
+
+\let\currentfloatattribute\empty % to be checked
+
+\def\floatcaptionattribute
+ {\iflocation \ifnofloatnumber \else \ifnofloatcaption \else
+ attr \destinationattribute \currentfloatattribute
+ \fi \fi \fi}
+
+\long\def\docompletefloat#1#2#3#4#5% #1:floatclass #2:reference #3:optionlist #4:caption #5:box number
+ {\presetfloatvariables{#1}{#3}{#2}{#5}% check this one
+ \bgroup
+ % prepare structure data
+ %
+ % \dofloatcomponent[\c!name=#1,\c!reference=#2,\c!bookmark=,\c!title={#4}][]% ifnofloatnumber ifnofloatcaption \tracefloatnumber{#1}%
+ %
+ \dostructurecountercomponent
+ {float}%
+ \getcaptionparameters
+ \floatcaptionparameter
+ \detokenizedcaptionparameter
+ \relax
+ \relax
+ \relax
+ [\c!name=\currentfloat,\s!counter=\@@thestructurecounter\currentfloat,%
+ \s!hascaption=\ifnofloatcaption \v!no\else\v!yes\fi,%
+ \s!hasnumber=\ifnofloatnumber \v!no\else\v!yes\fi,%
+ \s!hastitle=\ifemptyfloatcaption\v!no\else\v!yes\fi,%
+ \c!reference=#2,\c!title={#4},\c!bookmark=]%
+ []%
+ \globallet\currentfloatnumber \laststructurecounternumber
+ \globallet\currentfloatattribute \laststructurecounterattribute
+ \globallet\currentfloatsynchronize\laststructurecountersynchronize
+ %
+ % check float box
+ \setnaturalfloatdimensions#5%
+ \global\setbox\floatbox\vbox{\floatparameter\c!command{\box#5}}%
+ \setnaturalfloatdimensions\floatbox
+ \ifdim\htdp\floatbox=\zeropoint
+ \showmessage\m!floatblocks{11}\empty
+ \global\setbox\floatbox\vbox{\doemptyfloatblock{#1}}%
+ \fi
+ % deal with lack of caption
+ \global\setbox\floatbox\vbox \floatcaptionattribute
+ {\doifelsemainfloatbody\currentfloatsynchronize\donothing
+ \unvbox\floatbox
+ \ifnofloatcaption
+ \vss
+ \fi}% gets rid of the depth (unless tabulate)
+ \egroup
+ % place the float
+ \dofloat{#3}{\thecurrentfloatnumber}{\thecurrentfloatcaption}%
+ \global\insidefloatfalse}
+
+\def\setlocalfloathsize
+ {\iflocalcenterfloatbox
+ \seteffectivehsize
+ \hsize\localhsize
+ \fi}
+
+\newevery \everyinsidefloat \relax
+
+\appendtoks
+ \everyinsidefloat\emptytoks % in case it's called earlier
+ \dogetfloatdata
+\to \everyinsidefloat
+
+\def\doifrightpagefloatelse
+ {\ifdoublesided
+ \ifsinglesided
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\doifoddfloatpageelse
+ \fi
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
+
+\def\doifoddfloatpageelse
+ {\ifodd\purenumber\twopassfloatdata\space
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\appendtoks
+ \let\rightorleftpageaction\doifrightpagefloatelse
+\to \everyinsidefloat
+
+\newif\ifextrafloatactions \extrafloatactionstrue
+
+% \let\movesidefloat\gobbleoneargument
+
+% new : \place...[leftmargin,-2*line]; we need to catch fxtb:2*3
+% watch out: line alone aligns on the line ! ! !
+
+\def\movesidefloat[#1]% (-)n*line|x=,y=
+ {\global\sidefloatdownshift \zeropoint
+ \global\sidefloatextrashift\zeropoint
+ \doifassignmentelse{#1}%
+ {\bgroup
+ \getparameters[\??fl][\c!x=\zeropoint,\c!y=\zeropoint,#1]%
+ \ifgridsnapping
+ \getnoflines\@@fly
+ \global\sidefloatdownshift\noflines\lineheight
+ \else
+ \global\sidefloatdownshift\@@fly
+ \fi
+ \global\sidefloatextrashift\@@flx
+ \egroup}
+ {\movedownsidefloat[#1]}}
+
+\def\movedownsidefloat[#1]% already in core
+ {\bgroup
+ \cleanupfeatures
+ \doifinstringelse{:}{#1}
+ \donothing
+ {\def\docommand##1%
+ {\processaction
+ [##1]%
+ [ \v!line=>\dodocommand+,%
+ +\v!line=>\dodocommand+,%
+ -\v!line=>\dodocommand-]}%
+ \def\dodocommand##1%
+ {\ifdone\else\global\sidefloatdownshift\zeropoint\donetrue\fi
+ \global\advance\sidefloatdownshift##1\lineheight}%
+ \donefalse\normalexpanded{\noexpand\dorepeatwithcommand[#1]}\docommand
+ \def\docommand##1%
+ {\processaction
+ [##1]%
+ [ \v!hang=>\dodocommand+,%
+ +\v!hang=>\dodocommand+,%
+ -\v!hang=>\dodocommand-]}%
+ \def\dodocommand##1% inefficient but who cares
+ {\ifdone\else\global\sidefloatsidelines\zeropoint\donetrue\fi
+ \global\advance\sidefloatsidelines\plusone\relax}%
+ \donefalse\normalexpanded{\noexpand\dorepeatwithcommand[#1]}\docommand}%
+ \egroup}
+
+\def\hangsidefloat[#1]%
+ {\global\sidefloatsidelines#1\relax}
+
+\long\def\xdocompletefloat#1#2#3#4%
+ {\ifextrafloatactions
+ \doifinsetelse\v!text{#3}
+ {% fuzzy, text overloads left, since then it's a directive
+ \docompletefloat{#1}{#2}{#3}{#4}\nextbox}
+ {\let\@@extrafloat\empty
+ % \sidefloatdownshift will be reset afterwards, and can
+ % already be set at this point
+ \processallactionsinset
+ [#3] % ininner/inouter : for old times sake
+ [ \v!inner=>\xxdocompletefloat\v!left \v!right,
+ \v!outer=>\xxdocompletefloat\v!right \v!left,
+ \v!innermargin=>\xxdocompletefloat\v!leftmargin \v!rightmargin,
+ \v!outermargin=>\xxdocompletefloat\v!rightmargin\v!leftmargin,
+ \v!inneredge=>\xxdocompletefloat\v!leftedge \v!rightedge,
+ \v!outeredge=>\xxdocompletefloat\v!rightedge \v!leftedge,
+ \v!backspace=>\xxdocompletefloat\v!backspace \v!cutspace,
+ \v!cutspace=>\xxdocompletefloat\v!cutspace \v!backspace,
+% \v!margin=>\xxdocompletefloat\v!cutspace \v!backspace,
+ \v!left=>\xxdocompletefloat\v!left \v!left,
+ \v!right=>\xxdocompletefloat\v!right \v!right,
+ \v!line=>, % only -n*line is handled (see ***)
+ \s!unknown=>{\movedownsidefloat[\commalistelement]}]%
+ \ifx\@@extrafloat\empty
+ \docompletefloat{#1}{#2}{#3}{#4}\nextbox
+ \else
+ \docompletefloat{#1}{#2}{\@@extrafloat,#3}{#4}\nextbox
+ \fi}%
+ \else % downward compatible
+ \docompletefloat{#1}{#2}{#3}{#4}\nextbox
+ \fi}
+
+% pas op, maxbreedte niet instellen als plaats=links/rechts
+
+\def\setlocalfloatdimensions#1%
+ {\global\sidefloatshift \zeropoint % duplicate
+ \global\sidefloatmaximum\zeropoint\relax % duplicate
+ \ifextrafloatactions
+ \ifdim\sidefloatdownshift=\zeropoint\else
+ \global\setbox\floatbox\vbox
+ {\vskip\sidefloatdownshift\nointerlineskip\box\floatbox}%
+ \fi
+ \doifsomething{\floatparameter\c!minwidth}
+ {\scratchdimen\floatparameter\c!minwidth\relax
+ \ifdim\wd\floatbox<\scratchdimen
+ \global\setbox\floatbox\hbox to \scratchdimen
+ {\doifnot{\floatparameter\c!location}\v!left \hss
+ \box\floatbox%
+ \doifnot{\floatparameter\c!location}\v!right\hss}%
+ \fi}%
+ % todo: rand / rug
+ \doifinset\v!hanging{#1}
+ {\doifcommonelse{\v!inleft,\v!leftmargin}{#1}
+ {\letfloatparameter\c!maxwidth\leftmarginwidth}%
+ {\doifcommon{\v!inright,\v!rightmargin}{#1}
+ {\letfloatparameter\c!maxwidth\rightmarginwidth}}}%
+ \doifsomething{\floatparameter\c!maxwidth}
+ {\scratchdimen\floatparameter\c!maxwidth\relax
+ \ifdim\wd\floatbox>\scratchdimen
+ \doifcommonelse{\v!inright,\v!rightmargin,\v!rightedge
+ \v!inleft,\v!leftmargin,\v!leftedge}{#1}
+ {\global\sidefloatmaximum\scratchdimen}
+ {\global\setbox\floatbox\hbox to \scratchdimen
+ {\doifcommonelse{\v!right,\v!left}{#1}
+ {\doifnotinset\v!right{#1}\hss
+ \box\floatbox
+ \doifnotinset\v!left{#1}\hss}%
+ {\doifnot{\floatparameter\c!location}\v!left\hss
+ \box\floatbox
+ \doifnot{\floatparameter\c!location}\v!right\hss}}}%
+ \fi}%
+ \fi}
+
+\def\docomplexstarttextblock[#1][#2][#3]%
+ {\flushnotes
+ \flushsidefloats % hoort eigenlijk niet hier
+ \docomplexplacefloat[#1][\v!text,#2,\v!left][#3]}
+
+\long\def\docomplexreserveblock[#1][#2][#3][#4]#5%
+ {\getvalue{\e!place#1}[#3][#4]{#5}{\localframed[\??fl#1][#2]{#1}}}
+
+\def\docomplexstartreservetextblock[#1][#2][#3][#4]%
+ {\flushsidefloats % hoort eigenlijk niet hier
+ \docomplexreserveblock[#1][#2][\v!text,#3,\v!left][#4]}
+
+\unexpanded\def\placefloat
+ {\dotripleempty\docomplexplacefloat}
+
+\installinsertion\topins
+\installinsertion\botins
+
+\newdimen\botinserted
+\newdimen\topinserted
+
+\newif\iftopofinsert
+\newif\iftestfloatbox
+
+\newdimen\floatsideskip \floatsideskip =12pt
+\newdimen\floattopskip \floattopskip =\floattopskip
+\newdimen\floatbottomskip \floatbottomskip=\floattopskip
+
+\newdimen\sidefloattopskip \sidefloattopskip =\floattopskip
+\newdimen\sidefloatbottomskip \sidefloatbottomskip=\floatbottomskip
+
+\newskip\sidefloatdownshift
+\newskip\sidefloatleftshift
+\newskip\sidefloatrightshift
+
+\def\sidefloattopoffset {\openstrutdepth} % {\strutdp}
+
+\newcount\noftopfloats \noftopfloats=2
+\newcount\nofbotfloats \nofbotfloats=0
+
+\def\docalculatefloatskip#1#2%
+ {\doifelsenothing{#2}
+ {\global#1\zeropoint}
+ {\doifelse{#2}\v!none
+ {\global#1\zeropoint}
+ {\setbox\scratchbox\vbox{\whitespace\normalexpanded{\noexpand\blank[#2]}}%
+ \global#1\ht\scratchbox}}}
+
+\def\calculatefloatskips
+ {{\docalculatefloatskip\floattopskip{\floatsharedparameter\c!spacebefore}%
+ \docalculatefloatskip\floatbottomskip{\floatsharedparameter\c!spaceafter}%
+ \docalculatefloatskip\sidefloattopskip{\floatsharedparameter\c!sidespacebefore}%
+ \docalculatefloatskip\sidefloatbottomskip{\floatsharedparameter\c!sidespaceafter}%
+ \gdef\sidefloattopoffset{\openstrutdepth}% was \def
+ \global\floatsideskip\floatsharedparameter\c!margin
+ \global\sidefloatleftshift\floatparameter\c!leftmargindistance
+ \global\sidefloatrightshift\floatparameter\c!rightmargindistance
+ \global\noftopfloats\floatsharedparameter\c!ntop\relax
+ \global\nofbotfloats\floatsharedparameter\c!nbottom\relax}}
+
+% beter de laatste skip buiten de \insert uitvoeren,
+% bovendien bij volle flush onder baseline.
+
+% \def\betweenfloatblanko% assumes that spaceafter is present
+% {\bgroup
+% \setbox0\vbox{\strut\blank[\floatsharedparameter\c!spacebefore]\strut}%
+% \setbox2\vbox{\strut\blank[\floatsharedparameter\c!spaceafter]\strut}%
+% \ifdim\ht0>\ht2
+% \blank[-\floatsharedparameter\c!spaceafter,\floatsharedparameter\c!spacebefore]%
+% \fi
+% \egroup}
+
+\def\betweenfloatblanko% assumes that spaceafter is present
+ {\blank[\floatsharedparameter\c!spacebefore]} % or v!back,....
+
+\def\doplacefloatbox
+ {%\forgetall % NO
+ \whitespace
+ \blank[\floatsharedparameter\c!spacebefore]
+ \flushfloatbox
+ \blank[\floatsharedparameter\c!spaceafter]}
+
+\ifdefined\someherefloat\else \let\someherefloat\doplacefloatbox \fi
+\ifdefined\someslotfloat\else \let\someslotfloat\doplacefloatbox \fi
+\ifdefined\somefixdfloat\else \let\somefixdfloat\doplacefloatbox \fi
+\ifdefined\sometopsfloat\else \let\sometopsfloat\doplacefloatbox \fi
+\ifdefined\somebotsfloat\else \let\somebotsfloat\doplacefloatbox \fi
+\ifdefined\somesidefloat\else \let\somesidefloat\doplacefloatbox \fi
+
+% test case:
+%
+% \placefigure[page,none]{}{\blackrule[width=\textwidth,height=0.9\textheight,color=green]}
+% \placefigure[page,none]{}{\blackrule[width=\textwidth,height=1.0\textheight,color=green]}
+% \placefigure[page,none]{}{\blackrule[width=\textwidth,height=1.1\textheight,color=green]}
+
+\def\sometextfloat[#1]% lang, links, rechts, hoog, midden, laag, offset
+ {%\checkwaitingfloats{#1}%
+ \gdef\dostoptextfloat{\dodostoptextfloat[#1]}% brr global
+ \global\floattextwidth\hsize
+ \global\floatwidth\wd\floatbox
+ \global\floatheight\ht\floatbox % forget about the depth
+ \global\advance\floattextwidth -\floatwidth
+ \global\advance\floattextwidth -\floatsharedparameter\c!margin\relax % was \tfskipsize
+ \doifinsetelse\v!tall{#1}
+ {\floattextheight\pagegoal
+ \advance\floattextheight -\pagetotal
+ \advance\floattextheight -\bigskipamount % lelijk
+ \ifdim\floattextheight>\textheight
+ \floattextheight\textheight
+ \fi
+ \boxmaxdepth\zeropoint \relax % toegevoegd
+ \ifdim\floattextheight<\floatheight
+ \floattextheight\floatheight
+ \fi
+ \setbox\floattext\vbox to \floattextheight}
+ {\setbox\floattext\vbox}%
+ \bgroup
+ \forgetall \setupblank \setupwhitespace % new, also needed for footnotes
+ \blank[\v!disable]
+ \hsize\floattextwidth
+ \ignorespaces}
+
+\def\dodostoptextfloat[#1]% % de tekst kan beter in een soort
+ {\egroup % kadertekst zonder kader, is flexibeler
+ \doifnotinset\v!tall{#1}% en beter
+ {\ifdim\ht\floattext<\floatheight
+ \floattextheight\floatheight
+ \else
+ \floattextheight\ht\floattext
+ \fi}%
+ \setbox\floatbox\vbox to \floattextheight
+ {\hsize\floatwidth
+ \doifinsetelse\v!both{#1}%
+ {\doifinsetelse\v!low{#1}
+ {\vfill\box\floatbox}
+ {\doifinsetelse\v!middle{#1}
+ {\vfill\box\floatbox\vfill}
+ {\box\floatbox\vfill}}}
+ {\box\floatbox\vfill}}%
+ \setbox\floattext\vbox to \floattextheight
+ {\hsize\floattextwidth
+ \doifinsetelse\v!low{#1}
+ {\vfill
+ \box\floattext
+ \doifinset\c!offset{#1}{\whitespace\blank}}
+ {\doifinsetelse\v!middle{#1}
+ {\vfill
+ \box\floattext
+ \vfill}
+ {\doifinset\v!offset{#1}{\whitespace\blank}%
+ \box\floattext
+ \vfill}}}%
+ \doifinsetelse\v!right{#1}% \floatmethod
+ {\setbox\floatbox\hbox to \hsize
+ {\box\floattext
+ \hfill
+ \box\floatbox}}
+ {\setbox\floatbox\hbox to \hsize
+ {\box\floatbox
+ \hfill
+ \box\floattext}}%
+ \baselinecorrection
+ \whitespace
+ \blank[\floatsharedparameter\c!spacebefore]%
+ \doifnotinset\v!tall{#1}%
+ {\dp\floatbox\openstrutdepth}% dp\strutbox}% % toegevoegd
+ \box\floatbox
+ \blank[\floatsharedparameter\c!spaceafter]%
+ \endgroup % **
+ \doinsertfloatinfo}
+
+\def\somefacefloat[#1]% links, rechts, midden, hoog, midden, laag
+ {%\checkwaitingfloats{#1}%
+ \startopposite\box\floatbox\stopopposite
+ \doinsertfloatinfo}
+
+\def\someelsefloat[#1]%
+ {\doifinsetelse\v!here{#1}
+ {\doifinsetelse\v!always{#1}
+ {\page[\v!preference]%
+ \docheckiffloatfits
+ \ifroomforfloat
+ \placesomeherefloat[#1]%
+ \else
+ \showmessage\m!floatblocks9\empty
+ \doreversesavefloat
+ \fi}
+ {\ifsomefloatwaiting
+ \dosavefloat
+ \else
+ \page[\v!preference]%
+ \docheckiffloatfits
+ \ifroomforfloat
+ \placesomeherefloat[#1]%
+ \else
+ \dosavefloat
+ \fi
+ \fi}}
+ {\doifinsetelse\v!always{#1}
+ {\docheckiffloatfits
+ \ifroomforfloat
+ \sometopbottomfloat[#1]
+ \else
+ \showmessage\m!floatblocks9\empty
+ \doreversesavefloat
+ \fi}
+ {\docheckiffloatfits
+ \ifroomforfloat
+ \sometopbottomfloat[#1]
+ \else
+ \dosavefloat
+ \fi}}}
+
+\def\floatautofactor{.5}
+
+\def\sometopbottomfloat[#1]%
+ {\doifelse\floatmethod\v!auto
+ {\ifdim\pagetotal<\floatautofactor\pagegoal % when empty page, maxdimen
+ \placesometopsfloat[#1]%
+ \else
+ \placesomebotsfloat[#1]%
+ \fi}
+ {\doifelse\floatmethod\v!top
+ {\placesometopsfloat[#1]}
+ {\doifelse\floatmethod\v!bottom
+ {\placesomebotsfloat[#1]}
+ {\placesomeherefloat[#1]}}}}
+
+\def\borderedfloatbox
+ {\localframed
+ [\??fl\currentfloat]
+ [\c!location=\v!normal,\c!width=\wd\floatbox,\c!height=\htdp\floatbox]
+ {\box\floatbox}}
+
+\newbox\tempfloatbox
+
+% minwidth=fit,width=max : no overshoot, as wide as graphic
+
+\ifdefined\moveboxontogrid\else \let\movecaptionontogrid\gobblethreearguments \fi
+
+\def\locatefloatbox
+ {\chardef\alignstrutmode\zerocount
+ \shiftalignedline
+ {\floatparameter\c!leftmargin }{\floatparameter\c!rightmargin}%
+ {\floatparameter\c!innermargin}{\floatparameter\c!outermargin}%
+ \alignedline{\floatparameter\c!location}\v!middle}
+
+\def\locatecaptionbox
+ {\chardef\alignstrutmode\zerocount
+ \shiftalignedline
+ {\floatcaptionparameter\c!leftmargin }{\floatcaptionparameter\c!rightmargin}%
+ {\floatcaptionparameter\c!innermargin}{\floatcaptionparameter\c!outermargin}%
+ \alignedline{\floatparameter\c!location}\v!middle}
+
+\long\def\dosetpagfloat#1#2#3% \copy wegwerken
+ {\bgroup
+ \setlocalfloathsize
+ \ifnum\floatrotation>0
+ \swapdimens\hsize\vsize
+ \fi
+ \forgetall
+ \postponenotes
+ \dontcomplain
+ \setbox\tempfloatbox\vbox{\borderedfloatbox}%
+ \let\locatefloat \locatefloatbox
+ \let\locatecaption\locatecaptionbox
+ \docheckcaptioncontent{#2}{#3}%
+ \ifcase\floatparameter\c!method
+ \or % automatic
+ \ifnofloatcaption
+ \dopreparenocaption{#1}{#2}{#3}%
+ \edef\width{\the\wd\floatbox}%
+ \doglobal\addlocalbackgroundtobox\floatbox
+ \else
+ % todo: installable maken, variant/method=auto vs macro
+ \dopreparedocaption{#1}{#2}{#3}%
+ \settracedcaptionbox
+ \edef\width{\the\wd\tempfloatbox}%
+ \addlocalbackgroundtobox\tempfloatbox
+ \setbox\tempcaptionbox\hbox
+ {\dosetcaptionthings
+ \floatcaptionparameter\c!command{\box\tempcaptionbox}}%
+ \moveboxontogrid\tempcaptionbox{\floatcaptionparameter\c!grid}\lastcaptionht
+ \addlocalbackgroundtobox\tempcaptionbox
+ \buildfloatbox
+ \fi
+ \or % semi automatic
+ \or % manual
+ \fi
+ \ifnum\floatrotation>0
+ \global\setbox\floatbox\vbox
+ {\rotate[\c!rotation=\floatrotation]{\box\floatbox}}%
+ \edef\width{\the\wd\tempfloatbox}%
+ \else
+ \postcenterfloatbox\width
+ \fi
+ \egroup}
+
+\def\captionminwidth {15\bodyfontsize}
+\def\captionovershoot {2em}
+
+\def\dopreparenocaption#1#2#3%
+ {\global\setbox\floatbox\vbox % pas op als wd groter dan hsize
+ {\ifinsidecolumns\ifdim\wd\tempfloatbox>\hsize
+ \let\locatefloat\relax
+ \fi\fi
+ \locatefloat{\copy\tempfloatbox}}}
+
+\def\dopreparedocaption#1#2#3%
+ {\doifinsetelse{\floatcaptionparameter\c!location}{\v!top,\v!bottom}
+ {\doifinsetelse{\floatcaptionparameter\c!width}{\v!fit,\v!max}
+ {\doifelse{\floatcaptionparameter\c!minwidth}\v!fit
+ {\doifelse{\floatcaptionparameter\c!width}\v!max
+ {\dopreparestackcaptionmax{#1}{#2}{#3}}
+ {\ifdim\wd\tempcaptionbox>\wd\tempfloatbox % wider caption
+ \doifelse{\floatcaptionparameter\c!width}\v!fit
+ {\dopreparestackcaptionaut{#1}{#2}{#3}}
+ {\dopreparestackcaptionwid{#1}{#2}{#3}}%
+ \else
+ \dopreparestackcaptionmin{#1}{#2}{#3}%
+ \fi}}
+ {\dopreparestackcaptionfix{#1}{#2}{#3}}}%
+ {\dopreparesidewidthcaption{#1}{#2}{#3}}}% new, special effects (see icare)
+ {\doifinsetelse{\floatcaptionparameter\c!width}{\v!fit,\v!max}
+ {\dopreparesideautocaption{#1}{#2}{#3}}
+ {\dopreparesidewidthcaption{#1}{#2}{#3}}}}
+
+% \def\dosettempcaptionbox
+% {\dosetraggedvbox{\floatcaptionparameter\c!align}%
+% \setbox\tempcaptionbox\raggedbox}
+
+\def\dosettempcaptionbox
+ {\setbox\tempcaptionbox\vbox\bgroup
+ %expanded{\setupalign[\v!new,\v!reset,\floatcaptionparameter\c!align,\v!old]}% wrong! see icare
+ \normalexpanded{\noexpand\setupalign[\v!reset,\floatcaptionparameter\c!align]}% i need to check what reset does
+ \dosetcaptionthings
+ \let\next}
+
+\def\dopreparesideautocaption#1#2#3%
+ {\scratchdimen\dimexpr\hsize-\wd\tempfloatbox-\floatparameter\c!margin\relax % was \tfskipsize\relax
+ \ifdim\wd\tempcaptionbox>\scratchdimen
+ \ifdim\wd\tempcaptionbox<1.3\scratchdimen
+ \scratchdimen0.8\scratchdimen
+ \fi
+ \fi
+ \dosettempcaptionbox
+ {\hsize\scratchdimen
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparesidewidthcaption#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!width
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionfix#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!minwidth % special effects
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionmax#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\wd\tempfloatbox
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionwid#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!width
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionmin#1#2#3%
+ {\dosettempcaptionbox
+ {\hsize\wd\tempfloatbox
+ \doifnothing{\floatcaptionparameter\c!align}\raggedcenter % on purpose overloads align !
+ \putcompletecaption{#2}{#3}}}
+
+\def\dopreparestackcaptionaut#1#2#3%
+ {\doifsomething{\floatcaptionparameter\c!align}
+ {\doifnotinset{\v!middle}{\floatcaptionparameter\c!align}%
+ {\let\captionovershoot\!!zeropoint}}%
+ \edef\captionhsize{\the\wd\tempfloatbox}%
+ \ifdim\captionhsize>\hsize
+ % float is wider than \hsize
+ \dosettempcaptionbox
+ {\trialtypesettingtrue
+ \hsize\captionhsize
+ \notesenabledfalse
+ \putcompletecaption{#2}{#3}}%
+ \ifdim\ht\scratchbox>\lineheight % more lines
+ \dosettempcaptionbox
+ {\hsize\captionhsize
+ \advance\hsize -\captionovershoot\relax
+ \ifdim\hsize<\captionminwidth\relax
+ \hsize\captionhsize
+ \fi
+ \putcompletecaption{#2}{#3}}%
+ \else
+ \dosettempcaptionbox
+ {\hsize\captionhsize
+ \putcompletecaption{#2}{#3}}%
+ \fi
+ \else
+ % float is smaller of equal to \hsize
+ \ifdim\captionhsize<\captionminwidth\relax
+ \scratchdimen\captionminwidth % float smaller than min width
+ \edef\captionhsize{\the\scratchdimen}%
+ \fi
+ \setbox\scratchbox\vbox % test with overshoot
+ {\trialtypesettingtrue
+ \scratchdimen\captionhsize
+ \advance\scratchdimen \captionovershoot
+ \advance\scratchdimen 3em % an average word length
+ \ifdim\scratchdimen<\hsize \hsize\scratchdimen \fi
+ \notesenabledfalse
+ \putcompletecaption{#2}{#3}}%
+ \ifdim\ht\scratchbox>\lineheight
+ % at least an average word longer than a line
+ \dosettempcaptionbox
+ {\scratchdimen\captionhsize
+ \advance\scratchdimen \captionovershoot
+ \ifdim\scratchdimen<\hsize \hsize\scratchdimen \fi
+ \putcompletecaption{#2}{#3}}%
+ \else
+ % just over a line, don't use an overshoot % % % todo: outer/inner and such
+ \doifcommonelse{\floatcaptionparameter\c!align}{\v!left,\v!right,\v!flushleft,\v!flushright}
+ {\dosettempcaptionbox
+ {\hsize\captionhsize
+ % strange : \raggedcenter
+ \putcompletecaption{#2}{#3}}}
+ {% nicer
+ \dosettempcaptionbox
+ {\hsize\captionhsize
+ \doifnothing{\floatcaptionparameter\c!align}\raggedcenter% overloads
+ \putcompletecaption{#2}{#3}}}%
+ \fi
+ \fi}
+
+\def\dopreparesidecaption#1#2#3%
+ {\scratchdimen\dimexpr\hsize-\wd\tempfloatbox-\floatparameter\c!margin\relax % was \tfskipsize\relax
+ \ifdim\wd\tempcaptionbox>\scratchdimen
+ \ifdim\wd\tempcaptionbox<1.3\scratchdimen
+ \scratchdimen0.8\scratchdimen
+ \fi
+ \fi
+ \dosettempcaptionbox % \setbox\tempcaptionbox\vbox
+ {\hsize\scratchdimen
+ \doifnothing{\floatcaptionparameter\c!align}\raggedright % on purpose overloads align !
+ \putcompletecaption{#2}{#3}}}
+
+\newdimen\tempfloatheight
+\newdimen\tempfloatwidth
+
+\def\dofloatboxbetweenstack
+ {\endgraf\nointerlineskip\floatcaptionparameter\c!inbetween\endgraf}
+
+\def\dofloatboxdefaultbuilder % done
+ {\locatefloat{\box\tempfloatbox}}
+
+\def\dofloatboxnextrightbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \box\tempfloatbox
+ \normalexpanded{\noexpand\doifnotinset{\v!hang}{\floatcaptionparameter\c!location}}{\dotfskip{\floatcaptionparameter\c!distance}}%
+ \vbox to\tempfloatheight{#1}}}
+
+\def\dofloatboxnextleftbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \vbox to\tempfloatheight{#1}%
+ \normalexpanded{\noexpand\doifnotinset{\v!hang}{\floatcaptionparameter\c!location}}{\dotfskip{\floatcaptionparameter\c!distance}}%
+ \box\tempfloatbox}}
+
+\def\dofloatboxnextouterbuilder
+ {\doifrightpagefloatelse\dofloatboxnextrightbuilder\dofloatboxnextleftbuilder}
+\def\dofloatboxnextinnerbuilder
+ {\doifrightpagefloatelse\dofloatboxnextleftbuilder\dofloatboxnextrightbuilder}
+
+\def\dofloatboxnextrighthangbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \box\tempfloatbox
+ \vbox to\tempfloatheight{#1}}}
+
+\def\dofloatboxnextlefthangbuilder#1%
+ {\ifparfloat \hbox \else \expandafter \locatefloat \fi
+ {\tempfloatheight\ht\tempfloatbox
+ \vbox to\tempfloatheight{#1}%
+ \box\tempfloatbox}}
+
+\def\dodofloatboxnextrightmarginbuilder#1#2%
+ {\ifparfloat
+ \hbox\bgroup
+ \tempfloatheight\ht\tempfloatbox
+ \box\tempfloatbox
+ \hsmash{\hskip#1\vbox to\tempfloatheight{#2}}%
+ \egroup
+ \else
+ \begingroup
+ \tempfloatheight\ht\tempfloatbox
+ \everyrightofalignedline{\hsmash{\hskip#1\vbox to\tempfloatheight{#2}}}%
+ \locatefloat{\box\tempfloatbox}%
+ \endgroup
+ \fi}
+
+\def\dodofloatboxnextleftmarginbuilder#1#2%
+ {\ifparfloat
+ \hbox\bgroup
+ \tempfloatheight\ht\tempfloatbox
+ \hsmash{\hskip-\dimexpr#1+\wd\tempcaptionbox\relax\vbox to\tempfloatheight{#2}}%
+ \box\tempfloatbox
+ \egroup
+ \else
+ \begingroup
+ \tempfloatheight\ht\tempfloatbox
+ \everyleftofalignedline{\hsmash{\hskip-\dimexpr#1+\wd\tempcaptionbox\relax\vbox to\tempfloatheight{#2}}}%
+ \locatefloat{\box\tempfloatbox}%
+ \endgroup
+ \fi}
+
+\def\dofloatboxnextrightmarginbuilder{\dodofloatboxnextrightmarginbuilder\rightmargindistance}
+\def\dofloatboxnextleftmarginbuilder {\dodofloatboxnextleftmarginbuilder \leftmargindistance }
+
+\def\dofloatboxnextoutermarginbuilder
+ {\doifrightpagefloatelse
+ {\dodofloatboxnextrightmarginbuilder\rightmargindistance}
+ {\dodofloatboxnextleftmarginbuilder \rightmargindistance}}
+
+\def\dofloatboxnextinnermarginbuilder
+ {\doifrightpagefloatelse
+ {\dodofloatboxnextleftmarginbuilder \leftmargindistance}
+ {\dodofloatboxnextrightmarginbuilder\leftmargindistance}}
+
+\def\dofloatboxnextbuilder % beware, we first check on left/rightmargin because there can be left/right also
+ {\let\next\dofloatboxnextleftbuilder
+ \normalexpanded{\noexpand\processallactionsinset[\floatcaptionparameter\c!location]}
+ [ \v!outermargin=>\let\next\dofloatboxnextoutermarginbuilder,
+ \v!innermargin=>\let\next\dofloatboxnextinnermarginbuilder,
+ \v!leftmargin=>\let\next\dofloatboxnextleftmarginbuilder,
+ \v!rightmargin=>\let\next\dofloatboxnextrightmarginbuilder,
+ \v!lefthanging=>\let\next\dofloatboxnextlefthangbuilder,
+ \v!righthanging=>\let\next\dofloatboxnextrighthangbuilder,
+ \v!outer=>\let\next\dofloatboxnextouterbuilder,
+ \v!inner=>\let\next\dofloatboxnextinnerbuilder,
+ \v!left=>\let\next\dofloatboxnextleftbuilder,
+ \v!right=>\let\next\dofloatboxnextrightbuilder]%
+ \next}
+
+\def\dofloatboxsidebuilder
+ {\ifparfloat
+ \let\next\dofloatboxhighbuilder
+ \else
+ \let\next\dofloatboxmiddlebuilder
+ \expanded{\processallactionsinset[\floatcaptionparameter\c!location]}
+ [ \v!low=>\let\next\dofloatboxlowbuilder,
+ \v!middle=>\let\next\dofloatboxmiddlebuilder,
+ \v!high=>\let\next\dofloatboxhighbuilder]%
+ \fi
+ \next}
+
+\def\doflushfloatleftcaptionhang
+ {\hsmash{\llap{\box\tempcaptionbox\dotfskip{\floatcaptionparameter\c!distance}}}}
+\def\doflushfloatrightcaptionhang
+ {\hsmash{\rlap{\dotfskip{\floatcaptionparameter\c!distance}\box\tempcaptionbox}}}
+
+\def\doflushfloatcaptionhang
+ {\expanded{\doifinsetelse{\v!righthanging}{\floatcaptionparameter\c!location}}
+ {\doflushfloatrightcaptionhang}
+ {\expanded{\doifinsetelse{\v!lefthanging}{\floatcaptionparameter\c!location}}
+ {\doflushfloatleftcaptionhang}
+ {\expanded{\doifinsetelse{\v!hang}{\floatcaptionparameter\c!location}}
+ {\expanded{\doifinsetelse{\v!outer}{\floatcaptionparameter\c!location}}
+ {\doifrightpagefloatelse{\doflushfloatrightcaptionhang}{\doflushfloatleftcaptionhang}}
+ {\expanded{\doifinsetelse{\v!right}{\floatcaptiondirectives}}
+ {\doflushfloatrightcaptionhang}
+ {\doflushfloatleftcaptionhang}}}
+ {\box\tempcaptionbox}}}}
+
+\def\dofloatboxhighbuilder
+ {\dofloatboxnextbuilder{\dofloatboxbetweenstack\doflushfloatcaptionhang\vfill}}
+
+\def\dofloatboxlowbuilder
+ {\dofloatboxnextbuilder{\vfill\doflushfloatcaptionhang\dofloatboxbetweenstack}}
+
+\def\dofloatboxmiddlebuilder
+ {\dofloatboxnextbuilder{\vfill\box\tempcaptionbox\vfill}}
+
+% \definefloat
+% [lefty][lefties][figure]
+% \setupfloat
+% [lefty]
+% [default=left,
+% rightmargindistance=-2cm,
+% leftmargindistance=-2cm]
+% \setupcaption
+% [lefty]
+% [location={bottom,overlay}]
+%
+% \starttext
+% \placelefty{}{} \input tufte \input tufte
+% \placelefty{}{} \input tufte \input tufte
+% \stoptext
+
+\def\bothangfloat#1{\ruledvbox to \ht\tempfloatbox{#1\vss}}
+\def\tophangfloat#1{\ruledvbox to \ht\tempfloatbox{\vss#1}}
+
+\def\dofloatboxnormaltopstackbuilder
+ {\expanded{\doifinset{\v!overlay}{\floatcaptionparameter\c!location}}\tophangfloat
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox{\locatesidefloat{\box\tempcaptionbox}}%
+ \dofloatboxbetweenstack
+ \hbox{\hbox {\box\tempfloatbox }}%
+ \else
+ \hbox{\locatetextfloat{\box\tempcaptionbox}}
+ \dofloatboxbetweenstack
+ \hbox{\locatefloat {\box\tempfloatbox }}%
+ \fi}}
+
+\def\dofloatboxnormalbotstackbuilder
+ {\expanded{\doifinset{\v!overlay}{\floatcaptionparameter\c!location}}\bothangfloat
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox{\hbox {\box\tempfloatbox }}%
+ \dofloatboxbetweenstack
+ \hbox{\locatesidefloat{\box\tempcaptionbox}}%
+ \else
+ \hbox{\locatefloat {\box\tempfloatbox }}%
+ \dofloatboxbetweenstack
+ \hbox{\locatetextfloat{\box\tempcaptionbox}}%
+ \fi}}
+
+\def\dofloatboxgridtopstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \locatesidefloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack
+ \hbox {\box\tempfloatbox }%
+ \else
+ \locatetextfloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack
+ \locatefloat {\box\tempfloatbox }%
+ \fi}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight{\unvbox\scratchbox}}
+
+\def\dofloatboxgridbotstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack
+ \locatesidefloat{\box\tempcaptionbox}%
+ \else
+ \locatefloat {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack
+ \locatetextfloat{\box\tempcaptionbox}%
+ \fi}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight{\unvbox\scratchbox}}
+
+\def\dofloatboxstretchtopstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\locatecaption{\copy\tempcaptionbox}%
+ \locatefloat {\copy\tempfloatbox }}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \locatesidefloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack\vss
+ \hbox {\box\tempfloatbox }%
+ \else
+ \locatetextfloat{\box\tempcaptionbox}%
+ \vss\dofloatboxbetweenstack\vss
+ \locatefloat {\box\tempfloatbox }%
+ \fi}}
+
+\def\dofloatboxstretchbotstackbuilder
+ {\dp\tempcaptionbox\strutdepth
+ \setbox\scratchbox\vbox
+ {\locatefloat {\copy\tempfloatbox }%
+ \locatecaption{\copy\tempcaptionbox}}%
+ \getnoflines{\dimexpr\htdp\scratchbox-10\scaledpoint\relax}% get rid of inaccuracy
+ \vbox to \noflines\lineheight
+ {\tempfloatwidth\wd\tempfloatbox
+ \ifparfloat
+ \hbox {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack\vss
+ \locatesidefloat{\box\tempcaptionbox}
+ \else
+ \locatefloat {\box\tempfloatbox }%
+ \vss\dofloatboxbetweenstack\vss
+ \locatetextfloat{\box\tempcaptionbox}%
+ \fi}}
+
+\def\dofloatboxtopbuilder
+ {\let\next\dofloatboxnormaltopstackbuilder
+ \expanded{\processfirstactioninset[\floatcaptionparameter\c!location]}
+ [ \v!grid=>\let\next\dofloatboxgridstackbuilder,
+ \v!stretch=>\let\next\dofloatboxstretchstackbuilder]%
+ \next}
+
+\def\dofloatboxbottombuilder
+ {\let\next\dofloatboxnormalbotstackbuilder
+ \expanded{\processfirstactioninset[\floatcaptionparameter\c!location]}
+ [ \v!grid=>\let\next\dofloatboxgridstackbuilder,
+ \v!stretch=>\let\next\dofloatboxstretchstackbuilder]%
+ \next}
+
+\def\relocatecaptionright#1{\locatecaption{\hbox to \tempfloatwidth{\hss#1}}}
+\def\relocatecaptionleft #1{\locatecaption{\hbox to \tempfloatwidth{#1\hss}}}
+
+\long\def\installfloatboxbuilder#1#2{\setvalue{\??kj:#1}{#2}}
+
+\def\buildfloatbox
+ {\global\setbox\floatbox\vbox
+ {\setlocalfloathsize
+ \forgetall
+ \let\floatcaptionarrangement\s!default
+ \def\docommand##1%
+ {\doifdefined{\??kj:##1}{\def\floatcaptionarrangement{##1}\quitcommalist}}%
+ \processcommacommand[\floatcaptionparameter\c!location]\docommand
+ \executeifdefined{\??kj:\floatcaptionarrangement}{\getvalue{\??kj:\s!default}}}}
+
+\def\locatetextfloat
+ {\let\next\locatecaption
+ \expanded{\processallactionsinset[\floatcaptionparameter\c!location]}
+ [ \v!left=>\let\next\relocatecaptionleft,
+ \v!right=>\let\next\relocatecaptionright,
+ \v!inner=>\doifrightpagefloatelse{\let\next\relocatecaptionleft }{\let\next\relocatecaptionright},
+ \v!outer=>\doifrightpagefloatelse{\let\next\relocatecaptionright}{\let\next\relocatecaptionleft }]%
+ \next}
+
+\installfloatboxbuilder \v!none \dofloatboxdefaultbuilder
+\installfloatboxbuilder \s!default \dofloatboxdefaultbuilder
+\installfloatboxbuilder \v!high \dofloatboxhighbuilder
+\installfloatboxbuilder \v!low \dofloatboxlowbuilder
+\installfloatboxbuilder \v!middle \dofloatboxmiddlebuilder
+
+\installfloatboxbuilder \v!left \dofloatboxsidebuilder
+\installfloatboxbuilder \v!right \dofloatboxsidebuilder
+
+\installfloatboxbuilder \v!top \dofloatboxtopbuilder
+\installfloatboxbuilder \v!bottom \dofloatboxbottombuilder
+
+% \setuplayout[grid=yes] \showgrid \setupcaptions[style=smallbodyfont,location=grid,inbetween=]
+%
+% \starttext
+% test \placefigure{} {\externalfigure[cow.pdf][frame=on,grid=yes]} test \page
+% test \placefigure{\input zapf\relax}{\externalfigure[cow.pdf][frame=on,grid=yes]} test \page
+% test \placefigure{} {\externalfigure[cow.pdf][frame=on,grid=depth]} test \page
+% test \placefigure{\input zapf\relax}{\externalfigure[cow.pdf][frame=on,grid=depth]} test \page
+% \stoptext
+
+\newif\ifpostponecolumnfloats \postponecolumnfloatsfalse % don't change
+
+\chardef\postcenterfloatmethod\plusone
+
+\def\postcenterfloatbox#1%
+ {\scratchdimen
+ \ifcase\postcenterfloatmethod
+ #1% \wd\floatbox
+ \or\ifinsidecolumns
+ \ifpostponecolumnfloats\makeupwidth\else#1\fi
+ \else\ifdim#1>\hsize
+ \hsize
+ \else
+ \wd\floatbox
+ \fi\fi\fi
+ \global\setbox\floatbox\hbox to \scratchdimen
+ % {\hfill\box\floatbox\hfill}} % geen \hss, gaat mis in kolommen !
+ % {\hss \box\floatbox\hss }} % wel \hss, anders mis in colset
+ {\ifglobalcenterfloatbox
+ \donetrue
+ \else\iflocalcenterfloatbox
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdim\scratchdimen>\effectivehsize
+ \donefalse
+ \fi
+ \hss\ifdone\hskip\effectiveleftskip\fi
+ \box\floatbox
+ \ifdone\hskip\effectiverightskip\fi\hss}}
+
+\long\def\dosetparfloat#1#2#3%
+ {\bgroup
+ \forgetall
+ \postponenotes
+ \dontcomplain
+ %\showcomposition
+ \setbox\tempfloatbox\vbox{\borderedfloatbox}%
+ \addlocalbackgroundtobox\tempfloatbox % no \doglobal
+ \docheckcaptioncontent{#2}{#3}%
+ \ifnofloatcaption
+ \global\setbox\floatbox\vbox{\box\tempfloatbox}%
+ \else
+ \dopreparedosidecaption{#1}{#2}{#3}%
+ \settracedcaptionbox
+ \setbox\tempcaptionbox\hbox{\floatcaptionparameter\c!command{\box\tempcaptionbox}}%
+ \moveboxontogrid\tempcaptionbox{\floatcaptionparameter\c!grid}\lastcaptionht
+ \addlocalbackgroundtobox\tempcaptionbox % no \doglobal
+ \buildsidefloatbox
+ \fi
+ \egroup}
+
+\def\dopreparedosidecaption#1#2#3% will be enhanced
+ {\doifelse{\floatcaptionparameter\c!width}\v!max
+ {\dosettempcaptionbox
+ {\hsize\wd\tempfloatbox
+ \putcompletecaption{#2}{#3}}}%
+ {\doifelse{\floatcaptionparameter\c!width}\v!fit
+ {\ifdim\wd\tempcaptionbox>\wd\tempfloatbox\relax
+ \setbox\tempcaptionbox\vbox
+ {\forgetall % needed?
+ \hsize\wd\tempfloatbox
+ \dosetcaptionthings
+ \putcompletecaption{#2}{#3}}%
+ \else
+ \setbox\tempcaptionbox\hbox to \wd\tempfloatbox
+ {\hss\box\tempcaptionbox\hss}%
+ \fi}
+ {\dosettempcaptionbox
+ {\hsize\floatcaptionparameter\c!width % \wd\tempfloatbox
+ \putcompletecaption{#2}{#3}}}}}
+
+\def\buildsidefloatbox
+ {\let\locatefloat \relax
+ \let\locatecaption\relax
+ \def\locatesidefloat##1%
+ {\begingroup
+ \chardef\alignstrutmode\zerocount
+ \hsize\tempfloatwidth \forgetall
+ \alignedline{\floatparameter\c!location}\v!middle{##1}%
+ \endgroup}%
+ \buildfloatbox}
+
+\newif\ifparfloat
+
+\long\def\dosetfloatbox#1#2#3% todo : \global\setbox, currently messy
+ {\ifvisible
+ \par
+ \edef\floatcaptiondirectives{\floatparameter\c!location,\floatcaptionparameter\c!location}%
+ \ifparfloat\@EA\dosetparfloat\else\@EA\dosetpagfloat\fi{#1}{#2}{#3}%
+ \setlocalfloatdimensions{#1}%
+ \global\advance\totalnoffloats\plusone
+ \setbox\floatbox\hbox{\dosavefloatdata\box\floatbox}% still needed? we will do renumbering differently
+ \global\floatheight\htdp\floatbox
+ \global\floatwidth\wd\floatbox
+ \doifnotinset\v!margin{#1} % gaat namelijk nog fout
+ {\setbox\floatbox\vbox
+ {\parindent\zeropoint
+ \doifconcepttracing{\inleftmargin{\framed{\infofont\the\totalnoffloats}}}%
+ \box\floatbox}}%
+ \wd\floatbox\floatwidth
+ \ifdim\dimexpr\floatheight+\lineheight\relax<\textheight \else
+ \global\floatheight\dimexpr\textheight-\lineheight\relax
+ \ht\floatbox\floatheight
+ \dp\floatbox\zeropoint
+ \showmessage\m!floatblocks{10}{\the\totalnoffloats}%
+ \fi
+ \fi}
+
+\newcounter\noxfloatlocations
+
+\long\def\dofloat#1#2#3% #1 is optionlist
+ {\dosetfloatbox{#1}{#2}{#3}%
+ \dogetfloatbox{#1}\empty}
+
+\def\dooutput{\sidefloatoutput} % redefinition of \dooutput
+
+\definefloat
+ [\v!figure]
+ [\v!figures]
+
+\definefloat
+ [\v!table]
+ [\v!tables]
+
+\setupfloat
+ [\v!table]
+ [\c!frame=\v!off]
+
+\definefloat
+ [\v!intermezzo]
+ [\v!intermezzi]
+
+\definefloat
+ [\v!graphic]
+ [\v!graphics]
+
+% float strategy, replaces some of the above macros
+
+\let\floatmethod \empty
+\let\floatcolumn \empty
+\let\floatrow \empty
+\let\forcedfloatmethod\empty
+
+\def\dogetfloatbox#1#2%
+ {\ifvisible
+ \doifelsenothing{#2}
+ {\getfromcommalist[#1][1]%
+ \@EA\beforesplitstring\commalistelement\at:\to\floatmethod
+ \@EA\aftersplitstring \commalistelement\at:\to\floatcolumn
+ \@EA\aftersplitstring \floatcolumn\at*\to\floatrow
+ \@EA\beforesplitstring\floatcolumn\at*\to\floatcolumn
+ % todo: nog algemeen otr
+ \ifdefined\OTRSETsetpreferedcolumnslot
+ \OTRSETsetpreferedcolumnslot\floatcolumn\floatrow
+ \fi}
+ {\let\floatcolumn\empty
+ \let\floatrow\empty
+ \edef\floatmethod{#2}}%
+ \doifundefined{\string\floatmethod\floatmethod}
+ {\let\floatmethod\v!here}%
+ \doifsomething\forcedfloatmethod
+ {\edef\floatmethod{\forcedfloatmethod}}%
+ %\getvalue{\string\floatmethod\floatmethod}[#1]%
+ \getvalue{\string\floatmethod\floatmethod}[\floatmethod,#1]%
+ \fi}
+
+\def\installfloathandler#1#2% #1=keyword #2=handler
+ {\setvalue{\string\floatmethod#1}{#2}}
+
+\installfloathandler \v!here \someherefloat
+\installfloathandler \v!force \somefixdfloat
+\installfloathandler \v!left \someleftsidefloat
+\installfloathandler \v!right \somerightsidefloat
+\installfloathandler \v!text \sometextfloat
+\installfloathandler \v!top \sometopfloat
+\installfloathandler \v!bottom \somebottomfloat
+\installfloathandler \v!auto \someautofloat
+\installfloathandler \v!margin \somemarginfloat
+\installfloathandler \v!opposite \somefacefloat
+\installfloathandler \v!page \somepagefloat
+\installfloathandler \v!leftpage \someleftpagefloat
+\installfloathandler \v!rightpage \somerightpagefloat
+\installfloathandler \v!inmargin \someinmarginfloat
+\installfloathandler \v!inleft \someinleftmarginfloat
+\installfloathandler \v!inright \someinrightmarginfloat
+\installfloathandler \v!leftmargin \someinleftmarginfloat
+\installfloathandler \v!rightmargin \someinrightmarginfloat
+\installfloathandler \v!leftedge \someinleftedgefloat
+\installfloathandler \v!rightedge \someinrightedgefloat
+
+\installfloathandler \v!backspace \somebackspacefloat
+\installfloathandler \v!cutspace \somecutspacefloat
+
+\installfloathandler {tblr} \someslotfloat
+\installfloathandler {lrtb} \someslotfloat
+\installfloathandler {tbrl} \someslotfloat
+\installfloathandler {rltb} \someslotfloat
+\installfloathandler {btlr} \someslotfloat
+\installfloathandler {lrbt} \someslotfloat
+\installfloathandler {btrl} \someslotfloat
+\installfloathandler {rlbt} \someslotfloat
+\installfloathandler {fxtb} \someslotfloat
+\installfloathandler {fxbt} \someslotfloat
+
+% no \registerotrcommand\placesome* here!, this has to be cleaned up:
+
+\def\somesidefloat{\OTRcommand\somesidefloat}
+
+\def\someleftsidefloat [#1]{\somesidefloat[#1]\presetindentation}
+\def\somerightsidefloat [#1]{\somesidefloat[#1]}
+\def\sometopfloat [#1]{\someelsefloat[#1]\nonoindentation}
+\def\somebottomfloat [#1]{\someelsefloat[#1]}
+\def\someautofloat [#1]{\someelsefloat[#1]}
+\def\somemarginfloat [#1]{\somenextfloat[#1]\nonoindentation}
+\def\someinleftmarginfloat [#1]{\somesidefloat[#1]}
+\def\someinrightmarginfloat[#1]{\somesidefloat[#1]}
+\def\someinleftedgefloat [#1]{\somesidefloat[#1]}
+\def\someinrightedgefloat [#1]{\somesidefloat[#1]}
+\def\someinmarginfloat [#1]{\somesidefloat[#1]}
+\def\someherefloat [#1]{\someelsefloat[\v!here,#1]}
+\def\somebackspacefloat [#1]{\somesidefloat[#1]}
+\def\somecutspacefloat [#1]{\somesidefloat[#1]}
+
+\unexpanded\def\placesomeslotfloat {\OTRcommand\someslotfloat}
+\unexpanded\def\placesomeherefloat {\OTRcommand\someherefloat}
+\unexpanded\def\placesomefixdfloat {\OTRcommand\somefixdfloat}
+\unexpanded\def\placesomepagefloat {\OTRcommand\somepagefloat}
+\unexpanded\def\placesomeleftpagefloat {\OTRcommand\someleftpagefloat}
+\unexpanded\def\placesomerightpagefloat{\OTRcommand\somerightpagefloat}
+\unexpanded\def\placesometopsfloat {\OTRcommand\sometopsfloat}
+\unexpanded\def\placesomebotsfloat {\OTRcommand\somebotsfloat}
+\unexpanded\def\placesomesidefloat {\OTRcommand\somesidefloat}
+\unexpanded\def\placesomefacefloat {\OTRcommand\somefacefloat}
+
+\def\somefixdfloat {\placesomefixdfloat}
+\def\somepagefloat {\placesomepagefloat}
+\def\someleftpagefloat {\placesomeleftpagefloat}
+\def\somerightpagefloat{\placesomerightpagefloat}
+\def\somefacefloat {\placesomefacefloat}
+\def\someslotfloat {\placesomeslotfloat}
+
+\protect \endinput
diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua
new file mode 100644
index 000000000..61c26a20e
--- /dev/null
+++ b/tex/context/base/strc-ini.lua
@@ -0,0 +1,302 @@
+if not modules then modules = { } end modules ['strc-ini'] = {
+ version = 1.001,
+ comment = "companion to strc-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[
+The restructuring is the (intermediate) result of quite some experiments. I started
+with the basic structure, followed by lists, numbers, enumerations, itemgroups
+and floats. All these have something in common, like pagenumbers and section
+prefixes. I played with some generic datastructure (in order to save space) but
+the code at both the lua and tex end then quickly becomes messy due to the fact
+that access to variables is too different. So, eventually I ended up with
+dedicated structures combined with sharing data. In lua this is quite efficient
+because tables are referenced. However, some precautions are to be taken in
+order to keep the utility file small. Utility data and process data share much
+but it does not make sense to store all processdata.
+
+]]--
+
+local format, concat, match = string.format, table.concat, string.match
+local count, texwrite, texprint, texsprint = tex.count, tex.write, tex.print, tex.sprint
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local lpegmatch = lpeg.match
+
+local ctxcatcodes, xmlcatcodes, notcatcodes = tex.ctxcatcodes, tex.xmlcatcodes, tex.notcatcodes -- tricky as we're in notcatcodes
+
+local trace_processors = false trackers.register("structure.processors", function(v) trace_processors = v end)
+
+-- move this
+
+commands = commands or { }
+
+function commands.first_in_list(str)
+ local first = match(str,"^([^,]+),")
+ texsprint(ctxcatcodes,first or str)
+end
+
+-- -- -- namespace -- -- --
+
+structure = structure or { }
+
+-- -- -- cache -- -- --
+
+structure.shares = structure.shares or { }
+structure.shares.cache = structure.shares.cache or { }
+
+local shares = structure.shares
+local cache = shares.cache
+
+function shares.put(data)
+ cache[#cache+1] = data
+ return #cache
+end
+
+function shares.get(n) -- n can be string
+ n = tonumber(n) or -1
+ return cache[n]
+end
+
+-- -- -- specials -- -- --
+
+-- we can store information and get back a reference; this permits
+-- us to store rather raw data in references
+
+local specials = { } structure.specials = specials
+
+specials.collected = specials.collected or { }
+specials.tobesaved = specials.collected or { }
+
+local collected, tobesaved = specials.collected, specials.tobesaved
+
+local function initializer()
+ collected, tobesaved = specials.collected, specials.tobesaved
+end
+
+if job then
+ job.register('structure.specials.collected', structure.specials.tobesaved, initializer)
+end
+
+function specials.store(class,data)
+ if class and data then
+ local s = tobesaved[class]
+ if not s then
+ s = { }
+ tobesaved[class] = s
+ end
+ s[#s+1] = data
+ texwrite(#s)
+ else
+ texwrite(0)
+ end
+end
+
+function specials.retrieve(class,n)
+ if class and n then
+ local c = collected[class]
+ return c and c[n]
+ end
+end
+
+-- -- -- helpers -- -- --
+
+structure.helpers = structure.helpers or { }
+
+local helpers = structure.helpers
+
+function helpers.touserdata(str)
+ local hash = str and str ~= "" and aux.settings_to_hash(str)
+ if hash and next(hash) then
+ return hash
+ end
+end
+
+local function simplify(d,nodefault)
+ if d then
+ local t = { }
+ for k, v in next, d do
+ local tv = type(v)
+ if tv == "table" then
+ if next(v) then t[k] = simplify(v) end
+ elseif tv == "string" then
+ if v ~= "" and v ~= "default" then t[k] = v end
+ elseif tv == "boolean" then
+ if v then t[k] = v end
+ else
+ t[k] = v
+ end
+ end
+--~ print(table.serialize(d,"before"))
+--~ print(table.serialize(t,"after"))
+ return next(t) and t
+ elseif nodefault then
+ return nil
+ else
+ return { }
+ end
+end
+
+helpers.simplify = simplify
+
+function helpers.merged(...)
+ local h, t = { ... }, { }
+ for k=1, #h do
+ local v = h[k]
+ if v and v ~= "" and not t[k] then
+ t[k] = v
+ end
+ end
+ return t
+end
+
+local tags = {
+ generic = "ctx:genericentry",
+ section = "ctx:sectionentry",
+ entry = "ctx:registerentry",
+}
+
+function helpers.title(title,metadata) -- brrr
+ if title and title ~= "" then
+ if metadata then
+ if metadata.coding == "xml" then
+ tag = tags[metadata.kind] or tags.generic
+ buffers.set(tag,format("<?xml version='1.0'?><%s>%s</%s>",tag,title,tag))
+ texsprint(ctxcatcodes,format("\\xmlprocessbuffer{%s}{%s}{}",metadata.xmlroot or "main",tag))
+ elseif metadata.xmlsetup then
+ texsprint(ctxcatcodes,format("\\xmlsetup{%s}{%s}",title,metadata.xmlsetup)) -- nasty
+ else
+ local catcodes = metadata.catcodes
+--~ print(tex.ctxcatcodes,tex.xmlcatcodes,catcodes,title)
+ if catcodes == notcatcodes or catcodes == xmlcatcodes then
+ texsprint(ctxcatcodes,title) -- nasty
+ else
+ texsprint(catcodes,title)
+ end
+ end
+ else
+ texsprint(title) -- no catcode switch
+ end
+ end
+end
+
+-- -- -- processors -- -- -- syntax: processor->data
+
+local processors = { } structure.processors = processors
+
+local registered = { }
+
+function processors.register(p)
+ registered[p] = true
+end
+
+function processors.reset(p)
+ registered[p] = nil
+end
+
+local splitter = lpeg.splitat("->",true)
+
+function processors.split(str)
+ local p, s = lpegmatch(splitter,str)
+ if registered[p] then
+ return p, s
+ else
+ return false, str
+ end
+end
+
+function processors.sprint(catcodes,str,fnc,...)
+ local p, s = lpegmatch(splitter,str)
+ local code
+ if registered[p] then
+ code = format("\\applyprocessor{%s}{%s}",p,(fnc and fnc(s,...)) or s)
+ else
+ code = (fnc and fnc(str,...)) or str
+ end
+ if trace_processors then
+ logs.report("processors","cct: %s, seq: %s",catcodes,code)
+ end
+ texsprint(catcodes,code)
+end
+
+function processors.apply(str)
+ local p, s = lpegmatch(splitter,str)
+ if registered[p] then
+ return format("\\applyprocessor{%s}{%s}",p,s)
+ else
+ return str
+ end
+end
+
+-- -- -- sets -- -- --
+
+structure.sets = structure.sets or { }
+structure.sets.setlist = structure.sets.setlist or { }
+
+storage.register("structure/sets/setlist", structure.sets.setlist, "structure.sets.setlist")
+
+local sets = structure.sets
+local setlist = sets.setlist
+
+function sets.define(namespace,name,values,default,numbers)
+ local dn = setlist[namespace]
+ if not dn then
+ dn = { }
+ setlist[namespace] = dn
+ end
+ if values == "" then
+ dn[name] = { { }, default }
+ else
+ local split = aux.settings_to_array(values)
+ if numbers then
+ -- convert to numbers (e.g. for reset)
+ for i=1,#split do
+ split[i] = tonumber(split[i]) or 0
+ end
+ end
+ dn[name] = { split, default }
+ end
+end
+
+function sets.getall(namespace,block,name)
+ local ds = setlist[namespace]
+ if not ds then
+ return { }
+ else
+ local dn
+ if block and block ~= "" then
+ dn = ds[block..":"..name] or ds[name] or ds[block] or ds.default
+ else
+ dn = ds[name] or ds.default
+ end
+ return (dn and dn[1]) or { }
+ end
+end
+
+function sets.get(namespace,block,name,level,default) -- check if name is passed
+ local ds = setlist[namespace]
+ if not ds then
+ return default
+ end
+ local dn
+ if name and name ~= "" then
+ if block and block ~= "" then
+ dn = ds[block..":"..name] or ds[name] or ds[block] or ds.default
+ else
+ dn = ds[name] or ds.default
+ end
+ else
+ if block and block ~= "" then
+ dn = ds[block] or ds[block..":default"] or ds.default
+ else
+ dn = ds.default
+ end
+ end
+ if not dn then
+ return default
+ end
+ local dl = dn[1][level]
+ return dl or dn[2] or default
+end
diff --git a/tex/context/base/strc-ini.mkiv b/tex/context/base/strc-ini.mkiv
new file mode 100644
index 000000000..5ed7b423c
--- /dev/null
+++ b/tex/context/base/strc-ini.mkiv
@@ -0,0 +1,88 @@
+%D \module
+%D [ file=strc-flt,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Initialization \& Helpers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Initialization & Helpers}
+
+\registerctxluafile{strc-ini}{1.001}
+
+\unprotect
+
+% \def\zerosection{0}
+% \def\resetsectionmarks{}
+% \setuppagenumbering
+
+% maybe use structurecomponent more consistently as name below
+
+% segments: 0:100 2:3 chapter:subsection 3 (=self+2) (alternative: sectionset)
+
+% section : [sectionnumber(s)]
+% sectionseparatorset (default) sectionconversionset (default) sectionstopper () sectionset sectionsegments
+
+% lists : [sectionnumber(s)] [text] [prefix(es)[separator]][pagenumber(s)]
+% sectionseparatorset (default) sectionconversionset (default) sectionstopper sectionset sectionsegments
+% prefixseparatorset (default) prefixconversionset (default) prefixstopper (.) prefixset prefixsegments
+% pageseparatorset (default) pageconversionset (default) pagestopper () pagesegments
+% prefix (no)
+
+% counter : [prefix(es)[separator]][number(s)]
+% prefixseparatorset (default) prefixconversionset (default) prefixstopper (.) prefixset prefixsegments
+% numberseparatorset (default) numberconversionset (default) numberstopper () numbersegments
+% prefix (no)
+
+% pagenumber: [prefix(es)[separator]][pagenumber(s)]
+% prefixseparatorset (default) prefixconversionset (default) prefixstopper (.) prefixset prefixsegments
+% pageseparatorset (default) pageconversionset (default) pagestopper ()
+% prefix (no)
+
+% text mark reference list
+% section P P P P
+% float P.N P.N P.N
+% itemize P.N P.N
+% enumerate P.N P.N P.N
+% formula P.N P.N
+% footnote P.N P.N P.N
+% number P.N P.N
+
+% number prefix section page
+
+% [text|marking|reference|list]:[number|prefix|pagenumber|pageprefix]:[separatorset|conversionset|conversion|stopper|set|segments|resetset|order]
+
+% figure caption : text:number:* text:prefix:* -> \setupcaption[figure][...]; stores defaults
+% figure list : list:number:* list:prefix:* list:pagenumber:* list:pageprefix:* -> \setuplist[figure][...]; takes stored defaults for number and pagenumber]
+% figure reference: reference:number:* reference:prefix:* reference:pagenumber:* reference:pageprefix:* -> \setupreference[figure]]...]; takes stored defaults
+
+% This module deals with structure: section headers, list and
+% numbering and eventually cross referencing. These components are
+% rather interwoven and therefore an inbetween layer is used.
+% Eventually this will replace the corresponding code in core-sec,
+% core-lst, core-num and core-ref.
+
+% We collect operations that deal with things like formatting on each
+% level of a number in sets. This is all handles at the \LUA\ end.
+% References to such sets travel with the multipass information.
+
+\unexpanded\def\definestructureresetset {\dotripleempty\dodefinestructureresetset}
+\unexpanded\def\definestructureseparatorset {\dotripleempty\dodefinestructureseparatorset}
+\unexpanded\def\definestructureconversionset{\dotripleempty\dodefinestructureconversionset}
+\unexpanded\def\definestructureprefixset {\dotripleempty\dodefinestructureprefixset}
+
+\def\dodefinestructureresetset [#1][#2][#3]{\ctxlua{structure.sets.define("structure:resets", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}",true)}}
+\def\dodefinestructureseparatorset [#1][#2][#3]{\ctxlua{structure.sets.define("structure:separators", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
+\def\dodefinestructureconversionset[#1][#2][#3]{\ctxlua{structure.sets.define("structure:conversions","#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
+\def\dodefinestructureprefixset [#1][#2][#3]{\ctxlua{structure.sets.define("structure:prefixes", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
+
+% \definestructureseparatorset [weird][!,?,*][:] % tex content
+% \definestructureconversionset[weird][numbers,characters,romannumerals][numbers] % symbolic names
+% \definestructureresetset [weird][0,0,1][0] % numbers
+
+\protect \endinput
diff --git a/tex/context/base/strc-itm.lua b/tex/context/base/strc-itm.lua
new file mode 100644
index 000000000..e776f326d
--- /dev/null
+++ b/tex/context/base/strc-itm.lua
@@ -0,0 +1,24 @@
+if not modules then modules = { } end modules ['strc-itm'] = {
+ version = 1.001,
+ comment = "companion to strc-itm.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+structure = structure or { }
+structure.itemgroups = structure.itemgroups or { }
+
+local itemgroups = structure.itemgroups
+
+function itemgroups.register(name,nofitems,maxwidth)
+ jobpasses.savedata("itemgroup", { nofitems, maxwidth })
+end
+
+function itemgroups.nofitems(name,index)
+ jobpasses.getfield("itemgroup", index, 1, 0)
+end
+
+function itemgroups.maxwidth(name,index)
+ jobpasses.getfield("itemgroup", index, 2, 0)
+end
diff --git a/tex/context/base/strc-itm.mkii b/tex/context/base/strc-itm.mkii
new file mode 100644
index 000000000..1de63c7c3
--- /dev/null
+++ b/tex/context/base/strc-itm.mkii
@@ -0,0 +1,1335 @@
+%D \module
+%D [ file=strc-itm, % updated
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=itemgroups,
+%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.
+
+% new: text + lefttext=(,righttext=)
+% start=
+
+\writestatus{loading}{ConTeXt Structure Macros / Itemgroups}
+
+\unprotect
+
+% - instellingen in macro
+% - [0] voor start op 0
+% - start=2
+
+\newconditional\sublistitem \setfalse\sublistitem
+\newconditional\symbollistitem \setfalse\symbollistitem
+\newconditional\headlistitem \setfalse\headlistitem
+\newconditional\introlistitem \setfalse\introlistitem
+\newconditional\randomizeitems \setfalse\randomizeitems
+\newconditional\autointrolistitem \setfalse\autointrolistitem
+\newconditional\optimizelistitem \settrue \optimizelistitem
+\newconditional\packlistitem \setfalse\packlistitem
+\newconditional\paragraphlistitem \setfalse\paragraphlistitem
+\newconditional\textlistitem \setfalse\textlistitem
+\newconditional\firstlistitem \setfalse\firstlistitem
+\newconditional\beforelistitem \setfalse\beforelistitem
+\newconditional\afterlistitem \setfalse\afterlistitem
+\newconditional\nowhitelistitem \setfalse\nowhitelistitem
+\newconditional\joinedlistitem \setfalse\joinedwhitelistitem
+\newconditional\reverselistitem \setfalse\reverselistitem
+\newconditional\continuelistitems \setfalse\continuelistitems
+\newconditional\fittinglistitems \setfalse\fittinglistitems
+
+\newcount\noflists
+\newcount\currentnoflists
+\newcount\itemcolumndepth
+\newcount\itemdepth
+\newcount\maxitemdepth
+
+\definetwopasslist\s!list
+
+\let\currentitemlevel \!!zerocount
+\let\currentitemgroup \empty
+\let\currentnofitems \!!zerocount
+\let\currentmaxnofitems\!!zerocount
+\let\currentminnofitems\!!zerocount
+\let\currentitemoffset \!!zerocount
+\def\currentitemnumber{\countervalue{\@@itemcounter\currentitemlevel}}
+
+% tricky ... we cannot use trialtypesetting here because there can be
+% multiple itemizes in e.g. a table, so we need something more advanced
+% where counters etc are reset to pre-outertrial values
+
+\def\dolistreference
+ {\ifconditional\continuelistitems
+ \savetaggedtwopassdata\s!list{\number\currentnoflists}{\number\currentnoflists}%
+ {\currentitemlevel:\noflistelements:c:\getitemparameter\currentitemlevel\c!maxwidth}%
+ \else
+ \savetaggedtwopassdata\s!list{\number\currentnoflists}{\number\currentnoflists}%
+ {\currentitemlevel:\noflistelements:n:\getitemparameter\currentitemlevel\c!maxwidth}%
+ \fi}
+
+\def\splititemtwopassdata#1%
+ {\expanded{\findtwopassdata{\s!list}{\number#1}}%
+ \expandafter\dosplititemtwopassdata\twopassdata:0:0:0:0:0\relax}
+
+\def\dosplititemtwopassdata#1:#2:#3:#4:#5\relax
+ {\edef\itemdatal{#1}\edef\itemdatan{#2}\edef\itemdatat{#3}\edef\itemdataw{#4}}
+
+\def\checkcurrentnofitems
+ {\splititemtwopassdata\currentnoflists
+ \iftwopassdatafound
+ \ifcase\itemdatan\relax % \scratchcounter
+ \let\currentnofitems \!!zerocount
+ \let\currentminnofitems\!!plusone
+ \let\currentmaxnofitems\!!zerocount
+ \else
+ \scratchcounter\itemdatan\relax
+ \edef\currentnofitems{\the\scratchcounter}%
+ \let\currentitemtag\itemdatat
+ \doloop
+ {\splititemtwopassdata{\numexpr\currentnoflists+\recurselevel\relax}%
+ \iftwopassdatafound
+ \ifnum\itemdatal=\currentitemlevel\relax
+ \doifelse{c}\itemdatat
+ {\advance\scratchcounter\itemdatan\relax}
+ {\exitloop}%
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \edef\currentmaxnofitems{\the\scratchcounter}%
+ \scratchcounter\zerocount
+ \doif{c}\currentitemtag
+ {\doloop
+ {\splititemtwopassdata{\numexpr\currentnoflists-\recurselevel\relax}%
+ \iftwopassdatafound
+ \ifnum\itemdatal=\currentitemlevel\relax
+ \doifelse{c}\itemdatat
+ {\advance\scratchcounter\itemdatan\relax}
+ {\advance\scratchcounter\itemdatan\exitloop}%
+ \fi
+ \else
+ \exitloop
+ \fi}}%
+ \advance\scratchcounter\plusone
+ \edef\currentminnofitems{\the\scratchcounter}%
+ % [[\currentnofitems,\currentminnofitems,\currentmaxnofitems]]
+ \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
+% \stopitemize
+%
+% \startitemize[n,packed,reverse]
+% \item test \item test \item test
+% \stopitemize
+%
+% \startitemize[n,packed,reverse] \item test \item test \stopitemize
+% \startitemize[continue]
+% \item test \startitemize[n,packed] \item test \item test \stopitemize
+% \item test
+% \item test
+% \stopitemize
+% \startitemize[continue] \item test \stopitemize
+%
+% \startitemize[n,packed] \item test \item test \stopitemize
+% \startitemize[continue] \item test \stopitemize
+% \startitemize[continue] \item test \stopitemize
+
+\def\unknownitemreference{0} \let\itemreferences\unknownitemreference
+
+% #1=level #2=parameter
+
+\def\getitemparameter #1#2{\csname\??op\currentitemgroup#1#2\endcsname}
+\def\setitemparameter #1#2{\@EA\def\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3}
+\def\letitemparameter #1#2{\@EA\let\csname\??op\currentitemgroup#1#2\endcsname}
+
+% works ok but not needed (also possible compatibility problem)
+%
+% \def\getitemparameter#1#2%
+% {\executeifdefined{\??op\currentitemgroup#1#2}%
+% {\executeifdefined{\??op\currentitemgroup #2}%
+% {\executeifdefined{\??oo #2}%
+% {}}}}
+
+% test this: saves hash entries and is also faster
+%
+% \let\doinitializeitemgrouplevel\gobbleoneargument % todo ! ! !
+
+\def\getitemparameter#1#2%
+ {\executeifdefined{\??op\currentitemgroup#1#2}%
+ {\executeifdefined{\??op\currentitemgroup #2}%
+ {\executeifdefined{\??oo #2}%
+ {}}}}
+
+\def\doitemattributes #1{\doattributes{\??op\currentitemgroup#1}}
+
+\def\@@globalitemsymbol #1{\??op\currentitemgroup\c!symbol\s!global#1}
+\def\@@localitemsymbol #1{\??op\currentitemgroup\c!symbol\s!local #1}
+\def\@@currentitemsymbol#1{\??op\currentitemgroup\c!symbol #1}
+
+\def\@@itemcounter{\s!itemcount\currentitemgroup}
+
+% \def\doitembreak#1{\ifconditional\textlistitem\else\dosomebreak#1\fi}
+%
+% s-pre-61 / pre-dis, test extensively, 2004/5
+
+\def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else\dosomebreak#1\fi\fi}
+
+\def\initializeitemgroupslevel#1%
+ {\ifundefined{\@@globalitemsymbol{#1}}%
+ \edef\itemreferences{\itemreferences,#1}%
+ \makecounter{\@@itemcounter#1}%
+ \setevalue{\@@globalitemsymbol{#1}}{#1}%
+ \fi}
+
+\def\initializeitemgrouplevel#1% safeguard
+ {\ifundefined{\??op\currentitemgroup#1\c!width}%
+ \doinitializeitemgrouplevel{#1}%
+ \fi}
+
+\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!start,\c!lefttext,\c!righttext]}
+
+\def\setupitemgroups
+ {\dosingleargument\dosetupitemgroups}
+
+\def\dosetupitemgroups[#1]% still undocumented
+ {\getparameters[\??oo][\c!levels=4,#1]%
+ % will change (remove)
+ \ifnum\@@oolevels>\maxitemdepth
+ \maxitemdepth\@@oolevels\relax
+ \dorecurse\maxitemdepth{\initializeitemgroupslevel\recurselevel}%
+ \fi}
+
+\def\doitemreference#1,#2,#3\\%
+ {\ifnum\currentitemlevel>#1\relax
+ \ifnum#1>\zerocount \tempsymbol \fi
+ \getvalue{\@@currentitemsymbol{#2}}%
+ \doitemreference#2,#3\\%
+ \fi}
+
+\def\itemreference
+ {\expandafter\doitemreference\itemreferences,,\\}
+
+\def\packitems
+ {\ifcase\currentitemlevel \else \settrue\packlistitem \fi}
+
+\def\dosetupitemgroupvariable[#1]% [#2]% niveau instellingen
+ {\doifelsenothing{#1}
+ {\getparameters[\??op\currentitemgroup\currentitemlevel]}% [#2]}%
+ {\getparameters[\??op\currentitemgroup#1]}}% [#2]}}
+
+\newconditional\inlinelistitem \setfalse\inlinelistitem
+
+\def\dododosetupitemgroupconstant[#1][#2#3#4]% * permits [2]
+ {\global\setitemparameter\currentitemlevel\c!maxwidth{0}%
+ \processaction
+ [#2#3#4]
+ [ \v!packed*=>\packitems,
+ \v!intro*=>\settrue\introlistitem, % here? not set to false
+% no: \v!random*=>\settrue\randomizeitems,% here? not set to false
+ \v!autointro*=>\settrue\autointrolistitem,
+ \v!broad*=>\setitemparameter{#1}\c!factor{1},
+ #2#3*\v!broad*=>\setitemparameter{#1}\c!factor{#2#3},
+ #2*\v!broad*=>\setitemparameter{#1}\c!factor{#2},
+ \v!text*=>\settrue\textlistitem
+ \settrue\inlinelistitem
+ \settrue\joinedlistitem % \dosetuppackeditemgroup{#1}%
+ \packitems,
+ \v!columns*=>\packitems,
+ \v!before*=>\settrue\beforelistitem,
+ \v!after*=>\settrue\afterlistitem,
+ \v!nowhite*=>\settrue\nowhitelistitem, % \def\packeditemspacing{\nowhitespace},
+ \v!margin*=>\setitemparameter{#1}\c!width{-2em}, % signal
+ \v!inmargin*=>\setitemparameter{#1}\c!width{-2em}, % signal
+ \v!atmargin*=>\doifnot{#1}{1}{\setitemparameter{#1}\c!width{0em}}, % signal
+ \v!intext*=>\settrue\inlinelistitem, % new
+ \v!loose*=>\setfalse\optimizelistitem,
+ \v!fit*=>\settrue\fittinglistitems,
+ \v!nofit*=>\setfalse\fittinglistitems,
+ \v!paragraph*=>\settrue\paragraphlistitem
+ \packitems,
+ \v!joinedup*=>\settrue\joinedlistitem % \dosetuppackeditemgroup{#1}%
+ \packitems,
+ \v!serried*=>\setitemparameter{#1}\c!factor{-1},
+ #2#3*\v!serried*=>\setitemparameter{#1}\c!factor{-#2#3},
+ #2*\v!serried*=>\setitemparameter{#1}\c!factor{-#2},
+ \v!stopper*=>\setitemparameter{#1}\c!placestopper{\v!yes}, % keep {}
+ \v!unpacked*=>\setfalse\packlistitem,
+ \v!repeat*=>\settrue\repeatlistitem, % new
+ \v!reverse*=>\settrue\reverselistitem,
+ \v!standard*=>\dosetupstandarditemgroup{#1}]}
+
+\def\dosetupstandarditemgroup#1%
+ {\getparameters
+ [\??op\currentitemgroup#1]
+ [\c!width=1.5em,
+ \c!factor=0,
+ \c!distance=.5em,
+ \c!beforehead=,
+ \c!afterhead=\blank,
+ \c!before=\blank,
+ \c!inbetween=\blank,
+ \c!after=\blank,
+ \c!inner=]}
+
+% \def\packeditemspacing{\empty}
+
+% \setupwhitespace[big]
+% \starttext
+% test \startitemize[joinedup] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite,before] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par
+% \stoptext
+
+\def\itembeforecommand
+ {\ifconditional\nowhitelistitem
+ \ifconditional\beforelistitem
+ \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!before\fi
+ \else
+ \nowhitespace
+ \fi
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!before
+ \fi\fi}
+
+\def\itemaftercommand
+ {\ifconditional\nowhitelistitem
+ \ifconditional\afterlistitem
+ \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!after\fi
+ \else
+ \nowhitespace
+ \fi
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!after
+ \fi\fi}
+
+\def\iteminbetweencommand
+ {\ifconditional\nowhitelistitem
+ \nowhitespace
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!inbetween
+ \fi\fi}
+
+\def\itembeforeheadcommand
+ {\ifconditional\nowhitelistitem
+ \nowhitespace
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!beforehead
+ \fi\fi}
+
+\def\itemafterheadcommand
+ {\ifconditional\nowhitelistitem
+ \nowhitespace
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!afterhead
+ \fi\fi}
+
+% \def\dosetuppackeditemgroup#1%
+% {\setitemparameter{#1}\c!beforehead{\packeditemspacing}%
+% \setitemparameter{#1}\c!afterhead {\packeditemspacing}%
+% \setitemparameter{#1}\c!before {\packeditemspacing}%
+% \setitemparameter{#1}\c!after {\packeditemspacing}%
+% \setitemparameter{#1}\c!inbetween {\packeditemspacing}}
+
+\def\dosetupitemgroupconstant[#1][#2]%
+ {\def\dodosetupitemgroupconstant##1% catches empty in [a,b,] handy for xml
+ {\doifsomething{##1}{\dododosetupitemgroupconstant[#1][##1*]}}%
+ \processcommacommand[#2]\dodosetupitemgroupconstant} % expansion of #2 is handy for xml
+
+\def\dododododosetupitemgroup[#1][#2]%
+ {\doifassignmentelse{#2}%
+ {\dosetupitemgroupvariable[#1][#2]}%
+ {\setitemparameter{#1}\c!option{#2}}}%
+
+\def\dodododosetupitemgroup[#1][#2]%
+ {\ConvertToConstant\doifnot{#2}{}
+ {\doifelse{#1}\v!each
+ {\dorecurse\maxitemdepth{\ExpandFirstAfter\dododododosetupitemgroup[\recurselevel][#2]}}
+ {\ExpandFirstAfter\dododododosetupitemgroup[#1][#2]}}}
+
+\def\dododosetupitemgroup[#1][#2]%
+ {\ConvertToConstant\doifelse{#2}{}
+ {\ifcase\currentitemlevel\relax
+ \dodododosetupitemgroup[\v!each][#1]%
+ \else
+ \dodododosetupitemgroup[\currentitemlevel][#1]%
+ \fi}
+ {\doifelsenothing{#1}
+ {\dodododosetupitemgroup[\currentitemlevel][#2]}
+ {\dodododosetupitemgroup[#1][#2]}}}
+
+\def\dodosetupitemgroup[#1][#2][#3][#4]%
+ {\pushmacro\currentitemgroup
+ \def\currentitemgroup{#1}%
+ \dododosetupitemgroup[#2][#3]%
+ \ConvertToConstant\doifnot{#4}{} % anders wordt #2 overruled
+ {\dododosetupitemgroup[#2][#4]}%
+ \popmacro\currentitemgroup}
+
+\def\dosetupitemgroup[#1][#2][#3][#4]%
+ {\def\docommand##1{\dodosetupitemgroup[##1][#2][#3][#4]}%
+ \processcommalist[#1]\docommand}
+
+\def\setupitemgroup
+ {\doquadrupleempty\dosetupitemgroup}
+
+\def\doadvanceitem
+ {\ifconditional\sublistitem\else\ifconditional\symbollistitem\else
+ \pluscounter{\@@itemcounter\currentitemlevel}%
+ \fi\fi}
+
+\def\setitemlevel#1%
+ {\ifnum\currentitemlevel>\zerocount
+ \settrue\firstlistitem
+ % \expanded{\setitemparameter{\currentitemlevel}{\c!start}{1}}% ***
+ \doifinset{0}{#1}{\setitemparameter\currentitemlevel\c!start{0}}% ***
+ \setcounter{\@@itemcounter\currentitemlevel}{\the\numexpr\getitemparameter\currentitemlevel\c!start-1\relax}% ***
+ \doifelsenothing{\getitemparameter\currentitemlevel\c!start}
+ {\def\currentitemoffset{1}}
+ {\def\currentitemoffset{\getitemparameter\currentitemlevel\c!start}%
+ \letitemparameter\currentitemlevel\c!start\empty}%
+ \def\tempnumber
+ {\countervalue{\@@itemcounter\currentitemlevel}}%
+ \doifelse{\getitemparameter\currentitemlevel\c!placestopper}\v!yes
+ {\def\tempsymbol{\getitemparameter\currentitemlevel\c!stopper}}
+ {\let\tempsymbol\empty}%
+ \fi}
+
+
+\def\actualitemnumber
+ {\ifconditional\reverselistitem
+ \convertnumber\currentitemsymbol{\numexpr\currentmaxnofitems+\currentitemoffset-\currentitemnumber+1\relax}%
+ \else
+ \convertnumber\currentitemsymbol{\numexpr\currentminnofitems+\currentitemoffset+\currentitemnumber-1\relax}%
+ \fi}
+
+% PAS OP: ook 'opelkaar' en zo worden getest, nog eens afvangen!
+
+\def\unknownitemsymbol{?}
+
+\def\setitemmark#1% % en pas op: resets \docommand
+ {\doifsymboldefinedelse{#1}
+ {\edef\currentitemsymbol{#1}%
+ \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}%
+ \setgvalue{\@@localitemsymbol \currentitemlevel}{\unknownitemsymbol}%
+ \def\listitem{\symbol[\currentitemsymbol]}%
+ \let\@@opsymbol\empty}% \let\docommand\gobbleoneargument}
+ {\doifconversiondefinedelse{#1}
+ {\edef\currentitemsymbol{#1}%
+ \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}%
+ \setgvalue{\@@localitemsymbol\currentitemlevel }{\actualitemnumber }%
+ \ifconditional\textlistitem
+ \doifsomething{\getitemparameter\currentitemlevel\c!lefttext}
+ {\let\tempsymbol\empty}%
+ \fi
+ \def\listitem
+ {\getitemparameter\currentitemlevel
+ {\ifconditional\textlistitem\c!lefttext\else\c!left\fi}%
+ \getvalue{\@@localitemsymbol\currentitemlevel}\tempsymbol
+ \getitemparameter\currentitemlevel
+ {\ifconditional\textlistitem\c!righttext\else\c!right\fi}}%
+ \let\@@opsymbol\empty}%\let\docommand\gobbleoneargument}
+ {}}}
+
+\def\calculatelistwidth#1#2% distance deals with 'broad'
+ {#2=\getitemparameter{#1}\c!distance\relax
+ \ifnum\getitemparameter{#1}\c!factor>\zerocount
+ \ifdim#2=\zeropoint #2=.5em\fi
+ \fi
+ \multiply#2 \getitemparameter{#1}\c!factor
+ \advance #2 \getitemparameter{#1}\c!width\relax}
+
+% The next conditionals deal with \item \startitemgroup. It
+% looks like a hack to skip back, but that way we preserve
+% the indentation and bullet placement. It's a rather
+% untested feature.
+
+\newconditional\concatnextitem \setfalse\concatnextitem
+\newconditional\autoconcatnextitem \settrue \autoconcatnextitem
+\newsignal \itemsignal
+
+\def\startitemgroup
+ {\dotripleempty\dostartitemgroup}
+
+% \def\dostartitemgroup[#1][#2][#3]%
+% {\bgroup
+% \def\currentitemgroup{#1}%
+% \ifthirdargument
+% \dodostartitemgroup[#2][#3]%
+% \else
+% \doifassignmentelse{#2}
+% {\dodostartitemgroup[][#2]}
+% {\dodostartitemgroup[#2][]}%
+% \fi}
+
+\def\dostartitemgroup[#1][#2][#3]%
+ {\bgroup
+ \ifnum\currentitemlevel=\zerocount
+ \def\currentitemgroup{#1}% no nested mixing of itemgroups
+ \fi
+ \ifthirdargument
+ \dodostartitemgroup[#2][#3]%
+ \else
+ \doifassignmentelse{#2}
+ {\dodostartitemgroup[][#2]}
+ {\dodostartitemgroup[#2][]}%
+ \fi}
+
+\def\dodostartitemgroup[#1]% [#2]%
+ {\relax % prevents lookahead
+ \ifnum\currentitemlevel=\maxitemdepth\relax
+ \showmessage\m!layouts9{\number\maxitemdepth}%
+ \let\itemincrement\zerocount
+ \else
+ \let\itemincrement\plusone
+ \fi
+ \global\advance\itemdepth\itemincrement
+ \xdef\currentitemlevel{\number\itemdepth}%
+ \initializeitemgrouplevel\currentitemlevel % safeguard
+ \edef\itemgroupoptions{\getitemparameter\currentitemlevel\c!option}%
+ \ifx\itemgroupoptions\empty
+ \edef\itemgroupoptions{#1}%
+ \else
+ \doifsomething{#1}{\edef\itemgroupoptions{\itemgroupoptions,#1}}%
+ \fi
+ \expanded{\redostartitemgroup[\itemgroupoptions]}}% [#2]
+
+\let\startcollectitems\relax
+\let\stopcollectitems \relax
+
+%D A nice example of a plugin:
+%D
+%D \startbuffer
+%D \startitemize[a,random,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D
+%D \startitemize[a,random,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D
+%D \startitemize[a,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% better collectitems als conditional and a real plugin mechanism (some day)
+
+\@EA\long\@EA\def\@EA\collectitemgroupitem\@EA#\@EA1\csname\e!stop\v!item\endcsname
+ {\increment\itemcollectcounter
+ \long\setvalue{\v!item*\itemcollectcounter}{\item#1\par}}
+
+\def\flushcollecteditems
+ {\ifconditional\randomizeitems
+ \getrandomnumber\itemcollectcounternow\plusone\itemcollectcounter
+ \else
+ \increment\itemcollectcounternow
+ \fi
+ \doifdefined{\v!item*\itemcollectcounternow}
+ {\getvalue{\v!item*\itemcollectcounternow}%
+ \letbeundefined{\v!item*\itemcollectcounternow}%
+ \increment\itemcollectcounterdone}%
+ \ifnum\itemcollectcounterdone<\itemcollectcounter\relax
+ \expandafter\flushcollecteditems
+ \fi}
+
+\def\stopcollectitems
+ {\ifconditional\randomizeitems
+ \newcounter\itemcollectcounterdone
+ \ifnum\itemcollectcounter>\zerocount
+ \@EAEAEA\flushcollecteditems
+ \fi
+ \fi}
+
+\def\startcollectitems
+ {\ifconditional\randomizeitems
+ \newcounter\itemcollectcounter
+ \letvalue{\e!start\v!item}\collectitemgroupitem
+ \fi}
+
+%D End of plugin.
+
+\ifx\startcolumns\undefined \def\startcolumns[#1]{} \fi
+\ifx\stopcolumns \undefined \let\stopcolumns\relax \fi
+
+\def\dosetsymalign#1% hm, we should use one of the core-spa macros or make a helper
+ {\processaction
+ [#1]
+ [ \v!flushleft=>\let\symalignleft\relax,
+ \v!right=>\let\symalignleft\relax,
+ \v!flushright=>\let\symalignleft\hfill,
+ \v!left=>\let\symalignleft\hfill,
+ \v!middle=>\let\symalignleft\hfil,
+ \v!center=>\let\symalignleft\hfil]}
+
+\def\redostartitemgroup[#1][#2]%
+ {\setfalse\inlinelistitem % new, no indent (leftskip)
+ \setfalse\concatnextitem % new, concat
+ \setfalse\txtlistitem
+ \ifhmode
+ \ifconditional\autoconcatnextitem % new, concat
+ \ifdim\lastskip=\itemsignal % new, concat
+ \settrue\concatnextitem % new, concat
+ \fi % new, concat
+ \fi % new, concat
+ \ifconditional\textlistitem\else\doifnotinset\v!text{#1}\par\fi % suboptimal
+ \fi
+ \begingroup
+ % new where, ok or not / we should integrate random, intro, continue here
+ % beware, the following no longer inherit from the previous level, is this ok?
+ \setfalse\reverselistitem
+ \setfalse\introlistitem
+ \setfalse\autointrolistitem
+ \setfalse\beforelistitem
+ \setfalse\afterlistitem
+ \setfalse\nowhitelistitem
+ \setfalse\randomizeitems
+ %
+ \doifinsetelse\v!intro {#1}{\settrue\introlistitem }{\setfalse\introlistitem }%
+ \doifinsetelse\v!random {#1}{\settrue\randomizeitems }{\setfalse\randomizeitems }%
+ \doifinsetelse\v!continue{#1}{\settrue\continuelistitems}{\setfalse\continuelistitems}%
+ % == \doifinsetelse\v!intro{#1}\settrue\setfalse\introlistitem
+ \global\advance\noflists\plusone
+ \currentnoflists=\noflists
+ \newcounter\noflistelements
+ \setfalse\headlistitem
+ \setfalse\sublistitem
+ \setfalse\symbollistitem
+ \let\marsymbol\relax
+ \globallet\doitemdestination\empty
+ \let\symsymbol\empty
+ \let\symalignleft\relax
+ \the\itemgroupcommands
+\checkcurrentnofitems
+ % \getitemparameter\currentitemlevel\empty
+ \let\listitem\empty % ** start value
+ \doifelsenothing{#1} % iffirstargument
+ {\edef\@@opsymbol{\getitemparameter\currentitemlevel\c!symbol}%
+ \letgvalueempty{\@@globalitemsymbol\currentitemlevel}%
+ \global\letitemparameter\currentitemlevel\v!continue\empty
+ % \setitemmark\@@opsymbol % ** default value
+ \dosetupitemgroupvariable[\currentitemlevel][#2]}
+ {\dosetupitemgroupconstant[\currentitemlevel][#1]%
+ \dosetupitemgroupvariable[\currentitemlevel][#2]%
+ \doifinsetelse\v!continue{#1}% \noexpand, else problems in non-etex with chinese
+ {\edef\@@opsymbol{\noexpand\getvalue{\@@globalitemsymbol\currentitemlevel}}%
+ \getitemparameter\currentitemlevel\v!continue}
+ {\edef\@@opsymbol{\noexpand\getitemparameter{\currentitemlevel}{\c!symbol}}%
+ \global\setitemparameter\currentitemlevel\v!continue
+ {\dosetupitemgroupconstant[\currentitemlevel][#1]%
+ \dosetupitemgroupvariable[\currentitemlevel][#2]}}%
+ \def\docommand##1% \setitemmark resets \docommand
+ {\doifnot{##1}{0}{\setitemmark{##1}}}%
+ % \processcommalist[#1,\@@opsymbol]\docommand
+ \processcommalist[#1]\docommand}% ** preset sequence or provided sequence
+ % moved to here, after settings
+ \ifnum\currentitemlevel=\plusone % NIEUW
+ \doadaptleftskip {\getitemparameter1\c!margin}%
+ \doadaptleftskip {\getitemparameter1\c!leftmargin}%
+ \doadaptrightskip{\getitemparameter1\c!rightmargin}%
+ \fi
+ \dosetraggedcommand{\getitemparameter\currentitemlevel\c!align}\raggedcommand
+ \dosetsymalign{\getitemparameter\currentitemlevel\c!symalign}%
+ \doifsomething{\getitemparameter\currentitemlevel\c!indenting}
+ {% is \expanded needed?
+ \expanded{\setupindenting[\getitemparameter\currentitemlevel\c!indenting]}}%
+ %
+ \setitemlevel{#1}% moved to here
+ \ifx\listitem\empty
+ \setitemmark\@@opsymbol % ** default value
+ \ifx\listitem\empty
+ \edef\currentitemsymbol{\currentitemlevel}% ** fall back
+ \fi
+ \fi
+ \ifconditional\autointrolistitem\ifnum\prevgraf<3
+ \settrue\introlistitem
+ \fi\fi
+ \ifconditional\paragraphlistitem
+ \ifnum\currentitemlevel>\plusone
+ \letitemparameter\currentitemlevel\c!inbetween\empty
+ \fi
+ \fi
+ \ifconditional\packlistitem
+ \letitemparameter\currentitemlevel\c!inbetween\empty
+ \fi
+ \doifinset\v!columns{#1}%
+ {\ifinsidecolumns\else\ifcase\itemcolumndepth
+ \global\itemcolumndepth\currentitemlevel\relax
+ \itembeforecommand
+ \processfirstactioninset
+ [#1]
+ [ \v!one=>\!!counta1\relax,
+ \v!two=>\!!counta2\relax,
+ \v!three=>\!!counta3\relax,
+ \v!four=>\!!counta4\relax,
+ \v!five=>\!!counta5\relax,
+ \s!unknown=>\@EA\!!counta\getitemparameter\currentitemlevel\c!n]%
+ \startcolumns
+ [\c!n=\!!counta, % netter \??op\currentitemlevel\c!n
+ \c!height=,
+ \c!rule=\v!off,
+ \c!balance=\v!yes,
+ \c!align=\v!no]%
+ \fi\fi}%
+\ifconditional\fittinglistitems
+ \splititemtwopassdata\currentnoflists
+ \ifdim\itemdataw sp>\zeropoint
+ \expanded{\setitemparameter{\currentitemlevel}{\c!width}{\itemdataw sp}}%
+ \fi
+\fi
+ \calculatelistwidth\currentitemlevel{\dimen0}%
+ \ifdim\dimen0>\zeropoint\relax
+ \ifconditional\inlinelistitem\else
+ \advance\leftskip \dimen0\relax
+ \fi
+ \fi
+ \startcollectitems}
+
+% test / example
+%
+% \startnarrower[left] \startcolumns[n=3] \startitemize
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \stopcolumns\stopnarrower \blank
+%
+% \startnarrower[left] \startitemize[columns,three]
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \stopnarrower \blank
+%
+% \setupitemize[leftmargin=1.5em] \startitemize[columns,three]
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \blank
+
+\def\stopitemgroup
+ {\stopcollectitems
+ \ifconditional\textlistitem
+ \removeunwantedspaces\space\ignorespaces
+ \else
+ \par
+ \fi
+ \dolistreference
+ \ifconditional\firstlistitem \else \endgroup \fi % toegevoegd, eerste \som opent groep
+ \ifnum\itemcolumndepth=\currentitemlevel\relax
+ \stopcolumns
+ \global\itemcolumndepth\zerocount
+ \itemaftercommand
+ \dontrechecknextindentation
+ \else
+ \ifnum\currentitemlevel=\plusone
+ \doitembreak\allowbreak % toegevoegd
+ \itemaftercommand % \getitemparameter\currentitemlevel\c!after
+ % was: \dochecknextindentation\??oo, is now:
+ \dochecknextindentation{\??op\currentitemgroup\currentitemlevel}%
+ \else
+ % nieuw, not yet nobreak handling
+ \ifcase\autoitemgroupspacing
+ \itemaftercommand
+ \or
+ \itemaftercommand
+ \fi
+ \dontrechecknextindentation
+ \fi
+ \fi
+ % new test, needed in sidefloats (surfaced in volker's proceedings)
+ \ifconditional\textlistitem % else forgotten
+ \endgroup
+ \global\advance\itemdepth-\itemincrement
+ \xdef\currentitemlevel{\number\itemdepth}%
+ \egroup
+ \else
+ \endgroup
+ \global\advance\itemdepth-\itemincrement
+ \xdef\currentitemlevel{\number\itemdepth}%
+ \egroup
+ \par
+ \fi
+ \dorechecknextindentation}
+
+\newtoks\itemgroupcommands
+
+\def\itemgroupitem
+ {\doitemgroupitem}
+
+\def\itemgroupnoitem
+ {\doitemgroupnoitem}
+
+\def\itemgroupbutton[#1]%
+ {\gdef\doitemdestination{#1}%
+ \itemgroupitem}
+
+\def\itemgroupdummy
+ {\itemgroupsymbol{\strut}\strut}
+
+\def\itemgroupsubitem
+ {\settrue\sublistitem
+ \itemgroupitem}
+
+\def\itemgroupsymbol#1%
+ {\def\symsymbol{\doitemattributes\currentitemlevel\c!symstyle\c!symcolor{#1}}%
+ \settrue\symbollistitem
+ \itemgroupitem}
+
+\def\itemgroupedge#1%
+ {\itemgroupsymbol
+ {\calculatelistwidth\currentitemlevel{\dimen0}%
+ \hbox to \dimen0
+ {#1\hskip\getitemparameter\currentitemlevel\c!distance}}}
+
+\def\itemgrouphead
+ {\settrue\headlistitem\doitemgrouphead}
+
+\def\itemgroupitems
+ {\dosingleempty\doitemgroupitems}
+
+\def\doitemgroupitems[#1]%
+ {\itemgroupedge
+ {\dorecurse{0\getitemparameter\currentitemlevel\c!items}{\listitem\hss}%
+ \unskip}}
+
+\def\itemgroupmargin#1%
+ {\def\marsymbol
+ {\llap
+ {\doitemattributes\currentitemlevel\c!marstyle\c!marcolor{#1}%
+ \hskip\leftskip\hskip\leftmargindistance}}%
+ \itemgroupitem}
+
+\appendtoks \let\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
+\appendtoks \letvalue\v!sub \itemgroupsubitem \to \itemgroupcommands
+\appendtoks \letvalue\v!sym \itemgroupsymbol \to \itemgroupcommands
+\appendtoks \letvalue\v!ran \itemgroupedge \to \itemgroupcommands
+\appendtoks \letvalue\v!head \itemgrouphead \to \itemgroupcommands
+\appendtoks \letvalue\v!its \itemgroupitems \to \itemgroupcommands
+\appendtoks \letvalue\v!mar \itemgroupmargin \to \itemgroupcommands
+
+% todo : \startitem .. \stopitem
+
+\appendtoks
+ \letvalue{\e!start\v!item}\itemgroupitem
+ \letvalue{\e!stop \v!item}\endgraf
+\to \itemgroupcommands
+
+\appendtoks
+ \setvalue{\e!start\v!head}#1{\itemgrouphead#1\par}%
+ \letvalue{\e!stop \v!head}\endgraf
+\to \itemgroupcommands
+
+% \startitemize
+% \starthead {xx} test \stophead
+% \startitem test \stopitem
+% \startitem test \stopitem
+% \stopitemize
+
+% Sometimes the user demands get pretty weird:
+%
+% \startitemize
+% \item test
+% \item test
+% \headsym{xx} test \par test
+% \stopitemize
+
+% aligned items
+%
+% \startitemize[n,fit,broad][itemalign=flushright]
+% \dorecurse{100}{\item The first item.}
+% \stopitemize
+%
+% \setupitemgroup[itemize][each][fit]
+% \setupitemgroup[itemize][each][distance=.5em,factor=1,itemalign=flushright]
+%
+% \startitemize[n]
+% \dorecurse{100}{\item The first item.}
+% \stopitemize
+
+\appendtoks \let\headsym \itemgroupheadsym \to \itemgroupcommands
+
+\def\itemgroupheadsym#1%
+ {\def\symsymbol{\doitemattributes\currentitemlevel\c!symstyle\c!symcolor{#1}}%
+ \settrue\symbollistitem
+ \settrue\headlistitem
+ \doitemgrouphead}
+
+% \defineitemgroup[gbitemize]
+% \setupitemgroup[gbitemize][each][headstyle=bold]
+
+% \startgbitemize
+% \txt{italian} some italians like this kind of cross||breed between
+% an itemize and a description
+% \txt{sicilians} i wonder how many sicilian mathematicians do a thesis
+% on the math involved in predicting the next big bang of the vulcano
+% \stopgbitemize
+
+\appendtoks \letvalue\v!txt \itemgrouptext \to \itemgroupcommands
+
+\newconditional\txtlistitem \setfalse\txtlistitem
+
+\def\itemgrouptext#1%
+ {\def\symsymbol{\doitemattributes\currentitemlevel\c!headstyle\c!headcolor{#1}}%
+ \settrue\symbollistitem
+ \settrue\txtlistitem
+ \itemgroupitem}
+
+\def\itembreak % -10
+ {\flushnotes\penalty-5\relax}
+
+\def\itemnobreak % +5
+ {\flushnotes\penalty+5\ifinsidecolumns\else00\fi\relax}
+
+\def\dodotxtitem
+ {\scratchdimen\wd8
+ \advance \scratchdimen \getitemparameter\currentitemlevel\c!distance\relax
+ \ifdim\scratchdimen>\dimen0
+ \advance\scratchdimen -\dimen0
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \llap{\hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi\box8\hss}}% was: \hfill
+ \hskip\scratchdimen}
+
+\def\optimizelistitemsbreak
+ {\ifcase\itemcolumndepth \ifconditional\optimizelistitem
+ \ifcase \currentnofitems \else
+ \ifnum\currentnofitems=\plusthree
+ \ifnum\noflistelements>\plusone
+ \doitembreak\itemnobreak
+ \fi
+ \else\ifnum\currentnofitems>\plusthree
+ \ifnum\noflistelements=\plustwo
+ \ifconditional\introlistitem
+ \doitembreak\nobreak
+ \else
+ \doitembreak\itemnobreak
+ \fi
+ \else\ifnum\currentnofitems=\noflistelements\relax
+ \doitembreak\itemnobreak
+ \else\ifnum\noflistelements>\plustwo
+ \doitembreak\itembreak
+ \else
+ \ifconditional\introlistitem\else\doitembreak\itembreak\fi
+ \fi\fi\fi
+ \fi\fi
+ \fi
+ \fi\fi}
+
+\def\dolistitem % evt aantal items opslaan per niveau, scheelt zoeken
+ {\ifconditional\textlistitem
+ % begin of item
+ \else
+ \par
+ \fi
+% \ignorespaces
+ \increment\noflistelements
+ \optimizelistitemsbreak
+ \noindent
+ \setbox8\hbox
+ {\ifconditional\headlistitem
+ \ifconditional\symbollistitem
+ \symsymbol
+ \else
+ \doitemattributes\currentitemlevel\c!headstyle\c!headcolor{\listitem}%
+ \fi
+ \else
+ \ifconditional\symbollistitem
+ \symsymbol % no attributes, why?
+ \else
+ \doitemattributes\currentitemlevel\c!style\c!color{\listitem}%
+ \fi
+ \fi}%
+\ifconditional\fittinglistitems
+ \ifdim\wd8>\getitemparameter\currentitemlevel\c!maxwidth sp\relax
+ \expanded{\global\noexpand\setitemparameter{\currentitemlevel}{\c!maxwidth}{\number\wd8}}%
+ \fi
+ \splititemtwopassdata\currentnoflists
+ \ifdim\itemdataw sp>\zeropoint
+ \setbox8\simplealignedbox{\getitemparameter\currentitemlevel\c!itemalign}{\itemdataw sp}{\box8}%
+ \fi
+\fi
+ \doifsomething\doitemdestination
+ {\setbox8\hbox{\goto{\box8}[\doitemdestination]}}%
+ \globallet\doitemdestination\empty
+ \dimen2=\getitemparameter\currentitemlevel\c!width\relax
+ % new, prevents loops when symbol is (not yet found) graphic
+ \ht8=\strutheight
+ \dp8=\strutdepth
+ % so that content differs per run (esp mp graphics afterwards)
+ \checkforrepeatedlistitem
+ \ifdim\dimen2<\zeropoint\relax
+ \llap{\ifconditional\sublistitem\llap{+}\fi\box8\hskip\leftmargindistance}%
+ \else
+ \ifdim\dimen2=\zeropoint\relax
+ \calculatelistwidth1{\dimen0}%
+ \else
+ \calculatelistwidth\currentitemlevel{\dimen0}%
+ \fi
+ \ifconditional\textlistitem
+ \hbox{\ifconditional\sublistitem+\fi\box8\hskip\interwordspace}\nobreak
+ \else\ifconditional\inlinelistitem
+ \hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi\box8\hss}% was: \hfill
+ \else\ifconditional\txtlistitem
+ \dodotxtitem
+ \else
+ % todo: align+marge binnen de hbox
+% \llap{\hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi\box8\hfill}}%
+ \llap{\hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi
+ \symalignleft
+ \box8\hfil
+ \hskip\getitemparameter\currentitemlevel\c!distance% T h
+ }}%
+ \fi\fi\fi
+ \fi
+ \forceunexpanded % needed for m conversion (\os) / i need to look into this
+ \setevalue{\@@currentitemsymbol\currentitemlevel}%
+ {\getvalue{\@@localitemsymbol\currentitemlevel}}% still problems with \uchar ?
+ %{\noexpand\getvalue{\@@localitemsymbol\currentitemlevel}}% no, spoils subrefs
+ \resetunexpanded
+ \setfalse\headlistitem
+ \setfalse\sublistitem
+ \setfalse\symbollistitem
+ \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
+
+\def\checkforrepeatedlistitem
+ {\ifnum\currentitemlevel=\plusone
+ \initializeboxstack{item}%
+ \fi
+ \ifconditional\repeatlistitem
+ \savebox{item}{\currentitemlevel}{\hbox{\copy8}}%
+ \setbox8\hbox to \wd8
+ {\setbox\scratchbox\hbox
+ {\scratchcounter\currentitemlevel
+ \advance\scratchcounter\minusone
+ \dorecurse\scratchcounter{\foundbox{item}{\recurselevel}}}%
+ \ifnum\currentitemlevel>\plusone
+ \ifdim\wd\scratchbox>\zeropoint
+ \hskip-\dimen2
+ \box\scratchbox
+ \fi
+ \fi
+ \box8 }%
+ \fi}
+
+% \startbuffer
+% \item
+% \startitemize[n]
+% \item item 1.1
+% \item item 1.2
+% \startitemize[n] \item item 1.2.1 \item item 1.2.2 \stopitemize
+% \item item 1.3
+% \stopitemize
+% \item
+% \startitemize[n] \item item 2.1 \item item 2.2 \stopitemize
+% \item item 3
+% \startitemize[n] \item item 3.1 \item item 3.2 \stopitemize
+% \item
+% \startitemize[n] \item item 4.1 \item item 4.2 \stopitemize
+% \stopbuffer
+%
+% \startitemize[n,repeat,6*broad,packed] \getbuffer \stopitemize \blank[3*big]
+% \startitemize[n,repeat,packed] \getbuffer \stopitemize \blank[3*big]
+% \setupitemize[each][atmargin][width=3em]
+% \startitemize[n,repeat,packed] \getbuffer \stopitemize
+
+\chardef\autoitemgroupspacing=2 % 0 = voor/na, 1=tussen als geen voor 2=(prev)tussen=old/normal
+
+\def\complexdoitemgroupitem[#1]%
+ {\ifconditional\textlistitem
+ % begin of item
+ \else
+ \par
+ \fi
+% \ignorespaces
+ \ifconditional\concatnextitem % new, concat
+ \doitembreak\nobreak % new, concat
+ \fi % new, concat
+ \doadvanceitem
+ \ifcase\itemcolumndepth \ifnum\noflistelements>0\relax
+ % 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
+ \begingroup
+ \ifcase\currentitemlevel
+ \or % 1
+ \ifcase\itemcolumndepth
+ \ifconditional\introlistitem\doitembreak\nobreak\fi
+ \itembeforecommand % \getitemparameter\currentitemlevel\c!before
+ \ifconditional\introlistitem\doitembreak\nobreak\fi
+ \fi
+ \else % 2 en hoger
+ \ifconditional\paragraphlistitem \else
+ \let\previtemlevel\currentitemlevel
+ \decrement\previtemlevel
+ \ifcase\autoitemgroupspacing\relax % nieuw
+ \itembeforecommand
+ \or
+ \doifelsenothing{\itembeforecommand}
+ {\itembeforecommand}
+ {\getitemparameter\previtemlevel\c!inbetween}%
+ \else
+ \getitemparameter\previtemlevel\c!inbetween % == itemlevel-1
+ \fi
+ \fi
+ \fi
+ \else
+\ifconditional\textlistitem % was bugged: \inlinelistitem
+% \removeunwantedspaces\hskip\interwordspace\!!plus\emwidth\relax % new per 2006/10/20
+ \removeunwantedspaces\hskip\emwidth\!!plus\interwordstretch\!!minus\interwordshrink\relax % new per 2006/10/20
+\else
+ \iteminbetweencommand
+\fi
+ \fi
+ \ifconditional\concatnextitem % new, concat
+ \vskip-\lastskip % new, concat
+ \vskip-\lineheight % new, concat
+ \nobreak % new, concat
+ \fi % new, concat
+% \ignorespaces
+ \dolistitem
+ \relax
+ \ifconditional\packlistitem
+ \setupwhitespace[\v!none]%
+ \fi
+ \getitemparameter\currentitemlevel\c!inner
+ \marsymbol
+ \let\marsymbol\relax
+ \doifsomething{#1}
+ {\doifnot\itemreference\unknownitemreference
+ {\bgroup
+ \protectconversion
+ \rawreference\s!lst{#1}\itemreference
+ \egroup}}%
+ \strut % added 11-08-99
+ \setfalse\concatnextitem % new, concat
+ \nobreak % else problems with intext items
+ \hskip\itemsignal % new, concat
+ \getitemparameter\currentitemlevel\c!command} % \defaultitemcommand
+
+\def\defaultitemcommand
+ {\EveryPar{\ignorespaces}% needed ?
+ \ignorespaces}
+
+% For Giuseppe "Oblomov" Bilotta, inspired on a suggestion by Taco
+% Hoekwater.
+%
+% \def\MyItemCommand#1{{\bf#1}\quad}
+% \setupitemgroup[itemize][command=\MyItemCommand]
+%
+% \startitemize
+% \item {test} is this okay?
+% \item {test} is this okay?
+% \item {test} is this okay?
+% \stopitemize
+
+\def\complexitem[#1]#2\par % todo: no two pass data
+ {\startitemgroup[#1]%
+ \complexdoitemgroupitem[]\begstrut#2\endstrut\par
+ \stopitemgroup}
+
+\definecomplexorsimpleempty\item
+\definecomplexorsimpleempty\doitemgroupitem
+
+\def\complexhead[#1]#2\par#3\par
+ {\startitemgroup[#1]%
+ \complexdoitemgrouphead[]\begstrut#2\endstrut\par\begstrut#3\endstrut\par
+ \stopitemgroup}
+
+% \def\complexdoitemgrouphead[#1]#2\par% % beter in \complexdosom hangen met een if
+% {\ifconditional\firstlistitem\else\doitembreak\allowbreak\fi
+% \ifconditional\packlistitem\else\itembeforeheadcommand\fi
+% \ifconditional\firstlistitem\ifconditional\introlistitem\else\ifcase\currentitemlevel % incr in \complexdosom
+% \doitembreak\allowbreak
+% \fi\fi\fi
+% \complexdoitemgroupitem[#1]{\doitemattributes\currentitemlevel\c!headstyle\c!headcolor
+% {\ignorespaces#2}}%
+% \ifconditional\textlistitem
+% \removeunwantedspaces\space\ignorespaces
+% \else
+% \par
+% \fi
+% \doitembreak\nobreak
+% \ifconditional\packlistitem\else\itemafterheadcommand\fi
+% \doitembreak\nobreak
+% \noindentation}
+%
+% the next solution accepts \head test \type{x{x}x} test ...
+
+\def\dostartitemattributes#1{\dostartattributes{\??op\currentitemgroup#1}}
+\def\dostopitemattributes {\dostopattributes}
+
+\def\complexdoitemgrouphead[#1]% beter in \complexdosom hangen met een if
+ {\ifconditional\firstlistitem\else\doitembreak\allowbreak\fi
+ \ifconditional\packlistitem\else\itembeforeheadcommand\fi
+ \ifconditional\firstlistitem\ifconditional\introlistitem\else\ifcase\currentitemlevel % incr in \complexdosom
+ \doitembreak\allowbreak
+ \fi\fi\fi
+ \complexdoitemgroupitem[#1]%
+ \bgroup
+ \dostartitemattributes\currentitemlevel\c!headstyle\c!headcolor\empty
+ \ignorespaces
+ \let\par\enditemhead} % brrrr but simple anyway
+
+\def\enditemhead
+ {\removeunwantedspaces
+ \dostopitemattributes
+ \egroup
+ \ifconditional\textlistitem
+ \space\ignorespaces
+ \else
+ \par
+ \fi
+ \doitembreak\nobreak
+ \ifconditional\packlistitem\else\itemafterheadcommand\fi
+ \doitembreak\nobreak
+ \noindentation}
+
+\definecomplexorsimpleempty\head
+\definecomplexorsimpleempty\doitemgrouphead
+
+% \def\sym#1%
+% {\noindent
+% \begingroup
+% \setbox\scratchbox\hbox{\trialtypesettingtrue#1}%
+% \setbox\scratchbox\hbox
+% \ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#1\hfil}%
+% \hangindent\wd\scratchbox
+% \box\scratchbox
+% \endgroup
+% \ignorespaces}
+
+\def\sym#1%
+ {\noindent
+ \begingroup
+ \setbox\scratchbox\hbox{\trialtypesettingtrue#1}%
+ \setbox\scratchbox\hbox
+ \ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#1\hfil}%
+ \expanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}%
+ \ignorespaces}
+
+\setupitemgroups % undocumented
+ [\c!levels=6,
+ \c!margin=\zeropoint,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\zeropoint,
+ \c!indentnext=\v!yes,
+ \c!width=1.5em,
+ \c!factor=0,
+ \c!distance=.5em,
+ %\c!align=\v!normal, % definitely not \v!normal, see mails and
+ \c!align=, % debug reports of David A & Patrick G on context list
+ \c!symalign=,
+ \c!color=,
+ \c!indenting=, % untouched if empty
+ \c!color=,
+ \c!style=, % kan tzt weg
+ \c!marstyle=\c!type, % \c! ???
+ \c!symstyle=,
+ \c!headstyle=,
+ \c!marcolor=,
+ \c!symcolor=,
+ \c!headcolor=,
+ \c!beforehead=,
+ \c!afterhead=\blank,
+ \c!before=\blank,
+ \c!inbetween=\blank,
+ \c!after=\blank,
+ \c!stopper=.,
+ \c!placestopper=\v!yes,
+ \c!inner=,
+ \c!n=2,
+ \c!items=4,
+ \c!lefttext=(,
+ \c!righttext=),
+ \c!start=1,
+ \c!option=,
+ \c!command=\defaultitemcommand,
+ \c!symbol=\currentitemlevel] % \v!niveau
+
+\def\defineitemgroup
+ {\dodoubleempty\dodefineitemgroup}
+
+\def\dodefineitemgroup[#1][#2]%
+ {\doifsomething{#1}
+ {\pushmacro\currentitemgroup
+ \def\currentitemgroup{#1}%
+ \setvalue{\e!start#1}{\startitemgroup[#1]}%
+ \setvalue{\e!stop#1}{\stopitemgroup}%
+ \setvalue{\e!setup#1\e!endsetup}{\setupitemgroup[#1]}%
+ \getparameters[\??ig#1][\c!levels=3,#2]%
+ \ifnum\getvalue{\??ig#1\c!levels}<\maxitemdepth\relax
+ \setevalue{\??ig#1\c!levels}{\number\maxitemdepth}%
+ \fi
+ \dorecurse{\getvalue{\??ig#1\c!levels}}{\initializeitemgrouplevel\recurselevel}%
+ \popmacro\currentitemgroup}}
+
+% efficient default itemize as well as upward compatible
+% definition:
+
+\defineitemgroup [\v!itemize] [\c!levels=6]
+
+% keep these, needed for styles:
+
+% \def\startitemize {\startitemgroup[\v!itemize]}
+% \def\stopitemize {\stopitemgroup}
+% \def\setupitemize {\setupitemgroup[\v!itemize]}
+
+\protect \endinput
diff --git a/tex/context/base/strc-itm.mkiv b/tex/context/base/strc-itm.mkiv
new file mode 100644
index 000000000..7207494ed
--- /dev/null
+++ b/tex/context/base/strc-itm.mkiv
@@ -0,0 +1,1365 @@
+%D \module
+%D [ file=strc-itm,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Itemgroups,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Itemgroups}
+
+\registerctxluafile{strc-itm}{1.001}
+
+\unprotect
+
+\newconditional\sublistitem \setfalse\sublistitem
+\newconditional\symbollistitem \setfalse\symbollistitem
+\newconditional\headlistitem \setfalse\headlistitem
+\newconditional\introlistitem \setfalse\introlistitem
+\newconditional\randomizeitems \setfalse\randomizeitems
+\newconditional\autointrolistitem \setfalse\autointrolistitem
+\newconditional\optimizelistitem \settrue \optimizelistitem
+\newconditional\packlistitem \setfalse\packlistitem
+\newconditional\paragraphlistitem \setfalse\paragraphlistitem
+\newconditional\textlistitem \setfalse\textlistitem
+\newconditional\firstlistitem \setfalse\firstlistitem
+\newconditional\beforelistitem \setfalse\beforelistitem
+\newconditional\afterlistitem \setfalse\afterlistitem
+\newconditional\nowhitelistitem \setfalse\nowhitelistitem
+\newconditional\joinedlistitem \setfalse\joinedwhitelistitem
+\newconditional\reverselistitem \setfalse\reverselistitem
+\newconditional\continuelistitems \setfalse\continuelistitems
+\newconditional\fittinglistitems \setfalse\fittinglistitems
+\newconditional\indentedfirstlistitem \setfalse\indentedfirstlistitem
+\newconditional\inlinelistitem \setfalse\inlinelistitem
+
+\newcount\noflists
+\newcount\currentnoflists
+\newcount\noflistelements
+\newcount\itemcolumndepth
+\newcount\itemdepth
+\newcount\maxitemdepth \maxitemdepth=6
+
+\newdimen\itemgrouplistwidth
+\newdimen\itemgroupaskedwidth
+\newbox \itemgroupitembox
+
+\def\currentitemgroupcounter{itemgroup:\currentitemgroup}
+
+\let\currentitemlevel \!!zerocount
+\let\currentitemgroup \empty
+\let\currentnofitems \!!zerocount
+\def\currentitemnumber {\dorawsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]}
+\let\currentrepeatstart \empty
+
+\def\dolistreference
+ {\iftrialtypesetting \else % no need for different treatment of \continuelistitems
+ \ctxlua{structure.itemgroups.register("\currentitemgroup",\number\noflistelements,"\getitemparameter\currentitemlevel\c!maxwidth")}%
+ \fi}
+
+\def\checkcurrentnofitems % we could do this at the lua end and save a call
+ {\edef\currentnofitems {\ctxlua{structure.itemgroups.nofitems("\currentitemgroup",\number\currentnoflists)}}%
+ \edef\currentitemmaxwidth{\ctxlua{structure.itemgroups.maxwidth("\currentitemgroup",\number\currentnoflists)}\scaledpoint}}
+
+% todo: \dodosetreference -> \dostructurecountercomponent (to be checked)
+
+\def\dohandleitemreference % we will make a decent number helper
+ {\ifx\currentitemreference \empty \else
+ \setnextinternalreference
+ \ctxlua { jobreferences.setandgetattribute("\s!full", "\referenceprefix","\currentitemreference",
+ {
+ metadata = {
+ kind = "item",% ?
+ catcodes = \the\catcodetable,
+ xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
+ },
+ references = {
+ internal = \nextinternalreference,
+ section = structure.sections.currentid(),
+ },
+ prefixdata = structure.helpers.simplify {
+ prefix = "\structurecounterparameter\currentitemgroupcounter\c!prefix",
+ separatorset = "\structurecounterparameter\currentitemgroupcounter\c!prefixseparatorset",
+ conversion = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconversion\!!es,
+ conversionset = "\structurecounterparameter\currentitemgroupcounter\c!prefixconversionset",
+ set = "\structurecounterparameter\currentitemgroupcounter\c!prefixset",
+ segments = "\structurecounterparameter\currentitemgroupcounter\c!prefixsegments",
+ % segments = "\askedprefixsegments",
+ connector = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconnector\!!es,
+ },
+ numberdata = structure.helpers.simplify {
+ numbers = structure.counters.compact("\currentitemgroupcounter",nil,true),
+ separatorset = "\structurecounterparameter\currentitemgroupcounter\c!numberseparatorset",
+ conversion = "\structurecounterparameter\currentitemgroupcounter\c!numberconversion",
+ conversionset = "\structurecounterparameter\currentitemgroupcounter\c!numberconversionset",
+ % for the moment no stopper, we need to make references configurable first
+ % stopper = \!!bs\structurecounterparameter\currentitemgroupcounter\c!numberstopper\!!es,
+ segments = "\structurecounterparameter\currentitemgroupcounter\c!numbersegments",
+ },
+ })
+ }%
+ \xdef\currentitemattribute{\number\lastdestinationattribute}%
+ \begingroup\attribute\destinationattribute\currentitemattribute\kern\zeropoint\endgroup % todo
+ \fi}
+
+
+% \startitemize[n,packed]
+% \item test \item test \item test
+% \stopitemize
+%
+% \startitemize[n,packed,reverse]
+% \item test \item test \item test
+% \stopitemize
+%
+% \startitemize[n,packed,reverse] \item test \item test \stopitemize
+% \startitemize[continue]
+% \item test \startitemize[n,packed] \item test \item test \stopitemize
+% \item test
+% \item test
+% \stopitemize
+% \startitemize[continue] \item test \stopitemize
+%
+% \startitemize[n,packed] \item test \item test \stopitemize
+% \startitemize[continue] \item test \stopitemize
+% \startitemize[continue] \item test \stopitemize
+
+\def\itemparameter #1#2{\csname\doitemparameter{\??op\currentitemgroup#1}#2\endcsname}
+\def\itemparameterhash#1#2{\doitemparameterhash {\??op\currentitemgroup#1}#2}
+
+
+\def\doitemparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doitemparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\doitemparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doitemparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\doitemparentparameter #1#2{\ifx#1\relax\s!empty\else\doitemparameter #1#2\fi}
+\def\doitemparentparameterhash#1#2{\ifx#1\relax \else\doitemparameterhash#1#2\fi}
+
+\def\dosetitemattributes#1#2#3% style color
+ {\edef\fontattributehash {\itemparameterhash#1#2}%
+ \edef\colorattributehash{\itemparameterhash#1#3}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #2\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#3\fi}
+
+\def\setitemparameter #1#2{\@EA \def\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3}
+\def\esetitemparameter#1#2{\@EA\edef\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3}
+\def\xsetitemparameter#1#2{\@EA\xdef\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3}
+\def\letitemparameter #1#2{\@EA \let\csname\??op\currentitemgroup#1#2\endcsname}
+\let\getitemparameter \itemparameter
+
+\def\@@globalitemsymbol #1{\??op\currentitemgroup\c!symbol\s!global#1}
+\def\@@localitemsymbol #1{\??op\currentitemgroup\c!symbol\s!local #1}
+\def\@@currentitemsymbol#1{\??op\currentitemgroup\c!symbol #1}
+
+\def\@@itemcounter{\s!itemcount\currentitemgroup}
+
+% \def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else\dosomebreak#1\fi\fi}
+%
+% \def\allowitembreak {\doitembreak\allowbreak}
+% \def\noitembreak {\doitembreak\nobreak}
+% \def\itembreakspecial {\doitembreak\itembreak}
+% \def\noitembreakspecial{\doitembreak\itemnobreak}
+%
+% \def\itembreak {\flushnotes\penalty-5\relax} % -10
+% \def\itemnobreak{\flushnotes\penalty+5\ifinsidecolumns\else00\fi\relax} % +5
+
+\definevspacing[\v!item @0] [penalty:0] % allow
+\definevspacing[\v!item @10000] [penalty:10000] % no
+\definevspacing[\v!item @-5] [penalty:-5]
+\definevspacing[\v!item @5] [penalty:5]
+\definevspacing[\v!item @500] [penalty:500]
+
+\def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else#1\fi\fi}
+
+\def\allowitembreak {\doitembreak\itembreakallow}
+\def\noitembreak {\doitembreak\itembreakno}
+\def\itembreakspecial {\doitembreak\itembreak}
+\def\noitembreakspecial{\doitembreak\itemnobreak}
+
+\def\itembreakallow{\vspacing[\v!item @0]}
+\def\itembreakno {\vspacing[\v!item @10000]}
+\def\itembreak {\flushnotes\vspacing[\v!item @-5]}
+\def\itemnobreak {\flushnotes\ifinsidecolumns\vspacing[\v!item @5]\else\vspacing[\v!item @500]\fi}
+
+% cool but wrong:
+%
+% \def\initializeitemgrouplevel#1%
+% {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname
+% % ok
+% \else\ifnum#1>\plusone
+% \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup\the\numexpr#1-1\relax}%
+% \else
+% \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}%
+% \fi\fi}
+%
+% so we have:
+
+\def\initializeitemgrouplevel#1%
+ {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname
+ % ok
+ \else
+ \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}%
+ \fi}
+
+\unexpanded\def\defineitemgroup
+ {\dotripleempty\dodefineitemgroup}
+
+\def\dodefineitemgroup[#1][#2][#3]% todo: clone
+ {\doifsomething{#1}
+ {\pushmacro\currentitemgroup
+ \def\currentitemgroup{#1}%
+ \setvalue{\e!start#1}{\startitemgroup[#1]}%
+ \setvalue{\e!stop#1}{\stopitemgroup}%
+ \setvalue{\e!setup#1\e!endsetup}{\setupitemgroup[#1]}% for old times sake
+ \doifelsenothing{#2}
+ {\getparameters[\??op#1][\s!parent=\??oo,#3]}%
+ {\doifassignmentelse{#2}
+ {\getparameters[\??op#1][\s!parent=\??oo,#2]}%
+ {\getparameters[\??op#1][\s!parent=\??op#2,#3]}}%
+ \dorecurse\maxitemdepth{\initializeitemgrouplevel\recurselevel}%
+ \definestructurecounter[itemgroup:#1]%
+ \popmacro\currentitemgroup}}
+
+\newtoks\everysetupitemgroup
+
+\unexpanded\def\setupitemgroups % [#1]
+ {\dodoubleargument\getparameters[\??oo]} % [#1]
+
+\def\packitems
+ {\ifcase\currentitemlevel \else \settrue\packlistitem \fi}
+
+\def\dosetupitemgroupvariable[#1]% [#2]% niveau instellingen
+ {\doifelsenothing{#1}
+ {\getparameters[\??op\currentitemgroup\currentitemlevel]}%
+ {\getparameters[\??op\currentitemgroup#1]}}
+
+\def\dosetupitemgroupconstant#1%
+ {\global\setitemparameter\currentitemlevel\c!maxwidth{0}%
+ \processcommacommand[#1]\dodosetupitemgroupconstant} % expansion of #2 is handy for xml
+
+\def\dodosetupitemgroupconstant#1%
+ {\edef\itemgroupconstantvalue{#1}%
+ \ifx\itemgroupconstantvalue\empty\else
+ \splitstring\itemgroupconstantvalue\at*\to\itemgroupfirst\and\itemgroupsecond
+ \ifx\itemgroupsecond\empty
+ \let\itemgroupsecond\itemgroupfirst
+ \let\itemgroupfirst\!!plusone
+ \fi
+ \ifcsname\??op:::\itemgroupsecond\endcsname\csname\??op:::\itemgroupsecond\endcsname\fi
+ \fi}
+
+\setvalue{\??op:::\v!packed }{\packitems}
+\setvalue{\??op:::\v!intro }{\settrue\introlistitem} % here? not set to false
+\setvalue{\??op:::\v!autointro}{\settrue\autointrolistitem}
+\setvalue{\??op:::\v!broad }{\ifx\itemgroupfirst\empty\def\itemgroupfirst{1}\fi
+ \letitemparameter\currentitemlevel\c!factor\itemgroupfirst}
+\setvalue{\??op:::\v!text }{\settrue\textlistitem
+ \settrue\inlinelistitem
+ \settrue\joinedlistitem
+ \packitems}
+\setvalue{\??op:::\v!columns }{\packitems}
+\setvalue{\??op:::\v!before }{\settrue\beforelistitem}
+\setvalue{\??op:::\v!after }{\settrue\afterlistitem}
+\setvalue{\??op:::\v!nowhite }{\settrue\nowhitelistitem}
+\setvalue{\??op:::\v!margin }{\setitemparameter\currentitemlevel\c!width{-2em}} % signal
+\setvalue{\??op:::\v!inmargin }{\setitemparameter\currentitemlevel\c!width{-2em}} % signal
+\setvalue{\??op:::\v!atmargin }{\doifnot\currentitemlevel{1}{\setitemparameter\currentitemlevel\c!width{0em}}} % signal
+\setvalue{\??op:::\v!intext }{\settrue\inlinelistitem}
+\setvalue{\??op:::\v!loose }{\setfalse\optimizelistitem}
+\setvalue{\??op:::\v!fit }{\settrue\fittinglistitems}
+\setvalue{\??op:::\v!nofit }{\setfalse\fittinglistitems}
+\setvalue{\??op:::\v!paragraph}{\settrue\paragraphlistitem
+ \packitems}
+\setvalue{\??op:::\v!joinedup }{\settrue\joinedlistitem
+ \packitems}
+\setvalue{\??op:::\v!serried }{\edef\itemgroupfirst{-\ifx\itemgroupfirst\empty1\else\itemgroupfirst\fi}%
+ \letitemparameter\currentitemlevel\c!factor\itemgroupfirst}
+\setvalue{\??op:::\v!stopper }{\letitemparameter\currentitemlevel\c!placestopper\v!yes} % keep {}
+\setvalue{\??op:::\v!unpacked }{\setfalse\packlistitem}
+\setvalue{\??op:::\v!repeat }{\settrue\repeatlistitem}
+\setvalue{\??op:::\v!reverse }{\settrue\reverselistitem}
+\setvalue{\??op:::\v!standard }{\dosetupstandarditemgroup\currentitemlevel}
+
+\def\dosetupstandarditemgroup#1%
+ {\getparameters
+ [\??op\currentitemgroup#1]
+ [\c!width=1.5em,\c!factor=0,\c!distance=.5em,\c!inner=,\c!factor=0,
+ \c!beforehead=,\c!afterhead=\blank,\c!before=\blank,\c!inbetween=\blank,\c!after=\blank]}
+
+% \def\packeditemspacing{\empty}
+
+% \setupwhitespace[big]
+% \starttext
+% test \startitemize[joinedup] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite,before] \item test \item test \stopitemize test \par
+% test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par
+% \stoptext
+
+\def\itembeforecommand
+ {\ifconditional\nowhitelistitem
+ \ifconditional\beforelistitem
+ \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!before\fi
+ \else
+ \nowhitespace
+ \fi
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!before
+ \fi\fi}
+
+\def\itemaftercommand
+ {\ifconditional\nowhitelistitem
+ \ifconditional\afterlistitem
+ \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!after\fi
+ \else
+ \nowhitespace
+ \fi
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!after
+ \fi\fi}
+
+\def\iteminbetweencommand
+ {\ifconditional\nowhitelistitem
+ \nowhitespace
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!inbetween
+ \fi\fi}
+
+\def\itembeforeheadcommand
+ {\ifconditional\nowhitelistitem
+ \nowhitespace
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!beforehead
+ \fi\fi}
+
+\def\itemafterheadcommand
+ {\ifconditional\nowhitelistitem
+ \nowhitespace
+ \else\ifconditional\joinedlistitem
+ % \empty
+ \else
+ \getitemparameter\currentitemlevel\c!afterhead
+ \fi\fi}
+
+\def\dododododosetupitemgroup[#1][#2]%
+ {\doifassignmentelse{#2}%
+ {\dosetupitemgroupvariable[#1][#2]}%
+ {\setitemparameter{#1}\c!option{#2}}}%
+
+\def\dodododosetupitemgroup[#1][#2]%
+ {\doifsomething{#2}
+ {\doifelse{#1}\v!each
+ {\dorecurse\maxitemdepth{\normalexpanded{\noexpand\dododododosetupitemgroup[\recurselevel]}[#2]}}
+ {\normalexpanded{\noexpand\dododododosetupitemgroup[#1]}[#2]}}}
+
+% \def\dododosetupitemgroup[#1][#2]%
+% {\doifelsenothing{#2}
+% {\doifelsenothing{#1}
+% {\dodododosetupitemgroup[\currentitemlevel][#2]}
+% {\dodododosetupitemgroup[#1][#2]}}
+% {\ifcase\currentitemlevel\relax
+% \dodododosetupitemgroup[\v!each][#1]%
+% \else
+% \dodododosetupitemgroup[\currentitemlevel][#1]%
+% \fi}}
+
+\def\dododosetupitemgroup[#1][#2]%
+ {\doifelsenothing{#2}
+ {\doifsomething{#1}
+ {\ifcase\currentitemlevel\relax
+ \dodododosetupitemgroup[\v!each][#1]%
+ \else
+ \dodododosetupitemgroup[\currentitemlevel][#1]%
+ \fi}}%
+ {\doifelsenothing{#1}
+ {\ifcase\currentitemlevel\relax
+ \dodododosetupitemgroup[\v!each][#2]%
+ \else
+ \dodododosetupitemgroup[\currentitemlevel][#2]%
+ \fi}
+ {\dodododosetupitemgroup[#1][#2]}}}
+
+\def\dodosetupitemgroup[#1][#2][#3][#4]%
+ {\pushmacro\currentitemgroup
+ \def\currentitemgroup{#1}%
+ \dododosetupitemgroup[#2][#3]%
+ \doifsomething{#4}{\dododosetupitemgroup[#2][#4]}%
+ \the\everysetupitemgroup
+ \popmacro\currentitemgroup}
+
+\def\dosetupitemgroup[#1][#2][#3][#4]%
+ {\def\docommand##1{\dodosetupitemgroup[##1][#2][#3][#4]}%
+ \processcommalist[#1]\docommand}
+
+\unexpanded\def\setupitemgroup
+ {\doquadrupleempty\dosetupitemgroup}
+
+\def\doadvanceitem
+ {\ifconditional\sublistitem\else\ifconditional\symbollistitem\else
+ \doincrementsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]%
+ \fi\fi}
+
+\def\setitemlevel#1%
+ {\ifnum\currentitemlevel>\zerocount
+ \settrue\firstlistitem
+ \ifconditional\continuelistitems\else
+ \dorestartsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]{\the\numexpr\getitemparameter\currentitemlevel\c!start-1\relax}%
+ \fi
+ \fi}
+
+\unexpanded\def\actualitemnumber
+ {\ifconditional\repeatlistitem
+ \ifcase\currentitemlevel\or\else
+ \doactualitemnumber
+ \fi
+ \else
+ \doactualitemnumber
+ \fi}
+
+\def\doactualitemnumber
+ {\begingroup
+ \setupstructurecounter
+ [\currentitemgroupcounter]
+ [%\c!prefix=\v!no,
+ \c!prefix=\getitemparameter\currentitemlevel\c!prefix,
+ \c!prefixstopper=\getitemparameter\currentitemlevel\c!prefixstopper,
+ \c!prefixseparatorset=\getitemparameter\currentitemlevel\c!prefixseparatorset,
+ \c!prefixconversion=\getitemparameter\currentitemlevel\c!prefixconversion,
+ \c!prefixconversionset=\getitemparameter\currentitemlevel\c!prefixseparatorset,
+ \c!prefixset=\getitemparameter\currentitemlevel\c!prefixset,
+ \c!prefixsegments=\getitemparameter\currentitemlevel\c!prefixsegments,
+ \c!prefixconnector=\getitemparameter\currentitemlevel\c!prefixconnector,
+ \c!criterium=\getitemparameter\currentitemlevel\c!criterium,
+ \c!numberorder=\ifconditional\reverselistitem\v!reverse\else\v!normal\fi,
+ \c!numberstopper=\expdoif{\getitemparameter\currentitemlevel\c!placestopper}\v!yes{\getitemparameter\currentitemlevel\c!stopper},
+ %\c!numberseparatorset=,
+ %\c!numberconversionset=,
+ \c!numberconversion=\currentitemsymbol,
+ \c!numbersegments=\ifx\currentrepeatstart\empty\else\currentrepeatstart:\fi\number\currentitemlevel]%
+ \ifconditional\reverselistitem
+ \convertedstructurecounter[\currentitemgroupcounter]% [\number\currentitemlevel]%
+ \else
+ \convertedstructurecounter[\currentitemgroupcounter]% [\number\currentitemlevel]%
+ \fi
+ \dohandleitemreference
+ \endgroup}
+
+\def\unknownitemsymbol{?}
+
+\def\setitemmark#1% % en pas op: resets \docommand ; todo: conversionset
+ {\doifsymboldefinedelse{#1}
+ {\edef\currentitemsymbol{#1}%
+ \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}%
+ \setgvalue{\@@localitemsymbol \currentitemlevel}{\unknownitemsymbol}%
+ \def\listitem{\symbol[\currentitemsymbol]}%
+ \let\@@opsymbol\empty}%
+ {\doifconversiondefinedelse{#1}
+ {\edef\currentitemsymbol{#1}%
+ \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}%
+ \setgvalue{\@@localitemsymbol\currentitemlevel }{\actualitemnumber }%
+ \def\listitem
+ {\ifconditional\textlistitem
+ % maybe block stopper here, but one can as well clone an
+ % itemgroup then
+ \getitemparameter\currentitemlevel\c!lefttext
+ \getvalue{\@@localitemsymbol\currentitemlevel}%
+ \getitemparameter\currentitemlevel\c!righttext
+ \else
+ \getitemparameter\currentitemlevel\c!left
+ \getvalue{\@@localitemsymbol\currentitemlevel}%
+ \getitemparameter\currentitemlevel\c!right
+ \fi}%
+ \let\@@opsymbol\empty}%
+ {}}}
+
+% \def\calculatelistwidth#1% distance deals with 'broad'
+% {\itemgrouplistwidth\getitemparameter#1\c!distance\relax
+% \ifnum\getitemparameter#1\c!factor>\zerocount
+% \ifdim\itemgrouplistwidth=\zeropoint \itemgrouplistwidth=.5em\fi
+% \fi
+% \multiply\itemgrouplistwidth \getitemparameter#1\c!factor
+% \advance \itemgrouplistwidth \getitemparameter#1\c!width\relax}
+
+\def\calculatelistwidth#1%
+ {\ifdim\currentitemmaxwidth>\zeropoint
+ \itemgrouplistwidth\currentitemmaxwidth
+ \else\ifnum\getitemparameter#1\c!factor>\zerocount
+ \itemgrouplistwidth\getitemparameter#1\c!step\relax
+ \ifdim\itemgrouplistwidth=\zeropoint \itemgrouplistwidth=.5em\fi
+ \multiply\itemgrouplistwidth \getitemparameter#1\c!factor
+ \advance\itemgrouplistwidth\getitemparameter#1\c!width\relax
+ \else
+ \itemgrouplistwidth\getitemparameter#1\c!width\relax
+ \fi\fi
+ \advance\itemgrouplistwidth\getitemparameter#1\c!distance\relax}
+
+% The next conditionals deal with \item \startitemgroup. It
+% looks like a hack to skip back, but that way we preserve
+% the indentation and bullet placement. It's a rather
+% untested feature.
+
+\newconditional\concatnextitem \setfalse\concatnextitem
+\newconditional\autoconcatnextitem \settrue \autoconcatnextitem
+\newsignal \itemsignal
+
+\unexpanded\def\startitemgroup
+ {\dotripleempty\dostartitemgroup}
+
+\def\dostartitemgroup[#1][#2][#3]%
+ {\bgroup
+ \ifnum\currentitemlevel=\zerocount
+ \def\currentitemgroup{#1}% no nested mixing of itemgroups
+ \fi
+ \ifthirdargument
+ \dodostartitemgroup[#2][#3]%
+ \else
+ \doifassignmentelse{#2}
+ {\dodostartitemgroup[][#2]}
+ {\dodostartitemgroup[#2][]}%
+ \fi}
+
+\def\dodostartitemgroup[#1]% [#2]%
+ {\relax % prevents lookahead
+ \ifnum\currentitemlevel=\maxitemdepth\relax
+ \showmessage\m!layouts9{\number\maxitemdepth}%
+ \let\itemincrement\zerocount
+ \else
+ \let\itemincrement\plusone
+ \fi
+ \global\advance\itemdepth\itemincrement
+ \xdef\currentitemlevel{\number\itemdepth}%
+ \edef\itemgroupoptions{\getitemparameter\currentitemlevel\c!option}%
+ \ifx\itemgroupoptions\empty
+ \edef\itemgroupoptions{#1}%
+ \else
+ \doifsomething{#1}{\edef\itemgroupoptions{\itemgroupoptions,#1}}%
+ \fi
+ \normalexpanded{\noexpand\redostartitemgroup[\itemgroupoptions]}}% [#2]
+
+\let\startcollectitems\relax
+\let\stopcollectitems \relax
+
+%D A nice example of a plugin:
+%D
+%D \startbuffer
+%D \startitemize[a,random,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D
+%D \startitemize[a,random,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D
+%D \startitemize[a,packed]
+%D \startitem first \stopitem \startitem second \stopitem
+%D \startitem third \stopitem \startitem fourth \stopitem
+%D \stopitemize
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% better collectitems als conditional and a real plugin mechanism (some day)
+
+\@EA\long\@EA\def\@EA\collectitemgroupitem\@EA#\@EA1\csname\e!stop\v!item\endcsname
+ {\increment\itemcollectcounter
+ \long\setvalue{\v!item*\itemcollectcounter}{\item#1\par}}
+
+\def\flushcollecteditems
+ {\ifconditional\randomizeitems
+ \getrandomnumber\itemcollectcounternow\plusone\itemcollectcounter
+ \else
+ \increment\itemcollectcounternow
+ \fi
+ \doifdefined{\v!item*\itemcollectcounternow}
+ {\getvalue{\v!item*\itemcollectcounternow}%
+ \letbeundefined{\v!item*\itemcollectcounternow}%
+ \increment\itemcollectcounterdone}%
+ \ifnum\itemcollectcounterdone<\itemcollectcounter\relax
+ \expandafter\flushcollecteditems
+ \fi}
+
+\unexpanded\def\stopcollectitems
+ {\ifconditional\randomizeitems
+ \newcounter\itemcollectcounterdone
+ \ifnum\itemcollectcounter>\zerocount
+ \@EAEAEA\flushcollecteditems
+ \fi
+ \fi}
+
+\unexpanded\def\startcollectitems
+ {\ifconditional\randomizeitems
+ \newcounter\itemcollectcounter
+ \letvalue{\e!start\v!item}\collectitemgroupitem
+ \fi}
+
+%D End of plugin.
+
+\ifx\startcolumns\undefined \unexpanded\def\startcolumns[#1]{} \fi
+\ifx\stopcolumns \undefined \let\stopcolumns\relax \fi
+
+\def\dosetsymalign#1% hm, we should use one of the core-spa macros or make a helper
+ {\processaction
+ [#1]
+ [ \v!flushleft=>\let\symalignleft\relax,
+ \v!right=>\let\symalignleft\relax,
+ \v!flushright=>\let\symalignleft\hfill,
+ \v!left=>\let\symalignleft\hfill,
+ \v!middle=>\let\symalignleft\hfil,
+ \v!center=>\let\symalignleft\hfil]}
+
+\let\currentitemindenting\empty
+
+\def\redostartitemgroup[#1][#2]%
+ {\setfalse\inlinelistitem % new, no indent (leftskip)
+ \setfalse\concatnextitem % new, concat
+ \setfalse\txtlistitem
+ \ifhmode
+ \ifconditional\autoconcatnextitem % new, concat
+ \ifdim\lastskip=\itemsignal % new, concat
+ \settrue\concatnextitem % new, concat
+ \fi % new, concat
+ \fi % new, concat
+ \ifconditional\textlistitem\else\doifnotinset\v!text{#1}\par\fi % suboptimal
+ \fi
+ \begingroup
+ % new where, ok or not / we should integrate random, intro, continue here
+ % beware, the following no longer inherit from the previous level, is this ok?
+ \setfalse\reverselistitem
+ \setfalse\introlistitem
+ \setfalse\autointrolistitem
+ \setfalse\beforelistitem
+ \setfalse\afterlistitem
+ \setfalse\nowhitelistitem
+ \setfalse\randomizeitems
+ %
+ \doifinsetelse\v!intro {#1}{\settrue\introlistitem }{\setfalse\introlistitem }%
+ \doifinsetelse\v!random {#1}{\settrue\randomizeitems }{\setfalse\randomizeitems }%
+ \doifinsetelse\v!continue{#1}{\settrue\continuelistitems}{\setfalse\continuelistitems}%
+ % == \doifinsetelse\v!intro{#1}\settrue\setfalse\introlistitem
+ \global\advance\noflists\plusone
+ \currentnoflists\noflists
+ \noflistelements\zerocount
+ \setfalse\headlistitem
+ \setfalse\sublistitem
+ \setfalse\symbollistitem
+ \let\marsymbol\relax
+ \globallet\doitemdestination\empty
+ \let\symsymbol\empty
+ \let\symalignleft\relax
+ \the\itemgroupcommands
+ \checkcurrentnofitems
+ % \getitemparameter\currentitemlevel\empty
+ \let\listitem\empty % ** start value
+ \doifelsenothing{#1} % iffirstargument
+ {\edef\@@opsymbol{\noexpand\getitemparameter\currentitemlevel\noexpand\c!symbol}%
+ \letgvalueempty{\@@globalitemsymbol\currentitemlevel}%
+ \global\letitemparameter\currentitemlevel\v!continue\empty
+ \dosetupitemgroupvariable[\currentitemlevel][#2]}
+ {\dosetupitemgroupconstant{#1}%
+ \dosetupitemgroupvariable[\currentitemlevel][#2]%
+ \ifconditional\continuelistitems
+ \edef\@@opsymbol{\executeifdefined{\@@globalitemsymbol\currentitemlevel}{\currentitemlevel}}%
+ \getitemparameter\currentitemlevel\v!continue
+ \else
+ \edef\@@opsymbol{\noexpand\getitemparameter\currentitemlevel\noexpand\c!symbol}%
+ \global\setitemparameter\currentitemlevel\v!continue
+ {\dosetupitemgroupconstant{#1}%
+ \dosetupitemgroupvariable[\currentitemlevel][#2]}%
+ \fi
+ \def\docommand##1% \setitemmark resets \docommand
+ {\doifnot{##1}{0}{\setitemmark{##1}}}%
+ % \processcommalist[#1,\@@opsymbol]\docommand
+ \processcommalist[#1]\docommand}% ** preset sequence or provided sequence
+ % moved to here, after settings
+ \ifnum\currentitemlevel=\plusone % NIEUW
+ \doadaptleftskip {\getitemparameter\currentitemlevel\c!margin}%
+ \doadaptleftskip {\getitemparameter\currentitemlevel\c!leftmargin}%
+ \doadaptrightskip{\getitemparameter\currentitemlevel\c!rightmargin}%
+ \fi
+ \dosetraggedcommand{\getitemparameter\currentitemlevel\c!align}\raggedcommand
+ \dosetsymalign{\getitemparameter\currentitemlevel\c!symalign}%
+ %\doifsomething{\getitemparameter\currentitemlevel\c!indenting}
+ % {\normalexpanded{\noexpand\setupindenting[\v!reset,\v!yes,\getitemparameter\currentitemlevel\c!indenting]}}%
+ % {\normalexpanded{\noexpand\setupindenting[\getitemparameter\currentitemlevel\c!indenting]}}%
+ %
+ \edef\currentitemindenting{\getitemparameter\currentitemlevel\c!indenting}%
+ %
+ \setitemlevel{#1}% moved to here
+ \ifx\listitem\empty
+ \setitemmark\@@opsymbol % ** default value
+ \ifx\listitem\empty
+ \edef\currentitemsymbol{\currentitemlevel}% ** fall back
+ \fi
+ \fi
+ \ifconditional\autointrolistitem\ifnum\prevgraf<3
+ \settrue\introlistitem
+ \fi\fi
+ \ifconditional\paragraphlistitem
+ \ifnum\currentitemlevel>\plusone
+ \letitemparameter\currentitemlevel\c!inbetween\empty
+ \fi
+ \fi
+ \ifconditional\packlistitem
+ \letitemparameter\currentitemlevel\c!inbetween\empty
+ \fi
+ \doifinset\v!columns{#1}%
+ {\ifinsidecolumns\else\ifcase\itemcolumndepth
+ \global\itemcolumndepth\currentitemlevel\relax
+ \itembeforecommand
+ \processfirstactioninset
+ [#1]
+ [ \v!one=>\setitemparameter\currentitemlevel\c!n{1},
+ \v!two=>\setitemparameter\currentitemlevel\c!n{2},
+ \v!three=>\setitemparameter\currentitemlevel\c!n{3},
+ \v!four=>\setitemparameter\currentitemlevel\c!n{4},
+ \v!five=>\setitemparameter\currentitemlevel\c!n{5},
+ \s!unknown=>\@EA\!!counta\getitemparameter\currentitemlevel\c!n]%
+ \startcolumns
+ [\c!n=\getitemparameter\currentitemlevel\c!n,
+ \c!height=,
+ \c!rule=\v!off,
+ \c!balance=\v!yes,
+ \c!align=\v!no]%
+ \fi\fi}%
+ \ifconditional\fittinglistitems
+ \ifdim\currentitemmaxwidth>\zeropoint
+ \esetitemparameter\currentitemlevel\c!width{\currentitemmaxwidth}%
+ \fi
+ \fi
+ \calculatelistwidth\currentitemlevel
+ \ifdim\itemgrouplistwidth>\zeropoint\relax
+ \ifconditional\inlinelistitem\else
+ \advance\leftskip\itemgrouplistwidth\relax
+ \fi
+ \fi
+ \startcollectitems}
+
+% test / example
+%
+% \startnarrower[left] \startcolumns[n=3] \startitemize
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \stopcolumns\stopnarrower \blank
+%
+% \startnarrower[left] \startitemize[columns,three]
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \stopnarrower \blank
+%
+% \setupitemize[leftmargin=1.5em] \startitemize[columns,three]
+% \item \input ward \item \input ward \item \input ward
+% \stopitemize \blank
+
+\unexpanded\def\stopitemgroup
+ {\stopcollectitems
+ \ifconditional\textlistitem
+ \removeunwantedspaces\space\ignorespaces
+ \else
+ \par
+ \fi
+ \dolistreference
+ \ifconditional\firstlistitem \else \endgroup \fi % toegevoegd, eerste \som opent groep
+ \ifnum\itemcolumndepth=\currentitemlevel\relax
+ \stopcolumns
+ \global\itemcolumndepth\zerocount
+ \itemaftercommand
+ \dontrechecknextindentation
+ \else
+ \ifnum\currentitemlevel=\plusone
+ \allowitembreak
+ \itemaftercommand
+ \checknextindentation[\getitemparameter\currentitemlevel\c!indentnext]%
+ \else
+ % nieuw, not yet nobreak handling
+ \ifcase\autoitemgroupspacing
+ \itemaftercommand
+ \or
+ \itemaftercommand
+ \fi
+ \dontrechecknextindentation
+ \fi
+ \fi
+ % new test, needed in sidefloats (surfaced in volker's proceedings)
+ \ifconditional\textlistitem % else forgotten
+ \endgroup
+ \global\advance\itemdepth-\itemincrement
+ \xdef\currentitemlevel{\number\itemdepth}%
+ \egroup
+ \else
+ \endgroup
+ \global\advance\itemdepth-\itemincrement
+ \xdef\currentitemlevel{\number\itemdepth}%
+ \egroup
+ \par
+ \fi
+ \dorechecknextindentation}
+
+\newtoks\itemgroupcommands
+\newtoks\itemgroupfinalizer
+
+\def\itemgroupitem
+ {\the\itemgroupfinalizer
+ \doitemgroupitem}
+
+\def\itemgroupnoitem
+ {\the\itemgroupfinalizer
+ \doitemgroupnoitem}
+
+\def\itemgroupbutton[#1]%
+ {\the\itemgroupfinalizer
+ \gdef\doitemdestination{#1}%
+ \itemgroupitem}
+
+\def\itemgroupdummy
+ {\the\itemgroupfinalizer
+ \itemgroupsymbol{\strut}\strut}
+
+\def\itemgroupsubitem
+ {\the\itemgroupfinalizer
+ \settrue\sublistitem
+ \itemgroupitem}
+
+\def\itemgroupsymbol#1%
+ {\the\itemgroupfinalizer
+ \def\symsymbol{#1}%
+ \settrue\symbollistitem
+ \itemgroupitem}
+
+\def\itemgroupedge#1%
+ {\the\itemgroupfinalizer
+ \itemgroupsymbol
+ {\calculatelistwidth\currentitemlevel
+ \hbox to \itemgrouplistwidth
+ {#1\hskip\getitemparameter\currentitemlevel\c!distance}}}
+
+\def\itemgrouphead
+ {\the\itemgroupfinalizer
+ \settrue\headlistitem\doitemgrouphead}
+
+\def\itemgroupitems
+ {\the\itemgroupfinalizer
+ \dosingleempty\doitemgroupitems}
+
+\def\doitemgroupitems[#1]%
+ {\itemgroupedge
+ {\dorecurse{0\getitemparameter\currentitemlevel\c!items}{\listitem\hss}%
+ \unskip}}
+
+\def\itemgroupmargin#1%
+ {\the\itemgroupfinalizer
+ \def\marsymbol
+ {\llap
+ {\dosetitemattributes\currentitemlevel\c!marstyle\c!marcolor{#1}%
+ \hskip\leftskip\hskip\leftmargindistance}}%
+ \itemgroupitem}
+
+\appendtoks \let\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
+\appendtoks \letvalue\v!sub \itemgroupsubitem \to \itemgroupcommands
+\appendtoks \letvalue\v!sym \itemgroupsymbol \to \itemgroupcommands
+\appendtoks \letvalue\v!ran \itemgroupedge \to \itemgroupcommands
+\appendtoks \letvalue\v!head \itemgrouphead \to \itemgroupcommands
+\appendtoks \letvalue\v!its \itemgroupitems \to \itemgroupcommands
+\appendtoks \letvalue\v!mar \itemgroupmargin \to \itemgroupcommands
+
+% todo : \startitem .. \stopitem
+%
+% beware, we don't group (yet) as we want to keep the left/right skip
+%
+% \startitemize
+% \startitem \stopitem
+% some intermediate text that will properly indent
+% \startitem \stopitem
+% \stopitem
+%
+% so we need to keep that property
+
+\appendtoks
+ \letvalue{\e!start\v!item}\itemgroupitem
+ \letvalue{\e!stop \v!item}\endgraf
+\to \itemgroupcommands
+
+\appendtoks
+ \setvalue{\e!start\v!head}#1{\itemgrouphead#1\par}%
+ \letvalue{\e!stop \v!head}\endgraf
+\to \itemgroupcommands
+
+% \startitemize
+% \starthead {xx} test \stophead
+% \startitem test \stopitem
+% \startitem test \stopitem
+% \stopitemize
+
+% Sometimes the user demands get pretty weird:
+%
+% \startitemize
+% \item test
+% \item test
+% \headsym{xx} test \par test
+% \stopitemize
+
+% aligned items
+%
+% \startitemize[n,fit,broad][itemalign=flushright]
+% \dorecurse{100}{\item The first item.}
+% \stopitemize
+%
+% \setupitemgroup[itemize][each][fit]
+% \setupitemgroup[itemize][each][distance=.5em,factor=1,itemalign=flushright]
+%
+% \startitemize[n]
+% \dorecurse{100}{\item The first item.}
+% \stopitemize
+
+\appendtoks \let\headsym \itemgroupheadsym \to \itemgroupcommands
+
+\def\itemgroupheadsym#1%
+ {\def\symsymbol{#1}%
+ \settrue\symbollistitem
+ \settrue\headlistitem
+ \doitemgrouphead}
+
+% \defineitemgroup[gbitemize]
+% \setupitemgroup[gbitemize][each][headstyle=bold]
+
+% \startgbitemize
+% \txt{italian} some italians like this kind of cross||breed between
+% an itemize and a description
+% \txt{sicilians} i wonder how many sicilian mathematicians do a thesis
+% on the math involved in predicting the next big bang of the vulcano
+% \stopgbitemize
+
+\appendtoks \letvalue\v!txt\itemgrouptext \to \itemgroupcommands
+
+\newconditional\txtlistitem \setfalse\txtlistitem
+
+\def\itemgrouptext#1%
+ {\def\symsymbol{#1}%
+ \settrue\symbollistitem
+ \settrue\txtlistitem
+ \itemgroupitem}
+
+\def\dodotxtitem
+ {\scratchdimen\wd\itemgroupitembox
+ \advance \scratchdimen \getitemparameter\currentitemlevel\c!distance\relax
+ \ifdim\scratchdimen>\itemgrouplistwidth
+ \advance\scratchdimen -\itemgrouplistwidth
+ \else
+ \scratchdimen\zeropoint
+ \fi
+ \llap{\hbox to \itemgrouplistwidth{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hss}}% was: \hfill
+ \hskip\scratchdimen}
+
+\def\optimizelistitemsbreak
+ {\ifcase\itemcolumndepth \ifconditional\optimizelistitem
+ \ifcase \currentnofitems \else
+ \ifnum\currentnofitems=\plusthree
+ \ifnum\noflistelements>\plusone
+ \noitembreakspecial
+ \fi
+ \else\ifnum\currentnofitems>\plusthree
+ \ifnum\noflistelements=\plustwo
+ \ifconditional\introlistitem
+ \noitembreak
+ \else
+ \noitembreakspecial
+ \fi
+ \else\ifnum\currentnofitems=\noflistelements\relax
+ \noitembreakspecial
+ \else\ifnum\noflistelements>\plustwo
+ \itembreakspecial
+ \else
+ \ifconditional\introlistitem\else\itembreakspecial\fi
+ \fi\fi\fi
+ \fi\fi
+ \fi
+ \fi\fi}
+
+\def\dodosubitem
+ {\ifconditional\sublistitem\llap{+\enspace}\fi}
+
+\def\dodolapitem
+ {\llap
+ {\hbox to \itemgrouplistwidth
+ {\dodosubitem
+ \symalignleft
+ \box\itemgroupitembox % can already have a forced widt, only factor handled here
+ \hfil
+ \hskip\getitemparameter\currentitemlevel\c!distance}}}
+
+\def\dolistitem % evt aantal items opslaan per niveau, scheelt zoeken
+ {\ifconditional\textlistitem
+ % begin of item
+ \else
+ \par
+ \fi
+ \advance\noflistelements\plusone
+ \optimizelistitemsbreak
+ \setfalse\indentedfirstlistitem
+ \ifx\currentitemindenting\empty \else
+ \normalexpanded{\noexpand\setupindenting[\v!reset,\v!yes,\currentitemindenting]}%
+ \doifnot{\getitemparameter\currentitemlevel\c!alignsymbol}\v!yes
+ {\ifindentfirstparagraph\settrue\indentedfirstlistitem\fi}%
+ \fi
+ \dontleavehmode
+ \ifconditional\indentedfirstlistitem
+ \hskip-\parindent
+ \fi
+ \setbox\itemgroupitembox\hbox
+ {\ifconditional\headlistitem
+ \ifconditional\symbollistitem
+ \dosetitemattributes\currentitemlevel\c!symstyle\c!symcolor{\symsymbol}%
+ \else
+ \dosetitemattributes\currentitemlevel\c!headstyle\c!headcolor{\listitem}%
+ \fi
+ \else
+ \ifconditional\symbollistitem
+ \dosetitemattributes\currentitemlevel\c!symstyle\c!symcolor{\symsymbol}%
+ \else
+ \dosetitemattributes\currentitemlevel\c!style\c!color{\listitem}%
+ \fi
+ \fi}%
+ \doifsomething\doitemdestination
+ {\setbox\itemgroupitembox\hbox{\directgotobox{\box\itemgroupitembox}[\doitemdestination]}}%
+ \itemgroupaskedwidth\getitemparameter\currentitemlevel\c!width\relax
+ \ifconditional\fittinglistitems
+ \ifdim\wd\itemgroupitembox>\getitemparameter\currentitemlevel\c!maxwidth sp\relax
+ \xsetitemparameter\currentitemlevel\c!maxwidth{\number\wd\itemgroupitembox}%
+ \fi
+ \ifdim\currentitemmaxwidth>\zeropoint
+ \setbox\itemgroupitembox\simplealignedbox
+ {\getitemparameter\currentitemlevel\c!itemalign}
+ {\dimexpr\currentitemmaxwidth+\getitemparameter\currentitemlevel\c!distance\relax}
+ {\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}%
+ \fi
+ \else\ifdim\itemgroupaskedwidth>\zeropoint
+ \doifsomething{\getitemparameter\currentitemlevel\c!itemalign}
+ {\setbox\itemgroupitembox\simplealignedbox
+ {\getitemparameter\currentitemlevel\c!itemalign}
+ {\dimexpr\itemgroupaskedwidth+\getitemparameter\currentitemlevel\c!distance\relax}
+ {\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}}%
+ \fi\fi
+ \globallet\doitemdestination\empty
+ % new, prevents loops when symbol is (not yet found) graphic
+ \ht\itemgroupitembox\strutheight
+ \dp\itemgroupitembox\strutdepth
+ % so that content differs per run (esp mp graphics afterwards)
+ \checkforrepeatedlistitem
+ \ifdim\itemgroupaskedwidth<\zeropoint\relax
+ \llap{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hskip\leftmargindistance}%
+ \else
+ \ifdim\itemgroupaskedwidth=\zeropoint\relax
+ \calculatelistwidth1%
+ \else
+ \calculatelistwidth\currentitemlevel
+ \fi
+ \ifconditional\textlistitem
+ \hbox{\ifconditional\sublistitem+\enspace\fi\box\itemgroupitembox\hskip\interwordspace}\nobreak
+ \else\ifconditional\inlinelistitem
+ \hbox to \itemgrouplistwidth{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hss}% was: \hfill
+ \else\ifconditional\txtlistitem
+ \dodotxtitem
+ \else
+ \dodolapitem
+ \fi\fi\fi
+ \fi
+ \setevalue{\@@currentitemsymbol\currentitemlevel}%
+ {\getvalue{\@@localitemsymbol\currentitemlevel}}% still problems with \uchar ?
+ %{\noexpand\getvalue{\@@localitemsymbol\currentitemlevel}}% no, spoils subrefs
+ \setfalse\headlistitem
+ \setfalse\sublistitem
+ \setfalse\symbollistitem
+ \EveryPar{\ignorespaces}% needed ?
+ \ifconditional\indentedfirstlistitem
+ \hskip\parindent
+ \fi
+ \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
+ {\advance\noflistelements\plusone
+ \setbox\itemgroupitembox\hbox
+ {\dosetitemattributes\currentitemlevel\c!style\c!color{\listitem}}%
+ \checkforrepeatedlistitem
+ \ignorespaces}
+
+\def\doitemgroupnoitem
+ {\doadvanceitem\donolistitem}
+
+% For Frank Grieshaber and Mojca Miklavec:
+
+\newconditional\repeatlistitem
+
+\def\checkforrepeatedlistitem
+ {\ifconditional\repeatlistitem
+ \ifx\currentrepeatstart\empty
+ \let\currentrepeatstart\currentitemlevel
+ \fi
+ \setbox\itemgroupitembox\hbox to \wd\itemgroupitembox{\hskip-\itemgroupaskedwidth\box\itemgroupitembox}% what a hack !
+ \fi}
+
+% \startbuffer
+% \item
+% \startitemize[n]
+% \item item 1.1
+% \item item 1.2
+% \startitemize[n] \item item 1.2.1 \item item 1.2.2 \stopitemize
+% \item item 1.3
+% \stopitemize
+% \item
+% \startitemize[n] \item item 2.1 \item item 2.2 \stopitemize
+% \item item 3
+% \startitemize[n] \item item 3.1 \item item 3.2 \stopitemize
+% \item
+% \startitemize[n] \item item 4.1 \item item 4.2 \stopitemize
+% \stopbuffer
+%
+% \startitemize[n,repeat,6*broad,packed] \getbuffer \stopitemize \blank[3*big]
+% \startitemize[n,repeat,packed] \getbuffer \stopitemize \blank[3*big]
+% \setupitemize[each][atmargin][width=3em]
+% \startitemize[n,repeat,packed] \getbuffer \stopitemize
+
+\chardef\autoitemgroupspacing=2 % 0 = voor/na, 1=tussen als geen voor 2=(prev)tussen=old/normal
+
+\def\complexdoitemgroupitem[#1]%
+ {\def\currentitemreference{#1}%
+ \ifconditional\textlistitem
+ % begin of item
+ \else
+ \par
+ \fi
+ \ifconditional\concatnextitem % new, concat
+ \noitembreak % new, concat
+ \fi % new, concat
+ \doadvanceitem
+ \ifconditional\firstlistitem
+ \setfalse\firstlistitem
+ \begingroup
+ \ifcase\currentitemlevel
+ \or % 1
+ \ifcase\itemcolumndepth
+ \ifconditional\introlistitem\noitembreak\fi
+ \itembeforecommand
+ \ifconditional\introlistitem\noitembreak\fi
+ \fi
+ \else % 2 en hoger
+ \ifconditional\paragraphlistitem \else
+ \edef\previtemlevel{\the\numexpr\currentitemlevel-1}%
+ \ifcase\autoitemgroupspacing\relax % nieuw
+ \itembeforecommand
+ \or
+ \doifelsenothing\itembeforecommand\itembeforecommand{\getitemparameter\previtemlevel\c!inbetween}%
+ \else
+ \getitemparameter\previtemlevel\c!inbetween
+ \fi
+ \fi
+ \fi
+ \else
+ \ifconditional\textlistitem % was bugged: \inlinelistitem
+ \ifhmode
+ % WS: make the distance between items customizable, think about better default values -> see itemize-1.tex
+ \normalexpanded{\doassigntextitemdistance{\getitemparameter\currentitemlevel\c!textdistance}}% HH: moved out and made configurable (sort of)
+ \removeunwantedspaces\hskip\textitemdistance\relax
+ \fi
+ \else
+ \iteminbetweencommand
+ \fi
+ \fi
+ \ifconditional\concatnextitem
+ \vskip-\dimexpr\lastskip+\lineheight\relax
+ \nobreak
+ \fi
+ \dolistitem
+ \relax
+ \ifconditional\packlistitem
+ \setupwhitespace[\v!none]%
+ \fi
+ \getitemparameter\currentitemlevel\c!inner
+ \marsymbol
+ \let\marsymbol\relax
+ \strut % added 11-08-99
+ \setfalse\concatnextitem % new, concat
+ \nobreak % else problems with intext items
+ \hskip\itemsignal % new, concat
+ \getitemparameter\currentitemlevel\c!command} % \defaultitemcommand
+
+% \startitemize[text][space=medium]
+% \item one \item two \item three
+% \stopitemize
+
+\setvalue{\??op:\??op:\c!textdistance:\v!none}%
+ {\def\textitemdistance{\zeropoint}}
+
+\def\doassigngiventextitemdistance#1%
+ {\assignvalue
+ {#1}%
+ \textitemdistance
+ {.5\interwordspace\!!plus.5\emwidth}%
+ {\interwordspace \!!plus \emwidth}%
+ {\emwidth \!!plus \interwordstretch\!!minus\interwordshrink}}
+
+\unexpanded\def\doassigntextitemdistance#1%
+ {\ifcsname\??op:\??op:\c!textdistance:#1\endcsname
+ \csname\??op:\??op:\c!textdistance:#1\endcsname
+ \else
+ \doassigngiventextitemdistance{#1}%
+ \fi}
+
+\def\defaultitemcommand
+ {\EveryPar{\ignorespaces}% needed ?
+ \ignorespaces}
+
+% For Giuseppe "Oblomov" Bilotta, inspired on a suggestion by Taco
+% Hoekwater.
+%
+% \def\MyItemCommand#1{{\bf#1}\quad}
+% \setupitemgroup[itemize][command=\MyItemCommand]
+%
+% \startitemize
+% \item {test} is this okay?
+% \item {test} is this okay?
+% \item {test} is this okay?
+% \stopitemize
+
+\def\complexitem[#1]#2\par % todo: no two pass data
+ {\startitemgroup[#1]%
+ \complexdoitemgroupitem[]\begstrut#2\endstrut\par
+ \stopitemgroup}
+
+\definecomplexorsimpleempty\item
+\definecomplexorsimpleempty\doitemgroupitem
+
+\def\complexhead[#1]#2\par#3\par
+ {\startitemgroup[#1]%
+ \complexdoitemgrouphead[]\begstrut#2\endstrut\par\begstrut#3\endstrut\par
+ \stopitemgroup}
+
+% the next solution accepts \head test \type{x{x}x} test ...
+
+\let\doenditemhead\relax
+
+\def\complexdoitemgrouphead[#1]% beter in \complexdosom hangen met een if
+ {\ifconditional\firstlistitem\else\allowitembreak\fi
+ \ifconditional\packlistitem\else\itembeforeheadcommand\fi
+ \ifconditional\firstlistitem\ifconditional\introlistitem\else\ifcase\currentitemlevel % incr in \complexdosom
+ \allowitembreak
+ \fi\fi\fi
+ \complexdoitemgroupitem[#1]%
+ \bgroup
+ \dosetitemattributes\currentitemlevel\c!headstyle\c!headcolor\empty
+ \ignorespaces
+ \itemgroupfinalizer{\enditemhead}%
+ \let\par\enditemhead} % brrrr but simple anyway
+
+\def\enditemhead
+ {\removeunwantedspaces
+ \egroup
+ \ifconditional\textlistitem
+ \space\ignorespaces
+ \else
+ \par
+ \fi
+ \noitembreak
+ \ifconditional\packlistitem\else\itemafterheadcommand\fi
+ \noitembreak
+ \noindentation}
+
+\definecomplexorsimpleempty\head
+\definecomplexorsimpleempty\doitemgrouphead
+
+\def\sym#1%
+ {\noindent
+ \begingroup
+ \setbox\scratchbox\hbox{\trialtypesettingtrue#1}%
+ \setbox\scratchbox\hbox
+ \ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#1\hfil}%
+ \normalexpanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}%
+ \ignorespaces}
+
+\setupitemgroups
+ [\c!margin=\zeropoint,
+ \c!leftmargin=\zeropoint,
+ \c!rightmargin=\zeropoint,
+ \c!indentnext=\v!yes,
+ \c!width=1.5em,
+ \c!factor=0,
+ \c!distance=.5em,
+ %\c!align=\v!normal, % definitely not \v!normal, see mails and
+ %\c!align=, % debug reports of David A & Patrick G on context list
+ %\c!symalign=,
+ %\c!color=,
+ %\c!indenting=, % untouched if empty
+ %\c!style=,
+ \c!marstyle=\c!type, % \c! ???
+ %\c!symstyle=,
+ %\c!headstyle=,
+ %\c!marcolor=,
+ %\c!symcolor=,
+ %\c!headcolor=,
+ %\c!beforehead=,
+ \c!afterhead=\blank,
+ \c!before=\blank,
+ \c!inbetween=\blank,
+ \c!after=\blank,
+ %\c!stopper=.,
+ \c!placestopper=\v!yes,
+ \c!stopper=.,
+ %\c!inner=,
+ \c!n=2,
+ \c!items=4,
+ \c!lefttext=(,
+ \c!righttext=),
+ \c!start=1,
+ \c!criterium=\v!all, % permits 0 and negative numbers
+ %\c!option=,
+ \c!textdistance=\v!big,
+ \c!command=\defaultitemcommand,
+ \c!indenting=\v!next,
+ %\c!alignsymbol=v!no,
+ \c!symbol=\currentitemlevel]
+
+% new:
+
+\setupitemgroups
+ [\c!step=.5em, % deals with broad
+ \c!distance=\zeropoint]
+
+\setupitemgroups
+ [\c!prefix=\v!no,
+% \c!prefixstopper=.,
+% \c!prefixseparatorset=,
+% \c!prefixconversion=,
+% \c!prefixconversionset=,
+% \c!prefixset=,
+% \c!prefixsegments=1:100,
+ \c!prefixconnector=.,
+ %
+ \c!numberseparatorset=,
+ \c!numberconversionset=,
+ \c!numberstopper=.,
+ \c!numbersegments=1]
+
+\defineitemgroup [\v!itemize]
+
+\protect \endinput
diff --git a/tex/context/base/strc-lnt.mkii b/tex/context/base/strc-lnt.mkii
new file mode 100644
index 000000000..ef09842cd
--- /dev/null
+++ b/tex/context/base/strc-lnt.mkii
@@ -0,0 +1,197 @@
+%D \module
+%D [ file=strc-lnt,
+%D version=2002.05.10,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Line Notes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Line Notes}
+
+%D This module loads on top of the footnote and line numbering macros.
+
+\unprotect
+
+\newcounter\linenotecounter
+\newtoks \collectedlinenotes
+\newif \iftracelinenotes
+
+\appendtoks
+ \the\collectedlinenotes
+\to \everylinenumber
+
+\appendtoks
+ \global\collectedlinenotes\emptytoks
+\to \beforeeverylinenumbering
+
+\def\dohandlelinenote#1#2#3%
+ {\bgroup
+ \expanded{\beforesplitstring#2}\at--\to\linenotelinenumber
+ \ifnum\linenotelinenumber=\linenumber\relax
+ % todo: \onlyfootnote{#2}{#3}% == configurable
+ % \setupnote[#1][\c!numbercommand=\gobbleoneargument]%
+ % \setnotetext[#1]{\rawreference\s!fnt{\s!fnt:f:\number\internalnotereference}{}#2: #3}%
+ \def\linenotelinenumber##1{#2}%
+ \setupnote[#1][\c!numbercommand=\linenotelinenumber,\c!textcommand=\gobbleoneargument]%
+ \setnote[#1]{#3}%
+ \fi
+ \egroup}
+
+\def\dotracedlinenote#1%
+ {\iftracelinenotes
+ \hbox to \zeropoint
+ {\forgetall
+ \localcolortrue
+ \hsize\zeropoint
+ \hss
+ \vbox to \strutheight{\llap{\red\infofont\setstrut\linenotecounter}\vss}%
+ {\color[blue]{\vl}}%
+ \vbox to \strutheight{\rlap{\red\infofont\setstrut#1}\vss}%
+ \hss}%
+ \prewordbreak
+ \fi}
+
+\def\dolinenote#1#2%
+ {\doglobal\increment\linenotecounter
+ \doifreferencefoundelse{\??rr:\linenotecounter}%
+ {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote
+ {#1}{\currenttextreference}}{#2}\to\collectedlinenotes}
+ \donothing
+ \dotracedlinenote\empty
+ \expanded{\someline[\??rr:\linenotecounter]}}
+
+\def\dostartlinenote#1[#2]#3%
+ {\doifreferencefoundelse{\??rr:#2}%
+ {\expanded{\doglobal\noexpand\appendtoks\noexpand\dohandlelinenote
+ {#1}{\currenttextreference}}{#3}\to\collectedlinenotes}
+ \donothing
+ \dotracedlinenote{#2}%
+ \startline[\??rr:#2]}
+
+\def\dostoplinenote#1[#2]%
+ {\stopline[\??rr:#2]}
+
+% defining them
+
+\def\definelinenote
+ {\dodoubleempty\dodefinelinenote}
+
+\def\dodefinelinenote[#1][#2]%
+ {\definenote[#1][#2]%
+ \setvalue {#1}{\dolinenote {#1}}%
+ \setvalue{\e!start#1}{\dostartlinenote{#1}}%
+ \setvalue{\e!stop #1}{\dostoplinenote {#1}}}
+
+\def\setuplinenote % convenient
+ {\setupnote}
+
+% We predefine one, namely \type {\linenote} cum suis.
+
+\definelinenote[\v!linenote]
+
+% \startbuffer[test]
+% \startlinenumbering[100]
+% test \linenote {oeps} test test test test test test
+% test \startlinenote [well] {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \stoplinenote [well] test test test test test test
+% \stoplinenumbering
+% \stopbuffer
+%
+% \setupnotedefinition[linenote] [location=serried,distance=.5em]
+%
+% {\typebuffer[test] \getbuffer[test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [align=left]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=1em,
+% align=left]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=2em,
+% distance=.5em,
+% align=left]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=2em,
+% align=middle]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [conversion=romannumerals,
+% start=1,
+% step=1,
+% location=text,
+% style=slanted,
+% color=blue,
+% width=1.5em]
+% \stopbuffer
+%
+% {\typebuffer[setup] \startnarrower\getbuffer[setup,test]\stopnarrower} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=4em,
+% left=--,
+% right=--,
+% align=middle]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup-1]
+% \setuplinenumbering
+% [style=\bfxx,
+% command=\WatchThis]
+% \stopbuffer
+%
+% \startbuffer[setup-2]
+% \def\WatchThis#1%
+% {\ifodd\linenumber
+% \definecolor[linecolor][red]%
+% \else
+% \definecolor[linecolor][green]%
+% \fi
+% \inframed
+% [offset=1pt,frame=off,background=color,backgroundcolor=linecolor]
+% {#1}}
+% \stopbuffer
+%
+% {\typebuffer[setup-1,setup-2] \getbuffer[setup-1,setup-2,test]} \page
+%
+% \startbuffer[setup-1]
+% \setuplinenumbering
+% [location=inright,
+% style=\bfxx,
+% command=\WatchThis]
+% \stopbuffer
+%
+% {\typebuffer[setup-1] \getbuffer[setup-1,setup-2,test]} \page
+
+\protect \endinput
diff --git a/tex/context/base/strc-lnt.mkiv b/tex/context/base/strc-lnt.mkiv
new file mode 100644
index 000000000..0df44294b
--- /dev/null
+++ b/tex/context/base/strc-lnt.mkiv
@@ -0,0 +1,173 @@
+%D \module
+%D [ file=strc-lnt,
+%D version=2002.05.10,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Line Notes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Line Notes}
+
+%D This module loads on top of the footnote and line numbering macros.
+
+\unprotect
+
+\newcounter\linenotecounter \newif\iftracelinenotes % will be tracker
+
+\def\dohandlelinenote#1#2#3%
+ {\bgroup
+ \def\linenotelinenumber##1{\inlinerange[#2]}% ##1 == order
+ \setupnote[ln:#1][\c!numbercommand=\linenotelinenumber,\c!textcommand=\gobbleoneargument]% todo: deep hook
+ \setnote[ln:#1]{#3}%
+ \egroup}
+
+\def\dotracedlinenote#1%
+ {\iftracelinenotes
+ \hbox to \zeropoint
+ {\forgetall
+ \hsize\zeropoint
+ \hss
+ \vbox to \strutheight{\llap{\red\infofont\setstrut\linenotecounter}\vss}%
+ {\color[blue]{\vl}}%
+ \vbox to \strutheight{\rlap{\red\infofont\setstrut#1}\vss}%
+ \hss}%
+ \prewordbreak
+ \fi}
+
+\def\dolinenote#1#2%
+ {\doglobal\increment\linenotecounter
+ \dohandlelinenote{#1}{\linenotecounter}{#2}%
+ \dotracedlinenote\empty
+ \expanded{\someline[\linenotecounter]}}
+
+\def\dostartlinenote#1[#2]#3%
+ {\doglobal\increment\linenotecounter
+ \dohandlelinenote{#1}{#2}{#3}%
+ \dotracedlinenote{#2}%
+ \startline[#2]}
+
+\def\dostoplinenote#1[#2]%
+ {\stopline[#2]}
+
+\unexpanded\def\definelinenote
+ {\dodoubleempty\dodefinelinenote}
+
+\def\dodefinelinenote[#1][#2]%
+ {\definenote[ln:#1][#2]%
+ \setuvalue {#1}{\dolinenote {#1}}%
+ \setuvalue{\e!start#1}{\dostartlinenote{#1}}%
+ \setuvalue{\e!stop #1}{\dostoplinenote {#1}}}
+
+\unexpanded\def\setuplinenote[#1]% convenient
+ {\setupnote[ln:#1]}
+
+% We predefine one, namely \type {\linenote} cum suis.
+
+\definelinenote[\v!linenote]
+
+% \startbuffer[test]
+% \startlinenumbering[100]
+% test \linenote {oeps} test test test test test test
+% test \startlinenote [well] {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \linenote {oeps} test test test test test test
+% test \stoplinenote [well] test test test test test test
+% \stoplinenumbering
+% \stopbuffer
+%
+% \setupnotedefinition[linenote] [location=serried,distance=.5em]
+%
+% {\typebuffer[test] \getbuffer[test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [align=left]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=1em,
+% align=left]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=2em,
+% distance=.5em,
+% align=left]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=2em,
+% align=middle]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [conversion=romannumerals,
+% start=1,
+% step=1,
+% location=text,
+% style=slanted,
+% color=blue,
+% width=1.5em]
+% \stopbuffer
+%
+% {\typebuffer[setup] \startnarrower\getbuffer[setup,test]\stopnarrower} \page
+%
+% \startbuffer[setup]
+% \setuplinenumbering
+% [width=4em,
+% left=--,
+% right=--,
+% align=middle]
+% \stopbuffer
+%
+% {\typebuffer[setup] \getbuffer[setup,test]} \page
+%
+% \startbuffer[setup-1]
+% \setuplinenumbering
+% [style=\bfxx,
+% command=\WatchThis]
+% \stopbuffer
+%
+% \startbuffer[setup-2]
+% \def\WatchThis#1%
+% {\ifodd\linenumber
+% \definecolor[linecolor][red]%
+% \else
+% \definecolor[linecolor][green]%
+% \fi
+% \inframed
+% [offset=1pt,frame=off,background=color,backgroundcolor=linecolor]
+% {#1}}
+% \stopbuffer
+%
+% {\typebuffer[setup-1,setup-2] \getbuffer[setup-1,setup-2,test]} \page
+%
+% \startbuffer[setup-1]
+% \setuplinenumbering
+% [location=inright,
+% style=\bfxx,
+% command=\WatchThis]
+% \stopbuffer
+%
+% {\typebuffer[setup-1] \getbuffer[setup-1,setup-2,test]} \page
+
+\protect \endinput
diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua
new file mode 100644
index 000000000..fefbe52ce
--- /dev/null
+++ b/tex/context/base/strc-lst.lua
@@ -0,0 +1,486 @@
+if not modules then modules = { } end modules ['strc-lst'] = {
+ version = 1.001,
+ comment = "companion to strc-lst.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- when all datastructures are stable a packer will be added which will
+-- bring down memory consumption a bit; we can use for instance a pagenumber,
+-- section, metadata cache (internal then has to move up one level) or a
+-- shared cache [we can use a fast and stupid serializer]
+
+local format, gmatch, gsub = string.format, string.gmatch, string.gsub
+local tonumber = tonumber
+local texsprint, texprint, texwrite, texcount = tex.sprint, tex.print, tex.write, tex.count
+local concat, insert, remove = table.concat, table.insert, table.remove
+local lpegmatch = lpeg.match
+
+local trace_lists = false trackers.register("structure.lists", function(v) trace_lists = v end)
+
+local ctxcatcodes = tex.ctxcatcodes
+
+structure.lists = structure.lists or { }
+structure.sections = structure.sections or { }
+structure.helpers = structure.helpers or { }
+structure.documents = structure.documents or { }
+structure.pages = structure.pages or { }
+
+local lists = structure.lists
+local sections = structure.sections
+local helpers = structure.helpers
+local documents = structure.documents
+local pages = structure.pages
+
+lists.collected = lists.collected or { }
+lists.tobesaved = lists.tobesaved or { }
+lists.enhancers = lists.enhancers or { }
+lists.internals = lists.internals or { }
+lists.ordered = lists.ordered or { }
+
+local variables = interfaces.variables
+local matching_till_depth, number_at_depth = sections.matching_till_depth, sections.number_at_depth
+
+local function initializer()
+ -- create a cross reference between internal references
+ -- and list entries
+ local collected = lists.collected
+ local internals = jobreferences.internals
+ local ordered = lists.ordered
+ for i=1,#collected do
+ local c = collected[i]
+ local m = c.metadata
+ local r = c.references
+ if m then
+ -- access by internal reference
+ local internal = r and r.internal
+ if internal then
+ internals[internal] = c
+ end
+ -- access by order in list
+ local kind, name = m.kind, m.name
+ if kind and name then
+ local ok = ordered[kind]
+ if ok then
+ local on = ok[name]
+ if on then
+ on[#on+1] = c
+ else
+ ok[name] = { c }
+ end
+ else
+ ordered[kind] = { [name] = { c } }
+ end
+ end
+ end
+ end
+end
+
+if job then
+ job.register('structure.lists.collected', structure.lists.tobesaved, initializer)
+end
+
+local cached, pushed = { }, { }
+
+function lists.push(t)
+ local r = t.references
+ local i = (r and r.internal) or 0 -- brrr
+ local p = pushed[i]
+ if not p then
+ p = #cached + 1
+ cached[p] = helpers.simplify(t)
+ pushed[i] = p
+ end
+ texwrite(p)
+end
+
+function lists.doifstoredelse(n)
+ commands.doifelse(cached[tonumber(n)])
+end
+
+-- this is the main pagenumber enhancer
+
+function lists.enhance(n)
+ -- todo: symbolic names for counters
+ local l = cached[n]
+ if l then
+ --
+ l.directives = nil -- might change
+ -- save in the right order (happens at shipout)
+ lists.tobesaved[#lists.tobesaved+1] = l
+ -- default enhancer (cross referencing)
+ l.references.realpage = texcount.realpageno
+ -- specific enhancer (kind of obsolete)
+ local kind = l.metadata.kind
+ local enhancer = kind and lists.enhancers[kind]
+ if enhancer then
+ enhancer(l)
+ end
+ end
+end
+
+-- we can use level instead but we can also decide to remove level from the metadata
+
+local nesting = { }
+
+function lists.pushnesting(i)
+ local r = lists.result[i]
+ local name = r.metadata.name
+ local numberdata = r and r.numberdata
+ local n = (numberdata and numberdata.numbers[sections.getlevel(name)]) or 0
+ insert(nesting, { number = n, name = name, result = lists.result, parent = r })
+end
+
+function lists.popnesting()
+ local old = remove(nesting)
+ lists.result = old.result
+end
+
+-- will be split
+
+local function filter_collected(names, criterium, number, collected, nested)
+ local numbers, depth = documents.data.numbers, documents.data.depth
+ local hash, result, all, detail = { }, { }, not names or names == "" or names == variables.all, nil
+ names, criterium = gsub(names," ",""), gsub(criterium," ","")
+ if trace_lists then
+ logs.report("lists","filtering names: %s, criterium: %s, number: %s",names,criterium,number or "-")
+ end
+ if not all then
+ for s in gmatch(names,"[^, ]+") do -- sort of settings to hash
+ hash[s] = true
+ end
+ end
+ if criterium == variables.intro then
+ -- special case, no structure yet
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r and r.section == 0 then
+ result[#result+1] = v
+ end
+ end
+ elseif criterium == variables.all or criterium == variables.text then
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r then
+ local sectionnumber = (r.section == 0) or jobsections.collected[r.section]
+ if sectionnumber then -- and not sectionnumber.hidenumber then
+ local metadata = v.metadata
+ if metadata and not metadata.nolist and (all or hash[metadata.name or false]) then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ elseif criterium == variables.current then
+ if depth == 0 then
+ return filter_collected(names,variables.intro,number,collected)
+ else
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r then
+ local sectionnumber = jobsections.collected[r.section]
+ if sectionnumber then -- and not sectionnumber.hidenumber then
+ local cnumbers = sectionnumber.numbers
+ local metadata = v.metadata
+ if cnumbers then
+ if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers > depth then
+ local ok = true
+ for d=1,depth do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif criterium == variables.here then
+ -- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers
+ if depth == 0 then
+ return filter_collected(names,variables.intro,number,collected)
+ else
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r then
+ local sectionnumber = jobsections.collected[r.section]
+ if sectionnumber then -- and not sectionnumber.hidenumber then
+ local cnumbers = sectionnumber.numbers
+ local metadata = v.metadata
+ if cnumbers then
+--~ print(#cnumbers, depth, table.concat(cnumbers))
+ if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers >= depth then
+ local ok = true
+ for d=1,depth do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif criterium == variables.previous then
+ if depth == 0 then
+ return filter_collected(names,variables.intro,number,collected)
+ else
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r then
+ local sectionnumber = jobsections.collected[r.section]
+ if sectionnumber then -- and not sectionnumber.hidenumber then
+ local cnumbers = sectionnumber.numbers
+ local metadata = v.metadata
+ if cnumbers then
+ if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers >= depth then
+ local ok = true
+ for d=1,depth-1 do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif criterium == variables["local"] then -- not yet ok
+ local nested = nesting[#nesting]
+ if nested then
+ return filter_collected(names,nested.name,nested.number,collected,nested)
+ elseif sections.autodepth(documents.data.numbers) == 0 then
+ return filter_collected(names,variables.all,number,collected)
+ else
+ return filter_collected(names,variables.current,number,collected)
+ end
+ else -- sectionname, number
+ -- not the same as register
+ local depth = sections.getlevel(criterium)
+ local number = tonumber(number) or number_at_depth(depth) or 0
+ if trace_lists then
+ local t = sections.numbers()
+ detail = format("depth: %s, number: %s, numbers: %s, startset: %s",depth,number,(#t>0 and concat(t,".",1,depth)) or "?",#collected)
+ end
+ if number > 0 then
+ local parent = nested and nested.parent and nested.parent.numberdata.numbers -- so local as well as nested
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r then
+ local sectionnumber = jobsections.collected[r.section]
+ if sectionnumber then
+ local metadata = v.metadata
+ local cnumbers = sectionnumber.numbers
+ if cnumbers then
+ if (all or hash[metadata.name or false]) and #cnumbers >= depth and matching_till_depth(depth,cnumbers,parent) then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if trace_lists then
+ if detail then
+ logs.report("lists","criterium: %s, %s, found: %s",criterium,detail,#result)
+ else
+ logs.report("lists","criterium: %s, found: %s",criterium,#result)
+ end
+ end
+ return result
+end
+
+lists.filter_collected = filter_collected
+
+function lists.filter(names, criterium, number)
+ return filter_collected(names, criterium, number, lists.collected)
+end
+
+lists.result = { }
+
+function lists.process(...)
+ lists.result = lists.filter(...)
+ for i=1,#lists.result do
+ local r = lists.result[i]
+ local m = r.metadata
+ texsprint(ctxcatcodes,format("\\processlistofstructure{%s}{%s}{%i}",m.name,m.kind,i))
+--~ context.processlistofstructure(m.name,m.kind,i)
+ end
+end
+
+function lists.analyze(...)
+ lists.result = lists.filter(...)
+end
+
+function lists.userdata(name,r,tag) -- to tex (todo: xml)
+ local result = lists.result[r]
+ if result then
+ local userdata, metadata = result.userdata, result.metadata
+ local str = userdata and userdata[tag]
+ if str then
+ texsprint(metadata and metadata.catcodes or ctxcatcodes,str)
+ end
+ end
+end
+
+function lists.uservalue(name,r,tag,default) -- to lua
+ local str = lists.result[r]
+ str = str and str.userdata
+ str = str and str[tag]
+ return str or default
+end
+
+function lists.size()
+ texprint(#lists.result)
+end
+
+function lists.location(n)
+ local l = lists.result[n]
+ texsprint(l.references.internal or n)
+end
+
+function lists.sectionnumber(name,n,spec)
+ local data = lists.result[n]
+ local sectiondata = jobsections.collected[data.references.section]
+ -- hm, prefixnumber?
+ sections.typesetnumber(sectiondata,"prefix",spec,sectiondata) -- data happens to contain the spec too
+end
+
+-- some basics (todo: helpers for pages)
+
+function lists.title(name,n,tag) -- tag becomes obsolete
+ local data = lists.result[n]
+ if data then
+ local titledata = data.titledata
+ if titledata then
+ helpers.title(titledata[tag] or titledata.list or titledata.title or "",data.metadata)
+ end
+ end
+end
+
+function lists.savedtitle(name,n,tag)
+ local data = cached[tonumber(n)]
+ if data then
+ local titledata = data.titledata
+ if titledata then
+ helpers.title(titledata[tag] or titledata.title or "",data.metadata)
+--~ texsprint(ctxcatcodes,titledata[tag] or titledata.title or "")
+ end
+ end
+end
+
+function lists.savednumber(name,n)
+ local data = cached[tonumber(n)]
+ if data then
+ local numberdata = data.numberdata
+ if numberdata then
+ sections.typesetnumber(numberdata,"number",numberdata or false)
+ end
+ end
+end
+
+function lists.savedprefixednumber(name,n)
+ local data = cached[tonumber(n)]
+ if data then
+ helpers.prefix(data,data.prefixdata)
+ local numberdata = data.numberdata
+ if numberdata then
+--~ print(name,n,table.serialize(numberdata))
+ sections.typesetnumber(numberdata,"number",numberdata or false)
+ end
+ end
+end
+
+function lists.prefix(name,n,spec)
+ helpers.prefix(lists.result[n],spec)
+end
+
+function lists.page(name,n,pagespec)
+ helpers.page(lists.result[n],pagespec)
+end
+
+function lists.prefixedpage(name,n,prefixspec,pagespec)
+ helpers.prefixpage(lists.result[n],prefixspec,pagespec)
+end
+
+function lists.realpage(name,n)
+ local data = lists.result[n]
+ if data then
+ local references = data.references
+ texsprint(references and references.realpage or 0)
+ else
+ texsprint(0)
+ end
+end
+
+-- numbers stored in entry.numberdata + entry.numberprefix
+
+function lists.number(name,n,spec)
+ local data = lists.result[n]
+ if data then
+ local numberdata = data.numberdata
+ if numberdata then
+ sections.typesetnumber(numberdata,"number",spec or false,numberdata or false)
+ end
+ end
+end
+
+function lists.prefixednumber(name,n,prefixspec,numberspec)
+ local data = lists.result[n]
+ if data then
+ helpers.prefix(data,prefixspec)
+ local numberdata = data.numberdata
+ if numberdata then
+--~ print(table.serialize(numberspec))
+ sections.typesetnumber(numberdata,"number",numberspec or false,numberdata or false)
+ end
+ end
+end
+
+-- todo, do this in references namespace ordered instead (this is an experiment)
+--
+-- also see lpdf-ano (maybe move this there)
+
+local splitter = lpeg.splitat(":")
+
+function jobreferences.specials.order(var,actions) -- jobreferences.specials !
+ local operation = var.operation
+ if operation then
+ local kind, name, n = lpegmatch(splitter,operation)
+ local order = lists.ordered[kind]
+ order = order and order[name]
+ local v = order[tonumber(n)]
+ local r = v and v.references.realpage
+ if r then
+ actions.realpage = r
+ var.operation = r -- brrr, but test anyway
+ return jobreferences.specials.page(var,actions)
+ end
+ end
+end
diff --git a/tex/context/base/strc-lst.mkii b/tex/context/base/strc-lst.mkii
new file mode 100644
index 000000000..527966354
--- /dev/null
+++ b/tex/context/base/strc-lst.mkii
@@ -0,0 +1,1150 @@
+%D \module
+%D [ file=strc-lst,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Lists,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Lists}
+
+\unprotect
+
+% \getlistlevel[hoofdstuk]\test{0} \test
+
+% can be made faster if needed
+
+\def\getlistlevel[#1]#2#3% [list] \variable \default
+ {\doifdefinedelse{\??ko#1\c!section}
+ {\edef#2{\getvalue{\??ko#1\c!section}}%
+ \doifdefinedelse{\??se#2\c!level}
+ {\edef#2{\getvalue{\??se#2\c!level}}}
+ {\edef#2{#3}}}
+ {\edef#2{#3}}}
+
+% Auto cross document links work by either using logical or
+% page references, depending on the general settings. The
+% locations are stored in global references where the auto tag
+% number uses the text container. We use reference mapping
+% (define reference) to keep track of the current ref.
+
+% \@@sectie == current level
+
+\def\dowritetolist#1%
+ {\doifelsevalue{\??li#1\c!state}\v!start
+ \dodowritetolist\gobblefourarguments{#1}}
+
+\long\def\dodowritetolist#1#2#3#4%
+ {\begingroup
+ \expanded{\everylistentry\emptytoks\the\everylistentry}% \emptytoks, else loop
+ \def\currentlist{#1}% evt naar dowritetolist
+ \defconvertexpanded\asciilistentry{\getvalue{\??li\currentlist\c!expansion}}{#3}%
+ \makesectionformat
+ \doifelse\@@nmstate\v!start
+ {\def\dopagenummer{\noexpand\pagenumber}}
+ {\let\dopagenummer\!!zerocount}%
+ % niet waterdicht, wat te doen met figuren en zo
+ % first hack: scheelt rommel, second hack: alleen koppen
+ \doifelsevalue{\??rf\currentlist\c!state}\v!start
+ {\doif{\@@sectionlevel\@@sectie}{0}\autocrossdocumentfalse}
+ {\autocrossdocumentfalse}%
+ % weak and inefficient
+ \ifautocrossdocument
+ \bgroup
+ \thisisnextinternal\currentlist
+ %\thisisdestination{\currentlist::\sectionformat}%
+ \expanded{\setsectieenkoppeling{\currentlist}}%
+ \edef\currentlevel{\@@sectionlevel\@@sectie}%
+ \processcommacommand[\crossdocumentreferences]\dododowritetolist
+ \egroup
+ \else
+ \thisisnextinternal\currentlist
+ \fi
+ \expanded
+ {\writeutilitycommand % todo: also an immediate option
+ {\noexpand\listentry
+ {\currentlist}%
+ {\nextinternalreference}%
+ {#2}%
+ {\asciilistentry}%
+ {\sectionformat\sectionseparator\sectionseparator\dopagenummer}%
+ {\noexpand\realfolio}}}%
+ \endgroup}
+
+\def\dododowritetolist#1%
+ {\def\docommand##1%
+ {\doifvalue{\??rf##1\c!state}\v!start
+ {\setsectieenkoppeling{##1}%
+ \def\level{\@@sectionlevel\@@sectie}%
+ \ifnum\level>\currentlevel
+ \expanded{\definereference[#1::##1][\v!none]}%
+ \else\ifnum\level=\currentlevel
+ \expanded{\definereference[#1::##1][#1::{##1::\sectionformat}]}%
+ \fi\fi}}%
+ \processcommacommand[\crossdocumentelements]\docommand}
+
+% so far
+
+\def\dowritebetweenlist#1#2%
+ {\doifvalue{\??li#1\c!state}\v!start
+ {\begingroup
+ \defconvertedargument\ascii{#2}%
+ \makesectionformat
+ \doifelse{\@@nmstate}\v!start
+ {\def\dopagenummer{\noexpand\pagenumber}}
+ {\let\dopagenummer\!!zerocount}%
+ \expanded
+ {\writeutilitycommand
+ {\noexpand\listbetween
+ {#1}%
+ {\ascii}%
+ {\sectionformat\sectionseparator\sectionseparator\dopagenummer}%
+ {\noexpand\realfolio}}}%
+ \endgroup}}
+
+% experimental (no nodes in mvl), needed for naw
+
+\def\immediatetolist[#1]#2#3#4%
+ {\begingroup
+ \defconvertexpanded\asciilistentry{\getvalue{\??li#1\c!expansion}}{#3}%
+ \makesectionformat
+ \immediatewriteutilitycommand
+ {\listentry
+ {#1}{}{#2}{\asciilistentry}%
+ {\sectionformat\sectionseparator\sectionseparator\number#4}%
+ {\realfolio}}%
+ \endgroup}
+
+\def\immediatebetweenlist[#1]#2%
+ {\begingroup
+ \defconvertedargument\asciilistentry{#2}%
+ \makesectionformat
+ \immediatewriteutilitycommand
+ {\listbetween
+ {#1}{\asciilistentry}%
+ {\sectionformat\sectionseparator\sectionseparator0}%
+ {\realfolio}}%
+ \endgroup}
+
+\def\setlistentries
+ {\def\listentry ##1{\executeifdefined{##1\c!list }\gobblefivearguments }%
+ \def\listbetween##1{\executeifdefined{##1\c!inbetween}\gobblethreearguments}}
+
+\def\resetlistentries
+ {\let\listentry \gobblesixarguments
+ \let\listbetween\gobblefourarguments}
+
+\resetlistentries
+
+\addutilityreset{listentries}
+
+% old values:
+%
+% a: \def\listfill {\hskip 1.75em}
+% b: \def\listfill {\hskip.5em\hfill}
+% c: \def\listfill {\hskip.5em\listdots\hskip.5em}
+
+% todo: interface them
+
+% \setvalue{\??li\c!alternative a}% nr - tit - pag
+% {\def\listfill {\hskip.25em\relax}%
+% \def\listskip {0pt}%
+% \def\listwidth {2em}%
+% \def\liststretch{10em}}
+
+% \setvalue{\??li\c!alternative b}% nr - tit - fill - pag
+% {\def\listfill {\hfill}%
+% \def\listskip {5em}%
+% \def\listwidth {2em}%
+% \def\liststretch{10em}}
+
+% \setvalue{\??li\c!alternative c}% nr - tit - dots - pag
+% {\def\listfill {\hskip.5em\listdots\hskip.5em\relax}%
+% \def\listskip {5em}%
+% \def\listwidth {0pt}%
+% \def\liststretch{10em}}
+
+\def\listalternativeparameter#1%
+ {\csname\??li\??li\listparameter\c!alternative#1\endcsname}
+
+\def\setuplistalternative[#1]%
+ {\dodoubleargument\getparameters[\??li\??li#1]}
+
+ % \listfill cum suis will be replaced by the direct call
+
+\def\listfill {\listalternativeparameter\c!command }
+\def\listskip {\listalternativeparameter\c!distance}
+\def\listwidth {\listalternativeparameter\c!width }
+\def\liststretch{\listalternativeparameter\c!stretch }
+
+% a : nr - tit - pag
+% b : nr - tit - fill - pag
+% c : nr - tit - dots - pag
+
+\setuplistalternative[a][\c!distance=0pt,\c!width=2em,\c!stretch=10em,\c!command=\hskip.25em\relax]
+\setuplistalternative[b][\c!distance=5em,\c!width=2em,\c!stretch=10em,\c!command=\hfill]
+\setuplistalternative[c][\c!distance=5em,\c!width=0pt,\c!stretch=10em,\c!command=\hskip.5em\listdots\hskip.5em\relax]
+
+\def\listdots{\leaders\hbox to .5em{\hss.\hss}\hfill}
+
+% \starttext
+% \placelist[section][alternative=c]
+% \setuplistalternative[c][distance=1em,stretch=0em]
+% \placelist[section][alternative=c]
+% \section{test}
+% \section{\readfile{tufte}{}{}}
+% \stoptext
+
+\setvalue{\??li\c!alternative}{\getvalue{\??li\c!alternative b}}
+
+\getvalue{\??li\c!alternative}
+
+\def\setlistparameter#1#2#3{\@EA\def\csname\??li#1#2\endcsname{#3}} % often
+\def\listparameter #1{\csname\??li\currentlist#1\endcsname}
+
+\def\dosetuplist[#1][#2]% slow -)
+ {\def\docommand##1%
+ {\getparameters[\??li##1][#2]%
+ \preparepageprefix{\??li##1}}%
+ \processcommalist[#1]\docommand}
+
+\def\setuplist
+ {\dodoubleargument\dosetuplist}
+
+\def\dodosetlist#1%
+ {\def\nolist{\splitsequence{\getvalue{\??li#1\c!limittext}}}%
+ \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
+ \letvalue{#1\c!inbetween}\gobblethreearguments
+ \letvalue{#1\c!list }\gobblefivearguments}
+
+\let\nolist\empty
+
+\def\dodefinelist[#1][#2][#3]%
+ {\presetlocalframed[\??li#1]%
+ \getparameters
+ [\??li#1]
+ [\c!height=\v!broad,
+ \c!depth=\v!broad,
+ \c!offset=0.25em,
+ \c!maxwidth=,
+ \c!align=,
+ \c!state=\v!start,
+ \c!coupling=\v!off,
+ \c!criterium=\v!local,
+ \c!width=3em,
+ \c!alternative=\c!b,
+ \c!style=\v!normal,
+ \c!textstyle=\listparameter\c!style,
+ \c!numberstyle=\listparameter\c!style,
+ \c!pagestyle=\listparameter\c!style,
+ \c!color=,
+ \c!textcolor=\listparameter\c!color,
+ \c!numbercolor=\listparameter\c!color,
+ \c!pagecolor=\listparameter\c!color,
+ \c!numbercommand=\listnumbercommand,
+ \c!textcommand=\listtextcommand,
+ \c!pagecommand=\listpagecommand,
+ \c!pagenumber=\v!yes,
+ \c!headnumber=\v!yes,
+ \c!pageboundaries=,
+ \c!margin=\!!zeropoint,
+ \c!aligntitle=,
+ \c!before=,
+ \c!after=,
+ \c!inbetween=,
+ \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,
+ \c!limittext=\@@kolimittext,
+ \c!stopper=,
+ \c!expansion=]%
+ \doifassignmentelse{#2}
+ {\getparameters[\??li#1][#2]}
+ {\ConvertToConstant\doifnot{#2}{} % not \doifsomething ivm Convert...
+ {\copyparameters % interactie ?
+ [\??li#1][\??li#2]
+ [\c!state,\c!width,\c!alternative,\c!style,\c!color,
+ \c!textstyle,\c!textcolor,\c!textcommand,
+ \c!pagestyle,\c!pagecommand,\c!pagecolor,
+ \c!numberstyle,\c!numbercolor,\c!numbercommand,
+ \c!headnumber,
+ \c!pagenumber,\c!pageboundaries,\c!margin,\c!symbol,\c!limittext,
+ \c!aligntitle,\c!before,\c!after,\c!inbetween,\v!part\c!number,\c!label]%
+ \getparameters[\??li#1][#3]}}%
+ \addutilityreset{#1}%
+ \setvalue{\s!set #1}{\dodosetlist {#1}}%
+ \setvalue{\s!reset#1}{\dodoresetlist{#1}}}
+
+\def\definelist
+ {\dotripleempty\dodefinelist}
+
+\def\iflijstgeplaatst{\ifutilitydone} % obsolete, is now a mode
+
+\def\placelist
+ {\dodoubleempty\doplacelist}
+
+\def\placerawlist
+ {\dodoubleempty\doplacerawlist}
+
+\def\dobeginoflist
+ {\begingroup
+ \startpacked[\v!blank]}
+
+\def\doendoflist
+ {\stoppacked
+ \endgroup}
+
+\def\doplacelist[#1][#2]%
+ {\dobeginoflist
+ \doplacerawlist[#1][#2]%
+ \doendoflist}
+
+\def\doplacerawlist[#1][#2]%
+ {\begingroup
+ \dogetcommalistelement1\from#1\to\firstlistelement
+ \dosetuplist[#1][#2]%
+ \doifvalue{\??li\firstlistelement\c!coupling}\v!on
+ {\startlistreferences{#1}}%
+ \dosettoclevel\??li\firstlistelement
+ \honorlocalfilterlevel
+ \doutilities{listentries,#1}\jobname{#1}\relax\par
+ \stoplistreferences
+ \dosetlistmode
+ \endgroup}
+
+% the simple approach:
+%
+% \def\dosettoclevel#1#2%
+% {\dosetfilterlevel{\getvalue{#1#2\c!criterium}}\empty}
+%
+% but we want to to support selection by number:
+%
+% \starttypen
+% \placelist[section][criterium=chapter,number=1] \blank
+% \placelist[section][criterium=chapter,number=2] \blank
+% \placelist[section][criterium=chapter,number=3] \blank
+%
+% \chapter{first} \section{AA} \section{BB}
+% \chapter{second} \section{CC} \section{DD}
+% \chapter{third} \section{EE} \section{FF}
+% \stoptypen
+
+\def\dosettoclevel#1#2% todo: check if criterium is headid, else error
+ {\ifundefined{#1#2\c!number}%
+ \dosetfilterlevel{\getvalue{#1#2\c!criterium}}\empty
+ \else
+ % \doifnot{#2}\v!local ...
+ \doifelsevaluenothing{#1#2\c!number}%
+ {\dosetfilterlevel{\getvalue{#1#2\c!criterium}}\empty}
+ {\setsectieenkoppeling{\getvalue{#1#2\c!criterium}}%
+ \dosetfilterlevel
+ {\previoussection\@@sectie}%
+ {\getvalue{#1#2\c!number}}}%
+ \fi}
+
+\def\dosetlistmode
+ {\ifutilitydone
+ \setsystemmode \v!list
+ \else
+ \resetsystemmode\v!list
+ \fi}
+
+\def\dodocompletelist[#1][#2][#3]% enkelvoud, meervoud, instellingen
+ {\expanded{\systemsuppliedtitle[#2]{\noexpand\headtext{#2}}}% expansion needed for v! vs french !
+ \doplacelist[#1][#3]}
+
+\def\docompletelist[#1][#2]%
+ {\dodocompletelist[#1][#1][#2]}
+
+\def\completelist
+ {\dodoubleempty\docompletelist}
+
+\def\listelements {} % list of page breaks
+\def\listnumbercommand #1{#1} % no strut due to interactive version
+\def\listtextcommand #1{\begstrut#1\endstrut}
+\def\listpagecommand #1{\strut#1}
+
+\def\doassigndimen#1#2#3%
+ {\doifinsetelse{#2}{\v!fit,\v!broad}{#1=#3}{#1=#2}\relax}
+
+% \let\dohandlelistnumber\firstofoneargument
+%
+% can be anything, so no \expanded{\separatednumber{#1}} !
+
+\def\dohandlelistnumber#1{\separatednumber{#1}}
+
+\def\listsymbol[#1]#2%
+ {\begingroup
+ \def\currentlist{#1}%
+ \def\currentlistnumber{#2}%
+ \currentlistsymbol
+ \endgroup}
+
+% Beware, the list symbol macro gets an argument passed, i.e. when this
+% argument is not picked up, the symbol becomes a kind of prefix.
+
+% for historical reasons we're stuck to symbols, so in order to generalize,
+% we have to hook it into the symbol handler; we need a beter clean up later
+%
+% < 2005
+%
+% \def\dosetlistsymbol % #1
+% {\executeifdefined{listsymbol@\listparameter\c!symbol}\listsymbol@default} % {#1}
+%
+% >= 2005
+%
+% at this symbol level, we have access to the raw 'number' in
+% \currentlistnumber
+
+\definesymbol[\v!list][\v!none ][\listsymbol@none ]
+\definesymbol[\v!list][\v!one ][\listsymbol@one ]
+\definesymbol[\v!list][\v!two ][\listsymbol@two ]
+\definesymbol[\v!list][\v!three ][\listsymbol@three ]
+\definesymbol[\v!list][\s!default][\listsymbol@default]
+\definesymbol[\v!list][\s!unknown][\listsymbol@unknown]
+
+\def\currentlistsymbol
+ {\doifinsymbolsetelse\v!list{\listparameter\c!symbol}
+ {\directsymbol\v!list{\listparameter\c!symbol}}
+ {\directsymbol\v!list\s!default}}
+
+\def\listsymbol@none
+ {\doassigndimen\scratchdimen{\listparameter\c!width}{1.5em}%
+ \hbox to \scratchdimen{}}
+
+\def\listsymbol@one
+ {\strut$\bullet$}
+
+\def\listsymbol@two
+ {\vrule\!!width1em\!!height1ex\!!depth\zeropoint}
+
+\def\listsymbol@three
+ {\begingroup
+ \doassigndimen{\dimen0}{\listparameter\c!width }{1.5em}%
+ \doassigndimen{\dimen2}{\listparameter\c!height}{1ex}%
+ \doassigndimen{\dimen4}{\listparameter\c!depth }\zeropoint
+ \vrule\!!width\dimen0\!!height\dimen2\!!depth\dimen4%
+ \endgroup}
+
+\def\listsymbol@default
+ {\doifelse{\listparameter\c!prefix}\v!no % ook nog eerste
+ {\edef\splitlistsymbol{\@EA\removefirstprefix\@EA{\currentlistnumber}}}% one level expansion
+ {\doifelse{\listparameter\c!prefix}\v!none
+ {\edef\splitlistsymbol{\@EA\removeallprefixes\@EA{\currentlistnumber}}}%
+ {\let\splitlistsymbol\currentlistnumber}}% geen \edef ivm 8 bit enz
+ \doif{\listparameter\c!label}\v!yes{\leftlabeltext\currentlist}%
+ \strut
+ \def\numberseparator{\listparameter\c!separator}% overloaded, todo
+ \@EA\dohandlelistnumber\@EA{\splitlistsymbol}%
+ \listparameter\c!stopper
+ \doif{\listparameter\c!label}\v!yes{\rightlabeltext\currentlist}}
+
+\def\listsymbol@unknown
+ {\listparameter\c!symbol}
+
+% so far for list symbols
+
+\def\@@dodolistelement{dodolistelement}
+
+\def\dosomelistelement#1#2#3{#1 #2 \translatednumber[#3]}
+
+\setvalue{\@@dodolistelement a}{\let\dosomelistelement\dodofixdlistelementABC}
+\setvalue{\@@dodolistelement b}{\let\dosomelistelement\dodofixdlistelementABC}
+\setvalue{\@@dodolistelement c}{\let\dosomelistelement\dodofixdlistelementABC}
+\setvalue{\@@dodolistelement d}{\let\dosomelistelement\dodofixdlistelementD}
+\setvalue{\@@dodolistelement e}{\let\dosomelistelement\dodofixdlistelementE}
+\setvalue{\@@dodolistelement f}{\let\dosomelistelement\dodofixdlistelementF}
+\setvalue{\@@dodolistelement g}{\let\dosomelistelement\dodofixdlistelementG}
+
+\setvalue{\@@dodolistelement\v!none }{\def\dosomelistelement{\dodofreevlistelement}}
+\setvalue{\@@dodolistelement\v!vertical }{\def\dosomelistelement{\dodofreevlistelement}}
+\setvalue{\@@dodolistelement\v!horizontal}{\def\dosomelistelement{\dodofreehlistelement}}
+\setvalue{\@@dodolistelement\v!command }{\let\dosomelistelement\dodocommandlistelement}
+
+% \setuplist
+% [section]
+% [alternative=MyListItem,
+% after=\blank,
+% before=\blank]
+%
+% \definelistplacement[MyListItem][none]#1#2#3%
+% {(#1) (#2) (#3)}
+
+\def\definelistplacement
+ {\dodoubleempty\dodefinelistplacement}
+
+\def\dodefinelistplacement[#1][#2]%
+ {\setvalue{\@@dodolistelement#1}%
+ {\doifelsenothing{#2}
+ {\getvalue{\@@dodolistelement\v!command}}%
+ {\executeifdefined{\@@dodolistelement#2}
+ {\getvalue{\@@dodolistelement\v!command}}}%
+ \setvalue{\??li\currentlist\c!command}{\getvalue{\@@dodolistelement::#1}}}%
+ \setvalue{\@@dodolistelement::#1}}
+
+% don't mess arround with endgraf/grouping else we loose leftskip
+
+% \strippedcsname\dodolistelement
+
+\def\newlineinlist{\space}
+
+\let\currentlist\s!unknown
+
+\def\dolistelement#1#2#3#4#5#6% pas op: wordt ook elders gedefinieerd
+ {\doiftoclevelelse[#5]{\dodolistelement{#1}{#2}{#3}{#4}{#5}{#6}}{}}
+
+\def\dodolistelement#1#2#3#4#5#6%
+ {\def\currentlist{#1}%
+ \def\currentlistnumber{#3}%
+ \getvalue{\@@dodolistelement\listparameter\c!alternative}%
+ %\showcomposition
+ \let\@@iawidth\!!zeropoint % moet boolean worden
+ \bgroup
+ \edef\listelements
+ {\listparameter\c!pageboundaries}%
+ \ExpandBothAfter\doifinset{#3}\listelements
+ {\showmessage\m!systems{14}{#3}%
+ \page}%
+ \egroup
+ \dontcomplain
+ \setfullsectionnumber{\??li\currentlist}%
+ \dosomelistelement{#1}{#2}{#3}{#4}{#5}{#6}%
+ \global\utilitydonetrue}
+
+\def\donestedlistattributes#1#2%
+ {\doifvaluesomething{\??li\currentlist#2} % color
+ {\resetinteractionparameter\c!color
+ \resetinteractionparameter\c!contrastcolor}%
+ \dolistattributes{#1}{#2}}
+
+\def\dostartlistattributes{\dostartattributes{\??li\currentlist}}
+\def\dostoplistattributes {\dostopattributes}
+\def\dolistattributes {\doattributes{\??li\currentlist}}
+
+\def\dodocommandlistelement#1#2#3#4#5#6%
+ {\doifdefinedelse{\??li#1\c!command}
+ {\listparameter\c!command
+ {#3}{#4}{\pageprefix\??li\currentlist[#5]\translatednumber[#5]}}
+ {[\currentlist: #3 - #4 - \pageprefix\??li\currentlist[#5]\translatednumber[#5]]}}
+
+\def\dodofreelistelement#1#2#3#4#5#6#7#8%
+ {\def\makelistelement##1##2%
+ {\noindent % new and needed
+ \hbox
+ {\doifelse{\listparameter\c!interaction}{##1} % \??li ipv \??ia
+ {\setbox0\hbox{\showcontrastlocation{\??li\currentlist}{#6}{##2}}%
+ \linklisttoelement{#2}{#5}{#6}{\box0}}%{\copy0}}%
+ {##2}}}%
+ \listparameter\c!before% can be \hskip
+ \doifdefinedelse{\??li#1\c!command}
+ {\makelistelement{\listparameter\c!interaction}% this forces all
+ {\listparameter\c!command
+ {#3}% geen conversies etc
+ {#4}% geen conversies etc
+ {\pageprefix\??li\currentlist[#5]%
+ \translatednumber[#5]}}}
+ {#7%
+ \vbox
+ {\forgetall
+ \makelistelement\v!all
+ {%
+\doif{\listparameter\c!headnumber}\v!yes
+ {\makelistelement\v!sectionnumber
+ {\donestedlistattributes\c!numberstyle\c!numbercolor
+ {\listparameter\c!numbercommand{\currentlistsymbol}}}%
+}%
+ \makelistelement\v!text
+ {\donestedlistattributes\c!textstyle\c!textcolor
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ \listparameter\c!textcommand{#4}}}%
+ \doif{\listparameter\c!pagenumber}\v!yes
+ {\doifsomething{#5}
+ {\makelistelement\v!pagenumber
+ {\donestedlistattributes\c!pagestyle\c!pagecolor
+ {\listparameter\c!pagecommand
+ {\pageprefix\??li\currentlist[#5]%
+ \translatednumber[#5]}}}}}}}%
+ #8}%
+ \listparameter\c!after}
+
+\def\dodofreehlistelement#1#2#3#4#5#6%
+ {\dodofreelistelement{#1}{#2}{#3}{#4}{#5}{#6}
+ {\noindent}{}}
+
+\def\dodofreevlistelement#1#2#3#4#5#6% % \nointerlineskip needed,
+ {\dodofreelistelement{#1}{#2}{#3}{#4}{#5}{#6} % otherwise wrong spacing
+ {\ifvmode\nointerlineskip\fi} % at multi-line lists
+ {\ifvmode\nointerlineskip\fi\endgraf\allowbreak}} % test is saveguard
+
+% to be documented: align, hang
+
+% now also in abc
+
+\def\limitatedlistentry#1%
+ {\doifelsenothing{\listparameter\c!maxwidth}
+ {\listparameter\c!textcommand{#1}}
+ {\listparameter\c!textcommand
+ {\limitatetext
+ {#1}%
+ {\listparameter\c!maxwidth}%
+ {\splitsymbol{\listparameter\c!limittext}}}}}
+
+\def\dodofixdlistelementABC#1#2#3#4#5#6% weeden
+ {\endgraf
+ \leftskip\listparameter\c!margin% na de \endgraf !
+ \listparameter\c!before
+ \!!widthc\listparameter\c!distance
+ \doifelse{\listparameter\c!width}\v!fit
+ {\!!widtha\zeropoint}
+ {\doifelsenothing{#3}
+ {\doifelse{\listparameter\c!aligntitle}\v!yes
+ {\!!widtha\zeropoint
+ \!!widthc\zeropoint}
+ {\!!widtha\listparameter\c!width}}
+ {\!!widtha\listparameter\c!width}}%
+ \getvalue{\??li\c!alternative\listparameter\c!alternative}%
+ \endgraf
+ \def\makelistelement##1##2%
+ {\doifelse{\listparameter\c!interaction}{##1}
+ {\setbox0\hbox{\showcontrastlocation\??ia{#6}{##2}}%
+ \linklisttoelement{#2}{#5}{#6}{\box0}}%{\copy0}}%
+ {\hbox{##2}}}%
+ \doif{\listparameter\c!interaction}\v!text % not supported ! ! ! ! ! ! text == all
+ {\setlistparameter\currentlist\c!interaction\v!all}%
+ % \dontleavehmode % new, else no margin, but wrong, better (else \indent as well):
+ \noindent
+ \makelistelement\v!all
+ {\setlocalhsize
+ \hsize\localhsize
+ \hbox to \hsize
+ {\forgetall
+ \dostartlistattributes\c!style\c!color\empty
+ \!!widthb\hsize
+ \doifelse{\listparameter\c!headnumber}\v!yes
+ {\setbox2\hbox \ifdim\!!widtha>\zeropoint to \!!widtha \fi
+ {\makelistelement\v!sectionnumber
+ {\donestedlistattributes\c!numberstyle\c!numbercolor
+ {\listparameter\c!numbercommand{\currentlistsymbol}}%
+ \hfill}}}
+ {\!!widtha\zeropoint
+ \!!widthc\zeropoint
+ \setbox2\hbox{}}%
+ \setbox4\hbox
+ {\doif{\listparameter\c!pagenumber}\v!yes
+ {\doifsomething{#5} % \listwidth is new ; temp hack
+ {\hbox \ifdim\listwidth>\zeropoint to \listwidth\fi
+ {\hfill
+ \makelistelement\v!pagenumber
+ {\donestedlistattributes\c!pagestyle\c!pagecolor
+ {\listparameter\c!pagecommand
+ {\pageprefix\??li\currentlist[#5]%
+ \translatednumber[#5]}}}}}}}%
+ \vbox
+ {\hsize\!!widthb
+ \setupalign[\listparameter\c!align]%
+ \ifdim\!!widtha<\hsize
+ \hangindent\wd2
+ \dimen2=\!!widthc % \listparameter\c!distance
+ \advance\hangindent \dimen2
+ \hangafter\plusone
+ \doif{\listparameter\c!hang}\v!no{\hangafter\zerocount}%
+ \ifdim\wd4=\zeropoint % \ifvoid4
+ % we kunnen gewoon afbreken aan het eind
+ \else
+ \ifdim\listskip>\zeropoint\relax
+ \rightskip\listskip\!!plus\liststretch\relax
+ \parfillskip-\rightskip
+ \fi
+ \fi
+ \else
+ \dimen2\zeropoint
+ \fi
+ \parindent\zeropoint\relax
+ \leavevmode
+ \box2\relax
+ \hskip\dimen2
+ \bgroup
+ \donestedlistattributes\c!textstyle\c!textcolor
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ %\listparameter\c!textcommand{#4}}%
+ \limitatedlistentry{#4}}%
+ %\carryoverpar % new otherwise wrong linespacing
+ \egroup
+ \ifdim\wd4=\zeropoint\relax % \ifvoid4
+ % \ifdim\!!widtha<\hsize \hfill\strut \fi % spoils align
+ \else
+ \nobreak\listfill
+ \box4\relax
+ \relax
+ \fi}%
+ \hss
+ \dostoplistattributes}}% new
+ \endgraf % new, else problems with nointerlinespace and prevdepth
+ \nointerlineskip % anders verkeerde spatiering bij multi-line
+ \endgraf
+ \allowbreak
+ \listparameter\c!after}
+
+% % example from the context list
+%
+% \setuphead [part] [page=right,placehead=yes]
+% \setuplist [chapter] [alternative=d,before=\blank,after=\blank]
+% \setuplist [part] [before=\blank,after=\blank]
+%
+% \starttext
+% \startnarrower[2*right] \placecontent \stopnarrower
+% \blank[4*big]
+% \startsetups chapter
+% \blank \startnarrower[3*middle] \placecontent[criterium=local] \stopnarrower
+% \stopsetups
+% \placelist[part][criterium=text,after=\setups{chapter}]
+%
+% \part{First part} \chapter{Chapter one} \chapter{Chapter two}
+% \chapter{Chapter three} \chapter{Chapter four} \chapter{Chapter five}
+% \part{Second part} \chapter{Chapter one} \chapter{Chapter two}
+% \chapter{Chapter three} \chapter{Chapter four} \chapter{Chapter five}
+% \part{Third part} \chapter{Chapter one} \chapter{Chapter two}
+% \chapter{Chapter three} \chapter{Chapter four} \chapter{Chapter five}
+% \stoptext
+
+% overrulen interactie kan sneller, bv door hulpconstanten
+% te gebruiken en die te letten
+
+\def\dodofixdlistelementD#1#2#3#4#5#6%
+ {%\leftskip=\listparameter\c!margin
+ \ifvmode
+ \advance\leftskip\listparameter\c!margin% AANGEPAST
+ \fi
+ \bgroup
+ \ifvmode
+ \noindent\leavevmode % leavevmode ? ? ?
+ \fi
+ \doif{\listparameter\c!interaction}\v!text % not supported
+ {\setlistparameter\currentlist\c!interaction\v!sectionnumber}%
+ \doif{\listparameter\c!interaction}\v!all % not supported
+ {\setlistparameter\currentlist\c!interaction\v!sectionnumber}%
+ \def\makelistelement##1##2%
+ {\doifelse{\listparameter\c!interaction}{##1}
+ {\setbox0\hbox{\showcontrastlocation\??ia{#6}{##2}}%
+ \linklisttoelement{#2}{#5}{#6}{\box0}}%{\copy0}}%
+ {\hbox{##2}}}%
+ \setbox4\hbox
+ {\doif{\listparameter\c!pagenumber}\v!yes
+ {\doifsomething{#5}
+ {\makelistelement\v!pagenumber
+ {\donestedlistattributes\c!pagestyle\c!pagecolor
+ {\listparameter\c!pagecommand
+ {\pageprefix\??li\currentlist[#5]%
+ \translatednumber[#5]}}}}}}%
+\doif{\listparameter\c!headnumber}\v!yes{%
+ \donetrue
+ \doifnothing{#3}{\doifnothing{\listparameter\c!symbol}\donefalse}%
+ % == \doifnothing{#3\listparameter\c!symbol}\donefalse
+ \ifdone
+ \hbox
+ {\listparameter\c!left
+ \makelistelement\v!sectionnumber
+ {\donestedlistattributes\c!numberstyle\c!numbercolor
+ {\listparameter\c!numbercommand{\currentlistsymbol}}}%
+ \listparameter\c!right
+ \hskip.5em}%
+ \nobreak
+ \fi
+}%
+ \tolerance3500 % niet zomaar veranderen
+ \donestedlistattributes\c!textstyle\c!textcolor
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ %\listparameter\c!textcommand{#4}}%
+ \limitatedlistentry{#4}}%
+ \ifvoid4\else
+ \nobreak
+ \hskip.75em\relax
+ \nobreak
+ \box4
+ \fi
+ \dimen0=\listparameter\c!distance\relax
+ \ifdim\dimen0<1em\relax
+ \hskip1em\!!plus1em\!!minus.25em\relax
+ \else
+ \hskip\dimen0\!!plus.5\dimen0\!!minus.25\dimen0\relax
+ \fi
+ \egroup}
+
+\def\dodofixdlistelementE#1%
+ {\dodofixdlistelementEFG
+ {\setupinteraction[\c!strut=\v!no]}
+ {\localframed[\??li\currentlist][\c!depth=\!!zeropoint,\c!color=]}
+ {}}
+
+\def\dodofixdlistelementF#1%
+ {\dodofixdlistelementEFG
+ {}
+ {\dosetraggedhbox{\listparameter\c!align}\raggedbox}
+ {}}
+
+\def\dodofixdlistelementG#1%
+ {\dodofixdlistelementEFG
+ {}
+ \midaligned
+ {}}
+
+\def\dodofixdlistelementEFG#1#2#3#4#5#6#7#8%
+ {\noindent
+ \bgroup
+ \def\makelistelement##1##2% isolated by Wolfgang Schuster
+ {\doifelse{\listparameter\c!interaction}{##1}
+ {#2{##2}}
+ {\setbox0\hbox{#2{\showcontrastlocation\??ia{#8}{##2}}}%
+ \linklisttoelement{#4}{#7}{#8}{\box0}}}%
+ \makelistelement\v!no
+ {\let\\=\newlineinlist
+ #1% in case E nils the strut (still needed?)
+ \dostartlistattributes\c!style\c!color\empty
+ \ignorespaces\dontconvertfont\setstrut
+ \begstrut
+ \limitatedlistentry{#6}%
+ \endstrut
+ \dostoplistattributes}%
+ \egroup
+ \par
+ \listparameter\c!inbetween}
+
+% better:
+%
+% \def\linklisttoelement#1#2#3#4% % list location format page data
+% {\ifautocrossdocument
+% \gotodestination{}{}{\currentlist::\@@filterblocknumberpart[#2]}{#3}{#4}%
+% \else
+% \gotonextinternal\currentlist{#1}{#3}{#4}%
+% \fi}
+%
+% but for the moment:
+
+\def\linklisttoelement#1#2#3#4% % list location format page data
+ {\gotonextinternal\currentlist{#1}{#3}{#4}}
+
+\def\writetolist[#1]#2#3%
+ {\doifsomething{#1}
+ {\defconvertedargument\firstlistelement{#2}%
+ \@EA\dowritetolist\@EA{#1}{\firstlistelement}{#3}{\v!head}}}
+
+\def\dobetweenlist#1#2#3#4% pas op: wordt ook elders gedefinieerd
+ {\doiftoclevelelse[#3]{#2}{}}
+
+\def\writebetweenlist[#1]#2%
+ {\@EA\dowritebetweenlist\@EA{#1}{#2}} % #2 weg en \expanded
+
+% NOG ENGELS MAKEN
+
+\def\listlength{\utilitylistlength}
+\def\listwidth {\utilitylistwidth}
+\def\listheight{\utilitylistheight}
+
+\def\utilitylistlength {0}
+\def\utilitylistwidth {0pt}
+\def\utilitylistheight {0pt}
+
+\def\dolistelementX#1#2#3#4#5#6%
+ {\doiftoclevelelse[#5]
+ {\doglobal\increment\utilitylistlength
+ \hbox
+ {\dolistattributes\c!textstyle\c!textcolor
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ \listparameter\c!textcommand{#4}}}%
+ \global\utilitydonetrue}
+ {}}
+
+\def\dodeterminelistcharacteristics[#1][#2]%
+ {\begingroup
+ \doglobal\newcounter\utilitylistlength
+ \let\dolistelement\dolistelementX
+ \dosetuplist[#1][#2]%
+ \dogetcommalistelement1\from#1\to\commalistelement
+ \dosettoclevel\??li\commalistelement
+ \setbox0\vbox{\doutilities{listentries,#1}\jobname{#1}\relax\par}%
+ \xdef\utilitylistheight{\the\ht0}%
+ \xdef\utilitylistwidth {\the\wd0}%
+ \endgroup
+ \dosetlistmode}
+
+\def\determinelistcharacteristics
+ {\dodoubleempty\dodeterminelistcharacteristics}
+
+% \definerreferencelist
+% [externalfigure]
+% [command=\showbigfigure,
+% before=\page,
+% after=\page]
+%
+% \definereferencelist
+% [externaltable]
+% [command=\showbigtable,
+% before=\page,
+% after=\page]
+%
+% \def\showbigfigure#1%
+% {\externalfigure[#1][frame=on,factor=max]}
+%
+% \def\showbigtable#1%
+% {\switchtobodyfont[12pt]\getbuffer[#1]}
+%
+% \writetoreferencelist[externalfigure]{koe} {\externalfigure[koe] [width=3cm,frame=on]}
+% \writetoreferencelist[externalfigure]{paard}{\externalfigure[paard][width=3cm,frame=on]}
+%
+% \startbuffer[kanweg]
+% \starttable[|||]
+% \HL
+% \VL test \VL test \VL\SR
+% \HL
+% \VL test \VL test \VL\FR
+% \VL test \VL test \VL\MR
+% \VL test \VL test \VL\LR
+% \HL
+% \stoptable
+% \stopbuffer
+%
+% \writetoreferencelist[externaltable]{kanweg}{\switchtbodyfont[5pt]\getbuffer[kanweg]}
+%
+% \placereferencelist[externalfigure,externaltable]
+
+% algemeen
+
+\def\referencebutton#1[#2]%
+ {\hbox\bgroup % the \hbox is needed to bypass
+ \let\referenceprefix\empty % \dontleavehmode in \gotobox
+ \setupinteraction[\c!color=,\c!contrastcolor=,\c!strut=]%
+ \setupreferencing[\c!prefix=]%
+ \gotobox{\hbox{\ignorespaces#1}}[#2]%
+ \egroup}
+
+\newcounter\referencecounter
+
+\def\doreferencelistelement#1#2#3#4#5%
+ {\doiftoclevelelse[#4]
+ {\getvalue{\??rl#1\c!before}%
+ \referencebutton
+ {\getvalue{\??rl#1\c!command}{#3}\pagereference[\r!to#2]}%
+ [\r!from#2]%
+ \global\utilitydonetrue
+ \getvalue{\??rl#1\c!after}}
+ {}}
+
+\def\doplacereferencelist[#1][#2]%
+ {\begingroup
+ \setupreferencelist[#1][#2,\c!state=\v!stop]%
+ \dogetcommalistelement1\from#1\to\commalistelement
+ \dosettoclevel\??rl\commalistelement
+ \doutilities{listentries,#1}\jobname{#1}\relax\par
+ \endgroup}
+
+\def\placereferencelist
+ {\dodoubleempty\doplacereferencelist}
+
+\def\dowritetoreferencelist#1#2#3%
+ {\doifvalue{\??rl#1\c!state}\v!start
+ {\begingroup
+ \makesectionformat
+ \doifelse{\@@nmstate}\v!start
+ {\def\dopagenummer{\noexpand\pagenumber}}
+ {\let\dopagenummer\!!zerocount}%
+ \expanded
+ {\writeutilitycommand%
+ {\noexpand\referencelistentry%
+ {#1}% tag
+ {#2}% number
+ {#3}% data
+ {\sectionformat\sectionseparator\sectionseparator\dopagenummer}%
+ {\noexpand\realfolio}}}%
+ \endgroup}}
+
+\def\writetoreferencelist[#1]#2% #1=class #2=data #3=visualization
+ {\dowithnextbox
+ {\doifelsevalue{\??rl#1\c!state}\v!start
+ {\doglobal\increment\referencecounter % must be resolved due to #2
+ \referencebutton
+ {\flushnextbox
+ \pagereference[\r!from\referencecounter]%
+ \dowritetoreferencelist{#1}{\referencecounter}{#2}}%
+ [\r!to\referencecounter]}
+ {\flushnextbox}}
+ \hbox} % \vbox ?
+
+\def\referencelistentry#1%
+ {\executeifdefined{#1\c!list}\gobblefourarguments}
+
+\def\dodosetreferencelist#1%
+ {\setvalue{#1\c!list}{\doreferencelistelement{#1}}}
+
+\def\dodoresetreferencelist#1%
+ {\setvalue{#1\c!list}{\gobblefourarguments}}
+
+\def\dodefinereferencelist[#1][#2]%
+ {\setupreferencelist[#1]
+ [\c!command=,
+ \c!state=\v!start,
+ \c!criterium=\v!all,
+ \c!before=,
+ \c!after=,
+ #2]%
+ \resetcounter{#1}%
+ \addutilityreset{#1}%
+ \setvalue{\s!set #1}{\dodosetreferencelist {#1}}%
+ \setvalue{\s!reset#1}{\dodoresetreferencelist{#1}}}
+
+\def\definereferencelist
+ {\dodoubleempty\dodefinereferencelist}
+
+\def\dosetupreferencelist[#1][#2]%
+ {\getparameters[\??rl#1][#2]}
+
+\def\setupreferencelist
+ {\dodoubleempty\dosetupreferencelist}
+
+\def\dosetupcombinedlist[#1][#2]%
+ {\getparameters[\??ih#1][#2]%
+ \expanded{\setuplist[\getvalue{\??ih#1\c!list}]}[#2]}
+
+\def\setupcombinedlist
+ {\dodoubleargument\dosetupcombinedlist}
+
+\def\doplacecombinedlist[#1][#2]%
+ {\begingroup
+ \getparameters[\??ih#1][#2]%
+ \dosettoclevel\??ih{#1}%
+ \edef\combinedlist{\getvalue{\??ih#1\c!list}}%
+ \doifelsevalue{\??ih#1\c!level}\v!current %
+ {\!!counta=0\@@kolevel} % hm: \@@kolevel
+ {\fullexpandoneargafter\doifnumberelse{\getvalue{\??ih#1\c!level}}% in verband
+ {\!!counta\getvalue{\??ih#1\c!level}% met de vorige implementatie
+ \advance\!!counta \plusone % accepteren we ook nummers (0==deel)
+ \getfromcommacommand[\combinedlist][\!!counta]%
+ \edef\maximumlist{\commalistelement}}%
+ {\edef\maximumlist{\getvalue{\??ih#1\c!level}}}%
+ \doifdefinedelse{\??ko\maximumlist\c!section}
+ {\!!counta\getvalue{\??se\getvalue{\??ko\maximumlist\c!section}\c!level}}%
+ {\!!counta\zerocount}}
+ \let\!!stringa\combinedlist
+ \let\combinedlist\empty
+ \def\docommand##1%
+ {\doifdefinedelse{\??ko##1\c!section}
+ {\ifnum\getvalue{\??se\getvalue{\??ko##1\c!section}\c!level}>\!!counta\else
+ \addtocommalist{##1}\combinedlist
+ \fi}%
+ {\addtocommalist{##1}\combinedlist}}%
+ \processcommacommand[\!!stringa]\docommand
+ \doifvalue{\??ih#1\c!coupling}\v!on
+ {\startlistreferences{#1}}%
+ \ExpandFirstAfter\dodoplacecombinedlist[\combinedlist][#2]%
+ \stoplistreferences
+ \endgroup
+ \dosetlistmode}
+
+\def\dodoplacecombinedlist[#1][#2]%
+ {\dobeginoflist
+ \dosetuplist[#1][#2]%
+ \doutilities{listentries,#1}\jobname{#1}\relax\par
+ \doendoflist}
+
+\def\docompletecombinedlist[#1][#2]%
+ {\expanded{\systemsuppliedtitle[#1]{\noexpand\headtext{#1}}}% expansion due to v! vs french !
+ \doplacecombinedlist[#1][#2]}
+
+\def\dodefinecombinedlist[#1][#2][#3]%
+ {\makerawcommalist[#2]\combinedlist % for fast processing
+ \letvalue{\??ih#1\c!list}\combinedlist
+ \getcommalistsize[#2]%
+ \getfromcommalist[#2][\commalistsize]%
+ \doeassign[\??ih#1][\c!level=\commalistelement]%
+ \getparameters
+ [\??ih#1]
+ [\c!criterium=\v!local,#3]%
+ \setvalue{\e!setup#1\e!endsetup}%
+ {\dodoubleempty\dosetupcombinedlist[#1]}%
+ \setvalue{\e!place#1}%
+ {\dodoubleempty\doplacecombinedlist[#1]}%
+ \setvalue{\e!complete#1}%
+ {\dodoubleempty\docompletecombinedlist[#1]}}
+
+\def\definecombinedlist
+ {\dotripleempty\dodefinecombinedlist}
+
+\def\placecombinedlist
+ {\dodoubleempty\doplacecombinedlist}
+
+% new and yet undocumented (used in cocoa qa)
+%
+% \setupremaininglistlength
+% [left=\hss nog~,right=~ingangen]
+%
+% \resetremaininglistlength
+% [section][settings]
+%
+% \placelist
+% [section]
+% [before=\showremaininglistlength]
+%
+% \dorecurse{100}{\section{hans}}
+
+\definesystemvariable {ll} % ListLength
+
+\def\setupremaininglistlength[#1]%
+ {\getparameters[\??ll][#1]%
+ \globallet\listlengthcounter\!!zerocount}
+
+\setupremaininglistlength
+ [\c!left=\hss,\c!right=,\c!number=\v!yes,
+ \c!before=\blank,\c!after=\page,
+ \c!style=\v!smallnormal,\c!color=]
+
+\def\resetremaininglistlength
+ {\dodoubleempty\doresetremaininglistlength}
+
+\def\doresetremaininglistlength[#1][#2]%
+ {\determinelistcharacteristics[#1][#2]% \determinelistcharacteristics[#1][#2]%
+ \xdef\listlengthcounter{\number\utilitylistlength}}
+
+\def\showremaininglistlength
+ {\bgroup
+ \ifnum\listlengthcounter>\plusone
+ \setbox\scratchbox\vbox
+ {\@@llbefore\par\horizontalstrut\par\horizontalstrut\par\@@llafter}%
+ \scratchdimen\pagetotal
+ \advance\scratchdimen \ht\scratchbox
+ \advance\scratchdimen \dp\scratchbox
+ \ifdim\scratchdimen>\pagegoal
+ \@@llbefore
+ \nobreak\hbox to \hsize
+ {\doifnot\@@llnumber\v!yes{\let\listlengthcounter\empty}%
+ \doattributes\??ll\c!style\c!color{\@@llleft\listlengthcounter\@@llright}}
+ \@@llafter
+ \fi
+ \fi
+ \doglobal\decrement\listlengthcounter\relax
+ \egroup}
+
+\setupreferencelist
+ [\c!style=\v!normal]
+
+\protect \endinput
diff --git a/tex/context/base/strc-lst.mkiv b/tex/context/base/strc-lst.mkiv
new file mode 100644
index 000000000..413052882
--- /dev/null
+++ b/tex/context/base/strc-lst.mkiv
@@ -0,0 +1,963 @@
+%D \module
+%D [ file=strc-lst,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Lists,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Lists}
+
+\registerctxluafile{strc-lst}{1.001}
+
+\unprotect
+
+\def\currentstructurelistnumber{0}
+
+% nmstate -> no pagenumber if not start
+% autocrossdocument -> todo
+% expansion -> todo
+% auto refs to lists (chain) -> todo (\dododowritetolist)
+% todo: \normalexpanded{\noexpand\everylistentry\emptytoks\the\everylistentry}% \emptytoks, else loop
+
+% interface to lua
+
+% we have to deal with compatible processing, i.e. list elements that have two
+% elements plus a pagenumber
+
+\let\listentry\gobblesixarguments
+
+\def\currentlist {\s!unknown}
+\def\currentlistmethod{entry}
+\def\currentlistindex {0}
+
+\def\setlistparameter#1#2#3{\@EA\def\csname\??li#1#2\endcsname{#3}} % often
+%def\listparameter #1{\ifcsname\??li\currentlist#1\endcsname\csname\??li\currentlist#1\endcsname\fi}
+
+% interface
+
+\def\listparameter #1{\csname\dolistparameter{\??li\currentlist}#1\endcsname}
+\def\namedlistparameter#1#2{\csname\dolistparameter{\??li #1}#2\endcsname}
+\def\listparameterhash #1{\dolistparameterhash {\??li\currentlist}#1}
+
+\def\dolistparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dolistparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dolistparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dolistparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dolistparentparameter #1#2{\ifx#1\relax\s!empty\else\dolistparameter #1#2\fi}
+\def\dolistparentparameterhash#1#2{\ifx#1\relax \else\dolistparameterhash#1#2\fi}
+
+\def\dosetlistattributes#1#2% style color
+ {\edef\fontattributehash {\listparameterhash#1}%
+ \edef\colorattributehash{\listparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\def\donestedlistattributes#1#2%
+ {\dosetlistattributes#1#2%
+ \ifx\colorattributehash\empty \else
+ \resetinteractionparameter\c!color
+ \resetinteractionparameter\c!contrastcolor
+ \fi}
+
+% handling
+
+% The next code injects data into the list at the current level.
+
+\def\structurelistinject{\dotripleempty\dostructurelistinject}
+
+\def\dostructurelistinject[#1][#2][#3]%
+ {\begingroup
+ \edef\currentlistname{#1}%
+ \setnextinternalreference
+ \edef\currentlistnumber{\ctxlua{structure.lists.push{
+ references = {
+ internal = \nextinternalreference,
+ section = structure.sections.currentid(),
+ },
+ metadata = {
+ kind = "#2",
+ name = "\currentlistname",
+ level = structure.sections.currentlevel(),
+ catcodes = \the\catcodetable,
+ },
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ }}}%
+ \expanded{\ctxlatelua{structure.lists.enhance(\currentlistnumber)}}%
+ \endgroup}
+
+\def\structurelistlocation
+ {\ctxlua{structure.lists.location(\currentlistindex)}}
+
+\def\structurelistpagenumber
+ {\ctxlua{structure.lists.prefixedpage(
+ "\currentlist",
+ \currentlistindex,
+ {
+ separatorset = "\listparameter\c!pageprefixseparatorset",
+ conversionset = "\listparameter\c!pageprefixconversionset",
+ set = "\listparameter\c!pageprefixset",
+ segments = "\listparameter\c!pageprefixsegments",
+ connector = \!!bs\listparameter\c!pageprefixconnector\!!es,
+ },
+ {
+ prefix = "\listparameter\c!pageprefix",
+ conversionset = "\listparameter\c!pageconversionset",
+ starter = \!!bs\listparameter\c!pagestarter\!!es,
+ stopper = \!!bs\listparameter\c!pagestopper\!!es,
+ }
+ )}}
+
+\def\structurelistrealpagenumber
+ {\ctxlua{structure.lists.realpage("\currentlist",\currentlistindex)}}
+
+\def\structurelistfirst
+ {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"first")}}
+
+\def\structurelistsecond
+ {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"second")}}
+
+\def\structurelistuservariable#1%
+ {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"#1")}}
+
+% \appendtoks
+% \to \everystructurelist
+
+\unexpanded\def\placestructurelist#1#2#3% hm ... [][][]
+ {\ctxlua{structure.lists.process("#1","#2","#3")}}
+
+\def\analysestructurelist#1#2#3%
+ {\ctxlua{structure.lists.analyze("#1","#2","#3")}}
+
+\def\firststructureelementinlist#1%
+ {\ctxlua{commands.first_in_list("#1")}}
+
+\def\structurelistsize
+ {\ctxlua{structure.lists.size()}}
+
+\def\@@structurelistprocess{structurelist:process:}
+
+\def\installstructurelistprocessor#1#2%
+ {\expandafter\def\csname\@@structurelistprocess#1\endcsname{#2}}
+
+\def\usestructurelistprocessor#1%
+ {\csname\@@structurelistprocess#1\endcsname}
+
+\installstructurelistprocessor\s!default
+ {no list method}
+
+% push pop test:
+%
+% \starttext
+% \placelist[chapter] [after={\placelist[section][criterium=local]}]
+% \chapter{One} \section{Alpha} \section{Beta}
+% \chapter{Two} \section{First} \section{Second}
+% \stoptext
+
+\def\processlistofstructure#1#2#3% name, method, n
+ {\ctxlua{structure.lists.pushnesting(#3)}%
+ \edef\currentlist {#1}%
+ \edef\currentlistmethod{#2}%
+ \edef\currentlistindex {#3}%
+ \csname\@@structurelistprocess
+ \ifcsname\@@structurelistprocess\currentlist:\currentlistmethod\endcsname\currentlist:\currentlistmethod\else
+ \ifcsname\@@structurelistprocess\currentlistmethod \endcsname\currentlistmethod \else
+ \ifcsname\@@structurelistprocess\currentlist \endcsname\currentlist \else
+ \s!default \fi\fi\fi
+ \endcsname
+ \ctxlua{structure.lists.popnesting()}}
+
+% \installstructcurelistprocessor{pubs:userdata}
+% {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"bibref")}}
+
+\installstructurelistprocessor{command}
+ {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"command")}}
+
+\installstructurelistprocessor{section}
+ {\dodolistelement
+ \currentlist
+ \structurelistlocation
+ \structurelistgenericnumber
+ \structurelistgenerictitle % hm, can end up in message (volkers test)
+ \structurelistpagenumber
+ \structurelistrealpagenumber}
+
+% so far (todo: also recursive)
+
+\def\listalternativeparameter#1%
+ {\ifcsname\??li\??li\listparameter\c!alternative#1\endcsname
+ \csname\??li\??li\listparameter\c!alternative#1\endcsname
+ \else
+ \listparameter{#1}%
+ \fi}
+
+\unexpanded\def\setuplistalternative[#1]%
+ {\dodoubleargument\getparameters[\??li\??li#1]}
+
+\def\listfill {\listalternativeparameter\c!command }
+\def\listskip {\listalternativeparameter\c!distance}
+\def\listwidth {\listalternativeparameter\c!width }
+\def\liststretch{\listalternativeparameter\c!stretch }
+
+% a : nr - tit - pag
+% b : nr - tit - fill - pag
+% c : nr - tit - dots - pag
+
+\setuplistalternative[a][\c!distance=0pt,\c!width=2em,\c!stretch=10em,\c!command=\hskip.25em\relax]
+\setuplistalternative[b][\c!distance=5em,\c!width=2em,\c!stretch=10em,\c!command=\hfill]
+\setuplistalternative[c][\c!distance=5em,\c!width=0pt,\c!stretch=10em,\c!command=\hskip.5em\listdots\hskip.5em\relax]
+
+\def\listdots{\leaders\hbox to .5em{\hss.\hss}\hfill}
+
+% \setvalue{\??li\c!alternative}{\getvalue{\??li\c!alternative b}} % ?
+% \getvalue{\??li\c!alternative} % ?
+
+\def\checklistexistence#1%
+ {\ifcsname\??li#1\s!parent\endcsname \else
+ \letvalue{\??li#1\s!parent}\??li
+ \fi}
+
+\def\dosetuplist[#1][#2]% slow -)
+ {\checklistexistence{#1}%
+ \def\docommand##1{\getparameters[\??li##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\unexpanded\def\setuplist
+ {\dodoubleargument\dosetuplist}
+
+\def\dodefinelist[#1][#2][#3]%
+ {\presetlocalframed[\??li#1]% still inefficient (will change when we redu core-rul)
+ \doifassignmentelse{#2}
+ {\getparameters[\??li#1][\s!parent=\??li,#2]}
+ {\doifelsenothing{#2}
+ {\getparameters[\??li#1][\s!parent=\??li]}
+ {\getparameters[\??li#1][\s!parent=\??li#2,#3]}}}
+
+\unexpanded\def\setuplists % new, but not for users (hardly handy)
+ {\dodoubleargument\getparameters[\??li]}
+
+\setuplists
+ [\c!height=\v!broad,
+ \c!depth=\v!broad,
+ \c!offset=0.25em,
+ \c!maxwidth=,
+ \c!state=\v!start,
+ \c!coupling=\v!off,
+ \c!criterium=\v!local,
+ \c!number=0,
+ \c!width=3em,
+ \c!alternative=\c!b,
+ \c!style=\v!normal,
+ \c!textstyle=\listparameter\c!style,
+ \c!numberstyle=\listparameter\c!style,
+ \c!pagestyle=\listparameter\c!style,
+ %\c!color=,
+ \c!textcolor=\listparameter\c!color,
+ \c!numbercolor=\listparameter\c!color,
+ \c!pagecolor=\listparameter\c!color,
+ \c!numbercommand=\listnumbercommand,
+ \c!textcommand=\listtextcommand,
+ \c!pagecommand=\listpagecommand,
+ \c!pagenumber=\v!yes,
+ \c!headnumber=\v!yes,
+ \c!pageboundaries=,
+ \c!margin=\!!zeropoint,
+ \c!aligntitle=,
+ \c!before=,
+ \c!after=,
+ \c!inbetween=,
+ \c!symbol=,
+ \c!interaction=\v!sectionnumber,
+ \c!label=\v!no,
+ \c!distance=\!!zeropoint,
+ \c!limittext=\@@kolimittext,
+ %\c!sectionseparatorset=,
+ %\c!sectionconversionset=,
+ %\c!sectionstarter=,
+ %\c!sectionstopper=,
+ %\c!sectionset=,
+ %\c!sectionsegments=,
+ %\c!prefix=\v!no,
+ %\c!prefixseparatorset=,
+ %\c!prefixconversionset=,
+ %\c!prefixstarter=.,
+ %\c!prefixstopper=.,
+ %\c!prefixset=,
+ %\c!prefixsegments=,
+ %\c!pageseparatorset=,
+ %\c!pageconversionset=,
+ %\c!pagestarter=,
+ %\c!pagestopper=,
+ %\c!expansion=,
+ % \c!prefixconnector=., % maybe inherit from setupheads
+ % \c!pageprefix=\v!no, % is unset, inherits
+ % \c!pageprefixconnector=\listparameter\c!prefixconnector,
+ ]%\c!pagesegments=2:2]
+
+\unexpanded\def\definelist
+ {\dotripleempty\dodefinelist}
+
+\unexpanded\def\placelist
+ {\dodoubleempty\doplacelist}
+
+\unexpanded\def\placerawlist
+ {\dodoubleempty\doplacerawlist}
+
+\def\dobeginoflist
+ {\begingroup
+ \startpacked[\v!blank]}
+
+\def\doendoflist
+ {\stoppacked
+ \endgroup}
+
+\def\doplacelist[#1][#2]%
+ {\dobeginoflist
+ \doplacerawlist[#1][#2]%
+ \doendoflist}
+
+\newtoks\everystructurelist
+
+% writing to lists
+
+\def\writetolist[#1]{\gobbletwoarguments}
+\let\dowritetolist \gobblefourarguments
+\let\dodowritetolist\gobblefourarguments
+
+\def\writebetweenlist[#1]#2%
+ {\doif{\namedlistparameter{#1}\c!state}\v!start{\structurelistinject[#1][command][command={#2}]}}
+
+\def\writedatatolist
+ {\dodoubleargument\dowritedatatolist}
+
+\def\dowritedatatolist[#1][#2]%
+ {\doif{\namedlistparameter{#1}\c!state}\v!start{\structurelistinject[#1][userdata][#2]}}
+
+\def\writetolist[#1]#2#3%
+ {\doif{\namedlistparameter{#1}\c!state}\v!start{\structurelistinject[#1][simple][first={#2},second={#3}]}}
+
+\installstructurelistprocessor{simple}
+ {\dodolistelement
+ \currentlist
+ \structurelistlocation
+ \structurelistfirst
+ \structurelistsecond
+ \structurelistpagenumber
+ \structurelistrealpagenumber}
+
+% % %
+
+\def\doplacerawlist[#1][#2]% listreferences will be redone
+ {\begingroup
+ \dosetuplist[#1][#2]%
+ \edef\currentlist{\firststructureelementinlist{#1}}%
+ \the\everystructurelist
+ \doif{\listparameter\c!coupling}\v!on{\startlistreferences{#1}}%
+ \placestructurelist{#1}{\listparameter\c!criterium}{\number\listparameter\c!number}%
+ \stoplistreferences
+ \endgroup
+ \dosetlistmode}
+
+\def\dosetlistmode % utilitydone will disappear
+ {\ifcase\structurelistsize\relax
+ \utilitydonefalse \resetsystemmode\v!list
+ \else
+ \utilitydonetrue \setsystemmode \v!list
+ \fi}
+
+\unexpanded\def\systemsuppliedchapter {\getvalue{\v!chapter}} % brrr
+\unexpanded\def\systemsuppliedtitle {\getvalue{\v!title}} % brrr
+
+\def\dodocompletelist[#1][#2][#3]% enkelvoud, meervoud, instellingen
+ {\normalexpanded{\systemsuppliedtitle[#2]{\noexpand\headtext{#2}}}% expansion needed for v! vs french !
+ \doplacelist[#1][#3]}
+
+\def\docompletelist[#1][#2]%
+ {\dodocompletelist[#1][#1][#2]}
+
+\def\completelist
+ {\dodoubleempty\docompletelist}
+
+\def\listelements {} % list of page breaks
+\def\listnumbercommand #1{#1} % no strut due to interactive version
+\def\listtextcommand #1{\begstrut#1\endstrut}
+\def\listpagecommand #1{\strut#1}
+
+\def\doassigndimen#1#2#3%
+ {\doifinsetelse{#2}{\v!fit,\v!broad}{#1=#3}{#1=#2}\relax}
+
+\def\listsymbol[#1]#2%
+ {\begingroup
+ \edef\currentlist{#1}%
+ \edef\currentlistnumber{#2}%
+ \currentlistsymbol
+ \endgroup}
+
+% Beware, the list symbol macro gets an argument passed, i.e. when this
+% argument is not picked up, the symbol becomes a kind of prefix.
+
+% for historical reasons we're stuck to symbols, so in order to generalize,
+% we have to hook it into the symbol handler; we need a beter clean up later
+%
+% < 2005
+%
+% \def\dosetlistsymbol % #1
+% {\executeifdefined{listsymbol@\listparameter\c!symbol}\listsymbol@default} % {#1}
+%
+% >= 2005
+%
+% at this symbol level, we have access to the raw 'number' in
+% \currentlistnumber
+
+\definesymbol[\v!list][\v!none ][\listsymbol@none ]
+\definesymbol[\v!list][\v!one ][\listsymbol@one ]
+\definesymbol[\v!list][\v!two ][\listsymbol@two ]
+\definesymbol[\v!list][\v!three ][\listsymbol@three ]
+\definesymbol[\v!list][\s!default][\listsymbol@default]
+\definesymbol[\v!list][\s!unknown][\listsymbol@unknown]
+
+\def\currentlistsymbol
+ {\doifinsymbolsetelse\v!list{\listparameter\c!symbol}
+ {\directsymbol\v!list{\listparameter\c!symbol}}
+ {\directsymbol\v!list\s!default}}
+
+\def\listsymbol@none
+ {\doassigndimen\scratchdimen{\listparameter\c!width}{1.5em}%
+ \hbox to \scratchdimen{}}
+
+\def\listsymbol@one
+ {\strut$\bullet$}
+
+\def\listsymbol@two
+ {\vrule\!!width1em\!!height1ex\!!depth\zeropoint}
+
+\def\listsymbol@three
+ {\begingroup
+ \doassigndimen{\dimen0}{\listparameter\c!width }{1.5em}%
+ \doassigndimen{\dimen2}{\listparameter\c!height}{1ex}%
+ \doassigndimen{\dimen4}{\listparameter\c!depth }\zeropoint
+ \vrule\!!width\dimen0\!!height\dimen2\!!depth\dimen4%
+ \endgroup}
+
+\def\listsymbol@default
+ {% prefix = no, none, yes
+ \strut
+ \doif{\listparameter\c!label}\v!yes{\leftlabeltext\currentlist}% we can use the new command that does left and right
+ \listparameter\c!starter
+ \currentlistnumber
+ \listparameter\c!stopper
+ \doif{\listparameter\c!label}\v!yes{\rightlabeltext\currentlist}}
+
+\def\listsymbol@default
+ {% todo:
+ % prefix=no (first gone)|none (all gone)|yes
+ % number=no|yes
+ \strut
+ \doifelse{\listparameter\c!label}\v!yes
+ {\leftlabeltext\currentlist
+ \listparameter\c!starter
+ \currentlistnumber
+ \listparameter\c!stopper
+ \rightlabeltext\currentlist}
+ {\listparameter\c!starter
+ \currentlistnumber
+ \listparameter\c!stopper}}
+
+\def\listsymbol@unknown
+ {\listparameter\c!symbol}
+
+% so far for list symbols
+
+\def\@@dodolistelement{dodolistelement}
+
+\def\dosomelistelement#1#2#3{#1 #2 #3}
+
+\setvalue{\@@dodolistelement a}{\let\dosomelistelement\dodofixdlistelementABC}
+\setvalue{\@@dodolistelement b}{\let\dosomelistelement\dodofixdlistelementABC}
+\setvalue{\@@dodolistelement c}{\let\dosomelistelement\dodofixdlistelementABC}
+\setvalue{\@@dodolistelement d}{\let\dosomelistelement\dodofixdlistelementD}
+\setvalue{\@@dodolistelement e}{\let\dosomelistelement\dodofixdlistelementE}
+\setvalue{\@@dodolistelement f}{\let\dosomelistelement\dodofixdlistelementF}
+\setvalue{\@@dodolistelement g}{\let\dosomelistelement\dodofixdlistelementG}
+
+\setvalue{\@@dodolistelement\v!none }{\def\dosomelistelement{\dodofreevlistelement}}
+\setvalue{\@@dodolistelement\v!vertical }{\def\dosomelistelement{\dodofreevlistelement}}
+\setvalue{\@@dodolistelement\v!horizontal}{\def\dosomelistelement{\dodofreehlistelement}}
+\setvalue{\@@dodolistelement\v!command }{\let\dosomelistelement\dodocommandlistelement}
+
+% \setuplist
+% [section]
+% [alternative=MyListItem,
+% after=\blank,
+% before=\blank]
+%
+% \definelistplacement[MyListItem][none]#1#2#3%
+% {(#1) (#2) (#3)}
+
+\unexpanded\def\definelistplacement
+ {\dodoubleempty\dodefinelistplacement}
+
+\def\dodefinelistplacement[#1][#2]%
+ {\setvalue{\@@dodolistelement#1}%
+ {\doifelsenothing{#2}
+ {\getvalue{\@@dodolistelement\v!command}}%
+ {\executeifdefined{\@@dodolistelement#2}{\getvalue{\@@dodolistelement\v!command}}}%
+ \setvalue{\??li\currentlist\c!command}{\getvalue{\@@dodolistelement::#1}}}%
+ \setvalue{\@@dodolistelement::#1}}
+
+% don't mess arround with endgraf/grouping else we loose leftskip
+
+% \strippedcsname\dodolistelement
+
+\def\newlineinlist{\space}
+
+\let\currentlist\s!unknown
+
+\def\docurrentlistalternative
+ {\edef\currentlistalternative{\listparameter\c!alternative}%
+ \ifx\currentlistalternative\empty
+ [unknown list alternative]%
+ \else
+ \executeifdefined{\@@dodolistelement\currentlistalternative}{[unknown list alternative: \currentlistalternative]}%
+ \fi}
+
+\def\dodolistelement#1#2#3#4#5#6%
+ {\edef\currentlist{#1}%
+ \edef\currentlistnumber{#3}%
+ \docurrentlistalternative
+ %\showcomposition
+ \let\@@iawidth\!!zeropoint % moet boolean worden
+ \begingroup
+ \edef\listelements{\listparameter\c!pageboundaries}%
+ \normalexpanded{\noexpand\doifinset{#3}{\listelements}}
+ {\showmessage\m!systems{14}{#3}%
+ \page}%
+ \endgroup
+ \dontcomplain
+ %\setfullsectionnumber{\??li\currentlist}% todo
+ \dosomelistelement{#1}{#2}{#3}{#4}{#5}{#6}%
+ \global\utilitydonetrue} % ?
+
+\def\dodocommandlistelement#1#2#3#4#5#6%
+ {\doifdefinedelse{\??li#1\c!command}
+ {\listparameter\c!command{#3}{#4}{#5}}
+ {[\currentlist: #3 -- #4 -- #5]}}
+
+\def\domakelistelement#1#2#3#4% ref internal command data
+ {\dontleavehmode
+ \iflocation % we cannot tewak \iflocation as we nest
+ \doifelse{\listparameter\c!interaction}{#1}
+ {\directgoto{\setlocationcolor\??ia#4}[internal(#2)]}% was \directgotobox
+ {#3{#4}}%
+ \else
+ #3{#4}%
+ \fi}
+
+\def\dodofreelistelement#1#2#3#4#5#6#7#8%
+ {\listparameter\c!before% can be \hskip
+ \doifdefinedelse{\??li#1\c!command}
+ {\domakelistelement{\listparameter\c!interaction}{#2}\hbox
+ {\listparameter\c!command
+ {#3}% geen conversies etc
+ {#4}% geen conversies etc
+ {#5}}}% geen command
+ {#7%
+ \vbox
+ {\forgetall
+ \domakelistelement\v!all{#2}\hbox
+ {\doif{\listparameter\c!headnumber}\v!yes
+ {\domakelistelement\v!sectionnumber{#2}\hbox
+ {\donestedlistattributes\c!numberstyle\c!numbercolor
+ {\listparameter\c!numbercommand{\currentlistsymbol}}}}%
+ \domakelistelement\v!text{#2}\hbox
+ {\donestedlistattributes\c!textstyle\c!textcolor
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ \listparameter\c!textcommand{#4}}}%
+ \doif{\listparameter\c!pagenumber}\v!yes
+ {\doifsomething{#5}
+ {\domakelistelement\v!pagenumber{#2}\hbox
+ {\donestedlistattributes\c!pagestyle\c!pagecolor
+ {\listparameter\c!pagecommand{#5}}}}}}}%
+ #8}%
+ \listparameter\c!after}
+
+\def\dodofreehlistelement#1#2#3#4#5#6%
+ {\dodofreelistelement{#1}{#2}{#3}{#4}{#5}{#6}
+ {\noindent}{}}
+
+\def\dodofreevlistelement#1#2#3#4#5#6% % \nointerlineskip needed,
+ {\dodofreelistelement{#1}{#2}{#3}{#4}{#5}{#6} % otherwise wrong spacing
+ {\ifvmode\nointerlineskip\fi} % at multi-line lists
+ {\ifvmode\nointerlineskip\fi\endgraf\allowbreak}} % test is saveguard
+
+% to be documented: align, hang
+
+\def\limitatedlistentry#1%
+ {\doifelsenothing{\listparameter\c!maxwidth}
+ {\listparameter\c!textcommand{#1}}
+ {\listparameter\c!textcommand
+ {\limitatetext
+ {#1}%
+ {\listparameter\c!maxwidth}%
+ {\splitsymbol{\listparameter\c!limittext}}}}}
+
+\def\dodofixdlistelementABC#1#2#3#4#5#6% weeden
+ {\endgraf
+ \leftskip\listparameter\c!margin% na de \endgraf !
+ \listparameter\c!before
+ \!!widthc\listparameter\c!distance
+ \doifelse{\listparameter\c!width}\v!fit
+ {\!!widtha\zeropoint}
+ {\doifelsenothing{#3}
+ {\doifelse{\listparameter\c!aligntitle}\v!yes
+ {\!!widtha\zeropoint
+ \!!widthc\zeropoint}
+ {\!!widtha\listparameter\c!width}}
+ {\!!widtha\listparameter\c!width}}%
+% \getvalue{\??li\c!alternative\listparameter\c!alternative}% ?
+ \endgraf
+ \noindent
+ \domakelistelement\v!all{#2}\hbox
+ {\setlocalhsize
+ \hsize\localhsize
+ \hbox to \hsize
+ {\forgetall
+ \dosetlistattributes\c!style\c!color
+ \!!widthb\hsize
+ \doifelse{\listparameter\c!headnumber}\v!yes
+ {\setbox2\hbox \ifdim\!!widtha>\zeropoint to \!!widtha \fi
+ {\domakelistelement\v!sectionnumber{#2}\hbox
+ {\donestedlistattributes\c!numberstyle\c!numbercolor
+ {\listparameter\c!numbercommand{\currentlistsymbol}}%
+ \hfill}}}
+ {\!!widtha\zeropoint
+ \!!widthc\zeropoint
+ \setbox2\hbox{}}%
+ \setbox4\hbox
+ {\doif{\listparameter\c!pagenumber}\v!yes
+ {\doifsomething{#5} % \listwidth is new ; temp hack
+ {\hbox \ifdim\listwidth>\zeropoint to \listwidth\fi
+ {\hfill
+ \domakelistelement\v!pagenumber{#2}\hbox
+ {\donestedlistattributes\c!pagestyle\c!pagecolor
+ {\listparameter\c!pagecommand{#5}}}}}}}%
+ \vbox
+ {\hsize\!!widthb
+ \setupalign[\listparameter\c!align]%
+ \ifdim\!!widtha<\hsize
+ \hangindent\wd2
+ \dimen2=\!!widthc % \listparameter\c!distance
+ \advance\hangindent \dimen2
+ \hangafter\plusone
+ \doif{\listparameter\c!hang}\v!no{\hangafter\zerocount}%
+ \ifdim\wd4=\zeropoint % \ifvoid4
+ % we kunnen gewoon afbreken aan het eind
+ \else
+ \ifdim\listskip>\zeropoint\relax
+ \rightskip\listskip\!!plus\liststretch\relax
+ \parfillskip-\rightskip
+ \fi
+ \fi
+ \else
+ \dimen2\zeropoint
+ \fi
+ \parindent\zeropoint\relax
+ \leavevmode
+ \box2\relax
+ \hskip\dimen2
+\domakelistelement\v!text{#2}\firstofoneargument{%
+ \bgroup
+ \donestedlistattributes\c!textstyle\c!textcolor
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ %\listparameter\c!textcommand{#4}}%
+ \limitatedlistentry{#4}}%
+ %\carryoverpar % new otherwise wrong linespacing
+ \egroup
+}%
+ \ifdim\wd4=\zeropoint\relax % \ifvoid4
+ % \ifdim\!!widtha<\hsize \hfill\strut \fi % spoils align
+ \else
+ \nobreak\listfill
+ \box4\relax
+ \relax
+ \fi}%
+ \hss}}% new
+ \endgraf % new, else problems with nointerlinespace and prevdepth
+ \nointerlineskip % anders verkeerde spatiering bij multi-line
+ \endgraf
+ \allowbreak
+ \listparameter\c!after}
+
+% % example from the context list
+%
+% \setuphead [part] [page=right,placehead=yes]
+% \setuplist [chapter] [alternative=d,before=\blank,after=\blank]
+% \setuplist [part] [before=\blank,after=\blank]
+%
+% \starttext
+% \startnarrower[2*right] \placecontent \stopnarrower
+% \blank[4*big]
+% \startsetups chapter
+% \blank \startnarrower[3*middle] \placecontent[criterium=local] \stopnarrower
+% \stopsetups
+% \placelist[part][criterium=text,after=\setups{chapter}]
+%
+% \part{First part} \chapter{Chapter one} \chapter{Chapter two}
+% \chapter{Chapter three} \chapter{Chapter four} \chapter{Chapter five}
+% \part{Second part} \chapter{Chapter one} \chapter{Chapter two}
+% \chapter{Chapter three} \chapter{Chapter four} \chapter{Chapter five}
+% \part{Third part} \chapter{Chapter one} \chapter{Chapter two}
+% \chapter{Chapter three} \chapter{Chapter four} \chapter{Chapter five}
+% \stoptext
+
+% overrulen interactie kan sneller, bv door hulpconstanten
+% te gebruiken en die te letten
+
+\def\dodofixdlistelementD#1#2#3#4#5#6%
+ {%\leftskip=\listparameter\c!margin
+ \ifvmode
+ \advance\leftskip\listparameter\c!margin% AANGEPAST
+ \fi
+ \bgroup
+ \ifvmode
+ \noindent\leavevmode % leavevmode ? ? ?
+ \fi
+%% actually, the next can be supported now (will be enabled when I have time to test it)
+ \doif{\listparameter\c!interaction}\v!text % not supported
+ {\setlistparameter\currentlist\c!interaction\v!sectionnumber}%
+ \doif{\listparameter\c!interaction}\v!all % not supported
+ {\setlistparameter\currentlist\c!interaction\v!sectionnumber}%
+%%
+ \setbox4\hbox
+ {\doif{\listparameter\c!pagenumber}\v!yes
+ {\doifsomething{#5}
+ {\domakelistelement\v!pagenumber{#2}\hbox
+ {\donestedlistattributes\c!pagestyle\c!pagecolor
+ {\listparameter\c!pagecommand{#5}}}}}}%
+%% \domakelistelement\v!all{#2}\firstofoneargument{%
+ \doif{\listparameter\c!headnumber}\v!yes
+ {\donetrue
+ \doifnothing{#3}{\doifnothing{\listparameter\c!symbol}\donefalse}%
+ % == \doifnothing{#3\listparameter\c!symbol}\donefalse
+ \ifdone
+ \hbox
+ {\listparameter\c!left
+ \domakelistelement\v!sectionnumber{#2}\hbox
+ {\donestedlistattributes\c!numberstyle\c!numbercolor
+ {\listparameter\c!numbercommand{\currentlistsymbol}}}%
+ \listparameter\c!right
+ \hskip.5em}%
+ \nobreak
+ \fi}%
+ \tolerance3500 % niet zomaar veranderen
+%% \domakelistelement\v!text{#2}\firstofoneargument{%
+ \donestedlistattributes\c!textstyle\c!textcolor
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ %\listparameter\c!textcommand{#4}}%
+ \limitatedlistentry{#4}}%
+%% }%
+ \ifvoid4\else
+ \nobreak
+ \hskip.75em\relax
+ \nobreak
+ \box4
+ \fi
+%% }%
+ \dimen0=\listparameter\c!distance\relax
+ \ifdim\dimen0<1em\relax
+ \hskip1em\!!plus1em\!!minus.25em\relax
+ \else
+ \hskip\dimen0\!!plus.5\dimen0\!!minus.25\dimen0\relax
+ \fi
+ \egroup}
+
+\def\dodofixdlistelementE#1%
+ {\dodofixdlistelementEFG
+ {\setupinteraction[\c!strut=\v!no]}
+ {\localframed[\??li\currentlist][\c!depth=\!!zeropoint,\c!color=]}
+ {}}
+
+\def\dodofixdlistelementF#1%
+ {\dodofixdlistelementEFG
+ {}
+ {\dosetraggedhbox{\listparameter\c!align}\raggedbox}
+ {}}
+
+\def\dodofixdlistelementG#1%
+ {\dodofixdlistelementEFG
+ {}
+ \midaligned
+ {}}
+
+\def\dodofixdlistelementEFG#1#2#3#4#5#6#7#8%
+ {\noindent
+ \bgroup
+ \domakelistelement\v!no{#4}{#2}%
+ {\let\\=\newlineinlist
+ #1% in case E nils the strut (still needed?)
+ \dosetlistattributes\c!style\c!color
+ \ignorespaces\dontconvertfont\setstrut
+ \begstrut
+ \limitatedlistentry{#6}%
+ \endstrut}%
+ \egroup
+ \par
+ \listparameter\c!inbetween}
+
+\def\listlength{\utilitylistlength}
+\def\listwidth {\utilitylistwidth}
+\def\listheight{\utilitylistheight}
+
+\def\utilitylistlength {0}
+\def\utilitylistwidth {0pt} % no longer supported
+\def\utilitylistheight {0pt} % no longer supported
+
+\def\dodeterminelistcharacteristics[#1][#2]%
+ {\begingroup
+ \dosetuplist[#1][#2]%
+ \edef\currentlist{\firststructureelementinlist{#1}}%
+ \the\everystructurelist
+ \analysestructurelist{#1}{\listparameter\c!criterium}{\number\listparameter\c!number}%
+ \xdef\utilitylistlength{\structurelistsize}%
+ \endgroup
+ \dosetlistmode}
+
+\def\determinelistcharacteristics
+ {\dodoubleempty\dodeterminelistcharacteristics}
+
+\def\combinedlistparameter#1{\csname\??ih\currentcombinedlist#1\endcsname}
+
+\unexpanded\def\setupcombinedlist
+ {\dodoubleargument\dosetupcombinedlist}
+
+\def\dosetupcombinedlist[#1][#2]%
+ {\getparameters[\??ih#1][#2]%
+ \edef\currentcombinedlist{#1}%
+ \normalexpanded{\noexpand\setuplist[\combinedlistparameter\c!list]}[#2]}
+
+\unexpanded\def\definecombinedlist
+ {\dotripleempty\dodefinecombinedlist}
+
+\def\dodefinecombinedlist[#1][#2][#3]%
+ {\getparameters
+ [\??ih#1]
+ [\c!criterium=\v!local,\c!number=0,\c!list={#2},#3]%
+ \setvalue{\e!setup#1\e!endsetup}{\dodoubleempty\dosetupcombinedlist[#1]}%
+ \setvalue{\e!place#1}{\dodoubleempty\doplacecombinedlist[#1]}%
+ \setvalue{\e!complete#1}{\dodoubleempty\docompletecombinedlist[#1]}}
+
+\unexpanded\def\placecombinedlist
+ {\dodoubleempty\doplacecombinedlist}
+
+\def\doplacecombinedlist[#1][#2]% we can move much of the analysis to lua
+ {\begingroup
+ % level is no longer supported
+ \def\currentcombinedlist{#1}%
+ \getparameters[\??ih#1][#2]%
+ \edef\combinedlist{\combinedlistparameter\c!list}%
+ \the\everystructurelist
+ \doif{\combinedlistparameter\c!coupling}\v!on{\startlistreferences{#1}}%
+ \dobeginoflist
+ \normalexpanded{\noexpand\dosetuplist[\combinedlist][#2]}%
+ \placestructurelist{\combinedlist}{\combinedlistparameter\c!criterium}{\combinedlistparameter\c!number}%
+ \doendoflist
+ \stoplistreferences
+ \endgroup
+ \dosetlistmode}
+
+\def\docompletecombinedlist[#1][#2]%
+ {\normalexpanded{\systemsuppliedtitle[#1]{\noexpand\headtext{#1}}}% expansion due to v! vs french !
+ \doplacecombinedlist[#1][#2]}
+
+% lists that have a number/title are kind of generic and can share code
+
+\installstructurelistprocessor{number+title}
+ {\dodolistelement
+ \currentlist
+ \structurelistlocation
+ \structurelistgenericnumber
+ \structurelistgenerictitle
+ \structurelistpagenumber
+ \structurelistrealpagenumber}
+
+\def\structurelistgenerictitle
+ {\ctxlua{structure.lists.title("\currentlist",\currentlistindex)}}
+
+\def\structurelistgenericnumber{\ctxlua{
+ structure.lists.prefixednumber("\currentlist",\currentlistindex, {
+ prefix = "\listparameter\c!prefix",
+ separatorset = "\listparameter\c!prefixseparatorset",
+ conversionset = "\listparameter\c!prefixconversionset",
+ starter = \!!bs\listparameter\c!prefixstarter\!!es,
+ stopper = \!!bs\listparameter\c!prefixstopper\!!es,
+ set = "\listparameter\c!prefixset",
+ segments = "\listparameter\c!prefixsegments",
+ connector = \!!bs\listparameter\c!prefixconnector\!!es,
+ },
+ {
+ separatorset = "\listparameter\c!numberseparatorset",
+ conversionset = "\listparameter\c!numberconversionset",
+ starter = \!!bs\listparameter\c!numberstarter\!!es,
+ stopper = \!!bs\listparameter\c!numberstopper\!!es,
+ segments = "\listparameter\c!numbersegments",
+ } )}}
+
+% new and yet undocumented (used in cocoa qa), temporarily disabled in mkiv
+%
+% \setupremaininglistlength
+% [left=\hss nog~,right=~ingangen]
+%
+% \resetremaininglistlength
+% [section][settings]
+%
+% \placelist
+% [section]
+% [before=\showremaininglistlength]
+%
+% \dorecurse{100}{\section{hans}}
+%
+% \definesystemvariable {ll} % ListLength
+%
+% \unexpanded\def\setupremaininglistlength[#1]%
+% {\getparameters[\??ll][#1]%
+% \globallet\listlengthcounter\!!zerocount}
+%
+% \setupremaininglistlength
+% [\c!left=\hss,\c!right=,\c!number=\v!yes,
+% \c!before=\blank,\c!after=\page,
+% \c!style=\v!smallnormal,\c!color=]
+%
+% \def\resetremaininglistlength
+% {\dodoubleempty\doresetremaininglistlength}
+%
+% \def\doresetremaininglistlength[#1][#2]%
+% {\determinelistcharacteristics[#1][#2]%
+% \xdef\listlengthcounter{\number\utilitylistlength}}
+%
+% \def\showremaininglistlength
+% {\bgroup
+% \ifnum\listlengthcounter>\plusone
+% \setbox\scratchbox\vbox
+% {\@@llbefore\par\horizontalstrut\par\horizontalstrut\par\@@llafter}%
+% \scratchdimen\pagetotal
+% \advance\scratchdimen \ht\scratchbox
+% \advance\scratchdimen \dp\scratchbox
+% \ifdim\scratchdimen>\pagegoal
+% \@@llbefore
+% \nobreak\hbox to \hsize
+% {\doifnot\@@llnumber\v!yes{\let\listlengthcounter\empty}%
+% \doattributes\??ll\c!style\c!color{\@@llleft\listlengthcounter\@@llright}}
+% \@@llafter
+% \fi
+% \fi
+% \doglobal\decrement\listlengthcounter\relax
+% \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/strc-mar.lua b/tex/context/base/strc-mar.lua
new file mode 100644
index 000000000..8ee814d77
--- /dev/null
+++ b/tex/context/base/strc-mar.lua
@@ -0,0 +1,18 @@
+if not modules then modules = { } end modules ['strc-mar'] = {
+ version = 1.001,
+ comment = "companion to strc-mar.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+structure.marks = structure.marks or { }
+
+function structure.marks.title(tag,n)
+ structure.lists.savedtitle(tag,n,"marking")
+end
+
+function structure.marks.number(tag,n) -- no spec
+ -- no prefix (as it is the prefix)
+ structure.lists.savednumber(tag,n)
+end
diff --git a/tex/context/base/strc-mar.mkii b/tex/context/base/strc-mar.mkii
new file mode 100644
index 000000000..62e6f4ded
--- /dev/null
+++ b/tex/context/base/strc-mar.mkii
@@ -0,0 +1,318 @@
+%D \module
+%D [ file=strc-mar,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Markings,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Markings}
+
+\unprotect
+
+\prependtoks \getallmarks \to \everybeforepagebody
+\prependtoks \setallmarks \to \everyafterpagebody % currently \relax
+
+% voor 'interne' doeleinden zijn beschikbaar:
+%
+% \fetchmark[naam][plaats]
+
+\def\mainmarking#1%
+ {\ifcsname\??mk#1\c!coupling\endcsname
+ \csname\??mk#1\c!coupling\endcsname
+ \fi}
+
+\def\fastresetmarker#1%
+ {\ifcsname\??mk#1\c!coupling\endcsname
+ \@EA\resetmark\csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname
+ \fi}
+
+\def\fastresetmarkerlist[#1]%
+ {\expanded{\rawprocesscommalist[#1]}\fastresetmarker}
+
+\def\doresetmarking[#1]%
+ {\processcommalist[#1]\fastresetmarker}
+
+\def\resetmarking
+ {\dosingleargument\doresetmarking}
+
+\def\dosetupmarking[#1][#2]%
+ {\def\docommand##1{\getparameters[\??mk##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+\def\setupmarking
+ {\dodoubleargument\dosetupmarking}
+
+% betere protectie
+
+\letvalue{\??mk\??mk\v!previous}\gettopmark
+\letvalue{\??mk\??mk\v!first }\getfirstmark
+\letvalue{\??mk\??mk\v!last }\getbotmark
+\letvalue{\??mk\??mk\v!current }\getcurrentmark
+
+% todo: make it work in balancing
+%
+% \definemarking[vers][]
+% \setupheadertexts
+% [\doiftext{\getmarking[vers][first]}
+% {\doiftextelse{\getmarking[vers][column:last]}
+% {\getmarking[vers][first] -- \getmarking[vers][column:last]}
+% {\getmarking[vers][first]}}]
+% \starttext
+% \startcolumns[n=2,balance=no]
+% \dorecurse{10}{\expanded{\marking[vers]{\recurselevel}} \recurselevel:\dorecurse{4}{\input ward } \endgraf}
+% \stopcolumns
+% \stoptext
+
+\letvalue{\??mk\??mk\v!column:\v!first}\getsplitfirstmark
+\letvalue{\??mk\??mk\v!column:\v!last }\getsplitbottommark
+
+\ifx\decouplemarking\undefined \def\decouplemarking[#1]{} \fi
+
+\let\alldefinedmarks\empty
+
+\def\dododefinemarking[#1][#2]%
+ {\getparameters[\??mk#1]
+ [\c!expansion=\v!no, % saves a macro
+ \c!separator={\space\emdash\space},
+ \c!limittext=\@@kolimittext,
+ \c!state=\v!start]%
+ \decouplemarking[#1]% % no coupling with sections
+ \setevalue{\??mk#1\c!coupling}{#2}%
+ \doglobal\addtocommalist{#2}\alldefinedmarks
+ \expandafter\newmark\csname\??mk#2\endcsname
+ \showmessage\m!systems{13}{#1,[#2]}}
+
+\def\dodefinemarking[#1][#2]%
+ {\doifelsenothing{#2}
+ {\dododefinemarking[#1][#1]}
+ {\dododefinemarking[#1][#2]}}
+
+\def\definemarking
+ {\dodoubleempty\dodefinemarking}
+
+\def\definerawmarking[#1]% global ! ! ! !
+ {\getgparameters[\??mk#1]
+ [\c!expansion=\v!no, % saves a macro
+ \c!separator={ --- }, % watch the spaces
+ \c!limittext=,
+ \c!state=\v!start]%
+ \setxvalue{\??mk#1\c!coupling}{#1}%
+ \expandafter\newmark\csname\??mk#1\endcsname
+ \showmessage\m!systems{13}{#1}}
+
+\let\nomarking\empty
+
+\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
+\letvalue{\??mk::\??mk::\v!current }\fourthoffourarguments
+
+% this version can be used when a page is built up in steps without
+% feedback of the otr'd list to the mvl (i.e.\ a page made of pages,
+% as in column sets where content is buffered)
+
+% reset at begin
+% preset before page
+% bubble in column
+% refresh at end
+
+\def\refreshsavedmark[#1][#2]% mark tag (packing saves many hash entries)
+ {\setxvalue{\??mk::#1:#2}%
+ {{\@EA\ifx\csname\??mk::#1:pp\endcsname\relax
+ % empty
+ \else
+ \csname\??mk::#1:pp\endcsname
+ \fi}%
+ {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax
+ \fetchmark[#1][\v!first]%
+ \else
+ \csname\??mk::#1:ff\endcsname
+ \fi}%
+ {\fetchmark[#1][\v!last]}%
+ {\fetchmark[#1][\v!current]}}%
+ \setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!first]}%
+ \letgvalue{\??mk::#1:ff}\relax
+ }
+
+\def\bubblesavedmark[#1][#2]% no packing (not now, maybe make a six-pack later)
+ {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax
+ \setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}%
+ \fi}
+
+\def\resetsavedmark[#1][#2]% mark tag
+ {\doifelsenothing{\fetchmark[#1][\v!previous]}
+ {\letgvalue{\??mk::#1:pp}\relax}
+ {\setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!previous]}}%
+ \doifelsenothing{\fetchmark[#1][\v!first]}
+ {\letgvalue{\??mk::#1:ff}\relax}
+ {\setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}}%
+ \letgvalue{\??mk::#1:#2}\emptysavedmark}
+
+\def\presetsavedmark[#1][#2]% mark tag
+ {\letgvalue{\??mk::#1:#2}\emptysavedmark}
+
+\def\emptysavedmark{{}{}{}{}}
+
+% new (can be used in column sets)
+%
+% \getsavedmarking[M][previous]
+% \getsavedmarking[M][first]
+% \getsavedmarking[M][last]
+
+\def\getsavedmarking
+ {\dodoubleargument\dogetsavedmarking}
+
+\def\dogetsavedmarking[#1][#2]%
+ {\doifelse{#2}\v!previous
+ {\getmarking[#1][1][\v!previous]}
+ {\doifelse{#2}\v!first
+ {\getmarking[#1][1][\v!first]}
+ {\getmarking[#1][\v!last]}}}
+
+% fetching
+
+\def\fetchtwomarks[#1]%
+ {\dofetchtwomarks[#1][#1]}
+
+\def\fetchallmarks[#1]%
+ {\dofetchallmarks[#1][#1]}
+
+\def\dofetchtwomarks[#1][#2]% class class:tag
+ {\doifsomething{\fetchmark[#2][\v!first]}
+ {\fetchmark[#2][\v!first]%
+ \doifsomething{\fetchmark[#2][\v!last]}
+ {\doifnot{\fetchmark[#2][\v!first]}{\fetchmark[#2][\v!last]}
+ {\getvalue{\??mk#1\c!separator}\fetchmark[#2][\v!last]}}}}
+
+\def\dofetchallmarks[#1][#2]%
+ {\doifsomething{\fetchmark[#2][\v!first]}
+ {\doifsomething{\fetchmark[#2][\v!previous]}
+ {\doifnot{\fetchmark[#2][\v!previous]}{\fetchmark[#2][\v!first]}
+ {\fetchmark[#2][\v!previous]\getvalue{\??mk#1\c!separator}}}}%
+ \fetchtwomarks[#1][#2]}
+
+% \newtoks \everymarking
+
+% \def\Interesting{\doifmodeelse{*\v!marking}{Interesting}{Boring}}
+% \setupheadertexts[chapter]
+% \starttext
+% \chapter{This Is \Interesting}
+% \stoptext
+
+\def\dogetmarking[#1][#2][#3]%
+ {\doifvalue{\??mk#1\c!state}\v!start
+ {\bgroup
+ \setsystemmode\v!marking
+ \the\everymarking
+ %\def\nomarking##1{\unknown\ }%
+ \def\nomarking{\splitsequence{\getvalue{\??mk#1\c!limittext}}}%
+ \setfullsectionnumber{\??mk#1}%
+ \ifthirdargument
+ \processaction % slow
+ [#3]
+ [ \v!both=>{\dofetchtwomarks[#1][#1:#2]},
+ \v!all=>{\dofetchallmarks[#1][#1:#2]},
+ \s!default=>{\fetchmark [#1:#2][\v!first]},
+ \s!unknown=>{\fetchmark [#1:#2][#3]}]%
+ \else
+ \processaction % slow
+ [#2]
+ [ \v!both=>{\dofetchtwomarks[#1][#1]},
+ \v!all=>{\dofetchallmarks[#1][#1]},
+ \s!default=>{\fetchmark [#1][\v!first]},
+ \s!unknown=>{\fetchmark [#1][#2]}]%
+ \fi
+ \egroup}}
+
+\def\nogetmarking[#1][#2][#3]%
+ {}
+
+\unexpanded\def\getmarking
+ {\dotripleargument\dogetmarking}
+
+\let\setsomemark\setmark
+
+\def\domarking[#1]#2%
+ {\ifcsname\??mk#1\c!coupling\endcsname
+ \bgroup
+ \doifelsevalue{\??mk#1\c!expansion}\v!yes
+ \expandmarkstrue\expandmarksfalse
+ \@EA\setsomemark\csname\??mk\csname\??mk#1\c!coupling\endcsname\endcsname{#2}%
+ \egroup
+ \fi}
+
+\def\marking
+ {\dosingleargument\domarking}
+
+%D Used in placing text lines.
+
+\def\doifelsemarking#1%
+ {\ifundefined{\??mk#1\c!coupling}%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D And then \unknown\ we had a chaptertitle packaged in a
+%D makeup environment. And we don't want to loose marks there!
+
+\newbox\collectedmarks
+
+\def\flushmarks % use with care to avoid empty pages
+ {\ifvoid\collectedmarks\else\unhbox\collectedmarks\fi}
+
+\def\postponemarks
+ {\let\setsomemark\postponemark}
+
+\def\postponemark#1#2%
+ {%\writestatus{marks}{postponing \string#1 => #2}%
+ \global\setbox\collectedmarks\hbox
+ {\unhbox\collectedmarks\setmark{#1}{#2}}}
+
+\protect \endinput
+
+% Pseudo marks: (for Hraban)
+%
+% \def\RegisterPageMark#1#2%
+% {\iftrialtypesetting \else
+% \doglobal\increment\NameCounter
+% \textreference[#1:t:\NameCounter]{#2}%
+% \doifreferencefoundelse{#1:t:\NameCounter}
+% {\doifundefined{#1:f:\currentrealreference}%
+% {\setxvalue{#1:f:\currentrealreference}%
+% {\noexpand\in[#1:t:\NameCounter]}}%
+% \setxvalue{#1:l:\currentrealreference}%
+% {\noexpand\in[#1:t:\NameCounter]}}%
+% {}%
+% \fi}
+%
+% \def\GetFirstOnPage#1{\getvalue{#1:f:\realfolio}}
+% \def\GetLastOnPage #1{\getvalue{#1:l:\realfolio}}
+%
+% \setupheadertexts[\GetFirstOnPage{Name}][\GetLastOnPage{Name}]
+%
+% \starttext
+%
+% \def\Name#1{\RegisterPageMark{Name}{#1}#1}
+% \def\TestLine#1{\NC test \NC \Name {test: #1} \NC \NR}
+%
+% \starttabulate
+% \dorecurse{100}{\expanded{\TestLine{\recurselevel}}}
+% \stoptabulate
+%
+% \stoptext
diff --git a/tex/context/base/strc-mar.mkiv b/tex/context/base/strc-mar.mkiv
new file mode 100644
index 000000000..bb87051e0
--- /dev/null
+++ b/tex/context/base/strc-mar.mkiv
@@ -0,0 +1,495 @@
+%D \module
+%D [ file=strc-mar,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Markings,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Markings}
+
+\registerctxluafile{strc-mar}{1.001}
+
+\unprotect
+
+%D Old stuff.
+
+\newtoks \listofmarks
+
+\let \getmarks \gobbleoneargument
+\let \getallmarks \relax
+\let \getsplitmarks \gobbleoneargument
+\let \getallsplitmarks \relax
+
+%D \macros
+%D {expandmarks}
+%D
+%D We can force expansion of marks with the following switch.
+
+% Synchronizing marks is a rather tricky and messy business. When
+% setting a mark, a node is added to the list in order for to \TEX\
+% be able to figure out the 3 current marks when a page is made
+% (last mark on previous page, first on current page, last on
+% current page; in \LUATEX\ we might at one point have the first on
+% the next page as well).
+
+% Resetting a mark is not easy. An empty one will not erase the last
+% one on the previous page for instance. In \LUATEX\ we can clear a
+% marks state register with \type {\clearmarks} but since this is an
+% immediate operation it might have unwanted side effects when \TEX\
+% has collected several pages of text and finishing off these pages
+% uses marks.
+
+% In \MKIV\ we provide a model that permits some control over the
+% way marks are used. It is not entirely compatible with \MKII\ but
+% in practice this is not a real problem. Quality has a price.
+
+% In fact we define multiple marks per visible mark and define
+% additional ones on the fly. This has some price in terms of used
+% mark registers but given the way that we fill marks in \MKIV\
+% their accumulated content is not really the issue. Also,
+% periodically we cleanup any leftovers.
+
+\newif\ifexpandmarks \expandmarkstrue
+
+\def\marksomecs #1#2{\csname\string#1:m:\number#2\endcsname}
+\def\markautocs #1{\csname\string#1:m:\number\csname\string#1:s\endcsname\endcsname}
+\def\markmaincs #1{\csname\string#1:m\endcsname}
+\def\markresetcs #1{\csname\string#1:r\endcsname}
+\def\markstatecs #1{\csname\string#1:s\endcsname}
+\def\markcurrentcs#1{\csname\string#1:c\endcsname}
+\def\marktokscs #1{\csname\string#1:t\endcsname}
+
+\def\renewmarks#1%
+ {\ifx#1\relax
+ % \writestatus\m!systems{defining low level mark: \string#1}%
+ \newmarks#1%
+ \else
+ \clearmarks#1%
+ \fi}
+
+\unexpanded\def\definenewmark#1%
+ {\ifcsname\string#1:m\endcsname\else
+ \@EA\@EA\@EA\newcount \markstatecs #1\global\markstatecs#1\plusone
+ \@EA\@EA\@EA\renewmarks\markautocs #1%
+ \@EA\@EA\@EA\renewmarks\markmaincs #1%
+ \@EA\@EA\@EA\renewmarks\markresetcs #1%
+ \@EA\@EA\@EA\newtoks \marktokscs #1%
+ \@EA\@EA\@EA\let \markcurrentcs#1\empty
+ \listofmarks\expandafter{\the\listofmarks\checkmark#1}%
+ \fi}
+
+\long\def\setmark#1#2% marks expand
+ {\@EA\@EA\@EA\xdef \markcurrentcs#1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}%
+ \marks\markautocs #1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}% we could expand current one level
+ \marks\markmaincs #1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}% we could expand current one level
+ \marks\markresetcs #1{\number\markstatecs#1}}
+
+\def\resetmark#1%
+ {\global\advance\markstatecs#1\plusone
+ \@EA\@EA\@EA\glet\markcurrentcs#1\empty
+ \@EA\@EA\@EA\renewmarks\markautocs#1%
+ \the\marktokscs#1\relax}
+
+\def\addmarkreset#1#2%
+ {\global\marktokscs#2\@EA{\the\marktokscs#2\resetmark#1}}
+
+% already there: \prependtoks \getallmarks \to \everybeforepagebody
+%
+% \def\getallmarks{\the\listofmarks}
+
+\let\checkmark\gobbleoneargument
+
+\prependtoks \clearmarkswhenemptypage \to \everybeforepagebody
+
+\def\clearmarkswhenemptypage
+ {\iffalse % check if page is empty
+ \clearallmarks
+ \fi}
+
+\def\clearallmarks
+ {\let\checkmark\clearmarkchain
+ \the\listofmarks
+ \let\checkmark\gobbleoneargument}
+
+\def\clearmarkchain#1%
+ {\@EA\@EA\@EA\clearmarks\markmaincs#1%
+ \@EA\@EA\@EA\clearmarks\markresetcs#1%
+ \@EA\doclearmarkchain\@EA{\number\csname\string#1:s\endcsname}#1%
+ \@EA\@EA\@EA\glet\markcurrentcs#1\empty
+ \global\markstatecs#1\plusone}
+
+\def\doclearmarkchain#1#2%
+ {\@EA\@EA\@EA\clearmarks\marksomecs#1{#2}%
+ \@EA\doclearmarkchain\@EA#1\@EA{\number\numexpr#2+\minusone}}
+
+% Fetching (expandable versions, so no intermediate counter):
+
+\def\currenttopmarknumber #1{\number0\topmarks \markresetcs#1}
+\def\currentfirstmarknumber#1{\number0\firstmarks\markresetcs#1}
+\def\currentbotmarknumber #1{\number0\botmarks \markresetcs#1}
+
+\def\checkedcurrentmarkrange#1{[\currenttopmarknumber#1,\currentfirstmarknumber#1,\currentbotmarknumber#1]}
+
+\def\checkedcurrentmarks{\markcurrentcs} % #1 shared current mark
+
+\let\currentsplitfirstmarknumber\currentfirstmarknumber
+\let\currentsplittopmarknumber \currenttopmarknumber
+\let\currentsplitbotmarknumber \currentbotmarknumber
+\let\normalsplittopmarks \normaltopmarks
+
+\def\uncheckedautotopmark {\normaltopmarks \markautocs} % #1
+\def\uncheckedautofirstmark {\normalfirstmarks \markautocs} % #1
+\def\uncheckedautobotmark {\normalbotmarks \markautocs} % #1
+\def\uncheckedautosplittopmark {\normalsplittopmarks \markautocs} % #1
+\def\uncheckedautosplitfirstmark {\normalsplitfirstmarks\markautocs} % #1
+\def\uncheckedautosplitbotmark {\normalsplitbotmarks \markautocs} % #1
+
+\def\uncheckedmaintopmark {\normaltopmarks \markmaincs} % #1
+\def\uncheckedmainfirstmark {\normalfirstmarks \markmaincs} % #1
+\def\uncheckedmainbotmark {\normalbotmarks \markmaincs} % #1
+\def\uncheckedmainsplittopmark {\normalsplittopmarks \markmaincs} % #1
+\def\uncheckedmainsplitfirstmark {\normalsplitfirstmarks\markmaincs} % #1
+\def\uncheckedmainsplitbotmark {\normalsplitbotmarks \markmaincs} % #1
+
+\def\checkedpagetopmarks #1{\ifcase\currentbotmarknumber #1\else\normaltopmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
+\def\checkedpagefirstmarks #1{\ifcase\currentbotmarknumber #1\else\normalfirstmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
+\def\checkedpagebotmarks #1{\ifcase\currentbotmarknumber #1\else\normalbotmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
+\def\checkedpagesplittopmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplittopmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi}
+\def\checkedpagesplitfirstmarks#1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitfirstmarks\marksomecs#1{\currentsplitbotmarknumber #1}\fi}
+\def\checkedpagesplitbotmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitbotmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi}
+
+\def\checkedfulltopmarks #1{\ifcase\currenttopmarknumber #1\else\normaltopmarks \marksomecs#1{\currenttopmarknumber #1}\fi}
+\def\checkedfullfirstmarks #1{\ifcase\currentfirstmarknumber #1\else\normalfirstmarks \marksomecs#1{\currentfirstmarknumber #1}\fi}
+\def\checkedfullbotmarks #1{\ifcase\currentbotmarknumber #1\else\normalbotmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
+\def\checkedfullsplittopmarks #1{\ifcase\currentsplittopmarknumber #1\else\normalsplittopmarks \marksomecs#1{\currentsplittopmarknumber #1}\fi}
+\def\checkedfullsplitfirstmarks#1{\ifcase\currentsplitfirstmarknumber#1\else\normalsplitfirstmarks\marksomecs#1{\currentsplitfirstmarknumber#1}\fi}
+\def\checkedfullsplitbotmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitbotmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi}
+
+% Interface macros:
+
+\def\getcurrentmark {\checkedcurrentmarks }
+\def\gettopmark {\checkedfulltopmarks }
+\def\getfirstmark {\checkedfullfirstmarks }
+\def\getbotmark {\checkedfullbotmarks }
+\def\getsplittopmark {\checkedfullsplittopmarks }
+\def\getsplitfirstmark {\checkedfullsplitfirstmarks}
+\def\getsplitbotmark {\checkedfullsplitbotmarks }
+
+\def\getbottommark {\getbotmark}
+\def\getsplitbottommark{\getsplitbotmark}
+
+%D Some of these will go away (in the process of rewriting).
+
+\let \newmark \definenewmark
+\let \newpersistentmark \newmarks
+\let \normalsetmark \setmark
+\let \rawnewmark \newmarks
+\let \rawdefinemark \newmarks
+\let \rawsetmark \normalmarks
+\let \rawgettopmark \normaltopmarks
+\let \rawgetfirstmark \normalfirstmarks
+\let \rawgetbotmark \normalbotmarks
+\let \rawgetsplitbotmark \normalsplitbotmarks
+\let \rawgetsplitfirstmark \normalsplitfirstmarks
+\let \rawgetsplittopmark \normalsplitfirstmarks
+
+\let \noninterferingmarks \relax % old color interference related hack
+
+%D Next comes the layer around the previous mechanism.
+%D
+%D Parameters
+
+\def\markingparameter #1#2{\csname\domarkingparameter{\??mk#1}#2\endcsname}
+\def\domarkingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\@EA\domarkingparentparameter\csname#1\s!parent\endcsname#2\fi}
+\def\domarkingparentparameter#1#2{\ifx#1\relax\s!empty\else\domarkingparameter#1#2\fi}
+\def\markingcoupling #1{\ifcsname\??mk#1\c!coupling\endcsname\@EA\markingcoupling\csname\??mk#1\c!coupling\endcsname\else#1\fi}
+
+\let\mainmarking\markingcoupling % compatibility
+
+\def\doifelsemarking#1%
+ {\ifcsname\??mk#1\c!coupling\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\dowithmarkcommandone#1#2% \command {mark}
+ {\expandafter#1\csname\??mk:\markingcoupling{#2}\endcsname}
+
+\def\dowithmarkcommandtwo#1#2#3% \command {mark} {mark}
+ {\expandafter#1\csname\??mk:\markingcoupling{#2}\expandafter\endcsname\csname\??mk:\markingcoupling{#3}\endcsname}
+
+\unexpanded\def\setupmarking
+ {\dodoubleargument\dosetupmarking}
+
+\def\dosetupmarking[#1][#2]%
+ {\def\docommand##1{\getparameters[\??mk##1][#2]}%
+ \processcommalist[#1]\docommand}
+
+%D The filtercommand key is used to hook in a filtering command. Users are
+%D adviced not to misuse this key.
+
+\getparameters
+ [\??mk]
+ [\c!expansion=\v!no, % saves a macro
+ \c!separator={\space\emdash\space},
+ \c!limittext=\@@kolimittext,
+ \c!filtercommand=\firstofoneargument,
+ \c!state=\v!start]
+
+\let\alldefinedmarks\empty
+
+\unexpanded\def\definemarking
+ {\dodoubleempty\dodefinemarking}
+
+\def\dodefinemarking[#1][#2]%
+ {\doifelsenothing{#2}\donormaldefinemarking\docloneddefinemarking[#1][#2]}
+
+\def\donormaldefinemarking[#1][#2]% #2 empty
+ {\ifcsname\??mk#1\s!parent\endcsname
+ % already defined
+ \else
+ \letgvalue{\??mk#1\s!parent}\??mk
+ \dowithmarkcommandone\newmark{#1}%
+ \doglobal\addtocommalist{#2}\alldefinedmarks
+ \ifproductionrun\showmessage\m!systems{13}{#1,[#1]}\fi
+ \fi}
+
+\def\docloneddefinemarking[#1][#2]%
+ {\ifcsname\??mk#1\s!parent\endcsname \else \ifcsname\??mk#2\s!parent\endcsname
+ \doifnot{#1}{#2}%
+ {\setxvalue{\??mk#1\s!parent}{\??mk#2}%
+ \setxvalue{\??mk#1\c!coupling}{#2}%
+ \ifproductionrun\showmessage\m!systems{13}{#1,[#2]}\fi}%
+ \fi \fi}
+
+\def\decouplemarking[#1]%
+ {\letbeundefined{\??mk#1\c!coupling}}
+
+\def\couplemarking[#1]#2[#3]% couple 1 to 2 (this macro is not really needed)
+ {\setvalue{\??mk#1\c!coupling}{#3}}
+
+\def\relatemarking[#1]#2[#3]% define 1 as child of 2
+ {\dowithmarkcommandtwo\addmarkreset{#1}{#3}}
+
+\unexpanded\def\definerawmarking[#1]%
+ {\dododefinemarking[#1][#1]%
+ \getgparameters[\??mk#1][\c!limittext=]} % global !
+
+% \decouplemarking[#1]% % no coupling with sections
+
+\def\fastresetmarker#1%
+ {\ifcsname\??mk#1\s!parent\endcsname
+ \dowithmarkcommandone\resetmark{#1}%
+ \fi}
+
+\def\fastresetmarkerlist[#1]%
+ {\normalexpanded{\noexpand\rawprocesscommalist[#1]}\fastresetmarker}
+
+\def\resetmarking
+ {\dosingleargument\doresetmarking}
+
+\def\doresetmarking[#1]%
+ {\processcommalist[#1]\fastresetmarker}
+
+%D Used elsewhere:
+
+\let\nomarking\empty
+
+%D Basic fetching:
+
+\letvalue{\??mk::\??mk::\v!previous}\firstoffourarguments
+\letvalue{\??mk::\??mk::\v!first }\secondoffourarguments
+\letvalue{\??mk::\??mk::\v!last }\thirdoffourarguments
+\letvalue{\??mk::\??mk::\v!current }\fourthoffourarguments
+
+\letvalue{\??mk\??mk\v!previous}\gettopmark
+\letvalue{\??mk\??mk\v!first }\getfirstmark
+\letvalue{\??mk\??mk\v!last }\getbotmark
+\letvalue{\??mk\??mk\v!current }\getcurrentmark
+
+\letvalue{\??mk\??mk\v!column:\v!first}\getsplitfirstmark
+\letvalue{\??mk\??mk\v!column:\v!last }\getsplitbottommark
+
+\def\fetchmark[#1]#2[#3]% % expandable / never use \unexpanded
+ {\ifcsname\??mk::#1\endcsname % saved mark
+ \markingparameter{#1}\c!filtercommand{\csname\??mk::\??mk::#3\@EA\@EA\@EA\endcsname\csname\??mk::#1\endcsname}%
+ \else\ifcsname\??mk#1\s!parent\endcsname % real mark
+ \markingparameter{#1}\c!filtercommand{\expandafter\dowithmarkcommandone\csname\??mk\??mk#3\endcsname{#1}}%
+ \fi\fi}
+
+\def\fetchtwomarks[#1]%
+ {\dofetchtwomarks[#1][#1]}
+
+\def\fetchallmarks[#1]%
+ {\dofetchallmarks[#1][#1]}
+
+\def\dofetchtwomarks[#1][#2]% class class:tag
+ {\doifsomething{\fetchmark[#2][\v!first]}
+ {\fetchmark[#2][\v!first]%
+ \doifsomething{\fetchmark[#2][\v!last]}
+ {\doifnot{\fetchmark[#2][\v!first]}{\fetchmark[#2][\v!last]}
+ {\markingparameter{#1}\c!separator\fetchmark[#2][\v!last]}}}}
+
+\def\dofetchallmarks[#1][#2]%
+ {\doifsomething{\fetchmark[#2][\v!first]}
+ {\doifsomething{\fetchmark[#2][\v!previous]}
+ {\doifnot{\fetchmark[#2][\v!previous]}{\fetchmark[#2][\v!first]}
+ {\fetchmark[#2][\v!previous]\markingparameter{#1}\c!separator}}}%
+ \fetchtwomarks[#1][#2]}
+
+% \newtoks \everymarking
+
+% \def\Interesting{\doifmodeelse{*\v!marking}{Interesting}{Boring}}
+% \setupheadertexts[chapter]
+% \starttext
+% \chapter{This Is \Interesting}
+% \stoptext
+
+\def\markingnomarking#1{\splitsequence{\markingparameter{#1}\c!limittext}} % #2
+
+\def\dogetmarking[#1][#2][#3]%
+ {\doif{\markingparameter{#1}\c!state}\v!start
+ {\bgroup
+ \setsystemmode\v!marking
+ \the\everymarking
+ \def\nomarking{\markingnomarking{#1}}% just for good old times, might disappear
+ \ifthirdargument
+ \dodogetmarking{#3}{#1}{#1:#2}{#3}%
+ \else
+ \dodogetmarking{#2}{#1}{#1}{#2}%
+ \fi
+ \egroup}}
+
+\def\dodogetmarking#1#2#3#4% to be made faster
+ {\processaction % slow
+ [#1]
+ [ \v!both=>{\dofetchtwomarks[#2][#3]},
+ \v!all=>{\dofetchallmarks[#2][#3]},
+ \s!default=>{\fetchmark[#3][\v!first]},
+ \s!unknown=>{\fetchmark[#3][#4]}]}
+
+\def\nogetmarking[#1][#2][#3]%
+ {}
+
+\unexpanded\def\getmarking
+ {\dotripleargument\dogetmarking}
+
+\let\setsomemark\setmark
+
+\def\setmarking
+ {\dosingleargument\dosetmarking}
+
+\def\dosetmarking[#1]#2%
+ {\ifcsname\??mk#1\s!parent\endcsname
+ \begingroup
+ \doifelse{\markingparameter{#1}\c!expansion}\v!yes\expandmarkstrue\expandmarksfalse
+ \dowithmarkcommandone\setsomemark{#1}{#2}%
+ \endgroup
+ \fi}
+
+\let\marking\setmarking
+
+% to be adapted for mkiv:
+%
+% this version can be used when a page is built up in steps without
+% feedback of the otr'd list to the mvl (i.e.\ a page made of pages,
+% as in column sets where content is buffered)
+
+% reset at begin
+% preset before page
+% bubble in column
+% refresh at end
+
+% marks is a kind of toks, so maybe we need a low level \the\marks
+%
+% use \normalunexpanded here
+
+\def\refreshsavedmark[#1][#2]% mark tag (packing saves many hash entries)
+ {\setxvalue{\??mk::#1:#2}%
+ {{\@EA\ifx\csname\??mk::#1:pp\endcsname\relax
+ % empty
+ \else
+ \csname\??mk::#1:pp\endcsname
+ \fi}%
+ {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax
+ \fetchmark[#1][\v!first]%
+ \else
+ \csname\??mk::#1:ff\endcsname
+ \fi}%
+ {\fetchmark[#1][\v!last]}%
+ {\fetchmark[#1][\v!current]}}%
+ \setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!first]}%
+ \letgvalue{\??mk::#1:ff}\relax
+ }
+
+\def\bubblesavedmark[#1][#2]% no packing (not now, maybe make a six-pack later)
+ {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax
+ \setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}%
+ \fi}
+
+\def\resetsavedmark[#1][#2]% mark tag
+ {\doifelsenothing{\fetchmark[#1][\v!previous]}
+ {\letgvalue{\??mk::#1:pp}\relax}
+ {\setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!previous]}}%
+ \doifelsenothing{\fetchmark[#1][\v!first]}
+ {\letgvalue{\??mk::#1:ff}\relax}
+ {\setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}}%
+ \letgvalue{\??mk::#1:#2}\emptysavedmark}
+
+\def\presetsavedmark[#1][#2]% mark tag
+ {\letgvalue{\??mk::#1:#2}\emptysavedmark}
+
+\def\emptysavedmark{{}{}{}{}}
+
+% new (can be used in column sets)
+%
+% \getsavedmarking[M][previous]
+% \getsavedmarking[M][first]
+% \getsavedmarking[M][last]
+
+\def\getsavedmarking
+ {\dodoubleargument\dogetsavedmarking}
+
+\def\dogetsavedmarking[#1][#2]%
+ {\doifelse{#2}\v!previous
+ {\getmarking[#1][1][\v!previous]}
+ {\doifelse{#2}\v!first
+ {\getmarking[#1][1][\v!first]}
+ {\getmarking[#1][\v!last]}}}
+
+%D And then \unknown\ we had a chaptertitle packaged in a
+%D makeup environment. And we don't want to loose marks there!
+
+\newbox\collectedmarks
+
+\def\flushmarks % use with care to avoid empty pages
+ {\ifvoid\collectedmarks\else\unhbox\collectedmarks\fi}
+
+\def\postponemarks
+ {\let\setsomemark\postponemark}
+
+\def\postponemark#1#2%
+ {\global\setbox\collectedmarks\hbox{\unhbox\collectedmarks\setmark{#1}{#2}}}
+
+\protect \endinput
+
+% todo: make it work in balancing
+%
+% \definemarking[vers][]
+% \setupheadertexts
+% [\doiftext{\getmarking[vers][first]}
+% {\doiftextelse{\getmarking[vers][column:last]}
+% {\getmarking[vers][first] -- \getmarking[vers][column:last]}
+% {\getmarking[vers][first]}}]
+% \starttext
+% \startcolumns[n=2,balance=no]
+% \dorecurse{10}{\normalexpanded{\noexpand\marking[vers]{\recurselevel}} \recurselevel:\dorecurse{4}{\input ward } \endgraf}
+% \stopcolumns
+% \stoptext
diff --git a/tex/context/base/strc-mat.lua b/tex/context/base/strc-mat.lua
new file mode 100644
index 000000000..291cc8845
--- /dev/null
+++ b/tex/context/base/strc-mat.lua
@@ -0,0 +1,51 @@
+if not modules then modules = { } end modules ['strc-mat'] = {
+ version = 1.001,
+ comment = "companion to strc-mat.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+structure = structure or { }
+structure.helpers = structure.helpers or { }
+structure.lists = structure.lists or { }
+structure.lists.enhancers = structure.lists.enhancers or { }
+structure.sections = structure.sections or { }
+structure.helpers = structure.helpers or { }
+structure.formulas = structure.formulas or { }
+
+local lists = structure.lists
+local sections = structure.sections
+local floats = structure.floats
+local helpers = structure.helpers
+local formulas = structure.formulas
+
+-- maybe we want to do clever things with formulas, the store might go away
+
+local formuladata = { }
+
+function formulas.store(data)
+ formuladata[#formuladata+1] = data
+ tex.write(#formuladata)
+end
+
+function formulas.current()
+ return formuladata[#formuladata]
+end
+
+function helpers.formulanumber(data,spec)
+ if data then
+ local formulanumber = data.formulanumber
+ if formulanumber then
+ sections.number(data,spec,"formulanumber","formulanumber",'number')
+ end
+ end
+end
+
+function formulas.simplify(entry)
+ return helpers.simplify(table.copy(entry or formuladata[#formuladata]))
+end
+
+function lists.formulanumber(name,n,spec)
+ helpers.formulanumber(lists.result[n])
+end
diff --git a/tex/context/base/strc-mat.mkii b/tex/context/base/strc-mat.mkii
new file mode 100644
index 000000000..0d32cb298
--- /dev/null
+++ b/tex/context/base/strc-mat.mkii
@@ -0,0 +1,2925 @@
+%D \module
+%D [ file=strc-mat,
+%D version=2006.03.27, % 1998.12.07
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Math Fundamentals,
+%D author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan},
+%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.
+
+% engels maken
+
+\writestatus{loading}{ConTeXt Structure Macros / Math Fundamentals}
+
+\unprotect
+
+% \startlines
+% $\mathopnolimits{\rm d}x$
+% $\mathopnolimits{\kern\zeropoint \rm d}x$
+% $\puremathcomm{nolop}{\rm d}x$
+% $\puremathcomm{nolop}{\kern\zeropoint\rm d}x$
+% \blank
+% $\puremathcomm{nolop}{\mr d}x$
+% $\puremathcomm{nolop}{\kern\zeropoint\mr d}x$
+% $\mathop{\kern\zeropoint\mr d}x$
+% $\mathopnolimits{\kern\zeropoint d}x$
+% \stoplines
+
+% \definemessageconstant{math}
+
+% % messages moved
+
+% \def\invalidmathcommand#1{\showmessage\m!math1{#1}}
+
+% \appendtoks
+% \def\eqno {\invalidmathcommand{\string\eqno }}%
+% \def\leqno{\invalidmathcommand{\string\leqno}}%
+% \to \everydisplay
+
+% \appendtoks
+% \let\eqno\normaleqno
+% \let\leqno\normaleqno
+% \to \everymath
+
+% \placeformula\startformula
+% H(K|M,C) = H(K|C) - H(M|C)\eqno{\hbox{(\in{}[eq:keyapp])}}
+% \stopformula
+
+\unexpanded\def\mathortext
+ {\ifmmode
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% \defineactivecharacter _ {\mathortext{_}{\_}} text_text $a^2$
+
+% force text mode, will be overloaded later
+
+\ifx\text\undefined \let\text\hbox \fi
+
+\newdimen\lastlinewidth
+
+% does not work at all
+%
+% \def\setlastlinewidth
+% {\resetlastlinewidth
+% \ifmmode\else\ifhmode\else\ifoptimizedisplayspacing
+% \bgroup
+% \forgetdisplayskips
+% $$\global\lastlinewidth\predisplaysize$$
+% \vskip-\baselineskip
+% \egroup
+% \fi\fi\fi}
+
+% test \par \dorecurse{10}{test } \moveformula \startformula test \stopformula test \endgraf
+% test \par \dorecurse{10}{test } \startformula test \stopformula test \endgraf
+% \dorecurse{30}{\bpar \dorecurse\recurselevel{test } \epar \startformula formula \stopformula}
+
+\def\setlastlinewidth
+ {\resetlastlinewidth
+ \ifoptimizedisplayspacing\ifmmode\else\ifhmode
+ \bgroup
+ \forgetdisplayskips
+ \displaywidowpenalty\widowpenalty % brrr, else widowpenalty does not work
+ \everymath \emptytoks
+ \everydisplay\emptytoks
+ $$\strut\global\lastlinewidth\predisplaysize$$
+ \vskip-\lineheight
+ \vskip\zeropoint
+ \egroup
+ \fi\fi\fi}
+
+\def\resetlastlinewidth
+ {\global\lastlinewidth\zeropoint\relax}
+
+% not here: \appendtoks \setlastlinewidth \to \everyendofpar
+
+%D moved from main-001
+
+%\def\EveryMathPar{\EveryPar}
+%
+%\newevery \everymath \EveryMath
+
+\abovedisplayskip = \zeropoint
+\abovedisplayshortskip = \zeropoint % evt. 0pt minus 3pt
+\belowdisplayskip = \zeropoint
+\belowdisplayshortskip = \zeropoint % evt. 0pt minus 3pt
+
+\predisplaypenalty = \zerocount
+\postdisplaypenalty = \zerocount % -5000 gaat mis, zie penalty bij \paragraaf
+
+% we don't use the skip's
+
+\def\displayskipsize#1#2% obsolete
+ {\ifdim\ctxparskip>\zeropoint
+ #1\ctxparskip\!!plus#2\ctxparskip\!!minus#2\ctxparskip\relax
+ \else
+ #1\lineheight\!!plus#2\lineheight\!!minus#2\lineheight\relax
+ \fi}
+
+\def\displayskipfactor {1.0} % obsolete
+\def\displayshortskipfactor {0.8} % obsolete
+\def\displayskipgluefactor {0.3} % obsolete
+\def\displayshortskipgluefactor {0.2} % obsolete
+
+\def\abovedisplayskipsize% obsolete
+ {\displayskipsize\displayskipfactor\displayskipgluefactor}
+
+\def\belowdisplayskipsize% obsolete
+ {\displayskipsize\displayskipfactor\displayskipgluefactor}
+
+\def\abovedisplayshortskipsize% obsolete
+ {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor}
+
+\def\belowdisplayshortskipsize% obsolete
+ {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor}
+
+\def\forgetdisplayskips % to do
+ {\abovedisplayskip \zeropoint
+ \belowdisplayskip \zeropoint
+ \abovedisplayshortskip\zeropoint
+ \belowdisplayshortskip\zeropoint}
+
+\definenumber % \definelabel
+ [\v!formula]
+ [\c!text=\v!formula,
+ \c!way=\@@fmway,
+ \c!blockway=\@@fmblockway,
+ \c!location=\v!intext,
+ \c!conversion=\@@fmconversion]
+
+\def\setupformulas
+ {\dodoubleargument\getparameters[\??fm]}
+
+\newconditional\handleformulanumber
+\newconditional\incrementformulanumber
+
+\def\formuladistance{\formulaparameter\c!distance}
+
+\def\doformulareference#1#2%
+ {\doifsomething{#1}{\doifnotinset{#1}{+,-}{\rawreference\s!for{#1}{#2}}}}
+
+\def\dododoformulanumber#1#2#3#4% (#1,#2)=outer(ref,sub) (#3,#4)=inner(ref,sub)
+ {\hbox\bgroup
+ \ifconditional\handleformulanumber
+ \ifconditional\incrementformulanumber
+ \incrementnumber[\v!formula]%
+ \fi
+ \makesectionnumber[\v!formula]%
+ \setbox0\hbox{\ignorespaces#2\unskip}%
+ \ifdim\wd0>\zeropoint
+ \edef\hetsubnummer{\@@fnseparator#2}%AM: was \edef\hetsubnummer{#2}%
+ \else
+ \let\hetsubnummer\empty
+ \fi
+ \doformulareference{#1}{\composedsectionnumber\hetsubnummer}%
+ \setbox0\hbox{\ignorespaces#4\unskip}%
+ \ifdim\wd0>\zeropoint
+ \edef\hetsubnummer{\@@fnseparator#4}%AM: was \edef\hetsubnummer{#4}%
+ \fi
+ \doformulareference{#3}{\composedsectionnumber\hetsubnummer}%
+ \doflushformulalistentry{\composedsectionnumber\hetsubnummer}%
+ \rm % nodig ?
+ \doif{\formulaparameter\c!location}\v!right{\hskip\formuladistance}%
+ \@@fmnumbercommand
+ {\dostartattributes\??fm\c!numberstyle\c!numbercolor
+ \strut
+ \@@fmleft
+ \preparefullnumber\??fm\composedsectionnumber\preparednumber
+ \labeltexts\v!formula
+ {\ignorespaces\preparednumber\ignorespaces\hetsubnummer\unskip}%
+ \@@fmright
+ \dostopattributes}%
+ \doif{\formulaparameter\c!location}\v!left{\hskip\formuladistance}%
+ \fi
+ \egroup}
+
+\def\dodoformulanumber[#1][#2][#3]%
+ {\doquadruplegroupempty\dododoformulanumber{#1}{#2}{#3}}
+
+\def\doformulanumber
+ {\dotripleempty\dodoformulanumber}
+
+\setvalue{\e!start\v!formula}{\dostartformula{}}
+\setvalue{\e!stop \v!formula}{\dostopformula}
+
+\def\definieerformule
+ {\dodoubleempty\dodefinieerformule}
+
+\def\dodefinieerformule[#1][#2]%
+ {\doifsomething{#1}
+ {\copyparameters
+ [\??fm#1][\??fm]
+ [\c!spacebefore,\c!spaceafter,\c!grid,
+ \c!leftmargin,\c!rightmargin,\c!margin,
+ \c!indentnext,\c!alternative,
+ \c!strut,\c!align,\c!distance]%
+ \setupformulas[#1][#2]%
+ \setvalue{\e!start#1\v!formula}{\dostartformula{#1}}%
+ \setvalue{\e!stop #1\v!formula}{\dostopformula}}}
+
+\newtoks \everysetupformulas \relax % we need a hook for extensions in modules
+
+\def\setupformulas
+ {\dodoubleempty\dosetupformulas}
+
+\def\dosetupformulas[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??fm#1][#2]%
+ \else
+ \getparameters[\??fm][#1]%
+ \fi
+ \the\everysetupformulas}
+
+\def\formulaparameter#1%
+ {\csname\??fm\currentformula#1\endcsname}
+
+\setupformulas
+ [\c!way=\@@nrway,
+ \c!blockway=,
+ \c!sectionnumber=\@@nrsectionnumber,
+ \c!conversion=\v!numbers,
+ \c!location=\v!right,
+ \c!left=(,
+ \c!right=),
+ \c!spacebefore=,
+ \c!spaceafter=\@@fmspacebefore,
+ \c!leftmargin=\!!zeropoint,
+ \c!rightmargin=\!!zeropoint,
+ \c!margin=,
+ \c!indentnext=\v!no,
+ \c!alternative=\s!default,
+ \c!align=,
+ \c!strut=\v!no,
+ \c!separator=\@@koseparator,
+ \c!distance=1em]
+
+\def\currentformula {}
+\def\predisplaysizethreshhold{2em} % was 3em
+
+\def\leftdisplayskip {\leftskip}
+\def\rightdisplayskip {\rightskip}
+\def\leftdisplaymargin {\formulaparameter\c!leftmargin}
+\def\rightdisplaymargin {\formulaparameter\c!rightmargin}
+\def\displaygridsnapping{\formulaparameter\c!grid}
+
+\def\beforedisplayspace
+ {\doifnot{\formulaparameter\c!spacebefore}\v!none{\blank[\formulaparameter\c!spacebefore]}}
+
+\def\afterdisplayspace
+ {\doifnot{\formulaparameter\c!spaceafter }\v!none{\blank[\formulaparameter\c!spaceafter ]}}
+
+\def\setpredisplaysize#1%
+ {\predisplaysize#1\relax
+ \ifdim\predisplaysize<\maxdimen
+ \ifdim\predisplaysize>\zeropoint
+ \advance\predisplaysize \predisplaysizethreshhold
+ \fi
+ \advance\predisplaysize \displayindent % needed ?
+ \ifdim\predisplaysize>\hsize
+ \predisplaysize\hsize
+ \fi
+ \else
+ \predisplaysize\zeropoint
+ \fi}
+
+\def\setdisplaydimensions
+ {\displayindent\leftdisplayskip
+ \advance\displayindent\leftdisplaymargin
+ \displaywidth\hsize
+% \setlocalhsize
+% \displaywidth\localhsize
+ \ifdim\hangindent>\zeropoint
+ \advance\displayindent\hangindent
+ \else
+ \advance\displaywidth\hangindent
+ \fi
+ \advance\displaywidth-\displayindent
+ \advance\displaywidth-\rightdisplayskip
+ \advance\displaywidth-\rightdisplaymargin
+ \hsize\displaywidth} % new, else overfull in itemize
+
+\newif\ifoptimizedisplayspacing
+
+\def\dostartformula#1%
+ {\dodoubleempty\dodostartformula[#1]}
+
+\newskip\formulaparskip
+\newskip\formulastrutht
+\newskip\formulastrutdp
+
+% hm, invoke otr in hmode in order to move skips to mvl, could be an option
+
+%D \startbuffer
+%D \startformula[9pt] x = 1 \stopformula
+%D \startformula[7pt] x = 1 \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\dodostartformula[#1][#2]% setting leftskip adaption is slow !
+ {% todo: test first
+ %
+ % \ifdim\lastskip>\zeropoint
+ % \resetlastlinewidth % else problems with in between stuff without \epar
+ % \fi
+ \bgroup % HERE
+ \the\everybeforedisplayformula
+ \formulaparskip\parskip
+ \formulastrutdp\strutdepth
+ \formulastrutht\strutheight
+ \switchtoformulabodyfont[#2]%
+ \parskip\formulaparskip
+ \def\currentformula{#1}%
+ % may look better in itemizations
+ \doif{\formulaparameter\c!option}\v!middle
+ {\def\leftdisplayskip{\zeropoint}%
+ \def\rightdisplayskip{\zeropoint}}%
+ % this was an experiment
+ \doifsomething{\formulaparameter\c!margin}% so we test first
+ {\dosetleftskipadaption{\formulaparameter\c!margin}%
+ \edef\leftdisplaymargin{\the\leftskipadaption}}% overloaded
+ \long\def\dostartformula##1{\bgroup\let\dostopformula\egroup}%
+ \freezedimenmacro\leftdisplayskip
+ \freezedimenmacro\rightdisplayskip
+ \freezedimenmacro\leftdisplaymargin
+ \freezedimenmacro\rightdisplaymargin
+ \freezedimenmacro\predisplaysizethreshhold
+ \forgetdisplayskips
+ \ifoptimizedisplayspacing
+ \ifdim\lastlinewidth>\zeropoint
+ \abovedisplayshortskip-\strutht\relax
+ \fi
+ \else
+ \resetlastlinewidth
+ \fi
+ \getvalue{\e!start\formulaparameter\c!alternative\v!formula}}
+
+\def\switchtoformulabodyfont{\switchtobodyfont}
+
+\setvalue{\v!formula}{\dosingleempty\doformula}
+
+\def\doformula[#1]#2%
+ {\begingroup
+ \switchtoformulabodyfont[#1]%
+ % not : \def\doformula[##1]##2{\mathematics{##2}}%
+ \mathematics{#2}%
+ \endgroup}
+
+\let\doplaceformulanumber\empty
+
+\def\dostopformula
+ {\doplaceformulanumber
+ \getvalue{\e!stop\formulaparameter\c!alternative\v!formula}%
+ \resetlastlinewidth
+ \nonoindentation
+ \dochecknextindentation{\??fm\currentformula}%
+ \egroup
+ \hangafter\minusone % added for side floats
+ \hangindent\zeropoint % added for side floats
+ \setfalse\handleformulanumber
+ \dorechecknextindentation} % here ?
+
+\newif\ifinformula
+
+\def\startdisplaymath
+ {\ifgridsnapping
+ \beforedisplayspace
+ \snapmathtogrid\vbox
+ \bgroup
+ \informulatrue
+ %\forgetall % breaks side floats
+ \else
+ \bgroup
+ \parskip\formulaparskip % ! !
+ \informulatrue
+ %\forgetall % otherwise backgrounds fail
+ \ifdim\lastskip<\zeropoint\else
+ \par
+ \ifvmode \ifdim\parskip>\zeropoint\relax
+ \whitespace \vskip-\parskip % kind of forces and cancels again
+ \fi \fi
+ \fi
+ \doif\displaygridcorrection{-\v!top}{\kern-\strutht}% new, currently only option/default
+ \beforedisplayspace
+ \par
+ \ifvmode
+ \ifindentfirstparagraph % tricky, probably needs more testing
+ \prevdepth-\maxdimen % texbook pagina 79-80
+ % otherwise problems at the top of a page, don't remove:
+ \verticalstrut
+ \vskip-\struttotal
+ \vskip-\baselineskip
+ \fi
+ \fi
+ \fi
+ $$\setdisplaydimensions
+ \setpredisplaysize\lastlinewidth
+ \startinnermath}
+
+\def\stopdisplaymath
+ {\stopinnermath
+ $$%
+ \ifgridsnapping
+ \egroup
+ \afterdisplayspace
+ \else
+ \par\ifvmode\ifdim\parskip>\zeropoint\whitespace\vskip-\parskip\fi\fi
+ \afterdisplayspace
+ \egroup
+ \fi
+ \globallet\displaylinecorrection\empty
+ \gdef\displaygridcorrection{\displaygridsnapping}}
+
+\newif\ifclipdisplaymath \clipdisplaymathtrue
+\def\displaymathclipfactor{1.1}
+
+\def\snapmathtogrid % to do \dp
+ {\dowithnextbox
+ {\bgroup
+ \donefalse
+ \ifclipdisplaymath
+ \ifdim\nextboxht<\displaymathclipfactor\lineheight
+ \donetrue
+ \fi
+ \fi
+ \ifdone
+ \nextboxht\lineheight
+ \else
+ \getnoflines\nextboxht
+ \setbox\nextbox\vbox to \noflines\lineheight
+ {\vfill\flushnextbox\vfill}%
+ \setbox\nextbox\hbox{\lower\strutdepth\flushnextbox}%
+ \fi
+ \snaptogrid[\displaygridcorrection]\hbox{\flushnextbox}%
+ \egroup}}
+
+\def\displaygridcorrection{\displaygridsnapping}
+\let\displaygridcorrection\empty
+
+\def\moveformula
+ {\dosingleempty\domoveformula}
+
+\def\domoveformula[#1]% brr gaat mogelijk fout
+ {\iffirstargument
+ \xdef\displaygridcorrection{#1}%
+ \else
+ \gdef\displaygridcorrection{-\v!top}% handy with short preline
+ \fi
+ \globallet\displaylinecorrection\displaygridcorrection}
+
+\let\startinnermath\empty
+\let\stopinnermath \empty
+
+\def\defineformulaalternative
+ {\dotripleargument\dodefineformulaalternative}
+
+\def\dodefineformulaalternative[#1][#2][#3]%
+ {\setvalue{\e!start#1\v!formula}{#2}%
+ \setvalue{\e!stop #1\v!formula}{#3}}
+
+\defineformulaalternative[\s!default][\startdisplaymath][\stopdisplaymath]
+
+% sp = single line paragraph sd = single line display
+% mp = multi line paragraph md = multy line display
+
+\defineformulaalternative[single][\startdisplaymath][\stopdisplaymath]
+\defineformulaalternative[multi] [\startdisplaymath][\stopdisplaymath]
+
+\definieerformule
+ [sp]
+ [\c!spacebefore=\v!none,\c!spaceafter=\v!none,
+ \c!indentnext=\v!no,
+ \c!alternative=single]
+
+\definieerformule
+ [sd]
+ [\c!spacebefore=\v!none,\c!spaceafter=\v!none,
+ \c!indentnext=\v!yes,
+ \c!alternative=single]
+
+\definieerformule
+ [mp]
+ [\c!indentnext=\v!no,
+ \c!alternative=multi]
+
+\definieerformule
+ [md]
+ [\c!indentnext=\v!yes,
+ \c!alternative=multi]
+
+% \defineformulaalternative[multi][\begindmath][\enddmath]
+%
+% \fakewords{20}{40}\epar
+% \placeformula {a} $$ \fakespacingformula $$
+% \fakewords{20}{40}\epar
+% \placeformula {b} \startformule \fakespacingformula \stopformule
+% \placeformula {b} \startformule \fakespacingformula \stopformule
+% \fakewords{20}{40}\epar
+% \placeformula {c} \startmdformule \fakespacingformula \stopmdformule
+% \placeformula {c} \startmdformule \fakespacingformula \stopmdformule
+% \fakewords{20}{40}\epar
+% \placeformula {d} \startmpformule \fakespacingformula \stopmpformule
+% \placeformula {d} \startmpformule \fakespacingformula \stopmpformule
+% \fakewords{20}{40}\epar
+% \placeformula {e} \startsdformule \fakespacingformula \stopsdformule
+% \placeformula {e} \startsdformule \fakespacingformula \stopsdformule
+% \fakewords{20}{40}\epar
+% \placeformula {f} \startspformule \fakespacingformula \stopspformule
+% \placeformula {f} \startspformule \fakespacingformula \stopspformule
+% \fakewords{20}{40}
+
+\def\placeformula
+ {\settrue\incrementformulanumber
+ \dodoubleempty\doplaceformula}
+
+\def\placesubformula
+ {\setfalse\incrementformulanumber
+ \dodoubleempty\doplaceformula}
+
+%D \macros
+%D {setupsubformulas, startsubformulas}
+%D
+%D New code (by Aditya Mahajan / cleaned up by HH, please check):
+
+% \setupsubformulas[conversion=romannumerals]
+%
+% \placeformula
+% \startsubformulas[Maxwell]
+% \startformulas
+% \startformula \startalign
+% \NC \nabla\cdot\bf E \NC = \frac{\rho}{\varepsilon_0} \NR[Maxwell 1]
+% \NC \nabla\times\bf E \NC = - \frac{\partial\bf B}{\partial t} \NR[Maxwell II]
+% \stopalign \stopformula
+% \startformula \startalign
+% \NC \nabla\cdot \bf B \NC = 0 \NR[Maxwell III]
+% \NC \nabla\times\bf B \NC = \mu_0{\bf j}+\varepsilon_0\mu_0\frac{\partial\bf E}{\partial t} \NR[Maxwell IV]
+% \stopalign \stopformula
+% \stopformulas
+% \stopsubformulas
+%
+% Maxwell : \in [Maxwell] and II : \in [Maxwell II]
+
+\def\setupsubformulas
+ {\dodoubleargument\getparameters[\??fn]}
+
+\definenumber[\v!formula*]
+
+\def\subformulaconversion % #1
+ {\getnumber[\v!formula*]\@@fnseparator\convertnumber\@@fnconversion} % #1
+
+\defineconversion[\v!subformula][\subformulaconversion]
+
+\def\startsubformulas
+ {\dosingleempty\dostartsubformulas}
+
+\def\dostartsubformulas[#1]%
+ {\incrementnumber[\v!formula]%
+ \makesectionnumber[\v!formula]%
+ \doflushformulalistentry{\composedsectionnumber}%
+ \doformulareference{#1}\composedsectionnumber
+ \expanded{\setupnumber
+ [\v!formula*]
+ [\c!start={\rawnumber[\v!formula]},
+ \c!way=\@@fmway,
+ \c!conversion=\@@fmconversion]}%
+ \bgroup
+ \savenumber[\v!formula]%
+ \setupformulas
+ [\c!conversion=\v!subformula,
+ \c!way=\v!by\v!text]%
+ \resetnumber
+ [\v!formula]}
+
+\def\stopsubformulas
+ {\restorenumber[\v!formula]%
+ \egroup
+ \resetlastlinewidth
+ \nonoindentation
+ \dochecknextindentation\??fn
+ \dorechecknextindentation} % here ?
+
+%D Named subformulas
+
+\def\startnamedsubformulas
+ {\dosingleempty\dostartnamedsubformulas}
+
+\def\dostartnamedsubformulas[#1]#2%
+ {\setformulalistentry{#2}%
+ \startsubformulas[#1]}
+
+\def\stopnamedsubformulas
+ {\stopsubformulas}
+
+\setupsubformulas
+ [\c!conversion=\v!character,
+ %\c!separator=\@@fmseparator,
+ \c!separator=,% AM: for compatibility with \placesubformula
+ \c!indentnext=\@@fmindentnext]
+
+%D Experimental goodie:
+%D
+%D \startbuffer
+%D \placelist[formula][criterium=text] \blank[2*big]
+%D \placenamedformula[one]{first} \startformula a = 1 \stopformula \endgraf
+%D \placeformula \startformula a = 2 \stopformula \endgraf
+%D \placenamedformula {second} \startformula a = 3 \stopformula \endgraf
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\definelist[\v!formula]
+
+\global\let\doflushformulalistentry\gobbleoneargument
+
+\def\setformulalistentry#1%
+ {\gdef\doflushformulalistentry##1%
+ {\expanded{\writetolist[\v!formula]{##1}}{#1}%
+ \global\let\doflushformulalistentry\gobbleoneargument}}
+
+\def\placenamedformula
+ {\dosingleempty\doplacenamedformula}
+
+\def\doplacenamedformula[#1]#2%
+ {\iffirstargument
+ \def\next{\placeformula[#1]}%
+ \else
+ \let\next\placeformula
+ \fi
+ \setformulalistentry{#2}%
+ \next}
+
+%D The implementation of placement is a bit ugly:
+
+\def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
+ {\def\redoplaceformula
+ {\bgroup
+ \ifx\next\bgroup
+ \egroup \@EA\moreplaceformula % [ref]{}
+ \else
+ \let\nextnext$% no def
+ \ifx\next\nextnext
+ \egroup \@EAEAEA\dispplaceformula % [ref]$$
+ \else
+ \egroup \@EAEAEA\dodoplaceformula % [ref]\start
+ \fi
+ \fi[#1]{}}%
+ \futurelet\next\redoplaceformula}
+
+\long\def\moreplaceformula[#1]#2#3#4% #2 dummy #4 gobbles spaces
+ {\def\redoplaceformula
+ {\bgroup
+ \let\nextnext$% no def
+ \ifx\next\nextnext
+ \egroup \@EA\dispplaceformula % [ref]$$
+ \else
+ \egroup \@EA\dodoplaceformula % [ref]\start
+ \fi
+ [#1]{#3}}%
+ \futurelet\next\redoplaceformula#4}
+
+\let\startplaceformula\placeformula
+\let\stopplaceformula \relax
+
+\def\startformulas#1\stopformulas % new / to be internationalized
+ {\bgroup
+ \forgetdisplayskips
+ \startdisplaymath
+ \setlocalhsize
+ \long\def\startformula##1\stopformula
+ {\advance\scratchcounter\plusone}%
+ \scratchcounter\zerocount
+ #1% preroll
+ \ifcase\scratchcounter\else
+ \divide \hsize \scratchcounter
+ \fi
+ \hbox to \localhsize \bgroup
+ \hss
+ \def\normalstartformula{\vskip-\strutdepth$$}% i hate this
+ \def\normalstopformula {$$}%
+ \def\startformula {$\vcenter\bgroup\normalstartformula}%
+ \def\stopformula {\normalstopformula\egroup$\hss}%
+ #1%
+ \egroup
+ \stopdisplaymath
+ \egroup
+ \hangafter\minusone % added for side floats
+ \hangindent\zeropoint} % added for side floats
+
+\def\dispplaceformula[#1]#2$$#3$$%
+ {\dodoplaceformula[#1]{#2}\dostartformula{}#3\dostopformula}
+
+\let\donestedformulanumber\gobbletwoarguments
+
+\def\dodoplaceformula[#1]#2% messy, needs a clean up
+ {\doifelse{#1}{-}
+ {\setfalse\handleformulanumber}
+ {\doifelse{#2}{-}
+ {\setfalse\handleformulanumber}
+ {\settrue\handleformulanumber}}%
+ \ifconditional\handleformulanumber
+ \def\formulanumber
+ {%\global\let\subformulanumber\doformulanumber % no, bug
+ \doformulanumber[#1][#2]}%
+ \def\donestedformulanumber##1##2%
+ {\doifsomething{##1}
+ {\doifelse{##1}{+}{\doformulanumber[#1]}{\doformulanumber[##1]}[##2][]{}}}%
+ \def\subformulanumber
+ {\setfalse\incrementformulanumber
+ \formulanumber}%
+ \gdef\doplaceformulanumber
+ {\global\let\doplaceformulanumber\empty
+ \doifelse\@@fmlocation\v!left
+ {\normalleqno{\doformulanumber[#1][#2][]{}}}
+ {\normalreqno{\doformulanumber[#1][#2][]{}}}}%
+ \else
+ \def\formulanumber{\doformulanumber[#1][#2]}%
+ \let\donestedformulanumber\gobbletwoarguments
+ \let\subformulanumber\doformulanumber % was \global
+ \global\let\doplaceformulanumber\empty
+ \fi}
+
+%D We need a hook into the plain math alignment macros
+%D
+%D \starttyping
+%D \displaylines
+%D \eqalignno
+%D \eqalignno
+%D \stoptyping
+%D
+%D Otherwise we get a missing \type {$$} error reported.
+
+\def\resetdisplaymatheq
+ {\let\normalleqno\relax \let\leqno\relax
+ \let\normalreqno\relax \let\eqno \relax
+ \let\doplaceformulanumber\empty}
+
+%D The next code is derived from plain \TEX.
+
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+
+\newif\ifdt@p
+
+\def\displ@y
+ {\global\dt@ptrue
+ \openup\displayopenupvalue % was \openup\jot
+ \everycr
+ {\noalign
+ {\ifdt@p
+ \global\dt@pfalse
+ \ifdim\prevdepth>-\thousandpoint
+ \vskip-\lineskiplimit
+ \vskip\normallineskiplimit
+ \fi
+ \else
+ \penalty\interdisplaylinepenalty
+ \fi}}}
+
+\let\normaldispl@y\displ@y
+
+\def\displ@y{\resetdisplaymatheq\normaldispl@y}
+
+\def\m@th{\mathsurround\zeropoint} % obsolete
+
+%D Here we implement a basic math alignment mechanism. Numbers
+%D are also handled. The macros \type {\startinnermath} and
+%D \type {\stopinnermath} can be overloaded in specialized
+%D modules.
+
+\def\startinnermath
+ {\getvalue{\e!start\??fm\formulaparameter\c!align}}
+
+\def\stopinnermath
+ {\getvalue{\e!stop \??fm\formulaparameter\c!align}}
+
+\def\mathinnerstrut
+ {\doif{\formulaparameter\c!strut}\v!yes\strut}
+
+\long\def\defineinnermathhandler#1#2#3%
+ {\setvalue{\e!start\??fm#1}{#2}%
+ \setvalue{\e!stop \??fm#1}{#3}}
+
+\newif\iftracemath
+
+\def\mathhbox
+ {\iftracemath\ruledhbox\else\hbox\fi}
+
+\chardef\mathraggedstatus=0 % normal left center right
+\chardef\mathnumberstatus=0 % nothing normal shift_right
+\let\mathnumbercorrection\!!zeropoint
+
+\def\startmathbox#1%
+ {\hsize\displaywidth
+ \global\chardef\mathnumberstatus\plusone
+ \chardef\mathraggedstatus#1\relax
+ \let\mathnumbercorrection\!!zeropoint
+ \global\let\@eqno \empty \def\eqno {\gdef\@eqno }%
+ \global\let\@leqno\empty \def\leqno{\gdef\@leqno}%
+ % added
+ \let\normalreqno\eqno
+ \let\normalleqno\leqno
+ % added
+ \doplaceformulanumber
+ \setbox\scratchbox\mathhbox to \displaywidth\bgroup
+ \mathinnerstrut
+ $%
+ \displaystyle
+ \ifcase\mathraggedstatus\or\hfill\or\hfill\fi}
+
+\def\llappedmathno
+ {\ifcase\mathraggedstatus\or
+ \@eqno
+ \or
+ \llap{\@eqno}%
+ \or
+ \llap{\@eqno}%
+ \fi}
+
+\def\rlappedmathno
+ {\ifcase\mathraggedstatus\or
+ \rlap{\@leqno}%
+ \or
+ \rlap{\@leqno}%
+ \or
+ \@leqno
+ \fi}
+
+\def\stopmathbox
+ {$%
+ \ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi
+ \egroup
+ \setbox0\hbox{\unhcopy\scratchbox}%
+ \scratchdimen\wd0
+ \ifdim\scratchdimen>\displaywidth
+ \donetrue
+ \else
+ \donefalse
+ \fi
+ \hbox to \displaywidth\bgroup
+ \ifcase\mathnumberstatus
+ \box\scratchbox
+ \or
+ \ifx\@leqno\empty
+ \ifx\@eqno\empty
+ \box\scratchbox
+ \else
+ \ifdone
+ \vbox{\box\scratchbox\hbox to \displaywidth{\hss\llappedmathno}}%
+ \else
+ \hss\box\scratchbox\llappedmathno % hss makes room for number
+ \fi
+ \fi
+ \else
+ \ifdone
+ \vbox{\hbox to \displaywidth{\rlappedmathno\hss}\box\scratchbox}%
+ \else
+ \rlappedmathno\box\scratchbox\hss % hss makes room for number
+ \fi
+ \fi
+ \or
+ \hskip\mathnumbercorrection
+ \box\scratchbox
+ \hss
+ \else
+ \box\scratchbox
+ \fi
+ \egroup}
+
+\defineinnermathhandler\v!left {\startmathbox\plusone }{\stopmathbox}
+\defineinnermathhandler\v!middle {\startmathbox\plustwo }{\stopmathbox}
+\defineinnermathhandler\v!right {\startmathbox\plusthree}{\stopmathbox}
+\defineinnermathhandler\v!flushleft {\startmathbox\plusthree}{\stopmathbox}
+\defineinnermathhandler\v!center {\startmathbox\plustwo }{\stopmathbox}
+\defineinnermathhandler\v!flushright{\startmathbox\plusone }{\stopmathbox}
+
+%D [The examples below are in english and don't process in the
+%D documentation style, which will be english some day.]
+%D
+%D Normally a formula is centered, but in case you want to
+%D align it left or right, you can set up formulas to behave
+%D that way. Normally a formula will adapt is left indentation
+%D to the environment:
+%D
+%D \startbuffer
+%D \fakewords{20}{40}\epar
+%D \startitemize
+%D \item \fakewords{20}{40}\epar
+%D \placeformula \startformula \fakeformula \stopformula
+%D \item \fakewords{20}{40}\epar
+%D \stopitemize
+%D \fakewords{20}{40}\epar
+%D \stopbuffer
+%D
+%D % \getbuffer
+%D
+%D In the next examples we explicitly align formulas to the
+%D left (\type {\raggedleft}), center and right (\type
+%D {\raggedright}):
+%D
+%D \startbuffer
+%D \setupformulas[align=left]
+%D \startformula\fakeformula\stopformula
+%D \setupformulas[align=middle]
+%D \startformula\fakeformula\stopformula
+%D \setupformulas[align=right]
+%D \startformula\fakeformula\stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Or in print:
+%D
+%D % {\getbuffer}
+%D
+%D With formula numbers these formulas look as follows:
+%D
+%D \startbuffer
+%D \setupformulas[align=left]
+%D \placeformula \startformula\fakeformula\stopformula
+%D \setupformulas[align=middle]
+%D \placeformula \startformula\fakeformula\stopformula
+%D \setupformulas[align=right]
+%D \placeformula \startformula\fakeformula\stopformula
+%D \stopbuffer
+%D
+%D % {\getbuffer}
+%D
+%D This was keyed in as:
+%D
+%D \typebuffer
+%D
+%D When tracing is turned on (\type {\tracemathtrue}) you can
+%D visualize the bounding box of the formula,
+%D
+%D % {\tracemathtrue\getbuffer}
+%D
+%D As you can see, the dimensions are the natural ones, but if
+%D needed you can force a normalized line:
+%D
+%D \startbuffer
+%D \setupformulas[strut=yes]
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This time we get a more spacy result.
+%D
+%D % {\tracemathtrue\getbuffer}
+%D
+%D We will now show a couple of more settings and combinations
+%D of settings. In centered formulas, the number takes no space
+%D
+%D \startbuffer
+%D \setupformulas[align=middle]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+%D
+%D You can influence the placement of the whole box with the
+%D parameters \type {leftmargin} and \type {rightmargin}.
+%D
+%D \startbuffer
+%D \setupformulas[align=right,leftmargin=3em]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D
+%D \setupformulas[align=left,rightmargin=1em]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+%D
+%D You can also inherit the margin from the environment.
+%D
+%D \startbuffer
+%D \setupformulas[align=right,margin=standard]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+%D
+%D The distance between the formula and the number is only
+%D applied when the formula is left or right aligned.
+%D
+%D \startbuffer
+%D \setupformulas[align=left,distance=2em]
+%D \startformula \fakeformula \stopformula
+%D \placeformula \startformula \fakeformula \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer % {\tracemathtrue\getbuffer}
+
+%D \macros
+%D {big..}
+%D
+%D Because they are related to the bodyfontsize, we redefine
+%D some \PLAIN\ macros.
+
+\def\@@dobig#1#2%
+ {{\hbox{$\left#2\vbox\!!to#1\bodyfontsize{}\right.\nulldelimiterspace\zeropoint\relax\mathsurround\zeropoint$}}}
+
+\def\big {\@@dobig{0.85}}
+\def\Big {\@@dobig{1.15}}
+\def\bigg{\@@dobig{1.45}}
+\def\Bigg{\@@dobig{1.75}}
+
+%D \macros
+%D {bordermatrix}
+%D
+%D We already redefined \type {\bordermatrix} in \type
+%D {font-ini}.
+
+%D \macros
+%D {setuptextformulas}
+%D
+%D This command sets up in||line math. Most features deals
+%D with grid snapping and are experimental.
+
+\newevery \everysetuptextformulas \relax
+
+\def\setuptextformulas
+ {\dosingleempty\dosetuptextformulas}
+
+\def\dosetuptextformulas[#1]%
+ {\getparameters[\??mt][#1]%
+ \the\everysetuptextformulas}
+
+%D \macros
+%D {super, sub}
+%D
+%D \TEX\ uses \type{^} and \type{_} for entering super- and
+%D subscript mode. We want however a bit more control than
+%D normally provided, and therefore provide \type {\super}
+%D and \type{sub}.
+
+\global\let\normalsuper=^
+\global\let\normalsuber=_
+
+\newcount\supersubmode
+
+\newevery\everysupersub \EverySuperSub
+
+\appendtoks \advance\supersubmode \plusone \to \everysupersub
+
+\appendtoks
+ \gridsupsubstyle
+\to \everysupersub
+
+\appendtoks
+ \doifelse\@@mtsize\v!small
+ {\let\gridsupsubstyle \scriptscriptstyle
+ \let\gridsupsubbodyfont \setsmallbodyfont}%
+ {\let\gridsupsubstyle \scriptstyle
+ \let\gridsupsubbodyfont \relax}%
+\to \everysetuptextformulas
+
+\setuptextformulas
+ [\c!size=\v!normal]
+
+\def\dogridsupsub#1#2%
+ {\begingroup
+ \setbox\nextbox\iftracegridsnapping\ruledhbox\else\hbox\fi
+ {\gridsupsubbodyfont
+ $\strut^{\the\everysupersub#1}_{\the\everysupersub#2}$}%
+ \nextboxht\strutheight
+ \nextboxdp\strutdepth
+ \flushnextbox
+ \endgroup}
+
+\def\gridsupsub
+ {\ifconditional\crazymathsnapping
+ \ifgridsnapping
+ \@EAEAEA\dogridsupsub
+ \else
+ \@EAEAEA\normalsupsub
+ \fi
+ \else
+ \@EA\normalsupsub
+ \fi}
+
+\def\normalsupsub#1#2%
+ {^{\the\everysupersub#1}_{\the\everysupersub#2}}
+
+\appendtoks
+ \let\gridsupsubstyle \relax
+ \let\gridsupsubbodyfont\relax
+ \let\gridsupsub \normalsupsub
+\to \everydisplay
+
+\def\super#1{^{\the\everysupersub#1}}
+\def\suber#1{_{\the\everysupersub#1}}
+\def\supsub#1#2{\super{#1}\suber{#2}}
+\def\subsup#1#2{\suber{#1}\super{#2}}
+
+%\def\super#1{\gridsupsub{#1}{}} %
+%\def\suber#1{\gridsupsub{}{#1}} %
+%
+%\def\supsub#1#2{\gridsupsub{#1}{#2}}
+%\def\subsup#1#2{\gridsupsub{#2}{#1}}
+
+\def\gridsuper#1{\gridsupsub{#1}{}}
+\def\gridsuber#1{\gridsupsub{}{#1}}
+
+% \let\sup\super % math char
+% \let\sub\suber
+
+% test set:
+%
+% \startbuffer
+% \sform{x\frac{1}{2}}
+% \sform{x\sup{\frac{1}{2}} + x\sup{2} + 2}
+% \sform{x\supsub{\frac{1}{2}}{\frac{1}{2}} + x\sup{2} + 2}
+% \stopbuffer
+%
+% \typebuffer
+%
+% \startlines
+% \getbuffer
+% \stoplines
+%
+% \startbuffer
+% $x\frac{1}{2}$
+% $x\sup{\frac{1}{2}} + x^2 + 2$
+% $x\supsub{\frac{1}{2}}{\frac{1}{2}} + x^2 + 2$
+% \stopbuffer
+%
+% \typebuffer
+%
+% \start
+% \enablesupersub
+% \enableautomath
+% \startlines
+% \getbuffer
+% \stoplines
+% \stop
+
+%D \macros
+%D {enablesupersub,enablesimplesupersub}
+%D
+%D We can let \type {^} and \type {_} act like \type {\super}
+%D and \type {\sub} by saying \type {\enablesupersub}.
+
+\bgroup
+\catcode`\^=\@@active
+\catcode`\_=\@@active
+\gdef\enablesupersub
+ {\catcode`\^=\@@active
+ \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
+ \catcode`\_=\@@active
+ \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
+\egroup
+
+%D \macros
+%D {enableautomath}
+%D
+%D The next one can be dangerous, but handy in controlled
+%D situations.
+
+\bgroup \catcode`\$=\active
+
+\gdef\enableautomath
+ {\catcode`\$=\active
+ \def$##1${\snappedinlineformula{##1}}}
+
+% \gdef\enableautomath
+% {\catcode`\$=\active
+% \def${\doifnextcharelse$\doautodmath\doautoimath}%
+% \def\doautoimath##1${\snappedinlineformula{##1}}%
+% \def\doautodmath$##1$${\startformula##1\stopformula}}
+
+\egroup
+
+%D \macros
+%D {...}
+%D
+%D New and experimental: snapping big inline math!
+
+\newconditional\halfcrazymathlines % \settrue\halfcrazymathlines
+\newconditional\crazymathsnapping % \settrue\crazymathsnapping
+
+\appendtoks
+ \doifelse\@@mtgrid\v!yes \settrue\setfalse\crazymathsnapping
+ \doifelse\@@mtstep\v!halfline\settrue\setfalse\halfcrazymathlines
+\to \everysetuptextformulas
+
+\setuptextformulas
+ [\c!grid=\v!yes,
+ \c!step=\v!line]
+
+\newcount\crazymathhack
+
+\let\lastcrazymathline \!!zeropoint
+\let\lastcrazymathpage \!!zerocount
+\let\lastcrazymathprelines \!!zerocount
+\let\lastcrazymathpostlines\!!zerocount
+
+\def\crazymathtag{amh:\the\crazymathhack}
+\def\crazytexttag{\v!text:\lastcrazymathpage}
+
+\def\crazymathindent{\hskip\MPx\crazymathtag\hskip-\MPx\crazytexttag}
+
+\def\flushcrazymathbox
+ {\nextboxht\strutheight
+ \nextboxdp\strutdepth
+ \hbox{\iftracegridsnapping\ruledhbox\fi{\flushnextbox}}}
+
+% possible pdftex bug:
+%
+% \dorecurse{100}{gest \vadjust {\strut} \par} \page
+% \dorecurse{100}{gest \vadjust pre {\strut} \par} \page
+%
+% duplicate depth compensation with pre
+
+\def\snappedinlineformula
+ {\dosingleempty\dosnappedinlineformula}
+
+%D \starttabulate[|Tl|l|]
+%D \NC - \NC half lines \NC \NR
+%D \NC + \NC full lines \NC \NR
+%D \NC = \NC force \NC \NR
+%D \NC < \NC force, minus pre \NC \NR
+%D \NC > \NC force, minus post \NC \NR
+%D \stoptabulate
+
+\newif\if!!donee
+\newif\if!!donef
+
+\def\inlinemathmargin{1pt}
+
+\settrue\autocrazymathsnapping
+
+% FROM NOW ON, CHANGES AS OPTIONS
+
+% TODO: SKYLINE (PREV LINE POS SCAN)
+
+\def\dosnappedinlineformula[#1]#2%
+ {\ifvmode\dontleavehmode\fi % tricky
+ \strut % prevents funny space at line break
+ \begingroup % interesting: \bgroup can make \vadjust disappear
+ \ifconditional\crazymathsnapping
+ \ifgridsnapping
+ \ifx\pdftexversion\undefined
+ \donefalse
+ \else
+ \checktextbackgrounds % we need pos tracking, to be made less redundant
+ \donetrue
+ \fi
+ \else
+ \donefalse
+ \fi
+ \else
+ \donefalse
+ \fi
+ \!!doneafalse % forced or not auto
+ \!!donebfalse % too heigh
+ \!!donecfalse % too low
+ \!!donedfalse % less before
+ \!!doneefalse % less after
+ \ifdone
+ \setbox\nextbox\hbox{$#2$}%
+ \iftracegridsnapping
+ \setbox\nextbox\ruledhbox
+ {\incolortrue\localcolortrue
+ \backgroundline[gray]{\showstruts\strut\flushnextbox}}%
+ \fi
+ \def\docommand##1%
+ {\doif{##1}-{\settrue \halfcrazymathlines}%
+ \doif{##1}+{\setfalse\halfcrazymathlines}%
+ \doif{##1}={\!!doneatrue}%
+ \doif{##1}<{\!!donedtrue}%
+ \doif{##1}>{\!!doneetrue}}%
+ \processcommalist[#1]\docommand
+\if!!doneb
+ \if!!donec \else
+ \setfalse\halfcrazymathlines
+ \fi
+\else
+ \if!!donec
+ \setfalse\halfcrazymathlines
+ \fi
+\fi
+ \donefalse
+ \if!!donea
+ \donetrue
+\scratchdimen \nextboxht
+\advance\scratchdimen .5\lineheight
+\nextboxht\scratchdimen
+\scratchdimen \nextboxdp
+\advance\scratchdimen .5\lineheight
+\nextboxdp\scratchdimen
+ \else\ifdim\nextboxht>\strutht
+ \donetrue
+ \else\ifdim\nextboxdp>\strutdp
+ \donetrue
+ \fi\fi\fi
+ \ifconditional\autocrazymathsnapping \else \if!!donea \else
+ % don't compensate, just snap to strut
+ \donefalse
+ % signal for next else, snap line to strut
+ \!!doneatrue
+ \fi \fi
+ \fi
+ \ifdone
+ % analyze height
+ \scratchdimen\inlinemathmargin
+ \advance\scratchdimen \strutht
+ \ifdim\nextboxht<\scratchdimen \else \!!donebtrue \fi
+ % analyze depth
+ \scratchdimen\inlinemathmargin
+ \advance\scratchdimen \strutdp
+ \ifdim\nextboxdp<\scratchdimen \else \!!donectrue \fi
+ % analyzed or forced
+ \ifdone
+ \global\advance\crazymathhack\plusone
+ \donefalse
+ \ifnum\MPp\crazymathtag=\lastcrazymathpage\relax
+ \ifdim\MPy\crazymathtag=\lastcrazymathline\relax
+ \donetrue
+ \fi
+ \fi
+ \ifnum\MPp\crazymathtag=\zerocount \donefalse \fi
+ \ifdim\MPy\crazymathtag=\zeropoint \donefalse \fi
+ \ifdone
+ % same page and same line
+ \else
+ \global\let\lastcrazymathprelines \!!zerocount
+ \global\let\lastcrazymathpostlines\!!zerocount
+ \xdef\lastcrazymathpage{\MPp\crazymathtag}%
+ \xdef\lastcrazymathline{\MPy\crazymathtag}%
+ \fi
+ \if!!doneb
+ % \getrawnoflines\nextboxht
+ \scratchdimen\nextboxht
+ \advance\scratchdimen-\strutht
+ \getnoflines\scratchdimen
+ \if!!doned \advance\noflines\minusone \fi
+ \scratchcounter\noflines
+ \advance\noflines-\lastcrazymathprelines\relax
+ \ifnum\noflines>\zerocount
+ \xdef\lastcrazymathprelines{\the\scratchcounter}%
+ \scratchdimen\noflines\lineheight
+ \ifconditional\halfcrazymathlines
+ \advance\scratchdimen-.5\lineheight
+ \fi
+ \advance\scratchdimen-\strutdepth
+ \setbox\scratchbox\null
+ \wd\scratchbox2\bodyfontsize
+ \ht\scratchbox\scratchdimen
+ \dp\scratchbox\strutdepth
+ %%% top correction code (see below)
+ \normalvadjust pre
+ {%\allowbreak % sometimes breaks spacing
+ \forgetall
+ \crazymathindent
+ \iftracegridsnapping
+ \setbox\scratchbox\hbox
+ {\incolortrue\localcolortrue\green
+ \ruledhbox{\box\scratchbox}}%
+ \fi
+ \box\scratchbox
+ \endgraf
+ \nobreak}%
+ \else\ifnum\scratchcounter>\zerocount
+ \normalvadjust pre
+ {\nobreak}%
+ \fi\fi
+ \fi
+ \if!!donec
+ % \getrawnoflines\nextboxdp
+ \scratchdimen\nextboxdp
+ \advance\scratchdimen-\strutdp
+ \getnoflines\scratchdimen
+ \if!!donee \advance\noflines\minusone \fi
+ \scratchcounter\noflines
+ \advance\noflines-\lastcrazymathpostlines\relax
+ \ifnum\noflines>\zerocount
+ \donetrue
+ \else\ifnum\lastcrazymathpostlines=\zerocount
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \else
+ \donefalse
+ \fi
+ \ifdone
+ \xdef\lastcrazymathpostlines{\the\scratchcounter}%
+ \ifnum\lastcrazymathpostlines=\zerocount
+ \global\let\lastcrazymathpostlines\!!plusone
+ \fi
+ \hbox{\setposition\crazymathtag\flushcrazymathbox}%
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen-\lineheight
+ \advance\scratchdimen+\strutheight
+\ifdim\scratchdimen>\zeropoint \else
+ \scratchdimen=\strutheight % todo : test for half lines
+\fi
+ \ifconditional\halfcrazymathlines
+ \advance\scratchdimen-.5\lineheight
+ \fi
+ \setbox\scratchbox\null
+ \wd\scratchbox2\bodyfontsize
+ \ht\scratchbox\scratchdimen
+ \dp\scratchbox\strutdepth
+ \normalvadjust
+ {\forgetall
+ \crazymathindent
+ \iftracegridsnapping
+ \setbox\scratchbox\hbox
+ {\incolortrue\localcolortrue\color[blue]{\ruledhbox{\box\scratchbox}}}%
+ \fi
+ \box\scratchbox
+ \endgraf
+ % precaution: else we stick below the text bottom
+ \ifconditional\halfcrazymathlines
+ \allowbreak
+ \else
+ \vskip-\lineheight
+ \vskip \lineheight
+ \fi}%
+ \else
+ \hbox{\setposition\crazymathtag\flushcrazymathbox}%
+ \fi
+ \else
+ \flushcrazymathbox
+ \fi
+ \else\if!!donea
+ \flushcrazymathbox
+ \else
+ \mathematics{#2}%
+ \fi\fi
+ \endgroup}
+
+
+%%% top correction code
+%%%
+%%% correct for fuzzy top of page situations
+%
+% \scratchdimen\lastcrazymathprelines\lineheight
+% \advance\scratchdimen\MPy\crazymathtag
+% \advance\scratchdimen\lineheight
+% \advance\scratchdimen\topskip
+% \advance\scratchdimen-\strutheight
+% \dimen0=\MPy\crazytexttag
+% \advance\dimen0 \MPh\crazytexttag
+% \advance\scratchdimen-\dimen0\relax
+% % do we need correction at all
+% \ifdim\scratchdimen>\strutdepth\relax
+% \donefalse
+% \else\ifdim\scratchdimen<\zeropoint
+% \donefalse
+% \else
+% \donetrue
+% \fi\fi
+% % analysis done
+% \donefalse
+% \ifdone
+% \edef\crazymathcorrection{\the\scratchdimen}%
+% \advance\scratchdimen-\dp\scratchbox
+% \dp\scratchbox-\scratchdimen
+% \else
+% \let\crazymathcorrection\zeropoint
+% \fi
+%
+%%%
+%%% keep the previous code
+%%%
+
+\let\tform\mathematics
+\let\gform\snappedinlineformula
+
+% test set:
+%
+% \startbuffer
+% Crazy math \gform {1+x} or \gform {\dorecurse {100} {1+} 1 =
+% 101} and even gore crazy \gform {2^{2^2}_{1_1}}
+% again\dorecurse {20} { and again} \gform {\sqrt {\frac
+% {x^{5^5}} {\frac {1} {2}}}} even gore\dorecurse {50} { and
+% gore} \tform {\dorecurse {12} {\gform {\sqrt {\frac
+% {x^{5^5}} {3}}}+\gform {\sqrt {\frac {x^{5^5}} {\frac {1}
+% {2}}}}+}x=10}\dorecurse{20} { super crazy math}: \tform
+% {\dorecurse {30} {\gform {\sqrt {\frac {x^{5^5}} {3}}}+
+% \gform {\sqrt {\frac {x^{5^5}} {\frac {1} {2}}}}+ }x = 10},
+% and we're\dorecurse {20} { done}!
+% \stopbuffer
+%
+% \setupcolors[state=start] \setuppapersize[S6][S6]
+%
+% \showgrid \tracegridsnappingtrue \showstruts
+%
+% \starttext
+% \setuplayout[grid=yes,lines=15]\getbuffer \page
+% \setuplayout[grid=yes,lines=16]\getbuffer \page
+% \setuplayout[grid=yes,lines=17]\getbuffer \page
+% \setuplayout[grid=yes,lines=18]\getbuffer \page
+% \setuplayout[grid=yes,lines=19]\getbuffer \page
+% \stoptext
+%
+% test
+%
+% \startregels
+% \gform[<]{35 \cdot p^{\frac{3}{4}} = 70}
+% \gform{12{,}4 \cdot d^3 = 200}
+% \gform{a \cdot x^b}.
+% \gform{12x^6 \cdot \negative 3x^4}
+% \gform{\frac{12x^6}{\negative 3x^4}}
+% \gform{(4x^2)^3}
+% \gform{4x \sqrt{x} \cdot 3x^2}
+% \gform{\frac{2x^4}{4x \sqrt{x}}}
+% \gform{y = a \cdot x^b}.
+% \gform{y_1 = \frac{15x^2}{x}}
+% \gform{y_2 = x \cdot \sqrt{x}}
+% \gform{y_3 = \frac{6x^3}{x^2}}
+% \gform[<]{y_4 = \left(2x^2\right)^{\frac{1}{2}}}
+% \gform{y_1 = \frac{4x^5}{x^2}}
+% \gform{y_2 = 4 \cdot \sqrt{x}}
+% \gform{y_3 = 4x^3}
+% \gform{y_4 = \frac{100x}{\sqrt{x}}}
+% \gform[<]{y_5 = 4 \cdot x^{\frac{1}{2}}}
+% \gform{y_6 = \frac{1}{2} x \cdot 4x^2}
+% \gform{y_7 = 2 \cdot x^3}
+% \gform{y_8 = 100 \cdot x^{\frac{1}{2}}}
+% \gform{4x^8 \cdot 8x^3}
+% \gform{\frac{4x^8}{8x^3}}
+% \gform{\left(\negative3x^4\right)^3}
+% \gform{x^3 \sqrt{x} \cdot 3x^2}
+% \gform{\frac{6x^3}{x^2 \sqrt{x}}}
+% \gform{\frac{6}{2x^4}}
+% \gform{\frac{1}{3x^6}}
+% \gform{\frac{12x^8}{4x^{10}}}
+% \gform{\frac{4}{\sqrt{x}}}
+% \gform{\frac{1}{2x \sqrt{x}}}
+% \gform{\frac{2{,}25}{p} = 0{,}35}
+% \gform{4{,}50 + \frac{300}{k} = 4{,}70}
+% \gform{\frac{1200}{k+12} - 42 = 6}
+% \stopregels
+
+%D \macros
+%D {restoremathstyle}
+%D
+%D We can pick up the current math style by calling \type
+%D {\restoremathstyle}.
+
+\def\restoremathstyle
+ {\ifmmode
+ \ifcase\supersubmode
+ \textstyle
+ \or
+ \scriptstyle
+ \else
+ \scriptscriptstyle
+ \fi
+ \fi}
+
+%D \macros
+%D {mathstyle}
+%D
+%D If one want to be sure that something is typeset in the
+%D appropriate style, \type {\mathstyle} can be used:
+%D
+%D \starttyping
+%D \mathstyle{something}
+%D \stoptyping
+
+\def\mathstyle#1%
+ {\mathchoice
+ {\displaystyle #1}%
+ {\textstyle #1}%
+ {\scriptstyle #1}%
+ {\scriptscriptstyle#1}}
+
+%D Something similar can be used in the (re|)|definition
+%D of \type {\text}. This version is a variation on the one
+%D in the math module (see \type{m-math} and|/|or \type
+%D {m-newmat}).
+
+\unexpanded\def\mathtext
+ {\mathortext\domathtext\hbox}
+
+\def\domathtext#1%
+ {\mathchoice
+ {\dodomathtext\displaystyle\textface {#1}}%
+ {\dodomathtext\textstyle \textface {#1}}%
+ {\dodomathtext\textstyle \scriptface {#1}}%
+ {\dodomathtext\textstyle \scriptscriptface{#1}}}
+
+\def\dodomathtext#1#2#3% no \everymath !
+ %{\hbox{\everymath{#1}\switchtobodyfont [#2]#3}} % 15 sec
+ {\hbox{\everymath{#1}\setcurrentfontbody{#2}#3}} % 3 sec (no math)
+
+%D Because we may overload \type {\text} in other (structuring)
+%D macros, we say:
+
+\appendtoks \let\text\mathtext \to \everymathematics
+
+%D \macros
+%D {\definemathalignment, setupmathalignment, startmathalignment}
+%D
+%D Modules may provide additional alignment features. The following
+%D mechanisms are provided by the core.
+
+% n>1 #### needed, strange # interaction in recurse
+
+\def\presetdisplaymath{\displ@y} % some day i will relocate the plain stuff
+
+\def\buildeqalign
+ {\scratchtoks\emptytoks
+ \dorecurse{\mathalignmentparameter\c!m}
+ {\ifnum\recurselevel>\plusone
+ \appendtoks
+ \tabskip\mathalignmentparameter\c!distance&\tabskip\zeropoint
+ \to\scratchtoks
+ \fi
+ \expanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}%
+ \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax}
+ {\expanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}}%
+ \expanded{\scratchtoks{\the\scratchtoks\the\!!toksc}}}
+
+\def\forgetalign
+ {\tabskip\zeropoint\everycr\emptytoks}
+
+\let\firstineqalign\empty
+\let\nextineqalign \empty
+\let\leftofeqalign \empty
+\let\rightofeqalign\empty
+
+\def\mathineqalign#1{$\forgetalign\displaystyle{{}#1{}}$}
+\def\textineqalign#1{$\forgetalign#1$}
+
+\def\eqalign#1% why no halign here, probably because of displaywidth
+ {\null\,\vcenter
+ {\openup.25\bodyfontsize% was: \openup\jot
+ \mathsurround\zeropoint
+ \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##{}}$\hfil\crcr#1\crcr}%
+ }\,}
+
+% preamble is scanned for tabskips so we need the span to prevent an error message
+
+\chardef\eqalignmode\plusone
+
+\def\preparereqalignno
+ {\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ \ifnum\mathraggedstatus=\plusone
+ \!!toksc{\hfil&\span\textineqalign{##}\tabskip\zeropoint}%
+ \else\ifnum\mathraggedstatus=\plusthree
+ \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\span\textineqalign{##}\tabskip\zeropoint}%
+ \else
+ \!!toksc{\hfil\tabskip\centering&\llap{\span\textineqalign{##}}\tabskip\zeropoint}%
+ \fi\fi
+ \global\chardef\mathnumberstatus\zerocount
+ \buildeqalign
+ \presetdisplaymath
+ \tabskip\centering}
+
+\def\prepareleqalignno
+ {\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ \!!toksb{&\nextineqalign\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
+ % problem: number is handled after rest and so ends up in the margin
+ \ifnum\mathraggedstatus=\plusone
+ \!!toksc{\hfil&\kern-\displaywidth\rlap{\span\textineqalign{##}}\tabskip\displaywidth}%
+ \else\ifnum\mathraggedstatus=\plusthree
+ \!!toksc{\hfil\tabskip\zeropoint\!!plus 1\!!fill&\kern-\displaywidth\span\mrlap{\span\textineqalign{##}}\tabskip\displaywidth}%
+ \else
+ \!!toksc{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span\textineqalign{##}}\tabskip\displaywidth}%
+ \fi\fi
+ \global\chardef\mathnumberstatus\zerocount
+ \buildeqalign
+ \presetdisplaymath
+ \tabskip\centering}
+
+\def\dobotheqalignno#1#2%
+ {\ifmmode
+ \displ@y % \let\doplaceformulanumber\relax % strange hack
+ \vcenter\bgroup
+ \let\finishalignno\egroup
+ \else
+ \let\finishalignno\relax
+ \fi
+ #1%
+ \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA {\the\scratchtoks\crcr#2\crcr}%
+ \finishalignno}
+
+\def\dobothaligneqalignno#1%
+ {\ifmmode
+ \displ@y
+ \global\chardef\mathnumberstatus\plusone
+ \ifcase\mathraggedstatus
+ \def\finishalignno{\crcr\egroup}%
+ \else
+ % we're in a mathbox
+ \vcenter\bgroup
+ \def\finishalignno{\crcr\egroup\egroup}%
+ \fi
+ \fi
+ #1%
+ \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA \bgroup\the\scratchtoks\crcr}
+
+\def\mrlap#1%
+ {\setbox\scratchbox\hbox{#1}%
+ \ifdim\wd\scratchbox>\mathnumbercorrection
+ \xdef\mathnumbercorrection{\the\wd\scratchbox}%
+ \fi
+ \box\scratchbox
+ \global\chardef\mathnumberstatus\plustwo}
+
+% \def\dobothaligneqalignno#1%
+% {\ifmmode
+% \displ@y
+% \global\chardef\mathnumberstatus\plusone
+% we're in a mathbox
+% \vcenter\bgroup
+% \def\finishalignno{\crcr\egroup\egroup}%
+% \else
+% \def\finishalignno{\crcr\egroup}%
+% \fi
+% #1%
+% \halign \ifcase\eqalignmode \or to \displaywidth \fi \@EA \bgroup\the\scratchtoks\crcr}
+
+\def\reqalignno {\dobotheqalignno \preparereqalignno}
+\def\leqalignno {\dobotheqalignno \prepareleqalignno}
+\def\alignreqalignno{\dobothaligneqalignno\preparereqalignno}
+\def\alignleqalignno{\dobothaligneqalignno\prepareleqalignno}
+\def\finishalignno {\crcr\egroup}
+
+\let \equalignno \reqalignno
+\let\aligneqalignno\alignreqalignno
+
+%D Here we implement the user interface part.
+
+\def\setupmathalignment
+ {\dodoubleempty\dosetupmathalignment}
+
+\def\dosetupmathalignment[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??eq#1][#2]%
+ \else
+ \getparameters[\??eq][#1]%
+ \fi}
+
+\let\currentmathalignment\empty
+
+\def\mathalignmentparameter#1%
+ {\executeifdefined{\??eq\currentmathalignment#1}{\executeifdefined{\??eq#1}\empty}}
+
+\setupmathalignment
+ [\c!n=2,
+ \c!m=1,
+ \c!distance=1em]
+
+\def\numberedeqalign
+ {\doifelse\@@fmlocation\v!left\alignleqalignno\alignreqalignno}
+
+\def\doxxdoubleempty#1#2%
+ {\ifx#2[\expandafter\dodoxxdoubleempty\else\expandafter\noxxdoubleempty\fi#1#2}
+
+\def\dodoxxdoubleempty#1[#2]#3%
+ {\ifx#3[\else\expandafter\nonoxxdoubleempty\fi#1[#2]#3}
+
+\def\noxxdoubleempty #1{#1[][]}
+\def\nonoxxdoubleempty#1[#2]{#1[#2][]}
+
+\newcount\eqaligncolumn
+
+\def\firstineqalign{\global\eqaligncolumn\plusone}
+\def\nextineqalign {\global\advance\eqaligncolumn\plusone}
+\def\leftofeqalign {\getvalue{\??eq:\v!left :\number\eqaligncolumn}}
+\def\rightofeqalign{\getvalue{\??eq:\v!right:\number\eqaligncolumn}}
+
+\def\doseteqaligncolumn#1%
+ {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\empty
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\empty
+ \doif{#1}\v!left {\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill}%
+ \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}%
+ \doif{#1}\v!middle{\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill
+ \letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}}
+
+\def\dodoalignNC
+ {\gdef\doalignNC##1{&##1}}
+
+\def\doalignNR[#1][#2]%
+ {\donestedformulanumber{#1}{#2}\crcr}
+
+%D \starttyping
+%D \placeformula[eqn0]\startformula \startalign[n=1] a\NR \stopalign \stopformula See \in[eqn0]
+%D \placeformula[eqn1]\startformula \startalign[n=1] a\NR \stopalign \stopformula See \in[eqn1]
+%D \placeformula \startformula \startalign[n=1] a\NR[eqn2] \stopalign \stopformula See \in[eqn2]
+%D \placeformula[eqn3]\startformula \startalign[n=1] a\NR[+] \stopalign \stopformula See \in[eqn3]
+%D \stoptyping
+
+% todo: pop in cell
+
+\def\dostartmathalignment[#1][#2]%
+ {% \begingroup not permitted ($$...assignments...\halign... )
+ \pushmacro\doalignNC
+ \edef\currentmathalignment{#1}%
+ \doifassignmentelse{#2}{\setupmathalignment[#1][#2]}\donothing
+ \def\NC{\doalignNC}%
+ \global\let\doalignNC\dodoalignNC
+ \def\EQ{&=}%
+ \def\NR{&\global\let\doalignNC\dodoalignNC\doxxdoubleempty\doalignNR}%
+ % amstex compatibility mode: (ugly, will disappear)
+ \def\notag{\def\\{&\crcr}}%
+ \doifelse{#2}{*}{\def\\{&\crcr}}{\def\\{&\doalignNR[+][]\crcr}}%
+ % end of compatibility mode
+ \eqaligncolumn\zerocount
+ \processcommacommand
+ [\mathalignmentparameter\c!align]
+ {\advance\eqaligncolumn\plusone\doseteqaligncolumn}% takes argument
+ % the real action
+ \global\eqaligncolumn\plusone
+ \numberedeqalign}
+
+\def\dostopmathalignment
+ {\finishalignno
+ \popmacro\doalignNC}
+
+\def\definemathalignment
+ {\dodoubleempty\dodefinemathalignment}
+
+\def\dodefinemathalignment[#1]% [#2]%
+ {\setvalue{\e!start#1}{\dodoubleempty\dostartmathalignment[#1]}%
+ \setvalue{\e!stop #1}{\dostopmathalignment}%
+ \setupmathalignment[#1]}% [#2]
+
+%D For the moment we only provide english commands.
+
+\definemathalignment[align] % default case (this is what amstex users expect)
+\definemathalignment[\v!mathalignment] % prefered case (this is cleaner, less clashing)
+
+%D \startbuffer
+%D \placeformula \startformula \eqalignno {
+%D a &= b & \formulanumber \cr
+%D c &= d \cr
+%D &= e \cr
+%D &= f & \formulanumber
+%D } \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D \NC a \EQ b \NR[+]
+%D \NC c \EQ d \NR
+%D \NC \EQ f \NR[for:demo-a-1]
+%D \NC \EQ g \NR[for:demo-a-2][a]
+%D \NC \EQ h \NR[for:demo-a-3][b]
+%D \NC \EQ i \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D \NC a \EQ b \NR[+]
+%D \NC c \EQ d \NR
+%D \NC \EQ f \NR
+%D \NC \EQ g \NR
+%D \NC \EQ h \NR
+%D \NC \EQ i \NR[+]
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D a &= b \\
+%D c &= d \notag \\
+%D &= e \notag \\
+%D &= f \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D \NC a \NC \eq b \NR[+]
+%D \NC c \NC \neq d \NR
+%D \NC \NC \neq f \NR[for:demo-b-1]
+%D \NC \NC \geq g \NR[for:demo-b-2][a]
+%D \NC \NC \leq h \NR[for:demo-b-3][b]
+%D \NC \NC \neq i \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[*]
+%D a &= b \\
+%D c &= d \\
+%D &= e \\
+%D &= f \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign
+%D x &= y \\
+%D a &= b \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[m=3]
+%D x &= y & x &= y & z &= t \\
+%D a &= b & p &= q & w &= s \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[m=3,distance=0pt]
+%D x &= y &= x &= y &= z &= t \\
+%D a &= b &= p &= q &= w &= s \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=5,distance=0pt]
+%D x &= yy &= xx &= yy &= zz \\
+%D a &= b &= p &= q &= w \\
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=3,align={left,middle,right}]
+%D \NC l \NC = \NC r \NR
+%D \NC left \NC = \NC right \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=3,align={right,middle,left}]
+%D \NC l \NC = \NC r \NR
+%D \NC left \NC = \NC right \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startalign[n=3,align={middle,middle,middle}]
+%D \NC l \NC = \NC r \NR
+%D \NC left \NC = \NC right \NR
+%D \stopalign \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula
+%D \startformula
+%D \startalign[n=3,align={middle,middle,middle}]
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula
+%D \startformulas
+%D \setupmathalignment[n=3,align={middle,middle,middle}]%
+%D \startformula
+%D \startalign
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula
+%D \startformula
+%D \startalign
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula
+%D \stopformulas
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula
+%D \startformulas
+%D \dorecurse{5}{\startformula
+%D \startalign[n=3,align={middle,middle,middle}]
+%D \NC a \NC = \NC b \NR[+]
+%D \NC 2a \NC = \NC 2b \NR
+%D \stopalign
+%D \stopformula}
+%D \stopformulas
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {definemathcases, setupmathcases, startmathcases}
+%D
+%D Another wish \unknown
+
+\def\setupmathcases
+ {\dodoubleempty\dosetupmathcases}
+
+\def\dosetupmathcases[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??ce#1][#2]%
+ \else
+ \getparameters[\??ce][#1]%
+ \fi}
+
+\let\currentmathcases\empty
+
+\def\mathcasesparameter#1%
+ {\executeifdefined{\??ce\currentmathcases#1}{\executeifdefined{\??ce#1}\empty}}
+
+\setupmathcases
+ [\c!distance=1em,
+ \c!numberdistance=2.5em,
+ \c!left={\left\{\,},
+ \c!right={\right.}]
+
+\def\dodocasesNC
+ {\gdef\docasesNC{\endmath&}}
+
+\let\docasesNR\doalignNR
+
+\def\dostartmathcases[#1][#2]%
+ {\begingroup
+ \edef\currentmathcases{#1}%
+ \doifassignmentelse{#2}{\setupmathcases[#1][#2]}\donothing
+ \mathcasesparameter\c!left
+ \vcenter\bgroup
+ \pushmacro\docasesNC
+ \let\endmath\relax
+ \def\NC{\docasesNC}%
+ \def\MC{\docasesNC\ifmmode\else$\def\endmath{$}\fi}%
+ \global\let\docasesNC\dodocasesNC
+ \def\NR{\unskip\endmath&\global\let\docasesNC\dodocasesNC\doxxdoubleempty\docasesNR}%
+ \normalbaselines
+ \mathsurround\zeropoint
+ \everycr\emptytoks
+ \tabskip\zeropoint
+ \global\eqaligncolumn\plusone
+ \halign\bgroup
+ $\mathcasesparameter\c!style##$\hfil
+ &\hskip\mathcasesparameter\c!distance\relax
+ \popmacro\docasesNC##\hfil
+ &\hskip\mathcasesparameter\c!numberdistance\relax
+ \let\formuladistance\!!zeropoint
+ \span\textineqalign{##}%
+ \crcr} % todo: number
+
+\def\dostopmathcases
+ {\crcr
+ \egroup
+ \popmacro\docasesNC
+ \egroup
+ \mathcasesparameter\c!right
+ \endgroup}
+
+\def\definemathcases
+ {\dodoubleempty\dodefinemathcases}
+
+\def\dodefinemathcases[#1]% [#2]%
+ {\setvalue{\e!start#1}{\dodoubleempty\dostartmathcases[#1]}%
+ \setvalue{\e!stop #1}{\dostopmathcases}%
+ \setupmathcases[#1]}% [#2]
+
+\definemathcases[cases]
+\definemathcases[\v!mathcases]
+
+%D \startbuffer
+%D \placeformula \startformula \startcases
+%D \NC 2 \NC $ y > 0 $ \NR
+%D \NC 7 \NC $ x = 7 $ \NR[+]
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula x \startcases
+%D \NC 2 \NC $ y > 0 $ \NR[+]
+%D \NC 7 \NC $ x = 7 $ \NR
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula \startcases
+%D \NC 2 \NC $ y > 0 $ \NR
+%D \NC 7 \NC $ x = 7 $ \NR
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \placeformula \startformula x \startcases
+%D \NC 2 \NC $ y > 0 $ \NR
+%D \NC 7 \NC $ x = 7 $ \NR
+%D \NC 4 \NC otherwise \NR
+%D \stopcases \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {definemathmatrix, setupmathmatrix, startmathmatrix}
+%D
+%D Yet another one \unknown
+
+\def\setupmathmatrix
+ {\dodoubleempty\dosetupmathmatrix}
+
+\def\dosetupmathmatrix[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??mx#1][#2]%
+ \else
+ \getparameters[\??mx][#1]%
+ \fi}
+
+\let\currentmathmatrix\empty
+
+\def\mathmatrixparameter#1%
+ {\executeifdefined{\??mx\currentmathmatrix#1}{\executeifdefined{\??mx#1}\empty}}
+
+\setupmathmatrix
+ [\c!distance=1em,
+ \c!left=,
+ \c!right=,
+ \c!align=\v!middle]
+
+\def\dosetmatrixcolumn#1% hh: todo: \definematrixalign
+ {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil
+ \doif{#1}\v!left {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\relax
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil}%
+ \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\relax }%
+ \doif{#1}\v!middle{\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfil
+ \letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfil}}
+
+\def\buildmathmatrix % beware: etex only
+ {\scratchtoks\emptytoks
+ \expanded{\scratchtoks{\the\scratchtoks\the\!!toksa}}%
+ \dorecurse{\numexpr\scratchcounter-\plusone\relax}
+ {\expanded{\scratchtoks{\the\scratchtoks\the\!!toksb}}}%
+ \expanded{\scratchtoks{\the\scratchtoks\the\!!toksc }}}
+
+\def\preparemathmatrix
+ {\!!toksa{\strut \firstineqalign\leftofeqalign \span
+ \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}%
+ \!!toksb{&\hskip\mathmatrixparameter\c!distance
+ \nextineqalign\leftofeqalign \span
+ \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}%
+ \!!toksc{&&\hskip\mathmatrixparameter\c!distance
+ \leftofeqalign \span
+ \textineqalign{\mathmatrixparameter\c!style ##}\rightofeqalign}%
+ \buildmathmatrix
+ \halign \@EA \bgroup\the\scratchtoks \crcr}
+
+\def\definemathmatrix
+ {\dodoubleempty\dodefinemathmatrix}
+
+\def\dodefinemathmatrix[#1]% [#2]%
+ {\setvalue{\e!start#1}{\dodoubleempty\dostartmathmatrix[#1]}%
+ \setvalue{\e!stop #1}{\dostopmathmatrix}%
+ \setupmathmatrix[#1]}% [#2]
+
+\definemathmatrix[matrix]
+\definemathmatrix[\v!mathmatrix]
+
+\def\dodomatrixNC
+ {\gdef\domatrixNC{\endmath&}}
+
+\def\installmathmatrixhandler#1#2%
+ {\setvalue{\??mx:#1}{#2}}
+
+% First alternative:
+%
+% \def\processlowhighmathmatrix#1%
+% {\def\mathmatrixleft
+% {\setbox\nextbox}
+% \def\mathmatrixright
+% {#1.5\dimexpr\nextboxdp-\nextboxht\relax
+% \hbox{$\mathmatrixparameter\c!left
+% \vcenter{\unvbox\nextbox}%
+% \mathmatrixparameter\c!right$}}%
+% \let\mathmatrixbox\vbox}
+%
+% \installmathmatrixhandler\v!high {\processlowhighmathmatrix\raise}
+% \installmathmatrixhandler\v!low {\processlowhighmathmatrix\lower}
+%
+% \installmathmatrixhandler\v!top {\processlowhighmathmatrix\raise}
+% \installmathmatrixhandler\v!bottom{\processlowhighmathmatrix\lower}
+%
+% \installmathmatrixhandler\v!lohi
+% {\def\mathmatrixleft {\mathmatrixparameter\c!left}%
+% \def\mathmatrixright{\mathmatrixparameter\c!right}%
+% \let\mathmatrixbox\vcenter}
+%
+% An alternative
+%
+% \let\mathmatrixleft \empty
+% \let\mathmatrixright\empty
+%
+% \def\processlowhighmathmatrix#1%
+% {\dowithnextbox
+% {#1.5\dimexpr\nextboxdp-\nextboxht\relax
+% \hbox{$\mathmatrixparameter\c!left
+% \vcenter{\unvbox\nextbox}%
+% \mathmatrixparameter\c!right$}}%
+% \vbox}
+%
+% \def\processlohimathmatrix
+% {\dowithnextbox
+% {\mathmatrixparameter\c!left
+% \vcenter{\unvbox\nextbox}%
+% \mathmatrixparameter\c!right}%
+% \vbox}
+%
+% \installmathmatrixhandler\v!high {\def\mathmatrixbox{\processlowhighmathmatrix\raise}}
+% \installmathmatrixhandler\v!low {\def\mathmatrixbox{\processlowhighmathmatrix\lower}}
+% \installmathmatrixhandler\v!top {\def\mathmatrixbox{\processlowhighmathmatrix\raise}}
+% \installmathmatrixhandler\v!bottom{\def\mathmatrixbox{\processlowhighmathmatrix\lower}}
+% \installmathmatrixhandler\v!lohi {\let\mathmatrixbox \processlohimathmatrix}
+%
+% Final version
+
+\let\mathmatrixleft \empty % experimental hook
+\let\mathmatrixright\empty % experimental hook
+
+\def\processlowhighmathmatrix#1#2%
+ {\dowithnextbox
+ {\scratchdimen\dimexpr(\nextboxdp-\nextboxht)/2 \ifcase#2\or+\mathaxisheight\textfont2\fi\relax
+ \ifcase#1\relax\or\lower\scratchdimen\or\or\raise\scratchdimen\fi
+ \hbox{$\mathmatrixparameter\c!left
+ \vcenter{\unvbox\nextbox}%
+ \mathmatrixparameter\c!right$}}%
+ \vbox}
+
+\installmathmatrixhandler\v!top {\def\mathmatrixbox{\processlowhighmathmatrix\plusthree\plusone }}
+\installmathmatrixhandler\v!high {\def\mathmatrixbox{\processlowhighmathmatrix\plusthree\zerocount}}
+\installmathmatrixhandler\v!lohi {\def\mathmatrixbox{\processlowhighmathmatrix\plustwo \zerocount}}
+\installmathmatrixhandler\v!low {\def\mathmatrixbox{\processlowhighmathmatrix\plusone \zerocount}}
+\installmathmatrixhandler\v!bottom{\def\mathmatrixbox{\processlowhighmathmatrix\plusone \plusone }}
+
+\def\dostartmathmatrix[#1][#2]%
+ {\begingroup
+ \edef\currentmathmatrix{#1}%
+ \doifassignmentelse{#2}{\setupmathmatrix[#1][#2]}\donothing
+ \null
+ \executeifdefined{\??mx:\mathmatrixparameter\c!location}{\getvalue{\??mx:\v!lohi}}%
+ \mathmatrixleft
+ \mathmatrixbox\bgroup
+ \pushmacro\domatrixNC
+ \let\endmath\relax
+ \def\NC{\domatrixNC}%
+ \def\MC{\domatrixNC\ifmmode\else$\def\endmath{$}\fi}%
+ \global\let\domatrixNC\dodomatrixNC
+ \def\NR{\endmath\global\let\domatrixNC\dodomatrixNC\crcr}%
+ \normalbaselines
+ \mathsurround\zeropoint
+ \everycr\emptytoks
+ \tabskip\zeropoint
+ \eqaligncolumn\zerocount % could be \scratchcounter
+ \processcommacommand[\mathmatrixparameter\c!align]{\advance\eqaligncolumn\plusone\dosetmatrixcolumn}%
+ \scratchcounter=\ifnum\eqaligncolumn>\zerocount \eqaligncolumn \else \plusone \fi
+ \global\eqaligncolumn\plusone
+ \preparemathmatrix } % uses scratchcounter
+
+\def\dostopmathmatrix
+ {\crcr
+ \mathstrut\crcr
+ \noalign{\kern-\baselineskip}%
+ \egroup
+ \popmacro\domatrixNC
+ \egroup
+ \mathmatrixright
+ \endgroup}
+
+%D \startbuffer
+%D \placeformula \startformula[-] \startmatrix
+%D \NC 1 \NC x \NC a \NR
+%D \NC 2 \NC y \NC b \NR
+%D \NC 3 \NC z \NC c \NR
+%D \stopmatrix \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \definemathmatrix[bmatrix][left={\left[\,},right={\,\right]}]
+%D
+%D \startbuffer
+%D \placeformula \startformula[-] \startbmatrix
+%D \NC 1 \NC x \NC a \NR
+%D \NC 2 \NC y \NC b \NR
+%D \NC 3 \NC z \NC c \NR
+%D \stopbmatrix \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D Taco added some code (dedicated to Aditya Mahajan) that gives more
+%D control over aligments:
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix
+%D \NC a + x \NC = \NC a + d \NR
+%D \NC y \NC = \NC d \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix [distance=3pt,align={right,left}]
+%D \NC a + x \NC = a + d \NR
+%D \NC y \NC = d \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix [left=\left(,right=\right)]
+%D \NC a + x \NR
+%D \NC y \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D A bit more complex code:
+%D
+%D \startbuffer
+%D \startformula
+%D \text{Let }{\cal R} = \bigcup_{P_{X_1},P_{X_2}}
+%D \left\{ (R_1, R_2) :
+%D \startmatrix[distance=1em,align={left,left,right}]
+%D \NC R_1 \NC < I(X_1 ; Y \mid X_2) \NC R_1 \NR
+%D \NC \hfill Q_2 \NC < I(X_2 ; Y \mid X_1) \NC R_2 \NR
+%D \NC R_1 + R_2 \NC < I(X_1 ; Y) \NC R_1 + R_2 \NR
+%D \stopmatrix
+%D \right\}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {startmatrices}
+%D
+%D Just a handy keystroke safer:
+
+\def\startmatrices
+ {\begingroup
+ \setupmathmatrix}
+
+\def\stopmatrices
+ {\endgroup}
+
+%D \startbuffer
+%D \startformula
+%D \startmatrix[left={\left(},right={\right)}]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[left={\left(},right={\right)},location=low]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[left={\left(},right={\right)},location=high]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \startformula
+%D \startmatrices[left={\left(},right={\right)}]
+%D \startmatrix
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[location=bottom]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D =
+%D \startmatrix[location=top]
+%D \NC A \NC B \NR \NC C \NC D \NR
+%D \stopmatrix
+%D \stopmatrices
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {startintertext}
+%D
+%D Preliminary feature:
+%D
+%D {\em example code}
+
+\def\startintertext#1\stopintertext
+ {\noalign{\dointertext{#1}}}
+
+\def\intertext#1%
+ {\noalign{\dointertext{#1}}}
+
+\unexpanded\def\dointertext#1%
+ {\penalty\postdisplaypenalty
+ \afterdisplayspace
+ \vbox{\forgetall\noindent#1\par}%
+ \penalty\predisplaypenalty
+ \beforedisplayspace}
+
+% %D \macros
+% %D {substack}
+% %D
+% %D Preliminary code:
+% %D
+% %D \starttyping
+% %D \startformula
+% %D \sum_{%
+% %D \startsubstack
+% %D i = 1 \NR
+% %D i \neq n \NR
+% %D i \neq m
+% %D \stopsubstack
+% %D }a_i
+% %D \stopformula
+% %D \stoptyping
+
+% \def\startsubstack
+% {\begingroup
+% \null
+% \vcenter\bgroup
+% \pushmacro\domatrixNC
+% \let\stopmathmode\relax
+% \def\NC{\domatrixNC}%
+% \def\MC{\domatrixNC\startmathmode}%
+% \global\let\domatrixNC\dodomatrixNC
+% \def\NR
+% {\stopmathmode
+% \global\let\domatrixNC\dodomatrixNC
+% \crcr\noalign{\nointerlineskip}}%
+% \mathsurround\zeropoint
+% \everycr\emptytoks
+% \halign\bgroup\hfil$\scriptstyle\mathstrut##$\hfil\crcr}
+
+% \def\stopsubstack
+% {\crcr
+% \egroup
+% \popmacro\domatrixNC
+% \egroup
+% \endgroup}
+
+%D \macros
+%D {substack}
+%D
+%D Preliminary code:
+%D
+%D \startbuffer
+%D \startformula
+%D \sum_{%
+%D \startsubstack
+%D i = 1 \NR
+%D i \neq n \NR
+%D i \neq m
+%D \stopsubstack
+%D }a_i
+%D \stopformula
+%D \stopbuffer
+%D
+%D \getbuffer which was typed as \typebuffer
+%D
+%D Notice that these macros give the correct spacing for
+%D subscripts. Compare for example
+%D
+%D \startbuffer
+%D \startformula
+%D \sum_{\startsubstack a \NR b \NR \stopsubstack}
+%D \text{ and }
+%D \sum_{\scriptstyle a \atop \scriptstyle}
+%D \stopformula
+%D \typebuffer which gives \getbuffer
+
+\def\startsubstack
+ {\begingroup
+ \vcenter\bgroup
+ \baselineskip\mathstacktotal
+ \lineskip\mathstackvgap
+ \lineskiplimit\lineskip
+ \let\stopmathmode\relax
+ \def\NC{\domatrixNC}%
+ \def\MC{\domatrixNC\startmathmode}%
+ \global\let\domatrixNC\dodomatrixNC
+ \def\NR
+ {\stopmathmode
+ \global\let\domatrixNC\dodomatrixNC
+ \crcr}%
+ \mathsurround\zeropoint
+ \everycr\emptytoks
+ \halign\bgroup\hfil$\scriptstyle##$\hfil\crcr}
+
+\def\stopsubstack
+ {\crcr
+ \egroup
+ \egroup
+ \endgroup}
+
+%D \macros
+%D {frac, xfrac, xxfrac}
+%D
+%D This is another one Tobias asked for. It replaces the
+%D primitive \type {\over}. We also take the opportunity to
+%D handle math style restoring, which makes sure units and
+%D chemicals come out ok.
+%D
+%D \starttyping
+%D \def\frac#1#2%
+%D {\relax
+%D \ifmmode
+%D {{\mathstyle{#1}}\over{\mathstyle{#2}}}%
+%D \else
+%D $\frac{#1}{#2}$%
+%D \fi}
+%D \stoptyping
+%D
+%D Better is:
+%D
+%D \starttyping
+%D \def\frac#1#2%
+%D {\relax\mathematics{{{\mathstyle{#1}}\over{\mathstyle{#2}}}}}
+%D \stoptyping
+%D
+%D The \type {\frac} macro kind of replaces the awkward \type
+%D {\over} primitive. Say that we have the following formulas:
+%D
+%D \startbuffer[sample]
+%D test $\frac {1}{2}$ test $$1 + \frac {1}{2} = 1.5$$
+%D test $\xfrac {1}{2}$ test $$1 + \xfrac {1}{2} = 1.5$$
+%D test $\xxfrac{1}{2}$ test $$1 + \xxfrac{1}{2} = 1.5$$
+%D \stopbuffer
+%D
+%D \typebuffer[sample]
+%D
+%D With the most straightforward definitions, we get:
+%D
+%D \startbuffer[code]
+%D \def\dofrac#1#2#3{\relax\mathematics{{{#1{#2}}\over{#1{#3}}}}}
+%D
+%D \def\frac {\dofrac\mathstyle}
+%D \def\xfrac {\dofrac\scriptstyle}
+%D \def\xxfrac{\dofrac\scriptscriptstyle}
+%D \stopbuffer
+%D
+%D \typebuffer[code] \getbuffer[code,sample]
+%D
+%D Since this does not work well, we can try:
+%D
+%D \startbuffer[code]
+%D \def\xfrac #1#2{\hbox{$\dofrac\scriptstyle {#1}{#2}$}}
+%D \def\xxfrac#1#2{\hbox{$\dofrac\scriptscriptstyle{#1}{#2}$}}
+%D \stopbuffer
+%D
+%D \typebuffer[code] \getbuffer[code,sample]
+%D
+%D This for sure looks better than:
+%D
+%D \startbuffer[code]
+%D \def\xfrac #1#2{{\scriptstyle \dofrac\relax{#1}{#2}}}
+%D \def\xxfrac#1#2{{\scriptscriptstyle\dofrac\relax{#1}{#2}}}
+%D \stopbuffer
+%D
+%D \typebuffer[code] \getbuffer[code,sample]
+%D
+%D So we stick to the next definitions (watch the local
+%D overloading of \type {\xfrac}).
+
+\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
+ {\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
+ \let\xfrac\xxfrac
+ \dofrac\scriptstyle{#1}{#2}%
+ \endgroup}
+
+\unexpanded\def\xxfrac#1#2%
+ {\begingroup
+ \dofrac\scriptscriptstyle{#1}{#2}%
+ \endgroup}
+
+%D The \type {xx} variant looks still ugly, so maybe it's
+%D best to say:
+
+\unexpanded\def\xxfrac#1#2%
+ {\begingroup
+ \dofrac\scriptscriptstyle{#1}{\raise.25ex\hbox{$\scriptscriptstyle#2$}}%
+ \endgroup}
+
+%D Something low level for scientific calculator notation:
+
+\unexpanded\def\scinot#1#2%
+ {#1\times10^{#2}}
+
+%D The next macro, \type {\ch}, is \PPCHTEX\ aware. In
+%D formulas one can therefore best use \type {\ch} instead of
+%D \type {\chemical}, especially in fractions.
+
+\ifx\mathstyle\undefined
+ \let\mathstyle\relax
+\fi
+
+\unexpanded\def\ch#1%
+ {\ifx\@@chemicalletter\undefined
+ \mathstyle{\rm#1}%
+ \else
+ \dosetsubscripts
+ \mathstyle{\@@chemicalletter{#1}}%
+ \doresetsubscripts
+ \fi}
+
+%D \macros
+%D {/}
+%D
+%D Just to be sure, we restore the behavior of some typical
+%D math characters.
+
+\bgroup
+
+\catcode`\/=\@@other \global \let\normalforwardslash/
+\catcode`\/=\@@active \doglobal\appendtoks\let/\normalforwardslash\to\everymathematics
+
+\egroup
+
+%D These macros were first needed by Frits Spijker (also
+%D known as Gajes) for typesetting the minus sign that is
+%D keyed into scientific calculators.
+
+% This is the first alternative, which works okay for the
+% minus, but less for the plus.
+%
+% \def\dodoraisedmathord#1#2#3%
+% {\mathord{{#2\raise.#1ex\hbox{#2#3}}}}
+%
+% \def\doraisedmathord#1%
+% {\mathchoice
+% {\dodoraisedmathord5\tf #1}%
+% {\dodoraisedmathord5\tf #1}%
+% {\dodoraisedmathord4\tfx #1}%
+% {\dodoraisedmathord3\tfxx#1}}
+%
+% \def\negative{\doraisedmathord-}
+% \def\positive{\doraisedmathord+}
+%
+% So, now we use the monospaced signs, that we also
+% define as symbol, so that they can be overloaded.
+
+\def\dodoraisedmathord#1#2#3%
+ {\mathord{{#2\raise.#1ex\hbox{#2\symbol[#3]}}}}
+
+\def\doraisedmathord#1%
+ {\mathchoice
+ {\dodoraisedmathord5\tf {#1}}%
+ {\dodoraisedmathord5\tf {#1}}%
+ {\dodoraisedmathord4\tx {#1}}%
+ {\dodoraisedmathord3\txx{#1}}}
+
+\def\dodonumbermathord#1#2%
+ {\setbox\scratchbox\hbox{0}%
+ \mathord{\hbox to \wd\scratchbox{\hss#1\symbol[#2]\hss}}}
+
+\def\donumbermathord#1%
+ {\mathchoice
+ {\dodonumbermathord\tf {#1}}%
+ {\dodonumbermathord\tf {#1}}%
+ {\dodonumbermathord\tx {#1}}%
+ {\dodonumbermathord\txx{#1}}}
+
+\definesymbol[positive] [\getglyph{Mono}{+}]
+\definesymbol[negative] [\getglyph{Mono}{-}]
+\definesymbol[zeroamount][\getglyph{Mono}{-}]
+
+\def\negative {\doraisedmathord{negative}}
+\def\positive {\doraisedmathord{positive}}
+\def\zeroamount{\donumbermathord{zeroamount}}
+
+%D The following macros are used in the MathML interpreter, so
+%D there is a good change of them never being documented for
+%D other usage.
+
+\let\normalordelimiter\secondoftwoarguments
+\let\normalorfiller \firstoftwoarguments
+
+\def\enabledelimiter {\let\normalordelimiter\secondoftwoarguments}
+\def\disabledelimiter{\let\normalordelimiter\firstoftwoarguments}
+
+\def\enablefiller {\let\normalorfiller\secondoftwoarguments}
+\def\disablefiller {\let\normalorfiller\firstoftwoarguments}
+
+\def\mathopnolimits#1{\mathop{\mr#1}\nolimits} % was \rm, which follows text fonts (used in mml parser)
+\def\mathopdolimits#1{\mathop{\mr#1}} % was \rm, which follows text fonts (used in mml parser)
+
+%D \macros{overset, underset}
+%D
+%D The macros \type{\overset} and \type{\underset} are provided by
+%D \AMS\ packages in \LATEX. These macro allows you to place a symbol
+%D above or below another symbol, irrespective of whether the other
+%D symbol is a relation or something else, and without influencing the
+%D spacing. For most cases there is a better way to do such things
+%D (declaring a math command with limop option, or using accents), but
+%D occasionally these macros can be useful, for example:
+%D
+%D \startbuffer
+%D \startformula
+%D \overset{*}{X} \underset{*}{X}
+%D \stopformula
+%D \stopbuffer
+%D \typebuffer \getbuffer
+%D
+%D Use these macros sparingly. Remember, \TEX\ was designed for
+%D mathematics, so there is usually a proper method for typesetting
+%D common math notation.
+
+%D These macros are a clearer version of \type{\binrel@} and
+%D \type{\binrel@@} macros in \AMSTEX\ packages.
+
+\def\preparebinrel#1%
+ {\begingroup
+ \setbox\scratchbox\hbox
+ {\thinmuskip 0mu
+ \medmuskip -1mu
+ \thickmuskip -1mu
+ \setbox\scratchbox\hbox{$#1\mathsurround\zeropoint$}%
+ \kern-\wd\scratchbox
+ ${}#1{}\mathsurround\zeropoint$}%
+ \expanded
+ {\endgroup
+ \let\noexpand\currentbinrel
+ \ifdim\wd\scratchbox<\zeropoint
+ \mathbin
+ \else\ifdim\wd\scratchbox>\zeropoint
+ \mathrel
+ \else
+ \relax
+ \fi\fi}}
+
+\unexpanded\def\overset#1#2%
+ {\preparebinrel{#2}%
+ \currentbinrel{\mathop{\kern\zeropoint#2}\limits^{#1}}}
+
+\unexpanded\def\underset#1#2%
+ {\preparebinrel{#2}%
+ \currentbinrel{\mathop{\kern\zeropoint#2}\limits_{#1}}}
+
+%D \macros
+%D {boldsymbol}
+%D
+%D The math definition is inspired by amsmath.
+%D
+%D \startbuffer
+%D \definetypeface [boldmath] [mm] [boldmath] [latin-modern] [modern] [encoding=texnansi]
+%D
+%D $a \times b$ $a \boldsymbol{\times} b$
+%D \stopbuffer
+%D
+%D \typebuffer \start \getbuffer \stop
+
+\def\mathboldsymbol#1%
+ {\preparebinrel{#1}%
+ \currentbinrel{\mathchoice
+ {\hbox{\switchtoformulabodyfont [boldmath]$\mathsurround\zeropoint#1$}}
+ {\hbox{\switchtoformulabodyfont [boldmath]$\mathsurround\zeropoint#1$}}
+ {\hbox{\switchtoformulabodyfont [boldmath,script]$\mathsurround\zeropoint#1$}}
+ {\hbox{\switchtoformulabodyfont[boldmath,scriptscript]$\mathsurround\zeropoint#1$}}}}
+
+\def\boldsymbol
+ {\mathortext\mathboldsymbol\bold}
+
+%D Some encoding hackery (for Mojca. who else):
+%D
+%D \starttyping
+%D \startmathcollection[eul:texnansi]
+%D \definemathsymbol [breve] [accent] [tf] ["15]
+%D \stopmathcollection
+%D \startmathcollection[eul:ec]
+%D \definemathsymbol [breve] [accent] [tf] ["08]
+%D \stopmathcollection
+%D
+%D $\breve e$
+%D \stoptyping
+
+\let\outerencoding\empty
+
+\def\checkoutermathencoding
+ {\ifx\outerencoding\empty
+ \ifx\outerencoding\s!default\else
+ \edef\outerencoding{\currentencoding}%
+ \fi
+ \fi}
+
+\prependtoks
+ \checkoutermathencoding
+\to \everymathematics
+
+%D More. (A temp hack, else no proper default fall back (like \type
+%D {\textmultiply}); todo: sync encoding.
+
+\def\dealwithmathtextencoding
+ {\expanded{\everyhbox{\the\everyhbox\noexpand\fastenableencoding{\currentencoding}}}%
+ \expanded{\everyvbox{\the\everyvbox\noexpand\fastenableencoding{\currentencoding}}}%
+ \def\dealwithmathtextencoding{\let\characterencoding\nocharacterencoding}%
+ \dealwithmathtextencoding}
+
+\appendtoks
+ \dealwithmathtextencoding
+\to \everymathematics
+
+%D How negative such a symbol looks is demonstrated in:
+%D $\negative 10^{\negative 10^{\negative 10}}$.
+
+\setupformulas
+ [\c!way=\@@nrway,
+ \c!blockway=,
+ \c!sectionnumber=\@@nrsectionnumber,
+ \c!location=\v!right,
+ \c!left=(,
+ \c!right=),
+ \c!numberstyle=,
+ \c!numbercolor=,
+ \c!numbercommand=,
+ \c!spacebefore=\v!big,
+ \c!spaceafter=\@@fmspacebefore,
+ \c!grid=]
+
+\protect \endinput
diff --git a/tex/context/base/strc-mat.mkiv b/tex/context/base/strc-mat.mkiv
new file mode 100644
index 000000000..2064db2c5
--- /dev/null
+++ b/tex/context/base/strc-mat.mkiv
@@ -0,0 +1,771 @@
+%D \module
+%D [ file=strc-mat,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Math Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Math Numbering}
+
+\registerctxluafile{strc-mat}{1.001}
+
+% we have potential for captions
+
+\unprotect
+
+\definestructureconversionset[\v!formula][numbers,characters]
+
+\setupformulas
+ [%\c!way=\@@nrway,
+ %\c!blockway=,
+ %\c!sectionnumber=\@@nrsectionnumber,
+ %\c!conversion=\v!numbers,
+ \c!location=\v!right,
+ \c!left=(,
+ \c!right=),
+ %\c!numberstyle=,
+ %\c!numbercolor=,
+ %\c!numbercommand=,
+ \c!spacebefore=\v!big,
+ \c!spaceafter=\formulaparameter\c!spacebefore,
+ \c!leftmargin=\!!zeropoint,
+ \c!rightmargin=\!!zeropoint,
+ %\c!margin=,
+ \c!indentnext=\v!no,
+ \c!alternative=\s!default,
+ %\c!align=,
+ \c!strut=\v!no,
+ %\c!separator=\@@koseparator,
+ %\c!grid=,
+ \c!distance=1em]
+
+\definestructurecounter
+ [\v!formula]
+
+% \setupstructurecounter
+% [\v!formula]
+% [\c!numberconversionset=\v!formula]
+
+\presetstructurecountersetup\setupformulas\sharedstructurecounterparameter
+
+\appendtoks
+% \dostructurecountersetup\currentformula\formulaparameter
+% \docheckstructurecountersetup\currentformula
+ \dostructurecountersetup\v!formula\formulaparameter
+% \docheckstructurecountersetup\v!formula
+\to \everysetupformulas
+
+\setupformulas
+ [\c!numberconversionset=\v!formula] % why forgotten
+
+\def\storecurrentformulanumber#1#2#3#4#5% ref, todo:str, \sync % todo: title etc (like float)
+ {\dostructurecountercomponent
+ {formula}%
+ \getformulaparameters \formulaparameter \detokenizedformulaparameter
+ \relax \relax \relax
+% [\c!name=\currentformula,\s!counter=\currentformula,%
+ [\c!name=\v!formula,\s!counter=\v!formula,%
+ \s!hascaption=\v!yes,\s!hastitle=\v!yes,\s!hasnumber=\v!yes,%\s!haslevel=#6,%
+ \s!hasnumber=\v!no,%
+ \c!reference=#1,\c!title=,\c!bookmark=]%
+ [#2]%
+ \globallet#3\laststructurecounternumber
+ \globallet#4\laststructurecountersynchronize
+ \globallet#5\laststructurecounterattribute}
+
+\newif\ifnoformulanumber
+
+\newconditional\handleformulanumber
+\newconditional\incrementformulanumber
+
+\newtoks\everyresetformulas
+
+\newconditional\insideplaceformula
+\newconditional\insideplacesubformula
+\newconditional\insideformulas
+\newconditional\insidesubformulas
+
+% 0=unset, 1=forced, 2=none, 3=reference
+
+\def\handleplaceformulanumbering % place formula
+ {\settrue\handleformulanumber
+ \docheckformulareference\placeformulanumbermode\currentplaceformulareference
+ \glet\doplaceformulanumber \doplaceformulanumberindeed
+ \glet\donestedformulanumber\donestedformulanumberindeed}
+
+\def\handleformulasnumbering % formulas
+ {\docheckformulareference\formulasnumbermode\currentformularesference}
+
+\def\handlesubformulasnumbering % sub formulas
+ {\docheckformulareference\subformulasnumbermode\currentsubformulasreference
+ \doincrementsubstructurecounter[\v!formula][1]% always
+ \storecurrentformulanumber
+ \currentsubformulasreference
+ \empty
+ \currentsubformulasnumber
+ \currentsubformulassynchronize
+ \currentsubformulasattribute
+ }
+
+\def\tracedformulamode
+ {\hbox{\quad\tt\txx[\number\placeformulanumbermode,\number\formulasnumbermode,\number\subformulasnumbermode,\number\nestedformulanumbermode]}}
+
+\unexpanded\def\placecurrentformulanumber
+ {\rm % nodig ?
+ \doif{\formulaparameter\c!location}\v!right{\hskip\formulaparameter\c!distance}%
+ \formulaparameter\c!numbercommand
+ {\dosetformulaattributes\c!numberstyle\c!numbercolor
+ \strut
+ \formulaparameter\c!left
+ \labeltexts\v!formula{\ignorespaces\doplacecurrentformulanumber\unskip}%
+ \formulaparameter\c!right}%
+ \doif{\formulaparameter\c!location}\v!left{\hskip\formulaparameter\c!distance}}
+
+\def\doplacecurrentformulanumber
+ {\dohandlecurrentformulareferences
+ %\currentformulasattribute % todo
+ %\currentformulasattribute % todo
+ %\currentsubformulaattribute % todo
+ \labeltexts\currentformula{\doconvertedstructurecounter[\v!formula][]}}
+
+\appendtoks
+ \glet\currentplaceformulasynchronize \relax
+ \glet\currentformulassynchronize \relax
+ \glet\currentsubformulassynchronize \relax
+ \glet\currentnestedformulasynchronize\relax
+ \let\currentformula\empty
+\to \everyresetformulas
+
+\def\dohandlecurrentformulareferences
+ {\ifnum\placeformulanumbermode=\plusthree
+ \storecurrentformulanumber
+ \currentplaceformulareference
+ \empty
+ \currentplaceformulanumber
+ \currentplaceformulasynchronize
+ \currentplaceformulaattribute
+ \currentplaceformulasynchronize
+ \glet\currentplaceformulasynchronize\relax
+ \fi
+ \ifnum\formulasnumbermode=\plusthree
+ \storecurrentformulanumber
+ \currentformulasreference
+ \empty
+ \currentformulasnumber
+ \currentformulassynchronize
+ \currentformulasattribute
+ \currentformulassynchronize
+ \glet\currentformulassynchronize\relax
+ \fi
+ \ifnum\subformulasnumbermode=\plusthree
+ \currentsubformulassynchronize
+ \glet\currentsubformulassynchronize\relax
+ \fi
+ \ifnum\nestedformulanumbermode=\plusthree
+ \storecurrentformulanumber
+ \currentnestedformulareference
+ \empty
+ \currentnestedformulanumber
+ \currentnestedformulasynchronize
+ \currentnestedformulaattribute
+ \currentnestedformulasynchronize
+ \glet\currentnestedformulasynchronize\relax
+ \fi}
+
+\let\currentformulasreference \empty \let\currentformulassuffix \empty
+\let\currentformulareference \empty \let\currentformulasuffix \empty
+\let\currentsubformulareference \empty \let\currentsubformulasuffix \empty
+\let\currentnestedformulareference\empty \let\currentnestedformulasuffix\empty
+
+\let\currentformulasynchronize \relax \let\currentformulaattribute \relax
+\let\currentsubformulasynchronize\relax \let\currentsubformulaattribute\relax
+\let\currentformulassynchronize \relax \let\currentformulasattribute \relax
+
+\def\dohandleformulanumbering
+ {\doincrementsubstructurecounter[\v!formula][1]%
+ \doiftext\currentplaceformulasuffix{\setsubstructurecounterown[\v!formula][2]{\currentplaceformulasuffix}}%
+ \placecurrentformulanumber}
+
+\def\dohandlesubformulanumbering
+ {\doiftextelse\currentsubformulasuffix
+ {\setsubstructurecounterown[\v!formula][2]{\currentsubformulasuffix}}
+ {\doincrementsubstructurecounter[\v!formula][2]}%
+ \placecurrentformulanumber}
+
+\def\dododoformulanumber
+ {\ifconditional\handleformulanumber
+ \hbox\bgroup
+ % main counter
+ \ifconditional\insidesubformulas
+ % nothing
+ \else
+ \ifcase\formulasnumbermode
+ \ifcase\placeformulanumbermode
+ \dohandleformulanumbering
+ \or
+ \dohandleformulanumbering
+ \or
+ % nothing
+ \or
+ \dohandleformulanumbering
+ \fi
+ \or
+ \dohandleformulanumbering
+ \or
+ % nothing
+ \or
+ \dohandleformulanumbering
+ \fi
+ \fi
+ % subcounter
+ \ifconditional\insidesubformulas
+ \ifcase\subformulasnumbermode
+ % nothing
+ \or
+ \dohandlesubformulanumbering
+ \or
+ % nothing
+ \or
+ \dohandlesubformulanumbering
+ \fi
+ \fi
+ %\rlap{\tracedformulamode}%
+ \egroup
+ \fi}
+
+\definelist[\v!formula]
+
+\appendtoks
+ \global\setfalse\insideplaceformula
+ \global\setfalse\insideplacesubformula
+% \global\setfalse\insideformulas
+% \global\setfalse\insidesubformulas
+\to \everyresetformulas
+
+\newif\ifinformula
+
+%D We need a hook into the plain math alignment macros
+%D
+%D \starttyping
+%D \displaylines
+%D \eqalignno
+%D \eqalignno
+%D \stoptyping
+%D
+%D Otherwise we get a missing \type {$$} error reported.
+
+\def\resetdisplaymatheq
+ {\let\normalleqno\gobbleoneargument \let\leqno\gobbleoneargument
+ \let\normalreqno\gobbleoneargument \let\eqno \gobbleoneargument
+ \let\doplaceformulanumber\empty}
+
+%D
+
+\unexpanded\def\defineformula
+ {\dodoubleempty\dodefineformula}
+
+\def\dodefineformula[#1][#2]%
+ {\doifsomething{#1}
+ {\getparameters[\??fm#1][\s!parent=\??fm,#2]%
+ \definelist[#1]%
+ \setvalue{\e!start#1\v!formula}{\dostartformula{#1}}%
+ \setvalue{\e!stop #1\v!formula}{\dostopformula}}}
+
+\unexpanded\def\defineformulaalternative
+ {\dotripleargument\dodefineformulaalternative}
+
+\def\dodefineformulaalternative[#1][#2][#3]%
+ {\setvalue{\e!start#1\v!formula}{#2}%
+ \setvalue{\e!stop #1\v!formula}{#3}}
+
+% sp = single line paragraph sd = single line display
+% mp = multi line paragraph md = multy line display
+
+\defineformulaalternative[\s!default][\startdisplaymath][\stopdisplaymath]
+\defineformulaalternative[\s!single] [\startdisplaymath][\stopdisplaymath]
+\defineformulaalternative[\s!multi] [\startdisplaymath][\stopdisplaymath]
+
+\defineformula
+ [sp]
+ [\c!spacebefore=\v!none,
+ \c!spaceafter=\v!none,
+ \c!indentnext=\v!no,
+ \c!alternative=\s!single]
+
+\defineformula
+ [sd]
+ [\c!spacebefore=\v!none,
+ \c!spaceafter=\v!none,
+ \c!indentnext=\v!yes,
+ \c!alternative=\s!single]
+
+\defineformula
+ [mp]
+ [\c!indentnext=\v!no,
+ \c!alternative=\s!multi]
+
+\defineformula
+ [md]
+ [\c!indentnext=\v!yes,
+ \c!alternative=\s!multi]
+
+%D \macros
+%D {setupsubformulas, startsubformulas}
+
+\def\subformulaparameter#1{\ifcname\??fn#1\endcsname\cname\??fn#1\endcsname\fi}
+
+\unexpanded\def\setupsubformulas
+ {\dodoubleargument\getparameters[\??fn]}
+
+\setupsubformulas
+ [\c!indentnext=\formulaparameter\c!indentnext]
+
+% \setupsubformulas[conversion=romannumerals]
+%
+% \placeformula
+% \startsubformulas[Maxwell]
+% \startformulas
+% \startformula \startalign
+% \NC \nabla\cdot\bf E \NC = \frac{\rho}{\varepsilon_0} \NR[Maxwell 1]
+% \NC \nabla\times\bf E \NC = - \frac{\partial\bf B}{\partial t} \NR[Maxwell II]
+% \stopalign \stopformula
+% \startformula \startalign
+% \NC \nabla\cdot \bf B \NC = 0 \NR[Maxwell III]
+% \NC \nabla\times\bf B \NC = \mu_0{\bf j}+\varepsilon_0\mu_0\frac{\partial\bf E}{\partial t} \NR[Maxwell IV]
+% \stopalign \stopformula
+% \stopformulas
+% \stopsubformulas
+%
+% Maxwell : \in [Maxwell] and II : \in [Maxwell II]
+
+%D Tricky stuff:
+
+\newdimen\lastlinewidth
+
+\abovedisplayskip \zeropoint
+\abovedisplayshortskip \zeropoint % evt. 0pt minus 3pt
+\belowdisplayskip \zeropoint
+\belowdisplayshortskip \zeropoint % evt. 0pt minus 3pt
+
+\predisplaypenalty \zerocount
+\postdisplaypenalty \zerocount % -5000 gaat mis, zie penalty bij \paragraaf
+
+% we don't use the skip's
+
+\def\forgetdisplayskips % to do
+ {\abovedisplayskip \zeropoint
+ \belowdisplayskip \zeropoint
+ \abovedisplayshortskip\zeropoint
+ \belowdisplayshortskip\zeropoint}
+
+\setvalue{\e!start\v!formula}{\dostartformula{}}
+\setvalue{\e!stop \v!formula}{\dostopformula}
+
+\def\predisplaysizethreshhold{2em} % was 3em
+
+\def\leftdisplayskip {\leftskip}
+\def\rightdisplayskip {\rightskip}
+\def\leftdisplaymargin {\formulaparameter\c!leftmargin}
+\def\rightdisplaymargin {\formulaparameter\c!rightmargin}
+
+\def\beforedisplayspace
+ {\doifnot{\formulaparameter\c!spacebefore}\v!none{\blank[\formulaparameter\c!spacebefore]}}
+
+\def\afterdisplayspace
+ {\doifnot{\formulaparameter\c!spaceafter }\v!none{\blank[\formulaparameter\c!spaceafter ]}}
+
+% \def\setpredisplaysize
+% {\predisplaysize\lastlinewidth\relax
+% \ifdim\predisplaysize<\maxdimen
+% \ifdim\predisplaysize>\zeropoint
+% \advance\predisplaysize \predisplaysizethreshhold
+% \fi
+% \advance\predisplaysize \displayindent % needed ?
+% \ifdim\predisplaysize>\hsize
+% \predisplaysize\hsize
+% \fi
+% \else
+% \predisplaysize\zeropoint
+% \fi}
+
+\def\setdisplaydimensions
+ {\displayindent\leftdisplayskip
+ \advance\displayindent\leftdisplaymargin
+ \displaywidth\hsize
+ %\setlocalhsize
+ %\displaywidth\localhsize
+ \ifdim\hangindent>\zeropoint
+ \advance\displayindent\hangindent
+ \else
+ \advance\displaywidth\hangindent
+ \fi
+ \advance\displaywidth\dimexpr-\displayindent-\rightdisplayskip-\rightdisplaymargin\relax
+ \hsize\displaywidth} % new, else overfull in itemize
+
+\def\dostartformula#1%
+ {\dodoubleempty\dodostartformula[#1]}
+
+\newskip\formulaparskip
+\newskip\formulastrutht
+\newskip\formulastrutdp
+
+%D \startbuffer
+%D \startformula[9pt] x = 1 \stopformula
+%D \startformula[7pt] x = 1 \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\dodostartformula[#1][#2]% setting leftskip adaption is slow !
+ {\bgroup % HERE
+ \def\currentformula{#1}%
+ \the\everybeforedisplayformula
+ \formulaparskip\parskip
+ \formulastrutdp\strutdepth
+ \formulastrutht\strutheight
+ \doifsomething{#2}{\switchtoformulabodyfont[#2]}%
+ \parskip\formulaparskip
+ % may look better in itemizations
+ \doif{\formulaparameter\c!option}\v!middle
+ {\def\leftdisplayskip{\zeropoint}%
+ \def\rightdisplayskip{\zeropoint}}%
+ % this was an experiment
+ \doifsomething{\formulaparameter\c!margin}% so we test first
+ {\dosetleftskipadaption{\formulaparameter\c!margin}%
+ \edef\leftdisplaymargin{\the\leftskipadaption}}% overloaded
+ \long\def\dostartformula##1{\bgroup\let\dostopformula\egroup}%
+ \freezedimenmacro\leftdisplayskip
+ \freezedimenmacro\rightdisplayskip
+ \freezedimenmacro\leftdisplaymargin
+ \freezedimenmacro\rightdisplaymargin
+ \freezedimenmacro\predisplaysizethreshhold
+ \forgetdisplayskips
+ \getvalue{\e!start\formulaparameter\c!alternative\v!formula}}
+
+\def\switchtoformulabodyfont{\switchtobodyfont}
+
+\setvalue{\v!formula}{\dosingleempty\doformula}
+
+\def\doformula[#1]#2%
+ {\begingroup
+ \doifsomething{#1}{\switchtoformulabodyfont[#1]}%
+ % not : \def\doformula[##1]##2{\mathematics{##2}}%
+ \mathematics{#2}%
+ \endgroup}
+
+\def\dostopformula
+ {\doplaceformulanumber
+ \getvalue{\e!stop\formulaparameter\c!alternative\v!formula}%
+ \nonoindentation
+ \checknextindentation[\formulaparameter\c!indentnext]%
+ \egroup
+ \hangafter\minusone % added for side floats
+ \hangindent\zeropoint % added for side floats
+ \setfalse\handleformulanumber
+ \the\everyresetformulas
+ \dorechecknextindentation} % here ?
+
+%D \starttyping
+%D % test \par % no preceding hlist
+%D % $$x$$ % preceding hlist
+%D % \noindent $$x$$ % no preceding hlist
+%D \startformula x \stopformula % now has \noindent (in mkii we messed with baselineskip)
+%D \stoptyping
+
+\unexpanded\def\startdisplaymath
+ {\bgroup
+ \par
+ \informulatrue
+ \beforedisplayspace
+ \par
+ \ifvmode
+ \prevdepth-\maxdimen % texbook pagina 79-80
+ \fi
+ \noindent % else funny hlist with funny baselineskip
+ $$% \Ustartdisplaymath
+ \setdisplaydimensions
+ %\setpredisplaysize
+ \startinnermath}
+
+\unexpanded\def\stopdisplaymath
+ {\stopinnermath
+ $$% \Ustopdisplaymath
+ \par
+ \afterdisplayspace
+ \par
+ \egroup}
+
+\newif\ifclipdisplaymath \clipdisplaymathtrue
+\def\displaymathclipfactor{1.1}
+
+% already defined
+%
+% \let\startinnermath\empty
+% \let\stopinnermath \empty
+
+% \defineformulaalternative[multi][\begindmath][\enddmath]
+%
+% \fakewords{20}{40}\epar
+% \placeformula {a} $$ \fakespacingformula $$
+% \fakewords{20}{40}\epar
+% \placeformula {b} \startformule \fakespacingformula \stopformule
+% \placeformula {b} \startformule \fakespacingformula \stopformule
+% \fakewords{20}{40}\epar
+% \placeformula {c} \startmdformule \fakespacingformula \stopmdformule
+% \placeformula {c} \startmdformule \fakespacingformula \stopmdformule
+% \fakewords{20}{40}\epar
+% \placeformula {d} \startmpformule \fakespacingformula \stopmpformule
+% \placeformula {d} \startmpformule \fakespacingformula \stopmpformule
+% \fakewords{20}{40}\epar
+% \placeformula {e} \startsdformule \fakespacingformula \stopsdformule
+% \placeformula {e} \startsdformule \fakespacingformula \stopsdformule
+% \fakewords{20}{40}\epar
+% \placeformula {f} \startspformule \fakespacingformula \stopspformule
+% \placeformula {f} \startspformule \fakespacingformula \stopspformule
+% \fakewords{20}{40}
+
+\unexpanded\def\startsubformulas
+ {\dosingleempty\dostartsubformulas}
+
+\def\dostartsubformulas[#1]%
+ {\edef\currentsubformulasreference{#1}%
+ \global\settrue\insidesubformulas
+ \handlesubformulasnumbering}
+
+\unexpanded\def\stopsubformulas
+ {\nonoindentation
+ \checknextindentation[\formulaparameter\c!indentnext]%
+ \the\everyresetformulas % to be checked
+ \global\setfalse\insidesubformulas
+ \dorechecknextindentation} % here ?
+
+%D Named subformulas (to be redone)
+
+\unexpanded\def\startnamedsubformulas
+ {\dosingleempty\dostartnamedsubformulas}
+
+\def\dostartnamedsubformulas[#1]#2%
+ {\setformulalistentry{#2}%
+ \startsubformulas[#1]}
+
+\unexpanded\def\stopnamedsubformulas
+ {\stopsubformulas}
+
+%D Experimental goodie:
+%D
+%D \startbuffer
+%D \placelist[formula][criterium=text] \blank[2*big]
+%D \placenamedformula[one]{first} \startformula a = 1 \stopformula \endgraf
+%D \placeformula \startformula a = 2 \stopformula \endgraf
+%D \placenamedformula {second} \startformula a = 3 \stopformula \endgraf
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\unexpanded\def\startformulas
+ {\dosingleempty\dostartformulas}
+
+\def\dostartformulas[#1]#2\stopformulas % new / to be internationalized
+ {\bgroup
+ \global\settrue\insideformulas
+ \edef\currentformulasreference{#1}%
+ \handleformulasnumbering
+ \let\currentformula\empty
+ \forgetdisplayskips
+ \startdisplaymath
+ \setlocalhsize
+ \long\unexpanded\def\startformula##1\stopformula
+ {\advance\scratchcounter\plusone}%
+ \scratchcounter\zerocount
+ #2% preroll
+ \ifcase\scratchcounter\else
+ \divide \hsize \scratchcounter
+ \fi
+ \hbox to \localhsize \bgroup
+ \hss
+ \def\normalstartformula{\vskip-\strutdepth\Ustartdisplaymath}% i hate this
+ \def\normalstopformula {\Ustopdisplaymath}%
+ \unexpanded\def\startformula {\Ustartmath\vcenter\bgroup\normalstartformula}%
+ \unexpanded\def\stopformula {\normalstopformula\egroup\Ustopmath\hss}%
+ #2%
+ \egroup
+ \stopdisplaymath
+ \global\setfalse\insideformulas
+ \egroup
+ \the\everyresetformulas
+ \hangafter\minusone % added for side floats
+ \hangindent\zeropoint} % added for side floats
+
+% place
+
+% 0=unset, 1=forced, 2=none, 3=reference
+
+\chardef\placeformulanumbermode \zerocount
+\chardef\formulanumbermode \zerocount
+\chardef\formulasnumbermode \zerocount
+\chardef\subformulasnumbermode \zerocount
+\chardef\nestedformulanumbermode\zerocount
+
+\def\inhibitformulanumberflag{-}
+\def\forceformulanumberflag {+}
+
+\def\docheckformulareference#1#2%
+ {\chardef#1\ifx#2\empty
+ \zerocount
+ \else\ifx#2\forceformulanumberflag
+ \plusone
+ \else\ifx#2\inhibitformulanumberflag
+ \plustwo
+ \else
+ \plusthree
+ \fi\fi\fi}
+
+\def\formulanumber{\doformulanumber} % for the moment
+
+\def\doformulanumber
+ {\dosingleempty\dodoformulanumber}
+
+\def\dodoformulanumber[#1]%
+ {\def\currentformulareference{#1}%
+ \dosinglegroupempty\dododoformulanumber}
+
+\def\redoformulanumber#1%
+ {\def\currentformulasuffix{#1}%
+ \dododoformulanumber}
+
+\unexpanded\def\placeformula
+ {\doglobal\settrue\insideplaceformula
+ \settrue\incrementformulanumber
+ \dodoubleempty\doplaceformula}
+
+\unexpanded\def\placesubformula
+ {\doglobal\settrue\insideplacesubformula
+ \setfalse\incrementformulanumber
+ \dodoubleempty\doplaceformula}
+
+% \def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
+% {\def\currentplaceformulareference{#1}%
+% \let\currentplaceformulasuffix\empty
+% \futurelet\next\redoplaceformulaone}
+%
+% \let\mathdollarsign$ % no def
+%
+% \def\redoplaceformulaone % use doifnextcharelse
+% {\ifx\next\bgroup
+% \@EA\moreplaceformula % [ref]{}
+% \else
+% \@EA\redoplaceformulatwo
+% \fi}
+%
+% \long\def\moreplaceformula#1#2% #1 dummy #1 gobbles spaces
+% {\def\currentplaceformulasuffix{#1}%
+% \futurelet\next\redoplaceformulatwo#2}
+%
+% \def\redoplaceformulatwo
+% {\ifx\next\mathdollarsign
+% \@EA\dispplaceformula % [ref]$$
+% \else
+% \@EA\dodoplaceformula % [ref]\start
+% \fi}%
+
+\def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
+ {\def\currentplaceformulareference{#1}%
+ \let\currentplaceformulasuffix\empty
+ \doifnextbgroupelse\moreplaceformula\redoplaceformula} % [ref]{}
+
+\long\def\moreplaceformula#1%
+ {\def\currentplaceformulasuffix{#1}%
+ \redoplaceformula}
+
+\long\def\redoplaceformula
+ {\doifnextcharelse$\dispplaceformula\dodoplaceformula} % [ref]$$ [ref]\start
+
+\def\dodoplaceformula
+ {\handleplaceformulanumbering}
+
+\def\dispplaceformula$$#1$$%
+ {\handleplaceformulanumbering
+ \dostartformula{}#1\dostopformula}
+
+\let\startplaceformula\placeformula
+\let\stopplaceformula \relax
+
+% to be checked
+
+\def\doformulanumber
+ {\dosingleempty\dodoformulanumber}
+
+\def\dodoformulanumber[#1]%
+ {\def\currentformulareference{#1}%
+ \dosinglegroupempty\dododoformulanumber}
+
+\def\redoformulanumber#1%
+ {\def\currentformulasuffix{#1}%
+ \dododoformulanumber}
+
+\glet\doplaceformulanumber \relax
+\glet\donestedformulanumber\gobbletwoarguments
+
+\def\donestedformulanumberindeed#1#2%
+ {\def\currentnestedformulareference{#1}%
+ \def\currentnestedformulasuffix{#2}%
+ \glet\doplaceformulanumber\relax
+ \docheckformulareference\nestedformulanumbermode\currentnestedformulareference
+ \ifcase\nestedformulanumbermode
+ % nothing
+ \or
+ \doformulanumber
+ \or
+ % nothing
+ \or
+ \doformulanumber
+ \fi}
+
+\def\doplaceformulanumberindeed
+ {\glet\doplaceformulanumber\relax
+ \doifelse{\formulaparameter\c!location}\v!left
+ {\normalleqno{\dododoformulanumber}}
+ {\normalreqno{\dododoformulanumber}}}
+
+% todo
+
+\unexpanded\def\placenamedformula
+ {\dosingleempty\doplacenamedformula}
+
+\def\doplacenamedformula[#1]#2%
+ {\iffirstargument
+ \def\next{\placeformula[#1]}%
+ \else
+ \let\next\placeformula
+ \fi
+ \setformulalistentry{#2}%
+ \next}
+
+\global\let\doflushformulalistentry\gobbleoneargument
+
+\def\setformulalistentry#1%
+ {\gdef\doflushformulalistentry##1%
+ {\normalexpanded{\noexpand\writetolist[\v!formula]{##1}}{#1}%
+ \global\let\doflushformulalistentry\gobbleoneargument}}
+
+\protect \endinput
+
+% \abovedisplayshortskip0pt \belowdisplayshortskip0pt \abovedisplayskip0pt \belowdisplayskip0pt \forgetall
+%
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test plus \par \prevdepth \maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test minus \par \prevdepth-\maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+%
+% \parskip\baselineskip
+%
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test \par $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test plus \par \prevdepth \maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
+% test minus \par \prevdepth-\maxdimen $$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$$ \par test \par
diff --git a/tex/context/base/strc-not.lua b/tex/context/base/strc-not.lua
new file mode 100644
index 000000000..be883af57
--- /dev/null
+++ b/tex/context/base/strc-not.lua
@@ -0,0 +1,338 @@
+if not modules then modules = { } end modules ['strc-not'] = {
+ version = 1.001,
+ comment = "companion to strc-not.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+local next = next
+local texsprint, texwrite, texcount = tex.sprint, tex.write, tex.count
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local trace_notes = false trackers.register("structure.notes", function(v) trace_notes = v end)
+
+structure = structure or { }
+structure.helpers = structure.helpers or { }
+structure.lists = structure.lists or { }
+structure.sections = structure.sections or { }
+structure.counters = structure.counters or { }
+structure.notes = structure.notes or { }
+
+structure.notes.states = structure.notes.states or { }
+structure.lists.enhancers = structure.lists.enhancers or { }
+
+storage.register("structure/notes/states", structure.notes.states, "structure.notes.states")
+
+local helpers = structure.helpers
+local lists = structure.lists
+local sections = structure.sections
+local counters = structure.counters
+local notes = structure.notes
+
+local notestates = structure.notes.states
+local notedata = { }
+
+-- state: store, insert, postpone
+
+function notes.store(tag,n)
+ local nd = notedata[tag]
+ if not nd then
+ nd = { }
+ notedata[tag] = nd
+ end
+ local nnd = #nd+1
+ nd[nnd] = n
+ local state = notestates[tag]
+ if state.kind ~= "insert" then
+ if trace_notes then
+ logs.report("notes","storing %s with state %s as %s",tag,state.kind,nnd)
+ end
+ state.start = state.start or nnd
+ end
+ texwrite(#nd)
+end
+
+local function get(tag,n)
+ local nd = notedata[tag]
+ if nd then
+ n = n or #nd
+ nd = nd[n]
+ if nd then
+ if trace_notes then
+ logs.report("notes","getting %s of %s",n,tag)
+ end
+ return structure.lists.collected[nd]
+ end
+ end
+end
+
+local function getn(tag)
+ local nd = notedata[tag]
+ return (nd and #nd) or 0
+end
+
+nodes.get = get
+nodes.getn = getn
+
+-- we could make a special enhancer
+
+function notes.listindex(tag,n)
+ return notedata[tag][n]
+end
+
+function notes.define(tag,kind,number)
+ local state = notes.setstate(tag,kind)
+ state.number = number
+end
+
+function notes.save(tag,newkind)
+ local state = notestates[tag]
+ if state and not state.saved then
+ if trace_notes then
+ logs.report("notes","saving state of %s: %s -> %s",tag,state.kind,newkind or state.kind)
+ end
+ state.saved = notedata[tag]
+ state.savedkind = state.kind
+ state.kind = newkind or state.kind
+ notedata[tag] = { }
+ end
+end
+
+function notes.restore(tag,forcedstate)
+ local state = notestates[tag]
+ if state and state.saved then
+ if trace_notes then
+ logs.report("notes","restoring state of %s: %s -> %s",tag,state.kind,state.savedkind)
+ end
+ state.saved = nil
+ state.kind = forcedstate or state.savedkind
+ notedata[tag] = state.saved
+ end
+end
+
+function notes.setstate(tag,newkind)
+ local state = notestates[tag]
+ if trace_notes then
+ logs.report("notes","setting state of %s from %s to %s",tag,(state and state.kind) or "unset",newkind)
+ end
+ if not state then
+ state = {
+ kind = newkind
+ }
+ notestates[tag] = state
+ elseif newkind == "insert" then
+ if not state.start then
+ state.kind = newkind
+ end
+ else
+ state.kind = newkind
+ end
+ -- state.start can already be set and will be set when an entry is added or flushed
+ return state
+end
+
+function notes.getstate(tag)
+ local state = notestates[tag]
+ texsprint(ctxcatcodes,(state and state.kind ) or "unknown")
+end
+
+function notes.doifcontent(tag)
+ local ok = notestates[tag]
+ if ok then
+ if ok.kind == "insert" then
+ ok = tex.box[ok.number]
+ if ok then
+ ok = tbs.list
+ ok = lst and lst.next
+ end
+ else
+ ok = ok.start
+ end
+ end
+ commands.doif(ok)
+end
+
+local function internal(tag,n)
+ local nd = get(tag,n)
+ if nd then
+ local r = nd.references
+ if r then
+ local i = r.internal
+--~ return i and lists.internals[i]
+ return i and jobreferences.internals[i]
+ end
+ end
+ return nil
+end
+
+local function ordered(kind,name,n)
+ local o = lists.ordered[kind]
+ o = o and o[name]
+ return o and o[n]
+end
+
+notes.internal = internal
+notes.ordered = ordered
+
+function notes.doifonsamepageasprevious(tag)
+ local same = false
+ local n = getn(tag,n)
+ local current, previous = get(tag,n), get(tag,n-1)
+ if current and previous then
+ local cr, pr = current.references, previous.references
+ same = cr and pr and cr.realpage == pr.realpage
+ end
+ commands.doifelse(same)
+end
+
+function notes.checkpagechange(tag) -- called before increment !
+ local nd = notedata[tag] -- can be unset at first entry
+ if nd then
+ local current = ordered("note",tag,#nd)
+ local nextone = ordered("note",tag,#nd+1)
+ if nextone then
+ -- we can use data from the previous pass
+ if nextone.pagenumber.number > current.pagenumber.number then
+ counters.reset(tag)
+ end
+ elseif current then
+ -- we need to locate the next one, best guess
+ if texcount.realpageno > current.pagenumber.number then
+ counters.reset(tag)
+ end
+ end
+ end
+end
+
+function notes.deltapage(tag,n)
+ -- 0:unknown 1:textbefore, 2:textafter, 3:samepage
+ local what = 0
+ local li = internal(tag,n)
+ if li then
+ local metadata, pagenumber = li.metadata, li.pagenumber
+ if metadata and pagenumber then
+ local symbolpage = metadata.symbolpage or 0
+ local notepage = pagenumber.number or 0
+ if notepage > 0 and symbolpage > 0 then
+ if notepage < symbolpage then
+ what = 1
+ elseif notepage > symbolpage then
+ what = 2
+ else
+ what = 3
+ end
+ end
+ else
+ -- might be a note that is not flushed due to to deep
+ -- nesting in a vbox
+ what = 3
+ end
+ end
+ texwrite(what)
+end
+
+function notes.postpone()
+ if trace_notes then
+ logs.report("notes","postponing all insert notes")
+ end
+ for tag, state in next, notestates do
+ if state.kind ~= "store" then
+ notes.setstate(tag,"postpone")
+ end
+ end
+end
+
+function notes.setsymbolpage(tag,n)
+ local nd = get(tag,n)
+ if nd then
+ nd.metadata.symbolpage = texcount.realpageno
+ end
+end
+
+function notes.getsymbolpage(tag,n)
+ local nd = get(tag,n)
+ nd = nd and nd.metadata.symbolpage
+ texwrite(nd or 0)
+end
+
+function notes.getnumberpage(tag,n)
+ local li = internal(tag,n)
+ li = li and li.pagenumber
+ li = li and li.numbers
+ li = li and li[1]
+ texwrite(li or 0)
+end
+
+function notes.flush(tag,whatkind) -- store and postpone
+ local state = notestates[tag]
+ local kind = state.kind
+ if kind == whatkind then
+ local nd = notedata[tag]
+ local ns = state.start -- first index
+ if kind == "postpone" then
+ if nd and ns then
+ if trace_notes then
+ logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
+ end
+ for i=ns,#nd do
+ texsprint(ctxcatcodes,format("\\handlenoteinsert{%s}{%s}",tag,i))
+ end
+ end
+ state.start = nil
+ state.kind = "insert"
+ elseif kind == "store" then
+ if nd and ns then
+ if trace_notes then
+ logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
+ end
+ for i=ns,#nd do
+ texsprint(ctxcatcodes,format("\\handlenoteitself{%s}{%s}",tag,i))
+ end
+ end
+ state.start = nil
+ elseif kind == "reset" then
+ if nd and ns then
+ if trace_notes then
+ logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
+ end
+ end
+ state.start = nil
+ elseif trace_notes then
+ logs.report("notes","not flushing state %s of %s",whatkind,tag)
+ end
+ elseif trace_notes then
+ logs.report("notes","not flushing state %s of %s",whatkind,tag)
+ end
+end
+
+function notes.flushpostponed()
+ if trace_notes then
+ logs.report("notes","flushing all postponed notes")
+ end
+ for tag, _ in next, notestates do
+ notes.flush(tag,"postpone")
+ end
+end
+
+function notes.resetpostponed()
+ if trace_notes then
+ logs.report("notes","resetting all postponed notes")
+ end
+ for tag, state in next, notestates do
+ if state.kind == "postpone" then
+ state.start = nil
+ state.kind = "insert"
+ end
+ end
+end
+
+function notes.title(tag,n)
+ structure.lists.savedtitle(tag,notedata[tag][n])
+end
+
+function notes.number(tag,n,spec)
+ structure.lists.savedprefixednumber(tag,notedata[tag][n])
+end
diff --git a/tex/context/base/strc-not.mkii b/tex/context/base/strc-not.mkii
new file mode 100644
index 000000000..f6fae3378
--- /dev/null
+++ b/tex/context/base/strc-not.mkii
@@ -0,0 +1,1472 @@
+%D \module
+%D [ file=strc-not,
+%D version=2002.05.10, % 1997.09.15
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Note Handling, % Footnote Handling
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Note Handling}
+
+%D Unfortunately we cannot force an even number of lines in
+%D a two column footnote placement.
+
+%D There are some (still) dutch core commands used in this
+%D file.
+
+\unprotect
+
+% \dochecknote in processnotes
+
+% splitskips setten
+
+%D Footnotes are can be characterized by three components:
+%D
+%D \startitemize[packed]
+%D \item a small number \footnote {a footnote number} or
+%D symbol {\setupfootnotes [conversion=set 2]\footnote
+%D {a footnote}}
+%D \item and a similar mark at the bottom of the page
+%D \item followed by some additional text
+%D \stopitemize
+%D
+%D Because footnotes are declared at the location of their
+%D reference they can be seen as a special kind of
+%D floating bodies. Their placement is postponed but has to be
+%D taken into account in the pagebreak calculations. This kind
+%D of calculations are forced by using \type{\insert}.
+
+%D \macros
+%D {setupnote,setupnotedefinition}
+%D
+%D We can influence footnote typesetting with the setup
+%D command:
+%D
+%D \showsetup{setupfootnotes} % ! !
+%D
+%D It's sort of a custom to precede footnotes by a horizontal
+%D rule and although fancy rules like
+%D
+%D \starttyping
+%D \hbox to 10em{\hskip-3em\dotfill}
+%D \stoptyping
+%D
+%D Are quite ligitimate, we default to a simple one 20\% of the
+%D text width.
+%D
+%D When \type{n} exceeds~1, footnotes are typeset in
+%D multi||columns, using the algoritm presented on page~397
+%D of \TEX book. Footnotes can be places on a per page basis
+%D or whereever suitable. When we set~\type{n} to~0, we get a
+%D rearanged paragraph, typeset by the algoritms on pages 398
+%D and~389. We definitely did not reinvent that wheel.
+
+\newif\ifendnotes \endnotesfalse
+\newif\ifbottomnotes \bottomnotestrue
+
+\chardef\clevernotes=\zerocount % 0=page 1=firstcolumn 2=lastcolumn
+
+%D The next definitions indicate that we can frame the footnote
+%D area. The footnotes themselves are treated as definitions.
+%D
+%D \showsetup{setupfootnotes}
+
+\let\currentnote\v!footnote
+
+\def\noteparameter #1{\csname\??vn \currentnote#1\endcsname}
+\def\notedefparameter #1{\csname\??vn\??vn\currentnote#1\endcsname}
+\def\footnoteparameter #1{\csname\??vn \v!footnote#1\endcsname}
+
+\def\startnotedef {\resetdescriptions\csname\e!start\??vn\??vn\currentnote\endcsname}
+\def\stopnotedef {\csname\e!stop \??vn\??vn\currentnote\endcsname}
+
+\def\noteinsertion #1{\csname\??vn:#1\endcsname}
+\def\currentnoteins {\csname\??vn:\currentnote\endcsname}
+\def\currentsaveins {\csname\??vn-\currentnote\endcsname}
+\def\localpostponednotes {\csname\??vn+\currentnote\endcsname}
+
+\def\backupnoteins #1{\@EA\backupinsertion\csname\??vn:#1\endcsname}
+\def\currentbackupnoteins{\@EA\backupinsertion\csname\??vn:\currentnote\endcsname}
+
+%D The numbers that accompany a footnote are generated using
+%D the standard \CONTEXT\ numbering mechanism, and thereby can
+%D be assigned on a per whatever sectioning basis.
+
+\ifx\noteinsertions\undefined \let\noteinsertions\empty \fi % permits reload
+
+\def\doprocessnotes#1#2% #1 may be { ... }
+ {\def\currentnote{#2}#1}
+
+\def\doprocessnotescs#1#2% #1 == \cs that takes arg
+ {\def\currentnote{#2}\@EA#1\csname\??vn:\currentnote\endcsname}
+
+\def\processnotes #1{\processcommacommand[\noteinsertions]{\doprocessnotes {#1}}}
+\def\processnotescs#1{\processcommacommand[\noteinsertions]{\doprocessnotescs#1}}
+
+\def\savenotecontent {\processnotescs\saveinsertionbox }
+\def\erasenotebackup {\processnotescs\eraseinsertionbackup}
+\def\savenotedata {\processnotescs\saveinsertiondata }
+\def\restorenotecontent{\processnotescs\restoreinsertionbox }
+\def\restorenotedata {\processnotescs\restoreinsertiondata}
+
+%D ... due to invisibility of inserts ... maybe save them twice
+%D and split new part ... todo ...
+
+\def\doenablenotes % brrr
+ {\global\count\currentnoteins\plusthousand
+ \global\skip \currentnoteins1\baselineskip\relax}
+
+\def\dodisablenotes
+ {\global\count\currentnoteins\zerocount
+ \global\skip \currentnoteins\zeropoint}
+
+\def\enablenotes {\processnotes\doenablenotes }
+\def\disablenotes{\processnotes\dodisablenotes}
+
+\def\dosavenotes
+ {\global\setbox\currentsaveins\vbox
+ {\ifvoid\currentsaveins\else\unvbox\currentsaveins\fi
+ \box\currentnoteins}}
+
+\def\doflushsavednotes
+ {\ifvoid\currentsaveins\else
+ \insert\currentnoteins{\unvbox\currentsaveins}%
+ \fi}
+
+\def\savenotes {\processnotes\dosavenotes }
+\def\flushsavednotes{\processnotes\doflushsavednotes}
+
+%D Both these parameters are coupled to the setup command we
+%D will implement in a moment. This means that, given a
+%D suitable symbol set, symbols can be used instead of numbers,
+%D by saying:
+%D
+%D \starttyping
+%D \setupfootnotes[conversion=set 2]
+%D \stoptyping
+
+% experiment: (compare scope=text and scope=page)
+%
+% \definenote[mynote][way=bytext,location=text,width=\leftmarginwidth,scope=page,rule=,before=,after=,factor=0]
+% \setuptexttexts[margin][\vbox to \textheight{\placenotes[mynote]\vfill}][]
+
+\def\definenote
+ {\dodoubleempty\dodefinenote}
+
+% maybe we should inherit (todo)
+
+\def\@@defaultnotedefloc{\v!inleft}
+\def\@@defaultnotedefdis{\!!zeropoint}
+
+\def\dodefinenote[#1][#2]%
+ {\def\currentnote{#1}%
+ \ifundefined{\??vn:\currentnote}%
+ \@EA\installinsertion \csname\??vn:\currentnote\endcsname\relax
+ \@EA\installbackupinsertion\csname\??vn:\currentnote\endcsname\relax
+% \@EA\newbox\csname\??vn::\currentnote\endcsname % scratch box % needed ?
+ \@EA\newbox\csname\??vn+\currentnote\endcsname % local box
+ \@EA\newbox\csname\??vn-\currentnote\endcsname % local box
+ \doglobal\addtocommalist{#1}\noteinsertions
+ \fi
+ \definedescription
+ [\??vn\??vn\currentnote]
+ [\c!location=\@@defaultnotedefloc,
+ \c!distance=\@@defaultnotedefdis,
+ \c!width=\v!fit,
+ \c!headstyle=\noteparameter\c!style,
+ \c!headcolor=\noteparameter\c!color,
+ \c!before=,
+ \c!after=]%
+ \presetlocalframed
+ [\??vn\currentnote]%
+ \getparameters
+ [\??vn\currentnote]
+ [\c!location=\v!page,
+ \c!way=\v!by\v!part,
+ \c!sectionnumber=\v!no,
+ \c!conversion=,
+ \c!rule=\v!on,
+ \c!before=\blank,
+ \c!bodyfont=\v!small,
+ \c!style=,
+ \c!color=,
+ \c!after=,
+ \c!rulecolor=,
+ \c!rulethickness=\linewidth,
+ \c!frame=\v!off,
+ \c!margindistance=.5em,
+ \c!columndistance=1em,
+ \c!distance=.125em,
+ \c!align=\v!normal,
+ \c!tolerance=\v!tolerant,
+ \c!split=\v!tolerant,
+ %\c!width=\makeupwidth,
+ %\c!width=\ifdim\hsize<\makeupwidth\hsize\else\makeupwidth\fi,
+ \c!width=\defaultnotewidth,
+ \c!height=\textheight,
+ \c!numbercommand=\high,
+ \c!command=\noteparameter\c!numbercommand, % downward compatible
+ \c!separator=\@@koseparator,
+ \c!textcommand=\high,
+ \c!textstyle=\tx,
+ \c!textcolor=,
+ \c!interaction=\v!yes,
+ \c!factor=,
+ \c!scope=, % \v!text \v!page
+ \c!next=\autoinsertnextspace, % new, experimental with startnotes
+ \c!n=1]%
+ \definenumber
+ [\currentnote]
+ [\c!way=\noteparameter\c!way,
+ \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{\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]}
+
+\def\setupnote
+ {\dodoubleempty\dosetupnote}
+
+\def\dosetupnote[#1][#2]%
+ {\edef\currentnote{#1}%
+ \ifsecondargument
+ \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
+ \processaction
+ [\noteparameter\c!rule]
+ [ \v!on=>\letvalue{\??vn\c!rule:\currentnote}\normalnoterule,
+ \v!off=>\letvalue{\??vn\c!rule:\currentnote}\relax,
+ \s!default=>\letvalue{\??vn\c!rule:\currentnote}\relax,
+ \s!unknown=>\setvalue{\??vn\c!rule:\currentnote}{\noteparameter\c!rule}]%
+ \processaction % todo
+ [\noteparameter\c!split]
+ [ \v!tolerant=>\notepenalty\zeropoint,
+ \v!strict=>\notepenalty9999,
+ \v!verystrict=>\notepenalty\maxdimen,
+ \s!default=>\notepenalty\zeropoint,
+ \s!unknown=>\notepenalty\commalistelement]%
+ \fi
+ \dochecknote}
+
+\def\dolocalsetupnotes#1#2%
+ {\ifsecondargument
+ \edef\noteinsertions{#1}%
+ \processnotes{\setupnote[\currentnote][#2]}%
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\processnotes{\setupnote[\currentnote][#1]}}
+ {\edef\noteinsertions{#1}}%
+ \fi\fi}
+
+% redefined:
+
+% 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 (**)
+ \setnotedistance
+ \count\currentnoteins\plusthousand
+ \expanded{\doifcommonelse{\v!columns,\v!lastcolumn}{\noteparameter\c!location}}% **
+ {\chardef\clevernotes\plustwo}
+ {\expanded{\doifinsetelse{\v!firstcolumn}{\noteparameter\c!location}}% **
+ {\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
+ \expanded{\doifinsetelse{\v!page}{\noteparameter\c!location}}% **
+ {\expanded{\doifinsetelse{\v!high}{\noteparameter\c!location}}% **
+ {\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\checknotes
+ {\processnotes\dochecknote}
+
+% Example of using factor:
+%
+% \definenote[mynote][way=bypage,location=text,width=\marginwidth,rule=,before=,factor=0]
+% \setuplayout[backspace=5cm,margin=3cm,margindistance=.5cm,width=middle]
+% \setuptexttexts[margin][\vbox to \textheight{\placenotes[mynote]\vfill}][]
+% \starttext
+% \dorecurse{10}{test \mynote{one one one one one one} \input zapf \mynote{one one one one one one} }
+% \stoptext
+
+%D The noterule can be a graphic and therefore calling this
+%D setup macro at every skipswitch is tricky (many many MP
+%D runs). Let's just reserve a few points, that probably match
+%D those of the stretch component.
+
+\def\placenoterule
+ {\getvalue{\??vn\c!rule:\currentnote}}
+
+\def\normalnoterule
+ {\ifvmode
+ \color
+ [\noteparameter\c!rulecolor]
+ {\hrule
+ \!!width .2\hsize
+ \!!height\noteparameter\c!rulethickness
+ \!!depth \zeropoint}%
+ \kern\strutdepth
+ \fi}
+
+%D The following switch can be used to disable limiting the
+%D height of the footnote area, something that is needed in
+%D multi column balancing. Use this switch with care.
+
+\newif\ifnotelimit \notelimittrue
+
+\def\setnotedistance
+ {\setbox\scratchbox\vbox
+ {\forgetall
+ \noteparameter\c!before
+ \placenoterule
+ \noteparameter\c!after}%
+ \global\skip\currentnoteins\ht\scratchbox
+ \setbox\scratchbox\emptybox} % scratchbox can be in use
+
+\ifx\setnotehsize\undefined
+
+ \def\setnotehsize{\hsize\noteparameter\c!width} % can be overloaded
+
+\fi
+
+\def\setclevernotes
+ {\def\startpushnote {\bgroup % wellicht ooit kopuitlijnen
+ \setupinmargin[\c!align=\v!left]%
+ \startnotedef}%
+ \def\stoppushnote {\stopnotedef
+ \egroup}%
+ \let\startpopnotes \donothing
+ \let\stoppopnotes \donothing}
+
+\def\setcolumnnotes
+ {\def\startpushnote {\setnotehsize % possibly overloaded
+ \setrigidcolumnhsize\hsize{\noteparameter\c!columndistance}{\noteparameter\c!n}%
+ \bgroup
+ \setupinmargin[\c!align=\v!left]%
+ \startnotedef}%
+ \def\stoppushnote {\stopnotedef
+ \egroup}%
+ \def\startpopnotes {\bgroup
+ \setnotehsize
+ \setrigidcolumnhsize\hsize{\noteparameter\c!columndistance}{\noteparameter\c!n}%
+ \setbox0\vbox\bgroup}%
+ \def\stoppopnotes {\egroup
+ \setbox0\vbox
+ {\unvbox0\setbox0\lastbox
+ \ifvbox0\unvbox\else\box\fi0}%
+ \rigidcolumnbalance0\egroup}}
+
+% \def\settextnotes
+% {\def\startpushnote {\startvboxtohbox
+% \dostartattributes{\??vn\currentnote}\c!style\c!color\empty}%
+% \def\stoppushnote {\hskip\noteparameter\c!columndistance % plus.5em minus.5em
+% \dostopattributes
+% \stopvboxtohbox}%
+% \def\startpopnotes {\vbox\bgroup
+% \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize
+% \beginofshapebox}%
+% \def\stoppopnotes {\endofshapebox
+% \reshapebox{\ifhbox\shapebox\unhbox\else\box\fi\shapebox\endgraf}%
+% \flushshapebox
+% \egroup}}
+%
+% this was wrong (for ages)
+
+% \def\settextnotes
+% {\def\startpushnote {\startvboxtohbox
+% \dostartattributes{\??vn\currentnote}\c!style\c!color\empty}%
+% \def\stoppushnote {\hskip\noteparameter\c!columndistance % plus.5em minus.5em
+% \dostopattributes
+% \stopvboxtohbox}%
+% %\def\startpopnotes {\vbox\bgroup
+% % \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize}
+% %\def\stoppopnotes {\convertvboxtohbox
+% % \egroup}%
+% \def\startpopnotes {\vbox\bgroup
+% \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize
+% \beginofshapebox}%
+% \def\stoppopnotes {\endofshapebox
+% \doreshapebox{\box\shapebox}{}{}{}% get rid of penalties etc
+% \innerflushshapebox
+% \convertvboxtohbox
+% \egroup}%
+% }
+
+\def\settextnotes
+ {\def\startpushnote {\startvboxtohbox
+ \edef\@@defaultnotedefloc{\ifnum\noteparameter\c!n=\zerocount\v!serried\else\v!inleft \fi}%
+ \edef\@@defaultnotedefdis{\ifnum\noteparameter\c!n=\zerocount .5em\else\!!zeropoint\fi}%
+ \startnotedef}%
+ \def\stoppushnote {\stopnotedef
+ \hskip\noteparameter\c!columndistance % plus.5em minus.5em
+ \stopvboxtohbox}%
+ \def\startpopnotes {\vbox\bgroup
+ % here, else problems in preroll
+ \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize
+ \beginofshapebox}%
+ \def\stoppopnotes {\endofshapebox
+ \doreshapebox{\box\shapebox}{}{}{}% get rid of penalties etc
+ \innerflushshapebox
+ \convertvboxtohbox
+ \egroup}}
+
+%D The formatting depends on the width of the table, so we
+%D have to set \type {n} to zero.
+%D
+%D \starttyping
+%D \startbuffer
+%D \bTABLE
+%D \bTR \bTD one \footnote{\dorecurse{10}{abcd }} \eTD \bTD two \eTD \eTR
+%D \bTR \bTD three fout five six seven eight nine \eTD \bTD ten \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \startlocalfootnotes[n=0,location={text,none}]
+%D \placelegend[n=2]{\getbuffer}{\placelocalfootnotes}
+%D \stoplocalfootnotes
+%D \stoptyping
+
+%D \macros
+%D {footnote}
+%D
+%D A footnote can have a reference as optional argument and
+%D therefore its formal specification looks like:
+%D
+%D \showsetup{footnote}
+%D
+%D This command has one optional command: the reference. By
+%D saying \type{[-]} the number is omitted. The footnote
+%D command is not that sensitive to spacing, so it's quite
+%D legal to say:
+%D
+%D \startbuffer
+%D Users of \CONTEXT\ must keep both feet \footnote{Given they
+%D have two.} on the ground and not get confused \footnote{Or
+%D even crazy.} by all those obscure \footnote{But fortunately
+%D readable.} parameters.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D When setting the \type{conversion} to \type{set 2} we get
+%D something like:
+%D
+%D \bgroup
+%D \startnarrower
+%D \setupfootnotes[conversion=set 1]
+%D \getbuffer
+%D \stopnarrower
+%D \egroup
+%D
+%D Typesetting footnotes is, at least for the moment, disabled
+%D when reshaping boxes.
+%D
+%D The additional macro \type {\footnotetext} and the
+%D associated \type {\note} macro were implemented at
+%D request of users on the mailing list and a suggestion by
+%D taco to split of the symbol placement. I decided to
+%D merge this functionality with the existing \type {\note}
+%D functionality.
+
+\newif\ifnotesymbol
+
+\unexpanded\def\setnote {\dotripleempty\dosetnote[1]}
+\unexpanded\def\setnotetext{\dotripleempty\dosetnote[0]}
+
+\def\dosetnote[#1][#2][#3]%
+ {\unskip
+ \def\currentnote{#2}%
+ \dochecknote % sometimes needed for local notes
+ \ifcase#1\relax
+ \global\notesymbolfalse
+ \else
+ \global\notesymboltrue
+ \fi
+ \ifvisible % misty feature, make it obsolete
+ \ifreshapingbox
+ \@EAEAEA\gobbletwoarguments
+ \else
+ \@EAEAEA\dodonote
+ \fi
+ \else % todo: \iftrialtypesetting
+ \@EA\gobbletwoarguments
+ \fi{#3}}
+
+%D \macros
+%D {notesenabled}
+%D
+%D Before we come to typesetting a footnote, we first check
+%D if we have to typeset a number. When a \type{-} is passed
+%D instead of a reference, no number is typeset. We can
+%D temporary disable footnotes by saying
+%D
+%D \starttyping
+%D \notesenabledfalse
+%D \stoptyping
+%D
+%D which can be handy while for instance typesetting tables
+%D of contents. The pagewise footnote numbering is dedicated
+%D to Han The Thanh, who needed it first.
+
+\newif\ifnotesenabled \notesenabledtrue
+
+\appendtoks \notesenabledfalse \to \everymarking
+
+\newconditional\pagewisenotes % saves two hash entries
+
+\def\lastnotepage{1}
+
+\def\domovednote#1#2%
+ {\ifconditional\pagewisenotes
+ \doifreferencefoundelse{\s!fnt:t:\number\internalnotereference}
+ {\let\savedrealreference\currentrealreference
+ \doifreferencefoundelse{\s!fnt:f:\number\internalnotereference}
+ {\ifnum\savedrealreference<\currentrealreference\relax\symbol[#1]\else
+ \ifnum\savedrealreference>\currentrealreference\relax\symbol[#2]\fi\fi}
+ \donothing}
+ \donothing
+ \fi}
+
+% maybe some day
+%
+% \newconditional\tracemovednotes
+% \def\domovednote#1#2%
+% {\iflocation
+% \doshowmovednote{#1}{#2}%
+% \else\ifconditional\tracemovednotes
+% \doshowtracednote{#1}{#2}%
+% \fi\fi}
+% \def\doshowmovednote#1#2%
+% {\doifreferencefoundelse{\s!fnt:t:\number\internalnotereference}
+% {\let\savedrealreference\currentrealreference
+% \doifreferencefoundelse{\s!fnt:f:\number\internalnotereference}
+% {\ifnum\savedrealreference<\currentrealreference\relax
+% \symbol[#1]%
+% \else\ifnum\savedrealreference>\currentrealreference\relax
+% \symbol[#2]%
+% \fi\fi}
+% \donothing}
+% \donothing}
+% \def\doshowtracednote#1#2%
+% {\doifreferencefoundelse{\s!fnt:t:\number\internalnotereference}
+% {\let\savedrealreference\currentrealreference
+% \doifreferencefoundelse{\s!fnt:f:\number\internalnotereference}
+% {\ifnum\savedrealreference<\currentrealreference\relax
+% \writestatus{NOTE}{forward note reference on real page \currentrealreference}%
+% \else\ifnum\savedrealreference>\currentrealreference\relax
+% \writestatus{NOTE}{backward note reference on real page \currentrealreference}%
+% \fi\fi}
+% \donothing}
+% \donothing}
+
+\def\dodonote
+ {\ifnotesenabled
+ \iftrialtypesetting
+ \@EAEAEA\nododonote
+ \else
+ \@EAEAEA\dododonote
+ \fi
+ \else
+ \@EA\gobbletwoarguments
+ \fi}
+
+% \def\nododonote#1%
+% {\doifnot{#1}{-}{\kern.5em}% quick hack, approximation
+% \gobbleoneargument}
+%
+% more correct:
+
+\long\def\nododonote#1#2%
+ {\doifnot{#1}{-}
+ {\ifconditional\pagewisenotes
+ \doifreferencefoundelse{\s!fnt:t:\number\internalnotereference}
+ {\ifnum\currentrealreference>\lastnotepage\relax
+ \globallet\lastnotepage\currentrealreference
+ \resetnumber[\currentnote]%
+ \fi}
+ {}%
+ \fi
+ \incrementnumber[\currentnote]%
+ \makesectionnumber[\currentnote]%
+ \let\lastnotenumber\composedsectionnumber
+ \dolastnotesymbol
+ \decrementnumber[\currentnote]}}
+
+\def\dododonote#1%
+ {\global\advance\internalnotereference\plusone
+ \doifelse{\noteparameter\c!way}{\v!by\v!page}
+ {\settrue\pagewisenotes}
+ {\setfalse\pagewisenotes}%
+ \doifelse{#1}{-}
+ {\let\lastnotenumber\empty}
+ {\ifconditional\pagewisenotes
+ \doifreferencefoundelse{\s!fnt:t:\number\internalnotereference}
+ {\ifnum\currentrealreference>\lastnotepage\relax
+ \globallet\lastnotepage\currentrealreference
+ \resetnumber[\currentnote]%
+ \fi}
+ {}%
+ \fi
+ \incrementnumber[\currentnote]%
+ \makesectionnumber[\currentnote]%
+ \rawreference\s!fnt{#1}\composedsectionnumber
+ \let\lastnotenumber\composedsectionnumber}%
+ \dostartnote}
+
+%D The main typesetting routine is more or less the same as the
+%D \PLAIN\ \TEX\ one, except that we only handle one type while
+%D \PLAIN\ also has something \type{\v...}. In most cases
+%D footnotes can be handled by a straight insert, but we do so
+%D by using an indirect call to the \type{\insert} primitive.
+
+\def\dostartlocalnoteinsert
+ {\dochecknote
+ \ifendnotes
+ \global\setbox\localpostponednotes\vbox\bgroup
+ \ifvoid\localpostponednotes\else\unvbox\localpostponednotes\fi
+ \else
+ \insert\currentnoteins\bgroup
+ \fi}
+
+\let\startlocalnoteinsert\dostartlocalnoteinsert
+\let\stoplocalnoteinsert \egroup
+
+%D Making footnote numbers active is not always that logical,
+%D Making footnote numbers active is not always that logical,
+%D especially when we keep the reference and text at one page.
+%D On the other hand we need interactivity when we refer to
+%D previous notes or use end notes. Therefore we support
+%D interactive footnote numbers in two ways \footnote{This
+%D feature was implemented years after we were able to do so,
+%D mainly because endnotes had to be supported.} that is,
+%D automatically (vise versa) and by user supplied reference.
+
+\newcount\internalnotereference
+
+\let\startpushnote=\relax
+\let\stoppushnote =\relax
+
+\newsignal\notesignal
+\newcount \notepenalty
+
+\notepenalty=0 % needed in order to split in otrset
+
+\newconditional\processingnote
+
+\def\footnotereferencefrom
+ {\rawreference\s!fnt{\s!fnt:f:\number\internalnotereference}{}}
+
+\def\footnotereferenceto
+ {\global\advance\crossreferencenumber\minusone\relax % else problem, needs further testing
+ \rawreference\s!fnt{\s!fnt:t:\number\internalnotereference}{}}
+
+\def\dostartnote% nog gobble als in pagebody
+ {\pushsomestates
+ \bgroup
+ \settrue\processingnote
+ %\restorecatcodes % to be tested first
+ \iftypesettinglines % otherwise problems with \type <crlf> {xxx}
+ \ignorelines % makes footnotes work in \startlines ... \stoplines
+ \fi
+ \ifnotesymbol
+ \dolastnotesymbol
+ \else
+ \unskip\unskip
+ \globallet\lastnotesymbol\dolastnotesymbol
+ \fi
+ \startlocalnoteinsert
+ \doif{\noteparameter\c!scope}\v!page{\floatingpenalty\maxdimen}% experiment
+ \penalty\notepenalty
+ \forgetall
+ \setnotebodyfont
+ \redoconvertfont % to undo \undo calls in in headings etc
+ \splittopskip\strutht % not actually needed here
+ \splitmaxdepth\strutdp % not actually needed here
+ \leftmargindistance\noteparameter\c!margindistance
+ \rightmargindistance\leftmargindistance
+ \ifnum\noteparameter\c!n=\zerocount % no ifcase new 31-07-99 ; always ?
+ \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize
+ \fi
+ \startpushnote
+ {\ifx\lastnotenumber\empty \else
+ \preparefullnumber{\??vn\currentnote}\lastnotenumber\preparednumber
+ \doifelse{\noteparameter\c!interaction}\v!no
+ {\noteparameter\c!numbercommand
+ {\preparednumber\domovednote\v!nextpage\v!previouspage}}%
+ {\gotobox{\noteparameter\c!command % was \c!numbercommand, but compatible
+ {\preparednumber\domovednote\v!nextpage\v!previouspage}}%
+ [\s!fnt:f:\number\internalnotereference]}%
+ \fi
+ \doifelse{\noteparameter\c!interaction}\v!no
+ {\ifconditional\pagewisenotes
+ \footnotereferenceto
+ \fi}%
+ {\footnotereferenceto}}%
+ \bgroup
+ \postponenotes
+ \aftergroup\dostopnote
+ \begstrut
+ \let\next}
+
+\def\dostopnote
+ {\endstrut
+ \stoppushnote
+ \egroup
+ \stoplocalnoteinsert
+ \kern\notesignal\relax % \relax is needed to honor spaces
+ \popsomestates}
+
+\def\dolastnotesymbol
+ {\removeunwantedspaces
+ \doifitalicelse\/\donothing % Charles IV \footnote{the fourth}
+ \ifdim\lastkern=\notesignal
+ \dodonotesymbol{\kern\noteparameter\c!distance}% gets the font right, hack !
+ \fi
+ \nobreak
+ \doifelse{\noteparameter\c!interaction}\v!no
+ {\dodonotesymbol{\lastnotenumber\domovednote\v!previouspage\v!nextpage}%
+ \ifconditional\pagewisenotes
+ \footnotereferencefrom
+ \fi}
+ {\gotobox
+ {\dodonotesymbol{\lastnotenumber\domovednote\v!previouspage\v!nextpage}}%
+ [\s!fnt:t:\number\internalnotereference]%
+ \footnotereferencefrom}%
+ \globallet\lastnotesymbol\relax}
+
+\let\lastnotesymbol\relax
+
+%D \macros
+%D {note}
+%D
+%D Refering to a note is accomplished by the rather short
+%D command:
+%D
+%D \showsetup{note}
+%D
+%D This command is implemented rather straightforward as:
+
+\def\notesymbol
+ {\dodoubleempty\donotesymbol}
+
+% \def\donotesymbol[#1][#2]%
+% {\bgroup
+% \ifnotesenabled
+% \def\currentnote{#1}%
+% \ifsecondargument
+% \ifx\lastnotesymbol\relax
+% \unskip
+% \naarbox{\high{\tx\currenttextreference}}[#2]%
+% \else
+% \lastnotesymbol
+% \fi
+% \else
+% \lastnotesymbol
+% \fi
+% \fi
+% \egroup}
+
+\def\dodonotesymbol#1%
+ {\noteparameter\c!textcommand{\doattributes{\??vn\currentnote}\c!textstyle\c!textcolor{#1}}}
+
+% \def\donotesymbol[#1][#2]%
+% {\bgroup
+% \ifnotesenabled
+% \def\currentnote{#1}%
+% \ifsecondargument
+% \ifx\lastnotesymbol\relax % bugged
+% \unskip
+% \gotobox{\dodonotesymbol\currenttextreference}[#2]%
+% \else
+% \lastnotesymbol
+% \fi
+% \else
+% \lastnotesymbol
+% \fi
+% \fi
+% \egroup}
+
+\def\donotesymbol[#1][#2]%
+ {\bgroup
+ \ifnotesenabled
+ \def\currentnote{#1}%
+ \ifsecondargument
+ \unskip
+ \gotobox{\dodonotesymbol\currenttextreference}[#2]%
+ \else
+ \lastnotesymbol
+ \fi
+ \fi
+ \egroup}
+
+%D Normally footnotes are saved as inserts that are called upon
+%D as soon as the pagebody is constructed. The footnote
+%D insertion routine looks just like the \PLAIN\ \TEX\ one,
+%D except that we check for the end note state.
+
+\let\startpopnotes = \relax
+\let\stoppopnotes = \relax
+
+\def\placenoteinserts
+ {\processnotes\doplacenoteinserts}
+
+% testcase for split bottom alignment see (a) below
+%
+% \dorecurse{6}{\input tufte\footnote{\input ward \input tufte \relax}}
+
+\def\doplacenoteinserts
+ {%\ifvoid\currentnoteins \else % unsafe, strange
+ \relax\ifdim\ht\currentnoteins>\zeropoint\relax
+ \dochecknote
+ \ifendnotes \else
+ \noteparameter\c!before
+ \placenoterule % alleen in ..mode
+ \bgroup
+ \setnotebodyfont
+ \setbox0\hbox
+ {\startpopnotes
+ \setnotebodyfont
+% % this should be checked, smells like a mix-up
+% % does not split: \ifcase\noteparameter\c!n\unvbox\else\box\fi\currentnoteins
+ \ifcase\noteparameter\c!n\relax
+\iftrialtypesetting\unvcopy\else\unvbox\fi\currentnoteins
+% \unvbox\currentnoteins
+ \or
+\iftrialtypesetting\copy\else\box\fi\currentnoteins
+% \box\currentnoteins
+ \obeydepth % (a) added , since split footnotes will not align properly
+ \else
+\iftrialtypesetting\unvcopy\else\unvbox\fi\currentnoteins
+% \unvbox\currentnoteins
+ \fi
+ % this is too ugly actually
+ \stoppopnotes}%
+ \setbox2\hbox
+ {\localframed
+ [\??vn\currentnote]
+ [\c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!strut=\v!no,
+ \c!offset=\v!overlay]
+ {\ifdim\dp0=\zeropoint % this hack is needed because \vadjust
+ \hbox{\lower\strutdp\box0}% % in margin number placement
+ \else % hides the (always) present depth
+ \box0
+ \fi}}%
+ \setbox2\hbox{\lower\strutdepth\box2}%
+ \dp2=\strutdepth % so we know that it has the note bodyfont depth
+ \box2
+ \egroup
+ \noteparameter\c!after
+ \fi
+ \fi}
+
+%D Supporting end notes is surprisingly easy. Even better, we
+%D can combine this feature with solving the common \TEX\
+%D problem of disappearing inserts when they're called for in
+%D deeply nested boxes. The general case looks like:
+%D
+%D \starttyping
+%D \postponenotes
+%D \.box{whatever we want with footnotes}
+%D \flushnotes
+%D \stoptyping
+%D
+%D This alternative can be used in headings, captions, tables
+%D etc. The latter one sometimes calls for notes local to
+%D the table, which can be realized by saying
+%D
+%D \starttyping
+%D \setlocalfootnotes
+%D some kind of table with local footnotes
+%D \placelocalfootnotes
+%D \stoptyping
+%D
+%D Postponing is accomplished by simply redefining the (local)
+%D insert operation. A not too robust method uses the
+%D \type{\insert} primitive when possible. This method fails in
+%D situations where it's not entirely clear in what mode \TEX\
+%D is. Therefore the auto method can is to be overruled when
+%D needed.
+
+\newconditional\postponednote
+
+\def\autopostponenotes
+ {\def\startlocalnoteinsert % not global
+ {\ifinner
+ %\message{[postponed note]}%
+ \global\setbox\localpostponednotes\vbox\bgroup
+ \global\settrue\postponednote
+ \ifvoid\localpostponednotes\else\unvbox\localpostponednotes\fi
+ \else
+ %\message{[inserted note]}%
+ \expandafter\dostartlocalnoteinsert
+ \fi}}
+
+\def\postponenotes
+ {\let\autopostponenotes\postponenotes
+ \let\postponenotes\relax % prevent loops
+ \def\startlocalnoteinsert % not global
+ {%\message{[postponed note]}%
+ \global\setbox\localpostponednotes\vbox\bgroup
+ \global\settrue\postponednote
+% \unvbox\localpostponednotes}}
+ \ifvoid\localpostponednotes\else\unvbox\localpostponednotes\fi}}
+
+\def\dodoflushnotes % per class, todo: handle endnotes here
+ {\ifdim\ht\localpostponednotes>\zeropoint
+ \bgroup
+ \dochecknote
+ \ifendnotes \else
+ % not that accurate when multiple notes
+ \ifdim\dimexpr\pagegoal-\pagetotal\relax<\ht\localpostponednotes
+ \message{[moved note \currentnote]}%
+ \fi
+ \insert\currentnoteins\bgroup\unvbox\localpostponednotes\egroup
+ \fi
+ \egroup
+ \fi}
+
+\def\doflushnotes % also called directly, \ifvoid is needed !
+ {\ifconditional\processingnote \else \ifconditional\postponednote
+ \let\localnoteinsert\normalnoteinsert % not global
+ \processnotes\dodoflushnotes
+ \global\setfalse\postponednote
+ \fi \fi}
+
+\def\flushnotes
+ {\ifconditional\processingnote \else \ifconditional\postponednote
+ \ifinner \else \ifinpagebody \else
+ %\ifvmode % less interference, but also less secure
+ \doflushnotes
+ %\fi
+ \fi \fi
+ \fi \fi}
+
+%D For old times sake:
+
+\def\flushfootnotes {\flushnotes}
+\def\doflushfootnotes{\doflushnotes}
+
+%D This is a nasty and new secondary footnote flusher. It
+%D can be hooked into \type {\everypar} like:
+%D
+%D \starttyping
+%D \appendtoks \synchronizenotes \to \everypar
+%D \stoptyping
+
+\def\dosynchronizenotes
+ {\ifvoid\currentnoteins\else\insert\currentnoteins{\unvbox\currentnoteins}\fi}
+
+\def\synchronizenotes
+ {\processnotes\dosynchronizenotes}
+
+%D There are several placement alternatives.
+
+\def\placenotesintext#1%
+ {\ifdim\ht#1>\zeropoint
+ \endgraf
+ \ifvmode
+ \whitespace
+ \noteparameter\c!before
+ \fi
+ \snaptogrid\hbox
+ {\setnotebodyfont
+ \setbox0\hbox
+ {\startpopnotes
+ \unvbox#1\endgraf\relax
+ \stoppopnotes}%
+ \doif{\noteparameter\c!width}\v!fit % new, auto width
+ {\setbox0\hbox % uggly but ok.
+ {\beginofshapebox
+ \unhbox0\setbox0=\lastbox\unvbox0
+ \endofshapebox
+ \reshapebox{\hbox{\unhbox\shapebox}}%
+ \vbox{\flushshapebox}}}%
+ \localframed
+ [\??vn\currentnote]
+ [ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!strut=\v!no,
+ \c!offset=\v!overlay]
+ {\ifdim\dp0=\zeropoint % this hack is needed because \vadjust
+ \hbox{\lower\strutdp\box0}% % in margin number placement
+ \else % hides the (always) present depth
+ \box0
+ \fi}}%
+ \ifvmode
+ \noteparameter\c!after
+ \fi
+ \fi}
+
+%D A stupid alternative is also provided:
+%D
+%D \starttyping
+%D \setupfootnotes[location={text,none}]
+%D \stoptyping
+
+\def\placenotesasnone#1% is grouped already
+ {\ifdim\ht#1>\zeropoint
+ \noteparameter\c!before
+ \setnotebodyfont
+ \startpopnotes % make sure that fake height is killed
+ \unvbox#1\endgraf
+ \stoppopnotes
+ % weird
+ \ifhmode
+ \setbox0=\lastbox \ifvbox0 \unvbox0\else\box0\fi % enable columns
+ \fi
+ \noteparameter\c!after
+ \fi}
+
+%D \macros
+%D {startlocalfootnotes,placelocalfootnotes}
+%D
+%D The next two macros can be used in for instance tables, as
+%D we'll demonstrate later on.
+%D
+%D \showsetup{startlocalfootnotes}
+%D \showsetup{placelocalfootnotes}
+
+\def\defaultnotewidth{\makeupwidth}
+
+% \def\collectlocalnotes
+% {\def\localnoteinsert##1% was \gdef, but never reset!
+% {%\message{[local note]}%
+% \global\setbox\localpostponednotes\vbox\bgroup
+% \ifvoid\localpostponednotes \else
+% \unvbox\localpostponednotes
+% \fi
+% \let\next}}
+
+\def\collectlocalnotes
+ {\def\startlocalnoteinsert% was \gdef, but never reset!
+ {%\message{[local note]}%
+ \global\setbox\localpostponednotes\vbox\bgroup
+ \ifvoid\localpostponednotes\else\unvbox\localpostponednotes\fi}}
+
+\def\startlocalnotes
+ {\bgroup % here because we support \vbox\startlocalnotes
+ \dosingleempty\dostartlocalnotes}
+
+\chardef\localnodemode\zerocount
+
+\def\dostartlocalnotes[#1]%
+ {\let\autopostponenotes\postponenotes
+ \let\postponenotes\collectlocalnotes
+ \chardef\localnodemode\plusone % new
+ \def\defaultnotewidth{\ifdim\hsize<\makeupwidth\hsize\else\makeupwidth\fi}%
+ \processnotes
+ {\doifsomething{#1}{\setupnote[\currentnote][#1]}%
+ \savenumber[\currentnote]%
+ \resetnumber[\currentnote]}%
+ \collectlocalnotes}
+
+\def\stoplocalnotes
+ {\processnotes{\restorenumber[\currentnote]}%
+ \egroup
+ \checknotes} % really needed, else wrong main settings
+
+\def\placelocalnotes
+ {\dodoubleempty\doplacelocalnotes}
+
+\def\doplacelocalnotes[#1][#2]%
+ {\bgroup
+ \chardef\localnodemode\plusone % new
+ \dolocalsetupnotes{#1}{#2}%
+ \processnotes\dodoplacelocalnotes
+ \egroup
+ \checknotes} % probably not needed
+
+\def\dodoplacelocalnotes
+ {\dochecknote
+ \expanded{\doifinsetelse{\v!none}{\noteparameter\c!location}}
+ \placenotesasnone\placenotesintext
+ \localpostponednotes}
+
+%D These commands can be used like:
+%D
+%D \startbuffer
+%D \startlocalnotes[width=.3\hsize,n=0]
+%D \placetable
+%D {Some Table}
+%D \placeontopofeachother
+%D {\starttable[|l|r|]
+%D \HL
+%D \VL Nota\footnote{Bene} \VL Bene\footnote{Nota} \VL\SR
+%D \VL Bene\footnote{Nota} \VL Nota\footnote{Bene} \VL\SR
+%D \HL
+%D \stoptable}
+%D {\placelocalnotes}
+%D \stoplocalnotes
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Because this table placement macro expect box content, and
+%D thanks to the grouping of the local footnotes, we don't need
+%D additional braces.
+%D
+%D \getbuffer
+
+%D \macros
+%D {placefootnotes}
+%D
+%D We still have no decent command for placing footnotes
+%D somewhere else than at the bottom of the page (for which no
+%D user action is needed). Footnotes (endnotes) can be
+%D placed by using
+%D
+%D \showsetup{placefootnotes}
+
+\def\placebottomnotes
+ {\processnotes\dodoplacenotes}
+
+% \definecomplexorsimple\placenotes
+
+% \def\simpleplacenotes
+% {\processnotes\dodoplacenotes}
+
+% \def\complexplacenotes[#1]%
+% {\bgroup
+% \edef\noteinsertions{#1}%
+% \simpleplacenotes
+% \egroup}
+
+\def\placenotes
+ {\dodoubleempty\doplacenotes}
+
+\def\doplacenotes[#1][#2]%
+ {\bgroup
+ \dolocalsetupnotes{#1}{#2}%
+ \processnotes\dodoplacenotes
+ \egroup}
+
+\def\dodoplacenotes
+ {\dochecknote
+ \ifendnotes
+ \ifinpagebody \else \ifdim\ht\localpostponednotes>\zeropoint
+ \expanded{\doifinsetelse{\v!none}{\noteparameter\c!location}}
+ \placenotesasnone\placenotesintext\localpostponednotes
+ \fi \fi
+ \else \ifdim\ht\currentnoteins>\zeropoint
+ \placenoteinserts
+ \fi \fi}
+
+%D \macros
+%D {fakenotes}
+
+\def\fakenotes
+ {\ifhmode\endgraf\fi\ifvmode
+ \calculatetotalclevernoteheight
+ \ifdim\totalnoteheight>\zeropoint \kern\totalnoteheight \fi
+ \fi}
+
+\def\fakepagenotes
+ {\ifhmode\endgraf\fi\ifvmode
+ \calculatetotalpagenoteheight
+ \ifdim\totalnoteheight>\zeropoint \kern\totalnoteheight \fi
+ \fi}
+
+\newdimen\totalnoteheight
+
+\def\doaddtototalnoteheight#1%
+ {\ifdim\ht#1>\zeropoint
+ \advance\totalnoteheight\ht #1%
+ \advance\totalnoteheight\skip#1%
+ \fi}
+
+\def\docalculatetotalnoteheight
+ {\ifcase\clevernotes % tricky here ! ! ! to be sorted out ! ! !
+ \doaddtototalnoteheight\currentnoteins
+ \else
+ \doaddtototalnoteheight\currentbackupnoteins
+ \fi}
+
+\def\docalculatetotalclevernoteheight
+ {\ifcase\clevernotes \else % tricky here ! ! ! to be sorted out ! ! !
+ \doaddtototalnoteheight\currentnoteins
+ \fi}
+
+\def\docalculatetotalpagenoteheight
+ {\doaddtototalnoteheight\currentnoteins}
+
+\def\calculatetotalnoteheight {\totalnoteheight\zeropoint\processnotes\docalculatetotalnoteheight}
+\def\calculatetotalclevernoteheight{\totalnoteheight\zeropoint\processnotes\docalculatetotalclevernoteheight}
+\def\calculatetotalpagenoteheight {\totalnoteheight\zeropoint\processnotes\docalculatetotalpagenoteheight}
+
+\newif\ifnotespresent
+
+\def\dochecknotepresence
+ {\ifdim\ht\currentnoteins>\zeropoint
+ \notespresenttrue
+ \fi}
+
+\def\checknotepresence
+ {\notespresentfalse
+ \processnotes\dochecknotepresence}
+
+%D Now how can this mechanism be hooked into \CONTEXT\ without
+%D explictly postponing footnotes? The solution turned out to
+%D be rather simple:
+%D
+%D \starttyping
+%D \everypar {...\flushnotes...}
+%D \neverypar {...\postponenotes}
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \def\ejectinsert%
+%D {...
+%D \flushnotes
+%D ...}
+%D \stoptyping
+%D
+%D We can use \type{\neverypar} because in most commands
+%D sensitive to footnote gobbling we disable \type{\everypar}
+%D in favor for \type{\neverypar}. In fact, this footnote
+%D implementation is the first to use this scheme.
+
+%D When typesetting footnotes, we have to return to the
+%D footnote specific bodyfont size, which is in most cases derived
+%D from the global document bodyfont size. In the previous macros
+%D we already used a footnote specific font setting macro.
+
+\def\setnotebodyfont
+ {\let\setnotebodyfont\relax
+ \restoreglobalbodyfont
+ \switchtobodyfont[\noteparameter\c!bodyfont]%
+ \setuptolerance[\noteparameter\c!tolerance]%
+ \setupalign[\noteparameter\c!align]}
+
+%D The footnote mechanism defaults to a traditional one
+%D column way of showing them. By default we precede them by
+%D a small line.
+
+\ifx\v!endnote\undefined \def\v!endnote{endnote} \fi
+
+\definenote [\v!footnote ]
+\definenote [\v!endnote ] [\c!location=\v!none] % else no break
+
+% \definenote
+% [mynote]
+% [way=bypage,
+% location={page,high},
+% factor=0,
+% width=\leftmarginwidth,
+% scope=page,
+% rule=,
+% before=,
+% after=]
+%
+% \setuptexttexts
+% [margin]
+% [\vbox to \textheight{\placenotes[mynote]\vfill}]
+% []
+
+%D Compatibility macros:
+
+ \def\setupfootnotedefinition{\setupnotedefinition [\v!footnote]}
+ \def\setupfootnotes {\setupnote [\v!footnote]}
+\unexpanded \def\footnote {\setnote [\v!footnote]}
+\unexpanded \def\footnotetext {\setnotetext [\v!footnote]}
+ \def\note {\dodoubleempty\notesymbol [\v!footnote]} % alleen footnote
+ \def\placefootnotes {\dodoubleempty\doplacefootnotes [\v!footnote]}
+ \def\placelocalfootnotes {\dodoubleempty\doplacelocalfootnotes[\v!footnote]}
+ \def\startlocalfootnotes {\startlocalnotes}
+ \def\stoplocalfootnotes {\stoplocalnotes }
+
+\def\doplacefootnotes [#1][#2]%
+ {\ifsecondargument\placenotes [#1][#2,\c!height=\textheight]\else\placenotes [#1]\fi}
+
+\def\doplacelocalfootnotes[#1][#2]%
+ {\ifsecondargument\placelocalnotes[#1][#2,\c!height=\textheight]\else\placelocalnotes[#1]\fi}
+
+%D Backward compatibility command:
+
+\def\footins {\noteinsertion\currentnote}
+\def\postponefootnotes {\postponenotes}
+\def\autopostponefootnotes{\autopostponenotes}
+
+%D New trickery:
+
+\def\ownnotesymbol#1% #1 gets number passed
+ {\executeifdefined{\??vn::\currentnote}\empty}
+
+\def\setnotesymbol[#1]#2#3%
+ {\prewordbreak % prevent lookback
+ \gdef\lastnotenumber{#2}%
+ \setgvalue{\??vn::#1}{#3}
+ \dolastnotesymbol}
+
+\def\ownnote[#1]#2#3#4%
+ {\setnotesymbol[#1]{#2}{#3}%
+ \setnotetext [#1]{#4}}
+
+\defineconversion
+ [ownnote]
+ [\ownnotesymbol]
+
+%D Usage:
+
+% maybe we should predefine this one
+
+% \definenote
+% [glossary]
+% [way=bypage,
+% location={page,high},
+% factor=0,
+% width=\leftmarginwidth,
+% scope=page,
+% conversion=ownnote,
+% numbercommand=,
+% textcommand=,
+% textstyle=,
+% rule=,
+% before=,
+% after=]
+%
+% \setupnotedefinition
+% [glossary]
+% [location=left,
+% width=fit,
+% distance=.5em,
+% align={right,tolerant,stretch},
+% headstyle=bold,
+% hang=1]
+%
+% \setuplayout
+% [width=middle,
+% height=middle,
+% backspace=5cm,
+% margin=4cm,
+% margindistance=.25cm,
+% cutspace=2cm]
+%
+% \setuptexttexts
+% [margin]
+% [\setups{glossary}]
+% [\setups{glossary}]
+%
+% \startsetups glossary
+% \vbox to \textheight {\placenotes[glossary]\vfill}
+% \stopsetups
+%
+% \dorecurse{10}
+% {\dorecurse{5}
+% {\ownnote[glossary]{whow}{whatever needs to be glossed:~\recurselevel}%
+% \input tufte \relax}}
+
+\protect \endinput
+
+% \def\myfootnote[#1]#2% let's guess that #2 is without catcode problems
+% {\setgvalue{note:t:#1}%
+% {\setxvalue{note:l:#1}{\getvalue{note:n:#1}}%
+% \footnote[note:a:#1:\getvalue{note:l:#1}]{#2}}%
+% \setgvalue{note:n:#1}%
+% {1}%
+% \getvalue{note:t:#1}}%
+
+% \def\mynote[#1]%
+% {\removeunwantedspaces
+% \scratchcounter\getvalue{note:n:#1}\relax
+% \edef\NoteNumber{\the\scratchcounter}%
+% \doglobal\incrementvalue{note:n:#1}\relax
+% \doifreferencefoundelse{note:a:#1:1}
+% {\edef\NotePageA{\number\currentrealreference}%
+% \doifreferencefoundelse{note:a:#1:\getvalue{note:n:#1}}
+% {\edef\NotePageB{\number\currentrealreference}%
+% \doifreferencefoundelse{note:a:#1:\NoteNumber}
+% {\ifnum\currentrealreference=\NotePageB\relax
+% \pagereference[note:a:#1:\getvalue{note:n:#1}]%
+% \note[note:a:#1:\getvalue{note:l:#1}]%
+% \else\ifnum\NotePageA=\NotePageB\relax
+% \pagereference[note:a:#1:\getvalue{note:n:#1}]%
+% \note[note:a:#1:\getvalue{note:l:#1}]%
+% \else
+% \getvalue{note:t:#1}%
+% \fi\fi}
+% {\ifnum\NotePageA=\NotePageB\relax
+% \pagereference[note:a:#1:\getvalue{note:n:#1}]%
+% \note[note:a:#1:\getvalue{note:l:#1}]%
+% \else
+% \getvalue{note:t:#1}%
+% \fi}}
+% {\pagereference[note:a:#1:\getvalue{note:n:#1}]%
+% \note[note:a:#1:\getvalue{note:l:#1}]}}
+% {\pagereference[note:a:#1:\getvalue{note:n:#1}]%
+% \note[note:a:#1:\getvalue{note:l:#1}]}}
+
+% \starttext
+
+% funny \myfootnote[funny]{funny} funny \mynote[funny] \page
+
+% funny \mynote[funny] funny \mynote[funny] funny \mynote[funny] \page
+% funny \mynote[funny] funny \mynote[funny] \page
+% funny \mynote[funny] funny \mynote[funny] funny \mynote[funny] \page
+
+% \stoptext
diff --git a/tex/context/base/strc-not.mkiv b/tex/context/base/strc-not.mkiv
new file mode 100644
index 000000000..45e37b276
--- /dev/null
+++ b/tex/context/base/strc-not.mkiv
@@ -0,0 +1,1280 @@
+%D \module
+%D [ file=strc-not,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Note Handling,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Note Handling}
+
+\registerctxluafile{strc-not}{1.001}
+
+\unprotect
+
+% this needs a further cleanup ...
+%
+% -- set breakpoin in descriptions
+% -- reset after trialtypesetting
+% -- that way we can trick the symbol space
+
+% obsolete
+
+\let\autopostponenotes\relax
+
+% removed:
+%
+% \pushsomestates
+%
+% core-ins -> obsolete
+%
+% saveinsertiondata
+% restoreinsertiondata
+% saveinsertionbox
+% eraseinsertionbackup
+% restoreinsertionbackup
+%
+% \def\doprocessnotescs#1#2% #1 == \cs that takes arg
+% {\def\currentnote{#2}\@EA#1\csname\??vn:\currentnote\endcsname}
+% \def\processnotescs#1{\processcommacommand[\noteinsertions]{\doprocessnotescs#1}}
+% \def\noteinsertion #1{\csname\??vn:#1\endcsname}
+
+\def\savenotedata {\writestatus{todo}{save note data}}
+\def\restorenotedata {\writestatus{todo}{restore note data}}
+\def\savenotecontent {\writestatus{todo}{save note content}}
+\def\restorenotecontent{\writestatus{todo}{restore note content}}
+\def\erasenotebackup {\writestatus{todo}{erase note backup}}
+
+% page-set:
+
+\def\enablenotes {\writestatus{todo}{enable notes}}
+\def\disablenotes {\writestatus{todo}{disable notes}}
+\def\savenotes {\writestatus{todo}{save notes}}
+\def\flushsavednotes{\writestatus{todo}{flush notes}}
+
+% experiment: (compare scope=text and scope=page)
+%
+% \definenote[mynote][way=bytext,location=text,width=\leftmarginwidth,scope=page,rule=,before=,after=,factor=0]
+% \setuptexttexts[margin][\vbox to \textheight{\placenotes[mynote]\vfill}][]
+
+%D Footnotes are can be characterized by three components:
+%D
+%D \startitemize[packed]
+%D \item a small number \footnote {a footnote number} or
+%D symbol {\setupfootnotes [conversion=set 2]\footnote
+%D {a footnote}}
+%D \item and a similar mark at the bottom of the page
+%D \item followed by some additional text
+%D \stopitemize
+%D
+%D Because footnotes are declared at the location of their
+%D reference they can be seen as a special kind of
+%D floating bodies. Their placement is postponed but has to be
+%D taken into account in the pagebreak calculations. This kind
+%D of calculations are forced by using \type{\insert}s and dealing
+%D with all cases is not trivial.
+
+%D \macros
+%D {notesenabled}
+%D
+%D We need a couple of states because at some moments we don't want
+%D to mess around with inserts at all. Take for instance a table
+%D of contents. And so we can temporary disable footnotes by saying
+%D
+%D \starttyping
+%D \notesenabledfalse
+%D \stoptyping
+
+\newif\ifnotesenabled \notesenabledtrue
+
+% better mark a note .. once flushed no more flushing
+
+%appendtoks \notesenabledfalse \to \everymarking
+\appendtoks \notesenabledfalse \to \everypagebody
+\appendtoks \notesenabledfalse \to \everystructurelist % quick hack
+
+%D Often we need to process the whole set of notes and to make that
+%D fast, we use a token register:
+
+\newtoks\tobeprocessednotes
+
+\unexpanded\def\processnotes#1% #1: \macro that uses \currentnote
+ {\def\doprocesssomenote##1{\edef\currentnote{##1}\let\currentdescription\currentnote#1}%
+ \the\tobeprocessednotes}
+
+%D Notes have their own paremater handlers. The complication here
+%D is that we use descriptions to typeset the note, so we have several
+%D resolvers.
+
+\let\currentnote\v!footnote
+
+\def\noteparameter #1{\csname\donoteparameter{\??vn\currentnote}#1\endcsname}
+\def\noteparameterhash#1{\donoteparameterhash {\??vn\currentnote}#1}
+
+\def\namednoteparameter#1#2{\csname\donoteparameter{\??vn#1}#2\endcsname}
+
+\def\donoteparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\donoteparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\donoteparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\donoteparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\donoteparentparameter #1#2{\ifx#1\relax\s!empty\else\donoteparameter #1#2\fi}
+\def\donoteparentparameterhash#1#2{\ifx#1\relax \else\donoteparameterhash#1#2\fi}
+
+\def\detokenizednoteparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??vn#1\endcsname}}
+
+\def\dosetnoteattributes#1#2% style color
+ {\edef\fontattributehash {\noteparameterhash#1}%
+ \edef\colorattributehash{\noteparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+%D \macros
+%D {setupnote,setupnotedefinition}
+%D
+%D We can influence footnote typesetting with the setup
+%D command:
+%D
+%D \showsetup{setupnotes}
+%D \showsetup{setupnote}
+%D
+%D The definition command indicate that we can frame the footnote
+%D area. The footnotes themselves are treated as descriptions.
+%D
+%D \showsetup{definenote}
+%D
+%D It's sort of a custom to precede footnotes by a horizontal
+%D rule and although fancy rules like
+%D
+%D \starttyping
+%D \hbox to 10em{\hskip-3em\dotfill}
+%D \stoptyping
+%D
+%D Are quite ligitimate, we default to a simple one 20\% of the
+%D text width.
+
+\unexpanded\def\setupnotes
+ {\dodoubleargument\getparameters[\??vn]}
+
+\setupnotes
+ [\c!location=\v!page,
+ \c!way=\v!by\v!part,
+ %\c!conversion=,
+ \c!rule=\v!on,
+ \c!before=\blank,
+ \c!bodyfont=\v!small,
+ %\c!style=,
+ %\c!color=,
+ %\c!after=,
+ %\c!rulecolor=,
+ \c!rulethickness=\linewidth,
+ \c!frame=\v!off,
+ \c!margindistance=.5em,
+ \c!columndistance=1em,
+ \c!distance=.125em,
+ \c!align=\v!normal,
+ \c!tolerance=\v!tolerant,
+ \c!split=\v!tolerant,
+ %\c!width=\makeupwidth,
+ %\c!width=\ifdim\hsize<\makeupwidth\hsize\else\makeupwidth\fi,
+ \c!width=\defaultnotewidth,
+ \c!height=\textheight,
+ \c!numbercommand=\high,
+ \c!command=\noteparameter\c!numbercommand, % downward compatible
+ \c!separator=,% \@@koseparator,
+ \c!textcommand=\high,
+ \c!textstyle=\tx,
+ %\c!textcolor=,
+ \c!interaction=\v!yes,
+ %\c!factor=,
+ %\c!scope=, % \v!text \v!page
+ \c!prefixconnector=.,
+ %\c!next=\autoinsertnextspace
+ \c!prefix=\v!no,
+ %\c!continue=\v!no,
+ \c!n=1]
+
+\setupnotes
+ [\c!expansion=\v!no,
+ \c!xmlsetup=,
+ \s!catcodes=,
+ \c!saveinlist=\v!yes]
+
+\def\@@defaultnotedefloc{\v!inleft}
+\def\@@defaultnotedefdis{\!!zeropoint}
+
+\unexpanded\def\startnotedef{\resetdescriptions\csname\e!start\??vn\??vn\currentnote\endcsname}
+\unexpanded\def\stopnotedef {\csname\e!stop \??vn\??vn\currentnote\endcsname}
+
+\def\currentnoteins{\csname\??vn:\currentnote\endcsname}
+
+\newtoks \everysetupnote
+
+\unexpanded\def\definenote
+ {\dodoubleempty\dodefinenote}
+
+\def\dodefinenote[#1][#2]%
+ {\edef\currentnote{#1}%
+ \ifcsname\??vn:\currentnote\endcsname\else
+ \@EA\installinsertion\csname\??vn:\currentnote\endcsname\relax
+ \appendtoks\doprocesssomenote{#1}\to\tobeprocessednotes
+ \fi
+ \defineenumeration % description
+ [\currentnote]
+ [\c!location=\@@defaultnotedefloc,
+ \c!distance=\@@defaultnotedefdis,
+ \c!width=\v!fit,
+ \c!headstyle=\noteparameter\c!style, % hm
+ \c!headcolor=\noteparameter\c!color, % hm
+ \s!handler=\v!note,
+ \c!text=,
+ \c!before=,
+ \c!after=]%
+ \doredefinenotecommands\currentnote
+ \setupenumerations
+ [\currentnote]
+ [\s!parent=\??vn\currentnote,
+ \c!number=\v!yes] % no inheritance from decriptions which is okay
+ \presetlocalframed
+ [\??vn\currentnote]%
+ \getparameters
+ [\??vn\currentnote]
+ [\s!parent=\??vn,#2]%
+% \definestructurecounter
+% [\currentnote]%
+ \ctxlua{structure.notes.define("\currentnote","insert",\number\csname\??vn:\currentnote\endcsname)}%
+ \the\everysetupnote
+ \dochecknote}
+
+% \starttext
+% text \startfootnote Test.\stopfootnote
+% test \footnote{xxxx} \subfootnote{xxxx}
+% test \footnote{xxxx} \subfootnote{xxxx}
+% \stoptext
+
+\def\dodoredefinenotecommands#1#2#3%
+ {\unexpanded\expandafter\def\csname\e!start#3#1\expandafter\endcsname\expandafter
+ {\expandafter\dosingleempty\csname\s!do\e!start#3#1\endcsname}%
+ \unexpanded\expandafter\def\csname\s!do\e!start#3#1\expandafter\endcsname
+ \expandafter[\expandafter##\expandafter1\expandafter]\expandafter##\expandafter2\csname\e!stop#3#1\endcsname
+ {\begingroup
+ \doenumerationinit{#1}{#2}{#3}%
+ \@@notemakedescription[##1]{}{##2}%
+ \endgroup}}
+
+\def\doredefinenotecommands#1%
+ {\normalexpanded{\noexpand\dodoredefinenotecommands{#1}{1}{}}%
+ \let\@@subslevel\empty
+ \dostepwiserecurse{2}{\descriptionparameter\c!levels}{1}
+ {\normalexpanded{\noexpand\dodoredefinenotecommands{#1}{\recurselevel}{\@@subslevel\v!sub}}%
+ \edef\@@subslevel{\@@subslevel\v!sub}}}
+
+\let\setupnotedefinition\setupenumerations
+
+\appendtoks
+ \setupenumerations[\currentnote][]%
+\to \everysetupnote
+
+% \appendtoks
+% \dochecknote
+% \to \everysetupnote
+
+\unexpanded\def\setupnote
+ {\dodoubleempty\dosetupnote}
+
+\def\dosetupnote[#1][#2]%
+ {\edef\currentnote{#1}%
+ \ifsecondargument
+ \getparameters[\??vn\currentnote][#2]%
+ \the\everysetupnote
+ \fi
+ \dochecknote}
+
+\appendtoks
+ \setvalue{\??vn\c!rule:c:\currentnote}{\normalnoterule}% hm
+ \letvalue{\??vn\c!rule:a:\currentnote}\v!left
+\to \everysetupnote
+
+\appendtoks
+ \expanded{\processallactionsinset
+ [\noteparameter\c!rule]}
+ [ \v!on=>\setvalue{\??vn\c!rule:c:\currentnote}{\normalnoterule}, % no let as it can be changed afterwards
+ \v!normal=>\setvalue{\??vn\c!rule:c:\currentnote}{\normalnoterule},
+ \v!left=>\setvalue{\??vn\c!rule:a:\currentnote}{l2r},
+ \v!right=>\setvalue{\??vn\c!rule:a:\currentnote}{r2l},
+ \v!off=>\letvalue{\??vn\c!rule:c:\currentnote}\relax,
+ \s!default=>\letvalue{\??vn\c!rule:c:\currentnote}\relax,
+ \s!unknown=>\setvalue{\??vn\c!rule:c:\currentnote}{\noteparameter\c!rule}]%
+\to \everysetupnote
+
+\appendtoks
+ \processaction % todo
+ [\noteparameter\c!split]
+ [ \v!tolerant=>\notepenalty\zeropoint,
+ \v!strict=>\notepenalty9999,
+ \v!verystrict=>\notepenalty\maxdimen,
+ \s!default=>\notepenalty\zeropoint,
+ \s!unknown=>\notepenalty\commalistelement]%
+\to \everysetupnote
+
+%D The following switch can be used to disable limiting the
+%D height of the footnote area, something that is needed in
+%D multi column balancing. Use this switch with care.
+
+\newif\ifnotelimit \notelimittrue % shared
+
+% bottomnotes endnotes
+% clevernotes
+
+\appendtoks
+ \doifsomething{\noteparameter\c!factor}
+ {\ifnum\noteparameter\c!factor<\zerocount\else
+ \count\currentnoteins\noteparameter\c!factor
+ \fi}%
+\to \everysetupnote
+
+% compatibility (will go away)
+
+\newif\ifendnotes
+\newif\ifbottomnotes
+
+% locations:
+
+\def\s!noteloc{nodeloc} % 1=page 2=columns 3=lastcolumn 4=firstcolumn 5=none
+\def\s!notepos{nodepos} % 0=nothing 1=high 2=bottom
+\def\s!notefmt{nodefmt} % 1 text
+\def\s!notecol{nodecol}
+
+\def\clevernotes % compatibility hack, will be redone
+ {\numexpr\ifcase\namednoteparameter\v!footnote\s!noteloc\or0\or2\or2\or1\else0\fi\relax}
+
+\def\setnotelocation #1{\expandafter\chardef\csname\??vn\currentnote\s!noteloc\endcsname#1\relax}
+\def\setnoteposition #1{\expandafter\chardef\csname\??vn\currentnote\s!notepos\endcsname#1\relax}
+\def\setnoteformatting#1{\expandafter\chardef\csname\??vn\currentnote\s!notefmt\endcsname#1\relax}
+\def\setnotecolumns #1{\expandafter\chardef\csname\??vn\currentnote\s!notecol\endcsname#1\relax}
+
+\def\currentnofcolumns{\@@kln}
+
+\setvalue{\??vn @\v!page }{\setnotelocation\plusone}
+\setvalue{\??vn @\v!columns }{\setnotelocation\plustwo}
+\setvalue{\??vn @\v!lastcolumn }{\setnotelocation\plusthree}
+\setvalue{\??vn @\v!firstcolumn}{\setnotelocation\plusfour}
+\setvalue{\??vn @\v!none }{\setnotelocation\plusfive}
+\setvalue{\??vn @\v!text }{\setnotelocation\plusfive \setnoteformatting\plusone} % test
+\setvalue{\??vn @\v!high }{\setnoteposition\plusone}
+\setvalue{\??vn @\v!bottom }{\setnoteposition\plustwo}
+
+\def\dosetcheckednote#1{\csname\??vn @#1\endcsname}
+
+\def\dochecknote
+ {% node states
+ \setnotelocation\plusone
+ \setnoteposition\plustwo
+ \normalexpanded{\noexpand\rawprocesscommalist[\noteparameter\c!location]}\dosetcheckednote
+ % compatibility hack
+ \ifnum\noteparameter\s!noteloc=\plusfive \endnotestrue \else \endnotesfalse \fi
+ \ifnum\noteparameter\s!notepos=\plustwo \bottomnotestrue \else \bottomnotesfalse \fi
+ % set column multiplier
+ \edef\currentnotenofcolumns{\noteparameter\c!n}%
+ \ifx\currentnotenofcolumns\empty
+ \let\currentnotenofcolumns\!!plusone
+ \fi
+ \ifcase\noteparameter\s!noteloc\or
+ % page
+ \scratchcounter \currentnotenofcolumns
+ \or
+ % columns
+ \scratchcounter\ifnum\currentnofcolumns=\zerocount \plusone \else \currentnotenofcolumns \fi \relax
+ \or
+ % firstcolumn
+ \scratchcounter\plusone
+ \or
+ % lastcolumn
+ \scratchcounter\plusone
+ \or
+ % text
+ \scratchcounter\currentnotenofcolumns
+ \fi
+ % column factor
+ \global\count\currentnoteins\plusthousand
+ \global\count\currentnoteins\numexpr\plusthousand/\scratchcounter\relax
+ % maximize height
+ \ifnotelimit
+ \global\dimen\currentnoteins\dimexpr\noteparameter\c!height*\scratchcounter\relax
+ \fi
+ % distance -> tricky as this might depend on a font switch so we need a fast checker
+ \dosetnotedistance
+ % play safe
+ \ifnum\noteparameter\s!noteloc=\plusfive
+ \ctxlua{structure.notes.setstate("\currentnote","store")}%
+ % text notes (e.g. end notes) but we don't use inserts anyway
+ \global\dimen\currentnoteins\maxdimen
+ \global\count\currentnoteins\zerocount
+ \global\skip \currentnoteins\zeropoint
+ \fi}
+
+\def\dosetnotedistance
+ {\begingroup
+ \setbox\scratchbox\vbox
+ {\forgetall
+ \dontcomplain
+ \noteparameter\c!before
+ \placenoterule
+ \noteparameter\c!after}%
+ \global\skip\currentnoteins\ht\scratchbox
+ \endgroup}
+
+% \def\checknotes % no longer needed
+% {\processnotes\dochecknote}
+%
+% \def\checknotedistances
+% {\processnotes\dosetnotedistance}
+%
+% fails but not that much needed anyway:
+%
+% \appendtoks
+% \checknotedistances
+% \to \everyglobalbodyfont
+
+% D When \type{n} exceeds~1, footnotes are typeset in
+% D multi||columns, using the algoritm presented on page~397
+% D of \TEX book. Footnotes can be places on a per page basis
+% D or whereever suitable. When we set~\type{n} to~0, we get a
+% D rearanged paragraph, typeset by the algoritms on pages 398
+% D and~389 (at least in \MKII). We definitely did not reinvent
+% D that wheel.
+
+% Example of using factor:
+%
+% \definenote[mynote][way=bypage,location=text,width=\marginwidth,rule=,before=,factor=0]
+% \setuplayout[backspace=5cm,margin=3cm,margindistance=.5cm,width=middle]
+% \setuptexttexts[margin][\vbox to \textheight{\placenotes[mynote]\vfill}][]
+% \starttext
+% \dorecurse{10}{test \mynote{one one one one one one} \input zapf \mynote{one one one one one one} }
+% \stoptext
+
+%D The noterule can be a graphic and therefore calling this
+%D setup macro at every skipswitch is tricky (many many MP
+%D runs). Let's just reserve a few points, that probably match
+%D those of the stretch component.
+
+%D A bit messy:
+
+\unexpanded\def\placenoterule
+ {\bgroup
+ \setupalign[\getvalue{\??vn\c!rule:a:\currentnote}]%
+ \righttoleft
+ \getvalue{\??vn\c!rule:c:\currentnote}%
+ \par
+ \egroup}
+
+\unexpanded\def\normalnoterule
+ {\ifvmode
+ \dontleavehmode \blackrule
+ [ \c!color=\noteparameter\c!rulecolor,
+ \c!width=.2\hsize,
+ \c!height=\noteparameter\c!rulethickness,
+ \c!depth=\zeropoint]%
+ \endgraf
+ \kern\strutdepth
+ \fi}
+
+\ifx\setnotehsize\undefined
+
+ \unexpanded\def\setnotehsize{\hsize\noteparameter\c!width\relax} % can be overloaded
+
+\fi
+
+%D The formatting depends on the width of the table, so we
+%D have to set \type {n} to zero.
+%D
+%D \starttyping
+%D \startbuffer
+%D \bTABLE
+%D \bTR \bTD one \footnote{\dorecurse{10}{abcd }} \eTD \bTD two \eTD \eTR
+%D \bTR \bTD three fout five six seven eight nine \eTD \bTD ten \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \startlocalfootnotes[n=0,location={text,none}]
+%D \placelegend[n=2]{\getbuffer}{\placelocalfootnotes}
+%D \stoplocalfootnotes
+%D \stoptyping
+
+%D \macros
+%D {footnote}
+%D
+%D A footnote can have a reference as optional argument and
+%D therefore its formal specification looks like:
+%D
+%D \showsetup{footnote}
+%D
+%D This command has one optional command: the reference. By
+%D saying \type{[-]} the number is omitted. The footnote
+%D command is not that sensitive to spacing, so it's quite
+%D legal to say:
+%D
+%D \startbuffer
+%D Users of \CONTEXT\ must keep both feet \footnote{Given they
+%D have two.} on the ground and not get confused \footnote{Or
+%D even crazy.} by all those obscure \footnote{But fortunately
+%D readable.} parameters.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D When setting the \type{conversion} to \type{set 2} we get
+%D something like:
+%D
+%D \bgroup
+%D \startnarrower
+%D \setupfootnotes[conversion=set 1]
+%D \getbuffer
+%D \stopnarrower
+%D \egroup
+%D
+%D Typesetting footnotes is, at least for the moment, disabled
+%D when reshaping boxes.
+%D
+%D The additional macro \type {\footnotetext} and the
+%D associated \type {\note} macro were implemented at
+%D request of users on the mailing list and a suggestion by
+%D taco to split of the symbol placement. I decided to
+%D merge this functionality with the existing \type {\note}
+%D functionality.
+
+%D The next implementation runs on top of enumerations (only in \MKIV).
+%D
+%D \starttyping
+%D \setupenumerations
+%D [footnote]
+%D [ style=\type{(es)},
+%D headstyle=\type{(hs)}]
+%D
+%D \setupnote
+%D [footnote]
+%D [ style=\type{(s)},
+%D command=\type{(c)},
+%D textcommand=\type{(tc)},
+%D textstyle=\type{(ts)},
+%D numberstyle=\type{(ns)},
+%D numbercommand=\type{(nc)}]
+%D
+%D \setuplayout[backspace=6cm,marginwidth=cm,width=middle]
+%D
+%D \starttext
+%D \dorecurse{9}{This\footnote{Hello World #1} is a test.\par }
+%D \stoptext
+%D \stoptyping
+
+% TODO: \ifnotesenabled
+
+\newif\ifnotesymbol \notesymboltrue
+
+\newconditional\skipnoteplacement
+
+\unexpanded\def\setnote [#1]{\getvalue{#1}}
+\unexpanded\def\setnotetext[#1]{\global\settrue\skipnoteplacement\getvalue{#1}}
+
+\def\domovednote#1#2#3#4%
+ {\ifcase\ctxlua{structure.notes.deltapage("#1",#2)}\or\symbol[#3]\or\symbol[#4]\fi}
+
+\setvalue{\??dd:\v!note:\s!handler:\s!text }{\@@donotetext}
+\setvalue{\??dd:\v!note:\s!handler:\s!number}{\@@donotenumber}
+\setvalue{\??dd:\v!note:\s!handler }{\@@donotehandler}
+\setvalue{\??dd:\v!note:\s!handler:\s!do }{\@@somenotedescription}
+\setvalue{\??dd:\v!note:\s!handler:\s!start }{\@@startsomenotedescription}
+
+\let\@@donotehandler\@@dodescriptionhandler
+
+\def\@@somenotedescription {\@@notemakedescription}
+\def\@@startsomenotedescription{\@@notemakedescription}
+
+\def\@@notemakedescription[#1]#2#3%
+ {\ifnotesenabled
+ \edef\currentdescriptionreference{#1}%
+ \iftrialtypesetting
+ \doenumerationcheckconditions
+ \let\currentnote\currentdescriptionmain
+ \typesetdummynotesymbol
+ \else
+ \begingroup
+ \doenumerationcheckconditions
+ \let\currentnote\currentdescriptionmain
+ \dodescriptioncomponent[\c!reference=#1,\c!label={\descriptionparameter\c!text},\c!title={#3},\c!list=,\c!bookmark=,][]%
+ \xdef\currentnotenumber{\ctxlua{structure.notes.store("\currentnote",\currentdescriptionnumberentry)}}%
+ \settrue\processingnote
+ \ifconditional\skipnoteplacement
+ \globallet\lastnotesymbol\dolastnotesymbol
+ \else
+ \iftypesettinglines % otherwise problems with \type <crlf> {xxx}
+ \ignorelines % makes footnotes work in \startlines ... \stoplines
+ \fi
+ \ifnotesymbol
+ \dolastnotesymbol
+ \else
+ \unskip\unskip
+ \globallet\lastnotesymbol\dolastnotesymbol
+ \fi
+ \fi
+ \ifconditional\postponingnotes % todo: per note class
+ \global\settrue\postponednote
+ \else\ifconditional\inlocalnotes % todo: per note class
+ \global\settrue\postponednote
+ \else
+ \handlenoteinsert\currentnote\currentnotenumber
+ \fi\fi
+ \endgroup
+ \fi
+ \fi
+ \ifconditional\skipnoteplacement
+ \global\setfalse\skipnoteplacement
+ \else
+ \kern\notesignal\relax % \relax is needed to honor spaces
+ \fi}
+
+\def\dolastnotesymbol
+ {\typesetsomenotesymbol\currentnote\currentnotenumber}
+
+\def\dotypesetsomenotesymbol#1#2% running text
+ {\dodonotesymbol
+ {\synchronizesomenotesymbol{#1}{#2}%
+ \ctxlua{structure.notes.number("\currentnote",\currentnotenumber)}% \currentdescriptionnumberentry
+ \domovednote{#1}{#2}\v!previouspage\v!nextpage}}
+
+\unexpanded\def\typesetsomenotesymbol#1#2% running text
+ {\removeunwantedspaces
+ \doifitalicelse\/\donothing % Charles IV \footnote{the fourth}
+ \ifdim\lastkern=\notesignal
+ \dodonotesymbol{\kern\noteparameter\c!distance}% gets the font right, hack !
+ \fi
+ \nobreak
+ \doifelse{\noteparameter\c!interaction}\v!no
+ {\dotypesetsomenotesymbol{#1}{#2}}
+ {\directgotobox{\dotypesetsomenotesymbol{#1}{#2}}[page(\ctxlua{structure.notes.getnumberpage("#1",\number#2)})]}% f:
+ \globallet\lastnotesymbol\relax}
+
+\unexpanded\def\typesetdummynotesymbol % temp hack
+ {\removeunwantedspaces
+ \doifitalicelse\/\donothing % Charles IV \footnote{the fourth}
+ \ifdim\lastkern=\notesignal
+ \dodonotesymbol{\kern\noteparameter\c!distance}% gets the font right, hack !
+ \fi
+ \nobreak
+ \hbox to .5em{}%
+ \globallet\lastnotesymbol\relax}
+
+\def\currentnotedescriptiontext % todo: can be other number
+ {\ctxlua{structure.notes.title("\currentnote",\currentdescriptionnumberentry)}}
+
+\def\@@donotetext
+ {\ifconditional\enumerationnumberenabled
+ \iftrialtypesetting
+ \doenumerationfullnumber\showdntext
+ \doenumerationcouplingsymbol
+ \else
+ \doenumerationregistercoupling
+ \doenumerationfullnumber\showdntext
+ \doenumerationcouplingsymbol
+ \fi
+ \else
+ \doenumerationfullnumber\showdnpuretext
+ \fi}
+
+% \def\currentnoteenumerationfullnumber
+\def\@@donotenumber
+ {\doifelse{\noteparameter\c!interaction}\v!no
+ {\docurrentnoteenumerationfullnumber}%
+ {\directgotobox
+ {\docurrentnoteenumerationfullnumber}%
+ [page(\ctxlua{structure.notes.getsymbolpage("\currentnote",\currentdescriptionnumberentry)})]}}
+
+\def\docurrentnoteenumerationfullnumber
+ {\noteparameter\c!numbercommand
+ {\dosetnoteattributes\c!numberstyle\c!numbercolor
+ \ctxlua{structure.notes.number("\currentnote",\currentdescriptionnumberentry)}%
+ \domovednote\currentdescription\currentdescriptionnumberentry\v!nextpage\v!previouspage}}
+
+\def\synchronizesomenotesymbol#1#2% called more often than needed
+ {\expanded{\noexpand\ctxlatelua{structure.notes.setsymbolpage("#1",#2)}}}
+
+\def\handlenoteinsert#1#2%
+ {\begingroup
+ \edef\currentnote{#1}%
+ \the\everybeforenoteinsert
+ \insert\currentnoteins\bgroup
+ \the\everyinsidenoteinsert
+ \doprocesslocalsetups{\noteparameter\c!setups}% experimental
+ \handlenoteitself{#1}{#2}%
+ \egroup
+ \the\everyafternoteinsert
+ \endgroup}
+
+\def\handlenoteitself#1#2% tg, id
+ {\edef\currentdescription{#1}%
+ \edef\currentnote{#1}%
+ \edef\currentdescriptionnumberentry{#2}%
+ \edef\currentdescriptionlistentry{\ctxlua{tex.write(structure.notes.listindex("#1",#2))}}%
+ % as we can have collected notes (e.g. in tables) we need to recover
+ % \currentdescriptionattribute and \currentdescriptionsynchronize
+ \reinstatedescriptionnumberentry\currentdescriptionlistentry % we could store the number in the entry
+ %
+ \dontcomplain % should be done in startstoreddescription instead
+ \dostartstoreddescription\begstrut\currentnotedescriptiontext\endstrut\dostopstoreddescription}
+
+\def\dostartstoreddescription
+ {\bgroup\@@dostartdescriptionindeed}
+
+\def\dostopstoreddescription
+ {\@@stopdescription}
+
+%D The main typesetting routine is more or less the same as the
+%D \PLAIN\ \TEX\ one, except that we only handle one type while
+%D \PLAIN\ also has something \type{\v...}. In most cases
+%D footnotes can be handled by a straight insert, but we do so
+%D by using an indirect call to the \type{\insert} primitive.
+
+%D Making footnote numbers active is not always that logical,
+%D Making footnote numbers active is not always that logical,
+%D especially when we keep the reference and text at one page.
+%D On the other hand we need interactivity when we refer to
+%D previous notes or use end notes. Therefore we support
+%D interactive footnote numbers in two ways \footnote{This
+%D feature was implemented years after we were able to do so,
+%D mainly because endnotes had to be supported.} that is,
+%D automatically (vise versa) and by user supplied reference.
+
+\newcount\internalnotereference
+
+\let\startpushnote=\relax
+\let\stoppushnote =\relax
+
+\newsignal\notesignal
+\newcount \notepenalty
+
+\notepenalty=0 % needed in order to split in otrset
+
+\newconditional\processingnote
+\newconditional\postponednote
+
+\newtoks\everybeforenoteinsert
+\newtoks\everyinsidenoteinsert
+\newtoks\everyafternoteinsert
+
+\appendtoks
+ \let\flushnotes\relax
+ \let\postponenotes\relax
+ \forgetall
+\to \everybeforenoteinsert
+
+\appendtoks
+ \doif{\noteparameter\c!scope}\v!page{\floatingpenalty\maxdimen}% experiment
+ \penalty\notepenalty
+ \forgetall
+ \setnotebodyfont
+ \redoconvertfont % to undo \undo calls in in headings etc
+ \splittopskip\strutht % not actually needed here
+ \splitmaxdepth\strutdp % not actually needed here
+ \leftmargindistance\noteparameter\c!margindistance
+ \rightmargindistance\leftmargindistance
+ \ifnum\noteparameter\c!n=\zerocount % no ifcase new 31-07-99 ; always ?
+ \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize % ?
+ \fi
+\to \everyinsidenoteinsert
+
+% not: \appendtoks \setnotehsize \to \everyinsidenoteinsert (spoils columns)
+
+\let\lastnotesymbol\relax
+
+%D \macros
+%D {note}
+%D
+%D Refering to a note is accomplished by the rather short
+%D command:
+%D
+%D \showsetup{note}
+%D
+%D This command is implemented rather straightforward as:
+
+\unexpanded\def\notesymbol
+ {\dodoubleempty\donotesymbol}
+
+\def\donotesymbol[#1][#2]%
+ {\bgroup
+ \ifnotesenabled
+ \edef\currentnote{#1}%
+ \ifsecondargument
+ \unskip
+ \dodonotesymbol{\in[#2]}%
+ \else
+ \dodonotesymbol\lastnotesymbol
+ \fi
+ \fi
+ \egroup}
+
+\def\dodonotesymbol#1%
+ {\noteparameter\c!textcommand{\dosetnoteattributes\c!textstyle\c!textcolor#1}}
+
+%D Normally footnotes are saved as inserts that are called upon
+%D as soon as the pagebody is constructed. The footnote
+%D insertion routine looks just like the \PLAIN\ \TEX\ one,
+%D except that we check for the end note state.
+
+% testcase for split bottom alignment see (a) below
+%
+% \dorecurse{6}{\input tufte\footnote{\input ward \input tufte \relax}}
+
+\unexpanded\def\placenoteinserts
+ {\processnotes\doplacenoteinserts}
+
+\unexpanded\def\unvboxed {\ifvmode\unvbox \else\box \fi}
+\unexpanded\def\unvcopied{\ifvmode\unvcopy\else\copy\fi}
+
+\def\doplacenoteinserts
+ {\relax\ifdim\ht\currentnoteins>\zeropoint\relax
+ \ifnum\noteparameter\s!noteloc=\plusfive
+ \else
+ \endgraf
+ \ifvmode
+ \whitespace
+ \noteparameter\c!before
+ \fi
+% \bgroup
+% \setupalign[\noteparameter\c!align]%
+ \placenoterule % alleen in ..mode
+% \par
+% \egroup
+ \bgroup
+ \setnotebodyfont
+ \setbox\scratchbox\hbox
+ {% this should be checked, smells like a mix-up
+ % does not split: \ifcase\noteparameter\c!n\unvbox\else\box\fi\currentnoteins
+ \ifcase\noteparameter\c!n\relax
+ \iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteins % is this needed?
+ \or
+ \iftrialtypesetting\copy\else\box\fi\currentnoteins
+ \obeydepth % (a) added , since split footnotes will not align properly
+ \else
+ \iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteins
+ \fi}%
+ \setbox\scratchbox\hbox
+ {\localframed
+ [\??vn\currentnote]
+ [\c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!strut=\v!no,
+ \c!offset=\v!overlay]
+ {\ifdim\dp\scratchbox=\zeropoint % this hack is needed because \vadjust
+ \hbox{\lower\strutdp\box\scratchbox}% % in margin number placement
+ \else % hides the (always) present depth
+ \box\scratchbox
+ \fi}}%
+ \setbox\scratchbox\hbox{\lower\strutdepth\box\scratchbox}%
+ \dp\scratchbox\strutdepth % so we know that it has the note bodyfont depth
+ \box\scratchbox
+ \egroup
+ \endgraf
+ \ifvmode
+ \noteparameter\c!after
+ \fi
+ \fi
+ \fi}
+
+%D Supporting end notes is surprisingly easy. Even better, we
+%D can combine this feature with solving the common \TEX\
+%D problem of disappearing inserts when they're called for in
+%D deeply nested boxes. The general case looks like:
+%D
+%D \starttyping
+%D \postponenotes
+%D \.box{whatever we want with footnotes}
+%D \flushnotes
+%D \stoptyping
+%D
+%D This alternative can be used in headings, captions, tables
+%D etc. The latter one sometimes calls for notes local to
+%D the table, which can be realized by saying
+%D
+%D \starttyping
+%D \setlocalfootnotes
+%D some kind of table with local footnotes
+%D \placelocalfootnotes
+%D \stoptyping
+%D
+%D Postponing is accomplished by simply redefining the (local)
+%D insert operation. A not too robust method uses the
+%D \type{\insert} primitive when possible. This method fails in
+%D situations where it's not entirely clear in what mode \TEX\
+%D is. Therefore the auto method can is to be overruled when
+%D needed.
+
+\newconditional\postponingnotes
+
+% we need a proper state: normal, postponing, flushing
+
+\def\postponenotes
+ {\ifconditional\postponingnotes\else
+ \global\settrue\postponingnotes
+ \global\let\flushnotes\doflushnotes
+ \ctxlua{structure.notes.postpone()}%
+ \fi}
+
+\let\flushnotes\relax
+
+\def\doflushnotes
+ {\ifconditional\postponingnotes
+ \begingroup
+ \let\flushnotes \relax
+ \let\postponenotes\relax
+ \ctxlua{structure.notes.flushpostponed()}% this also resets the states !
+ \global\setfalse\postponednote
+ \global\setfalse\postponingnotes
+ \global\let\flushnotes\relax
+ \endgroup
+ \fi}
+
+%D \macros
+%D {startlocalfootnotes,placelocalfootnotes}
+%D
+%D The next two macros can be used in for instance tables, as
+%D we'll demonstrate later on.
+%D
+%D \showsetup{startlocalfootnotes}
+%D \showsetup{placelocalfootnotes}
+
+% todo: compatibility mode: when first arg is assignment or missing, then all
+
+\newtoks\everyplacelocalnotes
+
+\appendtoks
+ \let\flushnotes \relax
+ \let\postponenotes\relax
+\to \everyplacelocalnotes
+
+\def\defaultnotewidth{\makeupwidth} % {\ifdim\hsize<\makeupwidth\hsize\else\makeupwidth\fi}
+
+\newconditional\inlocalnotes
+
+\unexpanded\def\startlocalnotes
+ {\dosingleempty\dostartlocalnotes}
+
+\def\dostartlocalnotes[#1]%
+ {\def\localnoteslist{#1}%
+ \settrue\inlocalnotes
+ \processcommacommand[\localnoteslist]\dodostartlocalnotes}
+
+\unexpanded\def\stoplocalnotes
+ {\processcommacommand[\localnoteslist]\dodostoplocalnotes
+ \setfalse\inlocalnotes}
+
+\def\dodostartlocalnotes#1%
+ {\doifnot{\noteparameter\c!continue}\v!yes
+ {\savestructurecounter[#1]%
+ \resetstructurecounter[#1]}%
+ \ctxlua{structure.notes.save("#1","store")}}
+
+\def\dodostoplocalnotes#1%
+ {\doifnot{\noteparameter\c!continue}\v!yes
+ {\restorestructurecounter[#1]}%
+ \ctxlua{structure.notes.restore("#1")}}
+
+\unexpanded\def\placelocalnotes
+ {\dodoubleempty\doplacelocalnotes}
+
+\def\doplacelocalnotes[#1][#2]%
+ {\doif{\ctxlua{structure.notes.getstate("#1")}}{store}{\dodoplacelocalnotes{#2}{#1}}}
+
+\def\dodoplacelocalnotes#1#2% settings note
+ {\begingroup
+ \the\everyplacelocalnotes
+ % beware, we cannot trust setting \currentnote here
+ \getparameters[\??vn#2][\c!width=\v!fit,\c!height=\v!fit,\c!strut=\v!no,\c!offset=\v!overlay,#1]% we only need a selective one
+ \donotealternative{#2}%
+ \endgroup
+ \dochecknote} % we need to restore the old state
+
+%D These commands can be used like:
+%D
+%D \startbuffer
+%D \startlocalnotes[width=.3\hsize,n=0]
+%D \placetable
+%D {Some Table}
+%D \placeontopofeachother
+%D {\starttable[|l|r|]
+%D \HL
+%D \VL Nota\footnote{Bene} \VL Bene\footnote{Nota} \VL\SR
+%D \VL Bene\footnote{Nota} \VL Nota\footnote{Bene} \VL\SR
+%D \HL
+%D \stoptable}
+%D {\placelocalnotes}
+%D \stoplocalnotes
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Because this table placement macro expect box content, and
+%D thanks to the grouping of the local footnotes, we don't need
+%D additional braces.
+%D
+%D \getbuffer
+
+%D \macros
+%D {placefootnotes}
+%D
+%D We still have no decent command for placing footnotes
+%D somewhere else than at the bottom of the page (for which no
+%D user action is needed). Footnotes (endnotes) can be
+%D placed by using
+%D
+%D \showsetup{placefootnotes}
+
+\unexpanded\def\placebottomnotes
+ {\processnotes\placenoteinserts}
+
+\unexpanded\def\placenotes
+ {\dodoubleempty\doplacenotes}
+
+\def\doplacenotes[#1][#2]%
+ {\processcommalist[#1]{\dodoplacenotes{#2}}}
+
+\def\dodoplacenotes#1#2% settings note
+ {\edef\currentnote{#2}%
+ \doifelse{\ctxlua{structure.notes.getstate("#2")}}{store}
+ \dodoplacelocalnotes
+ \dodoplaceglobalnotes
+ {#1}{#2}}
+
+\def\dodoplaceglobalnotes#1#2%
+ {\begingroup
+ \setupnote[#2][#1]%
+ \doplacenoteinserts
+ \endgroup
+ \the\everysetupnote} % to be checkes
+
+%D Placement
+
+\long\def\installnotealternative#1#2%
+ {\setvalue{\??vn:\c!alternative:#1}{#2}}
+
+\def\doifnotescollected#1%
+ {\ctxlua{structure.notes.doifcontent("#1")}}
+
+\def\donotealternative#1%
+ {\edef\currentnote{#1}%
+ \doifnotescollected\currentnote
+ {\endgraf
+ \ifvmode
+ \whitespace
+ \noteparameter\c!before
+ \fi
+ \begingroup
+ \setnotebodyfont
+ \getvalue{\??vn:\c!alternative:\noteparameter\c!alternative}%
+ \endgroup
+ \ifvmode
+ \noteparameter\c!after
+ \fi}}
+
+\setvalue{\??vn:\c!alternative:}{\getvalue{\??vn:\c!alternative:\v!none}}
+
+%D A stupid alternative is also provided:
+%D
+%D \starttyping
+%D \setupfootnotes[location=text,alternative=none]
+%D \stoptyping
+
+\def\flushlocalnotes#1{\ctxlua{structure.notes.flush("#1","store")}}
+
+\installnotealternative \v!none
+ {\flushlocalnotes\currentnote}
+
+\installnotealternative \v!grid % test if n > 0
+ {\snaptogrid\hbox
+ {\localframed
+ [\??vn\currentnote]
+ {\flushlocalnotes\currentnote}}}
+
+\installnotealternative \v!fixed % test if n > 0
+ {\localframed
+ [\??vn\currentnote]
+ {\flushlocalnotes\currentnote}}
+
+\installnotealternative \v!columns % redundant
+ {\localframed
+ [\??vn\currentnote]
+ {\edef\currentnotewidth{\noteparameter\c!width}%
+ \doifdimensionelse\currentnotewidth\donothing
+ {\edef\currentnotewidth{\the\hsize}}%
+% \setupinmargin[\c!align=\v!left]%
+ \startsimplecolumns[\c!distance=\noteparameter\c!columndistance,\c!n=\noteparameter\c!n,\c!width=\currentnotewidth]%
+ \flushlocalnotes\currentnote
+ \stopsimplecolumns}}
+
+%D \macros
+%D {fakenotes}
+
+ % is this ok? endnotes and such
+
+ \unexpanded\def\fakenotes
+ {\ifhmode\endgraf\fi\ifvmode
+ \calculatetotalclevernoteheight
+ \ifdim\totalnoteheight>\zeropoint \kern\totalnoteheight \fi
+ \fi}
+
+ \unexpanded\def\fakepagenotes
+ {\ifhmode\endgraf\fi\ifvmode
+ \calculatetotalpagenoteheight
+ \ifdim\totalnoteheight>\zeropoint \kern\totalnoteheight \fi
+ \fi}
+
+ \newdimen\totalnoteheight
+
+ \def\doaddtototalnoteheight#1%
+ {\ifdim\ht#1>\zeropoint
+ \ifcase\count#1\else
+ % todo: divide by count
+ \advance\totalnoteheight\ht #1%
+ \advance\totalnoteheight\skip#1%
+ \fi
+ \fi}
+
+ \def\docalculatetotalnoteheight
+ {\ifcase\clevernotes % tricky here ! ! ! to be sorted out ! ! !
+ \doaddtototalnoteheight\currentnoteins
+ \else
+% \doaddtototalnoteheight\currentbackupnoteins
+ \fi}
+
+ \def\docalculatetotalclevernoteheight
+ {\ifcase\clevernotes \else % tricky here ! ! ! to be sorted out ! ! !
+ \doaddtototalnoteheight\currentnoteins
+ \fi}
+
+ \def\docalculatetotalpagenoteheight
+ {\doaddtototalnoteheight\currentnoteins}
+
+ \def\calculatetotalnoteheight {\totalnoteheight\zeropoint\processnotes\docalculatetotalnoteheight}
+ \def\calculatetotalclevernoteheight{\totalnoteheight\zeropoint\processnotes\docalculatetotalclevernoteheight}
+ \def\calculatetotalpagenoteheight {\totalnoteheight\zeropoint\processnotes\docalculatetotalpagenoteheight}
+
+ \newif\ifnotespresent
+
+ \def\dochecknotepresence
+ {\ifdim\ht\currentnoteins>\zeropoint
+ \notespresenttrue
+ \fi}
+
+ \def\checknotepresence
+ {\notespresentfalse
+ \processnotes\dochecknotepresence}
+
+%D Now how can this mechanism be hooked into \CONTEXT\ without
+%D explictly postponing footnotes? The solution turned out to
+%D be rather simple:
+%D
+%D \starttyping
+%D \everypar {...\flushnotes...}
+%D \neverypar {...\postponenotes}
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D \def\ejectinsert%
+%D {...
+%D \flushnotes
+%D ...}
+%D \stoptyping
+%D
+%D We can use \type{\neverypar} because in most commands
+%D sensitive to footnote gobbling we disable \type{\everypar}
+%D in favor for \type{\neverypar}. In fact, this footnote
+%D implementation is the first to use this scheme.
+
+%D This is a nasty and new secondary footnote flusher. It
+%D can be hooked into \type {\everypar} like:
+%D
+%D \starttyping
+%D \appendtoks \synchronizenotes \to \everypar
+%D \stoptyping
+
+ % \def\dosynchronizenotes
+ % {\ifvoid\currentnoteins\else\insert\currentnoteins{\unvbox\currentnoteins}\fi}
+ %
+ % \def\synchronizenotes
+ % {\processnotes\dosynchronizenotes}
+
+\let\synchronizenotes\relax
+
+%D When typesetting footnotes, we have to return to the
+%D footnote specific bodyfont size, which is in most cases derived
+%D from the global document bodyfont size. In the previous macros
+%D we already used a footnote specific font setting macro.
+
+\def\setnotebodyfont
+ {\let\setnotebodyfont\relax
+ \restoreglobalbodyfont
+ \switchtobodyfont[\noteparameter\c!bodyfont]%
+ \setuptolerance[\noteparameter\c!tolerance]%
+ \setupalign[\noteparameter\c!align]}
+
+%D The footnote mechanism defaults to a traditional one
+%D column way of showing them. By default we precede them by
+%D a small line.
+
+\ifx\v!endnote\undefined \def\v!endnote{endnote} \fi
+
+\definenote [\v!footnote]
+\definenote [\v!endnote ] [\c!location=\v!none] % else no break
+
+%D Compatibility macros:
+
+\unexpanded\def\setupfootnotedefinition{\setupnotedefinition [\v!footnote]}
+\unexpanded\def\setupfootnotes {\setupnote [\v!footnote]}
+%unexpanded\def\footnote {\setnote [\v!footnote]}
+\def\footnotetext {\setnotetext [\v!footnote]}
+%unexpanded\def\note {\dodoubleempty\notesymbol [\v!footnote]} % alleen footnote
+\unexpanded\def\placefootnotes {\dodoubleempty\doplacefootnotes [\v!footnote]}
+\unexpanded\def\placelocalfootnotes {\dodoubleempty\doplacelocalfootnotes[\v!footnote]}
+\unexpanded\def\startlocalfootnotes {\startlocalnotes [\v!footnote]} % alleen footnote
+\unexpanded\def\stoplocalfootnotes {\stoplocalnotes }
+
+\def\doplacefootnotes [#1][#2]{\ifsecondargument\placenotes [#1][#2,\c!height=\textheight]\else\placenotes [#1]\fi}
+\def\doplacelocalfootnotes[#1][#2]{\ifsecondargument\placelocalnotes[#1][#2,\c!height=\textheight]\else\placelocalnotes[#1]\fi}
+
+\unexpanded\def\note{\dodoubleempty\donote}
+
+\def\donote[#1][#2]{\ifsecondargument\donotesymbol[#1][#2]\else\secondargumenttrue\donotesymbol[\v!footnote][#1]\fi}
+
+%D Goodies:
+%D
+%D \starttyping
+%D \dorecurse {100} {
+%D test \footnote{\doifnoteonsamepageelse[footnote]{ibidem}{aaa}}
+%D }
+%D \stoptyping
+
+\def\doifnoteonsamepageelse[#1]{\ctxlua{structure.notes.doifonsamepageasprevious("#1")}}
+
+%D New trickery:
+
+\def\ownnotesymbol#1% #1 gets number passed
+ {\executeifdefined{\??vn::\currentnote}\empty}
+
+\unexpanded\def\setnotesymbol[#1]#2#3%
+ {\prewordbreak % prevent lookback
+ \setgvalue{\??vn::#1}{#3}
+ \dolastnotesymbol}
+
+\unexpanded\def\ownnote[#1]#2#3#4%
+ {\setnotesymbol[#1]{#2}{#3}%
+ \setnotetext [#1]{#4}}
+
+\defineconversion
+ [ownnote]
+ [\ownnotesymbol]
+
+\protect \endinput
diff --git a/tex/context/base/strc-num.lua b/tex/context/base/strc-num.lua
new file mode 100644
index 000000000..8165d0786
--- /dev/null
+++ b/tex/context/base/strc-num.lua
@@ -0,0 +1,521 @@
+if not modules then modules = { } end modules ['strc-num'] = {
+ version = 1.001,
+ comment = "companion to strc-num.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+local next, type = next, type
+local min, max = math.min, math.max
+local texsprint, texcount = tex.sprint, tex.count
+
+local trace_counters = false trackers.register("structure.counters", function(v) trace_counters = v end)
+
+structure = structure or { }
+structure.helpers = structure.helpers or { }
+structure.sections = structure.sections or { }
+structure.counters = structure.counters or { }
+structure.documents = structure.documents or { }
+
+structure.counters = structure.counters or { }
+structure.counters.data = structure.counters.data or { }
+structure.counters.specials = structure.counters.specials or { }
+
+local helpers = structure.helpers
+local sections = structure.sections
+local counters = structure.counters
+local documents = structure.documents
+
+local variables = interfaces.variables
+
+-- state: start stop none reset
+
+local counterdata = counters.data
+local counterranges, tbs = { }, 0
+local counterspecials = counters.specials
+
+counters.collected = counters.collected or { }
+counters.tobesaved = counters.tobesaved or { }
+
+storage.register("structure/counters/data", structure.counters.data, "structure.counters.data")
+storage.register("structure/counters/tobesaved", structure.counters.tobesaved, "structure.counters.tobesaved")
+
+local collected, tobesaved = counters.collected, counters.tobesaved
+
+local function finalizer()
+ local ct = counters.tobesaved
+ for name, cd in next, counterdata do
+ local cs = tobesaved[name]
+ local data = cd.data
+ for i=1,#data do
+ local d = data[i]
+ local r = d.range
+ cs[i][r] = d.number
+ d.range = r + 1
+ end
+ end
+end
+
+local function initializer()
+ collected, tobesaved = counters.collected, counters.tobesaved
+end
+
+if job then
+ job.register('structure.counters.collected', structure.counters.tobesaved, initializer, finalizer)
+end
+
+local function constructor(t,s,name,i)
+ if s == "last" then
+ local cc = collected[name]
+ t.stop = (cc and cc[i] and cc[i][t.range]) or 0 -- stop is available for diagnostics purposes only
+ if t.offset then
+ return t.stop - t.step
+ else
+ return t.stop
+ end
+ elseif s == "first" then
+ if t.start > 0 then
+ return t.start -- brrr
+ elseif t.offset then
+ return t.start + t.step + 1
+ else
+ return t.start + 1
+ end
+ elseif s == "prev" or s == "previous" then
+ return max(t.first,t.number-1) -- todo: step
+ elseif s == "next" then
+ return min(t.last,t.number+1) -- todo: step
+ elseif s == "backward" then
+ if t.number - 1 < t.first then
+ return t.last
+ else
+ return t.previous
+ end
+ elseif s == "forward" then
+ if t.number + 1 > t.last then
+ return t.first
+ else
+ return t.next
+ end
+ elseif s == "subs" then
+ local cc = collected[name]
+ t.subs = (cc and cc[i+1] and cc[i+1][t.range]) or 0
+ return t.subs
+ else
+ return nil -- was 0, but that is fuzzy in testing for e.g. own
+ end
+end
+
+local enhance = function()
+ for name, cd in next, counterdata do
+ local data = cd.data
+ for i=1,#data do
+ local ci = data[i]
+ setmetatable(ci, { __index = function(t,s) return constructor(t,s,name,i) end })
+ end
+ end
+ enhance = nil
+end
+
+local function allocate(name,i)
+ local cd = counterdata[name]
+ if not cd then
+ cd = {
+ level = 1,
+--~ block = "", -- todo
+ numbers = nil,
+ state = variables.start, -- true
+ data = { }
+ }
+ tobesaved[name] = { }
+ counterdata[name] = cd
+ end
+ cd = cd.data
+ local ci = cd[i]
+ if not ci then
+ ci = {
+ number = 0,
+ start = 0,
+ saved = 0,
+ step = 1,
+ range = 1,
+ offset = false,
+ -- via metatable: last, first, and for tracing:
+ stop = 0,
+ }
+ setmetatable(ci, { __index = function(t,s) return constructor(t,s,name,i) end })
+ cd[i] = ci
+ tobesaved[name][i] = { }
+ else
+ if enhance then enhance() end -- not stored in bytecode
+ end
+ return ci
+end
+
+function counters.record(name,i)
+ return allocate(name,i or 1)
+end
+
+local function savevalue(name,i)
+ if name then
+ local cd = counterdata[name].data[i]
+ local cs = tobesaved[name][i]
+ local cc = collected[name]
+ local cr = cd.range
+ local old = (cc and cc[i] and cc[i][cr]) or 0
+ cs[cr] = cd.number
+ cd.range = cr + 1
+ return old
+ else
+ return 0
+ end
+end
+
+function counters.define(name, start, counter) -- todo: step
+ local d = allocate(name,1)
+ d.start = start
+ if counter ~= "" then
+ d.counter = counter -- only for special purposes, cannot be false
+ end
+end
+
+function counters.trace(name)
+ local cd = counterdata[name]
+ if cd then
+ texsprint(format("[%s:",name))
+ local data = cd.data
+ for i=1,#data do
+ local d = data[i]
+ texsprint(format(" (%s: %s,%s,%s s:%s r:%s)",i,(d.start or 0),d.number or 0,d.last,d.step or 0,d.range or 0))
+ end
+ texsprint("]")
+ end
+end
+
+function counters.raw(name)
+ return counterdata[name]
+end
+
+function counters.compact(name,level,onlynumbers)
+ local cd = counterdata[name]
+--~ print(name,cd)
+ if cd then
+ local data = cd.data
+ local compact = { }
+ for i=1,level or #data do
+ local d = data[i]
+--~ print(name,i,d.number)
+ if d.number ~= 0 then
+ compact[i] = (onlynumbers and d.number) or d
+ end
+ end
+--~ print(table.serialize(compact))
+ return compact
+ end
+end
+
+-- depends on when incremented, before or after (driven by d.offset)
+
+function counters.doifelse(name)
+ commands.doifelse(counterdata[name])
+end
+
+function counters.previous(name,n)
+ texsprint(allocate(name,n).previous)
+end
+
+function counters.next(name,n)
+ texsprint(allocate(name,n).next)
+end
+
+counters.prev = counters.previous
+
+function counters.current(name,n)
+ texsprint(allocate(name,n).number)
+end
+
+function counters.first(name,n)
+ texsprint(allocate(name,n).first)
+end
+
+function counters.last(name,n)
+ texsprint(allocate(name,n).last)
+end
+
+function counters.subs(name,n)
+ texsprint(counterdata[name].data[n].subs or 0)
+end
+
+function counters.setvalue(name,tag,value)
+ local cd = counterdata[name]
+ if cd then
+ cd[tag] = value
+ end
+end
+
+function counters.setstate(name,value) -- true/false
+ value = variables[value]
+ if value then
+ counters.setvalue(name,"state",value)
+ end
+end
+
+function counters.setlevel(name,value)
+ counters.setvalue(name,"level",value)
+end
+
+function counters.setoffset(name,value)
+ counters.setvalue(name,"offset",value)
+end
+
+
+local function synchronize(name,d)
+ local dc = d.counter
+ if dc then
+ if trace_counters then
+ logs.report("counters","setting counter %s with name %s to %s",dc,name,d.number)
+ end
+ tex.setcount("global",dc,d.number)
+ end
+ local cs = counterspecials[name]
+ if cs then
+ if trace_counters then
+ logs.report("counters","invoking special for name %s",name)
+ end
+ cs()
+ end
+end
+
+function counters.reset(name,n)
+ local cd = counterdata[name]
+ if cd then
+ for i=n or 1,#cd.data do
+ local d = cd.data[i]
+ savevalue(name,i)
+ d.number = d.start or 0
+ d.own = nil
+ synchronize(name,d)
+ end
+ cd.numbers = nil
+ end
+end
+
+function counters.set(name,n,value)
+ local cd = counterdata[name]
+ if cd then
+ local d = allocate(name,n)
+ d.number = value or 0
+ d.own = nil
+ synchronize(name,d)
+ end
+end
+
+local function check(name,data,start,stop)
+ for i=start or 1,stop or #data do
+ local d = data[i]
+ savevalue(name,i)
+ d.number = d.start or 0
+ d.own = nil
+ synchronize(name,d)
+ end
+end
+
+function counters.setown(name,n,value)
+ local cd = counterdata[name]
+ if cd then
+ local d = allocate(name,n)
+ d.own = value
+ d.number = (d.number or d.start or 0) + (d.step or 0)
+ local level = cd.level
+ if not level or level == -1 then
+ -- -1 is signal that we reset manually
+ elseif level > 0 then
+ check(name,d,n+1)
+ elseif level == 0 then
+ -- happens elsewhere
+ end
+ synchronize(name,d)
+ end
+end
+
+function counters.restart(name,n,newstart)
+ local cd = counterdata[name]
+ if cd then
+ newstart = tonumber(newstart)
+ if newstart then
+ local d = allocate(name,n)
+ d.start = newstart
+ counters.reset(name,n)
+ end
+ end
+end
+
+function counters.save(name) -- or just number
+ local cd = counterdata[name]
+ if cd then
+ cd.saved = table.copy(cd.data)
+ end
+end
+
+function counters.restore(name)
+ local cd = counterdata[name]
+ if cd and cd.saved then
+ cd.data = cd.saved
+ cd.saved = nil
+ end
+end
+
+function counters.add(name,n,delta)
+ local cd = counterdata[name]
+ if cd and cd.state == variables.start then
+ local data = cd.data
+ local d = allocate(name,n)
+ d.number = (d.number or d.start or 0) + delta*(d.step or 0)
+ local level = cd.level
+ if not level or level == -1 then
+ -- -1 is signal that we reset manually
+ elseif level > 0 then
+ -- within countergroup
+ check(name,data,n+1)
+ elseif level == 0 then
+ -- happens elsewhere
+ end
+ synchronize(name,d)
+ return d.number -- not needed
+ end
+ return 0
+end
+
+function counters.check(level) -- not used (yet)
+ for name, cd in next, counterdata do
+ -- logs.report("counters","%s %s %s",name,cd.level,level)
+ if cd.level == level then
+ if trace_counters then
+ logs.report("counters","resetting %s at level %s",name,level)
+ end
+ counters.reset(name)
+ end
+ end
+end
+
+function counters.get(name,n,key)
+ local d = allocate(name,n)
+ d = d and d[key]
+ if not d then
+ return 0
+ elseif type(d) == "function" then
+ return d()
+ else
+ return d
+ end
+end
+
+function counters.value(name,n) -- what to do with own
+ tex.write(counters.get(name,n or 1,'number') or 0)
+end
+
+function counters.converted(name,spec) -- name can be number and reference to storage
+ local cd
+ if type(name) == "number" then
+ cd = specials.retrieve("counter",name)
+ cd = cd and cd.counter
+ else
+ cd = counterdata[name]
+ end
+ if cd then
+ local spec = spec or { }
+ local numbers, ownnumbers = { }, { }
+ local reverse = spec.order == variables.reverse
+ local kind = spec.type or "number"
+ local v_first, v_next, v_previous, v_last = variables.first, variables.next, variables.previous, variables.last
+ local data = cd.data
+ for k=1,#data do
+ local v = data[k]
+ -- somewhat messy, what if subnr? only last must honour kind?
+ local vn
+ if v.own then
+ numbers[k], ownnumbers[k] = v.number, v.own
+ else
+ if kind == v_first then
+ vn = v.first
+ elseif kind == v_next then
+ vn = v.next
+ elseif kind == v_previous then
+ vn = v.prev
+ elseif kind == v_last then
+ vn = v.last
+ else
+ vn = v.number
+ if reverse then
+ local vf = v.first
+ local vl = v.last
+ if vl > 0 then
+ -- vn = vl - vn + 1 + vf
+ vn = vl - vn + vf -- see testbed for test
+ end
+ end
+ end
+ numbers[k], ownnumbers[k] = vn or v.number, nil
+ end
+ end
+ cd.numbers = numbers
+ cd.ownnumbers = ownnumbers
+ sections.typesetnumber(cd,'number',spec)
+ cd.numbers = nil
+ cd.ownnumbers = nil
+ end
+end
+
+-- move to strc-pag.lua
+
+function counters.analyse(name,counterspecification)
+ local cd = counterdata[name]
+ -- safeguard
+ if not cd then
+ return false, false, "no counter data"
+ end
+ -- section data
+ local sectiondata = sections.current()
+ if not sectiondata then
+ return cd, false, "not in section"
+ end
+ local references = sectiondata.references
+ if not references then
+ return cd, false, "no references"
+ end
+ local section = references.section
+ if not section then
+ return cd, false, "no section"
+ end
+ sectiondata = jobsections.collected[references.section]
+ if not sectiondata then
+ return cd, false, "no section data"
+ end
+ -- local preferences
+ local no = variables.no
+ if counterspecification and counterspecification.prefix == no then
+ return cd, false, "current spec blocks prefix"
+ end
+ -- stored preferences (not used)
+ if cd.prefix == no then
+ return cd, false, "entry blocks prefix"
+ end
+ -- sectioning
+ -- if sectiondata.prefix == no then
+ -- return false, false, "sectiondata blocks prefix"
+ -- end
+ -- final verdict
+ return cd, sectiondata, "okay"
+end
+
+function counters.prefixedconverted(name,prefixspec,numberspec)
+ local cd, prefixdata, result = counters.analyse(name,prefixspec)
+ if cd then
+ if prefixdata then
+ sections.typesetnumber(prefixdata,"prefix",prefixspec or false,cd or false)
+ end
+ counters.converted(name,numberspec)
+ end
+end
diff --git a/tex/context/base/strc-num.mkii b/tex/context/base/strc-num.mkii
new file mode 100644
index 000000000..28f69b441
--- /dev/null
+++ b/tex/context/base/strc-num.mkii
@@ -0,0 +1,151 @@
+%D \module
+%D [ file=strc-num,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Numbering}
+
+\unprotect
+
+% Commando's ten behoeve van nummeren:
+%
+% \definenumber[name]
+% \setupnumber[name][wijze=,blok=,tekst=,plaats=,conversie=,start=]
+% \setnumber[name]{value}
+% \resetnumber[name]
+% \incrementnumber[name]
+% \decrementnumber[name]
+% \convertednumber[name] % getnumber
+% \savenumber[name]
+% \restorenumber[name]
+% \convertednumber[name]
+% \rawnumber[name]
+
+% private (defined in core-des.tex)
+%
+% \nextnumber[name][tag][reference]
+% \currentnumber[name]
+
+\def\@@thenumber#1{\s!number\csname\s!number#1\c!number\endcsname}
+
+% this will be the new (public) one: \let\numberparameterprefix\@@thenumber
+
+\def\numberparameter#1#2{\csname\@@thenumber{#1}#2\endcsname} % sort of public
+
+\def\dosetupnumber[#1][#2]%
+ {\@EA\let\@EA\savedstartnumber\csname\@@thenumber{#1}\c!start\endcsname
+ \getparameters[\@@thenumber{#1}][\c!start=,#2]%
+ \doifelsenothing{\numberparameter{#1}\c!start}
+ {\letvalue{\@@thenumber{#1}\c!start}\savedstartnumber}
+ {\setcounter{\@@thenumber{#1}}{\numberparameter{#1}\c!start}}}
+
+\def\setupnumber
+ {\dodoubleargument\dosetupnumber}
+
+\def\definenumber
+ {\dodoubleempty\dodefinenumber}
+
+\def\dodefinenumber[#1][#2]% ook overal class als localframed
+ {\doifassignmentelse{#2}
+ {\dododefinenumber[#1][#2]}
+ {\doifelsenothing{#2} % can break on not yet defined macros in #2
+ {\dododefinenumber[#1][#2]}
+ {\setvalue{\s!number#1\c!number}{#2}}}}
+
+\def\dododefinenumber[#1][#2]%
+ {\getparameters
+ [\s!number#1]
+ [\c!number=#1,
+ \s!check=,
+ \c!way=\@@nrway,
+ \c!way\c!local=\numberparameter{#1}\c!way,
+ \c!sectionnumber=\v!yes,
+ \c!text=, % no longer used here, will go away
+ \c!location=, % no longer used here, will go away (was ooit \c!zetwijze)
+ \c!conversion=\v!numbers,
+ \c!start=0,
+ \c!state=\v!start,
+ #2]%
+ \makecounter{\@@thenumber{#1}}%
+ \setxvalue{\@@thenumber{#1}\c!n}{\countervalue{\@@thenumber{#1}}}%
+ \setcounter{\@@thenumber{#1}}{\numberparameter{#1}\c!start}}
+
+\def\setnumber[#1]#2%
+ {\setcounter{\@@thenumber{#1}}{#2}}
+
+\def\resetnumber[#1]%
+ {\setcounter{\@@thenumber{#1}}{0\numberparameter{#1}\c!start}}
+
+\def\savenumber[#1]%
+ {\savecounter{\@@thenumber{#1}}}
+
+\def\restorenumber[#1]%
+ {\restorecounter{\@@thenumber{#1}}}
+
+%D Bonus macro (we need to keep this one for downward
+%D compatibility reasons).
+
+\def\doreset[#1]%
+ {\processcommalist[#1]\dodoreset}
+
+\def\dodoreset#1%
+ {\getvalue{\s!reset#1}}%
+
+\def\reset
+ {\dosingleargument\doreset}
+
+\def\incrementnumber[#1]% bypage tricky: needs a
+ {\doifelse{\numberparameter{#1}\c!way}{\v!by\v!page}
+ {\checkpagechange{#1}%
+ \ifpagechanged\resetcounter{\@@thenumber{#1}}\fi}
+ {\checknumber[#1]}%
+ \doifelse\@@nrstate\v!start % only here
+ {\doif{\numberparameter{#1}\c!state}\v!start{\pluscounter{\@@thenumber{#1}}}}
+ {\setcounter{\@@thenumber{#1}}{0\numberparameter{#1}\c!start}}}
+
+% \defineenumeration [test] [way=bypage,text=\lastchangedpage]
+%
+% \starttext \dorecurse{10}{\test \input tufte \par} \stoptext
+
+\def\decrementnumber[#1]%
+ {\minuscounter{\@@thenumber{#1}}}
+
+\def\convertednumber[#1]%
+ {\convertnumber
+ {\numberparameter{#1}\c!conversion}
+ {\countervalue{\@@thenumber{#1}}}}
+
+\def\rawnumber[#1]%
+ {\countervalue{\@@thenumber{#1}}}
+
+\def\accumulatednumber[#1]%
+ {\getvalue{\@@thenumber{#1}\c!n}}
+
+\let\getnumber\convertednumber
+
+\def\doifdefinednumber #1{\doifdefined {\csname\s!number#1\c!number\endcsname}}
+\def\doifundefinednumber #1{\doifundefined {\csname\s!number#1\c!number\endcsname}}
+\def\doifdefinednumberelse#1{\doifdefinedelse{\csname\s!number#1\c!number\endcsname}}
+
+\ifx\checknumber\undefined \def\checknumber[#1]{} \fi
+
+% ook de pag nummers hierheen halen ivm \@@nrwijze
+
+\def\setupnumbering
+ {\dodoubleempty\getparameters[\??nr]}
+
+\setupnumbering
+ [\c!way=\v!by\v!chapter,
+ \c!blockway=,
+ \c!sectionnumber=\v!yes,
+ \c!state=\v!start]
+
+\protect \endinput
diff --git a/tex/context/base/strc-num.mkiv b/tex/context/base/strc-num.mkiv
new file mode 100644
index 000000000..5b5aebe7d
--- /dev/null
+++ b/tex/context/base/strc-num.mkiv
@@ -0,0 +1,511 @@
+%D \module
+%D [ file=strc-num,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Basic Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Basic Numbering}
+
+\registerctxluafile{strc-num}{1.001}
+
+\unprotect
+
+% we need to rework this, i.e. clone like itm, des etc with \s!parent
+
+% numbering
+
+% \definestructurecounter[name]
+% \setupstructurecounter[name][wijze=,blok=,tekst=,plaats=,conversie=,start=]
+% \setstructurecounter[name]{value}
+% \resetstructurecounter[name]
+% \incrementstructurecounter[name]
+% \decrementstructurecounter[name]
+% \savestructurecounter[name]
+% \restorestructurecounter[name]
+% \convertedstructurecounter[name] % depricated: \getstructurecounter[name]
+% \rawstructurecounter[name]
+
+% private (defined in core-sec.tex)
+%
+% \nextstructurecounter[name][tag][reference]
+% \currentstructurecounter[name]
+
+% todo: better inheritane system
+
+\unexpanded\def\setupstructurecountering{\dodoubleempty\getparameters[\??nn]}
+
+\setupstructurecountering
+ [\c!way=\v!by\v!chapter,
+% \c!blockway=,
+% \c!prefixstarter=,
+% \c!prefixstopper=,
+ \c!prefixconnector=.,
+ \c!prefixsegments=\thenamedstructurecounterlevel\currentstructurecounter,
+ \c!start=0,
+ \c!state=\v!start,
+ \c!prefix=\v!yes,
+ \c!state=\v!start]
+
+\setupstructurecountering
+ [\c!prefixsegments=\autostructureprefixsegments\sharedstructurecounterparameter]
+
+\def\autostructureprefixsegments#1% todo: \c!prefixsegments=\v!auto
+ {2:\thenamedstructureheadlevel{\ctxlua{structure.sections.way("#1\c!way","\v!by")}}}
+
+% \letvalue{\??nn\s!empty}\empty
+
+\def\structurecounterparameter#1#2%
+ {\csname
+ \ifcsname\??nn#1#2\endcsname
+ \??nn#1#2%
+ \else\ifcsname\??nn\@@thestructurecounter{#1}#2\endcsname
+ \??nn\@@thestructurecounter{#1}#2%
+ \else\ifcsname\??nn#2\endcsname
+ \??nn#2%
+ \else
+ \s!empty
+ \fi\fi\fi
+ \endcsname}
+
+\def\@@thestructurecounter#1%
+ {\ifcsname\??nn#1\c!number\endcsname
+ \expandafter\@@thestructurecounter\csname\??nn#1\c!number\endcsname
+ \else
+ #1%
+ \fi}
+
+\def\sharedstructurecounterparameter#1%
+ {\csname
+ \ifcsname\??nn#1\endcsname
+ \??nn#1%
+ \else
+ \s!empty
+ \fi
+ \endcsname}
+
+\let\numberingparameter\sharedstructurecounterparameter
+
+% \def\structurecounterparameter #1#2{\csname\dostructurecounterparameter{\??nn#1}#2\endcsname}
+% \def\dostructurecounterparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dostructurecounterparentparameter\csname#1\s!number\endcsname#2\fi}
+% \def\dostructurecounterparentparameter#1#2{\ifx#1\relax\s!empty\else\dostructurecounterparameter#1#2\fi}
+
+\unexpanded\def\definestructurecounter
+ {\dodoubleempty\dodefinestructurecounter}
+
+\def\dodefinestructurecounter[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\dododefinestructurecounter[#1][#2]}
+ {\doifelsenothing{#2}
+ {\dododefinestructurecounter[#1][]}
+ {\donodefinestructurecounter[#1][#2]}}}
+
+\def\dododefinestructurecounter[#1][#2]%
+ {\getparameters[\??nn#1][\s!counter=,#2]% counter is for internal purposes
+ \ctxlua{structure.counters.define("#1",tonumber("\structurecounterparameter{#1}\c!start") or 0,"\structurecounterparameter{#1}\s!counter")}%
+ \docheckstructurecountersetup{#1}}
+
+\def\donodefinestructurecounter[#1][#2]% inherit
+ {\getparameters[\??nn#1][\c!number=#2]%
+ \docheckstructurecountersetup{#1}}
+
+\unexpanded\def\setupstructurecounter
+ {\dodoubleargument\dosetupstructurecounter}
+
+\def\dosetupstructurecounter[#1][#2]%
+ {\getparameters[\??nn#1][\c!start=,#2]%
+ \docheckstructurecountersetup{#1}}
+
+\def\structurecounterway#1% slow, we need to store it at the tex end
+ {\ctxlua{structure.sections.way("\structurecounterparameter{#1}\c!way","\v!by")}}
+
+\def\thenamedstructurecounterlevel#1%
+ {\thenamedstructureheadlevel{\structurecounterway{#1}}}
+
+\def\docheckstructurecountersetup#1%
+ {% this can be done at the lua end / a bit messy here ... todo ...
+ \ifcsname\??nn#1\c!number\endcsname
+ \doifelsevalue {\??nn#1\c!number}{#1} {\letbeundefined{\??nn#1\c!number}}%
+ {\doifvaluenothing{\??nn#1\c!number} {\letbeundefined{\??nn#1\c!number}}}%
+ \fi
+ \ifcsname\??nn#1\c!number\endcsname
+ % it's a clone
+ \else
+ \edef\currentstructurecounterlevel{\thenamedstructurecounterlevel{#1}}%
+ \ctxlua{
+ structure.counters.restart("#1",1,"\structurecounterparameter{#1}\c!start")
+ structure.counters.setstate("#1","\structurecounterparameter{#1}\c!state")
+ structure.counters.setlevel("#1",\currentstructurecounterlevel)
+ structure.sections.setchecker("#1",\currentstructurecounterlevel,structure.counters.reset)
+ }%
+ \fi}
+
+\def\doifstructurecounterelse#1{\ctxlua{structure.counters.doifelse("\@@thestructurecounter{#1}")}}
+\def\doifstructurecounter #1{\ctxlua{structure.counters.doif ("\@@thestructurecounter{#1}")}}
+\def\doifnotstructurecounter #1{\ctxlua{structure.counters.doifnot ("\@@thestructurecounter{#1}")}}
+
+\def\setstructurecounter [#1]#2{\ctxlua{structure.counters.set ("\@@thestructurecounter{#1}",1,\number#2)}}
+\def\setstructurecounterown [#1]#2{\ctxlua{structure.counters.setown ("\@@thestructurecounter{#1}",1,"#2")}}
+\def\resetstructurecounter [#1]{\ctxlua{structure.counters.reset ("\@@thestructurecounter{#1}",1)}}
+\def\restartstructurecounter [#1]#2{\ctxlua{structure.counters.restart("\@@thestructurecounter{#1}",1,#2)}}
+\def\savestructurecounter [#1]{\ctxlua{structure.counters.save ("\@@thestructurecounter{#1}")}}
+\def\restorestructurecounter [#1]{\ctxlua{structure.counters.restore("\@@thestructurecounter{#1}")}}
+\def\incrementstructurecounter [#1]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",1,1)}}
+\def\decrementstructurecounter [#1]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",1,-1)}}
+\def\rawstructurecounter [#1]{\ctxlua{structure.counters.value ("\@@thestructurecounter{#1}",1)}}
+\def\laststructurecounter [#1]{\ctxlua{structure.counters.last ("\@@thestructurecounter{#1}",1)}}
+\def\firststructurecounter [#1]{\ctxlua{structure.counters.first ("\@@thestructurecounter{#1}",1)}}
+\def\nextstructurecounter [#1]{\ctxlua{structure.counters.next ("\@@thestructurecounter{#1}",1)}}
+\def\prevstructurecounter [#1]{\ctxlua{structure.counters.prev ("\@@thestructurecounter{#1}",1)}}
+\def\structurecountersubs [#1]{\ctxlua{structure.counters.subs ("\@@thestructurecounter{#1}",1)}}
+
+\def\tracestructurecounter [#1]{\ctxlua{structure.counters.trace ("\@@thestructurecounter{#1}")}}
+
+\def\incrementedstructurecounter[#1]{\ctxlua{tex.write(structure.counters.add("\@@thestructurecounter{#1}",1,1))}}
+\def\decrementedstructurecounter[#1]{\ctxlua{tex.write(structure.counters.add("\@@thestructurecounter{#1}",1,-1))}}
+
+\def\setsubstructurecounter {\dodoubleargument\dosetsubstructurecounter}
+\def\setsubstructurecounterown {\dodoubleargument\dosetsubstructurecounterown}
+\def\resetsubstructurecounter {\dodoubleargument\doresetsubstructurecounter}
+\def\restartsubstructurecounter {\dodoubleargument\dorestartsubstructurecounter}
+\def\incrementsubstructurecounter {\dodoubleargument\doincrementsubstructurecounter}
+\def\decrementsubstructurecounter {\dodoubleargument\dodecrementsubstructurecounter}
+\def\rawsubstructurecounter {\dodoubleargument\dorawsubstructurecounter}
+
+\def\dosetsubstructurecounter [#1][#2]#3{\ctxlua{structure.counters.set ("\@@thestructurecounter{#1}",#2,\number#3)}}
+\def\dosetsubstructurecounterown [#1][#2]#3{\ctxlua{structure.counters.setown ("\@@thestructurecounter{#1}",#2,"#3")}}
+\def\doresetsubstructurecounter [#1][#2]{\ctxlua{structure.counters.reset ("\@@thestructurecounter{#1}",#2)}}
+\def\dorestartsubstructurecounter [#1][#2]#3{\ctxlua{structure.counters.restart("\@@thestructurecounter{#1}",#2,#3)}}
+\def\doincrementsubstructurecounter [#1][#2]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",#2,1)}}
+\def\dodecrementsubstructurecounter [#1][#2]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",#2,-1)}}
+\def\dorawsubstructurecounter [#1][#2]{\ctxlua{structure.counters.value ("\@@thestructurecounter{#1}",#2)}}
+\def\dolastsubstructurecounter [#1][#2]{\ctxlua{structure.counters.last ("\@@thestructurecounter{#1}",#2)}}
+\def\dofirstsubstructurecounter [#1][#2]{\ctxlua{structure.counters.first ("\@@thestructurecounter{#1}",#2)}}
+\def\dosubstructurecountersubs [#1][#2]{\ctxlua{structure.counters.subs ("\@@thestructurecounter{#1}",#2)}}
+
+% The bypage check needs a multipass reference and therefore
+% we only check for it when we increment and know that some
+% content will be placed. We could also check for spreads.
+
+% to be checked !
+
+\def\docheckstructurecounterbypage#1% since we call lua to get the way we can as well do all in lua
+ {\doif{\structurecounterway{#1}}\v!page{\checkpagechange{#1}\ifpagechanged\resetstructurecounter[#1]\fi}}
+
+\def\incrementstructurecounter[#1]%
+ {\docheckstructurecounterbypage{#1}%
+ \ctxlua{structure.counters.add("\@@thestructurecounter{#1}",1,1)}}
+
+\def\doincrementsubstructurecounter[#1][#2]%
+ {\docheckstructurecounterbypage{#1}%
+ \ctxlua{structure.counters.add("\@@thestructurecounter{#1}",#2,1)}}
+
+\def\convertedstructurecounter
+ {\dodoubleempty\doconvertedstructurecounter}
+
+\def\doconvertedstructurecounter[#1][#2]%
+ {\begingroup
+ \ifsecondargument\getparameters[\??nn#1][#2]\fi
+ \ctxlua{structure.counters.prefixedconverted(
+ "\@@thestructurecounter{#1}",
+ {
+ prefix = "\structurecounterparameter{#1}\c!prefix",
+ separatorset = "\structurecounterparameter{#1}\c!prefixseparatorset",
+ conversion = "\structurecounterparameter{#1}\c!prefixconversion",
+ conversionset = "\structurecounterparameter{#1}\c!prefixconversionset",
+ starter = \!!bs\structurecounterparameter{#1}\c!prefixstarter\!!es,
+ stopper = \!!bs\structurecounterparameter{#1}\c!prefixstopper\!!es,
+ set = "\structurecounterparameter{#1}\c!prefixset",
+ segments = "\structurecounterparameter{#1}\c!prefixsegments",
+ connector = \!!bs\structurecounterparameter{#1}\c!prefixconnector\!!es,
+ },
+ {
+ order = "\structurecounterparameter{#1}\c!numberorder",
+ separatorset = "\structurecounterparameter{#1}\c!numberseparatorset",
+ conversion = \!!bs\structurecounterparameter{#1}\c!numberconversion\!!es,
+ conversionset = "\structurecounterparameter{#1}\c!numberconversionset",
+ starter = \!!bs\structurecounterparameter{#1}\c!numberstarter\!!es,
+ stopper = \!!bs\structurecounterparameter{#1}\c!numberstopper\!!es,
+ segments = "\structurecounterparameter{#1}\c!numbersegments",
+ type = "\structurecounterparameter{#1}\c!type",
+ criterium = "\structurecounterparameter{#1}\c!criterium", % might change if we also want this with sectioning
+ }
+ )}%
+ \endgroup}
+
+\def\directconvertedstructurecounter#1#2% name, type
+ {\begingroup
+ \ctxlua{structure.counters.prefixedconverted(
+ "\@@thestructurecounter{#1}",
+ {
+ prefix = "\structurecounterparameter{#1}\c!prefix",
+ separatorset = "\structurecounterparameter{#1}\c!prefixseparatorset",
+ conversion = "\structurecounterparameter{#1}\c!prefixconversion",
+ conversionset = "\structurecounterparameter{#1}\c!prefixconversionset",
+ % starter = \!!bs\structurecounterparameter{#1}\c!prefixstarter\!!es,
+ % stopper = \!!bs\structurecounterparameter{#1}\c!prefixstopper\!!es,
+ set = "\structurecounterparameter{#1}\c!prefixset",
+ segments = "\structurecounterparameter{#1}\c!prefixsegments",
+ connector = \!!bs\structurecounterparameter{#1}\c!prefixconnector\!!es,
+ },
+ {
+ order = "\structurecounterparameter{#1}\c!numberorder",
+ separatorset = "\structurecounterparameter{#1}\c!numberseparatorset",
+ conversion = \!!bs\structurecounterparameter{#1}\c!numberconversion\!!es,
+ conversionset = "\structurecounterparameter{#1}\c!numberconversionset",
+ starter = \!!bs\structurecounterparameter{#1}\c!numberstarter\!!es,
+ stopper = \!!bs\structurecounterparameter{#1}\c!numberstopper\!!es,
+ segments = "\structurecounterparameter{#1}\c!numbersegments",
+ type = "#2",
+ }
+ )}%
+ \endgroup}
+
+\unexpanded\def\convertedsubstructurecounter
+ {\dotripleempty\doconvertedsubstructurecounter}
+
+\def\doconvertedsubstructurecounter[#1][#2][#3]% #2 can be n or n:m
+ {\ifsecondargument
+ \doconvertedstructurecounter[#1][\c!numbersegments=#2,#3]%
+ \else
+ \secondargumentfalse\doconvertedstructurecounter[#1][]%
+ \fi}
+
+\let\getstructurecounter\convertedstructurecounter
+
+\def\doifdefinedstructurecounter #1{\doifdefined {\csname\s!structurecounter#1\c!number\endcsname}}
+\def\doifundefinedstructurecounter #1{\doifundefined {\csname\s!number#1\c!number\endcsname}}
+\def\doifdefinedstructurecounterelse#1{\doifdefinedelse{\csname\s!number#1\c!number\endcsname}}
+
+\ifx\checkstructurecounter\undefined \def\checkstructurecounter[#1]{} \fi
+
+\def\checkstructurecounter[#1]{}
+
+%D What follows is a compatibility layer. This will be phased out (at
+%D least from core usage).
+
+\def\reset
+ {\dosingleargument\doreset}
+
+\def\doreset[#1]%
+ {\processcommalist[#1]\dodoreset}
+
+\def\dodoreset#1%
+ {\csname\s!reset#1\endcsname}%
+
+\let \numberparameter \structurecounterparameter % {name}\c!key
+
+\let \definenumber \definestructurecounter % [name]
+\let \setupnumber \setupstructurecounter % [name][setups]
+
+\let \setnumber \setstructurecounter % [name]{value}
+\let \resetnumber \resetstructurecounter % [name]
+\let \savenumber \savestructurecounter % [name]
+\let \restorenumber \restorestructurecounter % [name]
+\let \incrementnumber \incrementstructurecounter % [name]
+\let \decrementnumber \decrementstructurecounter % [name]
+\let \rawnumber \rawstructurecounter % [name]
+\let \getnumber \getstructurecounter % [name]
+\let \convertednumber \getstructurecounter % [name]
+
+\let \doifdefinednumber \doifstructurecounter % {number}{true}
+\let \doifundefinednumber \doifnotstructurecounter % {number}{true}
+\let \doifdefinednumberelse \doifstructurecounterelse % {number}{true}{false}
+
+% weird one
+
+\def\accumulatednumber[#1]{}
+
+% funny, here, todo: these are the defaults
+
+\unexpanded\def\setupnumbering
+ {\dodoubleempty\getparameters[\??nr]}
+
+\setupnumbering
+ [\c!way=\v!by\v!chapter,
+ \c!blockway=,
+ \c!state=\v!start]
+
+%D Helpers:
+
+% call:
+%
+% \dostructurecountercomponent
+% \currentfloat
+% \getfloatparameters \floatparameter \detokenizedfloatparameter
+% \hascaption \hastitle \hasnumber
+% [settings][userdata]
+%
+% sets:
+%
+% \laststructurecounternumber
+% \laststructurecountersynchronize
+
+\newconditional\hasstructurecountercaption
+\newconditional\hasstructurecountertitle
+\newconditional\hasstructurecounternumber
+
+\def\dostructurecountercomponent#1#2#3#4#5#6#7[#8][#9]%
+ {\begingroup
+ %
+ #2[\s!haslevel=1,#8]%
+ \edef\hasstructurecountercaption{#3\s!hascaption}%
+ \edef\hasstructurecountertitle {#3\s!hastitle}%
+ \edef\hasstructurecounternumber {#3\s!hasnumber}%
+ \edef\hasstructurecounterlevel {#3\s!haslevel}%
+ %
+ \edef\askedprefixsegments{#3\c!prefixsegments}%
+ \ifx\askedprefixsegments\v!auto
+ \edef\askedprefixsegments{\autostructureprefixsegments#3}%
+ \fi
+ %
+ \edef\currentname{#3\c!name}%
+ \ifx\currentname\empty
+ \edef\currentname{#1}%
+ \fi
+ \edef\currentcounter{#3\s!counter}%
+ \ifx\currentcounter\empty
+ \let\currentcounter\currentname
+ \fi
+ %
+ \doif{#3\c!title}\v!none{\setfalse\hasstructurecountercaption\setfalse\hasstructurecounternumber}% will become obsolete
+ %
+ \ifx\hasstructurecounternumber\v!yes % here due to previous test but best in callers
+ \doincrementsubstructurecounter[\currentcounter][\hasstructurecounterlevel]%
+ \fi
+ %
+ \ifx\hasstructurecountercaption\v!yes
+ \edef\currentexpansion{#3\c!expansion}%
+ \ifx\currentexpansion\s!xml
+ \edef\currenttitle{#4\c!title}%
+ \edef\currentbookmark{#4\c!bookmark}%
+ \xmlstartraw
+ \edef\currentlisttitle{#3\c!title}%
+ \xmlstopraw
+ \let\currentcoding\s!xml
+ \else
+ \ifx\currentexpansion\v!yes
+ \edef\currenttitle{#3\c!title}%
+ \edef\currentbookmark{#3\c!bookmark}%
+ \else
+ \edef\currenttitle{#4\c!title}%
+ \edef\currentbookmark{#4\c!bookmark}%
+ \fi
+ \let\currentlisttitle\currenttitle
+ \let\currentcoding\s!tex
+ \fi
+ \edef\currentlabel{#3\c!label}%
+ \edef\currentreference{#3\c!reference}%
+ \setnextinternalreference
+ \xdef\laststructurecounternumber{\ctxlua{structure.lists.push{
+ metadata = {
+ kind = "#1",
+ name = "\currentname",
+ level = structure.sections.currentlevel(),
+ catcodes = \the\catcodetable,
+ },
+ references = {
+ internal = \nextinternalreference,
+ reference = "\currentreference",
+ referenceprefix = "\referenceprefix",
+ block = "\currentstructureblock",
+ section = structure.sections.currentid(),
+ },
+ titledata = {
+ label = \!!bs\detokenize\expandafter{\currentlabel }\!!es,
+ title = \!!bs\detokenize\expandafter{\currenttitle }\!!es,
+ \ifx\currentbookmark\currenttitle \else
+ bookmark = \!!bs\detokenize\expandafter{\currentbookmark }\!!es,
+ \fi
+ \ifx\currentlisttitle\currenttitle \else
+ list = \!!bs\detokenize\expandafter{\currentlisttitle}\!!es,
+ \fi
+ },
+ \ifx\hasstructurecountercaption\v!yes
+ prefixdata = {
+ prefix = "#3\c!prefix",
+ separatorset = "#3\c!prefixseparatorset",
+ conversion = \!!bs#3\c!prefixconversion\!!es,
+ conversionset = "#3\c!prefixconversionset",
+ set = "#3\c!prefixset",
+ % segments = "#3\c!prefixsegments",
+ segments = "\askedprefixsegments",
+ connector = \!!bs#3\c!prefixconnector\!!es,
+ },
+ numberdata = {
+ numbers = structure.counters.compact("\currentcounter",nil,true),
+ separatorset = "#3\c!numberseparatorset",
+ conversion = \!!bs#3\c!numberconversion\!!es,
+ conversionset = "#3\c!numberconversionset",
+ starter = \!!bs#3\c!numberstarter\!!es,
+ stopper = \!!bs#3\c!numberstopper\!!es,
+ segments = "#3\c!numbersegments",
+ },
+ \fi
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#9}\!!es)
+ }
+ }}%
+ \xdef\laststructurecounterattribute {\ctxlua {tex.write(jobreferences.setinternalreference(nil,nil,\nextinternalreference))}}%
+ \xdef\laststructurecountersynchronize{\ctxlatelua{structure.lists.enhance(\laststructurecounternumber)}}%
+ \else
+ \glet\laststructurecounternumber \relax
+ \glet\laststructurecounterattribute \attributeunsetvalue
+ \glet\laststructurecountersynchronize\relax
+ \fi
+ \endgroup}
+
+\let\laststructurecounternumber \relax
+\let\laststructurecounterattribute \relax
+\let\laststructurecountersynchronize\relax
+
+\def\dostructurecountersetup#1#2% name \someparameter
+ {\setupstructurecounter
+ [#1]
+ [ \c!start=#2\c!start,
+ \c!state=#2\c!state,
+ \c!way=#2\c!way,
+ %
+ \c!prefix=#2\c!prefix,
+ \c!prefixseparatorset=#2\c!prefixseparatorset,
+ \c!prefixconversion=#2\c!prefixconversion,
+ \c!prefixconversionset=#2\c!prefixconversionset,
+ \c!prefixstarter=#2\c!prefixstarter,
+ \c!prefixstopper=#2\c!prefixstopper,
+ \c!prefixset=#2\c!prefixset,
+ \c!prefixsegments=#2\c!prefixsegments,
+ \c!prefixset=#2\c!prefixset,
+ \c!prefixconnector=#2\c!prefixconnector,
+ %
+ \c!numberseparatorset=#2\c!numberseparatorset,
+ \c!numberconversion=#2\c!numberconversion,
+ \c!numberconversionset=#2\c!numberconversionset,
+ \c!numberstarter=#2\c!numberstarter,
+ \c!numberstopper=#2\c!numberstopper,
+ \c!numbersegments=#2\c!numbersegments]}
+
+\def\presetstructurecountersetup#1#2% \setupcommand \someparameter
+ {#1%
+ [\c!way =#2\c!way,
+ \c!prefix =#2\c!prefix,
+ \c!prefixseparatorset =#2\c!prefixseparatorset,
+ \c!prefixconversion =#2\c!prefixconversion,
+ \c!prefixconversionset=#2\c!prefixconversionset,
+ \c!prefixstarter =#2\c!prefixstarter,
+ \c!prefixstopper =#2\c!prefixstopper,
+ \c!prefixsegments =#2\c!prefixsegments,
+ \c!prefixset =#2\c!prefixset,
+ \c!prefixconnector =#2\c!prefixconnector,
+ \c!numberseparatorset =#2\c!numberseparatorset,
+ \c!numberconversion =#2\c!numberconversion,
+ \c!numberconversionset=#2\c!numberconversionset,
+ \c!numberstarter =#2\c!numberstarter,
+ \c!numberstopper =#2\c!numberstopper,
+ \c!numbersegments =#2\c!numbersegments]}
+
+\protect \endinput
diff --git a/tex/context/base/strc-pag.lua b/tex/context/base/strc-pag.lua
new file mode 100644
index 000000000..261059587
--- /dev/null
+++ b/tex/context/base/strc-pag.lua
@@ -0,0 +1,241 @@
+if not modules then modules = { } end modules ['strc-pag'] = {
+ version = 1.001,
+ comment = "companion to strc-pag.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local texcount, format = tex.count, string.format
+
+local ctxcatcodes = tex.ctxcatcodes
+local texsprint, texwrite = tex.sprint, tex.write
+
+local trace_pages = false trackers.register("structure.pages", function(v) trace_pages = v end)
+
+structure.pages = structure.pages or { }
+
+local helpers = structure.helpers or { }
+local sections = structure.sections or { }
+local pages = structure.pages or { }
+local processors = structure.processors or { }
+local sets = structure.sets or { }
+
+local variables = interfaces.variables
+
+-- storage
+
+jobpages = jobpages or { }
+jobpages.collected = jobpages.collected or { }
+jobpages.tobesaved = jobpages.tobesaved or { }
+
+local collected, tobesaved = jobpages.collected, jobpages.tobesaved
+
+local function initializer()
+ collected, tobesaved = jobpages.collected, jobpages.tobesaved
+end
+
+job.register('jobpages.collected', jobpages.tobesaved, initializer)
+
+local specification = { } -- to be checked
+
+function pages.save(prefixdata,numberdata)
+ local realpage, userpage = texcount.realpageno, texcount.userpageno
+ if realpage > 0 then
+ if trace_pages then
+ logs.report("pages","saving page %s.%s",realpage,userpage)
+ end
+ local data = {
+ number = userpage,
+ block = sections.currentblock(),
+ prefixdata = prefixdata and helpers.simplify(prefixdata),
+ numberdata = numberdata and helpers.simplify(numberdata),
+ }
+ tobesaved[realpage] = data
+ if not collected[realpage] then
+ collected[realpage] = data
+ end
+ elseif trace_pages then
+ logs.report("pages","not saving page %s.%s",realpage,userpage)
+ end
+end
+
+function structure.counters.specials.userpage()
+ local r = texcount.realpageno
+ if r > 0 then
+ local t = tobesaved[r]
+ if t then
+ t.number = texcount.userpageno
+ if trace_pages then
+ logs.report("pages","forcing pagenumber of realpage %s to %s",r,t.number)
+ end
+ end
+ end
+end
+
+--~ function pages.pagenumber(localspec)
+--~ local deltaspec
+--~ if localspec then
+--~ for k,v in next, localspec do
+--~ if v ~= "" and v ~= specification[k] then
+--~ if not deltaspec then deltaspec = { } end
+--~ deltaspec[k] = v
+--~ end
+--~ end
+--~ end
+--~ if deltaspec then
+--~ return { realpage = texcount.realpageno, specification = deltaspec }
+--~ else
+--~ return { realpage = texcount.realpageno }
+--~ end
+--~ end
+
+local function convertnumber(str,n)
+ return format("\\convertnumber{%s}{%s}",str or "numbers",n)
+end
+
+function pages.number(realdata,pagespec)
+ local userpage, block = realdata.number, realdata.block or "" -- sections.currentblock()
+ local numberspec = realdata.numberdata
+ local conversionset = (pagespec and pagespec.conversionset ~= "" and pagespec.conversionset) or (numberspec and numberspec.conversionset ~= "" and numberspec.conversionset) or ""
+ local conversion = (pagespec and pagespec.conversion ~= "" and pagespec.conversion ) or (numberspec and numberspec.conversion ~= "" and numberspec.conversion ) or ""
+ local starter = (pagespec and pagespec.starter ~= "" and pagespec.starter ) or (numberspec and numberspec.starter ~= "" and numberspec.starter ) or ""
+ local stopper = (pagespec and pagespec.stopper ~= "" and pagespec.stopper ) or (numberspec and numberspec.stopper ~= "" and numberspec.stopper ) or ""
+ if starter ~= "" then
+ processors.sprint(ctxcatcodes,starter)
+ end
+ if conversion ~= "" then
+ texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,userpage))
+ else
+ if conversionset == "" then conversionset = "default" end
+ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+ processors.sprint(ctxcatcodes,theconversion,convertnumber,userpage)
+ end
+ if stopper ~= "" then
+ processors.sprint(ctxcatcodes,stopper)
+ end
+end
+
+-- (pagespec.prefix == yes|unset) and (pages.prefix == yes) => prefix
+
+function pages.analyse(entry,pagespecification)
+ -- safeguard
+ if not entry then
+ return false, false, "no entry"
+ end
+ local references = entry.references
+ if not references then
+ return false, false, "no references"
+ end
+ local realpage = references.realpage
+ if not realpage then
+ return false, false, "no realpage"
+ end
+ local pagedata = collected[realpage]
+ if not pagedata then
+ return false, false, "no pagedata"
+ end
+ local section = references.section
+ if not section then
+ return pagedata, false, "no section"
+ end
+ local no = variables.no
+ -- local preferences
+ if pagespecification and pagespecification.prefix == no then
+ return pagedata, false, "current spec blocks prefix"
+ end
+ -- stored preferences
+--~ if entry.prefix == no then
+--~ return pagedata, false, "entry blocks prefix"
+--~ end
+ -- stored page state
+ pagespecification = pagedata.prefixdata
+ if pagespecification and pagespecification.prefix == no then
+ return pagedata, false, "pagedata blocks prefix"
+ end
+ -- final verdict
+ return pagedata, jobsections.collected[references.section], "okay"
+end
+
+function helpers.page(data,pagespec)
+ if data then
+ local pagedata = pages.analyse(data,pagespec)
+ if pagedata then
+ pages.number(pagedata,pagespec)
+ end
+ end
+end
+
+function helpers.prefixpage(data,prefixspec,pagespec)
+ if data then
+ local pagedata, prefixdata, e = pages.analyse(data,pagespec)
+ if pagedata then
+ if prefixdata then
+ sections.typesetnumber(prefixdata,"prefix",prefixspec or false,prefixdata or false,pagedata.prefixdata or false)
+ end
+ pages.number(pagedata,pagespec)
+ end
+ end
+end
+
+function helpers.prefixlastpage(data,prefixspec,pagespec)
+ if data then
+ local r = data.references
+ local ls, lr = r.section, r.realpage
+ r.section, r.realpage = r.lastsection or r.section, r.lastrealpage or r.realpage
+ helpers.prefixpage(data,prefixspec,pagespec)
+ r.section, r.realpage = ls, lr
+ end
+end
+
+--
+
+function helpers.analyse(entry,specification)
+ -- safeguard
+ if not entry then
+ return false, false, "no entry"
+ end
+ local yes, no = variables.yes, variables.no
+ -- section data
+ local references = entry.references
+ if not references then
+ return entry, false, "no references"
+ end
+ local section = references.section
+ if not section then
+ return entry, false, "no section"
+ end
+ sectiondata = jobsections.collected[references.section]
+ if not sectiondata then
+ return entry, false, "no section data"
+ end
+ -- local preferences
+ if specification and specification.prefix == no then
+ return entry, false, "current spec blocks prefix"
+ end
+ -- stored preferences (not used)
+ local prefixdata = entry.prefixdata
+ if prefixdata and prefixdata.prefix == no then
+ return entry, false, "entry blocks prefix"
+ end
+ -- final verdict
+ return entry, sectiondata, "okay"
+end
+
+function helpers.prefix(data,prefixspec)
+ if data then
+ local _, prefixdata, status = helpers.analyse(data,prefixspec)
+ if prefixdata then
+ sections.typesetnumber(prefixdata,"prefix",prefixspec or false,data.prefixdata or false,prefixdata or false)
+ end
+ end
+end
+
+function pages.is_odd(n)
+ n = n or texcount.realpageno
+ if texcount.pagenoshift % 2 == 0 then
+ return n % 2 == 0
+ else
+ return n % 2 ~= 0
+ end
+end
diff --git a/tex/context/base/strc-pag.mkii b/tex/context/base/strc-pag.mkii
new file mode 100644
index 000000000..5a86a99e8
--- /dev/null
+++ b/tex/context/base/strc-pag.mkii
@@ -0,0 +1,534 @@
+%D \module
+%D [ file=strc-num, % moved here from main-001
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Numbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Numbering}
+
+% todo: {}{}{} ipv ...--...-...-...--... in pag ref
+
+\unprotect
+
+% \gotonextsubpage : voor de pagebody
+% \subpaginanummer : alleen in de voet/kopregels
+% \aantalsubpaginas : alleen in de voet/kopregels
+
+% \firstsubpage : eerste \realpageno, voor interne doeleinden
+% \prevsubpage : vorige \realpageno, voor interne doeleinden
+% \nextsubpage : volgende \realpageno, voor interne doeleinden
+% \lastsubpage : laatste \realpageno, voor interne doeleinden
+% \nofsubpages : laatste subpage (in berekeningen)
+% \subpageno : huidige subpage (in berekeningen)
+
+\newif\ifsubpaging
+\newif\ifshowingsubpage
+
+\definenumber
+ [\s!subpage]
+
+\setupnumber
+ [\s!subpage]
+ [\c!way=\@@snway]
+
+% hard to sync
+%
+% \def\resetsubpagenumber
+% {\resetnumber[\s!subpage]%
+% \global\subpageno=\rawnumber[\s!subpage]}
+%
+% better sync
+
+\newif\ifresettingsubpagenumber
+
+\def\resetsubpagenumber
+ {\global\resettingsubpagenumbertrue}
+
+% so far for sync, see \gotonext...
+
+\def\dosetupsubpagenumber[#1]%
+ {\doifelse{#1}\v!reset
+ \resetsubpagenumber % \resetnumber[\s!subpage]
+ {\getparameters[\??sn][#1]%
+ \processaction
+ [\@@snstate]
+ [ \v!stop=>\ifsubpaging
+ \resetsubpagenumber % new, see sync
+ \else
+ \subpagingfalse
+ \fi
+ \showingsubpagefalse,
+ \v!start=>\subpagingtrue
+ \showingsubpagetrue,
+ \v!none=>\subpagingtrue
+ \showingsubpagefalse]}}
+
+\def\numberofsubpages
+ {\ifshowingsubpage\nofsubpages\else0\fi}
+
+\def\subpagenumber
+ {\ifshowingsubpage\the\subpageno\else0\fi}
+
+\def\setupsubpagenumber
+ {\dosingleargument\dosetupsubpagenumber}
+
+\def\newnofsubpages{0}
+\def\nofsubpages {0}
+\def\firstsubpage {1}
+\def\prevsubpage {1}
+\def\nextsubpage {1}
+\def\lastsubpage {1}
+
+\def\nextpage {1}
+\def\prevpage {1}
+
+\definetwopasslist\s!subpage
+
+\def\savenofsubpages
+ {\ifsubpaging
+ \showmessage\m!layouts6{\newnofsubpages,\the\subpageno}%
+ \immediatesavetwopassdata{\s!subpage}{\newnofsubpages}{\the\subpageno}%
+ \fi}
+
+\def\setsubpagenumbers
+ {\iftwopassdatafound
+ \bgroup
+ \xdef \nofsubpages {\twopassdata}%
+ \xdef \firstsubpage {\realfolio}%
+ \advance\realpageno \nofsubpages
+ \advance\realpageno \minusone
+ \xdef \lastsubpage {\realfolio}%
+ \egroup
+ \else
+ \xdef \nofsubpages{0}%
+ \fi}
+
+\def\gotonextsubpage % overlapt behoorlijk met realpage macro
+ {\global\let\checksubpages\relax
+ \ifresettingsubpagenumber
+ \resetnumber[\s!subpage]%
+ \global\resettingsubpagenumberfalse
+ \fi
+ \ifsubpaging
+ \xdef\oldsubpage{\the\subpageno}%
+ \incrementnumber[\s!subpage]%
+ \global\subpageno\rawnumber[\s!subpage]\relax
+ \ifnum\subpageno=\plusone
+ \gettwopassdata\s!subpage
+ \setsubpagenumbers
+ \ifnum\oldsubpage>\zerocount
+ \showmessage\m!layouts6{\newnofsubpages,\oldsubpage}%
+ \savetwopassdata{\s!subpage}{\newnofsubpages}{\oldsubpage}%
+ \fi
+ \doglobal\increment\newnofsubpages\relax
+ \fi
+ \setglobalsystemreference\rt!page\v!firstsubpage\firstsubpage
+ \setglobalsystemreference\rt!page\v!lastsubpage\lastsubpage
+ \bgroup
+ \ifnum\realpageno=\firstsubpage\relax
+ \global\let\prevsubpage\firstsubpage
+ \setglobalsystemreference\rt!page\v!subbackward\lastsubpage
+ \else
+ \xdef\prevsubpage{\realfolio}%
+ \doglobal\decrement\prevsubpage
+ \setglobalsystemreference\rt!page\v!subbackward\prevsubpage
+ \fi
+ \setglobalsystemreference\rt!page\v!previoussubpage\prevsubpage
+ \ifnum\realpageno=\lastsubpage\relax
+ \global\let\nextsubpage\lastsubpage
+ \setglobalsystemreference\rt!page\v!subforward\firstsubpage
+ \else
+ \xdef\nextsubpage{\realfolio}%
+ \doglobal\increment\nextsubpage
+ \setglobalsystemreference\rt!page\v!subforward\nextsubpage
+ \fi
+ \setglobalsystemreference\rt!page\v!nextsubpage\nextsubpage
+ \egroup
+ \fi}
+
+\def\checksubpages
+ {\getfromtwopassdata\s!subpage1%
+ \setsubpagenumbers
+ \global\let\checksubpages\relax}
+
+% Omdat \gotonextrealpage gebruik maakt van de hulpfile,
+% moet het initialiseren van \realpageno plaatsvinden in
+% een later stadium, namelijk zodra referenties worden
+% gebruikt (anders gaat het mis op nog niet gedefinieerde
+% lijstcommando's e.d.). De eerst aanroep vindt dan ook
+% plaats vlak nadat de hulpfile voor de eerste maal is
+% ingelezen.
+
+\countdef\realpageno = 0 \realpageno = 1
+\countdef\userpageno = 1 \userpageno = 1
+\countdef\subpageno = 2 \subpageno = 0 % !!
+\countdef\arrangeno = 3 \arrangeno = 0 % !!
+
+\let\pageno\userpageno
+
+% we don't want conflicts when \pageno is used by other
+% packages, like CWEB, so we redefine \pageno
+
+\newcount\pageno \pageno = 1
+
+\def\setuserpageno#1%
+ {\global\userpageno#1\relax
+ \global\pageno\userpageno}
+
+\def\realfolio {\the\realpageno}
+\def\folio {\the\userpageno}
+\def\firstpage {1}
+\def\lastpage {1}
+\def\currentpage {\the\realpageno}
+\def\lastpagenumber{1}
+
+\def\gotonextrealpage
+ {\global\advance\realpageno \plusone\relax
+ \ifnum\realpageno>\lastpage
+ \xdef\lastpage{\realfolio}%
+ \fi
+ \setglobalsystemreference\rt!page\v!firstpage \firstpage
+ \setglobalsystemreference\rt!page\v!lastpage\lastpage
+ \bgroup
+ \ifnum\realpageno>\plusone
+ \advance\realpageno \minusone
+ \xdef\prevpage{\realfolio}%
+ \setglobalsystemreference\rt!page\v!backward\prevpage
+ \else
+ \global\let\prevpage\firstpage
+ \setglobalsystemreference\rt!page\v!backward\lastpage
+ \fi
+ \setglobalsystemreference\rt!page\v!previouspage\prevpage
+ \egroup
+ \bgroup
+ \ifnum\realpageno<\lastpage\relax
+ \advance\realpageno \plusone
+ \xdef\nextpage{\realfolio}%
+ \setglobalsystemreference\rt!page\v!page\nextpage
+ \setglobalsystemreference\rt!page\v!forward\nextpage
+ \bgroup
+ \xdef\nextnextpage{\realfolio}%
+ \ifodd\realpageno
+ \setglobalsystemreference\rt!page\v!nextoddpage\nextnextpage
+ \else
+ \setglobalsystemreference\rt!page\v!nextevenpage\nextnextpage
+ \fi
+ \advance\realpageno \plusone
+ \xdef\nextnextpage{\realfolio}%
+ \ifnum\realpageno>\lastpage\relax
+ %\ifodd\realpageno
+ % \setglobalsystemreference\rt!page\v!nextoddpage\lastpage
+ %\else
+ % \setglobalsystemreference\rt!page\v!nextevenpage\lastpage
+ %\fi
+ \else
+ \ifodd\realpageno
+ \setglobalsystemreference\rt!page\v!nextoddpage\nextnextpage
+ \else
+ \setglobalsystemreference\rt!page\v!nextevenpage\nextnextpage
+ \fi
+ \fi
+ \egroup
+ \else
+ \global\let\nextpage\lastpage
+ \setglobalsystemreference\rt!page\v!page\firstpage
+ \setglobalsystemreference\rt!page\v!forward\firstpage
+ \setglobalsystemreference\rt!page\v!nextoddpage\lastpage
+ \setglobalsystemreference\rt!page\v!nextevenpage\lastpage
+ \fi
+ \setglobalsystemreference\rt!page\v!nextpage\realfolio
+ \egroup}
+
+\def\checkrealpage
+ {\global\realpageno\zerocount
+ \gotonextrealpage
+ \global\let\checkrealpage\relax}
+
+\def\savenofpages
+ {\bgroup
+ \advance\realpageno \minusone
+ \savecurrentvalue\lastpage\realfolio
+ \advance\userpageno \minusone
+ \savecurrentvalue\lastpagenumber\folio
+ \egroup}
+
+\def\totalnumberofpages
+ {\lastpage}
+
+\def\setpagecounters
+ {\setuserpageno{\rawnumber[\s!page]}%
+ \doifelse\@@snstate\v!stop
+ {\global\subpageno\zerocount}
+ {\global\subpageno\rawnumber[\s!subpage]}\relax}
+
+% Standaard is \count0 in Plain TeX de paginateller. Omwille
+% van de afhandeling van lokaal nummeren, definieren we
+% echter een eigen nummer.
+
+\definenumber
+ [\s!page]
+ [\c!conversion=\@@nmconversion,
+ \c!way=\@@nmway,
+ \c!state=\@@nmstate,
+ \c!start=1]
+
+% \@@pnstatus global, but \@@nmstatus local and only start/stop
+
+\global\let\@@pnstate\@@pnstate % brrr
+
+\def\pushpagestate{\globalpushmacro\@@pnstate}
+\def\poppagestate {\globalpopmacro \@@pnstate}
+
+\def\dosetuppagenumber[#1]%
+ {\getparameters[\??pn][\c!number=,#1]%
+ \global\let\@@pnstate\@@pnstate
+ \doifsomething\@@pnnumber
+ {\setnumber[\s!page]{\@@pnnumber}%
+ \setuserpageno{\rawnumber[\s!page]}}%
+ % this makes starting at an even page possible
+ \ifnum\realpageno=1 \ifodd\pageno \else
+ \global\shiftedrealpagenotrue
+ \fi \fi}
+
+\def\setuppagenumber
+ {\dosingleargument\dosetuppagenumber}
+
+\def\dodecrementpagenumber
+ {\decrementnumber[\s!page]\setuserpageno{\rawnumber[\s!page]}}
+
+\def\doincrementpagenumber
+ {\incrementnumber[\s!page]\setuserpageno{\rawnumber[\s!page]}}
+
+\def\dosynchronizepagenumber
+ {\global\let\@@pnstate\v!start}
+
+\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}\doincrementpagenumber
+\letvalue{\??pn+\v!none }\doincrementpagenumber
+\setvalue{\??pn+\v!empty}{\doincrementpagenumber\dosynchronizepagenumber}
+\letvalue{\??pn+\v!keep }\dosynchronizepagenumber
+
+% so far
+
+\def\checkpagecounter
+ {\checknumber[\s!page]}
+
+% \getpagestatus
+% \ifrightpage als odd/singlesided
+
+\newif\ifrightpage \rightpagetrue
+
+\newcounter \nofpagesets
+
+\definetwopasslist\s!page
+
+\def\dopagesetreference
+ {\doglobal\increment\nofpagesets\relax
+ \lazysavetwopassdata{\s!page}{\nofpagesets}{\noexpand\realfolio}}
+
+\def\getpagestatus % hierboven gebruiken
+ {\ifdoublesided
+ \gettwopassdata\s!page
+ \iftwopassdatafound \else
+ \let\twopassdata\realpageno
+ \fi
+ \ifodd\twopassdata
+ \global\rightpagetrue
+ \else
+ \global\rightpagefalse
+ \fi
+ \dopagesetreference
+ \else
+ \global\rightpagetrue
+ \fi}
+
+\def\@@nmin {} % kan vervallen (upward compatibility)
+\def\@@nmlocation {} % mag {plaats, in} zijn
+
+\newcounter\@@pagenumberlocation
+
+\def\do@@plaatspaginanummer#1%
+ {\ifnum#1=\@@pagenumberlocation\@@plaatspaginanummer\fi}
+
+\def\dodosetpagenumberlocation#1% tricky because of ...texts
+ {\increment\@@pagenumberlocation
+ \ifx\@@nmlocation\empty\else
+ \def\dododosetpagenumberlocation##1%
+ {\donetrue
+ \setevalue{\??tk#1##1}{\noexpand\do@@plaatspaginanummer{\@@pagenumberlocation}}}%
+ \donefalse
+ \ExpandFirstAfter\processallactionsinset
+ [\@@nmlocation]
+ [ \v!middle=>\dododosetpagenumberlocation{\v!text\c!middletext},
+ \v!left=>\dododosetpagenumberlocation{\v!text\c!lefttext},
+ \v!right=>\dododosetpagenumberlocation{\v!text\c!righttext},
+ \v!inleft=>\dododosetpagenumberlocation{\v!margin\c!lefttext},
+ \v!inright=>\dododosetpagenumberlocation{\v!margin\c!righttext},
+ \v!inmargin=>\dododosetpagenumberlocation{\v!margin\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!margin=>\dododosetpagenumberlocation{\v!margin\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!atmargin=>\dododosetpagenumberlocation{\v!text\c!marginedgetext},
+ \v!marginedge=>\dododosetpagenumberlocation{\v!text\c!marginedgetext}]%
+ \ifdone \else
+ \dododosetpagenumberlocation{\v!text\c!middletext}% default
+ \fi
+ \fi}
+
+\def\dosetpagenumberlocation
+ {\ExpandBothAfter\doifinsetelse\v!header{\@@nmlocation,\@@nmin}
+ {\dodosetpagenumberlocation\v!header}
+ {\dodosetpagenumberlocation\v!footer }}
+
+\def\dosetuppagenumbering[#1]%
+ {\getparameters[\??nm][#1]%
+ \preparepageprefix\??nm
+ \singlesidedfalse
+ \doublesidedfalse
+ \ExpandFirstAfter\processallactionsinset
+ [\@@nmalternative]
+ [ \v!singlesided=>\singlesidedtrue,
+ \v!doublesided=>\doublesidedtrue]%
+ \ifx\trackingmarginnotestrue\undefined\else
+ \ifdoublesided
+ \trackingmarginnotestrue
+ \else
+ \trackingmarginnotesfalse
+ \fi
+ \fi
+ \dosetpagenumberlocation
+ \recalculatebackgrounds
+ \recalculatelogos}
+
+\def\setuppagenumbering
+ {\dosingleempty\dosetuppagenumbering}
+
+\let\stelnummeringin\setuppagenumbering
+
+% wrong
+%
+% \def\preparepageprefix#1%
+% {\def\dopreparepageprefix##1%
+% {\doifvalue{#1##1\c!number}{\v!yes}
+% {\setvalue{#1\getvalue{\??by##1}\c!nummer}{\v!yes}}}%
+% \processcommacommand[\@@kolijst]\dopreparepageprefix}
+%
+% more wrong
+%
+% \def\preparepageprefix#1%
+% {\def\dopreparepageprefix##1%
+% {\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)
+
+\def\preparepageprefix#1%
+ {\def\dopreparepageprefix##1%
+ {\ifcsname\??by##1\endcsname\letvalue{#1\csname\??by##1\endcsname\v!number}\v!no\fi}% %v
+ \rawprocesscommalist[\@@kolist]\dopreparepageprefix
+ \def\dopreparepageprefix##1%
+ {\doifvalue{#1##1\v!number}\v!yes %v
+ {\ifcsname\??by##1\endcsname\letvalue{#1\csname\??by##1\endcsname\v!number}\v!yes\fi}}%
+ \rawprocesscommalist[\@@kolist]\dopreparepageprefix}
+
+\def\dodopageprefix#1% uti seperator --
+ {\let\normaluchar\uchar \let\uchar\relax % ugly but needed
+ \doifelsevalue{\pageprefixtype#1\v!number}\v!yes % \v! and no \c!
+ {\edef\preprefix {\@@filterheadpart[\postprefix]}%
+ \edef\postprefix{\@@filtertailpart[\postprefix]}%
+ \let\uchar\normaluchar % ugly but needed
+ \ifx\preprefix\empty \else
+ \ifx\preprefix\zerocountervalue\else
+ \preprefix\@@nmnumberseparator
+ \fi
+ \fi}
+ {\edef\postprefix{\@@filtertailpart[\postprefix]}%
+ \let\uchar\normaluchar}} % ugly but needed
+
+\def\dopageprefix#1%
+ {\dodopageprefix{#1}%
+ \donexttracklevel{#1}}
+
+\chardef\pageprefixmode\plusone
+
+\def\pageprefix#1[#2]%
+ {\ifcase\pageprefixmode
+ % skip
+ \or
+ \bgroup
+ \edef\pageprefixtype{#1}%
+ \edef\postprefix{\@@filternumberpart[#2]}%
+ \let\donexttrackcommando\dopageprefix
+ \donexttrackcommando\firstsection
+ \egroup
+ \fi}
+
+%D It was Marco Kuhlmann who uncovered the missing strut. This
+%D was a pretty old bug kind of covered up by the fact that non
+%D oldstyle numbers are about as high as strutheight. Rather
+%D interesting that it went unnoticed for so long.
+
+\unexpanded\def\@@plaatspaginanummer % called in empty tests
+ {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}
+ {{\doif\@@nmstrut\v!yes\strut
+ \@@nmcommand{\doattributes\??nm\c!style\c!color{\completepagenumber}}}}}
+
+\def\userfolio {\convertednumber[\s!page]} % naast realfolio
+\def\pagenumber{\userfolio}
+
+\def\pageprefixes
+ {\let\donexttrackcommando\dopageprefixes
+ \donexttrackcommando\firstsection}
+
+\def\dopageprefixes#1%
+ {\doifvalue{\??nm#1\v!number}\v!yes % v
+ {\ifnum\countervalue{\??se#1}>\zerocount
+ \getvalue{#1\c!number}\@@nmnumberseparator
+ \fi}%
+ \doifsomething\@@nmtext{\@@nmtext\@@nmnumberseparator}% strange option, what was the purpose of text?
+ \donexttracklevel{#1}}
+
+\unexpanded\def\completepagenumber
+ {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}
+ {\@@nmleft\labeltexts\v!pagenumber{\pageprefixes\pagenumber}\@@nmright}}
+
+\unexpanded\def\placepagenumber
+ {\doif{\@@nmstate\@@pnstate}{\v!start\v!start}
+ {\labeltexts\v!pagenumber{\pagenumber}}}
+
+% Nog een variant; wat is een goeie naam?
+
+% \unexpanded\def\placexxpagenumber
+% {\@@plaatspaginanummer}
+
+% \def\translatednumber[#1::#2::#3]{#3}
+
+\def\translatednumber{\@@filterpagepart}
+
+\unexpanded\def\referencepagenumber[#1]%
+ {\doifelsenothing{#1}{?}%
+ {\preparepageprefix\??rf
+ \pageprefix\??rf[#1]\translatednumber[#1]}}
+
+\setuppagenumber
+ [\c!state=\v!start,
+ \c!number=1]
+
+\setupsubpagenumber
+ [\c!way=\v!by\v!part,
+ \c!state=\v!stop]
+
+\protect \endinput
diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv
new file mode 100644
index 000000000..0f3d7ba3b
--- /dev/null
+++ b/tex/context/base/strc-pag.mkiv
@@ -0,0 +1,496 @@
+%D \module
+%D [ file=strc-pag,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Pagenumbering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Pagenumbering}
+
+\registerctxluafile{strc-pag}{1.001}
+
+\unprotect
+
+% Hacks:
+
+\let\preparepageprefix\gobbleoneargument
+
+% Allocation:
+
+\countdef\realpageno = 0 \realpageno = 1
+\countdef\userpageno = 1 \userpageno = 1
+\countdef\subpageno = 2 \subpageno = 0 % !!
+\countdef\arrangeno = 3 \arrangeno = 0 % !!
+\countdef\pagenoshift = 4 \pagenoshift = 0 % !!
+
+\let\pageno\userpageno
+
+\def\realfolio{\the\realpageno}
+\def\userfolio{\the\userpageno}
+\def\subfolio {\the\subpageno }
+
+\newtoks\everyinitializepagecounters
+
+\def\initializepagecounters{\the\everyinitializepagecounters}
+
+\appendtoks
+ \initializepagecounters
+\to \everyjob
+
+% Page numbers are kind of independent of each other and therefore they
+% all get their own counter. After all, it's easier to combine them in
+% a pseudo counterset than to deal with a complex set itself.
+
+% \definestructureprefixset [mine][section-1,section-2]
+% \definestructureseparatorset[mine][:]
+%
+% \setupuserpagenumber
+% [way=bypart,
+% prefix=yes,
+% prefixset=mine,
+% prefixseparatorset=mine]
+
+% \definestructureconversionset[frontpart:pagenumber][][romannumerals]
+% \definestructureconversionset[bodypart:pagenumber] [][numbers]
+%
+% \setupuserpagenumber[way=byblock]
+% \setupuserpagenumber[way=bychapter]
+% \setupuserpagenumber[numberconversionset=pagenumber]
+%
+% \starttext
+% \startfrontmatter
+% \completecontent[criterium=all]
+% \chapter{tufte} \section{one} \input tufte \page \section{two} \input tufte \page
+% \chapter{tufte} \section{one} \input tufte \page \section{two} \input tufte \page
+% \stopfrontmatter
+% \startbodymatter
+% \chapter{knuth} \section{one} \input knuth \page \section{two} \input knuth \page \section{three} \input knuth \page
+% \chapter{knuth} \section{one} \input knuth \page \section{two} \input knuth \page \section{three} \input knuth \page
+% \stopbodymatter
+% \stoptext
+
+
+\definestructurecounter[\s!realpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=realpageno]
+\definestructurecounter[\s!userpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=userpageno]
+\definestructurecounter[\s!subpage] [\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=subpageno]
+
+\newtoks\everysetuprealpagenumber % todo: set state: none, start, stop, reset
+\newtoks\everysetupuserpagenumber % todo: set state: none, start, stop, reset
+\newtoks\everysetupsubpagenumber % todo: set state: none, start, stop, reset
+
+\unexpanded\def\setuprealpagenumber{\dosingleargument\dosetuprealpagenumber}
+\unexpanded\def\setupuserpagenumber{\dosingleargument\dosetupuserpagenumber}
+\unexpanded\def\setupsubpagenumber {\dosingleargument\dosetupsubpagenumber}
+
+\def\dosavepagenumberstate#1{\edef\oldpagenumberstate{\structurecounterparameter#1\c!state}}
+
+\def\dosetuprealpagenumber[#1]{\dosavepagenumberstate\s!realpage\dosetupstructurecounter[\s!realpage][#1]\the\everysetuprealpagenumber}
+\def\dosetupuserpagenumber[#1]{\dosavepagenumberstate\s!userpage\dosetupstructurecounter[\s!userpage][#1]\the\everysetupuserpagenumber}
+\def\dosetupsubpagenumber [#1]{\dosavepagenumberstate\s!subpage \dosetupstructurecounter[\s!subpage ][#1]\the\everysetupsubpagenumber }
+
+\def\resetrealpagenumber {} % not permitted
+\def\resetuserpagenumber {\resetstructurecounter[\s!userpage]}
+\def\resetsubpagenumber {\resetstructurecounter[\s!subpage]}
+
+\appendtoks
+ \setstructurecounter[\s!realpage]\realpageno
+ \setstructurecounter[\s!userpage]\userpageno
+ \setstructurecounter[\s!subpage] \subpageno
+\to \everyinitializepagecounters
+
+\let\setuppagenumber\setupuserpagenumber
+\let\resetpagenumber\resetuserpagenumber
+
+\def\savecurrentpagestate % \normalexpanded?
+ {\ctxlua{structure.pages.save({
+ prefix = "\structurecounterparameter\s!userpage\c!prefix",
+ separatorset = "\structurecounterparameter\s!userpage\c!prefixseparatorset",
+ conversion = "\structurecounterparameter\s!userpage\c!prefixconversion",
+ conversionset = "\structurecounterparameter\s!userpage\c!prefixconversionset",
+ set = "\structurecounterparameter\s!userpage\c!prefixset",
+ segments = "\structurecounterparameter\s!userpage\c!prefixsegments",
+ connector = \!!bs\structurecounterparameter\s!userpage\c!prefixconnector\!!es,
+ },{
+ conversion = "\structurecounterparameter\s!userpage\c!numberconversion",
+ conversionset = "\structurecounterparameter\s!userpage\c!numberconversionset",
+ starter = \!!bs\structurecounterparameter\s!userpage\c!numberstarter\!!es,
+ stopper = \!!bs\structurecounterparameter\s!userpage\c!numberstopper\!!es,
+ }
+ )}}
+
+\prependtoks
+ \savecurrentpagestate
+\to \everyshipout
+
+\def\pushpagestate{\setxvalue{\??nm:\s!userpage:\c!state}{\structurecounterparameter\s!userpage\c!state}}
+\def\poppagestate {\normalexpanded{\noexpand\setuppagenumber[\c!state=\getvalue{\??nm:\s!userpage:\c!state}]}}
+
+\setuppagenumber
+ [\c!way=\v!by\v!text,
+ \c!prefix=\v!no,
+ \c!prefixset=\v!part,
+ \c!prefixconnector=\endash,
+ \c!state=\v!start]
+
+\setupsubpagenumber
+ [\c!way=\v!by\v!part,
+ \c!state=\v!stop]
+
+% Counters
+
+% \def\firstpage {1} \def\prevpage {1} \def\nextpage {1} \def\lastpage {1}
+% \def\firstuserpage{1} \def\prevuserpage{1} \def\nextuserpage{1} \def\lastuserpage{1}
+% \def\firstsubpage {1} \def\prevsubpage {1} \def\nextsubpage {1} \def\lastsubpage {1}
+
+% \def\firstrealpage{\firststructurecounter[\s!realpage]}
+% \def\prevrealpage {\prevstructurecounter [\s!realpage]}
+% \def\nextrealpage {\nextstructurecounter [\s!realpage]}
+% \def\lastrealpage {\laststructurecounter [\s!realpage]}
+
+% \let\firstpage\firstrealpage
+% \let\prevpage \prevrealpage
+% \let\nextpage \nextrealpage
+% \let\lastpage \lastrealpage
+
+\def\firstrealpagenumber{\convertedstructurecounter[\s!realpage][\c!type=\v!first]}
+\def\firstuserpagenumber{\convertedstructurecounter[\s!userpage][\c!type=\v!first]}
+\def\firstsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!first]}
+
+\def\lastrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!last]}
+\def\lastuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!last]}
+\def\lastsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!last]}
+
+\def\prevrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!previous]}
+\def\prevuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!previous]}
+\def\prevsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!previous]}
+
+\def\nextrealpagenumber {\convertedstructurecounter[\s!realpage][\c!type=\v!next]}
+\def\nextuserpagenumber {\convertedstructurecounter[\s!userpage][\c!type=\v!next]}
+\def\nextsubpagenumber {\convertedstructurecounter[\s!subpage ][\c!type=\v!next]}
+
+\def\firstrealpage{\firststructurecounter[\s!realpage]}
+\def\firstuserpage{\firststructurecounter[\s!userpage]}
+\def\firstsubpage {\firststructurecounter[\s!subpage ]}
+
+\def\prevrealpage {\prevstructurecounter [\s!realpage]}
+\def\prevuserpage {\prevstructurecounter [\s!userpage]}
+\def\prevsubpage {\prevstructurecounter [\s!subpage ]}
+
+\def\nextrealpage {\nextstructurecounter [\s!realpage]}
+\def\nextuserpage {\nextstructurecounter [\s!userpage]}
+\def\nextsubpage {\nextstructurecounter [\s!subpage ]}
+
+\def\lastrealpage {\laststructurecounter [\s!realpage]}
+\def\lastuserpage {\laststructurecounter [\s!userpage]}
+\def\lastsubpage {\laststructurecounter [\s!subpage ]}
+
+\let\firstpage\firstrealpage
+\let\prevpage \prevrealpage
+\let\nextpage \nextrealpage
+\let\lastpage \lastrealpage
+
+% Compatibility counters:
+
+\def\nofrealpages {\lastrealpage} \def\totalnumberofpages{\lastrealpage}
+\def\nofuserpages {\lastuserpage} \def\lastpagenumber {\lastuserpage}
+\def\nofsubpages {\lastsubpage }
+
+% Renderers:
+
+\def\pagenumber {\rawstructurecounter[\s!userpage]}
+\def\prefixedpagenumber {\directconvertedstructurecounter\s!userpage\empty} % \userpagenumber
+
+\def\realpagenumber {\directconvertedstructurecounter\s!realpage\empty}
+\def\userpagenumber {\directconvertedstructurecounter\s!userpage\empty}
+\def\subpagenumber {\directconvertedstructurecounter\s!subpage \empty}
+
+\def\firstrealpagenumber{\directconvertedstructurecounter\s!realpage\v!first}
+\def\firstuserpagenumber{\directconvertedstructurecounter\s!userpage\v!first}
+\def\firstsubpagenumber {\directconvertedstructurecounter\s!subpage \v!first}
+
+\def\lastrealpagenumber {\directconvertedstructurecounter\s!realpage\v!last}
+\def\lastuserpagenumber {\directconvertedstructurecounter\s!userpage\v!last}
+\def\lastsubpagenumber {\directconvertedstructurecounter\s!subpage \v!last}
+
+\def\prevrealpagenumber {\directconvertedstructurecounter\s!realpage\v!previous}
+\def\prevuserpagenumber {\directconvertedstructurecounter\s!userpage\v!previous}
+\def\prevsubpagenumber {\directconvertedstructurecounter\s!subpage \v!previous}
+
+\def\nextrealpagenumber {\directconvertedstructurecounter\s!realpage\v!next}
+\def\nextuserpagenumber {\directconvertedstructurecounter\s!userpage\v!next}
+\def\nextsubpagenumber {\directconvertedstructurecounter\s!subpage \v!next}
+
+\appendtoks
+ \decrementstructurecounter[\s!realpage]%
+ \decrementstructurecounter[\s!userpage]%
+ \decrementstructurecounter[\s!subpage]%
+\to\everygoodbye
+
+% Equivalents (compatibility):
+%
+% todo: maybe leave lastpage etc lua calls
+
+\def\realpage{\the\realpageno}
+\def\userpage{\the\userpageno}
+\def\subpage {\the\subpageno}
+
+% Hooks:
+
+\def\currentpage{\the\realpageno}% rather useless
+
+\appendtoks
+ \ifnum\realpageno>\lastpage \globallet\lastpage\lastrealpage \fi
+\to \everyinitializepagecounters
+
+% States:
+
+\newif\ifrightpage \rightpagetrue
+\newif\ifdoublesided
+\newif\ifsinglesided
+
+% Realpage and subpage numbers:
+
+\def\setnextrealpageno{\global\realpageno\incrementedstructurecounter[\s!realpage]\relax}
+\def\setnextsubpageno {\global\subpageno \incrementedstructurecounter[\s!subpage ]\relax}
+
+% Page numbers: (can move to lua)
+
+\def\dodecrementpagenumber {\global\userpageno\decrementedstructurecounter[\s!userpage]\relax}
+\def\doincrementpagenumber {\global\userpageno\incrementedstructurecounter[\s!userpage]\relax}
+
+\def\decrementsubpagenumber{\global\subpageno \decrementedstructurecounter[\s!subpage ]\relax}
+\def\incrementsubpagenumber{\global\subpageno \incrementedstructurecounter[\s!subpage ]\relax}
+
+\def\dosynchronizepagenumber{\global\let\@@pnstate\v!start}
+
+\def\decrementpagenumber{\csname\??pn-\structurecounterparameter\s!userpage\c!state\endcsname}
+\def\incrementpagenumber{\csname\??pn+\structurecounterparameter\s!userpage\c!state\endcsname}
+
+\letvalue{\??pn-\v!start}\dodecrementpagenumber
+\letvalue{\??pn-\v!none }\dodecrementpagenumber
+\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
+
+% Control:
+
+\def\getpagestatus % hierboven gebruiken
+ {\ifdoublesided
+ \global\rightpagetrue
+ % todo: \global\rightpagetrue or \global\rightpagefalse
+ \else
+ \global\rightpagetrue
+ \fi}
+
+% Setup general page numbering
+
+\newtoks\everysetuppagenumbering
+
+\unexpanded\def\setuppagenumbering
+ {\dosingleempty\dosetuppagenumbering}
+
+\def\dosetuppagenumbering[#1]%
+ {\getparameters[\??nm][#1]\the\everysetuppagenumbering}
+
+\appendtoks
+ \singlesidedfalse
+ \doublesidedfalse
+ \normalexpanded{\noexpand\processallactionsinset[\@@nmalternative]}
+ [ \v!singlesided=>\singlesidedtrue,
+ \v!doublesided=>\doublesidedtrue]%
+ \ifx\trackingmarginnotestrue\undefined\else
+ \ifdoublesided
+ \trackingmarginnotestrue
+ \else
+ \trackingmarginnotesfalse
+ \fi
+ \fi
+ \dosetpagenumberlocation
+\to \everysetuppagenumbering
+
+\appendtoks
+ \ifdefined \recalculatebackgrounds \recalculatebackgrounds \fi
+\to \everysetuppagenumbering
+
+\def\flushfinallayoutpage
+ {\doifsomething\@@nmpage{\doifnot\@@nmpage\v!no{\page[\@@nmpage]}}}
+
+% The numbered location handler is there because we need to be downward
+% compatible. So, in fact there can be multiple handlers active at the
+% same time, but only the current one does something.
+%
+% thsi code might move to page-txt
+
+\newcount\currentpagenumberlocation
+
+\def\dosetpagenumberlocation
+ {\advance\currentpagenumberlocation\plusone
+ \ifx\@@nmlocation\empty \else
+ \let\@@pagenumbervlocation\v!footer
+ \let\@@pagenumberhlocation\v!text
+ \let\@@pagenumberxlocation\c!middletext
+ \normalexpanded{\noexpand\processallactionsinset[\@@nmlocation]}
+ [ \v!header=>\let\@@pagenumbervlocation\v!header,
+ \v!footer=>\let\@@pagenumbervlocation\v!footer,
+ \v!middle=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!middletext,
+ \v!left=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!lefttext,
+ \v!right=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!righttext,
+ \v!inleft=>\let\@@pagenumberhlocation\v!margin\let\@@pagenumberxlocation\c!lefttext,
+ \v!inright=>\let\@@pagenumberhlocation\v!margin\let\@@pagenumberxlocation\c!righttext,
+ \v!inmargin=>\let\@@pagenumberhlocation\v!margin\def\@@pagenumberxlocation{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!margin=>\let\@@pagenumberhlocation\v!margin\def\@@pagenumberxlocation{\ifdoublesided\c!margintext\else\c!righttext\fi},
+ \v!atmargin=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!marginedgetext,
+ \v!marginedge=>\let\@@pagenumberhlocation\v!text \let\@@pagenumberxlocation\c!marginedgetext]%
+ \normalexpanded{\noexpand\setspecificlayouttext
+ {\@@pagenumbervlocation}{\@@pagenumberhlocation}{\@@pagenumberxlocation}%
+ {\noexpand\doplacepagenumberatlocation{\number\currentpagenumberlocation}}}%
+ \fi}
+
+\def\setspecificlayouttext#1#2#3#4{\setvalue{\??tk#1#2#3}{#4}} % weird place
+
+\appendtoks
+ \dosetpagenumberlocation
+\to \everyinitializepagecounters
+
+\def\doplacepagenumberatlocation#1%
+ {\ifnum#1=\currentpagenumberlocation\relax\expandafter\placelocationpagenumber\fi}
+
+% Rendering:
+
+\unexpanded\def\placelocationpagenumber
+ {\ifnum\userpagenumberstate=\plustwo
+ \ifnum\overallpagenumberstate=\plusone
+ \doif\@@nmstrut\v!yes\strut
+ \@@nmcommand{\doattributes\??nm\c!style\c!color{\@@nmleft\labeltexts\v!pagenumber{\prefixedpagenumber}\@@nmright}}%
+ \fi
+ \fi}
+
+\unexpanded\def\completepagenumber
+ {\ifnum\userpagenumberstate=\plustwo
+ \ifnum\overallpagenumberstate=\plusone
+ \@@nmleft\labeltexts\v!pagenumber\prefixedpagenumber\@@nmright
+ \fi
+ \fi}
+
+\unexpanded\def\placepagenumber
+ {\ifnum\userpagenumberstate=\plustwo
+ \ifnum\overallpagenumberstate=\plusone
+ \labeltexts\v!pagenumber\pagenumber
+ \fi
+ \fi}
+
+\unexpanded\def\referencepagenumber[#1]%
+ {\doifelsenothing{#1}{?}{}}
+
+% The numbered location handler is there because we need to be downward
+% compatible. So, in fact there can be multiple handlers active at the
+% same time, but only the current one does something.
+
+\chardef\realpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
+\chardef\userpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
+\chardef\subpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
+\chardef\overallpagenumberstate=1 % general number: 0=invisible, 1=visible
+
+\def\checkpagenumberstatechange#1#2%
+ {\edef\newpagenumberstate{\structurecounterparameter#1\c!state}%
+ \ifx\newpagenumberstate\oldpagenumberstate \else
+ \doifelse\newpagenumberstate\v!start
+ {\chardef#2\plustwo}%
+ {\chardef#2\zerocount}%
+ \fi}
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \checkpagenumberstatechange\s!realpage\realpagenumberstate
+\to \everysetuprealpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \checkpagenumberstatechange\s!userpage\userpagenumberstate
+\to \everysetupuserpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \checkpagenumberstatechange\s!subpage\subpagenumberstate
+\to \everysetupsubpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ \doifelse\@@nmstate\v!start
+ {\chardef\overallpagenumberstate\plusone}%
+ {\chardef\overallpagenumberstate\zerocount}%
+\to \everysetuppagenumbering
+
+% Done
+
+% \c!way=\v!by\v!part
+% \c!text=
+% \v!chapter\v!number=\v!no
+% \v!part\v!number=\v!yes
+% \c!numberseparator=--
+% \c!conversion=\v!numbers
+
+\setuppagenumbering
+ [\c!alternative=\v!singlesided,
+ \c!location={\v!header,\v!middle},
+ \c!width=, % in geval van \v!marginedge
+ \c!left=,
+ \c!right=,
+ \c!page=\v!last,
+ \c!textseparator=\tfskip,
+ \c!state=\v!start,
+ \c!command=,
+ \c!strut=\v!yes,
+ \c!style=, % empty, otherwise conflict
+ \c!color=]
+
+% just for downward compatbility
+
+\appendtoks
+ \edef\askeduserpagenumber{\structurecounterparameter\s!userpage\c!number}%
+ \ifx\askeduserpagenumber\empty \else
+ \normalexpanded{\noexpand\setuppagenumber[\c!start=\structurecounterparameter\s!userpage\c!number,\c!number=]}%
+ \userpageno\rawstructurecounter[\s!userpage]%
+ \fi
+\to \everysetupuserpagenumber % todo: set state: none, start, stop, reset
+
+\appendtoks
+ \edef\askedsubpagenumber{\structurecounterparameter\s!subpage\c!number}%
+ \ifx\askedsubpagenumber\empty \else
+ \normalexpanded{\noexpand\setupsubpagenumber[\c!start=\structurecounterparameter\s!subpage\c!number,\c!number=]}%
+ \subpageno\rawstructurecounter[\s!subpage]%
+ \fi
+\to \everysetupsubpagenumber % todo: set state: none, start, stop, reset
+
+% \setuplayout[width=300pt,backspace=4cm]
+% \setuppagenumbering [alternative=doublesided]
+% \setupuserpagenumber[start=2]
+% \starttext \dorecurse{20}{\input knuth \par} \stoptext
+
+\def\checkpagenumbershift
+ {\userpageno\rawstructurecounter[\s!userpage]\relax
+ \ifnum\realpageno=\plusone
+ \ifodd\userpageno
+ \else
+ \global\pagenoshift\plusone
+ \fi
+ \fi}
+
+\appendtoks % todo: set state: none, start, stop, reset
+ % this makes starting at an even page possible
+ \checkpagenumbershift
+\to \everysetupuserpagenumber
+
+\appendtoks % todo: set state: none, start, stop, reset
+ % this makes starting at an even page possible
+ \checkpagenumbershift
+\to \everysetuppagenumbering
+
+\initializepagecounters
+
+\protect \endinput
diff --git a/tex/context/base/strc-prc.lua b/tex/context/base/strc-prc.lua
new file mode 100644
index 000000000..b1a1fb0a9
--- /dev/null
+++ b/tex/context/base/strc-prc.lua
@@ -0,0 +1,9 @@
+if not modules then modules = { } end modules ['strc-prc'] = {
+ version = 1.001,
+ comment = "companion to strc-prc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- code will move from strc-ini to here
diff --git a/tex/context/base/strc-prc.mkiv b/tex/context/base/strc-prc.mkiv
new file mode 100644
index 000000000..2955a396b
--- /dev/null
+++ b/tex/context/base/strc-prc.mkiv
@@ -0,0 +1,84 @@
+%D \module
+%D [ file=strc-prc,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Processors,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Processors}
+
+\registerctxluafile{strc-prc}{1.001}
+
+\unprotect
+
+%D Processors are used when we cannot easily associate typesetting directives
+%D with (for instance) structural elements. Instead of ending up with numerous
+%D additional definitions we can group treatments in so called processors.
+%D
+%D An example of where processors can be used is in separator sets (these are
+%D related to typesetting numbers using structure).
+%D
+%D \starttyping
+%D \defineprocessor[demo][style=\bfb,color=red]
+%D \stoptyping
+%D
+%D This defines a processor named \type {demo}. Such a name ends up as prefix in
+%D for instance:
+%D
+%D \starttyping
+%D \definestructureseparatorset [demosep] [demo->!,demo->?,demo->!,demo->?] [demo->@]
+%D \stoptyping
+%D
+%D Here the \type {!} and \type {?} are just the seperator characters that end
+%D up between part, chapter, section, etc.\ numbers. The third argument defines the
+%D default. When a separator is inserted, the \type{demo} processor will be applied.
+%D Here the number will be separated by red slightly bigger than normal bold
+%D exclamation marks and questionmarks
+%D
+%D Valid keys for defining a processor are \type {style}, \type {color}, \type {left},
+%D \type {right}, and \type {command} (the given command takes one argument).
+
+\unexpanded\def\defineprocessor
+ {\dodoubleargument\dodefineprocessor}
+
+\def\dodefineprocessor[#1][#2]%
+ {\ifsecondargument
+ \letbeundefined{\??po#1\c!command}%
+ \ctxlua{structure.processors.register("#1")}%
+ \getparameters[\??po#1][\c!style=,\c!color=,\c!left=,\c!right=,#2]%
+ \else
+ \letbeundefined{\??po#1\c!style}%
+ \ctxlua{structure.processors.reset("#1")}%
+ \fi}
+
+%D The following command can be used by users but normally it will be
+%D invoked behind the screens. After all, processor prefixes need to
+%D be split off first.
+
+\unexpanded\def\applyprocessor#1%
+ {\ifcsname\??po#1\c!style\endcsname
+ \expandafter\dodoapplyprocessor
+ \else
+ \expandafter\secondoftwoarguments
+ \fi{#1}}
+
+\def\dodoapplyprocessor#1#2%
+ {\begingroup
+ \dostartattributes{\??po#1}\c!style\c!color
+ \csname\??po#1\c!left\endcsname
+ \ifcsname\??po#1\c!command\endcsname
+ \csname\??po#1\c!command\endcsname{#2}%
+ \else
+ #2%
+ \fi
+ \csname\??po#1\c!right\endcsname
+ \dostopattributes
+ \endgroup}
+
+\protect \endinput
diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua
new file mode 100644
index 000000000..475ab318a
--- /dev/null
+++ b/tex/context/base/strc-ref.lua
@@ -0,0 +1,1243 @@
+if not modules then modules = { } end modules ['strc-ref'] = {
+ version = 1.001,
+ comment = "companion to strc-ref.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, find, gmatch, match, concat = string.format, string.find, string.gmatch, string.match, table.concat
+local lpegmatch = lpeg.match
+local texsprint, texwrite, texcount, texsetcount = tex.sprint, tex.write, tex.count, tex.setcount
+
+local trace_referencing = false trackers.register("structure.referencing", function(v) trace_referencing = v end)
+
+local ctxcatcodes = tex.ctxcatcodes
+local variables = interfaces.variables
+local constants = interfaces.constants
+
+-- 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
+
+-- the useddata and pagedata names might change
+-- todo: pack exported data
+
+jobreferences = jobreferences or { }
+jobreferences.tobesaved = jobreferences.tobesaved or { }
+jobreferences.collected = jobreferences.collected or { }
+jobreferences.defined = jobreferences.defined or { } -- indirect ones
+jobreferences.derived = jobreferences.derived or { } -- taken from lists
+jobreferences.specials = jobreferences.specials or { } -- system references
+jobreferences.runners = jobreferences.runners or { }
+jobreferences.internals = jobreferences.internals or { }
+jobreferences.exporters = jobreferences.exporters or { }
+jobreferences.imported = jobreferences.imported or { }
+
+storage.register("jobreferences/defined", jobreferences.defined, "jobreferences.defined")
+
+local tobesaved, collected = jobreferences.tobesaved, jobreferences.collected
+local defined, derived, specials = jobreferences.defined, jobreferences.derived, jobreferences.specials
+local exporters, runners = jobreferences.exporters, jobreferences.runners
+
+local currentreference = nil
+
+local initializers = { }
+local finalizers = { }
+
+function jobreferences.registerinitializer(func) -- we could use a token register instead
+ initializers[#initializers+1] = func
+end
+function jobreferences.registerfinalizer(func) -- we could use a token register instead
+ finalizers[#finalizers+1] = func
+end
+
+local function initializer()
+ tobesaved, collected = jobreferences.tobesaved, jobreferences.collected
+ for i=1,#initializers do
+ initializers[i](tobesaved,collected)
+ end
+end
+local function finalizer()
+ tobesaved = jobreferences.tobesaved
+ for i=1,#finalizers do
+ finalizers[i](tobesaved)
+ end
+end
+
+if job then
+ job.register('jobreferences.collected', jobreferences.tobesaved, initializer, finalizer)
+end
+
+-- todo: delay split till later as in destinations we split anyway
+
+local orders, lastorder = { }, 0
+
+local function setnextorder(kind,name)
+ lastorder = 0
+ if kind and name then
+ local ok = orders[kind]
+ if not ok then
+ ok = { }
+ orders[kind] = ok
+ end
+ lastorder = (ok[name] or 0) + 1
+ ok[name] = lastorder
+ end
+ texsetcount("global","locationorder",lastorder)
+end
+
+jobreferences.setnextorder = setnextorder
+
+function jobreferences.setnextinternal(kind,name)
+ setnextorder(kind,name) -- always incremented with internal
+ texsetcount("global","locationcount",texcount.locationcount + 1)
+end
+
+function jobreferences.currentorder(kind,name)
+ texwrite((orders[kind] and orders[kind][name]) or lastorder)
+end
+
+function jobreferences.set(kind,prefix,tag,data)
+ for ref in gmatch(tag,"[^,]+") do
+ local p, r = match(ref,"^(%-):(.-)$")
+ if p and r then
+ prefix, ref = p, r
+ else
+ prefix = ""
+ end
+ if ref ~= "" then
+ local pd = tobesaved[prefix]
+ if not pd then
+ pd = { }
+ tobesaved[prefix] = pd
+ end
+ pd[ref] = data
+ texsprint(ctxcatcodes,format("\\dofinish%sreference{%s}{%s}",kind,prefix,ref))
+ end
+ end
+end
+
+function jobreferences.setandgetattribute(kind,prefix,tag,data,view) -- maybe do internal automatically here
+ jobreferences.set(kind,prefix,tag,data)
+ texcount.lastdestinationattribute = jobreferences.setinternalreference(prefix,tag,nil,view) or -0x7FFFFFFF
+end
+
+function jobreferences.enhance(prefix,tag,spec)
+ local l = tobesaved[prefix][tag]
+ if l then
+ l.references.realpage = texcount.realpageno
+ end
+end
+
+-- this reference parser is just an lpeg version of the tex based one
+
+local result = { }
+
+local lparent, rparent, lbrace, rbrace, dcolon, backslash = lpeg.P("("), lpeg.P(")"), lpeg.P("{"), lpeg.P("}"), lpeg.P("::"), lpeg.P("\\")
+
+local reset = lpeg.P("") / function() result = { } end
+local b_token = backslash / function(s) result.has_tex = true return s end
+
+local o_token = 1 - rparent - rbrace - lparent - lbrace
+local a_token = 1 - rbrace
+local s_token = 1 - lparent - lbrace - lparent - lbrace
+local i_token = 1 - lparent - lbrace
+local f_token = 1 - lparent - lbrace - dcolon
+
+local outer = (f_token )^1 / function (s) result.outer = s end
+local operation = lpeg.Cs((b_token + o_token)^1) / function (s) result.operation = s end
+local arguments = lpeg.Cs((b_token + a_token)^0) / function (s) result.arguments = s end
+local special = (s_token )^1 / function (s) result.special = s end
+local inner = (i_token )^1 / function (s) result.inner = s end
+
+local outer_reference = (outer * dcolon)^0
+
+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) -- overloaded
+--~ return lpegmatch(scanner,str)
+--~ end
+
+function jobreferences.split(str)
+ return lpegmatch(scanner,str 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)")))
+
+-- -- -- related to strc-ini.lua -- -- --
+
+jobreferences.resolvers = jobreferences.resolvers or { }
+
+function jobreferences.resolvers.section(var)
+ local vi = structure.lists.collected[var.i[2]]
+ if vi then
+ var.i = vi
+ var.r = (vi.references and vi.references.realpage) or (vi.pagedata and vi.pagedata.realpage) or 1
+ else
+ var.i = nil
+ var.r = 1
+ end
+end
+
+jobreferences.resolvers.float = jobreferences.resolvers.section
+jobreferences.resolvers.description = jobreferences.resolvers.section
+jobreferences.resolvers.formula = jobreferences.resolvers.section
+jobreferences.resolvers.note = jobreferences.resolvers.section
+
+function jobreferences.resolvers.reference(var)
+ local vi = var.i[2]
+ if vi then
+ var.i = vi
+ var.r = (vi.references and vi.references.realpage) or (vi.pagedata and vi.pagedata.realpage) or 1
+ else
+ var.i = nil
+ var.r = 1
+ end
+end
+
+local function register_from_lists(collected,derived)
+ for i=1,#collected do
+ local entry = collected[i]
+ local m, r = entry.metadata, entry.references
+ if m and r then
+ local prefix, reference = r.referenceprefix or "", r.reference or ""
+ if reference ~= "" then
+ local kind, realpage = m.kind, r.realpage
+ if kind and realpage then
+ local d = derived[prefix] if not d then d = { } derived[prefix] = d end
+ local t = { kind, i }
+ for s in gmatch(reference,"%s*([^,]+)") do
+ if trace_referencing then
+ logs.report("referencing","list entry %s provides %s reference '%s' on realpage %s",i,kind,s,realpage)
+ end
+ d[s] = t -- share them
+ end
+ end
+ end
+ end
+ end
+end
+
+jobreferences.registerinitializer(function() register_from_lists(structure.lists.collected,derived) end)
+
+-- urls
+
+jobreferences.urls = jobreferences.urls or { }
+jobreferences.urls.data = jobreferences.urls.data or { }
+
+local urls = jobreferences.urls.data
+
+function jobreferences.urls.define(name,url,file,description)
+ if name and name ~= "" then
+ urls[name] = { url or "", file or "", description or url or file or ""}
+ end
+end
+
+function jobreferences.urls.get(name,method,space) -- method: none, before, after, both, space: yes/no
+ local u = urls[name]
+ if u then
+ local url, file = u[1], u[2]
+ if file and file ~= "" then
+ texsprint(ctxcatcodes,url,"/",file)
+ else
+ texsprint(ctxcatcodes,url)
+ end
+ end
+end
+
+function commands.doifurldefinedelse(name)
+ commands.doifelse(urls[name])
+end
+
+-- files
+
+jobreferences.files = jobreferences.files or { }
+jobreferences.files.data = jobreferences.files.data or { }
+
+local files = jobreferences.files.data
+
+function jobreferences.files.define(name,file,description)
+ if name and name ~= "" then
+ files[name] = { file or "", description or file or ""}
+ end
+end
+
+function jobreferences.files.get(name,method,space) -- method: none, before, after, both, space: yes/no
+ local f = files[name]
+ if f then
+ texsprint(ctxcatcodes,f[1])
+ end
+end
+
+function commands.doiffiledefinedelse(name)
+ commands.doifelse(files[name])
+end
+
+-- helpers
+
+function jobreferences.checkedfile(whatever) -- return whatever if not resolved
+ if whatever then
+ local w = files[whatever]
+ if w then
+ return w[1]
+ else
+ return whatever
+ end
+ end
+end
+
+function jobreferences.checkedurl(whatever) -- return whatever if not resolved
+ if whatever then
+ local w = urls[whatever]
+ if w then
+ local u, f = w[1], w[2]
+ if f and f ~= "" then
+ return u .. "/" .. f
+ else
+ return u
+ end
+ else
+ return whatever
+ end
+ end
+end
+
+function jobreferences.checkedfileorurl(whatever,default) -- return nil, nil if not resolved
+ if whatever then
+ local w = files[whatever]
+ if w then
+ return w[1], nil
+ else
+ local w = urls[whatever]
+ if w then
+ local u, f = w[1], w[2]
+ if f and f ~= "" then
+ return nil, u .. "/" .. f
+ else
+ return nil, u
+ end
+ end
+ end
+ end
+ return default
+end
+
+-- programs
+
+jobreferences.programs = jobreferences.programs or { }
+jobreferences.programs.data = jobreferences.programs.data or { }
+
+local programs = jobreferences.programs.data
+
+function jobreferences.programs.define(name,file,description)
+ if name and name ~= "" then
+ programs[name] = { file or "", description or file or ""}
+ end
+end
+
+function jobreferences.programs.get(name)
+ local f = programs[name]
+ if f then
+ texsprint(ctxcatcodes,f[1])
+ end
+end
+
+function jobreferences.checkedprogram(whatever) -- return whatever if not resolved
+ if whatever then
+ local w = programs[whatever]
+ if w then
+ return w[1]
+ else
+ return whatever
+ end
+ end
+end
+
+-- shared by urls and files
+
+function jobreferences.whatfrom(name)
+ texsprint(ctxcatcodes,(urls[name] and variables.url) or (files[name] and variables.file) or variables.unknown)
+end
+
+--~ function jobreferences.from(name)
+--~ local u = urls[name]
+--~ if u then
+--~ local url, file, description = u[1], u[2], u[3]
+--~ if description ~= "" then
+--~ texsprint(ctxcatcodes,format("\\dofromurldescription{%s}",description))
+--~ -- ok
+--~ elseif file and file ~= "" then
+--~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url .. "/" .. file))
+--~ else
+--~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url))
+--~ end
+--~ else
+--~ local f = files[name]
+--~ if f then
+--~ local description, file = f[1], f[2]
+--~ if description ~= "" then
+--~ texsprint(ctxcatcodes,format("\\dofromfiledescription{%s}",description))
+--~ else
+--~ texsprint(ctxcatcodes,format("\\dofromfileliteral{%s}",file))
+--~ end
+--~ end
+--~ end
+--~ end
+
+function jobreferences.from(name)
+ local u = urls[name]
+ if u then
+ local url, file, description = u[1], u[2], u[3]
+ if description ~= "" then
+ context.dofromurldescription(description)
+ -- ok
+ elseif file and file ~= "" then
+ context.dofromurlliteral(url .. "/" .. file)
+ else
+ context.dofromurlliteral(url)
+ end
+ else
+ local f = files[name]
+ if f then
+ local description, file = f[1], f[2]
+ if description ~= "" then
+ context.dofromfiledescription(description)
+ else
+ context.dofromfileliteral(file)
+ end
+ end
+ end
+end
+
+-- export
+
+exporters.references = exporters.references or { }
+exporters.lists = exporters.lists or { }
+
+function exporters.references.generic(data)
+ local useddata = {}
+ local entries, userdata = data.entries, data.userdata
+ if entries then
+ for k, v in next, entries do
+ useddata[k] = v
+ end
+ end
+ if userdata then
+ for k, v in next, userdata do
+ useddata[k] = v
+ end
+ end
+ return useddata
+end
+
+function exporters.lists.generic(data)
+ local useddata = { }
+ local titledata, numberdata = data.titledata, data.numberdata
+ if titledata then
+ useddata.title = titledata.title
+ end
+ if numberdata then
+ local numbers = numberdata.numbers
+ local t = { }
+ for i=1,#numbers do
+ local n = numbers[i]
+ if n ~= 0 then
+ t[#t+1] = n
+ end
+ end
+ useddata.number = concat(t,".")
+ end
+ return useddata
+end
+
+local function referencer(data)
+ local references = data.references
+ local realpage = references.realpage
+ local numberdata = jobpages.tobesaved[realpage]
+ local specification = numberdata.specification
+ return {
+ realpage = references.realpage,
+ number = numberdata.number,
+ conversion = specification.conversion,
+ -- prefix = only makes sense when bywhatever
+ }
+end
+
+function jobreferences.export(usedname)
+ local exported = { }
+ local e_references, e_lists = exporters.references, exporters.lists
+ local g_references, g_lists = e_references.generic, e_lists.generic
+ -- todo: pagenumbers
+ -- todo: some packing
+ for prefix, references in next, jobreferences.tobesaved do
+ local pe = exported[prefix] if not pe then pe = { } exported[prefix] = pe end
+ for key, data in next, references do
+ local metadata = data.metadata
+ local exporter = e_references[metadata.kind] or g_references
+ if exporter then
+ pe[key] = {
+ metadata = {
+ kind = metadata.kind,
+ catcodes = metadata.catcodes,
+ coding = metadata.coding, -- we can omit "tex"
+ },
+ useddata = exporter(data),
+ pagedata = referencer(data),
+ }
+ end
+ end
+ end
+ local pe = exported[""] if not pe then pe = { } exported[""] = pe end
+ for n, data in next, structure.lists.tobesaved do
+ local metadata = data.metadata
+ local exporter = e_lists[metadata.kind] or g_lists
+ if exporter then
+ local result = {
+ metadata = {
+ kind = metadata.kind,
+ catcodes = metadata.catcodes,
+ coding = metadata.coding, -- we can omit "tex"
+ },
+ useddata = exporter(data),
+ pagedata = referencer(data),
+ }
+ for key in gmatch(data.references.reference,"[^,]+") do
+ pe[key] = result
+ end
+ end
+ end
+ local e = {
+ references = exported,
+ version = 1.00,
+ }
+ io.savedata(file.replacesuffix(usedname or tex.jobname,"tue"),table.serialize(e,true))
+end
+
+function jobreferences.import(usedname)
+ if usedname then
+ local imported = jobreferences.imported
+ local jdn = imported[usedname]
+ if not jdn then
+ local filename = files[usedname]
+ if filename then -- only registered files
+ filename = filename[1]
+ else
+ filename = usedname
+ end
+ local data = io.loaddata(file.replacesuffix(filename,"tue")) or ""
+ if data == "" then
+ interfaces.showmessage("references",24,filename)
+ data = nil
+ else
+ data = loadstring(data)
+ if data then
+ data = data()
+ end
+ if data then
+ -- version check
+ end
+ if not data then
+ interfaces.showmessage("references",25,filename)
+ end
+ end
+ if data then
+ interfaces.showmessage("references",26,filename)
+ jdn = data
+ jdn.filename = filename
+ else
+ jdn = { filename = filename, references = { }, version = 1.00 }
+ end
+ imported[usedname] = jdn
+ imported[filename] = jdn
+ end
+ return jdn
+ else
+ return nil
+ end
+end
+
+function jobreferences.load(usedname)
+ -- gone
+end
+
+function jobreferences.define(prefix,reference,list)
+ local d = defined[prefix] if not d then d = { } defined[prefix] = d end
+ d[reference] = { "defined", list }
+end
+
+--~ function jobreferences.registerspecial(name,action,...)
+--~ specials[name] = { action, ... }
+--~ end
+
+function jobreferences.reset(prefix,reference)
+ local d = defined[prefix]
+ if d then
+ d[reference] = nil
+ end
+end
+
+-- \primaryreferencefoundaction
+-- \secondaryreferencefoundaction
+-- \referenceunknownaction
+
+-- t.special t.operation t.arguments t.outer t.inner
+
+local settings_to_array = aux.settings_to_array
+
+local function resolve(prefix,reference,args,set) -- we start with prefix,reference
+ texcount.referencehastexstate = 0
+ if reference and reference ~= "" then
+ set = set or { }
+ local r = settings_to_array(reference)
+ for i=1,#r do
+ local ri = r[i]
+ local dp = defined[prefix] or defined[""]
+ local d = dp[ri]
+ if d then
+ resolve(prefix,d[2],nil,set)
+ else
+ local var = lpegmatch(scanner,ri)
+ if var then
+ var.reference = ri
+ if not var.outer and var.inner then
+ local d = defined[prefix][var.inner] or defined[""][var.inner]
+ if d then
+ resolve(prefix,d[2],var.arguments,set) -- args can be nil
+ else
+ if args then var.arguments = args end
+ set[#set+1] = var
+ end
+ else
+ if args then var.arguments = args end
+ set[#set+1] = var
+ end
+ if var.has_tex then
+ set.has_tex = true
+ end
+ else
+ -- logs.report("references","funny pattern: %s",ri or "?")
+ end
+ end
+ end
+ if set.has_tex then
+ texcount.referencehastexstate = 1
+ end
+ return set
+ else
+ return { }
+ end
+end
+
+-- prefix == "" is valid prefix which saves multistep lookup
+
+jobreferences.currentset = nil
+
+local b, e = "\\ctxlua{local jc = jobreferences.currentset;", "}"
+local o, a = 'jc[%s].operation=[[%s]];', 'jc[%s].arguments=[[%s]];'
+
+function jobreferences.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex
+ local currentset = jobreferences.currentset
+ if currentset and currentset.has_tex then
+ local done = false
+ for i=1,#currentset do
+ local ci = currentset[i]
+ local operation = ci.operation
+ if operation then
+ if find(operation,"\\") then -- if o_has_tex then
+ if not done then
+ texsprint(ctxcatcodes,b)
+ done = true
+ end
+ texsprint(ctxcatcodes,format(o,i,operation))
+ end
+ end
+ local arguments = ci.arguments
+ if arguments then
+ if find(arguments,"\\") then -- if a_has_tex then
+ if not done then
+ texsprint(ctxcatcodes,b)
+ done = true
+ end
+ texsprint(ctxcatcodes,format(a,i,arguments))
+ end
+ end
+ end
+ if done then
+ texsprint(ctxcatcodes,e)
+ end
+ end
+end
+
+--~ local uo = urls[outer]
+--~ if uo then
+--~ special, operation, argument = "url", uo[1], inner or uo[2] -- maybe more is needed
+--~ else
+--~ local fo = files[outer]
+--~ if fo then
+--~ special, operation, argument = "file", fo[1], inner -- maybe more is needed
+--~ end
+--~ end
+
+local function identify(prefix,reference)
+ local set = resolve(prefix,reference)
+ local bug = false
+ for i=1,#set do
+ local var = set[i]
+ local special, inner, outer, arguments, operation = var.special, var.inner, var.outer, var.arguments, var.operation
+ if special then
+ local s = specials[special]
+ if s then
+ if outer then
+ if operation then
+ -- special(outer::operation)
+ var.kind = "special outer with operation"
+ else
+ -- special()
+ var.kind = "special outer"
+ end
+ var.f = outer
+ elseif operation then
+ if arguments then
+ -- special(operation{argument,argument})
+ var.kind = "special operation with arguments"
+ else
+ -- special(operation)
+ var.kind = "special operation"
+ end
+ else
+ -- special()
+ var.kind = "special"
+ end
+ else
+ var.error = "unknown special"
+ end
+ elseif outer then
+ local e = jobreferences.import(outer)
+ if e then
+ if inner then
+ local r = e.references
+ if r then
+ r = r[prefix]
+ if r then
+ r = r[inner]
+ if r then
+ if arguments then
+ -- outer::inner{argument}
+ var.kind = "outer with inner with arguments"
+ else
+ -- outer::inner
+ var.kind = "outer with inner"
+ end
+ var.i = { "reference", r }
+ jobreferences.resolvers.reference(var)
+ var.f = outer
+ var.e = true -- external
+ end
+ end
+ end
+ if not r then
+ r = e.derived
+ if r then
+ r = r[prefix]
+ if r then
+ r = r[inner]
+ if r then
+ -- outer::inner
+ if arguments then
+ -- outer::inner{argument}
+ var.kind = "outer with inner with arguments"
+ else
+ -- outer::inner
+ var.kind = "outer with inner"
+ end
+ var.i = r
+ jobreferences.resolvers[r[1]](var)
+ var.f = outer
+ end
+ end
+ end
+ end
+ if not r then
+ var.error = "unknown outer"
+ end
+ elseif special then
+ local s = specials[special]
+ if s then
+ if operation then
+ if arguments then
+ -- outer::special(operation{argument,argument})
+ var.kind = "outer with special and operation and arguments"
+ else
+ -- outer::special(operation)
+ var.kind = "outer with special and operation"
+ end
+ else
+ -- outer::special()
+ var.kind = "outer with special"
+ end
+ var.f = outer
+ else
+ var.error = "unknown outer with special"
+ end
+ else
+ -- outer::
+ var.kind = "outer"
+ var.f = outer
+ end
+ else
+ if inner then
+ if arguments then
+ -- outer::inner{argument}
+ var.kind = "outer with inner with arguments"
+ else
+ -- outer::inner
+ var.kind = "outer with inner"
+ end
+ var.i = { "reference", inner }
+ jobreferences.resolvers.reference(var)
+ var.f = outer
+ elseif special then
+ local s = specials[special]
+ if s then
+ if operation then
+ if arguments then
+ -- outer::special(operation{argument,argument})
+ var.kind = "outer with special and operation and arguments"
+ else
+ -- outer::special(operation)
+ var.kind = "outer with special and operation"
+ end
+ else
+ -- outer::special()
+ var.kind = "outer with special"
+ end
+ var.f = outer
+ else
+ var.error = "unknown outer with special"
+ end
+ else
+ -- outer::
+ var.kind = "outer"
+ var.f = outer
+ end
+ end
+ else
+ if arguments then
+ local s = specials[inner]
+ if s then
+ -- inner{argument}
+ var.kind = "special with arguments"
+ else
+ var.error = "unknown inner or special"
+ end
+ else
+ -- inner
+--~ local i = tobesaved[prefix]
+ local i = collected[prefix]
+ i = i and i[inner]
+ if i then
+ var.i = { "reference", i }
+ jobreferences.resolvers.reference(var)
+ var.kind = "inner"
+ var.p = prefix
+ else
+ i = derived[prefix]
+ i = i and i[inner]
+ if i then
+ var.kind = "inner"
+ var.i = i
+ jobreferences.resolvers[i[1]](var)
+ var.p = prefix
+ else
+ i = collected[prefix]
+ i = i and i[inner]
+ if i then
+ var.kind = "inner"
+ var.i = { "reference", i }
+ jobreferences.resolvers.reference(var)
+ var.p = prefix
+ else
+ local s = specials[inner]
+ if s then
+ var.kind = "special"
+ else
+ i = (collected[""] and collected[""][inner]) or
+ (derived [""] and derived [""][inner]) or
+ (tobesaved[""] and tobesaved[""][inner])
+ if i then
+ var.kind = "inner"
+ var.i = { "reference", i }
+ jobreferences.resolvers.reference(var)
+ var.p = ""
+ else
+ var.error = "unknown inner or special"
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ bug = bug or var.error
+ set[i] = var
+ end
+ jobreferences.currentset = set
+-- print(bug,table.serialize(set))
+ return set, bug
+end
+
+jobreferences.identify = identify
+
+function jobreferences.doifelse(prefix,reference,highlight,newwindow,layer)
+ local set, bug = identify(prefix,reference)
+ local unknown = bug or #set == 0
+ if unknown then
+ currentreference = nil -- will go away
+ else
+ set.highlight, set.newwindow,set.layer = highlight, newwindow, layer
+ currentreference = set[1]
+ end
+ -- we can do the expansion here which saves a call
+ commands.doifelse(not unknown)
+end
+
+function jobreferences.setinternalreference(prefix,tag,internal,view)
+ local t = { }
+ if tag then
+ if prefix and prefix ~= "" then
+ prefix = prefix .. ":"
+ for ref in gmatch(tag,"[^,]+") do
+ t[#t+1] = prefix .. ref
+ end
+ else
+ for ref in gmatch(tag,"[^,]+") do
+ t[#t+1] = ref
+ end
+ end
+ end
+ if internal then
+ t[#t+1] = "aut:" .. internal
+ end
+ local destination = jobreferences.mark(t,nil,nil,view) -- returns an attribute
+ texcount.lastdestinationattribute = destination
+ return destination
+end
+
+function jobreferences.getinternalreference(n) -- n points into list
+ local l = structure.lists.collected[n]
+ texsprint(ctxcatcodes,(l and l.references.internal) or n)
+end
+
+
+--
+
+function jobreferences.get_current_metadata(tag)
+ local data = currentreference and currentreference.i
+ data = data and data.metadata and data.metadata[tag]
+ if data then
+ texsprint(ctxcatcodes,data)
+ end
+end
+local function current_metadata(tag)
+ local data = currentreference and currentreference.i
+ return data and data.metadata and data.metadata[tag]
+end
+jobreferences.current_metadata = current_metadata
+
+function jobreferences.get_current_prefixspec(default) -- todo: message
+ texsprint(ctxcatcodes,"\\getreferencestructureprefix{",
+ current_metadata("kind") or "?", "}{", current_metadata("name") or "?", "}{", default or "?", "}")
+end
+
+--~ function jobreferences.get_current_prefixspec(default) -- we can consider storing the data at the lua end
+--~ context.getreferencestructureprefix(current_metadata("kind"),current_metadata("name"),default)
+--~ end
+
+--
+
+jobreferences.filters = jobreferences.filters or { }
+
+local filters = jobreferences.filters
+local helpers = structure.helpers
+local sections = structure.sections
+
+function jobreferences.filter(name,...) -- number page title ...
+ local data = currentreference and currentreference.i
+ if data then
+ local kind = data.metadata and data.metadata.kind
+ if kind then
+ local filter = filters[kind] or filters.generic
+ filter = filter and (filter[name] or filter.unknown or filters.generic[name] or filters.generic.unknown)
+ if filter then
+ if trace_referencing then
+ logs.report("referencing","name '%s', kind '%s', using dedicated filter",name,kind)
+ end
+ filter(data,name,...)
+ elseif trace_referencing then
+ logs.report("referencing","name '%s', kind '%s', using generic filter",name,kind)
+ end
+ elseif trace_referencing then
+ logs.report("referencing","name '%s', unknown kind",name)
+ end
+ elseif trace_referencing then
+ logs.report("referencing","name '%s', no reference",name)
+ end
+end
+
+filters.generic = { }
+
+function filters.generic.title(data)
+ if data then
+ local titledata = data.titledata or data.useddata
+ if titledata then
+ helpers.title(titledata.title or "?",data.metadata)
+ end
+ end
+end
+
+function filters.generic.text(data)
+ if data then
+ local entries = data.entries or data.useddata
+ if entries then
+ helpers.title(entries.text or "?",data.metadata)
+ end
+ end
+end
+
+function filters.generic.number(data,what,prefixspec) -- todo: spec and then no stopper
+ if data then
+ local numberdata = data.numberdata
+ if numberdata then
+--~ print(table.serialize(prefixspec))
+ helpers.prefix(data,prefixspec)
+ sections.typesetnumber(numberdata,"number",numberdata)
+ else
+ local useddata = data.useddata
+ if useddata and useddsta.number then
+ tex.sprint(tex.ctxcatcodes,useddata.number)
+ end
+ end
+ end
+end
+
+filters.generic.default = filters.generic.text
+
+function filters.generic.page(data,prefixspec,pagespec)
+ local pagedata = data.pagedata
+ if pagedata then -- imported
+ local number, conversion = pagedata.number, pagedata.conversion
+ if not number then
+ -- error
+ elseif conversion then
+ tex.sprint(tex.ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
+ else
+ tex.sprint(tex.ctxcatcodes,number)
+ end
+ else
+ helpers.prefixpage(data,prefixspec,pagespec)
+ end
+end
+
+filters.user = { }
+
+function filters.user.unknown(data,name)
+ if data then
+ local userdata = data.userdata
+ local userkind = userdata and userdata.kind
+ if userkind then
+ local filter = filters[userkind] or filters.generic
+ filter = filter and (filter[name] or filter.unknown)
+ if filter then
+ filter(data,name)
+ return
+ end
+ end
+ local namedata = userdata and userdata[name]
+ if namedata then
+ texsprint(ctxcatcodes,namedata)
+ end
+ end
+end
+
+filters.text = { }
+
+function filters.text.title(data)
+-- texsprint(ctxcatcodes,"[text title]")
+ helpers.title(data.entries.text or "?",data.metadata)
+end
+
+function filters.text.number(data)
+-- texsprint(ctxcatcodes,"[text number]")
+ helpers.title(data.entries.text or "?",data.metadata)
+end
+
+function filters.text.page(data,prefixspec,pagespec)
+ helpers.prefixpage(data,prefixspec,pagespec)
+end
+
+filters.section = { }
+
+function filters.section.number(data,what,prefixspec)
+ if data then
+ local numberdata = data.numberdata
+ if numberdata then
+ sections.typesetnumber(numberdata,"number",prefixspec,numberdata)
+ else
+ local useddata = data.useddata
+ if useddata and useddata.number then
+ tex.sprint(tex.ctxcatcodes,useddata.number)
+ end
+ end
+ end
+end
+
+filters.section.title = filters.generic.title
+filters.section.page = filters.generic.page
+filters.section.default = filters.section.number
+
+filters.note = { default = filters.generic.number }
+filters.formula = { default = filters.generic.number }
+filters.float = { default = filters.generic.number }
+filters.description = { default = filters.generic.number }
+filters.item = { default = filters.generic.number }
+
+structure.references = structure.references or { }
+structure.helpers = structure.helpers or { }
+
+local references = structure.references
+local helpers = structure.helpers
+
+function references.sectiontitle(n)
+ helpers.sectiontitle(lists.collected[tonumber(n) or 0])
+end
+
+function references.sectionnumber(n)
+ helpers.sectionnumber(lists.collected[tonumber(n) or 0])
+end
+
+function references.sectionpage(n,prefixspec,pagespec)
+ helpers.prefixedpage(lists.collected[tonumber(n) or 0],prefixspec,pagespec)
+end
+
+-- analyse
+
+jobreferences.testrunners = jobreferences.testrunners or { }
+jobreferences.testspecials = jobreferences.testspecials or { }
+
+local runners = jobreferences.testrunners
+local specials = jobreferences.testspecials
+
+function jobreferences.analyse(actions)
+ actions = actions or jobreferences.currentset
+ if not actions then
+ actions = { realpage = 0 }
+ elseif actions.realpage then
+ -- already analysed
+ else
+ -- we store some analysis data alongside the indexed array
+ -- at this moment only the real reference page is analysed
+ -- normally such an analysis happens in the backend code
+ texcount.referencepagestate = 0
+ local nofactions = #actions
+ if nofactions > 0 then
+ for i=1,nofactions do
+ local a = actions[i]
+ local what = runners[a.kind]
+ if what then
+ what = what(a,actions)
+ end
+ end
+ local realpage, p = texcount.realpageno, tonumber(actions.realpage)
+ if not p then
+ -- sorry
+ elseif p > realpage then
+ texcount.referencepagestate = 3
+ elseif p < realpage then
+ texcount.referencepagestate = 2
+ else
+ texcount.referencepagestate = 1
+ end
+ end
+ end
+ return actions
+end
+
+function jobreferences.realpage() -- special case, we always want result
+ local cs = jobreferences.analyse()
+ texwrite(cs.realpage or 0)
+end
+
+--
+
+jobreferences.pages = {
+ [variables.firstpage] = function() return structure.counters.record("realpage")["first"] end,
+ [variables.previouspage] = function() return structure.counters.record("realpage")["previous"] end,
+ [variables.nextpage] = function() return structure.counters.record("realpage")["next"] end,
+ [variables.lastpage] = function() return structure.counters.record("realpage")["last"] end,
+
+ [variables.firstsubpage] = function() return structure.counters.record("subpage" )["first"] end,
+ [variables.previoussubpage] = function() return structure.counters.record("subpage" )["previous"] end,
+ [variables.nextsubpage] = function() return structure.counters.record("subpage" )["next"] end,
+ [variables.lastsubpage] = function() return structure.counters.record("subpage" )["last"] end,
+
+ [variables.forward] = function() return structure.counters.record("realpage")["forward"] end,
+ [variables.backward] = function() return structure.counters.record("realpage")["backward"] end,
+}
+
+-- maybe some day i will merge this in the backend code with a testmode (so each
+-- runner then implements a branch)
+
+runners["inner"] = function(var,actions)
+ local r = var.r
+ if r then
+ actions.realpage = r
+ end
+end
+
+runners["special"] = function(var,actions)
+ local handler = specials[var.special]
+ return handler and handler(var,actions)
+end
+
+runners["special operation"] = runners["special"]
+runners["special operation with arguments"] = runners["special"]
+
+local pages = jobreferences.pages
+
+function specials.internal(var,actions)
+ local v = jobreferences.internals[tonumber(var.operation)]
+ local r = v and v.references.realpage
+ if r then
+ actions.realpage = r
+ end
+end
+
+specials.i = specials.internal
+
+function specials.page(var,actions) -- is this ok?
+ local p = pages[var.operation]
+ if type(p) == "function" then
+ p = p()
+ end
+ if p then
+ actions.realpage = p
+ end
+end
diff --git a/tex/context/base/strc-ref.mkii b/tex/context/base/strc-ref.mkii
new file mode 100644
index 000000000..1df5d09d8
--- /dev/null
+++ b/tex/context/base/strc-ref.mkii
@@ -0,0 +1,3041 @@
+%D \module
+%D [ file=strc-ref,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Structure 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.
+
+% we will merge mkii code back in here
+
+\writestatus{loading}{ConTeXt Structure Macros / Cross Referencing}
+
+% todo : unknown/illegal reference no arg
+% todo : +n pages check on 'samepage' (contrastcolor)
+
+% Makes more sense to build action data first, especially now
+% openaction etc are supported.
+%
+% \definespecial\doexecuteactionchain w h
+% \definespecial\dosetgotolocation
+% \definespecial\dosetexecuteJScode
+% ...
+%
+% complication: what when direct? Two calls!
+
+% I considered to change / simplify
+%
+% rt!page -> \definereference
+% rt!list -> \definereference
+% rt!exec -> \definereference
+%
+% but for the moment will not do so, if only because
+% the current implementation permits us to determine
+% the page state and is also more efficient
+
+% the code is rather fuzzy (and will be redone some day); this is
+% due to the chaining (collect secondary and then hook that into
+% the primary etc
+
+\unprotect
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+% messages moved
+
+%D This module deals with referencing. In \CONTEXT\ referencing
+%D is one of the core features, although at a first glance
+%D probably nobody will notice. This is good, because
+%D referencing should be as hidden as possible.
+%D
+%D In paper documents, referencing comes down to cross
+%D referencing, but in their interactive counterparts, is also
+%D involves navigation. Many features implemented here are
+%D therefore closely related to navigation.
+%D
+%D Many \CONTEXT\ commands can optionally be fed with a
+%D reference. Such a reference, when called upon, returns the
+%D number of a figure, table, chapter etc, a piece of text, or
+%D a pagenumber.
+%D
+%D There are three ways of defining a reference:
+%D
+%D \starttyping
+%D \pagereference[here]
+%D \textreference[here]{some text}
+%D \stoptyping
+%D
+%D the third alternative combines them in:
+%D
+%D \starttyping
+%D \reference[here]{some text}
+%D \stoptyping
+
+\def\textreference {\dosingleargument\dotextreference}
+\def\pagereference {\dosingleargument\dopagereference}
+\def\reference {\dosingleargument\doreference }
+
+%D These are implemented in a low level form as:
+%D
+%D \starttyping
+%D \def\dotextreference[#1]{\rawtextreference\s!txt{#1}} % #2
+%D \def\dopagereference[#1]{\rawpagereference\s!pag{#1}}
+%D \def\doreference [#1]{\rawreference \s!ref{#1}} % #2
+%D \stoptyping
+%D
+%D or without expansion problems:
+
+\def\dotextreference[#1]#2%
+ {\bgroup
+ \def\asciia{#1}%
+ \defconvertexpanded\asciib\@@rfexpansion{#2}%
+ \@EA\rawtextreference\@EA\s!txt\@EA\asciia\@EA{\asciib}%
+ \egroup}
+
+\def\dopagereference[#1]%
+ {\rawpagereference\s!pag{#1}}
+
+\def\doreference[#1]#2%
+ {\bgroup
+ \def\asciia{#1}%
+ \defconvertexpanded\asciib\@@rfexpansion{#2}%
+ \@EA\rawreference\@EA\s!ref\@EA\asciia\@EA{\asciib}%
+ \egroup}
+
+%D Actually there is not much difference between a text and a
+%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}
+
+\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.
+
+%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
+%D reference.
+
+%D \macros
+%D {everyreference}
+%D
+%D For rather tricky purposes, one can assign sanitizing
+%D macros to \type{\everyreference}.
+
+\newevery \everyreference \relax
+
+%D This is really needed, since for instance Polish has a
+%D different alphabet and needs accented entries in registers.
+
+\appendtoks
+ \cleanupfeatures
+\to \everyreference
+
+%D Why do we have to write down references? \TEX, and therefore
+%D \CONTEXT\ is a batch processing system. During the
+%D typesetting process, pages are shipped out, which means that
+%D especially forward references are not yet known when the
+%D page is typeset. That's why we always need a second (and
+%D sometimes even a third) pass to get the cross references
+%D right. The same goes for lists and other pagenumber
+%D dependant data.
+%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: (for mkii)
+%D
+%D \starttyping
+%D \mainreference{prefix}{reference}{page}{realpage}{text}
+%D \stoptyping
+%D
+%D We did not yet discuss prefixing. Especially in interactive
+%D documents, it's not always easy to keep track of duplicate
+%D references. The prefix mechanism, which we will describe
+%D later on, solves this problem. By (automatically) adding a
+%D prefix one keeps references local, but the global ones in
+%D view. To enable this feature, we explictly split the prefix
+%D from the reference.
+%D
+%D A former implementation used \type{\removesubstring} to get
+%D rid of the don't||use||a||prefix signal (\type{-:}), but the
+%D next one proved to be more than twice as fast.
+
+\let\referenceprefix=\empty
+\let\lastreference =\empty
+
+%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
+%D appropriate meaning and loading the utility file.
+
+%D For a long time the only way to access an external file was
+%D to use the file prefix (\type {somefile::}. However, when
+%D you split up a document, redefining the references may be
+%D such a pain, that another approach is feasible. By setting
+%D the \type {autofile} variable to \type {yes} or \type
+%D {page}, you can access the reference directly. The latter
+%D case nills the prefix method, thereby saving some memory.
+%D
+%D \starttabulate[||||]
+%D \NC filename::tag \NC page(filename::pnum) \NC tag \NC\NR
+%D \NC $\star$ \NC \NC \NC\NR
+%D \NC $\star$ \NC $\star$ \NC $\star$ \NC\NR
+%D \NC \NC $\star$ \NC \NC\NR
+%D \stoptabulate
+
+\chardef\autocrossfilereferences=0
+
+\def\setreferences% some day, filename will be stored in ref record
+ {\the\everyreference % we're grouped anyway
+ \def\mainreference##1##2##3##4##5% can be made faster by indirect calls
+ {\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\resetreferences
+ {\let\mainreference\gobblefivearguments}
+
+\resetreferences
+
+%D Here we see another kind of prefix surface: \type
+%D {\fileprefix}. This prefix enables us to use references from
+%D different files in one document. This is no really useful in
+%D paper documents, but many interactive ones cannot do
+%D without.
+
+\let\fileprefix=\empty
+
+%D Loading references is done using the normal utility file
+%D handling macros. The \type{\hbox} trick prevents spaces
+%D creeping in (references are set globally anyway).
+
+\newtoks\everycheckreferences
+
+%D When we load references, the file name is stored in a
+%D list.
+
+\let\loadedreferences\empty
+
+%D We only load references ones.
+
+\newconditional\jobreferencesloaded
+
+%D This token list is expanded after the references are loaded.
+%D This hook can be used to initialize mechanisms that depend
+%D on the reference mechsnism. An example can be found in the
+%D field module.
+
+\def\checkreferences
+ {\bgroup
+ \let\fileprefix\empty
+ \global\let\checkreferences\relax
+ \usereferences[\jobname]%
+ \checkrealpage
+ \egroup
+ \the\everycheckreferences}
+
+\def\usereferences[#1]%
+ {\startnointerference
+ \checkreferences
+ \doifparentfileelse{#1}
+ {\ifconditional\jobreferencesloaded\else
+ \doutilities{references}{#1}\empty\relax\relax
+ \global\settrue\jobreferencesloaded
+ \fi}
+ {\ExpandBothAfter\doifnotinset{#1}{\loadedreferences}
+ {\doutilities{references}{#1}\empty\relax\relax
+ \ifx\fileprefix\empty\else
+ \doglobal\addtocommalist{#1}\loadedreferences
+ \fi}}
+ \stopnointerference}
+
+%D As mentioned we will also use the cross reference mechanism
+%D for navigational purposes. The main reason for this is that
+%D we want to treat both categories alike:
+%D
+%D \starttyping
+%D \goto{go back}[PreviousJump]
+%D \goto{colofon}[colofon page]
+%D \stoptyping
+%D
+%D Here \type{PreviousJump} is handled by the viewer, while the
+%D \type{colofon page} reference is, apart from hyperlinking, a
+%D rather normal reference.
+%D
+%D We already saw that cross refences are written to and read
+%D from a file. The pure navigational ones don't need to be
+%D written to file, but both for fast processing and
+%D transparant integration, they are saved internally as a sort
+%D of reference. We can easily distinguish such system
+%D references from real cross reference ones by their tag:
+
+\chardef\rt!cross=0 % even means possible page reference
+\chardef\rt!done =1
+\chardef\rt!page =2 % and is used in \checkrealreferencepage
+\chardef\rt!exec =3
+\chardef\rt!list =4 % to determine the page state
+
+%D We also use the odd/even characteristic to determine the
+%D page state.
+
+%D Here the \type{\rt!exec} tags a viewer specific navigational
+%D reference, while for instance \type{\rt!page} gives fast
+%D access to for instance the previous or next page. The
+%D counter serves a purpose to be explained later. We use a
+%D token register to prevent expansion of the text component,
+%D which can contain all kind of \TEX\ commands.
+
+\newcount\crossreferenceorder
+
+% these are used often so we sped them up
+
+\def\setlocalcrossreference#1#2#3#4%
+ {\scratchtoks{#4}%
+ \@EA\edef\csname\r!cross\fileprefix#1\endcsname
+ {\rt!cross{#2}{#3}{\the\scratchtoks}{0}}}
+
+\def\setglobalcrossreference#1#2#3#4%
+ {\scratchtoks{#4}%
+ \global\advance\crossreferenceorder \plusone
+ \@EA\xdef\csname\r!cross\fileprefix#1\endcsname
+ {\rt!cross{#2}{#3}{\the\scratchtoks}{\the\crossreferenceorder}}}
+
+\def\setlocalsystemreference#1#2#3%
+ {\@EA\edef\csname\r!cross\fileprefix#2\endcsname{#1{#3}}}
+
+\def\setglobalsystemreference#1#2#3%
+ {\@EA\xdef\csname\r!cross\fileprefix#2\endcsname{#1{#3}}}
+
+\def\copycrossreference#1#2#3% file from to / slow
+ {\bgroup
+ \doifelse{#1}{}
+ {\let\fileprefix\empty}
+ {\def\fileprefix{#1::}}%
+ \def\rt!cross##1##2##3##4%
+ {\setxvalue{\r!cross\fileprefix#3}%
+ {\noexpand\rt!cross{##1}{##2}{##3}{##4}}}%
+ \getvalue{\r!cross\fileprefix#2}%
+ \egroup}
+
+%D References from other files are defined globally without
+%D ordering data. The first definition, the one without
+%D \type{#1}, is used as a signal that references are defined.
+
+\def\setoutercrossreference#1#2#3#4%
+ {\toks0={#4}%
+ \@EA\xdef\csname\r!cross\fileprefix \endcsname{\rt!cross{}{}{1}{0}}%
+ \@EA\xdef\csname\r!cross\fileprefix#1\endcsname{\rt!cross{#2}{#3}{\the\toks0}{0}}}
+
+%D In practice accessing a reference comes down to:
+%D
+%D \startitemize[packed]
+%D \item checking the validity
+%D \item determining the type
+%D \item filtering the content
+%D \stopitemize
+%D
+%D We'll deal with the last two steps first. References are
+%D saved in the general format:
+%D
+%D \starttyping
+%D {\referenceclass{realpage}{page}{text}}
+%D {\referenceclass{type}{data}}
+%D \stoptyping
+%D
+%D When we filter the content, next macros are set when we
+%D meet a normal cross reference:
+
+\let\currentrealreference =\empty
+\let\currentpagereference =\empty
+\let\currenttextreference =\empty
+\let\currentsubtextreference =\empty
+\let\currentsubsubtextreference=\empty
+
+%D System references only have one component:
+
+\let\currentdatareference=\empty
+
+%D Because internally a reference comes in two disguises, one
+%D with four arguments and one with only two, we need a two
+%D step filter.
+
+\def\getreferenceelements#1% only one level expansion permitted!
+ {\@EA\@EA\@EA\dogetreferenceelements\csname\r!cross\referenceprefix#1\endcsname\empty\empty\empty\empty}
+
+%D In the following step, the \type{\ifx#1} test is needed
+%D because we can access this macro directly, and therefore
+%D \type{#1} can be an undefined reference (in fact, this hack
+%D was needed for the line numbering mechanism).
+%D
+%D We already introduced a few counters. Here we see why we
+%D need those. The discrepancy between the cross reference
+%D definition order (determined by the utility file) and the
+%D moment the reference is defined in the text, is a measure
+%D for it's forward character. This enables references like
+%D {\em as we will see later on}.
+
+\chardef\currentreferencetype=0
+
+\newif\ifforwardreference
+
+\newif\ifrealreferencepage
+
+\def\docheckrealreferencepage#1%
+ {\doifnumberelse{#1}
+ {\ifnum#1=\realpageno
+ \realreferencepagetrue
+ \else
+ \realreferencepagefalse
+ \fi}
+ {\realreferencepagefalse}}
+
+\def\currentfolioreference{0}
+
+\let\currentlocationreference\empty
+
+\def\dogetreferenceelements#1#2#3#4#5%
+ {\chardef\currentreferencetype=\ifx#1\relax0\else#1\fi\relax
+ \ifnum\currentreferencetype<\plustwo
+ \edef\currentpagereference{#2}%
+ \let \currentdatareference\empty
+ \edef\currentlocationreference{#2}%
+ \ifx\currentpagereference \empty
+ \let\currentfolioreference\folio
+ \else
+ \def \currentpagereference {\referencepagenumber[#2]}%
+ \edef\currentfolioreference{\dosplitofffoliopart[#2]}%
+ \fi
+ \edef\currentrealreference{#3}%
+ \settextreferences#4\end
+ \ifnum0#5<\crossreferencenumber
+ \forwardreferencetrue
+ \else
+ \forwardreferencefalse
+ \fi
+ \else
+ \let \currentlocationreference\empty
+ \edef\currentrealreference {#3}%
+ \def \currentdatareference {#2}%
+ \let \currentfolioreference\folio
+ \settextreferences#4\end
+ \forwardreferencefalse
+ \fi
+ \ifodd\currentreferencetype
+ \realreferencepagefalse
+ \else
+ \docheckrealreferencepage\currentrealreference
+ \ifrealreferencepage \else
+ \docheckrealreferencepage\currentdatareference
+ \fi
+ \fi}
+
+\ifx\referencepagenumber\undefined
+
+ \def\referencepagenumber[#1]{?}
+
+\fi
+
+%D Text references can contain more than one entry and
+%D therefore we check for
+%D
+%D \starttyping
+%D {entry}
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D {{entry}{entry}{entry}}
+%D \stoptyping
+%D
+%D and split accordingly.
+
+\def\settextreferences
+ {\futurelet\next\dosettextreferences}
+
+\def\dosettextreferences
+ {\ifx\next\bgroup
+ \expandafter\dotriplegroupempty\expandafter\dodosettextreferences
+ \else
+ \expandafter\donosettextreferences
+ \fi}
+
+\def\donosettextreferences#1\end
+ {\def\currenttextreference{#1}%
+ \let\currentsubtextreference\empty
+ \let\currentsubsubtextreference\empty}
+
+\def\dodosettextreferences#1#2#3#4\end
+ {\def\currenttextreference{#1}%
+ \def\currentsubtextreference{#2}%
+ \def\currentsubsubtextreference{#3}}
+
+%D When inside this testing macro we can savely use:
+
+\def\doifforwardreferenceelse#1#2%
+ {\ifforwardreference#1\else#2\fi}
+
+%D Duplicate references are reported while loading the utility
+%D file. To prevent problems with document viewers cq.
+%D preprocessors, one can enable a (bit time consuming) check.
+
+\newif\ifcheckduplicatereferences
+
+%D The next rather dirty trick is needed to preserve the
+%D meaning of the original cross reference. In fact,
+%D \type{\rt!cross} is toggled to \type{\rt!done}.
+
+\def\rt!crossdone#1#2#3#4{\rt!done{#1}{#2}{#3}{#4}}
+
+\def\dohandleduplicatereference#1%
+ {\bgroup
+ \let\rt!cross\rt!crossdone
+ \@EA\xdef\csname\r!cross\referenceprefix#1\endcsname % no let !
+ {\csname\r!cross\referenceprefix#1\endcsname}%
+ \egroup}
+
+\def\checkfirstreferenceoccurance#1#2% etex
+ {\@EA\ifx\csname\r!cross\referenceprefix#1\endcsname\relax % no ifcsname needed here
+ \predefinereference{#1}%
+ #2%
+ \else
+ \getreferenceelements{#1}%
+ \ifnum\currentreferencetype=\rt!cross
+ \dohandleduplicatereference{#1}%
+ #2%
+ \fi
+ \fi}
+
+\def\doiffirstreferenceoccurance
+ {\ifcheckduplicatereferences
+ \@EA\checkfirstreferenceoccurance
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+%D We still have to test for the existence of a reference, but
+%D before we come to that, we first look into the way a
+%D reference can be accessed. It will be no surprise that
+%D references can come in several forms.
+%D
+%D Cross references appear as numbers (figure~1.1, chapter~2)
+%D or pagenumbers (page~2, page 3--2), and are called with
+%D \type{\in} and \type{\at}. In interactive documents we also
+%D have \type{\goto}, \type{\button} and alike. These are more
+%D versatile and look like:
+%D
+%D \starttyping
+%D \goto[reference]
+%D \goto[outer reference::]
+%D \goto[outer reference::inner reference]
+%D \goto[operation(argument)]
+%D \goto[operation(action{argument,argument})]
+%D \goto[action]
+%D \goto[action{argument}]
+%D \stoptyping
+%D
+%D The first one is a normal reference, the second and third
+%D are references to a file or \URL. The brace delimited
+%D references for instance refer to a \JAVASCRIPT. The last
+%D example shows that we can pass arguments to the actions.
+%D
+%D When we split off the components of such a reference, the
+%D results are available in:
+%D
+%D \starttyping
+%D \currentreferencespecial
+%D \currentreferenceoperation
+%D \currentreferencearguments
+%D \currentinnerreference
+%D \currentouterreference
+%D \currentfullreference
+%D \stoptyping
+%D
+%D Splitting a reference is done by:
+%D
+%D \starttyping
+%D \splitofffullreference {reference}
+%D \splitoffreference {reference}
+%D \stoptyping
+%D
+%D The second alternative can be used in a second stage
+%D splitoff and only handles \type{::}.
+
+\newif\ifreferencefound
+
+\let\currentfullreference \empty
+\let\currentreferencespecial \empty
+\let\currentreferenceoperation\empty
+\let\currentreferencearguments\empty
+\let\currentouterreference \empty
+\let\currentinnerreference \empty
+
+\def\setreferencevariables#1#2#3#4#5%
+ {\def\currentreferencespecial {#1}%
+ \def\currentreferenceoperation{#2}%
+ \def\currentreferencearguments{#3}%
+ \def\currentouterreference {#4}%
+ \def\currentinnerreference {#5}}
+
+\def\splitofffullreference#1%
+ {\edef\currentfullreference{#1}%
+ \@EA\dosplitofffullreference\currentfullreference\empty(\relax)\empty\end}
+
+\def\dosplitofffullreference#1(#2#3)#4#5\end
+ {\ifx#2)%
+ \let\currentreferenceoperation\empty
+ \let\currentreferencearguments\empty
+ \let\currentinnerreference \empty
+ \dodosplitofffullreferenceA#1::::\empty\end
+ \currentouterreference\currentreferencespecial
+ \else\ifx#2\relax
+ \let\currentreferencespecial \empty
+ \let\currentreferenceoperation\empty
+ \let\currentreferencearguments\empty
+ \dodosplitofffullreferenceA#1::::\empty\end
+ \currentouterreference\currentinnerreference
+ \else
+ \dosplitoffreferenceoperation#2#3{}\end
+ \let\currentinnerreference\empty
+ \dodosplitofffullreferenceB#1::::\empty\end
+ \currentouterreference\currentreferencespecial
+ \fi\fi}
+
+\def\dosplitoffreferenceoperation#1#%
+ {\def\currentreferenceoperation{#1}%
+ \dodosplitoffreferenceoperation}
+
+\def\dodosplitoffreferenceoperation#1#2\end
+ {\def\currentreferencearguments{#1}}
+
+\def\dodosplitofffullreferenceA#1::#2::#3#4\end#5#6%
+ {\if#3:%
+ \dosetfullreferenceA#5#1{}\edef#6{#2}%
+ \else
+ \dosetfullreferenceA#6#1{}\let#5\empty
+ \fi}
+
+\def\dosetfullreferenceA#1#2#%
+ {\edef#1{#2}%
+ \def\currentreferencearguments}
+
+\def\dodosplitofffullreferenceB#1::#2::#3#4\end#5#6%
+ {\if#3:%
+ \edef#5{#1}\edef#6{#2}%
+ \else
+ \let#5\empty\edef#6{#1}%
+ \fi}
+
+\def\splitoffreference#1%
+ {\expandafter\dodosplitofffullreferenceB#1::::\empty\end
+ \currentouterreference\currentinnerreference}
+
+%D Although the previous split macros have a multistep
+%D character, there performance is quite reasonable.
+%D
+%D For debugging purposes we provide a showcase macro:
+
+\long\def\dodoshowcurrentreference#1\from#2\with#3%
+ {\defconvertedcommand\ascii{#2}%
+ \edef\currentreferenceshow{\currentreferenceshow/#1/\ascii/#3/}}
+
+\long\def\doshowcurrentreference#1%
+ {\edef\currentreferenceshow{/\ifreferencefound+\else-\fi/#1}%
+ \dodoshowcurrentreference ful\from\currentfullreference \with#1%
+ \dodoshowcurrentreference spe\from\currentreferencespecial \with#1%
+ \dodoshowcurrentreference ope\from\currentreferenceoperation\with#1%
+ \dodoshowcurrentreference arg\from\currentreferencearguments\with#1%
+ \dodoshowcurrentreference out\from\currentouterreference \with#1%
+ \dodoshowcurrentreference inn\from\currentinnerreference \with#1}
+
+\def\showcurrentreference%
+ {\bgroup\tttf\doshowcurrentreference\par\currentreferenceshow\egroup}
+
+%D We use this visualizer to demonstrate the way references are
+%D split.
+%D
+%D \hbox{\splitofffullreference{rr}\showcurrentreference}
+%D \hbox{\splitofffullreference{pp{rr}}\showcurrentreference}
+%D \hbox{\splitofffullreference{pp(qq)}\showcurrentreference}
+%D \hbox{\splitofffullreference{pp(qq{aa,bb})}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::rr}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::pp()}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::pp(qq)}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::pp(qq{aa})}\showcurrentreference}
+
+%D Now we've come to the promissed testing step. As we can
+%D see, this macro does bit more than testing: it also resolves
+%D the reference. This means that whenever we test for the
+%D existance of a reference at an outer level, we have all the
+%D relevant properties of that reference avaliable inside the
+%D true branche~(\type{#2}).
+%D
+%D The prefix has to do with localizing references. When a
+%D prefix is set, looking for a reference comes to looking for
+%D the prefixed one, and when not found, looking for the non
+%D prefixed one. Consider for instance the prefix set to
+%D \type{sidetrack}.
+%D
+%D \starttyping
+%D \pagereference[important]
+%D \pagereference[unimportant]
+%D \setupreferencing[prefixprefix=sidetrack]
+%D \pagereference[important]
+%D \stoptyping
+%D
+%D results in saving (writing) the references
+%D
+%D \starttyping
+%D ...{}{important}
+%D ...{}{unimportant}
+%D ...{sidetrack}{important}...
+%D \stoptyping
+%D
+%D Now when we call for \type{unimportant}, we will indeed get
+%D the pagenumber associated to this reference. But when we
+%D call for \type{important}, while the prefix is still set, we
+%D will get the pagenumber bound to the prefixed one.
+%D
+%D {\em Some day, when processing time and memory are no longer
+%D performance factors, we will introduce multi||level
+%D prefixes.}
+%D
+%D Before we start analyzing, I introduce a general
+%D definition macro. Consider:
+%D
+%D \starttyping
+%D \goto{do}[JS(My_Script{"test",123}),titlepage]
+%D \stoptyping
+%D
+%D This can also be achieved by:
+%D
+%D \starttyping
+%D \definereference[startup][JS(My_Script{"test",123}),titlepage]
+%D \goto{do}[REF(startup)]
+%D \stoptyping
+%D
+%D Now is this is a handy feature or not?
+%D
+%D \showsetup{definereference}
+%D
+%D We can trace references by setting the next switch to
+%D true.
+
+\newif\iftracereferences
+
+\let\tracereferences\tracereferencestrue
+
+\def\specialREFidentifier{REF}
+
+\def\dodefinereference[#1][#2]%
+ {\ifsecondargument
+ \doifelsenothing{#2}
+ {\resetreference[#1]}%
+ {\@EA\gdef\csname\specialREFidentifier#1\endcsname{#2}}%
+ \else\iffirstargument
+ \resetreference[#1]%
+ \fi\fi}
+
+\def\definereference%
+ {\dodoubleempty\dodefinereference}
+
+\def\resetreference[#1]%
+ {\global\letbeundefined{\specialREFidentifier#1}}
+
+\newcount\nofexpandedreferences
+
+\def\dodoexpandreferences#1REF(#2#3)#4\relax
+ {\ifx#2\relax
+ \ifcsname\specialREFidentifier#1\endcsname
+ \edef\expandedreference{\csname\specialREFidentifier#1\endcsname,}%
+ \else
+ \global\advance\nofexpandedreferences \plusone
+ \@EA\xdef\csname REF::\number\nofexpandedreferences\endcsname{#1}%
+ \fi
+ \else
+ \ifcsname\specialREFidentifier#2#3\endcsname
+ \edef\expandedreference{\csname\specialREFidentifier#2#3\endcsname,}%
+ \else
+ % not set
+ \fi
+ \fi}
+
+\def\doexpandreferences#1,%
+ {\if]#1\else
+ \let\expandedreference\empty
+ \dodoexpandreferences#1REF(\relax)\relax
+ \@EAEAEA\doexpandreferences\@EA\expandedreference
+ \fi}
+
+\def\expandreferences#1%
+ {\global\nofexpandedreferences\zerocount
+ \doexpandreferences#1,],}
+
+\def\dodoifreferencefoundelse#1%
+ {\@EA\splitofffullreference\@EA{#1}%
+ \ifx\currentreferencespecial\empty
+ \ifx\currentouterreference\empty
+ \docheckinnerreference
+ \ifreferencefound \else
+ \checkglobalfilereferences
+ \fi
+ \else
+ \docheckouterreference
+ \fi
+ \ifreferencefound
+ \ifx\currentreferencearguments\empty
+ \getreferenceelements\currentfullreference
+ \else
+ \getreferenceelements\currentinnerreference
+ \fi
+ \fi
+ \else
+ \docheckspecialreference
+ \fi
+ \iftracereferences
+ \doshowcurrentreference\space
+ \writestatus\m!references\currentreferenceshow
+ \fi}
+
+%D Although this can be considered a hack, we provide the
+%D option to locate unknown references in other (loaded) files.
+%D This can be dangerous, since there can be conflicting
+%D definitions.
+
+\newconditional\autoglobalfilereferences
+
+\def\checkglobalfilereferences% sloooow
+ {\ifconditional\autoglobalfilereferences
+% \processcommacommand[\loadedreferences]\docheckglobalfilereference
+ \rawprocesscommalist[\loadedreferences]\docheckglobalfilereference
+ \fi}
+
+\def\docheckglobalfilereference#1%
+ {\ifcsname\r!cross#1::\currentinnerreference\endcsname
+ \def\currentouterreference{#1}%
+ \edef\currentfullreference%
+ {\currentouterreference::\currentinnerreference}%
+ \global\referencefoundtrue
+ \quitcommalist
+ \fi}
+
+%D For most situations, we could use:
+%D
+%D \starttyping
+%D \let\doifreferencefoundelse=\dodoifreferencefoundelse
+%D \stoptyping
+%D
+%D But when we also want to support chained references, we need
+%D some more. Such a chained reference is defined as:
+%D
+%D \starttyping
+%D \goto{somewhere}[JS(somescript),nextpage,JS(anotherscript)]
+%D \stoptyping
+%D
+%D Actually supporting chains is up to the special driver. Here
+%D we only provide the hooks.
+
+%D \macros
+%D {ifenablereferencechains}
+%D
+%D First we provide a switch to turn this mechanism off:
+
+\newif\ifenablereferencechains \enablereferencechainstrue
+
+%D We don't use the general commalist processing macros,
+%D because we don't want to pay a speed penalty.
+
+\newif\ifsecondaryreference
+\newcount\nofsecondaryreferences
+
+% Aanpassen: eerst alle refs scannen en componenten opslaan in
+% lijst, dan de chain doorlopen. Momenteel mag alleen laatste
+% laatste undefined zijn, eigenlijk moet dat overal kunnen met
+% 'geen' zonder melding. Is wel trager. Dus niet.
+
+\def\doifreferencefoundelse#1#2#3% REF \cs / never more than one group (else \aftergroup usage problems)
+ {\checkreferences
+ % first we collect the secondary ones
+ \bgroup
+ \the\everyreference
+ \let\referenceprefix\empty
+ \expandreferences{#1}%
+ \egroup
+ \doresetgotowhereever
+ \global\nofsecondaryreferences \zerocount
+ \ifcase\nofexpandedreferences\relax % #1 can be number -)
+ % no ref
+ \or
+ % one ref
+ \or
+ % two refs
+ \ifenablereferencechains \iflocation
+ \global\secondaryreferencetrue
+ \xdef\secondaryreference{\csname REF::2\endcsname}%
+ % test: \global\letcscsname\secondaryreference\csname REF::2\endcsname
+ \bgroup
+ %%\let\doifreferencefoundelse\localdoifreferencefoundelse
+ \let\unharmedreferenceprefix\referenceprefix
+ \dodoifreferencefoundelse\secondaryreference
+ \ifreferencefound
+ \global\nofsecondaryreferences \plusone
+ #2%
+ \else
+ \dohandlenoto{#3}%
+ \fi
+ \egroup
+ \fi \fi
+ \else
+ % more than two refs
+ \ifenablereferencechains \iflocation
+ \global\secondaryreferencetrue
+ \scratchcounter\plustwo
+ \loop
+ \xdef\secondaryreference{\csname REF::\number\scratchcounter\endcsname}%
+ % test: \global\letcscsname\secondaryreference\csname REF::\number\scratchcounter\endcsname
+ \bgroup
+ %%\let\doifreferencefoundelse\localdoifreferencefoundelse
+ \let\unharmedreferenceprefix\referenceprefix
+ \dodoifreferencefoundelse\secondaryreference
+ \ifreferencefound
+ \global\advance\nofsecondaryreferences \plusone
+ #2%
+ \else
+ \dohandlenoto{#3}%
+ \fi
+ \egroup
+ \ifnum\scratchcounter<\nofexpandedreferences\relax
+ \advance\scratchcounter \plusone
+ \repeat
+ \fi \fi
+ \fi
+ \global\secondaryreferencefalse
+ \xdef\primaryreference{\csname REF::1\endcsname}%
+ % test: \global\letcscsname\secondaryreference\csname REF::1\endcsname
+ \bgroup
+ % now we handle the primary one
+ %%\let\doifreferencefoundelse\localdoifreferencefoundelse
+ \let\unharmedreferenceprefix\referenceprefix
+ \dodoifreferencefoundelse\primaryreference
+ \ifreferencefound#2\else#3\fi
+ \egroup
+ \doresetgotowhereever} % to prevent problems with direct goto's
+
+%D The following local redefinition permits the usage of
+%D nested \type {\doifreferencefoundelse}; see for an
+%D example the local test for file|/|url references. This is
+%D a fuzzy part of this mechanism and a result of the choice
+%D to let speed prevail over beauty in resolving chained
+%D references with symbolic (defined) references.
+
+\def\localdoifreferencefoundelse#1%
+ {\dodoifreferencefoundelse{#1}%
+ \ifreferencefound\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi}
+
+%D Somewhere else we will properly define \type {\dohandlegoto};
+%D the noto alternative takes care of undefined references in
+%D a sequence
+
+\ifx\dohandlenoto\undefined
+
+ \def\dohandlenoto#1%
+ {\ifsecondaryreference\else{#1}\fi}
+
+\fi
+
+\ifx\dohandlegoto\undefined
+
+ \def\dohandlegoto#1#2#3%
+ {\ifsecondaryreference\else{#1}\fi}
+
+\fi
+
+%D As one can see, while processing the references, the first
+%D one is handled last. While scanning the second and following
+%D ones, we increment a counter and set a boolean to true.
+
+%D The next fast one permits rather raw references with
+%D \type{()}'s and is used in the object reference mechanism.
+
+\def\doifrawreferencefoundelse#1#2#3%
+ {\checkreferences
+ \bgroup
+ \edef\currentfullreference{#1}%
+ \ifcsname\r!cross\currentfullreference\endcsname
+ \getreferenceelements\currentfullreference
+ \global\referencefoundtrue#2%
+ \else
+ \global\referencefoundfalse#3%
+ \fi
+ \egroup}
+
+%D The inner case is simple. Only two cases have to be taken
+%D care of:
+%D
+%D \starttyping
+%D \goto{some text}[reference]
+%D \goto{some text}[prefix:reference]
+%D \stoptyping
+
+\def\docheckinnerreference
+ {\global\let\predefinedreference\currentinnerreference
+ \ifx\currentreferencearguments\empty
+ \ifcsname\r!cross\referenceprefix\currentfullreference\endcsname
+ \global\referencefoundtrue
+ \else
+ \let\referenceprefix\empty
+ \ifcsname\r!cross\currentfullreference\endcsname
+ \global\referencefoundtrue
+ \else
+ \global\referencefoundfalse
+ \fi
+ \fi
+ \else % [SomeThing{with,me}]
+ \let\referenceprefix\empty
+ \ifcsname\r!cross\currentinnerreference\endcsname
+ \global\referencefoundtrue
+ \else
+ \global\referencefoundfalse
+ \fi
+ \fi
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}\donothing}
+
+%D References to other files however are treated strict or
+%D tolerant, depending on their loading and availability:
+%D
+%D \starttyping
+%D \useexternaldocument[somefile][filename][a nice description]
+%D
+%D \goto{checked reference}[somefile::reference]
+%D \goto{unchecked reference}[somefile::]
+%D \goto{unchecked reference}[anotherfile::reference]
+%D \stoptyping
+%D
+%D Here we use the dummy reference \type{somefile::} set in
+%D \type{\setouterreference} as a signal that indeed references
+%D are defined for the outer file.
+
+\newif\ifstrictouterreferences \strictouterreferencesfalse
+
+\def\dodocheckouterreference
+ {\ifcsname\specialREFidentifier\currentfullreference\endcsname
+ \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
+ {\csname\specialREFidentifier\currentfullreference\endcsname}%
+ \docheckouterreference
+ \else\ifstrictouterreferences
+ \global\referencefoundfalse
+ \else
+ % already \global\referencefoundtrue % no checking done
+ \fi\fi}
+
+\def\docheckouterreference
+ {\let\referenceprefix\empty
+ \let\unharmedreferenceprefix\empty
+ \xdef\predefinedreference
+ {\currentouterreference::\currentinnerreference}%
+ \ifx\innerreference\empty
+ \global\referencefoundtrue % no checking done
+ \else
+ \ifcsname\r!cross\currentouterreference::\endcsname
+ \ifcsname\r!cross\currentfullreference\endcsname
+ \global\referencefoundtrue
+ \else
+ \dodocheckouterreference
+ \fi
+ \else
+ \ifstrictouterreferences
+ \global\referencefoundfalse
+ \else
+ \global\referencefoundtrue % no checking done
+ \fi
+ \fi
+ \fi
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}\donothing}
+
+%D Special references are only tested when some test routine is
+%D defined.
+
+\def\docheckspecialreference
+ {\let\referenceprefix\empty
+ \let\unharmedreferenceprefix\empty
+ \xdef\predefinedreference
+ {\currentreferencespecial::\currentreferenceoperation}%
+ \executeifdefined{\s!do:\v!test:\currentreferencespecial}%
+ {\global\referencefoundtrue\gobbletwoarguments}%
+ {\global\referencefoundtrue}{\global\referencefoundfalse}%
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}\donothing}
+
+%D An unknown reference is reported on the screen, in the log
+%D file and, when enabled, in the left margin of the text.
+
+\def\reportreferenceerror#1#2%
+ {\bgroup
+ \the\everyreference % cleanup : etc in french
+ \ifinpagebody\else
+ \doifconcepttracing
+ {\doifsomething{#2}
+ {\inleft
+ {\infofont
+ \scratchdimen\leftmarginwidth
+ \advance\scratchdimen -2em
+ \doboundtext{#2}\scratchdimen{..}->}}}%
+ \fi
+ \doifpredefinedreferenceelse
+ \donothing
+ {\predefinereference\predefinedreference
+ \showmessage\m!references{#1}{[\unharmedreferenceprefix][#2]}}%
+ \egroup}
+
+\def\unknownreference{\reportreferenceerror1}
+\def\illegalreference{\reportreferenceerror4}
+
+%D Although not actually needed, we default the unharmed
+%D reference prefix to the normal one.
+
+\def\unharmedreferenceprefix{\referenceprefix}
+
+%D When a reference is not found, we typeset a placeholder
+%D (two glyphs are often enough to represent the reference
+%D text).
+
+\def\dummyreference{{\tttf ??}}
+
+%D To prevent repetitive messages concerning a reference
+%D being defined, we set such an unknown reference to an empty
+%D one after the first encounter.
+
+\let\predefinedreference\s!unknown
+
+% we need to predefine in order to make dup checking possible (when no ref
+% is defined yet)
+
+\def\predefinereference#1% takes now an argument
+ {\global\@EA\let\csname\r!cross #1\endcsname\dummypredefinedreference
+ \global\@EA\let\csname\r!cross\unharmedreferenceprefix#1\endcsname\dummypredefinedreference}
+
+\def\dummypredefinedreference{\rt!done{}{}{}{}}
+
+%D Testing on existance then becomes:
+
+\def\doifpredefinedreferenceelse % \referenceprefix added
+ {\@EA\ifx\csname\r!cross\referenceprefix\predefinedreference\endcsname\dummypredefinedreference
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D Sometimes we want to temporary put a reference out of
+%D order. An example can be found in the menu macros.
+%D
+%D \starttyping
+%D \doifreferencepermittedelse{reference}{set}{true}{false}
+%D \stoptyping
+%D
+%D The second argument can be a comma seperated list.
+
+\let\permittedreferences\empty
+
+\def\doifreferencepermittedelse#1#2#3% ref found notfound
+ {\doifreferencefoundelse{#1}
+ {\donetrue
+ \ifx\permittedreferences\empty \else
+ \docheckifreferencepermitted{#1}%
+ \fi
+ \ifdone#2\else#3\fi}
+ {#3\unknownreference{#1}}}
+
+\def\docheckifreferencepermitted#1%
+ {\ifx\currentinnerreference\empty
+ \ifx\currentouterreference\empty \else
+ \doifinstring{\currentouterreference::}\permittedreferences\donefalse
+ \fi
+ \else\ifx\currentouterreference\empty
+ \doifinstring{\currentinnerreference}\permittedreferences\donefalse
+ \else
+ \doifinstring{\currentouterreference::\currentinnerreference}\permittedreferences\donefalse
+ \fi\fi}
+
+%D Apart from cross references supplied by the user, \CONTEXT\
+%D generates cross references itself. Most of them are not
+%D saved as a reference, but stored with their source, for
+%D instance a list or an index entry. Such automatically
+%D generated, for the user invisible, references are called
+%D {\em internal references}. The user supplied ones are
+%D labeled as {\em external references}.
+%D
+%D A second important characteristic is that when we want to
+%D support different backends (viewers), we need to support
+%D named destinations as well as page numbers. I invite readers
+%D to take a glance at the special driver modules to understand
+%D the fine points of this. As a result we will deal with {\em
+%D locations} as well as {\em real page numbers}. We explictly
+%D call this pagenumber a real one, because it is independant
+%D of the page numbering scheme used in the document.
+%D
+%D One of the reasons for \CONTEXT\ being the first \TEX\ base
+%D macropackage to support sophisticated interactive \PDF\
+%D files, lays in the mere fact that real page numbers are
+%D available in most two pass data, like references, list data
+%D and index entries.
+%D
+%D We will speak of \type{thisis...} when we are marking a
+%D location, and \type{goto...} when we point to such a
+%D location. The latter one can be seen as a hyperlink to the
+%D former one. In the next macros one we use constructs like:
+%D
+%D \starttyping
+%D \dostart...
+%D \dostop...
+%D \stoptyping
+%D
+%D Such macros are used to invoke the relevant specials from
+%D the special driver modules (see \type{spec-ini}). The flag
+%D \type{\iflocation} signals if we're in interactive mode.
+
+\def\thisisdestination#1% destination
+ {\iflocation \ifusepagedestinations \else
+ \dostartthisislocation{#1}\dostopthisislocation
+ \fi \fi}
+
+\def\thisisrealpage#1% pagenumber
+ {\iflocation
+ \dostartthisisrealpage{#1}\dostopthisisrealpage
+ \fi}
+
+%D The previous tho macros were easy ones, opposite to their
+%D counterparts. A common component in these is:
+%D
+%D \starttyping
+%D \dohandlegoto{..}{..}{..}
+%D \stoptyping
+%D
+%D Here data can be whatever needs highlighting, e.g. {\em
+%D figure 2.4}, and the start and stop entries handle the
+%D specials. The two \DIMENSIONS\ \type{\buttonwidth} and
+%D \type{\buttonheight} have to be set when handling the
+%D data~(\type{#2}).
+
+\ifx\buttonheight\undefined \newdimen\buttonheight \fi
+\ifx\buttonwidth \undefined \newdimen\buttonwidth \fi
+
+\def\gotodestination#1#2#3#4#5% url file destination page data
+ {\iflocation
+ \ifusepagedestinations
+ \gotorealpage{#1}{#2}{\number#4}{#5}%
+ \else
+ \dohandlegoto
+ {#5}%
+ {\the\everyreference\dostartgotolocation\buttonwidth\buttonheight{#1}{#2}{#3}{\number#4}}%
+ {\dostopgotolocation}%
+ \fi
+ \else
+ {#5}%
+ \fi}
+
+\def\gotorealpage#1#2#3#4% url file page data
+ {\iflocation
+ \dohandlegoto
+ {#4}%
+ {\dostartgotorealpage\buttonwidth\buttonheight{#1}{#2}{\number#3}}%
+ {\dostopgotorealpage}%
+ \else
+ {#4}%
+ \fi}
+
+%D \macros
+%D {setreferencefilename}
+%D
+%D This command can be used in the special drivers to
+%D uppercase filenames. This is needed when one wants to
+%D produce \CDROM's conforming to ISO9660. We consider is the
+%D savest to enable this feature by default. We cannot handle
+%D uppercase here, since the suffix is handled in the special
+%D driver. Conversion is taken care of by:
+%D
+%D \starttyping
+%D \setreferencefilename somefilename\to\SomeFileName
+%D \stoptyping
+
+% \def\setreferencefilename#1\to#2%
+% {\doifelse{\@@converteerfile}{\v!ja} % boolean is sneller
+% {\uppercasestring#1\to#2}
+% {\edef#2{#1}}}
+
+\chardef\referencefilecase=0
+
+\def\setreferencefilename#1\to#2%
+ {\ifcase\referencefilecase
+ \edef#2{#1}%
+ \or
+ \uppercasestring#1\to#2%
+ \or
+ \lowercasestring#1\to#2%
+ \else
+ \edef#2{#1}%
+ \fi}
+
+%D Internal references can best be set using the next few
+%D macros. Setting such references to unique values is
+%D completely up to the macros that call them.
+%D
+%D \starttyping
+%D \thisissomeinternal{tag}{identifier}
+%D \gotosomeinternal {tag}{identifier}{pagenumber}{text}
+%D \stoptyping
+
+\def\thisissomeinternal#1#2% tag reference
+ {\doifsomething{#2}{\thisisdestination{#1:#2}}}
+
+\def\gotosomeinternal#1#2% #3#4
+ {\gotodestination\empty\empty{#1:#2}}
+
+%D An automatic mechanism is provided too:
+%D
+%D \starttyping
+%D \thisisnextinternal{tag}
+%D \gotonextinternal {tag}{number}{pagenumber}{text}
+%D \stoptyping
+%D
+%D The first macro increments a counter. The value of this
+%D counter is available in the macro \type{\nextinternalreference}
+%D and should be saved somewhere (for instance in a file) for
+%D future reference. The second argument of
+%D \type {\gotonextinternal} takes such a saved number. One can
+%D turn on tracing these references, in which case the
+%D references are a bit more verbose.
+
+\newcount\locationcount
+
+\newif\iftraceinternalreferences
+\newif\ifinternalnamedreferences \internalnamedreferencestrue
+
+\def\nextinternalreference
+ {\the\locationcount}
+
+\def\thisisnextinternal#1%
+ {\global\advance\locationcount \plusone
+ \ifinternalnamedreferences
+ \thisisdestination{\s!aut\iftraceinternalreferences:#1\fi:\nextinternalreference}%
+ \fi}
+
+% beter:
+%
+% \def\thisisnextinternal#1%
+% {\iftrialtypesetting\else
+% \global\advance\locationcount \plusone
+% \ifinternalnamedreferences
+% \thisisdestination{\s!aut\iftraceinternalreferences:#1\fi:\nextinternalreference}%
+% \fi
+% \fi}
+
+\def\gotonextinternal#1#2#3#4%
+ {\ifinternalnamedreferences
+ \gotodestination\empty\empty{\s!aut\iftraceinternalreferences:#1\fi:#2}{#3}{#4}%
+ \else
+ \gotorealpage\empty\empty{#3}{#4}%
+ \fi}
+
+%D We already went through a lot of problems to sort out what
+%D kind of reference we're dealing with. Sorting out the user
+%D supplied cross references (show/goto this or that) as well
+%D as user supplied system references (invoke this or that) is
+%D already taken care of in the test routine, but we still have
+%D to direct the request to the right (first) routine.
+
+\def\gotolocation% #1#2%
+ {\ifx\currentreferencespecial\empty
+ \ifx\currentouterreference\empty
+ \ifnum\currentreferencetype<2
+ \@EA\@EAEAEA\@EA\gotoinnerlocation
+ \else
+ \@EA\@EAEAEA\@EA\gotosystemlocation
+ \fi
+ \else
+ \@EAEAEA\gotoouterlocation
+ \fi
+ \else
+ \@EA\gotospeciallocation
+ \fi} % {#1}{#2}
+
+%D An inner reference refers to some place in the document
+%D itself.
+
+\def\gotoinnerlocation#1% #2%
+ {\gotodestination\empty\empty
+ {\referenceprefix\currentinnerreference}\currentrealreference} % {#2}
+
+%D The outer location refers to another document, specified as
+%D file or \URL.
+
+\def\gotoouterlocation#1#2% % page checken!
+ {\bgroup
+ \let\referenceprefix\empty
+ \setouterlocation\currentouterreference
+ \ifx\currentinnerreference\empty
+ \gotorealpage
+ \otherURL\otherfile1{#2}%
+ \else
+ \gotodestination
+ \otherURL\otherfile\currentinnerreference\currentrealreference{#2}%
+ \fi
+ \egroup}
+
+%D Special locations are those that are accessed by saying
+%D things like:
+%D
+%D \starttyping
+%D \goto{calculate total}[JS(summarize{10,23,56}]
+%D \stoptyping
+%D
+%D After several intermediate steps this finally arrives at
+%D the next macro and expands into (simplified):
+%D
+%D \starttyping
+%D \gotoJSlocation{total{summarize{10,23,56}}}{calculate total}
+%D \stoptyping
+%D
+%D The first argument is the full reference, the second one
+%D is the text, in some kind of manipulated form. In practice
+%D we split references, so we get:
+%D
+%D \starttyping
+%D \gotoJSlocation{summarize{10,23,56}}{calculate}
+%D \gotoJSlocation{summarize{10,23,56}}{total}
+%D \stoptyping
+%D
+%D where \type{calculate} and \type{total} are colored, boxed
+%D or whatever \type{\goto} is told to do.
+%D
+%D The macro \type{\gotoJSlocation} can use \type
+%D {\currentreferenceoperation} (in our example
+%D \type{summarize}) and \type{\currentreference} (here
+%D being \type {10,23,56}) to perform its task.
+
+\def\gotospeciallocation
+ {\executeifdefined{goto\currentreferencespecial location}\gobbleoneargument}
+
+%D Such special macros can be defined by:
+
+\def\definespeciallocation#1%
+ {\setvalue{goto#1location}}
+
+%D The associated test is to be defined by:
+
+\def\definespecialtest#1%
+ {\setvalue{\s!do:\v!test:#1}}
+
+%D This \type{\def} alike macro is to be used as:
+%D
+%D \starttyping
+%D \definespeciallocation{JS}#1#2{... #1 ... #2 ...}
+%D \stoptyping
+%D
+%D In module \type {java-ini} one can see that \type
+%D {\gotoJSlocation} looks much like the previous goto
+%D definitions.
+
+%D A system location is not always a location, but for the
+%D consistency we also consider actions as such.
+
+\def\gotosystemlocation
+ {\csname\r!syst\the\currentreferencetype\endcsname}
+
+\def\definesystemreferencehandler#1#2%
+ {\setgvalue{\r!syst\the#1}{#2}}
+
+%D In this module we define three system references: one for
+%D handling navigational, viewer specific, commands, another
+%D for jumping to special pages, like the first or last one,
+%D and a third reference for linking tree like lists, like
+%D tables of contents. The latter two adapt themselves to the
+%D current state.
+
+\definesystemreferencehandler \rt!exec \handleexecreference
+\definesystemreferencehandler \rt!page \handlepagereference
+\definesystemreferencehandler \rt!list \handlelistreference
+
+\def\handleexecreference#1%
+ {\checkexecutecommand\currentdatareference\currentreferencearguments
+ \executecommand\currentdatareference\currentreferencearguments}
+
+\def\handlepagereference#1%
+ {\gotorealpage\empty\empty\currentdatareference}
+
+\def\handlelistreference#1% is deze nog echt nodig?
+ {\gotodestination\empty\empty\currentdatareference{\getvalue{\currentdatareference}}}
+
+%D \macros
+%D {setexecutecommandcheck}
+%D
+%D In case a command action needs to do some checking in
+%D advance, one can assign an check function by:
+%D
+%D \starttyping
+%D \setexecutecommandcheck{startsound}\checksoundtrack
+%D \stoptyping
+
+\def\setexecutecommandcheck#1#2% #2 permits \first \second
+ {\setvalue{\s!do:\s!do:#1}{#2}}
+
+\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 }
+
+%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
+%D special driver (using \type{\executecommand}).
+
+% better: [action(name)] and \definereference[name][action(name)]
+
+\setglobalsystemreference \rt!exec \v!CloseDocument {close}
+\setglobalsystemreference \rt!exec \v!ExitViewer {exit}
+\setglobalsystemreference \rt!exec \v!FirstPage {first}
+\setglobalsystemreference \rt!exec \v!LastPage {last}
+\setglobalsystemreference \rt!exec \v!NextJump {forward}
+\setglobalsystemreference \rt!exec \v!NextPage {next}
+\setglobalsystemreference \rt!exec \v!PauseMovie {pausemovie}
+\setglobalsystemreference \rt!exec \v!PauseSound {pausesound}
+\setglobalsystemreference \rt!exec \v!PauseRendering {pauserendering}
+\setglobalsystemreference \rt!exec \v!PreviousJump {backward}
+\setglobalsystemreference \rt!exec \v!PreviousPage {previous}
+\setglobalsystemreference \rt!exec \v!PrintDocument {print}
+\setglobalsystemreference \rt!exec \v!SaveForm {exportform}
+\setglobalsystemreference \rt!exec \v!LoadForm {importform}
+\setglobalsystemreference \rt!exec \v!ResetForm {resetform}
+\setglobalsystemreference \rt!exec \v!ResumeMovie {resumemovie}
+\setglobalsystemreference \rt!exec \v!ResumeSound {resumesound}
+\setglobalsystemreference \rt!exec \v!ResumeRendering {resumerendering}
+\setglobalsystemreference \rt!exec \v!SaveDocument {save}
+\setglobalsystemreference \rt!exec \v!SaveNamedDocument{savenamed}
+\setglobalsystemreference \rt!exec \v!OpenNamedDocument{opennamed}
+\setglobalsystemreference \rt!exec \v!SearchDocument {search}
+\setglobalsystemreference \rt!exec \v!SearchAgain {searchagain}
+\setglobalsystemreference \rt!exec \v!StartMovie {startmovie}
+\setglobalsystemreference \rt!exec \v!StartSound {startsound}
+\setglobalsystemreference \rt!exec \v!StartRendering {startrendering}
+\setglobalsystemreference \rt!exec \v!StopMovie {stopmovie}
+\setglobalsystemreference \rt!exec \v!StopSound {stopsound}
+\setglobalsystemreference \rt!exec \v!StopRendering {stoprendering}
+\setglobalsystemreference \rt!exec \v!SubmitForm {submitform}
+\setglobalsystemreference \rt!exec \v!ToggleViewer {toggle}
+\setglobalsystemreference \rt!exec \v!ViewerHelp {help}
+\setglobalsystemreference \rt!exec \v!HideField {hide}
+\setglobalsystemreference \rt!exec \v!ShowField {show}
+\setglobalsystemreference \rt!exec \v!GotoPage {gotopage}
+\setglobalsystemreference \rt!exec \v!GotoPage {gotopage}
+\setglobalsystemreference \rt!exec \v!Query {query}
+\setglobalsystemreference \rt!exec \v!QueryAgain {queryagain}
+\setglobalsystemreference \rt!exec \v!FitWidth {fitwidth}
+\setglobalsystemreference \rt!exec \v!FitHeight {fitheight}
+
+\setglobalsystemreference \rt!exec \v!ShowThumbs {thumbnails}
+\setglobalsystemreference \rt!exec \v!ShowBookmarks {bookmarks}
+
+%D Executing the command looks alike the previous goto macros.
+
+\def\executecommand#1#2#3%
+ {\iflocation
+ \dohandlegoto
+ {#3}%
+ {\dostartexecutecommand\buttonwidth\buttonheight{#1}{#2}}%
+ {\dostopexecutecommand}%
+ \else
+ {#3}%
+ \fi}
+
+%D We could have done without the short tags and thereby saving
+%D some tokens, but the current approach leaves room for future
+%D extensions.
+
+%D It is possible to disable the writing of references to the
+%D utility file by setting:
+
+\newif\ifreferencing \referencingtrue
+
+%D One can also activate an automatic prefix mechanism. By
+%D setting the \type{\prefix} variable to \type{+}, the prefix
+%D is incremented, when set to \type{-} or empty, the prefix is
+%D reset. Other values become the prefix.
+
+\newcount\prefixcounter
+
+%D These settings are accomplished by:
+%D
+%D \showsetup{setupreferencing}
+%D
+%D In interactive documents verbose references don't always
+%D make sense (what is a page number in an unnumbered
+%D document). By setting the \type{interaction} variable, one
+%D can influences the way interactive references are set.
+
+% \newif\ifreferencestrut % some day an option
+
+\def\setupreferencing
+ {\dosingleargument\dosetupreferencing}
+
+\def\dosetupreferencing[#1]%
+ {\getparameters
+ [\??rf]
+ [\c!prefix=\s!unknown,#1]%
+ \processaction
+ [\@@rfstate]
+ [ \v!stop=>\referencingfalse,
+ \v!start=>\referencingtrue]%
+ \processaction
+ [\@@rfinteraction]
+ [ \v!all=>\let\dowantedreference\docompletereference,
+ \v!label=>\let\dowantedreference\dolabelonlyreference,
+ \v!text=>\let\dowantedreference\dotextonlyreference,
+ \v!symbol=>\let\dowantedreference\dosymbolreference]%
+ \chardef\autocrossfilereferences\zerocount
+ \processaction
+ [\@@rfautofile]
+ [ \v!yes=>\chardef\autocrossfilereferences\plusone,
+ \v!page=>\chardef\autocrossfilereferences\plustwo]%
+ \chardef\referencefilecase\zerocount
+ \processaction[\@@rfconvertfile]
+ [ \v!yes=>\chardef\referencefilecase\plusone,
+ \v!big=>\chardef\referencefilecase\plusone,
+ \v!small=>\chardef\referencefilecase\plustwo]%
+ %\doifelse\@@rfstrut\v!yes % some day an option
+ % \referencetruttrue\referencestrutfalse
+ \setupreferenceprefix[\@@rfprefix]%
+ \doifelse\@@rfglobal\v!yes
+ {\settrue \autoglobalfilereferences}
+ {\setfalse\autoglobalfilereferences}}
+
+\def\incrementreferenceprefix{+}
+\def\decrementreferenceprefix{-}
+
+\def\setupreferenceprefix[#1]%
+ {\edef\@@rfprefix{#1}%
+ \ifx\@@rfprefix\empty
+ \let\referenceprefix\empty
+ \else\ifx\@@rfprefix\incrementreferenceprefix
+ \advance\prefixcounter \plusone % should be global
+ \edef\referenceprefix{\the\prefixcounter:}%
+ \let\@@rfprefix\s!unknown
+ \else\ifx\@@rfprefix\decrementreferenceprefix
+ \let\referenceprefix\empty
+ \let\@@rfprefix\s!unknown
+ \else\ifx\@@rfprefix\s!unknown
+ % forget about it
+ \else
+ \edef\referenceprefix{\@@rfprefix:}%
+ \fi\fi\fi\fi}
+
+%D \macros
+%D {handlereferenceactions,
+%D collectreferenceactions}
+%D
+%D Sometimes we need to pass the actions connected to
+%D references to variables instead of rectangular areas on
+%D which one can click. The next macro collects the actions
+%D and passes them to a handle. This is a rather dreadfull
+%D hack!
+%D
+%D \starttyping
+%D \handlereferenceactions{references}\handle
+%D \stoptyping
+%D
+%D So, \type {\handle} does the final job, which in for
+%D instance the \PDF\ drivers comes down to doing something
+%D with \type {\lastPDFaction}.
+
+\newif\ifcollectreferenceactions
+
+\def\handlereferenceactions#1#2%
+ {\doifsomething{#1}
+ {\bgroup
+ \collectreferenceactionstrue
+ \@EA\doifreferencefoundelse\@EA{#1}
+ {\gotolocation{#1}{}\ifsecondaryreference\else#2\fi}
+ {\unknownreference{#1}}%
+ \egroup}}
+
+%D The most straightforward way of retrieving references is
+%D using \type{\ref}. Consider the reference:
+%D
+%D \startbuffer
+%D \reference[my ref]{{Look}{Here}{I am}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D We can ask for upto five reference components:
+%D
+%D \startbuffer
+%D user page reference: \ref[p][my ref]
+%D text reference: \ref[t][my ref]
+%D real page reference: \ref[r][my ref]
+%D sub text reference: \ref[s][my ref]
+%D extra text reference: \ref[e][my ref]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D And get back:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+\def\ref{\dodoubleargument\doref}
+
+\def\reftypep{\currentpagereference}
+\def\reftypet{\currenttextreference}
+\def\reftyper{\currentrealreference}
+\def\reftypes{\currentsubtextreference}
+\def\reftypee{\currentsubsubtextreference}
+
+\def\doref[#1][#2]%
+ {\ifsecondargument
+ \doifreferencefoundelse{#2}
+ {\executeifdefined{reftype#1}\reftypep}
+ {\unknownreference{#2}\dummyreference}%
+ \else
+ \dummyreference
+ \fi}
+
+%D We can typeset a reference using \type{\in}, \type{\at} and
+%D \type{\about} and goto specific locations using
+%D \type{\goto}. The last one does not make that much sense in
+%D a paper document. To complicate things, \PLAIN\ \TEX\ also
+%D implements an \type {\in} but fortunately that one only
+%D makes sense in math mode.
+
+%D --- VANAF HIER NOG VERENGELSEN ---
+
+%\let\donormalin =\in
+%\let\donormalover=\over % about/oppassen beter nederlands dan engels!
+%
+%\def\in%
+% {\ifmmode
+% \expandafter\donormalin
+% \else
+% \expandafter\doinatreference\expandafter\currenttextreference
+% \fi}
+
+% we need to bypass math tokens
+
+% \let\normalover \over
+
+\definecommand in {\dospecialin}
+\definecommand at {\dospecialat}
+\definecommand about {\dospecialabout}
+\definecommand from {\dospecialfrom}
+\definecommand over {\dospecialabout} % needed here, else math problems
+
+\unexpanded\def\dospecialin{\doinatreference\currenttextreference}
+\unexpanded\def\dospecialat{\doinatreference\currentpagereference}
+
+\unexpanded\def\dospecialabout[#1]%
+ {\dontleavehmode
+ \bgroup
+ \def\thecurrentsubtextreference
+ {\limitatetext\currentsubtextreference\@@rfwidth\unknown}%
+ %\leaveoutervmode % no
+ \@@rfleft
+ \doifreferencefoundelse{#1}
+ {\let\crlf\space
+ \let\\\space
+ \let\dogotofixed\dogotospace
+ \dogotospace{\thecurrentsubtextreference}[#1]}
+ {\unknownreference{#1}\dummyreference}%
+ \@@rfright
+ \referenceinfo{<}{#1}%
+ \egroup}
+
+%D Typesetting the reference is a bit more complicated than one
+%D would at first sight expect. This is due to the fact that we
+%D distinguish three (five) alternative calls:
+%D
+%D \placefigure
+%D [here][three calls]
+%D {Three alternatives reference calls.}
+%D {\startcombination[1*3]
+%D {\framed{\type{ \in }}} {a}
+%D {\framed{\type{ \at }}} {b}
+%D {\framed{\type{\goto}}} {c}
+%D \stopcombination}
+%D
+%D \startbuffer
+%D \in figure[fig:three calls]
+%D \in{figure}[fig:three calls]
+%D \in figure a[fig:three calls]
+%D \in{figure}{a}[fig:three calls]
+%D figure~\in[fig:three calls]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This turns up as:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D
+%D The dual \type{{}} results in a split reference. In a
+%D document meant for paper, one is tempted to use the last
+%D (most straightforward) alternative. When a document is also
+%D meant voor electronic distribution, the former alternatives
+%D have preference, because everything between the \type{\in}
+%D and~\type{[} becomes active (and when asked for, typeset
+%D in a different color and typeface).
+
+\def\doinatreference#1%
+ {\doifnextoptionalelse{\dodoinatreference{#1}{}}{\dodoinatreference{#1}}}
+
+\def\dodoinatreference#1%
+ {\def\dododoinatreference{\dodododoinatreference{#1}}%
+ \futurelet\next\dododoinatreference}
+
+% overloaded
+%
+% \def\dodododoinatreference#1#2#3[#4]%
+% {\ifx\next\bgroup
+% \dododododoinatreference{#1\ignorespaces#3}{#2}[#4]%
+% \else
+% \dododododoinatreference{#1}{#2#3}[#4]%
+% \fi}
+
+%D We arrived at the last step. Before we do the typesetting,
+%D we forget all previous (paragraph bound) settings and make
+%D sure that we remain in horizontal mode. Next we choose
+%D among the several representations.
+
+% overloaded
+%
+% \def\dododododoinatreference#1#2[#3]%
+% {\dontleavehmode
+% \bgroup
+% \forgetall
+% %\leaveoutervmode
+% \doifreferencefoundelse{#3}
+% {\bgroup
+% \let\ignorespaces\empty % rather dirty but ok
+% \doifelsenothing{#1}
+% {\egroup\dosymbolreference{#1}{#2}[#3]}
+% {\egroup\dowantedreference{#1}{#2}[#3]}}
+% {\dounknownreference{#1}{#2}[#3]}%
+% \referenceinfo{<}{#3}%
+% \egroup}
+
+%D The previously discussed setup macro lets us specify the
+%D representation of references. A symbol reference does not
+%D show the specific data, like the number of a figure, but
+%D shows one of: \hbox {$^\goforwardcharacter$
+%D $^\gobackwardcharacter$ $^\gonowherecharacter$}, depending
+%D on the direction to go.
+
+\def\dosymbolreference#1#2[#3]%
+ {\bgroup
+ \setupsymbolset[\@@iasymbolset]%
+ \removelastskip
+ \ifx\currentreferencespecial\empty
+ \ifx\currentouterreference\empty
+ \ifnum0\currentrealreference=\zerocount
+ \ifhmode\strut\high{\symbol[\v!nowhere]}\fi
+ \else\ifnum0\currentrealreference>\realpageno
+ \dodosymbolreference{#2}{\high{\symbol[\v!next]}}%
+ \else\ifnum0\currentrealreference<\realpageno
+ \dodosymbolreference{#2}{\high{\symbol[\v!previous]}}%
+ \else
+ \ifhmode\strut\high{\symbol[\v!nowhere]}\fi
+ \fi\fi\fi
+ \else
+ \gotoouterlocation{#3}{\showlocation{\high{\symbol[\v!somewhere]}}}%
+ \fi
+ \else
+ \gotospeciallocation{#3}{\showlocation{\high{\symbol[\v!somewhere]}}}%
+ \fi
+ \egroup}
+
+\def\dodosymbolreference#1#2%
+ {#1\hbox{\gotorealpage\empty\empty\currentrealreference
+ {\dolocationattributes\??ia\c!style\c!color{#2}}}}
+
+%D The other alternatives just conform their names: only the
+%D label, only the text, or the label and the text.
+
+\def\dounknownreference#1#2[#3]%
+ {\unknownreference{#3}\dotextprefix{#2}\dummyreference}%
+
+\def\docompletereference#1#2[#3]%
+ {\iflocationsplit
+ \doifsomespaceelse{#2}\dogotospace\dogotofixed{\dotextprefix{#2}#1}[#3]%
+ \else
+ \dogotofixed{\dotextprefix{#2}#1}[#3]%
+ \fi}
+
+\def\dolabelonlyreference#1#2[#3]%
+ {\doifsomespaceelse{#2}
+ {\doifsomething{#2}{\dogotospace{#2}[#3]}}
+ {\dogotofixed{\dotextprefix{#2}}[#3]}}
+
+\def\dotextonlyreference#1#2[#3]%
+ {\dotextprefix{#2}\dogotofixed{#1}[#3]}
+
+\let\dowantedreference=\docompletereference
+
+%D \macros
+%D {definereferenceformat}
+%D
+%D The next few macros were made for for David Arnold and Taco
+%D Hoekwater. They can be used for predefining reference
+%D texts, and thereby stimulate efficiency.
+%D
+%D [more documentation will be added]
+%D
+%D \starttyping
+%D \definereferenceformat[informula] [left=(,right=),text=formula]
+%D \definereferenceformat[informulas] [left=(,right=),text=formulas]
+%D \definereferenceformat[andformula] [left=(,right=),text=and]
+%D \definereferenceformat[andformulas][left=(,right=),text=and]
+%D
+%D \informula [b] and \informula [for:c]
+%D the \informula {formulas}[b] \informula {and} [for:c]
+%D the \informulas {formulas}[b] \informula {and} [for:c]
+%D the \informulas [b] \informula {en} [for:c]
+%D the \informulas [b] \andformula [for:c]
+%D \stoptyping
+%D
+%D Instead of a text, one can specify a label, which should
+%D be defined with \type {\setuplabeltext}.
+
+\def\definereferenceformat%
+ {\dodoubleargument\dodefinereferenceformat}
+
+\def\dodefinereferenceformat[#1][#2]%
+ {\iffirstargument
+ \getparameters[\??rf#1]
+ [\c!left=, % of the number
+ \c!right=, % of the number
+ \c!text=, % before the number
+ \c!label=, % can be {left}{right}
+ \c!command=\in,
+ #2]%
+ \unexpanded\setvalue{#1}%
+ {\dontleavehmode\doexecutereferenceformat{#1}}%
+ \fi}
+
+\def\noexecutelabelreferenceformat#1%
+ {\doifvaluesomething{\??rf#1\c!text}
+ {\gdef\textofreference{\csname\??rf#1\c!text\endcsname}}%
+ \csname\??rf#1\c!command\endcsname}
+
+\def\doexecutelabelreferenceformat#1%
+ {\csname\??rf#1\c!command\endcsname
+ {\leftlabeltext {\csname\??rf#1\c!label\endcsname}}%
+ {\rightlabeltext{\csname\??rf#1\c!label\endcsname}}}
+
+\def\doexecutereferenceformat#1%
+ {\gdef\leftofreference {\csname\??rf#1\c!left \endcsname}%
+ \gdef\rightofreference{\csname\??rf#1\c!right\endcsname}%
+ \global\let\textofreference\empty % otherwise ~ added
+ \doifelsevaluenothing{\??rf#1\c!label}
+ \noexecutelabelreferenceformat\doexecutelabelreferenceformat{#1}}
+
+\let\leftofreference \relax
+\let\rightofreference\relax
+\let\textofreference \relax
+
+\def\dodododoinatreference#1#2#3[#4]% \removeunwantedspaces added june 2004
+ {\ifx\next\bgroup % but removed later, fails on metafun
+ \dododododoinatreference
+ % fails on metafun {\leftofreference#1\ignorespaces#3\removeunwantedspaces\rightofreference}{#2}[#4]%
+ {\leftofreference#1\ignorespaces#3\rightofreference}{#2}[#4]%
+ \else
+ \dododododoinatreference
+ {\leftofreference#1\rightofreference}{#2#3}[#4]%
+ \fi}
+
+\def\dododododoinatreference#1#2[#3]%
+ {\dontleavehmode % replaces \leaveoutervmode
+ \bgroup
+ \forgetall
+ \postponenotes
+ %\leaveoutervmode % replaced by \dontleavehmode
+ \doifreferencefoundelse{#3}
+ {\bgroup
+ \let\ignorespaces \empty % rather dirty trick, but ok
+ \let\leftofreference \empty % the same, again ok
+ \let\rightofreference\empty % and once more
+ \def\textofreference {#2}% % temporary value
+ \ifx\textofreference\empty % simple expansion
+ %\doifelsenothing{#1}
+ % {\egroup\dosymbolreference{#1}{\textofreference}[#3]}
+ % {\egroup\dowantedreference{#1}{\textofreference}[#3]}%
+ \doifelsenothing{#1}%
+ {\egroup\dosymbolreference}%
+ {\egroup\dowantedreference}%
+ {#1}{\textofreference}[#3]%
+ \else
+ %\doifelsenothing{#1}
+ % {\egroup\dosymbolreference{#1}{#2}[#3]}
+ % {\egroup\dowantedreference{#1}{#2}[#3]}%
+ \doifelsenothing{#1}%
+ {\egroup\dosymbolreference}%
+ {\egroup\dowantedreference}%
+ {#1}{#2}[#3]%
+ \fi}
+ {\dounknownreference{#1}{#2}[#3]}%
+ \referenceinfo<{#3}%
+ \global\let\leftofreference \empty
+ \global\let\rightofreference\empty
+ \global\let\textofreference \empty
+ \egroup}
+
+%D In interactive documents going to a specific location is not
+%D bound to cross references. The \type{\goto} commands can be
+%D used to let users access another part of the document. In
+%D this respect, interactive tables of contents and registers
+%D can be considered goto's. Because in fact a \type{\goto} is
+%D just a reference without reference specific data, the
+%D previous macros are implemented using the goto
+%D functionality.
+%D
+%D \showsetup{goto}
+%D
+%D One important chaacteristic is that the first argument of
+%D \type{\goto} (and therefore \type{\at} and \type{\in} is
+%D split at spaces. This means that, although hyphenation is
+%D prevented, long references can cross line endings.
+
+
+\def\dogoto#1[#2]%
+ {\dontleavehmode
+ \bgroup
+ \postponenotes
+ \doifreferencefoundelse{#2}
+ {\doifelsenothing{#1}
+ {\dosymbolreference{}{}[#2]}
+ {\dogotospace{#1}[#2]}}
+ {\unknownreference{#2}#1\relax}% \relax catches lookahead
+ \egroup
+ \referenceinfo{<}{#2}}
+
+\unexpanded\def\goto#1#2%
+ {\dogoto{#1}#2}
+
+\newif\ifsharesimilarreferences \sharesimilarreferencestrue
+\newcount\similarreference % 0=noppes 1=create/refer 2,3,..=refer
+
+\def\dogotospace#1[#2]%
+ {\iflocationsplit
+ \ifsecondaryreference\setbox0\hbox\fi % due to space insertion
+ {\let\dogotospace\dogotofixed
+ \iflocation
+ \def\processisolatedword##1%
+ {\ifisolatedwords\ifsharesimilarreferences
+ \global\advance\similarreference \plusone
+ \fi\fi
+ \hbox{\gotolocation{#2}{##1\presetgoto}}}%
+ \doattributes\??ia\c!style\c!color
+ {\processisolatedwords{#1}\processisolatedword}%
+ \else
+ #1\relax % \relax prevents #1's next macros from gobbling \fi
+ \fi}%
+ \else
+ \iflocation
+ \doattributes\??ia\c!style\c!color
+ {\gotolocation{#2}{#1\presetgoto}}%
+ \else
+ #1\relax % \relax prevents #1's next macros from gobbling \fi
+ \fi
+ \fi
+ \global\similarreference\zerocount}
+
+\def\dogotofixed#1[#2]%
+ {{\iflocation
+ \hbox{\gotolocation{#2}{\doattributes\??ia\c!style\c!color
+ {#1\presetgoto}}}%
+ \else
+ #1%
+ \fi}}
+
+%D In case the auto split feature is not needed or even not
+%D even wanted, \type{\gotobox} can be used.
+
+%D --- NOG IN HANDLEIDING ---
+
+\unexpanded\def\gotobox#1[#2]%
+ {\dontleavehmode
+ \bgroup
+ \locationstrutfalse
+ %\leaveoutervmode
+ \doifreferencefoundelse{#2}
+ {\dogotofixed{#1}[#2]}
+ {\hbox{\unknownreference{#2}#1}}%
+ \referenceinfo{<}{#2}%
+ \egroup}
+
+%D An reference to another document can be specified as a file
+%D or as an \URL. Both are handled by the same mechanism and
+%D can be issued by saying something like:
+%D
+%D \starttyping
+%D \goto[dictionary::the letter a]
+%D \stoptyping
+%D
+%D The macros that are responsible for handling these
+%D references, use the next six variables:
+
+\let\otherlabel = \empty
+\let\fileprefix = \empty
+\def\otherfile {\jobname}
+\let\otherURL = \empty
+\let\otherprefix = \empty
+\let\dowithdocdes = \empty
+
+%D One can imagine that many references to such a dictionary
+%D are made, so in most cases such a document reference in an
+%D indirect one.
+%D
+%D \showsetup{useexternaldocument}
+%D
+%D For example:
+%D
+%D \starttyping
+%D \useexternaldocument
+%D [dictionary][engldict]
+%D [The Famous English Dictionary]
+%D \stoptyping
+%D
+%D The next macro implements these relations, and also take
+%D care of loading the document specific references.
+
+\def\useexternaldocument%
+ {\dotripleargument\douseexternaldocument}
+
+\def\douseexternaldocument[#1][#2][#3]%
+ {\bgroup
+ \ifsecondargument
+ \doifelsenothing{#1}
+ {\douseexternaldocument[#2][#2][#3]}
+ {\doifelsenothing{#3}
+ {\douseexternaldocument[#1][#2][#2]}
+ {\doifsomething{#2}
+ {\setgvalue{\v!file:::#1}{\doexternaldocument{}{#2}{#3}}% just \do
+ \doif\@@rfstate\v!start
+ {\doifparentfileelse{#2}
+ {\showmessage\m!references{21}{#2}}
+ {\dodouseexternaldocument{#1}{#2}}}}}}%
+ \else
+ \dodouseexternaldocument{#1}{#1}%
+ \fi
+ \egroup}
+
+\def\dodouseexternaldocument#1#2%
+ {\bgroup % prevents wrong loading of \jobname
+ \def\fileprefix{#1::}%
+ \let\setglobalcrossreference\setoutercrossreference
+ \usereferences[#2]%
+ \egroup % when called nested
+ \showmessage\m!references{21}{#2}}
+
+%D The \URL\ alternative takes four arguments:
+%D
+%D \showsetup{useURL}
+%D
+%D like:
+%D
+%D \starttyping
+%D \useURL
+%D [dictionary][http://www.publisher.com/public][engldict]
+%D [The Famous English Dictionary]
+%D \stoptyping
+%D
+%D Several specifications are possible:
+%D
+%D \starttyping
+%D \useURL [id] [url] [file] [description]
+%D \useURL [id] [url] [file]
+%D \useURL [id] [url]
+%D \stoptyping
+%D
+%D This time we don't load the references when no file is
+%D specified. This is logical when one keeps in mind that a
+%D valid \URL\ can also be a mail address.
+
+\def\useURL
+ {\bgroup
+ \protectlabels
+ \catcode`\#=\@@other\catcode`\%=\@@other\catcode`\/=\@@other
+ \catcode`\_=\@@other\catcode`\~=\@@other\catcode`\:=\@@other
+ \dodoubleempty\douseURL}
+
+\def\douseURL[#1][#2]%
+ {\egroup\doquadrupleempty\dodouseURL[#1][#2]}
+
+\let\useurl\useURL
+
+\def\dodouseURL[#1][#2][#3][#4]% to be redone: not too tricky redefs ad reuse
+ {\iffirstargument
+ \iffourthargument\setgvalue{\v!file:::#1}{\doexternaldocument{#2}{#3}{#4}}\else
+ \ifthirdargument \setgvalue{\v!file:::#1}{\doexternalurl {#2}{#3}{#1}}\else
+ \ifsecondargument\setgvalue{\v!file:::#1}{\doexternalurl {#2}{} {#1}}\fi\fi\fi
+ \fi}
+
+\def\doexternalurl#1#2#3%
+ {\bgroup
+ \doifsomething\@@urstyle{\let\@@iastyle\@@urstyle\let\@@urstyle\empty}%
+ \doifsomething\@@urcolor{\let\@@iacolor\@@urcolor\let\@@urcolor\empty}%
+ \doexternaldocument{#1}{#2}{\url[#3]}%
+ \egroup}
+
+\def\doifurldefinedelse #1{\doifdefinedelse{\v!file:::#1}}
+\def\doiffiledefinedelse#1{\doifdefinedelse{\v!file:::#1}}
+
+%D \macros
+%D {url,setupurl}
+%D
+%D We also have: \type{\url} for directly calling the
+%D description. So we can say:
+%D
+%D \starttyping
+%D \useURL [one] [http://www.test.nl]
+%D \useURL [two] [http://www.test.nl] [] [Some Site]
+%D
+%D \url[one] or \from[two] or \goto{Whatever Site}[URL(two)]
+%D \stoptyping
+%D
+%D An \URL\ can be set up with
+%D
+%D \showsetup{setupurl}
+
+\def\setupurl
+ {\dodoubleargument\getparameters[\??ur]}
+
+\unexpanded\def\url[#1]% slow
+ {\bgroup
+ \processaction
+ [\@@uralternative]
+ [ \v!none=>\chardef\urlsplitmode\zerocount,
+ \v!both=>\chardef\urlsplitmode\plusone,
+ \v!after=>\chardef\urlsplitmode\plustwo,
+ \v!before=>\chardef\urlsplitmode\plusthree]%
+ \doifelse\@@urspace\v!yes
+ {\setbetweenisolatedwords{\scratchskip\currentspaceskip\hskip\zeropoint\!!plus.2\scratchskip}}
+ {\setbetweenisolatedwords\allowbreak}%
+ \def\doexternaldocument##1##2##3{\hyphenatedurl{##1}}% awful hack
+ \dostartattributes\??ur\c!style\c!color{}%
+ \getvalue{\v!file:::#1}%
+ \dostopattributes
+ \egroup}
+
+%D This macro is hooked into a support macro, and thereby
+%D \URL's break ok, according to the setting of a switch,
+%D
+%D \startbuffer
+%D \useURL
+%D [test]
+%D [sentence_sentence%sentence#sentence~sentence/sentence//sentence:sentence.sentence]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Such an \URL\ is, depending on the settings, hyphenated as:
+%D
+%D \getbuffer
+%D
+%D \startlinecorrection
+%D \hbox to \hsize
+%D {\hss\en
+%D \setupreferencing[urlalternative=both]%
+%D \vbox{\hsize.25cm\hbox{\bf both}\prewordbreak\url[test]}%
+%D \hss
+%D \setupreferencing[urlalternative=before]%
+%D \vbox{\hsize.25cm\hbox{\bf before}\prewordbreak\url[test]}%
+%D \hss
+%D \setupreferencing[urlalternative=after]%
+%D \vbox{\hsize.25cm\hbox{\bf after}\prewordbreak\url[test]}%
+%D \hss}
+%D \stoplinecorrection
+%D
+%D By setting \type{urlspace=yes} one can get slightly better
+%D spacing when using very long \URL's.
+
+%D Many macro definitions ago we called for the auxiliary macro
+%D \type {\setouterlocation} and now is the time to define this
+%D one.
+
+\newconditional\forceURLlocation
+
+\def\setouterfilelocation#1#2#3%
+ {\edef\otherURL{#1}%
+ \edef\otherfile{#2}}%
+
+\def\setouterlocation#1%
+ {\ifcsname\v!file:::#1\endcsname
+ \let\doexternaldocument\setouterfilelocation % will change
+ \let\doexternalurl \setouterfilelocation % will change
+ \csname\v!file:::#1\endcsname
+ \else
+ \ifconditional\forceURLlocation
+ \edef\otherURL{#1}%
+ \let\otherfile\empty
+ \else
+ \let\otherURL\empty
+ \edef\otherfile{#1}%
+ \fi
+ \fi
+ \setfalse\forceURLlocation
+ \doifparentfileelse\otherfile
+ {\let\otherURL\empty
+ \let\otherfile\empty
+ \global\let\otherlabel\empty
+ \let\otherprefix\empty}
+ {\xdef\otherlabel{#1}%
+ \edef\otherprefix{#1::}}}
+
+%D When defining the external source of information, one can
+%D also specify a suitable name (the last argument). This name
+%D can be called upon with:
+%D
+%D \showsetup{from}
+%D
+%D As can be expected, this macro used \type{\goto} to
+%D perform its task.
+
+\def\dospecialfrom % retest this one !
+ {\dosingleempty\dodospecialfrom}
+
+\def\dodospecialfrom[#1]%
+ {\dontleavehmode % added, but probably not needed
+ \bgroup
+ \protectlabels % needed for active french :'s
+ \iffirstargument
+ \edef\!!stringa{#1}%
+ \doifincsnameelse{::}\!!stringa\donothing{\edef\!!stringa{#1::}}%
+ \expanded{\redospecialfrom[\!!stringa]}%
+ \else
+ \expanded{\nodospecialfrom[\otherlabel]}%
+ \fi
+ \egroup}
+
+\def\redospecialfrom[#1::#2]%
+ {\ifcsname\v!file:::#1\endcsname
+ \def\doexternaldocument##1##2##3{\goto{##3}[#1::#2]}%
+ \csname\v!file:::#1\endcsname
+ \else
+ \tttf[#1]%
+ \fi}
+
+\def\nodospecialfrom[#1]%
+ {\ifcsname\v!file:::#1\endcsname
+ \def\doexternaldocument##1##2##3{##3}% different than ^
+ \csname\v!file:::#1\endcsname
+ \else
+ \tttf[#1]%
+ \fi}
+
+%D We also support:
+%D
+%D \starttyping
+%D \goto{some text}[file(identifier{location}]
+%D \stoptyping
+%D
+%D which is completely equivalent with
+%D
+%D \starttyping
+%D \goto{some text}[identifier::location]
+%D \stoptyping
+%D
+%D The fastest implementation would be:
+
+\definespecialtest\v!file {\setfalse\forceURLlocation\handlespecialFILEandURL}
+\definespecialtest\v!URL {\settrue \forceURLlocation\handlespecialFILEandURL}
+\definespecialtest\v!url {\settrue \forceURLlocation\handlespecialFILEandURL}
+
+\definespeciallocation\v!file{\setfalse\forceURLlocation\handlespecialallocationFILEandURL}
+\definespeciallocation\v!URL {\settrue \forceURLlocation\handlespecialallocationFILEandURL}
+\definespeciallocation\v!url {\settrue \forceURLlocation\handlespecialallocationFILEandURL}
+
+\def\handlespecialFILEandURL
+ {\localdoifreferencefoundelse
+ {\currentreferenceoperation::\currentreferencearguments}}
+
+\def\handlespecialallocationFILEandURL
+ {\let\currentouterreference\currentreferenceoperation
+ \let\currentinnerreference\currentreferencearguments
+ \let\currentreferenceoperation\empty
+ \let\currentreferencearguments\empty
+ \gotoouterlocation}
+
+%D Now we have file references as special ones, it's rather
+%D logical to have the viewer specific ones available in a dual
+%D way too. At first glance we could do with:
+%D
+%D \starttyping
+%D \definespeciallocation\v!action
+%D {\getreferenceelements\currentreferenceoperation
+%D \handleexecreference}
+%D \stoptyping
+%D
+%D An better alternative, slower but error aware, is
+
+% \definespecialtest\v!actie
+% {\localdoifreferencefoundelse\currentreferenceoperation}
+
+\definespecialtest\v!action % rather ugly action(whatever{argument})
+ {\expanded{\localdoifreferencefoundelse{\currentreferenceoperation
+ \ifx\currentreferencearguments\empty\else{\currentreferencearguments}\fi}}}
+
+\definespeciallocation\v!action
+ {\handleexecreference}
+
+%D So now we can say:
+%D
+%D \starttyping
+%D \goto{some action}[PreviousJump]
+%D \stoptyping
+%D
+%D as well as:
+%D
+%D \starttyping
+%D \goto{some text}[action(PreviousJump]
+%D \stoptyping
+
+%D A special case of references are those to programs. These,
+%D very system dependant references are implemented by abusing
+%D some of the previous macros.
+%D
+%D \showsetup{setupprograms}
+%D \showsetup{defineprogram}
+%D \showsetup{program}
+%D
+%D The latter gives access to the description of the program,
+%D being the last argument to the definition command.
+
+\def\setupprograms
+ {\dodoubleargument\getparameters[\??pr]}
+
+\def\dodefineprogram[#1][#2][#3]%
+ {\setgvalue{\v!program:::#1}{\doprogram{#2}{#3}}}
+
+\def\defineprogram
+ {\dotripleargument\dodefineprogram}
+
+\def\program#1[#2]%
+ {\bgroup
+ \ifcsname\v!program:::#2\endcsname
+ \def\doprogram##1##2{\goto{\doifelsenothing{#1}{##2}{#1}}[\v!program(#2)]}%
+ \csname\v!program:::#2\endcsname
+ \else
+ {\tttf[#2]}%
+ \fi
+ \egroup}
+
+% needs an update: program(abc{arg})
+
+\definespeciallocation\v!program#1#2%
+ {\bgroup
+ \iflocation
+ \ifcsname\v!program:::\currentreferenceoperation\endcsname
+ \def\doprogram##1##2{\def\@@programfile{##1}}%
+ \getvalue{\v!program:::\currentreferenceoperation}%
+ \else
+ \let\@@programfile\currentreferenceoperation
+ \fi
+ \defconvertedcommand\ascii\@@programfile
+ \dohandlegoto
+ {#2}%
+ {\dostartrunprogram\buttonwidth\buttonheight{\@@prdirectory\ascii}\currentreferencearguments}%
+ {\dostoprunprogram}%
+ \else
+ {#2}%
+ \fi
+ \egroup}
+
+%D As we can see, we directly use the special reference
+%D mechanism, which means that
+%D
+%D \starttyping
+%D \goto{some text}[program(name{args})]
+%D \stoptyping
+%D
+%D is valid.
+
+%D The next macro provides access to the actual pagenumbers.
+%D When documenting and sanitizing the original reference
+%D macros, I decided to keep the present meaning as well as to
+%D make this meaning available as a special reference method.
+%D So now one can use:
+%D
+%D \starttyping
+%D \gotopage{some text}[location]
+%D \gotopage{some text}[number]
+%D \gotopage{some text}[file::number]
+%D \stoptyping
+%D
+%D as well as:
+%D
+%D \starttyping
+%D \goto{some text}[page(location)]
+%D \goto{some text}[page(number)]
+%D \goto{some text}[file::page(number)]
+%D \stoptyping
+%D
+%D Here location is a keyword like \type{nextpage}.
+%D
+%D \showsetup{gotopage}
+
+\def\dodefinepage[#1][#2]%
+ {\setvalue{\v!page:::#1}{#2}}
+
+\def\definepage
+ {\dodoubleargument\dodefinepage}
+
+\definepage [\v!firstpage] [\firstpage]
+\definepage [\v!previouspage] [\prevpage]
+\definepage [\v!nextpage] [\nextpage]
+\definepage [\v!lastpage] [\lastpage]
+\definepage [\v!firstsubpage] [\firstsubpage]
+\definepage [\v!previoussubpage] [\prevsubpage]
+\definepage [\v!nextsubpage] [\nextsubpage]
+\definepage [\v!lastsubpage] [\lastsubpage]
+\definepage [\v!first] [\firstpage]
+\definepage [\v!previous] [\prevpage]
+\definepage [\v!next] [\nextpage]
+\definepage [\v!last] [\lastpage]
+\definepage [\v!first\v!sub] [\firstsubpage]
+\definepage [\v!previous\v!sub] [\prevsubpage]
+\definepage [\v!next\v!sub] [\nextsubpage]
+\definepage [\v!last\v!sub] [\lastsubpage]
+
+%D Because we combine both methods, we have to take care of
+%D the \type{file::page(n)} as well as \type{page(file::n)}.
+
+\definespeciallocation\v!page#1#2% page(n) page(+n) page(-n)
+ {\iflocation
+ \ifx\currentouterreference\empty
+ \splitoffreference\currentreferenceoperation
+ \else
+ \let\currentinnerreference\currentreferenceoperation
+ \fi
+ \ifx\currentouterreference\empty
+ \doifinstringelse+\currentinnerreference{\edef\currentinnerreference{\the\numexpr\realpageno\currentinnerreference}}
+ {\doifinstring -\currentinnerreference{\edef\currentinnerreference{\the\numexpr\realpageno\currentinnerreference}}}%
+ \doifnonzeropositiveelse\currentinnerreference\donothing{\edef\currentinnerreference{1}}%
+ \docheckrealreferencepage\currentinnerreference % new
+ \let\currentrealreference\currentinnerreference % handy to have this available
+ \gotorealpage\empty\empty\currentinnerreference{#2}%
+ \else
+ \setouterlocation\currentouterreference
+ \doifnonzeropositiveelse\currentinnerreference\donothing{\edef\currentinnerreference{\executeifdefined{\v!page:::\currentinnerreference}1}}%
+ \gotorealpage\otherURL\otherfile\currentinnerreference{#2}%
+ \fi
+ \else
+ {#2}%
+ \fi}
+
+\def\gotopage#1[#2]%
+ {\goto{#1}[\v!page(#2)]}
+
+%D A still very rudimentary|/|experimental forward|/|backward
+%D reference mechanism is provided by the macro \type{\atpage}:
+%D
+%D \starttyping
+%D ... \somewhere{backward text}{forward text}[someref] ...
+%D ... \atpage[someref] ...
+%D \stoptyping
+%D
+%D In future versions there will be more sophisticated
+
+%D support, also suitable for references to floating bodies.
+
+\unexpanded\def\somewhere#1#2#3[#4]% #3 gobbles space around #2
+ {\dontleavehmode
+ %\leaveoutervmode
+ \doifreferencefoundelse{#4}
+ {\ifforwardreference
+ \doifelsenothing{#1}
+ {\dosymbolreference{}{}[#4]}
+ {\dogotospace{#1}[#4]}%
+ \else
+ \doifelsenothing{#2}
+ {\dosymbolreference{}{}[#4]}
+ {\dogotospace{#2}[#4]}%
+ \fi}
+ {\unknownreference{#4}#1/#2}%
+ \referenceinfo{<}{#4}}
+
+\unexpanded\def\atpage[#1]%
+ {\dontleavehmode
+ %\leaveoutervmode
+ \doifreferencefoundelse{#1}
+ {\ifrealreferencepage
+ \ifforwardreference
+ \dogotofixed{\labeltext\v!hencefore}[#1]%
+ \else
+ \dogotofixed{\labeltext\v!hereafter}[#1]%
+ \fi
+ \else
+ \dogotofixed{\labeltexts\v!atpage\currentpagereference}[#1]%
+ \fi}
+ {\unknownreference{#1}%
+ \labeltexts\v!page\dummyreference}%
+ \referenceinfo{<}{#1}}
+
+%D We can cross link documents by using:
+%D
+%D \showsetup{coupledocument}
+%D
+%D like:
+%D
+%D \starttyping
+%D \coupledocument[print][somefile][chapter,section]
+%D \stoptyping
+%D
+%D After which when applicable, we have available the
+%D references:
+%D
+%D \starttyping
+%D \goto{print version}[print::chapter]
+%D \stoptyping
+%D
+%D and alike. The title placement definition macros have a
+%D key \type{file}, which is interpreted as the file to jump
+%D to, that is, when one clicks on the title.
+
+\let\crossdocumentreferences\empty
+\let\crossdocumentelements\empty
+
+\newif\ifautocrossdocument
+
+\def\docoupledocument[#1][#2][#3][#4]% is this :/- safe ?
+ {\ifthirdargument
+ \begingroup
+ \def\dolistelement##1##2##3##4##5##6% 2=aut 6=pag / 2 goes into text ref slot
+ {\global\utilitydonetrue %{Watch the braces here below!}
+ \setglobalcrossreference{{##1::\@@filterblocknumberpart[##5]}}{}{##6}{##2}}%
+ \def\usereferences[##1]%
+ %{\setbox0\vbox{\doutilities{#3}{##1}{#3}\relax\relax}}%
+ {\startnointerference
+ \doutilities{#3}{##1}{#3}\relax\relax
+ \stopnointerference}%
+ \douseexternaldocument[#1][#2][#4]%
+ \doglobal\addtocommalist{#1}\crossdocumentreferences
+ \def\docommand##1%
+ {\letgvalue{\??rf##1\c!state}\v!start % for fast checking
+ \doglobal\addtocommalist{##1}\crossdocumentelements}%
+ \processcommalist[#3]\docommand
+ \ifutilitydone
+ \global\autocrossdocumenttrue
+ \fi
+ \endgroup
+ \fi}
+
+\def\coupledocument
+ {\doquadrupleempty\docoupledocument}
+
+%D --- STRANGE HERE, BETTER IN CORE-NAV ---
+
+\def\checkcontrastreference#1%
+ {\ifnum\currentreferencetype=\rt!page\ifnum\currentdatareference=\realpageno
+ \doifdefined{#1\c!contrastcolor}{\setevalue{#1\c!color}{\getvalue{#1\c!contrastcolor}}}%
+ \fi\fi}
+
+\def\checkcontrastreference#1%
+ {\ifnum\currentreferencetype=\rt!page\relax\ifnum\currentdatareference=\realpageno
+ \copycsname#1\c!color\endcsname\csname#1\c!contrastcolor\endcsname
+ \fi\fi}
+
+%D Buttons are just what their names says: things that can be
+%D clicked (pushed) on. They are similar to \type{\goto},
+%D except that the text argument is not interpreted.
+%D Furthermore one can apply anything to them that can be done
+%D with \type{\framed}.
+%D
+%D \startbuffer
+%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D This command is formally specified as:
+%D
+%D \showsetup{button}
+%D
+%D The characteristics can be set with:
+%D
+%D \showsetup{setupbuttons}
+
+\def\setupbuttons
+ {\dodoubleargument\getparameters[\??bt]}
+
+\definecomplexorsimpleempty\button
+
+\def\complexbutton
+ {\docomplexbutton\??bt}
+
+\presetlocalframed[\??bt]
+
+\long\def\docomplexbutton#1[#2]#3#4% get rid of possible space before [#4]
+ {\dodocomplexbutton#1[#2]{#3}#4} % #4 == [
+
+\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
+
+\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later
+ {\bgroup
+ \doifvalue{#1\c!state}\v!stop\locationfalse
+ \iflocation
+ \resetgoto
+ \ConvertConstantAfter\doifelse{#3}\v!none\hphantom\hbox
+ {\doifelsenothing{#4}
+ {\setlocationboxnop#1[#2]{#3}[#4]}
+ {\doifreferencefoundelse{#4}
+ {\setlocationboxyes#1[#2]{#3}[#4]}
+ {\unknownreference{#4}%
+ \setlocationboxnop#1[#2]{#3}[#4]}}}%
+ \fi
+ \egroup}
+
+%D Interaction buttons, in fact a row of tiny buttons, are
+%D typically only used for navigational purposed. The next
+%D macro builds such a row based on a specification list.
+%D
+%D \startbuffer
+%D \interactionbuttons
+%D [width=\hsize][page,PreviousJump,ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D Apart from individual entries, one can use \type{page} and
+%D \type {subpage} as shortcuts to their four associated buttons.
+%D The symbols are derived from the symbols linked to the
+%D entries.
+
+% does not work well with for instance SomeRef{whatever}
+
+\def\interactionbuttons
+ {\dodoubleempty\dointeractionbuttons}
+
+\def\dointeractionbuttons[#1][#2]% er is een verdeel macro \horizontalfractions
+ {\iflocation
+ % BUG: fails when frame=off; best is to rewrite this macro
+ \bgroup
+ \doif\@@ibstate\v!stop\locationfalse
+ \iflocation
+ \ifsecondargument
+ \setupinteractionbar[#1]%
+ \checkinteractionbar{1.5em}\v!broad\!!zeropoint % brrrrr
+ \setbox2\hbox
+ {\localframed[\??ib][\c!background=]{\symbol[\@@iasymbolset][\v!previouspage]}}%
+ \!!heighta\ht2 % needed because we default to nothing
+ \setupinteractionbar[\c!strut=\v!no]%
+ \setinteractionparameter\c!width\!!zeropoint
+ \!!counta\zerocount % new, was 1
+ \processallactionsinset
+ [#2]
+ [ \v!page=>\advance\!!counta 4,
+ \v!subpage=>\advance\!!counta 4,
+ \s!unknown=>\advance\!!counta 1]%
+ \ifdim\@@ibwidth=\zeropoint
+ \!!widtha2em
+ \advance\!!widtha \@@ibdistance % new
+ \!!widthb\!!counta\!!widtha
+ \advance\!!widthb -\@@ibdistance % new
+ \else
+ \!!widtha\@@ibwidth
+ \!!widthb\@@ibdistance % new
+ \multiply\!!widthb \!!counta % new
+ \advance\!!widthb -\@@ibdistance % new
+ \advance\!!widtha -\!!widthb % new
+ \divide\!!widtha \!!counta
+ \!!widthb\@@ibwidth
+ \fi
+ \def\goto##1% clash ?
+ {\setnostrut
+ \edef\localreference{##1}%
+ \expanded{\dodocomplexbutton\??ib[\c!height=\the\!!heighta,\c!width=\the\!!widtha]}%
+ {\dontleavehmode\symbol[\@@iasymbolset][\localreference]}%
+ [\localreference]%
+ \hss}%
+ \hbox to \!!widthb
+ {\processallactionsinset
+ [#2]
+ [ \v!page=>\goto\v!firstpage
+ \goto\v!nextpage
+ \goto\v!previouspage
+ \goto\v!lastpage,
+ \v!subpage=>\goto\v!firstsubpage
+ \goto\v!nextsubpage
+ \goto\v!previoussubpage
+ \goto\v!lastsubpage,
+ \s!unknown=>\goto\commalistelement]%
+ \unskip}%
+ \else
+ \interactionbuttons[][#1]%
+ \fi
+ \fi
+ \egroup
+ \fi}
+
+%D \macros
+%D {overlaybutton}
+%D
+%D For converience we provide:
+%D
+%D \starttyping
+%D \overlaybutton[reference]
+%D \stoptyping
+%D
+%D This command can be used to define overlays an/or can be
+%D used in the whatevertext areas, like:
+%D
+%D \starttyping
+%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}]
+%D \setupbackgrounds[page][background=PrevPage]
+%D \setuptexttexts[\overlaybutton{NextPage}]
+%D \stoptyping
+%D
+%D For practical reasons, this macro accepts square brackets
+%D as well as braces.
+
+\definecomplexorsimple\overlaybutton
+
+\def\simpleoverlaybutton#1%
+ {\complexoverlaybutton[#1]}
+
+\def\complexoverlaybutton[#1]%
+ {\iflocation
+ \doifreferencefoundelse{#1}
+ {\overlayfakebox {#1}}
+ {\unknownreference{#1}}%
+ \fi}
+
+\def\overlayfakebox#1%
+ {\hbox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\overlaywidth
+ \ht\scratchbox\overlayheight
+ \locationstrutfalse
+ \gotolocation{#1}{\box\scratchbox\presetgoto}}}
+
+%D \macros
+%D {dotextprefix}
+%D
+%D In previous macros we used \type {\dotextprefix} to
+%D generate a space between a label and a number.
+%D
+%D \starttyping
+%D \dotextprefix{text}
+%D \stoptyping
+%D
+%D Only when \type {text} is not empty, a space is inserted.
+
+\def\dotextprefix#1%
+ {\bgroup
+ \global\labeltextdonefalse % this is an ugly dependancy,
+ \setbox\scratchbox\hbox{#1}% to be solved some day
+ \ifdim\wd\scratchbox>\zeropoint
+ \unhbox\scratchbox
+ \iflabeltextdone\else\@@rfseparator\fi
+ \else
+ \unhbox\scratchbox
+ \fi
+ \egroup}
+
+%D Plugin code:
+
+%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.
+
+\setupreferencing
+ [\c!state=\v!start,
+ \c!autofile=\v!no,
+ \v!part\c!number=\v!yes,
+ \v!chapter\c!number=\v!no,
+ \c!interaction=\v!all,
+ %\c!urlalternative=\v!both,
+ %\c!urlspace=\v!no,
+ %\c!urlletter=,
+ %\c!urlkleur=,
+ \c!convertfile=\v!no,
+ %\c!strut=\v!no, % some day an option
+ \c!prefix=,
+ \c!width=.75\makeupwidth,
+ \c!left=\quotation\bgroup,
+ \c!right=\egroup,
+ \c!global=\v!no,
+ \c!expansion=\v!no,
+ \c!separator=\nonbreakablespace]
+
+\setupurl
+ [\c!alternative=\v!both,
+ \c!space=\v!no,
+ \c!style=\v!type,
+ \c!color=]
+
+\setupprograms
+ [\c!directory=]
+
+%D We cannot set up buttons (not yet, this one calls a menu macro):
+
+% under consideration:
+%
+% \setupinteraction[state=start]
+%
+% \unprotect
+%
+% \chardef\rt!extern=5
+%
+% \definesystemreferencehandler \rt!extern \handleexecreference
+%
+% \definespecialtest\v!extern
+% {\expanded{\localdoifreferencefoundelse{\currentreferenceoperation
+% \ifx\currentreferencearguments\empty\else{\currentreferencearguments}\fi}}}
+%
+% \definespeciallocation\v!extern
+% {\handleexecreference}
+%
+% \def\defineexternalreference[#1]%
+% {\setglobalsystemreference\rt!extern{#1}{#1}}
+%
+% \protect
+%
+% \defineexternalreference[NewOne]
+%
+% \def\PDFexecuteNewOne{/SomeNewAction /SomeParameter (\argumentA)}
+%
+% \starttext
+%
+% \goto{test}[AVDP{../../nach-dateipfad.pdf}]
+% \blank
+% \goto{test}[external(AVDP{../../nach-dateipfad.pdf})]
+% \blank
+% \goto{test}[AVDP{../../nach-dateipfad.pdf}]
+% \blank
+% \goto{test}[external(AVDP{../../nach-dateipfad.pdf})]
+% \blank
+% \goto{test}[CloseDocument]
+% \blank
+% \goto{test}[action(CloseDocument)]
+%
+% \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv
new file mode 100644
index 000000000..8290a1b13
--- /dev/null
+++ b/tex/context/base/strc-ref.mkiv
@@ -0,0 +1,1851 @@
+%D \module
+%D [ file=strc-ref,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Cross Referencing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+% todo: (1) configure references, (2) rendering => with presets
+%
+% \definestructureconversionset[default][Character,number,Romannumerals,Character][number]
+% \definestructureseparatorset [default][.,.,--][.]
+% \setupstructurehead[subsection][sectionstopper=),sectionsegments=4:4]
+% \setupreferencestructureprefix[default][prefixsegments=2:4]
+% \setupreferencestructureprefix[figure][default][prefixsegments=3:4]
+% \chapter {One}
+% \section {One}
+% \subsection[sec:test]{Two}
+% See \in[sec:test] and \in[fig:xx] and \in[fig:yy]
+% \placefigure[here][fig:xx]{}{}
+% \placefigure[here][fig:yy]{}{}
+
+\writestatus{loading}{ConTeXt Structure Macros / Cross Referencing}
+
+\registerctxluafile{strc-ref}{1.001}
+\registerctxluafile{node-ref}{1.001}
+
+\unprotect
+
+%D This module is a (partial) rewrite of core-ref.tex for \MKIV. As
+%D such it will be a moving target for a while.
+
+%D Later we will do a further cleanup and move much of the code to
+%D \LUA\ (i.e.\ better backend integration).
+
+\let\mainreference\gobblefivearguments
+
+% this will go when we got rid of the tuo file
+
+\let\currentfolioreference \!!zerocount % only used in xml-fo
+\let\resetreferences \relax
+\let\setreferences \relax
+\let\showcurrentreference \relax
+\let\setexecutecommandcheck\gobbletwoarguments
+
+\def\s!full{full}
+\def\s!user{user}
+\def\s!text{text}
+\def\s!page{page}
+
+% todo : unknown/illegal reference no arg
+% todo : +n pages check on 'samepage' (contrastcolor)
+% todo : multiple text in reference
+
+% Makes more sense to build action data first, especially now
+% openaction etc are supported.
+%
+% \definespecial\doexecuteactionchain w h
+% \definespecial\dosetgotolocation
+% \definespecial\dosetexecuteJScode
+% ...
+
+%D This module deals with referencing. In \CONTEXT\ referencing
+%D is one of the core features, although at a first glance
+%D probably nobody will notice. This is good, because
+%D referencing should be as hidden as possible.
+%D
+%D In paper documents, referencing comes down to cross
+%D referencing, but in their interactive counterparts, is also
+%D involves navigation. Many features implemented here are
+%D therefore closely related to navigation.
+%D
+%D Many \CONTEXT\ commands can optionally be fed with a
+%D reference. Such a reference, when called upon, returns the
+%D number of a figure, table, chapter etc, a piece of text, or
+%D a pagenumber.
+%D
+%D There are three ways of defining a reference:
+%D
+%D \starttyping
+%D \pagereference[here]
+%D \textreference[here]{some text}
+%D \stoptyping
+%D
+%D the third alternative combines them in:
+%D
+%D \starttyping
+%D \reference[here]{some text}
+%D \stoptyping
+
+\unexpanded\def\textreference {\dosingleargument\dotextreference}
+\unexpanded\def\pagereference {\dosingleargument\dopagereference}
+\unexpanded\def\reference {\dosingleargument\doreference }
+\unexpanded\def\setreference {\dodoubleargument\dosetreference }
+
+%D These are implemented in a low level form as:
+
+\def\dotextreference [#1]{\dodosetreference\s!text{#1}{}}
+\def\dopagereference [#1]{\dodosetreference\s!page{#1}{}{}}
+\def\doreference [#1]{\dodosetreference\s!full{#1}{}}
+\def\dosetreference[#1][#2]{\dodosetreference\s!user{#1}{#2}{}}
+
+%D Actually there is not much difference between a text and a
+%D full reference, but it's the concept that counts. The low
+%D level implementation is:
+
+\newcount\lastreferenceattribute
+\newcount\lastdestinationattribute
+
+\def\dofinishfullreference#1#2{\normalexpanded{\ctxlatelua{jobreferences.enhance("#1","#2")}}}
+\def\dofinishtextreference#1#2{\normalexpanded{\ctxlatelua{jobreferences.enhance("#1","#2",{})}}}
+
+\let\dofinishpagereference\dofinishfullreference
+\let\dofinishuserreference\dofinishfullreference
+
+\def\dodosetreference#1#2#3#4% kind labels userdata text -> todo: userdata
+ {\ifreferencing
+ \edef\currentreferencekind{#1}%
+ \edef\currentreferencelabels{#2}%
+ \edef\currentreferenceexpansion{\@@rfexpansion}% {\referenceparameter\c!expansion}
+ \ifx\currentreferencelabels\empty \else
+ \ifx\currentreferenceexpansion\s!xml
+ \xmlstartraw
+ \xdef\currentreferencedata{#4}% data, no text else conflict
+ \xmlstopraw
+ \globallet\currentreferencecoding\s!xml
+ \else
+ \ifx\currentreferenceexpansion\v!yes
+ \xdef\currentreferencedata{#4}%
+ \else
+ \xdef\currentreferencedata{\detokenize{#4}}%
+ \fi
+ \globallet\currentreferencecoding\s!tex
+ \fi
+ % beware, the jobreferences.set writes a
+ % \setnextinternalreference
+ \ctxlua{jobreferences.setandgetattribute("\currentreferencekind", "\referenceprefix","\currentreferencelabels",
+ {
+ references = {
+ % internal = \nextinternalreference, % no need for an internal as we have an explicit
+ block = "\currentstructureblock",
+ section = structure.sections.currentid(),
+ },
+ metadata = {
+ kind = "#1",
+ catcodes = \the\catcodetable,
+ xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
+ },
+ \ifx\currentreferencedata\empty\else
+ entries = {
+ text = \!!bs\currentreferencedata\!!es
+ },
+ \fi
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ },"\@@iafocus")
+ }%
+ \xdef\currentdestinationattribute{\number\lastdestinationattribute}%
+ \begingroup\attribute\destinationattribute\currentdestinationattribute\hbox{}\endgroup % todo
+ \fi
+ \fi}
+
+\def\defaultreferencepage#1{[[[#1]]]}
+\def\defaultreferencetext#1{[[[#1]]]}
+
+%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
+%D reference.
+
+%D \macros
+%D {everyreference}
+%D
+%D For rather tricky purposes, one can assign sanitizing
+%D macros to \type{\everyreference} (no longer that relevant).
+
+\newevery \everyreference \relax
+
+%D This is really needed, since for instance Polish has a
+%D different alphabet and needs accented entries in registers.
+
+\appendtoks
+ \cleanupfeatures
+\to \everyreference
+
+%D We did not yet discuss prefixing. Especially in interactive
+%D documents, it's not always easy to keep track of duplicate
+%D references. The prefix mechanism, which we will describe
+%D later on, solves this problem. By (automatically) adding a
+%D prefix one keeps references local, but the global ones in
+%D view. To enable this feature, we explictly split the prefix
+%D from the reference.
+
+\let\referenceprefix\empty
+
+%D For a long time the only way to access an external file was
+%D to use the file prefix (\type {somefile::}. However, when
+%D you split up a document, redefining the references may be
+%D such a pain, that another approach is feasible. By setting
+%D the \type {autofile} variable to \type {yes} or \type
+%D {page}, you can access the reference directly.
+%D
+%D \starttabulate[||||]
+%D \NC filename::tag \NC page(filename::pnum) \NC tag \NC\NR
+%D \NC $\star$ \NC \NC \NC\NR
+%D \NC $\star$ \NC $\star$ \NC $\star$ \NC\NR
+%D \NC \NC $\star$ \NC \NC\NR
+%D \stoptabulate
+
+\def\usereferences[#1]% not yet
+ {\writestatus\m!systems{references from other files are handled automatically}}
+
+%D As mentioned we will also use the cross reference mechanism
+%D for navigational purposes. The main reason for this is that
+%D we want to treat both categories alike:
+%D
+%D \starttyping
+%D \goto{go back}[PreviousJump]
+%D \goto{colofon}[colofon page]
+%D \stoptyping
+%D
+%D Here \type{PreviousJump} is handled by the viewer, while the
+%D \type{colofon page} reference is, apart from hyperlinking, a
+%D rather normal reference.
+%D
+%D We already saw that cross refences are written to and read
+%D from a file. The pure navigational ones don't need to be
+%D written to file, but both for fast processing and
+%D transparant integration, they are saved internally as a sort
+%D of reference. We can easily distinguish such system
+%D references from real cross reference ones by their tag.
+%D
+%D We also use the odd/even characteristic to determine the
+%D page state.
+
+\let\currentrealreference \empty
+\let\currentpagereference \empty
+\let\currenttextreference \empty
+\let\currentreferenceorder \empty
+\let\currentsubtextreference \empty
+\let\currentsubsubtextreference\empty
+
+\newcount\referencepagestate % set in backend
+\newcount\referencehastexstate % set in backend
+
+% referencepagestate:
+%
+% 0 = no page ref, 1=same page, 2=before, 3=after
+
+%D Text references can contain more than one entry and
+%D therefore we check for
+%D
+%D \starttyping
+%D {entry}
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D {{entry}{entry}{entry}}
+%D \stoptyping
+%D
+%D and split accordingly.
+
+%D Cross references appear as numbers (figure~1.1, chapter~2)
+%D or pagenumbers (page~2, page 3--2), and are called with
+%D \type{\in} and \type{\at}. In interactive documents we also
+%D have \type{\goto}, \type{\button} and alike. These are more
+%D versatile and look like:
+%D
+%D \starttyping
+%D \goto[reference]
+%D \goto[outer reference::]
+%D \goto[outer reference::inner reference]
+%D \goto[operation(argument)]
+%D \goto[operation(action{argument,argument})]
+%D \goto[action]
+%D \goto[action{argument}]
+%D \stoptyping
+%D
+%D The first one is a normal reference, the second and third
+%D are references to a file or \URL. The brace delimited
+%D references for instance refer to a \JAVASCRIPT. The last
+%D example shows that we can pass arguments to the actions.
+%D
+%D When we split off the components of such a reference, the
+%D results are available in:
+%D
+%D \starttyping
+%D \currentreferencespecial
+%D \currentreferenceoperation
+%D \currentreferencearguments
+%D \currentinnerreference
+%D \currentouterreference
+%D \currentfullreference
+%D \stoptyping
+
+\newif\ifreferencefound
+
+% \let\currentfullreference \empty
+% \let\currentreferencespecial \empty
+% \let\currentreferenceoperation\empty
+% \let\currentreferencearguments\empty
+% \let\currentouterreference \empty
+% \let\currentinnerreference \empty
+
+%D Now we've come to the testing step. As we can see below,
+%D this macro does bit more than testing: it also resolves
+%D the reference. This means that whenever we test for the
+%D existance of a reference at an outer level, we have all the
+%D relevant properties of that reference avaliable inside the
+%D true branche~(\type{#2}).
+%D
+%D The prefix has to do with localizing references. When a
+%D prefix is set, looking for a reference comes to looking for
+%D the prefixed one, and when not found, looking for the non
+%D prefixed one. Consider for instance the prefix set to
+%D \type{sidetrack}.
+%D
+%D \starttyping
+%D \pagereference[important]
+%D \pagereference[unimportant]
+%D \setupreferencing[prefix=sidetrack]
+%D \pagereference[important]
+%D \stoptyping
+%D
+%D results in saving (writing) the references
+%D
+%D \starttyping
+%D ...{}{important}
+%D ...{}{unimportant}
+%D ...{sidetrack}{important}...
+%D \stoptyping
+%D
+%D Now when we call for \type{unimportant}, we will indeed get
+%D the pagenumber associated to this reference. But when we
+%D call for \type{important}, while the prefix is still set, we
+%D will get the pagenumber bound to the prefixed one.
+%D
+%D {\em Some day, when processing time and memory are no longer
+%D performance factors, we will introduce multi||level
+%D prefixes.}
+%D
+%D Before we start analyzing, I introduce a general
+%D definition macro. Consider:
+%D
+%D \starttyping
+%D \goto{do}[JS(My_Script{"test",123}),titlepage]
+%D \stoptyping
+%D
+%D This can also be achieved by:
+%D
+%D \starttyping
+%D \definereference[startup][JS(My_Script{"test",123}),titlepage]
+%D \goto{do}[startup]
+%D \stoptyping
+%D
+%D Now is this is a handy feature or not?
+%D
+%D \showsetup{definereference}
+%D
+%D We can trace references by setting the next switch to
+%D true.
+
+\unexpanded\def\definereference
+ {\dodoubleempty\dodefinereference}
+
+\def\dodefinereference[#1][#2]%
+ {\ctxlua{jobreferences.define("\referenceprefix","#1",\!!bs\detokenize{#2}\!!es)}}
+
+\def\resetreference[#1]%
+ {\ctxlua{jobreferences.reset("\referenceprefix","#1")}}
+
+\def\setpagereference#1#2% name, specification
+ {\ctxlua{jobreferences.define("","#1",\!!bs\v!page(\luaescapestring{#2})\!!es)}}
+
+%D Chained references are defined as:
+%D
+%D \starttyping
+%D \goto{somewhere}[JS(somescript),nextpage,JS(anotherscript)]
+%D \stoptyping
+%D
+%D Actually supporting chains is up to the special driver. Here
+%D we only provide the hooks.
+
+%D \macros
+%D {highlighthyperlinks}
+%D
+%D The next switch can be used to make user hyperlinks are
+%D not highlighted when clicked on.
+
+\newconditional\highlighthyperlinks \settrue\highlighthyperlinks
+
+%D \macros
+%D {gotonewwindow}
+%D
+%D To make the {\em goto previous jump} feature more
+%D convenient when using more than one file, it makes sense
+%D to force the viewer to open a new window for each file
+%D opened.
+
+\newconditional\gotonewwindow \setfalse\gotonewwindow
+
+\def\expandtexincurrentreference % will happen in lua some time
+ {\ifcase\referencehastexstate\else\ctxlua{jobreferences.expandcurrent()}\fi}
+
+\def\doifreferencefoundelse#1#2#3%
+ {\ctxlua{jobreferences.doifelse("\referenceprefix","#1",\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow)}%
+ {\expandtexincurrentreference#2}%
+ {#3}}
+
+%D The tester only splits the reference in components but does
+%D not look into them. The following macro does a preroll and
+%D determines for instance the current real reference pagenumber.
+%D The \type {\currentrealreference} macro does the same so unless
+%D one wants to use the pagestate the next macro seldom needs to
+%D be called.
+
+\def\analyzecurrentreference
+ {\ctxlua{jobreferences.analyse()}}
+
+%D The inner case is simple. Only two cases have to be taken
+%D care of:
+%D
+%D \starttyping
+%D \goto{some text}[reference]
+%D \goto{some text}[prefix:reference]
+%D \stoptyping
+%D
+%D References to other files however are treated strict or
+%D tolerant, depending on their loading and availability:
+%D
+%D \starttyping
+%D \useexternaldocument[somefile][filename][a nice description]
+%D
+%D \goto{checked reference}[somefile::reference]
+%D \goto{unchecked reference}[somefile::]
+%D \goto{unchecked reference}[anotherfile::reference]
+%D \stoptyping
+%D
+%D An unknown reference is reported on the screen, in the log
+%D file and, when enabled, in the left margin of the text.
+
+\def\reportreferenceerror#1#2% only once (keep track in lua)
+ {\ifinpagebody \else
+ \doifconcepttracing{\doifsomething{#2}{\inleft{\infofont\doboundtext{#2}{\dimexpr\leftmarginwidth-2em\relax}{..}->}}}%
+ \fi
+ \showmessage\m!references{#1}{[\referenceprefix][#2]}}
+
+\def\unknownreference{\reportreferenceerror1}
+\def\illegalreference{\reportreferenceerror4}
+
+%D When a reference is not found, we typeset a placeholder
+%D (two glyphs are often enough to represent the reference
+%D text).
+
+\def\dummyreference{{\tttf ??}}
+
+%D To prevent repetitive messages concerning a reference
+%D being defined, we set such an unknown reference to an empty
+%D one after the first encounter.
+
+%D Apart from cross references supplied by the user, \CONTEXT\
+%D generates cross references itself. Most of them are not
+%D saved as a reference, but stored with their source, for
+%D instance a list or an index entry. Such automatically
+%D generated, for the user invisible, references are called
+%D {\em internal references}. The user supplied ones are
+%D labeled as {\em external references}.
+%D
+%D A second important characteristic is that when we want to
+%D support different backends (viewers), we need to support
+%D named destinations as well as page numbers. I invite readers
+%D to take a glance at the special driver modules to understand
+%D the fine points of this. As a result we will deal with {\em
+%D locations} as well as {\em real page numbers}. We explictly
+%D call this pagenumber a real one, because it is independant
+%D of the page numbering scheme used in the document.
+%D
+%D One of the reasons for \CONTEXT\ being the first \TEX\ base
+%D macropackage to support sophisticated interactive \PDF\
+%D files, lays in the mere fact that real page numbers are
+%D available in most two pass data, like references, list data
+%D and index entries.
+%D
+%D We will speak of \type{thisis...} when we are marking a
+%D location, and \type{goto...} when we point to such a
+%D location. The latter one can be seen as a hyperlink to the
+%D former one. In the next macros one we use constructs like:
+%D
+%D \starttyping
+%D \dostart...
+%D \dostop...
+%D \stoptyping
+%D
+%D Such macros are used to invoke the relevant specials from
+%D the special driver modules (see \type{spec-ini}). The flag
+%D \type{\iflocation} signals if we're in interactive mode.
+
+\ifx\buttonheight\undefined \newdimen\buttonheight \fi
+\ifx\buttonwidth \undefined \newdimen\buttonwidth \fi
+
+%D Internal references can best be set using the next few
+%D macros. Setting such references to unique values is
+%D completely up to the macros that call them.
+%D
+%D \starttyping
+%D \thisissomeinternal{tag}{identifier}
+%D \gotosomeinternal {tag}{identifier}{pagenumber}{text}
+%D \stoptyping
+
+%D We could do this in lua ...
+
+\newif \iflocation
+\newcount\locationcount
+\newcount\locationorder
+\newbox \locationbox
+
+\def\nextinternalreference {\the\locationcount}
+\def\nextinternalorderreference{\the\locationorder}
+
+\def\setnextinternalreference
+ {\global\advance\locationcount\plusone}
+
+\def\setnextinternalreferences#1#2% plural
+ {\ctxlua{jobreferences.setnextinternal("#1","#2")}}
+
+\def\getinternalorderreference#1#2%
+ {\ctxlua{jobreferences.currentorder("#1","#2")}}
+
+\def\thisissomeinternal#1#2% tag reference (only for old time sake)
+ {\begingroup\attribute\destinationattribute\ctxlua{jobreferences.mark("#1:#2")}\hbox{}\endgroup}
+
+\def\gotosomeinternal#1#2#3#4%
+ {\ifinternalnamedreferences
+ \directgoto{#4}[#1:#2]%
+ \else
+ \directgoto{#4}[page(#3)]%
+ \fi}
+
+\def\gotonextinternal#1#2%
+ {\directgoto{#1}[internal(#2)]}
+
+%D In this module we define three system references: one for
+%D handling navigational, viewer specific, commands, another
+%D for jumping to special pages, like the first or last one,
+%D and a third reference for linking tree like lists, like
+%D tables of contents. The latter two adapt themselves to the
+%D current state.
+%D
+%D An example of an action is:
+%D
+%D \starttyping
+%D \goto{some action}[PreviousJump]
+%D \stoptyping
+%D
+%D as well as:
+%D
+%D \starttyping
+%D \goto{some text}[\v!action(PreviousJump]
+%D \stoptyping
+
+% compatibility hack
+
+\def\setglobalsystemreference#1#2#3{\definereference[#2][\v!action(#3)]}
+
+\newif\ifreferencing \referencingtrue
+
+%D One can also activate an automatic prefix mechanism. By
+%D setting the \type{\prefix} variable to \type{+}, the prefix
+%D is incremented, when set to \type{-} or empty, the prefix is
+%D reset. Other values become the prefix.
+
+\newcount\prefixcounter
+
+%D These settings are accomplished by:
+%D
+%D \showsetup{setupreferencing}
+%D
+%D In interactive documents verbose references don't always
+%D make sense (what is a page number in an unnumbered
+%D document). By setting the \type{interaction} variable, one
+%D can influences the way interactive references are set.
+
+\chardef\autocrossfilereferences=0
+
+\unexpanded\def\setupreferencing
+ {\dosingleargument\dosetupreferencing}
+
+\def\dosetupreferencing[#1]%
+ {\getparameters
+ [\??rf]
+ [\c!prefix=\s!unknown,#1]%
+ \processaction
+ [\@@rfstate]
+ [ \v!stop=>\referencingfalse,
+ \v!start=>\referencingtrue]%
+ \processaction
+ [\@@rfinteraction]
+ [ \v!all=>\let\dowantedreference\docompletereference,
+ \v!label=>\let\dowantedreference\dolabelonlyreference,
+ \v!text=>\let\dowantedreference\dotextonlyreference,
+ \v!symbol=>\let\dowantedreference\dosymbolreference]%
+ \chardef\autocrossfilereferences\zerocount
+ \processaction
+ [\@@rfautofile]
+ [ \v!yes=>\chardef\autocrossfilereferences\plusone,
+ \v!page=>\chardef\autocrossfilereferences\plustwo]%
+ \chardef\referencefilecase\zerocount
+ \processaction[\@@rfconvertfile]
+ [ \v!yes=>\chardef\referencefilecase\plusone,
+ \v!big=>\chardef\referencefilecase\plusone,
+ \v!small=>\chardef\referencefilecase\plustwo]%
+ \setupreferenceprefix[\@@rfprefix]%
+ \doifelse\@@rfglobal\v!yes
+ {\settrue \autoglobalfilereferences}
+ {\setfalse\autoglobalfilereferences}}
+
+% \appendtoks\ctxlua{jobreferences.export("whatever")}\to\everystoptext
+% \starttext
+% \chapter[test]{test}
+% test \in{IN}[more] and \in{IN}[test] or \at{AT}[more] and \at{AT}[test]\par
+% test \in{IN}[whatever::more] and \in{IN}[whatever::test] or \at{AT}[whatever::more] and \at{AT}[whatever::test] \page
+% reference\reference[more]{oeps}
+% \stoptext
+
+\def\exportreferences
+ {\doif\@@rfexport\v!yes{\ctxlua{jobreferences.export()}}}
+
+\appendtoks
+ \exportreferences
+\to \everygoodbye
+
+\def\incrementreferenceprefix{+}
+\def\decrementreferenceprefix{-}
+
+\unexpanded\def\setupreferenceprefix[#1]%
+ {\edef\@@rfprefix{#1}%
+ \ifx\@@rfprefix\empty
+ \let\referenceprefix\empty
+ \else\ifx\@@rfprefix\incrementreferenceprefix
+ \advance\prefixcounter \plusone % should be global
+ \edef\referenceprefix{\the\prefixcounter:}%
+ \let\@@rfprefix\s!unknown
+ \else\ifx\@@rfprefix\decrementreferenceprefix
+ \let\referenceprefix\empty
+ \let\@@rfprefix\s!unknown
+ \else\ifx\@@rfprefix\s!unknown
+ % forget about it
+ \else
+ \edef\referenceprefix{\@@rfprefix:}%
+ \fi\fi\fi\fi}
+
+%D The most straightforward way of retrieving references is
+%D using \type{\ref}. Consider the reference:
+%D
+%D \startbuffer
+%D \reference[my ref]{{Look}{Here}{I am}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D We can ask for upto five reference components:
+%D
+%D \startbuffer
+%D user page reference: \ref[p][my ref]
+%D text reference: \ref[t][my ref]
+%D real page reference: \ref[r][my ref]
+%D sub text reference: \ref[s][my ref]
+%D extra text reference: \ref[e][my ref]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D And get back:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D
+%D This is a cheap compatibility hack. Don't use this command
+%D as there will be more advanced access to user data.
+
+\def\ref{\dodoubleargument\doref}
+
+\def\reftypep{\currentreferencepage}
+\def\reftypet{\currentreferencetext}
+\def\reftyper{\currentreferencepage}
+\def\reftypes{\currentreferencetext}
+\def\reftypee{\currentreferencetext}
+
+\def\doref[#1][#2]%
+ {\ifsecondargument
+ \doifreferencefoundelse{#2}
+ {\executeifdefined{reftype#1}\reftypep}
+ {\unknownreference{#2}\dummyreference}%
+ \else
+ \dummyreference
+ \fi}
+
+%D We can typeset a reference using \type{\in}, \type{\at} and
+%D \type{\about} and goto specific locations using
+%D \type{\goto}. The last one does not make that much sense in
+%D a paper document. To complicate things, \PLAIN\ \TEX\ also
+%D implements an \type {\in} but fortunately that one only
+%D makes sense in math mode.
+%D
+%D Typesetting the reference is a bit more complicated than one
+%D would at first sight expect. This is due to the fact that we
+%D distinguish three (five) alternative calls:
+%D
+%D \placefigure
+%D [here][three calls]
+%D {Three alternatives reference calls.}
+%D {\startcombination[1*3]
+%D {\framed{\type{ \in }}} {a}
+%D {\framed{\type{ \at }}} {b}
+%D {\framed{\type{\goto}}} {c}
+%D \stopcombination}
+%D
+%D \startbuffer
+%D \in figure[fig:three calls]
+%D \in{figure}[fig:three calls]
+%D \in figure a[fig:three calls]
+%D \in{figure}{a}[fig:three calls]
+%D figure~\in[fig:three calls]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This turns up as:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D
+%D The dual \type{{}} results in a split reference. In a
+%D document meant for paper, one is tempted to use the last
+%D (most straightforward) alternative. When a document is also
+%D meant voor electronic distribution, the former alternatives
+%D have preference, because everything between the \type{\in}
+%D and~\type{[} becomes active (and when asked for, typeset
+%D in a different color and typeface).
+
+% \unexpanded\def\in {\mathortext\donormalmathin \dospecialin}
+% \unexpanded\def\at {\mathortext\donormalmathat \dospecialat}
+% \unexpanded\def\about{\mathortext\donormalmathabout\dospecialabout}
+% \unexpanded\def\from {\mathortext\donormalmathfrom \dospecialfrom}
+% \unexpanded\def\over {\mathortext\donormalmathover \dospecialabout}
+
+% \definecommand in {\dospecialin}
+% \definecommand at {\dospecialat}
+% \definecommand about {\dospecialabout}
+% \definecommand from {\dospecialfrom}
+% \definecommand over {\dospecialabout} % needed here, else math problems
+
+\def\currentreferencenumber {\ctxlua{jobreferences.filter("number")}}
+\def\currentreferencepage {\ctxlua{jobreferences.filter("page")}}
+\def\currentreferencetitle {\ctxlua{jobreferences.filter("title")}}
+\def\currentreferencetext {\ctxlua{jobreferences.filter("text")}}
+\def\currentreferencedefault {\ctxlua{jobreferences.filter("default")}}
+\def\currentreferencerealpage{\ctxlua{jobreferences.realpage()}}
+
+\def\getreferenceentry#1{\ctxlua{jobreferences.filter("#1")}} % user entry
+
+\unexpanded\def\dospecialabout[#1]%
+ {\dontleavehmode
+ \begingroup
+ \let\crlf\space
+ \let\\\space
+ \postponenotes
+ \@@rfleft
+ \doifreferencefoundelse{#1}
+ {\goto{\limitatetext\currentreferencetitle\@@rfwidth\unknown}[#1]}% not so efficient (dup lookup)
+ {}% todo
+ \@@rfright
+ \endgroup}
+
+%D The previously discussed setup macro lets us specify the
+%D representation of references. A symbol reference does not
+%D show the specific data, like the number of a figure, but
+%D shows one of: \hbox {$^\goforwardcharacter$
+%D $^\gobackwardcharacter$ $^\gonowherecharacter$}, depending
+%D on the direction to go.
+
+% 1 = whatever
+% 2 = forward, following page
+% 3 = backward, preceding page
+% 4 = forward, same page
+% 5 = backward, same page
+
+% Yet untested:
+
+\unexpanded\def\somewhere#1#2#3[#4]% #3 gobbles space around #2 % todo
+ {\doifreferencefoundelse{#4}% kind of inefficient as \goto also analyses
+ {\goto{\analyzecurrentreference\ifcase\referencepagestate\relax#1/#2\or#2\or#1\or#2\fi}[#4]}
+ {[#1/#2]}}
+
+\unexpanded\def\atpage[#1]% todo
+ {\doifreferencefoundelse{#1}% kind of inefficient as \goto also analyses
+ {\goto{\analyzecurrentreference\ifcase\referencepagestate
+ \labeltexts\v!page\dummyreference
+ \or
+ \labeltexts\v!atpage\currentreferencepage
+ \or
+ \labeltexts\v!atpage\currentreferencepage
+ \or
+ \labeltexts\v!atpage\currentreferencepage
+ \or
+ \labeltext\v!hereafter
+ \or
+ \labeltext\v!hencefore
+ \fi}[#1]}
+ {[?]}}
+
+\unexpanded\def\referencesymbol
+ {\hbox{\strut\high
+ {\setupsymbolset[\@@iasymbolset]%
+ \symbol
+ [\ifcase\referencepagestate
+ \v!somewhere
+ \or % same
+ \v!nowhere
+ \or % before
+ \v!previous
+ \or % after
+ \v!next%
+ \fi]}}}
+
+% \def\dosymbolreference#1#2[#3]%
+% {\removeunwantedspaces
+% \goto{\setupsymbolset[\@@iasymbolset]\high{\symbol
+% [\ifcase\referencepagestate
+% \v!somewhere
+% \or % same
+% \v!nowhere
+% \or % before
+% \v!previous
+% \or % after
+% \v!next%
+% \fi]}}[#3]}
+
+\def\dosymbolreference#1#2[#3]%
+ {\removeunwantedspaces
+ \goto{\referencesymbol}[#3]}
+
+\def\symbolreference[#1]%
+ {\removeunwantedspaces
+ \goto{\referencesymbol}[#1]}
+
+
+%D The other alternatives just conform their names: only the
+%D label, only the text, or the label and the text.
+
+\def\dounknownreference#1#2[#3]%
+ {\unknownreference{#3}\dotextprefix{#2}\dummyreference}%
+
+\def\docompletereference#1#2[#3]%
+ {\goto{\dotextprefix{#2}#1}[#3]}
+
+% \def\dolabelonlyreference#1#2[#3]%
+% {\doifsomespaceelse{#2}% space?
+% {\doifsomething{#2}{\goto{#2}[#3]}}
+% {\goto{\dotextprefix{#2}}[#3]}}
+
+\def\dolabelonlyreference#1#2[#3]%
+ {\goto{\dotextprefix{#2}}[#3]}
+
+\def\dotextonlyreference#1#2[#3]%
+ {\dotextprefix{#2}\goto{#1}[#3]}
+
+\let\dowantedreference\docompletereference
+
+%D \macros
+%D {definereferenceformat}
+%D
+%D The next few macros were made for for David Arnold and Taco
+%D Hoekwater. They can be used for predefining reference
+%D texts, and thereby stimulate efficiency.
+%D
+%D [more documentation will be added]
+%D
+%D \starttyping
+%D \definereferenceformat[informula] [left=(,right=),text=formula]
+%D \definereferenceformat[informulas] [left=(,right=),text=formulas]
+%D \definereferenceformat[andformula] [left=(,right=),text=and]
+%D \definereferenceformat[andformulas][left=(,right=),text=and]
+%D
+%D \informula [b] and \informula [for:c]
+%D the \informula {formulas}[b] \informula {and} [for:c]
+%D the \informulas {formulas}[b] \informula {and} [for:c]
+%D the \informulas [b] \informula {en} [for:c]
+%D the \informulas [b] \andformula [for:c]
+%D \stoptyping
+%D
+%D Instead of a text, one can specify a label, which should
+%D be defined with \type {\setuplabeltext}.
+
+% todo: inherit; probably not yet mkiv okay
+
+\unexpanded\def\definereferenceformat
+ {\dodoubleargument\dodefinereferenceformat}
+
+\def\dodefinereferenceformat[#1][#2]%
+ {\iffirstargument
+ \getparameters[\??rf#1]
+ [\c!left=, % of the number
+ \c!right=, % of the number
+ \c!text=, % before the number
+ \c!label=, % can be {left}{right}
+ \c!command=\in,
+ #2]%
+ \setuvalue{#1}%
+ {\dontleavehmode\doexecutereferenceformat{#1}}%
+ \fi}
+
+\def\noexecutelabelreferenceformat#1%
+ {\doifvaluesomething{\??rf#1\c!text}{\gdef\textofreference{\csname\??rf#1\c!text\endcsname}}%
+ \csname\??rf#1\c!command\endcsname}
+
+\def\doexecutelabelreferenceformat#1%
+ {\csname\??rf#1\c!command\endcsname
+ {\leftlabeltext {\csname\??rf#1\c!label\endcsname}}%
+ {\rightlabeltext{\csname\??rf#1\c!label\endcsname}}}
+
+\def\doexecutereferenceformat#1%
+ {\gdef\leftofreference {\csname\??rf#1\c!left \endcsname}%
+ \gdef\rightofreference{\csname\??rf#1\c!right\endcsname}%
+ \global\let\textofreference\empty % otherwise ~ added
+ \doifelsevaluenothing{\??rf#1\c!label}\noexecutelabelreferenceformat\doexecutelabelreferenceformat{#1}}
+
+\let\leftofreference \relax
+\let\rightofreference\relax
+\let\textofreference \relax
+
+% fails on metafun {\leftofreference#1\ignorespaces#3\removeunwantedspaces\rightofreference}{#2}[#4]%
+%
+% \def\dodododoinatreference#1#2#3[#4]% no \removeunwantedspaces (fails on metafun)
+% {\ifx\next\bgroup
+% \dododododoinatreference{\leftofreference#1\ignorespaces#3\rightofreference}{#2}[#4]%
+% \else
+% \dododododoinatreference{\leftofreference#1\rightofreference}{#2#3}[#4]%
+% \fi}
+%
+% \def\dododododoinatreference#1#2[#3]%
+% {\dontleavehmode % replaces \leaveoutervmode
+% \begingroup
+% \postponenotes
+% \doifreferencefoundelse{#3}
+% {\doifelsenothing{#1}\dosymbolreference\dowantedreference{#1}{#2}[#3]}%
+% {\dounknownreference{#1}{#2}[#3]}%
+% \endgroup}
+
+% \starttext
+% \definereferenceformat[inxx] [left=(,right=),text=txt]
+% \setupinteraction[state=start]
+% \chapter[one]{xx}
+% [\goto{state}[file(mk-last-state)]]
+% [\goto{state} [file(mk-last-state)]]
+% [\at{page} [one]]
+% [\at{page}[one]]
+% [\at{page}{okay}[one]]
+% [\inxx{a}{b}[one]]
+% \stoptext
+
+\unexpanded\def\dospecialin{\let\currentreferencecontent\currentreferencedefault\doinatreference}
+\unexpanded\def\dospecialat{\let\currentreferencecontent\currentreferencepage \doinatreference}
+
+\newtoks\leftreferencetoks
+\newtoks\rightreferencetoks
+
+\def\doinatreference
+ {\futurelet\next\doinatreferenceone}
+
+\def\doinatreferenceone
+ {\ifx\next\bgroup
+ \afterassignment\doinatreferenceonetwo
+ \expandafter\leftreferencetoks
+ \else
+ \leftreferencetoks\emptytoks
+ \expandafter\dodoinatreferencenone
+ \fi}
+
+\def\doinatreferenceonetwo
+ {\futurelet\next\doinatreferencetwo}
+
+\def\doinatreferencetwo
+ {\ifx\next\bgroup
+ \afterassignment\dodoinatreferenceboth
+ \expandafter\rightreferencetoks
+ \else
+ \rightreferencetoks\emptytoks
+ \expandafter\dodoinatreferenceleft
+ \fi}
+
+\def\dodoinatreferencenone
+ {\dodoinatreferenceindeed
+ {\leftofreference\currentreferencecontent\rightofreference}
+ {}}
+
+\def\dodoinatreferenceleft
+ {\dodoinatreferenceindeed
+ {\leftofreference\currentreferencecontent\rightofreference}
+ {\the\leftreferencetoks}}
+
+\def\dodoinatreferenceboth
+ {\dodoinatreferenceindeed
+ {\leftofreference\currentreferencecontent\the\rightreferencetoks\rightofreference}
+ {\the\leftreferencetoks}}
+
+\def\dodoinatreferenceindeed#1#2#3[#4]% #3 gobbles space
+ {\dontleavehmode % replaces \leaveoutervmode
+ \begingroup
+ \postponenotes
+ \doifreferencefoundelse{#4}
+ {\doifelsenothing{#1}\dosymbolreference\dowantedreference{#1}{#2}[#4]}%
+ {\dounknownreference{#1}{#2}[#4]}%
+ \endgroup}
+
+\let\dosymbolreference\dowantedreference
+
+%D In interactive documents going to a specific location is not
+%D bound to cross references. The \type{\goto} commands can be
+%D used to let users access another part of the document. In
+%D this respect, interactive tables of contents and registers
+%D can be considered goto's. Because in fact a \type{\goto} is
+%D just a reference without reference specific data, the
+%D previous macros are implemented using the goto
+%D functionality.
+%D
+%D \showsetup{goto}
+%D
+%D One important characteristic is that the first argument of
+%D \type{\goto} (and therefore \type{\at} and \type{\in} is
+%D split at spaces. This means that, although hyphenation is
+%D prevented, long references can cross line endings.
+
+% \starttext
+% \setupinteraction[state=start]
+% [\goto{state}[file(mk-last-state)]]
+% [\goto{state} [file(mk-last-state)]]
+% \stoptext
+
+\newconditional\uselocationstrut \settrue\uselocationstrut
+
+\def\extrareferencearguments{\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow,"\currentviewerlayer"}
+
+\unexpanded\def\directgoto{\ifconditional\uselocationstrut\expandafter\dodirectgoto\else\expandafter\directgotohtdp\fi}
+\unexpanded\def\goto {\ifconditional\uselocationstrut\expandafter\dogoto \else\expandafter\gotohtdp \fi}
+
+% The unbox trick is needed in order to permit \par inside a reference. Otherwise
+% the reference attribute migrates to the outer boxes.
+
+\newbox\referencebox
+
+\def\dodirectgoto#1[#2]% no test for valid references
+ {\dontleavehmode
+ \begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.inject("\referenceprefix","#2",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
+ \setlocationattributes\??ia
+ \setstrut % can be option
+ \attribute\referenceattribute\lastreferenceattribute
+ \fi
+ #1%
+ \endgroup}
+
+\def\dodirectgotohtdp#1[#2]% no test for valid references
+ {\dontleavehmode
+ \begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.inject("\referenceprefix","#2",\number\dimexpr\@@iaheight\relax,\number\dimexpr\@@iadepth\relax,\extrareferencearguments)}%
+ \setlocationattributes\??ia
+ \attribute\referenceattribute\lastreferenceattribute
+ \fi
+ #1%
+ \endgroup}
+
+\def\dogoto#1#2[#3]% #2 gobbles spaces after #1 so that \goto{xx} [yy] works ok
+ {\dontleavehmode
+ \begingroup
+ %\setbox\referencebox\hbox\bgroup % experiment, might change again to non \par support
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.doifelse("\referenceprefix","#3",\extrareferencearguments)}%
+ {\expandtexincurrentreference
+ \ctxlua{jobreferences.injectcurrentset(\number\ht\strutbox,\number\dp\strutbox)}%
+ \setlocationattributes\??ia
+ \setstrut % can be option
+ \attribute\referenceattribute\lastreferenceattribute}%
+ {\unknownreference{#3}}%
+ \fi
+ #1%
+ %\egroup\unhbox\referencebox}
+ \endgroup}
+
+\def\dogotohtdp#1#2[#3]% #2 gobbles spaces after #1 so that \goto{xx} [yy] works ok
+ {\dontleavehmode
+ \begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.doifelse("\referenceprefix","#3",\extrareferencearguments)}%
+ {\expandtexincurrentreference
+ \ctxlua{jobreferences.injectcurrentset(\number\dimexpr\@@iaheight\relax,\number\dimexpr\@@iadepth\relax)}%
+ \setlocationattributes\??ia
+ \attribute\referenceattribute\lastreferenceattribute}%
+ {\unknownreference{#3}}%
+ \fi
+ #1%
+ \endgroup}
+
+\unexpanded\def\directgotobox#1[#2]% no test for valid references
+ {\dontleavehmode
+ \begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}%
+ \setlocationattributes\??ia
+ \hbox attr \referenceattribute \lastreferenceattribute {#1}%
+ \else
+ #1%
+ \fi
+ \endgroup}
+
+\unexpanded\def\directgotospecbox#1#2[#3]% no test for valid references
+ {\dontleavehmode
+ \begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.inject("\referenceprefix","#3",nil,nil,\extrareferencearguments)}%
+ \setlocationcolorspec{#1}% no consequence for strut
+ \hbox attr \referenceattribute \lastreferenceattribute {#2}%
+ \else
+ #2%
+ \fi
+ \endgroup}
+
+\unexpanded\def\directgotodumbbox#1[#2]% no test for valid references
+ {\dontleavehmode
+ \begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}%
+ \hbox attr \referenceattribute \lastreferenceattribute {#1}%
+ \else
+ #1%
+ \fi
+ \endgroup}
+
+\unexpanded\def\gotobox#1[#2]% no test for valid references
+ {\dontleavehmode
+ \begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \iflocation
+ \ctxlua{jobreferences.doifelse("\referenceprefix","#2",\extrareferencearguments)}%
+ {\expandtexincurrentreference
+ \ctxlua{jobreferences.injectcurrentset(nil,nil)}%
+ \setlocationattributes\??ia
+ \hbox attr \referenceattribute \lastreferenceattribute {#1}}%
+ {\unknownreference{#2}}%
+ \else
+ #1%
+ \fi
+ \endgroup}
+
+%D An reference to another document can be specified as a file
+%D or as an \URL. Both are handled by the same mechanism and
+%D can be issued by saying something like:
+%D
+%D \starttyping
+%D \goto[dictionary::the letter a]
+%D \stoptyping
+%D
+%D One can imagine that many references to such a dictionary
+%D are made, so in most cases such a document reference in an
+%D indirect one.
+%D
+%D \showsetup{useexternaldocument}
+%D
+%D For example:
+%D
+%D \starttyping
+%D \useexternaldocument
+%D [dictionary][engldict]
+%D [The Famous English Dictionary]
+%D \stoptyping
+%D
+%D The next macro implements these relations, and also take
+%D care of loading the document specific references.
+%D
+%D The \URL\ alternative takes four arguments:
+%D
+%D \showsetup{useURL}
+%D
+%D like:
+%D
+%D \starttyping
+%D \useURL
+%D [dictionary][http://www.publisher.com/public][engldict]
+%D [The Famous English Dictionary]
+%D \stoptyping
+%D
+%D Several specifications are possible:
+%D
+%D \starttyping
+%D \useURL [id] [url] [file] [description]
+%D \useURL [id] [url] [file]
+%D \useURL [id] [url]
+%D \stoptyping
+%D
+%D This time we don't load the references when no file is
+%D specified. This is logical when one keeps in mind that a
+%D valid \URL\ can also be a mail address.
+
+\unexpanded\def\usefile{\dotripleargument\dousefile} % so that they can be used in expanded arguments
+\unexpanded\def\useurl {\doquadrupleempty\douseurl } % so that they can be used in expanded arguments
+
+\let\useURL \useurl
+\let\useexternaldocument\usefile
+
+\def\douseurl[#1][#2][#3][#4]%
+ {\ctxlua{jobreferences.urls.define("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es,\!!bs\detokenize{#4}\!!es)}}
+
+\def\dousefile[#1][#2][#3]%
+ {\ctxlua{jobreferences.files.define("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
+
+\def\doifurldefinedelse #1{\ctxlua{commands.doifurldefinedelse ("#1")}}
+\def\doiffiledefinedelse#1{\ctxlua{commands.doiffiledefinedelse("#1")}}
+
+%D \macros
+%D {url,setupurl}
+%D
+%D We also have: \type{\url} for directly calling the
+%D description. So we can say:
+%D
+%D \starttyping
+%D \useURL [one] [http://www.test.nl]
+%D \useURL [two] [http://www.test.nl] [] [Some Site]
+%D
+%D \url[one] or \from[two] or \goto{Whatever Site}[URL(two)]
+%D \stoptyping
+%D
+%D An \URL\ can be set up with
+%D
+%D \showsetup{setupurl}
+
+\unexpanded\def\setupurl
+ {\dodoubleargument\getparameters[\??ur]}
+
+\unexpanded\def\url[#1]%
+ {\dontleavehmode
+ \begingroup
+ \dosetfontattribute\??ur\c!style
+ \dosetcolorattribute\??ur\c!color
+ \hyphenatedurl{\ctxlua{jobreferences.urls.get("#1","\@@uralternative","\@@urspace")}}%
+ \endgroup}
+
+% # fails
+
+%D This macro is hooked into a support macro, and thereby
+%D \URL's break ok, according to the setting of a switch,
+%D
+%D \startbuffer
+%D \useURL
+%D [test]
+%D [sentence_sentence~sentence//sentence:sentence.sentence]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Such an \URL\ is, depending on the settings, hyphenated as:
+%D
+%D \getbuffer
+%D
+%D \startlinecorrection
+%D \hbox to \hsize
+%D {\hss\en
+%D \setupreferencing[urlalternative=both]%
+%D \vbox{\hsize.25cm\hbox{\bf both}\prewordbreak\url[test]}%
+%D \hss
+%D \setupreferencing[urlalternative=before]%
+%D \vbox{\hsize.25cm\hbox{\bf before}\prewordbreak\url[test]}%
+%D \hss
+%D \setupreferencing[urlalternative=after]%
+%D \vbox{\hsize.25cm\hbox{\bf after}\prewordbreak\url[test]}%
+%D \hss}
+%D \stoplinecorrection
+%D
+%D By setting \type{urlspace=yes} one can get slightly better
+%D spacing when using very long \URL's.
+%D
+%D When defining the external source of information, one can
+%D also specify a suitable name (the last argument). This name
+%D can be called upon with:
+%D
+%D \showsetup{from}
+
+%D We keep this for compatibility reasons, hence the hackery.
+
+\unexpanded\def\dospecialfrom
+ {\dosingleempty\dodospecialfrom}
+
+\def\dodospecialfrom[#1]%
+ {\dontleavehmode
+ \goto{\ctxlua{jobreferences.from("#1")}}[fileorurl(#1)]}
+
+\def\dofromurldescription#1%
+ {#1}
+
+\def\dofromurlliteral#1%
+ {\dosetfontattribute \??ur\c!style
+ \dosetcolorattribute\??ur\c!color
+ \hyphenatedurl{#1}}
+
+\let\dofromfiledescription\dofromurldescription
+\let\dofromfileliteral \dofromurlliteral % maybe some day setupfile that inherits from url
+
+%D We also support:
+%D
+%D \starttyping
+%D \goto{some text}[file(identifier{location}]
+%D \stoptyping
+%D
+%D which is completely equivalent with
+%D
+%D \starttyping
+%D \goto{some text}[identifier::location]
+%D \stoptyping
+
+%D A special case of references are those to programs. These,
+%D very system dependant references are implemented by abusing
+%D some of the previous macros.
+%D
+%D \showsetup{setupprograms}
+%D \showsetup{defineprogram}
+%D \showsetup{program} % changed functionality !
+%D
+%D The latter gives access to the description of the program,
+%D being the last argument to the definition command.
+
+% also lua, like urls and files
+
+\unexpanded\def\setupprograms
+ {\dodoubleargument\getparameters[\??pr]}
+
+\unexpanded\def\defineprogram
+ {\dotripleargument\dodefineprogram}
+
+\def\dodefineprogram[#1][#2][#3]%
+ {\ctxlua{jobreferences.programs.define("#1","#2","#3")}}
+
+\def\program[#1]% incompatible, more consistent, hardy used anyway
+ {\dontleavehmode
+ \begingroup
+ \dosetfontattribute\??pr\c!style
+ \dosetcolorattribute\??pr\c!color
+ \ctxlua{jobreferences.programs.get("#1","\@@pralternative","\@@prspace")}%
+ \endgroup}
+
+%D As we can see, we directly use the special reference
+%D mechanism, which means that
+%D
+%D \starttyping
+%D \goto{some text}[program(name{args})]
+%D \stoptyping
+%D
+%D is valid.
+
+%D The next macro provides access to the actual pagenumbers.
+%D When documenting and sanitizing the original reference
+%D macros, I decided to keep the present meaning as well as to
+%D make this meaning available as a special reference method.
+%D So now one can use:
+%D
+%D \starttyping
+%D \gotopage{some text}[location]
+%D \gotopage{some text}[number]
+%D \gotopage{some text}[file::number]
+%D \stoptyping
+%D
+%D as well as:
+%D
+%D \starttyping
+%D \goto{some text}[page(location)]
+%D \goto{some text}[page(number)]
+%D \goto{some text}[file::page(number)]
+%D \stoptyping
+%D
+%D Here location is a keyword like \type{nextpage}.
+%D
+%D \showsetup{gotopage}
+
+\unexpanded\def\definepage
+ {\dodoubleargument\dodefinepage}
+
+\def\dodefinepage[#1][#2]%
+ {\definereference[#1][page(#1)]}
+
+\def\gotopage#1[#2]%
+ {\goto{#1}[\v!page(#2)]}
+
+%D The previous definitions are somewhat obsolete so we don't
+%D use it here.
+
+%D A still very rudimentary|/|experimental forward|/|backward
+%D reference mechanism is provided by the macro \type{\atpage}:
+%D
+%D \starttyping
+%D ... \somewhere{backward text}{forward text}[someref] ...
+%D ... \atpage[someref] ...
+%D \stoptyping
+%D
+%D In future versions there will be more sophisticated
+
+% 0 = no page reference
+% 1 = same page
+% 2 = preceding page
+% 3 = following page
+% 4 = backward, same page (todo)
+% 5 = forward, same page (todo)
+
+%D We can cross link documents by using:
+%D
+%D \showsetup{coupledocument}
+%D
+%D like:
+%D
+%D \starttyping
+%D \coupledocument[print][somefile][chapter,section]
+%D \stoptyping
+%D
+%D After which when applicable, we have available the
+%D references:
+%D
+%D \starttyping
+%D \goto{print version}[print::chapter]
+%D \stoptyping
+%D
+%D and alike. The title placement definition macros have a
+%D key \type{file}, which is interpreted as the file to jump
+%D to, that is, when one clicks on the title.
+
+\newif\ifautocrossdocument
+
+\def\coupledocument
+ {\doquadrupleempty\docoupledocument}
+
+\def\docoupledocument[#1][#2][#3][#4]% [name] [file] [sections] [description]
+ {\ifthirdargument
+ % this will be done differently (when it's needed)
+ \fi}
+
+%D Buttons are just what their names says: things that can be
+%D clicked (pushed) on. They are similar to \type{\goto},
+%D except that the text argument is not interpreted.
+%D Furthermore one can apply anything to them that can be done
+%D with \type{\framed}.
+%D
+%D \startbuffer
+%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D This command is formally specified as:
+%D
+%D \showsetup{button}
+%D
+%D The characteristics can be set with:
+%D
+%D \showsetup{setupbuttons}
+
+\unexpanded\def\setupbuttons
+ {\dodoubleargument\getparameters[\??bt]}
+
+\definecomplexorsimpleempty\button
+
+\def\complexbutton
+ {\docomplexbutton\??bt}
+
+\presetlocalframed[\??bt]
+
+\long\def\docomplexbutton#1[#2]#3#4% get rid of possible space before [#4]
+ {\dodocomplexbutton#1[#2]{#3}#4} % #4 == [
+
+\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
+
+\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later
+ {\begingroup
+ \doifvalue{#1\c!state}\v!stop\locationfalse
+ \iflocation
+ \ConvertConstantAfter\doifelse{#3}\v!none\hphantom\hbox
+ {\doifelsenothing{#4}
+ {\setlocationboxnop#1[#2]{#3}[#4]}
+ {\doifreferencefoundelse{#4} % INEFFICIENT
+ {\setlocationboxyes#1[#2]{#3}[#4]}
+ {\unknownreference{#4}%
+ \setlocationboxnop#1[#2]{#3}[#4]}}}%
+ \fi
+ \endgroup}
+
+\setupbuttons
+ [\c!state=\v!start]
+
+%D Interaction buttons, in fact a row of tiny buttons, are
+%D typically only used for navigational purposed. The next
+%D macro builds such a row based on a specification list.
+%D
+%D \startbuffer
+%D \interactionbuttons
+%D [width=\hsize][page,PreviousJump,ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D Apart from individual entries, one can use \type{page} and
+%D \type {subpage} as shortcuts to their four associated buttons.
+%D The symbols are derived from the symbols linked to the
+%D entries.
+
+% does not work well with for instance SomeRef{whatever}
+
+\def\interactionbuttons
+ {\dodoubleempty\dointeractionbuttons}
+
+\def\dointeractionbuttons[#1][#2]% er is een verdeel macro \horizontalfractions
+ {\iflocation
+ % BUG: fails when frame=off; best is to rewrite this macro
+ \bgroup
+ \doif\@@ibstate\v!stop\locationfalse
+ \iflocation
+ \ifsecondargument
+ \setupinteractionbar[#1]%
+ \checkinteractionbar{1.5em}\v!broad\!!zeropoint % brrrrr
+ \setbox2\hbox{\localframed[\??ib][\c!background=]{\symbol[\@@iasymbolset][\v!previouspage]}}%
+ \!!heighta\ht2 % needed because we default to nothing
+ \setupinteractionbar[\c!strut=\v!no]%
+ \setinteractionparameter\c!width\!!zeropoint
+ \!!counta\zerocount % new, was 1
+ \processallactionsinset
+ [#2]
+ [ \v!page=>\advance\!!counta 4,
+ \v!subpage=>\advance\!!counta 4,
+ \s!unknown=>\advance\!!counta 1]%
+ \ifdim\@@ibwidth=\zeropoint
+ \!!widtha2em
+ \advance\!!widtha \@@ibdistance % new
+ \!!widthb\!!counta\!!widtha
+ \advance\!!widthb -\@@ibdistance % new
+ \else
+ \!!widtha\@@ibwidth
+ \!!widthb\@@ibdistance % new
+ \multiply\!!widthb \!!counta % new
+ \advance\!!widthb -\@@ibdistance % new
+ \advance\!!widtha -\!!widthb % new
+ \divide\!!widtha \!!counta
+ \!!widthb\@@ibwidth
+ \fi
+ \def\xgoto##1% clash ?
+ {\setnostrut
+ \edef\localreference{##1}%
+ \normalexpanded{\noexpand\dodocomplexbutton\??ib[\c!height=\the\!!heighta,\c!width=\the\!!widtha]}%
+ {\dontleavehmode\symbol[\@@iasymbolset][\localreference]}%
+ [\localreference]%
+ \hss}%
+ \hbox to \!!widthb
+ {\processallactionsinset
+ [#2]
+ [ \v!page=>\xgoto\v!firstpage
+ \xgoto\v!nextpage
+ \xgoto\v!previouspage
+ \xgoto\v!lastpage,
+ \v!subpage=>\xgoto\v!firstsubpage
+ \xgoto\v!nextsubpage
+ \xgoto\v!previoussubpage
+ \xgoto\v!lastsubpage,
+ \s!unknown=>\xgoto\commalistelement]%
+ \unskip}%
+ \else
+ \interactionbuttons[][#1]%
+ \fi
+ \fi
+ \egroup
+ \fi}
+
+%D \macros
+%D {overlaybutton}
+%D
+%D For converience we provide:
+%D
+%D \starttyping
+%D \overlaybutton[reference]
+%D \stoptyping
+%D
+%D This command can be used to define overlays an/or can be
+%D used in the whatevertext areas, like:
+%D
+%D \starttyping
+%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}]
+%D \setupbackgrounds[page][background=PrevPage]
+%D \setuptexttexts[\overlaybutton{NextPage}]
+%D \stoptyping
+%D
+%D For practical reasons, this macro accepts square brackets
+%D as well as braces.
+
+\definecomplexorsimple\overlaybutton
+
+\def\simpleoverlaybutton#1%
+ {\complexoverlaybutton[#1]}
+
+\def\complexoverlaybutton[#1]%
+ {\iflocation
+ \gotobox{\overlayfakebox}[#1]%
+ \fi}
+
+\def\overlayfakebox
+ {\hbox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\overlaywidth
+ \ht\scratchbox\overlayheight
+ \box\scratchbox}}
+
+%D \macros
+%D {dotextprefix}
+%D
+%D In previous macros we used \type {\dotextprefix} to
+%D generate a space between a label and a number.
+%D
+%D \starttyping
+%D \dotextprefix{text}
+%D \stoptyping
+%D
+%D Only when \type {text} is not empty, a space is inserted.
+
+\def\dotextprefix#1%
+ {\begingroup
+ \setbox\scratchbox\hbox{#1}% to be solved some day
+ \ifdim\wd\scratchbox>\zeropoint
+ \unhbox\scratchbox
+ \doifsomething\@@rfseparator{\removeunwantedspaces\@@rfseparator}% remove is new
+ \else
+ \unhbox\scratchbox
+ \fi
+ \endgroup}
+
+%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.
+
+\setupreferencing
+ [\c!state=\v!start,
+ \c!autofile=\v!no,
+ \v!part\c!number=\v!yes,
+ \v!chapter\c!number=\v!no,
+ \c!interaction=\v!all,
+ \c!convertfile=\v!no,
+ %\c!strut=\v!no, % some day an option
+ \c!prefix=,
+ \c!width=.75\makeupwidth,
+ \c!left=\quotation\bgroup,
+ \c!right=\egroup,
+ \c!global=\v!no,
+ \c!expansion=\v!no,
+ \c!separator=\nonbreakablespace,
+ \c!export=\v!no]
+
+\setupurl
+ [\c!alternative=\v!both,
+ \c!space=\v!no,
+ \c!style=\v!type,
+ \c!color=]
+
+\setupprograms
+ [\c!directory=,
+ \c!alternative=\v!both,
+ \c!space=\v!no,
+ \c!style=\v!type,
+ \c!color=]
+
+\definereference [\v!CloseDocument ] [action(close)]
+\definereference [\v!ExitViewer ] [action(exit)]
+\definereference [\v!FirstPage ] [action(first)]
+\definereference [\v!LastPage ] [action(last)]
+\definereference [\v!NextJump ] [action(forward)]
+\definereference [\v!NextPage ] [action(next)]
+\definereference [\v!PauseMovie ] [action(pausemovie)]
+\definereference [\v!PauseSound ] [action(pausesound)]
+\definereference [\v!PauseRendering ] [action(pauserendering)]
+\definereference [\v!PreviousJump ] [action(backward)]
+\definereference [\v!PreviousPage ] [action(previous)]
+\definereference [\v!PrintDocument ] [action(print)]
+\definereference [\v!SaveForm ] [action(exportform)]
+\definereference [\v!LoadForm ] [action(importform)]
+\definereference [\v!ResetForm ] [action(resetform)]
+\definereference [\v!ResumeMovie ] [action(resumemovie)]
+\definereference [\v!ResumeSound ] [action(resumesound)]
+\definereference [\v!ResumeRendering ] [action(resumerendering)]
+\definereference [\v!SaveDocument ] [action(save)]
+\definereference [\v!SaveNamedDocument] [action(savenamed)]
+\definereference [\v!OpenNamedDocument] [action(opennamed)]
+\definereference [\v!SearchDocument ] [action(search)]
+\definereference [\v!SearchAgain ] [action(searchagain)]
+\definereference [\v!StartMovie ] [action(startmovie)]
+\definereference [\v!StartSound ] [action(startsound)]
+\definereference [\v!StartRendering ] [action(startrendering)]
+\definereference [\v!StopMovie ] [action(stopmovie)]
+\definereference [\v!StopSound ] [action(stopsound)]
+\definereference [\v!StopRendering ] [action(stoprendering)]
+\definereference [\v!SubmitForm ] [action(submitform)]
+\definereference [\v!ToggleViewer ] [action(toggle)]
+\definereference [\v!ViewerHelp ] [action(help)]
+\definereference [\v!HideField ] [action(hide)]
+\definereference [\v!ShowField ] [action(show)]
+\definereference [\v!GotoPage ] [action(gotopage)]
+\definereference [\v!GotoPage ] [action(gotopage)]
+\definereference [\v!Query ] [action(query)]
+\definereference [\v!QueryAgain ] [action(queryagain)]
+\definereference [\v!FitWidth ] [action(fitwidth)]
+\definereference [\v!FitHeight ] [action(fitheight)]
+\definereference [\v!ShowThumbs ] [action(thumbnails)]
+\definereference [\v!ShowBookmarks ] [action(bookmarks)]
+
+\definereference [\v!firstpage] [page(firstpage)]
+\definereference [\v!previouspage] [page(previouspage)]
+\definereference [\v!nextpage] [page(nextpage)]
+\definereference [\v!lastpage] [page(lastpage)]
+\definereference [\v!forward] [page(forward)]
+\definereference [\v!backward] [page(backward)]
+\definereference [\v!firstsubpage] [page(firstsubpage)]
+\definereference [\v!previoussubpage] [page(previoussubpage)]
+\definereference [\v!nextsubpage] [page(nextsubpage)]
+\definereference [\v!lastsubpage] [page(lastsubpage)]
+
+% we can do this but only when later in resolve (else problems with \chapter[first]{...}
+%
+% \definereference [\v!first] [page(firstpage)]
+% \definereference [\v!previous] [page(prevpage)]
+% \definereference [\v!next] [page(nextpage)]
+% \definereference [\v!last] [page(lastpage)]
+% \definereference [\v!first\v!sub] [page(firstsubpage)]
+% \definereference [\v!previous\v!sub] [page(prevsubpage)]
+% \definereference [\v!next\v!sub] [page(nextsubpage)]
+% \definereference [\v!last\v!sub] [page(lastsubpage)]
+
+%D We cannot set up buttons (not yet, this one calls a menu macro):
+
+%D New (and experimental):
+
+% \starttext
+% \chapter{test}
+% \placefigure[here][xx:1]{}{\framed{one}} \placefigure[here][xx:2]{}{\framed{three}}
+% \placetable [here][xx:3]{}{\framed{two}} \placetable [here][xx:4]{}{\framed{four}}
+% \start
+% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4]
+% \stop \blank \start
+% \setupreferencestructureprefix[default][prefix=no]
+% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4]
+% \stop \blank \start
+% \setupreferencestructureprefix[float][default][prefix=no]
+% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4]
+% \stop \blank \start
+% \setupreferencestructureprefix[figure][default][prefix=no]
+% \in{fig}[xx:1] and \in{fig}[xx:2] \in{tab}[xx:3] and \in{tab}[xx:4]
+% \stop \blank
+% \stoptext
+
+\unexpanded\def\setupreferencestructureprefix
+ {\dotripleargument\dosetupreferencestructureprefix}
+
+\def\getreferencestructureprefix#1#2#3%
+ {{
+ prefix = "\referencestructureprefixparameter{#1}{#2}{#3}\c!prefix",
+ separatorset = "\referencestructureprefixparameter{#1}{#2}{#3}\c!prefixseparatorset",
+ conversion = "\referencestructureprefixparameter{#1}{#2}{#3}\c!prefixconversion",
+ conversionset = "\referencestructureprefixparameter{#1}{#2}{#3}\c!prefixconversionset",
+ set = "\referencestructureprefixparameter{#1}{#2}{#3}\c!prefixset",
+ segments = "\referencestructureprefixparameter{#1}{#2}{#3}\c!prefixsegments",
+ connector = \!!bs\referencestructureprefixparameter{#1}{#2}{#3}\c!prefixconnector\!!es,
+ }}
+
+\unexpanded\def\setupreferencestructureprefix
+ {\dotripleempty\dosetupreferencestructureprefix}
+
+\def\dosetupreferencestructureprefix[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??rf:\c!prefix:#1:#2][#3]%
+ \else\ifsecondargument
+ \getparameters[\??rf:\c!prefix::#1][#2]%
+ \fi\fi}
+
+\def\referencestructureprefixparameter#1#2#3#4% kind name category parameter
+ {\ifcsname\??rf:\c!prefix:#2:#3#4\endcsname
+ \csname\??rf:\c!prefix:#2:#3#4\endcsname
+ \else\ifcsname\??rf:\c!prefix:#1:#3#4\endcsname
+ \csname\??rf:\c!prefix:#1:#3#4\endcsname
+ \else\ifcsname\??rf:\c!prefix::#3#4\endcsname
+ \csname\??rf:\c!prefix::#3#4\endcsname
+ \fi\fi\fi}
+
+% \def\getreferencestructureprefixspec#1% we can save one call by moving this to the lua end
+% {\getreferencestructureprefix
+% {\ctxlua{jobreferences.get_current_metadata("kind")}}
+% {\ctxlua{jobreferences.get_current_metadata("name")}}
+% {#1}}
+% \def\currentreferencedefault
+% {\ctxlua{jobreferences.filter("default",\getreferencestructureprefixspec\v!default)}}
+%
+% this is shortcut for:
+
+\def\currentreferencedefault
+ {\ctxlua{jobreferences.filter("default",\ctxlua{jobreferences.get_current_prefixspec("\v!default")})}}
+
+\protect \endinput
+
+% tricky:
+%
+% \enabletrackers[nodes.references]
+% \setupinteraction[state=start]
+% \def\KnuthTest{\input knuth }
+% \def\KnuthTest{\input tufte }
+% \def\TufteTest{\input tufte }
+% \defineoverlay[xxx][\overlaybutton{page(3)}]
+% \setupbackgrounds[text][background=xxx]
+% \starttext
+% test {\red \KnuthTest} test \par
+% \button{test}[page(1)] \par
+% \goto{page 2 \TeX}[page(2)] \goto{page 2 \TeX}[page(2)] \goto{\TufteTest}[page(2)] test \page
+% test \goto{page 3}[page(3)] \goto{\TufteTest\space\par\TufteTest}[page(4)] test \page
+% \goto{page 1}[page(1)] \goto{\TufteTest\space test}[page(1)] \page
+% \goto{page 1}[page(1)] \goto{\KnuthTest\space test}[page(1)] \page
+% test \goto{page 1}[page(1)] {\goto{\KnuthTest\space test}[page(1)]} test
+% \goto{page 1}[page(1)] \goto{\TufteTest}[page(1)] test \page
+% \stoptext
diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua
new file mode 100644
index 000000000..c5b2c9374
--- /dev/null
+++ b/tex/context/base/strc-reg.lua
@@ -0,0 +1,735 @@
+if not modules then modules = { } end modules ['strc-reg'] = {
+ version = 1.001,
+ comment = "companion to strc-reg.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, type = next, type
+local texwrite, texsprint, texcount = tex.write, tex.sprint, tex.count
+local format, gmatch, concat = string.format, string.gmatch, table.concat
+local utfchar = utf.char
+local lpegmatch = lpeg.match
+
+local trace_registers = false trackers.register("structure.registers", function(v) trace_registers = v end)
+
+local ctxcatcodes = tex.ctxcatcodes
+
+local variables = interfaces.variables
+
+local helpers = structure.helpers
+local sections = structure.sections
+local documents = structure.documents
+local pages = structure.pages
+local processors = structure.processors
+
+local mappings = sorters.mappings
+local entries = sorters.entries
+local replacements = sorters.replacements
+
+local processor_split = processors.split
+
+local matching_till_depth, number_at_depth = sections.matching_till_depth, sections.number_at_depth
+
+-- some day we will share registers and lists (although there are some conceptual
+-- differences in the application of keywords)
+
+local function filter_collected(names,criterium,number,collected,prevmode)
+ if not criterium or criterium == "" then criterium = variables.all end
+ local data = documents.data
+ local numbers, depth = data.numbers, data.depth
+ local hash, result, all, detail = { }, { }, not names or names == "" or names == variables.all, nil
+ if not all then
+ for s in gmatch(names,"[^, ]+") do
+ hash[s] = true
+ end
+ end
+ if criterium == variables.all or criterium == variables.text then
+ for i=1,#collected do
+ local v = collected[i]
+ if all then
+ result[#result+1] = v
+ else
+ local vmn = v.metadata and v.metadata.name
+ if hash[vmn] then
+ result[#result+1] = v
+ end
+ end
+ end
+ elseif criterium == variables.current then
+ for i=1,#collected do
+ local v = collected[i]
+ local sectionnumber = jobsections.collected[v.references.section]
+ if sectionnumber then
+ local cnumbers = sectionnumber.numbers
+ if prevmode then
+ if (all or hash[v.metadata.name]) and #cnumbers >= depth then -- is the = ok for lists as well?
+ local ok = true
+ for d=1,depth do
+ if not (cnumbers[d] == numbers[d]) then -- no zero test
+ ok = false
+ break
+ end
+ end
+ if ok then
+ result[#result+1] = v
+ end
+ end
+ else
+ if (all or hash[v.metadata.name]) and #cnumbers > depth then
+ local ok = true
+ for d=1,depth do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ end
+ elseif criterium == variables.previous then
+ for i=1,#collected do
+ local v = collected[i]
+ local sectionnumber = jobsections.collected[v.references.section]
+ if sectionnumber then
+ local cnumbers = sectionnumber.numbers
+ if (all or hash[v.metadata.name]) and #cnumbers >= depth then
+ local ok = true
+ if prevmode then
+ for d=1,depth do
+ if not (cnumbers[d] == numbers[d]) then
+ ok = false
+ break
+ end
+ end
+ else
+ for d=1,depth do
+ local cnd = cnumbers[d]
+ if not (cnd == 0 or cnd == numbers[d]) then
+ ok = false
+ break
+ end
+ end
+ end
+ if ok then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ elseif criterium == variables["local"] then
+ if sections.autodepth(data.numbers) == 0 then
+ return filter_collected(names,variables.all,number,collected,prevmode)
+ else
+ return filter_collected(names,variables.current,number,collected,prevmode)
+ end
+ else -- sectionname, number
+ -- beware, this works ok for registers
+ local depth = sections.getlevel(criterium)
+ local number = tonumber(number) or number_at_depth(depth) or 0
+ if trace_registers then
+ detail = format("depth: %s, number: %s, numbers: %s, startset: %s",depth,number,concat(sections.numbers(),".",1,depth),#collected)
+ end
+ if number > 0 then
+ for i=1,#collected do
+ local v = collected[i]
+ local r = v.references
+ if r then
+ local sectionnumber = jobsections.collected[r.section]
+ if sectionnumber then
+ local metadata = v.metadata
+ local cnumbers = sectionnumber.numbers
+ if cnumbers then
+ if (all or hash[metadata.name or false]) and #cnumbers >= depth and matching_till_depth(depth,cnumbers) then
+ result[#result+1] = v
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if trace_registers then
+ if detail then
+ logs.report("registers","criterium: %s, %s, found: %s",criterium,detail,#result)
+ else
+ logs.report("registers","criterium: %s, found: %s",criterium,#result)
+ end
+ end
+ return result
+end
+
+jobregisters = jobregisters or { }
+jobregisters.collected = jobregisters.collected or { }
+jobregisters.tobesaved = jobregisters.tobesaved or { }
+
+jobregisters.filter_collected = filter_collected
+
+-- we follow a different strategy than by lists, where we have a global
+-- result table; we might do that here as well but since sorting code is
+-- older we delay that decision
+
+local tobesaved, collected = jobregisters.tobesaved, jobregisters.collected
+
+local function initializer()
+ tobesaved, collected = jobregisters.tobesaved, jobregisters.collected
+ local internals = jobreferences.internals
+ for name, list in next, collected do
+ local entries = list.entries
+ for e=1,#entries do
+ local entry = entries[e]
+ local r = entry.references
+ if r then
+ local internal = r and r.internal
+ if internal then
+ internals[internal] = entry
+ end
+ end
+ end
+ end
+end
+
+job.register('jobregisters.collected', jobregisters.tobesaved, initializer)
+
+local function allocate(class)
+ local d = tobesaved[class]
+ if not d then
+ d = {
+ metadata = {
+ language = 'en',
+ sorted = false,
+ class = class
+ },
+ entries = { },
+ }
+ tobesaved[class] = d
+ end
+ return d
+end
+
+jobregisters.define = allocate
+
+local entrysplitter = lpeg.Ct(lpeg.splitat('+')) -- & obsolete in mkiv
+
+local tagged = { }
+
+local function preprocessentries(rawdata)
+ local entries = rawdata.entries
+ if entries then
+ local e, k = entries[1] or "", entries[2] or ""
+ local et, kt, entryproc, pageproc
+ if type(e) == "table" then
+ et = e
+ else
+ entryproc, e = processor_split(e)
+ et = lpegmatch(entrysplitter,e)
+ end
+ if type(k) == "table" then
+ kt = e
+ else
+ pageproc, k = processor_split(k)
+ kt = lpegmatch(entrysplitter,k)
+ end
+ entries = { }
+ for k=1,#et do
+ entries[k] = { et[k] or "", kt[k] or "" }
+ end
+ for k=#et,1,-1 do
+ if entries[k][1] ~= "" then
+ break
+ else
+ entries[k] = nil
+ end
+ end
+ rawdata.list = entries
+ if pageproc or entryproc then
+ rawdata.processors = { entryproc, pageproc }
+ end
+ rawdata.entries = nil
+ else
+ rawdata.list = { { "", "" } } -- br
+ end
+end
+
+function jobregisters.store(rawdata) -- metadata, references, entries
+ local data = allocate(rawdata.metadata.name).entries
+ local references = rawdata.references
+ references.realpage = references.realpage or 0 -- just to be sure as it can be refered to
+ preprocessentries(rawdata)
+ data[#data+1] = rawdata
+ local label = references.label
+ if label and label ~= "" then tagged[label] = #data end
+ texwrite(#data)
+end
+
+function jobregisters.enhance(name,n)
+ local r = tobesaved[name].entries[n]
+ if r then
+ r.references.realpage = texcount.realpageno
+ end
+end
+
+function jobregisters.extend(name,tag,rawdata) -- maybe do lastsection internally
+ if type(tag) == "string" then
+ tag = tagged[tag]
+ end
+ if tag then
+ local r = tobesaved[name].entries[tag]
+ if r then
+ local rr = r.references
+ rr.lastrealpage = texcount.realpageno
+ rr.lastsection = structure.sections.currentid()
+ if rawdata then
+ preprocessentries(rawdata)
+ for k,v in next, rawdata do
+ if not r[k] then
+ r[k] = v
+ else
+ local rk = r[k]
+ for kk,vv in next, v do
+ if vv ~= "" then
+ rk[kk] = vv
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+-- sorting and rendering
+
+local compare = sorters.comparers.basic
+
+function jobregisters.compare(a,b)
+ local result = compare(a,b)
+ if result ~= 0 then
+ return result
+ elseif a.metadata.kind == 'entry' then -- e/f/t
+ local page_a, page_b = a.references.realpage, b.references.realpage
+ if not page_a or not page_b then
+ return 0
+ elseif page_a < page_b then
+ return -1
+ elseif page_a > page_b then
+ return 1
+ end
+ end
+ return 0
+end
+
+function jobregisters.filter(data,options)
+ data.result = jobregisters.filter_collected(nil,options.criterium,options.number,data.entries,true)
+end
+
+function jobregisters.prepare(data)
+ -- data has 'list' table
+ local strip = sorters.strip
+ local splitter = sorters.splitters.utf
+ local result = data.result
+ if result then
+ for i=1, #result do
+ local entry, split = result[i], { }
+ local list = entry.list
+ if list then
+ for l=1,#list do
+ local ll = list[l]
+ local word, key = ll[1], ll[2]
+ if not key or key == "" then
+ key = word
+ end
+ split[l] = splitter(strip(key))
+ end
+ end
+ entry.split = split
+ end
+ end
+end
+
+function jobregisters.sort(data,options)
+ sorters.sort(data.result,jobregisters.compare)
+end
+
+function jobregisters.unique(data,options)
+ local result, prev, equal = { }, nil, table.are_equal
+ local dataresult = data.result
+ for k=1,#dataresult do
+ local v = dataresult[k]
+ if not prev then
+ result[#result+1], prev = v, v
+ else
+ local pr, vr = prev.references, v.references
+ if not equal(prev.list,v.list) then
+ result[#result+1], prev = v, v
+ elseif pr.realpage ~= vr.realpage then
+ result[#result+1], prev = v, v
+ else
+ local pl, vl = pr.lastrealpage, vr.lastrealpage
+ if pl or vl then
+ if not vl then
+ result[#result+1], prev = v, v
+ elseif not pl then
+ result[#result+1], prev = v, v
+ elseif pl ~= vl then
+ result[#result+1], prev = v, v
+ end
+ end
+ end
+ end
+ end
+ data.result = result
+end
+
+function jobregisters.finalize(data,options)
+ local result = data.result
+ data.metadata.nofsorted = #result
+ local split, lasttag, s, d = { }, nil, nil, nil
+ -- maps character to index (order)
+ for k=1,#result do
+ local v = result[k]
+ local entry, tag = sorters.firstofsplit(v)
+ if tag ~= lasttag then
+ if trace_registers then
+ logs.report("registers","splitting at %s",tag)
+ end
+ d = { }
+ s = { tag = tag, data = d }
+ split[#split+1] = s
+ lasttag = tag
+ end
+ d[#d+1] = v
+ end
+ data.result = split
+end
+
+function jobregisters.analysed(class,options)
+ local data = collected[class]
+ if data and data.entries then
+ options = options or { }
+ sorters.setlanguage(options.language)
+ jobregisters.filter(data,options) -- filter entries into results (criteria)
+ jobregisters.prepare(data,options) -- adds split table parallel to list table
+ jobregisters.sort(data,options) -- sorts results
+ jobregisters.unique(data,options) -- get rid of duplicates
+ jobregisters.finalize(data,options) -- split result in ranges
+ data.metadata.sorted = true
+ return data.metadata.nofsorted or 0
+ else
+ return 0
+ end
+end
+
+-- todo take conversion from index
+
+function jobregisters.userdata(index,name)
+ local data = jobreferences.internals[tonumber(index)]
+ data = data and data.userdata and data.userdata[name]
+ if data then
+ texsprint(ctxcatcodes,data)
+ end
+end
+
+-- proc can be wrapped
+
+function jobregisters.flush(data,options,prefixspec,pagespec)
+ local equal = table.are_equal
+ texsprint(ctxcatcodes,"\\startregisteroutput")
+ local collapse_singles = options.compress == interfaces.variables.yes
+ local collapse_ranges = options.compress == interfaces.variables.all
+ local result = data.result
+ -- todo ownnumber
+ local function pagenumber(entry)
+ local er = entry.references
+ texsprint(ctxcatcodes,format("\\registeronepage{%s}{%s}{",er.internal or 0,er.realpage or 0)) -- internal realpage content
+ local proc = entry.processors and entry.processors[2]
+ if proc then
+ texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ helpers.prefixpage(entry,prefixspec,pagespec)
+ texsprint(ctxcatcodes,"}")
+ else
+ helpers.prefixpage(entry,prefixspec,pagespec)
+ end
+ texsprint(ctxcatcodes,"}")
+ end
+ local function pagerange(f_entry,t_entry,is_last)
+ local er = f_entry.references
+ texsprint(ctxcatcodes,format("\\registerpagerange{%s}{%s}{",er.internal or 0,er.realpage or 0))
+ local proc = f_entry.processors and f_entry.processors[2]
+ if proc then
+ texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ helpers.prefixpage(f_entry,prefixspec,pagespec)
+ texsprint(ctxcatcodes,"}")
+ else
+ helpers.prefixpage(f_entry,prefixspec,pagespec)
+ end
+ local er = t_entry.references
+ texsprint(ctxcatcodes,format("}{%s}{%s}{",er.internal or 0,er.lastrealpage or er.realpage or 0))
+ if is_last then
+ if proc then
+ texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys
+ texsprint(ctxcatcodes,"}")
+ else
+ helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys
+ end
+ else
+ if proc then
+ texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ helpers.prefixpage(t_entry,prefixspec,pagespec)
+ texsprint(ctxcatcodes,"}")
+ else
+ helpers.prefixpage(t_entry,prefixspec,pagespec)
+ end
+ end
+ texsprint(ctxcatcodes,"}")
+ end
+ -- ranges need checking !
+ for i=1,#result do
+ local sublist = result[i]
+ local done = { false, false, false, false }
+ local data = sublist.data
+ local d, n = 0, 0
+ texsprint(ctxcatcodes,format("\\startregistersection{%s}",sublist.tag))
+ while d < #data do
+ d = d + 1
+ local entry = data[d]
+ local e = { false, false, false, false }
+ local metadata = entry.metadata
+ for i=1,4 do -- max 4
+ if entry.list[i] then
+ e[i] = entry.list[i][1]
+ end
+ if e[i] ~= done[i] then
+ if e[i] and e[i] ~= "" then
+ done[i] = e[i]
+ if n == i then
+ texsprint(ctxcatcodes,format("\\stopregisterentries\\startregisterentries{%s}",n))
+ else
+ while n > i do
+ n = n - 1
+ texsprint(ctxcatcodes,"\\stopregisterentries")
+ end
+ while n < i do
+ n = n + 1
+ texsprint(ctxcatcodes,format("\\startregisterentries{%s}",n))
+ end
+ end
+ if metadata then
+ texsprint(ctxcatcodes,"\\registerentry{")
+ local proc = entry.processors and entry.processors[1]
+ if proc then
+ texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ helpers.title(e[i],metadata)
+ texsprint(ctxcatcodes,"}")
+ else
+ helpers.title(e[i],metadata)
+ end
+ texsprint(ctxcatcodes,"}")
+ else
+ local proc = entry.processors and entry.processors[1]
+ if proc then
+ texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ texsprint(ctxcatcodes,format("\\registerentry{%s}",e[i]))
+ texsprint(ctxcatcodes,"}")
+ else
+ texsprint(ctxcatcodes,format("\\registerentry{%s}",e[i]))
+ end
+ end
+ else
+ done[i] = false
+ end
+ end
+ end
+ local kind = entry.metadata.kind
+ if kind == 'entry' then
+ texsprint(ctxcatcodes,"\\startregisterpages")
+ --~ collapse_ranges = true
+ if collapse_singles or collapse_ranges then
+ -- we collapse ranges and keep existing ranges as they are
+ -- so we get prebuilt as well as built ranges
+ local first, last, prev = entry, nil, entry
+ local pages = { }
+ local dd = d
+ while dd < #data do
+ dd = dd + 1
+ local next = data[dd]
+ local el, nl = entry.list, next.list
+ if not equal(el,nl) then
+ dd = dd - 1
+ --~ first = nil
+ break
+ elseif next.references.lastrealpage then
+ if first then
+ pages[#pages+1] = { first, last or first }
+ else
+ pages[#pages+1] = { entry, entry }
+ end
+ pages[#pages+1] = { next, next }
+ first, last, prev = nil, nil, nil
+ elseif not first then
+ first, prev = next, next
+ elseif next.references.realpage - prev.references.realpage == 1 then -- 1 ?
+ last, prev = next, next
+ else
+ pages[#pages+1] = { first, last or first }
+ first, last, prev = next, nil, next
+ end
+ end
+ if first then
+ pages[#pages+1] = { first, last or first }
+ end
+ if collapse_ranges and #pages > 1 then
+ -- ok, not that efficient
+ local function doit()
+ local function bubble(i)
+ for j=i,#pages-1 do
+ pages[j] = pages[j+1]
+ end
+ pages[#pages] = nil
+ end
+ for i=2,#pages do
+ local first, second = pages[i-1], pages[i]
+ local first_first, first_last, second_first, second_last = first[1], first[2], second[1], second[2]
+ local first_last_pn = first_last .references.realpage
+ local second_first_pn = second_first.references.realpage
+ local second_last_pn = second_last .references.realpage
+ local first_last_last = first_last .references.lastrealpage
+ local second_first_last = second_first.references.lastrealpage
+ if first_last_last then
+ first_last_pn = first_last_last
+ if second_first == second_last and second_first_pn <= first_last_pn then
+ -- 2=8, 5 -> 12=8
+ bubble(i)
+ return true
+ elseif second_first == second_last and second_first_pn > first_last_pn then
+ -- 2=8, 9 -> 2-9
+ pages[i-1] = { first_first, second_last }
+ bubble(i)
+ return true
+ elseif second_last_pn < first_last_pn then
+ -- 2=8, 3-4 -> 2=8
+ bubble(i)
+ return true
+ elseif first_last_pn < second_last_pn then
+ -- 2=8, 3-9 -> 2-9
+ pages[i-1] = { first_first, second_last }
+ bubble(i)
+ return true
+ elseif first_last_pn + 1 == second_first_pn and second_last_pn > first_last_pn then
+ -- 2=8, 9-11 -> 2-11
+ pages[i-1] = { first_first, second_last }
+ bubble(i)
+ return true
+ elseif second_first.references.lastrealpage then
+ -- 2=8, 9=11 -> 2-11
+ pages[i-1] = { first_first, second_last }
+ bubble(i)
+ return true
+ end
+ elseif second_first_last then
+ second_first_pn = second_first_last
+ if first_last_pn == second_first_pn then
+ -- 2-4, 5=9 -> 2-9
+ pages[i-1] = { first_first, second_last }
+ bubble(i)
+ return true
+ end
+ elseif first_last_pn == second_first_pn then
+ -- 2-3, 3-4 -> 2-4
+ pages[i-1] = { first_last, second_last }
+ bubble(i)
+ return true
+ end
+ end
+ return false
+ end
+ while doit() do end
+ end
+ --
+ if #pages > 0 then -- or 0
+ d = dd
+ for p=1,#pages do
+ local first, last = pages[p][1], pages[p][2]
+ if first == last then
+ if first.references.lastrealpage then
+ pagerange(first,first,true)
+ else
+ pagenumber(first)
+ end
+ elseif last.references.lastrealpage then
+ pagerange(first,last,true)
+ else
+ pagerange(first,last,false)
+ end
+ end
+ else
+ if entry.references.lastrealpage then
+ pagerange(entry,entry,true)
+ else
+ pagenumber(entry)
+ end
+ end
+ else
+ while true do
+ if entry.references.lastrealpage then
+ pagerange(entry,entry,true)
+ else
+ pagenumber(entry)
+ end
+ if d == #data then
+ break
+ else
+ d = d + 1
+ local next = data[d]
+ if not equal(entry.list,next.list) then
+ d = d - 1
+ break
+ else
+ entry = next
+ end
+ end
+ end
+ end
+ texsprint(ctxcatcodes,"\\stopregisterpages")
+ elseif kind == 'see' then
+ -- maybe some day more words
+ texsprint(ctxcatcodes,"\\startregisterseewords")
+ local proc = entry.processors and entry.processors[1]
+ if proc then
+ texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ texsprint(ctxcatcodes,format("\\registeroneword{0}{0}{%s}",entry.seeword.text)) -- todo: internal
+ texsprint(ctxcatcodes,"}")
+ else
+ texsprint(ctxcatcodes,format("\\registeroneword{0}{0}{%s}",entry.seeword.text)) -- todo: internal
+ end
+ texsprint(ctxcatcodes,"\\stopregisterseewords")
+ end
+ end
+ while n > 0 do
+ texsprint(ctxcatcodes,"\\stopregisterentries")
+ n = n - 1
+ end
+ texsprint(ctxcatcodes,"\\stopregistersection")
+ end
+ texsprint(ctxcatcodes,"\\stopregisteroutput")
+ -- for now, maybe at some point we will do a multipass or so
+ data.result = nil
+ data.metadata.sorted = false
+end
+
+function jobregisters.analyse(class,options)
+ texwrite(jobregisters.analysed(class,options))
+end
+
+function jobregisters.process(class,...)
+ if jobregisters.analysed(class,...) > 0 then
+ jobregisters.flush(collected[class],...)
+ end
+end
diff --git a/tex/context/base/strc-reg.mkii b/tex/context/base/strc-reg.mkii
new file mode 100644
index 000000000..b088246d3
--- /dev/null
+++ b/tex/context/base/strc-reg.mkii
@@ -0,0 +1,1243 @@
+%D \module
+%D [ file=strc-reg,
+%D version=1999.12.27,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Register Management,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Register Management}
+
+\newif \ifautoregisterhack % for the moment a private hack
+
+% new: eigennummer=ja => eerste {} ipv pag nummer
+
+\unprotect
+
+%D Isolated but still indocumented.
+
+% Formaat tex-utility-input-file <jobname.tui>:
+%
+% i e {tag} {loc} {pure} {entry+..} {p:c:p:sp:ssp=>page} {realpage}
+% i s {tag} {loc} {pure} {entry+..} {other entry}
+%
+% In plaats van + kan een & worden gebruikt. Ook kan als
+% eerste karakter worden opgegeven wat de scheider is.
+%
+% \index {entry}
+% \index[key] {entry}
+% \index[pageclass::] {entry}
+% \index[pageclass::key]{entry}
+% \index {textclass::entry}
+% \index[key] {textclass::entry}
+% \index[pageclass::] {textclass::entry}
+% \index[pageclass::key]{textclass::entry}
+%
+% Deze file wordt met het Perl script TeXUtil omgezet in
+% een in te lezen file met de commando's:
+%
+% \registerentrya {tag} {ingang}
+% \registerentryb {tag} {subingang}
+% \registerentryc {tag} {subsubingang}
+%
+% \registerpage {tag} {pag,txt} {volgnummer} {paginanummer} {volgnummer}
+%
+% \registersee {tag} {pag,txt} {andere ingang}
+%
+% \registerentry {tag} {letter}
+
+\def\dosetupregister[#1][#2][#3]%
+ {\ifthirdargument
+ \def\dodosetupregister##1%
+ {\getparameters[\??id##1#2][#3]%
+ \preparepageprefix{\??id##1}}%
+ \else
+ \def\dodosetupregister##1%
+ {\getparameters[\??id##1][#2]%
+ \doifvalue{\??id##1\c!coupling}\v!yes
+ {\appendtoks\coupleregister[##1][#2]\to\everystarttext}%
+ \preparepageprefix{\??id##1}}%
+ \fi
+ \processcommalist[#1]\dodosetupregister}
+
+\def\setupregister
+ {\dotripleempty\dosetupregister}
+
+\def\getlastregisterentry#1%
+ {\def\docommand##1{\def\!!stringa{##1}}%
+ \processseparatedlist[#1][+]\docommand
+ \!!stringa}
+
+\def\registerparameter#1{\csname\??id\currentregister#1\endcsname}
+
+% \enableregime[windows] \setupregister[index][keyexpansion=strict]
+%
+% \index[tsch]{tsch} test \index{Qtsch} test \index[ratsch]{Rtsch} test
+
+\newif\ifwritetoregister \writetoregistertrue
+
+\chardef\registerpagestatus\zerocount
+
+\def\doprocesspageregister[#1]#2#3% key altnum entry
+ {\ifwritetoregister
+ \begingroup
+ \thisisnextinternal\s!ind
+ \ifduplicate\getlastregisterentry{#3}\fi
+ \defconvertexpanded\asciiregisterentryA{\registerparameter\c!keyexpansion}{#1}%
+ \defconvertexpanded\asciiregisterentryB{\registerparameter\c!expansion }{#3}%
+ \doifsomething{\registerparameter\c!keyexpansion}
+ {\ifx\asciiregisterentryA\empty
+ \defconvertexpanded\asciiregisterentryA{\registerparameter\c!keyexpansion}{#3}%
+ \fi}%
+ \makesectionformat
+ \doifelse{\registerparameter\c!ownnumber}\v!yes
+ \donetrue\donefalse
+ \expanded{\writeutility{r % spaces are essential
+ \ifcase\registerpagestatus\space\or e\or f\or t\fi\space
+ {\currentregister} %
+ {\nextinternalreference} %
+ {\asciiregisterentryA} %
+ {\asciiregisterentryB} %
+ {\sectionformat\sectionseparator\sectionseparator\ifdone#2\else\noexpand\pagenumber\fi} %
+ {\noexpand\realfolio}}}%
+ \getfirstcharacter\currentregister
+ \registerinfo{> \firstcharacter}{#3}%
+ \endgroup
+ \fi}
+
+\def\doregister#1%
+ {\chardef\registerpagestatus\plusone
+ \def\currentregister{#1}%
+ \doifelse{\registerparameter\c!ownnumber}\v!yes
+ {\dosingleempty\dodoregister}
+ {\dosingleempty\donoregister}}
+
+\def\donoregister[#1]%
+ {\dodoregister[#1]{}}
+
+% \long\def\doflushatpar#1%
+% %{\dogotopar{#1}}
+% %{\dogotopar{\dontleavehmode#1}} % this one can introduce empty lines
+% {\dogotopar{#1\ifvmode\nobreak\fi}} % while this one can mess up vertical space
+%
+% fails when [text] \index{test} [empty line] [text] so we now have
+% Taco's test based solution:
+
+\def\doflushatpar
+ {\ifvmode
+ \expandafter\dogotopar
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\dodoregister[#1]#2#3%
+ {\doflushatpar{\doprocesspageregister[#1]{#2}{#3}}}
+
+\def\writetoregister[#1]% to be documented
+ {\doregister{#1}}
+
+% \def\startregister
+% {\dotripleempty\dostartregister}
+
+% \def\dostartregister[#1][#2][#3]#4%
+% {\chardef\registerpagestatus\plustwo
+% \def\currentregister{#1}%
+% \setgvalue{\??id#1\??id#2}{\dodostopregister[#1][#3]{#4}}%
+% \dodoregister[#3]{}{#4}}
+
+\def\startregister
+ {\doquadrupleempty\dostartregister}
+
+\def\dostartregister[#1][#2][#3][#4]#5% % 3 args: #3 is sortkey
+ {\chardef\registerpagestatus\plustwo % 4 args: #3 is type, #4 is sortkey
+ \def\currentregister{#1}%
+ \iffourthargument
+ \setgvalue{\??id#1\??id#2}{\dodostopregister[#1][#4]{#5}}%
+ \dodoregister[#4]{#3}{#5}%
+ \else
+ \setgvalue{\??id#1\??id#2}{\dodostopregister[#1][#3]{#5}}%
+ \dodoregister[#3]{}{#5}%
+ \fi}
+
+\def\stopregister
+ {\dodoubleargument\dostopregister}
+
+\def\dostopregister[#1][#2]%
+ {\getvalue{\??id#1\??id#2}\letgvalue{\??id#1\??id#2}\relax}
+
+\def\dodostopregister[#1][#2]#3%
+ {\chardef\registerpagestatus\plusthree
+ \def\currentregister{#1}%
+ \dodoregister[#2]{}{#3}} % key altnum entry
+
+\def\doprocessseeregister[#1]#2#3%
+ {\ifwritetoregister
+ \begingroup
+ \thisisnextinternal\s!ind
+ \ifduplicate\getlastregisterentry{#2}\fi
+ \defconvertexpanded\asciiregisterentryA{\registerparameter\c!keyexpansion}{#1}%
+ \defconvertexpanded\asciiregisterentryB{\registerparameter\c!expansion }{#2}%
+ \defconvertexpanded\asciiregisterentryC{\registerparameter\c!expansion }{#3}%
+ \doifsomething{\registerparameter\c!keyexpansion}
+ {\ifx\asciiregisterentryA\empty
+ \defconvertexpanded\asciiregisterentryA{\registerparameter\c!keyexpansion}{#2}%
+ \fi}%
+ \makesectionformat
+ \expanded{\writeutility{r s %
+ {\currentregister} %
+ {\nextinternalreference} %
+ {\asciiregisterentryA} %
+ {\asciiregisterentryB} %
+ {\asciiregisterentryC} %
+ {\sectionformat}}}%
+ \endgroup
+ \registerinfo{> see}{#2}%
+ \fi}
+
+\def\complexdoseeregister[#1]#2#3%
+ {\doflushatpar{\doprocessseeregister[#1]{#2}{#3}}}
+
+\def\doseeregister#1%
+ {\def\currentregister{#1}%
+ \complexorsimpleempty\doseeregister} % = \dosingleempty\doseeregister
+
+\def\dowritetoregister[#1]% % de twee-traps-aanroep is nodig
+ {\edef\currentregister{#1}% % om gebruik van \ExpandBothAfter
+ \doprocesspageregister} % mogelijk te maken
+
+\def\writetoregister
+ {\dodoubleempty\dowritetoregister}
+
+\def\ifregistergeplaatst{\ifutilitydone}
+
+\newif\iffirstregisterpage
+\newif\iffirstregisterentry
+
+\let\c!entrya\empty
+\let\c!entryb\empty
+\let\c!entryc\empty
+\let\c!entryd\empty
+
+\def\nextregisterpage
+ {\iffirstregisterpage
+ \doglobal\newcounter\registerpagenumber
+ \fi
+ \doglobal\increment\registerpagenumber}
+
+\def\doregisterpagelocation#1#2%
+ {\nextregisterpage
+ \hbox to 1em{\hss\doregisterpagehowto{#1}{#2}\hss}}
+
+% todo: \installregisterpagehandler
+
+\def\setregisterpage#1% todo: currentregister gebruiken
+ {\let\registerpageseparator\empty
+ \processaction
+ [\getvalue{\??id#1\c!symbol}]
+ [ \c!n=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{#1}{\registerpagenumber}\/}},
+ \c!a=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{#1}{\character{\registerpagenumber}\/}}},
+ 1=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{#1}{$\bullet$}}},
+ 2=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{#1}{\vrule\!!width1em\!!height1ex\!!depth\zeropoint}}},
+ \v!none=>{\def\doregisterpage##1[##2]{}},%
+ \s!unknown=>{\def\registerpagesymbol{\getvalue{\??id#1\c!symbol}}%
+ \def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{#1}{\registerpagesymbol}}},
+ \s!default=>{\def\registerpageseparator{,}%
+ \let\doregisterpage\doregisterpagedefault}]}
+
+\def\doregisterpagedefault#1[#2]%
+ {\doregisterpagehowto{#1}{\strut\pageprefix{\??id#1}[#2]\translatednumber[#2]}}
+
+% test case
+%
+% \starttext
+% \placelist[section][criterium=all] \blank[2*big]
+% \placeregister[index][compress=no] \blank[2*big]
+% \placeregister[index][compress=no,sectionnumber=yes] \blank[2*big]
+% \placeregister[index][compress=yes] \page
+% test text \index{test index}
+% \section{heading}
+% more test text \index{test index}
+% \section{heading}
+% more test text \index{test index}
+% \page
+% \section{heading text \index{test index}}
+% more test text \index{test index}
+% \page
+% test text \index{test index}
+% \section{heading text \index{test index}}
+% more test text \index{test index}
+% \stoptext
+
+\let\registerpagehowto\empty
+\let\registertexthowto\empty
+
+\def\setregisterhowto[#1,#2]%
+ {\def\registerpagehowto{#1}%
+ \def\registertexthowto{#2}}%
+
+\def\doregistertexthowto#1#2%
+ {\dostartattributes{\??id#1\registertexthowto}\c!textstyle\c!textcolor\empty
+ \getvalue{\??id#1\c!textcommand}{#2}%
+ \dostopattributes}
+
+\def\doregisterpagehowto#1#2%
+ {\dostartattributes{\??id#1\registerpagehowto}\c!pagestyle\c!pagecolor\empty
+ \getvalue{\??id#1\c!pagecommand}{#2}%
+ \dostopattributes}
+
+\def\registerentry #1{\executeifdefined{#1\s!entry }\gobbleoneargument }
+\def\registerentrya#1{\executeifdefined{#1\s!entrya}\gobbleoneargument }
+\def\registerentryb#1{\executeifdefined{#1\s!entryb}\gobbleoneargument }
+\def\registerentryc#1{\executeifdefined{#1\s!entryc}\gobbleoneargument }
+\def\registerentryd#1{\executeifdefined{#1\s!entryd}\gobbleoneargument }
+\def\registersee #1{\executeifdefined{#1\s!see }\gobblethreearguments}
+\def\registerpage #1{\executeifdefined{#1\s!page }\gobblefourarguments }
+\def\registerfrom #1{\executeifdefined{#1\s!from }\gobblefourarguments }
+\def\registerto #1{\executeifdefined{#1\s!to }\gobblefourarguments }
+
+\def\doresetregister#1%
+ {\letvalue{#1\s!entrya}\gobbleoneargument
+ \letvalue{#1\s!entryb}\gobbleoneargument
+ \letvalue{#1\s!entryc}\gobbleoneargument
+ \letvalue{#1\s!entryd}\gobbleoneargument
+ \letvalue{#1\s!see }\gobblethreearguments
+ \letvalue{#1\s!page }\gobblefourarguments
+ \letvalue{#1\s!from }\gobblefourarguments
+ \letvalue{#1\s!to }\gobblefourarguments
+ \letvalue{#1\s!entry }\gobbleoneargument}
+
+\newif\iffirstsubentry
+\newif\iffirstsubsubentry
+
+\newcounter\currententrylevel
+
+\let\c!entryletter =\empty
+\let\c!entryreference=\empty
+\let\c!entrya =\relax
+\let\c!entryb =\relax
+\let\c!entryc =\relax
+\let\c!entryd =\relax
+
+\def\limitedregisterentry#1#2%
+ {\getvalue{\??id#1\c!textcommand}%
+ {\doifelsenothing{\??id#1\c!maxwidth}
+ {#2}
+ {\limitatetext{#2}{\getvalue{\??id#1\c!maxwidth}}{\unknown}}}}
+
+\def\dosetpageregisterpage#1#2#3#4#5#6%
+ {\doifreglevelelse[#5]{\dodosetpageregisterpage{#1}{#2}{#3}{#4}{#5}{#6}}{}}
+
+\def\dodosetpageregisterpageA#1#2#3#4#5#6%
+ {\global\utilitydonetrue
+ \c!entryletter
+ \setregisterhowto[#3]%
+ \def\dohandleregisterentry##1%
+ {\bgroup
+ \if!!donea % \strut nieuw
+ \hhboxindent\hangindent % maybe also left and right skip
+ \setbox0\hbox{\doregistertexthowto{#2}{\strut\limitedregisterentry{#2}{##1}}}%
+ \unhhbox0\with{\gotonextinternal\s!ind{#4}{#6}{\box\hhbox}}%
+ \else
+ \doregistertexthowto{#2}{##1}%
+ \fi
+ \egroup
+ \!!doneafalse}%
+ \!!doneafalse
+ \doifelsevalue{\??id#2\c!interaction}\v!text
+ {\ifcase\currententrylevel \or
+ \!!doneatrue\c!entrya\c!entryb\c!entryc\c!entryd \or
+ \c!entrya\!!doneatrue\c!entryb\c!entryc\c!entryd \or
+ \c!entrya\c!entryb\!!doneatrue\c!entryc\c!entryd \or
+ \c!entrya\c!entryb\c!entryc\!!doneatrue\c!entryd \fi}
+ {\c!entrya\c!entryb\c!entryc\c!entryd}%
+ \global\let\c!entrya\relax
+ \global\let\c!entryb\relax
+ \global\let\c!entryc\relax
+ \global\let\c!entryd\relax
+ \global\let\c!entryletter\relax
+ \global\let\c!entryreference\relax}
+
+% \def\dodosetpageregisterpageB#1#2#3#4#5#6%
+% {\iffirstregisterpage
+% \expandafter\hskip\getvalue{\??id#2\c!distance}\relax
+% \else\ifnum#1=3
+% \strut|--|\relax % -- !
+% \else
+% % \relax after space needed because | looks ahead
+% \strut\registerpageseparator|\space|\relax
+% \fi\fi
+% \iftrue % \iftrue ...\fi to preserve indentation, can be folded out
+% \begingroup
+% %
+% \doifelsevalue{\??id#2\c!prefix}\v!none % default v!both
+% {\chardef\pageprefixmode\zerocount}%
+% {\doifvalue{\??id#2\c!prefix}\v!first % only first in range (1.2-4)
+% {\ifnum#1=3 \chardef\pageprefixmode\zerocount \fi}}%
+% %
+% \doifelsevalue{\??id#2\c!interaction}\v!pagenumber
+% {\bgroup
+% \setbox0\hbox{\showlocation{\doregisterpage{#2}[#5]\ifnum#1=2\/\fi}}%
+% \gotonextinternal{\s!ind}{#4}{#6}{\box0}%{\copy0}%
+% \egroup}
+% {\hbox{\doregisterpage{#2}[#5]\ifnum#1=2\/\fi}}%
+% \endgroup
+% \ignorespaces
+% \relax
+% \fi
+% \global\firstregisterpagefalse}
+
+\def\dodosetpageregisterpageB#1#2#3#4#5#6%
+ {\iffirstregisterpage
+ \expandafter\hskip\getvalue{\??id#2\c!distance}\relax
+ \else\ifnum#1=3
+ \strut|--|\relax % -- !
+ \else
+ % \relax after space needed because | looks ahead
+% TH: next line replaced
+% \strut\registerpageseparator|\space|\relax
+ \strut \registerpageseparator{ }%
+% /TH
+ \fi\fi
+ \iftrue % \iftrue ...\fi to preserve indentation, can be folded out
+ \begingroup
+ %
+ \doifelsevalue{\??id#2\c!prefix}\v!none % default v!both
+ {\chardef\pageprefixmode\zerocount}%
+ {\doifvalue{\??id#2\c!prefix}\v!first %
+ {\ifnum#1=3 \chardef\pageprefixmode\zerocount \fi}}%
+ %
+ \doifelsevalue{\??id#2\c!interaction}\v!pagenumber
+ {\bgroup
+ \setbox0
+ \hbox{\showlocation{\doregisterpage{#2}[#5]\ifnum#1=2\/\fi}}%
+ \gotonextinternal{\s!ind}{#4}{#6}{\box0}%{\copy0}%
+ \egroup}
+ {\hbox{\doregisterpage{#2}[#5]\ifnum#1=2\/\fi}}%
+ \endgroup
+ \ignorespaces
+ \relax
+ \fi
+ \global\firstregisterpagefalse}
+
+\def\resetseenregisterpage
+ {\global\let\firstseenregisterreal \relax
+ \global\let\currentseenregisterreal\relax
+ \global\let\lastseenregisterreal \relax
+ \global\let\firstseenregisterpage \relax
+ \global\let\currentseenregisterpage\relax
+ \global\let\lastseenregisterpage \relax}
+
+\resetseenregisterpage
+
+\def\dodosetpageregisterpageC#1#2#3#4#5#6%
+ {\xdef\currentseenregisterpage{#5}%
+ \xdef\currentseenregisterreal{#6}%
+ \ifx\firstseenregisterreal\relax
+ % no range yet
+ \global\let\firstseenregisterreal\currentseenregisterreal
+ \global\let\firstseenregisterpage\currentseenregisterpage
+ \global\let\lastseenregisterreal \currentseenregisterreal
+ \global\let\lastseenregisterpage \currentseenregisterpage
+ \else\ifnum\lastseenregisterreal=\currentseenregisterreal\relax
+ % same page (catch error)
+ \else\ifnum\numexpr\lastseenregisterreal+\plusone\relax=\currentseenregisterreal\relax
+ \global\let\lastseenregisterreal \currentseenregisterreal
+ \global\let\lastseenregisterpage \currentseenregisterpage
+ \else
+ \global\let\savedcurrentseenregisterreal\currentseenregisterreal
+ \global\let\savedcurrentseenregisterpage\currentseenregisterpage
+ \flushseenregisterpage
+ \global\let\firstseenregisterreal\savedcurrentseenregisterreal
+ \global\let\firstseenregisterpage\savedcurrentseenregisterpage
+ \global\let\lastseenregisterreal \savedcurrentseenregisterreal
+ \global\let\lastseenregisterpage \savedcurrentseenregisterpage
+ \fi\fi\fi
+ \gdef\flushseenregisterpage{\doflushseenregisterpage{#1}{#2}{#3}{#4}}}
+
+% \def\dodosetpageregisterpageC#1#2#3#4#5#6%
+% {\xdef\currentseenregisterpage{#5}%
+% \xdef\currentseenregisterreal{#6}%
+% \firstregisterpagefalse
+% \gdef\flushseenregisterpage{\doflushseenregisterpage{#1}{#2}{#3}{#4}}%
+% \ifx\firstseenregisterreal\relax
+% % no range yet
+% \global\let\firstseenregisterreal\currentseenregisterreal
+% \global\let\firstseenregisterpage\currentseenregisterpage
+% \global\let\lastseenregisterreal \currentseenregisterreal
+% \global\let\lastseenregisterpage \currentseenregisterpage
+% \else\ifnum\firstseenregisterreal=\currentseenregisterreal\relax
+% \global\let\firstseenregisterreal\currentseenregisterreal
+% \global\let\firstseenregisterpage\currentseenregisterpage
+% \global\let\lastseenregisterreal \currentseenregisterreal
+% \global\let\lastseenregisterpage \currentseenregisterpage
+% \else\ifnum\lastseenregisterreal=\currentseenregisterreal\relax
+% \global\let\lastseenregisterpage \currentseenregisterpage
+% \else\ifnum\numexpr\lastseenregisterreal+\plusone\relax=\currentseenregisterreal\relax
+% \global\let\lastseenregisterreal \currentseenregisterreal
+% \global\let\lastseenregisterpage \currentseenregisterpage
+% \else
+% % back up, flush, go on
+% \global\let\savedcurrentseenregisterreal\currentseenregisterreal
+% \global\let\savedcurrentseenregisterpage\currentseenregisterpage
+% \let\currentseenregisterpage\lastseenregisterpage
+% \let\currentseenregisterreal\lastseenregisterreal
+% \flushseenregisterpage
+% \global\let\firstseenregisterreal\savedcurrentseenregisterreal
+% \global\let\firstseenregisterpage\savedcurrentseenregisterpage
+% \global\let\lastseenregisterreal \savedcurrentseenregisterreal
+% \global\let\lastseenregisterpage \savedcurrentseenregisterpage
+% \fi\fi\fi\fi}
+
+\def\doflushseenregisterpage#1#2#3#4%
+ {\global\let\flushseenregisterpage\relax
+ \ifx\firstseenregisterreal\relax
+ % nothing in the hold
+ \else\ifx\firstseenregisterreal\lastseenregisterreal
+ \expanded{\dodosetpageregisterpageB{1}{#2}{#3}{#4}{\lastseenregisterpage}{\lastseenregisterreal}}%
+ \else
+ \expanded{\dodosetpageregisterpageB{2}{#2}{#3}{#4}{\firstseenregisterpage}{\firstseenregisterreal}}%
+ \expanded{\dodosetpageregisterpageB{3}{#2}{#3}{#4}{\lastseenregisterpage }{\lastseenregisterreal }}%
+ \fi\fi
+ \resetseenregisterpage}
+
+\let\flushseenregisterpage\relax
+
+\chardef\collapseregisterpages\zerocount
+
+\def\dodosetpageregisterpage
+ {\ifcase\collapseregisterpages
+ \expandafter\dodosetpageregisterpagenormal
+ \else
+ \expandafter\dodosetpageregisterpagecollapsed
+ \fi}
+
+\def\dodosetpageregisterpagenormal#1#2#3#4#5#6%
+ {\dodosetpageregisterpageA{#1}{#2}{#3}{#4}{#5}{#6}%
+ \dodosetpageregisterpageB{#1}{#2}{#3}{#4}{#5}{#6}}
+
+% \def\dodosetpageregisterpagecollapsed#1#2#3#4#5#6%
+% {\dodosetpageregisterpageA{#1}{#2}{#3}{#4}{#5}{#6}%
+% \dodosetpageregisterpageC{#1}{#2}{#3}{#4}{#5}{#6}}
+
+\def\dodosetpageregisterpagecollapsed#1#2#3#4#5#6%
+ {\ifx\firstseenregisterreal\relax\flushseenregisterpage\fi
+ \dodosetpageregisterpageA{#1}{#2}{#3}{#4}{#5}{#6}%
+ \dodosetpageregisterpageC{#1}{#2}{#3}{#4}{#5}{#6}}
+
+% test case for collapsing (experimental, for Steffen Wolfrum)
+%
+% \starttext
+% \chardef\collapseregisterpages\zerocount \placeregister[index] \blank[2*big]
+% \chardef\collapseregisterpages\plusone \placeregister[index] \page
+% \dorecurse{10}{test 1:!\index{test} test \page}
+% \dorecurse{5} {test 2:\recurselevel \page}
+% \dorecurse{10}{test 3:!\index{test} test \page}
+% \dorecurse{5} {test 4:\recurselevel \page}
+% \dorecurse{1} {test 5:!\index{test} test \page}
+% \dorecurse{5} {test 6:\recurselevel \page}
+% \dorecurse{10}{test 7:!\index{test} test \page}
+% \dorecurse{5} {test 8:\recurselevel \page}
+% oeps \index{oeps}
+% xxxx \index{xxxx}
+% todo \index{todo}
+% \stoptext
+
+\def\dosetpageregistersee#1#2#3#4% ugly separator hack
+ {\flushseenregisterpage
+ \expanded{\doifreglevelelse[#4\sectionseparator\sectionseparator0]}%
+ {{\global\utilitydonetrue
+ \setregisterhowto[#2]%
+ \def\dohandleregisterentry##1% dubbelop | \strut nieuw
+ {\doregistertexthowto{#1}{\strut\limitedregisterentry{#1}{##1}}}%
+ \getvalue
+ {#1\ifcase\currententrylevel\s!entrya\or\s!entryb\or\s!entryc\else\s!entryd\fi}%
+ {\doregisterpagehowto{#1}{\labeltexts\v!see{#3}}}%
+ \c!entryletter\c!entrya\c!entryb\c!entryc\c!entryd
+ \global\let\c!entrya\relax
+ \global\let\c!entryb\relax
+ \global\let\c!entryc\relax
+ \global\let\c!entryd\relax
+ \global\let\c!entryletter\relax
+ \global\let\c!entryreference\relax
+ % \global\firstregisterentrytrue
+ \global\firstregisterpagetrue}}
+ {}}
+
+%D Extended with variant:
+
+\def\doregistercharacter[#1]#2%
+ {\global\firstregisterentrytrue
+ \doifsomething{#2}
+ {\doifelsevalue{\??id#1\c!indicator}\v!yes
+ {\executeifdefined
+ {\strippedcsname\doregistercharacter\getvalue{\??id#1\c!alternative}}%
+ \doregistercharactera
+ [#1]{#2}}
+ {\noregistercharacter[#1]{#2}}}}
+
+\def\noregistercharacter[#1]#2%
+ {\getvalue{\??id#1\c!before}%
+ \goodbreak}
+
+% a = <before> <goodbreak> <character> <par> <after> <nobreak>
+
+\def\doregistercharactera[#1]#2%
+ {\getvalue{\??id#1\c!before}%
+ \vskip\lineheight\goodbreak\vskip-\lineheight
+ \ifhmode\unskip\else\noindent\fi % brrr
+ \getvalue{\??id#1\c!command}{\doattributes{\??id#1}\c!style\c!color{\strut\ignorespaces#2}}%
+ \getvalue{\??id#1\c!after}%
+ \par\nobreak}
+
+% b = <goodbreak> <before> <character> <after> <nobreak>
+
+\def\doregistercharacterb[#1]#2% here no lineheight hackery ! ! !
+ {\getvalue{\??id#1\c!before}%
+ \ifhmode\unskip\else\noindent\fi % brrr
+ \getvalue{\??id#1\c!command}%
+ {\doattributes{\??id#1}\c!style\c!color{\strut\ignorespaces#2}}%
+ \getvalue{\??id#1\c!after}%
+ \nobreak}
+
+\def\doregistercharacterA[#1]#2{\doregistercharactera[#1]{\WORD{#2}}}
+\def\doregistercharacterB[#1]#2{\doregistercharacterb[#1]{\WORD{#2}}}
+
+%D Don't use \type{\string#2}; another hack is needed, since
+%D \type {#2} can be \type {\string} itself.
+
+% \def\doregisterreference[#1]#2%
+% {\doifvalue{\??id#1\c!referencing}\v!on
+% {\pagereference[#1:#2]}}
+
+\def\doregisterreference[#1]#2%
+ {\doifsomething{#2}
+ {\doifvalue{\??id#1\c!referencing}\v!on
+ {\pagereference[#1:\strippedcsname#2]}}}
+
+\def\dosetpageregisterletter#1#2%
+ {\flushseenregisterpage
+ \gdef\c!entryreference
+ {\global\let\c!entryreference\relax
+ \doregisterreference[#1]{#2}}%
+ \gdef\c!entryletter
+ {\global\utilitydonetrue
+ \global\let\c!entryletter\relax
+ \doregistercharacter[#1]{#2}}}
+
+% \def\HowUgly #1{\doHowUgly#1\relax}
+% \def\doHowUgly#1#2\relax{\iffirstregisterentry{\bf#1}\else#1\fi#2} % unchecked
+%
+% \setupregister[index][indicator=no,deeptextcommand=\HowUgly]
+%
+% \starttext
+% \chapter{First Chapter}
+% Some text...\index{word}
+% \section {First Section}
+% Some text...\index{word}
+% Some text...\index{another entry}
+% Some text...\index{ansi}
+% Some text...\index{another entry}
+% \page[yes]
+% \completeindex
+% \stoptext
+
+\def\dohandlepageregisterentry#1#2%
+ {\dohandleregisterentry{\executeifdefined{\??id#1\c!deeptextcommand}\firstofoneargument{#2}}}
+
+\def\dosetpageregisterentrya#1#2%
+ {\flushseenregisterpage
+ \edef\currententrylevel{1}%
+ \global\let\c!entryb\relax
+ \global\let\c!entryc\relax
+ \global\let\c!entryd\relax
+ \gdef\c!entrya
+ {\iffirstregisterentry\else\endgraf\fi % new
+ \global\firstregisterpagetrue
+ \hangindent1em\noindent\c!entryreference
+ \dohandlepageregisterentry{#1}{#2}%
+ \global\firstregisterentryfalse
+ \global\firstsubentrytrue
+ \global\firstsubsubentrytrue}}
+
+\def\dosetpageregisterentryb#1#2%
+ {\flushseenregisterpage % redundant
+ \edef\currententrylevel{2}%
+ \global\let\c!entryd\relax
+ \global\let\c!entryc\relax
+ \global\def\c!entryb
+ {\iffirstregisterentry\else\endgraf\fi % new
+ \global\firstregisterpagetrue
+ \global\let\c!entrya\relax
+ \iffirstsubentry\nobreak\fi
+ \hangindent2em\noindent\c!entryreference\hskip1em\relax
+ \dohandlepageregisterentry{#1}{#2}%
+ \global\firstregisterentryfalse
+ \global\firstsubentryfalse
+ \global\firstsubsubentrytrue}}
+
+\def\dosetpageregisterentryc#1#2%
+ {\flushseenregisterpage % redundant
+ \edef\currententrylevel{3}%
+ \gdef\c!entryc
+ {\iffirstregisterentry\else\endgraf\fi % new
+ \global\firstregisterpagetrue
+ \global\let\c!entrya\relax
+ \global\let\c!entryb\relax
+ \iffirstsubsubentry\nobreak\fi
+ \hangindent3em\noindent\c!entryreference\hskip2em\relax
+ \dohandlepageregisterentry{#1}{#2}%
+ \global\firstregisterentryfalse
+ \global\firstsubsubentryfalse}}
+
+\def\dosetpageregisterentryd#1#2%
+ {\flushseenregisterpage % redundant
+ \edef\currententrylevel{4}%
+ \gdef\c!entryd
+ {\iffirstregisterentry\else\endgraf\fi % new
+ \global\firstregisterpagetrue
+ \global\let\c!entrya\relax
+ \global\let\c!entryb\relax
+ \global\let\c!entryc\relax
+ \iffirstsubsubentry\nobreak\fi
+ \hangindent4em\noindent\c!entryreference\hskip3em\relax
+ \dohandlepageregisterentry{#1}{#2}%
+ \global\firstregisterentryfalse
+ \global\firstsubsubentryfalse}}
+
+\def\dosetpageregister#1% \currentregister gebruiken
+ {\dosetreglevel{#1}%
+ \global\let\currentregisterentry\empty
+ \global\firstsubentrytrue
+ \global\firstsubsubentrytrue
+ \setregisterpage{#1}%
+ \setvalue{#1\s!entrya}{\dosetpageregisterentrya {#1}}%
+ \setvalue{#1\s!entryb}{\dosetpageregisterentryb {#1}}%
+ \setvalue{#1\s!entryc}{\dosetpageregisterentryc {#1}}%
+ \setvalue{#1\s!entryd}{\dosetpageregisterentryd {#1}}%
+ \setvalue{#1\s!page }{\dosetpageregisterpage{1}{#1}}%
+ \setvalue{#1\s!from }{\dosetpageregisterpage{2}{#1}}%
+ \setvalue{#1\s!to }{\dosetpageregisterpage{3}{#1}}%
+ \setvalue{#1\s!see }{\dosetpageregistersee {#1}}%
+ \setvalue{#1\s!entry }{\dosetpageregisterletter {#1}}}
+
+\def\dosetreglevel#1%
+ {\dosetfilterlevel{\getvalue{\??id#1\c!criterium}}\empty}
+
+\def\getalllistreferences#1#2%
+ {\gdefconvertexpanded\currentregisterentry{\getvalue{\??id#1\c!expansion}}{#2}%
+ \doifdefinedelse{\??id#1\??id\currentregisterentry}
+ {\edef\alllistreferences%
+ {\getvalue{\??id#1\??id\currentregisterentry}}%
+ \beforesplitstring\alllistreferences\at::\to\internallistreference
+ \aftersplitstring \alllistreferences\at::\to\alllistreferences}
+ {\let\alllistreferences\empty
+ \def\internallistreference{0}}}
+
+\def\dosetlinkregister#1% is die page reference echt nodig?
+ {\dosetreglevel{#1}%
+ \setregisterpage{#1}%
+ \global\let\currentregisterentry\empty
+ \global\firstsubentrytrue % not needed
+ \global\firstsubsubentrytrue % not needed too
+ \setvalue{#1\s!entrya}##1{\dosetlinkregisterentrya{#1}{##1}}%
+ \setvalue{#1\s!entry }##1{\dosetpageregisterletter{#1}{##1}}}
+
+\def\dosetlinkregisterentrya#1#2%
+ {\global\utilitydonetrue
+ \c!entryletter
+ \iflocation
+ \getalllistreferences{#1}{#2}%
+ % no \endgraf
+ \hangindent1em\noindent\c!entryreference
+ %
+ %\thisissomeinternal{\s!lin}{\internallistreference}%
+ %
+ \pagereference[-:\s!lin:\internallistreference]% -: added
+ %
+ \getcommacommandsize[\alllistreferences]%
+ \getfromcommacommand[\alllistreferences][1]%
+ \ifnum\commalistsize=1
+ \let\firstlistreference\empty
+ \let\midlistreference\commalistelement
+ \let\lastlistreference\empty
+ \else
+ \let\firstlistreference\commalistelement
+ \getfromcommacommand[\alllistreferences][\commalistsize]%
+ \let\lastlistreference\commalistelement
+ \ifnum\commalistsize=2
+ \let\midlistreference\empty
+ \else
+ \!!counta\commalistsize
+ \divide\!!counta 2
+ \getfromcommacommand[\alllistreferences][\!!counta]%
+ \let\midlistreference\commalistelement
+ \fi
+ \fi
+ % aangepast
+ \def\dodocommand[##1-##2]%
+ {\gotonextinternal{\s!ind}{##1}{##2}{\box0}}%
+ \doifelsevalue{\??id#1\c!interaction}\v!pagenumber
+ {\limitedregisterentry{#1}{#2}} % paginanummer
+ {{\setbox0\hbox{\limitedregisterentry{#1}{\begstrut#2}}%
+ \ifx\firstlistreference\empty % tekst,alles
+ \ifx\midlistreference\empty
+ \box0
+ \else
+ \expandafter\dodocommand\expandafter[\midlistreference]%
+ \fi
+ \else
+ \expandafter\dodocommand\expandafter[\firstlistreference]%
+ \fi}}%
+ \doifvalue{\??id#1\c!number}\v!yes
+ {\hskip\getvalue{\??id#1\c!distance}(\commalistsize)}%
+ \doifnotvalue{\??id#1\c!interaction}\v!text % paginanummer,alles
+ {\def\docommand##1##2%
+ {{\setbox0\hbox{\showlocation{\hbox to 1em{\hss\symbol[##2]\hss}}}%
+ \ifx##1\empty
+ % \hskip\wd0 % (optioneel maken)
+ \else
+ \expandafter\dodocommand\expandafter[##1]%
+ \fi}}%
+ \hskip\getvalue{\??id#1\c!distance}%
+ \docommand\firstlistreference\v!previous
+ \docommand\midlistreference\v!somewhere
+ \docommand\lastlistreference\v!next}%
+ % tot hier
+ \else
+ % no \endgraf
+ \noindent\c!entryreference
+ \limitedregisterentry{#1}{#2}%
+ \fi
+\endgraf}
+
+\def\dosetregister#1%
+ {\doifelsevalue{\??id#1\c!coupling}\v!yes
+ {\ifautoregisterhack
+ \dosetautoregister{#1}%
+ \else
+ \dosetlinkregister{#1}%
+ \fi}
+ {\dosetpageregister{#1}}}
+
+\newcounter\internallistreference
+
+\def\doloadregisterlinks#1%
+ {\dosetreglevel{#1}%
+ \setregisterpage{#1}%
+ \global\let\currentregisterentry\empty
+ \global\firstregisterpagetrue
+ \setvalue{#1\s!entrya}##1%
+ {\global\firstregisterpagetrue
+ \gdefconvertedargument\currentregisterentry{##1}% global nodig?
+ \doglobal\increment\internallistreference}%
+ \setvalue{#1\s!from}%
+ {\getvalue{#1\s!page}}%
+ \ifautoregisterhack
+ \setvalue{#1\s!page}##1##2##3##4%
+ {\doifreglevelelse[##3]
+ {\global\utilitydonetrue
+ \iffirstregisterpage
+ \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+ {\internallistreference::##4}%
+ \else % catches errors in index
+ \ifcsname\??id#1\??id\currentregisterentry\endcsname
+ \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+ {\csname\??id#1\??id\currentregisterentry\endcsname,##4}%
+ \fi
+ \fi}
+ {}}%
+ \else
+ \setvalue{#1\s!page}##1##2##3##4%
+ {\doifreglevelelse[##3]
+ {\global\utilitydonetrue
+ \iffirstregisterpage
+ \global\firstregisterpagefalse
+ \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+ {\internallistreference::##2-##4}%
+ \else % catches errors in index
+ \ifcsname\??id#1\??id\currentregisterentry\endcsname
+ \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+ {\csname\??id#1\??id\currentregisterentry\endcsname,##2-##4}%
+ \fi
+ \fi}
+ {}}%
+ \fi}
+
+\def\docoupleregister[#1][#2]%
+ {\iflocation
+ \ifcase0\countervalue{autolink:#1}\relax % only once
+ \begingroup
+ \let\dosetregister\doloadregisterlinks
+ \def\currentregister{#1}%
+ \setupregister[#1][#2]%
+ \doutilities\currentregister{\registerparameter\c!file}\currentregister\dobeforeplaceregister\doafterplaceregister
+ \endgroup
+ \ifautoregisterhack
+ \doinitializeautoregister{#1}%
+ \else
+ \doinitializelinkregister{#1}%
+ \fi
+ \fi
+ \fi}
+
+\def\coupleregister
+ {\dodoubleempty\docoupleregister}
+
+\def\dodocommandprolinrefAA[#1-#2]%
+ {\def\lastlistreference{#1-#2}}
+
+\def\dodocommandprolinrefA[#1-#2]%
+ {\def\lastlistreference{#1-#2}%
+ \ifx\firstlistreference\empty
+ \let\firstlistreference\lastlistreference
+ \fi
+ \ifnum#1<\nextinternalreference\relax
+ \let\prevlistreference\lastlistreference
+ \else\ifnum#1>\nextinternalreference\relax
+ \let\nextlistreference\lastlistreference
+ \let\dodocommandprolinrefA\dodocommandprolinrefAA
+ \else
+ \let\selflistreference\lastlistreference
+ \fi\fi}
+
+\def\docommandprolinrefA#1%
+ {\dodocommandprolinrefA[#1]}
+
+\def\dodocommandprolinrefB[#1-#2]%
+ {\gotonextinternal{\s!ind}{#1}{#2}{\box0}}
+
+\def\docommandprolinrefB#1#2#3%
+ {\bgroup
+ \ifx#2\empty
+ \doifvalue{\??id#1\c!unknownreference}\v!empty{\hskip1em}%
+ \else
+ \setbox0\hbox to 1em{\hss\showlocation{\symbol[#3]}\hss}%
+ \expandafter\dodocommandprolinrefB\expandafter[#2]%
+ \fi
+ \egroup}
+
+\def\doprocesslinkregister[#1][#2]#3%
+ {\hbox
+ {\doprocesspageregister[#2]{}{#3}%
+ \let\firstlistreference\empty
+ \let\lastlistreference\empty
+ \let\selflistreference\empty
+ \let\prevlistreference\empty
+ \let\nextlistreference\empty
+ \getalllistreferences{#1}{#3}%
+ \ifx\alllistreferences\empty \else
+ \expanded{\rawprocesscommalist[\alllistreferences]}\docommandprolinrefA
+ \fi
+ \ifx\prevlistreference\empty
+ \let\prevlistreference\lastlistreference
+ \fi
+ \ifx\nextlistreference\empty
+ \let\nextlistreference\firstlistreference
+ \fi
+ \ifx\prevlistreference\selflistreference
+ \let\prevlistreference\empty
+ \let\nextlistreference\empty
+ \fi
+ \setalignmentswitch{\getvalue{\??id#1\c!location}}%
+ \ifcase\alignmentswitch
+ % links
+ \docommandprolinrefB{#1}\prevlistreference\v!previous
+ \docommandprolinrefB{#1}\nextlistreference\v!next
+ \or
+ % midden
+ \docommandprolinrefB{#1}\prevlistreference\v!previous
+ \or
+ % rechts
+ \fi
+ \doifreferencefoundelse{\s!lin:\internallistreference}
+ {\gotosomeinternal
+ \s!lin \internallistreference \currentrealreference
+ {\showlocation{\limitedregisterentry{#1}{#3}}}}
+ {\hbox{\limitedregisterentry{#1}{#3}}}%
+ \ifcase\alignmentswitch
+ % links
+ \or
+ % midden
+ \docommandprolinrefB{#1}\nextlistreference\v!next
+ \or
+ % rechts
+ \docommandprolinrefB{#1}\prevlistreference\v!previous
+ \docommandprolinrefB{#1}\nextlistreference\v!next
+ \fi}}
+
+\def\doprocesslinkedregister[#1][#2]#3% page auto link
+ {\bgroup
+ \chardef\registerpagestatus\plusone
+ \def\currentregister{#1}%
+ \iflocation % \next is not needed
+ \ifautoregisterhack
+ \def\next{\doprocessautoregister[#1][#2]}%
+ \else
+ \def\next{\doprocesslinkregister[#1][#2]}%
+ \fi
+ \else
+ \def\next{\doprocesspageregister[#2]{}}%
+ \fi
+ \next{#3}%
+ \egroup}
+
+\def\dodolinkedregister[#1][#2]#3% page auto link
+ {\doflushatpar{\doprocesslinkedregister[#1][#2]{#3}}}
+
+\def\dolinkedregister#1%
+ {\dodoubleempty\dodolinkedregister[#1]}
+
+\def\dosetautoregister#1%
+ {\makecounter{autolink:#1}%
+ \dosetreglevel{#1}%
+ \setregisterpage{#1}%
+ \global\let\currentregisterentry\empty
+ \global\firstsubentrytrue % not needed
+ \global\firstsubsubentrytrue % not needed too
+ \setvalue{#1\s!entrya}##1{\dosetautoregisterentrya{#1}{##1}}%
+ \setvalue{#1\s!entry }##1{\dosetpageregisterletter{#1}{##1}}}
+
+\def\dosetautoregisterentrya#1#2%
+ {\global\utilitydonetrue
+ \c!entryletter
+ \iflocation
+ \getalllistreferences{#1}{#2}%
+ \endgraf\hangindent1em\noindent\c!entryreference
+ \pagereference[-:\s!lin:\internallistreference]%
+ \pluscounter{autolink:#1}%
+ \bgroup
+ %\setupinteraction[\c!color=,\c!contrastcolor=,\c!style=]% kan sneller
+ \resetinteractionparameter\c!color
+ \resetinteractionparameter\c!contrastcolor
+ \resetinteractionparameter\c!style
+ \gotobox
+ {\limitedregisterentry{#1}{\begstrut#2}}%
+ [JS(SetRegisterEntry{\v!register,\countervalue{autolink:#1},#2,{\alllistreferences}})]%
+ \egroup
+ \else
+ \endgraf\noindent\c!entryreference
+ \limitedregisterentry{#1}{#2}%
+ \fi}
+
+\def\doprocessautoregister[#1][#2]#3%
+ {\hbox
+ {\doprocesspageregister[#2]{}{#3}%
+ \doifreferencefoundelse{\s!lin:\internallistreference}
+ {\gotosomeinternal \s!lin
+ {\internallistreference}{\currentrealreference}
+ {\showlocation{\limitedregisterentry{#1}{#3}}}}
+ {\hbox{\limitedregisterentry{#1}{#3}}}}}
+
+% \appendmacro aan openpaginaactie (in shipout)
+
+%D The first implementation used one main field with clones.
+%D In a 2500 page document this resulted in a rather (anoying)
+%D long start||up time. This \quote {every page its own field}
+%D solution, combined with a \quote {page open action}, works
+%D much faster, but is conceptually pretty weak.
+
+\def\complexregisterfield[#1]%
+ {\definefield[#1:\realfolio][line][\v!register]%
+ \field[#1:\realfolio]}
+
+\def\simpleregisterfield
+ {\complexregisterfield[\v!register]}
+
+\definecomplexorsimple\registerfield
+
+\setupfield
+ [\v!register]
+ [\c!width=10em,
+ \c!height=3ex,
+ \c!align=\v!middle,
+ \c!option=\v!readonly,
+ \c!location=\v!low]
+
+\def\doinitializeautoregister#1%
+ {\useJSscripts[reg]%
+ \useJSpreamblenow{LinkedRegisters}%
+ \setupinteraction[\c!openpageaction=JS(UpdateRegisterField{\v!register})]%
+ \definereference[\v!reset\v!register][JS(ResetRegisterEntry{\v!register})]%
+ \definereference[\v!first\v!register][JS(GotoFirstRegisterEntry{\v!register})]%
+ \definereference[\v!previous\v!register][JS(GotoPreviousRegisterEntry{\v!register})]%
+ \definereference[\v!next\v!register][JS(GotoNextRegisterEntry{\v!register})]%
+ \definereference[\v!last\v!register][JS(GotoLastRegisterEntry{\v!register})]}
+
+\def\doinitializelinkregister#1%
+ {}
+
+% todo ruwe register
+
+\def\placeregister
+ {\dodoubleempty\doplaceregister}
+
+\def\doplaceregister[#1][#2]%
+ {\iffirstargument
+ \begingroup
+ \edef\currentregister{#1}%
+ \setupregister[\currentregister][#2]%
+ \doifelse{\registerparameter\c!compress}\v!yes % new
+ {\chardef\collapseregisterpages\plusone}
+ {\chardef\collapseregisterpages\zerocount}%
+% TH: disable next line
+% \raggedright
+% /TH
+ \startcolumns
+ [\c!n=\registerparameter\c!n,
+ \c!balance=\registerparameter\c!balance,
+ \c!align=\registerparameter\c!align,
+ tolerance=stretch]%
+ \dontcomplain
+ \startpacked[\v!blank]%
+ \doutilities\currentregister{\registerparameter\c!file}\currentregister\dobeforeplaceregister\doafterplaceregister
+ \stoppacked
+ \stopcolumns
+ \endgroup
+ \fi}
+\def\dobeforeplaceregister
+ {\resetseenregisterpage
+ \relax}
+
+\def\doafterplaceregister
+ {\flushseenregisterpage
+ \par}
+
+\def\completeregister
+ {\dodoubleempty\docompleteregister}
+
+\def\docompleteregister[#1][#2]%
+ {\iffirstargument
+ \begingroup
+ \edef\currentregister{#1}%
+ % the expansion is needed because we don't want \v!'s in the tuo file (french)
+ \expanded{\systemsuppliedchapter[\currentregister]{\noexpand\headtext{\currentregister}}}%
+ \placeregister[\currentregister][#2]%
+ \page[\v!yes]%
+ \endgroup
+ \fi}
+
+\def\doregisterregisterlanguage#1%
+ {\savesortlanguage{\getvalue{\??id#1\s!language}}%
+ \expanded{\immediatewriteutility{r l {#1} {\getvalue{\??id#1\s!language}}}}}
+
+\def\dodefineregister[#1][#2]%
+ {\setupregister[#1]%
+ [\c!n=2,
+ \c!balance=\v!yes, % \v!no komt niet zo vaak voor
+ \c!align=\v!flushleft,
+ \c!before=\blank, % binnen kolommen: \blank[\v!line]
+ \c!after=,
+ \c!symbol=,
+ \c!compress=\v!no,
+ \c!interaction=\v!pagenumber,
+ \c!alternative=\v!a,
+ \c!distance=1em,
+ \c!style=\v!bold,
+ \c!pagestyle=\v!slanted,
+ \c!indicator=\v!yes,
+ \v!part\v!number=\v!yes, % v
+ \v!chapter\c!number=\v!no,
+ \c!criterium=\v!all,
+ \c!command=,
+ \c!referencing=\v!on,
+ \c!location=\v!middle,
+ \c!maxwidth=,
+ \c!number=\v!no,
+ \c!unknownreference=\v!empty,
+ \c!prefix=\v!both,
+ \c!expansion=,
+ \c!keyexpansion=,
+ \c!file=\jobname,
+ %\c!deeptextcommand=, % undefined by default !
+ \s!language=\currentmainlanguage]%
+ \doglobal\appendtoksonce
+ \doregisterregisterlanguage{#1}%
+ \to \everysavesortkeys
+ \presetheadtext[#1=\Word{#1}]%
+ \addutilityreset{#1}%
+ \setvalue{#1}{\doregister{#1}}%
+ \setvalue{\e!coupled#1}{\dolinkedregister{#1}}%
+ \setvalue{\s!set#1}{\dosetregister{#1}}%
+ \setvalue{\s!reset#1}{\doresetregister{#1}}%
+ \setvalue{\e!see#1}{\doseeregister{#1}}%
+ \setvalue{\e!place#1}{\placeregister[#1]}%
+ \setvalue{\e!complete#1}{\completeregister[#1]}%
+ \setvalue{\e!setup#1\e!endsetup}[##1]{\getparameters[\??id#1][##1]}}
+
+\def\defineregister
+ {\dodoubleargument\dodefineregister}
+
+\def\registerlengte{\utilityregisterlength}
+
+\def\utilityregisterlength{0}
+
+\def\dodetermineregistercharacteristics[#1][#2]%
+ {\begingroup
+ \def\currentregister{#1}%
+ \setupregister[#1][#2]%
+ \dosetreglevel{#1}%
+ \setvalue{#1\s!from}%
+ {\getvalue{#1\s!page}}%
+ \setvalue{#1\s!page}##1##2##3##4%
+ {\doifreglevelelse[##3]
+ {\doglobal\increment\utilitylistlength
+ \global\utilitydonetrue}
+ {}}%
+ \doglobal\newcounter\utilityregisterlength
+ \setbox0\vbox{\doutilities\currentregister{\registerparameter\c!file}\currentregister\dobeforeplaceregister\doafterplaceregister}%
+ \endgroup
+ \ifregistergeplaatst
+ \setsystemmode \v!register
+ \else
+ \resetsystemmode\v!register
+ \fi}
+
+\def\determineregistercharacteristics
+ {\dodoubleempty\dodetermineregistercharacteristics}
+
+%D Default index:
+
+\defineregister
+ [\v!index]
+ [\v!indices]
+
+% \setupregister[index][koppeling=ja]
+%
+% \stelveldenin
+% [register][achtergrond=raster,kader=uit]
+%
+% \stelvoettekstenin
+% [{\field[index]}]
+%
+% \stelhoofdtekstenin
+% [{\naar {first}[eersteindex]\quad
+% \naar{previous}[vorigeindex]\quad
+% \naar {next}[volgendeindex]\quad
+% \naar {last}[laatsteindex]\quad\quad
+% \naar {index}[index]}]
+%
+% \starttekst
+%
+% oeps~~~\gekoppeldeindex{oeps} \blanko
+% flop~~~\gekoppeldeindex{flop} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% flop~~~\gekoppeldeindex{flop} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% oeps~~~\gekoppeldeindex{oeps} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% flop~~~\gekoppeldeindex{flop} \blanko
+% oeps~~~\gekoppeldeindex{oeps} \pagina
+%
+% \volledigeindex
+
+\protect \endinput
diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv
new file mode 100644
index 000000000..fcc37549c
--- /dev/null
+++ b/tex/context/base/strc-reg.mkiv
@@ -0,0 +1,1137 @@
+%D \module
+%D [ file=strc-reg,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Registers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Registers}
+
+\registerctxluafile{strc-reg}{1.001}
+
+\unprotect
+
+\def\c!keys {keys}
+\def\c!entries{entries}
+
+% todo: tag:: becomes rendering
+% todo: language, character, linked, location
+
+%D Helper:
+
+% \def\doflushatpar{\ifvmode\expandafter\dogotopar\else\expandafter\firstofoneargument\fi}
+
+\def\doflushatpar{\ifvmode\expandafter\flushatnextpar\else\expandafter\firstofoneargument\fi}
+
+% \starttext
+% \placeregister[index]
+% \chapter{a} \index{93} \index{456} \index{***} \index{*} \index{@}
+% test \index{aa} test \startregister[index][x]{bb} test \page test \page test \page test \stopregister[index][x]
+% test \index{aa} test \setregisterentry[index][label=x,entries=bb] test \page test \page test \page test \finishregisterentry[index][label=x]
+% test \index{aa} test \setregisterentry[index][label=y] test \page test \page test \page test \finishregisterentry[index][label=y,entries=yy]
+% \stoptext
+
+% In plaats van + kan een & worden gebruikt. Ook kan als
+% eerste karakter worden opgegeven wat de scheider is.
+%
+% \index {entry}
+% \index[key] {entry}
+% \index[pageclass::] {entry}
+% \index[pageclass::key]{entry}
+% \index {textclass::entry}
+% \index[key] {textclass::entry}
+% \index[pageclass::] {textclass::entry}
+% \index[pageclass::key]{textclass::entry}
+
+%D Parameters:
+
+\let\currentregister\empty
+
+% \def\registerparameter#1{\csname\??id\currentregister#1\endcsname}
+
+\def\detokenizedregisterparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??id#1\endcsname}} % always root
+
+\def\registerparameter #1{\csname\doregisterparameter{\??id\currentregister}{#1}\endcsname}
+\def\registerparameterhash#1{\doregisterparameterhash {\??id\currentregister}#1}
+
+\def\doregisterparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doregisterparentparameter \csname#1\s!parent\endcsname{#2}\fi}
+\def\doregisterparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doregisterparentparameterhash\csname#1\s!parent\endcsname{#2}\fi}
+
+\def\doregisterparentparameter #1#2{\ifx#1\relax\s!empty\else\doregisterparameter #1{#2}\fi}
+\def\doregisterparentparameterhash#1#2{\ifx#1\relax \else\doregisterparameterhash#1{#2}\fi}
+
+\def\dosetregisterattributes#1#2% style color
+ {\edef\fontattributehash {\registerparameterhash#1}%
+ \edef\colorattributehash{\registerparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+%D Setup:
+
+\newtoks\everysetupregister
+
+\unexpanded\def\setupregisters
+ {\dotripleempty\dosetupregisters}
+
+\def\dosetupregisters[#1][#2][#3]%
+ {\ifthirdargument
+ \def\dodosetupregister##1{\getparameters[\??id##1#2][#3]}%
+ \processcommalist[#1]\dodosetupregister
+ \else\ifsecondargument
+ \def\dodosetupregister##1{\edef\currentregister{##1}\getparameters[\??id##1][#2]\the\everysetupregister}%
+ \processcommalist[#1]\dodosetupregister
+ \else
+ \getparameters[\??id][#1]%
+ \fi\fi}
+
+\let\setupregister\setupregisters
+
+\setupregisters
+ [\c!n=2,
+ \c!balance=\v!yes, % \v!no komt niet zo vaak voor
+ \c!align=\v!flushleft,
+ \c!tolerance=\v!stretch,
+ \c!before=\blank,
+ %\c!after=,
+ %\c!symbol=,
+ \c!compress=\v!no,
+ \c!interaction=\v!pagenumber,
+ \c!alternative=\v!a,
+ \c!distance=1em,
+ \c!style=\v!bold,
+ \c!pagestyle=\v!slanted,
+ \c!indicator=\v!yes,
+ \c!criterium=\v!all,
+ %\c!command=,
+ \c!referencing=\v!on,
+ \c!location=\v!middle,
+ %\c!maxwidth=,
+ \c!number=\v!no,
+ \c!unknownreference=\v!empty,
+ \c!prefix=\v!both,
+ %\c!expansion=,
+%\c!xmlsetup=,
+ \c!pageprefixconnector=\endash,
+ \c!pagesegments=2:2,
+ \c!file=\jobname,
+ %\c!deeptextcommand=, % undefined by default !
+ \s!language=\currentmainlanguage]%
+
+%D Definition:
+
+\unexpanded\def\defineregister
+ {\dodoubleargument\dodefineregister}
+
+\def\dodefineregister[#1][#2]% #2?
+ {\setupregister[#1][\s!parent=\??id]%
+ \ctxlua{jobregisters.define('#1')}%
+ \presetheadtext[#1=\Word{#1}]%
+ \setuvalue{#1}{\dodoubleempty\doregister[#1]}%
+ \setuvalue{\e!see#1}{\dodoubleempty\doseeregister[#1]}%
+% \setuvalue{\e!coupled#1}{\dolinkedregister{#1}}%
+ \setvalue{\e!place#1}{\placeregister[#1]}%
+ \setvalue{\e!complete#1}{\completeregister[#1]}%
+ \setvalue{\e!setup#1\e!endsetup}[##1]{\getparameters[\??id#1][##1]}}
+
+%D Registering:
+
+\newif\ifwritetoregister \writetoregistertrue
+
+% tzt variant met n entries, parameters en userdata (altnum)
+
+\getparameters
+ [\??id]
+ [\c!label=,
+ \c!entries=,
+ \c!entries:1=,\c!entries:2=,\c!entries:3=,
+ \c!keys:1=,\c!keys:2=,\c!keys:3=,
+ \c!alternative=]
+
+\def\doregisterstructurepageregister
+ {\iftrialtypesetting
+ \expandafter\gobblethreearguments
+ \else
+ \expandafter\dodoregisterstructurepageregister
+ \fi}
+
+\def\dodoregisterstructurepageregister#1#2#3% register data userdata
+ {\begingroup
+ \edef\currentregister{#1}%
+ %getparameters[\??id][\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]%
+ \getparameters[\??id][#2]%
+ \edef\currentregisterlabel {\registerparameter\c!label}%
+ \edef\currentregisterexpansion{\registerparameter\c!expansion}%
+ \edef\currentregisterownnumber{\registerparameter\c!ownnumber}%
+ \xdef\currentregisterkeys {\registerparameter\c!keys}%
+ \xdef\currentregisterentries {\registerparameter\c!entries}%
+ \xdef\currentregisterxmlsetup {\registerparameter\c!xmlsetup}%
+ \ifx\currentregisterentries\empty
+ \ifx\currentregisterexpansion\s!xml
+ \xmlstartraw
+ \xdef\currentregisterentriesa{\registerparameter{\c!entries:1}}%
+ \xdef\currentregisterentriesb{\registerparameter{\c!entries:2}}%
+ \xdef\currentregisterentriesc{\registerparameter{\c!entries:3}}%
+ \xmlstopraw
+ \globallet\currentregistercoding\s!xml
+ \else
+ \ifx\currentregisterexpansion\v!yes
+ \xdef\currentregisterentriesa{\registerparameter{\c!entries:1}}%
+ \xdef\currentregisterentriesb{\registerparameter{\c!entries:2}}%
+ \xdef\currentregisterentriesc{\registerparameter{\c!entries:3}}%
+ \else
+ \xdef\currentregisterentriesa{\detokenizedregisterparameter{\c!entries:1}}%
+ \xdef\currentregisterentriesb{\detokenizedregisterparameter{\c!entries:2}}%
+ \xdef\currentregisterentriesc{\detokenizedregisterparameter{\c!entries:3}}%
+ \fi
+ \globallet\currentregistercoding\s!tex
+ \fi
+ \else
+ \ifx\currentregisterexpansion\s!xml
+ \xmlstartraw
+ \xdef\currentregisterentries{\registerparameter\c!entries}%
+ \xmlstopraw
+ \globallet\currentregistercoding\s!xml
+ \else
+ \ifx\currentregisterexpansion\v!yes
+ \xdef\currentregisterentries{\registerparameter\c!entries}%
+ \else
+ \xdef\currentregisterentries{\detokenizedregisterparameter\c!entries}%
+ \fi
+ \globallet\currentregistercoding\s!tex
+ \fi
+ \fi
+ \ifx\currentregisterkeys\empty
+ \ifx\currentregistercoding\s!xml
+ \xmlstartraw
+ \xdef\currentregisterkeysa{\registerparameter{\c!keys:1}}%
+ \xdef\currentregisterkeysb{\registerparameter{\c!keys:2}}%
+ \xdef\currentregisterkeysc{\registerparameter{\c!keys:3}}%
+ \xmlstopraw
+ \else
+ \xdef\currentregisterkeysa{\registerparameter{\c!keys:1}}%
+ \xdef\currentregisterkeysb{\registerparameter{\c!keys:2}}%
+ \xdef\currentregisterkeysc{\registerparameter{\c!keys:3}}%
+ \fi
+ \fi
+ \setnextinternalreference
+ % we could consider storing register entries in a list which we
+ % could then sort
+ \xdef\currentregisternumber{\ctxlua{
+ jobregisters.store { % 'own' should not be in metadata
+ metadata = {
+ kind = "entry",
+ name = "\currentregister",
+ level = structure.sections.currentlevel(),
+ coding = "\currentregistercoding",
+ catcodes = \the\catcodetable,
+ \ifx\currentregisterownnumber\v!yes
+ own = "\registerparameter\c!alternative", % can be used instead of pagenumber
+ \fi
+ xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
+\ifx\currentregisterxmlsetup\empty \else
+ xmlsetup = "\currentregisterxmlsetup",
+\fi
+ },
+ references = {
+ internal = \nextinternalreference,
+ section = structure.sections.currentid(), % hm, why then not also lastsection the same way
+ label = "\currentregisterlabel",
+ },
+% \ifx\currentregisterentries\empty \else
+ entries = {
+ % we need a special one for xml, this is just a single one
+ \ifx\currentregisterentries\empty
+ { \!!bs\currentregisterentriesa\!!es, \!!bs\currentregisterentriesb\!!es, \!!bs\currentregisterentriesc\!!es },
+ \else
+ \!!bs\currentregisterentries\!!es,
+ \fi
+ \ifx\currentregisterkeys\empty
+ { \!!bs\currentregisterkeysa\!!es, \!!bs\currentregisterkeysb\!!es, \!!bs\currentregisterkeysc\!!es },
+ \else
+ \!!bs\currentregisterkeys\!!es,
+ \fi
+ },
+% \fi
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ }
+ } }%
+ \ctxlua{jobreferences.setinternalreference(nil,nil,\nextinternalreference)}%
+ \ifx\currentregisterownnumber\v!yes
+ \glet\currentregistersynchronize\relax
+ \else
+ \xdef\currentregistersynchronize{\ctxlatelua{jobregisters.enhance("\currentregister",\currentregisternumber)}}%
+ \fi
+ \currentregistersynchronize % here?
+ \attribute\destinationattribute\lastdestinationattribute \forcecolorhack % no \strut as it will be removed during cleanup
+ \endgroup}
+
+\def\doregister[#1][#2]%
+ {\def\currentregister{#1}%
+ \doifelse{\registerparameter\c!ownnumber}\v!yes\dodoregister\donoregister{#1}{#2}}
+
+\def\donoregister #1#2#3{\doflushatpar{\doregisterstructurepageregister{#1}{\c!keys={#2},\c!entries={#3}}{}}}
+\def\dodoregister#1#2#3#4{\doflushatpar{\doregisterstructurepageregister{#1}{\c!keys={#2},\c!alternative=#3,\c!entries={#4}}{}}}
+
+\unexpanded\def\startregister{\doquadrupleempty\dostartregister}
+\unexpanded\def\stopregister {\dodoubleargument\dostopregister}
+
+% a synonym, so that we can nest with overlap without syntax check problems
+
+\let\openregisterrange \startregister
+\let\closeregisterrange\stopregister
+
+\def\dostartregister[#1][#2][#3][#4]#5%
+ {\iffourthargument
+ % #1=register #2=tag #3=own #4=sortkey #5=entry
+ \doflushatpar{\doregisterstructurepageregister{#1}{\c!label=#2,\c!alternative=#3,\c!keys={#4},\c!entries={#5}}{}}%
+ \else
+ % #1=register #2=tag #3=sortkey #5=entry
+ \doflushatpar{\doregisterstructurepageregister{#1}{\c!label=#2,\c!keys={#3},\c!entries={#5}}{}}%
+ \fi}
+
+\def\dostopregister[#1][#2]%
+ {\normalexpanded{\ctxlatelua{jobregisters.extend("#1","#2")}}}
+
+\def\setregisterentry {\dotripleempty\dosetregisterentry}
+\def\finishregisterentry{\dotripleempty\dofinishregisterentry}
+
+% not yet document, not sure if this will stay:
+
+\def\dosetregisterentry [#1][#2][#3]{\doflushatpar{\doregisterstructurepageregister{#1}{#2}{#3}}}
+\def\dofinishregisterentry[#1][#2][#3]{\dofinishregisterstructurepageregister{#1}{#2}{#3}}
+
+\def\dofinishregisterstructurepageregister#1#2#3% register data userdata
+ {\begingroup
+ \edef\currentregister{#1}%
+ \getparameters[\??id][\c!entries=,\c!label=,\c!keys=,\c!alternative=,#2]%
+ \edef\currentregisterlabel {\registerparameter\c!label}%
+ \edef\currentregisterexpansion{\registerparameter\c!expansion}%
+ \edef\currentregisterownnumber{\registerparameter\c!ownnumber}%
+ \xdef\currentregisterkeys {\registerparameter\c!keys}%
+ \ifx\currentregisterexpansion\s!xml
+ \xmlstartraw
+ \xdef\currentregisterentries{\registerparameter\c!entries}%
+ \xmlstopraw
+ \globallet\currentregistercoding\s!xml
+ \else
+ \ifx\currentregisterexpansion\v!yes
+ \xdef\currentregisterentries{\registerparameter\c!entries}%
+ \else
+ \xdef\currentregisterentries{\detokenizedregisterparameter\c!entries}%
+ \fi
+ \globallet\currentregistercoding\s!tex
+ \fi
+ \ifx\currentregisterentries\empty
+ \normalexpanded{\ctxlua{jobregisters.extend("\currentregister","\currentregisterlabel", {
+ metadata = {
+ \ifx\currentregisterownnumber\v!yes
+ own = "\registerparameter\c!alternative", % can be used instead of pagenumber
+ \fi
+ },
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ })%
+ }}%
+ \else
+ \normalexpanded{\ctxlua{jobregisters.extend("\currentregister","\currentregisterlabel", {
+ metadata = {
+ catcodes = \the\catcodetable,
+ coding = "\currentregistercoding",
+ \ifx\currentregisterownnumber\v!yes
+ own = "\registerparameter\c!alternative", % can be used instead of pagenumber
+ \fi
+ },
+ entries = {
+ % we need a special one for xml, this is just a single one
+ \!!bs\currentregisterentries\!!es, \!!bs\currentregisterkeys\!!es
+ },
+ userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ })
+ }}%
+ \fi
+ \endgroup}
+
+% The following variants are meant for (for instance xml). There is some
+% overlap with previously defined macros.
+%
+% \starttext
+% \setstructurepageregister[index][entries=alpha]a
+% \setstructurepageregister[index][entries=gamma]g
+% \setstructurepageregister[index][entries=beta]b
+% \setstructurepageregister[index][entries:1=alpha,keys:1=z]a
+% \setstructurepageregister[index][entries:1=gamma,keys:1=x]g
+% \setstructurepageregister[index][entries:1=beta, keys:1=y]b
+% \index{alpha}a
+% \index{gamma}g
+% \index{beta}b
+% \placeregister[index][n=1]
+% \stoptext
+
+\def\setstructurepageregister{\dotripleempty\dosetstructurepageregister}
+
+\def\dosetstructurepageregister[#1][#2][#3]% [register][settings][userdata]
+ {\doflushatpar{\doregisterstructurepageregister{#1}{#2}{#3}}}
+
+\unexpanded\def\startstructurepageregister{\doquadrupleempty\dostartstructurepageregister}
+\unexpanded\def\stopstructurepageregister {\dodoubleargument\dostopstructurepageregister}
+
+\let\openstructurepageregisterrange \startstructurepageregister
+\let\closestructurepageregisterrange\stopstructurepageregister
+
+\def\dostartstructurepageregister[#1][#2][#3][#4]% [register][tag][settings][userdata]
+ {\doflushatpar{\doregisterstructurepageregister{#1}{\c!label=#2,#3}{#4}}}
+
+\def\dostopstructurepageregister[#1][#2]%
+ {\normalexpanded{\ctxlatelua{jobregisters.extend("#1","#2")}}}
+
+% So far.
+
+\def\doseeregister[#1][#2]#3#4%
+ {\doflushatpar{\doprocessseeregister{#1}{#2}{#3}{#4}}}
+
+\def\doprocessseeregister#1#2#3#4% register key entry seeword
+ {\begingroup
+ \edef\currentregister{#1}%
+ \edef\currentregisterexpansion{\registerparameter\c!expansion}%
+ \ifx\currentregisterexpansion\s!xml
+ \xmlstartraw
+ \xdef\currentregisterentries{\detokenize{#3}}% not ok yet
+ \xdef\currentregisterseeword{\detokenize{#4}}% not ok yet
+ \xmlstopraw
+ \globallet\currentregistercoding\s!xml
+ \else
+ \ifx\currentregisterexpansion\v!yes
+ \xdef\currentregisterentries{#3}% not ok yet
+ \xdef\currentregisterseeword{#4}% not ok yet
+ \else
+ \xdef\currentregisterentries{\detokenize{#3}}% not ok yet
+ \xdef\currentregisterseeword{\detokenize{#4}}% not ok yet
+ \fi
+ \globallet\currentregistercoding\s!tex
+ \fi
+ \setnextinternalreference
+ % we could consider storing register entries in list
+ \edef\temp{\ctxlua{ jobregisters.store {
+ metadata = {
+ kind = "see",
+ name = "\currentregister",
+ level = structure.sections.currentlevel(),
+ catcodes = \the\catcodetable,
+ },
+ references = {
+ internal = \nextinternalreference,
+ section = structure.sections.currentid(),
+ },
+ entries = {
+ % we need a special one for xml, this is just a single one
+ "\currentregisterentries", "#2"
+ },
+ seeword = {
+ text = "\currentregisterseeword"
+ },
+ }
+ }}%
+ \endgroup}
+
+%D Rendering:
+
+\let\utilityregisterlength\!!zerocount
+
+\def\determineregistercharacteristics
+ {\dodoubleempty\dodetermineregistercharacteristics}
+
+\def\dodetermineregistercharacteristics[#1][#2]%
+ {\begingroup
+ \edef\currentregister{#1}%
+ \setupregister[\currentregister][#2]%
+ \normalexpanded{\endgroup\noexpand\xdef\noexpand\utilityregisterlength{\ctxlua{jobregisters.analyse('\currentregister',{
+ language = "\registerparameter\s!language",
+ compress = "\registerparameter\c!compress",
+ criterium = "\registerparameter\c!criterium",
+ })}}}% brrr
+ \ifcase\utilityregisterlength\relax
+ \resetsystemmode\v!register
+ \else
+ \setsystemmode \v!register
+ \fi}
+
+\newtoks\everyplaceregister
+
+\appendtoks
+ \dontcomplain
+\to \everyplaceregister
+
+\unexpanded\def\placeregister
+ {\dodoubleempty\doplaceregister}
+
+\def\doplaceregister[#1][#2]%
+ {\iffirstargument
+ \begingroup
+% \forgetall
+ \edef\currentregister{#1}%
+ \setupregister[\currentregister][#2]%
+ \the\everyplaceregister
+ \startcolumns
+ [\c!n=\registerparameter\c!n,
+ \c!balance=\registerparameter\c!balance,
+ \c!align=\registerparameter\c!align,
+ \c!tolerance=\registerparameter\c!tolerance]%
+ \startpacked[\v!blank]%
+ \ctxlua{jobregisters.process('\currentregister',{
+ language = "\registerparameter\s!language",
+ compress = "\registerparameter\c!compress",
+ criterium = "\registerparameter\c!criterium",
+ },
+ {
+% prefix = "\registerparameter\c!pageprefix",
+ separatorset = "\registerparameter\c!pageprefixseparatorset",
+ conversionset = "\registerparameter\c!pageprefixconversionset",
+ starter = \!!bs\registerparameter\c!pageprefixstarter\!!es,
+ stopper = \!!bs\registerparameter\c!pageprefixstopper\!!es,
+ set = "\registerparameter\c!pageprefixset",
+ segments = "\registerparameter\c!pageprefixsegments",
+ connector = \!!bs\registerparameter\c!pageprefixconnector\!!es,
+ },
+ {
+ prefix = "\registerparameter\c!pageprefix",
+ separatorset = "\registerparameter\c!pageseparatorset",
+ conversionset = "\registerparameter\c!pageconversionset",
+ starter = \!!bs\registerparameter\c!pagestarter\!!es,
+ stopper = \!!bs\registerparameter\c!pagestopper\!!es,
+ segments = "\registerparameter\c!pagesegments",
+ }
+ )}%
+ \stoppacked
+ \stopcolumns
+ \endgroup
+ \fi}
+
+\def\dolimitedregisterentry#1{\limitatetext{#1}\currentregistermaxwidth\unknown}%
+
+\appendtoks
+ \edef\currentregistermaxwidth{\registerparameter\c!maxwidth}%
+ \ifx\currentregistermaxwidth\empty
+ \let\limitedregisterentry\firstofoneargument
+ \else
+ \let\limitedregisterentry\dolimitedregisterentry
+ \fi
+\to \everyplaceregister
+
+\def\completeregister
+ {\dodoubleempty\docompleteregister}
+
+\def\docompleteregister[#1][#2]%
+ {\iffirstargument
+ \begingroup
+ \edef\currentregister{#1}%
+ % the expansion is needed because we don't want \v!'s in the tuo file (french)
+ \normalexpanded{\systemsuppliedchapter[\currentregister]{\noexpand\headtext{\currentregister}}}%
+ \placeregister[\currentregister][#2]%
+ \page[\v!yes]%
+ \endgroup
+ \fi}
+
+% test case for collapsing (experimental, for Steffen Wolfrum)
+%
+% \starttext
+% \placeregister[index][compress=no] \blank[2*big]
+% \placeregister[index][compress=yes] \blank[2*big]
+% \placeregister[index][compress=all] \page
+% \dorecurse{10}{test 1:!\index{test} test \page}
+% \dorecurse{5} {test 2:\recurselevel \page}
+% \dorecurse{10}{test 3:!\index{test} test \page}
+% \dorecurse{5} {test 4:\recurselevel \page}
+% \dorecurse{1} {test 5:!\index{test} test \page}
+% \dorecurse{5} {test 6:\recurselevel \page}
+% \dorecurse{10}{test 7:!\index{test} test \page}
+% \dorecurse{5} {test 8:\recurselevel \page}
+% oeps \index{oeps}
+% xxxx \index{xxxx}
+% todo \index{todo}
+% \stoptext
+
+%D Character rendering (sections):
+
+\def\defaultregistercharacter#1%
+ {\doifsomething{#1}
+ {\doifnot{#1}\s!unknown
+ {\doifelse{\registerparameter\c!indicator}\v!yes
+ {\expandcheckedcsname{\??id:\c!indicator:}{\registerparameter\c!alternative}{a}{#1}}
+ {\noregistercharacter{#1}}}}}
+
+\def\noregistercharacter#1%
+ {\registerparameter\c!before
+ \goodbreak}
+
+% a = <before> <goodbreak> <character> <par> <after> <nobreak>
+
+\setvalue{\??id:\c!indicator:a}#1%
+ {\registerparameter\c!before
+ % bugged, why does leftskip gets set: \vskip\lineheight\goodbreak\vskip-\lineheight
+ \begingroup\dosetregisterattributes\c!style\c!color
+ \registerparameter\c!command{\strut#1}%
+ \endgroup
+ \registerparameter\c!after
+ \par\nobreak}
+
+
+% b = <goodbreak> <before> <character> <after> <nobreak>
+
+\setvalue{\??id:\c!indicator:b}#1%
+ {\registerparameter\c!before
+ \begingroup\dosetregisterattributes\c!style\c!color
+ \registerparameter\c!command{\strut#1}%
+ \endgroup
+ \registerparameter\c!after
+ \nobreak}
+
+\setvalue{\??id:\c!indicator:A}#1{\getvalue{\??id:\c!indicator:a}{\WORD{#1}}}
+\setvalue{\??id:\c!indicator:B}#1{\getvalue{\??id:\c!indicator:b}{\WORD{#1}}}
+
+%D The following macros are the interface to the rendering. These are
+%D generated by \LUA. This might change.
+
+%D Beware, we get funny side effects when a dangling \index precedes an
+%D placeindex as then flushing takes place inside the index. Took me hours
+%D to notice that.
+
+\unexpanded\def\startregisteroutput
+ {\endgraf
+ \begingroup
+ \forgetparindent
+ \forgetparskip}
+
+\unexpanded\def\stopregisteroutput
+ {\endgraf
+ \endgroup}
+
+\unexpanded\def\startregisterentries#1% depth
+ {\endgraf
+ \begingroup
+ \dosetregisterattributes\c!textstyle\c!textcolor
+ \advance\leftskip\numexpr#1-1\relax\dimexpr\registerparameter\c!distance\relax
+ \hangindent\registerparameter\c!distance\hangafter\plusone}
+
+\unexpanded\def\stopregisterentries
+ {\endgraf
+ \endgroup}
+
+\unexpanded\def\startregistersection#1% title
+ {\registercharacter{#1}\endgraf}
+
+\unexpanded\def\stopregistersection
+ {\endgraf}
+
+\newconditional\registerpagedone
+
+\unexpanded\def\startregisterpages
+ {\begingroup
+ \setfalse\registerpagedone
+ \dosetregisterattributes\c!pagestyle\c!pagecolor}
+
+\unexpanded\def\stopregisterpages
+ {\endgroup}
+
+\unexpanded\def\startregisterseewords
+ {\begingroup
+ \setfalse\registerpagedone
+ \dosetregisterattributes\c!pagestyle\c!pagecolor}
+
+\unexpanded\def\stopregisterseewords
+ {\endgroup}
+
+\def\registerpageseparator% todo: , configurable
+ {\ifconditional\registerpagedone
+ \registerpageseparatorsymbol
+ \else
+ \hskip\registerparameter\c!distance\relax
+ \settrue\registerpagedone
+ \fi}
+
+\def\registeronepagerangeseparator{|\endash|}
+
+\def\withregisterpagecommand#1#2#3%
+ {\def\currentregisterpageindex{#1}%
+ \iflocation
+ \goto{\registerparameter\c!pagecommand{#3}}[internal(#1)]%
+ \else
+ \registerparameter\c!pagecommand{#3}%
+ \fi}
+
+\def\registeronepage#1#2#3% content
+ {\registerpageseparator
+ \withregisterpagecommand{#1}{#2}{#3}}
+
+\def\registerpagerange#1#2#3#4#5#6% content, content todo: -- configurable
+ {\registerpageseparator
+ \withregisterpagecommand{#1}{#2}{#3}%
+ \registeronepagerangeseparator
+ \withregisterpagecommand{#4}{#5}{#6}}
+
+\def\registeroneword#1#2#3% content
+ {\registerpageseparator
+ \registerseeword{#3}}
+
+\def\defaultregisterentry #1{\registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#1}}}}
+\def\defaultregisterseeword#1{\labeltexts\v!see{#1}}
+
+\let\registerseeword \defaultregisterseeword
+\let\registerentry \defaultregisterentry
+\let\registercharacter\defaultregistercharacter
+
+%D A few specific rendering variants:
+
+% \def\doregisterpagelocation#1#2%
+% {\nextregisterpage
+% \hbox to 1em{\hss\doregisterpagehowto{#1}{#2}\hss}}
+
+% todo: \installregisterpagehandler
+
+% \def\MyRegisterPageCommand#1%
+% {#1\currentregisterpageuserdata{whatever}}
+%
+% \starttext
+% \setregisterentry[index][entries=aaa][whatever=f.] test \index{bbb} test
+% \placeregister[index][n=1,pagecommand=\MyRegisterPageCommand]
+% \stoptext
+
+\def\registerpageuserdata #1#2{\ctxlua{jobregisters.userdata(#1,"#2")}}
+\def\currentregisterpageuserdata {\registerpageuserdata\currentregisterpageindex} % {#1}
+
+% not yet ok : new internal handler names
+
+\def\registerpagebuttonsymbol{\vrule\!!width1em\!!height1ex\!!depth\zeropoint\relax}
+
+\setvalue{\??id:\c!symbol:\c!n}%
+ {\def\registerpageseparatorsymbol{, }}
+
+\setvalue{\??id:\c!symbol:\c!a}%
+ {\def\registerpageseparatorsymbol{, }} % now done via conversion
+
+\setvalue{\??id:\c!symbol:\v!none}%
+ {\let\registerpageseparatorsymbol\empty
+ \let\registeronepage \gobblethreearguments
+ \let\registerpagerange \gobblesixarguments}
+
+\setvalue{\??id:\c!symbol:1}%
+ {\let\registerpageseparatorsymbol\space
+ \def\registeronepage {\symbol[1]\gobblethreearguments}%
+ \def\registerpagerange {\symbol[1]\gobblesixarguments}}
+
+\setvalue{\??id:\c!symbol:2}%
+ {\let\registerpageseparatorsymbol\space
+ \def\registeronepage {\registerpagebuttonsymbol\gobblethreearguments}%
+ \def\registerpagerange {\registerpagebuttonsymbol\gobblesixarguments}}
+
+\def\setregisterpagerendering
+ {\edef\currentregisterpagesymbol{\registerparameter\c!symbol}%
+ \ifx\currentregisterpagesymbol\empty
+ \csname\??id:\c!symbol:\c!n\endcsname
+ \else\ifcsname\??id:\c!symbol:\currentregisterpagesymbol\endcsname
+ \csname\??id:\c!symbol:\currentregisterpagesymbol\endcsname
+ \else
+ \let\registerpageseparatorsymbol\space
+ \def\registeronepage {\registerparameter\c!symbol\gobblethreearguments}%
+ \def\registerpagerange {\registerparameter\c!symbol\gobblesixarguments}%
+ \fi\fi}
+
+\appendtoks
+ \setregisterpagerendering
+\to \everyplaceregister
+
+% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+
+%D The following code will be reimplemented (not that hard) when it's needed
+%D again and/or when I'm bored.
+
+% \def\getalllistreferences#1#2%
+% {\gdefconvertexpanded\currentregisterentry{\getvalue{\??id#1\c!expansion}}{#2}%
+% \doifdefinedelse{\??id#1\??id\currentregisterentry}
+% {\edef\alllistreferences%
+% {\getvalue{\??id#1\??id\currentregisterentry}}%
+% \beforesplitstring\alllistreferences\at::\to\internallistreference
+% \aftersplitstring \alllistreferences\at::\to\alllistreferences}
+% {\let\alllistreferences\empty
+% \def\internallistreference{0}}}
+
+% \def\dosetlinkregister#1% is die page reference echt nodig?
+% {\setregisterpage{#1}%
+% \global\let\currentregisterentry\empty
+% \global\firstsubentrytrue % not needed
+% \global\firstsubsubentrytrue % not needed too
+% \setvalue{#1\s!entrya}##1{\dosetlinkregisterentrya{#1}{##1}}%
+% \setvalue{#1\s!entry }##1{\dosetpageregisterletter{#1}{##1}}}
+
+% \def\dosetlinkregisterentrya#1#2%
+% {\global\utilitydonetrue
+% \c!entryletter
+% \iflocation
+% \getalllistreferences{#1}{#2}%
+% % no \endgraf
+% \hangindent1em\noindent\c!entryreference
+% %
+% %\thisissomeinternal{\s!lin}{\internallistreference}%
+% %
+% \pagereference[-:\s!lin:\internallistreference]% -: added
+% %
+% \getcommacommandsize[\alllistreferences]%
+% \getfromcommacommand[\alllistreferences][1]%
+% \ifnum\commalistsize=1
+% \let\firstlistreference\empty
+% \let\midlistreference\commalistelement
+% \let\lastlistreference\empty
+% \else
+% \let\firstlistreference\commalistelement
+% \getfromcommacommand[\alllistreferences][\commalistsize]%
+% \let\lastlistreference\commalistelement
+% \ifnum\commalistsize=2
+% \let\midlistreference\empty
+% \else
+% \!!counta\commalistsize
+% \divide\!!counta 2
+% \getfromcommacommand[\alllistreferences][\!!counta]%
+% \let\midlistreference\commalistelement
+% \fi
+% \fi
+% % aangepast
+% \def\dodocommand[##1-##2]%
+% {\gotonextinternal{\s!ind}{##1}{##2}{\box0}}%
+% \doifelsevalue{\??id#1\c!interaction}\v!pagenumber
+% {\limitedregisterentry{#1}{#2}} % paginanummer
+% {{\setbox0\hbox{\limitedregisterentry{#1}{\begstrut#2}}%
+% \ifx\firstlistreference\empty % tekst,alles
+% \ifx\midlistreference\empty
+% \box0
+% \else
+% \expandafter\dodocommand\expandafter[\midlistreference]%
+% \fi
+% \else
+% \expandafter\dodocommand\expandafter[\firstlistreference]%
+% \fi}}%
+% \doifvalue{\??id#1\c!number}\v!yes
+% {\hskip\getvalue{\??id#1\c!distance}(\commalistsize)}%
+% \doifnotvalue{\??id#1\c!interaction}\v!text % paginanummer,alles
+% {\def\docommand##1##2%
+% {{\setbox0\hbox{\showlocation{\hbox to 1em{\hss\symbol[##2]\hss}}}%
+% \ifx##1\empty
+% % \hskip\wd0 % (optioneel maken)
+% \else
+% \expandafter\dodocommand\expandafter[##1]%
+% \fi}}%
+% \hskip\getvalue{\??id#1\c!distance}%
+% \docommand\firstlistreference\v!previous
+% \docommand\midlistreference\v!somewhere
+% \docommand\lastlistreference\v!next}%
+% % tot hier
+% \else
+% % no \endgraf
+% \noindent\c!entryreference
+% \limitedregisterentry{#1}{#2}%
+% \fi
+% \endgraf}
+
+% \def\dosetregister#1%
+% {\doifelsevalue{\??id#1\c!coupling}\v!yes
+% {\ifautoregisterhack
+% \dosetautoregister{#1}%
+% \else
+% \dosetlinkregister{#1}%
+% \fi}
+% {\dosetpageregister{#1}}}
+
+% \def\dosetregister#1%
+% {\dosetpageregister{#1}}
+
+% \newcounter\internallistreference
+
+% \def\doloadregisterlinks#1%
+% {\setregisterpage{#1}%
+% \global\let\currentregisterentry\empty
+% \global\firstregisterpagetrue
+% \setvalue{#1\s!entrya}##1%
+% {\global\firstregisterpagetrue
+% \gdefconvertedargument\currentregisterentry{##1}% global nodig?
+% \doglobal\increment\internallistreference}%
+% \setvalue{#1\s!from}%
+% {\getvalue{#1\s!page}}%
+% \ifautoregisterhack
+% \setvalue{#1\s!page}##1##2##3##4%
+% {\doifreglevelelse[##3]
+% {\global\utilitydonetrue
+% \iffirstregisterpage
+% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+% {\internallistreference::##4}%
+% \else % catches errors in index
+% \ifcsname\??id#1\??id\currentregisterentry\endcsname
+% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+% {\csname\??id#1\??id\currentregisterentry\endcsname,##4}%
+% \fi
+% \fi}
+% {}}%
+% \else
+% \setvalue{#1\s!page}##1##2##3##4%
+% {\doifreglevelelse[##3]
+% {\global\utilitydonetrue
+% \iffirstregisterpage
+% \global\firstregisterpagefalse
+% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+% {\internallistreference::##2-##4}%
+% \else % catches errors in index
+% \ifcsname\??id#1\??id\currentregisterentry\endcsname
+% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
+% {\csname\??id#1\??id\currentregisterentry\endcsname,##2-##4}%
+% \fi
+% \fi}
+% {}}%
+% \fi}
+
+% \def\docoupleregister[#1][#2]%
+% {\iflocation
+% \ifcase0\countervalue{autolink:#1}\relax % only once
+% \begingroup
+% \let\dosetregister\doloadregisterlinks
+% \def\currentregister{#1}%
+% \setupregister[#1][#2]%
+% \mkloadregister\currentregister\dobeforeplaceregister\doafterplaceregister
+% \endgroup
+% \ifautoregisterhack
+% \doinitializeautoregister{#1}%
+% \else
+% \doinitializelinkregister{#1}%
+% \fi
+% \fi
+% \fi}
+
+% \def\coupleregister
+% {\dodoubleempty\docoupleregister}
+
+% \def\dodocommandprolinrefAA[#1-#2]%
+% {\def\lastlistreference{#1-#2}}
+
+% \def\dodocommandprolinrefA[#1-#2]%
+% {\def\lastlistreference{#1-#2}%
+% \ifx\firstlistreference\empty
+% \let\firstlistreference\lastlistreference
+% \fi
+% \ifnum#1<\nextinternalreference\relax
+% \let\prevlistreference\lastlistreference
+% \else\ifnum#1>\nextinternalreference\relax
+% \let\nextlistreference\lastlistreference
+% \let\dodocommandprolinrefA\dodocommandprolinrefAA
+% \else
+% \let\selflistreference\lastlistreference
+% \fi\fi}
+
+% \def\docommandprolinrefA#1%
+% {\dodocommandprolinrefA[#1]}
+
+% \def\dodocommandprolinrefB[#1-#2]%
+% {\gotonextinternal{\s!ind}{#1}{#2}{\box0}}
+
+% \def\docommandprolinrefB#1#2#3%
+% {\bgroup
+% \ifx#2\empty
+% \doifvalue{\??id#1\c!unknownreference}\v!empty{\hskip1em}%
+% \else
+% \setbox0\hbox to 1em{\hss\showlocation{\symbol[#3]}\hss}%
+% \expandafter\dodocommandprolinrefB\expandafter[#2]%
+% \fi
+% \egroup}
+
+% \def\doprocesslinkregister[#1][#2]#3%
+% {\hbox
+% {\doprocesspageregister{}{#2}{}{#3}%
+% \let\firstlistreference\empty
+% \let\lastlistreference\empty
+% \let\selflistreference\empty
+% \let\prevlistreference\empty
+% \let\nextlistreference\empty
+% \getalllistreferences{#1}{#3}%
+% \ifx\alllistreferences\empty \else
+% \normalexpanded{\noexpand\rawprocesscommalist[\alllistreferences]}\docommandprolinrefA
+% \fi
+% \ifx\prevlistreference\empty
+% \let\prevlistreference\lastlistreference
+% \fi
+% \ifx\nextlistreference\empty
+% \let\nextlistreference\firstlistreference
+% \fi
+% \ifx\prevlistreference\selflistreference
+% \let\prevlistreference\empty
+% \let\nextlistreference\empty
+% \fi
+% \setalignmentswitch{\getvalue{\??id#1\c!location}}%
+% \ifcase\alignmentswitch
+% % links
+% \docommandprolinrefB{#1}\prevlistreference\v!previous
+% \docommandprolinrefB{#1}\nextlistreference\v!next
+% \or
+% % midden
+% \docommandprolinrefB{#1}\prevlistreference\v!previous
+% \or
+% % rechts
+% \fi
+% \doifreferencefoundelse{\s!lin:\internallistreference}
+% {\gotosomeinternal
+% \s!lin \internallistreference \currentrealreference
+% {\showlocation{\limitedregisterentry{#1}{#3}}}}
+% {\hbox{\limitedregisterentry{#1}{#3}}}%
+% \ifcase\alignmentswitch
+% % links
+% \or
+% % midden
+% \docommandprolinrefB{#1}\nextlistreference\v!next
+% \or
+% % rechts
+% \docommandprolinrefB{#1}\prevlistreference\v!previous
+% \docommandprolinrefB{#1}\nextlistreference\v!next
+% \fi}}
+
+% \def\doprocesslinkedregister[#1][#2]#3% page auto link
+% {\bgroup
+% \chardef\registerpagestatus\plusone
+% \def\currentregister{#1}%
+% \iflocation % \next is not needed
+% \ifautoregisterhack
+% \def\next{\doprocessautoregister[#1][#2]}%
+% \else
+% \def\next{\doprocesslinkregister[#1][#2]}%
+% \fi
+% \else
+% \def\next{\doprocesspageregister{}{#2}{}}%
+% \fi
+% \next{#3}%
+% \egroup}
+
+% \def\dodolinkedregister[#1][#2]#3% page auto link
+% {\doflushatpar{\doprocesslinkedregister[#1][#2]{#3}}}
+
+% \def\dolinkedregister#1%
+% {\dodoubleempty\dodolinkedregister[#1]}
+
+% \def\dosetautoregister#1%
+% {\makecounter{autolink:#1}%
+% \setregisterpage{#1}%
+% \global\let\currentregisterentry\empty
+% \global\firstsubentrytrue % not needed
+% \global\firstsubsubentrytrue % not needed too
+% \setvalue{#1\s!entrya}##1{\dosetautoregisterentrya{#1}{##1}}%
+% \setvalue{#1\s!entry }##1{\dosetpageregisterletter{#1}{##1}}}
+
+% \def\dosetautoregisterentrya#1#2%
+% {\global\utilitydonetrue
+% \c!entryletter
+% \iflocation
+% \getalllistreferences{#1}{#2}%
+% \endgraf\hangindent1em\noindent\c!entryreference
+% \pagereference[-:\s!lin:\internallistreference]%
+% \pluscounter{autolink:#1}%
+% \bgroup
+% %\setupinteraction[\c!color=,\c!contrastcolor=,\c!style=]% kan sneller
+% \resetinteractionparameter\c!color
+% \resetinteractionparameter\c!contrastcolor
+% \resetinteractionparameter\c!style
+% \gotobox
+% {\limitedregisterentry{#1}{\begstrut#2}}%
+% [JS(SetRegisterEntry{\v!register,\countervalue{autolink:#1},#2,{\alllistreferences}})]%
+% \egroup
+% \else
+% \endgraf\noindent\c!entryreference
+% \limitedregisterentry{#1}{#2}%
+% \fi}
+
+% \def\doprocessautoregister[#1][#2]#3%
+% {\hbox
+% {\doprocesspageregister{}{#2}{}{#3}%
+% \doifreferencefoundelse{\s!lin:\internallistreference}
+% {\gotosomeinternal \s!lin
+% {\internallistreference}{\currentrealreference}
+% {\showlocation{\limitedregisterentry{#1}{#3}}}}
+% {\hbox{\limitedregisterentry{#1}{#3}}}}}
+
+% \appendmacro aan openpaginaactie (in shipout)
+
+%D The first implementation used one main field with clones.
+%D In a 2500 page document this resulted in a rather (anoying)
+%D long start||up time. This \quote {every page its own field}
+%D solution, combined with a \quote {page open action}, works
+%D much faster, but is conceptually pretty weak.
+
+% \def\complexregisterfield[#1]%
+% {\definefield[#1:\realfolio][line][\v!register]%
+% \field[#1:\realfolio]}
+
+% \def\simpleregisterfield
+% {\complexregisterfield[\v!register]}
+
+% \definecomplexorsimple\registerfield
+
+% \appendtoks
+% % for now
+% \setupfield
+% [\v!register]
+% [\c!width=10em,
+% \c!height=3ex,
+% \c!align=\v!middle,
+% \c!option=\v!readonly,
+% \c!location=\v!low]
+% \to \everydump
+
+% \def\doinitializeautoregister#1%
+% {\useJSscripts[reg]%
+% \useJSpreamblenow{LinkedRegisters}%
+% \setupinteraction[\c!openpageaction=JS(UpdateRegisterField{\v!register})]%
+% \definereference[\v!reset\v!register][JS(ResetRegisterEntry{\v!register})]%
+% \definereference[\v!first\v!register][JS(GotoFirstRegisterEntry{\v!register})]%
+% \definereference[\v!previous\v!register][JS(GotoPreviousRegisterEntry{\v!register})]%
+% \definereference[\v!next\v!register][JS(GotoNextRegisterEntry{\v!register})]%
+% \definereference[\v!last\v!register][JS(GotoLastRegisterEntry{\v!register})]}
+
+% \def\doinitializelinkregister#1%
+% {}
+
+% todo ruwe register
+
+%D Default index:
+
+\defineregister
+ [\v!index]
+ [\v!indices]
+
+% \setupregister[index][koppeling=ja]
+%
+% \stelveldenin
+% [register][achtergrond=raster,kader=uit]
+%
+% \stelvoettekstenin
+% [{\field[index]}]
+%
+% \stelhoofdtekstenin
+% [{\naar {first}[eersteindex]\quad
+% \naar{previous}[vorigeindex]\quad
+% \naar {next}[volgendeindex]\quad
+% \naar {last}[laatsteindex]\quad\quad
+% \naar {index}[index]}]
+%
+% \starttekst
+%
+% oeps~~~\gekoppeldeindex{oeps} \blanko
+% flop~~~\gekoppeldeindex{flop} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% flop~~~\gekoppeldeindex{flop} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% oeps~~~\gekoppeldeindex{oeps} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% flop~~~\gekoppeldeindex{flop} \blanko
+% oeps~~~\gekoppeldeindex{oeps} \pagina
+%
+% \volledigeindex
+
+\protect \endinput
diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv
new file mode 100644
index 000000000..3a60a34a3
--- /dev/null
+++ b/tex/context/base/strc-ren.mkiv
@@ -0,0 +1,492 @@
+%D \module
+%D [ file=strc-ren,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Section Rendering,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Section Rendering}
+
+\unprotect
+
+\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
+
+\unexpanded\def\placeheadmargintexts
+ {\the\everyheadstart
+ \doif{\structureheadparameter\c!margintext}\v!yes\placemargincontent}
+
+\unexpanded\def\setupheadcomponentfont#1#2%
+ {\ifconditional\structureheadisdisplay
+ \edef\askedstructureheadinterlinespace{\structureheadparameter\c!interlinespace}%
+ \ifx\askedstructureheadinterlinespace\empty
+ % here the interline space is only set when style sets no space
+ \setfalse\fontattributeisset
+ \setfalse\interlinespaceisset
+ \dosetstructureheadattributes\c!style\c!color
+ \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else
+ \setupinterlinespace
+ \fi \fi
+ \setfalse\fontattributeisset \dosetstructureheadattributes#1#2%
+ \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else
+ \setupinterlinespace
+ \fi \fi
+ \else
+ % here the set interline space overloads any other set space in the style
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes\c!style\c!color
+ \ifconditional\fontattributeisset
+ \dosetupcheckedinterlinespace\askedstructureheadinterlinespace
+ \fi
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes#1#2%
+ \ifconditional\fontattributeisset
+ \dosetupcheckedinterlinespace\askedstructureheadinterlinespace
+ \fi
+ \fi
+ \else
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes\c!style\c!color
+ \ifconditional\fontattributeisset
+ \setupspacing
+ \fi
+ \setfalse\fontattributeisset
+ \dosetstructureheadattributes#1#2%
+ \ifconditional\fontattributeisset
+ \setupspacing
+ \fi
+ \fi
+ \dontconvertfont}
+
+\def\doplaceheadtextcomponent#1#2%
+ {\begingroup
+ \setupheadcomponentfont\c!textstyle\c!textcolor
+ % \ifcase\headtimingmode#1\fi % can introduce cr
+ \structureheadparameter\c!commandbefore
+ \placeheadmargintexts
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ \structureheadparameter\c!textcommand% struts can be nilled with \setnostrut
+ {\setstrut
+ \begstrut
+ \ifcase\headtimingmode\hbox{#1}\fi
+ \executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}%
+ \endstrut}% \hbox prevents break
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdepth
+ \else
+ \ifcase\headtimingmode#1\fi
+ \structureheadparameter\c!textcommand
+ {\executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}}%
+ \fi
+ \structureheadparameter\c!commandafter
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ \endgraf
+ \fi
+ \endgroup}
+
+\def\doplaceheadnumbercomponent#1#2%
+ {\begingroup
+ \setupheadcomponentfont\c!numberstyle\c!numbercolor
+ % \getvalue{\??ko\currentstructurehead\c!commandbefore}% strange, why here? moved 21/11/2005
+ \placeheadmargintexts
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ % can be nilled with \setnostrut
+ \structureheadparameter\c!numbercommand
+ {\setstrut
+ \begstrut
+ \executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}%
+ \endstrut}%
+ \else
+ \structureheadparameter\c!numbercommand
+ {\executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}}%
+ \fi
+ \endgroup}
+
+% \newif\ifheadnumbercontent
+% \newif\ifemptyhead
+% \newif\ifdisplaysectionhead
+
+\def\structureheadattribute{\iflocation attr \destinationattribute \currentstructureattribute\fi}
+
+\def\doplacestructureheadtext#1#2#3% nodes, text, endstuff
+ {\beginheadplacement
+ \doresettructureheadnumbercontent
+ \ifconditional\structureheadleaveempty
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint {#1}%
+ \makestrutofbox\sectionheadbox
+ \else
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute
+ {\doresettructureheadnumbercontent
+ \ifcase\headtimingmode\or#1\fi % outerside font determines distance
+ \dosetfontattribute{\??nh\currentstructurehead}\c!style % but we don't want color to influence user command, todo: get the if-else out of it
+ \structureheadparameter\c!command{}{\doplaceheadtextcomponent{#1}{#2}}}%
+ \fi
+ \endheadplacement{#3}}
+
+\def\doplacestructureheadnumbertext#1#2#3#4% nodes number text nodes
+ {\beginheadplacement
+ \doiftextelse{#2}\dosettructureheadnumbercontent\doresettructureheadnumbercontent
+ \ifconditional\structureheadleaveempty
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{#1}%
+ \makestrutofbox\sectionheadbox
+ \else % = needed
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute
+ {\ifcase\headtimingmode\or#1\fi
+ \dosetfontattribute{\??nh\currentstructurehead}\c!style
+ \structureheadparameter\c!command{\doplaceheadnumbercomponent{#1}{#2}}{\doplaceheadtextcomponent{#1}{#3}}}%
+ \fi
+ \endheadplacement{#4}}
+
+\unexpanded\def\placestructureheadnumbertext
+ {\doplacestructureheadnumbertext\empty\getstructureheadnumber\getstructureheadtitle\getstructureheadsyncs}
+
+\unexpanded\def\placestructureheadtext
+ {\doplacestructureheadtext\empty\getstructureheadtitle\getstructureheadsyncs}
+
+\unexpanded\def\placestructureheadempty
+ {\hbox \structureheadattribute {\getstructureheadsyncs}}
+
+%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
+
+\let\headlastlinewidth\!!zeropoint
+
+\def\localheadheight {\strutht}
+\def\localheaddepth {\strutdp}
+\def\localheadlineheight{\lineheight}
+
+\def\dolocalheadsetup % koppeling met standaard kopcommando / engels
+ {\forgetall % traag dus ...
+ \doifsomething{\structureheadparameter\c!align } {\normalexpanded{\noexpand\setupalign [\structureheadparameter\c!align ]}}%
+ \doifsomething{\structureheadparameter\c!tolerance} {\normalexpanded{\noexpand\setuptolerance[\structureheadparameter\c!tolerance]}}%
+ \doif {\structureheadparameter\c!strut }\v!no{\setnostrut}% new
+ \def\\{\crlf\strut\ignorespaces}}
+
+\def\beginheadplacement
+ {\bgroup
+ \setsystemmode\currentstructurehead
+ \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{\structureheadparameter\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
+ \postponenotes
+ \iflocation
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ \else
+ \noninterferingmarks
+ \fi
+ \fi
+ \resetinteractionparameter\c!style
+ \resetinteractionparameter\c!color
+ \resetinteractionparameter\c!contrastcolor
+ %\strictouterreferencestrue % tzt instelling
+ \let\localheadsetup\dolocalheadsetup}
+
+% \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\htdp0%
+ \getnoflines\scratchdimen
+ \advance\noflines\minusone
+ \normalexpanded{\egroup\noflines\the\noflines}% brrr
+ \setbox0\hbox{\lower\noflines\scratchdimen\box0}%
+ \scratchdimen\dimexpr\htdp0-\localheadheight+\strutdp\relax
+ \ht0 \strutht
+ \dp0 \strutdp
+ \edef\localheaddepth{\the\strutdp}}
+
+\newconditional\continuoussectionhead % oeps, \newif\ifcontinuoushead got lost
+\newbox\sectionheadbox
+
+\def\endheadplacement#1%
+ {\noflines\zerocount
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ % new (todo tight == one following line up)
+ \processaction
+ [\structureheadparameter\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\noflines\numexpr0\commalistelement-1\relax]%
+ % so far
+ \let\headlastlinewidth\!!zeropoint
+ % kind of special, we want to snap heads also according to local specs local
+ \ifgridsnapping
+ \begingroup
+ \edef\currentstructureheadgridsnapping{\structureheadparameter\c!grid}%
+ \ifconditional\structureheadisdisplay
+ \ifx\currentstructureheadgridsnapping\empty\else
+ \dosetstructureheadattributes\c!style\c!color
+ \setupinterlinespace
+ \dosetstructureheadattributes\c!textstyle\c!textcolor
+ \setupinterlinespace
+ \fi
+ \fi
+ \snaptogrid[\currentstructureheadgridsnapping]\hbox
+ {\hskip\localheadskip\hskip\structureheadparameter\c!margin\box\sectionheadbox}%
+ \endgroup
+ \else
+ \hbox
+ {\hskip\localheadskip\hskip\structureheadparameter\c!margin\box\sectionheadbox}%
+ \fi
+ \flushnotes % new, not really needed
+ \endgraf
+ \ifvmode
+ \ifnum\noflines>\zerocount
+ \dorecurse\noflines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}% to be checked
+ \fi
+ \nointerlineskip
+ \dosomebreak\nobreak
+ \fi
+ #1%
+ \else
+ \strut
+ \flushnotes % new, here since we're in par mode
+ \unhbox\sectionheadbox
+ \globallet\headlastlinewidth\!!zeropoint
+ #1%
+ \hskip\numberheaddistance\!!plus\numberheaddistance\!!minus.25\dimexpr\numberheaddistance\relax
+ \hskip\continuousstructureheadsignal\ignorespaces
+ \fi
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ \ifvmode
+ \ifgridsnapping % important, font related depth, see comment
+ \prevdepth\strutdp
+ \else
+ \prevdepth\localheaddepth
+ \fi
+ \fi
+ \fi
+ \egroup
+ \egroup
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ \checknextindentation[\structureheadparameter\c!indentnext]%
+ \else
+ \nonoindentation % recently added, was a bug
+ \fi}
+
+% 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
+
+\unexpanded\def\defineheadplacement
+ {\dodoubleargument\dodefineheadplacement}
+
+\def\dodefineheadplacement[#1][#2]% #3#4
+ {\setvalue{\??ns:#1}{#2}%
+ \setvalue{\??ns::#1}}
+
+\def\presetnumberheadalternative
+ {\doifelsevalue{\??ns:\numberheadalternative}\v!horizontal\setfalse\settrue\structureheadisdisplay}
+
+% \def\normalplacehead
+% {\executeifdefined
+% {\??ns::\numberheadalternative}
+% {\getvalue{\??ns::\v!normal}}}
+
+\def\normalplacehead
+ {\csname\??ns::\ifcsname\??ns::\numberheadalternative\endcsname\numberheadalternative\else\v!normal\fi\endcsname}
+
+\defineheadplacement[\v!paragraph][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut
+ \ifconditional\structureheadshownumber % \ifheadnumbercontent
+ #1\hskip\numberheaddistance
+ \fi
+ #2}}
+
+% \defineheadplacement[\v!normal][\v!vertical]#1#2%
+% {\ifconditional\structureheadshownumber % \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 {\structureheadparameter\c!width }%
+ \edef\headnumberwidth{\structureheadparameter\c!numberwidth}%
+ \edef\headtextwidth {\structureheadparameter\c!textwidth }%
+ \ifconditional\structureheadshownumber % \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}}
+
+\unexpanded\def\placeheadmargin#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut % use one \strut here!
+ \dontleavehmode % in case there is no strut, else side effects with llap
+ \ifconditional\structureheadshownumber % \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
+ \ifconditional\structureheadshownumber % \ifheadnumbercontent
+ \strut#1\par
+ \fi
+ \begstrut#2}}
+
+\defineheadplacement[\v!text][\v!horizontal]#1#2%
+ {\bgroup
+ \localheadsetup % no stretch in distance
+ \ifconditional\structureheadshownumber % \ifheadnumbercontent
+ {#1}\kern\numberheaddistance
+ \fi
+ {\begstrut#2}%
+ \egroup}
+
+\unexpanded\def\placeheadlohi#1#2#3%
+ {\ifconditional\structureheadshownumber % \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}}
+
+\protect \endinput
diff --git a/tex/context/base/strc-sbe.mkiv b/tex/context/base/strc-sbe.mkiv
new file mode 100644
index 000000000..206ac8a9c
--- /dev/null
+++ b/tex/context/base/strc-sbe.mkiv
@@ -0,0 +1,141 @@
+%D \module
+%D [ file=strc-sbe,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Section Block Environments,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Section Block Environments}
+
+\unprotect
+
+% \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
+
+\definesystemvariable {nb}
+
+\def\v!structureblockenvironment{structureblockenvironment}
+
+\unexpanded\def\definestructureblock{\dotripleargument\dodefinestructureblock}
+\unexpanded\def\setupstructureblock {\dodoubleargument\dosetupstructureblock}
+\def\setstructureblock {\dosingleargument\dosetstructureblock}
+
+% \def\structureblockparameter#1{\executeifdefined{\??nb\currentstructureblock#1}\empty}
+
+\def\structureblockparameter#1%
+ {\csname
+ \ifcsname\??nb\currentstructureblock#1\endcsname\??nb\currentstructureblock#1\else\s!empty\fi
+ \endcsname}
+
+\newtoks \everybeforestructureblock
+\newtoks \everyafterstructureblock
+
+\def\dodefinestructureblock[#1][#2][#3]% singular plural settings
+ {\getparameters
+ [\??nb#1]
+ [\c!number=\v!yes,
+ \c!page=\v!right, % anders worden marks te vroeg gereset !
+ #3]%
+ \expandafter\newif\csname if#2\endcsname % better a mode
+ \setstructureblockenvironment{#1}\empty
+ \setvalue {\e!start#2}{\startstructureblock[#1]}%
+ \setvalue {\e!stop #2}{\stopstructureblock}}
+
+\appendtoks
+ \doifsomething{\structureblockparameter\c!page}{\page[\structureblockparameter\c!page]}%
+% TODO \resetsectionmarks\zerosection
+ \getstructureblockenvironment\currentstructureblock
+ \structureblockparameter\c!before % don't move
+\to \everybeforestructureblock
+
+\appendtoks
+ \structureblockparameter\c!after % don't move
+ \doifsomething{\structureblockparameter\c!page}{\page[\structureblockparameter\c!page]}%
+% TODO \resetsectionmarks\zerosection
+\to \everyafterstructureblock
+
+\def\dosetupstructureblock[#1]%
+ {\getparameters[\??nb#1]}% [#2]
+
+\def\dosetstructureblock[#1]% used to set the default
+ {\edef\currentstructureblock{\ctxlua{structure.sections.setblock("#1")}}}
+
+\let\currentstructureblock\s!unknown
+
+\unexpanded\def\startstructureblock[#1]%
+ {%\ctxlua{structure.counters.check(0)}% we assume sane usage of \page, as this is the only workable place (in push)
+ \begingroup
+ \edef\currentstructureblock{\ctxlua{structure.sections.pushblock("#1")}}%
+ \csname #1true\endcsname % for old times sake
+ \setsystemmode\currentstructureblock
+ \the\everybeforestructureblock\relax
+ \showmessage\m!structures1\currentstructureblock}
+
+\unexpanded\def\stopstructureblock
+ {\showmessage\m!structures2\currentstructureblock
+ \the\everyafterstructureblock\relax
+ \edef\currentstructureblock{\ctxlua{structure.sections.popblock()}}%
+ \endgroup}
+
+\long\def\setstructureblockenvironment#1#2%
+ {\long\setvalue{\??nb\s!do#1}{\do{#2}}}
+
+\def\getstructureblockenvironment#1%
+ {\let\do\firstofoneargument
+ %\structureblockparameter{\s!do#1}}
+ \csname\??nb\s!do#1\endcsname}
+
+%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
+
+\setvalue{\e!start\v!structureblockenvironment}%
+ {\dosingleargument\dostartstructureblockenvironment}
+
+\def\dostartstructureblockenvironment[#1]% evt \pushendofline \popendofline
+ {\long\def\do##1##2{\setstructureblockenvironment{#1}{##1##2}}%
+ %\grabuntil{\e!stop\v!structureblockenvironment}{\structureblockparameter{\s!do#1}}}
+ \grabuntil{\e!stop\v!structureblockenvironment}{\csname\??nb\s!do#1\endcsname}}
+
+% this will become: (we ran in parallel for a while during transition)
+
+\setvalue{\e!start\v!sectionblockenvironment}%
+ {\dosingleargument\dostartsectionblockenvironment}
+
+\def\dostartsectionblockenvironment[#1]% evt \pushendofline \popendofline
+ {\long\def\do##1##2{\setstructureblockenvironment{#1}{##1##2}}%
+ %\grabuntil{\e!stop\v!sectionblockenvironment}{\structureblockparameter{\s!do#1}}}
+ \grabuntil{\e!stop\v!sectionblockenvironment}{\csname\??nb\s!do#1\endcsname}}
+
+\protect \endinput
diff --git a/tex/context/base/strc-sec.mkii b/tex/context/base/strc-sec.mkii
new file mode 100644
index 000000000..0698ef93c
--- /dev/null
+++ b/tex/context/base/strc-sec.mkii
@@ -0,0 +1,2591 @@
+%D \module
+%D [ file=strc-sec,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure 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 Structure Macros / Sectioning}
+
+\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\pagebreakdisabledtrue
+ \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
+% \ifpagebreakdisabled
+% \global\pagebreakdisabledfalse
+% \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
+ \ifpagebreakdisabled
+ \global\pagebreakdisabledfalse
+ \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 <niets>
+
+\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
+
+% from cont-new:
+
+\def\expandifnonempty#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi
+ {\csname#1\endcsname}}
+
+\def\@@sectiekoppeling#1%
+ {\expandifnonempty{\??ko#1\c!coupling}{#1}}
+
+\def\@@sectiesectie#1%
+ {\expandifnonempty{\??ko#1\c!section}{\@@sectiekoppeling{#1}}}
+
+\def\sectioncountervalue#1%
+ {\@@sectionvalue{\@@sectiesectie{#1}}}
+
+% \dodododoconstructhead IS NON GROUPED, SO WE NEED TO RESTORE !!!!
+%
+% dit kan dus beter \everyaroundhead zijn
+
+\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
+ \postponenotes
+ \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/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv
new file mode 100644
index 000000000..35927d98a
--- /dev/null
+++ b/tex/context/base/strc-sec.mkiv
@@ -0,0 +1,792 @@
+%D \module
+%D [ file=strc-sec,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Sectioning,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Sectioning}
+
+\unprotect
+
+% compatibility issue:
+%
+% \def\setfullsectionnumber #1{}
+% \def\preparefullnumber #1{}
+% \def\fullsectionnumber {1--1--1}
+% \def\makesectionnumber [#1]{}
+% \def\makesectionformat {}
+% \def\sectionformat {1--1-1-1-1-1-1}
+% \def\composedsectionnumber{}
+% \def\@@kolist{}
+
+% \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}
+
+% lua interface / names and interface might change
+
+\def\setstructurelevel #1#2{\ctxlua{structure.sections.setlevel("#1","#2")}} % name, level|parent
+\def\getstructurelevel #1{\ctxlua{structure.sections.getcurrentlevel("#1")}}% name
+\def\setstructurenumber #1#2{\ctxlua{structure.sections.setnumber(#1,"#2")}} % level, number (+/-)
+\def\getstructurenumber #1{\ctxlua{structure.sections.getnumber(#1)}} % level
+\def\getsomestructurenumber #1#2{\ctxlua{structure.sections.getnumber(#1,"#2")}} % level, what
+\def\getfullstructurenumber #1{\ctxlua{structure.sections.fullnumber(#1)}} % level
+\def\getsomefullstructurenumber#1#2{\ctxlua{structure.sections.fullnumber(#1,"#2")}}
+\def\getspecificstructuretitle #1{\ctxlua{structure.sections.structuredata(#1,"titledata.title",nil,"\structureheadparameter\s!catcodes")}}%
+
+% interface
+
+\def\structureheadparameter #1{\csname\dostructureheadparameter{\??nh\currentstructurehead}#1\endcsname}
+\def\structureheadparameterhash#1{\dostructureheadparameterhash {\??nh\currentstructurehead}#1}
+
+\def\dostructureheadparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dostructureheadparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dostructureheadparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dostructureheadparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dostructureheadparentparameter #1#2{\ifx#1\relax\s!empty\else\dostructureheadparameter #1#2\fi}
+\def\dostructureheadparentparameterhash#1#2{\ifx#1\relax \else\dostructureheadparameterhash#1#2\fi}
+
+\def\structureheadparameterstrict#1{\csname\ifcsname\??nh\currentstructurehead#1\endcsname\??nh\currentstructurehead#1\else\s!empty\fi\endcsname}
+
+\def\dosetstructureheadattributes#1#2% style color
+ {\edef\fontattributehash {\structureheadparameterhash#1}%
+ \edef\colorattributehash{\structureheadparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+% so far
+
+\newcount\maxstructuredepth
+
+\let\laststructuresectionname\empty
+
+\unexpanded\def\definestructuresection[#1]%
+ {\doifundefined{\??nh#1}
+ {\global\advance\maxstructuredepth\plusone
+ \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}%
+ \setstructurelevel{#1}{\the\maxstructuredepth}%
+% \letvalue{\??nh#1\c!marking}\empty % ?
+ %\writestatus{structure}{#1\ifx\laststructuresectionname\empty\else\space->\space\laststructuresectionname\fi}%
+ \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}%
+ % this is a rather practical default that we don't want to be part of the parent chain
+ % lookup mechanism; it's also mkii compativle; this might become \everystructureheaddefine
+ \getparameters[\??nh#1]
+ [ \c!textstyle=\structureheadparameterstrict\c!style,
+ \c!textcolor=\structureheadparameterstrict\c!color,
+ \c!numberstyle=\structureheadparameterstrict\c!style,
+ \c!numbercolor=\structureheadparameterstrict\c!color]%
+ % so far for these default inheritances
+ \definemarking[#1]%
+ \ifnum\maxstructuredepth>\plusone
+% \normalexpanded{\noexpand\couplemarking[#1][\laststructuresectionname]}% so, the child inherits settings from the parent
+ \normalexpanded{\noexpand\relatemarking[#1][\laststructuresectionname]}% so, the parent will reset the child
+ \fi
+ \xdef\laststructuresectionname{#1}}}
+
+\unexpanded\def\setupstructuresection
+ {\dotripleempty\dosetupstructuresection}
+
+\def\dosetupstructuresection[#1]%
+ {\doifdefinedelse{\??nh#1}
+ {\dodosetupstructuresection[#1]}
+ {\dodosetupstructuresection[\structuresectionheadsection{#1}]}}
+
+\def\dodosetupstructuresection[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??nh#1#2][#3]% ? probably sectionblock
+ \else
+ \getparameters[\??nh#1][#2]%
+ \fi}
+
+\def\structuresectionlevel#1%
+ {\executeifdefined{\??nh#1\c!level}{-1}}
+
+\setvalue{\??nh block\c!level}{0} % -1 == manual
+
+% head -> structurehead
+
+\let\currentstructurehead\empty
+\newtoks\everystructureheadsetup
+
+\unexpanded\def\setupstructureheads{\dosingleargument\dosetupstructureheads}
+\unexpanded\def\setupstructurehead {\dodoubleempty\dosetupstructurehead}
+\unexpanded\def\definestructurehead{\dodoubleempty\dodefinestructurehead}
+
+\newif\ifsectionnumber % maybe conditional
+
+\def\dosetupstructureheads[#1]%
+ {\getparameters[\??nh][#1]%
+ \doifelse{\structureheadparameter\c!sectionnumber}\v!yes\sectionnumbertrue\sectionnumberfalse}
+
+\def\dosetupstructurehead[#1][#2]% we move the test for command being nothing elsewhere (needed, else hard to trace)
+ {\processcommalist[#1]{\dodosetupstructurehead{#2}}}
+
+\def\dodosetupstructurehead#1#2%
+ {\edef\currentstructurehead{#2}%
+ \getparameters[\??nh#2][#1]%
+ \the\everystructureheadsetup}
+
+\def\dodefinestructurehead[#1][#2]%
+ {\processcommalist[#1]{\dododefinestructurehead{#2}}}
+
+\def\dododefinestructurehead#1#2% #1: parameters|parent, #2: self
+ {\doifsomethingelse{#2}
+ {\doifassignmentelse{#1}
+ \dodefineuniquestructurehead
+ {\doifdefinedelse{\??nh#1\s!parent} % just a check
+ \dodefineclonedstructurehead
+ \dodefineerrorstructurehead}}
+ \dodefineerrorstructurehead
+ {#2}{#1}}
+
+\def\dodefineerrorstructurehead#1#2%
+ {\setvalue{#1}{\par error: #1 is undefined\par}}
+
+% deeptextcommand and deepnumbercommand are left undefined !
+
+\def\dodefineuniquestructurehead#1#2% class, parent
+ {\def\currentstructurehead{#1}%
+ \presetlabeltext[#1=]%
+ \getparameters[\??nh#1][\c!label=#1,#2]%
+ \edef\currentstructureheaddefault{\structureheadparameter\c!default}%
+ \edef\currentstructureheadsection{\structureheadparameter\c!section}%
+ \edef\currentstructureheadparent
+ {\??nh
+ \ifx\currentstructurehead\currentstructureheaddefault
+ \currentstructureheadsection
+ \else\ifx\currentstructureheaddefault\empty
+ \currentstructureheadsection
+ \else
+ \currentstructureheaddefault
+ \fi\fi}%
+ \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\currentstructureheadparent]}% \setevalue{\??nh#1\s!parent}{\currentstructureheadparent}%
+ \ifx\currentstructureheadsection\empty
+ %\writestatus{structure}{#1->\currentstructureheadparent}%
+ \else
+ %\writestatus{structure}{#1->\currentstructureheadparent\space(\currentstructureheadsection)}%
+ % todo: filtercommand
+ \definemarking[#1][\currentstructureheadsection]%
+ \definemarking[#1\v!number][#1]%
+ \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]%
+ \setupmarking[#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]%
+ \fi
+ \doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}% definestructurelist ?
+ \the\everystructureheadsetup}
+
+\def\sectionheadmarkingtitle #1#2{\ctxlua{structure.marks.title("#1","#2")}}
+\def\sectionheadmarkingnumber#1#2{\ctxlua{structure.marks.number("#1","#2")}}
+
+\def\dodefineclonedstructurehead#1#2% class parent
+ {\def\currentstructurehead{#1}%
+ \presetlabeltext[#1=]%
+ \doifelse{#1}{#2}
+ {\getparameters[\??nh#1][\c!label=#1]%
+ \doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}}% definestructurelist ?
+ {\getparameters[\??nh#1][\s!parent=\??nh#2,\c!label=#1,\c!coupling=#2]%
+ \definemarking[#1][#2]%
+ \definemarking[#1\v!number][#2\c!number]%
+ \doifundefined{\??li#1}{\definelist[#1][#2][\c!prefix=\v!no]}}% definestructurelist ?
+ \the\everystructureheadsetup}
+
+\appendtoks
+% \setstructurelevel\currentstructurehead{\structuresectionheadsection{\structuresectionheadcoupling\currentstructurehead}}%
+ \setstructurelevel\currentstructurehead{\thenamedstructureheadlevel\currentstructurehead}%
+ \doifelse{\structureheadparameter\c!ownnumber}\v!yes
+ {\setevalue\currentstructurehead{\noexpand\dohandlestructureheadown[\currentstructurehead]}}
+ {\setevalue\currentstructurehead{\noexpand\dohandlestructureheadnop[\currentstructurehead]}}%
+ \setevalue{\e!next \currentstructurehead}{\noexpand\donextstructurehead [\currentstructurehead]}%
+ \setevalue{\e!start\currentstructurehead}{\noexpand\dostartstructurehead[\currentstructurehead]}%
+ \setevalue{\e!stop \currentstructurehead}{\noexpand\dostopstructurehead [\currentstructurehead]}%
+\to \everystructureheadsetup
+
+% todo, check if section is defined
+
+\def\structuresectionheadcoupling#1%
+ {\ifcsname\??nh#1\c!coupling\endcsname
+ \expandafter\structuresectionheadcoupling\csname\??nh#1\c!coupling\endcsname\else#1%
+ \fi}
+
+\def\structuresectionheadsection#1%
+ {\ifcsname\??nh#1\c!section\endcsname
+ \expandafter\structuresectionheadcoupling\csname\??nh#1\c!section\endcsname\else#1%
+ \fi}
+
+% head construction
+
+\def\dohandlestructureheadown{\dodoubleempty\dodohandlestructureheadown} % [ref] {nr} {title}
+\def\dohandlestructureheadnop{\dodoubleempty\dodohandlestructureheadnop} % [ref] {title}
+\def\dostartstructurehead {\dotripleempty\dodostartstructurehead} % [settings] [userdata]
+
+\newconditional\currentstructureown
+
+\def\dodohandlestructureheadown[#1][#2]#3#4%
+ {\settrue\currentstructureown
+ \dohandlestructurehead{#1}{\c!reference={#2},\c!ownnumber={#3},\c!title={#4}}{}} % name ref nr title --
+
+\def\dodohandlestructureheadnop[#1][#2]#3%
+ {\setfalse\currentstructureown
+ \dohandlestructurehead{#1}{\c!reference={#2},\c!title={#3}}{}} % name ref nr title --
+
+\newtoks\everybeforestructurehead % hook, todo: before/after keys
+\newtoks\everyafterstructurehead % hook, todo: before/after keys
+
+\def\dodostartstructurehead[#1][#2][#3]% for the moment no grouping, too annoying with page breaks
+ {\setfalse\currentstructureown
+ %\globalpushmacro\currentstructurehead
+ \xdef\currentstructurehead{#1}%
+ \the\everybeforestructurehead
+ \dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata
+
+\def\dostopstructurehead[#1]%
+ {%\globalpopmacro\currentstructurehead
+ \xdef\currentstructurehead{#1}% recover
+ \the\everyafterstructurehead}
+
+\def\donextstructurehead[#1][#2][#3]%
+ {\setfalse\currentstructureown
+ \xdef\currentstructurehead{#1}%
+ \dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata
+
+% \newconditional\structurereversesectionnumbers % todo: key/val
+
+\newconditional\structureheadtolist
+\newconditional\structureheaddoincrement
+\newconditional\structureheaddoplace
+\newconditional\structureheadleaveempty
+\newconditional\structureheadhidden
+\newconditional\structureheadshownumber
+\newconditional\structureheadisdisplay
+
+\let\structureheadprefix\empty \def\structureheadprefixplus{+}
+
+% When do we reset the referenceprefix? This needs to be checked. Does it work
+% at all?
+
+\def\setstructureheadreference#1% reference
+ {\edef\structureheadreference{#1}%
+ \edef\structureheadreferenceprefix{\structureheadparameter\c!prefix}%
+ \ifx\structureheadreferenceprefix\empty
+ \setupreferenceprefix[]% yes or no?
+ \else\ifx\structureheadreferenceprefix\structureheadreferenceprefixplus
+ \ifx\structureheadreference\empty
+ \setupreferenceprefix[\structureheadreferenceprefixplus]
+ \else
+ \setupreferenceprefix[#1]% we assume just one reference
+ \fi
+ \else
+ \setupreferenceprefix[\structureheadreferenceprefix]%
+ \fi\fi}
+
+\setvalue{\??nh:\c!incrementnumber:\v!yes }{\settrue \structureheaddoincrement\settrue \structureheadtolist}
+\setvalue{\??nh:\c!incrementnumber:\v!no }{\setfalse\structureheaddoincrement\setfalse\structureheadtolist}
+\setvalue{\??nh:\c!incrementnumber:\v!list }{\setfalse\structureheaddoincrement\settrue \structureheadtolist}
+\setvalue{\??nh:\c!incrementnumber:\s!empty}{\settrue \structureheaddoincrement\settrue \structureheadtolist}
+
+\def\setstructureheadincrement
+ {\edef\currentstructureheadincrement{\structureheadparameter\c!incrementnumber}%
+ \ifcsname\??nh:\c!incrementnumber:\currentstructureheadincrement\endcsname
+ \csname\??nh:\c!incrementnumber:\currentstructureheadincrement\endcsname
+ \else
+ \settrue \structureheaddoincrement\settrue \structureheadtolist
+ % \filterstructureheadnumber
+ \fi}
+
+\def\filterstructureheadnumber
+ {\settrue\structureheaddoincrement
+ \settrue\structureheadtolist
+ \ifx\currentproduct\empty
+ % todo : filter from other toc (number, file, title)
+ % use : \currentstructureheadincrement as spec
+ \fi}
+
+\def\setstructureheadplacement
+ {\settrue\structureheaddoplace
+ \setfalse\structureheadleaveempty
+ \setfalse\structureheadhidden
+ \processaction
+ [\structureheadparameter\c!placehead]
+ [ \v!yes=>,
+ \v!empty=>\settrue\structureheadleaveempty,
+ \v!no=>\settrue\structureheadleaveempty\setfalse\structureheaddoplace,
+ \v!hidden=>\settrue\structureheadhidden\settrue\structureheadleaveempty\setfalse\structureheaddoplace]}
+
+\def\setstructureheaddisplay
+ {\doifelsevalue{\??nh:\structureheadparameter\c!alternative}\v!horizontal
+ {\setfalse\structureheadisdisplay}
+ {\settrue \structureheadisdisplay}}
+
+\def\dosettructureheadnumbercontent
+ {\setsystemmode \v!sectionnumber
+ \settrue\structureheadshownumber}
+
+\def\doresettructureheadnumbercontent
+ {\resetsystemmode\v!sectionnumber
+ \setfalse\structureheadshownumber}
+
+\def\setstructureheadnumber
+ {\ifsectionnumber
+ \doifelse{\structureblockparameter\c!number}\v!yes % todo
+ {\doifelse{\structureheadparameter\c!number}\v!yes
+ {\settrue\structureheadshownumber}
+ {\setfalse\structureheadshownumber}}
+ {\setfalse\structureheadshownumber}%
+ \else
+ \setfalse\structureheadshownumber
+ \fi}
+
+\unexpanded\def\thestructureheadsynchonization
+ {\pagetype[\currentstructureheadcoupling]% hm also number
+ \normalexpanded{\noexpand\setmarking[\currentstructureheadcoupling]{\currentstructurelistnumber}}%
+ \currentstructuresynchronize}
+
+\unexpanded\def\fullstructureheadnumber{\labeltexts{\structureheadparameter\c!label}{\structurenumber}} % todo
+
+% \def\fullstructureheadtitle {\structurevariable{titledata.title}} % no catcode!
+% \unexpanded\def\fullstructureheadtitle{\structureautocatcodedget{titledata.title}{\structureheadparameter\s!catcodes}}
+
+\unexpanded\def\fullstructureheadtitle{\ctxlua{structure.sections.title()}}
+
+\let\currentstructurehead \empty
+\let\currentstructureheadcoupling\empty
+\let\currentstructureheadsection \empty
+\let\currentstructureheadlevel \!!zerocount
+\let\currentstructureheadcounter \!!zerocount
+
+\def\doregisterstructurehead#1#2#3% name data userdata
+ {\structurecomponent
+ [\c!label={\structureheadparameter\c!label},
+ \c!incrementnumber=\ifconditional\structureheaddoincrement\v!yes\else\v!no\fi, % not that needed
+ \c!saveinlist=\ifconditional\structureheadtolist\v!yes\else\v!no\fi,
+ \c!level=\currentstructureheadlevel,
+ \c!name=#1,
+ \c!number=\ifconditional\structureheaddoincrement\ifconditional\structureheadshownumber\v!yes\else\v!no\fi\else\v!no\fi,
+ \c!bookmark=,
+ \c!marking=,
+ \c!list=,
+ \c!expansion=\structureheadparameter\c!expansion,
+ \c!xmlsetup=\structureheadparameter\c!xmlsetup,
+ \s!catcodes=\structureheadparameter\s!catcodes,
+ \c!sectionresetset=\structureheadparameter\c!sectionresetset,
+ \c!sectionseparatorset=\structureheadparameter\c!sectionseparatorset,
+ \c!sectionconversionset=\structureheadparameter\c!sectionconversionset,
+ \c!sectionconversion=\structureheadparameter\c!conversion, % just for compatibility
+ \c!sectionstarter=\structureheadparameter\c!sectionstarter,
+ \c!sectionstopper=\structureheadparameter\c!sectionstopper,
+ \c!sectionset=\structureheadparameter\c!sectionset,
+ \c!sectionsegments=\structureheadparameter\c!sectionsegments,
+ \c!reference=\structureheadreference,
+ \c!referenceprefix=\structureheadreferenceprefix,
+ \c!command=,
+ #2]%
+ [#3]%
+ \reportcurrentstructure}
+
+\unexpanded\def\placeheadtext {\dosingleempty\doplaceheadtext } % use with care
+\unexpanded\def\placeheadnumber{\dosingleempty\doplaceheadnumber} % use with care
+
+\ifdefined\setupheadcomponentfont \else
+
+ \unexpanded\def\setupheadcomponentfont#1#2%
+ {\dosetstructureheadattributes\c!style\c!color
+ \dosetstructureheadattributes#1#2%
+ \dontconvertfont
+ \setupinterlinespace}
+
+\fi
+
+\def\doplaceheadtext[#1]%
+ {\dontleavehmode
+ \begingroup
+ \edef\currentstructurehead{#1}%
+ \setupheadcomponentfont\c!textstyle\c!textcolor
+ \relax
+ \getspecificstructuretitle{\thenamedstructureheadlevel{#1}}%
+ \endgraf
+ \endgroup}
+
+\def\doplaceheadnumber[#1]%
+ {\dontleavehmode
+ \begingroup
+ \edef\currentstructurehead{#1}%
+ \setupheadcomponentfont\c!numberstyle\c!numbercolor
+ \relax
+ \getfullstructurenumber{\thenamedstructureheadlevel{#1}}%
+ \endgraf
+ \endgroup}
+
+\ifdefined \else \let\presetnumberheadalternative\relax \fi
+
+\def\dohandlestructurehead#1#2#3% name data userdata
+ {\xdef\currentstructurehead {#1}%
+ \xdef\currentstructureheadcoupling{\structuresectionheadcoupling\currentstructurehead}%
+ \xdef\currentstructureheadsection {\structuresectionheadsection \currentstructureheadcoupling}%
+ \xdef\currentstructureheadlevel {\structuresectionlevel \currentstructureheadsection}%
+ %writestatus\m!systems{setup: \currentstructurehead,\currentstructureheadcoupling,\currentstructureheadsection,\currentstructureheadlevel}%
+ %
+ \setstructureheadreference{#3}% will change
+ \setstructureheadincrement
+ \setstructureheadplacement
+ \setstructureheaddisplay
+ \setstructureheadnumber
+ %
+ \unexpanded\def\\{\space}%
+ \flushingcolumnfloatsfalse
+ %
+ % todo: also mark (for header)
+ %
+ % we might remove the lower level
+ %
+ % not here, after optional \page: \doregisterstructurehead{#1}{#2}{#3}%
+ %
+% \xdef\currentstructureheadcounter{\currentstructurecounter}% lua call
+ %
+ % \currentstructuresynchronize % will move
+ %
+ \edef\numberheaddistance {\structureheadparameter\c!distance }% compatibility
+ \edef\numberheadalternative{\structureheadparameter\c!alternative}% compatibility
+ \presetnumberheadalternative
+ %
+ \let\getstructureheadnumber\empty
+ \let\getstructureheadtitle \empty
+ \let\getstructureheadsyncs \empty
+ \ifconditional\structureheaddoincrement
+ \ifconditional\structureheaddoplace
+ \dostructureheadspacingbeforeyes
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \let\getstructureheadtitle\fullstructureheadtitle
+ \ifconditional\structureheadshownumber
+ \let\getstructureheadnumber\fullstructureheadnumber
+ \placestructureheadnumbertext
+ \else
+ \placestructureheadtext
+ \fi
+ \dostructureheadspacingafteryes
+ \else\ifconditional\structureheadhidden
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \placestructureheadhidden % only something when tracing
+ \else
+ \dostructureheadspacingbeforenop % toegevoegd ivm subpaginanr / tug sheets
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \placestructureheadempty % just flush 'm
+ \dostructureheadspacingafternop
+ \fi\fi
+ \else
+ \ifconditional\structureheaddoplace
+ \dostructureheadspacingbeforeyes
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \let\getstructureheadtitle\fullstructureheadtitle
+ \placestructureheadtext
+ \dostructureheadspacingafteryes
+ \else\ifconditional\structureheadhidden
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \placestructureheadhidden % only something when tracing
+ \else
+ % do nothing / should be vbox to 0pt
+ \dostructureheadspacingbeforenop
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \placestructureheadempty % just flush 'm
+ \dostructureheadspacingafternop
+ \fi\fi
+ \fi
+ \flushingcolumnfloatstrue
+ \setfalse\ignorehandlepagebreak
+ % ignorespaces prevents spaces creeping in when after=\dontleavehmode
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ \ignorespaces
+ \else
+ \expandafter\GotoPar
+ \fi}
+
+% typesetting
+
+\unexpanded\def\placestructureheadnumbertext % dummy, will be overloaded
+ {\getstructureheadnumber/\getstructureheadtitle
+ \getstructureheadsyncs}
+
+\unexpanded\def\placestructureheadtext % dummy, will be overloaded
+ {\getstructureheadtitle
+ \getstructureheadsyncs}
+
+\unexpanded\def\placestructureheadempty % dummy, will be overloaded
+ {\getstructureheadsyncs}
+
+\unexpanded\def\placestructureheadhidden
+ {\setxvalue{\currentstructurehead:sync}%
+ {\noexpand\pagetype[\currentstructureheadcoupling]% hm also number
+ \noexpand\setmarking[\currentstructureheadcoupling]{\currentstructurelistnumber}%
+ \currentstructuresynchronize}}
+
+\def\synchronizestructurehead#1%
+ {\getvalue{#1:sync}}
+
+\unexpanded\def\placerawheaddata [#1]{\synchronizestructurehead {#1}}
+\unexpanded\def\placerawheadtext [#1]{\getspecificstructuretitle{\thenamedstructureheadlevel{#1}}}
+\unexpanded\def\placerawheadnumber[#1]{\getfullstructurenumber {\thenamedstructureheadlevel{#1}}}
+
+% \setuphead[chapter][placehead=hidden]
+% \chapter {test}
+%
+% %(\synchronizestructurehead{chapter}) % \getstructureheadsyncs
+% %(\getfullstructurenumber{\thenamedstructureheadlevel{chapter}})
+% %(\getspecificstructuretitle{\thenamedstructureheadlevel{chapter}})
+%
+% (\placerawheaddata [chapter])
+% (\placerawheadnumber[chapter])
+% (\placerawheadtext [chapter])
+
+% pagebreaks
+
+\newcount\precedingstructurelevel \precedingstructurelevel\plusone
+\newconditional\ignorehandlepagebreak
+
+\def\dostructureheadspacingbeforeyes
+ {\docheckstructureheadbefore
+ \dohandlestructureheadpagebreak
+ \structureheadparameter\c!inbetween}
+
+\def\dostructureheadspacingbeforenop
+ {\docheckstructureheadbefore
+ \docheckstructureheadlayout
+ \structureheadparameter\c!inbetween}
+
+% \def\emptystructureheadcorrection
+% {\ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank)
+% \vskip-\lineheight
+% \dosomebreak\nobreak % \penalty10000 in vspacing
+% \kern\zeropoint
+% \prevdepth\strutdepth
+% \fi}
+
+\def\emptystructureheadcorrection
+ {\ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank)
+ \penalty10000 % first ... we need to adapt this all to vspacing
+ \vskip-\lineheight
+ \kern\zeropoint
+ \prevdepth\strutdepth
+ \fi}
+
+\def\dostructureheadspacingafteryes
+ {\ifconditional\structureheadisdisplay
+ \dosomebreak\nobreak % needs to be adapted to vspacing
+ \emptystructureheadcorrection
+ \structureheadparameter\c!after
+ \fi}
+
+\def\dostructureheadspacingafternop
+ {}
+
+\newsignal\continuousstructureheadsignal
+
+\def\docheckstructureheadbefore#1%
+ {\ifhmode
+ \scratchcounter\lastpenalty\unpenalty % no beauty in this
+ \ifdim\lastskip=\continuousstructureheadsignal
+ % no page break
+ \ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \global\precedingstructurelevel\currentstructureheadlevel
+ \nobreak
+ \fi
+ \global\settrue\continuoussectionhead
+ \else
+ \penalty\scratchcounter
+ \global\setfalse\continuoussectionhead
+ #1%
+ \fi
+ \else
+ \global\setfalse\continuoussectionhead
+ #1%
+ \fi}
+
+\def\dodocheckstructureheadlayout#1#2%
+ {\doifelselayouttextline{#1}
+ {\doifsomething{\structureheadparameter#2}{\expanded{\setuplayouttext[#1][\c!state=\structureheadparameter#2]}}}
+ \donothing}
+
+\def\docheckstructureheadlayout
+ {\doifsomething{\structureheadparameter\c!page}
+ {\page[\structureheadparameter\c!page]%
+ \dodocheckstructureheadlayout\v!header\c!header
+ \dodocheckstructureheadlayout\v!text \c!text
+ \dodocheckstructureheadlayout\v!footer\c!footer}}
+
+\def\currentstructurecounter {\ctxlua{structure.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead)}}
+\def\previousstructurecounter{\ctxlua{structure.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead-1)}}
+
+\def\dohandlestructureheadpagebreak
+ {%[[\currentstructurehead @\thenamedstructureheadlevel\currentstructurehead/prev:\previousstructurecounter/curr:\currentstructurecounter]]
+ \ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \ifnum\lastpenalty>\zerocount
+% \global\pagebreakdisabledtrue
+ \fi
+ % beware, these numbers are not yet know here
+ \doifelse{\structureheadparameter\c!continue}\v!yes
+ {\ifnum\previousstructurecounter=\zerocount
+ \docheckstructureheadlayout
+ \else\ifnum\currentstructurecounter>\zerocount
+ \docheckstructureheadlayout
+ \fi\fi}%
+ {\docheckstructureheadlayout}%
+ \doifnot{\structureheadparameter\c!aligntitle}\v!float\flushsidefloats
+ \structureheadparameter\c!before
+ \relax
+% \ifpagebreakdisabled
+% \global\pagebreakdisabledfalse
+% \else
+ \dopreventbreakafterstructureheadauto
+% \fi
+ \doif{\structureheadparameter\c!aligntitle}\v!float\indent
+ \global\precedingstructurelevel\currentstructureheadlevel
+ \fi}
+
+% the next one was: \somebreakmethod
+
+% \chardef\somestructureheadbreakmethod\plusone % 0=nothing, 1=weighted, 2=strict, 3=vspacing
+\chardef\somestructureheadbreakmethod\plusthree
+
+% \def\dopreventbreakafterstructureheadauto % used after \c!before
+% {\ifcase\somestructureheadbreakmethod
+% % 0 = nothing
+% \or
+% % 1 = old weighted version
+% \ifnum\currentstructureheadlevel>\precedingstructurelevel
+% \dosomebreak{\penalty\numexpr20000+500*\currentstructureheadlevel\relax}%
+% \else
+% \dosomebreak\allowbreak % brr
+% \fi
+% \or
+% % 2 = strict version
+% \dosomebreak{\penalty\maxdimen}%
+% \or
+% % 3 = vspacing
+% \vspacing[\v!samepage]% if preceded by ! then a loop
+% \else
+% % nothing
+% \fi}
+%
+% \def\dopreventbreakafterstructureheadspec#1% see enumerations etc
+% {\ifcase\somestructureheadbreakmethod
+% % 0 = nothing
+% \or
+% % 1 = old weighted version
+% \dosomebreak{\penalty\numexpr20000+500*(\currentstructureheadlevel+#1)\relax}%
+% \or
+% % 2 = strict version
+% \dosomebreak{\penalty\maxdimen}%
+% \or
+% % 3 = vspacing
+% \vspacing[\v!samepage]%
+% \else
+% % nothing
+% \fi}
+%
+% todo: \vspacing[category:8] == keep_together
+
+\def\dopreventbreakafterstructureheadauto % used after \c!before
+ {\ifcase\somestructureheadbreakmethod
+ % 0 = nothing
+ \else
+ \vspacing[\v!samepage-\currentstructureheadlevel]%
+ \fi}
+
+\def\dopreventbreakafterstructureheadspec#1% see enumerations etc
+ {\ifcase\somestructureheadbreakmethod
+ % 0 = nothing
+ \else
+ \vspacing[\v!samepage-\the\numexpr\currentstructureheadlevel+1\relax]% todo #1
+ \fi}
+
+\def\dohandlepagebreakX{\dopreventbreakafterstructureheadspec} % no \let so we can redefind
+
+% we do support negative numbers but it can have side effects that we won't
+% catch
+%
+% \chapter{some} \setupheadnumber[chapter][3] \chapter{more}
+% \setupheadnumber[section][8] \section{b} \section{c} \setupheadnumber[section][-1] \section{d}
+
+% \def\thecurrentstructureheadlevel#1%
+% {\getcurrentstructurelevel{#1}}
+
+\def\thenamedstructureheadlevel#1%
+ {\structuresectionlevel{\structuresectionheadsection{\structuresectionheadcoupling{#1}}}}
+
+\unexpanded\def\setupheadnumber
+ {\dodoubleargument\dosetupheadnumber}
+
+\def\dosetupheadnumber[#1][#2]% todo: reset if at other level
+ {\setstructurenumber{\thenamedstructureheadlevel{#1}}{#2}}
+
+\def\currentstructureheadnumber{0} % ==> \currentheadnumber
+
+\unexpanded\def\determineheadnumber[#1]%
+ {\xdef\currentstructureheadnumber{\getstructurenumber{\thenamedstructureheadlevel{#1}}}}
+
+% The previous macro is been replaced by the expandable:
+
+\def\namedheadnumber #1{\getstructurenumber {\thenamedstructureheadlevel{#1}}}
+\def\somenamedheadnumber#1#2{\getsomestructurenumber{\thenamedstructureheadlevel{#1}}{#2}}
+
+\unexpanded\def\structureheadnumber
+ {\dodoubleempty\dostructureheadnumber}
+
+\def\dostructureheadnumber[#1][#2]% simple case is just a number
+ {\getsomefullstructurenumber{\iffirstargument\thenamedstructureheadlevel{#1}\fi}{#2}}
+
+\def\somestructureheadnumber
+ {\dodoubleempty\dosomestructureheadnumber}
+
+\def\dosomestructureheadnumber[#1][#2]%
+ {\dontleavehmode
+ \begingroup
+ \edef\currentstructurehead{#1}%
+ \getsomefullstructurenumber{\thenamedstructureheadlevel{#1}}{#2}%
+ \endgroup}
+
+% compatibility code (after all, we might offer different structure handlers as well
+% but we might as well remove the 'structure' substring at some point (we needed it
+% in order to test the old and new methods alongside)
+
+\let\definesectionblock \definestructureblock
+\let\definesection \definestructuresection
+\let\setupsection \setupstructuresection
+\let\setupheads \setupstructureheads
+\let\definehead \definestructurehead
+\let\setuphead \setupstructurehead
+\let\headnumber \structureheadnumber
+\let\setupsectionblock \setupstructureblock
+
+\let\sectioncountervalue\structurevalue
+
+\def\currentheadnumber {\currentstructureheadnumber}
+\def\currentheadtext {obsolete, use marks}
+
+% list references, will be redone in lua when we need it
+
+\let\startlistreferences\relax
+\let\stoplistreferences \relax
+
+\protect \endinput
diff --git a/tex/context/base/strc-swd.mkii b/tex/context/base/strc-swd.mkii
new file mode 100644
index 000000000..4a71b8781
--- /dev/null
+++ b/tex/context/base/strc-swd.mkii
@@ -0,0 +1,127 @@
+%D \module
+%D [ file=strc-swd,
+%D version=2007.08.14,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Section Worlds,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is a prelude to a rewrite of sectioning.
+
+% options : before after setups page text number label bookmark
+% dodo : listtext
+%
+% \startsectionworld[chapter][text={Test}]
+% \stopsectionworld
+
+\writestatus{loading}{ConTeXt Structure Macros / Sectionworlds}
+
+\unprotect
+
+\ifx\pushvalue\undefined
+
+ \def\pushvalue#1{\expandafter\pushmacro\csname#1\endcsname}
+ \def\popvalue #1{\expandafter\popmacro \csname#1\endcsname}
+
+\fi
+
+% brrr
+
+\def\csnameexpanded#1#2%
+ {\@EA\@EA\@EA\@EA\@EA\@EA\@EA#1\@EA\@EA\@EA\@EA\@EA\@EA\@EA#2\@EA\@EA\@EA\@EA\@EA\@EA\@EA}
+
+\def\csnameexpandedoneargument#1#2%
+ {\csnameexpanded\def\csexpandeda{#2}%
+ \@EA#1\@EA{\csexpandeda}}
+
+\def\csnameexpandedtwoarguments#1#2#3%
+ {\csnameexpanded\def\csexpandeda{#2}%
+ \csnameexpanded\def\csexpandedb{#3}%
+ \@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA\csexpandeda\@EA}\@EA{\csexpandedb}}
+
+\def\csnameexpandedthreearguments#1#2#3#4%
+ {\csnameexpanded\def\csexpandeda{#2}%
+ \csnameexpanded\def\csexpandedb{#3}%
+ \csnameexpanded\def\csexpandedc{#4}%
+ \@EA\@EA\@EA\@EA\@EA\@EA\@EA#1\@EA\@EA\@EA\@EA\@EA\@EA\@EA{\@EA\@EA\@EA\csexpandeda\@EA\@EA\@EA}\@EA\@EA\@EA{\@EA\csexpandedb\@EA}\@EA{\csexpandedc}}
+
+% \def\xx{XX}\setvalue{xx:yy}{abc \xx def}\def\param#1{\csname xx:#1\endcsname}
+% \def\testa #1{\defconvertedargument\ascii{#1}{\tttf\ascii}}
+% \def\testb #1#2{\defconvertedargument\ascii{#1 #2}{\tttf\ascii}}
+% \def\testc#1#2#3{\defconvertedargument\ascii{#1 #2 #3}{\tttf\ascii}}
+% \noindent 1 \csnameexpandedoneargument \testa{\param{yy}}
+% \noindent 2 \csnameexpandedtwoarguments \testb{\param{yy}}{\param{yy}}
+% \noindent 3 \csnameexpandedthreearguments\testc{\param{yy}}{\param{yy}}{\param{yy}}
+
+% rewrite the sectioning to use the variables, a bit tricky because then
+% we need a special expansion trick
+
+\def\sectionworldparameter #1{\csname\??sw\currentsectionworldname#1\endcsname}
+\def\pushsectionworldparameter#1{\expandafter\pushmacro\csname\??sw\currentsectionworldname#1\endcsname}
+\def\popsectionworldparameter #1{\expandafter\popmacro \csname\??sw\currentsectionworldname#1\endcsname}
+
+\def\setupsectionworld
+ {\dodoubleargument\dosetupsectionworld}
+
+\def\dosetupsectionworld[#1][#2]%
+ {\getparameters[\??sw#1][#2]} % maybe some extra things
+
+\def\dochecksectionworld#1%
+ {\ifcsname\??sw\currentsectionworldname\endcsname\else
+ \getparameters
+ [\??sw\currentsectionworldname]
+ [\c!before=,
+ \c!after=,
+ \c!setups=,
+ \c!page=]%
+ \fi}
+
+\def\startsectionworld
+ {\dodoubleargument\dostartsectionworld}
+
+\def\dostartsectionworld[#1][#2]%
+ {\pushmacro\currentsectionworldname
+ \def\currentsectionworldname{#1}%
+ \dochecksectionworld\currentsectionworldname
+ \pushsectionworldparameter\c!before
+ \pushsectionworldparameter\c!after
+ \pushsectionworldparameter\c!setups
+ \getparameters
+ [\??sw\currentsectionworldname]
+ [\c!text=,\c!number=\finalsectionnumber,\c!label=,\c!bookmark=,#2]%
+ \doifsomething{\sectionworldparameter\c!page}
+ {\setsectieenkoppeling\currentsectionworldname
+ %\handlepagebreak\currentsectionworldname
+ \checknexthead\handlepagebreak\currentsectionworldname}%
+ \sectionworldparameter\c!before
+ \begingroup
+ \doifsomething{\sectionworldparameter\c!page}
+ {\settrue\ignorehandlepagebreak}%
+ \doifsomething{\sectionworldparameter\c!setups}
+ {\setups[\sectionworldparameter\c!setups]}%
+ \csnameexpandedthreearguments \doconstructheadwithvars
+ {\sectionworldparameter\c!label }%
+ {\sectionworldparameter\c!number}%
+ {\sectionworldparameter\c!text }%
+ \doifsomething{\sectionworldparameter\c!bookmark}
+ {\expanded{\bookmark[\sectionworldparameter\c!bookmark]}}%
+ \ignorespaces} % for inline heads
+
+\def\doconstructheadwithvars#1%#2#3%
+ {\dodododoconstructhead\currentsectionworldname[#1]}% {#2}{#3}}
+
+\def\stopsectionworld
+ {\endgraf
+ \endgroup
+ \sectionworldparameter\c!after
+ \popsectionworldparameter\c!setups
+ \popsectionworldparameter\c!after
+ \popsectionworldparameter\c!before
+ \popmacro\currentsectionworldname}
+
+\protect \endinput
diff --git a/tex/context/base/strc-syn.lua b/tex/context/base/strc-syn.lua
new file mode 100644
index 000000000..d6f38c2c7
--- /dev/null
+++ b/tex/context/base/strc-syn.lua
@@ -0,0 +1,189 @@
+if not modules then modules = { } end modules ['str-syn'] = {
+ version = 1.001,
+ comment = "companion to str-syn.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, type = next, type
+local texwrite, texsprint, format = tex.write, tex.sprint, string.format
+
+local ctxcatcodes = tex.ctxcatcodes
+
+-- interface to tex end
+
+joblists = joblists or { }
+joblists.collected = joblists.collected or { }
+joblists.tobesaved = joblists.tobesaved or { }
+
+local collected, tobesaved = joblists.collected, joblists.tobesaved
+
+local function initializer()
+ collected, tobesaved = joblists.collected, joblists.tobesaved
+end
+
+local function finalizer()
+ for entry, data in next, tobesaved do
+ data.hash = nil
+ end
+end
+
+job.register('joblists.collected', joblists.tobesaved, initializer, finalizer)
+
+local function allocate(class)
+ local d = tobesaved[class]
+ if not d then
+ d = {
+ metadata = {
+ language = 'en',
+ sorted = false,
+ class = class
+ },
+ entries = {
+ },
+ hash = {
+ }
+ }
+ tobesaved[class] = d
+ end
+ return d
+end
+
+function joblists.define(class,kind)
+ local data = allocate(class)
+ data.metadata.kind = kind
+end
+
+function joblists.register(class,kind,spec)
+ local data = allocate(class)
+ data.metadata.kind = kind -- runtime, not saved in format (yet)
+ if not data.hash[spec.definition.tag or ""] then
+ data.entries[#data.entries+1] = spec
+ data.hash[spec.definition.tag or ""] = spec
+ end
+end
+
+function joblists.registerused(class,tag)
+ local data = allocate(class)
+ local dht = data.hash[tag]
+ if dht then
+ dht.definition.used = true
+ end
+end
+
+function joblists.synonym(class,tag)
+ local data = allocate(class).hash
+ local d = data[tag]
+ if d then
+ local de = d.definition
+ de.used = true
+ texsprint(ctxcatcodes,de.synonym)
+ end
+end
+
+function joblists.meaning(class,tag)
+ local data = allocate(class).hash
+ local d = data[tag]
+ if d then
+ local de = d.definition
+ de.used = true
+ texsprint(ctxcatcodes,de.meaning)
+ end
+end
+
+joblists.compare = sorters.comparers.basic -- (a,b)
+
+function joblists.filter(data,options)
+ local result = { }
+ local entries = data.entries
+ local all = options and options.criterium == interfaces.variables.all
+ for i=1,#entries do
+ local entry = entries[i]
+ if all or entry.definition.used then
+ result[#result+1] = entry
+ end
+ end
+ data.result = result
+end
+
+function joblists.prepare(data)
+ local strip = sorters.strip
+ local splitter = sorters.splitters.utf
+ local result = data.result
+ if result then
+ for i=1, #result do
+ local r = result[i]
+ local rd = r.definition
+ if rd then
+ local rt = rd.tag
+ local sortkey = (rt and rt ~= "" and rt) or rd.synonym
+ r.split = splitter(strip(sortkey))
+ end
+ end
+ end
+end
+
+function joblists.sort(data,options)
+ sorters.sort(data.result,joblists.compare)
+end
+
+function joblists.finalize(data,options)
+ local result = data.result
+ data.metadata.nofsorted = #result
+ local split = { }
+ for k=1,#result do
+ local v = result[k]
+ local entry, tag = sorters.firstofsplit(v)
+ local s = split[entry] -- keeps track of change
+ if not s then
+ s = { tag = tag, data = { } }
+ split[entry] = s
+ end
+ s.data[#s.data+1] = v
+ end
+ data.result = split
+end
+
+function joblists.flush(data,options) -- maybe pass the settings differently
+ local kind = data.metadata.kind -- hack, will be done better
+--~ texsprint(ctxcatcodes,format("\\start%soutput",kind))
+ local result = data.result
+ local sorted = table.sortedkeys(result)
+ for k=1,#sorted do
+ local letter = sorted[k]
+ local sublist = result[letter]
+ local data = sublist.data
+--~ texsprint(ctxcatcodes,format("\\start%ssection{%s}",kind,sublist.tag))
+ for d=1,#data do
+ local entry = data[d].definition
+ texsprint(ctxcatcodes,format("\\%sentry{%s}{%s}{%s}{%s}",kind,d,entry.tag,entry.synonym,entry.meaning or ""))
+ end
+--~ texsprint(ctxcatcodes,format("\\stop%ssection",kind))
+ end
+--~ texsprint(ctxcatcodes,format("\\stop%soutput",kind))
+ -- for now, maybe at some point we will do a multipass or so
+ data.result = nil
+ data.metadata.sorted = false
+end
+
+function joblists.analysed(class,options)
+ local data = joblists.collected[class]
+ if data and data.entries then
+ options = options or { }
+ sorters.setlanguage(options.language)
+ joblists.filter(data,options) -- filters entries to result
+ joblists.prepare(data,options) -- adds split table parallel to list table
+ joblists.sort(data,options) -- sorts entries in result
+ joblists.finalize(data,options) -- do things with data.entries
+ data.metadata.sorted = true
+ end
+ return data and data.metadata.sorted and data.result and next(data.result)
+end
+
+function joblists.process(class,options)
+ if joblists.analysed(class,options) then
+ joblists.flush(joblists.collected[class],options)
+ end
+end
+
diff --git a/tex/context/base/strc-syn.mkii b/tex/context/base/strc-syn.mkii
new file mode 100644
index 000000000..39acb7d91
--- /dev/null
+++ b/tex/context/base/strc-syn.mkii
@@ -0,0 +1,438 @@
+%D \module
+%D [ file=strc-syn,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Synonyms and Sorts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Structure Macros / Synonyms and Sorts}
+
+\unprotect
+
+% \checkdefined kan hierheen
+
+% Formaat tex-utility-input-file <jobname.tui>:
+%
+% synonym entry {tag} {pure} {text} {synonym}
+%
+% Deze file wordt met het programma TeXUtil omgezet in een
+% in te lezen TeXFile met de commando's:
+%
+% \synonymentry {tag} {pure} {text} {synonym}
+
+\newif\ifsynonymmeaning
+
+% todo: \def\synonymparameter#1{\csname\??sm\currentsynonym#1\endcsname}
+
+\def\dosetupsynonyms[#1][#2]%
+ {\getparameters[\??sm#1][#2]}
+
+\def\setupsynonyms
+ {\dodoubleargument\dosetupsynonyms}
+
+\def\doresetsynonym#1%
+ {\letvalue{#1\s!entry}\gobblethreearguments}
+
+\def\dohandlesynonymentry#1#2#3#4%
+ {\bgroup
+ \global\utilitydonetrue
+ \syndef
+ {\doattributes{\??sm#1}\c!textstyle\c!textcolor{#3}}
+ \ConvertToConstant\doifelse{#4}{}{\unknown}{#4}\par
+ \egroup}
+
+\def\synonymentry#1%
+ {\executeifdefined{#1\s!entry}\gobblethreearguments}
+
+\def\dosetsynonym#1%
+ {\doifdefinedelse{\??sm#1\c!command}
+ {\setvalue{#1\s!entry}{\getvalue{\??sm#1\c!command}}} % 3 argumenten
+ {\setvalue{#1\s!entry}{\dohandlesynonymentry{#1}}}}
+
+\def\synonymparameter#1{\csname\??sm\currentsynonym#1\endcsname}
+
+\def\doplacelistofsynonyms#1#2%
+ {\whitespace
+ \begingroup
+ \def\currentsynonym{#1}%
+ \definedescription % nog eens een class van maken, net als framed
+ [syndef]
+ [\c!location=\synonymparameter\c!location,
+ \c!width=\synonymparameter\c!width,
+ \c!distance=\synonymparameter\c!distance,
+ \c!sample=\synonymparameter\c!sample,
+ \c!hang=\synonymparameter\c!hang,
+ \c!align=\synonymparameter\c!align,
+ \c!before=\synonymparameter\c!before,
+ \c!inbetween=\synonymparameter\c!inbetween,
+ \c!after=\synonymparameter\c!after,
+ \c!indentnext=\synonymparameter\c!indentnext,
+ \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
+ \doutilities{#1}\jobname{#1}\relax\relax
+ \endgroup
+ \ifutilitydone\else\nowhitespace\fi}
+
+\def\docompletelistofsynonyms#1#2% expansion needed to avoid v! (due to french active !)
+ {\expanded{\systemsuppliedchapter[#1]{\noexpand\headtext{#2}}}%
+ \doplacelistofsynonyms{#1}{#2}%
+ \page[\v!yes]}
+
+\def\processsynonym#1#2#3%
+ {\begingroup % anders in mathmode lege \hbox, zie eenheden
+ \ifsynonymmeaning
+ \synonymmeaningfalse
+ \doattributes{\??sm#1}\c!synonymstyle\c!synonymcolor{#3}%
+ \else
+ \dontleavehmode
+ \doattributes{\??sm#1}\c!textstyle\c!textcolor{#2}%
+ \fi
+ \endgroup}
+
+\def\getsynonymmeaning#1#2#3%
+ {\bgroup
+ \doifundefined{#2#3}
+ {\setgvalue{#2#3}{{\tt[#3]}}%
+ \showmessage\m!systems{18}{#1,#3}}%
+ \synonymmeaningtrue
+ \getvalue{#2#3}%
+ \egroup}
+
+\def\dowritesynonym#1#2#3#4%
+ {\begingroup % anders in mathmode lege \hbox
+ \defconvertexpanded\asciisynonym{\getvalue{\??sm#1\c!expansion}}{#3}%
+ \defconvertexpanded\asciimeaning{\getvalue{\??sm#1\c!expansion}}{#4}%
+ \immediatewriteutility{s e {#1} {#2} {\asciisynonym} {\asciimeaning}}%
+ \endgroup}
+
+\def\reprocesssynonym#1#2#3%
+ {\processsynonym{#1}{#2}{#3}%
+ \getvalue{\??sm#1\c!next}} % not formally documented
+
+\def\preexecutesynonym#1#2#3#4%
+ {\ifdoinpututilities \else
+ \dowritesynonym{#1}{#2}{#3}{#4}%
+ \unexpanded\setgvalue{#2}{\reprocesssynonym{#1}{#3}{#4}}%
+ \fi}
+
+\def\executesynonym#1#2#3#4%
+ {\preexecutesynonym{#1}{#2}{#3}{#4}%
+ \processsynonym{#1}{#3}{#4}%
+ \getvalue{\??sm#1\c!next}} % not formally documented
+
+\def\expandsynonym#1#2#3#4%
+ {{\synonymmeaningtrue
+ \processsynonym{#1}{#3}{#4}}}
+
+\def\dodoloadsynonym#1#2#3#4%
+ {\setgvalue{#2}{\executesynonym{#1}{#2}{#3}{#4}}}
+
+\def\doloadsynonym#1%
+ {\setvalue{#1\s!entry}##1##2##3%
+ {\doifelsenothing{##1}
+ {\dodoloadsynonym{#1}{##2}{##2}{##3}}
+ {\dodoloadsynonym{#1}{##1}{##2}{##3}}%
+ \global\utilitydonetrue}}
+
+\def\doloadsynonyms#1#2%
+ {\bgroup
+ \let\dosetsynonym\doloadsynonym
+ \showmessage\m!systems{19}{#2}%
+ \doutilities{#1}\jobname{#1}\relax\relax
+ \egroup
+ \setvalue{\s!check#1}##1{}}
+
+\def\dodocomplexsynonym[#1][#2]#3#4%
+ {\doifsomething{#2}
+ {\getvalue{\s!check#1}{#2}%
+ \doglobal\appendtoks\setvalue{#2}{#2}\to\simplifiedcommands
+ \doifelsevalue{\??sm#1\c!conversion}\v!yes
+ {\unexpanded\setgvalue{#2}{\expandsynonym{#1}{#2}{#3}{#4}}}
+ {\doifelsevalue{\??sm#1\c!state}\v!start
+ {\doifelsevalue{\??sm#1\c!criterium}\v!all
+ {\preexecutesynonym{#1}{#2}{#3}{#4}}
+ {\unexpanded\setgvalue{#2}{\executesynonym{#1}{#2}{#3}{#4}}}}
+ {\unexpanded\setgvalue{#2}{\processsynonym{#1}{#3}{#4}}}}}}
+
+\def\docomplexsynonym[#1][#2][#3]#4#5%
+ {\ifthirdargument
+ \dodocomplexsynonym[#2][#1#3]{#4}{#5}%
+ \else
+ \dodocomplexsynonym[#2][#1#4]{#4}{#5}%
+ \fi}
+
+\def\doregistersynonymlanguage#1%
+ {\savesortlanguage{\getvalue{\??sm#1\s!language}}%
+ \immediatewriteutility{s l {#1} {\getvalue{\??sm#1\s!language}}}}
+
+\def\dodefinesynonyms[#1][#2][#3][#4]%
+ {\iffourthargument
+ \unexpanded\def#4##1{\getsynonymmeaning{#1}{\??sm:#1:}{##1}}%
+ \ifthirdargument
+ \unexpanded\def#3##1{\getvalue{\??sm:#1:##1}}%
+ \fi
+ \setvalue{#1}{\dotripleempty\docomplexsynonym[\??sm:#1:][#1]}%
+ \else
+ \ifthirdargument
+ \unexpanded\def#3##1{\getsynonymmeaning{#1}{}{##1}}%
+ \fi
+ \setvalue{#1}{\dotripleempty\docomplexsynonym[][#1]}%
+ \fi
+ \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=,
+ \c!before=,\c!inbetween=,\c!after=,
+ \c!indentnext=\v!no,
+ \c!expansion=,
+ \s!language=\currentmainlanguage]%
+ \doglobal\appendtoksonce
+ \doregistersynonymlanguage{#1}%
+ \to \everysavesortkeys
+ \presetheadtext[#2=\Word{#2}]% changes the \if...argument
+ \addutilityreset{#1}%
+ \setvalue{\e!setup #2\e!endsetup}{\dodoubleargument\getparameters[\??sm#1]}% to be obsolete
+ \setvalue{\s!set #1}{\dosetsynonym{#1}}%
+ \setvalue{\s!reset #1}{\doresetsynonym{#1}}%
+ \setvalue{\s!check #1}##1{\checkdefined{synonym}{#1}{##1}}%
+ \setvalue{\e!load #2}{\doloadsynonyms{#1}{#2}}%
+ \setvalue{\e!place\e!listof #2}{\doplacelistofsynonyms{#1}{#2}}%
+ \setvalue{\e!complete\e!listof#2}{\docompletelistofsynonyms{#1}{#2}}}
+
+\def\definesynonyms
+ {\doquadrupleempty\dodefinesynonyms}
+
+% Formaat tex-utility-input-file <jobname.tui>:
+%
+% synonym entry {tag} {pure} {text} {}
+%
+% Deze file wordt met het programma TeXUtil omgezet in een
+% in te lezen TeXFile met de commando's:
+%
+% \synonymentry {tag} {pure} {text} {}
+
+\def\dosetupsorting[#1][#2]%
+ {\getparameters[\??so#1][#2]}
+
+\def\setupsorting
+ {\dodoubleargument\dosetupsorting}
+
+\def\doresetsort#1%
+ {\letvalue{#1\s!entry}\gobblethreearguments}
+
+\def\dosetsort#1%
+ {\setvalue{#1\s!entry}##1##2##3%
+ {\let\dowritesort\gobblethreearguments
+ \global\utilitydonetrue
+ \bgroup
+ \doifdefinedelse{\??so#1\c!command}
+ {\getvalue{\??so#1\c!command}{##2}} % 1 argument
+ {\getvalue{\??so#1\c!before}%
+ \doattributes{\??so#1}\c!style\c!color{##2}%
+ \getvalue{\??so#1\c!after}}%
+ \egroup}}
+
+\def\doplacelistofsorts#1% NOG EEN RUWE VERSIE MAKEN
+ {\whitespace % ZONDER WITRUIMTE ETC ETC
+ \begingroup
+ \setupwhitespace[\v!none]%
+ \doutilities{#1}\jobname{#1}\relax\relax
+ \endgroup
+ \ifutilitydone\else\nowhitespace\fi}
+
+% to be tested
+%
+% \def\doplacelistofsorts#1% NOG EEN RUWE VERSIE MAKEN
+% {\startpacked
+% %doutilities{#1}\jobname{#1}\relax\par
+% \doutilities{#1}\jobname{#1}\relax\relax
+% \stoppacked}
+
+\def\docompletelistofsorts#1#2%
+ {\expanded{\systemsuppliedchapter[#1]{\noexpand\headtext{#2}}}%
+ \doplacelistofsorts{#1}%
+ \page[\v!yes]}
+
+% todo:
+%
+% \def\placelistofsorts[#1]%
+% {\doplacelistofsorts{#1}}
+
+\def\processsort#1#2#3%
+ {\dontleavehmode
+ \begingroup % was \bgroup
+ \doattributes{\??so#1}\c!style\c!color{#2}%
+ \endgroup} % was \egroup
+
+\def\dowritesort#1#2#3%
+ {\bgroup
+ \defconvertexpanded\asciisynonym{\getvalue{\??so#1\c!expansion}}{#3}%
+ \immediatewriteutility{s e {#1} {#2} {\asciisynonym} {}}%
+ \egroup}
+
+\def\synonymentry#1%
+ {\executeifdefined{#1\s!entry}\gobblethreearguments}
+
+\def\reprocesssort#1#2#3%
+ {\processsort{#1}{#2}{#3}%
+ \getvalue{\??so#1\c!next}}
+
+\def\preexecutesort#1#2#3%
+ {\ifdoinpututilities \else
+ \dowritesort{#1}{#2}{#3}%
+ \unexpanded\setgvalue{#2}{\reprocesssort{#1}{#3}{#2}}%
+ \fi}
+
+\def\executesort#1#2#3%
+ {\begingroup
+ \let\executesort\thirdofthreearguments % Trick needed for nested logo's.
+ \preexecutesort{#1}{#2}{#3}%
+ \processsort{#1}{#3}{#2}%
+ \endgroup
+ \getvalue{\??so#1\c!next}} % not formally documented
+
+\def\doloadsort#1%
+ {\setvalue{#1\s!entry}##1##2##3%
+ {\setgvalue{##1}{##2}%
+ \global\utilitydonetrue}}
+
+\def\doloadsort#1#2%
+ {\bgroup
+ \let\dosetsort\doloadsort
+ \showmessage\m!systems{20}{#2}%
+ \doutilities{#1}\jobname{#1}\relax\relax
+ \egroup
+ \setvalue{\s!check#1}##1{}}
+
+\def\dodocomplexsort[#1][#2]#3%
+ {\doifsomething{#2}
+ {\getvalue{\s!check#1}{#2}%
+ \doglobal\appendtoks\setvalue{#2}{#2}\to\simplifiedcommands
+ \doifelsevalue{\??so#1\c!state}\v!start
+ {\doifelsevalue{\??so#1\c!criterium}\v!all
+ {\preexecutesort{#1}{#2}{#3}}
+ {\unexpanded\setgvalue{#2}{\executesort{#1}{#2}{#3}}}}
+ {\unexpanded\setgvalue{#2}{\processsort{#1}{#3}{#2}}}}}
+
+\def\docomplexsort[#1][#2][#3]#4%
+ {\ifthirdargument
+ \dodocomplexsort[#2][#1#3]{#4}%
+ \else
+ \dowritesort{#2}{#4}{#4}%
+ \fi}
+
+% if #3=\relax or \v!none, then no command but still protected
+
+\def\doregistersortinglanguage#1%
+ {\savesortlanguage{\getvalue{\??so#1\s!language}}%
+ \immediatewriteutility{s l {#1} {\getvalue{\??so#1\s!language}}}}
+
+\def\dodefinesorting[#1][#2][#3]%
+ {\getparameters[\??so#1]
+ [%\c!command=, % we test for defined !
+ \c!state=\v!start,
+ \c!criterium=,
+ \c!style=,
+ \c!before=,
+ \c!after=\endgraf,
+ \c!expansion=,
+ \s!language=\currentmainlanguage]%
+ \doglobal\appendtoksonce
+ \doregistersortinglanguage{#1}%
+ \to \everysavesortkeys
+ \ifthirdargument
+ \ConvertConstantAfter\doifnot{#3}\v!none
+ {\ifx#3\relax \else
+ \def#3##1{\getvalue{\??so:#1:##1}}
+ \fi}%
+ \setvalue{#1}{\dotripleempty\docomplexsort[\??so:#1:][#1]}%
+ \else
+ \setvalue{#1}{\dotripleempty\docomplexsort[][#1]}%
+ \fi
+ \addutilityreset{#1}%
+ \presetheadtext[#2=\Word{#2}]% after \ifthirdargument -)
+ \setvalue{\e!setup#2\e!endsetup}[##1]{\getparameters[\??so#1][##1]}% to be obsolete
+ \setvalue{\s!set#1}{\dosetsort{#1}}%
+ \setvalue{\s!reset#1}{\doresetsort{#1}}%
+ \setvalue{\e!load#2}{\doloadsort{#1}{#2}}%
+ \setvalue{\s!check#1}##1{\checkdefined{sort}{#1}{##1}}%
+ \setvalue{\e!place\e!listof#2}{\doplacelistofsorts{#1}}%
+ \setvalue{\e!complete\e!listof#2}{\docompletelistofsorts{#1}{#2}}}
+
+\def\definesorting
+ {\dotripleempty\dodefinesorting}
+
+%D Here we define a support macro that can sort simple comma
+%D separated lists. It's a multi-list variant of a prototype
+%D written by Taco.
+
+\def\processlistofsorts[#1]%
+ {\doutilities{#1}\jobname{#1}\relax\relax}
+
+\newcounter\nofsortedalphalists
+
+\def\sortalphacommacommand#1%
+ {\begingroup
+ \doglobal\increment\nofsortedalphalists
+ \edef\currentsortedalphalist{alpha:\nofsortedalphalists}%
+ \definesorting[\currentsortedalphalist][\currentsortedalphalist]%
+ \processcommacommand[#1]{\getvalue\currentsortedalphalist}%
+ \global\let\sortedcommalist\empty
+ \def\makesortedlist##1{\doglobal\appendtocommalist{##1}\sortedcommalist}%
+ \setupsorting[\currentsortedalphalist][\c!criterium=\v!all,\c!command=\makesortedlist]%
+ \processlistofsorts[\currentsortedalphalist]%
+ \endgroup
+ \dodoglobal\let#1\sortedcommalist}
+
+% \starttext
+% \def\whatever{a,b,q,d,r,f} \sortalphacommacommand\whatever \whatever \endgraf
+% \def\whatever{ax,bx,qx,dx,rx,fx} \sortalphacommacommand\whatever \whatever \endgraf
+% \stoptext
+
+%D Presets.
+
+\definesynonyms
+ [\v!abbreviation]
+ [\v!abbreviations]
+ [\infull]
+
+\setupsynonyms
+ [\v!abbreviation]
+ [\c!textstyle=\v!capital,
+ \c!textcolor=,
+ \c!synonymstyle=,
+ \c!synonymcolor=,
+ \c!headstyle=,
+ \c!headcolor=,
+ \c!location=\v!left,
+ \c!width=5em,
+ \c!state=\v!start]
+
+\definesorting
+ [\v!logo]
+ [\v!logos]
+% no [\logogram]
+
+\definesynonyms
+ [\v!unit]
+ [\v!units]
+ [\unitmeaning]
+
+\setupsynonyms
+ [\v!unit]
+ [\c!textstyle=\dimension]
+
+\protect \endinput
diff --git a/tex/context/base/strc-syn.mkiv b/tex/context/base/strc-syn.mkiv
new file mode 100644
index 000000000..65f517437
--- /dev/null
+++ b/tex/context/base/strc-syn.mkiv
@@ -0,0 +1,431 @@
+%D \module
+%D [ file=strc-syn,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Synonyms and Sorting,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / Synonyms and Sorting}
+
+\registerctxluafile{strc-syn}{1.001}
+
+% todo: add 'define only' option to descriptions, then add sorting (also based on key)
+% and call to definition -> replaces this module
+
+\unprotect
+
+% general help, can be shared
+
+% simplifiedcommands -> flag in lua
+%
+% expansion
+% criterium -> when start, then flag in list
+% command-> wanneer?
+% state -> flagging enabled
+% conversion ?
+% todo: register xml mode etc
+
+% split but common in lua
+
+\def\preprocessexpansion#1#2#3#4%
+ {\ifx#1\s!xml
+ \xmlstartraw
+ \xdef#2{#4}%
+ \xmlstopraw
+ \globallet#3\s!xml
+ \else
+ \ifx#1\v!yes
+ \xdef#2{#4}%
+ \else
+ \xdef#2{\detokenize{#4}}%
+ \fi
+ \globallet#3\s!tex
+ \fi}
+
+\let\currentsynonym\empty
+
+\def\synonymparameter #1{\csname\dosynonymparameter{\??sm\currentsynonym}#1\endcsname}
+\def\synonymparameterhash#1{\dosynonymparameterhash {\??sm\currentsynonym}#1}
+
+\def\dosynonymparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dosynonymparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dosynonymparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dosynonymparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dosynonymparentparameter #1#2{\ifx#1\relax\s!empty\else\dosynonymparameter #1#2\fi}
+\def\dosynonymparentparameterhash#1#2{\ifx#1\relax \else\dosynonymparameterhash#1#2\fi}
+
+\unexpanded\def\dosetsynonymattributes#1#2% style color
+ {\edef\fontattributehash {\synonymparameterhash#1}%
+ \edef\colorattributehash{\synonymparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\newtoks\everysetupsynonyms
+
+\unexpanded\def\setupsynonyms
+ {\dodoubleargument\dosetupsynonyms}
+
+\def\dosetupsynonyms[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??sm#1][#2]%
+ \else
+ \getparameters[\??sm][#1]%
+ \fi
+ \the\everysetupsynonyms}
+
+\setupsynonyms
+ [\c!state=\v!start,
+ %\c!synonymstyle=,
+ %\c!textstyle=,
+ %\c!headstyle=,
+ %\c!headcolor=,
+ %\c!criterium=,
+ \c!location=\v!left,
+ \c!width=5em,
+ \c!distance=0pt,
+ %\c!sample=,
+ %\c!hang=,
+ %\c!align=,
+ %\c!before=,
+ %\c!inbetween=,
+ %\c!after=,
+ \c!indentnext=\v!no,
+ %\c!expansion=,
+ \s!language=\currentmainlanguage]
+
+\unexpanded\def\definesynonyms
+ {\doquadrupleempty\dodefinesynonyms}
+
+\def\dodefinesynonyms[#1][#2][#3][#4]% name plural \meaning \use
+ {\iffourthargument
+ \unexpanded\def#4##1{\doinsertsynonym{#1}{##1}}% name tag
+ \ifthirdargument
+ \unexpanded\def#3##1{\doinsertsynonymmeaning{#1}{##1}}% \meaning
+ \fi
+ \setuvalue{#1}{\definesynonym[\v!no][#1]}% \name
+ \else
+ \ifthirdargument
+ \unexpanded\def#3##1{\doinsertsynonymmeaning{#1}{##1}}% \meaning
+ \fi
+ \setuvalue{#1}{\definesynonym[\v!yes][#1]}% \name
+ \fi
+ \getparameters[\??sm#1][\s!parent=\??sm,\s!multi={#2}]%
+ \presetheadtext[#2=\Word{#2}]% changes the \if...argument
+ %\ctxlua{joblists.define('#1')}%
+ \setvalue{\e!setup #2\e!endsetup}{\dodoubleargument\getparameters[\??sm#1]}% to be obsolete
+ \setvalue{\e!place \e!listof#2}{\placelistofsynonyms[#1]}% accepts extra argument
+ \setvalue{\e!complete\e!listof#2}{\completelistofsynonyms[#1]}}
+
+\unexpanded\def\definesynonym
+ {\dotripleempty\dodefinesynonym}
+
+\def\dodefinesynonym[#1][#2][#3]#4#5%
+ {\begingroup
+ \edef\currentsynonym{#2}%
+ \edef\currentsynonymtag{#3}%
+ \ifx\currentsynonymtag\empty
+ \edef\currentsynonymtag{#4}%
+ \fi
+ \ifx\currentsynonymtag\empty
+ % todo: error message
+ \else
+ \edef\currentsynonymexpansion{\synonymparameter\c!expansion}%
+ \preprocessexpansion\currentsynonymexpansion\currentsynonymtext \currentsynonymcoding{#4}%
+ \preprocessexpansion\currentsynonymexpansion\currentsynonymmeaning\currentsynonymcoding{#5}%
+ \ctxlua{joblists.register("\currentsynonym", "synonym", {
+ metadata = {
+ catcodes = \the\catcodetable,
+ coding = "\currentsynonymcoding",
+ xmlroot = \ifx\currentsynonymcoding\s!xml "\xmldocument" \else nil \fi,
+ },
+ definition = {
+ tag = "\currentsynonymtag",
+ synonym = \!!bs\currentsynonymtext\!!es,
+ meaning = \!!bs\currentsynonymmeaning\!!es,
+ used = false,
+ }
+ })}%
+ \doif{#1}\v!yes{\setuxvalue\currentsynonymtag{\noexpand\doinsertsynonym{\currentsynonym}{\currentsynonymtag}}}%
+ \fi
+ \endgroup}
+
+\def\registersynonym
+ {\dodoubleargument\doregistersynonym}
+
+\def\registersynonym[#1][#2]%
+ {\ctxlua{joblists.registerused("#1","#2")}}
+
+\unexpanded\def\doinsertsynonymmeaning#1#2% name tag
+ {\begingroup
+ \def\currentsynonym{#1}%
+ \dosetsynonymattributes\c!textstyle\c!textcolor
+ \synonymparameter\c!textcommand{\ctxlua{joblists.meaning("#1","#2")}}%
+ \endgroup}
+
+\unexpanded\def\doinsertsynonym#1#2% name tag
+ {\begingroup
+ \def\currentsynonym{#1}%
+ \dosetsynonymattributes\c!synonymstyle\c!synonymcolor
+ \synonymparameter\c!synonymcommand{\ctxlua{joblists.synonym("#1","#2")}}%
+ \normalexpanded{\endgroup\synonymparameter\c!next}}
+
+\unexpanded\def\placelistofsynonyms
+ {\dodoubleempty\doplacelistofsynonyms}
+
+\def\doplacelistofsynonyms[#1][#2]%
+ {\begingroup
+ \def\currentsynonym{#1}%
+ \definedescription % todo, per class
+ [syndef]
+ [\c!location=\synonymparameter\c!location,
+ \c!width=\synonymparameter\c!width,
+ \c!distance=\synonymparameter\c!distance,
+ \c!sample=\synonymparameter\c!sample,
+ \c!hang=\synonymparameter\c!hang,
+ \c!align=\synonymparameter\c!align,
+ \c!before=\synonymparameter\c!before,
+ \c!inbetween=\synonymparameter\c!inbetween,
+ \c!after=\synonymparameter\c!after,
+ \c!indentnext=\synonymparameter\c!indentnext,
+% \c!headstyle=\synonymparameter\c!headstyle,
+% \c!headcolor=\synonymparameter\c!headcolor,
+ \c!headstyle=\synonymparameter\c!textstyle,
+ \c!headcolor=\synonymparameter\c!textcolor,
+ \c!style=,
+ \c!color=.
+ #2]%
+ \startpacked
+ \ctxlua{joblists.process('#1',{ criterium = "\synonymparameter\c!criterium" })}%
+ \stoppacked
+ \endgroup}
+
+\def\completelistofsynonyms
+ {\dodoubleempty\docompletelistofsynonyms}
+
+\def\docompletelistofsynonyms[#1][#2]% expansion needed to avoid v! (due to french active !)
+ {\normalexpanded{\systemsuppliedchapter[#1]{\noexpand\headtext{\synonymparameter\s!single}}}%
+ \doplacelistofsynonyms[#1][#2]%
+ \page[\v!yes]}
+
+\let\startsynonymoutput \relax
+\let\stopsynonymoutput \relax
+\let\startsynonymsection\gobbleoneargument
+\let\stopsynonymsection \relax
+
+\unexpanded\def\synonymentry#1#2#3#4%
+% {\syndef{\dosetsynonymattributes\c!textstyle\c!textcolor#2}#3\par}
+% {\startsyndef{#2}#3\stopsyndef}
+ {\syndef{#3}#4\par}
+
+\let\currentsorting\empty
+
+% we can share if we also have synonymprefix = so
+
+\def\sortingparameter #1{\csname\dosortingparameter{\??so\currentsorting}#1\endcsname}
+\def\sortingparameterhash#1{\dosortingparameterhash {\??so\currentsorting}#1}
+
+\def\dosortingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dosortingparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dosortingparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dosortingparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dosortingparentparameter #1#2{\ifx#1\relax\s!empty\else\dosortingparameter #1#2\fi}
+\def\dosortingparentparameterhash#1#2{\ifx#1\relax \else\dosortingparameterhash#1#2\fi}
+
+\def\dosetsortingattributes#1#2% style color
+ {\edef\fontattributehash {\sortingparameterhash#1}%
+ \edef\colorattributehash{\sortingparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+\newtoks\everysetupsorting
+
+\unexpanded\def\setupsorting
+ {\dodoubleargument\dosetupsorting}
+
+\def\dosetupsorting[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??so#1][#2]%
+ \else
+ \getparameters[\??so][#1]%
+ \fi
+ \the\everysetupsorting}
+
+\setupsorting
+ [\c!state=\v!start,
+ %\c!command=, % we test for defined !
+ %\c!criterium=,
+ %\c!style=,
+ %\c!before=,
+ \c!after=\endgraf,
+ %\c!expansion=,
+ \s!language=\currentmainlanguage]
+
+\unexpanded\def\definesorting
+ {\dotripleempty\dodefinesorting}
+
+% if #3=\relax or \v!none, then no command but still protected
+
+\def\dodefinesorting[#1][#2][#3]%
+ {\ifthirdargument
+ \doifnot{#3}\v!none
+ {\ifx#3\relax \else
+ \unexpanded\def#3##1{\doinsertsort{#1}{##1}}%
+ \fi}%
+ \setuvalue{#1}{\definesort[\v!no][#1]}%
+ \else
+ \setuvalue{#1}{\definesort[\v!yes][#1]}%
+ \fi
+ \getparameters[\??so#1][\s!parent=\??so,\s!multi={#2}]%
+ \presetheadtext[#2=\Word{#2}]% after \ifthirdargument -)
+ %\ctxlua{joblists.define('#1')}%
+ \setvalue{\e!setup #2\e!endsetup}{\dodoubleargument\getparameters[\??so#1]}% to be obsolete
+ \setvalue{\e!place \e!listof#2}{\placelistofsorts[#1]}%
+ \setvalue{\e!complete\e!listof#2}{\completelistofsorts[#1]}}
+
+\unexpanded\def\definesort
+ {\dotripleempty\dodefinesort}
+
+\def\dodefinesort[#1][#2][#3]#4%
+ {\begingroup
+ \edef\currentsorting{#2}%
+ \edef\currentsortingtag{#3}%
+ \ifx\currentsortingtag\empty
+ \edef\currentsortingtag{#4}%
+ \fi
+ \ifx\currentsortingtag\empty
+ % todo: error message
+ \else
+ \edef\currentsortingexpansion{\sortingparameter\c!expansion}%
+ \preprocessexpansion\currentsortingexpansion\currentsortingtext\currentsortingcoding{#4}%
+ \ctxlua{joblists.register("\currentsorting", "sorting", {
+ metadata = {
+ catcodes = \the\catcodetable,
+ coding = "\currentsortingcoding",
+ xmlroot = \ifx\currentsortingcoding\s!xml "\xmldocument" \else nil \fi,
+ },
+ definition = {
+ tag = "\currentsortingtag",
+ synonym = \!!bs\currentsortingtext\!!es,
+ % used = false,
+ }
+ })}%
+ \doif{#1}\v!yes{\setuxvalue\currentsortingtag{\noexpand\doinsertsort{\currentsorting}{\currentsortingtag}}}%
+ \fi
+ \endgroup}
+
+\unexpanded\def\doinsertsort#1#2% name tag
+ {\begingroup
+ % no kap currently, of .. we need to map cap onto WORD
+ \edef\currentsorting{#1}%
+ \dosetsynonymattributes\c!style\c!color
+ \ctxlua{joblists.synonym("#1","#2")}%
+ \normalexpanded{\endgroup\sortingparameter\c!next}}
+
+\def\registersort
+ {\dodoubleargument\doregistersort}
+
+\def\registersort[#1][#2]%
+ {\ctxlua{joblists.registerused("#1","#2")}}
+
+% before after
+%
+% maybe just 'commandset' and then combine
+
+\unexpanded\def\placelistofsorts
+ {\dodoubleempty\placelistofsorts}
+
+\unexpanded\def\placelistofsorts[#1][#2]% NOG EEN RUWE VERSIE MAKEN ZONDER WITRUIMTE ETC ETC
+ {\begingroup
+ \def\currentsorting{#1}%
+ \getparameters[\??so#1][#2]%
+ \startpacked
+ \ctxlua{joblists.process('#1',{ criterium = "\sortingparameter\c!criterium" })}%
+ \stoppacked
+ \endgroup}
+
+\def\completelistofsorts
+ {\dodoubleemptydocompletelistofsorts}
+
+\def\docompletelistofsorts[#1][#2]%
+ {\normalexpanded{\systemsuppliedchapter[#1]{\noexpand\headtext{#2}}}%
+ \doplacelistofsorts[#1][#2]%
+ \page[\v!yes]}
+
+\let\startsortingoutput \relax
+\let\stopsortingoutput \relax
+\let\startsortingsection\gobbleoneargument
+\let\stopsortingsection \relax
+
+\def\sortingentry#1#2#3#4% #4 is meaning but empty here
+ {\doifelsenothing{\sortingparameter\c!command}
+ {\begingroup\dosetsortingattributes\c!style\c!color#3\endgroup\par} % todo
+ {\sortingparameter\c!command{#1}{#2}{#3}}}
+
+%D Here we define a support macro that can sort simple comma
+%D separated lists. It's a multi-list variant of a prototype
+%D written by Taco.
+
+% \def\mkloadsortedlist#1% class
+% {\bgroup
+% \getvalue{\s!set#1}%
+% \ctxlua{joblists.process('#1')}%
+% \getvalue{\s!reset#1}%
+% \egroup}
+
+% \def\processlistofsorts[#1]%
+% {\mkloadsortedlist{#1}}
+
+% \newcounter\nofsortedalphalists
+
+% \def\sortalphacommacommand#1%
+% {\begingroup
+% \doglobal\increment\nofsortedalphalists
+% \edef\currentsortedalphalist{alpha:\nofsortedalphalists}%
+% \definesorting[\currentsortedalphalist][\currentsortedalphalist]%
+% \processcommacommand[#1]{\getvalue\currentsortedalphalist}%
+% \global\let\sortedcommalist\empty
+% \def\makesortedlist##1{\doglobal\appendtocommalist{##1}\sortedcommalist}%
+% \setupsorting[\currentsortedalphalist][\c!criterium=\v!all,\c!command=\makesortedlist]%
+% \processlistofsorts[\currentsortedalphalist]%
+% \endgroup
+% \dodoglobal\let#1\sortedcommalist}
+
+% \starttext
+% \def\whatever{a,b,q,d,r,f} \sortalphacommacommand\whatever \whatever \endgraf
+% \def\whatever{ax,bx,qx,dx,rx,fx} \sortalphacommacommand\whatever \whatever \endgraf
+% \stoptext
+
+%D Presets.
+
+\definesynonyms
+ [\v!abbreviation]
+ [\v!abbreviations]
+ [\infull]
+
+\setupsynonyms
+ [\v!abbreviation]
+ [\c!textstyle=\v!capital]
+
+\definesorting
+ [\v!logo]
+ [\v!logos]
+ % no [\logogram]
+
+\definesynonyms
+ [\v!unit]
+ [\v!units]
+ [\unitmeaning]
+
+% \setupsynonyms
+% [\v!unit]
+% [\c!textstyle=\dimension]
+
+\setupsynonyms
+ [\v!unit]
+ [\c!synonymcommand=\dimension]
+
+\protect \endinput
diff --git a/tex/context/base/strc-xml.mkiv b/tex/context/base/strc-xml.mkiv
new file mode 100644
index 000000000..7a0099585
--- /dev/null
+++ b/tex/context/base/strc-xml.mkiv
@@ -0,0 +1,144 @@
+%D \module
+%D [ file=strc-xml,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=XML Processing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / 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.
+
+\writestatus{loading}{ConTeXt Structure Macros / XML Processing}
+
+\unprotect
+
+\startxmlsetups xml:ctx:internal:setup
+ \xmlsetsetup{\xmldocument}{ctx:genericentry} {xml:ctx:genericentry}
+ \xmlsetsetup{\xmldocument}{ctx:sectionentry} {xml:ctx:sectionentry}
+ \xmlsetsetup{\xmldocument}{ctx:registerentry}{xml:ctx:registerentry}
+\stopxmlsetups
+
+\xmlregistersetup{xml:ctx:internal:setup}
+
+\startxmlsetups xml:ctx:genericentry
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:ctx:sectionentry
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:ctx:registerentry
+ \xmlflush{#1}
+\stopxmlsetups
+
+\protect \endinput
+
+% test.xml
+
+<?xml version='1.0' standalone='yes?>
+
+<document>
+ <section>
+ <title>Some <b>bold</b> title <b>bold <i>bold</i> oeps</b> and more</title>
+ <content>
+ <p>a paragraph of text</p>
+ <p>another paragraph of text</p>
+ </content>
+ </section>
+ <section>
+ <title>Another <b>bold</b> title <b>bold <i>bold</i> oeps</b> and more</title>
+ <content>
+ <p>a paragraph of text</p>
+ <p>another paragraph of text</p>
+ </content>
+ </section>
+</document>
+
+% test.tex
+
+\setupstructurehead[chapter][expansion=xml]
+
+\startxmlsetups xml:demo:define:base
+ \xmlsetsetup{demo}{document|section|p|b|i}{xml:demo:*}
+\stopxmlsetups
+
+\xmlregisterdocumentsetup{demo}{xml:demo:define:base}
+
+\startxmlsetups xml:demo:document
+ \title{Contents}
+ \placelist[chapter]
+ \page
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:demo:section
+ \chapter{\xmltext{#1}{/title}}
+ \xmlfirst{#1}{/content}
+\stopxmlsetups
+
+\startxmlsetups xml:demo:p
+ \xmlflush{#1}\endgraf
+\stopxmlsetups
+
+\startxmlsetups xml:demo:b
+ \bgroup\bf\xmlflush{#1}\egroup
+\stopxmlsetups
+
+\startxmlsetups xml:demo:i
+ \bgroup\it\xmlflush{#1}\egroup
+\stopxmlsetups
+
+\starttext
+ \xmlprocessfile{demo}{oeps.xml}{}
+\stoptext
+
+% example by thomas:
+
+\startbuffer[test]
+<auth>
+ <section>
+ <title><emph>MyTitle</emph></title>
+ <content>
+ Hello world
+ </content>
+ </section>
+</auth>
+\stopbuffer
+
+\startxmlsetups xml:mysetups
+ \xmlsetsetup{\xmldocument}{auth|section|title|content|emph}{xml:*}
+\stopxmlsetups
+
+\xmlregistersetup{xml:mysetups}
+
+\startxmlsetups xml:auth
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:section
+ \xmlflush{#1}\par \midaligned{\hl[5]}
+\stopxmlsetups
+
+\startxmlsetups xml:title
+ \section{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:content
+ \xmlflush{#1}\par
+\stopxmlsetups
+
+\startxmlsetups xml:emph
+ {\bgroup\em \xmlflush{#1}\egroup}
+\stopxmlsetups
+
+\setuphead
+ [section]
+ [style=normal,number=no,expansion=yes,page=yes]
+
+\starttext
+ \xmlprocessbuffer{main}{test}{}
+\stoptext
diff --git a/tex/context/base/supp-ali.tex b/tex/context/base/supp-ali.tex
new file mode 100644
index 000000000..8727efbb2
--- /dev/null
+++ b/tex/context/base/supp-ali.tex
@@ -0,0 +1,173 @@
+%D \module
+%D [ file=supp-ali,
+%D version=2000.04.17,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Alignment,
+%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 Yet undocumented.
+
+% 0 = centered
+% 1 = left in before
+% 2 = right in before
+% 3 = left in after
+% 4 = right in after
+
+\unprotect
+
+% \starttabulate[|cg{.}|cg{,}|cg{,}|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10\\ \NG 10\\ \NG 0,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+
+\chardef\characteralignmentmode=4
+\chardef\characteralignmentslot=1
+
+\newtoks\@@characteralignlst
+
+\let\afterassignwidth \!!zeropoint
+\let\beforeassignwidth\!!zeropoint
+
+\def\alignmentcharacter{.}
+
+\let\alignmentclass\s!default % can be used to handle multiple mixed ones
+
+\def\setfirstpasscharacteralign
+ {\popcharacteralign
+ \expanded{\dosetfirstpasscharacteralign{\alignmentcharacter}}}
+
+\def\dosetfirstpasscharacteralign#1%
+ {\def\checkalignment##1%
+ {\popcharacteralign
+ \let\\\empty
+ \setbox\scratchbox\hbox{#1}%
+ \edef\characterassignwidth{\the\wd\scratchbox}%
+ \setbox\scratchbox\null
+ \docheckalignment##1#1\relax\relax
+ \scratchdimen-\wd\scratchbox
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \advance\scratchdimen \wd\scratchbox
+ \ifdim\scratchdimen>\beforeassignwidth\relax
+ \edef\beforeassignwidth{\the\scratchdimen}%
+ \fi
+ \ifdim\scratchdimen=\zeropoint
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \scratchdimen\wd\scratchbox
+ \ifcase\characteralignmentmode
+ % do nothing
+ \else\ifnum\characteralignmentmode<\plusthree
+ \advance\scratchdimen \characterassignwidth
+ \ifdim\scratchdimen>\beforeassignwidth\relax
+ \edef\beforeassignwidth{\the\scratchdimen}%
+ \fi
+ \else
+ \ifdim\scratchdimen>\afterassignwidth\relax
+ \edef\afterassignwidth{\the\scratchdimen}%
+ \fi
+ \fi\fi
+ \fi
+ \pushcharacteralign}%
+ \def\docheckalignment##1#1##2##3\relax
+ {\ifx##2\relax
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \ifdim\wd\scratchbox>\afterassignwidth
+ \edef\afterassignwidth{\the\wd\scratchbox}%
+ \fi
+ \else
+ \docheckalignment##2##3\relax\relax
+ \fi}}
+
+\def\setsecondpasscharacteralign
+ {\popcharacteralign
+ \expanded{\dosetsecondpasscharacteralign{\alignmentcharacter}}}
+
+\def\dosetsecondpasscharacteralign#1%
+ {\def\checkalignment##1%
+ {\popcharacteralign
+ \let\\\empty % beware, no grouping
+ \setbox\scratchbox\hbox{#1}%
+ \edef\characterassignwidth{\the\wd\scratchbox}%
+ \setbox\scratchbox\null
+ % new 12,34 vs 10\\ where 10 aligns on 12 if #1 = ,
+ \ifcase\characteralignmentslot
+ \docheckalignment##1#1\relax\relax
+ \scratchdimen\wd\scratchbox
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \else
+ \def\\{#1}%
+ \expanded{\docheckalignment##1#1\relax\relax}%
+ \scratchdimen\wd\scratchbox
+ \setbox\scratchbox\hbox{\def\\{\hphantom{#1}}\ignorespaces##1\unskip}%
+ \fi
+ \noindent
+ \ifdim\scratchdimen=\wd\scratchbox
+ \ifcase\characteralignmentmode
+ \box\scratchbox
+ \else
+ \hbox
+ {\dontcomplain
+ \hbox to \beforeassignwidth
+ {\ifcase\characteralignmentmode\or
+ \box\scratchbox\hss
+ \or
+ \hss\box\scratchbox\hskip\characterassignwidth
+ \or
+ \hss\rlap{\box\scratchbox}%
+ \or
+ \hss\rlap{\hbox to \afterassignwidth{\hss\box\scratchbox}}%
+ \fi}%
+ \hskip\afterassignwidth}%
+ \fi
+ \else
+ \hbox
+ {\hbox to \beforeassignwidth
+ {\hss\box\scratchbox\hskip-\scratchdimen}%
+ \hskip\afterassignwidth}%
+ \fi}%
+ \def\docheckalignment##1#1##2##3\relax
+ {\ifx##2\relax
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \else
+ \docheckalignment##2##3\relax\relax
+ \fi}}
+
+% provide a means to use multiple alignments mixed
+
+\def\pushcharacteralign
+ {\ifundefined{@cac@\alignmentclass}%
+ \doglobal\appendetoks\noexpand\do{\alignmentclass}\to\@@characteralignlst
+ \fi
+ \setxvalue{@cac@\alignmentclass}{\noexpand\do
+ {\afterassignwidth}{\beforeassignwidth}{\alignmentcharacter}}}
+
+\def\popcharacteralign
+ {\def\do##1##2##3%
+ {\def\afterassignwidth {##1}%
+ \def\beforeassignwidth {##2}%
+ \def\alignmentcharacter{##3}}%
+ \executeifdefined{@cac@\alignmentclass}\donothing}
+
+\def\resetcharacteralign % does not work well nested
+ {\def\do##1{\global\letbeundefined{@cac@##1}}% global !
+ \the\@@characteralignlst
+ \global\@@characteralignlst\emptytoks}
+
+\long\def\startcharacteralign#1\stopcharacteralign
+ {\bgroup
+ \setfirstpasscharacteralign #1%
+ \setsecondpasscharacteralign#1%
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/supp-box.tex b/tex/context/base/supp-box.tex
new file mode 100644
index 000000000..4c398973e
--- /dev/null
+++ b/tex/context/base/supp-box.tex
@@ -0,0 +1,3126 @@
+%D \module
+%D [ file=supp-box,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Boxes,
+%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 some box manipulation macros. Some
+%D are quite simple, some are more advanced and when understood
+%D well, all can be of use.
+
+%D No longer generic, why bother.
+
+\writestatus{loading}{ConTeXt Support Macros / Boxes}
+
+\unprotect
+
+%D \macros
+%D {strutdp,strutht,strutwd}
+%D
+%D The next shortcuts save memory and keying. The width is
+%D normally zero points (if not, you're in trouble). These
+%D shortcuts can be used like a dimension, opposite to the
+%D core macros \type {\strutdepth} and alike, which are
+%D values.
+
+\def\strutdp{\dp\strutbox}
+\def\strutht{\ht\strutbox}
+\def\strutwd{\wd\strutbox}
+
+%D \macros
+%D {resetbox, emptybox}
+%D
+%D Let's start with an easy one. The next macro hides the
+%D ugly \type {@} in \type {\voidb@x}.
+
+\ifx\voidbox\undefined \newbox\voidbox \fi
+\ifx\voidb@x\undefined \let\voidb@x\voidbox \fi
+
+\def\emptybox {\box \voidbox}
+\def\unvoidbox {\unhbox\voidbox}
+\def\resetbox#1{\setbox#1\box\voidbox}
+
+%D \macros
+%D {nextdepth}
+%D
+%D Let's start with a rather simple declaration. Sometimes we
+%D need to save the \TEX\ \DIMENSION\ \type{\prevdepth} and
+%D append it later on. The name \type{\nextdepth} suits
+%D this purpose well.
+
+\newdimen\nextdepth
+
+%D \macros
+%D {smashbox, smashedbox}
+%D
+%D Smashing is introduced in \PLAIN\ \TEX, and stands for
+%D reducing the dimensions of a box to zero. The most resolute
+%D one is presented first.
+
+\def\smashbox#1%
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint}
+
+\def\smashboxed#1%
+ {\smashbox{#1}%
+ \box#1\relax}
+
+%D \macros
+%D {hsmashbox,vsmashbox}
+%D
+%D Smashing can be used for overlaying boxes. Depending on
+%D the mode, horizontal or vertical, one can use:
+
+\def\hsmashbox#1%
+ {\wd#1\zeropoint}
+
+\def\vsmashbox#1%
+ {\ht#1\zeropoint
+ \dp#1\zeropoint}
+
+%D The next implementation is less sensitive for spurious
+%D spaces.
+
+\newcount\registercount
+
+\def\smashbox
+ {\afterassignment\dosmashbox\registercount}
+
+\def\dosmashbox
+ {\wd\registercount\zeropoint
+ \ht\registercount\zeropoint
+ \dp\registercount\zeropoint}
+
+\def\smashedbox
+ {\afterassignment\thesmashedbox\registercount}
+
+\def\thesmashedbox
+ {\dosmashbox
+ \box\registercount}
+
+\def\hsmashbox
+ {\afterassignment\dohsmashbox\registercount}
+
+\def\dohsmashbox
+ {\wd\registercount\zeropoint}
+
+\def\vsmashbox
+ {\afterassignment\dovsmashbox\registercount}
+
+\def\dovsmashbox
+ {\ht\registercount\zeropoint
+ \dp\registercount\zeropoint}
+
+%D \macros
+%D {hsmash,vsmash,
+%D hsmashed,vsmashed}
+%D
+%D While the previous macros expected a \BOX, the next act on a
+%D content. They are some subtle differences betreen the smash
+%D and smashed alternatives. The later ones reduce all
+%D dimensions to zero.
+
+% Ok, but inefficient and/or catcode unsafe:
+%
+% \def\hsmash #1{\bgroup\setbox0=\normalhbox{#1}\hsmashbox0\box0\egroup}
+% \def\vsmash #1{\bgroup\setbox0=\normalvbox{#1}\vsmashbox0\box0\egroup}
+% \def\hsmashed#1{\bgroup\setbox0=\normalhbox{#1}\smashbox 0\box0\egroup}
+% \def\vsmashed#1{\bgroup\setbox0=\normalvbox{#1}\smashbox 0\box0\egroup}
+%
+% Better, but a waste of tokens:
+%
+% \def\hsmash {\bgroup\dowithnextbox{\hsmashbox\nextbox\flushnextbox\egroup}\normalhbox}
+% \def\vsmash {\bgroup\dowithnextbox{\vsmashbox\nextbox\flushnextbox\nextbox\egroup}\normalvbox}
+% \def\hsmashed{\bgroup\dowithnextbox{\smashbox \nextbox\flushnextbox\nextbox\egroup}\normalhbox}
+% \def\vsmashed{\bgroup\dowithnextbox{\smashbox \nextbox\flushnextbox\nextbox\egroup}\normalvbox}
+%
+% The best:
+
+\def\dosomesmash#1% (begin|end)group ipv (b|e)group ?
+ {\bgroup\dowithnextbox{#1\nextbox\flushnextbox\egroup}}
+
+\def\hsmash {\dosomesmash\hsmashbox\normalhbox}
+\def\vsmash {\dosomesmash\vsmashbox\normalvbox}
+\def\hsmashed{\dosomesmash\smashbox \normalhbox}
+\def\vsmashed{\dosomesmash\smashbox \normalvbox}
+
+%D \macros
+%D {smashedhbox,smashedvbox}
+%D
+%D Also handy (all dimensions zeroed):
+%D
+%D \starttyping
+%D \smashedhbox to ... {...}
+%D \smashedvbox to ... {...}
+%D \stoptyping
+
+\def\dosmashedbox#1%
+ %{#1\bgroup\dowithnextbox{\smashbox\nextbox\flushnextbox\egroup}#1}
+ {#1\bgroup\dowithnextbox{\smashedbox\nextbox\egroup}#1}
+
+\def\smashedhbox{\dosmashedbox\hbox}
+\def\smashedvbox{\dosmashedbox\vbox}
+
+%D \macros
+%D {smash}
+%D
+%D This smash alternative takes an optional arg [whdtb] as
+%D well as is potentially catcode safer. It is needed by the
+%D math module (although the \type {\leavevmode} is not added
+%D here).
+
+\def\smash
+ {\futurelet\nexttoken\dosmash}
+
+\def\dosmash
+ {\ifx\nexttoken[\@EA\dodosmash\else\@EA\donosmash\fi}
+
+\def\donosmash
+ {\dodosmash[hd]}
+
+\def\dodosmash[#1]%
+ {\edef\@@smash{#1}\futurelet\nexttoken\dododosmash}
+
+\def\dododosmash % if needed we can avoid the \next
+ {\ifmmode
+ \def\next##1{\mathpalette\mathsm@sh{##1}}%
+ \else\ifx\nexttoken\bgroup
+ \let\next\finsm@sh
+ \else
+ \def\next##1{\finsm@sh{##1}}%
+ \fi\fi
+ \next}
+
+\def\mathsm@sh#1#2% redefined plain macro
+ {\finsm@sh{$\mathsurround\zeropoint#1{#2}$}}
+
+\def\makesm@sh#1% redefined plain macro (handles t b h d w)
+ {\if#1w\nextboxwd\zeropoint\else
+ \if#1h\nextboxht\zeropoint\else
+ \if#1d\nextboxdp\zeropoint\else
+ \if#1t\nextboxht\zeropoint\else
+ \if#1b\nextboxdp\zeropoint\fi\fi\fi\fi\fi}
+
+\def\finsm@sh % redefined plain macro
+ {\dowithnextbox{\@EA\handletokens\@@smash\with\makesm@sh\flushnextbox}\normalhbox}
+
+%D \starttabulate[|l|l|]
+%D \NC w \NC \ruledhbox{\smash [w]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC h \NC \ruledhbox{\smash [h]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC d \NC \ruledhbox{\smash [d]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC tb \NC \ruledhbox{\smash [tb]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC whd \NC \ruledhbox{\smash[whd]{This is some great smashing, isn't it?}} \NC \NR
+%D \stoptabulate
+
+%D \macros
+%D {phantom, hphantom, vphantom, mathstrut}
+%D
+%D The next implementation of \type {\phantom} cum suis does
+%D not grab an argument in the non||math case, which is better.
+
+\unexpanded\def\phantom {\ph@nt\nextbox\nextbox\nextbox}
+\unexpanded\def\vphantom{\ph@nt\nextbox\nextbox\voidbox}
+\unexpanded\def\hphantom{\ph@nt\voidbox\voidbox\nextbox}
+
+%D Due to a complicated call to \type {\mathpallete} and
+%D thereby \type {\mathchoice}, the next macro looks ugly.
+%D We also take care of non||braced arguments.
+
+\def\ph@nt#1#2#3%
+ {\def\doph@nt
+ {\ifmmode
+ \def\mathph@nt####1####2{\makeph@nt#1#2#3{$\mathsurround\zeropoint####1{####2}$}}%
+ \def\nextph@nt{\mathpalette\mathph@nt}%
+ \else\ifx\nextph@nt\bgroup
+ \def\nextph@nt{\makeph@nt#1#2#3}%
+ \else
+ \def\nextph@nt####1{\makeph@nt#1#2#3{####1}}%
+ \fi\fi
+ \nextph@nt}%
+ \futurelet\nextph@nt\doph@nt}
+
+\def\makeph@nt#1#2#3%
+ {\begingroup
+ \dowithnextbox
+ {\setbox\scratchbox\null
+ \ht\scratchbox\ht#1%
+ \dp\scratchbox\dp#2%
+ \wd\scratchbox\wd#3%
+ \box\scratchbox
+ \endgroup}
+ \normalhbox}
+
+\let\finph@nt\undefined
+
+%D We also define plain's \type {\mathstrut}.
+
+\unexpanded\def\mathstrut{\vphantom{(}}
+
+%D \macros
+%D {getboxheight}
+%D
+%D Although often needed, \TEX\ does not support arithmics
+%D like:
+%D
+%D \starttyping
+%D \dimen0 = \ht0 + \dp0
+%D \stoptyping
+%D
+%D so we implemented:
+%D
+%D \starttyping
+%D \getboxheight ... \of \box...
+%D \stoptyping
+%D
+%D For instance,
+%D
+%D \starttyping
+%D \getboxheight \dimen0 \of \box0
+%D \getboxheight \someheight \of \box \tempbox
+%D \stoptyping
+%D
+%D The implementation is rather stupid:
+%D
+%D \starttyping
+%D \def\getboxheight#1\of#2\box#3%
+%D {#1\ht#3\advance#1\dp#3\relax}
+%D \stoptyping
+%D
+%D The next alternative is slightly more clever, since
+%D it accepts \type {{12}} as well as \type {12} as box
+%D number.
+
+\def\getboxheight#1\of#2\box#3%
+ {\def\next{#1\dimexpr\ht\registercount+\dp\registercount\relax}%
+ \afterassignment\next\registercount=#3}
+
+%D For a long time the following three macros were part of
+%D the grid snapping core module, but it makes more sense to
+%D have them here so that users can see them.
+%D
+%D \macros
+%D {getnoflines, getroundednoflines, getrawnoflines}
+%D
+%D Het commando \type{\getnoflines} converteert een hoogte
+%D (dimensie) in een aantal regels en kent dit toe aan
+%D \type{\noflines}.
+%D
+%D \starttyping
+%D \getnoflines{dimensie}
+%D \stoptyping
+%D
+%D Er wordt gedeeld door \type{\openlineheight} en een hoogte
+%D van~0pt komt overeen met 0~regels. The raw alternative
+%D does not round.
+
+%D For a long time we had:
+%D
+%D \starttyping
+%D \newcount\noflines
+%D \newdimen\noflinesheight
+%D
+%D \def\dogetnoflines#1#2%
+%D {\noflinesheight#2\relax
+%D \ifzeropt\noflinesheight % \ifdim\noflinesheight=\zeropoint
+%D \noflines\zerocount
+%D \else
+%D \divide\noflinesheight \openlineheight
+%D \noflines\noflinesheight
+%D #1\ifdim\noflines\openlineheight=#2\relax \else
+%D \advance\noflines\ifdim#2>\zeropoint\plusone\else\minusone\fi
+%D \fi\fi
+%D \fi}
+%D
+%D \def\getnoflines {\dogetnoflines\iftrue } % compensated
+%D \def\getrawnoflines{\dogetnoflines\iffalse} % no compensation
+%D \stoptyping
+%D
+%D A more recent variant is:
+
+\ifx\roundingeps\undefined \newdimen\roundingeps \roundingeps=10sp \fi
+
+\newcount\noflines
+\newdimen\noflinesheight
+
+% \def\getnoflines {\xdogetnoflines\plusone } % compensated
+% \def\getroundednoflines{\xdogetnoflines\plustwo } % rounded
+% \def\getrawnoflines {\xdogetnoflines\plusthree} % truncated
+%
+% \def\xdogetnoflines#1#2%
+% {\noflinesheight#2\relax
+% \ifzeropt\noflinesheight
+% \noflines\zerocount
+% \else\ifdim\noflinesheight>\zeropoint
+% \ifcase#1\or
+% \advance\noflinesheight-\roundingeps
+% \divide\noflinesheight\openlineheight
+% \noflines\noflinesheight
+% \advance\noflines\plusone
+% \or
+% \advance\noflinesheight\roundingeps
+% \divide\noflinesheight\openlineheight
+% \noflines\noflinesheight
+% \or
+% \advance\noflinesheight\roundingeps
+% \advance\noflinesheight.5\openlineheight
+% \divide\noflinesheight\openlineheight
+% \noflines\noflinesheight
+% \fi
+% \else
+% \ifcase#1\or
+% \advance\noflinesheight\roundingeps
+% \divide\noflinesheight\openlineheight
+% \noflines\noflinesheight
+% \advance\noflines\minusone
+% \or
+% \advance\noflinesheight-\roundingeps
+% \divide\noflinesheight\openlineheight
+% \noflines\noflinesheight
+% \or
+% \advance\noflinesheight-\roundingeps
+% \advance\noflinesheight-.5\openlineheight
+% \divide\noflinesheight\openlineheight
+% \noflines\noflinesheight
+% \fi
+% \fi\fi}
+
+\def\getnoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \else\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight-\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \advance\noflines\plusone
+ \else
+ \advance\noflinesheight\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \advance\noflines\minusone
+ \fi\fi}
+
+\def\getroundednoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \else\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \else
+ \advance\noflinesheight-\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \fi\fi}
+
+\def\getrawnoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \else\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight\roundingeps
+ \advance\noflinesheight.5\openlineheight
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \else
+ \advance\noflinesheight-\roundingeps
+ \advance\noflinesheight-.5\openlineheight
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \fi\fi}
+
+%D Let's proof that it works:
+%D
+%D \startbuffer
+%D \scratchdimen\dimexpr(3pt) \getnoflines\scratchdimen 1=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.1\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.5\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.9\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3pt) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3sp) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight-3sp) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D
+%D \scratchdimen\dimexpr(3pt) \getrawnoflines\scratchdimen 0=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.1\lineheight) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.5\lineheight) \getrawnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.9\lineheight) \getrawnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3pt) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3sp) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight-3sp) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {determinenoflines}
+%D
+%D The next macro determines the number of lines and
+%D returns it it \type {\noflines}. The macro works
+%D reasonable well as long as the content can be unboxed.
+%D
+%D \starttyping
+%D \determinenoflines{test\\test}
+%D \determinenoflines{\bfd test\\test}
+%D \determinenoflines{\definedfont[Sans at 40pt]test\\test}
+%D \stoptyping
+
+\def\determinenoflines % can be mkiv'd
+ {\bgroup
+ \forgetall
+ \let\crlf\endgraf
+ \let\\\endgraf
+ \dowithnextbox
+ {\beginofshapebox
+ \unvbox\nextbox
+ \endofshapebox
+ % \global\count1\zerocount
+ % \reshapebox{\global\advance\count1\plusone}%
+ % \egroup\noflines\count1 }%
+ \scratchcounter\zerocount
+ \reshapebox{\global\advance\scratchcounter\plusone}%
+ \expandafter\egroup\expandafter\noflines\the\scratchcounter\relax
+ }\vbox}
+
+%D \macros
+%D {doiftextelse, doiftext}
+%D
+%D When \type {\doifelse} cum suis hopelessly fail, for
+%D instance because we pass data, we can fall back on the next
+%D macro:
+%D
+%D \starttyping
+%D \doiftextelse {data} {then branch} {else branch}
+%D \doiftext {data} {then branch}
+%D \stoptyping
+
+\newif\iftrialtypesetting
+
+\def\doiftextelse#1%
+ {\bgroup
+ \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox
+ \egroup\@EA\secondoftwoarguments
+ \else
+ \egroup\@EA\firstoftwoarguments
+ \fi}
+
+\def\doiftext#1#2%
+ {\doiftextelse{#1}{#2}\donothing}
+
+%D \macros
+%D {dowithnextbox,nextbox}
+%D
+%D Sometimes we want a macro to grab a box and do something
+%D on the content. One could pass an argument to a box, but
+%D this can violate the specific \CATCODES\ of its content and
+%D leads to unexpected results. The next macro treats the
+%D following braced text as the content of a box and
+%D manipulates it afterwards in a predefined way.
+%D
+%D The first argument specifies what to do with the content.
+%D This content is available in \type{\nextbox}. The second
+%D argument is one of \type{\hbox}, \type{\vbox} or
+%D \type{\vtop}. The third argument must be grouped with
+%D \type{\bgroup} and \type{\egroup}, \type{{...}} or can be
+%D a \type{\box} specification.
+%D
+%D In \CONTEXT\ this macro is used for picking up a box and
+%D treating it according to earlier specifications. We use for
+%D instance something like:
+%D
+%D \starttyping
+%D \def\getfloat%
+%D {\def\handlefloat{...\flushnextbox...}
+%D \dowithnextbox\handlefloat\normalvbox}
+%D \stoptyping
+%D
+%D instead of:
+%D
+%D \starttyping
+%D \def\getfloat#1%
+%D {...#1...}
+%D \stoptyping
+%D
+%D In this implementation the \type{\aftergroup} construction
+%D is needed because \type{\afterassignment} is executed inside
+%D the box.
+
+\ifx\nextbox\undefined \newbox\nextbox \fi
+
+\long\def\dowithnextbox#1%
+ {\long\def\dodowithnextbox{#1}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+\def\dododowithnextbox
+ {\aftergroup\dodowithnextbox}
+
+\long\def\dowithnextboxcs#1%
+ {\let\dodowithnextbox#1%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+\def\dododowithnextbox
+ {\aftergroup\dodowithnextbox}
+
+%D So in fact we get:
+%D
+%D \starttyping
+%D \setbox\nextbox { \aftergroup\dodowithnextbox ... }
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D \setbox\nextbox { ... } \dodowithnextbox
+%D \stoptyping
+%D
+%D A slower but more versatile implementation is:
+%D
+%D \starttyping
+%D \long\def\dowithnextbox#1#2%
+%D {\long\def\dodowithnextbox{#1}%
+%D \ifx#2\normalhbox
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\normalvbox
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\normalvtop
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\normalvcenter
+%D \afterassignment\dododowithnextbox
+%D \else
+%D \afterassignment\dodowithnextbox
+%D \fi\fi\fi\fi
+%D \setbox\nextbox#2}
+%D \stoptyping
+%D
+%D This alternative also accepts \type{\box0} and alike, but
+%D we don't really need this functionality now.
+
+%D \macros
+%D {nextboxht,nextboxwd,nextboxdp,flushnextbox}
+%D
+%D The next couple of shortcuts saves us memory as well as
+%D \type {{}}'s in passing parameters.
+
+\def\nextboxht{\ht\nextbox}
+\def\nextboxwd{\wd\nextbox}
+\def\nextboxdp{\dp\nextbox}
+
+\def\flushnextbox{\box\nextbox}
+
+%D \macros
+%D {dowithnextboxcontent}
+%D
+%D But, occasionally we do need to pass some local settings
+%D without wanting to use additional grouping. Therefore we
+%D provide:
+%D
+%D \starttyping
+%D \dowithnextboxcontent{inside}{after}{box content}
+%D \stoptyping
+%D
+%D {\em todo: Search source for potential usage!}
+
+\long\def\dowithnextboxcontent#1#2% inside, after
+ {\long\def\dodowithnextbox{#2}%
+ \def\dododowithnextbox{#1\aftergroup\dodowithnextbox}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+%D Now we can redefine \type {\dowithnextbox} as follows:
+%D
+%D \starttyping
+%D \def\dowithnextbox{\dowithnextboxcontent\empty}
+%D \stoptyping
+%D
+%D But since this macro is used often and since this implementation
+%D is slower, we will not use that definition.
+
+% maybe:
+%
+% depending on the size of the action, about 10% faster
+%
+% \newtoks\nextboxtoks
+%
+% \def\dowithnextbox {\afterassignment\redowithnextbox\nextboxtoks}
+% \def\redowithnextbox {\afterassignment\dododowithnextbox\setbox\nextbox}
+% \def\dododowithnextbox{\aftergroup\dodowithnextbox}
+% \def\dodowithnextbox {\the\nextboxtoks}
+%
+% \long\def\dowithnextboxcontent#1% #2% inside, after
+% {\def\dododowithnextbox{#1\aftergroup\dodowithnextbox}%
+% \afterassignment\redowithnextboxcontent\nextboxtoks}
+%
+% \def\redowithnextboxcontent
+% {\afterassignment\dododowithnextbox\setbox\nextbox}
+
+%D \macros
+%D {llap, rlap, tlap, blap, clap}
+%D
+%D Some well known friends, but we implement them our own
+%D way. We want the macros to work in both math and text mode.
+
+\def\dodorlap{\normalhbox to \zeropoint{\flushnextbox\normalhss}\endgroup}
+\def\dodollap{\normalhbox to \zeropoint{\normalhss\flushnextbox}\endgroup}
+\def\dodoclap{\normalhbox to \zeropoint{\normalhss\flushnextbox\normalhss}\endgroup}
+
+\def\dorlap{\begingroup\dowithnextboxcs\dodorlap\normalhbox}
+\def\dollap{\begingroup\dowithnextboxcs\dodollap\normalhbox}
+\def\doclap{\begingroup\dowithnextboxcs\dodoclap\normalhbox}
+
+\def\domathclap{\mathpalette\dodomathclap} \def\dodomathclap#1#2{\doclap{$\mathsurround\zeropoint#1#2$}}
+\def\domathllap{\mathpalette\dodomathllap} \def\dodomathllap#1#2{\dollap{$\mathsurround\zeropoint#1#2$}}
+\def\domathrlap{\mathpalette\dodomathrlap} \def\dodomathrlap#1#2{\dorlap{$\mathsurround\zeropoint#1#2$}}
+
+\unexpanded\def\rlap{\mathortext\domathrlap\dorlap}
+\unexpanded\def\llap{\mathortext\domathllap\dollap}
+\unexpanded\def\clap{\mathortext\domathclap\doclap}
+
+\def\dodotlap{\normalvbox to \zeropoint{\normalvss\flushnextbox}\endgroup}
+\def\dodoblap{\normalvbox to \zeropoint{\flushnextbox\normalvss}\endgroup}
+
+\def\tlap{\begingroup\dowithnextboxcs\dodotlap\normalvbox}
+\def\blap{\begingroup\dowithnextboxcs\dodoblap\normalvbox}
+
+%D \macros
+%D {beginofshapebox,
+%D reshapebox, doreshapebox,
+%D flushshapebox,
+%D innerflushshapebox,
+%D shapebox,
+%D ifreshapingbox}
+%D
+%D The next utility macro originates from some linenumbering
+%D mechanism. Due to \TEX's advanced way of typesetting
+%D paragraphs, it's not easy to do things on a line||by||line
+%D basis. This macro is able to reprocess a given box and can
+%D act upon its vertical boxed components, such as lines. The
+%D unwinding sequence in this macro is inspired by a \NTG\
+%D workshop of David Salomon in June 1992.
+%D
+%D First we have to grab the piece of text we want to act
+%D upon. This is done by means of the duo macros:
+%D
+%D \starttyping
+%D \beginofshapebox
+%D a piece of text
+%D \endofshapebox
+%D \stoptyping
+%D
+%D When all texts is collected, we can call \type{\reshapebox}
+%D and do something with it's vertical components. We can make
+%D as much passes as needed. When we're done, the box can be
+%D unloaded with \type{\flushshapebox}. The only condition in
+%D this scheme is that \type{\reshapebox} must somehow unload
+%D the \BOX\ \type{\shapebox}.
+%D
+%D An important aspect is that the content is unrolled
+%D bottom||up. The next example illustrates this maybe
+%D unexpected characteristic.
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \em \input tufte
+%D \endofshapebox
+%D
+%D \newcounter\LineNumber
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \normalhbox{\llap{\LineNumber\hskip2em}\box\shapebox}}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D As we can see, when some kind of numbering is done, we have
+%D to add a second pass.
+%D
+%D \startbuffer
+%D \newcounter\LineNumber
+%D \newcounter\NumberOfLines
+%D
+%D \reshapebox
+%D {\doglobal\increment\NumberOfLines
+%D \box\shapebox}
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \normalhbox
+%D {\llap{\LineNumber\ (\NumberOfLines)\hskip2em}%
+%D \box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D This example shows that the content of the box is still
+%D available after flushing. Another feature is that only the
+%D last reshaping counts. Multiple reshaping can be done by:
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \flushshapebox
+%D \endofshapebox
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \normalhbox{\llap{$\star$\hskip1em}\box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D The macros are surprisingly easy to follow and in fact
+%D introduce no new concepts. Nearly all books on \TEX\ show
+%D similar solutions for unwinding \BOXES.
+%D
+%D Some macros, like footnote ones, can be sensitive for
+%D reshaping, which can result in an endless loop. We
+%D therefore offer:
+%D
+%D \starttyping
+%D \ifreshapingbox
+%D \stoptyping
+%D
+%D Some \CONTEXT\ commands are protected this way. Anyhow,
+%D reshaping is aborted after 100 dead cycles.
+%D
+%D By the way, changing the height and depth of \BOX\
+%D \type{\shapebox} results in bad spacing. This means that
+%D for instance linenumbers etc. should be given zero height
+%D and depth before being lapped into the margin. The
+%D previous examples ignore this side effect, but beware!
+
+\newif \ifsomeshapeleft
+\newif \ifreshapingbox
+
+\newbox \shapebox
+\newcount \shapepenalty
+\newdimen \shapekern
+\newskip \shapeskip
+
+\newbox \newshapebox
+\newbox \oldshapebox
+
+\newcount \shapecounter
+
+\newevery \everyshapebox \relax
+
+\def\shapesignal{.12345678pt} % or 12345sp
+
+% todo: in etex lastnode
+
+\def\reshapebox#1%
+ {\doreshapebox
+ {#1}%
+ {\penalty\shapepenalty}%
+ {\kern \shapekern }%
+ {\vskip \shapeskip }}
+
+\newbox\tmpshapebox
+
+\newif\ifreshapingfailed % may save redundant runs
+
+\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+ {\global\reshapingfailedfalse
+ \ifzeropt\ht\oldshapebox % \ifdim\ht\oldshapebox=\zeropoint
+ \setbox\newshapebox\normalvbox{}%
+ \else
+ \setbox\newshapebox\normalvbox
+ {\unvcopy\oldshapebox
+ \resetbox\newshapebox
+ \shapecounter\zerocount
+ \doloop{\dodoreshapebox{#1}{#2}{#3}{#4}}}%
+ \setbox\newshapebox\box\tmpshapebox
+ \fi}
+
+\ifx\originalshapebox\undefined \let\originalshapebox\oldshapebox \fi
+
+% %D The old traditional tex variant:
+%
+% \def\insertshapesignal
+% {\normalhbox to \shapesignal{\strut\hss}% plus \strut
+% \prevdepth\strutdp} % never \nointerlineskip
+%
+% \def\restoreshapebox % compensates for the signal
+% {\global\setbox\tmpshapebox\vbox{\vskip-\lineheight\unvcopy\oldshapebox}}
+%
+% \def\shapeboxstrut % put this in front if needed !
+% {\vrule\!!width\zeropoint\!!height\ht\shapebox\!!depth\dp\shapebox}
+%
+% \def\dodoreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+% {\ifzeropt\lastskip % \ifdim\lastskip=\zeropoint\relax
+% \ifzeropt\lastkern % \ifdim\lastkern=\zeropoint\relax
+% \ifcase\lastpenalty % \ifnum\lastpenalty=\zerocount
+% \setbox\shapebox\lastbox
+% \ifvoid\shapebox
+% \unskip\unpenalty\unkern
+% \else
+% \ifdim\wd\shapebox=\shapesignal\relax
+% \exitloop
+% \else
+% \shapecounter\zerocount
+% \global\setbox\tmpshapebox\normalvbox{#1\unvbox\tmpshapebox}%
+% \fi
+% \fi
+% \else
+% \shapepenalty\lastpenalty
+% \global\setbox\tmpshapebox\normalvbox{#2\unvbox\tmpshapebox}%
+% \unpenalty
+% \fi
+% \else
+% \shapekern\lastkern
+% \global\setbox\tmpshapebox\normalvbox{#3\unvbox\tmpshapebox}%
+% \unkern
+% \fi
+% \else
+% \shapeskip\lastskip
+% \global\setbox\tmpshapebox\normalvbox{#4\unvbox\tmpshapebox}%
+% \unskip
+% \fi
+% \ifnum\shapecounter>100 % can be less
+% \global\reshapingfailedtrue
+% \message{!!forced exit from shapebox!!}%
+% \restoreshapebox
+% \exitloop
+% \else
+% \advance\shapecounter \plusone
+% \fi}
+%
+% But now that the lastnode bugfixes are wide spread we can use:
+%
+% We will turn this into a \MKIV\ variant.
+
+\def\insertshapesignal
+ {\normalhbox to \shapesignal{\strut\hss}% plus \strut
+ \prevdepth\strutdp} % never \nointerlineskip
+
+\def\restoreshapebox % compensates for the signal
+ {\global\setbox\tmpshapebox\vbox{\vskip-\lineheight\unvcopy\oldshapebox}}
+
+\def\dodoreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+ {\ifnum\lastnodetype=\@@gluenode
+ \shapeskip\lastskip
+ \global\setbox\tmpshapebox\normalvbox{#4\unvbox\tmpshapebox}%
+ \unskip
+ \else\ifnum\lastnodetype=\@@kernnode
+ \shapekern\lastkern
+ \global\setbox\tmpshapebox\normalvbox{#3\unvbox\tmpshapebox}%
+ \unkern
+ \else\ifnum\lastnodetype=\@@penaltynode
+ \shapepenalty\lastpenalty
+ \global\setbox\tmpshapebox\normalvbox{#2\unvbox\tmpshapebox}%
+ \unpenalty
+ \else\ifnum\lastnodetype<\zeropoint
+ \exitloop
+ \else
+ \setbox\shapebox\lastbox
+ \ifvoid\shapebox
+ \else\ifdim\wd\shapebox=\shapesignal\relax
+ \exitloop
+ \else
+ \shapecounter\zerocount
+ \global\setbox\tmpshapebox\normalvbox{#1\unvbox\tmpshapebox}%
+ \fi\fi
+ \fi\fi\fi\fi
+ \ifnum\shapecounter>100 % can be less
+ \global\reshapingfailedtrue
+ \message{!!forced exit from shapebox \the\lastnodetype !!}%
+ \restoreshapebox
+ \exitloop
+ \else
+ \advance\shapecounter \plusone
+ \fi}
+
+\def\beginofshapebox
+ {\setbox\oldshapebox\normalvbox
+ \bgroup
+ \reshapingboxtrue
+ \the\everyshapebox
+ \insertshapesignal}
+
+\def\endofshapebox
+ {\endgraf
+ \egroup}
+
+\let\beginshapebox\beginofshapebox
+\let\endshapebox \endofshapebox
+
+\def\flushshapebox
+ {\bgroup
+ \ifzeropt\ht\newshapebox % \ifdim\ht\newshapebox=\zeropoint
+ \else
+ % make \prevdepth legal
+ % \par before the next \vskip gives far worse results
+ \ifdim\parskip>\zeropoint\vskip\parskip\else\par\fi
+ % and take a look
+ \ifdim\prevdepth=-\thousandpoint
+ \prevdepth\zeropoint
+ \fi
+ \ifdim\prevdepth<\zeropoint\relax
+ % something like a line or a signal or ...
+ \donetrue
+ \else\ifinner
+ % not watertight and not ok
+ \donefalse
+ \else\ifdim\pagegoal=\maxdimen
+ \donetrue
+ \else
+ % give the previous line a normal depth
+ \donetrue
+ {\forgeteverypar\verticalstrut}\nobreak
+ \kern-\struttotal % geen \vskip
+ \kern-\parskip
+ % \vskip-\strutdp
+ \fi\fi\fi
+ \scratchdimen\dp\newshapebox
+ \unvbox\newshapebox
+ % \prevdepth=0pt and \dp\newshapebox depend on last line
+ \kern-\scratchdimen % ??
+ % now \prevdepth=0pt
+ \ifdone
+ \kern\strutdp
+ \prevdepth\strutdp
+ \fi
+ \fi
+ \egroup}
+
+%D In real inner situations we can use:
+%D
+%D \starttyping
+%D \flushinnershapebox
+%D \stoptyping
+%D
+%D This one is used in \type{\framed}.
+
+% The kern fails on for instance:
+%
+% \omlijnd[offset=0pt,hoogte=8mm,uitlijnen={rechts,laho}]{\bfa test}
+
+\def\innerflushshapebox
+ {\ifzeropt\ht\newshapebox \else
+ \unvcopy\newshapebox\relax % unvcopy ! else spacing problem
+ % \kern-\dp\newshapebox\relax
+ \fi}
+
+%D For absolute control, one can use \type{\doreshapebox}
+%D directly. This macro takes four arguments, that take care
+%D of:
+%D
+%D \startitemize[n,packed]
+%D \item \type{\shapebox}
+%D \item \type{\shapepenalty}
+%D \item \type{\shapekern}
+%D \item \type{\shapeskip}
+%D \stopitemize
+
+%D \macros
+%D {shapedhbox}
+%D
+%D When constructing a new box, using the content of \type
+%D {\shapebox}, one can best use \type {\shapedhbox} instead
+%D of \type {\normalhbox}, since it manages the height and depth of
+%D the line.
+
+% \def\shapedhbox
+% {\dowithnextbox
+% {\nextboxht\zeropoint
+% \nextboxdp\zeropoint
+% \flushnextbox}
+% \normalhbox}
+
+\def\shapedhbox % lines with non strutted dimensions have
+ {\expanded{\dowithnextbox % interlineskip so if we want the original
+ {\nextboxht\the\ht\shapebox % spacing, we need to preserve the original
+ \nextboxdp\the\dp\shapebox % height and depth which is definitely
+ \noexpand\flushnextbox}} % needed if we apply struts to the 'new'
+ \normalhbox} % box or do something that changed ist size
+
+%D \macros
+%D {hyphenatedword,
+%D hyphenatedpar,
+%D hyphenatedfile,
+%D dohyphenateword}
+%D
+%D The next one is a tricky one. \PLAIN\ \TEX\ provides
+%D \type{\showhyphens} for showing macros on the terminal. When
+%D preparing a long list of words we decided to show the
+%D hyphens, but had to find out that the \PLAIN\ alternative
+%D can hardly be used and|/|or adapted to typesetting. The next
+%D two macros do the job and a little more. First we define the
+%D (slightly adapted) plain variant:
+
+\def\showhyphens#1%
+ {\begingroup
+ \setbox\scratchbox\vbox
+ {\parfillskip\zerocount
+ \hsize\maxdimen
+ %\tenrm
+ \pretolerance\minusone
+ \tolerance\minusone
+ \hbadness\zerocount
+ \showboxdepth\zerocount
+ \ #1}%
+ \endgroup}
+
+%D The simple command \type{\hyphenatedword} accepts one
+%D argument and gives the hyphenated word. This macro calls for
+%D
+%D \starttyping
+%D \dohyphenateword {n} {pre} {word}
+%D \stoptyping
+%D
+%D The next examples tell more than lots of words:
+%D
+%D \startbuffer
+%D \dohyphenateword{0} {} {dohyphenatedword}
+%D \dohyphenateword{1} {...} {dohyphenatedword}
+%D \dohyphenateword{2} {...} {dohyphenatedword}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here, \type{\hyphenatedword{dohyphenatedword}} is the
+%D shorter alternative for the first line.
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D These macros are slow but effective and not that hard to
+%D program at all.
+
+\ifx\scantokens\undefined \let\scantokens\firstofoneargument \fi
+
+\def\dohyphenateword#1#2#3%
+ {\bgroup
+ \setbox\scratchbox\normalhbox
+ {\dontcomplain
+ \nopenalties % \widowpenalty \clubpenalty \brokenpenalty \doublehyphendemerits \finalhyphendemerits \adjdemerits
+ \hyphenpenalty \zerocount
+ \exhyphenpenalty\zerocount
+ \setbox0\normalvbox
+ {\hsize\zeropoint
+ \hskip\zeropoint\relax % really needed
+ \ifnum#1<\zeropoint
+ \obeyspaces
+ \obeylines
+ \def\obeyedspace{\hskip\zeropoint\hbox to \onepoint{}\hskip\zeropoint}%
+ \let\obeyedline \obeyedspace
+ \ifcase-#1\or
+ \def\next{#3\relax}\scantokens\expandafter{\next}% relax catches lookahead problem
+ % also ok: \scantokens{#3}% % as in \hyphenatedword{spanish|?|}
+ \or
+ \readfile{#3}\donothing\donothing
+ \else
+ #3%
+ \fi
+ \else
+ #3%
+ \fi}%
+ \ifnum#1>\zerocount
+ \dorecurse{#1}
+ {\setbox2\normalhbox
+ {\splittopskip\openstrutheight
+ \vsplit0 to \baselineskip}}%
+ #2%
+ \fi
+ \doloop
+ {\setbox2\normalhbox
+ {\splittopskip\openstrutheight
+ \vsplit0 to \baselineskip}%
+ \setbox2\normalhbox
+ {\unhbox2
+ \setbox2\lastbox
+ \normalvbox
+ {\unvbox2
+ \setbox2\lastbox
+ \normalhbox{\unhbox2}}}%
+ \ifnum#1<\zeropoint\ifdim\wd2=\onepoint\space\else\box2\allowbreak\fi\else\box2\fi
+ \ifzeropt\ht0 \exitloop\fi}% % \ifdim\ht0=\zeropoint\exitloop\fi}%
+ \removeunwantedspaces}%
+ \ifnum#1>\zerocount
+ \ht\scratchbox\strutht
+ \dp\scratchbox\strutdp
+ \box\scratchbox
+ \else
+ \unhbox\scratchbox
+ \fi
+ \egroup}
+
+\def\hyphenatedword{\dohyphenateword\zerocount\empty}
+\def\hyphenatedpar {\dohyphenateword\minusone \empty}
+\def\hyphenatedfile{\dohyphenateword{-2}\empty}
+
+%D You may want to give the following call a try:
+%D
+%D \starttyping
+%D \hyphenatedpar{\readfile{zapf}{}{}}\endgraf
+%D \stoptyping
+
+%D \macros
+%D {processtokens}
+%D
+%D We fully agree with (most) typographers that inter||letter
+%D spacing is only permitted in fancy titles, we provide a
+%D macro that can be used to do so. Because this is
+%D (definitely and fortunately) no feature of \TEX, we have to
+%D step through the token list ourselves.
+%D
+%D \starttyping
+%D \processtokens {before} {between} {after} {space} {tokens}
+%D \stoptyping
+%D
+%D An example of a call is:
+%D
+%D \startbuffer
+%D \processtokens {[} {+} {]} {\space} {hello world}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This results in:
+%D
+%D \getbuffer
+%D
+%D The list of tokens may contain spaces, while \type{\\},
+%D \type{{}} and \type{\ } are handled as space too.
+
+\def\dodoprocesstokens
+ {\ifx\nextprocessedtoken\lastcharacter
+ \after
+ \let\nextprocessedtoken\relax
+ \else\ifx\nextprocessedtoken\bgroup
+ \def\nextprocessedtoken
+ {\dowithnextbox
+ {\before{\copy\nextbox}% \before can use nextbox several times
+ \let\before\between
+ \doprocesstokens}
+ \hbox\bgroup}%
+ \else
+ \expandafter\if\space\nextprocessedtoken
+ \after\white
+ \let\before\savedbefore
+ \else
+ \before\nextprocessedtoken
+ \let\before\between
+ \fi
+ \let\nextprocessedtoken\doprocesstokens
+ \fi\fi
+ \nextprocessedtoken}
+
+\def\doprocesstokens% the space after = is essential
+ {\afterassignment\dodoprocesstokens\let\nextprocessedtoken= }
+
+\def\processtokens#1#2#3#4#5%
+ {\begingroup
+ \def\lastcharacter{\lastcharacter}%
+ \def\space{ }%
+ \let\\=\space
+ \def\before {#1}%
+ \def\between{#2}%
+ \def\after {#3}%
+ \def\white {#4}%
+ \let\savedbefore\before
+ \doprocesstokens#5\lastcharacter
+ \endgroup}
+
+%D \macros
+%D {doboundtext}
+%D
+%D Sometimes there is not enough room to show the complete
+%D (line of) text. In such a situation we can strip of some
+%D characters by using \type{\doboundtext}. When the text is
+%D wider than the given width, it's split and the third
+%D argument is appended. When the text to be checked is packed
+%D in a command, we'll have to use \type{\expandafter}.
+%D
+%D \starttyping
+%D \doboundtext{a very, probably to long, text}{3cm}{...}
+%D \stoptyping
+%D
+%D When calculating the room needed, we take the width of the
+%D third argument into account, which leads to a bit more
+%D complex macro than needed at first sight.
+
+% \def\dodoboundtext#1%
+% {\setbox0=\normalhbox{\unhcopy0 #1}%
+% \ifdim\wd0>\dimen0
+% \let\dodoboundtext=\gobbleoneargument
+% \else
+% #1\relax
+% \fi}
+%
+% \def\doboundtext#1#2#3%
+% {\normalhbox
+% {\setbox0=\normalhbox{#1}%
+% \dimen0=#2\relax
+% \ifdim\wd0>\dimen0
+% \setbox2=\normalhbox{#3}%
+% \advance\dimen0 by -\wd2
+% \setbox0=\normalhbox{}%
+% \processtokens
+% {\dodoboundtext}
+% {\dodoboundtext}
+% {}
+% {\space}
+% {#1}%
+% \box2
+% \else
+% \box0
+% \fi}}
+
+\def\dodoboundtext#1%
+ {\setbox0\normalhbox{#1}%
+ \advance\scratchdimen -\wd0
+ \ifdim\scratchdimen>\zeropoint\relax#1\fi}%
+
+\def\doboundtext#1#2#3%
+ {\normalhbox
+ {\setbox\scratchbox\normalhbox{#1}%
+ \scratchdimen#2\relax
+ \ifdim\wd\scratchbox>\scratchdimen
+ \setbox\scratchbox\normalhbox{#3}%
+ \advance\scratchdimen -\wd\scratchbox
+ \handletokens#1\with\dodoboundtext
+ \fi
+ \box\scratchbox}}
+
+%D \macros
+%D {limitatetext}
+%D
+%D A bit more beautiful alternative for the previous command is
+%D the next one. This command is more robust because we let
+%D \TEX\ do most of the job. The previous command works better
+%D on text that cannot be hyphenated.
+%D
+%D \starttyping
+%D \limitatetext {text} {width} {sentinel}
+%D \limitatetext {text} {-width} {prelude}
+%D \stoptyping
+%D
+%D When no width is given, the whole text comes available. The
+%D sentinel is optional. This is about the third version.
+
+\ifx\fakecompoundhyphen\undefined \let\fakecompoundhyphen\relax \fi
+\ifx\veryraggedright \undefined \def\veryraggedright{\raggedright} \fi
+
+%D The simple alternative is as follows:
+%D
+%D \starttyping
+%D \unexpanded\def\limitatetext%
+%D {\bgroup % evt \setstrut
+%D \forgetall
+%D \fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! !
+%D \dowithnextbox\dolimitatetext\normalhbox}
+%D
+%D \def\dolimitatetext#1#2%
+%D {\doifelsenothing{#1}
+%D {\unhbox\nextbox}
+%D {\widowpenalty=0
+%D \clubpenalty=0
+%D \scratchdimen=#1\relax
+%D \ifdim\nextboxwd>\scratchdimen
+%D \setbox\scratchbox=\normalhbox{ #2}%
+%D \advance\scratchdimen by -\wd\scratchbox
+%D \setbox\nextbox=\normalvbox
+%D {\hsize=\scratchdimen
+%D \hfuzz\maxdimen
+%D \veryraggedright
+%D \strut\unhcopy\nextbox}%
+%D \ifdim\nextboxht>\strutht \else
+%D \setbox\scratchbox\null % overfull and not split
+%D \fi
+%D \setbox\nextbox=\normalvbox % if omitted: missing brace reported
+%D {\splittopskip=\openstrutheight
+%D \setbox\nextbox=\vsplit\nextbox to \strutht
+%D \unvbox\nextbox
+%D \setbox\nextbox=\lastbox
+%D \global\setbox1=\normalhbox
+%D {\unhbox\nextbox\unskip\kern\zeropoint\box\scratchbox\unskip}}%
+%D \unhbox1
+%D \else
+%D \unhbox\nextbox
+%D \fi}%
+%D \egroup}
+%D \stoptyping
+%D
+%D The next alternative accepts a negative width. A negative
+%D value crops the beginning. The macro thereby becomes less
+%D readable, which is why we kept the original here too.
+
+\unexpanded\def\limitatetext
+ {\bgroup % evt \setstrut
+ \forgetall % otherwise indentation and so
+ %\def\limitatetext##1##2##3{##1}% \def !
+ \let\limitatetext\firstofthreearguments
+ \fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! !
+ \dowithnextboxcs\dolimitatetext\normalhbox}
+
+\def\dolimitatetext#1#2%
+ {\doifelsenothing{#1}
+ {\unhbox\nextbox}
+ {\nopenalties
+ \scratchdimen#1\relax
+ \ifdim\scratchdimen<\zeropoint\relax % we'll take the last line
+ \donefalse
+ \scratchdimen-\scratchdimen
+ \else
+ \donetrue
+ \fi
+ \ifdim\nextboxwd>\scratchdimen
+ \setbox\scratchbox\normalhbox{\ifdone\space#2\else#2\space\fi}%
+ \advance\scratchdimen -\wd\scratchbox
+ \setbox0\flushnextbox
+ \setbox\nextbox\normalvbox
+ {\hsize\scratchdimen
+ \hfuzz\maxdimen
+ \veryraggedright
+ \strut
+ \ifdone \else
+ \parfillskip\zeropoint
+ \rightskip\zeropoint
+ \hskip\zeropoint \!!plus 1\!!fill % \hsize
+ \fi
+ \unhcopy0}%
+ \ifdim\nextboxht>\strutht
+ \setbox\nextbox\normalvbox % if omitted: missing brace reported
+ {\splittopskip\openstrutheight
+ \ifdone
+ \setbox\nextbox\vsplit\nextbox to \strutht
+ \else
+ \doloop
+ {\setbox0\vsplit\nextbox to \strutht
+ \ifdim\nextboxht>\strutht \else \exitloop \fi}%
+ \fi
+ \unvbox\nextbox
+ \setbox\nextbox\lastbox
+ \global\setbox1\normalhbox
+ {\ifdone
+ \unhbox\nextbox\unskip\kern\zeropoint\box\scratchbox
+ \else
+ \box\scratchbox\unhbox\nextbox
+ \fi
+ \unskip}}%
+ \unhbox1
+ \else
+ \unhbox0
+ \fi
+ \else
+ \unhbox\nextbox
+ \fi}%
+ \egroup}
+
+%D We can also limit a text with more control:
+%D
+%D \startbuffer
+%D \limitatetext {\input tufte } {2cm,5mm} {\unknown}
+%D \limitatetext {ton en hans} {2cm,5mm} {\unknown}
+%D \limitatetext {ton en hans zijn eikels} {2cm,5mm} {\unknown}
+%D \limitatetext {ton} {2cm,5mm} {\unknown}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D We build this feature on top of the previous macro.
+
+\let\normallimitatetext\limitatetext
+
+\def\speciallimitatetext#1#2#3#4% text left right placeholder
+ {%\dontleavehmode
+ \bgroup
+ %\def\speciallimitatetext##1##2##3##4{##1}% \def !
+ \let\speciallimitatetext\firstoffourarguments
+ \setbox0\normalhbox
+ {\nohyphens
+ \normallimitatetext{#1}{+#2}{}#4%
+ \normallimitatetext{#1}{-#3}{}}%
+ \setbox2\normalhbox
+ {#1}%
+ \ifdim\wd2<\wd0 #1\else\unhbox0\fi
+ \egroup}
+
+\def\limitatetext#1#2#3% \expanded added 2003/01/16
+ {\expanded{\beforesplitstring#2}\at,\to\leftlimit
+ \expanded{\aftersplitstring #2}\at,\to\rightlimit
+ \ifx\rightlimit\empty
+ \normallimitatetext {#1}\leftlimit {#3}%
+ \else
+ \speciallimitatetext{#1}\leftlimit\rightlimit{#3}%
+ \fi}
+
+%D Undocumented bonus (see wiki):
+%D
+%D \starttyping
+%D \limitatefirstline{\input tufte\relax}{10cm}{\unknown}
+%D \stoptyping
+
+\def\limitatefirstline#1#2#3%
+ {\hbox\bgroup\strut
+ \setbox\scratchbox\hbox{\begstrut#1\endstrut}%
+ \ifdim\wd\scratchbox>#2\relax
+ \setbox\scratchbox\hbox{#3}%
+ \hsize#2\relax
+ \advance\hsize-\wd\scratchbox
+ \setbox\scratchbox\vbox{\forgetall\veryraggedright#1}%
+ \setbox\scratchbox\vsplit\scratchbox to \lineheight
+ \vbox
+ {\unvbox\scratchbox
+ \global\setbox\plusone\lastbox
+ \global\setbox\plusone\hbox{\strut\unhbox\plusone}%
+ \hbox % to #2
+ {\ifx\clip\undefined
+ \box\plusone
+ \else\ifdim\wd\plusone>\hsize
+ \lower\strutdepth\hbox{\clip[\c!width=\hsize,\c!height=\lineheight]{\hbox{\raise\strutdepth\box\plusone}}}%
+ \else
+ \box\plusone
+ \fi\fi
+ \removeunwantedspaces#3}}% \removeunwantedspaces\hss#3}}%
+ \else
+ #1%
+ \fi
+ \egroup}
+
+%D \macros
+%D {processisolatedwords,
+%D betweenisolatedwords,nothingbetweenisolatedwords}
+%D
+%D References are often made up of one word or a combination
+%D of tightly connected words. The typeset text {\bf
+%D chapter~5} is for instance the results of the character
+%D sequence:
+%D
+%D \starttyping
+%D The typeset text \in{chapter}[texniques] is for instance
+%D \stoptyping
+%D
+%D When such words are made active in interactive texts, the
+%D combination cannot longer be hyphenated. Normally this is no
+%D problem, because \TEX\ tries to prevent hyphenation as best
+%D as can.
+%D
+%D Sometimes however we need a few more words to make things
+%D clear, like when we want to refer to {\bf \TEX\ by Topic}.
+%D The macros that are responsible for typesetting hyperlinks,
+%D take care of such sub||sentences by breaking them up in
+%D words. Long ago we processed words using the space as a
+%D separator, but the more advanced our interactive text became,
+%D the more we needed a robust solution. Well, here it is and
+%D it called as:
+%D
+%D \starttyping
+%D \processisolatedwords{some words}\someaction
+%D \stoptyping
+%D
+%D The second argument \type{someactions} handles the
+%D individual words, like in:
+%D
+%D \startbuffer
+%D \processisolatedwords{some more words} \ruledhbox \par
+%D \processisolatedwords{and some $x + y = z$ math} \ruledhbox \par
+%D \processisolatedwords{and a \normalhbox{$x + y = z$}} \ruledhbox \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which let the words turn up as:
+%D
+%D \startvoorbeeld
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D The macro has been made a bit more clever than needed at
+%D first sight. This is due to the fact that we don't want to
+%D generate more overhead in terms of interactive commands than
+%D needed.
+%D
+%D \startbuffer
+%D \processisolatedwords{see this \ruledhskip1em} \ruledhbox
+%D \processisolatedwords{and \ruledhskip1em this one} \ruledhbox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D becomes:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D Single word arguments are treated without further
+%D processing. This was needed because this command is used in
+%D the \type{\goto} command, to which we sometimes pass very
+%D strange and|/|or complicated arguments or simply boxes
+%D whose dimensions are to be left intact.
+%D
+%D First we build a \type{\normalhbox}. This enables us to save the
+%D last skip. Next we fill a \type{\normalvbox} without hyphenating
+%D words. After we've tested if there is more than one word, we
+%D start processing the individual lines (words). We need some
+%D splitting, packing and unpacking to get the spacing and
+%D dimensions right.
+%D
+%D Normally the isolated words are separated by space, but
+%D one can overrule this separator by changing the next macros.
+%D
+%D When needed, spacing can be suppressed by \type
+%D {\nothingbetweenisolatedwords}.
+
+\newif\ifisolatedwords % public, e.g. used in core-ref
+
+\def\betweenisolatedwords
+ {\hskip\currentspaceskip}
+
+%D In order to prevent problems with nested isolated words, we
+%D do process them, but only split at the outermost level.
+
+\newskip\isolatedlastskip
+
+\chardef\isolatedwordsmode=0 % no nesting
+
+\def\processisolatedwords#1#2% todo: vbox ipv hbox ivm afbreken!
+ {\bgroup % todo: doloop
+ \fakecompoundhyphen
+ \dontcomplain
+ \forgetall
+ \nopenalties
+ \ifcase\isolatedwordsmode
+ \def\processisolatedwords##1##2{##2{##1}}% we split only once
+ \fi
+ \global\let\localbetweenisolatedwords\betweenisolatedwords
+ \setbox0\normalhbox % we default to spaces, but from inside out
+ {\normallanguage\minusone % needed for mkiv
+ \ignorespaces#1% \localbetweenisolatedwords can be overruled
+ \global\isolatedlastskip\lastskip}%
+ \setbox2\normalvbox
+ {%\hyphenpenalty10000 % this one fails in \url breaking,
+ \lefthyphenmin\maxcard % but this trick works ok, due to them
+ \righthyphenmin\maxcard % total>63, when no hyphenation is done
+ \hsize\zeropoint
+ \unhcopy0}% == #1
+ \ifdim\ht0=\ht2
+ \isolatedwordsfalse
+ #2{\unhbox0}% == #2{#1} % was \unhcopy0
+ \else
+ \isolatedwordstrue
+ \setbox0\normalhbox
+ {\ignorespaces
+ \loop
+ \setbox4\normalhbox
+ {\splittopskip\openstrutheight
+ \vsplit2 to \baselineskip}%
+ \normalhbox
+ {\unhbox4\unskip % recently added
+ \setbox4\lastbox
+ \normalvbox % outer \normalhbox needed
+ {\unvbox4 % for nested use
+ \setbox4\lastbox
+ \normalhbox{#2{\normalhbox
+ {\unhbox4
+ \unskip\unpenalty % remove end of line stuff
+ \global\dimen1\lastkern}}}}}%
+ \ifdim\ht2>\zeropoint\relax
+ \ifdim\dimen1=\compoundbreakpoint
+ \allowbreak
+ \else
+ \localbetweenisolatedwords
+ \fi
+ \repeat
+ \unskip}%
+ \unhbox0\unskip
+ \ifzeropt\isolatedlastskip\else % added % \ifdim\isolatedlastskip=\zeropoint\else % added
+ \hskip\isolatedlastskip
+ \fi
+ \fi
+ \egroup}
+
+%D One can use the next macro to change the intersplit
+%D material. An example can be found in the \type {\url}
+%D macro. The innermost setting is used. In the url case, it
+%D means that either very small spaces are used or no spaces
+%D at all. So, the innermost settings are used, while the
+%D outermost split takes place.
+
+\def\setbetweenisolatedwords#1%
+ {\gdef\localbetweenisolatedwords{#1}}
+
+%D \macros
+%D {sbox}
+%D
+%D This is a rather strange command. It grabs some box content
+%D and and limits the size to the height and depth of a
+%D \type{\strut}. The resulting bottom||alligned box can be used
+%D aside other ones, without disturbing the normal baseline
+%D distance.
+%D
+%D \startbuffer
+%D \ruledhbox to .5\hsize{\sbox{eerste\par tweede \par derde}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Shows up as:
+%D
+%D \startvoorbeeld
+%D \vskip3\baselineskip
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D Before displaying the result we added some skip, otherwise
+%D the first two lines would have ended up in the text. This
+%D macro can be useful when building complicated menus, headers
+%D and footers and|/|or margin material.
+
+\def\sbox% in handleiding, voorbeeld \inleft{xx} \extern..
+ {\normalvbox\bgroup % new ! ! !
+ \dowithnextbox
+ {\setbox\scratchbox\normalhbox
+ {\strut
+ \nextboxdp\zeropoint
+ \lower\strutdepth\flushnextbox}%
+ \dp\scratchbox\strutdepth
+ \ht\scratchbox\strutheight
+ \box\scratchbox
+ \egroup}%
+ \normalvbox}
+
+%D \macros
+%D {struttedbox}
+%D
+%D This boxing macro limits the height and depth to those of
+%D a strut.
+
+\def\struttedbox
+ {\normalhbox\bgroup % new ! ! !
+ \dowithnextbox
+ {\nextboxdp\strutdepth
+ \nextboxht\strutheight
+ \flushnextbox
+ \egroup}%
+ \normalhbox}
+
+%D \macros
+%D {topskippedbox}
+%D
+%D This macro compensates the difference between the topskip
+%D and strutheight. Watch how we preserve the depth when it
+%D equals strutdepth.
+
+\def\topskippedbox
+ {\normalhbox\bgroup
+ \dowithnextbox
+ {\edef\next
+ {\ifdim\strutdepth=\nextboxdp\nextboxdp\the\nextboxdp\fi}%
+ \lower\topskip\normalhbox{\raise\strutheight\flushnextbox}%
+ \next
+ \egroup}%
+ \normalhbox}
+
+%D \macros
+%D {centeredbox, centerednextbox}
+%D
+%D Here is another strange one. This one offers a sort of overlay
+%D with positive or negative offsets. This command can be used
+%D in well defined areas where no offset options are available.
+%D We first used it when building a button inside the margin
+%D footer, where the button should have a horizontal offset and
+%D should be centered with respect to the surrounding box. The
+%D last of the three examples we show below says:
+%D
+%D \starttyping
+%D \vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height .5cm width -1cm
+%D {\vrule width \hsize height \vsize}}}
+%D \stoptyping
+%D
+%D Here the \type{\ruledvbox} just shows the surrounding box
+%D and \type{\vrule} is used to show the centered box.
+%D
+%D \def\AnExample#1#2%
+%D {\vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height #1 width #2
+%D {\color[green]{\vrule width \hsize height \vsize}}}}
+%D
+%D \startlinecorrection
+%D \startcombination[3*1]
+%D {\AnExample {-1cm} {.5cm}} {}
+%D {\AnExample {.5cm} {-1cm}} {}
+%D {\AnExample {-1cm} {-.5cm}} {}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D This command takes two optional arguments: \type{width} and
+%D \type{height}. Observing readers can see that we use \TEX's
+%D own scanner for grabbing these arguments: \type{#1#} reads
+%D everyting till the next brace and passes it to both rules.
+%D The setting of the box dimensions at the end is needed for
+%D special cases. The dimensions of the surrounding box are kept
+%D intact. This commands handles positive and negative
+%D dimensions (which is why we need two boxes with rules).
+
+\def\centeredbox#1#% height +/-dimen width +/-dimen
+ {\bgroup
+ \setbox0\normalvbox to \vsize
+ \bgroup
+ \dontcomplain
+ \forgetall
+ \setbox0\normalhbox{\vrule\!!width \zeropoint#1}%
+ \setbox2\normalvbox{\hrule\!!height\zeropoint#1}%
+ \advance\vsize \ht2
+ \advance\hsize \wd0
+ \normalvbox to \vsize
+ \bgroup
+ \vskip-\ht2
+ \vss
+ \normalhbox to \hsize
+ \bgroup
+ \dowithnextbox
+ {\hskip-\wd0
+ \hss
+ \flushnextbox
+ \hss
+ \egroup
+ \vss
+ \egroup
+ \egroup
+ \wd0\hsize
+ \ht0\vsize
+ \box0
+ \egroup}
+ \normalhbox}
+
+%D For those who don't want to deal with \type {\hsize}
+%D and \type {\vsize}, we have:
+%D
+%D \starttyping
+%D \centerednextbox width 2bp height 2bp
+%D {\framed[width=100bp,height=100bp]{}}
+%D \stoptyping
+%D
+%D Do you see what we call this one \type {next}?
+
+\def\centerednextbox#1#%
+ {\bgroup
+ \dowithnextbox
+ {\hsize\nextboxwd
+ \vsize\nextboxht
+ \centeredbox#1{\flushnextbox}%
+ \egroup}
+ \normalhbox}
+
+%D \macros
+%D {centerbox}
+%D
+%D Centering on the available space is done by:
+%D
+%D \starttyping
+%D \centerbox <optional specs> {content}
+%D \stoptyping
+%D
+%D When omitted, the current \type {\hsize} and \type
+%D {\vsize} are used. Local dimensions are supported.
+
+\long\def\centerbox#1#% optional height +/-dimen width +/-dimen
+ {\bgroup
+ \dowithnextbox
+ {\setlocalhsize
+ \setbox0\normalhbox{\vrule\!!width \zeropoint#1}%
+ \setbox2\normalvbox{\hrule\!!height\zeropoint#1}%
+ \ifzeropt\wd0\else\hsize\wd0\fi % \hsize\ifdim\wd0=\zeropoint\hsize\else\wd0\fi
+ \ifzeropt\ht2\else\vsize\ht2\fi % \vsize\ifdim\ht2=\zeropoint\vsize\else\ht2\fi
+ \normalvbox to \vsize{\vss\normalhbox to \hsize{\hss\flushnextbox\hss}\vss}%
+ \egroup}%
+ \normalhbox}
+
+%D \macros
+%D {setrigidcolumnhsize,rigidcolumnbalance,rigidcolumnlines}
+%D
+%D These macros are copied from the \TEX book, page~397, and
+%D extended by a macro that sets the \type{\hsize}.
+%D
+%D \starttyping
+%D \setrigidcolumnhsize {total width} {distance} {n}
+%D \rigidcolumnbalance {box}
+%D \stoptyping
+%D
+%D Both these macros are for instance used in typesetting
+%D footnotes.
+%D
+%D Men kan het proces van breken enigzins beinvloeden met de
+%D volgende twee switches:
+
+\newif\ifalignrigidcolumns
+\newif\ifstretchrigidcolumns
+\newif\iftightrigidcolumns % if true: just a vbox, no depth/noflines/gridsnap corrrections
+
+%D De eerste switch bepaald het uitlijnen, de tweede rekt de
+%D individuele kolommen op naar \type{\vsize}.
+
+\def\setrigidcolumnhsize#1#2#3% todo: \dimexpr
+ {\xdef\savedrigidhsize{\the\hsize}%
+ \hsize#1\relax
+ \global\chardef\rigidcolumns#3\relax
+ \scratchdimen -#2\relax
+ \multiply\scratchdimen #3\relax
+ \advance\scratchdimen #2\relax
+ \advance\hsize \scratchdimen
+ \divide\hsize #3\relax}
+
+% ==
+%
+% \def\setrigidcolumnhsize#1#2#3%
+% {\xdef\savedrigidhsize{\the\hsize}%
+% \global\chardef\rigidcolumns#3\relax
+% \hsize=\dimexpr(#1-\numexpr#3-1\relax\dimexpr#2\relax)/#3\relax}
+
+\newbox\rigidcolumnbox
+
+\let\rigidcolumnlines\!!zerocount
+
+\def\rigidcolumnbalance#1%
+ {\ifnum\rigidcolumns=1 % tzt ook h/d correctie
+ \ifinner\ifhmode\box\else\unvbox\fi\else\unvbox\fi#1\relax
+ \else
+ \normalvbox
+ {\forgetall
+ \nopenalties
+ \dontcomplain
+ \setbox\rigidcolumnbox\normalvbox
+ {\line{}\goodbreak\unvbox#1\removebottomthings}%
+ \splittopskip\openstrutheight
+ \setbox\scratchbox\vsplit\rigidcolumnbox to \zeropoint
+ \ifcase\rigidcolumnlines\relax
+ % \iffalse
+ % % maybe some day an option
+ % \scratchskip\ht\rigidcolumnbox
+ % \advance\scratchskip\dp\rigidcolumnbox
+ % \getnoflines\scratchskip
+ % \ifodd\noflines
+ % \advance\noflines\plusone
+ % \fi
+ % \divide\noflines\rigidcolumns
+ %\else
+ \scratchdimen\ht\rigidcolumnbox
+ \divide\scratchdimen \rigidcolumns
+ \getnoflines\scratchdimen
+ %\fi
+ \else
+ \noflines\rigidcolumnlines % to be sure
+ \fi
+ \scratchdimen\noflines\lineheight
+ % new: we now loop so that we don't loose content
+ % since in practice we also use this macro for
+ % funny lineheights and border cases
+ \setbox0=\box\rigidcolumnbox
+ \doloop
+ {\setbox\rigidcolumnbox=\copy0
+ \setbox\scratchbox\normalhbox to \savedrigidhsize
+ {\dorecurse\rigidcolumns
+ {\setbox\scratchbox\vsplit\rigidcolumnbox to \scratchdimen
+ \dp\scratchbox\openstrutdepth
+ \setbox\scratchbox\normalvtop
+ \ifalignrigidcolumns to
+ \ifstretchrigidcolumns\vsize\else\scratchdimen\fi
+ \fi
+ {\unvbox\scratchbox}%
+ \wd\scratchbox\hsize
+ \box\scratchbox
+ \hfill}%
+ \hfillneg}%
+ \ifvoid\rigidcolumnbox\exitloop\else\advance\scratchdimen\lineheight\fi}%
+ \iftightrigidcolumns
+ \setbox\scratchbox\normalhbox{\raise\dp\scratchbox\box\scratchbox}%
+ \else
+ \advance\scratchdimen -\openstrutdepth
+ \setbox\scratchbox\normalhbox{\raise\scratchdimen\box\scratchbox}%
+ \dp\scratchbox\openstrutdepth
+ \ht\scratchbox\scratchdimen
+ \fi
+ \box\scratchbox}%
+ \fi}
+
+%D \macros
+%D {startvboxtohbox,stopvboxtohbox,convertvboxtohbox}
+%D
+%D Here is another of Knuth's dirty tricks, as presented on
+%D pages 398 and 399 of the \TEX book. These macros can be used
+%D like:
+%D
+%D \starttyping
+%D \normalvbox
+%D \bgroup
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \egroup
+%D
+%D \normalvbox
+%D \bgroup
+%D \convertvboxtohbox
+%D \egroup
+%D \stoptyping
+%D
+%D These macros are used in reformatting footnotes, so they do
+%D what they're meant for.
+
+\def\setvboxtohbox
+ {\bgroup
+ \ifdim\baselineskip<16pt \relax
+ \scratchdimen\baselineskip
+ \multiply\scratchdimen 1024
+ \else
+ \message{cropping \baselineskip to 16pt}%
+ \scratchdimen\maxdimen
+ \fi
+ \divide\scratchdimen \hsize
+ \multiply\scratchdimen 64
+ \xdef\normalvboxtohboxfactor{\withoutpt\the\scratchdimen}%
+ \egroup}
+
+\def\startvboxtohbox
+ {\bgroup
+ \setvboxtohbox
+ \setbox\scratchbox\normalhbox\bgroup}
+
+\def\stopvboxtohbox
+ {\egroup
+ \dp\scratchbox\zeropoint
+ \ht\scratchbox\normalvboxtohboxfactor\wd\scratchbox
+ \box\scratchbox
+ \egroup}
+
+% % to be done: start halfway a line combined with one line
+% % extra to start with (skip) and one line less than counted.
+%
+% \def\stopvboxtohbox%
+% {\egroup
+% \setbox2=\normalvbox
+% {\forgetall\unhcopy0\par\xdef\globalvhlines{\the\prevgraf}}%
+% \setbox2=\normalvbox
+% {\unvbox2
+% \setbox2=\lastbox
+% \setbox2=\normalhbox{\unhbox2}%
+% \xdef\globalvhwidth{\the\wd2}}%
+% \decrement\globalvhlines
+% \dimen0=\globalvhwidth
+% \dimen0=\normalvboxtohboxfactor\dimen0
+% \advance\dimen0 by \globalvhlines\lineheight
+% \dp0=\zeropoint
+% \ht0=\dimen0
+% %\writestatus{guessed size}
+% % {w:\the\wd0\space\space
+% % b:\the\baselineskip\space
+% % l:\globalvhlines\space
+% % e:\globalvhwidth\space
+% % h:\the\dimen0}%
+% \box0
+% \egroup}
+
+% todo: \scratchbox
+
+\def\convertvboxtohbox
+ {\setvboxtohbox
+ \makehboxofhboxes
+ \setbox0\normalhbox{\unhbox0 \removehboxes}%
+ \noindent\unhbox0\par}
+
+\def\makehboxofhboxes
+ {\setbox0\normalhbox{}%
+ \loop % \doloop { .. \exitloop .. }
+ \setbox2\lastbox
+ \ifhbox2
+ \setbox0\normalhbox{\box2\unhbox0}%
+ \repeat}
+
+% \def\makehboxofhboxes
+% {\setbox0\normalhbox{}%
+% \doloop % \doloop { .. \exitloop .. }
+% {% \dorecurse{3}{\unskip\unpenalty}% get rid of ... (better do this in a shapeloop)
+% \setbox2\lastbox
+% \ifhbox2
+% \setbox0\normalhbox{\box2\unhbox0}%
+% \else
+% \exitloop
+% \fi}}
+
+% \def\flushboxesonly % feed this into \makehboxofhboxes
+% {\dowithnextbox
+% {\beginofshapebox
+% \unvbox\nextbox
+% \endofshapebox
+% \doreshapebox{\box\shapebox}{}{}{}% get rid of penalties etc
+% \innerflushshapebox}
+% \vbox}
+
+\def\removehboxes
+ {\setbox0\lastbox
+ \ifhbox0
+ {\removehboxes}\unhbox0
+ \fi}
+
+%D \macros
+%D {unhhbox}
+%D
+%D The next macro is used in typesetting inline headings.
+%D Let's first look at the macro and then show an example.
+
+\newbox \unhhedbox
+\newbox \hhbox
+\newdimen \lasthhboxwidth
+\newskip \hhboxindent
+
+\def\unhhbox#1\with#2%
+ {\bgroup
+ \nopenalties
+ \dontcomplain
+ \forgetall
+ \setbox\unhhedbox\normalvbox{\hskip\hhboxindent\strut\unhbox#1}% => \hsize
+ \doloop
+ {\setbox\hhbox\vsplit\unhhedbox to \lineheight
+ \ifvoid\unhhedbox
+ \setbox\hhbox\normalhbox{\strut\normalhboxofvbox\hhbox}%
+ \fi
+ \ht\hhbox\strutht
+ \dp\hhbox\strutdp
+ \ifzeropt\hhboxindent\else % \ifdim\hhboxindent=\zeropoint\else
+ \setbox\hhbox\normalhbox{\hskip-\hhboxindent\box\hhbox}%
+ \hhboxindent\zeropoint
+ \fi
+ \global\lasthhboxwidth\wd\hhbox
+ #2\relax
+ \ifvoid\unhhedbox
+ \exitloop
+ \else
+ \hskip\zeropoint \!!plus \zeropoint
+ \fi}%
+ \egroup}
+
+\def\dohboxofvbox
+ {\setbox0\normalvbox{\unvbox\scratchcounter\global\setbox1\lastbox}%
+ \unhbox1
+ \egroup}
+
+\def\normalhboxofvbox
+ {\bgroup
+ \afterassignment\dohboxofvbox
+ \scratchcounter=}
+
+%D This macro can be used to break a paragraph apart and treat
+%D each line seperately, for instance, making it clickable. The
+%D main complication is that we want to be able to continue the
+%D paragraph, something that's needed in the in line section
+%D headers.
+%D
+%D \startbuffer
+%D \setbox0=\normalhbox{\input tufte \relax}
+%D \setbox2=\normalhbox{\input knuth \relax}
+%D \unhhbox0\with{\ruledhbox{\box\hhbox}}
+%D \hskip1em plus 1em minus 1em
+%D \hhboxindent=\lasthhboxwidth
+%D \advance\hhboxindent by \lastskip
+%D \unhhbox2\with{\ruledhbox{\box\hhbox}}
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D This piece of text was typeset by saying:
+%D
+%D \typebuffer
+%D
+%D Not that nice a definition, but effective. Note the stretch
+%D we've build in the line that connects the two paragraphs.
+
+%D \macros
+%D {doifcontent}
+%D
+%D When processing depends on the availability of content, one
+%D can give the next macro a try.
+%D
+%D \starttyping
+%D \doifcontent{pre content}{post content}{no content}\somebox
+%D \stoptyping
+%D
+%D Where \type{\somebox} is either a \type{\normalhbox} or
+%D \type{\normalvbox}. If the dimension of this box suggest some
+%D content, the resulting box is unboxed and surrounded by the
+%D first two arguments, else the third arguments is executed.
+
+\unexpanded\def\doifcontent#1#2#3%
+ {\dowithnextbox
+ {\ifhbox\nextbox
+ \ifdim\nextboxwd>\zeropoint
+ #1\unhbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \else
+ \ifdim\nextboxht>\zeropoint
+ #1\unvbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \fi}}
+
+%D So when we say:
+%D
+%D \startbuffer
+%D \doifcontent{[}{]}{}\normalhbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{\page}{}\normalvbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{}{\message{Didn't you forget something?}}\normalhbox{}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \getbuffer
+%D
+%D Where the last call of course does not show up in this
+%D document, but definitely generates a confusing message.
+
+%D \macros
+%D {processboxes}
+%D
+%D The next macro gobble boxes and is for instance used for
+%D overlays. First we show the general handler.
+
+\newbox\processbox
+
+\def\processboxes#1%
+ {\bgroup
+ \def\doprocessbox{#1}% #1 can be redefined halfway
+ \resetbox\processbox
+ \afterassignment\dogetprocessbox\let\next=}
+
+\def\endprocessboxes
+ {\ifhmode\unskip\fi
+ \box\processbox
+ \next
+ \egroup}
+
+\def\dogetprocessbox
+ {\ifx\next\bgroup
+ \expandafter\dodogetprocessbox
+ \else
+ \expandafter\endprocessboxes
+ \fi}
+
+\def\dodogetprocessbox
+ {\dowithnextbox
+ {\ifhmode\unskip\fi\doprocessbox % takes \nextbox makes \processbox
+ \afterassignment\dogetprocessbox\let\next=}
+ \normalhbox\bgroup}
+
+%D \macros
+%D {startoverlay}
+%D
+%D We can overlay boxes by saying:
+%D
+%D \startbuffer
+%D \startoverlay
+%D {\framed{hans}}
+%D {\framed[width=3cm]{ton}}
+%D {\framed[height=2cm]{oeps}}
+%D \stopoverlay
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D shows up as:
+%D
+%D \leavevmode\getbuffer
+
+% \def\dooverlaybox%
+% {\ifhmode\unskip\fi
+% \ifdim\nextboxht>\ht\processbox
+% \setbox\processbox\normalvbox to \nextboxht
+% {\vss\box\processbox\vss}%
+% \else
+% \setbox\nextbox\normalvbox to \ht\processbox
+% {\vss\flushnextbox\vss}%
+% \fi
+% \scratchdimen=\wd
+% \ifdim\nextboxwd>\wd\processbox
+% \nextbox
+% \else
+% \processbox
+% \fi
+% \setbox\processbox=\normalhbox to \scratchdimen
+% {\normalhbox to \scratchdimen{\hss\box\processbox\hss}%
+% \hskip-\scratchdimen
+% \normalhbox to \scratchdimen{\hss\flushnextbox\hss}}}
+%
+% \def\startoverlay%
+% {\bgroup
+% \let\stopoverlay\egroup
+% \processboxes\dooverlaybox}
+
+\def\dooverlaybox
+ {\ifhmode\unskip\fi
+ \scratchdimen\dp
+ \ifdim\nextboxdp>\dp\processbox
+ \nextbox
+ \else
+ \processbox
+ \fi
+ \ifdim\nextboxht>\ht\processbox
+ \setbox\processbox\normalvbox to \nextboxht
+ {\dp\processbox\zeropoint\vss\box\processbox\vss}%
+ \else
+ \setbox\nextbox\normalvbox to \ht\processbox
+ {\nextboxdp\zeropoint\vss\flushnextbox\vss}%
+ \fi
+ \nextboxdp\scratchdimen
+ \dp\processbox\scratchdimen
+ \scratchdimen\wd
+ \ifdim\nextboxwd>\wd\processbox
+ \nextbox
+ \else
+ \processbox
+ \fi
+ \setbox\processbox\normalhbox to \scratchdimen
+ {\normalhbox to \scratchdimen{\hss\box\processbox\hss}%
+ \hskip-\scratchdimen
+ \normalhbox to \scratchdimen{\hss\flushnextbox\hss}}}
+
+\unexpanded\def\startoverlay
+ {\bgroup
+ \let\stopoverlay\egroup
+ \processboxes\dooverlaybox}
+
+\let\stopoverlay\relax
+
+% %D \macros
+% %D {starthspread}
+% %D
+% %D In a similar way we can build a horizontal box, spread
+% %D over the available width.
+% %D
+% %D \startbuffer
+% %D \starthspread
+% %D {hans}
+% %D {ton}
+% %D {oeps}
+% %D \stophspread
+% %D
+% %D \stopbuffer
+% %D
+% %D \typebuffer
+% %D
+% %D shows up as:
+% %D
+% %D \leavevmode\getbuffer
+%
+% \def\dohspread
+% {\flushnextbox
+% \def\dohspread{\hfil\flushnextbox}}
+%
+% \def\starthspread
+% {\normalhbox to \hsize \bgroup
+% \let\stophspread\egroup
+% \processboxes\dohspread}
+
+%D \macros
+%D {fakebox}
+%D
+%D The next macro is a rather silly one, but saves space.
+%D
+%D \starttyping
+%D \normalhbox{\fakebox0}
+%D \stoptyping
+%D
+%D returns an empty box with the dimensions of the box
+%D specified, here being zero.
+
+\def\dofakebox
+ {\setbox\scratchbox\null
+ \wd\scratchbox\wd\scratchcounter
+ \ht\scratchbox\ht\scratchcounter
+ \dp\scratchbox\dp\scratchcounter
+ \ifhbox\scratchcounter\normalhbox\else\normalvbox\fi{\box\scratchbox}%
+ \egroup}
+
+\def\fakebox
+ {\bgroup
+ \afterassignment\dofakebox\scratchcounter}
+
+%D \macros
+%D {lbox,rbox,cbox,tbox,bbox}
+%D
+%D Here are some convenient alternative box types:
+%D
+%D \starttyping
+%D \lbox{text ...}
+%D \cbox{text ...}
+%D \rbox{text ...}
+%D \stoptyping
+%D
+%D Are similar to \type {\normalvbox}, which means that they also
+%D accept something like \type{to 3cm}, but align to the left,
+%D middle and right. These box types can be used to typeset
+%D paragraphs.
+
+\def\lbox{\makelrcbox\normalvbox\raggedleft}
+\def\cbox{\makelrcbox\normalvbox\raggedcenter}
+\def\rbox{\makelrcbox\normalvbox\raggedright}
+
+\def\ltop{\makelrcbox\normalvtop\raggedleft}
+\def\ctop{\makelrcbox\normalvtop\raggedcenter}
+\def\rtop{\makelrcbox\normalvtop\raggedright}
+
+\def\makelrcbox#1#2#3#%
+ {#1#3\bgroup \forgetall \let\\=\endgraf #2\let\next=}
+
+%D The alternatives \type {\tbox} and \type {\bbox} can be used
+%D to properly align boxes, like in:
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D \starttable[|||]
+%D \HL
+%D \VL \tbox{\externalfigure[cow][height=3cm,frame=on]} \VL top aligned \VL\SR
+%D \HL
+%D \VL \bbox{\externalfigure[cow][height=3cm,frame=on]} \VL bottom aligned \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D The positioning depends on the strut settings:
+%D
+%D \getbuffer
+
+\def\tbox{\tbbox\ht\dp}
+\def\bbox{\tbbox\dp\ht}
+
+\def\tbbox#1#2%
+ {\normalhbox\bgroup
+ \dowithnextbox
+ {\scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \advance\scratchdimen-#1\strutbox
+ #1\nextbox#1\strutbox
+ #2\nextbox\scratchdimen
+ \setbox\nextbox\normalhbox
+ {\lower\nextboxdp\flushnextbox}%
+ #1\nextbox#1\strutbox
+ #2\nextbox\scratchdimen
+ \flushnextbox
+ \egroup}
+ \normalhbox}
+
+%D \macros
+%D {lhbox,mhbox,rhbox}
+%D
+%D A few more boxes.
+
+\def\dodolhbox{\normalhbox to \hsize{\flushnextbox\hss }}
+\def\dodomhbox{\normalhbox to \hsize{\hss\flushnextbox\hss}}
+\def\dodorhbox{\normalhbox to \hsize{\hss\flushnextbox }}
+
+\def\lhbox{\dowithnextboxcs\dodolhbox\normalhbox}
+\def\mhbox{\dowithnextboxcs\dodomhbox\normalhbox}
+\def\rhbox{\dowithnextboxcs\dodorhbox\normalhbox}
+
+\let\lefthbox \lhbox
+\let\midhbox \mhbox
+\let\righthbox\rhbox
+
+%D \macros
+%D {boxofsize}
+%D
+%D Sometimes we need to construct a box with a height or
+%D width made up of several dimensions. Instead of cumbersome
+%D additions, we can use:
+%D
+%D \starttyping
+%D \boxofsize \normalvbox 10cm 3cm -5cm {the text to be typeset}
+%D \stoptyping
+%D
+%D This example demonstrates that one can use positive and
+%D negative values. Dimension registers are also accepted.
+
+\newdimen\sizeofbox
+
+\def\boxofsize#1%
+ {\bgroup
+ \sizeofbox\zeropoint
+ \scratchdimen\zeropoint
+ \def\docommand
+ {\advance\sizeofbox\scratchdimen
+ \futurelet\next\dodocommand}%
+ \def\dodocommand
+ {\ifx\next\bgroup
+ \expanded{\egroup#1 to \the\sizeofbox}%
+ \else
+ \@EA\afterassignment\@EA\docommand\@EA\scratchdimen
+ \fi}%
+ \docommand}
+
+%D Some new, still undocumented features:
+
+% limitatetext -> beter {text} als laatste !!
+%
+% \limitvbox
+% \limithbox
+
+\def\limitatelines#1#2% size sentinel
+ {\dowithnextbox
+ {\dimen0=#1\hsize
+ \ifdim\nextboxwd>\dimen0
+ \setbox\nextbox\normalhbox
+ {\advance\dimen0 -.1\hsize
+ \limitatetext{\unhbox\nextbox}{\dimen0}{\nobreak#2}}%
+ \fi
+ \unhbox\nextbox}
+ \normalhbox}
+
+\def\fittoptobaselinegrid % weg hier
+ {\dowithnextbox
+ {\bgroup
+ \par
+ \dimen0\nextboxht
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \normalhbox{\flushnextbox}
+ \prevdepth\strutdp
+ \doloop
+ {\advance\dimen0 -\lineheight
+ \ifdim\dimen0<\zeropoint
+ \exitloop
+ \else
+ \nobreak
+ \normalhbox{\strut}
+ \fi}
+ \egroup}
+ \normalvbox}
+
+%D Some more undocumented macros (used in m-chart).
+
+\newif\iftraceboxplacement % \traceboxplacementtrue
+
+\newbox\fakedboxcursor
+
+\setbox\fakedboxcursor\normalhbox
+ {\vrule\!!width\zeropoint\!!height\zeropoint\!!depth\zeropoint}
+
+\def\boxcursor % overloaded in core-vis
+ {\iftraceboxplacement
+ \bgroup
+ \scratchdimen2pt
+ \setbox\scratchbox\normalhbox to \zeropoint
+ {\hss
+ \vrule
+ \!!width \scratchdimen
+ \!!height\scratchdimen
+ \!!depth \scratchdimen
+ \hss}%
+ \smashedbox\scratchbox
+ \egroup
+ \else
+ \copy\fakedboxcursor
+ \fi}
+
+\def\placedbox
+ {\iftraceboxplacement\ruledhbox\else\normalhbox\fi}
+
+\newdimen\boxoffset
+\newdimen\boxhdisplacement
+\newdimen\boxvdisplacement
+
+%\def\rightbox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=.5\ht0\advance\dimen0 -.5\dp0
+% \boxcursor\hskip\boxoffset\lower\dimen0\box0}}
+
+\def\rightbox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement.5\ht0
+ \global\advance\boxvdisplacement-.5\dp0
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box0}}
+
+%\def\leftbox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=.5\ht0\advance\dimen0 -.5\dp0
+% \boxcursor\hskip-\wd0\hskip-\boxoffset\lower\dimen0\box0}}
+
+\def\leftbox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement-\wd0
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement.5\ht0
+ \global\advance\boxvdisplacement-.5\dp0
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box0}}
+
+%\def\topbox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=\boxoffset\advance\dimen0 \dp0
+% \boxcursor\hskip-.5\wd0\raise\dimen0\box0}}
+
+\def\topbox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement-.5\wd0
+ \global\boxvdisplacement-\dp0
+ \global\advance\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box0}}
+
+%\def\bottombox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=\boxoffset\advance\dimen0 \ht0
+% \boxcursor\hskip-.5\wd0\lower\dimen0\box0}}
+
+\def\bottombox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement-.5\wd0
+ \global\boxvdisplacement\ht0
+ \global\advance\boxvdisplacement\boxoffset
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box0}}
+
+%\def\lefttopbox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=\boxoffset\advance\dimen0 \dp0
+% \advance\boxoffset\wd0
+% \boxcursor\hskip-\boxoffset\raise\dimen0\box0}}
+
+\def\lefttopbox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement-\wd0
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement-\dp0
+ \global\advance\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box0}}
+
+%\def\righttopbox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=\boxoffset\advance\dimen0 \dp0
+% \boxcursor\hskip\boxoffset\raise\dimen0\box0}}
+
+\def\righttopbox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement-\dp0
+ \global\advance\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box0}}
+
+%\def\leftbottombox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=\boxoffset\advance\dimen0 \ht0
+% \advance\boxoffset\wd0
+% \boxcursor\hskip-\boxoffset\lower\dimen0\box0}}
+
+\def\leftbottombox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement-\wd0
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement\ht0
+ \global\advance\boxvdisplacement\boxoffset
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box0}}
+
+%\def\rightbottombox#1%
+% {\normalhbox
+% {\setbox0=\placedbox{#1}%
+% \dimen0=\boxoffset\advance\dimen0 \ht0
+% \boxcursor\hskip\boxoffset\lower\dimen0\box0}}
+
+\def\rightbottombox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement\ht0
+ \global\advance\boxvdisplacement\boxoffset
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box0}}
+
+\let\topleftbox \lefttopbox
+\let\toprightbox \righttopbox
+\let\bottomleftbox \leftbottombox
+\let\bottomrightbox\rightbottombox
+
+\def\middlebox#1%
+ {\normalhbox{\setbox0\placedbox{#1}\boxoffset=-.5\wd0\rightbox{\box0}}}
+
+\def\baselinemiddlebox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement-.5\wd0
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box0}}
+
+\def\baselineleftbox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement-\wd0
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box0}}
+
+\def\baselinerightbox#1%
+ {\normalhbox
+ {\setbox0\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box0}}
+
+%D \macros
+%D {obox}
+%D
+%D Experimental, not yet frozen:
+
+\def\lrtbbox#1#2#3#4% l r t b
+ {\bgroup
+ \dowithnextboxcontent
+ {\advance\hsize-#1\advance\hsize-#2\advance\vsize-#3\advance\vsize-#4\relax}
+ {\forgetall\vbox to \vsize{\vskip#3\hbox to \hsize{\hskip#1\box\nextbox\hss}\vss}\egroup}
+ \vbox}
+
+%D \macros
+%D {toplinebox}
+%D
+%D See core-tbl.tex for an example of its usage:
+
+\def\toplinebox
+ {\dowithnextbox
+ {\ifdim\nextboxdp>\strutdepth
+ \scratchdimen\nextboxdp
+ \advance\scratchdimen-\strutdepth
+ \getnoflines\scratchdimen
+ \struttedbox{\flushnextbox}%
+ \dorecurse\noflines\verticalstrut
+ \else
+ \flushnextbox
+ \fi}%
+ \tbox}
+
+%D \macros
+%D {initializeboxstack,savebox,foundbox}
+%D
+%D At the cost of some memory, but saving box registers, we
+%D have implemented a box repository.
+%D
+%D \starttyping
+%D \initializeboxstack{one}
+%D
+%D \savebox{one}{a}{test a}
+%D \savebox{one}{p}{test p}
+%D \savebox{one}{q}{test q}
+%D
+%D \normalhbox{a:\foundbox{one}{a}} \par
+%D \normalhbox{q:\foundbox{one}{q}} \par
+%D \normalhbox{p:\foundbox{one}{p}} \par
+%D \normalhbox{x:\foundbox{one}{x}} \par
+%D \normalhbox{y:\foundbox{two}{a}} \par
+%D \stoptyping
+
+% we keep it around as a demonstration of good old tex code:
+%
+% \def\@@stackbox{boxstack:b:}
+% \def\@@stackmax{boxstack:m:}
+% \def\@@stacktag{boxstack:t:}
+% \def\@@stacklst{boxstack:l:}
+%
+% \def\initializeboxstack#1%
+% {\ifundefined{\@@stackbox#1}%
+% \@EA\newbox\csname\@@stackbox#1\endcsname
+% \else
+% \global\setbox\csname\@@stackbox#1\endcsname\normalvbox{}%
+% \def\docommand##1{\global\letbeundefined{\@@stacktag#1:##1}}%
+% \processcommacommand[\getvalue{\@@stacklst#1}]\docommand
+% \fi
+% \global\letvalue{\@@stacklst#1}\empty
+% \global\letvalue{\@@stackmax#1}\!!zeropoint}
+%
+% \def\savebox#1#2% stack name
+% {\dowithnextbox
+% {\doifdefined{\@@stackbox#1}
+% {\@EA\doglobal\@EA\increment\csname\@@stackmax#1\endcsname
+% \setxvalue{\@@stacktag#1:#2}{\csname\@@stackmax#1\endcsname}%
+% \setxvalue{\@@stacklst#1}{\getvalue{\@@stacklst#1},#2}%
+% \global\setbox\csname\@@stackbox#1\endcsname\normalvbox
+% {\forgetall
+% \setbox\scratchbox\normalvbox{\flushnextbox}
+% \ht\scratchbox\onepoint
+% \dp\scratchbox\zeropoint
+% \unvbox\csname\@@stackbox#1\endcsname
+% \offinterlineskip
+% \allowbreak
+% \box\scratchbox}}}%
+% \normalvbox}
+%
+% \def\foundbox#1#2%
+% {\normalvbox
+% {\doifdefined{\@@stackbox#1}
+% {\doifdefined{\@@stacktag#1:#2}
+% {\setbox\scratchbox\normalvbox
+% {\splittopskip\zeropoint
+% \setbox0\copy\csname\@@stackbox#1\endcsname
+% \dimen0=\getvalue{\@@stacktag#1:#2}\points
+% \advance\dimen0 -\onepoint
+% \setbox2\vsplit0 to \dimen0
+% \ifdim\ht0>\onepoint
+% \setbox0\vsplit0 to \onepoint
+% \fi
+% \unvbox0\setbox0\lastbox\unvbox0}%
+% \unvbox\scratchbox}}}}
+%
+% \def\doifboxelse#1#2%
+% {\doifdefinedelse{\@@stacktag#1:#2}}
+
+\def\@@stackbox{@box@}
+\def\@@stacklst{@xob@}
+
+\def\setstackbox#1#2%
+ {\ifcsname\@@stackbox:#1:#2\endcsname\else
+ \expandafter\newbox\csname\@@stackbox:#1:#2\endcsname
+ \fi
+ \global\setbox\csname\@@stackbox:#1:#2\endcsname\normalvbox}
+
+\def\initializeboxstack#1%
+ {\def\docommand##1{\setstackbox{#1}{##1}{}}%
+ \ifcsname\@@stacklst#1\endcsname
+ \processcommacommand[\getvalue{\@@stacklst#1}]\docommand
+ \fi
+ \global\letvalue{\@@stacklst#1}\empty}
+
+\def\savebox#1#2% stack name
+ {% beware, \setxvalue defines the cs beforehand so we cannot use the
+ % test inside the { }
+ \ifcsname\@@stacklst#1\endcsname
+ \setxvalue{\@@stacklst#1}{\csname\@@stacklst#1\endcsname,#2}%
+ \else
+ \setxvalue{\@@stacklst#1}{#2}%
+ \fi
+ \setstackbox{#1}{#2}}
+
+\def\foundbox#1#2%
+ {\normalvbox
+ {\ifcsname\@@stackbox:#1:#2\endcsname
+ \copy\csname\@@stackbox:#1:#2\endcsname
+ \fi}}
+
+\long\def\doifboxelse#1#2#3#4%
+ {\ifcsname\@@stackbox:#1:#2\endcsname
+ \ifvoid\csname\@@stackbox:#1:#2\endcsname#4\else#3\fi
+ \else
+ #4%
+ \fi}
+
+\endETEX
+
+%D \macros
+%D {removedepth, obeydepth}
+%D
+%D While \type {\removedepth} removes the preceding depth,
+%D \type {\obeydepth} makes sure we have depth. Both macros
+%D leave the \type {\prevdepth} untouched.
+
+\def\removedepth
+ {\ifvmode \ifdim\prevdepth>\zeropoint \kern-\prevdepth \fi \fi}
+
+\def\obeydepth
+ {\par \removedepth \ifvmode \kern\strutdp \fi}
+
+\def\undepthed
+ {\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\hbox}
+
+%D \macros
+%D {removebottomthings, removelastskip}
+%D
+%D A funny (but rather stupid) one, plus a redefinition.
+
+\def\removebottomthings
+ {\dorecurse5{\unskip\unkern\unpenalty}}
+
+\def\removelastskip % \ifvmode the plain tex one \fi
+% {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi}
+ {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi}
+
+%D \macros
+%D {makestrutofbox}
+%D
+%D This macro sets the dimensions of a box to those of a
+%D strut.
+
+\def\domakestrutofbox
+ {\ht\registercount\strutht
+ \dp\registercount\strutdp
+ \wd\registercount\zeropoint}
+
+\def\makestrutofbox
+ {\afterassignment\domakestrutofbox\registercount}
+
+%D \macros
+%D {raisebox,lowerbox}
+%D
+%D Some more box stuff, related to positioning (under
+%D construction). Nice stuff for a tips and tricks maps
+%D article.
+%D
+%D \starttyping
+%D \raisebox{100pt}\normalhbox{test}
+%D \raisebox50pt\normalhbox{test}
+%D \hsmash{\raisebox{100pt}\normalhbox{test}}
+%D \stoptyping
+
+\def\doraiselowerbox#1#2% a nice trick us used to accept
+ {\def\next % both direct and {} dimensions
+ {\dowithnextbox
+ {\setbox\nextbox\normalhbox{#1\scratchdimen\flushnextbox}%
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \flushnextbox}}%
+ \afterassignment\next\scratchdimen=#2}
+
+\def\raisebox{\doraiselowerbox\raise}
+\def\lowerbox{\doraiselowerbox\raise}
+
+% maybe some day we need this
+%
+% \def\appendvbox#1% % uses \box8
+% {\bgroup
+% \ifdim\prevdepth<\zeropoint
+% \ifdim\pagetotal=\zeropoint
+% \setbox8=\normalvtop{\unvcopy#1}%
+% \hrule\c!!height\zeropoint
+% \kern-\ht8
+% \box#1\relax
+% \else
+% \box#1\relax
+% \fi
+% \else
+% \dimen0=\prevdepth
+% \hrule\c!!height\zeropoint
+% \setbox8=\normalvtop{\unvcopy#1}%
+% \dimen2=\baselineskip
+% \advance\dimen2 by -\dimen0
+% \advance\dimen2 by -\ht8
+% \kern\dimen2
+% \box#1\relax
+% \fi
+% \egroup}
+
+% %D Also new:
+% %D
+% %D \startbuffer
+% %D \normbox[1cm][bba]{m} % b(efore) a(fter) v(box) s(trut) f(rame)
+% %D \normbox[1cm][bba]{m}
+% %D \normbox[1cm][bba]{m}
+% %D \stopbuffer
+% %D
+% %D \typebuffer
+% %D \getbuffer
+%
+% \def\dodonormbox#1#2#3#4#5#6#7%
+% {\doifnumberelse{#1}
+% {\dimen0=#1}{\setbox0=#3{#1}\dimen0=#50}%
+% \doifinstringelse{f}{#2}
+% {\let\next#4}{\let\next#3}%
+% \next to \dimen0
+% {\counttoken b\in#2\to\!!counta\dorecurse{\!!counta}{#6}#6%
+% #7\nextbox
+% \counttoken a\in#2\to\!!counta\dorecurse{\!!counta}{#6}#6}}
+%
+% \def\donormbox[#1][#2]%
+% {\bgroup
+% \doifinstringelse{v}{#2}
+% {\let\next\normalvbox}
+% {\let\next\normalhbox}%
+% \dowithnextbox
+% {\ifvbox\nextbox
+% \let\\=\par
+% \dodonormbox{#1}{#2}\normalvbox\ruledvbox\ht\vfil\unvbox
+% \else
+% \let\\=\space
+% \dodonormbox{#1}{#2}\normalhbox\ruledhbox\wd\hfil\unhbox
+% \fi
+% \egroup}%
+% \next}
+%
+% \def\normbox
+% {\dodoubleempty\donormbox}
+
+% vcenter in text, we kunnen vcenter overloaden
+
+\def\halfwaybox
+ {\dowithnextbox
+ {\nextboxdp\zeropoint
+ \setbox\nextbox\normalhbox{\lower.5\nextboxht\flushnextbox}%
+ \flushnextbox}
+ \normalhbox}
+
+%D New:
+
+\def\setdimentoatleast#1#2%
+ {\ifdim#1>\zeropoint\else#1=#2\fi}
+
+%D And even rawer:
+
+\let\naturalhbox \normalhbox
+\let\naturalvbox \normalvbox
+\let\naturalvtop \normalvtop
+\let\naturalvcenter \normalvtop
+
+\ifdefined\textdir
+
+ \def\naturalhbox{\normalhbox dir TLT}
+ \def\naturalvbox{\normalvbox dir TLT}
+ %def\naturalvtop{\normalvtop dir TLT}
+
+\fi
+
+%D \macros
+%D {vcenter}
+%D
+%D Also new: tex mode \type {\vcenter}.
+
+\let\verynormalvcenter \vcenter % since \vcenter can be visualized
+
+\def\vcenter
+ {\normalvbox\bgroup
+ \dowithnextbox{\normalhbox{$\verynormalvcenter{\flushnextbox}$}\egroup}
+ \normalvbox}
+
+% could be \everymathematics
+
+\prependtoks \let\vcenter\normalvcenter \to \everymath
+\prependtoks \let\vcenter\normalvcenter \to \everydisplay
+
+%D \macros
+%D {frozenhbox}
+%D
+%D A not so well unhboxable bxo can be made with:
+
+\def\frozenhbox
+ {\hbox\bgroup\dowithnextbox{\hbox{\hbox{\flushnextbox}}\egroup}\hbox}
+
+%D \macros
+%D {setboxllx,setboxlly,gsetboxllx,gsetboxlly,getboxllx,getboxlly}
+%D
+%D A prelude to an extended \TEX:
+
+% \def\setboxllx #1#2{\bgroup\scratchdimen#2\expanded{\egroup\noexpand\setevalue{b@@x\number#1}{\the\scratchdimen}}}
+% \def\setboxlly #1#2{\bgroup\scratchdimen#2\expanded{\egroup\noexpand\setevalue{b@@y\number#1}{\the\scratchdimen}}}
+%
+% \def\gsetboxllx#1#2{\bgroup\scratchdimen#2\setxvalue{b@@x\number#1}{\the\scratchdimen}\egroup}
+% \def\gsetboxlly#1#2{\bgroup\scratchdimen#2\setxvalue{b@@y\number#1}{\the\scratchdimen}\egroup}
+
+\def\setboxllx#1#2{\setevalue{b@@x\number#1}{\the\dimexpr#2\relax}}
+\def\setboxlly#1#2{\setevalue{b@@y\number#1}{\the\dimexpr#2\relax}}
+
+\def\gsetboxllx{\global\setboxllx}
+\def\gsetboxlly{\global\setboxlly}
+
+\def\getboxllx#1{\executeifdefined{b@@x\number#1}\zeropoint}
+\def\getboxlly#1{\executeifdefined{b@@y\number#1}\zeropoint}
+
+%D \macros
+%D {shownextbox}
+%D
+%D Handy for tracing
+%D
+%D \starttyping
+%D \shownextbox\vbox{test}
+%D \shownextbox\vbox{test\endgraf}
+%D \shownextbox\vbox{test\endgraf\strut\endgraf}
+%D \shownextbox\vbox{test\endgraf\thinrule}
+%D \shownextbox\vbox{\setupwhitespace[big]test\endgraf\thinrule}
+%D \stoptyping
+
+\def\shownextbox
+ {\dowithnextbox
+ {\bgroup
+ \showboxbreadth\maxdimen
+ \showboxdepth \maxdimen
+ \scratchcounter\interactionmode
+ \batchmode
+ \showbox\nextbox
+ \box\nextbox
+ \interactionmode\scratchcounter
+ \egroup}}
+
+\def\spreadhbox#1% rebuilds \hbox{<box><hss><box><hss><box>}
+ {\bgroup
+ \ifhbox#1\relax
+ \setbox2\emptybox
+ \unhbox#1%
+ \doloop
+ {\unpenalty\unskip\unpenalty\unskip\unpenalty\unskip
+ \setbox0\lastbox
+ \ifvoid0
+ \exitloop
+ \else
+ \setbox2\hbox
+ {\ifhbox0 \spreadhbox0\else\box0\fi
+ \ifvoid2 \else\hss\unhbox2\fi}%
+ \fi}%
+ \ifvoid2\else\unhbox2\fi
+ \else
+ \box#1%
+ \fi
+ \egroup}
+
+% makes sense but too much log for overfull boxes:
+%
+% \showboxbreadth\maxdimen
+% \showboxdepth \maxdimen
+
+\protect \endinput
+
+% a bit of test code:
+
+\hbox \bgroup
+ \ruledvbox {\hbox{\strut gans}}
+ \ruledvbox to \lineheight {\hbox{\strut gans}}
+ \ruledvbox to \lineheight {\hbox {gans}}
+ \ruledvbox to \strutheight{\hbox {gans}}
+ \ruledvbox to \strutheight{\hbox{\strut gans}}
+ \ruledvbox to \strutheight{\vss\hbox{gans}}
+\egroup
diff --git a/tex/context/base/supp-dir.mkii b/tex/context/base/supp-dir.mkii
new file mode 100644
index 000000000..41cd1b56f
--- /dev/null
+++ b/tex/context/base/supp-dir.mkii
@@ -0,0 +1,41 @@
+%D \module
+%D [ file=supp-dir,
+%D version=2004.11.11,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Directional Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Inspired by and needed for Adam Lindsay's \XETEX\ efforts:
+%D
+%D \starttyping
+%D \starttext
+%D \input tufte \par
+%D \pardir TRT \input tufte \par \input tufte \par
+%D \pardir TLT \input tufte \par
+%D \stoptext
+%D \stoptyping
+
+\unprotect
+
+\chardef\inlinedirection\zerocount % 0==notset 1==LR 2==RL
+
+\def\pardir#1#2#3% messages end up in a higher level command
+ {\global\TeXXeTstate\plusone
+ \if#2L\chardef\inlinedirection\plusone\else
+ \if#2R\chardef\inlinedirection\plustwo\fi\fi
+ \checkinlinedirection} % needed / added
+
+\def\checkinlinedirection
+ {\ifcase\inlinedirection\or\beginL\or\beginR\fi}
+
+% see core-ini.tex
+%
+% \appendtoks \checkinlinedirection \to \everypar
+
+\protect \endinput
diff --git a/tex/context/base/supp-dir.mkiv b/tex/context/base/supp-dir.mkiv
new file mode 100644
index 000000000..0634bd36f
--- /dev/null
+++ b/tex/context/base/supp-dir.mkiv
@@ -0,0 +1,41 @@
+%D \module
+%D [ file=supp-dir,
+%D version=2004.11.11,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Directional Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We no longer have the \ETEX\ direction primitives.
+
+\unprotect
+
+% \expanded{\defineactivecharacter \number"2000E} {\textdir TRT\relax}
+% \expanded{\defineactivecharacter \number"2000F} {\textdir TLT\relax}
+
+\unexpanded\def\showdirsinmargin
+ {\doifelse{\the\pardir}\!!TLT
+ {\inleft{\normalexpanded{\noexpand\hbox dir TLT{\ttxx[\the\pardir,\the\textdir]}}}}
+ {\inleft{\normalexpanded{\noexpand\hbox dir TLT{\ttxx[\the\pardir,\the\textdir]}}}}}
+
+\bgroup
+ \catcode`L=\othercatcode \gdef\istltdir#1#2#3{\if#2L0\else1\fi}
+ \catcode`R=\othercatcode \gdef\istrtdir#1#2#3{\if#2R0\else1\fi}
+\egroup
+
+\def\istlttextdir{\expandafter\istltdir\the\textdir}
+\def\istrttextdir{\expandafter\istrtdir\the\textdir}
+
+\def\istltpardir {\expandafter\istltdir\the\pardir }
+\def\istrtpardir {\expandafter\istrtdir\the\pardir }
+
+% \ifcase\istlttextdir Y\else N\fi
+% \ifcase\istltpardir Y\else N\fi
+% \ifcase\istltdir TRT\relax Y\else N\fi
+
+\protect \endinput
diff --git a/tex/context/base/supp-emp.mkii b/tex/context/base/supp-emp.mkii
new file mode 100644
index 000000000..15489bca7
--- /dev/null
+++ b/tex/context/base/supp-emp.mkii
@@ -0,0 +1,398 @@
+%D \module
+%D [ file=supp-emp,
+%D version=2000.08.09,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\EMTEX\ specials to \PDF\ conversion,
+%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.
+
+%M \input supp-emp
+
+%D When \THANH, the author of \PDFTEX, and I were exchanging
+%D some emails on \PDFTEX\ functionality, positional
+%D information popped up as potential extension. Actually, it
+%D did not take that much time to cook up the basic
+%D functionality and the author had implemented it before I
+%D could even start to think about real advanced applications.
+%D
+%D I'm sure that \TEX\ programmers can spend many days on how
+%D and what kind of information is needed if you want to have
+%D access to positions, but since high level macros will
+%D probably be used anyway, even things like multiple reference
+%D points have proved to be rather unimportant at the system
+%D level.
+%D
+%D Therefore, \PDFTEX\ provides just these three primitives:
+%D
+%D \starttabulate[|l|l|]
+%D \NC \type {\pdfsavepos} \NC marks the current position \NC \NR
+%D \NC \type {\pdflastxpos} \NC the last marked horizontal position \NC \NR
+%D \NC \type {\pdflastypos} \NC the last marked vertical position \NC \NR
+%D \stoptabulate
+%D
+%D Based on these three primitives, very advanced systems can
+%D be build, and for some time now, \CONTEXT\ has such a
+%D system in its core. However, not everyone uses \CONTEXT, so
+%D we will demonstrate position tracking in generic applications.
+%D
+%D Because \PDFTEX\ produces its output directly, many of those
+%D nice tricks provided by back||ends by means of \type
+%D {\special} fail when producing \PDF\ code directly. Take for
+%D instance \EMTEX\ specials. When someone sent me a mail
+%D asking if \PDFTEX\ did support those specials, the original
+%D answer was \quotation {no}, but in the last few years I have learned
+%D that you must never underestimate \TEX's capabilities.
+%D
+%D I must admit that I never use those specials myself, but
+%D from the way they were used in the macros I was sent, I
+%D learned that they depend on the back||end's capability to
+%D access the current position. For those who know \TEX\ this
+%D may be bad news, since pure \TEX\ does not provide any
+%D positional information. So in order to use those specials,
+%D you must be sure that they are supported by every driver you
+%D use. However, the good news is that \PDFTEX\ does support
+%D position tracking, so here is our generic example.
+%D
+%D The two \EMTEX\ specials we need to implement are packaged
+%D into the macros \type {\EMmoveto} and \type {\EMlineto},
+%D like:
+%D
+%D \starttyping
+%D \def\EMmoveto{\special{em:moveto}}
+%D \def\EMlineto{\special{em:lineto}}
+%D \stoptyping
+%D
+%D They are used in macro packages to draw lines, and the
+%D results are often boxes with content like the following:
+%D
+%D \startbuffer
+%D \vbox to 2cm
+%D {\offinterlineskip \EMmoveto
+%D \hskip 7cm \EMlineto
+%D \vskip 2cm \EMlineto
+%D \vskip-2cm \EMlineto}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This box will contain a triangle, and when typeset, it should
+%D look like:
+%D
+%D \startlinecorrection[blank]
+%D \getbuffer
+%D \stoplinecorrection
+
+\def\EMlinewd{.4}
+
+\ifx\dosetpositionpt\undefined % non context part
+
+%D These two macros can be implemented as follows. When moving
+%D to a position, we only have to register the new coordinates.
+%D Once they are known, we use them to draw a line and
+%D afterwards we save these end coordinates as starting point
+%D for the next line segment. So, at each point specified by
+%D \type {\EMlineto} we need to know the coordinates.
+
+\def\EMmoveto
+ {\EMgetposition\EMlastmovex\EMlastmovey}
+
+%D The primitives \type {\pdflastxpos} and \type
+%D {\pdflastypos} return a number, representing the $x$ and
+%D $y$ coordinate in scaled points, \TEX's smallest unit of
+%D length. We need to convert this number into base points as
+%D used by \POSTSCRIPT\ and \PDF. When done, we insert some
+%D literal \PDF\ code into the text using \type {\pdfliteral}.
+%D Here, the \type {m} means \quote {moveto}, the \type {l}
+%D means \quote {lineto} and the \type {S} operator \quote
+%D {strokes} (draws) the line. The macro \type {\EMlinewd}
+%D holds the linewidth in basepoints.
+
+\def\EMlineto
+ {\bgroup
+ \EMgetposition\EMlastlinex\EMlastliney
+ \count0=\EMlastmovex \advance\count0 -\EMlastlinex
+ \count2=\EMlastmovey \advance\count2 -\EMlastliney
+ \divide\count0 65536
+ \divide\count2 65536
+ \PDFcode{\EMlinewd\space w 0 0 m \the\count0 \space\the\count2 \space l S}%
+ \global\let\EMlastmovex\EMlastlinex
+ \global\let\EMlastmovey\EMlastliney
+ \egroup}
+
+%D We need a fresh start, so we first set the current position
+%D to zero.
+
+\def\resetEMspecials
+ {\gdef\EMlastmovex{0}\gdef\EMlastmovey{0}}
+
+%D Next comes the macro that keeps track of the position. The
+%D current position is marked with \type {\pdfsavepos} and its
+%D coordinates are written to a file whenever the page is
+%D shipped out, since \type {\write} postpones its action
+%D until that moment. The file has entries like:
+%D
+%D \starttyping
+%D \EMsetpos 1 4661756 46651918
+%D \EMsetpos 2 5000359 46990521
+%D \EMsetpos 3 4661756 46313315
+%D \EMsetpos 4 5338962 46990521
+%D \EMsetpos 5 4661756 45974712
+%D \stoptyping
+%D
+%D These lines are written with the command:
+%D
+%D \starttyping
+%D \write\EMfile
+%D {\EMsetpos\number\EMcounter
+%D \space\number\pdflastxpos\space\number\pdflastypos}%
+%D \stoptyping
+%D
+%D In reality the argument to \type {\write} looks slightly
+%D more complicated, because we have to make sure that the
+%D number of the current position is frozen and \type
+%D {\EMsetpos} is not expanded. We do so by explicitly
+%D expanding the number beforehand and preventing expansion of
+%D \type {\EMsetpos}.
+
+\def\EMgetposition#1#2%
+ {\bgroup
+ \pdfsavepos
+ \global\advance\EMcounter 1
+ \expandafter\write\expandafter\EMfile\expandafter
+ {\expandafter\noexpand\expandafter\EMsetpos\number\EMcounter
+ \space\number\pdflastxpos\space\number\pdflastypos}%
+ \EMsetcounters
+ \xdef#1{\the\count0}%
+ \xdef#2{\the\count2}%
+ \egroup}
+
+%D The counter mentioned a few lines ago needs to be
+%D declared before it can be used.
+
+\newcount\EMcounter
+
+%D We also need a dedicated file slot.
+
+\newwrite\EMfile
+
+%D Before we open the file for writing, we read in the data
+%D written in the previous pass, but only if the file is
+%D present.
+
+\def\EMfilename{\jobname.emp}
+
+\def\startEMspecials%
+ {\resetEMspecials
+ \openin\scratchread=\EMfilename \relax
+ \ifeof\scratchread\else \input \EMfilename \relax \fi
+ \closein\scratchread
+ \immediate\openout\EMfile=\EMfilename\relax}
+
+\def\stopEMspecials
+ {\closeout\EMfile}
+
+%D Just to be sure, we test if \type {\scratchread} is defined,
+%D and if not, we allocate a slot.
+
+\ifx\undefined\scratchread \newread\scratchread \fi
+
+%D This leaves us two commands. The \type {\EMsetpos} command
+%D that ends up in the file stores each position in a macro.
+%D When this macro is expanded, it assigns the coordinates to
+%D two scratch counters.
+
+\def\EMsetpos#1 #2 #3 % number x y
+ {\expandafter\xdef\csname EM:#1\endcsname{\count0=#2 \count2=#3}}
+
+%D This position is recalled with its companion macro. First we
+%D set the counters to zero. When the position is unknown,
+%D nothing happens since the \type {\csname...} will expand to
+%D \type {\relax}.
+
+\def\EMsetcounters
+ {\count0=0 \count2=0
+ \csname EM:\the\EMcounter\endcsname}
+
+%D These macros are rather independent of the macro package you
+%D use. For instance, in \CONTEXT\ the following works well:
+%D
+%D \startbuffer[pos-en]
+%D \setuppositioning[unit=ex]
+%D \startpositioning
+%D \dostepwiserecurse{-10}{10}{1}
+%D {\position(0,\recurselevel){\EMmoveto}
+%D \position(\recurselevel,0){\EMlineto}}
+%D \stoppositioning
+%D \stopbuffer
+%D
+%D \startbuffer[pos-nl]
+%D \setuppositioning[uniteenheid=ex]
+%D \startpositioning
+%D \dostepwiserecurse{-10}{10}{1}
+%D {\position(0,\recurselevel){\EMmoveto}
+%D \position(\recurselevel,0){\EMlineto}}
+%D \stoppositioning
+%D \stopbuffer
+%D
+%D \typebuffer[pos-en]
+%D
+%D Here, we hook the \EMTEX\ macros into an existing text
+%D positioning mechanism, which positions the commands
+%D using \TEX's skips and kerns.
+%D
+%D \startlinecorrection[blank]
+%D \getbuffer[pos-nl]
+%D \stoplinecorrection
+%D
+%D Of course one should start and end the file with:
+%D
+%D \starttyping
+%D \startEMspecials
+%D \stopEMspecials
+%D \stoptyping
+%D
+%D and, if needed, reset the begin position at each page using:
+%D
+%D \starttyping
+%D \resetEMspecials
+%D \stoptyping
+
+\fi % end of non context part
+
+\ifx\dosetpositionpt\undefined \else % context part
+
+% \edef\EMlinewd{\withoutpt\the\linewidth}
+
+%D A few pages ago, we mentioned that \CONTEXT\ has built||in
+%D position tracking. This means that when we want to implement
+%D this kind of trickery in this macro package, we can fall
+%D back on existing functionality. In the following alternative
+%D we will also use a few skips. This keeps the source readable
+%D and \CONTEXT\ has plenty of unused registers to accomodate
+%D this strategy.
+
+\newcount\EMcounter \def\EMvariable{EM:\the\EMcounter}
+
+\newskip \EMlastmovex \newskip \EMlastmovey
+\newskip \EMlastlinex \newskip \EMlastliney
+
+\def\resetEMspecials
+ {\global\EMlastmovex=0pt \global\EMlastmovey=\EMlastmovex}
+
+\resetEMspecials \appendtoks\resetEMspecials\to\everyshipout
+
+%D Watch how we reset the specials after a page is flushed. We
+%D don't have to bother about files here, because saving and
+%D recalling is already implemented. Although not needed, we
+%D define the start||stop macros, so that \CONTEXT\ users who
+%D key them in are not confronted with error messages.
+
+\let\startEMspecials\relax \let\stopEMspecials\relax
+
+\def\EMgetposition#1#2%
+ {\global\advance\EMcounter 1
+ \setposition\EMvariable
+ \global#1=\POSx\EMvariable
+ \global#2=\POSy\EMvariable}
+
+\def\EMmoveto
+ {\EMgetposition\EMlastmovex\EMlastmovey}
+
+\def\EMlineto
+ {\EMgetposition\EMlastlinex\EMlastliney
+ \global\advance\EMlastmovex -\EMlastlinex
+ \global\advance\EMlastmovey -\EMlastliney
+ \ScaledPointsToBigPoints{\number\EMlastmovex}\EMx
+ \ScaledPointsToBigPoints{\number\EMlastmovey}\EMy
+ \PDFcode{\EMlinewd\space w 0 0 m \EMx \space \EMy \space l S}%
+ \global\EMlastmovex\EMlastlinex
+ \global\EMlastmovey\EMlastliney}
+
+%D The command \type {\setposition} registers a position by
+%D name (here \type {\EMvariable}), while \type {\POSx} and
+%D \type {\POSy} give you access to the coordinates.
+%D
+%D These three commands are containes in a suite of low level
+%D commands that can be used to register and get access to
+%D positional information. The current mechanism is not yet
+%D complete, but already provides enough hooks for advanced
+%D embedded graphics. Its functionality is a natural extension
+%D to the \METAPOST\ support already present in \CONTEXT.
+%D Therefore, more advanced examples can be found in the
+%D \METAFUN\ manual, since they fall beyond the scope of this
+%D module.
+
+\fi % end of context part
+
+%D As a bonus, I will now provide a few macros that will make
+%D this mechanism transparant to \DVI\ as well as \PDF\
+%D output. We will use \type {\pdfiteral} as trigger.
+
+\ifx\PDFcode\undefined
+ \ifx\pdfliteral\undefined
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else
+ \let\PDFcode\pdfliteral
+ \fi
+\fi
+
+\ifx\PDFcode\undefined
+ \def\EMpdfordvi#1#2{#2}
+\else\ifx\pdfoutput\undefined
+ \def\EMpdfordvi#1#2{#2}
+\else
+ \def\EMpdfordvi#1#2{\ifcase\pdfoutput#2\else#1\fi}
+\fi\fi
+
+
+%D We save some of the macros we defined previously:
+
+\let\pdfEMmoveto\EMmoveto \let\pdfstartEMspecials\startEMspecials
+\let\pdfEMlineto\EMlineto \let\pdfstopEMspecials \stopEMspecials
+
+%D We now redefine them to support \DVI\ and \PDF.
+
+\def\EMmoveto{\EMpdfordvi\pdfEMmoveto{\special{em:moveto}}}
+\def\EMlineto{\EMpdfordvi\pdfEMlineto{\special{em:lineto}}}
+
+\def\startEMspecials{\EMpdfordvi\pdfstartEMspecials\relax}
+\def\stopEMspecials {\EMpdfordvi\pdfstopEMspecials \relax}
+
+%D If there is any real demand for this in \CONTEXT, I will
+%D hook these macros in the special drivers, so that their
+%D support becomes more natural.
+
+%D You may want to change the default linewidth. The following
+%D macro does the job. Beware of the fact that \type
+%D {\special}'s may interfere with the typesetting process.
+%D
+%D \starttyping
+%D \setEMlinewidth{1pt}
+%D \stoptyping
+
+\def\setEMlinewidth#1% this could be done more efficient for
+ {\bgroup % context alone, but it's a hack anyway
+ \dimen0=#1\relax
+ \count0=\dimen0
+ \divide\count0 65536
+ \pdfordvi\relax{\special{em:linewidth \the\dimen0}}%
+ \xdef\EMlinewd{\the\count0}%
+ \egroup}
+
+%D You may wonder to what extent positional tracking is
+%D \PDFTEX\ specific. In \CONTEXT, we also support position
+%D tracking in \DVI\ by using specials and analyzing the \DVI\
+%D file afterwards using \DVIPOS. Since many of the advanced
+%D \TEX\ features depend on some kind of back||end, we don't
+%D consider it to be a disadvantage. Of course, the \PDFTEX\
+%D way is not only cleaner, but also faster. It was more out
+%D of curiosity than out of need that we provided the \DVI\
+%D methods as well. Also, it is always good to have more roads
+%D to reach the same goal.
+
+\endinput
diff --git a/tex/context/base/supp-eps.mkii b/tex/context/base/supp-eps.mkii
new file mode 100644
index 000000000..5684b25dd
--- /dev/null
+++ b/tex/context/base/supp-eps.mkii
@@ -0,0 +1,202 @@
+%D \module
+%D [ file=supp-eps,
+%D version=1998.05.06,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\EPS\ tools,
+%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.
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+%D The macros in this module are rather old and were originally
+%D part of the figure inclusion macros. When \PDFTEX\ started
+%D to support \PDF\ inclusion, where some accompanying macros
+%D were put in \type{supp-pdf}, I considered it more suitable
+%D to give the \EPS\ macros their own module.
+
+\writestatus{loading}{ConTeXt Support Macros / EPS}
+
+%D \macros
+%D {dogetEPSboundingbox}
+%D
+%D The predecessors of the following macro's are derived from
+%D Thomas Rockicky's macro's. They are rewritten to a more
+%D compact form, made a bit more robust and also handle the
+%D \type{HiResBoundingBox} and \type{ExactBoundingBox} that
+%D are sometimes present.
+%D
+%D A bounding box has the form:
+%D
+%D \starttyping
+%D %%BoundingBox: llx lly urx ury
+%D \stoptyping
+%D
+%D Before we scan the file, we have to reset special
+%D characters and set some others. The percentage symbol also
+%D needs special treatment. When a bounding box is
+%D encountered, we keep on scanning until no more directives
+%D are found, i.e. a line is found that does not start with a
+%D percentage symbol. We also abort scanning after finding a
+%D high resolution bounding box.
+%D
+%D This method also works inside verbatim mode (like when we
+%D are typesetting sources and putting eps coded logos into
+%D a heading. Temporary restoring the \CATCODES\ is done in
+%D the calling routine.
+%D
+%D The creator as well as external support for specials are
+%D analyzed as well and their status is available in \type
+%D {\EPScreator} and \type {\EPSshading}. The boundingbox
+%D components are available in \type {\EPSllx} etc.
+
+\unprotect
+
+\def\EPSllx{0} \let\MPllx\EPSllx % just in case these
+\def\EPSlly{0} \let\MPlly\EPSlly % are used while running
+\def\EPSurx{0} \let\MPurx\EPSurx % in fast mode we set
+\def\EPSury{0} \let\MPury\EPSury % them to 0.
+
+\chardef\EPSfound =0
+\chardef\EPScreator=0
+\chardef\EPSspecial=0
+\chardef\EPSstatus =0
+
+\let\EPScreatorstring\empty
+
+\newtoks\extraEPSpreambleresets
+\newtoks\extraEPSpreambleparsers
+
+\def\dofinishEPSfile{\dofinishfile} % no \let, can be overloaded
+
+\def\dogetEPSboundingbox#1#2#3#4#5%
+ {\bgroup
+ \global\chardef\EPSfound \zerocount
+ \global\chardef\EPScreator\zerocount
+ \global\chardef\EPSspecial\zerocount
+ \global\chardef\EPSstatus \zerocount
+ \global\let\EPScreatorstring\empty
+ \the\extraEPSpreambleresets
+ \uncatcodespecials
+ \catcode`\^^M=\@@ignore
+ \def\doprocessEPSline
+ {\advance\scratchcounter\plusone
+ \expandafter\checkEPSboundingbox\fileline\empty\empty:.:.\end}%
+ \scratchcounter\zerocount
+ \doprocessfile\scratchread{#1}\doprocessEPSline
+ \egroup
+ % Using \EPSllx bp instead of \dimen0=1bp and \EPSllx\dimen0 is more accurate (.005pt).
+ \ifnum\EPSfound>\zerocount
+ #2\dimexpr\EPSllx\onebasepoint \relax
+ #3\dimexpr\EPSlly\onebasepoint \relax
+ #4\dimexpr\EPSurx\onebasepoint-#2\relax
+ #5\dimexpr\EPSury\onebasepoint-#3\relax
+ \else
+ #2\zeropoint
+ #3\zeropoint
+ #4\zeropoint
+ #5\zeropoint
+ \fi
+ %\message{[bbox #1: \EPSllx\space\EPSurx\space\EPSlly\space\EPSury]}\wait
+ \global\let\MPllx\EPSllx \global\let\MPlly\EPSlly
+ \global\let\MPurx\EPSurx \global\let\MPury\EPSury}
+
+\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+\def\EPSboundingboxtag {BoundingBox}
+\def\EPShiresboundingboxtag{HiResBoundingBox}
+\def\EPSexactboundingboxtag{ExactBoundingBox}
+\def\EPScreatortag {Creator}
+\def\EPSmetaposttag {MetaPost}
+\def\EPSmetapostspecialtag {MetaPostSpecial}
+\def\EPSmetapostspecialstag{MetaPostSpecials}
+\def\EPSpagetag {Page}
+
+\let\EPSspecialstring \empty
+\let\EPSspecialcontent\empty
+
+% new metapost construct (hires bb followed by creator + version)
+%
+%!PS
+%%BoundingBox: -71 -1 651 496
+%%HiResBoundingBox: -70.9945 -0.5 650.5 495.24907
+%%Creator: MetaPost 0.901
+%%CreationDate: 2005.06.02:1633
+%%Pages: 1
+
+\long\def\checkEPSboundingbox#1#2#3:#4:.#5\end
+ {\if\string#1\letterpercent
+ \if\string#2\letterpercent
+ \edef\EPSspecialstring{#3}%
+ \edef\EPSspecialcontent{#4}%
+ \ifx\EPSspecialstring\EPScreatortag
+ \getEPScreatorspec
+ \else\ifx\EPSspecialstring\EPSboundingboxtag
+ \getEPSboundingboxspec
+ \global\chardef\EPSfound\plusone
+ \else\ifx\EPSspecialstring\EPShiresboundingboxtag
+ \getEPSboundingboxspec
+ \global\chardef\EPSfound\plustwo
+ \scratchcounter\zerocount
+ \else\ifx\EPSspecialstring\EPSexactboundingboxtag
+ \getEPSboundingboxspec
+ \global\chardef\EPSfound\plustwo
+ \scratchcounter\zerocount
+ \else\ifx\EPSspecialstring\EPSmetapostspecialtag % only before finish!
+ \global\chardef\EPSspecial\plusone % ah, we've met some MP extensions
+ \else\ifx\EPSspecialstring\EPSmetapostspecialstag % only before finish!
+ \global\chardef\EPSspecial\plusone % ah, we've met some MP extensions
+ \else\ifx\EPSspecialstring\EPSpagetag
+ \global\chardef\EPSstatus \plusone % we passed MP font defs
+ \else
+ \the\extraEPSpreambleparsers
+ \fi\fi\fi\fi\fi\fi\fi
+ \fi
+ \else\ifnum\EPSfound>\zerocount
+ % bb found
+ \ifnum\EPScreator=\plusone % that is, we are dealing with MP output
+ \ifcase\EPSstatus
+ % we've run into MP fontdefs
+ \or
+ \dofinishEPSfile
+ \fi
+ \else\ifnum\scratchcounter>\plusthree
+ % too late for mps creator (we don't want to run into crap data)
+ \dofinishEPSfile
+ \else
+ \fi\fi
+ \fi\fi}
+
+\def\getEPSboundingboxspec
+ {\edef\EPSspecialstring{\EPSspecialcontent\space . . . . }%
+ \expandafter\dogetEPSboundingboxspec\EPSspecialstring\end}
+
+\def\dogetEPSboundingboxspec#1 #2 #3 #4 #5\end
+ {\gdef\EPSllx{#1}%
+ \ifx\EPSllx\empty
+ \dogetEPSboundingboxspec#2 #3 #4 #5\end
+ \else
+ \gdef\EPSlly{#2}%
+ \gdef\EPSurx{#3}%
+ \gdef\EPSury{#4}%
+ \fi}
+
+\def\getEPScreatorspec
+ {\edef\EPSspecialstring{\EPSspecialcontent\space . .}%
+ \expandafter\dogetEPScreatorspec\EPSspecialstring\end}
+
+\def\dogetEPScreatorspec#1#2 #3\end
+ {\edef\EPScreatorstring{#1#2}%
+ \global\chardef\EPScreator\ifx\EPScreatorstring\EPSmetaposttag\plusone\else\zerocount\fi\relax}
+
+\def\dogetEPSpreambledata#1% can be combined with \extraEPSpreambleparsers
+ {\bgroup
+ \let\dofinishEPSfile\relax % dirty trick, read past all bboxes
+ \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/supp-fil.lua b/tex/context/base/supp-fil.lua
new file mode 100644
index 000000000..8d69f64a7
--- /dev/null
+++ b/tex/context/base/supp-fil.lua
@@ -0,0 +1,279 @@
+if not modules then modules = { } end modules ['supp-fil'] = {
+ version = 1.001,
+ comment = "companion to supp-fil.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>It's more convenient to manipulate filenames (paths) in
+<l n='lua'/> than in <l n='tex'/>. These methods have counterparts
+at the <l n='tex'/> side.</p>
+--ldx]]--
+
+local find, gsub, match, format, concat = string.find, string.gsub, string.match, string.format, table.concat
+local texsprint, texwrite, ctxcatcodes = tex.sprint, tex.write, tex.ctxcatcodes
+
+local trace_modules = false trackers.register("modules.loading", function(v) trace_modules = v end)
+
+support = support or { }
+environment = environment or { }
+
+environment.outputfilename = environment.outputfilename or environment.jobname
+
+function support.checkfilename(str) -- "/whatever..." "c:..." "http://..."
+ commands.chardef("kindoffile",boolean.tonumber(find(str,"^/") or find(str,"[%a]:")))
+end
+
+function support.thesanitizedfilename(str)
+ texwrite((gsub(str,"\\","/")))
+end
+
+function support.splitfilename(fullname)
+ local path, name, base, suffix, kind = '', fullname, fullname, '', 0
+ local p, n = match(fullname,"^(.+)/(.-)$")
+ if p and n then
+ path, name, base = p, n, n
+ end
+ local b, s = match(base,"^(.+)%.(.-)$")
+ if b and s then
+ name, suffix = b, s
+ end
+ if path == "" then
+ kind = 0
+ elseif path == '.' then
+ kind = 1
+ else
+ kind = 2
+ end
+ commands.def("splitofffull", fullname)
+ commands.def("splitoffpath", path)
+ commands.def("splitoffbase", base)
+ commands.def("splitoffname", name)
+ commands.def("splitofftype", suffix)
+ commands.chardef("splitoffkind", kind)
+end
+
+function support.splitfiletype(fullname)
+ local name, suffix = fullname, ''
+ local n, s = match(fullname,"^(.+)%.(.-)$")
+ if n and s then
+ name, suffix = n, s
+ end
+ commands.def("splitofffull", fullname)
+ commands.def("splitoffpath", "")
+ commands.def("splitoffname", name)
+ commands.def("splitofftype", suffix)
+end
+
+function support.doifparentfileelse(n)
+ commands.testcase(n==environment.jobname or n==environment.jobname..'.tex' or n==environment.outputfilename)
+end
+
+-- saves some .15 sec on 12 sec format generation
+
+local lastexistingfile = ""
+
+function support.doiffileexistelse(name)
+ if not name or name == "" then
+ lastexistingfile = ""
+ else
+ lastexistingfile = resolvers.findtexfile(name) or ""
+ end
+ return commands.testcase(lastexistingfile ~= "")
+end
+
+function support.lastexistingfile()
+ texsprint(ctxcatcodes,lastexistingfile)
+end
+
+-- more, we can cache matches
+
+local finders, loaders, openers = resolvers.finders, resolvers.loaders, resolvers.openers
+
+local found = { } -- can best be done in the resolver itself
+
+-- todo: tracing
+
+local function readfilename(specification,backtrack,treetoo)
+ local fnd = found[specification]
+ if not fnd then
+ local splitspec = resolvers.splitmethod(specification)
+ local filename = splitspec.path or ""
+ if lfs.isfile(filename) then
+ fnd = filename
+ end
+ if not fnd and backtrack then
+ local fname = filename
+ for i=1,backtrack,1 do
+ fname = "../" .. fname
+ if lfs.isfile(fname) then
+ fnd = fname
+ break
+ end
+ end
+ end
+ if not fnd and treetoo then
+--~ fnd = resolvers.find_file(filename)
+ fnd = resolvers.findtexfile(filename)
+ end
+ found[specification] = fnd
+ end
+ return fnd or ""
+end
+
+support.readfilename = readfilename
+
+function finders.job(filename) return readfilename(filename,nil,false) end -- current path, no backtracking
+function finders.loc(filename) return readfilename(filename,2, false) end -- current path, backtracking
+function finders.sys(filename) return readfilename(filename,nil,true ) end -- current path, obeys tex search
+function finders.fix(filename) return readfilename(filename,2, false) end -- specified path, backtracking
+function finders.set(filename) return readfilename(filename,nil,false) end -- specified path, no backtracking
+function finders.any(filename) return readfilename(filename,2, true ) end -- loc job sys
+
+openers.job = openers.generic loaders.job = loaders.generic
+openers.loc = openers.generic loaders.loc = loaders.generic
+openers.sys = openers.generic loaders.sys = loaders.generic
+openers.fix = openers.generic loaders.fix = loaders.generic
+openers.set = openers.generic loaders.set = loaders.generic
+openers.any = openers.generic loaders.any = loaders.generic
+
+function support.doreadfile(protocol,path,name) -- better do a split and then pass table
+ local specification
+ if url.hasscheme(name) then
+ specification = name
+ else
+ specification = ((path == "") and format("%s:///%s",protocol,name)) or format("%s:///%s/%s",protocol,path,name)
+ end
+ texsprint(ctxcatcodes,resolvers.findtexfile(specification))
+end
+
+-- modules can only have a tex or mkiv suffix or can have a specified one
+
+local prefixes = { "m", "p", "s", "x", "t" }
+local suffixes = { "tex", "mkiv" }
+local modstatus = { }
+
+local function usemodule(name,hassheme)
+ local foundname
+ if hasscheme then
+ -- no auto suffix as http will return a home page or error page
+ -- so we only add one if missing
+ local fullname = file.addsuffix(name,"tex")
+ if trace_modules then
+ logs.report("modules","checking scheme driven file '%s'",fullname)
+ end
+ foundname = resolvers.findtexfile(fullname) or ""
+ elseif file.extname(name) ~= "" then
+ if trace_modules then
+ logs.report("modules","checking suffix driven file '%s'",name)
+ end
+ foundname = support.readfilename(name,false,true) or ""
+ else
+ for i=1,#suffixes do
+ local fullname = file.addsuffix(name,suffixes[i])
+ if trace_modules then
+ logs.report("modules","checking suffix driven file '%s'",fullname)
+ end
+ foundname = support.readfilename(fullname,false,true) or ""
+ if foundname ~= "" then
+ break
+ end
+ end
+ end
+ if foundname ~= "" then
+ if trace_modules then
+ logs.report("modules","loading '%s'",foundname)
+ end
+ context.startreadingfile()
+ context.input(foundname)
+ context.stopreadingfile()
+ return true
+ else
+ return false
+ end
+end
+
+function support.usemodules(prefix,askedname,truename)
+ local hasprefix = prefix and prefix ~= ""
+ local hashname = ((hasprefix and prefix) or "*") .. "-" .. truename
+ local status = modstatus[hashname]
+ if status == 0 then
+ -- not found
+ elseif status == 1 then
+ status = status + 1
+ else
+ if trace_modules then
+ logs.report("modules","locating '%s'",truename)
+ end
+ local hasscheme = url.hasscheme(truename)
+ if hasscheme then
+ -- no prefix and suffix done
+ if usemodule(truename,true) then
+ status = 1
+ else
+ status = 0
+ end
+ elseif hasprefix then
+ if usemodule(prefix .. "-" .. truename) then
+ status = 1
+ else
+ status = 0
+ end
+ else
+ for i=1,#prefixes do
+ -- todo: reconstruct name i.e. basename
+ local thename = prefixes[i] .. "-" .. truename
+ if usemodule(thename) then
+ status = 1
+ break
+ end
+ end
+ if status then
+ -- ok, don't change
+ elseif usemodule(truename) then
+ status = 1
+ else
+ status = 0
+ end
+ end
+ end
+ if status == 0 then
+ if trace_modules then
+ logs.report("modules","skipping '%s' (not found)",truename)
+ else
+ interfaces.showmessage("systems",6,askedname)
+ end
+ elseif status == 1 then
+ if not trace_modules then
+ interfaces.showmessage("systems",5,askedname)
+ end
+ else
+ if trace_modules then
+ logs.report("modules","skipping '%s' (already loaded)",truename)
+ else
+ interfaces.showmessage("systems",7,askedname)
+ end
+ end
+ modstatus[hashname] = status
+end
+
+statistics.register("loaded tex modules", function()
+ if next(modstatus) then
+ local t, f = { }, { }
+ for k, v in table.sortedhash(modstatus) do
+ k = file.basename(k)
+ if v == 0 then
+ f[#f+1] = k
+ else
+ t[#t+1] = k
+ end
+ end
+ local ts = (#t>0 and format(" (%s)",concat(t," "))) or ""
+ local fs = (#f>0 and format(" (%s)",concat(f," "))) or ""
+ return format("%s requested, %s found%s, %s missing%s",#t+#f,#t,ts,#f,fs)
+ else
+ return nil
+ end
+end)
diff --git a/tex/context/base/supp-fil.mkii b/tex/context/base/supp-fil.mkii
new file mode 100644
index 000000000..fc0492442
--- /dev/null
+++ b/tex/context/base/supp-fil.mkii
@@ -0,0 +1,710 @@
+%D \module
+%D [ file=supp-fil,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Files,
+%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 \TEX\ operates on files, so one wouldn't wonder that there
+%D is a separate module for file support. In \CONTEXT\ files
+%D are used for several purposes:
+%D
+%D \startitemize[packed]
+%D \item general textual input
+%D \item logging status information
+%D \item saving registers, lists and references
+%D \item buffering defered textual input
+%D \stopitemize
+%D
+%D When dealing with files we can load them as a whole, using
+%D the \type{\input} primitive or load them on a line||by||line
+%D basis, using \type{\read}. Writing is always done line by
+%D line, using \type{\write}.
+
+\writestatus{loading}{ConTeXt Support Macros / Files}
+
+\unprotect
+
+\ifx\undefined\f!pathseparator
+ \def\f!pathseparator{/}
+ \def\f!currentpath {.}
+ \def\f!parentpath {..}
+\fi
+
+\def\openinputfile #1#2{\immediate\openin #1="#2"\relax} \def\closeinputfile #1{\immediate\closein #1}
+\def\openoutputfile#1#2{\immediate\openout#1="#2"\relax} \def\closeoutputfile#1{\immediate\closeout#1}
+
+%D \macros
+%D {pushendofline,popendofline}
+%D
+%D When we are loading files in the middle of the typesetting
+%D process, for instance when we load references, we have to be
+%D sure that the reading process does not generate so called
+%D 'spurious spaces'. This can be prevented by assigning the
+%D line ending character the \CATCODE\ comment. This is
+%D accomplished by
+%D
+%D \starttyping
+%D \pushendofline
+%D ... reading ...
+%D \popendofline
+%D \stoptyping
+%D
+%D Just to be sure, we save the current meaning of \type{^^M}
+%D in \type{\poppedendofline}.
+
+% \chardef\poppedendofline\catcode`\^^M
+%
+% \def\pushendofline
+% {\chardef\poppedendofline\catcode`\^^M\relax
+% \catcode`\^^M\@@comment\relax}
+%
+% \def\popendofline
+% {\catcode`\^^M\poppedendofline}
+%
+% support for nested usage:
+
+\newcount \endoflinelevel
+
+\ifx\newlinecode\undefined \chardef\newlinecode=`\^^M \fi
+
+\def\pushendofline
+ {\advance\endoflinelevel\plusone
+ \expandafter\chardef\csname :eol:\number\endoflinelevel\endcsname\catcode\newlinecode
+ \catcode\newlinecode\@@comment\relax}
+
+\def\popendofline
+ {\catcode\newlinecode\csname :eol:\number\endoflinelevel\endcsname
+ \advance\endoflinelevel\minusone}
+
+\def\restoreendofline
+ {\catcode\newlinecode\@@endofline}
+
+%D \macros
+%D {scratchread, scratchwrite}
+%D
+%D We define a scratch file for reading. Keep in mind that
+%D the number of files is limited to~16, so use this one when
+%D possible. We also define a scratch output file.
+
+\ifx\undefined\scratchread \newread \scratchread \fi
+\ifx\undefined\scratchwrite \newwrite\scratchwrite \fi
+
+%D \macros
+%D {unlinkfile}
+%D
+%D Sometimes we want to make sure a file is deleted, so here
+%D is a macro that does the job. It's named after the \PERL\
+%D one.
+
+\def\unlinkfile#1%
+ {\openoutputfile \scratchwrite{#1}%
+ \closeoutputfile\scratchwrite}
+
+%D \macros
+%D {writeln}
+%D
+%D This saves a few tokens:
+
+\def\writeln#1{\write#1{}}
+
+\def\doiffileexistselse#1%
+ {\doifelsenothing{#1}
+ {\secondoftwoarguments}
+ {\openinputfile\scratchread{#1}%
+ \ifeof\scratchread
+ \closeinputfile\scratchread
+ \expandafter\secondoftwoarguments
+ \else
+ \closeinputfile\scratchread
+ \expandafter\firstoftwoarguments
+ \fi}}
+
+%D \macros
+%D {doprocessfile,fileline,fileprocessedtrue,dofinishfile}
+%D
+%D The next macro offers a framework for processing files on a
+%D line by line basis.
+%D
+%D \starttyping
+%D \doprocessfile \identifier {name} \action
+%D \stoptyping
+%D
+%D The first argument can for instance be \type{\scratchread}.
+%D The action must do something with \type{\fileline}, which
+%D holds the current line. One can halfway step out using
+%D \type{\dofinishfile} and ise \type{\iffileprocessed} to
+%D see if indeed some content was found.
+
+\newif\iffileprocessed
+
+\let\fileline\empty
+
+\def\doprocessfile#1#2#3%
+ {\openinputfile{#1}{#2}%
+ \ifeof#1%
+ \fileprocessedfalse
+ \closeinputfile#1%
+ \else
+ \fileprocessedtrue
+ \gdef\dofinishfile
+ {\closeinputfile#1%
+ \global\let\doprocessline\relax}%
+ \gdef\doprocessline
+ {\ifeof#1%
+ \expandafter\dofinishfile
+ \else
+ \global\read#1 to \fileline
+ #3\relax
+ \expandafter\doprocessline
+ \fi}%
+ \expandafter\doprocessline
+ \fi}
+
+%D \macros
+%D {pathplusfile,assignfullfilename,sanitizefilename}
+%D
+%D Use \type{\pathplusfile} to compose a full file name, like
+%D in:
+%D
+%D \starttyping
+%D \pathplusfile{path}{file}
+%D \stoptyping
+%D
+%D By default, this expands into {\tt \pathplusfile{path}{file}}.
+
+\def\pathplusfile#1#2{#1\f!pathseparator#2}
+
+%D This one constructs a filename from a (possible empty)
+%D path and filename.
+
+\def\assignfullfilename#1#2\to#3%
+ {\doifelsenothing{#1}
+ {\edef#3{#2}}
+ {\edef#3{#1\f!pathseparator#2}}}
+
+%D For the moment, we limit sanitizing to taking care of
+%D active \type {/}.
+
+\bgroup % todo: _ cleanup
+
+\catcode`\/=\@@active
+\catcode`\:=\@@active
+\catcode`\~=\@@active
+\catcode`\_=\@@active
+
+\gdef\sanitizefilename#1\to#2%
+ {\bgroup
+ \edef/{\string/}%
+ \edef:{\string:}%
+ \edef~{\string~}%
+ \edef_{\string_}%
+ \retainlccodes
+ \lccode`\\=`\/
+ \lowercase{\expanded{\xdef\noexpand\sanitizedfilename{#1}}}%
+ \egroup
+ \let#2\sanitizedfilename}
+
+\egroup
+
+%D NEW:
+
+\chardef\kindoffile=0 % 0=normal 1=full path spec (or http)
+
+\def\checkfilename#1%
+ {\doifinstringelse{@@/}{@@#1}% unix: /full/path
+ {\chardef\kindoffile\plusone}
+ {\doifinstringelse{:/}{#1}% windows: e:/full/path or http://
+ {\chardef\kindoffile\plusone}
+ {\chardef\kindoffile\zerocount}}}
+
+%D \macros
+%D {input, normalinput}
+%D
+%D Sometimes we run into troubles when \type {\input} wants to get
+%D expanded, e.g. in a \type {\write} (which happens in the metafun
+%D manual when we permit long MP lines). So, instead of fixing that,
+%D we go for a redefinition of \type {\input}. Of course it's better
+%D to use \type {\readfile} or \type {\processfile}.
+
+\unexpanded\def\input{\normalinput}
+
+\def\inputgivenfile#1{\normalinput"#1"\relax}
+
+%D \macros
+%D {readfile,ReadFile,maxreadlevel}
+%D
+%D One cannot be sure if a file exists. When no file can be
+%D found, the \type{\input} primitive gives an error message
+%D and switches to interactive mode. The macro \type{\readfile}
+%D takes care of non||existing files. This macro has two faces.
+%D
+%D \starttyping
+%D \ReadFile {filename}
+%D \readfile {filename} {before loading} {not found}
+%D \stoptyping
+%D
+%D Many \TEX\ implementations have laid out some strategy for
+%D locating files. This can lead to unexpected results,
+%D especially when one loads files that are not found in the
+%D current directory. Let's give an example of this. In
+%D \CONTEXT\ illustrations can be defined in an external file.
+%D The resizing macro first looks if an illustration is defined
+%D in the local definitions file. When no such file is found,
+%D it searches for a global file and when this file is not
+%D found either, the illustration itself is scanned for
+%D dimensions. One can imagine what happens if an adapted,
+%D localy stored illustration, is scaled according to
+%D dimensions stored somewhere else.
+%D
+%D When some \TEX\ implementation starts looking for a file, it
+%D normally first looks in the current directory. When no file
+%D is found, \TEX\ starts searching on the path where format
+%D and|/|or style files are stored. Depending on the implementation
+%D this can considerably slow down processing speed.
+%D
+%D In \CONTEXT, we support a project||wise ordening of files.
+%D In such an approach it seems feasible to store common files
+%D in a lower directory. When for instance searching for a
+%D general layout file, we therefore have to backtrack.
+%D
+%D These three considerations have lead to a more advanced
+%D approach for loading files.
+%D
+%D We first present an earlier implementation of
+%D \type{\readfile}. This command backtracks parent
+%D directories, upto a predefined level. Users can change this
+%D level, but we default to~3.
+%D
+%D \starttyping
+%D \def\maxreadlevel {3}
+%D \stoptyping
+%D
+%D This is a pseudo \COUNTER.
+%D
+%D We use \type{\normalinput} instead of \type{\input}
+%D because we want to be able to redefine the original
+%D \type{\input} when needed, for instance when loading third
+%D party libraries.
+
+\newevery \everybeforereadfile \EveryBeforeReadFile
+\newevery \everyafterreadfile \EveryAfterReadFile
+
+\let \everyreadfile \everybeforereadfile
+
+\newif\iftracefiles
+
+\newcount\readlevel
+
+\def\maxreadlevel{3}
+
+\newconditional\trackfilenames
+\let\trackedfilename\empty
+
+% We need to postpone loading, else we got frozen type-* files and so when
+% a format is generated on a source path.
+
+\def\doreadfile#1#2#3#4%
+ {\sanitizefilename#2\to\readfilename
+ \ifx\readfilename\empty
+ % silently ignore
+ \else
+ \let\trackedfilename\readfilename
+ \ifconditional\trackfilenames
+ \doifundefinedelse{fn..\trackedfilename}\donetrue\donefalse
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \checkfilename\readfilename
+ \ifcase\kindoffile
+ \iftracefiles\writestatus\m!systems{searching for \readfilename\space on #1}\fi
+ % not a full path or url, check for existence
+ \doifelsenothing{#1}
+ {\def\next{\redoreadfile\readfilename{#3}{#4}}}%
+ {\def\next{\redoreadfile{\pathplusfile{#1}{\readfilename}}{#3}{#4}}}%
+ \else
+ % a full path or url, no further checking done
+ \doiffileexistselse\readfilename
+ {\iftracefiles\writestatus\m!systems{located \readfilename}\fi
+ \def\next{#3\dodoreadfile}}%
+ {\iftracefiles\writestatus\m!systems{not found \readfilename}\fi
+ \def\next{#4}}%
+ \fi
+ \else
+ \edef\readfilename{\getvalue{fn..\readfilename}}%
+ \iftracefiles\writestatus\m!systems{already located \readfilename}\fi
+ \def\next{#3\dodoreadfile}%
+ \fi
+ \expandafter\next
+ \fi}
+
+\def\redoreadfile#1#2#3%
+ {\doiffileexistselse{#1}%
+ {\edef\readfilename{#1}%
+ \iftracefiles\writestatus\m!systems{#1 located}\fi
+ \def\next{#2\dodoreadfile}}%
+ {\iftracefiles\writestatus\m!systems{cannot locate #1}\fi
+ \advance\readlevel\minusone
+ \ifnum\readlevel>\zerocount
+ \edef\readfilename{\pathplusfile{\f!parentpath}{\readfilename}}%
+ \def\next{\redoreadfile\readfilename{#2}{#3}}%
+ \else
+ \def\next{#3}%
+ \fi}%
+ \next}
+
+\def\dodoreadfile % we provide hooks, for instance for \enableXML
+ {\ifconditional\trackfilenames
+ \setxvalue{fn..\trackedfilename}{\readfilename}%
+ \fi
+ \the\everybeforereadfile
+% \normalinput\readfilename\relax
+ \relax\inputgivenfile\readfilename\relax
+ \the\everyafterreadfile}
+
+% too less:
+%
+% \unexpanded\def\readfile% #1%
+% {\readlevel\maxreadlevel
+% \doreadfile\empty} % {#1}
+%
+% too much:
+%
+% \unexpanded\def\readfile#1#2#3%
+% {\readlocfile{#1}{#2}
+% {\readjobfile{#1}{#2}
+% {\readsysfile{#1}{#2}{#3}}}}
+%
+% just ok:
+
+\unexpanded\def\readfile#1#2#3%
+ {\readlocfile{#1}{#2}{\readsysfile{#1}{#2}{#3}}}
+
+\def\readtexfile#1#2#3%
+ {\pushcatcodetable \catcodetable \ctxcatcodes
+ \readfile{#1}{#2}{#3}%
+ \popcatcodetable}
+
+\ifdefined\xmlcatcodes \else \let\xmlcatcodes\xmlcatcodesn \fi
+
+\def\readxmlfile#1#2#3%
+ {\pushcatcodetable \catcodetable \xmlcatcodes
+ \readfile{#1}{#2}{#3}%
+ \popcatcodetable}
+
+\unexpanded\def\ReadFile#1%
+ {\readfile{#1}\donothing\donothing}
+
+%D \macros
+%D {readjobfile,readlocfile,readsysfile,
+%D readfixfile,readsetfile}
+%D
+%D This implementation honnors the third situation, but we
+%D still can get unwanted files loaded and/or can get involved
+%D in extensive searching.
+%D
+%D Due to different needs, we decided to offer four alternative
+%D loading commands. With \type{\readjobfile} we load a local
+%D file and do no backtracking, while \type{\readlocfile}
+%D backtracks~\number\readlevel\ directories, including the current
+%D one.
+
+\unexpanded\def\readjobfile % #1% current path, no backtracking
+ {\readlevel\zerocount
+ \doreadfile\f!currentpath} % {#1}}
+
+\unexpanded\def\readlocfile % #1% current path, backtracking
+ {\readlevel\maxreadlevel
+ \doreadfile\f!currentpath} % {#1}}
+
+%D System files can be anywhere and therefore
+%D \type{\readsysfile} is not bound to the current directory
+%D and obeys the \TEX\ implementation.
+
+\unexpanded\def\readsysfile % #1% current path, obeys tex search
+ {\readlevel\zerocount
+ \doreadfile\empty} % {#1}}
+
+%D Of the last two, \type{\readfixfile} searches on the
+%D directory specified and backtracks too, while
+%D \type{\readsetfile} does only search on the specified path.
+
+\unexpanded\def\readfixfile % #1#2% specified path, backtracking
+ {\readlevel\maxreadlevel
+ \doreadfile} % {#1}{#2}}
+
+\unexpanded\def\readsetfile % #1#2% specified path, no backtracking
+ {\readlevel\zerocount
+ \doreadfile} % {#1}{#2}}
+
+%D After having defined this commands, we reconsidered the
+%D previously defined \type{\readfile}. This time we more or
+%D less impose the search order.
+
+\unexpanded\def\readfile#1#2#3%
+ {\readlocfile{#1}{#2}
+ {\readjobfile{#1}{#2}
+ {\readsysfile{#1}{#2}{#3}}}}
+
+%D So now we've got ourselves five file loading commands:
+%D
+%D \starttyping
+%D \readfile {filename} {before loading} {not found}
+%D
+%D \readjobfile {filename} {before loading} {not found}
+%D \readlocfile {filename} {before loading} {not found}
+%D \readfixfile {filename} {before loading} {not found}
+%D \readsysfile {directory} {filename} {before loading} {not found}
+%D \stoptyping
+
+%D \macros
+%D {readjobfile,readlocfile,readsysfile,readfixfile}
+%D
+%D The next four alternatives can be used for opening files
+%D for reading on a line||by||line basis. These commands get
+%D an extra argument, the filetag. Explicit closing is done
+%D in the normal way by \type{\closein}.
+
+\def\doopenin#1#2%
+ {\sanitizefilename#2\to\readfilename
+ \checkfilename\readfilename
+ \ifcase\kindoffile
+ \advance\readlevel\plusone
+ \openinputfile{#1}\readfilename
+ \ifeof#1% \relax
+ \ifnum\readlevel>\maxreadlevel % \relax
+ \else
+ \closeinputfile#1% \relax
+ \doopenin{#1}{\pathplusfile\f!parentpath{#2}}%
+ \fi
+ \fi
+ \fi}
+
+\def\openjobin#1#2%
+ {\readlevel\zerocount
+ \doopenin{#1}{\pathplusfile\f!currentpath{#2}}}
+
+\def\opensysin % #1#2%
+ {\readlevel\maxreadlevel
+ \doopenin} % {#1}{#2}}
+
+\def\openlocin#1#2%
+ {\readlevel\maxreadlevel
+ \doopenin{#1}{\pathplusfile\f!currentpath{#2}}}
+
+\def\openfixin#1#2#3%
+ {\readlevel\maxreadlevel
+ \doopenin{#1}{\pathplusfile{#2}{#3}}}
+
+%D \macros
+%D {doiffileelse,doiflocfileelse}
+%D
+%D The next alternative only looks if a file is present. No
+%D loading is done. This one obeys the standard \TEX\
+%D implementation method.
+%D
+%D \starttyping
+%D \doiffileelse {filename} {found} {not found}
+%D \stoptyping
+%D
+%D \starttyping
+%D \doiflocfileelse {filename} {before loading} {not found}
+%D \stoptyping
+
+\def\doiffileelse {\doiffileexistselse}
+\def\doiffile #1{\doiffileexistselse{#1}\firstofoneargument\gobbleoneargument}
+\def\doifnotfile #1{\doiffileexistselse{#1}\gobbleoneargument\firstofoneargument}
+
+\def\doiflocfileelse#1%
+ {\makelocreadfilename{#1}%
+ \doiffileelse\readfilename}
+
+\def\makelocreadfilename#1%
+ {\sanitizefilename#1\to\readfilename
+ \checkfilename\readfilename
+ \ifcase\kindoffile
+ \edef\readfilename{\pathplusfile\f!currentpath{#1}}%
+ \fi}
+
+%D \macros
+%D {doonlyonce, doinputonce, doendinputonce}
+%D
+%D Especially macropackages need only be loaded once.
+%D Repetitive loading not only costs time, relocating registers
+%D often leads to abortion of the processing because \TEX's
+%D capacity is limited. One can prevent multiple execution and
+%D loading by using one of both:
+%D
+%D \starttyping
+%D \doonlyonce{actions}
+%D \doinputonce{filename}
+%D \doendinputonce{filename}
+%D \stoptyping
+%D
+%D This command obeys the standard method for locating files.
+
+\long\def\doonlyonce#1%
+ {\doifundefinedelse{@@@#1@@@}
+ {\letgvalue{@@@#1@@@}\empty
+ \firstofoneargument}
+ {\gobbleoneargument}}
+
+\def\doinputonce#1%
+% {\doonlyonce{#1}{\doiffileelse{#1}{\normalinput#1\relax}\donothing}}
+ {\doonlyonce{#1}{\doiffileelse{#1}{\inputgivenfile{#1}}\donothing}}
+
+\def\doendinputonce#1%
+ {\doifdefined{@@@#1@@@}\endinput}
+
+\def\forgetdoingonce#1%
+ {\global\letbeundefined{@@@#1@@@}}
+
+%D \macros
+%D {doifparentfileelse}
+%D
+%D The test \type{\doifelse{\jobname}{filename}} does not give
+%D the desired result, simply because \type{\jobname} expands
+%D to characters with \CATCODE~12, while the characters in
+%D \type{filename} have \CATCODE~11. So we can better use:
+%D
+%D \starttyping
+%D \doifparentfileelse{filename}{yes}{no}
+%D \stoptyping
+%D
+%D Since \TEXEXEC\ (and thereby \CONTEXT) supports renaming of
+%D the outputfile, we also need to check on that alternative
+%D name.
+
+\ifx\outputfilename\undefined \def\outputfilename{\jobname} \fi
+
+\def\doifparentfileelse#1%
+ {\doifsamestringelse{#1}{\jobname }\firstoftwoarguments
+ {\doifsamestringelse{#1}{\jobname.\c!tex}\firstoftwoarguments
+ {\doifsamestringelse{#1}{\outputfilename}\firstoftwoarguments\secondoftwoarguments}}}
+
+\def\normalless {<} % geen \let !
+\def\normalmore {>} % geen \let !
+\def\normalequal {=} % geen \let !
+\def\normaldblquote{"} % geen \let !
+
+\newcount\readingfilelevel
+
+\def\popfilecharacter#1#2%
+ {\ifnum\catcode`#1=\@@other \ifnum#2=\@@other \else
+ %\message{[popping catcode #1 to #2]}%
+ \catcode`#1=#2\relax
+ \fi \fi}
+
+\ifx\\\undefined \let\\\relax \fi
+
+%D This changing catcodes is a direct result from the fact
+%D that we support some long standing conventions with
+%D regards to active characters (german ", polish /,
+%D french : and ;).
+
+%D We need to redo this: catcode sets and such
+
+\newtoks \everystartreadingfile
+\newtoks \everystopreadingfile
+
+\def\startreadingfile% beter een every en \setnormalcatcodes
+ {\global\advance\readingfilelevel\plusone
+ \the\everystartreadingfile
+ \beginrestorecatcodes
+ \setcatcodetable\prtcatcodes}
+
+\def\stopreadingfile
+ {\endrestorecatcodes
+ \the\everystopreadingfile
+ \global\advance\readingfilelevel\minusone}
+
+\let\normalstartreadingfile\startreadingfile
+\let\normalstopreadingfile \stopreadingfile
+
+%D \macros
+%D {splitfilename}
+%D
+%D I should have made this one sooner. This macro was first needed when
+%D ran into graphic with a period in the pathpart.
+%D
+%D \startbuffer
+%D \def\showfilesplit
+%D {\bgroup \tttf
+%D \hbox{(full: \splitofffull)}\space
+%D \hbox{(path: \splitoffpath)}\space
+%D \hbox{(base: \splitoffbase)}\space
+%D \hbox{(name: \splitoffname)}\space
+%D \hbox{(type: \splitofftype)}\space
+%D \egroup}
+%D
+%D \splitfilename{c:/aa/bb/cc/dd.ee.ff} \showfilesplit \endgraf
+%D \splitfilename{c:/aa/bb/cc/dd.ee} \showfilesplit \endgraf
+%D \splitfilename{c:/aa/bb/cc/dd} \showfilesplit \endgraf
+%D
+%D \splitfilename{dd.ee.ff} \showfilesplit \endgraf
+%D \splitfilename{dd.ee} \showfilesplit \endgraf
+%D \splitfilename{dd} \showfilesplit \endgraf
+%D \stopbuffer
+%D
+%D \start \typebuffer \getbuffer \stop
+
+\def\splitoffroot{.} \chardef\splitoffkind\zerocount
+
+\let\splitofffull\empty
+\let\splitoffpath\empty
+\let\splitoffbase\empty
+\let\splitoffname\empty
+\let\splitofftype\empty
+
+% \def\splitfilename#1%
+% {\edef\splitofffull{#1}% normally outside this call: \sanitizefilename#1\to\sanitizedfilename
+% \greedysplitstring\splitofffull\at/\to\splitoffpath\and\splitoffbase
+% \ifx\splitoffbase\empty
+% \let\splitoffpath\empty
+% \let\splitoffbase\splitofffull
+% \fi
+% \greedysplitstring\splitoffbase\at.\to\splitoffname\and\splitofftype
+% \chardef\splitoffkind % can be used to test if pathpart was empty
+% \ifx\splitoffpath\empty \zerocount \else
+% \ifx\splitoffpath\splitoffroot \plusone \else
+% \plustwo \fi\fi
+% \ifx\splitoffname\empty\let\splitoffname\splitoffbase\fi
+% \ifx\splitoffpath\empty\let\splitoffpath\splitoffroot\fi}
+%
+% better, since it also handles leading /'s
+%
+% \splitfilename{oeps/test.pdf} [\splitoffpath\quad\splitoffname\quad\splitofftype]
+% \splitfilename{/oeps/test.pdf} [\splitoffpath\quad\splitoffname\quad\splitofftype]
+% \splitfilename{/test.pdf} [\splitoffpath\quad\splitoffname\quad\splitofftype]
+
+\def\splitfilename#1%
+ {\edef\splitofffull{#1}% normally outside this call: \sanitizefilename#1\to\sanitizedfilename
+ \greedysplitstring\splitofffull\at/\to\splitoffpath\and\splitoffbase
+ \ifx\splitoffpath\splitofffull
+ \let\splitoffpath\empty
+ \fi
+ \ifx\splitoffbase\empty
+ \let\splitoffpath\empty
+ \let\splitoffbase\splitofffull
+ \fi
+ \greedysplitstring\splitoffbase\at.\to\splitoffname\and\splitofftype
+ \chardef\splitoffkind % can be used to test if pathpart was empty
+ \ifx\splitoffpath\empty \zerocount \else
+ \ifx\splitoffpath\splitoffroot \plusone \else
+ \plustwo \fi\fi
+ \ifx\splitoffname\empty\let\splitoffname\splitoffbase\fi
+ \ifx\splitoffpath\empty\let\splitoffpath\splitoffroot\fi}
+
+\def\splitfiletype#1%
+ {\edef\splitofffull{#1}% normally outside this call: \sanitizefilename#1\to\sanitizedfilename
+ \let\splitoffpath\empty
+ \greedysplitstring\splitofffull\at.\to\splitoffname\and\splitofftype}
+
+\protect \endinput
diff --git a/tex/context/base/supp-fil.mkiv b/tex/context/base/supp-fil.mkiv
new file mode 100644
index 000000000..872612eab
--- /dev/null
+++ b/tex/context/base/supp-fil.mkiv
@@ -0,0 +1,464 @@
+%D \module
+%D [ file=supp-fil,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Files,
+%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 \TEX\ operates on files, so one wouldn't wonder that there
+%D is a separate module for file support. In \CONTEXT\ files
+%D are used for several purposes:
+%D
+%D \startitemize[packed]
+%D \item general textual input
+%D \item logging status information
+%D \item saving registers, lists and references
+%D \item buffering defered textual input
+%D \stopitemize
+%D
+%D When dealing with files we can load them as a whole, using
+%D the \type{\input} primitive or load them on a line||by||line
+%D basis, using \type{\read}. Writing is always done line by
+%D line, using \type{\write}.
+
+\writestatus{loading}{ConTeXt Support Macros / Files}
+
+\registerctxluafile{supp-fil}{1.001}
+
+\unprotect
+
+\ifx\undefined\f!pathseparator
+ \def\f!pathseparator{/}
+ \def\f!currentpath {.}
+ \def\f!parentpath {..}
+\fi
+
+% \def\openinputfile #1#2{\immediate\openin #1="#2"\relax} \def\closeinputfile #1{\immediate\closein #1}
+% \def\openoutputfile#1#2{\immediate\openout#1="#2"\relax} \def\closeoutputfile#1{\immediate\closeout#1}
+
+\def\openinputfile #1#2{\immediate\openin #1=#2\relax} \def\closeinputfile #1{\immediate\closein #1}
+\def\openoutputfile#1#2{\immediate\openout#1=#2\relax} \def\closeoutputfile#1{\immediate\closeout#1}
+
+%D \macros
+%D {pushendofline,popendofline}
+%D
+%D When we are loading files in the middle of the typesetting
+%D process, for instance when we load references, we have to be
+%D sure that the reading process does not generate so called
+%D 'spurious spaces'. This can be prevented by assigning the
+%D line ending character the \CATCODE\ comment. This is
+%D accomplished by
+%D
+%D \starttyping
+%D \pushendofline
+%D ... reading ...
+%D \popendofline
+%D \stoptyping
+%D
+%D Just to be sure, we save the current meaning of \type{^^M}
+%D in \type{\poppedendofline}.
+
+\newcount \endoflinelevel
+
+\ifx\newlinecode\undefined \chardef\newlinecode=`\^^M \fi
+
+\def\pushendofline
+ {\advance\endoflinelevel\plusone
+ \expandafter\chardef\csname :eol:\number\endoflinelevel\endcsname\catcode\newlinecode
+ \catcode\newlinecode\@@comment\relax}
+
+\def\popendofline
+ {\catcode\newlinecode\csname :eol:\number\endoflinelevel\endcsname
+ \advance\endoflinelevel\minusone}
+
+\def\restoreendofline
+ {\catcode\newlinecode\@@endofline}
+
+%D \macros
+%D {scratchread, scratchwrite}
+%D
+%D We define a scratch file for reading. Keep in mind that
+%D the number of files is limited to~16, so use this one when
+%D possible. We also define a scratch output file.
+
+\ifx\undefined\scratchread \newread \scratchread \fi
+\ifx\undefined\scratchwrite \newwrite\scratchwrite \fi
+
+%D \macros
+%D {unlinkfile}
+%D
+%D Sometimes we want to make sure a file is deleted, so here
+%D is a macro that does the job. It's named after the \PERL\
+%D one.
+
+\def\unlinkfile#1{\ctxlua{os.remove([[#1]])}}
+
+%D \macros
+%D {writeln}
+%D
+%D This saves a few tokens:
+
+\def\writeln#1{\write#1{}}
+
+\def\doiffileexistselse #1{\ctxlua{support.doiffileexistelse([[#1]])}}
+\def\lastfoundexistingfile {\ctxlua{support.lastexistingfile()}}
+
+%D \macros
+%D {doprocessfile,fileline,fileprocessedtrue,dofinishfile}
+%D
+%D The next macro offers a framework for processing files on a
+%D line by line basis.
+%D
+%D \starttyping
+%D \doprocessfile \identifier {name} \action
+%D \stoptyping
+%D
+%D The first argument can for instance be \type{\scratchread}.
+%D The action must do something with \type{\fileline}, which
+%D holds the current line. One can halfway step out using
+%D \type{\dofinishfile} and ise \type{\iffileprocessed} to
+%D see if indeed some content was found.
+
+\newif\iffileprocessed
+
+\let\fileline\empty
+
+\def\doprocessfile#1#2#3%
+ {\openinputfile{#1}{#2}%
+ \ifeof#1%
+ \fileprocessedfalse
+ \closeinputfile#1%
+ \else
+ \fileprocessedtrue
+ \gdef\dofinishfile
+ {\closeinputfile#1%
+ \global\let\doprocessline\relax}%
+ \gdef\doprocessline
+ {\ifeof#1%
+ \expandafter\dofinishfile
+ \else
+ \global\read#1 to \fileline
+ #3\relax
+ \expandafter\doprocessline
+ \fi}%
+ \expandafter\doprocessline
+ \fi}
+
+%D \macros
+%D {pathplusfile,assignfullfilename,sanitizefilename}
+%D
+%D Use \type{\pathplusfile} to compose a full file name, like
+%D in:
+%D
+%D \starttyping
+%D \pathplusfile{path}{file}
+%D \stoptyping
+%D
+%D By default, this expands into {\tt \pathplusfile{path}{file}}.
+
+\def\pathplusfile#1#2{#1\f!pathseparator#2}
+
+%D This one constructs a filename from a (possible empty)
+%D path and filename.
+
+\def\assignfullfilename#1#2\to#3%
+ {\doifelsenothing{#1}
+ {\edef#3{#2}}
+ {\edef#3{#1\f!pathseparator#2}}}
+
+\def\sanitizefilename#1\to#2{\edef#2{\ctxlua{support.thesanitizedfilename([[#1]])}}}
+
+%D NEW:
+
+\chardef\kindoffile=0 % 0=normal 1=full path spec (or http) / set at the lua end
+
+\def\checkfilename#1{\ctxlua{support.checkfilename([[#1]])}}
+
+%D \macros
+%D {input, normalinput}
+%D
+%D Sometimes we run into troubles when \type {\input} wants to get
+%D expanded, e.g. in a \type {\write} (which happens in the metafun
+%D manual when we permit long MP lines). So, instead of fixing that,
+%D we go for a redefinition of \type {\input}. Of course it's better
+%D to use \type {\readfile} or \type {\processfile}.
+
+\unexpanded\def\input{\normalinput}
+
+\def\inputgivenfile#1{\normalinput"#1"\relax}
+
+%D \macros
+%D {readfile,ReadFile}
+%D
+%D One cannot be sure if a file exists. When no file can be
+%D found, the \type{\input} primitive gives an error message
+%D and switches to interactive mode. The macro \type{\readfile}
+%D takes care of non||existing files. This macro has two faces.
+%D
+%D \starttyping
+%D \ReadFile {filename}
+%D \readfile {filename} {before loading} {not found}
+%D \stoptyping
+%D
+%D Many \TEX\ implementations have laid out some strategy for
+%D locating files. This can lead to unexpected results,
+%D especially when one loads files that are not found in the
+%D current directory. Let's give an example of this. In
+%D \CONTEXT\ illustrations can be defined in an external file.
+%D The resizing macro first looks if an illustration is defined
+%D in the local definitions file. When no such file is found,
+%D it searches for a global file and when this file is not
+%D found either, the illustration itself is scanned for
+%D dimensions. One can imagine what happens if an adapted,
+%D localy stored illustration, is scaled according to
+%D dimensions stored somewhere else.
+%D
+%D When some \TEX\ implementation starts looking for a file, it
+%D normally first looks in the current directory. When no file
+%D is found, \TEX\ starts searching on the path where format
+%D and|/|or style files are stored. Depending on the implementation
+%D this can considerably slow down processing speed.
+%D
+%D In \CONTEXT, we support a project||wise ordening of files.
+%D In such an approach it seems feasible to store common files
+%D in a lower directory. When for instance searching for a
+%D general layout file, we therefore have to backtrack.
+%D
+%D These three considerations have lead to a more advanced
+%D approach for loading files.
+%D
+%D We first present an earlier implementation of
+%D \type{\readfile}. This command backtracks parent
+%D directories, upto a predefined level. Users can change this
+%D level (on the commandline using a directive); we default to~3.
+%D
+%D We use \type{\normalinput} instead of \type{\input}
+%D because we want to be able to redefine the original
+%D \type{\input} when needed, for instance when loading third
+%D party libraries.
+
+\newevery \everybeforereadfile \EveryBeforeReadFile
+\newevery \everyafterreadfile \EveryAfterReadFile
+
+\let \everyreadfile \everybeforereadfile
+
+\def\maxreadlevel{\ctxlua{commands.maxreadlevel()}}
+
+% We need to postpone loading, else we got frozen type-* files and so when
+% a format is generated on a source path.
+
+\def\doreadfile#1#2#3% protocol path filename true false
+ {\edef\readfilename{\ctxlua{support.doreadfile("#1","#2","#3")}}%
+ \ifx\readfilename\empty
+ \expandafter\doreadfilenop
+ \else
+ \expandafter\doreadfileyes
+ \fi}
+
+\long\def\doreadfileyes#1#2%
+ {#1\relax
+ \the\everybeforereadfile
+ \relax\inputgivenfile\readfilename\relax
+ \the\everyafterreadfile}
+
+\long\def\doreadfilenop#1#2%
+ {#2}
+
+%D \macros
+%D {readjobfile,readlocfile,readsysfile,
+%D readfixfile,readsetfile}
+%D
+%D This implementation honnors the third situation, but we
+%D still can get unwanted files loaded and/or can get involved
+%D in extensive searching.
+%D
+%D Due to different needs, we decided to offer four alternative
+%D loading commands. With \type{\readjobfile} we load a local
+%D file and do no backtracking, while \type{\readlocfile}
+%D backtracks~\number\maxreadlevel\ directories, including the current
+%D one.
+%D
+%D System files can be anywhere and therefore
+%D \type{\readsysfile} is not bound to the current directory
+%D and obeys the \TEX\ implementation.
+%D
+%D Of the last two, \type{\readfixfile} searches on the
+%D directory specified and backtracks too, while
+%D \type{\readsetfile} does only search on the specified path.
+%D
+%D The most liberal is \type {\readfile}.
+
+\unexpanded\def\readjobfile #1{\doreadfile{job} {.}{#1}} % current path, no backtracking
+\unexpanded\def\readlocfile #1{\doreadfile{loc} {.}{#1}} % current path, backtracking
+\unexpanded\def\readsysfile #1{\doreadfile{sys} {.}{#1}} % current path, obeys tex search
+\unexpanded\def\readfixfile#1#2{\doreadfile{fix}{#1}{#2}} % specified path, backtracking
+\unexpanded\def\readsetfile#1#2{\doreadfile{set}{#1}{#2}} % specified path, no backtracking
+\unexpanded\def\readfile #1{\doreadfile{any} {.}{#1}}
+\unexpanded\def\ReadFile #1{\doreadfile{any} {.}{#1}\donothing\donothing}
+
+%D So now we've got ourselves five file loading commands:
+%D
+%D \starttyping
+%D \readfile {filename} {before loading} {not found}
+%D
+%D \readjobfile {filename} {before loading} {not found}
+%D \readlocfile {filename} {before loading} {not found}
+%D \readfixfile {filename} {before loading} {not found}
+%D \readsysfile {directory} {filename} {before loading} {not found}
+%D \stoptyping
+
+\def\readtexfile#1#2#3%
+ {\pushcatcodetable \catcodetable \ctxcatcodes
+ \readfile{#1}{#2}{#3}%
+ \popcatcodetable}
+
+\def\readxmlfile#1#2#3%
+ {\pushcatcodetable \catcodetable \xmlcatcodes
+ \readfile{#1}{#2}{#3}%
+ \popcatcodetable}
+
+%D \macros
+%D {doiffileelse,doiflocfileelse}
+%D
+%D The next alternative only looks if a file is present. No
+%D loading is done. This one obeys the standard \TEX\
+%D implementation method.
+%D
+%D \starttyping
+%D \doiffileelse {filename} {found} {not found}
+%D \stoptyping
+%D
+%D \starttyping
+%D \doiflocfileelse {filename} {before loading} {not found}
+%D \stoptyping
+
+\def\doiffileelse {\doiffileexistselse}
+\def\doiffile #1{\doiffileexistselse{#1}\firstofoneargument\gobbleoneargument}
+\def\doifnotfile #1{\doiffileexistselse{#1}\gobbleoneargument\firstofoneargument}
+
+\def\doiflocfileelse#1%
+ {\makelocreadfilename{#1}%
+ \doiffileelse\readfilename}
+
+\def\makelocreadfilename#1%
+ {\sanitizefilename#1\to\readfilename
+ \checkfilename\readfilename
+ \ifcase\kindoffile
+ \edef\readfilename{\pathplusfile\f!currentpath{#1}}%
+ \fi}
+
+%D \macros
+%D {doonlyonce, doinputonce, doendinputonce}
+%D
+%D Especially macropackages need only be loaded once.
+%D Repetitive loading not only costs time, relocating registers
+%D often leads to abortion of the processing because \TEX's
+%D capacity is limited. One can prevent multiple execution and
+%D loading by using one of both:
+%D
+%D \starttyping
+%D \doonlyonce{actions}
+%D \doinputonce{filename}
+%D \doendinputonce{filename}
+%D \stoptyping
+%D
+%D This command obeys the standard method for locating files.
+
+\long\def\doonlyonce#1%
+ {\doifundefinedelse{@@@#1@@@}
+ {\letgvalue{@@@#1@@@}\empty
+ \firstofoneargument}
+ {\gobbleoneargument}}
+
+\def\doinputonce#1%
+ {\doonlyonce{#1}{\doiffileelse{#1}{\inputgivenfile{#1}}\donothing}}
+
+\def\doendinputonce#1%
+ {\doifdefined{@@@#1@@@}\endinput}
+
+\def\forgetdoingonce#1%
+ {\global\letbeundefined{@@@#1@@@}}
+
+%D \macros
+%D {doifparentfileelse}
+%D
+%D The test \type{\doifelse{\jobname}{filename}} does not give
+%D the desired result, simply because \type{\jobname} expands
+%D to characters with \CATCODE~12, while the characters in
+%D \type{filename} have \CATCODE~11. So we can better use:
+%D
+%D \starttyping
+%D \doifparentfileelse{filename}{yes}{no}
+%D \stoptyping
+%D
+%D Since \TEXEXEC\ (and thereby \CONTEXT) supports renaming of
+%D the outputfile, we also need to check on that alternative
+%D name.
+
+\ifx\outputfilename\undefined \def\outputfilename{\jobname} \fi
+
+\def\doifparentfileelse#1{\ctxlua{support.doifparentfileelse([[#1]])}}
+
+\newcount\readingfilelevel
+
+%D We need to redo this: catcode sets and such
+
+\newtoks \everystartreadingfile
+\newtoks \everystopreadingfile
+
+\unexpanded\def\startreadingfile% beter een every en \setnormalcatcodes
+ {\global\advance\readingfilelevel\plusone
+ \the\everystartreadingfile
+ \beginrestorecatcodes
+ \setcatcodetable\prtcatcodes}
+
+\unexpanded\def\stopreadingfile
+ {\endrestorecatcodes
+ \the\everystopreadingfile
+ \global\advance\readingfilelevel\minusone}
+
+%D \macros
+%D {splitfilename}
+%D
+%D I should have made this one sooner. This macro was first needed when
+%D ran into graphic with a period in the pathpart.
+%D
+%D \startbuffer
+%D \def\showfilesplit
+%D {\bgroup \tttf
+%D \hbox{(full: \splitofffull)}\space
+%D \hbox{(path: \splitoffpath)}\space
+%D \hbox{(base: \splitoffbase)}\space
+%D \hbox{(name: \splitoffname)}\space
+%D \hbox{(type: \splitofftype)}\space
+%D \egroup}
+%D
+%D \splitfilename{c:/aa/bb/cc/dd.ee.ff} \showfilesplit \endgraf
+%D \splitfilename{c:/aa/bb/cc/dd.ee} \showfilesplit \endgraf
+%D \splitfilename{c:/aa/bb/cc/dd} \showfilesplit \endgraf
+%D
+%D \splitfilename{dd.ee.ff} \showfilesplit \endgraf
+%D \splitfilename{dd.ee} \showfilesplit \endgraf
+%D \splitfilename{dd} \showfilesplit \endgraf
+%D \stopbuffer
+%D
+%D \start \typebuffer \getbuffer \stop
+
+\def\splitoffroot{.} \chardef\splitoffkind\zerocount
+
+\let\splitofffull\empty
+\let\splitoffpath\empty
+\let\splitoffbase\empty
+\let\splitoffname\empty
+\let\splitofftype\empty
+
+\def\splitfilename#1{\ctxlua{support.splitfilename([[#1]])}}
+\def\splitfiletype#1{\ctxlua{support.splitfiletype([[#1]])}}
+
+\protect \endinput
diff --git a/tex/context/base/supp-fun.tex b/tex/context/base/supp-fun.tex
new file mode 100644
index 000000000..6b2643703
--- /dev/null
+++ b/tex/context/base/supp-fun.tex
@@ -0,0 +1,746 @@
+%D \module
+%D [ file=supp-fun,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Fun Stuff,
+%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
+
+%D This module implements some typographics tricks that can
+%D be fun when designing document layouts. The examples use
+%D macros that are typical to \CONTEXT, but non \CONTEXT\
+%D users can use the drop caps and first line treatment
+%D macros without problems. This module will be extended
+%D when the need for more of such tricks arises.
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+\writestatus{loading}{ConTeXt Support Macros / Fun Stuff}
+
+\ifx\definefont\undefined
+ \def\definedfont[#1]{\font\temp#1\relax\temp}
+\fi
+
+%D \macros
+%D {DroppedCaps, DroppedString, DroppedIndent, DroppedLines}
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[green]} {cmbx12}
+%D {2.2\baselineskip} {2pt} {\baselineskip} {2}
+%D Let's start
+%D \stopbuffer
+%D
+%D \getbuffer with dropped caps, those blown up first
+%D characters of a paragraph. It's hard to implement a general
+%D mechanism that suits all situations, but dropped caps are so
+%D seldomly used that we can permit ourselves a rather user
+%D unfriendly implementation.
+%D
+%D \typebuffer
+%D
+%D As we will see, there are 7 different settings involved. The
+%D first argument takes a command that is used to do whatever
+%D fancy things we want to do, but normally this one will be
+%D empty. The second argument takes the font. Because we're
+%D dealing with something very typographic, there is no real
+%D reason to adopt complicated font switching schemes, a mere
+%D name will do. Font encodings can bring no harm, because the
+%D alphanumeric characters are nearly always located at their
+%D natural position in the encoding vector.
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[red]} {cmbx12}
+%D {\baselineskip} {0pt} {0pt} {1}
+%D This simple
+%D \stopbuffer
+%D
+%D \getbuffer case shows us what happens when we apply minimal
+%D values. Here we used:
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[red]} {cmbx12}
+%D {2\baselineskip} {0pt} {\baselineskip} {2}
+%D Is this ugly
+%D \stopbuffer
+%D
+%D \getbuffer example the third argument tells
+%D this macro that we want a dropped capital scaled to the
+%D baseline distance. The two zero point arguments are the
+%D horizontal and vertical offsets and the last arguments
+%D determines the hanging indentation. In this paragraph we
+%D set the height to two times the baselinedistance and use
+%D two hanging lines:
+%D
+%D \typebuffer
+%D
+%D Here, the first character is moved down one baseline. Here
+%D we also see why the horizontal offset is important. The
+%D first example (showing the~L) sets this to a few points and
+%D also used a slightly larger height.
+%D
+%D Of course common users (typist) are not supposed to see this
+%D kind of fuzzy definitions, but fortunately \TEX\ permits us
+%D to hide them in macros. Using a macro also enables us to
+%D garantee consistency throughout the document:
+%D
+%D \startbuffer
+%D \def\MyDroppedCaps%
+%D {\DroppedCaps
+%D {\color[green]} {cmbx12}
+%D {5\baselineskip} {3pt} {3\baselineskip} {4}}
+%D
+%D \MyDroppedCaps The implementation
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer of the general macro is rather simple and only
+%D depends on the arguments given and the dimensions of the
+%D strut box. We explicitly load the font, which is no problem
+%D because \TEX\ does not load a font twice. We could have
+%D combined some arguments, like the height, vertical offset
+%D and the number of lines, but the current implementation
+%D proved to be the most flexible. One should be aware of the
+%D fact that the offsets depend on the design of the glyphs
+%D used.
+
+\let\DroppedIndent\!!zeropoint \def\DroppedLines{0}
+
+\def\DroppedString{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
+
+\let\globaldropcaps\global % will be an option, but on by default
+
+\def\localdropcaps{\let\globaldropcaps\relax}
+
+\chardef\DroppedStatus = 0 % 0=done 1=starting 2=doing 3=error
+\chardef\DropMode = 0 % 1 == marginhang
+
+\ifx\keeplinestogether\undefined
+ \let\keeplinestogether\gobbleoneargument
+\fi
+
+\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars
+ {\defconvertedargument\asciia{#7}%
+ \defconvertedcommand \asciib{\DroppedString}%
+ \ExpandBothAfter\doifinstringelse\asciia\asciib
+ {\noindentation
+ \dontleavehmode
+ \checkindentation % redo this one
+ %\ifhmode\hskip-\parindent\fi % sensitive for context mechanism
+ \keeplinestogether{#6}%
+ \setbox0\hbox{\definedfont[#2 at #3]#1{#7}\hskip#4}%
+ \ifdim\dp0>\strutdp % one of those Q's , will be option
+ \setbox2\hbox{\raise\dp0\hbox{\lower\strutdp\copy0}}%
+ \ht2\ht0
+ \dp0\strutdp
+ \setbox0\box2
+ \fi
+ \setbox0\hbox
+ {\ifnum\DropMode=\plusone
+ \hskip-\wd0\wd0\zeropoint
+ \fi
+ \lower#5\box0}%
+ \ht0\strutht
+ \dp0\strutdp
+ \ifnum\DropMode=\plusone
+ \globaldropcaps\let\DroppedIndent\!!zeropoint
+ \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
+ \globaldropcaps\chardef\DroppedStatus\plusthree
+ \else
+ \globaldropcaps\edef\DroppedIndent{\the\wd0}%
+ \globaldropcaps\edef\DroppedLines {\number#6}%
+ \globaldropcaps\chardef\DroppedStatus\plustwo
+ \globaldropcaps\hangindent\DroppedIndent
+ \globaldropcaps\hangafter-\DroppedLines
+% \noindent
+ \noindentation
+ \checkindentation % redo this one
+ \hskip-\DroppedIndent
+ \fi
+ \vbox{\forgetall\box0}%
+ \nobreak
+ \let\next\ignorespaces} % Could be a one character word !
+ {\globaldropcaps\let\DroppedIndent\!!zeropoint
+ \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
+ \globaldropcaps\chardef\DroppedStatus\plusthree
+ \def\next{#7}}%
+ \let\globaldropcaps\global
+ \next}
+
+%D Before we go to the next topic, we summarize this command:
+%D
+%D \starttyping
+%D \DroppedCaps
+%D {command} {font}
+%D {height} {hoffset} {voffset} {lines}
+%D \stoptyping
+%D
+%D Sometimes you need to make sure that the global settings are
+%D kept local, as in:
+%D
+% %D \startbuffer
+% %D \defineparagraphs[SomePar][n=2,rule=on]
+% %D \setupparagraphs [SomePar][1][width=.5\textwidth]
+% %D \setupparagraphs [SomePar][2][width=.5\textwidth]
+%D \startbuffer
+%D \defineparagraphs[SomePar][n=2,rule=on]
+%D \setupparagraphs [SomePar][1][width=.5\textwidth]
+%D \setupparagraphs [SomePar][2][width=.5\textwidth]
+%D
+%D \startSomePar
+%D \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
+%D to explicitly keep the hanging indentation local, like it or
+%D not.
+%D \SomePar
+%D \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
+%D to explicitly keep the hanging indentation local, like it or
+%D not.
+%D \stopSomePar
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {AutoDroppedCaps, CheckDroppedCaps}
+%D
+%D {\em To be documented.}
+
+% example usage
+%
+% \def\bpar{\ifvmode\CheckDroppedCaps\fi}
+% \def\epar{\ifhmode\par\fi\CheckDroppedCaps}
+
+\newcount\lastprevgraf
+\newcount\droppedlines
+
+\def\CheckDroppedCaps
+ {\global\lastprevgraf\prevgraf}
+
+\def\AutoDroppedCaps % will be proper core stuff since it
+ {\globaldropcaps\chardef\DroppedStatus\plusone
+ \global\lastprevgraf\zerocount
+ \global\droppedlines\zerocount
+ \EveryPar{\doAutoDroppedCaps}}
+
+\let\AutoDroppedNext\relax
+
+\ifx\AutoDroppedCapsCommand\undefined
+ \def\AutoDroppedCapsCommand{\NiceDroppedCaps{}{SerifBold}{.125em}{3}}
+\fi
+
+\def\doAutoDroppedCaps
+ {\ifcase\DroppedStatus % done
+ \let\next\relax
+ \or % starting
+ % \ifnum\lastprevgraf>0 % tricky, probably a wrong par
+ % \globaldropcaps\chardef\DroppedStatus=3 % and inhibits dropped
+ % \let\next\relax % caps after titles and more than once
+ % \else % so let's nill this rubishly code fragment
+ \let\next\AutoDroppedCapsCommand
+ % \fi % and hope for the best
+ \or % doing
+ \global\advance\droppedlines \lastprevgraf
+ \ifnum\droppedlines=\zerocount
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \else\ifnum\droppedlines>\zerocount
+ \ifnum\droppedlines<\DroppedLines\relax
+ \globaldropcaps\hangindent\DroppedIndent
+ \globaldropcaps\hangafter-\DroppedLines
+ \globaldropcaps\advance\hangafter \droppedlines
+ \hskip-\parindent % brrr
+ \let\next\AutoDroppedNext
+ \else
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \fi
+ \else
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \fi\fi
+ \or % error
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \fi
+ \next}
+
+%D \macros
+%D {LineDroppedCaps, NiceDroppedCaps}
+%D
+%D To save definitions, we also provide:
+%D
+%D \starttyping
+%D \LineDroppedCaps {command} {font} {hoffset} {lines}
+%D \NiceDroppedCaps {command} {font} {hoffset} {lines}
+%D \stoptyping
+%D
+%D The first command scales the font to the exact height, while
+%D the second command scales the font to a nice 2.5 times the
+%D line height, a value that gives a pleasant grayness.
+
+\def\DoLineDroppedCaps#1#2#3#4#5% compensation command font offset lines
+ {\scratchcounter#5%
+ \advance\scratchcounter \minusone
+ \scratchdimen\scratchcounter\baselineskip
+ \advance\scratchdimen #1%
+ \NormalizeFontHeight\DummyFont{W}\scratchdimen{#3}%
+ \DroppedCaps{#2}{#3}\TheNormalizedFontSize{#4}
+ {\scratchcounter\baselineskip}{#5}}
+
+\def\LineDroppedCaps% command font offset lines
+ {\DoLineDroppedCaps{\strutht}}
+
+\def\NiceDroppedCaps% command font offset lines
+ {\DoLineDroppedCaps{.5\baselineskip}}
+
+%D \macros
+%D {TreatFirstLine}
+%D
+%D \startbuffer
+%D \TreatFirstLine {\sc} {} {} {}
+%D Instead of limiting its action to one token, the next macro
+%D treats the whole first line. This paragraph was typeset by
+%D saying:
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \TreatFirstLine {\startcolor[red]\bf} {\stopcolor} {} {}
+%D The combined color and font effect is also possible,
+%D although one must be careful in using macros that accumulate
+%D grouping, but the commands used here are pretty save in that
+%D respect.
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D Before we explain the third and fourth argument, we show the
+%D implementation. Those who know a bit about the way \TEX\
+%D treats tokens, will probably see in one glance that this
+%D alternative works all right for most text||only situations
+%D in which there is enough text available for the first line,
+%D but that more complicated things will blow. One has to live
+%D with that. A workaround is rather trivial but obscures the
+%D principles used.
+
+\def\TreatFirstLine#1#2#3#4% before, after, first, next
+ {\leavevmode
+ \bgroup
+ \forgetall
+ \bgroup
+ #1%
+ \setbox0\emptybox
+ \setbox2\emptybox
+ \def\grabfirstline##1 %
+ {\setbox2\hbox
+ {\ifvoid0
+ {#3{\ignorespaces##1}}%
+ \else
+ \unhcopy0\ {#4{##1}}%
+ \fi}%
+ \ifdim\wd2=\zeropoint
+ \setbox0\emptybox
+ \setbox2\emptybox
+ \@EA\grabfirstline
+ \else\ifdim\wd2>\hsize
+ \hbox to \hsize{\strut\unhbox0}#2\egroup
+ \break##1\
+ \egroup
+ \else
+ \setbox0\box2
+ \@EAEAEA\grabfirstline
+ \fi\fi}%
+ \grabfirstline}
+
+%D \startbuffer
+%D \gdef\FunnyCommand
+%D {\getrandomfloat\FunnyR{0}{1}%
+%D \getrandomfloat\FunnyG{0}{1}%
+%D \getrandomfloat\FunnyB{0}{1}%
+%D \definecolor[FunnyColor][r=\FunnyR,g=\FunnyG,b=\FunnyB]%
+%D \color[FunnyColor]}
+%D
+%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
+%D
+%D \getbuffer
+%D to know a bit more about the macro package used to get real
+%D nice effects, but this example probably demonstrates the
+%D principles well.
+%D
+%D \typebuffer
+%D
+%D Like in dropped caps case, one can hide such treatments in a
+%D macro, like:
+%D
+%D \starttyping
+%D \def\MyTreatFirstLine%
+%D {\TreatFirstLine{\bf}{}{\FunnyCommand}{\FunnyCommand}}
+%D \stoptyping
+
+%D \macros
+%D {reshapebox}
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D When using \CONTEXT, one can also apply this funny command
+%D to whole lines by using the reshape mechanism. Describing
+%D this interesting mechanism falls outside the scope of this
+%D module, so we only show the trick. This is an example of
+%D low level \CONTEXT\ functionality: it's all there, and it's
+%D stable, but not entirely meant for novice users.
+%D \endofshapebox
+%D
+%D \reshapebox{\FunnyCommand{\box\shapebox}} \flushshapebox
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D This mechanism permits hyphenation and therefore gives
+%D better results than the previously discussed macro
+%D \type{\TreatFirstLine}.
+
+%D \macros
+%D {TreatFirstCharacter}
+%D
+%D \startbuffer
+%D \TreatFirstCharacter{\bf\color[green]} Just to be
+%D \stopbuffer
+%D
+%D \getbuffer complete we also offer a very simple one
+%D character alternative, that is not that hard to understand:
+
+\def\TreatFirstCharacter#1#2% command, character
+ {{#1{#2}}}
+
+%D A previous paragraph started with:
+%D
+%D \typebuffer
+
+%D \macros
+%D {StackCharacters}
+%D
+%D The next hack deals with vertical stacking.
+
+\def\StackCharacters#1#2#3#4% sequence vsize vskip command
+ {\vbox #2
+ {\forgetall
+ \baselineskip\zeropoint
+ \def\StackCharacter##1{#4{##1}\cr\noalign{#3}}%
+ \halign
+ {\hss##\hss&##\cr
+ \handletokens#1\with\StackCharacter\cr}}}
+
+%D \startbuffer
+%D \StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}
+%D \stopbuffer
+%D
+%D Such a stack looks like:
+%D
+%D \startlinecorrection
+%D \hbox to \hsize
+%D {$\hss\bfd
+%D \vcenter{\StackCharacters{TEX} {}{\vskip.2ex}{\FunnyCommand}}%
+%D \hss
+%D \vcenter{\StackCharacters{CON} {}{\vskip.2ex}{\FunnyCommand}}
+%D \hss
+%D \vcenter{\StackCharacters{TEXT} {}{\vskip.2ex}{\FunnyCommand}}
+%D \hss
+%D \vcenter{\StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}}
+%D \hss$}
+%D \stoplinecorrection
+%D
+%D and is typeset by saying:
+%D
+%D \typebuffer
+%D
+%D An alternative would have been
+%D
+%D \starttyping
+%D \StackCharacters {CONTEXT} {to 5cm} {\vfill} {\FunnyCommand}
+%D \stoptyping
+
+%D \macros
+%D {processtokens}
+%D
+%D At a lower level horizontal and vertical manipulations are
+%D already supported by:
+%D
+%D \starttyping
+%D \processtokens {begin} {between} {end} {space} {text}
+%D \stoptyping
+%D
+%D \startbuffer[a]
+%D \processtokens
+%D {\hbox to .5\hsize\bgroup} {\hfill}
+%D {\egroup} {\space} {LET'S HAVE}
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \processtokens
+%D {\vbox\bgroup\raggedcenter\hsize1em}
+%D {\vskip.25ex} {\egroup} {\strut} {FUN}
+%D \stopbuffer
+%D
+%D This macro is able to typeset:
+%D
+%D \leavevmode\hbox to \hsize
+%D {$\hfil\hfil
+%D \vcenter{\bf\getbuffer[a]}%
+%D \hfil
+%D \vcenter{\bfd\getbuffer[b]}%
+%D \hfil\hfil$}
+%D
+%D which was specified as:
+%D
+%D \typebuffer[a]
+%D \typebuffer[b]
+
+%D \macros
+%D {NormalizeFontHeight, NormalizeFontWidth,
+%D TheNormalizedFontSize}
+%D
+%D Next we introduce some font manipulation macros. When we
+%D want to typeset some text spread in a well defined area, it
+%D can be considered bad practice to manipulate character and
+%D word spacing. In such situations the next few macros can be
+%D of help:
+%D
+%D \starttyping
+%D \NormalizeFontHeight \name {sample text} {height} {font}
+%D \NormalizeFontWidth \name {sample text} {width} {font}
+%D \stoptyping
+%D
+%D These are implemented using an auxilliary macro:
+
+\def\NormalizeFontHeight{\NormalizeFontSize\ht}
+\def\NormalizeFontWidth {\NormalizeFontSize\wd}
+
+% \def\NormalizeFontSize#1#2#3#4#5%
+% {\bgroup
+% \dimen0=#4% #4 can be \ht0 or so
+% \setbox0\hbox{\definedfont[#5 at 10pt]#3}%
+% \ifdim\wd0>\zeropoint
+% \dimen2=#10 % #1 is \wd or \ht
+% \dimen4=10000pt
+% \divide\dimen4 \dimen2
+% \divide\dimen0 \plusthousand
+% \dimen0=\number\dimen4\dimen0
+% \xdef\TheNormalizedFontSize{\the\dimen0}%
+% \else
+% \dimen0\bodyfontsize
+% \fi
+% \definedfont[#5 at \the\dimen0]%
+% \expandafter
+% \egroup
+% \expandafter\font\expandafter#2\fontname\font\relax}
+%
+% the familiar struggle with accuracy forces us to use:
+
+\def\NormalizeFontSize#1#2#3#4#5%
+ {\bgroup
+ \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
+ \dimen4=\maxdimen % 10000pt
+ \divide\dimen4 \dimen2
+ \divide\dimen0 1638 % 1000
+ \dimen0=\number\dimen4\dimen0
+ \divide \dimen0 \plustwo % ...
+ \xdef\TheNormalizedFontSize{\the\dimen0}%
+ \else
+ \dimen0\bodyfontsize
+ \fi
+ % 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:
+
+\let\TheNormalizedFontSize\!!zeropoint
+
+%D Extra:
+
+\def\WidthSpanningText#1#2#3% text width font
+ {\hbox{\NormalizeFontWidth\temp{#1}{#2}{#3}\temp\the\everydefinedfont#1}}
+
+%D Consider for instance:
+%D
+%D \startbuffer
+%D \NormalizeFontHeight \tmp {X} {2\baselineskip} {cmr10}
+%D
+%D {\tmp To Be Or Not To Be}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This shows up as (we also show the baselines):
+%D
+%D {\showbaselines\getbuffer}
+%D
+%D The horizontal counterpart is:
+%D
+%D \startbuffer
+%D \NormalizeFontWidth \tmp {This Line Fits} {\hsize} {cmr10}
+%D
+%D \hbox{\tmp This Line Fits}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D The calculated font scale is avaliable in the macro
+%D \type{\NormalizedFontSize}.
+%D
+%D \startlinecorrection
+%D \ruledhbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D One can of course combine these macros with the ones
+%D described earlier, like in:
+%D
+%D \starttyping
+%D \NormalizeFontHeight {text} \DroppedFont {2\baselineskip} {cmbx12}
+%D
+%D \def\NicelyDroppedCaps
+%D {\DroppedCaps
+%D {\color[green]}
+%D {\DroppedFont}
+%D {2pt}
+%D {\baselineskip}
+%D {2}}
+%D \stoptyping
+%D
+%D It's up to the reader to test this one.
+
+\unexpanded\def\FirstNCharacters#1#2% \FirstNCharacters{3}{fr{\"o}beln}
+ {\bgroup
+ \scratchcounter\zerocount
+ \def\docommand##1%
+ {\ifnum\scratchcounter=#1\else
+ ##1\relax % catches ##1 = \"e and alike
+ \advance\scratchcounter\plusone
+ \fi}
+ \handletokens#2\with\docommand
+ \egroup}
+
+%D \macros
+%D {FittingText}
+%D
+%D First used in Pascal (demo-bbv):
+%D
+%D \startbuffer
+%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
+%D {\veryraggedright
+%D \hangindent1em\hangafter1\relax
+%D \begstrut \dorecurse{8}{Bram Marta }\unskip \endstrut}}
+%D
+%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
+%D {\raggedleft\begstrut Bram\\Marta \unskip\endstrut}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+
+% #1 width #2 height #3 font #4 size #5 step #6 interlinie #7 text
+
+\long\def\FittingText#1#2#3#4#5#6#7%
+ {\bgroup
+ \forgetall
+ \dontcomplain
+ \setuptolerance[\v!verytolerant]% == \tolerance4500
+ \hsize#1%
+ \def\\{\softbreak}%
+ \!!heighta#4%
+ \!!heightb#2%
+ \doloop
+ {\ifdim\!!heighta>\onepoint
+ \expanded{\definefont[\s!dummy][#3 at \the\!!heighta][\c!interlinespace=#6]}%
+ \getvalue\s!dummy
+ \setbox\scratchbox\vbox{#7\endgraf}%
+ \ifdim\ht\scratchbox>\!!heightb
+ \advance\!!heighta-#5%
+ \else
+ \beginshapebox
+ \unvcopy\scratchbox
+ \endshapebox
+ \global\dimen1\hsize
+ \reshapebox
+ {\setbox\shapebox\hbox{\unhbox\shapebox}%
+ \ifdim\wd\shapebox>\dimen1
+ \global\dimen1\wd\shapebox
+ \fi}%
+ \ifdim\dimen1>\hsize
+ \advance\!!heighta-#5%
+ \else
+ \exitloop
+ \fi
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ %\writestatus{\strippedcsname\FittingText}{height: \the\!!heighta}%
+ \unvbox\scratchbox
+ \egroup}
+
+%D New:
+
+% \font width gap font spec text
+
+\def\NormalizeFontWidthSpread#1#2#3#4#5#6%
+ {\global\setfalse\NFSpread
+ \scratchdimen#3%
+ \scratchdimen-.5\scratchdimen
+ \advance\scratchdimen#2\relax
+ \NormalizeFontWidth
+ #1%
+ {\def\+{\global\settrue\NFSpread\gobbleuntil\relax}%
+ \def\\{\gobbleuntil\relax}% newline
+ \setupspacing
+ #6\relax}%
+ {\scratchdimen}%
+ {#4}%
+ \ifconditional\NFSpread
+ % de gap valt in de binding
+ \else
+ \definefont[\strippedcsname#1][#4 #5]%
+ \fi}
+
+\def\SpreadGapText#1#2%
+ {{\def\+{\kern#1}#2}}
+
+\def\GapText#1#2#3#4#5% width distance font spec title
+ {\bgroup
+ \NormalizeFontWidthSpread\DummyFont{#1}{#2}{#3}{#4}{#5}%
+ \DummyFont\setupspacing\SpreadGapText{#2}{#5}\endgraf
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/supp-mat.mkii b/tex/context/base/supp-mat.mkii
new file mode 100644
index 000000000..1a51164e6
--- /dev/null
+++ b/tex/context/base/supp-mat.mkii
@@ -0,0 +1,293 @@
+%D \module
+%D [ file=supp-mat,
+%D version=1998.09.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Math,
+%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 For practical reasons, I decided to move some math things to
+%D a support module. There is nothing spectacular here. It may move
+%D back to math-ini.
+
+\writestatus{loading}{ConTeXt Support Macros / Math}
+
+\unprotect
+
+%D \macros
+%D {mathematics, math, nomathematics, startmathmode}
+%D
+%D The \type{$} can be both an begin and end math character.
+%D This can lead to confusing and errorprone situations when
+%D macros insert \type{$}. When for instance we have defined:
+%D
+%D \starttyping
+%D \def\MyPlus{$\,+\,$}
+%D \stoptyping
+%D
+%D the sequence \type{$x^2 \MyPlus y^2 = r^2$} will expand to:
+%D
+%D \starttyping
+%D $x^2 $\,+\,$ y^2 = r^2$
+%D \stoptyping
+%D
+%D Here the \type{\,} are given outside math mode and \TEX\ will
+%D definitely complain about this. A more save definition would
+%D have been:
+%D
+%D \starttyping
+%D \def\MyPlus{\mathematics{\,+\,}}
+%D \stoptyping
+%D
+%D Which is implemented as:
+
+\long\def\mathematics#1{\relax\ifmmode#1\else $#1$\fi} % lookahead bug reported by brooks
+\long\def\displaymath#1{\relax\ifmmode#1\else$$#1$$\fi}
+\long\def\inlinemath #1{\dontleavehmode\relax\ifmmode#1\else $#1$\fi}
+
+\let\stopmathmode\relax
+
+\def\startmathmode % cannot be used nested
+ {\relax\ifmmode
+ \let\stopmathmode\relax
+ \else
+ $\def\stopmathmode{$}% \let\stopmathmode=$
+ \fi}
+
+\def\startmathmode % nested variant
+ {\relax\ifmmode
+ \begingroup\let\stopmathmode\endgroup
+ \else
+ $\let\stopmathmode$%
+ \fi}
+
+\def\nomathematics#1%
+ {\relax\ifmmode\hbox{#1}\else#1\fi}
+
+\let\math\mathematics
+
+%D \macros
+%D {displaymathematics,inlinemathematics,automathematics}
+%D
+%D An example of usage of the following can be found in the MathML module:
+
+\long\def\displaymathematics#1{\relax\ifmmode#1\else\dostartformula{}#1\dostopformula\fi}
+ \def\inlinemathematics {\dontleavehmode\mathematics}
+ \def\automathematics {\relax\ifhmode\@EA\inlinemathematics\else\@EA\displaymathematics\fi}
+
+% better, esp when used in bTABLE ... eTABLE
+
+\def\automathematics
+ {\relax
+ \ifhmode
+ \expandafter\inlinemathematics
+ \else\ifintable
+ \expandafter\expandafter\expandafter\inlinemathematics
+ \else
+ \expandafter\expandafter\expandafter\displaymathematics
+ \fi\fi}
+
+%D \macros
+%D {dimension, nodimension}
+%D
+%D The next few macros are used for typesetting dimensions in
+%D such a way that spacing is acceptable. I won't spend much
+%D words on these macros, because they will be overloaded in
+%D the units module.
+
+\newsignal\dimensionsignal
+
+\def\dimensiontypeface {\tf}
+\def\dimensionhalfspace {\,}
+
+\unexpanded\def\dimension#1%
+ {\def\dodimensionsignal{\kern\dimensionsignal}%
+ \ifdim\lastskip=\zeropoint\relax
+ \ifdim\lastkern=\zeropoint\relax
+ \ifmmode
+ \mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
+ \else
+ \mathematics{\dimensiontypeface#1}%
+ \fi
+ \else\ifdim\lastkern=\dimensionsignal
+ \mathematics{\dimensionhalfspace\dimensiontypeface#1}%
+ \else
+ \unkern\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
+ \fi\fi
+ \else
+ \unskip\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
+ \fi
+ \dodimensionsignal}
+
+\unexpanded\def\nodimension#1%
+ {\unskip#1\global\let\dodimensionsignal\relax}
+
+%D \macros
+%D {super, suber}
+%D
+%D \TEX\ uses \type{^} and \type{_} for entering super- and
+%D subscript mode. We want however a bit more control than
+%D normally provided, and therefore provide \type {\super}
+%D and \type{\suber} (\type {\sub} is already taken).
+
+\global\let\normalsuper=^
+\global\let\normalsuber=_
+
+\newcount\supersubmode
+
+\newevery\everysupersub \EverySuperSub
+
+\appendtoks \advance\supersubmode 1\relax \to \everysupersub
+
+% \def\dodosuper#1{\normalsuper{\the\everysupersub#1}}
+% \def\dodosuber#1{\normalsuber{\the\everysupersub#1}}
+%
+% \def\dosuper{\ifx\next\bgroup\expandafter\dodosuper\else\normalsuper\fi}
+% \def\dosuber{\ifx\next\bgroup\expandafter\dodosuber\else\normalsuber\fi}
+%
+% \def\super{\futurelet\next\dosuper}
+% \def\suber{\futurelet\next\dosuber}
+
+\def\super#1{\normalsuper{\the\everysupersub#1}}
+\def\suber#1{\normalsuber{\the\everysupersub#1}}
+
+%D \macros
+%D {enablesupsub}
+%D
+%D We can let \type {^} and \type {_} act like \type {\super}
+%D and \type {\suber} by saying \type {\enablesupsub}.
+
+\bgroup
+\catcode`\^=\@@active
+\catcode`\_=\@@active
+\gdef\enablesupsub
+ {\catcode`\^=\@@active
+ \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
+ \catcode`\_=\@@active
+ \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
+\egroup
+
+%D \macros
+%D {restoremathstyle}
+%D
+%D We can pick up the current math style by calling \type
+%D {\restoremathstyle}.
+
+\def\restoremathstyle
+ {\ifmmode
+ \ifcase\supsubmode
+ \textstyle
+ \or
+ \scriptstyle
+ \else
+ \scriptscriptstyle
+ \fi
+ \fi}
+
+%D \macros
+%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 (\useurl
+%D {http://www.ctan.org/tex-archive/digests/tex-implementors/042}).
+%D
+%D \startbuffer
+%D \ruledhbox{$\left\{{x^2\over y^2}\right\}$}
+%D \ruledhbox{$\cramped{\left\{ {x^2\over y^2}\right\}}$}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\cramped
+ {\mathpalette\docramped}
+
+%D We force a cramped style by issuing a non||existing radical (box).
+%D After that we make sure the height is correct. (Comment taken from
+%D Morten Høgholm's mathtools package.) Macro suggested by AM and
+%D cleaned up a bit by HH.
+
+% original
+%
+% \def\docramped#1#2%
+% {\setbox\scratchbox\hbox
+% {\nulldelimiterspace\zeropoint
+% $\mathsurround\zeropoint#1\radical\zerocount{#2}$}%
+% \ifx#1\displaystyle
+% \scratchdimen\fontdimen8\textfont3
+% \advance\scratchdimen .25\fontdimen5\textfont2
+% \else
+% \scratchdimen1.25\fontdimen8
+% \ifx#1\textstyle\textfont
+% \else
+% \ifx#1\scriptstyle\scriptfont\else\scriptscriptfont\fi
+% \fi
+% 3
+% \fi
+% \advance\scratchdimen-\ht\scratchbox
+% \ht\scratchbox-\scratchdimen
+% \box\scratchbox}
+
+\def\docramped#1#2%
+ {\begingroup % added HH, made even more cramped
+ \setbox\scratchbox\hbox
+ {\nulldelimiterspace\zeropoint
+ $\mathsurround\zeropoint#1\radical\zerocount{#2}$}%
+ \ht\scratchbox-\dimexpr
+ \ifx#1\displaystyle
+ \fontdimen8\textfont3
+ +.25\fontdimen5\textfont2
+ \else
+ 1.25\fontdimen8
+ \ifx#1\textstyle
+ \textfont
+ \else\ifx#1\scriptstyle
+ \scriptfont
+ \else
+ \scriptscriptfont
+ \fi \fi
+ \plusthree
+ \fi
+ -\ht\scratchbox
+ \relax
+ \box\scratchbox
+ \endgroup}
+
+%D \macros
+%D {cramedllap, crampedrlap, crampedclap}
+%D
+%D In many cases, one wants to use the \tex {clap} macro in
+%D math mode while using subscripts. Normally, subscripts are
+%D in cramped mode, and these macros allow you to go to
+%D cramped mode. For example:
+%D
+%D \startbuffer
+%D \startformula
+%D \sum_{a^2 < b^2 < c^2} \quad
+%D \sum_{\clap{a^2 < b^2 < c^2}} \quad
+%D \sum_{\crampedclap{a^2 < b^2 < c^2}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \start
+%D \typebuffer
+%D \switchtobodyfont[24pt]
+%D \getbuffer
+%D \stop
+%D
+%D Notice that \type {\clap{\cramped ... }} would also work,
+%D but it requires \TEX\ to typeset it arguments 16 times.
+
+\def\docrampedllap#1#2{{}\dollap{\docramped #1{#2}}}
+\def\docrampedrlap#1#2{{}\dorlap{\docramped #1{#2}}}
+\def\docrampedclap#1#2{{}\doclap{\docramped #1{#2}}}
+
+\def\crampedllap{\mathpalette\docrampedllap}
+\def\crampedrlap{\mathpalette\docrampedrlap}
+\def\crampedclap{\mathpalette\docrampedclap}
+
+\protect \endinput
diff --git a/tex/context/base/supp-mat.mkiv b/tex/context/base/supp-mat.mkiv
new file mode 100644
index 000000000..4aebddda9
--- /dev/null
+++ b/tex/context/base/supp-mat.mkiv
@@ -0,0 +1,293 @@
+%D \module
+%D [ file=supp-mat,
+%D version=1998.09.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Math,
+%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 For practical reasons, I decided to move some math things to
+%D a support module. There is nothing spectacular here. It may move
+%D back to math-ini.
+
+\writestatus{loading}{ConTeXt Support Macros / Math}
+
+\unprotect
+
+%D \macros
+%D {mathematics, math, nomathematics, startmathmode}
+%D
+%D The \type{$} can be both an begin and end math character.
+%D This can lead to confusing and errorprone situations when
+%D macros insert \type{$}. When for instance we have defined:
+%D
+%D \starttyping
+%D \def\MyPlus{$\,+\,$}
+%D \stoptyping
+%D
+%D the sequence \type{$x^2 \MyPlus y^2 = r^2$} will expand to:
+%D
+%D \starttyping
+%D $x^2 $\,+\,$ y^2 = r^2$
+%D \stoptyping
+%D
+%D Here the \type{\,} are given outside math mode and \TEX\ will
+%D definitely complain about this. A more save definition would
+%D have been:
+%D
+%D \starttyping
+%D \def\MyPlus{\mathematics{\,+\,}}
+%D \stoptyping
+%D
+%D Which is implemented as:
+
+\long\def\mathematics#1{\relax \ifmmode#1\else\Ustartmath #1\Ustopmath \fi}
+\long\def\displaymath#1{\noindent \ifmmode#1\else\Ustartdisplaymath#1\Ustopdisplaymath\fi}
+\long\def\inlinemath #1{\dontleavehmode\ifmmode#1\else\Ustartmath #1\Ustopmath \fi}
+
+\let\stopmathmode\relax
+
+\unexpanded\def\startmathmode % cannot be used nested
+ {\relax\ifmmode
+ \let\stopmathmode\relax
+ \else
+ \Ustartmath\let\stopmathmode\Ustopmath
+ \fi}
+
+\unexpanded\def\startmathmode % nested variant
+ {\relax\ifmmode
+ \begingroup\let\stopmathmode\endgroup
+ \else
+ \Ustartmath\let\stopmathmode\Ustopmath
+ \fi}
+
+\def\nomathematics#1%
+ {\relax\ifmmode\hbox{#1}\else#1\fi}
+
+\let\math\mathematics
+
+%D \macros
+%D {displaymathematics,inlinemathematics,automathematics}
+%D
+%D An example of usage of the following can be found in the MathML module:
+
+\long\def\displaymathematics#1{\relax\ifmmode#1\else\dostartformula{}#1\dostopformula\fi}
+ \def\inlinemathematics {\dontleavehmode\mathematics}
+ \def\automathematics {\relax\ifhmode\@EA\inlinemathematics\else\@EA\displaymathematics\fi}
+
+% better, esp when used in bTABLE ... eTABLE
+
+\def\automathematics
+ {\relax
+ \ifhmode
+ \expandafter\inlinemathematics
+ \else\ifintable
+ \expandafter\expandafter\expandafter\inlinemathematics
+ \else
+ \expandafter\expandafter\expandafter\displaymathematics
+ \fi\fi}
+
+%D \macros
+%D {dimension, nodimension}
+%D
+%D The next few macros are used for typesetting dimensions in
+%D such a way that spacing is acceptable. I won't spend much
+%D words on these macros, because they will be overloaded in
+%D the units module.
+
+\newsignal\dimensionsignal
+
+\def\dimensiontypeface {\tf}
+\def\dimensionhalfspace {\,}
+
+\unexpanded\def\dimension#1%
+ {\def\dodimensionsignal{\kern\dimensionsignal}%
+ \ifdim\lastskip=\zeropoint\relax
+ \ifdim\lastkern=\zeropoint\relax
+ \ifmmode
+ \mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
+ \else
+ \mathematics{\dimensiontypeface#1}%
+ \fi
+ \else\ifdim\lastkern=\dimensionsignal
+ \mathematics{\dimensionhalfspace\dimensiontypeface#1}%
+ \else
+ \unkern\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
+ \fi\fi
+ \else
+ \unskip\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
+ \fi
+ \dodimensionsignal}
+
+\unexpanded\def\nodimension#1%
+ {\unskip#1\global\let\dodimensionsignal\relax}
+
+%D \macros
+%D {super, suber}
+%D
+%D \TEX\ uses \type{^} and \type{_} for entering super- and
+%D subscript mode. We want however a bit more control than
+%D normally provided, and therefore provide \type {\super}
+%D and \type{\suber} (\type {\sub} is already taken).
+
+\global\let\normalsuper=^
+\global\let\normalsuber=_
+
+\newcount\supersubmode
+
+\newevery\everysupersub \EverySuperSub
+
+\appendtoks \advance\supersubmode 1\relax \to \everysupersub
+
+% \def\dodosuper#1{\normalsuper{\the\everysupersub#1}}
+% \def\dodosuber#1{\normalsuber{\the\everysupersub#1}}
+%
+% \def\dosuper{\ifx\next\bgroup\expandafter\dodosuper\else\normalsuper\fi}
+% \def\dosuber{\ifx\next\bgroup\expandafter\dodosuber\else\normalsuber\fi}
+%
+% \def\super{\futurelet\next\dosuper}
+% \def\suber{\futurelet\next\dosuber}
+
+\def\super#1{\normalsuper{\the\everysupersub#1}}
+\def\suber#1{\normalsuber{\the\everysupersub#1}}
+
+%D \macros
+%D {enablesupsub}
+%D
+%D We can let \type {^} and \type {_} act like \type {\super}
+%D and \type {\suber} by saying \type {\enablesupsub}.
+
+\bgroup
+\catcode`\^=\@@active
+\catcode`\_=\@@active
+\gdef\enablesupsub
+ {\catcode`\^=\@@active
+ \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
+ \catcode`\_=\@@active
+ \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
+\egroup
+
+%D \macros
+%D {restoremathstyle}
+%D
+%D We can pick up the current math style by calling \type
+%D {\restoremathstyle}.
+
+\def\restoremathstyle
+ {\ifmmode
+ \ifcase\supsubmode
+ \textstyle
+ \or
+ \scriptstyle
+ \else
+ \scriptscriptstyle
+ \fi
+ \fi}
+
+%D \macros
+%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 (\useurl
+%D {http://www.ctan.org/tex-archive/digests/tex-implementors/042}).
+%D
+%D \startbuffer
+%D \ruledhbox{$\left\{{x^2\over y^2}\right\}$}
+%D \ruledhbox{$\cramped{\left\{ {x^2\over y^2}\right\}}$}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\cramped
+ {\mathpalette\docramped}
+
+%D We force a cramped style by issuing a non||existing radical (box).
+%D After that we make sure the height is correct. (Comment taken from
+%D Morten Høgholm's mathtools package.) Macro suggested by AM and
+%D cleaned up a bit by HH.
+
+% original
+%
+% \def\docramped#1#2%
+% {\setbox\scratchbox\hbox
+% {\nulldelimiterspace\zeropoint
+% $\mathsurround\zeropoint#1\radical\zerocount{#2}$}%
+% \ifx#1\displaystyle
+% \scratchdimen\fontdimen8\textfont3
+% \advance\scratchdimen .25\fontdimen5\textfont2
+% \else
+% \scratchdimen1.25\fontdimen8
+% \ifx#1\textstyle\textfont
+% \else
+% \ifx#1\scriptstyle\scriptfont\else\scriptscriptfont\fi
+% \fi
+% 3
+% \fi
+% \advance\scratchdimen-\ht\scratchbox
+% \ht\scratchbox-\scratchdimen
+% \box\scratchbox}
+
+\def\docramped#1#2%
+ {\begingroup % added HH, made even more cramped
+ \setbox\scratchbox\hbox
+ {\nulldelimiterspace\zeropoint
+ \Ustartmath\mathsurround\zeropoint#1\radical\zerocount{#2}\Ustopmath}%
+ \ht\scratchbox-\dimexpr
+ \ifx#1\displaystyle
+ \fontdimen8\textfont3
+ +.25\fontdimen5\textfont2
+ \else
+ 1.25\fontdimen8
+ \ifx#1\textstyle
+ \textfont
+ \else\ifx#1\scriptstyle
+ \scriptfont
+ \else
+ \scriptscriptfont
+ \fi \fi
+ \plusthree
+ \fi
+ -\ht\scratchbox
+ \relax
+ \box\scratchbox
+ \endgroup}
+
+%D \macros
+%D {cramedllap, crampedrlap, crampedclap}
+%D
+%D In many cases, one wants to use the \tex {clap} macro in
+%D math mode while using subscripts. Normally, subscripts are
+%D in cramped mode, and these macros allow you to go to
+%D cramped mode. For example:
+%D
+%D \startbuffer
+%D \startformula
+%D \sum_{a^2 < b^2 < c^2} \quad
+%D \sum_{\clap{a^2 < b^2 < c^2}} \quad
+%D \sum_{\crampedclap{a^2 < b^2 < c^2}}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \start
+%D \typebuffer
+%D \switchtobodyfont[24pt]
+%D \getbuffer
+%D \stop
+%D
+%D Notice that \type {\clap{\cramped ... }} would also work,
+%D but it requires \TEX\ to typeset it arguments 16 times.
+
+\def\docrampedllap#1#2{{}\dollap{\docramped #1{#2}}}
+\def\docrampedrlap#1#2{{}\dorlap{\docramped #1{#2}}}
+\def\docrampedclap#1#2{{}\doclap{\docramped #1{#2}}}
+
+\def\crampedllap{\mathpalette\docrampedllap}
+\def\crampedrlap{\mathpalette\docrampedrlap}
+\def\crampedclap{\mathpalette\docrampedclap}
+
+\protect \endinput
diff --git a/tex/context/base/supp-mis.mkii b/tex/context/base/supp-mis.mkii
new file mode 100644
index 000000000..f3bde453b
--- /dev/null
+++ b/tex/context/base/supp-mis.mkii
@@ -0,0 +1,733 @@
+%D \module
+%D [ file=supp-mis,
+%D version=2004.10.26, % 1997.01.04,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Missing (For Generic Use),
+%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 will clean up this module (a la supp-pdf.tex preamble).
+
+%D Some support modules are more or less independant. This
+%D module, which is not part of plain \CONTEXT, provides the
+%D missing macros and declarations of registers.
+
+\ifx \undefined \writestatus \else \expandafter \endinput \fi
+
+%D Because \LATEX\ has no safe package loading mechanism, we
+%D need to take care of possible interference.
+
+\def\StartLatexHack % replace this by the one in supp-pdf
+ {\edef\StopLatexHack
+ {\catcode\string`\noexpand/=\the\catcode\string`/
+ \catcode\string`\noexpand-=\the\catcode\string`-
+ \catcode\string`\noexpand:=\the\catcode\string`:
+ \catcode\string`\noexpand;=\the\catcode\string`;
+ \catcode\string`\noexpand"=\the\catcode\string`"
+ \catcode\string`\noexpand<=\the\catcode\string`<
+ \catcode\string`\noexpand>=\the\catcode\string`>
+ \catcode\string`\noexpand`=\the\catcode\string``}%
+ \catcode\string`/=12 \catcode\string`-=12
+ \catcode\string`:=12 \catcode\string`;=12
+ \catcode\string`"=12 \catcode\string`<=12
+ \catcode\string`>=12 \catcode\string``=12 }
+
+%D This hack is needed especially for \LATEX\ users who use
+%D the Babel package. The Germans have active \type {"}'s, the
+%D Poles have \type {/}, while the French have \type {:} and
+%D \type {;} defines as command (thanks to Daniel Flipo for
+%D pointing that out and testing). Potentially active \type
+%D {?}'s and \type {!}'s are less dangerous since they are
+%D handled by the \type {\protect} and \type {\unprotect}
+%D macros.
+
+\StartLatexHack
+
+%D \macros
+%D {ifnocontextobject}
+%D
+%D First we take care of redundant defining. The next set of
+%D macros are a bit complicated by the fact that Plain
+%D \TEX\ defines the \type{\new}||macros as being outer.
+%D Furthermore nested \type{\if}'s can get us into
+%D trouble.
+
+\def\definecontextobject
+ {\iftrue}
+
+\def\gobblecontextobject
+ {\setbox0\hbox
+ \bgroup
+ \long\def\gobblecontextobject##1\fi{\egroup}%
+ \expandafter\gobblecontextobject\string}
+
+\long\def\ifnocontextobject#1\do
+ {\ifx#1\undefined
+ \expandafter\definecontextobject
+ \else
+ %\writestatus{system}{beware of conflicting \string#1}%
+ \expandafter\gobblecontextobject
+ \fi}
+
+%D \macros
+%D {beginETEX,beginTEX}
+%D
+%D Outside \CONTEXT\ we will not be \ETEX||aware.
+
+\long\def\beginETEX #1\endETEX {}
+
+\let\beginTEX\relax \let\endTEX\relax
+
+%D \macros
+%D {writestatus}
+%D
+%D We start each module with a message. Normally the output is
+%D formatted, but here we keep things simple.
+
+\ifnocontextobject \writestatus \do
+
+ \def\writestatus#1#2{\immediate\write16{#1 : #2}}
+
+\fi
+
+%D Let's see if it works.
+
+\writestatus{loading}{ConTeXt Support Macros / Miscellaneous (2004.10.26)}
+
+%D \macros
+%D {protect,unprotect}
+%D
+%D Next we present a poor mans alternative for \type{\protect}
+%D and \type{\unprotect}, two commands that enable us to use
+%D the characters \type{@}, \type{!} and \type{?} in macro
+%D names.
+
+\ifnocontextobject \protect \do
+
+ \let\protect\relax
+
+\fi
+
+\newcount\protectiondepth
+
+\ifnocontextobject \unprotect \do
+
+ \def\unprotect
+ {\advance\protectiondepth 1
+ \ifnum\protectiondepth=1
+ \let\normalprotect=\protect
+ \def\protect
+ {\ifnum\protectiondepth>0
+ \advance\protectiondepth -1
+ \ifnum\protectiondepth=0
+ \doprotect
+ \let\protect=\normalprotect
+ \fi
+ \fi}
+ \edef\doprotect
+ {\catcode`\noexpand @=\the\catcode`@\relax
+ \catcode`\noexpand !=\the\catcode`!\relax
+ \catcode`\noexpand ?=\the\catcode`?\relax}
+ \catcode`@=11
+ \catcode`!=11
+ \catcode`?=11
+ \fi}
+
+\fi
+
+%D We start using this one it at once.
+
+\unprotect
+
+%D \macros
+%D {scratch...,if...,next...}
+%D
+%D We need some scratch registers. Users are free to use them,
+%D but can never be sure of their value once another macro is
+%D called. We only allocate things when they are yet
+%D undefined. This way we can't mess up other macro packages,
+%D but of course previous definitions can mess up our modules.
+
+\ifnocontextobject \donetrue \do \newif\ifdone \fi
+
+% no time now, will do a better test later (based on dimendef)
+
+\def\!!stringa{plain} \ifx\!!stringa\fmtname \donetrue \else
+\def\!!stringa{eplain} \ifx\!!stringa\fmtname \donetrue \else
+\def\!!stringa{babel-plain} \ifx\!!stringa\fmtname \donetrue \else
+ \donefalse \fi \fi \fi
+
+\ifdone
+ % plain defines some 15 dimens, so we need to define a few
+ % dummies in order to get out of the scratch area
+ \newdimen\scratchdimen % 16
+ \newdimen\scratchdimen % 17
+ \newdimen\scratchdimen % 18
+ \newdimen\scratchdimen % 19
+ \newdimen\scratchdimen % 20
+ \newdimen\scratchdimen % 21
+\fi
+
+\def\stripnewabove#1%
+ {\ifnum10<9#1 #1\else\expandafter\stripnewabove\fi}%
+
+\def\newabove\csname#1\endcsname#2% \dimen \name
+ {\csname#1\endcsname#2%
+ \ifnum\expandafter\stripnewabove\meaning#2>20\else
+ \newabove\csname#1\endcsname#2%
+ \fi}
+
+\ifnocontextobject \scratchcounter \do \newabove \csname newcount\endcsname \scratchcounter \fi
+\ifnocontextobject \scratchtoks \do \newabove \csname newtoks\endcsname \scratchtoks \fi
+\ifnocontextobject \scratchdimen \do \newabove \csname newdimen\endcsname \scratchdimen \fi
+\ifnocontextobject \scratchskip \do \newabove \csname newskip\endcsname \scratchskip \fi
+\ifnocontextobject \scratchmuskip \do \newabove \csname newmuskip\endcsname \scratchmuskip \fi
+\ifnocontextobject \scratchbox \do \csname newbox\endcsname \scratchbox \fi
+\ifnocontextobject \scratchread \do \csname newread\endcsname \scratchread \fi
+\ifnocontextobject \scratchwrite \do \csname newwrite\endcsname \scratchwrite \fi
+
+%D Watch out, in the past we ran into troubles with \type {\onepoint}
+%D (and others) mening something different in \LATEX\ then here. In
+%D such situations clashes are bound to happen. For this reason the
+%D assignments are no inside the test. We try to catch those situations
+%D but we cannot keep ahead of the future.
+
+\ifnocontextobject \zeropoint \do \newdimen \zeropoint \zeropoint = 0pt \fi % else problems with dimen12
+\ifnocontextobject \onepoint \do \newdimen \onepoint \onepoint = 1pt \fi
+\ifnocontextobject \onebasepoint \do \newdimen \onebasepoint \onebasepoint = 1bp \fi
+\ifnocontextobject \zerocount \do \chardef \zerocount = 0 \fi
+\ifnocontextobject \plusone \do \chardef \plusone = 1 \fi
+\ifnocontextobject \minusone \do \newcount \minusone \minusone = -1 \fi
+\ifnocontextobject \thousandpoint \do \newdimen \thousandpoint \thousandpoint = 1000pt \fi
+\ifnocontextobject \onerealpoint \do \newdimen \onerealpoint \onerealpoint = 1pt \fi % latex has a funny \onepoint
+
+\ifnocontextobject \emptytoks \do \newtoks \emptytoks \fi
+\ifnocontextobject \nextbox \do \newbox \nextbox \fi
+\ifnocontextobject \nextdepth \do \newdimen \nextdepth \fi
+
+\ifnocontextobject \CONTEXTtrue \do \newif\ifCONTEXT \fi
+\ifnocontextobject \eightbitcharacterstrue \do \newif\ifeightbitcharacters \fi
+\ifnocontextobject \MPdrawingdonetrue \do \newif\ifMPdrawingdone \fi
+
+\ifnocontextobject \ifzeropt \do \let\ifzeropt\ifcase \fi
+
+%D \macros
+%D {@@...}
+%D
+%D We use symbolic name for \CATCODES. They can only be used
+%D when we are in unprotected state.
+
+\ifnocontextobject \@@escape \do \chardef\@@escape = 0 \fi
+\ifnocontextobject \@@begingroup \do \chardef\@@begingroup = 1 \fi
+\ifnocontextobject \@@endgroup \do \chardef\@@endgroup = 2 \fi
+\ifnocontextobject \@@endofline \do \chardef\@@endofline = 5 \fi
+\ifnocontextobject \@@ignore \do \chardef\@@ignore = 9 \fi
+\ifnocontextobject \@@space \do \chardef\@@space = 10 \fi
+\ifnocontextobject \@@letter \do \chardef\@@letter = 11 \fi
+\ifnocontextobject \@@other \do \chardef\@@other = 12 \fi
+\ifnocontextobject \@@active \do \chardef\@@active = 13 \fi
+\ifnocontextobject \@@comment \do \chardef\@@comment = 14 \fi
+
+\def\s!sp{sp}
+\def\s!pt{pt}
+\def\s!bp{bp}
+
+%D \macros
+%D {@EA,expanded,expandoneargafter,expandtwoargsafter}
+%D
+%D Also needed:
+
+\let\@EA=\expandafter \let\@@expanded\empty
+
+\def\expanded#1%
+ {\long\xdef\@@expanded{\noexpand#1}\@@expanded}
+
+\def\expandoneargafter#1#2%
+ {\@EA#1\@EA{#2}}
+
+\def\expandtwoargsafter#1#2#3%
+ {\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA{#3}}
+
+\def\@EAEAEA{\@EA\@EA\@EA}
+
+%D \macros
+%D {everyline,EveryLine,EveryPar}
+%D
+%D In \CONTEXT\ we use \type{\everypar} for special purposes
+%D and provide \type{\EveryPar} as an alternative. The same
+%D goes for \type{\everyline} and \type{\EveryLine}.
+
+\ifnocontextobject \everyline \do \newtoks\everyline \fi
+\ifnocontextobject \EveryPar \do \let\EveryPar =\everypar \fi
+\ifnocontextobject \EveryLine \do \let\EveryLine=\everyline \fi
+
+%D \macros
+%D {globallet}
+
+\def\globallet{\global\let}
+
+%D \macros
+%D {!!...}
+%D
+%D We reserve ourselves some scratch strings (i.e. macros)
+%D and some more counters.
+
+\ifnocontextobject \!!stringa \do \def\!!stringa {} \fi
+\ifnocontextobject \!!stringb \do \def\!!stringb {} \fi
+\ifnocontextobject \!!stringc \do \def\!!stringc {} \fi
+\ifnocontextobject \!!stringd \do \def\!!stringd {} \fi
+
+\ifnocontextobject \!!counta \do \newcount\!!counta {} \fi
+\ifnocontextobject \!!countb \do \newcount\!!countb {} \fi
+
+%D \macros
+%D {!!...}
+%D
+%D The next set of definitions speed up processing a bit.
+%D Furthermore it saves memory.
+
+\ifnocontextobject \!!zeropoint \do \def\!!zeropoint {0pt} \fi
+\ifnocontextobject \!!zerocount \do \def\!!zerocount {0} \fi
+\ifnocontextobject \!!tenthousand \do \def\!!tenthousand {10000} \fi
+
+\ifnocontextobject \!!width \do \def\!!width {width} \fi
+\ifnocontextobject \!!height \do \def\!!height {height} \fi
+\ifnocontextobject \!!depth \do \def\!!depth {depth} \fi
+
+\ifnocontextobject \!!plus \do \def\!!plus {plus} \fi
+\ifnocontextobject \!!minus \do \def\!!minus {minus} \fi
+\ifnocontextobject \!!to \do \def\!!to {to} \fi
+
+%D \macros
+%D {smashbox}
+%D
+%D The system modules offer a range of smashing macros, of
+%D which we only copied \type{\smashbox}.
+
+\ifnocontextobject \smashbox \do
+
+ \def\smashbox#1%
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint}
+
+\fi
+
+%D \macros
+%D {dowithnextbox}
+%D
+%D Also without further comment, we introduce a macro that
+%D gets the next box and does something usefull with it.
+%D Because the \type{\afterassignment} is executed inside the
+%D box, we have to use a \type{\aftergroup} too.
+
+\ifnocontextobject \dowithnextbox \do
+
+ \def\dowithnextbox#1%
+ {\def\dodowithnextbox{#1}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+ \def\dododowithnextbox%
+ {\aftergroup\dodowithnextbox}
+
+\fi
+
+%D \macros
+%D {setvalue,setevalue,setxvalue,,setgvalue,
+%D getvalue,
+%D letvalue,letgvalue}
+%D
+%D The next two macros expand their argument to
+%D \type{\argument}. The first one is used to define macro's
+%D the second one executes them.
+
+\ifnocontextobject \setvalue \do
+
+ \def\setvalue #1{\expandafter\def\csname#1\endcsname}
+ \def\setevalue#1{\expandafter\edef\csname#1\endcsname}
+ \def\setgvalue#1{\expandafter\gdef\csname#1\endcsname}
+ \def\setxvalue#1{\expandafter\xdef\csname#1\endcsname}
+ \def\getvalue #1{\csname#1\endcsname}
+ \def\letvalue #1{\expandafter\let\csname#1\endcsname}
+ \def\letgvalue#1{\global\expandafter\let\csname#1\endcsname}
+\fi
+
+%D \macros
+%D {unexpanded}
+%D
+%D The next command can be used as prefixed for commands that
+%D need protection during tests and writing to files. This
+%D is a very \CONTEXT\ specific one.
+
+\ifnocontextobject \unexpanded \do
+
+ \let\unexpanded\relax
+
+\fi
+
+%D \macros
+%D {convertargument}
+%D
+%D The original one offers a bit more, like global assignment, the
+%D the next implementation is however a bit more byte saving.
+
+\ifnocontextobject \convertargument \do
+
+ \def\doconvertargument#1>{}
+
+ \long\def\convertargument#1\to#2%
+ {\long\def\@@convertedargument{#1}%
+ \edef#2{\expandafter\doconvertargument\meaning\@@convertedargument}}
+
+\fi
+
+%D \macros
+%D {forgetall}
+%D
+%D Sometimes we have to disable interference of whatever kind
+%D of skips and mechanisms. The next macro resets some.
+
+\ifnocontextobject \forgetall \do
+
+ \def\forgetall
+ {\parskip\zeropoint
+ \leftskip\zeropoint
+ \parindent\zeropoint
+ \everypar{}}
+
+\fi
+
+%D \macros
+%D {withoutpt,
+%D ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints}
+%D
+%D \TEX\ lacks some real datastructure. We can however use
+%D \DIMENSIONS. This kind of trickery is needed when we want
+%D \TEX\ to communicate with the outside world (by means of
+%D \type{\specials}).
+
+\ifnocontextobject \withoutpt \do
+
+ {\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\t=\@@other
+ \gdef\WITHOUTPT#1pt{#1}}
+
+ \def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+ \def\ScaledPointsToBigPoints#1#2%
+ {\scratchdimen=#1sp\relax
+ \scratchdimen=.996264\scratchdimen
+ \edef#2{\withoutpt{\the\scratchdimen}}}
+
+ \def\ScaledPointsToWholeBigPoints#1#2%
+ {\scratchdimen=#1sp
+ \scratchdimen=.996264\scratchdimen
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by 32768
+ \divide\scratchcounter by 65536
+ \edef#2{\the\scratchcounter}}
+
+\fi
+
+%D \macros
+%D {doprocessfile}
+%D
+%D This macro takes three arguments: the file number, the
+%D filename and a macro that handles the content of a read
+%D line.
+
+\newif\iffileprocessed
+
+\ifnocontextobject \doprocessfile \do
+
+ \def\doprocessfile#1#2#3%
+ {\openin#1=#2\relax
+ \ifeof#1%
+ \fileprocessedfalse
+ \closein#1\relax
+ \else
+ \fileprocessedtrue
+ \gdef\dofinishfile%
+ {\closein#1\relax
+ \global\let\doprocessline\relax}%
+ \gdef\doprocessline%
+ {\ifeof#1%
+ \dofinishfile
+ \else
+ \global\read#1 to \fileline
+ #3\relax
+ \expandafter\doprocessline
+ \fi}%
+ \expandafter\doprocessline
+ \fi}
+
+\fi
+
+%D \macros
+%D {uncatcodespecials}
+%D
+%D This one is taken from the \TEX\ book. The \CONTEXT\
+%D alternative is a bit different, but we hope this one works
+%D here.
+
+\ifx\dospecials\undefined
+
+ \def\dospecials
+ {\do\ \do\\\do\{\do\}\do\$%
+ \do\#\do\^\do\_\do\&\do\%%
+ \do\~\do\^^A\do\^^K}
+
+\fi
+
+\ifnocontextobject \uncatcodespecials \do
+
+ \def\uncatcodespecials
+ {\def\do##1{\catcode`##1=12 }\dospecials
+ \catcode`\ =\@@space
+ \catcode`\^^L=\@@ignore
+ \catcode`\^^M=\@@endofline
+ \catcode`\^^?=\@@ignore}
+
+\fi
+
+\ifnocontextobject \setnaturalcatcodes \do
+
+\def\setnaturalcatcodes
+ {\catcode`\!=\@@other \catcode`\?=\@@other \catcode`\@=\@@other
+ \catcode`\#=\@@other \catcode`\&=\@@other \catcode`\|=\@@other
+ \catcode`\$=\@@other \catcode`\^=\@@other \catcode`\_=\@@other
+ \catcode`\*=\@@other \catcode`\/=\@@other
+ \catcode`\-=\@@other \catcode`+=\@@other
+ \catcode`\==\@@other \catcode`\<=\@@other \catcode`\>=\@@other
+ \catcode`\"=\@@other \catcode`\'=\@@other \catcode`\`=\@@other
+ \catcode`\:=\@@other \catcode`\;=\@@other
+ \catcode`\,=\@@other \catcode`\.=\@@other \catcode`\~=\@@other
+ \catcode`\(=\@@other \catcode`\)=\@@other
+ \catcode`\{=\@@other \catcode`\}=\@@other
+ \catcode`\\=\@@other \catcode`\%=\@@other }
+
+\fi
+
+%D \macros
+%D {doglobal}
+%D
+%D Some \CONTEXT\ low level macros can have a \type{\doglobal}
+%D prefix. Let's just forget about that here:
+
+\ifnocontextobject \doglobal \do \let\doglobal\relax \fi
+
+%D The next obscure one is needed in the generic verbatim
+%D environment. When we end up with more of these, it's time
+%D to load the module \type{syst-gen}.
+
+\ifnocontextobject \doifincsnameelse \do
+
+ \def\dodoifincsnameelse#1#2%
+ {\def\dododoifincsnameelse##1#1##2##3\war%
+ {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
+ \expandafter\dododoifincsnameelse#2#1@@\war}
+
+ \long\def\doifincsnameelse#1#2#3#4%
+ {\edef\@@instring{#1}%
+ \expandafter\dodoifincsnameelse\expandafter{\@@instring}{#2}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+\fi
+
+%D \macros
+%D {dostepwiserecurse, dorecurse, doloop, exitloop}
+%D
+%D The next loop macro is a real weak one, and does not offer
+%D the full \CONTEXT\ functionality, let alone nesting, but
+%D for simple purposes, its behaviour is acceptable.
+
+\newcount\recursecounter
+
+\def\dostepwiserecurse#1#2#3#4% very weak and rubishly version
+ {\ifnum#2<#1\relax\else\dodostepwiserecurse{#1}{#2}{#3}{#4}\fi}
+
+\def\dodostepwiserecurse#1#2#3#4% very weak and rubishly version
+ {\recursecounter=#1\relax
+ \loop
+ \edef\recurselevel{\the\recursecounter}%
+ #4\relax
+ \ifnum\recursecounter<#2\relax
+ \advance\recursecounter by #3\relax
+ \repeat}
+
+\def\dorecurse#1%
+ {\dostepwiserecurse{1}{#1}{1}}
+
+\def\doloop
+ {\dostepwiserecurse{1}{\maxdimen}{1}}
+
+\def\exitloop
+ {\recursecounter=\maxdimen}
+
+%D \macros
+%D {ifundefined,doifdefined,doifundefined,
+%D doifdefinedelse,doifundefinedelse}
+%D
+%D These alteratives are not robust but suitable for simple
+%D usage. The official ones are a bit faster.
+
+\ifnocontextobject \doifdefined \do
+
+ \def\ifundefined#1%
+ {\expandafter\ifx\csname#1\endcsname\relax}
+
+ \def\doifdefinedelse#1#2#3%
+ {\expandafter\ifx\csname#1\endcsname\relax#3\else#2\fi}
+
+ \def\doifundefinedelse#1#2#3%
+ {\expandafter\ifx\csname#1\endcsname\relax#2\else#3\fi}
+
+ \def\doifdefined#1#2%
+ {\expandafter\ifx\csname#1\endcsname\relax\else#2\fi}
+
+ \def\doifundefined#1#2%
+ {\expandafter\ifx\csname#1\endcsname\relax#2\fi}
+
+\fi
+
+%D \macros
+%D {doifinstringelse}
+%D
+%D It seems like we end up with more and more macros here.
+%D Sigh.
+
+\ifnocontextobject \doifinstringelse \do
+
+ \def\p!doifinstringelse#1#2%
+ {\def\pp!doifinstringelse##1#1##2##3\war%
+ {\csname if\if##2@fals\else tru\fi e\endcsname}%
+ \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}}
+
+ \long\def\doifinstringelse#1#2#3#4%
+ {\edef\@@@instring{#1}%
+ \@EA\p!doifinstringelse\@EA{\@@@instring}{#2}#3\else#4\fi}
+
+\fi
+
+%D \macros
+%D {twodigitrounding}
+%D
+%D We don't support rounding outside \CONTEXT. Sorry.
+
+\def\twodigitrounding#1{#1}
+
+%D \macros
+%D {lineheight}
+%D
+%D In \CONTEXT\ we have \type{\lineheight}, which in many
+%D cases matches \type {\baselineskip}.
+
+\ifnocontextobject \lineheight \do
+
+ \def\lineheight{\baselineskip}
+
+\fi
+
+%D \macros
+%D {dohandletokens}
+%D
+%D The following macro is the simplified version, but good
+%D enough for day to day hacks.
+%D
+%D \starttyping
+%D \dohandletokens some text\with\somemacro
+%D \stoptyping
+
+\ifnocontextobject \dohandletokens \do
+
+\def\dodohandletokens
+ {\ifx\next\end \else
+ \docommand{\next}%
+ \expandafter\dohandletokens
+ \fi}
+
+\def\dohandletokens
+ {\afterassignment\dodohandletokens\let\next= }
+
+\long\def\handletokens#1\with#2%
+ {\let\docommand=#2%
+ \dohandletokens#1\end}
+
+\fi
+
+%D Very reduced:
+
+\long\def\appendtoks#1\to#2%
+ {\scratchtoks{#1}\expanded{#2{\the#2\the\scratchtoks}}}
+
+%D Well, also handy.
+
+\def\doiffileelse#1#2#3%
+ {\immediate\openin\scratchread=#1\relax
+ \ifeof\scratchread
+ \def\next{#3}%
+ \else
+ \def\next{#2}%
+ \fi
+ \immediate\closein\scratchread
+ \next}
+
+%D New.
+
+\let\donothing\empty
+
+%D Also new:
+
+\def\letempty #1{\let#1\empty}
+\def\globalletempty#1{\global\let#1\empty}
+
+\def\letvalueempty #1{\expandafter\let\csname#1\endcsname\empty}
+\def\letgvalueempty#1{\global\expandafter\let\csname#1\endcsname\empty}
+
+%D Sigh
+
+\def\settrue #1{\chardef#1\zerocount}
+\def\setfalse#1{\chardef#1\plusone}
+
+\let\newconditional = \setfalse
+\let\ifconditional = \ifcase
+
+%D We could load \type {norm-tex} but this takes less hash space:
+
+\let \normalif = \if
+\let \normalifcase = \ifcase
+\let \normalifcat = \ifcat
+\let \normalifdim = \ifdim
+\let \normalifeof = \ifeof
+\let \normaliffalse = \iffalse
+\let \normalifhbox = \ifhbox
+\let \normalifhmode = \ifhmode
+\let \normalifinner = \ifinner
+\let \normalifmmode = \ifmmode
+\let \normalifnum = \ifnum
+\let \normalifodd = \ifodd
+\let \normaliftrue = \iftrue
+\let \normalifvbox = \ifvbox
+\let \normalifvmode = \ifvmode
+\let \normalifvoid = \ifvoid
+\let \normalifx = \ifx
+\let \normalfi = \fi
+\let \normalelse = \else
+
+\let \normalunexpanded = \unexpanded % beware the primitive, not the context one
+
+%D That's it. Please forget this junk and take a look at how
+%D it should be done.
+
+\StopLatexHack \protect \endinput
diff --git a/tex/context/base/supp-mis.tex b/tex/context/base/supp-mis.tex
new file mode 100644
index 000000000..bda8d4f6f
--- /dev/null
+++ b/tex/context/base/supp-mis.tex
@@ -0,0 +1,4 @@
+% This file is not needed, for instance supp-pdf has the relevant code
+% built in and ppchtex is adapted.
+
+\input supp-mis.mkii
diff --git a/tex/context/base/supp-mpe.mkii b/tex/context/base/supp-mpe.mkii
new file mode 100644
index 000000000..67b27919c
--- /dev/null
+++ b/tex/context/base/supp-mpe.mkii
@@ -0,0 +1,1370 @@
+%D \module
+%D [ file=supp-mpe,
+%D version=1999.07.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=METAPOST Special Extensions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% fuzzy and complicating is the fact that we need to support
+% context as well as mptopdf, so we cannot fall back on the
+% special drivers and color module (although there may be
+% good reasons to use a smaller context instead); also,
+% shading is handled here while it should move to the special
+% driver - to do!
+
+%D This module is still experimental and deals with some
+%D extensions to \METAPOST. When using \POSTSCRIPT\ output,
+%D these extensions can be supplied by means of proper
+%D preamble definitions, but when producing \PDF\ we have to
+%D set up the appropriate datastructures ourselves. It acts as
+%D a plug in into \type {supp-pdf}. As soon as we need more
+%D extensions, we will generalize these macro. Some
+%D definitions will move to the special drivers.
+
+%D For usage in plain \TEX, say something:
+%D
+%D \starttyping
+%D \input supp-pdf
+%D \input supp-mpe
+%D
+%D \MPcmykcolorstrue
+%D \MPspotcolorstrue
+%D \chardef\makeMPintoPDFobject\plusone
+%D \stoptyping
+
+\ifx\writestatus\undefined
+ \immediate\write16{[Loading MPS to PDF extensions.]}
+\else
+ \writestatus{loading}{ConTeXt Support Macros / MPS extensions}
+\fi
+
+%D We implement extensions by using the \METAPOST\ special
+%D mechanism. Opposite to \TEX's specials, the \METAPOST\ ones
+%D are flushed before or after the graphic data, but thereby
+%D are no longer connected to a position.
+%D
+%D We implement specials by overloading the \type {fill}
+%D operator. By counting the fills, we can let the converter
+%D treat the appropriate fill in a special way. The
+%D specification of the speciality can have two forms,
+%D determined by the setting of a boolean variable:
+%D
+%D \starttyping
+%D _inline_specials_ := false ; % comment like code (default)
+%D _inline_specials_ := true ; % command like code
+%D \stoptyping
+%D
+%D When the specification is embedded as comment, it looks
+%D like:
+%D
+%D \starttyping
+%D %%MetaPostSpecial <size> <data> <number> <identifier>
+%D \stoptyping
+%D
+%D The in||line alternative is more tuned for \POSTSCRIPT,
+%D since it permits us to define a macro \type {special}.
+%D
+%D \starttyping
+%D inline : <data> <number> <identifier> <size> special
+%D \stoptyping
+%D
+%D The \type {identifier} determines what to do, and the data
+%D can be used to accomplish this. A type~2 shading function
+%D has identifier~2. Alltogether, the number of parameters is
+%D specified in \type {size}. The \type {number} is the number
+%D of the fill that needs the special treatment. For a type~2
+%D and~3 shaded fill, the datablock contains the following
+
+%D data:
+%D
+%D \starttyping
+%D from to n inner_r g b x y outer_r g b x y
+%D from to n inner_r g b x y radius outer_r g b x y radius
+%D \stoptyping
+%D
+%D The implementation below saves the data on the stack in
+%D a way similar to the macros in \type {supp-pdf.tex}, and
+%D just overload a few already defined handlers. That way,
+%D the existing macros are still generic. \footnote {Actually,
+%D the macros here are just as generic.}
+%D
+%D Currently the only extension concerns shading, which is
+%D accomplished by handling yet another value of \type
+%D {\finiMPpath}. The recource disctionary is stored and
+%D later picked up by the general \CONTEXT\ figure inclusion
+%D macros.
+
+\unprotect
+
+%D The \type {%%MetaPostSpecials: version.revision signal} line
+%D triggers this module into handling color specifications kind
+%D of special. We need this safeguard for non||special
+%D usage.
+
+\chardef\MPspecialversion = 0 % specials when >1
+\chardef\MPspecialrevision = 0 % specials when >1
+\chardef\MPspecialsignal = 0 % passed on by graphic
+
+\chardef\inlineMPspecials = 1 % only needed for stack resetting
+
+%D This macro handles the special definitions that are
+%D passed as comment.
+
+\def\dohandleMPspecialcomment#1
+ {\setMPargument{#1}%
+ \advance\scratchcounter \minusone
+ \ifcase\scratchcounter
+ \handleMPspecialcommand
+ \donetrue
+ \doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \expandafter\handleMPsequence
+ \else
+ \expandafter\dohandleMPspecialcomment
+ \fi}
+
+\def\handleMPspecialcomment #1 % number of arguments
+ {\doresetMPstack
+ \scratchcounter#1\relax
+ \ifcase\scratchcounter % when zero, inline shading is used
+ \chardef\inlineMPspecials\plusone
+ \let\handleMPsequence\dohandleMPsequence
+ \expandafter\handleMPsequence
+ \else
+ \chardef\inlineMPspecials\zerocount
+ \expandafter\dohandleMPspecialcomment
+ \fi}
+
+%D When defined inline, we use another macro to handle the
+%D definitions. Actually, this macro is called by the
+%D previous ones.
+
+\def\handleMPspecialcommand
+ {\ifcase\inlineMPspecials\or
+ \advance\nofMParguments \minusone % pop the size
+ \fi
+ \ifundefined\MPspecial
+ \message{[unknown \MPspecial]}%
+ \else
+ \csname\MPspecial\endcsname
+ \fi
+ \ifcase\inlineMPspecials
+ \doresetMPstack % 0
+ \else
+ \resetMPstack % 1
+ \fi}
+
+%D This macro triggers special support. Currently, the
+%D version and revision number are not used. Any version number
+%D greater than zero will enable special support.
+
+\newconditional\manyMPspecials % \settrue\manyMPspecials
+
+\def\handleMPspecialscomment #1.#2 #3 % version.revision signal #4=div=1000|10000
+ {\doresetMPstack
+ \chardef\MPspecialversion #1%
+ \chardef\MPspecialrevision#2%
+ \chardef\MPspecialsignal #3%
+ \let\handleMPsequence\dohandleMPsequence
+ \ifnum#1=\plusone
+ \expandafter\handleMPsequence
+ \else
+ \expandafter\handleMPspecialscommentx
+ \fi}
+
+\def\handleMPspecialscommentx #1 % version 2
+% {\doifelsedoifelse{#1}{10000}{\settrue\manyMPspecials}{\setfalse\manyMPspecials}% local
+ {\ifnum10000=0#1\relax
+ \settrue \manyMPspecials
+ \else
+ \setfalse\manyMPspecials
+ \fi
+ \setMPextensions
+ \handleMPsequence}
+
+% one can say (in meta-ini):
+%
+% \prependtoks
+% _special_div_ := 1000\ifconditional\manyMPspecials0\fi ;
+% \to \MPextensions
+
+%D In case of \PDF, we need to prepare resourcs.
+
+\newtoks\MPstartresources
+\newtoks\MPstopresources
+
+\def\startMPresources
+ {\the\MPstartresources
+ \ifx\currentPDFresources\empty\else
+ \message{[unused resources]}%
+ \fi
+ \global\let\currentPDFresources\empty}
+
+\def\stopMPresources
+ {\let\currentPDFresources\empty
+ \the\MPstopresources}
+
+%D Since colors are not subjected to transformations, we can
+%D only use colors as signal. In our case, we use a dummy colored
+%D path with a red color component of \type {0.n}, so \type
+%D {0.001} is the first path and \type {0.010} the tenth. Since
+%D \METAPOST strips trailing zeros, we have to padd the string.
+
+\newif\ifMPcmykcolors
+\newif\ifMPspotcolors
+
+\ifx\normalhandleMPrgbcolor\undefined % in case we reload this module
+
+ \let\normalhandleMPrgbcolor \handleMPrgbcolor
+ \let\normalhandleMPcmykcolor\handleMPcmykcolor
+ \let\normalhandleMPgraycolor\handleMPgraycolor
+ \let\normalhandleMPspotcolor\handleMPspotcolor
+
+\fi
+
+%D When we are using \CONTEXT, we will fall back to the
+%D better color conversion routines. This also has the advantage
+%D that we don't have to parse and convert the file. In this
+%D alternative, \type {\!MP} is not (yet) supported. Because
+%D we can (for efficiency reasons) turn off strokecolor,
+%D something we cannot do in \METAPOST\ converted code.
+
+\newif\ifPDFMPstrokecolor \PDFMPstrokecolortrue
+
+%D [This code should move to meta-ini.]
+
+\ifCONTEXT % we can use this for a better xgstate handling
+
+ \def\checkPDFMPstrokecolor
+ {\ifPDFMPstrokecolor \PDFstrokecolortrue \fi}
+
+ \def\normalhandleMPrgbcolor
+ {{\checkPDFMPstrokecolor\execcolorR\gMPa1:\gMPa2:\gMPa3:0:0\od}}
+
+ \def\normalhandleMPcmykcolor
+ {{\checkPDFMPstrokecolor\execcolorC\gMPa1:\gMPa2:\gMPa3:\gMPa4:0:0\od}}
+
+ \def\normalhandleMPgraycolor
+ {{\checkPDFMPstrokecolor\execcolorS\gMPa1:0:0\od}}
+
+% \def\normalhandleMPspotcolor
+% {{\checkPDFMPstrokecolor\execcolorP\gMPa1:\gMPa2:0:0\od}}
+
+ \def\normalhandleMPspotcolor % ???
+ {{\checkPDFMPstrokecolor\execcolorP\gMPa1:\gMPa2:\gMPa3:\gMPa4:0:0\od}}
+
+\fi
+
+% In the previous macros we use the special drivers. A more
+% direct approach would have been:
+%
+% \def\doPDFstartrgbcolormode#1#2#3%
+% {\PDFcode{#1 #2 #3 rg #1 #2 #3 RG}}
+%
+% \def\doPDFstartcmykcolormode#1#2#3#4%
+% {\PDFcode{#1 #2 #3 #4 k #1 #2 #3 #4 K}}
+%
+% \def\doPDFstartgraycolormode#1%
+% {\PDFcode{#1 g #1 G}}
+%
+% \appendtoks
+% \let\dostartrgbcolormode \doPDFstartrgbcolormode
+% \let\dostartcmykcolormode\doPDFstartcmykcolormode
+% \let\dostartgraycolormode\doPDFstartgraycolormode
+% \to \everyMPtoPDFconversion
+
+%D Now we can handle special color signals. We only do this
+%D when special are detected.
+
+% \def\MPrgbnumber#1{\expandafter\doMPrgbnumber#1000.0000\relax}
+% \def\doMPrgbnumber#1.#2#3#4#5\relax{#2#3#4}
+
+%D We cannot use \type {\everyMPtoPDFconversion} because in \MPTOPDF\
+%D we don't have the \type {\appendtoks} macro available.
+
+\def\setMPextensions
+ {\ifconditional\manyMPspecials
+ \def\MPrgbnumber##1{\expandafter\doMPrgbnumber##10000.00000\relax}%
+ \def\doMPrgbnumber##1.##2##3##4##5##6\relax{##2##3##4##5}%
+ \else
+ \def\MPrgbnumber##1{\expandafter\doMPrgbnumber##1000.0000\relax}%
+ \def\doMPrgbnumber##1.##2##3##4##5\relax{##2##3##4}%
+ \fi}
+
+%D The naive case looks like:
+%D
+%D \starttyping
+%D \def\handleMPrgbcolor%
+%D {\setMPcolor
+%D \ifcase\MPspecialversion
+%D \resetMPcolor\normalhandleMPrgbcolor
+%D \else\ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
+%D % consider it to be a signal
+%D \else
+%D \resetMPcolor\normalhandleMPrgbcolor
+%D \fi\fi}
+%D \stoptyping
+%D
+%D However, since we want \CMYK\ support, we will use the
+%D following implementation:
+
+% \def\setMPcolor
+% {\edef\lastMPrvalue{\gMPa1}%
+% \edef\lastMPgvalue{\gMPa2}%
+% \edef\lastMPbvalue{\gMPa3}}
+%
+% speed up (hardly called, so no let is needed)
+
+\def\setMPcolor
+ {\edef\lastMPrvalue{\csname\@@MP01\endcsname}%
+ \edef\lastMPgvalue{\csname\@@MP02\endcsname}%
+ \edef\lastMPbvalue{\csname\@@MP03\endcsname}}
+
+\def\zeroMPrgbvalue{0.0}
+
+\def\resetMPcolor
+ {\let\lastMPrvalue\zeroMPrgbvalue
+ \let\lastMPgvalue\zeroMPrgbvalue
+ \let\lastMPbvalue\zeroMPrgbvalue}
+
+\resetMPcolor
+
+\def\@@MPSK{@MPSK@}
+\def\@@MPSP{@MPSP@}
+
+\def\interceptMPcmykcolor % todo : \ifMPcmykcolors
+ {\ifcase\MPrgbnumber\lastMPgvalue
+ % cannot happen
+ \or
+ % 1 == cmyk color spec
+ \ifMPcmykcolors \dointerceptMPcmykcolor \fi
+ \or
+ % 2 == spot color
+ \ifMPspotcolors \dointerceptMPspotcolor \fi
+ \or
+ % 3 == rgb transparency
+ \invokeMPtransparencyspecial
+ \or
+ % 4 == cmyk transparency
+ \ifMPcmykcolors \invokeMPtransparencyspecial \fi
+ \or
+ % 5 == spot transparency
+ \ifMPspotcolors \invokeMPtransparencyspecial \fi
+ \else
+ % \writestatus{MPtoPDF}{unknown direct special}%
+ \fi}
+
+% ifcsname
+
+\def\dointerceptMPcmykcolor
+ {\revokeMPtransparencyspecial
+ \@EA\ifx\csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname\relax\else
+ \@EA\@EA\@EA\setMPcmyk\csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname
+ \normalhandleMPcmykcolor
+ \fi}
+
+\def\dointerceptMPspotcolor
+ {\revokeMPtransparencyspecial
+ \@EA\ifx\csname\@@MPSP\number\MPrgbnumber\lastMPbvalue\endcsname\relax\else
+ \@EA\@EA\@EA\setMPspot\csname\@@MPSP\number\MPrgbnumber\lastMPbvalue\endcsname
+ \normalhandleMPspotcolor
+ \fi}
+
+\def\handleMPrgbcolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion
+ \normalhandleMPrgbcolor
+ \else
+ \setMPcolor
+ \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal\relax
+ \interceptMPcmykcolor
+ \else
+ \revokeMPtransparencyspecial
+ \normalhandleMPrgbcolor
+ \fi
+ \fi}
+
+\def\handleMPgraycolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion \else \revokeMPtransparencyspecial \fi
+ \normalhandleMPgraycolor}
+
+\def\handleMPcmykcolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion \else \revokeMPtransparencyspecial \fi
+ \normalhandleMPcmykcolor}
+
+%D Specials are define and recalled using:
+
+\def\MPspecial
+ {MP special \gMPs\nofMParguments}
+
+\def\defineMPspecial#1#2%
+ {\setvalue{MP special #1}{#2}}
+
+%D The path processing macro is slightly extended.
+
+\newtoks \invokeMPspecials
+
+\def\finishMPpath
+ {\PDFcode
+ {\ifcase\finiMPpath W n\or S\or f\or B\else W n\fi
+ \extraMPpathcode}}
+
+\def\processMPpath
+ {\checkMPpath % !
+ \ifcase\nofMPsegments\else
+ \let\extraMPpathcode\empty
+ \ifcase\MPspecialversion\else
+ \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
+ \ifnum\MPrgbnumber\lastMPgvalue>10 % really needed
+ \scratchcounter\MPrgbnumber\lastMPbvalue
+ \edef\currentMPspecial{\the\scratchcounter}%
+\let\previousMPcolorspec\currentMPcolorspec
+\edef\currentMPcolorspec{\lastMPrvalue\lastMPgvalue\lastMPbvalue}%
+\ifx\previousMPcolorspec\currentMPcolorspec \else
+ \revokeMPtransparencyspecial
+\fi
+ \ifnum\finiMPpath=2 % to outer level
+ \the\invokeMPspecials
+ \fi
+ \fi
+ \fi
+ \fi
+ \flushMPpath
+ \closeMPpath
+ \finishMPpath
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments0
+ \handleMPsequence}
+
+%D Shading is an example of a more advanced graphic feature,
+%D but users will seldom encounter those complications. Here
+%D we only show a few simple examples, but many other
+%D alternatives are possible by setting up the functions built
+%D in \PDF\ in the appropriate way.
+%D
+%D Shading has to do with interpolation between two or more
+%D points or user supplied ranges. In \PDF, the specifications
+%D of a shade has to be encapsulated in objects and passed on
+%D as resources. This is a \PDF\ level 1.3. feature. One can
+%D simulate three dimensional shades as well and define simple
+%D functions using a limited set of \POSTSCRIPT\ primitives.
+%D Given the power of \METAPOST\ and these \PDF\ features, we
+%D can achieve superb graphic effects.
+%D
+%D Since everything is hidden in \TEX\ and \METAPOST\ graphics,
+%D we can stick to high level \CONTEXT\ command, as shown in
+%D the following exmples.
+%D
+%D \startbuffer
+%D \startuniqueMPgraphic{CircularShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D circular_shade(p,0,.2red,.9red) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{LinearShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,0,.2blue,.9blue) ;
+%D \stopuniqueMPgraphic
+%D
+%D \startuniqueMPgraphic{DuotoneShade}
+%D path p ; p := unitsquare xscaled \overlaywidth yscaled \overlayheight ;
+%D linear_shade(p,2,.5green,.5red) ;
+%D \stopuniqueMPgraphic
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These graphics can be hooked into the overlay mechanism,
+%D which is available in many commands.
+%D
+%D \startbuffer
+%D \defineoverlay[demo 1][\uniqueMPgraphic{CircularShade}]
+%D \defineoverlay[demo 2][\uniqueMPgraphic {LinearShade}]
+%D \defineoverlay[demo 3][\uniqueMPgraphic {DuotoneShade}]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D These backgrounds can for instance be applied to \type
+%D {\framed}:
+%D
+%D \startbuffer
+%D \setupframed[width=3cm,height=2cm,frame=off]
+%D \startcombination[3*1]
+%D {\framed[background=demo 1]{\bfd \white Demo 1}} {}
+%D {\framed[background=demo 2]{\bfd \white Demo 2}} {}
+%D {\framed[background=demo 3]{\bfd \white Demo 3}} {}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D There are a few more alternatives, determined by the second
+%D parameter passed to \type {circular_shade} and alike.
+%D
+%D \def\SomeShade#1#2#3#4#5%
+%D {\startuniqueMPgraphic{Shade-#1}
+%D width := \overlaywidth ;
+%D height := \overlayheight ;
+%D path p ; p := unitsquare xscaled width yscaled height ;
+%D #2_shade(p,#3,#4,#5) ;
+%D \stopuniqueMPgraphic
+%D \defineoverlay[Shade-#1][\uniqueMPgraphic{Shade-#1}]%
+%D \framed[backgroundachtergrond=Shade-#1,width=2cm,height=2cm,frame=off]{}}
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{10}{circular}{0}{.3blue}{.9blue}} {circular 0}
+%D {\SomeShade{11}{circular}{1}{.3blue}{.9blue}} {circular 1}
+%D {\SomeShade{12}{circular}{2}{.3blue}{.9blue}} {circular 2}
+%D {\SomeShade{13}{circular}{3}{.3blue}{.9blue}} {circular 3}
+%D {\SomeShade{14}{circular}{4}{.3blue}{.9blue}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[5*1]
+%D {\SomeShade{20}{circular}{0}{.9green}{.3green}} {circular 0}
+%D {\SomeShade{21}{circular}{1}{.9green}{.3green}} {circular 1}
+%D {\SomeShade{22}{circular}{2}{.9green}{.3green}} {circular 2}
+%D {\SomeShade{23}{circular}{3}{.9green}{.3green}} {circular 3}
+%D {\SomeShade{24}{circular}{4}{.9green}{.3green}} {circular 4}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \startcombination[4*1]
+%D {\SomeShade{30}{linear}{0}{.3red}{.9red}} {linear 0}
+%D {\SomeShade{31}{linear}{1}{.3red}{.9red}} {linear 1}
+%D {\SomeShade{32}{linear}{2}{.3red}{.9red}} {linear 2}
+%D {\SomeShade{33}{linear}{3}{.3red}{.9red}} {linear 3}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D These macros closely cooperate with the \METAPOST\ module
+%D \type {mp-spec.mp}, which is part of the \CONTEXT\
+%D distribution.
+%D
+%D The low level (\PDF) implementation is based on the \TEX\
+%D based \METAPOST\ to \PDF\ converter. Shading is supported
+%D by overloading the \type {fill} operator as implemented
+%D earlier. In \PDF\ type~2 and~3 shading functions are
+%D specified in terms of:
+%D
+%D \starttabulate[|Tl|l|]
+%D \NC /Domain \NC sort of meeting range \NC \NR
+%D \NC /C0 \NC inner shade \NC \NR
+%D \NC /C1 \NC outer shade \NC \NR
+%D \NC /N \NC smaller values, bigger inner circles \NC \NR
+%D \stoptabulate
+
+\newcount\currentPDFshade % 0 % global (document wide) counter
+\let\currentMPshades\empty
+
+\def\startMPshading#1%
+ {\edef\currentMPspecial{\gMPs{#1}}}
+
+\def\stopMPshading
+ {\global\advance\currentPDFshade \plusone
+ \setxvalue{obj:Sh:\currentMPspecial}%
+ {/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }%
+ \setxvalue{mps:Sh:\currentMPspecial}%
+ {\the\currentPDFshade}}
+
+\appendtoks
+ \global\let\currentMPshades\empty
+\to \MPstartresources
+
+\appendtoks
+ \ifx\currentMPshades\empty \else
+ \xdef\currentPDFresources{\currentPDFresources
+ /Shading <<\currentMPshades>>}%
+ \fi
+\to \MPstopresources
+
+\def\invokeMPshadespecial
+ {\ifundefined{mps:Sh:\currentMPspecial}\else
+ \edef\currentMPshade{\getvalue{obj:Sh:\currentMPspecial}}%
+ \doifinstringelse\currentMPshade\currentMPshades \donothing
+ {\xdef\currentMPshades{\currentMPshades\currentMPshade}}%
+ \def\extraMPpathcode{/Sh\getvalue{mps:Sh:\currentMPspecial} sh Q}%
+ \chardef\finiMPpath\zerocount
+ \PDFcode{q /Pattern cs}%
+ \fi}
+
+\appendtoks \invokeMPshadespecial \to \invokeMPspecials
+
+%D We need to convert the \CMYK\ specials into colors, because
+%D we have to do it twice, we define a macro.
+
+% \def\checkMPshadingcolor#1#2#3#4#5%
+% {\edef\tempMPrvalue{\csname\@@MP0#1\endcsname}%
+% \edef\tempMPgvalue{\csname\@@MP0#2\endcsname}%
+% \edef\tempMPbvalue{\csname\@@MP0#3\endcsname}%
+% \edef#5%
+% {\ifx\tempMPrvalue\tempMPgvalue
+% \ifx\tempMPrvalue\tempMPbvalue
+% \ifx\tempMPgvalue\tempMPbvalue
+% \tempMPbvalue
+% \fi
+% \fi
+% \fi}%
+% \edef#4% todo : spotcolors
+% {\ifnum\MPrgbnumber\tempMPrvalue=\MPspecialsignal\space
+% \ifMPcmykcolors\getvalue{\@@MPSK\number\MPrgbnumber\tempMPbvalue}\fi
+% \fi}}
+
+\def\checkMPshadingcolor#1#2#3#4#5%
+ {\edef\tempMPrvalue{\csname\@@MP0#1\endcsname}%
+ \edef\tempMPgvalue{\csname\@@MP0#2\endcsname}%
+ \edef\tempMPbvalue{\csname\@@MP0#3\endcsname}%
+ \global\let\MPresolvedspace\MPgrayspace
+ \global\let\MPresolvedcolor\!!zerocount
+ \ifnum\MPrgbnumber\tempMPrvalue=\MPspecialsignal\relax
+ \ifcase\MPrgbnumber\tempMPgvalue
+ \or % 1 = cmyk
+ \ifMPcmykcolors
+ \expanded{\resolveMPcmykcolor\getvalue{\@@MPSK\number\MPrgbnumber\tempMPbvalue}}\end
+ \fi
+ \or % 2 = spot
+ \ifMPspotcolors
+ \expanded{\resolveMPspotcolor\getvalue{\@@MPSP\number\MPrgbnumber\tempMPbvalue}}\end
+ \fi
+ \or
+ % 3 = rgb transparency
+ % to do
+ \or
+ % 4 == cmyk transparency
+ % \ifMPcmykcolors
+ % to do
+ % \fi
+ \or
+ % 5 == spot transparency
+ % \ifMPspotcolors
+ % to do
+ % \fi
+ \fi
+ \else
+ \ifx\tempMPrvalue\tempMPgvalue
+ \ifx\tempMPrvalue\tempMPbvalue
+ \expanded{\resolveMPgraycolor\tempMPbvalue}\end
+ \else
+ \expanded{\resolveMPrgbcolor\tempMPrvalue\space\tempMPgvalue\space\tempMPbvalue}\end
+ \fi
+ \else
+ \expanded{\resolveMPrgbcolor\tempMPrvalue\space\tempMPgvalue\space\tempMPbvalue}\end
+ \fi
+ \fi
+ \let#4\MPresolvedcolor
+ \let#5\MPresolvedspace}
+
+%D We also need to make sure that we have two \RGB\ or
+%D \CMYK colors, since we have to set the colorspace.
+
+\def\setMPshadingcolors#1#2#3#4#5#6% color space
+ {\checkMPshadingcolor{#1}{#2}{#3}\MPshadeAc\MPshadeAs
+ \checkMPshadingcolor{#4}{#5}{#6}\MPshadeBc\MPshadeBs
+ \ifx\MPshadeAs\MPshadeBs
+ \let\MPshadeA\MPshadeAc
+ \let\MPshadeB\MPshadeBc
+ \let\MPshadeC\MPshadeAs
+ \else\ifx\MPshadeAs\MPgrayspace
+ \ifx\MPshadeBs\MPrgbspace
+ \edef\MPshadeA{\MPshadeAc\space\MPshadeAc\space\MPshadeAc}%
+ \else
+ \negatecolorcomponent\MPshadeAc
+ \edef\MPshadeA{0 0 0 \MPshadeAc}%
+ \fi
+ \let\MPshadeB\MPshadeBc
+ \let\MPshadeC\MPshadeBs
+ \else\ifx\MPshadeBs\MPgrayspace
+ \let\MPshadeA\MPshadeAc
+ \ifx\MPshadeAs\MPrgbspace
+ \edef\MPshadeB{\MPshadeBc\space\MPshadeBc\space\MPshadeBc}%
+ \else
+ \negatecolorcomponent\MPshadeBc
+ \edef\MPshadeB{0 0 0 \MPshadeBc}%
+ \fi
+ \let\MPshadeC\MPshadeAs
+ \else
+ % different color spaces
+ \def\MPshadeA{1}%
+ \def\MPshadeB{1}%
+ \let\MPshadeC\MPgrayspace
+ \fi\fi\fi}
+
+\let\MPshadeA\MPcmykWhite
+\let\MPshadeB\MPcmykBlack
+\let\MPshadeC\MPgrayspace
+
+%D The reason why this macro is a bit complicates is that we
+%D handle black and white situations (otherwise we would have
+%D to use \CMYK\ b/w in case of a \CMYK\ shade).
+
+%D Here are the special handlers:
+
+\defineMPspecial{30}
+ {\startMPshading{14}% type 2
+ \setMPshadingcolors{4}{5}{6}{9}{10}{11}%
+ \immediate\pdfobj
+ {<</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \immediate\pdfobj
+ {<</ShadingType 2
+ /ColorSpace /\MPshadeC\space
+ /Function \the\pdflastobj\space 0 R
+ /Coords [\gMPs7 \gMPs8 \gMPs{12} \gMPs{13}]
+ /Extend [true true]>>}%
+ \stopMPshading}
+
+\defineMPspecial{31}
+ {\startMPshading{16}% type 3
+ \setMPshadingcolors{4}{5}{6}{10}{11}{12}%
+ \immediate\pdfobj
+ {<</FunctionType 2
+ /Domain [\gMPs1 \gMPs2]
+ /C0 [\MPshadeA]
+ /C1 [\MPshadeB]
+ /N \gMPs3>>}%
+ \immediate\pdfobj
+ {<</ShadingType 3
+ /ColorSpace /\MPshadeC\space
+ /Function \the\pdflastobj\space 0 R
+ /Coords [\gMPs7 \gMPs8 \gMPs9 \gMPs{13} \gMPs{14} \gMPs{15}]
+ /Extend [true true]>>}%
+ \stopMPshading}
+
+%D Figure inclusion is kind of strange to \METAPOST, but when
+%D Santiago Muelas started discussing this with me, I was able
+%D to cook up a solution using specials.
+
+\def\invokeMPfigurespecial%
+ {\getvalue{mps:gr:\currentMPspecial}} % or \relax
+
+\appendtoks \invokeMPfigurespecial \to \invokeMPspecials
+
+\defineMPspecial{10}
+ {\setxvalue{mps:gr:\gMPs8}%
+ {\noexpand\handleMPfigurespecial
+ {\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}%
+ \noexpand\setxvalue{mps:gr:\gMPs8}{}}}
+
+% \def\handleMPfigurespecial#1#2#3#4#5#6#7%
+% {\vbox to 0pt
+% {\vss
+% \hbox to 0pt
+% {\pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%
+% \pdfimage width 1bp height 1bp {#7}% maybe 10 is better
+% \pdfliteral{Q}%
+% \hss}}}
+%
+% better, since xform reuse
+
+\def\handleMPfigurespecial#1#2#3#4#5#6#7% todo : combine with ext fig
+ {\vbox to \zeropoint
+ {\vss
+ \hbox to \zeropoint
+ {\ifcase\pdfoutput\or % will be hooked into the special driver
+ \doiffileelse{#7}
+ {\doifundefinedelse{mps:x:#7}
+ {\immediate\pdfximage\!!width\onebasepoint\!!height\onebasepoint{#7}%
+ \setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}%
+ {\message{[reusing figure #7]}}%
+ \PDFcode{q #1 #2 #3 #4 #5 #6 cm}%
+ \rlap{\getvalue{mps:x:#7}}%
+ \PDFcode{Q}}
+ {\message{[unknown figure #7]}}%
+ \fi
+ \hss}}}
+
+%D An example of using both special features is the
+%D following.
+%D
+%D \starttyping
+%D \startMPpage
+%D externalfigure "hakker1b.png" scaled 22cm rotated 10 shifted (-2cm,0cm);
+%D externalfigure "hakker1b.png" scaled 10cm rotated -10 ;
+%D externalfigure "hakker1b.png" scaled 7cm rotated 45 shifted (8cm,12cm) ;
+%D path p ; p := unitcircle xscaled 15cm yscaled 20cm;
+%D path q ; q := p rotatedaround(center p,90) ;
+%D path r ; r := buildcycle(p,q) ; clip currentpicture to r ;
+%D path s ; s := boundingbox currentpicture enlarged 5mm ;
+%D picture c ; c := currentpicture ; currentpicture := nullpicture ;
+%D circular_shade(s,0,.2red,.9red) ;
+%D addto currentpicture also c ;
+%D \stopMPpage
+%D \stoptyping
+
+%D This is some experimental hyperlink driver that I wrote
+%D for Mark Wicks.
+
+\defineMPspecial{20}
+ {\setxvalue{mps:hl:\gMPs6}%
+ {\noexpand\handleMPhyperlink
+ {\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}%
+ \noexpand\setxvalue{mps:hl:\gMPs6}{}}}
+
+\def\handleMPhyperlink#1#2#3#4#5%
+ {%\ifcase\pdfoutput\or
+ \setbox\scratchbox\hbox
+ {\setbox\scratchbox\null
+ \scratchdimen#1\onebasepoint\scratchdimen-\scratchdimen
+ \advance\scratchdimen#3\onebasepoint
+ \wd\scratchbox\scratchdimen
+ \scratchdimen#2\onebasepoint\scratchdimen-\scratchdimen
+ \advance\scratchdimen#4\onebasepoint
+ \ht\scratchbox\scratchdimen
+ \incolorfalse
+ \gotobox{\box\scratchbox}[#5]}%
+ \setbox\scratchbox\hbox
+ {\scratchdimen\MPxoffset\onebasepoint\advance\scratchdimen#1\onebasepoint
+ \hskip\scratchdimen
+ \scratchdimen\MPyoffset\onebasepoint\advance\scratchdimen#2\onebasepoint
+ \raise\scratchdimen\box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ }%\fi}
+
+\def\invokeMPhyperlinkspecial%
+ {\getvalue{mps:hl:\currentMPspecial}} % or \relax
+
+\appendtoks \invokeMPhyperlinkspecial \to \invokeMPspecials
+
+%D Special number~1 is dedicated to \CMYK\ support. If you
+%D want to know why: look at this:
+%D
+%D \startbuffer[mp]
+%D fill fullcircle xyscaled (3cm,1cm) withcolor \MPcolor{test} ;
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \startcombination[4*1]
+%D {\definecolor[test][c=1,y=.3,k=.3] \processMPbuffer[mp]} {c=1 y=.3 k=.3}
+%D {\definecolor[test][c=.9,y=.15] \processMPbuffer[mp]} {c=.9 y=.15}
+%D {\definecolor[test][c=.25,y=.8] \processMPbuffer[mp]} {c=.25 y=.8}
+%D {\definecolor[test][c=.45,y=.1] \processMPbuffer[mp]} {c=.45 y=.1}
+%D \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure
+%D {\CMYK\ support disabled,
+%D conversion to \RGB.}
+%D {\setupcolors[cmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no support in \METAPOST.}
+%D {\setupcolors[cmyk=ja,mpcmyk=nee,state=start]\getbuffer[cmyk]}
+%D
+%D \placefigure
+%D {\CMYK\ support enabled,
+%D no conversion to \RGB,
+%D support in \METAPOST}
+%D {\setupcolors[cmyk=ja,state=start]\getbuffer[cmyk]}
+
+\defineMPspecial{1}
+ {\ifMPcmykcolors
+ \setxvalue{\@@MPSK\gMPs1}{\gMPs2 \gMPs3 \gMPs4 \gMPs5 }%
+ \fi}
+
+\def\setMPcmyk#1 #2 #3 #4 %
+ {\setvalue{\@@MP01}{#1}%
+ \setvalue{\@@MP02}{#2}%
+ \setvalue{\@@MP03}{#3}%
+ \setvalue{\@@MP04}{#4}}
+
+%\defineMPspecial{2}
+% {\ifMPspotcolors
+% \setxvalue{\@@MPSP\gMPs1}{\gMPs2 \gMPs3 }%
+% \fi}
+
+% \defineMPspecial{2}
+% {\ifMPspotcolors
+% \setxvalue{\@@MPSP\gMPs1}{\gMPs2 \gMPs3 }%
+% \checkMPspot{\gMPs2}{\gMPs3}%
+% \fi}
+%
+% \def\setMPspot#1 #2 %
+% {\setvalue{\@@MP01}{#1}%
+% \setvalue{\@@MP02}{#2}}
+%
+% \def\checkMPspot#1#2%
+% {\expanded{\resolveMPspotcolor#1 #2}\end
+% \ifx\MPspotspace\MPresolvedspace
+% \edef\MPspotspacespec{/\MPspotspace\space}%
+% \doifinstringelse\MPspotspacespec\currentMPcolorspaces
+% \donothing\registerMPcolorspace
+% \fi}
+
+\defineMPspecial{2}
+ {\ifMPspotcolors
+ \setxvalue{\@@MPSP\gMPs1}{\gMPs2 \gMPs3 \gMPs4 \gMPs5 }% space is essential
+ \checkMPspot{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}%
+ \fi}
+
+\def\setMPspot#1 #2 #3 #4 %
+ {\setvalue{\@@MP01}{#1}%
+ \setvalue{\@@MP02}{#2}%
+ \setvalue{\@@MP03}{#3}%
+ \setvalue{\@@MP04}{#4}}
+
+\def\checkMPspot#1#2#3#4%
+ {\expanded{\resolveMPspotcolor#1 #2 #3 #4}\end
+ \ifx\MPspotspace\MPresolvedspace
+ \edef\MPspotspacespec{/\MPspotspace\space}%
+ \doifinstringelse\MPspotspacespec\currentMPcolorspaces
+ \donothing\registerMPcolorspace
+ \fi}
+
+%D This special (number 50) passes positions to a tex file.
+%D This method uses a two||pass approach an (mis|)|used the
+%D context positioning macros. In \type {core-pos} we will
+%D implement the low level submacro needed.
+%D
+%D \startbuffer
+%D \definelayer[test]
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-1},y=\MPy{somepos-1}]
+%D {Whatever we want here!}
+%D
+%D \setlayer
+%D [test]
+%D [x=\MPx{somepos-2},y=\MPy{somepos-2}]
+%D {Whatever we need there!}
+%D
+%D \startuseMPgraphic{oeps}
+%D draw fullcircle scaled 6cm withcolor red ;
+%D register ("somepos-1",1cm,2cm,center currentpicture) ;
+%D register ("somepos-2",4cm,3cm,(-1cm,-2cm)) ;
+%D \stopuseMPgraphic
+%D
+%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here the width and height are not realy used, but one can
+%D imagine situations where tex has to work with values
+%D calculated by \METAPOST.
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D Later we will implement a more convenient macro:
+%D
+%D \starttyping
+%D \setMPlayer [test] [somepos-1] {Whatever we want here!}
+%D \setMPlayer [test] [somepos-2] {Whatever we need there!}
+%D \stoptyping
+
+\ifx\dosavepositionwhd\undefined
+ \let\dosavepositionwhd\gobblesevenarguments
+\fi
+
+\defineMPspecial{50} % x y width height label
+ {\bgroup
+ \scratchdimen\MPllx\onebasepoint\scratchdimen-\scratchdimen
+ % \scratchdimen-\MPllx\onebasepoint % moet ook werken
+ \advance\scratchdimen\gMPs1\onebasepoint
+ \edef\x{\number\scratchdimen}%
+ \scratchdimen\gMPs2\onebasepoint
+ \scratchdimen-\scratchdimen
+ \advance\scratchdimen\MPury\onebasepoint
+ \edef\y{\number\scratchdimen}%
+ \scratchdimen\gMPs3\onebasepoint
+ \edef\w{\number\scratchdimen}%
+ \scratchdimen\gMPs4\onebasepoint
+ \edef\h{\number\scratchdimen}%
+ \dosavepositionwhd{\gMPs5}0\x\y\w\h0%
+ \egroup}
+
+%D Transparency support used specials 60 (rgb) and 61
+%D (cmyk).
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor transparent(1,.5,yellow) ;
+%D fill p rotated 210 withcolor transparent(1,.5,green) ;
+%D fill p rotated 330 withcolor transparent(1,.5,blue) ;
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D One can also communicate colors between \CONTEXT\ and
+%D \METAPOST:
+%D
+%D \startbuffer
+%D \definecolor[tcyan] [c=1,k=.2,t=.5]
+%D \definecolor[tmagenta][m=1,k=.2,t=.5]
+%D \definecolor[tyellow] [y=1,k=.2,t=.5]
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D u := 2cm ; path p ; p := fullcircle scaled u shifted (u/4,0);
+%D
+%D fill p rotated 90 withcolor \MPcolor{tcyan} ;
+%D fill p rotated 210 withcolor \MPcolor{tmagenta} ;
+%D fill p rotated 330 withcolor \MPcolor{tyellow} ;
+%D \stopbuffer
+%D
+%D \startlinecorrection \processMPbuffer \stoplinecorrection
+%D
+%D We save all the three components needed in one macro,
+%D just to save hash space.
+
+\def\@@MPST{@MPST@}
+
+\def\assignMPStransparency#1#2#3%
+ {\edef\PDFtransparencyidentifier{#1}%
+ \edef\PDFtransparencyreference {#2}%
+ \edef\PDFtransparencycolorspecs{#3}}
+
+% \def\PDFtransparencyspec
+% {\ifx\MPresolvedspace\MPgrayspace
+% \MPresolvedcolor\space g \MPresolvedcolor\space G%
+% \else\ifx\MPresolvedspace\MPrgbspace
+% \MPresolvedcolor\space rg \MPresolvedcolor\space RG%
+% \else\ifx\MPresolvedspace\MPcmykspace
+% \MPresolvedcolor\space k \MPresolvedcolor\space K%
+% \else\ifx\MPresolvedspace\empty\else
+% /\MPresolvedspace\space cs \MPresolvedcolor\space sc
+% /\MPresolvedspace\space CS \MPresolvedcolor\space SC%
+% \fi\fi\fi\fi}
+
+\def\PDFtransparencyspec % todo
+ {\ifx\MPresolvedspace\MPgrayspace
+ \MPresolvedcolor\space g
+ \MPresolvedcolor\space G%
+ \else\ifx\MPresolvedspace\MPrgbspace
+ \MPresolvedcolor\space rg
+ \MPresolvedcolor\space RG%
+ \else\ifx\MPresolvedspace\MPcmykspace
+ \MPresolvedcolor\space k
+ \MPresolvedcolor\space K%
+ \else\ifx\MPresolvedspace\empty\else
+ /\MPresolvedspace\space cs
+ /\MPresolvedspace\space CS
+ \PDFgetspotcolorspec\MPresolvedcolor
+ \fi\fi\fi\fi}
+
+\defineMPspecial{3} % rgb
+ {\edef\currentMPspecial{\gMPs6}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \expanded{\resolveMPrgbcolor\gMPs3 \gMPs4 \gMPs5}\end
+ \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\PDFtransparencyspec}}}
+
+\defineMPspecial{4} % cmyk
+ {\edef\currentMPspecial{\gMPs7}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \expanded{\resolveMPcmykcolor\gMPs3 \gMPs4 \gMPs5 \gMPs6}\end
+ \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\PDFtransparencyspec}}}
+
+% \defineMPspecial{5} % spot
+% {\edef\currentMPspecial{\gMPs5}%
+% \presetPDFtransparency{\gMPs1}{\gMPs2}%
+% \checkMPspot{\gMPs3}{\gMPs4}%
+% \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+% {\noexpand\assignMPStransparency
+% {\PDFtransparencyidentifier}%
+% {\PDFtransparencyreference}%
+% {\PDFtransparencyspec}}}
+
+\defineMPspecial{5} % spot
+ {\edef\currentMPspecial{\gMPs7}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \checkMPspot{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}%
+ \setevalue{\@@MPST\currentMPspecial}% was \setxvalue, bug !
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\PDFtransparencyspec}}}
+
+% beware: for the moment only supported in pdftex; needs a cleanup!
+
+\def\registerMPcolorspace
+ {\doifobjectreferencefoundelse{PDFCS}\MPspotspace
+ {\doPDFgetobjectreference{PDFCS}\MPspotspace\PDFobjectreference
+ \xdef\currentMPcolorspaces
+ {\currentMPcolorspaces\MPspotspacespec\PDFobjectreference\space}}
+ \donothing}
+
+%D We need to add resource specifications!
+
+\appendtoks
+ \global\let\currentMPcolorspaces\empty
+\to \MPstartresources
+
+\appendtoks
+ \ifx\currentMPcolorspaces\empty \else
+ \xdef\currentPDFresources{\currentPDFresources
+ /ColorSpace <<\currentMPcolorspaces>>}%
+ \fi
+\to \MPstopresources
+
+%D For efficiency reasons, we fall back on the allocation
+%D mechanisms already present. For use within \MPTOPDF, we
+%D provide a fall back routine.
+
+\let\currentMPtransparencies\empty
+
+% \def\invokeMPtransparencyspecial
+% {\doifdefined{\@@MPST\currentMPspecial}
+% {\getvalue{\@@MPST\currentMPspecial}%
+% \doifinstringelse
+% {\PDFtransparencyidentifier}{\currentMPtransparencies}
+% {}
+% {\xdef\currentMPtransparencies
+% {\currentMPtransparencies
+% \PDFtransparencyidentifier\space
+% \PDFtransparencyreference\space}}%
+% \def\extraMPpathcode{ Q}%
+% \PDFcode{q
+% \PDFtransparencycolorspecs\space
+% \PDFtransparencyidentifier\space gs}}}
+
+% this one triggers a new graphic state
+
+\def\invokeMPtransparencyspecial
+ {\scratchcounter\MPrgbnumber\lastMPbvalue
+ \edef\currentMPspecial{\the\scratchcounter}%
+ \ifundefined{\@@MPST\currentMPspecial}\else
+ \getvalue{\@@MPST\currentMPspecial}%
+ \doifinstringelse\PDFtransparencyidentifier\currentMPtransparencies
+ \donothing\registerMPtransparencyresource % slow
+ \PDFcode
+ {\PDFtransparencycolorspecs\space
+ \PDFtransparencyidentifier\space gs}%
+ % potential optimization
+ % \setevalue{\@@MPST\currentMPspecial}%
+ % {\PDFcode
+ % {\PDFtransparencycolorspecs\space
+ % \PDFtransparencyidentifier\space gs}}%
+ % \getvalue{\@@MPST\currentMPspecial}%
+ \let\revokeMPtransparencyspecial\dorevokeMPtransparencyspecial
+ \fi}
+
+% this one does a reset
+
+\let\revokeMPtransparencyspecial\relax
+
+\appendtoks
+ \revokeMPtransparencyspecial
+\to \MPstopresources
+
+\def\dorevokeMPtransparencyspecial % only called if state is set
+ {\ifx\PDFtransparencyresetidentifier\empty\else
+ \doifinstringelse\PDFtransparencyresetidentifier\currentMPtransparencies
+ \donothing\registerMPtransparencyresetresource
+ \PDFcode{\PDFtransparencyresetidentifier\space gs}%
+ % potential optimization
+ % \def\dorevokeMPtransparencyspecial
+ % {\PDFcode
+ % {\PDFtransparencycolorspecs\space
+ % \PDFtransparencyidentifier\space gs}}%
+ \let\dorevokeMPtransparencyspecial\dodorevokeMPtransparencyspecial
+ \let\revokeMPtransparencyspecial\relax % invoke sets it
+ \fi}
+
+% and this one a simplified reset
+
+% \def\dodorevokeMPtransparencyspecial % used after first invocation
+% {\getvalue{\@@MPST0}%
+% \PDFcode{\PDFtransparencyidentifier\space gs}}
+
+\def\dodorevokeMPtransparencyspecial % used after first invocation
+ {\PDFcode{\PDFtransparencyresetidentifier\space gs}%
+ \let\revokeMPtransparencyspecial\relax} % invoke sets it
+
+% add a resource entry
+
+\def\registerMPtransparencyresource
+ {\xdef\currentMPtransparencies
+ {\currentMPtransparencies
+ \PDFtransparencyidentifier\space
+ \PDFtransparencyreference\space}}
+
+\def\registerMPtransparencyresetresource
+ {\xdef\currentMPtransparencies
+ {\currentMPtransparencies
+ \PDFtransparencyresetidentifier\space
+ \PDFtransparencyresetreference\space}}
+
+\appendtoks \invokeMPtransparencyspecial \to \invokeMPspecials
+
+\ifCONTEXT \else
+
+ \def\@@MPSTN{@MPSTN@}
+ \def\@@MPSTO{@MPSTO@}
+
+ \newcount\PDFcurrenttransparency
+
+ \let\PDFtransparencyresetidentifier\empty
+ \let\PDFtransparencyresetreference \empty
+
+ \let\PDFtransparencyidentifier\empty
+ \let\PDFtransparencyreference \empty
+
+ \def\initializePDFtransparency
+ {\global\let\initializePDFtransparency\relax
+ \presetPDFtransparency{1}{1}%
+ \xdef\PDFtransparencyresetidentifier{/Tr0}%
+ \xdef\PDFtransparencyresetreference{\the\pdflastobj\space 0 R}}
+
+ \def\presetPDFtransparency#1#2%
+ {\initializePDFtransparency
+ \@EA\ifx\csname\@@MPSTO#1:#2\endcsname\relax
+ \global\advance\PDFcurrenttransparency \plusone
+ \immediate\pdfobj{\PDFtransparencydictionary{#1}{#2}{}}%
+ \setxvalue{\@@MPSTN#1:#2}{\the\PDFcurrenttransparency}%
+ \setxvalue{\@@MPSTO#1:#2}{\the\pdflastobj}%
+ \fi
+ \edef\PDFtransparencyidentifier{/Tr\getvalue{\@@MPSTN#1:#2}}%
+ \edef\PDFtransparencyreference{\getvalue{\@@MPSTO#1:#2} 0 R}}
+
+ \def\PDFtransparencydictionary#1#2#3% type fraction extras
+ {<</Type /ExtGState
+ /ca #2 /CA #2
+ /BM /\ifcase#1 Normal\or Normal\or Multiply\or Screen\or
+ Overlay\or SoftLight\or HardLight\or ColorDodge\or
+ ColorBurn\or Darken\or Lighten\or Difference\or
+ Exclusion\else Compatible\fi
+ #3>>}
+
+\fi
+
+\appendtoks
+ \global\let\currentMPtransparencies\empty
+\to \MPstartresources
+
+\appendtoks
+ \ifx\currentMPtransparencies\empty \else
+ \xdef\currentPDFresources{\currentPDFresources
+ /ExtGState <<\currentMPtransparencies>>}%
+ \fi
+\to \MPstopresources
+
+%D In all cases, we need to keep track of the resources
+%D used.
+
+%D A few auxiliary macros:
+
+\def\MPgrayspace{DeviceGray}
+\def\MPrgbspace {DeviceRGB}
+\def\MPcmykspace{DeviceCMYK}
+\let\MPspotspace\MPgrayspace
+
+\def\MPcmykBlack{0 0 0 0}
+\def\MPcmykWhite{0 0 0 1}
+
+\ifCONTEXT
+
+ \def\startMPcolorresolve
+ {\bgroup
+ \def\dostartgraycolormode##1%
+ {\global\let\MPresolvedspace\MPgrayspace
+ \xdef\MPresolvedcolor{##1}}%
+ \def\dostartrgbcolormode ##1##2##3%
+ {\global\let\MPresolvedspace\MPrgbspace
+ \xdef\MPresolvedcolor{##1 ##2 ##3}}%
+ \def\dostartcmykcolormode##1##2##3##4%
+ {\global\let\MPresolvedspace\MPcmykspace
+ \xdef\MPresolvedcolor{##1 ##2 ##3 ##4}}%
+ \def\dostartspotcolormode##1##2%
+ {\global\let\MPspotspace\empty
+ \xdef\MPresolvedspace{##1}%
+ \xdef\MPresolvedcolor{##2}%
+ \global\let\MPspotspace\MPresolvedspace}% signal
+ \dostartgraycolormode\!!zerocount} % kind of hackery initialization
+
+ \let\stopMPcolorresolve\egroup
+
+ \def\resolveMPrgbcolor#1 #2 #3\end
+ {\startMPcolorresolve
+ \execcolorR#1:#2:#3:0:0\od
+ \stopMPcolorresolve}
+
+ \def\resolveMPcmykcolor#1 #2 #3 #4\end
+ {\startMPcolorresolve
+ \execcolorC#1:#2:#3:#4:0:0\od
+ \stopMPcolorresolve}
+
+ \def\resolveMPgraycolor#1\end
+ {\startMPcolorresolve
+ \execcolorS#1:0:0\od
+ \stopMPcolorresolve}
+
+% \def\resolveMPspotcolor#1 #2\end
+% {\startMPcolorresolve
+% \execcolorP#1:#2:0:0\od
+% \stopMPcolorresolve}
+
+ \def\resolveMPspotcolor#1 #2 #3 #4\end
+ {\startMPcolorresolve
+ \ifnum#2>\plusone
+ \checkmultitonecolor{#1}%
+ \fi
+ \execcolorP#1:#2:#3:#4:0:0\od
+ \stopMPcolorresolve}
+
+\else
+
+ \def\resolveMPspotcolor#1 #2\end
+ {\global\let\MPresolvedspace\MPgrayspace
+ \xdef\MPresolvedcolor{0}}
+
+ \def\resolveMPrgbcolor#1 #2 #3\end
+ {\global\let\MPresolvedspace\MPrgbspace
+ \xdef\MPresolvedcolor{#1 #2 #3}}
+
+ \def\resolveMPcmykcolor#1 #2 #3 #4\end
+ {\global\let\MPresolvedspace\MPcmykspace
+ \xdef\MPresolvedcolor{#1 #2 #3 #4}}
+
+ \def\resolveMPgraycolor#1\end
+ {\global\let\MPresolvedspace\MPgrayspace
+ \xdef\MPresolvedcolor{#1}} % should be inverted
+
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/supp-mpe.tex b/tex/context/base/supp-mpe.tex
new file mode 100644
index 000000000..f4438133a
--- /dev/null
+++ b/tex/context/base/supp-mpe.tex
@@ -0,0 +1,4 @@
+% This file is not needed as I don't expect other macro packages
+% to support the metafun extensions.
+
+\input supp-mpe.mkii
diff --git a/tex/context/base/supp-mps.mkii b/tex/context/base/supp-mps.mkii
new file mode 100644
index 000000000..b071ffe72
--- /dev/null
+++ b/tex/context/base/supp-mps.mkii
@@ -0,0 +1,2134 @@
+%D \module
+%D [ file=supp-mps,
+%D version=1997.07.05,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ Inclusion,
+%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 Forget about generic modules \unknown\ ...
+
+\ifx \undefined \contextversion \endinput \fi
+
+%D \METAPOST\ is John Hobbys alternative for \METAFONT\ and
+%D produces superior \POSTSCRIPT\ code. In this module we
+%D integrate \METAPOST\ support int \CONTEXT. We offer two
+%D tracks:
+%D
+%D \startitemize
+%D \item generating \METAPOST\ code, running this program from
+%D within \TEX\ using \type{\write18}, and importing the
+%D result
+%D \item generating \METAPOST\ code, processing the code
+%D afterward, and importing the result in a second pass
+%D \stopitemize
+%D
+%D The first approach uses a non standard \TEX\ feature,
+%D implemented in Web2c. I'm not going to discuss the pros and
+%D cons of running programs from within others, but all
+%D arguments against this can be overcome by implementing a
+%D \TEX\ worthy primitive:
+%D
+%D \starttyping
+%D \excuteMetaPost filename
+%D \stoptyping
+%D
+%D Ok then, let's start:
+
+\writestatus{loading}{ConTeXt Support Macros / MetaPost Inclusion}
+
+\unprotect
+
+\def\@@MPG{@MPG@}
+
+%D First we define a handy constant:
+
+\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+% todo : sort out ^^M, \par and ; mess
+
+%D \macros
+%D {everyMPgraphic}
+%D
+%D Because some graphics interact with \TEX\ (i.e.\ \CONTEXT), we
+%D provide a hook for additional actions: \type {\everyMPgraphic}.
+
+\newtoks\everyMPgraphic \everyMPgraphic{\everyMPgraphic\emptytoks}
+
+%D \macros
+%D {startMPgraphic}
+%D
+%D From within \TEX\ one can execute \METAPOST\ code by putting
+%D it between the two commands
+%D
+%D \starttyping
+%D \startMPgraphic
+%D \stopMPgraphic
+%D \stoptyping
+%D
+%D This is implemented as:
+
+\let\stopMPgraphic\relax
+
+\long\def\startMPgraphic#1\stopMPgraphic
+ {\startwritingMPgraphic
+ \writecheckedMPgraphic{#1}% % potential speedup: pass #1 as macro
+ \stopwritingMPgraphic}
+
+%D \macros
+%D {startMPrun}
+%D
+%D If we just want to run \METAPOST\ code, that is, not to
+%D explictly generate a figure in terms of \type{beginfig} and
+%D \type{endfig}, we can use:
+%D
+%D \starttyping
+%D \startMPgraphic
+%D \stopMPgraphic
+%D \stoptyping
+%D
+%D \starttyping
+%D \startMPrun
+%D \stopMPrun
+%D \stoptyping
+%D
+%D The next booleans are for internal purposes only.
+
+% some day a bit more more clear:
+%
+% run directly/run afterwards/run external defined
+% insert directly/insert whenever
+% use object/don't use objects
+
+\newif\ifMPgraphics \MPgraphicstrue
+\newif\ifMPrun \MPrunfalse
+\newif\ifMPwrapper \MPwrappertrue
+
+\let\stopMPrun\relax
+
+\ifCONTEXT
+
+ \long\def\dostartMPrun#1#2\stopMPrun
+ {\bgroup
+ \MPruntrue
+ \doifsomething{#1}{\def\MPgraphicfile{#1}}%
+ \startwritingMPgraphic
+ \writecheckedMPgraphic{#2}%
+ \stopwritingMPgraphic
+ \egroup}
+
+ \def\startMPrun
+ {\dosinglegroupempty\dostartMPrun}
+
+\else
+
+ \long\def\startMPrun#1\stopMPrun
+ {\MPruntrue
+ \startwritingMPgraphic
+ \writecheckedMPgraphic{#1}%
+ \stopwritingMPgraphic
+ \MPrunfalse}
+
+\fi
+
+%D \macros
+%D {startwritingMPgraphic,
+%D writeMPgraphic,
+%D stopwritingMPgraphic}
+%D
+%D If the writing process is divided into more steps, one can
+%D use the components of this macro directly.
+%D
+%D \starttyping
+%D \startwritingMPgraphic
+%D ...
+%D \writeMPgraphic{...}
+%D ...
+%D \writeMPgraphic{...}
+%D ...
+%D \stopwritingMPgraphic
+%D \stoptyping
+
+%D \macros
+%D {ifrunMPgraphics,ifrunMPTEXgraphics,ifinsertMPgraphics}
+%D
+%D These macros look a bit more complicated that one would
+%D expect at first sight. This is due to the two ways of
+%D processing these graphics, mentioned in a previous
+%D paragraph. Which method is used, the direct or indirect
+%D one, depends on a boolean.
+
+\newif\ifrunMPgraphics \runMPgraphicsfalse
+\newif\ifrunMPTEXgraphics \runMPTEXgraphicsfalse
+\newif\ifinsertMPgraphics \insertMPgraphicstrue
+
+%D If set to true, one can do with a single pass, else one must
+%D process the \METAPOST\ file \type{mpgraph} between two
+%D succesive \TEX\ runs.
+
+\ifx\MPgraphicfile\undefined
+
+\def\MPgraphicfile{mp\ifMPrun run\else graph\fi}
+\def\MPruntimefile{mprun}
+
+\fi
+
+%D \macros
+%D {MPgraphic}
+%D
+%D When we run \METAPOST\ from within \TEX, each graphic is
+%D processed at once, which means that we reuse this file many
+%D times. When however the execution is delayed, all graphics
+%D are saved in a separate figure. The current graphic is
+%D characterized bij a \COUNTER. This counter is available
+%D in \type{\MPgraphic}.
+
+\newcount\nofMPgraphics
+\newcount\currentMPgraphic
+
+\def\MPgraphic{0}
+
+% %D \macros
+% %D {ifreuseMPgraphics}
+% %D
+% %D If one want to reuse grapics, one can save much redundant
+% %D run time by setting the next switch to true.
+%
+% \newif\ifreuseMPgraphics \reuseMPgraphicstrue
+
+%D The three macros responsible for writing the graphic
+%D implement both schemes.
+
+%D \macros
+%D {MPinclusions, startMPinclusions, MPinitializations}
+%D
+%D One can include for instance common input commands by
+%D passing them to \type{\MPinclusions}:
+%D
+%D \starttyping
+%D \startMPinclusions
+%D input mp-mine ;
+%D \stopMPinclusions
+%D \stoptyping
+%D
+%D \starttyping
+%D \MPinclusions{input mp-mine}
+%D \stoptyping
+%D
+%D These commands reset their content each time. You can append
+%D code as follows:
+%D
+%D \starttyping
+%D \startMPinclusions[+]
+%D input mp-mine ;
+%D \stopMPinclusions
+%D \stoptyping
+%D
+%D The token register \type {\MPinitializations} is expanded
+%D before all other inclusions, the extensions are expanded
+%D only once per run.
+
+%D The next hack prevents too long lines:
+
+\long\def\runtimeobeyMPlines
+ {\catcode35=11\relax % goodie
+ \ifx\rawcharacter\undefined
+ \let\obeyedline\space
+ \else
+ \obeylines
+ \ifx\outputnewlinechar\undefined
+ \edef\obeyedline{\rawcharacter{\endlinechar}}%
+ \else
+ \let\obeyedline\outputnewlinechar
+ \fi
+ \fi}
+
+\long\def\obeyMPlines % anyhow, we end up with ^^M's in the input
+ {\obeylines
+ \let\obeyedline\relax} % delay expansion
+
+\ifx\everydump\undefined
+ % maybe we're not using context
+\else
+ \appendtoks
+ \let\obeyMPlines\runtimeobeyMPlines
+ \to \everydump
+\fi
+
+%D We use two distinguished token registers:
+
+\newtoks \MPextensions % once per run (can be multiple graphics)
+\newtoks \MPinitializations % each graphic
+
+\let\stopMPextensions \relax % so that we can use it in \expanded
+\let\stopMPinitializations\relax % so that we can use it in \expanded
+\let\stopMPinclusions \relax % so that we can use it in \expanded
+
+\def\startMPextensions % no text checking done here !
+ {\begingroup
+ \obeyMPlines
+ \dostartMPextensions}
+
+\def\dostartMPextensions#1\stopMPextensions
+ {\endgroup
+ \MPextensions\expandafter{\the\MPextensions#1}}
+
+\def\startMPinitializations % no text checking done here !
+ {\begingroup
+ \obeyMPlines
+ \dostartMPinitializations}
+
+\def\dostartMPinitializations#1\stopMPinitializations
+ {\endgroup
+ \MPinitializations\expandafter{\the\MPinitializations#1}}
+
+\def\startMPinclusions
+ {\begingroup
+ \dosingleempty\dostartMPinclusions}
+
+\long\def\dostartMPinclusions
+ {\obeyMPlines
+ \dodostartMPinclusions}
+
+\long\def\dodostartMPinclusions[#1]#2\stopMPinclusions % document wide
+ {\endgroup
+ \doifelse{#1}{+}
+ {\@EA\long\@EA\def\@EA\theMPinclusions\@EA
+ {\theMPinclusions
+ \writeMPgraphic{#2}}}
+ {\long\def\theMPinclusions
+ {% \expanded !
+% \@EA\expanded\@EA{\@EA\writeMPgraphic\@EA{\the\MPextensions;}}% new
+ \writeMPgraphic{#2}}}}
+
+\def\MPinclusions
+ {\dosingleempty\doMPinclusions}
+
+\long\def\doMPinclusions[#1]#2%
+ {\startMPinclusions[#1]#2\stopMPinclusions}
+
+\def\theMPextensions
+ {\@EA\expanded\@EA{\@EA\writeMPgraphic\@EA{\the\MPextensions;}}}
+
+\def\theMPinitializations
+ {\@EA\expanded\@EA{\@EA\writeMPgraphic\@EA{\the\MPinitializations;}}}
+
+\startMPinclusions \stopMPinclusions
+
+%D \macros
+%D {iflongMPlines}
+%D
+%D When grabbing a graphic deifnition, newlines are turned
+%D into spaces. By default we split the graphic definition
+%D at the colon, but long lines are still possible by
+%D setting the next boolean to true.
+
+\newwrite\MPwrite
+\newwrite\MPstaticwrite
+
+\newif\iflongMPlines \longMPlinestrue % we now have \obeyMPlines
+
+\ifx \overlaywidth \undefined \def \overlaywidth {4cm} \fi
+\ifx \overlayheight \undefined \def \overlayheight {3cm} \fi
+\ifx \overlaylinewidth \undefined \def \overlaylinewidth {0pt} \fi
+
+\def\presetMPdefinitions
+ {\edef\overlaywidth {\overlaywidth \space}%
+ \edef\overlayheight {\overlayheight \space}%
+ \edef\overlaylinewidth {\overlaylinewidth\space}%
+ \edef\currentwidth {\the\hsize \space}%
+ \edef\currentheight {\the\vsize \space}}
+
+%D The \type {;} aware method (the \type {\else} branch) also
+%D takes care of \type {btex}||\type {etex}, \type
+%D {verbatimtex}||\type {etex}. The space after \type {tex}
+%D is essential, since it protects \type {text}.
+
+\newif\ifMPTEXgraphic
+
+\let\bufferedMPgraphicsline\empty
+
+\appendtoks
+ \globallet\bufferedMPgraphicsline\empty
+\to \everyMPgraphic
+
+\chardef\MPgraphicsscanmode\plustwo % 0=no scanning, 1=simple scanning, 2=less simple, 3=even less
+
+% the next fails with \chardef\MPgraphicsscanmode\plusone
+%
+% \startMPextensions
+% gp_num_points_with_tex := 3 ;
+% \stopMPextensions
+
+\def\writeMPgraphic % no big #1 passing here
+ {\iflongMPlines
+ \ifMPTEXgraphic
+ \ifcase\MPgraphicsscanmode
+ \let\next\writeMPgraphiclongR
+ \else
+ \let\next\writeMPgraphiclongT
+ \fi
+ \else
+ \let\next\writeMPgraphiclongN
+ \fi
+ \else
+ \ifMPTEXgraphic
+ \ifcase\MPgraphicsscanmode
+ \let\next\writeMPgraphicshortN % we could \let \writeMPgraphicshortR\writeMPgraphicshortN
+ \else
+ \let\next\writeMPgraphicshortT
+ \fi
+ \else
+ \let\next\writeMPgraphicshortN
+ \fi
+ \fi
+ \next}
+
+\appendtoks \obeyMPlines \to \everyMPgraphic % more efficient than in each following grouped write
+
+\long\def\writeMPgraphiclongR#1% fast, no scanning
+ {\bgroup
+ \let\par\space
+ \immediate\write\MPwrite{#1}%
+ \egroup}
+
+\long\def\writeMPgraphiclongT#1%
+ {\bgroup
+ \let\par\space
+ \longMPflushT#1\empty\par\relax\par
+ \egroup}
+
+\long\def\writeMPgraphicshortT#1%
+ {\bgroup
+ \let\par\space
+ \shortMPflushT#1\empty;\relax;%
+ \egroup}
+
+\long\def\longMPflushT#1#2\par
+ {\ifx#1\relax \else
+ \dowriteMPgraphicline#1#2tex \relax etex\MPend
+ \expandafter\longMPflushT
+ \fi}
+
+\long\def\shortMPflushT#1#2;%
+ {\ifx#1\relax \else
+ \dowriteMPgraphicline#1#2tex \relax etex\MPend
+ \expandafter\shortMPflushT
+ \fi}
+
+\long\def\writeMPgraphiclongN#1%
+ {\bgroup
+ \let\par\space
+ \longMPflushN#1\empty\par\relax\par
+ \egroup}
+
+\long\def\writeMPgraphicshortN#1%
+ {\bgroup
+ \let\par\space
+ \shortMPflushN#1\empty;\relax;%
+ \egroup}
+
+\long\def\longMPflushN#1#2\par
+ {\ifx#1\relax \else
+ \nowriteMPgraphicline#1#2\MPend
+ \expandafter\longMPflushN
+ \fi}
+
+\long\def\shortMPflushN#1#2;%
+ {\ifx#1\relax \else
+ \nowriteMPgraphicline#1#2\MPend
+ \expandafter\shortMPflushN
+ \fi}
+
+\def\dowriteMPgraphicline{\futurelet\next\dodowriteMPgraphicline}
+\def\nowriteMPgraphicline{\futurelet\next\nonowriteMPgraphicline}
+
+%D Will move (check if next is needed):
+
+\long\def\nonowriteMPgraphicline#1\MPend
+ {\ifx\next\empty\else\ifx\next\relax\else
+ \bgroup
+ \let\par\space
+ \iflongMPlines
+ %\immediate\write\MPwrite{#1;}% oeps, ; invalid
+ \immediate\write\MPwrite{#1}%
+ \else
+ \long\edef\ascii{#1}%
+ \expandafter\flushMPgraphicline\ascii\empty;\relax;%
+ \fi
+ \egroup
+ \fi\fi}
+
+%D A first version:
+%D
+%D \starttyping
+%D \long\def\dodowriteMPgraphicline#1tex #2#3etex#4\MPend%
+%D {\ifx\next\empty\else\ifx\next\relax\else
+%D \bgroup
+%D \let\par=\space
+%D \ifx#2\relax
+%D \immediate\write\MPwrite{#1;}%
+%D \egroup
+%D \else
+%D \global\MPTEXgraphictrue
+%D \convertargument#2#3\to\ascii
+%D \immediate\write\MPwrite{#1tex \ascii etex}%
+%D \egroup
+%D \dowriteMPgraphicline#4tex \relax etex\MPend
+%D \fi
+%D \fi\fi}
+%D \stoptyping
+
+%D The next alternative also handles inclusions well.
+
+\newtoks \everyMPTEXgraphic
+
+\newif\ifforceMPTEXgraphic
+
+%D Before we supported the graph module, we had:
+%D
+%D \starttyping
+%D \convertargument etex\to\MPasciiB
+%D \convertargument textext\to\MPasciiC % geen "text"
+%D \convertargument graphictext\to\MPasciiD % geen "text"
+%D
+%D \long\def\checkMPTEXgraphic#1%
+%D {\ifforceMPTEXgraphic
+%D \global\MPTEXgraphictrue
+%D \else
+%D \expandafter\convertargument#1\to\MPasciia
+%D \doifstringinstringelse\MPasciiB\MPasciia{\global\MPTEXgraphictrue}
+%D {\doifstringinstringelse\MPasciiC\MPasciia{\global\MPTEXgraphictrue}
+%D {\doifstringinstringelse\MPasciiD\MPasciia{\global\MPTEXgraphictrue}
+%D {\global\MPTEXgraphicfalse}}}%
+%D \fi}
+%D \stoptyping
+%D
+%D The next alternative permits extensions in other modules
+%D without the need to know the details of testing.
+
+\newtoks\MPTEXgraphicchecks
+
+\long\def\writecheckedMPgraphic#1%
+ {\ifforceMPTEXgraphic
+ \global\MPTEXgraphictrue
+ \else
+ \global\MPTEXgraphicfalse
+ \edef\ascii{#1}\convertcommand\ascii\to\MPascii
+ \the\MPTEXgraphicchecks\relax % \relax is end condition!
+ \fi
+ \flushMPTEXgraphic % verbatimtex etc
+ \writeMPgraphic{#1}} % potential optimization: pass \ascii
+
+%D We could have used a kind of array approach using a
+%D counter appended to \type {MPascii}, but this is an
+%D as efficient alternative. (The uglyness comes from
+%D expanding after the string \type {#1}).
+
+\let\MPTEXchecklist\empty
+
+\def\forceMPTEXcheck#1%
+ {\addtocommalist{#1}\MPTEXchecklist
+ \expanded{\convertargument#1\noexpand\to
+ \@EA\noexpand\csname MPascii#1\endcsname}%
+ \@EA\appendtoks
+ \@EA\doifincsnameelse\csname MPascii#1\endcsname\MPascii
+ {\global\MPTEXgraphictrue\gobbleuntil\relax}\donothing
+ \to \MPTEXgraphicchecks}
+
+\forceMPTEXcheck{etex}
+\forceMPTEXcheck{textext}
+\forceMPTEXcheck{graphictext}
+
+%D \starttyping
+%D \forceMPTEXgraphictrue
+%D
+%D \forceMPTEXcheck{lintext}
+%D \forceMPTEXcheck{logtext}
+%D
+%D \startMPcode
+%D draw hlintext.lft(0, 20, 5, 20cm, "@3e") ;
+%D draw vlogtext.bot(0, 10, 9, 10cm, "@3e") ;
+%D \stopMPcode
+%D \stoptyping
+
+%D A goodie for Mojca (the gnuplot wizzard):
+%D
+%D \starttyping
+%D \startMPcode
+%D draw fullcircle scaled 4cm ;
+%D draw \textext{$\sqrt{\frac{3}{2}^3}$} ;
+%D \stopMPcode
+%D \stoptyping
+
+\long\def\textext#1{\normalunexpanded{textext("#1")}} % or \detokenize
+
+\def\flushMPTEXgraphic
+ {\ifMPTEXgraphic
+ \immediate\write\MPwrite{verbatimtex \the\everyMPTEXgraphic\space etex;}%
+ \fi}
+
+\long\def\flushMPgraphicline#1#2;%
+ {\ifx#1\relax \else
+ \immediate\write\MPwrite{#1#2;}%
+ \expandafter\flushMPgraphicline
+ \fi}
+
+% the next one fails on btex \vbox {\hbox .. leading to \vbox \hbox
+%
+% \long\def\dodowriteMPgraphicline#1tex #2#3etex#4\MPend
+% {\ifx\next\empty\else\ifx\next\relax\else
+% \bgroup
+% \let\par\space
+% \ifx#2\relax
+% \iflongMPlines
+% \immediate\write\MPwrite{#1;}%
+% \else
+% \edef\ascii{#1}%
+% \expandafter\flushMPgraphicline\ascii\empty;\relax;%
+% \fi
+% \egroup
+% \else
+% \convertargument#2#3\to\ascii
+% \immediate\write\MPwrite{#1tex \ascii etex}%
+% \egroup
+% \dowriteMPgraphicline#4tex \relax etex\MPend
+% \fi
+% \fi\fi}
+%
+% so we need a two step approach
+
+% \long\def\dodowriteMPgraphicline#1tex %
+% {\doifnextcharelse\relax
+% {\nododowriteMPgraphicline{#1}}
+% {\redodowriteMPgraphicline{#1}}}
+%
+% better and faster
+
+% \long\def\dodowriteMPgraphicline#1tex #2%
+% {\ifx#2\relax
+% \expandafter\nododowriteMPgraphicline
+% \else
+% \expandafter\redodowriteMPgraphicline
+% \fi{#1} #2}
+%
+% \long\def\redodowriteMPgraphicline#1#2etex#3\MPend
+% {\ifx\next\empty\else\ifx\next\relax\else
+% \bgroup
+% \let\par\space
+% \convertargument#2\to\ascii
+% \immediate\write\MPwrite{#1tex \ascii etex}%
+% \egroup
+% \dowriteMPgraphicline#3tex \relax etex\MPend
+% \fi\fi}
+%
+% \long\def\nododowriteMPgraphicline#1#2\MPend
+% {\ifx\next\empty\else\ifx\next\relax\else
+% \bgroup
+% \let\par\space
+% \iflongMPlines
+% \immediate\write\MPwrite{#1;}%
+% \else
+% \long\edef\ascii{#1}%
+% \expandafter\flushMPgraphicline\ascii\empty;\relax;%
+% \fi
+% \egroup
+% \fi\fi}
+
+% extra scanning
+
+\long\def\dodowriteMPgraphicline#1tex #2% kind of ok
+ {\ifx#2\relax
+ \expandafter\nododowriteMPgraphicline
+ \else
+ \ifcase\MPgraphicsscanmode
+ % can't happen
+ \or
+ \@EAEAEA\redodowriteMPgraphicline
+ \or
+ \doifinstringelse{b$} {#1$}{\@EAEAEA\redodowriteMPgraphicline}%
+ {\doifinstringelse{verbatim$}{#1$}{\@EAEAEA\redodowriteMPgraphicline}%
+ {\@EAEAEA\dododowriteMPgraphicline}}%
+ \else
+ \doifinstringelse { b$}{#1$}{\@EAEAEA\redodowriteMPgraphicline}%
+ {\doifinstringelse {(b$}{#1$}{\@EAEAEA\redodowriteMPgraphicline}%
+ {\doifinstringelse {=b$}{#1$}{\@EAEAEA\redodowriteMPgraphicline}%
+ {\doifinstringelse{verbatim$}{#1$}{\@EAEAEA\redodowriteMPgraphicline}%
+ {\@EAEAEA\dododowriteMPgraphicline}}}}%
+ \fi
+ \fi{#1} #2}
+
+\def\dododowriteMPgraphicline#1#2\MPend
+ {\doifsomething{#1}{\xdef\bufferedMPgraphicsline{\bufferedMPgraphicsline#1tex }}%
+ \dowriteMPgraphicline#2tex \relax etex\MPend}
+
+\long\def\redodowriteMPgraphicline#1#2etex#3\MPend
+ {\ifx\next\empty
+ \else\ifx\next\relax
+ \else
+ \bgroup
+ \let\par\space
+ \convertargument#2\to\ascii
+ \immediate\write\MPwrite{\bufferedMPgraphicsline#1tex \ascii etex}%
+ \globallet\bufferedMPgraphicsline\empty
+ \egroup
+ \dowriteMPgraphicline#3tex \relax etex\MPend
+ \fi\fi}
+
+\long\def\nododowriteMPgraphicline#1#2\MPend
+ {\ifx\next\empty
+ \else\ifx\next\relax
+ \else
+ \bgroup
+ \let\par\space
+ \iflongMPlines
+ \immediate\write\MPwrite{\bufferedMPgraphicsline#1;}%
+ \globallet\bufferedMPgraphicsline\empty
+ \else
+ \long\edef\ascii{\bufferedMPgraphicsline#1}%
+ \expandafter\flushMPgraphicline\ascii\empty;\relax;%
+ \fi
+ \egroup
+ \fi\fi}
+
+%D This stripper is suboptimal in the sense that more
+%D \type{;}'s are output than feasible. Anyhow, \METAPOST\
+%D can handle this and users may consider it being a sort
+%D of error prevention bonus.
+
+\ifx\blabelgroup\undefined
+
+ \let\blabelgroup\bgroup
+ \let\elabelgroup\egroup
+
+\fi
+
+\newconditional\firstMPgraphic \settrue\firstMPgraphic
+
+\appendtoks
+ \let \# \letterhash
+ \let \_ \letterunderscore
+ \let \& \letterampersand
+ \let \{ \letteropenbrace
+ \let \} \letterclosebrace
+\to \everyMPgraphic
+
+%D Not the best place but we need to make sure that no funny
+%D active characters creep in. Some day we will move this code.
+
+\ifx\disablediscretionaries\undefined
+ \let\disablediscretionaries\relax
+\fi
+
+\appendtoks
+ \disablediscretionaries
+\to \everyMPgraphic
+
+\def\writeMPgraph
+ {\immediate\write\MPwrite{mpgraph:=\the\currentMPgraphic;}}
+
+\def\startwritingMPgraphic
+ {\blabelgroup
+ \global\advance\nofMPgraphics \plusone
+ \ifMPrun \else
+ \allocateMPslot\currentMPgraphic
+ \fi
+ \enableincludeMPgraphics
+ \xdef\MPgraphic{\the\currentMPgraphic}%
+ \the\everyMPgraphic
+ \presetMPdefinitions % moved to here from \writeMPgraphic
+ \ifrunMPgraphics
+ \openMPgraphicfile1{runtime}%
+ % no reset here !
+ \theMPextensions
+ \theMPinclusions
+ \else
+ \openMPgraphicfile0{collected}%
+ % reset here ! global added (due to adding \blabelgroup)
+ \theMPextensions
+ \theMPinclusions
+ \global\let\theMPextensions\relax
+ \global\let\theMPinclusions\relax
+ \fi
+ \theMPinitializations % always
+ \ifMPrun
+ \else
+ \ifMPwrapper
+ \immediate\write\MPwrite{let mprunend = end ;}%
+ \immediate\write\MPwrite{beginfig(\the\currentMPgraphic);}%
+ \fi
+ \fi
+ \globallet\flushMPgraphics\closeMPgraphicfiles % \dodostopwritingMPgraphic
+ \globallet\stopwritingMPgraphic\dostopwritingMPgraphic}
+
+\let\MPgraphicfiles\empty
+
+\let\MPinputtranslation\empty
+
+\def\openMPgraphicfile#1#2% #1=alwaysopen #2=message
+ {\@EA\ifx\csname\@@MPG\@@MPG\MPgraphicfile\endcsname\relax
+ \donetrue
+ % \@EA\newwrite\csname\@@MPG\@@MPG\MPgraphicfile\endcsname
+ % for the sake of plain usage
+ \@EA\@EA\csname newwrite\endcsname\csname\@@MPG\@@MPG\MPgraphicfile\endcsname
+ \doglobal\addtocommalist\MPgraphicfile\MPgraphicfiles
+ \else
+ \ifcase#1\relax\donefalse\else\donetrue\fi
+ \fi
+ \@EA\let\@EA\MPwrite\csname\@@MPG\@@MPG\MPgraphicfile\endcsname
+ \ifdone
+ \immediate\openout\MPwrite\MPgraphicfile.mp\relax
+ \ifx\MPinputtranslation\empty\else
+ \immediate\write\MPwrite{\MPinputtranslation}%
+ \immediate\write\MPwrite{verbatimtex \MPinputtranslation etex ;}%
+ \fi
+ \immediate\write\MPwrite{\letterpercent\space #2 graphics of job "\jobname"}%
+ \writeMPgraph
+ \setMPrandomseed
+ \fi}
+
+\def\dostopwritingMPgraphic
+ {\ifMPrun \else
+ \ifMPwrapper
+ \immediate\write\MPwrite{endfig;}%
+ \immediate\write\MPwrite{let end=mprunend;}%
+ \fi
+ \fi
+ \ifrunMPgraphics
+ \dodostopwritingMPgraphic
+ \fi
+ \elabelgroup}
+
+\def\dodostopwritingMPgraphic
+ {\ifnum\currentMPgraphic>\zerocount
+ \donetrue
+ \else\ifMPrun
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \finishwritingMPgraphics
+ \runMPgraphic\MPgraphicfile
+ \fi
+ \globallet\flushMPgraphics\relax}
+
+\def\finishwritingMPgraphics
+ {\ifMPwrapper\immediate\write\MPwrite{end.}\fi
+ \immediate\closeout\MPwrite}
+
+\def\closeMPgraphicfiles
+ {\ifrunMPgraphics \else \ifx\MPgraphicsfiles\empty\else
+ \def\docommand##1%
+ {\message{[flush and process ##1.mp afterwards]}%
+ \@EA\let\@EA\MPwrite\csname\@@MPG\@@MPG##1\endcsname
+ \finishwritingMPgraphics}%
+ \processcommacommand[\MPgraphicfiles]\docommand
+ \fi \fi}
+
+\let\stopwritingMPgraphic\relax
+\let\flushMPgraphics \relax
+
+%D By default each graphic gets its own slot (number). Later
+%D on we will define a recycle bin.
+
+\def \allocateMPslot#1{\global\advance#1\plusone}
+\def\deallocateMPslot#1{}
+
+%D \macros
+%D {translateMPinput}
+%D
+%D For my polish friends:
+%D
+%D \starttyping
+%D % translate=il2-pl
+%D
+%D \translateMPinput{il2-pl}
+%D
+%D \startMPenvironment[global]
+%D \setupbodyfont[plr]
+%D \stopMPenvironment
+%D
+%D \TeX: ± ¶
+%D
+%D \startMPcode
+%D draw btex MetaPost: ± ¶ etex scaled 5 ;
+%D \stopMPcode
+%D \stoptyping
+
+\def\translateMPinput#1%
+% {\xdef\MPinputtranslation{\letterpercent -translate-file=#1\space}} % at some point
+% {\xdef\MPinputtranslation{\letterpercent --8bit}} % some time later
+ {\globallet\MPinputtranslation\empty} % the new mpost is 8 bit clean
+
+%D \macros
+%D {setMPrandomseed}
+%D
+%D Did you notice the random seed initialization? This is
+%D needed because \METAPOST\ has a rather poor initialization,
+%D which in some implementations depends on the time in
+%D minutes. So, in quick successive runs, random is not that
+%D random.
+
+\newif\ifsetMPrandomseed \setMPrandomseedtrue % false by default
+
+\def\setMPrandomseed
+ {\ifsetMPrandomseed \ifx\getrandomnumber\undefined \else
+ \getrandomnumber\localMPseed\zerocount{4095}%
+ \writeMPgraphic{randomseed:=\localMPseed;}%
+ \fi\fi}
+
+%D This feature has become optional. Thanks to Fabrice Popineau,
+%D \METAPOST\ can now do a far better job!
+
+%D \macros
+%D {flushMPgraphics}
+%D
+%D When we use the indirect method, all graphics are saved in
+%D one file. This means that we cannot close this file after
+%D every \type{\stopMPgraphic}. Therefore we need to say:
+%D
+%D \starttyping
+%D \flushMPgraphics
+%D \stoptyping
+%D
+%D else the file is closed without writing the \METAPOST\ end
+%D command. One will notice this fast enough when in indirect
+%D mode. When using the direct mode this command is not
+%D implicitly needed, but ommiting it makes files less
+%D portable.
+
+%D \macros
+%D {loadcurrentMPgraphic,
+%D placeMPgraphic}
+%D
+%D Once defined, we can call for this graphic by saying:
+%D
+%D \starttyping
+%D \loadcurrentMPgraphic{setups}
+%D \placeMPgraphic
+%D \stoptyping
+%D
+%D This two stage insert permits some intermediate manipulations
+%D of the graphic, which temporary saved in:
+
+\newbox\MPgraphicbox
+
+\def\doloadcurrentMPgraphic#1%
+ {\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{#1}%
+ \deallocateMPslot\currentMPgraphic} % added
+
+\ifCONTEXT
+ \def\loadcurrentMPgraphic{\dosinglegroupempty\doloadcurrentMPgraphic}
+\else
+ \let\loadcurrentMPgraphic\doloadcurrentMPgraphic
+\fi
+
+\def\loadMPgraphic#1#2%
+ {\setbox\MPgraphicbox\hbox{\ifinsertMPgraphics\insertMPfile{#1}{#2}\fi}}
+
+\def\MPllx{0}
+\def\MPlly{0}
+
+% \def\placeMPgraphic%
+% {\ifMPshiftdrawing
+% \hbox{\hskip\MPllx\onebasepoint\raise\MPlly\onebasepoint\box\MPgraphicbox}%
+% \else
+% \box\MPgraphicbox
+% \fi}
+%
+% experimental:
+
+\def\placeMPgraphic
+ {\ifMPshiftdrawing
+ \edef\next
+ {\wd\MPgraphicbox\the\wd\MPgraphicbox
+ \ht\MPgraphicbox\the\ht\MPgraphicbox
+ \dp\MPgraphicbox\the\dp\MPgraphicbox}%
+ \setbox\MPgraphicbox\hbox
+ {\hskip\MPllx\onebasepoint\raise\MPlly\onebasepoint\box\MPgraphicbox}%
+ \next
+ \fi
+ \box\MPgraphicbox}
+
+%D \macros
+%D {startreusableMPgraphic, reuseMPgraphic, useMPbox}
+%D
+%D One can use the next macro for defining graphics that are
+%D to be reused. When the next switch is set, graphics are
+%D cached.
+
+\newif\ifuseMPbox \useMPboxtrue
+
+%D We assume that one can set objects:
+%D
+%D \starttyping
+%D \def\douseMPbox#1%
+%D {\setobject{MP}{#1}\vbox
+%D {\forgetall
+%D \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+%D \deallocateMPslot\currentMPgraphic
+%D \placeMPgraphic}%
+%D \setgvalue{#1}{\getobject{MP}{#1}}}
+%D \stoptyping
+%D
+%D More safe is to use a number for \type {{MP}{#1}} which permits
+%D redefinition. We also saves the boundingbox. This helps positioning
+%D reused graphics in layers.
+
+\newcount\MPobjectcounter
+
+\ifx\getobject\undefined \def\setobject#1#2{\setbox\scratchbox} \fi % makes dep check happy
+\ifx\getobject\undefined \def\getobject#1#2{\box \scratchbox} \fi % makes dep check happy
+
+\def\douseMPbox#1%
+ {\global\advance\MPobjectcounter\plusone
+ \setobject{MP}{\number\MPobjectcounter}\vbox
+ {\forgetall
+ \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \deallocateMPslot\currentMPgraphic
+ \placeMPgraphic}%
+ \setxvalue{#1}%
+ {\noexpand\dodouseMPbox{\number\MPobjectcounter}{\MPllx}{\MPlly}{\MPurx}{\MPury}}}
+
+\def\dodouseMPbox#1#2#3#4#5% space delimiting would save some tokens
+ {\xdef\MPllx{#2}% but it's not worth the effort and looks
+ \xdef\MPlly{#3}% ugly as well
+ \xdef\MPurx{#4}%
+ \xdef\MPury{#5}%
+ \getobject{MP}{#1}}
+
+\def\nouseMPbox#1%
+ {\setxvalue{#1}%
+ {\noexpand\forgetall
+ \noexpand\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \noexpand\deallocateMPslot{\currentMPgraphic}%
+ \noexpand\placeMPgraphic}}
+
+\ifCONTEXT \else \let\douseMPbox\nouseMPbox \fi
+\ifCONTEXT \else \let\doifobjectssupportedelse\relax \fi
+
+\long\def\handlereusableMPgraphic#1#2%
+ {\blabelgroup
+ \enableincludeMPgraphics
+ \startMPgraphic#2\stopMPgraphic
+ \doifobjectssupportedelse\donothing\useMPboxfalse
+ \ifuseMPbox
+ \expandafter \douseMPbox
+ \else
+ \expandafter \nouseMPbox
+ \fi {\@@MPG#1}%
+ \getvalue{\@@MPG#1}%
+ \elabelgroup}
+
+% \long\def\startreusableMPgraphic#1#2\stopreusableMPgraphic
+% {\ifundefined{\@@MPG#1}%
+% \long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}}%
+% \fi}
+
+\long\def\dostartreusableMPgraphic#1#2\stopreusableMPgraphic
+ {\blabelgroup
+ \long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}}%
+ \elabelgroup}
+
+\def\reuseMPgraphic#1%
+ {\blabelgroup
+ \getvalue{\@@MPG#1}%
+ \elabelgroup}
+
+\let\stopreusableMPgraphic \relax % so that we can use it in \expanded
+
+%D \macros
+%D {startuseMPgraphic,useMPgraphic}
+%D
+%D The every||time||it's||used original one is defined below.
+%D This one makes sense when the graphic uses random numbers.
+%D
+%D We can run (process graphic) without including them at that
+%D particular place. Therefore we explicitly disable
+%D inclusions (resulting in an dummy figure) when we are in MP
+%D run mode (see mfun-004 for an example, we process an
+%D example buffer which produced graphics).
+
+\long\def\handleuseMPgraphic#1#2%
+ {\bgroup
+ \enableincludeMPgraphics
+ \startMPgraphic#2\stopMPgraphic
+ \ifMPrun \else
+ \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \placeMPgraphic
+ \fi
+ \deallocateMPslot\currentMPgraphic
+ \egroup}
+
+\long\def\startuseMPgraphic
+ {\blabelgroup
+ \obeyMPlines
+ \dostartuseMPgraphic}
+
+\long\def\dostartuseMPgraphic#1#2\stopuseMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}}%
+ \elabelgroup}
+
+\long\def\startusableMPgraphic
+ {\blabelgroup
+ \obeyMPlines
+ \dostartusableMPgraphic}
+
+\long\def\dostartusableMPgraphic#1#2\stopusableMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}}%
+ \elabelgroup}
+
+\let\useMPgraphic\reuseMPgraphic
+
+\let\stopuseMPgraphic \relax % so that we can use it in \expanded
+\let\stopusableMPgraphic \relax % so that we can use it in \expanded
+
+%D \macros
+%D {doifMPgraphicelse}
+%D
+%D For (mainly internal) purposes we provide a test macro.
+
+% \def\doifMPgraphicelse#1%
+% {\doifdefinedelse{\@@MPG#1}}
+
+\def\doifMPgraphicelse#1%
+ {\blabelgroup
+ \doifdefinedelse{\@@MPG#1}%
+ {\elabelgroup\firstoftwoarguments}
+ {\elabelgroup\secondoftwoarguments}}
+
+%D \macros
+%D {includeMPgraphic}
+%D
+%D In a graphic one can call up another (predefined one)
+%D like:
+%D
+%D \starttyping
+%D \startuseMPgraphic{a}
+%D fill fullcircle scaled 100 ;
+%D \stopuseMPgraphic
+%D
+%D \startuseMPgraphic{b}
+%D \includeMPgraphic{a}
+%D fill fullsquare rotated 45 scaled 50 withcolor red ;
+%D \stopuseMPgraphic
+%D
+%D \useMPgraphic{b}
+%D \stoptyping
+
+\def\includeMPgraphic#1%
+ {\executeifdefined{\@@MPG#1};} % ; if not found
+
+\def\enableincludeMPgraphics
+ {\let\handleuseMPgraphic \secondoftwoarguments
+ \let\handlereusableMPgraphic\secondoftwoarguments}
+
+%D We didn't yet define the macro responsible for processing
+%D the graphic from within \TEX.
+
+\def\runMPgraphic#1%
+ {\ifrunMPgraphics
+ \executeMETAPOST{#1}%
+ \else
+ % \message{[flush and process \MPgraphicfile.mp afterwards]}%
+ \fi}
+
+%D \macros
+%D {useMETAFUNformat}
+%D
+%D For faster running, one can generate a format, saying
+%D
+%D \starttyping
+%D mpost -ini context
+%D \stoptyping
+%D
+%D (The resulting \type {mem} file should be moved to the
+%D right location. Watch out for misatching \type {progname}
+%D directives, since they can clutter memory.
+
+\newif\ifuseMETAFUNformat
+
+%D \macros
+%D {executeMetaPost, executeMETAPOST, executesystemcommand}
+%D
+%D With \type{\executeMETAPOST} being defined as:
+
+\ifx\undefined\executeMETAPOST
+ \def\executeMETAPOST#1{\executesystemcommand{\executeMetaPost{#1}}}
+\fi
+
+%D There are two system dependant definitions:
+
+\ifx\undefined\executesystemcommand
+ \def\executesystemcommand#1{\immediate\write18{#1}}
+\fi
+
+\ifx\TEXEXECcommand \undefined \def\TEXEXECcommand{texmfstart texexec} \fi
+
+\ifx\undefined\executeMetaPost
+
+ \ifx\undefined\interactionmode \chardef\interactionmode=255 \fi
+
+ \def\MPOSTbatchswitch {-interaction=batchmode} % was -int, but newer mpost does not support partial flags
+ \def\MPOSTnonstopswitch {-interaction=nonstopmode} % was -int, but newer mpost does not support partial flags
+ \def\MPOSTformatswitch {-progname=metafun -mem=}
+ \def\MPOSTdriver {dvips}
+
+ \def\executeMPOST#1% direct call
+ {mpost
+ \ifcase\interactionmode\MPOSTbatchswitch\or\MPOSTnonstopswitch\fi
+ \space\ifuseMETAFUNformat \MPOSTformatswitch metafun \fi #1}
+
+ \def\executeMPTEX#1% slower, due to nested texexec call
+ {\TEXEXECcommand\space
+ --batch \ifcase\interactionmode --logfile='mptex.log' \fi
+ --output=\MPOSTdriver\space
+ \ifuseMETAFUNformat --mpformat=metafun \fi --mptex --nomp --once #1}
+
+ \def\executeMetaPost
+ {\ifrunMPTEXgraphics
+ \ifMPTEXgraphic
+ \@EAEAEA\executeMPTEX
+ \else
+ \@EAEAEA\executeMPOST
+ \fi
+ \else
+ \@EA\executeMPOST
+ \fi}
+
+\fi
+
+%D The batchmode and nonstopmode (introduced in 2003 for
+%D Patrick Gundlach) switches may differ per binary and are
+%D supported by \TEXEXEC.
+
+%D \macros
+%D {insertMPfile}
+%D
+%D One can define this command in advance or redefine it after
+%D loading this module. The same goes for the forward
+%D reference to the figure loading macro:
+
+\ifx\undefined\insertMPfile
+
+ \def\insertMPfile#1#2%
+ {\ifx\undefined\externalfigure
+ \message{[insert file #1 here]}%
+ \else
+ \externalfigure
+ [#1]
+ [\c!type=\c!mps,\c!object=\v!no,
+ \c!symbol=\v!yes,\c!reset=\v!yes,
+ \c!maxwidth=,\c!maxheight=,
+ \c!frame=\v!off,\c!background=,
+ #2]%
+ \fi}
+
+\fi
+
+%D This macro takes {\em two} arguments, the second one can be
+%D used to pass info to the inclusion macro. Some examples
+%D of its use can be found in the modules \type{supp-tpi} and
+%D \type{prag-log}.
+
+%D This module can be used in \PLAIN\ \TEX too. When using
+%D \DVIPS, just try to process:
+%D
+%D \starttyping
+%D \input supp-mps
+%D
+%D \runMPgraphicstrue
+%D
+%D \def\insertMPfile#1#2%
+%D {\special{psfile=#1}}
+%D
+%D \startuseMPgraphic{1}
+%D prologues := 1;
+%D draw (0,0) withpen pencircle scaled 100;
+%D \stopuseMPgraphic
+%D
+%D \useMPgraphic{1}
+%D \stoptyping
+%D
+%D Don't forget to enable \type{\write18}. When does not say
+%D \type{\runMPgraphicstrue}, the \METAPOST\ scratch file
+%D must be closed by saying
+%D
+%D \starttyping
+%D \flushMPgraphics
+%D \stoptyping
+%D
+%D When using the indirect method, one has to process the file
+%D \type{mpgraph.mp} between two successive \TEX\ runs.
+%D
+%D \METAPOST\ needs the public domain \DVI\ to \POSTSCRIPT\
+%D converter \DVIPS. This symbiosis originates in the need to
+%D include the fonts (glyphs) that \METAPOST\ uses in the
+%D \POSTSCRIPT\ file. Driver independancy was one of my
+%D prerequisites for using \METAPOST, so I decided to build
+%D this kind of support myself. Personally I consider driver
+%D dependancy a drawback for the dissemination of such a
+%D package. The second part of this module more or less
+%D decouples \METAPOST\ and \DVIPS.
+%D
+%D The macros hereafter are copied from the module
+%D \type{m-metapost}. After writing module \type{supp-pdf} I
+%D added this method to the module named and after a while
+%D decided to hook it into module \type{spec-yy}. Therefore
+%D they made it into a support module, but in a slightly
+%D different way.
+
+%D \macros
+%D {includeMPfonts, ifincludeMPfonts}
+%D
+%D The method we use is both robust and simple: one can do
+%D with calling the next macro with the filename as argument:
+%D
+%D \starttyping
+%D \includeMPfonts{filename}
+%D \stoptyping
+%D
+%D We can turn of this mechanism with:
+%D
+%D \starttyping
+%D \includeMPfontsfalse
+%D \stoptyping
+%D
+%D {\em Currently this method fails for situations where the
+%D font definition is not on one line, which is he case when
+%D unkerned fonts are used along with long lines. One solution
+%D for this is to increase the value of \type {max_print_line}
+%D in \type {texmf.cnf}.}}
+
+\newif\ifincludeMPfonts \includeMPfontstrue
+
+\def\includeMPfonts#1%
+ {\ifincludeMPfonts
+ \bgroup
+ \message{[MP fonts #1]}%
+ %\uncatcodespecials
+ \endlinechar\minusone
+ \setMPspecials
+ \obeyMPspecials
+ \setbox\scratchbox\hbox
+ {\hskip-\maxdimen
+ \doprocessfile\scratchread{#1}\handleMPfont}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup
+ \fi}
+
+\def\UseMetaPostGraphic {\includeMPfonts} % upward compatible
+\def\DontUseMetaPostGraphics {\includeMPfontsfalse} % upward compatible
+
+%D The characters are collected in a box and moved as far as
+%D possible into the left margin. The resulting box has no
+%D dimensions and can be prepended (appended) to the special
+%D that handles the inclusion. The characters are in the file
+%D but made invisible.
+%D
+%D In \CONTEXT\ font handling is intergrated in the figure
+%D inclusion macros. A decent plain \TEX\ alternative is:
+%D
+%D \starttyping
+%D \def\includeMPgraphic#1%
+%D {\hbox\bgroup
+%D \includeMPfonts{#1}%
+%D \dogetEPSboundingbox{#1}{\dimen2}{\dimen4}{\dimen6}{\dimen8}%
+%D \advance\dimen6 by -\dimen2
+%D \advance\dimen8 by -\dimen4
+%D \vbox to \dimen8
+%D {\forgetall
+%D \vfill
+%D \hsize\dimen6
+%D \special
+%D {PSfile="#1"\space
+%D llx=\EPSllx\space
+%D lly=\EPSlly\space
+%D urx=\EPSurx\space
+%D ury=\EPSury\space}}%
+%D \egroup}
+%D \stoptyping
+%D
+%D This macro needs \type {supp-eps.tex} and provided no
+%D scaling. For \LATEX\ users the next one will do:
+%D
+%D \starttyping
+%D \def\includeMPgraphic#1#%
+%D {\hbox\bgroup
+%D \def\includeMPgraphics##1%
+%D {\includeMPfonts{##1}%
+%D \includegraphics[typetype=mps,#1]{##1}% or whatever type they use
+%D \egroup}%
+%D \includeMPgraphics}
+%D \stoptyping
+
+%D We scan the graphics file for the \type{fshow} operator,
+%D that is, lines that start with \type{(}. If found it
+%D interprets the line, which looks like:
+%D
+%D \starttyping
+%D (string ... string) font size fshow
+%D \stoptyping
+%D
+%D Font definitions specified in the preamble are simply
+%D ignored. Only lines starting with \type{(} are interpreted.
+
+\def\dohandleMPfont#1#2\relax
+ {\if#1(\expandafter\includeMPcharacters\fileline\relax\fi}
+
+\def\handleMPfont
+ {\expandafter\dohandleMPfont\fileline\relax}
+
+%D Before we start scanning for data, we first change some
+%D \CATCODES. The first set of macro's is copied from module
+%D \type{supp-pdf}. This scheme is a bit overdone for this
+%D module, but using the same macros saves us some memory.
+
+\def\octalMPcharacter#1#2#3%
+ {\char'#1#2#3\relax}
+
+\bgroup
+\catcode`\|=\@@comment
+\catcode`\%=\@@active
+\catcode`\[=\@@active
+\catcode`\]=\@@active
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\catcode`B=\@@begingroup
+\catcode`E=\@@endgroup
+\gdef\keepMPspecials|
+ B\let%\letterpercent|
+ \def[B\noexpand[E|
+ \def]B\noexpand]E|
+ \def{B\noexpand{E|
+ \def}B\noexpand}EE
+\gdef\ignoreMPspecials|
+ B\let%\letterpercent|
+ \def[BE|
+ \def]BE|
+ \def{BE|
+ \def}BEE
+\gdef\obeyMPspecials|
+ B\def%B\char 37\relax E|
+ \def[B\char 91\relax E|
+ \def]B\char 93\relax E|
+ \def{B\char123\relax E|
+ \def}B\char125\relax EE
+\gdef\setMPspecials|
+ B\setnaturalcatcodes
+ \catcode`\\=\@@escape
+ \catcode`\%=\@@active
+ \catcode`\[=\@@active
+ \catcode`\]=\@@active
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \lccode`\-=0 | latex sets this to `\-
+ \lccode`\%=`\% | otherwise it's seen as a number
+ \def\(B\char40\relax E|
+ \def\)B\char41\relax E|
+ \def\\B\char92\relax E|
+ \def\0B\octalMPcharacter0E|
+ \def\1B\octalMPcharacter1E|
+ \def\2B\octalMPcharacter2E|
+ \def\3B\octalMPcharacter3E|
+ \def\4B\octalMPcharacter4E|
+ \def\5B\octalMPcharacter5E|
+ \def\6B\octalMPcharacter6E|
+ \def\7B\octalMPcharacter7E|
+ \def\8B\octalMPcharacter8E|
+ \def\9B\octalMPcharacter9EE
+\egroup
+
+%D The lines starting with \type{(} are interpreted and
+%D handled by
+%D
+%D \starttyping
+%D \def\includeMPcharacters(#1) #2 #3 #4\relax%
+%D {\font\temp=#2 at #3bp\temp#1}
+%D \stoptyping
+%D
+%D While processing some \TUG~98 proceedings, I also had to
+%D deal with:
+%D
+%D \starttyping
+%D /nfont {10 div dup scale 10} def
+%D (T) ANTTB 7.13086 nfont fshow
+%D \stoptyping
+%D
+%D which comes to rounding sizes. This is something
+%D experimental. (The macro in supp-pdf.tex is more
+%D advanced.)
+
+\def\PSnfont{nfont}
+
+\def\includeMPcharacters(#1) #2 #3 #4#5#6#7#8#9\relax
+ {\edef\temp{#4#5#6#7#8}%
+ \ifx\temp\PSnfont % round font size (to pt)
+ \scratchdimen#3\onepoint
+ \ifdim\scratchdimen<\onepoint
+ \def\size{1pt}%
+ \else
+ \advance\scratchdimen .5\onepoint
+ \def\size##1.##2\relax{\def\size{##1pt}}%
+ \expandafter\size\the\scratchdimen\relax
+ \fi
+ \else
+ \edef\size{#3bp}%
+ \fi
+ \font\temp=#2 at \size
+ \temp\if#1 \char32\else#1\fi}
+
+%D This method is both robust and reasonable fast. The only
+%D disadvantage is that when not embedded properly in the
+%D graphics inclusion macros, one has to load all graphics by
+%D hand.
+
+%D Now let's see if things work all right and show the example
+%D files that are part of the \METAPOST\ distribution:
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startlinecorrection
+%D \setupalign[middle]
+%D \leavevmode
+%D \startcombination[3*3]
+%D {\externalfigure[mp-exa-1][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-2][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-3][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-4][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-5][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-6][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-7][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-8][frame=on,width=.2\hsize]} {}
+%D {\externalfigure[mp-exa-9][frame=on,width=.2\hsize]} {}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D Here we used calls like:
+%D
+%D \starttyping
+%D \externalfigure[mp-exa-1][methode-mps,frame=on,width=.2\hsize]
+%D \stoptyping
+
+%D \macros
+%D {convertMPcolors,
+%D ifconvertMPcolors,ifreduceMPcolors,ifforceMPcolors}
+%D
+%D When I told the editors that I wanted to use colored
+%D \METAPOST\ graphics in the color issue of the \MAPS, I was
+%D asked to use the \cap{CMYK} colorspace instead of \cap{RGB}
+%D one. However, \METAPOST\ only supports \cap{RGB} colors. I
+%D decided to write a utility to convert the \type
+%D {setrgbcolor} operators into \type {setcmykcolor} ones, and
+%D some experiments showed me that I could best let \TEX\ do it
+%D itself. Here it is:
+%D
+%D There are two booleans that control the conversion process.
+%D These are false by default.
+
+\newif\ifconvertMPcolors
+\newif\ifreduceMPcolors
+\newif\ifforcegrayMPcolors
+
+%D The main macro is called as:
+%D
+%D \starttyping
+%D \convertMPcolors{filename}
+%D \stoptyping
+%D
+%D When active, this macro returns a message saying if indeed
+%D conversion took place. The old file is overwritten! This
+%D saves time in a succesive passes and can't harm, simply
+%D because MP can generate them anew.
+
+\def\convertMPcolorpath{}
+\def\convertMPcolorfile{metacmyk.tmp}
+
+\def\convertMPcolors#1% todo: open on local path, no copy
+ {\bgroup
+ \ifforcegrayMPcolors
+ \donetrue
+ \else\ifconvertMPcolors
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \message{[MP color conversion #1}%
+ \endlinechar\minusone
+ \uncatcodespecials
+ \donefalse
+ \immediate\openout\scratchwrite\convertMPcolorpath\convertMPcolorfile\relax
+ \doprocessfile\scratchread{#1}\handleMPcolor
+ \immediate\closeout\scratchwrite
+ \ifdone
+ \immediate\openout\scratchwrite\convertMPcolorpath#1\relax
+ \doprocessfile\scratchread{\convertMPcolorpath \convertMPcolorfile}\handleMPcopy
+ \immediate\closeout\scratchwrite
+ \message{done]}%
+ \else
+ \message{not needed]}%
+ \fi
+ \immediate\openout\scratchwrite\convertMPcolorpath\convertMPcolorfile
+ \immediate\closeout\scratchwrite
+ \fi
+ \egroup}
+
+%D The process is rather simple: read a line, look for the
+%D \type {setrgbcolor} operator, recalculate the components and
+%D check for gray reduction or black removal, write the result
+%D to a temporary file, and go on. Afterwards, the file is
+%D copied back. We don't have to reduce to gray scales;
+%D \METAPOST\ already takes care of that.
+
+%D The next macro is needed for forced conversion. This macro
+%D is copied from \type{colo-ini}, just in case one uses this
+%D module outside \CONTEXT.
+
+\ifx\@@cl@@s \undefined \def\@@cl@@s{0} \fi
+
+\ifx\convertRGBtoGRAY\undefined
+
+\def\convertRGBtoGRAY#1#2#3%
+ {\scratchdimen#1\onepoint
+ \scratchdimen300\scratchdimen
+ \scratchcounter\scratchdimen
+ \scratchdimen#2\onepoint
+ \scratchdimen590\scratchdimen
+ \advance\scratchcounter \scratchdimen
+ \scratchdimen#3\onepoint
+ \scratchdimen110\scratchdimen
+ \advance\scratchcounter \scratchdimen
+ \advance\scratchcounter \!!medcard
+ \divide\scratchcounter \!!maxcard
+ \edef\@@cl@@s{\realcolorvalue\scratchcounter}}
+
+\fi
+
+%D BTW, this code is quite old, and not as complete as the
+%D \PDF\ converter, which also handles spot colors and so.
+
+\def\handleMPcolor
+ {\expandafter\dohandleMPcolor\fileline setrgbcolor*\\}
+
+\def\dohandleMPcolor#1setrgbcolor#2#3\\%
+ {\if#2*%
+ \immediate\write\scratchwrite{#1}%
+ \else
+ \dodohandleMPcolor#1setrgbcolor#2#3\\%
+ \fi}
+
+\def\dodohandleMPcolor#1 #2 #3setrgbcolor#4setrgbcolor*\\% old and maybe broke
+ {\bgroup
+ \ifdim#1pt=.123pt
+ \immediate\write\scratchwrite{#1 #2 #3 setrgbcolor}%
+ \else
+ \ifforcegrayMPcolors
+ \convertRGBtoGRAY{#1}{#2}{#3}%
+ \immediate\write\scratchwrite
+ {\@@cl@@s \space setgray #4}%
+ \else
+ \dimen0=\onepoint \advance\dimen0 -#1\points
+ \dimen2=\onepoint \advance\dimen2 -#2\points
+ \dimen4=\onepoint \advance\dimen4 -#3\points
+ \ifreduceMPcolors
+ \dimen6\dimen0
+ \ifdim\dimen2<\dimen6 \dimen6\dimen2 \fi
+ \ifdim\dimen4<\dimen6 \dimen6\dimen4 \fi
+ \advance\dimen0 -\dimen6
+ \advance\dimen2 -\dimen6
+ \advance\dimen4 -\dimen6
+ \else
+ \dimen6\zeropoint
+ \fi
+ \immediate\write\scratchwrite
+ {\withoutpt\the\dimen0 \space
+ \withoutpt\the\dimen2 \space
+ \withoutpt\the\dimen4 \space
+ \withoutpt\the\dimen6 \space setcmykcolor #4}%
+ \fi
+ \fi
+ \egroup
+ \donetrue} % needed for message
+
+\def\handleMPcopy
+ {\immediate\write\scratchwrite{\fileline}}
+
+%D The next examples show the color conversion macros in
+%D action. These examples also demonstrate in||text \METAPOST\
+%D handling. As we will see, the conversion is hooked into the
+%D \CONTEXT\ color mechanism.
+%D
+%D By setting both \type{rgb} and \type{cmyk} to off, we force
+%D conversion to gray scales using:
+%D
+%D \placeformula[-]
+%D \startformula
+%D G = .30r + .59g + .11b
+%D \stopformula
+%D
+%D By using buffers, we keep the \ASCII\ layout clean:
+%D
+%D \startbuffer
+%D \startbuffer[rgb]
+%D \setupcolors[rgb=ja,cmyk=nee,reduction=no,conversion=no]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \setupcolors[rgb=nee,cmyk=ja,reduction=no,conversion=no]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D
+%D \startbuffer[cmy]
+%D \setupcolors[rgb=nee,cmyk=ja,reduction=yes,conversion=no]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D
+%D \startbuffer[gray]
+%D \setupcolors[rgb=nee,cmyk=nee,reduction=no,conversion=no]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+%D
+%D The graphic is rather simple and is generated each time
+%D it's called:
+%D
+%D \global\runMPgraphicstrue
+%D
+%D \startbuffer
+%D \startbuffer[graphic]
+%D \startuseMPgraphic{hans}
+%D width :=\the\textwidth/5;
+%D height := width/4;
+%D fill fullcircle
+%D xscaled width
+%D yscaled height
+%D withcolor (\RedGreenBlue);
+%D \stopuseMPgraphic
+%D \stopbuffer
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+%D
+%D Next we combine the four alternative interpretations in a
+%D combination:
+%D
+%D \startbuffer
+%D \startbuffer[result]
+%D \startcombination[4]
+%D {\getbuffer[rgb]} {\tfxx original}
+%D {\getbuffer[cmyk]} {\ttxx\string\convertMPcolorstrue}
+%D {\getbuffer[cmy]} {\ttxx\string\reduceMPcolorstrue}
+%D {\getbuffer[gray]} {\ttxx\string\forcegrayMPcolorstrue}
+%D \stopcombination
+%D \stopbuffer
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+%D
+%D Finally we call the buffers, using different setting:
+%D
+%D \startbuffer
+%D \placefigure
+%D {\METAPOST\ color conversions}
+%D {\def\RedGreenBlue{.1,.4,.6}\getbuffer[graphic]\getbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.1,.6,.4}\getbuffer[graphic]\getbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.4,.1,.6}\getbuffer[graphic]\getbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.4,.6,.1}\getbuffer[graphic]\getbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.6,.1,.4}\getbuffer[graphic]\getbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.6,.4,.1}\getbuffer[graphic]\getbuffer[result]}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \getbuffer
+%D
+%D By the way, when the \POSTSCRIPT\ file resulting from
+%D this input is converted into \PDF\ and viewed in Acrobat
+%D Reader, one can quite different colors from those
+%D displayed in \GHOSTSCRIPT, which view equals the
+%D \POSTSCRIPT\ originals.
+
+%D \macros
+%D {experimental}
+%D
+%D Some experimental macros:
+%D
+%D \starttyping
+%D \startMPdrawing
+%D \stopMPdrawing
+%D \pushMPdrawing
+%D \popMPdrawing
+%D \resetMPdrawing
+%D \ifMPdrawingdone
+%D \getMPdrawing
+%D \MPdivten[number]
+%D \stoptyping
+%D
+%D These macros are used in \PPCHTEX.
+
+\let\MPdrawingdata\empty
+
+\newif\ifMPdrawingdone \MPdrawingdonefalse
+\newif\ifMPshiftdrawing \MPshiftdrawingfalse
+
+\def\resetMPdrawing
+ {\globallet\MPdrawingdata\empty
+ \global\MPdrawingdonefalse}
+
+% why global push/pop here?
+
+\def\pushMPdrawing
+ {\globalpushmacro\MPdrawingdata
+ \globallet\MPdrawingdata\empty}
+
+\def\popMPdrawing
+ {\globalpopmacro\MPdrawingdata}
+
+\def\getMPdrawing
+ {\ifMPdrawingdone
+ \expandafter\startMPgraphic\MPdrawingdata\stopMPgraphic
+ \loadcurrentMPgraphic{}%
+ \deallocateMPslot\currentMPgraphic
+ \placeMPgraphic
+ \fi}
+
+\def\startMPdrawing
+ {\dosingleempty\dostartMPdrawing}
+
+\long\def\dostartMPdrawing[#1]#2\stopMPdrawing
+ {\relax
+ \bgroup
+ \enableincludeMPgraphics
+ \presetMPdefinitions % in case #2 has measures
+ \doifelse{#1}{-}{\convertargument#2\to\asciia}{\long\def\asciia{#2}}%
+ \long\xdef\MPdrawingdata{\MPdrawingdata\asciia}%
+ \egroup}
+
+\let\stopMPdrawing\relax
+
+\def\MPdivten[#1]%
+ {\@EA\@EA\@EA\doMPdivten\@EA\@EA\@EA[\@EA#1]}
+
+\def\doMPdivten[#1]%
+ {\ifnum#1> 9999 \dodoMPdivtenB#1\else
+ \ifnum#1> 999 \dodoMPdivtenC#1\else
+ \ifnum#1> 99 \dodoMPdivtenD#1\else
+ \ifnum#1> 9 \dodoMPdivtenE#1\else
+ \ifnum#1> 0 \dodoMPdivtenF#1\else
+ \ifnum#1<-9999 \dodoMPdivtenA#1\else
+ \ifnum#1< -999 \dodoMPdivtenB#1\else
+ \ifnum#1< -99 \dodoMPdivtenC#1\else
+ \ifnum#1< -9 \dodoMPdivtenD#1\else
+ \ifnum#1< 0 \dodoMPdivtenE#1\else
+ 0 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\def\dodoMPdivtenA#1#2#3#4#5#6{#1#2#3#4#5.#6}
+\def\dodoMPdivtenB #1#2#3#4#5{#1#2#3#4.#5}
+\def\dodoMPdivtenC #1#2#3#4{#1#2#3.#4}
+\def\dodoMPdivtenD #1#2#3{#1#2.#3}
+\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
+%D We can use \METAPOST\ to calculate arbitrary clipping
+%D paths. Such a path is defined by (for instance):
+%D
+%D \starttyping
+%D \startMPclip{window}
+%D clip currentpicture to fullcircle xscaled \width yscaled \height ;
+%D \stopMPclip
+%D \stoptyping
+%D
+%D Such a path can be extracted (processed) by:
+%D
+%D \starttyping
+%D \grabMPclippath{window}{method}{width}{height}{default path}
+%D \stoptyping
+%D
+%D Currently only method 1 makes sense; it produces \PDF\
+%D code. This macro only makes sense when hooked into a
+%D special routine.
+
+\let\MPclippath\empty
+
+\long\def\startMPclip#1#2\stopMPclip
+ {\blabelgroup
+ \long\setgvalue{MPC:#1}{\startMPgraphic#2\stopMPgraphic\dograbMPclippath}%
+ \elabelgroup}
+
+\let\stopMPclip\relax
+
+\def\grabMPclippath#1#2#3#4#5%
+ {\blabelgroup
+ \edef\width {#3\space}\let\overlaywidth \width
+ \edef\height{#4\space}\let\overlayheight\height
+ \doifdefinedelse{MPC:#1}
+ {\getvalue{MPC:#1}%
+ \setxvalue{MPC:#1}{\noexpand\xdef\noexpand\MPclippath{\MPclippath}}}%
+ {\xdef\MPclippath{#5}}%
+ \ifcase#2\else % method 1 :
+ \doglobal\stripcharacter urveto\from\MPclippath\to\MPclippath
+ \doglobal\stripcharacter oveto\from\MPclippath\to\MPclippath
+ \doglobal\stripcharacter ineto\from\MPclippath\to\MPclippath
+ \fi
+ \elabelgroup}
+
+%D We pose some restrictions to the \METAPOST\ code and pickup
+%D the clip path from the file.
+%D
+%D We turn the slash into a comment. The \type {\hbox} grabs spaces
+%D and the \type {%} triggers the grabber. Next we filter the
+%D clipping path, or actually, the first path.
+
+% \bgroup
+% \catcode`\%=\@@active
+% \catcode`\/=\@@comment
+% \gdef\dograbMPclippath/
+% {\setbox\scratchbox=\hbox\bgroup/
+% \catcode`\%=\@@active
+% \obeylines\let\obeyedline\space
+% \def\do##1newpath##2closepath##3\od/
+% {\xdef\MPclippath{##2}\endinput}/
+% \def%##1%%EOF/
+% {\do##1newpathclosepath\od\endinput}/
+% \readfile{\MPgraphicfile.\the\currentMPgraphic}{}{}/
+% \deallocateMPslot\currentMPgraphic / new
+% \egroup}
+% \egroup
+
+\bgroup
+\catcode`\%=\@@active
+\catcode`\/=\@@comment
+\gdef\dograbMPclippath/
+ {\setbox\scratchbox=\hbox\bgroup/
+ \catcode`\%=\@@active
+ \obeylines\let\obeyedline\space
+ \def\do##1q n##2p W##3\od/
+ {\xdef\MPclippath{##2}\endinput}/
+ \def%##1%%EOF/
+ {\do##1q np W\od\endinput}/
+ \readfile{\MPgraphicfile.\the\currentMPgraphic}{}{}/
+ \ifx\MPclippath\empty
+ \def\do##1newpath##2closepath##3\od/
+ {\xdef\MPclippath{##2}\endinput}/
+ \def%##1%%EOF/
+ {\do##1newpathclosepath\od\endinput}/
+ \readfile{\MPgraphicfile.\the\currentMPgraphic}{}{}/
+ \fi
+ \deallocateMPslot\currentMPgraphic / new
+ \egroup}
+\egroup
+
+%D \macros
+%D {recycleMPslots}
+%D
+%D When coding and embedding many \METAPOST\ figures in a
+%D document, one can save quite some disk space by using
+%D \PDFTEX\ and setting the next switch:
+
+\newif\ifrecycleMPslots \recycleMPslotstrue
+
+%D When a graphic takes space in the text flow, we can run
+%D into deadlock typesetting. In the first pass, the graphic
+%D is not available, but in the second pass it is. The
+%D placeholder that was put there in the first pass in now
+%D replace by the real graphic and as a result the document
+%D shrinks or grows and pages are removed or added. This in
+%D turn can trigger generation of other graphics, like those
+%D in the background. Graphics start swapping place and again
+%D page breaks change. You can imagine the mess we en dup
+%D with.
+%D
+%D This is why we provide was to use a dedicate range if
+%D numbers for fixed graphcs. Such graphics will not en dup
+%D in the text flow (at least their dimensions don't
+%D contribute to the main vertical list, and thereby they
+%D cannot interfere. We use a rather safe maximum of 4000
+%D graphics here and 8000 in \type {meta-ini}.
+
+\newcount \maxnofMPgraphics \maxnofMPgraphics = 4000 % 8000
+\newcount \minnofMPgraphics \minnofMPgraphics = 1
+
+\newif \ifMPstaticgraphic \MPstaticgraphicfalse % determines slot allocation
+
+\def\locateMPslot#1% slightly faster on one slot, much faster on multiple slots
+ {\ifundefined{\number#1MP}% no \ifcsname
+ \letgvalueempty{\number#1MP}%
+ \expandafter\gobbletwoarguments
+ \else
+ \global\advance#1\plusone
+ \fi
+ \locateMPslot#1}
+
+\def\allocateMPslot#1%
+ {\ifrunMPgraphics
+ \ifx\pdfliteral\undefined
+ \recycleMPslotsfalse % quite certainly not pdftex
+ \else\ifcase\pdfoutput
+ \recycleMPslotsfalse % dvi mode or not pdftex (we need to handle dvipdfmx)
+ \fi\fi
+ \else
+ \recycleMPslotsfalse
+ \fi
+ \ifrecycleMPslots
+ % \doloop % slow but used seldom
+ % {\doifundefined{\recurselevel MP}
+ % {\letgvalueempty{\recurselevel MP}%
+ % \global#1\recurselevel
+ % \exitloop}}%
+ \global#1\plusone
+ \locateMPslot#1%
+ % \message{[MP slot + \number#1]%
+ \else\ifMPstaticgraphic % beware not the same as static graphics
+ \global#1\maxnofMPgraphics
+ \global\advance\maxnofMPgraphics \minusone
+ \else
+ \global#1\minnofMPgraphics
+ \global\advance\minnofMPgraphics \plusone
+ \fi\fi
+ \ifnum\minnofMPgraphics<\maxnofMPgraphics \else
+ \writestatus\m!systems{increase \string\maxnofMPgraphics}%
+ \fi}
+
+\def\deallocateMPslot#1%
+ {\ifrunMPgraphics
+ \ifcase\pdfoutput \recycleMPslotsfalse \fi
+ \else
+ \recycleMPslotsfalse
+ \fi
+ \ifrecycleMPslots
+ \global\letbeundefined{\number#1MP}%
+ %\message{[MP slot - \number#1]}%
+ \fi}
+
+%D Experimental and overloaded later, since we need to be
+%D more clever due to \METAPOST's limit of 4~open files.
+
+\def\MPdatafile
+ {mp-\the\currentMPgraphic.mpd}
+
+\def\getMPdata
+ {\input \MPdatafile\relax}
+
+%D \macros
+%D {MPtoks, MPbox}
+%D
+%D For convenience, we provide some scratch registers:
+
+\ifx\undefined\MPtoks \newtoks\MPtoks \fi
+\ifx\undefined\MPbox \newbox \MPbox \fi
+
+%D \macros
+%D {startMPcode}
+%D
+%D We can save some typing with:
+%D
+%D \starttyping
+%D \startMPcode whatever \stopMPcode
+%D \stoptyping
+%D
+%D this automatically places the graphic
+
+\long\def\startMPcode
+ {\begingroup
+ \obeyMPlines
+ \dostartMPcode}
+
+\long\def\dostartMPcode#1\stopMPcode
+ {\startuseMPgraphic{@@}#1\stopuseMPgraphic
+ \useMPgraphic{@@}%
+ \endgroup}
+
+\let\stopMPcode\relax
+
+%D \macros
+%D {startstaticMPgraphic}
+%D
+%D Dedicated to Aditya Mahajan. See meta-ini for usage.
+
+% \long\def\startstaticMPgraphic#1#2\stopstaticMPgraphic
+% {\bgroup
+% \MPstaticgraphictrue
+% \setMPrandomseedfalse
+% \def\MPgraphicfile{#1}% no \jobname here
+% \let\allocateMPslot \gobbleoneargument
+% \let\deallocateMPslot\gobbleoneargument
+% \let\runMPgraphic \gobbleoneargument
+% \MPextensions\emptytoks
+% \MPinitializations\emptytoks
+% \runMPgraphicstrue
+% \MPwrapperfalse
+% \enableincludeMPgraphics
+% \def\sometxt##1{\string\sometxt{##1}}%
+% \currentMPgraphic\plusone % hack, else no close
+% \startMPgraphic#2\stopMPgraphic
+% \executeMPgraphicfile
+% \egroup}
+
+% different version, less messy hooked into the rest
+
+\long\def\startstaticMPgraphic#1#2\stopstaticMPgraphic
+ {\blabelgroup
+ \def\MPgraphicfile{#1}% no \jobname here
+ \let\MPwrite\MPstaticwrite
+ \immediate\openout\MPwrite=\MPgraphicfile.mp
+ \setMPrandomseedfalse
+ \enableincludeMPgraphics
+ \def\sometxt##1{\string\sometxt{##1}}%
+ \the\everyMPgraphic
+ \presetMPdefinitions
+ \theMPinclusions % brrr
+ \writeMPgraphic{\letterpercent mpenvironment: \the\everyMPTEXgraphic}%
+ \writeMPgraphic{beginfig(1);}%
+ \writeMPgraphic{#2}%
+ \writeMPgraphic{endfig; end.}%
+ \immediate\closeout\MPwrite
+ \executeMPgraphicfile
+ \elabelgroup}
+
+% this will go to meta-ini
+
+\def\delaysystemcommand
+ {\ifx\installprogram\undefined
+ \expandafter\executesystemcommand
+ \else
+ \expandafter\installprogram
+ \fi}
+
+\def\MPgraphicfilerunner
+ {texmfstart --ifchanged=\MPgraphicfile.mp texexec --mpstatic \MPgraphicfile.mp}
+
+\ifx\doifmode\undefined
+ \def\executeMPgraphicfile
+ {\ifrunMPgraphics\@EA\executesystemcommand\else\@EA\delaysystemcommand\fi{\MPgraphicfilerunner}}
+\else
+ \def\executeMPgraphicfile{\doifmode{*\v!first}
+ {\ifrunMPgraphics\@EA\executesystemcommand\else\@EA\delaysystemcommand\fi{\MPgraphicfilerunner}}}
+\fi
+
+%D Special for \XETEX\ (problem with newlines). This will go
+%D away once the version supporting \type {--8bit} is
+%D widespread.
+
+\ifnum\texengine=\xetexengine
+ \let\obeyMPlines\relax
+ \longMPlinesfalse % alas
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/supp-mrk.mkii b/tex/context/base/supp-mrk.mkii
new file mode 100644
index 000000000..eb1865471
--- /dev/null
+++ b/tex/context/base/supp-mrk.mkii
@@ -0,0 +1,591 @@
+%D \module
+%D [ file=supp-mrk,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Marks,
+%D author=Jim Fox / 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 Remark: due to the lack of \type {\clearmark}, the \ETEX\
+%D dedicated mechanism is not yet operational.
+
+%D This module has deverted so much from the original that I
+%D can probably rewrite it to a more efficient one now and
+%D I will do so.
+
+%D There are 256 \COUNTERS, \DIMENSIONS, \SKIPS, \MUSKIPS\ and
+%D \BOXES, 16~in- and output buffers, but there is only one
+%D \MARK. In TugBoat~8 (1987, no~1) Jim Fox presents a set of
+%D macros that can be used to mimmick multiple marks. We
+%D gladly adopt them here. I may rewrite this module from
+%D scratch some day, since some low level \CONTEXT\ commands
+%D can be used.
+%D
+%D This module was changed on behalf of \ETEX. The main
+%D extension is that \type{\get..} and alike is used instead of
+%D direct calls. The \TEX\ based multiple marks needs to store
+%D the mark data but \ETEX\ uses a different approach.
+
+\writestatus{loading}{ConTeXt Support Macros / Marks}
+
+\unprotect
+
+%D We start with the presetting the interface macros.
+%D
+%D \starttabulate[|||]
+%D \NC \type{\getmarks} \NC sets the marks to their values \NC \NR
+%D \NC \type{\getallmarks} \NC sets all marks to their values \NC \NR
+%D \NC \type{\getsplitmarks} \NC sets the splitmarks to their values\NC \NR
+%D \NC \type{\getallsplitmarks} \NC sets all splitmarks to their values\NC \NR
+%D \NC \type{\setmarks} \NC synchronizes topmarks (\ETEX) \NC \NR
+%D \stoptabulate
+%D
+%D Later we will overload these, dependent of the brand of
+%D \TEX\ that we use.
+
+\let \getmarks \gobbleoneargument
+\let \getallmarks \relax
+\let \getsplitmarks \gobbleoneargument
+\let \getallsplitmarks \relax
+\let \setallmarks \relax
+
+\let \newmark \gobbleoneargument
+\let \newpersistentmark \gobbleoneargument
+\let \resetmark \gobbleoneargument
+\let \setmark \gobbletwoargument
+
+%D \macros
+%D {expandmarks}
+%D
+%D We can force expansion of marks with the following switch.
+
+\newif\ifexpandmarks \expandmarkstrue % hm, true indeed ?
+
+\beginTEX
+
+%D This implementation is more or less compatible with the
+%D other \type {\new} macros in \PLAIN\ \TEX. A mark is
+%D defined by:
+%D
+%D \starttyping
+%D \newmark\name
+%D \stoptyping
+%D
+%D and can be called upon with:
+%D
+%D \starttyping
+%D \gettopmark \name % or \topname
+%D \getbotmark \name % or \botname
+%D \getfirstmark\name % or \firstname
+%D \stoptyping
+%D
+%D The only drawback of his approach is that the marks must be
+%D preloaded in the output routine. This is accomplished by
+%D means of:
+%D
+%D \starttyping
+%D \getmarks\name
+%D \stoptyping
+%D
+%D The macros presented here are in most aspects copies of
+%D those presented by Jim Fox. We've taken the freedom to
+%D change a few things for more or less obvious reasons:
+%D
+%D \startitemize
+%D \item Because the original macros look quite complicated,
+%D which is mainly due to extensive use of
+%D \type{\expandafter}'s and \type{\csname}'s, we changed
+%D those in favor of \type{\getvalue}.
+%D \item To be more in line with the rest of \CONTEXT, we've
+%D changed some of the names of macros.
+%D \item Because we are already short on \COUNTERS\ we use
+%D macros when possible.
+%D \item We maintain a list of defined marks and use one
+%D call for getting them all at once.
+%D \item We have extended the mechanism to splitmarks (not
+%D perfected yet).
+%D \item We've introduced optional expansion of the contents
+%D of marks.
+%D \stopitemize
+%D
+%D Whatever changes we've made, the credits still go to Jim,
+%D whatever goes wrong is due to me. The method is described
+%D in the TugBoat mentioned before, so we won't go into
+%D details. All marks belonging to a group are packed in a
+%D list. In this list they are preceded by a macro that can
+%D be defined at will and a number concerning the position at
+%D which it was defined.
+%D
+%D \starttyping
+%D \def\somelist{... \domark5{this} ... \domark31{that} ...}
+%D \stoptyping
+%D
+%D The original \type{\mark} keeps track of the number and
+%D \type{\topmark} and \type{\botmark} are used to extract the
+%D actual marks from the list. The counting is done by
+%D
+%D \starttyping
+%D \currentmarker
+%D \stoptyping
+%D
+%D In \CONTEXT\ we use the mark mechanism to keep track of
+%D colors. In a complicated documents with many colors per
+%D page, \type{\currentmarker} can therefore get pretty high.
+%D (Well, this is not completely true, because we don't
+%D always have to use marks.)
+
+\newcount\currentmarker
+
+%D The original implementation used a few more \COUNTERS. Two
+%D have been substituted by macros, one has been replaced by
+%D our scratch counter.
+%D
+%D \starttyping
+%D \newcount\topmarker
+%D \newcount\botmarker
+%D \newcount\foundmarker
+%D \stoptyping
+%D
+%D We've also introduced some constants, one for the lists and
+%D three for composing the mark commands.
+
+\def\@@marklist@@ {*m*} % {marklist}
+\def\@@marktop@@ {*t*} % {top}
+\def\@@markbot@@ {*b*} % {bot}
+\def\@@markfirst@@ {*f*} % {first}
+\def\@@markcurrent@@ {*c*} % {current}
+
+%D The next one is new too. All defined marks are packed in a
+%D comma seperated list. This could of course have been a token
+%D list but \CONTEXT\ has some preference for comma lists.
+
+\let\allmarks=\empty
+
+%D The next macro replaces the multiple step expansion and
+%D command name constructors of Jim. This alternative leads to
+%D a more readable source (we hope).
+
+\def\makemarknames#1% kan genest werken
+ {\bgroup
+ \escapechar=-1
+ \xdef\markname{\string#1}%
+ \xdef\marklist{\@@marklist@@\markname}%
+ \egroup}
+
+%D \macros
+%D {newmark,resetmark}
+%D
+%D A mark is defined by \type{\newmark}. At the same time,
+%D the name of the mark is added to a commalist. The
+%D three initializations were not in the original design, but
+%D make calls from outside the output routine a bit more
+%D robust.
+
+\let\domark\relax % saves a restore on the stack
+
+\def\definenewmark#1#2%
+ {\bgroup
+ \makemarknames{#1}%
+ #2%
+ \letgvalueempty{\@@markcurrent@@\markname}%
+ \letgvalueempty{\@@marktop@@ \markname}%
+ \letgvalueempty{\@@markfirst@@ \markname}%
+ \letgvalueempty{\@@markbot@@ \markname}%
+ \setgvalue{\marklist}{\domark0{}}% beware of halfway definitions
+ \long\gdef#1{\addmarker#1}%
+ \egroup}
+
+\def\newmark#1%
+ {\definenewmark#1{\doglobal\addtocommalist\markname\allmarks}}
+
+%D Don't ask me, but sometimes we need more control over
+%D updating the marks, thereby we have:
+
+\def\newpersistentmark#1% for an example see core-grd.tex
+ {\definenewmark#1\relax}
+
+\let\setmark \empty
+\let\resetmark\newmark
+
+%D Some more natural interfacing macros:
+
+\def\getcurrentmark #1{\getvalue{\@@markcurrent@@\strippedcsname#1}}
+\def\gettopmark #1{\getvalue{\@@marktop@@ \strippedcsname#1}}
+\def\getbottommark #1{\getvalue{\@@markbot@@ \strippedcsname#1}}
+\def\getfirstmark #1{\getvalue{\@@markfirst@@ \strippedcsname#1}}
+\def\getsplitbottommark#1{\getvalue{\@@markbot@@ \strippedcsname#1}}
+\def\getsplitfirstmark #1{\getvalue{\@@markfirst@@ \strippedcsname#1}}
+
+%D \macros
+%D {setmark}
+%D
+%D Setting a new mark and adding a mark to the designated
+%D list is done by \type{\addmarker}. This is an internal
+%D command, the user set a marks bij calling it's name:
+%D
+%D \starttyping
+%D \setmark\mymark{some text} % or \mymark{some text}
+%D \stoptyping
+%D
+%D Where \type{\mymark} is previously defined by
+%D \type{\newmark}.
+
+\long\def\addmarker#1#2%
+ {\bgroup
+ \makemarknames{#1}%
+ \setgvalue{\@@markcurrent@@\markname}{#2}%
+ \global\advance\currentmarker \plusone
+ \normalmark{\the\currentmarker}%
+ \!!toksa\@EA\@EA\@EA{\csname\marklist\endcsname}%
+ \ifexpandmarks
+ \setxvalue\marklist
+ {\the\!!toksa
+ \noexpand\domark
+ \the\currentmarker{#2}}%
+ \else
+ \!!toksb\@EA{#2}% one level, why ? handy for cs
+ \setxvalue\marklist
+ {\the\!!toksa
+ \noexpand\domark
+ \the\currentmarker{\the\!!toksb}}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {getmarks,getallmarks,
+%D getsplitmarks,getallsplitmarks}
+%D
+%D In fact, marks make only sense in the output routine. Marks
+%D are derived from their list by means of \type{\getmarks}.
+%D Only one call per mark is permitted in the output routine.
+%D Therefore, it's far more easy to get them all at once, by
+%D means of \type{\getallmarks}, which is not part of the
+%D original design.
+%D
+%D This grabbing is done by processing the list using the
+%D embedded \type{\domark} macros. When a relevant mark is
+%D found, this macro is reassigned and from then on serves
+%D in building the new list.
+
+% Hm, resetting \!!toksa got lost and took me a half a day to
+% trace down ([] showed up in the pagebody); I really have
+% to clean up this messy module (write it from scratch).
+
+\newif\ifnofirstmarker % an auxiliary switch
+
+\def\getmarks#1%
+ {\bgroup
+ \makemarknames{#1}%
+ \edef\topmarker{0\normaltopmark}%
+ \edef\botmarker{0\normalbotmark}%
+ \!!toksa\emptytoks
+ \!!toksb\emptytoks
+ \nofirstmarkertrue
+ % does more worse than good
+ \let\fi\relax
+ \let\or\relax
+ \let\else\relax
+ %
+ \let\domark\doscanmarks
+ \getvalue\marklist\lastmark
+ %\message{markstatus : [\the\!!toksa\the\!!toksb\the\!!toksc]}%
+ \long\setxvalue\marklist{\the\!!toksa\the\!!toksb\the\!!toksc}%
+ \egroup}
+
+\def\getsplitmarks#1%
+ {\bgroup
+ \makemarknames{#1}%
+ % \@EA\let\@EA\savedmarklist\@EA\csname\marklist\endcsname
+ \edef\topmarker{0\normalsplitfirstmark}%
+ \edef\botmarker{0\normalsplitbotmark}%
+ \!!toksa\emptytoks
+ \!!toksb\emptytoks
+ \nofirstmarkertrue
+ % does more worse than good
+ \let\fi\relax
+ \let\or\relax
+ \let\else\relax
+ %
+ \let\domark\doscanmarks
+ \getvalue\marklist\lastmark
+ % \global\@EA\let\csname\marklist\endcsname\savedmarklist
+ \egroup}
+
+\def\getallmarks {\processcommacommand[\allmarks]\getmarks}
+\def\getallsplitmarks{\processcommacommand[\allmarks]\getsplitmarks}
+
+\def\getallmarks {\@EA\processcommalist\@EA[\allmarks]\getmarks}
+\def\getallsplitmarks{\@EA\processcommalist\@EA[\allmarks]\getsplitmarks}
+
+\long\def\dodoscanmarks#1%
+ {\ifnum\scratchcounter>\topmarker\relax
+ \normalelse
+ \long\setgvalue{\@@marktop@@\markname}{#1}%
+ \normalfi
+ \ifnum\scratchcounter>\botmarker\relax
+ \let\domark\dorecovermarks
+ \!!toksb\@EA{\@EA\domark\the\scratchcounter{#1}}%
+ \normalelse
+ \ifnofirstmarker
+ \long\setgvalue{\@@markfirst@@\markname}{#1}%
+ \ifnum\scratchcounter>\topmarker\relax
+ \nofirstmarkerfalse
+ \normalfi
+ \normalfi
+ \long\setgvalue{\@@markbot@@\markname}{#1}%
+ \!!toksa\@EA{\@EA\domark\the\scratchcounter{#1}}%
+ \normalfi}
+
+\def\doscanmarks
+ {\afterassignment\dodoscanmarks\scratchcounter=}
+
+\long\def\dorecovermarks#1\lastmark% nice trick
+ {\!!toksc{\domark#1}}
+
+\def\lastmark% rest of trick
+ {\!!toksc\emptytoks}
+
+\endTEX
+
+%D The \ETEX\ way of doing things \unknown
+
+\beginETEX \marks cum suis
+
+\newtoks \listofmarks
+
+\def\@@prk{prk:}
+\def\@@mrk{mrk:}
+\def\@@trk{trk:}
+\def\@@frk{frk:}
+\def\@@brk{brk:}
+\def\@@crk{crk:}
+
+%D We will use two state variables per mark, one to signal
+%D that a new mark value is set, and one to trigger (on the
+%D next page) the setting of the top mark.
+
+\def\checkedtopmarks #1{\csname\@@trk\string#1\endcsname}
+\def\checkedfirstmarks#1{\csname\@@frk\string#1\endcsname}
+\def\checkedbotmarks #1{\csname\@@brk\string#1\endcsname}
+\def\thecurrentmarks #1{\csname\@@crk\string#1\endcsname}
+
+\long\def\setmark#1%
+ {%\writestatus{marks}{setting \string#1}\wait
+ \global\@EA\chardef\csname\@@mrk\string#1\endcsname\plusone
+ %\@EA\normalmarks\csname\@@prk\string#1\endcsname{1}%
+ \@EA\normalmarks\csname\@@prk\string#1\endcsname{\realfolio}%
+ \ifexpandmarks\@EA\setexpandedmark\else\@EA\setnormalmark\fi#1}
+
+\def\setexpandedmark#1#2% % marks expand anyway
+ {\@EA\xdef\csname\@@crk\string#1\endcsname{#2}%
+ \normalmarks#1{#2}}
+
+\def\setnormalmark#1#2% using a tok prevents unwanted expansion in mark
+ {\begingroup % don't ask why, but grouping is needed
+ \scratchtoks{#2}% in order to to mess up scratchtoks
+ \@EA\xdef\csname\@@crk\string#1\endcsname{\the\scratchtoks}%
+ \normalmarks#1{\the\scratchtoks}% one level expansion
+ \endgroup}
+
+\def\checktopmark#1%
+ {%\writestatus{marks}{checking \string#1}\wait
+ \ifcase\csname\@@mrk\string#1\endcsname\else\dochecktopmark#1\fi}
+
+%\def\dochecktopmark#1%
+% {\ifcase0\@EA\normalfirstmarks\csname\@@prk\string#1\endcsname\else
+% \@EA\ifx\csname\@@frk\string#1\endcsname\empty
+% \@EA\gdef\csname\@@frk\string#1\endcsname{\normalfirstmarks#1}%
+% \@EA\gdef\csname\@@brk\string#1\endcsname{\normalbotmarks #1}%
+% \else
+% \@EA\gdef\csname\@@trk\string#1\endcsname{\normaltopmarks #1}%
+% \global\@EA\chardef\csname\@@mrk\string#1\endcsname\zerocount
+% \fi
+% \fi}
+
+\def\dochecktopmark#1%
+ {\ifx*\@EA\normalfirstmarks\csname\@@prk\string#1\endcsname*\else
+ \@EA\ifx\csname\@@frk\string#1\endcsname\empty
+ \@EA\gdef\csname\@@frk\string#1\endcsname{\normalfirstmarks#1}%
+ \@EA\gdef\csname\@@brk\string#1\endcsname{\normalbotmarks #1}%
+ \else
+ \@EA\gdef\csname\@@trk\string#1\endcsname{\normaltopmarks #1}%
+ \global\@EA\chardef\csname\@@mrk\string#1\endcsname\zerocount
+ \fi
+ \fi}
+
+%\def\resetmark#1% we cannot use \normalmarks#1{}
+% {\global\@EA\chardef\csname\@@mrk\string#1\endcsname\zerocount
+% \@EA\normalmarks\csname\@@prk\string#1\endcsname{0}%
+% \global\@EA\let\csname\@@trk\string#1\endcsname\empty
+% \global\@EA\let\csname\@@frk\string#1\endcsname\empty
+% \global\@EA\let\csname\@@brk\string#1\endcsname\empty
+% \global\@EA\let\csname\@@crk\string#1\endcsname\empty}
+
+\def\resetmark#1% we cannot use \normalmarks#1{}
+ {\global\@EA\chardef\csname\@@mrk\string#1\endcsname\zerocount
+ \@EA\normalmarks\csname\@@prk\string#1\endcsname{}% {0}%
+ \global\@EA\let\csname\@@trk\string#1\endcsname\empty
+ \global\@EA\let\csname\@@frk\string#1\endcsname\empty
+ \global\@EA\let\csname\@@brk\string#1\endcsname\empty
+ \global\@EA\let\csname\@@crk\string#1\endcsname\empty}
+
+\def\definenewmark#1%
+ {\ifcsname\@@prk\string#1\endcsname\else % this is etex -)
+ \newmarks#1\doglobal\appendtoks\checktopmark#1\to\listofmarks
+ \@EA\newmarks\csname\@@prk\string#1\endcsname % status mark
+ \fi
+ \global\@EA\mathchardef\csname\@@mrk\string#1\endcsname\zerocount
+ \global\@EA\let\csname\@@crk\string#1\endcsname\empty
+ \@EA\gdef\csname\@@trk\string#1\endcsname{\normaltopmarks #1}%
+ \@EA\gdef\csname\@@frk\string#1\endcsname{\normalfirstmarks#1}%
+ \@EA\gdef\csname\@@brk\string#1\endcsname{\normalbotmarks #1}}
+
+\let \newmark \definenewmark
+\let \newpersistentmark \newmarks % \definenewmark
+\let \normalsetmark \setmark
+
+\def\getallmarks{\the\listofmarks} % \def\setallmarks{\the\listofmarks}
+
+%D In \type {page-ini} or \type {core-mar} we should say:
+%D
+%D \starttyping
+%D \appendtoks \getallmarks \to \everybeforepagebody
+%D \appendtoks \setallmarks \to \everyafterpagebody
+%D \stoptyping
+
+\let\getcurrentmark \thecurrentmarks
+\let\gettopmark \checkedtopmarks
+\let\getbottommark \checkedbotmarks % \normalbotmarks
+\let\getfirstmark \checkedfirstmarks % \normalfirstmarks
+\let\getsplitbottommark \normalsplitbotmarks
+\let\getsplitfirstmark \normalsplitfirstmarks
+
+\let\getbotmark \getbottommark
+\let\getsplitbotmark \normalsplitbotmarks
+\let\getsplittopmark \normalsplitfirstmarks
+
+\endETEX
+
+%D A couple of goodies:
+
+\let\getbotmark \getbottommark
+\let\getsplitbotmark\getsplitbottommark
+\let\getsplittopmark\getsplitfirstmark
+
+%D \macros
+%D {noninterferingmarks}
+%D
+%D Marks can interfere badly with for instance postprocessing
+%D paragraphs, for instance when we want to grab the last box
+%D using \type {\lastbox}, when at the same time using colors.
+
+\let\normalsetmark\setmark
+
+\def\noninterferingsetmark#1#2%
+ {\ifhmode\prewordbreak\hbox\fi{\normalsetmark{#1}{#2}}}
+
+\def\noninterferingmarks
+ {\let\noninterferingmarks\relax
+ \let\setmark\noninterferingsetmark}
+
+%D This macro is for instance used in the inline headings
+%D postprocessing, as needed when we want to make those
+%D clickable.
+
+%D Right from the beginning, \CONTEXT\ supported more than one
+%D mark, using an extended version of Jim Fox multiple mark
+%D mechanism. In \ETEX\ we can however directly access more
+%D marks than we will ever need.
+
+%D Resetting marks in not compatible with the old method.
+%D Here a node is inserted, which can interfere badly. In
+%D fact, a real \type {\clearmarks\name} is needed.
+%D
+%D \starttyping
+%D \def\resetmark#1{\marks#1{}}
+%D \stoptyping
+%D
+%D A possible macro solution is presented here. When discussing
+%D \type {\clearmarks} on the \ETEX\ discussion list, Chris
+%D Rowley suggested to use a reset flag. Unfortunately this
+%D is not enough since we need to keep track of both set and
+%D reset state then. This means that we must postpone resetting
+%D to the page following the set, and as a result we need
+%D another auxiliary macro. The current solution is the best
+%D I could come up with so far, especially given that we
+%D need a fast mechanism.
+
+%D For those who want to know the story behind resetting
+%D marks, here are some examples of interference
+%D
+%D \startbuffer
+%D \setbox0=\vbox{test}
+%D \unvbox0\setbox0=\lastbox
+%D \ruledhbox{\unhbox0}
+%D \stopbuffer
+%D
+%D \typebuffer\blank\getbuffer\blank
+%D
+%D \startbuffer
+%D \setbox0=\vbox{test\normalmark{}}
+%D \unvbox0\setbox0=\lastbox
+%D \ruledhbox{\unhbox0}
+%D \stopbuffer
+%D
+%D \typebuffer\blank\getbuffer\blank
+%D
+%D \startbuffer
+%D \setbox0=\vbox{test\hbox{\normalmark{}}}
+%D \unvbox0\setbox0=\lastbox
+%D \ruledhbox{\unhbox0}
+%D \stopbuffer
+%D
+%D \typebuffer\blank\getbuffer\blank
+%D
+%D \startbuffer
+%D \setbox0=\vbox{test\vbox{\normalmark{}}}
+%D \unvbox0\setbox0=\lastbox
+%D \ruledhbox{\unhbox0}
+%D \stopbuffer
+%D
+%D \typebuffer\blank\getbuffer\blank
+
+%D One final advice. Use marks with care. When used in globally
+%D assigned boxes, the list can grow quite big, and processing
+%D can slow down considerably. This drawback is removed in
+%D \ETEX\ mode.
+
+\beginTEX
+
+\let\rawnewmark \newmark
+\let\rawdefinemark \newmark
+\let\rawsetmark \setmark
+\let\rawgettopmark \gettopmark
+\let\rawgetfirstmark \getfirstmark
+\let\rawgetbotmark \getbotmark
+\let\rawgetsplitbotmark \normalsplitbotmark
+\let\rawgetsplitfirstmark\normalsplitfirstmark
+\let\rawgetsplittopmark \normalsplitfirstmark
+
+\endTEX
+
+\beginETEX
+
+\let\rawnewmark \newmarks
+\let\rawdefinemark \newmarks
+\let\rawsetmark \normalmarks
+\let\rawgettopmark \normaltopmarks
+\let\rawgetfirstmark \normalfirstmarks
+\let\rawgetbotmark \normalbotmarks
+\let\rawgetsplitbotmark \normalsplitbotmarks
+\let\rawgetsplitfirstmark\normalsplitfirstmarks
+\let\rawgetsplittopmark \normalsplitfirstmarks
+
+\endETEX
+
+\protect \endinput
diff --git a/tex/context/base/supp-num.tex b/tex/context/base/supp-num.tex
new file mode 100644
index 000000000..d192ab548
--- /dev/null
+++ b/tex/context/base/supp-num.tex
@@ -0,0 +1,443 @@
+%D \module
+%D [ file=supp-num,
+%D version=1998.05.15,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Numbers,
+%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 Support Macros / Numbers}
+
+\unprotect
+
+%D \macros
+%D {digits, setdigitmode, setdigitsign}
+%D
+%D Depending on the digit mode the command \type {\digits}
+%D normalizes number patterns depending on the language set.
+%D
+%D \starttyping
+%D This will never be a \digits{1.000.000} seller.
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D I will never grow longer than \digits 1.86 \Meter.
+%D \stoptyping
+%D
+%D The different modes are shown in:
+%D
+%D \startbuffer
+%D \setdigitmode 1 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 2 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 3 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 4 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 5 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 6 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is typset as:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D
+%D The sign can be typeset as is or within the space of a
+%D digit.
+%D
+%D \startbuffer
+%D \setdigitsign 0 \digits +12.345,90
+%D \setdigitmode 1 \digits +12.345,90
+%D \setdigitmode 2 \digits +12.345,90
+%D \setdigitmode 3 \digits +12.345,90
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is typset as:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+\chardef\digitoutputmode=1 % 0..6
+\chardef\digitsignmode =0 % 0..3
+
+\def\setdigitmode{\chardef\digitoutputmode}
+\def\setdigitsign{\chardef\digitsignmode}
+
+%D The digit modes are:
+%D
+%D \startitemize[packed]
+%D \item periods \& comma
+%D \item commas \& period
+%D \item thinmuskips \& comma
+%D \item thinmuskips \& period
+%D \item thickmuskips \& comma
+%D \item thickmuskips \& period
+%D \stopitemize
+
+\let\collecteddigits \empty \chardef\digitinputmode =1
+\let\saveddigits \empty \chardef\skipdigit =0
+\let\savedpowerdigits\empty \chardef\powerdigits =0
+
+%D The first stage of the \type {\digit} macro takes care of
+%D the grouped call, the other branch handles the fuzzy
+%D delimited calls.
+
+\ifx\mbox\undefined \let\mbox\normalhbox \fi
+
+% \unexpanded\def\digits
+% {\bgroup\let~@\doifnextbgroupelse\dodigits\grabdigit}
+
+\unexpanded\def\digits
+ {\bgroup
+ \let~@%
+ \doifnextbgroupelse\dodigits{\doifnextcharelse\normalmathshift\domathdigits\grabdigit}}
+
+\def\dodigits#1%
+ {\grabdigit#1\relax}
+
+\def\domathdigits$#1$%
+ {\mbox{\grabdigit#1\relax}} % adding $ $ goes wrong in tabulate
+
+\def\grabdigit
+ {\futurelet\next\scandigit}
+
+%D Watch the test for \type {\nextobeyedline}, because the
+%D endofline token can be \type {\def'd}, not \type {\let}'d,
+%D we need to do an indirect test (see \type {verb-ini.tex})
+%D for details.
+%D
+%D \starttyping
+%D \def ^^M{\obeyedline}
+%D \def\nextbeyedline{\obeyedline}
+%D \stoptyping
+
+\ifx\normalmathshift\undefined \let\normalmathshift=$ \fi
+
+\def\scandigit
+ {\ifx\next\blankspace
+ \let\next\handledigits
+ \else\ifx\next\nextobeyedline % the indirect one
+ \let\next\handledigits
+ \else\ifx\next\bgroup
+ \let\next\handledigits
+ \else\ifx\next\egroup
+ \let\next\handledigits
+ \else\ifx\next\normalmathshift
+ \let\next\handledigits
+ \else
+ \let\next\collectdigit
+ \fi\fi\fi\fi\fi
+ \next}
+
+%D We store the power||of||ten (to be signaled by \type {^},
+%D \type {e} or~\type {E}) in a seperate macro so that we can
+%D typeset it in superscript. The space placeholders are
+%D replaced by a \type {@}.
+
+\def\savedigit#1#2%
+ {\edef#1{#1\saveddigits#2}\let\saveddigits\empty}
+
+\long\def\collectdigit#1%
+ {\ifx#1~%
+ \savedigit\collecteddigits @%
+ \else\if#1_%
+ \savedigit\collecteddigits @%
+ \else\if\noexpand#1\relax
+ \let\grabdigit\handledigits
+ \else\ifcase\powerdigits
+ \if#1E%
+ \chardef\powerdigits\plusone
+ \else\if#1e%
+ \chardef\powerdigits\plusone
+ \else\if#1^%
+ \chardef\powerdigits\plusone
+ \else
+ \savedigit\collecteddigits#1%
+ %\doifnumberelse{#1}
+ % {\savedigit\collecteddigits#1}
+ % {\def\saveddigits{#1}}%
+ \fi\fi\fi
+ \else
+ \savedigit\savedpowerdigits#1%
+ %\doifnumberelse{#1}
+ % {\savedigit\savedpowerdigits#1}
+ % {\def\saveddigits{#1}}%
+ \fi\fi\fi\fi
+ \grabdigit}
+
+\let\handlemathdigits\firstofoneargument
+\let\handletextdigits\mathematics
+
+\def\handledigits
+ {%\ifcase\powerdigits
+ % \edef\collecteddigits{\collecteddigits\saveddigits}%
+ %\else
+ % \edef\savedpowerdigits{\savedpowerdigits\saveddigits}%
+ %\fi
+ \ifmmode
+ \handlemathdigits{\dohandledigits}%
+ \else
+ \dontleavehmode\hbox{\handletextdigits{\dohandledigits}}%
+ \fi
+ \egroup}
+
+%D Although we could do with one pass, a second pass for
+%D handling the stored sequence is more readable.
+
+\ifnum\texengine=\luatexengine
+
+ \def\dohandledigits
+ {\mathcode`\,="002C \mathcode`\.="002E % pretty hard coded
+ \expandafter\handletokens\collecteddigits\with\scandigits
+ \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
+
+ \chardef\mathaxisfontid\zerocount
+
+\else
+
+ \def\dohandledigits
+ {\mathcode`\,="013B \mathcode`\.="013A % pretty hard coded
+ \expandafter\handletokens\collecteddigits\with\scandigits
+ \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
+
+ \chardef\mathaxisfontid\plustwo
+
+\fi
+
+\def\doscandigit#1%
+ {\ifcase\skipdigit\@EA\hbox\else\@EA\hphantom\fi\bgroup
+ \mathematics % brr, needed because of stored punctuation
+ {\ifnum\digitinputmode=#1\relax
+ \ifcase\digitoutputmode
+ \or .%
+ \or ,%
+ \or \mskip\thinmuskip
+ \or \mskip\thinmuskip
+ \or \mskip\thickmuskip
+ \or \mskip\thickmuskip
+ \fi
+ \else
+ \ifodd\digitoutputmode,\else.\fi
+ \fi}%
+ \egroup}
+
+%D The signs can be made smaller and sqeezed into the width
+%D of a digit. Watch the \type {\mathaxisheight} trickery (this
+%D font related register stored the math axis).
+
+% \def\scandigits#1%
+% {\if#1.\doscandigit1\chardef\skipdigit0\else
+% \if#1,\doscandigit2\chardef\skipdigit0\else
+% \if#1@\hphantom{0}\chardef\skipdigit1\else
+% \if#1_\hphantom{0}\chardef\skipdigit1\else
+% \if#1/\digitsgn{\hphantom{+}}\chardef\skipdigit0\else
+% \if#1-\digitsgn-\chardef\skipdigit0\else
+% \if#1+\digitsgn+\chardef\skipdigit0\else
+% \if#1=\digitsgn\zeroamount\chardef\skipdigit0\else
+% \if#1s\digitsgn{\hphantom{\positive}}\chardef\skipdigit0\else
+% \if#1p\digitsgn\positive\chardef\skipdigit0\else
+% \if#1m\digitsgn\negative\chardef\skipdigit0\else
+% \if#1n\digitsgn\negative\chardef\skipdigit0\else
+% #1\chardef\skipdigit0\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% \def\digitsep#1%
+% {\doscandigit#1\chardef\skipdigit0}
+%
+% \def\digitnop
+% {\hphantom{0}\chardef\skipdigit1}
+
+% 0,=
+% 0,== second = results in delta(00,=)
+% 0,- is invalid, should be =
+% 0,-- is invalid, should be ==
+
+\def\digitzeroamount
+ {\digitsgn\zeroamount
+ \def\digitzeroamount
+ {\hphantom
+ {00\setbox\scratchbox\hbox{$\zeroamount$}%
+ \hskip-\wd\scratchbox}%
+ \let\digitzeroamount\empty}}
+
+\def\scandigits#1%
+ {\if#1.\digitsep1\else
+ \if#1,\digitsep2\else
+ \if#1@\digitnop \else
+ \if#1_\digitnop \else
+ \if#1/\digitsgn{\hphantom{+}}\chardef\skipdigit0\else
+ \if#1-\ifcase\skipdigit\digitsgn-\else
+ \box\digitsepbox\digitzeroamount \fi\chardef\skipdigit0\else
+ \if#1+\digitsgn+\chardef\skipdigit0\else
+ \if#1=\box\digitsepbox\digitzeroamount \chardef\skipdigit0\else
+ \if#1s\digitsgn{\hphantom{\positive}}\chardef\skipdigit0\else
+ \if#1p\digitsgn\positive\chardef\skipdigit0\else
+ \if#1m\digitsgn\negative\chardef\skipdigit0\else
+ \if#1n\digitsgn\negative\chardef\skipdigit0\else
+ \box\digitsepbox #1\chardef\skipdigit0\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\newbox\digitsepbox \chardef\autodigitmode=1
+
+\def\digitsep#1%
+ {\ifcase\autodigitmode
+ \doscandigit#1%
+ \else
+ \setbox\digitsepbox\hbox{\doscandigit#1}%
+ \fi
+ \chardef\skipdigit0\relax}
+
+% strange, does not work
+%
+% \def\digitnop
+% {\hphantom{\box\digitsepbox}%
+% \hphantom{0}\chardef\skipdigit1\relax}
+%
+% while this works
+
+\def\digitnop
+ {\hbox{\hphantom{\box\digitsepbox}}%
+ \hphantom{0}\chardef\skipdigit1\relax}
+
+% but this doesn't
+%
+% \def\digitnop
+% {\hphantom{\box\digitsepbox0}%
+% \chardef\skipdigit1\relax}
+
+\def\digitsgn#1%
+ {\ifcase\digitsignmode#1\else
+ \hbox
+ {\setbox\scratchbox\hbox{0}%
+ \scratchdimen\mathaxisheight\textfont\mathaxisfontid
+ \def\digitsgn##1##2%
+ {\advance\scratchdimen-\mathaxisheight##1\mathaxisfontid
+ \raise\scratchdimen
+ \hbox to \wd\scratchbox{\hss$##2#1$\hss}}%
+ \ifcase\digitsignmode\or
+ \digitsgn\textfont \textstyle \or
+ \digitsgn\scriptfont \scriptstyle \or
+ \digitsgn\scriptscriptfont\scriptscriptstyle\fi}%
+ \fi}
+
+\ifx\undefined\zeroamount \def\zeroamount{-} \fi
+\ifx\undefined\positive \def\positive {+} \fi
+\ifx\undefined\negative \def\negative {-} \fi
+
+%D The digit parser handles a bunch of special characters as
+%D well as different formats. We strongly suggest you to use
+%D the grouped call.
+%D
+%D \starttabulate[|l|l|l|]
+%D \NC \type{.} \NC , . \NC comma or period \NC \NR
+%D \NC \type{,} \NC , . \NC comma or period \NC \NR
+%D \NC \type{@} \NC \NC invisible space \NC \NR
+%D \NC \type{_} \NC \NC invisible space \NC \NR
+%D \NC \type{/} \NC \NC invisible sign \NC \NR
+%D \NC \type{-} \NC $-$ \NC minus sign \NC \NR
+%D \NC \type{+} \NC $+$ \NC plus sign \NC \NR
+%D \NC \type{s} \NC \NC invisible high sign \NC \NR
+%D \NC \type{p} \NC $\positive$ \NC high plus sign \NC \NR
+%D \NC \type{m} \NC $\negative$ \NC high minus sign \NC \NR
+%D \NC \type{n} \NC $\negative$ \NC high minus (negative) sign \NC \NR
+%D \NC \type{=} \NC $\zeroamount$ \NC zero padding \NC \NR
+%D \stoptabulate
+%D
+%D These triggers are used in the following examples.
+%D
+%D \startbuffer
+%D \digits 12
+%D \digits{~~~.~~~.~~~.68.712,34}
+%D \digits ~~~.~~~.~~~.68.712,34
+%D \digits ___.___.111.68.712,34
+%D \digits 111.111.111.68.712,34
+%D \digits 12.345,90
+%D \digits 12.345.000
+%D \digits 12,34
+%D \digits{392.857.230.68.712,34}
+%D {\digits1234}
+%D \digits{1234}
+%D \digits 1234\relax
+%D $\digits 123.222,00$
+%D \digits 123.222,00
+%D \digits 123.222,==
+%D \digits 123.222,00^10
+%D \digits 123.222,00e10
+%D \digits /123.222,00e-12
+%D \digits -123.222,00e-12
+%D \digits +123.222,00e-12
+%D \digits n123.222,00e-12
+%D \digits s123.222,00e-12
+%D \digits p123.222,00e-12
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+%D \macros
+%D {Digits}
+%D
+%D We also permit:
+
+\let\Digits\digits
+
+%D These macros are complicated by the fact that we also
+%D have to support cases like:
+%D
+%D \starttyping
+%D {\digits1234}
+%D \digits{1234}
+%D \digits 1234\whatever
+%D $\digits 123.222,00$
+%D \digits 123.222,00.
+%D \stoptyping
+%D
+%D The latter case shows us that trailing non digits are to
+%D be passed untreated.
+%D
+%D Another interesting case is:
+%D
+%D \starttyping
+%D \digits 123.222,00^10
+%D \stoptyping
+%D
+%D The separator is defined as:
+
+% \def\digitpowerseparator%
+% {\cdot10} % {\times10}
+
+\def\digitpowerseparator
+ {\ifx\collecteddigits\empty\else\cdot\fi10}
+
+%D \macros
+%D {digittemplate}
+%D
+%D Users can specify the way they enter those digits by saying
+%D something like:
+%D
+%D \starttyping
+%D \digittemplate 12.000.000,00 % \digittemplate .,
+%D \stoptyping
+
+\def\digittemplate #1 %
+ {\chardef\digitinputmode\zerocount
+ \handletokens#1\with\scandigittemplate}
+
+\def\scandigittemplate#1%
+ {\if #1.\ifcase\digitinputmode\chardef\digitinputmode\plusone \fi% period
+ \else\if#1,\ifcase\digitinputmode\chardef\digitinputmode\plustwo \fi% comma
+ \fi\fi}
+
+\protect \endinput
diff --git a/tex/context/base/supp-pat.mkii b/tex/context/base/supp-pat.mkii
new file mode 100644
index 000000000..d91083076
--- /dev/null
+++ b/tex/context/base/supp-pat.mkii
@@ -0,0 +1,179 @@
+%D \module
+%D [ file=supp-pat,
+%D version=2005.02.12,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Patterns,
+%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 support:
+%D
+%D \starttyping
+%D \patterns {
+%D ...[namedglyphs]...
+%D }
+%D \stoptyping
+%D
+%D as well as:
+%D
+%D \starttyping
+%D <patterns>
+%D ...&namedglyphs;...
+%D </patterns>
+%D \stoptyping
+%D
+%D The \XML\ variant has very limited \XML\ parsing capabilities and
+%D is meant as an experiment.
+
+\ifx\writestatus\undefined \else
+
+ \writestatus{loading}{ConTeXt Support Macros / Patterns}
+
+\fi
+
+%D \CONTEXT:
+
+\ifx\startmapping\undefined \else \ifx\startencoding\undefined \else
+
+ \def\fetchpatterntoken#1{\csname#1\endcsname}
+
+\fi \fi
+
+%D First we define the \ETEX\ variant. We cannot do that inside
+%D the if statement because normal \TEX\ gets confused over the
+%D csname test (which it does not see as if but it does see the
+%D else's and fi's).
+
+\def\etexfetchpatterntoken#1%
+ {\csname
+ \ifcsname @pattok@#1\endcsname
+ @pattok@#1%
+ \else\ifcsname#1\endcsname
+ #1%
+ \else
+ @pattok@default%
+ \fi\fi
+ \endcsname}
+
+\ifx \fetchpatterntoken \undefined
+
+ \ifx \eTeXversion \undefined
+
+ \def\fetchpatterntoken#1%
+ {\csname
+ \expandafter\ifx\csname @pattok@#1\endcsname\relax
+ \expandafter\ifx\csname#1\endcsname\relax
+ @pattok@default%
+ \else
+ #1%
+ \fi
+ \else
+ @pattok@#1%
+ \fi
+ \endcsname}
+
+ \else
+
+ \let\fetchpatterntoken\etexfetchpatterntoken
+
+ \fi
+
+\fi
+
+\def\definepatterntoken #1 #2 %
+ {\expandafter\def\csname @pattok@#1\endcsname{#2}}
+
+%D \TEX\ based:
+
+\bgroup \catcode`\[=\active
+
+ \gdef\enablepatterntokens
+ {\catcode`\[=\active \let[\handlepatterntoken}
+
+\egroup
+
+\def\handlepatterntoken#1]%
+ {\fetchpatterntoken{#1}}
+
+%D \XML\ based:
+
+\bgroup \catcode`\<=\active \catcode`\&=\active
+
+ \gdef\enablepatternxml
+ {\catcode`\<=\active
+ \catcode`\&=\active
+ \let&\handlepatternentity
+ \let<\handlepatternxml}
+
+\egroup
+
+\def\handlepatternentity#1;%
+ {\fetchpatterntoken{#1}}
+
+%D We use a very simple \XML\ parser, and we only trigger on the first
+%D two characters of the tag name. Consider this feature a playground
+%D (and a bit of a joke).
+
+\def\handlepatternxml#1#2% we only distinguish the first two chars
+ {\csname @patxml@\ifcsname @patxml@#1#2\endcsname#1#2\else de\fi\endcsname}
+
+\def\definepatternxml #1#2#3 #4%
+ {\expandafter\def\csname @patxml@#1#2\endcsname{#4}}
+
+\def\fetchpatternxml#1#2>%
+ {\bgroup
+ \long\def\next##1>{\egroup}%
+ \catcode`\<=2 % \@@endgroup
+ \afterassignment\next
+ #1\bgroup}
+
+\def\gobblepatternxml
+ {\bgroup
+ \catcode`\%=11
+ \dogobblepatternxml}
+
+\long\def\dogobblepatternxml#1>%
+ {\egroup}
+
+%D Here are the default definitions. We don't catch empty elements.
+
+\definepatternxml patterns {\fetchpatternxml\patterns}
+\definepatternxml hyphenations {\fetchpatternxml\hyphenation}
+\definepatternxml pattern {\fetchpatternxml\patterns}
+\definepatternxml hyphenation {\fetchpatternxml\hyphenation}
+\definepatternxml default {\gobblepatternxml}
+
+\definepatterntoken default x
+
+\ifx\pattern \undefined \let\pattern \patterns \fi
+\ifx\hyphenations\undefined \let\hyphenations\hyphenation \fi
+
+%D An example of usage in another format than \CONTEXT:
+%D
+%D \starttyping
+%D \bgroup
+%D
+%D \lccode"E4="E4 \definepatterntoken adiaeresis ^^e4
+%D \lccode"F6="F6 \definepatterntoken odiaeresis ^^f6
+%D \lccode"FC="FC \definepatterntoken ediaeresis ^^fc
+%D \lccode"FF="FF \definepatterntoken ssharp ^^ff
+%D
+%D \enablepatterntokens
+%D \enablepatternxml
+%D
+%D \input lang-de.pat
+%D \input lang-de.hyp
+%D
+%D \egroup
+%D \stoptyping
+%D
+%D This is a minimal example for EC encoding, and of course
+%D a couple of more language related settings need to take
+%D place (like uc mappings).
+
+\endinput
diff --git a/tex/context/base/supp-pdf.mkii b/tex/context/base/supp-pdf.mkii
new file mode 100644
index 000000000..c54b0c6bc
--- /dev/null
+++ b/tex/context/base/supp-pdf.mkii
@@ -0,0 +1,2187 @@
+%D \module
+%D [ file=supp-pdf,
+%D version=2006.09.02, % 2004.12.16,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ to \PDF\ conversion,
+%D author=Hans Hagen \& others (see text),
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\writestatus\undefined
+ \immediate\write16{[Loading MPS to PDF converter (version 2006.09.02).]}
+\else
+ \writestatus{loading}{ConTeXt Support Macros / PDF}
+\fi
+
+%D This module is not optimized because it is used outside
+%D \CONTEXT\ and we cannot forsee what interference will take
+%D place. We no longer load supp-mis. I got too tired of
+%D keeping track of interferences with non \CONTEXT\ usage so
+%D I moved the necessary code in here and use a derived version
+%D in \CONTEXT. When I have the time I will clean up some of the
+%D code that is of no use for non||\CONTEXT\ users.
+
+\ifx\contextversion\undefined
+
+ \chardef\mptopdfstoredatcode\catcode`\@
+
+ \catcode\string`@=11
+
+ \def\unprotect
+ {\let\@@mpstopdf@@unprotect \unprotect
+ \let\@@mpstopdf@@protect \protect
+ \edef\protect
+ {\noexpand \let \noexpand \protect \noexpand \@@mpstopdf@@protect
+ \noexpand \let \noexpand \unprotect \noexpand \@@mpstopdf@@unprotect
+ % context specific
+ \catcode\string`\noexpand @=\the\catcode\string`@
+ \catcode\string`\noexpand !=\the\catcode\string`!
+ \catcode\string`\noexpand ?=\the\catcode\string`?
+ % latex specific
+ \catcode\string`\noexpand /=\the\catcode\string`/
+ \catcode\string`\noexpand -=\the\catcode\string`-
+ \catcode\string`\noexpand :=\the\catcode\string`:
+ \catcode\string`\noexpand ;=\the\catcode\string`;
+ \catcode\string`\noexpand "=\the\catcode\string`"
+ \catcode\string`\noexpand <=\the\catcode\string`<
+ \catcode\string`\noexpand >=\the\catcode\string`>
+ \catcode\string`\noexpand `=\the\catcode\string``}
+ \catcode\string`@=11 \catcode\string`!=11 \catcode\string`?=11
+ \catcode\string`/=12 \catcode\string`-=12
+ \catcode\string`:=12 \catcode\string`;=12
+ \catcode\string`>=12 \catcode\string`<=12
+ \catcode\string`"=12 \catcode\string``=12 }
+
+ \def\defineMPtoPDFfallbacks
+ {% shortcuts
+ \chardef\@@escape 0
+ \chardef\@@begingroup 1
+ \chardef\@@endgroup 2
+ \chardef\@@endofline 5
+ \chardef\@@ignore 9
+ \chardef\@@space 10
+ \chardef\@@letter 11
+ \chardef\@@other 12
+ \chardef\@@active 13
+ \chardef\@@comment 14
+ % placeholders
+ \ifx\withoutpt \undefined \let\withoutpt \@@mptopdf@@withoutpt \fi
+ \ifx\twodigitrounding \undefined \let\twodigitrounding \@@mptopdf@@twodigitrounding \fi
+ \ifx\forgetall \undefined \let\forgetall \@@mptopdf@@forgetall \fi
+ \ifx\uncatcodespecials \undefined \let\uncatcodespecials \@@mptopdf@@uncatcodespecials \fi
+ \ifx\setnaturalcatcodes\undefined \let\setnaturalcatcodes\@@mptopdf@@setnaturalcatcodes \fi
+ \ifx\dospecials \undefined \let\dospecials \@@mptopdf@@dospecials \fi}
+
+ \def\@@mptopdf@@forgetall
+ {\parskip0pt\leftskip0pt\parindent0pt\everypar{}}
+
+ \def\@@mptopdf@@twodigitrounding#1%
+ {#1}%
+
+ \def\@@mptopdf@@uncatcodespecials
+ {\def\do##1{\catcode`##1=\@@other}\dospecials
+ \catcode`\ =\@@space
+ \catcode`\^^L=\@@ignore
+ \catcode`\^^M=\@@endofline
+ \catcode`\^^?=\@@ignore}
+
+ \def\@@mptopdf@@setnaturalcatcodes
+ {\catcode`\!=\@@other \catcode`\?=\@@other \catcode`\@=\@@other
+ \catcode`\#=\@@other \catcode`\&=\@@other \catcode`\|=\@@other
+ \catcode`\$=\@@other \catcode`\^=\@@other \catcode`\_=\@@other
+ \catcode`\*=\@@other \catcode`\/=\@@other
+ \catcode`\-=\@@other \catcode`+=\@@other
+ \catcode`\==\@@other \catcode`\<=\@@other \catcode`\>=\@@other
+ \catcode`\"=\@@other \catcode`\'=\@@other \catcode`\`=\@@other
+ \catcode`\:=\@@other \catcode`\;=\@@other
+ \catcode`\,=\@@other \catcode`\.=\@@other \catcode`\~=\@@other
+ \catcode`\(=\@@other \catcode`\)=\@@other
+ \catcode`\{=\@@other \catcode`\}=\@@other
+ \catcode`\\=\@@other \catcode`\%=\@@other}
+
+ \def\@@mptopdf@@dospecials
+ {\do\ \do\\\do\{\do\}\do\$%
+ \do\#\do\^\do\_\do\&\do\%%
+ \do\~\do\^^A\do\^^K}
+
+ {
+ \catcode`\.=12
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\@@MPTOPDF@@WITHOUTPT#1pt{#1}
+ }
+
+ \def\@@mptopdf@@withoutpt#1%
+ {\expandafter\@@MPTOPDF@@WITHOUTPT#1}
+
+% \def\@@mptopdf@@newabove#1#2% \dimen \name
+% {#1#2%
+% \ifnum\expandafter\gobblesixarguments\meaning#2>20\else
+% \expandafter\@@mptopdf@@newabove\expandafter#1\expandafter#2%
+% \fi}
+
+ \def\@@mptopdf@@stripnewabove#1%
+ {\ifnum10<9#1 #1\else\expandafter\@@mptopdf@@stripnewabove\fi}%
+
+ \def\@@mptopdf@@newabove\csname#1\endcsname#2% \dimen \name
+ {\csname#1\endcsname#2%
+ \ifnum\expandafter\@@mptopdf@@stripnewabove\meaning#2>20\else
+ \@@mptopdf@@newabove\csname#1\endcsname#2%
+ \fi}
+
+ \@@mptopdf@@newabove \csname newcount\endcsname \scratchcounter
+ \@@mptopdf@@newabove \csname newdimen\endcsname \scratchdimen
+ \csname newbox\endcsname \scratchbox
+
+ \expandafter \newif \csname ifdone\endcsname
+
+ \catcode`\@=\mptopdfstoredatcode
+
+\else
+
+ \let\defineMPtoPDFfallbacks\relax
+
+\fi
+
+%D These macros are written as generic as possible. Some
+%D general support macro's are loaded from a small module
+%D especially made for non \CONTEXT\ use. In this module I
+%D use a matrix transformation macro written by Tanmoy
+%D Bhattacharya. Thanks to extensive testing by Sebastian
+%D Ratz I was able to complete this module within reasonable
+%D time. This module has support for \METAPOST\ extensions
+%D built in.
+%D
+%D Daniel H. Luecking came up with a better (more precise)
+%D transformation method. You can recognize his comment by
+%D his initials. (We keep the old code around because it's a
+%D nice illustration on how a module like this evolves.)
+
+%D Beware, we cannot use \type{\zeropoint} here since it may be
+%D defined in the range \type{\dimen0} - 20 which we happen to use
+%D as scratch registers; inside context we may consider
+%D using dedicated registers.
+
+%D This module handles some \PDF\ conversion and insertions
+%D topics. By default, the macros use the \PDFTEX\ primitive
+%D \type{\pdfliteral} when available. Since \PDFTEX\ is now the
+%D default engine for \TEX\ distributions, we need a more complex
+%D test.
+
+\unprotect
+
+\ifx\PDFcode\undefined
+ \ifx\pdfliteral\undefined
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else\ifx\pdfoutput\undefined
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else\ifcase\pdfoutput
+ \def\PDFcode#1{\special{PDF: #1}}
+ \else % pdftex as well as in pdf mode
+ \let\PDFcode\pdfliteral
+ \fi\fi\fi
+\else
+ % we probably use context
+\fi
+
+%D First we define a handy constant:
+
+\bgroup \defineMPtoPDFfallbacks \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+
+%D \macros
+%D {pdfimage,pdfimages,pdfclippedimage}
+%D
+%D Starting with pdftex version 14, images are included more
+%D natural to the form embedding. This enables alternative
+%D images to be embedded.
+%D
+%D \starttyping
+%D \pdfimage <optional dimensions> {file}
+%D \pdfimages <optional dimensions> {high res file} {low res file}
+%D \stoptyping
+%D
+%D The first one replaces the pre||version||14 original,
+%D while the latter provides alternative images.
+%D
+%D The next macro is dedicated to Maarten Gelderman, who
+%D needed to paste prepared \PDF\ pages into conference
+%D proceedings.
+%D
+%D \starttyping
+%D \pdfclippedimage <optional dimensions> {file} {l} {r} {t} {b}
+%D \stoptyping
+
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13
+
+ \def\pdfimage#1#%
+ {\dopdfimage{#1}}
+
+ \def\dopdfimage#1#2%
+ {\immediate\pdfximage#1{#2}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfimages#1#%
+ {\dopdfimages{#1}}
+
+ \def\dopdfimages#1#2#3%
+ {\immediate\pdfximage#1{#2}%
+ \immediate\pdfobj{[ << /Image \the\pdflastximage\space0 R /DefaultForPrinting true >> ]}%
+ \immediate\pdfximage#1 attr {/Alternates \the\pdflastobj\space0 R}{#3}%
+ \pdfrefximage\pdflastximage}
+
+ \def\pdfclippedimage#1#% specs {file}{left}{right}{top}{bottom}
+ {\dopdfclippedimage{#1}}
+
+ \def\dopdfclippedimage#1#2#3#4#5#6%
+ {\bgroup
+ \pdfximage#1{#2}%
+ \setbox\scratchbox\hbox
+ {\pdfrefximage\pdflastximage}%
+ \hsize\wd\scratchbox
+ \advance\hsize -#3
+ \advance\hsize -#4
+ \vsize\ht\scratchbox
+ \advance\vsize -#5
+ \advance\vsize -#6
+ \setbox\scratchbox\vbox to \vsize
+ {\vskip-#5\hbox to \hsize{\hskip-#3\box\scratchbox\hss}}%
+ \pdfxform\scratchbox
+ \pdfrefxform\pdflastxform
+ \egroup}
+
+\fi \fi
+
+%D If you want to save a few hash entries, you may prefer the
+%D less readable alternatives, like:
+%D
+%D \starttyping
+%D \def\pdfimage#1#% This one is less readable but needs no additional
+%D {\bgroup % hash entry for the second stage macro.
+%D \def\pdfimage##1%
+%D {\immediate\pdfximage##1{#2}%
+%D \pdfrefximage\pdflastximage\egroup}}
+%D \stoptyping
+
+%D For old times sake we provide a few aliases. These will be
+%D removed some day.
+
+\ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13
+
+ \let\pdfform =\pdfxform
+ \let\pdflastform=\pdflastxform
+ \let\pdfrefform =\pdfrefxform
+
+\fi \fi
+
+%D The main conversion macro wraps the \PDF\ codes in a box
+%D that is output as an object. The graphics are embedded
+%D in~\type{q} and~\type{Q} and are scaled and positioned using
+%D one transform call (\type{cm}). This saves some additional
+%D scaling.
+
+%D \macros
+%D {convertMPtoPDF}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. Because we want to test as fast as possible, we
+%D first define the \POSTSCRIPT\ operators that \METAPOST\
+%D uses. We don't define irrelevant ones, because these are
+%D skipped anyway.
+
+%D The converter can be made a bit faster by replacing the
+%D two test macros (the ones with the many \type {\if's}) by
+%D a call to named branch macros (something \typ {\getvalue
+%D {xPSmoveto}}. For everyday documents with relatively
+%D small graphics the gain in speed can be neglected.
+
+\def \PScurveto {curveto}
+\def \PSlineto {lineto}
+\def \PSmoveto {moveto}
+\def \PSshowpage {showpage}
+\def \PSnewpath {newpath}
+\def \PSfshow {fshow}
+\def \PSclosepath {closepath}
+\def \PSfill {fill}
+\def \PSstroke {stroke}
+\def \PSclip {clip}
+\def \PSrlineto {rlineto}
+\def \PSsetlinejoin {setlinejoin}
+\def \PSsetlinecap {setlinecap}
+\def \PSsetmiterlimit {setmiterlimit}
+\def \PSsetgray {setgray}
+\def \PSsetrgbcolor {setrgbcolor}
+\def \PSsetcmykcolor {setcmykcolor}
+\def \PSsetdash {setdash}
+\def \PSgsave {gsave}
+\def \PSgrestore {grestore}
+\def \PStranslate {translate}
+\def \PSscale {scale}
+\def \PSconcat {concat}
+\def \PSdtransform {dtransform}
+\def \PSsetlinewidth {setlinewidth}
+\def \PSpop {pop}
+
+\def \PSnfont {nfont} % was needed for TUG98 proceedings
+\def \PSspecial {special} % extensions to MetaPost
+
+%D A previous version set \type {%} to ignore, which
+%D simplified the following definitions. At the start of
+%D conversion the percent character was made active again.
+%D Because the whole graphic is one paragraph (there are no
+%D empty lines) this does not give the desired effect. This
+%D went unnoticed untill Scott Pakin sent me a test file
+%D percent characters in a string. So, from now on we have
+%D to prefix the following strings with percentages.
+
+%D Some day I'll figure out a better solution (line by line reading
+%D using \ETEX).
+
+\edef \PSBoundingBox {\letterpercent\letterpercent BoundingBox:}
+\edef \PSHiResBoundingBox {\letterpercent\letterpercent HiResBoundingBox:}
+\edef \PSExactBoundingBox {\letterpercent\letterpercent ExactBoundingBox:}
+\edef \PSMetaPostSpecial {\letterpercent\letterpercent MetaPostSpecial:}
+\edef \PSMetaPostSpecials {\letterpercent\letterpercent MetaPostSpecials:}
+\edef \PSPage {\letterpercent\letterpercent Page:}
+\edef \PSBeginProlog {\letterpercent\letterpercent BeginProlog}
+\edef \PSEndProlog {\letterpercent\letterpercent EndProlog}
+\edef \PSEof {\letterpercent\letterpercent EOF}
+
+%D By the way, the \type {setcmykcolor} operator is not
+%D output by \METAPOST\ but can result from converting the
+%D \cap{RGB} color specifications, as implemented in
+%D \type{supp-mps}.
+
+%D In \POSTSCRIPT\ arguments precede the operators. Due to the
+%D fact that in some translations we need access to those
+%D arguments, and also because sometimes we have to skip them,
+%D we stack them up. The stack is one||dimensional for non path
+%D operators and two||dimensional for operators inside a path.
+%D This is because we have to save the whole path for
+%D (optional) postprocessing. Values are pushed onto the stack
+%D by:
+%D
+%D \starttyping
+%D \setMPargument {value}
+%D \stoptyping
+%D
+%D They can be retrieved by the short named macros:
+%D
+%D \starttyping
+%D \gMPa {number}
+%D \gMPs {number}
+%D \stoptyping
+%D
+%D When scanning a path specification, we also save the
+%D operator, using
+%D
+%D \starttyping
+%D \setMPkeyword {n}
+%D \stoptyping
+%D
+%D The path drawing operators are coded for speed: \type{clip},
+%D \type{stroke}, \type{fill} and \type{fillstroke} become
+%D 1, 2, 3 and~4.
+%D
+%D When processing the path this code can be retrieved
+%D using
+%D
+%D \starttyping
+%D \getMPkeyword % {n}
+%D \stoptyping
+%D
+%D When setting an argument, the exact position on the stack
+%D depends on the current value of the \COUNTERS\
+%D \type{\nofMPsegments} and \type{\nofMParguments}.
+
+\newcount\nofMPsegments
+\newcount\nofMParguments
+
+%D These variables hold the coordinates. The argument part of
+%D the stack is reset by:
+%D
+%D \starttyping
+%D \resetMPstack
+%D \stoptyping
+%D
+%D We use the prefix \type{@@MP} to keep the stack from
+%D conflicting with existing macros. To speed up things a bit
+%D more, we use the constant \type{\@@MP}.
+
+\def\@@MP{@@MP}
+
+\def\setMPargument% #1%
+ {\advance\nofMParguments 1
+ \expandafter\def
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname} % {#1}
+
+\def\letMPargument
+ {\advance\nofMParguments 1
+ \expandafter\let
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname}
+
+\def\setMPsequence#1 %
+ {\advance\nofMParguments 1
+ \expandafter\def
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname{#1}%
+ \handleMPsequence}
+
+\def\gMPa#1%
+ {\csname\@@MP0\number#1\endcsname}
+
+\def\gMPs#1%
+ {\csname\@@MP\the\nofMPsegments\number#1\endcsname}
+
+\def\dogMPa#1%
+ {\expandafter\expandafter\expandafter\do\csname\@@MP0\number#1\endcsname}
+
+\def\setMPkeyword#1 %
+ {\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}%
+ \advance\nofMPsegments 1
+ \nofMParguments0}
+
+\def\getMPkeyword% #1%
+ {\csname\@@MP\the\nofMPsegments0\endcsname} % {\csname\@@MP#10\endcsname}
+
+\def\docleanupMPargument#1% we need this because args can have [ or ] pre/appended
+ {\expandafter\edef\csname\@@MP\the\nofMPsegments\number#1\endcsname
+ {\csname\@@MP\the\nofMPsegments\number#1\endcsname}}
+
+%D When we reset the stack, we can assume that all further
+%D comment is to be ignored and handled in strings.
+%D By redefining the reset macro after the first call, we
+%D save some run time. Only use this macro after all
+%D comments are processed and use the simple alternative
+%D when dealing with comments.
+
+\def\doresetMPstack
+ {\nofMParguments0\relax}
+
+\def\resetMPstack
+ {\let\handleMPgraphic\handleMPendgraphic
+ \let\resetMPstack\doresetMPstack
+ \resetMPstack}
+
+%D The arguments are saved with the preceding command
+%D \type{\do}. By default this command expands to nothing, but
+%D when we deal with strings it's used to strip off the
+%D \type{(} and \type{)}.
+%D
+%D Strings are kind of tricky, because characters can be
+%D passed verbatim \type{(hello)}, by octal number
+%D \type{(\005)} or as command \type{(\()}. We therefore
+%D cannot simply ignore \type{(} and \type{)}, the way we do
+%D with \type{[} and \type{]}. Another complication is that
+%D strings may contain characters that normally have a
+%D special meaning in \TEX, like \type{$} and \type{{}}.
+%D
+%D A previous solution made \type{\} an active character and
+%D let it look ahead for a number or characters. We had to
+%D abandon this scheme because of the need for verbatim
+%D support. The next solution involved some \CATCODE\
+%D trickery but works well.
+
+\def\octalMPcharacter#1#2#3%
+ {\char'#1#2#3\relax}
+
+%D curly braces and squarly brackets are stored in the argument stack
+%D as part of strings, for instance in:
+%D
+%D \starttyping
+%D /fshow {exch findfont exch scalefont setfont show}bind def
+%D [3 3 ] 0 setdash
+%D \stoptyping
+%D
+%D but we need to keep them in situation like
+%D
+%D \starttyping
+%D ([bla bla] bla bla) ec-lmr10 9.96265 fshow
+%D ({bla bla} bla bla) ec-lmr10 9.96265 fshow
+%D \stoptyping
+%D
+%D So, when we store the snippets, we keep the special tokens, and
+%D when needed we either ignore or obey them
+
+\bgroup
+\defineMPtoPDFfallbacks
+\catcode`\|=\@@comment
+\catcode`\%=\@@active
+\catcode`\[=\@@active
+\catcode`\]=\@@active
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\catcode`B=\@@begingroup
+\catcode`E=\@@endgroup
+\gdef\keepMPspecials|
+ B\let%\letterpercent|
+ \def[B\noexpand[E|
+ \def]B\noexpand]E|
+ \def{B\noexpand{E|
+ \def}B\noexpand}EE
+\gdef\ignoreMPspecials|
+ B\let%\letterpercent|
+ \def[BE|
+ \def]BE|
+ \def{BE|
+ \def}BEE
+\gdef\obeyMPspecials|
+ B\def%B\char 37\relax E|
+ \def[B\char 91\relax E|
+ \def]B\char 93\relax E|
+ \def{B\char123\relax E|
+ \def}B\char125\relax EE
+\gdef\setMPspecials|
+ B\setnaturalcatcodes
+ \catcode`\\=\@@escape
+ \catcode`\%=\@@active
+ \catcode`\[=\@@active
+ \catcode`\]=\@@active
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \lccode`\-=0 | latex sets this to `\-
+ \lccode`\%=`\% | otherwise it's seen as a number
+ \def\(B\char40\relax E|
+ \def\)B\char41\relax E|
+ \def\\B\char92\relax E|
+ \def\0B\octalMPcharacter0E|
+ \def\1B\octalMPcharacter1E|
+ \def\2B\octalMPcharacter2E|
+ \def\3B\octalMPcharacter3E|
+ \def\4B\octalMPcharacter4E|
+ \def\5B\octalMPcharacter5E|
+ \def\6B\octalMPcharacter6E|
+ \def\7B\octalMPcharacter7E|
+ \def\8B\octalMPcharacter8E|
+ \def\9B\octalMPcharacter9EE
+\egroup
+
+%D We use the comment symbol as a sort of trigger. Beware!
+%D The whole graphic is seen as on eparagraph, which means
+%D that we cannot change the catcodes in between.
+
+\bgroup
+\defineMPtoPDFfallbacks
+\catcode`\%=\@@active
+\gdef\startMPscanning{\let%=\startMPconversion}
+\egroup
+
+%D In earlier versions we used the sequence
+%D
+%D \starttyping
+%D \expandafter\handleMPsequence\input filename\relax
+%D \stoptyping
+%D
+%D Persistent problems in \LATEX\ however forced us to use a
+%D different scheme. Every \POSTSCRIPT\ file starts with a
+%D \type{%}, so we temporary make this an active character
+%D that starts the scanning and redefines itself. (The problem
+%D originates in the redefinition by \LATEX\ of the
+%D \type{\input} primitive.)
+
+\def\startMPconversion
+ {\keepMPspecials
+ \handleMPsequence}
+
+%D Here comes the main loop. Most arguments are numbers. This
+%D means that they can be recognized by their \type{\lccode}.
+%D This method saves a lot of processing time. We could
+%D speed up the conversion by handling the \type{path}
+%D seperately.
+
+\def\dohandleMPsequence#1%
+ {\ifdone
+ \ifcase\lccode`#1\relax
+ \expandafter\expandafter\expandafter\dohandleMPsequenceA
+ \else
+ \expandafter\expandafter\expandafter\dohandleMPsequenceB
+ \fi
+ \else
+ \expandafter\dohandleMPsequenceC
+ \fi#1}
+
+\let\dohandleMPsequenceA\setMPsequence
+
+\def\installMPSkeywordN#1#2%
+ {\expandafter\def\csname\@@MP:N:#1\endcsname{#2}}
+
+\def\installMPSshortcutN#1#2% todo: \let
+ {\expandafter\let\csname\@@MP:N:#1\expandafter\endcsname\csname\@@MP:N:#2\endcsname}
+
+\def\dohandleMPsequenceB#1 %
+ {\edef\somestring{#1}%
+ \ifcsname\@@MP:N:\somestring\endcsname
+ \csname\@@MP:N:\somestring\expandafter\endcsname
+ \else
+ \expandafter\handleMPgraphic
+ \fi
+ \handleMPsequence}
+
+\ifx\eTeXversion\undefined
+ \def\dohandleMPsequenceB#1 %
+ {\edef\somestring{#1}%
+ \expandafter\ifx\csname\@@MP:N:\somestring\endcsname\relax
+ \expandafter\handleMPgraphic
+ \else
+ \csname\@@MP:N:\somestring\expandafter\endcsname
+ \fi
+ \handleMPsequence}
+\fi
+
+\installMPSkeywordN \PSmoveto
+ {\edef\lastMPmoveX{\gMPa1}%
+ \edef\lastMPmoveY{\gMPa2}%
+ \resetMPstack}
+\installMPSkeywordN \PSnewpath
+ {\let\handleMPsequence\handleMPpath}
+\installMPSkeywordN \PSgsave
+ {\PDFcode{q}%
+ \resetMPstack}
+\installMPSkeywordN \PSgrestore
+ {\PDFcode{Q}%
+ \resetMPstack}
+\installMPSkeywordN \PSdtransform % == setlinewidth
+ {\let\handleMPsequence\handleMPdtransform}
+ % after that we will encounter more tokens until setlinewidth+pop
+ % or pop+setlinewidth which we catch next; we explicitly need to
+ % reset the stack since [] n setdash may follow; a more clever
+ % approach would be to read on till the condition is met, but it's
+ % the only pop / setlinewidth we will encounter so ...
+\installMPSkeywordN \PSsetlinewidth
+ {% already handled in dtransform
+ \resetMPstack}
+\installMPSkeywordN \PSpop
+ {% already handled in dtransform
+ \resetMPstack}
+\installMPSkeywordN \PSconcat
+ {\cleanupMPconcat
+ \PDFcode{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetrgbcolor
+ {\handleMPrgbcolor
+ \resetMPstack}
+\installMPSkeywordN \PSsetcmykcolor
+ {\handleMPcmykcolor
+ \resetMPstack}
+\installMPSkeywordN \PSsetgray
+ {\handleMPgraycolor
+ \resetMPstack}
+\installMPSkeywordN \PStranslate
+ {\PDFcode{1 0 0 1 \gMPa1 \gMPa2 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetdash
+ {\handleMPsetdash
+ \resetMPstack}
+\installMPSkeywordN \PSsetlinejoin
+ {\PDFcode{\gMPa1 j}%
+ \resetMPstack}
+\installMPSkeywordN \PSsetmiterlimit
+ {\PDFcode{\gMPa1 M}%
+ \resetMPstack}
+\installMPSkeywordN \PSfshow
+ {%\PDFcode{n}% removed !
+ \handleMPfshow
+ \resetMPstack}
+\installMPSkeywordN \PSsetlinecap
+ {\PDFcode{\gMPa1 J}%
+ \resetMPstack}
+\installMPSkeywordN \PSrlineto
+ {\flushMPmoveto
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \resetMPmoveto
+ \resetMPstack}
+\installMPSkeywordN \PSscale
+ {\PDFcode{\gMPa1 0 0 \gMPa2 0 0 cm}%
+ \resetMPstack}
+\installMPSkeywordN \PSspecial
+ {\handleMPspecialcommand
+ \resetMPstack}
+
+\installMPSshortcutN {n} \PSnewpath
+\installMPSshortcutN {p} \PSclosepath
+\installMPSshortcutN {l} \PSlineto
+\installMPSshortcutN {r} \PSrlineto
+\installMPSshortcutN {m} \PSmoveto
+\installMPSshortcutN {c} \PScurveto
+\installMPSshortcutN {C} \PSsetcmykcolor
+\installMPSshortcutN {G} \PSsetgray
+\installMPSshortcutN {R} \PSsetrgbcolor
+\installMPSshortcutN {lj} \PSsetlinejoin
+\installMPSshortcutN {ml} \PSsetmiterlimit
+\installMPSshortcutN {lc} \PSsetlinecap
+\installMPSshortcutN {sd} \PSsetdash
+\installMPSshortcutN {S} \PSstroke
+\installMPSshortcutN {F} \PSfill
+\installMPSshortcutN {W} \PSclip
+
+\installMPSshortcutN {q} \PSgsave
+\installMPSshortcutN {Q} \PSgrestore
+
+\installMPSshortcutN {s} \PSscale
+\installMPSshortcutN {t} \PSconcat
+\installMPSshortcutN {P} \PSshowpage
+
+\installMPSkeywordN {hlw} {\PDFcode{\gMPa1 w}\resetMPstack}
+\installMPSkeywordN {vlw} {\PDFcode{\gMPa1 w}\resetMPstack}
+\installMPSkeywordN {rd} {\PDFcode{[] 0 d}\resetMPstack}
+
+\def\dohandleMPsequenceC#1 %
+ {\edef\somestring{#1}%
+ \handleMPgraphic % {#1}%
+ \handleMPsequence}
+
+%D Since colors are not sensitive to transformations, they
+%D are sometimes used for signaling. Therefore, we handle them
+%D separately. The next macro can be redefined if needed.
+
+\def\handleMPrgbcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 rg
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 RG}}
+
+\def\handleMPcmykcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 k
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 K}}
+
+\def\handleMPgraycolor
+ {\PDFcode{\!MPgMPa1 g
+ \!MPgMPa1 G}}
+
+\def\handleMPspotcolor
+ {\PDFcode{0 g
+ 0 G}}
+
+%D Beginning and ending the graphics is taken care of by the
+%D macro \type{\handleMPgraphic}, which is redefined when
+%D the first graphics operator is met.
+
+\def\handleMPendgraphic % #1%
+ {\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSEof
+ \let\handleMPsequence\finishMPgraphic
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi\fi}
+
+\def\handleMPbegingraphic % #1%
+ {\ifx\somestring\PSBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox1}%
+ \else\ifx\somestring\PSHiResBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox2}%
+ \else\ifx\somestring\PSExactBoundingBox
+ \def\handleMPsequence{\handleMPboundingbox3}%
+ \else\ifx\somestring\PSshowpage
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSEof
+ \let\handleMPsequence\finishMPgraphic
+ \else\ifx\somestring\PSPage
+ \let\handleMPsequence\handleMPpage
+ \else\ifx\somestring\PSMetaPostSpecials
+ \let\handleMPsequence\handleMPspecialscomment
+ \else\ifx\somestring\PSMetaPostSpecial
+ \let\handleMPsequence\handleMPspecialcomment
+ \else\ifx\somestring\PSBeginProlog
+ \let\handleMPsequence\handleMPprolog
+ \else
+ \letMPargument\somestring % {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\let\handleMPgraphic=\handleMPbegingraphic
+
+%D New: we can best filter the prolog because nowdays it can contain
+%D quite some code.
+
+% hm, catcode mess, so we need to tweak %'s catcode here
+% \long\expandafter\def\expandafter\handleMPprolog\expandafter#\expandafter1\PSEndProlog%
+% but today i'm not in the mood for ugly stuff
+
+\long\def\handleMPprolog#1EndProlog %
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D We check for three kind of bounding boxes: the normal one
+%D and two high precision ones:
+%D
+%D \starttyping
+%D BoundingBox: llx lly ucx ucy
+%D HiResBoundingBox: llx lly ucx ucy
+%D ExactBoundingBox: llx lly ucx ucy
+%D \stoptyping
+%D
+%D The original as well as the recalculated dimensions are
+%D saved for later use.
+
+\newif\ifskipemptyMPgraphic \skipemptyMPgraphicfalse
+
+\chardef\currentMPboundingbox=0
+
+\def\handleMPboundingbox#1#2 #3 #4 #5
+ {\ifnum#1>\currentMPboundingbox
+ \xdef\MPllx{#2}\xdef\MPlly{#3}%
+ \xdef\MPurx{#4}\xdef\MPury{#5}%
+ \dimen0=#2pt
+ \dimen0=-\MPxscale\dimen0
+ \dimen2=#3pt
+ \dimen2=-\MPyscale\dimen2
+ \xdef\MPxoffset{\withoutpt\the\dimen0}%
+ \xdef\MPyoffset{\withoutpt\the\dimen2}%
+ \dimen0=#2bp
+ \dimen0=-\dimen0
+ \dimen2=#3bp
+ \dimen2=-\dimen2
+ \advance\dimen0 #4bp
+ \dimen0=\MPxscale\dimen0
+ \xdef\MPwidth{\the\dimen0}%
+ \advance\dimen2 #5bp
+ \xdef\MPyshift{\the\dimen2}% unscaled
+ \dimen2=\MPyscale\dimen2
+ \xdef\MPheight{\the\dimen2}%
+ \chardef\currentMPboundingbox#1\relax
+ \fi
+ \doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \let\next\handleMPsequence
+ \ifskipemptyMPgraphic
+ \ifdim\MPheight=0pt\relax\ifdim\MPwidth=0pt\relax
+ \def\next{\endinput\finishMPgraphic}%
+ \fi\fi
+ \fi
+ \next}
+
+%D Unless defined otherwise, we simply ignore specialcomments.
+
+\def\handleMPspecialcomment
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+\let\handleMPspecialscomment\handleMPspecialcomment
+
+%D We use the \type{page} comment as a signal that
+%D stackbuilding can be started.
+
+\def\handleMPpage #1 #2
+ {\doresetMPstack
+ \donetrue
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D The same applies to the special extensions.
+
+\def\handleMPspecialcommand
+ {\doresetMPstack
+ \let\handleMPsequence\dohandleMPsequence
+ \handleMPsequence}
+
+%D \METAPOST\ draws its dots by moving to a location and
+%D invoking \type{0 0 rlineto}. This operator is not
+%D available in \PDF. Our solution is straightforward: we draw
+%D a line from $(current\_x, current\_y)$ to itself. This
+%D means that the arguments of the preceding \type{moveto} have
+%D to be saved.
+
+\def\lastMPmoveX{0}
+\def\lastMPmoveY{0}
+
+%D These saved coordinates are also used when we handle the
+%D texts. Text handling proved to be a bit of a nuisance, but
+%D finally I saw the light. It proved that we also had to
+%D take care of \type{(split arguments)}.
+
+% \def\setMPfshowfont#1#2%
+% {\font\temp=#1\space at #2\relax\temp}
+
+% \startMPcode
+% draw btex Ga toch effe f\kern0ptietsen?{}` etex ;
+% \stopMPcode
+
+\newtoks \everyMPshowfont
+
+\def\setMPfshowfont#1#2%
+ {\font\temp=#1\space at #2\relax\temp
+ \the\everyMPshowfont}
+
+\let\MPfshowcommand\empty
+
+%D The next hackery handles characters one by one. We only support this
+%D for the latest greatest \METAPOST\ binaries, the ones that escape
+%D problematic chars.
+
+\def\doflushMPtext#1%
+ {\edef\!!stringa{#1}%
+ \expandafter\dodoflushMPtext\!!stringa\relax}
+
+\def\dodoflushMPtext
+ {\afterassignment\dododoflushMPtext\let\nexttoken=}
+
+\def\dododoflushMPtext
+ {\ifx\nexttoken\relax
+ % done
+ \else\ifx\nexttoken\char
+ \expandafter\expandafter\expandafter\dodododoflushMPtext
+ \else
+ {\nexttoken}%
+ \expandafter\expandafter\expandafter\dodoflushMPtext
+ \fi\fi}
+
+\def\dodododoflushMPtext
+ {\afterassignment\dododododoflushMPtext\scratchcounter}
+
+\def\dododododoflushMPtext
+ {{\char\scratchcounter}\let\next\dodoflushMPtext}
+
+\def\dohandleMPfshow
+ {\bgroup
+ \setbox\scratchbox\hbox
+ {\obeyMPspecials
+ \let\ \relax % mp breaks long lines and appends a \
+ \edef\size{\gMPa\nofMParguments}%
+ \ifx\size\PSnfont % round font size (to pt)
+ \advance\nofMParguments -1
+ \expandafter\scratchdimen\gMPa\nofMParguments pt\relax
+ \ifdim\scratchdimen<1pt
+ \def\size{1pt}%
+ \else
+ \advance\scratchdimen .5pt
+ \def\size##1.##2\relax{\def\size{##1pt}}%
+ \expandafter\size\the\scratchdimen\relax
+ \fi
+ \else
+ \edef\size{\size bp}%
+ \fi
+ \advance\nofMParguments -1
+ %\font\temp=\gMPa\nofMParguments\space at \size
+ \let\temp\relax % to be sure
+ \setMPfshowfont{\gMPa\nofMParguments}\size
+ \advance\nofMParguments -1
+ \temp
+ \MPfshowcommand
+ {\ifnum\nofMParguments=1
+ \def\do(##1){##1}%
+ \doflushMPtext{\dogMPa1}% only latest mp gets this treatment
+ \else
+ % we need to catch ( a ) (a a a) (\123 \123 \123) etc
+ \scratchcounter1
+ \def\dodo##1% Andreas Fieger's bug: (\304...)
+ {\edef\!!stringa{##1\empty\empty}% and another one: ( 11) -> \ifx 11
+ \ifx\!!stringa\MPspacechar\MPspacechar\else\expandafter##1\fi}%
+ \def\do(##1{\dodo{##1}}%
+ \dogMPa\scratchcounter\MPspacechar
+ \let\do\relax
+ \loop
+ \advance\scratchcounter 1
+ \ifnum\scratchcounter<\nofMParguments\relax
+ \gMPa\scratchcounter\MPspacechar
+ \repeat
+ \def\do##1){\dodo{##1}}%
+ \dogMPa\scratchcounter
+ \fi
+ \unskip}}%
+ \setbox\scratchbox\hbox
+ {\hskip\lastMPmoveX bp\raise\lastMPmoveY bp\box\scratchbox}%
+ \ht\scratchbox0pt%
+ \dp\scratchbox0pt%
+ \wd\scratchbox0pt%
+ \box\scratchbox
+ \egroup}
+
+\let\handleMPfshow\dohandleMPfshow % so we can overload this one later
+
+%D You could consider the following definition to be the most
+%D natural one.
+
+% \def\MPspacechar{\space} % normal case
+
+\def\MPspacechar{\char32\relax} % old solution does not work with math
+
+%D However, the following implementation is more robust, since
+%D some fonts have funny visible spaces in the space slot. This
+%D gives a mismatch between the space that \METAPOST\ took into
+%D account and the \quote {natural} space. This only happens in
+%D labels, since \type {btex}||\type {etex} thingies don't have
+%D spaces. This phenomena showed up when preparing the
+%D \METAFUN\ manual, where Palatino fonts are used. We can
+%D safely assume that \METAPOST\ considers \type {\char32} to
+%D be the space.
+
+\def\MPspacechar{\setbox\scratchbox\hbox{\char32}\kern\wd\scratchbox}
+
+%D Well, this does not work with math fonts, so:
+
+\def\MPspacechar{\char32\relax}
+
+%D Most operators are just converted and keep their
+%D arguments. Dashes however need a bit different treatment,
+%D otherwise \PDF\ viewers complain loudly. Another
+%D complication is that one argument comes after the \type{]}.
+%D When reading the data, we simply ignore the array boundary
+%D characters. We save ourselves some redundant newlines and
+%D at the same time keep the output readable by packing the
+%D literals.
+
+\def\handleMPsetdash
+ {\bgroup
+ \ignoreMPspecials
+ \def\somestring{[}%
+ \scratchcounter1
+ \loop
+ \ifnum\scratchcounter<\nofMParguments
+ \edef\somestring{\somestring\space\gMPa\scratchcounter}%
+ \advance\scratchcounter 1
+ \repeat
+ \edef\somestring{\somestring]\gMPa\scratchcounter\space d}%
+ \PDFcode{\somestring}%
+ \egroup}
+
+%D The \type{setlinewidth} commands looks a bit complicated. There are
+%D two alternatives, that result in a similar look in both
+%D $x$- and $y$-dorection. As John Hobby says:
+%D
+%D \startnarrower \switchtobodyfont[ss]
+%D \starttyping
+%D x 0 dtransform exch truncate exch idtransform pop setlinewidth
+%D 0 y dtransform truncate idtransform setlinewidth pop
+%D \stoptyping
+%D
+%D These are just fancy versions of \type{x setlinewidth} and
+%D \type{y setlinewidth}. The \type{x 0 ...} form is used if
+%D the path is {\em primarily vertical}. It rounds the width
+%D so that vertical lines come out an integer number of pixels
+%D wide in device space. The \type{0 y ...} form does the same
+%D for paths that are {\em primarily horizontal}. The reason
+%D why I did this is Knuth insists on getting exactly the
+%D widths \TEX\ intends for the horizontal and vertical rules
+%D in \type{btex...etex} output. (Note that PostScript scan
+%D conversion rules cause a horizontal or vertical line of
+%D integer width $n$ in device space to come out $n+1$ pixels
+%D wide, regardless of the phase relative to the pixel grid.)
+%D \stopnarrower
+%D
+%D The common operator in these sequences is \type{dtransform},
+%D so we can use this one to trigger setting the linewidth.
+
+\def\handleMPdtransform
+ {\ifdim\gMPa1 pt>0pt
+ \PDFcode{\gMPa1 w}%
+ \def\next##1 ##2 ##3 ##4 ##5 ##6 {\handleMPsequence}%
+ \else
+ \PDFcode{\gMPa2 w}%
+ \def\next##1 ##2 ##3 ##4 {\handleMPsequence}%
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \next}
+
+%D The most complicated command is \type{concat}. \METAPOST\
+%D applies this operator to \type{stroke}. At that moment the
+%D points set by \type{curveto} and \type{moveto}, are already
+%D fixed. In \PDF\ however the \type{cm} operator affects the
+%D points as well as the pen (stroke). Like more \PDF\
+%D operators, \type{cm} is defined in a bit ambiguous way.
+%D The only save route for non||circular penshapes, is saving
+%D the path, recalculating the points and applying the
+%D transformation matrix in such a way that we can be sure
+%D that its behavior is well defined. This comes down to
+%D inverting the path and applying \type{cm} to that path as
+%D well as the pen. This all means that we have to save the
+%D path.
+
+%D In \METAPOST\ there are three ways to handle a path $p$:
+%D
+%D \starttyping
+%D draw p; fill p; filldraw p;
+%D \stoptyping
+%D
+%D The last case outputs a \type{gsave fill grestore} before
+%D \type{stroke}. Handling the path outside the main loops
+%D saves about 40\% run time.\footnote{We can save some more by
+%D following the \METAPOST\ output routine, but for the moment
+%D we keep things simple.} Switching between the main loop and
+%D the path loop is done by means of the recursely called
+%D macro \type{\handleMPsequence}.
+
+\def\handleMPpath
+ {\chardef\finiMPpath0
+ \let\closeMPpath\relax
+ \let\flushMPpath\flushnormalMPpath
+ \resetMPstack
+ \nofMPsegments1
+ \let\handleMPsequence\dohandleMPpath
+ \dohandleMPpath}
+
+%D Most paths are drawn with simple round pens. Therefore we've
+%D split up the routine in two.
+
+\def\flushnormalMPsegment
+ {\ifcase\getMPkeyword\relax
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 l}%
+ \or
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 \!MPgMPs3 \!MPgMPs4 \!MPgMPs5 \!MPgMPs6 c}%
+ \or
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l}%
+ \or
+ \edef\lastMPmoveX{\gMPs1}% evt \!MP here
+ \edef\lastMPmoveY{\gMPs2}%
+ \PDFcode{\!MP\lastMPmoveX\space \!MP\lastMPmoveY\space m}%
+ \fi}
+
+\def\flushconcatMPsegment
+ {\ifcase\getMPkeyword\relax
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \PDFcode{\!MP\a\space\!MP\b\space l}%
+ \or
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b%
+ \doMPconcat{\gMPs3}\c{\gMPs4}\d%
+ \doMPconcat{\gMPs5}\e{\gMPs6}\f%
+ \PDFcode{\!MP\a\space\!MP\b\space
+ \!MP\c\space\!MP\d\space
+ \!MP\e\space\!MP\f\space c}%
+ \or
+ \bgroup
+ \noMPtranslate
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
+ \PDFcode{\!MP\a\space\!MP\b\space l S}%
+ \egroup
+ \or
+ \edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
+ \PDFcode{\!MP\a\space\!MP\b\space m}%
+ \fi}
+
+% \def\flushnormalMPpath
+% {\scratchcounter\nofMPsegments
+% \nofMPsegments 1
+% \loop
+% \flushnormalMPsegment
+% \advance\nofMPsegments 1
+% \ifnum\nofMPsegments<\scratchcounter
+% \repeat}
+%
+% \def\flushconcatMPpath
+% {\scratchcounter\nofMPsegments
+% \nofMPsegments 1
+% \loop
+% \flushconcatMPsegment
+% \advance\nofMPsegments 1
+% \ifnum\nofMPsegments<\scratchcounter
+% \repeat}
+%
+% an alternative is presented below: (no \def assignment)
+
+\def\doflushsomeMPpath
+ {\dodoflushsomeMPpath
+ \advance\nofMPsegments 1
+ \ifnum\nofMPsegments<\scratchcounter
+ \expandafter\doflushsomeMPpath
+ \fi}
+
+\def\flushsomeMPpath
+ {\scratchcounter\nofMPsegments
+ \nofMPsegments 1
+ \doflushsomeMPpath}
+
+\def\flushnormalMPpath{\let\dodoflushsomeMPpath\flushnormalMPsegment\flushsomeMPpath}
+
+%OLD \def\flushconcatMPpath{\let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%NEW pre-calculate 1/D so it needn't be repeated for each control point.
+
+\def\flushconcatMPpath
+ {\MPreciprocaldeterminant
+ \let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath}
+
+%D The transformation of the coordinates is handled by one of
+%D the macros Tanmoy posted to the \PDFTEX\ mailing list.
+%D I rewrote and optimized the original macro to suit the other
+%D macros in this module.
+%D
+%D \starttyping
+%D \doMPconcat {x position} \xresult {y position} \yresult
+%D \stoptyping
+%D
+%D By setting the auxiliary \DIMENSIONS\ \type{\dimen0} upto
+%D \type{\dimen10} only once per path, we save over 20\% run
+%D time. Some more speed was gained by removing some parameter
+%D passing. These macros can be optimized a bit more by using
+%D more constants. There is however not much need for further
+%D optimization because penshapes usually are round and
+%D therefore need no transformation. Nevertheless we move the
+%D factor to the outer level and use a bit different \type{pt}
+%D removal macro. Although the values represent base points,
+%D we converted them to pure points, simply because those can
+%D be converted back.
+
+%OLD \mathchardef\MPconcatfactor=256 % beware don't remove spaces before it
+
+%OLD \def\doMPreducedimen#1
+%OLD {\count0\MPconcatfactor
+%OLD \advance\dimen#1 \ifdim\dimen#1>0pt .5\else -.5\fi\count0
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD % too inaccurate (see old pragma logo)
+%OLD
+%OLD \def\doMPreducedimen#1
+%OLD {\count0=\MPconcatfactor
+%OLD \divide\dimen#1 \count0\relax}
+
+%OLD \def\doMPreducedimen#1
+%OLD {\advance\dimen#1 \ifdim\dimen#1>0pt .5\else -.5\fi\MPconcatfactor
+%OLD \divide\dimen#1 \MPconcatfactor}
+
+%D The transformation code is rewritten by Daniel H. Luecking who
+%D describes his patch as follows:
+%D
+%D We would like to divide 1 by $X$, but all divisions are integer so
+%D for accuracy we want to convert to large integers and make sure the
+%D integer quotient has as many significant digits as possible. Thus we
+%D need to replace $1/X$ with $M/N$ where $N$ is as large as possible
+%D and $M/N$ is as large as possible. Also for simplicity $M$ should be
+%D a power of 2. So we make $M = 2^{30}$ \footnote{$2^{31} - 1$ is the
+%D largest legal integer. Using it (and simply ignoring the inaccuracy
+%D caused by $-1$) turns out to be at least as accurate in all cases,
+%D and more accurate in some.} (largest legal power of 2) and adjust
+%D $X$ downward (if necessary) to the the range $1-2^{16}$. This gives
+%D at least 15 significant binary digits, (almost as accurate as
+%D \METAPOST\ for numbers near 1) or almost 5 significant figures
+%D (decimal).
+
+\newcount\MPscratchCnt
+\newdimen\MPscratchDim % will be assigned global
+
+\def\MPadjustdimen % sets \MPscratchDim and \MPscratchCnt
+ {\MPscratchCnt0
+ \doMPadjustdimen}
+
+\def\doMPadjustdimen
+ {\ifdim\MPscratchDim>1pt
+ \divide\MPscratchDim 2
+ \advance\MPscratchCnt 1
+ \expandafter\doMPadjustdimen
+ \fi}
+
+%OLD \def\doMPexpanddimen#1
+%OLD {\multiply\dimen#1 \MPconcatfactor\relax}
+
+%D DHL: When viewed as an integer, $1 \hbox{pt}=2^{16}$ so $2^{32}/X$
+%D is the right way to do $(1 \hbox{pt})/(X \hbox{pt})$ and get the
+%D answer in points. But we are limited to $2^{30}/X$. However, we
+%D actually do $[ 2^{30} / (X/2^K) ]*2^{2-K}$ where $K$ is the number
+%D of halvings it takes to bring $X$ below $1 \hbox{pt}$. If $K$ is 0
+%D or 1 we readjust by multiplying by 4 or 2, otherwise by halving
+%D $(K-2)$ times \type {\MPscratchCnt} holds the value of $K$ from
+%D \type {\MPadjustdimen}.
+
+\def\MPreadjustdimen % acts on \MPscratchDim and MPscratchCnt
+ {\ifcase\MPscratchCnt
+ \multiply\scratchdimen 4
+ \or
+ \multiply\scratchdimen 2
+ \else
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\doMPreadjustdimen
+ {\ifnum\MPscratchCnt>2
+ \divide\scratchdimen 2
+ \advance\MPscratchCnt -1
+ \expandafter\doMPreadjustdimen
+ \fi}
+
+\def\MPreciprocaldeterminant
+ {\scratchdimen\withoutpt\the\dimen0 \dimen6 % s_x*s_y
+ \advance\scratchdimen - \withoutpt\the\dimen2 \dimen4 % s_x*s_y - r_x*r_y
+ \ifdim\scratchdimen<0pt % we need a positive dimension
+ \scratchdimen-\scratchdimen % for \MPadjustdimen (?)
+ \doMPreciprocal
+ \scratchdimen-\scratchdimen
+ \else
+ \doMPreciprocal
+ \fi
+ \edef\MPreciprocal{\withoutpt\the\scratchdimen}}
+
+\newcount\MPnumerator \MPnumerator = 1073741824 % 2^{30}
+
+% todo: dimexpr
+
+\def\doMPreciprocal % replace \scratchdimen with its reciprocal
+ {\ifdim\scratchdimen=1pt \else
+ \MPadjustdimen
+ \scratchcounter\MPnumerator
+ \divide\scratchcounter\scratchdimen
+ \scratchdimen1\scratchcounter % 1 needed !
+ \MPreadjustdimen
+ \fi}
+
+%OLD \def\presetMPconcat
+%OLD {\dimen 0=\gMPs1pt \doMPreducedimen 0 % r_x
+%OLD \dimen 2=\gMPs2pt \doMPreducedimen 2 % s_x
+%OLD \dimen 4=\gMPs3pt \doMPreducedimen 4 % s_y
+%OLD \dimen 6=\gMPs4pt \doMPreducedimen 6 % r_y
+%OLD \dimen 8=\gMPs5pt \doMPreducedimen 8 % t_x
+%OLD \dimen10=\gMPs6pt \doMPreducedimen10 } % t_y
+%OLD
+%OLD \def\presetMPscale
+%OLD {\dimen 0=\gMPs1pt \doMPreducedimen 0
+%OLD \dimen 2=0pt
+%OLD \dimen 4=0pt
+%OLD \dimen 6=\gMPs2pt \doMPreducedimen 6
+%OLD \dimen 8=0pt
+%OLD \dimen10=0pt}
+
+\def\cleanupMPconcat
+ {\ignoreMPspecials
+ \docleanupMPargument1%
+ \docleanupMPargument6%
+ \keepMPspecials}
+
+\def\presetMPconcat
+ {\dimen 0=\gMPs1pt % s_x
+ \dimen 2=\gMPs2pt % r_x
+ \dimen 4=\gMPs3pt % r_y
+ \dimen 6=\gMPs4pt % s_y
+ \dimen 8=\gMPs5pt % t_x
+ \dimen10=\gMPs6pt} % t_y
+
+\def\presetMPscale
+ {\dimen 0=\gMPs1pt
+ \dimen 2=0pt
+ \dimen 4=0pt
+ \dimen 6=\gMPs2pt
+ \dimen 8=0pt
+ \dimen10=0pt}
+
+\def\noMPtranslate % use this one grouped
+ {\dimen 8=0pt % t_x
+ \dimen10=0pt} % t_y
+
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+
+%D The following optimization resulted from some tests by
+%D and email exchanges with Sanjoy Mahajan.
+%D
+%D \starttyping
+%D \def\doMPconcat#1#2#3#4%
+%D {\dimen12=#1 pt \doMPreducedimen12 % p_x
+%D \dimen14=#3 pt \doMPreducedimen14 % p_y
+%D %
+%D \dimen16 \dimen 0
+%D \multiply \dimen16 \dimen 6
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen16 -\dimen20
+%D %
+%D \dimen18 \dimen12
+%D \multiply \dimen18 \dimen 6
+%D \dimen20 \dimen14
+%D \multiply \dimen20 \dimen 4
+%D \advance \dimen18 -\dimen20
+%D \dimen20 \dimen 4
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen18 \dimen20
+%D \dimen20 \dimen 6
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen18 -\dimen20
+%D %
+%D \multiply \dimen12 -\dimen 2
+%D \multiply \dimen14 \dimen 0
+%D \advance \dimen12 \dimen14
+%D \dimen20 \dimen 2
+%D \multiply \dimen20 \dimen 8
+%D \advance \dimen12 \dimen20
+%D \dimen20 \dimen 0
+%D \multiply \dimen20 \dimen10
+%D \advance \dimen12 -\dimen20
+%D %
+%D %\ifdim\dimen16>1pt % oeps, can be < 1pt too
+%D \ifdim\dimen16=1pt \else
+%D \ifdim\dimen16>\MPconcatfactor pt
+%D \doMPreducedimen16
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12
+%D \else
+%D \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+%D \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+%D \fi
+%D \fi
+%D %
+%D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+%D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime
+%D \stoptyping
+%D
+%D But, this one is still too inaccurate, so we now have:
+
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12=#1pt % p_x
+% \dimen14=#3pt % p_y
+% %
+% % we should test for >-1024 too, but for the moment take the gamble
+% \chardef\MPfactor1\ifdim\dimen12<1024pt \ifdim\dimen14<1024pt 6\fi\fi
+% %
+% \multiply\dimen12 \MPfactor
+% \multiply\dimen14 \MPfactor
+% %
+% \doMPreducedimen12
+% \doMPreducedimen14
+% %
+% \dimen16 \dimen 0
+% \multiply \dimen16 \dimen 6
+% \dimen20 \dimen 2
+% \multiply \dimen20 \dimen 4
+% \advance \dimen16 -\dimen20
+% %
+% \dimen18 \dimen12
+% \multiply \dimen18 \dimen 6
+% \dimen20 \dimen14
+% \multiply \dimen20 \dimen 4
+% \advance \dimen18 -\dimen20
+% \dimen20 \dimen 4
+% \multiply \dimen20 \dimen10
+% \advance \dimen18 \dimen20
+% \dimen20 \dimen 6
+% \multiply \dimen20 \dimen 8
+% \advance \dimen18 -\dimen20
+% %
+% \multiply \dimen12 -\dimen 2
+% \multiply \dimen14 \dimen 0
+% \advance \dimen12 \dimen14
+% \dimen20 \dimen 2
+% \multiply \dimen20 \dimen 8
+% \advance \dimen12 \dimen20
+% \dimen20 \dimen 0
+% \multiply \dimen20 \dimen10
+% \advance \dimen12 -\dimen20
+% %
+% \ifdim\dimen16=1pt \else
+% \ifdim\dimen16>\MPconcatfactor pt
+% \doMPreducedimen16
+% \divide \dimen18 \dimen16 \doMPexpanddimen18
+% \divide \dimen12 \dimen16 \doMPexpanddimen12
+% \else
+% \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18
+% \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12
+% \fi
+% \fi
+% %
+% \divide\dimen18 \MPfactor
+% \divide\dimen12 \MPfactor
+% %
+% \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+% \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
+%D arithmetic instead of using real factors because it's faster.
+%D However, the actual macros test slower, possibly because I've
+%D omitted three nested loops. In my test files, my approach is more
+%D accurate. It is also far simpler and overflow does not seem to be a
+%D significant concern. The scale factors written by Metapost are (?)
+%D always $<=1$ (it scales coordinates internally) and coordinates are
+%D always likely to be less than \type {\maxdimen}.
+%D
+%D If this should ever cause problems, the scale factors can be reduced.
+
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12=#1pt % p_x % #1pt
+% \dimen14=#3pt % p_y % #3pt
+% \advance\dimen12 -\dimen8 % p_x - t_x
+% \advance\dimen14 -\dimen10 % p_y - t_y
+% \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x)
+% \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y)
+% \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y)
+% \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x)
+% % \MPscratchDim contains precomputed 1/D:
+% \dimen18=\withoutpt\the\MPscratchDim \dimen18
+% \dimen14=\withoutpt\the\MPscratchDim \dimen14
+% \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+% \edef#4{\withoutpt\the\dimen14}} % p_y^\prime
+
+\def\doMPconcat#1#2#3#4%
+ {\dimen12=#1pt % p_x % #1pt
+ \dimen14=#3pt % p_y % #3pt
+ \advance\dimen12 -\dimen8 % p_x - t_x
+ \advance\dimen14 -\dimen10 % p_y - t_y
+ \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x)
+ \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y)
+ \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y)
+ \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x)
+ % \MPreciprocal contains precomputed 1/D:
+ \dimen18=\MPreciprocal\dimen18
+ \dimen14=\MPreciprocal\dimen14
+ \edef#2{\withoutpt\the\dimen18}% % p_x^\prime
+ \edef#4{\withoutpt\the\dimen14}} % p_y^\prime
+
+% faster but not that often used
+%
+% \def\doMPconcat#1#2#3#4%
+% {\dimen12\dimexpr#1\points-\dimen 8\relax % p_x-t_x
+% \dimen14\dimexpr#3\points-\dimen10\relax % p_y-t_y
+% \dimen18\dimexpr\withoutpt\the\dimen6\dimen12-\withoutpt\the\dimen4\dimen14\relax % s_y(p_x-t_x)-r_y(p_y-t_y)
+% \dimen14\dimexpr\withoutpt\the\dimen0\dimen14-\withoutpt\the\dimen2\dimen12\relax % s_x(p_y-t_y)-r_x(p_x-t_x)
+% \edef#2{\withoutpt\the\dimexpr\MPreciprocal\dimen18\relax}% % p_x^\prime
+% \edef#4{\withoutpt\the\dimexpr\MPreciprocal\dimen14\relax}} % p_y^\prime
+
+%D One reason for Daniel to write this patch was that at small sizes
+%D the accuracy was less than optimal. Here is a test that demonstrates
+%D that his alternative is pretty good:
+%D
+%D \startlinecorrection
+%D \startMPcode
+%D for i = 5cm,1cm,5mm,1mm,.5mm,.1mm,.01mm :
+%D draw fullcircle scaled i withpen pencircle xscaled (i/10) yscaled (i/20) rotated 45 ;
+%D endfor ;
+%D \stopMPcode
+%D \stoplinecorrection
+
+%D The following explanation of the conversion process was
+%D posted to the \PDFTEX\ mailing list by Tanmoy. The original
+%D macro was part of a set of macro's that included sinus and
+%D cosinus calculations as well as scaling and translating. The
+%D \METAPOST\ to \PDF\ conversion however only needs
+%D transformation.
+
+%M \start \switchtobodyfont [ss]
+
+%D Given a point $(U_x, U_y)$ in user coordinates, the business
+%D of \POSTSCRIPT\ is to convert it to device space. Let us say
+%D that the device space coordinates are $(D_x, D_y)$. Then, in
+%D \POSTSCRIPT\ $(D_x, D_y)$ can be written in terms of
+%D $(U_x, U_y)$ in matrix notation, either as
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x&D_y&1\cr} = \pmatrix{U_x&U_y&1\cr}
+%D \pmatrix{s_x&r_x&0\cr
+%D r_y&s_y&0\cr
+%D t_x&t_y&1\cr}
+%D \stopformula
+%D
+%D or
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D both of which is a shorthand for the same set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D D_x = s_x U_x + r_y U_y + t_x
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D D_y = r_x U_x + s_y U_y + t_y
+%D \stopformula
+%D
+%D which define what is called an `affine transformation'.
+%D
+%D \POSTSCRIPT\ represents the `transformation matrix' as a
+%D six element matrix instead of a $3\times 3$ array because
+%D three of the elements are always~0, 0 and~1. Thus the above
+%D transformation is written in postscript as $[s_x\, r_x\,
+%D r_y\, s_y\, t_x\, t_y]$. However, when doing any
+%D calculations, it is useful to go back to the original
+%D matrix notation (whichever: I will use the second) and
+%D continue from there.
+%D
+%D As an example, if the current transformation matrix is
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ and you say \typ{[a b
+%D c d e f] concat}, this means:
+%D
+%D \startnarrower
+%D Take the user space coordinates and transform them to an
+%D intermediate set of coordinates using array $[a\, b\, c\, d\,
+%D e\, f]$ as the transformation matrix.
+%D
+%D Take the intermediate set of coordinates and change them to
+%D device coordinates using array $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$
+%D as the transformation matrix.
+%D \stopnarrower
+%D
+%D Well, what is the net effect? In matrix notation, it is
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{I_x\cr I_y\cr 1\cr} = \pmatrix{a&c&e\cr
+%D b&d&f\cr
+%D 0&0&1\cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_y\cr D_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{I_x\cr
+%D I_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where $(I_x, I_y)$ is the intermediate coordinate.
+%D
+%D Now, the beauty of the matrix notation is that when there is
+%D a chain of such matrix equations, one can always compose
+%D them into one matrix equation using the standard matrix
+%D composition law. The composite matrix from two matrices can
+%D be derived very easily: the element in the $i$\high{th}
+%D horizontal row and $j$\high{th} vertical column is
+%D calculated by`multiplying' the $i$\high{th} row of the first
+%D matrix and the $j$\high{th} column of the second matrix (and
+%D summing over the elements). Thus, in the above:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &0 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D with
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {s_x^\prime & = s_x a + r_y b \cr
+%D r_x^\prime & = r_x a + s_y b \cr
+%D r_y^\prime & = s_x c + r_y d \cr
+%D s_y^\prime & = r_x c + s_y d \cr
+%D t_x^\prime & = s_x e + r_y f + t_x \cr
+%D t_y^\prime & = r_x e + s_y f + t_y \cr}
+%D \stopformula
+
+%D In fact, the same rule is true not only when one is going
+%D from user coordinates to device coordinates, but whenever
+%D one is composing two `transformations' together
+%D (transformations are `associative'). Note that the formula
+%D is not symmetric: you have to keep track of which
+%D transformation existed before (i.e.\ the equivalent of
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$) and which was
+%D specified later (i.e.\ the equivalent of $[a\, b\, c\, d\,
+%D e\, f]$). Note also that the language can be rather
+%D confusing: the one specified later `acts earlier',
+%D converting the user space coordinates to intermediate
+%D coordinates, which are then acted upon by the pre||existing
+%D transformation. The important point is that order of
+%D transformation matrices cannot be flipped (transformations
+%D are not `commutative').
+%D
+%D Now what does it mean to move a transformation matrix
+%D before a drawing? What it means is that given a point
+%D $(P_x, P_y)$ we need a different set of coordinates
+%D $(P_x^\prime, P_y^\prime)$ such that if the transformation
+%D acts on $(P_x^\prime, P_y^\prime)$, they produce $(P_x,
+%D P_y)$. That is we need to solve the set of equations:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x\cr P_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x^\prime\cr
+%D P_y^\prime\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D Again matrix notation comes in handy (i.e. someone has
+%D already solved the problem for us): we need the inverse
+%D transformation matrix. The inverse transformation matrix can
+%D be calculated very easily:
+%D
+%D \placeformula
+%D \startformula
+%D \pmatrix{P_x^\prime\cr P_y^\prime\cr 1\cr} =
+%D \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x\cr
+%D P_y\cr
+%D 1 \cr}
+%D \stopformula
+%D
+%D where, the inverse transformation matrix is given by
+%D
+%D \placeformula
+%D \startformula
+%D \eqalign
+%D {D & = s_x s_y - r_x r_y \cr
+%D s_x^\prime & = s_y / D \cr
+%D s_y^\prime & = s_x / D \cr
+%D r_x^\prime & = - r_x / D \cr
+%D r_y^\prime & = - r_y / D \cr
+%D t_x^\prime & = ( - s_y t_x + r_y t_y ) / D \cr
+%D t_y^\prime & = ( r_x t_x - s_x t_y ) / D \cr}
+%D \stopformula
+%D
+%D And you can see that when expanded out, this does
+%D give the formulas:
+%D
+%D \placeformula
+%D \startformula
+%D P_x^\prime = { { s_y(p_x-t_x) + r_y(t_y-p_y) } \over
+%D { s_x s_y-r_x r_y } }
+%D \stopformula
+%D
+%D \placeformula
+%D \startformula
+%D P_y^\prime = { { s_x(p_y-t_y) + r_x(t_x-p_x) } \over
+%D { s_x*s_y-r_x*r_y } }
+%D \stopformula
+%D
+%D The code works by representing a real number by converting
+%D it to a dimension to be put into a \DIMENSION\ register: 2.3 would
+%D be represented as 2.3pt for example. In this scheme,
+%D multiplying two numbers involves multiplying the \DIMENSION\
+%D registers and dividing by 65536. Accuracy demands that the
+%D division be done as late as possible, but overflow
+%D considerations need early division.
+%D
+%D Division involves dividing the two \DIMENSION\ registers and
+%D multiplying the result by 65536. Again, accuracy would
+%D demand that the numerator be multiplied (and|/|or the
+%D denominator divided) early: but that can lead to overflow
+%D which needs to be avoided.
+%D
+%D If nothing is known about the numbers to start with (in
+%D concat), I have chosen to divide the 65536 as a 256 in each
+%D operand. However, in the series calculating the sine and
+%D cosine, I know that the terms are small (because I never
+%D have an angle greater than 45 degrees), so I chose to
+%D apportion the factor in a different way.
+
+%M \stop
+
+%D The path is output using the values saved on the stack. If
+%D needed, all coordinates are recalculated.
+
+\def\finishMPpath
+ {\PDFcode{\ifcase\finiMPpath W n\or S\or f\or B\fi}}
+
+\def\processMPpath
+ {\checkMPpath
+ \ifcase\nofMPsegments\else
+ \flushMPpath
+ \closeMPpath
+ \finishMPpath
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments0
+ \handleMPsequence}
+
+%D The following \METAPOST\ code is quite valid but, when
+%D processed and converted to \PDF, will make a file
+%D unprintable on a Hewlett Packard printer (from Acrobat
+%D $v<=5$). Who is to blame, the driver of the OS layer in
+%D between, is hard to determine, so we add an additional
+%D check.
+%D
+%D \starttyping
+%D clip currentpicture to origin -- cycle ;
+%D setbounds currentpicture to fullsquare scaled 5cm ;
+%D \stoptyping
+
+\def\checkMPpath
+ {\ifcase\finiMPpath
+ \ifnum\nofMPsegments<3 % n is one ahead
+ \message{omitting zero clip path}%
+ \nofMPsegments0
+ \fi
+ \fi}
+
+%D In \PDF\ the \type{cm} operator must precede the path
+%D specification. We therefore can output the \type{cm} at
+%D the moment we encounter it.
+
+\def\handleMPpathconcat
+ {\presetMPconcat
+ \PDFcode{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 cm}%
+ \resetMPstack}
+
+\def\handleMPpathscale
+ {\presetMPscale
+ \PDFcode{\gMPs1 0 0 \gMPs2 0 0 cm}%
+ \resetMPstack}
+
+%D This macro interprets the path and saves it as compact as
+%D possible.
+
+\def\dohandleMPpath#1%
+ {\ifcase\lccode`#1\relax
+ \expandafter\dohandleMPpathA
+ \else
+ \expandafter\dohandleMPpathB
+ \fi#1}
+
+%\def\dohandleMPpathA#1 %
+% {\setMPargument{#1}%
+% \handleMPsequence}
+
+\let\dohandleMPpathA\setMPsequence
+
+% \def\dohandleMPpathB#1 %
+% {\def\somestring{#1}%
+% \ifx\somestring\PSlineto
+% \setMPkeyword0
+% \else\ifx\somestring\PScurveto
+% \setMPkeyword1
+% \else\ifx\somestring\PSrlineto
+% \setMPkeyword2
+% \else\ifx\somestring\PSmoveto
+% \setMPkeyword3
+% \else\ifx\somestring\PSclip
+% % \chardef\finiMPpath0 % already
+% \let\handleMPsequence\processMPpath
+% \else\ifx\somestring\PSgsave
+% \chardef\finiMPpath3
+% \else\ifx\somestring\PSgrestore
+% \else\ifx\somestring\PSfill
+% \ifcase\finiMPpath
+% \chardef\finiMPpath2
+% \let\handleMPsequence\processMPpath
+% \fi
+% \else\ifx\somestring\PSstroke
+% \ifcase\finiMPpath
+% \chardef\finiMPpath1
+% \fi
+% \let\handleMPsequence\processMPpath
+% \else\ifx\somestring\PSclosepath
+% \def\closeMPpath{\PDFcode{h}}%
+% \else\ifx\somestring\PSconcat
+% \cleanupMPconcat
+% \let\flushMPpath\flushconcatMPpath
+% \handleMPpathconcat
+% \else\ifx\somestring\PSscale
+% \let\flushMPpath\flushconcatMPpath
+% \handleMPpathscale
+% \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+% \handleMPsequence}
+
+\def\installMPSkeywordP#1#2%
+ {\expandafter\def\csname\@@MP:P:#1\endcsname{#2}}
+
+\def\installMPSshortcutP#1#2% todo: \let
+ {\expandafter\let\csname\@@MP:P:#1\expandafter\endcsname\csname\@@MP:P:#2\endcsname}
+
+\def\dohandleMPpathB#1 %
+ {\def\somestring{#1}%
+ \ifcsname\@@MP:P:\somestring\endcsname
+ \csname\@@MP:P:\somestring\expandafter\endcsname
+ \fi
+ \handleMPsequence}
+
+\ifx\eTeXversion\undefined
+ \def\dohandleMPpathB#1 %
+ {\def\somestring{#1}%
+ \csname\@@MP:P:\somestring\endcsname
+ \handleMPsequence}
+\fi
+
+\installMPSkeywordP \PSlineto
+ {\setMPkeyword0 }
+\installMPSkeywordP \PScurveto
+ {\setMPkeyword1 }
+\installMPSkeywordP \PSrlineto
+ {\setMPkeyword2 }
+\installMPSkeywordP \PSmoveto
+ {\edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \resetMPstack
+ \setMPkeyword3 }
+\installMPSkeywordP \PSclip
+ {% \chardef\finiMPpath\zerocount % already
+ \let\handleMPsequence\processMPpath}
+\installMPSkeywordP \PSgsave
+ {\chardef\finiMPpath3 }
+\installMPSkeywordP \PSgrestore
+ {}
+\installMPSkeywordP \PSfill
+ {\ifcase\finiMPpath
+ \chardef\finiMPpath2
+ \let\handleMPsequence\processMPpath
+ \fi}
+\installMPSkeywordP \PSstroke
+ {\ifcase\finiMPpath
+ \chardef\finiMPpath1
+ \fi
+ \let\handleMPsequence\processMPpath}
+\installMPSkeywordP \PSclosepath
+ {\def\closeMPpath{\PDFcode{h}}}
+\installMPSkeywordP \PSconcat
+ {\cleanupMPconcat
+ \let\flushMPpath\flushconcatMPpath
+ \handleMPpathconcat}
+\installMPSkeywordP \PSscale
+ {\let\flushMPpath\flushconcatMPpath
+ \handleMPpathscale}
+
+\installMPSshortcutP {l} \PSlineto
+\installMPSshortcutP {r} \PSrlineto
+\installMPSshortcutP {m} \PSmoveto
+\installMPSshortcutP {c} \PScurveto
+
+\installMPSshortcutP {q} \PSgsave
+\installMPSshortcutP {Q} \PSgrestore
+\installMPSshortcutP {S} \PSstroke
+\installMPSshortcutP {F} \PSfill
+\installMPSshortcutP {B} \PSgsave
+\installMPSshortcutP {W} \PSclip
+\installMPSshortcutP {p} \PSclosepath
+
+\installMPSshortcutP {s} \PSscale
+\installMPSshortcutP {t} \PSconcat
+
+%D The main conversion command is:
+%D
+%D \starttyping
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptyping
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttyping
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptyping
+
+%D \macros
+%D {makeMPintoPDFobject,lastPDFMPobject}
+%D
+%D For experts there are a few more options. When attributes
+%D are to be added, the code must be embedded in an object
+%D accompanied with the appropriate directives. One can
+%D influence this process with \type {\makeMPintoPDFobject}.
+%D
+%D This option defaults to~0, because \CONTEXT\ takes care
+%D of objects at another level, which saves some bytes.
+%D
+%D \starttabulate[|l|l|p|]
+%D \NC 0 \NC never \NC don't use an object \NC\NR
+%D \NC 1 \NC always \NC always use an object \NC\NR
+%D \NC 2 \NC optional \NC use object when needed \NC\NR
+%D \stoptabulate
+%D
+%D The last object number used is avaliable in the macro
+%D \type {\lastPDFMPobject}.
+
+\ifx\makeMPintoPDFobject\undefined \chardef\makeMPintoPDFobject=0 \fi
+
+\def\lastPDFMPobject{0}
+
+%D The additional code needed can be made available in the
+%D (global) macro \type {\currentPDFresources}.
+
+\let\currentPDFresources\empty
+
+\newtoks\everyMPtoPDFconversion
+
+\def\convertMPtoPDF % #1#2#3%
+ {\bgroup
+ \defineMPtoPDFfallbacks
+ \ifx\pdfdecimaldigits\undefined\else \pdfdecimaldigits=5 \fi % new
+ \setbox\scratchbox\vbox\bgroup
+ \xdef\MPheight{0pt}%
+ \xdef\MPwidth {0pt}%
+ \forgetall
+ \offinterlineskip
+ \startMPresources
+ \doprocessMPtoPDFfile} %
+
+%D The next one is kind of private and probably will become obsolete):
+
+\def\processMPtoPDFfile % file xscale yscale
+ {\bgroup
+ \let\finishMPgraphic\egroup
+ \doprocessMPtoPDFfile}
+
+\let\setMPextensions\relax
+
+\def\doprocessMPtoPDFfile#1#2#3% file xscale yscale
+ {\setMPspecials
+ \setMPextensions
+ \the\everyMPtoPDFconversion
+ \catcode`\^^M=\@@endofline
+ \startMPscanning
+ \let\do\empty
+ \xdef\MPxscale{#2}%
+ \xdef\MPyscale{#3}%
+ \xdef\MPxoffset{0}%
+ \xdef\MPyoffset{0}%
+ \xdef\MPyshift{0pt}%
+ \donefalse
+ \let\handleMPsequence\dohandleMPsequence
+ \message{[MP to PDF]}% was: [MP to PDF #1] but there is a (#1) anyway
+ \input#1\relax}
+
+\def\PDFMPformoffset
+ {\ifx\objectoffset\undefined0pt\else\objectoffset\fi}
+
+\chardef\blackoutMPgraphic0 % in ConTeXt 1
+
+\def\finishMPgraphic
+ {\stopMPresources
+ \egroup
+ \setbox\scratchbox\vbox
+ {\forgetall
+ \hbox
+ {\PDFcode{q \MPxscale\space 0 0 \MPyscale\space \MPxoffset\space \MPyoffset\space cm}%
+ \ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi
+ \lower\MPyshift\box\scratchbox % unscaled shift
+ \PDFcode{Q}}}%
+ \ht\scratchbox\MPheight
+ \wd\scratchbox\MPwidth
+ \dp\scratchbox0pt\relax
+ \dopackageMPgraphic\scratchbox
+ \egroup
+ \endinput}
+
+%D Alternative for \PDFTEX. We cannot come up with something more contexy
+%D because this module is also used in \LATEX.
+
+\def\dopackageMPgraphic#1% #1 = boxregister
+ {%\ifx\pdfxform\undefined
+ % \chardef\makeMPintoPDFobject0 % no pdftex at all
+ %\else\ifx\pdftexversion\undefined
+ % \chardef\makeMPintoPDFobject0 % no pdftex at all
+ %\else\ifnum\pdftexversion<14
+ % \chardef\makeMPintoPDFobject0 % no resource support
+ %\else
+ % % keep the default value
+ %\fi\fi\fi
+ \ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
+ % an existing value of 2 signals object support (set elsewhere)
+ \chardef\makeMPintoPDFobject1
+ \fi\fi
+ \ifcase\makeMPintoPDFobject
+ \box#1%
+ \or
+ \scratchdimen\PDFMPformoffset\relax
+ \ifdim\scratchdimen>0pt % compensate for error
+ \setbox#1\vbox spread 2\scratchdimen
+ {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}%
+ \fi
+ \setMPPDFobject{\currentPDFresources}{#1}%
+ \ifdim\scratchdimen>0pt % compensate for error
+ \vbox to \MPheight
+ {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}%
+ \else
+ \getMPPDFobject
+ \fi
+ \global\let\currentPDFresources\empty
+ \else
+ \box#1%
+ \fi}
+
+\def\setMPPDFobject#1#2% resources boxnumber
+ {\ifx\pdfxform\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifx\pdftexversion\undefined
+ \def\getMPPDFobject{\box#2}%
+ \else\ifnum\pdftexversion<14
+ \def\getMPPDFobject{\box#2}%
+ \else
+ \ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi
+ \immediate\pdfxform resources{#1}#2%
+ \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}%
+ \fi\fi\fi}
+
+\let\getMPPDFobject\relax
+
+%D \macros
+%D {deleteMPgraphic,
+%D startMPresources,
+%D stopMPresources}
+%D
+%D Here are a few hooks for \CONTEXT\ specific things.
+
+\ifx\deleteMPgraphic\undefined
+ \def\deleteMPgraphic#1{}
+\fi
+
+\ifx\startMPresources\undefined
+ \let\startMPresources\relax
+ \let\stopMPresources\relax
+\fi
+
+%D \macros
+%D {twodigitMPoutput}
+%D
+%D We can limit the precision to two digits after the comma
+%D by saying:
+%D
+%D \starttyping
+%D \twodigitMPoutput
+%D \stoptyping
+%D
+%D This option only works in \CONTEXT\ combined with \ETEX.
+
+\def\twodigitMPoutput
+ {\let\!MP \twodigitrounding
+ \def\!MPgMPs##1{\twodigitrounding{\gMPs##1}}%
+ \def\!MPgMPa##1{\twodigitrounding{\gMPa##1}}}
+
+\let\!MP \empty
+\let\!MPgMPa\gMPa
+\let\!MPgMPs\gMPs
+
+%D This kind of conversion is possible because \METAPOST\
+%D does all the calculations. Converting other \POSTSCRIPT\
+%D files would drive both me and \TEX\ crazy.
+
+\protect \endinput
diff --git a/tex/context/base/supp-pdf.tex b/tex/context/base/supp-pdf.tex
new file mode 100644
index 000000000..2ae878067
--- /dev/null
+++ b/tex/context/base/supp-pdf.tex
@@ -0,0 +1 @@
+\input supp-pdf.mkii
diff --git a/tex/context/base/supp-ran.lua b/tex/context/base/supp-ran.lua
new file mode 100644
index 000000000..fe635fc7f
--- /dev/null
+++ b/tex/context/base/supp-ran.lua
@@ -0,0 +1,67 @@
+if not modules then modules = { } end modules ['supp-ran'] = {
+ version = 1.001,
+ comment = "companion to supp-ran.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- We cannot ask for the current seed, so we need some messy hack
+-- here.
+
+commands = commands or { }
+
+local random, randomseed, round, seed, last = math.random, math.randomseed, math.round, false, 1
+local texwrite = tex.write
+
+function math.setrandomseedi(n,comment)
+ if n <= 1 then
+ n = n*1073741823 -- maxcount
+ end
+ n = round(n)
+ if false then
+ logs.report("system","setting random seed to %s (%s)",n,comment or "normal")
+ end
+ randomseed(n)
+ last = random(0,1073741823) -- we need an initial value
+end
+
+function commands.getrandomcounta(min,max)
+ last = random(min,max)
+ texwrite(last)
+end
+
+function commands.getrandomcountb(min,max)
+ last = random(min,max)/65536
+ texwrite(last)
+end
+
+function commands.setrandomseed(n)
+ last = n
+ math.setrandomseedi(n)
+end
+
+function commands.getrandomseed(n)
+ texwrite(last)
+end
+
+-- maybe stack
+
+function commands.freezerandomseed(n)
+ -- print("<<<<",seed,last)
+ if seed == false or seed == nil then
+ seed = last
+ math.setrandomseedi(seed,"freeze",seed)
+ end
+ if n then
+ randomseed(n)
+ end
+end
+
+function commands.defrostrandomseed()
+ -- print(">>>>",seed,last)
+ if seed ~= false then
+ math.setrandomseedi(seed,"defrost",seed) -- was last (bug)
+ seed = false
+ end
+end
diff --git a/tex/context/base/supp-ran.mkii b/tex/context/base/supp-ran.mkii
new file mode 100644
index 000000000..0c07099ed
--- /dev/null
+++ b/tex/context/base/supp-ran.mkii
@@ -0,0 +1,122 @@
+%D \module
+%D [ file=supp-ran,
+%D version=1998.01.21,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Random Number 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.
+
+\writestatus{loading}{ConTeXt Support Macros / Random Number Generation}
+
+%D \macros
+%D {getrandomcount, getrandomdimen,
+%D getrandomfloat, getrandomnumber,
+%D setrandomseed, getrandomseed}
+%D
+%D This module load Donald Arseneau's generic file
+%D \type{random.tex}. A small shell is needed because we
+%D redefine some \TEX\ primitives. We also use different names
+%D for the two generators and add an extra one.
+%D
+%D \starttyping
+%D \getrandomcount \countregister {minimum} {maximum}
+%D \getrandomdimen \dimenregister {minimum} {maximum}
+%D \getrandomnumber \macroname {minimum} {maximum}
+%D \getrandomfloat \macroname {minimum} {maximum}
+%D \stoptyping
+%D
+%D Of course the file \type{random.tex} needs to be present.
+%D To prevent name clashes, the \CONTEXT\ distribution
+%D contains a copy in \type {thrd-ran.tex}.
+%D
+%D The randomseed can be set by:
+%D
+%D \starttyping
+%d \setrandomseed{number>0}
+%D \stoptyping
+%D
+%D and get by:
+%D
+%D \starttyping
+%D \getrandomseed\randomseed
+%D \stoptyping
+
+\input thrd-ran.mkii
+
+\ifx\uniformdeviate\undefined
+
+ \let\verynormalnextrandom\nextrandom
+
+ \def\normalnextrandom
+ {\bgroup
+ \let\time \normaltime
+ \let\day \normalday
+ \let\month\normalmonth
+ \let\year \normalyear
+ \verynormalnextrandom
+ \egroup}
+
+\else
+
+ \writestatus{loading}{using TeX's built in randomizer (overloading macro)}
+
+ % For the meaning of the magic number, see \type {thrd-ran.tex}.
+ %
+ % Taco suggested to use the following alternative because \type
+ % {\uniformdeviate} can return a zero (as expected) while
+ % Donalds Arseneau's alternative has a minimum of~1.
+
+ \def\nextrandom
+ {\normalsetrandomseed\randomi\relax
+ \global\randomi\numexpr\normaluniformdeviate2147483646+1\relax}
+
+ \let\normalnextrandom\nextrandom
+
+\fi
+
+\def\nextrandom
+ {\bgroup
+ \normalnextrandom
+ \gdef\nextrandom{\ifcase\randomseedfrozen\normalnextrandom\fi}%
+ \egroup}
+
+\chardef\randomseedfrozen\zerocount
+
+\def\freezerandomseed
+ {\ifcase\randomseedfrozen
+ \nextrandom \global\chardef\randomseedfrozen\plusone
+ \fi}
+
+\def\defrostrandomseed
+ {\ifcase\randomseedfrozen\else
+ \global\chardef\randomseedfrozen\zerocount \nextrandom
+ \fi}
+
+\let\getrandomcount\setrannum
+\let\getrandomdimen\setrandim
+
+\def\getrandomnumber#1#2#3%
+ {\getrandomcount\scratchcounter{#2}{#3}%
+ \edef#1{\the\scratchcounter}}
+
+\def\getrandomfloat#1#2#3%
+ {\getrandomdimen\scratchdimen{#2\points}{#3\points}%
+ \edef#1{\withoutpt\the\scratchdimen}}
+
+\unexpanded \def\setrandomseed#1%
+ {\global\randomi#1\relax} % global added
+
+\unexpanded \def\getrandomseed#1%
+ {\edef#1{\number\randomi}}
+
+\def\getnewrandomseed#1%
+ {\setrandomseed\minusone % signals thrd-ran to auto reseed
+ \nextrandom % this signal is needed for the
+ #1\randomi} % pseudo randomizer (see: third-ran)
+
+\endinput
diff --git a/tex/context/base/supp-ran.mkiv b/tex/context/base/supp-ran.mkiv
new file mode 100644
index 000000000..9d429598f
--- /dev/null
+++ b/tex/context/base/supp-ran.mkiv
@@ -0,0 +1,30 @@
+%D \module
+%D [ file=supp-ran,
+%D version=2008-10-31,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Random Number 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.
+
+\writestatus{loading}{ConTeXt Support Macros / Random Number Generation}
+
+%D This module is downward compatible in the sense that we've kept
+%D the user interface (which uses intermediate variables).
+
+\registerctxluafile{supp-ran}{1.001}
+
+\def\getrandomcount #1#2#3{#1=\ctxlua{commands.getrandomcounta(\number#2,\number#3)}}
+\def\getrandomdimen #1#2#3{#1=\ctxlua{commands.getrandomcounta(\number\dimexpr#2,\number\dimexpr#3)}\scaledpoint}
+\def\getrandomnumber#1#2#3{\edef#1{\ctxlua{commands.getrandomcounta(\number#2,\number#3)}}}
+\def\getrandomfloat #1#2#3{\edef#1{\ctxlua{commands.getrandomcountb(\number\dimexpr#2\points,\number\dimexpr#3\points)}}}
+\def\setrandomseed #1{\ctxlua{commands.setrandomseed(\number#1)}}
+\def\getrandomseed {\ctxlua{commands.getrandomseed()}}
+\def\freezerandomseed {\ctxlua{commands.freezerandomseed()}}
+\def\defrostrandomseed {\ctxlua{commands.defrostrandomseed()}}
+
+\endinput
diff --git a/tex/context/base/supp-spe.mkii b/tex/context/base/supp-spe.mkii
new file mode 100644
index 000000000..8cb8e2ac1
--- /dev/null
+++ b/tex/context/base/supp-spe.mkii
@@ -0,0 +1,164 @@
+%D \module
+%D [ file=supp-spe,
+%D version=1997.07.05,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Specials,
+%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 some \type{\special} manipulation
+%D macros. I needed these when I implemented the code that
+%D handles the conversion of \TPIC\ specials to \PDF\ code.
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+\ifx \undefined \redefinespecial \else \expandafter \endinput \fi
+
+\writestatus{loading}{ConTeXt Support Macros / Specials}
+
+\unprotect
+
+%D When interpreting specials we need to do some basic scanning.
+%D For the moment we distinguish between three cases. We need
+%D
+%D \starttyping
+%D \special{tag: arguments}
+%D \special{tag arguments}
+%D \special{tag}
+%D \stoptyping
+%D
+%D We cannot be sure that the first case isn't
+%D
+%D \starttyping
+%D \special{tag:arguments}
+%D \stoptyping
+%D
+%D So we have to take care of that one too.
+
+%D \macros
+%D {redefinespecial}
+%D
+%D Specials that are to be interpreted are defined with
+%D commands like:
+%D
+%D \startbuffer[tmp-1]
+%D \redefinespecial a: \using#1\endspecial%
+%D {let's execute special 'a:' using '#1'}
+%D
+%D \redefinespecial a \using#1\endspecial%
+%D {let's execute special 'a' using '#1'}
+%D
+%D \redefinespecial a \using#1\endspecial%
+%D {let's execute special 'a' using nothing}
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-1]
+%D
+%D The first two always take an argument, the last one not.
+%D The definition of this redefinition macro is not that
+%D complex. The names are internally tagged with \type{\@rds@}
+%D which saves both time and space.
+
+\def\@rds@{@rds@}
+
+\def\redefinespecial #1 {\setvalue{\@rds@#1}}
+
+%D \macros
+%D {mimmickspecials}
+%D
+%D Mimmicking specials is activated by saying:
+%D
+%D \starttyping
+%D \mimmickspecials
+%D \stoptyping
+%D
+%D This commands redefines the \PLAIN\ \TEX\ primitive
+%D \type{\special}.
+
+\def\mimmickspecials
+ {\let\special\domimmickspecial}
+
+%D The special mimmicking macro first looks if it can find an
+%D colon terminated tag, next it searches for a tag that end
+%D with a space. If both cannot find, the tag itself is treated
+%D without argument.
+
+\def\domimmickspecial#1%
+ {\domimmickcolonspecial#1:\relax/:\relax/\end}
+
+\def\domimmickcolonspecial#1:#2#3:\relax/#4\end
+ {\ifx#2\relax
+ \domimmickspacespecial#1 \relax/ \relax/\end
+ \else
+ \dodomimmickspecial#1:\using#2#3\endspecial
+ \fi}
+
+\def\domimmickspacespecial#1 #2#3 \relax/#4\end
+ {\ifx#2\relax
+ \dodomimmickspecial#1\using\endspecial
+ \else
+ \dodomimmickspecial#1\using#2#3\endspecial
+ \fi}
+
+\def\dodomimmickspecial#1\using#2\endspecial
+ {\expandafter\ifx\csname\@rds@#1\endcsname\relax % \doifdefinedelse
+ \defaultspecial{#1 #2}%
+ \else
+ %\message{[mimmick special #1 with #2]}%
+ \getvalue{\@rds@#1}\using#2\endspecial
+ \fi}
+
+%D Now let's show that things work the way we want, using the
+%D previous definitions of tag~a.
+%D
+%D \startbuffer[tmp-2]
+%D \mimmickspecials
+%D \special{a: 1 2 3 4 5}
+%D \special{a: 1 2 3 4 5}
+%D \special{a}
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-2]
+%D
+%D Which results in:
+%D
+%D \startlines
+%D \getbuffer[tmp-1]
+%D \getbuffer[tmp-2]
+%D \stoplines
+
+%D \macros
+%D {mimmickspecial}
+%D
+%D When needed, one can call a mimmicked special directly by
+%D saying for instance:
+%D
+%D \starttyping
+%D \mimmickspecial a: \using...\endspecial
+%D \stoptyping
+%D
+%D This can be handy when specials have much in common.
+
+\def\mimmickspecial #1 {\getvalue{\@rds@#1}}
+
+%D \macros
+%D {normalspecial,defaultspecial}
+%D
+%D Unknown specials are passed to the default special handler.
+%D One can for instance ignore all further specials by saying
+%D \type{\normalspecial}:
+%D
+%D \starttyping
+%D \def\defaultspecial#1{}
+%D \stoptyping
+%D
+%D But here we default to idle.
+
+\let\normalspecial \special
+\let\defaultspecial\special
+
+\protect \endinput
diff --git a/tex/context/base/supp-tpi.mkii b/tex/context/base/supp-tpi.mkii
new file mode 100644
index 000000000..9b2ac9328
--- /dev/null
+++ b/tex/context/base/supp-tpi.mkii
@@ -0,0 +1,353 @@
+%D \module
+%D [ file=supp-tpi,
+%D version=1997.07.05,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\TPIC\ Conversion,
+%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 modules implements the conversion of graphic \TPIC\
+%D specials using \METAPOST.
+%D
+%D We reimplement the \TPIC\ specials using the special
+%D mimmicking mechanism implemented in the support module
+%D \type{supp-spe} as well as the \METAPOST\ run||time support
+%D implemented in \type{supp-mps}.
+
+\ifnum\texengine=\luatexengine
+ \endinput
+\fi
+
+\ifx\undefined\writestatus \input supp-mis.mkii \relax \fi
+\ifx\undefined\mimmickspecials \input supp-spe.mkii \relax \fi
+\ifx\undefined\MPgraphicbox \input supp-mps.mkii \relax \fi
+\ifx\undefined\dogetEPSboundingbox \input supp-eps.mkii \relax \fi
+
+\writestatus{loading}{ConTeXt Support Macros / TPIC Conversion}
+
+%D Beware: we haven't activated both mechanism yet. This is
+%D to be done in the calling module.
+
+\unprotect
+
+%D When we want to mimmick \TPIC\ specials in \PDFTEX, we need
+%D to map its graphic primitives into \PDF\ ones. The main
+%D problem in doing so is that \PDF\ does not support b-splines
+%D directly and also does not offer us something to draw arcs.
+%D Of course all this scan be implemented in \TEX, and the
+%D first implementation of this module did so, but the results
+%D were not that satisfying. Not having used these specials
+%D before, I had for instance to find out that the \TPIC\
+%D specials were not that unambiguesly defined.
+%D
+%D Then, while discussing something else, Sebastian Ratz told
+%D me that the Web2c implementation that \PDFTEX\ is base upon,
+%D offers some rather discutable, but nevertheless handy
+%D feature:
+%D
+%D \starttyping
+%D \write18{execute program with arguments}
+%D \stoptyping
+%D
+%D Knowing this, I immediatelly decided to throw away the old
+%D conversion macros and use the marvelous \METAPOST, \TEX\
+%D related, drawing program to do the conversion in as high a
+%D quality as possible.
+%D
+%D implementation we're going to present here, not only uses
+%D for drawing purposes, but also uses the more efficient
+%D \METAPOST\ features to store the path.
+%D
+%D \in{Table}[tab:TPIC specials] lists the \TPIC\ specials as
+%D mentioned in the \LATEX\ Graphics Companion and the
+%D relevant part of the \DVIPS\ source. This list shows us
+%D that we have to store the path before we can use it, simply
+%D because we don't know in advance what actions to apply on
+%D it.
+%D
+%D \placetable[here][tab:TPIC specials]{The \TPIC\ special syntax.}
+%D \starttable[|||l|]
+%D \HL
+%D \NC \bf tag \NC \bf arguments \NC \bf meaning \NC\SR
+%D \HL
+%D \NC pn \NC $w$ \NC set linewidth \NC\FR
+%D \NC pa \NC $x$ $y$ \NC add point to path \NC\MR
+%D \NC fp \NC \NC draw/fill path \NC\MR
+%D \NC ip \NC \NC fill path \NC\MR
+%D \NC da \NC $l$ \NC draw dashed path \NC\MR
+%D \NC dt \NC $l$ \NC draw doted path \NC\MR
+%D \NC sp \NC $d$ \NC draw spline \NC\MR
+%D \NC ar \NC $x$ $y$ $r_x$ $r_y$ $b$ $e$ \NC draw (partial) arc \NC\MR
+%D \NC ia \NC $x$ $y$ $r_x$ $r_y$ $b$ $e$ \NC fill (partial) arc \NC\MR
+%D \NC sh \NC $s$ \NC fill next path \NC\LR
+%D \HL
+%D \stoptable
+
+%D The first problem we have to take care of is the fact that
+%D there is no decent begin or end of the drawing process
+%D defined. We can however be quite sure that writers of
+%D packages using these specials will put them into a box,
+%D simply because else this is the most common used way to
+%D treat something \TEX\ as as a whole, like:
+%D
+%D \starttyping
+%D \hbox{\special{}\special{}...}
+%D \stoptyping
+%D
+%D We just start a picture as soon as the first special is
+%D encountered, so this becomes:
+%D
+%D \starttyping
+%D \hbox{\openpicture\newspecial{}\newspecial{}...
+%D \stoptyping
+
+%D The first step in opening the picture is to start a group.
+%D Now we can savely use the egroup that closes the box to also
+%D end the picture.
+
+% BETER: check for context and include mp-tool.mp
+
+\def\startTPICspecials
+ {\bgroup
+ \let\startTPICspecials\relax
+ \aftergroup\stopTPICspecials
+ \resetMPdrawing
+ \startMPdrawing
+ input mp-tool.mp;
+ pair p[];
+ \stopMPdrawing}
+
+%D As soon as we begin a picture, we inhibit nesting by
+%D relaxing the start macro. The first \METAPOST\ action we
+%D take is declaring an array of pairs named $p$.
+
+%D Ending the picture is invoked by closing the current group.
+%D Because the \TPIC\ picture comes out mirrored, we have to
+%D reflect the current \METAPOST\ picture, stored in the system
+%D variable {\it currentpicture}, around the $x$-axis.
+
+\def\stopTPICspecials
+ {\startMPdrawing
+ currentpicture:=currentpicture reflectedabout ((0,0),(4095,0));
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \setbox\MPgraphicbox\hbox
+ {\getMPdrawing}%
+ \setbox\MPgraphicbox\hbox to \zeropoint
+ {\kern-\wd\MPgraphicbox
+ \vbox to \zeropoint{\box\MPgraphicbox\vss}\hss}%
+ \ht\MPgraphicbox\zeropoint
+ \wd\MPgraphicbox\zeropoint
+ \dp\MPgraphicbox\zeropoint
+ \box\MPgraphicbox
+ \egroup}
+
+%D Here the macro \type{\stopwritingMPgraphic} has to take care
+%D of executing and including the \METAPOST\ code.
+
+%D We need to keep track of the number of elements that form
+%D the path. This is needed because we don't know in advance
+%D how the points are to be connected.
+
+\newcount\TPICcounter
+
+%D When a path is draw, we can connect the points using a
+%D smooth curve of drawing straight lines. A closed path can be
+%D drawn or filled.
+
+\newif\ifTPICdraw
+\newif\ifTPICfill
+\newif\ifTPICcurve
+
+%D The \TPIC\ specials permit specifying the line and fill
+%D color as well as the linetype, which can be solid, dashed or
+%D dotted. We'll save those specifications as a \METAPOST\
+%D string, using:
+
+\let\TPIClinetype =\empty
+\let\TPICgrayscale=\empty
+
+%D The magic reduction factor $.07227$ is needed to map the
+%D \TPIC\ $1/1000$ of an inch to \POSTSCRIPT\ points. We cannot
+%D delegate this task to \METAPOST\ because this program does
+%D not accept values greater than 4095.
+
+%D I won't discuss all the specifics used in implementing
+%D the specials. The \METAPOST\ part is rather trivial. Many
+%D specials have much in common, so the amout of code is not
+%D that large.
+
+\redefinespecial pa \using#1 #2\endspecial
+ {\startTPICspecials
+ \bgroup
+ \global\advance\TPICcounter 1
+ \dimen0=#1pt \dimen0=.07227\dimen0
+ \dimen2=#2pt \dimen2=.07227\dimen2
+ \startMPdrawing
+ p[\the\TPICcounter]:=(\the\dimen0,\the\dimen2);
+ \stopMPdrawing
+ \egroup}
+
+\redefinespecial pn \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \dimen0=#1pt \dimen0=.07227\dimen0
+ \startMPdrawing
+ pickup pencircle scaled \the\dimen0;
+ \stopMPdrawing
+ \egroup}
+
+\redefinespecial sh \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \edef\g{#1}%
+ \edef\g{\ifx\g\empty.5\else#1\fi}%
+ \xdef\TPICgrayscale{withcolor (\g,\g,\g)}%
+ \egroup}
+
+\redefinespecial wh \using#1\endspecial
+ {\mimmickspecial sh \using0\endspecial}
+
+\redefinespecial bk \using#1\endspecial
+ {\mimmickspecial sh \using1\endspecial}
+
+\redefinespecial da \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \edef\l{#1}%
+ \ifx\l\empty
+ \gdef\TPIClinetype{dashed evenly}%
+ \else
+ \dimen0=#1in
+ \ifdim\dimen0<\!!zeropoint \dimen0=-\dimen0\fi
+ \edef\f{\the\dimen0 \space}%
+ \dimen0=.5\dimen0
+ \edef\h{\the\dimen0 \space}%
+ \xdef\TPIClinetype{dashed dashpattern (on \h off \f on \h)}%
+ \fi
+ \egroup
+ \TPICcurvefalse\TPICdrawtrue
+ \drawTPICpath\using#1\endspecial}
+
+\redefinespecial dt \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \edef\l{#1}%
+ \xdef\TPIClinetype{dashed withdots \ifx\l\empty\else scaled #1in\fi}%
+ \egroup
+ \TPICcurvefalse\TPICdrawtrue
+ \drawTPICpath\using#1\endspecial}
+
+\redefinespecial fp \using#1\endspecial
+ {\startTPICspecials
+ \TPICcurvefalse\TPICdrawtrue
+ \ifdim0#1pt=\!!zeropoint
+ \drawTPICpath\using#1\endspecial
+ \else\ifdim0#1pt<\!!zeropoint
+ \mimmickspecial dt\using#1\endspecial
+ \else
+ \mimmickspecial da\using#1\endspecial
+ \fi\fi}
+
+\redefinespecial sp
+ {\startTPICspecials\TPICdrawtrue\TPICcurvetrue\drawTPICpath}
+
+\redefinespecial ip
+ {\startTPICspecials\TPICfilltrue\drawTPICpath}
+
+\redefinespecial ar
+ {\startTPICspecials\TPICdrawtrue\drawTPICarc}
+
+\redefinespecial ia
+ {\startTPICspecials\TPICfilltrue\drawTPICarc}
+
+%D These substitutes use two auxiliary macros that take care of
+%D actually drawing the shape or arc. Here we use the stored
+%D linetype (solid, dashed, dotted) and color (grayscale).
+
+\def\drawTPICpath\using#1\endspecial
+ {\bgroup
+ \ifTPICdraw
+ \def\TPICgrayscale{}%
+ \fi
+ \startMPdrawing
+ \ifTPICfill fill\fi\ifTPICdraw draw\fi\space
+ for i:=1 upto \the\TPICcounter-1:
+ p[i]\ifTPICcurve..\else--\fi
+ endfor
+ p[\the\TPICcounter]
+ \ifTPICfill\ifTPICcurve..\else--\fi cycle \fi
+ \TPIClinetype\space\TPICgrayscale;
+ \stopMPdrawing
+ \resetTPICvariables
+ \egroup}
+
+%D I have to admit that at the moment I wrote this macro, I
+%D could not write this piece of \METAPOST. Fortunately
+%D Thortsen Ohl promptly answered the question I posted to the
+%D \METAFONT\ discussion list.
+
+\def\drawTPICarc\using#1 #2 #3 #4 #5 #6\endspecial
+ {\bgroup
+ \ifTPICdraw
+ \def\TPICgrayscale{}%
+ \fi
+ \dimen 0=#1pt\dimen 0=.07227\dimen 0
+ \dimen 2=#2pt\dimen 2=.07227\dimen 2
+ \dimen10=#3pt\dimen10=.14454\dimen10
+ \dimen12=#4pt\dimen12=.14454\dimen12
+ \dimen20=#5pt
+ \dimen22=#6pt
+ \startMPdrawing
+ \ifTPICfill fill\fi\ifTPICdraw draw\fi \space
+ \ifTPICfill\else subpath 4/3.14159*(\the\dimen20,\the\dimen22) of \fi
+ fullcircle xscaled \the\dimen10 \space yscaled \the\dimen12 \space
+ shifted (\the\dimen0,\the\dimen2)
+ \TPIClinetype \space \TPICgrayscale;
+ \stopMPdrawing
+ \resetTPICvariables
+ \egroup}
+
+%D Resetting the variables need to be done globally because we
+%D cannot be sure if any further grouping is used by the
+%D envelopping macros.
+
+\def\resetTPICvariables
+ {\global\TPICcounter\zerocount
+ \global\TPICfillfalse
+ \global\TPICdrawfalse
+ \global\let\TPIClinetype\empty
+ \global\let\TPICgrayscale\empty}
+
+%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:
+%D
+%D \starttyping
+%D \special{pa 2000 1000}
+%D \special{pa 1000 2000}
+%D \special{pa 0000 1000}
+%D \special{pa 1000 0000}
+%D \special{pa 2000 1000}
+%D \special{sp}
+%D \stoptyping
+%D
+%D One would expect that this code produced a closed circle,
+%D but the curve that comes out using b-splines is far from
+%D round. We can however savely asume that the arc producing
+%D specials will be used for drawing circle fragments, while
+%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 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.
+
+\protect \endinput
diff --git a/tex/context/base/supp-vis.tex b/tex/context/base/supp-vis.tex
new file mode 100644
index 000000000..f38c8e1e3
--- /dev/null
+++ b/tex/context/base/supp-vis.tex
@@ -0,0 +1,1907 @@
+%D \module
+%D [ file=supp-vis,
+%D version=1996.10.21,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Visualization,
+%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.
+
+% no longer generic, who cares ...
+
+%D \gdef\ShowBufferedExample% private typeseting macro
+%D {\startlinecorrection
+%D \bgroup
+%D \setuptyping[margin=0pt,option=color]
+%D \showmakeup
+%D \centeredvcuetrue
+%D \dontinterfere
+%D \baselinerulefalse
+%D \normalvbox
+%D {\normalhbox to \hsize
+%D {$\hsize=.5\hsize
+%D \advance\hsize by -.5em
+%D \normalvcenter{\vbox{\getbuffer}}\normalhss
+%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}}
+%D \egroup
+%D \stoplinecorrection}
+%D
+%D \gdef\ShowBufferedExampleBox% private typeseting macro
+%D {\startlinecorrection
+%D \bgroup
+%D \setuptyping[margin=0pt,option=color]
+%D \showmakeup
+%D \centeredvcuetrue
+%D \dontinterfere
+%D \baselinerulefalse
+%D \normalvbox
+%D {\normalhbox to \hsize
+%D {$\hsize=.5\hsize
+%D \advance\hsize by -.5em
+%D \normalvcenter{\baselineruletrue\vbox{\getbuffer}}\normalhss
+%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}}
+%D \egroup
+%D \stoplinecorrection}
+
+%D Although an integral part of \CONTEXT, this module is one
+%D of the support modules. Its stand alone character permits
+%D use in \PLAIN\ \TEX\ or \TEX\ based macropackages.
+%D \ifCONTEXT \else If in some examples the verbatim listings
+%D don't show up nice, this is due to processing by a system
+%D that does not support buffering. In \CONTEXT\ we show the
+%D commands in the margin, use bit more advanced way of
+%D numbering, and typeset the source in \TEX nicolored
+%D verbatim. Sorry for this inconvenience.\fi
+%D
+%D Depending on my personal needs and those of whoever uses it,
+%D the macros will be improved in terms of visualization,
+%D efficiency and compatibility. These rather low level
+%D visualization macros are supplemented by ones that can
+%D visualize baselines, the page layout and whatever deserves
+%D attention. Most of those macros can be found in \type
+%D {core-vis} and other core modules. Their integration in
+%D \CONTEXT\ prohibits generic applications.
+
+\ifx \undefined \writestatus \input supp-mis.tex \fi
+
+%D One of the strong points of \TEX\ is abstraction of textual
+%D input. When macros are defined well and do what we
+%D want them to do, we will seldom need the tools present in
+%D What You See Is What You Get systems. For instance, when
+%D entering text we don't need rulers, because no manual
+%D shifting and/or alignment of text is needed. On the other
+%D hand, when we are designing macros or specifying layout
+%D elements, some insight in \TEX's advanced spacing, kerning,
+%D filling, boxing and punishment abilities will be handy.
+%D That's why we've implemented a mechanism that shows some of
+%D the inner secrets of \TEX.
+
+\writestatus{loading}{ConTeXt Support Macros / Visualization}
+
+%D In this module we are going to redefine some \TEX\
+%D primitives and \PLAIN\ macro's. Their original meaning is
+%D saved in macros with corresponding names, preceded by
+%D \type{normal}. These original macros are (1)~used to
+%D temporary restore the old values when needed and
+%D (2)~used to prevent recursive calls in the macros that
+%D replace them.
+
+\unprotect
+
+\let\visualvrule\vrule
+\let\visualhrule\hrule
+
+%D \macros
+%D {dontinterfere}
+%D
+%D Indentation, left and/or right skips, redefinition of
+%D \type{\par} and assignments to \type{\everypar} can lead to
+%D unwanted results. We can therefore turn all those things
+%D off with \type{\dontinterfere}.
+
+\def\dontinterfere
+ {\everypar \emptytoks
+ \let\par \endgraf
+ \parindent\zeropoint
+ \parskip \zeropoint
+ \leftskip \zeropoint
+ \rightskip\zeropoint
+ \relax}
+
+%D \macros
+%D {dontcomplain}
+%D
+%D In this module we do a lot of box manipulations. Because we
+%D don't want to be confronted with to many over- and underfull
+%D messages we introduce \type{\dontcomplain}.
+
+\def\dontcomplain
+ {\hbadness\!!tenthousand \vbadness\hbadness
+ \hfuzz \maxdimen \vfuzz \hfuzz}
+
+% This obsolete dutch name is sometimes uses in manual styles; when
+% cleaning up the codebase I decided to move this definition here.
+
+\let\mindermeldingen\dontcomplain
+
+%D \macros
+%D {normaloffinterlineskip}
+%D
+%D The next hack is needed because in \CONTEXT\ we redefine
+%D \type{\offinterlineskip}.
+
+\ifx\undefined\normaloffinterlineskip
+ \let\normaloffinterlineskip\offinterlineskip
+\fi
+
+%D \macros
+%D {normalhbox,
+%D normalvbox,normalvtop}
+%D
+%D There are three types of boxes, one horizontal and two
+%D vertical in nature. As we will see later on, all three types
+%D are to be handled according to their orientation and
+%D baseline behavior. Especially \type{\vtop}'s need our
+%D special attention.
+
+% already saved
+
+%D \macros
+%D {normalhskip,
+%D normalvskip}
+%D
+%D Next come the flexible skips, which come in two flavors
+%D too. Like boxes these are handled with \TEX\ primitives.
+
+% already saved
+
+%D \macros
+%D {normalpenalty,
+%D normalkern}
+%D
+%D Both penalties and kerns are taken care of by mode sensitive
+%D primitives. This means that when making them visible, we
+%D have to take the current mode into account.
+
+% already saved
+
+%D \macros
+%D {normalhglue,
+%D normalvglue}
+%D
+%D Glues on the other hand are macro's defined in \PLAIN\ \TEX.
+%D As we will see, their definitions make the implementation of
+%D their visible counterparts a bit more \TeX{}nical.
+
+\let\normalhglue = \hglue
+\let\normalvglue = \vglue
+
+%D \macros
+%D {normalmkern,
+%D normalmskip}
+%D
+%D Math mode has its own spacing primitives, preceded by
+%D \type{m}. Due to the relation with the current font and the
+%D way math is typeset, their unit \type{mu} is not compatible
+%D with other dimensions. As a result, the visual appearance
+%D of these primitives is kept primitive too.
+
+% already saved
+
+%D \macros
+%D {hfilneg,
+%D vfilneg}
+%D
+%D Fills can be made visible quite easy. We only need some
+%D additional negation macros. Because \PLAIN\ \TEX\ only
+%D offers \type{\hfilneg} and \type{\vfilneg}, we define our
+%D own alternative double \type{ll}'ed ones.
+
+\def\hfilneg {\normalhskip\zeropoint \!!plus-1fil\relax}
+\def\vfilneg {\normalvskip\zeropoint \!!plus-1fil\relax}
+\def\hfillneg {\normalhskip\zeropoint \!!plus-1fill\relax}
+\def\vfillneg {\normalvskip\zeropoint \!!plus-1fill\relax}
+\def\hfilllneg{\normalhskip\zeropoint \!!plus-1filll\relax}
+\def\vfilllneg{\normalvskip\zeropoint \!!plus-1filll\relax}
+
+%D \macros
+%D {normalhss,normalhfil,normalhfill,
+%D normalvss,normalvfil,normalvfill}
+%D
+%D The positive stretch primitives are used independant and in
+%D combination with \type{\leaders}.
+
+% already saved
+
+%D \macros
+%D {normalhfilneg,normalhfillneg,
+%D normalvfilneg,normalvfillneg}
+%D
+%D Keep in mind that both \type{\hfillneg} and \type{\vfillneg}
+%D are not part of \PLAIN\ \TEX\ and therefore not documented
+%D in standard \TEX\ documentation. They can nevertheless be
+%D used at will.
+
+\let\normalhfillneg = \hfillneg
+\let\normalvfillneg = \vfillneg
+
+%D Visualization is not always wanted. Instead of turning this
+%D option off in those (unpredictable) situations, we just
+%D redefine a few \PLAIN\ macros.
+
+\ifx\tlap\undefined
+
+ \def\rlap#1{\normalhbox to \zeropoint{#1\normalhss}}
+ \def\llap#1{\normalhbox to \zeropoint{\normalhss#1}}
+ \def\blap#1{\normalvbox to \zeropoint{#1\normalvss}}
+ \def\tlap#1{\normalvbox to \zeropoint{\normalvss#1}}
+
+\fi
+
+\ifx\contextversion\undefined \def~{\normalpenalty\!!tenthousand\ } \fi
+
+%D \macros
+%D {makeruledbox}
+%D
+%D Ruled boxes can be typeset is many ways. Here we present
+%D just one alternative. This implementation may be a little
+%D complicated, but it supports all three kind of boxes. The
+%D next command expects a \BOX\ specification, like:
+%D
+%D \starttyping
+%D \makeruledbox0
+%D \stoptyping
+
+%D \macros
+%D {baselinerule,baselinefill}
+%D
+%D We can make the baseline of a box visible, both dashed and
+%D as a rule. The line is drawn on top of the baseline. All
+%D we have to say is:
+%D
+%D \starttyping
+%D \baselineruletrue
+%D \baselinefilltrue
+%D \stoptyping
+%D
+%D At the cost of some overhead these alternatives are
+%D implemented using \type{\if}'s:
+
+\newif\ifbaselinerule \baselineruletrue
+\newif\ifbaselinefill \baselinefillfalse
+
+%D \macros
+%D {iftoprule,ifbottomrule,ifleftrule,ifrightrule}
+%D
+%D Rules can be turned on and off, but by default we have:
+%D
+%D \starttyping
+%D \topruletrue
+%D \bottomruletrue
+%D \leftruletrue
+%D \rightruletrue
+%D \stoptyping
+%D
+%D As we see below:
+
+\newif\iftoprule \topruletrue
+\newif\ifbottomrule \bottomruletrue
+\newif\ifleftrule \leftruletrue
+\newif\ifrightrule \rightruletrue
+
+%D \macros
+%D {boxrulewidth}
+%D
+%D The width in the surrounding rules can be specified by
+%D assigning an apropriate value to the dimension used. This
+%D module defaults the width to:
+%D
+%D \starttyping
+%D \boxrulewidth=.2pt
+%D \stoptyping
+%D
+%D Although we are already low on \DIMENSIONS\ it's best to
+%D spend one here, mainly because it enables easy manipulation,
+%D like multiplication by a given factor.
+
+\newdimen\boxrulewidth \boxrulewidth=.2pt
+
+%D The core macro \type{\makeruledbox} looks a bit hefty. The
+%D manipulation at the end is needed because we want to
+%D preserve both the mode and the baseline. This means that
+%D \type{\vtop}'s and \type{\vbox}'es behave the way we expect
+%D them to do.
+%D
+%D \startlinecorrection
+%D \hbox
+%D {\ruledhbox to 5em{\strut test\normalhss}\hskip1em
+%D \ruledvbox{\hsize 5em\strut test \par test\strut}\hskip1em
+%D \ruledvtop{\hsize 5em\strut test \par test\strut}}
+%D \stoplinecorrection
+%D
+%D The \type{\cleaders} part of the macro is responsible for
+%D the visual baseline. The \type{\normalhfill} belongs to this
+%D primitive too. By storing and restoring the height and depth
+%D of box \type{#1}, we preserve the mode.
+
+\let\dowithruledbox\relax
+
+\let\ruledheight\!!zeropoint
+\let\ruleddepth \!!zeropoint
+\let\ruledwidth \!!zeropoint
+
+\def\makeruledbox#1%
+ {\edef\ruledheight{\the\ht#1}%
+ \edef\ruleddepth {\the\dp#1}%
+ \edef\ruledwidth {\the\wd#1}%
+ \setbox\scratchbox\normalvbox
+ {\dontcomplain
+ \normaloffinterlineskip
+ \visualhrule
+ \!!height\boxrulewidth
+ \iftoprule\else\!!width\zeropoint\fi
+ \normalvskip-\boxrulewidth
+ \normalhbox to \ruledwidth
+ {\visualvrule
+ \!!height\ruledheight
+ \!!depth\ruleddepth
+ \!!width\ifleftrule\else0\fi\boxrulewidth
+ \ifdim\ruledheight>\zeropoint \else \baselinerulefalse \fi
+ \ifdim\ruleddepth>\zeropoint \else \baselinerulefalse \fi
+ \ifbaselinerule
+ \ifdim\ruledwidth<20\boxrulewidth
+ \baselinefilltrue
+ \fi
+ \cleaders
+ \ifbaselinefill
+ \visualhrule
+ \!!height\boxrulewidth
+ \else
+ \normalhbox
+ {\normalhskip2.5\boxrulewidth
+ \visualvrule
+ \!!height\boxrulewidth
+ \!!width5\boxrulewidth
+ \normalhskip2.5\boxrulewidth}%
+ \fi
+ \fi
+ \normalhfill
+ \visualvrule
+ \!!width\ifrightrule\else0\fi\boxrulewidth}%
+ \normalvskip-\boxrulewidth
+ \visualhrule
+ \!!height\boxrulewidth
+ \ifbottomrule\else\!!width\zeropoint\fi}%
+ \wd#1\zeropoint
+ \setbox#1=\ifhbox#1\normalhbox\else\normalvbox\fi
+ {\normalhbox
+ {\box#1%
+ \lower\ruleddepth\normalhbox{\dowithruledbox{\box\scratchbox}}}}%
+ \ht#1=\ruledheight
+ \wd#1=\ruledwidth
+ \dp#1=\ruleddepth}
+
+%D Just in case one didn't notice: the rules are in fact layed
+%D over the box. This way the contents of a box cannot
+%D visually interfere with the rules around (upon) it. A more
+%D advanced version of ruled boxes can be found in one of the
+%D core modules of \CONTEXT. There we take offsets, color,
+%D rounded corners, backgrounds and alignment into account too.
+
+%D \macros
+%D {ruledhbox,
+%D ruledvbox,ruledvtop,
+%D ruledvcenter}
+%D
+%D These macro's can be used instead of \type{\hbox},
+%D \type{\vbox}, \type{\vtop} and, when in math mode,
+%D \type{\vcenter}. They just do what their names state. Using
+%D an auxiliary macro would save us a few words of memory, but
+%D it would make their appearance even more obscure.
+%D
+%D \startbuffer
+%D \hbox
+%D {\strut
+%D one
+%D two
+%D \hbox{three}
+%D four
+%D five}
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledhbox
+ {\normalhbox\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalhbox}
+
+%D \startbuffer
+%D \vbox
+%D {\strut
+%D first line \par
+%D second line \par
+%D third line \par
+%D fourth line \par
+%D fifth line
+%D \strut }
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvbox
+ {\normalvbox\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalvbox}
+
+%D \startbuffer
+%D \vtop
+%D {\strut
+%D first line \par
+%D second line \par
+%D third line \par
+%D fourth line \par
+%D fifth line
+%D \strut }
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvtop
+ {\normalvtop\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalvtop}
+
+%D \startbuffer
+%D \hbox
+%D {$\vcenter{\hsize.2\hsize
+%D alfa \par beta}$
+%D $\vcenter to 3cm{\hsize.2\hsize
+%D alfa \par beta \par gamma}$
+%D $\vcenter{\hsize.2\hsize
+%D alfa \par beta}$}
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvcenter
+ {\normalvbox\bgroup
+ \dontinterfere
+ \dowithnextbox
+ {\scratchdimen.5\ht\nextbox
+ \advance\scratchdimen .5\dp\nextbox
+ \ht\nextbox\scratchdimen
+ \dp\nextbox\scratchdimen
+ \ruledhbox{\box\nextbox}%
+ \egroup}%
+ \normalvbox}
+
+%D \macros
+%D {ruledbox,
+%D setruledbox}
+%D
+%D Of the next two macros the first can be used to precede a
+%D box of ones own choice. One can for instance prefix boxes
+%D with \type{\ruledbox} and afterwards --- when the macro
+%D satisfy the needs --- let it to \type{\relax}.
+%D
+%D \starttyping
+%D \ruledbox\hbox{What rules do you mean?}
+%D \stoptyping
+%D
+%D The macro \type{\setruledbox} can be used to directly
+%D rule a box.
+%D
+%D \starttyping
+%D \setruledbox12=\hbox{Who's talking about rules here?}
+%D \stoptyping
+%D
+%D At the cost of some extra macros we can implement a
+%D variant that does not need the~\type{=}, but we stick to:
+
+\unexpanded\def\ruledbox
+ {\dowithnextbox{\makeruledbox\nextbox\box\nextbox}}
+
+\def\setruledbox#1=%
+ {\dowithnextbox{\makeruledbox\nextbox\setbox#1\nextbox}}
+
+%D \macros
+%D {investigateskip,
+%D investigatecount,
+%D investigatemuskip}
+%D
+%D Before we meet the visualizing macro's, we first implement
+%D ourselves some handy utility ones. Just for the sake of
+%D efficiency and readability, we introduce some status
+%D variables, that tell us a bit more about the registers we
+%D use:
+%D
+%D \starttyping
+%D \ifflexible
+%D \ifzero
+%D \ifnegative
+%D \ifpositive
+%D \stoptyping
+%D
+%D These status variables are set when we call for one of the
+%D investigation macros, e.g.
+%D
+%D \starttyping
+%D \investigateskip\scratchskip
+%D \stoptyping
+%D
+%D We use some dirty trick to check stretchability of \SKIPS.
+%D Users of these macros are invited to study their exact
+%D behavior first. The positive and negative states both
+%D include zero and are in fact non-negative ($\geq0$) and
+%D non-positive ($\leq0$) .
+
+\newif\ifflexible
+\newif\ifzero
+\newif\ifnegative
+\newif\ifpositive
+
+\def\investigateskip#1%
+ {\relax
+ \scratchdimen#1\relax
+ \edef\!!stringa{\the\scratchdimen}%
+ \edef\!!stringb{\the#1}%
+ \ifx\!!stringa\!!stringb \flexiblefalse \else \flexibletrue \fi
+ \ifdim#1=\zeropoint\relax
+ \zerotrue \else
+ \zerofalse \fi
+ \ifdim#1<\zeropoint\relax
+ \positivefalse \else
+ \positivetrue \fi
+ \ifdim#1>\zeropoint\relax
+ \negativefalse \else
+ \negativetrue \fi}
+
+% etex
+%
+% \def\investigateskip#1%
+% {\relax
+% \ifdim\scratchskip=\zeropoint
+% \ifdim\gluestretch\scratchskip=\zeropoint
+% \ifdim\glueshrink\scratchskip=\zeropoint
+% \flexiblefalse
+% \else
+% \flexibletrue
+% \fi
+% \else
+% \flexibletrue
+% \fi
+% \else
+% \flexibletrue
+% \fi
+% \ifdim#1=\zeropoint\relax
+% \zerotrue \else
+% \zerofalse \fi
+% \ifdim#1<\zeropoint\relax
+% \positivefalse \else
+% \positivetrue \fi
+% \ifdim#1>\zeropoint\relax
+% \negativefalse \else
+% \negativetrue \fi}
+
+\def\investigatecount#1%
+ {\relax
+ \flexiblefalse
+ \ifnum#1=\zerocount
+ \zerotrue \else
+ \zerofalse \fi
+ \ifnum#1<\zerocount
+ \positivefalse \else
+ \positivetrue \fi
+ \ifnum#1>\zerocount
+ \negativefalse \else
+ \negativetrue \fi}
+
+\def\investigatemuskip#1%
+ {\relax
+ \edef\!!stringa{\the\scratchmuskip}%
+ \edef\!!stringb{0mu}%
+ \def\!!stringc##1##2\\{##1}%
+ \expandafter\edef\expandafter\!!stringc\expandafter
+ {\expandafter\!!stringc\!!stringa\\}%
+ \edef\!!stringd{-}%
+ \flexiblefalse
+ \ifx\!!stringa\!!stringb
+ \zerotrue
+ \negativefalse
+ \positivefalse
+ \else
+ \zerofalse
+ \ifx\!!stringc\!!stringd
+ \positivefalse
+ \negativetrue
+ \else
+ \positivetrue
+ \negativefalse
+ \fi
+ \fi}
+
+%D Now the neccessary utility macros are defined, we can make a
+%D start with the visualizing ones. The implementation of these
+%D macros is a compromise between readability, efficiency of
+%D coding and processing speed. Sometimes we do in steps what
+%D could have been done in combination, sometimes we use a few
+%D boxes more or less then actually needed, and more than once
+%D one can find the same piece of rule drawing code twice.
+
+%D \macros
+%D {ifcenteredvcue,normalvcue}
+%D
+%D Depending on the context, one can force visual vertical cues
+%D being centered along \type{\hsize} or being put at the
+%D current position. Although centering often looks better,
+%D we've chosen the second alternative as default. The main
+%D reason for doing so is that often when we don't set the
+%D \type{\hsize} ourselves, \TEX\ takes the value of the
+%D surrounding box. As a result the visual cues can migrate
+%D outside the current context.
+%D
+%D This behavior is accomplished by a small but effective
+%D auxiliary macro, which behavior can be influenced by the
+%D boolean \type{\centeredvcue}. By saying
+%D
+%D \starttyping
+%D \centeredvcuetrue
+%D \stoptyping
+%D
+%D one turns centering on. As said, we turn it off.
+
+\newif\ifcenteredvcue \centeredvcuefalse
+
+\def\normalvcue#1%
+ {\normalhbox \ifcenteredvcue to \hsize \fi {\normalhss#1\normalhss}}
+
+%D We could have used the more robust version
+%D
+%D \starttyping
+%D \def\normalvcue%
+%D {\normalhbox \ifcenteredvcue to \hsize \fi
+%D \bgroup\bgroup\normalhss
+%D \aftergroup\normalhss\aftergroup\egroup
+%D \let\next=}
+%D \stoptyping
+%D
+%D or the probably best one:
+%D
+%D \starttyping
+%D \def\normalvcue%
+%D {\hbox \ifcenteredvcue to \hsize
+%D \bgroup\bgroup\normalhss
+%D \aftergroup\normalhss\aftergroup\egroup
+%D \else
+%D \bgroup
+%D \fi
+%D \let\next=}
+%D \stoptyping
+%D
+%D Because we don't have to preserve \CATCODES\ and only use
+%D small arguments, we stick to the first alternative.
+
+%D \macros
+%D {testrulewidth}
+%D
+%D We build our visual cues out of rules. At the cost of a much
+%D bigger \DVI\ file, this is to be prefered over using
+%D characters (1)~because we cannot be sure of their
+%D availability and (2)~because their dimensions are fixed.
+%D
+%D As with ruled boxes, we use a \DIMENSION\ to specify the
+%D width of the ruled elements. This dimension defaults to:
+%D
+%D \starttyping
+%D \testrulewidth=\boxrulewidth
+%D \stoptyping
+%D
+%D Because we prefer whole numbers for specifying the
+%D dimensions, we often use even multiples of
+%D \type{\testrulewidth}.
+
+%D \macros
+%D {visiblestretch}
+%D
+%D A second variable is introduced because of the stretch
+%D components of \SKIPS. At the cost of some accuracy we can
+%D make this stretch visible.
+%D
+%D \starttyping
+%D \visiblestretchtrue
+%D \stoptyping
+
+\newdimen\testrulewidth \testrulewidth=\boxrulewidth
+\newif\ifvisiblestretch \visiblestretchfalse
+
+%D \macros
+%D {ruledhss,
+%D ruledhfil,ruledhfilneg,
+%D ruledhfill,ruledhfillneg}
+%D
+%D We start with the easiest part, the fills. The scheme we
+%D follow is {\em visual filling -- going back -- normal
+%D filling}. Visualizing is implemented using \type{\cleaders}.
+%D Because the \BOX\ that follows this command is constructed
+%D only once, the \type{\copy} is not really a prerequisite. We
+%D prefer using a \type{\normalhbox} here instead of a
+%D \type{\hbox}.
+
+\def\setvisiblehfilbox#1\to#2#3#4%
+ {\setbox#1\normalhbox
+ {\visualvrule
+ \!!width #2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth #4\testrulewidth}%
+ \smashbox#1}
+
+\def\doruledhfiller#1#2#3#4%
+ {#1#2%
+ \bgroup
+ \dontinterfere
+ \dontcomplain
+ \setvisiblehfilbox0\to{4}{#3}{#4}%
+ \setvisiblehfilbox2\to422%
+ \copy0\copy2
+ \bgroup
+ \setvisiblehfilbox0\to422%
+ \cleaders
+ \normalhbox to 12\testrulewidth
+ {\normalhss\copy0\normalhss}%
+ #1%
+ \egroup
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth\copy0\copy2}%
+ \smashbox0%
+ \box0
+ \egroup}
+
+%D The horizontal fillers differ in their boundary
+%D visualization. Watch the small dots. Fillers can be
+%D combined within reasonable margins.
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hss}\ruledhss test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfil}\ruledhfil test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfill}\ruledhfill test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut
+%D \type{\hfil}\type{\hfil}\ruledhfil\ruledhfil
+%D test%
+%D \ruledhfil\type{\hfil}}
+%D \stoplinecorrection
+%D
+%D The negative counterparts are visualizes, but seldom
+%D become visible, apart from their boundaries.
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfilneg}\ruledhfilneg test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfillneg}\ruledhfillneg test}
+%D \stoplinecorrection
+%D
+%D Although leaders are used for visualizing, they are
+%D visualized themselves correctly as the next example shows.
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\cleaders\normalhbox to 2em{\normalhss$\circ$\normalhss}\ruledhfill}
+%D \stoplinecorrection
+%D
+%D All five substitutions use the same auxiliary macro. Watch
+%D the positive first -- negative next approach.
+
+\unexpanded\def\ruledhss
+ {\doruledhfiller\normalhss\normalhfilneg{0}{0}}
+
+\unexpanded\def\ruledhfil
+ {\doruledhfiller\normalhfil\normalhfilneg{10}{-6}}
+
+\unexpanded\def\ruledhfill
+ {\doruledhfiller\normalhfill\normalhfillneg{18}{-14}}
+
+\unexpanded\def\ruledhfilneg
+ {\doruledhfiller\normalhfilneg\normalhfil{-6}{10}}
+
+\unexpanded\def\ruledhfillneg
+ {\doruledhfiller\normalhfillneg\normalhfill{-14}{18}}
+
+%D \macros
+%D {ruledvss,
+%D ruledvfil,ruledvfilneg,
+%D ruledvfill,ruledvfillneg}
+%D
+%D The vertical mode commands adopt the same visualization
+%D scheme, but are implemented in a slightly different way.
+
+\def\setvisiblevfilbox#1\to#2#3#4%
+ {\setbox#1\normalhbox
+ {\visualvrule
+ \!!width #2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth #4\testrulewidth}%
+ \smashbox#1}%
+
+\def\doruledvfiller#1#2#3%
+ {#1#2%
+ \bgroup
+ \dontinterfere
+ \dontcomplain
+ \normaloffinterlineskip
+ \setvisiblevfilbox0\to422%
+ \setbox2\normalvcue
+ {\normalhskip -#3\testrulewidth\copy0}%
+ \smashbox2%
+ \copy2
+ \bgroup
+ \setbox2\normalvcue
+ {\normalhskip -2\testrulewidth\copy0}%
+ \smashbox2%
+ \copy2
+ \cleaders
+ \normalvbox to 12\testrulewidth
+ {\normalvss\copy2\normalvss}%
+ #1%
+ \setbox2\normalvbox
+ {\normalvskip-2\testrulewidth\copy2}%
+ \smashbox2%
+ \box2
+ \egroup
+ \box2
+ \egroup}
+
+%D Because they act the same as their horizontal counterparts
+%D we only show a few examples.
+%D
+%D \startlinecorrection
+%D \hbox to \hsize
+%D {\dontinterfere
+%D \baselinerulefalse
+%D \centeredvcuetrue
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vss}\ruledvss last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfil}\ruledvfil last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfill}\ruledvfill last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfilneg}\ruledvfilneg last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfillneg}\ruledvfillneg last line}}
+%D \stoplinecorrection
+%D
+%D Keep in mind that \type{\vfillneg} is not part of \PLAIN\
+%D \TEX, but are mimmicked by a macro.
+
+\unexpanded\def\ruledvss {\doruledvfiller\normalvss \normalvfilneg {2}}
+\unexpanded\def\ruledvfil {\doruledvfiller\normalvfil \normalvfilneg {-4}}
+\unexpanded\def\ruledvfill {\doruledvfiller\normalvfill \normalvfillneg{-12}}
+\unexpanded\def\ruledvfilneg {\doruledvfiller\normalvfilneg \normalvfil {8}}
+\unexpanded\def\ruledvfillneg{\doruledvfiller\normalvfillneg\normalvfill {16}}
+
+%D \macros
+%D {ruledhskip}
+%D
+%D Skips differ from kerns in two important aspects:
+%D
+%D \startitemize[packed]
+%D \item line and pagebreaks are allowed at a skip
+%D \item skips can have a positive and/or negative
+%D stretchcomponent
+%D \stopitemize
+%D
+%D Stated a bit different: kerns are fixed skips at which no
+%D line or pagebreak can occur. Because skips have a more open
+%D character, they are visualized in a open way.
+%D
+%D \startbuffer
+%D one
+%D \hskip +30pt plus 5pt
+%D two
+%D \hskip +30pt
+%D \hskip -10pt plus 5pt
+%D three
+%D \hskip 0pt
+%D four
+%D \hskip +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D When skips have a stretch component, this is visualized by
+%D means of a dashed line. Positive skips are on top of the
+%D baseline, negative ones are below it. This way we can show
+%D the combined results. An alternative visualization of
+%D stretch could be drawing the mid line over a length of the
+%D stretch, in positive or negative direction.
+
+\def\doruledhskip
+ {\relax
+ \dontinterfere
+ \dontcomplain
+ \investigateskip\scratchskip
+ \ifzero
+ \setbox0\normalhbox
+ {\normalhskip-\testrulewidth
+ \visualvrule
+ \!!width4\testrulewidth
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth}%
+ \else
+ \setbox0\normalhbox to \ifnegative-\fi\scratchskip
+ {\visualvrule
+ \!!width2\testrulewidth
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth
+ \cleaders
+ \visualhrule
+ \ifnegative
+ \!!depth2\testrulewidth
+ \!!height\zeropoint
+ \else
+ \!!height2\testrulewidth
+ \!!depth\zeropoint
+ \fi
+ \normalhfill
+ \ifflexible
+ \normalhskip\ifnegative\else-\fi\scratchskip
+ \normalhskip2\testrulewidth
+ \cleaders
+ \normalhbox
+ {\normalhskip 2\testrulewidth
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height\ifnegative-7\else9\fi\testrulewidth
+ \!!depth\ifnegative9\else-7\fi\testrulewidth
+ \normalhskip 2\testrulewidth}%
+ \normalhfill
+ \fi
+ \visualvrule
+ \!!width2\testrulewidth
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth}%
+ \setbox0\normalhbox
+ {\ifnegative\else\normalhskip-\scratchskip\fi
+ \box0}%
+ \fi
+ \smashbox0%
+ \ifvisiblestretch \else
+ \flexiblefalse
+ \fi
+ \ifflexible
+ % breaks ok but small displacements can occur
+ \skip2\scratchskip
+ \advance\skip2 -1\scratchskip
+ \divide\skip2 2
+ \advance\scratchskip -\skip2
+ \normalhskip\scratchskip
+ \normalpenalty\!!tenthousand
+ \box0
+ \normalhskip\skip2
+ \else
+ \normalhskip\scratchskip
+ \box0
+ \fi
+ \egroup}
+
+\unexpanded\def\ruledhskip
+ {\bgroup
+ \afterassignment\doruledhskip
+ \scratchskip=}
+
+%D The visual skip is located at a feasible point. Normally
+%D this does not interfere with the normaltypesetting process.
+%D The next examples show (1)~the default behavior, (2)~the
+%D (not entirely correct) distributed stretch and (3)~the way
+%D the text is typeset without cues.
+%D
+%D \startbuffer
+%D \dorecurse
+%D {15}
+%D {test\hskip1em plus .5em minus .5em
+%D test\hskip2em
+%D test}
+%D \stopbuffer
+%D
+%D \startlinecorrection
+%D \showmakeup
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \showmakeup
+%D \visiblestretchtrue
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+
+%D \macros
+%D {ruledvskip}
+%D
+%D We are less fortunate when implementing the vertical skips.
+%D This is a direct result of interference between the boxes that
+%D visualize the skip and skip removal at a pagebreak. Normally
+%D skips disappear at the top of a page, but not of course when
+%D visualized in a \type{\vbox}. A quite perfect simulation
+%D could have been built if we would have had available two
+%D more primitives: \type{\hnop} and \type{\vnop}. These new
+%D primitives could stand for boxes that are visible but are
+%D not taken into account in any way. They are there for us,
+%D but not for \TEX.
+%D
+%D \startbuffer
+%D first line
+%D \vskip +30pt plus 5pt
+%D second line
+%D \vskip +30pt
+%D \vskip -10pt plus 5pt
+%D third line
+%D \par
+%D fourth line
+%D \vskip +30pt
+%D fifth line
+%D \vskip 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D We have to postpone \type{\prevdepth}. Although this
+%D precaution probably is not completely waterproof, it works
+%D quite well.
+
+\def\dodoruledvskip
+ {\nextdepth\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \normaloffinterlineskip
+ \investigateskip\scratchskip
+ \ifzero
+ \setbox0\normalvcue
+ {\visualvrule
+ \!!width32\testrulewidth
+ \!!height2\testrulewidth
+ \!!depth2\testrulewidth}%
+ \else
+ \setbox0\normalvbox to \ifnegative-\fi\scratchskip
+ {\visualhrule
+ \!!width16\testrulewidth
+ \!!height2\testrulewidth
+ \ifflexible
+ \cleaders
+ \normalhbox to 16\testrulewidth
+ {\normalhss
+ \normalvbox
+ {\normalvskip 2\testrulewidth
+ \visualhrule
+ \!!width2\testrulewidth
+ \!!height2\testrulewidth
+ \normalvskip 2\testrulewidth}%
+ \normalhss}%
+ \normalvfill
+ \else
+ \normalvfill
+ \fi
+ \visualhrule
+ \!!width16\testrulewidth
+ \!!height2\testrulewidth}%
+ \setbox2\normalvbox to \ht0
+ {\visualhrule
+ \!!width2\testrulewidth
+ \!!height\ht0}%
+ \ifnegative
+ \ht0\zeropoint
+ \setbox0\normalhbox
+ {\normalhskip2\testrulewidth % will be improved
+ \normalhskip-\wd0\box0}%
+ \fi
+ \smashbox0%
+ \smashbox2%
+ \setbox0\normalvcue
+ {\box2\box0}%
+ \setbox0\normalvbox
+ {\ifnegative\normalvskip\scratchskip\fi\box0}%
+ \smashbox0%
+ \fi
+ \ifvisiblestretch
+ \ifflexible
+ \skip2\scratchskip
+ \advance\skip2 -1\scratchskip
+ \divide\skip2 2
+ \advance\scratchskip -\skip2
+ \normalvskip\skip2
+ \fi
+ \fi
+ \normalpenalty\!!tenthousand
+ \box0
+ \prevdepth\nextdepth % not \dp0=\nextdepth
+ \normalvskip\scratchskip}
+
+%D We try to avoid interfering at the top of a page. Of course
+%D we only do so when we are in the main vertical list.
+
+\def\doruledvskip
+ {\endgraf % \par
+ \ifdim\pagegoal=\maxdimen
+ \ifinner
+ \dodoruledvskip
+ \fi
+ \else
+ \dodoruledvskip
+ \fi
+ \egroup}
+
+\unexpanded\def\ruledvskip
+ {\bgroup
+ \afterassignment\doruledvskip
+ \scratchskip=}
+
+%D \macros
+%D {ruledkern}
+%D
+%D The macros that implement the kerns are a bit more
+%D complicated than needed, because they also serve the
+%D visualization of glue, our \PLAIN\ defined kerns with
+%D stretch or shrink. We've implemented both horizontal and
+%D vertical kerns as ruled boxes.
+%D
+%D \startbuffer
+%D one
+%D \kern +30pt
+%D two
+%D \kern +30pt
+%D \kern -10pt
+%D three
+%D \kern 0pt
+%D four
+%D \kern +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D Positive and negative kerns are placed on top or below the
+%D baseline, so we are able to track their added result. We
+%D didn't mention spacings of 0~pt yet. Zero values are
+%D visualized a bit different, because we want to see them
+%D anyhow.
+
+\def\doruledhkern
+ {\dontinterfere
+ \dontcomplain
+ \baselinerulefalse
+ \investigateskip\scratchskip
+ \boxrulewidth2\testrulewidth
+ \ifzero
+ \setbox0\ruledhbox to 8\testrulewidth
+ {\visualvrule
+ \!!width\zeropoint
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth}%
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth\box0}%
+ \else
+ \setbox0\ruledhbox to \ifnegative-\fi\scratchskip
+ {\visualvrule
+ \!!width\zeropoint
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth
+ \ifflexible
+ \normalhskip2\testrulewidth
+ \cleaders
+ \normalhbox
+ {\normalhskip 2\testrulewidth
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height\ifnegative-7\else9\fi\testrulewidth
+ \!!depth\ifnegative9\else-7\fi\testrulewidth
+ \normalhskip 2\testrulewidth}%
+ \normalhfill
+ \else
+ \normalhfill
+ \fi}%
+ \testrulewidth2\testrulewidth
+ \setbox0\ruledhbox{\box0}% \make...
+ \fi
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \normalhbox to \zeropoint
+ {\ifnegative\normalhskip1\scratchskip\fi
+ \box0}%
+ \afterwards\scratchskip
+ \egroup}
+
+\unexpanded\def\ruledhkern#1%
+ {\bgroup
+ \let\afterwards#1%
+ \afterassignment\doruledhkern
+ \scratchskip=}
+
+%D After having seen the horizontal ones, the vertical kerns
+%D will not surprise us. In this example we use \type{\par} to
+%D switch to vertical mode.
+%D
+%D \startbuffer
+%D first line
+%D \par \kern +30pt
+%D second line
+%D \par \kern +30pt
+%D \par \kern -10pt
+%D third line
+%D \par
+%D fourth line
+%D \par \kern +30pt
+%D fifth line
+%D \par \kern 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D Like before, we have to postpone \type{\prevdepth}. If we
+%D leave out this trick, we got ourselves some wrong spacing.
+
+\def\dodoruledvkern
+ {\nextdepth\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \baselinerulefalse
+ \normaloffinterlineskip
+ \investigateskip\scratchskip
+ \boxrulewidth2\testrulewidth
+ \ifzero
+ \setbox0\ruledhbox to 32\testrulewidth
+ {\visualvrule
+ \!!width\zeropoint
+ \!!height4\testrulewidth
+ \!!depth4\testrulewidth}%
+ \else
+ \setbox0\ruledvbox to \ifnegative-\fi\scratchskip
+ {\hsize16\testrulewidth
+ \ifflexible
+ \cleaders
+ \normalhbox to 16\testrulewidth
+ {\normalhss
+ \normalvbox
+ {\normalvskip 2\testrulewidth
+ \visualhrule
+ \!!width2\testrulewidth
+ \!!height2\testrulewidth
+ \normalvskip 2\testrulewidth}%
+ \normalhss}%
+ \normalvfill
+ \else
+ \visualvrule
+ \!!width\zeropoint
+ \!!height\ifnegative-\fi\scratchskip
+ \normalhfill
+ \fi}
+ \fi
+ \testrulewidth2\testrulewidth
+ \setbox0\ruledvbox{\box0}% \make...
+ \smashbox0%
+ \setbox0\normalvbox
+ {\ifnegative\normalvskip\scratchskip\fi
+ \normalvcue
+ {\ifnegative\normalhskip-16\testrulewidth\fi\box0}}%
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \box0
+ \prevdepth\nextdepth} % not \dp0=\nextdepth
+
+\def\doruledvkern
+ {\ifdim\pagegoal=\maxdimen
+ \ifinner
+ \dodoruledvkern
+ \fi
+ \else
+ \dodoruledvkern
+ \fi
+ \afterwards\scratchskip
+ \egroup}
+
+\unexpanded\def\ruledvkern#1%
+ {\bgroup
+ \let\afterwards#1\relax
+ \afterassignment\doruledvkern
+ \scratchskip=}
+
+\unexpanded\def\ruledkern
+ {\ifvmode
+ \expandafter\ruledvkern
+ \else
+ \expandafter\ruledhkern
+ \fi
+ \normalkern}
+
+%D A a bit more \TEX nice solution is:
+%D
+%D \starttyping
+%D \unexpanded\def\ruledkern%
+%D {\csname ruled\ifvmode v\else h\fi kern\endcsname\normalkern}
+%D \stoptyping
+
+%D \macros
+%D {ruledhglue,ruledvglue}
+%D
+%D The non-primitive glue commands are treated as kerns with
+%D stretch. This stretch is presented as a dashed line. I
+%D have to admit that until now, I've never used these glue
+%D commands.
+%D
+%D \startbuffer
+%D one
+%D \hglue +30pt plus 5pt
+%D two
+%D \hglue +30pt
+%D \hglue -10pt plus 5pt
+%D three
+%D \hglue 0pt
+%D four
+%D \hglue +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledhglue
+ {\leavevmode
+ \scratchcounter\spacefactor
+ \visualvrule\!!width\zeropoint
+ \normalpenalty\!!tenthousand
+ \ruledhkern\normalhskip\scratchskip
+ \spacefactor\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledhglue
+ {\bgroup
+ \afterassignment\doruledhglue\scratchskip=}
+
+%D \startbuffer
+%D first line
+%D \vglue +30pt plus 5pt
+%D second line
+%D \vglue +30pt
+%D \vglue -10pt plus 5pt
+%D third line
+%D \par
+%D fourth line
+%D \vglue +30pt
+%D fifth line
+%D \vglue 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledvglue
+ {\endgraf % \par
+ \nextdepth\prevdepth
+ \visualhrule\!!height\zeropoint
+ \normalpenalty\!!tenthousand
+ \ruledvkern\normalvskip\scratchskip
+ \prevdepth\nextdepth
+ \egroup}
+
+\unexpanded\def\ruledvglue
+ {\bgroup
+ \afterassignment\doruledvglue\scratchskip=}
+
+%D \macros
+%D {ruledmkern,ruledmskip}
+%D
+%D Mathematical kerns and skips are specified in mu. This
+%D font related unit is incompatible with those of \DIMENSIONS\
+%D and \SKIPS. Because in math mode spacing is often a very
+%D subtle matter, we've used a very simple, not overloaded way
+%D to show them.
+
+\def\dodoruledmkern#1%
+ {\dontinterfere
+ \dontcomplain
+ \setbox0\normalhbox
+ {$\normalmkern\ifnegative-\fi\scratchmuskip$}%
+ \setbox0\normalhbox to \wd0
+ {\visualvrule
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth
+ \!!width\testrulewidth
+ \leaders
+ \visualhrule
+ \!!height\ifpositive16\else-14\fi\testrulewidth
+ \!!depth\ifpositive-14\else16\fi\testrulewidth
+ \normalhfill
+ \ifflexible
+ \normalhskip-\wd0
+ \leaders
+ \visualhrule
+ \!!height\testrulewidth
+ \!!depth\testrulewidth
+ \normalhfill
+ \fi
+ \visualvrule
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth
+ \!!width\testrulewidth}%
+ \smashbox0%
+ \ifnegative
+ #1\scratchmuskip
+ \box0
+ \else
+ \box0
+ #1\scratchmuskip
+ \fi
+ \egroup}
+
+%D \startbuffer
+%D $a \mkern3mu = \mkern3mu
+%D b \quad
+%D \mkern-2mu + \mkern-2mu
+%D \quad c$
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledmkern
+ {\investigatemuskip\scratchmuskip
+ \flexiblefalse
+ \dodoruledmkern\normalmkern}
+
+\unexpanded\def\ruledmkern
+ {\bgroup
+ \afterassignment\doruledmkern\scratchmuskip=}
+
+%D \startbuffer
+%D $a \mskip3mu = \mskip3mu
+%D b \quad
+%D \mskip-2mu + \mskip-2mu
+%D \quad c$
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledmskip
+ {\investigatemuskip\scratchmuskip
+ \flexibletrue
+ \dodoruledmkern\normalmskip}
+
+\unexpanded\def\ruledmskip
+ {\bgroup
+ \afterassignment\doruledmskip\scratchmuskip=}
+
+%D \macros
+%D {penalty}
+%D
+%D After presenting fills, skip, kerns and glue we've come to
+%D see penalties. In the first implementation --- most of the
+%D time needed to develop this set of macros went into testing
+%D different types of visualization --- penalties were mere
+%D small blocks with one black half, depending on the sign.
+%D This most recent version also gives an indication of the
+%D amount of penalty. Penalties can go from less than $-10000$
+%D to over $+10000$, and their behavior is somewhat
+%D non-lineair, with some values having special meanings. We
+%D therefore decided not to use its value for a lineair
+%D indicator.
+%D
+%D \startbuffer
+%D one
+%D \penalty +100
+%D two
+%D \penalty +100
+%D \penalty -100
+%D three
+%D \penalty 0
+%D four
+%D \penalty +100
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D The small sticks at the side of the penalty indicate it
+%D size. The next example shows the positive and negative
+%D penalties of 0, 1, 10, 100, 1000 and 10000.
+%D
+%D \startlinecorrection
+%D \hbox
+%D {test \ruledhpenalty0
+%D test \ruledhpenalty1
+%D test \ruledhpenalty10
+%D test \ruledhpenalty100
+%D test \ruledhpenalty1000
+%D test \ruledhpenalty10000
+%D test}
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \hbox
+%D {test \ruledhpenalty0
+%D test \ruledhpenalty-1
+%D test \ruledhpenalty-10
+%D test \ruledhpenalty-100
+%D test \ruledhpenalty-1000
+%D test \ruledhpenalty-10000
+%D test}
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D This way stacked penalties of different severance can be
+%D shown in combination.
+%D
+%D test \ruledhpenalty10 \ruledhpenalty100
+%D test
+%D test \ruledhpenalty1000 \ruledhpenalty-1000
+%D test
+
+\def\setruledpenaltybox#1#2#3#4#5#6%
+ {\setbox#1\normalhbox
+ {\ifnum#2=0 \else
+ \edef\sign
+ {\ifnum#2>0 +\else-\fi}%
+ \dimen0=\ifnum\sign#2>9999
+ 28\else
+ \ifnum\sign#2>999
+ 22\else
+ \ifnum\sign#2>99
+ 16\else
+ \ifnum\sign#2>9
+ 10\else
+ 4
+ \fi\fi\fi\fi \testrulewidth
+ \ifnum#2<0
+ \normalhskip-\dimen0
+ \normalhskip-2\testrulewidth
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth
+ \fi
+ \visualvrule
+ \!!width\dimen0
+ \!!height#5\testrulewidth
+ \!!depth#6\testrulewidth
+ \ifnum#2>0
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth
+ \fi
+ \fi}%
+ \smashbox#1}
+
+\def\doruledhpenalty
+ {\dontinterfere
+ \dontcomplain
+ \investigatecount\scratchcounter
+ \testrulewidth2\testrulewidth
+ \boxrulewidth\testrulewidth
+ \setbox0\ruledhbox to 8\testrulewidth
+ {\ifnegative\else\normalhss\fi
+ \visualvrule
+ \!!depth8\testrulewidth
+ \!!width\ifzero0\else4\fi\testrulewidth
+ \ifpositive\else\normalhss\fi}%
+ \setruledpenaltybox{2}{\scratchcounter}{0}{8}{-3.5}{4.5}%
+ \normalpenalty\!!tenthousand
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth
+ \ifnegative
+ \box2\box0
+ \else
+ \box0\box2
+ \fi}%
+ \smashbox0%
+ \box0
+ \normalpenalty\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledhpenalty
+ {\bgroup
+ \afterassignment\doruledhpenalty
+ \scratchcounter=}
+
+%D The size of a vertical penalty is also shown on the
+%D horizontal axis. This way there is less interference with
+%D the often preceding or following skips and kerns.
+%D
+%D \startbuffer
+%D first line
+%D \par \penalty +100
+%D second line
+%D \par \penalty +100
+%D \par \penalty -100
+%D third line
+%D \par \penalty 0
+%D fourth line
+%D \par \penalty +100
+%D fifth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledvpenalty
+ {\ifdim\pagegoal=\maxdimen
+ \else
+ \nextdepth\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \investigatecount\scratchcounter
+ \testrulewidth2\testrulewidth
+ \boxrulewidth\testrulewidth
+ \setbox0\ruledhbox
+ {\visualvrule
+ \!!height4\testrulewidth
+ \!!depth4\testrulewidth
+ \!!width\zeropoint
+ \visualvrule
+ \!!height\ifnegative.5\else4\fi\testrulewidth
+ \!!depth\ifpositive.5\else4\fi\testrulewidth
+ \!!width8\testrulewidth}%
+ \setruledpenaltybox{2}{\scratchcounter}{4}{4}{.5}{.5}%
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth
+ \ifnegative
+ \box2\box0
+ \else
+ \box0\box2
+ \fi
+ \normalhss}%
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \nointerlineskip
+ \dp0\nextdepth % not \prevdepth=\nextdepth
+ \normalvbox
+ {\normalvcue{\box0}}%
+ \fi
+ \normalpenalty\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledvpenalty
+ {\bgroup
+ \afterassignment\doruledvpenalty
+ \scratchcounter=}
+
+\unexpanded\def\ruledpenalty
+ {\ifvmode
+ \expandafter\ruledvpenalty
+ \else
+ \expandafter\ruledhpenalty
+ \fi}
+
+%D At the cost of some more tokens, a bit more clever
+%D implementation would be:
+%D
+%D \starttyping
+%D \unexpanded\def\ruledpenalty%
+%D {\csname ruled\ifvmode v\else h\fi penalty\endcsname}
+%D \stoptyping
+
+%D \macros
+%D {showfils,dontshowfils,
+%D showboxes,dontshowboxes,
+%D showskips,dontshowskips,
+%D showpenalties,dontshowpenalties}
+%D
+%D For those who want to manipulate the visual cues in detail,
+%D we have grouped them.
+
+\newif\ifshowingcomposition % see later why we need this
+
+\def\showfils
+ {\showingcompositiontrue
+ \let\hss \ruledhss
+ \let\hfil \ruledhfil
+ \let\hfill \ruledhfill
+ \let\hfilneg \ruledhfilneg
+ \let\hfillneg \ruledhfillneg
+ \let\vss \ruledvss
+ \let\vfil \ruledvfil
+ \let\vfill \ruledvfill
+ \let\vfilneg \ruledvfilneg
+ \let\vfillneg \ruledvfillneg}
+
+\def\dontshowfils
+ {\let\hss \normalhss
+ \let\hfil \normalhfil
+ \let\hfill \normalhfill
+ \let\hfilneg \normalhfilneg
+ \let\hfillneg \normalhfillneg
+ \let\vss \normalvss
+ \let\vfil \normalvfil
+ \let\vfill \normalvfill
+ \let\vfilneg \normalvfilneg
+ \let\vfillneg \normalvfillneg}
+
+\def\showboxes
+ {\showingcompositiontrue
+ \baselineruletrue
+ \let\hbox \ruledhbox
+ \let\vbox \ruledvbox
+ \let\vtop \ruledvtop
+ \let\vcenter \ruledvcenter}
+
+\def\dontshowboxes
+ {\let\hbox \normalhbox
+ \let\vbox \normalvbox
+ \let\vtop \normalvtop
+ \let\vcenter \normalvcenter}
+
+\def\showskips
+ {\showingcompositiontrue
+ \let\hskip \ruledhskip
+ \let\vskip \ruledvskip
+ \let\kern \ruledkern
+ \let\mskip \ruledmskip
+ \let\mkern \ruledmkern
+ \let\hglue \ruledhglue
+ \let\vglue \ruledvglue}
+
+\def\dontshowskips
+ {\let\hskip \normalhskip
+ \let\vskip \normalvskip
+ \let\kern \normalkern
+ \let\mskip \normalmskip
+ \let\mkern \normalmkern
+ \let\hglue \normalhglue
+ \let\vglue \normalvglue}
+
+\def\showpenalties
+ {\showingcompositiontrue
+ \let\penalty \ruledpenalty}
+
+\def\dontshowpenalties
+ {\let\penalty \normalpenalty}
+
+%D \macros
+%D {showcomposition,dontshowcomposition,
+%D showingcomposition}
+%D
+%D All these nice options come together in three macros. One
+%D for turning the options on, one for turning them off, and a
+%D boolean for enabling the mechanism outside the scope of the
+%D user. The first two macros only do their job when we are
+%D actually showing the composition.
+%D
+%D \starttyping
+%D \showingcompositiontrue
+%D \showcomposition
+%D \stoptyping
+%D
+%D Because the output routine can do tricky things, like
+%D multiple column typesetting and manipulation of the
+%D pagebody, shifting things around and so on, the macro
+%D \type{\dontshowcomposition} best can be called when we enter
+%D this routine. Too much visual cues just don't make sense. In
+%D \CONTEXT\ this has been taken care of.
+
+\newif\ifshowingcomposition
+
+\def\showcomposition
+ {\ifshowingcomposition
+ \showfils
+ \showboxes
+ \showskips
+ \showpenalties
+ \fi}
+
+\def\dontshowcomposition
+ {\ifshowingcomposition
+ \dontshowfils
+ \dontshowboxes
+ \dontshowskips
+ \dontshowpenalties
+ \fi}
+
+%D \macros
+%D {showmakeup,
+%D defaulttestrulewidth}
+%D
+%D Just to make things even more easy, we have defined:
+%D
+%D \starttyping
+%D \showmakeup
+%D \stoptyping
+%D
+%D For the sake of those who don't (yet) use \CONTEXT\ we
+%D preset \type{\defaulttestrulewidth} to the already set
+%D value. Otherwise we default to a bodyfontsize related value.
+%D
+%D \starttyping
+%D \def\defaulttestrulewidth{.2pt}
+%D \stoptyping
+%D
+%D Beware, it's a macro not a \DIMENSION.
+
+\ifx\bodyfontsize\undefined
+ \edef\defaulttestrulewidth{\the\testrulewidth}
+\else
+ \def\defaulttestrulewidth{.02\bodyfontsize}
+\fi
+
+\def\showmakeup
+ {\testrulewidth\defaulttestrulewidth
+ \showingcompositiontrue
+ \showcomposition}
+
+\protect
+
+%D \ifCONTEXT \let\next=\relax \else \let\next=\endinput
+%D The documented source you have been reading was processed
+%D using some surrogate makeup. When this file is processed
+%D in \CONTEXT, a few more examples show up here, like a local
+%D table of contents and a local register.
+%D \fi \next
+
+%D Lets end with some more advanced examples.
+%D Definitions and enumerations come in many flavors. The
+%D next one for instance is defined as:
+%D
+%D \starttyping
+%D \definedescription[test][place=left,hang=3,width=6em]
+%D \stoptyping
+%D
+%D When applied to some text, this would look like:
+%D
+%D \bgroup
+%D \showmakeup
+%D \definedescription[test][location=left,hang=3,width=6em]
+%D
+%D \test{visual\\debugger} I would be very pleased if \TEX\
+%D had two more primitives: \type{\vnop} and \type{\hnop}. Both
+%D should act and show up as normal boxes, but stay invisible
+%D for \TEX\ when it's doing calculations. The \type{\vnop}
+%D for instance should not interact with the internal mechanism
+%D responsible for the disappearing skips, kerns and penalties
+%D at a pagebreak. As long as we don't have these two boxtypes,
+%D visual debugging will never be perfect.
+%D
+%D \egroup
+%D
+%D The index to this section looks like:
+%D
+%D {\setupreferencing[prefixprefix=dummy]\showmakeup\placeindex[criterium=local]}
+%D
+%D Although not impressive examples or typesetting, both
+%D show us how and where things happen. When somehow the last
+%D lines in this two column index don't allign, then this is
+%D due to some still unknown interference.
+
+\endinput
diff --git a/tex/context/base/symb-cow.tex b/tex/context/base/symb-cow.tex
new file mode 100644
index 000000000..c04ca0108
--- /dev/null
+++ b/tex/context/base/symb-cow.tex
@@ -0,0 +1,132 @@
+%D \module
+%D [ file=symb-cow,
+%D version=2006.06.23,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Cow Symbols,
+%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.
+
+\loadmapfile[koeieletters.map]
+
+\definefontsynonym [Cows] [koeielett]
+\definefontsynonym [CowsContour] [koeielett-contour]
+\definefontsynonym [CowsLogo] [koeielogos]
+\definefontsynonym [CowsLogoContour] [koeielogos-contour]
+
+\definecolor [lsky] [r=.6,g=.6,b=1]
+\definecolor [dsky] [r=.1,g=.1,b=1]
+\definecolor [lground] [r=.3,g=.9,b=.3]
+\definecolor [dground] [r=0,g=.5,b=0]
+\definecolor [cspots] [r=.33,g=.1,b=0]
+
+\definecolor [tlsky] [t=.5,a=1,r=.6,g=.6,b=1]
+\definecolor [tdsky] [t=.5,a=1,r=.1,g=.1,b=1]
+\definecolor [tlground] [t=.5,a=1,r=.3,g=.9,b=.3]
+\definecolor [tdground] [t=.5,a=1,r=0,g=.5,b=0]
+\definecolor [tcspots] [t=.5,a=1,r=.33,g=.1,b=0]
+
+\definepalet
+ [cow]
+ [normal=lground,
+ contour=dground,
+ sky=lsky]
+
+\def\CowNormal#1%
+ {\dontleavehmode\hbox{\color[cow:normal]{\getglyph{Cows}{#1}}}}
+
+\def\ScaledCowNormal#1#2%
+ {\dontleavehmode\hbox{\color[cow:normal]{\definedfont[Cows sa #1]#2}}}
+
+\def\ScaledCowOverlay#1#2%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\definedfont[CowsContour sa #1]#2}}%
+ \color[cow:normal] {\definedfont[Cows sa #1]#2}}}
+
+\def\CowOverlay#1%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\getglyph{CowsContour}{#1}}}%
+ \color[cow:normal] {\getglyph{Cows} {#1}}}}
+
+\def\CowContour#1%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\getglyph{CowsLogoContour}{#1}}}%
+ \color[cow:normal] {\getglyph{CowsLogo} {#1}}}}
+
+\def\CowLogo #1{\getglyph{CowsLogo} {\char#1\relax}}
+\def\CowContourLogo#1{\getglyph{CowsLogoContour}{\char#1\relax}}
+
+\chardef\CowPragmaNormal= 1
+\chardef\CowPragmaShaded=20
+
+\startsymbolset[cownormal]
+
+\definesymbol[CowPragmaADE] [\CowLogo{0}]
+\definesymbol[CowPragma] [\CowLogo{1}]
+\definesymbol[CowConTeXt] [\CowLogo{2}]
+\definesymbol[CowConTeXtComplete] [\CowLogo{3}]
+\definesymbol[CowConTeXtShadow] [\CowLogo{4}]
+\definesymbol[CowConTeXtContour] [\CowLogo{5}]
+\definesymbol[CowConTeXtOutline] [\CowLogo{6}]
+\definesymbol[CowConTeXtDots] [\CowLogo{7}]
+\definesymbol[CowMP] [\CowLogo{8}]
+\definesymbol[CowMPComplete] [\CowLogo{9}]
+\definesymbol[CowTeX] [\CowLogo{10}]
+\definesymbol[CowTeXComplete] [\CowLogo{11}]
+\definesymbol[CowBoo] [\CowLogo{12}]
+\definesymbol[CowCow] [\CowLogo{13}]
+\definesymbol[CowExampleComplete] [\CowLogo{14}]
+\definesymbol[CowFoxetComplete] [\CowLogo{15}]
+\definesymbol[CowMetafun] [\CowLogo{16}]
+\definesymbol[CowMetafunComplete] [\CowLogo{17}]
+\definesymbol[CowTEXComplete] [\CowLogo{18}]
+\definesymbol[CowWikiComplete] [\CowLogo{19}]
+\definesymbol[CowPragmaADEComplete][\CowLogo{20}]
+\definesymbol[CowPragmaComplete] [\CowLogo{21}]
+\definesymbol[CowExample] [\CowLogo{22}]
+\definesymbol[CowFoxet] [\CowLogo{23}]
+\definesymbol[CowTEX] [\CowLogo{24}]
+\definesymbol[CowWiki] [\CowLogo{25}]
+\definesymbol[CowCowTeXtComplete] [\CowLogo{26}]
+\definesymbol[CowCowTeXt] [\CowLogo{27}]
+
+\stopsymbolset
+
+\startsymbolset[cowcontour]
+
+\definesymbol[CowPragmaADE] [\CowContourLogo{0}]
+\definesymbol[CowPragma] [\CowContourLogo{1}]
+\definesymbol[CowConTeXt] [\CowContourLogo{2}]
+\definesymbol[CowConTeXtComplete] [\CowContourLogo{3}]
+\definesymbol[CowConTeXtShadow] [\CowContourLogo{4}]
+\definesymbol[CowConTeXtContour] [\CowContourLogo{5}]
+\definesymbol[CowConTeXtOutline] [\CowContourLogo{6}]
+\definesymbol[CowConTeXtDots] [\CowContourLogo{7}]
+\definesymbol[CowMP] [\CowContourLogo{8}]
+\definesymbol[CowMPComplete] [\CowContourLogo{9}]
+\definesymbol[CowTeX] [\CowContourLogo{10}]
+\definesymbol[CowTeXComplete] [\CowContourLogo{11}]
+\definesymbol[CowBoo] [\CowContourLogo{12}]
+\definesymbol[CowCow] [\CowContourLogo{13}]
+\definesymbol[CowExampleComplete] [\CowContourLogo{14}]
+\definesymbol[CowFoxetComplete] [\CowContourLogo{15}]
+\definesymbol[CowMetafun] [\CowContourLogo{16}]
+\definesymbol[CowMetafunComplete] [\CowContourLogo{17}]
+\definesymbol[CowTEXComplete] [\CowContourLogo{18}]
+\definesymbol[CowWikiComplete] [\CowContourLogo{19}]
+\definesymbol[CowPragmaADEComplete][\CowContourLogo{20}]
+\definesymbol[CowPragmaComplete] [\CowContourLogo{21}]
+\definesymbol[CowExample] [\CowContourLogo{22}]
+\definesymbol[CowFoxet] [\CowContourLogo{23}]
+\definesymbol[CowTEX] [\CowContourLogo{24}]
+\definesymbol[CowWiki] [\CowContourLogo{25}]
+\definesymbol[CowCowTeXtComplete] [\CowContourLogo{26}]
+\definesymbol[CowCowTeXt] [\CowContourLogo{27}]
+
+\stopsymbolset
+
+\endinput
diff --git a/tex/context/base/symb-eur.tex b/tex/context/base/symb-eur.tex
new file mode 100644
index 000000000..400e88ac5
--- /dev/null
+++ b/tex/context/base/symb-eur.tex
@@ -0,0 +1,64 @@
+%D \module
+%D [ file=symb-eur,
+%D version=2000.06.22,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Adobe Euro Symbols,
+%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.
+
+\loadmapfile [original-adobe-euro.map]
+
+\definefontsynonym [EuroSerif] [eurose]
+\definefontsynonym [EuroSerifBold] [euroseb]
+\definefontsynonym [EuroSerifItalic] [eurosei]
+\definefontsynonym [EuroSerifSlanted] [eurosei]
+\definefontsynonym [EuroSerifBoldItalic] [eurosebi]
+\definefontsynonym [EuroSerifBoldSlanted] [eurosebi]
+
+\definefontsynonym [EuroSans] [eurosa]
+\definefontsynonym [EuroSansBold] [eurosab]
+\definefontsynonym [EuroSansItalic] [eurosai]
+\definefontsynonym [EuroSansSlanted] [eurosai]
+\definefontsynonym [EuroSansBoldItalic] [eurosabi]
+\definefontsynonym [EuroSansBoldSlanted] [eurosabi]
+
+\definefontsynonym [EuroMono] [euromo]
+\definefontsynonym [EuroMonoBold] [euromob]
+\definefontsynonym [EuroMonoSlanted] [euromoi]
+\definefontsynonym [EuroMonoItalic] [euromoi]
+\definefontsynonym [EuroMonoBoldItalic] [euromobi]
+\definefontsynonym [EuroMonoBoldSlanted] [euromobi]
+
+\definesymbol [euro] [\getglyph{Euro}{\char160}]
+
+\startencoding[default]
+ \definecharacter texteuro {\symbol[euro]}
+\stopencoding
+
+\unexpanded\def\euro{\doiftextelse\texteuro\texteuro{\symbol[euro]}}
+
+% ok for one font series, but not for mixed sets
+%
+% \unexpanded\def\euro
+% {\doiftextelse \texteuro \texteuro
+% {\unexpanded\def\euro{\symbol[euro]}\euro}
+
+%D The next table shows the complete set of symbols:
+%D
+%D \starttabulate[|l|c|c|c|c|c|c|]
+%D \NC \NC \tex{tf} \NC \tex{bf} \NC \tex{sl}
+%D \NC \tex{it} \NC \tex{bs} \NC \tex{bi} \NC\NR
+%D \NC \rm Serif \NC \rm\tf\euro \NC \rm\bf\euro \NC \rm\sl\euro
+%D \NC \rm\it\euro \NC \rm\bs\euro \NC \rm\bi\euro \NC\NR
+%D \NC \ss Sans \NC \ss\tf\euro \NC \ss\bf\euro \NC \ss\sl\euro
+%D \NC \ss\it\euro \NC \ss\bs\euro \NC \ss\bi\euro \NC\NR
+%D \NC \tt Mono \NC \tt\tf\euro \NC \tt\bf\euro \NC \tt\sl\euro
+%D \NC \tt\it\euro \NC \tt\bs\euro \NC \tt\bi\euro \NC\NR
+%D \stoptabulate
+
+\endinput
diff --git a/tex/context/base/symb-glm.tex b/tex/context/base/symb-glm.tex
new file mode 100644
index 000000000..0b01ca7df
--- /dev/null
+++ b/tex/context/base/symb-glm.tex
@@ -0,0 +1,79 @@
+%D \module
+%D [ file=symb-glm,
+%D version=2002.05.07,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Guillemots,
+%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 Watch the \type {x} before the local symbols.
+
+% \loadmapfile [ec-public-lm.map]
+% \loadmapfile [ec-lm.map]
+\loadmapfile [lm-ec.map]
+
+% this used to be:
+%
+% \definefontsynonym [GuilSerif] [plr10] [encoding=ec]
+% \definefontsynonym [GuilSerifBold] [plbx10] [encoding=ec]
+% \definefontsynonym [GuilSerifItalic] [plti10] [encoding=ec]
+% \definefontsynonym [GuilSerifSlanted] [plsl10] [encoding=ec]
+% \definefontsynonym [GuilSerifBoldItalic] [plbxti10] [encoding=ec]
+% \definefontsynonym [GuilSerifBoldSlanted] [plbxsl10] [encoding=ec]
+%
+% \definefontsynonym [GuilSans] [plss10] [encoding=ec]
+% \definefontsynonym [GuilSansBold] [plssbx10] [encoding=ec]
+% \definefontsynonym [GuilSansItalic] [plssi10] [encoding=ec]
+% \definefontsynonym [GuilSansSlanted] [plssi10] [encoding=ec]
+% \definefontsynonym [GuilSansBoldItalic] [plssbi10] [encoding=ec]
+% \definefontsynonym [GuilSansBoldSlanted] [plssbi10] [encoding=ec]
+%
+% \definefontsynonym [GuilMono] [pltt10] [encoding=ec]
+%
+% but was also one of the reasons for triggering the lm project, so:
+
+\definefontsynonym [GuilSerif] [ec-lmr10] [encoding=ec]
+\definefontsynonym [GuilSerifBold] [ec-lmbx10] [encoding=ec]
+\definefontsynonym [GuilSerifItalic] [ec-lmti10] [encoding=ec]
+\definefontsynonym [GuilSerifSlanted] [ec-lmsl10] [encoding=ec]
+\definefontsynonym [GuilSerifBoldItalic] [ec-lmbxti10] [encoding=ec]
+\definefontsynonym [GuilSerifBoldSlanted] [ec-lmbxsl10] [encoding=ec]
+
+\definefontsynonym [GuilSans] [ec-lmss10] [encoding=ec]
+\definefontsynonym [GuilSansBold] [ec-lmssbx10] [encoding=ec]
+\definefontsynonym [GuilSansItalic] [ec-lmssi10] [encoding=ec]
+\definefontsynonym [GuilSansSlanted] [ec-lmssi10] [encoding=ec]
+\definefontsynonym [GuilSansBoldItalic] [ec-lmssbi10] [encoding=ec]
+\definefontsynonym [GuilSansBoldSlanted] [ec-lmssbi10] [encoding=ec]
+
+\definefontsynonym [GuilMono] [ec-lmtt10] [encoding=ec]
+%definefontsynonym [GuilMonoBold] [ec-lmtt10] [encoding=ec]
+%definefontsynonym [GuilMonoSlanted] [ec-lmtt10] [encoding=ec]
+%definefontsynonym [GuilMonoItalic] [ec-lmtt10] [encoding=ec]
+%definefontsynonym [GuilMonoBoldItalic] [ec-lmtt10] [encoding=ec]
+%definefontsynonym [GuilMonoBoldSlanted] [ec-lmtt10] [encoding=ec]
+
+\definesymbol [xleftguillemot] [\getglyph{Guil}{\char19}]
+\definesymbol [xrightguillemot] [\getglyph{Guil}{\char20}]
+
+\definesymbol [xguilsingleleft] [\getglyph{Guil}{\char14}]
+\definesymbol [xguilsingleright] [\getglyph{Guil}{\char15}]
+
+%D A strange place, but okay (the \type {\relax} prevents space gobbling)
+
+\startencoding [default]
+
+ \definecharacter leftguillemot {\symbol[xleftguillemot]\relax}
+ \definecharacter rightguillemot {\symbol[xrightguillemot]\relax}
+
+ \definecharacter guilsingleleft {\symbol[xguilsingleleft]\relax}
+ \definecharacter guilsingleright {\symbol[xguilsingleright]\relax}
+
+\stopencoding
+
+\endinput
diff --git a/tex/context/base/symb-ini.mkii b/tex/context/base/symb-ini.mkii
new file mode 100644
index 000000000..f7bffd240
--- /dev/null
+++ b/tex/context/base/symb-ini.mkii
@@ -0,0 +1,281 @@
+%D \module
+%D [ file=symb-ini,
+%D version=1998.07.20,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Basic Symbols Commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The macros described here used to be part of the \type
+%D {core-con} module. I decided to move them here when
+%D symbolsets saw the light. Let their light shine.
+
+\writestatus{loading}{ConTeXt Symbol Libraries / Initialization}
+
+\unprotect
+
+%D \macros
+%D {definesymbol, symbol}
+%D
+%D Converting numbers or levels into a character, romannumeral,
+%D symbol or something else, is supported by many \CONTEXT\
+%D commands. Therefore we need a mechanism for linking such
+%D numbers to their counterparts.
+%D
+%D First we take care of symbols. These are for instance used
+%D in enumerations and itemizations. We have:
+%D
+%D \showsetup{definesymbol}
+%D \showsetup{symbol}
+%D
+%D Symbols are simply linked to a tag. Such tags can be numbers
+%D or strings.
+%D
+%D \starttyping
+%D \definesymbol [1] [$\bullet$]
+%D \definesymbol [level 5] [$\star$]
+%D \stoptyping
+
+% ss:tag -> symbol
+% ss:set:tag -> symbol out of set
+% sstag -> list of symbols in set
+
+\def\definesymbol
+ {\dotripleempty\dodefinesymbol}
+
+% \def\dodefinesymbol[#1][#2][#3]% class name meaning
+% {\ifthirdargument
+% \setvalue{\??ss:#1:#2}{#3}%
+% \doifsomething{#1}{\addvalue{\??ss*#1}{#2}}%
+% \else
+% \setvalue{\??ss:\currentsymboldef:#1}{#2}%
+% \fi}
+
+\def\dodefinesymbol[#1][#2][#3]% class name meaning
+ {\ifthirdargument
+ \setvalue{\??ss:#1:#2}{#3}%
+ \doifsomething{#1}{\addvalue{\??ss*#1}{#2}}%
+ \else
+ \setvalue{\??ss:\currentsymboldef:#1}{#2}%
+ \addvalue{\??ss*\currentsymboldef}{#1}%
+ \fi}
+
+\def\doifinsymbolsetelse#1#2{\doifdefinedelse{\??ss:#1:#2}}
+\def\doifinsymbolset #1#2{\doifdefined {\??ss:#1:#2}}
+\def\doifsymbolsetelse #1{\doifdefinedelse{\??ss*#1}}
+
+\def\symbolset#1{\executeifdefined{\??ss*#1}\empty} % no [#1], to be used in commalists etc
+
+%D Since symbols are used frequently in interactive
+%D documents, we speed up this one. Well, that was history,
+%D since now we simplified things a bit, because the low
+%D level macros have been sped up now and then.
+
+\unexpanded\def\symbol % This one always gobbles spaces,
+ {\dodoubleempty\dosymbol} % so never change it again!
+
+\newif\ifnosymbol \newtoks\everysymbol
+
+\def\dodosymbol#1#2% \relax's prevent lookahead problems
+ {\nosymbolfalse{\the\everysymbol\csname\??ss:#1:#2\endcsname\relax}\relax}
+
+\def\directsymbol#1#2% no \relax, there can be an argument, see lists
+ {\executeifdefined{\??ss:#1:#2}\firstofoneargument}
+
+% We support both:
+%
+% Test test \symbol[whatever]\ test \symbol[whatever].
+% Test test \symbol{whatever} test \symbol{whatever}.
+
+\def\dosymbol % so we also handle \symbol{name}
+ {\iffirstargument % which is nicer with following spaces
+ \expandafter\donormalsymbol
+ \else
+ \expandafter\dospecialsymbol
+ \fi}
+
+\def\dospecialsymbol[#1][#2]#3%
+ {\firstargumenttrue
+ \secondargumentfalse
+ \donormalsymbol[#3][]}
+
+\def\donormalsymbol[#1][#2]%
+ {\nosymboltrue
+ \ifsecondargument
+ \edef\currentsymbol{#2}%
+ \doifinsymbolset{#1}{#2}{\dodosymbol{#1}{#2}}%
+ \else
+ \edef\currentsymbol{#1}%
+ \fi
+ \ifnosymbol
+ \the\symbolsetups
+ \ifnosymbol
+ \redosymbol\currentsymbol
+ \fi
+ \fi}
+
+\def\fetchsymbol#1%
+ {\ifnosymbol
+ \doifinsymbolset{#1}\currentsymbol{\dodosymbol{#1}\currentsymbol}%
+ \fi}
+
+\def\redosymbol#1%
+% {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty{#1}}{#1}} % more efficient:
+ {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty}\firstofoneargument{#1}}
+
+% % % % %
+% this should go in symb-fig, to be loaded after core-fig
+
+%D \macros
+%D {definefiguresymbol}
+%D
+%D To simplify defining figure symbols, we offer:
+%D
+%D \showsetup{definefiguresymbol}
+%D
+%D By default, such symbols scale along the current bodyfont
+%D size or running font size (which is better).
+
+\def\defaultsymbolfactor{10}
+\def\defaultsymbolheight{1.25ex}
+
+\def\figuresymbol
+ {\dodoubleempty\dofiguresymbol}
+
+\ifx\externalfigure \undefined \def\externalfigure[#1][#2]{#1} \fi
+\ifx\resetexternalfigures\undefined \let\resetexternalfigures\relax \fi
+
+\def\dofiguresymbol[#1][% #2]%
+ {\externalfigure[#1][\c!reset=\v!yes,\c!symbol=\v!yes,\c!height=\defaultsymbolheight,}% #2]}
+
+\appendtoks \resetexternalfigures \to \everysymbol
+
+\def\definefiguresymbol
+ {\dotripleempty\dodefinefiguresymbol}
+
+\def\dodefinefiguresymbol[#1][#2][#3]%
+ {\ifsecondargument
+ \definesymbol[#1][{\dofiguresymbol[#2][#3]}]%
+ \fi}
+
+% but for the moment we keep it here
+% % % % % %
+
+%\def\objectsymbol[#1]%
+% {\dopresetfieldsymbol{#1}\dogetfieldsymbol{#1}}
+
+%D \macros
+%D {doifsymboldefinedelse}
+%D
+%D A handy private one:
+
+% a bit messy
+
+\def\xfetchsymbol#1%
+ {\ifnosymbol
+ \doifinsymbolset{#1}\currentsymbol\nosymbolfalse
+ \fi}
+
+\def\xredosymbol#1%
+ {\doifinsymbolset\empty\currentsymbol\nosymbolfalse}
+
+\def\doifsymboldefinedelse#1%
+ {\bgroup
+ \edef\currentsymbol{#1}%
+ \let\fetchsymbol\xfetchsymbol
+ \nosymboltrue
+ \the\symbolsetups
+ \ifnosymbol
+ \xredosymbol\currentsymbol
+ \ifnosymbol
+ \egroup\@EAEAEA\secondoftwoarguments
+ \else
+ \egroup\@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \egroup\@EA\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {setupsymbolset,startsymbolset}
+%D
+%D From these macro definitions one can deduce that symbols can
+%D be grouped in symbol sets:
+%D
+%D \starttyping
+%D \startsymbolset [navigation 1]
+%D \definefiguresymbol [Next] [mp-symb.1]
+%D \definefiguresymbol [Prev] [mp-symb.2]
+%D \stopsymbolset
+%D \stoptyping
+%D
+%D Such a symbol can be typeset with:
+%D
+%D \starttyping
+%D \setupsymbolset[navigation 1]\symbol[Next]
+%D \stoptyping
+%D
+%D or simply:
+%D
+%D \starttyping
+%D \symbol[navigation 1][Next]
+%D \stoptyping
+%D
+%D Formally:
+%D
+%D \showsetup{setupsymbolset}
+%D \showsetup{startsymbolset}
+
+\let\currentsymboldef\empty
+
+\def\startsymbolset[#1]
+ {\def\currentsymboldef{#1}}
+
+\def\stopsymbolset
+ {\let\currentsymboldef\empty}
+
+\newtoks\symbolsetups
+
+\def\setupsymbolset[#1]%
+ {\prependtoksonce\fetchsymbol{#1}\to\symbolsetups}
+
+\def\resetsymbolset
+ {\symbolsetups\emptytoks}
+
+\def\forcesymbolset[#1]%
+ {\symbolsetups{\fetchsymbol{#1}}}
+
+%D \macros
+%D {showsymbolset}
+%D
+%D \showsetup{showsymbolset}
+
+\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run.mkii}
+
+%D \macros
+%D {usesymbols}
+%D
+%D \showsetup{usesymbols}
+
+\def\dousesymbols#1%
+ {\makeshortfilename[\truefilename{\f!symbolprefix#1}]%
+ \startreadingfile
+ \readsysfile\shortfilename
+ {\showmessage\m!symbols1{#1}}
+ \donothing
+ \stopreadingfile}
+
+\def\usesymbols[#1]%
+ {\processcommalist[#1]\dousesymbols}
+
+%D As longs as symbols are linked to levels or numbers, we can
+%D also use the conversion mechanism, but in for instance the
+%D itemization macros, we prefer symbols because they can more
+%D easier be (partially) redefined.
+
+\protect \endinput
diff --git a/tex/context/base/symb-ini.mkiv b/tex/context/base/symb-ini.mkiv
new file mode 100644
index 000000000..f4f6bdd79
--- /dev/null
+++ b/tex/context/base/symb-ini.mkiv
@@ -0,0 +1,281 @@
+%D \module
+%D [ file=symb-ini,
+%D version=1998.07.20,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Basic Symbols Commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The macros described here used to be part of the \type
+%D {core-con} module. I decided to move them here when
+%D symbolsets saw the light. Let their light shine.
+
+\writestatus{loading}{ConTeXt Symbol Libraries / Initialization}
+
+\unprotect
+
+%D \macros
+%D {definesymbol, symbol}
+%D
+%D Converting numbers or levels into a character, romannumeral,
+%D symbol or something else, is supported by many \CONTEXT\
+%D commands. Therefore we need a mechanism for linking such
+%D numbers to their counterparts.
+%D
+%D First we take care of symbols. These are for instance used
+%D in enumerations and itemizations. We have:
+%D
+%D \showsetup{definesymbol}
+%D \showsetup{symbol}
+%D
+%D Symbols are simply linked to a tag. Such tags can be numbers
+%D or strings.
+%D
+%D \starttyping
+%D \definesymbol [1] [$\bullet$]
+%D \definesymbol [level 5] [$\star$]
+%D \stoptyping
+
+% ss:tag -> symbol
+% ss:set:tag -> symbol out of set
+% sstag -> list of symbols in set
+
+\unexpanded\def\definesymbol
+ {\dotripleempty\dodefinesymbol}
+
+% \def\dodefinesymbol[#1][#2][#3]% class name meaning
+% {\ifthirdargument
+% \setvalue{\??ss:#1:#2}{#3}%
+% \doifsomething{#1}{\addvalue{\??ss*#1}{#2}}%
+% \else
+% \setvalue{\??ss:\currentsymboldef:#1}{#2}%
+% \fi}
+
+\def\dodefinesymbol[#1][#2][#3]% class name meaning
+ {\ifthirdargument
+ \setvalue{\??ss:#1:#2}{#3}%
+ \doifsomething{#1}{\addvalue{\??ss*#1}{#2}}%
+ \else
+ \setvalue{\??ss:\currentsymboldef:#1}{#2}%
+ \addvalue{\??ss*\currentsymboldef}{#1}%
+ \fi}
+
+\def\doifinsymbolsetelse#1#2{\doifdefinedelse{\??ss:#1:#2}}
+\def\doifinsymbolset #1#2{\doifdefined {\??ss:#1:#2}}
+\def\doifsymbolsetelse #1{\doifdefinedelse{\??ss*#1}}
+
+\def\symbolset#1{\executeifdefined{\??ss*#1}\empty} % no [#1], to be used in commalists etc
+
+%D Since symbols are used frequently in interactive
+%D documents, we speed up this one. Well, that was history,
+%D since now we simplified things a bit, because the low
+%D level macros have been sped up now and then.
+
+\unexpanded\def\symbol % This one always gobbles spaces,
+ {\dodoubleempty\dosymbol} % so never change it again!
+
+\newif\ifnosymbol \newtoks\everysymbol
+
+\def\dodosymbol#1#2% \relax's prevent lookahead problems
+ {\nosymbolfalse{\the\everysymbol\csname\??ss:#1:#2\endcsname\relax}\relax}
+
+\def\directsymbol#1#2% no \relax, there can be an argument, see lists
+ {\executeifdefined{\??ss:#1:#2}\firstofoneargument}
+
+% We support both:
+%
+% Test test \symbol[whatever]\ test \symbol[whatever].
+% Test test \symbol{whatever} test \symbol{whatever}.
+
+\def\dosymbol % so we also handle \symbol{name}
+ {\iffirstargument % which is nicer with following spaces
+ \expandafter\donormalsymbol
+ \else
+ \expandafter\dospecialsymbol
+ \fi}
+
+\def\dospecialsymbol[#1][#2]#3%
+ {\firstargumenttrue
+ \secondargumentfalse
+ \donormalsymbol[#3][]}
+
+\def\donormalsymbol[#1][#2]%
+ {\nosymboltrue
+ \ifsecondargument
+ \edef\currentsymbol{#2}%
+ \doifinsymbolset{#1}{#2}{\dodosymbol{#1}{#2}}%
+ \else
+ \edef\currentsymbol{#1}%
+ \fi
+ \ifnosymbol
+ \the\symbolsetups
+ \ifnosymbol
+ \redosymbol\currentsymbol
+ \fi
+ \fi}
+
+\def\fetchsymbol#1%
+ {\ifnosymbol
+ \doifinsymbolset{#1}\currentsymbol{\dodosymbol{#1}\currentsymbol}%
+ \fi}
+
+\def\redosymbol#1%
+% {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty{#1}}{#1}} % more efficient:
+ {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty}\firstofoneargument{#1}}
+
+% % % % %
+% this should go in symb-fig, to be loaded after core-fig
+
+%D \macros
+%D {definefiguresymbol}
+%D
+%D To simplify defining figure symbols, we offer:
+%D
+%D \showsetup{definefiguresymbol}
+%D
+%D By default, such symbols scale along the current bodyfont
+%D size or running font size (which is better).
+
+\def\defaultsymbolfactor{10}
+\def\defaultsymbolheight{1.25ex}
+
+\def\figuresymbol
+ {\dodoubleempty\dofiguresymbol}
+
+\ifx\externalfigure \undefined \def\externalfigure[#1][#2]{#1} \fi
+\ifx\resetexternalfigures\undefined \let\resetexternalfigures\relax \fi
+
+\def\dofiguresymbol[#1][% #2]%
+ {\externalfigure[#1][\c!reset=\v!yes,\c!symbol=\v!yes,\c!height=\defaultsymbolheight,}% #2]}
+
+\appendtoks \resetexternalfigures \to \everysymbol
+
+\unexpanded\def\definefiguresymbol
+ {\dotripleempty\dodefinefiguresymbol}
+
+\def\dodefinefiguresymbol[#1][#2][#3]%
+ {\ifsecondargument
+ \definesymbol[#1][{\dofiguresymbol[#2][#3]}]%
+ \fi}
+
+% but for the moment we keep it here
+% % % % % %
+
+%\def\objectsymbol[#1]%
+% {\dopresetfieldsymbol{#1}\dogetfieldsymbol{#1}}
+
+%D \macros
+%D {doifsymboldefinedelse}
+%D
+%D A handy private one:
+
+% a bit messy
+
+\def\xfetchsymbol#1%
+ {\ifnosymbol
+ \doifinsymbolset{#1}\currentsymbol\nosymbolfalse
+ \fi}
+
+\def\xredosymbol#1%
+ {\doifinsymbolset\empty\currentsymbol\nosymbolfalse}
+
+\def\doifsymboldefinedelse#1%
+ {\bgroup
+ \edef\currentsymbol{#1}%
+ \let\fetchsymbol\xfetchsymbol
+ \nosymboltrue
+ \the\symbolsetups
+ \ifnosymbol
+ \xredosymbol\currentsymbol
+ \ifnosymbol
+ \egroup\@EAEAEA\secondoftwoarguments
+ \else
+ \egroup\@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \egroup\@EA\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {setupsymbolset,startsymbolset}
+%D
+%D From these macro definitions one can deduce that symbols can
+%D be grouped in symbol sets:
+%D
+%D \starttyping
+%D \startsymbolset [navigation 1]
+%D \definefiguresymbol [Next] [mp-symb.1]
+%D \definefiguresymbol [Prev] [mp-symb.2]
+%D \stopsymbolset
+%D \stoptyping
+%D
+%D Such a symbol can be typeset with:
+%D
+%D \starttyping
+%D \setupsymbolset[navigation 1]\symbol[Next]
+%D \stoptyping
+%D
+%D or simply:
+%D
+%D \starttyping
+%D \symbol[navigation 1][Next]
+%D \stoptyping
+%D
+%D Formally:
+%D
+%D \showsetup{setupsymbolset}
+%D \showsetup{startsymbolset}
+
+\let\currentsymboldef\empty
+
+\unexpanded\def\startsymbolset[#1]
+ {\def\currentsymboldef{#1}}
+
+\unexpanded\def\stopsymbolset
+ {\let\currentsymboldef\empty}
+
+\newtoks\symbolsetups
+
+\unexpanded\def\setupsymbolset[#1]%
+ {\prependtoksonce\fetchsymbol{#1}\to\symbolsetups}
+
+\def\resetsymbolset
+ {\symbolsetups\emptytoks}
+
+\def\forcesymbolset[#1]%
+ {\symbolsetups{\fetchsymbol{#1}}}
+
+%D \macros
+%D {showsymbolset}
+%D
+%D \showsetup{showsymbolset}
+
+\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run.mkiv}
+
+%D \macros
+%D {usesymbols}
+%D
+%D \showsetup{usesymbols}
+
+\def\dousesymbols#1%
+ {\makeshortfilename[\truefilename{\f!symbolprefix#1}]%
+ \startreadingfile
+ \readsysfile\shortfilename
+ {\showmessage\m!symbols1{#1}}
+ \donothing
+ \stopreadingfile}
+
+\def\usesymbols[#1]%
+ {\processcommalist[#1]\dousesymbols}
+
+%D As longs as symbols are linked to levels or numbers, we can
+%D also use the conversion mechanism, but in for instance the
+%D itemization macros, we prefer symbols because they can more
+%D easier be (partially) redefined.
+
+\protect \endinput
diff --git a/tex/context/base/symb-jmn.tex b/tex/context/base/symb-jmn.tex
new file mode 100644
index 000000000..1ed65d16e
--- /dev/null
+++ b/tex/context/base/symb-jmn.tex
@@ -0,0 +1,204 @@
+%D \module
+%D [ file=symb-jmn,
+%D version=2004.08.02,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Special Navigational Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file defines a few navigational symbol vectors. The font used
+%D here is designed by Janusz M.~Nowacki, one of the Polish Font
+%D Gurus who made this font specially for me, hence the name. If you
+%D you want to meet its designer, come to Bachotek! In case you're
+%D not familiar with his work, take a look at the Antikwa, Iwona and
+%D Kurier fonts!
+%D
+%D \usesymbols[jmn]
+%D
+%D \showsymbolset[navigation 1]
+%D \showsymbolset[navigation 3]
+%D \showsymbolset[navigation 2]
+%D \showsymbolset[navigation 4]
+%D
+%D \page
+%D \showfont[NavigationNormal]
+%D \page
+%D \showfont[NavigationShadowed]
+%D \page
+
+% needed:
+%
+% - inverted crossed
+% - curved diamond
+
+\unprotect
+
+\loadmapfile[original-base.map] % \loadmapfile [original-context-symbol.map]
+
+\ifnum\texengine=\luatexengine
+ \definefontsynonym[NavigationNormal] [hans.tfm]
+ \definefontsynonym[NavigationShadowed] [hans-sh.tfm]
+\else
+ \definefontsynonym[NavigationNormal] [hans]
+ \definefontsynonym[NavigationShadowed] [hans-sh]
+\fi
+
+\definefontsynonym[NavigationFont] [NavigationNormal]
+%definefontsynonym[NavigationFont] [NavigationShadowed]
+
+\def\NavigationGlyph#1{\getglyph{NavigationFont}{\char#1}}
+
+\unprotect
+
+\startsymbolset [navigation 1]
+
+ \definesymbol [\v!previouspage] [\NavigationGlyph {65}]
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{128}]
+ \definesymbol [\v!firstpage] [\NavigationGlyph{129}]
+
+ \definesymbol [\v!nextpage] [\NavigationGlyph {66}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{130}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{131}]
+
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{160}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{178}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{208}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{209}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{178}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph {66}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{168}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{170}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph {66}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{168}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{170}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph {66}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{168}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{170}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph {66}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 2]
+
+ \definesymbol [\v!previouspage] [\NavigationGlyph {67}]
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{132}]
+ \definesymbol [\v!firstpage] [\NavigationGlyph{133}]
+
+ \definesymbol [\v!nextpage] [\NavigationGlyph {68}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{134}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{135}]
+
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{160}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{176}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{210}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{211}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{176}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph {68}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{170}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{168}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph {68}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{170}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{168}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph {68}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{170}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{168}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph {68}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 3]
+
+ \definesymbol [\v!previouspage] [\NavigationGlyph {73}]
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{144}]
+ \definesymbol [\v!firstpage] [\NavigationGlyph{145}]
+
+ \definesymbol [\v!nextpage] [\NavigationGlyph {74}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{146}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{147}]
+
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{160}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{178}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{212}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{213}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{178}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph {73}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{168}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{170}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph {73}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{168}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{170}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph {73}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{168}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{170}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph {73}]
+
+\stopsymbolset
+
+% 1 left : 065 067 073 075
+% 2 left : 128 132 144 148
+% 3 left : 129 133 145 149
+
+% 1 right : 066 068 074 076
+% 2 right : 130 134 146 150
+% 3 right : 131 135 147 151
+
+% crossed : 160 160 160 160
+% opened : 152 152 156 156
+% closed : 154 154 158 158
+
+% larrow : 208 210 212 214
+% rarrow : 209 211 213 215
+% barrow : 178 178 178 178
+% ocircle : 168 168 168 168
+% ccircle : 170 170 170 170
+
+\startsymbolset [navigation 4]
+
+ \definesymbol [\v!previouspage] [\NavigationGlyph {75}]
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{148}]
+ \definesymbol [\v!firstpage] [\NavigationGlyph{149}]
+
+ \definesymbol [\v!nextpage] [\NavigationGlyph {76}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{150}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{151}]
+
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{160}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{176}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{214}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{215}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{176}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph {75}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{170}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{168}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph {75}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{170}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{168}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph {75}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{170}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{168}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph {75}]
+
+\stopsymbolset
+
+\protect \endinput
diff --git a/tex/context/base/symb-mis.tex b/tex/context/base/symb-mis.tex
new file mode 100644
index 000000000..d108b8902
--- /dev/null
+++ b/tex/context/base/symb-mis.tex
@@ -0,0 +1,139 @@
+%D \module
+%D [ file=symb-mis,
+%D version=2002.05.07,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Miscelaneous,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+%D We predefine some common symbols and conversions that will
+%D be understood by many commands.
+
+% \mathematics no longer needed, although only math fonts might have these
+
+\definesymbol [\v!none] []
+\definesymbol [bullet] [\mathematics{\bullet}]
+\definesymbol [dash] [\mathematics{-}]
+\definesymbol [star] [\mathematics{\star}]
+\definesymbol [triangle] [\mathematics{\triangleright}]
+\definesymbol [circle] [\mathematics{\circ}]
+\definesymbol [square] [\mathematics{\square}]
+\definesymbol [diamond] [\mathematics{\diamond}]
+
+\definesymbol [smallcircle] [\hbox{\raise.1ex\hbox{\mathematics{\scriptscriptstyle\bigcirc}}}]
+\definesymbol [medcircle] [\hbox{\raise.1ex\hbox{\mathematics{\scriptstyle \bigcirc}}}]
+\definesymbol [bigcircle] [\mathematics{\bigcirc}]
+
+\definesymbol [1] [{\symbol[bullet]}]
+\definesymbol [2] [{\symbol[dash]}]
+\definesymbol [3] [{\symbol[star]}]
+\definesymbol [4] [{\symbol[triangle]}]
+\definesymbol [5] [{\symbol[circle]}]
+\definesymbol [6] [{\symbol[medcircle]}]
+\definesymbol [7] [{\symbol[bigcircle]}]
+\definesymbol [8] [{\symbol[square]}]
+
+%D Special hyperlinks, namely those to pages or navigational
+%D properties, are associated with symbols.
+
+\definesymbol [\v!firstpage] [\gotobegincharacter]
+\definesymbol [\v!previouspage] [\gobackwardcharacter]
+\definesymbol [\v!nextpage] [\goforwardcharacter]
+\definesymbol [\v!lastpage] [\gotoendcharacter]
+\definesymbol [\v!firstsubpage] [\gotobegincharacter]
+\definesymbol [\v!previoussubpage] [\gobackwardcharacter]
+\definesymbol [\v!nextsubpage] [\goforwardcharacter]
+\definesymbol [\v!lastsubpage] [\gotoendcharacter]
+\definesymbol [\v!PreviousJump] [\gobackjumpcharacter]
+\definesymbol [\v!NextJump] [\goforjumpcharacter]
+\definesymbol [\v!CloseDocument] [\closecharacter]
+
+\definesymbol [\v!first] [{\symbol[\v!firstpage]}]
+\definesymbol [\v!previous] [{\symbol[\v!previouspage]}]
+\definesymbol [\v!next] [{\symbol[\v!nextpage]}]
+\definesymbol [\v!last] [{\symbol[\v!lastpage]}]
+\definesymbol [\v!somewhere] [\gotosomewherecharacter]
+\definesymbol [\v!nowhere] [\gonowherecharacter]
+
+\definesymbol [\v!backward] [{\symbol[\v!previouspage]}]
+\definesymbol [\v!forward] [{\symbol[\v!nextpage]}]
+
+%D The next two symbols (\symbol[P] and \symbol[S]) are
+%D variations in their math counterparts. The following ones
+%D {\em do} scale.
+
+% todo : hook this into \textsection
+
+\definesymbol [S] [\getglyph{MathSymbol}{\char"78}]
+\definesymbol [P] [\getglyph{MathSymbol}{\char"7B}]
+
+%D These symbols are taken from the Computer Moders Roman
+%D symbol set or, when present, from the additional symbols of
+%D the American Mathematical Society. Of course one can use
+%D his or her own symbols by redefining them.
+
+\def\dogotocharacter#1#2#3%
+ {\ifx#1\undefined#2\else#3\fi}
+
+\def\gotobegincharacter
+ {\hbox
+ {\dogotocharacter\blacktriangleleft
+ {\setbox0\hbox{\mathematics{\triangleleft}}%
+ \vrule\!!width.085ex\!!height1.075\ht0\!!depth\dp0
+ \kern-.11ex\box0}
+ {\setbox0\hbox{\mathematics{\blacktriangleleft}}%
+ \setbox2\hbox{\vrule\!!height\ht0\!!depth\dp0\!!width.25ex}%
+ \hbox{\lower.03ex\box2\kern-.35ex\box0}}}}
+
+\def\gotoendcharacter
+ {\hbox
+ {\dogotocharacter\blacktriangleright
+ {\setbox0\hbox{\mathematics{\triangleright}}%
+ \copy0\kern-.11ex
+ \vrule\!!width.085ex\!!height1.075\ht0\!!depth\dp0}
+ {\setbox0\hbox{\mathematics{\blacktriangleright}}%
+ \setbox2\hbox{\vrule\!!height\ht0\!!depth\dp0\!!width.25ex}%
+ \hbox{\box0\kern-.35ex\lower.03ex\box2}}}}
+
+\def\gobackwardcharacter
+ {\mathematics{\dogotocharacter\blacktriangleright\triangleleft\blacktriangleleft}}
+
+\def\goforwardcharacter
+ {\mathematics{\dogotocharacter\blacktriangleright\triangleright\blacktriangleright}}
+
+\def\gonowherecharacter
+ {\mathematics{\bullet}}
+
+\def\gotosomewherecharacter
+ {{\hbox{\hsmash{\symbol[\v!previous]}\symbol[\v!next]}}}
+
+\unexpanded\def\closecharacter
+ {\dogotocharacter\boxtimes
+ {\ruledhbox{\mathematics{\times}}}
+ {\mathematics{\boxtimes}}}
+
+\def\goforjumpcharacter
+ {\hbox{\goforwardcharacter \kern-.5em\goforwardcharacter}}
+
+\def\gobackjumpcharacter
+ {\hbox{\gobackwardcharacter\kern-.5em\gobackwardcharacter}}
+
+%D The next two symbols are for Daniel Flipo:
+
+\ifx\high \undefined \let\high \firstofoneargument \fi % todo
+\ifx\notsmallcapped\undefined \let\notsmallcapped\firstofoneargument \fi % todo
+
+\definesymbol [Numero] [N\high{\notsmallcapped{o}\kern.2em}]
+\definesymbol [numero] [n\high{\notsmallcapped{o}\kern.2em}]
+
+\def\Numero{\symbol[Numero]}
+\def\numero{\symbol[numero]}
+
+\protect \endinput
diff --git a/tex/context/base/symb-mvs.tex b/tex/context/base/symb-mvs.tex
new file mode 100644
index 000000000..1dd3da0a0
--- /dev/null
+++ b/tex/context/base/symb-mvs.tex
@@ -0,0 +1,217 @@
+%D \module
+%D [ file=symb-mvs,
+%D version=2000.03.30,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Martin Vogels Symbole,
+%D author=Tobias Burnus \& 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 Martin Vogel Symbole font
+%D (marvosym). The names are derived from the \LATEX\ package
+%D \type {marvosym} of Thomas Henlich. The symbols are
+%D available as Type~1 font and are included in \TETEX\ and
+%D \FPTEX\ distributions.
+%D
+%D This symbol font offers the signs of the zodiac, four
+%D alternative the euro signs, some general office signs and
+%D some more.
+%D
+%D The font was designed by Martin Vogel who can be reached at
+%D \hyphenatedurl {martin.vogel@fh-bochum.de}. More information
+%D can be found at \hyphenatedurl
+%D {http://www.fh-bochum.de/fb1/vogel/marvosym.html}. The
+%D conversion to Type~1 font was done by Thomas Henlich, who
+%D can be reached at \hyphenatedurl
+%D {thenlich@rcs.urz.tu-dresden.de}.
+%D
+%D This module is based on the current \CTAN\ version (as of
+%D March 30, 2000) and is older than the TrueType version at
+%D Martin Vogel's Homepage. The definitions in this module
+%D reflect the \CTAN\ version. The font conversion was done by
+%D Thomas Henlich using \type {ttf2pt1}, a program that can be
+%D found at \hyphenatedurl
+%D {http://www.netspace.net.au/~mheath/ttf2pt1/}.
+%D
+%D Using the new version of \type {marvosymb}, the MVzero will
+%D has a slash and the FHBOLOGO, (wo)manface, and (wo)manfront
+%D are replaced by other symbols.
+
+\loadmapfile[original-base.map] % \loadmapfile[original-vogel-symbol]
+
+\definefontsynonym [MartinVogel] [fmvr8x]
+
+\def\MartinVogelSymbol#1{\getglyph{MartinVogel}{\char#1}}
+
+% Astro signs and signs of the zodiac
+
+\startsymbolset [astronomic]
+
+ \definesymbol [Sun] [\MartinVogelSymbol{192}]
+ \definesymbol [Moon] [\MartinVogelSymbol{193}]
+ \definesymbol [Mercury] [\MartinVogelSymbol{194}]
+ \definesymbol [Venus] [\MartinVogelSymbol{195}]
+ \definesymbol [Mars] [\MartinVogelSymbol{196}]
+ \definesymbol [Jupiter] [\MartinVogelSymbol{197}]
+ \definesymbol [Saturn] [\MartinVogelSymbol{198}]
+ \definesymbol [Uranus] [\MartinVogelSymbol{199}]
+ \definesymbol [Neptune] [\MartinVogelSymbol{200}]
+ \definesymbol [Pluto] [\MartinVogelSymbol{201}]
+
+\stopsymbolset
+
+\startsymbolset [zodiac]
+
+ \definesymbol [Aries] [\MartinVogelSymbol{224}]
+ \definesymbol [Taurus] [\MartinVogelSymbol{225}]
+ \definesymbol [Gemini] [\MartinVogelSymbol{226}]
+ \definesymbol [Cancer] [\MartinVogelSymbol{227}]
+ \definesymbol [Leo] [\MartinVogelSymbol{228}]
+ \definesymbol [Virgo] [\MartinVogelSymbol{229}]
+ \definesymbol [Libra] [\MartinVogelSymbol{230}]
+ \definesymbol [Scorpio] [\MartinVogelSymbol{231}]
+ \definesymbol [Sagittarius] [\MartinVogelSymbol{232}]
+ \definesymbol [Capricorn] [\MartinVogelSymbol{233}]
+ \definesymbol [Aquarius] [\MartinVogelSymbol{234}]
+ \definesymbol [Pisces] [\MartinVogelSymbol{235}]
+
+\stopsymbolset
+
+% Euro signs and CE
+
+\startsymbolset [europe]
+
+ \definesymbol [EUR] [\MartinVogelSymbol{164}]
+ \definesymbol [EURhv] [\MartinVogelSymbol {99}]
+ \definesymbol [EURcr] [\MartinVogelSymbol{100}]
+ \definesymbol [EURtm] [\MartinVogelSymbol{101}]
+ \definesymbol [CEsign] [\MartinVogelSymbol {67}]
+
+\stopsymbolset
+
+\startencoding[default]
+
+ \definecharacter texteuro {\symbol[europe][EUR]}
+
+\stopencoding
+
+\unexpanded\def\euro{\doiftextelse{\texteuro}{\texteuro}{\symbol[europe][EUR]}}
+
+% Numbers 0 to 9, @, A and p
+
+% taco: are these more general, like also in zapf dingbats?
+
+\startsymbolset [martinvogel 1]
+
+ \definesymbol [MVZero] [\MartinVogelSymbol {48}]
+ \definesymbol [MVOne] [\MartinVogelSymbol {49}]
+ \definesymbol [MVTwo] [\MartinVogelSymbol {50}]
+ \definesymbol [MVThree] [\MartinVogelSymbol {51}]
+ \definesymbol [MVFour] [\MartinVogelSymbol {52}]
+ \definesymbol [MVFive] [\MartinVogelSymbol {53}]
+ \definesymbol [MVSix] [\MartinVogelSymbol {54}]
+ \definesymbol [MVSeven] [\MartinVogelSymbol {55}]
+ \definesymbol [MVEight] [\MartinVogelSymbol {56}]
+ \definesymbol [MVNine] [\MartinVogelSymbol {57}]
+ \definesymbol [MVAt] [\MartinVogelSymbol {64}]
+ \definesymbol [MVA] [\MartinVogelSymbol{240}]
+ \definesymbol [MVp] [\MartinVogelSymbol{241}]
+
+\stopsymbolset
+
+% Office signs, crosses, circles, arrows
+
+\startsymbolset [martinvogel 2]
+
+ \definesymbol [CheckedBox] [\MartinVogelSymbol {86}]
+ \definesymbol [CrossedBox] [\MartinVogelSymbol {88}]
+ \definesymbol [PointingHand] [\MartinVogelSymbol {90}]
+ \definesymbol [WritingHand] [\MartinVogelSymbol {98}]
+ \definesymbol [Heart] [\MartinVogelSymbol{140}]
+ \definesymbol [FlatSteel] [\MartinVogelSymbol{150}]
+ \definesymbol [Squarepipe] [\MartinVogelSymbol{151}]
+ \definesymbol [Rectpipe] [\MartinVogelSymbol{152}]
+ \definesymbol [Lsteel] [\MartinVogelSymbol{153}]
+ \definesymbol [TTsteel] [\MartinVogelSymbol{154}]
+ \definesymbol [Circpipe] [\MartinVogelSymbol{155}]
+ \definesymbol [Tsteel] [\MartinVogelSymbol{156}]
+
+ \definesymbol [Stopsign] [\MartinVogelSymbol {33}]
+ \definesymbol [Beam] [\MartinVogelSymbol {34}]
+ \definesymbol [Bearing] [\MartinVogelSymbol {35}]
+ \definesymbol [Loosebearing] [\MartinVogelSymbol {36}]
+ \definesymbol [Fixedbearing] [\MartinVogelSymbol {37}]
+ \definesymbol [Lefttorque] [\MartinVogelSymbol {38}]
+ \definesymbol [Righttorque] [\MartinVogelSymbol {39}]
+ \definesymbol [Force] [\MartinVogelSymbol {40}]
+ \definesymbol [Lineload] [\MartinVogelSymbol {41}]
+ \definesymbol [Circles] [\MartinVogelSymbol {46}]
+ \definesymbol [Squaredot] [\MartinVogelSymbol{247}]
+
+ \definesymbol [Correspondes] [\MartinVogelSymbol {61}]
+ \definesymbol [Vectorarrowhigh] [\MartinVogelSymbol {80}]
+ \definesymbol [Vectorarrow] [\MartinVogelSymbol{112}]
+ \definesymbol [Rightarrow] [\MartinVogelSymbol {62}]
+ \definesymbol [Lightning] [\MartinVogelSymbol {69}]
+
+ \definesymbol [Snowflake] [\MartinVogelSymbol {42}]
+ \definesymbol [Kross] [\MartinVogelSymbol {43}]
+ \definesymbol [Cross] [\MartinVogelSymbol{134}]
+ \definesymbol [Celtcross] [\MartinVogelSymbol{135}]
+ \definesymbol [Ankh] [\MartinVogelSymbol{136}]
+ \definesymbol [Yingyang] [\MartinVogelSymbol {77}]
+
+ \definesymbol [Pickup] [\MartinVogelSymbol {0}] % ?
+ \definesymbol [Letter] [\MartinVogelSymbol {66}] % ?
+ \definesymbol [Mobilephone] [\MartinVogelSymbol {72}]
+ \definesymbol [Telephone] [\MartinVogelSymbol {84}]
+ \definesymbol [fax] [\MartinVogelSymbol{116}]
+ \definesymbol [FAX] [\MartinVogelSymbol{117}]
+ \definesymbol [Faxmachine] [\MartinVogelSymbol{118}]
+
+ \definesymbol [Clocklogo] [\MartinVogelSymbol {85}]
+ \definesymbol [Industry] [\MartinVogelSymbol {73}]
+ \definesymbol [Coffeecup] [\MartinVogelSymbol {75}]
+ \definesymbol [Info] [\MartinVogelSymbol{105}]
+ \definesymbol [Football] [\MartinVogelSymbol{111}]
+ \definesymbol [Frowny] [\MartinVogelSymbol{167}]
+ \definesymbol [Smiley] [\MartinVogelSymbol{169}]
+ \definesymbol [Bicycle] [\MartinVogelSymbol{174}]
+
+ \definesymbol [Rightscissors] [\MartinVogelSymbol {81}]
+ \definesymbol [Leftscissors] [\MartinVogelSymbol {83}]
+ \definesymbol [Cutright] [\MartinVogelSymbol{113}]
+ \definesymbol [Cutleft] [\MartinVogelSymbol{115}]
+ \definesymbol [Kutline] [\MartinVogelSymbol {82}] % K ?
+ \definesymbol [Cutline] [\MartinVogelSymbol{114}]
+
+\stopsymbolset
+
+% FHBO (Fachhochschule Bochum), face, humans, bat
+
+\startsymbolset [martinvogel 3]
+
+ \definesymbol [FHBOlogo] [\MartinVogelSymbol {70}]
+ \definesymbol [FHBOLOGO] [\MartinVogelSymbol{102}]
+ \definesymbol [Womanside] [\MartinVogelSymbol{204}]
+ \definesymbol [Manside] [\MartinVogelSymbol{205}]
+ \definesymbol [Womanfront] [\MartinVogelSymbol{206}]
+ \definesymbol [Manfront] [\MartinVogelSymbol{207}]
+ \definesymbol [Bat] [\MartinVogelSymbol{253}]
+ \definesymbol [Womanface] [\MartinVogelSymbol{254}]
+ \definesymbol [MartinVogel] [\MartinVogelSymbol{255}]
+
+\stopsymbolset
+
+%D \showsymbolset[astronomic]
+%D \showsymbolset[zodiac]
+%D \showsymbolset[europe]
+%D \showsymbolset[martinvogel 1]
+%D \showsymbolset[martinvogel 2]
+%D \showsymbolset[martinvogel 3]
+
+\endinput
diff --git a/tex/context/base/symb-nav.tex b/tex/context/base/symb-nav.tex
new file mode 100644
index 000000000..90a798e01
--- /dev/null
+++ b/tex/context/base/symb-nav.tex
@@ -0,0 +1,126 @@
+%D \module
+%D [ file=symb-nav,
+%D version=1998.07.20,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Navigational Symbols,
+%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
+
+\loadmapfile[original-base.map] % \loadmapfile [original-context-symbol.map]
+
+\ifnum\texengine=\luatexengine
+ \definefontsynonym [ContextNavigation] [contnav.tfm]
+\else
+ \definefontsynonym [ContextNavigation] [contnav]
+\fi
+
+\def\ContextNavigationGlyph#1{\getglyph{ContextNavigation}{\char#1}}
+
+\startsymbolset [navigation 1]
+
+ \definesymbol [\v!firstpage] [\ContextNavigationGlyph{3}]
+ \definesymbol [\v!previouspage] [\ContextNavigationGlyph{1}]
+ \definesymbol [\v!nextpage] [\ContextNavigationGlyph{2}]
+ \definesymbol [\v!lastpage] [\ContextNavigationGlyph{4}]
+
+ \definesymbol [\v!PreviousJump] [\ContextNavigationGlyph{5}]
+ \definesymbol [\v!NextJump] [\ContextNavigationGlyph{6}]
+
+ \definesymbol [\v!CloseDocument] [\ContextNavigationGlyph{7}]
+
+ \definesymbol [\v!firstsubpage] [\ContextNavigationGlyph{3}]
+ \definesymbol [\v!previoussubpage] [\ContextNavigationGlyph{1}]
+ \definesymbol [\v!nextsubpage] [\ContextNavigationGlyph{2}]
+ \definesymbol [\v!lastsubpage] [\ContextNavigationGlyph{4}]
+
+ \definesymbol [\v!StartSound] [\ContextNavigationGlyph{2}]
+ \definesymbol [\v!PauseSound] [\ContextNavigationGlyph{8}]
+ \definesymbol [\v!StopSound] [\ContextNavigationGlyph{7}]
+
+ \definesymbol [\v!StartMovie] [\ContextNavigationGlyph{2}]
+ \definesymbol [\v!PauseMovie] [\ContextNavigationGlyph{8}]
+ \definesymbol [\v!StopMovie] [\ContextNavigationGlyph{7}]
+
+ \definesymbol [\v!StartRendering] [\ContextNavigationGlyph{2}]
+ \definesymbol [\v!PauseRendering] [\ContextNavigationGlyph{8}]
+ \definesymbol [\v!StopRendering] [\ContextNavigationGlyph{7}]
+ \definesymbol [\v!ResumeRendering] [\ContextNavigationGlyph{2}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 2]
+
+ \definesymbol [\v!firstpage] [\ContextNavigationGlyph{103}]
+ \definesymbol [\v!previouspage] [\ContextNavigationGlyph{101}]
+ \definesymbol [\v!nextpage] [\ContextNavigationGlyph{102}]
+ \definesymbol [\v!lastpage] [\ContextNavigationGlyph{104}]
+
+ \definesymbol [\v!PreviousJump] [\ContextNavigationGlyph{105}]
+ \definesymbol [\v!NextJump] [\ContextNavigationGlyph{106}]
+
+ \definesymbol [\v!CloseDocument] [\ContextNavigationGlyph{107}]
+
+ \definesymbol [\v!firstsubpage] [\ContextNavigationGlyph{103}]
+ \definesymbol [\v!previoussubpage] [\ContextNavigationGlyph{101}]
+ \definesymbol [\v!nextsubpage] [\ContextNavigationGlyph{102}]
+ \definesymbol [\v!lastsubpage] [\ContextNavigationGlyph{104}]
+
+ \definesymbol [\v!StartSound] [\ContextNavigationGlyph{102}]
+ \definesymbol [\v!PauseSound] [\ContextNavigationGlyph{108}]
+ \definesymbol [\v!StopSound] [\ContextNavigationGlyph{107}]
+
+ \definesymbol [\v!StartMovie] [\ContextNavigationGlyph{102}]
+ \definesymbol [\v!PauseMovie] [\ContextNavigationGlyph{108}]
+ \definesymbol [\v!StopMovie] [\ContextNavigationGlyph{107}]
+
+ \definesymbol [\v!StartRendering] [\ContextNavigationGlyph{102}]
+ \definesymbol [\v!PauseRendering] [\ContextNavigationGlyph{108}]
+ \definesymbol [\v!StopRendering] [\ContextNavigationGlyph{107}]
+ \definesymbol [\v!ResumeRendering] [\ContextNavigationGlyph{102}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 3]
+
+ \definesymbol [\v!firstpage] [\ContextNavigationGlyph{203}]
+ \definesymbol [\v!previouspage] [\ContextNavigationGlyph{201}]
+ \definesymbol [\v!nextpage] [\ContextNavigationGlyph{202}]
+ \definesymbol [\v!lastpage] [\ContextNavigationGlyph{204}]
+
+ \definesymbol [\v!PreviousJump] [\ContextNavigationGlyph{205}]
+ \definesymbol [\v!NextJump] [\ContextNavigationGlyph{206}]
+
+ \definesymbol [\v!CloseDocument] [\ContextNavigationGlyph{207}]
+
+ \definesymbol [\v!firstsubpage] [\ContextNavigationGlyph{203}]
+ \definesymbol [\v!previoussubpage] [\ContextNavigationGlyph{201}]
+ \definesymbol [\v!nextsubpage] [\ContextNavigationGlyph{202}]
+ \definesymbol [\v!lastsubpage] [\ContextNavigationGlyph{204}]
+
+ \definesymbol [\v!StartSound] [\ContextNavigationGlyph{202}]
+ \definesymbol [\v!PauseSound] [\ContextNavigationGlyph{208}]
+ \definesymbol [\v!StopSound] [\ContextNavigationGlyph{207}]
+
+ \definesymbol [\v!StartMovie] [\ContextNavigationGlyph{202}]
+ \definesymbol [\v!PauseMovie] [\ContextNavigationGlyph{208}]
+ \definesymbol [\v!StopMovie] [\ContextNavigationGlyph{207}]
+
+ \definesymbol [\v!StartRendering] [\ContextNavigationGlyph{202}]
+ \definesymbol [\v!PauseRendering] [\ContextNavigationGlyph{208}]
+ \definesymbol [\v!StopRendering] [\ContextNavigationGlyph{207}]
+ \definesymbol [\v!ResumeRendering] [\ContextNavigationGlyph{202}]
+
+\stopsymbolset
+
+%D \showsymbolset[navigation 1]
+%D \showsymbolset[navigation 2]
+%D \showsymbolset[navigation 3]
+
+\protect \endinput
diff --git a/tex/context/base/symb-run.mkii b/tex/context/base/symb-run.mkii
new file mode 100644
index 000000000..4e714832c
--- /dev/null
+++ b/tex/context/base/symb-run.mkii
@@ -0,0 +1,54 @@
+%D \module
+%D [ file=symb-run, % code moved from symb-ini
+%D version=1998.07.20,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\gdef\doshowsymbolset[#1][#2]% todo: make nicer, use legend or so
+ {\vbox\bgroup
+ \blank
+ \getparameters[\??ss][\c!n=5,#2]%
+ \forcesymbolset[#1]%
+ \doifsymbolsetelse{#1}
+ {\global\let\allfigures\empty
+ \doglobal\newcounter\figurecounter
+ \setupcolors[\c!state=\v!start]% to prevent mps color conversion
+ \dontcomplain
+ \def\doshowsymbols% global needed due to grouping in alignment
+ {\expanded{\globalprocesscommalist[\symbolset{#1}]}\docommand}%
+ \def\docommand##1%
+ {\vbox
+ {\forgetall
+ \tttf
+ \halign
+ {\hss\quad####\strut\quad\hss\cr
+ \symbol[##1]\quad{\red\ruledhbox{\black\symbol[##1]}}\cr
+ \tfx##1\cr}}%
+ \doglobal\increment\figurecounter
+ \ifnum\figurecounter=\@@ssn
+ \doglobal\newcounter\figurecounter
+ \def\next{\crcr\noalign{\vskip1ex}}%
+ \else
+ \def\next{&}%
+ \fi
+ \next}%
+ \tabskip\zeropoint \!!plus 1fill
+ \halign to \hsize
+ {&\hss##\hss\cr\doshowsymbols\crcr}}%
+ {}%
+ \blank
+ \egroup}
+
+\gdef\showsymbolset
+ {\dodoubleempty\doshowsymbolset}
+
+\protect \endinput
diff --git a/tex/context/base/symb-run.mkiv b/tex/context/base/symb-run.mkiv
new file mode 100644
index 000000000..4e714832c
--- /dev/null
+++ b/tex/context/base/symb-run.mkiv
@@ -0,0 +1,54 @@
+%D \module
+%D [ file=symb-run, % code moved from symb-ini
+%D version=1998.07.20,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\gdef\doshowsymbolset[#1][#2]% todo: make nicer, use legend or so
+ {\vbox\bgroup
+ \blank
+ \getparameters[\??ss][\c!n=5,#2]%
+ \forcesymbolset[#1]%
+ \doifsymbolsetelse{#1}
+ {\global\let\allfigures\empty
+ \doglobal\newcounter\figurecounter
+ \setupcolors[\c!state=\v!start]% to prevent mps color conversion
+ \dontcomplain
+ \def\doshowsymbols% global needed due to grouping in alignment
+ {\expanded{\globalprocesscommalist[\symbolset{#1}]}\docommand}%
+ \def\docommand##1%
+ {\vbox
+ {\forgetall
+ \tttf
+ \halign
+ {\hss\quad####\strut\quad\hss\cr
+ \symbol[##1]\quad{\red\ruledhbox{\black\symbol[##1]}}\cr
+ \tfx##1\cr}}%
+ \doglobal\increment\figurecounter
+ \ifnum\figurecounter=\@@ssn
+ \doglobal\newcounter\figurecounter
+ \def\next{\crcr\noalign{\vskip1ex}}%
+ \else
+ \def\next{&}%
+ \fi
+ \next}%
+ \tabskip\zeropoint \!!plus 1fill
+ \halign to \hsize
+ {&\hss##\hss\cr\doshowsymbols\crcr}}%
+ {}%
+ \blank
+ \egroup}
+
+\gdef\showsymbolset
+ {\dodoubleempty\doshowsymbolset}
+
+\protect \endinput
diff --git a/tex/context/base/symb-uni.tex b/tex/context/base/symb-uni.tex
new file mode 100644
index 000000000..fcd613e7f
--- /dev/null
+++ b/tex/context/base/symb-uni.tex
@@ -0,0 +1,1123 @@
+%D \module
+%D [ file=symb-uni,
+%D version=2004.11.15,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Unicode Symbols,
+%D author=Adam T. Lindsay,
+%D date=\currentdate,
+%D copyright={Adam T. Lindsay / PRAGMA}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C prepared by Adam T. Lindsay.
+
+%D The content of this file originates from the Unicode standard, via some
+%D original XSLT scripts and some hand-editing. This file is open for use
+%D with the ConTeXt typesetting system.
+%D
+%D Adam considers the symbol names and categories to be stable, as they're
+%D directly derived from the Unicode standard.
+%D
+%D \startitemize[packed]
+%D \item Originated 2004-01-05 by Adam T. Lindsay
+%D \item Updated 2004-01-16 with Unicode vector 0x27xx and some in
+%D 215x and 246x
+%D \item Updated 2004-11-15 to include default fonts for MacOSX and
+%D \XETEX.
+%D \stopitemize
+%D
+%D The following macros adapt to default fonts (that contain the characters)
+%D in MacOSX. The font selection mechanism is likely to change once \XETEX\
+%D correctly supports \type{\doiffontcharelse}.
+
+\doifundefinedelse{XeTeXversion}
+ {\let\USymbChar \uchar
+ \let\USymbCharTwo \uchar
+ \let\USymbCharZapf\uchar}
+ {\def\USymbChar #1#2{\bgroup\UnicodeSymbolFont \uchar{#1}{#2}\relax\egroup}
+ \def\USymbCharTwo #1#2{\bgroup\UnicodeSymbolFontTwo \uchar{#1}{#2}\relax\egroup}
+ \def\USymbCharZapf#1#2{\bgroup\UnicodeSymbolFontZapf\uchar{#1}{#2}\relax\egroup}
+ \doifundefined{UnicodeSymbolFont} {\definefont[UnicodeSymbolFont] ["Apple Symbols" sa *]}
+ \doifundefined{UnicodeSymbolFontTwo} {\definefont[UnicodeSymbolFontTwo] ["Lucida Grande" sa *]}
+ \doifundefined{UnicodeSymbolFontZapf}{\definefont[UnicodeSymbolFontZapf]["Zapf Dingbats" sa *]}}
+
+\startsymbolset[Unicode Additional Punctuation] % 0x2000: Requires UnicodeRegular20
+
+ \definesymbol[Caret][\USymbChar{32}{56}] % CARET
+ \definesymbol[ReferenceMark][\USymbChar{32}{59}] % REFERENCE MARK
+ \definesymbol[DoubleExclamationMark][\USymbChar{32}{60}] % DOUBLE EXCLAMATION MARK
+ \definesymbol[Interrobang][\USymbChar{32}{61}] % INTERROBANG
+ \definesymbol[Overline][\USymbChar{32}{62}] % OVERLINE
+ \definesymbol[Undertie][\USymbChar{32}{63}] % UNDERTIE
+ \definesymbol[CharacterTie][\USymbChar{32}{64}] % CHARACTER TIE
+ \definesymbol[CaretInsertionPoint][\USymbChar{32}{65}] % CARET INSERTION POINT
+ \definesymbol[Asterism][\USymbChar{32}{66}] % ASTERISM
+ \definesymbol[HyphenBullet][\USymbChar{32}{67}] % HYPHEN BULLET
+ \definesymbol[FractionSlash][\USymbChar{32}{68}] % FRACTION SLASH
+ \definesymbol[LeftSquareBracketWithQuill][\USymbChar{32}{69}] % LEFT SQUARE BRACKET WITH QUILL
+ \definesymbol[RightSquareBracketWithQuill][\USymbChar{32}{70}] % RIGHT SQUARE BRACKET WITH QUILL
+ \definesymbol[QuestionExclamationMark][\USymbChar{32}{72}] % QUESTION EXCLAMATION MARK
+ \definesymbol[ExclamationQuestionMark][\USymbChar{32}{73}] % EXCLAMATION QUESTION MARK
+ \definesymbol[TironianSignEt][\USymbChar{32}{74}] % TIRONIAN SIGN ET
+ \definesymbol[ReversedPilcrowSign][\USymbChar{32}{75}] % REVERSED PILCROW SIGN
+ \definesymbol[BlackLeftwardsBullet][\USymbChar{32}{76}] % BLACK LEFTWARDS BULLET
+ \definesymbol[BlackRightwardsBullet][\USymbChar{32}{77}] % BLACK RIGHTWARDS BULLET
+
+\stopsymbolset
+
+\startsymbolset[Unicode Currency] % 0x20A0: Requires UnicodeRegular20
+
+ \definesymbol[Euro-currencySign][\USymbChar{32}{160}] % EURO-CURRENCY SIGN
+ \definesymbol[ColonSign][\USymbChar{32}{161}] % COLON SIGN
+ \definesymbol[CruzeiroSign][\USymbChar{32}{162}] % CRUZEIRO SIGN
+ \definesymbol[FrenchFrancSign][\USymbChar{32}{163}] % FRENCH FRANC SIGN
+ \definesymbol[LiraSign][\USymbChar{32}{164}] % LIRA SIGN
+ \definesymbol[MillSign][\USymbChar{32}{165}] % MILL SIGN
+ \definesymbol[NairaSign][\USymbChar{32}{166}] % NAIRA SIGN
+ \definesymbol[PesetaSign][\USymbChar{32}{167}] % PESETA SIGN
+ \definesymbol[RupeeSign][\USymbChar{32}{168}] % RUPEE SIGN
+ \definesymbol[WonSign][\USymbChar{32}{169}] % WON SIGN
+ \definesymbol[NewSheqelSign][\USymbChar{32}{170}] % NEW SHEQEL SIGN
+ \definesymbol[DongSign][\USymbChar{32}{171}] % DONG SIGN
+ \definesymbol[EuroSign][\USymbChar{32}{172}] % EURO SIGN
+ \definesymbol[KipSign][\USymbChar{32}{173}] % KIP SIGN
+ \definesymbol[TugrikSign][\USymbChar{32}{174}] % TUGRIK SIGN
+ \definesymbol[DrachmaSign][\USymbChar{32}{175}] % DRACHMA SIGN
+ \definesymbol[GermanPennySign][\USymbChar{32}{176}] % [Unassigned U+20B0]
+ \definesymbol[PfennigSign][\USymbChar{32}{176}] % Unofficial duplicate
+ \definesymbol[PesoSign][\USymbChar{32}{177}] % [Unassigned U+20B1]
+
+\stopsymbolset
+
+
+\startsymbolset[Unicode Letterlike] % 0x2100: Requires UnicodeRegular21
+
+ \definesymbol[DegreeCelsius][\USymbChar{33}{3}] % DEGREE CELSIUS
+ \definesymbol[EulerConstant][\USymbChar{33}{7}] % EULER CONSTANT
+ \definesymbol[Scruple][\USymbChar{33}{8}] % SCRUPLE
+ \definesymbol[DegreeFahrenheit][\USymbChar{33}{9}] % DEGREE FAHRENHEIT
+ \definesymbol[PlanckConstant][\USymbChar{33}{14}] % PLANCK CONSTANT
+ \definesymbol[PlanckConstantOverTwoPi][\USymbChar{33}{15}] % PLANCK CONSTANT OVER TWO PI
+ \definesymbol[LBBarSymbol][\USymbChar{33}{20}] % L B BAR SYMBOL
+ \definesymbol[Versicle][\USymbChar{33}{35}] % VERSICLE
+ \definesymbol[OunceSign][\USymbChar{33}{37}] % OUNCE SIGN
+ \definesymbol[OhmSign][\USymbChar{33}{38}] % OHM SIGN
+ \definesymbol[InvertedOhmSign][\USymbChar{33}{39}] % INVERTED OHM SIGN
+ \definesymbol[KelvinSign][\USymbChar{33}{42}] % KELVIN SIGN
+ \definesymbol[AngstromSign][\USymbChar{33}{43}] % ANGSTROM SIGN
+ \definesymbol[EstimatedSymbol][\USymbChar{33}{46}] % ESTIMATED SYMBOL
+
+\stopsymbolset
+
+\startsymbolset[Unicode Letterlike Additional] % 0x2100: Requires UnicodeRegular21
+
+ \definesymbol[AccountOf][\USymbChar{33}{0}] % ACCOUNT OF
+ \definesymbol[AddressedToTheSubject][\USymbChar{33}{1}] % ADDRESSED TO THE SUBJECT
+ \definesymbol[CareOf][\USymbChar{33}{5}] % CARE OF
+ \definesymbol[CadaUna][\USymbChar{33}{6}] % CADA UNA
+ \definesymbol[CentreLineSymbol][\USymbChar{33}{4}] % CENTRE LINE SYMBOL
+ \definesymbol[NumeroSign][\USymbChar{33}{22}] % NUMERO SIGN
+ \definesymbol[SoundRecordingCopyright][\USymbChar{33}{23}] % SOUND RECORDING COPYRIGHT
+ \definesymbol[PrescriptionTake][\USymbChar{33}{30}] % PRESCRIPTION TAKE
+ \definesymbol[Response][\USymbChar{33}{31}] % RESPONSE
+ \definesymbol[ServiceMark][\USymbChar{33}{32}] % SERVICE MARK
+ \definesymbol[TelephoneSign][\USymbChar{33}{33}] % TELEPHONE SIGN
+ \definesymbol[TradeMarkSign][\USymbChar{33}{34}] % TRADE MARK SIGN
+ \definesymbol[InformationSource][\USymbChar{33}{57}] % INFORMATION SOURCE
+ \definesymbol[PropertyLine][\USymbChar{33}{74}] % [Unassigned U+214A]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Script Letterlike] % 0x2100: Requires UnicodeRegular21
+
+ \definesymbol[ScriptSmallG][\USymbChar{33}{10}] % SCRIPT SMALL G
+ \definesymbol[ScriptCapitalH][\USymbChar{33}{11}] % SCRIPT CAPITAL H
+ \definesymbol[ScriptCapitalI][\USymbChar{33}{16}] % SCRIPT CAPITAL I
+ \definesymbol[ScriptCapitalL][\USymbChar{33}{18}] % SCRIPT CAPITAL L
+ \definesymbol[ScriptSmallL][\USymbChar{33}{19}] % SCRIPT SMALL L
+ \definesymbol[ScriptCapitalP][\USymbChar{33}{24}] % SCRIPT CAPITAL P
+ \definesymbol[ScriptCapitalR][\USymbChar{33}{27}] % SCRIPT CAPITAL R
+ \definesymbol[ScriptSmallE][\USymbChar{33}{47}] % SCRIPT SMALL E
+ \definesymbol[ScriptCapitalE][\USymbChar{33}{48}] % SCRIPT CAPITAL E
+ \definesymbol[ScriptCapitalF][\USymbChar{33}{49}] % SCRIPT CAPITAL F
+ \definesymbol[ScriptCapitalB][\USymbChar{33}{44}] % SCRIPT CAPITAL B
+ \definesymbol[ScriptCapitalM][\USymbChar{33}{51}] % SCRIPT CAPITAL M
+ \definesymbol[ScriptSmallO][\USymbChar{33}{52}] % SCRIPT SMALL O
+
+\stopsymbolset
+
+\startsymbolset[Unicode Hebrew Letterlike] % 0x2100: Requires UnicodeRegular21
+
+ \definesymbol[AlefSymbol][\USymbChar{33}{53}] % ALEF SYMBOL
+ \definesymbol[BetSymbol][\USymbChar{33}{54}] % BET SYMBOL
+ \definesymbol[GimelSymbol][\USymbChar{33}{55}] % GIMEL SYMBOL
+ \definesymbol[DaletSymbol][\USymbChar{33}{56}] % DALET SYMBOL
+
+\stopsymbolset
+
+\startsymbolset[Unicode Turned Letterlike] % 0x2100: Requires UnicodeRegular21
+
+ \definesymbol[RotatedCapitalQ][\USymbChar{33}{58}] % ROTATED CAPITAL Q
+ \definesymbol[TurnedSansSerifCapitalG][\USymbChar{33}{65}] % [Unassigned U+2141]
+ \definesymbol[TurnedSansSerifCapitalL][\USymbChar{33}{66}] % [Unassigned U+2142]
+ \definesymbol[ReversedSansSerifCapitalL][\USymbChar{33}{67}] % [Unassigned U+2143]
+ \definesymbol[TurnedSansSerifCapitalY][\USymbChar{33}{68}] % [Unassigned U+2144]
+ \definesymbol[TurnedAmpersand][\USymbChar{33}{75}] % [Unassigned U+214B]
+ \definesymbol[TurnedGreekSmallLetterIota][\USymbChar{33}{41}] % TURNED GREEK SMALL LETTER IOTA
+ \definesymbol[TurnedCapitalF][\USymbChar{33}{50}] % TURNED CAPITAL F
+
+\stopsymbolset
+
+\startsymbolset[Unicode Black-letter Letterlike] % 0x2100: Requires UnicodeRegular21
+
+ \definesymbol[BlackLetterCapitalH][\USymbChar{33}{12}] % BLACK-LETTER CAPITAL H
+ \definesymbol[BlackLetterCapitalI][\USymbChar{33}{17}] % BLACK-LETTER CAPITAL I
+ \definesymbol[BlackLetterCapitalR][\USymbChar{33}{28}] % BLACK-LETTER CAPITAL R
+ \definesymbol[BlackLetterCapitalZ][\USymbChar{33}{40}] % BLACK-LETTER CAPITAL Z
+ \definesymbol[BlackLetterCapitalC][\USymbChar{33}{45}] % BLACK-LETTER CAPITAL C
+
+\stopsymbolset
+
+\startsymbolset[Unicode Double-struck Letterlike Math] % 0x2100: Requires UnicodeRegular21
+
+ \definesymbol[DoubleStruckCapitalC][\USymbChar{33}{2}] % DOUBLE-STRUCK CAPITAL C
+ \definesymbol[DoubleStruckCapitalH][\USymbChar{33}{13}] % DOUBLE-STRUCK CAPITAL H
+ \definesymbol[DoubleStruckCapitalN][\USymbChar{33}{21}] % DOUBLE-STRUCK CAPITAL N
+ \definesymbol[DoubleStruckCapitalP][\USymbChar{33}{25}] % DOUBLE-STRUCK CAPITAL P
+ \definesymbol[DoubleStruckCapitalQ][\USymbChar{33}{26}] % DOUBLE-STRUCK CAPITAL Q
+ \definesymbol[DoubleStruckCapitalR][\USymbChar{33}{29}] % DOUBLE-STRUCK CAPITAL R
+ \definesymbol[DoubleStruckCapitalZ][\USymbChar{33}{36}] % DOUBLE-STRUCK CAPITAL Z
+ \definesymbol[DoubleStruckSmallGamma][\USymbChar{33}{61}] % [Unassigned U+213D]
+ \definesymbol[DoubleStruckCapitalGamma][\USymbChar{33}{62}] % [Unassigned U+213E]
+ \definesymbol[DoubleStruckCapitalPi][\USymbChar{33}{63}] % [Unassigned U+213F]
+ \definesymbol[DoubleStruckNArySummation][\USymbChar{33}{64}] % [Unassigned U+2140]
+ \definesymbol[DoubleStruckItalicCapitalD][\USymbChar{33}{69}] % [Unassigned U+2145]
+ \definesymbol[DoubleStruckItalicSmallD][\USymbChar{33}{70}] % [Unassigned U+2146]
+ \definesymbol[DoubleStruckItalicSmallE][\USymbChar{33}{71}] % [Unassigned U+2147]
+ \definesymbol[DoubleStruckItalicSmallI][\USymbChar{33}{72}] % [Unassigned U+2148]
+ \definesymbol[DoubleStruckItalicSmallJ][\USymbChar{33}{73}] % [Unassigned U+2149]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Roman Numerals] % 0x2150: Requires UnicodeRegular21
+
+ \definesymbol[RomanNumeralOne][\USymbCharTwo{33}{96}] % ROMAN NUMERAL ONE
+ \definesymbol[RomanNumeralTwo][\USymbCharTwo{33}{97}] % ROMAN NUMERAL TWO
+ \definesymbol[RomanNumeralThree][\USymbCharTwo{33}{98}] % ROMAN NUMERAL THREE
+ \definesymbol[RomanNumeralFour][\USymbCharTwo{33}{99}] % ROMAN NUMERAL FOUR
+ \definesymbol[RomanNumeralFive][\USymbCharTwo{33}{100}] % ROMAN NUMERAL FIVE
+ \definesymbol[RomanNumeralSix][\USymbCharTwo{33}{101}] % ROMAN NUMERAL SIX
+ \definesymbol[RomanNumeralSeven][\USymbCharTwo{33}{102}] % ROMAN NUMERAL SEVEN
+ \definesymbol[RomanNumeralEight][\USymbCharTwo{33}{103}] % ROMAN NUMERAL EIGHT
+ \definesymbol[RomanNumeralNine][\USymbCharTwo{33}{104}] % ROMAN NUMERAL NINE
+ \definesymbol[RomanNumeralTen][\USymbCharTwo{33}{105}] % ROMAN NUMERAL TEN
+ \definesymbol[RomanNumeralEleven][\USymbCharTwo{33}{106}] % ROMAN NUMERAL ELEVEN
+ \definesymbol[RomanNumeralTwelve][\USymbCharTwo{33}{107}] % ROMAN NUMERAL TWELVE
+ \definesymbol[RomanNumeralFifty][\USymbCharTwo{33}{108}] % ROMAN NUMERAL FIFTY
+ \definesymbol[RomanNumeralOneHundred][\USymbCharTwo{33}{109}] % ROMAN NUMERAL ONE HUNDRED
+ \definesymbol[RomanNumeralFiveHundred][\USymbCharTwo{33}{110}] % ROMAN NUMERAL FIVE HUNDRED
+ \definesymbol[RomanNumeralOneThousand][\USymbCharTwo{33}{111}] % ROMAN NUMERAL ONE THOUSAND
+ \definesymbol[RomanNumeralOneThousandCD][\USymbCharTwo{33}{128}] % ROMAN NUMERAL ONE THOUSAND C D
+ \definesymbol[RomanNumeralFiveThousand][\USymbCharTwo{33}{129}] % ROMAN NUMERAL FIVE THOUSAND
+ \definesymbol[RomanNumeralTenThousand][\USymbCharTwo{33}{130}] % ROMAN NUMERAL TEN THOUSAND
+ \definesymbol[RomanNumeralReversedOneHundred][\USymbCharTwo{33}{131}] % ROMAN NUMERAL REVERSED ONE HUNDRED
+
+\stopsymbolset
+
+\startsymbolset[Unicode Small Roman Numerals] % 0x2150: Requires UnicodeRegular21
+
+ \definesymbol[SmallRomanNumeralOne][\USymbCharTwo{33}{112}] % SMALL ROMAN NUMERAL ONE
+ \definesymbol[SmallRomanNumeralTwo][\USymbCharTwo{33}{113}] % SMALL ROMAN NUMERAL TWO
+ \definesymbol[SmallRomanNumeralThree][\USymbCharTwo{33}{114}] % SMALL ROMAN NUMERAL THREE
+ \definesymbol[SmallRomanNumeralFour][\USymbCharTwo{33}{115}] % SMALL ROMAN NUMERAL FOUR
+ \definesymbol[SmallRomanNumeralFive][\USymbCharTwo{33}{116}] % SMALL ROMAN NUMERAL FIVE
+ \definesymbol[SmallRomanNumeralSix][\USymbCharTwo{33}{117}] % SMALL ROMAN NUMERAL SIX
+ \definesymbol[SmallRomanNumeralSeven][\USymbCharTwo{33}{118}] % SMALL ROMAN NUMERAL SEVEN
+ \definesymbol[SmallRomanNumeralEight][\USymbCharTwo{33}{119}] % SMALL ROMAN NUMERAL EIGHT
+ \definesymbol[SmallRomanNumeralNine][\USymbCharTwo{33}{120}] % SMALL ROMAN NUMERAL NINE
+ \definesymbol[SmallRomanNumeralTen][\USymbCharTwo{33}{121}] % SMALL ROMAN NUMERAL TEN
+ \definesymbol[SmallRomanNumeralEleven][\USymbCharTwo{33}{122}] % SMALL ROMAN NUMERAL ELEVEN
+ \definesymbol[SmallRomanNumeralTwelve][\USymbCharTwo{33}{123}] % SMALL ROMAN NUMERAL TWELVE
+ \definesymbol[SmallRomanNumeralFifty][\USymbCharTwo{33}{124}] % SMALL ROMAN NUMERAL FIFTY
+ \definesymbol[SmallRomanNumeralOneHundred][\USymbCharTwo{33}{125}] % SMALL ROMAN NUMERAL ONE HUNDRED
+ \definesymbol[SmallRomanNumeralFiveHundred][\USymbCharTwo{33}{126}] % SMALL ROMAN NUMERAL FIVE HUNDRED
+ \definesymbol[SmallRomanNumeralOneThousand][\USymbCharTwo{33}{127}] % SMALL ROMAN NUMERAL ONE THOUSAND
+
+\stopsymbolset
+
+\startsymbolset[Unicode Arrows] % 0x2190: Requires UnicodeRegular21
+
+ \definesymbol[LeftwardsArrow][\USymbChar{33}{144}] % LEFTWARDS ARROW
+ \definesymbol[UpwardsArrow][\USymbChar{33}{145}] % UPWARDS ARROW
+ \definesymbol[RightwardsArrow][\USymbChar{33}{146}] % RIGHTWARDS ARROW
+ \definesymbol[DownwardsArrow][\USymbChar{33}{147}] % DOWNWARDS ARROW
+ \definesymbol[LeftRightArrow][\USymbChar{33}{148}] % LEFT RIGHT ARROW
+ \definesymbol[UpDownArrow][\USymbChar{33}{149}] % UP DOWN ARROW
+ \definesymbol[NorthWestArrow][\USymbChar{33}{150}] % NORTH WEST ARROW
+ \definesymbol[NorthEastArrow][\USymbChar{33}{151}] % NORTH EAST ARROW
+ \definesymbol[SouthEastArrow][\USymbChar{33}{152}] % SOUTH EAST ARROW
+ \definesymbol[SouthWestArrow][\USymbChar{33}{153}] % SOUTH WEST ARROW
+ \definesymbol[LeftwardsArrowWithStroke][\USymbChar{33}{154}] % LEFTWARDS ARROW WITH STROKE
+ \definesymbol[RightwardsArrowWithStroke][\USymbChar{33}{155}] % RIGHTWARDS ARROW WITH STROKE
+ \definesymbol[LeftwardsWaveArrow][\USymbChar{33}{156}] % LEFTWARDS WAVE ARROW
+ \definesymbol[RightwardsWaveArrow][\USymbChar{33}{157}] % RIGHTWARDS WAVE ARROW
+ \definesymbol[LeftwardsTwoHeadedArrow][\USymbChar{33}{158}] % LEFTWARDS TWO HEADED ARROW
+ \definesymbol[UpwardsTwoHeadedArrow][\USymbChar{33}{159}] % UPWARDS TWO HEADED ARROW
+ \definesymbol[RightwardsTwoHeadedArrow][\USymbChar{33}{160}] % RIGHTWARDS TWO HEADED ARROW
+ \definesymbol[DownwardsTwoHeadedArrow][\USymbChar{33}{161}] % DOWNWARDS TWO HEADED ARROW
+ \definesymbol[LeftwardsArrowWithTail][\USymbChar{33}{162}] % LEFTWARDS ARROW WITH TAIL
+ \definesymbol[RightwardsArrowWithTail][\USymbChar{33}{163}] % RIGHTWARDS ARROW WITH TAIL
+ \definesymbol[LeftwardsArrowFromBar][\USymbChar{33}{164}] % LEFTWARDS ARROW FROM BAR
+ \definesymbol[UpwardsArrowFromBar][\USymbChar{33}{165}] % UPWARDS ARROW FROM BAR
+ \definesymbol[RightwardsArrowFromBar][\USymbChar{33}{166}] % RIGHTWARDS ARROW FROM BAR
+ \definesymbol[DownwardsArrowFromBar][\USymbChar{33}{167}] % DOWNWARDS ARROW FROM BAR
+ \definesymbol[UpDownArrowWithBase][\USymbChar{33}{168}] % UP DOWN ARROW WITH BASE
+ \definesymbol[LeftwardsArrowWithHook][\USymbChar{33}{169}] % LEFTWARDS ARROW WITH HOOK
+ \definesymbol[RightwardsArrowWithHook][\USymbChar{33}{170}] % RIGHTWARDS ARROW WITH HOOK
+ \definesymbol[LeftwardsArrowWithLoop][\USymbChar{33}{171}] % LEFTWARDS ARROW WITH LOOP
+ \definesymbol[RightwardsArrowWithLoop][\USymbChar{33}{172}] % RIGHTWARDS ARROW WITH LOOP
+ \definesymbol[LeftRightWaveArrow][\USymbChar{33}{173}] % LEFT RIGHT WAVE ARROW
+ \definesymbol[LeftRightArrowWithStroke][\USymbChar{33}{174}] % LEFT RIGHT ARROW WITH STROKE
+ \definesymbol[DownwardsZigzagArrow][\USymbChar{33}{175}] % DOWNWARDS ZIGZAG ARROW
+ \definesymbol[UpwardsArrowWithTipLeftwards][\USymbChar{33}{176}] % UPWARDS ARROW WITH TIP LEFTWARDS
+ \definesymbol[UpwardsArrowWithTipRightwards][\USymbChar{33}{177}] % UPWARDS ARROW WITH TIP RIGHTWARDS
+ \definesymbol[DownwardsArrowWithTipLeftwards][\USymbChar{33}{178}] % DOWNWARDS ARROW WITH TIP LEFTWARDS
+ \definesymbol[DownwardsArrowWithTipRightwards][\USymbChar{33}{179}] % DOWNWARDS ARROW WITH TIP RIGHTWARDS
+ \definesymbol[RightwardsArrowWithCornerDownwards][\USymbChar{33}{180}] % RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+ \definesymbol[DownwardsArrowWithCornerLeftwards][\USymbChar{33}{181}] % DOWNWARDS ARROW WITH CORNER LEFTWARDS
+ \definesymbol[AnticlockwiseTopSemicircleArrow][\USymbChar{33}{182}] % ANTICLOCKWISE TOP SEMICIRCLE ARROW
+ \definesymbol[ClockwiseTopSemicircleArrow][\USymbChar{33}{183}] % CLOCKWISE TOP SEMICIRCLE ARROW
+ \definesymbol[NorthWestArrowToLongBar][\USymbChar{33}{184}] % NORTH WEST ARROW TO LONG BAR
+ \definesymbol[AnticlockwiseOpenCircleArrow][\USymbChar{33}{186}] % ANTICLOCKWISE OPEN CIRCLE ARROW
+ \definesymbol[ClockwiseOpenCircleArrow][\USymbChar{33}{187}] % CLOCKWISE OPEN CIRCLE ARROW
+ \definesymbol[LeftwardsHarpoonWithBarbUpwards][\USymbChar{33}{188}] % LEFTWARDS HARPOON WITH BARB UPWARDS
+ \definesymbol[LeftwardsHarpoonWithBarbDownwards][\USymbChar{33}{189}] % LEFTWARDS HARPOON WITH BARB DOWNWARDS
+ \definesymbol[UpwardsHarpoonWithBarbRightwards][\USymbChar{33}{190}] % UPWARDS HARPOON WITH BARB RIGHTWARDS
+ \definesymbol[UpwardsHarpoonWithBarbLeftwards][\USymbChar{33}{191}] % UPWARDS HARPOON WITH BARB LEFTWARDS
+ \definesymbol[RightwardsHarpoonWithBarbUpwards][\USymbChar{33}{192}] % RIGHTWARDS HARPOON WITH BARB UPWARDS
+ \definesymbol[RightwardsHarpoonWithBarbDownwards][\USymbChar{33}{193}] % RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+ \definesymbol[DownwardsHarpoonWithBarbRightwards][\USymbChar{33}{194}] % DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+ \definesymbol[DownwardsHarpoonWithBarbLeftwards][\USymbChar{33}{195}] % DOWNWARDS HARPOON WITH BARB LEFTWARDS
+ \definesymbol[LeftwardsSquiggleArrow][\USymbChar{33}{220}] % LEFTWARDS SQUIGGLE ARROW
+ \definesymbol[RightwardsSquiggleArrow][\USymbChar{33}{221}] % RIGHTWARDS SQUIGGLE ARROW
+ \definesymbol[UpwardsArrowWithDoubleStroke][\USymbChar{33}{222}] % UPWARDS ARROW WITH DOUBLE STROKE
+ \definesymbol[DownwardsArrowWithDoubleStroke][\USymbChar{33}{223}] % DOWNWARDS ARROW WITH DOUBLE STROKE
+ \definesymbol[LeftwardsDashedArrow][\USymbChar{33}{224}] % LEFTWARDS DASHED ARROW
+ \definesymbol[UpwardsDashedArrow][\USymbChar{33}{225}] % UPWARDS DASHED ARROW
+ \definesymbol[RightwardsDashedArrow][\USymbChar{33}{226}] % RIGHTWARDS DASHED ARROW
+ \definesymbol[DownwardsDashedArrow][\USymbChar{33}{227}] % DOWNWARDS DASHED ARROW
+ \definesymbol[LeftwardsArrowToBar][\USymbChar{33}{228}] % LEFTWARDS ARROW TO BAR
+ \definesymbol[RightwardsArrowToBar][\USymbChar{33}{229}] % RIGHTWARDS ARROW TO BAR
+ \definesymbol[LeftwardsWhiteArrow][\USymbChar{33}{230}] % LEFTWARDS WHITE ARROW
+ \definesymbol[UpwardsWhiteArrow][\USymbChar{33}{231}] % UPWARDS WHITE ARROW
+ \definesymbol[RightwardsWhiteArrow][\USymbChar{33}{232}] % RIGHTWARDS WHITE ARROW
+ \definesymbol[DownwardsWhiteArrow][\USymbChar{33}{233}] % DOWNWARDS WHITE ARROW
+ \definesymbol[UpwardsWhiteArrowFromBar][\USymbChar{33}{234}] % UPWARDS WHITE ARROW FROM BAR
+ \definesymbol[UpwardsWhiteArrowOnPedestal][\USymbChar{33}{235}] % UPWARDS WHITE ARROW ON PEDESTAL
+ \definesymbol[UpwardsWhiteArrowOnPedestalWithHorizontalBar][\USymbChar{33}{236}] % UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+ \definesymbol[UpwardsWhiteArrowOnPedestalWithVerticalBar][\USymbChar{33}{237}] % UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+ \definesymbol[RightwardsWhiteArrowFromWall][\USymbChar{33}{240}] % RIGHTWARDS WHITE ARROW FROM WALL
+ \definesymbol[NorthWestArrowToCorner][\USymbChar{33}{241}] % NORTH WEST ARROW TO CORNER
+ \definesymbol[SouthEastArrowToCorner][\USymbChar{33}{242}] % SOUTH EAST ARROW TO CORNER
+ \definesymbol[UpDownWhiteArrow][\USymbChar{33}{243}] % UP DOWN WHITE ARROW
+
+\stopsymbolset
+
+\startsymbolset[Unicode Multi Arrows] % 0x2190: Requires UnicodeRegular21
+
+ \definesymbol[LeftwardsArrowToBarOverRightwardsArrowToBar][\USymbChar{33}{185}] % LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+ \definesymbol[RightwardsArrowOverLeftwardsArrow][\USymbChar{33}{196}] % RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+ \definesymbol[UpwardsArrowLeftwardsOfDownwardsArrow][\USymbChar{33}{197}] % UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+ \definesymbol[LeftwardsArrowOverRightwardsArrow][\USymbChar{33}{198}] % LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+ \definesymbol[LeftwardsPairedArrows][\USymbChar{33}{199}] % LEFTWARDS PAIRED ARROWS
+ \definesymbol[UpwardsPairedArrows][\USymbChar{33}{200}] % UPWARDS PAIRED ARROWS
+ \definesymbol[RightwardsPairedArrows][\USymbChar{33}{201}] % RIGHTWARDS PAIRED ARROWS
+ \definesymbol[DownwardsPairedArrows][\USymbChar{33}{202}] % DOWNWARDS PAIRED ARROWS
+ \definesymbol[LeftwardsHarpoonOverRightwardsHarpoon][\USymbChar{33}{203}] % LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+ \definesymbol[RightwardsHarpoonOverLeftwardsHarpoon][\USymbChar{33}{204}] % RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+ \definesymbol[LeftwardsDoubleArrowWithStroke][\USymbChar{33}{205}] % LEFTWARDS DOUBLE ARROW WITH STROKE
+ \definesymbol[LeftRightDoubleArrowWithStroke][\USymbChar{33}{206}] % LEFT RIGHT DOUBLE ARROW WITH STROKE
+ \definesymbol[RightwardsDoubleArrowWithStroke][\USymbChar{33}{207}] % RIGHTWARDS DOUBLE ARROW WITH STROKE
+ \definesymbol[LeftwardsDoubleArrow][\USymbChar{33}{208}] % LEFTWARDS DOUBLE ARROW
+ \definesymbol[UpwardsDoubleArrow][\USymbChar{33}{209}] % UPWARDS DOUBLE ARROW
+ \definesymbol[RightwardsDoubleArrow][\USymbChar{33}{210}] % RIGHTWARDS DOUBLE ARROW
+ \definesymbol[DownwardsDoubleArrow][\USymbChar{33}{211}] % DOWNWARDS DOUBLE ARROW
+ \definesymbol[LeftRightDoubleArrow][\USymbChar{33}{212}] % LEFT RIGHT DOUBLE ARROW
+ \definesymbol[UpDownDoubleArrow][\USymbChar{33}{213}] % UP DOWN DOUBLE ARROW
+ \definesymbol[NorthWestDoubleArrow][\USymbChar{33}{214}] % NORTH WEST DOUBLE ARROW
+ \definesymbol[NorthEastDoubleArrow][\USymbChar{33}{215}] % NORTH EAST DOUBLE ARROW
+ \definesymbol[SouthEastDoubleArrow][\USymbChar{33}{216}] % SOUTH EAST DOUBLE ARROW
+ \definesymbol[SouthWestDoubleArrow][\USymbChar{33}{217}] % SOUTH WEST DOUBLE ARROW
+ \definesymbol[LeftwardsTripleArrow][\USymbChar{33}{218}] % LEFTWARDS TRIPLE ARROW
+ \definesymbol[RightwardsTripleArrow][\USymbChar{33}{219}] % RIGHTWARDS TRIPLE ARROW
+ \definesymbol[UpwardsWhiteDoubleArrow][\USymbChar{33}{238}] % UPWARDS WHITE DOUBLE ARROW
+ \definesymbol[UpwardsWhiteDoubleArrowOnPedestal][\USymbChar{33}{239}] % UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+
+\stopsymbolset
+
+
+\startsymbolset[Unicode Optical Character Recognition] % 0x2440: Requires UnicodeRegular24
+
+ \definesymbol[OcrHook][\USymbChar{36}{64}] % OCR HOOK
+ \definesymbol[OcrChair][\USymbChar{36}{65}] % OCR CHAIR
+ \definesymbol[OcrFork][\USymbChar{36}{66}] % OCR FORK
+ \definesymbol[OcrInvertedFork][\USymbChar{36}{67}] % OCR INVERTED FORK
+ \definesymbol[OcrBeltBuckle][\USymbChar{36}{68}] % OCR BELT BUCKLE
+ \definesymbol[OcrBowTie][\USymbChar{36}{69}] % OCR BOW TIE
+ \definesymbol[OcrBranchBankIdentification][\USymbChar{36}{70}] % OCR BRANCH BANK IDENTIFICATION
+ \definesymbol[OcrAmountOfCheck][\USymbChar{36}{71}] % OCR AMOUNT OF CHECK
+ \definesymbol[OcrDash][\USymbChar{36}{72}] % OCR DASH
+ \definesymbol[OcrCustomerAccountNumber][\USymbChar{36}{73}] % OCR CUSTOMER ACCOUNT NUMBER
+ \definesymbol[OcrDoubleBackslash][\USymbChar{36}{74}] % OCR DOUBLE BACKSLASH
+
+\stopsymbolset
+
+
+\startsymbolset[Unicode Box Drawing] % 0x2500: Requires UnicodeRegular25
+
+ \definesymbol[LightHorizontal][\USymbChar{37}{0}] % BOX DRAWINGS LIGHT HORIZONTAL
+ \definesymbol[HeavyHorizontal][\USymbChar{37}{1}] % BOX DRAWINGS HEAVY HORIZONTAL
+ \definesymbol[LightVertical][\USymbChar{37}{2}] % BOX DRAWINGS LIGHT VERTICAL
+ \definesymbol[HeavyVertical][\USymbChar{37}{3}] % BOX DRAWINGS HEAVY VERTICAL
+ \definesymbol[LightTripleDashHorizontal][\USymbChar{37}{4}] % BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+ \definesymbol[HeavyTripleDashHorizontal][\USymbChar{37}{5}] % BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+ \definesymbol[LightTripleDashVertical][\USymbChar{37}{6}] % BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+ \definesymbol[HeavyTripleDashVertical][\USymbChar{37}{7}] % BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+ \definesymbol[LightQuadrupleDashHorizontal][\USymbChar{37}{8}] % BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+ \definesymbol[HeavyQuadrupleDashHorizontal][\USymbChar{37}{9}] % BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+ \definesymbol[LightQuadrupleDashVertical][\USymbChar{37}{10}] % BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+ \definesymbol[HeavyQuadrupleDashVertical][\USymbChar{37}{11}] % BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+ \definesymbol[LightDownAndRight][\USymbChar{37}{12}] % BOX DRAWINGS LIGHT DOWN AND RIGHT
+ \definesymbol[DownLightAndRightHeavy][\USymbChar{37}{13}] % BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+ \definesymbol[DownHeavyAndRightLight][\USymbChar{37}{14}] % BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+ \definesymbol[HeavyDownAndRight][\USymbChar{37}{15}] % BOX DRAWINGS HEAVY DOWN AND RIGHT
+ \definesymbol[LightDownAndLeft][\USymbChar{37}{16}] % BOX DRAWINGS LIGHT DOWN AND LEFT
+ \definesymbol[DownLightAndLeftHeavy][\USymbChar{37}{17}] % BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+ \definesymbol[DownHeavyAndLeftLight][\USymbChar{37}{18}] % BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+ \definesymbol[HeavyDownAndLeft][\USymbChar{37}{19}] % BOX DRAWINGS HEAVY DOWN AND LEFT
+ \definesymbol[LightUpAndRight][\USymbChar{37}{20}] % BOX DRAWINGS LIGHT UP AND RIGHT
+ \definesymbol[UpLightAndRightHeavy][\USymbChar{37}{21}] % BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+ \definesymbol[UpHeavyAndRightLight][\USymbChar{37}{22}] % BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+ \definesymbol[HeavyUpAndRight][\USymbChar{37}{23}] % BOX DRAWINGS HEAVY UP AND RIGHT
+ \definesymbol[LightUpAndLeft][\USymbChar{37}{24}] % BOX DRAWINGS LIGHT UP AND LEFT
+ \definesymbol[UpLightAndLeftHeavy][\USymbChar{37}{25}] % BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+ \definesymbol[UpHeavyAndLeftLight][\USymbChar{37}{26}] % BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+ \definesymbol[HeavyUpAndLeft][\USymbChar{37}{27}] % BOX DRAWINGS HEAVY UP AND LEFT
+ \definesymbol[LightVerticalAndRight][\USymbChar{37}{28}] % BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ \definesymbol[VerticalLightAndRightHeavy][\USymbChar{37}{29}] % BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ \definesymbol[UpHeavyAndRightDownLight][\USymbChar{37}{30}] % BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+ \definesymbol[DownHeavyAndRightUpLight][\USymbChar{37}{31}] % BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+ \definesymbol[VerticalHeavyAndRightLight][\USymbChar{37}{32}] % BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ \definesymbol[DownLightAndRightUpHeavy][\USymbChar{37}{33}] % BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+ \definesymbol[UpLightAndRightDownHeavy][\USymbChar{37}{34}] % BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+ \definesymbol[HeavyVerticalAndRight][\USymbChar{37}{35}] % BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ \definesymbol[LightVerticalAndLeft][\USymbChar{37}{36}] % BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ \definesymbol[VerticalLightAndLeftHeavy][\USymbChar{37}{37}] % BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ \definesymbol[UpHeavyAndLeftDownLight][\USymbChar{37}{38}] % BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+ \definesymbol[DownHeavyAndLeftUpLight][\USymbChar{37}{39}] % BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+ \definesymbol[VerticalHeavyAndLeftLight][\USymbChar{37}{40}] % BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ \definesymbol[DownLightAndLeftUpHeavy][\USymbChar{37}{41}] % BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+ \definesymbol[UpLightAndLeftDownHeavy][\USymbChar{37}{42}] % BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+ \definesymbol[HeavyVerticalAndLeft][\USymbChar{37}{43}] % BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ \definesymbol[LightDownAndHorizontal][\USymbChar{37}{44}] % BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ \definesymbol[LeftHeavyAndRightDownLight][\USymbChar{37}{45}] % BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+ \definesymbol[RightHeavyAndLeftDownLight][\USymbChar{37}{46}] % BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+ \definesymbol[DownLightAndHorizontalHeavy][\USymbChar{37}{47}] % BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ \definesymbol[DownHeavyAndHorizontalLight][\USymbChar{37}{48}] % BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ \definesymbol[RightLightAndLeftDownHeavy][\USymbChar{37}{49}] % BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+ \definesymbol[LeftLightAndRightDownHeavy][\USymbChar{37}{50}] % BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+ \definesymbol[HeavyDownAndHorizontal][\USymbChar{37}{51}] % BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ \definesymbol[LightUpAndHorizontal][\USymbChar{37}{52}] % BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ \definesymbol[LeftHeavyAndRightUpLight][\USymbChar{37}{53}] % BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+ \definesymbol[RightHeavyAndLeftUpLight][\USymbChar{37}{54}] % BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+ \definesymbol[UpLightAndHorizontalHeavy][\USymbChar{37}{55}] % BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ \definesymbol[UpHeavyAndHorizontalLight][\USymbChar{37}{56}] % BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ \definesymbol[RightLightAndLeftUpHeavy][\USymbChar{37}{57}] % BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+ \definesymbol[LeftLightAndRightUpHeavy][\USymbChar{37}{58}] % BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+ \definesymbol[HeavyUpAndHorizontal][\USymbChar{37}{59}] % BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ \definesymbol[LightVerticalAndHorizontal][\USymbChar{37}{60}] % BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ \definesymbol[LeftHeavyAndRightVerticalLight][\USymbChar{37}{61}] % BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+ \definesymbol[RightHeavyAndLeftVerticalLight][\USymbChar{37}{62}] % BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+ \definesymbol[VerticalLightAndHorizontalHeavy][\USymbChar{37}{63}] % BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ \definesymbol[UpHeavyAndDownHorizontalLight][\USymbChar{37}{64}] % BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+ \definesymbol[DownHeavyAndUpHorizontalLight][\USymbChar{37}{65}] % BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+ \definesymbol[VerticalHeavyAndHorizontalLight][\USymbChar{37}{66}] % BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ \definesymbol[LeftUpHeavyAndRightDownLight][\USymbChar{37}{67}] % BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+ \definesymbol[RightUpHeavyAndLeftDownLight][\USymbChar{37}{68}] % BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+ \definesymbol[LeftDownHeavyAndRightUpLight][\USymbChar{37}{69}] % BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+ \definesymbol[RightDownHeavyAndLeftUpLight][\USymbChar{37}{70}] % BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+ \definesymbol[DownLightAndUpHorizontalHeavy][\USymbChar{37}{71}] % BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+ \definesymbol[UpLightAndDownHorizontalHeavy][\USymbChar{37}{72}] % BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+ \definesymbol[RightLightAndLeftVerticalHeavy][\USymbChar{37}{73}] % BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+ \definesymbol[LeftLightAndRightVerticalHeavy][\USymbChar{37}{74}] % BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+ \definesymbol[HeavyVerticalAndHorizontal][\USymbChar{37}{75}] % BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ \definesymbol[LightArcDownAndRight][\USymbChar{37}{109}] % BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+ \definesymbol[LightArcDownAndLeft][\USymbChar{37}{110}] % BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+ \definesymbol[LightArcUpAndLeft][\USymbChar{37}{111}] % BOX DRAWINGS LIGHT ARC UP AND LEFT
+ \definesymbol[LightArcUpAndRight][\USymbChar{37}{112}] % BOX DRAWINGS LIGHT ARC UP AND RIGHT
+ \definesymbol[LightDiagonalUpperRightToLowerLeft][\USymbChar{37}{113}] % BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+ \definesymbol[LightDiagonalUpperLeftToLowerRight][\USymbChar{37}{114}] % BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+ \definesymbol[LightDiagonalCross][\USymbChar{37}{115}] % BOX DRAWINGS LIGHT DIAGONAL CROSS
+ \definesymbol[LightLeft][\USymbChar{37}{116}] % BOX DRAWINGS LIGHT LEFT
+ \definesymbol[LightUp][\USymbChar{37}{117}] % BOX DRAWINGS LIGHT UP
+ \definesymbol[LightRight][\USymbChar{37}{118}] % BOX DRAWINGS LIGHT RIGHT
+ \definesymbol[LightDown][\USymbChar{37}{119}] % BOX DRAWINGS LIGHT DOWN
+ \definesymbol[HeavyLeft][\USymbChar{37}{120}] % BOX DRAWINGS HEAVY LEFT
+ \definesymbol[HeavyUp][\USymbChar{37}{121}] % BOX DRAWINGS HEAVY UP
+ \definesymbol[HeavyRight][\USymbChar{37}{122}] % BOX DRAWINGS HEAVY RIGHT
+ \definesymbol[HeavyDown][\USymbChar{37}{123}] % BOX DRAWINGS HEAVY DOWN
+ \definesymbol[LightLeftAndHeavyRight][\USymbChar{37}{124}] % BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+ \definesymbol[LightUpAndHeavyDown][\USymbChar{37}{125}] % BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+ \definesymbol[HeavyLeftAndLightRight][\USymbChar{37}{126}] % BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+ \definesymbol[HeavyUpAndLightDown][\USymbChar{37}{127}] % BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Circled Digits] % 0x2460: Requires UnicodeRegular24
+
+ \definesymbol[CircledOne][\USymbCharZapf{36}{96}] % CIRCLED DIGIT ONE
+ \definesymbol[CircledTwo][\USymbCharZapf{36}{97}] % CIRCLED DIGIT TWO
+ \definesymbol[CircledThree][\USymbCharZapf{36}{98}] % CIRCLED DIGIT THREE
+ \definesymbol[CircledFour][\USymbCharZapf{36}{99}] % CIRCLED DIGIT FOUR
+ \definesymbol[CircledFive][\USymbCharZapf{36}{100}] % CIRCLED DIGIT FIVE
+ \definesymbol[CircledSix][\USymbCharZapf{36}{101}] % CIRCLED DIGIT SIX
+ \definesymbol[CircledSeven][\USymbCharZapf{36}{102}] % CIRCLED DIGIT SEVEN
+ \definesymbol[CircledEight][\USymbCharZapf{36}{103}] % CIRCLED DIGIT EIGHT
+ \definesymbol[CircledNine][\USymbCharZapf{36}{104}] % CIRCLED DIGIT NINE
+ \definesymbol[CircledTen][\USymbCharZapf{36}{105}] % CIRCLED NUMBER TEN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Double Box Drawing] % 0x2500: Requires UnicodeRegular25
+
+ \definesymbol[LightDoubleDashHorizontal][\USymbChar{37}{76}] % BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+ \definesymbol[HeavyDoubleDashHorizontal][\USymbChar{37}{77}] % BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+ \definesymbol[LightDoubleDashVertical][\USymbChar{37}{78}] % BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+ \definesymbol[HeavyDoubleDashVertical][\USymbChar{37}{79}] % BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+ \definesymbol[DoubleHorizontal][\USymbChar{37}{80}] % BOX DRAWINGS DOUBLE HORIZONTAL
+ \definesymbol[DoubleVertical][\USymbChar{37}{81}] % BOX DRAWINGS DOUBLE VERTICAL
+ \definesymbol[DownSingleAndRightDouble][\USymbChar{37}{82}] % BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+ \definesymbol[DownDoubleAndRightSingle][\USymbChar{37}{83}] % BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+ \definesymbol[DoubleDownAndRight][\USymbChar{37}{84}] % BOX DRAWINGS DOUBLE DOWN AND RIGHT
+ \definesymbol[DownSingleAndLeftDouble][\USymbChar{37}{85}] % BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+ \definesymbol[DownDoubleAndLeftSingle][\USymbChar{37}{86}] % BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+ \definesymbol[DoubleDownAndLeft][\USymbChar{37}{87}] % BOX DRAWINGS DOUBLE DOWN AND LEFT
+ \definesymbol[UpSingleAndRightDouble][\USymbChar{37}{88}] % BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+ \definesymbol[UpDoubleAndRightSingle][\USymbChar{37}{89}] % BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+ \definesymbol[DoubleUpAndRight][\USymbChar{37}{90}] % BOX DRAWINGS DOUBLE UP AND RIGHT
+ \definesymbol[UpSingleAndLeftDouble][\USymbChar{37}{91}] % BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+ \definesymbol[UpDoubleAndLeftSingle][\USymbChar{37}{92}] % BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+ \definesymbol[DoubleUpAndLeft][\USymbChar{37}{93}] % BOX DRAWINGS DOUBLE UP AND LEFT
+ \definesymbol[VerticalSingleAndRightDouble][\USymbChar{37}{94}] % BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+ \definesymbol[VerticalDoubleAndRightSingle][\USymbChar{37}{95}] % BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+ \definesymbol[DoubleVerticalAndRight][\USymbChar{37}{96}] % BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+ \definesymbol[VerticalSingleAndLeftDouble][\USymbChar{37}{97}] % BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+ \definesymbol[VerticalDoubleAndLeftSingle][\USymbChar{37}{98}] % BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+ \definesymbol[DoubleVerticalAndLeft][\USymbChar{37}{99}] % BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+ \definesymbol[DownSingleAndHorizontalDouble][\USymbChar{37}{100}] % BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+ \definesymbol[DownDoubleAndHorizontalSingle][\USymbChar{37}{101}] % BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+ \definesymbol[DoubleDownAndHorizontal][\USymbChar{37}{102}] % BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+ \definesymbol[UpSingleAndHorizontalDouble][\USymbChar{37}{103}] % BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+ \definesymbol[UpDoubleAndHorizontalSingle][\USymbChar{37}{104}] % BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+ \definesymbol[DoubleUpAndHorizontal][\USymbChar{37}{105}] % BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+ \definesymbol[VerticalSingleAndHorizontalDouble][\USymbChar{37}{106}] % BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+ \definesymbol[VerticalDoubleAndHorizontalSingle][\USymbChar{37}{107}] % BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+ \definesymbol[DoubleVerticalAndHorizontal][\USymbChar{37}{108}] % BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+
+\stopsymbolset
+
+\startsymbolset[Unicode Block Elements] % 0x2580: Requires UnicodeRegular25
+
+ \definesymbol[UpperHalfBlock][\USymbChar{37}{128}] % UPPER HALF BLOCK
+ \definesymbol[LowerOneEighthBlock][\USymbChar{37}{129}] % LOWER ONE EIGHTH BLOCK
+ \definesymbol[LowerOneQuarterBlock][\USymbChar{37}{130}] % LOWER ONE QUARTER BLOCK
+ \definesymbol[LowerThreeEighthsBlock][\USymbChar{37}{131}] % LOWER THREE EIGHTHS BLOCK
+ \definesymbol[LowerHalfBlock][\USymbChar{37}{132}] % LOWER HALF BLOCK
+ \definesymbol[LowerFiveEighthsBlock][\USymbChar{37}{133}] % LOWER FIVE EIGHTHS BLOCK
+ \definesymbol[LowerThreeQuartersBlock][\USymbChar{37}{134}] % LOWER THREE QUARTERS BLOCK
+ \definesymbol[LowerSevenEighthsBlock][\USymbChar{37}{135}] % LOWER SEVEN EIGHTHS BLOCK
+ \definesymbol[FullBlock][\USymbChar{37}{136}] % FULL BLOCK
+ \definesymbol[LeftSevenEighthsBlock][\USymbChar{37}{137}] % LEFT SEVEN EIGHTHS BLOCK
+ \definesymbol[LeftThreeQuartersBlock][\USymbChar{37}{138}] % LEFT THREE QUARTERS BLOCK
+ \definesymbol[LeftFiveEighthsBlock][\USymbChar{37}{139}] % LEFT FIVE EIGHTHS BLOCK
+ \definesymbol[LeftHalfBlock][\USymbChar{37}{140}] % LEFT HALF BLOCK
+ \definesymbol[LeftThreeEighthsBlock][\USymbChar{37}{141}] % LEFT THREE EIGHTHS BLOCK
+ \definesymbol[LeftOneQuarterBlock][\USymbChar{37}{142}] % LEFT ONE QUARTER BLOCK
+ \definesymbol[LeftOneEighthBlock][\USymbChar{37}{143}] % LEFT ONE EIGHTH BLOCK
+ \definesymbol[RightHalfBlock][\USymbChar{37}{144}] % RIGHT HALF BLOCK
+ \definesymbol[UpperOneEighthBlock][\USymbChar{37}{148}] % UPPER ONE EIGHTH BLOCK
+ \definesymbol[RightOneEighthBlock][\USymbChar{37}{149}] % RIGHT ONE EIGHTH BLOCK
+
+\stopsymbolset
+
+\startsymbolset[Unicode Shade Characters] % 0x2580: Requires UnicodeRegular25
+
+ \definesymbol[LightShade][\USymbChar{37}{145}] % LIGHT SHADE
+ \definesymbol[MediumShade][\USymbChar{37}{146}] % MEDIUM SHADE
+ \definesymbol[DarkShade][\USymbChar{37}{147}] % DARK SHADE
+
+\stopsymbolset
+
+\startsymbolset[Unicode Terminal Graphics] % 0x2580: Requires UnicodeRegular25
+
+ \definesymbol[QuadrantLowerLeft][\USymbChar{37}{150}] % [Unassigned U+2596]
+ \definesymbol[QuadrantLowerRight][\USymbChar{37}{151}] % [Unassigned U+2597]
+ \definesymbol[QuadrantUpperLeft][\USymbChar{37}{152}] % [Unassigned U+2598]
+ \definesymbol[QuadrantUpperLeftAndLowerLeftAndLowerRight][\USymbChar{37}{153}] % [Unassigned U+2599]
+ \definesymbol[QuadrantUpperLeftAndLowerRight][\USymbChar{37}{154}] % [Unassigned U+259A]
+ \definesymbol[QuadrantUpperLeftAndUpperRightandLowerLeft][\USymbChar{37}{155}] % [Unassigned U+259B]
+ \definesymbol[QuadrantUpperLeftAndUpperRightAndLowerRight][\USymbChar{37}{156}] % [Unassigned U+259C]
+ \definesymbol[QuadrantUpperRight][\USymbChar{37}{157}] % [Unassigned U+259D]
+ \definesymbol[QuadrantUpperRightAndLowerLeft][\USymbChar{37}{158}] % [Unassigned U+259E]
+ \definesymbol[QuadrantUpperRightAndLowerLeftAndLowerRight][\USymbChar{37}{159}] % [Unassigned U+259F]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Geometric Shapes] % 0x25A0: Requires UnicodeRegular25
+
+ \definesymbol[BlackSquare][\USymbChar{37}{160}] % BLACK SQUARE
+ \definesymbol[WhiteSquare][\USymbChar{37}{161}] % WHITE SQUARE
+ \definesymbol[WhiteSquareWithRoundedCorners][\USymbChar{37}{162}] % WHITE SQUARE WITH ROUNDED CORNERS
+ \definesymbol[WhiteSquareContainingBlackSmallSquare][\USymbChar{37}{163}] % WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+ \definesymbol[SquareWithHorizontalFill][\USymbChar{37}{164}] % SQUARE WITH HORIZONTAL FILL
+ \definesymbol[SquareWithVerticalFill][\USymbChar{37}{165}] % SQUARE WITH VERTICAL FILL
+ \definesymbol[SquareWithOrthogonalCrosshatchFill][\USymbChar{37}{166}] % SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+ \definesymbol[SquareWithUpperLeftToLowerRightFill][\USymbChar{37}{167}] % SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+ \definesymbol[SquareWithUpperRightToLowerLeftFill][\USymbChar{37}{168}] % SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+ \definesymbol[SquareWithDiagonalCrosshatchFill][\USymbChar{37}{169}] % SQUARE WITH DIAGONAL CROSSHATCH FILL
+ \definesymbol[BlackSmallSquare][\USymbChar{37}{170}] % BLACK SMALL SQUARE
+ \definesymbol[WhiteSmallSquare][\USymbChar{37}{171}] % WHITE SMALL SQUARE
+ \definesymbol[BlackRectangle][\USymbChar{37}{172}] % BLACK RECTANGLE
+ \definesymbol[WhiteRectangle][\USymbChar{37}{173}] % WHITE RECTANGLE
+ \definesymbol[BlackVerticalRectangle][\USymbChar{37}{174}] % BLACK VERTICAL RECTANGLE
+ \definesymbol[WhiteVerticalRectangle][\USymbChar{37}{175}] % WHITE VERTICAL RECTANGLE
+ \definesymbol[BlackParallelogram][\USymbChar{37}{176}] % BLACK PARALLELOGRAM
+ \definesymbol[WhiteParallelogram][\USymbChar{37}{177}] % WHITE PARALLELOGRAM
+ \definesymbol[BlackUpPointingTriangle][\USymbChar{37}{178}] % BLACK UP-POINTING TRIANGLE
+ \definesymbol[WhiteUpPointingTriangle][\USymbChar{37}{179}] % WHITE UP-POINTING TRIANGLE
+ \definesymbol[BlackUpPointingSmallTriangle][\USymbChar{37}{180}] % BLACK UP-POINTING SMALL TRIANGLE
+ \definesymbol[WhiteUpPointingSmallTriangle][\USymbChar{37}{181}] % WHITE UP-POINTING SMALL TRIANGLE
+ \definesymbol[BlackRightPointingTriangle][\USymbChar{37}{182}] % BLACK RIGHT-POINTING TRIANGLE
+ \definesymbol[WhiteRightPointingTriangle][\USymbChar{37}{183}] % WHITE RIGHT-POINTING TRIANGLE
+ \definesymbol[BlackRightPointingSmallTriangle][\USymbChar{37}{184}] % BLACK RIGHT-POINTING SMALL TRIANGLE
+ \definesymbol[WhiteRightPointingSmallTriangle][\USymbChar{37}{185}] % WHITE RIGHT-POINTING SMALL TRIANGLE
+ \definesymbol[BlackRightPointingPointer][\USymbChar{37}{186}] % BLACK RIGHT-POINTING POINTER
+ \definesymbol[WhiteRightPointingPointer][\USymbChar{37}{187}] % WHITE RIGHT-POINTING POINTER
+ \definesymbol[BlackDownPointingTriangle][\USymbChar{37}{188}] % BLACK DOWN-POINTING TRIANGLE
+ \definesymbol[WhiteDownPointingTriangle][\USymbChar{37}{189}] % WHITE DOWN-POINTING TRIANGLE
+ \definesymbol[BlackDownPointingSmallTriangle][\USymbChar{37}{190}] % BLACK DOWN-POINTING SMALL TRIANGLE
+ \definesymbol[WhiteDownPointingSmallTriangle][\USymbChar{37}{191}] % WHITE DOWN-POINTING SMALL TRIANGLE
+ \definesymbol[BlackLeftPointingTriangle][\USymbChar{37}{192}] % BLACK LEFT-POINTING TRIANGLE
+ \definesymbol[WhiteLeftPointingTriangle][\USymbChar{37}{193}] % WHITE LEFT-POINTING TRIANGLE
+ \definesymbol[BlackLeftPointingSmallTriangle][\USymbChar{37}{194}] % BLACK LEFT-POINTING SMALL TRIANGLE
+ \definesymbol[WhiteLeftPointingSmallTriangle][\USymbChar{37}{195}] % WHITE LEFT-POINTING SMALL TRIANGLE
+ \definesymbol[BlackLeftPointingPointer][\USymbChar{37}{196}] % BLACK LEFT-POINTING POINTER
+ \definesymbol[WhiteLeftPointingPointer][\USymbChar{37}{197}] % WHITE LEFT-POINTING POINTER
+ \definesymbol[BlackDiamond][\USymbChar{37}{198}] % BLACK DIAMOND
+ \definesymbol[WhiteDiamond][\USymbChar{37}{199}] % WHITE DIAMOND
+ \definesymbol[WhiteDiamondContainingBlackSmallDiamond][\USymbChar{37}{200}] % WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+ \definesymbol[Fisheye][\USymbChar{37}{201}] % FISHEYE
+ \definesymbol[Lozenge][\USymbChar{37}{202}] % LOZENGE
+ \definesymbol[WhiteCircle][\USymbChar{37}{203}] % WHITE CIRCLE
+ \definesymbol[DottedCircle][\USymbChar{37}{204}] % DOTTED CIRCLE
+ \definesymbol[CircleWithVerticalFill][\USymbChar{37}{205}] % CIRCLE WITH VERTICAL FILL
+ \definesymbol[Bullseye][\USymbChar{37}{206}] % BULLSEYE
+ \definesymbol[BlackCircle][\USymbChar{37}{207}] % BLACK CIRCLE
+ \definesymbol[CircleWithLeftHalfBlack][\USymbChar{37}{208}] % CIRCLE WITH LEFT HALF BLACK
+ \definesymbol[CircleWithRightHalfBlack][\USymbChar{37}{209}] % CIRCLE WITH RIGHT HALF BLACK
+ \definesymbol[CircleWithLowerHalfBlack][\USymbChar{37}{210}] % CIRCLE WITH LOWER HALF BLACK
+ \definesymbol[CircleWithUpperHalfBlack][\USymbChar{37}{211}] % CIRCLE WITH UPPER HALF BLACK
+ \definesymbol[CircleWithUpperRightQuadrantBlack][\USymbChar{37}{212}] % CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+ \definesymbol[CircleWithAllButUpperLeftQuadrantBlack][\USymbChar{37}{213}] % CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+ \definesymbol[LeftHalfBlackCircle][\USymbChar{37}{214}] % LEFT HALF BLACK CIRCLE
+ \definesymbol[RightHalfBlackCircle][\USymbChar{37}{215}] % RIGHT HALF BLACK CIRCLE
+ \definesymbol[InverseBullet][\USymbChar{37}{216}] % INVERSE BULLET
+ \definesymbol[InverseWhiteCircle][\USymbChar{37}{217}] % INVERSE WHITE CIRCLE
+ \definesymbol[UpperHalfInverseWhiteCircle][\USymbChar{37}{218}] % UPPER HALF INVERSE WHITE CIRCLE
+ \definesymbol[LowerHalfInverseWhiteCircle][\USymbChar{37}{219}] % LOWER HALF INVERSE WHITE CIRCLE
+ \definesymbol[UpperLeftQuadrantCircularArc][\USymbChar{37}{220}] % UPPER LEFT QUADRANT CIRCULAR ARC
+ \definesymbol[UpperRightQuadrantCircularArc][\USymbChar{37}{221}] % UPPER RIGHT QUADRANT CIRCULAR ARC
+ \definesymbol[LowerRightQuadrantCircularArc][\USymbChar{37}{222}] % LOWER RIGHT QUADRANT CIRCULAR ARC
+ \definesymbol[LowerLeftQuadrantCircularArc][\USymbChar{37}{223}] % LOWER LEFT QUADRANT CIRCULAR ARC
+ \definesymbol[LowerHalfCircle][\USymbChar{37}{225}] % LOWER HALF CIRCLE
+ \definesymbol[BlackLowerRightTriangle][\USymbChar{37}{226}] % BLACK LOWER RIGHT TRIANGLE
+ \definesymbol[BlackLowerLeftTriangle][\USymbChar{37}{227}] % BLACK LOWER LEFT TRIANGLE
+ \definesymbol[BlackUpperLeftTriangle][\USymbChar{37}{228}] % BLACK UPPER LEFT TRIANGLE
+ \definesymbol[BlackUpperRightTriangle][\USymbChar{37}{229}] % BLACK UPPER RIGHT TRIANGLE
+ \definesymbol[WhiteBullet][\USymbChar{37}{230}] % WHITE BULLET
+ \definesymbol[SquareWithLeftHalfBlack][\USymbChar{37}{231}] % SQUARE WITH LEFT HALF BLACK
+ \definesymbol[SquareWithRightHalfBlack][\USymbChar{37}{232}] % SQUARE WITH RIGHT HALF BLACK
+ \definesymbol[SquareWithUpperLeftDiagonalHalfBlack][\USymbChar{37}{233}] % SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+ \definesymbol[SquareWithLowerRightDiagonalHalfBlack][\USymbChar{37}{234}] % SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+ \definesymbol[WhiteSquareWithVerticalBisectingLine][\USymbChar{37}{235}] % WHITE SQUARE WITH VERTICAL BISECTING LINE
+ \definesymbol[WhiteUpPointingTriangleWithDot][\USymbChar{37}{236}] % WHITE UP-POINTING TRIANGLE WITH DOT
+ \definesymbol[UpPointingTriangleWithLeftHalfBlack][\USymbChar{37}{237}] % UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+ \definesymbol[UpPointingTriangleWithRightHalfBlack][\USymbChar{37}{238}] % UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+ \definesymbol[LargeCircle][\USymbChar{37}{239}] % LARGE CIRCLE
+ \definesymbol[UpperLeftTriangle][\USymbChar{37}{248}] % [Unassigned U+25F8]
+ \definesymbol[UpperRightTriangle][\USymbChar{37}{249}] % [Unassigned U+25F9]
+ \definesymbol[LowerLeftTriangle][\USymbChar{37}{250}] % [Unassigned U+25FA]
+ \definesymbol[WhiteMediumSquare][\USymbChar{37}{251}] % [Unassigned U+25FB]
+ \definesymbol[BlackMediumSquare][\USymbChar{37}{252}] % [Unassigned U+25FC]
+ \definesymbol[WhiteMediumSmallSquare][\USymbChar{37}{253}] % [Unassigned U+25FD]
+ \definesymbol[BlackMediumSmallSquare][\USymbChar{37}{254}] % [Unassigned U+25FE]
+ \definesymbol[LowerRightTriangle][\USymbChar{37}{255}] % [Unassigned U+25FF]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Control Code Graphics] % 0x25A0: Requires UnicodeRegular25
+
+ \definesymbol[WhiteSquareWithUpperLeftQuadrant][\USymbChar{37}{240}] % WHITE SQUARE WITH UPPER LEFT QUADRANT
+ \definesymbol[WhiteSquareWithLowerLeftQuadrant][\USymbChar{37}{241}] % WHITE SQUARE WITH LOWER LEFT QUADRANT
+ \definesymbol[WhiteSquareWithLowerRightQuadrant][\USymbChar{37}{242}] % WHITE SQUARE WITH LOWER RIGHT QUADRANT
+ \definesymbol[WhiteSquareWithUpperRightQuadrant][\USymbChar{37}{243}] % WHITE SQUARE WITH UPPER RIGHT QUADRANT
+ \definesymbol[WhiteCircleWithUpperLeftQuadrant][\USymbChar{37}{244}] % WHITE CIRCLE WITH UPPER LEFT QUADRANT
+ \definesymbol[WhiteCircleWithLowerLeftQuadrant][\USymbChar{37}{245}] % WHITE CIRCLE WITH LOWER LEFT QUADRANT
+ \definesymbol[WhiteCircleWithLowerRightQuadrant][\USymbChar{37}{246}] % WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+ \definesymbol[WhiteCircleWithUpperRightQuadrant][\USymbChar{37}{247}] % WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+
+\stopsymbolset
+
+\startsymbolset[Unicode Weather and Astrological] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[BlackSunWithRays][\USymbChar{38}{0}] % BLACK SUN WITH RAYS
+ \definesymbol[Cloud][\USymbChar{38}{1}] % CLOUD
+ \definesymbol[Umbrella][\USymbChar{38}{2}] % UMBRELLA
+ \definesymbol[Snowman][\USymbChar{38}{3}] % SNOWMAN
+ \definesymbol[Comet][\USymbChar{38}{4}] % COMET
+ \definesymbol[BlackStar][\USymbChar{38}{5}] % BLACK STAR
+ \definesymbol[WhiteStar][\USymbChar{38}{6}] % WHITE STAR
+ \definesymbol[Lightning][\USymbChar{38}{7}] % LIGHTNING
+ \definesymbol[Thunderstorm][\USymbChar{38}{8}] % THUNDERSTORM
+ \definesymbol[Sun][\USymbChar{38}{9}] % SUN
+ \definesymbol[AscendingNode][\USymbChar{38}{10}] % ASCENDING NODE
+ \definesymbol[DescendingNode][\USymbChar{38}{11}] % DESCENDING NODE
+ \definesymbol[Conjunction][\USymbChar{38}{12}] % CONJUNCTION
+ \definesymbol[Opposition][\USymbChar{38}{13}] % OPPOSITION
+ \definesymbol[FirstQuarterMoon][\USymbChar{38}{61}] % FIRST QUARTER MOON
+ \definesymbol[LastQuarterMoon][\USymbChar{38}{62}] % LAST QUARTER MOON
+ \definesymbol[Mercury][\USymbChar{38}{63}] % MERCURY
+ \definesymbol[FemaleSign][\USymbChar{38}{64}] % FEMALE SIGN
+ \definesymbol[Earth][\USymbChar{38}{65}] % EARTH
+ \definesymbol[MaleSign][\USymbChar{38}{66}] % MALE SIGN
+ \definesymbol[Jupiter][\USymbChar{38}{67}] % JUPITER
+ \definesymbol[Saturn][\USymbChar{38}{68}] % SATURN
+ \definesymbol[Uranus][\USymbChar{38}{69}] % URANUS
+ \definesymbol[Neptune][\USymbChar{38}{70}] % NEPTUNE
+ \definesymbol[Pluto][\USymbChar{38}{71}] % PLUTO
+
+\stopsymbolset
+
+\startsymbolset[Unicode Miscellaneous] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[BlackTelephone][\USymbChar{38}{14}] % BLACK TELEPHONE
+ \definesymbol[WhiteTelephone][\USymbChar{38}{15}] % WHITE TELEPHONE
+ \definesymbol[BallotBox][\USymbChar{38}{16}] % BALLOT BOX
+ \definesymbol[BallotBoxWithCheck][\USymbChar{38}{17}] % BALLOT BOX WITH CHECK
+ \definesymbol[BallotBoxWithX][\USymbChar{38}{18}] % BALLOT BOX WITH X
+ \definesymbol[Saltire][\USymbChar{38}{19}] % SALTIRE
+ \definesymbol[ReversedRotatedFloralHeartBullet][\USymbChar{38}{25}] % REVERSED ROTATED FLORAL HEART BULLET
+ \definesymbol[WheelOfDharma][\USymbChar{38}{56}] % WHEEL OF DHARMA
+ \definesymbol[WhiteFrowningFace][\USymbChar{38}{57}] % WHITE FROWNING FACE
+ \definesymbol[WhiteSmilingFace][\USymbChar{38}{58}] % WHITE SMILING FACE
+ \definesymbol[BlackSmilingFace][\USymbChar{38}{59}] % BLACK SMILING FACE
+ \definesymbol[WhiteSunWithRays][\USymbChar{38}{60}] % WHITE SUN WITH RAYS
+ \definesymbol[HotSprings][\USymbChar{38}{104}] % HOT SPRINGS
+
+\stopsymbolset
+
+\startsymbolset[Unicode Japanese Chess] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[WhiteShogiPiece][\USymbChar{38}{22}] % [Unassigned U+2616]
+ \definesymbol[BlackShogiPiece][\USymbChar{38}{23}] % [Unassigned U+2617]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Pointing Hand] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[BlackLeftPointingIndex][\USymbChar{38}{26}] % BLACK LEFT POINTING INDEX
+ \definesymbol[BlackRightPointingIndex][\USymbChar{38}{27}] % BLACK RIGHT POINTING INDEX
+ \definesymbol[WhiteLeftPointingIndex][\USymbChar{38}{28}] % WHITE LEFT POINTING INDEX
+ \definesymbol[WhiteUpPointingIndex][\USymbChar{38}{29}] % WHITE UP POINTING INDEX
+ \definesymbol[WhiteRightPointingIndex][\USymbChar{38}{30}] % WHITE RIGHT POINTING INDEX
+ \definesymbol[WhiteDownPointingIndex][\USymbChar{38}{31}] % WHITE DOWN POINTING INDEX
+
+\stopsymbolset
+
+\startsymbolset[Unicode Warning Signs] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[SkullAndCrossbones][\USymbChar{38}{32}] % SKULL AND CROSSBONES
+ \definesymbol[CautionSign][\USymbChar{38}{33}] % CAUTION SIGN
+ \definesymbol[RadioactiveSign][\USymbChar{38}{34}] % RADIOACTIVE SIGN
+ \definesymbol[BiohazardSign][\USymbChar{38}{35}] % BIOHAZARD SIGN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Healing Signs] % 0x2600: Requires UnicodeRegular26
+ \definesymbol[Caduceus][\USymbChar{38}{36}] % CADUCEUS
+ \definesymbol[Ankh][\USymbChar{38}{37}] % ANKH
+\stopsymbolset
+
+\startsymbolset[Unicode Religious and Political] % 0x2600: Requires UnicodeRegular26 and 27
+
+ \definesymbol[OrthodoxCross][\USymbChar{38}{38}] % ORTHODOX CROSS
+ \definesymbol[ChiRho][\USymbChar{38}{39}] % CHI RHO
+ \definesymbol[CrossOfLorraine][\USymbChar{38}{40}] % CROSS OF LORRAINE
+ \definesymbol[CrossOfJerusalem][\USymbChar{38}{41}] % CROSS OF JERUSALEM
+ \definesymbol[StarAndCrescent][\USymbChar{38}{42}] % STAR AND CRESCENT
+ \definesymbol[FarsiSymbol][\USymbChar{38}{43}] % FARSI SYMBOL
+ \definesymbol[AdiShakti][\USymbChar{38}{44}] % ADI SHAKTI
+ \definesymbol[HammerAndSickle][\USymbChar{38}{45}] % HAMMER AND SICKLE
+ \definesymbol[PeaceSymbol][\USymbChar{38}{46}] % PEACE SYMBOL
+ \definesymbol[YinYang][\USymbChar{38}{47}] % YIN YANG
+ \definesymbol[WestSyriacCross][\USymbChar{38}{112}] % WEST SYRIAC CROSS
+ \definesymbol[EastSyriacCross][\USymbChar{38}{113}] % EAST SYRIAC CROSS
+% 27xx starts here
+ \definesymbol[OutlinedGreekCross][\USymbCharZapf{39}{25}] % OUTLINED GREEK CROSS
+ \definesymbol[HeavyGreekCross][\USymbCharZapf{39}{26}] % HEAVY GREEK CROSS
+ \definesymbol[OpenCentreCross][\USymbCharZapf{39}{27}] % OPEN CENTRE CROSS
+ \definesymbol[HeavyOpenCentreCross][\USymbCharZapf{39}{28}] % HEAVY OPEN CENTRE CROSS
+ \definesymbol[LatinCross][\USymbCharZapf{39}{29}] % LATIN CROSS
+ \definesymbol[ShadowedWhiteLatinCross][\USymbCharZapf{39}{30}] % SHADOWED WHITE LATIN CROSS
+ \definesymbol[OutlinedLatinCross][\USymbCharZapf{39}{31}] % OUTLINED LATIN CROSS
+ \definesymbol[MalteseCross][\USymbCharZapf{39}{32}] % MALTESE CROSS
+ \definesymbol[StarOfDavid][\USymbCharZapf{39}{33}] % STAR OF DAVID
+
+
+\stopsymbolset
+
+\startsymbolset[Unicode Trigram] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[TrigramForHeaven][\USymbChar{38}{48}] % TRIGRAM FOR HEAVEN
+ \definesymbol[TrigramForLake][\USymbChar{38}{49}] % TRIGRAM FOR LAKE
+ \definesymbol[TrigramForFire][\USymbChar{38}{50}] % TRIGRAM FOR FIRE
+ \definesymbol[TrigramForThunder][\USymbChar{38}{51}] % TRIGRAM FOR THUNDER
+ \definesymbol[TrigramForWind][\USymbChar{38}{52}] % TRIGRAM FOR WIND
+ \definesymbol[TrigramForWater][\USymbChar{38}{53}] % TRIGRAM FOR WATER
+ \definesymbol[TrigramForMountain][\USymbChar{38}{54}] % TRIGRAM FOR MOUNTAIN
+ \definesymbol[TrigramForEarth][\USymbChar{38}{55}] % TRIGRAM FOR EARTH
+
+\stopsymbolset
+
+\startsymbolset[Unicode Zodiac] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[Aries][\USymbChar{38}{72}] % ARIES
+ \definesymbol[Taurus][\USymbChar{38}{73}] % TAURUS
+ \definesymbol[Gemini][\USymbChar{38}{74}] % GEMINI
+ \definesymbol[Cancer][\USymbChar{38}{75}] % CANCER
+ \definesymbol[Leo][\USymbChar{38}{76}] % LEO
+ \definesymbol[Virgo][\USymbChar{38}{77}] % VIRGO
+ \definesymbol[Libra][\USymbChar{38}{78}] % LIBRA
+ \definesymbol[Scorpius][\USymbChar{38}{79}] % SCORPIUS
+ \definesymbol[Sagittarius][\USymbChar{38}{80}] % SAGITTARIUS
+ \definesymbol[Capricorn][\USymbChar{38}{81}] % CAPRICORN
+ \definesymbol[Aquarius][\USymbChar{38}{82}] % AQUARIUS
+ \definesymbol[Pisces][\USymbChar{38}{83}] % PISCES
+
+\stopsymbolset
+
+\startsymbolset[Unicode Chess] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[WhiteChessKing][\USymbChar{38}{84}] % WHITE CHESS KING
+ \definesymbol[WhiteChessQueen][\USymbChar{38}{85}] % WHITE CHESS QUEEN
+ \definesymbol[WhiteChessRook][\USymbChar{38}{86}] % WHITE CHESS ROOK
+ \definesymbol[WhiteChessBishop][\USymbChar{38}{87}] % WHITE CHESS BISHOP
+ \definesymbol[WhiteChessKnight][\USymbChar{38}{88}] % WHITE CHESS KNIGHT
+ \definesymbol[WhiteChessPawn][\USymbChar{38}{89}] % WHITE CHESS PAWN
+ \definesymbol[BlackChessKing][\USymbChar{38}{90}] % BLACK CHESS KING
+ \definesymbol[BlackChessQueen][\USymbChar{38}{91}] % BLACK CHESS QUEEN
+ \definesymbol[BlackChessRook][\USymbChar{38}{92}] % BLACK CHESS ROOK
+ \definesymbol[BlackChessBishop][\USymbChar{38}{93}] % BLACK CHESS BISHOP
+ \definesymbol[BlackChessKnight][\USymbChar{38}{94}] % BLACK CHESS KNIGHT
+ \definesymbol[BlackChessPawn][\USymbChar{38}{95}] % BLACK CHESS PAWN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Playing Card] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[BlackSpadeSuit][\USymbChar{38}{96}] % BLACK SPADE SUIT
+ \definesymbol[WhiteHeartSuit][\USymbChar{38}{97}] % WHITE HEART SUIT
+ \definesymbol[WhiteDiamondSuit][\USymbChar{38}{98}] % WHITE DIAMOND SUIT
+ \definesymbol[BlackClubSuit][\USymbChar{38}{99}] % BLACK CLUB SUIT
+ \definesymbol[WhiteSpadeSuit][\USymbChar{38}{100}] % WHITE SPADE SUIT
+ \definesymbol[BlackHeartSuit][\USymbChar{38}{101}] % BLACK HEART SUIT
+ \definesymbol[BlackDiamondSuit][\USymbChar{38}{102}] % BLACK DIAMOND SUIT
+ \definesymbol[WhiteClubSuit][\USymbChar{38}{103}] % WHITE CLUB SUIT
+
+\stopsymbolset
+
+\startsymbolset[Unicode Musical] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[QuarterNote][\USymbChar{38}{105}] % QUARTER NOTE
+ \definesymbol[EighthNote][\USymbChar{38}{106}] % EIGHTH NOTE
+ \definesymbol[BeamedEighthNotes][\USymbChar{38}{107}] % BEAMED EIGHTH NOTES
+ \definesymbol[BeamedSixteenthNotes][\USymbChar{38}{108}] % BEAMED SIXTEENTH NOTES
+ \definesymbol[MusicFlatSign][\USymbChar{38}{109}] % MUSIC FLAT SIGN
+ \definesymbol[MusicNaturalSign][\USymbChar{38}{110}] % MUSIC NATURAL SIGN
+ \definesymbol[MusicSharpSign][\USymbChar{38}{111}] % MUSIC SHARP SIGN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Recycling] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[UniversalRecycling][\USymbChar{38}{114}] % [Unassigned U+2672]
+ \definesymbol[Type1Plastics][\USymbChar{38}{115}] % [Unassigned U+2673]
+ \definesymbol[Type2Plastics][\USymbChar{38}{116}] % [Unassigned U+2674]
+ \definesymbol[Type3Plastics][\USymbChar{38}{117}] % [Unassigned U+2675]
+ \definesymbol[Type4Plastics][\USymbChar{38}{118}] % [Unassigned U+2676]
+ \definesymbol[Type5Plastics][\USymbChar{38}{119}] % [Unassigned U+2677]
+ \definesymbol[Type6Plastics][\USymbChar{38}{120}] % [Unassigned U+2678]
+ \definesymbol[Type7Plastics][\USymbChar{38}{121}] % [Unassigned U+2679]
+ \definesymbol[GenericMaterials][\USymbChar{38}{122}] % [Unassigned U+267A]
+ \definesymbol[BlackUniversalRecycling][\USymbChar{38}{123}] % [Unassigned U+267B]
+ \definesymbol[RecycledPaper][\USymbChar{38}{124}] % [Unassigned U+267C]
+ \definesymbol[PartiallyRecycledPaper][\USymbChar{38}{125}] % [Unassigned U+267D]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Dice] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[DieFace1][\USymbChar{38}{128}] % [Unassigned U+2680]
+ \definesymbol[DieFace2][\USymbChar{38}{129}] % [Unassigned U+2681]
+ \definesymbol[DieFace3][\USymbChar{38}{130}] % [Unassigned U+2682]
+ \definesymbol[DieFace4][\USymbChar{38}{131}] % [Unassigned U+2683]
+ \definesymbol[DieFace5][\USymbChar{38}{132}] % [Unassigned U+2684]
+ \definesymbol[DieFace6][\USymbChar{38}{133}] % [Unassigned U+2685]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Go Markers] % 0x2600: Requires UnicodeRegular26
+
+ \definesymbol[WhiteCircleWithDotRight][\USymbChar{38}{134}] % [Unassigned U+2686]
+ \definesymbol[WhiteCircleWithTwoDots][\USymbChar{38}{135}] % [Unassigned U+2687]
+ \definesymbol[BlackCircleWithWhiteDotRight][\USymbChar{38}{136}] % [Unassigned U+2688]
+ \definesymbol[BlackCircleWithTwoWhiteDots][\USymbChar{38}{137}] % [Unassigned U+2689]
+
+\stopsymbolset
+
+\startsymbolset[Unicode Scissors] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[UpperBladeScissors][\USymbCharZapf{39}{1}] % UPPER BLADE SCISSORS
+ \definesymbol[BlackScissors][\USymbCharZapf{39}{2}] % BLACK SCISSORS
+ \definesymbol[LowerBladeScissors][\USymbCharZapf{39}{3}] % LOWER BLADE SCISSORS
+ \definesymbol[WhiteScissors][\USymbCharZapf{39}{4}] % WHITE SCISSORS
+
+\stopsymbolset
+
+\startsymbolset[Unicode Dingbats] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[TelephoneLocationSign][\USymbCharZapf{39}{6}] % TELEPHONE LOCATION SIGN
+ \definesymbol[TapeDrive][\USymbCharZapf{39}{7}] % TAPE DRIVE
+ \definesymbol[Airplane][\USymbCharZapf{39}{8}] % AIRPLANE
+ \definesymbol[Envelope][\USymbCharZapf{39}{9}] % ENVELOPE
+ \definesymbol[VictoryHand][\USymbCharZapf{39}{12}] % VICTORY HAND
+ \definesymbol[WritingHand][\USymbCharZapf{39}{13}] % WRITING HAND
+ \definesymbol[LowerRightPencil][\USymbCharZapf{39}{14}] % LOWER RIGHT PENCIL
+ \definesymbol[Pencil][\USymbCharZapf{39}{15}] % PENCIL
+ \definesymbol[UpperRightPencil][\USymbCharZapf{39}{16}] % UPPER RIGHT PENCIL
+ \definesymbol[WhiteNib][\USymbCharZapf{39}{17}] % WHITE NIB
+ \definesymbol[BlackNib][\USymbCharZapf{39}{18}] % BLACK NIB
+ \definesymbol[BlackDiamondMinusWhiteX][\USymbCharZapf{39}{86}] % BLACK DIAMOND MINUS WHITE X
+
+\stopsymbolset
+
+\startsymbolset[Unicode Checks and Xs] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[CheckMark][\USymbCharZapf{39}{19}] % CHECK MARK
+ \definesymbol[HeavyCheckMark][\USymbCharZapf{39}{20}] % HEAVY CHECK MARK
+ \definesymbol[MultiplicationX][\USymbCharZapf{39}{21}] % MULTIPLICATION X
+ \definesymbol[HeavyMultiplicationX][\USymbCharZapf{39}{22}] % HEAVY MULTIPLICATION X
+ \definesymbol[BallotX][\USymbCharZapf{39}{23}] % BALLOT X
+ \definesymbol[HeavyBallotX][\USymbCharZapf{39}{24}] % HEAVY BALLOT X
+
+\stopsymbolset
+
+\startsymbolset[Unicode Stars] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[FourTeardropSpokedAsterisk][\USymbCharZapf{39}{34}] % FOUR TEARDROP-SPOKED ASTERISK
+ \definesymbol[FourBalloonSpokedAsterisk][\USymbCharZapf{39}{35}] % FOUR BALLOON-SPOKED ASTERISK
+ \definesymbol[HeavyFourBalloonSpokedAsterisk][\USymbCharZapf{39}{36}] % HEAVY FOUR BALLOON-SPOKED ASTERISK
+ \definesymbol[FourClubSpokedAsterisk][\USymbCharZapf{39}{37}] % FOUR CLUB-SPOKED ASTERISK
+ \definesymbol[BlackFourPointedStar][\USymbCharZapf{39}{38}] % BLACK FOUR POINTED STAR
+ \definesymbol[WhiteFourPointedStar][\USymbCharZapf{39}{39}] % WHITE FOUR POINTED STAR
+ \definesymbol[StressOutlinedWhiteStar][\USymbCharZapf{39}{41}] % STRESS OUTLINED WHITE STAR
+ \definesymbol[CircledWhiteStar][\USymbCharZapf{39}{42}] % CIRCLED WHITE STAR
+ \definesymbol[OpenCentreBlackStar][\USymbCharZapf{39}{43}] % OPEN CENTRE BLACK STAR
+ \definesymbol[BlackCentreWhiteStar][\USymbCharZapf{39}{44}] % BLACK CENTRE WHITE STAR
+ \definesymbol[OutlinedBlackStar][\USymbCharZapf{39}{45}] % OUTLINED BLACK STAR
+ \definesymbol[HeavyOutlinedBlackStar][\USymbCharZapf{39}{46}] % HEAVY OUTLINED BLACK STAR
+ \definesymbol[PinwheelStar][\USymbCharZapf{39}{47}] % PINWHEEL STAR
+ \definesymbol[ShadowedWhiteStar][\USymbCharZapf{39}{48}] % SHADOWED WHITE STAR
+ \definesymbol[HeavyAsterisk][\USymbCharZapf{39}{49}] % HEAVY ASTERISK
+ \definesymbol[OpenCentreAsterisk][\USymbCharZapf{39}{50}] % OPEN CENTRE ASTERISK
+ \definesymbol[EightSpokedAsterisk][\USymbCharZapf{39}{51}] % EIGHT SPOKED ASTERISK
+ \definesymbol[EightPointedBlackStar][\USymbCharZapf{39}{52}] % EIGHT POINTED BLACK STAR
+ \definesymbol[EightPointedPinwheelStar][\USymbCharZapf{39}{53}] % EIGHT POINTED PINWHEEL STAR
+ \definesymbol[SixPointedBlackStar][\USymbCharZapf{39}{54}] % SIX POINTED BLACK STAR
+ \definesymbol[EightPointedRectilinearBlackStar][\USymbCharZapf{39}{55}] % EIGHT POINTED RECTILINEAR BLACK STAR
+ \definesymbol[HeavyEightPointedRectilinearBlackStar][\USymbCharZapf{39}{56}] % HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+ \definesymbol[TwelvePointedBlackStar][\USymbCharZapf{39}{57}] % TWELVE POINTED BLACK STAR
+ \definesymbol[SixteenPointedAsterisk][\USymbCharZapf{39}{58}] % SIXTEEN POINTED ASTERISK
+ \definesymbol[TeardropSpokedAsterisk][\USymbCharZapf{39}{59}] % TEARDROP-SPOKED ASTERISK
+ \definesymbol[OpenCentreTeardropSpokedAsterisk][\USymbCharZapf{39}{60}] % OPEN CENTRE TEARDROP-SPOKED ASTERISK
+ \definesymbol[HeavyTeardropSpokedAsterisk][\USymbCharZapf{39}{61}] % HEAVY TEARDROP-SPOKED ASTERISK
+ \definesymbol[SixPetalledBlackAndWhiteFlorette][\USymbCharZapf{39}{62}] % SIX PETALLED BLACK AND WHITE FLORETTE
+ \definesymbol[BlackFlorette][\USymbCharZapf{39}{63}] % BLACK FLORETTE
+ \definesymbol[WhiteFlorette][\USymbCharZapf{39}{64}] % WHITE FLORETTE
+ \definesymbol[EightPetalledOutlinedBlackFlorette][\USymbCharZapf{39}{65}] % EIGHT PETALLED OUTLINED BLACK FLORETTE
+ \definesymbol[CircledOpenCentreEightPointedStar][\USymbCharZapf{39}{66}] % CIRCLED OPEN CENTRE EIGHT POINTED STAR
+ \definesymbol[HeavyTeardropSpokedPinwheelAsterisk][\USymbCharZapf{39}{67}] % HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+ \definesymbol[Sparkle][\USymbCharZapf{39}{71}] % SPARKLE
+ \definesymbol[HeavySparkle][\USymbCharZapf{39}{72}] % HEAVY SPARKLE
+ \definesymbol[Balloon-spokedAsterisk][\USymbCharZapf{39}{73}] % BALLOON-SPOKED ASTERISK
+ \definesymbol[EightTeardrop-spokedPropellerAsterisk][\USymbCharZapf{39}{74}] % EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+ \definesymbol[HeavyEightTeardrop-spokedPropellerAsterisk][\USymbCharZapf{39}{75}] % HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+
+\stopsymbolset
+
+\startsymbolset[Unicode Snowflakes] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[Snowflake][\USymbCharZapf{39}{68}] % SNOWFLAKE
+ \definesymbol[TightTrifoliateSnowflake][\USymbCharZapf{39}{69}] % TIGHT TRIFOLIATE SNOWFLAKE
+ \definesymbol[HeavyChevronSnowflake][\USymbCharZapf{39}{70}] % HEAVY CHEVRON SNOWFLAKE
+
+\stopsymbolset
+
+\startsymbolset[Unicode Shadowed Shapes] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[ShadowedWhiteCircle][\USymbCharZapf{39}{77}] % SHADOWED WHITE CIRCLE
+ \definesymbol[LowerRightDrop-shadowedWhiteSquare][\USymbCharZapf{39}{79}] % LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+ \definesymbol[UpperRightDrop-shadowedWhiteSquare][\USymbCharZapf{39}{80}] % UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+ \definesymbol[LowerRightShadowedWhiteSquare][\USymbCharZapf{39}{81}] % LOWER RIGHT SHADOWED WHITE SQUARE
+ \definesymbol[UpperRightShadowedWhiteSquare][\USymbCharZapf{39}{82}] % UPPER RIGHT SHADOWED WHITE SQUARE
+
+\stopsymbolset
+
+\startsymbolset[Unicode Bars] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[LightVerticalBar][\USymbCharZapf{39}{88}] % LIGHT VERTICAL BAR
+ \definesymbol[MediumVerticalBar][\USymbCharZapf{39}{89}] % MEDIUM VERTICAL BAR
+ \definesymbol[HeavyVerticalBar][\USymbCharZapf{39}{90}] % HEAVY VERTICAL BAR
+
+\stopsymbolset
+
+\startsymbolset[Unicode Dingbat Punctuation] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[HeavySingleTurnedCommaQuotationMark][\USymbCharZapf{39}{91}] % HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+ \definesymbol[HeavySingleCommaQuotationMark][\USymbCharZapf{39}{92}] % HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+ \definesymbol[HeavyDoubleTurnedCommaQuotationMark][\USymbCharZapf{39}{93}] % HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+ \definesymbol[HeavyDoubleCommaQuotationMark][\USymbCharZapf{39}{94}] % HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+ \definesymbol[CurvedStemParagraphSign][\USymbCharZapf{39}{97}] % CURVED STEM PARAGRAPH SIGN ORNAMENT
+ \definesymbol[HeavyExclamationMark][\USymbCharZapf{39}{98}] % HEAVY EXCLAMATION MARK ORNAMENT
+ \definesymbol[HeavyHeartExclamationMark][\USymbCharZapf{39}{99}] % HEAVY HEART EXCLAMATION MARK ORNAMENT
+
+\stopsymbolset
+
+\startsymbolset[Unicode Hearts] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[HeavyBlackHeart][\USymbCharZapf{39}{100}] % HEAVY BLACK HEART
+ \definesymbol[RotatedHeavyBlackHeartBullet][\USymbCharZapf{39}{101}] % ROTATED HEAVY BLACK HEART BULLET
+ \definesymbol[FloralHeart][\USymbCharZapf{39}{102}] % FLORAL HEART
+ \definesymbol[RotatedFloralHeartBullet][\USymbCharZapf{39}{103}] % ROTATED FLORAL HEART BULLET
+
+\stopsymbolset
+
+\startsymbolset[Unicode Negative Circled Digits] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[CircledOne][\USymbCharZapf{39}{118}] % DINGBAT NEGATIVE CIRCLED DIGIT ONE
+ \definesymbol[CircledTwo][\USymbCharZapf{39}{119}] % DINGBAT NEGATIVE CIRCLED DIGIT TWO
+ \definesymbol[CircledThree][\USymbCharZapf{39}{120}] % DINGBAT NEGATIVE CIRCLED DIGIT THREE
+ \definesymbol[CircledFour][\USymbCharZapf{39}{121}] % DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+ \definesymbol[CircledFive][\USymbCharZapf{39}{122}] % DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+ \definesymbol[CircledSix][\USymbCharZapf{39}{123}] % DINGBAT NEGATIVE CIRCLED DIGIT SIX
+ \definesymbol[CircledSeven][\USymbCharZapf{39}{124}] % DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+ \definesymbol[CircledEight][\USymbCharZapf{39}{125}] % DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+ \definesymbol[CircledNine][\USymbCharZapf{39}{126}] % DINGBAT NEGATIVE CIRCLED DIGIT NINE
+ \definesymbol[CircledTen][\USymbCharZapf{39}{127}] % DINGBAT NEGATIVE CIRCLED NUMBER TEN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Circled Sans-serif Digits] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[CircledOne][\USymbCharZapf{39}{128}] % DINGBAT CIRCLED SANS-SERIF DIGIT ONE
+ \definesymbol[CircledTwo][\USymbCharZapf{39}{129}] % DINGBAT CIRCLED SANS-SERIF DIGIT TWO
+ \definesymbol[CircledThree][\USymbCharZapf{39}{130}] % DINGBAT CIRCLED SANS-SERIF DIGIT THREE
+ \definesymbol[CircledFour][\USymbCharZapf{39}{131}] % DINGBAT CIRCLED SANS-SERIF DIGIT FOUR
+ \definesymbol[CircledFive][\USymbCharZapf{39}{132}] % DINGBAT CIRCLED SANS-SERIF DIGIT FIVE
+ \definesymbol[CircledSix][\USymbCharZapf{39}{133}] % DINGBAT CIRCLED SANS-SERIF DIGIT SIX
+ \definesymbol[CircledSeven][\USymbCharZapf{39}{134}] % DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN
+ \definesymbol[CircledEight][\USymbCharZapf{39}{135}] % DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT
+ \definesymbol[CircledNine][\USymbCharZapf{39}{136}] % DINGBAT CIRCLED SANS-SERIF DIGIT NINE
+ \definesymbol[CircledTen][\USymbCharZapf{39}{137}] % DINGBAT CIRCLED SANS-SERIF NUMBER TEN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Negative Circled Sans-serif Digits] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[CircledOne][\USymbCharZapf{39}{138}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE
+ \definesymbol[CircledTwo][\USymbCharZapf{39}{139}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO
+ \definesymbol[CircledThree][\USymbCharZapf{39}{140}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE
+ \definesymbol[CircledFour][\USymbCharZapf{39}{141}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR
+ \definesymbol[CircledFive][\USymbCharZapf{39}{142}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE
+ \definesymbol[CircledSix][\USymbCharZapf{39}{143}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX
+ \definesymbol[CircledSeven][\USymbCharZapf{39}{144}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN
+ \definesymbol[CircledEight][\USymbCharZapf{39}{145}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT
+ \definesymbol[CircledNine][\USymbCharZapf{39}{146}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE
+ \definesymbol[CircledTen][\USymbCharZapf{39}{147}] % DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+
+\stopsymbolset
+
+\startsymbolset[Unicode Dingbat Arrows] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[HeavyWideHeadedRightwardsArrow][\USymbCharZapf{39}{148}] % HEAVY WIDE-HEADED RIGHTWARDS ARROW
+ \definesymbol[HeavySouthEastArrow][\USymbCharZapf{39}{152}] % HEAVY SOUTH EAST ARROW
+ \definesymbol[HeavyRightwardsArrow][\USymbCharZapf{39}{153}] % HEAVY RIGHTWARDS ARROW
+ \definesymbol[HeavyNorthEastArrow][\USymbCharZapf{39}{154}] % HEAVY NORTH EAST ARROW
+ \definesymbol[DraftingPointRightwardsArrow][\USymbCharZapf{39}{155}] % DRAFTING POINT RIGHTWARDS ARROW
+ \definesymbol[HeavyRoundTippedRightwardsArrow][\USymbCharZapf{39}{156}] % HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+ \definesymbol[TriangleHeadedRightwardsArrow][\USymbCharZapf{39}{157}] % TRIANGLE-HEADED RIGHTWARDS ARROW
+ \definesymbol[HeavyTriangleHeadedRightwardsArrow][\USymbCharZapf{39}{158}] % HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+ \definesymbol[DashedTriangleHeadedRightwardsArrow][\USymbCharZapf{39}{159}] % DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+ \definesymbol[HeavyDashedTriangleHeadedRightwardsArrow][\USymbCharZapf{39}{160}] % HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+ \definesymbol[BlackRightwardsArrow][\USymbCharZapf{39}{161}] % BLACK RIGHTWARDS ARROW
+ \definesymbol[3DTopLightedRightwardsArrowhead][\USymbCharZapf{39}{162}] % THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+ \definesymbol[3DBottomLightedRightwardsArrowhead][\USymbCharZapf{39}{163}] % THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+ \definesymbol[BlackRightwardsArrowhead][\USymbCharZapf{39}{164}] % BLACK RIGHTWARDS ARROWHEAD
+ \definesymbol[HeavyBlackCurvedDownwardsAndRightwardsArrow][\USymbCharZapf{39}{165}] % HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+ \definesymbol[HeavyBlackCurvedUpwardsAndRightwardsArrow][\USymbCharZapf{39}{166}] % HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+ \definesymbol[SquatBlackRightwardsArrow][\USymbCharZapf{39}{167}] % SQUAT BLACK RIGHTWARDS ARROW
+ \definesymbol[HeavyConcavePointedBlackRightwardsArrow][\USymbCharZapf{39}{168}] % HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+ \definesymbol[CircledHeavyWhiteRightwardsArrow][\USymbCharZapf{39}{178}] % CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+ \definesymbol[OpenOutlinedRightwardsArrow][\USymbCharZapf{39}{190}] % OPEN-OUTLINED RIGHTWARDS ARROW
+
+\stopsymbolset
+
+\startsymbolset[Unicode Shadowed Arrows] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[RightShadedWhiteRightwardsArrow][\USymbCharZapf{39}{169}] % RIGHT-SHADED WHITE RIGHTWARDS ARROW
+ \definesymbol[LeftShadedWhiteRightwardsArrow][\USymbCharZapf{39}{170}] % LEFT-SHADED WHITE RIGHTWARDS ARROW
+ \definesymbol[BackTiltedShadowedWhiteRightwardsArrow][\USymbCharZapf{39}{171}] % BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+ \definesymbol[FrontTiltedShadowedWhiteRightwardsArrow][\USymbCharZapf{39}{172}] % FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+ \definesymbol[HeavyLowerRightShadowedWhiteRightwardsArrow][\USymbCharZapf{39}{173}] % HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+ \definesymbol[HeavyUpperRightShadowedWhiteRightwardsArrow][\USymbCharZapf{39}{174}] % HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+ \definesymbol[NotchedLowerRightShadowedWhiteRightwardsArrow][\USymbCharZapf{39}{175}] % NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+ \definesymbol[NotchedUpperRightShadowedWhiteRightwardsArrow][\USymbCharZapf{39}{177}] % NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+
+\stopsymbolset
+
+\startsymbolset[Unicode Tailed Arrows] % 0x2700: Requires UnicodeRegular27
+
+ \definesymbol[WhiteFeatheredRightwardsArrow][\USymbCharZapf{39}{179}] % WHITE-FEATHERED RIGHTWARDS ARROW
+ \definesymbol[BlackFeatheredSouthEastArrow][\USymbCharZapf{39}{180}] % BLACK-FEATHERED SOUTH EAST ARROW
+ \definesymbol[BlackFeatheredRightwardsArrow][\USymbCharZapf{39}{181}] % BLACK-FEATHERED RIGHTWARDS ARROW
+ \definesymbol[BlackFeatheredNorthEastArrow][\USymbCharZapf{39}{182}] % BLACK-FEATHERED NORTH EAST ARROW
+ \definesymbol[HeavyBlack-featheredSouthEastArrow][\USymbCharZapf{39}{183}] % HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+ \definesymbol[HeavyBlackFeatheredRightwardsArrow][\USymbCharZapf{39}{184}] % HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+ \definesymbol[HeavyBlackFeatheredNorthEastArrow][\USymbCharZapf{39}{185}] % HEAVY BLACK-FEATHERED NORTH EAST ARROW
+ \definesymbol[TeardropBarbedRightwardsArrow][\USymbCharZapf{39}{186}] % TEARDROP-BARBED RIGHTWARDS ARROW
+ \definesymbol[HeavyTeardropShankedRightwardsArrow][\USymbCharZapf{39}{187}] % HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+ \definesymbol[WedgeTailedRightwardsArrow][\USymbCharZapf{39}{188}] % WEDGE-TAILED RIGHTWARDS ARROW
+ \definesymbol[HeavyWedgeTailedRightwardsArrow][\USymbCharZapf{39}{189}] % HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+
+\stopsymbolset
+
+\endinput
diff --git a/tex/context/base/symb-was.tex b/tex/context/base/symb-was.tex
new file mode 100644
index 000000000..d6c324864
--- /dev/null
+++ b/tex/context/base/symb-was.tex
@@ -0,0 +1,205 @@
+%D \module
+%D [ file=symb-was,
+%D version=2005.10.15,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Roland Waldi's Symbols (wasy-2),
+%D author=Henning Hraban Ramm,
+%D date=\currentdate,
+%D copyright={public domain}]
+%C
+%C This module is in the public domain.
+
+%D This module implements the Roland Waldi Symbole font
+%D (wasy). The names are derived from the \LATEX\ package
+%D \type {wasysym} by Axel Kielhorn. The symbols are
+%D available as Type~1 font and are included in \TEX\ distributions.
+%D
+%D This symbol font offers basic sets of astronomical, astrological,
+%D geometrical, musical and general symbols, plus those needed
+%D for the APL programming language and some more.
+%D This module leaves out most of the math stuff, such as operators
+%D and integrals.
+%D
+%D The font was designed by Robert Waldi and is in the public domain.
+%D The PS Type 1 fonts are by Taco Hoekwater, \hyphenatedurl
+%D {taco.hoekwater@wkap.nl}, and also in the public domain.
+%D The wasysym \LATEX\ package is (c) Axel Kielhorn, \hyphenatedurl
+%D {A.Kielhorn@web.de}, under the LaTeX Project Public License.
+%D This stuff lives in \hyphenatedurl {http://dante.ctan.org/CTAN/fonts/wasy2/}.
+%D
+%D This \CONTEXT\ module is by Henning Hraban Ramm, \hyphenatedurl
+%D {hraban@fiee.net}, given to the public domain as far as allowed
+%D (some parts are copied from the \LATEX\ package).
+
+%D Slightly patched by HH.
+
+\loadmapfile[original-wasy.map]
+
+% there are also fonts for 6, 7, 8, 9 pt; how can we access these automatically?
+% how about the bold wasy font?
+
+\definefontsynonym [WaldiSymbol] [wasy10]
+\definefontsynonym [WaldiSymbolBold] [wasyb10]
+
+\def\WaldiSymbol#1{\getglyph{WaldiSymbol}{\char#1}}
+
+\def\wasy@over#1#2{{\setbox0\hbox{$#2$}\hbox to \wd0{\hss$#1$\hss}\kern-\wd0\box0}}
+
+% general symbols
+
+\startsymbolset [wasy general]
+ \definesymbol [male] [\WaldiSymbol {26}]
+ \definesymbol [female] [\WaldiSymbol {25}]
+ \definesymbol [currency] [\WaldiSymbol {27}]
+ \definesymbol [cent] [\WaldiSymbol{103}]
+ \definesymbol [lozenge] [\WaldiSymbol {53}]
+ \definesymbol [kreuz] [\WaldiSymbol {54}]
+ \definesymbol [smiley] [\WaldiSymbol {44}]
+ \definesymbol [blacksmiley] [\WaldiSymbol {45}]
+ \definesymbol [frownie] [\WaldiSymbol {47}]
+ \definesymbol [sun] [\WaldiSymbol {46}]
+ \definesymbol [checked] [\WaldiSymbol {8}]
+ \definesymbol [brokenvert] [\WaldiSymbol{124}]
+ \definesymbol [diameter] [\WaldiSymbol {31}]
+ \definesymbol [invdiameter] [\WaldiSymbol {21}]
+ \definesymbol [phone] [\WaldiSymbol {7}]
+ \definesymbol [recorder] [\WaldiSymbol {6}]
+ \definesymbol [clock] [\WaldiSymbol {28}]
+ \definesymbol [permil] [\WaldiSymbol{104}]
+ \definesymbol [bell] [\WaldiSymbol {10}]
+ \definesymbol [ataribox] [\WaldiSymbol{109}]
+ \definesymbol [pointer] [\WaldiSymbol {9}]
+ \definesymbol [lightning] [\WaldiSymbol {18}]
+ \definesymbol [agemO] [\WaldiSymbol {48}]
+\stopsymbolset
+
+\startsymbolset [wasy music]
+ \definesymbol [eighthnote] [\WaldiSymbol{11}]
+ \definesymbol [quarternote] [\WaldiSymbol{12}]
+ \definesymbol [halfnote] [\WaldiSymbol{13}]
+ \definesymbol [fullnote] [\WaldiSymbol{14}]
+ \definesymbol [twonotes] [\WaldiSymbol{15}]
+\stopsymbolset
+
+\startsymbolset [wasy astronomy]
+ \definesymbol [ascnode] [\WaldiSymbol{19}]
+ \definesymbol [descnode] [\WaldiSymbol{20}]
+ \definesymbol [astrosun] [\mathematics{\odot}]
+ \definesymbol [sun] [\WaldiSymbol{46}] % additional
+ \definesymbol [newmoon] [\WaldiSymbol{32}]
+ \definesymbol [fullmoon] [\WaldiSymbol{35}]
+ \definesymbol [rightmoon] [\WaldiSymbol{37}]
+ \definesymbol [leftmoon] [\WaldiSymbol{36}]
+ \definesymbol [vernal] [\WaldiSymbol{23}]
+ \definesymbol [mercury] [\WaldiSymbol{39}]
+ \definesymbol [mars] [\dontleavehmode\lower.2ex\hbox{\WaldiSymbol{26}}]
+ \definesymbol [saturn] [\WaldiSymbol{89}]
+ \definesymbol [neptune] [\WaldiSymbol{91}]
+ \definesymbol [earth] [\dontleavehmode\lower.3ex\hbox{\WaldiSymbol{38}}]
+ \definesymbol [venus] [\dontleavehmode\raise.2ex\hbox{\WaldiSymbol{25}}]
+ \definesymbol [jupiter] [\WaldiSymbol{88}]
+ \definesymbol [uranus] [\WaldiSymbol{90}]
+ \definesymbol [pluto] [\WaldiSymbol{92}]
+\stopsymbolset
+
+\startsymbolset [wasy astrology]
+ \definesymbol [conjunction] [\WaldiSymbol {86}]
+ \definesymbol [opposition] [\WaldiSymbol {87}]
+ \definesymbol [aries] [\WaldiSymbol {23}]
+ \definesymbol [libra] [\WaldiSymbol {97}]
+ \definesymbol [taurus] [\WaldiSymbol {93}]
+ \definesymbol [scorpio] [\WaldiSymbol {98}]
+ \definesymbol [gemini] [\WaldiSymbol {94}]
+ \definesymbol [sagittarius] [\WaldiSymbol {99}]
+ \definesymbol [cancer] [\WaldiSymbol {95}]
+ \definesymbol [capricornus] [\WaldiSymbol{100}]
+ \definesymbol [leo] [\WaldiSymbol {19}]
+ \definesymbol [aquarius] [\WaldiSymbol{101}]
+ \definesymbol [virgo] [\WaldiSymbol {96}]
+ \definesymbol [pisces] [\WaldiSymbol{102}]
+\stopsymbolset
+
+\startsymbolset [wasy geometry]
+ \definesymbol [fivestar] [\WaldiSymbol {69}] % HHR additional
+ \definesymbol [hexstar] [\WaldiSymbol {65}]
+ \definesymbol [varhexstar] [\WaldiSymbol {66}]
+ \definesymbol [davidsstar] [\WaldiSymbol {67}]
+ \definesymbol [Circle] [\WaldiSymbol {35}]
+ \definesymbol [CIRCLE] [\WaldiSymbol {32}]
+ \definesymbol [Leftcircle] [\WaldiSymbol {73}]
+ \definesymbol [LEFTCIRCLE] [\WaldiSymbol {71}]
+ \definesymbol [Rightcircle] [\WaldiSymbol {74}]
+ \definesymbol [RIGHTCIRCLE] [\WaldiSymbol {72}]
+ \definesymbol [LEFTcircle] [\dontleavehmode\hbox to \zeropoint{\WaldiSymbol{71}\hss}\WaldiSymbol{35}]
+ \definesymbol [RIGHTcircle] [\dontleavehmode\hbox to \zeropoint{\WaldiSymbol{72}\hss}\WaldiSymbol{35}]
+ \definesymbol [LEFTarrow] [\WaldiSymbol {16}]
+ \definesymbol [RIGHTarrow] [\WaldiSymbol {17}]
+ \definesymbol [UParrow] [\WaldiSymbol {75}]
+ \definesymbol [DOWNarrow] [\WaldiSymbol {76}]
+ \definesymbol [Box] [\WaldiSymbol {50}]
+ \definesymbol [APLbox] [\WaldiSymbol{126}]
+ \definesymbol [XBox] [\WaldiSymbol {52}]
+ \definesymbol [Bowtie] [\WaldiSymbol {49}]
+ \definesymbol [Diamond] [\WaldiSymbol {51}]
+ \definesymbol [octagon] [\WaldiSymbol {56}]
+ \definesymbol [hexagon] [\WaldiSymbol {55}]
+ \definesymbol [varhexagon] [\WaldiSymbol {57}]
+ \definesymbol [pentagon] [\WaldiSymbol {68}]
+ \definesymbol [pentastar] [\dontleavehmode\hbox to \zeropoint{\WaldiSymbol{68}\hss}\lower.04em\hbox{\WaldiSymbol{69}}] % HHR additional
+\stopsymbolset
+
+\startsymbolset [wasy physics]
+ \definesymbol [varangle] [\WaldiSymbol{30}]
+ \definesymbol [invneg] [\WaldiSymbol{24}]
+ \definesymbol [leftturn] [\WaldiSymbol{34}]
+ \definesymbol [rightturn] [\WaldiSymbol{33}]
+ \definesymbol [diameter] [\WaldiSymbol{31}]
+ \definesymbol [invdiameter] [\WaldiSymbol{21}] % additional
+ \definesymbol [therefore] [\WaldiSymbol {5}]
+ \definesymbol [AC] [\mbox{\kern.05em\WaldiSymbol{58}\kern.05em}]
+ \definesymbol [HF] [\dontleavehmode
+ \lower.09em\hbox to \zeropoint{\kern.05em\WaldiSymbol{58}\hss}%
+ \raise.09em\hbox{\kern.05em\WaldiSymbol{58}\kern.05em}]
+ \definesymbol [VHF] [\WaldiSymbol{64}]
+ \definesymbol [photon] [\hbox{\WaldiSymbol{58}\WaldiSymbol{58}\WaldiSymbol{58}\WaldiSymbol{58}}]
+ \definesymbol [gluon] [\hbox{\WaldiSymbol{80}\WaldiSymbol{80}\WaldiSymbol{80}\WaldiSymbol{80}\WaldiSymbol{80}\WaldiSymbol{80}}]
+\stopsymbolset
+
+\startsymbolset [wasy apl]
+ \definesymbol [APLup] [\WaldiSymbol{0}]
+ \definesymbol [APLdown] [\WaldiSymbol{70}]
+ \definesymbol [APLbox] [\WaldiSymbol{126}]
+ \definesymbol [APLinv] [\dontleavehmode\hbox to \zeropoint{$\div$\hss}\WaldiSymbol{126}]
+ \definesymbol [APLleftarrowbox] [\WaldiSymbol{112}]
+ \definesymbol [APLrightarrowbox][\WaldiSymbol{113}]
+ \definesymbol [APLuparrowbox] [\WaldiSymbol{110}]
+ \definesymbol [APLdownarrowbox] [\WaldiSymbol{111}]
+ \definesymbol [APLinput] [\WaldiSymbol{125}]
+ \definesymbol [APLminus] [\dontleavehmode\raise.7ex\hbox{$-$}]
+ \definesymbol [APLlog] [\WaldiSymbol{22}]
+ \definesymbol [APLstar] [\WaldiSymbol{69}]
+ \definesymbol [APLcomment] [\WaldiSymbol{127}]
+ \definesymbol [notslash] [\wasy@over{/}{-}]
+ \definesymbol [notbackslash] [\wasy@over{\backslash}{-}]
+ %
+ %definesymbol [APLvert] [\WaldiSymbol{}]
+ %definesymbol [APLnot] [\WaldiSymbol{}]
+ %definesymbol [APLcirc] [\WaldiSymbol{}]
+ %
+ % HH: messy, best define all combinations (todo)
+ %
+ \def\APLnot #1{\wasy@over{\sim }{#1}}
+ \def\APLcirc#1{\wasy@over{\circ}{#1}}
+ \def\APLvert#1{\wasy@over{\vert}{#1}}
+ %
+\stopsymbolset
+
+%D \showsymbolset[wasy general]
+%D \showsymbolset[wasy music]
+%D \showsymbolset[wasy astronomy]
+%D \showsymbolset[wasy astrology]
+%D \showsymbolset[wasy geometry]
+%D \showsymbolset[wasy physics]
+%D \showsymbolset[wasy apl]
+
+\endinput
diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv
new file mode 100644
index 000000000..fcc1ee88f
--- /dev/null
+++ b/tex/context/base/syst-aux.mkiv
@@ -0,0 +1,7018 @@
+%D \module
+%D [ file=syst-gen,
+%D version=1996.03.20,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=General,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Some of the macros will move to syst-obs as they might become
+%D obsolete once we've redone the bibliography module. Of course
+%D the handy helpers will stay.
+
+%D This is a stripped down combination of:
+%D
+%D \startitemize
+%D \item \type {syst-gen.tex}
+%D \item \type {syst-ext.tex}
+%D \item \type {syst-new.tex}
+%D \stopitemize
+%D
+%D We keep them around (for \MKII) so you can find comments,
+%D experiences, intermediate versions and cleaner variants
+%D there (and also non-\ETEX\ variants).
+%D
+%D Contrary to the older files, we now assume that this one
+%D is used in \CONTEXT\ and therefore we might also assume that
+%D some basic functionality is available.
+%D
+%D Some of the macros here are used in the bibliography module. They
+%D will be moved to a separate syst module some once the bib module
+%D is made \MKIV.
+
+\unprotect
+
+\let\reportprotectionstate\relax
+
+%D \macros
+%D {doifolderversionelse}
+%D
+%D We start with a macro specially for Aditya who wants to be able
+%D to use development versions of \MKIV\ for real documents.
+%D
+%D \starttyping
+%D \doifolderversionelse\contextversion{2001.02.03}{yes}{no}
+%D \doifolderversionelse\contextversion{3001.02.03}{yes}{no}
+%D \stoptyping
+%D
+%D The \type {yyyy.mm.dd} syntax is rather strict.
+
+\def\@@versiontonumber#1.#2.#3#4#5\relax
+ {\numexpr#1*\plustenthousand+#2*\plushundred+#3#4\relax}
+
+\def\doifolderversionelse#1#2%
+ {\normalexpanded{\noexpand\ifnum\noexpand\@@versiontonumber#1\relax<\noexpand\@@versiontonumber#2\relax}\relax
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {normalspace}
+%D
+%D There is already \type{\space} but just to be sure we also
+%D provide:
+
+\def\normalspace{ }
+
+%D \macros
+%D {!!count, !!toks, !!dimen, !!box,
+%D !!width, !!height, !!depth, !!string, !!done}
+%D
+%D We define some more \COUNTERS\ and \DIMENSIONS. We also
+%D define some shortcuts to the local scatchregisters~0, 2, 4,
+%D 6 and~8.
+
+\newcount\!!counta \newtoks\!!toksa \newdimen\!!dimena \newbox\!!boxa
+\newcount\!!countb \newtoks\!!toksb \newdimen\!!dimenb \newbox\!!boxb
+\newcount\!!countc \newtoks\!!toksc \newdimen\!!dimenc \newbox\!!boxc
+\newcount\!!countd \newtoks\!!toksd \newdimen\!!dimend \newbox\!!boxd
+\newcount\!!counte \newtoks\!!tokse \newdimen\!!dimene \newbox\!!boxe
+\newcount\!!countf \newtoks\!!toksf \newdimen\!!dimenf \newbox\!!boxf
+ \newdimen\!!dimeng
+ \newdimen\!!dimenh
+ \newdimen\!!dimeni
+ \newdimen\!!dimenj
+ \newdimen\!!dimenk
+
+\let\!!stringa\empty \let\!!stringb\empty \let\!!stringc\empty
+\let\!!stringd\empty \let\!!stringe\empty \let\!!stringf\empty
+
+\newdimen\!!widtha \newdimen\!!heighta \newdimen\!!deptha
+\newdimen\!!widthb \newdimen\!!heightb \newdimen\!!depthb
+\newdimen\!!widthc \newdimen\!!heightc \newdimen\!!depthc
+\newdimen\!!widthd \newdimen\!!heightd \newdimen\!!depthd
+
+\newif\if!!donea \newif\if!!doneb \newif\if!!donec
+\newif\if!!doned \newif\if!!donee \newif\if!!donef
+
+\def\!!zerocount {0} % alongside \zerocount
+\def\!!minusone {-1} % alongside \minusone
+\def\!!plusone {1} % alongside \plusone
+\def\!!plustwo {2} % alongside \plustwo
+\def\!!plusthree {3} % alongside \plusthree
+
+\ifdefined\data \else \let\data \relax \fi % dep checker
+
+%D \macros
+%D {s!,c!,e!,p!,v!,@@,??}
+%D
+%D To save memory, we use constants (sometimes called
+%D variables). Redefining these constants can have disastrous
+%D results.
+
+\def\v!prefix! {v!} \def\c!prefix! {c!}
+\def\s!prefix! {s!} \def\p!prefix! {p!}
+
+\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}
+
+\def\s!empty {empty}
+
+%D \macros
+%D {@EA,@EAEA,@EAEAEA,@EAEAEAEAEAEA,expanded,startexpanded}
+%D
+%D When in unprotected mode, to be entered with
+%D \type{\unprotect}, one can use \type{\@EA} as equivalent
+%D of \type{\expandafter}.
+
+\let\@NX\noexpand
+\let\@EA\expandafter
+
+\def\@EAEA {\expandafter\expandafter}
+\def\@EAEAEA{\expandafter\expandafter\expandafter}
+
+\def\@EAEAEAEAEAEA{\expandafter\@EAEAEA\expandafter}
+
+%D Sometimes we pass macros as arguments to commands that
+%D don't expand them before interpretation. Such commands can
+%D be enclosed with \type{\expanded}, like:
+%D
+%D \starttyping
+%D \expanded{\setupsomething[\alfa]}
+%D \stoptyping
+%D
+%D Such situations occur for instance when \type{\alfa} is a
+%D commalist or when data stored in macros is fed to index of
+%D list commands. If needed, one should use \type{\noexpand}
+%D inside the argument. Later on we will meet some more clever
+%D alternatives to this command.
+
+\long\def\@@expanded{} % always long; global (less restores)
+
+\long\def\expanded#1%
+ {\long\xdef\@@expanded{\noexpand#1}\@@expanded}
+
+%D Beware, the next one has no \type {\noexpand} before its
+%D argument.
+
+\long\def\startexpanded#1\stopexpanded % see x-fo for example
+ {\long\xdef\@@expanded{#1}\@@expanded}
+
+%D Recent \TEX's have a primitive \expanded
+
+% \long\def\expanded
+% {\normalexpanded\bgroup\noexpand\gobblenexttoken}
+
+%D \macros
+%D {safeexpanded,everysafeexpanded}
+%D
+%D In addition we provide:
+
+\newtoks\everysafeexpanded
+
+\long\def\safeexpanded#1% why the \noexpand
+ {\begingroup
+ \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#1}%
+ \endgroup
+ \@@expanded}
+
+\def\safeedef#1#2%
+ {\begingroup
+ \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#2}%
+ \endgroup
+ \let#1\@@expanded}
+
+\def\safexdef#1#2%
+ {\begingroup
+ \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#2}%
+ \endgroup
+ \global\let#1\@@expanded}
+
+%D You can append protective measures to the token register if
+%D needed, as we will do later.
+
+%D \macros
+%D {expandoneargafter,expandtwoargsafter}
+%D
+%D These two commands make macros more readable by hiding a
+%D lot of \type {\expandafter}'s. They expand the arguments
+%D after the first command.
+%D
+%D \starttyping
+%D \expandoneargafter \command{\abc}
+%D \expandtwoargsafter\command{\abc}{\def}
+%D \stoptyping
+%D
+%D These commands expect the arguments to be macros.
+
+\def\expandoneargafter #1{\@EA#1\@EA}
+\def\expandtwoargsafter#1#2{\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA}
+
+%D These two do a full expansion:
+
+\def\fullexpandoneargafter #1#2{\long\xdef\@@expanded{\noexpand#1{#2}}\@@expanded}
+\def\fullexpandtwoargsafter#1#2#3{\long\xdef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
+
+%D \macros
+%D {gobbleoneargument,gobble...arguments}
+%D
+%D The next set of macros just do nothing, except that they
+%D get rid of a number of arguments.
+
+\long\def\gobbleoneargument #1{}
+\long\def\gobbletwoarguments #1#2{}
+\long\def\gobblethreearguments #1#2#3{}
+\long\def\gobblefourarguments #1#2#3#4{}
+\long\def\gobblefivearguments #1#2#3#4#5{}
+\long\def\gobblesixarguments #1#2#3#4#5#6{}
+\long\def\gobblesevenarguments #1#2#3#4#5#6#7{}
+\long\def\gobbleeightarguments #1#2#3#4#5#6#7#8{}
+\long\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{}
+\long\def\gobbletenarguments #1{\gobbleninearguments}
+
+%D \macros
+%D {doifnextcharelse}
+%D
+%D When we started using \TEX\ in the late eighties, our
+%D first experiences with programming concerned a simple shell
+%D around \LATEX. The commands probably use most at \PRAGMA,
+%D are the itemizing ones. One of those few shell commands took
+%D care of an optional argument, that enabled us to specify
+%D what kind of item symbol we wanted. Without understanding
+%D anything we were able to locate a \LATEX\ macro that could
+%D be used to inspect the next character.
+%D
+%D It's this macro that the ancester of the next one presented
+%D here. It executes one of two actions, dependant of the next
+%D character. Disturbing spaces and line endings, which are
+%D normally interpreted as spaces too, are skipped.
+%D
+%D \starttyping
+%D \doifnextcharelse {karakter} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This macro differs from the original in the use of \type
+%D {\localnext} because we don't want clashes with \type
+%D {\next}.
+
+\long\def\doifnextcharelse#1#2#3% #1 should not be {} !
+ {\let\charactertoken=#1% = needed here
+ \def\!!stringa{#2}%
+ \def\!!stringb{#3}%
+ \futurelet\nexttoken\inspectnextcharacter}
+
+\def\inspectnextcharacter
+ {\ifx\nexttoken\blankspace
+ \@EA\reinspectnextcharacter
+ \else
+ \@EA\inspectnextcharacterindeed
+ \fi}
+\def\inspectnextcharacterindeed
+ {\ifx\nexttoken\charactertoken
+ \@EA\!!stringa
+ \else
+ \@EA\!!stringb
+ \fi}
+
+%D Because we will mostly use this macro for testing if the next
+%D character is \type {[}, we also make a slightly faster variant
+%D as it is not uncommon to have tens of thousands of calls to this
+%D test in a run. Of course it also is more convenient to read a
+%D trace then.
+
+\let\nextoptionalcharactertoken=[
+
+\long\def\doifnextoptionalelse#1#2%
+ {\def\nextoptionalcommandyes{#1}%
+ \def\nextoptionalcommandnop{#2}%
+ \futurelet\nexttoken\inspectnextoptionalcharacter}
+\def\inspectnextoptionalcharacter
+ {\ifx\nexttoken\blankspace
+ \@EA\reinspectnextoptionalcharacter
+ \else
+ \@EA\inspectnextoptionalcharacterindeed
+ \fi}
+\def\inspectnextoptionalcharacterindeed
+ {\ifx\nexttoken\nextoptionalcharactertoken
+ \@EA\nextoptionalcommandyes
+ \else
+ \@EA\nextoptionalcommandnop
+ \fi}
+
+\let\nextbgroupcharactertoken\bgroup
+
+\long\def\doifnextbgroupelse#1#2%
+ {\def\nextbgroupcommandyes{#1}%
+ \def\nextbgroupcommandnop{#2}%
+ \futurelet\nexttoken\inspectnextbgroupcharacter}
+\def\inspectnextbgroupcharacter
+ {\ifx\nexttoken\blankspace
+ \@EA\reinspectnextbgroupcharacter
+ \else
+ \@EA\inspectnextbgroupcharacterindeed
+ \fi}
+\def\inspectnextbgroupcharacterindeed
+ {\ifx\nexttoken\nextbgroupcharactertoken
+ \@EA\nextbgroupcommandyes
+ \else
+ \@EA\nextbgroupcommandnop
+ \fi}
+
+\let\nextparenthesischaractertoken(
+
+\long\def\doifnextparenthesiselse#1#2%
+ {\def\nextparenthesiscommandyes{#1}%
+ \def\nextparenthesiscommandnop{#2}%
+ \futurelet\nexttoken\inspectnextparenthesischaracter}
+\def\inspectnextparenthesischaracter
+ {\ifx\nexttoken\blankspace
+ \@EA\reinspectnextparenthesischaracter
+ \else
+ \@EA\inspectnextparenthesischaracterindeed
+ \fi}
+\def\inspectnextparenthesischaracterindeed
+ {\ifx\nexttoken\nextparenthesischaractertoken
+ \@EA\nextparenthesiscommandyes
+ \else
+ \@EA\nextparenthesiscommandnop
+ \fi}
+
+%D The next one is handy in predictable situations:
+
+\long\def\doiffastoptionalcheckelse#1#2%
+ {\def\nextoptionalcommandyes{#1}%
+ \def\nextoptionalcommandnop{#2}%
+ \futurelet\nexttoken\dodoiffastoptionalcheckelse}
+
+\def\dodoiffastoptionalcheckelse
+ {\ifx\nexttoken\nextoptionalcharactertoken
+ \expandafter\nextoptionalcommandyes
+ \else
+ \expandafter\nextoptionalcommandnop
+ \fi}
+
+%D This macro uses some auxiliary macros. Although we were able
+%D to program quite complicated things, I only understood these
+%D after rereading the \TEX book. The trick is in using a
+%D command with a one character name. Such commands differ from
+%D the longer ones in the fact that trailing spaces are {\em
+%D not} skipped. This enables us to indirectly define a long
+%D named macro that gobbles a space.
+%D
+%D In the first line we define \type{\blankspace}. Next we
+%D make \type{\:} equivalent to \type{\reinspect...}. This
+%D one||character command is expanded before the next
+%D \type{\def} comes into action. This way the space after
+%D \type{\:} becomes a delimiter of the longer named
+%D \type{\reinspectnextcharacter}.
+
+\let\next\:
+
+\def\:{\let\blankspace= } \:
+
+\def\:{\reinspectnextcharacter}
+\expandafter\def\: {\futurelet\nexttoken\inspectnextcharacter}
+
+\def\:{\reinspectnextoptionalcharacter}
+\expandafter\def\: {\futurelet\nexttoken\inspectnextoptionalcharacter}
+
+\def\:{\reinspectnextbgroupcharacter}
+\expandafter\def\: {\futurelet\nexttoken\inspectnextbgroupcharacter}
+
+\let\:\next
+
+%D \macros
+%D {setvalue,setgvalue,setevalue,setxvalue,
+%D letvalue,letgvalue,getvalue,resetvalue,
+%D undefinevalue,ignorevalue}
+%D
+%D \TEX's primitive \type{\csname} can be used to construct
+%D all kind of commands that cannot be defined with
+%D \type{\def} and \type{\let}. Every macro programmer sooner
+%D or later wants macros like these.
+%D
+%D \starttyping
+%D \setvalue {name}{...} = \def\name{...}
+%D \setgvalue {name}{...} = \gdef\name{...}
+%D \setevalue {name}{...} = \edef\name{...}
+%D \setxvalue {name}{...} = \xdef\name{...}
+%D \letvalue {name}=\... = \let\name=\...
+%D \letgvalue {name}=\... = \global\let\name=\...
+%D \getvalue {name} = \name
+%D \resetvalue {name} = \def\name{}
+%D \stoptyping
+%D
+%D As we will see, \CONTEXT\ uses these commands many times,
+%D which is mainly due to its object oriented and parameter
+%D driven character.
+
+\def\setvalue #1{\expandafter \def\csname#1\endcsname}
+\def\setgvalue #1{\expandafter\gdef\csname#1\endcsname}
+\def\setevalue #1{\expandafter\edef\csname#1\endcsname}
+\def\setxvalue #1{\expandafter\xdef\csname#1\endcsname}
+\def\getvalue #1{\csname#1\endcsname}
+\def\letvalue #1{\expandafter\let\csname#1\endcsname}
+\def\letgvalue #1{\global\expandafter\let\csname#1\endcsname}
+\def\resetvalue #1{\expandafter\let\csname#1\endcsname\empty}
+\def\undefinevalue#1{\expandafter\let\csname#1\endcsname\undefined}
+\def\ignorevalue#1#2{\expandafter\let\csname#1\endcsname\empty}
+
+\def\setuvalue #1{\normalprotected\expandafter \def\csname#1\endcsname}
+\def\setuevalue #1{\normalprotected\expandafter\edef\csname#1\endcsname}
+\def\setugvalue #1{\normalprotected\expandafter\gdef\csname#1\endcsname}
+\def\setuxvalue #1{\normalprotected\expandafter\xdef\csname#1\endcsname}
+
+%D \macros
+%D {globallet,glet}
+%D
+%D In \CONTEXT\ of May 2000 using \type {\globallet}
+%D instead of the two tokens will save us some
+%D $300\times4=1200$ bytes of format file on a 32~bit
+%D system. So:
+
+\def\globallet{\global\let} \let\glet\globallet
+
+%D \macros
+%D {unexpanded}
+%D
+%D Because we use this module only in \MKIV, we have removed the
+%D old protection code.
+%D
+%D \starttyping
+%D \unexpanded\def\somecommand{... ... ...}
+%D \stoptyping
+%D
+%D This overloads the \ETEX\ primitive but as we already had an \MKII\
+%D solution we keep the same name for a similar mechanism.
+
+\let\unexpanded\normalprotected
+
+%D \macros
+%D {doifundefined,doifdefined,
+%D doifundefinedelse,doifdefinedelse,
+%D doifalldefinedelse}
+%D
+%D The standard way of testing if a macro is defined is
+%D comparing its meaning with another undefined one, usually
+%D \type{\undefined}. To garantee correct working of the next
+%D set of macros, \type{\undefined} may never be defined!
+%D
+%D \starttyping
+%D \doifundefined {string} {...}
+%D \doifdefined {string} {...}
+%D \doifundefinedelse {string} {then ...} {else ...}
+%D \doifdefinedelse {string} {then ...} {else ...}
+%D \doifalldefinedelse {commalist} {then ...} {else ...}
+%D \stoptyping
+%D
+%D Every macroname that \TEX\ builds gets an entry in the hash
+%D table, which is of limited size. It is expected that e-\TeX\
+%D will offer a less memory||consuming alternative.
+
+%D Although it will probably never be a big problem, it is good
+%D to be aware of the difference between testing on a macro
+%D name to be build by using \type{\csname} and
+%D \type{\endcsname} and testing the \type{\name} directly.
+%D
+%D \starttyping
+%D \expandafter\ifx\csname NameA\endcsname\relax ... \else ... \fi
+%D
+%D \ifundefined\NameB ... \else ... \fi
+%D \stoptyping
+
+\def\ifundefined#1% ongelukkige naam .. obsolete
+ {\unless\ifcsname#1\endcsname}
+
+% \def\p!doifundefined#1%
+% {\edef\p!defined{#1}%
+% \unless\ifcsname\detokenize\@EA{\p!defined}\endcsname}
+
+% \def\doifundefinedelse#1%
+% {\edef\p!defined{#1}%
+% \ifcsname\detokenize\@EA{\p!defined}\endcsname
+% \expandafter\secondoftwoarguments
+% \else
+% \expandafter\firstoftwoarguments
+% \fi}
+
+% \def\doifdefinedelse#1%
+% {\edef\p!defined{#1}%
+% \ifcsname\detokenize\@EA{\p!defined}\endcsname
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+
+% \def\doifundefined#1%
+% {\edef\p!defined{#1}%
+% \ifcsname\detokenize\@EA{\p!defined}\endcsname
+% \expandafter\gobbleoneargument
+% \else
+% \expandafter\firstofoneargument
+% \fi}
+
+% \def\doifdefined#1%
+% {\edef\p!defined{#1}%
+% \ifcsname\detokenize\@EA{\p!defined}\endcsname
+% \expandafter\firstofoneargument
+% \else
+% \expandafter\gobbleoneargument
+% \fi}
+
+\ifdefined\suppressifcsnameerror
+
+ \suppressifcsnameerror\plusone
+
+ \def\doifundefinedelse#1%
+ {\ifcsname#1\endcsname
+ \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments
+ \fi}
+
+ \def\doifdefinedelse#1%
+ {\ifcsname#1\endcsname
+ \@EA\firstoftwoarguments\else\@EA\secondoftwoarguments
+ \fi}
+
+ \def\doifundefined#1%
+ {\ifcsname#1\endcsname
+ \@EA\gobbleoneargument\else\@EA\firstofoneargument
+ \fi}
+
+ \def\doifdefined#1%
+ {\ifcsname#1\endcsname
+ \@EA\firstofoneargument\else\@EA\gobbleoneargument
+ \fi}
+
+\else
+
+ \def\doifundefinedelse#1%
+ {\ifcsname\detokenize\@EA{\normalexpanded{#1}}\endcsname
+ \@EA\secondoftwoarguments\else\@EA\firstoftwoarguments
+ \fi}
+
+ \def\doifdefinedelse#1%
+ {\ifcsname\detokenize\@EA{\normalexpanded{#1}}\endcsname
+ \@EA\firstoftwoarguments\else\@EA\secondoftwoarguments
+ \fi}
+
+ \def\doifundefined#1%
+ {\ifcsname\detokenize\@EA{\normalexpanded{#1}}\endcsname
+ \@EA\gobbleoneargument\else\@EA\firstofoneargument
+ \fi}
+
+ \def\doifdefined#1%
+ {\ifcsname\detokenize\@EA{\normalexpanded{#1}}\endcsname
+ \@EA\firstofoneargument\else\@EA\gobbleoneargument
+ \fi}
+
+\fi
+
+%D \macros
+%D {letbeundefined}
+%D
+%D Testing for being undefined comes down to testing on \type
+%D {\relax} when we use \type {\csname}, but when using \type
+%D {\ifx}, we test on being \type {\undefined}! In \ETEX\ we
+%D have \type {\ifcsname} and that way of testing on existance
+%D is not the same as the one described here. Therefore we
+%D introduce:
+
+\def\letbeundefined#1% potential stack buildup when used \global
+ {\expandafter\let\csname#1\endcsname\undefined}
+
+\def\localundefine#1% conditional
+ {\ifcsname#1\endcsname\expandafter\let\csname#1\endcsname\undefined\fi}
+
+\def\globalundefine#1% conditional
+ {\ifcsname#1\endcsname\expandafter\global\let\csname#1\endcsname\undefined\fi}
+
+%D Beware, being \type {\undefined} in \ETEX\ means that the macro
+%D {\em is} defined!
+
+%D When we were developing the scientific units module, we
+%D encountered different behavior in text and math mode, which
+%D was due to this grouping subtilities. We therefore decided
+%D to use \type{\begingroup} instead of \type{\bgroup}.
+
+\def\docheckonedefined#1%
+ {\ifcsname#1\endcsname\else
+ \donefalse
+ \expandafter\quitcommalist % added
+ \fi}
+
+\def\doifalldefinedelse#1%
+ {\begingroup
+ \donetrue \processcommalist[#1]\docheckonedefined
+ \ifdone
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doif,doifelse,doifnot}
+%D
+%D Programming in \TEX\ differs from programming in procedural
+%D languages like \MODULA. This means that one --- well, let me
+%D speek for myself --- tries to do the things in the well
+%D known way. Therefore the next set of \type{\ifthenelse}
+%D commands were between the first ones we needed. A few years
+%D later, the opposite became true: when programming in
+%D \MODULA, I sometimes miss handy things like grouping,
+%D runtime redefinition, expansion etc. While \MODULA\ taught
+%D me to structure, \TEX\ taught me to think recursive.
+%D
+%D \starttyping
+%D \doif {string1} {string2} {...}
+%D \doifnot {string1} {string2} {...}
+%D \doifelse {string1} {string2} {then ...}{else ...}
+%D \stoptyping
+
+\long\def\doif#1#2%
+ {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifnot#1#2%
+ {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelse#1#2%
+ {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifempty,doifemptyelse,doifnotempty}
+%D
+%D We complete our set of conditionals with:
+%D
+%D \starttyping
+%D \doifempty {string} {...}
+%D \doifnotempty {string} {...}
+%D \doifemptyelse {string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This time, the string is not expanded.
+
+\long\def\doifemptyelse#1%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\long\def\doifempty#1%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifnotempty#1%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {doifinset,doifnotinset,doifinsetelse}
+%D
+%D We can check if a string is present in a comma separated
+%D set of strings. Depending on the result, some action is
+%D taken.
+%D
+%D \starttyping
+%D \doifinset {string} {string,...} {...}
+%D \doifnotinset {string} {string,...} {...}
+%D \doifinsetelse {string} {string,...} {then ...} {else ...}
+%D \stoptyping
+
+% !0nop=\doifinsetelse{ccc}{,}{yes}{nop}
+% !0nop=\doifinsetelse{ccc}{,,}{yes}{nop}
+% !0nop=\doifinsetelse{ccc}{,,,}{yes}{nop}
+
+% !1nop=\doifinsetelse{}{}{yes}{nop}
+% !2yes=\doifinsetelse{aaa}{bbb,ccc,ddd,aaa,eee}{yes}{nop}
+% !3nop=\doifinsetelse{aaa}{bbb}{yes}{nop}
+% !4yes=\doifinsetelse{aaa}{aaa}{yes}{nop}
+% !5nop=\doifinsetelse{aaaa}{bbb,ccc,ddd,aaa,eee}{yes}{nop}
+% !6nop=\doifinsetelse{}{}{yes}{nop}
+% !7nop=\doifinsetelse{}{aaa}{yes}{nop}
+% !8nop=\doifinsetelse{aaa}{}{yes}{nop}
+
+% !1=\doifinset{}{}{yes}
+% !2yes=\doifinset{aaa}{bbb,ccc,ddd,aaa,eee}{yes}
+% !3=\doifinset{aaa}{bbb}{yes}
+% !4yes=\doifinset{aaa}{aaa}{yes}
+% !5=\doifinset{}{}{yes}
+% !6=\doifinset{aaa}{}{yes}
+
+% !1yes=\doifnotinset{}{}{yes}
+% !2=\doifnotinset{aaa}{bbb,ccc,ddd,aaa,eee}{yes}
+% !3yes=\doifnotinset{aaa}{bbb}{yes}
+% !4=\doifnotinset{aaa}{aaa}{yes}
+% !5yes=\doifnotinset{}{}{yes}
+% !6yes=\doifnotinset{aaa}{}{yes}
+
+\def\rightoptionalbracket{]}
+
+\long\def\doquitifiteminsetelse#1],\relax{\firstoftwoarguments}
+\long\def\doquitifiteminset #1],\relax{\firstofoneargument}
+\long\def\doquitifitemnotinset #1],\relax{\gobbleoneargument}
+
+\long\def\redoifinsetelse{\expandafter\docheckifiteminsetelse\!!stringb,],\relax}
+\long\def\redoifinset {\expandafter\docheckifiteminset \!!stringb,],\relax}
+\long\def\redoifnotinset {\expandafter\docheckifitemnotinset \!!stringb,],\relax}
+
+\long\def\doifinsetelse#1% make this two step too
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\thirdofthreearguments
+ \else
+ \expandafter\dodoifinsetelse
+ \fi}
+\long\def\dodoifinsetelse#1%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\redoifinsetelse
+ \fi}
+
+\long\def\doifinset#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbletwoarguments
+ \else
+ \expandafter\dodoifinset
+ \fi}
+\long\def\dodoifinset#1%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\redoifinset
+ \fi}
+
+\long\def\doifnotinset#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\dodoifnotinset
+ \fi}
+\long\def\dodoifnotinset#1%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\redoifnotinset % ...]{true}
+ \fi}
+
+\def\docheckifiteminsetelse#1,#2% #2 eats up preceding space
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\empty
+ \expandafter\docheckifiteminsetelse
+ \else
+ \expandafter\dodocheckifiteminsetelse
+ \fi#2}
+\def\dodocheckifiteminsetelse
+ {\ifx\!!stringb\rightoptionalbracket
+ \expandafter\thirdofthreearguments
+ \else
+ \expandafter\dododocheckifiteminsetelse
+ \fi}
+\def\dododocheckifiteminsetelse
+ {\ifx\!!stringa\!!stringb
+ \expandafter\doquitifiteminsetelse
+ \else
+ \expandafter\docheckifiteminsetelse
+ \fi}
+
+\def\docheckifiteminset#1,#2% #2 eats up preceding space
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\empty
+ \expandafter\docheckifiteminset
+ \else
+ \expandafter\dodocheckifiteminset
+ \fi#2}
+\def\dodocheckifiteminset
+ {\ifx\!!stringb\rightoptionalbracket
+ \expandafter\gobbletwoarguments
+ \else
+ \expandafter\dododocheckifiteminset
+ \fi}
+\def\dododocheckifiteminset
+ {\ifx\!!stringa\!!stringb
+ \expandafter\doquitifiteminset
+ \else
+ \expandafter\docheckifiteminset
+ \fi}
+
+\def\docheckifitemnotinset#1,#2% #2 eats up preceding space
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\empty
+ \expandafter\docheckifitemnotinset
+ \else
+ \expandafter\dodocheckifitemnotinset
+ \fi#2}
+\def\dodocheckifitemnotinset
+ {\ifx\!!stringb\rightoptionalbracket
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\dododocheckifitemnotinset
+ \fi}
+\def\dododocheckifitemnotinset
+ {\ifx\!!stringa\!!stringb
+ \expandafter\doquitifitemnotinset
+ \else
+ \expandafter\docheckifitemnotinset
+ \fi}
+
+%D \macros
+%D {doifcommon,doifnotcommon,doifcommonelse}
+%D
+%D Probably the most time consuming tests are those that test
+%D for overlap in sets of strings.
+%D
+%D \starttyping
+%D \doifcommon {string,...} {string,...} {...}
+%D \doifnotcommon {string,...} {string,...} {...}
+%D \doifcommonelse {string,...} {string,...} {then ...} {else ...}
+%D \stoptyping
+
+% !1yes=\doifcommonelse{aaa,bbb,ccc}{aaa,bbb,ccc}{yes}{nop}
+% !2nop=\doifcommonelse{aaa,bbb,ccc}{ddd,eee,fff}{yes}{nop}
+% !3nop=\doifcommonelse{aaa}{ddd,eee,fff}{yes}{nop}
+% !4yes=\doifcommonelse{aaa}{aaa}{yes}{nop}
+% !5nop=\doifcommonelse{bbb}{aaa}{yes}{nop}
+% !6nop=\doifcommonelse{}{aaa,bbb,ccc}{yes}{nop}
+% !7nop=\doifcommonelse{aaa,bbb,ccc}{}{yes}{nop}
+% !8nop=\doifcommonelse{}{}{yes}{nop}
+
+% !9nop=\doifcommonelse{,,}{,,}{yes}{nop}
+% !9yes=\doifcommonelse{,a,}{,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,,a,}{,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,a,}{,,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,a,}{,,,a,}{yes}{nop}
+% !9yes=\doifcommonelse{,,a,}{,,,a,}{yes}{nop}
+
+% \def\p!doifcommonelse#1#2#3#4%
+% {\donefalse
+% \def\p!docommoncheck##1{\doifinset{##1}{#4}\donetrue\ifdone\quitcommalist\fi}%
+% \processcommalist[#3]\p!docommoncheck
+% \ifdone\expandafter#1\else\expandafter#2\fi}
+%
+% \def\doifcommonelse
+% {\p!doifcommonelse\firstoftwoarguments\secondoftwoarguments}
+%
+% \def\doifcommon
+% {\p!doifcommonelse\firstofoneargument \gobbleoneargument}
+%
+% \def\doifnotcommon
+% {\p!doifcommonelse\gobbleoneargument \firstofoneargument}
+
+\long\def\doquitifcommonelse#1],\relax#2],\relax{\firstoftwoarguments}
+
+\long\def\doquitifcommonelsenop{\secondoftwoarguments}
+
+\def\docheckifcommonelseone#1,#2%
+ {\edef\!!stringc{#1}%
+ \ifx\!!stringc\rightoptionalbracket
+ \expandafter\thirdofthreearguments
+ \else
+ \expandafter\p!docommoncheck
+ \fi#2}
+
+\def\docheckifcommonelsetwo#1,#2% we can do an empty #1 check too
+ {\edef\commalistelement{#1}%
+ \ifx\commalistelement\rightoptionalbracket
+ \expandafter\redocheckifcommonelseone
+ \else
+ \expandafter\dodocheckifcommonelsetwo
+ \fi#2}
+
+\def\dodocheckifcommonelsetwo
+ {\ifx\commalistelement\empty
+ \expandafter\docheckifcommonelsetwo
+ \else
+ \expandafter\dododocheckifcommonelsetwo
+ \fi}
+
+\def\dododocheckifcommonelsetwo
+ {\ifx\!!stringc\commalistelement
+ \expandafter\doquitifcommonelse
+ \else
+ \expandafter\docheckifcommonelsetwo
+ \fi}
+
+\def\redocheckifcommonelseone#1{\docheckifcommonelseone}
+
+\def\p!doifcommonelse#1#2#3#4%
+ {\edef\!!stringa{#3}%
+ \edef\!!stringb{#4}%
+ \ifx\!!stringa\empty
+ \expandafter\secondoftwoarguments
+ \else\ifx\!!stringb\empty
+ \expandafter\expandafter\expandafter\secondoftwoarguments
+ \else
+ \expandafter\expandafter\expandafter\pp!doifcommonelse
+ \fi\fi
+ #1#2}
+
+% \def\p!doifcommonelse#1#2#3%
+% {\edef\!!stringa{#3}%
+% \ifx\!!stringa\empty
+% \expandafter\secondofthreearguments
+% \else
+% \expandafter\p!dodoifcommonelse
+% \fi
+% #1#2} % #4
+
+% \def\p!dodoifcommonelse#1#2#3%
+% {\edef\!!stringb{#3}%
+% \ifx\!!stringb\empty
+% \expandafter\secondoftwoarguments
+% \else
+% \expandafter\pp!doifcommonelse
+% \fi#1#2}
+
+\def\pp!doifcommonelse
+ {\def\p!docommoncheck{\expandafter\docheckifcommonelsetwo\!!stringb,],\relax}%
+ \expandafter\docheckifcommonelseone\!!stringa,],\relax}
+
+\def\doifcommonelse{\p!doifcommonelse\firstoftwoarguments\secondoftwoarguments}
+\def\doifcommon {\p!doifcommonelse\firstofoneargument \gobbleoneargument }
+\def\doifnotcommon {\p!doifcommonelse\gobbleoneargument \firstofoneargument }
+
+%D \macros
+%D {processcommalist,processcommacommand,quitcommalist,
+%D processcommalistwithparameters}
+%D
+%D We've already seen some macros that take care of comma
+%D separated lists. Such list can be processed with
+%D
+%D \starttyping
+%D \processcommalist[string,string,...]\commando
+%D \stoptyping
+%D
+%D The user supplied command \type{\commando} receives one
+%D argument: the string. This command permits nesting and
+%D spaces after commas are skipped. Empty sets are no problem.
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1)}
+%D
+%D 1: \processcommalist [\hbox{$a,b,c,d,e,f$}] \dosomething \par
+%D 2: \processcommalist [{a,b,c,d,e,f}] \dosomething \par
+%D 3: \processcommalist [{a,b,c},d,e,f] \dosomething \par
+%D 4: \processcommalist [a,b,{c,d,e},f] \dosomething \par
+%D 5: \processcommalist [a{b,c},d,e,f] \dosomething \par
+%D 6: \processcommalist [{a,b}c,d,e,f] \dosomething \par
+%D 7: \processcommalist [] \dosomething \par
+%D 8: \processcommalist [{[}] \dosomething \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Before we show the result, we present the macro's:
+
+\newcount\commalevel
+
+\def\dododoprocesscommaitem
+ {\csname\s!next\the\commalevel\endcsname}
+
+% \def\dodoprocesscommaitem
+% {\ifx\nexttoken\blankspace
+% \@EA\redoprocesscommaitem
+% \else\ifx\nexttoken]%
+% \@EAEAEA\gobbleoneargument
+% \else
+% \@EAEAEA\dododoprocesscommaitem
+% \fi\fi}
+
+\def\dodoprocesscommaitem
+ {\ifx\nexttoken\blankspace
+ \@EA\redoprocesscommaitem
+ \else
+ \@EA\dodoprocesscommaitemindeed
+ \fi}
+\def\dodoprocesscommaitemindeed
+ {\ifx\nexttoken]%
+ \@EA\gobbleoneargument
+ \else
+ \@EA\dododoprocesscommaitem
+ \fi}
+
+\def\doprocesscommaitem
+ {\futurelet\nexttoken\dodoprocesscommaitem}
+
+%D Empty arguments are not processed. Empty items (\type{,,})
+%D however are treated. We have to check for the special case
+%D \type{[{a,b,c}]}.
+
+\def\processcommalist[%
+ {\futurelet\nexttoken\docheckcommaitem}
+
+\def\docheckcommaitem
+ {\ifx\nexttoken]%
+ \expandafter\gobblethreearguments
+ \else
+ \expandafter\doprocesscommalist
+ \fi
+ \relax} % this one preserved the next {}
+
+\def\doprocesscommalist#1]#2%
+ {\global\advance\commalevel \plusone
+ \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,%
+ {#2{##1}\doprocesscommaitem}%
+ \@EA\dodoprocesscommaitem\gobbleoneargument#1,]\relax
+ \global\advance\commalevel \minusone }
+
+%D One way of quitting a commalist halfway is:
+
+\def\quitcommalist
+ {\begingroup\let\doprocesscommaitem\doquitcommalist}
+
+\def\doquitcommalist#1]%
+ {\endgroup}
+
+\def\quitprevcommalist
+ {\begingroup\let\doprocesscommaitem\doquitprevcommalist}
+
+\def\doquitprevcommalist#1]%
+ {\let\doprocesscommaitem\doquitcommalist}
+
+%D The hack we used for checking the next character
+%D \type {\doifnextcharelse} is also used here.
+
+\def\:{\redoprocesscommaitem}
+
+\expandafter\def\: {\futurelet\nexttoken\dodoprocesscommaitem}
+
+%D The previous examples lead to:
+%D
+%D \getbuffer
+
+%D When a list is saved in a macro, we can use a construction
+%D like:
+%D
+%D \starttyping
+%D \expandafter\processcommalist\expandafter[\list]\command
+%D \stoptyping
+%D
+%D Such solutions suit most situations, but we wanted a bit
+%D more.
+%D
+%D \starttyping
+%D \processcommacommand[string,\stringset,string]\commando
+%D \stoptyping
+%D
+%D where \type{\stringset} is a predefined set, like:
+%D
+%D \starttyping
+%D \def\first{aap,noot,mies}
+%D \def\second{laatste}
+%D
+%D \processcommacommand[\first]\message
+%D \processcommacommand[\first,second,third]\message
+%D \processcommacommand[\first,between,\second]\message
+%D \stoptyping
+%D
+%D Commands that are part of the list are expanded, so the
+%D use of this macro has its limits.
+
+% \def\processcommacommand[#1]%
+% {\expanded{\processcommalist[#1]}}
+
+\def\processcommacommand[#1]%
+ {\expandafter\processcommalist\expandafter[\normalexpanded{#1}]}
+
+% \def\processcommacommand[#1]%
+% {\edef\expandedcommacommand{#1%
+% \ifx\expandedcommacommand\empty\else
+% \doprocesscommacommand
+% \fi}
+%
+% \def\doprocesscommacommand
+% {\expandafter\processcommalist\expandafter[\expandedcommacommand]}
+
+%D The argument to \type{\command} is not delimited. Because
+%D we often use \type{[]} as delimiters, we also have:
+%D
+%D \starttyping
+%D \processcommalistwithparameters[string,string,...]\command
+%D \stoptyping
+%D
+%D where \type{\command} looks like:
+%D
+%D \starttyping
+%D \def\command[#1]{... #1 ...}
+%D \stoptyping
+
+\def\processcommalistwithparameters[#1]#2%
+ {\def\docommand##1{#2[##1]}%
+ \processcommalist[#1]\docommand}
+
+%D \macros
+%D {startprocesscommalist,startprocesscommacommand}
+%D
+%D Two more:
+
+\long\unexpanded\def\startprocesscommalist[#1]#2\stopprocesscommalist
+ {\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}%
+ \processcommalist[#1]\currentcommalistcommand}
+
+\long\unexpanded\def\startprocesscommacommand[#1]#2\stopprocesscommacommand
+ {\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}%
+ \normalexpanded{\noexpand\processcommacommand[#1]}\currentcommalistcommand}
+
+%D \macros
+%D {processaction,
+%D processfirstactioninset,
+%D processallactionsinset}
+%D
+%D \CONTEXT\ makes extensive use of a sort of case or switch
+%D command. Depending of the presence of one or more provided
+%D items, some actions is taken. These macros can be nested
+%D without problems.
+%D
+%D \starttyping
+%D \processaction [x] [a=>\a,b=>\b,c=>\c]
+%D \processfirstactioninset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \processallactionsinset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \stoptyping
+%D
+%D We can supply both a \type{default} action and an action
+%D to be undertaken when an \type{unknown} value is met:
+%D
+%D \starttyping
+%D \processallactionsinset
+%D [x,y,z]
+%D [ a=>\a,
+%D b=>\b,
+%D c=>\c,
+%D default=>\default,
+%D unknown=>\unknown{... \commalistelement ...}]
+%D \stoptyping
+%D
+%D When \type{#1} is empty, this macro scans list \type{#2} for
+%D the keyword \type{default} and executed the related action
+%D if present. When \type{#1} is non empty and not in the list,
+%D the action related to \type{unknown} is executed. Both
+%D keywords must be at the end of list \type{#2}. Afterwards,
+%D the actually found keyword is available in
+%D \type{\commalistelement}. An advanced example of the use of
+%D this macro can be found in \PPCHTEX, where we completely
+%D rely on \TEX\ for interpreting user supplied keywords like
+%D \type{SB}, \type{SB1..6}, \type{SB125} etc.
+
+\newcount\processlevel
+
+\def\p!compareprocessactionA[#1=>#2][#3]%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\s!default
+ \let\commalistelement\empty
+ #2%
+ \fi}
+
+% met \quitcommalist tot meer dan 25\% sneller
+
+\def\p!compareprocessactionB[#1=>#2][#3]%
+ {\expandedaction\!!stringb{#1}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitcommalist
+ \else
+ \edef\!!stringb{#1}%
+ \ifx\!!stringb\s!unknown
+ \def\commalistelement{#3}% beware of loops
+ #2%
+ \fi
+ \fi}
+
+\def\processaction[#1]#2[%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \let\p!compareprocessaction\p!compareprocessactionA
+ \else
+ \let\p!compareprocessaction\p!compareprocessactionB
+ \fi
+ \def\p!doprocessaction##1%
+ {\p!compareprocessaction[##1][#1]}%
+ \processnextcommalist\relax\expandactions\p!doprocessaction[}
+
+\def\p!compareprocessactionC[#1=>#2][#3]%
+ {\expandedaction\!!stringa{#1}%
+ \expandedaction\!!stringb{#3}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitprevcommalist
+ \else
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\def\processfirstactioninset[#1]%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\processaction
+ \else
+ \expandafter\processfirstactionsinsetindeed
+ \fi
+ [#1]}
+
+\def\processfirstactionsinsetindeed[#1]#2[#3]%
+ {\def\p!doprocessaction##1%
+ {\def\p!dodoprocessaction####1%
+ {\p!compareprocessactionC[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]\p!doprocessaction
+ \expandactions}
+
+\def\p!compareprocessactionD[#1=>#2][#3]%
+ {\expandedaction\!!stringa{#1}%
+ \expandedaction\!!stringb{#3}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitcommalist
+ \else
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\def\doprocessallactionsinset
+ {\csname\s!do\the\processlevel\endcsname}
+
+\def\processallactionsinset[#1]%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\processaction
+ \else
+ \expandafter\processallactionsinsetindeed
+ \fi
+ [#1]}
+
+\def\processallactionsinsetindeed[#1]#2[#3]%
+ {\advance\processlevel \plusone
+ \expandafter\def\csname\s!do\the\processlevel\endcsname##1%
+ {\def\p!dodoprocessaction####1%
+ {\p!compareprocessactionD[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]\doprocessallactionsinset
+ \advance\processlevel \minusone
+ \expandactions}
+
+%D These macros use:
+
+\def\processnextcommalist#1#2#3[#4#5]%
+ {#1%
+ \let\nexttoken#4%
+ \global\advance\commalevel \plusone
+ \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,%
+ {#3{##1}\doprocesscommaitem}%
+ \dodoprocesscommaitem#4#5,]\relax
+ \global\advance\commalevel \minusone
+ #2}
+
+%D \macros
+%D {unexpandedprocessaction,
+%D unexpandedprocessfirstactioninset,
+%D unexpandedprocessallactionsinset}
+%D
+%D Now what are those expansion commands doing there. Well,
+%D sometimes we want to compare actions that may consist off
+%D commands (i.e. are no constants). In such occasions we can
+%D use the a bit slower alternatives:
+
+\def\unexpandedprocessfirstactioninset{\dontexpandactions\processfirstactioninset}
+\def\unexpandedprocessaction {\dontexpandactions\processaction}
+\def\unexpandedprocessallactionsinset {\dontexpandactions\processallactionsinset}
+
+%D By default we expand actions:
+
+\def\expandactions{\let\expandedaction\edef} \expandactions
+
+%D But when needed we convert the strings to meaningful
+%D sequences of characters.
+
+\def\unexpandedaction#1>{}
+
+\def\noexpandedaction#1#2%
+ {\def\@@convertedargument{#2}%
+ \@EA\edef\@EA#1\@EA{\@EA\unexpandedaction\meaning\@@convertedargument}}
+
+\def\dontexpandactions
+ {\let\expandedaction\noexpandedaction}
+
+%D \macros
+%D {getfirstcharacter, firstcharacter, remainingcharacters, doiffirstcharacter}
+%D
+%D Sometimes the action to be undertaken depends on the
+%D next character. This macro get this character and puts it in
+%D \type{\firstcharacter}.
+%D
+%D \starttyping
+%D \getfirstcharacter {string}
+%D \stoptyping
+%D
+%D A two step expansion is used to prevent problems with
+%D complicated arguments, for instance arguments that
+%D consist of two or more expandable tokens.
+
+\def\dogetfirstcharacter#1#2\relax
+ {\def\firstcharacter{#1}%
+ \def\remainingcharacters{#2}}
+
+\def\getfirstcharacter#1%
+ {\edef\!!stringa{#1}%
+ \expandafter\dogetfirstcharacter\!!stringa\relax}
+
+\def\doiffirstcharelse#1#2% char string
+% kort (maar onleesbaar)
+% {\expanded{\dogetfirstcharacter#2}\\\doifelse{#1}\firstcharacter}
+% korter (en begrijpelijk))
+ {\getfirstcharacter{#2}\doifelse{#1}\firstcharacter}
+% snel (maar zelden gebruikt, dus niet zo belangrijk)
+% {\getfirstcharacter{#2}%
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\firstcharacter
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+
+%D \macros
+%D {doifinstringelse, doifincsnameelse}
+%D
+%D We can check for the presence of a substring in a given
+%D sequence of characters.
+%D
+%D \starttyping
+%D \doifinsetelse {substring} {string} {then ...} {else ...}
+%D \stoptyping
+
+\long\def\doifinstringelse#1%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\thirdofthreearguments
+ \else
+ \@EA\dodoifinstringelse
+ \fi}
+
+\long\def\dodoifinstringelse#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\long\def\doifinstring#1%%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\gobbletwoarguments
+ \else
+ \@EA\dodoifinstring
+ \fi}
+
+\long\def\dodoifinstring#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
+ \fi}
+
+\long\def\doifnotinstring#1%%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\gobbletwoarguments
+ \else
+ \@EA\dodoifnotinstring
+ \fi}
+
+\long\def\dodoifnotinstring#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\gobbleoneargument
+ \else
+ \@EA\firstofoneargument
+ \fi}
+
+% replaces prev
+
+% \long\def\p!doifinstringelse#1#2% ##2 can be {abc}
+% {\long\@EA\def\@EA\pp!doifinstringelse\@EA##\@EA1#1##2##3\war{\unless\if##2@}% expand #1 here
+% \expanded{\pp!doifinstringelse#2#1}@@\war} % expand #2 here
+
+\long\def\p!doifinstringelse#1#2% ##2 can be {abc}
+ {\long\@EA\def\@EA\pp!doifinstringelse\@EA##\@EA1#1##2##3\war{\unless\if##2@}% expand #1 here
+ \expandafter\pp!doifinstringelse\normalexpanded{#2#1}@@\war} % expand #2 here
+
+% faster but at some costs
+%
+% \def\setp!doifinstringelse#1#2% ##2 can be {abc}
+% {\long\expandafter\gdef\csname @diie:#1\@EA\endcsname\@EA##\@EA1#1##2##3\war{\unless\if##2@}}% expand #1 here
+%
+% \long\def\p!doifinstringelse#1#2% ##2 can be {abc}
+% {\ifcsname @diie:#1\endcsname \else
+% \setp!doifinstringelse{#1}{#2}%
+% \fi
+% \csname @diie:#1\expandafter\endcsname\normalexpanded{#2#1}@@\war} % expand #2 here
+
+%D The next alternative proved to be upto twice as fast on
+%D tasks like checking reserved words in pretty verbatim
+%D typesetting! This is mainly due to the fact that passing
+%D (expanded) strings is much slower that passing a macro.
+%D
+%D \starttyping
+%D \doifincsnameelse {substring} {\string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D Where \type{\doifinstringelse} does as much expansion as
+%D possible, the latter alternative does minimal (one level)
+%D expansion.
+
+\long\def\p!doifincsnameelse#1#2%
+ {\long\def\pp!doifincsnameelse##1#1##2##3\war
+ {\unless\if##2@}%
+ \@EA\pp!doifincsnameelse#2#1@@\war}
+
+\long\def\doifincsnameelse#1#2% % #3#4%
+ {\edef\@@@instring{#1}%
+ \@EA\p!doifincsnameelse\@EA{\@@@instring}{#2}% % #3\else#4\fi}
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifnumberelse}
+%D
+%D The next macro executes a command depending of the outcome
+%D of a test on numerals. This is probably one of the fastest
+%D test possible, exept from a less robust 10||step
+%D \type{\if}||ladder or some tricky \type{\lcode} checking.
+%D
+%D \starttyping
+%D \doifnumberelse {string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D The macro accepts \type{123}, \type{abc}, \type{{}},
+%D \type{\getal} and \type{\the\count...}. This macro is a
+%D rather dirty one.
+
+\long\def\doifnumberelse#1% does not accept counters
+ {\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {makerawcommalist,
+%D rawdoinsetelse,
+%D rawprocesscommalist,
+%D rawprocessaction}
+%D
+%D Some of the commands mentioned earlier are effective but
+%D slow. When one is desperately in need of faster alternatives
+%D and when the conditions are predictable safe, the \type{\raw}
+%D alternatives come into focus. A major drawback is that
+%D they do not take \type{\c!constants} into account, simply
+%D because no expansion is done. This is no problem with
+%D \type{\rawprocesscommalist}, because this macro does not
+%D compare anything. Expandable macros are permitted as search
+%D string.
+%D
+%D \starttyping
+%D \makerawcommalist[string,string,...]\stringlist
+%D \rawdoifinsetelse{string}{string,...}{...}{...}
+%D \rawprocesscommalist[string,string,...]\commando
+%D \rawprocessaction[x][a=>\a,b=>\b,c=>\c]
+%D \stoptyping
+%D
+%D Spaces embedded in the list, for instance after commas,
+%D spoil the search process. The gain in speed depends on the
+%D length of the argument (the longer the argument, the less
+%D we gain).
+
+\def\makerawcommalist[#1]#2% use \processnext ... here
+ {\def\domakerawcommalist##1% we don't expand ##1
+ {\ifx#2\empty
+ \def#2{##1}%
+ \else
+ \@EA\def\@EA#2\@EA{#2,##1}%
+ \fi}%
+ \let#2\empty
+ \processcommalist[#1]\domakerawcommalist}
+
+\def\rawprocesscommaitem#1,#2% #2 eats up preceding space
+ {\if]#1\else
+ \csname\s!next\the\commalevel\endcsname{#1}%
+ \expandafter\rawprocesscommaitem
+ \fi#2}
+
+\unexpanded\def\rawprocesscommalist[#1]#2% accepteert ook [\cs]
+ {\global\advance\commalevel \plusone
+ \expandafter\let\csname\s!next\the\commalevel\endcsname#2%
+ \expandafter\rawprocesscommaitem#1,],% \relax
+ \global\advance\commalevel \minusone }
+
+\def\rawprocesscommacommand[#1]% not really needed
+ {\normalexpanded{\rawprocesscommalist[#1]}}
+
+% \def\rawdoifinsetelse#1#2{\doifinstringelse{,#1,}{,#2,}}
+% \def\rawdoifinset #1#2{\doifinstring {,#1,}{,#2,}}
+
+\def\@@rawempty{,,}
+
+\long\def\rawdoifinsetelse#1%
+ {\edef\@@@instring{,#1,}% expand #1 here
+ \ifx\@@@instring\@@rawempty
+ \@EA\thirdofthreearguments
+ \else
+ \@EA\rawdodoifinsetelse
+ \fi}
+
+\long\def\rawdodoifinsetelse#1%
+ {\p!doifinstringelse\@@@instring{,#1,}%
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\long\def\rawdoifinset#1%
+ {\edef\@@@instring{,#1,}% expand #1 here
+ \ifx\@@@instring\@@rawempty
+ \@EA\gobbletwoarguments
+ \else
+ \@EA\rawdodoifinset
+ \fi}
+
+\long\def\rawdodoifinset#1%%
+ {\p!doifinstringelse\@@@instring{,#1,}%
+ \@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
+ \fi}
+
+%D Some more raw material:
+
+\def\p!rawprocessaction[#1][#2]%
+ {\def\pp!rawprocessaction##1,#1=>##2,##3\war%
+ {\if##3@\else
+ \def\!!processaction{##2}%
+ \fi}%
+ \pp!rawprocessaction,#2,#1=>,@\war}
+
+\def\rawprocessaction[#1]#2[#3]%
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{undefined}% better \!!undefined
+ \let\!!processaction\!!stringb
+ \ifx\!!stringa\empty
+ \@EA\p!rawprocessaction\@EA[\s!default][#3]%
+ \else
+ \expandafter\p!rawprocessaction\expandafter[\!!stringa][#3]%
+ \ifx\!!processaction\!!stringb
+ \@EA\p!rawprocessaction\@EA[\s!unknown][#3]%
+ \fi
+ \fi
+ \ifx\!!processaction\!!stringb
+ \else
+ \!!processaction
+ \fi}
+
+%D When we process the list \type{a,b,c,d,e}, the raw routine
+%D takes over 30\% less time, when we feed $20+$ character
+%D strings we gain about 20\%. Alternatives which use
+%D \type{\futurelet} perform worse. Part of the speedup is
+%D due to the \type{\let} and \type{\expandafter} in the test.
+
+%D \macros
+%D {dosetvalue,dosetevalue,dosetgvalue,docopyvalue,doresetvalue,
+%D dogetvalue}
+%D
+%D When we are going to do assignments, we have to take
+%D multi||linguality into account. For the moment we keep
+%D things simple and single||lingual.
+%D
+%D \starttyping
+%D \dosetvalue {label} {variable} {value}
+%D \dosetevalue {label} {variable} {value}
+%D \dosetgvalue {label} {variable} {value}
+%D \docopyvalue {to label} {from label} {variable}
+%D \doresetvalue {label} {variable}
+%D \stoptyping
+%D
+%D These macros are in fact auxiliary ones and are not meant
+%D for use outside the assignment macros.
+
+\def\dosetvalue#1#2% #3
+ {\@EA\def\csname#1#2\endcsname} % {#3}}
+
+\def\dosetevalue#1#2% #3
+ {\@EA\edef\csname#1#2\endcsname} % {#3}}
+
+\def\dosetgvalue#1#2% #3
+ {\@EA\gdef\csname#1#2\endcsname} % {#3}}
+
+\def\doresetvalue#1#2%
+ {\@EA\let\csname#1#2\endcsname\empty}
+
+\def\doignorevalue#1#2#3%
+ {\@EA\let\csname#1#2\endcsname\empty}
+
+\def\docopyvalue#1#2#3%
+ {\@EA\def\csname#1#3\endcsname{\csname#2#3\endcsname}}
+
+%D \macros
+%D {doassign,undoassign,doassignempty}
+%D
+%D Assignments are the backbone of \CONTEXT. Abhorred by the
+%D concept of style file hacking, we took a considerable effort
+%D in building a parameterized system. Unfortunately there is a
+%D price to pay in terms of speed. Compared to other packages
+%D and taking the functionality of \CONTEXT\ into account, the
+%D total size of the format file is still very acceptable. Now
+%D how are these assignments done.
+%D
+%D Assignments can be realized with:
+%D
+%D \starttyping
+%D \doassign[label][variable=value]
+%D \undoassign[label][variable=value]
+%D \stoptyping
+%D
+%D and:
+%D
+%D \starttyping
+%D \doassignempty[label][variable=value]
+%D \stoptyping
+%D
+%D Assignments like \type{\doassign} are compatible with:
+%D
+%D \starttyping
+%D \def\labelvariable{value}
+%D \stoptyping
+%D
+%D We do check for the presence of an \type{=} and loudly
+%D complain of it's missed. We will redefine this macro later
+%D on, when a more advanced message mechanism is implemented.
+
+\newif\iferrorisfatal
+
+\def\waitonfatalerror
+ {\iferrorisfatal\wait\fi}
+
+\def\showassignerror#1#2%
+ {\writestatus{setup}{missing or ungrouped '=' after '#1' in line #2}%
+ \waitonfatalerror}
+
+\def\doassignempty[#1][#2=#3]%
+ {\ifcsname#1#2\endcsname\else\dosetvalue{#1}{#2}{#3}\fi}
+
+%D \macros
+%D {getparameters,geteparameters,getgparameters,
+%D forgetparameters}
+%D
+%D Using the assignment commands directly is not our
+%D ideal of user friendly interfacing, so we take some further
+%D steps.
+%D
+%D \starttyping
+%D \getparameters [label] [...=...,...=...]
+%D \forgetparameters [label] [...=...,...=...]
+%D \stoptyping
+%D
+%D Again, the label identifies the category a variable
+%D belongs to. The second argument can be a comma separated
+%D list of assignments.
+%D
+%D \starttyping
+%D \getparameters
+%D [demo]
+%D [alfa=1,
+%D beta=2]
+%D \stoptyping
+%D
+%D is equivalent to
+%D
+%D \starttyping
+%D \def\demoalfa{1}
+%D \def\demobeta{2}
+%D \stoptyping
+%D
+%D
+%D In the pre||multi||lingual stadium \CONTEXT\ took the next
+%D approach. With
+%D
+%D \starttyping
+%D \def\??demo {@@demo}
+%D \def\!!alfa {alfa}
+%D \def\!!beta {beta}
+%D \stoptyping
+%D
+%D calling
+%D
+%D \starttyping
+%D \getparameters
+%D [\??demo]
+%D [\!!alfa=1,
+%D \!!beta=2]
+%D \stoptyping
+%D
+%D lead to:
+%D
+%D \starttyping
+%D \def\@@demoalfa{1}
+%D \def\@@demobeta{2}
+%D \stoptyping
+%D
+%D Because we want to be able to distinguish the \type{!!}
+%D pre||tagged user supplied variables from internal
+%D counterparts, we will introduce a slightly different tag in
+%D the multi||lingual modules. There we will use \type{c!} or
+%D \type{v!}, depending on the context.
+%D
+%D By calling \type{\p!doassign} directly, we save ourselves
+%D some argument passing and gain some speed. Whatever
+%D optimizations we do, this command will always be one of the
+%D bigger bottlenecks.
+%D
+%D The alternative \type{\geteparameters} --- it's funny to
+%D see that this alternative saw the light so lately --- can be
+%D used to do expanded assigments.
+
+\let\currentvalue\empty
+
+\def\getparameters {\dogetparameters\dosetvalue}
+\def\geteparameters {\dogetparameters\dosetevalue}
+\def\getgparameters {\dogetparameters\dosetgvalue}
+\def\getxparameters {\dogetparameters\dosetxvalue}
+\def\forgetparameters{\dogetparameters\doignorevalue}
+
+\let\getexpandedparameters=\geteparameters
+
+\def\dogetparameters#1[#2]#3[#4%
+ {\if\noexpand#4]%
+ \expandafter\gobbleoneargument
+ \else
+ \let\setsomevalue#1%
+ \def\p!dogetparameter{\p!doassign#2}%
+ \expandafter\xdogetparameters
+ \fi#4}
+
+\def\xdogetparameters#1]%
+ {\xprocesscommaitem#1,],\@relax@}
+
+\long\def\xprocesscommaitem#1,#2% #2 takes space before ,
+ {\if,#1,% dirty trick for testing #1=empty
+ \@EA\xprocesscommaitem
+ \else\if]#1%
+ \@EAEAEA\gobbleoneargument
+ \else
+ \p!dogetparameter\@relax@#1==\empty\@relax@
+ \@EAEAEA\xprocesscommaitem
+ \fi\fi#2}
+
+\def\xshowassignerror#1#2#3%
+ {\showassignerror{#2}{\the\inputlineno\space(#1)}}
+
+\def\p!n!doassign#1\@relax@#2=#3=#4#5\@relax@
+ {\ifx\empty#2\empty
+ \@EA\xshowassignerror
+ \else\ifx#4\empty
+ \@EAEAEA\xshowassignerror
+ \else
+ \@EAEAEA\setsomevalue
+ \fi\fi
+ {#1}{#2}{#3}}
+
+\def\p!e!doassign#1\@relax@#2=#3=#4#5\@relax@
+ {\ifx\empty#2\empty
+ \@EA\xshowassignerror
+ \else\ifx#4\empty
+ \@EAEAEA\xshowassignerror
+ \else
+ \ifcsname#1#2\endcsname
+ \@EA\let\@EA\currentvalue\csname#1#2\endcsname
+ \else
+ \let\currentvalue\empty
+ \fi
+ \@EAEAEA\setsomevalue
+ \fi\fi
+ {#1}{#2}{#3}}
+
+\let\p!doassign\p!n!doassign
+
+% \def\doassign [#1][#2]{\p!doassign\dosetvalue #1\@relax@#2==\empty\@relax@}
+% \def\doeassign [#1][#2]{\p!doassign\dosetevalue #1\@relax@#2==\empty\@relax@}
+% \def\undoassign[#1][#2]{\p!doassign\doresetvalue#1\@relax@#2==\empty\@relax@}
+
+\def\doassign [#1][#2]{\let\setsomevalue\dosetvalue \p!doassign#1\@relax@#2==\empty\@relax@}
+\def\doeassign [#1][#2]{\let\setsomevalue\dosetevalue \p!doassign#1\@relax@#2==\empty\@relax@}
+\def\undoassign[#1][#2]{\let\setsomevalue\doresetvalue\p!doassign#1\@relax@#2==\empty\@relax@}
+
+%D \macros
+%D {processassignmentlist,processassignmentcommand,
+%D startprocessassignmentlist,startprocessassignmentcommand}
+%D
+%D For Wolfgang:
+%D
+%D \starttyping
+%D \def\showpair#1#2{key:#1, value:#2\par}
+%D \processassignmentlist[a=1,b=2]\showpair
+%D \stoptyping
+%D
+%D We can optimize this one if needed but it's not a core macro so hardly
+%D worth the trouble and tokens.
+
+\def\processassignmentlist[#1]#2% #2 == \command{key}{value]
+ {\def\doprocessassignmententry##1{#2}% {##2}{##3} % namespace is ignored
+ \dogetparameters\doprocessassignmententry[][#1]}
+
+\def\processassignmentcommand[#1]%
+ {\normalexpanded{\noexpand\processassignmentlist[#1]}}
+
+\long\unexpanded\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist
+ {\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
+ \processassignmentlist[#1]\currentassignmentlistcommand}
+
+\long\unexpanded\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand
+ {\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
+ \normalexpanded{\noexpand\processassignmentlist[#1]}\currentassignmentlistcommand}
+
+%D \macros{currentvalue}
+%D
+%D Just in case a \type{\getparameter} argument itself ends up
+%D inside a \type{\write} or other expandable location, our
+%D new macro needs a default value.
+%D
+%D \starttyping
+%D \getparameters[xxx][aaa=bbb]\par
+%D \getparameters[xxx][=bbb]\par
+%D \getparameters[xxx][aaa=]\par
+%D \getparameters[xxx][=]\par
+%D \getparameters[xxx][aaa]\par
+%D \stoptyping
+
+%D \macros {expandparameters}
+%D
+%D Example usage:
+%D
+%D \startbuffer
+%D \getparameters[taco][name=taco]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \expandparameters \getparameters[taco][name=\currentvalue\space hoekwater]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \getparameters[taco][name=\currentvalue\space hoekwater]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+%D Here we hook in the code (beware, this is the optimized get **):
+
+\def\xdoget@n@parameters#1]%
+ {\xprocesscommaitem#1,],\@relax@}
+
+% \def\xdoget@e@parameters#1]%
+% {\let\dosetnvalue\dosetvalue
+% \let\dosetvalue\dosetevalue
+% \let\p!doassign\p!e!doassign
+% \xprocesscommaitem#1,],\@relax@
+% \let\p!doassign\p!n!doassign
+% \let\dosetvalue\dosetnvalue
+% \let\xdogetparameters\xdoget@n@parameters
+% \let\currentvalue\empty}
+
+\def\xdoget@e@parameters#1]%
+ {\let\dosetnvalue\setsomevalue
+ \let\setsomevalue\dosetevalue
+ \let\p!doassign\p!e!doassign
+ \let\setsomevalue\dosetevalue
+ \xprocesscommaitem#1,],\@relax@
+ \let\p!doassign\p!n!doassign
+ \let\setsomevalue\dosetnvalue
+ \let\xdogetparameters\xdoget@n@parameters
+ \let\currentvalue\empty}
+
+\let\xdogetparameters\xdoget@n@parameters % **
+
+\def\expandparameters{\let\xdogetparameters\xdoget@e@parameters}
+
+%D \macros
+%D {getemptyparameters}
+%D
+%D Sometimes we explicitly want variables to default to an
+%D empty string, so we welcome:
+%D
+%D \starttyping
+%D \getemptyparameters [label] [...=...,...=...]
+%D \stoptyping
+
+\def\getemptyparameters[#1]#2[#3]%
+ {\def\p!dogetemptyparameter##1{\doassignempty[#1][##1]}%
+ \processcommalist[#3]\p!dogetemptyparameter}
+
+%D \macros
+%D {copyparameters}
+%D
+%D Some \CONTEXT\ commands take their default setups from
+%D others. All commands that are able to provide backgounds
+%D or rules around some content, for instance default to the
+%D standard command for ruled boxes. Is situations like this
+%D we can use:
+%D
+%D \starttyping
+%D \copyparameters [to-label] [from-label] [name1,name2,...]
+%D \stoptyping
+%D
+%D For instance
+%D
+%D \starttyping
+%D \copyparameters
+%D [internal][external]
+%D [alfa,beta]
+%D \stoptyping
+%D
+%D Leads to:
+%D
+%D \starttyping
+%D \def\internalalfa {\externalalfa}
+%D \def\internalbeta {\externalbeta}
+%D \stoptyping
+%D
+%D By using \type{\docopyvalue} we've prepared this command
+%D for use in a multi||lingual environment.
+
+\def\copyparameters[#1]#2[#3]#4[#5]%
+ {\doifnot{#1}{#3}
+ {\def\docopyparameter{\docopyvalue{#1}{#3}}% ##1
+ \processcommalist[#5]\docopyparameter}}
+
+%D \macros
+%D {ifparameters,checkparameters}
+%D
+%D A slightly different one is \type{\checkparameters}, which
+%D also checks on the presence of a~\type{=}.
+%D
+%D The boolean \type{\ifparameters} can be used afterwards.
+%D Combining both in one \type{\if}||macro would lead to
+%D problems with nested \type{\if}'s.
+%D
+%D \starttyping
+%D \checkparameters[argument]
+%D \stoptyping
+
+\newif\ifparameters
+
+\def\p!checkparameters#1=#2#3\war%
+ {\if#2@\parametersfalse\else\parameterstrue\fi}
+
+\def\checkparameters[#1]%
+ {\p!checkparameters#1=@@\war}
+
+%D \macros
+%D {getfromcommalist,getfromcommacommand,
+%D commalistelement,
+%D getcommalistsize,getcommacommandsize}
+%D
+%D It's possible to get an element from a commalist or a
+%D command representing a commalist.
+%D
+%D \starttyping
+%D \getfromcommalist [string] [n]
+%D \getfromcommacommand [string,\strings,string,...] [n]
+%D \stoptyping
+%D
+%D The difference betwee the two of them is the same as the
+%D difference between \type{\processcomma...}. The found string
+%D is stored in \type{\commalistelement}.
+%D
+%D We can calculate the size of a comma separated list by
+%D using:
+%D
+%D \starttyping
+%D \getcommalistsize [string,string,...]
+%D \getcommacommandsize [string,\strings,string,...]
+%D \stoptyping
+%D
+%D Afterwards, the length is available in the macro
+%D \type{\commalistsize} (not a \COUNTER).
+
+\newcount\commalistcounter
+
+\def\commalistsize{0}
+
+\def\p!dogetcommalistsize#1%
+ {\advance\commalistcounter\plusone}
+
+\def\getcommalistsize#1]% don't loose [{#1}]
+ {\commalistcounter\zerocount
+ \processcommalist#1]\p!dogetcommalistsize % was [{#1}]
+ \edef\commalistsize{\the\commalistcounter}}
+
+\def\getcommacommandsize[#1]%
+ {\edef\commacommand{#1}%
+ \scratchtoks\expandafter{\expandafter[\commacommand]}%
+ \expandafter\getcommalistsize\the\scratchtoks }
+
+% to be tested first
+%
+% \def\getcommacommandsize[#1]%
+% {\expanded{\getcommalistsize[#1]}}
+
+% \def\p!dogetfromcommalist#1%
+% {\advance\commalistcounter \minusone
+% \ifcase\commalistcounter
+% \def\commalistelement{#1}%
+% \begingroup\def\doprocesscommaitem##1]{\endgroup}%
+% \fi}
+
+\def\p!dogetfromcommalist#1%
+ {\advance\commalistcounter \minusone
+ \ifcase\commalistcounter
+ \def\commalistelement{#1}%
+ \expandafter\quitcommalist
+ \fi}
+
+\unexpanded\def\getfromcommalist[#1]#2[#3]%
+ {\let\commalistelement\empty
+ \commalistcounter#3\relax
+ \processcommalist[#1]\p!dogetfromcommalist}
+
+\unexpanded\def\getfromcommacommand[#1]%
+ {\normalexpanded{\getfromcommalist[#1]}}
+
+%D Watertight (and efficient) solutions are hard to find, due
+%D to the handling of braces during parameters passing and
+%D scanning. Nevertheless:
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1=\commalistsize) }
+%D
+%D \getcommalistsize [\hbox{$a,b,c,d,e,f$}] \dosomething 1
+%D \getcommalistsize [{a,b,c,d,e,f}] \dosomething 1
+%D \getcommalistsize [{a,b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [a,b,{c,d,e},f] \dosomething 4
+%D \getcommalistsize [a{b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [{a,b}c,d,e,f] \dosomething 4
+%D \getcommalistsize [] \dosomething 0
+%D \getcommalistsize [{[}] \dosomething 1
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D reports:
+%D
+%D \getbuffer
+
+%D \macros
+%D {dogetcommalistelement,dogetcommacommandelement}
+%D
+%D For low level (fast) purposes, we can also use the next
+%D alternative, which can handle 8~elements at most.
+%D
+%D \starttyping
+%D \dogetcommalistelement1\from a,b,c\to\commalistelement
+%D \stoptyping
+
+\def\dodogetcommalistelement#1\from#2,#3,#4,#5,#6,#7,#8\to#9%
+ {\edef#9{\ifcase#1\relax\or#2\or#3\or#4\or#5\or#6\or#7\or#8\fi}}
+
+\def\dogetcommalistelement#1\from#2\to%
+ {\dodogetcommalistelement#1\from#2,,,,,,\to}
+
+% check sources
+
+\def\dogetcommacommandelement#1\from#2\to%
+ {\@EA\dodogetcommalistelement\@EA#1\@EA\from#2,,,,,,\to}
+
+%D \macros
+%D {dosingleargument,dodoubleargument,dotripleargument,
+%D doquadrupleargument,doquintupleargument,dosixtupleargument,
+%D doseventupleargument}
+%D
+%D When working with delimited arguments, spaces and
+%D lineendings can interfere. The next set of macros uses
+%D \TEX' internal scanner for grabbing everything between
+%D arguments. Forgive me the funny names.
+%D
+%D \starttyping
+%D \dosingleargument\commando = \commando[#1]
+%D \dodoubleargument\commando = \commando[#1][#2]
+%D \dotripleargument\commando = \commando[#1][#2][#3]
+%D \doquadrupleargument\commando = \commando[#1][#2][#3][#4]
+%D \doquintupleargument\commando = \commando[#1][#2][#3][#4][#5]
+%D \dosixtupleargument\commando = \commando[#1][#2][#3][#4][#5][#6]
+%D \doseventupleargument\command = \commando[#1][#2][#3][#4][#5][#6][#7]
+%D \stoptyping
+%D
+%D These macros are used in the following way:
+%D
+%D \starttyping
+%D \def\dosetupsomething[#1][#2]%
+%D {... #1 ... #2 ...}
+%D
+%D \unexpanded\def\setupsomething
+%D {\dodoubleargument\dosetupsomething}
+%D \stoptyping
+%D
+%D The implementation can be surprisingly simple and needs no
+%D further explanation, like:
+%D
+%D \starttyping
+%D \def\dosingleargument#1[#2]%
+%D {#1[#2]}
+%D \def\dotripleargument#1[#2]#3[#4]#5[#6]%
+%D {#1[#2][#4][#6]}
+%D \def\doquintupleargument#1%
+%D {\def\dodoquintupleargument[##1]##2[##3]##4[##5]##6[##7]##8[##9]%
+%D {#1[##1][##3][##5][##7][##9]}%
+%D \dodoquintupleargument}
+%D \stoptyping
+%D
+%D Because \TEX\ accepts 9~arguments at most, we have to use
+%D two||step solution when getting five or more arguments.
+%D
+%D When developing more and more of the real \CONTEXT, we
+%D started using some alternatives that provided empty
+%D arguments (in fact optional ones) whenever the user failed
+%D to supply them. Because this more complicated macros enable
+%D us to do some checking, we reimplemented the non||empty
+%D ones.
+
+\def\dosingleargument {\let\expectedarguments\plusone \dosingleempty }
+\def\dodoubleargument {\let\expectedarguments\plustwo \dodoubleempty }
+\def\dotripleargument {\let\expectedarguments\plusthree \dotripleempty }
+\def\doquadrupleargument {\let\expectedarguments\plusfour \doquadrupleempty }
+\def\doquintupleargument {\let\expectedarguments\plusfive \doquintupleempty }
+\def\dosixtupleargument {\let\expectedarguments\plussix \dosixtupleempty }
+\def\doseventupleargument{\let\expectedarguments\plusseven \doseventupleempty}
+
+%D \macros
+%D {iffirstagument,ifsecondargument,ifthirdargument,
+%D iffourthargument,iffifthargument,ifsixthargument,
+%D ifseventhargument}
+%D
+%D We use some signals for telling the calling macros if all
+%D wanted arguments are indeed supplied by the user.
+
+\newif\iffirstargument
+\newif\ifsecondargument
+\newif\ifthirdargument
+\newif\iffourthargument
+\newif\iffifthargument
+\newif\ifsixthargument
+\newif\ifseventhargument
+
+%D \macros
+%D {dosingleempty,dodoubleempty,dotripleempty,
+%D doquadrupleempty,doquintupleempty,dosixtupeempty,
+%D doseventupleempty}
+%D
+%D The empty argument supplying macros mentioned before, look
+%D like:
+%D
+%D \starttyping
+%D \dosingleempty \command
+%D \dodoubleempty \command
+%D \dotripleempty \command
+%D \doquadrupleempty \command
+%D \doquintupleempty \command
+%D \dosixtupleempty \command
+%D \doseventupleempty\command
+%D \stoptyping
+%D
+%D So \type{\dodoubleempty} leades to:
+%D
+%D \starttyping
+%D \command[#1][#2]
+%D \command[#1][]
+%D \command[][]
+%D \stoptyping
+%D
+%D Depending of the generousity of the user. Afterwards one can
+%D use the \type{\if...argument} boolean. For novice: watch
+%D the stepwise doubling of \type{#}'s
+
+% idea: \ignorespaces afterwards
+
+\chardef\noexpectedarguments=0
+\chardef\expectedarguments =0
+
+\def\showargumenterror#1#2%
+ {\writestatus{systems}{\number#1 argument(s) expected in line #2}}
+
+\def\doshowargumenterror
+ {\ifnum\expectedarguments>\noexpectedarguments
+ \showargumenterror{\number\expectedarguments}{\number\inputlineno}%
+ \fi
+ \noshowargumenterror}
+
+\def\noshowargumenterror
+ {\let\expectedarguments\noexpectedarguments}
+
+\long\def\dogetargument#1#2#3#4%
+ {\let\charactertoken=#1%
+ \def\!!stringa{\noshowargumenterror#3\dodogetargument}%
+ \def\!!stringb{\doshowargumenterror#4\dodogetargument#1#2}%
+ \futurelet\nexttoken\inspectnextcharacter}
+
+\def\getsingleempty#1#2#3%
+ {\def\dodogetargument%
+ {#3}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getdoubleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\gettripleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getquadrupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getquintupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2%
+ #1{################1}#2}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getsixtupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument#1################################1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2%
+ #1{################1}#2%
+ #1{################################1}#2}%
+ \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getseventupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument#1################################1#2%
+ {\def\dodogetargument#1################################%
+ ################################1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2%
+ #1{################1}#2%
+ #1{################################1}#2%
+ #1{################################%
+ ################################1}#2}%
+ \dogetargument#1#2\seventhargumenttrue\seventhargumentfalse}%
+ \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\dosingleempty {\getsingleempty []}
+\def\dodoubleempty {\getdoubleempty []}
+\def\dotripleempty {\gettripleempty []}
+\def\doquadrupleempty {\getquadrupleempty []}
+\def\doquintupleempty {\getquintupleempty []}
+\def\dosixtupleempty {\getsixtupleempty []}
+\def\doseventupleempty{\getseventupleempty[]}
+
+%D Because some of these are called quite often, we will now
+%D replace the more general version by alternatives tuned for
+%D speed.
+
+\def\dosingleempty#1% we can make dedicated doifnextoptional's
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextoptionalelse
+ {\firstargumenttrue#1}%
+ {\dosinglefakeempty#1}}
+
+\def\dodoubleempty#1%
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextoptionalelse
+ {\dodoubletestempty#1}%
+ {\dodoublefakeempty#1}}
+
+\def\dotripleempty#1%
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextoptionalelse
+ {\dotripletestempty#1}%
+ {\dotriplefakeempty#1}}
+
+\def\dosinglefakeempty#1%
+ {\firstargumentfalse#1[]}
+
+\def\dodoublefakeempty#1%
+ {\firstargumentfalse\secondargumentfalse#1[][]}
+
+\def\dotriplefakeempty#1%
+ {\firstargumentfalse\secondargumentfalse\thirdargumentfalse#1[][][]}
+
+\long\def\dodoubletestempty#1[#2]%
+ {\firstargumenttrue
+ \doifnextoptionalelse
+ {\secondargumenttrue #1[{#2}]}%
+ {\secondargumentfalse#1[{#2}][]}}
+
+\long\def\dotripletestempty#1[#2]%
+ {\firstargumenttrue
+ \doifnextoptionalelse
+ {\dotripletestemptyx #1[{#2}]}%
+ {\secondargumentfalse
+ \thirdargumentfalse #1[{#2}][][]}}
+
+\long\def\dotripletestemptyx#1[#2][#3]%
+ {\secondargumenttrue
+ \doifnextoptionalelse
+ {\thirdargumenttrue #1[{#2}][{#3}]}%
+ {\thirdargumentfalse#1[{#2}][{#3}][]}}
+
+%D \macros
+%D {strippedcsname}
+%D
+%D The next macro can be very useful when using \type{\csname}
+%D like in:
+%D
+%D \starttyping
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptyping
+%D
+%D This expands to \type{\ifsomething}.
+
+\def\strippedcsname
+ {\expandafter\gobbleoneargument\string}
+
+%D \macros
+%D {complexorsimple,complexorsimpleempty}
+%D
+%D Setups can be optional. A command expecting a setup is
+%D prefixed by \type{\complex}, a command without one gets the
+%D prefix \type{\simple}. Commands like this can be defined by:
+%D
+%D \starttyping
+%D \complexorsimple\command
+%D \stoptyping
+%D
+%D When \type{\command} is followed by a \type{[setup]}, then
+%D
+%D \starttyping
+%D \complexcommand [setup]
+%D \stoptyping
+%D
+%D executes, else we get
+%D
+%D \starttyping
+%D \simplecommand
+%D \stoptyping
+%D
+%D An alternative for \type{\complexorsimple} is:
+%D
+%D \starttyping
+%D \complexorsimpleempty {command}
+%D \stoptyping
+%D
+%D Depending on the presence of \type{[setup]}, this one
+%D leads to one of:
+%D
+%D \starttyping
+%D \complexcommando [setup]
+%D \complexcommando []
+%D \stoptyping
+%D
+%D Many \CONTEXT\ commands started as complex or simple ones,
+%D but changed into more versatile (more object oriented) ones
+%D using the \type{\get..argument} commands.
+
+\def\complexorsimple#1%
+ {% \relax % prevents lookahead, brrr
+ \doifnextoptionalelse
+ {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname}
+ {\firstargumentfalse\csname\s!simple \strippedcsname#1\endcsname}}
+
+\def\complexorsimpleempty#1%
+ {% \relax % prevents lookahead, brrr
+ \doifnextoptionalelse
+ {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname}
+ {\firstargumentfalse\csname\s!complex\strippedcsname#1\endcsname[]}}
+
+%D \macros
+%D {definecomplexorsimple,definecomplexorsimpleempty}
+%D
+%D The previous commands are used that often that we found it
+%D worthwile to offer two more alternatives. Watch the build
+%D in protection.
+
+\def\docomplexorsimple#1#2%
+ {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#2}}
+
+\def\docomplexorsimpleempty#1%
+ {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#1[]}}
+
+\unexpanded\def\definecomplexorsimple#1%
+ {\unexpanded\edef#1%
+ {\noexpand\docomplexorsimple
+ \@EA\noexpand\csname\s!complex\strippedcsname#1\endcsname
+ \@EA\noexpand\csname\s!simple \strippedcsname#1\endcsname}}
+
+\unexpanded\def\definecomplexorsimpleempty#1%
+ {\unexpanded\edef#1%
+ {\noexpand\docomplexorsimpleempty
+ \@EA\noexpand\csname\s!complex\strippedcsname#1\endcsname}}
+
+%D These commands are called as:
+%D
+%D \starttyping
+%D \definecomplexorsimple\command
+%D \stoptyping
+%D
+%D Of course, we must have available
+%D
+%D \starttyping
+%D \def\complexcommand[#1]{...}
+%D \def\simplecommand {...}
+%D \stoptyping
+%D
+%D Using this construction saves a few string now and then.
+
+%D \macros
+%D {dosinglegroupempty,dodoublegroupempty,dotriplegroupempty,
+%D doquadruplegroupempty, doquintuplegroupempty}
+%D
+%D We've already seen some commands that take care of
+%D optional arguments between \type{[]}. The next two commands
+%D handle the ones with \type{{}}. They are called as:
+%D
+%D \starttyping
+%D \dosinglegroupempty \ineedONEargument
+%D \dodoublegroupempty \ineedTWOarguments
+%D \dotriplegroupempty \ineedTHREEarguments
+%D \doquadruplegroupempty \ineedFOURarguments
+%D \doquintuplegroupempty \ineedFIVEarguments
+%D \stoptyping
+
+%D We can add additional definitions later when we have defined
+%D \type {\appendtoks}.
+
+\def \permitspacesbetweengroups{\let\@@permitspacesbetweengroups\zerocount}
+\def\dontpermitspacesbetweengroups{\let\@@permitspacesbetweengroups\plusone}
+
+\dontpermitspacesbetweengroups
+
+%D We can avoid the nasty if handling in \type {syst-gen} by splitting
+%D the lot in pieces so that we have no nested \type {\nextarguments}
+%D potentially being an \type {conditional} token. Okay, these macros
+%D are not called that often but it saves crap when tracing.
+
+% \def\dogetgroupargument#1#2%
+% {\let\dogroupargumentyes#1%
+% \let\dogroupargumentnop#2%
+% \futurelet\nextargument\dodogetgroupargument}
+
+\def\dodogetgroupargument
+ {\ifx\nextargument\bgroup
+ \expandafter\dodogetgroupargumentA
+ \else
+ \expandafter\dodogetgroupargumentB
+ \fi}
+
+\def\dodogetgroupargumentA
+ {\noshowargumenterror
+ \dogroupargumentyes\dodogetargument}
+
+% \def\dodogetgroupargumentB
+% {\ifcase\@@permitspacesbetweengroups
+% \expandafter\dodogetgroupargumentC
+% \else
+% \expandafter\dodogetgroupargumentD
+% \fi}
+
+% \def\dodogetgroupargumentC
+% {\ifx\nextargument\lineending
+% \expandafter\dodogetgroupargumentE
+% \else
+% \expandafter\dodogetgroupargumentF
+% \fi}
+
+\def\dodogetgroupargumentB
+ {\ifcase\@@permitspacesbetweengroups
+ \expandafter\dodogetgroupargumentF
+ \else
+ \expandafter\dodogetgroupargumentD
+ \fi}
+
+\def\dodogetgroupargumentD
+ {\doshowargumenterror
+ \dogroupargumentnop\dodogetargument{}}
+
+% \def\dodogetgroupargumentE
+% {\begingroup\def\\ {\endgroup\dogetgroupargument\dogroupargumentyes\dogroupargumentnop}\\}
+
+\begingroup
+ \def\\ {\dogetgroupargument\dogroupargumentyes\dogroupargumentnop}
+ \global\let\dodogetgroupargumentE\\
+\endgroup
+
+\def\dodogetgroupargumentF
+ {\ifx\nextargument\blankspace
+ \expandafter\dodogetgroupargumentE % G
+ \else
+ \expandafter\dodogetgroupargumentD % H
+ \fi}
+
+\def\dogetgroupargument#1#2%
+ {\let\dogroupargumentyes#1%
+ \let\dogroupargumentnop#2%
+ \futurelet\nextargument\dodogetgroupargument}
+
+\def\dosinglegroupempty#1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\dodoublegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\dotriplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}{####1}}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\doquadruplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument########1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}{####1}{########1}}%
+ \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\doquintuplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument########1%
+ {\def\dodogetargument################1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}{####1}{########1}{################1}}%
+ \dogetgroupargument\fifthargumenttrue\fifthargumentfalse}%
+ \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+%D These macros can explictly take care of spaces, which means
+%D that the next definition and calls are valid:
+%D
+%D \starttyping
+%D \def\test#1#2#3{[#1#2#3]}
+%D
+%D \dotriplegroupempty\test {a}{b}{c}
+%D \dotriplegroupempty\test {a}{b}
+%D \dotriplegroupempty\test {a}
+%D \dotriplegroupempty\test
+%D \dotriplegroupempty\test {a} {b} {c}
+%D \dotriplegroupempty\test {a} {b}
+%D \dotriplegroupempty\test
+%D {a}
+%D {b}
+%D \stoptyping
+%D
+%D And alike.
+
+%D \macros
+%D {firstofoneargument, firstoftwoarguments, firstofthreearguments
+%D secondoftwoarguments, secondofthreearguments,
+%D thirdofthreearguments}
+%D
+%D The next six macros (dedicated to Taco) can conveniently
+%D used to select arguments. Their names explain their
+%D functionality.
+
+\long\def\firstofoneargument #1{#1}
+
+\long\def\firstoftwoarguments #1#2{#1}
+\long\def\secondoftwoarguments #1#2{#2}
+
+\long\def\firstofthreearguments #1#2#3{#1}
+\long\def\secondofthreearguments #1#2#3{#2}
+\long\def\thirdofthreearguments #1#2#3{#3}
+
+\long\def\firstoffourarguments #1#2#3#4{#1}
+\long\def\secondoffourarguments #1#2#3#4{#2}
+\long\def\thirdoffourarguments #1#2#3#4{#3}
+\long\def\fourthoffourarguments #1#2#3#4{#4}
+
+\long\def\firstoffivearguments #1#2#3#4#5{#1}
+\long\def\secondoffivearguments #1#2#3#4#5{#2}
+\long\def\thirdoffivearguments #1#2#3#4#5{#3}
+\long\def\fourthoffivearguments #1#2#3#4#5{#4}
+\long\def\fifthoffivearguments #1#2#3#4#5{#5}
+
+\long\def\firstofsixarguments #1#2#3#4#5#6{#1}
+\long\def\secondofsixarguments#1#2#3#4#5#6{#2}
+\long\def\thirdofsixarguments #1#2#3#4#5#6{#3}
+\long\def\fourthofsixarguments#1#2#3#4#5#6{#4}
+\long\def\fifthofsixarguments #1#2#3#4#5#6{#5}
+\long\def\sixthofsixarguments #1#2#3#4#5#6{#6}
+
+%D \macros
+%D {globalletempty,letempty,letvalueempty,letgvalueempty}
+%D
+%D Trivial:
+
+\def\letempty #1{\let#1\empty}
+\def\globalletempty#1{\global\let#1\empty}
+
+\def\letvalueempty #1{\expandafter\let\csname#1\endcsname\empty}
+\def\letgvalueempty#1{\global\expandafter\let\csname#1\endcsname\empty}
+
+%D \macros
+%D {wait}
+%D
+%D The next macro hardly needs explanation. Because no
+%D nesting is to be expected, we can reuse \type{\wait} within
+%D \type{\wait} itself.
+
+\def\wait
+ {\begingroup
+ \read16 to \wait
+ \endgroup}
+
+%D \macros
+%D {writestring,writeline,writebanner,
+%D writestatus,statuswidth,normalwritestatus}
+%D
+%D Maybe one didn't notice, but we've already introduced a
+%D macro for showing messages. In the multi||lingual modules,
+%D we will also introduce a mechanism for message passing. For
+%D the moment we stick to the core macros:
+%D
+%D \starttyping
+%D \writestring {string}
+%D \writeline
+%D \writestatus {category} {message}
+%D \stoptyping
+%D
+%D Messages are formatted. One can provide the maximum with
+%D of the identification string with the macro \type
+%D {\statuswidth}.
+
+\chardef\statuswidth=15
+\chardef\statuswrite=16
+
+\ifdefined\writestring \else
+
+ \newtoks\everywritestring
+
+ \def\writedirect {\immediate\write\statuswrite}
+ \def\writeline {\writedirect{}}
+ \def\writestring#1{\begingroup\the\everywritestring\writedirect{#1}\endgroup}
+
+\fi
+
+\def\normalwritestatus#1#2%
+ {\writestring{\expandafter\dosplitstatus\expandafter\statuswidth#1%
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\end
+ \space:\space#2}}
+
+\def\dosplitstatus#1#2%
+ {\ifcase#1 \expandafter\nosplitstatus\fi#2%
+ \expandafter\dosplitstatus\expandafter{\the\numexpr#1+\minusone\relax}}
+
+\def\nosplitstatus#1\end
+ {}
+
+%D \macros
+%D {debuggerinfo}
+%D
+%D For debugging purposes we can enhance macros with the
+%D next alternative. Here \type{debuggerinfo} stands for both
+%D a macro accepting two arguments and a boolean (in fact a
+%D few macro's too).
+
+\newif\ifdebuggerinfo
+
+\def\debuggerinfo#1#2%
+ {\ifdebuggerinfo
+ \writestatus{debugger}{#1:: #2}%
+ \fi}
+
+\ifdefined\writestatus \else \let\writestatus\normalwritestatus \fi
+\ifdefined\writebanner \else \def\writebanner{\writestring} \fi
+
+% % % % % % % % % % % % % % % % % % % % % % % %
+
+%D \macros
+%D {rawgetparameters}
+%D
+%D A raw and dirty alternative for \type {\getparameters}; no
+%D checking is done!
+
+\def\rawsetparameter#1=#2,%
+ {\if]#1\else
+ \expandafter\def\csname\rawparameterprefix#1\endcsname{#2}%
+ \expandafter\rawsetparameter
+ \fi}
+
+\def\rawgetparameters[#1][#2% some 5-10% faster
+ {\ifx#2]% test is needed, else bomb on [#1][]
+ \expandafter\gobbleoneargument
+ \else
+ \def\rawparameterprefix{#1}%
+ \expandafter\dorawgetparameters
+ \fi#2}
+
+\def\dorawgetparameters#1]%
+ {\expandafter\rawsetparameter#1,]=,}
+
+%D \macros
+%D {doglobal,
+%D redoglobal,dodoglobal,resetglobal}
+%D
+%D The two macros \type {\redoglobal} and \type{\dodoglobal} are
+%D used in this and some other modules to enforce a user
+%D specified \type {\doglobal} action. The last and often only
+%D global assignment in a macro is done with
+%D \type {\dodoglobal}, but all preceding ones with
+%D \type {\redoglobal}. When using only alternatives, one can
+%D reset this mechanism with \type {\resetglobal}.
+
+\def\resetglobal
+ {\let\redoglobal\relax
+ \let\dodoglobal\relax}
+
+\resetglobal
+
+\def\doglobal
+ {\ifx\redoglobal\relax
+ \let\redoglobal\global
+ \let\dodoglobal\@@dodoglobal
+ \fi}
+
+\def\@@dodoglobal
+ {\resetglobal\global}
+
+\def\saveglobal
+ {\let\@@dodoglobal\dodoglobal
+ \let\@@redoglobal\redoglobal}
+
+\def\restoreglobal
+ {\let\redoglobal\@@redoglobal
+ \let\dodoglobal\@@dodoglobal}
+
+%D A very useful application of this macro is \type {\newif},
+%D \TEX's fake boolean type. Not being a primitive,
+%D \type {\global} hopelessly fails here. But a slight
+%D adaption of Knuth's original macro permits:
+%D
+%D \starttyping
+%D \doglobal\newif\iftest
+%D \stoptyping
+%D
+%D Of course one can still say:
+%D
+%D \starttyping
+%D \global\testtrue
+%D \global\testfalse
+%D \stoptyping
+%D
+%D Apart from the prefixes, a few more \type{\expandafters}
+%D are needed:
+
+\def\newif#1%
+ {\scratchcounter\escapechar
+ \escapechar\minusone
+ \expandafter\expandafter\expandafter
+ \redoglobal\expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \redoglobal\expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1\noexpand\iffalse}%
+ \dodoglobal\@if#1{false}%
+ \escapechar\scratchcounter}
+
+%D Also new:
+
+\unexpanded\def\define#1%
+ {\ifdefined#1%
+ \message{[\noexpand#1is already defined]}%
+ \expandafter\def\expandafter\gobbleddefinition
+ \else
+ \expandafter\def
+ \fi#1}
+
+\def\redefine#1%
+ {\ifdefined#1%
+ \message{[\noexpand#1is redefined]}%
+ \fi
+ \def#1}
+
+% \define\hans{hans}
+% \redefine\hans{hans}
+% \define\hans#1[]#2#3{hans}
+
+%D The next variant fits nicely in the setups syntax:
+%D
+%D \starttyping
+%D \starttexdefinition bagger [#1] #2
+%D oeps
+%D #1
+%D oeps
+%D \stoptexdefinition
+%D
+%D \bagger [a] {b}
+%D \stoptyping
+
+% \starttexdefinition test
+% oeps
+% \stoptexdefinition
+%
+% [\test]
+
+\bgroup \obeylines
+
+\gdef\starttexdefinition%
+ {\bgroup%
+ \obeylines%
+ \dostarttexdefinition}
+
+\gdef\dostarttexdefinition #1
+ {\catcode13=\@@ignore%
+ \doifinstringelse\letterhash{\detokenize{#1}}\dodostarttexdefinition\nonostarttexdefinition#1
+ }
+
+\long\gdef\dodostarttexdefinition#1 #2
+ {\dododostarttexdefinition{#1}{#2}}
+
+\long\gdef\dododostarttexdefinition#1#2#3\stoptexdefinition%
+ {\egroup%
+ \long\setvalue{#1}#2{#3}}
+
+\long\gdef\nonostarttexdefinition#1
+ {\nononostarttexdefinition{#1}{}}
+
+\long\gdef\nononostarttexdefinition#1#2#3\stoptexdefinition%
+ {\egroup%
+ \long\setvalue{#1}{#3}}
+
+\egroup
+
+%D \macros
+%D {newcounter,
+%D increment,decrement}
+%D
+%D Unfortunately the number of \COUNTERS\ in \TEX\ is limited,
+%D but fortunately we can store numbers in a macro. We can
+%D increment such pseudo \COUNTERS\ with \type{\increment}.
+%D
+%D \starttyping
+%D \increment(\counter,20)
+%D \increment(\counter,-4)
+%D \increment(\counter)
+%D \increment\counter
+%D \stoptyping
+%D
+%D After this sequence of commands, the value of
+%D \type{\counter} is 20, 16, 17 and~18. Of course there is
+%D also the complementary command \type{\decrement}.
+%D
+%D Global assignments are possible too, using \type{\doglobal}:
+%D
+%D \starttyping
+%D \doglobal\increment\counter
+%D \stoptyping
+%D
+%D When \type{\counter} is undefined, it's value is initialized
+%D at~0. It is nevertheless better to define a \COUNTER\
+%D explicitly. One reason could be that the \COUNTER\ can be
+%D part of a test with \type{\ifnum} and this conditional does
+%D not accept undefined macro's. The \COUNTER\ in our example
+%D can for instance be defined with:
+%D
+%D \starttyping
+%D \newcounter\counter
+%D \stoptyping
+%D
+%D The command \type{\newcounter} must not be confused with
+%D \type{\newcount}! Of course this mechanism is much slower
+%D than using \TEX's \COUNTERS\ directly. In practice
+%D \COUNTERS\ (and therefore our pseudo counters too) are
+%D seldom the bottleneck in the processing of a text. Apart
+%D from some other incompatilities we want to mention a pitfal
+%D when using \type{\ifnum}.
+%D
+%D \starttyping
+%D \ifnum\normalcounter=\pseudocounter \doif \else \doelse \fi
+%D \ifnum\pseudocounter=\normalcounter \doif \else \doelse \fi
+%D \stoptyping
+%D
+%D In the first test, \TEX\ continues it's search for the
+%D second number after reading \type{\pseudocounter}, while
+%D in the second test, it stops reading after having
+%D encountered a real one. Tests like the first one therefore
+%D can give unexpected results, for instance execution
+%D of \type{\doif} even if both numbers are unequal.
+
+\def\zerocountervalue{0}
+
+\def\newcounter#1%
+ {\dodoglobal\let#1\zerocountervalue}
+
+%D Nowadays we don't mind a few more tokens if we can gain a
+%D bit of speed.
+
+\def\doincrement#1%
+ {\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+\plusone \relax}}
+\def\dodecrement#1%
+ {\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+\minusone\relax}}
+
+\def\dododoincrement#1,#2)%
+ {\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi+#2\relax}}
+\def\dodododecrement#1,#2)%
+ {\dodoglobal\edef#1{\the\numexpr\ifdefined#1\ifx#1\relax\else#1\fi\fi-#2\relax}}
+
+\def\dodoincrement(#1%
+ {\doifnextcharelse,{\dododoincrement#1}{\dododoincrement#1,\plusone}}
+\def\dododecrement(#1%
+ {\doifnextcharelse,{\dodododecrement#1}{\dodododecrement#1,\plusone}}
+
+\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}}
+\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}}
+
+\def\increment{\doifnextcharelse(\dodoincrement\doincrement}
+\def\decrement{\doifnextcharelse(\dododecrement\dodecrement}
+
+\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname}
+\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname}
+
+%D \macros
+%D {newsignal}
+%D
+%D When writing advanced macros, we cannot do without
+%D signaling. A signal is a small (invisible) kern or penalty
+%D that signals the next macro that something just happened.
+%D This macro can take any action depending on the previous
+%D signal. Signals must be unique and the next macro takes care
+%D of that.
+%D
+%D \starttyping
+%D \newsignal\somesignal
+%D \stoptyping
+%D
+%D Signals old dimensions and can be used in skips, kerns and
+%D tests like \type{\ifdim}.
+
+\newdimen\maximumsignal % step is about 0.00025pt
+
+\def\newsignal#1%
+ {\ifdefined#1\else
+ \advance\maximumsignal 2sp % to be save in rounding
+ \edef#1{\the\maximumsignal}%
+ \fi}
+
+\let\newskimen\newdimen % it's all etex or later now
+
+%D \macros
+%D {strippedcsname}
+%D
+%D The next macro can be very useful when using \type{\csname}
+%D like in:
+%D
+%D \starttyping
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptyping
+
+\ifdefined\letterbackslash \else
+ {\catcode`.=0 .catcode`.\ 12 .xdef.letterbackslash{.string\}} % hack
+\fi
+
+\def\checkedstrippedcsname#1% this permits \strippedcsname{\xxx} and \strippedcsname{xxx}
+ {\expandafter\docheckedstrippedcsname\string#1}
+
+\def\docheckedstrippedcsname#1%
+ {\if\noexpand#1\letterbackslash\else#1\fi}
+
+%D \macros
+%D {savenormalmeaning}
+%D
+%D We will use this one in:
+
+\def\savenormalmeaning#1%
+ {\ifcsname normal\strippedcsname#1\endcsname \else
+ \letvalue{normal\strippedcsname#1}#1%
+ \fi}
+
+%D \macros
+%D {newconditional,
+%D settrue, setfalse,
+%D ifconditional,then}
+%D
+%D \TEX's lacks boolean variables, although the \PLAIN\ format
+%D implements \type{\newif}. The main disadvantage of this
+%D scheme is that it takes three hash table entries. A more
+%D memory saving alternative is presented here. A conditional
+%D is defined by:
+%D
+%D \starttyping
+%D \newconditional\doublesided
+%D \setfalse
+%D \stoptyping
+%D Setting a conditional is done by \type{\settrue} and
+%D \type{\setfalse}:
+%D
+%D \starttyping
+%D \settrue\doublesided
+%D \setfalse
+%D \stoptyping
+%D while testing is accomplished by:
+%D
+%D \starttyping
+%D \ifconditional\doublesided ... \else ... \fi
+%D \setfalse
+%D \stoptyping
+%D We cannot use the simple scheme:
+%D
+%D \starttyping
+%D \def\settrue #1{\let#1=\iftrue}
+%D \def\setfalse#1{\let#1=\iffalse}
+%D \stoptyping
+%D
+%D Such an implementation gives problems with nested
+%D conditionals. The next implementation is abaou as fast
+%D and just as straightforward:
+
+% \def\settrue #1{\chardef#1\zerocount}
+% \def\setfalse#1{\chardef#1\plusone}
+
+\def\settrue #1{\let#1\zerocount}
+\def\setfalse#1{\let#1\plusone}
+
+\let\newconditional\setfalse
+\let\ifconditional \ifcase
+
+\let\then\relax % so that we can say: \ifnum1>2\then -)
+
+%D \macros
+%D {ifzeropt}
+%D
+%D The next macro is both cosmetic and byte saving. It is
+%D pretty \type{\if}||safe too. It can be used in cases
+%D like:
+%D
+%D \starttyping
+%D \ifzeropt \somedimen ... \else ... \fi
+%D \stoptyping
+
+\let\ifzeropt\ifcase
+
+%D \macros
+%D {dorecurse,recurselevel,recursedepth,
+%D dostepwiserecurse,
+%D for}
+%D
+%D \TEX\ does not offer us powerfull for||loop mechanisms. On
+%D the other hand its recursion engine is quite unique. We
+%D therefore identify the for||looping macros by this method.
+%D The most simple alternative is the one that only needs a
+%D number.
+%D
+%D \starttyping
+%D \dorecurse {n} {whatever we want}
+%D \stoptyping
+%D
+%D This macro can be nested without problems and therefore be
+%D used in situations where \PLAIN\ \TEX's \type{\loop} macro
+%D ungracefully fails. The current value of the counter is
+%D available in \type{\recurselevel}, before as well as after
+%D the \typ{whatever we wat} stuff.
+%D
+%D \starttyping
+%D \dorecurse % inner loop
+%D {10}
+%D {\recurselevel: % outer value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \endgraf}
+%D \stoptyping
+%D
+%D In this example the first, second and fourth
+%D \type{\recurselevel} concern the outer loop, while the third
+%D and fifth one concern the inner loop. The depth of the
+%D nesting is available for inspection in \type{\recursedepth}.
+%D
+%D Both \type{\recurselevel} and \type{\recursedepth} are
+%D macros. The real \COUNTERS\ are hidden from the user because
+%D we don't want any interference.
+
+\newcount\outerrecurse
+\newcount\innerrecurse
+
+\def\recursedepth{\the\outerrecurse}
+\def\recurselevel{0}
+
+\let\nextrecurse\relax
+
+\def\@@irecurse{@@ir@@} % ecurse} % stepper
+\def\@@arecurse{@@ar@@} % ecurse} % action
+
+\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#4}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \ifnum#3>0\relax
+ \ifnum#2<#1\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwiserecurse
+ \fi
+ \else
+ \ifnum#3<0\relax
+ \ifnum#1<#2\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwisereverse
+ \fi
+ \else
+ \let\nextrecurse\exitstepwiserecurse
+ \fi
+ \fi\normalexpanded{\noexpand\nextrecurse{\number#1}{\number#2}{\number#3}}}
+
+\long\def\dodostepwiserecurse#1#2#3% from to step
+ {\ifnum#1>#2\relax
+ \@EA\nodostepwiserecurse
+ \else
+ \def\recurselevel{#1}%
+ \@EAEAEA\redostepwiserecurse\@EA
+ \fi\@EA{\the\numexpr\recurselevel+#3\relax}{#2}{#3}}
+
+\def\expandrecursecontent
+ {\csname\@@arecurse\recursedepth\endcsname}
+
+\def\redostepwiserecurse
+ {\expandrecursecontent\dodostepwiserecurse}
+
+\long\def\dodostepwisereverse#1#2#3% from to step
+ {\ifnum#1<#2\relax
+ \@EA\nodostepwiserecurse
+ \else
+ \def\recurselevel{#1}%
+ \@EAEAEA\redostepwisereverse\@EA
+ \fi\@EA{\the\numexpr\recurselevel#3\relax}{#2}{#3}}
+
+\long\def\dodostepwisereverse#1#2#3% from to step
+ {\ifnum#1<#2\relax
+ \@EA\nodostepwiserecurse
+ \else
+ \def\recurselevel{#1}%
+ \innerrecurse#1\relax
+ \advance\innerrecurse#3\relax
+ \@EAEAEA\redostepwisereverse\@EA
+ \fi\@EA{\the\innerrecurse}{#2}{#3}}
+
+\def\redostepwisereverse
+ {\expandrecursecontent\dodostepwisereverse}
+
+\def\exitstepwiserecurse
+ {\nodostepwiserecurse\relax}
+
+\def\nodostepwiserecurse#1#2#3#4%
+ {\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\def\nonostepwiserecurse#1#2#3%
+ {\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\def\dorecurse#1%
+ {\dostepwiserecurse1{#1}1}
+
+%D As we can see here, the simple command \type{\dorecurse} is
+%D a special case of the more general:
+%D
+%D \starttyping
+%D \dostepwiserecurse {from} {to} {step} {action}
+%D \stoptyping
+%D
+%D This commands accepts positive and negative steps. Illegal
+%D values are handles as good as possible and the macro accepts
+%D numbers and \COUNTERS.
+%D
+%D \starttyping
+%D \dostepwiserecurse {1} {10} {2} {...}
+%D \dostepwiserecurse {10} {1} {-2} {...}
+%D \stoptyping
+%D
+%D Because the simple case is used often, we implement it
+%D more efficiently:
+
+\long\def\dorecurse#1%
+ {\ifcase#1\relax
+ \expandafter\gobbletwoarguments
+ \or
+ \expandafter\ydorecurse
+ \else
+ \expandafter\xdorecurse
+ \fi{#1}}
+
+\long\def\xdorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#2}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \@EA\dodorecurse\@EA1\@EA{\number#1}}
+
+\long\def\ydorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\recurselevel\!!plusone
+ #2%
+ \@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\long\def\dodorecurse#1#2% from to
+ {\ifnum#1>#2\relax
+ \@EA\nodorecurse
+ \else
+ \def\recurselevel{#1}%
+ \@EAEAEA\redorecurse
+ \fi\@EA{\the\numexpr\recurselevel+\plusone\relax}{#2}}
+
+\long\def\dodorecurse#1#2% from to
+ {\ifnum#1>#2\relax
+ \@EA\nodorecurse
+ \else
+ \def\recurselevel{#1}%
+ \innerrecurse#1\advance\innerrecurse\plusone
+ \@EAEAEA\redorecurse
+ \fi\@EA{\the\innerrecurse}{#2}}
+
+\def\redorecurse
+ {\expandrecursecontent\dodorecurse}
+
+\def\nodorecurse#1#2#3%
+ {\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone }
+
+%D \macros
+%D {doloop,exitloop}
+%D
+%D Sometimes loops are not determined by counters, but by
+%D (a combinations of) conditions. We therefore implement a
+%D straightforward loop, which can only be left when we
+%D explictly exit it. Nesting is supported. First we present
+%D a more extensive alternative.
+%D
+%D \starttyping
+%D \doloop
+%D {Some kind of typesetting punishment \par
+%D \ifnum\pageno>100 \exitloop \fi}
+%D \stoptyping
+%D
+%D When needed, one can call for \type{\looplevel} and
+%D \type{\loopdepth}.
+
+\let\endofloop\donothing
+
+\long\def\doloop#1%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#1}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\endofloop\dodoloop
+ \dodoloop1} % no \plusone else \recurselevel wrong
+
+\long\def\dodoloop#1%
+ {\def\recurselevel{#1}%
+ \@EA\redoloop\@EA{\the\numexpr\recurselevel+\plusone\relax}}
+
+\def\redoloop
+ {\expandrecursecontent\endofloop}
+
+\def\nodoloop#1%
+ {\let\endofloop\dodoloop % new, permits nested \doloop's
+ \@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse\minusone}
+
+\def\exitloop % \exitloop quits at end
+ {\let\endofloop\nodoloop}
+
+\long\def\exitloopnow#1\endofloop % \exitloopnow quits directly
+ {\nodoloop}
+
+%D The loop is executed at least once, so beware of situations
+%D like:
+%D
+%D \starttyping
+%D \doloop {\exitloop some commands}
+%D \stoptyping
+%D
+%D It's just a matter of putting the text into the \type{\if}
+%D statement that should be there anyway, like in:
+%D
+%D \starttyping
+%D \doloop {\ifwhatever \exitloop \else some commands\fi}
+%D \stoptyping
+%D
+%D You can also quit a loop immediately, by using \type
+%D {\exitloopnow} instead. Beware, this is more sensitive
+%D for conditional errors.
+
+%D Krzysztof Leszczynski suggested to provide access to the level by
+%D means of a \type {#1}. I decided to pass the more frequently used
+%D level as \type {#1} and the less favoured depth as \type {#2}. The
+%D intended usage is:
+%D
+%D \starttyping
+%D \dorecurse{3}{\definesymbol[test-#1][xx-#1]}
+%D
+%D \def\test{\dorecurse{3}{\definesymbol[test-##1][xx-##1]}} \test
+%D
+%D \symbol[test-1]\quad\symbol[test-2]\quad\symbol[test-3]
+%D \stoptyping
+%D
+%D Since the hashed arguments are expanded, we don't need tricky
+%D expansion here.
+%D
+%D \starttyping
+%D \dorecurse{3}{\expanded{\definesymbol[test-\recurselevel][xx-\recurselevel]}}
+%D \stoptyping
+
+\def\expandrecursecontent
+ {\csname\@@arecurse\recursedepth\@EA\@EA\@EA\endcsname\@EA\@EA\@EA{\@EA\recurselevel\@EA}\@EA{\recursedepth}}
+
+\long\def\xdorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \@EA\dodorecurse\@EA1\@EA{\number#1}}
+
+\long\def\ydorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\recurselevel\!!plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}%
+ \expandrecursecontent
+ \@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \ifnum#3>0\relax
+ \ifnum#2<#1\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwiserecurse
+ \fi
+ \else
+ \ifnum#3<0\relax
+ \ifnum#1<#2\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwisereverse
+ \fi
+ \else
+ \let\nextrecurse\exitstepwiserecurse
+ \fi
+ \fi\normalexpanded{\noexpand\nextrecurse{\number#1}{\number#2}{\number#3}}}
+
+\long\def\doloop#1%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#1}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\endofloop\dodoloop
+ \dodoloop1} % no \plusone else \recurselevel wrong
+
+% EXPERIMENT
+
+% faster
+
+\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \ifnum#3>\zerocount
+ \ifnum#2<#1\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwiserecurse
+ \fi
+ \else
+ \ifnum#3<\zerocount
+ \ifnum#1<#2\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwisereverse
+ \fi
+ \else
+ \let\nextrecurse\exitstepwiserecurse
+ \fi
+ \fi
+ \expandafter\nextrecurse\normalexpanded{{\number#1}{\number#2}{\number#3}}}
+
+% slightly faster
+
+\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \csname @swr%
+ \ifnum#3>\zerocount
+ \ifnum#2<#1\else d\fi
+ \else\ifnum#3<\zerocount
+ \ifnum#1<#2\else r\fi
+ \fi\fi
+ \expandafter\endcsname\normalexpanded{{\number#1}{\number#2}{\number#3}}}
+
+\let\@swr \exitstepwiserecurse
+\let\@swrd\dodostepwiserecurse
+\let\@swrr\dodostepwisereverse
+
+%D For special purposes:
+
+\newcount\fastrecursecounter
+\newcount\lastrecursecounter
+\newcount\steprecursecounter
+
+\def\dofastrecurse#1#2#3#4%
+ {\def\fastrecursebody{#4}%
+ \fastrecursecounter#1\relax
+ \lastrecursecounter#2\relax
+ \steprecursecounter#3\relax
+ \def\recurselevel{\number\fastrecursecounter}%
+ \dodofastrecurse}
+
+\def\resetrecurselevel{\let\recurselevel\!!zerocount}
+
+\def\dodofastrecurse
+ {\ifnum\fastrecursecounter>\lastrecursecounter
+ % \resetrecurselevel % slows down
+ \else
+ \fastrecursebody
+ \advance\fastrecursecounter\steprecursecounter
+ \expandafter\dodofastrecurse
+ \fi}
+
+% \appendtoks \resetrecurselevel \to \everydump
+
+\everydump\expandafter{\the\everydump\resetrecurselevel}
+
+%D This alternative looks a bit different and uses a
+%D pseudo counter. When this macro is nested, we have to use
+%D different counters. This time we use keywords.
+%D
+%D \starttyping
+%D \def\alfa{2} \def\beta{100} \def\gamma{3}
+%D
+%D \for \n=55 \to 100 \step 1 \do {... \n ...}
+%D \for \n=\alfa \to \beta \step \gamma \do {... \n ...}
+%D \for \n=\n \to 120 \step 1 \do {... \n ...}
+%D \for \n=120 \to 100 \step -3 \do {... \n ...}
+%D \for \n=55 \to 100 \step 2 \do {... \n ...}
+%D \stoptyping
+%D
+%D Only in the third example we need to predefine \type{\n}.
+%D The use of \type{\od} as a dilimiter would have made nested
+%D use more problematic.
+
+%D Don't use this one, it's kind of obsolete.
+
+\def\for#1=#2\to#3\step#4\do#5%
+ {\dostepwiserecurse{#2}{#3}{#4}
+ {\let#1\recurselevel#5\let#1\recurselevel}}
+
+%D \macros
+%D {newevery,everyline,EveryLine,EveryPar}
+%D
+%D Lets skip to something quite different. It's common use
+%D to use \type {\everypar} for special purposes. In \CONTEXT\
+%D we use this primitive for locating sidefloats. This means
+%D that when user assignments to \type {\everypar} can interfere
+%D with those of the package. We therefore introduce
+%D \type {\EveryPar}.
+%D
+%D The same goes for \type {\EveryLine}. Because \TEX\ offers
+%D no \type {\everyline} primitive, we have to call for
+%D \type {\everyline} when we are working on a line by line
+%D basis. Just by calling \type {\EveryPar{}} and
+%D \type {\EveryLine{}} we restore the old situation.
+
+% \dorecurse{2}{
+% \expanded{\everypar{before \recurselevel\space}}
+% \EveryPar{x } [before \recurselevel\space x] \par
+% \EveryPar{y } [before \recurselevel\space y] \par
+% \EveryPar{} [before \recurselevel] \par
+% \EveryPar{x } \EveryPar{y } \EveryPar{} [before \recurselevel] \par
+% \EveryPar{y } \everypar{before } [before] \par
+% }
+
+% retrofit this into mkii
+
+\def\dowithevery#1%
+ {\expandafter\removetoks\expandafter\the\csname t\strippedcsname#1\endcsname\from#1%
+ \expandafter\appendtoks\expandafter\the\csname t\strippedcsname#1\endcsname\to #1%
+ \csname t\strippedcsname#1\endcsname}
+
+\def\newevery#1#2%
+ {\ifx#1\everypar\else\newtoks#1\fi% we test for redefinition elsewhere
+ \ifx#2\relax\else\ifdefined#2\else
+ \expandafter\newtoks\csname t\strippedcsname#1\endcsname
+ \def#2{\dowithevery#1}%
+ \fi\fi}
+
+%D This one permits definitions like:
+
+\newevery \everypar \EveryPar % we get a warning which is ok
+\newevery \everyline \EveryLine
+
+%D and how about:
+
+\newevery \neverypar \NeveryPar
+
+%D Which we're going to use indeed! When the second argument
+%D equals \type {\relax}, the first token list is created
+%D unless it is already defined.
+
+%D Technically spoken we could have used the method we are
+%D going to present in the visual debugger. First we save
+%D the primitive \type{\everypar}:
+%D
+%D \starttyping
+%D \let\normaleverypar=\everypar
+%D \stoptyping
+%D
+%D Next we allocate a \TOKENLIST\ named \type{\everypar},
+%D which means that \type{\everypar} is no longer a primitive
+%D but something like \type{\toks44}.
+%D
+%D \starttyping
+%D \newtoks\everypar
+%D \stoptyping
+%D
+%D Because \TEX\ now executes \type{\normaleverypar} instead
+%D of \type{\everypar}, we are ready to assign some tokens to
+%D this internally known and used \TOKENLIST.
+%D
+%D \starttyping
+%D \normaleverypar={all the things the system wants to do \the\everypar}
+%D \stoptyping
+%D
+%D Where the user can provide his own tokens to be expanded
+%D every time he expects them to expand.
+%D
+%D \starttyping
+%D \everypar={something the user wants to do}
+%D \stoptyping
+%D
+%D We don't use this method because it undoubtly leads to
+%D confusing situations, especially when other packages are
+%D used, but it's this kind of tricks that make \TEX\ so
+%D powerful.
+
+%D \macros
+%D {convertargument,convertcommand,convertvalue}
+%D
+%D Some persistent experimenting led us to the next macro. This
+%D macro converts a parameter or an expanded macro to it's
+%D textual meaning.
+%D
+%D \starttyping
+%D \convertargument ... \to \command
+%D \stoptyping
+%D
+%D For example,
+%D
+%D \starttyping
+%D \convertargument{one \two \three{four}}\to\ascii
+%D \stoptyping
+%D
+%D The resulting macro \type{\ascii} can be written to a file
+%D or the terminal without problems. In \CONTEXT\ we use this
+%D macro for generating registers and tables of contents.
+%D
+%D The second conversion alternative accepts a command:
+%D
+%D \starttyping
+%D \convertcommand\command\to\ascii
+%D \stoptyping
+%D
+%D Both commands accept the prefix \type{\doglobal} for global
+%D assignments.
+
+\def\convertvalue#1\to
+ {\expandafter\convertcommand\csname#1\endcsname\to}
+
+\def\defconvertedvalue#1#2% less sensitive for \to
+ {\@EA\defconvertedcommand\@EA#1\csname#2\endcsname}
+
+%D \macros
+%D {doifassignmentelse}
+%D
+%D A lot of \CONTEXT\ commands take optional arguments, for
+%D instance:
+%D
+%D \starttyping
+%D \dothisorthat[alfa,beta]
+%D \dothisorthat[first=foo,second=bar]
+%D \dothisorthat[alfa,beta][first=foo,second=bar]
+%D \stoptyping
+%D
+%D Although a combined solution is possible, we prefer a
+%D seperation. The next command takes care of propper
+%D handling of such multi||faced commands.
+%D
+%D \starttyping
+%D \doifassignmentelse {...} {then ...} {else ...}
+%D \stoptyping
+
+\long\def\docheckifassignmentelse#1=#2#3\@end@{\if#2@}%
+
+\long\def\doifassignmentelse#1%
+ {\expandafter\docheckifassignmentelse\detokenize{#1}=@@\@end@
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+% D \macros
+% D {convertasciiafter}
+% D
+% D Sometimes we need to convert an argument to a string (letters
+% D only), for instance when we compare it with another string:
+% D
+% D \starttyping
+% D \convertasciiafter\doifinstringelse{em}{\ascii}{...}
+% D \stoptyping
+%
+% \def\convertasciiafter#1#2%
+% {\@EA#1\@EA{\detokenize{#2}}}
+
+%D In \ETEX\ we can use \type {\detokenize} and gain some
+%D speed, but in general far less that 1\% for \type
+%D {\convertargument} and nil for \type {\convertcommand}.
+%D This macro is more robust than the pure \TEX\ one,
+%D something I found out when primitives like \type
+%D {\jobname} were fed (or something undefined).
+
+\long\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}}
+\long\def\convertcommand #1\to#2{\dodoglobal\edef#2{\@EA\detokenize\@EA{#1}}} % hm, only second is also ok
+
+\long\def\defconvertedargument #1#2{\edef#1{\detokenize {#2}}}
+\long\def\defconvertedcommand #1#2{\edef#1{\detokenize\@EA{#2}}}
+\long\def\edefconvertedargument#1#2{\edef#1{#2}%
+ \edef#1{\detokenize\@EA{#1}}}
+\long\def\gdefconvertedargument#1#2{\xdef#1{\detokenize {#2}}}
+\long\def\gdefconvertedcommand #1#2{\xdef#1{\detokenize\@EA{#2}}}
+\long\def\xdefconvertedargument#1#2{\xdef#1{#2}%
+ \xdef#1{\detokenize\@EA{#1}}}
+
+%D When you try to convert a primitive command, you'll find
+%D out that the \ETEX\ method fails on for instance \type
+%D {\jobname} in the sense that it returns the filename
+%D instead of just \type {\jobname}. So far this does not
+%D give real problems.
+
+%D This is typically a macro that one comes to after reading
+%D the \TEX book carefully. Even then, the definite solution
+%D was found after rereading the \TEX book. The first
+%D implementation was:
+%D
+%D \starttyping
+%D \def\doconvertargument#1->#2\\\\{#2}
+%D \stoptyping
+%D
+%D The \type{-}, the delimiter \type{\\\\} and the the second
+%D argument are completely redundant.
+
+%D \macros
+%D {showvalue,showargument}
+%D
+%D Two handy macros for testing purposes only:
+
+\def\showvalue#1%
+ {\expandafter\show\csname#1\endcsname}
+
+\def\showvalue#1%
+ {\ifcsname#1\endcsname
+ \expandafter\show\csname#1\endcsname
+ \else
+ \show\undefined
+ \fi}
+
+%D \macros
+%D {doifmeaningelse}
+%D
+%D We can use both commands in testing, but alas, not all
+%D meanings expand to something \type {->}. This is no problem
+%D in the \ETEX\ implementation, but since we want
+%D compatibility, we need:
+%D
+%D \starttyping
+%D \doifmeaningelse {\next} {\something} {true} {false}
+%D \stoptyping
+%D
+%D Watch the one level expansion of the second argument.
+
+\def\doifmeaningelse#1#2%
+ {\edef\!!stringa{\meaning#1}%
+ \def \!!stringb{#2}%
+ \edef\!!stringb{\meaning\!!stringb}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifsamestringselse,doifsamestring,doifnotsamestring}
+%D
+%D The next comparison macro converts the arguments into
+%D expanded strings. This command can be used to compare for
+%D instance \type {\jobname} with a name stored in a macro.
+%D
+%D \starttyping
+%D \doifelse {\jobname}{oeps}{YES}{NO}
+%D \doifsamestringelse{\jobname}{oeps}{YES}{NO}
+%D \stoptyping
+
+% \def\@@doifsamestringelse#1#2#3#4%
+% {\edef\!!stringa{#3}\convertcommand\!!stringa\to\!!stringa
+% \edef\!!stringb{#4}\convertcommand\!!stringb\to\!!stringb
+% \ifx\!!stringa\!!stringb\expandafter#1\else\expandafter#2\fi}
+
+\def\@@doifsamestringelse#1#2#3#4%
+ {\edef\!!stringa{\detokenize\expandafter{\normalexpanded{#3}}}%
+ \edef\!!stringb{\detokenize\expandafter{\normalexpanded{#4}}}%
+ \ifx\!!stringa\!!stringb\expandafter#1\else\expandafter#2\fi}
+
+\def\doifsamestringelse{\@@doifsamestringelse\firstoftwoarguments\secondoftwoarguments}
+\def\doifsamestring {\@@doifsamestringelse\firstofoneargument\gobbleoneargument}
+\def\doifnotsamestring {\@@doifsamestringelse\gobbleoneargument\firstofoneargument}
+
+%D \macros
+%D {ExpandFirstAfter,ExpandSecondAfter,ExpandBothAfter}
+%D
+%D These three commands support expansion of arguments before
+%D executing the commands that uses them. We can best
+%D illustrate this with an example.
+%D
+%D \starttyping
+%D \def\first {alfa,beta,gamma}
+%D \def\second {alfa,epsilon,zeta}
+%D
+%D \ExpandFirstAfter \doifcommon {\first} {alfa} {\message{OK}}
+%D \ExpandSecondAfter \doifcommon {alfa} {\second} {\message{OK}}
+%D \ExpandBothAfter \doifcommon {\first} {\second} {\message{OK}}
+%D
+%D \ExpandFirstAfter\processcommalist[\first]\message
+%D
+%D \ExpandAfter \doifcommon {\first} {alfa} {\message{OK}}
+%D \stoptyping
+%D
+%D The first three calls result in the threefold message
+%D \type{OK}, the fourth one shows the three elements of
+%D \type{\first}. The command \type{\ExpandFirstAfter} takes
+%D care of (first) arguments that are delimited by \type{[ ]},
+%D but the faster \type{\ExpandAfter} does not.
+
+\def\simpleExpandFirstAfter#1%
+ {\long\xdef\@@expanded{\noexpand\ExpandCommand{#1}}\@@expanded}
+
+\def\complexExpandFirstAfter[#1]%
+ {\long\xdef\@@expanded{\noexpand\ExpandCommand[#1]}\@@expanded}
+
+\def\ExpandFirstAfter#1%
+ {\let\ExpandCommand#1%
+ \doifnextoptionalelse\complexExpandFirstAfter\simpleExpandFirstAfter}
+
+\def\ExpandSecondAfter#1#2#3%
+ {\scratchtoks{#2}%
+ \long\xdef\@@expanded{\noexpand#1{\the\scratchtoks}{#3}}\@@expanded}
+
+\def\ExpandBothAfter#1#2#3%
+ {\long\xdef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
+
+\def\ExpandAfter#1#2%
+ {\long\xdef\@@expanded{\noexpand#1{#2}}\@@expanded}
+
+%D Now we can for instance define \type{\ifinstringelse} as:
+
+\def\ifinstringelse
+ {\ExpandBothAfter\p!doifinstringelse}
+
+%D \macros
+%D {ConvertToConstant,ConvertConstantAfter}
+%D
+%D When comparing arguments with a constant, we can get into
+%D trouble when this argument consists of tricky expandable
+%D commands. One solution for this is converting the
+%D argument to a string of unexpandable characters. To make
+%D comparison possible, we have to convert the constant too
+%D
+%D \starttyping
+%D \ConvertToConstant\doifelse {...} {...} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This construction is only needed when the first argument
+%D can give troubles. Misuse can slow down processing.
+%D
+%D \starttyping
+%D \ConvertToConstant\doifelse{\c!alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {alfa} {...}{...}
+%D \ConvertToConstant\doifelse{alfa \alfa test}{\c!alfa}{...}{...}
+%D \stoptyping
+%D
+%D In examples~2 and~3 both arguments equal, in~1 and~4
+%D they differ.
+
+\long\def\ConvertToConstant#1#2#3%
+ {\edef\!!stringa{\expandafter\detokenize\expandafter{#2}}%
+ \edef\!!stringb{\expandafter\detokenize\expandafter{#3}}%
+ #1{\!!stringa}{\!!stringb}}
+
+%D When the argument \type{#1} consists of commands, we had
+%D better use
+%D
+%D \starttyping
+%D \ConvertConstantAfter\processaction[#1][...]
+%D \ConvertConstantAfter\doifelse{#1}{\v!something}{}{}
+%D \stoptyping
+%D
+%D This commands accepts things like:
+%D
+%D \starttyping
+%D \v!constant
+%D constant
+%D \hbox to \hsize{\rubish}
+%D \stoptyping
+%D
+%D As we will see in the core modules, this macro permits
+%D constructions like:
+%D
+%D \starttyping
+%D \setupfootertexts[...][...]
+%D \setupfootertexts[margin][...][...]
+%D \setupfootertexts[\v!margin][...][...]
+%D \stoptyping
+%D
+%D where \type{...} can be anything legally \TEX.
+
+\def\CheckConstantAfter#1#2%
+ {\@EA\convertargument\v!prefix!\to\ascii
+ \convertargument#1\to#2\relax
+ \doifinstringelse\ascii{#2}
+ {\expandafter\convertargument#1\to#2}
+ {}}
+
+\def\ConvertConstantAfter#1#2#3%
+ {\CheckConstantAfter{#2}\asciia
+ \CheckConstantAfter{#3}\asciib
+ #1{\asciia}{\asciib}}
+
+%D \macros
+%D {assignifempty}
+%D
+%D We can assign a default value to an empty macro using:
+%D
+%D \starttyping
+%D \assignifempty \macros {default value}
+%D \stoptyping
+%D
+%D We don't explicitly test if the macro is defined.
+
+\def\assignifempty#1#2% can be sped up
+ {\doifsomething{#1}{\def#1{#2}}} % {\doifnot{#1}{}{\def#1{#2}}}
+
+%D \macros
+%D {gobbleuntil,grabuntil,gobbleuntilrelax,
+%D processbetween,processuntil}
+%D
+%D In \TEX\ gobbling usually stand for skipping arguments, so
+%D here are our gobbling macros.
+%D
+%D In \CONTEXT\ we use a lot of \type{\start}||\type{\stop}
+%D like constructions. Sometimes, the \type{\stop} is used as a
+%D hard coded delimiter like in:
+%D
+%D \starttyping
+%D \unexpanded\def\startcommand#1\stopcommand%
+%D {... #1 ...}
+%D \stoptyping
+%D
+%D In many cases the \type{\start}||\type{\stop} pair is
+%D defined at format generation time or during a job. This
+%D means that we cannot hardcode the \type{\stop} criterium.
+%D Only after completely understanding \type{\csname} and
+%D \type{\expandafter} I was able to to implement a solution,
+%D starting with:
+%D
+%D \starttyping
+%D \grabuntil{stop}\command
+%D \stoptyping
+%D
+%D This commands executes, after having encountered
+%D \type {\stop} the command \type {\command}. This command
+%D receives as argument the text preceding the \type {\stop}.
+%D This means that:
+%D
+%D \starttyping
+%D \unexpanded\def\starthello%
+%D {\grabuntil{stophello}\message}
+%D
+%D \starthello Hello world!\stophello
+%D \stoptyping
+%D
+%D results in: \type{\message{Hello world!}}.
+
+\def\dograbuntil#1#2%
+ {\long\def\next##1#1{#2{##1}}\next}
+
+\def\grabuntil#1%
+ {\expandafter\dograbuntil\expandafter{\csname#1\endcsname}}
+
+%D The next command build on this mechanism:
+%D
+%D \starttyping
+%D \processbetween{string}\command
+%D \stoptyping
+%D
+%D Here:
+%D
+%D \starttyping
+%D \processbetween{hello}\message
+%D \starthello Hello again!\stophello
+%D \stoptyping
+%D
+%D leads to: \type{\message{Hello again!}}. The command
+%D
+%D \starttyping
+%D \gobbleuntil{sequence}
+%D \stoptyping
+%D
+%D is related to these commands. This one simply throws away
+%D everything preceding \type{\command}.
+
+\long\def\processbetween#1#2%
+ {\setvalue{\s!start#1}{\grabuntil{\s!stop#1}{#2}}}
+
+\def\gobbleuntil#1%
+ {\long\def\next##1#1{}\next}
+
+\def\gobbleuntilrelax#1\relax
+ {}
+
+%D The next one simply expands the pickup up tokens.
+%D
+%D \starttyping
+%D \processuntil{sequence}
+%D \stoptyping
+
+\def\processuntil#1%
+ {\long\def\next##1#1{##1}\next}
+
+%D \macros
+%D {groupedcommand}
+%D
+%D Commands often manipulate argument as in:
+%D
+%D \starttyping
+%D \def\doezomaarwat#1{....#1....}
+%D \stoptyping
+%D
+%D A disadvantage of this approach is that the tokens that
+%D form \type{#1} are fixed the the moment the argument is read
+%D in. Normally this is no problem, but for instance verbatim
+%D environments adapt the \CATCODES\ of characters and therefore
+%D are not always happy with already fixed tokens.
+%D
+%D Another problem arises when the argument is grouped not by
+%D \type{{}} but by \type{\bgroup} and \type{\egroup}. Such an
+%D argument fails, because the \type{\bgroup} is een as the
+%D argument (which is quite normal).
+%D
+%D The next macro offers a solution for both unwanted
+%D situations:
+%D
+%D \starttyping
+%D \groupedcommand {before} {after}
+%D \stoptyping
+%D
+%D Which can be used like:
+%D
+%D \starttyping
+%D \def\cite%
+%D {\groupedcommand{\rightquote\rightquote}{\leftquote\leftquote}}
+%D \stoptyping
+%D
+%D This command is equivalent to, but more 'robust' than:
+%D
+%D \starttyping
+%D \def\cite#1%
+%D {\rightquote\rightquote#1\leftquote\leftquote}
+%D \stoptyping
+%D
+%D \starttyping
+%D \def\rightword%
+%D {\groupedcommand{\hfill\hbox}{\parfillskip\!!zeropoint}}
+%D
+%D .......... \rightword{the right way}
+%D \stoptyping
+%D
+%D Here \TEX\ typesets \type{\bf the right way} unbreakable
+%D at the end of the line. The solution mentioned before does
+%D not work here. We also handle
+%D
+%D \starttyping
+%D to be \bold{bold} or not, that's the question
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D to be {\bold bold} or not, that's the question
+%D \stoptyping
+%D
+%D This alternative checks for a \type{\bgroup} token first.
+%D The internal alternative does not accept the box handling
+%D mentioned before, but further nesting works all right. The
+%D extra \type{\bgroup}||\type{\egroup} is needed to keep
+%D \type{\AfterGroup} both into sight and local.
+
+\long\def\HandleGroup#1#2%
+ {\bgroup
+ \long\def\BeforeGroup{\bgroup#1\bgroup\aftergroup\AfterGroup}%
+ \long\def\AfterGroup {#2\egroup\egroup}%
+ \afterassignment\BeforeGroup
+ \let\next=}
+
+\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\aftergroup\AfterGroup#1}%
+ \long\def\AfterGroup {#2\egroup}%
+ \afterassignment\BeforeGroup
+ \let\next=}
+
+% \long\def\HandleNoGroup#1#2%
+% {\long\def\AfterGroup{#2\egroup}%
+% \bgroup\aftergroup\AfterGroup#1}
+
+\def\HandleNoGroup % retrofit into mkii
+ {\ifnum\currentgrouptype=\@@semisimplegroup
+ \expandafter\HandleNoGroupA
+ \else
+ \expandafter\HandleNoGroupB
+ \fi}
+
+\long\def\HandleNoGroupA#1#2%
+ {\long\def\AfterGroup{#2\endgroup}%
+ \begingroup\aftergroup\AfterGroup#1}
+
+\long\def\HandleNoGroupB#1#2%
+ {\long\def\AfterGroup{#2\egroup}%
+ \bgroup\aftergroup\AfterGroup#1}
+
+%D I considered it a nuisance that
+%D
+%D \starttyping
+%D \color[green]
+%D {as grass}
+%D \stoptyping
+%D
+%D was not interpreted as one would expect. This is due to the
+%D fact that \type{\futurelet} obeys blank spaces, and a
+%D line||ending token is treated as a blank space. So the final
+%D implementation became:
+
+\long\unexpanded\def\groupedcommand#1#2%
+ {\doifnextbgroupelse{\HandleGroup{#1}{#2}}{\HandleNoGroup{#1}{#2}}}
+
+\long\unexpanded\def\simplegroupedcommand#1#2%
+ {\doifnextbgroupelse{\HandleSimpleGroup{#1}{#2}}{\HandleNoGroup{#1}{#2}}}
+
+%D Users should be aware of the fact that grouping can
+%D interfere with ones paragraph settings that are executed
+%D after the paragraph is closed. One should therefore
+%D explictly close the paragraph with \type{\par}, else the
+%D settings will be forgotten and not applied. So it's:
+%D
+%D \starttyping
+%D \def\BoldRaggedCenter%
+%D {\groupedcommand{\raggedcenter\bf}{\par}}
+%D \stoptyping
+
+%D \macros
+%D {checkdefined}
+%D
+%D The bigger the system, the greater the change that
+%D user defined commands collide with those that are part of
+%D the system. The next macro gives a warning when a command is
+%D already defined. We considered blocking the definition, but
+%D this is not always what we want.
+%D
+%D \starttyping
+%D \checkdefined {category} {class} {command}
+%D \stoptyping
+%D
+%D The user is warned with the suggestion to use
+%D \type{CAPITALS}. This suggestion is feasible, because
+%D \CONTEXT only defines lowcased macros.
+
+\def\showdefinederror#1#2%
+ {\writestatus\m!systems{#1 #2 replaces a macro, use CAPITALS!}}
+
+\def\checkdefined#1#2#3%
+ {\doifdefined{#3}{\showdefinederror{#2}{#3}}}
+
+%D \macros
+%D {GotoPar,GetPar}
+%D
+%D Typesetting a paragraph in a special way can be done by
+%D first grabbing the contents of the paragraph and processing
+%D this contents grouped. The next macro for instance typesets
+%D a paragraph in boldface.
+%D
+%D \starttyping
+%D \def\remark#1\par%
+%D {\bgroup\bf#1\egroup}
+%D \stoptyping
+%D
+%D This macro has to be called like
+%D
+%D \starttyping
+%D \remark some text ... ending with \par
+%D \stoptyping
+%D
+%D Instead of \type{\par} we can of course use an empty line.
+%D When we started typesetting with \TEX, we already had
+%D produced lots of text in plain \ASCII. In producing such
+%D simple formatted texts, we adopted an open layout, and when
+%D switching to \TEX, we continued this open habit. Although
+%D \TEX\ permits a cramped and badly formatted source, it adds
+%D to confusion and sometimes introduces errors. So we prefer:
+%D
+%D \starttyping
+%D \remark
+%D
+%D some text ... ending with an empty line
+%D \stoptyping
+%D
+%D We are going to implement a mechanism that allows such open
+%D specifications. The definition of the macro handling
+%D \type{\remark} becomes:
+%D
+%D \starttyping
+%D \def\remark%
+%D {\BeforePar{\bgroup\bf}%
+%D \AfterPar{\egroup}%
+%D \GetPar}
+%D \stoptyping
+%D
+%D A macro like \type{\GetPar} can be defined in several
+%D ways. The recent version, the fourth one in a row,
+%D originally was far more complicated, but some functionality
+%D has been moved to other macros.
+%D
+%D We start with the more simple but in some cases more
+%D appropriate alternative is \type{\GotoPar}. This one leaves
+%D \type{\par} unchanged and is therefore more robust. On the
+%D other hand, \type{\AfterPar} is not supported.
+
+\newtoks\BeforePar
+\newtoks\AfterPar
+
+\let\endoflinetoken=^^M
+
+\def\redowithpar\par
+ {\doifnextcharelse\par\redowithpar\dodowithpar}%
+
+\def\dowithpar#1#2%
+ {\def\dodowithpar##1\par{#1##1#2}%
+ \redowithpar\par}
+
+\def\redogotopar\par
+ {\doifnextcharelse\par\redogotopar\dodogotopar}%
+
+\def\dogotopar#1%
+ {\def\dodogotopar{#1}%
+ \redogotopar\par}
+
+\def\GetPar
+ {\expanded
+ {\dowithpar
+ {\the\BeforePar
+ \BeforePar\emptytoks}
+ {\the\AfterPar
+ \BeforePar\emptytoks
+ \AfterPar\emptytoks}}}
+
+\def\GotoPar
+ {\expanded
+ {\dogotopar
+ {\the\BeforePar
+ \BeforePar\emptytoks}}}
+
+%D \macros
+%D {dowithpargument,dowithwargument}
+%D
+%D The next macros are a variation on \type{\GetPar}. When
+%D macros expect an argument, it interprets a grouped sequence
+%D of characters a one token. While this adds to robustness and
+%D less ambiguous situations, we sometimes want to be a bit
+%D more flexible, or at least want to be a bit more tolerant
+%D to user input.
+%D
+%D We start with a commands that acts on paragraphs. This
+%D command is called as:
+%D
+%D \starttyping
+%D \dowithpargument\command
+%D \dowithpargument{\command ... }
+%D \stoptyping
+%D
+%D In \CONTEXT\ we use this one to read in the titles of
+%D chapters, sections etc. The commands responsible for these
+%D activities accept several alternative ways of argument
+%D passing. In these examples, the \type{\par} can be omitted
+%D when an empty line is present.
+%D
+%D \starttyping
+%D \command{...}
+%D \command ... \par
+%D \command
+%D {...}
+%D \command
+%D ... \par
+%D \stoptyping
+
+\def\dowithpargument#1%
+ {\def\nextpar##1 \par{#1{##1}}%
+ \def\nextarg##1{#1{##1}}%
+ \doifnextbgroupelse\nextarg{\doifnextcharelse\par{#1{}}\nextpar}}
+
+%D The \type{p} in the previous command stands for paragraph.
+%D When we want to act upon words we can use the \type{w}
+%D alternative.
+%D
+%D \starttyping
+%D \dowithwargument\command
+%D \dowithwargument{... \command ...}
+%D \stoptyping
+%D
+%D The main difference bwteen two alternatives is in the
+%D handling of \type{\par}'s. This time the space token acts
+%D as a delimiter.
+%D
+%D \starttyping
+%D \command{...}
+%D \command ...
+%D \command
+%D {...}
+%D \command
+%D ...
+%D \stoptyping
+
+\def\dowithwargument#1%
+ {\def\nextwar##1 {#1{##1}}%
+ \def\nextarg##1{#1{##1}}%
+ \doifnextbgroupelse\nextarg\nextwar}
+
+%D \macros
+%D {dorepeat,dorepeatwithcommand}
+%D
+%D When doing repetitive tasks, we stromgly advice to use
+%D \type{\dorecurse}. The next alternative however, suits
+%D better some of the \CONTEXT\ interface commands.
+%D
+%D \starttyping
+%D \dorepeat[n*\command]
+%D \stoptyping
+%D
+%D The value of the used \COUNTER\ can be called within
+%D \type{\command} by \type{\repeater}.
+%D
+%D A slightly different alternative is:
+%D
+%D \starttyping
+%D \dorepeatwithcommand[n*{...}]\command
+%D \stoptyping
+%D
+%D When we call for something like:
+%D
+%D \starttyping
+%D \dorepeatwithcommand[3*{Hello}]\message
+%D \stoptyping
+%D
+%D we get ourselves three \type{\message{Hello}} messages in
+%D a row. In both commands, the \type{n*} is optional. When this
+%D specification is missing, the command executes once.
+
+\def\dorepeatwithcommand[#1]%
+ {\dodorepeatwithcommand#1*\empty*\relax}
+
+\long\def\dodorepeatwithcommand#1*#2#3*#4\relax#5%
+ {\ifx#2\empty\redorepeatwithcommand[#1]#5\else\dododorepeatwithcommand{#1}{#2}{#3}#5\fi}
+
+\long\def\dododorepeatwithcommand#1#2#3#4%
+ {\ifx#2\empty % redundant but gives cleaner extensions
+ #4{#1}%
+ \else\ifnum#1<\zerocount
+ \normalexpanded{\noexpand\dorecurse{\number-\number#1}}{#4{-#2#3}}%
+ \else\ifx#2+%
+ \dorecurse{#1}{#4{#3}}%
+ \else
+ \dorecurse{#1}{#4{#2#3}}%
+ \fi\fi\fi}
+
+\def\redorepeatwithcommand[#1]#2%
+ {#2{#1}}
+
+%D The extension hook permits something like:
+%D
+%D \starttyping
+%D \bgroup
+%D
+%D \catcode`\*=\@@superscript
+%D
+%D \gdef\redorepeatwithcommand[#1]%
+%D {\redodorepeatwithcommand#1*\empty*\relax}
+%D
+%D \long\gdef\redodorepeatwithcommand#1*#2#3*#4\relax#5%
+%D {\dododorepeatwithcommand{#1}{#2}{#3}#5}
+%D
+%D \egroup
+%D \stoptyping
+%D
+%D although one may wonder if changing the catcode of \type {*} is wise.
+
+%D \macros
+%D {normalbgroup,normalgroup}
+%D
+%D No comment.
+
+\let\normalbgroup\bgroup
+\let\normalegroup\egroup
+
+%D \macros
+%D {doifstringinstringelse}
+%D
+%D The next macro is meant for situations where both strings
+%D are macros. This save some unneeded expansion.
+%D
+%D \starttyping
+%D \long\def\doifstringinstringelse#1#2%
+%D {\p!doifinstringelse#1#2%
+%D \@EA\firstoftwoarguments
+%D \else
+%D \@EA\secondoftwoarguments
+%D \fi}
+%D \stoptyping
+%D
+%D A bit faster is:
+
+\def\pp!doifstringinstringelse#1%
+ {\if#1@%
+ \@EA\secondoftwoarguments
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
+
+\long\def\doifstringinstringelse#1#2%
+ {\long\@EA\def\@EA\p!doifstringinstringelse\@EA##\@EA1#1##2##3\war
+ {\pp!doifstringinstringelse##2}%
+ \@EA\@EA\@EA\p!doifstringinstringelse\@EA#2#1@@\war}
+
+%D \macros
+%D {appendtoks,prependtoks,appendtoksonce,prependtoksonce,
+%D doifintokselse,flushtoks,dotoks}
+%D
+%D We use \TOKENLISTS\ sparsely within \CONTEXT, because the
+%D comma separated lists are more suitable for the user
+%D interface. Nevertheless we have:
+%D
+%D \starttyping
+%D (\doglobal) \appendtoks ... \to\tokenlist
+%D (\doglobal) \prependtoks ... \to\tokenlist
+%D (\doglobal) \flushtoks\tokenlist
+%D \dotoks\tokenlist
+%D \stoptyping
+%D
+%D Er worden eerst enkele klad||registers gedefinieerd. These
+%D macros are clones of the ones implemented in page~378 of
+%D Knuth's \TeX book.
+
+\newtoks\@@scratchtoks
+
+\def\appendtoks {\doappendtoks \relax}
+\def\prependtoks {\doprependtoks \relax}
+\def\appendtoksonce {\doappendtoksonce \relax}
+\def\prependtoksonce{\doprependtoksonce\relax}
+
+\def\dodoappendtoks
+ {\dodoglobal\@@toks\@EAEAEA{\@EA\the\@EA\@@toks\the\@@scratchtoks}}
+
+\def\dodoprependtoks
+ {\dodoglobal\@@toks\@EAEAEA{\@EA\the\@EA\@@scratchtoks\the\@@toks}}
+
+\long\def\doappendtoks#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}\dodoappendtoks}
+
+\long\def\doprependtoks#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}\dodoprependtoks}
+
+\long\def\doappendtoksonce#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}%
+ \doifintokselse\@@scratchtoks\@@toks\donothing\dodoappendtoks}
+
+\long\def\doprependtoksonce#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}%
+ \doifintokselse\@@scratchtoks\@@toks\donothing\dodoprependtoks}
+
+%D The test macro:
+
+\def\doifintokselse#1#2% #1 en #2 zijn toks
+ {\edef\asciia{\detokenize\expandafter{\the#1}}%
+ \edef\asciib{\detokenize\expandafter{\the#2}}%
+ \doifstringinstringelse\asciia\asciib}
+
+%D A nice one too:
+
+% {\scratchtoks{abc} \removetoks b\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{abc} \removetoks x\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{} \removetoks x\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{xaa} \removetoks x\from\scratchtoks [\the\scratchtoks]}
+% {\scratchtoks{a\relax b} \removetoks \relax\from\scratchtoks [\showthe\scratchtoks]}
+
+\def\removetoks#1\from#2%
+ {\def\doremovetoks##1#1##2\empty\empty\empty##3\\%
+ {\def\!!stringa{##3}%
+ \ifx\!!stringa\empty#2{##1}\else#2{##1##2}\fi}%
+ \expandafter\doremovetoks\the#2\empty\empty\empty#1\empty\empty\empty\\}
+
+%D Also:
+
+\def\appendetoks #1\to{\normalexpanded{\noexpand\appendtoks #1}\to}
+\def\prependetoks#1\to{\normalexpanded{\noexpand\prependtoks#1}\to}
+
+%D Hm.
+
+\def\flushtoks#1% nb: can reassing to #1 again, hence the indirectness
+ {\@@scratchtoks#1\relax
+ \dodoglobal#1\emptytoks
+ \the\@@scratchtoks\relax}
+
+% better: \def\flushtoks#1{\normalexpanded{\noexpand\dodoglobal#1\emptytoks\the#\relax}}
+
+\let\dotoks\the
+
+%D \macros
+%D {makecounter,pluscounter,minuscounter,
+%D resetcounter,setcounter,countervalue}
+%D
+%D Declaring, setting and resetting \COUNTERS\ can be done
+%D with the next set of commands.
+%D
+%D \starttyping
+%D \makecounter {name}
+%D \pluscounter {name}
+%D \minuscounter {name}
+%D \resetcounter {name}
+%D \setcounter {name} {value}
+%D \countervalue {name}
+%D \stoptyping
+
+\def\makecounter#1%
+ {\global\@EA\let\csname#1\endcsname\zerocountervalue} % see earlier
+
+\def\countervalue#1%
+ {\ifcsname#1\endcsname\csname#1\endcsname\fi}
+
+\def\pluscounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr\csname#1\endcsname+\plusone\relax}}
+
+\def\minuscounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr\csname#1\endcsname-\plusone\relax}}
+
+\def\resetcounter#1%
+ {\global\@EA\let\csname#1\endcsname\zerocountervalue}
+
+\def\setcounter#1#2%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr#2\relax}}
+
+\def\savecounter#1%
+ {\@EA\xdef\csname ! #1 !\endcsname{\the\numexpr\csname#1\endcsname\relax}}
+
+\def\restorecounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr\csname ! #1 !\endcsname\relax}}
+
+%D \macros
+%D {beforesplitstring,aftersplitstring}
+%D
+%D These both commands split a string at a given point in two
+%D parts, so \type{x.y} becomes \type{x} or \type{y}.
+%D
+%D \starttyping
+%D \beforesplitstring test.tex\at.\to\filename
+%D \aftersplitstring test.tex\at.\to\extension
+%D \stoptyping
+%D
+%D The first routine looks (and is indeed) a bit simpler than
+%D the second one. The alternative looking more or less like
+%D the first one did not always give the results we needed.
+%D Both implementations show some insight in the manipulation
+%D of arguments.
+
+\def\beforesplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2#2##3\\%
+ {\def#3{##1}}%
+ \@EA\dosplitstring#1#2#2\\}
+
+\def\aftersplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2@@@##3\\%
+ {\def#3{##2}}%
+ \@EA\dosplitstring#1@@@#2@@@\\}
+
+%D \macros
+%D {splitstring,greedysplitstring}
+%D
+%D A bonus macro.
+
+\def\splitstring#1\at#2\to#3\and#4%
+ {\def\dosplitstring##1#2##2\empty\empty\empty##3\\%
+ {\def#3{##1}%
+ \def\dosplitstring{##3}%
+ \ifx\dosplitstring\empty
+ \let#4\empty
+ \else
+ \def#4{##2}%
+ \fi}%
+ \@EA\dosplitstring#1\empty\empty\empty#2\empty\empty\empty\\}
+
+\def\greedysplitstring#1\at#2\to#3\and#4%
+ {\edef\asciib{#1}%
+ \let\asciic\asciib
+ \let#3\empty
+ \let#4\empty
+ \doloop
+ {\expandafter\splitstring\asciib\at#2\to\asciia\and\asciib
+ \ifx\asciib\empty
+ \exitloop
+ \else
+ % not \edef#3{\ifx#3\empty\else#3#2\fi\asciia} else
+ % /root/path fails because then #3==empty
+ \edef#3{\ifcase\recurselevel\or\else#3#2\fi\asciia}%
+ \let#4\asciib
+ \fi}%
+ \ifx#3\empty\let#3\asciic\fi}
+
+%D \macros
+%D {beforetestandsplitstring,
+%D aftertestandsplitstring,
+%D testandsplitstring}
+
+\def\beforetestandsplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2#2##3##4\\%
+ {\ifx##3\empty\let#3\empty\else\def#3{##1}\fi}%
+ \@EA\dosplitstring#1#2#2\empty\\}
+
+\def\aftertestandsplitstring#1\at#2\to#3%
+ {\def\dosplitstring ##1#2##2@@@##3##4\\%
+ {\ifx##3\empty\let#3\empty\else\def#3{##2}\fi}%
+ \@EA\dosplitstring #1@@@#2@@@\empty\\}
+
+\def\testandsplitstring#1\at#2\to#3\and#4%
+ {\def\dosplitstring##1#2##2#2##3##4\\%
+ {\ifx##3\empty\let#3\empty\let#4\empty\else\def#3{##1}\def#4{##2}\fi}%
+ \@EA\dosplitstring#1#2#2\empty\\}
+
+%D \macros
+%D {removesubstring}
+%D
+%D A first application of the two routines defined above is:
+%D
+%D \starttyping
+%D \removesubstring-\from first-last\to\nothyphenated
+%D \stoptyping
+%D
+%D Which in terms of \TEX\ looks like:
+
+\def\removesubstring#1\from#2\to#3%
+ {\splitstring#2\to\!!stringa\and\!!stringb
+ \dodoglobal#3{\!!stringa\!!stringb}}
+
+%D \macros
+%D {appendtocommalist,prependtocommalist,
+%D addtocommalist,removefromcommalist}
+%D
+%D When working with comma separated lists, one sooner or
+%D later want the tools to append or remove items from such a
+%D list. When we add an item, we first check if it's already
+%D there. This means that every item in the list is unique.
+%D
+%D \starttyping
+%D \addtocommalist {alfa} \name
+%D \addtocommalist {beta} \name
+%D \addtocommalist {gamma} \name
+%D \removefromcommalist {beta} \name
+%D \stoptyping
+%D
+%D These commands can be prefixed with \type{\doglobal}. The
+%D implementation of the second command is more complecated,
+%D because we have to take leading spaces into account. Keep in
+%D mind that users may provide lists with spaces after the
+%D commas. When one item is left, we also have to get rid of
+%D trailing spaces.
+%D
+%D \starttyping
+%D \def\words{alfa, beta, gamma, delta}
+%D \def\words{alfa,beta,gamma,delta}
+%D \stoptyping
+%D
+%D Removing an item takes more time than adding one.
+%D
+%D A fast appending alternative, without any testing, is
+%D also provided:
+%D
+%D \starttyping
+%D \appendtocommalist {something} \name
+%D \prependtocommalist {something} \name
+%D \stoptyping
+%D
+%D This can be implemented as follows:
+%D
+%D \starttyping
+%D \def\appendtocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else % no test on empty
+%D \dodoglobal\edef#2{#2,#1}%
+%D \fi}
+%D
+%D \def\prependtocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else % no test on empty
+%D \dodoglobal\edef#2{#1,#2}%
+%D \fi}
+%D \stoptyping
+%D
+%D The faster alternatives are:
+
+\def\appendtocommalist#1#2%
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}
+
+\def\prependtocommalist#1#2%
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}
+
+\def\addtocommalist#1#2% {item} \cs
+ {\rawdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+\def\pretocommalist#1#2% {item} \cs
+ {\rawdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
+
+\def\robustdoifinsetelse#1#2%
+ {\edef\!!stringa{\detokenize\expandafter{\normalexpanded{#1}}}%
+ \edef\!!stringb{\detokenize\expandafter{\normalexpanded{#2}}}%
+ \rawdoifinsetelse\!!stringa\!!stringb}
+
+\def\robustaddtocommalist#1#2% {item} \cs
+ {\robustdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+\def\robustpretocommalist#1#2% {item} \cs
+ {\robustdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
+
+\def\xsplitstring#1#2% \cs {str}
+ {\def\dosplitstring##1,#2,##2,#2,##3\\%
+ {\edef\!!stringa{\bcleanedupcommalist##1\empty\empty\relax}%
+ \edef\!!stringb{\acleanedupcommalist##2,,\relax}}%
+ \@EA\dosplitstring\@EA,#1,,#2,,#2,\\}
+
+\def\bcleanedupcommalist#1#2#3\relax{\if#1,\else#1\fi\if#2,\else#2\fi#3}
+\def\bcleanedupcommalist#1#2\relax{\if#1,\else#1\fi#2}
+\def\acleanedupcommalist#1,,#2\relax{#1}
+
+\def\removefromcommalist#1#2% to be sped up
+ {\rawdoifinsetelse{#1}#2%
+ {\normalexpanded{\noexpand\xsplitstring\noexpand#2{#1}}%
+ \dodoglobal\edef#2%
+ {\ifx\!!stringa\empty
+ \!!stringb
+ \else
+ \!!stringa\ifx\!!stringb\empty\else,\!!stringb\fi
+ \fi}}
+ \resetglobal}
+
+%D \macros
+%D {substituteincommalist}
+%D
+%D Slow but seldom used, so for the moment we stick to this
+%D implementation.
+%D
+%D \starttyping
+%D \substituteincommalist{old}{new}{list}
+%D \stoptyping
+
+\def\substituteincommalist#1#2#3% old, new, list (slooow)
+ {\edef\!!stringb{#1}%
+ \edef\!!stringd{#2}%
+ \let\!!stringa#3%
+ \let#3\empty
+ \def\dosubstituteincommalist##1%
+ {\edef\!!stringc{##1}%
+ \ifx\!!stringb\!!stringc
+ \ifx\!!stringd\empty\else
+ \edef#3{#3\ifx#3\empty\else,\fi\!!stringd}%
+ \fi
+ \def\docommand####1{\edef#3{#3,####1}}%
+ \else
+ \edef#3{#3\ifx#3\empty\else,\fi##1}%
+ \fi}%
+ \@EA\rawprocesscommacommand\@EA[\!!stringa]\dosubstituteincommalist}
+
+%D A not so useful macro:
+
+\def\dodofrontstrip[#1#2]#3%
+ {\ifx#1\space
+ \def#3{#2}%
+ \else
+ \def#3{#1#2}%
+ \fi}
+
+\def\dofrontstrip#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty \else
+ \@EA\dodofrontstrip\@EA[#1]#1%
+ \fi}
+
+%D \macros
+%D {replaceincommalist}
+%D
+%D The next macro can be used to replace an indexed element
+%D in a commalist:
+%D
+%D \starttyping
+%D \replaceincommalist\MyList{2}
+%D \stoptyping
+%D
+%D Element~2 will be replaced by the current meaning of the macro
+%D \type {\newcommalistelement}. The old meaning is saved in
+%D \type {\commalistelement}. The replacement honors grouped items,
+%D like in:
+%D
+%D \starttyping
+%D \def\MyList{a,b,c,d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,b,c,d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,{b,c},d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,b,c,{d,e,f}} \replaceincommalist\MyList{3}
+%D \stoptyping
+
+\let\newcommalistelement\empty
+
+\def\replaceincommalist#1#2% #1 = commalistelement #2 = position starts at 1
+ {\def\doreplaceincommalist##1%
+ {\ifnum\commalistcounter=#2\relax
+ \ifx\newcommalistelement\empty\else
+ \ifx\newcommalist\empty
+ \let\newcommalist\newcommalistelement
+ \else
+ \@EA\@EA\@EA\def\@EA\@EA\@EA\newcommalist\@EA\@EA\@EA
+ {\@EA\newcommalist\@EA,\newcommalistelement}%
+ \fi
+ \fi
+ \def\commalistelement{##1}%
+ \else
+ \ifx\newcommalist\empty
+ \ifx\nexttoken\bgroup % is known -)
+ \def\newcommalist{{##1}}%
+ \else
+ \def\newcommalist{##1}%
+ \fi
+ \else
+ \ifx\nexttoken\bgroup % is known -)
+ \@EA\def\@EA\newcommalist\@EA{\newcommalist,{##1}}%
+ \else
+ \@EA\def\@EA\newcommalist\@EA{\newcommalist,##1}%
+ \fi
+ \fi
+ \fi
+ \advance\commalistcounter\plusone}%
+ \let\commalistelement\empty
+ \let\newcommalist\empty
+ \commalistcounter\plusone
+ \@EA\processcommalist\@EA[#1]\doreplaceincommalist
+ \dodoglobal\let#1\newcommalist}
+
+%D \macros
+%D {globalprocesscommalist}
+%D
+%D The commalist processing commands are characterized by the
+%D fact that the way they handle expansion as well as the fact
+%D that they can be nested. This makes them kind of useless for
+%D handling comma lists in alignments. In these situations the
+%D next macro can be of use.
+
+\def\globalprocesscommaitem#1,%
+ {\if]#1\else
+ \globalcommacommand{#1}%
+ \expandafter\globalprocesscommaitem
+ \fi}
+
+\def\globalprocesscommalist[#1]#2%
+ {\global\let\globalcommacommand#2%
+ \expandafter\globalprocesscommaitem#1,],}
+
+%D \macros
+%D {withoutpt,PtToCm,
+%D numberofpoints,dimensiontocount}
+%D
+%D We can convert point into centimeters with:
+%D
+%D \starttyping
+%D \PtToCm{dimension}
+%D \stoptyping
+
+{\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\t=\@@other
+ \gdef\WITHOUTPT#1pt{#1}}
+
+\def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+%D The capitals are needed because \type{p} and \type{t} have
+%D \CATCODE~12, while macronames only permit tokens with the
+%D \CATCODE~11. As a result we cannot use the \type{.group}
+%D primitives. Those who want to know more about this kind of
+%D manipulations, we advice to study the \TEX book in detail.
+%D Because this macro does not do any assignment, we can use it
+%D in the following way too.
+
+\def\PtToCm#1%
+ {\withoutpt\the\dimexpr0.0351459804\dimexpr#1\relax\relax cm}
+
+%D We also support:
+%D
+%D \starttyping
+%D \numberofpoints {dimension}
+%D \dimensiontocount {dimension} {\count}
+%D \stoptyping
+%D
+%D Both macros return a rounded number.
+
+% \dimensiontocount{10.49pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.49pt}
+% \dimensiontocount{10.51pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.51pt}
+
+\def\dimensiontocount#1#2{#2\numexpr\dimexpr#1\relax/\maxcard\relax}
+\def\numberofpoints #1{\the\numexpr\dimexpr#1\relax/\maxcard\relax}
+
+%D \macros
+%D {swapdimens,swapmacros}
+%D
+%D Simple but effective are the next two macros. There name
+%D exactly states their purpose. The \type{\scratchdimen} and
+%D \type{\!!stringa} can only be swapped when being the first
+%D argument.
+
+\def\swapdimens#1#2%
+ {\scratchdimen #1\redoglobal #1#2\dodoglobal #2\scratchdimen}
+
+\def\swapmacros#1#2%
+ {\let\!!stringa#1\redoglobal\let#1#2\dodoglobal\let#2\!!stringa}
+
+%D \macros
+%D {pushmacro,popmacro}
+%D
+%D Premature and a bit of beta, we offer:
+%D
+%D \starttyping
+%D \pushmacro\macro
+%D \popmacro\macro
+%D \stoptyping
+%D
+%D Beware: global!
+
+\def\@sl@{@sl@}
+\def\@sg@{@sg@}
+
+\let\@@pushedmacro\empty
+
+\def\globalpushmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \ifcsname\@sg@\@@pushedmacro\endcsname \else
+ \@EA\newcount\csname\@sg@\@@pushedmacro\endcsname
+ \fi
+ \global\advance\csname\@sg@\@@pushedmacro\endcsname \plusone
+ \global\@EA\let\csname\the\csname\@sg@\@@pushedmacro\endcsname\@@pushedmacro\endcsname#1}
+
+\def\globalpopmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \global\@EA\let\@EA#1\csname\the\csname\@sg@\@@pushedmacro\endcsname\@@pushedmacro\endcsname
+ \global\advance\csname\@sg@\@@pushedmacro\endcsname \minusone}
+
+\def\localpushmacro#1% this one can be used to push a value over an \egroup
+ {\xdef\@@pushedmacro{\string#1}%
+ \ifcsname\@sl@\@@pushedmacro\endcsname \else
+ \@EA\newcount\csname\@sl@\@@pushedmacro\endcsname
+ \fi
+ \global\advance\csname\@sl@\@@pushedmacro\endcsname \plusone
+ \global\@EA\let\csname\the\csname\@sl@\@@pushedmacro\endcsname\@@pushedmacro\endcsname#1}
+
+\def\localpopmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \@EA\let\@EA#1\csname\the\csname\@sl@\@@pushedmacro\endcsname\@@pushedmacro\endcsname
+ \global\advance\csname\@sl@\@@pushedmacro\endcsname \minusone }
+
+\let\pushmacro\localpushmacro
+\let\popmacro \localpopmacro
+
+%D \macros
+%D {setlocalhsize}
+%D
+%D Sometimes we need to work with the \type{\hsize} that is
+%D corrected for indentation and left and right skips. The
+%D corrected value is available in \type{\localhsize}, which
+%D needs to be calculated with \type{\setlocalhsize} first.
+%D
+%D \starttyping
+%D \setlocalhsize \hbox to \localhsize{...}
+%D \setlocalhsize[-1em] \hbox to \localhsize{...}
+%D \setlocalhsize[.5ex] \hbox to \localhsize{...}
+%D \stoptyping
+%D
+%D These examples show us that an optional can be used. The
+%D value provided is added to \type{\localhsize}.
+
+\newdimen\localhsize
+
+\def\complexsetlocalhsize[#1]% don't change !
+ {\localhsize\hsize
+ \ifnum\hangafter<\zerocount
+ \advance\localhsize\ifdim\hangindent>\zeropoint-\fi\hangindent
+ \fi
+ \advance\localhsize -\leftskip
+ \advance\localhsize -\rightskip
+ \advance\localhsize #1\relax}
+
+\def\simplesetlocalhsize
+ {\complexsetlocalhsize[\zeropoint]}
+
+\definecomplexorsimple\setlocalhsize
+
+%D \macros
+%D {doifvalue,doifnotvalue,doifelsevalue,
+%D doifnothing,doifsomething,doifelsenothing,
+%D doifvaluenothing,doifvaluesomething,doifelsevaluenothing}
+%D
+%D These long named \type{\if} commands can be used to access
+%D macros (or variables) that are normally accessed by using
+%D \type{\getvalue}. Using these alternatives safes us three
+%D tokens per call. Anyone familiar with the not||values
+%D ones, can derive their meaning from the definitions.
+
+ \def\doifvalue#1{\doif {\csname#1\endcsname}}
+ \def\doifnotvalue#1{\doifnot {\csname#1\endcsname}}
+ \def\doifelsevalue#1{\doifelse{\csname#1\endcsname}}
+
+ \def\doifnothing#1{\doif {#1}{}}
+ \def\doifsomething#1{\doifnot {#1}{}}
+ \def\doifelsenothing#1{\doifelse{#1}{}}
+
+ \def\doifvaluenothing#1{\doif {\csname#1\endcsname}{}}
+ \def\doifvaluesomething#1{\doifnot {\csname#1\endcsname}{}}
+\def\doifelsevaluenothing#1{\doifelse{\csname#1\endcsname}{}}
+
+%D Faster but spoiling inheritance (copying parameters):
+%D
+%D \starttyping
+%D \def\doifelsevaluesomething#1#2#3%
+%D {\expandafter\ifx\csname#1\endcsname\empty#3\else#2\fi}
+%D
+%D \def\doifvaluesomething#1#2%
+%D {\expandafter\ifx\csname#1\endcsname\empty\else#2\fi}
+%D
+%D \def\doifvaluenothing#1#2%
+%D {\expandafter\ifx\csname#1\endcsname\empty#2\fi}
+%D \stoptyping
+%D
+%D Slightly more efficient:
+
+ \def\doifnothing{\doif \empty}
+ \def\doifsomething{\doifnot \empty}
+\def\doifelsenothing{\doifelse\empty}
+
+%D The somewhat faster alternatives are:
+
+\long\def\doifvalue#1#2%
+ {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifnotvalue#1#2%
+ {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelsevalue#1#2%
+ {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\long\def\doifnothing#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifsomething#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelsenothing#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\long\def\doifsomethingelse#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\long\def\doifvaluenothing#1%
+ {\edef\!!stringa{\csname#1\endcsname}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifvaluesomething#1%
+ {\edef\!!stringa{\csname#1\endcsname}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelsevaluenothing#1%
+ {\edef\!!stringa{\csname#1\endcsname}%
+ \ifx\!!stringa\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifemptyelsevalue, doifemptyvalue, doifnotemptyvalue}
+%D
+%D Also handy:
+
+\def\doifemptyelsevalue#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifemptyvalue#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotemptyvalue#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {doifallcommonelse}
+%D
+%D A complete match of two sets can be tested with
+%D \type {\doifallcommonelse}, where the first two
+%D arguments are sets.
+
+\def\@@doifallcommonelse#1#2#3#4% slow
+ {\def\p!docommoncheck##1%
+ {\doifnotinset{##1}{#4}\donefalse
+ \ifdone\else\expandafter\quitcommalist\fi}%
+ \donetrue
+ \processcommalist[#3]\p!docommoncheck
+ \ifdone\expandafter#1\else\expandafter#2\fi}
+
+\def\doifallcommonelse
+ {\@@doifallcommonelse\firstoftwoarguments\secondoftwoarguments}
+
+\def\doifallcommon
+ {\@@doifallcommonelse\firstofonearguments\gobbleoneargument}
+
+\def\doifnotallcommon
+ {\@@doifallcommonelse\gobbleoneargument\firstofonearguments}
+
+%D \macros
+%D {DOIF,DOIFELSE,DOIFNOT}
+%D
+%D \TEX\ is case sensitive. When comparing arguments, this
+%D feature sometimes is less desirable, for instance when we
+%D compare filenames. The next three alternatives upcase their
+%D arguments before comparing them.
+%D
+%D \starttyping
+%D \DOIF {string1} {string2} {...}
+%D \DOIFNOT {string1} {string2} {...}
+%D \DOIFELSE {string1} {string2} {then ...}{else ...}
+%D \stoptyping
+%D
+%D We have to use a two||step implementation, because the
+%D expansion has to take place outside \type{\uppercase}.
+
+\def\p!DOIF#1#2%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\p!DOIFNOT#1#2%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\p!DOIFELSE#1#2%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\p!DOIFINSTRINGELSE#1#2%
+ {\uppercase{\ifinstringelse{#1}{#2}}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\DOIF {\ExpandBothAfter\p!DOIF}
+\def\DOIFNOT {\ExpandBothAfter\p!DOIFNOT}
+\def\DOIFELSE {\ExpandBothAfter\p!DOIFELSE}
+\def\DOIFINSTRINGELSE {\ExpandBothAfter\p!DOIFINSTRINGELSE}
+
+%D \macros
+%D {dosingleargumentwithset,
+%D dodoubleargumentwithset,dodoubleemptywithset,
+%D dotripleargumentwithset,dotripleemptywithset}
+%D
+%D These maybe too mysterious macros enable us to handle more
+%D than one setup at once.
+%D
+%D \starttyping
+%D \dosingleargumentwithset \command[#1]
+%D \dodoubleargumentwithset \command[#1][#2]
+%D \dotripleargumentwithset \command[#1][#2][#3]
+%D \dodoubleemptywithset \command[#1][#2]
+%D \dotripleemptywithset \command[#1][#2][#3]
+%D \stoptyping
+%D
+%D The first macro calls \type{\command[##1]} for each string
+%D in the set~\type{#1}. The second one calls for
+%D \type{\commando[##1][#2]} and the third, well one may guess.
+%D These commands support constructions like:
+%D
+%D \starttyping
+%D \def\dodefinesomething[#1][#2]%
+%D {\getparameters[\??xx#1][#2]}
+%D
+%D \unexpanded\def\definesomething%
+%D {\dodoubleargumentwithset\dodefinesomething}
+%D \stoptyping
+%D
+%D Which accepts calls like:
+%D
+%D \starttyping
+%D \definesomething[alfa,beta,...][variable=...,...]
+%D \stoptyping
+%D
+%D Now a whole bunch of variables like \type{\@@xxalfavariable}
+%D and \type{\@@xxbetavariable} is defined.
+
+\def\dodoublewithset[#1][#2]%
+ {\doifsomething{#1}
+ {\def\@@dodowithsetcommand##1{\@@dowithsetcommand[##1][#2]}%
+ \processcommalist[#1]\@@dodowithsetcommand}}
+
+\def\dotriplewithset[#1][#2][#3]%
+ {\doifsomething{#1}
+ {\def\@@dodowithsetcommand##1{\@@dowithsetcommand[##1][#2][#3]}%
+ \processcommalist[#1]\@@dodowithsetcommand}}
+
+\def\dodoubleemptywithset #1{\let\@@dowithsetcommand#1\dodoubleempty \dodoublewithset} % \command
+\def\dodoubleargumentwithset#1{\let\@@dowithsetcommand#1\dodoubleargument\dodoublewithset} % \command
+
+\def\dotripleemptywithset #1{\let\@@dowithsetcommand#1\dotripleempty \dotriplewithset} % \command
+\def\dotripleargumentwithset#1{\let\@@dowithsetcommand#1\dotripleargument\dotriplewithset} % \command
+
+%D \macros
+%D {stripcharacters,stripspaces}
+%D
+%D The next command was needed first when we implemented
+%D the \CONTEXT\ interactivity macros. When we use labeled
+%D destinations, we often cannot use all the characters we
+%D want. We therefore strip some of the troublemakers, like
+%D spaces, from the labels before we write them to the
+%D \DVI||file, which passes them to for instance a PostScript
+%D file.
+%D
+%D \starttyping
+%D \stripspaces\from\one\to\two
+%D \stoptyping
+%D
+%D Both the old string \type{\one} and the new one \type{\two}
+%D are expanded. This command is a special case of:
+%D
+%D \starttyping
+%D \stripcharacter\char\from\one\to\two
+%D \stoptyping
+%D
+%D As we can see below, spaces following a control sequence are
+%D to enclosed in \type{{}}.
+
+\def\stripcharacter#1\from#2\to#3%
+ {\def\dostripcharacter##1#1##2\end
+ {\edef\!!strippedstring{\!!strippedstring##1}%
+ \doifnotempty{##2}{\dostripcharacter##2\end}}%
+ \let\!!strippedstring\empty
+ \edef\!!stringa{#2}%
+ \@EA\dostripcharacter\!!stringa#1\end
+ \dodoglobal\let#3\!!strippedstring}
+
+\def\stripspaces\from#1\to#2% will become \unspacestring#1\from#2
+ {\stripcharacter{ }\from#1\to#2}
+
+%D \macros
+%D {unspacestring}
+%D
+%D The next macro does the same but is more compatible with other macros,
+%D like \type {\convert...}.
+
+\def\unspacestring#1\to#2%
+ {\stripcharacter{ }\from#1\to#2}
+
+%D \macros
+%D {executeifdefined}
+%D
+%D \CONTEXT\ uses one auxiliary file for all data concerning
+%D tables of contents, references, two||pass optimizations,
+%D sorted lists etc. This file is loaded as many times as
+%D needed. During such a pass we skip the commands thate are of
+%D no use at that moment. Because we don't want to come into
+%D trouble with undefined auxiliary commands, we call the
+%D macros in a way similar to \type{\getvalue}. The next macro
+%D take care of such executions and when not defined, gobbles
+%D the unwanted arguments.
+%D
+%D \starttyping
+%D \executeifdefined{name}\gobbleoneargument
+%D \stoptyping
+%D
+%D We can of course gobble more arguments using the
+%D appropriate gobbling command.
+
+\newif\ifexecuted % general purpose
+
+\def\executeifdefined#1% #2 / never change this one again
+ {\ifcsname#1\endcsname
+ \csname#1\expandafter\expandafter\expandafter\endcsname\expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D This one also has the advantage that it is fully
+%D expandable and that it can be used after an assignment.
+
+%D \macros
+%D {doifsomespaceelse}
+%D
+%D The next command checks a string on the presence of a space
+%D and executed a command accordingly.
+%D
+%D \starttyping
+%D \doifsomespaceelse {tekst} {then ...} {else ...}
+%D \stoptyping
+%D
+%D We use this command in \CONTEXT\ for determing if an
+%D argument must be broken into words when made interactive.
+%D Watch the use of \type{\noexpand}.
+
+%D Is this one still needed?
+
+\def\p!doifsomespaceelse#1 #2#3\war{\if\noexpand#2@}
+
+\long\def\doifsomespaceelse#1% % #2#3%
+ {\p!doifsomespaceelse#1 @ @\war % #3\else#2\fi}
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {adaptdimension,balancedimensions}
+%D
+%D Again we introduce some macros that are closely related to
+%D an interface aspect of \CONTEXT. The first command can be
+%D used to adapt a \DIMENSION.
+%D
+%D \starttyping
+%D \adaptdimension {dimension} {value}
+%D \stoptyping
+%D
+%D When the value is preceed by a \type{+} or minus, the
+%D dimension is advanced accordingly, otherwise it gets the
+%D value.
+
+\def\doadaptdimension#1#2\\#3\\%
+ {\if#1+%
+ \dodoglobal\advance
+ \else\if#1-%
+ \dodoglobal\advance
+ \else
+ \dodoglobal
+ \fi\fi
+ #3 #1#2\relax}
+
+\def\adaptdimension#1#2%
+ {\expandafter\doadaptdimension#2\\#1\\}
+
+%D A second command takes two \DIMENSIONS. Both are adapted,
+%D depending on the sign of the given value.
+%D maat. This time we take the value as it is, and don't look
+%D explicitly at the preceding sign.
+%D
+%D \starttyping
+%D \balancedimensions {dimension 1} {dimension 2} {value}
+%D \stoptyping
+%D
+%D When a positive value is given, the first dimension is
+%D incremented, the second ond is decremented. A negative value
+%D has the opposite result.
+
+\def\balancedimensions#1#2#3%
+ {\scratchdimen#3\relax
+ \redoglobal\advance#1 \scratchdimen
+ \dodoglobal\advance#2 -\scratchdimen}
+
+%D Both commands can be preceded by \type{\doglobal}. Here we
+%D use \type{\redo} first, because \type{\dodo} resets the
+%D global character.
+
+%D \macros
+%D {processseparatedlist}
+%D
+%D Maybe a bit late, but here is a more general version of the
+%D \type{\processcommalist} command. This time we don't handle
+%D nesting but accept arbitrary seperators.
+%D
+%D \starttyping
+%D \processseparatedlist[list][separator]\command
+%D \stoptyping
+%D
+%D One can think of things like:
+%D
+%D \starttyping
+%D \processseparatedlist[alfa+beta+gamma][+]\message
+%D \stoptyping
+%D
+%D We want to handle all situations, like:
+%D
+%D \startbuffer
+%D \processseparatedlist[{aap noot}] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[{aap} {noot}][ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[aap {noot}] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[aap noot] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D Therefore we smuggle a \type {\relax} in front of the
+%D argument, which we remove afterwards.
+
+\def\doprocessseparatedlist#1]#2[#3]#4%
+ {\def\dodoprocessseparatedlist##1##2#3%
+ {\def\!!stringa{##2}% suggested by VZ
+ \if]##1%
+ \let\dodoprocessseparatedlist\relax
+ \else\ifx\blankspace\!!stringa
+ #4{##1}%
+ \else\if]##2%
+ \let\dodoprocessseparatedlist\relax
+ \else
+ #4{##1##2}%
+ \fi\fi\fi
+ \dodoprocessseparatedlist}%
+ \@EA\dodoprocessseparatedlist\gobbleoneargument#1#3]#3}
+
+\def\processseparatedlist[%
+ {\doprocessseparatedlist\relax}
+
+%D \macros
+%D {processlist}
+%D
+%D An even more general list processing macro is the
+%D following one:
+%D
+%D \starttyping
+%D \processlist{beginsym}{endsym}{separator}\docommand list
+%D \stoptyping
+%D
+%D This one supports arbitrary open and close symbols as well
+%D as user defined separators.
+%D
+%D \starttyping
+%D \processlist(){=>}\docommand(a=>b=>c=>d)
+%D \stoptyping
+
+\long\def\processlist#1#2#3#4% no blank skipping !
+ {\def\doprocesslist##1#2%
+ {\def\dodoprocesslist####1####2#3%
+ {\ifx#2####1%
+ \let\dodoprocesslist\relax
+ \else\ifx#2####2%
+ \let\dodoprocesslist\relax
+ \else
+ #4{####1####2}%
+ \fi\fi
+ \dodoprocesslist}%
+ \expandafter\dodoprocesslist\gobbleoneargument##1#3#2#3}%
+ \def\dodoprocesslist#1%
+ {\doprocesslist\relax}%
+ \dodoprocesslist}
+
+%D \macros
+%D {processassignlist}
+%D
+%D Is possible to combine an assignment list with one
+%D containing keywords. Assignments are treated accordingly,
+%D keywords are treated by \type{\command}.
+%D
+%D \starttyping
+%D \processassignlist[...=...,...=...,...]\commando
+%D \stoptyping
+%D
+%D This command can be integrated in \type{\getparameters}, but
+%D we decided best not to do so.
+
+\def\processassignlist#1[#2]#3%
+ {\def\p!dodogetparameter[##1=##2=##3]%
+ {\doifnot{##3}\relax{#3{##1}}}%
+ \def\p!dogetparameter##1%
+ {\p!dodogetparameter[##1==\relax]}%
+ \processcommalist[#2]\p!dogetparameter}
+
+%D \macros
+%D {untextargument
+%D untexcommand}
+%D
+%D When manipulating data(bases) and for instance generating
+%D index entries, the next three macros can be of help:
+%D
+%D \starttyping
+%D \untextargument{...}\to\name
+%D \untexcommand {...}\to\name
+%D \stoptyping
+%D
+%D They remove braces and backslashes and give us something to
+%D sort.
+
+\def\untexsomething
+ {\begingroup
+ \catcode`\{=\@@ignore
+ \catcode`\}=\@@ignore
+ \escapechar\minusone
+ \dountexsomething}
+
+\long\def\dountexsomething#1#2\to#3%
+ {\doglobal#1#2\to\untexedargument
+ \endgroup
+ \let#3\untexedargument}
+
+\def\untexargument{\untexsomething\convertargument}
+\def\untexcommand {\untexsomething\convertcommand}
+
+%D \macros
+%D {ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints}
+%D
+%D One characteristic of \POSTSCRIPT\ and \PDF\ is that both
+%D used big points (\TEX's bp). The next macros convert points
+%D and scaled points into big points.
+%D
+%D \starttyping
+%D \ScaledPointsToBigPoints {number} \target
+%D \ScaledPointsToWholeBigPoints {number} \target
+%D \stoptyping
+%D
+%D The magic factor $72/72.27$ can be found in most \TEX\
+%D related books.
+
+% \PointsToBigPoints{10.53940pt}\test \test
+% \PointsToBigPoints{10.53941pt}\test \test
+% \PointsToBigPoints{10.53942pt}\test \test
+
+% \PointsToWholeBigPoints{10.53940pt}\test \test
+% \PointsToWholeBigPoints{10.53941pt}\test \test
+% \PointsToWholeBigPoints{10.53942pt}\test \test
+
+\def\PointsToBigPoints#1#2%
+ {\edef#2{\withoutpt\the\dimexpr.996264\dimexpr#1\relax\relax}}
+
+\def\PointsToWholeBigPoints#1#2%
+ {\edef#2{\the\numexpr\dimexpr.996264\dimexpr#1\relax\relax/\maxcard\relax}}
+
+\def\ScaledPointsToBigPoints #1{\PointsToBigPoints {\number#1\scaledpoint}}
+\def\ScaledPointsToWholeBigPoints#1{\PointsToWholeBigPoints{\number#1\scaledpoint}}
+
+%D \macros
+%D {PointsToReal}
+%D
+%D Points can be stripped from their suffix by using
+%D \type{\withoutpt}. The next macro enveloppes this macro.
+%D
+%D \starttyping
+%D \PointsToReal {dimension} \target
+%D \stoptyping
+
+\def\PointsToReal#1#2%
+ {\scratchdimen#1%
+ \edef#2{\withoutpt\the\scratchdimen}}
+
+%D \macros
+%D {dontleavehmode}
+%D
+%D Sometimes when we enter a paragraph with some command, the
+%D first token gets the whole first line. We can prevent this
+%D by saying:
+%D
+%D \starttyping
+%D \dontleavehmode
+%D \stoptyping
+%D
+%D This command is used in for instance the language module
+%D \type{lang-ini}. The first version was:
+%D
+%D \starttyping
+%D \def\dontleavehmode{\ifhmode\else\ifmmode\else$ $\fi\fi}
+%D \stoptyping
+%D
+%D Next, Taco came with a better alternative (using mathsurround):
+%D
+%D \starttyping
+%D \def\dontleavehmode
+%D {\ifhmode\else \ifmmode\else
+%D {\mathsurround\zeropoint\everymath\emptytoks$ $}%
+%D \fi \fi}
+%D \stoptyping
+%D
+%D And finaly we got the following alternative, one that avoids
+%D interfering grouping at the cost of a box.
+
+\newbox\@@dlhbox
+
+\unexpanded \def\dontleavehmode
+ {\ifhmode\else \ifmmode\else
+ \setbox\@@dlhbox\hbox{\mathsurround\zeropoint\everymath\emptytoks$ $}\unhbox\@@dlhbox
+ \fi \fi}
+
+%D But, if you run a recent version of \TEX, we can use the new
+%D primitive:
+
+\ifdefined\normalquitvmode \let\dontleavehmode\normalquitvmode \fi
+
+%D \macros
+%D {uppercasestring,lowercasestring}
+%D
+%D The names tell what they do:
+%D
+%D \starttyping
+%D \uppercasestring somestring\to\somestring
+%D \lowercasestring somestring\to\somestring
+%D \stoptyping
+%D
+%D the first argument may be a \type{\macro}.
+
+\def\uppercasestring#1\to#2% first @EA redundant
+ {\uppercase\@EA{\@EA\dodoglobal\@EA\edef\@EA#2\@EA{\normalexpanded{#1}}}}
+
+\def\lowercasestring#1\to#2% first @EA redundant
+ {\lowercase\@EA{\@EA\dodoglobal\@EA\edef\@EA#2\@EA{\normalexpanded{#1}}}}
+
+%D \macros
+%D {handletokens}
+%D
+%D With the next macro we enter a critical area of macro
+%D expansion. What we want is a macro that looks like:
+%D
+%D \starttyping
+%D \handletokens some tokens\with \somemacro
+%D \stoptyping
+%D
+%D A bonus example:
+%D
+%D \starttyping
+%D \hbox{\handletokens tekst en meer tekst\with\ruledhbox}
+%D
+%D \def\weetikveel#1{\if#1\blankspace\space\else\ruledhbox{#1}\fi}
+%D
+%D \hbox{\handletokens tekst en meer tekst\with\weetikveel}
+%D \stoptyping
+
+%D \macros
+%D {counttoken,counttokens}
+%D
+%D For the few occasions that we want to know the number of
+%D specific tokens in a string, we can use:
+%D
+%D \starttyping
+%D \counttoken token\in string\to \somecount
+%D \counttokens string\to \somecount
+%D \stoptyping
+%D
+%D This macro, that for instance is used in \type{cont-tab},
+%D takes a real counter. The macro can be preceded by \type
+%D {\doglobal}.
+
+\def\counttoken#1\in#2\to#3%
+ {\scratchcounter\zerocount
+ \def\!!stringa{#1}%
+ \def\!!stringb{\end}%
+ \def\docounttoken##1% obeys {}
+ {\def\!!stringc{##1}%
+ \ifx\!!stringb\!!stringc \else
+ \ifx\!!stringa\!!stringc
+ \advance\scratchcounter\plusone
+ \fi
+ \expandafter\docounttoken
+ \fi}%
+ \docounttoken#2\end
+ \dodoglobal#3\scratchcounter}
+
+\def\counttokens#1\to#2%
+ {\scratchcounter\zerocount
+ \def\docounttoken##1{\advance\scratchcounter\plusone}%
+ \handletokens#1\with\docounttoken
+ \dodoglobal#2\scratchcounter}
+
+%D \macros
+%D {splitofftokens}
+%D
+%D Running this one not always gives the expected results.
+%D Consider for instance the macro for which I originally
+%D wrote this token handler.
+
+\long\def\splitofftokens#1\from#2\to#3% slow but hardly used
+ {\ifnum#1>\zerocount
+ \scratchcounter#1\relax
+ \def\dosplitofftokens##1%
+ {\ifnum\scratchcounter>\zerocount
+ \advance\scratchcounter \minusone
+ \edef#3{#3##1}%
+ \fi}%
+ % \let#3\empty % #3 can be #2, so:
+ \@EA\let\@EA#3\@EA\empty
+ \@EA\handletokens#2\with\dosplitofftokens
+ \else
+ \edef#3{#2}%
+ \fi}
+
+%D This macro can be called like:
+%D
+%D \startbuffer[example]
+%D \splitofftokens10\from01234567 890123456789\to\test [\test]
+%D \stopbuffer
+%D
+%D However, the characters that we expect to find in
+%D \type{\test} just don't show up there. The reason for this
+%D is not that logical but follows from \TEX's sometimes
+%D mysterious way of expanding. Look at this:
+%D
+%D \startbuffer[next]
+%D \def\next{a} \edef\test{\next} [\test]
+%D \let\next=b \edef\test{\test\next} [\test]
+%D \let\next=c \edef\test{\next} [\test]
+%D \let\next=d \edef\test{\test\next} [\test]
+%D \let\next=e \@EA\edef\@EA\test\@EA{\test\next} [\test]
+%D \stopbuffer
+%D
+%D \typebuffer[next]
+%D
+%D Careful reading shows that inside an \type{\edef} macro's
+%D that are \type{\let} are not expanded!
+%D
+%D \unprotect\getbuffer[next]\protect
+%D
+%D That's why we finally end up with a macro that looks
+%D ahead by using an assignment, this time by using \type
+%D {\futurelet}, and grabbing an argument as well. That
+%D way we can handle the sentinal, a blank space and grouped
+%D tokens.
+
+\def\dohandletokens % \nexthandledtoken is part of interface
+ {\futurelet\nexthandledtoken\dodohandletokens}
+
+\long\def\handletokens#1\with#2%
+ {\gdef\dododohandletokens{#2}% permits more complex #2's
+ \dohandletokens#1\end}
+
+\def\dodohandletokens
+ {\ifx\nexthandledtoken\blankspace
+ \expandafter\dodohandletokensone
+ \else\ifx\nexthandledtoken\end
+ \expandafter\expandafter\expandafter\gobbletwoarguments % also gobble the \end
+ \else
+ \expandafter\expandafter\expandafter\dodohandletokenstwo
+ \fi\fi *}
+
+\def\dodohandletokensone * %
+ {\dododohandletokens{ }\dohandletokens}
+
+\long\def\dodohandletokenstwo *#1%
+ {\dododohandletokens{#1}\dohandletokens}
+
+%D This macro is tested on:
+%D
+%D \def\xxx#1{[#1]}
+%D
+%D \startlines
+%D \handletokens abc\with\xxx
+%D \handletokens a b c\with\xxx
+%D \handletokens a b c\with\xxx
+%D \handletokens a{bc}d\with\xxx
+%D \handletokens a\space bc \with\xxx
+%D \stoplines
+%D
+%D And our previous example shows up as:
+%D
+%D \getbuffer[example]
+
+%D \macros
+%D {iftrialtypesetting, ifvisible}
+%D
+%D The next boolean is at first sight a strange one. Sometimes
+%D one does a trial typesetting run, for instance to determine
+%D dimensions. Some mechanisms, like object inclusion, can fail
+%D on such trials. Temporary setting the next boolean to true,
+%D helps a lot. The second boolena can be used to inhibit
+%D processing completely.
+
+\newif\iftrialtypesetting \trialtypesettingfalse
+\newif\ifvisible \visibletrue
+
+%D \macros
+%D {startlocal, startglobal}
+%D
+%D The next four macros are rather self explaining:
+%D
+%D \starttyping
+%D \startlocal
+%D whatever assignments
+%D \stoplocal
+%D
+%D \startglobal
+%D whatever assignments
+%D \stopglobal
+%D \stoptyping
+%D
+%D These macros are meant for those who know the difference
+%D between local and global assignments and are aware of the
+%D possible unwanted side effect
+
+\def\dostartglobaldefs#1#2%
+ {\scratchcounter\globaldefs
+ \ifnum\globaldefs#1\zerocount
+ \globaldefs-\globaldefs
+ \fi
+ \advance\globaldefs#2\plusone
+ \expandafter\chardef\csname@gd@\the\globaldefs\endcsname\scratchcounter}
+
+\def\dostopglobaldefs
+ {\globaldefs\ifcsname @gd@\the\globaldefs\endcsname\zerocount}
+
+\unexpanded\def\startlocal {\dostartglobaldefs>-}
+\unexpanded\def\stoplocal {\dostopglobaldefs}
+\unexpanded\def\startglobal {\dostartglobaldefs<+}
+\unexpanded\def\stopglobal {\dostopglobaldefs}
+
+%D \macros
+%D {twodigitrounding}
+%D
+%D When using \type {\special}s or \type {\pdfliteral}s, it
+%D sometimes makes sense to limit the precission. The next
+%D macro rounds a real number to two digits. It takes one
+%D argument and only works in \ETEX.
+
+\def\dointegerrounding #1.#2\relax {#1}
+\def\doonedigitrounding #1.#2#3\relax {\ifx#2*#1\else#1.#2\fi}
+\def\dotwodigitrounding #1.#2#3#4\relax {\ifx#2*#1\else#1.#2#3\fi}
+\def\dothreedigitrounding#1.#2#3#4#5\relax{\ifx#2*#1\else#1.#2#3#4\fi}
+
+\def\integerrounding#1%
+ {\@EA\@EA\@EA\dointegerrounding \@EA\WITHOUTPT\the\dimexpr#1\points+.5\points \relax .\relax}
+\def\onedigitrounding#1%
+ {\@EA\@EA\@EA\doonedigitrounding \@EA\WITHOUTPT\the\dimexpr#1\points+.05\points \relax 00.*0\relax}
+\def\twodigitrounding#1%
+ {\@EA\@EA\@EA\dotwodigitrounding \@EA\WITHOUTPT\the\dimexpr#1\points+.005\points \relax 000.*00\relax}
+\def\threedigitrounding#1%
+ {\@EA\@EA\@EA\dothreedigitrounding\@EA\WITHOUTPT\the\dimexpr#1\points+.0005\points\relax0000.*00\relax}
+
+%D \macros
+%D {processcontent}
+%D
+%D This is the first occasion where \TEX\ and \ETEX\ are no
+%D longer compatible, although in many cases things go ok.
+%D Beware of verbatim, i.e. catcode changes.
+%D
+%D \starttyping
+%D \unexpanded\def\starthans%
+%D {\processcontent{stophans}\test{\message{\test}\wait}}
+%D \stoptyping
+%D
+%D This macro is first used in the tabulation macros.
+
+\def\processcontent#1%
+ {\begingroup\@EA\doprocesscontent\csname#1\endcsname}
+
+\def\doprocesscontent#1#2#3%
+ {\long\def\doprocesscontent##1#1%
+ {\endgroup\long\def#2{##1}#3}%
+ \doprocesscontent}
+
+%D \macros
+%D {dogobblesingleempty, dogobbledoubleempty}
+%D
+%D These two macros savely grab and dispose two arguments.
+
+\def\dogobblesingleempty{\dosingleempty\dodogobblesingleempty}
+\def\dogobbledoubleempty{\dodoubleempty\dodogobbledoubleempty}
+
+\def\dodogobblesingleempty [#1]{}
+\def\dodogobbledoubleempty[#1][#2]{}
+
+\let\gobblesingleempty\dogobblesingleempty % also used
+\let\gobbledoubleempty\dogobbledoubleempty % also used
+
+%D \macros
+%D {sortcommalist,sortcommacommand,
+%D donumericcompare,comparedresult}
+%D
+%D Sometimes we need to sort a commalist, so here is Taco's
+%D solution. This will in many cases be a list that is stored
+%D in a \type{\csname}, so both commalist and commacommands are
+%D supported. The sorting algorithm is very simple, so the list
+%D should not be too long or sorting will be very slow.
+%D
+%D \starttyping
+%D \sortcommalist[10,2,4,5,6,1,2,3,4,10,20]\donumericcompare
+%D
+%D \def\test{10,2,4,5,6,1,2,3,4,10,20}
+%D
+%D \sortcommacommand[\test]\donumericcompare
+%D \stoptyping
+%D
+%D In both cases, the result is available in the macro \type
+%D {\sortedcommalist}.
+%D
+%D Parameter \type{#2} is a macro that should accept two
+%D parameters, and it has to decide which one is larger, by
+%D setting the counter \type{\comparedresult} to~0 (for equal),
+%D 1~(if it's first argument is larger), or~2 (if it's second
+%D argument is larger).
+%D
+%D As said, these macro are largely written by Taco, and are
+%D (maybe therefore) also the first application of \type
+%D {\replaceincommalist}.
+
+\newcount\comparedresult
+
+\def\sortcommacommand[#1]%
+ {\@EA\sortcommalist\@EA[#1]}
+
+\def\sortcommalist[#1]#2%
+ {\getcommalistsize[#1]%
+ \ifnum\commalistsize>1
+ \let\sortedcommalist\empty
+ \let\comparecommand#2%
+ \processcommalist[#1]\dosortcommacommand
+ \else
+ \def\sortedcommalist{#1}%
+ \fi}
+
+\def\dosortcommacommand#1%
+ {\ifx\sortedcommalist\empty
+ \def\sortedcommalist{#1}%
+ \else
+ \def\!!tempa{#1}%
+ \ifx\!!tempa\empty\else
+ \scratchcounter\plusone
+ \@EA\getcommalistsize\@EA[\sortedcommalist]%
+ \@EA\processcommalist\@EA[\sortedcommalist]\docompareitems
+ \fi
+ \fi}
+
+%D All those \type{\expandafter}'s are there because I do not
+%D want to use \type{\edef}.
+
+\def\docompareitems#1%
+ {\doifnotempty{#1}
+ {\@EA\comparecommand\@EA{\!!tempa}{#1}\relax
+ %\ifcase\compareresult % equal
+ \ifnum\comparedresult<2
+ \ifnum\scratchcounter=\commalistsize
+ \@EA\@EA\@EA\def\@EA\@EA\@EA\sortedcommalist
+ \@EA\@EA\@EA{\@EA\sortedcommalist\@EA,\!!tempa}%
+ \fi
+ %\or % new element larger
+ % \ifnum\scratchcounter=\commalistsize
+ % \@EA\@EA\@EA\def\@EA\@EA\@EA\sortedcommalist
+ % \@EA\@EA\@EA{\@EA\sortedcommalist\@EA,\!!tempa}%
+ % \fi
+ \else % old element larger
+ \@EA\def\@EA\newcommalistelement\@EA{\!!tempa,#1}%
+ \replaceincommalist\sortedcommalist\scratchcounter
+ \expandafter\quitcommalist
+ \fi}%
+ \advance\scratchcounter \plusone} % bug, was \minusone
+
+%D The macro \type{\donumericcompare} considers everything
+%D that is not a number to be larger than any number.
+
+% 0: both are equal, 1: #1 is larger, 2: #2 is larger
+
+\def\thenumericcompare#1#2% no \relax es inside hee
+ {\doifnumberelse{#1}
+ {\doifnumberelse{#2}{\ifnum#1>#2 \plusone\else\ifnum#1<#2 \plustwo\else\zerocount\fi\fi}\plustwo}
+ \plusone}
+
+\def\donumericcompare
+ {\comparedresult\thenumericcompare}
+
+%D \macros
+%D {@True, @False, @Not, @And}
+%D
+%D Some predicate logic functions, used in for instance the
+%D math module.
+
+\def\@True {00}
+\def\@False {01}
+\def\@Not #1{0\ifcase#11 \or\@EA 1\else \@EA 0\fi}
+\def\@And #1#2{0\ifcase#1#2 \@EA 0\else \@EA 1\fi}
+
+%D \macros
+%D {setdimensionwithunit, freezedimensionwithunit}
+%D
+%D The next assignments are all valid:
+%D
+%D \starttyping
+%D \setdimensionwithunit\scratchdimen{10} {cm}
+%D \setdimensionwithunit\scratchdimen{10cm}{cm}
+%D \setdimensionwithunit\scratchdimen{10cm}{}
+%D \freezedimensionwithunit\SomeWidth{\textwidth}
+%D \freezedimensionwithunit\SomeDepth{\dp\strutbox}
+%D \stoptyping
+%D
+%D As an alternative for the next macro we can use a global
+%D assignment inside a box. The \type{\empty}'s permits
+%D gobbling while preventing spurious \type{\relax}'s.
+
+\def\setdimensionwithunit#1#2#3% number unit dimension / nice trick
+ {\afterassignment\gobblefourarguments#1=#2#3pt\relax\empty\empty\empty\empty}
+
+\def\freezedimensionwithunit#1#2%
+ {\setdimensionwithunit\scratchdimen#1{#2}\edef#1{\the\scratchdimen}}
+
+%D \macros
+%D {doifsometokselse}
+%D
+%D Not that fast I guess, but here's a way to test for token
+%D registers being empty.
+
+\def\doifsometokselse#1% % #2#3%
+ {\edef\!!stringa{\the#1}%
+ \ifx\!!stringa\empty % #3\else#2\fi}
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {startstrictinspectnextcharacter}
+%D
+%D This one if for Taco's bibliography module:
+
+\let\normalinspectnextcharacter\inspectnextcharacter
+
+\def\strictinspectnextcharacter% no user macro !
+ {\ifx\nexttoken\charactertoken
+ \expandafter\!!stringa
+ \else
+ \expandafter\!!stringb
+ \fi}
+
+% better: push/pop
+
+\unexpanded\def\startstrictinspectnextcharacter
+ {\let\inspectnextcharacter\strictinspectnextcharacter}
+
+\unexpanded\def\stopstrictinspectnextcharacter
+ {\let\inspectnextcharacter\normalinspectnextcharacter}
+
+\def\strictdoifnextoptionalelse#1#2%
+ {\startstrictinspectnextcharacter
+ \doifnextcharelse[{\stopstrictinspectnextcharacter#1}{\stopstrictinspectnextcharacter#2}}
+
+%D \macros
+%D {gobblespacetokens}
+%D
+%D This macro needs a speed-up!
+
+%\def\gobblespacetokens
+% {\doifnextcharelse\empty\donothing\donothing} % no {}\do\do !
+
+\def\gobblespacetokens
+ {\afterassignment\nexttoken\let\nexttoken=}
+
+%D \macros
+%D {verbatimargument}
+%D
+%D As the name says, this macro converts its argument to a
+%D (rather safe) string.
+
+\let\verbatimstring\detokenize
+
+%D These are needed in ordinal number conversions:
+
+\def\lastdigit#1%
+ {\@EA\thelastdigit\number#1\relax}
+
+\def\thelastdigit#1#2%
+ {\ifx#2\relax#1\else\@EA\thelastdigit\@EA#2\fi}
+
+\def\lasttwodigits#1%
+ {\@EA\thelasttwodigits\@EA0\number#1\relax}
+
+\def\thelasttwodigits#1#2#3% 0 dig ... \relax
+ {\ifx#3\relax#1#2\else\@EA\thelasttwodigits\@EA#2\@EA#3\fi}
+
+%D \macros
+%D {serializecommalist}
+%D
+%D Concatenate commalists:
+
+\def\serializecommalist[#1]%
+ {\let\serializedcommalist\empty
+ \def\docommand##1{\edef\serializedcommalist{\serializedcommalist##1}}%
+ \processcommacommand[#1]\docommand}
+
+%D \macros
+%D {purenumber}
+%D
+%D Sometimes we need control over when \TEX\ stops reading a
+%D number, especially in full expandable macros where using
+%D \type {\relax} would lead to disasters.
+%D
+%D \starttyping
+%D \ifodd\purenumber{...}\space ... \else ... \fi
+%D \stoptyping
+%D
+%D Here we use a space as number delimiter in combination
+%D with a space- and relax-less \type {\purenumber}. This
+%D macro works ok with \type {\the}, \type {\number} as well
+%D as \ETEX's \type {\numexpr}.
+
+\def\purenumber#1{\@EA\firstofoneargument\@EA{\number#1}}
+
+%D \macros
+%D {filterfromvalue}
+%D
+%D \starttyping
+%D \setvalue{xx}{{A}{B}{C}}
+%D
+%D \filterfromvalue{xx}{3}{3}
+%D \filterfromvalue{xx}{3}{2}
+%D \filterfromvalue{xx}{3}{1}
+%D \stoptyping
+%D
+%D An alternative is to store 'max' in the list, say:
+%D
+%D \starttyping
+%D \setvalue{xx}{3{A}{B}{C}}
+%D
+%D \filterfromvalues{3}{xx}{3}
+%D \filterfromvalues{3}{xx}{2}
+%D \filterfromvalues{3}{xx}{1}
+%D \stoptyping
+%D
+%D I'll implement this when I'm in \quotation {writing dirty
+%D macros mood}.
+
+\def\dofilterfromstr#1#2% max n % no need to be fast
+ {\expandafter \expandafter \expandafter \strippedcsname
+ \ifcase#1\or \ifcase#2\or
+ \firstofoneargument \else
+ \gobbleoneargument \fi
+ \or \ifcase#2\or
+ \firstoftwoarguments \or
+ \secondoftwoarguments \else
+ \gobbletwoarguments \fi
+ \or \ifcase#2\or
+ \firstofthreearguments \or
+ \secondofthreearguments \or
+ \thirdofthreearguments \else
+ \gobblethreearguments \fi
+ \or \ifcase#2\or
+ \firstoffourarguments \or
+ \secondoffourarguments \or
+ \thirdoffourarguments \or
+ \fourthoffourarguments \else
+ \gobblefourarguments \fi
+ \or \ifcase#2\or
+ \firstoffivearguments \or
+ \secondoffivearguments \or
+ \thirdoffivearguments \or
+ \fourthoffivearguments \or
+ \fifthoffivearguments \else
+ \gobblefivearguments \fi
+ \fi}
+
+\def\filterfromvalue#1#2#3% value max n
+ {\@EA\@EAEAEA\csname % we use the fact that an
+ \@EA\ifx\csname#1\endcsname\relax % undefined cs has become \relax
+ \strippedcsname\gobbleoneargument % which we then gobble here
+ \else
+ \dofilterfromstr{#2}{#3}%
+ \fi
+ \endcsname\csname#1\endcsname}
+
+\def\filterfromnext#1#2% max n {..}{..}{..}{..}
+ {\csname\dofilterfromstr{#1}{#2}\endcsname}
+
+%D \macros
+%D {definemeasure}
+%D
+%D \starttyping
+%D \definemeasure[mywidth][\dimexpr(\textwidth-1cm)]
+%D
+%D ... \measure{mywidth} ...
+%D \stoptyping
+
+\def\??dm{@@dm} % brrr
+
+\unexpanded\def\definemeasure
+ {\dodoubleargument\dodefinemeasure}
+
+\def\dodefinemeasure[#1][#2]%
+ {\expandafter\def\csname\??dm#1\endcsname{#2}}
+
+% #2 could be omitted, but we want to support spaces
+%
+% \setmeasure {x} {1cm}
+% \setmeasure {xx} {1cm}
+% \setmeasure {xxx}{1cm}
+
+\def\setmeasure #1#2{\expandafter\def \csname\??dm#1\endcsname{#2}} % quick way
+\def\setemeasure#1#2{\expandafter\edef\csname\??dm#1\endcsname{#2}} % quick way
+\def\setgmeasure#1#2{\expandafter\gdef\csname\??dm#1\endcsname{#2}} % quick way
+\def\setxmeasure#1#2{\expandafter\xdef\csname\??dm#1\endcsname{#2}} % quick way
+
+\def\measure#1%
+ {\ifcsname\??dm#1\endcsname\csname\??dm#1\endcsname\else\zeropoint\fi}
+
+%D \macros
+%D {doifdimensionelse}
+%D
+%D This is a dirty one: we simply append a unit and discard it when needed.
+
+\def\doifdimensionelse#1%
+ {\afterassignment\dodoifdimensionelse\scratchdimen#1pt\relax}
+
+\def\dodoifdimensionelse#1%
+ {\ifx#1\relax
+ \expandafter\secondoftwoarguments
+ \else % #1=p ... t\relax
+ \expandafter\thirdoffourarguments
+ \fi}
+
+%D Ok, here's another one, slower but seldom used. This one scans the text.
+%D
+%D \starttabulate[|Tc|Tc|]
+%D \NC pt \NC \doifdimenstringelse {pt}{yes}{no} \NC \NR
+%D \NC 12pt \NC \doifdimenstringelse {-12pt}{yes}{no} \NC \NR
+%D \NC 1pt \NC \doifdimenstringelse {1pt}{yes}{no} \NC \NR
+%D \NC 12pt \NC \doifdimenstringelse {12pt}{yes}{no} \NC \NR
+%D \NC 12.0pt \NC \doifdimenstringelse {12.0pt}{yes}{no} \NC \NR
+%D \NC -.12pt \NC \doifdimenstringelse {-.12pt}{yes}{no} \NC \NR
+%D \NC .12pt \NC \doifdimenstringelse {.12pt}{yes}{no} \NC \NR
+%D \NC -12pt \NC \doifdimenstringelse {-12pt}{yes}{no} \NC \NR
+%D \NC -12.0pt \NC \doifdimenstringelse{-12.0pt}{yes}{no} \NC \NR
+%D \NC big \NC \doifdimenstringelse {big}{yes}{no} \NC \NR
+%D \NC 10 \NC \doifdimenstringelse {10}{yes}{no} \NC \NR
+%D \NC 1 \NC \doifdimenstringelse {1}{yes}{no} \NC \NR
+%D \stoptabulate
+
+\def\doifdimenstringelse#1{\normalexpanded{\noexpand\dodimenteststageone#1}\empty\empty]}
+
+\def\dodimenteststageone #1#2{\csname d!1!\ifcsname d!1!#2\endcsname#2\else x\fi\endcsname#2}
+\def\dodimenteststagetwo #1#2{\csname d!2!\ifcsname d!2!#2\endcsname#2\else x\fi\endcsname#2}
+\def\dodimenteststagethree #1]{\csname d!3!\ifcsname d!3!#1\endcsname#1\else x\fi\endcsname}
+
+\expandafter\let\csname d!1!x\endcsname\dodimenteststagethree
+\expandafter\let\csname d!2!x\endcsname\dodimenteststagethree
+\expandafter\let\csname d!3!x\endcsname\secondoftwoarguments
+
+\expandafter\let\csname d!1!.\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!1!,\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!1!1\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!2\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!3\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!4\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!5\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!6\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!7\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!8\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!9\endcsname\dodimenteststageone
+\expandafter\let\csname d!1!0\endcsname\dodimenteststageone
+
+\expandafter\let\csname d!2!1\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!2\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!3\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!4\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!5\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!6\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!7\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!8\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!9\endcsname\dodimenteststagetwo
+\expandafter\let\csname d!2!0\endcsname\dodimenteststagetwo
+
+\expandafter\let\csname d!3!pt\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!pc\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!in\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!bp\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!cm\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!mm\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!dd\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!cc\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!sp\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!ex\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!em\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!nd\endcsname\firstoftwoarguments
+\expandafter\let\csname d!3!nc\endcsname\firstoftwoarguments
+
+%D \macros
+%D {comparedimension,comparedimensioneps}
+%D
+%D This is a dirty one: we simply append a unit and discard it when needed.
+
+\newdimen\roundingeps \roundingeps=10sp
+
+\def\comparedimension#1#2%
+ {\chardef\compresult
+ \ifdim#1<#2%
+ \zerocount
+ \else\ifdim#1<#2%
+ \plusone
+ \else
+ \plustwo
+ \fi\fi}
+
+\def\comparedimensioneps#1#2% todo: use eps feature
+ {\chardef\compresult
+ \ifdim\dimexpr#1-#2\relax<\roudingeps
+ \zerocount
+ \else\ifdim\dimexpr#2-#1\relax<\roudingeps
+ \zerocount
+ \else\ifdim#1<#2%
+ \plusone
+ \else
+ \plustwo
+ \fi\fi\fi}
+
+% % % % % % % % % % % % % % % % % % % % % %
+
+% pretty ugly but fast
+
+% \copycsname xxx\endcsname\csname ..\endcsname
+
+\def\copycsname{\@EA\@EA\@EA\let\@EA\@EA\csname}
+
+% \letcscsname \crap \csname ..\endcsname
+% \letcsnamecs \csname ..\endcsname\crap
+% \letcsnamecsname\csname ..\endcsname\csname ..\endcsname
+
+\def\letcscsname {\@EA\let\@EA}
+\def\letcsnamecs {\@EA\let}
+\def\letcsnamecsname{\@EA\@EA\@EA\let\@EA\@EA}
+
+% another one, add an item to a commalist
+
+\def\addvalue#1#2% cs item
+ {\ifcsname#1\endcsname\else\expandafter\let\csname#1\endcsname\empty\fi
+ \normalexpanded{\noexpand\addtocommalist{#2}\@EA\noexpand\csname#1\endcsname}}
+
+\def\unspaced#1%
+ {\dounspaced#1\end}
+
+\def\dounspaced#1%
+ {\ifx#1\end
+ \@EA\gobbleoneargument
+ \else
+ \ifx#1\blankspace\else#1\fi
+ \fi
+ \dounspaced}
+
+\def\unspaceargument#1\to#2%
+ {\scratchcounter\catcode32\relax
+ \catcode32\@@ignore\scantextokens{\edef#2{#1}}%
+ \catcode32\scratchcounter}
+
+\def\unspaceafter#1#2%
+ {\unspaceargument#2\to\ascii
+ \expandafter#1\expandafter{\ascii}}
+
+% sometimes handy:
+
+\def\doifhasspaceelse#1%
+ {\edef\!!stringa{#1}%
+ \normalexpanded{\noexpand\dodoifhasspaceelse#1\space}\empty\relax}
+
+\def\dodoifhasspaceelse#1 #2#3\relax % \space\empty\relax
+ {\ifx\!!stringa\space
+ \@EA\firstoftwoarguments
+ \else\ifx#2\empty
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
+
+% this will replace loadfile once and alike !!! todo
+
+\def\@flg@{@flg@}
+
+\def\setflag #1{\@EA\dodoglobal\@EA\let\csname\@flg@#1\endcsname\zerocount}
+\def\resetflag#1{\@EA\dodoglobal\@EA\let\csname\@flg@#1\endcsname\plusone}
+
+\let\ifflagged\ifcase
+
+\def\flag#1{\csname\@flg@#1\endcsname}
+
+\def\doifelseflagged#1%
+ {\@EA\ifx\csname\@flg@#1\endcsname\relax
+ \@EA\secondoftwoarguments
+ \else\ifcase\csname\@flg@#1\endcsname
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi\fi}
+
+\def\doifnotflagged#1%
+ {\@EA\ifx\csname\@flg@#1\endcsname\relax
+ \@EA\firstofoneargument
+ \else\ifcase\csname\@flg@#1\endcsname
+ \@EAEAEA\gobbleoneargument
+ \else
+ \@EAEAEA\firstofoneargument
+ \fi\fi}
+
+\def\inheritparameter[#1]#2[#3]#4[#5]% tag tokey fromkey % [bypasses k!prefix]
+ {\@EA\def\csname#1#3\@EA\endcsname\@EA{\csname#1#5\endcsname}}
+
+% \buildarray[test][aa,bb,cc,dd,ee,ff]
+% \setarrayelement{test}{1}{qq}
+% \arrayelement{test}{1}
+% \arraylength{test}
+%
+% \def\buildarray[#1][#2]%
+% {\scratchcounter=0
+% \def\docommand##1%
+% {\advance\scratchcounter by 1
+% \setvalue{@@aa#1\the\scratchcounter}{##1}}%
+% \processcommalist[#2]\docommand
+% \setevalue{@@aa#1}{\the\scratchcounter}}%
+%
+% \def\setarrayelement#1#2{\setvalue{@@aa#1#2}}
+% \def\arrayelement #1#2{\getvalue{@@aa#1#2}}
+% \def\arraylength #1{\getvalue{@@aa#1}}
+
+% \newsignal\junksignal
+%
+% \def\setjunksignal%
+% {\ifhmode
+% \hskip\junksignal
+% \let\removejunkspaces\doremovejunkspaces
+% \else
+% \let\removejunkspaces\relax
+% \fi}
+%
+% \def\doremovejunkspaces%
+% {\doloop{\ifdim\lastskip=\junksignal\unskip\else\exitloop\fi}}
+
+\def\dodoifnonzeropositiveelse#1#2\end % #3#4%
+ {\ifx#1\relax
+ \ifcase\scratchcounter
+ \endgroup
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \endgroup
+ \@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \endgroup
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\doifnonzeropositiveelse#1%
+ {\begingroup\afterassignment\dodoifnonzeropositiveelse\scratchcounter=0#1\relax\empty\end}
+
+% here ?
+
+\def\dosetrawvalue #1#2#3{\@EA \def\csname#1#2\endcsname{#3}}
+\def\dosetrawevalue#1#2#3{\@EA\edef\csname#1#2\endcsname{#3}}
+\def\dosetrawgvalue#1#2#3{\@EA\gdef\csname#1#2\endcsname{#3}}
+\def\dosetrawxvalue#1#2#3{\@EA\xdef\csname#1#2\endcsname{#3}}
+
+\def\getrawparameters {\dogetparameters\dosetrawvalue }
+\def\getraweparameters {\dogetparameters\dosetrawevalue}
+\def\getrawgparameters {\dogetparameters\dosetrawgvalue}
+\def\getrawxparameters {\dogetparameters\dosetrawxvalue}
+
+\def\globalgetrawparameters{\dogetparameters\dosetrawgvalue} % obsolete
+
+\def\splitskip#1%
+ {\scratchskip#1\relax
+ \dimen0\scratchskip
+ \dimen2\gluestretch\scratchskip
+ \dimen4\glueshrink\scratchskip}
+
+\newcount\modcounter
+
+\def\dosetmodulo#1#2#3%
+ {\modcounter#1\divide\modcounter#2\multiply\modcounter#2%
+ #3#1\advance#3-\modcounter}
+
+\def\dosetdivision#1#2#3%
+ {#3#1\divide#3 #2\relax}
+
+\def\DoMod#1by#2to#3{\dosetmodulo {#1}{#2}{#3}}
+\def\DoDiv#1by#2to#3{\dosetdivision{#1}{#2}{#3}}
+
+\def\dounprotected#1\par
+ {#1\protect}
+
+\def\unprotected
+ {\unprotect\dounprotected}
+
+% awaiting the definitive implementation
+
+% \ifdefined\resettimer \else
+% \let\resettimer \relax
+% \newcount\elapsedtime
+% \fi
+% \def\elapsedseconds{\expandafter\withoutpt\the\dimexpr\elapsedtime sp\relax}
+
+\def\resettimer {\ctxlua{commands.resettimer()}}
+\def\elapsedtime {\ctxlua{commands.elapsedtime()}}
+\let\elapsedseconds \elapsedtime
+
+\newcount\featuretest
+
+\def\testfeature#1#2%
+ {\def\dotestfeature
+ {\advance\featuretest \plusone
+ \ifnum\featuretest>#1\else#2\expandafter\dotestfeature\fi}%
+ \retestfeature}
+
+\def\retestfeature % timer support is new per 10/5/2005
+ {\bgroup
+ \ifcase\interactionmode\let\wait\relax\fi
+ \writestatus\m!systems{starting feature test}\wait
+ \resettimer
+ \featuretest\zerocount \dotestfeature
+ \writestatus\m!systems{feature test done (\elapsedseconds s)}%
+ \wait
+ \egroup}
+
+\def\showtimer#1%
+ {\writestatus{runtime}{\elapsedseconds\space s / #1}}
+
+\def\testfeatureonce#1#2%
+ {\let\wait\relax\testfeature{#1}{#2}\end}
+
+%D \macros
+%D {freezedimenmacro}
+%D
+%D This macro is use as:
+%D
+%D \starttyping
+%D \freezedimenmacro\leftmargindistance
+%D \stoptyping
+
+\def\freezedimenmacro#1%
+ {\edef#1{\the\dimexpr#1}}
+
+%D The next macro negates a macro (dimension or number, or actually, whatever.
+%D It's a typical example of \type {\if} usage:
+%D
+%D \starttyping
+%D \if-\whatever \else-\whatever\fi => else => -whatever
+%D \if--\whatever\else-\whatever\fi => then => whatever
+%D \stoptyping
+
+\def\negated#1{\if-#1\else-#1\fi} % does only work in macros or text
+
+% This permits things like ^\index{hans}^, where hans is
+% duplicated in the text.
+
+\newif\ifduplicate
+
+\bgroup
+
+\gdef\checkduplication % in line with Knuth
+ {\ifmmode\expandafter^\else\expandafter\startduplication\fi}
+
+\gdef\insideduplication
+ {\ifmmode\expandafter^\else\expandafter\egroup\fi}
+
+\catcode`\^=\@@active
+
+\gdef\enableduplication
+ {\catcode`\^=\@@active \let^\checkduplication}
+
+\gdef\disableduplication
+ {\catcode`\^=\@@superscript}
+
+\gdef\startduplication
+ {\bgroup \duplicatetrue \let^\insideduplication}
+
+\egroup
+
+\def\gobbleassigndimen#1\\{}
+
+\def\assigndimen#1#2%
+ {\afterassignment\gobbleassigndimen#1=#2\!!zeropoint\\}
+
+\def\setusage#1%
+ {\@EA\let\csname#1\endcsname\iftrue}
+
+\def\resetusage#1%
+ {\@EA\let\csname#1\endcsname\iffalse}
+
+\def\ifusage#1%
+ {\ifcsname#1\endcsname\else
+ \resetusage{#1}%
+ \fi
+ \csname#1\endcsname}
+
+%D Very handy, more efficient than \type{{}}, and more readable
+%D than \type {\empty}.
+
+\let\donothing\empty
+
+% The following macros are used in XML handling.
+
+\long\setvalue{@u@s@"}#1#2"{#2} \long\setvalue{@g@s@"}#1#2"{\scratchtoks{#2}}
+\long\setvalue{@u@s@'}#1#2'{#2} \long\setvalue{@g@s@'}#1#2'{\scratchtoks{#2}}
+\long\setvalue{@u@s@ }#1#2 {#2} \long\setvalue{@g@s@ }#1#2 {\scratchtoks{#2}}
+
+\long\def\unstringed#1{\csname\ifcsname @u@s@#1\endcsname @u@s@#1\else\s!empty\fi\endcsname#1}
+\long\def\grabstring#1{\csname\ifcsname @g@s@#1\endcsname @g@s@#1\else\s!empty\fi\endcsname#1}
+
+\def\dowithgrabbedstring#1%
+ {\def\@@dowithgrabbedstring{#1}%
+ \afterassignment\@@dowithgrabbedstring\grabstring}
+
+\def\expifequalelse#1#2%
+ {\@@ifequal#1\relax\relax\@@and#2\relax\relax\@@then}
+
+\def\@@ifequal#1#2\@@and#3%
+ {\ifx#1\relax
+ \ifx#3\relax
+ \@EAEAEA\@@if@@equal@@true
+ \else
+ \@EAEAEA\@@if@@equal@@false
+ \fi
+ \else
+ \ifx#3\relax
+ \@EAEAEAEAEAEA\@@if@@equal@@false
+ \else\ifx#1#3%
+ % go on
+ \else
+ \@EAEAEAEAEAEA\@@if@@equal@@false
+ \fi\fi
+ \fi
+ \@@ifequal#2\@@and}
+
+\long\def\@@if@@equal@@true #1\@@then#2#3{#2}
+\long\def\@@if@@equal@@false#1\@@then#2#3{#3}
+
+%D new stuff :
+
+\def\partialexpanded#1%
+ {\let\@@notexpanded\noexpand
+ \long\xdef\@@expanded{\noexpand#1}%
+ \let\@@notexpanded\empty
+ \@@expanded}
+
+\def\appended#1#2#3{\@EA#1\@EA#2\@EA{#2#3}}
+\def\appendvalue #1{\@EA\appended\@EA \def\csname#1\endcsname}
+\def\appendgvalue#1{\@EA\appended\@EA\gdef\csname#1\endcsname}
+
+\def\prepended#1#2#3{\scratchtoks{#3}\@EA\@EA\@EA#1\@EA\@EA\@EA#2\@EA\@EA\@EA{\@EA\the\@EA\scratchtoks#2}}
+\def\prependvalue #1{\@EA\prepended\@EA \def\csname#1\endcsname}
+\def\prependgvalue#1{\@EA\prepended\@EA\gdef\csname#1\endcsname}
+
+%D \macros
+%D {compresscommacommandnrs,compresscommalistnrs,compressedcommalistnrs,
+%D compresscommacommand,compresscommalist,compressedcommalist,
+%D reversecommacommand,reversecommalist,reversedcommalist}
+%D
+%D The following two list processing macros are needed by Taco's
+%D bibliography module. The numbers compressor converts the
+%D list in a list of ranges. The normal compressor remove duplicate
+%D and empty entries.
+
+\def\compresscommalistnrs[#1]%
+ {\let\compressedlist\empty
+ \!!counta\maxdimen
+ \!!countb\maxdimen
+ \processcommalist[#1]\docompresslistnrs
+ \ifnum\!!counta=\maxdimen\else\dodocompresslistnrs\fi}
+
+\def\compresscommacommandnrs[#1]%
+ {\normalexpanded{\noexpand\compresscommalistnrs[#1]}}
+
+\def\docompresslistnrs#1%
+ {\edef\commalistelement{#1}%
+ \ifx\commalistelement\empty\else
+ \ifnum\!!counta=\maxdimen
+ \!!counta\commalistelement\relax
+ \!!countb\!!counta
+ \else
+ \advance\!!countb\plusone
+ \ifnum\commalistelement>\!!countb
+ \advance\!!countb\minusone
+ \dodocompresslistnrs
+ \!!counta\commalistelement\relax
+ \!!countb\!!counta
+ \fi
+ \fi
+ \fi}
+
+\def\dodocompresslistnrs
+ {\edef\compressedlist
+ {\ifx\compressedlist\empty\else\compressedlist,\fi
+ {\the\!!counta}{\ifnum\!!countb>\!!counta\the\!!countb\fi}}}
+
+%D \def\test#1{{\tttf#1->\compresscommalistnrs[#1]\defconvertedcommand\ascii\compressedlist\ascii}}
+%D \startlines
+%D \test{}
+%D \test{1}
+%D \test{1,3}
+%D \test{1,3,4}
+%D \test{1,3,3,4,5}
+%D \test{1,3,3,4,5,8}
+%D \test{1,3,3,4,5,5,8,10}
+%D \test{1,3,4,5,8,10,11}
+%D \test{1,,3,,4,,5,,8,,10,,11,}
+%D \stoplines
+
+\def\compresscommalist[#1]%
+ {\let\compressedlist\empty
+ \let\!!stringa\empty
+ \processcommalist[#1]\docompresslist}
+
+\def\compresscommacommand[#1]%
+ {\normalexpanded{\noexpand\compresscommalist[#1]}}
+
+\def\docompresslist#1%
+ {\edef\commalistelement{#1}%
+ \ifx\commalistelement\empty \else
+ \ifx\!!stringa\commalistelement \else
+ \ifx\compressedlist\empty
+ \def\compressedlist{#1}%
+ \else
+ \appended\def\compressedlist{,#1}%
+ \fi
+ \let\!!stringa\commalistelement
+ \fi
+ \fi}
+
+%D \def\test#1{{\tttf#1->\compresscommalist[#1]\defconvertedcommand\ascii\compressedlist\ascii}}
+%D \startlines
+%D \test{}
+%D \test{1}
+%D \test{1,3}
+%D \test{1,3,4}
+%D \test{1,3,3,4,5}
+%D \test{1,3,3,4,5,8}
+%D \test{1,3,3,4,5,5,8,10}
+%D \test{1,3,4,5,8,10,11}
+%D \test{1,,3,,4,,5,,8,,10,,11,}
+%D \stoplines
+
+\def\reversecommalist[#1]%
+ {\let\reversedlist\empty
+ \processcommalist[#1]\doreverselist}
+
+\def\doreverselist#1%
+ {\ifx\reversedlist\empty
+ \def\reversedlist{#1}%
+ \else
+ \prepended\def\reversedlist{#1,}%
+ \fi}
+
+\def\reversecommacommand[#1]%
+ {\normalexpanded{\noexpand\reversecommalist[#1]}}
+
+%D \def\test#1{{\tttf#1->\reversecommalist[#1]\defconvertedcommand\ascii\reversedlist\ascii}}
+%D \startlines
+%D \test{}
+%D \test{1}
+%D \test{1,3}
+%D \test{1,3,4}
+%D \test{1,3,3,4,5}
+%D \test{1,3,3,4,5,8}
+%D \test{1,3,3,4,5,5,8,10}
+%D \test{1,3,4,5,8,10,11}
+%D \test{1,,3,,4,,5,,8,,10,,11,}
+%D \stoplines
+
+%D \macros
+%D {stripstring}
+%D
+%D Needed in bookmarks:
+%D
+%D \starttyping
+%D {\sanitizePDFdocencoding test \CONTEXT\ test \to\oeps\stripstring\oeps\tttf[\oeps]}
+%D \stoptyping
+
+\def\stripstring#1% #1 is \cs
+ {\edef\cs{\ctxlua{tex.sprint(tex.vrbcatcodes,string.strip(\!!bs\detokenize\expandafter{#1}\!!es))}}}
+
+%D \macros
+%D {dowithrange}
+%D
+%D This one is for Mojca Miklavec, who made me aware of the fact that
+%D \type {page-imp.tex} was not the best place to hide it.
+
+\def\dowithrange#1#2% #2 takes number
+ {\splitstring#1\at:\to\fromrange\and\torange
+ \ifx\torange\empty\let\torange\fromrange\fi
+ \dostepwiserecurse\fromrange\torange1{#2{\recurselevel}}}
+
+%D \macros {uncompresslist}
+%D
+%D When given a list like \type{1,4-7,9} as argument, this macro
+%D will store the expanded commalist in \type{\uncompressedlist}.
+%D
+%D \startbuffer
+%D \def\MojcaHasToDoTheTasks[#1]#2%
+%D {{\uncompresslist[#1]%
+%D \def\processitem##1{I have to do ##1 #2\par}%
+%D \processcommacommand[\uncompressedlist]\processitem}}
+%D
+%D \MojcaHasToDoTheTasks [1-4,7,9-11] {until tomorrow}
+%D \stopbuffer
+%D
+%D Here is an example of how to use \type {\uncompresslist}:
+%D \typebuffer
+%D
+%D The output of this is:
+%D
+%D \getbuffer
+
+\def\uncompresslist[#1]% by TH
+ {\let\uncompressedlist\empty
+ \def\docompressedlistitem##1-##2-%
+ {\@EA\dorecurse\@EA
+ {\the\numexpr1+##2-##1\relax}%
+ {\@EA\appendtocommalist\@EA{\the\numexpr##1-1+####1\relax}\uncompressedlist}}%
+ \def\douncompresslist##1%
+ {\doifinstringelse{-}{##1}
+ {\docompressedlistitem##1-}
+ {\appendtocommalist{##1}\uncompressedlist}}%
+ \processcommalist[#1]\douncompresslist}
+
+%D \macros
+%D {ignoreimplicitspaces}
+%D
+%D \startbuffer
+%D \def\whatever[#1]{\expanded{\definedfont[#1 at 12pt]}\ignorespaces}
+%D {a\whatever[Serif]b a\whatever[Serif] b a\whatever[Serif]\space b}
+%D \def\whatever[#1]{\expanded{\definedfont[#1 at 12pt]}\ignoreimplicitspaces}
+%D {a\whatever[Serif]b a\whatever[Serif] b a\whatever[Serif]\space b}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\ignoreimplicitspaces
+ {\doifnextcharelse\relax\relax\relax}
+
+%D \macros
+%D {processwords}
+%D
+%D Not that sophisticated but sometimes users (like in metafun).
+
+\def\doprocesswords#1 #2\od
+ {\doifsomething{#1}{\processword{#1} \doprocesswords#2 \od}}
+
+\def\processwords#1%
+ {\doprocesswords#1 \od}% no \unskip
+
+\let\processword\relax
+
+% new
+%
+% \startnointerference
+% all kind of code
+% \stopnointerference
+
+\newbox\nointerferencebox
+
+\unexpanded\def\startnointerference % not even grouped !
+ {\setbox\nointerferencebox\vbox
+ \bgroup}
+
+\unexpanded\def\stopnointerference
+ {\egroup
+ \setbox\nointerferencebox\emptybox}
+
+% \def\appendtovaluelist#1#2%
+% {\ifcsname#1\endcsname
+% \expandafter\ifx\csname#1\endcsname\empty
+% \expandafter\def\csname#1\endcsname{#2}%
+% \else
+% \expandafter\def\csname#1\expandafter\expandafter\expandafter\endcsname
+% \expandafter\expandafter\expandafter{\csname#1\endcsname,#2}%
+% \fi
+% \else
+% \expandafter\def\csname#1\endcsname{#2}%
+% \fi}
+%
+% or
+%
+% \def\appendtovaluelist#1%
+% {\ifcsname#1\endcsname
+% \expandafter\ifx\csname#1\endcsname\empty
+% \expandafter\noappendtovaluelist\csname#1\expandafter\expandafter\expandafter\endcsname
+% \else
+% \expandafter\doappendtovaluelist\csname#1\expandafter\expandafter\expandafter\endcsname
+% \fi
+% \else
+% \expandafter\noappendtovaluelist\csname#1\expandafter\endcsname
+% \fi}
+
+% \def\doappendtovaluelist#1#2{\expandafter\def\expandafter#1\expandafter{#1,#2}}
+% \def\noappendtovaluelist#1#2{\def#1{#2}}
+
+% \appendtovaluelist{mylist}{aap}
+% \appendtovaluelist{mylist}{noot}
+% \appendtovaluelist{mylist}{mies}
+
+% \showvalue{mylist}
+
+%D A variant for \type {\executeifdefined}:
+
+\def\expandcheckedcsname#1#2#3%
+ {\csname#1\ifcsname#1#2\endcsname#2\else#3\fi\endcsname}
+
+\protect \endinput
diff --git a/tex/context/base/syst-con.lua b/tex/context/base/syst-con.lua
new file mode 100644
index 000000000..638f3c797
--- /dev/null
+++ b/tex/context/base/syst-con.lua
@@ -0,0 +1,25 @@
+if not modules then modules = { } end modules ['syst-con'] = {
+ version = 1.001,
+ comment = "companion to syst-con.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+converters = converters or { }
+
+--[[ldx--
+<p>For raw 8 bit characters, the offset is 0x110000 (bottom of plane 18) at
+the top of <l n='luatex'/>'s char range but outside the unicode range.</p>
+--ldx]]--
+
+local char, texsprint, format = unicode.utf8.char, tex.sprint, string.format
+
+function converters.hexstringtonumber(n) texsprint(tonumber(n,16)) end
+function converters.octstringtonumber(n) texsprint(tonumber(n, 8)) end
+function converters.rawcharacter (n) texsprint(char(0x110000+n)) end
+function converters.lchexnumber (n) texsprint(format("%x" ,n)) end
+function converters.uchexnumber (n) texsprint(format("%X" ,n)) end
+function converters.lchexnumbers (n) texsprint(format("%02x",n)) end
+function converters.uchexnumbers (n) texsprint(format("%02X",n)) end
+function converters.octnumber (n) texsprint(format("%03o",n)) end
diff --git a/tex/context/base/syst-con.mkii b/tex/context/base/syst-con.mkii
new file mode 100644
index 000000000..877aad32a
--- /dev/null
+++ b/tex/context/base/syst-con.mkii
@@ -0,0 +1,243 @@
+%D \module
+%D [ file=syst-con,
+%D version=2000.12.10, % actually very old -)
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Conversions,
+%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 System Macros / Conversions}
+
+\unprotect
+
+%D When the number of conversions grew, it did no longer make
+%D sense to spread them over multiple files. So, instead of
+%D defining these in \type {font-ini}, we now have a dedicated
+%D module.
+
+\catcode127=12 % other, just to be sure
+
+%D \macros
+%D {lchexnumber,uchexnumber,lchexnumbers,uchexnumbers}
+%D
+%D In addition to the uppercase hex conversion, as needed in
+%D math families, we occasionally need a lowercase one, for
+%D instance when we want to compose gbsong fontnames.
+%D
+%D The ugly indirectness is needed to get rid of \TEX\
+%D induced spaces and \type {\relax}'s.
+%D
+%D \starttyping
+%D [\uchexnumber{0}]
+%D [\uchexnumber\scratchcounter]
+%D [\uchexnumber\zerocount]
+%D [\uchexnumber{\number0}]
+%D [\uchexnumber{\number\scratchcounter}]
+%D [\uchexnumber{\number\zerocount}]
+%D [\uchexnumber{\the\scratchcounter}]
+%D [\uchexnumber{\the\zerocount}]
+%D [\expandafter\uchexnumber\expandafter{\number0}]
+%D [\expandafter\uchexnumber\expandafter{\number\scratchcounter}]
+%D [\expandafter\uchexnumber\expandafter{\number\zerocount}]
+%D [\expandafter\uchexnumber\expandafter{\the\scratchcounter}]
+%D [\expandafter\uchexnumber\expandafter{\the\zerocount}]
+%D \stoptyping
+%D
+%D These macros may look slow but are actually rather fast due to
+%D the fact that \TEX\ handles conditional pretty fast. We need
+%D a two step approach in order to stay relax clean in fully
+%D expandable macros.
+
+\def\dolchexnumber#1\relax
+ {\ifcase#1 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or
+ 8\or 9\or a\or b\or c\or d\or e\or f\else 0\fi}
+
+\def\douchexnumber#1\relax
+ {\ifcase#1 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or
+ 8\or 9\or A\or B\or C\or D\or E\or F\else 0\fi}
+
+\def\dolchexnumbers#1\relax
+ {\ifcase#1
+ 00\or 01\or 02\or 03\or 04\or 05\or 06\or 07\or 08\or 09\or 0a\or 0b\or 0c\or 0d\or 0e\or 0f\or
+ 10\or 11\or 12\or 13\or 14\or 15\or 16\or 17\or 18\or 19\or 1a\or 1b\or 1c\or 1d\or 1e\or 1f\or
+ 20\or 21\or 22\or 23\or 24\or 25\or 26\or 27\or 28\or 29\or 2a\or 2b\or 2c\or 2d\or 2e\or 2f\or
+ 30\or 31\or 32\or 33\or 34\or 35\or 36\or 37\or 38\or 39\or 3a\or 3b\or 3c\or 3d\or 3e\or 3f\or
+ 40\or 41\or 42\or 43\or 44\or 45\or 46\or 47\or 48\or 49\or 4a\or 4b\or 4c\or 4d\or 4e\or 4f\or
+ 50\or 51\or 52\or 53\or 54\or 55\or 56\or 57\or 58\or 59\or 5a\or 5b\or 5c\or 5d\or 5e\or 5f\or
+ 60\or 61\or 62\or 63\or 64\or 65\or 66\or 67\or 68\or 69\or 6a\or 6b\or 6c\or 6d\or 6e\or 6f\or
+ 70\or 71\or 72\or 73\or 74\or 75\or 76\or 77\or 78\or 79\or 7a\or 7b\or 7c\or 7d\or 7e\or 7f\or
+ 80\or 81\or 82\or 83\or 84\or 85\or 86\or 87\or 88\or 89\or 8a\or 8b\or 8c\or 8d\or 8e\or 8f\or
+ 90\or 91\or 92\or 93\or 94\or 95\or 96\or 97\or 98\or 99\or 9a\or 9b\or 9c\or 9d\or 9e\or 9f\or
+ a0\or a1\or a2\or a3\or a4\or a5\or a6\or a7\or a8\or a9\or aa\or ab\or ac\or ad\or ae\or af\or
+ b0\or b1\or b2\or b3\or b4\or b5\or b6\or b7\or b8\or b9\or ba\or bb\or bc\or bd\or be\or bf\or
+ c0\or c1\or c2\or c3\or c4\or c5\or c6\or c7\or c8\or c9\or ca\or cb\or cc\or cd\or ce\or cf\or
+ d0\or d1\or d2\or d3\or d4\or d5\or d6\or d7\or d8\or d9\or da\or db\or dc\or dd\or de\or df\or
+ e0\or e1\or e2\or e3\or e4\or e5\or e6\or e7\or e8\or e9\or ea\or eb\or ec\or ed\or ee\or ef\or
+ f0\or f1\or f2\or f3\or f4\or f5\or f6\or f7\or f8\or f9\or fa\or fb\or fc\or fd\or fe\or ff\fi}
+
+\def\douchexnumbers#1\relax
+ {\ifcase#1
+ 00\or 01\or 02\or 03\or 04\or 05\or 06\or 07\or 08\or 09\or 0A\or 0B\or 0C\or 0D\or 0E\or 0F\or
+ 10\or 11\or 12\or 13\or 14\or 15\or 16\or 17\or 18\or 19\or 1A\or 1B\or 1C\or 1D\or 1E\or 1F\or
+ 20\or 21\or 22\or 23\or 24\or 25\or 26\or 27\or 28\or 29\or 2A\or 2B\or 2C\or 2D\or 2E\or 2F\or
+ 30\or 31\or 32\or 33\or 34\or 35\or 36\or 37\or 38\or 39\or 3A\or 3B\or 3C\or 3D\or 3E\or 3F\or
+ 40\or 41\or 42\or 43\or 44\or 45\or 46\or 47\or 48\or 49\or 4A\or 4B\or 4C\or 4D\or 4E\or 4F\or
+ 50\or 51\or 52\or 53\or 54\or 55\or 56\or 57\or 58\or 59\or 5A\or 5B\or 5C\or 5D\or 5E\or 5F\or
+ 60\or 61\or 62\or 63\or 64\or 65\or 66\or 67\or 68\or 69\or 6A\or 6B\or 6C\or 6D\or 6E\or 6F\or
+ 70\or 71\or 72\or 73\or 74\or 75\or 76\or 77\or 78\or 79\or 7A\or 7B\or 7C\or 7D\or 7E\or 7F\or
+ 80\or 81\or 82\or 83\or 84\or 85\or 86\or 87\or 88\or 89\or 8A\or 8B\or 8C\or 8D\or 8E\or 8F\or
+ 90\or 91\or 92\or 93\or 94\or 95\or 96\or 97\or 98\or 99\or 9A\or 9B\or 9C\or 9D\or 9E\or 9F\or
+ A0\or A1\or A2\or A3\or A4\or A5\or A6\or A7\or A8\or A9\or AA\or AB\or AC\or AD\or AE\or AF\or
+ B0\or B1\or B2\or B3\or B4\or B5\or B6\or B7\or B8\or B9\or BA\or BB\or BC\or BD\or BE\or BF\or
+ C0\or C1\or C2\or C3\or C4\or C5\or C6\or C7\or C8\or C9\or CA\or CB\or CC\or CD\or CE\or CF\or
+ D0\or D1\or D2\or D3\or D4\or D5\or D6\or D7\or D8\or D9\or DA\or DB\or DC\or DD\or DE\or DF\or
+ E0\or E1\or E2\or E3\or E4\or E5\or E6\or E7\or E8\or E9\or EA\or EB\or EC\or ED\or EE\or EF\or
+ F0\or F1\or F2\or F3\or F4\or F5\or F6\or F7\or F8\or F9\or FA\or FB\or FC\or FD\or FE\or FF\fi}
+
+\def\lchexnumber #1{\@EA\dolchexnumber \number#1\relax}
+\def\uchexnumber #1{\@EA\douchexnumber \number#1\relax}
+\def\lchexnumbers#1{\@EA\dolchexnumbers\number#1\relax}
+\def\uchexnumbers#1{\@EA\douchexnumbers\number#1\relax}
+
+\let\hexnumber\uchexnumber
+
+%D \macros
+%D {octnumber}
+%D
+%D For unicode remapping purposes, we need octal numbers.
+
+\def\dooctnumber#1\relax
+ {\ifcase#1
+ 000\or 001\or 002\or 003\or 004\or 005\or 006\or 007\or
+ 010\or 011\or 012\or 013\or 014\or 015\or 016\or 017\or
+ 020\or 021\or 022\or 023\or 024\or 025\or 026\or 027\or
+ 030\or 031\or 032\or 033\or 034\or 035\or 036\or 037\or
+ 040\or 041\or 042\or 043\or 044\or 045\or 046\or 047\or
+ 050\or 051\or 052\or 053\or 054\or 055\or 056\or 057\or
+ 060\or 061\or 062\or 063\or 064\or 065\or 066\or 067\or
+ 070\or 071\or 072\or 073\or 074\or 075\or 076\or 077\or
+ 100\or 101\or 102\or 103\or 104\or 105\or 106\or 107\or
+ 110\or 111\or 112\or 113\or 114\or 115\or 116\or 117\or
+ 120\or 121\or 122\or 123\or 124\or 125\or 126\or 127\or
+ 130\or 131\or 132\or 133\or 134\or 135\or 136\or 137\or
+ 140\or 141\or 142\or 143\or 144\or 145\or 146\or 147\or
+ 150\or 151\or 152\or 153\or 154\or 155\or 156\or 157\or
+ 160\or 161\or 162\or 163\or 164\or 165\or 166\or 167\or
+ 170\or 171\or 172\or 173\or 174\or 175\or 176\or 177\or
+ 200\or 201\or 202\or 203\or 204\or 205\or 206\or 207\or
+ 210\or 211\or 212\or 213\or 214\or 215\or 216\or 217\or
+ 220\or 221\or 222\or 223\or 224\or 225\or 226\or 227\or
+ 230\or 231\or 232\or 233\or 234\or 235\or 236\or 237\or
+ 240\or 241\or 242\or 243\or 244\or 245\or 246\or 247\or
+ 250\or 251\or 252\or 253\or 254\or 255\or 256\or 257\or
+ 260\or 261\or 262\or 263\or 264\or 265\or 266\or 267\or
+ 270\or 271\or 272\or 273\or 274\or 275\or 276\or 277\or
+ 300\or 301\or 302\or 303\or 304\or 305\or 306\or 307\or
+ 310\or 311\or 312\or 313\or 314\or 315\or 316\or 317\or
+ 320\or 321\or 322\or 323\or 324\or 325\or 326\or 327\or
+ 330\or 331\or 332\or 333\or 334\or 335\or 336\or 337\or
+ 340\or 341\or 342\or 343\or 344\or 345\or 346\or 347\or
+ 350\or 351\or 352\or 353\or 354\or 355\or 356\or 357\or
+ 360\or 361\or 362\or 363\or 364\or 365\or 366\or 367\or
+ 370\or 371\or 372\or 373\or 374\or 375\or 376\or 377\fi}
+
+\def\octnumber#1{\@EA\dooctnumber\number#1\relax}
+
+%D \macros
+%D {twodigits, threedigits}
+%D
+%D These macros provides two or three digits always:
+
+\def\twodigits #1{\ifnum #1<10 0\fi\number#1}
+\def\threedigits#1{\ifnum#1<100 \ifnum#1<10 0\fi0\fi\number#1}
+
+%D \macros{modulonumber}
+%D
+%D In the conversion macros described in \type {core-con} we
+%D need a wrap||around method. The following solution is
+%D provided by Taco.
+%D
+%D The \type {modulonumber} macro expands to the mathematical
+%D modulo of a positive integer. It is crucial for it's
+%D application that this macro is fully exandable.
+%D
+%D The expression inside the \type {\numexpr} itself is
+%D somewhat bizarre because \ETEX\ uses a rounding
+%D division instead of truncation. If \ETEX's division
+%D would have behaved like \TEX's normal\type{\divide}, then
+%D the expression could have been somewhat simpler, like
+%D \type {#2-(#2/#1)*#1}. This works just as well, but a bit
+%D more complex.
+
+\def\modulonumber#1#2%
+ {\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
+
+%D \macros{modulatednumber}
+%D
+%D Modulo numbers run from zero to one less than the limit,
+%D but for conversion sets, we need a value between 1 and the
+%D limit. The \type{\modulatednumber} arranges that. This
+%D macro also needs to be fully expandable, resulting in
+%D two \type{\numexpr}s.
+
+\def\modulatednumber#1#2%
+ {\ifnum\the\numexpr\modulonumber{#1}{#2}\relax=0 #1%
+ \else \the\numexpr\modulonumber{#1}{#2}\relax \fi}
+
+%D \macros
+%D {hexstringtonumber}
+%D
+%D This macro converts a two character hexadecimal number into
+%D a decimal number, thereby taking care of lowercase characters
+%D as well.
+
+\dostepwiserecurse{0}{9}{1}{\setevalue{@@uc@@\recurselevel}{\recurselevel}}
+
+\setvalue{@@uc@@a}{A} \setvalue{@@uc@@A}{A}
+\setvalue{@@uc@@b}{B} \setvalue{@@uc@@B}{B}
+\setvalue{@@uc@@c}{C} \setvalue{@@uc@@C}{C}
+\setvalue{@@uc@@d}{D} \setvalue{@@uc@@D}{D}
+\setvalue{@@uc@@e}{E} \setvalue{@@uc@@E}{E}
+\setvalue{@@uc@@f}{F} \setvalue{@@uc@@F}{F}
+
+\def\hexstringtonumber#1% {FF}
+ {\dohexstringtonumber#1}
+
+\def\dohexstringtonumber#1#2% FF
+ {"\csname @@uc@@#1\endcsname\csname @@uc@@#2\endcsname}
+
+%D \macros
+%D {rawcharacter}
+%D
+%D The next conversion macro produces raw characters. We have to
+%D construct the macro in a special way to avoid problems with
+%D characters with special meanings. So, we revert to the
+%D lowercase conversion trick to bypass \TEX's input parser.
+%D
+%D This macro can be used to produce proper 8 bit characters
+%D that we sometimes need in backends and round||trips.
+
+\bgroup
+
+\catcode`\^^@=12 % ascii null == ignored in plain
+\catcode`\^^?=12 % ascii delete == invalid in plain
+
+\let\or\relax
+
+\xdef\rawcharacter{ ^^00\or}
+
+\dorecurse{255}
+ {\lccode`a=\recurselevel
+ \lowercase{\xdef\rawcharacter{\rawcharacter \string a\or}}} % string is needed for XeTeX
+
+\@EA\gdef\@EA\rawcharacter\@EA#\@EA1\@EA
+ {\@EA\ifcase\@EA#\@EA1\rawcharacter\fi}
+
+\egroup
+
+\protect \endinput
diff --git a/tex/context/base/syst-con.mkiv b/tex/context/base/syst-con.mkiv
new file mode 100644
index 000000000..f7d4150a6
--- /dev/null
+++ b/tex/context/base/syst-con.mkiv
@@ -0,0 +1,145 @@
+%D \module
+%D [ file=syst-con,
+%D version=2006.09.16, % real old stuff ... 2000.12.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Conversions,
+%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.
+
+\registerctxluafile{syst-con}{1.001}
+
+\unprotect
+
+%D When the number of conversions grew, it did no longer make
+%D sense to spread them over multiple files. So, instead of
+%D defining these in \type {font-ini}, we now have a dedicated
+%D module.
+
+%D \macros
+%D {lchexnumber,uchexnumber,lchexnumbers,uchexnumbers}
+%D
+%D In addition to the uppercase hex conversion, as needed in
+%D math families, we occasionally need a lowercase one, for
+%D instance when we want to compose gbsong fontnames.
+%D
+%D The ugly indirectness is needed to get rid of \TEX\
+%D induced spaces and \type {\relax}'s.
+%D
+%D \starttyping
+%D [\uchexnumber{0}]
+%D [\uchexnumber\scratchcounter]
+%D [\uchexnumber\zerocount]
+%D [\uchexnumber{\number0}]
+%D [\uchexnumber{\number\scratchcounter}]
+%D [\uchexnumber{\number\zerocount}]
+%D [\uchexnumber{\the\scratchcounter}]
+%D [\uchexnumber{\the\zerocount}]
+%D [\expandafter\uchexnumber\expandafter{\number0}]
+%D [\expandafter\uchexnumber\expandafter{\number\scratchcounter}]
+%D [\expandafter\uchexnumber\expandafter{\number\zerocount}]
+%D [\expandafter\uchexnumber\expandafter{\the\scratchcounter}]
+%D [\expandafter\uchexnumber\expandafter{\the\zerocount}]
+%D \stoptyping
+
+\def\lchexnumber #1{\ctxlua{converters.lchexnumber(\number#1)}}
+\def\uchexnumber #1{\ctxlua{converters.uchexnumber(\number#1)}}
+\def\lchexnumbers#1{\ctxlua{converters.lchexnumbers(\number#1)}}
+\def\uchexnumbers#1{\ctxlua{converters.uchexnumbers(\number#1)}}
+
+\let\hexnumber\uchexnumber
+
+%D \macros
+%D {octnumber}
+%D
+%D For unicode remapping purposes, we need octal numbers.
+
+\def\octnumber#1{\ctxlua{converters.octnumber(\number#1)}}
+
+%D \macros
+%D {hexstringtonumber,octstringtonumber}
+%D
+%D This macro converts a two character hexadecimal number into
+%D a decimal number, thereby taking care of lowercase characters
+%D as well.
+
+\def\hexstringtonumber#1{\ctxlua{converters.hexstringtonumber("#1")}}
+\def\octstringtonumber#1{\ctxlua{converters.octstringtonumber("#1")}}
+
+%D \macros
+%D {rawcharacter}
+%D
+%D This macro can be used to produce proper 8 bit characters
+%D that we sometimes need in backends and round||trips.
+
+\def\rawcharacter#1{\ctxlua{converters.rawcharacter(\number#1)}}
+
+%D \macros
+%D {twodigits, threedigits}
+%D
+%D These macros provides two or three digits always:
+
+\def\twodigits #1{\ifnum #1<10 0\fi\number#1}
+\def\threedigits#1{\ifnum#1<100 \ifnum#1<10 0\fi0\fi\number#1}
+
+%D \macros{modulonumber}
+%D
+%D In the conversion macros described in \type {core-con} we
+%D need a wrap||around method. The following solution is
+%D provided by Taco.
+%D
+%D The \type {modulonumber} macro expands to the mathematical
+%D modulo of a positive integer. It is crucial for it's
+%D application that this macro is fully exandable.
+%D
+%D The expression inside the \type {\numexpr} itself is
+%D somewhat bizarre because \ETEX\ uses a rounding
+%D division instead of truncation. If \ETEX's division
+%D would have behaved like \TEX's normal\type{\divide}, then
+%D the expression could have been somewhat simpler, like
+%D \type {#2-(#2/#1)*#1}. This works just as well, but a bit
+%D more complex.
+
+\def\modulonumber#1#2%
+ {\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
+
+%D \macros{modulatednumber}
+%D
+%D Modulo numbers run from zero to one less than the limit,
+%D but for conversion sets, we need a value between 1 and the
+%D limit. The \type{\modulatednumber} arranges that. This
+%D macro also needs to be fully expandable, resulting in
+%D two \type{\numexpr}s.
+
+\def\modulatednumber#1#2%
+ {\ifnum\the\numexpr\modulonumber{#1}{#2}\relax=0 #1%
+ \else \the\numexpr\modulonumber{#1}{#2}\relax \fi}
+
+%D \macros
+%D {realnumber} % used?
+
+\def\realnumber#1{\withoutpt\the\dimexpr#1\s!pt\relax} % brrr
+
+%D \macros
+%D {setcalculatedsin,setcalculatedcos,setcalculatedtan}
+%D
+%D This saves some 2K in the format. At some point we will redo the
+%D code that calls this. Beware: in \MKII\ this is a separate module.
+
+% \let\calculatesin\gobbleoneargument
+% \let\calculatecos\gobbleoneargument
+% \let\calculatetan\gobbleoneargument
+
+% \def\calculatedsin#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.sin(#1))}}
+% \def\calculatedcos#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.cos(#1))}}
+% \def\calculatedtan#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.tan(#1))}}
+
+\def\setcalculatedsin#1#2{\edef#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.sind(#2))}}}
+\def\setcalculatedcos#1#2{\edef#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.cosd(#2))}}}
+\def\setcalculatedtan#1#2{\edef#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.tand(#2))}}}
+
+\protect \endinput
diff --git a/tex/context/base/syst-ext.mkii b/tex/context/base/syst-ext.mkii
new file mode 100644
index 000000000..73fb98b72
--- /dev/null
+++ b/tex/context/base/syst-ext.mkii
@@ -0,0 +1,5025 @@
+%D \module
+%D [ file=syst-ext,
+%D version=1995.10.10,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Extras,
+%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 System Macros / Extras}
+
+%D In this second system module, we continue the definition of
+%D some handy commands.
+
+\unprotect
+
+%D \macros
+%D {rawgetparameters}
+%D
+%D A raw and dirty alternative for \type {\getparameters}; no
+%D checking is done!
+
+% \def\rawgetparameters[#1][#2]% scheelt 5\%
+% {\def\rawparameterprefix{#1}%
+% \expandafter\rawsetparameter#2,]=,}
+
+\def\rawsetparameter#1=#2,%
+ {\if]#1\else
+ \expandafter\def\csname\rawparameterprefix#1\endcsname{#2}%
+ \expandafter\rawsetparameter
+ \fi}
+
+% the next one handles empty #1 okay:
+
+\def\rawgetparameters[#1][#2% some 5-10% faster
+ {\ifx#2]% test is needed, else bomb on [#1][]
+ \expandafter\gobbleoneargument
+ \else
+ \def\rawparameterprefix{#1}%
+ \expandafter\dorawgetparameters
+ \fi#2}
+
+\def\dorawgetparameters#1]%
+ {\expandafter\rawsetparameter#1,]=,}
+
+%D \macros
+%D {doglobal,
+%D redoglobal,dodoglobal,resetglobal}
+%D
+%D The two macros \type {\redoglobal} and \type{\dodoglobal} are
+%D used in this and some other modules to enforce a user
+%D specified \type {\doglobal} action. The last and often only
+%D global assignment in a macro is done with
+%D \type {\dodoglobal}, but all preceding ones with
+%D \type {\redoglobal}. When using only alternatives, one can
+%D reset this mechanism with \type {\resetglobal}.
+
+\def\doglobal
+ {\let\redoglobal\global
+ \def\dodoglobal{\resetglobal\global}}
+
+\def\resetglobal
+ {\let\redoglobal\relax
+ \let\dodoglobal\relax}
+
+\resetglobal
+
+%D New:
+
+\def\doglobal
+ {\ifx\redoglobal\relax
+ \let\redoglobal\global
+ \let\dodoglobal\@@dodoglobal
+ %\else
+ % \writestatus{system}{global not reset, warn me!}%
+ \fi}
+
+\def\@@dodoglobal
+ {\resetglobal\global}
+
+\def\saveglobal
+ {\let\@@dodoglobal\dodoglobal
+ \let\@@redoglobal\redoglobal}
+
+\def\restoreglobal
+ {\let\redoglobal\@@redoglobal
+ \let\dodoglobal\@@dodoglobal}
+
+%D A very useful application of this macro is \type {\newif},
+%D \TEX's fake boolean type. Not being a primitive,
+%D \type {\global} hopelessly fails here. But a slight
+%D adaption of Knuth's original macro permits:
+%D
+%D \starttyping
+%D \doglobal\newif\iftest
+%D \stoptyping
+%D
+%D Of course one can still say:
+%D
+%D \starttyping
+%D \global\testtrue
+%D \global\testfalse
+%D \stoptyping
+%D
+%D Apart from the prefixes, a few more \type{\expandafters}
+%D are needed:
+
+\def\newif#1%
+ {\scratchcounter\escapechar
+ \escapechar\minusone
+ \expandafter\expandafter\expandafter
+ \redoglobal\expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \redoglobal\expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1\noexpand\iffalse}%
+ \dodoglobal\@if#1{false}%
+ \escapechar\scratchcounter}
+
+%D Also new:
+
+\def\define#1%
+ {\ifx#1\undefined
+ \expandafter\def
+ \else
+ \message{[\noexpand#1is already defined]}%
+ \expandafter\def\expandafter\gobbleddefinition
+ \fi#1}
+
+\def\redefine#1%
+ {\ifx#1\undefined\else
+ \message{[\noexpand#1is redefined]}%
+ \fi
+ \def#1}
+
+% \define\hans{hans}
+% \redefine\hans{hans}
+% \define\hans#1[]#2#3{hans}
+
+%D The next variant fits nicely in the setups syntax:
+%D
+%D \starttyping
+%D \starttexdefinition bagger [#1] #2
+%D oeps
+%D #1
+%D oeps
+%D \stoptexdefinition
+%D
+%D \bagger [a] {b}
+%D \stoptyping
+
+\bgroup \obeylines
+
+\gdef\starttexdefinition%
+ {\bgroup%
+ \obeylines%
+ \dostarttexdefinition}
+
+\gdef\dostarttexdefinition #1
+ {\catcode13=\@@ignore%
+ \doifinstringelse\letterhash{\detokenize{#1}}\dodostarttexdefinition\nonostarttexdefinition#1
+ }
+
+\long\gdef\dodostarttexdefinition#1 #2
+ {\dododostarttexdefinition{#1}{#2}}
+
+\long\gdef\dododostarttexdefinition#1#2#3\stoptexdefinition%
+ {\egroup%
+ \long\setvalue{#1}#2{#3}}
+
+\long\gdef\nonostarttexdefinition#1
+ {\nononostarttexdefinition{#1}{}}
+
+\long\gdef\nononostarttexdefinition#1#2#3\stoptexdefinition%
+ {\egroup%
+ \long\setvalue{#1}{#3}}
+
+\egroup
+
+%D \macros
+%D {newcounter,
+%D increment,decrement}
+%D
+%D Unfortunately the number of \COUNTERS\ in \TEX\ is limited,
+%D but fortunately we can store numbers in a macro. We can
+%D increment such pseudo \COUNTERS\ with \type{\increment}.
+%D
+%D \starttyping
+%D \increment(\counter,20)
+%D \increment(\counter,-4)
+%D \increment(\counter)
+%D \increment\counter
+%D \stoptyping
+%D
+%D After this sequence of commands, the value of
+%D \type{\counter} is 20, 16, 17 and~18. Of course there is
+%D also the complementary command \type{\decrement}.
+%D
+%D Global assignments are possible too, using \type{\doglobal}:
+%D
+%D \starttyping
+%D \doglobal\increment\counter
+%D \stoptyping
+%D
+%D When \type{\counter} is undefined, it's value is initialized
+%D at~0. It is nevertheless better to define a \COUNTER\
+%D explicitly. One reason could be that the \COUNTER\ can be
+%D part of a test with \type{\ifnum} and this conditional does
+%D not accept undefined macro's. The \COUNTER\ in our example
+%D can for instance be defined with:
+%D
+%D \starttyping
+%D \newcounter\counter
+%D \stoptyping
+%D
+%D The command \type{\newcounter} must not be confused with
+%D \type{\newcount}! Of course this mechanism is much slower
+%D than using \TEX's \COUNTERS\ directly. In practice
+%D \COUNTERS\ (and therefore our pseudo counters too) are
+%D seldom the bottleneck in the processing of a text. Apart
+%D from some other incompatilities we want to mention a pitfal
+%D when using \type{\ifnum}.
+%D
+%D \starttyping
+%D \ifnum\normalcounter=\pseudocounter \doif \else \doelse \fi
+%D \ifnum\pseudocounter=\normalcounter \doif \else \doelse \fi
+%D \stoptyping
+%D
+%D In the first test, \TEX\ continues it's search for the
+%D second number after reading \type{\pseudocounter}, while
+%D in the second test, it stops reading after having
+%D encountered a real one. Tests like the first one therefore
+%D can give unexpected results, for instance execution
+%D of \type{\doif} even if both numbers are unequal.
+
+\def\zerocountervalue{0}
+
+\def\newcounter#1%
+ {\dodoglobal\let#1\zerocountervalue}
+
+% This is the original implementation:
+%
+% \def\dodododoincrement(#1,#2)%
+% {\ifx#1\undefined
+% \redoglobal\let#1\zerocountervalue
+% \else\ifx#1\relax % \csname...\endcsname
+% \redoglobal\let#1\zerocountervalue
+% \fi\fi
+% \scratchcounter=#2\relax
+% \scratchcounter=\incrementsign\scratchcounter
+% \advance\scratchcounter #1\relax
+% \dodoglobal\edef#1{\the\scratchcounter}}
+%
+% \def\dododoincrement#1%
+% {\dodododoincrement(#1,1)}
+%
+% \def\dodoincrement(#1%
+% {\doifnextcharelse,%
+% {\dodododoincrement(#1}{\dodododoincrement(#1,1}}
+%
+% \def\doincrement#1%
+% {\def\incrementsign{#1}%
+% \doifnextcharelse(\dodoincrement\dododoincrement}
+%
+% \def\increment{\doincrement+}
+% \def\decrement{\doincrement-}
+%
+% And this is the one optimized for speed:
+
+% maxcounter = 2\maxdimen=1
+
+\def\!!zerocount {0} % alongside \zerocount
+\def\!!minusone {-1} % alongside \minusone
+\def\!!plusone {1} % alongside \plusone
+
+\beginTEX
+
+\def\dodoindecrement#1(#2,#3)%
+ {\ifx#2\undefined
+ \redoglobal\let#2\zerocountervalue
+ \else\ifx#2\relax % \csname...\endcsname
+ \redoglobal\let#2\zerocountervalue
+ \fi\fi
+ \scratchcounter#3\relax
+ \scratchcounter#1\scratchcounter
+ \advance\scratchcounter#2\relax
+ \dodoglobal\edef#2{\the\scratchcounter}}
+
+\def\dodoincrement(#1%
+ {\doifnextcharelse,{\dodoindecrement+(#1}{\dodoindecrement+(#1,1}}
+
+\def\dododecrement(#1%
+ {\doifnextcharelse,{\dodoindecrement-(#1}{\dodoindecrement-(#1,1}}
+
+\def\doincrement#1% 10% faster alternative
+ {\ifx#1\undefined
+ \dodoglobal\let#1\!!plusone
+ \else\ifx#1\relax % \csname...\endcsname
+ \dodoglobal\let#1\!!plusone
+ \else
+ \fastincrement#1%
+ \fi\fi}
+
+\def\dodecrement#1% 10% faster alternative
+ {\ifx#1\undefined
+ \dodoglobal\let#1\!!minusone
+ \else\ifx#1\relax % \csname...\endcsname
+ \dodoglobal\let#1\!!minusone
+ \else
+ \fastdecrement#1%
+ \fi\fi}
+
+\def\fastdecrement#1% 50% faster alternative
+ {\scratchcounter#1\advance\scratchcounter\minusone
+ \dodoglobal\edef#1{\the\scratchcounter}}
+
+\def\fastincrement#1% 50% faster alternative
+ {\scratchcounter#1\advance\scratchcounter\plusone
+ \dodoglobal\edef#1{\the\scratchcounter}}
+
+\endTEX
+
+\beginETEX \numexpr
+
+% \def\doindecrement#1#2%
+% {\dodoglobal\edef#2%
+% {\the\numexpr(\ifx#2\undefined\else\ifx#2\relax\else#2\fi\fi#11)}}
+%
+% \def\doincrement{\doindecrement+}
+% \def\dodecrement{\doindecrement-}
+%
+% some 3\% faster:
+
+\def\doindecrement#1#2%
+ {\dodoglobal\edef#2%
+ {\the\numexpr\ifx#2\undefined\else\ifx#2\relax\else#2\fi\fi+#1\relax}}
+
+\def\doincrement{\doindecrement\plusone }
+\def\dodecrement{\doindecrement\minusone}
+
+\def\dodoindecrement#1#2,#3)%
+ {\dodoglobal\edef#2%
+ {\the\numexpr\ifx#2\undefined\else\ifx#2\relax\else#2\fi\fi#1#3\relax}}
+
+\def\dodoincrement(#1%
+ {\doifnextcharelse,{\dodoindecrement+#1}{\dodoindecrement+#1,\plusone}}
+
+\def\dododecrement(#1%
+ {\doifnextcharelse,{\dodoindecrement-#1}{\dodoindecrement-#1,\plusone}}
+
+\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr#1+\plusone \relax}}
+\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr#1+\minusone\relax}}
+
+\endETEX
+
+\def\increment{\doifnextcharelse(\dodoincrement\doincrement}
+\def\decrement{\doifnextcharelse(\dododecrement\dodecrement}
+
+\def\incrementvalue#1{\expandafter\increment\csname#1\endcsname}
+\def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname}
+
+%D \macros
+%D {newsignal}
+%D
+%D When writing advanced macros, we cannot do without
+%D signaling. A signal is a small (invisible) kern or penalty
+%D that signals the next macro that something just happened.
+%D This macro can take any action depending on the previous
+%D signal. Signals must be unique and the next macro takes care
+%D of that.
+%D
+%D \starttyping
+%D \newsignal\somesignal
+%D \stoptyping
+%D
+%D Signals old dimensions and can be used in skips, kerns and
+%D tests like \type{\ifdim}.
+
+\newdimen\maximumsignal % step is about 0.00025pt
+
+\def\newsignal#1%
+ {\ifx#1\undefined
+ \advance\maximumsignal 2sp % to be save in rounding
+ \edef#1{\the\maximumsignal}%
+ \fi}
+
+%D \macros
+%D {newskimen}
+%D
+%D \TEX\ offers 256 \DIMENSIONS\ and \SKIPS. Unfortunately this
+%D amount is too small to suit certain packages. Therefore when
+%D possible one should use:
+%D
+%D \starttyping
+%D \newskimen\tempskimen
+%D \stoptyping
+%D
+%D This commands allocates a \DIMENSION\ or a \SKIP, depending
+%D on the availability. One should be aware of the difference
+%D between both. When searching for some glue \TEX\ goes on
+%D searching till it's sure that no other glue component if
+%D found. This search can be canceled by using \type{\relax}
+%D when possible and needed.
+%D
+%D \starttyping
+%D \def\newskimen#1%
+%D {\ifx#1\undefined
+%D \ifnum\count11>\count12
+%D \newskip#1\relax
+%D \else
+%D \newdimen#1\relax
+%D \fi
+%D \fi}
+%D \stoptyping
+%D
+%D In order to make this macro work in plain \TEX\ too, we
+%D use the following alternative, which fools \TEX\ about
+%D the new commands being \type {\outer} ones.
+
+% \def\newskimen#1%
+% {\ifx#1\undefined
+% \csname new\ifnum\count11>\count12 skip\else dimen\fi\endcsname#1%
+% \fi}
+
+\let\newskimen\newdimen % it's all etex or later now
+
+%D \macros
+%D {strippedcsname}
+%D
+%D The next macro can be very useful when using \type{\csname}
+%D like in:
+%D
+%D \starttyping
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptyping
+%D
+%D This expands to \type{\ifsomething}.
+%D
+%D \starttyping
+%D \def\strippedcsname
+%D {\expandafter\gobbleoneargument\string}
+%D \stoptyping
+%D
+%D Slower but better:
+
+\ifx\letterbackslash\undefined
+ {\catcode`.=0 .catcode`.\ 12 .xdef.letterbackslash{.string\}} % hack
+\fi
+
+\def\strippedcsname#1% this permits \strippedcsname{\xxx} and \strippedcsname{xxx}
+ {\expandafter\dostrippedcsname\string#1}
+
+\def\dostrippedcsname#1%
+ {\if\noexpand#1\letterbackslash\else#1\fi}
+
+%D \macros
+%D {savenormalmeaning}
+%D
+%D We will use this one in:
+
+\def\savenormalmeaning#1%
+ {\ifundefined{normal\strippedcsname#1}%
+ \letvalue{normal\strippedcsname#1}#1%
+ \fi}
+
+%D \macros
+%D {newconditional,
+%D settrue, setfalse,
+%D ifconditional,then}
+%D
+%D \TEX's lacks boolean variables, although the \PLAIN\ format
+%D implements \type{\newif}. The main disadvantage of this
+%D scheme is that it takes three hash table entries. A more
+%D memory saving alternative is presented here. A conditional
+%D is defined by:
+%D
+%D \starttyping
+%D \newconditional\doublesided
+%D \setfalse
+%D \stoptyping
+%D Setting a conditional is done by \type{\settrue} and
+%D \type{\setfalse}:
+%D
+%D \starttyping
+%D \settrue\doublesided
+%D \setfalse
+%D \stoptyping
+%D while testing is accomplished by:
+%D
+%D \starttyping
+%D \ifconditional\doublesided ... \else ... \fi
+%D \setfalse
+%D \stoptyping
+%D We cannot use the simple scheme:
+%D
+%D \starttyping
+%D \def\settrue #1{\let#1=\iftrue}
+%D \def\setfalse#1{\let#1=\iffalse}
+%D \stoptyping
+%D
+%D Such an implementation gives problems with nested
+%D conditionals. The next implementation is abaou as fast
+%D and just as straightforward:
+
+\def\settrue #1{\chardef#1\zerocount}
+\def\setfalse#1{\chardef#1\plusone}
+
+\let\newconditional = \setfalse
+\let\ifconditional = \ifcase
+
+\let\then\relax % so that we can say \ifnum1>2\then -)
+
+%D \macros
+%D {ifzeropt}
+%D
+%D The next macro is both cosmetic and byte saving. It is
+%D pretty \type{\if}||safe too. It can be used in cases
+%D like:
+%D
+%D \starttyping
+%D \ifzeropt \somedimen ... \else ... \fi
+%D \stoptyping
+
+\let\ifzeropt\ifcase
+
+%D \macros
+%D {dorecurse,recurselevel,recursedepth,
+%D dostepwiserecurse,
+%D for}
+%D
+%D \TEX\ does not offer us powerfull for||loop mechanisms. On
+%D the other hand its recursion engine is quite unique. We
+%D therefore identify the for||looping macros by this method.
+%D The most simple alternative is the one that only needs a
+%D number.
+%D
+%D \starttyping
+%D \dorecurse {n} {whatever we want}
+%D \stoptyping
+%D
+%D This macro can be nested without problems and therefore be
+%D used in situations where \PLAIN\ \TEX's \type{\loop} macro
+%D ungracefully fails. The current value of the counter is
+%D available in \type{\recurselevel}, before as well as after
+%D the \typ{whatever we wat} stuff.
+%D
+%D \starttyping
+%D \dorecurse % inner loop
+%D {10}
+%D {\recurselevel: % outer value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \endgraf}
+%D \stoptyping
+%D
+%D In this example the first, second and fourth
+%D \type{\recurselevel} concern the outer loop, while the third
+%D and fifth one concern the inner loop. The depth of the
+%D nesting is available for inspection in \type{\recursedepth}.
+%D
+%D Both \type{\recurselevel} and \type{\recursedepth} are
+%D macros. The real \COUNTERS\ are hidden from the user because
+%D we don't want any interference.
+
+\newcount\outerrecurse
+\newcount\innerrecurse
+
+\def\recursedepth{\the\outerrecurse}
+\def\recurselevel{0}
+
+\let\nextrecurse\relax
+
+%D Acceptable:
+%D
+%D \starttyping
+%D \long\def\dostepwiserecurse#1#2#3%
+%D {\let\nextrecurse\gobblefourarguments
+%D \ifnum#3>0\relax\ifnum#2<#1\relax\else
+%D \def\nextrecurse{\dosetstepwiserecurse>}%
+%D \fi\fi
+%D \ifnum#3<0\relax\ifnum#1<#2\relax\else
+%D \def\nextrecurse{\dosetstepwiserecurse<}%
+%D \fi\fi
+%D \nextrecurse{#1}{#2}{#3}}
+%D \stoptyping
+%D
+%D Better:
+%D
+%D \starttyping
+%D \long\def\dostepwiserecurse#1#2#3%
+%D {\let\nextrecurse\gobblefourarguments
+%D \ifnum#3>0\relax \ifnum#2<#1\relax \else
+%D \def\nextrecurse{\dosetstepwiserecurse>}%
+%D \fi \else \ifnum#3<0\relax \ifnum#1<#2\relax \else
+%D \def\nextrecurse{\dosetstepwiserecurse<}%
+%D \fi \fi \fi
+%D \nextrecurse{#1}{#2}{#3}}
+%D
+%D \def\@@irecurse{@@irecurse} % stepper
+%D \def\@@nrecurse{@@nrecurse} % number of steps
+%D \def\@@srecurse{@@srecurse} % step
+%D \def\@@drecurse{@@drecurse} % direction, < or >
+%D \def\@@arecurse{@@arecurse} % action
+%D
+%D \long\def\dosetstepwiserecurse#1#2#3#4#5%
+%D {\global\advance\outerrecurse 1
+%D \setevalue{\@@drecurse\recursedepth}{#1}%
+%D \setevalue{\@@irecurse\recursedepth}{\number#2}%
+%D \setevalue{\@@nrecurse\recursedepth}{\number#3}%
+%D \setevalue{\@@srecurse\recursedepth}{\number#4}%
+%D \long\setvalue{\@@arecurse\recursedepth}{#5}%
+%D \dodorecurse}
+%D
+%D \def\donorecurse
+%D {}
+%D
+%D \def\dododorecurse
+%D {\edef\recurselevel{\csname\@@irecurse\recursedepth\endcsname}%
+%D \getvalue{\@@arecurse\recursedepth}%
+%D \edef\recurselevel{\csname\@@irecurse\recursedepth\endcsname}%
+%D \innerrecurse\recurselevel
+%D \advance\innerrecurse \csname\@@srecurse\recursedepth\endcsname
+%D \setevalue{\@@irecurse\recursedepth}{\the\innerrecurse}%
+%D \dodorecurse}
+%D
+%D \def\dodorecurse
+%D {\ifnum\csname\@@irecurse\recursedepth\endcsname
+%D \csname\@@drecurse\recursedepth\endcsname
+%D \csname\@@nrecurse\recursedepth\endcsname\relax
+%D \expandafter\nododorecurse
+%D \else
+%D \expandafter\dododorecurse
+%D \fi}
+%D
+%D \def\nododorecurse
+%D {\global\advance\outerrecurse -1
+%D \edef\recurselevel{\csname\@@irecurse\recursedepth\endcsname}}
+%D \stoptyping
+%D
+%D Cleaner and much faster:
+
+\def\@@irecurse{@@ir@@} % ecurse} % stepper
+\def\@@arecurse{@@ar@@} % ecurse} % action
+
+% \mathchardef
+
+\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#4}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \ifnum#3>0\relax
+ \ifnum#2<#1\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwiserecurse
+ \fi
+ \else
+ \ifnum#3<0\relax
+ \ifnum#1<#2\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwisereverse
+ \fi
+ \else
+ \let\nextrecurse\exitstepwiserecurse
+ \fi
+ \fi\expanded{\nextrecurse{\number#1}{\number#2}{\number#3}}}
+
+\beginETEX \numexpr
+
+\long\def\dodostepwiserecurse#1#2#3% from to step
+ {\ifnum#1>#2\relax
+ \@EA\nodostepwiserecurse
+ \else
+ \def\recurselevel{#1}%
+ \@EAEAEA\redostepwiserecurse\@EA
+ \fi\@EA{\the\numexpr\recurselevel+#3\relax}{#2}{#3}}
+
+\endETEX
+
+\beginTEX
+
+\long\def\dodostepwiserecurse#1#2#3% from to step
+ {\ifnum#1>#2\relax
+ \@EA\nodostepwiserecurse
+ \else
+ \def\recurselevel{#1}%
+ \innerrecurse#1\advance\innerrecurse#3\relax
+ \@EAEAEA\redostepwiserecurse\@EA
+ \fi\@EA{\the\innerrecurse}{#2}{#3}}
+
+\endTEX
+
+\def\expandrecursecontent
+ {\csname\@@arecurse\recursedepth\endcsname}
+
+\def\redostepwiserecurse
+ {\expandrecursecontent\dodostepwiserecurse}
+
+\beginETEX \numexpr
+
+\long\def\dodostepwisereverse#1#2#3% from to step
+ {\ifnum#1<#2\relax
+ \@EA\nodostepwiserecurse
+ \else
+ \def\recurselevel{#1}%
+ \@EAEAEA\redostepwisereverse\@EA
+ \fi\@EA{\the\numexpr\recurselevel#3\relax}{#2}{#3}}
+
+\endETEX
+
+\beginTEX
+
+\long\def\dodostepwisereverse#1#2#3% from to step
+ {\ifnum#1<#2\relax
+ \@EA\nodostepwiserecurse
+ \else
+ \def\recurselevel{#1}%
+ \innerrecurse#1\relax
+ \advance\innerrecurse#3\relax
+ \@EAEAEA\redostepwisereverse\@EA
+ \fi\@EA{\the\innerrecurse}{#2}{#3}}
+
+\endTEX
+
+\def\redostepwisereverse
+ {\expandrecursecontent\dodostepwisereverse}
+
+\def\exitstepwiserecurse
+ {\nodostepwiserecurse\relax}
+
+\def\nodostepwiserecurse#1#2#3#4%
+ {\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\def\nonostepwiserecurse#1#2#3%
+ {\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\def\dorecurse#1%
+ {\dostepwiserecurse1{#1}1}
+
+%D As we can see here, the simple command \type{\dorecurse} is
+%D a special case of the more general:
+%D
+%D \starttyping
+%D \dostepwiserecurse {from} {to} {step} {action}
+%D \stoptyping
+%D
+%D This commands accepts positive and negative steps. Illegal
+%D values are handles as good as possible and the macro accepts
+%D numbers and \COUNTERS.
+%D
+%D \starttyping
+%D \dostepwiserecurse {1} {10} {2} {...}
+%D \dostepwiserecurse {10} {1} {-2} {...}
+%D \stoptyping
+%D
+%D Because the simple case is used often, we implement it
+%D more efficiently:
+
+\long\def\dorecurse#1%
+ {\ifcase#1\relax
+ \expandafter\gobbletwoarguments
+ \or
+ \expandafter\ydorecurse
+ \else
+ \expandafter\xdorecurse
+ \fi{#1}}
+
+\long\def\xdorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#2}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \@EA\dodorecurse\@EA1\@EA{\number#1}}
+
+\long\def\ydorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\recurselevel\!!plusone
+ #2%
+ \@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\beginETEX \numexpr
+
+\long\def\dodorecurse#1#2% from to
+ {\ifnum#1>#2\relax
+ \@EA\nodorecurse
+ \else
+ \def\recurselevel{#1}%
+ \@EAEAEA\redorecurse
+ \fi\@EA{\the\numexpr\recurselevel+\plusone\relax}{#2}}
+
+\endETEX
+
+\beginTEX
+
+\long\def\dodorecurse#1#2% from to
+ {\ifnum#1>#2\relax
+ \@EA\nodorecurse
+ \else
+ \def\recurselevel{#1}%
+ \innerrecurse#1\advance\innerrecurse\plusone
+ \@EAEAEA\redorecurse
+ \fi\@EA{\the\innerrecurse}{#2}}
+
+\endTEX
+
+\def\redorecurse
+ {\expandrecursecontent\dodorecurse}
+
+\def\nodorecurse#1#2#3%
+ {\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone }
+
+%D \macros
+%D {doloop,exitloop}
+%D
+%D Sometimes loops are not determined by counters, but by
+%D (a combinations of) conditions. We therefore implement a
+%D straightforward loop, which can only be left when we
+%D explictly exit it. Nesting is supported. First we present
+%D a more extensive alternative.
+%D
+%D \starttyping
+%D \doloop
+%D {Some kind of typesetting punishment \par
+%D \ifnum\pageno>100 \exitloop \fi}
+%D \stoptyping
+%D
+%D When needed, one can call for \type{\looplevel} and
+%D \type{\loopdepth}.
+%D
+%D If we write this macros from scratch, we end up with
+%D something like the ones described above:
+%D
+%D \starttyping
+%D \def\@@eloop{@@eloop} % exit
+%D \def\@@iloop{@@iloop} % stepper
+%D \def\@@aloop{@@aloop} % action
+%D
+%D \newcount\outerloop
+%D
+%D \def\loopdepth%
+%D {\the\outerloop}
+%D
+%D \def\exitloop%
+%D {\setevalue{\@@eloop\loopdepth}{0}}
+%D
+%D \long\def\doloop#1%
+%D {\global\advance\outerloop by 1
+%D \setevalue{\@@iloop\loopdepth}{1}%
+%D \setevalue{\@@eloop\loopdepth}{1}%
+%D \long\setvalue{\@@aloop\loopdepth}{#1}%
+%D \dodoloop}
+%D
+%D \def\dodonoloop%
+%D {\global\advance\outerloop by -1\relax}
+%D
+%D \def\dododoloop%
+%D {\edef\looplevel{\getvalue{\@@iloop\loopdepth}}%
+%D \innerrecurse=\looplevel
+%D \advance\innerrecurse by 1
+%D \setevalue{\@@iloop\loopdepth}{\the\innerrecurse}%
+%D \getvalue{\@@aloop\loopdepth}%
+%D \edef\looplevel{\getvalue{\@@iloop\loopdepth}}%
+%D \dodoloop}
+%D
+%D \def\dodoloop%
+%D {\ifnum\getvalue{\@@eloop\loopdepth}=0
+%D \expandafter\dodonoloop
+%D \else
+%D \expandafter\dododoloop
+%D \fi}
+%D
+%D \def\doloop%
+%D {\dostepwiserecurse{1}{\maxdimen}{1}}
+%D
+%D \def\exitloop
+%D {\setvalue{\@@irecurse\recursedepth}{\maxdimen}}
+%D
+%D \def\looplevel{\recurselevel}
+%D \def\loopdepth{\recursedepth}
+%D \stoptyping
+%D
+%D We don't have to declare new counters for \type{\looplevel}
+%D and \type{\loopdepth} because we can use \type{\recurselevel}
+%D and \type{\recursedepth}.
+%D
+%D We prefer however a more byte saving implementation, that
+%D executes of course a bit slower.
+%D
+%D \starttyping
+%D \def\doloop%
+%D {\dostepwiserecurse1\maxdimen1}
+%D
+%D \def\exitloop%
+%D {\letvalue{\@@irecurse\recursedepth}\maxdimen}
+%D \stoptyping
+%D
+%D Although, the next version is faster because it used the
+%D simple loop.
+
+\let\endofloop\donothing
+
+\long\def\doloop#1%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#1}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\endofloop\dodoloop
+ \dodoloop1} % no \plusone else \recurselevel wrong
+
+\beginETEX \numexpr
+
+\long\def\dodoloop#1%
+ {\def\recurselevel{#1}%
+ \@EA\redoloop\@EA{\the\numexpr\recurselevel+\plusone\relax}}
+
+\endETEX
+
+\beginTEX
+
+\long\def\dodoloop#1%
+ {\def\recurselevel{#1}%
+ \innerrecurse#1\advance\innerrecurse\plusone
+ \@EA\redoloop\@EA{\the\innerrecurse}}
+
+\endTEX
+
+\def\redoloop
+ {\expandrecursecontent\endofloop}
+
+\def\nodoloop#1%
+ {\let\endofloop\dodoloop % new, permits nested \doloop's
+ \@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse\minusone}
+
+\def\exitloop % \exitloop quits at end
+ {\let\endofloop\nodoloop}
+
+\long\def\exitloopnow#1\endofloop % \exitloopnow quits directly
+ {\nodoloop}
+
+%D The loop is executed at least once, so beware of situations
+%D like:
+%D
+%D \starttyping
+%D \doloop {\exitloop some commands}
+%D \stoptyping
+%D
+%D It's just a matter of putting the text into the \type{\if}
+%D statement that should be there anyway, like in:
+%D
+%D \starttyping
+%D \doloop {\ifwhatever \exitloop \else some commands\fi}
+%D \stoptyping
+%D
+%D You can also quit a loop immediately, by using \type
+%D {\exitloopnow} instead. Beware, this is more sensitive
+%D for conditional errors.
+
+%D Krzysztof Leszczynski suggested to provide access to the level by
+%D means of a \type {#1}. I decided to pass the more frequently used
+%D level as \type {#1} and the less favoured depth as \type {#2}. The
+%D intended usage is:
+%D
+%D \starttyping
+%D \dorecurse{3}{\definesymbol[test-#1][xx-#1]}
+%D
+%D \def\test{\dorecurse{3}{\definesymbol[test-##1][xx-##1]}} \test
+%D
+%D \symbol[test-1]\quad\symbol[test-2]\quad\symbol[test-3]
+%D \stoptyping
+%D
+%D Since the hashed arguments are expanded, we don't need tricky
+%D expansion here.
+%D
+%D \starttyping
+%D \dorecurse{3}{\expanded{\definesymbol[test-\recurselevel][xx-\recurselevel]}}
+%D \stoptyping
+
+\def\expandrecursecontent
+ {\csname\@@arecurse\recursedepth\@EA\@EA\@EA\endcsname\@EA\@EA\@EA{\@EA\recurselevel\@EA}\@EA{\recursedepth}}
+
+\long\def\xdorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \@EA\dodorecurse\@EA1\@EA{\number#1}}
+
+\long\def\ydorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\recurselevel\!!plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}%
+ \expandrecursecontent
+ \@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone}
+
+\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \ifnum#3>0\relax
+ \ifnum#2<#1\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwiserecurse
+ \fi
+ \else
+ \ifnum#3<0\relax
+ \ifnum#1<#2\relax
+ \let\nextrecurse\exitstepwiserecurse
+ \else
+ \let\nextrecurse\dodostepwisereverse
+ \fi
+ \else
+ \let\nextrecurse\exitstepwiserecurse
+ \fi
+ \fi\expanded{\nextrecurse{\number#1}{\number#2}{\number#3}}}
+
+\long\def\doloop#1%
+ {\global\advance\outerrecurse \plusone
+ \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#1}%
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \let\endofloop\dodoloop
+ \dodoloop1} % no \plusone else \recurselevel wrong
+
+%D For special purposes:
+
+\newcount\fastrecursecounter
+\newcount\lastrecursecounter
+\newcount\steprecursecounter
+
+\def\dofastrecurse#1#2#3#4%
+ {\def\fastrecursebody{#4}%
+ \fastrecursecounter#1\relax
+ \lastrecursecounter#2\relax
+ \steprecursecounter#3\relax
+ \def\recurselevel{\number\fastrecursecounter}%
+ \dodofastrecurse}
+
+\def\resetrecurselevel{\let\recurselevel\!!zerocount}
+
+\def\dodofastrecurse
+ {\ifnum\fastrecursecounter>\lastrecursecounter
+ % \resetrecurselevel % slows down
+ \else
+ \fastrecursebody
+ \advance\fastrecursecounter\steprecursecounter
+ \expandafter\dodofastrecurse
+ \fi}
+
+% \appendtoks \resetrecurselevel \to \everydump
+
+\everydump\expandafter{\the\everydump\resetrecurselevel}
+
+%D This alternative looks a bit different and uses a
+%D pseudo counter. When this macro is nested, we have to use
+%D different counters. This time we use keywords.
+%D
+%D \starttyping
+%D \def\alfa{2} \def\beta{100} \def\gamma{3}
+%D
+%D \for \n=55 \to 100 \step 1 \do {... \n ...}
+%D \for \n=\alfa \to \beta \step \gamma \do {... \n ...}
+%D \for \n=\n \to 120 \step 1 \do {... \n ...}
+%D \for \n=120 \to 100 \step -3 \do {... \n ...}
+%D \for \n=55 \to 100 \step 2 \do {... \n ...}
+%D \stoptyping
+%D
+%D Only in the third example we need to predefine \type{\n}.
+%D The use of \type{\od} as a dilimiter would have made nested
+%D use more problematic.
+
+%D Don't use this one, it's kind of obsolete.
+
+\def\for#1=#2\to#3\step#4\do#5%
+ {\dostepwiserecurse{#2}{#3}{#4}
+ {\let#1\recurselevel#5\let#1\recurselevel}}
+
+%D \macros
+%D {newevery,everyline,EveryLine,EveryPar}
+%D
+%D Lets skip to something quite different. It's common use
+%D to use \type{\everypar} for special purposes. In \CONTEXT\
+%D we use this primitive for locating sidefloats. This means
+%D that when user assignments to \type{\everypar} can interfere
+%D with those of the package. We therefore introduce
+%D \type{\EveryPar}.
+%D
+%D The same goes for \type{\EveryLine}. Because \TEX\ offers
+%D no \type{\everyline} primitive, we have to call for
+%D \type{\everyline} when we are working on a line by line
+%D basis. Just by calling \type{\EveryPar{}} and
+%D \type{\EveryLine{}} we restore the old situation.
+%D
+%D The definition command \type{\DoWithEvery} will be quite
+%D unreadable, so let's first show an implementation that
+%D shows how things are done:
+%D
+%D \starttyping
+%D \newtoks \everyline
+%D \newtoks \oldeveryline
+%D \newif \ifeveryline
+%D
+%D \def\DoWithEvery#1#2#3#4%
+%D {#3\else\edef\next{\noexpand#2={\the#1}}\next\fi
+%D \edef\next{\noexpand#1={\the#2\the\scratchtoks}}\next
+%D #4}
+%D
+%D \def\doEveryLine%
+%D {\DoWithEvery\everyline\oldeveryline\ifeveryline\everylinetrue}
+%D
+%D \def\EveryLine%
+%D {\afterassignment\doEveryLine\scratchtoks}
+%D \stoptyping
+%D
+%D The real implementation is a bit more complicated but we
+%D prefer something more versatile.
+
+% the old one
+%
+% \def\DoWithEvery#1%
+% {\csname if\strippedcsname#1\endcsname \else
+% \edef\next%
+% {\@EA\noexpand\csname old\strippedcsname#1\endcsname=
+% {\the#1}}%
+% \next
+% \fi
+% \edef\next%
+% {\noexpand#1=
+% {\@EA\the\csname old\strippedcsname#1\endcsname\the\scratchtoks}}%
+% \next
+% \csname\strippedcsname#1true\endcsname}
+%
+% \def\dowithevery#1%
+% {\@EA\afterassignment\csname do\strippedcsname#1\endcsname\scratchtoks}
+%
+% \def\newevery#1#2%
+% {\ifx#1\undefined\newtoks#1\fi
+% \ifx#2\relax\else\ifx#2\undefined
+% \@EA\newtoks\csname old\strippedcsname#1\endcsname
+% \@EA\newif \csname if\strippedcsname#1\endcsname
+% \@EA\def \csname do\strippedcsname#2\endcsname{\DoWithEvery#1}%
+% \def#2{\dowithevery#2}%
+% \fi\fi}
+%
+% cleaner and more efficient
+
+%\def\dowithevery#1%
+% {\def\dodowithevery%
+% {\ifcase\csname c\strippedcsname#1\endcsname \expandafter\chardef
+% \csname c\strippedcsname#1\endcsname=1
+% \csname t\strippedcsname#1\endcsname=#1%
+% \fi
+% \edef\next%
+% {#1={\the\csname t\strippedcsname#1\endcsname\the\scratchtoks}}%
+% \next}%
+% \afterassignment\dodowithevery\scratchtoks}
+%
+% more efficient:
+
+\def\dodowithevery#1%
+ {\ifcase\csname c\strippedcsname#1\endcsname \expandafter\chardef
+ \csname c\strippedcsname#1\endcsname1
+ \csname t\strippedcsname#1\endcsname#1%
+ \fi
+ \edef\next%
+ {#1{\the\csname t\strippedcsname#1\endcsname\the\scratchtoks}}%
+ \next}
+
+\def\dowithevery#1%
+ {\def\next{\dodowithevery#1}%
+ \afterassignment\next\scratchtoks}
+
+\bgroup \let\newtoks\relax % plain safe (\outer)
+
+\gdef\newevery#1#2%
+ {\ifx#1\undefined\csname newtoks\endcsname#1\fi % plain safe (\outer)
+ \ifx#2\relax\else\ifx#2\undefined
+ \expandafter\newtoks\csname t\strippedcsname#1\endcsname
+ \expandafter\chardef\csname c\strippedcsname#1\endcsname\zerocount
+ \def#2{\dowithevery#1}%
+ \fi\fi}
+
+\egroup
+
+%D The first \type {\outer} hack is needed to trick \TEX\
+%D into thinking that \type {\newtoks} is no outer macro,
+%D the second hack is needed due to some funny interaction
+%D between outer macros and \type {\if} at expansion time.
+
+%D This one permits definitions like:
+
+\newevery \everypar \EveryPar
+\newevery \everyline \EveryLine
+
+%D and how about:
+
+\newevery \neverypar \NeveryPar
+
+%D Which we're going to use indeed! When the second argument
+%D equals \type {\relax}, the first token list is created
+%D unless it is already defined.
+
+%D Technically spoken we could have used the method we are
+%D going to present in the visual debugger. First we save
+%D the primitive \type{\everypar}:
+%D
+%D \starttyping
+%D \let\normaleverypar=\everypar
+%D \stoptyping
+%D
+%D Next we allocate a \TOKENLIST\ named \type{\everypar},
+%D which means that \type{\everypar} is no longer a primitive
+%D but something like \type{\toks44}.
+%D
+%D \starttyping
+%D \newtoks\everypar
+%D \stoptyping
+%D
+%D Because \TEX\ now executes \type{\normaleverypar} instead
+%D of \type{\everypar}, we are ready to assign some tokens to
+%D this internally known and used \TOKENLIST.
+%D
+%D \starttyping
+%D \normaleverypar={all the things the system wants to do \the\everypar}
+%D \stoptyping
+%D
+%D Where the user can provide his own tokens to be expanded
+%D every time he expects them to expand.
+%D
+%D \starttyping
+%D \everypar={something the user wants to do}
+%D \stoptyping
+%D
+%D We don't use this method because it undoubtly leads to
+%D confusing situations, especially when other packages are
+%D used, but it's this kind of tricks that make \TEX\ so
+%D powerful.
+
+%D \macros
+%D {convertargument,convertcommand,convertvalue}
+%D
+%D Some persistent experimenting led us to the next macro. This
+%D macro converts a parameter or an expanded macro to it's
+%D textual meaning.
+%D
+%D \starttyping
+%D \convertargument ... \to \command
+%D \stoptyping
+%D
+%D For example,
+%D
+%D \starttyping
+%D \convertargument{one \two \three{four}}\to\ascii
+%D \stoptyping
+%D
+%D The resulting macro \type{\ascii} can be written to a file
+%D or the terminal without problems. In \CONTEXT\ we use this
+%D macro for generating registers and tables of contents.
+%D
+%D The second conversion alternative accepts a command:
+%D
+%D \starttyping
+%D \convertcommand\command\to\ascii
+%D \stoptyping
+%D
+%D Both commands accept the prefix \type{\doglobal} for global
+%D assignments.
+
+\beginTEX
+
+\def\doconvertargument#1>{}
+
+\def\convertedcommand
+ {\expandafter\doconvertargument\meaning}
+
+\long\def\convertargument#1\to#2%
+ {\long\def#2{#1}% saves a restore
+ \dodoglobal\edef#2{\convertedcommand#2}}
+
+\long\def\convertcommand#1\to#2%
+ {\dodoglobal\edef#2{\convertedcommand#1}}
+
+% no dodoglobal !
+
+\long\def\defconvertedargument#1#2% less sensitive for \to
+ {\long\def#1{#2}% saves a restore
+ \edef#1{\convertedcommand#1}}
+
+\long\def\defconvertedcommand#1#2% less sensitive for \to
+ {\edef#1{\convertedcommand#2}}
+
+\long\def\gdefconvertedargument#1#2% less sensitive for \to
+ {\long\gdef#1{#2}% saves a restore
+ \xdef#1{\convertedcommand#1}}
+
+\long\def\gdefconvertedcommand#1#2% less sensitive for \to
+ {\xdef#1{\convertedcommand#2}}
+
+\endTEX
+
+\def\convertvalue#1\to
+ {\expandafter\convertcommand\csname#1\endcsname\to}
+
+\def\defconvertedvalue#1#2% less sensitive for \to
+ {\@EA\defconvertedcommand\@EA#1\csname#2\endcsname}
+
+%D \macros
+%D {doifassignmentelse}
+%D
+%D A lot of \CONTEXT\ commands take optional arguments, for
+%D instance:
+%D
+%D \starttyping
+%D \dothisorthat[alfa,beta]
+%D \dothisorthat[first=foo,second=bar]
+%D \dothisorthat[alfa,beta][first=foo,second=bar]
+%D \stoptyping
+%D
+%D Although a combined solution is possible, we prefer a
+%D seperation. The next command takes care of propper
+%D handling of such multi||faced commands.
+%D
+%D \starttyping
+%D \doifassignmentelse {...} {then ...} {else ...}
+%D \stoptyping
+
+% not robust
+%
+% \def\doifassignmentelse%
+% {\doifinstringelse{=}}
+%
+% readable
+%
+% \def\doifassignmentelse#1%
+% {\convertargument#1\to\ascii
+% \doifinstringelse{=}{\ascii}}
+
+\def\doifassignmentelse#1%
+ {\convertargument#1\to\ascii
+ \doifinstringelse=\ascii}
+
+%D \macros
+%D {convertasciiafter}
+%D
+%D Sometimes we need to convert an argument to a string (letters
+%D only), for instance when we compare it with another string:
+%D
+%D \starttyping
+%D \convertasciiafter\doifinstringelse{em}{\ascii}{...}
+%D \stoptyping
+
+\def\convertasciiafter#1#2%
+ {\convertargument#2\to\asciiafter
+ \@EA#1\@EA{\asciiafter}}
+
+%D In \ETEX\ we can use \type {\detokenize} and gain some
+%D speed, but in general far less that 1\% for \type
+%D {\convertargument} and nil for \type {\convertcommand}.
+%D This macro is more robust than the pure \TEX\ one,
+%D something I found out when primitives like \type
+%D {\jobname} were fed (or something undefined).
+
+% command variant: one level expansion !
+
+\beginETEX \detokenize
+
+\long\def\convertargument#1\to#2{\dodoglobal\edef#2{\detokenize{#1}}}
+\long\def\convertcommand #1\to#2{\dodoglobal\edef#2{\@EA\detokenize\@EA{#1}}} % hm, only second is also ok
+
+\long\def\defconvertedargument #1#2{\edef#1{\detokenize {#2}}}
+\long\def\defconvertedcommand #1#2{\edef#1{\detokenize\@EA{#2}}}
+\long\def\edefconvertedargument#1#2{\edef#1{#2}%
+ \edef#1{\detokenize\@EA{#1}}}
+\long\def\gdefconvertedargument#1#2{\xdef#1{\detokenize {#2}}}
+\long\def\gdefconvertedcommand #1#2{\xdef#1{\detokenize\@EA{#2}}}
+\long\def\xdefconvertedargument#1#2{\xdef#1{#2}%
+ \xdef#1{\detokenize\@EA{#1}}}
+
+\endETEX
+
+%D When you try to convert a primitive command, you'll find
+%D out that the \ETEX\ method fails on for instance \type
+%D {\jobname} in the sense that it returns the filename
+%D instead of just \type {\jobname}. So far this does not
+%D give real problems.
+
+%D This is typically a macro that one comes to after reading
+%D the \TEX book carefully. Even then, the definite solution
+%D was found after rereading the \TEX book. The first
+%D implementation was:
+%D
+%D \starttyping
+%D \def\doconvertargument#1->#2\\\\{#2}
+%D \stoptyping
+%D
+%D The \type{-}, the delimiter \type{\\\\} and the the second
+%D argument are completely redundant.
+
+%D \macros
+%D {showvalue,showargument}
+%D
+%D Two handy macros for testing purposes only:
+
+\def\showvalue#1%
+ {\expandafter\show\csname#1\endcsname}
+
+\beginETEX
+
+\def\showvalue#1%
+ {\ifcsname#1\endcsname
+ \expandafter\show\csname#1\endcsname
+ \else
+ \show\undefined
+ \fi}
+
+\endETEX
+
+\long\def\showargument#1%
+ {\defconvertedargument\ascii{#1}\ascii}
+
+%D \macros
+%D {doifmeaningelse}
+%D
+%D We can use both commands in testing, but alas, not all
+%D meanings expand to something \type {->}. This is no problem
+%D in the \ETEX\ implementation, but since we want
+%D compatibility, we need:
+%D
+%D \starttyping
+%D \doifmeaningelse {\next} {\something} {true} {false}
+%D \stoptyping
+%D
+%D Watch the one level expansion of the second argument.
+
+\def\doifmeaningelse#1#2%
+ {\edef\!!stringa{\meaning#1}%
+ \def\!!stringb{#2}\edef\!!stringb{\meaning\!!stringb}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifsamestringselse,doifsamestring,doifnotsamestring}
+%D
+%D The next comparison macro converts the arguments into
+%D expanded strings. This command can be used to compare for
+%D instance \type {\jobname} with a name stored in a macro.
+
+\def\@@doifsamestringelse#1#2%
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \convertcommand\!!stringa\to\!!stringa
+ \convertcommand\!!stringb\to\!!stringb
+ \ifx\!!stringa\!!stringb}
+
+\def\doifsamestringelse#1#2%
+ {\@@doifsamestringelse{#1}{#2}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifsamestring#1#2%
+ {\@@doifsamestringelse{#1}{#2}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotsamestring#1#2%
+ {\@@doifsamestringelse{#1}{#2}%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {ExpandFirstAfter,ExpandSecondAfter,ExpandBothAfter}
+%D
+%D These three commands support expansion of arguments before
+%D executing the commands that uses them. We can best
+%D illustrate this with an example.
+%D
+%D \starttyping
+%D \def\first {alfa,beta,gamma}
+%D \def\second {alfa,epsilon,zeta}
+%D
+%D \ExpandFirstAfter \doifcommon {\first} {alfa} {\message{OK}}
+%D \ExpandSecondAfter \doifcommon {alfa} {\second} {\message{OK}}
+%D \ExpandBothAfter \doifcommon {\first} {\second} {\message{OK}}
+%D
+%D \ExpandFirstAfter\processcommalist[\first]\message
+%D
+%D \ExpandAfter \doifcommon {\first} {alfa} {\message{OK}}
+%D \stoptyping
+%D
+%D The first three calls result in the threefold message
+%D \type{OK}, the fourth one shows the three elements of
+%D \type{\first}. The command \type{\ExpandFirstAfter} takes
+%D care of (first) arguments that are delimited by \type{[ ]},
+%D but the faster \type{\ExpandAfter} does not.
+
+\def\simpleExpandFirstAfter#1%
+ {\long\xdef\@@expanded{\noexpand\ExpandCommand{#1}}\@@expanded}
+
+\def\complexExpandFirstAfter[#1]%
+ {\long\xdef\@@expanded{\noexpand\ExpandCommand[#1]}\@@expanded}
+
+\def\ExpandFirstAfter#1%
+ {\let\ExpandCommand#1%
+ \doifnextoptionalelse\complexExpandFirstAfter\simpleExpandFirstAfter}
+
+\def\ExpandSecondAfter#1#2#3%
+ {\scratchtoks{#2}%
+ \long\xdef\@@expanded{\noexpand#1{\the\scratchtoks}{#3}}\@@expanded}
+
+\def\ExpandBothAfter#1#2#3%
+ {\long\xdef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
+
+\def\ExpandAfter#1#2%
+ {\long\xdef\@@expanded{\noexpand#1{#2}}\@@expanded}
+
+%D Now we can for instance define \type{\ifinstringelse} as:
+
+\def\ifinstringelse
+ {\ExpandBothAfter\p!doifinstringelse}
+
+%D \macros
+%D {ConvertToConstant,ConvertConstantAfter}
+%D
+%D When comparing arguments with a constant, we can get into
+%D trouble when this argument consists of tricky expandable
+%D commands. One solution for this is converting the
+%D argument to a string of unexpandable characters. To make
+%D comparison possible, we have to convert the constant too
+%D
+%D \starttyping
+%D \ConvertToConstant\doifelse {...} {...} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This construction is only needed when the first argument
+%D can give troubles. Misuse can slow down processing.
+%D
+%D \starttyping
+%D \ConvertToConstant\doifelse{\c!alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {alfa} {...}{...}
+%D \ConvertToConstant\doifelse{alfa \alfa test}{\c!alfa}{...}{...}
+%D \stoptyping
+%D
+%D In examples~2 and~3 both arguments equal, in~1 and~4
+%D they differ.
+
+\beginTEX
+
+\long\def\ConvertToConstant#1#2#3%
+ {\expandafter\defconvertedargument\expandafter\!!stringa\expandafter{#2}%
+ \expandafter\defconvertedargument\expandafter\!!stringb\expandafter{#3}%
+ #1{\!!stringa}{\!!stringb}}
+
+\endTEX
+
+\beginETEX \detokenize
+
+\long\def\ConvertToConstant#1#2#3%
+ {\edef\!!stringa{\expandafter\detokenize\expandafter{#2}}%
+ \edef\!!stringb{\expandafter\detokenize\expandafter{#3}}%
+ #1{\!!stringa}{\!!stringb}}
+
+\endETEX
+
+%D When the argument \type{#1} consists of commands, we had
+%D better use
+%D
+%D \starttyping
+%D \ConvertConstantAfter\processaction[#1][...]
+%D \ConvertConstantAfter\doifelse{#1}{\v!something}{}{}
+%D \stoptyping
+%D
+%D This commands accepts things like:
+%D
+%D \starttyping
+%D \v!constant
+%D constant
+%D \hbox to \hsize{\rubish}
+%D \stoptyping
+%D
+%D As we will see in the core modules, this macro permits
+%D constructions like:
+%D
+%D \starttyping
+%D \setupfootertexts[...][...]
+%D \setupfootertexts[margin][...][...]
+%D \setupfootertexts[\v!margin][...][...]
+%D \stoptyping
+%D
+%D where \type{...} can be anything legally \TEX.
+
+\def\CheckConstantAfter#1#2%
+ {\@EA\convertargument\v!prefix!\to\ascii
+ \convertargument#1\to#2\relax
+ \doifinstringelse\ascii{#2}
+ {\expandafter\convertargument#1\to#2}
+ {}}
+
+\def\ConvertConstantAfter#1#2#3%
+ {\CheckConstantAfter{#2}\asciia
+ \CheckConstantAfter{#3}\asciib
+ #1{\asciia}{\asciib}}
+
+%D \macros
+%D {assignifempty}
+%D
+%D We can assign a default value to an empty macro using:
+%D
+%D \starttyping
+%D \assignifempty \macros {default value}
+%D \stoptyping
+%D
+%D We don't explicitly test if the macro is defined.
+
+\def\assignifempty#1#2% can be sped up
+ {\doifsomething{#1}{\def#1{#2}}} % {\doifnot{#1}{}{\def#1{#2}}}
+
+%D \macros
+%D {gobbleuntil,grabuntil,gobbleuntilrelax,
+%D processbetween,processuntil}
+%D
+%D In \TEX\ gobbling usually stand for skipping arguments, so
+%D here are our gobbling macros.
+%D
+%D In \CONTEXT\ we use a lot of \type{\start}||\type{\stop}
+%D like constructions. Sometimes, the \type{\stop} is used as a
+%D hard coded delimiter like in:
+%D
+%D \starttyping
+%D \def\startcommand#1\stopcommand%
+%D {... #1 ...}
+%D \stoptyping
+%D
+%D In many cases the \type{\start}||\type{\stop} pair is
+%D defined at format generation time or during a job. This
+%D means that we cannot hardcode the \type{\stop} criterium.
+%D Only after completely understanding \type{\csname} and
+%D \type{\expandafter} I was able to to implement a solution,
+%D starting with:
+%D
+%D \starttyping
+%D \grabuntil{stop}\command
+%D \stoptyping
+%D
+%D This commands executes, after having encountered
+%D \type {\stop} the command \type {\command}. This command
+%D receives as argument the text preceding the \type {\stop}.
+%D This means that:
+%D
+%D \starttyping
+%D \def\starthello%
+%D {\grabuntil{stophello}\message}
+%D
+%D \starthello Hello world!\stophello
+%D \stoptyping
+%D
+%D results in: \type{\message{Hello world!}}.
+
+\def\dograbuntil#1#2%
+ {\long\def\next##1#1{#2{##1}}\next}
+
+\def\grabuntil#1%
+ {\expandafter\dograbuntil\expandafter{\csname#1\endcsname}}
+
+%D The next command build on this mechanism:
+%D
+%D \starttyping
+%D \processbetween{string}\command
+%D \stoptyping
+%D
+%D Here:
+%D
+%D \starttyping
+%D \processbetween{hello}\message
+%D \starthello Hello again!\stophello
+%D \stoptyping
+%D
+%D leads to: \type{\message{Hello again!}}. The command
+%D
+%D \starttyping
+%D \gobbleuntil{sequence}
+%D \stoptyping
+%D
+%D is related to these commands. This one simply throws away
+%D everything preceding \type{\command}.
+
+\long\def\processbetween#1#2%
+ {\setvalue{\s!start#1}{\grabuntil{\s!stop#1}{#2}}}
+
+\def\gobbleuntil#1%
+ {\long\def\next##1#1{}\next}
+
+\def\gobbleuntilrelax#1\relax
+ {}
+
+%D The next one simply expands the pickup up tokens.
+%D
+%D \starttyping
+%D \processuntil{sequence}
+%D \stoptyping
+
+\def\processuntil#1%
+ {\long\def\next##1#1{##1}\next}
+
+%D \macros
+%D {groupedcommand}
+%D
+%D Commands often manipulate argument as in:
+%D
+%D \starttyping
+%D \def\doezomaarwat#1{....#1....}
+%D \stoptyping
+%D
+%D A disadvantage of this approach is that the tokens that
+%D form \type{#1} are fixed the the moment the argument is read
+%D in. Normally this is no problem, but for instance verbatim
+%D environments adapt the \CATCODES\ of characters and therefore
+%D are not always happy with already fixed tokens.
+%D
+%D Another problem arises when the argument is grouped not by
+%D \type{{}} but by \type{\bgroup} and \type{\egroup}. Such an
+%D argument fails, because the \type{\bgroup} is een as the
+%D argument (which is quite normal).
+%D
+%D The next macro offers a solution for both unwanted
+%D situations:
+%D
+%D \starttyping
+%D \groupedcommand {before} {after}
+%D \stoptyping
+%D
+%D Which can be used like:
+%D
+%D \starttyping
+%D \def\cite%
+%D {\groupedcommand{\rightquote\rightquote}{\leftquote\leftquote}}
+%D \stoptyping
+%D
+%D This command is equivalent to, but more 'robust' than:
+%D
+%D \starttyping
+%D \def\cite#1%
+%D {\rightquote\rightquote#1\leftquote\leftquote}
+%D \stoptyping
+%D
+%D One should say that the next implementation would suffice:
+%D
+%D \starttyping
+%D \def\groupedcommand#1#2%
+%D {\def\BeforeGroup{#1\ignorespaces}%
+%D \def\AfterGroup{\unskip#2\egroup}%
+%D \bgroup\bgroup
+%D \aftergroup\AfterGroup
+%D \afterassignment\BeforeGroup
+%D \let\next=}
+%D \stoptyping
+%D
+%D It did indeed, but one day we decided to support the
+%D processing of boxes too:
+%D
+%D \starttyping
+%D \def\rightword%
+%D {\groupedcommand{\hfill\hbox}{\parfillskip\!!zeropoint}}
+%D
+%D .......... \rightword{the right way}
+%D \stoptyping
+%D
+%D Here \TEX\ typesets \type{\bf the right way} unbreakable
+%D at the end of the line. The solution mentioned before does
+%D not work here.
+%D
+%D \starttyping
+%D \long\unexpanded\def\groupedcommand#1#2%
+%D {\bgroup
+%D \long\def\BeforeGroup%
+%D {\bgroup#1\bgroup\aftergroup\AfterGroup}%
+%D \long\def\AfterGroup%
+%D {#2\egroup\egroup}%
+%D \afterassignment\BeforeGroup
+%D \let\next=}
+%D \stoptyping
+%D
+%D We used this method some time until the next alternative
+%D was needed. From now on we support both
+%D
+%D \starttyping
+%D to be \bold{bold} or not, that's the question
+%D \stoptyping
+%D
+%D and
+%D
+%D \starttyping
+%D to be {\bold bold} or not, that's the question
+%D \stoptyping
+%D
+%D This alternative checks for a \type{\bgroup} token first.
+%D The internal alternative does not accept the box handling
+%D mentioned before, but further nesting works all right. The
+%D extra \type{\bgroup}||\type{\egroup} is needed to keep
+%D \type{\AfterGroup} both into sight and local.
+
+\long\def\HandleGroup#1#2%
+ {\bgroup
+ \long\def\BeforeGroup{\bgroup#1\bgroup\aftergroup\AfterGroup}%
+ \long\def\AfterGroup {#2\egroup\egroup}%
+ \afterassignment\BeforeGroup
+ \let\next=}
+
+\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\aftergroup\AfterGroup#1}%
+ \long\def\AfterGroup {#2\egroup}%
+ \afterassignment\BeforeGroup
+ \let\next=}
+
+\long\def\HandleNoGroup#1#2%
+ {\long\def\AfterGroup{#2\egroup}%
+ \bgroup\aftergroup\AfterGroup#1}
+
+%D These macros come together in:
+%D
+%D \starttyping
+%D \long\unexpanded\def\groupedcommand#1#2%
+%D {\def\dogroupedcommand%
+%D {\ifx\next\bgroup
+%D \let\next=\HandleGroup
+%D \else
+%D \let\next=\HandleNoGroup
+%D \fi
+%D \next{#1}{#2}}%
+%D \futurelet\next\dogroupedcommand}
+%D \stoptyping
+%D
+%D From the missing paragraph number one can deduce that the
+%D last macro is not the real one yet. I considered it a
+%D nuisance that
+%D
+%D \starttyping
+%D \color[green]
+%D {as grass}
+%D \stoptyping
+%D
+%D was not interpreted as one would expect. This is due to the
+%D fact that \type{\futurelet} obeys blank spaces, and a
+%D line||ending token is treated as a blank space. So the final
+%D implementation became:
+
+%\long\unexpanded\def\groupedcommand#1#2%
+% {\bgroup
+% \def\dogroupedcommand%
+% {\ifx\next\bgroup
+% \def\\{\egroup\HandleGroup{#1}{#2}}%
+% \else\ifx\next\blankspace
+% \def\\ {\egroup\groupedcommand{#1}{#2}}%
+% \else
+% \def\\{\egroup\HandleNoGroup{#1}{#2}}%
+% \fi\fi
+% \\}%
+% \futurelet\next\dogroupedcommand}
+%
+% compatible ?
+
+\long\unexpanded\def\groupedcommand#1#2%
+ {\doifnextbgroupelse{\HandleGroup{#1}{#2}}{\HandleNoGroup{#1}{#2}}}
+
+\long\unexpanded\def\simplegroupedcommand#1#2%
+ {\doifnextbgroupelse{\HandleSimpleGroup{#1}{#2}}{\HandleNoGroup{#1}{#2}}}
+
+%D Users should be aware of the fact that grouping can
+%D interfere with ones paragraph settings that are executed
+%D after the paragraph is closed. One should therefore
+%D explictly close the paragraph with \type{\par}, else the
+%D settings will be forgotten and not applied. So it's:
+%D
+%D \starttyping
+%D \def\BoldRaggedCenter%
+%D {\groupedcommand{\raggedcenter\bf}{\par}}
+%D \stoptyping
+
+%D \macros
+%D {checkdefined}
+%D
+%D The bigger the system, the greater the change that
+%D user defined commands collide with those that are part of
+%D the system. The next macro gives a warning when a command is
+%D already defined. We considered blocking the definition, but
+%D this is not always what we want.
+%D
+%D \starttyping
+%D \checkdefined {category} {class} {command}
+%D \stoptyping
+%D
+%D The user is warned with the suggestion to use
+%D \type{CAPITALS}. This suggestion is feasible, because
+%D \CONTEXT only defines lowcased macros.
+
+\def\showdefinederror#1#2%
+ {\writestatus\m!systems{#1 #2 replaces a macro, use CAPITALS!}}
+
+\def\checkdefined#1#2#3%
+ {\doifdefined{#3}{\showdefinederror{#2}{#3}}}
+
+%D \macros
+%D {GotoPar,GetPar}
+%D
+%D Typesetting a paragraph in a special way can be done by
+%D first grabbing the contents of the paragraph and processing
+%D this contents grouped. The next macro for instance typesets
+%D a paragraph in boldface.
+%D
+%D \starttyping
+%D \def\remark#1\par%
+%D {\bgroup\bf#1\egroup}
+%D \stoptyping
+%D
+%D This macro has to be called like
+%D
+%D \starttyping
+%D \remark some text ... ending with \par
+%D \stoptyping
+%D
+%D Instead of \type{\par} we can of course use an empty line.
+%D When we started typesetting with \TEX, we already had
+%D produced lots of text in plain \ASCII. In producing such
+%D simple formatted texts, we adopted an open layout, and when
+%D switching to \TEX, we continued this open habit. Although
+%D \TEX\ permits a cramped and badly formatted source, it adds
+%D to confusion and sometimes introduces errors. So we prefer:
+%D
+%D \starttyping
+%D \remark
+%D
+%D some text ... ending with an empty line
+%D \stoptyping
+%D
+%D We are going to implement a mechanism that allows such open
+%D specifications. The definition of the macro handling
+%D \type{\remark} becomes:
+%D
+%D \starttyping
+%D \def\remark%
+%D {\BeforePar{\bgroup\bf}%
+%D \AfterPar{\egroup}%
+%D \GetPar}
+%D \stoptyping
+%D
+%D A macro like \type{\GetPar} can be defined in several
+%D ways. The recent version, the fourth one in a row,
+%D originally was far more complicated, but some functionality
+%D has been moved to other macros.
+%D
+%D We start with the more simple but in some cases more
+%D appropriate alternative is \type{\GotoPar}. This one leaves
+%D \type{\par} unchanged and is therefore more robust. On the
+%D other hand, \type{\AfterPar} is not supported.
+
+\newtoks\BeforePar
+\newtoks\AfterPar
+
+\let\endoflinetoken=^^M
+
+%D The original definition was:
+%D
+%D \starttyping
+%D \def\doGotoPar
+%D {\ifx\nextchar\blankspace
+%D \@EA\GotoPar
+%D \else\ifx\nextchar\endoflinetoken
+%D \@EAEAEA\GotoPar
+%D \else
+%D \@EAEAEA\dodoGotoPar
+%D \fi\fi}
+%D
+%D \def\dodoGotoPar
+%D {\the\BeforePar
+%D \BeforePar\emptytoks
+%D \nextchar}
+%D
+%D \def\GotoPar
+%D {\afterassignment\doGotoPar\let\nextchar=}
+%D \stoptyping
+
+%D Its big brother \type{\GetPar} redefines the \type{\par}
+%D primitive, which can lead to unexpected results, depending
+%D in the context.
+%D
+%D \starttyping
+%D \def\GetPar
+%D {\expanded
+%D {\BeforePar
+%D {\the\BeforePar
+%D \BeforePar\emptytoks
+%D \bgroup
+%D \def\par
+%D {\egroup
+%D \par
+%D \the\AfterPar
+%D \BeforePar\emptytoks
+%D \AfterPar\emptytoks}}}%
+%D \GotoPar}
+%D \stoptyping
+
+%D However, we can implement a better alternative by using:
+%D
+%D \starttyping
+%D \def\dowithpar#1#2%
+%D {\def\handlepar##1\par{#1##1#2}%
+%D \def\gobblepar\par{\dowithpar{#1}{#2}}%
+%D \doifnextcharelse\par\gobblepar\handlepar}
+%D \stoptyping
+%D
+%D Or, nicer
+
+\def\redowithpar\par
+ {\doifnextcharelse\par\redowithpar\dodowithpar}%
+
+\def\dowithpar#1#2%
+ {\def\dodowithpar##1\par{#1##1#2}%
+ \redowithpar\par}
+
+\def\redogotopar\par
+ {\doifnextcharelse\par\redogotopar\dodogotopar}%
+
+\def\dogotopar#1%
+ {\def\dodogotopar{#1}%
+ \redogotopar\par}
+
+%D The previosuly defined macros now become:
+
+\def\GetPar
+ {\expanded
+ {\dowithpar
+ {\the\BeforePar
+ \BeforePar\emptytoks}
+ {\the\AfterPar
+ \BeforePar\emptytoks
+ \AfterPar\emptytoks}}}
+
+\def\GotoPar
+ {\expanded
+ {\dogotopar
+ {\the\BeforePar
+ \BeforePar\emptytoks}}}
+
+%D \macros
+%D {dowithpargument,dowithwargument}
+%D
+%D The next macros are a variation on \type{\GetPar}. When
+%D macros expect an argument, it interprets a grouped sequence
+%D of characters a one token. While this adds to robustness and
+%D less ambiguous situations, we sometimes want to be a bit
+%D more flexible, or at least want to be a bit more tolerant
+%D to user input.
+%D
+%D We start with a commands that acts on paragraphs. This
+%D command is called as:
+%D
+%D \starttyping
+%D \dowithpargument\command
+%D \dowithpargument{\command ... }
+%D \stoptyping
+%D
+%D In \CONTEXT\ we use this one to read in the titles of
+%D chapters, sections etc. The commands responsible for these
+%D activities accept several alternative ways of argument
+%D passing. In these examples, the \type{\par} can be omitted
+%D when an empty line is present.
+%D
+%D \starttyping
+%D \command{...}
+%D \command ... \par
+%D \command
+%D {...}
+%D \command
+%D ... \par
+%D \stoptyping
+%D
+%D We show two implementations, of which for the moment the
+%D we prefier to use the second one:
+%D
+%D \starttyping
+%D \def\dowithpargument#1%
+%D {\def\dodowithpargument%
+%D {\ifx\next\bgroup
+%D \def\next{#1}%
+%D \else
+%D \def\next####1 \par{#1{####1}}%
+%D \fi
+%D \next}%
+%D \futurelet\next\dodowithpargument}
+%D \stoptyping
+%D
+%D A second and better implementation was:
+%D
+%D \starttyping
+%D \def\dowithpargument#1%
+%D {\def\nextpar##1 \par{#1{##1}}%
+%D \def\nextarg##1{#1{##1}}%
+%D \doifnextcharelse\bgroup
+%D {\nextarg}
+%D {\nextpar}}
+%D \stoptyping
+%D
+%D We ended up with an alternative that also accepts en empty
+%D argument. This command permits for instance chapters to
+%D have no title.
+
+%\def\dowithpargument#1%
+% {\def\nextpar##1 \par{#1{##1}}%
+% \def\nextarg##1{#1{##1}}%
+% \doifnextcharelse\bgroup
+% {\nextarg}
+% {\doifnextcharelse{\par}
+% {#1{}}
+% {\nextpar}}}
+
+\def\dowithpargument#1%
+ {\def\nextpar##1 \par{#1{##1}}%
+ \def\nextarg##1{#1{##1}}%
+ \doifnextbgroupelse\nextarg{\doifnextcharelse\par{#1{}}\nextpar}}
+
+%D The \type{p} in the previous command stands for paragraph.
+%D When we want to act upon words we can use the \type{w}
+%D alternative.
+%D
+%D \starttyping
+%D \dowithwargument\command
+%D \dowithwargument{... \command ...}
+%D \stoptyping
+%D
+%D The main difference bwteen two alternatives is in the
+%D handling of \type{\par}'s. This time the space token acts
+%D as a delimiter.
+%D
+%D \starttyping
+%D \command{...}
+%D \command ...
+%D \command
+%D {...}
+%D \command
+%D ...
+%D \stoptyping
+%D
+%D Again there are two implementations possible:
+%D
+%D \starttyping
+%D \def\dowithwargument#1%
+%D {\def\dodowithwargument%
+%D {\ifx\next\bgroup
+%D \def\next{#1}%
+%D \else
+%D \def\next####1 {#1{####1}}%
+%D \fi
+%D \next}%
+%D \futurelet\next\dodowithwargument}
+%D \stoptyping
+%D
+%D We've chosen:
+
+%\def\dowithwargument#1%
+% {\def\nextwar##1 {#1{##1}}%
+% \def\nextarg##1{#1{##1}}%
+% \doifnextcharelse\bgroup
+% {\nextarg}
+% {\nextwar}}
+
+\def\dowithwargument#1%
+ {\def\nextwar##1 {#1{##1}}%
+ \def\nextarg##1{#1{##1}}%
+ \doifnextbgroupelse\nextarg\nextwar}
+
+%D \macros
+%D {dorepeat,dorepeatwithcommand}
+%D
+%D When doing repetitive tasks, we stromgly advice to use
+%D \type{\dorecurse}. The next alternative however, suits
+%D better some of the \CONTEXT\ interface commands.
+%D
+%D \starttyping
+%D \dorepeat[n*\command]
+%D \stoptyping
+%D
+%D The value of the used \COUNTER\ can be called within
+%D \type{\command} by \type{\repeater}.
+%D
+%D A slightly different alternative is:
+%D
+%D \starttyping
+%D \dorepeatwithcommand[n*{...}]\command
+%D \stoptyping
+%D
+%D When we call for something like:
+%D
+%D \starttyping
+%D \dorepeatwithcommand[3*{Hello}]\message
+%D \stoptyping
+%D
+%D we get ourselves three \type{\message{Hello}} messages in
+%D a row. In both commands, the \type{n*} is optional. When this
+%D specification is missing, the command executes once.
+
+% this one is obsolete:
+
+\def\dorepeat[#1]%
+ {\dodorepeat#1*\empty*\relax}
+
+\long\def\dodorepeat#1*#2#3*#4\relax
+ {\ifx#2\empty#1\else\dorecurse{#1}{#2#3}\fi}
+
+\def\repeater
+ {\recurselevel}
+
+% this one will be kept
+
+\def\dorepeatwithcommand[#1]%
+ {\dodorepeatwithcommand#1*\empty*\relax}
+
+% \long\def\dodorepeatwithcommand#1*#2#3*#4\relax#5%
+% {\ifx#2\empty
+% #5{#1}%
+% \else
+% \dorecurse{#1}{#5{#2#3}}%
+% \fi}
+%
+% more complex but better:
+
+% \long\def\dodorepeatwithcommand#1*#2#3*#4\relax#5%
+% {\ifx#2\empty
+% #5{#1}%
+% \else\ifnum#1<\zerocount
+% % a la etex
+% % \dorecurse{-\numexpr(#1)}{#5{-#2#3}}%
+% % indirect
+% %\innerrecurse#1%
+% %\expanded{\dorecurse{\number-\innerrecurse}}{#5{-#2#3}}%
+% % safer:
+% \bgroup\scratchcounter#1%
+% \expanded{\egroup\noexpand\dorecurse{\number-\scratchcounter}}{#5{-#2#3}}%
+% \else\ifx#2+%
+% \dorecurse{#1}{#5{#3}}%
+% \else
+% \dorecurse{#1}{#5{#2#3}}%
+% \fi\fi\fi}
+
+\def\dorepeatwithcommand[#1]%
+ {\dodorepeatwithcommand#1*\empty*\relax}
+
+\long\def\dodorepeatwithcommand#1*#2#3*#4\relax#5%
+ {\ifx#2\empty\redorepeatwithcommand[#1]#5\else\dododorepeatwithcommand{#1}{#2}{#3}#5\fi}
+
+\long\def\dododorepeatwithcommand#1#2#3#4%
+ {\ifx#2\empty % redundant but gives cleaner extensions
+ #4{#1}%
+ \else\ifnum#1<\zerocount
+ \bgroup\scratchcounter#1%
+ \expanded{\egroup\noexpand\dorecurse{\number-\scratchcounter}}{#4{-#2#3}}%
+ \else\ifx#2+%
+ \dorecurse{#1}{#4{#3}}%
+ \else
+ \dorecurse{#1}{#4{#2#3}}%
+ \fi\fi\fi}
+
+\def\redorepeatwithcommand[#1]#2%
+ {#2{#1}}
+
+%D The extension hook permits something like:
+%D
+%D \starttyping
+%D \bgroup
+%D
+%D \catcode`\*=\@@superscript
+%D
+%D \gdef\redorepeatwithcommand[#1]%
+%D {\redodorepeatwithcommand#1*\empty*\relax}
+%D
+%D \long\gdef\redodorepeatwithcommand#1*#2#3*#4\relax#5%
+%D {\dododorepeatwithcommand{#1}{#2}{#3}#5}
+%D
+%D \egroup
+%D \stoptyping
+%D
+%D although one may wonder if changing the catcode of \type {*} is wise.
+
+%D \macros
+%D {normalbgroup,normalgroup}
+%D
+%D No comment.
+
+\let\normalbgroup\bgroup
+\let\normalegroup\egroup
+
+%D \macros
+%D {doifstringinstringelse}
+%D
+%D The next macro is meant for situations where both strings
+%D are macros. This save some unneeded expansion.
+%D
+%D \starttyping
+%D \long\def\doifstringinstringelse#1#2%
+%D {\p!doifinstringelse#1#2%
+%D \@EA\firstoftwoarguments
+%D \else
+%D \@EA\secondoftwoarguments
+%D \fi}
+%D \stoptyping
+%D
+%D A bit faster is:
+
+\def\pp!doifstringinstringelse#1%
+ {\if#1@%
+ \@EA\secondoftwoarguments
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
+
+\long\def\doifstringinstringelse#1#2%
+ {\long\@EA\def\@EA\p!doifstringinstringelse\@EA##\@EA1#1##2##3\war
+ {\pp!doifstringinstringelse##2}%
+ \@EA\@EA\@EA\p!doifstringinstringelse\@EA#2#1@@\war}
+
+%D \macros
+%D {appendtoks,prependtoks,appendtoksonce,prependtoksonce,
+%D doifintokselse,flushtoks,dotoks}
+%D
+%D We use \TOKENLISTS\ sparsely within \CONTEXT, because the
+%D comma separated lists are more suitable for the user
+%D interface. Nevertheless we have:
+%D
+%D \starttyping
+%D (\doglobal) \appendtoks ... \to\tokenlist
+%D (\doglobal) \prependtoks ... \to\tokenlist
+%D (\doglobal) \flushtoks\tokenlist
+%D \dotoks\tokenlist
+%D \stoptyping
+%D
+%D Er worden eerst enkele klad||registers gedefinieerd. These
+%D macros are clones of the ones implemented in page~378 of
+%D Knuth's \TeX book.
+%D
+%D A simple implementation, one that does not handle braces
+%D at the outer level, is:
+%D
+%D \starttyping
+%D \def\appendtoks#1\to#2%
+%D {\scratchtoks={#1}%
+%D \expanded{\dodoglobal\noexpand#2{\the#2\the\scratchtoks}}}
+%D
+%D \def\prependtoks#1\to#2%
+%D {\scratchtoks={#1}%
+%D \expanded{\dodoglobal\noexpand#2{\the\scratchtoks\the#2}}}
+%D \stoptyping
+%D
+%D But here we prefer:
+
+\newtoks\@@scratchtoks
+
+% before we had the once only alternatives, we had:
+%
+% \def\appendtoks {\doappendtoks \relax}
+% \def\prependtoks{\doprependtoks\relax}
+%
+% \long\def\doappendtoks#1\to#2%
+% {\@@scratchtoks\@EA{\gobbleoneargument#1}%
+% \expanded{\dodoglobal\noexpand#2{\the#2\the\@@scratchtoks}}}
+%
+% \long\def\doprependtoks#1\to#2%
+% {\@@scratchtoks\@EA{\gobbleoneargument#1}%
+% \expanded{\dodoglobal\noexpand#2{\the\@@scratchtoks\the#2}}}
+
+\def\appendtoks {\doappendtoks \relax}
+\def\prependtoks {\doprependtoks \relax}
+\def\appendtoksonce {\doappendtoksonce \relax}
+\def\prependtoksonce{\doprependtoksonce\relax}
+
+% \def\dodoappendtoks#1%
+% {\expanded{\dodoglobal\noexpand#1{\the#1\the\@@scratchtoks}}}
+%
+% \def\dodoprependtoks#1%
+% {\expanded{\dodoglobal\noexpand#1{\the\@@scratchtoks\the#1}}}
+%
+% \long\def\doappendtoks#1\to%
+% {\@@scratchtoks\@EA{\gobbleoneargument#1}\dodoappendtoks}
+%
+% \long\def\doprependtoks#1\to%
+% {\@@scratchtoks\@EA{\gobbleoneargument#1}\dodoprependtoks}
+%
+% \long\def\doappendtoksonce#1\to#2%
+% {\@@scratchtoks\@EA{\gobbleoneargument#1}%
+% \doifintokselse\@@scratchtoks{#2}{}{\dodoappendtoks{#2}}}
+%
+% \long\def\doprependtoksonce#1\to#2%
+% {\@@scratchtoks\@EA{\gobbleoneargument#1}%
+% \doifintokselse\@@scratchtoks{#2}{}{\dodoprependtoks{#2}}}
+%
+% A slightly (but in the case of large arguments
+% significantly) faster alternative is given below:
+
+\newtoks\@@toks
+
+\def\dodoappendtoks
+ {\dodoglobal\@@toks\@EAEAEA{\@EA\the\@EA\@@toks\the\@@scratchtoks}}
+
+\def\dodoprependtoks
+ {\dodoglobal\@@toks\@EAEAEA{\@EA\the\@EA\@@scratchtoks\the\@@toks}}
+
+\long\def\doappendtoks#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}\dodoappendtoks}
+
+\long\def\doprependtoks#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}\dodoprependtoks}
+
+\long\def\doappendtoksonce#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}%
+ \doifintokselse\@@scratchtoks\@@toks\donothing\dodoappendtoks}
+
+\long\def\doprependtoksonce#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}%
+ \doifintokselse\@@scratchtoks\@@toks\donothing\dodoprependtoks}
+
+%D The test macro:
+%D
+%D \starttyping
+%D \def\doifintokselse#1#2% #1 en #2 zijn toks
+%D {\edef\!!stringa{\the#1}\convertcommand\!!stringa\to\asciia
+%D \edef\!!stringb{\the#2}\convertcommand\!!stringb\to\asciib
+%D \doifinstringelse\asciia\asciib}
+%D \stoptyping
+%D
+%D Better:
+%D
+%D \starttyping
+%D \def\doifintokselse#1#2% #1 en #2 zijn toks
+%D {\edef\!!stringa{\the#1}\convertcommand\!!stringa\to\asciia
+%D \edef\!!stringb{\the#2}\convertcommand\!!stringb\to\asciib
+%D \doifstringinstringelse\asciia\asciib}
+%D \stoptyping
+%D
+%D Even better:
+
+\beginETEX
+
+ \def\doifintokselse#1#2% #1 en #2 zijn toks
+ {\@EA\convertargument\the#1\to\asciia
+ \@EA\convertargument\the#2\to\asciib
+ \doifstringinstringelse\asciia\asciib}
+
+\endETEX
+
+\beginTEX
+
+ \def\doifintokselse#1#2% #1 en #2 zijn toks
+ {\edef\asciia{\the#1}\convertcommand\asciia\to\asciia
+ \edef\asciib{\the#2}\convertcommand\asciib\to\asciib
+ \doifstringinstringelse\asciia\asciib}
+
+\endTEX
+
+%D Also:
+
+\def\appendetoks #1\to{\expanded{\appendtoks #1}\to}
+\def\prependetoks#1\to{\expanded{\prependtoks#1}\to}
+
+%D Hm.
+
+\def\flushtoks#1% nb: can reassing to #1 again, hence the indirectness
+ {\@@scratchtoks#1\relax
+ \dodoglobal#1\emptytoks
+ \the\@@scratchtoks\relax}
+
+\let\dotoks\the
+
+%D \macros
+%D {makecounter,pluscounter,minuscounter,
+%D resetcounter,setcounter,countervalue}
+%D
+%D Declaring, setting and resetting \COUNTERS\ can be doen
+%D with the next set of commands.
+%D
+%D \starttyping
+%D \makecounter {name}
+%D \pluscounter {name}
+%D \minuscounter {name}
+%D \resetcounter {name}
+%D \setcounter {name} {value}
+%D \countervalue {name}
+%D \stoptyping
+%D
+%D We prefer the use of global counters. This means that we
+%D have to load \PLAIN\ \TEX\ in a bit different way:
+%D
+%D \starttyping
+%D \let\oldouter=\outer
+%D \let\outer=\relax
+%D \input plain.tex
+%D \let\outer=\oldouter
+%D
+%D \def\newcount%
+%D {\alloc@0\count\countdef\insc@unt}
+%D \stoptyping
+%D
+%D First we show a solution in which we use real \COUNTERS.
+%D Apart from some expansion, nothing special is done.
+%D
+%D \starttyping
+%D \def\makecounter#1%
+%D {\expandafter\newcount\csname#1\endcsname}
+%D
+%D \def\pluscounter#1%
+%D {\global\advance\csname#1\endcsname by 1 }
+%D
+%D \def\minuscounter#1%
+%D {\global\advance\csname#1\endcsname by -1 }
+%D
+%D \def\resetcounter#1%
+%D {\expandafter\global\csname#1\endcsname=0 }
+%D
+%D \def\setcounter#1#2%
+%D {\expandafter\global\csname#1\endcsname=#2 }
+%D
+%D \def\countervalue#1%
+%D {\the\getvalue{#1}}
+%D \stoptyping
+%D
+%D Because these macros are already an indirect way of working
+%D with counters, there is no harm in using pseudo \COUNTERS\
+%D here:
+
+\def\makecounter#1%
+ {\letgvalue{#1}\zerocountervalue} % see earlier
+
+% \def\countervalue#1%
+% {\getvalue{#1}}
+
+\let\countervalue\getvalue
+
+\def\pluscounter#1%
+ {\scratchcounter\getvalue{#1}%
+ \advance\scratchcounter \plusone
+ \setxvalue{#1}{\the\scratchcounter}}
+
+\def\minuscounter#1%
+ {\scratchcounter\getvalue{#1}%
+ \advance\scratchcounter \minusone
+ \setxvalue{#1}{\the\scratchcounter}}
+
+\def\resetcounter#1%
+ {\letgvalue{#1}\zerocountervalue}
+
+\def\setcounter#1#2% or: \setxvalue{#1}{\number#2}
+ {\scratchcounter#2%
+ \setxvalue{#1}{\the\scratchcounter}}
+
+\def\incrementcounter#1#2% #1 name #2 value
+ {\setxvalue{#1}{\the\numexpr\csname#1\endcsname+#2\relax}}
+
+\def\decrementcounter#1#2% #1 name #2 value
+ {\setxvalue{#1}{\the\numexpr\csname#1\endcsname-#2\relax}}
+
+%D \macros
+%D {savecounter,restorecounter}
+%D
+%D These two commands can be used to save and restore counter
+%D values. Only one level is saved.
+
+\def\savecounter#1%
+ {{\scratchcounter\getvalue {#1}\setxvalue{!#1}{\the\scratchcounter}}}
+
+\def\restorecounter#1%
+ {{\scratchcounter\getvalue{!#1}\setxvalue {#1}{\the\scratchcounter}}}
+
+% == {\setxvalue{#1}{\getvalue{!#1}}}
+
+%D The next \ETEX\ based solution is some 15\% faster, which
+%D goes unnoticed in any normal run, simply because these
+%D macros are not used milions of times.
+
+\beginETEX \numexpr
+
+\def\makecounter#1%
+ {\global\@EA\let\csname#1\endcsname\zerocountervalue} % see earlier
+
+\def\countervalue#1%
+ {\ifcsname#1\endcsname\csname#1\endcsname\fi}
+
+\def\pluscounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr\csname#1\endcsname+\plusone\relax}}
+
+\def\minuscounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr\csname#1\endcsname-\plusone\relax}}
+
+\def\resetcounter#1%
+ {\global\@EA\let\csname#1\endcsname\zerocountervalue}
+
+\def\setcounter#1#2%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr#2\relax}}
+
+\def\savecounter#1%
+ {\@EA\xdef\csname !#1\endcsname{\the\numexpr\csname#1\endcsname\relax}}
+
+\def\restorecounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr\csname !#1\endcsname\relax}}
+
+\endETEX
+
+%D \macros
+%D {beforesplitstring,aftersplitstring}
+%D
+%D These both commands split a string at a given point in two
+%D parts, so \type{x.y} becomes \type{x} or \type{y}.
+%D
+%D \starttyping
+%D \beforesplitstring test.tex\at.\to\filename
+%D \aftersplitstring test.tex\at.\to\extension
+%D \stoptyping
+%D
+%D The first routine looks (and is indeed) a bit simpler than
+%D the second one. The alternative looking more or less like
+%D the first one did not always give the results we needed.
+%D Both implementations show some insight in the manipulation
+%D of arguments.
+
+\def\beforesplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2#2##3\\%
+ {\def#3{##1}}%
+ \@EA\dosplitstring#1#2#2\\}
+
+\def\aftersplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2@@@##3\\%
+ {\def#3{##2}}%
+ \@EA\dosplitstring#1@@@#2@@@\\}
+
+%D \macros
+%D {splitstring,greedysplitstring}
+%D
+%D A bonus macro.
+
+\def\splitstring#1\at#2\to#3\and#4%
+ {\def\dosplitstring##1#2##2\empty\empty\empty##3\\%
+ {\def#3{##1}%
+ \def\dosplitstring{##3}%
+ \ifx\dosplitstring\empty
+ \let#4\empty
+ \else
+ \def#4{##2}%
+ \fi}%
+ \@EA\dosplitstring#1\empty\empty\empty#2\empty\empty\empty\\}
+
+% Ok, but not for all cases:
+%
+% \def\greedysplitstring#1\at#2\to#3\and#4%
+% {\edef\asciib{#1}%
+% \let\asciic\asciib
+% \let#3\empty
+% \let#4\empty
+% \doloop
+% {\expandafter\splitstring\asciib\at#2\to\asciia\and\asciib
+% \ifx\asciib\empty
+% \exitloop
+% \else
+% \edef#3{\ifx#3\empty\else#3#2\fi\asciia}%
+% \let#4\asciib
+% \fi}%
+% \ifx#3\empty\let#3\asciic\fi}
+%
+% The next one is some 25\% faster, but it hardly matters because
+% we seldom use this macro.
+%
+% \def\greedysplitstring#1\at#2\to#3\and#4%
+% {\edef\asciib{#1}%
+% \let\asciic\asciib
+% \let#3\empty
+% \let#4\empty
+% \def\dogreedysplitstring
+% {\expandafter\splitstring\asciib\at#2\to\asciia\and\asciib
+% \ifx\asciib\empty
+% \expandafter\dogreedysplitstring
+% \else
+% \edef#3{\ifx#3\empty\else#3#2\fi\asciia}%
+% \let#4\asciib
+% \fi}%
+% \dogreedysplitstring
+% \ifx#3\empty\let#3\asciic\fi}
+%
+% The better alternative:
+
+\def\greedysplitstring#1\at#2\to#3\and#4%
+ {\edef\asciib{#1}%
+ \let\asciic\asciib
+ \let#3\empty
+ \let#4\empty
+ \doloop
+ {\expandafter\splitstring\asciib\at#2\to\asciia\and\asciib
+ \ifx\asciib\empty
+ \exitloop
+ \else
+ % not \edef#3{\ifx#3\empty\else#3#2\fi\asciia} else
+ % /root/path fails because then #3==empty
+ \edef#3{\ifcase\recurselevel\or\else#3#2\fi\asciia}%
+ \let#4\asciib
+ \fi}%
+ \ifx#3\empty\let#3\asciic\fi}
+
+%D \macros
+%D {beforetestandsplitstring,
+%D aftertestandsplitstring,
+%D testandsplitstring}
+%D
+%D The next alternatives are for Simon Pepping. This time
+%D the result is empty when no split is done.
+
+% \def\beforetestandsplitstring#1\at#2\to#3%
+% {\def\dosplitstring##1#2##2#2##3\\{\doifelsenothing
+% {##3}{\let#3\empty}{\def#3{##1}}}%
+% \@EA\dosplitstring#1#2#2\\}
+%
+% \def\aftertestandsplitstring#1\at#2\to#3%
+% {\def\dosplitstring ##1#2##2@@@##3\\{\doifelsenothing
+% {##3}{\let#3\empty}{\def#3{##2}}}%
+% \@EA\dosplitstring #1@@@#2@@@\\}
+%
+% \def\testandsplitstring#1\at#2\to#3\and#4%
+% {\def\dosplitstring##1#2##2#2##3\\{\doifelsenothing
+% {##3}{\let#3\empty\let#4\empty}{\def#3{##1}\def#4{##2}}}%
+% \@EA\dosplitstring#1#2#2\\}
+%
+% faster:
+
+\def\beforetestandsplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2#2##3##4\\%
+ {\ifx##3\empty\let#3\empty\else\def#3{##1}\fi}%
+ \@EA\dosplitstring#1#2#2\empty\\}
+
+\def\aftertestandsplitstring#1\at#2\to#3%
+ {\def\dosplitstring ##1#2##2@@@##3##4\\%
+ {\ifx##3\empty\let#3\empty\else\def#3{##2}\fi}%
+ \@EA\dosplitstring #1@@@#2@@@\empty\\}
+
+\def\testandsplitstring#1\at#2\to#3\and#4%
+ {\def\dosplitstring##1#2##2#2##3##4\\%
+ {\ifx##3\empty\let#3\empty\let#4\empty\else\def#3{##1}\def#4{##2}\fi}%
+ \@EA\dosplitstring#1#2#2\empty\\}
+
+%D \macros
+%D {removesubstring}
+%D
+%D A first application of the two routines defined above is:
+%D
+%D \starttyping
+%D \removesubstring-\from first-last\to\nothyphenated
+%D \stoptyping
+%D
+%D Which in terms of \TEX\ looks like:
+
+%\def\removesubstring#1\from#2\to#3%
+% {\doifinstringelse{#1}{#2}
+% {\beforesplitstring#2\at#1\to\!!stringa
+% \aftersplitstring #2\at#1\to\!!stringb
+% \edef#3{\!!stringa\!!stringb}%
+% \removesubstring#1\from#3\to#3}
+% {}}
+
+\def\removesubstring#1\from#2\to#3%
+ {\splitstring#2\to\!!stringa\and\!!stringb
+ \dodoglobal#3{\!!stringa\!!stringb}}
+
+%D \macros
+%D {appendtocommalist,prependtocommalist,
+%D addtocommalist,removefromcommalist}
+%D
+%D When working with comma separated lists, one sooner or
+%D later want the tools to append or remove items from such a
+%D list. When we add an item, we first check if it's already
+%D there. This means that every item in the list is unique.
+%D
+%D \starttyping
+%D \addtocommalist {alfa} \name
+%D \addtocommalist {beta} \name
+%D \addtocommalist {gamma} \name
+%D \removefromcommalist {beta} \name
+%D \stoptyping
+%D
+%D These commands can be prefixed with \type{\doglobal}. The
+%D implementation of the second command is more complecated,
+%D because we have to take leading spaces into account. Keep in
+%D mind that users may provide lists with spaces after the
+%D commas. When one item is left, we also have to get rid of
+%D trailing spaces.
+%D
+%D \starttyping
+%D \def\words{alfa, beta, gamma, delta}
+%D \def\words{alfa,beta,gamma,delta}
+%D \stoptyping
+%D
+%D Removing an item takes more time than adding one.
+%D
+%D A fast appending alternative, without any testing, is
+%D also provided:
+%D
+%D \starttyping
+%D \appendtocommalist {something} \name
+%D \prependtocommalist {something} \name
+%D \stoptyping
+%D
+%D This can be implemented as follows:
+%D
+%D \starttyping
+%D \def\appendtocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else % no test on empty
+%D \dodoglobal\edef#2{#2,#1}%
+%D \fi}
+%D
+%D \def\prependtocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else % no test on empty
+%D \dodoglobal\edef#2{#1,#2}%
+%D \fi}
+%D \stoptyping
+%D
+%D The faster alternatives are:
+
+\def\appendtocommalist#1#2%
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}
+
+\def\prependtocommalist#1#2%
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}
+
+%D The old ones are:
+%D
+%D \starttyping
+%D \def\addtocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else
+%D \edef\!!stringa{#2,,}%
+%D \beforesplitstring#2\at,,\to#2\relax
+%D \ExpandBothAfter\doifinsetelse{#1}{#2}
+%D {\resetglobal}
+%D {\dodoglobal\edef#2{#2,#1}}%
+%D \fi}
+%D
+%D \def\pretocommalist#1#2%
+%D {\ifx#2\empty
+%D \dodoglobal\edef#2{#1}%
+%D \else
+%D \edef\!!stringa{#2,,}%
+%D \beforesplitstring#2\at,,\to#2\relax
+%D \ExpandBothAfter\doifinsetelse{#1}{#2}
+%D {\resetglobal}
+%D {\dodoglobal\edef#2{#1,#2}}%
+%D \fi}
+%D
+%D \def\doremovefromcommalist#1#2#3% nog \doglobal
+%D {\edef\!!stringa{,,#3,,}%
+%D \beforesplitstring\!!stringa\at,#1#2,\to\!!stringb
+%D \aftersplitstring\!!stringa\at,#1#2,\to\!!stringc
+%D \edef#3{\!!stringb,\!!stringc}%
+%D \aftersplitstring#3\at,,\to#3\relax
+%D \beforesplitstring#3\at,,\to#3}
+%D
+%D \def\removefromcommalist#1#2%
+%D {\doremovefromcommalist{ }{#1}{#2}%
+%D \doremovefromcommalist{}{#1}{#2}%
+%D \dofrontstrip#2%
+%D \dodoglobal\edef#2{#2}}
+%D \stoptyping
+%D
+%D Significantly faster (especially for longer lists):
+
+\def\addtocommalist#1#2% {item} \cs
+ {\rawdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+\def\pretocommalist#1#2% {item} \cs
+ {\rawdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
+
+\def\robustdoifinsetelse#1#2%
+ {\expanded{\convertargument#1}\to\!!stringa
+ \expanded{\convertargument#2}\to\!!stringb
+ \rawdoifinsetelse\!!stringa\!!stringb}
+
+\def\robustaddtocommalist#1#2% {item} \cs
+ {\robustdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}}
+
+\def\robustpretocommalist#1#2% {item} \cs
+ {\robustdoifinsetelse{#1}#2\resetglobal
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}}
+
+\def\xsplitstring#1#2% \cs {str}
+ {\def\dosplitstring##1,#2,##2,#2,##3\\%
+ {\edef\!!stringa{\bcleanedupcommalist##1\empty\empty\relax}%
+ \edef\!!stringb{\acleanedupcommalist##2,,\relax}}%
+ \@EA\dosplitstring\@EA,#1,,#2,,#2,\\}
+
+\def\bcleanedupcommalist#1#2#3\relax{\if#1,\else#1\fi\if#2,\else#2\fi#3}
+\def\bcleanedupcommalist#1#2\relax{\if#1,\else#1\fi#2}
+\def\acleanedupcommalist#1,,#2\relax{#1}
+
+% \def\removefromcommalist#1#2%
+% {\expanded{\xsplitstring\noexpand#2{#1}}%
+% \dodoglobal\edef#2%
+% {\ifx\!!stringa\empty
+% \!!stringb
+% \else
+% \@EA\acleanedupcommalist\!!stringa,,\relax
+% \ifx\!!stringb\empty\else,\!!stringb\fi
+% \fi}}
+
+\def\removefromcommalist#1#2%
+ {\rawdoifinsetelse{#1}#2%
+ {\expanded{\xsplitstring\noexpand#2{#1}}%
+ \dodoglobal\edef#2%
+ {\ifx\!!stringa\empty
+ \!!stringb
+ \else
+ \!!stringa\ifx\!!stringb\empty\else,\!!stringb\fi
+ \fi}}
+ \resetglobal}
+
+%D \macros
+%D {substituteincommalist}
+%D
+%D Slow but seldom used, so for the moment we stick to this
+%D implementation.
+%D
+%D \starttyping
+%D \substituteincommalist{old}{new}{list}
+%D \stoptyping
+
+\def\substituteincommalist#1#2#3% old, new, list (slooow)
+ {\edef\!!stringb{#1}%
+ \edef\!!stringd{#2}%
+ \let\!!stringa#3%
+ \let#3\empty
+ \def\dosubstituteincommalist##1%
+ {\edef\!!stringc{##1}%
+ \ifx\!!stringb\!!stringc
+ \ifx\!!stringd\empty\else
+ \edef#3{#3\ifx#3\empty\else,\fi\!!stringd}%
+ \fi
+ \def\docommand####1{\edef#3{#3,####1}}%
+ \else
+ \edef#3{#3\ifx#3\empty\else,\fi##1}%
+ \fi}%
+ \@EA\rawprocesscommacommand\@EA[\!!stringa]\dosubstituteincommalist}
+
+%D A not so useful macro:
+
+\def\dodofrontstrip[#1#2]#3%
+ {\ifx#1\space
+ \def#3{#2}%
+ \else
+ \def#3{#1#2}%
+ \fi}
+
+\def\dofrontstrip#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty \else
+ \@EA\dodofrontstrip\@EA[#1]#1%
+ \fi}
+
+%D \macros
+%D {replaceincommalist}
+%D
+%D The next macro can be used to replace an indexed element
+%D in a commalist:
+%D
+%D \starttyping
+%D \replaceincommalist\MyList{2}
+%D \stoptyping
+%D
+%D Element~2 will be replaced by the current meaning of the macro
+%D \type {\newcommalistelement}. The old meaning is saved in
+%D \type {\commalistelement}. The replacement honors grouped items,
+%D like in:
+%D
+%D \starttyping
+%D \def\MyList{a,b,c,d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,b,c,d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,{b,c},d,e,f} \replaceincommalist\MyList{3}
+%D \def\MyList{a,b,c,{d,e,f}} \replaceincommalist\MyList{3}
+%D \stoptyping
+
+\let\newcommalistelement\empty
+
+\def\replaceincommalist#1#2% #1 = commalistelement #2 = position starts at 1
+ {\def\doreplaceincommalist##1%
+ {\ifnum\commalistcounter=#2\relax
+ \ifx\newcommalistelement\empty\else
+ \ifx\newcommalist\empty
+ \let\newcommalist\newcommalistelement
+ \else
+ \@EA\@EA\@EA\def\@EA\@EA\@EA\newcommalist\@EA\@EA\@EA
+ {\@EA\newcommalist\@EA,\newcommalistelement}%
+ \fi
+ \fi
+ \def\commalistelement{##1}%
+ \else
+ \ifx\newcommalist\empty
+ \ifx\nexttoken\bgroup % is known -)
+ \def\newcommalist{{##1}}%
+ \else
+ \def\newcommalist{##1}%
+ \fi
+ \else
+ \ifx\nexttoken\bgroup % is known -)
+ \@EA\def\@EA\newcommalist\@EA{\newcommalist,{##1}}%
+ \else
+ \@EA\def\@EA\newcommalist\@EA{\newcommalist,##1}%
+ \fi
+ \fi
+ \fi
+ \advance\commalistcounter\plusone}%
+ \let\commalistelement\empty
+ \let\newcommalist\empty
+ \commalistcounter\plusone
+ \@EA\processcommalist\@EA[#1]\doreplaceincommalist
+ \dodoglobal\let#1\newcommalist}
+
+%D \macros
+%D {globalprocesscommalist}
+%D
+%D The commalist processing commands are characterized by the
+%D fact that the way they handle expansion as well as the fact
+%D that they can be nested. This makes them kind of useless for
+%D handling comma lists in alignments. In these situations the
+%D next macro can be of use.
+
+\def\globalprocesscommaitem#1,%
+ {\if]#1\else
+ \globalcommacommand{#1}%
+ \expandafter\globalprocesscommaitem
+ \fi}
+
+\def\globalprocesscommalist[#1]#2%
+ {\global\let\globalcommacommand#2%
+ \expandafter\globalprocesscommaitem#1,],}
+
+%D \macros
+%D {startprocesscommalist,startprocesscommacommand}
+%D
+%D Two more:
+
+\long\def\startprocesscommalist[#1]#2\stopprocesscommalist
+ {\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}%
+ \processcommalist[#1]\currentcommalistcommand}
+
+\long\def\startprocesscommacommand[#1]#2\stopprocesscommacommand
+ {\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}%
+ \processcommacommand[#1]\currentcommalistcommand}
+
+%D \macros
+%D {withoutpt,PtToCm,
+%D numberofpoints,dimensiontocount}
+%D
+%D We can convert point into centimeters with:
+%D
+%D \starttyping
+%D \PtToCm{dimension}
+%D \stoptyping
+
+{\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\t=\@@other
+ \gdef\WITHOUTPT#1pt{#1}}
+
+\def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+%D The capitals are needed because \type{p} and \type{t} have
+%D \CATCODE~12, while macronames only permit tokens with the
+%D \CATCODE~11. As a result we cannot use the \type{.group}
+%D primitives. Those who want to know more about this kind of
+%D manipulations, we advice to study the \TEX book in detail.
+%D Because this macro does not do any assignment, we can use it
+%D in the following way too.
+
+\def\PtToCm#1%
+ {\begingroup
+ \scratchdimen#1\relax
+ \scratchdimen0.0351459804\scratchdimen % 2.54/72.27
+ \withoutpt\the\scratchdimen cm%
+ \endgroup}
+
+%D We also support:
+%D
+%D \starttyping
+%D \numberofpoints {dimension}
+%D \dimensiontocount {dimension} {\count}
+%D \stoptyping
+%D
+%D Both macros return a rounded number.
+
+% \dimensiontocount{10.49pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.49pt}
+% \dimensiontocount{10.51pt}\scratchcounter \the\scratchcounter / \numberofpoints{10.51pt}
+
+\def\dimensiontocount#1#2{#2\numexpr\dimexpr#1\relax/\maxcard\relax}
+\def\numberofpoints #1{\the\numexpr\dimexpr#1\relax/\maxcard\relax}
+
+%D \macros
+%D {swapdimens,swapmacros}
+%D
+%D Simple but effective are the next two macros. There name
+%D exactly states their purpose. The \type{\scratchdimen} and
+%D \type{\!!stringa} can only be swapped when being the first
+%D argument.
+
+\def\swapdimens#1#2%
+ {\scratchdimen #1\redoglobal #1#2\dodoglobal #2\scratchdimen}
+
+\def\swapmacros#1#2%
+ {\let\!!stringa#1\redoglobal\let#1#2\dodoglobal\let#2\!!stringa}
+
+%D \macros
+%D {pushmacro,popmacro}
+%D
+%D Premature and a bit of beta, we offer:
+%D
+%D \starttyping
+%D \pushmacro\macro
+%D \popmacro\macro
+%D \stoptyping
+%D
+%D Beware: global!
+
+% \def\@s@{@s@}
+%
+% \beginTEX
+%
+% \def\globalpushmacro#1% we can use a faster incement here
+% {\@EA\doglobal\@EA\increment\csname\@s@*\string#1\endcsname
+% \global\@EA\let\csname\csname\@s@*\string#1\endcsname*\string#1\endcsname#1}
+%
+% \def\globalpopmacro#1% \global\let
+% {\global\@EA\let\@EA#1\csname\csname\@s@*\string#1\endcsname*\string#1\endcsname
+% \@EA\doglobal\@EA\decrement\csname\@s@*\string#1\endcsname}
+%
+% \def\localpushmacro#1% this one can be used to push a value over an \egroup
+% {\@EA\doglobal\@EA\increment\csname\@s@**\string#1\endcsname
+% \global\@EA\let\csname\csname\@s@**\string#1\endcsname**\string#1\endcsname#1}
+%
+% \def\localpopmacro#1% \local\let
+% {\@EA\let\@EA#1\csname\csname\@s@**\string#1\endcsname**\string#1\endcsname
+% \global\@EA\decrement\csname\@s@**\string#1\endcsname}
+%
+% \endTEX
+%
+% \beginETEX \newcount
+%
+% \def\globalpushmacro#1%
+% {\ifcsname\@s@*\string#1\endcsname \else
+% \@EA\newcount\csname\@s@*\string#1\endcsname
+% \fi
+% \global\advance\csname\@s@*\string#1\endcsname \plusone
+% \global\@EA\let\csname\the\csname\@s@*\string#1\endcsname*\string#1\endcsname#1}
+%
+% \def\globalpopmacro#1% \global\let
+% {\global\@EA\let\@EA#1\csname\the\csname\@s@*\string#1\endcsname*\string#1\endcsname
+% \global\advance\csname\@s@*\string#1\endcsname \minusone}
+%
+% \def\localpushmacro#1% this one can be used to push a value over an \egroup
+% {\ifcsname\@s@**\string#1\endcsname \else
+% \@EA\newcount\csname\@s@**\string#1\endcsname
+% \fi
+% \global\advance\csname\@s@**\string#1\endcsname \plusone
+% \global\@EA\let\csname\the\csname\@s@**\string#1\endcsname**\string#1\endcsname#1}
+%
+% \def\localpopmacro#1% \local\let
+% {\@EA\let\@EA#1\csname\the\csname\@s@**\string#1\endcsname**\string#1\endcsname
+% \global\advance\csname\@s@**\string#1\endcsname \minusone }
+%
+% \endETEX
+%
+% some 5% faster (used a lot in typescripts, so ...)
+
+\def\@sl@{@sl@}
+\def\@sg@{@sg@}
+
+\let\@@pushedmacro\empty
+
+\beginTEX
+
+\def\globalpushmacro#1% we can use a faster incement here
+ {\xdef\@@pushedmacro{\string#1}%
+ \@EA\doglobal\@EA\increment\csname\@sg@\@@pushedmacro\endcsname
+ \global\@EA\let\csname\csname\@sg@\@@pushedmacro\endcsname\@@pushedmacro\endcsname#1}
+
+\def\globalpopmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \global\@EA\let\@EA#1\csname\csname\@sg@\@@pushedmacro\endcsname\@@pushedmacro\endcsname
+ \@EA\doglobal\@EA\decrement\csname\@sg@\@@pushedmacro\endcsname}
+
+\def\localpushmacro#1% this one can be used to push a value over an \egroup
+ {\xdef\@@pushedmacro{\string#1}%
+ \@EA\doglobal\@EA\increment\csname\@sl@\@@pushedmacro\endcsname
+ \global\@EA\let\csname\csname\@sl@\@@pushedmacro\endcsname\@@pushedmacro\endcsname#1}
+
+\def\localpopmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \@EA\let\@EA#1\csname\csname\@sl@\@@pushedmacro\endcsname\@@pushedmacro\endcsname
+ \global\@EA\decrement\csname\@sl@\@@pushedmacro\endcsname}
+
+\endTEX
+
+\beginETEX
+
+\def\globalpushmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \ifcsname\@sg@\@@pushedmacro\endcsname \else
+ \@EA\newcount\csname\@sg@\@@pushedmacro\endcsname
+ \fi
+ \global\advance\csname\@sg@\@@pushedmacro\endcsname \plusone
+ \global\@EA\let\csname\the\csname\@sg@\@@pushedmacro\endcsname\@@pushedmacro\endcsname#1}
+
+\def\globalpopmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \global\@EA\let\@EA#1\csname\the\csname\@sg@\@@pushedmacro\endcsname\@@pushedmacro\endcsname
+ \global\advance\csname\@sg@\@@pushedmacro\endcsname \minusone}
+
+\def\localpushmacro#1% this one can be used to push a value over an \egroup
+ {\xdef\@@pushedmacro{\string#1}%
+ \ifcsname\@sl@\@@pushedmacro\endcsname \else
+ \@EA\newcount\csname\@sl@\@@pushedmacro\endcsname
+ \fi
+ \global\advance\csname\@sl@\@@pushedmacro\endcsname \plusone
+ \global\@EA\let\csname\the\csname\@sl@\@@pushedmacro\endcsname\@@pushedmacro\endcsname#1}
+
+\def\localpopmacro#1%
+ {\xdef\@@pushedmacro{\string#1}%
+ \@EA\let\@EA#1\csname\the\csname\@sl@\@@pushedmacro\endcsname\@@pushedmacro\endcsname
+ \global\advance\csname\@sl@\@@pushedmacro\endcsname \minusone }
+
+\endETEX
+
+% \let\pushmacro\globalpushmacro
+% \let\popmacro \globalpopmacro
+
+\let\pushmacro\localpushmacro
+\let\popmacro \localpopmacro
+
+%D \macros
+%D {setlocalhsize}
+%D
+%D Sometimes we need to work with the \type{\hsize} that is
+%D corrected for indentation and left and right skips. The
+%D corrected value is available in \type{\localhsize}, which
+%D needs to be calculated with \type{\setlocalhsize} first.
+%D
+%D \starttyping
+%D \setlocalhsize \hbox to \localhsize{...}
+%D \setlocalhsize[-1em] \hbox to \localhsize{...}
+%D \setlocalhsize[.5ex] \hbox to \localhsize{...}
+%D \stoptyping
+%D
+%D These examples show us that an optional can be used. The
+%D value provided is added to \type{\localhsize}.
+
+\newdimen\localhsize
+
+\def\complexsetlocalhsize[#1]% don't change !
+ {\localhsize\hsize
+ \ifnum\hangafter<\zerocount
+ \advance\localhsize\ifdim\hangindent>\zeropoint-\fi\hangindent
+ \fi
+ \advance\localhsize -\leftskip
+ \advance\localhsize -\rightskip
+ \advance\localhsize #1\relax}
+
+\def\simplesetlocalhsize
+ {\complexsetlocalhsize[\zeropoint]}
+
+\definecomplexorsimple\setlocalhsize
+
+%D \macros
+%D {doifvalue,doifnotvalue,doifelsevalue,
+%D doifnothing,doifsomething,doifelsenothing,
+%D doifvaluenothing,doifvaluesomething,doifelsevaluenothing}
+%D
+%D These long named \type{\if} commands can be used to access
+%D macros (or variables) that are normally accessed by using
+%D \type{\getvalue}. Using these alternatives safes us three
+%D tokens per call. Anyone familiar with the not||values
+%D ones, can derive their meaning from the definitions.
+
+ \def\doifvalue#1{\doif {\csname#1\endcsname}}
+ \def\doifnotvalue#1{\doifnot {\csname#1\endcsname}}
+ \def\doifelsevalue#1{\doifelse{\csname#1\endcsname}}
+
+ \def\doifnothing#1{\doif {#1}{}}
+ \def\doifsomething#1{\doifnot {#1}{}}
+ \def\doifelsenothing#1{\doifelse{#1}{}}
+
+ \def\doifvaluenothing#1{\doif {\csname#1\endcsname}{}}
+ \def\doifvaluesomething#1{\doifnot {\csname#1\endcsname}{}}
+\def\doifelsevaluenothing#1{\doifelse{\csname#1\endcsname}{}}
+
+%D Faster but spoiling inheritance (copying parameters):
+%D
+%D \starttyping
+%D \def\doifelsevaluesomething#1#2#3%
+%D {\expandafter\ifx\csname#1\endcsname\empty#3\else#2\fi}
+%D
+%D \def\doifvaluesomething#1#2%
+%D {\expandafter\ifx\csname#1\endcsname\empty\else#2\fi}
+%D
+%D \def\doifvaluenothing#1#2%
+%D {\expandafter\ifx\csname#1\endcsname\empty#2\fi}
+%D \stoptyping
+%D
+%D Slightly more efficient:
+
+ \def\doifnothing{\doif \empty}
+ \def\doifsomething{\doifnot \empty}
+\def\doifelsenothing{\doifelse\empty}
+
+%D The somewhat faster alternatives are:
+
+\long\def\doifvalue#1#2%
+ {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifnotvalue#1#2%
+ {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelsevalue#1#2%
+ {\edef\!!stringa{\csname#1\endcsname}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\long\def\doifnothing#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifsomething#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelsenothing#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\long\def\doifsomethingelse#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\long\def\doifvaluenothing#1%
+ {\edef\!!stringa{\csname#1\endcsname}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifvaluesomething#1%
+ {\edef\!!stringa{\csname#1\endcsname}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelsevaluenothing#1%
+ {\edef\!!stringa{\csname#1\endcsname}%
+ \ifx\!!stringa\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifemptyelsevalue, doifemptyvalue, doifnotemptyvalue}
+%D
+%D Also handy:
+
+\def\doifemptyelsevalue#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifemptyvalue#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotemptyvalue#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {doifallcommonelse}
+%D
+%D A complete match of two sets can be tested with
+%D \type {\doifallcommonelse}, where the first two
+%D arguments are sets.
+
+%\def\doifallcommonelse#1#2#3#4%
+% {\def\p!docommoncheck##1%
+% {\doifnotinset{##1}{#2}{\donefalse}%
+% \ifdone\else\quitcommalist\fi}%
+% \donetrue
+% \processcommalist[#1]\p!docommoncheck
+% \ifdone#3\else#4\fi}
+
+\def\@@doifallcommonelse#1#2#3#4% slow
+ {\def\p!docommoncheck##1%
+ {\doifnotinset{##1}{#4}\donefalse
+ \ifdone\else\expandafter\quitcommalist\fi}%
+ \donetrue
+ \processcommalist[#3]\p!docommoncheck
+ \ifdone\expandafter#1\else\expandafter#2\fi}
+
+\def\doifallcommonelse
+ {\@@doifallcommonelse\firstoftwoarguments\secondoftwoarguments}
+
+\def\doifallcommon
+ {\@@doifallcommonelse\firstofonearguments\gobbleoneargument}
+
+\def\doifnotallcommon
+ {\@@doifallcommonelse\gobbleoneargument\firstofonearguments}
+
+%D \macros
+%D {DOIF,DOIFELSE,DOIFNOT}
+%D
+%D \TEX\ is case sensitive. When comparing arguments, this
+%D feature sometimes is less desirable, for instance when we
+%D compare filenames. The next three alternatives upcase their
+%D arguments before comparing them.
+%D
+%D \starttyping
+%D \DOIF {string1} {string2} {...}
+%D \DOIFNOT {string1} {string2} {...}
+%D \DOIFELSE {string1} {string2} {then ...}{else ...}
+%D \stoptyping
+%D
+%D We have to use a two||step implementation, because the
+%D expansion has to take place outside \type{\uppercase}.
+
+\def\p!DOIF#1#2%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\p!DOIFNOT#1#2%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\p!DOIFELSE#1#2%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\p!DOIFINSTRINGELSE#1#2%
+ {\uppercase{\ifinstringelse{#1}{#2}}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\DOIF {\ExpandBothAfter\p!DOIF}
+\def\DOIFNOT {\ExpandBothAfter\p!DOIFNOT}
+\def\DOIFELSE {\ExpandBothAfter\p!DOIFELSE}
+\def\DOIFINSTRINGELSE {\ExpandBothAfter\p!DOIFINSTRINGELSE}
+
+%D \macros
+%D {dosingleargumentwithset,
+%D dodoubleargumentwithset,dodoubleemptywithset,
+%D dotripleargumentwithset,dotripleemptywithset}
+%D
+%D These maybe too mysterious macros enable us to handle more
+%D than one setup at once.
+%D
+%D \starttyping
+%D \dosingleargumentwithset \command[#1]
+%D \dodoubleargumentwithset \command[#1][#2]
+%D \dotripleargumentwithset \command[#1][#2][#3]
+%D \dodoubleemptywithset \command[#1][#2]
+%D \dotripleemptywithset \command[#1][#2][#3]
+%D \stoptyping
+%D
+%D The first macro calls \type{\command[##1]} for each string
+%D in the set~\type{#1}. The second one calls for
+%D \type{\commando[##1][#2]} and the third, well one may guess.
+%D These commands support constructions like:
+%D
+%D \starttyping
+%D \def\dodefinesomething[#1][#2]%
+%D {\getparameters[\??xx#1][#2]}
+%D
+%D \def\definesomething%
+%D {\dodoubleargumentwithset\dodefinesomething}
+%D \stoptyping
+%D
+%D Which accepts calls like:
+%D
+%D \starttyping
+%D \definesomething[alfa,beta,...][variable=...,...]
+%D \stoptyping
+%D
+%D Now a whole bunch of variables like \type{\@@xxalfavariable}
+%D and \type{\@@xxbetavariable} is defined.
+
+\def\dodoublewithset#1#2%
+ {\def\dododoublewithset[##1][##2]%
+ {\doifsomething{##1}
+ {\def\dodododoublewithset####1{#2[####1][##2]}%
+ \processcommalist[##1]\dodododoublewithset}}%
+ #1\dododoublewithset}
+
+\def\dodoubleemptywithset {\dodoublewithset\dodoubleempty}
+\def\dodoubleargumentwithset{\dodoublewithset\dodoubleargument}
+
+\def\dotriplewithset#1#2%
+ {\def\dodotriplewithset[##1][##2][##3]%
+ {\doifsomething{##1}
+ {\def\dododotriplewithset####1{#2[####1][##2][##3]}%
+ \processcommalist[##1]\dododotriplewithset}}%
+ #1\dodotriplewithset}
+
+\def\dotripleemptywithset {\dotriplewithset\dotripleempty}
+\def\dotripleargumentwithset{\dotriplewithset\dotripleargument}
+
+%D \macros
+%D {stripcharacters,stripspaces}
+%D
+%D The next command was needed first when we implemented
+%D the \CONTEXT\ interactivity macros. When we use labeled
+%D destinations, we often cannot use all the characters we
+%D want. We therefore strip some of the troublemakers, like
+%D spaces, from the labels before we write them to the
+%D \DVI||file, which passes them to for instance a PostScript
+%D file.
+%D
+%D \starttyping
+%D \stripspaces\from\one\to\two
+%D \stoptyping
+%D
+%D Both the old string \type{\one} and the new one \type{\two}
+%D are expanded. This command is a special case of:
+%D
+%D \starttyping
+%D \stripcharacter\char\from\one\to\two
+%D \stoptyping
+%D
+%D As we can see below, spaces following a control sequence are
+%D to enclosed in \type{{}}.
+
+% keep this one:
+%
+% \def\stripcharacter#1\from#2\to#3%
+% {\def\dostripcharacter##1#1##2\end
+% {\edef\!!strippedstring{\!!strippedstring##1}%
+% \doifnotempty{##2}{\dostripcharacter##2\end}}%
+% \let\!!strippedstring\empty
+% \edef\!!stringa{#2}%
+% \@EA\dostripcharacter\!!stringa#1\end
+% \dodoglobal\let#3\!!strippedstring}
+%
+% the following is better (comes from syst-loc):
+
+\def\stripcharacter#1\from#2\to#3%
+ {\def\dostripcharacter##1#1##2\end
+ {\edef\!!strippedstring{\!!strippedstring##1}%
+ \doifnotempty{##2}{\dostripcharacter##2\end}}%
+ \let\!!strippedstring\empty
+ \edef\!!stringa{#2}%
+ \@EA\dostripcharacter\!!stringa#1\end
+ \dodoglobal\let#3\!!strippedstring}
+
+\def\stripspaces\from#1\to#2% will become \unspacestring#1\from#2
+ {\stripcharacter{ }\from#1\to#2}
+
+%D \macros
+%D {unspacestring}
+%D
+%D The next macro does the same but is more compatible with other macros,
+%D like \type {\convert...}.
+
+\def\unspacestring#1\to#2%
+ {\stripcharacter{ }\from#1\to#2}
+
+%D \macros
+%D {executeifdefined}
+%D
+%D \CONTEXT\ uses one auxiliary file for all data concerning
+%D tables of contents, references, two||pass optimizations,
+%D sorted lists etc. This file is loaded as many times as
+%D needed. During such a pass we skip the commands thate are of
+%D no use at that moment. Because we don't want to come into
+%D trouble with undefined auxiliary commands, we call the
+%D macros in a way similar to \type{\getvalue}. The next macro
+%D take care of such executions and when not defined, gobbles
+%D the unwanted arguments.
+%D
+%D \starttyping
+%D \executeifdefined{name}\gobbleoneargument
+%D \stoptyping
+%D
+%D We can of course gobble more arguments using the
+%D appropriate gobbling command.
+
+\newif\ifexecuted % general purpose
+
+\def\executeifdefined#1#2%
+ {\ifundefined{#1}%
+ \def\next{#2}%
+ \else
+ \def\next{\getvalue{#1}}%
+ \fi
+ \next}
+
+%D Just for fun I times the next alternative: it was roughly
+%D timed about 15\% faster than the default (10+ sec to 9 sec)!
+
+\beginTEX
+
+\def\executeifdefined#1% #2 / never change this one again
+ {\ifundefined{#1}%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi
+ {\csname#1\endcsname}}
+
+\endTEX
+
+\beginETEX
+
+% \def\executeifdefined#1% #2 / never change this one again
+% {\ifcsname#1\endcsname
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi
+% {\csname#1\endcsname}}
+
+\def\executeifdefined#1% #2 / never change this one again
+ {\ifcsname#1\endcsname
+ \csname#1\expandafter\expandafter\expandafter\endcsname\expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\endETEX
+
+% \letvalue{f }\firstofoneargument \def\executeifdefined#1{\csname\ifcsname#1\endcsname#1\else f \fi\endcsname}
+
+%D This one also has the advantage that it is fully
+%D expandable and that it can be used after an assignment.
+
+%D \macros
+%D {executeifdefinedcs}
+%D
+%D An also fully expandable variant is the following:
+%D
+%D \starttyping
+%D \executeifdefinedcs{a}{b}
+%D \stoptyping
+%D
+%D In dit geval zijn beide argumenten csnames.
+
+\def\executeifdefinedcs#1#2%
+ {\csname\ifundefined{#1}#2\else#1\fi\endcsname}
+
+%D We considered an alternative implementation accepting
+%D commands directly, like:
+%D
+%D \starttyping
+%D \executeifdefined\name\gobblefivearguments
+%D \stoptyping
+%D
+%D For the moment we don't need this one, so we stick to the
+%D faster one.
+
+%D \macros
+%D {executeandforget}
+%D
+%D The following macros were requested by Simon. Watch the
+%D global variant.
+%D
+%D \starttyping
+%D \executeandforget\SomeCommand
+%D \doglobal\executeandforget\AnotherCommand
+%D \stoptyping
+
+\def\executeandforget#1%
+ {\global\let\@@expanded#1%
+ \dodoglobal\let#1\relax
+ \@@expanded}
+
+%D \macros
+%D {doifsomespaceelse}
+%D
+%D The next command checks a string on the presence of a space
+%D and executed a command accordingly.
+%D
+%D \starttyping
+%D \doifsomespaceelse {tekst} {then ...} {else ...}
+%D \stoptyping
+%D
+%D We use this command in \CONTEXT\ for determing if an
+%D argument must be broken into words when made interactive.
+%D Watch the use of \type{\noexpand}.
+
+%D Is this one still needed?
+
+% \long\def\doifsomespaceelse#1#2#3%
+% {\def\p!doifsomespaceelse##1 ##2##3\war%
+% {\if\noexpand##2@#3\else#2\fi}%
+% \p!doifsomespaceelse#1 @ @\war}
+
+\def\p!doifsomespaceelse#1 #2#3\war{\if\noexpand#2@}
+
+\long\def\doifsomespaceelse#1% % #2#3%
+ {\p!doifsomespaceelse#1 @ @\war % #3\else#2\fi}
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {adaptdimension,balancedimensions}
+%D
+%D Again we introduce some macros that are closely related to
+%D an interface aspect of \CONTEXT. The first command can be
+%D used to adapt a \DIMENSION.
+%D
+%D \starttyping
+%D \adaptdimension {dimension} {value}
+%D \stoptyping
+%D
+%D When the value is preceed by a \type{+} or minus, the
+%D dimension is advanced accordingly, otherwise it gets the
+%D value.
+
+% \def\doadaptdimension#1#2\\#3\\%
+% {\if#1+%
+% \dodoglobal\advance#3 #1#2\relax
+% \else\if#1-%
+% \dodoglobal\advance#3 #1#2\relax
+% \else
+% \dodoglobal#3=#1#2\relax
+% \fi\fi}
+%
+% more fuzzy but also more efficient
+
+\def\doadaptdimension#1#2\\#3\\%
+ {\if#1+%
+ \dodoglobal\advance
+ \else\if#1-%
+ \dodoglobal\advance
+ \else
+ \dodoglobal
+ \fi\fi
+ #3 #1#2\relax}
+
+\def\adaptdimension#1#2%
+ {\expandafter\doadaptdimension#2\\#1\\}
+
+%D A second command takes two \DIMENSIONS. Both are adapted,
+%D depending on the sign of the given value.
+%D maat. This time we take the value as it is, and don't look
+%D explicitly at the preceding sign.
+%D
+%D \starttyping
+%D \balancedimensions {dimension 1} {dimension 2} {value}
+%D \stoptyping
+%D
+%D When a positive value is given, the first dimension is
+%D incremented, the second ond is decremented. A negative value
+%D has the opposite result.
+
+\def\balancedimensions#1#2#3%
+ {\scratchdimen#3\relax
+ \redoglobal\advance#1 \scratchdimen
+ \dodoglobal\advance#2 -\scratchdimen}
+
+%D Both commands can be preceded by \type{\doglobal}. Here we
+%D use \type{\redo} first, because \type{\dodo} resets the
+%D global character.
+
+%D \macros
+%D {processseparatedlist}
+%D
+%D Maybe a bit late, but here is a more general version of the
+%D \type{\processcommalist} command. This time we don't handle
+%D nesting but accept arbitrary seperators.
+%D
+%D \starttyping
+%D \processseparatedlist[list][separator]\command
+%D \stoptyping
+%D
+%D One can think of things like:
+%D
+%D \starttyping
+%D \processseparatedlist[alfa+beta+gamma][+]\message
+%D \stoptyping
+
+%D First we show the simple alternative:
+%D
+%D \starttyping
+%D \def\processseparatedlist[#1][#2]#3%
+%D {\def\doprocessseparatedlist##1##2#2%
+%D {\if]##1%
+%D \let\next=\relax
+%D \else\if]##2%
+%D \let\next=\relax
+%D \else\ifx\blankspace##2%
+%D #3{##1}%
+%D \let\next=\doprocessseparatedlist
+%D \else
+%D #3{##1##2}%
+%D \let\next=\doprocessseparatedlist
+%D \fi\fi\fi
+%D \next}%
+%D \doprocessseparatedlist#1#2]#2}
+%D \stoptyping
+%D
+%D However, we want to handle all situations, like:
+%D
+%D \startbuffer
+%D \processseparatedlist[{aap noot}] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[{aap} {noot}][ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[aap {noot}] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \processseparatedlist[aap noot] [ ]{\def\xxx} \convertcommand\xxx\to\ascii {\tttf\ascii}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D Therefore we smuggle a \type {\relax} in front of the
+%D argument, which we remove afterwards.
+
+% \def\doprocessseparatedlist#1]#2[#3]#4%
+% {\def\dodoprocessseparatedlist##1##2#3%
+% {\if]##1%
+% \let\dodoprocessseparatedlist\relax
+% \else\if]##2%
+% \let\dodoprocessseparatedlist\relax
+% \else\ifx\blankspace##2%
+% #4{##1}%
+% \else
+% #4{##1##2}%
+% \fi\fi\fi
+% \dodoprocessseparatedlist}%
+% \@EA\dodoprocessseparatedlist\gobbleoneargument#1#3]#3}
+
+% testcase Vit Zyka:
+%
+% \def\Do#1{(#1)}
+% 1\processseparatedlist[{aap noot}] [ ]\Do \par
+% 2\processseparatedlist[{aap} {noot}][ ]\Do \par
+% 3\processseparatedlist[aap {noot}] [ ]\Do \par
+% 4\processseparatedlist[aap noot] [ ]\Do \par
+% 5\processseparatedlist[aap;noot;a noot;noot a; noot a noot][;]\Do \par
+% 6\processseparatedlist[][;]\Do \par
+% 7\processseparatedlist[;][;]\Do \par
+
+\def\doprocessseparatedlist#1]#2[#3]#4%
+ {\def\dodoprocessseparatedlist##1##2#3%
+ {\def\!!stringa{##2}% suggested by VZ
+ \if]##1%
+ \let\dodoprocessseparatedlist\relax
+ \else\ifx\blankspace\!!stringa
+ #4{##1}%
+ \else\if]##2%
+ \let\dodoprocessseparatedlist\relax
+ \else
+ #4{##1##2}%
+ \fi\fi\fi
+ \dodoprocessseparatedlist}%
+ \@EA\dodoprocessseparatedlist\gobbleoneargument#1#3]#3}
+
+\def\processseparatedlist[%
+ {\doprocessseparatedlist\relax}
+
+%D \macros
+%D {processlist}
+%D
+%D An even more general list processing macro is the
+%D following one:
+%D
+%D \starttyping
+%D \processlist{beginsym}{endsym}{separator}\docommand list
+%D \stoptyping
+%D
+%D This one supports arbitrary open and close symbols as well
+%D as user defined separators.
+%D
+%D \starttyping
+%D \processlist(){=>}\docommand(a=>b=>c=>d)
+%D \stoptyping
+
+\long\def\processlist#1#2#3#4% no blank skipping !
+ {\def\doprocesslist##1#2%
+ {\def\dodoprocesslist####1####2#3%
+ {\ifx#2####1%
+ \let\dodoprocesslist\relax
+ \else\ifx#2####2%
+ \let\dodoprocesslist\relax
+ \else
+ #4{####1####2}%
+ \fi\fi
+ \dodoprocesslist}%
+ \expandafter\dodoprocesslist\gobbleoneargument##1#3#2#3}%
+ \def\dodoprocesslist#1%
+ {\doprocesslist\relax}%
+ \dodoprocesslist}
+
+% %D \macros
+% %D {dohonorgroupedargument}
+% %D
+% %D The previous macro uses yet another auxiliary macro to
+% %D handle the special case.
+%
+% \def\dohonorgroupedargument#1[%
+% {\doifnextbgroupelse{\dodohonorgroupedargument#1}{#1[}}
+%
+% \def\dodohonorgroupedargument#1#2%
+% {#1[{{#2}}}
+
+%D \macros
+%D {processassignlist}
+%D
+%D Is possible to combine an assignment list with one
+%D containing keywords. Assignments are treated accordingly,
+%D keywords are treated by \type{\command}.
+%D
+%D \starttyping
+%D \processassignlist[...=...,...=...,...]\commando
+%D \stoptyping
+%D
+%D This command can be integrated in \type{\getparameters}, but
+%D we decided best not to do so.
+
+\def\processassignlist#1[#2]#3%
+ {\def\p!dodogetparameter[##1=##2=##3]%
+ {\doifnot{##3}\relax{#3{##1}}}%
+ \def\p!dogetparameter##1%
+ {\p!dodogetparameter[##1==\relax]}%
+ \processcommalist[#2]\p!dogetparameter}
+
+% too ugly
+%
+% %D \macros
+% %D {DoAfterFi,DoAfterFiFi}
+% %D
+% %D Sometimes \type{\fi}'s can get into the way. We can reach
+% %D over such a troublemaker with:
+% %D
+% %D \starttyping
+% %D \DoAfterFi{some commands}
+% %D \DoAfterFiFi{some commands}
+% %D \stoptyping
+% %D
+% %D It saves us a \type{\next} construction. Skipping
+% %D \type{\else...\fi} is more tricky, so this one is not
+% %D provided.
+%
+% \def\DoAfterFi#1\fi{\fi#1}
+% \def\DoAfterFiFi#1\fi#2\fi{\fi\fi#1}
+
+%D \macros
+%D {untextargument
+%D untexcommand}
+%D
+%D When manipulating data(bases) and for instance generating
+%D index entries, the next three macros can be of help:
+%D
+%D \starttyping
+%D \untextargument{...}\to\name
+%D \untexcommand {...}\to\name
+%D \stoptyping
+%D
+%D They remove braces and backslashes and give us something to
+%D sort.
+
+\def\untexsomething
+ {\begingroup
+ \catcode`\{=\@@ignore
+ \catcode`\}=\@@ignore
+ \escapechar\minusone
+ \dountexsomething}
+
+\long\def\dountexsomething#1#2\to#3%
+ {\doglobal#1#2\to\untexedargument
+ \endgroup
+ \let#3\untexedargument}
+
+\def\untexargument{\untexsomething\convertargument}
+\def\untexcommand {\untexsomething\convertcommand}
+
+%D \macros
+%D {ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints}
+%D
+%D One characteristic of \POSTSCRIPT\ and \PDF\ is that both
+%D used big points (\TEX's bp). The next macros convert points
+%D and scaled points into big points.
+%D
+%D \starttyping
+%D \ScaledPointsToBigPoints {number} \target
+%D \ScaledPointsToWholeBigPoints {number} \target
+%D \stoptyping
+%D
+%D The magic factor $72/72.27$ can be found in most \TEX\
+%D related books.
+
+% \def\ScaledPointsToBigPoints #1{\PointsToBigPoints {#1sp}}
+% \def\ScaledPointsToWholeBigPoints#1{\PointsToWholeBigPoints{#1sp}}
+%
+% \def\PointsToBigPoints#1#2%
+% {\scratchdimen#1%
+% \scratchdimen.996264\scratchdimen
+% \edef#2{\withoutpt\the\scratchdimen}}
+%
+% \def\PointsToWholeBigPoints#1#2%
+% {\scratchdimen#1%
+% \scratchdimen.996264\scratchdimen
+% \scratchcounter\scratchdimen
+% \advance\scratchcounter \medcard
+% \divide\scratchcounter \maxcard
+% \edef#2{\the\scratchcounter}}
+
+% \PointsToBigPoints{10.53940pt}\test \test
+% \PointsToBigPoints{10.53941pt}\test \test
+% \PointsToBigPoints{10.53942pt}\test \test
+
+% \PointsToWholeBigPoints{10.53940pt}\test \test
+% \PointsToWholeBigPoints{10.53941pt}\test \test
+% \PointsToWholeBigPoints{10.53942pt}\test \test
+
+\beginTEX
+
+ \def\PointsToBigPoints#1#2%
+ {\scratchdimen#1%
+ \scratchdimen.996264\scratchdimen
+ \edef#2{\withoutpt\the\scratchdimen}}
+
+ \def\PointsToWholeBigPoints#1#2%
+ {\scratchdimen#1%
+ \scratchdimen.996264\scratchdimen
+ \scratchcounter\scratchdimen
+ \advance\scratchcounter \medcard
+ \divide\scratchcounter \maxcard
+ \edef#2{\the\scratchcounter}}
+
+\endTEX
+
+\beginETEX \dimexpr \numexpr
+
+% \def\PointsToBigPoints#1#2%
+% {\edef#2{\withoutpt\the\dimexpr(.996264\dimexpr(#1))}}
+
+% \def\PointsToWholeBigPoints#1#2%
+% {\edef#2{\the\numexpr(\numexpr(\dimexpr(.996264\dimexpr(#1)))/\maxcard)}}
+
+ \def\PointsToBigPoints#1#2%
+ {\edef#2{\withoutpt\the\dimexpr.996264\dimexpr#1\relax\relax}}
+
+ \def\PointsToWholeBigPoints#1#2%
+ {\edef#2{\the\numexpr\dimexpr.996264\dimexpr#1\relax\relax/\maxcard\relax}}
+
+\endETEX
+
+\def\ScaledPointsToBigPoints #1{\PointsToBigPoints {\number#1\scaledpoint}}
+\def\ScaledPointsToWholeBigPoints#1{\PointsToWholeBigPoints{\number#1\scaledpoint}}
+
+%D \macros
+%D {PointsToReal}
+%D
+%D Points can be stripped from their suffix by using
+%D \type{\withoutpt}. The next macro enveloppes this macro.
+%D
+%D \starttyping
+%D \PointsToReal {dimension} \target
+%D \stoptyping
+
+\def\PointsToReal#1#2%
+ {\scratchdimen#1%
+ \edef#2{\withoutpt\the\scratchdimen}}
+
+%D \macros
+%D {dontleavehmode}
+%D
+%D Sometimes when we enter a paragraph with some command, the
+%D first token gets the whole first line. We can prevent this
+%D by saying:
+%D
+%D \starttyping
+%D \dontleavehmode
+%D \stoptyping
+%D
+%D This command is used in for instance the language module
+%D \type{lang-ini}. The first version was:
+%D
+%D \starttyping
+%D \def\dontleavehmode{\ifhmode\else\ifmmode\else$ $\fi\fi}
+%D \stoptyping
+%D
+%D Next, Taco came with a better alternative (using mathsurround):
+%D
+%D \starttyping
+%D \def\dontleavehmode
+%D {\ifhmode\else \ifmmode\else
+%D {\mathsurround\zeropoint\everymath\emptytoks$ $}%
+%D \fi \fi}
+%D \stoptyping
+%D
+%D And finaly we got the following alternative, one that avoids
+%D interfering grouping at the cost of a box.
+
+\newbox\@@dlhbox
+
+\unexpanded \def\dontleavehmode
+ {\ifhmode\else \ifmmode\else
+ \setbox\@@dlhbox\hbox{\mathsurround\zeropoint\everymath\emptytoks$ $}\unhbox\@@dlhbox
+ \fi \fi}
+
+% Also ok, but more sensitive to lookahead expansion is:
+%
+% \def\dontleavehmode{\ifvmode \indent \fi}
+%
+% which assumes indent is kept unchanged. Protecting the macro is only
+% possible in etex (watch out: \unexpanded in context is eq to \protected).
+%
+% \unexpanded \def\dontleavehmode{\ifvmode \indent \fi} % functional spec TH
+
+%D But, if you run a recent version of \TEX, we can use the new
+%D primitive:
+
+\ifx\normalquitvmode\undefined \else \let\dontleavehmode\normalquitvmode \fi
+
+%D \macros
+%D {uppercasestring,lowercasestring}
+%D
+%D The names tell what they do:
+%D
+%D \starttyping
+%D \uppercasestring somestring\to\somestring
+%D \lowercasestring somestring\to\somestring
+%D \stoptyping
+%D
+%D the first argument may be a \type{\macro}.
+
+\def\uppercasestring#1\to#2% first @EA redundant
+ {\edef#2{#1}\@EA\uppercase\@EA{\@EA\dodoglobal\@EA\edef\@EA#2\@EA{#2}}}
+
+\def\lowercasestring#1\to#2% first @EA redundant
+ {\edef#2{#1}\@EA\lowercase\@EA{\@EA\dodoglobal\@EA\edef\@EA#2\@EA{#2}}}
+
+%D \macros
+%D {handletokens}
+%D
+%D With the next macro we enter a critical area of macro
+%D expansion. What we want is a macro that looks like:
+%D
+%D \starttyping
+%D \handletokens some tokens\with \somemacro
+%D \stoptyping
+%D
+%D At first sight the next implementation will suffice, but
+%D running this one shows that we loose the spaces. This is no
+%D surprise because we grab arguments and spaces preceding those
+%D are just ignored.
+%D
+%D \starttyping
+%D \def\nohandletokens#1\end%
+%D {}
+%D
+%D \def\dohandletokens#1#2\end%
+%D {\ifx#1\endoftoken
+%D \expandafter\nohandletokens
+%D \else
+%D \docommand{#1}%
+%D \expandafter\dohandletokens
+%D \fi
+%D #2\end}
+%D
+%D \long\def\handletokens#1\with#2%
+%D {\let\docommand=#2\relax
+%D \dohandletokens#1\endoftoken\end}
+%D \stoptyping
+%D
+%D A second approach therefore grabs the individual characters
+%D by using \type{\afterassignment}, in which case the space is
+%D read in as space.
+%D
+%D \starttyping
+%D \def\dodohandletokens%
+%D {\ifx\next\end \else
+%D \docommand{\next}%
+%D \expandafter\dohandletokens
+%D \fi}
+%D
+%D \def\dohandletokens
+%D {\afterassignment\dodohandletokens\let\next= }
+%D
+%D \long\def\handletokens#1\with#2%
+%D {\let\docommand=#2%
+%D \dohandletokens#1\end}
+%D \stoptyping
+
+%D A bonus example:
+%D
+%D \starttyping
+%D \hbox{\handletokens tekst en meer tekst\with\ruledhbox}
+%D
+%D \def\weetikveel#1{\if#1\blankspace\space\else\ruledhbox{#1}\fi}
+%D
+%D \hbox{\handletokens tekst en meer tekst\with\weetikveel}
+%D \stoptyping
+
+%D \macros
+%D {counttoken,counttokens}
+%D
+%D For the few occasions that we want to know the number of
+%D specific tokens in a string, we can use:
+%D
+%D \starttyping
+%D \counttoken token\in string\to \count
+%D \counttokens string\to \count
+%D \stoptyping
+%D
+%D This macro, that for instance is used in \type{cont-tab},
+%D takes a real counter. The macro can be preceded by \type
+%D {\doglobal}.
+
+\def\counttoken#1\in#2\to#3%
+ {\redoglobal#3\zerocount
+ \def\!!stringa{#1}%
+ \def\!!stringb{\end}%
+ \def\docounttoken##1% obeys {}
+ {\def\!!stringc{##1}%
+ \ifx\!!stringb\!!stringc \else
+ \ifx\!!stringa\!!stringc
+ \dodoglobal\advance#3 \plusone
+ \fi
+ \expandafter\docounttoken
+ \fi}%
+ \docounttoken#2\end
+ \resetglobal}
+
+% \def\counttoken#1\in#2\to#3%
+% {\redoglobal#3\zerocount
+% \def\!!stringa{#1}%
+% \def\docounttoken##1% obeys {}
+% {\def\!!stringb{##1}%
+% \ifx\!!stringa\!!stringb
+% \dodoglobal\advance#3\plusone
+% \fi}%
+% \handletokens#1\with\docounttoken
+% \resetglobal}
+
+\def\counttokens#1\to#2%
+ {\redoglobal#2\zerocount
+ \def\docounttoken##1{\dodoglobal\advance#2\plusone}%
+ \handletokens#1\with\docounttoken
+ \resetglobal}
+
+%D \macros
+%D {splitofftokens}
+%D
+%D Running this one not always gives the expected results.
+%D Consider for instance the macro for which I originally
+%D wrote this token handler.
+
+\long\def\splitofftokens#1\from#2\to#3%
+ {\ifnum#1>\zerocount
+ \scratchcounter#1\relax
+ \def\dosplitofftokens##1%
+ {\ifnum\scratchcounter>\zerocount
+ \advance\scratchcounter \minusone
+ \edef#3{#3##1}%
+ \fi}%
+ % \let#3\empty % #3 can be #2, so:
+ \@EA\let\@EA#3\@EA\empty
+ \@EA\handletokens#2\with\dosplitofftokens
+ \else
+ \edef#3{#2}%
+ \fi}
+
+%D This macro can be called like:
+%D
+%D \startbuffer[example]
+%D \splitofftokens10\from01234567 890123456789\to\test [\test]
+%D \stopbuffer
+%D
+%D However, the characters that we expect to find in
+%D \type{\test} just don;t show up there. The reason for this
+%D is not that logical but follows from \TEX's sometimes
+%D mysterious way of expanding. Look at this:
+%D
+%D \startbuffer[next]
+%D \def\next{a} \edef\test{\next} [\test]
+%D \let\next=b \edef\test{\test\next} [\test]
+%D \let\next=c \edef\test{\next} [\test]
+%D \let\next=d \edef\test{\test\next} [\test]
+%D \let\next=e \@EA\edef\@EA\test\@EA{\test\next} [\test]
+%D \stopbuffer
+%D
+%D \typebuffer[next]
+%D
+%D Careful reading shows that inside an \type{\edef} macro's
+%D that are \type{\let} are not expanded!
+%D
+%D \unprotect\getbuffer[next]\protect
+%D
+%D That's why we finally end up with a macro that looks
+%D ahead by using an assignment, this time by using \type
+%D {\futurelet}, and grabbing an argument as well. That
+%D way we can handle the sentinal, a blank space and grouped
+%D tokens.
+
+\def\dohandletokens % \nexthandledtoken is part of interface
+ {\futurelet\nexthandledtoken\dodohandletokens}
+
+\long\def\handletokens#1\with#2%
+ {\gdef\dododohandletokens{#2}% permits more complex #2's
+ \dohandletokens#1\end}
+
+%D A previous version said \type{\docommand=#2}, but to enable
+%D use in alignments, I decided to use another placeholder, one
+%D that is not sensitive to the global assignment.
+
+%D This alternatives does not handle grouped tokens well, so
+%D next we had (for a short moment):
+%D
+%D \starttyping
+%D \def\dodohandletokens#1%
+%D {\ifx\nexthandledtoken\blankspace
+%D \dododohandletokens{ }%
+%D \fi
+%D \ifx#1\end \else
+%D \dododohandletokens{#1}%
+%D \expandafter\dohandletokens
+%D \fi}
+%D \stoptyping
+%D
+%D This one failed on a trailing space, something we
+%D encounter in \JAVASCRIPT\ cleaning.
+%D
+%D \starttyping
+%D \def\dodohandletokens#1%
+%D {\ifx\nexthandledtoken\blankspace
+%D \dododohandletokens{ }%
+%D \fi
+%D \ifx\nexthandledtoken\end \else
+%D \dododohandletokens{#1}%
+%D \expandafter\dohandletokens
+%D \fi}
+%D \stoptyping
+%D
+%D So, now we have:
+
+\def\dodohandletokens % can be sped up
+ {\ifx\nexthandledtoken\blankspace
+ \def\next * {\dododohandletokens{ }\dohandletokens}%
+ \else\ifx\nexthandledtoken\end
+ \let\next\gobbletwoarguments
+ \else
+ \long\def\next *##1{\dododohandletokens{##1}\dohandletokens}%
+ \fi\fi
+ \next *}
+
+%D This macro is tested on:
+%D
+%D \def\xxx#1{[#1]}
+%D
+%D \startlines
+%D \handletokens abc\with\xxx
+%D \handletokens a b c\with\xxx
+%D \handletokens a b c\with\xxx
+%D \handletokens a{bc}d\with\xxx
+%D \handletokens a\space bc \with\xxx
+%D \stoplines
+%D
+%D And our previous example shows up as:
+%D
+%D \getbuffer[example]
+
+%D \macros
+%D {iftrialtypesetting, ifvisible}
+%D
+%D The next boolean is at first sight a strange one. Sometimes
+%D one does a trial typesetting run, for instance to determine
+%D dimensions. Some mechanisms, like object inclusion, can fail
+%D on such trials. Temporary setting the next boolean to true,
+%D helps a lot. The second boolena can be used to inhibit
+%D processing completely.
+
+\newif\iftrialtypesetting \trialtypesettingfalse
+\newif\ifvisible \visibletrue
+
+%D \macros
+%D {startlocal, startglobal}
+%D
+%D The next four macros are rather self explaining:
+%D
+%D \starttyping
+%D \startlocal
+%D whatever assignments
+%D \stoplocal
+%D
+%D \startglobal
+%D whatever assignments
+%D \stopglobal
+%D \stoptyping
+%D
+%D These macros are meant for those who know the difference
+%D between local and global assignments and are aware of the
+%D possible unwanted side effect
+
+\def\dostartglobaldefs#1#2%
+ {\edef\!!stringa{\the\globaldefs}%
+ \ifnum\globaldefs#10
+ \globaldefs-\globaldefs
+ \fi
+ \advance\globaldefs#21
+ \letvalue{@gd@\the\globaldefs}\!!stringa}
+
+\def\dostopglobaldefs%
+ {\doifdefinedelse{@gd@\the\globaldefs}
+ {\globaldefs\getvalue{@gd@\the\globaldefs}\relax}
+ {\globaldefs\zerocount}}
+
+\def\startlocal {\dostartglobaldefs>-}
+\def\stoplocal {\dostopglobaldefs}
+\def\startglobal {\dostartglobaldefs<+}
+\def\stopglobal {\dostopglobaldefs}
+
+%D \macros
+%D {twodigitrounding}
+%D
+%D When using \type {\special}s or \type {\pdfliteral}s, it
+%D sometimes makes sense to limit the precission. The next
+%D macro rounds a real number to two digits. It takes one
+%D argument and only works in \ETEX.
+
+\beginTEX
+
+ \let\integerrounding \firstofoneargument
+ \let\onedigitrounding \firstofoneargument
+ \let\twodigitrounding \firstofoneargument
+ \let\threedigitrounding\firstofoneargument
+
+\endTEX
+
+\beginETEX \dimexpr
+
+ \def\dointegerrounding #1.#2\relax {#1}
+ \def\doonedigitrounding #1.#2#3\relax {\ifx#2*#1\else#1.#2\fi}
+ \def\dotwodigitrounding #1.#2#3#4\relax {\ifx#2*#1\else#1.#2#3\fi}
+ \def\dothreedigitrounding#1.#2#3#4#5\relax{\ifx#2*#1\else#1.#2#3#4\fi}
+
+ \def\integerrounding#1%
+ {\@EA\@EA\@EA\dointegerrounding \@EA\WITHOUTPT\the\dimexpr#1\points+.5\points \relax .\relax}
+ \def\onedigitrounding#1%
+ {\@EA\@EA\@EA\doonedigitrounding \@EA\WITHOUTPT\the\dimexpr#1\points+.05\points \relax 00.*0\relax}
+ \def\twodigitrounding#1%
+ {\@EA\@EA\@EA\dotwodigitrounding \@EA\WITHOUTPT\the\dimexpr#1\points+.005\points \relax 000.*00\relax}
+ \def\threedigitrounding#1%
+ {\@EA\@EA\@EA\dothreedigitrounding\@EA\WITHOUTPT\the\dimexpr#1\points+.0005\points\relax0000.*00\relax}
+
+% \def\dointegerrounding #1.#2\relax {#1}
+% \def\doonedigitrounding #1.#2#3\relax {#1.#2}
+% \def\dotwodigitrounding #1.#2#3#4\relax {#1.#2#3}
+% \def\dothreedigitrounding#1.#2#3#4#5\relax{#1.#2#3#4}
+
+% \def\integerrounding #1{\@EA\@EA\@EA\dointegerrounding \@EA\WITHOUTPT\the\dimexpr #1\points+.5\points\relax \relax}
+% \def\onedigitrounding #1{\@EA\@EA\@EA\doonedigitrounding \@EA\WITHOUTPT\the\dimexpr #1\points+.05\points\relax 0\relax}
+% \def\twodigitrounding #1{\@EA\@EA\@EA\dotwodigitrounding \@EA\WITHOUTPT\the\dimexpr #1\points+.005\points\relax 00\relax}
+% \def\threedigitrounding#1{\@EA\@EA\@EA\dothreedigitrounding\@EA\WITHOUTPT\the\dimexpr#1\points+.0005\points\relax000\relax}
+
+% \def\integerroundeddimen #1{\@EA\@EA\@EA\dointegerrounding \@EA\WITHOUTPT\the\dimexpr #1+.5\points\relax \relax}
+% \def\onedigitroundeddimen #1{\@EA\@EA\@EA\doonedigitrounding \@EA\WITHOUTPT\the\dimexpr #1+.05\points\relax 0\relax}
+% \def\twodigitroundeddimen #1{\@EA\@EA\@EA\dotwodigitrounding \@EA\WITHOUTPT\the\dimexpr #1+.005\points\relax 00\relax}
+% \def\threedigitroundeddimen#1{\@EA\@EA\@EA\dothreedigitrounding\@EA\WITHOUTPT\the\dimexpr#1+.0005\points\relax000\relax}
+
+\endETEX
+
+%D \macros
+%D {processcontent}
+%D
+%D This is the first occasion where \TEX\ and \ETEX\ are no
+%D longer compatible, although in many cases things go ok.
+%D Beware of verbatim, i.e. catcode changes.
+%D
+%D \starttyping
+%D \def\starthans%
+%D {\processcontent{stophans}\test{\message{\test}\wait}}
+%D \stoptyping
+%D
+%D This macro is first used in the tabulation macros.
+
+\def\processcontent#1%
+ {\begingroup\@EA\doprocesscontent\csname#1\endcsname}
+
+%\beginTEX
+
+\def\doprocesscontent#1#2#3%
+ {\long\def\doprocesscontent##1#1%
+ {\endgroup\long\def#2{##1}#3}%
+ \doprocesscontent}
+
+%\endTEX
+
+% Hm. Side effect, spaces after \type{\test} in verbatim.
+% must set eof token
+
+%\beginETEX \scantokens
+%
+%\def\doprocesscontent#1#2#3%
+% {\long\def\doprocesscontent##1#1%
+% {\egroup\long\def#2{\scantokens{##1}}#3}%
+% \doprocesscontent}
+%
+%\endETEX
+
+%D \macros
+%D {dogobblesingleempty, dogobbledoubleempty}
+%D
+%D These two macros savely grab and dispose two arguments.
+
+\def\dogobblesingleempty{\dosingleempty\dodogobblesingleempty}
+\def\dogobbledoubleempty{\dodoubleempty\dodogobbledoubleempty}
+
+\def\dodogobblesingleempty [#1]{}
+\def\dodogobbledoubleempty[#1][#2]{}
+
+\let\gobblesingleempty\dogobblesingleempty % also used
+\let\gobbledoubleempty\dogobbledoubleempty % also used
+
+%D \macros
+%D {sortcommalist,sortcommacommand,
+%D donumericcompare,comparedresult}
+%D
+%D Sometimes we need to sort a commalist, so here is Taco's
+%D solution. This will in many cases be a list that is stored
+%D in a \type{\csname}, so both commalist and commacommands are
+%D supported. The sorting algorithm is very simple, so the list
+%D should not be too long or sorting will be very slow.
+%D
+%D \starttyping
+%D \sortcommalist[10,2,4,5,6,1,2,3,4,10,20]\donumericcompare
+%D
+%D \def\test{10,2,4,5,6,1,2,3,4,10,20}
+%D
+%D \sortcommacommand[\test]\donumericcompare
+%D \stoptyping
+%D
+%D In both cases, the result is available in the macro \type
+%D {\sortedcommalist}.
+%D
+%D Parameter \type{#2} is a macro that should accept two
+%D parameters, and it has to decide which one is larger, by
+%D setting the counter \type{\comparedresult} to~0 (for equal),
+%D 1~(if it's first argument is larger), or~2 (if it's second
+%D argument is larger).
+%D
+%D As said, these macro are largely written by Taco, and are
+%D (maybe therefore) also the first application of \type
+%D {\replaceincommalist}.
+
+\newcount\comparedresult
+
+\def\sortcommacommand[#1]%
+ {\@EA\sortcommalist\@EA[#1]}
+
+\def\sortcommalist[#1]#2%
+ {\getcommalistsize[#1]%
+ \ifnum\commalistsize>1
+ \let\sortedcommalist\empty
+ \let\comparecommand#2%
+ \processcommalist[#1]\dosortcommacommand
+ \else
+ \def\sortedcommalist{#1}%
+ \fi}
+
+\def\dosortcommacommand#1%
+ {\ifx\sortedcommalist\empty
+ \def\sortedcommalist{#1}%
+ \else
+ \def\!!tempa{#1}%
+ \ifx\!!tempa\empty\else
+ \scratchcounter\plusone
+ \@EA\getcommalistsize\@EA[\sortedcommalist]%
+ \@EA\processcommalist\@EA[\sortedcommalist]\docompareitems
+ \fi
+ \fi}
+
+%D All those \type{\expandafter}'s are there because I do not
+%D want to use \type{\edef}.
+
+\def\docompareitems#1%
+ {\doifnotempty{#1}
+ {\@EA\comparecommand\@EA{\!!tempa}{#1}\relax
+ %\ifcase\compareresult % equal
+ \ifnum\comparedresult<2
+ \ifnum\scratchcounter=\commalistsize
+ \@EA\@EA\@EA\def\@EA\@EA\@EA\sortedcommalist
+ \@EA\@EA\@EA{\@EA\sortedcommalist\@EA,\!!tempa}%
+ \fi
+ %\or % new element larger
+ % \ifnum\scratchcounter=\commalistsize
+ % \@EA\@EA\@EA\def\@EA\@EA\@EA\sortedcommalist
+ % \@EA\@EA\@EA{\@EA\sortedcommalist\@EA,\!!tempa}%
+ % \fi
+ \else % old element larger
+ \@EA\def\@EA\newcommalistelement\@EA{\!!tempa,#1}%
+ \replaceincommalist\sortedcommalist\scratchcounter
+ \expandafter\quitcommalist
+ \fi}%
+ \advance\scratchcounter \plusone} % bug, was \minusone
+
+%D The macro \type{\donumericcompare} considers everything
+%D that is not a number to be larger than any number.
+
+\def\donumericcompare#1#2%
+ {\doifnumberelse{#1}
+ {\doifnumberelse{#2}
+ {\ifnum#1>#2\relax
+ \comparedresult\plusone % #1 is larger
+ \else\ifnum#1<#2\relax
+ \comparedresult\plustwo % #2 is larger
+ \else
+ \comparedresult\zerocount % both are equal
+ \fi\fi}
+ {\comparedresult\plustwo}}
+ {\comparedresult\plusone}}
+
+%D \macros
+%D {@True, @False, @Not, @And}
+%D
+%D Some predicate logic functions, used in for instance the
+%D math module.
+
+\def\@True {00}
+\def\@False {01}
+\def\@Not #1{0\ifcase#11 \or\@EA 1\else \@EA 0\fi}
+\def\@And #1#2{0\ifcase#1#2 \@EA 0\else \@EA 1\fi}
+
+%D \macros
+%D {setdimensionwithunit, freezedimensionwithunit}
+%D
+%D The next assignments are all valid:
+%D
+%D \starttyping
+%D \setdimensionwithunit\scratchdimen{10} {cm}
+%D \setdimensionwithunit\scratchdimen{10cm}{cm}
+%D \setdimensionwithunit\scratchdimen{10cm}{}
+%D \freezedimensionwithunit\SomeWidth{\textwidth}
+%D \freezedimensionwithunit\SomeDepth{\dp\strutbox}
+%D \stoptyping
+%D
+%D As an alternative for the next macro we can use a global
+%D assignment inside a box. The \type{\empty}'s permits
+%D gobbling while preventing spurious \type{\relax}'s.
+
+\def\setdimensionwithunit#1#2#3% number unit dimension / nice trick
+ {\afterassignment\gobblefourarguments#1=#2#3pt\relax\empty\empty\empty\empty}
+
+\def\freezedimensionwithunit#1#2%
+ {\setdimensionwithunit\scratchdimen#1{#2}\edef#1{\the\scratchdimen}}
+
+%D \macros
+%D {doifsometokselse}
+%D
+%D Not that fast I guess, but here's a way to test for token
+%D registers being empty.
+
+\def\doifsometokselse#1% % #2#3%
+ {\edef\!!stringa{\the#1}%
+ \ifx\!!stringa\empty % #3\else#2\fi}
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {startstrictinspectnextcharacter}
+%D
+%D This one if for Taco's bibliography module:
+
+\let\normalinspectnextcharacter\inspectnextcharacter
+
+\def\strictinspectnextcharacter% no user macro !
+ {\ifx\nexttoken\charactertoken
+ \expandafter\!!stringa
+ \else
+ \expandafter\!!stringb
+ \fi}
+
+% better: push/pop
+
+\def\startstrictinspectnextcharacter
+ {\let\inspectnextcharacter\strictinspectnextcharacter}
+
+\def\stopstrictinspectnextcharacter
+ {\let\inspectnextcharacter\normalinspectnextcharacter}
+
+\def\strictdoifnextoptionalelse#1#2%
+ {\startstrictinspectnextcharacter
+ \doifnextcharelse[{\stopstrictinspectnextcharacter#1}{\stopstrictinspectnextcharacter#2}}
+
+%D \macros
+%D {gobblespacetokens}
+%D
+%D This macro needs a speed-up!
+
+%\def\gobblespacetokens
+% {\doifnextcharelse\empty\donothing\donothing} % no {}\do\do !
+
+\def\gobblespacetokens
+ {\afterassignment\nexttoken\let\nexttoken=}
+
+%D \macros
+%D {verbatimargument}
+%D
+%D As the name says, this macro converts its argument to a
+%D (rather safe) string.
+
+\def\verbatimstring#1%
+ {\convertargument#1\to\ascii\ascii}
+
+%D These are needed in ordinal number conversions:
+
+\def\lastdigit#1%
+ {\@EA\thelastdigit\number#1\relax}
+
+\def\thelastdigit#1#2%
+ {\ifx#2\relax#1\else\@EA\thelastdigit\@EA#2\fi}
+
+\def\lasttwodigits#1%
+ {\@EA\thelasttwodigits\@EA0\number#1\relax}
+
+\def\thelasttwodigits#1#2#3% 0 dig ... \relax
+ {\ifx#3\relax#1#2\else\@EA\thelasttwodigits\@EA#2\@EA#3\fi}
+
+%D \macros
+%D {serializecommalist}
+%D
+%D Concatenate commalists:
+
+\def\serializecommalist[#1]%
+ {\let\serializedcommalist\empty
+ \def\docommand##1{\edef\serializedcommalist{\serializedcommalist##1}}%
+ \processcommacommand[#1]\docommand}
+
+%D \macros
+%D {purenumber}
+%D
+%D Sometimes we need control over when \TEX\ stops reading a
+%D number, especially in full expandable macros where using
+%D \type {\relax} would lead to disasters.
+%D
+%D \starttyping
+%D \ifodd\purenumber{...}\space ... \else ... \fi
+%D \stoptyping
+%D
+%D Here we use a space as number delimiter in combination
+%D with a space- and relax-less \type {\purenumber}. This
+%D macro works ok with \type {\the}, \type {\number} as well
+%D as \ETEX's \type {\numexpr}.
+
+\def\purenumber#1{\@EA\firstofoneargument\@EA{\number#1}}
+
+%D \macros
+%D {filterfromvalue}
+%D
+%D \starttyping
+%D \setvalue{xx}{{A}{B}{C}}
+%D
+%D \filterfromvalue{xx}{3}{3}
+%D \filterfromvalue{xx}{3}{2}
+%D \filterfromvalue{xx}{3}{1}
+%D \stoptyping
+%D
+%D An alternative is to store 'max' in the list, say:
+%D
+%D \starttyping
+%D \setvalue{xx}{3{A}{B}{C}}
+%D
+%D \filterfromvalues{3}{xx}{3}
+%D \filterfromvalues{3}{xx}{2}
+%D \filterfromvalues{3}{xx}{1}
+%D \stoptyping
+%D
+%D I'll implement this when I'm in \quotation {writing dirty
+%D macros mood}.
+
+\def\dofilterfromstr#1#2% max n
+ {\ifcase#1\or
+ \ifcase#2\or
+ \strippedcsname\firstofoneargument
+ \else
+ \strippedcsname\gobbleoneargument
+ \fi
+ \or
+ \ifcase#2\or
+ \strippedcsname\firstoftwoarguments
+ \or
+ \strippedcsname\secondoftwoarguments
+ \else
+ \strippedcsname\gobbletwoarguments
+ \fi
+ \or
+ \ifcase#2\or
+ \strippedcsname\firstofthreearguments
+ \or
+ \strippedcsname\secondofthreearguments
+ \or
+ \strippedcsname\thirdofthreearguments
+ \else
+ \strippedcsname\gobblethreearguments
+ \fi
+ \or
+ \ifcase#2\or
+ \strippedcsname\firstoffourarguments
+ \or
+ \strippedcsname\secondoffourarguments
+ \or
+ \strippedcsname\thirdoffourarguments
+ \or
+ \strippedcsname\fourthoffourarguments
+ \else
+ \strippedcsname\gobblefourarguments
+ \fi
+ \or
+ \ifcase#2\or
+ \strippedcsname\firstoffivearguments
+ \or
+ \strippedcsname\secondoffivearguments
+ \or
+ \strippedcsname\thirdoffivearguments
+ \or
+ \strippedcsname\fourthoffivearguments
+ \or
+ \strippedcsname\fifthoffivearguments
+ \else
+ \strippedcsname\gobblefivearguments
+ \fi
+ \fi}
+
+\def\filterfromvalue#1#2#3% value max n
+ {\@EA\@EAEAEA\csname % we use the fact that an
+ \@EA\ifx\csname#1\endcsname\relax % undefined cs has become \relax
+ \strippedcsname\gobbleoneargument % which we then gobble here
+ \else
+ \dofilterfromstr{#2}{#3}%
+ \fi
+ \endcsname\csname#1\endcsname}
+
+\def\filterfromnext#1#2% max n {..}{..}{..}{..}
+ {\csname\dofilterfromstr{#1}{#2}\endcsname}
+
+%D \macros
+%D {definemeasure}
+%D
+%D \starttyping
+%D \definemeasure[mywidth][\dimexpr(\textwidth-1cm)]
+%D
+%D ... \measure{mywidth} ...
+%D \stoptyping
+
+\def\??dm{@@dm} % brrr
+
+\def\definemeasure
+ {\dodoubleargument\dodefinemeasure}
+
+\def\dodefinemeasure[#1][#2]%
+ {\setvalue{\??dm#1}{#2}}
+
+% #2 could be omitted, but we want to support spaces
+%
+% \setmeasure {x} {1cm}
+% \setmeasure {xx} {1cm}
+% \setmeasure {xxx}{1cm}
+
+\def\setmeasure #1#2{\setvalue{\??dm#1}{#2}} % quick way
+\def\setemeasure#1#2{\setevalue{\??dm#1}{#2}} % quick way
+\def\setgmeasure#1#2{\setgvalue{\??dm#1}{#2}} % quick way
+\def\setxmeasure#1#2{\setxvalue{\??dm#1}{#2}} % quick way
+
+\def\measure#1%
+ {\ifcsname\??dm#1\endcsname\csname\??dm#1\endcsname\else\zeropoint\fi}
+
+%D \macros
+%D {doifdimensionelse}
+%D
+%D This is a dirty one: we simply append a unit and discard it when needed.
+
+\def\doifdimensionelse#1%
+ {\afterassignment\dodoifdimensionelse\scratchdimen#1pt\relax}
+
+\def\dodoifdimensionelse#1%
+ {\ifx#1\relax
+ \expandafter\secondoftwoarguments
+ \else % #1=p ... t\relax
+ \expandafter\thirdoffourarguments
+ \fi}
+
+%D \macros
+%D {comparedimension,comparedimensioneps}
+%D
+%D This is a dirty one: we simply append a unit and discard it when needed.
+
+\newdimen\roundingeps \roundingeps=10sp
+
+\def\comparedimension#1#2%
+ {\chardef\compresult
+ \ifdim#1<#2%
+ \zerocount
+ \else\ifdim#1<#2%
+ \plusone
+ \else
+ \plustwo
+ \fi\fi}
+
+\beginETEX
+
+\def\comparedimensioneps#1#2%
+ {\chardef\compresult
+ \ifdim\dimexpr(#1-#2)<\roudingeps
+ \zerocount
+ \else\ifdim\dimexpr(#2-#1)<\roudingeps
+ \zerocount
+ \else\ifdim#1<#2%
+ \plusone
+ \else
+ \plustwo
+ \fi\fi\fi}
+
+\endETEX
+
+\beginTEX
+
+\newdimen\comparedimen
+
+\def\comparedimensioneps#1#2%
+ {\comparedimen#1\advance\comparedimen-#2\relax
+ \chardef\compresult
+ \ifdim\comparedimen<\roudingeps
+ \zerocount
+ \else\ifdim-\comparedimen<\roudingeps
+ \zerocount
+ \else\ifdim#1<#2%
+ \plusone
+ \else
+ \plustwo
+ \fi\fi\fi}
+
+\endTEX
+
+\protect \endinput
diff --git a/tex/context/base/syst-fnt.mkii b/tex/context/base/syst-fnt.mkii
new file mode 100644
index 000000000..66439c194
--- /dev/null
+++ b/tex/context/base/syst-fnt.mkii
@@ -0,0 +1,46 @@
+%D \module
+%D [ file=syst-fnt,
+%D version=2006.08.11,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Font Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% formal names cf the tb \& tbt
+
+\unprotect
+
+\def\fontslantperpoint {\fontdimen\plusone }
+\def\fontinterwordspace {\fontdimen\plustwo }
+\def\fontinterwordstretch{\fontdimen\plusthree}
+\def\fontinterwordshrink {\fontdimen\plusfour }
+\def\fontexheight {\fontdimen\plusfive }
+\def\fontemwidth {\fontdimen\plussix }
+\def\fontextraspace {\fontdimen\plusseven}
+
+\def\slantperpoint {\fontdimen\plusone \font}
+\def\interwordspace {\fontdimen\plustwo \font}
+\def\interwordstretch {\fontdimen\plusthree\font}
+\def\interwordshrink {\fontdimen\plusfour \font}
+\def\exheight {\fontdimen\plusfive \font}
+\def\emwidth {\fontdimen\plussix \font}
+\def\extraspace {\fontdimen\plusseven\font}
+
+\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}
+
+\def\mathstacktotal {\dimexpr\fontdimen10\scriptfont\plustwo+\fontdimen12\scriptfont\plustwo\relax}
+\def\mathstackvgap {\plusthree\fontdimen8\scriptfont\plusthree}
+
+\protect \endinput
diff --git a/tex/context/base/syst-fnt.mkiv b/tex/context/base/syst-fnt.mkiv
new file mode 100644
index 000000000..8ba0dd2a3
--- /dev/null
+++ b/tex/context/base/syst-fnt.mkiv
@@ -0,0 +1,46 @@
+%D \module
+%D [ file=syst-fnt,
+%D version=2006.08.11,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Font Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% formal names cf the tb \& tbt
+
+\unprotect
+
+\def\fontslantperpoint {\fontdimen\plusone }
+\def\fontinterwordspace {\fontdimen\plustwo }
+\def\fontinterwordstretch{\fontdimen\plusthree}
+\def\fontinterwordshrink {\fontdimen\plusfour }
+\def\fontexheight {\fontdimen\plusfive }
+\def\fontemwidth {\fontdimen\plussix }
+\def\fontextraspace {\fontdimen\plusseven}
+
+\def\slantperpoint {\fontdimen\plusone \font}
+\def\interwordspace {\fontdimen\plustwo \font}
+\def\interwordstretch {\fontdimen\plusthree\font}
+\def\interwordshrink {\fontdimen\plusfour \font}
+\def\exheight {\fontdimen\plusfive \font}
+\def\emwidth {\fontdimen\plussix \font}
+\def\extraspace {\fontdimen\plusseven\font}
+
+\def\mathsupdisplay {\fontdimen13 } % to be remapped
+\def\mathsupnormal {\fontdimen14 } % to be remapped
+\def\mathsupcramped {\fontdimen15 } % to be remapped
+\def\mathsubnormal {\fontdimen16 } % to be remapped
+\def\mathsubcombined {\fontdimen17 } % to be remapped
+\def\mathaxisheight {\fontdimen22 } % to be remapped
+
+\def\currentspaceskip {\interwordspace\!!plus\interwordstretch\!!minus\interwordshrink\relax}
+
+\def\mathstacktotal {\dimexpr\Umathstacknumup\scriptstyle+\Umathstackdenomdown\scriptstyle\relax}
+\def\mathstackvgap {\Umathstackvgap\scriptstyle}
+
+\protect \endinput
diff --git a/tex/context/base/syst-gen.mkii b/tex/context/base/syst-gen.mkii
new file mode 100644
index 000000000..0367ba4fd
--- /dev/null
+++ b/tex/context/base/syst-gen.mkii
@@ -0,0 +1,4454 @@
+%D \module
+%D [ file=syst-gen,
+%D version=1996.03.20,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=General,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% nagaan : \ifinstringelse in syst-ext.tex
+% do => p! dodo pp! dododo ppp!
+% todo: \donetrue etc local maken
+
+%D The following macros are responsible for the interaction
+%D with \CONTEXT. These macros have proven their use. These
+%D macros are optimized as far as possible within of course,
+%D the know how of the author.
+%D
+%D In this module we also show some of the optimizations,
+%D mainly because we don't want to forget them and start doing
+%D things over and over again. If showing them has a learing
+%D effect for others too, we've surved another purpose too.
+
+%D \macros
+%D {abortinputifdefined}
+%D
+%D Because this module can be used in a different context, we
+%D want to prevent it being loaded more than once. This can be
+%D done using:
+%D
+%D \starttyping
+%D \abortinputifdefined\command
+%D \stoptyping
+%D
+%D where \type{\command} is a command defined in the module
+%D to be loaded only once.
+%D
+%D \starttyping
+%D \def\abortinputifdefined#1%
+%D {\ifx#1\undefined
+%D \let\next=\relax
+%D \else
+%D \let\next=\endinput
+%D \fi
+%D \next}
+%D \stoptyping
+%D
+%D This macro can be speed up in terms of speed as well as
+%D memory. Because this is a nice example of a bit strange
+%D command (\type{\endinput}), we spend some more lines on this.
+%D
+%D If we perform such actions directly, we can say:
+%D
+%D \starttyping
+%D \ifx\somecommand\undefined
+%D \let\next=\relax
+%D \else
+%D \let\next=\endinput
+%D \fi
+%D \next
+%D \stoptyping
+%D
+%D We need the \type{\next} because we need to end the
+%D \type{\fi}. The efficient one is:
+%D
+%D \starttyping
+%D \ifx\somecommand\undefined
+%D \else
+%D \expandafter\endinput
+%D \fi
+%D \stoptyping
+%D
+%D Because \type{\endinput} comes into action after the current
+%D line, we can also say:
+%D
+%D \starttyping
+%D \ifx\somecommand\undefined \else \endinput \fi
+%D \stoptyping
+%D
+%D When we define a macro, we tend to use a format which
+%D shows as besat as can how things are done. \TEX\ however
+%D stores the definitions as a sequence of tokens, so in fact
+%D we can use a formatted definition:
+
+\def\abortinputifdefined#1%
+ {\ifx#1\undefined \else
+ \endinput
+ \fi}
+
+%D which also works. Keep in mind that this is entirely due to
+%D the fact that \type{\endinput} after the line, i.e. at the
+%D end of the macro. We therefore can burry this primitive quite
+%D deep in code.
+
+%D And because this module implements \type{\writestatus}, we
+%D just say:
+
+% \abortinputifdefined\writestatus
+
+%D \macros
+%D {overloaded, superseded, forwarded, predefined}
+%D
+%D This prefix is used as signal for the \CONTEXT\ dependency
+%D checking features. The first four prefixes don't do anything
+%D useful, apart from signaling parsers.
+
+\def\overloaded{} % local change at the macro level
+\def\superseded{} % global change at the module level, replaces previous definitions
+\def\predefined{} % defined (first) here, but may be redefined anytime (no need for \overloaded)
+\def\forwarded {} % definition at the module level, only done when undefined
+
+\def\forwarded#1#2{\ifx#2\undefined\else\expandafter\gobbleforwarded\fi#1#2}
+
+\def\gobbleforwarded#1
+ {}
+
+%D Normally we tell the users what module is being loaded.
+%D However, the command that is needed for this is not yet
+%D defined.
+%D
+%D \starttyping
+%D \writestatus{laden}{Context Systeem Macros (a)}
+%D \stoptyping
+
+%D The next few macros are needed in case this module is
+%D used outside \CONTEXT.
+
+\ifx\beginTEX\undefined
+ \let\beginTEX\relax\let\endTEX\relax
+ \long\def\beginETEX #1\endETEX {}
+\fi
+
+%D \macros
+%D [protecting]
+%D {protect,unprotect}
+%D
+%D We can shield macros from users by using some special
+%D characters in their names. Some characters that are normally
+%D no letters and therefore often used are: \type{@}, \type{!}
+%D and \type{?}. Before and after the definition of protected
+%D macros, we have to change the \CATCODE\ of these characters.
+%D This is done by \type{\unprotect} and \type{\protect}, for
+%D instance:
+%D
+%D \starttyping
+%D \unprotect
+%D \def\!test{test}
+%D \protect
+%D \stoptyping
+%D
+%D The defined command \type{\!test} can of course only be
+%D called upon when we are in the \type{\unprotect}'ed state,
+%D otherwise \TEX\ reads \type{\!} and probably complains
+%D loudly about not being in math mode.
+%D
+%D Both commands can be used nested, but only the \CATCODE\
+%D of the outermost level is saved. We make use of
+%D an auxilary macro \type{\doprotect} to prevent us from
+%D conflicts with existing macro's \type{\protect}. When
+%D nesting deeper than one level, the system shows the
+%D protection level.
+
+\ifx\protectionlevel\undefined \newcount\protectionlevel \fi
+
+\ifx\protect\undefined
+ \def\protect{\writestatus{protection}{too much protection}}
+\else
+ % a simple version is already defined
+\fi
+
+\let\normalprotect\protect % only for latex
+
+%D Although we don't need the \type{%} after commands that
+%D don't take arguments, unless lines are obeyed, I decided
+%D to put it there as a reminder. I only mention this once.
+
+\ifx\unprotect\undefined
+
+ \chardef\protectionthreshold=10
+
+ \def\saveprotectedcharacters
+ {\edef\doprotectcharacters
+ {\catcode`\noexpand @\the\catcode`@
+ \catcode`\noexpand !\the\catcode`!
+ \catcode`\noexpand ?\the\catcode`? }}
+
+ \def\setprotectedcharacters
+ {\catcode`@=11
+ \catcode`!=11
+ \catcode`?=11 }
+
+ \def\unprotect
+ {\ifcase\protectionlevel
+ \saveprotectedcharacters
+ \let\protect\doprotect
+ \fi
+ \setprotectedcharacters
+ \advance\protectionlevel 1
+ \ifnum\protectionlevel>\protectionthreshold
+ \reportunprotection
+ \fi}
+
+ \def\doprotect
+ {\ifcase\protectionlevel\or
+ \doprotectcharacters
+ \let\doprotectcharacters\relax
+ \let\protect\normalprotect
+ \fi
+ \ifnum\protectionlevel>\protectionthreshold
+ \reportprotection
+ \fi
+ \advance\protectionlevel -1 }
+
+ \def\reportunprotection {\writestatus{protection}{unprotect \protectionstate}}
+ \def\reportprotection {\writestatus{protection}{protect \protectionstate}}
+ \def\reportprotectionstate{\writestatus{protection}{state \protectionstate}}
+
+ \def\protectionstate
+ {\the\protectionlevel
+ \ifcase\protectionthreshold
+ :\space
+ @=\the\catcode`@\space\space
+ !=\the\catcode`!\space\space
+ ?=\the\catcode`?%
+ \fi}
+
+ \ifx\everyeof\undefined
+ \let\checkprotection\relax
+ \else
+ \def\checkprotection{\everyeof{\writestatus{protection}{state: \protectionstate}}}
+ \fi
+
+\else
+
+ \let\reportprotectionstate\relax
+
+\fi
+
+%D Now it is defined, we can make use of this very useful
+%D macro.
+
+\unprotect
+
+%D \macros
+%D {@@escape,@@begingroup,@@endgroup,@@mathshift,@@alignment,
+%D @@endofline,@@parameter,@@superscript,@@subscript,
+%D @@ignore,@@space,@@letter,@@other,@@active,@@comment}
+%D
+%D In \CONTEXT\ we sometimes manipulate the \CATCODES\ of
+%D certain characters. Because we are not that good at numbers,
+%D we introduce some symbolic names.
+
+\chardef\@@escape = 0
+\chardef\@@begingroup = 1
+\chardef\@@endgroup = 2
+\chardef\@@mathshift = 3
+\chardef\@@alignment = 4
+\chardef\@@endofline = 5
+\chardef\@@parameter = 6
+\chardef\@@superscript = 7
+\chardef\@@subscript = 8
+\chardef\@@ignore = 9
+\chardef\@@space = 10
+\chardef\@@letter = 11
+\chardef\@@other = 12 \chardef\other = 12
+\chardef\@@active = 13 \chardef\active = 13
+\chardef\@@comment = 14
+
+%D \macros
+%D {normalspace}
+%D
+%D We often need a space as defined in \PLAIN\ \TEX. Because
+%D we cannot be sure of \type{\space} is redefined, we define:
+
+\def\normalspace{ }
+
+%D \macros
+%D {scratchcounter,
+%D scratchdimen,scratchskip,scratchmuskip,
+%D scratchbox,
+%D scratchtoks}
+%D
+%D Because we often need counters on a temporary basis, we
+%D define the \COUNTER\ \type{\scratchcounter}. This is a
+%D real \COUNTER, and not a pseudo one, as we will meet
+%D further on. We also define some other scratch registers.
+
+\chardef\newabovelimit=20
+
+\def\stripnewabove#1%
+ {\ifnum10<9#1 #1\else\expandafter\stripnewabove\fi}%
+
+\def\newabove#1#2% \dimen \name
+ {#1#2%
+ \ifnum\expandafter\stripnewabove\meaning#2>\newabovelimit\else
+ \expandafter\newabove\expandafter#1\expandafter#2%
+ \fi}
+
+\newabove \newcount \scratchcounter \newabove \newcount \globalscratchcounter
+\newabove \newdimen \scratchdimen \newabove \newdimen \globalscratchdimen
+\newabove \newskip \scratchskip \newabove \newskip \globalscratchskip
+\newabove \newmuskip \scratchmuskip \newabove \newmuskip \globalscratchmuskip
+\newabove \newtoks \scratchtoks \newabove \newtoks \globalscratchtoks
+ \newbox \scratchbox \newbox \globalscratchbox
+
+\newdimen\scratchdimenone \newbox\scratchboxone \newcount\scratchcounterone
+\newdimen\scratchdimentwo \newbox\scratchboxtwo \newcount\scratchcountertwo
+
+%D \macros
+%D {ifdone}
+
+\newif\ifdone
+
+%D \macros
+%D {ifCONTEXT}
+%D
+%D In the system and support modules we sometimes show examples
+%D that make use of core commands. We can skip those parts of
+%D the documentation when we use another macropackage. Of
+%D course we default to false.
+
+\newif \ifCONTEXT
+
+%D \macros
+%D {!!count, !!toks, !!dimen, !!box,
+%D !!width, !!height, !!depth, !!string, !!done}
+%D
+%D We define some more \COUNTERS\ and \DIMENSIONS. We also
+%D define some shortcuts to the local scatchregisters~0, 2, 4,
+%D 6 and~8.
+
+\newcount\!!counta \toksdef\!!toksa=0 \dimendef\!!dimena= 0 \chardef\!!boxa =0
+\newcount\!!countb \toksdef\!!toksb=2 \dimendef\!!dimenb= 2 \chardef\!!boxb =2
+\newcount\!!countc \toksdef\!!toksc=4 \dimendef\!!dimenc= 4 \chardef\!!boxc =4
+\newcount\!!countd \toksdef\!!toksd=6 \dimendef\!!dimend= 6 \chardef\!!boxd =6
+\newcount\!!counte \toksdef\!!tokse=8 \dimendef\!!dimene= 8 \chardef\!!boxe =8
+\newcount\!!countf \dimendef\!!dimenf=10 %skipdef\!!skipa=0
+ \dimendef\!!dimeng=12 %skipdef\!!skipb=2
+ \dimendef\!!dimenh=14 %skipdef\!!skipc=4
+ \dimendef\!!dimeni=16 %skipdef\!!skipd=6
+ \dimendef\!!dimenj=18 %skipdef\!!skipe=8
+ \dimendef\!!dimenk=20 %skipdef\!!skipf=10
+
+\let\!!stringa\empty \let\!!stringb\empty \let\!!stringc\empty
+\let\!!stringd\empty \let\!!stringe\empty \let\!!stringf\empty
+
+\newdimen\!!widtha \newdimen\!!heighta \newdimen\!!deptha
+\newdimen\!!widthb \newdimen\!!heightb \newdimen\!!depthb
+\newdimen\!!widthc \newdimen\!!heightc \newdimen\!!depthc
+
+\newif\if!!donea \newif\if!!doneb \newif\if!!donec
+\newif\if!!doned \newif\if!!donee \newif\if!!donef
+
+\ifx\data\undefined \else \let\data \relax \fi % dep checker
+
+%D Beware: we don't reuse plain counters, too dangerous
+%D when <= 20 (e.g. in supp-pdf this messed up things).
+
+\ifx\undefined\zeroskip \newskip \zeroskip \fi
+\ifx\undefined\zeropoint \newdimen \zeropoint \fi
+\ifx\undefined\zerocount \newcount \zerocount \fi
+\ifx\undefined\minusone \newcount \minusone \fi \minusone = -1
+\ifx\undefined\minustwo \newcount \minustwo \fi \minustwo = -2
+\ifx\undefined\plusone \chardef \plusone = 1 \fi
+\ifx\undefined\plustwo \chardef \plustwo = 2 \fi
+\ifx\undefined\plusthree \chardef \plusthree = 3 \fi
+\ifx\undefined\plusfour \chardef \plusfour = 4 \fi
+\ifx\undefined\plusfive \chardef \plusfive = 5 \fi
+\ifx\undefined\plusten \mathchardef \plusten = 10 \fi
+\ifx\undefined\plushundred \mathchardef \plushundred = 100 \fi
+\ifx\undefined\plusthousand \mathchardef \plusthousand = 1000 \fi
+\ifx\undefined\plustenthousand \mathchardef \plustenthousand = 10000 \fi
+\ifx\undefined\plustwentythousand \mathchardef \plustwentythousand = 20000 \fi
+
+%D \macros
+%D {s!,c!,e!,p!,v!,@@,??}
+%D
+%D To save memory, we use constants (sometimes called
+%D variables). Redefining these constants can have desastrous
+%D results.
+
+\def\v!prefix! {v!} \def\c!prefix! {c!}
+\def\s!prefix! {s!} \def\p!prefix! {p!}
+
+\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}
+
+\def\s!empty {empty}
+
+%D \macros
+%D {@EA,@EAEA,@EAEAEA,@EAEAEAEAEAEA,expanded,startexpanded}
+%D
+%D When in unprotected mode, to be entered with
+%D \type{\unprotect}, one can use \type{\@EA} as equivalent
+%D of \type{\expandafter}.
+
+\let\@NX\noexpand
+\let\@EA\expandafter
+
+\def\@EAEA {\expandafter\expandafter}
+\def\@EAEAEA{\expandafter\expandafter\expandafter}
+
+\def\@EAEAEAEAEAEA{\expandafter\@EAEAEA\expandafter}
+
+%D Sometimes we pass macros as arguments to commands that
+%D don't expand them before interpretation. Such commands can
+%D be enclosed with \type{\expanded}, like:
+%D
+%D \starttyping
+%D \expanded{\setupsomething[\alfa]}
+%D \stoptyping
+%D
+%D Such situations occur for instance when \type{\alfa} is a
+%D commalist or when data stored in macros is fed to index of
+%D list commands. If needed, one should use \type{\noexpand}
+%D inside the argument. Later on we will meet some more clever
+%D alternatives to this command.
+
+\long\def\@@expanded{} % always long; global (less restores)
+
+\long\def\expanded#1%
+ {\long\xdef\@@expanded{\noexpand#1}\@@expanded}
+
+%D Beware, the next one has no \type {\noexpand} before its
+%D argument.
+
+\long\def\startexpanded#1\stopexpanded % see x-fo for example
+ {\long\xdef\@@expanded{#1}\@@expanded}
+
+%D \macros
+%D {safeexpanded,everysafeexpanded}
+%D
+%D In addition we provide:
+
+\newtoks\everysafeexpanded
+
+\long\def\safeexpanded#1% why the \noexpand
+ {\begingroup
+ \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#1}%
+ \endgroup
+ \@@expanded}
+
+\def\safeedef#1#2%
+ {\begingroup
+ \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#2}%
+ \endgroup
+ \let#1\@@expanded}
+
+\def\safexdef#1#2%
+ {\begingroup
+ \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#2}%
+ \endgroup
+ \global\let#1\@@expanded}
+
+%D You can append protective measures to the token register if
+%D needed, as we will do later.
+
+%D \macros
+%D {expandoneargafter,expandtwoargsafter}
+%D
+%D These two commands make macros more readable by hiding a
+%D lot of \type {\expandafter}'s. They expand the arguments
+%D after the first command.
+%D
+%D \starttyping
+%D \expandoneargafter \command{\abc}
+%D \expandtwoargsafter\command{\abc}{\def}
+%D \stoptyping
+%D
+%D These commands expect the arguments to be macros.
+
+\def\expandoneargafter #1{\@EA#1\@EA}
+\def\expandtwoargsafter#1#2{\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA}
+
+%D These two do a full expansion:
+
+\def\fullexpandoneargafter #1#2{\long\xdef\@@expanded{\noexpand#1{#2}}\@@expanded}
+\def\fullexpandtwoargsafter#1#2#3{\long\xdef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
+
+%D \macros
+%D {gobbleoneargument,gobble...arguments}
+%D
+%D The next set of macros just do nothing, except that they
+%D get rid of a number of arguments.
+
+\long\def\gobbleoneargument #1{}
+\long\def\gobbletwoarguments #1#2{}
+\long\def\gobblethreearguments #1#2#3{}
+\long\def\gobblefourarguments #1#2#3#4{}
+\long\def\gobblefivearguments #1#2#3#4#5{}
+\long\def\gobblesixarguments #1#2#3#4#5#6{}
+\long\def\gobblesevenarguments #1#2#3#4#5#6#7{}
+\long\def\gobbleeightarguments #1#2#3#4#5#6#7#8{}
+\long\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{}
+\long\def\gobbletenarguments #1{\gobbleninearguments}
+
+%D \macros
+%D {doifnextcharelse}
+%D
+%D When we started using \TEX\ in the late eighties, our
+%D first experiences with programming concerned a simple shell
+%D around \LATEX. The commands probably use most at \PRAGMA,
+%D are the itemizing ones. One of those few shell commands took
+%D care of an optional argument, that enabled us to specify
+%D what kind of item symbol we wanted. Without understanding
+%D anything we were able to locate a \LATEX\ macro that could
+%D be used to inspect the next character.
+%D
+%D It's this macro that the ancester of the next one presented
+%D here. It executes one of two actions, dependant of the next
+%D character. Disturbing spaces and line endings, which are
+%D normally interpreted as spaces too, are skipped.
+%D
+%D \starttyping
+%D \doifnextcharelse {karakter} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This macro differs from the original in the use of \type
+%D {\localnext} because we don't want clashes with \type
+%D {\next}.
+
+\long\def\doifnextcharelse#1#2#3% #1 should not be {} !
+ {\let\charactertoken=#1% = needed here
+ \def\!!stringa{#2}%
+ \def\!!stringb{#3}%
+ \futurelet\nexttoken\inspectnextcharacter}
+
+\def\inspectnextcharacter
+ {\ifx\nexttoken\blankspace
+ \@EA\reinspectnextcharacter
+ \else\ifx\nexttoken\charactertoken
+ \@EAEAEA\!!stringa
+ \else
+ \@EAEAEA\!!stringb
+ \fi\fi}
+
+%D Because we will mostly use this macro for testing if the next
+%D character is \type {[}, we also make a slightly faster variant
+%D as it is not uncommon to have tens of thousands of calls to this
+%D test in a run. Of course it also is more convenient to read a
+%D trace then.
+
+\let\nextoptionalcharactertoken=[
+
+\long\def\doifnextoptionalelse#1#2%
+ {\def\nextoptionalcommandyes{#1}%
+ \def\nextoptionalcommandnop{#2}%
+ \futurelet\nexttoken\inspectnextoptionalcharacter}
+
+\def\inspectnextoptionalcharacter
+ {\ifx\nexttoken\blankspace
+ \@EA\reinspectnextoptionalcharacter
+ \else\ifx\nexttoken\nextoptionalcharactertoken
+ \@EAEAEA\nextoptionalcommandyes
+ \else
+ \@EAEAEA\nextoptionalcommandnop
+ \fi\fi}
+
+\let\nextbgroupcharactertoken\bgroup
+
+\long\def\doifnextbgroupelse#1#2%
+ {\def\nextbgroupcommandyes{#1}%
+ \def\nextbgroupcommandnop{#2}%
+ \futurelet\nexttoken\inspectnextbgroupcharacter}
+
+\def\inspectnextbgroupcharacter
+ {\ifx\nexttoken\blankspace
+ \@EA\reinspectnextbgroupcharacter
+ \else\ifx\nexttoken\nextbgroupcharactertoken
+ \@EAEAEA\nextbgroupcommandyes
+ \else
+ \@EAEAEA\nextbgroupcommandnop
+ \fi\fi}
+
+%D This macro uses some auxiliary macros. Although we were able
+%D to program quite complicated things, I only understood these
+%D after rereading the \TEX book. The trick is in using a
+%D command with a one character name. Such commands differ from
+%D the longer ones in the fact that trailing spaces are {\em
+%D not} skipped. This enables us to indirectly define a long
+%D named macro that gobbles a space.
+%D
+%D In the first line we define \type{\blankspace}. Next we
+%D make \type{\:} equivalent to \type{\reinspect...}. This
+%D one||character command is expanded before the next
+%D \type{\def} comes into action. This way the space after
+%D \type{\:} becomes a delimiter of the longer named
+%D \type{\reinspectnextcharacter}. The chain reaction is
+%D visually compatible with the next sequence:
+%D
+%D \starttyping
+%D \expandafter\def\reinspectnextcharacter %
+%D {\futurelet\nexttoken\inspectnextcharacter}
+%D \stoptyping
+%D
+%D However complicated it may look, I'm still glad I stumbled
+%D into this construction. Saving and restoring \type {\:} is
+%D needed when we use \PPCHTEX\ in \LATEX.
+
+\let\next\:
+
+\def\:{\let\blankspace= } \:
+
+\def\:{\reinspectnextcharacter}
+\expandafter\def\: {\futurelet\nexttoken\inspectnextcharacter}
+
+\def\:{\reinspectnextoptionalcharacter}
+\expandafter\def\: {\futurelet\nexttoken\inspectnextoptionalcharacter}
+
+\def\:{\reinspectnextbgroupcharacter}
+\expandafter\def\: {\futurelet\nexttoken\inspectnextbgroupcharacter}
+
+\let\:\next
+
+%D \macros
+%D {setvalue,setgvalue,setevalue,setxvalue,
+%D letvalue,
+%D getvalue,
+%D resetvalue}
+%D
+%D \TEX's primitive \type{\csname} can be used to construct
+%D all kind of commands that cannot be defined with
+%D \type{\def} and \type{\let}. Every macro programmer sooner
+%D or later wants macros like these.
+%D
+%D \starttyping
+%D \setvalue {name}{...} = \def\name{...}
+%D \setgvalue {name}{...} = \gdef\name{...}
+%D \setevalue {name}{...} = \edef\name{...}
+%D \setxvalue {name}{...} = \xdef\name{...}
+%D \letvalue {name}=\... = \let\name=\...
+%D \letgvalue {name}=\... = \global\let\name=\...
+%D \getvalue {name} = \name
+%D \resetvalue {name} = \def\name{}
+%D \stoptyping
+%D
+%D As we will see, \CONTEXT\ uses these commands many times,
+%D which is mainly due to its object oriented and parameter
+%D driven character.
+
+\def\setvalue #1{\expandafter \def\csname#1\endcsname}
+\def\setgvalue #1{\expandafter\gdef\csname#1\endcsname}
+\def\setevalue #1{\expandafter\edef\csname#1\endcsname}
+\def\setxvalue #1{\expandafter\xdef\csname#1\endcsname}
+\def\getvalue #1{\csname#1\endcsname}
+\def\letvalue #1{\expandafter\let\csname#1\endcsname}
+\def\letgvalue #1{\global\expandafter\let\csname#1\endcsname}
+\def\resetvalue #1{\expandafter\let\csname#1\endcsname\empty}
+\def\ignorevalue#1#2{\expandafter\let\csname#1\endcsname\empty}
+
+%D \macros
+%D {globallet,glet}
+%D
+%D In \CONTEXT\ of May 2000 using \type {\globallet}
+%D instead of the two tokens will save us some
+%D $300\times4=1200$ bytes of format file on a 32~bit
+%D system. So:
+
+\def\globallet{\global\let} \let\glet\globallet
+
+%D \macros
+%D {donottest,unexpanded}
+%D
+%D When expansion of a macro gives problems, we can precede it
+%D by \type{\donottest}. It seems that protection is one of the
+%D burdens of developers of packages, so maybe that's why in
+%D \ETEX\ protection is solved in a more robust way.
+%D
+%D Sometimes prefixing the macro with \type{\donottest} leads
+%D to defining an auxiliary macro, like
+%D
+%D \starttyping
+%D \def\dosomecommand {... ... ...}
+%D \def\somecommand {\donottest\dosomecommand}
+%D \stoptyping
+%D
+%D This double definition can be made transparant by using
+%D \type{\unexpanded}, as in:
+%D
+%D \starttyping
+%D \unexpanded\def\somecommand{... ... ...}
+%D \stoptyping
+%D
+%D The protection mechanism uses:
+
+\beginTEX
+
+\def\dontprocesstest#1{==}
+\def\doprocesstest #1{#1}
+
+\let\donottest=\doprocesstest
+
+\endTEX
+
+\beginETEX \detokenize
+
+\def\donottest#1{#1} % {\detokenize{#1}}
+
+\endETEX
+
+%D By the way, we use a placeholder because we don't want
+%D interference when testing on empty strings. Using a
+%D placeholder of 8~characters increases the processing time
+%D of simple \type{\doifelse} tests by about 10 \%. When we
+%D process the test, we have to remove the braces and
+%D therefore explictly gobble \type{#1}.
+
+%D \macros
+%D {honorunexpanded,forceunexpanded}
+%D
+%D The fact that many macros have the same prefix, could have
+%D a negative impact on searching in the hash table. Because
+%D some simple testing does not show differences, we just use:
+%D
+%D \starttyping
+%D \def\unexpanded#1#2%
+%D {\@EA#1\@EA#2\@EA{\@EA\donottest\csname\s!do\string#2\endcsname}%
+%D \@EA#1\csname\s!do\string#2\endcsname}
+%D \stoptyping
+%D
+%D Well, in fact we use the bit more versatile alternative. The
+%D \type {\honorunexpanded} can be used to \type {\string}
+%D the protected command, which by the way is seldom needed
+%D in \CONTEXT.
+
+\beginTEX
+
+\def\dosetunexpanded#1#2%
+ {\@EA#1\@EA{\@EA#2\@EA}%
+ \@EA{\@EA\donottest\csname\s!do\@EA\string\csname#2\endcsname\endcsname}%
+ \@EA#1\@EA{\@EA\s!do\@EA\string\csname#2\endcsname}}
+
+\def\docomunexpanded#1#2%
+ {\@EA#1\@EA#2\@EA{\@EA\donottest\csname\s!do\string#2\endcsname}%
+ \@EA#1\csname\s!do\string#2\endcsname}
+
+\def\unexpanded#1%
+ {\def\dounexpanded
+ {\ifx\next\bgroup
+ \@EA\dosetunexpanded
+ \else
+ \@EA\docomunexpanded
+ \fi#1}%
+ \futurelet\next\dounexpanded}
+
+\def\honorunexpanded% for writing to a file or message
+ {\def\donottest##1{\expandafter\gobblethreearguments\string##1}}
+
+\def\forceunexpanded% for preventing expansion in \xdef
+ {\def\donottest##1%
+ {\expandafter\noexpand\csname\expandafter\gobblefourarguments\string##1\endcsname}}
+
+\def\resetunexpanded%
+ {\let\donottest\doprocesstest}
+
+\endTEX
+
+\beginETEX \protected
+
+\let \unexpanded \normalprotected
+\let \honorunexpanded \empty % \relax
+\let \forceunexpanded \empty % \relax
+\let \resetunexpanded \empty % \relax
+
+\endETEX
+
+%D This one accepts the more direct \type{\def} and cousins
+%D as well as the \CONTEXT\ specific \type{\setvalue} ones.
+%D
+%D And so the definition in our example turns out to be:
+%D
+%D \starttyping
+%D \def\csname do\somecommand\endcsname{... ... ...}
+%D \def\somecommand{\donottest\csname do\somecommand\endcsname}
+%D \stoptyping
+%D
+%D In which \type{do\somecommand} is hidden from the user and
+%D cannot lead to confusion. It's still permitted to define
+%D auxiliary macros like \type{\dosomecommand}.
+%D
+%D When we are going to use e-\TEX, we'll probably end up
+%D redefining some commands, but we can probably keep the
+%D \type{\unexpanded} ones unchanged.
+
+%D \macros
+%D {doifundefined,doifdefined,
+%D doifundefinedelse,doifdefinedelse,
+%D doifalldefinedelse}
+%D
+%D The standard way of testing if a macro is defined is
+%D comparing its meaning with another undefined one, usually
+%D \type{\undefined}. To garantee correct working of the next
+%D set of macros, \type{\undefined} may never be defined!
+%D
+%D \starttyping
+%D \doifundefined {string} {...}
+%D \doifdefined {string} {...}
+%D \doifundefinedelse {string} {then ...} {else ...}
+%D \doifdefinedelse {string} {then ...} {else ...}
+%D \doifalldefinedelse {commalist} {then ...} {else ...}
+%D \stoptyping
+%D
+%D Every macroname that \TEX\ builds gets an entry in the hash
+%D table, which is of limited size. It is expected that e-\TeX\
+%D will offer a less memory||consuming alternative.
+
+%D Although it will probably never be a big problem, it is good
+%D to be aware of the difference between testing on a macro
+%D name to be build by using \type{\csname} and
+%D \type{\endcsname} and testing the \type{\name} directly.
+%D
+%D \starttyping
+%D \expandafter\ifx\csname NameA\endcsname\relax ... \else ... \fi
+%D
+%D \ifx\NameB\undefined ... \else ... \fi
+%D \stoptyping
+%D
+%D I became aware of this when I mistakenly testen the first
+%D one against \type{\undefined}. When \TEX\ build a name using
+%D \type{\csname} it automatically sets it to \type{\relax},
+%D which is definitely not the same as \type{\undefined}. The
+%D quickest way to check these things is asking \TEX\ to show
+%D the meaning of the names:
+%D
+%D \starttyping
+%D \expandafter\show\csname NameA\endcsname
+%D
+%D \show\NameB
+%D \stoptyping
+%D
+%D The main reason why this never will be a big problem is that
+%D when one uses the \type{\csname} way, one probably has to do
+%D with some macroname that always is dealt with that way.
+%D Confusion can however arise when one applies both testing
+%D methods to the same macroname. By the way, the assignment
+%D of \type{\relax} obeys grouping.
+
+%D The first one gets rid of \type{#1}, but still expands to
+%D something and the second one expands to \type{#1}. Because
+%D we accept arguments between \type{{}}, we have to get rid
+%D of one level of braces.
+%D
+%D Our first implementation of \type{\ifundefined} was
+%D straightforward and readable:
+%D
+%D \starttyping
+%D \def\ifundefined#1%
+%D {\expandafter\ifx\csname#1\endcsname\relax}%
+%D
+%D \def\doifundefinedelse#1#2#3%
+%D {\let\donottest=\dontprocesstest
+%D \ifundefined{#1}%
+%D \let\donottest=\doprocesstest#2%
+%D \else
+%D \let\donottest=\doprocesstest#3%
+%D \fi}
+%D
+%D \def\doifdefinedelse#1#2#3%
+%D {\doifundefinedelse{#1}{#3}{#2}}
+%D
+%D \def\doifundefined#1#2%
+%D {\doifundefinedelse{#1}{#2}{}}
+%D
+%D \def\doifdefined#1#2%
+%D {\doifundefinedelse{#1}{}{#2}}
+%D
+%D \def\doifalldefinedelse#1#2#3%
+%D {\begingroup
+%D \donetrue
+%D \def\checkcommand##1%
+%D {\doifundefined{##1}{\donefalse}}%
+%D \processcommalist[#1]\checkcommand
+%D \ifdone
+%D \endgroup#2%
+%D \else
+%D \endgroup#3%
+%D \fi}
+%D \stoptyping
+%D
+%D When this module was optimized, timing showed that the
+%D next alternative can be upto twice as fast, especially when
+%D longer arguments are used. Watch how we reach over the
+%D \type {\else} and \type {\fi}: this way they cannot get
+%D into the way (and we can avoid those \type {\next}
+%D hacks); I started using this method after I did some
+%D speed optimization tests in the xtag modules; the
+%D efficiency of such hacks depends on the length of the
+%D argument etc. etc.)
+
+\beginTEX
+
+\def\ifundefined#1%
+ {\expandafter\ifx\csname#1\endcsname\relax}
+
+\def\p!doifundefined#1%
+ {\let\donottest\dontprocesstest
+ \expandafter\ifx\csname#1\endcsname\relax}
+
+\def\doifundefinedelse#1%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest\@EA\firstoftwoarguments
+ \else
+ \let\donottest\doprocesstest\@EA\secondoftwoarguments
+ \fi}
+
+\def\doifdefinedelse#1%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest\@EA\secondoftwoarguments
+ \else
+ \let\donottest\doprocesstest\@EA\firstoftwoarguments
+ \fi}
+
+\def\doifundefined#1%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest\@EA\firstofoneargument
+ \else
+ \let\donottest\doprocesstest\@EA\gobbleoneargument
+ \fi}
+
+\def\doifdefined#1%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest\@EA\gobbleoneargument
+ \else
+ \let\donottest\doprocesstest\@EA\firstofoneargument
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\ifundefined#1% ongelukkige naam
+ {\unless\ifcsname#1\endcsname}
+
+\def\p!doifundefined#1%
+ {\edef\p!defined{#1}%
+ \unless\ifcsname\detokenize\@EA{\p!defined}\endcsname}
+
+\def\doifundefinedelse#1%
+ {\edef\p!defined{#1}%
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\doifdefinedelse#1%
+ {\edef\p!defined{#1}%
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifundefined#1%
+ {\edef\p!defined{#1}%
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\doifdefined#1%
+ {\edef\p!defined{#1}%
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\endETEX
+
+%D \macros
+%D {letbeundefined}
+%D
+%D Testing for being undefined comes down to testing on \type
+%D {\relax} when we use \type {\csname}, but when using \type
+%D {\ifx}, we test on being \type {\undefined}! In \ETEX\ we
+%D have \type {\ifcsname} and that way of testing on existance
+%D is not the same as the one described here. Therefore we
+%D introduce:
+
+\beginTEX
+
+\def\letbeundefined#1%
+ {\expandafter\let\csname#1\endcsname\relax}
+
+\endTEX
+
+\beginETEX \undefined
+
+\def\letbeundefined#1% potential stack buildup when used \global
+ {\expandafter\let\csname#1\endcsname\undefined}
+
+\def\localundefine#1% conditional
+ {\ifcsname#1\endcsname\expandafter\let\csname#1\endcsname\undefined\fi}
+\def\globalundefine#1% conditional
+ {\ifcsname#1\endcsname\expandafter\global\let\csname#1\endcsname\undefined\fi}
+
+\endETEX
+
+%D Beware, being \type {\undefined} in \ETEX\ means that the macro
+%D {\em is} defined!
+
+%D Before we start using this variant, we used another one,
+%D which is even a bit faster. This one looked like:
+%D
+%D \starttyping
+%D \def\p!doifundefined%
+%D {\begingroup
+%D \let\donottest=\dontprocesstest
+%D \ifundefined}
+%D
+%D \def\doifundefinedelse#1#2#3%
+%D {\p!doifundefined{#1}%
+%D \endgroup#2%
+%D \else
+%D \endgroup#3%
+%D \fi}
+%D \stoptyping
+%D
+%D A even more previous version used \type{\bgroup} and
+%D \type {\egroup}. In math mode however, \type{$1{x}2$} differs
+%D from \type{$1x2$}. This can been seen when one compares the
+%D output of:
+%D
+%D \starttyping
+%D $\kern10pt\showthe\lastkern$
+%D $\kern10pt{\showthe\lastkern}$
+%D $\kern10pt\begingroup\showthe\lastkern\endgroup$
+%D \stoptyping
+%D
+%D Also in math mode, one can better use \type {\begingroup}
+%D and companion instead of \type {\bgroup}.
+%D
+%D When we were developing the scientific units module, we
+%D encountered different behavior in text and math mode, which
+%D was due to this grouping subtilities. We therefore decided
+%D to use \type{\begingroup} instead of \type{\bgroup}.
+%D Later, when we had optimized some macro's the grouped
+%D solution turned out to be unsafe when typesetting this
+%D documentation, especially when using \type{\globaldefs}.
+%D
+%D We still have to define \type{\doifalldefinedelse}. Watch
+%D the use of grouping, which garantees local use of the
+%D boolean \type{\ifdone}.
+
+\beginTEX
+
+\def\docheckonedefined#1%
+ {\ifundefined{#1}%
+ \donefalse
+ \fi}
+
+\def\doifalldefinedelse#1%
+ {\begingroup
+ \let\donottest\dontprocesstest
+ \donetrue
+ \processcommalist[#1]\docheckonedefined
+ \ifdone
+ \endgroup\let\donottest\doprocesstest
+ \expandafter\firstoftwoarguments
+ \else
+ \endgroup\let\donottest\doprocesstest
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\docheckonedefined#1%
+ {\unless\ifcsname#1\endcsname
+ \donefalse
+ \fi}
+
+\def\doifalldefinedelse#1%
+ {\begingroup
+ \donetrue \processcommalist[#1]\docheckonedefined
+ \ifdone
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+\endETEX
+
+%D \macros
+%D {doif,doifelse,doifnot,
+%D donottest}
+%D
+%D Programming in \TEX\ differs from programming in procedural
+%D languages like \MODULA. This means that one --- well, let me
+%D speek for myself --- tries to do the things in the well
+%D known way. Therefore the next set of \type{\ifthenelse}
+%D commands were between the first ones we needed. A few years
+%D later, the opposite became true: when programming in
+%D \MODULA, I sometimes miss handy things like grouping,
+%D runtime redefinition, expansion etc. While \MODULA\ taught
+%D me to structure, \TEX\ taught me to think recursive.
+%D
+%D \starttyping
+%D \doif {string1} {string2} {...}
+%D \doifnot {string1} {string2} {...}
+%D \doifelse {string1} {string2} {then ...}{else ...}
+%D \stoptyping
+%D
+%D When expansion gives problems, we can precede the
+%D troublemaker with \type{\donottest}.
+%D
+%D This implementatie does not use the construction which is
+%D more robust for nested conditionals.
+%D
+%D \starttyping
+%D \ifx\!!stringa\!!stringb
+%D \def\next{#3}%
+%D \else
+%D \def\next{#4}%
+%D \fi
+%D \next
+%D \stoptyping
+%D
+%D In practice, this alternative is at least 20\% slower than
+%D the alternative used here. The few cases in which we
+%D really need the \type{\next} construction, often need some
+%D other precautions and or adaptions too.
+
+\beginTEX
+
+% \long\def\doif#1#2#3%
+% {\let\donottest\dontprocesstest
+% \edef\!!stringa{#1}%
+% \edef\!!stringb{#2}%
+% \let\donottest\doprocesstest
+% \ifx\!!stringa\!!stringb
+% #3%
+% \fi}
+%
+% \long\def\doifnot#1#2#3%
+% {\let\donottest\dontprocesstest
+% \edef\!!stringa{#1}%
+% \edef\!!stringb{#2}%
+% \let\donottest\doprocesstest
+% \ifx\!!stringa\!!stringb
+% \else
+% #3%
+% \fi}
+%
+% \long\def\doifelse#1#2#3#4%
+% {\let\donottest\dontprocesstest
+% \edef\!!stringa{#1}%
+% \edef\!!stringb{#2}%
+% \let\donottest\doprocesstest
+% \ifx\!!stringa\!!stringb
+% #3%
+% \else
+% #4%
+% \fi}
+
+%D Slightly faster on big arguments, as well as \type
+%D {\next} avoiding:
+
+\long\def\doif#1#2%
+ {\let\donottest\dontprocesstest
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifnot#1#2%
+ {\let\donottest\dontprocesstest
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\!!stringb
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+
+\long\def\doifelse#1#2%
+ {\let\donottest\dontprocesstest
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\endTEX
+
+\beginETEX \protected
+
+% \long\def\doif#1#2#3%
+% {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+% \ifx\!!stringa\!!stringb#3\fi}
+%
+% \long\def\doifnot#1#2#3%
+% {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+% \unless\ifx\!!stringa\!!stringb#3\fi}
+%
+% \long\def\doifelse#1#2#3#4%
+% {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+% \ifx\!!stringa\!!stringb#3\else#4\fi}
+
+%D Slightly faster on big arguments, as well as \type
+%D {\next} avoiding:
+
+\long\def\doif#1#2%
+ {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifnot#1#2%
+ {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\long\def\doifelse#1#2%
+ {\edef\!!stringa{#1}\edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\endETEX
+
+%D One could wonder why we don't follow the the same approach
+%D as in \type{\doifdefined} c.s.\ and use \type{\begingroup}
+%D and \type{\endgroup}. In this case, this alternative is
+%D slower, which is probably due to the fact that more meanings
+%D need to be restored.
+%D
+%D The in terms of memory more efficient alternative using a
+%D auxiliary macro also proved to be slower, so we definitely
+%D did not choose for:
+%D
+%D \starttyping
+%D \def\p!doifelse#1#2%
+%D {\let\donottest=\dontprocesstest
+%D \edef\!!stringa{#1}%
+%D \edef\!!stringb{#2}%
+%D \let\donottest=\doprocesstest
+%D \ifx\!!stringa\!!stringb}
+%D
+%D \long\def\doif#1#2#3%
+%D {\p!doifelse{#1}{#2}#3\fi}
+%D
+%D \long\def\doifnot#1#2#3%
+%D {\p!doifelse{#1}{#2}\else#3\fi}
+%D
+%D \long\def\doifelse#1#2#3#4%
+%D {\p!doifelse{#1}{#2}#3\else#4\fi}
+%D \stoptyping
+%D
+%D Optimizations like this are related of course to the
+%D bottlenecks in \TEX. It seems that restoring saved meanings
+%D and passing arguments takes some time.
+
+%D \macros
+%D {doifempty,doifemptyelse,doifnotempty}
+%D
+%D We complete our set of conditionals with:
+%D
+%D \starttyping
+%D \doifempty {string} {...}
+%D \doifnotempty {string} {...}
+%D \doifemptyelse {string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D This time, the string is not expanded.
+
+\long\def\doifemptyelse#1%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\long\def\doifempty#1%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\long\def\doifnotempty#1%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+%D \macros
+%D {doifinset,doifnotinset,doifinsetelse}
+%D
+%D We can check if a string is present in a comma separated
+%D set of strings. Depending on the result, some action is
+%D taken.
+%D
+%D \starttyping
+%D \doifinset {string} {string,...} {...}
+%D \doifnotinset {string} {string,...} {...}
+%D \doifinsetelse {string} {string,...} {then ...} {else ...}
+%D \stoptyping
+%D
+%D The second argument is the comma separated set of strings.
+%D
+%D \starttyping
+%D \long\def\doifinsetelse#1#2#3#4%
+%D {\doifelse{#1}{}
+%D {#4}
+%D {\donefalse
+%D \def\p!checkiteminset##1%
+%D {\doif{#1}{##1}
+%D {\donetrue
+%D \let\p!checkiteminset=\gobbleoneargument}}%
+%D \processcommalist[#2]\p!checkiteminset
+%D \ifdone
+%D #3%
+%D \else
+%D #4%
+%D \fi}}
+%D
+%D \long\def\doifinset#1#2#3%
+%D {\doifinsetelse{#1}{#2}{#3}{}}
+%D
+%D \long\def\doifnotinset#1#2#3%
+%D {\doifinsetelse{#1}{#2}{}{#3}}
+%D \stoptyping
+%D
+%D Because this macro is called quite often we've spent some
+%D time optimizing it. This time, the gain in speed is due to
+%D (1)~defining an external auxiliary macro, (2)~not calling
+%D any other macros and (3)~minimizing the passing of
+%D arguments. The gain in speed is impressive.
+
+% \def\p!dodocheckiteminset#1%
+% {\edef\!!stringb{#1}%
+% \ifx\!!stringa\!!stringb
+% \donetrue
+% \let\p!docheckiteminset\gobbleoneargument
+% \fi}
+%
+% \beginTEX
+%
+% \def\p!doifinsetelse#1#2%
+% {\let\donottest\dontprocesstest
+% \donefalse
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\empty
+% \else
+% \let\p!docheckiteminset\p!dodocheckiteminset
+% \processcommalist[#2]\p!docheckiteminset
+% \fi
+% \let\donottest\doprocesstest
+% \ifdone}
+%
+% \endTEX
+%
+% \beginETEX \protected
+%
+% \def\p!doifinsetelse#1#2%
+% {\donefalse
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\empty
+% \else
+% \let\p!docheckiteminset\p!dodocheckiteminset
+% \processcommalist[#2]\p!docheckiteminset
+% \fi
+% \ifdone}
+%
+% \endETEX
+
+% then we had:
+%
+% \def\p!docheckiteminset#1%
+% {\edef\!!stringb{#1}%
+% \ifx\!!stringa\!!stringb
+% \donetrue
+% \expandafter\quitcommalist
+% \fi}
+%
+% \beginTEX
+%
+% \def\p!doifinsetelse#1#2%
+% {\let\donottest\dontprocesstest
+% \donefalse
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\empty
+% \else
+% \processcommalist[#2]\p!docheckiteminset
+% \fi
+% \let\donottest\doprocesstest
+% \ifdone}
+%
+% \endTEX
+%
+% % can be sped up with processnext...
+%
+% \beginETEX \protected
+%
+% \def\p!doifinsetelse#1#2%
+% {\donefalse
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\empty
+% \else
+% \processcommalist[#2]\p!docheckiteminset
+% \fi
+% \ifdone}
+%
+% \endETEX
+%
+% \long\def\doifinsetelse#1#2%
+% {\p!doifinsetelse{#1}{#2}%
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \long\def\doifinset#1#2%
+% {\p!doifinsetelse{#1}{#2}%
+% \expandafter\firstofoneargument
+% \else
+% \expandafter\gobbleoneargument
+% \fi}
+%
+% \long\def\doifnotinset#1#2%
+% {\p!doifinsetelse{#1}{#2}%
+% \expandafter\gobbleoneargument
+% \else
+% \expandafter\firstofoneargument
+% \fi}
+%
+% now we have
+
+\def\p!docheckiteminset#1%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringa\!!stringb
+ \donetrue
+ \expandafter\quitcommalist
+ \fi}
+
+\beginTEX
+
+\def\p!doifinsetelse#1#2#3#4%
+ {\let\donottest\dontprocesstest
+ \donefalse
+ \edef\!!stringa{#3}%
+ \ifx\!!stringa\empty
+ \else
+ \processcommalist[#4]\p!docheckiteminset
+ \fi
+ \let\donottest\doprocesstest
+ \ifdone\expandafter#1\else\expandafter#2\fi}
+
+\endTEX
+
+\beginETEX \protected
+
+\def\p!doifinsetelse#1#2#3#4%
+ {\donefalse
+ \edef\!!stringa{#3}%
+ \ifx\!!stringa\empty
+ \else
+ \processcommalist[#4]\p!docheckiteminset
+ \fi
+ \ifdone\expandafter#1\else\expandafter#2\fi}
+
+\endETEX
+
+\long\def\doifinsetelse
+ {\p!doifinsetelse\firstoftwoarguments\secondoftwoarguments}
+
+\long\def\doifinset
+ {\p!doifinsetelse\firstofoneargument\gobbleoneargument}
+
+\long\def\doifnotinset
+ {\p!doifinsetelse\gobbleoneargument\firstofoneargument}
+
+%D \macros
+%D {doifcommon,doifnotcommon,doifcommonelse}
+%D
+%D Probably the most time consuming tests are those that test
+%D for overlap in sets of strings.
+%D
+%D \starttyping
+%D \doifcommon {string,...} {string,...} {...}
+%D \doifnotcommon {string,...} {string,...} {...}
+%D \doifcommonelse {string,...} {string,...} {then ...} {else ...}
+%D \stoptyping
+%D
+%D We show the slower alternative first, because it shows us
+%D how things are done.
+%D
+%D \starttyping
+%D \long\def\doifcommonelse#1#2#3#4%
+%D {\donefalse
+%D \def\p!docommoncheck##1%
+%D {\def\p!dodocommoncheck####1%
+%D {\doif{####1}{##1}
+%D {\donetrue
+%D \def\commalistelement{##1}%
+%D \let\p!docommoncheck=\gobbleoneargument
+%D \let\p!dodocommoncheck=\gobbleoneargument}}%
+%D \processcommalist[#2]\p!dodocommoncheck}%
+%D \processcommalist[#1]\p!docommoncheck
+%D \ifdone
+%D #3%
+%D \else
+%D #4%
+%D \fi}
+%D
+%D \long\def\doifcommon#1#2#3%
+%D {\doifcommonelse{#1}{#2}{#3}{}}
+%D
+%D \long\def\doifnotcommon#1#2#3%
+%D {\doifcommonelse{#1}{#2}{}{#3}}
+%D \stoptyping
+%D
+%D The processing time is shortened by getting the auxiliary
+%D macro to the outermost level and using less \type{\edef}'s.
+%D Sometimes it makes more sence to define local macro's not
+%D only because this way we can be sure that they are not
+%D redefined, but also because it shows the dependance. In
+%D compiled languages, this is no problem at all. It can even
+%D save us bytes and processing time. In interpreted languages
+%D like \TEX\ it nearly always slows down processing.
+
+% \def\p!dododocommoncheck#1%
+% {\edef\!!stringb{#1}%
+% \ifx\!!stringa\!!stringb
+% \donetrue
+% \let\p!docommoncheck\gobbleoneargument
+% \let\p!dodocommoncheck\gobbleoneargument
+% \fi}
+%
+% \beginTEX
+%
+% \def\p!doifcommonelse#1#2%
+% {\donefalse
+% \let\donottest\dontprocesstest
+% \let\p!dodocommoncheck\p!dododocommoncheck
+% \def\p!docommoncheck##1%
+% {\edef\!!stringa{##1}%
+% \def\commalistelement{##1}%
+% \processcommalist[#2]\p!dodocommoncheck}%
+% \processcommalist[#1]\p!docommoncheck
+% \let\donottest\doprocesstest
+% \ifdone}
+%
+% \endTEX
+%
+% \beginETEX \protected
+%
+% \def\p!doifcommonelse#1#2%
+% {\donefalse
+% \let\p!dodocommoncheck\p!dododocommoncheck
+% \def\p!docommoncheck##1%
+% {\edef\!!stringa{##1}%
+% \def\commalistelement{##1}%
+% \processcommalist[#2]\p!dodocommoncheck}%
+% \processcommalist[#1]\p!docommoncheck
+% \ifdone}
+%
+% \endETEX
+
+% \def\p!dodocommoncheck#1%
+% {\edef\!!stringb{#1}%
+% \ifx\!!stringa\!!stringb
+% \donetrue
+% \expandafter\quitprevcommalist
+% \fi}
+%
+% \beginTEX
+%
+% \def\p!doifcommonelse#1#2%
+% {\donefalse
+% \let\donottest\dontprocesstest
+% \def\p!docommoncheck##1%
+% {\edef\!!stringa{##1}%
+% \def\commalistelement{##1}% no let to stringa
+% \processcommalist[#2]\p!dodocommoncheck}%
+% \processcommalist[#1]\p!docommoncheck
+% \let\donottest\doprocesstest
+% \ifdone}
+%
+% \endTEX
+%
+% \beginETEX \protected
+%
+% \def\p!doifcommonelse#1#2%
+% {\donefalse
+% \def\p!docommoncheck##1%
+% {\edef\!!stringa{##1}%
+% \def\commalistelement{##1}%
+% \processcommalist[#2]\p!dodocommoncheck}%
+% \processcommalist[#1]\p!docommoncheck
+% \ifdone}
+%
+% \endETEX
+%
+% \long\def\doifcommonelse#1#2% % #3#4%
+% {\p!doifcommonelse{#1}{#2}% % #3\else#4\fi}
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \long\def\doifcommon#1#2%
+% {\p!doifcommonelse{#1}{#2}%
+% \expandafter\firstofoneargument
+% \else
+% \expandafter\gobbleoneargument
+% \fi}
+%
+% \long\def\doifnotcommon#1#2%
+% {\p!doifcommonelse{#1}{#2}%
+% \expandafter\gobbleoneargument
+% \else
+% \expandafter\firstofoneargument
+% \fi}
+
+% todo: use dedicated done
+
+\def\p!dodocommoncheck#1%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringa\!!stringb
+ \donetrue
+ \expandafter\quitprevcommalist
+ \fi}
+
+\beginTEX
+
+\def\p!doifcommonelse#1#2#3#4%
+ {\donefalse
+ \let\donottest\dontprocesstest
+ \def\p!docommoncheck##1%
+ {\edef\!!stringa{##1}%
+ \def\commalistelement{##1}% no let to stringa
+ \processcommalist[#4]\p!dodocommoncheck}%
+ \processcommalist[#3]\p!docommoncheck
+ \let\donottest\doprocesstest
+ \ifdone\expandafter#1\else\expandafter#2\fi}
+
+\endTEX
+
+\beginETEX \protected
+
+\def\p!doifcommonelse#1#2#3#4%
+ {\donefalse
+ \def\p!docommoncheck##1%
+ {\edef\!!stringa{##1}%
+ \def\commalistelement{##1}%
+ \processcommalist[#4]\p!dodocommoncheck}%
+ \processcommalist[#3]\p!docommoncheck
+ \ifdone\expandafter#1\else\expandafter#2\fi}
+
+\endETEX
+
+\def\doifcommonelse
+ {\p!doifcommonelse\firstoftwoarguments\secondoftwoarguments}
+
+\def\doifcommon
+ {\p!doifcommonelse\firstofoneargument \gobbleoneargument}
+
+\def\doifnotcommon
+ {\p!doifcommonelse\gobbleoneargument \firstofoneargument}
+
+%D \macros
+%D {processcommalist,processcommacommand,quitcommalist,
+%D processcommalistwithparameters}
+%D
+%D We've already seen some macros that take care of comma
+%D separated lists. Such list can be processed with
+%D
+%D \starttyping
+%D \processcommalist[string,string,...]\commando
+%D \stoptyping
+%D
+%D The user supplied command \type{\commando} receives one
+%D argument: the string. This command permits nesting and
+%D spaces after commas are skipped. Empty sets are no problem.
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1)}
+%D
+%D 1: \processcommalist [\hbox{$a,b,c,d,e,f$}] \dosomething \par
+%D 2: \processcommalist [{a,b,c,d,e,f}] \dosomething \par
+%D 3: \processcommalist [{a,b,c},d,e,f] \dosomething \par
+%D 4: \processcommalist [a,b,{c,d,e},f] \dosomething \par
+%D 5: \processcommalist [a{b,c},d,e,f] \dosomething \par
+%D 6: \processcommalist [{a,b}c,d,e,f] \dosomething \par
+%D 7: \processcommalist [] \dosomething \par
+%D 8: \processcommalist [{[}] \dosomething \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Before we show the result, we present the macro's:
+
+\newcount\commalevel
+
+\def\dododoprocesscommaitem
+ {\csname\s!next\the\commalevel\endcsname}
+
+%\def\dodoprocesscommaitem%
+% {\ifx\nexttoken\blankspace
+% \let\nextcommaitem\redoprocesscommaitem
+% \else\ifx\nexttoken]%
+% \let\nextcommaitem\gobbleoneargument
+% \else
+% \let\nextcommaitem\dododoprocesscommaitem
+% \fi\fi
+% \nextcommaitem}
+%
+% faster ?
+
+\def\dodoprocesscommaitem
+ {\ifx\nexttoken\blankspace
+ \@EA\redoprocesscommaitem
+ \else\ifx\nexttoken]%
+ \@EAEAEA\gobbleoneargument
+ \else
+ \@EAEAEA\dododoprocesscommaitem
+ \fi\fi}
+
+\def\doprocesscommaitem
+ {\futurelet\nexttoken\dodoprocesscommaitem}
+
+%D Empty arguments are not processed. Empty items (\type{,,})
+%D however are treated. We have to check for the special case
+%D \type{[{a,b,c}]}.
+%D
+%D \starttyping
+%D \def\processcommalist[%
+%D {\futurelet\nexttoken\docheckcommaitem}
+%D
+%D \def\docheckcommaitem%
+%D {\ifx\nexttoken]%
+%D \let\nextcommaitem\gobbletwoarguments
+%D \else\ifx\nexttoken\bgroup
+%D \let\nextcommaitem\doprocesscommalistA
+%D \else
+%D \let\nextcommaitem\doprocesscommalistB
+%D \fi\fi
+%D \nextcommaitem}
+%D
+%D \def\doprocesscommalistA#1#2]#3%
+%D {\global\advance\commalevel 1
+%D \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,%
+%D {#3{##1}\doprocesscommaitem}%
+%D \doprocesscommaitem{#1}#2,]\relax
+%D \global\advance\commalevel -1 }
+%D
+%D \def\doprocesscommalistB#1]#2%
+%D {\global\advance\commalevel 1
+%D \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,%
+%D {#2{##1}\doprocesscommaitem}%
+%D \doprocesscommaitem#1,]\relax
+%D \global\advance\commalevel -1 }
+%D \stoptyping
+%D
+%D However, this is not a the most straightforward solution!
+%D We can misuse one of \TEX's hidden features, and prepend
+%D and remove a \type {\relax}. By the way, although it
+%D involves less testing, this cleaner alternative is not
+%D faster.
+
+\def\processcommalist[%
+ {\futurelet\nexttoken\docheckcommaitem}
+
+\def\docheckcommaitem
+ {\ifx\nexttoken]%
+ \expandafter\gobblethreearguments
+ \else
+ \expandafter\doprocesscommalist
+ \fi
+ \relax} % this one preserved the next {}
+
+\def\doprocesscommalist#1]#2%
+ {\global\advance\commalevel \plusone
+ \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,%
+ {#2{##1}\doprocesscommaitem}%
+ \@EA\dodoprocesscommaitem\gobbleoneargument#1,]\relax
+ \global\advance\commalevel \minusone }
+
+%D One way of quitting a commalist halfway is:
+
+\def\quitcommalist
+ {\begingroup\let\doprocesscommaitem\doquitcommalist}
+
+\def\doquitcommalist#1]%
+ {\endgroup}
+
+\def\quitprevcommalist
+ {\begingroup\let\doprocesscommaitem\doquitprevcommalist}
+
+\def\doquitprevcommalist#1]%
+ {\let\doprocesscommaitem\doquitcommalist}
+
+%D The hack we used for checking the next character
+%D \type {\doifnextcharelse} is also used here.
+
+\def\:{\redoprocesscommaitem}
+
+\expandafter\def\: {\futurelet\nexttoken\dodoprocesscommaitem}
+
+%D The previous examples lead to:
+%D
+%D \getbuffer
+
+%D When a list is saved in a macro, we can use a construction
+%D like:
+%D
+%D \starttyping
+%D \expandafter\processcommalist\expandafter[\list]\command
+%D \stoptyping
+%D
+%D Such solutions suit most situations, but we wanted a bit
+%D more.
+%D
+%D \starttyping
+%D \processcommacommand[string,\stringset,string]\commando
+%D \stoptyping
+%D
+%D where \type{\stringset} is a predefined set, like:
+%D
+%D \starttyping
+%D \def\first{aap,noot,mies}
+%D \def\second{laatste}
+%D
+%D \processcommacommand[\first]\message
+%D \processcommacommand[\first,second,third]\message
+%D \processcommacommand[\first,between,\second]\message
+%D \stoptyping
+%D
+%D Commands that are part of the list are expanded, so the
+%D use of this macro has its limits.
+
+\def\processcommacommand[#1]%
+ {\expanded{\processcommalist[#1]}}
+
+%D The argument to \type{\command} is not delimited. Because
+%D we often use \type{[]} as delimiters, we also have:
+%D
+%D \starttyping
+%D \processcommalistwithparameters[string,string,...]\command
+%D \stoptyping
+%D
+%D where \type{\command} looks like:
+%D
+%D \starttyping
+%D \def\command[#1]{... #1 ...}
+%D \stoptyping
+
+\def\processcommalistwithparameters[#1]#2%
+ {\def\docommand##1{#2[##1]}%
+ \processcommalist[#1]\docommand}
+
+%D \macros
+%D {processaction,
+%D processfirstactioninset,
+%D processallactionsinset}
+%D
+%D \CONTEXT\ makes extensive use of a sort of case or switch
+%D command. Depending of the presence of one or more provided
+%D items, some actions is taken. These macros can be nested
+%D without problems.
+%D
+%D \starttyping
+%D \processaction [x] [a=>\a,b=>\b,c=>\c]
+%D \processfirstactioninset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \processallactionsinset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \stoptyping
+%D
+%D We can supply both a \type{default} action and an action
+%D to be undertaken when an \type{unknown} value is met:
+%D
+%D \starttyping
+%D \processallactionsinset
+%D [x,y,z]
+%D [ a=>\a,
+%D b=>\b,
+%D c=>\c,
+%D default=>\default,
+%D unknown=>\unknown{... \commalistelement ...}]
+%D \stoptyping
+%D
+%D When \type{#1} is empty, this macro scans list \type{#2} for
+%D the keyword \type{default} and executed the related action
+%D if present. When \type{#1} is non empty and not in the list,
+%D the action related to \type{unknown} is executed. Both
+%D keywords must be at the end of list \type{#2}. Afterwards,
+%D the actually found keyword is available in
+%D \type{\commalistelement}. An advanced example of the use of
+%D this macro can be found in \PPCHTEX, where we completely
+%D rely on \TEX\ for interpreting user supplied keywords like
+%D \type{SB}, \type{SB1..6}, \type{SB125} etc.
+%D
+%D Even a quick glance at the macros below show some overlap,
+%D which means that more efficient alternatives are possible.
+%D Because these macro's are very sensitive to subtle changes,
+%D we've decided to present the readable originals first
+%D Maybe these these macros look complicated, but this is a
+%D direct result of the support of nesting. Protection is only
+%D applied in \type{\processaction}.
+%D
+%D \starttyping
+%D \newcount\processlevel
+%D
+%D \def\processaction[#1]#2[#3]%
+%D {\doifelse{#1}{}
+%D {\def\p!compareprocessaction[##1=>##2]%
+%D {\edef\!!stringa{##1}%
+%D \ifx\!!stringa\s!default
+%D \def\commalistelement{#1}%
+%D ##2%
+%D \fi}}
+%D {\let\donottest=\dontprocesstest
+%D \edef\!!stringb{#1}%
+%D \let\donottest=\doprocesstest
+%D \def\p!compareprocessaction[##1=>##2]%
+%D {\edef\!!stringa{##1}%
+%D \ifx\!!stringa\!!stringb
+%D \def\commalistelement{#1}%
+%D ##2%
+%D \let\p!doprocessaction=\gobbleoneargument
+%D \else\ifx\!!stringa\s!unknown
+%D \def\commalistelement{#1}%
+%D ##2%
+%D \fi\fi}}%
+%D \def\p!doprocessaction##1%
+%D {\p!compareprocessaction[##1]}%
+%D \processcommalist[#3]\p!doprocessaction}
+%D
+%D \def\processfirstactioninset[#1]#2[#3]%
+%D {\doifelse{#1}{}
+%D {\processaction[][#3]}
+%D {\def\p!compareprocessaction[##1=>##2][##3]%
+%D {\edef\!!stringa{##1}%
+%D \edef\!!stringb{##3}%
+%D \ifx\!!stringa\!!stringb
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \let\p!doprocessaction=\gobbleoneargument
+%D \let\p!dodoprocessaction=\gobbleoneargument
+%D \else\ifx\!!stringa\s!unknown
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \fi\fi}%
+%D \def\p!doprocessaction##1%
+%D {\def\p!dodoprocessaction####1%
+%D {\p!compareprocessaction[####1][##1]}%
+%D \processcommalist[#3]\p!dodoprocessaction}%
+%D \processcommalist[#1]\p!doprocessaction}}
+%D
+%D \def\processallactionsinset[#1]#2[#3]%
+%D {\doifelse{#1}{}
+%D {\processaction[][#3]}
+%D {\advance\processlevel by 1
+%D \def\p!compareprocessaction[##1=>##2][##3]%
+%D {\edef\!!stringa{##1}%
+%D \edef\!!stringb{##3}%
+%D \ifx\!!stringa\!!stringb
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \let\p!dodoprocessaction=\gobbleoneargument
+%D \else\ifx\!!stringa\s!unknown
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \fi\fi}%
+%D \setvalue{\s!do\the\processlevel}##1%
+%D {\def\p!dodoprocessaction####1%
+%D {\p!compareprocessaction[####1][##1]}%
+%D \processcommalist[#3]\p!dodoprocessaction}%
+%D \processcommalist[#1]{\getvalue{\s!do\the\processlevel}}%
+%D \advance\processlevel by -1 }}
+%D \stoptyping
+%D
+%D The gain of speed in the (again) next implementation is
+%D around 20\%, depending on the application.
+
+\newcount\processlevel
+
+\def\p!compareprocessactionA[#1=>#2][#3]%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\s!default
+ \let\commalistelement\empty
+ #2%
+ \fi}
+
+% \def\p!compareprocessactionB[#1=>#2][#3]%
+% {\expandedaction\!!stringb{#1}%
+% \ifx\!!stringa\!!stringb
+% \def\commalistelement{#3}%
+% #2%
+% \let\p!doprocessaction\gobbleoneargument
+% \else
+% \edef\!!stringb{#1}%
+% \ifx\!!stringb\s!unknown
+% \def\commalistelement{#3}% beware of loops
+% #2%
+% \fi
+% \fi}
+
+% met \quitcommalist tot meer dan 25\% sneller
+
+\def\p!compareprocessactionB[#1=>#2][#3]%
+ {\expandedaction\!!stringb{#1}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitcommalist
+ \else
+ \edef\!!stringb{#1}%
+ \ifx\!!stringb\s!unknown
+ \def\commalistelement{#3}% beware of loops
+ #2%
+ \fi
+ \fi}
+
+\beginTEX
+
+\def\processaction[#1]#2[#3]%
+ {\let\donottest\dontprocesstest
+ \expandedaction\!!stringa{#1}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\empty
+ \let\p!compareprocessaction\p!compareprocessactionA
+ \else
+ \let\p!compareprocessaction\p!compareprocessactionB
+ \fi
+ \def\p!doprocessaction##1%
+ {\p!compareprocessaction[##1][#1]}%
+ \processcommalist[#3]\p!doprocessaction
+ \expandactions}
+
+\endTEX
+
+\beginETEX \protected
+
+\def\processaction[#1]#2[#3]% faster version follows
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \let\p!compareprocessaction\p!compareprocessactionA
+ \else
+ \let\p!compareprocessaction\p!compareprocessactionB
+ \fi
+ \def\p!doprocessaction##1%
+ {\p!compareprocessaction[##1][#1]}%
+ \processcommalist[#3]\p!doprocessaction
+ \expandactions}
+
+\endETEX
+
+% \def\p!compareprocessactionC[#1=>#2][#3]%
+% {\expandedaction\!!stringa{#1}%
+% \expandedaction\!!stringb{#3}%
+% \ifx\!!stringa\!!stringb
+% \def\commalistelement{#3}%
+% #2%
+% \let\p!doprocessaction\gobbleoneargument
+% \let\p!dodoprocessaction\gobbleoneargument
+% \else
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\s!unknown
+% \def\commalistelement{#3}%
+% #2%
+% \fi
+% \fi}
+
+\def\p!compareprocessactionC[#1=>#2][#3]%
+ {\expandedaction\!!stringa{#1}%
+ \expandedaction\!!stringb{#3}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitprevcommalist
+ \else
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\def\processfirstactioninset[#1]#2[#3]% faster version follows
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \processaction[][#3]%
+ \else
+ \def\p!doprocessaction##1%
+ {\def\p!dodoprocessaction####1%
+ {\p!compareprocessactionC[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]\p!doprocessaction
+ \fi
+ \expandactions}
+
+% \def\p!compareprocessactionD[#1=>#2][#3]%
+% {\expandedaction\!!stringa{#1}%
+% \expandedaction\!!stringb{#3}%
+% \ifx\!!stringa\!!stringb
+% \def\commalistelement{#3}%
+% #2%
+% \let\p!dodoprocessaction\gobbleoneargument
+% \else
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\s!unknown
+% \def\commalistelement{#3}%
+% #2%
+% \fi
+% \fi}
+
+\def\p!compareprocessactionD[#1=>#2][#3]%
+ {\expandedaction\!!stringa{#1}%
+ \expandedaction\!!stringb{#3}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \expandafter\quitcommalist
+ \else
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\def\doprocessallactionsinset
+ {\csname\s!do\the\processlevel\endcsname}
+
+\def\processallactionsinset[#1]#2[#3]% faster version follows
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \processaction[][#3]%
+ \else
+ \advance\processlevel \plusone
+ \expandafter\def\csname\s!do\the\processlevel\endcsname##1%
+ {\def\p!dodoprocessaction####1%
+ {\p!compareprocessactionD[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]\doprocessallactionsinset
+ \advance\processlevel \minusone
+ \fi
+ \expandactions}
+
+%D We can speed up these macros a bit when we use a dedicated
+%D commalist processor, one that avoids passing the (often)
+%D big action list.
+
+\beginTEX
+
+\def\processaction[#1]#2[%
+ {\let\donottest\dontprocesstest
+ \expandedaction\!!stringa{#1}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\empty
+ \let\p!compareprocessaction\p!compareprocessactionA
+ \else
+ \let\p!compareprocessaction\p!compareprocessactionB
+ \fi
+ \def\p!doprocessaction##1%
+ {\p!compareprocessaction[##1][#1]}%
+ \processnextcommalist\relax\expandactions\p!doprocessaction[}
+
+\endTEX
+
+\beginETEX
+
+\def\processaction[#1]#2[%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \let\p!compareprocessaction\p!compareprocessactionA
+ \else
+ \let\p!compareprocessaction\p!compareprocessactionB
+ \fi
+ \def\p!doprocessaction##1%
+ {\p!compareprocessaction[##1][#1]}%
+ \processnextcommalist\relax\expandactions\p!doprocessaction[}
+
+\endETEX
+
+\def\processfirstactionsinset[#1]%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\processaction
+ \else
+ \expandafter\processfirstactionsinsetindeed
+ \fi
+ [#1]}
+
+\def\processfirstactioninsetindeed[#1]#2[#3]%
+ {\def\p!doprocessaction##1%
+ {\def\p!dodoprocessaction####1%
+ {\p!compareprocessactionC[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]\p!doprocessaction
+ \expandactions}
+
+\def\processallactionsinset[#1]%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \expandafter\processaction
+ \else
+ \expandafter\processallactionsinsetindeed
+ \fi
+ [#1]}
+
+\def\processallactionsinsetindeed[#1]#2[#3]%
+ {\advance\processlevel \plusone
+ \expandafter\def\csname\s!do\the\processlevel\endcsname##1%
+ {\def\p!dodoprocessaction####1%
+ {\p!compareprocessactionD[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]\doprocessallactionsinset
+ \advance\processlevel \minusone
+ \expandactions}
+
+\def\processnextcommalist#1#2#3[#4#5]%
+ {#1%
+ \let\nexttoken#4%
+ \global\advance\commalevel \plusone
+ \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,%
+ {#3{##1}\doprocesscommaitem}%
+ \dodoprocesscommaitem#4#5,]\relax
+ \global\advance\commalevel \minusone
+ #2}
+
+%D I do have an even faster version (saving 3 sec on a 13
+%D sec run for 50K invocations, but normally we don't have
+%D that many calls and that alternative uses more macros and is
+%D even less readable. What we did add, was \type {\@EA}, so
+%D that we can pass a command.
+
+%D \macros
+%D {unexpandedprocessaction,
+%D unexpandedprocessfirstactioninset,
+%D unexpandedprocessallactionsinset}
+%D
+%D Now what are those expansion commands doing there. Well,
+%D sometimes we want to compare actions that may consist off
+%D commands (i.e. are no constants). In such occasions we can
+%D use the a bit slower alternatives:
+
+\def\unexpandedprocessfirstactioninset{\dontexpandactions\processfirstactioninset}
+\def\unexpandedprocessaction {\dontexpandactions\processaction}
+\def\unexpandedprocessallactionsinset {\dontexpandactions\processallactionsinset}
+
+%D By default we expand actions:
+
+\def\expandactions{\let\expandedaction\edef} \expandactions
+
+%D But when needed we convert the strings to meaningful
+%D sequences of characters.
+
+\def\unexpandedaction#1>{}
+
+\def\noexpandedaction#1#2%
+ {\def\@@convertedargument{#2}%
+ \@EA\edef\@EA#1\@EA{\@EA\unexpandedaction\meaning\@@convertedargument}}
+
+\def\dontexpandactions%
+ {\let\expandedaction\noexpandedaction}
+
+%D \macros
+%D {getfirstcharacter, firstcharacter, remainingcharacters, doiffirstcharacter}
+%D
+%D Sometimes the action to be undertaken depends on the
+%D next character. This macro get this character and puts it in
+%D \type{\firstcharacter}.
+%D
+%D \starttyping
+%D \getfirstcharacter {string}
+%D \stoptyping
+%D
+%D A two step expansion is used to prevent problems with
+%D complicated arguments, for instance arguments that
+%D consist of two or more expandable tokens.
+
+\def\dogetfirstcharacter#1#2\relax
+ {\def\firstcharacter{#1}%
+ \def\remainingcharacters{#2}}
+
+\def\getfirstcharacter#1%
+ {\edef\!!stringa{#1}%
+ \expandafter\dogetfirstcharacter\!!stringa\relax}
+
+\def\doiffirstcharelse#1#2% char string
+% kort (maar onleesbaar)
+% {\expanded{\dogetfirstcharacter#2}\\\doifelse{#1}\firstcharacter}
+% korter (en begrijpelijk))
+ {\getfirstcharacter{#2}\doifelse{#1}\firstcharacter}
+% snel (maar zelden gebruikt, dus niet zo belangrijk)
+% {\getfirstcharacter{#2}%
+% \edef\!!stringa{#1}%
+% \ifx\!!stringa\firstcharacter
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+
+%D \macros
+%D {doifinstringelse, doifincsnameelse}
+%D
+%D We can check for the presence of a substring in a given
+%D sequence of characters.
+%D
+%D \starttyping
+%D \doifinsetelse {substring} {string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D An application of this command can be found further on.
+%D Like before, we first show some alternatives, like the one
+%D we started with:
+%D
+%D \starttyping
+%D \long\def\p!doifinstringelse#1#2#3#4%
+%D {\def\pp!doifinstringelse##1#1##2##3\war%
+%D {\if##2@%
+%D #4%
+%D \else
+%D #3%
+%D \fi}%
+%D \pp!doifinstringelse#2#1@@\war}
+%D
+%D \def\doifinstringelse%
+%D {\ExpandBothAfter\p!doifinstringelse}
+%D \stoptyping
+%D
+%D After this we came to:
+%D
+%D \starttyping
+%D \def\p!doifinstringelse#1#2%
+%D {\def\pp!doifinstringelse##1#1##2##3\war%
+%D {\if##2@}%
+%D \pp!doifinstringelse#2#1@@\war}
+%D
+%D \def\doifinstringelse#1#2#3#4%
+%D {\ExpandBothAfter\p!doifinstringelse{#1}{#2}%
+%D #4%
+%D \else
+%D #3%
+%D \fi}
+%D \stoptyping
+%D
+%D Sometimes the second argument is passed as a macro. By
+%D postponing the expansion of this macro, we gain quite some
+%D run time, simply because the less tokens we pass, the faster
+%D \TEX\ runs. So finally the definition became:
+
+% \long\def\rawdoifinstringelse#1#2% ##2 can be {abc}
+% {\long\def\pp!doifinstringelse##1#1##2##3\war{\if##2@}%
+% \pp!doifinstringelse#2#1@@\war
+% \expandafter\secondoftwoarguments
+% \else
+% \expandafter\firstoftwoarguments
+% \fi}
+
+\long\def\doifinstringelse#1%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\thirdofthreearguments
+ \else
+ \@EA\dodoifinstringelse
+ \fi}
+
+\long\def\dodoifinstringelse#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\long\def\doifinstring#1%%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\gobbletwoarguments
+ \else
+ \@EA\dodoifinstring
+ \fi}
+
+\long\def\dodoifinstring#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
+ \fi}
+
+\long\def\doifnotinstring#1%%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\gobbletwoarguments
+ \else
+ \@EA\dodoifnotinstring
+ \fi}
+
+\long\def\dodoifnotinstring#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\gobbleoneargument
+ \else
+ \@EA\firstofoneargument
+ \fi}
+
+%D \starttyping
+%D \beginTEX
+%D
+%D \long\def\p!doifinstringelse#1#2%
+%D {\long\def\pp!doifinstringelse##1#1##2##3\war%
+%D {\csname if\if##2@fals\else tru\fi e\endcsname}%
+%D \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}} % expand #2 here
+%D
+%D \endTEX
+%D
+%D \beginETEX \unless
+%D
+%D \long\def\p!doifinstringelse#1#2%
+%D {\long\def\pp!doifinstringelse##1#1##2##3\war%
+%D {\unless\if##2@}%
+%D \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}} % expand #2 here
+%D
+%D \endETEX
+%D \stoptyping
+%D
+%D And then \unknown\ after a couple of years, we ran into a
+%D situation where \type {##2} was something \type {{bla}}. So
+%D finally we need to use an auxiliary macro, otherwise we get
+%D funny strings in the output.
+
+% \long\def\p!doifinstringelse#1#2% ##2 can be {abc}
+% {\long\@EA\def\@EA\pp!doifinstringelse\@EA##\@EA1#1##2##3\war % expand #1 here
+% {\ppp!doifinstringelse##2\war}%
+% \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}} % expand #2 here
+%
+% \beginTEX
+%
+% \def\ppp!doifinstringelse#1#2\war%
+% {\csname if\ifx#1@fals\else tru\fi e\endcsname}%
+%
+% \endTEX
+%
+% \beginETEX \unless
+%
+% \def\ppp!doifinstringelse#1#2\war%
+% {\unless\ifx#1@}
+%
+% \endETEX
+
+\beginETEX
+
+\long\def\p!doifinstringelse#1#2% ##2 can be {abc}
+ {\long\@EA\def\@EA\pp!doifinstringelse\@EA##\@EA1#1##2##3\war % expand #1 here
+ {\unless\if##2@}%
+% \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}} % expand #2 here
+ \expanded{\pp!doifinstringelse#2#1}@@\war} % expand #2 here
+
+\endETEX
+
+\beginTEX
+
+\long\def\p!doifinstringelse#1#2% ##2 can be {abc}
+ {\long\@EA\def\@EA\pp!doifinstringelse\@EA##\@EA1#1##2##3\war % expand #1 here
+ {\csname if\if##2@fals\else tru\fi e\endcsname}%
+ %\expanded{\pp!doifinstringelse#2#1@@\noexpand\war}} % expand #2 here
+ \expanded{\pp!doifinstringelse#2#1}@@\war} % expand #2 here
+
+\endTEX
+
+%D The next alternative proved to be upto twice as fast on
+%D tasks like checking reserved words in pretty verbatim
+%D typesetting! This is mainly due to the fact that passing
+%D (expanded) strings is much slower that passing a macro.
+%D
+%D \starttyping
+%D \doifincsnameelse {substring} {\string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D Where \type{\doifinstringelse} does as much expansion as
+%D possible, the latter alternative does minimal (one level)
+%D expansion.
+
+\beginTEX
+
+\long\def\p!doifincsnameelse#1#2%
+ {\long\def\pp!doifincsnameelse##1#1##2##3\war
+ {\csname if\if##2@fals\else tru\fi e\endcsname}%
+ \@EA\pp!doifincsnameelse#2#1@@\war}
+
+\endTEX
+
+\beginETEX \unless
+
+\long\def\p!doifincsnameelse#1#2%
+ {\long\def\pp!doifincsnameelse##1#1##2##3\war
+ {\unless\if##2@}%
+ \@EA\pp!doifincsnameelse#2#1@@\war}
+
+\endETEX
+
+\long\def\doifincsnameelse#1#2% % #3#4%
+ {\edef\@@@instring{#1}%
+ \@EA\p!doifincsnameelse\@EA{\@@@instring}{#2}% % #3\else#4\fi}
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D \macros
+%D {doifnumberelse}
+%D
+%D The next macro executes a command depending of the outcome
+%D of a test on numerals. This is probably one of the fastest
+%D test possible, exept from a less robust 10||step
+%D \type{\if}||ladder or some tricky \type{\lcode} checking.
+%D
+%D \starttyping
+%D \doifnumberelse {string} {then ...} {else ...}
+%D \stoptyping
+%D
+%D The macro accepts \type{123}, \type{abc}, \type{{}},
+%D \type{\getal} and \type{\the\count...}. This macro is a
+%D rather dirty one.
+%D
+%D \starttyping
+%D \long\def\doifnumberelse#1#2#3%
+%D {\begingroup\donefalse
+%D \ifcase1#1\or\or\or\or\or\or\or\or\or\else\donetrue\fi
+%D \ifdone\endgroup#2\else\endgroup#3\fi}
+%D \stoptyping
+%D
+%D Or better:
+%D
+%D \starttyping
+%D \long\def\doifnumberelse#1%
+%D {\begingroup\donefalse
+%D \ifcase1#1\or\or\or\or\or\or\or\or\or\else\donetrue\fi
+%D \ifdone
+%D \endgroup\expandafter\firstoftwoarguments
+%D \else
+%D \endgroup\expandafter\secondoftwoarguments
+%D \fi}
+%D \stoptyping
+%D
+%D A previous implementation was:
+%D
+%D \starttyping
+%D \long\def\doifnumberelse#1#2#3%
+%D {\getfirstcharacter{#1}%
+%D \@EA\p!doifinstringelse\@EA{\firstcharacter}{1234567890}%
+%D #2%
+%D \else
+%D #3%
+%D \fi}
+%D \stoptyping
+%D
+%D And before we had \type{\p!doifinstringelse} available, we
+%D used:
+%D
+%D \starttyping
+%D \def\doifnumberelse#1%
+%D {\getfirstcharacter{#1}%
+%D \rawdoifinsetelse{\firstcharacter}{1,2,3,4,5,6,7,8,9,0}}
+%D \stoptyping
+%D
+%D The implementation using \type {\ifcase} is much faster, but
+%D the next one is not, not even when testing milion calls.
+%D
+%D \starttyping
+%D \newif\ifitsanumber
+%D
+%D \long\def\isitanumber#1%
+%D {\itsanumberfalse
+%D \ifcase1#1\or\or\or\or\or\or\or\or\or\else\itsanumbertrue\fi}
+%D
+%D \long\def\doifnumberelse#1#2#3%
+%D {\isitanumber{#1}\ifitsanumber#2\else#3\fi}
+%D \stoptyping
+%D
+%D After a while the next evolved and this one is the one we
+%D will use. This one is some 5\% faster than the group/done
+%D one (partly because it does not have to pass arguments).
+%D Even more important is that this alternative is fully
+%D expandable!
+
+\long\def\doifnumberelse#1% does not accept counters
+ {\ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi\space
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+%D \macros
+%D {makerawcommalist,
+%D rawdoinsetelse,
+%D rawprocesscommalist,
+%D rawprocessaction}
+%D
+%D Some of the commands mentioned earlier are effective but
+%D slow. When one is desperately in need of faster alternatives
+%D and when the conditions are predictable safe, the \type{\raw}
+%D alternatives come into focus. A major drawback is that
+%D they do not take \type{\c!constants} into account, simply
+%D because no expansion is done. This is no problem with
+%D \type{\rawprocesscommalist}, because this macro does not
+%D compare anything. Expandable macros are permitted as search
+%D string.
+%D
+%D \starttyping
+%D \makerawcommalist[string,string,...]\stringlist
+%D \rawdoifinsetelse{string}{string,...}{...}{...}
+%D \rawprocesscommalist[string,string,...]\commando
+%D \rawprocessaction[x][a=>\a,b=>\b,c=>\c]
+%D \stoptyping
+%D
+%D Spaces embedded in the list, for instance after commas,
+%D spoil the search process. The gain in speed depends on the
+%D length of the argument (the longer the argument, the less
+%D we gain).
+%D
+%D The slow alternative looks like:
+%D
+%D \starttyping
+%D \def\makerawcommalist[#1]#2%
+%D {\def\appendtocommalist##1%
+%D {\doifelse{#2}{}
+%D {\edef#2{##1}}
+%D {\edef#2{#2,##1}}}%
+%D \def#2{}%
+%D \processcommalist[#1]\appendtocommalist}
+%D \stoptyping
+%D
+%D But we prefer:
+
+% \appendtocommalist is defined in syst-ext
+
+\def\makerawcommalist[#1]#2% use \processnext ... here
+ {\def\domakerawcommalist##1% we don't expand ##1
+ {\ifx#2\empty
+ \def#2{##1}%
+ \else
+ \@EA\def\@EA#2\@EA{#2,##1}%
+ \fi}%
+ \let#2\empty
+ \processcommalist[#1]\domakerawcommalist}
+
+\def\rawprocesscommaitem#1,#2% #2 eats up preceding space
+ {\if]#1\else
+ \csname\s!next\the\commalevel\endcsname{#1}%
+ \expandafter\rawprocesscommaitem
+ \fi#2}
+
+\def\rawprocesscommalist[#1]#2% accepteert ook [\cs]
+ {\global\advance\commalevel \plusone
+ \expandafter\let\csname\s!next\the\commalevel\endcsname#2%
+ \expandafter\rawprocesscommaitem#1,],% \relax
+ \global\advance\commalevel \minusone }
+
+\def\rawprocesscommacommand[#1]% not really needed
+ {\expanded{\rawprocesscommalist[#1]}}
+
+% \def\rawdoifinsetelse#1#2{\doifinstringelse{,#1,}{,#2,}}
+% \def\rawdoifinset #1#2{\doifinstring {,#1,}{,#2,}}
+
+\def\@@rawempty{,,}
+
+\long\def\rawdoifinsetelse#1%
+ {\edef\@@@instring{,#1,}% expand #1 here
+ \ifx\@@@instring\@@rawempty
+ \@EA\thirdofthreearguments
+ \else
+ \@EA\rawdodoifinsetelse
+ \fi}
+
+\long\def\rawdodoifinsetelse#1%
+ {\p!doifinstringelse\@@@instring{,#1,}%
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\long\def\rawdoifinset#1%
+ {\edef\@@@instring{,#1,}% expand #1 here
+ \ifx\@@@instring\@@rawempty
+ \@EA\gobbletwoarguments
+ \else
+ \@EA\rawdodoifinset
+ \fi}
+
+\long\def\rawdodoifinset#1%%
+ {\p!doifinstringelse\@@@instring{,#1,}%
+ \@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
+ \fi}
+
+%D Some more raw material:
+
+\def\p!rawprocessaction[#1][#2]%
+ {\def\pp!rawprocessaction##1,#1=>##2,##3\war%
+ {\if##3@\else
+ \def\!!processaction{##2}%
+ \fi}%
+ \pp!rawprocessaction,#2,#1=>,@\war}
+
+\def\rawprocessaction[#1]#2[#3]%
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{undefined}% better \!!undefined
+ \let\!!processaction\!!stringb
+ \ifx\!!stringa\empty
+ \@EA\p!rawprocessaction\@EA[\s!default][#3]%
+ \else
+ \expandafter\p!rawprocessaction\expandafter[\!!stringa][#3]%
+ \ifx\!!processaction\!!stringb
+ \@EA\p!rawprocessaction\@EA[\s!unknown][#3]%
+ \fi
+ \fi
+ \ifx\!!processaction\!!stringb
+ \else
+ \!!processaction
+ \fi}
+
+% not needed
+%
+% \def\rawprocessallactionsinset[#1]#2[#3]%
+% {\def\docommand##1%
+% {\rawprocessaction[##1][#3]}%
+% \processcommalist[#1]\docommand}
+
+%D When we process the list \type{a,b,c,d,e}, the raw routine
+%D takes over 30\% less time, when we feed $20+$ character
+%D strings we gain about 20\%. Alternatives which use
+%D \type{\futurelet} perform worse. Part of the speedup is
+%D due to the \type{\let} and \type{\expandafter} in the test.
+
+% %D \macros
+% %D {processunexpandedcommalist}
+% %D
+% %D When processing commalists, the arguments are expanded. The
+% %D main reason for doing so lays in the fact that these
+% %D macros are used for interfacing. The next alternative can be used
+% %D for
+% %D
+% %D \starttyping
+% %D \processunexpandedcommalist
+% %D [\alfa\beta,\gamma,\delta\epsilon]
+% %D \handleitem
+% %D \stoptyping
+% %D
+% %D This time nesting is not supported.
+%
+% %\def\processunexpandedcommaitem#1,%
+% % {\if]\noexpand#1%
+% % \let\nextcommaitem\relax
+% % \else
+% % \handleunexpandedcommaitem{#1}%
+% % \let\nextcommaitem\processunexpandedcommaitem
+% \fi
+% \nextcommaitem}
+%
+% faster:
+%
+% \def\processunexpandedcommaitem#1,%
+% {\if]\noexpand#1\else
+% \handleunexpandedcommaitem{#1}%
+% \expandafter\processunexpandedcommaitem
+% \fi}
+%
+% \def\processunexpandedcommalist[#1]#2%
+% {\def\handleunexpandedcommaitem{#2}%
+% \processunexpandedcommaitem#1,],}% \relax}
+%
+% %D Or faster:
+%
+% \def\processunexpandedcommaitem#1,%
+% {\if]\noexpand#1\else
+% \handleunexpandedcommaitem{#1}%
+% \expandafter\processunexpandedcommaitem
+% \fi}
+
+%D \macros
+%D {dosetvalue,dosetevalue,dosetgvalue,docopyvalue,doresetvalue,
+%D dogetvalue}
+%D
+%D When we are going to do assignments, we have to take
+%D multi||linguality into account. For the moment we keep
+%D things simple and single||lingual.
+%D
+%D \starttyping
+%D \dosetvalue {label} {variable} {value}
+%D \dosetevalue {label} {variable} {value}
+%D \dosetgvalue {label} {variable} {value}
+%D \docopyvalue {to label} {from label} {variable}
+%D \doresetvalue {label} {variable}
+%D \stoptyping
+%D
+%D These macros are in fact auxiliary ones and are not meant
+%D for use outside the assignment macros.
+
+\def\dosetvalue#1#2% #3
+ {\@EA\def\csname#1#2\endcsname} % {#3}}
+
+\def\dosetevalue#1#2% #3
+ {\@EA\edef\csname#1#2\endcsname} % {#3}}
+
+\def\dosetgvalue#1#2% #3
+ {\@EA\gdef\csname#1#2\endcsname} % {#3}}
+
+\def\doresetvalue#1#2%
+ {\@EA\let\csname#1#2\endcsname\empty}
+
+\def\doignorevalue#1#2#3%
+ {\@EA\let\csname#1#2\endcsname\empty}
+
+\def\docopyvalue#1#2#3%
+ {\@EA\def\csname#1#3\endcsname{\csname#2#3\endcsname}}
+
+%D \macros
+%D {doassign,undoassign,doassignempty}
+%D
+%D Assignments are the backbone of \CONTEXT. Abhorred by the
+%D concept of style file hacking, we took a considerable effort
+%D in building a parameterized system. Unfortunately there is a
+%D price to pay in terms of speed. Compared to other packages
+%D and taking the functionality of \CONTEXT\ into account, the
+%D total size of the format file is still very acceptable. Now
+%D how are these assignments done.
+%D
+%D Assignments can be realized with:
+%D
+%D \starttyping
+%D \doassign[label][variable=value]
+%D \undoassign[label][variable=value]
+%D \stoptyping
+%D
+%D and:
+%D
+%D \starttyping
+%D \doassignempty[label][variable=value]
+%D \stoptyping
+%D
+%D Assignments like \type{\doassign} are compatible with:
+%D
+%D \starttyping
+%D \def\labelvariable{value}
+%D \stoptyping
+%D
+%D We do check for the presence of an \type{=} and loudly
+%D complain of it's missed. We will redefine this macro later
+%D on, when a more advanced message mechanism is implemented.
+
+\newif\iferrorisfatal
+
+\def\waitonfatalerror
+ {\iferrorisfatal\wait\fi}
+
+\def\showassignerror#1#2%
+ {\writestatus{setup}{missing or ungrouped '=' after '#1' in line #2}%
+ \waitonfatalerror}
+
+%\def\p!doassign#1[#2][#3=#4=#5]%
+% {\let\donottest\dontprocesstest
+% \edef\!!stringa{#5}%
+% \let\!!stringb\relax
+% \let\donottest\doprocesstest
+% \ifx\!!stringa\!!stringb
+% \showassignerror{#3}%
+% \else
+% #1{#2}{#3}{#4}%
+% \fi}
+
+\def\p!doassign#1[#2][#3=#4=#5]%
+ {\ifx\empty#3\else % and definitely not \ifx#3\empty
+ \ifx\relax#5%
+ \showassignerror{#3}{\the\inputlineno\space(#2)}%
+ \else
+ #1{#2}{#3}{#4}%
+ \fi
+ \fi}
+
+\def\doassign [#1][#2]{\p!doassign\dosetvalue [#1][#2==\relax]}
+\def\doeassign [#1][#2]{\p!doassign\dosetevalue [#1][#2==\relax]}
+\def\undoassign[#1][#2]{\p!doassign\doresetvalue[#1][#2==\relax]}
+
+\def\doassignempty[#1][#2=#3]%
+ {\ifundefined{#1#2}\dosetvalue{#1}{#2}{#3}\fi}
+
+%D \macros
+%D {processassignmentlist,processassignmentcommand,
+%D startprocessassignmentlist,startprocessassignmentcommand}
+%D
+%D For Wolfgang:
+%D
+%D \starttyping
+%D \def\showpair#1#2{key:#1, value:#2\par}
+%D \processassignmentlist[a=1,b=2]\showpair
+%D \stoptyping
+
+\def\processassignmentlist[#1]#2% #2 == \command{key}{value]
+ {\def\doprocessassignmententry##1{#2}% {##2}{##3} % namespace is ignored
+ \dogetparameters\doprocessassignmententry[][#1]}
+
+\def\processassignmentcommand[#1]%
+ {\normalexpanded{\noexpand\processassignmentlist[#1]}}
+
+\long\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist
+ {\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
+ \processassignmentlist[#1]\currentassignmentlistcommand}
+
+\long\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand
+ {\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
+ \normalexpanded{\noexpand\processassignmentlist[#1]}\currentassignmentlistcommand}
+
+%D \macros
+%D {getparameters,geteparameters,getgparameters,
+%D forgetparameters}
+%D
+%D Using the assignment commands directly is not our
+%D ideal of user friendly interfacing, so we take some further
+%D steps.
+%D
+%D \starttyping
+%D \getparameters [label] [...=...,...=...]
+% %D \forgetparameters [label] [...=...,...=...]
+%D \stoptyping
+%D
+%D Again, the label identifies the category a variable
+%D belongs to. The second argument can be a comma separated
+%D list of assignments.
+%D
+%D \starttyping
+%D \getparameters
+%D [demo]
+%D [alfa=1,
+%D beta=2]
+%D \stoptyping
+%D
+%D is equivalent to
+%D
+%D \starttyping
+%D \def\demoalfa{1}
+%D \def\demobeta{2}
+%D \stoptyping
+%D
+%D
+%D In the pre||multi||lingual stadium \CONTEXT\ took the next
+%D approach. With
+%D
+%D \starttyping
+%D \def\??demo {@@demo}
+%D \def\!!alfa {alfa}
+%D \def\!!beta {beta}
+%D \stoptyping
+%D
+%D calling
+%D
+%D \starttyping
+%D \getparameters
+%D [\??demo]
+%D [\!!alfa=1,
+%D \!!beta=2]
+%D \stoptyping
+%D
+%D lead to:
+%D
+%D \starttyping
+%D \def\@@demoalfa{1}
+%D \def\@@demobeta{2}
+%D \stoptyping
+%D
+%D Because we want to be able to distinguish the \type{!!}
+%D pre||tagged user supplied variables from internal
+%D counterparts, we will introduce a slightly different tag in
+%D the multi||lingual modules. There we will use \type{c!} or
+%D \type{v!}, depending on the context.
+%D
+%D By calling \type{\p!doassign} directly, we save ourselves
+%D some argument passing and gain some speed. Whatever
+%D optimizations we do, this command will always be one of the
+%D bigger bottlenecks.
+%D
+%D The alternative \type{\geteparameters} --- it's funny to
+%D see that this alternative saw the light so lately --- can be
+%D used to do expanded assigments.
+
+\def\dogetparameters#1[#2]#3[#4]%
+ {\def\p!dogetparameter##1%
+ {\p!doassign#1[#2][##1==\relax]}%
+ \processcommalist[#4]\p!dogetparameter}
+
+\def\getparameters {\dogetparameters\dosetvalue}
+\def\geteparameters {\dogetparameters\dosetevalue}
+\def\getgparameters {\dogetparameters\dosetgvalue}
+\def\forgetparameters{\dogetparameters\doignorevalue}
+
+\let\getexpandedparameters=\geteparameters
+
+%D This one is slightly faster:
+
+\def\dogetparameters#1[#2]#3[#4%
+ {\if\noexpand#4]%
+ \expandafter\gobbleoneargument
+ \else
+ \def\p!dogetparameter##1{\p!doassign#1[#2][##1==\relax]}%
+ \expandafter\xdogetparameters
+ \fi#4}
+
+\def\xdogetparameters#1]%
+ {\processcommalist[#1]\p!dogetparameter}
+
+%D The next alternative is much faster but also uglier. Because
+%D in \XML\ processing we will probably set much more parameters
+%D than normally we need this faster one.
+
+\def\dogetparameters#1[#2]#3[#4%
+ {\if\noexpand#4]%
+ \expandafter\gobbleoneargument
+ \else
+ \def\p!dogetparameter{\p!doassign#1#2}%
+ \expandafter\xdogetparameters
+ \fi#4}
+
+\def\xdogetparameters#1]%
+ {\xprocesscommaitem#1,],\@relax@}
+
+% \long\def\xprocesscommaitem#1,#2% #2 takes space before ,
+% {\if]#1%
+% \expandafter\gobbleoneargument
+% \else
+% \p!dogetparameter\@relax@#1==\@relax@
+% \expandafter\xprocesscommaitem
+% \fi#2}
+
+\long\def\xprocesscommaitem#1,#2% #2 takes space before ,
+ {\if,#1,% dirty trick for testing #1=empty
+ \@EA\xprocesscommaitem
+ \else\if]#1%
+ \@EAEAEA\gobbleoneargument
+ \else
+ \p!dogetparameter\@relax@#1==\empty\@relax@
+ \@EAEAEA\xprocesscommaitem
+ \fi\fi#2}
+
+%D Here we use a slightly different assignment macro:
+
+% \def\p!doassign#1#2\@relax@#3=#4=#5\@relax@
+% {\ifx\@relax@#5\@EA\xshowassignerror\else\@EA#1\fi{#2}{#3}{#4}}
+
+% \def\p!doassign#1#2\@relax@#3=#4=#5\@relax@
+% {\ifx#5\empty\@EA\xshowassignerror\else\@EA#1\fi{#2}{#3}{#4}}
+
+\def\p!doassign#1#2\@relax@#3=#4=#5#6\@relax@
+ {\ifx#5\empty
+ \@EA\xshowassignerror
+ \else\ifx#5=%
+ \@EAEAEA#1%
+ \else
+ \@EAEAEA\xshowassignerror
+ \fi\fi
+ {#2}{#3}{#4}}
+
+\def\xshowassignerror#1#2#3%
+ {\showassignerror{#2}{\the\inputlineno\space(#1)}}
+
+%D Now we also have to change the other macros that depend
+%D on this low level one.
+
+% \def\doassign [#1][#2]{\p!doassign\dosetvalue #1\@relax@#2==\@relax@}
+% \def\doeassign [#1][#2]{\p!doassign\dosetevalue #1\@relax@#2==\@relax@}
+% \def\undoassign[#1][#2]{\p!doassign\doresetvalue#1\@relax@#2==\@relax@}
+
+\def\doassign [#1][#2]{\p!doassign\dosetvalue #1\@relax@#2==\empty\@relax@}
+\def\doeassign [#1][#2]{\p!doassign\dosetevalue #1\@relax@#2==\empty\@relax@}
+\def\undoassign[#1][#2]{\p!doassign\doresetvalue#1\@relax@#2==\empty\@relax@}
+
+%D When someone asked on the mailing list if it's possible to
+%D use the current value of a parameter, Taco posted a small module. His
+%D method had the disadvantage of making all assignments expanded and thereby
+%D fragile. The following alternative uses a prefix.
+
+%D \macros{currentvalue}
+%D
+%D Just in case a \type{\getparameter} argument itself ends up
+%D inside a \type{\write} or other expandable location, our
+%D new macro needs a default value.
+
+\let\currentvalue\empty
+
+% \def\p!n!doassign#1#2\@relax@#3=#4=#5#6\@relax@% normal
+% {\ifx#5\empty
+% \@EA\xshowassignerror
+% \else\ifx#5=%
+% \@EAEAEA#1%
+% \else
+% \@EAEAEA\xshowassignerror
+% \fi\fi
+% {#2}{#3}{#4}}
+
+\def\p!n!doassign#1#2\@relax@#3=#4=#5#6\@relax@
+ {\ifx\empty#3\empty
+ \@EA\xshowassignerror
+ \else\ifx#5\empty
+ \@EAEAEA\xshowassignerror
+ \else
+ \@EAEAEA#1%
+ \fi\fi
+ {#2}{#3}{#4}}
+
+\beginTEX
+
+% \def\p!e!doassign#1#2\@relax@#3=#4=#5#6\@relax@
+% {\ifx#5\empty
+% \@EA\xshowassignerror
+% \else\ifx#5=%
+% \@EA\ifx\csname#2#3\endcsname\relax
+% \let\currentvalue\empty
+% \else
+% \@EA\let\@EA\currentvalue\csname#2#3\endcsname
+% \fi
+% \@EAEAEA#1%
+% \else
+% \@EAEAEA\xshowassignerror
+% \fi\fi
+% {#2}{#3}{#4}}
+
+\def\p!e!doassign#1#2\@relax@#3=#4=#5#6\@relax@
+ {\ifx\empty#3\empty
+ \@EA\xshowassignerror
+ \else\ifx#5\empty
+ \@EAEAEA\xshowassignerror
+ \else
+ \@EA\ifx\csname#2#3\endcsname\relax
+ \let\currentvalue\empty
+ \else
+ \@EA\let\@EA\currentvalue\csname#2#3\endcsname
+ \fi
+ \@EAEAEA#1%
+ \fi\fi
+ {#2}{#3}{#4}}
+
+\endTEX
+
+\beginETEX
+
+% \def\p!e!doassign#1#2\@relax@#3=#4=#5#6\@relax@
+% {\ifx#5\empty
+% \@EA\xshowassignerror
+% \else\ifx#5=%
+% \ifcsname#2#3\endcsname
+% \@EA\let\@EA\currentvalue\csname#2#3\endcsname
+% \else
+% \let\currentvalue\empty
+% \fi
+% \@EAEAEA#1%
+% \else
+% \@EAEAEA\xshowassignerror
+% \fi\fi
+% {#2}{#3}{#4}}
+
+\def\p!e!doassign#1#2\@relax@#3=#4=#5#6\@relax@
+ {\ifx\empty#3\empty
+ \@EA\xshowassignerror
+ \else\ifx#5\empty
+ \@EAEAEA\xshowassignerror
+ \else
+ \ifcsname#2#3\endcsname
+ \@EA\let\@EA\currentvalue\csname#2#3\endcsname
+ \else
+ \let\currentvalue\empty
+ \fi
+ \@EAEAEA#1%
+ \fi\fi
+ {#2}{#3}{#4}}
+
+\endETEX
+
+%D We default to:
+
+\let\p!doassign\p!n!doassign
+
+%D And set:
+
+\let\currentvalue\empty
+
+%D \macros {expandparameters}
+%D
+%D Example usage:
+%D
+%D \startbuffer
+%D \getparameters[taco][name=taco]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \expandparameters \getparameters[taco][name=\currentvalue\space hoekwater]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \getparameters[taco][name=\currentvalue\space hoekwater]
+%D \convertcommand\taconame\to\ascii \ascii
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+%D Here we hook in the code (beware, this is the optimized get **):
+
+\def\xdoget@n@parameters#1]%
+ {\xprocesscommaitem#1,],\@relax@}
+
+\def\xdoget@e@parameters#1]%
+ {\let\dosetnvalue\dosetvalue
+ \let\dosetvalue\dosetevalue
+ \let\p!doassign\p!e!doassign
+ \xprocesscommaitem#1,],\@relax@
+ \let\p!doassign\p!n!doassign
+ \let\dosetvalue\dosetnvalue
+ \let\xdogetparameters\xdoget@n@parameters
+ \let\currentvalue\empty}
+
+\let\xdogetparameters\xdoget@n@parameters % **
+
+\def\expandparameters{\let\xdogetparameters\xdoget@e@parameters}
+
+%D \macros
+%D {getemptyparameters}
+%D
+%D Sometimes we explicitly want variables to default to an
+%D empty string, so we welcome:
+%D
+%D \starttyping
+%D \getemptyparameters [label] [...=...,...=...]
+%D \stoptyping
+
+\def\getemptyparameters[#1]#2[#3]%
+ {\def\p!dogetemptyparameter##1%
+ {\doassignempty[#1][##1]}%
+ \processcommalist[#3]\p!dogetemptyparameter}
+
+%D \macros
+%D {copyparameters}
+%D
+%D Some \CONTEXT\ commands take their default setups from
+%D others. All commands that are able to provide backgounds
+%D or rules around some content, for instance default to the
+%D standard command for ruled boxes. Is situations like this
+%D we can use:
+%D
+%D \starttyping
+%D \copyparameters [to-label] [from-label] [name1,name2,...]
+%D \stoptyping
+%D
+%D For instance
+%D
+%D \starttyping
+%D \copyparameters
+%D [internal][external]
+%D [alfa,beta]
+%D \stoptyping
+%D
+%D Leads to:
+%D
+%D \starttyping
+%D \def\internalalfa {\externalalfa}
+%D \def\internalbeta {\externalbeta}
+%D \stoptyping
+%D
+%D By using \type{\docopyvalue} we've prepared this command
+%D for use in a multi||lingual environment.
+
+\def\copyparameters[#1]#2[#3]#4[#5]%
+ {\doifnot{#1}{#3}
+ {\def\docopyparameter{\docopyvalue{#1}{#3}}%
+ %\def\docopyparameter##1{\docopyvalue{#1}{#3}{##1}}%
+ \processcommalist[#5]\docopyparameter}}
+
+%D \macros
+%D {ifparameters,checkparameters}
+%D
+%D A slightly different one is \type{\checkparameters}, which
+%D also checks on the presence of a~\type{=}.
+%D
+%D The boolean \type{\ifparameters} can be used afterwards.
+%D Combining both in one \type{\if}||macro would lead to
+%D problems with nested \type{\if}'s.
+%D
+%D \starttyping
+%D \checkparameters[argument]
+%D \stoptyping
+
+\newif\ifparameters
+
+\def\p!checkparameters#1=#2#3\war%
+ {\if#2@\parametersfalse\else\parameterstrue\fi}
+
+\def\checkparameters[#1]%
+ {\p!checkparameters#1=@@\war}
+
+%D \macros
+%D {getfromcommalist,getfromcommacommand,
+%D commalistelement,
+%D getcommalistsize,getcommacommandsize}
+%D
+%D It's possible to get an element from a commalist or a
+%D command representing a commalist.
+%D
+%D \starttyping
+%D \getfromcommalist [string] [n]
+%D \getfromcommacommand [string,\strings,string,...] [n]
+%D \stoptyping
+%D
+%D The difference betwee the two of them is the same as the
+%D difference between \type{\processcomma...}. The found string
+%D is stored in \type{\commalistelement}.
+%D
+%D We can calculate the size of a comma separated list by
+%D using:
+%D
+%D \starttyping
+%D \getcommalistsize [string,string,...]
+%D \getcommacommandsize [string,\strings,string,...]
+%D \stoptyping
+%D
+%D Afterwards, the length is available in the macro
+%D \type{\commalistsize} (not a \COUNTER).
+
+\newcount\commalistcounter
+
+\def\commalistsize{0}
+
+\def\p!dogetcommalistsize#1%
+ {\advance\commalistcounter\plusone}
+
+\def\getcommalistsize#1]% don't loose [{#1}]
+ {\commalistcounter\zerocount
+ \processcommalist#1]\p!dogetcommalistsize % was [{#1}]
+ \edef\commalistsize{\the\commalistcounter}}
+
+\def\getcommacommandsize[#1]%
+ {\edef\commacommand{#1}%
+ \scratchtoks\expandafter{\expandafter[\commacommand]}%
+ \expandafter\getcommalistsize\the\scratchtoks }
+
+% to be tested first
+%
+% \def\getcommacommandsize[#1]%
+% {\expanded{\getcommalistsize[#1]}}
+
+% \def\p!dogetfromcommalist#1%
+% {\advance\commalistcounter \minusone
+% \ifcase\commalistcounter
+% \def\commalistelement{#1}%
+% \begingroup\def\doprocesscommaitem##1]{\endgroup}%
+% \fi}
+
+\def\p!dogetfromcommalist#1%
+ {\advance\commalistcounter \minusone
+ \ifcase\commalistcounter
+ \def\commalistelement{#1}%
+ \expandafter\quitcommalist
+ \fi}
+
+\def\getfromcommalist[#1]#2[#3]%
+ {\let\commalistelement\empty
+ \commalistcounter#3\relax
+ \processcommalist[#1]\p!dogetfromcommalist}
+
+% \def\getfromcommacommand[#1]% why so complicated, still needed?
+% {\edef\commacommand{#1}%
+% \toks0=\expandafter{\expandafter[\commacommand]}%
+% \expandafter\getfromcommalist\the\toks0 }
+
+\def\getfromcommacommand[#1]%
+ {\expanded{\getfromcommalist[#1]}}
+
+%D Because 0, 1 and~2 are often asked for, we optimize this
+%D macro for those cases. The indirect call however slows
+%D down the other cases.
+%D
+%D \starttyping
+%D \def\p!dogetfirstfromcommalist [#1,#2]{\def\commalistelement{#1}}
+%D \def\p!dogetsecondfromcommalist[#1,#2,#3]{\def\commalistelement{#2}}
+%D \let\p!dogetotherfromcommalist=\getfromcommalist
+%D
+%D \def\getfromcommalist[#1]#2[#3]% optimized for 0,1,2
+%D {\ifcase#3\relax
+%D \let\commalistelement\empty
+%D \or
+%D \p!dogetfirstfromcommalist[#1,]%
+%D \or
+%D \p!dogetsecondfromcommalist[#1,,]%
+%D \else
+%D \p!dogetotherfromcommalist[#1][#3]%
+%D \fi}
+%D \stoptyping
+%D
+%D Even worse, this alternative does not strip preceding
+%D spaces, which is what we want. So, we stick to the slow
+%D alternative.
+
+%D Watertight (and efficient) solutions are hard to find, due
+%D to the handling of braces during parameters passing and
+%D scanning. Nevertheless:
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1=\commalistsize) }
+%D
+%D \getcommalistsize [\hbox{$a,b,c,d,e,f$}] \dosomething 1
+%D \getcommalistsize [{a,b,c,d,e,f}] \dosomething 1
+%D \getcommalistsize [{a,b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [a,b,{c,d,e},f] \dosomething 4
+%D \getcommalistsize [a{b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [{a,b}c,d,e,f] \dosomething 4
+%D \getcommalistsize [] \dosomething 0
+%D \getcommalistsize [{[}] \dosomething 1
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D reports:
+%D
+%D \getbuffer
+
+%D \macros
+%D {dogetcommalistelement,dogetcommacommandelement}
+%D
+%D For low level (fast) purposes, we can also use the next
+%D alternative, which can handle 8~elements at most.
+%D
+%D \starttyping
+%D \dogetcommalistelement1\from a,b,c\to\commalistelement
+%D \stoptyping
+
+\def\dodogetcommalistelement#1\from#2,#3,#4,#5,#6,#7,#8\to#9%
+ {\edef#9{\ifcase#1\relax\or#2\or#3\or#4\or#5\or#6\or#7\or#8\fi}}
+
+% maybe better:
+%
+% {\@EA\edef\@EA#9\@EA{\ifcase#1\relax\or#2\or#3\or#4\or#5\or#6\or#7\or#8\fi}}
+
+\def\dogetcommalistelement#1\from#2\to%
+ {\dodogetcommalistelement#1\from#2,,,,,,\to}
+
+% check sources
+
+\def\dogetcommacommandelement#1\from#2\to%
+ {\@EA\dodogetcommalistelement\@EA#1\@EA\from#2,,,,,,\to}
+
+%D \macros
+%D {dosingleargument,dodoubleargument,dotripleargument,
+%D doquadrupleargument,doquintupleargument,dosixtupleargument,
+%D doseventupleargument}
+%D
+%D When working with delimited arguments, spaces and
+%D lineendings can interfere. The next set of macros uses
+%D \TEX' internal scanner for grabbing everything between
+%D arguments. Forgive me the funny names.
+%D
+%D \starttyping
+%D \dosingleargument\commando = \commando[#1]
+%D \dodoubleargument\commando = \commando[#1][#2]
+%D \dotripleargument\commando = \commando[#1][#2][#3]
+%D \doquadrupleargument\commando = \commando[#1][#2][#3][#4]
+%D \doquintupleargument\commando = \commando[#1][#2][#3][#4][#5]
+%D \dosixtupleargument\commando = \commando[#1][#2][#3][#4][#5][#6]
+%D \doseventupleargument\command= \commando[#1][#2][#3][#4][#5][#6][#7]
+%D \stoptyping
+%D
+%D These macros are used in the following way:
+%D
+%D \starttyping
+%D \def\dosetupsomething[#1][#2]%
+%D {... #1 ... #2 ...}
+%D
+%D \def\setupsomething%
+%D {\dodoubleargument\dosetupsomething}
+%D \stoptyping
+%D
+%D The implementation can be surprisingly simple and needs no
+%D further explanation, like:
+%D
+%D \starttyping
+%D \def\dosingleargument#1[#2]%
+%D {#1[#2]}
+%D \def\dotripleargument#1[#2]#3[#4]#5[#6]%
+%D {#1[#2][#4][#6]}
+%D \def\doquintupleargument#1%
+%D {\def\dodoquintupleargument[##1]##2[##3]##4[##5]##6[##7]##8[##9]%
+%D {#1[##1][##3][##5][##7][##9]}%
+%D \dodoquintupleargument}
+%D \stoptyping
+%D
+%D Because \TEX\ accepts 9~arguments at most, we have to use
+%D two||step solution when getting five or more arguments.
+%D
+%D When developing more and more of the real \CONTEXT, we
+%D started using some alternatives that provided empty
+%D arguments (in fact optional ones) whenever the user failed
+%D to supply them. Because this more complicated macros enable
+%D us to do some checking, we reimplemented the non||empty
+%D ones.
+
+\def\dosingleargument {\chardef\expectedarguments 1 \dosingleempty }
+\def\dodoubleargument {\chardef\expectedarguments 2 \dodoubleempty }
+\def\dotripleargument {\chardef\expectedarguments 3 \dotripleempty }
+\def\doquadrupleargument {\chardef\expectedarguments 4 \doquadrupleempty }
+\def\doquintupleargument {\chardef\expectedarguments 5 \doquintupleempty }
+\def\dosixtupleargument {\chardef\expectedarguments 6 \dosixtupleempty }
+\def\doseventupleargument{\chardef\expectedarguments 7 \doseventupleempty}
+
+%D \macros
+%D {iffirstagument,ifsecondargument,ifthirdargument,
+%D iffourthargument,iffifthargument,ifsixthargument,
+%D ifseventhargument}
+%D
+%D We use some signals for telling the calling macros if all
+%D wanted arguments are indeed supplied by the user.
+
+\newif\iffirstargument
+\newif\ifsecondargument
+\newif\ifthirdargument
+\newif\iffourthargument
+\newif\iffifthargument
+\newif\ifsixthargument
+\newif\ifseventhargument
+
+%D \macros
+%D {dosingleempty,dodoubleempty,dotripleempty,
+%D doquadrupleempty,doquintupleempty,dosixtupeempty,
+%D doseventupleempty}
+%D
+%D The empty argument supplying macros mentioned before, look
+%D like:
+%D
+%D \starttyping
+%D \dosingleempty \command
+%D \dodoubleempty \command
+%D \dotripleempty \command
+%D \doquadrupleempty \command
+%D \doquintupleempty \command
+%D \dosixtupleempty \command
+%D \doseventupleempty\command
+%D \stoptyping
+%D
+%D So \type{\dodoubleempty} leades to:
+%D
+%D \starttyping
+%D \command[#1][#2]
+%D \command[#1][]
+%D \command[][]
+%D \stoptyping
+%D
+%D Depending of the generousity of the user. Afterwards one can
+%D use the \type{\if...argument} boolean. For novice: watch
+%D the stepwise doubling of \type{#}'s
+
+% idea: \ignorespaces afterwards
+
+\chardef\noexpectedarguments=0
+\chardef\expectedarguments =0
+
+\def\showargumenterror#1#2%
+ {\writestatus{systems}{#1 argument(s) expected in line #2}}
+
+% \long\def\dogetargument#1#2#3#4% redefined in mult-ini
+% {\doifnextcharelse{#1}
+% {\let\expectedarguments\noexpectedarguments
+% #3\dodogetargument}
+% {\ifnum\expectedarguments>\noexpectedarguments
+% \showargumenterror{\expectedarguments}
+% \fi
+% \let\expectedarguments\noexpectedarguments
+% #4\dodogetargument#1#2}}
+%
+% less to pass
+
+\def\doshowargumenterror
+ {\ifnum\expectedarguments>\noexpectedarguments
+ \showargumenterror{\number\expectedarguments}{\number\inputlineno}%
+ \fi
+ \noshowargumenterror}
+
+\def\noshowargumenterror
+ {\let\expectedarguments\noexpectedarguments}
+
+% \long\def\dogetargument#1#2#3#4%
+% {\doifnextcharelse#1%
+% {\noshowargumenterror#3\dodogetargument}
+% {\doshowargumenterror#4\dodogetargument#1#2}}
+%
+% faster ?
+
+\long\def\dogetargument#1#2#3#4%
+ {\let\charactertoken=#1%
+ \def\!!stringa{\noshowargumenterror#3\dodogetargument}%
+ \def\!!stringb{\doshowargumenterror#4\dodogetargument#1#2}%
+ \futurelet\nexttoken\inspectnextcharacter}
+
+\def\getsingleempty#1#2#3%
+ {\def\dodogetargument%
+ {#3}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getdoubleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\gettripleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getquadrupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getquintupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2%
+ #1{################1}#2}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getsixtupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument#1################################1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2%
+ #1{################1}#2%
+ #1{################################1}#2}%
+ \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getseventupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument#1################################1#2%
+ {\def\dodogetargument#1################################%
+ ################################1#2%
+ {\def\dodogetargument%
+ {#3#1{##1}#2%
+ #1{####1}#2%
+ #1{########1}#2%
+ #1{################1}#2%
+ #1{################################1}#2%
+ #1{################################%
+ ################################1}#2}%
+ \dogetargument#1#2\seventhargumenttrue\seventhargumentfalse}%
+ \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\dosingleempty {\getsingleempty []}
+\def\dodoubleempty {\getdoubleempty []}
+\def\dotripleempty {\gettripleempty []}
+\def\doquadrupleempty {\getquadrupleempty []}
+\def\doquintupleempty {\getquintupleempty []}
+\def\dosixtupleempty {\getsixtupleempty []}
+\def\doseventupleempty{\getseventupleempty[]}
+
+%D Because some of these are called quite often, we will now
+%D replace the more general version by alternatives tuned for
+%D speed.
+
+\def\dosingleempty#1%
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextoptionalelse
+ {\firstargumenttrue#1}
+ {\dosinglefakeempty#1}}
+
+\def\dodoubleempty#1%
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextoptionalelse
+ {\dodoubletestempty#1}
+ {\dodoublefakeempty#1}}
+
+\def\dotripleempty#1%
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextoptionalelse
+ {\dotripletestempty#1}
+ {\dotriplefakeempty#1}}
+
+\def\dosinglefakeempty#1%
+ {\firstargumentfalse#1[]}
+
+\def\dodoublefakeempty#1%
+ {\firstargumentfalse\secondargumentfalse#1[][]}
+
+\def\dotriplefakeempty#1%
+ {\firstargumentfalse\secondargumentfalse\thirdargumentfalse#1[][][]}
+
+\long\def\dodoubletestempty#1[#2]%
+ {\firstargumenttrue
+ \doifnextoptionalelse
+ {\secondargumenttrue #1[{#2}]}
+ {\secondargumentfalse#1[{#2}][]}}
+
+\long\def\dotripletestempty#1[#2]%
+ {\firstargumenttrue
+ \doifnextoptionalelse
+ {\dotripletestemptyx #1[{#2}]}
+ {\secondargumentfalse
+ \thirdargumentfalse #1[{#2}][][]}}
+
+\long\def\dotripletestemptyx#1[#2][#3]%
+ {\secondargumenttrue
+ \doifnextoptionalelse
+ {\thirdargumenttrue #1[{#2}][{#3}]}
+ {\thirdargumentfalse#1[{#2}][{#3}][]}}
+
+%D \macros
+%D {strippedcsname}
+%D
+%D The next macro can be very useful when using \type{\csname}
+%D like in:
+%D
+%D \starttyping
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptyping
+%D
+%D This expands to \type{\ifsomething}.
+
+\def\strippedcsname%
+ {\expandafter\gobbleoneargument\string}
+
+%D \macros
+%D {complexorsimple,complexorsimpleempty}
+%D
+%D Setups can be optional. A command expecting a setup is
+%D prefixed by \type{\complex}, a command without one gets the
+%D prefix \type{\simple}. Commands like this can be defined by:
+%D
+%D \starttyping
+%D \complexorsimple\command
+%D \stoptyping
+%D
+%D When \type{\command} is followed by a \type{[setup]}, then
+%D
+%D \starttyping
+%D \complexcommand [setup]
+%D \stoptyping
+%D
+%D executes, else we get
+%D
+%D \starttyping
+%D \simplecommand
+%D \stoptyping
+%D
+%D An alternative for \type{\complexorsimple} is:
+%D
+%D \starttyping
+%D \complexorsimpleempty {command}
+%D \stoptyping
+%D
+%D Depending on the presence of \type{[setup]}, this one
+%D leads to one of:
+%D
+%D \starttyping
+%D \complexcommando [setup]
+%D \complexcommando []
+%D \stoptyping
+%D
+%D Many \CONTEXT\ commands started as complex or simple ones,
+%D but changed into more versatile (more object oriented) ones
+%D using the \type{\get..argument} commands.
+
+% This method is needed when traditional tex is used with
+% the efficient definition (marked **) below.
+
+% an old one:
+%
+% \def\setnameofcommand#1% handles {abc} as well as \abc
+% {\begingroup
+% \escapechar=-1
+% \globaldefs=0 % pretty important!
+% \xdef\nameofcommand{\string#1}%
+% \endgroup}
+%
+% \def\complexorsimple#1%
+% {\setnameofcommand{#1}%
+% \doifnextcharelse{[}
+% {\firstargumenttrue \getvalue{\s!complex\nameofcommand}}
+% {\firstargumentfalse\getvalue{\s!simple \nameofcommand}}}
+%
+% \def\complexorsimpleempty#1%
+% {\setnameofcommand{#1}%
+% \doifnextcharelse{[}
+% {\firstargumenttrue \getvalue{\s!complex\nameofcommand}}
+% {\firstargumentfalse\getvalue{\s!complex\nameofcommand}[]}}
+%
+% a newer one:
+
+\def\complexorsimple#1%
+ {% \relax % prevents lookahead, brrr
+ \doifnextoptionalelse
+ {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname}
+ {\firstargumentfalse\csname\s!simple \strippedcsname#1\endcsname}}
+
+\def\complexorsimpleempty#1%
+ {% \relax % prevents lookahead, brrr
+ \doifnextoptionalelse
+ {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname}
+ {\firstargumentfalse\csname\s!complex\strippedcsname#1\endcsname[]}}
+
+%D \macros
+%D {definecomplexorsimple,definecomplexorsimpleempty}
+%D
+%D The previous commands are used that often that we found it
+%D worthwile to offer two more alternatives. Watch the build
+%D in protection.
+
+% See earlier. Because we don't want \type {\simple..} and
+% \type {\complex..} commands to show up in expansions, we need
+% to pass them as \type {simple..} and \type {complex..}.
+
+% \beginTEX
+%
+% \def\definewithnameofcommand#1#2%
+% {\setnameofcommand{#2}%
+% \@EA\def\@EA#2\@EA{\@EA\donottest\@EA#1\@EA{\nameofcommand}}}
+%
+% \def\definecomplexorsimple%
+% {\definewithnameofcommand\complexorsimple}
+%
+% \def\definecomplexorsimpleempty%
+% {\definewithnameofcommand\complexorsimpleempty}
+%
+% \endTEX
+%
+% \beginETEX \protected
+%
+% \def\definecomplexorsimple#1%
+% {\normalprotected\def#1{\complexorsimple#1}}
+%
+% \def\definecomplexorsimpleempty#1%
+% {\normalprotected\def#1{\complexorsimpleempty#1}}
+%
+% \endETEX
+
+% However, since this one uses an idirect method, things go
+% okay (at the cost of extra macros).
+
+% \def\definecomplexorsimple#1%
+% {\unexpanded\def#1{\complexorsimple#1}}
+%
+% \def\definecomplexorsimpleempty#1%
+% {\unexpanded\def#1{\complexorsimpleempty#1}}
+%
+% faster, since no \strippedcsname needed in call, but more spacy
+
+\def\docomplexorsimple#1#2%
+ {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#2}}
+
+\def\docomplexorsimpleempty#1%
+ {\doifnextoptionalelse{\firstargumenttrue#1}{\firstargumentfalse#1[]}}
+
+\def\definecomplexorsimple#1%
+ {\unexpanded\edef#1%
+ {\noexpand\docomplexorsimple
+ \@EA\noexpand\csname\s!complex\strippedcsname#1\endcsname
+ \@EA\noexpand\csname\s!simple \strippedcsname#1\endcsname}}
+
+\def\definecomplexorsimpleempty#1%
+ {\unexpanded\edef#1%
+ {\noexpand\docomplexorsimpleempty
+ \@EA\noexpand\csname\s!complex\strippedcsname#1\endcsname}}
+
+%D These commands are called as:
+%D
+%D \starttyping
+%D \definecomplexorsimple\command
+%D \stoptyping
+%D
+%D Of course, we must have available
+%D
+%D \starttyping
+%D \def\complexcommand[#1]{...}
+%D \def\simplecommand {...}
+%D \stoptyping
+%D
+%D Using this construction saves a few string now and then.
+
+%D \macros
+%D {definestartstopcommand}
+%D
+%D Those who get the creeps of expansion may skip the next
+%D one. It's one of the most recent additions and concerns
+%D \type{\start}||\type{\stop} pairs with complicated
+%D arguments.
+%D
+%D We won't go into details here, but the general form of
+%D this using this command is:
+%D
+%D \starttyping
+%D \definestartstopcommand\somecommand\e!specifier{arg}{arg}%
+%D {do something with arg}
+%D \stoptyping
+%D
+%D This expands to something like:
+%D
+%D \starttyping
+%D \def\somecommand arg \startspecifier arg \stopspecifier%
+%D {do something with arg}
+%D \stoptyping
+%D
+%D The arguments can be anything reasonable, but double
+%D \type{#}'s are needed in the specification part, like:
+%D
+%D \starttyping
+%D \definestartstopcommand\somecommand\e!specifier{[##1][##2]}{##3}%
+%D {do #1 something #2 with #3 arg}
+%D \stoptyping
+%D
+%D which becomes:
+%D
+%D \starttyping
+%D \def\somecommand[#1][#2]\startspecifier#3\stopspecifier%
+%D {do #1 something #2 with #3 arg}
+%D \stoptyping
+%D
+%D We will see some real applications of this command in the
+%D core modules.
+
+\def\definestartstopcommand#1#2#3#4% can be done with \expanded ot better, toks
+ {\def\!stringa{#3}% % but let's keep this unused one crappy
+ \def\!stringb{\e!start#2}%
+ \def\!stringc{#4}%
+ \def\!stringd{\e!stop#2}%
+ \@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA
+ \def\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA
+ #1\@EA\@EA\@EA\@EA\@EA\@EA\@EA
+ \!stringa\@EA\@EA\@EA
+ \csname\@EA\@EA\@EA\!stringb\@EA\@EA\@EA\endcsname\@EA
+ \!stringc
+ \csname\!stringd\endcsname}
+
+%D \macros
+%D {dosinglegroupempty,dodoublegroupempty,dotriplegroupempty,
+%D doquadruplegroupempty, doquintuplegroupempty}
+%D
+%D We've already seen some commands that take care of
+%D optional arguments between \type{[]}. The next two commands
+%D handle the ones with \type{{}}. They are called as:
+%D
+%D \starttyping
+%D \dosinglegroupempty \ineedONEargument
+%D \dodoublegroupempty \ineedTWOarguments
+%D \dotriplegroupempty \ineedTHREEarguments
+%D \doquadruplegroupempty \ineedFOURarguments
+%D \doquintuplegroupempty \ineedFIVEarguments
+%D \stoptyping
+%D
+%D where \type{\ineedONEargument} takes one and the others
+%D two and three arguments. These macro's were first needed in
+%D \PPCHTEX.
+%D
+%D \starttyping
+%D \def\dogetgroupargument#1#2% redefined in mult-ini
+%D {\def\nextnextargument%
+%D {\ifx\nextargument\bgroup
+%D \let\expectedarguments\noexpectedarguments
+%D \def\nextargument{#1\dodogetargument}%
+%D %\else\ifx\nextargument\lineending % this can be an option
+%D % \def\nextargument{\begingroup\def\\ {\endgroup\dogetgroupargument#1#2}\\}%
+%D %\else\ifx\nextargument\blankspace % but it may never be default
+%D % \def\nextargument{\begingroup\def\\ {\endgroup\dogetgroupargument#1#2}\\}%
+%D \else
+%D \ifnum\expectedarguments>\noexpectedarguments
+%D \writestatus
+%D {setup}
+%D {\the\expectedarguments\space argument(s) expected
+%D in line \the\inputlineno\space}%
+%D \fi
+%D \let\expectedarguments\noexpectedarguments
+%D \def\nextargument{#2\dodogetargument{}}%
+%D \fi%\fi\fi % so let's get rid of it
+%D \nextargument}%
+%D \futurelet\nextargument\nextnextargument}
+%D \stoptyping
+%D
+%D In order to catch \type {\nextargument}'s that expand to
+%D \type {\if} and friends, in practice we will use a
+%D slightly more complicated macro.
+
+\newtoks \everyrobusttest
+
+\everyrobusttest
+ {\let\if \relax
+ \let\ifcat \relax
+ \let\ifnum \relax
+ \let\ifdim \relax
+ \let\ifodd \relax
+ \let\ifvmode \relax
+ \let\ifhmode \relax
+ \let\ifmmode \relax
+ \let\ifinner \relax
+ \let\ifvoid \relax
+ \let\ifhbox \relax
+ \let\ifvbox \relax
+ \let\ifx \relax
+ \let\ifeof \relax
+ \let\iftrue \relax
+ \let\iffalse \relax
+ \let\ifcase \relax
+ \let\ifdefined \relax
+ \let\ifcsname \relax
+ \let\iffontchar \relax
+ \let\ifincsname \relax
+ \let\ifprimitive\relax
+ \let\ifabsnum \relax
+ \let\ifabsdim \relax
+ \let\else \relax
+ \let\or \relax
+ \let\fi \relax}
+
+\def\beginrobusttest
+ {\begingroup
+ \the\everyrobusttest}
+
+\let\endrobusttest\endgroup
+
+%D We can add additional definitions later when we have defined
+%D \type {\appendtoks}.
+
+\def \permitspacesbetweengroups{\chardef\@@permitspacesbetweengroups=0 }
+\def\dontpermitspacesbetweengroups{\chardef\@@permitspacesbetweengroups=1 }
+
+\dontpermitspacesbetweengroups
+
+% \def\dogetgroupargument#1#2%
+% {\def\nextnextargument%
+% {\normalifx\nextargument\bgroup
+% \endrobusttest
+% \noshowargumenterror
+% \def\nextargument{#1\dodogetargument}%
+% \normalelse
+% \normalifcase\@@permitspacesbetweengroups
+% \normalifx\nextargument\lineending
+% \endrobusttest
+% \def\nextargument{\begingroup\def\\ {\endgroup\dogetgroupargument#1#2}\\}%
+% \normalelse\normalifx\nextargument\blankspace
+% \endrobusttest
+% \def\nextargument{\begingroup\def\\ {\endgroup\dogetgroupargument#1#2}\\}%
+% \normalelse
+% \endrobusttest
+% \doshowargumenterror
+% \def\nextargument{#2\dodogetargument{}}%
+% \normalfi\normalfi
+% \normalelse
+% \endrobusttest
+% \doshowargumenterror
+% \def\nextargument{#2\dodogetargument{}}%
+% \normalfi
+% \normalfi
+% \nextargument}%
+% \beginrobusttest
+% \futurelet\nextargument\nextnextargument}
+
+\def\dodogetgroupargument
+ {\normalifx\nextargument\bgroup
+ \endrobusttest
+ \noshowargumenterror
+ \def\nextargument{\dogroupargumentyes\dodogetargument}%
+ \normalelse
+ \normalifcase\@@permitspacesbetweengroups
+ \normalifx\nextargument\lineending
+ \endrobusttest
+ \def\nextargument{\begingroup\def\\ {\endgroup\dogetgroupargument\dogroupargumentyes\dogroupargumentnop}\\}%
+ \normalelse\normalifx\nextargument\blankspace
+ \endrobusttest
+ \def\nextargument{\begingroup\def\\ {\endgroup\dogetgroupargument\dogroupargumentyes\dogroupargumentnop}\\}%
+ \normalelse
+ \endrobusttest
+ \doshowargumenterror
+ \def\nextargument{\dogroupargumentnop\dodogetargument{}}%
+ \normalfi\normalfi
+ \normalelse
+ \endrobusttest
+ \doshowargumenterror
+ \def\nextargument{\dogroupargumentnop\dodogetargument{}}%
+ \normalfi
+ \normalfi
+ \nextargument}%
+
+\def\dogetgroupargument#1#2%
+ {\let\dogroupargumentyes#1%
+ \let\dogroupargumentnop#2%
+ \beginrobusttest\futurelet\nextargument\dodogetgroupargument}
+
+\def\dosinglegroupempty#1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\dodoublegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\dotriplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}{####1}}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\doquadruplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument########1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}{####1}{########1}}%
+ \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\doquintuplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument########1%
+ {\def\dodogetargument################1%
+ {\def\dodogetargument%
+ {\dontpermitspacesbetweengroups
+ #1{##1}{####1}{########1}{################1}}%
+ \dogetgroupargument\fifthargumenttrue\fifthargumentfalse}%
+ \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+%D These macros can explictly take care of spaces, which means
+%D that the next definition and calls are valid:
+%D
+%D \starttyping
+%D \def\test#1#2#3{[#1#2#3]}
+%D
+%D \dotriplegroupempty\test {a}{b}{c}
+%D \dotriplegroupempty\test {a}{b}
+%D \dotriplegroupempty\test {a}
+%D \dotriplegroupempty\test
+%D \dotriplegroupempty\test {a} {b} {c}
+%D \dotriplegroupempty\test {a} {b}
+%D \dotriplegroupempty\test
+%D {a}
+%D {b}
+%D \stoptyping
+%D
+%D And alike.
+
+%D \macros
+%D {firstofoneargument, firstoftwoarguments, firstofthreearguments
+%D secondoftwoarguments, secondofthreearguments,
+%D thirdofthreearguments}
+%D
+%D The next six macros (dedicated to Taco) can conveniently
+%D used to select arguments. Their names explain their
+%D functionality.
+
+\long\def\firstofoneargument#1{#1}
+
+\long\def\firstoftwoarguments #1#2{#1}
+\long\def\secondoftwoarguments#1#2{#2}
+
+\long\def\firstofthreearguments #1#2#3{#1}
+\long\def\secondofthreearguments#1#2#3{#2}
+\long\def\thirdofthreearguments #1#2#3{#3}
+
+\long\def\firstoffourarguments #1#2#3#4{#1}
+\long\def\secondoffourarguments#1#2#3#4{#2}
+\long\def\thirdoffourarguments #1#2#3#4{#3}
+\long\def\fourthoffourarguments#1#2#3#4{#4}
+
+\long\def\firstoffivearguments #1#2#3#4#5{#1}
+\long\def\secondoffivearguments#1#2#3#4#5{#2}
+\long\def\thirdoffivearguments #1#2#3#4#5{#3}
+\long\def\fourthoffivearguments#1#2#3#4#5{#4}
+\long\def\fifthoffivearguments #1#2#3#4#5{#5}
+
+\long\def\firstofsixarguments #1#2#3#4#5#6{#1}
+\long\def\secondofsixarguments#1#2#3#4#5#6{#2}
+\long\def\thirdofsixarguments #1#2#3#4#5#6{#3}
+\long\def\fourthofsixarguments#1#2#3#4#5#6{#4}
+\long\def\fifthofsixarguments #1#2#3#4#5#6{#5}
+\long\def\sixthofsixarguments #1#2#3#4#5#6{#6}
+
+%D \macros
+%D {globalletempty,letempty,letvalueempty,letgvalueempty}
+%D
+%D Trivial:
+
+\def\letempty #1{\let#1\empty}
+\def\globalletempty#1{\global\let#1\empty}
+
+\def\letvalueempty #1{\expandafter\let\csname#1\endcsname\empty}
+\def\letgvalueempty#1{\global\expandafter\let\csname#1\endcsname\empty}
+
+%D \macros
+%D {wait}
+%D
+%D The next macro hardly needs explanation. Because no
+%D nesting is to be expected, we can reuse \type{\wait} within
+%D \type{\wait} itself.
+
+\def\wait
+ {\begingroup
+ \read16 to \wait
+ \endgroup}
+
+%D \macros
+%D {writestring,writeline,writebanner,
+%D writestatus,statuswidth,normalwritestatus}
+%D
+%D Maybe one didn't notice, but we've already introduced a
+%D macro for showing messages. In the multi||lingual modules,
+%D we will also introduce a mechanism for message passing. For
+%D the moment we stick to the core macros:
+%D
+%D \starttyping
+%D \writestring {string}
+%D \writeline
+%D \writestatus {category} {message}
+%D \stoptyping
+%D
+%D Messages are formatted. One can provide the maximum with
+%D of the identification string with the macro \type
+%D {\statuswidth}.
+
+\chardef\statuswidth=15
+\chardef\statuswrite=16
+
+\ifx\writestring\undefined
+
+ \newtoks\everywritestring
+
+ \def\writedirect {\immediate\write\statuswrite}
+ \def\writeline {\writedirect{}}
+ \def\writestring#1{\begingroup\the\everywritestring\writedirect{#1}\endgroup}
+
+\fi
+
+%D First we present the normal \TEX\ variant, later we will
+%D show the \ETEX-way.
+
+
+\beginTEX
+
+ \newcount\statuscounter
+
+ \def\dosplitstatus#1%
+ {\advance\statuscounter \minusone
+ \ifcase\statuscounter
+ \expandafter\nosplitstatus
+ \else
+ \scratchtoks\@EA{\the\scratchtoks#1}%
+ \expandafter\dosplitstatus
+ \fi}
+
+ \def\nosplitstatus#1\end
+ {}
+
+ \def\writestatus#1#2%
+ {\begingroup
+ \scratchtoks\emptytoks
+ \statuscounter\statuswidth
+ \expandafter\dosplitstatus#1%
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\end
+ \@EA\writestring\@EA{\the\scratchtoks\space:\space#2}%
+ \endgroup}
+
+\endTEX
+
+%D Because we're grouped, we could have initialized at forehand:
+%D
+%D \starttyping
+%D \statuscounter\statuswidth
+%D \stoptyping
+%D
+%D The next implementation saves only some 10 words of format
+%D memory, but we hardly gain any speed.
+%D
+%D \starttyping
+%D \def\dosplitstatus#1#2#3#4#5#6#7#8#9%
+%D {#1#2#3#4#5#6#7#8#9\dodosplitstatus}
+%D
+%D \def\dodosplitstatus#1#2#3#4#5#6\end
+%D {#1#2#3#4#5}
+%D
+%D \def\writestatus#1#2%
+%D {\writestring
+%D {\expandafter\dosplitstatus#1%
+%D \space\space\space\space\space
+%D \space\space\space\space\space
+%D \space\space\space\space\space\end
+%D \space:\space#2}}
+%D \stoptyping
+
+%D Okay then, more obscure but slightly faster: no split grabs
+%D the do split part and skipping the else branch has to happen
+%D anyway, so:
+
+\beginTEX
+
+ \def\dosplitstatus#1%
+ {\advance\statuscounter \minusone
+ \ifcase\statuscounter
+ \expandafter\nosplitstatus
+ \fi
+ \scratchtoks\@EA{\the\scratchtoks#1}%
+ \dosplitstatus}
+
+\endTEX
+
+%D The next (\ETEX\ specific) variant is twice as fast in 5/40
+%D situations, only gains some speed when multiple runs of large docs
+%D are done; fully expandable, no statuscounter needed, no restore (due
+%D to grouping) needed etc.
+
+\beginETEX \numexpr
+
+ \def\normalwritestatus#1#2%
+ {\writestring{\expandafter\dosplitstatus\expandafter\statuswidth#1%
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\end
+ \space:\space#2}}
+
+ \def\dosplitstatus#1#2%
+ {\ifcase#1 \expandafter\nosplitstatus\fi#2%
+ \expandafter\dosplitstatus\expandafter{\the\numexpr#1+\minusone\relax}}
+
+ \def\nosplitstatus#1\end
+ {}
+
+\endETEX
+
+%D \macros
+%D {emptytoks}
+%D
+%D For this we need an empty token register, analogous
+%D to \type {\empty}.
+
+\newtoks\emptytoks
+
+%D \macros
+%D {debuggerinfo}
+%D
+%D For debugging purposes we can enhance macros with the
+%D next alternative. Here \type{debuggerinfo} stands for both
+%D a macro accepting two arguments and a boolean (in fact a
+%D few macro's too).
+
+\newif\ifdebuggerinfo
+
+\def\debuggerinfo#1#2%
+ {\ifdebuggerinfo
+ \writestatus{debugger}{#1:: #2}%
+ \fi}
+
+%D Finally we do what from now on will be done at the top of
+%D the files: we tell the user what we are loading.
+
+% \ifx\writestatus\undefined \let\writestatus\normalwritestatus \fi
+% \ifx\writebanner\undefined \def\writebanner{\writestring} \fi
+
+\ifx\normalwritestatus\undefined
+ % for use within latex
+ \ifx\writestatus\undefined
+ \def\writestatus#1#2{\immediate\write16{#1 : #2}}
+ \fi
+\else
+ \let\writestatus\normalwritestatus
+\fi
+
+\def\writebanner{\writestring}
+
+\writestatus{loading}{ConTeXt System Macros / General}
+
+%D Well, the real final command is the one that resets the
+%D unprotected characters \type{@}, \type{?} and \type{!}.
+
+\protect \endinput
diff --git a/tex/context/base/syst-ini.tex b/tex/context/base/syst-ini.tex
new file mode 100644
index 000000000..7c9d72127
--- /dev/null
+++ b/tex/context/base/syst-ini.tex
@@ -0,0 +1,888 @@
+%D \module
+%D [ file=syst-ini,
+%D version=2008.11.04, % 2001.11.16, % 1999.03.17, % an oldie: 1995.10.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Bootstrapping \TEX,
+%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 used to load plain \TEX\ in a special way, but redefining
+%D a couple of primitives so that for instance font loading was
+%D ignored. For those interested, this loader is found in
+%D \type {syst-tex.tex}. Some of the comment's are Don Knuth's
+%D and more of it can be found in the plain \TEX\ format.
+
+%D Characters can have special states, that can be triggered
+%D by setting their category coded. Some are preset, others
+%D are to be set as soon as possible, otherwise we cannot
+%D define any useful macros.
+
+%catcode`\^^@ = 9 % ascii null is ignored
+%catcode`\\ = 0 % backslash is TeX escape character
+
+\catcode`\{ = 1 % left brace is begin-group character
+\catcode`\} = 2 % right brace is end-group character
+\catcode`\$ = 3 % dollar sign is math shift
+\catcode`\& = 4 % ampersand is alignment tab
+\catcode`\# = 6 % hash mark is macro parameter character
+\catcode`\^ = 7 % circumflex and uparrow are for superscripts
+\catcode`\_ = 8 % underline and downarrow are for subscripts
+\catcode`\^^I = 10 % ascii tab is a blank space
+
+%catcode`\^^M = 5 % ascii return is end-line
+%catcode`\% = 14 % percent sign is comment character
+%catcode`\ = 10 % ascii space is blank space
+%catcode`\^^? = 15 % ascii delete is invalid
+
+\catcode`\~ = 13 % tilde is active
+\catcode`\^^L = 13 % ascii form-feed
+
+%catcode`\A = 11
+%.......
+%catcode`\Z = 11
+
+%catcode`\a = 11
+%.......
+%catcode`\z = 11
+
+\chardef\active = 13
+
+\def ^^L{\par}
+\def\^^M{\ } % control <return> = control <space>
+\def\^^I{\ } % same for <tab>
+
+%D In \CONTEXT, we simply ignore end||of||file tokens:
+
+\catcode`\^^Z=9
+
+%D It makes sense to know what engine we're running so let's
+%D try to deduce it.
+
+\chardef\unknownengine = 0
+\chardef\pdftexengine = 1
+\chardef\xetexengine = 2
+\chardef\luatexengine = 3
+
+\ifx\directlua\undefined
+ \ifx\XeTeXversion\undefined
+ \ifx\pdftexversion\undefined
+ \let\texengine\unknownengine
+ \else
+ \let\texengine\pdftexengine
+ \fi
+ \else
+ \let\texengine\xetexengine
+ \fi
+\else
+ \let\texengine\luatexengine
+\fi
+
+\ifnum\texengine=\unknownengine
+ \immediate\write16{>>>}
+ \immediate\write16{>>> only pdftex, xetex and luatex are supported}
+ \immediate\write16{>>>}
+ \let\dump\relax
+ \expandafter\end
+\fi
+
+% todo: pdfsave pdfrestore pdfcolor... don't initialize them
+
+\ifnum\texengine=\luatexengine
+ \directlua 0 { % this info is stored in the format
+ if lua.name then
+ lua.name[0] = "main ctx instance"
+ end
+ if tex.extraprimitives then
+ local core = tex.extraprimitives('core')
+ local btex = tex.extraprimitives('tex')
+ local etex = tex.extraprimitives('etex')
+ local pdftex = tex.extraprimitives('pdftex')
+ local luatex = tex.extraprimitives('luatex')
+ local omega = {
+ "textdir", "pagedir", "mathdir", "pardir", "bodydir",
+ "leftghost", "rightghost", "localleftbox", "localrightbox",
+ "localinterlinepenalty", "localbrokenpenalty",
+ }
+ local aleph = {
+ "boxdir", "pagebottomoffset", "pagerightoffset",
+ }
+ for _, subset in pairs { etex, pdftex, luatex, omega, aleph } do
+ tex.enableprimitives('',subset)
+ end
+ for _, subset in pairs { core, btex, etex, pdftex, luatex, omega, aleph } do
+ tex.enableprimitives('normal',subset)
+ end
+ end
+ }
+\fi
+
+%D \ETEX\ has a not so handy way of telling you the version number,
+%D i.e. the revision number has a period in it:
+
+\long\def\gobbleoneargument#1{} % will be defined later on anyway
+
+\mathchardef\etexversion =
+ \numexpr\eTeXversion*100+\expandafter\gobbleoneargument\eTeXrevision\relax
+
+%D First we define a simplified version of the \CONTEXT\
+%D protection mechanism.
+
+\def\unprotect{\catcode`@=11 }
+\def\protect {\catcode`@=12 }
+
+\unprotect
+
+%D Some pretty important definitions:
+
+\let\bgroup={
+\let\egroup=}
+
+%D Allocation of registers is done slightly different than in plain
+%D \TEX. First of all we use different reserved counters. We also
+%D don't implement a family handler because users are not supposed
+%D to implement their own math. We reserve the lowest 31 registers
+%D for scratch purposes. Keep in mind that in the core engine
+%D some registers are reserved: counters 0 upto 9, and counter 255.
+%D
+%D As with plain \TEX\ we recommend that macro designers always use
+%D \type {\global} assignments with respect to registers numbered 1,
+%D 3, 5 \unknown\ 31, and always non||\type {\global} assignments
+%D with respect to registers 0, 2, 4, \unknown\ 30. This will prevent
+%D \quote {save stack buildup} that might otherwise occur.
+%D
+%D We reserve some registers for special (management) purposes:
+
+\countdef \minallocatedregister = 52 \minallocatedregister = 256
+\countdef \maxallocatedregister = 53 \maxallocatedregister = 32767
+\countdef \minallocatediochannel = 54 \minallocatediochannel = -1
+\countdef \maxallocatediochannel = 55 \maxallocatediochannel = 16
+\countdef \minallocatedlanguage = 56 \minallocatedlanguage = 0
+\countdef \maxallocatedlanguage = 57 \maxallocatedlanguage = 255
+\countdef \maxallocatedinsert = 58 \maxallocatedinsert = 254
+\countdef \minallocatedinsert = 59 \minallocatedinsert = 128
+\countdef \minallocatedfamily = 60 \minallocatedfamily = 128
+\countdef \maxallocatedfamily = 61 \maxallocatedfamily = 255
+
+\countdef \lastallocatedcount = 32 \lastallocatedcount = \minallocatedregister
+\countdef \lastallocateddimen = 33 \lastallocateddimen = \minallocatedregister
+\countdef \lastallocatedskip = 34 \lastallocatedskip = \minallocatedregister
+\countdef \lastallocatedmuskip = 35 \lastallocatedmuskip = \minallocatedregister
+\countdef \lastallocatedbox = 36 \lastallocatedbox = \minallocatedregister
+\countdef \lastallocatedtoks = 37 \lastallocatedtoks = \minallocatedregister
+\countdef \lastallocatedread = 38 \lastallocatedread = \minallocatediochannel
+\countdef \lastallocatedwrite = 39 \lastallocatedwrite = \minallocatediochannel
+\countdef \lastallocatedmarks = 40 \lastallocatedmarks = \minallocatedregister
+\countdef \lastallocatedlanguage = 41 \lastallocatedlanguage = \minallocatedlanguage
+\countdef \lastallocatedinsertion = 42 \lastallocatedinsertion = \minallocatedinsert
+\countdef \lastallocatedfamily = 43 \lastallocatedfamily = \minallocatedfamily
+\countdef \lastallocatedattribute = 44 \lastallocatedattribute = \minallocatedregister
+
+\countdef \mincountervalue = 125 \mincountervalue = -"7FFFFFFF % beware, we use index 125 at the lua end
+\countdef \maxcountervalue = 126 \maxcountervalue = "7FFFFFFF % beware, we use index 126 at the lua end
+\countdef \minusone = 127 \minusone = -1
+\chardef \zerocount = 0
+\chardef \plusone = 1
+
+\chardef \normalpagebox = 255 % hardcoded in the engine
+
+% A few traditional allocations:
+
+\countdef \count@ = 255 % hm, used in \newif
+\dimendef \dimen@ = 0
+\dimendef \dimen@i = 1 % global only
+\dimendef \dimen@ii = 2
+
+%D So, effectively we start allocating from 256 and upwards. The
+%D inserts sit in the range 128 upto 254. Page numbers use the
+%D counters 0 upto 9 and the pagebox is 255. Users can use the
+%D scratch registers upto 31 without problem but all others are
+%D reserved.
+
+\def\wlog#1{} % \def\wlog{\immediate\write\minusone} % write on log file (only)
+
+%D The allocators share a common helper macro.
+
+\def\newcount {\allocateregister\lastallocatedcount \count \countdef \maxallocatedregister}
+\def\newdimen {\allocateregister\lastallocateddimen \dimen \dimendef \maxallocatedregister}
+\def\newskip {\allocateregister\lastallocatedskip \skip \skipdef \maxallocatedregister}
+\def\newmuskip {\allocateregister\lastallocatedmuskip \muskip \muskipdef \maxallocatedregister}
+\def\newbox {\allocateregister\lastallocatedbox \box \mathchardef\maxallocatedregister}
+\def\newtoks {\allocateregister\lastallocatedtoks \toks \toksdef \maxallocatedregister}
+\def\newread {\allocateregister\lastallocatedread \read \chardef \maxallocatediochannel}
+\def\newwrite {\allocateregister\lastallocatedwrite \write \chardef \maxallocatediochannel}
+\def\newmarks {\allocateregister\lastallocatedmarks \marks \mathchardef\maxallocatedregister}
+\def\newlanguage{\allocateregister\lastallocatedlanguage \language\chardef \maxallocatedlanguage}
+\def\newinsert {\allocateregister\lastallocatedinsertion\insert \chardef \maxallocatedinsert}
+\def\newfamily {\allocateregister\lastallocatedfamily \fam \chardef \maxallocatedfamily}
+
+\let\newfam\newfamily
+
+% %D The next definitions are really needed (in \CONTEXT):
+
+%newlinechar=10 \def\outputnewlinechar{\rawcharacter{10}}
+\newlinechar=10 \edef\outputnewlinechar{^^J}
+
+%D One reason to start high with allocation is that it permits us to
+%D allocate consecutive ranges more easily, for instance in \MPLIB\
+%D we want to allocate a continuous range of boxes. It also permits us
+%D to do a proper upward allocation for inserts. The current code
+%D evolved from code that dealt with older engines but as all engines
+%D now provide many registers we removed all traces.
+
+\def\writestatus#1#2{\immediate\write16{#1: #2}} \def\space { }
+
+\def\allocateregisteryes#1#2#3#4#5% last class method max name
+ {\ifnum#1<#4\relax
+ \global\advance#1\plusone
+ \global#3#5=#1\relax
+ \else
+ \writestatus{warning}{no room for \string#2\space \string#5\space (max: \number#4)}%
+ \fi}
+
+\def\allocateregisternop#1#2#3#4#5% last class method max name
+ {\writestatus{warning}{\string#2 \string#5 is already defined (\string\relax\space it first)}}
+
+\def\allocateregister#1#2#3#4#5% last class method max name
+ {\ifx#5\undefined
+ \expandafter\allocateregisteryes
+ \else\ifx#5\relax
+ \expandafter\expandafter\expandafter\allocateregisteryes
+ \else
+ \expandafter\expandafter\expandafter\allocateregisternop
+ \fi\fi
+ #1#2#3#4#5}
+
+%D Since the number of chars exceed 256 now, we can use \type
+%D {\chardef} instead of the more limited \type {\mathchardef}.
+
+\ifnum\texengine>\pdftexengine
+ \def\newbox {\allocateregister\lastallocatedbox \box \chardef\maxallocatedregister}
+ \def\newmarks{\allocateregister\lastallocatedmarks\marks\chardef\maxallocatedregister}
+\fi
+
+%D Attributes are something very \LUATEX. In \CONTEXT\ you are not
+%D supposed to use the attributes directly but always allocate then
+%D first. For instance attribute~0 is reserved for special purposes
+%D (this might change).
+
+\ifnum\texengine=\luatexengine
+ \let\attributeunsetvalue\mincountervalue % used to be \minusone
+ \def\newattribute{\allocateregister\lastallocatedattribute\attribute\attributedef\maxallocatedregister}
+\fi
+
+%D Not used by \CONTEXT\ but for instance \PICTEX\ needs it. It's a
+%D trick to force strings instead of tokens that take more memory.
+%D It's a trick to trick to force strings.
+
+\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+
+%D \macros
+%D {scratchcounter,
+%D scratchdimen,scratchskip,scratchmuskip,
+%D scratchbox,
+%D scratchtoks}
+%D
+%D We now define a few scratch registers, so that successive
+%D loads at least have some available.
+
+\newcount \scratchcounter \newcount \globalscratchcounter
+\newdimen \scratchdimen \newdimen \globalscratchdimen
+\newskip \scratchskip \newskip \globalscratchskip
+\newmuskip \scratchmuskip \newmuskip \globalscratchmuskip
+\newtoks \scratchtoks \newtoks \globalscratchtoks
+\newbox \scratchbox \newbox \globalscratchbox
+
+\newcount\scratchcounterone \newcount\scratchcountertwo \newcount\scratchcounterthree
+\newdimen \scratchdimenone \newdimen \scratchdimentwo \newdimen \scratchdimenthree
+\newdimen \scratchskipone \newdimen \scratchskiptwo \newdimen \scratchskipthree
+\newbox \scratchmuskipone \newbox \scratchmuskiptwo \newbox \scratchmuskipthree
+\newtoks \scratchtoksone \newtoks \scratchtokstwo \newtoks \scratchtoksthree
+\newbox \scratchboxone \newbox \scratchboxtwo \newbox \scratchboxthree
+
+%D More allocations:
+
+\newskip \zeroskip \zeroskip = 0pt plus 0pt minus 0pt
+\newdimen\zeropoint \zeropoint = 0pt
+\newdimen\onepoint \onepoint = 1pt
+\newdimen\maxdimen \maxdimen = 16383.99999pt
+\newdimen\onebasepoint \onebasepoint = 1bp
+\newdimen\scaledpoint \scaledpoint = 1sp
+\newdimen\thousandpoint\thousandpoint= 1000pt
+
+\let\points\onepoint
+
+\newtoks \emptytoks
+
+%D And even more:
+
+%newcount \minusone \minusone = -1
+\newcount \minustwo \minustwo = -2
+%chardef \zerocount = 0
+%chardef \plusone = 1
+\chardef \plustwo = 2
+\chardef \plusthree = 3
+\chardef \plusfour = 4
+\chardef \plusfive = 5
+\chardef \plussix = 6
+\chardef \plusseven = 7
+\chardef \pluseight = 8
+\chardef \plusnine = 9
+\chardef \plusten = 10
+\chardef \plussixteen = 16
+\chardef \plushundred = 100
+\chardef \pluscxxvii = 127
+\chardef \pluscxxviii = 128
+\chardef \pluscclv = 255
+
+\ifnum\texengine=\luatexengine
+ \chardef \pluscclvi = 256
+ \chardef \plusthousand = 1000
+ \chardef \plustenthousand = 10000
+ \chardef \plustwentythousand = 20000
+ \chardef \medcard = 32768
+ \chardef \maxcard = 65536 % pdftex has less mathchars
+\else
+ \mathchardef\pluscclvi = 256
+ \mathchardef\plusthousand = 1000
+ \mathchardef\plustenthousand = 10000
+ \mathchardef\plustwentythousand = 20000
+ \newcount \medcard \medcard = 32768 % pdftex has less mathchars
+ \newcount \maxcard \maxcard = 65536 % pdftex has less mathchars
+\fi
+
+%D We prefer the more readable variant than in plain
+%D \TEX. User should only use \type {\emptybox}:
+
+\newbox\voidbox
+
+\def\emptybox {\box \voidbox}
+\def\unvoidbox{\unhbox\voidbox}
+
+\let\leavevmode\unvoidbox % we prefer to use \dontleavehmode
+
+%D Some expected plain variants follow. We don't reuse registers
+%D because we don't want clashes.
+
+\newdimen\p@ \p@ \onepoint
+\newcount\m@ne \m@ne \minusone
+\newdimen\z@ \z@ \zeropoint
+\let \@ne \plusone
+\let \tw@ \plustwo
+\let \thr@@ \plusthree
+\let \sixt@@n \sixteen
+\let \@cclv \pluscclv
+\let \@cclvi \pluscclvi
+\newbox \voidb@x
+\newtoks \toks@
+
+%D We define \type {\newif} a la plain \TEX, but will
+%D redefine it later. As Knuth says:
+%D
+%D \startnarrower
+%D And here's a different sort of allocation: for example,
+%D
+%D \starttyping
+%D \newif\iffoo
+%D \stoptyping
+%D
+%D creates \type {\footrue}, \type {\foofalse} to go
+%D with \type {\iffoo}.
+%D \stopnarrower
+
+\def\newif#1%
+ {\count@\escapechar
+ \escapechar\minusone
+ \expandafter\expandafter\expandafter\def\@if #1{true}{\let#1\iftrue }%
+ \expandafter\expandafter\expandafter\def\@if#1{false}{\let#1\iffalse}%
+ \@if#1{false}% the condition starts out false
+ \escapechar\count@}
+
+\def\@if#1#2%
+ {\csname\expandafter\if@\string#1#2\endcsname}
+
+\bgroup % `if' is required
+
+ \uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}
+
+\egroup
+
+%D Let's test this one:
+
+\newif\ifdone
+
+%D \macros
+%D {@@escape,@@begingroup,@@endgroup,@@mathshift,@@alignment,
+%D @@endofline,@@parameter,@@superscript,@@subscript,
+%D @@ignore,@@space,@@letter,@@other,@@active,@@comment}
+%D
+%D In \CONTEXT\ we sometimes manipulate the \CATCODES\ of certain
+%D characters. Because we are not that good at remembering numbers,
+%D we introduce some symbolic names.
+
+%D As we now have catc-* files, we also have more readable names
+
+\chardef\@@escape = 0
+\chardef\@@begingroup = 1
+\chardef\@@endgroup = 2
+\chardef\@@mathshift = 3
+\chardef\@@alignment = 4
+\chardef\@@endofline = 5
+\chardef\@@parameter = 6
+\chardef\@@superscript = 7
+\chardef\@@subscript = 8
+\chardef\@@ignore = 9
+\chardef\@@space = 10
+\chardef\@@letter = 11
+\chardef\@@other = 12 \chardef\other = 12
+\chardef\@@active = 13 \chardef\active = 13
+\chardef\@@comment = 14
+
+%D Constants to be used with \type {\currentgrouptype}.
+
+\chardef\@@bottomlevelgroup = 0
+\chardef\@@simplegroup = 1
+\chardef\@@hboxgroup = 2
+\chardef\@@adjustedhboxgroup = 3
+\chardef\@@vboxgroup = 4
+\chardef\@@vtopgroup = 5
+\chardef\@@aligngroup = 6
+\chardef\@@noaligngroup = 7
+\chardef\@@outputgroup = 8
+\chardef\@@mathgroup = 9
+\chardef\@@discretionarygroup = 10
+\chardef\@@insertgroup = 11
+\chardef\@@vcentergroup = 12
+\chardef\@@mathchoicegroup = 13
+\chardef\@@semisimplegroup = 14
+\chardef\@@mathshiftgroup = 15
+\chardef\@@mathleftgroup = 16
+
+\chardef\@@vadjustgroup = \@@insertgroup
+
+%D Constants to be used with \type {\interactionmode}.
+
+\chardef\@@batchmode = 0
+\chardef\@@nonstopmode = 1
+\chardef\@@scrollmode = 2
+\chardef\@@errorstopmode = 3
+
+%D Constants to be used with \type {\lastnodetype}. The \type
+%D {\lastnodetype} primitive is \ETEX\ compliant. The valid range is
+%D still -1 .. 15 and glyph nodes have number 0 (used to be char
+%D node) and ligature nodes are mapped to 7. That way macro packages
+%D can use the same symbolic names as in traditional \ETEX. Keep in
+%D mind that the internal node numbers are different and that there
+%D are more node types that 15.
+
+\chardef\@@charnode = 0
+\chardef\@@hlistnode = 1
+\chardef\@@vlistnode = 2
+\chardef\@@rulenode = 3
+\chardef\@@insertnode = 4
+\chardef\@@marknode = 5
+\chardef\@@adjustnode = 6
+\chardef\@@ligaturenode = 7
+\chardef\@@discretionarynode = 8
+\chardef\@@whatsitnode = 9
+\chardef\@@mathnode = 10
+\chardef\@@gluenode = 11
+\chardef\@@kernnode = 12
+\chardef\@@penaltynode = 13
+\chardef\@@unsetnode = 14
+\chardef\@@mathsnode = 15
+
+%D Constants to be used with \type {\currentiftype}.
+
+\chardef\@@charif = 1
+\chardef\@@catif = 2
+\chardef\@@numif = 3
+\chardef\@@dimif = 4
+\chardef\@@oddif = 5
+\chardef\@@vmodeif = 6
+\chardef\@@hmodeif = 7
+\chardef\@@mmodeif = 8
+\chardef\@@innerif = 9
+\chardef\@@voidif = 10
+\chardef\@@hboxif = 11
+\chardef\@@vboxif = 12
+\chardef\@@xif = 13
+\chardef\@@eofif = 14
+\chardef\@@trueif = 15
+\chardef\@@falseif = 16
+\chardef\@@caseif = 17
+\chardef\@@definedif = 18
+\chardef\@@csnameif = 19
+\chardef\@@fontcharif = 20
+
+%D Of course we want even bigger log files, so we copied this
+%D from the \ETEX\ source files.
+%D
+%D When watching such logs, beware of nasty side effects of
+%D \type {\scantokens}, as in:
+%D
+%D \starttyping
+%D \bgroup
+%D \lccode`a=12\lowercase{\xdef\whatever{a}}\egroup
+%D \def\whatever{test \whatever test}
+%D \scantokens\expandafter{\whatever}
+%D \egroup
+%D \stoptyping
+%D
+%D In \LUATEX\ we have ways around this.
+
+\def\tracingall
+ {\tracingonline \plusone
+ \tracingcommands \plusthree
+ \tracingstats \plustwo
+ \tracingpages \plusone
+ \tracingoutput \plusone
+ \tracinglostchars \plustwo
+ \tracingmacros \plustwo
+ \tracingparagraphs\plusone
+ \tracingrestores \plusone
+ \showboxbreadth \maxdimen
+ \showboxdepth \maxdimen
+ \tracinggroups \plusone
+ \tracingifs \plusone
+ \tracingscantokens\plusone
+ \tracingnesting \plusone
+ \tracingassigns \plustwo
+ \errorstopmode}
+
+\def\loggingall
+ {\tracingall
+ \tracingonline \zerocount}
+
+\def\tracingnone
+ {\tracingassigns \zerocount
+ \tracingnesting \zerocount
+ \tracingscantokens\zerocount
+ \tracingifs \zerocount
+ \tracinggroups \zerocount
+ \showboxdepth \plusthree
+ \showboxbreadth \plusfive
+ \tracingrestores \zerocount
+ \tracingparagraphs\zerocount
+ \tracingmacros \zerocount
+ \tracinglostchars \plusone
+ \tracingoutput \zerocount
+ \tracingpages \zerocount
+ \tracingstats \zerocount
+ \tracingcommands \zerocount
+ \tracingonline \zerocount}
+
+%D Just for tracing purposes we set:
+
+\tracingstats\plusone
+
+%D Here we also save \type {\input}, more will be saved later.
+
+\ifdefined\normalinput \else \let\normalinput\input \fi
+
+%D We don't like outer commands, and we always want access
+%D to the original \type {\input} primitive.
+
+\let\normalouter\outer \def\outer{} % no longer \relax
+
+%D To circumvent dependencies, we can postpone certain
+%D initializations to dumping time, by appending them to the
+%D \type {\everydump} token register.
+
+\ifdefined\normaldump \else \let\normaldump\dump \fi
+
+\newtoks\everydump
+
+\def\dump{\the\everydump\normaldump}
+
+%D The same applies for the startup actions.
+
+\ifdefined\normaleveryjob \else \let\normaleveryjob\everyjob \fi
+
+\let\everyjob\relax \newtoks\everyjob
+
+\normaleveryjob{\the\everyjob}
+
+\def\appendtotoks #1{\def\temp{#1}\afterassignment\doappendtotoks \scratchtoks=}
+\def\prependtotoks#1{\def\temp{#1}\afterassignment\doprependtotoks\scratchtoks=}
+
+\def\doappendtotoks {\expandafter\expandafter\expandafter{\expandafter\the\expandafter\temp\the\scratchtoks}}
+\def\doprependtotoks{\expandafter\expandafter\expandafter{\expandafter\the\expandafter\scratchtoks\the\temp}}
+
+%D \macros
+%D {begcsname}
+%D
+%D Handy for \ETEX-only usage (avoids making \type {\relax}'s:
+
+\def\begcsname#1\endcsname{\ifcsname#1\endcsname\csname#1\endcsname\fi}
+
+%D Now come a few macros that might be needed in successive loading:
+
+\let\endgraf\par
+\let\endline\cr
+
+\def\space{ }
+\def\empty{}
+\def\null {\hbox{}}
+
+%D The following two might be overloaded later on but some modules need
+%D then earlier. These functionality is reflected in the name and will not
+%D change.
+
+\bgroup
+ \catcode`\^^M=\active%
+ \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \global\let^^M\par%
+\egroup
+
+\bgroup
+ \gdef\obeyspaces{\catcode`\ \active}%
+ \obeyspaces\global\let =\space%
+\egroup
+
+%D Also needed might be a simple loop structure and we borrow
+%D plain \TEX's one as it is often expected to be present and
+%D it is about the fastest you can get. Beware: this macro
+%D does not support nested loops. We use a namespace prefix
+%D \type {@@pln}.
+
+\long\def\loop#1\repeat{\long\def\@@plnbody{#1}\@@plniterate}
+
+%D The following makes \type {\loop} \unknown\ \type {\if}
+%D \unknown\ \type {\repeat} skippable (clever trick):
+
+\let\repeat\fi % so both \loop and \repeat are reserved words!
+
+%D The original (no \type {@@pln} there):
+%D
+%D \starttyping
+%D \def\@@plniterate{\@@plnbody\let\next\@@plniterate\else\let\next\relax\fi\next}
+%D \stoptyping
+%D
+%D A more efficient alternative:
+%D
+%D \starttyping
+%D \def\@@plniterate{\@@plnbody\expandafter\@@plniterate\else\expandafter\relax\fi}
+%D \stoptyping
+%D
+%D An even more efficient one:
+
+\def\@@plniterate{\@@plnbody\expandafter\@@plniterate\else\fi}
+
+%D We don't define a real output routine yet but at least get rid
+%D of pages:
+
+\output{\shipout\box\normalpagebox}
+
+%D Although we don't add pagenumbers yet we alias the default
+%D register used for counting pages:
+
+\countdef\pageno=0 \pageno=1 % first page is number 1
+
+%D Beside the raw counter \type {\pageno} the \type {\folio}
+%D macro provides the value.
+
+\def\folio{\the\pageno} % kind of expected and therefore reserved
+
+%D The following registers are kind of standard and (for the moment)
+%D we define them here. This might change.
+
+\newskip \bigskipamount \bigskipamount = 12pt plus 4pt minus 4pt
+\newskip \medskipamount \medskipamount = 6pt plus 2pt minus 2pt
+\newskip \smallskipamount \smallskipamount = 3pt plus 1pt minus 1pt
+
+\baselineskip = 12pt
+\lineskip = 1pt
+\lineskiplimit = 0pt
+
+%D Again a few kind-of-extensions the core:
+
+\newskip \hideskip \hideskip = -1000pt plus 1fill
+\newskip \centering \centering = 0pt plus 1000pt minus 1000pt
+
+\def\hidewidth % for alignment entries that can stick out
+ {\hskip\hideskip}
+
+\def\ialign % initialized \halign
+ {\everycr{}%
+ \tabskip\zeroskip
+ \halign}
+
+\newcount \mscount
+
+\def\spanomit{\span\omit} % bypass error message
+
+\def\multispan#1%
+ {\omit
+ \mscount#1\relax
+ \loop
+ \ifnum\mscount>\plusone
+ \spanomit \advance\mscount\minusone
+ \repeat}
+
+%D The next section deals with selective definitions in
+%D later modules. One can of course use the \type {\texengine}
+%D number that we defined earlier instead.
+
+\bgroup \obeylines
+ \gdef\pickupSOMETEX#1%
+ {\expandafter\gdef\csname begin#1\endcsname{\bgroup\obeylines\dopickupSOMETEX{#1}}}
+ \gdef\dopickupSOMETEX#1#2
+ % {\egroup\immediate\write16{special code for #1 -> [line \the\inputlineno] \detokenize{#2}}}
+ {\egroup}
+\egroup
+
+\let\endTEX \relax \long\def\beginTEX #1\endTEX {}
+\let\endETEX \relax \long\def\beginETEX #1\endETEX {}
+\let\endXETEX \relax \long\def\beginXETEX #1\endXETEX {}
+\let\endLUATEX\relax \long\def\beginLUATEX#1\endLUATEX{}
+\let\endOLDTEX\relax \long\def\beginOLDTEX#1\endOLDTEX{}
+\let\endNEWTEX\relax \long\def\beginNEWTEX#1\endNEWTEX{}
+
+\pickupSOMETEX{ETEX}
+
+\ifnum\texengine=\xetexengine
+ \pickupSOMETEX{XETEX}
+\fi
+\ifnum\texengine=\luatexengine
+ \pickupSOMETEX{LUATEX}
+\fi
+\ifnum\texengine<\xetexengine
+ \pickupSOMETEX{OLDTEX}
+\else
+ \pickupSOMETEX{NEWTEX}
+\fi
+
+%D \macros
+%D {bindprimitive}
+%D
+%D We can remap primitives (which is needed because of changes in
+%D for instance \PDFTEX).
+
+\def\bindprimitive#1 #2 % new old
+ {\ifcsname#1\endcsname \else \ifcsname#2\endcsname
+ \expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname
+ \fi \fi}
+
+%D Because \XETEX\ also implements some \PDFTEX\ functionality, we take
+%D care of this here instead of a dedicated module. Later modules need
+%D to handle the undefined cases.
+
+%D These messy checks will disappear.
+
+% new after 1.10, watch the change in prefix
+
+\bindprimitive quitvmode ptexquitvmode
+\bindprimitive noligatures ptexnoligatures
+\bindprimitive setrandomseed ptexsetrandomseed
+\bindprimitive uniformdeviate ptexuniformdeviate
+
+\bindprimitive quitvmode pdfquitvmode
+\bindprimitive noligatures pdfnoligatures
+\bindprimitive setrandomseed pdfsetrandomseed
+\bindprimitive uniformdeviate pdfuniformdeviate
+
+\bindprimitive resettimer pdfresettimer
+\bindprimitive elapsedtime pdfelapsedtime
+
+% new per 1.40
+
+\bindprimitive ifprimitive ifpdfprimitive
+\bindprimitive primitive pdfprimitive
+\bindprimitive ifabsdim ifpdfabsdim
+\bindprimitive ifabsnum ifpdfabsnum
+
+\ifnum\texengine=\xetexengine \else % this test might disappear some day
+
+ \pdfminorversion \plusfive
+
+ \ifdefined\pdfcompresslevel \else \newcount\pdfcompresslevel \fi
+ \ifdefined\pdfobjcompresslevel \else \newcount\pdfobjcompresslevel \fi
+ \ifdefined\pdfgentounicode \else \newcount\pdfgentounicode \fi \pdfgentounicode \plusone
+ \ifdefined\pdfinclusioncopyfonts\else \newcount\pdfinclusioncopyfonts \fi \pdfinclusioncopyfonts\plusone
+
+ \def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount}
+ \def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine }
+ \def\normalpdfcompression {\pdfobjcompresslevel\plusthree \pdfcompresslevel\plusthree}
+
+ \normalpdfcompression
+
+ \let\normalsetrandomseed \setrandomseed
+ \let\normaluniformdeviate\uniformdeviate
+
+\fi
+
+%D Handy.
+
+\ifnum\texengine=\luatexengine
+ \ifdefined\suppresslongerror % for the moment test
+ \suppresslongerror\plusone
+ \fi
+\fi
+
+%D Basic status stuff.
+
+\newif\ifproductionrun
+
+%D We need to make sure that we start up in \DVI\ mode, so,
+%D after testing for running \PDFTEX, we default to \DVI.
+
+\ifx\pdftexversion\undefined \newcount\pdfoutput \fi \pdfoutput=0
+
+%D For those who expect this \unknown
+
+\ifx\fmtname \undefined \def\fmtname {ConTeXt Minimized Plain TeX} \fi
+\ifx\fmtversion\undefined \def\fmtversion{3.1415926} \fi
+
+\let\normalfmtversion\fmtversion
+
+%D A few bonus macros:
+
+\def\modulonumber#1#2{\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
+\def\dividonumber#1#2{\the\numexpr(#2-(#1/2))/#1\relax}
+
+\ifnum\texengine=\xetexengine
+ \edef\xetexversion {\numexpr\XeTeXversion*100+(\expandafter\gobbleoneargument\XeTeXrevision-5)/10\relax}
+ \edef\xetexrevision {\the\numexpr(\expandafter\gobbleoneargument\XeTeXrevision-50)/100\relax}
+\fi
+
+\ifcase\texengine
+ \def\texenginename {impossible}
+ \edef\texengineversion{0}
+\or
+ \def\texenginename {pdfTeX}
+ \edef\texengineversion{\dividonumber{100}\pdftexversion.\modulonumber{100}\pdftexversion.\pdftexrevision}
+\or
+ \def\texenginename {XeTeX}
+ \edef\texengineversion{\dividonumber{100}\xetexversion .\modulonumber{100}\xetexversion .\xetexrevision}
+\or
+ \def\texenginename {LuaTeX}
+ \edef\texengineversion{\dividonumber{100}\luatexversion.\modulonumber{100}\luatexversion.\luatexrevision}
+\else
+ \def\texenginename {impossible}
+ \edef\texengineversion{0}
+\fi
+
+%D While cleaning this code up a bit I was listening to Heather
+%D Nova's \CD\ Redbird. The first song on that \CD\ ends with
+%D a few lines suitable for ending this initialization module:
+%D
+%D \startlines
+%D And there's so much I can do for you
+%D Given time I know that I can prove
+%D Now my world is opened up to you
+%D Come inside
+%D
+%D Welcome to my life
+%D Welcome to my world
+%D Come inside
+%D \stoplines
+%D
+%D So let's see what \TEX\ can do now that we've opened up
+%D the basic machinery.
+
+\protect \endinput
diff --git a/tex/context/base/syst-ltx.tex b/tex/context/base/syst-ltx.tex
new file mode 100644
index 000000000..ae89ff25b
--- /dev/null
+++ b/tex/context/base/syst-ltx.tex
@@ -0,0 +1,56 @@
+%D \module
+%D [ file=syst-ltx,
+%D version=2009.10.13,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=General,
+%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.
+
+%D \macros
+%D {newcommand}
+%D
+%D This module replaces \type {t-bibltx} and implements the
+%D \LATEX\ newcommand (sort of). This command is not to be
+%D used directly but only is there for the occasional
+%D \BIBTEX\ file that uses it.
+%D
+%D \starttyping
+%D \newcommand\oeps {oeps}
+%D \newcommand\oeps[6] {oeps[#1]#6}
+%D \newcommand\oeps[6][whatever]{oeps[#1]#6}
+%D \stoptyping
+
+\unprotect
+
+\def\newcommand#1%
+ {\dotripleempty\donewcommand[#1]}
+
+\def\donewcommand
+ {\ifthirdargument
+ \expandafter\donewcommandtwo
+ \else\ifsecondargument
+ \expandafter\expandafter\expandafter\donewcommandone
+ \else
+ \expandafter\expandafter\expandafter\donewcommandzero
+ \fi\fi}
+
+\def\donewcommandzero[#1][#2][#3]%
+ {\long\def#1}
+
+\def\donewcommandone[#1][#2][#3]%
+ {\scratchtoks{\long\def#1}%
+ \dorecurse{#2}{\scratchtoks\expandafter{\the\scratchtoks######1}}%
+ \the\scratchtoks}
+
+\def\donewcommandtwo[#1][#2][#3]%
+ {\long\def#1{\doifnextcharelse[{\getvalue{>>\string#1>>}}{\getvalue{>>\string#1>>}[#3]}}%
+ \scratchtoks{\long\setvalue{>>\string#1>>}[##1]}%
+ \dostepwiserecurse{2}{#2}{1}{\scratchtoks\expandafter{\the\scratchtoks######1}}%
+ \the\scratchtoks}
+
+\protect \endinput
diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua
new file mode 100644
index 000000000..640282953
--- /dev/null
+++ b/tex/context/base/syst-lua.lua
@@ -0,0 +1,109 @@
+if not modules then modules = { } end modules ['syst-lua'] = {
+ version = 1.001,
+ comment = "companion to syst-lua.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local texsprint, texprint, texwrite, texiowrite_nl = tex.sprint, tex.print, tex.write, texio.write_nl
+local format, find = string.format, string.find
+local lpegmatch = lpeg.match
+
+local ctxcatcodes = tex.ctxcatcodes
+
+commands = commands or { } cs = commands -- shorter
+
+function commands.writestatus(a,b,c,...)
+ if c then
+ texiowrite_nl(format("%-16s: %s\n",a,format(b,c,...)))
+ else
+ texiowrite_nl(format("%-16s: %s\n",a,b)) -- b can have %'s
+ end
+end
+function commands.writedebug(a,b,c,...)
+ if c then
+ texiowrite_nl(format("%-16s| %s\n",a,format(b,c,...)))
+ else
+ texiowrite_nl(format("%-16s| %s\n",a,b)) -- b can have %'s
+ end
+end
+
+function commands.report(s,t,...)
+ commands.writestatus("!"..s,format(t,...))
+end
+
+local function testcase(b)
+ if b then -- faster with if than with expression
+ texsprint(ctxcatcodes,"\\firstoftwoarguments")
+ else
+ texsprint(ctxcatcodes,"\\secondoftwoarguments")
+ end
+end
+
+commands.testcase = testcase
+commands.doifelse = testcase
+
+function commands.doif(b)
+ if b then
+ texsprint(ctxcatcodes,"\\firstofoneargument")
+ else
+ texsprint(ctxcatcodes,"\\gobbleoneargument")
+ end
+end
+function commands.doifnot(b)
+ if b then
+ texsprint(ctxcatcodes,"\\gobbleoneargument")
+ else
+ texsprint(ctxcatcodes,"\\firstofoneargument")
+ end
+end
+
+function commands.boolcase(b)
+ if b then texwrite(1) else texwrite(0) end
+end
+
+function commands.doifelsespaces(str)
+ return commands.doifelse(find(str,"^ +$"))
+end
+
+local s = lpeg.Ct(lpeg.splitat(","))
+local h = { }
+
+function commands.doifcommonelse(a,b)
+ local ha = h[a]
+ local hb = h[b]
+ if not ha then ha = lpegmatch(s,a) h[a] = ha end
+ if not hb then hb = lpegmatch(s,b) h[b] = hb end
+ for i=1,#ha do
+ for j=1,#hb do
+ if ha[i] == hb[j] then
+ return testcase(true)
+ end
+ end
+ end
+ return testcase(false)
+end
+
+function commands.doifinsetelse(a,b)
+ local hb = h[b]
+ if not hb then hb = lpegmatch(s,b) h[b] = hb end
+ for i=1,#hb do
+ if a == hb[i] then
+ return testcase(true)
+ end
+ end
+ return testcase(false)
+end
+
+function commands. def (cs,value) texsprint(ctxcatcodes,format( "\\def\\%s{%s}",cs,value)) end
+function commands.edef (cs,value) texsprint(ctxcatcodes,format("\\edef\\%s{%s}",cs,value)) end
+function commands.gdef (cs,value) texsprint(ctxcatcodes,format("\\gdef\\%s{%s}",cs,value)) end
+function commands.xdef (cs,value) texsprint(ctxcatcodes,format("\\xdef\\%s{%s}",cs,value)) end
+function commands.chardef(cs,value) texsprint(ctxcatcodes,format("\\chardef\\%s=%s\\relax",cs,value)) end
+
+local pattern = lpeg.patterns.validdimen
+
+function commands.doifdimenstringelse(str)
+ testcase(lpegmatch(pattern,str))
+end
diff --git a/tex/context/base/syst-lua.mkiv b/tex/context/base/syst-lua.mkiv
new file mode 100644
index 000000000..40cd9f756
--- /dev/null
+++ b/tex/context/base/syst-lua.mkiv
@@ -0,0 +1,37 @@
+%D \module
+%D [ file=syst-lua,
+%D version=2008.01.25,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Helper macros based on \LUA,
+%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.
+
+\registerctxluafile{syst-lua}{1.001}
+
+\unprotect
+
+\def\expdoifelse#1#2{\ctxlua{commands.doifelse(\!!bs#1\!!es==\!!bs#2\!!es)}}
+\def\expdoif #1#2{\ctxlua{commands.doif (\!!bs#1\!!es==\!!bs#2\!!es)}}
+\def\expdoifnot #1#2{\ctxlua{commands.doifnot (\!!bs#1\!!es==\!!bs#2\!!es)}}
+
+% \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")}}
+
+% we define these here, just in case ...
+
+\def\luastringsep{===} % this permits \typefile{self} otherwise nested b/e sep problems
+
+\edef\!!bs{[\luastringsep[}
+\edef\!!es{]\luastringsep]}
+
+\def\writestatus#1#2{\ctxlua{commands.writestatus(\!!bs#1\!!es,\!!bs#2\!!es)}}
+
+\protect \endinput
diff --git a/tex/context/base/syst-new.mkii b/tex/context/base/syst-new.mkii
new file mode 100644
index 000000000..53ba18ffd
--- /dev/null
+++ b/tex/context/base/syst-new.mkii
@@ -0,0 +1,868 @@
+%D \module
+%D [ file=syst-new,
+%D version=1997.01.03,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=New Ones,
+%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 Code from this module will move. For instance to
+%D syst-dat.tex (datastructures).
+
+\unprotect
+
+% pretty ugly but fast
+
+% \copycsname xxx\endcsname\csname ..\endcsname
+
+\def\copycsname{\@EA\@EA\@EA\let\@EA\@EA\csname}
+
+% \letcscsname \crap \csname ..\endcsname
+% \letcsnamecs \csname ..\endcsname\crap
+% \letcsnamecsname\csname ..\endcsname\csname ..\endcsname
+
+\def\letcscsname {\@EA\let\@EA}
+\def\letcsnamecs {\@EA\let}
+\def\letcsnamecsname{\@EA\@EA\@EA\let\@EA\@EA}
+
+% another one, add an item to a commalist
+
+\def\addvalue#1#2% cs item
+ {\ifundefined{#1}\@EA\let\csname#1\endcsname\empty\fi
+ \expanded{\addtocommalist{#2}\@EA\noexpand\csname#1\endcsname}}
+
+% faster, and looks okay
+
+\def\unspaced#1%
+ {\dounspaced#1\end}
+
+\def\dounspaced#1%
+ {\ifx#1\end
+ \@EA\gobbleoneargument
+ \else
+ \ifx#1\blankspace\else#1\fi
+ \fi
+ \dounspaced}
+
+\def\unspaceargument#1\to#2%
+ {\defconvertedargument#2{#1}%
+ \@EA\edef\@EA#2\@EA{\@EA\unspaced\@EA{#2}}}
+
+\def\unspaceafter#1#2%
+ {\edef\ascii{\dounspaced#2\end}\@EA#1\@EA{\ascii}}
+
+% etex, much faster
+%
+% \def\unspaceargument#1\to#2%
+% {\scratchcounter\catcode'32\catcode32=\@@ignore
+% \scantokens{\edef#2{#1}}%
+% \catcode32=\scratchcounter}
+
+\def\unspaceafter#1#2%
+ {\edef\ascii{\dounspaced#2\end}\@EA#1\@EA{\ascii}}
+
+% sometimes handy:
+
+\def\doifhasspaceelse#1%
+ {\edef\!!stringa{#1}%
+ \expanded{\dodoifhasspaceelse#1\space}\empty\relax}
+
+\def\dodoifhasspaceelse#1 #2#3\relax % \space\empty\relax
+ {\ifx\!!stringa\space
+ \@EA\firstoftwoarguments
+ \else\ifx#2\empty
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
+
+% this will replace loadfile once and alike !!! todo
+
+\def\@flg@{@flg@}
+
+\def\setflag#1%
+ {\@EA\dodoglobal\@EA\chardef\csname\@flg@#1\endcsname\zerocount}
+
+\def\resetflag#1%
+ {\@EA\dodoglobal\@EA\chardef\csname\@flg@#1\endcsname\plusone}
+
+\let\ifflagged\ifcase
+
+\def\flag#1{\csname\@flg@#1\endcsname}
+
+\def\doifelseflagged#1%
+ {\@EA\ifx\csname\@flg@#1\endcsname\relax
+ \@EA\secondoftwoarguments
+ \else\ifcase\csname\@flg@#1\endcsname
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi\fi}
+
+\def\doifnotflagged#1%
+ {\@EA\ifx\csname\@flg@#1\endcsname\relax
+ \@EA\firstofoneargument
+ \else\ifcase\csname\@flg@#1\endcsname
+ \@EAEAEA\gobbleoneargument
+ \else
+ \@EAEAEA\firstofoneargument
+ \fi\fi}
+
+\def\inheritparameter[#1]#2[#3]#4[#5]% tag tokey fromkey % [bypasses k!prefix]
+ {\@EAEAEA\def\@EA\csname\@EA#1\@EA#3\@EA\endcsname\@EA
+ {\csname#1#5\endcsname}}
+
+% \buildarray[test][aa,bb,cc,dd,ee,ff]
+% \setarrayelement{test}{1}{qq}
+% \arrayelement{test}{1}
+% \arraylength{test}
+%
+% \def\buildarray[#1][#2]%
+% {\scratchcounter=0
+% \def\docommand##1%
+% {\advance\scratchcounter by 1
+% \setvalue{@@aa#1\the\scratchcounter}{##1}}%
+% \processcommalist[#2]\docommand
+% \setevalue{@@aa#1}{\the\scratchcounter}}%
+%
+% \def\setarrayelement#1#2{\setvalue{@@aa#1#2}}
+% \def\arrayelement #1#2{\getvalue{@@aa#1#2}}
+% \def\arraylength #1{\getvalue{@@aa#1}}
+
+% \newsignal\junksignal
+%
+% \def\setjunksignal%
+% {\ifhmode
+% \hskip\junksignal
+% \let\removejunkspaces\doremovejunkspaces
+% \else
+% \let\removejunkspaces\relax
+% \fi}
+%
+% \def\doremovejunkspaces%
+% {\doloop{\ifdim\lastskip=\junksignal\unskip\else\exitloop\fi}}
+
+% \def\doifnonzeropositiveelse#1#2#3%
+% {\bgroup
+% \setbox\scratchbox=\hbox{\scratchcounter=0#1}%
+% \ifdim\wd\scratchbox=\!!zeropoint\egroup#2\else\egroup#3\fi}
+%
+% \def\dodoifnonzeropositiveelse#1#2\end#3#4%
+% {\egroup
+% \ifx#1\relax#3\else#4\fi}
+%
+% \def\doifnonzeropositiveelse#1%
+% {\bgroup
+% \afterassignment\dodoifnonzeropositiveelse\scratchcounter=0#1\relax\empty\end}
+
+\def\dodoifnonzeropositiveelse#1#2\end % #3#4%
+ {\ifx#1\relax
+ \ifcase\scratchcounter
+ \endgroup
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \endgroup
+ \@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \endgroup
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\doifnonzeropositiveelse#1%
+ {\begingroup\afterassignment\dodoifnonzeropositiveelse\scratchcounter=0#1\relax\empty\end}
+
+% here ?
+
+\def\dosetrawvalue #1#2#3{\@EA \def\csname#1#2\endcsname{#3}}
+\def\dosetrawevalue#1#2#3{\@EA\edef\csname#1#2\endcsname{#3}}
+\def\dosetrawgvalue#1#2#3{\@EA\gdef\csname#1#2\endcsname{#3}}
+\def\dosetrawxvalue#1#2#3{\@EA\xdef\csname#1#2\endcsname{#3}}
+
+\def\getrawparameters {\dogetparameters\dosetrawvalue }
+\def\getraweparameters {\dogetparameters\dosetrawevalue}
+\def\getrawgparameters {\dogetparameters\dosetrawgvalue}
+\def\getrawxparameters {\dogetparameters\dosetrawxvalue}
+
+\def\globalgetrawparameters{\dogetparameters\dosetrawgvalue} % obsolete
+
+\def\splitskip#1%
+ {\scratchskip\zeropoint \!!plus \onepoint \!!minus \onepoint
+ \advance\scratchskip#1\relax % \relax is realy needed here
+ \expandafter\SPLITSKIP\the\scratchskip}
+
+{\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\l=\@@other
+ \catcode`\u=\@@other
+ \catcode`\s=\@@other
+ \catcode`\m=\@@other
+ \catcode`\i=\@@other
+ \catcode`\n=\@@other
+ \catcode`\t=\@@other
+ \gdef\SPLITSKIP#1pt plus #2pt minus #3pt%
+ {\DOSPLITSKIP#1 #2 #3 }}
+
+% \def\DOSPLITSKIP#1 #2 #3
+% {\dimen0=#1pt\dimen2=#2pt\dimen4=#3pt
+% \advance\dimen2 -\onepoint
+% \advance\dimen4 -\onepoint}
+
+\def\DOSPLITSKIP#1 #2 #3
+ {\dimen0=#1\onepoint
+ \dimen2=\dimexpr#2\onepoint-\onepoint\relax
+ \dimen4=\dimexpr#3\onepoint-\onepoint\relax}
+
+% \def\minimaxskip#1#2%
+% {\splitskip#2\relax
+% \scratchdimen=#2\relax
+% #2=\scratchdimen
+% \advance#2 by #1\relax}
+%
+% \def\maximizeskip%
+% {\minimaxskip{-\dimen4}}
+%
+% \def\maximizeskip%
+% {\minimaxskip{\dimen2}}
+%
+% \def\maximizespacing%
+% {\maximizeskip\blankskipamount
+% \maximizeskip\parskip
+% \maximizeskip\ctxparskip
+% \maximizeskip\baselineskip
+% \maximizeskip\bigskipamount
+% \maximizeskip\medskipamount
+% \maximizeskip\smallskipamount}
+
+\newcount\modcounter
+
+%\def\DoMod #1by#2to#3%
+% {\modcounter#1\divide\modcounter#2\multiply\modcounter#2%
+% #3#1\advance#3 -\modcounter}
+%
+%\def\DoDiv #1by#2to#3%
+% {#3#1\divide#3 #2\relax}
+
+\def\dosetmodulo#1#2#3%
+ {\modcounter#1\divide\modcounter#2\multiply\modcounter#2%
+ #3#1\advance#3-\modcounter}
+
+\def\dosetdivision#1#2#3%
+ {#3#1\divide#3 #2\relax}
+
+\def\DoMod#1by#2to#3{\dosetmodulo {#1}{#2}{#3}}
+\def\DoDiv#1by#2to#3{\dosetdivision{#1}{#2}{#3}}
+
+\def\dounprotected#1\par
+ {#1\protect}
+
+\def\unprotected
+ {\unprotect\dounprotected}
+
+%D Standaard kan een spatie (zoals ~) uitrekken. Dit is in
+%D overzichten niet altijd de bedoeling, vandaar:
+
+% \def\fixedspace{\hskip\interwordspace\relax}
+
+%\def\ExpandSecondAfter#1#2#3%
+% {\!!toksa={#2}%
+% \edef\!!stringa{#3}%
+% \edef\expanded%
+% {\noexpand#1{\the\!!toksa}{\!!stringa}}%
+% \expanded}
+%
+%\def\ExpandThirdAfter#1#2#3#4%
+% {\!!toksa={#2}%
+% \!!toksb={#3}%
+% \edef\!!stringa{#4}%
+% \edef\expanded%
+% {\noexpand#1{\the\!!toksa}{\the\!!toksb}{\!!stringa}}%
+% \expanded}
+
+%\def\indirect#1#2#3%
+% {\@EA#1\@EA#2\@EA{\@EA#3\csname\s!do\string#2\endcsname}%
+% \@EA#1\csname\s!do\string#2\endcsname}
+%
+%\def\doubleemptied#1#2#3%
+% {\indirect#1#2\dodoublempty}
+%
+%\indirect\def\stelietsin\dodoubleempty[#1][#2]%
+% {...}
+%
+%\doubleemptied\def\stelietsin[#1][#2]%
+% {...}
+
+% in mult-set
+%
+%\def\defaultsetup{def}
+%
+%\def\selectdefaultsetup#1#2%
+% {\writestatus{setup}{choose #1 setupfile}%
+% \bgroup
+% \endlinechar=-1
+% \global\read16 to \usersetup
+% \egroup
+% \ifx\usersetup\empty
+% \let\usersetup=\defaultsetup
+% \fi
+% \readfile{#2\usersetup}{}{}%
+% \writestatus{setup}{loading #1 setupfile #2\usersetup}}
+
+% awaiting the definitive implementation
+
+\ifx\resettimer\undefined
+ \let\resettimer \relax
+ \newcount\elapsedtime
+\fi
+
+\newcount\featuretest
+
+\def\testfeature#1#2%
+ {\def\dotestfeature
+ {\advance\featuretest \plusone
+ \ifnum\featuretest>#1\else#2\expandafter\dotestfeature\fi}%
+ \retestfeature}
+
+\def\retestfeature % timer support is new per 10/5/2005
+ {\bgroup
+ \ifcase\interactionmode\let\wait\relax\fi
+ \writestatus\m!systems{starting feature test}\wait
+ \resettimer
+ \featuretest\zerocount \dotestfeature
+ \writestatus\m!systems{feature test done (\elapsedseconds s)}%
+ \wait
+ \egroup}
+
+\def\elapsedseconds{\expandafter\withoutpt\the\dimexpr\elapsedtime sp\relax}
+
+\def\showtimer#1%
+ {\writestatus{runtime}{\elapsedseconds\space s / #1}}
+
+% \edef\elapsedtime{\expandafter\withoutpt\the\dimexpr\elapsedtime\relax s}%
+% \writestatus\m!systems{feature test done (\elapsedtime)}%
+
+\def\testfeatureonce#1#2%
+ {\let\wait\relax\testfeature{#1}{#2}\end}
+
+%D \macros
+%D {adddimenregister,adddimenmacro}
+%D
+%D Instead of using numerous \type {\advance}'s, one can use
+%D the next macros to add|/|subtract a series of dimensions
+%D to a register or macro.
+%D
+%D \starttyping
+%D \adddimenregister 10pt 5pt \paperwidth \to \somedimen
+%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}}
+
+%D \macros
+%D {freezedimenmacro}
+%D
+%D This macro is use as:
+%D
+%D \starttyping
+%D \freezedimenmacro\leftmargindistance
+%D \stoptyping
+
+% \def\freezedimenmacro#1%
+% {\scratchdimen#1\edef#1{\the\scratchdimen}}
+
+\def\freezedimenmacro#1%
+ {\edef#1{\the\dimexpr#1}}
+
+%D The next one is slower:
+%D
+%D \starttyping
+%D \def\freezedimenmacro#1{\edef#1{\the\dimexpr(#1)}}
+%D \stoptyping
+
+% \newcount\rawrecursecounter
+%
+% \def\rawrecurselevel{\the\rawrecursecounter}%
+%
+% \def\dorawrecurse#1#2%
+% {\rawrecursecounter\plusone
+% \let\oldrecurselevel\recurselevel
+% \let\recurselevel\rawrecurselevel
+% \def\dodorawrecurse
+% {\ifnum\rawrecursecounter>#1\relax
+% \let\recurselevel\oldrecurselevel
+% \else
+% #2\advance\rawrecursecounter \plusone
+% \expandafter\dodorawrecurse
+% \fi}%
+% \dodorawrecurse}
+
+%D The next macro negates a macro (dimension or number, or actually, whatever.
+%D It's a typical example of \type {\if} usage:
+%D
+%D \starttyping
+%D \if-\whatever \else-\whatever\fi => else => -whatever
+%D \if--\whatever\else-\whatever\fi => then => whatever
+%D \stoptyping
+
+\def\negated#1{\if-#1\else-#1\fi} % does only work in macros or text
+
+% This permits things like ^\index{hans}^, where hans is
+% duplicated in the text.
+
+\newif\ifduplicate
+
+\bgroup
+
+\gdef\checkduplication % in line with Knuth
+ {\ifmmode\expandafter^\else\expandafter\startduplication\fi}
+
+\gdef\insideduplication
+ {\ifmmode\expandafter^\else\expandafter\egroup\fi}
+
+\catcode`\^=\@@active
+
+\gdef\enableduplication
+ {\catcode`\^=\@@active \let^\checkduplication}
+
+\gdef\disableduplication
+ {\catcode`\^=\@@superscript}
+
+\gdef\startduplication
+ {\bgroup \duplicatetrue \let^\insideduplication}
+
+\egroup
+
+\def\gobbleassigndimen#1\\{}
+
+\def\assigndimen#1#2%
+ {\afterassignment\gobbleassigndimen#1=#2\!!zeropoint\\}
+
+\def\setusage#1%
+ {\@EA\let\csname#1\endcsname\iftrue}
+
+\def\resetusage#1%
+ {\@EA\let\csname#1\endcsname\iffalse}
+
+\beginTEX
+
+\def\ifusage#1%
+ {\@EA\ifx\csname#1\endcsname\relax
+ \resetusage{#1}%
+ \fi
+ \csname#1\endcsname}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\ifusage#1%
+ {\ifcsname#1\endcsname\else
+ \resetusage{#1}%
+ \fi
+ \csname#1\endcsname}
+
+\endETEX
+
+%D Very handy, more efficient than \type{{}}, and more readable
+%D than \type {\empty}.
+
+\let\donothing\empty
+
+% The following macros are used in XML handling.
+
+% \long\def\dowithstringed#1#2#3#4% " ' space
+% {\if#4"\@EA#1\else\if#4'\@EAEAEA#2\else\@EAEAEA#3\fi\fi#4}
+%
+% \def\unstringed
+% {\dowithstringed\unstringdouble\unstringsingle\unstringspaced}
+%
+% \long\def\unstringdouble"#1"{#1}
+% \long\def\unstringsingle'#1'{#1}
+% \long\def\unstringspaced #1 {#1}
+%
+% \def\grabstring
+% {\dowithstringed\grabstringdouble\grabstringsingle\grabstringspaced}
+%
+% \def\dowithgrabbedstring#1%
+% {\def\@@dowithgrabbedstring{#1}%
+% \afterassignment\@@dowithgrabbedstring\grabstring}
+%
+% \long\def\grabstringdouble"#1"{\scratchtoks{#1}}
+% \long\def\grabstringsingle'#1'{\scratchtoks{#1}}
+% \long\def\grabstringspaced #1 {\scratchtoks{#1}}
+
+\long\setvalue{@u@s@"}#1#2"{#2} \long\setvalue{@g@s@"}#1#2"{\scratchtoks{#2}}
+\long\setvalue{@u@s@'}#1#2'{#2} \long\setvalue{@g@s@'}#1#2'{\scratchtoks{#2}}
+\long\setvalue{@u@s@ }#1#2 {#2} \long\setvalue{@g@s@ }#1#2 {\scratchtoks{#2}}
+
+\long\def\unstringed#1{\csname\ifcsname @u@s@#1\endcsname @u@s@#1\else\s!empty\fi\endcsname#1}
+\long\def\grabstring#1{\csname\ifcsname @g@s@#1\endcsname @g@s@#1\else\s!empty\fi\endcsname#1}
+
+\def\dowithgrabbedstring#1%
+ {\def\@@dowithgrabbedstring{#1}%
+ \afterassignment\@@dowithgrabbedstring\grabstring}
+
+\def\expifequalelse#1#2%
+ {\@@ifequal#1\relax\relax\@@and#2\relax\relax\@@then}
+
+\def\@@ifequal#1#2\@@and#3%
+ {\ifx#1\relax
+ \ifx#3\relax
+ \@EAEAEA\@@if@@equal@@true
+ \else
+ \@EAEAEA\@@if@@equal@@false
+ \fi
+ \else
+ \ifx#3\relax
+ \@EAEAEAEAEAEA\@@if@@equal@@false
+ \else\ifx#1#3%
+ % go on
+ \else
+ \@EAEAEAEAEAEA\@@if@@equal@@false
+ \fi\fi
+ \fi
+ \@@ifequal#2\@@and}
+
+\long\def\@@if@@equal@@true #1\@@then#2#3{#2}
+\long\def\@@if@@equal@@false#1\@@then#2#3{#3}
+
+%D new stuff :
+
+\def\partialexpanded#1%
+ {\let\@@notexpanded\noexpand
+ \long\xdef\@@expanded{\noexpand#1}%
+ \let\@@notexpanded\empty
+ \@@expanded}
+
+% for Simon ; watch how we make them fully expandable (i.e.
+% no \type {\relax}es) popping up
+
+\def\@do@the@number@#1\relax#2\end{#1}
+
+\def\@the@number@#1{\@EA\@do@the@number@\number#1\relax\end}
+
+\def\doifnum#1#2%
+ {\ifnum#1=\@the@number@{#2} % space needed
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\doifnotnum#1#2%
+ {\ifnum#1=\@the@number@{#2} % space needed
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\def\doifelsenum#1#2%
+ {\ifnum#1=\@the@number@{#2} % space needed
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% \edef\xxxx{\doifnum{1}{2}{no}} \show \xxxx
+% \edef\xxxx{\doifnum{2}{2}{yes}} \show \xxxx
+% \scratchcounter0 \edef\xxxx{\doifnum{1}{\scratchcounter}{no}} \show \xxxx
+% \scratchcounter1 \edef\xxxx{\doifnum{1}{\scratchcounter}{yes}} \show \xxxx
+
+\def\appended#1#2#3{\@EA#1\@EA#2\@EA{#2#3}}
+\def\appendvalue #1{\@EA\appended\@EA \def\csname#1\endcsname}
+\def\appendgvalue#1{\@EA\appended\@EA\gdef\csname#1\endcsname}
+
+\def\prepended#1#2#3{\scratchtoks{#3}\@EA\@EA\@EA#1\@EA\@EA\@EA#2\@EA\@EA\@EA{\@EA\the\@EA\scratchtoks#2}}
+\def\prependvalue #1{\@EA\prepended\@EA \def\csname#1\endcsname}
+\def\prependgvalue#1{\@EA\prepended\@EA\gdef\csname#1\endcsname}
+
+%D \macros
+%D {compresscommacommandnrs,compresscommalistnrs,compressedcommalistnrs,
+%D compresscommacommand,compresscommalist,compressedcommalist,
+%D reversecommacommand,reversecommalist,reversedcommalist}
+%D
+%D The following two list processing macros are needed by Taco's
+%D bibliography module. The numbers compressor converts the
+%D list in a list of ranges. The normal compressor remove duplicate
+%D and empty entries.
+
+\def\compresscommalistnrs[#1]%
+ {\let\compressedlist\empty
+ \!!counta\maxdimen
+ \!!countb\maxdimen
+ \processcommalist[#1]\docompresslistnrs
+ \ifnum\!!counta=\maxdimen\else\dodocompresslistnrs\fi}
+
+\def\compresscommacommandnrs[#1]%
+ {\expanded{\compresscommalistnrs[#1]}}
+
+\def\docompresslistnrs#1%
+ {\edef\commalistelement{#1}%
+ \ifx\commalistelement\empty\else
+ \ifnum\!!counta=\maxdimen
+ \!!counta\commalistelement\relax
+ \!!countb\!!counta
+ \else
+ \advance\!!countb\plusone
+ \ifnum\commalistelement>\!!countb
+ \advance\!!countb\minusone
+ \dodocompresslistnrs
+ \!!counta\commalistelement\relax
+ \!!countb\!!counta
+ \fi
+ \fi
+ \fi}
+
+\def\dodocompresslistnrs
+ {\edef\compressedlist
+ {\ifx\compressedlist\empty\else\compressedlist,\fi
+ {\the\!!counta}{\ifnum\!!countb>\!!counta\the\!!countb\fi}}}
+
+%D \def\test#1{{\tttf#1->\compresscommalistnrs[#1]\defconvertedcommand\ascii\compressedlist\ascii}}
+%D \startlines
+%D \test{}
+%D \test{1}
+%D \test{1,3}
+%D \test{1,3,4}
+%D \test{1,3,3,4,5}
+%D \test{1,3,3,4,5,8}
+%D \test{1,3,3,4,5,5,8,10}
+%D \test{1,3,4,5,8,10,11}
+%D \test{1,,3,,4,,5,,8,,10,,11,}
+%D \stoplines
+
+\def\compresscommalist[#1]%
+ {\let\compressedlist\empty
+ \let\!!stringa\empty
+ \processcommalist[#1]\docompresslist}
+
+\def\compresscommacommand[#1]%
+ {\expanded{\compresscommalist[#1]}}
+
+\def\docompresslist#1%
+ {\edef\commalistelement{#1}%
+ \ifx\commalistelement\empty \else
+ \ifx\!!stringa\commalistelement \else
+ \ifx\compressedlist\empty
+ \def\compressedlist{#1}%
+ \else
+ \appended\def\compressedlist{,#1}%
+ \fi
+ \let\!!stringa\commalistelement
+ \fi
+ \fi}
+
+%D \def\test#1{{\tttf#1->\compresscommalist[#1]\defconvertedcommand\ascii\compressedlist\ascii}}
+%D \startlines
+%D \test{}
+%D \test{1}
+%D \test{1,3}
+%D \test{1,3,4}
+%D \test{1,3,3,4,5}
+%D \test{1,3,3,4,5,8}
+%D \test{1,3,3,4,5,5,8,10}
+%D \test{1,3,4,5,8,10,11}
+%D \test{1,,3,,4,,5,,8,,10,,11,}
+%D \stoplines
+
+\def\reversecommalist[#1]%
+ {\let\reversedlist\empty
+ \processcommalist[#1]\doreverselist}
+
+\def\doreverselist#1%
+ {\ifx\reversedlist\empty
+ \def\reversedlist{#1}%
+ \else
+ \prepended\def\reversedlist{#1,}%
+ \fi}
+
+\def\reversecommacommand[#1]%
+ {\expanded{\reversecommalist[#1]}}
+
+%D \def\test#1{{\tttf#1->\reversecommalist[#1]\defconvertedcommand\ascii\reversedlist\ascii}}
+%D \startlines
+%D \test{}
+%D \test{1}
+%D \test{1,3}
+%D \test{1,3,4}
+%D \test{1,3,3,4,5}
+%D \test{1,3,3,4,5,8}
+%D \test{1,3,3,4,5,5,8,10}
+%D \test{1,3,4,5,8,10,11}
+%D \test{1,,3,,4,,5,,8,,10,,11,}
+%D \stoplines
+
+%D \macros
+%D {stripstring}
+%D
+%D Needed in bookmarks:
+%D
+%D \starttyping
+%D {\sanitizePDFdocencoding test \CONTEXT\ test \to\oeps\stripstring\oeps\tttf[\oeps]}
+%D \stoptyping
+
+\def\stripstring#1% #1 is \cs
+ {\bgroup
+ \defconvertedcommand\ascii{#1}%
+ \global\let\globalascii\empty
+ \donefalse
+ \expandafter\handletokens\ascii\with\dostripstring
+ \egroup
+ \let#1\globalascii}
+
+\def\dostripstring#1%
+ {\ifx#1\blankspace
+ \donetrue
+ \else
+ \ifdone\ifx\globalascii\empty\else
+ \xdef\globalascii{\globalascii\space}%
+ \donefalse
+ \fi\fi
+ \xdef\globalascii{\globalascii#1}%
+ \fi}
+
+%D \macros
+%D {dowithrange}
+%D
+%D This one is for Mojca Miklavec, who made me aware of the fact that
+%D \type {page-imp.tex} was not the best place to hide it.
+
+\def\dowithrange#1#2% #2 takes number
+ {\splitstring#1\at:\to\fromrange\and\torange
+ \ifx\torange\empty\let\torange\fromrange\fi
+ \dostepwiserecurse\fromrange\torange1{#2{\recurselevel}}}
+
+%D \macros {uncompresslist}
+%D
+%D When given a list like \type{1,4-7,9} as argument, this macro
+%D will store the expanded commalist in \type{\uncompressedlist}.
+%D
+%D \startbuffer
+%D \def\MojcaHasToDoTheTasks[#1]#2%
+%D {{\uncompresslist[#1]%
+%D \def\processitem##1{I have to do ##1 #2\par}%
+%D \processcommacommand[\uncompressedlist]\processitem}}
+%D
+%D \MojcaHasToDoTheTasks [1-4,7,9-11] {until tomorrow}
+%D \stopbuffer
+%D
+%D Here is an example of how to use \type {\uncompresslist}:
+%D \typebuffer
+%D
+%D The output of this is:
+%D
+%D \getbuffer
+
+\beginETEX \numexpr
+
+\def\uncompresslist[#1]% by TH
+ {\let\uncompressedlist\empty
+ \def\docompressedlistitem##1-##2-%
+ {\@EA\dorecurse\@EA
+ {\the\numexpr1+##2-##1\relax}%
+ {\@EA\appendtocommalist\@EA{\the\numexpr##1-1+####1\relax}\uncompressedlist}}%
+ \def\douncompresslist##1%
+ {\doifinstringelse{-}{##1}
+ {\docompressedlistitem##1-}
+ {\appendtocommalist{##1}\uncompressedlist}}%
+ \processcommalist[#1]\douncompresslist}
+
+\endETEX
+
+\beginTEX
+
+\def\uncompresslist[#1]%
+ {\def\uncompressedlist{#1}}
+
+\endTEX
+
+%D \macros
+%D {ignoreimplicitspaces}
+%D
+%D \startbuffer
+%D \def\whatever[#1]{\expanded{\definedfont[#1 at 12pt]}\ignorespaces}
+%D {a\whatever[Serif]b a\whatever[Serif] b a\whatever[Serif]\space b}
+%D \def\whatever[#1]{\expanded{\definedfont[#1 at 12pt]}\ignoreimplicitspaces}
+%D {a\whatever[Serif]b a\whatever[Serif] b a\whatever[Serif]\space b}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\ignoreimplicitspaces
+ {\doifnextcharelse\relax\relax\relax}
+
+% new
+%
+% \startnointerference
+% all kind of code
+% \stopnointerference
+
+\newbox\nointerferencebox
+
+\def\startnointerference
+ {\setbox\nointerferencebox\vbox
+ \bgroup}
+
+\def\stopnointerference
+ {\egroup
+ \setbox\nointerferencebox\emptybox}
+
+\protect \endinput
+
+
+% \def\appendtovaluelist#1#2%
+% {\ifcsname#1\endcsname
+% \expandafter\ifx\csname#1\endcsname\empty
+% \expandafter\def\csname#1\endcsname{#2}%
+% \else
+% \expandafter\def\csname#1\expandafter\expandafter\expandafter\endcsname
+% \expandafter\expandafter\expandafter{\csname#1\endcsname,#2}%
+% \fi
+% \else
+% \expandafter\def\csname#1\endcsname{#2}%
+% \fi}
+%
+% or
+%
+% \def\appendtovaluelist#1%
+% {\ifcsname#1\endcsname
+% \expandafter\ifx\csname#1\endcsname\empty
+% \expandafter\noappendtovaluelist\csname#1\expandafter\expandafter\expandafter\endcsname
+% \else
+% \expandafter\doappendtovaluelist\csname#1\expandafter\expandafter\expandafter\endcsname
+% \fi
+% \else
+% \expandafter\noappendtovaluelist\csname#1\expandafter\endcsname
+% \fi}
+
+% \def\doappendtovaluelist#1#2{\expandafter\def\expandafter#1\expandafter{#1,#2}}
+% \def\noappendtovaluelist#1#2{\def#1{#2}}
+
+% \appendtovaluelist{mylist}{aap}
+% \appendtovaluelist{mylist}{noot}
+% \appendtovaluelist{mylist}{mies}
+
+% \showvalue{mylist}
diff --git a/tex/context/base/syst-pln.tex b/tex/context/base/syst-pln.tex
new file mode 100644
index 000000000..f2b6129ff
--- /dev/null
+++ b/tex/context/base/syst-pln.tex
@@ -0,0 +1,118 @@
+%D \module
+%D [ file=syst-pln,
+%D version=2001.11.16, % 1999.03.17, % an oldie: 1995.10.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Efficient \PLAIN\ \TEX\ loading,
+%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
+
+%D This module set a couple of variables to the plain \TEX\
+%D values. Later they might be overloaded.
+
+%D Build||in numeric variables.
+
+\adjdemerits = 10000
+\binoppenalty = 700
+\brokenpenalty = 100
+\clubpenalty = 150
+%day = 0
+\defaulthyphenchar = `\-
+\defaultskewchar = -1
+\delimiterfactor = 901
+\displaywidowpenalty = 50
+\doublehyphendemerits = 10000
+%endlinechar = `\^^M
+\errorcontextlines = 5
+%escapechar = `\\
+\exhyphenpenalty = 50
+%fam = 0
+\finalhyphendemerits = 5000
+%floatingpenalty = 0
+%globaldefs = 0
+%hangafter = 1
+\hbadness = 1000
+%holdinginserts = 0
+\hyphenpenalty = 50
+%interlinepenalty = 0
+%language = 0
+\lefthyphenmin = 2
+\linepenalty = 10
+%looseness = 0
+%mag = 1000
+%maxdeadcycles = 25
+%month = 0
+%newlinechar = -1 % commented i.e. no plain value
+%outputpenalty = 0
+%pausing = 0
+%postdisplaypenalty = 0
+\predisplaypenalty = 10000
+\pretolerance = 100
+\relpenalty = 500
+\righthyphenmin = 3
+\showboxbreadth = 5
+\showboxdepth = 3
+%time = 0
+\tolerance = 200
+%tracingcommands = 0
+\tracinglostchars = 1
+%tracingmacros = 0
+%tracingonline = 0
+%tracingoutput = 0
+%tracingpages = 0
+%tracingparagraphs = 0
+%tracingrestores = 0
+%tracingstats = 0
+\uchyph = 1
+\vbadness = 1000
+\widowpenalty = 150
+%year = 0
+
+%D Build in dimension variables.
+
+\abovedisplayshortskip = 0pt plus 3pt
+\abovedisplayskip = 12pt plus 3pt minus 9pt
+%baselineskip = 0pt
+\belowdisplayshortskip = 7pt plus 3pt minus 4pt
+\belowdisplayskip = 12pt plus 3pt minus 9pt
+\boxmaxdepth = \maxdimen
+\delimitershortfall = 5pt
+%displayindent = 0pt
+%displaywidth = 0pt
+%hangindent = 0pt
+\hfuzz = 0.1pt
+%hoffset = 0pt
+\hsize = 6.5in
+%leftskip = 0pt
+%lineskip = 0pt
+%lineskiplimit = 0pt
+%mathsurround = 0pt
+\maxdepth = 4pt
+\medmuskip = 4mu plus 2mu minus 4mu
+\nulldelimiterspace = 1.2pt
+\overfullrule = 5pt
+\parfillskip = 0pt plus 1fil
+\parindent = 20pt
+\parskip = 0pt plus 1pt
+%predisplaysize = 0pt
+%rightskip = 0pt
+\scriptspace = 0.5pt
+%spaceskip = 0pt
+\splitmaxdepth = \maxdimen
+\splittopskip = 10pt
+%tabskip = 0pt
+\thickmuskip = 5mu plus 5mu
+\thinmuskip = 3mu
+\topskip = 10pt
+\vfuzz = 0.1pt
+%voffset = 0pt
+\vsize = 8.9in
+%xspaceskip = 0pt
+
+\protect \endinput
diff --git a/tex/context/base/syst-rtp.mkii b/tex/context/base/syst-rtp.mkii
new file mode 100644
index 000000000..a1c6abe2e
--- /dev/null
+++ b/tex/context/base/syst-rtp.mkii
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=syst-rtp, % copied from core-job
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Run Time Processes,
+%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\executesystemcommand{\immediate\write18}
+
+\protect \endinput
diff --git a/tex/context/base/syst-rtp.mkiv b/tex/context/base/syst-rtp.mkiv
new file mode 100644
index 000000000..36ce8edb1
--- /dev/null
+++ b/tex/context/base/syst-rtp.mkiv
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=syst-rtp,
+%D version=2006.10.13,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Run Time Processes,
+%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\executesystemcommand#1{\ctxlua{os.execute([[#1]])}}
+
+\protect \endinput
diff --git a/tex/context/base/syst-str.mkii b/tex/context/base/syst-str.mkii
new file mode 100644
index 000000000..3e6d043e3
--- /dev/null
+++ b/tex/context/base/syst-str.mkii
@@ -0,0 +1,124 @@
+%D \module
+%D [ file=syst-str,
+%D version=2006.09.18,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=String Processing,
+%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
+
+%D We need a convenient way to change lccode vectors.
+
+\dostepwiserecurse{0}{255}{1}
+ {\@EA\chardef\csname-\recurselevel\endcsname\recurselevel}
+
+\newtoks\withminorcharacters
+\newtoks\withlowercharacters
+\newtoks\withuppercharacters
+
+\dostepwiserecurse{0}{31}{1}
+ {\expanded
+ {\appendtoks\noexpand\withcharacter\csname-\recurselevel\endcsname
+ \noexpand\to\withminorcharacters}}
+
+\dostepwiserecurse{32}{127}{1}
+ {\expanded
+ {\appendtoks\noexpand\withcharacter\csname-\recurselevel\endcsname
+ \noexpand\to\withlowercharacters}}
+
+\dostepwiserecurse{128}{255}{1}
+ {\expanded
+ {\appendtoks\noexpand\withcharacter\csname-\recurselevel\endcsname
+ \noexpand\to\withuppercharacters}}
+
+\chardef\obeyedlccode=`. % so <32 and >127 chars become .
+
+%D \macros
+%D {retainlccodes}
+%D
+%D One way of manipulating characters is changing the their
+%D \type{\lccode} and applying \type{\lowcase}. An example of
+%D this can be found in \type{spec-mis}.
+
+\def\setownlccode #1{\lccode#1#1}
+\def\setobeyedlccode#1{\lccode#1\obeyedlccode}
+
+\def\obeylccodes
+ {\let\withcharacter\setownlccode
+ \the\withlowercharacters
+ \let\withcharacter\setobeyedlccode
+ \the\withminorcharacters
+ \the\withuppercharacters
+ \relax}
+
+\def\retainlccodes
+ {\let\withcharacter\setownlccode
+ \the\withlowercharacters
+ \the\withminorcharacters
+ \the\withuppercharacters
+ \relax}
+
+%D I got tired of making dedicated clean up macros using the
+%D same mechanism again and again, so now we have:
+%D
+%D \starttyping
+%D \def\xxxx{abc.d} \replacecharacters\xxxx{a.}{-} \xxxx
+%D \stoptyping
+
+\def\replacecharacters#1#2#3% macro characters replacement
+ {\bgroup
+ \edef\ascii{#1}%
+ \retainlccodes
+ \def\docommand##1{\lccode\expandafter`\csname##1\endcsname=\expandafter`\csname#3\endcsname}%
+ \handletokens#2\with\docommand
+ \lowercase\@EA{\@EA\xdef\@EA\globalascii\@EA{\ascii}}%
+ \egroup
+ \dodoglobal\let#1\globalascii}
+
+% \bgroup
+% \catcode`\ =\@@other % needed in order to get it visible
+% \lccode`\ =`\-
+% \lowercase{\xdef\globalascii{aap noot}}%
+% \egroup
+%
+% [\globalascii] {\tttf [\globalascii]}
+%
+% interesting:
+%
+% \setvalue{xxx}{oeps}
+% \setvalue{test-test}{\getvalue{xxx}oeps}
+% \bgroup\lccode`\ =`\-\lowercase{\egroup\csname test test\endcsname}
+%
+% \setvalue{test\string~test}{\getvalue{xxx}oeps}
+% \bgroup\lccode`\ =`\~\lowercase{\egroup\csname test test\endcsname}
+%
+% \bgroup\catcode`\~=\@@letter\lowercase{\egroup\csname test~test\endcsname}
+
+\def\separatestring#1\to#2%
+ {\bgroup
+ \retainlccodes
+ \lccode `\ =`\,%
+ % when typesetting: \catcode`\ =\@@other
+ \edef\ascii{#1}%
+ \lowercase\@EA{\@EA\xdef\@EA\globalascii\@EA{\ascii}}%
+ \egroup
+ \let#2\globalascii}
+
+\def\unspacefilename#1\to#2%
+ {\bgroup
+ \def\obeyedspace{-}%
+ \sanitizefilename#1\to\ascii
+ \retainlccodes
+ \lccode `\ =`\-%
+ % when typesetting: \catcode`\ =\@@other
+ \lowercase\@EA{\@EA\xdef\@EA\globalascii\@EA{\ascii}}%
+ \egroup
+ \let#2\globalascii}
+
+\protect \endinput
diff --git a/tex/context/base/syst-str.mkiv b/tex/context/base/syst-str.mkiv
new file mode 100644
index 000000000..57d76dc03
--- /dev/null
+++ b/tex/context/base/syst-str.mkiv
@@ -0,0 +1,36 @@
+%D \module
+%D [ file=syst-str,
+%D version=2006.09.18,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=String Processing,
+%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
+
+% nb: these macros might go away !
+%
+% todo: escape special chars in expr (\luaescapeexpression)
+
+%D I got tired of making dedicated clean up macros using the
+%D same mechanism again and again, so now we have:
+%D
+%D \starttyping
+%D \def\xxxx{abc.d} \replacecharacters\xxxx{a.}{-} \xxxx
+%D \stoptyping
+
+\def\replacecharacters#1#2#3% macro characters replacement
+ {\dodoglobal\edef#1{\ctxlua{tex.sprint((string.gsub(\!!bs#1\!!es,\!!bs#2\!!es,"#3")))}}}
+
+\def\separatestring#1\to#2%
+ {\dodoglobal\def#2{\ctxlua{tex.sprint((string.gsub(\!!bs#1\!!es,"\letterpercent s+",",")))}}}
+
+\def\unspacefilename#1\to#2%
+ {\dodoglobal\def#2{\ctxlua{tex.sprint((string.gsub(\!!bs#1\!!es,"\letterpercent s+","-")))}}}
+
+\protect \endinput
diff --git a/tex/context/base/syst-tex.mkii b/tex/context/base/syst-tex.mkii
new file mode 100644
index 000000000..a8aea2683
--- /dev/null
+++ b/tex/context/base/syst-tex.mkii
@@ -0,0 +1,314 @@
+%D \module
+%D [ file=syst-tex,
+%D version=1999.03.17, % an oldie: 1995.10.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Efficient \PLAIN\ \TEX\ loading,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file is used by mptopdf.
+
+%D We've build \CONTEXT\ on top of \PLAIN\ \TEX. Because we
+%D want to make the format file as independant as possible of
+%D machine dependant font encodings, we have to bypass the
+%D loading of fonts.
+%D
+%D Let's start at the beginning. Because \PLAIN\ is not yet
+%D loaded we have to define some \CATCODES\ ourselves.
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 % circumflex is for superscripts
+
+%D To prevent all kind of end||of||file problems, for the
+%D moment we simply ignore the Control~Z token.
+
+\catcode`\^^Z=9
+
+%D We are going to report to the user what we are skipping.
+
+\def\skipmessage#1{\immediate\write16{skipping #1 in plain}}
+
+%D We want to be able to use the \type{\newsomething}
+%D declarations not only on the \type{\outer} level. This can
+%D be done by redefining \type{\outer} so we have to save its
+%D original meaning.
+
+\let\normalouter = \outer
+\let\outer = \relax
+
+%D We also want to postpone the loading of hyphenation patters,
+%D so we redefine and therefore save \type{\input}.
+
+\let\normalinput = \input
+\def\input #1 {\skipmessage{\string\input}}
+
+%D Finaly are going to we redefine some font specification
+%D commands and that's why we save them too. The redefinitions
+%D are straightforward because the macros have to do nothing
+%D but skipping.
+
+\let\normalskewchar = \skewchar
+\def\skewchar #1=#2 {\skipmessage{\string\skewchar}}
+
+\let\normaltextfont = \textfont
+\let\normalscriptfont = \scriptfont
+\let\normalscriptscriptfont = \scriptscriptfont
+
+\def\textfont #1=#2{\skipmessage{\string\textfont}}
+\def\scriptfont #1=#2{\skipmessage{\string\scriptfont}}
+\def\scriptscriptfont #1=#2{\skipmessage{\string\scriptscriptfont}}
+
+%D The redefinition of \type{\font} is a bit more complicated,
+%D because in version 3.14159 a scaled specification was
+%D introduced.
+
+\let\normalfont = \font
+
+\def\skipscaled scaled #1 {}
+
+\long\def\font#1=#2 #3%
+ {\ifx#3s%
+ \skipmessage{scaled \string\font}%
+ \let\next\skipscaled
+ \else
+ \skipmessage{\string\font}%
+ \let\next\relax
+ \fi
+ \next#3}
+
+% or:
+%
+% \long\def\font#1=#2 #3%
+% {\ifx#3s%
+% \skipmessage{scaled \string\font}%
+% \expandafter\skipscaled
+% \else
+% \skipmessage{\string\font}%
+% \fi
+% #3}
+
+%D Relaxing some font switching macros is needed because we
+%D don't want any error messages during loading. These
+%D unharmfull messages could be ingored.
+%D
+%D The next substitution is needed for determining
+%D \type{\p@renwd} in the macro \type{\bordermatrix}.
+
+\def\tenex#1%
+ {\skipmessage{used \string\tenex}\hskip8.75002pt}
+
+%D We need to define \type{\tenrm} for switching to
+%D \type{\rm}.
+
+\def\tenrm%
+ {\skipmessage{\string\tenrm}}
+
+%D In \CONTEXT\ all \PLAIN\ \TEX\ fonts are available, just
+%D like \type{\p@renwd}. We only postpone loading them until
+%D they are actually needed.
+
+%D By bypassing fonts, some definitions become less valid so
+%D we have to redefine them afterwards.
+%D
+%D \starttyping
+%D \let\normalbordermatrix=\bordermatrix
+%D
+%D \def\bordermatrix%
+%D {\bgroup
+%D \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}%
+%D \global\p@renwd=\wd0\relax
+%D \egroup
+%D \normalbordermatrix}
+%D \stoptyping
+
+%D Now we are ready for loading \PLAIN\ \TEX. Of couse we use
+%D \type{\normalinput} and not \type{\input}.
+
+\normalinput plain.tex \let\normalfmtversion\fmtversion
+
+%D We have to take care of unwanted \PDFTEX\
+%D initializations. We just want to default to \DVI\ output.
+
+\ifx\pdftexversion\undefined
+ \chardef\pdfoutput=0
+\else
+ \pdfoutput=0
+\fi
+
+%D When applicable, we also load the \ETEX\ source and
+%D definition files.
+
+\bgroup \obeylines
+
+\ifx\eTeXversion\undefined
+
+ \long\gdef\beginETEX#1\endETEX%
+ {}
+
+ \gdef\beginTEX%
+ {\bgroup\obeylines\dobeginTEX}
+
+ \gdef\dobeginTEX#1
+ {\egroup}
+
+ \global\let\endTEX\relax
+
+\else
+
+ \long\gdef\beginTEX#1\endTEX%
+ {}
+
+ \gdef\beginETEX%
+ {\bgroup\obeylines\dobeginETEX}
+
+% \gdef\dobeginETEX#1
+% {\egroup\immediate\write16%
+% {system (E-TEX) : [line \the\inputlineno] \detokenize{#1}}}
+
+ \gdef\dobeginETEX#1
+ {\egroup}
+
+ \global\let\endETEX\relax
+
+\fi
+
+\egroup
+
+% \ifx\eTeXversion\undefined
+% \long\def\onlyTEX #1{#1}
+% \long\def\onlyETEX#1{}
+% \else
+% \long\def\only TEX#1{}
+% \long\def\onlyETEX#1{#1}
+% \fi
+
+%D Well, this redefintion of \type {\input} fails on \ETEX,
+%D because of some \type {\cs\fi} constructs. So now we use:
+
+% \beginETEX etex.src etexdefs.lib
+%
+% \def\input#1%
+% {\bgroup
+% \skipmessage{\string\input}%
+% \expandafter\ifx\expandafter#1\csname l@ngdefnfile\endcsname
+% \let\input\egroup
+% \else
+% \def\input##1 {\egroup}%
+% \fi
+% \input}
+%
+% \normalinput etex.src \relax
+% \normalinput etexdefs.lib \relax
+%
+% \let\fmtversion\normalfmtversion
+%
+% \savinghyphcodes=1
+%
+% \endETEX
+%
+% \ifx\normalprotected \undefined \let\normalprotected \protected \fi
+% \ifx\normalunexpanded\undefined \let\normalunexpanded\unexpanded \fi
+% \ifx\normalexpanded \undefined \let\normalexpanded \expanded \fi
+
+\beginETEX \savinghyphcodes
+
+ \savinghyphcodes=1
+
+\endETEX
+
+%D We restore some redefined primitives to their old meaning.
+
+\let\font = \normalfont
+\let\skewchar = \normalskewchar
+\let\textfont = \normaltextfont
+\let\scriptfont = \normalscriptfont
+\let\scriptscriptfont = \normalscriptscriptfont
+\let\input = \normalinput
+\let\outer = \normalouter
+
+%D We reset some of the used auxiliary macro's to
+%D \type{\undefined}. One never knows what testing on them is
+%D done elsewhere.
+
+\let\skipmessage = \undefined
+\let\skipscaled = \undefined
+\let\normalfont = \undefined
+\let\normalskewchar = \undefined
+\let\normaltextfont = \undefined
+\let\normalscriptfont = \undefined
+\let\normalscriptscriptfont = \undefined
+
+% \let\normalinput = \undefined
+% \let\normalouter = \undefined
+
+%D We want a bit more statistics and some less logging info
+%D in the \type{log} file.
+
+\def\wlog#1{}
+
+% \let\normalwlog\wlog
+%
+% \def\wlog#1{\normalwlog{system (\string\wlog) : #1}}
+
+%D To prevent clashes, we slightly redefine the phantom
+%D macros: we let them hide their behaviour by grouping.
+
+\catcode`@=11
+
+%D Somehow this one does not work ok in math mode:
+
+\def\ph@nt%
+ {\bgroup
+ \ifmmode
+ \expandafter\mathpalette\expandafter\mathph@nt
+ \else
+ \expandafter\makeph@nt
+ \fi}
+
+\def\finph@nt%
+ {\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
+ \ifh@ \wd\tw@\wd\z@ \fi
+ \box\tw@
+ \egroup}
+
+%D But this one does work.
+
+\def\ph@nt%
+ {\ifmmode
+ \expandafter\mathpalette\expandafter\mathph@nt
+ \else
+ \bgroup\expandafter\makeph@nt
+ \fi}
+
+\def\finph@nt%
+ {\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
+ \ifh@ \wd\tw@\wd\z@ \fi
+ \box\tw@
+ \ifmmode\else\egroup\fi}
+
+\catcode`@=12
+
+%D Just for tracing purposes wet set:
+
+\tracingstats=1
+
+%D To circumvent dependencies, we can postpone certain
+%D initializations to dumping time, by appending them to the
+%D \type {\everydump} token register.
+
+\newtoks \everydump
+
+\let\normaldump \dump
+
+\def\dump{\the\everydump\normaldump}
+
+\endinput
diff --git a/tex/context/base/tabl-com.mkii b/tex/context/base/tabl-com.mkii
new file mode 100644
index 000000000..892905f6c
--- /dev/null
+++ b/tex/context/base/tabl-com.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=tabl-com,
+%D version=2009.08.22,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Common Code,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / Common Code}
+
+\unprotect
+
+\let\NC\relax
+\let\NR\relax
+
+\protect \endinput
diff --git a/tex/context/base/tabl-com.mkiv b/tex/context/base/tabl-com.mkiv
new file mode 100644
index 000000000..892905f6c
--- /dev/null
+++ b/tex/context/base/tabl-com.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=tabl-com,
+%D version=2009.08.22,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Common Code,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / Common Code}
+
+\unprotect
+
+\let\NC\relax
+\let\NR\relax
+
+\protect \endinput
diff --git a/tex/context/base/tabl-ltb.mkii b/tex/context/base/tabl-ltb.mkii
new file mode 100644
index 000000000..095e30e2b
--- /dev/null
+++ b/tex/context/base/tabl-ltb.mkii
@@ -0,0 +1,866 @@
+%D \module
+%D [ file=tabl-ltb,
+%D version=2002.10.31,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Line Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% testfile: tfmetrics.tex
+
+% todo: als nx>1, dan in geval van rek tussenruimte berekenen en optellen
+% bij breedte, dus: nx nog niet gebruiken in combinatie met rek ! ! ! ! !
+
+% This module is experimental, undocumented, and currently only set up
+% eTeX. It provides a mechanism for typesetting very large tables,
+% spanning many pages horizontally and vertically, with repeated
+% header lines and (entry) columns, tab tracking, color, etc. In does
+% two passes over a table, which is why the table goes into a
+% buffer or file. As said, tables can be real huge.
+
+% \BH \BC .. \EC \BC .. \EC \EH % append
+% \BR \BC .. \EC \BC .. \EC \ER
+%
+% or
+%
+% \NC .. \NC .. \NC \NR (todo: optional last \NC)
+
+% alternative:
+%
+% (1) direct run, save content in macro, but only if needed
+%
+% todo
+%
+% (2) buffered table content
+%
+% \startbuffer
+% \startlinetablehead
+% \stoplinetablehead
+% \startlinetablebody
+% \stoplinetablebody
+% \stopbuffer
+%
+% \processlinetablebuffer[buffer]
+%
+% in buffer : head and body
+%
+% (3) unbuffered run, multipass
+%
+% - run with starting width zero / prev run
+% - clip on prev run
+% - flush real widths
+
+\writestatus{loading}{ConTeXt Table Macros / Line Tables}
+
+\unprotect
+
+\chardef\linetablesplitstate\zerocount
+\chardef\linetableheadstate \zerocount
+
+\edef\??ler{\??le:r:}
+\edef\??lec{\??le:c:}
+\edef\??lew{\??le:w:}
+\edef\??leh{\??le:h:}
+\edef\??led{\??le:d:}
+
+\newif\iflinetablepreroll
+\newif\ifinlinetable
+
+\newcount\linetablecolumn
+\newcount\linetablesubcol
+\newdimen\linetablewidth
+\newdimen\linetableheight
+\newbox \linetablecell
+
+\let\noflinetablecolumns\!!zerocount
+\let\noflinetablerows \!!zerocount
+\let\noflinetablelines \!!zerocount
+\let\noflinetableparts \!!zerocount
+\let\linetablepart \!!plusone
+\let\linetablestep \!!plusone
+\let\linetableline \!!zerocount
+\let\linetablerow \!!zerocount
+\let\linetablerows \!!zerocount
+
+\initializetablebox \zerocount % holds repeater
+
+\chardef\linetablehmode \zerocount
+\chardef\linetablepage \zerocount
+\chardef\linetablerepeat\zerocount
+
+\def\setuplinetable
+ {\dotripleempty\dosetuplinetable}
+
+\def\dosetuplinetable[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??le:#1:#2][#3]%
+ \else\ifsecondargument
+ \getparameters[\??lec#1][#2]%
+ \else
+ \getparameters[\??le][#1]%
+ \fi\fi}
+
+\setuplinetable
+ [\c!n=\!!maxcard,
+ \c!lines=\!!maxcard,
+ \c!nx=\plusone,
+ \c!nleft=0,
+ \c!repeat=\v!yes, % when \c!nleft>0, repeat on both pages
+ \c!before=,
+ \c!after=,
+ \c!inbetween=\page,
+ \c!distance=\zeropoint,
+ \c!stretch=\v!no,
+ \c!align=\c!right,
+ \c!leftoffset=.25ex,
+ \c!rightoffset=\linetableparameter\c!leftoffset,
+ \c!maxwidth=\zeropoint,
+ \c!width=5em,
+ \c!height=\v!fit, % \v!line = faster
+ \c!background=,
+ \c!backgroundcolor=]
+
+\def\linetableparameter#1%
+ {\csname\??le#1\endcsname}
+
+\def\doifelselinetablecparameter#1%
+ {\ifcsname\??lec\number\linetablecolumn#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\linetablecparameter#1%
+ {\csname
+ \ifcsname\??lec\number\linetablecolumn#1\endcsname
+ \??lec\number\linetablecolumn
+ \else
+ \??le
+ \fi
+ #1\endcsname}
+
+\def\linetablerparameter#1% faster, leaner and meaner
+ {\csname
+ \ifnum\linetablerow=\zerocount % geen ifcase
+ \ifcsname\??ler\v!header#1\endcsname
+ \??ler\v!header#1%
+ \else\ifcsname\??ler0#1\endcsname
+ \??ler0#1%
+ \else
+ \s!empty
+ \fi\fi
+ \else
+ \ifcsname\??ler\number\linetablerow#1\endcsname
+ \??ler\number\linetablerow#1%
+ \else\ifcsname\??ler\v!oddeven\linetablerow#1\endcsname
+ \??ler\v!oddeven\linetablerow#1%
+ \else
+ \s!empty
+ \fi\fi
+ \fi
+ \endcsname}
+
+\def\setnoftableslines
+ {\doifelse{\linetableparameter\c!lines}\v!fit
+ {% whitespace already added by vertical strut
+ \ifdim\pagegoal<\maxdimen
+ \scratchdimen\pagegoal
+ \advance\scratchdimen -\pagetotal
+ \else
+ \scratchdimen\textheight
+ \fi
+ \getrawnoflines\scratchdimen
+ \xdef\noflinetablelines{\the\noflines}
+\iflinetablepreroll \else \ifnum\noflinetablelines<\plustwo
+ \page \setnoftableslines
+\fi \fi
+}
+ {\xdef\noflinetablelines{\linetableparameter\c!lines}}}
+
+\def\startlinetablecell
+ {\dosingleempty\dostartlinetablecell}
+
+\def\dostartlinetablecell[#1]%
+ {\global\setbox\linetablecell\hbox\bgroup
+ \iffirstargument
+ \getparameters[\??lec\number\linetablecolumn][#1]%
+ \fi
+ \xdef\linetablestep{\linetablecparameter\c!nx}%
+ \ifcase\linetablestep\or
+ \scratchdimen\linetablecparameter\c!width
+ \scratchskip \linetablecparameter\c!distance
+ \else
+ \scratchdimen \zeropoint
+ \scratchskip \zeropoint
+ \scratchcounter\linetablecolumn
+ \dorecurse\linetablestep
+ {\advance\scratchdimen\linetablecparameter\c!width
+ %\advance\scratchskip \linetablecparameter\c!distance
+ \global\advance \linetablecolumn\plusone
+ \advance\scratchskip \linetablecparameter\c!distance
+ }%
+ \global\linetablecolumn\scratchcounter
+ \fi
+ \chardef\linetablemode
+ \iflinetablepreroll
+ \ifdim\scratchdimen>\zeropoint \zerocount \else \plustwo \fi
+ \else
+ \zerocount
+ \fi
+ \ifcase\linetablemode
+ \ifcase\linetablehmode
+ % nothing
+ \or
+ % fit, keep it simple
+ \or
+ \chardef\linetablemode\plusone % line
+ \else
+ % some already calculated height
+ \fi
+ \fi
+ \setbox\scratchbox\hbox
+ \bgroup
+ \dontcomplain
+ \hskip\linetablecparameter\c!leftoffset\relax
+ % 0 = width, unknown height
+ % 1 = width, fixed height
+ % 2 = no width, auto hsize
+ \ifnum\linetablemode<\plustwo
+ \advance\scratchdimen-\linetablecparameter\c!leftoffset
+ \advance\scratchdimen-\linetablecparameter\c!rightoffset
+ \fi
+ \ifcase\linetablemode
+ \dosetraggedcommand{\linetablecparameter\c!align}%
+ \vtop \ifdim\linetableheight>\zeropoint to\linetableheight \fi \bgroup
+ \hsize\scratchdimen
+ \raggedcommand
+ \else
+ \setalignmentswitch{\linetablecparameter\c!align}%
+ \hbox \ifcase\linetablemode \or to\scratchdimen \fi \bgroup
+ \ifcase\alignmentswitch\hss\or\hss\fi
+ \fi
+ \dostartattributes{\??lec\number\linetablecolumn}\c!style\c!color\empty
+ \begstrut \ignorespaces}
+
+% \def\stoplinetablecell
+% {\unskip \endstrut
+% \dostopattributes
+% \ifcase\linetablemode
+% \endgraf
+% \else
+% \ifcase\alignmentswitch\else\hss\fi
+% \fi
+% \egroup
+% \hskip\linetablecparameter\c!rightoffset
+% \egroup
+% \iflinetablepreroll
+% \box\scratchbox
+% \else
+% \doif{\linetablecparameter\c!background}\v!color
+% {\backgroundline[\linetablecparameter\c!backgroundcolor]}%
+% {\box\scratchbox}%
+% \fi
+% \egroup}
+
+\newconditional\linetableautoheight \settrue\linetableautoheight
+
+\def\stoplinetablecell
+ {\unskip \endstrut
+ \dostopattributes
+ \ifcase\linetablemode
+ \endgraf
+ \else
+ \ifcase\alignmentswitch\else\hss\fi
+ \fi
+ \egroup
+ \hskip\linetablecparameter\c!rightoffset
+ \egroup
+ \iflinetablepreroll
+ \box\scratchbox
+ \else
+ \doifelse{\linetablecparameter\c!background}\v!color
+ {\ifconditional\linetableautoheight
+ \hbox{\blackrule
+ [ \c!color=\linetablecparameter\c!backgroundcolor,
+ \c!height=\linetablerparameter{x\c!height},
+ \c!depth=\linetablerparameter{x\c!depth},
+ \c!width=\wd\scratchbox]%
+ \hskip-\wd\scratchbox\box\scratchbox}%
+ \else
+ \backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}%
+ \fi}%
+ {\box\scratchbox}%
+ \fi
+ \egroup}
+
+% \def\stoplinetablecell
+% {\unskip \endstrut
+% \dostopattributes
+% \ifcase\linetablemode
+% \endgraf
+% \else
+% \ifcase\alignmentswitch\else\hss\fi
+% \fi
+% \egroup
+% \hskip\linetablecparameter\c!rightoffset
+% \egroup
+% \iflinetablepreroll
+% \box\scratchbox
+% \else
+% \doifelse{\linetablecparameter\c!background}\v!color
+% {\ifconditional\linetableautoheight
+% % \hbox{\blackrule
+% % [ \c!color=\linetablecparameter\c!backgroundcolor,
+% % \c!height=\linetablerparameter{x\c!height},
+% % \c!depth=\linetablerparameter{x\c!depth},
+% % \c!width=\wd\scratchbox]%
+% % \hskip-\wd\scratchbox\box\scratchbox}%
+% \dp\scratchbox\linetablerparameter{x\c!depth}%
+% \ht\scratchbox\linetablerparameter{x\c!height}%
+% \framed
+% [\c!offset=\v!overlay,
+% \c!frameoffset=.5\linewidth,
+% \c!leftframe=\v!off,\c!rightframe=\v!off,
+% \c!background=\v!color,
+% \c!backgroundcolor=\linetablecparameter\c!backgroundcolor%
+% ]{\box\scratchbox}%
+% \else
+% \backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}%
+% \fi}%
+% {\box\scratchbox}%
+% \fi
+% \egroup}
+
+\def\savelinetablepart
+ {\global\setbox\tablebox\linetablepart
+ \ifnum\linetablepart=\zerocount
+ \box\scratchbox % just storing
+ \else
+ \vbox
+ {\ifvoid\tablebox\linetablepart\else\unvbox\tablebox\linetablepart\fi
+ \doif{\linetablerparameter\c!background}\v!color
+ {\backgroundline[\linetablerparameter\c!backgroundcolor]}%
+ {\box\scratchbox}% is also arg to \backgroundline
+ \endgraf
+ \linetablerparameter\c!after}%
+ \fi}
+
+\def\flushlinetableparts
+ {\doglobal\increment\linetableline
+ \ifnum\linetableline<\noflinetablelines
+ % keep collecting
+ \else
+ \iflinetablepreroll
+ % forget about them
+ \else
+ \dorecurse\noflinetableparts
+ {\let\linetablepart\recurselevel
+ \dp\tablebox\linetablepart\strutdepth
+ % noindent en endgraf needed else whitespace mess-up!
+ \whitespace % here not after verticalstrut
+ \ifdim\topskipgap=\zeropoint\else
+ \verticalstrut\nobreak\kern-\struttotal\kern-\parskip\nobreak\nointerlineskip % fix topskip
+ \fi
+ \noindent\strut\hbox to \hsize{\box\tablebox\linetablepart\hss}\endgraf
+ \ifnum\linetablepart<\noflinetableparts\relax
+ \linetableparameter\c!inbetween
+ \fi}%
+ \ifnum\linetablerows<\noflinetablerows\relax
+ \linetableparameter\c!inbetween
+ \else
+ % after, later
+ \fi
+ \chardef\linetableheadstate\plusthree
+ \global\setbox\tablebox\zerocount\emptybox % here
+ \fi
+ % reset \linetablerow will be an option, currently
+ % starts at zero after split
+ \globallet\linetablerow\!!zerocount
+ \globallet\linetableline\!!zerocount
+ \global\chardef\linetablepage\zerocount
+ \global\linetablewidth\zeropoint
+ \setnoftableslines
+ \fi}
+
+\def\startlinetablepart
+ {\global\linetablesubcol\zerocount
+ \setbox\scratchbox\hbox\bgroup
+ \doconvertfont{\linetablerparameter\c!style}%
+ \startcolor[\linetablerparameter\c!color]%
+ \ignorespaces}
+
+\def\stoplinetablepart
+ {\ifnum\linetablepart>\zerocount
+ \unskip \unskip % remove last intercolumn skip (distance+fill)
+ \fi
+ \stopcolor
+ \egroup
+ \iflinetablepreroll \else
+ \ifcase\linetablepart
+ % we're collecting the repeater
+ \else
+ \scratchdimen\hsize \advance\scratchdimen-\wd\scratchbox\relax
+ \ifdim\scratchdimen>\linetableparameter\c!stretch\else
+ \setbox\scratchbox\hbox to \hsize{\unhbox\scratchbox}%
+ \fi
+ \fi
+ \fi}
+
+\def\checklinetablepart
+ {\global\advance\linetablewidth\wd\linetablecell
+ \global\advance\linetablecolumn\linetablestep
+ \global\advance\linetablesubcol\linetablestep
+ \relax
+ %\message{\the\linetablecolumn,\the\linetablesubcol}\wait
+ % from now on the column counter is already incremented
+ \ifcase\linetablesplitstate
+ \iflinetablepreroll \else
+ \box\linetablecell
+ % the columncounter is one ahead !
+% \hskip\linetablecparameter\c!afstand
+ \hskip\scratchskip
+ \fi
+ %%%
+ \donefalse
+ \ifcase\linetablerepeat\else
+ % van te voren berekenen
+ \scratchcounter\linetablecolumn\advance\scratchcounter-\plustwo
+ \ifnum\linetablerepeat=\scratchcounter
+ \donetrue % collecting repeater
+ \fi
+ \fi
+ %%%%
+ \ifdone
+ % collecting repeater
+ \else
+ \ifnum\linetablecolumn>\getvalue{\??le::\linetablepart}\relax
+ \donetrue
+ \fi
+ \fi
+ \ifdone
+ \stoplinetablepart
+ \iflinetablepreroll \else
+ \savelinetablepart
+ \fi
+ \ifcase\linetablepage \or
+ \global\chardef\linetablepage \plustwo
+ \else
+ \global\chardef\linetablepage \plusone
+ \fi
+ \doglobal\increment\linetablepart
+ \global\linetablewidth\wd\tablebox\zerocount
+ \startlinetablepart
+ \fi
+ \else
+ \donefalse
+ \!!doneafalse
+ \ifcase\linetablerepeat\else
+ % van te voren berekenen
+ \scratchcounter\linetablecolumn \advance\scratchcounter-\plustwo
+ \ifnum\linetablerepeat=\scratchcounter
+ \donetrue % collecting repeater
+ \fi
+ \fi
+ \ifdone
+ \!!doneatrue
+ % collecting repeater
+ \else\ifdim\linetablewidth>\hsize
+ \donetrue
+ \else
+% \global\advance\linetablewidth\linetablecparameter\c!afstand\relax
+ \global\advance\linetablewidth\scratchskip
+ \ifdim\linetablewidth>\hsize % ?
+ \donetrue
+ \fi
+ \fi\fi
+ \ifdone
+ \stoplinetablepart
+ \savelinetablepart
+ \ifcase\linetablepage \or
+ \global\chardef\linetablepage \plustwo
+ \else
+ \global\chardef\linetablepage \plusone
+ \fi
+ \doglobal\increment\linetablepart
+ \ifnum\linetablepart>\noflinetableparts
+ \globallet\noflinetableparts\linetablepart
+ \initializetablebox\linetablepart
+ \fi
+ \global\linetablewidth\wd\linetablecell
+ \startlinetablepart
+ \if!!doneb \else \ifcase\linetablerepeat \else
+ % check for left/right page
+ \ifcase\linetablepage\donetrue\or\donetrue\or\donefalse\fi\ifdone
+ % insert repeater
+ \global\advance\linetablewidth\wd\tablebox\zerocount
+ \iflinetablepreroll\kern\wd\else\unhcopy\fi\tablebox\zerocount
+ \fi
+ \fi \fi
+ \fi
+ \iflinetablepreroll \else
+ \box\linetablecell
+ % the columncounter is one ahead !
+% \hskip\linetablecparameter\c!afstand
+% \hskip\scratchskip
+\dorecurse\linetablestep{\strut\hfil}%
+ \hskip\scratchskip
+ \fi
+ \fi}
+
+% \linetableparameter\c!var -> \@@levar (when no classes)
+
+\def\startlinetablerun % to do: quit when nested
+ {\bgroup
+ \inlinetabletrue
+ % autowidth
+ \doif{\linetableparameter\c!maxwidth}\v!fit
+ {\setuplinetable[\c!maxwidth=\zeropoint]}%
+ \processaction
+ [\linetableparameter\c!stretch]
+ [ \v!no=>{\setuplinetable[\c!stretch=\maxdimen]},% no stretch
+ \v!yes=>{\setuplinetable[\c!stretch=\zeropoint]}]% max stretch
+ \chardef\linetablerepeat\linetableparameter\c!nleft
+ \chardef\linetablesplitstate % =
+ \ifdim\linetableparameter\c!maxwidth>\zeropoint
+ \zerocount \else \plusone
+ \fi
+ % optional prevdepth correction
+ \iflinetablepreroll
+ \globallet\noflinetablerows\!!zerocount
+ \else
+ \linetableparameter\c!before
+ \fi
+ \globallet\linetablerows\!!zerocount
+ \globallet\noflinetablecolumns\!!zerocount
+ \globallet\noflinetableparts\!!zerocount
+ \!!counta\zerocount
+ \def\docommand##1%
+ {\doglobal\increment\noflinetableparts
+ \advance\!!counta##1%
+ \setxvalue{\??le::\noflinetableparts}{\the\!!counta}}%
+ \processcommacommand[\linetableparameter\c!n]\docommand
+ \initializetableboxes\noflinetableparts
+ \ifcase\linetablerepeat
+ \globallet\linetablepart\!!plusone
+ \else
+ \globallet\linetablepart\!!zerocount % repeater
+ \fi
+ \globallet\linetablestep\!!plusone
+ \globallet\linetableline\!!zerocount
+ \globallet\linetablerow \!!zerocount
+ \global\linetablecolumn \zerocount
+ \global\linetablesubcol \zerocount
+ \global\linetablewidth \zeropoint
+\iflinetablepreroll \else \ifdim\pagetotal>\zeropoint
+ \verticalstrut\kern-\struttotal
+\fi \fi
+ \setnoftableslines
+ \checklinetablepage
+ \let\BR\linetableBR
+ \let\ER\linetableER
+ \let\BH\linetableBR
+ \let\EH\linetableER
+ \let\BC\linetableBC
+ \let\EC\linetableEC
+ \let\NC\linetableNC
+ \let\NR\linetableNR
+ \flushlinetablehead}
+
+\def\stoplinetablerun
+ {\globallet\linetableline\!!maxcard
+ \chardef\linetableheadstate\zerocount % blocked
+ \flushlinetableparts
+ \iflinetablepreroll \else
+ \linetableparameter\c!after
+ \fi
+ \globallet\linetablepart \!!zerocount
+ \globallet\noflinetableparts\!!zerocount
+ \egroup}
+
+% \def\checklinecolumnwidth
+% {\ifundefined{\??lew\number\linetablecolumn}%
+% \donetrue
+% \else\ifdim\getvalue{\??lew\number\linetablecolumn}<\wd\linetablecell
+% \donetrue
+% \else
+% \donefalse
+% \fi\fi
+% \ifdone
+% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}%
+% \fi}
+%
+% \def\checklinecolumnwidth
+% {\ifcsname\??lew\number\linetablecolumn\endcsname
+% \ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell
+% \donetrue
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}%
+% \fi}
+
+% \def\checklinecolumnwidth
+% {\expandafter\xdef\csname\??lew\number\linetablecolumn\endcsname
+% {\expandafter\ifx\csname\??lew\number\linetablecolumn\endcsname\relax
+% \the\wd\linetablecell
+% \else\ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell
+% \the\wd\linetablecell
+% \else
+% \csname\??lew\number\linetablecolumn\endcsname
+% \fi\fi}}
+
+\def\checklinecolumndimension#1#2#3%
+ {\expandafter\xdef\csname#1\number#3\endcsname
+ {\expandafter\ifx\csname#1\number#3\endcsname\relax
+ \the#2\linetablecell
+ \else\ifdim\csname#1\number#3\endcsname<#2\linetablecell
+ \the#2\linetablecell
+ \else
+ \csname#1\number#3\endcsname
+ \fi\fi}}
+
+\def\checklinecolumnwidth {\checklinecolumndimension\??lew\wd\linetablecolumn}
+\def\checklinecolumnheight{\checklinecolumndimension\??leh\ht\linetablerow}
+\def\checklinecolumndepth {\checklinecolumndimension\??led\dp\linetablerow}
+
+\def\linetableBR
+ {\dosingleempty\dolinetableBR}
+
+\def\dolinetableBR[#1]% #1 not yet implemented
+ {\ifnum\linetableheadstate=1\else
+ \doglobal\increment\linetablerow
+ \doglobal\increment\linetablerows
+ \fi
+ \global\linetablecolumn\plusone
+ \global\linetablesubcol\plusone
+% \linetableheight\linetablerparameter\c!height
+%
+% \ifx\linetableheight\empty
+% % nothing
+% \else\ifx\linetableheight\v!fit
+% % keep it simple
+% \else\ifx\linetableheight\v!line
+% \chardef\linetablemode\plusone
+% \else
+% \!!heighta\linetableheight
+% \advance\!!heighta-\strutdepth
+% \fi\fi\fi
+%
+ \linetableheight\zeropoint
+ \edef\!!stringa{\linetablerparameter\c!height}%
+ \ifx\!!stringa\empty
+ \chardef\linetablehmode\zerocount
+ \else\ifx\!!stringa\v!fit
+ \chardef\linetablehmode\plusone
+ \else\ifx\!!stringa\v!line
+ \chardef\linetablehmode\plustwo
+ \else
+ \linetableheight\!!stringa
+ \advance\linetableheight-\strutdepth
+ \fi\fi\fi
+%
+ \startlinetablepart}
+
+\def\linetableBC
+ {\startlinetablecell}
+
+\def\linetableEC
+ {\stoplinetablecell
+ \iflinetablepreroll
+ \checklinecolumnwidth
+ \checklinecolumnheight
+ \checklinecolumndepth
+ \fi
+ \checklinetablepart}
+
+\def\linetableER
+ {% \stoplinetablecell
+ % no \box\linetablecell, i.e. dummy columnn, last \NC \NR
+ \stoplinetablepart
+ \savelinetablepart
+ \advance\linetablecolumn \minusone
+ \ifnum\linetablecolumn>\noflinetablecolumns
+ \xdef\noflinetablecolumns{\number\linetablecolumn}%
+ \fi
+ \flushlinetableparts
+ \global\linetablecolumn\zerocount
+ \global\linetablewidth \zeropoint
+ \ifcase\linetablerepeat
+ \globallet\linetablepart\!!plusone
+ \else
+ \globallet\linetablepart\!!zerocount % repeater
+ \fi
+ \checklinetablepage
+ \flushlinetablehead}
+
+\def\checklinetablepage
+ {\global\chardef\linetablepage\zerocount
+ \ifcase\linetablerepeat \else \ifcase\linetablepage
+ \doif{\linetableparameter\c!repeat}\v!no
+ {\global\chardef\linetablepage\doifoddpageelse\plusone\plustwo}%
+ \fi \fi}
+
+\def\flushlinetablehead
+ {\ifcase\linetableheadstate
+ % 0 blocked
+ \or
+ % 1 doing head
+ \or
+ % 2 head done
+ \or
+ % 3 trigger flush
+ \chardef\linetableheadstate\plusone
+ \the\@@linetablehead\relax
+ \chardef\linetableheadstate\plustwo
+ \fi}
+
+\def\linetableNC % first time special treatment
+ {\relax
+ \ifcase\linetablecolumn
+ \linetableBR
+ \else
+ \linetableEC
+ \fi
+ \linetableBC} % beware, this will result in BR BC EC BC NR
+
+\def\linetableNR
+ {\stoplinetablecell % dummy
+ \linetableER}
+
+\def\startlinetable
+ {\startlinetablerun}
+
+\def\stoplinetable
+ {\stoplinetablerun}
+
+\def\startlinetableanalysis
+ {\bgroup
+ \linetableprerolltrue
+ \trialtypesettingtrue
+ \startlinetablerun}
+
+\def\stoplinetableanalysis
+ {\stoplinetablerun
+ \egroup
+ \globallet\noflinetablerows\linetablerows
+ \dorecurse\noflinetablerows % global, from last run {\linetableparameter\c!n}
+ {%\writestatus{linetable}{\recurselevel->\getvalue{\??lew\recurselevel}}%
+ \setevalue{\??ler\recurselevel x\c!height}{\getvalue{\??leh\recurselevel}}%
+ \setevalue{\??ler\recurselevel x\c!depth }{\getvalue{\??led\recurselevel}}%
+ \letgvalue{\??leh\recurselevel}\!!zeropoint
+ \letgvalue{\??led\recurselevel}\!!zeropoint}
+ \dorecurse\noflinetablecolumns % global, from last run {\linetableparameter\c!n}
+ {%\writestatus{linetable}{\recurselevel->\getvalue{\??lew\recurselevel}}%
+ \setevalue{\??lec\recurselevel\c!width}{\getvalue{\??lew\recurselevel}}%
+ \letgvalue{\??lew\recurselevel}\!!zeropoint}} % init next table
+
+% todo: store in box instead of macro
+
+\newtoks \@@linetablehead
+
+\long\def\startlinetablehead#1\stoplinetablehead
+ {\ifinlinetable
+ \@@linetablehead\emptytoks
+ \fi
+ \chardef\linetableheadstate3 % full
+ \@@linetablehead{#1}%
+ \ifinlinetable
+ \flushlinetablehead
+ \fi}
+
+\def\linetableBH
+ {\ifx\EC\relax
+ % signal, grabbing lines
+ \else
+ \@@linetablehead\emptytoks
+ \fi
+ \pushmacro\BC
+ \pushmacro\EC
+ \def\BC##1\EC{\appendtoks##1\to\@@linetablehead}%
+ \let\EC\relax} % signal
+
+\def\linetableEH
+ {\popmacro\EC
+ \popmacro\BC
+ \@EA\startlinetablehead\the\@@linetablehead\stoplinetablehead}
+
+\let\startlinetablebody\donothing
+\let\stoplinetablebody \donothing
+
+\def\processlinetablebuffer
+ {\dosingleempty\doprocesslinetablebuffer}
+
+\def\doprocesslinetablebuffer[#1]%
+ {\bgroup
+ \let\startlinetable\donothing
+ \let\stoplinetable \donothing
+ \startlinetableanalysis\getbuffer[#1]\stoplinetableanalysis
+ \startlinetablerun \getbuffer[#1]\stoplinetablerun
+ \egroup}
+
+\def\processlinetablefile#1%
+ {\bgroup
+ \let\startlinetable\donothing
+ \let\stoplinetable \donothing
+ \startlinetableanalysis\readfile{#1}\donothing\donothing\stoplinetableanalysis
+ \startlinetablerun \readfile{#1}\donothing\donothing\stoplinetablerun
+ \egroup}
+
+% will go away:
+
+\def\processlinetableXMLfile#1%
+ {\bgroup
+ \let\startlinetable\donothing
+ \let\stoplinetable \donothing
+ \startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis
+ \startlinetablerun \processXMLfile{#1}\stoplinetablerun
+ \egroup}
+
+\protect \endinput
+
+\doifnotmode{demo}{\endinput}
+
+\setuplinetable[n=6,m={2,2,2},lines=25] % m ?
+
+\setuplinetable[c][1] [width=2cm,background=color,backgroundcolor=red]
+\setuplinetable[c][4] [width=3cm,background=color,backgroundcolor=yellow]
+\setuplinetable[c][6] [width=3cm,background=color,backgroundcolor=magenta]
+\setuplinetable[r][odd] [background=color,backgroundcolor=gray]
+\setuplinetable[r][even][background=color,backgroundcolor=green]
+
+\starttext
+
+\showframe \showstruts
+
+\setupcolors[state=start]
+
+\setuppagenumbering[alternative=doublesided]\page[left]
+
+\startlinetable
+\NC aaa\crlf aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR
+\dorecurse{100}{\NC aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR}
+\stoplinetable
+
+\startlinetable
+\NC[style=slanted,color=green,background=color,backgroundcolor=darkred,nx=2,uitlijnen=middle] xxx
+ \NC yy \NC ddddd \NC eeee \NC ff \NC \NR
+\dorecurse{100}{\NC aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR}
+\stoplinetable
+
+% \startbuffer[lt]
+% \NC aaa\crlf aaa \NC bb \NC c \NC ddddd \NC ee \NC ff \NC \NR
+% \NC aaa\crlf aaa \NC b \NC cc \NC ddd \NC eeee \NC f \NC \NR
+% \stopbuffer
+%
+% \processlinetablebuffer[lt]
+
+\stoptext
diff --git a/tex/context/base/tabl-ltb.mkiv b/tex/context/base/tabl-ltb.mkiv
new file mode 100644
index 000000000..7d3fab0df
--- /dev/null
+++ b/tex/context/base/tabl-ltb.mkiv
@@ -0,0 +1,866 @@
+%D \module
+%D [ file=tabl-ltb,
+%D version=2002.10.31,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Line Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% testfile: tfmetrics.tex
+
+% todo: als nx>1, dan in geval van rek tussenruimte berekenen en optellen
+% bij breedte, dus: nx nog niet gebruiken in combinatie met rek ! ! ! ! !
+
+% This module is experimental, undocumented, and currently only set up
+% eTeX. It provides a mechanism for typesetting very large tables,
+% spanning many pages horizontally and vertically, with repeated
+% header lines and (entry) columns, tab tracking, color, etc. In does
+% two passes over a table, which is why the table goes into a
+% buffer or file. As said, tables can be real huge.
+
+% \BH \BC .. \EC \BC .. \EC \EH % append
+% \BR \BC .. \EC \BC .. \EC \ER
+%
+% or
+%
+% \NC .. \NC .. \NC \NR (todo: optional last \NC)
+
+% alternative:
+%
+% (1) direct run, save content in macro, but only if needed
+%
+% todo
+%
+% (2) buffered table content
+%
+% \startbuffer
+% \startlinetablehead
+% \stoplinetablehead
+% \startlinetablebody
+% \stoplinetablebody
+% \stopbuffer
+%
+% \processlinetablebuffer[buffer]
+%
+% in buffer : head and body
+%
+% (3) unbuffered run, multipass
+%
+% - run with starting width zero / prev run
+% - clip on prev run
+% - flush real widths
+
+\writestatus{loading}{ConTeXt Table Macros / Line Tables}
+
+\unprotect
+
+\chardef\linetablesplitstate\zerocount
+\chardef\linetableheadstate \zerocount
+
+\edef\??ler{\??le:r:}
+\edef\??lec{\??le:c:}
+\edef\??lew{\??le:w:}
+\edef\??leh{\??le:h:}
+\edef\??led{\??le:d:}
+
+\newif\iflinetablepreroll
+\newif\ifinlinetable
+
+\newcount\linetablecolumn
+\newcount\linetablesubcol
+\newdimen\linetablewidth
+\newdimen\linetableheight
+\newbox \linetablecell
+
+\let\noflinetablecolumns\!!zerocount
+\let\noflinetablerows \!!zerocount
+\let\noflinetablelines \!!zerocount
+\let\noflinetableparts \!!zerocount
+\let\linetablepart \!!plusone
+\let\linetablestep \!!plusone
+\let\linetableline \!!zerocount
+\let\linetablerow \!!zerocount
+\let\linetablerows \!!zerocount
+
+\initializetablebox \zerocount % holds repeater
+
+\chardef\linetablehmode \zerocount
+\chardef\linetablepage \zerocount
+\chardef\linetablerepeat\zerocount
+
+\unexpanded\def\setuplinetable
+ {\dotripleempty\dosetuplinetable}
+
+\def\dosetuplinetable[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??le:#1:#2][#3]%
+ \else\ifsecondargument
+ \getparameters[\??lec#1][#2]%
+ \else
+ \getparameters[\??le][#1]%
+ \fi\fi}
+
+\setuplinetable
+ [\c!n=\!!maxcard,
+ \c!lines=\!!maxcard,
+ \c!nx=\plusone,
+ \c!nleft=0,
+ \c!repeat=\v!yes, % when \c!nleft>0, repeat on both pages
+ \c!before=,
+ \c!after=,
+ \c!inbetween=\page,
+ \c!distance=\zeropoint,
+ \c!stretch=\v!no,
+ \c!align=\c!right,
+ \c!leftoffset=.25ex,
+ \c!rightoffset=\linetableparameter\c!leftoffset,
+ \c!maxwidth=\zeropoint,
+ \c!width=5em,
+ \c!height=\v!fit, % \v!line = faster
+ \c!background=,
+ \c!backgroundcolor=]
+
+\def\linetableparameter#1%
+ {\csname\??le#1\endcsname}
+
+\def\doifelselinetablecparameter#1%
+ {\ifcsname\??lec\number\linetablecolumn#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\linetablecparameter#1%
+ {\csname
+ \ifcsname\??lec\number\linetablecolumn#1\endcsname
+ \??lec\number\linetablecolumn
+ \else
+ \??le
+ \fi
+ #1\endcsname}
+
+\def\linetablerparameter#1% faster, leaner and meaner
+ {\csname
+ \ifnum\linetablerow=\zerocount % geen ifcase
+ \ifcsname\??ler\v!header#1\endcsname
+ \??ler\v!header#1%
+ \else\ifcsname\??ler0#1\endcsname
+ \??ler0#1%
+ \else
+ \s!empty
+ \fi\fi
+ \else
+ \ifcsname\??ler\number\linetablerow#1\endcsname
+ \??ler\number\linetablerow#1%
+ \else\ifcsname\??ler\v!oddeven\linetablerow#1\endcsname
+ \??ler\v!oddeven\linetablerow#1%
+ \else
+ \s!empty
+ \fi\fi
+ \fi
+ \endcsname}
+
+\def\setnoftableslines
+ {\doifelse{\linetableparameter\c!lines}\v!fit
+ {% whitespace already added by vertical strut
+ \ifdim\pagegoal<\maxdimen
+ \scratchdimen\pagegoal
+ \advance\scratchdimen -\pagetotal
+ \else
+ \scratchdimen\textheight
+ \fi
+ \getrawnoflines\scratchdimen
+ \xdef\noflinetablelines{\the\noflines}
+\iflinetablepreroll \else \ifnum\noflinetablelines<\plustwo
+ \page \setnoftableslines
+\fi \fi
+}
+ {\xdef\noflinetablelines{\linetableparameter\c!lines}}}
+
+\unexpanded\def\startlinetablecell
+ {\dosingleempty\dostartlinetablecell}
+
+\def\dostartlinetablecell[#1]%
+ {\global\setbox\linetablecell\hbox\bgroup
+ \iffirstargument
+ \getparameters[\??lec\number\linetablecolumn][#1]%
+ \fi
+ \xdef\linetablestep{\linetablecparameter\c!nx}%
+ \ifcase\linetablestep\or
+ \scratchdimen\linetablecparameter\c!width
+ \scratchskip \linetablecparameter\c!distance
+ \else
+ \scratchdimen \zeropoint
+ \scratchskip \zeropoint
+ \scratchcounter\linetablecolumn
+ \dorecurse\linetablestep
+ {\advance\scratchdimen\linetablecparameter\c!width
+ %\advance\scratchskip \linetablecparameter\c!distance
+ \global\advance \linetablecolumn\plusone
+ \advance\scratchskip \linetablecparameter\c!distance
+ }%
+ \global\linetablecolumn\scratchcounter
+ \fi
+ \chardef\linetablemode
+ \iflinetablepreroll
+ \ifdim\scratchdimen>\zeropoint \zerocount \else \plustwo \fi
+ \else
+ \zerocount
+ \fi
+ \ifcase\linetablemode
+ \ifcase\linetablehmode
+ % nothing
+ \or
+ % fit, keep it simple
+ \or
+ \chardef\linetablemode\plusone % line
+ \else
+ % some already calculated height
+ \fi
+ \fi
+ \setbox\scratchbox\hbox
+ \bgroup
+ \dontcomplain
+ \hskip\linetablecparameter\c!leftoffset\relax
+ % 0 = width, unknown height
+ % 1 = width, fixed height
+ % 2 = no width, auto hsize
+ \ifnum\linetablemode<\plustwo
+ \advance\scratchdimen-\linetablecparameter\c!leftoffset
+ \advance\scratchdimen-\linetablecparameter\c!rightoffset
+ \fi
+ \ifcase\linetablemode
+ \dosetraggedcommand{\linetablecparameter\c!align}%
+ \vtop \ifdim\linetableheight>\zeropoint to\linetableheight \fi \bgroup
+ \hsize\scratchdimen
+ \raggedcommand
+ \else
+ \setalignmentswitch{\linetablecparameter\c!align}%
+ \hbox \ifcase\linetablemode \or to\scratchdimen \fi \bgroup
+ \ifcase\alignmentswitch\hss\or\hss\fi
+ \fi
+ \dostartattributes{\??lec\number\linetablecolumn}\c!style\c!color\empty
+ \begstrut \ignorespaces}
+
+% \unexpanded\def\stoplinetablecell
+% {\unskip \endstrut
+% \dostopattributes
+% \ifcase\linetablemode
+% \endgraf
+% \else
+% \ifcase\alignmentswitch\else\hss\fi
+% \fi
+% \egroup
+% \hskip\linetablecparameter\c!rightoffset
+% \egroup
+% \iflinetablepreroll
+% \box\scratchbox
+% \else
+% \doif{\linetablecparameter\c!background}\v!color
+% {\backgroundline[\linetablecparameter\c!backgroundcolor]}%
+% {\box\scratchbox}%
+% \fi
+% \egroup}
+
+\newconditional\linetableautoheight \settrue\linetableautoheight
+
+\unexpanded\def\stoplinetablecell
+ {\unskip \endstrut
+ \dostopattributes
+ \ifcase\linetablemode
+ \endgraf
+ \else
+ \ifcase\alignmentswitch\else\hss\fi
+ \fi
+ \egroup
+ \hskip\linetablecparameter\c!rightoffset
+ \egroup
+ \iflinetablepreroll
+ \box\scratchbox
+ \else
+ \doifelse{\linetablecparameter\c!background}\v!color
+ {\ifconditional\linetableautoheight
+ \hbox{\blackrule
+ [ \c!color=\linetablecparameter\c!backgroundcolor,
+ \c!height=\linetablerparameter{x\c!height},
+ \c!depth=\linetablerparameter{x\c!depth},
+ \c!width=\wd\scratchbox]%
+ \hskip-\wd\scratchbox\box\scratchbox}%
+ \else
+ \backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}%
+ \fi}%
+ {\box\scratchbox}%
+ \fi
+ \egroup}
+
+% \unexpanded\def\stoplinetablecell
+% {\unskip \endstrut
+% \dostopattributes
+% \ifcase\linetablemode
+% \endgraf
+% \else
+% \ifcase\alignmentswitch\else\hss\fi
+% \fi
+% \egroup
+% \hskip\linetablecparameter\c!rightoffset
+% \egroup
+% \iflinetablepreroll
+% \box\scratchbox
+% \else
+% \doifelse{\linetablecparameter\c!background}\v!color
+% {\ifconditional\linetableautoheight
+% % \hbox{\blackrule
+% % [ \c!color=\linetablecparameter\c!backgroundcolor,
+% % \c!height=\linetablerparameter{x\c!height},
+% % \c!depth=\linetablerparameter{x\c!depth},
+% % \c!width=\wd\scratchbox]%
+% % \hskip-\wd\scratchbox\box\scratchbox}%
+% \dp\scratchbox\linetablerparameter{x\c!depth}%
+% \ht\scratchbox\linetablerparameter{x\c!height}%
+% \framed
+% [\c!offset=\v!overlay,
+% \c!frameoffset=.5\linewidth,
+% \c!leftframe=\v!off,\c!rightframe=\v!off,
+% \c!background=\v!color,
+% \c!backgroundcolor=\linetablecparameter\c!backgroundcolor%
+% ]{\box\scratchbox}%
+% \else
+% \backgroundline[\linetablecparameter\c!backgroundcolor]{\box\scratchbox}%
+% \fi}%
+% {\box\scratchbox}%
+% \fi
+% \egroup}
+
+\def\savelinetablepart
+ {\global\setbox\tablebox\linetablepart
+ \ifnum\linetablepart=\zerocount
+ \box\scratchbox % just storing
+ \else
+ \vbox
+ {\ifvoid\tablebox\linetablepart\else\unvbox\tablebox\linetablepart\fi
+ \doif{\linetablerparameter\c!background}\v!color
+ {\backgroundline[\linetablerparameter\c!backgroundcolor]}%
+ {\box\scratchbox}% is also arg to \backgroundline
+ \endgraf
+ \linetablerparameter\c!after}%
+ \fi}
+
+\def\flushlinetableparts
+ {\doglobal\increment\linetableline
+ \ifnum\linetableline<\noflinetablelines
+ % keep collecting
+ \else
+ \iflinetablepreroll
+ % forget about them
+ \else
+ \dorecurse\noflinetableparts
+ {\let\linetablepart\recurselevel
+ \dp\tablebox\linetablepart\strutdepth
+ % noindent en endgraf needed else whitespace mess-up!
+ \whitespace % here not after verticalstrut
+ \ifdim\topskipgap=\zeropoint\else
+ \verticalstrut\nobreak\kern-\struttotal\kern-\parskip\nobreak\nointerlineskip % fix topskip
+ \fi
+ \noindent\strut\hbox to \hsize{\box\tablebox\linetablepart\hss}\endgraf
+ \ifnum\linetablepart<\noflinetableparts\relax
+ \linetableparameter\c!inbetween
+ \fi}%
+ \ifnum\linetablerows<\noflinetablerows\relax
+ \linetableparameter\c!inbetween
+ \else
+ % after, later
+ \fi
+ \chardef\linetableheadstate\plusthree
+ \global\setbox\tablebox\zerocount\emptybox % here
+ \fi
+ % reset \linetablerow will be an option, currently
+ % starts at zero after split
+ \globallet\linetablerow\!!zerocount
+ \globallet\linetableline\!!zerocount
+ \global\chardef\linetablepage\zerocount
+ \global\linetablewidth\zeropoint
+ \setnoftableslines
+ \fi}
+
+\unexpanded\def\startlinetablepart
+ {\global\linetablesubcol\zerocount
+ \setbox\scratchbox\hbox\bgroup
+ \doconvertfont{\linetablerparameter\c!style}%
+ \startcolor[\linetablerparameter\c!color]%
+ \ignorespaces}
+
+\unexpanded\def\stoplinetablepart
+ {\ifnum\linetablepart>\zerocount
+ \unskip \unskip % remove last intercolumn skip (distance+fill)
+ \fi
+ \stopcolor
+ \egroup
+ \iflinetablepreroll \else
+ \ifcase\linetablepart
+ % we're collecting the repeater
+ \else
+ \scratchdimen\hsize \advance\scratchdimen-\wd\scratchbox\relax
+ \ifdim\scratchdimen>\linetableparameter\c!stretch\else
+ \setbox\scratchbox\hbox to \hsize{\unhbox\scratchbox}%
+ \fi
+ \fi
+ \fi}
+
+\def\checklinetablepart
+ {\global\advance\linetablewidth\wd\linetablecell
+ \global\advance\linetablecolumn\linetablestep
+ \global\advance\linetablesubcol\linetablestep
+ \relax
+ %\message{\the\linetablecolumn,\the\linetablesubcol}\wait
+ % from now on the column counter is already incremented
+ \ifcase\linetablesplitstate
+ \iflinetablepreroll \else
+ \box\linetablecell
+ % the columncounter is one ahead !
+% \hskip\linetablecparameter\c!afstand
+ \hskip\scratchskip
+ \fi
+ %%%
+ \donefalse
+ \ifcase\linetablerepeat\else
+ % van te voren berekenen
+ \scratchcounter\linetablecolumn\advance\scratchcounter-\plustwo
+ \ifnum\linetablerepeat=\scratchcounter
+ \donetrue % collecting repeater
+ \fi
+ \fi
+ %%%%
+ \ifdone
+ % collecting repeater
+ \else
+ \ifnum\linetablecolumn>\getvalue{\??le::\linetablepart}\relax
+ \donetrue
+ \fi
+ \fi
+ \ifdone
+ \stoplinetablepart
+ \iflinetablepreroll \else
+ \savelinetablepart
+ \fi
+ \ifcase\linetablepage \or
+ \global\chardef\linetablepage \plustwo
+ \else
+ \global\chardef\linetablepage \plusone
+ \fi
+ \doglobal\increment\linetablepart
+ \global\linetablewidth\wd\tablebox\zerocount
+ \startlinetablepart
+ \fi
+ \else
+ \donefalse
+ \!!doneafalse
+ \ifcase\linetablerepeat\else
+ % van te voren berekenen
+ \scratchcounter\linetablecolumn \advance\scratchcounter-\plustwo
+ \ifnum\linetablerepeat=\scratchcounter
+ \donetrue % collecting repeater
+ \fi
+ \fi
+ \ifdone
+ \!!doneatrue
+ % collecting repeater
+ \else\ifdim\linetablewidth>\hsize
+ \donetrue
+ \else
+% \global\advance\linetablewidth\linetablecparameter\c!afstand\relax
+ \global\advance\linetablewidth\scratchskip
+ \ifdim\linetablewidth>\hsize % ?
+ \donetrue
+ \fi
+ \fi\fi
+ \ifdone
+ \stoplinetablepart
+ \savelinetablepart
+ \ifcase\linetablepage \or
+ \global\chardef\linetablepage \plustwo
+ \else
+ \global\chardef\linetablepage \plusone
+ \fi
+ \doglobal\increment\linetablepart
+ \ifnum\linetablepart>\noflinetableparts
+ \globallet\noflinetableparts\linetablepart
+ \initializetablebox\linetablepart
+ \fi
+ \global\linetablewidth\wd\linetablecell
+ \startlinetablepart
+ \if!!doneb \else \ifcase\linetablerepeat \else
+ % check for left/right page
+ \ifcase\linetablepage\donetrue\or\donetrue\or\donefalse\fi\ifdone
+ % insert repeater
+ \global\advance\linetablewidth\wd\tablebox\zerocount
+ \iflinetablepreroll\kern\wd\else\unhcopy\fi\tablebox\zerocount
+ \fi
+ \fi \fi
+ \fi
+ \iflinetablepreroll \else
+ \box\linetablecell
+ % the columncounter is one ahead !
+% \hskip\linetablecparameter\c!afstand
+% \hskip\scratchskip
+\dorecurse\linetablestep{\strut\hfil}%
+ \hskip\scratchskip
+ \fi
+ \fi}
+
+% \linetableparameter\c!var -> \@@levar (when no classes)
+
+\unexpanded\def\startlinetablerun % to do: quit when nested
+ {\bgroup
+ \inlinetabletrue
+ % autowidth
+ \doif{\linetableparameter\c!maxwidth}\v!fit
+ {\setuplinetable[\c!maxwidth=\zeropoint]}%
+ \processaction
+ [\linetableparameter\c!stretch]
+ [ \v!no=>{\setuplinetable[\c!stretch=\maxdimen]},% no stretch
+ \v!yes=>{\setuplinetable[\c!stretch=\zeropoint]}]% max stretch
+ \chardef\linetablerepeat\linetableparameter\c!nleft
+ \chardef\linetablesplitstate % =
+ \ifdim\linetableparameter\c!maxwidth>\zeropoint
+ \zerocount \else \plusone
+ \fi
+ % optional prevdepth correction
+ \iflinetablepreroll
+ \globallet\noflinetablerows\!!zerocount
+ \else
+ \linetableparameter\c!before
+ \fi
+ \globallet\linetablerows\!!zerocount
+ \globallet\noflinetablecolumns\!!zerocount
+ \globallet\noflinetableparts\!!zerocount
+ \!!counta\zerocount
+ \def\docommand##1%
+ {\doglobal\increment\noflinetableparts
+ \advance\!!counta##1%
+ \setxvalue{\??le::\noflinetableparts}{\the\!!counta}}%
+ \processcommacommand[\linetableparameter\c!n]\docommand
+ \initializetableboxes\noflinetableparts
+ \ifcase\linetablerepeat
+ \globallet\linetablepart\!!plusone
+ \else
+ \globallet\linetablepart\!!zerocount % repeater
+ \fi
+ \globallet\linetablestep\!!plusone
+ \globallet\linetableline\!!zerocount
+ \globallet\linetablerow \!!zerocount
+ \global\linetablecolumn \zerocount
+ \global\linetablesubcol \zerocount
+ \global\linetablewidth \zeropoint
+\iflinetablepreroll \else \ifdim\pagetotal>\zeropoint
+ \verticalstrut\kern-\struttotal
+\fi \fi
+ \setnoftableslines
+ \checklinetablepage
+ \let\BR\linetableBR
+ \let\ER\linetableER
+ \let\BH\linetableBR
+ \let\EH\linetableER
+ \let\BC\linetableBC
+ \let\EC\linetableEC
+ \let\NC\linetableNC
+ \let\NR\linetableNR
+ \flushlinetablehead}
+
+\unexpanded\def\stoplinetablerun
+ {\globallet\linetableline\!!maxcard
+ \chardef\linetableheadstate\zerocount % blocked
+ \flushlinetableparts
+ \iflinetablepreroll \else
+ \linetableparameter\c!after
+ \fi
+ \globallet\linetablepart \!!zerocount
+ \globallet\noflinetableparts\!!zerocount
+ \egroup}
+
+% \def\checklinecolumnwidth
+% {\ifundefined{\??lew\number\linetablecolumn}%
+% \donetrue
+% \else\ifdim\getvalue{\??lew\number\linetablecolumn}<\wd\linetablecell
+% \donetrue
+% \else
+% \donefalse
+% \fi\fi
+% \ifdone
+% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}%
+% \fi}
+%
+% \def\checklinecolumnwidth
+% {\ifcsname\??lew\number\linetablecolumn\endcsname
+% \ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell
+% \donetrue
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}%
+% \fi}
+
+% \def\checklinecolumnwidth
+% {\expandafter\xdef\csname\??lew\number\linetablecolumn\endcsname
+% {\expandafter\ifx\csname\??lew\number\linetablecolumn\endcsname\relax
+% \the\wd\linetablecell
+% \else\ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell
+% \the\wd\linetablecell
+% \else
+% \csname\??lew\number\linetablecolumn\endcsname
+% \fi\fi}}
+
+\def\checklinecolumndimension#1#2#3%
+ {\expandafter\xdef\csname#1\number#3\endcsname
+ {\expandafter\ifx\csname#1\number#3\endcsname\relax
+ \the#2\linetablecell
+ \else\ifdim\csname#1\number#3\endcsname<#2\linetablecell
+ \the#2\linetablecell
+ \else
+ \csname#1\number#3\endcsname
+ \fi\fi}}
+
+\def\checklinecolumnwidth {\checklinecolumndimension\??lew\wd\linetablecolumn}
+\def\checklinecolumnheight{\checklinecolumndimension\??leh\ht\linetablerow}
+\def\checklinecolumndepth {\checklinecolumndimension\??led\dp\linetablerow}
+
+\def\linetableBR
+ {\dosingleempty\dolinetableBR}
+
+\def\dolinetableBR[#1]% #1 not yet implemented
+ {\ifnum\linetableheadstate=1\else
+ \doglobal\increment\linetablerow
+ \doglobal\increment\linetablerows
+ \fi
+ \global\linetablecolumn\plusone
+ \global\linetablesubcol\plusone
+% \linetableheight\linetablerparameter\c!height
+%
+% \ifx\linetableheight\empty
+% % nothing
+% \else\ifx\linetableheight\v!fit
+% % keep it simple
+% \else\ifx\linetableheight\v!line
+% \chardef\linetablemode\plusone
+% \else
+% \!!heighta\linetableheight
+% \advance\!!heighta-\strutdepth
+% \fi\fi\fi
+%
+ \linetableheight\zeropoint
+ \edef\!!stringa{\linetablerparameter\c!height}%
+ \ifx\!!stringa\empty
+ \chardef\linetablehmode\zerocount
+ \else\ifx\!!stringa\v!fit
+ \chardef\linetablehmode\plusone
+ \else\ifx\!!stringa\v!line
+ \chardef\linetablehmode\plustwo
+ \else
+ \linetableheight\!!stringa
+ \advance\linetableheight-\strutdepth
+ \fi\fi\fi
+%
+ \startlinetablepart}
+
+\def\linetableBC
+ {\startlinetablecell}
+
+\def\linetableEC
+ {\stoplinetablecell
+ \iflinetablepreroll
+ \checklinecolumnwidth
+ \checklinecolumnheight
+ \checklinecolumndepth
+ \fi
+ \checklinetablepart}
+
+\def\linetableER
+ {% \stoplinetablecell
+ % no \box\linetablecell, i.e. dummy columnn, last \NC \NR
+ \stoplinetablepart
+ \savelinetablepart
+ \advance\linetablecolumn \minusone
+ \ifnum\linetablecolumn>\noflinetablecolumns
+ \xdef\noflinetablecolumns{\number\linetablecolumn}%
+ \fi
+ \flushlinetableparts
+ \global\linetablecolumn\zerocount
+ \global\linetablewidth \zeropoint
+ \ifcase\linetablerepeat
+ \globallet\linetablepart\!!plusone
+ \else
+ \globallet\linetablepart\!!zerocount % repeater
+ \fi
+ \checklinetablepage
+ \flushlinetablehead}
+
+\def\checklinetablepage
+ {\global\chardef\linetablepage\zerocount
+ \ifcase\linetablerepeat \else \ifcase\linetablepage
+ \doif{\linetableparameter\c!repeat}\v!no
+ {\global\chardef\linetablepage\doifoddpageelse\plusone\plustwo}%
+ \fi \fi}
+
+\def\flushlinetablehead
+ {\ifcase\linetableheadstate
+ % 0 blocked
+ \or
+ % 1 doing head
+ \or
+ % 2 head done
+ \or
+ % 3 trigger flush
+ \chardef\linetableheadstate\plusone
+ \the\@@linetablehead\relax
+ \chardef\linetableheadstate\plustwo
+ \fi}
+
+\def\linetableNC % first time special treatment
+ {\relax
+ \ifcase\linetablecolumn
+ \linetableBR
+ \else
+ \linetableEC
+ \fi
+ \linetableBC} % beware, this will result in BR BC EC BC NR
+
+\def\linetableNR
+ {\stoplinetablecell % dummy
+ \linetableER}
+
+\unexpanded\def\startlinetable
+ {\startlinetablerun}
+
+\unexpanded\def\stoplinetable
+ {\stoplinetablerun}
+
+\unexpanded\def\startlinetableanalysis
+ {\bgroup
+ \linetableprerolltrue
+ \trialtypesettingtrue
+ \startlinetablerun}
+
+\unexpanded\def\stoplinetableanalysis
+ {\stoplinetablerun
+ \egroup
+ \globallet\noflinetablerows\linetablerows
+ \dorecurse\noflinetablerows % global, from last run {\linetableparameter\c!n}
+ {%\writestatus{linetable}{\recurselevel->\getvalue{\??lew\recurselevel}}%
+ \setevalue{\??ler\recurselevel x\c!height}{\getvalue{\??leh\recurselevel}}%
+ \setevalue{\??ler\recurselevel x\c!depth }{\getvalue{\??led\recurselevel}}%
+ \letgvalue{\??leh\recurselevel}\!!zeropoint
+ \letgvalue{\??led\recurselevel}\!!zeropoint}
+ \dorecurse\noflinetablecolumns % global, from last run {\linetableparameter\c!n}
+ {%\writestatus{linetable}{\recurselevel->\getvalue{\??lew\recurselevel}}%
+ \setevalue{\??lec\recurselevel\c!width}{\getvalue{\??lew\recurselevel}}%
+ \letgvalue{\??lew\recurselevel}\!!zeropoint}} % init next table
+
+% todo: store in box instead of macro
+
+\newtoks \@@linetablehead
+
+\long\unexpanded\def\startlinetablehead#1\stoplinetablehead
+ {\ifinlinetable
+ \@@linetablehead\emptytoks
+ \fi
+ \chardef\linetableheadstate3 % full
+ \@@linetablehead{#1}%
+ \ifinlinetable
+ \flushlinetablehead
+ \fi}
+
+\def\linetableBH
+ {\ifx\EC\relax
+ % signal, grabbing lines
+ \else
+ \@@linetablehead\emptytoks
+ \fi
+ \pushmacro\BC
+ \pushmacro\EC
+ \def\BC##1\EC{\appendtoks##1\to\@@linetablehead}%
+ \let\EC\relax} % signal
+
+\def\linetableEH
+ {\popmacro\EC
+ \popmacro\BC
+ \@EA\startlinetablehead\the\@@linetablehead\stoplinetablehead}
+
+\let\startlinetablebody\donothing
+\let\stoplinetablebody \donothing
+
+\def\processlinetablebuffer
+ {\dosingleempty\doprocesslinetablebuffer}
+
+\def\doprocesslinetablebuffer[#1]%
+ {\bgroup
+ \let\startlinetable\donothing
+ \let\stoplinetable \donothing
+ \startlinetableanalysis\getbuffer[#1]\stoplinetableanalysis
+ \startlinetablerun \getbuffer[#1]\stoplinetablerun
+ \egroup}
+
+\def\processlinetablefile#1%
+ {\bgroup
+ \let\startlinetable\donothing
+ \let\stoplinetable \donothing
+ \startlinetableanalysis\readfile{#1}\donothing\donothing\stoplinetableanalysis
+ \startlinetablerun \readfile{#1}\donothing\donothing\stoplinetablerun
+ \egroup}
+
+% will go away:
+
+\def\processlinetableXMLfile#1%
+ {\bgroup
+ \let\startlinetable\donothing
+ \let\stoplinetable \donothing
+ \startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis
+ \startlinetablerun \processXMLfile{#1}\stoplinetablerun
+ \egroup}
+
+\protect \endinput
+
+\doifnotmode{demo}{\endinput}
+
+\setuplinetable[n=6,m={2,2,2},lines=25] % m ?
+
+\setuplinetable[c][1] [width=2cm,background=color,backgroundcolor=red]
+\setuplinetable[c][4] [width=3cm,background=color,backgroundcolor=yellow]
+\setuplinetable[c][6] [width=3cm,background=color,backgroundcolor=magenta]
+\setuplinetable[r][odd] [background=color,backgroundcolor=gray]
+\setuplinetable[r][even][background=color,backgroundcolor=green]
+
+\starttext
+
+\showframe \showstruts
+
+\setupcolors[state=start]
+
+\setuppagenumbering[alternative=doublesided]\page[left]
+
+\startlinetable
+\NC aaa\crlf aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR
+\dorecurse{100}{\NC aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR}
+\stoplinetable
+
+\startlinetable
+\NC[style=slanted,color=green,background=color,backgroundcolor=darkred,nx=2,uitlijnen=middle] xxx
+ \NC yy \NC ddddd \NC eeee \NC ff \NC \NR
+\dorecurse{100}{\NC aaa \NC bb \NC c \NC ddddd \NC eeee \NC ff \NC \NR}
+\stoplinetable
+
+% \startbuffer[lt]
+% \NC aaa\crlf aaa \NC bb \NC c \NC ddddd \NC ee \NC ff \NC \NR
+% \NC aaa\crlf aaa \NC b \NC cc \NC ddd \NC eeee \NC f \NC \NR
+% \stopbuffer
+%
+% \processlinetablebuffer[lt]
+
+\stoptext
diff --git a/tex/context/base/tabl-ntb.mkii b/tex/context/base/tabl-ntb.mkii
new file mode 100644
index 000000000..0bfcc20c6
--- /dev/null
+++ b/tex/context/base/tabl-ntb.mkii
@@ -0,0 +1,1586 @@
+%D \module
+%D [ file=core-ntb,
+%D version=2000.04.18,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Natural Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is an unfinished, preliminary module. At least two
+%D runs are needed to get the table fixed. Ugly code.
+
+% todo: special parsetb for argless variant
+% todo: protect \tbl...
+% todo: tblnx also count
+% todo: get rid of recurse
+% todo: fast if
+% todo: avoid halign (just do it manual) and thereby globals
+
+% optie=rek beschrijven
+
+\writestatus{loading}{ConTeXt Table Macros / Natural Tables}
+
+%D As always, this is the nth version. Much time went in
+%D trying to speed up the many cell calculations, some
+%D optimizations were rejected in order not to complicate this
+%D module too much (and in order to prevail extensibility).
+
+% shapebox fails here in mkii
+%
+% \setupcolors[state=start]
+% \bTABLE
+% \bTR [align=middle]\bTH Range\eTH{}\bTH Value\eTH{}\eTR
+% \bTR \bTD \type{<} 12\eTD{}\bTD 3\eTD{}\eTR
+% \bTR \bTD 12--16\eTD{}\bTD 2\eTD{}\eTR
+% \bTR \bTD \type{>}16\eTD{}\bTD 1\eTD{}\eTR
+% \eTABLE
+
+% \starttext
+% \placefigure[left]{}{}
+% \startlinecorrection \dontleavehmode \bTABLE
+% \bTR \bTD oeps \eTD \eTR
+% \eTABLE
+% \stoplinecorrection
+% \placefigure[right]{}{}
+% \startlinecorrection \dontleavehmode \bTABLE
+% \bTR \bTD oeps \eTD \eTR
+% \eTABLE
+% \stoplinecorrection
+% \stoptext
+
+%D To Do:
+%D
+%D \starttyping
+%D splitsen = ja | herhaal => als nofTH>1 then ja als herhaal
+%D \stoptyping
+
+%D To Do:
+%D
+%D \starttyping
+%D break over pagina
+%D kop herhalen
+%D reset settings
+%D
+%D \setupTABLE [c|column|x] [nx|odd|even|first|last][a=b]
+%D \setupTABLE [r|row |y] [nx|odd|even|first|last][a=b]
+%D \setupTABLE [nx|odd|even|first|last][ny|odd|even|first|last][a=b]
+%D \setupTABLE [nx|odd|even|first|last] [a=b]
+%D \setupTABLE [a=b]
+%D
+%D \bTH \eTH
+%D \stoptyping
+
+% the section setup does not work yet, data needs to be stored,
+% i.e.each row should know if it's a head/body/foot, and there
+% should be \setupTABLE[head]... and alike
+
+\unprotect
+
+%D A simple way to force equal line spacing is to say:
+%D
+%D \starttyping
+%D \def\bTBLCELL{\begstrut}
+%D \def\eTBLCELL{\endstrut}
+%D \stoptyping
+
+%D However, the next alternative also takes care of preceding
+%D and following white space.
+
+% \def\bTBLCELL % why not \doinhibitblank
+% {\inhibitblank\doconvertfont\tbltblstyle\empty\everypar{\delayedbegstrut}}
+
+% \def\eTBLCELL
+% {\ifhmode
+% \delayedendstrut
+% \par % added 13/4/2006
+% \else
+% \par
+% \ifdim\prevdepth<\zeropoint % =-1000pt ?
+% \vskip-\strutdp
+% \else
+% \removebottomthings
+% \fi
+% \fi}
+
+%D \startbuffer
+%D \bTABLE[left={(},right={)},top=\startnarrower,bottom=\stopnarrower]
+%D \bTR \bTD something \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\bTBLCELL % why not \doinhibitblank
+ {\inhibitblank
+ \doconvertfont\tbltblstyle\empty
+ \everypar{\tbltblleft\delayedbegstrut}}
+
+\def\eTBLCELL
+ {\ifhmode
+ \delayedendstrut
+ \tbltblright
+ \par % added 13/4/2006
+ \else
+ % not sure yet:\tbltblright
+ \par
+ \ifdim\prevdepth<\zeropoint % =-1000pt ?
+ \vskip-\strutdp
+ \else
+ \removebottomthings
+ \fi
+ \fi}
+
+\newcount\currenttbl
+
+\def\@@tbl{tbl} \def\tblcell{1} \def\tblnone{2}
+
+\def\@@tblprefix{tbl:} \let\@@rawtblprefix\@@tblprefix
+
+%D This should be done more efficient: soon
+
+% \let as well as \expandafter\edef's
+
+\newcounter\TBLlevel
+
+\def\@@tblprefix{\@@tbl:\ifnum\TBLlevel>1 :\TBLlevel:\fi}
+
+% \def\tblsetprefix % not yet used, figure out when .. may interfere with setup
+% {\edef\@@tblprefix{\@@tbl:\ifnum\TBLlevel>1 :\TBLlevel:\fi}}
+
+\def\settblnob#1{\expandafter\let\csname\@@tblprefix\number#1:b\endcsname\plusone}
+\def\gettblnob#1{\ifcsname\@@tblprefix\number#1:b\endcsname\plusone\else\zerocount\fi}
+
+\def\settbltag#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:s\endcsname}
+\def\settblcol#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:c\endcsname}
+\def\settblrow#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:r\endcsname}
+
+\def\lettbltag#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:s\endcsname}
+\def\lettblcol#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:c\endcsname}
+\def\lettblrow#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:r\endcsname}
+
+\def\settblwd#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:wd\endcsname} % global !
+\def\settblht#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:ht\endcsname} % global !
+\def\lettblwd#1#2{\global\expandafter\let\csname\@@tblprefix\number#1:\number#2:wd\endcsname} % global !
+\def\lettblht#1#2{\global\expandafter\let\csname\@@tblprefix\number#1:\number#2:ht\endcsname} % global !
+
+\def\gettbltag#1#2{\csname\@@tblprefix\number#1:\number#2:s\endcsname}
+\def\gettblcol#1#2{\csname\@@tblprefix\number#1:\number#2:c\endcsname}
+\def\gettblrow#1#2{\csname\@@tblprefix\number#1:\number#2:r\endcsname}
+
+\def\gettblwd #1#2{\csname\@@tblprefix\number#1:\number#2:wd\endcsname}
+\def\gettblht #1#2{\csname\@@tblprefix\number#1:\number#2:ht\endcsname}
+
+\def\settblwid#1{\expandafter\xdef\csname\@@tblprefix\number#1:w\endcsname} % {#2} global !
+\def\settblhei#1{\expandafter\xdef\csname\@@tblprefix\number#1:h\endcsname} % {#2} global !
+\def\settbldis#1{\expandafter\xdef\csname\@@tblprefix\number#1:d\endcsname} % {#2} global !
+\def\settblaut#1{\expandafter\xdef\csname\@@tblprefix\number#1:a\endcsname} % {#2} global !
+
+\def\lettblwid#1{\global\expandafter\let\csname\@@tblprefix\number#1:w\endcsname} % {#2} global !
+\def\lettblhei#1{\global\expandafter\let\csname\@@tblprefix\number#1:h\endcsname} % {#2} global !
+\def\lettbldis#1{\global\expandafter\let\csname\@@tblprefix\number#1:d\endcsname} % {#2} global !
+\def\lettblaut#1{\global\expandafter\let\csname\@@tblprefix\number#1:a\endcsname} % {#2} global !
+
+\def\gettblwid#1{\ifcsname\@@tblprefix\number#1:w\endcsname\csname\@@tblprefix\number#1:w\endcsname\else\zeropoint\fi}
+\def\gettblhei#1{\ifcsname\@@tblprefix\number#1:h\endcsname\csname\@@tblprefix\number#1:h\endcsname\else\zeropoint\fi}
+\def\gettbldis#1{\ifcsname\@@tblprefix\number#1:d\endcsname\csname\@@tblprefix\number#1:d\endcsname\else\zeropoint\fi}
+\def\gettblaut#1{\csname \@@tblprefix\number#1:a\endcsname}
+
+\def\doiftbltag #1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi}
+\def\doifnottbltag #1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\gobbleoneargument \else\@EA\firstofoneargument \fi}
+\def\doifelsetbltag#1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi}
+\def\doiftblrow #1#2{\ifcsname\@@tblprefix\number#1:\number#2:r\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi}
+\def\doiftblcol #1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi}
+\def\doifnottblcol #1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\@EA\gobbleoneargument \else\@EA\firstofoneargument \fi}
+
+\def\tbltagstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\zerocount\else\plusone\fi}
+\def\tblrowstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:r\endcsname\zerocount\else\plusone\fi}
+\def\tblcolstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\zerocount\else\plusone\fi}
+
+\def\settblspn #1{\expandafter\let\csname\@@tblprefix\number#1:s\endcsname \!!plusone}
+\def\doifelsetblspn#1{\doifelse {\csname\@@tblprefix\number#1:s\endcsname}\!!plusone}
+% \def\doifelsetblspn#1{\@EA\ifx\csname\@@tblprefix\number#1:s\endcsname\plusone\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi}
+
+\def\settblspn #1{\setvalue {\@@tblprefix\number#1:s}{1}}
+\def\doifelsetblspn#1{\doifelsevalue{\@@tblprefix\number#1:s}{1}}
+
+% \long\def\settbltxt#1#2#3%
+% {\setxvalue{\@@tblprefix#1:#2:l}{\TBLlevel}%
+% \long\setvalue{\@@tblprefix#1:#2:t}%
+% {\doifdefined{\@@tblprefix#1:#2:l}
+% {\edef\TBLlevel{\getvalue{\@@tblprefix#1:#2:l}}}%
+% #3}}
+
+\long\def\settbltxt#1#2#3%
+ {\long\@EA\def\csname\@@tblprefix\number#1:\number#2:t\@EA\endcsname\@EA{\@EA\def\@EA\TBLlevel\@EA{\TBLlevel}#3}}
+
+\def\gettbltxt#1#2%
+ {\csname\@@tblprefix\number#1:\number#2:t\endcsname}
+
+\newtoks\tbltoks
+\newtoks\tblrowtoks
+
+\let\pushTBLparameters\relax
+\let\popTBLparameters \relax
+
+\newif\ifsqueezeTBLspan \squeezeTBLspantrue % spans one column cell over multi column par cells
+\newif\ifautosqueezeTBLspan \autosqueezeTBLspantrue % unless explicit widths are given
+\newif\ifautoTBLspread \autoTBLspreadfalse
+\newif\ifautoTBLhsize \autoTBLhsizetrue
+\newif\ifautoTBLrowspan \autoTBLrowspantrue
+\newif\ifautoTBLemptycell \autoTBLemptycelltrue
+\newif\ifautoTBLcheckwidth \autoTBLcheckwidthtrue
+\newif\ifappendTBLsetups \appendTBLsetupstrue
+\newif\ifenableTBLbreak \enableTBLbreakfalse
+\newif\ifmultipleTBLheads \multipleTBLheadsfalse
+
+\newif\iftraceTABLE \traceTABLEfalse
+
+\def\noftblheadlines{0}
+\def\noftblnextlines{0}
+\def\noftblhdnxlines{0}
+
+\presetlocalframed[\@@tbl\@@tbl]
+
+\long\def\handleTBLcell#1#2[#3]{}
+
+\long\def\bTC#1\eTC{\bTD#1\eTD}
+\long\def\bTX#1\eTX{\bTD#1\eTD}
+\long\def\bTY#1\eTY{\bTR#1\eTR}
+
+\let\getTABLEparameters\getparameters
+
+\unexpanded\def\setupTABLE
+ {\dotripleempty\dosetupTABLE}
+
+\def\dosetupTABLE[#1][#2][#3]%
+ {\ifthirdargument
+ \processaction
+ [#1]
+ [ \v!row=>{\dosetupTABLExy[\c!y][#2][#3]},%
+ \v!column=>{\dosetupTABLExy[\c!x][#2][#3]},%
+ r=>{\dosetupTABLExy[\c!y][#2][#3]},%
+ c=>{\dosetupTABLExy[\c!x][#2][#3]},%
+ y=>{\dosetupTABLExy[\c!y][#2][#3]},%
+ x=>{\dosetupTABLExy[\c!x][#2][#3]},%
+ \v!start=>{\dosetupTABLExy[#1][#2][#3]},%
+ \v!header=>{\dosetupTABLExy[#1][#2][#3]},%
+ \s!unknown=>{\dosetupTABLEzz[#1][#2][#3]}]%
+ \else\ifsecondargument
+ \processaction
+ [#1]
+ [ \v!row=>{\dosetupTABLExy[\c!y][\v!each][#2]},%
+ \v!column=>{\dosetupTABLExy[\c!x][\v!each][#2]},%
+ r=>{\dosetupTABLExy[\c!y][\v!each][#2]},%
+ c=>{\dosetupTABLExy[\c!x][\v!each][#2]},%
+ y=>{\dosetupTABLExy[\c!y][\v!each][#2]},%
+ x=>{\dosetupTABLExy[\c!x][\v!each][#2]},%
+ \v!start=>{\dosetupTABLExy[#1][\v!each][#2]},%
+ \v!header=>{\dosetupTABLExy[#1][\v!each][#2]},%
+ \s!unknown=>{\dosetupTABLEzz[\c!x][#1][#2]}]%
+ \else
+ \getparameters[\@@tbl\@@tbl][#1]%
+ \fi\fi}
+
+\def\dosetupTABLExy[#1][#2][#3]%
+ {\def\dodosetupTABLE##1{\setTABLEparameters[#1##1][#3]}%
+ \processcommalist[#2]\dodosetupTABLE}
+
+\def\dosetupTABLEzz[#1][#2][#3]%
+ {\def\dodosetupTABLE##1%
+ {\def\dododosetupTABLE####1{\setTABLEparameters[\c!x##1\c!y####1][#3]}%
+ \processcommalist[#2]\dododosetupTABLE}%
+ \processcommalist[#1]\dodosetupTABLE}
+
+\def\nopTABLEparameters[#1][#2]%
+ {\letvalue{\@@tblprefix#1}\empty}
+
+\def\setTABLEparameters[#1][#2]%
+ {\pushTBLparameters
+ \ifappendTBLsetups
+ \doifdefinedelse{\@@tblprefix#1}
+ {\def\getTABLEparameters[##1][##2]%
+ {\setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][##2,#2]}}%
+ \getvalue{\@@tblprefix#1}%
+ \let\getTABLEparameters\getparameters}
+ {\setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][#2]}}%
+ \else
+ \setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][#2]}%
+ \fi
+ \popTBLparameters}
+
+\let\setupTBLsection\relax
+
+% % \setupTABLE [y] [first][background=color,backgroundcolor=blue,frame=off,bottomframe=on,topframe=on,framecolor=white]
+% \setupTABLE [first][first][backgroundcorner=2,corner=10,frame=on]
+% \setupTABLE [last] [first][backgroundcorner=4,corner=12,frame=on]
+%
+% \setupTABLE [row] [each] [background=color,backgroundcolor=blue,frame=on,framecolor=white]
+% \setupTABLE [first][2] [corner=8]
+% \setupTABLE [last] [2] [corner=5]
+% \setupTABLE [first][last] [corner=7]
+% \setupTABLE [last] [last] [corner=6]
+%
+% \startTEXpage
+% \bTABLE[frame=off,align=middle]
+% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
+% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
+% \bTR \bTD alpha \eTD \bTD beta \eTD \bTD gamma \eTD \eTR
+% \eTABLE
+% \stopTEXpage
+%
+% \setupTABLE [first] [two][corner=2] % special case
+% \setupTABLE [last] [two][corner=4] % special case
+%
+% % % \setupTABLE [one] [first] ... special case of span
+%
+% \startTEXpage
+% \bTABLE[frame=off,align=middle]
+% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
+% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
+% \eTABLE
+% \stopTEXpage
+
+\def\setupTBLcell#1#2% cell over col over row
+ {\setupTBLsection % already forgotten
+ \edef\positiverow{\number#1}%
+ \edef\positivecol{\number#2}%
+ \edef\negativerow{\the\numexpr-\maximumrow+#1+\minusone\relax}%
+ \edef\negativecol{\the\numexpr-\maximumcol+#2+\minusone\relax}%
+ % each each
+ \csname\@@tblprefix\c!x\v!each\c!y\v!each\endcsname
+ \csname\@@tblprefix\c!y\v!each\endcsname
+ \csname\@@tblprefix\c!x\v!each\endcsname
+ % odd even
+ \csname\@@tblprefix\c!y\v!oddeven\positiverow\endcsname
+ \csname\@@tblprefix\c!x\v!oddeven\positivecol\endcsname
+ \csname\@@tblprefix\c!x\v!oddeven\positivecol\c!y\v!oddeven\positiverow\endcsname
+ % row/col number combinations
+ \ifcsname\@@tblprefix\c!y\positiverow\endcsname\csname\@@tblprefix\c!y\positiverow\endcsname\fi
+ \ifcsname\@@tblprefix\c!y\negativerow\endcsname\csname\@@tblprefix\c!y\negativerow\endcsname\fi
+ \csname\@@tbl\@@tbl\c!extras\endcsname
+ \@EA\let\csname\@@tbl\@@tbl\c!extras\endcsname\relax % new, see x-fo
+ \ifcsname\@@tblprefix\c!x\positivecol\endcsname\csname\@@tblprefix\c!x\positivecol\endcsname\fi
+ \ifcsname\@@tblprefix\c!x\negativecol\endcsname\csname\@@tblprefix\c!x\negativecol\endcsname\fi
+ \csname\@@tbl\@@tbl\c!extras\endcsname
+ \@EA\let\csname\@@tbl\@@tbl\c!extras\endcsname\relax % new, see x-fo
+ % first/last combinations
+ \ifnum\positiverow=\plusone
+ \csname\@@tblprefix\c!y\v!first\endcsname
+ \ifcsname\@@tblprefix\c!x\positivecol\c!y\v!first\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\v!first\endcsname\fi
+ \fi
+ \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\endcsname
+ \ifcsname\@@tblprefix\c!x\v!first\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\v!first\c!y\positiverow\endcsname\fi
+ \fi
+ \ifnum\positiverow=\maximumrow\relax
+ \csname\@@tblprefix\c!y\v!last\endcsname
+ \ifcsname\@@tblprefix\c!x\positivecol\c!y\v!last\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\v!last\endcsname\fi
+ \fi
+ \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\endcsname
+ \ifcsname\@@tblprefix\c!x\v!last\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\v!last\c!y\positiverow\endcsname\fi
+ \fi
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\c!y\v!last\endcsname
+ \fi\fi
+ \ifnum\positiverow=\plusone \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\c!y\v!first\endcsname
+ \fi\fi
+ \ifnum\positiverow=\plusone \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\c!y\v!first\endcsname
+ \fi\fi
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\c!y\v!last\endcsname
+ \fi\fi
+ % special case: two rows and last row : two&first and two&last (round corners)
+ \ifnum\maximumrow=\plustwo\relax
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\c!y\v!two\endcsname
+ \fi\fi
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\c!y\v!two\endcsname
+ \fi\fi
+ \fi
+ \ifnum\gettblcol\positiverow\positivecol=\maximumcol\relax % top span over whole width
+ \ifnum\positiverow=\plusone
+ \csname\@@tblprefix\c!x\v!one\c!y\v!first\endcsname
+ \fi
+ \ifnum\positiverow=\maximumrow\relax
+ \csname\@@tblprefix\c!x\v!one\c!y\v!last\endcsname
+ \fi
+ \fi
+ % header things
+ \ifnum#1>\noftblhdnxlines\else
+ \ifcsname\@@tblprefix\v!header\v!each \endcsname\csname\@@tblprefix\v!header\v!each \endcsname\fi
+ \ifcsname\@@tblprefix\v!header\positivecol\endcsname\csname\@@tblprefix\v!header\positivecol\endcsname\fi
+ \fi
+ % explicit cells
+ \ifcsname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\fi
+ \ifcsname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\csname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\fi
+ % done
+ \global\letcscsname\@@tblsplitafter\csname\@@tbl\@@tbl\c!after\endcsname
+ \relax}
+
+% we cannot use +n (checking on number/last/first would slow down too much)
+%
+% \setupTABLE[r] [2][color=red]
+% \setupTABLE[r] [-2][color=red]
+% \setupTABLE[c] [2][color=green]
+% \setupTABLE[c] [-2][color=green]
+% \setupTABLE[4] [4][color=blue]
+% \setupTABLE[-4][-4][color=blue]
+%
+% \bTABLE
+% \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR}
+% \eTABLE
+
+\globallet\@@tblsplitafter\relax
+
+% split + page:
+%
+% \bTABLE[split=yes]
+% \bTR \bTD left \eTD\bTD right \eTD\eTR
+% \bTR[after=\page] \bTD left \eTD\bTD right \eTD\eTR
+% \bTR \bTD left \eTD\bTD right \eTD\eTR
+% \eTABLE
+
+% todo: protect counters
+
+\newcount\row \newcount\col
+\newcount\xrow \newcount\xcol
+\newcount\xxrow \newcount\xxcol
+\newcount\maximumrow \newcount\maximumcol \newcount\maximumrowspan
+ \newcount\currentcol
+\newcount\tblspn
+
+\def\parseTR[#1][#2]% [#2] is dummy that kills spaces / no #3 argument
+ {\currentcol\zerocount
+ \advance\maximumrow\plusone
+ \iffirstargument\setTABLEparameters[\c!y\number\maximumrow][#1]\fi}
+
+\def\settblref#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:x\endcsname}
+\def\gettblref#1#2{\ifcsname\@@tblprefix\number#1:\number#2:x\endcsname\csname\@@tblprefix\number#1:\number#2:x\endcsname\fi}
+
+\long\def\parseTD[#1][#2]#3\eTD % [#2] is dummy that kills spaces
+ {\def\tblny{\tblnr}%
+ \def\tblnx{\tblnc}%
+ \let\tblnc\plusone
+ \let\tblnr\plusone
+ \let\tbln\currentcol
+ \let\tblm\empty
+ \iffirstargument
+ \getparameters[\@@tbl][#1]%
+ \fi
+ % goto first cell % NEW, n/m=cellnumber
+ \edef\@@tblnindeed{\csname\@@tbl\c!n\endcsname}%
+ \ifx\@@tblnindeed\empty
+ \global\advance\tblspn\tblnx\relax
+ \else\ifnum\@@tblnindeed=\currentcol\else
+ \scratchcounter\numexpr\@@tblnindeed-\currentcol+\minusone-\tblspn\relax
+ \ifnum\scratchcounter>\zerocount
+ \expanded{\parseTD[\c!nx=\the\scratchcounter,\c!n=,\c!m=,*sq=\v!no][]}\eTD
+ \fi
+ % can also be made faster
+ \getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]%
+ \fi\fi
+ \edef\@@tblmindeed{\csname\@@tbl\c!m\endcsname}%
+ \ifx\@@tblmindeed\empty \else
+ \ifnum\@@tblmindeed=\currentcol \else
+ \scratchcounter\numexpr\@@tblmindeed-\currentcol+\minusone-\tblspn\relax
+ \dorecurse\scratchcounter{\expanded{\parseTD[\c!n=,\c!m=][]}\eTD}%
+ % can be sped up
+ \getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]%
+ \fi
+ \fi
+ \doloop % skip over columns that result from earlier span
+ {\advance\currentcol\plusone
+ \doifnottbltag\maximumrow\currentcol\exitloop}%
+ % == \def\next{\advance\currentcol\plusone\doiftbltag\maximumrow\currentcol\next}\next
+ % fill r*c cells and set span
+ \ifnum\tblnx=\plusone
+ \ifnum\tblny=\plusone
+ \ifnum\currentcol>\maximumcol\relax
+ \maximumcol\currentcol
+ \fi
+ \else
+ \presetTBLcell
+ \fi
+ \else
+ \presetTBLcell
+ \fi
+ % set values
+ \lettbltag\maximumrow\currentcol\tblcell
+ \settblcol\maximumrow\currentcol{\number\tblnx}%
+ \settblrow\maximumrow\currentcol{\number\tblny}%
+ \settblref\maximumrow\currentcol{\ifcsname\@@tbl\c!action\endcsname\csname\@@tbl\c!action\endcsname\fi}%
+ % save text
+ \edef\celltag{{\number\maximumrow}{\number\currentcol}}%
+ \@EA\settbltxt\@EA\maximumrow\@EA\currentcol\@EA{\@EA\handleTBLcell\celltag[#1]{#3}}}
+
+\def\presetTBLcell
+ {\row\maximumrow
+ \col\currentcol
+ \dorecurse\tblny
+ {\col\currentcol
+ \settblcol\row\col{\number\tblnx}%
+ \ifnum\tblnx>\maximumrowspan\relax
+ \maximumrowspan\tblnx
+ \fi
+ \dorecurse\tblnx
+ {\lettbltag\row\col\tblnone
+ \advance\col\plusone}%
+ \advance\row\plusone}%
+ % check max column
+ \advance\col\minusone
+ \ifnum\col>\maximumcol\relax
+ \maximumcol\col
+ \fi}
+
+%D The usage of n and m:
+%D
+%D \startbuffer
+%D \bTABLE[width=3em]
+%D \bTR\bTD d1 \eTD\bTD[n=2] d2 \eTD\bTD[n=5] d5 \eTD\bTD[n=7] d7 \eTD\eTR
+%D \bTR\bTD f1 \eTD\bTD[n=4] f4 \eTD\bTD[n=5] f5 \eTD\bTD[n=7] f7 \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \bTABLE[width=3em]
+%D \bTR\bTD d1 \eTD\bTD[m=2] d2 \eTD\bTD[m=5] d5 \eTD\bTD[m=7] d7 \eTD\eTR
+%D \bTR\bTD f1 \eTD\bTD[m=4] f4 \eTD\bTD[m=5] f5 \eTD\bTD[m=7] f7 \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \bTABLE[frame=on]
+%D \bTR \bTH[nc=3] One \eTH \bTH[m=4] Four \eTH\eTR
+%D \bTR \bTD a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \eTABLE
+%D
+%D \bTABLE[frame=on]
+%D \bTR \bTH[nr=2] One \eTH \bTH[m=3] Three \eTH\eTR
+%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\long\def\parseTH[#1]#2\eTH
+ {\parseTD[#1,\c!color=\tbltblheadcolor,\c!style=\tbltblheadstyle,\c!aligncharacter=\v!no]#2\eTD}
+
+%D new
+
+\long\def\parseTN[#1]#2\eTN
+ {\parseTD[#1]\digits#2\relax\eTD}
+
+%D Vit Zyka needed the option to create a distance between columns, so I
+%D added support for individual column distances.
+%D
+%D \startbuffer
+%D % \setupTABLE[c][each][distance=2em]
+%D \setupTABLE[c][1][distance=2em]
+%D \setupTABLE[c][2][distance=3em]
+%D
+%D \bTABLE
+%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
+%D \eTABLE
+%D
+%D \bTABLE[option=stretch]
+%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+%D
+%D and he provided patches for the global left and right margin distances
+%D as well as the columndistance (although i changed the names -). Here
+%D is his testcase:
+%D
+%D \startbuffer
+%D \framed[offset=overlay]\bgroup
+%D \setupTABLE[column][2][align=left]%
+%D \setupTABLE[column][3][align=right]%
+%D \bTABLE[columndistance=2cm,leftmargindistance=.3cm,rightmargindistance=.5cm]
+%D \bTR \bTH[nc=3] Table head\eTH \eTR
+%D \bTR \bTD[nc=2] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD[nc=2,align=left] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD[nc=2,align=middle] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD A\eTD \bTD B\eTD \bTD C\eTD \eTR
+%D \bTR \bTD Aa\eTD \bTD Bb\eTD \bTD Cccc\eTD \eTR
+%D \bTR \bTD[nc=3,align=middle] ABC\eTD \eTR
+%D \eTABLE
+%D \egroup
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+\newtoks\TBLhead
+\newtoks\TBLnext
+\newtoks\TBLbody
+\newtoks\TBLfoot
+
+% to be done: head <raw> foot, dus state var
+
+\unexpanded\def\bTABLEhead{\dosingleempty\doTABLEhead} \let\eTABLEhead\relax
+\unexpanded\def\bTABLEnext{\dosingleempty\doTABLEnext} \let\eTABLEnext\relax
+\unexpanded\def\bTABLEbody{\dosingleempty\doTABLEbody} \let\eTABLEbody\relax
+\unexpanded\def\bTABLEfoot{\dosingleempty\doTABLEfoot} \let\eTABLEfoot\relax
+
+\long\def\doTABLEhead[#1]#2\eTABLEhead{\appendtoks\doTABLEsection[#1]{#2}\to\TBLhead}
+\long\def\doTABLEnext[#1]#2\eTABLEnext{\appendtoks\doTABLEsection[#1]{#2}\to\TBLnext}
+\long\def\doTABLEbody[#1]#2\eTABLEbody{\appendtoks\doTABLEsection[#1]{#2}\to\TBLbody}
+\long\def\doTABLEfoot[#1]#2\eTABLEfoot{\appendtoks\doTABLEsection[#1]{#2}\to\TBLfoot}
+
+
+\long\def\doTABLEsection[#1]#2%
+ {\def\setupTBLsection{\getparameters[\@@tbl\@@tbl][#1]}%
+ #2%
+ \let\setupTBLsection\relax}
+
+\let\pushTBL\relax
+\let\popTBL \relax
+
+\chardef\tblpass=0
+
+\def\presetallTABLEparameters% each odd|even level / can be sped up but only once per table
+ {\executeifdefined{\@@rawtblprefix\v!start\v!each}\relax
+ \executeifdefined{\@@rawtblprefix\v!start\v!oddeven\TBLlevel}\relax
+ \executeifdefined{\@@rawtblprefix\v!start\number\TBLlevel}\relax}
+
+\def\bTABLE
+ {\dosingleempty\dobTABLE}
+
+\def\dobTABLE[#1]%
+ {\pushTBL
+ % box not here
+ \bgroup
+ \TBLhead\emptytoks
+ \TBLnext\emptytoks
+ \TBLbody\emptytoks
+ \TBLfoot\emptytoks
+ \ifhmode\kern\zeropoint\fi % blocks \removeunwantedspaces: check this on icare handelingsschema
+ \resetcharacteralign % new
+ \getparameters
+ [\@@tbl\@@tbl]
+ [\c!align={\v!right,\v!broad,\v!high},#1]%
+ \hsize\tbltbltextwidth
+ \processaction
+ [\tbltblsplit]
+ [ \v!yes=>\enableTBLbreaktrue,
+ \v!repeat=>\enableTBLbreaktrue\multipleTBLheadstrue,
+ \v!auto=>\ifinsidesplitfloat\enableTBLbreaktrue\fi]
+ \processaction
+ [\tbltblheader]
+ [\v!repeat=>\multipleTBLheadstrue]%
+ \localcolortrue
+ \presetallTABLEparameters
+ \ExpandFirstAfter\processallactionsinset
+ [\tbltbloption]
+ [\v!stretch=>\autoTBLspreadtrue]%
+ \linewidth\tbltblrulethickness % needs to be frozen
+ \dontcomplain
+ \currentcol\zerocount
+ \maximumrowspan\plusone
+ \maximumcol\zerocount
+ \maximumrow\zerocount
+ \let\bTR\dobTR
+ \let\bTD\dobTD
+ \let\bTH\dobTH
+ \let\bTN\dobTN}
+
+\unexpanded\def\dobTR{\dodoubleempty\parseTR}
+\unexpanded\def\dobTD{\dodoubleempty\parseTD}
+\unexpanded\def\dobTH{\dodoubleempty\parseTH}
+\unexpanded\def\dobTN{\dodoubleempty\parseTN}
+
+% permits \expanded{\bTD ... \eTD}
+
+\unexpanded\def\eTR{\ignorespaces}
+\unexpanded\def\eTD{\ignorespaces}
+\unexpanded\def\eTH{\ignorespaces}
+\unexpanded\def\eTN{\ignorespaces}
+
+\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
+ {% tricky and dirty order -)
+ \doifsometokselse\TBLhead % slow, better a flag
+ {\the\TBLhead
+ \edef\noftblheadlines{\number\maximumrow}%
+ \doifsometokselse\TBLnext
+ {\the\TBLnext
+ \edef\noftblnextlines{\number\numexpr\maximumrow-\noftblheadlines\relax}}%
+ {\let\noftblnextlines\zerocount}% was 1
+ \edef\noftblhdnxlines{\number\maximumrow}}
+ {\let\noftblheadlines\zerocount % was 1
+ \let\noftblnextlines\zerocount
+ \let\noftblhdnxlines\zerocount}%
+ \the\TBLbody
+ \the\TBLfoot
+ \removeunwantedspaces % only if hmode
+ % finish cells
+ \dorecurse\maximumrow
+ {\row\recurselevel\relax
+ \dorecurse\maximumcol
+ {\col\recurselevel\relax
+ \doifnottbltag\row\col
+ {\xxcol\col
+ \xxrow\row
+ \xrow\row
+ \doloop
+ {\xcol\col
+ \doloop
+ {\doifelsetbltag\xrow\xcol \exitloop
+ {\advance\xcol\plusone
+ \ifnum\xcol>\maximumcol\relax \exitloop \fi}}%
+ \doifelsetbltag\xrow\xcol \exitloop
+ {\xxrow\xrow \xxcol\xcol \advance\xrow\plusone
+ \ifnum\xrow>\maximumrow \exitloop \fi}}%
+ \ifnum\xxrow>\maximumrow\xxrow\maximumrow\fi
+ \ifnum\xxcol>\maximumcol\xxcol\maximumcol\fi
+ \xxrow\numexpr\xxrow-\row+\plusone\relax
+ \xxcol\numexpr\xxcol-\col+\plusone\relax
+ \xrow\row
+ \dorecurse\xxrow
+ {\xcol\col \settblcol\xrow\xcol{\number\xxcol}%
+ \dorecurse\xxcol
+ {\lettbltag\xrow\xcol\tblnone \advance\xcol\plusone}%
+ \advance\xrow\plusone}%
+ \lettbltag\row\col\tblcell
+ \settblcol\row\col{\the\xxcol}%
+ \settblrow\row\col{\the\xxrow}%
+ \ifautoTBLemptycell
+ \edef\celltag{{\number\row}{\number\col}}%
+ \@EA\settbltxt\@EA\row\@EA\col\@EA{\@EA\handleTBLcell\celltag[]{\strut}}%
+ \fi}}}%
+ % to be sure
+ \dorecurse\maximumrow
+ {\row\recurselevel\relax
+ \dorecurse\maximumcol
+ {\col\recurselevel\relax
+ \doiftblrow\row\col
+ {\scratchcounter\numexpr\maximumrow-\row+\plusone\relax
+ \ifnum\gettblrow\row\col>\scratchcounter
+ \settblrow\row\col{\the\scratchcounter}%
+ \fi}%
+ \lettblht\row\col\zeropoint
+ \lettblwd\row\col\zeropoint
+ \doifnottblcol\row\col{\lettblcol\row\col\zerocount}%
+ \doifnottbltag\row\col{\lettbltag\row\col\tblnone}}}%
+ % check and do
+ \ifcase\maximumcol\else
+ \startTBLprocessing
+ \begTBL
+ \dorecurse\maximumrow
+ {\bTBL
+ \row\recurselevel\relax
+ \dorecurse\maximumcol
+ {\col\recurselevel\relax
+ \expanded{\doTBL{\number\row}{\number\col}}}%
+ \eTBL}%
+ \removeunwantedspaces % only if hmode
+ \endTBL
+ \stopTBLprocessing
+ % wrong ! ! ! better to have an auto-offset-overlay
+ % \ifnum\TBLlevel>1
+ % \vskip-\strutdp
+ % \fi
+ \fi
+ \egroup
+ \popTBL}
+
+\let\startTBLprocessing\relax
+\let\stopTBLprocessing \relax
+
+\newcount\prelocatedTBLrows % \prelocateTBLrows{1000} may speed up large tables
+
+\def\bTBL{\tblrowtoks\emptytoks}
+\def\eTBL{\tbltoks\@EA\@EA\@EA{\@EA\the\@EA\tbltoks\@EA\begintblrow\the\tblrowtoks\endtblrow}}%
+
+\def\prelocateTBLerror
+ {\writestatus\m!systems{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \number\prelocatedTBLrows)}}
+
+\def\prelocateTBLrows#1% we start at zero so we have one to much, better play safe anyway
+ {\dostepwiserecurse\prelocatedTBLrows{#1}\plusone{\expandafter\newtoks\csname tbl:\recurselevel\endcsname}%
+ \def\bTBL
+ {\ifnum\tblrow<\prelocatedTBLrows\relax
+ \@EA\let\@EA\tblrowtoks\csname tbl:\the\tblrow\endcsname\tblrowtoks\emptytoks
+ \else
+ \prelocateTBLerror
+ \fi}%
+ \def\eTBL
+ {\tbltoks\@EA\@EA\@EA{\@EA\the\@EA\tbltoks\@EA\begintblrow\@EA\the\csname tbl:\the\tblrow\endcsname\endtblrow}}%
+ \global\prelocatedTBLrows#1\relax}
+
+% \prelocateTBLrows{1000} % may speed up large tables
+
+% We use aligments to handle the empty (skipped) columns, so
+% that we don't have to (re|)|calculate these.
+
+\def\skiptblcol
+ {\global\advance\tblcol\plusone}
+
+\def\nexttblcol
+ {\global\advance\tblcol\plusone
+ \kern\tbltblcolumndistance
+ &}
+
+\def\spantblcol
+ {\span}
+
+\newcount\tblrow
+\newcount\tblcol
+
+\let\savedtblrow\!!zerocount
+\let\savedtblcol\!!zerocount
+
+\def\begintblrow
+ {\noalign
+ {\global\advance\tblrow\plusone
+ \global\tblcol\zerocount
+ \global\tblspn\zerocount}%
+ \nexttblcol
+ \kern\dimexpr\tbltblleftmargindistance-\tbltblcolumndistance\relax}
+
+\def\endtblrow
+ {\kern\dimexpr\tbltblrightmargindistance-\tbltblcolumndistance\relax
+ \crcr
+ \noalign
+ {\nointerlineskip
+ \ifnum\gettblnob\tblrow=\zerocount
+ \allowbreak
+ \fi
+ \bgroup % protect local vars
+ \@@tblsplitafter
+ \egroup
+ \bgroup % protect local vars
+ \scratchcounter\numexpr\tblrow+\plusone\relax
+ \ifnum\scratchcounter>\noftblhdnxlines\relax
+ \ifnum\scratchcounter<\maximumrow\relax
+ \doifsomething\tbltblspaceinbetween{\blank[\tbltblspaceinbetween]}%
+ \fi
+ \fi
+ \egroup}}
+
+\def\begintbl
+ {\global\tblspn\zerocount
+ \global\tblcol\zerocount
+ \global\tblrow\zerocount
+ \global\advance\tblrow\minusone
+ \tabskip\zeropoint
+ \halign\bgroup
+ \registerparoptions % new
+ \ignorespaces##\unskip&&\ignorespaces##\unskip\cr}
+
+\def\endtbl
+ {\egroup}
+
+\setvalue{\tblnone TBL}#1#2%
+ {\spanTBL{#1}{#2}}
+
+\setvalue{\tblcell TBL}#1#2%
+ {\tblrowtoks\expandafter{\the\tblrowtoks\makeTBL #1 #2 }% space delimited -> less tokens
+ \spanTBL{#1}{#2}}
+
+\def\spanTBL#1#2%
+ {\scratchcounter\gettblcol{#1}{#2}\relax
+ \ifnum\scratchcounter>\zerocount
+ \advance\scratchcounter \minusone
+ \dorecurse\scratchcounter{\tblrowtoks\expandafter{\the\tblrowtoks\spantblcol}}%
+ \dorecurse\scratchcounter{\tblrowtoks\expandafter{\the\tblrowtoks\skiptblcol}}%
+ \tblrowtoks\expandafter{\the\tblrowtoks\nexttblcol}%
+ \fi}
+
+\def\doTBL#1#2%
+ {\csname\gettbltag{#1}{#2}TBL\endcsname{#1}{#2}}
+
+\def\begTBL
+ {\global\tblspn\zerocount
+ \global\tblrow\zerocount
+ \global\tblcol\zerocount
+ \chardef\tblpass\zerocount
+ \tbltoks\emptytoks}
+
+\def\flushtbltoks{\begintbl\the\tbltoks\endtbl}
+
+\def\domakeTBLone#1 #2 %
+ {\gettbltxt{#1}{#2}}%
+
+\def\domakeTBLtwo#1 #2 % meer in cellD
+ {\scratchdimen\zeropoint
+ \scratchcounter\tblcol
+ \!!counta\gettblcol{#1}{#2}\relax
+ \dorecurse\!!counta
+ {\advance\scratchdimen\dimexpr\gettblwid\scratchcounter+\tbltblcolumndistance\relax
+ \ifnum\recurselevel<\!!counta \advance\scratchdimen \gettbldis\scratchcounter\fi
+ \advance\scratchcounter\plusone}%
+ \edef\widthTBL{\the\dimexpr\scratchdimen-\tbltblcolumndistance\relax}%
+ \setbox\scratchbox\hbox{\gettbltxt{#1}{#2}}%
+ \settblht{#1}{#2}{\the\ht\scratchbox}%
+ \settblwd{#1}{#2}{\the\wd\scratchbox}%
+ \ifdim\ht\scratchbox>\gettblhei{#1}\relax
+ \settblhei{#1}{\the\ht\scratchbox}%
+ \fi}%
+
+\def\domakeTBLthree#1 #2 %
+ {% height
+ \!!counta \gettblcol{#1}{#2}\relax
+ \!!countb \gettblrow{#1}{#2}\relax
+ \!!heighta\gettblht {#1}{#2}\relax
+ \scratchdimen\zeropoint
+ \ifnum\!!counta=\maximumcol\relax
+ % case: nc=maxcolumns
+ \else
+ \scratchcounter#1\relax
+ \dorecurse\!!countb
+ {\advance\scratchdimen
+ \gettblhei\scratchcounter
+ \advance\scratchcounter\plusone}%
+ \ifdim\scratchdimen<\!!heighta\relax
+ \scratchdimen\!!heighta
+ \fi
+ \fi
+ \edef\heightTBL{\the\scratchdimen}%
+ % width
+ \scratchdimen\zeropoint
+ \scratchcounter\tblcol
+ \dorecurse\!!counta
+ {\advance\scratchdimen\dimexpr\gettblwid\scratchcounter+\tbltblcolumndistance\relax
+ \ifnum\recurselevel<\!!counta \advance\scratchdimen \gettbldis\scratchcounter\fi
+ \advance\scratchcounter\plusone}%
+ \edef\widthTBL{\the\dimexpr\scratchdimen-\tbltblcolumndistance\relax}%
+ % cell
+ \setbox\scratchbox\hbox{\gettbltxt{#1}{#2}}%
+ \ifnum\!!counta=\maximumcol\relax
+ % case: nc=maxcolumns
+ \else
+ \scratchdimen\gettblhei{#1}%
+ \setbox\scratchbox\hbox
+ {\lower\ht\scratchbox\hbox{\raise\scratchdimen\box\scratchbox}}%
+ \ht\scratchbox\scratchdimen
+ \fi
+ \dp\scratchbox\zeropoint
+ \edef\!!stringa{\gettblref{#1}{#2}}%
+ \ifx\!!stringa\empty
+ \box\scratchbox
+ \else
+ \expanded{\gotobox{\box\scratchbox}[\!!stringa]}%
+ \fi
+ \box\scratchbox}
+
+\def\inTBLcell#1#2% hm, do we need #1 #2 ? we use tblcol anyway
+ {\ExpandBothAfter\doifinsetelse\localwidth{\v!fit,\v!broad} % user set
+ {}
+ {\scratchdimen\gettblaut\tblcol\relax
+ \ifdim\localwidth>\scratchdimen
+ \settblaut\tblcol{\the\dimexpr\localwidth\relax}%
+ \fi}}%
+
+\def\endTBL
+ {\setbox\scratchbox\hbox
+ {\localframed
+ [\@@tbl\@@tbl]
+ [\c!frame=\v!off,\c!background=,\c!align=\v!no]
+ {\strut}}%
+ \edef\minimalcellheight{\the\ht\scratchbox}%
+ \dorecurse\maximumcol
+ {\lettblaut\recurselevel\zeropoint
+ % new
+ \xcol\recurselevel\relax
+ \dorecurse\maximumrow
+ {\lettblwd\recurselevel\xcol\zeropoint
+ \lettblht\recurselevel\xcol\zeropoint}%
+ % till here
+ \lettblwid\recurselevel\zeropoint
+ \lettbldis\recurselevel\zeropoint}%
+ \dorecurse\maximumrow
+ {\lettblhei\recurselevel\maxdimen}%
+ \chardef\tblpass\plusone
+ \let\makeTBL\domakeTBLone
+ \let\handleTBLcell\dohandleTBLcellA
+ \setbox0\vbox{\trialtypesettingtrue \flushtbltoks}%
+% \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \lettbldis\maximumcol\zeropoint
+ \ifautoTBLspread
+ % experimental, stretch non fixed cells to \hsize
+ \checktblwidthsone % trial run
+ \checktblwidthstwo % real run
+ \stretchtblwidths
+ \let\handleTBLcell\dohandleTBLcellB
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \else\ifdim\wd0>\hsize
+ \ifautoTBLhsize
+ \checktblwidthsone % trial run
+ \checktblwidthstwo % real run
+ \let\handleTBLcell\dohandleTBLcellB
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \fi
+ \else\ifautoTBLrowspan\ifnum\maximumrowspan>1 % max ?
+ % added jan 2002 because nx=* did no longer work
+ \edef\savedhsize{\the\hsize}%
+ \hsize\wd0\relax % new per 17/04/2006
+ \checktblwidthsone % trial run
+ \checktblwidthstwo % real run
+ \hsize\savedhsize
+ %
+ \let\handleTBLcell\dohandleTBLcellC
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \fi\fi\fi\fi
+ \let\handleTBLcell\dohandleTBLcellD
+ \chardef\tblpass\plustwo
+ \let\makeTBL\domakeTBLtwo
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \checktblheightsone
+ \checktblheightstwo
+ \let\handleTBLcell\dohandleTBLcellE
+ \chardef\tblpass\plusthree
+ \let\makeTBL\domakeTBLthree
+ \ifnum\TBLlevel>\plusone
+ \@EA\notsplittblbox
+ \else\ifenableTBLbreak
+ \@EAEAEA\splittblbox
+ \else
+ \@EAEAEA\notsplittblbox
+ \fi\fi{\flushtbltoks}}
+
+\def\stretchtblwidths % more variants, e.g. a max to \dimend
+ {\ifcase\maximumcol\else % else division by zero
+ \!!dimend\zeropoint
+ \!!dimene\hsize
+ \dorecurse\maximumcol
+ {\advance\!!dimend\dimexpr\gettblwid\recurselevel+\tbltblcolumndistance\relax
+ \advance\!!dimene-\gettbldis\recurselevel}%
+ \advance\!!dimend\dimexpr-\tbltblcolumndistance+\tbltblleftmargindistance+\tbltblrightmargindistance\relax
+ % distribute width (stretch)
+ \ifdim\!!dimend<\!!dimene
+ \advance\!!dimend-\!!dimene
+ \!!dimend-\!!dimend
+ \divide\!!dimend\maximumcol
+ \dorecurse\maximumcol
+ {\settblwid\recurselevel{\the\dimexpr\gettblwid\recurselevel+\!!dimend\relax}}%
+ \fi
+ \fi}
+
+\newbox\finaltblbox
+
+\def\notsplittblbox#1%
+ {\setbox\finaltblbox\vbox{#1}%
+ \postprocessTABLEbox\finaltblbox
+ \beforeTABLEbox
+ \box\finaltblbox
+ \afterTABLEbox}
+
+\def\splittblbox#1%
+ {\ifinsidesplitfloat
+ \donetrue
+ \else\ifinsidefloat
+ \donefalse
+ \else
+ \donetrue
+ \fi\fi
+ \ifdone
+ \executeifdefined{dosplittblbox\tbltblsplitmethod}\dosplittblbox{#1}%
+ \else
+ \notsplittblbox{#1}%
+ \fi}
+
+\newbox\TABLEsplitbox % public, don't change
+
+\let\extratblsplitheight\zeropoint % additional space taken by before/afterTABLEsplitbox
+
+\def\dosplittblbox#1%
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{\dimexpr\extratblsplitheight+\tbltblsplitoffset\relax}%
+ \def\tsplitbeforeresult {\beforeTABLEsplitbox}%
+ \def\tsplitafterresult {\afterTABLEsplitbox}%
+ \def\tsplitafter {\@@tblsplitafter}%
+ \setbox\tsplitcontent\vbox{#1}%
+ \ifmultipleTBLheads
+ \dorecurse\noftblheadlines
+ {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvcopy\tsplithead\unvcopy\scratchbox}}%
+ \dorecurse\noftblnextlines
+ {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}%
+ \fi
+ \doifsomething\tbltblspaceinbetween
+ {\def\tsplitinbetween{\blank[\tbltblspaceinbetween]}}%
+ \def\postprocesstsplit{\postprocessTABLEsplitbox{\box\tsplitresult}}%
+ \handletsplit}
+
+% ! ! ! ! TODO: naast \postprocessTABLEsplitbox ook evt \postprocessTABLEbox voor niet split
+
+\let\postprocessTABLEsplitbox\gobbleoneargument
+\let\postprocessTABLEbox \gobbleoneargument
+
+\let\beforeTABLEsplitbox\relax
+\let\afterTABLEsplitbox \relax
+\let\beforeTABLEbox \relax
+\let\afterTABLEbox \relax
+
+\def\checktblwidthsone{\dochecktblwidths0} % 0 = trial run
+\def\checktblwidthstwo{\dochecktblwidths1} % 1 = real run
+
+\def\dochecktblwidths#1%
+ {\iftraceTABLE\showtblwids{B#1}\fi
+ \!!counta\zerocount
+ \!!dimena\dimexpr\hsize-\tbltblleftmargindistance-\tbltblrightmargindistance-\tbltblcolumndistance\relax
+ \dorecurse\maximumcol
+ {\scratchdimen\gettblaut\recurselevel\relax
+ \advance\!!dimena-\gettbldis\recurselevel\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \advance\!!dimena -\scratchdimen
+ \else
+ \scratchdimen\gettblwid\recurselevel\relax
+ \ifdim\scratchdimen>\tbltblmaxwidth\relax
+ \ifcase#1\else\lettblwid\recurselevel\zeropoint\fi
+ \advance\!!counta \plusone
+ \else
+ \ifdim\scratchdimen>\zeropoint\relax
+ \advance\!!dimena -\scratchdimen
+ \else
+ % eigenlijk moet dit alleen als de kolom wordt overspannen door een
+ % vorige, maw extra dubbele loop en status var
+ \advance\!!counta \plusone
+ \fi
+ \fi
+ \fi}%
+ \ifcase\!!counta \else \divide\!!dimena \!!counta \fi
+ \dorecurse\maximumcol
+ {\scratchdimen\gettblwid\recurselevel\relax
+ \ifcase#1\relax
+ \ifdim\scratchdimen<\!!dimena % take natural width
+ \settblaut\recurselevel{\the\scratchdimen}%
+ \fi
+ \else
+ \ifdim\scratchdimen=\zeropoint % auto set width
+ \settblwid\recurselevel{\the\!!dimena}%
+ \fi
+ \fi}%
+ \iftraceTABLE\showtblwids{E#1}\fi}
+
+\newcount\xrowTBL
+\newcount\xcolTBL
+\newcount\xxrowTBL
+
+% dikke arg naar recurse wegwerken
+
+\def\dochecktblheightsone
+ {\!!countb\gettblrow\xrowTBL\xcolTBL\relax
+ % check row span
+ \ifnum\!!countb>\plusone
+ % current height in row
+ \dimen0=\gettblht\xrowTBL\xcolTBL
+ % find nearest height in row
+ \dimen2=\zeropoint
+ \dorecurse\maximumcol
+ {\ifnum\recurselevel=\xcolTBL\else
+ \doiftblrow\xrowTBL\recurselevel
+ {\!!countc=\gettblrow\xrowTBL\recurselevel\relax
+ \ifnum\!!countc=\plusone
+ \dimen4=\gettblht\xrowTBL\recurselevel\relax
+ \ifdim\dimen2<\dimen4
+ \dimen2=\dimen4
+ \fi
+ \fi}%
+ \fi}%
+ \xxrowTBL\xrowTBL
+ % calculate cummulative height
+ \dimen4=\dimen2
+ \!!countc\xrowTBL
+ \advance\!!countc\minusone
+ \dorecurse\!!countb
+ {\ifnum\xxrowTBL=\xrowTBL\else
+ \advance\dimen4 \gettblhei\xxrowTBL
+ \fi
+ \ifnum\recurselevel=\!!countb\else
+ \settblnob\!!countc
+ \advance\!!countc\plusone
+ \fi
+ \advance\xxrowTBL\plusone}%
+ % distribute overshoot equally
+\ifdim\dimen2>\zeropoint % see natural-003
+ \ifdim\dimen4<\dimen0
+ \advance\dimen0 -\dimen4
+ \divide\dimen0 \!!countb
+ \xxrowTBL\xrowTBL
+ \settblhei\xrowTBL{\the\dimen2}%
+ \dorecurse\!!countb
+ {\dorecurse\maximumcol
+ {\ifnum\recurselevel=\xcolTBL\else
+ \scratchdimen\dimexpr\gettblht\xxrowTBL\recurselevel+\dimen0\relax
+ \settblht\xxrowTBL\recurselevel{\the\scratchdimen}%
+ \ifdim\gettblhei\xxrowTBL<\scratchdimen
+ \settblhei\xxrowTBL{\the\scratchdimen}%
+ \fi
+ \fi}%
+ \advance\xxrowTBL\plusone}%
+ \else\ifdim\dimen4>\dimen0
+ \settblhei\xrowTBL{\the\dimen2}%
+ \fi\fi
+\fi
+ \fi}
+
+\def\checktblheightsone
+ {\dorecurse\maximumrow
+ {\xrowTBL\recurselevel\relax
+ \dorecurse\maximumcol
+ {\xcolTBL\recurselevel\relax
+ \doiftblrow\xrowTBL\xcolTBL\dochecktblheightsone}}}
+
+\def\checktblheightstwo
+ {}
+
+\def\showtblwids#1%
+ {\vbox
+ {\forgetall\tttf[#1]\dorecurse\maximumcol
+ {\scratchdimen\gettblwid\recurselevel\relax
+ [\recurselevel:\the\scratchdimen]}}}
+
+\def\TBLcharalign
+ {\doifelse\tbltblaligncharacter\v!yes
+ \doTBLcharalign\gobbleoneargument}
+
+\long\def\doTBLcharalign#1#2% column data
+ {\edef\alignmentclass{#1}%
+ \edef\alignmentcharacter{\tbltblalignmentcharacter}%
+ \ifcase\tblpass\or
+ \setfirstpasscharacteralign\checkalignment{#2}% {\strut#2\unskip}%
+ \fi % force hsize, so always a second
+ \setsecondpasscharacteralign \checkalignment{#2}% {\strut#2\unskip}%
+ \ignorespaces}
+
+% new, needed for icare first col of 'doeltabel', experimental
+
+\long\def\dohandleTBLcellA#1#2[#3]#4% grouping added ! ! !
+ {\bgroup
+ \setupTBLcell{#1}{#2}%
+ \setbox\scratchbox\hbox
+ {\scratchdimen\tbltbldistance\relax
+ \ifdim\scratchdimen>\gettbldis{#2}\relax
+ \settbldis{#2}{\the\scratchdimen}%
+ \fi
+ \localframed
+ [\@@tbl\@@tbl]
+ [#3,\c!background=,\c!frame=\v!off]% 25% faster
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL\inTBLcell{#1}{#2}}}%
+ \scratchdimen\gettblwid\tblcol\relax
+ \ifdim\wd\scratchbox>\scratchdimen
+ \ifsqueezeTBLspan
+ \ifautosqueezeTBLspan
+ \doifinsetelse\tbltblwidth{\v!fit,\v!fixed,\v!broad,\v!local}
+ \donetrue \donefalse
+ \else
+ \donetrue
+ \fi
+ \ifdone % brr, 0
+ \ifnum\number\gettblcol{#1}{#2}>\plusone \settblspn\tblcol\fi
+ \fi
+ \fi
+ \doifelsetblspn\tblcol
+ \donothing
+ {\ifdim\gettblwid\tblcol<\wd\scratchbox
+ \settblwid\tblcol{\the\wd\scratchbox}%
+ \fi}% auto set
+ \fi
+ \scratchcounter\numexpr\tblrow+\plusone\relax
+ \scratchdimen\gettblhei\scratchcounter\relax
+ \ifdim\ht\scratchbox<\scratchdimen
+ \settblhei\scratchcounter{\the\ht\scratchbox}% auto set
+ \fi
+ \settblht{#1}{#2}{\the\ht\scratchbox}%
+ \settblwd{#1}{#2}{\the\wd\scratchbox}%
+ \ifautoTBLcheckwidth
+ \ifdim\wd\scratchbox<.75\hsize
+ \ifdim\ht\scratchbox>2\openlineheight % honor width since this
+ \scratchdimen\gettblaut\tblcol\relax % can be a figure or so
+ \ifdim\scratchdimen=\zeropoint
+ % side effect: when width is set to 0pt,
+ % we can force a span that fits the sum of spans widths
+ \settblaut\tblcol{\the\scratchdimen}%
+ \else\ifdim\wd\scratchbox>\scratchdimen
+ % unless span
+ \settblaut\tblcol{\the\wd\scratchbox}%
+ % to be translated
+ \writestatus\m!TABLE
+ {no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}%
+ \fi\fi
+ \fi
+ \fi
+ \fi
+ \setbox2\null
+ \wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox
+ \box2
+ \egroup}
+
+\long\def\dohandleTBLcellBC#1#2#3[#4]#5%
+ {\setbox\scratchbox\hbox
+ {\setupTBLcell{#2}{#3}%
+ \localframed
+ [\@@tbl\@@tbl]
+ [#4,#1,\c!frame=\v!off,\c!background=]
+ {\bTBLCELL#5\eTBLCELL}}%
+ \setbox2\null
+ \wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox
+ \ifautoTBLrowspan
+ \scratchcounter\numexpr\tblrow+\plusone\relax
+ \doiftblrow\scratchcounter\tblcol
+ {\scratchdimen\gettblhei\scratchcounter\relax % moved inside test
+ \ifnum\gettblrow\scratchcounter\tblcol>\plusone \ifdim\ht\scratchbox>\scratchdimen
+ \scratchdimen-\scratchdimen \advance\scratchdimen -\ht\scratchbox
+ \ht2\scratchdimen
+ \fi \fi}%
+ \fi
+ \box2 }
+
+\long\def\dohandleTBLcellB#1#2[#3]#4%
+ {\scratchdimen\gettblaut\tblcol\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \let\tblwidthkey\c!width
+ \edef\tblwidth{\the\scratchdimen}%
+ \else
+ \scratchdimen\gettblwid\tblcol\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \ifnum\gettblcol{#1}{#2}=\maximumcol\relax
+ \scratchdimen\hsize
+ \fi
+ \let\tblwidthkey\c!width
+ \edef\tblwidth{\the\scratchdimen}%
+ \else
+ \let\tblwidthkey\s!unknown
+ \let\tblwidth\zeropoint
+ \fi
+ \fi
+ \dohandleTBLcellBC{\tblwidthkey=\tblwidth}{#1}{#2}[#3]{\TBLcharalign{#2}{#4}}}
+
+\long\def\dohandleTBLcellC
+ {\dohandleTBLcellBC{}}
+
+\long\def\dohandleTBLcellD#1#2[#3]#4%
+ {\setupTBLcell{#1}{#2}%
+ \bgroup
+ \localframed
+ [\@@tbl\@@tbl]
+ [#3,\c!width=\widthTBL,\c!background=,\c!frame=\v!off]% 25% faster
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}%
+ \egroup}
+
+\long\def\dohandleTBLcellE#1#2[#3]#4%
+ {\setupTBLcell{#1}{#2}%
+ \getparameters[\@@tbl\@@tbl][#3]% to get the color right, the way we
+ \color % handle color here prevents interference due to whatsit nodes
+ [\tbltblcolor] % as well as permits local colors to take precedence
+ {\ifdim\heightTBL=\zeropoint\relax % case: nc=maxcolumns
+ \localframed
+ [\@@tbl\@@tbl]
+ [\c!color=,\c!width=\widthTBL]
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}%
+ \else
+ \localframed
+ [\@@tbl\@@tbl]
+ [\c!color=,\c!width=\widthTBL,\c!height=\heightTBL]
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}%
+ \fi}%
+ \hskip\gettbldis{#2}}
+
+\setupTABLE
+ [\c!frameoffset=.5\linewidth,
+ \c!backgroundoffset=\v!frame,
+ \c!framecolor=\s!black,
+ \c!color=,
+ \c!style=,
+ \c!headstyle=\v!bold,
+ \c!headcolor=,
+ \c!strut=\v!yes,
+ \c!autostrut=\v!no,
+ \c!aligncharacter=\v!no,
+ \c!alignmentcharacter={,},
+ \c!option=, % \v!stretch
+ \c!header=,
+ \c!spaceinbetween=,
+ \c!maxwidth=8em,
+ \c!textwidth=\hsize,
+ \c!split=\v!auto,
+ \c!splitoffset=0pt,
+ \c!distance=\zeropoint, % individual column
+ \c!columndistance=\zeropoint, % each column (whole table)
+ \c!leftmargindistance=\zeropoint, % whole table
+ \c!rightmargindistance=\zeropoint,% whole table
+ \c!left=,
+ \c!right=,
+ \c!splitmethod=a]
+
+%D We have already prepared the previous macros for nesting,
+%D so we only have to pop in the right ones:
+
+%D New:
+
+\def\pushTBLparameters
+ {\globalpushmacro\TBLlevel
+ \ifcase\tblpass
+ % we're just after \bTABLE
+ \else\ifnum\TBLlevel>\zerocount
+ \doglobal\increment\TBLlevel\relax
+ \fi\fi}
+
+\def\popTBLparameters
+ {\globalpopmacro\TBLlevel}
+
+\def\pushTBL
+ {\ifnum\TBLlevel=\zerocount
+ \global\advance\currenttbl\plusone
+ \fi
+ \doglobal\increment\TBLlevel\relax
+ \ifnum\TBLlevel>\plusone
+ \resetallTABLEparameters
+ % we need a proper count push/pop
+ \xdef\savedtblrow{\the\tblrow}\globalpushmacro\savedtblrow
+ \xdef\savedtblcol{\the\tblcol}\globalpushmacro\savedtblcol
+ \else
+ \global\intabletrue
+ \fi}
+
+\def\popTBL
+ {\ifnum\TBLlevel>\plusone
+ \globalpopmacro\savedtblrow\global\tblrow\savedtblrow
+ \globalpopmacro\savedtblcol\global\tblcol\savedtblcol
+ \else
+ \global\intablefalse
+ \fi
+ \doglobal\decrement\TBLlevel\relax}
+
+% \bgroup
+% \setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
+% \bTABLE
+% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,2 \eTD \bTD
+% {\setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
+% \bTABLE
+% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,2 \eTD \bTD 2 \eTD \eTR \eTABLE} \eTD \eTR
+% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
+% \eTABLE
+% \egroup
+
+\newconditional\resetTABLEmode \settrue\resetTABLEmode
+
+\def\resetallTABLEparameters% moet genest wel werken
+ {\ifnum\TBLlevel>\plusone % in ieder geval
+ \ifconditional\resetTABLEmode
+ \presetlocalframed % breedte hoogte diepte offset
+ [\@@tbl\@@tbl]% % achtergrond, achtergrondraster, achtergrondkleur
+ % not ok yet
+ \setupTABLE [%
+ \c!frameoffset=.5\linewidth,
+ \c!backgroundoffset=\v!frame,
+ \c!framecolor=\s!black,
+ \c!width=fit,
+ \c!height=fit,
+\c!autowidth=\v!yes,
+% \c!rulethickness=\linewidth,
+% \c!strut=\v!no,
+\c!strut=\v!yes, % needed for mathml, but ... maybe we need another resetTABLEmode
+\c!autostrut=\v!no,
+ \c!color=,
+ \c!style=,
+ \c!headstyle=,
+ \c!headcolor=,
+ \c!aligncharacter=\v!no,
+ \c!alignmentcharacter={,},
+ \c!maxwidth=8em]%
+ \else
+ \setupTABLE
+ [\c!width=\v!fit,
+ \c!height=\v!fit]%
+ \fi
+ \fi}
+
+%D Spacing:
+%
+% \starttabulate
+% \NC text \NC text \NC \NR
+% \TB[small]
+% \NC text \NC text \NC \NR
+% \TB[4*big]
+% \NC text \NC text \NC \NR
+% \stoptabulate
+%
+% \starttable[|||]
+% \VL text \VL text \VL \AR
+% \TB[small]
+% \VL text \VL text \VL \AR
+% \TB[4*big]
+% \VL text \VL text \VL \AR
+% \stoptable
+
+\def\complexTableTB[#1]{\TABLEnoalign{\blank[#1]}}
+\def\simpleTableTB {\TABLEnoalign{\blank}}
+
+\def\TabulateTB
+ {\complexorsimpleTable{TB}}
+
+\def\doTableinterline% #1
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \chuckTABLEautorow
+ \else\ifnum\currentTABLEcolumn=\zerocount
+ \TABLEnoalign
+ {\globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow}%
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi\fi
+ \complexorsimpleTable} % {#1}
+
+\def\TableHL{\doTableinterline{HL}}
+\def\TableTB{\doTableinterline{TB}}
+
+\appendtoks\let\TB\TableTB \to\everytable
+\appendtoks\let\TB\TabulateTB\to\everytabulate % strange place
+
+\appendtoks \chardef\recodeverbatimmode\plustwo \to \everytable
+
+% new (for Olivier Turlier)
+%
+% \defineTABLEsetup [xx] [foregroundcolor=red]
+%
+% \bTABLE
+% \bTR \bTD oeps \eTD \bTD oeps \eTD \eTR
+% \bTR \bTDs[xx] oeps \eTDs \bTD oeps \eTD \eTR
+% \bTRs[xx] \bTD oeps \eTD \bTD oeps \eTD \eTRs
+% \eTABLE
+
+\def\defineTABLEsetup
+ {\dodoubleargument\dodefineTABLEsetup}
+
+\def\dodefineTABLEsetup[#1][#2]%
+ {\setvalue{\@@tbl:set:#1}{#2}}
+
+\long\def\bTDs[#1]#2\eTDs
+ {\doifdefinedelse{\@@tbl:set:#1}
+ {\@EA\@EA\@EA\bTD\@EA\@EA\@EA[\csname\@@tbl:set:#1\endcsname]#2\eTD}
+ {\bTD[]#2\eTD}}
+
+\long\def\bTRs[#1]#2\eTRs
+ {\doifdefinedelse{\@@tbl:set:#1}
+ {\@EA\@EA\@EA\bTR\@EA\@EA\@EA[\csname\@@tbl:set:#1\endcsname]#2\eTR}
+ {\bTR[]#2\eTR}}
+
+\protect \endinput
+
+% todo: mode: first|next (of niets)
diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv
new file mode 100644
index 000000000..b24eaa85d
--- /dev/null
+++ b/tex/context/base/tabl-ntb.mkiv
@@ -0,0 +1,1622 @@
+%D \module
+%D [ file=core-ntb,
+%D version=2000.04.18,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Natural Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is an unfinished, preliminary module. At least two
+%D runs are needed to get the table fixed. Ugly code.
+
+% todo: special parsetb for argless variant
+% todo: protect \tbl...
+% todo: tblnx also count
+% todo: get rid of recurse
+% todo: fast if
+% todo: avoid halign (just do it manual) and thereby globals
+
+% optie=rek beschrijven
+
+\writestatus{loading}{ConTeXt Table Macros / Natural Tables}
+
+%D As always, this is the nth version. Much time went in
+%D trying to speed up the many cell calculations, some
+%D optimizations were rejected in order not to complicate this
+%D module too much (and in order to prevail extensibility).
+
+% shapebox fails here in mkii
+%
+% \setupcolors[state=start]
+% \bTABLE
+% \bTR [align=middle]\bTH Range\eTH{}\bTH Value\eTH{}\eTR
+% \bTR \bTD \type{<} 12\eTD{}\bTD 3\eTD{}\eTR
+% \bTR \bTD 12--16\eTD{}\bTD 2\eTD{}\eTR
+% \bTR \bTD \type{>}16\eTD{}\bTD 1\eTD{}\eTR
+% \eTABLE
+
+% \starttext
+% \placefigure[left]{}{}
+% \startlinecorrection \dontleavehmode \bTABLE
+% \bTR \bTD oeps \eTD \eTR
+% \eTABLE
+% \stoplinecorrection
+% \placefigure[right]{}{}
+% \startlinecorrection \dontleavehmode \bTABLE
+% \bTR \bTD oeps \eTD \eTR
+% \eTABLE
+% \stoplinecorrection
+% \stoptext
+
+%D To Do:
+%D
+%D \starttyping
+%D splitsen = ja | herhaal => als nofTH>1 then ja als herhaal
+%D \stoptyping
+
+%D To Do:
+%D
+%D \starttyping
+%D break over pagina
+%D kop herhalen
+%D reset settings
+%D
+%D \setupTABLE [c|column|x] [nx|odd|even|first|last][a=b]
+%D \setupTABLE [r|row |y] [nx|odd|even|first|last][a=b]
+%D \setupTABLE [nx|odd|even|first|last][ny|odd|even|first|last][a=b]
+%D \setupTABLE [nx|odd|even|first|last] [a=b]
+%D \setupTABLE [a=b]
+%D
+%D \bTH \eTH
+%D \stoptyping
+
+% the section setup does not work yet, data needs to be stored,
+% i.e.each row should know if it's a head/body/foot, and there
+% should be \setupTABLE[head]... and alike
+
+\unprotect
+
+%D A simple way to force equal line spacing is to say:
+%D
+%D \starttyping
+%D \def\bTBLCELL{\begstrut}
+%D \def\eTBLCELL{\endstrut}
+%D \stoptyping
+%D
+%D The next alternative also takes care of preceding and following
+%D white space.
+%D
+%D \startbuffer
+%D \bTABLE[left={(},right={)},top=\startnarrower,bottom=\stopnarrower]
+%D \bTR \bTD something \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\bTBLCELL % why not \doinhibitblank
+ {\inhibitblank
+ \doconvertfont\tbltblstyle\empty
+ \everypar{\tbltblleft\delayedbegstrut}}
+
+\def\eTBLCELL
+ {\ifhmode
+ \delayedendstrut
+ \tbltblright
+ \par % added 13/4/2006
+ \else
+ % not sure yet:\tbltblright
+ \par
+ \ifdim\prevdepth<\zeropoint % =-1000pt ?
+ \vskip-\strutdp
+ \else
+ \removebottomthings
+ \fi
+ \fi}
+
+\newcount\currenttbl
+
+\def\@@tbl{tbl} \def\tblcell{1} \def\tblnone{2}
+
+\def\@@tblprefix{tbl:} \let\@@rawtblprefix\@@tblprefix
+
+%D This should be done more efficient: soon
+
+% \let as well as \expandafter\edef's
+
+\newcounter\TBLlevel
+
+\def\@@tblprefix{\@@tbl:\ifnum\TBLlevel>1 :\TBLlevel:\fi}
+
+% \def\tblsetprefix % not yet used, figure out when .. may interfere with setup
+% {\edef\@@tblprefix{\@@tbl:\ifnum\TBLlevel>1 :\TBLlevel:\fi}}
+
+\def\settblnob#1{\expandafter\let\csname\@@tblprefix\number#1:b\endcsname\plusone}
+\def\gettblnob#1{\ifcsname\@@tblprefix\number#1:b\endcsname\plusone\else\zerocount\fi}
+
+\def\settbltag#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:s\endcsname}
+\def\settblcol#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:c\endcsname}
+\def\settblrow#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:r\endcsname}
+
+\def\lettbltag#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:s\endcsname}
+\def\lettblcol#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:c\endcsname}
+\def\lettblrow#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:r\endcsname}
+
+\def\settblwd#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:wd\endcsname} % global !
+\def\settblht#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:ht\endcsname} % global !
+\def\lettblwd#1#2{\global\expandafter\let\csname\@@tblprefix\number#1:\number#2:wd\endcsname} % global !
+\def\lettblht#1#2{\global\expandafter\let\csname\@@tblprefix\number#1:\number#2:ht\endcsname} % global !
+
+\def\gettbltag#1#2{\csname\@@tblprefix\number#1:\number#2:s\endcsname}
+\def\gettblcol#1#2{\csname\@@tblprefix\number#1:\number#2:c\endcsname}
+\def\gettblrow#1#2{\csname\@@tblprefix\number#1:\number#2:r\endcsname}
+
+\def\gettblwd #1#2{\csname\@@tblprefix\number#1:\number#2:wd\endcsname}
+\def\gettblht #1#2{\csname\@@tblprefix\number#1:\number#2:ht\endcsname}
+
+\def\settblwid#1{\expandafter\xdef\csname\@@tblprefix\number#1:w\endcsname} % {#2} global !
+\def\settblhei#1{\expandafter\xdef\csname\@@tblprefix\number#1:h\endcsname} % {#2} global !
+\def\settbldis#1{\expandafter\xdef\csname\@@tblprefix\number#1:d\endcsname} % {#2} global !
+\def\settblaut#1{\expandafter\xdef\csname\@@tblprefix\number#1:a\endcsname} % {#2} global !
+
+\def\lettblwid#1{\global\expandafter\let\csname\@@tblprefix\number#1:w\endcsname} % {#2} global !
+\def\lettblhei#1{\global\expandafter\let\csname\@@tblprefix\number#1:h\endcsname} % {#2} global !
+\def\lettbldis#1{\global\expandafter\let\csname\@@tblprefix\number#1:d\endcsname} % {#2} global !
+\def\lettblaut#1{\global\expandafter\let\csname\@@tblprefix\number#1:a\endcsname} % {#2} global !
+
+\def\gettblwid#1{\ifcsname\@@tblprefix\number#1:w\endcsname\csname\@@tblprefix\number#1:w\endcsname\else\zeropoint\fi}
+\def\gettblhei#1{\ifcsname\@@tblprefix\number#1:h\endcsname\csname\@@tblprefix\number#1:h\endcsname\else\zeropoint\fi}
+\def\gettbldis#1{\ifcsname\@@tblprefix\number#1:d\endcsname\csname\@@tblprefix\number#1:d\endcsname\else\zeropoint\fi}
+\def\gettblaut#1{\csname \@@tblprefix\number#1:a\endcsname}
+
+\def\doiftbltag #1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi}
+\def\doifnottbltag #1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\gobbleoneargument \else\@EA\firstofoneargument \fi}
+\def\doifelsetbltag#1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi}
+\def\doiftblrow #1#2{\ifcsname\@@tblprefix\number#1:\number#2:r\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi}
+\def\doiftblcol #1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi}
+\def\doifnottblcol #1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\@EA\gobbleoneargument \else\@EA\firstofoneargument \fi}
+
+\def\tbltagstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\zerocount\else\plusone\fi}
+\def\tblrowstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:r\endcsname\zerocount\else\plusone\fi}
+\def\tblcolstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\zerocount\else\plusone\fi}
+
+\def\settblspn #1{\expandafter\let\csname\@@tblprefix\number#1:s\endcsname \!!plusone}
+\def\doifelsetblspn#1{\doifelse {\csname\@@tblprefix\number#1:s\endcsname}\!!plusone}
+% \def\doifelsetblspn#1{\@EA\ifx\csname\@@tblprefix\number#1:s\endcsname\plusone\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi}
+
+\def\settblspn #1{\setvalue {\@@tblprefix\number#1:s}{1}}
+\def\doifelsetblspn#1{\doifelsevalue{\@@tblprefix\number#1:s}{1}}
+
+\long\def\settbltxt#1#2#3%
+ {\long\@EA\def\csname\@@tblprefix\number#1:\number#2:t\@EA\endcsname\@EA{\@EA\def\@EA\TBLlevel\@EA{\TBLlevel}#3}}
+
+\def\gettbltxt#1#2%
+ {\csname\@@tblprefix\number#1:\number#2:t\endcsname}
+
+\newtoks\tbltoks
+\newtoks\tblrowtoks
+
+\let\pushTBLparameters\relax
+\let\popTBLparameters \relax
+
+\newif\ifsqueezeTBLspan \squeezeTBLspantrue % spans one column cell over multi column par cells
+\newif\ifautosqueezeTBLspan \autosqueezeTBLspantrue % unless explicit widths are given
+\newif\ifautoTBLspread \autoTBLspreadfalse
+\newif\ifautoTBLhsize \autoTBLhsizetrue
+\newif\ifautoTBLrowspan \autoTBLrowspantrue
+\newif\ifautoTBLemptycell \autoTBLemptycelltrue
+\newif\ifautoTBLcheckwidth \autoTBLcheckwidthtrue
+\newif\ifappendTBLsetups \appendTBLsetupstrue
+\newif\ifenableTBLbreak \enableTBLbreakfalse
+\newif\ifmultipleTBLheads \multipleTBLheadsfalse
+\newif\iftightTBLrowspan \tightTBLrowspantrue
+
+\newif\iftraceTABLE \traceTABLEfalse
+
+\def\noftblheadlines{0}
+\def\noftblnextlines{0}
+\def\noftblhdnxlines{0}
+
+\long\def\handleTBLcell#1#2[#3]{}
+
+\long\def\bTC#1\eTC{\bTD#1\eTD}
+\long\def\bTX#1\eTX{\bTD#1\eTD}
+\long\def\bTY#1\eTY{\bTR#1\eTR}
+
+\let\getTABLEparameters\getparameters
+
+\unexpanded\def\setupTABLE
+ {\dotripleempty\dosetupTABLE}
+
+\def\dosetupTABLE[#1][#2][#3]%
+ {\ifthirdargument
+ \processaction
+ [#1]
+ [ \v!row=>{\dosetupTABLExy[\c!y][#2][#3]},%
+ \v!column=>{\dosetupTABLExy[\c!x][#2][#3]},%
+ r=>{\dosetupTABLExy[\c!y][#2][#3]},%
+ c=>{\dosetupTABLExy[\c!x][#2][#3]},%
+ y=>{\dosetupTABLExy[\c!y][#2][#3]},%
+ x=>{\dosetupTABLExy[\c!x][#2][#3]},%
+ \v!start=>{\dosetupTABLExy[#1][#2][#3]},%
+ \v!header=>{\dosetupTABLExy[#1][#2][#3]},%
+ \s!unknown=>{\dosetupTABLEzz[#1][#2][#3]}]%
+ \else\ifsecondargument
+ \processaction
+ [#1]
+ [ \v!row=>{\dosetupTABLExy[\c!y][\v!each][#2]},%
+ \v!column=>{\dosetupTABLExy[\c!x][\v!each][#2]},%
+ r=>{\dosetupTABLExy[\c!y][\v!each][#2]},%
+ c=>{\dosetupTABLExy[\c!x][\v!each][#2]},%
+ y=>{\dosetupTABLExy[\c!y][\v!each][#2]},%
+ x=>{\dosetupTABLExy[\c!x][\v!each][#2]},%
+ \v!start=>{\dosetupTABLExy[#1][\v!each][#2]},%
+ \v!header=>{\dosetupTABLExy[#1][\v!each][#2]},%
+ \s!unknown=>{\dosetupTABLEzz[\c!x][#1][#2]}]%
+ \else
+ \getparameters[\@@tbl\@@tbl][#1]%
+ \fi\fi}
+
+\def\dosetupTABLExy[#1][#2][#3]%
+ {\def\dodosetupTABLE##1{\setTABLEparameters[#1##1][#3]}%
+ \processcommalist[#2]\dodosetupTABLE}
+
+\def\dosetupTABLEzz[#1][#2][#3]%
+ {\def\dodosetupTABLE##1%
+ {\def\dododosetupTABLE####1{\setTABLEparameters[\c!x##1\c!y####1][#3]}%
+ \processcommalist[#2]\dododosetupTABLE}%
+ \processcommalist[#1]\dodosetupTABLE}
+
+\def\nopTABLEparameters[#1][#2]%
+ {\letvalue{\@@tblprefix#1}\empty}
+
+\def\setTABLEparameters[#1][#2]%
+ {\pushTBLparameters
+ \ifappendTBLsetups
+ \doifdefinedelse{\@@tblprefix#1}
+ {\def\getTABLEparameters[##1][##2]%
+ {\setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][##2,#2]}}%
+ \getvalue{\@@tblprefix#1}%
+ \let\getTABLEparameters\getparameters}
+ {\setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][#2]}}%
+ \else
+ \setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][#2]}%
+ \fi
+ \popTBLparameters}
+
+\let\setupTBLsection\relax
+
+% % \setupTABLE [y] [first][background=color,backgroundcolor=blue,frame=off,bottomframe=on,topframe=on,framecolor=white]
+% \setupTABLE [first][first][backgroundcorner=2,corner=10,frame=on]
+% \setupTABLE [last] [first][backgroundcorner=4,corner=12,frame=on]
+%
+% \setupTABLE [row] [each] [background=color,backgroundcolor=blue,frame=on,framecolor=white]
+% \setupTABLE [first][2] [corner=8]
+% \setupTABLE [last] [2] [corner=5]
+% \setupTABLE [first][last] [corner=7]
+% \setupTABLE [last] [last] [corner=6]
+%
+% \startTEXpage
+% \bTABLE[frame=off,align=middle]
+% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
+% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
+% \bTR \bTD alpha \eTD \bTD beta \eTD \bTD gamma \eTD \eTR
+% \eTABLE
+% \stopTEXpage
+%
+% \setupTABLE [first] [two][corner=2] % special case
+% \setupTABLE [last] [two][corner=4] % special case
+%
+% % % \setupTABLE [one] [first] ... special case of span
+%
+% \startTEXpage
+% \bTABLE[frame=off,align=middle]
+% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
+% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
+% \eTABLE
+% \stopTEXpage
+
+%D By default rowspans are tight but you can change that:
+%D
+%D \startbuffer
+%D \bTABLE
+%D \bTR[height=20pt] \bTH 1. col \eTH \bTH 2. col \eTH \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \bTD[nr=2] 2 rows in 2. col \eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 1. col\eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=3] 3 rows in 2. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \eTABLE
+%D
+%D \bTABLE
+%D \bTR[height=20pt] \bTH 2. col \eTH \bTH 1. col \eTH \eTR
+%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 2. col \eTD \bTD 1 row in 1. col \eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 1. col\eTD \eTR
+%D \bTR[height=20pt] \bTD[nr=3] 3 rows in 2. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D With \type {\tightTBLrowspanfalse} we get:
+%D
+%D \start \tightTBLrowspanfalse \getbuffer \stop
+
+\unexpanded\def\setupTBLcell#1#2% cell over col over row
+ {\setupTBLsection % already forgotten
+ \edef\positiverow{\number#1}%
+ \edef\positivecol{\number#2}%
+ \edef\negativerow{\the\numexpr-\maximumrow+#1+\minusone\relax}%
+ \edef\negativecol{\the\numexpr-\maximumcol+#2+\minusone\relax}%
+ % each each
+ \csname\@@tblprefix\c!x\v!each\c!y\v!each\endcsname
+ \csname\@@tblprefix\c!y\v!each\endcsname
+ \csname\@@tblprefix\c!x\v!each\endcsname
+ % odd even
+ \csname\@@tblprefix\c!y\v!oddeven\positiverow\endcsname
+ \csname\@@tblprefix\c!x\v!oddeven\positivecol\endcsname
+ \csname\@@tblprefix\c!x\v!oddeven\positivecol\c!y\v!oddeven\positiverow\endcsname
+ % row/col number combinations
+ \ifcsname\@@tblprefix\c!y\positiverow\endcsname\csname\@@tblprefix\c!y\positiverow\endcsname\fi
+ \ifcsname\@@tblprefix\c!y\negativerow\endcsname\csname\@@tblprefix\c!y\negativerow\endcsname\fi
+ \csname\@@tbl\@@tbl\c!extras\endcsname
+ \@EA\let\csname\@@tbl\@@tbl\c!extras\endcsname\relax % new, see x-fo
+ \ifcsname\@@tblprefix\c!x\positivecol\endcsname\csname\@@tblprefix\c!x\positivecol\endcsname\fi
+ \ifcsname\@@tblprefix\c!x\negativecol\endcsname\csname\@@tblprefix\c!x\negativecol\endcsname\fi
+ \csname\@@tbl\@@tbl\c!extras\endcsname
+ \@EA\let\csname\@@tbl\@@tbl\c!extras\endcsname\relax % new, see x-fo
+ % first/last combinations
+ \ifnum\positiverow=\plusone
+ \csname\@@tblprefix\c!y\v!first\endcsname
+ \ifcsname\@@tblprefix\c!x\positivecol\c!y\v!first\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\v!first\endcsname\fi
+ \fi
+ \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\endcsname
+ \ifcsname\@@tblprefix\c!x\v!first\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\v!first\c!y\positiverow\endcsname\fi
+ \fi
+ \ifnum\positiverow=\maximumrow\relax
+ \csname\@@tblprefix\c!y\v!last\endcsname
+ \ifcsname\@@tblprefix\c!x\positivecol\c!y\v!last\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\v!last\endcsname\fi
+ \fi
+ \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\endcsname
+ \ifcsname\@@tblprefix\c!x\v!last\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\v!last\c!y\positiverow\endcsname\fi
+ \fi
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\c!y\v!last\endcsname
+ \fi\fi
+ \ifnum\positiverow=\plusone \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\c!y\v!first\endcsname
+ \fi\fi
+ \ifnum\positiverow=\plusone \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\c!y\v!first\endcsname
+ \fi\fi
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\c!y\v!last\endcsname
+ \fi\fi
+ % special case: two rows and last row : two&first and two&last (round corners)
+ \ifnum\maximumrow=\plustwo\relax
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\plusone
+ \csname\@@tblprefix\c!x\v!first\c!y\v!two\endcsname
+ \fi\fi
+ \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\maximumcol\relax
+ \csname\@@tblprefix\c!x\v!last\c!y\v!two\endcsname
+ \fi\fi
+ \fi
+ \ifnum\gettblcol\positiverow\positivecol=\maximumcol\relax % top span over whole width
+ \ifnum\positiverow=\plusone
+ \csname\@@tblprefix\c!x\v!one\c!y\v!first\endcsname
+ \fi
+ \ifnum\positiverow=\maximumrow\relax
+ \csname\@@tblprefix\c!x\v!one\c!y\v!last\endcsname
+ \fi
+ \fi
+ % header things
+ \ifnum#1>\noftblhdnxlines\else
+ \ifcsname\@@tblprefix\v!header\v!each \endcsname\csname\@@tblprefix\v!header\v!each \endcsname\fi
+ \ifcsname\@@tblprefix\v!header\positivecol\endcsname\csname\@@tblprefix\v!header\positivecol\endcsname\fi
+ \fi
+ % explicit cells
+ \ifcsname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\fi
+ \ifcsname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\csname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\fi
+ % local
+ \ifcsname\@@tblprefix\c!y++\positiverow\endcsname\csname\@@tblprefix\c!y++\positiverow\endcsname\fi
+ % done
+ \global\letcscsname\@@tblsplitafter\csname\@@tbl\@@tbl\c!after\endcsname
+ \relax}
+
+% we cannot use +n (checking on number/last/first would slow down too much)
+%
+% \setupTABLE[r] [2][color=red]
+% \setupTABLE[r] [-2][color=red]
+% \setupTABLE[c] [2][color=green]
+% \setupTABLE[c] [-2][color=green]
+% \setupTABLE[4] [4][color=blue]
+% \setupTABLE[-4][-4][color=blue]
+%
+% \bTABLE
+% \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR}
+% \eTABLE
+
+\globallet\@@tblsplitafter\relax
+
+% split + page:
+%
+% \bTABLE[split=yes]
+% \bTR \bTD left \eTD\bTD right \eTD\eTR
+% \bTR[after=\page] \bTD left \eTD\bTD right \eTD\eTR
+% \bTR \bTD left \eTD\bTD right \eTD\eTR
+% \eTABLE
+
+% todo: protect counters
+
+\newcount\row \newcount\col
+\newcount\xrow \newcount\xcol
+\newcount\xxrow \newcount\xxcol
+\newcount\maximumrow \newcount\maximumcol \newcount\maximumrowspan
+ \newcount\currentcol
+\newcount\tblspn
+
+\def\parseTR[#1][#2]% [#2] is dummy that kills spaces / no #3 argument
+ {\currentcol\zerocount
+ \advance\maximumrow\plusone
+ \iffirstargument
+ \setvalue{\@@tblprefix\c!y++\number\maximumrow}{\getparameters[\@@tbl\@@tbl][#1]}% maybe also in mkii
+ \fi}
+
+\def\settblref#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:x\endcsname}
+\def\gettblref#1#2{\ifcsname\@@tblprefix\number#1:\number#2:x\endcsname\csname\@@tblprefix\number#1:\number#2:x\endcsname\fi}
+
+\long\def\parseTD[#1][#2]#3\eTD % [#2] is dummy that kills spaces
+ {\def\tblny{\tblnr}%
+ \def\tblnx{\tblnc}%
+ \let\tblnc\plusone
+ \let\tblnr\plusone
+ \let\tbln\currentcol
+ \let\tblm\empty
+ \iffirstargument
+ \getparameters[\@@tbl][#1]%
+ \fi
+ % goto first cell % NEW, n/m=cellnumber
+ \edef\@@tblnindeed{\csname\@@tbl\c!n\endcsname}%
+ \ifx\@@tblnindeed\empty
+ \global\advance\tblspn\tblnx\relax
+ \else\ifnum\@@tblnindeed=\currentcol\else
+ \scratchcounter\numexpr\@@tblnindeed-\currentcol+\minusone-\tblspn\relax
+ \ifnum\scratchcounter>\zerocount
+ \normalexpanded{\noexpand\parseTD[\c!nx=\the\scratchcounter,\c!n=,\c!m=,*sq=\v!no][]}\eTD
+ \fi
+ % can also be made faster
+ \getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]%
+ \fi\fi
+ \edef\@@tblmindeed{\csname\@@tbl\c!m\endcsname}%
+ \ifx\@@tblmindeed\empty \else
+ \ifnum\@@tblmindeed=\currentcol \else
+ \scratchcounter\numexpr\@@tblmindeed-\currentcol+\minusone-\tblspn\relax
+ \dorecurse\scratchcounter{\normalexpanded{\noexpand\parseTD[\c!n=,\c!m=][]}\eTD}%
+ % can be sped up
+ \getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]% kind of double, see prev
+ \fi
+ \fi
+ \doloop % skip over columns that result from earlier span
+ {\advance\currentcol\plusone
+ \doifnottbltag\maximumrow\currentcol\exitloop}%
+ % == \def\next{\advance\currentcol\plusone\doiftbltag\maximumrow\currentcol\next}\next
+ % fill r*c cells and set span
+ \ifnum\tblnx=\plusone
+ \ifnum\tblny=\plusone
+ \ifnum\currentcol>\maximumcol\relax
+ \maximumcol\currentcol
+ \fi
+ \else
+ \presetTBLcell
+ \fi
+ \else
+ \presetTBLcell
+ \fi
+ % set values
+ \lettbltag\maximumrow\currentcol\tblcell
+ \settblcol\maximumrow\currentcol{\number\tblnx}%
+ \settblrow\maximumrow\currentcol{\number\tblny}%
+ \settblref\maximumrow\currentcol{\ifcsname\@@tbl\c!action\endcsname\csname\@@tbl\c!action\endcsname\fi}%
+ % save text
+ \edef\celltag{{\number\maximumrow}{\number\currentcol}}%
+ \@EA\settbltxt\@EA\maximumrow\@EA\currentcol\@EA{\@EA\handleTBLcell\celltag[#1]{#3}}}
+
+\def\presetTBLcell
+ {\row\maximumrow
+ \col\currentcol
+ \dorecurse\tblny
+ {\col\currentcol
+ \settblcol\row\col{\number\tblnx}%
+ \ifnum\tblnx>\maximumrowspan\relax
+ \maximumrowspan\tblnx
+ \fi
+ \dorecurse\tblnx
+ {\lettbltag\row\col\tblnone
+ \advance\col\plusone}%
+ \advance\row\plusone}%
+ % check max column
+ \advance\col\minusone
+ \ifnum\col>\maximumcol\relax
+ \maximumcol\col
+ \fi}
+
+%D The usage of n and m:
+%D
+%D \startbuffer
+%D \bTABLE[width=3em]
+%D \bTR\bTD d1 \eTD\bTD[n=2] d2 \eTD\bTD[n=5] d5 \eTD\bTD[n=7] d7 \eTD\eTR
+%D \bTR\bTD f1 \eTD\bTD[n=4] f4 \eTD\bTD[n=5] f5 \eTD\bTD[n=7] f7 \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \bTABLE[width=3em]
+%D \bTR\bTD d1 \eTD\bTD[m=2] d2 \eTD\bTD[m=5] d5 \eTD\bTD[m=7] d7 \eTD\eTR
+%D \bTR\bTD f1 \eTD\bTD[m=4] f4 \eTD\bTD[m=5] f5 \eTD\bTD[m=7] f7 \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D \startbuffer
+%D \bTABLE[frame=on]
+%D \bTR \bTH[nc=3] One \eTH \bTH[m=4] Four \eTH\eTR
+%D \bTR \bTD a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \eTABLE
+%D
+%D \bTABLE[frame=on]
+%D \bTR \bTH[nr=2] One \eTH \bTH[m=3] Three \eTH\eTR
+%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\long\def\parseTH[#1]#2\eTH
+ {\parseTD[#1,\c!color=\tbltblheadcolor,\c!style=\tbltblheadstyle,\c!aligncharacter=\v!no]#2\eTD}
+
+%D new
+
+\long\def\parseTN[#1]#2\eTN
+ {\parseTD[#1]\digits#2\relax\eTD}
+
+%D Vit Zyka needed the option to create a distance between columns, so I
+%D added support for individual column distances.
+%D
+%D \startbuffer
+%D % \setupTABLE[c][each][distance=2em]
+%D \setupTABLE[c][1][distance=2em]
+%D \setupTABLE[c][2][distance=3em]
+%D
+%D \bTABLE
+%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
+%D \eTABLE
+%D
+%D \bTABLE[option=stretch]
+%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
+%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
+%D \eTABLE
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+%D
+%D and he provided patches for the global left and right margin distances
+%D as well as the columndistance (although i changed the names -). Here
+%D is his testcase:
+%D
+%D \startbuffer
+%D \framed[offset=overlay]\bgroup
+%D \setupTABLE[column][2][align=left]%
+%D \setupTABLE[column][3][align=right]%
+%D \bTABLE[columndistance=2cm,leftmargindistance=.3cm,rightmargindistance=.5cm]
+%D \bTR \bTH[nc=3] Table head\eTH \eTR
+%D \bTR \bTD[nc=2] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD[nc=2,align=left] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD[nc=2,align=middle] AB\eTD \bTD C\eTD \eTR
+%D \bTR \bTD A\eTD \bTD B\eTD \bTD C\eTD \eTR
+%D \bTR \bTD Aa\eTD \bTD Bb\eTD \bTD Cccc\eTD \eTR
+%D \bTR \bTD[nc=3,align=middle] ABC\eTD \eTR
+%D \eTABLE
+%D \egroup
+%D \stopbuffer
+%D
+%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+\newtoks\TBLhead
+\newtoks\TBLnext
+\newtoks\TBLbody
+\newtoks\TBLfoot
+
+% to be done: head <raw> foot, dus state var
+
+\unexpanded\def\bTABLEhead{\dosingleempty\doTABLEhead} \let\eTABLEhead\relax
+\unexpanded\def\bTABLEnext{\dosingleempty\doTABLEnext} \let\eTABLEnext\relax
+\unexpanded\def\bTABLEbody{\dosingleempty\doTABLEbody} \let\eTABLEbody\relax
+\unexpanded\def\bTABLEfoot{\dosingleempty\doTABLEfoot} \let\eTABLEfoot\relax
+
+\long\def\doTABLEhead[#1]#2\eTABLEhead{\appendtoks\doTABLEsection[#1]{#2}\to\TBLhead}
+\long\def\doTABLEnext[#1]#2\eTABLEnext{\appendtoks\doTABLEsection[#1]{#2}\to\TBLnext}
+\long\def\doTABLEbody[#1]#2\eTABLEbody{\appendtoks\doTABLEsection[#1]{#2}\to\TBLbody}
+\long\def\doTABLEfoot[#1]#2\eTABLEfoot{\appendtoks\doTABLEsection[#1]{#2}\to\TBLfoot}
+
+\long\def\doTABLEsection[#1]#2%
+ {\unexpanded\def\setupTBLsection{\getparameters[\@@tbl\@@tbl][#1]}%
+ #2%
+ \let\setupTBLsection\relax}
+
+\let\pushTBL\relax
+\let\popTBL \relax
+
+\chardef\tblpass=0
+
+\def\presetallTABLEparameters% each odd|even level / can be sped up but only once per table
+ {\executeifdefined{\@@rawtblprefix\v!start\v!each}\relax
+ \executeifdefined{\@@rawtblprefix\v!start\v!oddeven\TBLlevel}\relax
+ \executeifdefined{\@@rawtblprefix\v!start\number\TBLlevel}\relax}
+
+\def\bTABLE
+ {\dosingleempty\dobTABLE}
+
+\def\dobTABLE[#1]%
+ {\pushTBL
+ % box not here
+ \bgroup
+ \TBLhead\emptytoks
+ \TBLnext\emptytoks
+ \TBLbody\emptytoks
+ \TBLfoot\emptytoks
+ \ifhmode\kern\zeropoint\fi % blocks \removeunwantedspaces: check this on icare handelingsschema
+ \resetcharacteralign % new
+ \getparameters
+ [\@@tbl\@@tbl]
+ [\c!align={\v!right,\v!broad,\v!high},#1]%
+ \ifx\tbltblsetups\empty\else
+ \doprocesslocalsetups\tbltblsetups
+ \fi
+ \hsize\tbltbltextwidth
+ \processaction
+ [\tbltblsplit]
+ [ \v!yes=>\enableTBLbreaktrue,
+ \v!repeat=>\enableTBLbreaktrue\multipleTBLheadstrue,
+ \v!auto=>\ifinsidesplitfloat\enableTBLbreaktrue\fi]
+ \processaction
+ [\tbltblheader]
+ [\v!repeat=>\multipleTBLheadstrue]%
+ \presetallTABLEparameters
+ \ExpandFirstAfter\processallactionsinset
+ [\tbltbloption]
+ [\v!stretch=>\autoTBLspreadtrue]%
+ \linewidth\tbltblrulethickness % needs to be frozen
+ \dontcomplain
+ \currentcol\zerocount
+ \maximumrowspan\plusone
+ \maximumcol\zerocount
+ \maximumrow\zerocount
+ \let\bTR\dobTR
+ \let\bTD\dobTD
+ \let\bTH\dobTH
+ \let\bTN\dobTN}
+
+\unexpanded\def\dobTR{\dodoubleempty\parseTR}
+\unexpanded\def\dobTD{\dodoubleempty\parseTD}
+\unexpanded\def\dobTH{\dodoubleempty\parseTH}
+\unexpanded\def\dobTN{\dodoubleempty\parseTN}
+
+% permits \expanded{\bTD ... \eTD}
+
+\unexpanded\def\eTR{\ignorespaces} % handy in case we use a macro to generate rows
+\unexpanded\def\eTD{\ignorespaces}
+\unexpanded\def\eTH{\ignorespaces}
+\unexpanded\def\eTN{\ignorespaces}
+
+\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
+ {% tricky and dirty order -)
+ \doifsometokselse\TBLhead % slow, better a flag
+ {\the\TBLhead
+ \edef\noftblheadlines{\number\maximumrow}%
+ \doifsometokselse\TBLnext
+ {\the\TBLnext
+ \edef\noftblnextlines{\number\numexpr\maximumrow-\noftblheadlines\relax}}%
+ {\let\noftblnextlines\zerocount}% was 1
+ \edef\noftblhdnxlines{\number\maximumrow}}
+ {\let\noftblheadlines\zerocount % was 1
+ \let\noftblnextlines\zerocount
+ \let\noftblhdnxlines\zerocount}%
+ \the\TBLbody
+ \the\TBLfoot
+ \removeunwantedspaces % only if hmode
+ % finish cells
+ \dorecurse\maximumrow
+ {\row\recurselevel\relax
+ \dorecurse\maximumcol
+ {\col\recurselevel\relax
+ \doifnottbltag\row\col
+ {\xxcol\col
+ \xxrow\row
+ \xrow\row
+ \doloop
+ {\xcol\col
+ \doloop
+ {\doifelsetbltag\xrow\xcol \exitloop
+ {\advance\xcol\plusone
+ \ifnum\xcol>\maximumcol\relax \exitloop \fi}}%
+ \doifelsetbltag\xrow\xcol \exitloop
+ {\xxrow\xrow \xxcol\xcol \advance\xrow\plusone
+ \ifnum\xrow>\maximumrow \exitloop \fi}}%
+ \ifnum\xxrow>\maximumrow\xxrow\maximumrow\fi
+ \ifnum\xxcol>\maximumcol\xxcol\maximumcol\fi
+ \xxrow\numexpr\xxrow-\row+\plusone\relax
+ \xxcol\numexpr\xxcol-\col+\plusone\relax
+ \xrow\row
+ \dorecurse\xxrow
+ {\xcol\col \settblcol\xrow\xcol{\number\xxcol}%
+ \dorecurse\xxcol
+ {\lettbltag\xrow\xcol\tblnone \advance\xcol\plusone}%
+ \advance\xrow\plusone}%
+ \lettbltag\row\col\tblcell
+ \settblcol\row\col{\the\xxcol}%
+ \settblrow\row\col{\the\xxrow}%
+ \ifautoTBLemptycell
+ \edef\celltag{{\number\row}{\number\col}}%
+ \@EA\settbltxt\@EA\row\@EA\col\@EA{\@EA\handleTBLcell\celltag[]{\strut}}%
+ \fi}}}%
+ % to be sure
+ \dorecurse\maximumrow
+ {\row\recurselevel\relax
+ \dorecurse\maximumcol
+ {\col\recurselevel\relax
+ \doiftblrow\row\col
+ {\scratchcounter\numexpr\maximumrow-\row+\plusone\relax
+ \ifnum\gettblrow\row\col>\scratchcounter
+ \settblrow\row\col{\the\scratchcounter}%
+ \fi}%
+ \lettblht\row\col\zeropoint
+ \lettblwd\row\col\zeropoint
+ \doifnottblcol\row\col{\lettblcol\row\col\zerocount}%
+ \doifnottbltag\row\col{\lettbltag\row\col\tblnone}}}%
+ % check and do
+ \ifcase\maximumcol\else
+ \startTBLprocessing
+ \begTBL
+ \dorecurse\maximumrow
+ {\bTBL
+ \row\recurselevel\relax
+ \dorecurse\maximumcol
+ {\col\recurselevel\relax
+ \normalexpanded{\noexpand\doTBL{\number\row}{\number\col}}}%
+ \eTBL}%
+ \removeunwantedspaces % only if hmode
+ \endTBL
+ \stopTBLprocessing
+ % wrong ! ! ! better to have an auto-offset-overlay
+ % \ifnum\TBLlevel>1
+ % \vskip-\strutdp
+ % \fi
+ \fi
+ % tracing
+ % \iftrue
+ % \blank \tttf
+ % \dorecurse\maximumrow
+ % {\row\recurselevel\relax
+ % \dorecurse\maximumcol
+ % {\col\recurselevel\relax
+ % [r=\the\row,c=\the\col,h=\the\dimexpr\gettblht\row\col,w=\the\dimexpr\gettblwd\row\col]}%
+ % \par}%
+ % \blank
+ % \fi
+ \egroup
+ \popTBL}
+
+\let\startTBLprocessing\relax
+\let\stopTBLprocessing \relax
+
+\newcount\prelocatedTBLrows % \prelocateTBLrows{1000} may speed up large tables
+
+\def\bTBL{\tblrowtoks\emptytoks}
+\def\eTBL{\tbltoks\@EA\@EA\@EA{\@EA\the\@EA\tbltoks\@EA\begintblrow\the\tblrowtoks\endtblrow}}%
+
+\def\prelocateTBLerror
+ {\writestatus\m!systems{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \number\prelocatedTBLrows)}}
+
+\def\prelocateTBLrows#1% we start at zero so we have one to much, better play safe anyway
+ {\dostepwiserecurse\prelocatedTBLrows{#1}\plusone{\expandafter\newtoks\csname tbl:\recurselevel\endcsname}%
+ \def\bTBL
+ {\ifnum\tblrow<\prelocatedTBLrows\relax
+ \@EA\let\@EA\tblrowtoks\csname tbl:\the\tblrow\endcsname\tblrowtoks\emptytoks
+ \else
+ \prelocateTBLerror
+ \fi}%
+ \def\eTBL
+ {\tbltoks\@EA\@EA\@EA{\@EA\the\@EA\tbltoks\@EA\begintblrow\@EA\the\csname tbl:\the\tblrow\endcsname\endtblrow}}%
+ \global\prelocatedTBLrows#1\relax}
+
+% \prelocateTBLrows{1000} % may speed up large tables
+
+% We use aligments to handle the empty (skipped) columns, so
+% that we don't have to (re|)|calculate these.
+
+\def\skiptblcol
+ {\global\advance\tblcol\plusone}
+
+\def\nexttblcol
+ {\global\advance\tblcol\plusone
+ \kern\tbltblcolumndistance
+ &}
+
+\def\spantblcol
+ {\span}
+
+\newcount\tblrow
+\newcount\tblcol
+
+\let\savedtblrow\!!zerocount
+\let\savedtblcol\!!zerocount
+
+\def\begintblrow
+ {\noalign
+ {\global\advance\tblrow\plusone
+ \global\tblcol\zerocount
+ \global\tblspn\zerocount}%
+ % \iftrue
+ % \bgroup\tbox{\tttf[\number\tblrow]}\egroup
+ % \fi
+ \nexttblcol
+ \kern\dimexpr\tbltblleftmargindistance-\tbltblcolumndistance\relax}
+
+\def\endtblrow
+ {\kern\dimexpr\tbltblrightmargindistance-\tbltblcolumndistance\relax
+ \crcr
+ \noalign
+ {\nointerlineskip
+ \ifnum\gettblnob\tblrow=\zerocount
+ \allowbreak
+ \fi
+ \bgroup % protect local vars
+ \@@tblsplitafter
+ \egroup
+ \bgroup % protect local vars
+ \scratchcounter\numexpr\tblrow+\plusone\relax
+ \ifnum\scratchcounter>\noftblhdnxlines\relax
+ \ifnum\scratchcounter<\maximumrow\relax
+ \doifsomething\tbltblspaceinbetween{\blank[\tbltblspaceinbetween]}%
+ \fi
+ \fi
+ \egroup}}
+
+\def\begintbl
+ {\global\tblspn\zerocount
+ \global\tblcol\zerocount
+ \global\tblrow\zerocount
+ \global\advance\tblrow\minusone
+ \tabskip\zeropoint
+ \halign\bgroup
+ \registerparoptions % new
+ \ignorespaces##\unskip&&\ignorespaces##\unskip\cr}
+
+\def\endtbl
+ {\egroup}
+
+\setvalue{\tblnone TBL}#1#2%
+ {\spanTBL{#1}{#2}}
+
+\setvalue{\tblcell TBL}#1#2%
+ {\tblrowtoks\expandafter{\the\tblrowtoks\makeTBL #1 #2 }% space delimited -> less tokens
+ \spanTBL{#1}{#2}}
+
+\def\spanTBL#1#2%
+ {\scratchcounter\gettblcol{#1}{#2}\relax
+ \ifnum\scratchcounter>\zerocount
+ \advance\scratchcounter \minusone
+ \dorecurse\scratchcounter{\tblrowtoks\expandafter{\the\tblrowtoks\spantblcol}}%
+ \dorecurse\scratchcounter{\tblrowtoks\expandafter{\the\tblrowtoks\skiptblcol}}%
+ \tblrowtoks\expandafter{\the\tblrowtoks\nexttblcol}%
+ \fi}
+
+\def\doTBL#1#2%
+ {\csname\gettbltag{#1}{#2}TBL\endcsname{#1}{#2}}
+
+\def\begTBL
+ {\global\tblspn\zerocount
+ \global\tblrow\zerocount
+ \global\tblcol\zerocount
+ \chardef\tblpass\zerocount
+ \tbltoks\emptytoks}
+
+\def\flushtbltoks{\begintbl\the\tbltoks\endtbl}
+
+\def\domakeTBLone#1 #2 %
+ {\gettbltxt{#1}{#2}}%
+
+\def\domakeTBLtwo#1 #2 % meer in cellD
+ {\scratchdimen\zeropoint
+ \scratchcounter\tblcol
+ \!!counta\gettblcol{#1}{#2}\relax
+ \dorecurse\!!counta
+ {\advance\scratchdimen\dimexpr\gettblwid\scratchcounter+\tbltblcolumndistance\relax
+ \ifnum\recurselevel<\!!counta \advance\scratchdimen \gettbldis\scratchcounter\fi
+ \advance\scratchcounter\plusone}%
+ \edef\widthTBL{\the\dimexpr\scratchdimen-\tbltblcolumndistance\relax}%
+ \setbox\scratchbox\hbox{\gettbltxt{#1}{#2}}%
+ \settblht{#1}{#2}{\the\ht\scratchbox}%
+ \settblwd{#1}{#2}{\the\wd\scratchbox}%
+ \ifdim\ht\scratchbox>\gettblhei{#1}\relax
+ \settblhei{#1}{\the\ht\scratchbox}%
+ \fi}%
+
+\def\domakeTBLthree#1 #2 %
+ {% height
+ \!!counta \gettblcol{#1}{#2}\relax
+ \!!countb \gettblrow{#1}{#2}\relax
+ \!!heighta\gettblht {#1}{#2}\relax
+ \scratchdimen\zeropoint
+ \ifnum\!!counta=\maximumcol\relax
+ % case: nc=maxcolumns
+ \else
+ \scratchcounter#1\relax
+ \dorecurse\!!countb
+ {\advance\scratchdimen\gettblhei\scratchcounter
+ \advance\scratchcounter\plusone}%
+ \ifdim\scratchdimen<\!!heighta\relax
+ \scratchdimen\!!heighta
+ \fi
+ \fi
+ \edef\heightTBL{\the\scratchdimen}%
+ % width
+ \scratchdimen\zeropoint
+ \scratchcounter\tblcol
+ \dorecurse\!!counta
+ {\advance\scratchdimen\dimexpr\gettblwid\scratchcounter+\tbltblcolumndistance\relax
+ \ifnum\recurselevel<\!!counta \advance\scratchdimen \gettbldis\scratchcounter\fi
+ \advance\scratchcounter\plusone}%
+ \edef\widthTBL{\the\dimexpr\scratchdimen-\tbltblcolumndistance\relax}%
+ % cell
+ \setbox\scratchbox\hbox{\gettbltxt{#1}{#2}}%
+ \ifnum\!!counta=\maximumcol\relax
+ % case: nc=maxcolumns
+ \else
+ \scratchdimen\gettblhei{#1}%
+ \setbox\scratchbox\hbox
+ {\lower\ht\scratchbox\hbox{\raise\scratchdimen\box\scratchbox}}%
+ \ht\scratchbox\scratchdimen
+ \fi
+ \dp\scratchbox\zeropoint
+ \edef\!!stringa{\gettblref{#1}{#2}}%
+ \ifx\!!stringa\empty
+ \box\scratchbox
+ \else
+ \normalexpanded{\noexpand\directgotobox{\box\scratchbox}[\!!stringa]}% to be checked
+ \fi
+ \box\scratchbox}
+
+\def\inTBLcell#1#2% hm, do we need #1 #2 ? we use tblcol anyway
+ {\ExpandBothAfter\doifinsetelse\localwidth{\v!fit,\v!broad} % user set
+ {}
+ {\scratchdimen\gettblaut\tblcol\relax
+ \ifdim\localwidth>\scratchdimen
+ \settblaut\tblcol{\the\dimexpr\localwidth\relax}%
+ \fi}}%
+
+\def\endTBL
+ {\setbox\scratchbox\hbox
+ {\localframed
+ [\@@tbl\@@tbl]
+ [\c!frame=\v!off,\c!background=,\c!align=\v!no]
+ {\strut}}%
+ \edef\minimalcellheight{\the\ht\scratchbox}%
+ \dorecurse\maximumcol
+ {\lettblaut\recurselevel\zeropoint
+ % new
+ \xcol\recurselevel\relax
+ \dorecurse\maximumrow
+ {\lettblwd\recurselevel\xcol\zeropoint
+ \lettblht\recurselevel\xcol\zeropoint}%
+ % till here
+ \lettblwid\recurselevel\zeropoint
+ \lettbldis\recurselevel\zeropoint}%
+ \dorecurse\maximumrow
+ {\lettblhei\recurselevel\maxdimen}%
+ \chardef\tblpass\plusone
+ \let\makeTBL\domakeTBLone
+ \let\handleTBLcell\dohandleTBLcellA
+ \setbox0\vbox{\trialtypesettingtrue \flushtbltoks}%
+% \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \lettbldis\maximumcol\zeropoint
+ \ifautoTBLspread
+ % experimental, stretch non fixed cells to \hsize
+ \checktblwidthsone % trial run
+ \checktblwidthstwo % real run
+ \stretchtblwidths
+ \let\handleTBLcell\dohandleTBLcellB
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \else\ifdim\wd0>\hsize
+ \ifautoTBLhsize
+ \checktblwidthsone % trial run
+ \checktblwidthstwo % real run
+ \let\handleTBLcell\dohandleTBLcellB
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \fi
+ \else\ifautoTBLrowspan\ifnum\maximumrowspan>1 % max ?
+ % added jan 2002 because nx=* did no longer work
+ \edef\savedhsize{\the\hsize}%
+ \hsize\wd0\relax % new per 17/04/2006
+ \checktblwidthsone % trial run
+ \checktblwidthstwo % real run
+ \hsize\savedhsize
+ %
+ \let\handleTBLcell\dohandleTBLcellC
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \fi\fi\fi\fi
+ \let\handleTBLcell\dohandleTBLcellD
+ \chardef\tblpass\plustwo
+ \let\makeTBL\domakeTBLtwo
+ \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \checktblheightsone
+ \checktblheightstwo
+ \let\handleTBLcell\dohandleTBLcellE
+ \chardef\tblpass\plusthree
+ \let\makeTBL\domakeTBLthree
+ \ifnum\TBLlevel>\plusone
+ \@EA\notsplittblbox
+ \else\ifenableTBLbreak
+ \@EAEAEA\splittblbox
+ \else
+ \@EAEAEA\notsplittblbox
+ \fi\fi{\flushtbltoks}}
+
+\def\stretchtblwidths % more variants, e.g. a max to \dimend
+ {\ifcase\maximumcol\else % else division by zero
+ \!!dimend\zeropoint
+ \!!dimene\hsize
+ \dorecurse\maximumcol
+ {\advance\!!dimend\dimexpr\gettblwid\recurselevel+\tbltblcolumndistance\relax
+ \advance\!!dimene-\gettbldis\recurselevel}%
+ \advance\!!dimend\dimexpr-\tbltblcolumndistance+\tbltblleftmargindistance+\tbltblrightmargindistance\relax
+ % distribute width (stretch)
+ \ifdim\!!dimend<\!!dimene
+ \advance\!!dimend-\!!dimene
+ \!!dimend-\!!dimend
+ \divide\!!dimend\maximumcol
+ \dorecurse\maximumcol
+ {\settblwid\recurselevel{\the\dimexpr\gettblwid\recurselevel+\!!dimend\relax}}%
+ \fi
+ \fi}
+
+\newbox\finaltblbox
+
+\def\notsplittblbox#1%
+ {\setbox\finaltblbox\vbox{#1}%
+ \postprocessTABLEbox\finaltblbox
+ \beforeTABLEbox
+ \box\finaltblbox
+ \afterTABLEbox}
+
+\def\splittblbox#1%
+ {\ifinsidesplitfloat
+ \donetrue
+ \else\ifinsidefloat
+ \donefalse
+ \else
+ \donetrue
+ \fi\fi
+ \ifdone
+ \executeifdefined{dosplittblbox\tbltblsplitmethod}\dosplittblbox{#1}%
+ \else
+ \notsplittblbox{#1}%
+ \fi}
+
+\newbox\TABLEsplitbox % public, don't change
+
+\let\extratblsplitheight\zeropoint % additional space taken by before/afterTABLEsplitbox
+
+\def\dosplittblbox#1%
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{\dimexpr\extratblsplitheight+\tbltblsplitoffset\relax}%
+ \def\tsplitbeforeresult {\beforeTABLEsplitbox}%
+ \def\tsplitafterresult {\afterTABLEsplitbox}%
+ \def\tsplitafter {\@@tblsplitafter}%
+ \setbox\tsplitcontent\vbox{#1}%
+ \ifmultipleTBLheads
+ \dorecurse\noftblheadlines
+ {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvcopy\tsplithead\unvcopy\scratchbox}}%
+ \dorecurse\noftblnextlines
+ {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}%
+ \fi
+ \doifsomething\tbltblspaceinbetween
+ {\def\tsplitinbetween{\blank[\tbltblspaceinbetween]}}%
+ \def\postprocesstsplit{\postprocessTABLEsplitbox{\box\tsplitresult}}%
+ \handletsplit}
+
+% ! ! ! ! TODO: naast \postprocessTABLEsplitbox ook evt \postprocessTABLEbox voor niet split
+
+\let\postprocessTABLEsplitbox\gobbleoneargument
+\let\postprocessTABLEbox \gobbleoneargument
+
+\let\beforeTABLEsplitbox\relax
+\let\afterTABLEsplitbox \relax
+\let\beforeTABLEbox \relax
+\let\afterTABLEbox \relax
+
+\def\checktblwidthsone{\dochecktblwidths0} % 0 = trial run
+\def\checktblwidthstwo{\dochecktblwidths1} % 1 = real run
+
+\def\dochecktblwidths#1%
+ {\iftraceTABLE\showtblwids{B#1}\fi
+ \!!counta\zerocount
+ \!!dimena\dimexpr\hsize-\tbltblleftmargindistance-\tbltblrightmargindistance-\tbltblcolumndistance\relax
+ \dorecurse\maximumcol
+ {\scratchdimen\gettblaut\recurselevel\relax
+ \advance\!!dimena-\gettbldis\recurselevel\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \advance\!!dimena -\scratchdimen
+ \else
+ \scratchdimen\gettblwid\recurselevel\relax
+ \ifdim\scratchdimen>\tbltblmaxwidth\relax
+ \ifcase#1\else\lettblwid\recurselevel\zeropoint\fi
+ \advance\!!counta \plusone
+ \else
+ \ifdim\scratchdimen>\zeropoint\relax
+ \advance\!!dimena -\scratchdimen
+ \else
+ % eigenlijk moet dit alleen als de kolom wordt overspannen door een
+ % vorige, maw extra dubbele loop en status var
+ \advance\!!counta \plusone
+ \fi
+ \fi
+ \fi}%
+ \ifcase\!!counta \else \divide\!!dimena \!!counta \fi
+ \dorecurse\maximumcol
+ {\scratchdimen\gettblwid\recurselevel\relax
+ \ifcase#1\relax
+ \ifdim\scratchdimen<\!!dimena % take natural width
+ \settblaut\recurselevel{\the\scratchdimen}%
+ \fi
+ \else
+ \ifdim\scratchdimen=\zeropoint % auto set width
+ \settblwid\recurselevel{\the\!!dimena}%
+ \fi
+ \fi}%
+ \iftraceTABLE\showtblwids{E#1}\fi}
+
+\newcount\xrowTBL
+\newcount\xcolTBL
+\newcount\xxrowTBL
+
+% dikke arg naar recurse wegwerken
+
+\def\dochecktblheightsone
+ {\!!countb\gettblrow\xrowTBL\xcolTBL\relax
+ % check row span
+ \ifnum\!!countb>\plusone
+ % current height in row
+ \dimen0=\gettblht\xrowTBL\xcolTBL
+ % find nearest height in row
+ \dimen2=\zeropoint
+ \dorecurse\maximumcol
+ {\ifnum\recurselevel=\xcolTBL\else
+ \doiftblrow\xrowTBL\recurselevel
+ {\!!countc=\gettblrow\xrowTBL\recurselevel\relax
+ \ifnum\!!countc=\plusone
+ \dimen4=\gettblht\xrowTBL\recurselevel\relax
+ \ifdim\dimen2<\dimen4
+ \dimen2=\dimen4
+ \fi
+ \fi}%
+ \fi}%
+ \xxrowTBL\xrowTBL
+ % calculate cummulative height
+ \dimen4=\dimen2
+ \!!countc\xrowTBL
+ \advance\!!countc\minusone
+ \dorecurse\!!countb
+ {\ifnum\xxrowTBL=\xrowTBL\else
+ \advance\dimen4 \gettblhei\xxrowTBL
+ \fi
+ \ifnum\recurselevel=\!!countb\else
+ \settblnob\!!countc
+ \advance\!!countc\plusone
+ \fi
+ \advance\xxrowTBL\plusone}%
+ % distribute overshoot equally
+ \ifdim\dimen2>\zeropoint % new: test on natural-003
+ \ifdim\dimen4<\dimen0
+ \advance\dimen0 -\dimen4
+ \divide\dimen0 \!!countb
+ \xxrowTBL\xrowTBL
+ \settblhei\xrowTBL{\the\dimen2}%
+ \dorecurse\!!countb
+ {\dorecurse\maximumcol
+ {\ifnum\recurselevel=\xcolTBL\else
+ \scratchdimen\dimexpr\gettblht\xxrowTBL\recurselevel+\dimen0\relax
+ \settblht\xxrowTBL\recurselevel{\the\scratchdimen}%
+ \ifdim\gettblhei\xxrowTBL<\scratchdimen
+ \settblhei\xxrowTBL{\the\scratchdimen}%
+ \fi
+ \fi}%
+ \advance\xxrowTBL\plusone}%
+ \else\ifdim\dimen4>\dimen0
+ \iftightTBLrowspan
+ \settblhei\xrowTBL{\the\dimen2}%
+ \fi
+ \fi\fi
+ \fi
+ \fi}
+
+\def\checktblheightsone
+ {\dorecurse\maximumrow
+ {\xrowTBL\recurselevel\relax
+ \dorecurse\maximumcol
+ {\xcolTBL\recurselevel\relax
+ \doiftblrow\xrowTBL\xcolTBL\dochecktblheightsone}}}
+
+\def\checktblheightstwo
+ {}
+
+\def\showtblwids#1%
+ {\vbox
+ {\forgetall\tttf[#1]\dorecurse\maximumcol
+ {\scratchdimen\gettblwid\recurselevel\relax
+ [\recurselevel:\the\scratchdimen]}}}
+
+\def\TBLcharalign
+ {\doifelse\tbltblaligncharacter\v!yes
+ \doTBLcharalign\gobbleoneargument}
+
+\long\def\doTBLcharalign#1#2% column data
+ {\edef\alignmentclass{#1}%
+ \edef\alignmentcharacter{\tbltblalignmentcharacter}%
+ \ifcase\tblpass\or
+ \setfirstpasscharacteralign\checkalignment{#2}% {\strut#2\unskip}%
+ \fi % force hsize, so always a second
+ \setsecondpasscharacteralign \checkalignment{#2}% {\strut#2\unskip}%
+ \ignorespaces}
+
+% new, needed for icare first col of 'doeltabel', experimental
+
+\long\def\dohandleTBLcellA#1#2[#3]#4% grouping added ! ! !
+ {\bgroup
+ \setupTBLcell{#1}{#2}%
+ \setbox\scratchbox\hbox
+ {\scratchdimen\tbltbldistance\relax
+ \ifdim\scratchdimen>\gettbldis{#2}\relax
+ \settbldis{#2}{\the\scratchdimen}%
+ \fi
+ \localframed
+ [\@@tbl\@@tbl]
+ [#3,\c!background=,\c!frame=\v!off]% 25% faster
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL\inTBLcell{#1}{#2}}}%
+ \scratchdimen\gettblwid\tblcol\relax
+ \ifdim\wd\scratchbox>\scratchdimen
+ \ifsqueezeTBLspan
+ \ifautosqueezeTBLspan
+ \doifinsetelse\tbltblwidth{\v!fit,\v!fixed,\v!broad,\v!local}
+ \donetrue \donefalse
+ \else
+ \donetrue
+ \fi
+ \ifdone % brr, 0
+ \ifnum\number\gettblcol{#1}{#2}>\plusone \settblspn\tblcol\fi
+ \fi
+ \fi
+ \doifelsetblspn\tblcol
+ \donothing
+ {\ifdim\gettblwid\tblcol<\wd\scratchbox
+ \settblwid\tblcol{\the\wd\scratchbox}%
+ \fi}% auto set
+ \fi
+ \scratchcounter\numexpr\tblrow+\plusone\relax
+ \scratchdimen\gettblhei\scratchcounter\relax
+ \ifdim\ht\scratchbox<\scratchdimen
+ \settblhei\scratchcounter{\the\ht\scratchbox}% auto set
+ \fi
+ \settblht{#1}{#2}{\the\ht\scratchbox}%
+ \settblwd{#1}{#2}{\the\wd\scratchbox}%
+ \ifautoTBLcheckwidth
+ \ifdim\wd\scratchbox<.75\hsize
+ \ifdim\ht\scratchbox>2\openlineheight % honor width since this
+ \scratchdimen\gettblaut\tblcol\relax % can be a figure or so
+ \ifdim\scratchdimen=\zeropoint
+ % side effect: when width is set to 0pt,
+ % we can force a span that fits the sum of spans widths
+ \settblaut\tblcol{\the\scratchdimen}%
+ \else\ifdim\wd\scratchbox>\scratchdimen
+ % unless span
+ \settblaut\tblcol{\the\wd\scratchbox}%
+ % to be translated
+ \writestatus\m!TABLE
+ {no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}%
+ \fi\fi
+ \fi
+ \fi
+ \fi
+ \setbox2\null
+ \wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox
+ \box2
+ \egroup}
+
+\long\def\dohandleTBLcellBC#1#2#3[#4]#5%
+ {\setbox\scratchbox\hbox
+ {\setupTBLcell{#2}{#3}%
+ \localframed
+ [\@@tbl\@@tbl]
+ [#4,#1,\c!frame=\v!off,\c!background=]
+ {\bTBLCELL#5\eTBLCELL}}%
+ \setbox2\null
+ \wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox
+ \ifautoTBLrowspan
+ \scratchcounter\numexpr\tblrow+\plusone\relax
+ \doiftblrow\scratchcounter\tblcol
+ {\scratchdimen\gettblhei\scratchcounter\relax % moved inside test
+ \ifnum\gettblrow\scratchcounter\tblcol>\plusone \ifdim\ht\scratchbox>\scratchdimen
+ \scratchdimen-\scratchdimen \advance\scratchdimen -\ht\scratchbox
+ \ht2\scratchdimen
+ \fi \fi}%
+ \fi
+ \box2 }
+
+\long\def\dohandleTBLcellB#1#2[#3]#4%
+ {\scratchdimen\gettblaut\tblcol\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \let\tblwidthkey\c!width
+ \edef\tblwidth{\the\scratchdimen}%
+ \else
+ \scratchdimen\gettblwid\tblcol\relax
+ \ifdim\scratchdimen>\zeropoint\relax
+ \ifnum\gettblcol{#1}{#2}=\maximumcol\relax
+ \scratchdimen\hsize
+ \fi
+ \let\tblwidthkey\c!width
+ \edef\tblwidth{\the\scratchdimen}%
+ \else
+ \let\tblwidthkey\s!unknown
+ \let\tblwidth\zeropoint
+ \fi
+ \fi
+ \dohandleTBLcellBC{\tblwidthkey=\tblwidth}{#1}{#2}[#3]{\TBLcharalign{#2}{#4}}}
+
+\long\def\dohandleTBLcellC
+ {\dohandleTBLcellBC{}}
+
+\long\def\dohandleTBLcellD#1#2[#3]#4%
+ {\setupTBLcell{#1}{#2}%
+ \bgroup
+ \localframed
+ [\@@tbl\@@tbl]
+ [#3,\c!width=\widthTBL,\c!background=,\c!frame=\v!off]% 25% faster
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}%
+ \egroup}
+
+\long\def\dohandleTBLcellE#1#2[#3]#4%
+ {\setupTBLcell{#1}{#2}%
+ \getparameters[\@@tbl\@@tbl][#3]% to get the color right, the way we
+ \color % handle color here prevents interference due to whatsit nodes
+ [\tbltblcolor] % as well as permits local colors to take precedence
+ {\ifdim\heightTBL=\zeropoint\relax % case: nc=maxcolumns
+ \localframed
+ [\@@tbl\@@tbl]
+ [\c!color=,\c!width=\widthTBL]
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}%
+ \else
+ \localframed
+ [\@@tbl\@@tbl]
+ [\c!color=,\c!width=\widthTBL,\c!height=\heightTBL]
+ {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}%
+ \fi}%
+ \hskip\gettbldis{#2}}
+
+\presetlocalframed % todo: tableparameter etc
+ [\@@tbl\@@tbl]
+
+\setupTABLE [%
+ \c!frameoffset=.5\linewidth,
+ \c!backgroundoffset=\v!frame,
+ \c!framecolor=\s!black,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!autowidth=\v!yes,
+ \c!rulethickness=\linewidth,
+ \c!strut=\v!yes,
+ \c!autostrut=\v!no,
+ %
+ \c!color=,
+ \c!style=,
+ \c!headstyle=\v!bold,
+ \c!headcolor=,
+ \c!aligncharacter=\v!no,
+ \c!alignmentcharacter={,},
+ \c!option=, % \v!stretch
+ \c!header=,
+ \c!spaceinbetween=,
+ \c!maxwidth=8em,
+ \c!textwidth=\hsize,
+ \c!split=\v!auto,
+ \c!splitoffset=0pt,
+ \c!distance=\zeropoint, % individual column
+ \c!columndistance=\zeropoint, % each column (whole table)
+ \c!leftmargindistance=\zeropoint, % whole table
+ \c!rightmargindistance=\zeropoint,% whole table
+ \c!left=,
+ \c!right=,
+ \c!setups=,
+ \c!splitmethod=a%
+]
+
+%D We have already prepared the previous macros for nesting,
+%D so we only have to pop in the right ones:
+
+%D New:
+
+\def\pushTBLparameters
+ {\globalpushmacro\TBLlevel
+ \ifcase\tblpass
+ % we're just after \bTABLE
+ \else\ifnum\TBLlevel>\zerocount
+ \doglobal\increment\TBLlevel\relax
+ \fi\fi}
+
+\def\popTBLparameters
+ {\globalpopmacro\TBLlevel}
+
+\def\pushTBL
+ {\ifnum\TBLlevel=\zerocount
+ \global\advance\currenttbl\plusone
+ \fi
+ \doglobal\increment\TBLlevel\relax
+ \ifnum\TBLlevel>\plusone
+ \resetallTABLEparameters
+ % we need a proper count push/pop
+ \xdef\savedtblrow{\the\tblrow}\globalpushmacro\savedtblrow
+ \xdef\savedtblcol{\the\tblcol}\globalpushmacro\savedtblcol
+ \else
+ \global\intabletrue
+ \fi}
+
+\def\popTBL
+ {\ifnum\TBLlevel>\plusone
+ \globalpopmacro\savedtblrow\global\tblrow\savedtblrow
+ \globalpopmacro\savedtblcol\global\tblcol\savedtblcol
+ \else
+ \global\intablefalse
+ \fi
+ \doglobal\decrement\TBLlevel\relax}
+
+% \bgroup
+% \setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
+% \bTABLE
+% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,2 \eTD \bTD
+% {\setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
+% \bTABLE
+% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
+% \bTR \bTD 11,2 \eTD \bTD 2 \eTD \eTR \eTABLE} \eTD \eTR
+% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
+% \eTABLE
+% \egroup
+
+\newconditional\resetTABLEmode \settrue\resetTABLEmode
+
+\def\resetallTABLEparameters% moet genest wel werken
+ {\ifnum\TBLlevel>\plusone % in ieder geval
+ \ifconditional\resetTABLEmode
+% \presetlocalframed % breedte hoogte diepte offset
+% [\@@tbl\@@tbl]% % achtergrond, achtergrondraster, achtergrondkleur
+ % not ok yet
+ \setupTABLE [%
+ \c!frameoffset=.5\linewidth,
+ \c!backgroundoffset=\v!frame,
+ \c!framecolor=\s!black,
+ \c!width=fit,
+ \c!height=fit,
+\c!autowidth=\v!yes,
+% \c!rulethickness=\linewidth,
+ \c!strut=\v!no,
+\c!strut=\v!yes, % needed for mathml, but ... maybe we need another resetTABLEmode
+\c!autostrut=\v!no,
+ \c!color=,
+ \c!style=,
+ \c!headstyle=,
+ \c!headcolor=,
+ \c!aligncharacter=\v!no,
+ \c!alignmentcharacter={,},
+ \c!maxwidth=8em]%
+ \else
+ \setupTABLE
+ [\c!width=\v!fit,
+ \c!height=\v!fit]%
+ \fi
+ \fi}
+
+%D Spacing:
+%
+% \starttabulate
+% \NC text \NC text \NC \NR
+% \TB[small]
+% \NC text \NC text \NC \NR
+% \TB[4*big]
+% \NC text \NC text \NC \NR
+% \stoptabulate
+%
+% \starttable[|||]
+% \VL text \VL text \VL \AR
+% \TB[small]
+% \VL text \VL text \VL \AR
+% \TB[4*big]
+% \VL text \VL text \VL \AR
+% \stoptable
+
+\def\complexTableTB[#1]{\TABLEnoalign{\blank[#1]}}
+\def\simpleTableTB {\TABLEnoalign{\blank}}
+
+\def\TabulateTB
+ {\complexorsimpleTable{TB}}
+
+\def\doTableinterline% #1
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \chuckTABLEautorow
+ \else\ifnum\currentTABLEcolumn=\zerocount
+ \TABLEnoalign
+ {\globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow}%
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi\fi
+ \complexorsimpleTable} % {#1}
+
+\def\TableHL{\doTableinterline{HL}}
+\def\TableTB{\doTableinterline{TB}}
+
+\appendtoks\let\TB\TableTB \to\everytable
+\appendtoks\let\TB\TabulateTB\to\everytabulate % strange place
+
+\appendtoks \chardef\recodeverbatimmode\plustwo \to \everytable
+
+% new (for Olivier Turlier)
+%
+% \defineTABLEsetup [xx] [foregroundcolor=red]
+%
+% \bTABLE
+% \bTR \bTD oeps \eTD \bTD oeps \eTD \eTR
+% \bTR \bTDs[xx] oeps \eTDs \bTD oeps \eTD \eTR
+% \bTRs[xx] \bTD oeps \eTD \bTD oeps \eTD \eTRs
+% \eTABLE
+
+\unexpanded\def\defineTABLEsetup
+ {\dodoubleargument\dodefineTABLEsetup}
+
+\def\dodefineTABLEsetup[#1][#2]%
+ {\setvalue{\@@tbl:set:#1}{#2}}
+
+\long\def\bTDs[#1]#2\eTDs
+ {\doifdefinedelse{\@@tbl:set:#1}
+ {\@EA\@EA\@EA\bTD\@EA\@EA\@EA[\csname\@@tbl:set:#1\endcsname]#2\eTD}
+ {\bTD[]#2\eTD}}
+
+\long\def\bTRs[#1]#2\eTRs
+ {\doifdefinedelse{\@@tbl:set:#1}
+ {\@EA\@EA\@EA\bTR\@EA\@EA\@EA[\csname\@@tbl:set:#1\endcsname]#2\eTR}
+ {\bTR[]#2\eTR}}
+
+\protect \endinput
+
+% todo: mode: first|next (of niets)
diff --git a/tex/context/base/tabl-nte.mkii b/tex/context/base/tabl-nte.mkii
new file mode 100644
index 000000000..cde64a033
--- /dev/null
+++ b/tex/context/base/tabl-nte.mkii
@@ -0,0 +1,107 @@
+%D \module
+%D [ file=core-nte,
+%D version=2009.03.08,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Natural Tables Extensions,
+%D author=Hans Hagen \& Wolfgang Schuster,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Module / Natural Tables Extensions}
+
+\unprotect
+
+%D This module is suggested by Wolfgang Schuster who also prototyped
+%D it and came up with the rationale:
+%D
+%D This module provides an easy way to use natural in a similiar
+%D way as the older table module (based on the \TABLE\ macros) and
+%D the newer tabulate module.
+%D
+%D You can see the advantage in the following table, once created
+%D with the new macros and once with the normal macros provided
+%D with the natural table module.
+%D
+%D Let us start with the original macros:
+%D
+%D \starttyping
+%D \bTABLE
+%D \bTR
+%D \bTD Text 1 \eTD
+%D \bTD Text 2 \eTD
+%D \eTR
+%D \bTR
+%D \bTD Text 3 \eTD
+%D \bTD Text 4 \eTD
+%D \eTR
+%D \eTABLE
+%D \stoptyping
+%D
+%D Watch how the new macros use less code:
+%D
+%D \starttyping
+%D \startTABLE
+%D \NC Text 1 \NC Text 2 \NC\NR
+%D \NC Text 3 \NC Text 4 \NC\NR
+%D \stopTABLE
+%D \stoptyping
+%D
+%D The actual code differs from the prototype that it does not need
+%D to collect whole rows and parse them but looks ahead instead.
+
+\def\startTABLE
+ {\dosingleempty\dostartTABLE}
+
+\def\dostartTABLE[#1]%
+ {\bgroup
+ \bTABLE[#1]%
+ \let\NC\doTABLENC
+ \let\NR\doTABLENR
+ \let\bTR\relax
+ \let\bTD\relax
+ \let\bTH\relax
+ \let\bTN\relax}
+
+\def\stopTABLE
+ {\eTABLE
+ \egroup}
+
+\newconditional\inTABLEnc
+
+\unexpanded\def\doTABLENR
+ {\eTR
+ \setfalse\inTABLEnc}
+
+\unexpanded\def\doTABLENC
+ {\futurelet\next\dodoTABLENC}
+
+\def\dodoTABLENC
+ {\ifx\next\doTABLENR \else
+ \expandafter\dododoTABLENC
+ \fi}
+
+% \long\def\dododoTABLENC#1\NC
+% {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi
+% \parseTD[][]#1\eTD\NC}
+
+\long\def\dododoTABLENC#1\NC
+ {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi
+ \dodoubleempty\parseTD#1\eTD\NC}
+
+%D The related structure commands are also available:
+
+\unexpanded\def\startTABLEhead{\dosingleempty\dostartTABLEhead} \let\stopTABLEhead\relax
+\unexpanded\def\startTABLEnext{\dosingleempty\dostartTABLEnext} \let\stopTABLEnext\relax
+\unexpanded\def\startTABLEbody{\dosingleempty\dostartTABLEbody} \let\stopTABLEbody\relax
+\unexpanded\def\startTABLEfoot{\dosingleempty\dostartTABLEfoot} \let\stopTABLEfoot\relax
+
+\long\def\dostartTABLEhead[#1]#2\stopTABLEhead{\appendtoks\doTABLEsection[#1]{#2}\to\TBLhead}
+\long\def\dostartTABLEnext[#1]#2\stopTABLEnext{\appendtoks\doTABLEsection[#1]{#2}\to\TBLnext}
+\long\def\dostartTABLEbody[#1]#2\stopTABLEbody{\appendtoks\doTABLEsection[#1]{#2}\to\TBLbody}
+\long\def\dostartTABLEfoot[#1]#2\stopTABLEfoot{\appendtoks\doTABLEsection[#1]{#2}\to\TBLfoot}
+
+\protect \endinput
diff --git a/tex/context/base/tabl-nte.mkiv b/tex/context/base/tabl-nte.mkiv
new file mode 100644
index 000000000..cde64a033
--- /dev/null
+++ b/tex/context/base/tabl-nte.mkiv
@@ -0,0 +1,107 @@
+%D \module
+%D [ file=core-nte,
+%D version=2009.03.08,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Natural Tables Extensions,
+%D author=Hans Hagen \& Wolfgang Schuster,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Module / Natural Tables Extensions}
+
+\unprotect
+
+%D This module is suggested by Wolfgang Schuster who also prototyped
+%D it and came up with the rationale:
+%D
+%D This module provides an easy way to use natural in a similiar
+%D way as the older table module (based on the \TABLE\ macros) and
+%D the newer tabulate module.
+%D
+%D You can see the advantage in the following table, once created
+%D with the new macros and once with the normal macros provided
+%D with the natural table module.
+%D
+%D Let us start with the original macros:
+%D
+%D \starttyping
+%D \bTABLE
+%D \bTR
+%D \bTD Text 1 \eTD
+%D \bTD Text 2 \eTD
+%D \eTR
+%D \bTR
+%D \bTD Text 3 \eTD
+%D \bTD Text 4 \eTD
+%D \eTR
+%D \eTABLE
+%D \stoptyping
+%D
+%D Watch how the new macros use less code:
+%D
+%D \starttyping
+%D \startTABLE
+%D \NC Text 1 \NC Text 2 \NC\NR
+%D \NC Text 3 \NC Text 4 \NC\NR
+%D \stopTABLE
+%D \stoptyping
+%D
+%D The actual code differs from the prototype that it does not need
+%D to collect whole rows and parse them but looks ahead instead.
+
+\def\startTABLE
+ {\dosingleempty\dostartTABLE}
+
+\def\dostartTABLE[#1]%
+ {\bgroup
+ \bTABLE[#1]%
+ \let\NC\doTABLENC
+ \let\NR\doTABLENR
+ \let\bTR\relax
+ \let\bTD\relax
+ \let\bTH\relax
+ \let\bTN\relax}
+
+\def\stopTABLE
+ {\eTABLE
+ \egroup}
+
+\newconditional\inTABLEnc
+
+\unexpanded\def\doTABLENR
+ {\eTR
+ \setfalse\inTABLEnc}
+
+\unexpanded\def\doTABLENC
+ {\futurelet\next\dodoTABLENC}
+
+\def\dodoTABLENC
+ {\ifx\next\doTABLENR \else
+ \expandafter\dododoTABLENC
+ \fi}
+
+% \long\def\dododoTABLENC#1\NC
+% {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi
+% \parseTD[][]#1\eTD\NC}
+
+\long\def\dododoTABLENC#1\NC
+ {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi
+ \dodoubleempty\parseTD#1\eTD\NC}
+
+%D The related structure commands are also available:
+
+\unexpanded\def\startTABLEhead{\dosingleempty\dostartTABLEhead} \let\stopTABLEhead\relax
+\unexpanded\def\startTABLEnext{\dosingleempty\dostartTABLEnext} \let\stopTABLEnext\relax
+\unexpanded\def\startTABLEbody{\dosingleempty\dostartTABLEbody} \let\stopTABLEbody\relax
+\unexpanded\def\startTABLEfoot{\dosingleempty\dostartTABLEfoot} \let\stopTABLEfoot\relax
+
+\long\def\dostartTABLEhead[#1]#2\stopTABLEhead{\appendtoks\doTABLEsection[#1]{#2}\to\TBLhead}
+\long\def\dostartTABLEnext[#1]#2\stopTABLEnext{\appendtoks\doTABLEsection[#1]{#2}\to\TBLnext}
+\long\def\dostartTABLEbody[#1]#2\stopTABLEbody{\appendtoks\doTABLEsection[#1]{#2}\to\TBLbody}
+\long\def\dostartTABLEfoot[#1]#2\stopTABLEfoot{\appendtoks\doTABLEsection[#1]{#2}\to\TBLfoot}
+
+\protect \endinput
diff --git a/tex/context/base/tabl-pln.mkii b/tex/context/base/tabl-pln.mkii
new file mode 100644
index 000000000..39bb50f23
--- /dev/null
+++ b/tex/context/base/tabl-pln.mkii
@@ -0,0 +1,91 @@
+%D The following bunch of macros come from plain \TEX\ by
+%D Don Knuth and deal with basic alignment. We just include
+%D them here so that they can be used if needed. Normally,
+%D \CONTEXT\ users will fall back on one of the three table
+%D environments.
+%D
+%D The hidden names are somewhat adapted and we use other
+%D local variables.
+
+\writestatus{loading}{ConTeXt Table Macros / Plain Tabular}
+
+\unprotect
+
+\newif \if@@plnusetab
+\newif \if@@plncr
+\newbox \@@plntabs
+\newbox \@@plntabsyet
+\newbox \@@plntabsdone
+\newdimen \@@plntabdimen
+
+\def\cleartabs % visible
+ {\global\setbox\@@plntabsyet\null
+ \setbox\@@plntabs\null}
+
+\def\settabs % visible
+ {\setbox\@@plntabs\null
+ \futurelet\next\@@plnsettabs}
+
+\def\tabalign % visible
+ {\@@plnusetabtrue\@@plnmaketabbox}
+
+\let\+\tabalign % no outer here (can be overloaded)
+
+\def\@@plnsettabs
+ {\ifx\next\+%
+ \def\nxt{\afterassignment\@@plnsettab\let\nxt}%
+ \else
+ \let\nxt\@@plnsetcols
+ \fi
+ \let\next\relax
+ \nxt}
+
+\def\@@plnsettab
+ {\let\nxt\relax
+ \@@plnusetabfalse\@@plnmaketabbox}
+
+\def\@@plnsetcols#1\columns
+ {\scratchcounter#1%
+ \@@plntabdimen\hsize
+ \loop
+ \ifnum\scratchcounter>\zerocount \@nother
+ \repeat}
+
+\def\@nother
+ {\scratchdimen\@@plntabdimen
+ \divide\scratchdimen\scratchcounter
+ \setbox\@@plntabs\hbox{\hbox to\scratchdimen{}\unhbox\@@plntabs}%
+ \advance\@@plntabdimen-\scratchdimen
+ \advance\scratchcounter\minusone}
+
+\def\@@plnmaketabbox
+ {\begingroup
+ \global\setbox\@@plntabsyet\copy\@@plntabs
+ \global\setbox\@@plntabsdone\null
+ \def\cr
+ {\@@plncrtrue\crcr\egroup\egroup
+ \if@@plnusetab\unvbox\zerocount\lastbox\fi\endgroup
+ \setbox\@@plntabs\hbox{\unhbox\@@plntabsyet\unhbox\@@plntabsdone}}%
+ \setbox\zerocount\vbox\bgroup\@@plncrfalse
+ \ialign\bgroup&\@@plnbegintabbox##\@@plnendtabbox\crcr}
+
+\def\@@plnbegintabbox
+ {\setbox\zerocount\hbox\bgroup}
+
+\def\@@plnendtabbox
+ {\if@@plncr
+ \egroup % now \box\zerocount holds the column
+ \else
+ \hss\egroup
+ \global\setbox\@@plntabsyet\hbox
+ {\unhbox\@@plntabsyet\global\setbox\plusone\lastbox}% now \box\plusone holds its size
+ \ifvoid\plusone
+ \global\setbox\plusone\hbox to\wd\zerocount{}%
+ \else
+ \setbox\zerocount\hbox to\wd\plusone{\unhbox\zerocount}%
+ \fi
+ \global\setbox\@@plntabsdone\hbox{\box\plusone\unhbox\@@plntabsdone}%
+ \fi
+ \box\zerocount}
+
+\protect \endinput
diff --git a/tex/context/base/tabl-pln.mkiv b/tex/context/base/tabl-pln.mkiv
new file mode 100644
index 000000000..39bb50f23
--- /dev/null
+++ b/tex/context/base/tabl-pln.mkiv
@@ -0,0 +1,91 @@
+%D The following bunch of macros come from plain \TEX\ by
+%D Don Knuth and deal with basic alignment. We just include
+%D them here so that they can be used if needed. Normally,
+%D \CONTEXT\ users will fall back on one of the three table
+%D environments.
+%D
+%D The hidden names are somewhat adapted and we use other
+%D local variables.
+
+\writestatus{loading}{ConTeXt Table Macros / Plain Tabular}
+
+\unprotect
+
+\newif \if@@plnusetab
+\newif \if@@plncr
+\newbox \@@plntabs
+\newbox \@@plntabsyet
+\newbox \@@plntabsdone
+\newdimen \@@plntabdimen
+
+\def\cleartabs % visible
+ {\global\setbox\@@plntabsyet\null
+ \setbox\@@plntabs\null}
+
+\def\settabs % visible
+ {\setbox\@@plntabs\null
+ \futurelet\next\@@plnsettabs}
+
+\def\tabalign % visible
+ {\@@plnusetabtrue\@@plnmaketabbox}
+
+\let\+\tabalign % no outer here (can be overloaded)
+
+\def\@@plnsettabs
+ {\ifx\next\+%
+ \def\nxt{\afterassignment\@@plnsettab\let\nxt}%
+ \else
+ \let\nxt\@@plnsetcols
+ \fi
+ \let\next\relax
+ \nxt}
+
+\def\@@plnsettab
+ {\let\nxt\relax
+ \@@plnusetabfalse\@@plnmaketabbox}
+
+\def\@@plnsetcols#1\columns
+ {\scratchcounter#1%
+ \@@plntabdimen\hsize
+ \loop
+ \ifnum\scratchcounter>\zerocount \@nother
+ \repeat}
+
+\def\@nother
+ {\scratchdimen\@@plntabdimen
+ \divide\scratchdimen\scratchcounter
+ \setbox\@@plntabs\hbox{\hbox to\scratchdimen{}\unhbox\@@plntabs}%
+ \advance\@@plntabdimen-\scratchdimen
+ \advance\scratchcounter\minusone}
+
+\def\@@plnmaketabbox
+ {\begingroup
+ \global\setbox\@@plntabsyet\copy\@@plntabs
+ \global\setbox\@@plntabsdone\null
+ \def\cr
+ {\@@plncrtrue\crcr\egroup\egroup
+ \if@@plnusetab\unvbox\zerocount\lastbox\fi\endgroup
+ \setbox\@@plntabs\hbox{\unhbox\@@plntabsyet\unhbox\@@plntabsdone}}%
+ \setbox\zerocount\vbox\bgroup\@@plncrfalse
+ \ialign\bgroup&\@@plnbegintabbox##\@@plnendtabbox\crcr}
+
+\def\@@plnbegintabbox
+ {\setbox\zerocount\hbox\bgroup}
+
+\def\@@plnendtabbox
+ {\if@@plncr
+ \egroup % now \box\zerocount holds the column
+ \else
+ \hss\egroup
+ \global\setbox\@@plntabsyet\hbox
+ {\unhbox\@@plntabsyet\global\setbox\plusone\lastbox}% now \box\plusone holds its size
+ \ifvoid\plusone
+ \global\setbox\plusone\hbox to\wd\zerocount{}%
+ \else
+ \setbox\zerocount\hbox to\wd\plusone{\unhbox\zerocount}%
+ \fi
+ \global\setbox\@@plntabsdone\hbox{\box\plusone\unhbox\@@plntabsdone}%
+ \fi
+ \box\zerocount}
+
+\protect \endinput
diff --git a/tex/context/base/tabl-tab.mkii b/tex/context/base/tabl-tab.mkii
new file mode 100644
index 000000000..e3bfca9c3
--- /dev/null
+++ b/tex/context/base/tabl-tab.mkii
@@ -0,0 +1,2515 @@
+%D \module
+%D [ file=core-tab,
+%D version=1997.10.10,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=\TABLE\ Embedding,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / TaBlE Embedding}
+
+% By now it makes more sense to merge the patches into the original
+% and clean that one up too.
+
+% \starttable[|||]
+% \HL
+% \VL test \VS test \VL \FR
+% \VL test \VD test \VL \MR
+% \VL test \VT test \VL \LR
+% \HL
+% \stoptable
+
+% Don't change the splitter:
+%
+% ... \NR
+% \TABLEnoalign{\page}\TABLEhead
+% \NC ...
+
+% e-tex: reverse rows or vadjust or ... in tables
+% \ifalign
+% \xhrule : calls for 'special' with width
+% BUG:
+%
+% \starttable[|l|l|]
+% \HL
+% \RL\FR \VL Head 1 \VL Head 2 \VL\FR
+% \RL\LR \VL Head A \VL Head B \VL\LR % niet grijs ??
+% \HL
+% \VL 1 \VL 2 \VL\FR
+% \VL a \VL b \VL\LR
+% \HL
+% \stoptable
+
+% melden als in kleur conflict, uitgestelde test op \SR\SR
+
+% verengelsen
+% interface
+
+% footnotes flushen
+% \......TABLE........ namen
+% kolommen testen
+% unbreakable kop definieren
+% voetnoten
+% meldingen
+% als direct \use{max} dan fout
+% \BREAKPOINT
+% breedte lijn telt
+% errors: ook gray in handle
+
+% \AR -> als in DL dan \DR
+
+% nieuw:
+%
+% \NL / \NL[blanko] is skip, nog default?
+% geen \HL in a row
+% \HL[n]
+% \VL[n] + remembers
+% c{colorspec} key
+% \HC[color][width]
+% \VC[color]
+% meldingen row, column, use, advise
+% \AR: UITSTELLEN / EXPERIMENTEEL
+
+% WAARDELOZE ERROR HANDLER
+% THIS RENEWED MODULE WORKS OK BUT STILL LOOKS BAD
+
+%D We felt no need to write our own table building macros,
+%D simply because Michael Wichura made a terrific one. This
+%D package is quite complete and well documented. In \CONTEXT\
+%D we provide a shell for consistent spacing as well as color
+%D support. Implementing these features without adapting the
+%D original macros is not trivial. One easilly gets conflicts
+%D with \type{\omit}, \type{\span} and \type{\noalign}, which
+%D means that we end up postponing and overloading macros,
+%D mostly global. Now, let's start with loading the main
+%D macros:
+
+\doifundefined{BeginTable}{\doinputonce{table.tex}}
+
+\unprotect
+
+%D \macros
+%D {inintable, ifsplittables}
+%D
+%D First we declare some variables. These show a bit what we
+%D are dealing with. First we introdoce some booleans that
+%D enable us, inside as well as outside this module, to
+%D determine in what mode we are.
+
+\newif\ifintable
+\newif\ifsplittables
+
+%D \macros
+%D {tracetablestrue}
+%D
+%D When I documented this module, I felt the need for tracing
+%D options. After implementing this feature, I also added
+%D warnings, error recovery and automatic spacing.
+
+\newif\iftracetables
+
+%D We show this feature in an eample that also shows some of
+%D the basic table typesetting commands.
+%D
+%D \startbuffer
+%D \starttable[|||]
+%D \HL
+%D \VL first \VL second \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL\AR
+%D \VL beta \VL 2 \VL\AR
+%D \VL gamma \VL 3 \VL\AR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \startcombination
+%D {\tracetablesfalse\getbuffer} {\type{\tracetablesfalse}}
+%D {\tracetablestrue\getbuffer} {\type{\tracetablestrue}}
+%D \stopcombination
+%D
+%D This table is specified as:
+%D
+%D \typebuffer
+%D
+%D This examples shows about the minimum of commands needed to
+%D typeset such a table. In this table, the \type {\AR} is
+%D automatically translated into the more primitive (but more
+%D verbose) commands \type {\SR}, \type {\FR}, \type {\MR} and
+%D \type {\LR} commands.
+%D
+%D \startbuffer
+%D \starttables[|||]
+%D \HL
+%D \VL first \VL second \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL\AR
+%D \VL beta \VL 2 \VL\AR
+%D \VL gamma \VL 3 \VL\AR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D When we use the split table feature, we get a bit more
+%D information.
+%D
+%D {\tracetablesfalse\getbuffer}
+%D
+%D Sometimes in tables information shows up that is not typed
+%D in by the user. These messages give a cue in what aspect a
+%D table definition is wrong.
+%D
+%D \startbuffer
+%D \starttable[||||]
+%D \HL
+%D \VL first second \VL third \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL a \VL\AR
+%D \VL beta \VL 2 \VL b \VL
+%D \VL gamma \VL \THREE{3} c \VL\AR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Those terrible table has three errors, which all show up in
+%D typeset messages. Errors cannot always recovered 100\% and
+%D therefore can result in two or more succesive messages, like
+%D in the last row.
+%D
+%D \getbuffer
+
+%D Bringing color into tables is complicated by the mere fact
+%D that color is not part of \TEX. The main complication is
+%D that we don't know in advance how wide a column will be. I
+%D implemented color support in tables in the early 90's
+%D because I needed it for some articles on color. I have to
+%D admit that I seldom use the mechanism.
+%D
+%D Most color support in \CONTEXT\ makes use of colored rules.
+%D At first sight, one is tempted to implement colors in tables
+%D in a similar way, but as said, we don't know the dimensions
+%D in advance. It turns out however that we don't have to,
+%D simply because alignments take care of stretching rules to
+%D the appropritate dimensions. This means that we can provide
+%D backgrounds by coloring rules with the height of a row,
+%D skipping upwards and finally drawing the content, like in:
+%D
+%D \gdef\ShowExample
+%D {\startfiguretext
+%D {none}
+%D {\getbuffer}
+%D \typebuffer
+%D \stopfiguretext}
+%D
+%D \startbuffer
+%D \starttable[|c|c|]
+%D \HL
+%D \BL[2] \SR
+%D \VL test \VL test \VL\SR
+%D \HL
+%D \VL test \VL test \VL\FR
+%D \VL test \VL test \VL\MR
+%D \VL test \VL test \VL\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Just to be complete we show how the other columns can be
+%D given a background. Later we will provide more details over
+%D the commands used.
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BL[3] \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BC \BL[2] \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BC \BC \BL \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BC \BL \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \BL \BL \SR
+%D \HL
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+
+%D In these examples we can clearly see that for being a real
+%D background, the color or gray specification has to precede
+%D the content. Just to keep things simple, we can recall this
+%D specification later on:
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \BC \BL \SR
+%D \HL
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \BR\FR
+%D \VL test \VL test \VL test \VL\FR
+%D \BR\MR
+%D \VL test \VL test \VL test \VL\MR
+%D \BR\LR
+%D \VL test \VL test \VL test \VL\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Close study learns that we can put the specification
+%D before or after the \type{\HL}, whatever suits best. Keeping
+%D track of these specifications is taken care of by the next
+%D variables:
+
+\newif \ifTABLEgrayline % executing gray line
+\newif \ifTABLEgraydone % gray line executed
+\newtoks \TABLEgraytoks % gray line specification
+
+\newif\ifTABLEinbreak
+
+%D Nog vervangen:
+
+\def\c!Table{Table}
+\def\m!TABLE{TABLE}
+
+%D We already saw that the table macros report errors and
+%D provide automatic spacing. These features can only be
+%D implemented by keeping track of the state, often the last
+%D command on a row.
+
+\chardef\TABLEunknown = 0
+
+\chardef\TABLEseparaterow = 1
+\chardef\TABLEfirstrow = 2
+\chardef\TABLEmidrow = 3
+\chardef\TABLElastrow = 4
+\chardef\TABLErule = 5
+\chardef\TABLEskip = 6
+\chardef\TABLEautorow = 7
+
+\chardef\TABLEforcefirstrow = 1
+\chardef\TABLEforcelastrow = 2
+
+\chardef\TABLEmissingrow = 1
+\chardef\TABLEmissingcolumn = 2
+\chardef\TABLEspanoverflow = 3
+\chardef\TABLEdivisionoverflow = 4
+
+%D We store these states using efficient \type {\chardef}'s.
+%D Like most variables, these are global ones. When needed,
+%D especially when we flush the backgrounds, we can temporary
+%D disable the assignment.
+
+\newif\ifsetTABLEaction
+
+\def\setTABLEaction#1%
+ {\ifsetTABLEaction\global\chardef\TABLEaction#1\fi}
+
+\def\setTABLEforce#1%
+ {\ifsetTABLEaction\global\chardef\TABLEforce#1\fi}
+
+\def\setTABLEerror#1%
+ {\global\chardef\TABLEerror#1}
+
+%D Before we come to using these variables, we redefine and/or
+%D adapt some \TABLE\ macros. Within \TABLE's the \type{|} and
+%D \type{"} have special meanings in templates and are active
+%D during. Their meaning can therefore conflict with those
+%D elsewhere defined. To be compatible with traditional \TABLE\
+%D as well as \CONTEXT's \type{||} and the active \type{"}
+%D extensions for my german friends, we do some catcode magic.
+
+\newif\ifForgetTableBarAndQuote \ForgetTableBarAndQuotetrue
+
+% \bgroup
+
+% \catcode`\|=\@@active
+% \catcode`\"=\@@active
+%
+% \gdef\pushouterbarandquote
+% {\ifForgetTableBarAndQuote
+% \ifnum\catcode`\|=\@@active \let\outertablebar |\else\let\outertablebar \relax\fi
+% \ifnum\catcode`\"=\@@active \let\outertablequote"\else\let\outertablequote\relax\fi
+% \let|\letterbar
+% \let"\letterdoublequote
+% \fi}
+%
+% \gdef\popouterbarandquote
+% {\ifForgetTableBarAndQuote
+% \ifx\outertablebar \relax\else\let|\outertablebar \fi
+% \ifx\outertablequote\relax\else\let"\outertablequote\fi
+% \else
+% \redefinetablebarandquote
+% \fi}
+%
+% \egroup
+%
+% \def\ObeyTableBarAndQuote
+% {\ForgetTableBarAndQuotefalse
+% \ifintable
+% \redefinetablebarandquote
+% \fi}
+
+\let\ActivateBarAndQuote \relax
+\let\ObeyTableBarAndQuote\relax
+\let\pushouterbarandquote\relax
+\let\popouterbarandquote \relax
+
+%D \macros
+%D {ObeyTableBarAndQuote}
+%D
+%D As said, the \type{|} and \type{"} active characters are
+%D often used for other purposes. By default, the outside
+%D meanings are therefore preserved and available inside
+%D tables. If for some reason one wants to use the \TABLE\
+%D primitives, one can say:
+%D
+%D \starttyping
+%D \ObeyTableBarAndQuote
+%D \stoptyping
+%D
+%D To keep things verbose, as well as to show what \TABLE\
+%D commands we affect, we show some meanings.
+
+\def\normalTABLEshortrule {\!ttShortHrule} % \-
+\def\normalTABLElongrule {\!ttLongHrule} % \=
+\def\normalTABLEfullrule {\!ttFullHrule} % \_
+\def\normalTABLEendofrow {\!ttEndOfRow} % \\
+\def\normalTABLEsimplebar {\unskip\!ttRightGlue&&} % |
+\def\normalTABLEcomplexbar {\unskip\!ttRightGlue&\omit\!ttAlternateVrule} % \|
+\def\normalTABLEquote {\unskip\!ttRightGlue&\omit&} % "
+\def\normalTABLElineformat {\normalTABLEendofrow+}
+\def\normalTABLElineending {\normalTABLEendofrow0 }
+\def\normalTABLEsinglerule {&\normalTABLElongrule&}
+\def\normalTABLEmultirule#1{&\use{#1}\normalTABLElongrule&}
+
+%D The next hack is dedicated to Tobias, who found out that
+%D paragraph entries don't break well.
+
+\def\TABLEhack{\hskip\zeropoint}
+
+%D The first attemp to solve this problem was:
+%D
+%D \starttyping
+%D \def\normalTABLEquote%
+%D {\unskip\TABLEhack\!ttRightGlue&\omit&\TABLEhack}
+%D \stoptyping
+%D
+%D But, as usual, this interfered with \type {\omit}.
+%D
+%D The next attempt is redefining some core \TABLE\ macro:.
+%D This works ok, but breaks for instance the~\type{b}
+%D key handling.
+%D
+%D \starttyping
+%D \def\!tfAdjoinPriorColumn%
+%D {\ifnum\!taColumnNumber=0
+%D \!taPreamble=\!taRuleColumnTemplate
+%D ...
+%D \if!taOnceOnlyTabskip
+%D \!thToksEdef\!taDataColumnTemplate=
+%D {\TABLEhack####\TABLEhack\tabskip\the\!taLastRegularTabskip}
+%D \else
+%D \!taDataColumnTemplate{\TABLEhack##\TABLEhack}%
+%D \fi
+%D ...
+%D \ReadFormatKeys}
+%D \stoptyping
+
+% \newdimen\TABLEparheight
+
+\def\BeginTableParBox#1%
+ {\setbox\scratchbox\vtop\bgroup % \setbox added
+ \hsize#1\relax
+ \dontcomplain
+ \restoretablelineskips
+ \normalbaselines
+ \let~\!ttTie
+ \let\-\!ttDH
+ \blank[\v!disable]% % added
+ \the\EveryTableParBox}
+
+\def\EndTableParBox
+ {\removelastskip % itemize or so
+ \endgraf
+ \ifnum\prevgraf>\zerocount % we want at least
+ \verticalstrut \nowhitespace \vskip-\struttotal % one line of text
+ \egroup
+ \ifdim\dp\scratchbox>\lineheight % see (*) for an
+ \getnoflines{\dp\scratchbox}% % example of where
+ \dp\scratchbox\zeropoint % saving can go
+ \setbox\scratchbox % terrible wrong
+ \vtop to \noflines\lineheight{\box\scratchbox}%
+ \fi % esp between rows
+ \else % of paragraphs
+ \egroup
+ \fi
+% \getboxheight\scratchdimen\of\box\scratchbox\relax% compensate for
+% \ifdim\scratchdimen>\TABLEparheight % funny depth of
+% \global\TABLEparheight\scratchdimen % multi-line box
+% \fi % i.e. vtop
+ \box\scratchbox}
+
+% We also need to patch away the interfering math switch:
+
+% \mathpunctuationtrue
+
+% test, test
+% \starttable[|c|]
+% \NC1,,10\NC\AR
+% \stoptable
+% test, test
+
+\def\!ttBeginTableA[#1]{%
+ \if #1u% % "unboxed" table
+ \ifmmode
+ \def\!ttEndTable{% % user had better be in display math mode
+ \relax}% % and have only one table at the outer level
+ \else % user had better be in vertical mode
+ \bgroup
+ \def\!ttEndTable{%
+ \egroup}%
+ \fi
+ \else
+ %\hbox\bgroup $
+ %\def\!ttEndTable{%
+ % \egroup % for the \vtop, \vbox, or \vcenter, yet to come
+ % $% for math mode
+ % \egroup}% for the \hbox
+ %\if #1t%
+ % \vtop
+ %\else
+ % \if #1b%
+ % \vbox
+ % \else
+ % \vcenter % math mode was essential for this
+ % \fi
+ %\fi
+ %
+ \hbox\bgroup
+ \def\!ttEndTable{\egroup\egroup}%
+ \if#1t%
+ \vtop
+ \else\if#1b%
+ \vbox
+ \else
+ \def\!ttEndTable{\egroup$\egroup}%
+ %$\vcenter
+ \scratchtoks\everymath\everymath\emptytoks$\everymath\scratchtoks\vcenter
+ \fi\fi
+ %
+ \bgroup % for the \vtop, \vbox, or \vcenter
+ \fi
+ \advance\!taRecursionLevel 1 % RecursionLevel governs initialization
+ \let\!ttRightGlue=\relax % This may be changed by \JustCenter, etc
+ \everycr\emptytoks % ={}
+ \ifnum \!taRecursionLevel=1
+ \!ttInitializeTable
+ \fi}
+
+%D The next redefinition is more robust than the original:
+
+\def\SetTableToWidth#1%
+ {\doifelsenothing{#1}{\!taTableSpread\emptytoks}{\!taTableSpread{to #1}}}
+
+% (*) Try this one with \type {direction} and {girection};
+% the \PPCHTEX\ manual is a nice testcase.
+%
+% \startoverlay
+% {\starttable[ | l w(2cm) | w(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR
+% \HL
+% \stoptable}
+% {\starttable[ | l w(2cm) | p(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR
+% \HL
+% \stoptable}
+% \stopoverlay
+% \vskip2cm
+% \starttable[ | l w(2cm) | p(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR
+% \HL
+% \stoptable
+% \vskip2cm
+% \starttable[ | l w(2cm) | p(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR
+% \HL
+% \stoptable
+
+%D To give an impression of what the (well documented) source
+%D of \TABLE\ looks like, we first implement an alternative for
+%D the numeric keys. The quantity keys (\type{q} and \type{Q})
+%D support the more european way of writing numbers:
+%D
+%D \startnarrower
+%D 100.000.000,00 instead of 100,000,000.00
+%D \stopnarrower
+%D
+%D The next table shows how to use these keys. We use braces
+%D instead of brackets because we need brackets to specify the
+%D format.
+%D
+%D \startbuffer
+%D \starttable{|q[00,000]|Q[00,00]|}
+%D \HL
+%D \VL -1,2 \VL 12,35 \VL\FR
+%D \VL 11,203 \VL 2,4 \VL\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Although a more efficient implementation is possible |<|we
+%D can for instance share common macros|>| we just adapt a copy
+%D of the numeric ones. To permit double loading of this
+%D module, we check for the existence of one of the macros.
+
+\letvalue{!tk<\string q>}=\undefined
+\letvalue{!tk<\string Q>}=\undefined
+
+%D We just copy the original {\em comments}.
+%D
+%D \em Key \type{q}: quantity item, non||math mode.
+
+\NewFormatKey q%
+ {\letempty\!tqStyle
+ \futurelet\!tnext\!tqTestForBracket}
+
+%D \em Key \type{Q}: quantity item, math mode.
+
+\NewFormatKey Q%
+ {\def\!tqStyle{$}%
+ \futurelet\!tnext\!tqTestForBracket}
+
+%D \em Note: the space between a quantity entry and the
+%D following \type{|}, \type{"}, or \type{\|} is mandatory.
+%D empty quantity entries are not allowed: use \type{{}} or
+%D \type{\omit} instead.
+%D
+%D \em Test for bracket: invoked by the keys \type{q} and
+%D \type{Q}.
+
+\def\!tqTestForBracket
+ {\ifx[\!tnext
+ \!thx\!tqGetArgument
+ \else
+ \!thx\!tqGetCode
+ \fi}
+
+%D \em Get code: e.g. \type{4}, or \type{4,0}, \type{0,4}, or
+%D \type{10,2}.
+
+\def\!tqGetCode#1 % note the blank
+ {\!tqConvertCode #1,,!}
+
+%D \em Convert code: e.g. converts above to \type{[0000]},
+%D \type{[0000,]}, \type{[,0000]}, \type{[0000000000,00]}.
+
+\def\!tqConvertCode #1,#2,#3!%
+ {\begingroup
+ \aftergroup\edef
+ \aftergroup\!ttemp
+ \aftergroup{%
+ \aftergroup[%
+ \!taCountA #1
+ \!thLoop
+ \ifnum \!taCountA>\zerocount
+ \advance\!taCountA \minusone
+ \aftergroup0
+ \repeat
+ \def\!ttemp{#3}%
+ \ifx\!ttemp\empty
+ \else
+ \aftergroup,
+ \!taCountA #2
+ \!thLoop
+ \ifnum\!taCountA>\zerocount
+ \advance\!taCountA \minusone
+ \aftergroup0
+ \repeat
+ \fi
+ \aftergroup]\aftergroup}%
+ \endgroup\relax
+ \!thx\!tqGetArgument\!ttemp}
+
+%D \em Get argument:
+%D
+%D \starttyping
+%D <sample left field> <optional, sample right field>
+%D \stoptyping
+
+\def\!tqGetArgument[#1]%
+ {\!tqMakeQuantityTemplate\!tqStyle#1,,!}
+
+%D \em Make quantity template.
+
+\def\!tqMakeQuantityTemplate#1#2,#3,#4!% #1=<empty> or $
+ {\def\!ttemp{#4}%
+ \ifx\!ttemp\empty
+ \!taDimenC\zeropoint
+ \else
+ \setbox0\hbox{\mathsurround\zeropoint #1,#3#1}%
+ \!taDimenC\wd0
+ \fi
+ \setbox0\hbox{\mathsurround\zeropoint #1#2#1}%
+ \!thToksEdef\!taDataColumnTemplate
+ ={\noexpand\!tqSetQuantityItem{\the\wd0 }{\the\!taDimenC}{#1}%
+ \the\!taDataColumnTemplate}%
+ \ReadFormatKeys}
+
+%D \em Set numeric item.
+
+\def\!tqSetQuantityItem #1#2#3#4 %
+ {\!tqSetQuantityItemA{#1}{#2}{#3}#4,,!}
+
+\def\!tqSetQuantityItemA #1#2#3#4,#5,#6!%
+ {\def\!ttemp{#6}%
+ \hbox to #1{\hss\mathsurround\zeropoint#3#4#3}%
+ \hbox to #2{\ifx\!ttemp\empty\else\mathsurround\zeropoint#3,#5#3\fi\hss}}
+
+%D Here ends the Q||extension. Did you watch the clever use
+%D of aftergroup in \type{\!tqConvertCode}.
+
+% %D We also (have to) define a key for \type{\cap}:
+%
+% \letvalue{!tk<\string K>}=\undefined
+%
+% \NewFormatKey K%
+% {\ReadFormatKeys b\smallcapped}
+
+%D A few pages back we saw backgrounds, further on we will see
+%D colored rules, and here we provide a means to color the
+%D entries in a column. (We can of course always use the normal
+%D color commands for individual entries.) We could not use the
+%D lowercase~\type{c}, because that one is used to force {\em
+%D centering}.
+%D
+%D \startbuffer
+%D \starttable[|C{red}|C{green}|C{blue}|]
+%D \VL R(ed) \VL G(reen) \VL B(lue) \VL\SR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+
+\letvalue{!tk<\string C>}=\undefined
+
+\NewFormatKey C#1%
+ {\ReadFormatKeys b{\localstartcolor[#1]} a{\localstopcolor}}
+
+%D So now we have three new keys:
+%D
+%D \starttable[|||]
+%D \HL
+%D \NC \bf key \NC \bf meaning \NC\AR
+%D \HL
+%D \NC Q[x,y] \NC math mode formatted numbers \NC\AR
+%D \NC q[x,y] \NC text mode formatted numbers \NC\AR
+%D \NC C{identifier} \NC column entry color \NC\AR
+%D \HL
+%D \stoptable
+
+%D To be compatible with the tabulate environment, we also
+%D support the \type {l}, \type {c} and \type {r} keys for
+%D paragraph entries.
+
+\letvalue{!tk<\string l>}=\undefined
+\letvalue{!tk<\string c>}=\undefined
+\letvalue{!tk<\string r>}=\undefined
+\letvalue{!tk<\string x>}=\undefined % not that needed
+
+\NewFormatKey c%
+ {\prependtoks\raggedcenter\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\hfil \RightGlue\hfil}
+
+\NewFormatKey l%
+ {\prependtoks\raggedright\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\empty \RightGlue\hfil}
+
+\NewFormatKey r%
+ {\prependtoks\raggedleft\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty}
+
+\NewFormatKey x%
+ {\prependtoks\notragged\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty}
+
+\appendtoks \TABLEparalignment \to \EveryTableParBox
+
+\def\!tfReFormat#1%
+ {\the \!taLeftGlue
+ \vbox{\forgetall\ialign{\span\the\!taDataColumnTemplate\cr#1\cr}}%
+ \the \!taRightGlue
+ \kern\zeropoint} % prevents \unskip / really needed
+
+%D Later on, we're going to implement multiple page table
+%D support, therefore the next \TABLE\ macro needs to be
+%D slightly adapted, i.c. the penalty is removed. We also
+%D add basic color support.
+
+\def\!ttFullHruleA
+ {\!ttGetHalfRuleThickness
+ \startglobalTABLEcolor % added
+ \hrule\!thHeight\dimen0\!thDepth\dimen0
+ \stopglobalTABLEcolor % added
+ %\penalty0 % removed
+ \egroup}
+
+%D We'll see that when we want to give a vertical rule a color,
+%D we have to set and reset states. After heavy testing it
+%D proved most useful to extend a \TABLE\ primitive with some
+%D hooks. One thing to keep in mind is that \type{&} keeps
+%D assignments local. Again, we add basic color support.
+
+\let\TABLEbeforebar\empty
+\let\TABLEafterbar \empty
+
+\def\@VLn{1}
+\def\@VLd{.125em}
+
+\def\do!ttInsertVrule % will be merged in 2005
+ {\vrule \!thWidth
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \LineThicknessFactor
+ \else
+ \!tgValue
+ \fi
+ \LineThicknessUnit
+ \else
+ \!tgValue
+ \fi
+ \hskip\@VLd}
+
+\def\!ttInsertVrule
+ {\hfil
+ \TABLEbeforebar % added
+ \startglobalTABLEcolor % added
+ % we could do without this speedup, some day merge 'm
+ \ifcase\@VLn\or
+ \do!ttInsertVrule
+ \unskip
+ \else
+ \dorecurse\@VLn\do!ttInsertVrule
+ \gdef\@VLn{1}%
+ \unskip
+ \fi
+ \stopglobalTABLEcolor % added
+ \TABLEafterbar % added
+ \hfil
+ &}
+
+%D The next two macros are only adapted to basis rule
+%D color support.
+
+\def\!tfSetVrule
+ {\!thToksEdef\!taRuleColumnTemplate=
+ {\noexpand\hfil
+ \noexpand\startglobalTABLEcolor % added
+ \noexpand\vrule
+ \noexpand\!thWidth
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \the\LineThicknessFactor
+ \else
+ \!tgValue
+ \fi
+ \!taLTU
+ \else
+ \!tgValue
+ \fi
+ ####%
+ \noexpand\hfil
+ \noexpand\stopglobalTABLEcolor % added
+ \the\!taRuleColumnTemplate}%
+ \!tfAdjoinPriorColumn}
+
+\def\!ttShortHruleA
+ {\!ttGetHalfRuleThickness
+ \startglobalTABLEcolor % added
+ \leaders\hrule\!thHeight\dimen0\!thDepth\dimen0\hfill
+ \stopglobalTABLEcolor % added
+ \null
+ \ignorespaces}
+
+%D We already showed the next one, but here we slightly adapt
+%D the macro by adding an \type{\expandafter}. The space after
+%D \type{#1} is crucial!
+
+\def\normalTABLEcomplexbar#1%
+ {\unskip\!ttRightGlue&\omit\expandafter\!ttAlternateVrule#1 }
+
+%D To get rid of interfering \type{\omit}'s when we are
+%D checking the number of columns and reporting problems. The
+%D extensions concern the second level check, the first
+%D subbranch and advancing the column.
+
+\ifx\mscount\undefined \newcount\mscount \fi
+
+\def\!ttuse#1%
+ {\ifnum#1>\plusone
+ \omit
+ \global\TABLEdivisionfalse
+ \scratchcounter\currentTABLEcolumn % added
+ \advance\scratchcounter #1% % added
+ \advance\scratchcounter \minusone % added
+ \ifnum\scratchcounter>\maxTABLEcolumn % added
+ \def\next % added
+ {\setTABLEerror\TABLEspanoverflow % added
+ \handleTABLEerror}% % added
+ \else % added
+ \def\next % added
+ {\global\advance\currentTABLEcolumn #1% % added
+ \global\advance\currentTABLEcolumn \minusone % added
+ \mscount#1% \mscount is in Plain
+ \advance\mscount \minusone
+ \advance\mscount \mscount
+ \!thLoop
+ \ifnum\mscount>\plusone
+ \spanomit \advance\mscount\minusone
+ \repeat
+ \span}%
+ \fi % added
+ \else % added
+ \def\next % conflicts with possible next \omit % added
+ {\global\advance\currentTABLEcolumn \plusone}% % added
+ \fi
+ \next} % added
+
+% \starttable[|c|c|c|c|]
+% \HL
+% \VL {test} \VL \TWO{} \VL test \VL\FR
+% \DL \DC \DL\DR
+% \VL {test} \VL \TWO{} \VL test \VL\LR
+% \HL
+% \stoptable
+
+%D All commands that are executed between rows are to be put in
+%D \type {\noalign}. We can however not verify if we (that is
+%D \TABLE) does or did not enter this mode. A moderate dirty
+%D but useful trick is using our own alternative:\footnote{Once
+%D one has entered the stage of redefining \TEX\ primitives,
+%D such hacks become a second nature. However, redefining \type
+%D {\omit} and \type{\span} is not that easy.}
+
+\def\TABLEnoalign
+ {\noalign\bgroup\let\noalign\relax\let\next=}
+
+%D \macros
+%D {starttable}
+%D
+%D The rest of this module is not easy to comprehend, mainly
+%D because we have to take care of:
+%D
+%D \startitemize[packed]
+%D \item \type{\startitemize[template]}
+%D \item \type{\startitemize{template}}
+%D \item \type{\startitemize[predefined]}
+%D \stopitemize
+%D
+%D as well as:
+%D
+%D \startitemize[continue]
+%D \item restart after table break
+%D \stopitemize
+%D
+%D The official specification of the start command is:
+%D
+%D \showsetup{starttable}
+
+\newconditional\tablerepeathead
+\newconditional\tablerepeattail
+
+\def\starttable
+ {\bgroup
+ \doif\@@tisplit\v!auto
+ {\ifinsidesplitfloat\let\@@tisplit\v!yes\fi}%
+ \doifinsetelse\@@tisplit{\v!yes,\v!repeat}
+ {\def\stoptable{\stoptables\egroup}%
+ \starttables}
+ {\doifelsenothing\@@tiframe
+ {\ifinsidefloat\else\startbaselinecorrection\fi}
+ {\startframedcontent[\@@tiframe]}%
+ \postponenotes
+ \firststagestartTABLE}}
+
+\def\stoptable
+ {\chuckTABLEautorow % before the tail, else noalign problem
+ \insertTABLEtail
+ \TABLEnoalign{\globalletempty\@@TABLEhead}%
+ \TABLEnoalign{\globalletempty\@@TABLEtail}%
+ \finishTABLE
+ \doifelsenothing\@@tiframe
+ {\ifinsidefloat\else
+ \stopbaselinecorrection
+ \goodbreak % compensates all the nobreaks
+ \fi}
+ \stopframedcontent
+ \egroup}
+
+%D Before we can grab the argument, we have to make sure that
+%D the \CATCODES\ are set. The first stage takes care of that.
+
+\def\firststagestartTABLE
+ {\bgroup % kan-ie weg?
+ \global\intabletrue
+ \pushouterbarandquote
+ %catcode`\|=\@@other
+ \complexorsimple\secondstagestartTABLE}
+
+\def\simplesecondstagestartTABLE#1%
+ {\complexsecondstagestartTABLE[{#1}]}
+
+%D \macros
+%D {definetabletemplate}
+%D
+%D The complex (and main) start macro first takes care of the
+%D predefined case. Such a predefined setup looks like:
+%D
+%D \starttyping
+%D \definetabletemplate[test][|||]
+%D
+%D \starttable[test]
+%D \VL test \VL test \VL\AR
+%D \VL test \VL test \VL\AR
+%D \VL test \VL test \VL\AR
+%D \stoptable
+%D \stoptyping
+%D
+%D The implementation of the definition macro is not that
+%D complicated:
+
+\def\definetabletemplate % to be redone
+ {\bgroup
+ \catcode`\|=\@@other
+ \doquadrupleempty\dodefinetabletemplate}
+
+\def\dodefinetabletemplate[#1][#2][#3][#4]%
+ {\ifsecondargument
+ \setgvalue{\c!Table#1}{\douseTABLEtemplate{#2}{#3}{#4}}%
+ \fi
+ \egroup}
+
+\def\douseTABLEtemplate#1#2#3%
+ {\gdef\TABLEhead{\getvalue{@@TABLEhead#2}}%
+ \gdef\TABLEtail{\getvalue{@@TABLEtail#3}}%
+ \complexsecondstagestartTABLE[#1]}
+
+%D The optional third and fourth arguments define which table
+%D head and tail to use.
+%D
+%D \starttyping
+%D \definetabletemplate[test][|||][before][after]
+%D \stoptyping
+%D
+%D This also means that one can define table heads and tails
+%D by name!
+%D
+%D \starttyping
+%D \starttablehead[before]
+%D \HL \VL first \VL second \VL \SR \HL
+%D \stoptablehead
+%D \stoptyping
+%D
+%D Templates defined this way get protected names, that cannot
+%D conflict with existing commands.
+%D
+%D \showsetup{definetabletemplate}
+%D
+%D The second half of the next macro prepares table
+%D splitting.
+
+\def\insertTABLEhead
+ {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEhead}%
+ \TABLEhead
+ \TABLEnoalign{\global\setfalse\preventTABLEbreak}}
+
+\def\insertTABLEtail
+ {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEtail}%
+ \TABLEtail
+ \TABLEnoalign{\global\setfalse\preventTABLEbreak}}
+
+% \def\dorestartTABLE#1%
+% {\gdef\restartTABLE{#1}%
+% \restartTABLE
+% \insertTABLEhead
+% \ifsplittables \ifconditional \tablerepeattail
+% \TABLEnoalign{\goodbreak}%
+% \insertTABLEtail
+% \TABLEnoalign{\goodbreak}%
+% \fi \fi}
+
+\def\verysimpleTableHL
+ {\TABLEnoalign{\expandafter\normalTABLEfullrule\@@tiHLheight}}
+
+\def\dorestartTABLE#1%
+ {\gdef\restartTABLE{#1}%
+ \restartTABLE
+ \TABLEnoalign{\globalpushmacro\simpleTableHL\global\let\simpleTableHL\verysimpleTableHL}%
+ \insertTABLEhead
+ \ifsplittables \ifconditional \tablerepeattail
+ \TABLEnoalign{\goodbreak}%
+ \insertTABLEtail
+ \TABLEnoalign{\goodbreak}%
+ \fi \fi
+ \TABLEnoalign{\globalpopmacro\simpleTableHL}}
+
+\bgroup \catcode`|=\@@other \catcode`"=\@@other
+
+\gdef\complexsecondstagestartTABLE#1[#2]% brr nested mess
+ {\bgroup
+ \@@useotherbar
+ \@@useotherquote
+ \global\setfalse\someTABLEhead
+ \global\setfalse\someTABLEtail
+ \expanded{\doifinstringelse{|}{#2}}
+ {\xdef\restartTABLE{\noexpand\dorestartTABLE{\noexpand\thirdstagestartTABLE{#2}}}}
+ {\doifdefinedelse{\c!Table#2}
+ {\gdef\restartTABLE{\getvalue{\c!Table#2}}}
+ {\gdef\restartTABLE{\dorestartTABLE{\getvalue{#2}}}}}%
+ \egroup
+ \restartTABLE}
+
+\egroup
+
+%D The third stage involves a lot of (re)sets, which we will
+%D explain later.
+
+%D The next definition is convenient and more in tune with
+%D \CONTEXT.
+
+\let \everytable \EveryTable
+
+%D We immediately use this register:
+
+\appendtoks
+ \fixedspaces
+ \let\_\normalunderscore
+\to \everytable
+
+%D Now we can start the table.
+
+\def\thirdstagestartTABLE#1%
+ {\global\setTABLEactiontrue
+ \setTABLEaction\TABLEunknown
+ \setTABLEforce\TABLEunknown
+ \setTABLEerror\TABLEunknown
+ \global\TABLEgraylinefalse
+ \global\TABLEgraydonefalse
+ \globalletempty\TABLEgrayline
+ \globalletempty\nextTABLEgrayline
+ \globalletempty\TABLEgraylineerror
+ \globalletempty\TABLEgraylinestatus
+ \resetVLvalues
+ \appendtoks\popouterbarandquote\to\EveryTable
+ \appendtoks\localTABLEsetup\to\EveryTable
+ \BeginTable[\ifsplittables u\else b\fi]%
+ \defineTABLEunits
+ \defineTABLEsteps
+ \defineTABLErules
+ \defineTABLEdivisions
+ \defineTABLEshorthands
+ \defineTABLEbackgrounds
+ \defineTABLEendings
+ \forgetall % added
+ \doifsomething{#1}
+ {\def\TABLEformat{#1}%
+ \getTABLEnofcolumns\TABLEformat
+ % more modern is to use catcode tables
+ \expandafter\BeginFormat\TABLEformat\EndFormat}}
+
+\def\finishTABLE
+ {\chuckTABLEautorow
+ \unskip\crcr
+ \EndTable
+ \global\intablefalse
+ \egroup}
+
+%D \macros
+%D {starttables}
+%D
+%D Split tables are specified using the plural form of the
+%D start and stop commands.
+%D
+%D \showsetup{starttables}
+%D
+%D For example:
+%D
+%D \starttyping
+%D \starttables[|||]
+%D \HL
+%D \VL element \VL atom weight \VL\AR
+%D \HL
+%D \VL ....... \VL ........... \VL\AR
+%D \VL ....... \VL ........... \VL\AR
+%D \HL
+%D \stoptables
+%D \stoptyping
+
+\newbox\tablecontentbox
+
+\def\starttables
+ {\bgroup
+ \splittablestrue
+ \doifelse\@@tisplit\v!repeat
+ {\settrue \tablerepeathead\settrue \tablerepeattail}
+ {\setfalse\tablerepeathead\setfalse\tablerepeattail}%
+ \flushnotes
+ \setbox\tablecontentbox\vbox\bgroup
+ \forgetall
+ \global\TABLEinbreakfalse
+ \firststagestartTABLE}
+
+% \def\stoptables
+% {\ifconditional\tablerepeattail\else\insertTABLEtail\fi
+% \finishTABLE
+% \egroup
+% \dosplittablebox\tablecontentbox
+% \flushnotes
+% \egroup}
+
+\def\stoptables
+ {\chuckTABLEautorow % AM: before the tail, else noalign problem
+ \ifconditional\tablerepeattail\else\insertTABLEtail\fi
+ \finishTABLE
+ \egroup
+\dontcomplain
+ \dosplittablebox\tablecontentbox
+ \flushnotes
+ \egroup}
+
+\newdimen\TABLEcaptionheight % obsolete
+
+\def\dosplittablebox#1%
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{\TABLEcaptionheight}%
+ \setbox\tsplitcontent\box#1%
+ \ifconditional\tablerepeathead \ifconditional\someTABLEhead
+ \setbox\tsplithead\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvbox\tsplithead}%
+ \fi \fi
+ \ifconditional\tablerepeattail \ifconditional\someTABLEtail
+ \setbox\tsplittail\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplittail\vbox{\unvbox\tsplittail}%
+ \fi \fi
+ \ifinsidefloat\else
+ \def\tsplitbeforeresult{\startbaselinecorrection}%
+ \def\tsplitafterresult {\stopbaselinecorrection}%
+ \fi
+ \handletsplit}
+
+%D When the table in the previous example is split across
+%D pages, only the first gets a head. We could have said
+%D something like:
+%D
+%D \starttyping
+%D \starttablekop
+%D \HL
+%D \VL element \VL atom weight \VL\AR
+%D \HL
+%D \stoptablekop
+%D
+%D \starttablestaart
+%D \HL
+%D \stoptablestaart
+%D
+%D \starttables[|||]
+%D \VL ....... \VL ........... \VL\AR
+%D \VL ....... \VL ........... \VL\AR
+%D \stoptables
+%D \stoptyping
+%D
+%D This time each split table gets a head line and ends with
+%D a rule. Keep in mind that such heads also apply to the
+%D unbroken ones and should be defined local (grouped) if
+%D needed. The rather complicated definition below is due to
+%D the fact that the stopcondition is interface language
+%D dependant.
+
+\let\@@TABLEhead\empty \def\TABLEhead{\@@TABLEhead}
+\let\@@TABLEtail\empty \def\TABLEtail{\@@TABLEtail}
+
+\letvalue{\e!start\v!tablehead}=\undefined
+\letvalue{\e!stop \v!tablehead}=\undefined
+\letvalue{\e!start\v!tabletail}=\undefined
+\letvalue{\e!stop \v!tabletail}=\undefined
+
+\expanded
+ {\def\csname\e!start\v!tablehead\endcsname##1\csname\e!stop\v!tablehead\endcsname%
+ {\noexpand\setTABLEhead##1\noexpand\end}}
+
+\expanded
+ {\def\csname\e!start\v!tabletail\endcsname##1\csname\e!stop\v!tabletail\endcsname%
+ {\noexpand\setTABLEtail##1\noexpand\end}}
+
+%D The second argument is a dummy one, by scanning for it, we
+%D get rid of interfering spaces.
+
+\def\setTABLEhead{\dodoubleempty\dosetTABLEhead}
+\def\setTABLEtail{\dodoubleempty\dosetTABLEtail}
+
+\newconditional\preventTABLEbreak
+\newconditional\someTABLEhead
+
+\def\dosetTABLEhead[#1][#2]#3\end{\setvalue{@@TABLEhead#1}{\TABLEnoalign{\global\settrue\someTABLEhead}#3}}
+\def\dosetTABLEtail[#1][#2]#3\end{\setvalue{@@TABLEtail#1}{\TABLEnoalign{\global\settrue\someTABLEtail}#3}}
+
+%D Redudant \type{\HL}'s are removed automatically, so
+%D mid||lines can be used without problems.
+
+%D We need an alternative for the normal complex or simple
+%D commands, because assignments in these system commands
+%D conflict with \type{\noalign}. This alternative is about
+%D as efficient as possible.
+
+\def\complexorsimpleTable#1#2%
+ {\csname\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#1\endcsname#2}
+
+%D The next one is used in \type{\VL} cum suis and honours
+%D the next grouping.
+
+\def\docomplexorsimpleTable#1#2%
+ {\ifx\next\bgroup\@EA#2\else\@EA\dodocomplexorsimpleTable\@EA#1\@EA#2\fi}
+
+\def\dodocomplexorsimpleTable#1#2#3%
+ {\if[\noexpand#3\@EA#1\else\@EA#2\fi#3}
+
+%D The order of the next macros is more or less random. First
+%D we implement error recovery. Errors are reported to the
+%D screen and log file as well as visualized in the table in
+%D teletype.
+
+\def\handleTABLEerror
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEerror=\TABLEunknown \else
+ \setTABLEaction\TABLEunknown
+ \globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \fi
+ \ifcase\TABLEerror
+ % no error
+ \or
+ % \TABLEmissingrow
+ \tttf [missing row]%
+ \writestatus\m!TABLE{missing row}%
+ \SR
+ \or
+ % \TABLEmissingcolumn
+ \fillTABLEcolumns
+ \tttf [missing column]%
+ \writestatus\m!TABLE{missing column}%
+ \SR
+ \or
+ % \TABLEspanoverflow
+ \fillTABLEcolumns
+ \tttf [columnspan too large]%
+ \writestatus\m!TABLE{columnspan too large}%
+ \SR
+ \or
+ % \TABLEdivisionoverflow
+ \fillTABLEcolumns
+ \tttf [division line too long]%
+ \writestatus\m!TABLE{division line too long}%
+ \SR
+ \fi
+ \fi
+ \ifnum\TABLEerror=\TABLEunknown \else
+ \finishTABLErow
+ \fi}
+
+\def\finishTABLErow
+ {\crcr
+ \TABLEnoalign
+ {\nobreak
+ \setTABLEaction\TABLEunknown
+ \setTABLEerror\TABLEunknown
+ \globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \global\currentTABLEcolumn\zerocount}}
+
+\def\fillTABLEcolumns
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \else
+ \global\advance\currentTABLEcolumn \plusone
+ \normalTABLEquote
+ \expandafter\fillTABLEcolumns
+ \fi}
+
+%D Next we enter the more complicated area of column and row
+%D switching. I won't go into much detail from now on, but just
+%D mention the general principles.
+%D
+%D \startitemize[3*ruim]
+%D \sym{\type{\SR}} end a separate row (between rules)
+%D \sym{\type{\FR}} end a first row (after a rule)
+%D \sym{\type{\MR}} end a mid row (between text lines)
+%D \sym{\type{\LR}} end a last row (before a rule)
+%D \stopitemize
+%D
+%D and best of all:
+%D
+%D \startitemize[continue]
+%D \sym{\type{\AR}} end a row with automatic spacing
+%D \stopitemize
+%D
+%D As far as possible, we report confusing situations. In
+%D most cases one can use \type{\AR}, which transfigurates
+%D itself into one of the other types.
+%D
+%D \starttyping
+%D \starttable[||]
+%D \HL
+%D \VL a separate row \VL\SR
+%D \HL
+%D \VL a first row \VL\FR
+%D \VL a mid row \VL\MR
+%D \VL a last row \VL\LR
+%D \HL
+%D \stoptable
+%D \stoptyping
+%D
+%D In this example we could have used \type{\AR} without
+%D problems.
+%D
+%D Color or gray scale backgrounds precede the content. They
+%D are passed over horizontal (division) lines when needed.
+%D Errors in the color template are traced elsewhere. Here we
+%D only check for inconsistent spacing. Due to the way \TEX\
+%D handles alignments, we cannot automate spacing for colored
+%D rows and columns.
+
+\chardef\TABLErowzero=0
+
+\def\checkTABLErow#1% pure for message purposes
+ {\unskip % added
+ \ifTABLEgraydone
+ \defconvertedargument\asciia{#1}%
+ \defconvertedcommand \asciib\TABLEendBCL
+ \ifx\asciia\asciib \else
+ \writestatus\m!TABLE{confusing \asciia\space and \asciib}%
+ \gdef\TABLEgraylineerror%
+ {\globalletempty\TABLEgraylineerror
+ [\asciia\unskip<->\asciib\unskip]}%
+ \fi
+ \global\TABLEgraydonefalse
+ \fi}
+
+\def\defineTABLEendings
+ {\let\SR\TableSR
+ \let\FR\TableFR
+ \let\MR\TableMR
+ \let\LR\TableLR
+ \let\AR\TableAR}
+
+\def\TableSR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \fi\fi\fi
+ \fi
+ \checkTABLErow\SR
+ \endTABLErow\TABLEseparaterow\TABLErowfactor\TABLErowfactor}
+
+\def\TableFR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLElastrow
+ \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
+ \fi\fi
+ \fi
+ \checkTABLErow\FR
+ \endTABLErow\TABLEfirstrow\TABLErowfactor\TABLErowzero}
+
+\def\TableMR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{change \string\MR\space into \string\FR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLElastrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\FR}%
+ \fi\fi
+ \fi
+ \checkTABLErow\MR
+ \endTABLErow\TABLEmidrow00}
+
+\def\TableLR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{change \string\LR\space into \string\FR/\string\SR}%
+ \fi
+ \fi
+ \checkTABLErow\LR
+ \endTABLErow\TABLElastrow\TABLErowzero\TABLErowfactor}
+
+%D \macros
+%D {ifcheckTABLEcolums}
+%D
+%D
+%D The next macros handle the actual row ending. This macro
+%D also take care of space corrections due to table splitting
+%D when \type{\MR} and collegues are used. When tracing is
+%D enabled, the corrections as well as the values used to
+%D determine the available space are shown (in color). By default
+%D checking is off.
+
+\newif\ifcheckTABLEcolumns
+
+\let\beforeTABLEline\empty
+\let\afterTABLEline \empty
+
+\def\doendTABLErow#1#2#3%
+ {\handleTABLEbreak#2#3%
+ \beforeTABLEline
+ \ifcase#1\relax
+ % unknown
+ \or
+ \endofTABLEline[blue][\SR->\SR]\TABLErowfactor\TABLErowfactor
+ \or
+ \endofTABLEline[red][\FR->\FR]\TABLErowfactor\TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \endofTABLEline[red][\MR->\LR]\TABLErowzero\TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \endofTABLEline[red][\MR->\FR]\TABLErowfactor\TABLErowzero
+ \else
+ \endofTABLEline[green][\MR->\MR]\TABLErowzero\TABLErowzero
+ \fi\fi
+ \or
+ \endofTABLEline[red][\LR->\LR]\TABLErowzero\TABLErowfactor
+ \fi
+ \TABLEnoalign
+ {\setTABLEforce\TABLEunknown
+ \global\currentTABLEcolumn\zerocount}%
+ \afterTABLEline}
+
+\def\endTABLErow#1#2#3%
+ {\setTABLEaction#1%
+ \ifTABLEgrayline
+ \finishTABLErow
+ \else
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \doendTABLErow{#1}{#2}{#3}%
+ \else\ifcheckTABLEcolumns
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \else
+ \doendTABLErow{#1}{#2}{#3}%
+ \fi\fi
+ \fi}
+
+%D Handling \type{\AR} is postponed till the next row. The
+%D check takes care of the first and mid rows, the chuck macro
+%D |<|how about that name|>| handles the last row.
+
+\def\TableAR
+ {\ifTABLEgraydone
+ \globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \global\TABLEgraydonefalse
+ \TABLEendBCL
+ \else
+ \globallet\checkTABLEautorow\docheckTABLEautorow
+ \globallet\chuckTABLEautorow\dochuckTABLEautorow
+ \fi}
+
+\let\checkTABLEautorow\empty
+\let\chuckTABLEautorow\empty
+
+\def\docheckTABLEautorow
+ {\globallet\checkTABLEautorow\empty
+ \ifnum\TABLEaction=\TABLErule \FR
+ \else\ifnum\TABLEaction=\TABLEunknown \FR
+ \else \MR
+ \fi\fi}
+
+\def\dochuckTABLEautorow
+ {\globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \ifnum\TABLEaction=\TABLErule \SR
+ \else\ifnum\TABLEaction=\TABLEunknown \SR
+ \else \LR
+ \fi\fi}
+
+%D When a table is split, we also add a tail and when present
+%D we repeat the table head.
+
+\def\handleTABLEbreak#1#2%
+ {\globalletempty\beforeTABLEline
+ \gdef\afterTABLEline{\TABLEnoalign{\ifconditional\preventTABLEbreak\nobreak\else\goodbreak\fi}}}
+
+%D When tables are split, the spacing before and after a
+%D horizontal rule is corrected according to what we expect.
+
+\def\endofTABLEline[#1][#2->#3]#4#5%
+ {\ifx#2#3\else
+ \writestatus\m!TABLE{\string#2\space changed into \string#3}%
+ \fi
+ \iftracetables
+ \bgroup
+ \tttf\space
+ \ifnum\TABLEerror=\TABLEunknown
+ \ifx#2#3\else\string#2->\fi
+ \else
+ ->%
+ \fi
+ \color[#1]{\string#3}%
+ \ifx\TABLEgraylineerror\empty
+ \space\TABLEgraylinestatus
+ \else
+ \space\TABLEgraylineerror
+ \fi
+ \egroup
+ \else\ifx\TABLEgraylineerror\empty \else
+ % \bgroup
+ % \tttf\space\TABLEgraylineerror
+ % \egroup
+ \fi\fi
+ \globalletempty\TABLEgraylinestatus
+ \globalletempty\TABLEgraylineerror
+ \expandafter\normalTABLElineformat#4#5\crcr % \crcr nodig ?
+ \TABLEnoalign{\nobreak\global\setTABLEactiontrue}}
+
+%D In order to prevent (as good as possible) alignment overflow
+%D and therefore \TEX\ error messages, we check the maximum
+%D number of columns. We keep track of the current column and
+%D maximum column by means of two \COUNTERS. Keep in mind that
+%D the number of \type{|}'s and \type{\VL}'s or alike is always
+%D one more than the number of columns.
+
+\newcount\currentTABLEcolumn
+\newcount\maxTABLEcolumn
+
+%D While defining this macro we change the \CATCODE\ of
+%D \type{|}. When counting the bars, we use a non active
+%D representation of the bar, simply because we cannot be sure
+%D if the bar is active or not.\footnote{Normally it is, but
+%D \TABLE\ changes the catcode when needed.}
+
+\bgroup
+ \catcode`\|=\@@other \gdef\@@otherbar {|}
+ \catcode`\"=\@@other \gdef\@@otherquote {"}
+ \catcode`\|=\@@active \gdef\@@useotherbar {\let|\@@otherbar}
+ \catcode`\"=\@@active \gdef\@@useotherquote{\let"\@@otherquote}
+\egroup
+
+\bgroup \catcode`\|=\@@other
+
+\gdef\getTABLEnofcolumns#1%
+ {\bgroup
+ \cleanupfeatures % needed !
+ \@@useotherbar
+ \@@useotherquote
+ \expanded{\defconvertedargument\noexpand\ascii{#1}}%
+ \@EA\doglobal\@EA\counttoken\@EA|\@EA\in\ascii\to\maxTABLEcolumn
+ \global\advance\maxTABLEcolumn \minusone
+ % in case of & counting, divide by 2
+ \egroup}
+
+\egroup
+
+\def\!ttDoHalign
+ {\edef\restoretablelineskips
+ {\baselineskip \the\baselineskip
+ \lineskiplimit\the\lineskiplimit
+ \lineskip \the\lineskip
+ \tabskip \the\tabskip}%
+ \baselineskip \zeropoint
+ \lineskiplimit\zeropoint
+ \lineskip \zeropoint
+ \tabskip \zeropoint
+ % does not work in normal tex
+ % \expanded{\getTABLEnofcolumns{\the\!taPreamble}}% added
+ \halign \the\!taTableSpread \bgroup
+ \span\the\!taPreamble
+ \ifx \!tfRowOfWidths \empty \else \!tfRowOfWidths \cr \fi}
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\VL}} a vertical line
+%D \sym{\type{\VC}} a vertical colored line
+%D \sym{\type{\HL}} a horizontal line
+%D \sym{\type{\HC}} a horizontal colored line
+%D \stopitemize
+
+% \def\defineTABLErules
+% {\let\VL\TableVL
+% \let\VC\TableVC
+% \let\HL\TableHL
+% \let\HC\TableHC}
+
+\def\defineTABLErules
+ {\let\VL\TableVL
+ \let\VC\TableVC
+ \let\HL\TableHL
+ \let\HC\TableHC
+ \let\VS\TableVS
+ \let\VD\TableVD
+ \let\VT\TableVT
+ \let\VN\TableVN}
+
+\def\TableVL
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ \expandafter\doTableVL
+ \fi}
+
+\def\doTableVL
+ {\futurelet\next\dodoTableVL}
+
+\def\dodoTableVL
+ {\docomplexorsimpleTable\complexTableVL\simpleTableVL}
+
+\def\complexTableVL[#1]%
+ {\scratchcounter=0#1%
+ \multiply\scratchcounter \@@tiVLwidth
+ \setxvalue{wVL\the\currentTABLEcolumn}{\the\scratchcounter}%
+ \simpleTableVL}
+
+\def\simpleTableVL
+ {\doifundefined{wVL\the\currentTABLEcolumn}%
+ {\setgvalue{wVL\the\currentTABLEcolumn}{\@@tiVLwidth}}%
+ \gdef\TABLEbeforebar
+ {\getvalue{bVL\the\currentTABLEcolumn}%
+ \letgvalueempty{bVL\the\currentTABLEcolumn}}%
+ \gdef\TABLEafterbar
+ {\getvalue{eVL\the\currentTABLEcolumn}%
+ \letgvalueempty{eVL\the\currentTABLEcolumn}}%
+ \edef\@@tiVLwidth{\getvalue{wVL\the\currentTABLEcolumn}}%
+ \expanded{\normalTABLEcomplexbar\@@tiVLwidth\space}}% \relax breaks \use
+
+% \starttable[|||]
+% \HL
+% \VL test \VS test \VL \FR
+% \VL test \VD test \VL \MR
+% \VL test \VT test \VL \LR
+% \HL
+% \stoptable
+
+\def\TableVS {\VN1}
+\def\TableVD {\VN2}
+\def\TableVT {\VN3}
+\def\TableVN#1{\gdef\@VLn{#1}\VL}
+
+\def\resetVLvalues
+ {\dostepwiserecurse\zerocount\maxTABLEcolumn\plusone
+ {\setgvalue{wVL\recurselevel}{\@@tiVLwidth}%
+ \letgvalueempty{bVL\recurselevel}%
+ \letgvalueempty{eVL\recurselevel}}%
+ \global\currentTABLEcolumn\zerocount}
+
+\def\TableVC
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ \expandafter\doTableVC
+ \fi}
+
+\def\doTableVC
+ {\futurelet\next\dodoTableVC}
+
+\def\dodoTableVC
+ {\docomplexorsimpleTable\complexTableVC\simpleTableVC}
+
+\def\complexTableVC[#1]%
+ {\global\setvalue{bVC\the\currentTABLEcolumn}{\localstartcolor[#1]}%
+ \global\setvalue{eVC\the\currentTABLEcolumn}{\localstopcolor}%
+ \simpleTableVC}
+
+\def\simpleTableVC
+ {\global\setvalue{bVL\the\currentTABLEcolumn}%
+ {\getvalue{bVC\the\currentTABLEcolumn}}%
+ \global\setvalue{eVL\the\currentTABLEcolumn}%
+ {\getvalue{eVC\the\currentTABLEcolumn}}%
+ \doTableVL}
+
+\def\TableHL
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \chuckTABLEautorow
+ \else\ifnum\currentTABLEcolumn=\zerocount
+ %\chuckTABLEautorow
+ \TABLEnoalign
+ {\globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow}%
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi\fi
+ \complexorsimpleTable{HL}}
+
+\def\complexTableHL[#1]%
+ {\TABLEnoalign
+ {\scratchcounter0#1%
+ \multiply\scratchcounter \@@tiHLheight
+ \edef\@@tiHLheight{\the\scratchcounter}%
+ \simpleTableHL}}
+
+\def\simpleTableHL
+ {\TABLEnoalign
+ {\nobreak
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{skipping \string\HL}% \statusmessage
+ \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
+ \fi\fi
+ \startHLcommand
+ \expandafter\normalTABLEfullrule\@@tiHLheight
+ \stopHLcommand
+ \globalletempty\startHLcommand
+ \globalletempty\stopHLcommand
+ \accountTABLElinewidth
+ \fi
+ \setTABLEaction\TABLErule
+ \nobreak}}
+
+\let\startHLcommand\empty
+\let\stopHLcommand \empty
+
+\def\TableHC
+ {\complexorsimpleTable{HC}}
+
+\def\complexTableHC[#1]%
+ {\TABLEnoalign
+ {\gdef\startHCcommand{\localstartcolor[#1]}%
+ \gdef\stopHCcommand {\localstopcolor}}%
+ \simpleTableHC}
+
+\def\simpleTableHC
+ {\TABLEnoalign
+ {\globallet\startHLcommand\startHCcommand
+ \globallet\stopHLcommand \stopHCcommand}%
+ \HL}
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\NL}} a vertical skip
+%D \sym{\type{\NR}} goto the next row
+%D \sym{\type{\NC}} goto the next column
+%D \sym{\type{\FC}} a first column
+%D \sym{\type{\MC}} a mid column
+%D \sym{\type{\LC}} a last column
+%D \stopitemize
+
+% n+1 uitleggen
+
+\def\defineTABLEsteps
+ {\let\NL\TableNL
+ \let\NR\TableNR
+ \let\NC\TableNC
+ \let\FC\TableNC
+ \let\MC\TableNC
+ \let\LC\TableNC}
+
+\def\TableNL
+ {\complexorsimpleTable{NL}}
+
+\def\complexTableNL[#1]%
+ {\TABLEnoalign
+ {\edef\@@tiNL{#1}%
+ \simpleTableNL}}%
+
+\def\simpleTableNL
+ {\TABLEnoalign
+ {\nobreak
+ \setbox0\vbox{\blank[\@@tiNL]}%
+ \vskip\ht0
+ \nobreak}}
+
+\def\TableNR
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \global\currentTABLEcolumn\zerocount
+ \normalTABLElineending
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi
+ \TABLEnoalign
+ {\nobreak
+ \setTABLEaction\TABLEunknown}}
+
+\def\TableNC
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ \normalTABLEquote
+ \fi}
+
+% \bgroup
+% \catcode`\|=\@@active
+% \catcode`\"=\@@active
+% \gdef\redefinetablebarandquote
+% {\def|{\VL}% % \normalTABLEsimplebar
+% \def\|##1{\VL[##1]}% % \normalTABLEcomplexbar
+% \def"{\NC}} % \normalTABLEquote
+% \egroup
+
+\let\redefinetablebarandquote\relax
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\DL}}
+%D \sym{\type{\DV}} (\type{\VD})
+%D \sym{\type{\DC}}
+%D \sym{\type{\DR}}
+%D \stopitemize
+
+\newif\ifTABLEdivision
+
+% \def\defineTABLEdivisions
+% {\global\TABLEdivisionfalse % in start
+% \let\DL\TableDL
+% \let\DC\TableDC
+% \let\DV\TableDV
+% \let\VD\TableDV
+% \let\DR\TableDR}
+
+\def\defineTABLEdivisions
+ {\global\TABLEdivisionfalse % in start
+ \let\DL\TableDL
+ \let\DC\TableDC
+ \let\DV\TableDV
+ \let\DR\TableDR}
+
+\def\checkTABLEdivision
+ {\ifTABLEdivision \else
+ \chuckTABLEautorow
+ \global\currentTABLEcolumn\zerocount
+ \global\TABLEdivisiontrue
+ \fi}
+
+\def\TableDL
+ {\checkTABLEdivision
+ \complexorsimpleTable{DL}}
+
+\def\simpleTableDL
+ {\complexTableDL[1]}
+
+\def\complexTableDL[#1]%
+ {\ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{skipping \string\DL}%
+ \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
+ \fi\fi
+ \setTABLEaction=\TABLEunknown
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \fi
+ %\startHLcommand
+ \ifnum#1=\plusone
+ \global\advance\currentTABLEcolumn \plustwo
+ \let\next\normalTABLEsinglerule
+ \else
+ \ifnum#1<\maxTABLEcolumn
+ \global\advance\currentTABLEcolumn \plusone
+ \def\next{\normalTABLEmultirule{#1}}%
+ \else
+ \setTABLEerror\TABLEdivisionoverflow
+ \let\next\handleTABLEerror
+ \fi
+ \fi
+ \next
+ %\stopHLcommand
+ %\globalletempty\startHLcommand
+ %\globalletempty\stopHLcommand
+ \fi}
+
+\def\TableDV
+ {\TableDCV\normalTABLEsimplebar}
+
+\def\TableDC
+ {\TableDCV\normalTABLEquote}
+
+\def\TableDCV#1%
+ {\checkTABLEdivision
+ \checkTABLEautorow
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ #1%
+ \fi}
+
+\def\TableDR
+ {\ifnum\currentTABLEcolumn<\maxTABLEcolumn % silent recovery
+ %\setTABLEerror\TABLEmissingcolumn % some day warning
+ %\handleTABLEerror
+ \finishTABLErow
+ \else
+ \global\currentTABLEcolumn\zerocount % nog check
+ \normalTABLElineending
+ \fi
+ \TABLEnoalign
+ {\nobreak
+ \global\TABLEdivisionfalse
+ \accountTABLElinewidth % temporary solution
+ \setTABLEaction\TABLErule}}
+
+\def\accountTABLElinewidth
+ {\scratchdimen\LineThicknessUnit}
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\BC}}
+%D \sym{\type{\BR}}
+%D \sym{\type{\BACKGROUND}}
+%D \sym{\type{\CL}}
+%D \sym{\type{\RL}}
+%D \sym{\type{\BL}}
+%D \sym{\type{\RASTER}}
+%D \sym{\type{\COLOR}}
+%D \stopitemize
+
+% definieer: \BC \BL
+% herhaal: \BR
+% definieer: \CL \RL (eerste \CL[green] = hele row! / \CL[1,green])
+% dus: \CL en \RL mix tussen \HL en \BL
+
+\def\defineTABLEbackgrounds
+ {\let\BC \TableBC
+ \let\BL \TableBL
+ \let\BR \TableBR
+ \let\BACKGROUND\TableBR
+ \let\CL \TableCL
+ \let\RL \TableRL
+ \let\COLOR \TableCOLOR
+ \let\RASTER \TableRASTER
+ \globallet\lastTABLEc\@@tibackgroundcolor
+ \globallet\lastTABLEr\@@tibackgroundscreen
+ \doifinsetelse\@@tibackground{c,color} % \v!color
+ {\global\chardef\TABLEcr\plusone}
+ {\global\chardef\TABLEcr\plustwo}}
+
+\def\TableBC
+ {\ifTABLEgrayline
+ \normalTABLEquote
+ \else
+ \TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\BC\doTableBC
+ \expandafter\doTableBC
+ \fi}
+
+\def\doTableBC
+ {\addtoTABLEgrayline{\BC}%
+ \gobbleTableBCL}
+
+\def\TableBL
+ {\TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\CL\doTableCL
+ \let\RL\doTableRL
+ \let\BC\doTableBC
+ \doTableBL}
+
+\def\doTableBL
+ {\complexorsimpleTable{BL}}
+
+\def\simpleTableBL
+ {\complexTableBL[,]}
+
+\def\complexTableBL[#1]%
+ {\analyzeTABLEcr[#1]%
+ \handleTABLEcr}
+
+\def\TableBR#1%
+ {\TABLEnoalign
+ {\globallet\nextTABLEgrayline\executeTABLEgrayline
+ \checkTABLEgrayline#1\BR
+ \global\TABLEgraylinetrue}}
+
+\def\analyzeTABLEcr[#1]%
+ {\doanalyzeTABLEcr[#1,,]}
+
+\def\doanalyzeTABLEcr[#1,#2,#3]%
+ {\doifnumberelse{#1x} % Is the x still needed here?
+ {\dodoanalyzeTABLEcr[#1,#2,#3]}
+ {\dodoanalyzeTABLEcr[1,#1,#2]}}
+
+\def\dodoanalyzeTABLEcr[#1,#2,#3]%
+ {\global\chardef\TABLEn#1\relax
+ \processaction
+ [#2]
+ [ c=>\global\chardef\TABLEcr1,%
+ color=>\global\chardef\TABLEcr1,%
+ r=>\global\chardef\TABLEcr2,%
+ raster=>\global\chardef\TABLEcr2]%
+ \ifcase\TABLEcr \or
+ \doifsomething{#3}{\xdef\lastTABLEc{#3}}%
+ \or
+ \doifsomething{#3}{\xdef\lastTABLEr{#3}}%
+ \fi}
+
+\def\handleTABLEcr
+ {\relax % else funny side effect
+ \ifcase\TABLEcr
+ % Can't happen!
+ \or
+ \addtoTABLEgrayline{\complexTableCOLOR[\the\TABLEn,\lastTABLEc]}%
+ \else
+ \addtoTABLEgrayline{\complexTableRASTER[\the\TABLEn,\lastTABLEr]}%
+ \fi
+ \gobbleTableBCL}
+
+\def\analyzeTABLEcrl#1[#2]%
+ {\doanalyzeTABLEcrl#1[#2,,]}
+
+\def\doanalyzeTABLEcrl#1[#2,#3,#4]%
+ {\doifnumberelse{#2x} % x ????????????????????
+ {\dodoanalyzeTABLEcr[#2,#1,#3]}
+ {\dodoanalyzeTABLEcr[\ifTABLEgrayline1\else\maxTABLEcolumn\fi,#1,#2]}}
+
+\def\TableCL
+ {\TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\CL\doTableCL
+ \let\RL\doTableRL
+ \let\BC\doTableBC
+ \doTableCL}
+
+\def\doTableCL
+ {\complexorsimpleTable{CL}}
+
+\def\simpleTableCL% nog eens \'e\'en lijn van maken
+ {\BL[\the\maxTABLEcolumn,c,\lastTABLEc]}
+
+\def\complexTableCL[#1]%
+ {\analyzeTABLEcrl{c}[#1]%
+ \handleTABLEcr}
+
+\def\TableRL
+ {\TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\CL\doTableCL
+ \let\RL\doTableRL
+ \let\BC\doTableBC
+ \doTableRL}
+
+\def\doTableRL
+ {\complexorsimpleTable{RL}}
+
+\def\simpleTableRL
+ {\BL[\the\maxTABLEcolumn,r,\lastTABLEr]}
+
+\def\complexTableRL[#1]%
+ {\analyzeTABLEcrl{r}[#1]%
+ \handleTABLEcr}
+
+\def\checkTABLEgrayline#1#2%
+ {\!!doneatrue
+ \ifx#1\AR
+ \!!doneafalse
+ \else\ifx#1\SR\else\ifx#1\FR\else\ifx#1\MR\else\ifx#1\LR\else
+ \!!doneafalse
+ \fi\fi\fi\fi\fi
+ \if!!donea
+ \gdef\TABLEgraylinestatus
+ {[\string#1]}%
+ \gdef\TABLEendBCL
+ {#1}%
+ \else
+ \gdef\TABLEgraylineerror
+ {[\string#2\string#1->\string#2\string\SR]}%
+ \gdef\TABLEendBCL
+ {\SR}%
+ \fi}
+
+\def\endTABLErowGL#1#2#3%
+ {\ifcase#1\relax
+ % unknown
+ \or
+ \doPreTableGL\TABLErowfactor\TABLErowfactor
+ \or
+ \doPreTableGL\TABLErowfactor\TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \doPreTableGL\TABLErowzero\TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \doPreTableGL\TABLErowfactor\TABLErowzero
+ \else
+ \doPreTableGL\TABLErowzero\TABLErowzero
+ \fi\fi
+ \or
+ \doPreTableGL\TABLErowzero\TABLErowfactor
+ \fi}
+
+\def\doPreTableGL#1#2% betere namen
+ {\xdef\OldLineThicknessFactor{\the\LineThicknessFactor}%
+ \xdef\OldLineThicknessUnit{\the\LineThicknessUnit}%
+ \global\LineThicknessFactor\plusone
+ \setbox0\hbox{\AugmentedTableStrut{#1}{#2}}%
+ \getboxheight\dimen0\of\box0\relax
+ \xdef\TABLEgraylineHeight{\the\dimen0}%
+ \global\LineThicknessUnit\TABLEgraylineHeight}
+
+\def\doPostTableGL
+ {\global\LineThicknessFactor\OldLineThicknessFactor
+ \global\LineThicknessUnit \OldLineThicknessUnit}
+
+% kan simpeler
+
+\def\docomplexTableCOLOR[#1]%
+ {\dodocomplexTableGL\localstartcolor \localstopcolor [#1,\lastTABLEc,,]}
+
+\gdef\docomplexTableRASTER[#1]%
+ {\dodocomplexTableGL\localstartraster\localstopraster[#1,\lastTABLEr,,]}
+
+\def\dodocomplexTableGL#1#2[#3,#4,#5,#6]%
+ {\doifelsenothing{#4}{#1[#5]}{#1[#4]}%
+ \doPreTableGL\TABLEendofrowheight\TABLEendofrowdepth
+ \ifnum#3=\plusone % else conflict with \omit in \=
+ \let\next\normalTABLEsinglerule
+ \else
+ \def\next{\normalTABLEmultirule{#3}}%
+ \fi
+ \next
+ \doPostTableGL
+ #2}
+
+\def\TableBACKGROUND
+ {\TableBR}
+
+\def\simpleTableRASTER #1{\docomplexTableRASTER[1]#1}
+\def\complexTableRASTER[#1]{\docomplexTableRASTER[#1]}
+\def\simpleTableCOLOR {\docomplexTableCOLOR [1]}
+\def\complexTableCOLOR [#1]{\docomplexTableCOLOR [#1]}
+
+\def\TableRASTER{\complexorsimpleTable{RASTER}}
+\def\TableCOLOR {\complexorsimpleTable{COLOR}}
+
+\def\addtoTABLEgrayline#1%
+ {\TABLEgraytoks\expandafter{\TABLEgrayline}%
+ \xdef\TABLEgrayline{\the\TABLEgraytoks\noexpand#1}}
+
+\def\setTableBCL#1#2%
+ {\ifx#1#2%
+ \gdef\TABLEgraylinestatus{[\string#1]}%
+ \gdef\TABLEendBCL{#1}%
+ \addtoTABLEgrayline{#1}%
+ \else
+ \gdef\TABLEgraylineerror{[\string#1->\string#2]}%
+ \gdef\TABLEendBCL{#2}%
+ \addtoTABLEgrayline{#2}%
+ \fi}
+
+\def\gobbleTableBCL#1%
+ {\ifx#1\BC \let\next\doTableBC \else
+ \ifx#1\BL \let\next\doTableBL \else
+ \ifx#1\SR \setTableBCL\SR\SR \let\next\egroup \else
+ \ifx#1\FR \setTableBCL\FR\FR \let\next\egroup \else
+ \ifx#1\MR \setTableBCL\MR\MR \let\next\egroup \else
+ \ifx#1\LR \setTableBCL\LR\LR \let\next\egroup \else
+ \setTableBCL #1\SR \let\next\egroup
+ \fi\fi\fi\fi\fi\fi
+ \next}
+
+\def\executeTABLEgrayline
+ {\TABLEnoalign
+ {\def\BC
+ {\advance\currentTABLEcolumn \plusone}%
+ \def\dodocomplexTableGL##1##2[##3,##4,##5,##6]%
+ {\BC\advance\currentTABLEcolumn ##3 }%
+ \let\endTABLErow\endTABLEgrayrow
+ \currentTABLEcolumn\zerocount
+ \TABLEgrayline\TABLEendBCL % determine n of columns and height
+ \advance\currentTABLEcolumn \minusone
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ % error message too long line
+ \globalletempty\TABLEgrayline
+ \else
+ % \message{n of color columns: \the\currentTABLEcolumn}\wait
+ \global\TABLEgraylinetrue % vanaf hier nog checken
+ \fi
+ \global\currentTABLEcolumn\zerocount}%
+ \unskip\TABLEgrayline\TABLEendBCL
+ \TABLEnoalign
+ {\nobreak
+ \vskip-\TABLEgraylineHeight
+ \nobreak
+ \global\setTABLEactiontrue
+ \global\currentTABLEcolumn\zerocount
+ \globalletempty\nextTABLEgrayline
+ \global\TABLEgraydonetrue
+ \global\TABLEgraylinefalse}}
+
+\def\endTABLEgrayrow#1#2#3%
+ {\ifcase#1\relax
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \or
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \or
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \global\chardef\TABLEendofrowheight\TABLErowzero
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowzero
+ \else
+ \global\chardef\TABLEendofrowheight\TABLErowzero
+ \global\chardef\TABLEendofrowdepth \TABLErowzero
+ \fi\fi
+ \or
+ \global\chardef\TABLEendofrowheight\TABLErowzero
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \fi}
+
+\def\defineTABLEshorthands%
+ {\def\SPAN##1{\use{##1}}%
+ \def\TWO {\use2}%
+ \def\THREE {\use3}%
+ \def\FOUR {\use4}%
+ \def\FIVE {\use5}%
+ \def\SIX {\use6}%
+ \def\REF {\ReFormat}}
+
+\def\defineTABLEunits
+ {\processaction
+ [\@@tidistance]
+ [ \v!none=>\OpenUp00\def\LOW{\Lower6 },
+ \v!small=>\OpenUp00\def\LOW{\Lower6 }, % == baseline
+ \v!medium=>\OpenUp11\def\LOW{\Lower7 },
+ \v!big=>\OpenUp22\def\LOW{\Lower8 }]%
+ \doifelse\@@tidistance\v!none
+ {\chardef\TABLErowfactor\zerocount}
+ {\chardef\TABLErowfactor\plustwo }}
+
+\def\dohandlebar % here ?
+ {\ifmmode
+ \@EA\domathmodebar
+ \else\ifintable
+ \@EAEAEA\domathmodebar
+ \else
+ \@EAEAEA\dotextmodebar
+ \fi\fi}
+
+% De macro's t.b.v. instellingen.
+
+\def\setuptables
+ {\dosingleargument\dosetuptables}
+
+\def\dosetuptables[#1]%
+ {\getparameters[\??ti][#1]%
+ \processaction
+ [\@@tialign]
+ [ \v!right=>\def\TABLEparalignment{\raggedright},
+ \v!left=>\def\TABLEparalignment{\raggedleft},
+ \v!middle=>\def\TABLEparalignment{\raggedcenter},
+ \s!default=>\def\TABLEparalignment{\notragged},
+ \s!unknown=>\def\TABLEparalignment{\notragged}]%
+ \assignalfadimension\@@tiVL\@@tiVLwidth 246%
+ \assignalfadimension\@@tiHL\@@tiHLheight246}
+
+\def\localTABLEsetup
+ {\@@ticommands\relax
+ \expanded{\switchtobodyfont[\@@tibodyfont]}%
+ \StrutHeightFactor 8
+ \StrutDepthFactor 4
+ \LineThicknessFactor4
+ \NormalTLTU {.1pt}%
+ \NormalTSU {\normalbaselineskip\divide\StrutUnit 12 }%
+ \NormalTableUnits}
+
+%D And then I wrote the tabulate environment. That
+%D alternative supports setting the rule thickness and color,
+%D so here is the table alternative.
+
+\let\startglobalTABLEcolor\empty
+\let\stopglobalTABLEcolor \empty
+
+\def\localTABLEsetup
+ {\@@ticommands\relax
+ % bodyfont
+ \expanded{\switchtobodyfont[\@@tibodyfont]}%
+ % linecolor
+ \doifsomething\@@tirulecolor
+ {\def\startglobalTABLEcolor{\localstartcolor[\@@tirulecolor]}%
+ \def\stopglobalTABLEcolor {\localstopcolor}}%
+ % linethickness
+ \LineThicknessFactor4
+ \scratchdimen\@@tirulethickness
+ \divide\scratchdimen \LineThicknessFactor
+ \expanded{\NormalTLTU{\the\scratchdimen}}%
+ % spacing, was depth=4 height=8 (counters, sigh, now macros)
+ \doifelse\@@tiheight\v!strut
+ {\let\StrutHeightFactor\@@itheight}
+ {\let\StrutHeightFactor\@@tiheight}%
+ \doifelse\@@tidepth\v!strut
+ {\let\StrutDepthFactor\@@itdepth}
+ {\let\StrutDepthFactor\@@tidepth}%
+ \scratchdimen\StrutHeightFactor\points \multiply\scratchdimen 10%
+ \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}%
+ \scratchdimen\StrutDepthFactor \points \multiply\scratchdimen 10%
+ \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}%
+ % units
+ \NormalTSU{\normalbaselineskip\divide\StrutUnit 12 }%
+ \NormalTableUnits}
+
+\def\OpenUp#1#2%
+ {\scratchdimen\StrutHeightFactor \points \advance\scratchdimen #1\points
+ \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}%
+ \scratchdimen\StrutDepthFactor \points \advance\scratchdimen #2\points
+ \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}}
+
+%D As one can see, we didn't only add color, but also more
+%D control over spacing.
+%D
+%D \startbuffer[a]
+%D \starttable[|c|]
+%D \HL
+%D \VL \strut test \VL \FR
+%D \VL \strut test \VL \MR
+%D \VL \strut test \VL \MR
+%D \VL \strut test \VL \LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \starttabulate[|c|]
+%D \HL
+%D \NC test \NC \NR
+%D \NC test \NC \NR
+%D \NC test \NC \NR
+%D \NC test \NC \NR
+%D \HL
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D In the next example, the first table is defined as:
+%D
+%D \typebuffer[a]
+%D
+%D and the second one as:
+%D
+%D \typebuffer[b]
+%D
+%D The first table is typeset using the default height and
+%D depth factors .8 and .4. The second table has both factors
+%D set to \type {strut}, and the third table shows what
+%D happens when we set the values to zero. The rightmost table
+%D is typeset using the tabulate environment.
+%D
+%D \startcombination[4*1]
+%D {$\vcenter{\getbuffer[a]}$}
+%D {\hbox{h=.8 d=.4}}
+%D {\setuptables[height=strut,depth=strut]$\vcenter{\getbuffer[a]}$}
+%D {\hbox{h=d=\type{strut}}}
+%D {\setuptables[height=0,depth=0]$\vcenter{\getbuffer[a]}$}
+%D {\hbox{h=d=0}}
+%D {$\vcenter{\getbuffer[b]}$}
+%D {\hbox{tabulate}}
+%D \stopcombination
+
+\setuptables
+ [HL=\v!medium,
+ VL=\v!medium,
+ NL=\v!small,
+ \c!frame=,
+ \c!align=\v!right,
+ \c!depth=.40, % \v!strut
+ \c!height=.80, % \v!strut
+ \c!rulethickness=\linewidth,
+ \c!rulecolor=,
+ \c!distance=\v!medium,
+ \c!bodyfont=\the\bodyfontsize,
+ \c!commands=,
+ \c!background=\v!screen,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=,
+ \c!split=\v!auto]
+
+\def\ifintabel{\ifintable} % upward compatible
+
+\protect \endinput
diff --git a/tex/context/base/tabl-tab.mkiv b/tex/context/base/tabl-tab.mkiv
new file mode 100644
index 000000000..d926dab98
--- /dev/null
+++ b/tex/context/base/tabl-tab.mkiv
@@ -0,0 +1,2516 @@
+%D \module
+%D [ file=core-tab,
+%D version=1997.10.10,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=\TABLE\ Embedding,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / TaBlE Embedding}
+
+% By now it makes more sense to merge the patches into the original
+% and clean that one up too.
+
+% \starttable[|||]
+% \HL
+% \VL test \VS test \VL \FR
+% \VL test \VD test \VL \MR
+% \VL test \VT test \VL \LR
+% \HL
+% \stoptable
+
+% Don't change the splitter:
+%
+% ... \NR
+% \TABLEnoalign{\page}\TABLEhead
+% \NC ...
+
+% e-tex: reverse rows or vadjust or ... in tables
+% \ifalign
+% \xhrule : calls for 'special' with width
+% BUG:
+%
+% \starttable[|l|l|]
+% \HL
+% \RL\FR \VL Head 1 \VL Head 2 \VL\FR
+% \RL\LR \VL Head A \VL Head B \VL\LR % niet grijs ??
+% \HL
+% \VL 1 \VL 2 \VL\FR
+% \VL a \VL b \VL\LR
+% \HL
+% \stoptable
+
+% melden als in kleur conflict, uitgestelde test op \SR\SR
+
+% verengelsen
+% interface
+
+% footnotes flushen
+% \......TABLE........ namen
+% kolommen testen
+% unbreakable kop definieren
+% voetnoten
+% meldingen
+% als direct \use{max} dan fout
+% \BREAKPOINT
+% breedte lijn telt
+% errors: ook gray in handle
+
+% \AR -> als in DL dan \DR
+
+% nieuw:
+%
+% \NL / \NL[blanko] is skip, nog default?
+% geen \HL in a row
+% \HL[n]
+% \VL[n] + remembers
+% c{colorspec} key
+% \HC[color][width]
+% \VC[color]
+% meldingen row, column, use, advise
+% \AR: UITSTELLEN / EXPERIMENTEEL
+
+% WAARDELOZE ERROR HANDLER
+% THIS RENEWED MODULE WORKS OK BUT STILL LOOKS BAD
+
+%D We felt no need to write our own table building macros,
+%D simply because Michael Wichura made a terrific one. This
+%D package is quite complete and well documented. In \CONTEXT\
+%D we provide a shell for consistent spacing as well as color
+%D support. Implementing these features without adapting the
+%D original macros is not trivial. One easilly gets conflicts
+%D with \type{\omit}, \type{\span} and \type{\noalign}, which
+%D means that we end up postponing and overloading macros,
+%D mostly global. Now, let's start with loading the main
+%D macros:
+
+\doifundefined{BeginTable}{\doinputonce{table.tex}}
+
+\unprotect
+
+%D \macros
+%D {inintable, ifsplittables}
+%D
+%D First we declare some variables. These show a bit what we
+%D are dealing with. First we introdoce some booleans that
+%D enable us, inside as well as outside this module, to
+%D determine in what mode we are.
+
+\newif\ifintable
+\newif\ifsplittables
+
+%D \macros
+%D {tracetablestrue}
+%D
+%D When I documented this module, I felt the need for tracing
+%D options. After implementing this feature, I also added
+%D warnings, error recovery and automatic spacing.
+
+\newif\iftracetables
+
+%D We show this feature in an eample that also shows some of
+%D the basic table typesetting commands.
+%D
+%D \startbuffer
+%D \starttable[|||]
+%D \HL
+%D \VL first \VL second \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL\AR
+%D \VL beta \VL 2 \VL\AR
+%D \VL gamma \VL 3 \VL\AR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \startcombination
+%D {\tracetablesfalse\getbuffer} {\type{\tracetablesfalse}}
+%D {\tracetablestrue\getbuffer} {\type{\tracetablestrue}}
+%D \stopcombination
+%D
+%D This table is specified as:
+%D
+%D \typebuffer
+%D
+%D This examples shows about the minimum of commands needed to
+%D typeset such a table. In this table, the \type {\AR} is
+%D automatically translated into the more primitive (but more
+%D verbose) commands \type {\SR}, \type {\FR}, \type {\MR} and
+%D \type {\LR} commands.
+%D
+%D \startbuffer
+%D \starttables[|||]
+%D \HL
+%D \VL first \VL second \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL\AR
+%D \VL beta \VL 2 \VL\AR
+%D \VL gamma \VL 3 \VL\AR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D When we use the split table feature, we get a bit more
+%D information.
+%D
+%D {\tracetablesfalse\getbuffer}
+%D
+%D Sometimes in tables information shows up that is not typed
+%D in by the user. These messages give a cue in what aspect a
+%D table definition is wrong.
+%D
+%D \startbuffer
+%D \starttable[||||]
+%D \HL
+%D \VL first second \VL third \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL a \VL\AR
+%D \VL beta \VL 2 \VL b \VL
+%D \VL gamma \VL \THREE{3} c \VL\AR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Those terrible table has three errors, which all show up in
+%D typeset messages. Errors cannot always recovered 100\% and
+%D therefore can result in two or more succesive messages, like
+%D in the last row.
+%D
+%D \getbuffer
+
+%D Bringing color into tables is complicated by the mere fact
+%D that color is not part of \TEX. The main complication is
+%D that we don't know in advance how wide a column will be. I
+%D implemented color support in tables in the early 90's
+%D because I needed it for some articles on color. I have to
+%D admit that I seldom use the mechanism.
+%D
+%D Most color support in \CONTEXT\ makes use of colored rules.
+%D At first sight, one is tempted to implement colors in tables
+%D in a similar way, but as said, we don't know the dimensions
+%D in advance. It turns out however that we don't have to,
+%D simply because alignments take care of stretching rules to
+%D the appropritate dimensions. This means that we can provide
+%D backgrounds by coloring rules with the height of a row,
+%D skipping upwards and finally drawing the content, like in:
+%D
+%D \gdef\ShowExample
+%D {\startfiguretext
+%D {none}
+%D {\getbuffer}
+%D \typebuffer
+%D \stopfiguretext}
+%D
+%D \startbuffer
+%D \starttable[|c|c|]
+%D \HL
+%D \BL[2] \SR
+%D \VL test \VL test \VL\SR
+%D \HL
+%D \VL test \VL test \VL\FR
+%D \VL test \VL test \VL\MR
+%D \VL test \VL test \VL\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Just to be complete we show how the other columns can be
+%D given a background. Later we will provide more details over
+%D the commands used.
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BL[3] \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BC \BL[2] \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BC \BC \BL \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \HL
+%D \BC \BL \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \BL \BL \SR
+%D \HL
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+
+%D In these examples we can clearly see that for being a real
+%D background, the color or gray specification has to precede
+%D the content. Just to keep things simple, we can recall this
+%D specification later on:
+%D
+%D \startbuffer
+%D \starttable[|c|c|c|]
+%D \BC \BL \SR
+%D \HL
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \BR\FR
+%D \VL test \VL test \VL test \VL\FR
+%D \BR\MR
+%D \VL test \VL test \VL test \VL\MR
+%D \BR\LR
+%D \VL test \VL test \VL test \VL\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Close study learns that we can put the specification
+%D before or after the \type{\HL}, whatever suits best. Keeping
+%D track of these specifications is taken care of by the next
+%D variables:
+
+\newif \ifTABLEgrayline % executing gray line
+\newif \ifTABLEgraydone % gray line executed
+\newtoks \TABLEgraytoks % gray line specification
+
+\newif\ifTABLEinbreak
+
+%D Nog vervangen:
+
+\def\c!Table{Table}
+\def\m!TABLE{TABLE}
+
+%D We already saw that the table macros report errors and
+%D provide automatic spacing. These features can only be
+%D implemented by keeping track of the state, often the last
+%D command on a row.
+
+\chardef\TABLEunknown = 0
+
+\chardef\TABLEseparaterow = 1
+\chardef\TABLEfirstrow = 2
+\chardef\TABLEmidrow = 3
+\chardef\TABLElastrow = 4
+\chardef\TABLErule = 5
+\chardef\TABLEskip = 6
+\chardef\TABLEautorow = 7
+
+\chardef\TABLEforcefirstrow = 1
+\chardef\TABLEforcelastrow = 2
+
+\chardef\TABLEmissingrow = 1
+\chardef\TABLEmissingcolumn = 2
+\chardef\TABLEspanoverflow = 3
+\chardef\TABLEdivisionoverflow = 4
+
+%D We store these states using efficient \type {\chardef}'s.
+%D Like most variables, these are global ones. When needed,
+%D especially when we flush the backgrounds, we can temporary
+%D disable the assignment.
+
+\newif\ifsetTABLEaction
+
+\def\setTABLEaction#1%
+ {\ifsetTABLEaction\global\chardef\TABLEaction#1\fi}
+
+\def\setTABLEforce#1%
+ {\ifsetTABLEaction\global\chardef\TABLEforce#1\fi}
+
+\def\setTABLEerror#1%
+ {\global\chardef\TABLEerror#1}
+
+%D Before we come to using these variables, we redefine and/or
+%D adapt some \TABLE\ macros. Within \TABLE's the \type{|} and
+%D \type{"} have special meanings in templates and are active
+%D during. Their meaning can therefore conflict with those
+%D elsewhere defined. To be compatible with traditional \TABLE\
+%D as well as \CONTEXT's \type{||} and the active \type{"}
+%D extensions for my german friends, we do some catcode magic.
+
+\newif\ifForgetTableBarAndQuote \ForgetTableBarAndQuotetrue
+
+% \bgroup
+
+% \catcode`\|=\@@active
+% \catcode`\"=\@@active
+%
+% \gdef\pushouterbarandquote
+% {\ifForgetTableBarAndQuote
+% \ifnum\catcode`\|=\@@active \let\outertablebar |\else\let\outertablebar \relax\fi
+% \ifnum\catcode`\"=\@@active \let\outertablequote"\else\let\outertablequote\relax\fi
+% \let|\letterbar
+% \let"\letterdoublequote
+% \fi}
+%
+% \gdef\popouterbarandquote
+% {\ifForgetTableBarAndQuote
+% \ifx\outertablebar \relax\else\let|\outertablebar \fi
+% \ifx\outertablequote\relax\else\let"\outertablequote\fi
+% \else
+% \redefinetablebarandquote
+% \fi}
+%
+% \egroup
+%
+% \def\ObeyTableBarAndQuote
+% {\ForgetTableBarAndQuotefalse
+% \ifintable
+% \redefinetablebarandquote
+% \fi}
+
+\let\ActivateBarAndQuote \relax
+\let\ObeyTableBarAndQuote\relax
+\let\pushouterbarandquote\relax
+\let\popouterbarandquote \relax
+
+%D \macros
+%D {ObeyTableBarAndQuote}
+%D
+%D As said, the \type{|} and \type{"} active characters are
+%D often used for other purposes. By default, the outside
+%D meanings are therefore preserved and available inside
+%D tables. If for some reason one wants to use the \TABLE\
+%D primitives, one can say:
+%D
+%D \starttyping
+%D \ObeyTableBarAndQuote
+%D \stoptyping
+%D
+%D To keep things verbose, as well as to show what \TABLE\
+%D commands we affect, we show some meanings.
+
+\def\normalTABLEshortrule {\!ttShortHrule} % \-
+\def\normalTABLElongrule {\!ttLongHrule} % \=
+\def\normalTABLEfullrule {\!ttFullHrule} % \_
+\def\normalTABLEendofrow {\!ttEndOfRow} % \\
+\def\normalTABLEsimplebar {\unskip\!ttRightGlue&&} % |
+\def\normalTABLEcomplexbar {\unskip\!ttRightGlue&\omit\!ttAlternateVrule} % \|
+\def\normalTABLEquote {\unskip\!ttRightGlue&\omit&} % "
+\def\normalTABLElineformat {\normalTABLEendofrow+}
+\def\normalTABLElineending {\normalTABLEendofrow0 }
+\def\normalTABLEsinglerule {&\normalTABLElongrule&}
+\def\normalTABLEmultirule#1{&\use{#1}\normalTABLElongrule&}
+
+%D The next hack is dedicated to Tobias, who found out that
+%D paragraph entries don't break well.
+
+\def\TABLEhack{\hskip\zeropoint}
+
+%D The first attemp to solve this problem was:
+%D
+%D \starttyping
+%D \def\normalTABLEquote%
+%D {\unskip\TABLEhack\!ttRightGlue&\omit&\TABLEhack}
+%D \stoptyping
+%D
+%D But, as usual, this interfered with \type {\omit}.
+%D
+%D The next attempt is redefining some core \TABLE\ macro:.
+%D This works ok, but breaks for instance the~\type{b}
+%D key handling.
+%D
+%D \starttyping
+%D \def\!tfAdjoinPriorColumn%
+%D {\ifnum\!taColumnNumber=0
+%D \!taPreamble=\!taRuleColumnTemplate
+%D ...
+%D \if!taOnceOnlyTabskip
+%D \!thToksEdef\!taDataColumnTemplate=
+%D {\TABLEhack####\TABLEhack\tabskip\the\!taLastRegularTabskip}
+%D \else
+%D \!taDataColumnTemplate{\TABLEhack##\TABLEhack}%
+%D \fi
+%D ...
+%D \ReadFormatKeys}
+%D \stoptyping
+
+% \newdimen\TABLEparheight
+
+\def\BeginTableParBox#1%
+ {\setbox\scratchbox\vtop\bgroup % \setbox added
+ \hsize#1\relax
+ \dontcomplain
+ \restoretablelineskips
+ \normalbaselines
+ \let~\!ttTie
+ \let\-\!ttDH
+ \blank[\v!disable]% % added
+ \the\EveryTableParBox}
+
+\def\EndTableParBox
+ {\removelastskip % itemize or so
+ \endgraf
+ \ifnum\prevgraf>\zerocount % we want at least
+ \verticalstrut \nowhitespace \vskip-\struttotal % one line of text
+ \egroup
+ \ifdim\dp\scratchbox>\lineheight % see (*) for an
+ \getnoflines{\dp\scratchbox}% % example of where
+ \dp\scratchbox\zeropoint % saving can go
+ \setbox\scratchbox % terrible wrong
+ \vtop to \noflines\lineheight{\box\scratchbox}%
+ \fi % esp between rows
+ \else % of paragraphs
+ \egroup
+ \fi
+% \getboxheight\scratchdimen\of\box\scratchbox\relax% compensate for
+% \ifdim\scratchdimen>\TABLEparheight % funny depth of
+% \global\TABLEparheight\scratchdimen % multi-line box
+% \fi % i.e. vtop
+ \box\scratchbox}
+
+% We also need to patch away the interfering math switch:
+
+% \mathpunctuationtrue
+
+% test, test
+% \starttable[|c|]
+% \NC1,,10\NC\AR
+% \stoptable
+% test, test
+
+\def\!ttBeginTableA[#1]{%
+ \if #1u% % "unboxed" table
+ \ifmmode
+ \def\!ttEndTable{% % user had better be in display math mode
+ \relax}% % and have only one table at the outer level
+ \else % user had better be in vertical mode
+ \bgroup
+ \def\!ttEndTable{%
+ \egroup}%
+ \fi
+ \else
+ %\hbox\bgroup $
+ %\def\!ttEndTable{%
+ % \egroup % for the \vtop, \vbox, or \vcenter, yet to come
+ % $% for math mode
+ % \egroup}% for the \hbox
+ %\if #1t%
+ % \vtop
+ %\else
+ % \if #1b%
+ % \vbox
+ % \else
+ % \vcenter % math mode was essential for this
+ % \fi
+ %\fi
+ %
+ \hbox\bgroup
+ \def\!ttEndTable{\egroup\egroup}%
+ \if#1t%
+ \vtop
+ \else\if#1b%
+ \vbox
+ \else
+ \def\!ttEndTable{\egroup$\egroup}%
+ %$\vcenter
+ \scratchtoks\everymath\everymath\emptytoks$\everymath\scratchtoks\vcenter
+ \fi\fi
+ %
+ \bgroup % for the \vtop, \vbox, or \vcenter
+ \fi
+ \advance\!taRecursionLevel 1 % RecursionLevel governs initialization
+ \let\!ttRightGlue=\relax % This may be changed by \JustCenter, etc
+ \everycr\emptytoks % ={}
+ \ifnum \!taRecursionLevel=1
+ \!ttInitializeTable
+ \fi}
+
+%D The next redefinition is more robust than the original:
+
+\def\SetTableToWidth#1%
+ {\doifelsenothing{#1}{\!taTableSpread\emptytoks}{\!taTableSpread{to #1}}}
+
+% (*) Try this one with \type {direction} and {girection};
+% the \PPCHTEX\ manual is a nice testcase.
+%
+% \startoverlay
+% {\starttable[ | l w(2cm) | w(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR
+% \HL
+% \stoptable}
+% {\starttable[ | l w(2cm) | p(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR
+% \HL
+% \stoptable}
+% \stopoverlay
+% \vskip2cm
+% \starttable[ | l w(2cm) | p(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR
+% \HL
+% \stoptable
+% \vskip2cm
+% \starttable[ | l w(2cm) | p(8cm) | ]
+% \HL
+% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \FR
+% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR
+% \HL
+% \stoptable
+
+%D To give an impression of what the (well documented) source
+%D of \TABLE\ looks like, we first implement an alternative for
+%D the numeric keys. The quantity keys (\type{q} and \type{Q})
+%D support the more european way of writing numbers:
+%D
+%D \startnarrower
+%D 100.000.000,00 instead of 100,000,000.00
+%D \stopnarrower
+%D
+%D The next table shows how to use these keys. We use braces
+%D instead of brackets because we need brackets to specify the
+%D format.
+%D
+%D \startbuffer
+%D \starttable{|q[00,000]|Q[00,00]|}
+%D \HL
+%D \VL -1,2 \VL 12,35 \VL\FR
+%D \VL 11,203 \VL 2,4 \VL\LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Although a more efficient implementation is possible |<|we
+%D can for instance share common macros|>| we just adapt a copy
+%D of the numeric ones. To permit double loading of this
+%D module, we check for the existence of one of the macros.
+
+\letvalue{!tk<\string q>}=\undefined
+\letvalue{!tk<\string Q>}=\undefined
+
+%D We just copy the original {\em comments}.
+%D
+%D \em Key \type{q}: quantity item, non||math mode.
+
+\NewFormatKey q%
+ {\letempty\!tqStyle
+ \futurelet\!tnext\!tqTestForBracket}
+
+%D \em Key \type{Q}: quantity item, math mode.
+
+\NewFormatKey Q%
+ {\def\!tqStyle{$}%
+ \futurelet\!tnext\!tqTestForBracket}
+
+%D \em Note: the space between a quantity entry and the
+%D following \type{|}, \type{"}, or \type{\|} is mandatory.
+%D empty quantity entries are not allowed: use \type{{}} or
+%D \type{\omit} instead.
+%D
+%D \em Test for bracket: invoked by the keys \type{q} and
+%D \type{Q}.
+
+\def\!tqTestForBracket
+ {\ifx[\!tnext
+ \!thx\!tqGetArgument
+ \else
+ \!thx\!tqGetCode
+ \fi}
+
+%D \em Get code: e.g. \type{4}, or \type{4,0}, \type{0,4}, or
+%D \type{10,2}.
+
+\def\!tqGetCode#1 % note the blank
+ {\!tqConvertCode #1,,!}
+
+%D \em Convert code: e.g. converts above to \type{[0000]},
+%D \type{[0000,]}, \type{[,0000]}, \type{[0000000000,00]}.
+
+\def\!tqConvertCode #1,#2,#3!%
+ {\begingroup
+ \aftergroup\edef
+ \aftergroup\!ttemp
+ \aftergroup{%
+ \aftergroup[%
+ \!taCountA #1
+ \!thLoop
+ \ifnum \!taCountA>\zerocount
+ \advance\!taCountA \minusone
+ \aftergroup0
+ \repeat
+ \def\!ttemp{#3}%
+ \ifx\!ttemp\empty
+ \else
+ \aftergroup,
+ \!taCountA #2
+ \!thLoop
+ \ifnum\!taCountA>\zerocount
+ \advance\!taCountA \minusone
+ \aftergroup0
+ \repeat
+ \fi
+ \aftergroup]\aftergroup}%
+ \endgroup\relax
+ \!thx\!tqGetArgument\!ttemp}
+
+%D \em Get argument:
+%D
+%D \starttyping
+%D <sample left field> <optional, sample right field>
+%D \stoptyping
+
+\def\!tqGetArgument[#1]%
+ {\!tqMakeQuantityTemplate\!tqStyle#1,,!}
+
+%D \em Make quantity template.
+
+\def\!tqMakeQuantityTemplate#1#2,#3,#4!% #1=<empty> or $
+ {\def\!ttemp{#4}%
+ \ifx\!ttemp\empty
+ \!taDimenC\zeropoint
+ \else
+ \setbox0\hbox{\mathsurround\zeropoint #1,#3#1}%
+ \!taDimenC\wd0
+ \fi
+ \setbox0\hbox{\mathsurround\zeropoint #1#2#1}%
+ \!thToksEdef\!taDataColumnTemplate
+ ={\noexpand\!tqSetQuantityItem{\the\wd0 }{\the\!taDimenC}{#1}%
+ \the\!taDataColumnTemplate}%
+ \ReadFormatKeys}
+
+%D \em Set numeric item.
+
+\def\!tqSetQuantityItem #1#2#3#4 %
+ {\!tqSetQuantityItemA{#1}{#2}{#3}#4,,!}
+
+\def\!tqSetQuantityItemA #1#2#3#4,#5,#6!%
+ {\def\!ttemp{#6}%
+ \hbox to #1{\hss\mathsurround\zeropoint#3#4#3}%
+ \hbox to #2{\ifx\!ttemp\empty\else\mathsurround\zeropoint#3,#5#3\fi\hss}}
+
+%D Here ends the Q||extension. Did you watch the clever use
+%D of aftergroup in \type{\!tqConvertCode}.
+
+% %D We also (have to) define a key for \type{\cap}:
+%
+% \letvalue{!tk<\string K>}=\undefined
+%
+% \NewFormatKey K%
+% {\ReadFormatKeys b\smallcapped}
+
+%D A few pages back we saw backgrounds, further on we will see
+%D colored rules, and here we provide a means to color the
+%D entries in a column. (We can of course always use the normal
+%D color commands for individual entries.) We could not use the
+%D lowercase~\type{c}, because that one is used to force {\em
+%D centering}.
+%D
+%D \startbuffer
+%D \starttable[|C{red}|C{green}|C{blue}|]
+%D \VL R(ed) \VL G(reen) \VL B(lue) \VL\SR
+%D \stoptable
+%D \stopbuffer
+%D
+%D \ShowExample
+
+\letvalue{!tk<\string C>}=\undefined
+
+\NewFormatKey C#1%
+ {\ReadFormatKeys b{\startcolor[#1]} a{\stopcolor}}
+
+%D So now we have three new keys:
+%D
+%D \starttable[|||]
+%D \HL
+%D \NC \bf key \NC \bf meaning \NC\AR
+%D \HL
+%D \NC Q[x,y] \NC math mode formatted numbers \NC\AR
+%D \NC q[x,y] \NC text mode formatted numbers \NC\AR
+%D \NC C{identifier} \NC column entry color \NC\AR
+%D \HL
+%D \stoptable
+
+%D To be compatible with the tabulate environment, we also
+%D support the \type {l}, \type {c} and \type {r} keys for
+%D paragraph entries.
+
+\letvalue{!tk<\string l>}=\undefined
+\letvalue{!tk<\string c>}=\undefined
+\letvalue{!tk<\string r>}=\undefined
+\letvalue{!tk<\string x>}=\undefined % not that needed
+
+\NewFormatKey c%
+ {\prependtoks\raggedcenter\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\hfil \RightGlue\hfil}
+
+\NewFormatKey l%
+ {\prependtoks\raggedright\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\empty \RightGlue\hfil}
+
+\NewFormatKey r%
+ {\prependtoks\raggedleft\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty}
+
+\NewFormatKey x%
+ {\prependtoks\notragged\to\!taDataColumnTemplate
+ \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty}
+
+\appendtoks \TABLEparalignment \to \EveryTableParBox
+
+\def\!tfReFormat#1%
+ {\the \!taLeftGlue
+ \vbox{\forgetall\ialign{\span\the\!taDataColumnTemplate\cr#1\cr}}%
+ \the \!taRightGlue
+ \kern\zeropoint} % prevents \unskip / really needed
+
+%D Later on, we're going to implement multiple page table
+%D support, therefore the next \TABLE\ macro needs to be
+%D slightly adapted, i.c. the penalty is removed. We also
+%D add basic color support.
+
+\def\!ttFullHruleA
+ {\!ttGetHalfRuleThickness
+ \startglobalTABLEcolor % added
+ \hrule\!thHeight\dimen0\!thDepth\dimen0
+ \stopglobalTABLEcolor % added
+ %\penalty0 % removed
+ \egroup}
+
+%D We'll see that when we want to give a vertical rule a color,
+%D we have to set and reset states. After heavy testing it
+%D proved most useful to extend a \TABLE\ primitive with some
+%D hooks. One thing to keep in mind is that \type{&} keeps
+%D assignments local. Again, we add basic color support.
+
+\let\TABLEbeforebar\empty
+\let\TABLEafterbar \empty
+
+\def\@VLn{1}
+\def\@VLd{.125em}
+
+\def\do!ttInsertVrule % will be merged in 2005
+ {\vrule \!thWidth
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \LineThicknessFactor
+ \else
+ \!tgValue
+ \fi
+ \LineThicknessUnit
+ \else
+ \!tgValue
+ \fi
+ \hskip\@VLd}
+
+\def\!ttInsertVrule
+ {\hfil
+ \TABLEbeforebar % added
+ \startglobalTABLEcolor % added
+ % we could do without this speedup, some day merge 'm
+ \ifcase\@VLn\or
+ \do!ttInsertVrule
+ \unskip
+ \else
+ \dorecurse\@VLn\do!ttInsertVrule
+ \gdef\@VLn{1}%
+ \unskip
+ \fi
+ \stopglobalTABLEcolor % added
+ \TABLEafterbar % added
+ \hfil
+ &}
+
+%D The next two macros are only adapted to basis rule
+%D color support.
+
+\def\!tfSetVrule
+ {\!thToksEdef\!taRuleColumnTemplate=
+ {\noexpand\hfil
+ \noexpand\startglobalTABLEcolor % added
+ \noexpand\vrule
+ \noexpand\!thWidth
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \the\LineThicknessFactor
+ \else
+ \!tgValue
+ \fi
+ \!taLTU
+ \else
+ \!tgValue
+ \fi
+ ####%
+ \noexpand\hfil
+ \noexpand\stopglobalTABLEcolor % added
+ \the\!taRuleColumnTemplate}%
+ \!tfAdjoinPriorColumn}
+
+\def\!ttShortHruleA
+ {\!ttGetHalfRuleThickness
+ \startglobalTABLEcolor % added
+ \leaders\hrule\!thHeight\dimen0\!thDepth\dimen0\hfill
+ \stopglobalTABLEcolor % added
+ \null
+ \ignorespaces}
+
+%D We already showed the next one, but here we slightly adapt
+%D the macro by adding an \type{\expandafter}. The space after
+%D \type{#1} is crucial!
+
+\def\normalTABLEcomplexbar#1%
+ {\unskip\!ttRightGlue&\omit\expandafter\!ttAlternateVrule#1 }
+
+%D To get rid of interfering \type{\omit}'s when we are
+%D checking the number of columns and reporting problems. The
+%D extensions concern the second level check, the first
+%D subbranch and advancing the column.
+
+\ifx\mscount\undefined \newcount\mscount \fi
+
+\def\!ttuse#1%
+ {\ifnum#1>\plusone
+ \omit
+ \global\TABLEdivisionfalse
+ \scratchcounter\currentTABLEcolumn % added
+ \advance\scratchcounter #1% % added
+ \advance\scratchcounter \minusone % added
+ \ifnum\scratchcounter>\maxTABLEcolumn % added
+ \def\next % added
+ {\setTABLEerror\TABLEspanoverflow % added
+ \handleTABLEerror}% % added
+ \else % added
+ \def\next % added
+ {\global\advance\currentTABLEcolumn #1% % added
+ \global\advance\currentTABLEcolumn \minusone % added
+ \mscount#1% \mscount is in Plain
+ \advance\mscount \minusone
+ \advance\mscount \mscount
+ \!thLoop
+ \ifnum\mscount>\plusone
+ \spanomit \advance\mscount\minusone
+ \repeat
+ \span}%
+ \fi % added
+ \else % added
+ \def\next % conflicts with possible next \omit % added
+ {\global\advance\currentTABLEcolumn \plusone}% % added
+ \fi
+ \next} % added
+
+% \starttable[|c|c|c|c|]
+% \HL
+% \VL {test} \VL \TWO{} \VL test \VL\FR
+% \DL \DC \DL\DR
+% \VL {test} \VL \TWO{} \VL test \VL\LR
+% \HL
+% \stoptable
+
+%D All commands that are executed between rows are to be put in
+%D \type {\noalign}. We can however not verify if we (that is
+%D \TABLE) does or did not enter this mode. A moderate dirty
+%D but useful trick is using our own alternative:\footnote{Once
+%D one has entered the stage of redefining \TEX\ primitives,
+%D such hacks become a second nature. However, redefining \type
+%D {\omit} and \type{\span} is not that easy.}
+
+\def\TABLEnoalign
+ {\noalign\bgroup\let\noalign\relax\let\next=}
+
+%D \macros
+%D {starttable}
+%D
+%D The rest of this module is not easy to comprehend, mainly
+%D because we have to take care of:
+%D
+%D \startitemize[packed]
+%D \item \type{\startitemize[template]}
+%D \item \type{\startitemize{template}}
+%D \item \type{\startitemize[predefined]}
+%D \stopitemize
+%D
+%D as well as:
+%D
+%D \startitemize[continue]
+%D \item restart after table break
+%D \stopitemize
+%D
+%D The official specification of the start command is:
+%D
+%D \showsetup{starttable}
+
+\newconditional\tablerepeathead
+\newconditional\tablerepeattail
+
+\unexpanded\def\starttable
+ {\bgroup
+ \let\stoptable\dostoptable
+ \doif\@@tisplit\v!auto
+ {\ifinsidesplitfloat\let\@@tisplit\v!yes\fi}%
+ \doifinsetelse\@@tisplit{\v!yes,\v!repeat}
+ {\unexpanded\def\stoptable{\stoptables\egroup}%
+ \starttables}
+ {\doifelsenothing\@@tiframe
+ {\ifinsidefloat\else\startbaselinecorrection\fi}
+ {\startframedcontent[\@@tiframe]}%
+ \postponenotes
+ \firststagestartTABLE}}
+
+% We cannot define \unexpanded\def\dostoptable a ssomehow lookahead
+% in alignments fail then, so we relax it and define it locally.
+
+\let\stoptabel\relax
+
+\def\dostoptable
+ {\chuckTABLEautorow % before the tail, else noalign problem
+ \insertTABLEtail
+ \TABLEnoalign{\globalletempty\@@TABLEhead}%
+ \TABLEnoalign{\globalletempty\@@TABLEtail}%
+ \finishTABLE
+ \doifelsenothing\@@tiframe
+ {\ifinsidefloat\else
+ \stopbaselinecorrection
+ \goodbreak % compensates all the nobreaks
+ \fi}
+ \stopframedcontent
+ \egroup}
+
+%D Before we can grab the argument, we have to make sure that
+%D the \CATCODES\ are set. The first stage takes care of that.
+
+\def\firststagestartTABLE
+ {\bgroup % kan-ie weg?
+ \global\intabletrue
+ \pushouterbarandquote
+ %catcode`\|=\@@other
+ \complexorsimple\secondstagestartTABLE}
+
+\def\simplesecondstagestartTABLE#1%
+ {\complexsecondstagestartTABLE[{#1}]}
+
+%D \macros
+%D {definetabletemplate}
+%D
+%D The complex (and main) start macro first takes care of the
+%D predefined case. Such a predefined setup looks like:
+%D
+%D \starttyping
+%D \definetabletemplate[test][|||]
+%D
+%D \starttable[test]
+%D \VL test \VL test \VL\AR
+%D \VL test \VL test \VL\AR
+%D \VL test \VL test \VL\AR
+%D \stoptable
+%D \stoptyping
+%D
+%D The implementation of the definition macro is not that
+%D complicated:
+
+\unexpanded\def\definetabletemplate % to be redone
+ {\bgroup
+ \catcode`\|=\@@other
+ \doquadrupleempty\dodefinetabletemplate}
+
+\def\dodefinetabletemplate[#1][#2][#3][#4]%
+ {\ifsecondargument
+ \setgvalue{\c!Table#1}{\douseTABLEtemplate{#2}{#3}{#4}}%
+ \fi
+ \egroup}
+
+\def\douseTABLEtemplate#1#2#3%
+ {\gdef\TABLEhead{\getvalue{@@TABLEhead#2}}%
+ \gdef\TABLEtail{\getvalue{@@TABLEtail#3}}%
+ \complexsecondstagestartTABLE[#1]}
+
+%D The optional third and fourth arguments define which table
+%D head and tail to use.
+%D
+%D \starttyping
+%D \definetabletemplate[test][|||][before][after]
+%D \stoptyping
+%D
+%D This also means that one can define table heads and tails
+%D by name!
+%D
+%D \starttyping
+%D \starttablehead[before]
+%D \HL \VL first \VL second \VL \SR \HL
+%D \stoptablehead
+%D \stoptyping
+%D
+%D Templates defined this way get protected names, that cannot
+%D conflict with existing commands.
+%D
+%D \showsetup{definetabletemplate}
+%D
+%D The second half of the next macro prepares table
+%D splitting.
+
+\def\insertTABLEhead
+ {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEhead}%
+ \TABLEhead
+ \TABLEnoalign{\global\setfalse\preventTABLEbreak}}
+
+\def\insertTABLEtail
+ {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEtail}%
+ \TABLEtail
+ \TABLEnoalign{\global\setfalse\preventTABLEbreak}}
+
+% \def\dorestartTABLE#1%
+% {\gdef\restartTABLE{#1}%
+% \restartTABLE
+% \insertTABLEhead
+% \ifsplittables \ifconditional \tablerepeattail
+% \TABLEnoalign{\goodbreak}%
+% \insertTABLEtail
+% \TABLEnoalign{\goodbreak}%
+% \fi \fi}
+
+\def\verysimpleTableHL
+ {\TABLEnoalign{\expandafter\normalTABLEfullrule\@@tiHLheight}}
+
+\def\dorestartTABLE#1%
+ {\gdef\restartTABLE{#1}%
+ \restartTABLE
+ \TABLEnoalign{\globalpushmacro\simpleTableHL\global\let\simpleTableHL\verysimpleTableHL}%
+ \insertTABLEhead
+ \ifsplittables \ifconditional \tablerepeattail
+ \TABLEnoalign{\goodbreak}%
+ \insertTABLEtail
+ \TABLEnoalign{\goodbreak}%
+ \fi \fi
+ \TABLEnoalign{\globalpopmacro\simpleTableHL}}
+
+\bgroup \catcode`|=\@@other \catcode`"=\@@other
+
+\gdef\complexsecondstagestartTABLE#1[#2]% brr nested mess
+ {\bgroup
+ \@@useotherbar
+ \@@useotherquote
+ \global\setfalse\someTABLEhead
+ \global\setfalse\someTABLEtail
+ \expanded{\doifinstringelse{|}{#2}}
+ {\xdef\restartTABLE{\noexpand\dorestartTABLE{\noexpand\thirdstagestartTABLE{#2}}}}
+ {\doifdefinedelse{\c!Table#2}
+ {\gdef\restartTABLE{\getvalue{\c!Table#2}}}
+ {\gdef\restartTABLE{\dorestartTABLE{\getvalue{#2}}}}}%
+ \egroup
+ \restartTABLE}
+
+\egroup
+
+%D The third stage involves a lot of (re)sets, which we will
+%D explain later.
+
+%D The next definition is convenient and more in tune with
+%D \CONTEXT.
+
+\let \everytable \EveryTable
+
+%D We immediately use this register:
+
+\appendtoks
+ \fixedspaces
+ \let\_\normalunderscore
+\to \everytable
+
+%D Now we can start the table.
+
+\def\thirdstagestartTABLE#1%
+ {\global\setTABLEactiontrue
+ \setTABLEaction\TABLEunknown
+ \setTABLEforce\TABLEunknown
+ \setTABLEerror\TABLEunknown
+ \global\TABLEgraylinefalse
+ \global\TABLEgraydonefalse
+ \globalletempty\TABLEgrayline
+ \globalletempty\nextTABLEgrayline
+ \globalletempty\TABLEgraylineerror
+ \globalletempty\TABLEgraylinestatus
+ \resetVLvalues
+ \appendtoks\popouterbarandquote\to\EveryTable
+ \appendtoks\localTABLEsetup\to\EveryTable
+ \BeginTable[\ifsplittables u\else b\fi]%
+ \defineTABLEunits
+ \defineTABLEsteps
+ \defineTABLErules
+ \defineTABLEdivisions
+ \defineTABLEshorthands
+ \defineTABLEbackgrounds
+ \defineTABLEendings
+ \forgetall % added
+ \doifsomething{#1}
+ {\def\TABLEformat{#1}%
+ \getTABLEnofcolumns\TABLEformat
+ % more modern is to use catcode tables
+ \expandafter\BeginFormat\TABLEformat\EndFormat}}
+
+\def\finishTABLE
+ {\chuckTABLEautorow
+ \unskip\crcr
+ \EndTable
+ \global\intablefalse
+ \egroup}
+
+%D \macros
+%D {starttables}
+%D
+%D Split tables are specified using the plural form of the
+%D start and stop commands.
+%D
+%D \showsetup{starttables}
+%D
+%D For example:
+%D
+%D \starttyping
+%D \starttables[|||]
+%D \HL
+%D \VL element \VL atom weight \VL\AR
+%D \HL
+%D \VL ....... \VL ........... \VL\AR
+%D \VL ....... \VL ........... \VL\AR
+%D \HL
+%D \stoptables
+%D \stoptyping
+
+\newbox\tablecontentbox
+
+\unexpanded\def\starttables
+ {\bgroup
+ \let\stoptables\dostoptables
+ \splittablestrue
+ \doifelse\@@tisplit\v!repeat
+ {\settrue \tablerepeathead\settrue \tablerepeattail}
+ {\setfalse\tablerepeathead\setfalse\tablerepeattail}%
+ \flushnotes
+ \setbox\tablecontentbox\vbox\bgroup
+ \forgetall
+ \global\TABLEinbreakfalse
+ \firststagestartTABLE}
+
+\let\stoptables\relax % needed for \noalign
+
+\def\dostoptables
+ {\chuckTABLEautorow % AM: before the tail, else noalign problem
+ \ifconditional\tablerepeattail\else\insertTABLEtail\fi
+ \finishTABLE
+ \egroup
+ \dontcomplain
+ \dosplittablebox\tablecontentbox
+ \flushnotes
+ \egroup}
+
+\newdimen\TABLEcaptionheight % obsolete
+
+\def\dosplittablebox#1%
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{\TABLEcaptionheight}%
+ \setbox\tsplitcontent\box#1%
+ \ifconditional\tablerepeathead \ifconditional\someTABLEhead
+ \setbox\tsplithead\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvbox\tsplithead}%
+ \fi \fi
+ \ifconditional\tablerepeattail \ifconditional\someTABLEtail
+ \setbox\tsplittail\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplittail\vbox{\unvbox\tsplittail}%
+ \fi \fi
+ \ifinsidefloat\else
+ \def\tsplitbeforeresult{\startbaselinecorrection}%
+ \def\tsplitafterresult {\stopbaselinecorrection}%
+ \fi
+ \handletsplit}
+
+%D When the table in the previous example is split across
+%D pages, only the first gets a head. We could have said
+%D something like:
+%D
+%D \starttyping
+%D \starttablekop
+%D \HL
+%D \VL element \VL atom weight \VL\AR
+%D \HL
+%D \stoptablekop
+%D
+%D \starttablestaart
+%D \HL
+%D \stoptablestaart
+%D
+%D \starttables[|||]
+%D \VL ....... \VL ........... \VL\AR
+%D \VL ....... \VL ........... \VL\AR
+%D \stoptables
+%D \stoptyping
+%D
+%D This time each split table gets a head line and ends with
+%D a rule. Keep in mind that such heads also apply to the
+%D unbroken ones and should be defined local (grouped) if
+%D needed. The rather complicated definition below is due to
+%D the fact that the stopcondition is interface language
+%D dependant.
+
+\let\@@TABLEhead\empty \def\TABLEhead{\@@TABLEhead}
+\let\@@TABLEtail\empty \def\TABLEtail{\@@TABLEtail}
+
+\letvalue{\e!start\v!tablehead}=\undefined
+\letvalue{\e!stop \v!tablehead}=\undefined
+\letvalue{\e!start\v!tabletail}=\undefined
+\letvalue{\e!stop \v!tabletail}=\undefined
+
+\expanded
+ {\long\def\csname\e!start\v!tablehead\endcsname##1\csname\e!stop\v!tablehead\endcsname%
+ {\noexpand\setTABLEhead##1\noexpand\end}}
+
+\expanded
+ {\long\def\csname\e!start\v!tabletail\endcsname##1\csname\e!stop\v!tabletail\endcsname%
+ {\noexpand\setTABLEtail##1\noexpand\end}}
+
+%D The second argument is a dummy one, by scanning for it, we
+%D get rid of interfering spaces.
+
+\def\setTABLEhead{\dodoubleempty\dosetTABLEhead}
+\def\setTABLEtail{\dodoubleempty\dosetTABLEtail}
+
+\newconditional\preventTABLEbreak
+\newconditional\someTABLEhead
+
+\long\def\dosetTABLEhead[#1][#2]#3\end{\setvalue{@@TABLEhead#1}{\TABLEnoalign{\global\settrue\someTABLEhead}#3}}
+\long\def\dosetTABLEtail[#1][#2]#3\end{\setvalue{@@TABLEtail#1}{\TABLEnoalign{\global\settrue\someTABLEtail}#3}}
+
+%D Redudant \type{\HL}'s are removed automatically, so
+%D mid||lines can be used without problems.
+
+%D We need an alternative for the normal complex or simple
+%D commands, because assignments in these system commands
+%D conflict with \type{\noalign}. This alternative is about
+%D as efficient as possible.
+
+\def\complexorsimpleTable#1#2%
+ {\csname\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#1\endcsname#2}
+
+%D The next one is used in \type{\VL} cum suis and honours
+%D the next grouping.
+
+\def\docomplexorsimpleTable#1#2%
+ {\ifx\next\bgroup\@EA#2\else\@EA\dodocomplexorsimpleTable\@EA#1\@EA#2\fi}
+
+\def\dodocomplexorsimpleTable#1#2#3%
+ {\if[\noexpand#3\@EA#1\else\@EA#2\fi#3}
+
+%D The order of the next macros is more or less random. First
+%D we implement error recovery. Errors are reported to the
+%D screen and log file as well as visualized in the table in
+%D teletype.
+
+\def\handleTABLEerror
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEerror=\TABLEunknown \else
+ \setTABLEaction\TABLEunknown
+ \globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \fi
+ \ifcase\TABLEerror
+ % no error
+ \or
+ % \TABLEmissingrow
+ \tttf [missing row]%
+ \writestatus\m!TABLE{missing row}%
+ \SR
+ \or
+ % \TABLEmissingcolumn
+ \fillTABLEcolumns
+ \tttf [missing column]%
+ \writestatus\m!TABLE{missing column}%
+ \SR
+ \or
+ % \TABLEspanoverflow
+ \fillTABLEcolumns
+ \tttf [columnspan too large]%
+ \writestatus\m!TABLE{columnspan too large}%
+ \SR
+ \or
+ % \TABLEdivisionoverflow
+ \fillTABLEcolumns
+ \tttf [division line too long]%
+ \writestatus\m!TABLE{division line too long}%
+ \SR
+ \fi
+ \fi
+ \ifnum\TABLEerror=\TABLEunknown \else
+ \finishTABLErow
+ \fi}
+
+\def\finishTABLErow
+ {\crcr
+ \TABLEnoalign
+ {\nobreak
+ \setTABLEaction\TABLEunknown
+ \setTABLEerror\TABLEunknown
+ \globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \global\currentTABLEcolumn\zerocount}}
+
+\def\fillTABLEcolumns
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \else
+ \global\advance\currentTABLEcolumn \plusone
+ \normalTABLEquote
+ \expandafter\fillTABLEcolumns
+ \fi}
+
+%D Next we enter the more complicated area of column and row
+%D switching. I won't go into much detail from now on, but just
+%D mention the general principles.
+%D
+%D \startitemize[3*ruim]
+%D \sym{\type{\SR}} end a separate row (between rules)
+%D \sym{\type{\FR}} end a first row (after a rule)
+%D \sym{\type{\MR}} end a mid row (between text lines)
+%D \sym{\type{\LR}} end a last row (before a rule)
+%D \stopitemize
+%D
+%D and best of all:
+%D
+%D \startitemize[continue]
+%D \sym{\type{\AR}} end a row with automatic spacing
+%D \stopitemize
+%D
+%D As far as possible, we report confusing situations. In
+%D most cases one can use \type{\AR}, which transfigurates
+%D itself into one of the other types.
+%D
+%D \starttyping
+%D \starttable[||]
+%D \HL
+%D \VL a separate row \VL\SR
+%D \HL
+%D \VL a first row \VL\FR
+%D \VL a mid row \VL\MR
+%D \VL a last row \VL\LR
+%D \HL
+%D \stoptable
+%D \stoptyping
+%D
+%D In this example we could have used \type{\AR} without
+%D problems.
+%D
+%D Color or gray scale backgrounds precede the content. They
+%D are passed over horizontal (division) lines when needed.
+%D Errors in the color template are traced elsewhere. Here we
+%D only check for inconsistent spacing. Due to the way \TEX\
+%D handles alignments, we cannot automate spacing for colored
+%D rows and columns.
+
+\chardef\TABLErowzero=0
+
+\def\checkTABLErow#1% pure for message purposes
+ {\unskip % added
+ \ifTABLEgraydone
+ \defconvertedargument\asciia{#1}%
+ \defconvertedcommand \asciib\TABLEendBCL
+ \ifx\asciia\asciib \else
+ \writestatus\m!TABLE{confusing \asciia\space and \asciib}%
+ \gdef\TABLEgraylineerror%
+ {\globalletempty\TABLEgraylineerror
+ [\asciia\unskip<->\asciib\unskip]}%
+ \fi
+ \global\TABLEgraydonefalse
+ \fi}
+
+\unexpanded\def\defineTABLEendings
+ {\let\SR\TableSR
+ \let\FR\TableFR
+ \let\MR\TableMR
+ \let\LR\TableLR
+ \let\AR\TableAR}
+
+\def\TableSR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \fi\fi\fi
+ \fi
+ \checkTABLErow\SR
+ \endTABLErow\TABLEseparaterow\TABLErowfactor\TABLErowfactor}
+
+\def\TableFR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLElastrow
+ \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
+ \fi\fi
+ \fi
+ \checkTABLErow\FR
+ \endTABLErow\TABLEfirstrow\TABLErowfactor\TABLErowzero}
+
+\def\TableMR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{change \string\MR\space into \string\FR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLElastrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\FR}%
+ \fi\fi
+ \fi
+ \checkTABLErow\MR
+ \endTABLErow\TABLEmidrow00}
+
+\def\TableLR
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{change \string\LR\space into \string\FR/\string\SR}%
+ \fi
+ \fi
+ \checkTABLErow\LR
+ \endTABLErow\TABLElastrow\TABLErowzero\TABLErowfactor}
+
+%D \macros
+%D {ifcheckTABLEcolums}
+%D
+%D
+%D The next macros handle the actual row ending. This macro
+%D also take care of space corrections due to table splitting
+%D when \type{\MR} and collegues are used. When tracing is
+%D enabled, the corrections as well as the values used to
+%D determine the available space are shown (in color). By default
+%D checking is off.
+
+\newif\ifcheckTABLEcolumns
+
+\let\beforeTABLEline\empty
+\let\afterTABLEline \empty
+
+\def\doendTABLErow#1#2#3%
+ {\handleTABLEbreak#2#3%
+ \beforeTABLEline
+ \ifcase#1\relax
+ % unknown
+ \or
+ \endofTABLEline[blue][\SR->\SR]\TABLErowfactor\TABLErowfactor
+ \or
+ \endofTABLEline[red][\FR->\FR]\TABLErowfactor\TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \endofTABLEline[red][\MR->\LR]\TABLErowzero\TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \endofTABLEline[red][\MR->\FR]\TABLErowfactor\TABLErowzero
+ \else
+ \endofTABLEline[green][\MR->\MR]\TABLErowzero\TABLErowzero
+ \fi\fi
+ \or
+ \endofTABLEline[red][\LR->\LR]\TABLErowzero\TABLErowfactor
+ \fi
+ \TABLEnoalign
+ {\setTABLEforce\TABLEunknown
+ \global\currentTABLEcolumn\zerocount}%
+ \afterTABLEline}
+
+\def\endTABLErow#1#2#3%
+ {\setTABLEaction#1%
+ \ifTABLEgrayline
+ \finishTABLErow
+ \else
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \doendTABLErow{#1}{#2}{#3}%
+ \else\ifcheckTABLEcolumns
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \else
+ \doendTABLErow{#1}{#2}{#3}%
+ \fi\fi
+ \fi}
+
+%D Handling \type{\AR} is postponed till the next row. The
+%D check takes care of the first and mid rows, the chuck macro
+%D |<|how about that name|>| handles the last row.
+
+\def\TableAR
+ {\ifTABLEgraydone
+ \globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \global\TABLEgraydonefalse
+ \TABLEendBCL
+ \else
+ \globallet\checkTABLEautorow\docheckTABLEautorow
+ \globallet\chuckTABLEautorow\dochuckTABLEautorow
+ \fi}
+
+\let\checkTABLEautorow\empty
+\let\chuckTABLEautorow\empty
+
+\def\docheckTABLEautorow
+ {\globallet\checkTABLEautorow\empty
+ \ifnum\TABLEaction=\TABLErule \FR
+ \else\ifnum\TABLEaction=\TABLEunknown \FR
+ \else \MR
+ \fi\fi}
+
+\def\dochuckTABLEautorow
+ {\globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow
+ \ifnum\TABLEaction=\TABLErule \SR
+ \else\ifnum\TABLEaction=\TABLEunknown \SR
+ \else \LR
+ \fi\fi}
+
+%D When a table is split, we also add a tail and when present
+%D we repeat the table head.
+
+\def\handleTABLEbreak#1#2%
+ {\globalletempty\beforeTABLEline
+ \gdef\afterTABLEline{\TABLEnoalign{\ifconditional\preventTABLEbreak\nobreak\else\goodbreak\fi}}}
+
+%D When tables are split, the spacing before and after a
+%D horizontal rule is corrected according to what we expect.
+
+\def\endofTABLEline[#1][#2->#3]#4#5%
+ {\ifx#2#3\else
+ \writestatus\m!TABLE{\string#2\space changed into \string#3}%
+ \fi
+ \iftracetables
+ \bgroup
+ \tttf\space
+ \ifnum\TABLEerror=\TABLEunknown
+ \ifx#2#3\else\string#2->\fi
+ \else
+ ->%
+ \fi
+ \color[#1]{\string#3}%
+ \ifx\TABLEgraylineerror\empty
+ \space\TABLEgraylinestatus
+ \else
+ \space\TABLEgraylineerror
+ \fi
+ \egroup
+ \else\ifx\TABLEgraylineerror\empty \else
+ % \bgroup
+ % \tttf\space\TABLEgraylineerror
+ % \egroup
+ \fi\fi
+ \globalletempty\TABLEgraylinestatus
+ \globalletempty\TABLEgraylineerror
+ \expandafter\normalTABLElineformat#4#5\crcr % \crcr nodig ?
+ \TABLEnoalign{\nobreak\global\setTABLEactiontrue}}
+
+%D In order to prevent (as good as possible) alignment overflow
+%D and therefore \TEX\ error messages, we check the maximum
+%D number of columns. We keep track of the current column and
+%D maximum column by means of two \COUNTERS. Keep in mind that
+%D the number of \type{|}'s and \type{\VL}'s or alike is always
+%D one more than the number of columns.
+
+\newcount\currentTABLEcolumn
+\newcount\maxTABLEcolumn
+
+%D While defining this macro we change the \CATCODE\ of
+%D \type{|}. When counting the bars, we use a non active
+%D representation of the bar, simply because we cannot be sure
+%D if the bar is active or not.\footnote{Normally it is, but
+%D \TABLE\ changes the catcode when needed.}
+
+\bgroup
+ \catcode`\|=\@@other \gdef\@@otherbar {|}
+ \catcode`\"=\@@other \gdef\@@otherquote {"}
+ \catcode`\|=\@@active \gdef\@@useotherbar {\let|\@@otherbar}
+ \catcode`\"=\@@active \gdef\@@useotherquote{\let"\@@otherquote}
+\egroup
+
+\bgroup \catcode`\|=\@@other
+
+\gdef\getTABLEnofcolumns#1%
+ {\bgroup
+ \cleanupfeatures % needed !
+ \@@useotherbar
+ \@@useotherquote
+ \expanded{\defconvertedargument\noexpand\ascii{#1}}%
+ \@EA\doglobal\@EA\counttoken\@EA|\@EA\in\ascii\to\maxTABLEcolumn
+ \global\advance\maxTABLEcolumn \minusone
+ % in case of & counting, divide by 2
+ \egroup}
+
+\egroup
+
+\def\!ttDoHalign
+ {\edef\restoretablelineskips
+ {\baselineskip \the\baselineskip
+ \lineskiplimit\the\lineskiplimit
+ \lineskip \the\lineskip
+ \tabskip \the\tabskip}%
+ \baselineskip \zeropoint
+ \lineskiplimit\zeropoint
+ \lineskip \zeropoint
+ \tabskip \zeropoint
+ % does not work in normal tex
+ % \expanded{\getTABLEnofcolumns{\the\!taPreamble}}% added
+ \halign \the\!taTableSpread \bgroup
+ \span\the\!taPreamble
+ \ifx \!tfRowOfWidths \empty \else \!tfRowOfWidths \cr \fi}
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\VL}} a vertical line
+%D \sym{\type{\VC}} a vertical colored line
+%D \sym{\type{\HL}} a horizontal line
+%D \sym{\type{\HC}} a horizontal colored line
+%D \stopitemize
+
+% \unexpanded\def\defineTABLErules
+% {\let\VL\TableVL
+% \let\VC\TableVC
+% \let\HL\TableHL
+% \let\HC\TableHC}
+
+\unexpanded\def\defineTABLErules
+ {\let\VL\TableVL
+ \let\VC\TableVC
+ \let\HL\TableHL
+ \let\HC\TableHC
+ \let\VS\TableVS
+ \let\VD\TableVD
+ \let\VT\TableVT
+ \let\VN\TableVN}
+
+\def\TableVL
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ \expandafter\doTableVL
+ \fi}
+
+\def\doTableVL
+ {\futurelet\next\dodoTableVL}
+
+\def\dodoTableVL
+ {\docomplexorsimpleTable\complexTableVL\simpleTableVL}
+
+\def\complexTableVL[#1]%
+ {\scratchcounter=0#1%
+ \multiply\scratchcounter \@@tiVLwidth
+ \setxvalue{wVL\the\currentTABLEcolumn}{\the\scratchcounter}%
+ \simpleTableVL}
+
+\def\simpleTableVL
+ {\doifundefined{wVL\the\currentTABLEcolumn}%
+ {\setgvalue{wVL\the\currentTABLEcolumn}{\@@tiVLwidth}}%
+ \gdef\TABLEbeforebar
+ {\getvalue{bVL\the\currentTABLEcolumn}%
+ \letgvalueempty{bVL\the\currentTABLEcolumn}}%
+ \gdef\TABLEafterbar
+ {\getvalue{eVL\the\currentTABLEcolumn}%
+ \letgvalueempty{eVL\the\currentTABLEcolumn}}%
+ \edef\@@tiVLwidth{\getvalue{wVL\the\currentTABLEcolumn}}%
+ \expanded{\normalTABLEcomplexbar\@@tiVLwidth\space}}% \relax breaks \use
+
+% \starttable[|||]
+% \HL
+% \VL test \VS test \VL \FR
+% \VL test \VD test \VL \MR
+% \VL test \VT test \VL \LR
+% \HL
+% \stoptable
+
+\def\TableVS {\VN1}
+\def\TableVD {\VN2}
+\def\TableVT {\VN3}
+\def\TableVN#1{\gdef\@VLn{#1}\VL}
+
+\def\resetVLvalues
+ {\dostepwiserecurse\zerocount\maxTABLEcolumn\plusone
+ {\setgvalue{wVL\recurselevel}{\@@tiVLwidth}%
+ \letgvalueempty{bVL\recurselevel}%
+ \letgvalueempty{eVL\recurselevel}}%
+ \global\currentTABLEcolumn\zerocount}
+
+\def\TableVC
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ \expandafter\doTableVC
+ \fi}
+
+\def\doTableVC
+ {\futurelet\next\dodoTableVC}
+
+\def\dodoTableVC
+ {\docomplexorsimpleTable\complexTableVC\simpleTableVC}
+
+\def\complexTableVC[#1]%
+ {\global\setvalue{bVC\the\currentTABLEcolumn}{\startcolor[#1]}%
+ \global\setvalue{eVC\the\currentTABLEcolumn}{\stopcolor}%
+ \simpleTableVC}
+
+\def\simpleTableVC
+ {\global\setvalue{bVL\the\currentTABLEcolumn}%
+ {\getvalue{bVC\the\currentTABLEcolumn}}%
+ \global\setvalue{eVL\the\currentTABLEcolumn}%
+ {\getvalue{eVC\the\currentTABLEcolumn}}%
+ \doTableVL}
+
+\def\TableHL
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \chuckTABLEautorow
+ \else\ifnum\currentTABLEcolumn=\zerocount
+ %\chuckTABLEautorow
+ \TABLEnoalign
+ {\globalletempty\checkTABLEautorow
+ \globalletempty\chuckTABLEautorow}%
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi\fi
+ \complexorsimpleTable{HL}}
+
+\def\complexTableHL[#1]%
+ {\TABLEnoalign
+ {\scratchcounter0#1%
+ \multiply\scratchcounter \@@tiHLheight
+ \edef\@@tiHLheight{\the\scratchcounter}%
+ \simpleTableHL}}
+
+\def\simpleTableHL
+ {\TABLEnoalign
+ {\nobreak
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{skipping \string\HL}% \statusmessage
+ \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
+ \fi\fi
+ \startHLcommand
+ \expandafter\normalTABLEfullrule\@@tiHLheight
+ \stopHLcommand
+ \globalletempty\startHLcommand
+ \globalletempty\stopHLcommand
+ \accountTABLElinewidth
+ \fi
+ \setTABLEaction\TABLErule
+ \nobreak}}
+
+\let\startHLcommand\empty
+\let\stopHLcommand \empty
+
+\def\TableHC
+ {\complexorsimpleTable{HC}}
+
+\def\complexTableHC[#1]%
+ {\TABLEnoalign
+ {\gdef\startHCcommand{\startcolor[#1]}%
+ \gdef\stopHCcommand {\stopcolor}}%
+ \simpleTableHC}
+
+\def\simpleTableHC
+ {\TABLEnoalign
+ {\globallet\startHLcommand\startHCcommand
+ \globallet\stopHLcommand \stopHCcommand}%
+ \HL}
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\NL}} a vertical skip
+%D \sym{\type{\NR}} goto the next row
+%D \sym{\type{\NC}} goto the next column
+%D \sym{\type{\FC}} a first column
+%D \sym{\type{\MC}} a mid column
+%D \sym{\type{\LC}} a last column
+%D \stopitemize
+
+% n+1 uitleggen
+
+\unexpanded\def\defineTABLEsteps
+ {\let\NL\TableNL
+ \let\NR\TableNR
+ \let\NC\TableNC
+ \let\FC\TableNC
+ \let\MC\TableNC
+ \let\LC\TableNC}
+
+\def\TableNL
+ {\complexorsimpleTable{NL}}
+
+\def\complexTableNL[#1]%
+ {\TABLEnoalign
+ {\edef\@@tiNL{#1}%
+ \simpleTableNL}}%
+
+\def\simpleTableNL
+ {\TABLEnoalign
+ {\nobreak
+ \setbox0\vbox{\blank[\@@tiNL]}%
+ \vskip\ht0
+ \nobreak}}
+
+\def\TableNR
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \global\currentTABLEcolumn\zerocount
+ \normalTABLElineending
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi
+ \TABLEnoalign
+ {\nobreak
+ \setTABLEaction\TABLEunknown}}
+
+\def\TableNC
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ \normalTABLEquote
+ \fi}
+
+% \bgroup
+% \catcode`\|=\@@active
+% \catcode`\"=\@@active
+% \gdef\redefinetablebarandquote
+% {\def|{\VL}% % \normalTABLEsimplebar
+% \def\|##1{\VL[##1]}% % \normalTABLEcomplexbar
+% \def"{\NC}} % \normalTABLEquote
+% \egroup
+
+\let\redefinetablebarandquote\relax
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\DL}}
+%D \sym{\type{\DV}} (\type{\VD})
+%D \sym{\type{\DC}}
+%D \sym{\type{\DR}}
+%D \stopitemize
+
+\newif\ifTABLEdivision
+
+% \unexpanded\def\defineTABLEdivisions
+% {\global\TABLEdivisionfalse % in start
+% \let\DL\TableDL
+% \let\DC\TableDC
+% \let\DV\TableDV
+% \let\VD\TableDV
+% \let\DR\TableDR}
+
+\unexpanded\def\defineTABLEdivisions
+ {\global\TABLEdivisionfalse % in start
+ \let\DL\TableDL
+ \let\DC\TableDC
+ \let\DV\TableDV
+ \let\DR\TableDR}
+
+\def\checkTABLEdivision
+ {\ifTABLEdivision \else
+ \chuckTABLEautorow
+ \global\currentTABLEcolumn\zerocount
+ \global\TABLEdivisiontrue
+ \fi}
+
+\def\TableDL
+ {\checkTABLEdivision
+ \complexorsimpleTable{DL}}
+
+\def\simpleTableDL
+ {\complexTableDL[1]}
+
+\def\complexTableDL[#1]%
+ {\ifnum\TABLEaction=\TABLErule
+ \writestatus\m!TABLE{skipping \string\DL}%
+ \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
+ \fi\fi
+ \setTABLEaction=\TABLEunknown
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \fi
+ %\startHLcommand
+ \ifnum#1=\plusone
+ \global\advance\currentTABLEcolumn \plustwo
+ \let\next\normalTABLEsinglerule
+ \else
+ \ifnum#1<\maxTABLEcolumn
+ \global\advance\currentTABLEcolumn \plusone
+ \def\next{\normalTABLEmultirule{#1}}%
+ \else
+ \setTABLEerror\TABLEdivisionoverflow
+ \let\next\handleTABLEerror
+ \fi
+ \fi
+ \next
+ %\stopHLcommand
+ %\globalletempty\startHLcommand
+ %\globalletempty\stopHLcommand
+ \fi}
+
+\def\TableDV
+ {\TableDCV\normalTABLEsimplebar}
+
+\def\TableDC
+ {\TableDCV\normalTABLEquote}
+
+\def\TableDCV#1%
+ {\checkTABLEdivision
+ \checkTABLEautorow
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn \plusone
+ #1%
+ \fi}
+
+\def\TableDR
+ {\ifnum\currentTABLEcolumn<\maxTABLEcolumn % silent recovery
+ %\setTABLEerror\TABLEmissingcolumn % some day warning
+ %\handleTABLEerror
+ \finishTABLErow
+ \else
+ \global\currentTABLEcolumn\zerocount % nog check
+ \normalTABLElineending
+ \fi
+ \TABLEnoalign
+ {\nobreak
+ \global\TABLEdivisionfalse
+ \accountTABLElinewidth % temporary solution
+ \setTABLEaction\TABLErule}}
+
+\def\accountTABLElinewidth
+ {\scratchdimen\LineThicknessUnit}
+
+%D \startitemize[3*ruim]
+%D \sym{\type{\BC}}
+%D \sym{\type{\BR}}
+%D \sym{\type{\BACKGROUND}}
+%D \sym{\type{\CL}}
+%D \sym{\type{\RL}}
+%D \sym{\type{\BL}}
+%D \sym{\type{\RASTER}}
+%D \sym{\type{\COLOR}}
+%D \stopitemize
+
+% definieer: \BC \BL
+% herhaal: \BR
+% definieer: \CL \RL (eerste \CL[green] = hele row! / \CL[1,green])
+% dus: \CL en \RL mix tussen \HL en \BL
+
+\unexpanded\def\defineTABLEbackgrounds
+ {\let\BC \TableBC
+ \let\BL \TableBL
+ \let\BR \TableBR
+ \let\BACKGROUND\TableBR
+ \let\CL \TableCL
+ \let\RL \TableRL
+ \let\COLOR \TableCOLOR
+ \let\RASTER \TableRASTER
+ \globallet\lastTABLEc\@@tibackgroundcolor
+ \globallet\lastTABLEr\@@tibackgroundscreen
+ \doifinsetelse\@@tibackground{c,color} % \v!color
+ {\global\chardef\TABLEcr\plusone}
+ {\global\chardef\TABLEcr\plustwo}}
+
+\def\TableBC
+ {\ifTABLEgrayline
+ \normalTABLEquote
+ \else
+ \TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\BC\doTableBC
+ \expandafter\doTableBC
+ \fi}
+
+\def\doTableBC
+ {\addtoTABLEgrayline{\BC}%
+ \gobbleTableBCL}
+
+\def\TableBL
+ {\TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\CL\doTableCL
+ \let\RL\doTableRL
+ \let\BC\doTableBC
+ \doTableBL}
+
+\def\doTableBL
+ {\complexorsimpleTable{BL}}
+
+\def\simpleTableBL
+ {\complexTableBL[,]}
+
+\def\complexTableBL[#1]%
+ {\analyzeTABLEcr[#1]%
+ \handleTABLEcr}
+
+\def\TableBR#1%
+ {\TABLEnoalign
+ {\globallet\nextTABLEgrayline\executeTABLEgrayline
+ \checkTABLEgrayline#1\BR
+ \global\TABLEgraylinetrue}}
+
+\def\analyzeTABLEcr[#1]%
+ {\doanalyzeTABLEcr[#1,,]}
+
+\def\doanalyzeTABLEcr[#1,#2,#3]%
+ {\doifnumberelse{#1x} % Is the x still needed here?
+ {\dodoanalyzeTABLEcr[#1,#2,#3]}
+ {\dodoanalyzeTABLEcr[1,#1,#2]}}
+
+\def\dodoanalyzeTABLEcr[#1,#2,#3]%
+ {\global\chardef\TABLEn#1\relax
+ \processaction
+ [#2]
+ [ c=>\global\chardef\TABLEcr1,%
+ color=>\global\chardef\TABLEcr1,%
+ r=>\global\chardef\TABLEcr2,%
+ raster=>\global\chardef\TABLEcr2]%
+ \ifcase\TABLEcr \or
+ \doifsomething{#3}{\xdef\lastTABLEc{#3}}%
+ \or
+ \doifsomething{#3}{\xdef\lastTABLEr{#3}}%
+ \fi}
+
+\def\handleTABLEcr
+ {\relax % else funny side effect
+ \ifcase\TABLEcr
+ % Can't happen!
+ \or
+ \addtoTABLEgrayline{\complexTableCOLOR[\the\TABLEn,\lastTABLEc]}%
+ \else
+ \addtoTABLEgrayline{\complexTableRASTER[\the\TABLEn,\lastTABLEr]}%
+ \fi
+ \gobbleTableBCL}
+
+\def\analyzeTABLEcrl#1[#2]%
+ {\doanalyzeTABLEcrl#1[#2,,]}
+
+\def\doanalyzeTABLEcrl#1[#2,#3,#4]%
+ {\doifnumberelse{#2x} % x ????????????????????
+ {\dodoanalyzeTABLEcr[#2,#1,#3]}
+ {\dodoanalyzeTABLEcr[\ifTABLEgrayline1\else\maxTABLEcolumn\fi,#1,#2]}}
+
+\def\TableCL
+ {\TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\CL\doTableCL
+ \let\RL\doTableRL
+ \let\BC\doTableBC
+ \doTableCL}
+
+\def\doTableCL
+ {\complexorsimpleTable{CL}}
+
+\def\simpleTableCL% nog eens \'e\'en lijn van maken
+ {\BL[\the\maxTABLEcolumn,c,\lastTABLEc]}
+
+\def\complexTableCL[#1]%
+ {\analyzeTABLEcrl{c}[#1]%
+ \handleTABLEcr}
+
+\def\TableRL
+ {\TABLEnoalign\bgroup
+ \globallet\nextTABLEgrayline\executeTABLEgrayline
+ \globalletempty\TABLEgrayline % new
+ \let\BL\doTableBL
+ \let\CL\doTableCL
+ \let\RL\doTableRL
+ \let\BC\doTableBC
+ \doTableRL}
+
+\def\doTableRL
+ {\complexorsimpleTable{RL}}
+
+\def\simpleTableRL
+ {\BL[\the\maxTABLEcolumn,r,\lastTABLEr]}
+
+\def\complexTableRL[#1]%
+ {\analyzeTABLEcrl{r}[#1]%
+ \handleTABLEcr}
+
+\def\checkTABLEgrayline#1#2%
+ {\!!doneatrue
+ \ifx#1\AR
+ \!!doneafalse
+ \else\ifx#1\SR\else\ifx#1\FR\else\ifx#1\MR\else\ifx#1\LR\else
+ \!!doneafalse
+ \fi\fi\fi\fi\fi
+ \if!!donea
+ \gdef\TABLEgraylinestatus
+ {[\string#1]}%
+ \gdef\TABLEendBCL
+ {#1}%
+ \else
+ \gdef\TABLEgraylineerror
+ {[\string#2\string#1->\string#2\string\SR]}%
+ \gdef\TABLEendBCL
+ {\SR}%
+ \fi}
+
+\def\endTABLErowGL#1#2#3%
+ {\ifcase#1\relax
+ % unknown
+ \or
+ \doPreTableGL\TABLErowfactor\TABLErowfactor
+ \or
+ \doPreTableGL\TABLErowfactor\TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \doPreTableGL\TABLErowzero\TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \doPreTableGL\TABLErowfactor\TABLErowzero
+ \else
+ \doPreTableGL\TABLErowzero\TABLErowzero
+ \fi\fi
+ \or
+ \doPreTableGL\TABLErowzero\TABLErowfactor
+ \fi}
+
+\def\doPreTableGL#1#2% betere namen
+ {\xdef\OldLineThicknessFactor{\the\LineThicknessFactor}%
+ \xdef\OldLineThicknessUnit{\the\LineThicknessUnit}%
+ \global\LineThicknessFactor\plusone
+ \setbox0\hbox{\AugmentedTableStrut{#1}{#2}}%
+ \getboxheight\dimen0\of\box0\relax
+ \xdef\TABLEgraylineHeight{\the\dimen0}%
+ \global\LineThicknessUnit\TABLEgraylineHeight}
+
+\def\doPostTableGL
+ {\global\LineThicknessFactor\OldLineThicknessFactor
+ \global\LineThicknessUnit \OldLineThicknessUnit}
+
+% kan simpeler
+
+\def\docomplexTableCOLOR[#1]%
+ {\dodocomplexTableGL\startcolor \stopcolor [#1,\lastTABLEc,,]}
+
+\gdef\docomplexTableRASTER[#1]%
+ {\dodocomplexTableGL\startraster\stopraster[#1,\lastTABLEr,,]}
+
+\def\dodocomplexTableGL#1#2[#3,#4,#5,#6]%
+ {\doifelsenothing{#4}{#1[#5]}{#1[#4]}%
+ \doPreTableGL\TABLEendofrowheight\TABLEendofrowdepth
+ \ifnum#3=\plusone % else conflict with \omit in \=
+ \let\next\normalTABLEsinglerule
+ \else
+ \def\next{\normalTABLEmultirule{#3}}%
+ \fi
+ \next
+ \doPostTableGL
+ #2}
+
+\def\TableBACKGROUND
+ {\TableBR}
+
+\def\simpleTableRASTER #1{\docomplexTableRASTER[1]#1}
+\def\complexTableRASTER[#1]{\docomplexTableRASTER[#1]}
+\def\simpleTableCOLOR {\docomplexTableCOLOR [1]}
+\def\complexTableCOLOR [#1]{\docomplexTableCOLOR [#1]}
+
+\def\TableRASTER{\complexorsimpleTable{RASTER}}
+\def\TableCOLOR {\complexorsimpleTable{COLOR}}
+
+\def\addtoTABLEgrayline#1%
+ {\TABLEgraytoks\expandafter{\TABLEgrayline}%
+ \xdef\TABLEgrayline{\the\TABLEgraytoks\noexpand#1}}
+
+\def\setTableBCL#1#2%
+ {\ifx#1#2%
+ \gdef\TABLEgraylinestatus{[\string#1]}%
+ \gdef\TABLEendBCL{#1}%
+ \addtoTABLEgrayline{#1}%
+ \else
+ \gdef\TABLEgraylineerror{[\string#1->\string#2]}%
+ \gdef\TABLEendBCL{#2}%
+ \addtoTABLEgrayline{#2}%
+ \fi}
+
+\def\gobbleTableBCL#1%
+ {\ifx#1\BC \let\next\doTableBC \else
+ \ifx#1\BL \let\next\doTableBL \else
+ \ifx#1\SR \setTableBCL\SR\SR \let\next\egroup \else
+ \ifx#1\FR \setTableBCL\FR\FR \let\next\egroup \else
+ \ifx#1\MR \setTableBCL\MR\MR \let\next\egroup \else
+ \ifx#1\LR \setTableBCL\LR\LR \let\next\egroup \else
+ \setTableBCL #1\SR \let\next\egroup
+ \fi\fi\fi\fi\fi\fi
+ \next}
+
+\def\executeTABLEgrayline
+ {\TABLEnoalign
+ {\def\BC
+ {\advance\currentTABLEcolumn \plusone}%
+ \def\dodocomplexTableGL##1##2[##3,##4,##5,##6]%
+ {\BC\advance\currentTABLEcolumn ##3 }%
+ \let\endTABLErow\endTABLEgrayrow
+ \currentTABLEcolumn\zerocount
+ \TABLEgrayline\TABLEendBCL % determine n of columns and height
+ \advance\currentTABLEcolumn \minusone
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ % error message too long line
+ \globalletempty\TABLEgrayline
+ \else
+ % \message{n of color columns: \the\currentTABLEcolumn}\wait
+ \global\TABLEgraylinetrue % vanaf hier nog checken
+ \fi
+ \global\currentTABLEcolumn\zerocount}%
+ \unskip\TABLEgrayline\TABLEendBCL
+ \TABLEnoalign
+ {\nobreak
+ \vskip-\TABLEgraylineHeight
+ \nobreak
+ \global\setTABLEactiontrue
+ \global\currentTABLEcolumn\zerocount
+ \globalletempty\nextTABLEgrayline
+ \global\TABLEgraydonetrue
+ \global\TABLEgraylinefalse}}
+
+\def\endTABLEgrayrow#1#2#3%
+ {\ifcase#1\relax
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \or
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \or
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \global\chardef\TABLEendofrowheight\TABLErowzero
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \global\chardef\TABLEendofrowheight\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth \TABLErowzero
+ \else
+ \global\chardef\TABLEendofrowheight\TABLErowzero
+ \global\chardef\TABLEendofrowdepth \TABLErowzero
+ \fi\fi
+ \or
+ \global\chardef\TABLEendofrowheight\TABLErowzero
+ \global\chardef\TABLEendofrowdepth \TABLErowfactor
+ \fi}
+
+\unexpanded\def\defineTABLEshorthands%
+ {\def\SPAN##1{\use{##1}}%
+ \def\TWO {\use2}%
+ \def\THREE {\use3}%
+ \def\FOUR {\use4}%
+ \def\FIVE {\use5}%
+ \def\SIX {\use6}%
+ \def\REF {\ReFormat}}
+
+\unexpanded\def\defineTABLEunits
+ {\processaction
+ [\@@tidistance]
+ [ \v!none=>\OpenUp00\def\LOW{\Lower6 },
+ \v!small=>\OpenUp00\def\LOW{\Lower6 }, % == baseline
+ \v!medium=>\OpenUp11\def\LOW{\Lower7 },
+ \v!big=>\OpenUp22\def\LOW{\Lower8 }]%
+ \doifelse\@@tidistance\v!none
+ {\chardef\TABLErowfactor\zerocount}
+ {\chardef\TABLErowfactor\plustwo }}
+
+\def\dohandlebar % here ?
+ {\ifmmode
+ \@EA\domathmodebar
+ \else\ifintable
+ \@EAEAEA\domathmodebar
+ \else
+ \@EAEAEA\dotextmodebar
+ \fi\fi}
+
+% De macro's t.b.v. instellingen.
+
+\unexpanded\def\setuptables
+ {\dosingleargument\dosetuptables}
+
+\def\dosetuptables[#1]%
+ {\getparameters[\??ti][#1]%
+ \processaction
+ [\@@tialign]
+ [ \v!right=>\def\TABLEparalignment{\raggedright},
+ \v!left=>\def\TABLEparalignment{\raggedleft},
+ \v!middle=>\def\TABLEparalignment{\raggedcenter},
+ \s!default=>\def\TABLEparalignment{\notragged},
+ \s!unknown=>\def\TABLEparalignment{\notragged}]%
+ \assignalfadimension\@@tiVL\@@tiVLwidth 246%
+ \assignalfadimension\@@tiHL\@@tiHLheight246}
+
+\def\localTABLEsetup
+ {\@@ticommands\relax
+ \expanded{\switchtobodyfont[\@@tibodyfont]}%
+ \StrutHeightFactor 8
+ \StrutDepthFactor 4
+ \LineThicknessFactor4
+ \NormalTLTU {.1pt}%
+ \NormalTSU {\normalbaselineskip\divide\StrutUnit 12 }%
+ \NormalTableUnits}
+
+%D And then I wrote the tabulate environment. That
+%D alternative supports setting the rule thickness and color,
+%D so here is the table alternative.
+
+\let\startglobalTABLEcolor\empty
+\let\stopglobalTABLEcolor \empty
+
+\def\localTABLEsetup
+ {\@@ticommands\relax
+ % bodyfont
+ \expanded{\switchtobodyfont[\@@tibodyfont]}%
+ % linecolor
+ \doifsomething\@@tirulecolor
+ {\unexpanded\def\startglobalTABLEcolor{\startcolor[\@@tirulecolor]}%
+ \unexpanded\def\stopglobalTABLEcolor {\stopcolor}}%
+ % linethickness
+ \LineThicknessFactor4
+ \scratchdimen\@@tirulethickness
+ \divide\scratchdimen \LineThicknessFactor
+ \expanded{\NormalTLTU{\the\scratchdimen}}%
+ % spacing, was depth=4 height=8 (counters, sigh, now macros)
+ \doifelse\@@tiheight\v!strut
+ {\let\StrutHeightFactor\strutheightfactor}
+ {\let\StrutHeightFactor\@@tiheight}%
+ \doifelse\@@tidepth\v!strut
+ {\let\StrutDepthFactor\strutdepthfactor}
+ {\let\StrutDepthFactor\@@tidepth}%
+ \scratchdimen\StrutHeightFactor\points \multiply\scratchdimen 10%
+ \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}%
+ \scratchdimen\StrutDepthFactor \points \multiply\scratchdimen 10%
+ \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}%
+ % units
+ \NormalTSU{\normalbaselineskip\divide\StrutUnit 12 }%
+ \NormalTableUnits}
+
+\def\OpenUp#1#2%
+ {\scratchdimen\StrutHeightFactor \points \advance\scratchdimen #1\points
+ \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}%
+ \scratchdimen\StrutDepthFactor \points \advance\scratchdimen #2\points
+ \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}}
+
+%D As one can see, we didn't only add color, but also more
+%D control over spacing.
+%D
+%D \startbuffer[a]
+%D \starttable[|c|]
+%D \HL
+%D \VL \strut test \VL \FR
+%D \VL \strut test \VL \MR
+%D \VL \strut test \VL \MR
+%D \VL \strut test \VL \LR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \starttabulate[|c|]
+%D \HL
+%D \NC test \NC \NR
+%D \NC test \NC \NR
+%D \NC test \NC \NR
+%D \NC test \NC \NR
+%D \HL
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D In the next example, the first table is defined as:
+%D
+%D \typebuffer[a]
+%D
+%D and the second one as:
+%D
+%D \typebuffer[b]
+%D
+%D The first table is typeset using the default height and
+%D depth factors .8 and .4. The second table has both factors
+%D set to \type {strut}, and the third table shows what
+%D happens when we set the values to zero. The rightmost table
+%D is typeset using the tabulate environment.
+%D
+%D \startcombination[4*1]
+%D {$\vcenter{\getbuffer[a]}$}
+%D {\hbox{h=.8 d=.4}}
+%D {\setuptables[height=strut,depth=strut]$\vcenter{\getbuffer[a]}$}
+%D {\hbox{h=d=\type{strut}}}
+%D {\setuptables[height=0,depth=0]$\vcenter{\getbuffer[a]}$}
+%D {\hbox{h=d=0}}
+%D {$\vcenter{\getbuffer[b]}$}
+%D {\hbox{tabulate}}
+%D \stopcombination
+
+\setuptables
+ [HL=\v!medium,
+ VL=\v!medium,
+ NL=\v!small,
+ \c!frame=,
+ \c!align=\v!right,
+ \c!depth=.40, % \v!strut
+ \c!height=.80, % \v!strut
+ \c!rulethickness=\linewidth,
+ \c!rulecolor=,
+ \c!distance=\v!medium,
+ \c!bodyfont=\the\bodyfontsize,
+ \c!commands=,
+ \c!background=\v!screen,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!backgroundcolor=,
+ \c!split=\v!auto]
+
+\def\ifintabel{\ifintable} % upward compatible
+
+\protect \endinput
diff --git a/tex/context/base/tabl-tbl.mkii b/tex/context/base/tabl-tbl.mkii
new file mode 100644
index 000000000..09fa4105c
--- /dev/null
+++ b/tex/context/base/tabl-tbl.mkii
@@ -0,0 +1,1440 @@
+%D \module
+%D [ file=core-tbl,
+%D version=1998.11.03,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Text Flow Tabulation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / Tabulation}
+
+% \processbetween gebruiken in head/tail macros
+
+\unprotect
+
+% WATCH OUT: don't change this model else trialtypesetting
+% compatibility problems
+
+% watch out, cells expand pretty late on a per row basis
+
+% |p2|p3| 2:3
+% spanning
+
+% Be careful with changing the hsize calculation in p mode;
+% the following code works quite well:
+%
+% \setupfield [line][location=low,height=1.2\lineheight,width=\hsize]
+% \definefield [test] [line] [line] []
+%
+% \starttabulate[|l|p|]
+% \NC test \NC \field [test] \NC \NR
+% \stoptabulate
+
+% In-text tabbing environment
+%
+% \starttabulate[| separated template] % eg [|l|p|] or [|l|p|p|]
+% \NC ... \NC ... \NC\NR
+% \stoptabulate
+%
+% with: two pass auto width calculation when no p-width
+% specified, even with multiple p's, see examples.
+
+% TaBlE compatible specifications:
+%
+% l align column/paragraph left
+% r align column/paragraph right
+% c align column/paragraph center
+% p p(dimen) of automatisch als alleen p
+% w column width
+% f font#1
+% B bold
+% I italic
+% S slanted
+% T type
+% R roman
+% m math
+% M display math
+% h hook (inner level or par lines)
+% b before (may be command#1)
+% a after
+% i i<n> skip left of column
+% j i<n> skip right of column
+% k i<n> skip around column
+
+% s setups
+
+% g g{char} align at char
+% . align at .
+% , align at ,
+
+% Still to be done
+
+% N math numbers (best hook into existing digits mechanism)
+% n numbers (best hook into existing digits mechanism)
+% Q math numbers (best hook into existing digits mechanism)
+% q numbers (best hook into existing digits mechanism)
+% ~ \hskip.5em
+% | check
+
+% nesting
+
+% 10 evt auto stack; dan wel andere signal dan void nodig
+
+% present but not yet 100% ok
+%
+% \FL top hrule
+% \ML mid hrule (with auto split)
+% \LL bottom hrule
+% \HL
+
+% \VL as soon as needed
+% color as soon as needed
+
+% \EQ \RQ \HQ equal (raw, hook)
+% \NC \RC \HC normal (raw, hook)
+%
+% \NR
+
+% \HR : rule with lineheight
+
+% \autotabulaterule : with lineheight, not first/last
+% \autotabulateline : spaced, not first/last
+% \tabulaterule : with lineheight
+% \tabulateline : spaced
+
+% tricky: align scans ahead, over # and expands ones before
+% while doing
+
+% new:
+%
+% \starttabulate[|cg{.}|cg{,}|cg{,}|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+%
+% \starttabulate[|c.|c,|c,|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+
+% nice demo (for BG)
+%
+% \starttabulate[|r|b{$\star$}|ra{\percent}|b{=}|r|]
+% \NC 500 \NC \NC 60 \NC \NC 300 \NC \NR
+% \NC 500 \NC \NC 55 \NC \NC 275 \NC \NR
+% \NC 500 \NC \NC 50 \NC \NC 250 \NC \NR
+% \NC 500 \NC \NC 45 \NC \NC 225 \NC \NR
+% \NC 500 \NC \NC 40 \NC \NC 200 \NC \NR
+% \NC 500 \NC \NC 35 \NC \NC 175 \NC \NR
+% \NC 500 \NC \NC 30 \NC \NC 150 \NC \NR
+% \NC 500 \NC \NC 25 \NC \NC 125 \NC \NR
+% \NC 500 \NC \NC 20 \NC \NC 100 \NC \NR
+% \stoptabulate
+
+\newtoks \tabulatepreamble
+\newtoks \tabulatebefore
+\newtoks \tabulateafter
+\newtoks \tabulatebmath
+\newtoks \tabulateemath
+\newtoks \tabulatefont
+\newtoks \tabulatesettings
+\newtoks \tabulatedummy
+
+\newcount \nofautotabulate
+\newcount \tabulatecolumns
+\newcount \tabulatecolumn
+
+\newcount \tabulateminplines
+\newcount \tabulatemaxplines
+
+\newif \ifautotabulate
+\newif \ifsplittabulate \splittabulatetrue
+
+\newif \ifhandletabulatepbreak \handletabulatepbreaktrue
+\newif \iftabulatenopbreak \tabulatenopbreakfalse
+
+\newif \iftabulateequal
+\newif \iftracetabulate
+\newif \ifframedtabulate
+
+\newdimen \tabulatepwidth
+\newdimen \tabulatewidth
+\newdimen \tabulateunit
+\newdimen \tabulatemaxpheight
+
+\newbox \tabulatebox
+
+% [|lg{.}|] => \NG 12.34 \NC
+
+\gdef\handletabulatecharalign#1 % space delimited !
+ {\edef\alignmentclass{\the\tabulatecolumn}%
+ \edef\alignmentcharacter{\getvalue{\@@tabalign@@\the\tabulatecolumn}}%
+ \ifcase\tabulatepass\or
+ \setfirstpasscharacteralign\checkalignment{#1}%
+ \fi % force hsize
+ \setsecondpasscharacteralign\checkalignment{#1}}
+
+\def\noftabcolumns{16}
+
+\def\@@tabbox@@ {@@tabbox@}
+\def\@@tabhook@@ {@@tabhook@}
+\def\@@tabalign@@ {@@tabalign@}
+\def\@@tabsetups@@{@@tabsetups@}
+
+% \dorecurse\noftabcolumns % quick and dirty stack
+% {\@EA\newbox\csname\@@tabbox@@\recurselevel\endcsname}
+
+\def\tablebox#1%
+ {\csname\@@tabbox@@\number#1\endcsname}
+
+% \def\checktablebox#1%
+% {\ifundefinedelse{\@@tabbox@@\number#1}%
+% \expandafter\newbox\csname\@@tabbox@@\number#1\endcsname
+% \fi}
+
+\def\initializetablebox#1% also used elsewhere
+ {\ifcsname\@@tabbox@@\number#1\endcsname
+ \global\setbox\csname\@@tabbox@@\number#1\endcsname\emptybox
+ \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%
+ {\scratchcounter#1\relax
+ \doinitializetableboxes}
+
+\def\doinitializetableboxes
+ {\ifnum\scratchcounter>\zerocount
+ \initializetablebox\scratchcounter
+ \advance\scratchcounter\minusone
+ \expandafter\doinitializetableboxes
+ \fi}
+
+\initializetableboxes\noftabcolumns
+
+\def\dotabulatenobreak
+ {\noalign
+ {\nobreak
+ \iftracetabulate
+ \red\hrule\!!height.5\linewidth\!!depth.5\linewidth
+ \par
+ \kern-\linewidth
+ \nobreak
+ \fi}}
+
+\let\notabulatehook\empty
+
+\def\checktabulatehook
+ {\ifnum\tabulatetype<\plustwo
+ \global\let\tabulatehook\notabulatehook
+ \else
+ \global\let\tabulatehook\dotabulatehook
+ \fi}
+
+\def\checktabulatesetups
+ {\getvalue{\@@tabsetups@@\the\tabulatecolumn}}
+
+\let\pretabrule \donothing
+\let\posttabrule\donothing
+
+\def\dodosettabulatepreamble#1#2%
+ {\ifzeropt\tabulatewidth
+ \ifcase\tabulatemodus\relax
+ \let\preamblebox\empty
+ \else
+ \def\preamblebox{\autotabulatetrue}%
+ \fi
+ \else
+ \ifcase\tabulatemodus\relax
+ \edef\preamblebox{\hbox to \the\tabulatewidth}%
+ \else
+ \edef\preamblebox{\hsize\the\tabulatewidth}%
+ \fi
+ \fi
+ %
+ % less bytes
+ %
+ %\edef\preamblebox%
+ % {\ifcase\tabulatewidth
+ % \ifcase\tabulatemodus\relax\else\noexpand\autotabulatetrue\fi
+ % \els
+ % \ifcase\tabulatemodus\relax\hbox to\else\hsize\fi\the\tabulatewidth
+ % \fi}%
+ %
+ % 0 = NC column next EQ equal column
+ % 1 = RC column raw RQ equal column raw
+ % 2 = HC column hook HQ equal column hook
+ % some entries can be left out if we test for them being set
+ \@EA\appendtoks \@EA&\@EA\hskip\pretabskip\pretabrule##&\to\!!toksa
+ \appendtoks \ignorespaces\to\!!toksa
+ \@EA\appendtoks\@EA\global\@EA\tabulatecolumn\the\tabulatecolumns\relax\to\!!toksa
+ \appendtoks \checktabulatesetups\to\!!toksa
+ \appendtoks \checktabulatehook\to\!!toksa
+ \@EA\appendtoks \preamblebox\to\!!toksa
+ \appendtoks \bgroup\bbskip\bgroup#1\to\!!toksa
+ \appendtoks\ifnum\tabulatetype=\plusone \else \to\!!toksa
+ \@EA\appendtoks \the\tabulatebmath\to\!!toksa
+ \@EA\appendtoks \the\tabulatefont\to\!!toksa
+ \@EA\appendtoks \the\tabulatesettings\to\!!toksa
+ \@EA\appendtoks \the\tabulatebefore\to\!!toksa
+ \appendtoks\fi \to\!!toksa
+ \appendtoks \bgroup\ignorespaces\to\!!toksa
+ %
+ \appendtoks \tabulatehook##\to\!!toksa
+ %
+ %%\doifdefinedelse{\@@tabalign@@\tabulatecolumns}
+ %\doifdefinedelse{\@@tabalign@@\the\tabulatecolumns}
+ % {\appendtoks\handletabulatecharalign## \to\!!toksa}
+ % {\appendtoks\tabulatehook ##\to \!!toksa}%
+ % waarom kan ik hier geen \xx{##} geven, om een of
+ % andere reden passeert dan tex de hele regel (incl \NC's)
+ % als argument; elke delimiter <> space gaat trouwens fout
+ \appendtoks \unskip\unskip\ifmmode\else\endgraf\fi\egroup\to\!!toksa
+ \appendtoks\ifnum\tabulatetype=1 \else \to\!!toksa
+ \@EA\appendtoks \the\tabulateafter\to\!!toksa
+ \@EA\appendtoks \the\tabulateemath\to\!!toksa
+ \appendtoks\fi \to\!!toksa
+ \appendtoks #2\egroup\egroup\to\!!toksa
+ \@EA\appendtoks \@EA&\@EA\posttabrule\@EA\hskip\postabskip##\to\!!toksa
+ \appendtoks\NC\to\tabulatedummy
+ \let\bbskip\empty
+ \def\pretabskip{.5\tabulateunit}%
+ \let\postabskip\pretabskip
+ \let\gettabulateexit\dogettabulateexit
+ \tabulatewidth\zeropoint}
+
+% 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
+ \else
+ \let\nextnext\settabulatepreamble
+ \ifx x\next \let\tabulatealign\zerocount % internal
+ \else\ifx l\next \let\tabulatealign\plusone
+ \else\ifx r\next \let\tabulatealign\plustwo
+ \else\ifx c\next \let\tabulatealign\plusthree
+ \else\ifx p\next \let\nextnext\gettabulateparagraph
+ \else\ifx s\next \let\nextnext\gettabulatesetups
+ \else\ifx w\next \let\nextnext\gettabulatewidth
+ \else\ifx f\next \let\nextnext\gettabulatefont
+ \else\ifx B\next \tabulatefont{\bf}%
+ \else\ifx I\next \tabulatefont{\it}%
+ \else\ifx S\next \tabulatefont{\sl}%
+ \else\ifx T\next \tabulatefont{\tt}%
+ \else\ifx R\next \tabulatefont{\rm}%
+ \else\ifx m\next \tabulatebmath{$}\tabulateemath{$}%
+ \else\ifx M\next \tabulatebmath{$\displaystyle}\tabulateemath{$}%
+ \else\ifx h\next \let\nextnext\gettabulatehook
+ \else\ifx b\next \let\nextnext\gettabulatebefore
+ \else\ifx a\next \let\nextnext\gettabulateafter
+ \else\ifx i\next \let\nextnext\gettabulatepreskip
+ \else\ifx j\next \let\nextnext\gettabulateposskip
+ \else\ifx k\next \let\nextnext\gettabulatepreposskip
+ \else\ifx X\next \let\nextnext\gettabulateexit % internal
+ \else\ifx e\next \appendtoks\global\tabulateequaltrue\to\tabulatesettings
+ \else\ifx ~\next \appendtoks\fixedspaces\to\tabulatesettings
+ \else\ifx g\next \let\nextnext\gettabulatealign
+ \else\ifx .\next \def\nextnext{\gettabulatealign.}%
+ \else\ifx ,\next \def\nextnext{\gettabulatealign,}%
+ \else \message{unknown preamble key [\meaning\next]}%
+ \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi \fi\fi
+ \fi
+ \nextnext}
+
+\def\dogettabulateexit
+ {\let\postabskip\!!zeropoint
+ \settabulatepreamble}
+
+\let\gettabulateexit\dogettabulateexit
+
+\def\gettabulatepreskip#1%
+ {\doifnumberelse{#1}
+ {\scratchdimen#1\tabulateunit\let\next\empty}
+ {\scratchdimen.5\tabulateunit\def\next{#1}}%
+ \edef\pretabskip{\the\scratchdimen}%
+ \@EA\settabulatepreamble\next}
+
+\def\gettabulateposskip#1%
+ {\doifnumberelse{#1}
+ {\scratchdimen#1\tabulateunit\let\next\empty}
+ {\scratchdimen.5\tabulateunit\def\next{#1}}%
+ \edef\postabskip{\the\scratchdimen}%
+ \let\gettabulateexit\settabulatepreamble
+ \@EA\settabulatepreamble\next}
+
+\def\gettabulatepreposskip#1%
+ {\doifnumberelse{#1}
+ {\scratchdimen#1\tabulateunit\let\next\empty}
+ {\scratchdimen.5\tabulateunit\def\next{#1}}%
+ \edef\pretabskip{\the\scratchdimen}%
+ \let\postabskip\pretabskip
+ \let\gettabulateexit\settabulatepreamble
+ \@EA\settabulatepreamble\next}
+
+\def\gettabulatesetups#1%
+ {\setvalue{\@@tabsetups@@\the\tabulatecolumns}{\setups[#1]}%
+ \settabulatepreamble}
+
+\def\gettabulatehook#1%
+ {\setvalue{\@@tabhook@@\the\tabulatecolumns}{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatealign#1%
+ {\setvalue{\@@tabalign@@\the\tabulatecolumns}{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatebefore#1%
+ {\tabulatebefore{#1}%
+ \settabulatepreamble}
+
+\def\gettabulateafter#1%
+ {\tabulateafter{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatefont#1%
+ {\tabulatefont{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatewidth
+ {\let\tabulatemodus\zerocount
+ \let\tabulatedimen\zerocount
+ \doifnextcharelse(\dogettabulatewidth\settabulatepreamble}
+
+\def\gettabulateparagraph
+ {\doifnextcharelse{(}
+ {\let\tabulatemodus\plusone
+ \let\tabulatedimen\plusone
+ \dogettabulatewidth}
+ {\let\tabulatemodus\plustwo
+ \let\tabulatedimen\zerocount
+ \settabulatepreamble}}
+
+% \def\dogettabulatewidth(#1)%
+% {\tabulatewidth#1\relax
+% \ifnum\tabulatedimen=\plusone
+% \global\advance\tabulatepwidth\tabulatewidth
+% \fi
+% \settabulatepreamble}
+
+% \def\dogettabulatewidth(#1)%
+% {\doifelse{#1}\v!passend
+% {\let\tabulatemodus\plusthree}
+% {\tabulatewidth#1\relax}%
+% \ifnum\tabulatedimen=\plusone
+% \global\advance\tabulatepwidth\tabulatewidth
+% \fi
+% \settabulatepreamble}
+
+% \startbuffer
+% \toplinebox{\framed[width=3cm,height=2cm]{tufte}}
+% \stopbuffer
+% \starttabulate[|p(fixed)|p|]
+% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR}
+% \stoptabulate
+% \starttabulate[|p(fit)|p|]
+% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR}
+% \stoptabulate
+
+\def\dogettabulatewidth(#1)%
+ {\processallactionsinset
+ [#1]%
+ [ \v!fit=>\let\tabulatemodus\plusthree,
+ \v!fixed=>\let\tabulatemodus\plusthree
+ \tabulatenopbreaktrue,
+ \s!unknown=>\tabulatewidth#1\relax]%
+ \ifnum\tabulatedimen=\plusone
+ \global\advance\tabulatepwidth\tabulatewidth
+ \fi
+ \settabulatepreamble}
+
+\def\settabulatepreamble
+ {\afterassignment\dosettabulatepreamble\let\next=}
+
+\def\tabulateraggedright {\ifnum\tabulatetype=\plusone \else\raggedright \fi}
+\def\tabulateraggedcenter{\ifnum\tabulatetype=\plusone \else\raggedcenter\fi}
+\def\tabulateraggedleft {\ifnum\tabulatetype=\plusone \else\raggedleft \fi}
+\def\tabulatenotragged {\ifnum\tabulatetype=\plusone \else\notragged \fi}
+\def\tabulatehss {\ifnum\tabulatetype=\plusone \else\hss \fi} % never change this to a fill
+
+\bgroup \catcode`\|=\@@other
+
+\gdef\nexttabulate#1|%
+ {\let\tabulatealign\@@tabulatealign
+ \let\tabulatemodus\zerocount
+ \let\tabulatedimen\zerocount
+ \tabulatebefore \emptytoks
+ \tabulateafter \emptytoks
+ \tabulatebmath \emptytoks
+ \tabulateemath \emptytoks
+ \tabulatefont \emptytoks
+ \tabulatesettings\emptytoks
+ \global\advance\tabulatecolumns\plusone
+ \letvalue{\@@tabsetups@@\the\tabulatecolumns}\donothing
+ \settabulatepreamble#1\relax\relax % permits i without n
+ \ifcase\tabulatemodus\relax
+ \ifcase\tabulatealign\relax
+ \dodosettabulatepreamble\empty \tabulatehss \or
+ \dodosettabulatepreamble\empty \tabulatehss \or
+ \dodosettabulatepreamble\tabulatehss\empty \or
+ \dodosettabulatepreamble\tabulatehss\tabulatehss \fi
+ \or % fixed width
+ \ifcase\tabulatealign\relax
+ \dodosettabulatepreamble \bskip \eskip \or
+ \dodosettabulatepreamble{\bskip\tabulateraggedright }\eskip \or
+ \dodosettabulatepreamble{\bskip\tabulateraggedleft }\eskip \or
+ \dodosettabulatepreamble{\bskip\tabulateraggedcenter}\eskip \fi
+ \or % auto width
+ \global\advance\nofautotabulate\plusone
+ \ifcase\tabulatealign\relax
+ \dodosettabulatepreamble \bskip \eskip \or
+ \dodosettabulatepreamble{\bskip\tabulateraggedright }\eskip \or
+ \dodosettabulatepreamble{\bskip\tabulateraggedleft }\eskip \or
+ \dodosettabulatepreamble{\bskip\tabulateraggedcenter}\eskip \fi
+ \or % simple
+ \dodosettabulatepreamble \xbskip \xeskip
+ \fi
+ \futurelet\next\donexttabulate}
+
+\egroup
+
+\def\donexttabulate
+ {\ifx\next\relax\else
+ \expandafter\nexttabulate
+ \fi}
+
+\def\splitofftabulatebox % overloaded in anch-pgr
+ {\dontcomplain
+ \global\setbox\tabulatebox % % % global ? % % %
+ \vsplit\tablebox\tabulatecolumn to \lineheight
+ \setbox\tabulatebox\normalvbox
+ {\unvbox\tabulatebox}%
+ \setbox\tabulatebox\hbox to \wd\tabulatebox
+ {\hss\dotabulatehook{\box\tabulatebox}\hss}%
+ \ht\tabulatebox\strutht
+ \dp\tabulatebox\strutdp
+ \box\tabulatebox}
+
+\def\dotabulatehook {\getvalue{\@@tabhook@@ \the\tabulatecolumn}}
+\def\dotabulatealign {\getvalue{\@@tabalign@@ \the\tabulatecolumn}}
+
+\def\resettabulatepheight
+ {\global\tabulateminplines\plusone
+ \getnoflines\tabulatemaxpheight
+ \global\tabulatemaxplines\noflines
+ \global\tabulatemaxpheight\zeropoint}
+
+\def\settabulatepheight
+ {\scratchdimen\ht\tablebox\tabulatecolumn\relax
+ \ifdim\scratchdimen>\tabulatemaxpheight
+ \global\tabulatemaxpheight\scratchdimen
+ \fi}
+
+\def\handletabulatepbreak
+ {\TABLEnoalign
+ {\ifhandletabulatepbreak
+ \iftabulatenopbreak
+ \dotabulatenobreak
+ \else\ifnum\tabulatemaxplines>\plusone
+ \ifnum\tabulateminplines=\plusone
+ \dotabulatenobreak
+ \fi
+ \global\advance\tabulateminplines\plusone
+ \ifnum\tabulateminplines=\tabulatemaxplines\relax
+ \dotabulatenobreak
+ \fi
+ \fi \fi
+ \fi}}
+
+%D \startbuffer
+%D \starttabulate[|c|p|p|]
+%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR
+%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR
+%D \NC 2 \NC \thinrules[n=3] \NC \thinrules[n=3] \NC\NR
+%D \NC 3 \NC oh yes \NC simply no \NC\NR
+%D \NC 4 \NC very true \NC as false as can be \NC\NR
+%D \NC 5 \NC \thinrules[n=5] \NC \thinrules[n=5] \NC\NR
+%D \NC 6 \NC \thinrules[n=3] \NC \thinrules[n=4] \NC\NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer {\tracetabulatetrue\getbuffer}
+%D
+%D \startbuffer
+%D \starttabulate[|c|p|p|]
+%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR
+%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR
+%D \NC 2 \NC oh yes \NC simply no \NC\NR
+%D \NC 3 \NC very true \NC as false as can be \NC\NR
+%D \NC 4 \NC the whole truth \NC but the truth \NC\NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer {\tracetabulatetrue\getbuffer}
+
+% \definetabulate
+% \redefinetabulate
+% \starttabulate[preamble]
+% \starttabulate -> \starttabulate[|l|p|]
+
+\bgroup \catcode`\|=\@@other
+
+\gdef\definetabulate
+ {\dotripleempty\dodefinetabulate}
+
+\gdef\dodefinetabulate[#1][#2][#3]%
+ {\ifthirdargument
+ \doifundefined{\??tt#1::\c!unit}
+ {\copyparameters
+ [\??tt#1::][\??tt\v!tabulate::]%
+ [\c!frame,\c!distance,\c!unit,\c!before,\c!bodyfont,\c!after,
+ \c!inner,\c!indenting,\c!margin,\c!align,\c!header,\c!title,
+ \c!rulecolor,\c!rulethickness,\c!split,EQ]}%
+ \copyparameters
+ [\??tt#1::#2][\??tt#1::]%
+ [\c!unit,\c!distance,\c!before,\c!bodyfont,\c!after,
+ \c!inner,\c!indenting,\c!frame,\c!split,\c!header,\c!title,
+ \c!margin,\c!align,\c!rulecolor,\c!rulethickness,EQ]%
+ \setvalue{\e!start#1::#2}{\dofinalstarttabulate[#1][#2][#3]}%
+ \setvalue{\e!start#1}{\bgroup\dosubstarttabulate[#1]}%
+ \letvalue{\??tt#1-\v!header}\empty
+ \letvalue{\??tt#1-\v!footer }\empty
+ \else\ifsecondargument
+ \definetabulate[#1][][#2]%
+ \else
+ \definetabulate[#1][][|l|p|]%
+ \fi\fi}
+
+\egroup
+
+\let\tabulateheadcontent\empty
+\let\tabulatetailcontent\empty
+
+\newconditional\tabulatesomeamble
+
+\def\checkfulltabulatecontent % - needed, else confusion with \c!header
+ {\ifundefined{\??tt\currenttabulate-\v!header}%
+ \let\tabulateheadcontent\empty
+ \else
+ \def\tabulateheadcontent
+ {\TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ \csname\??tt\currenttabulate-\v!header\endcsname
+ \TABLEnoalign{\global\setfalse\tabulatesomeamble}}%
+ \fi
+ \ifundefined{\??tt\currenttabulate-\v!footer}%
+ \let\tabulatetailcontent\empty
+ \else
+ \def\tabulatetailcontent
+ {\TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ \csname\??tt\currenttabulate-\v!footer\endcsname
+ \TABLEnoalign{\global\setfalse\tabulatesomeamble}}%
+ \fi}
+
+% \def\fulltabulatecontent
+% {\tabulateheadcontent
+% \tabulatecontent
+% \tabulatetailcontent}
+
+\def\fulltabulatecontent
+ {\tabulateheadcontent
+ \tabulatecontent
+ \tabulatetailcontent
+ \removefunnytabulateline}
+
+\def\removefunnytabulateline
+ {\ifhmode
+ \strut\crcr
+ \TABLEnoalign{\kern-\lineheight}%
+ \fi}
+
+\setvalue{\e!start\v!tabulatehead}%
+ {\dosingleempty\dostartstarttabulatehead}
+
+\def\dostartstarttabulatehead[#1]%
+ {\processcontent{\e!stop\v!tabulatehead}\next
+ {\letvalue{\??tt\iffirstargument#1\else\v!tabulate\fi::-\v!header}\next}}
+
+\setvalue{\e!start\v!tabulatetail}%
+ {\dosingleempty\dostartstarttabulatetail}
+
+\def\dostartstarttabulatetail[#1]%
+ {\processcontent{\e!stop\v!tabulatetail}\next
+ {\letvalue{\??tt\iffirstargument#1\else\v!tabulate\fi::-\v!footer}\next}}
+
+\def\dosubstarttabulate
+ {\dodoubleempty\dodosubstarttabulate}
+
+\def\dodosubstarttabulate[#1][#2]%
+ {\getvalue{\e!start#1::\ifundefined{\e!start#1::#2}\else#2\fi}}
+
+\setvalue{\e!start\v!tabulate}%
+ {\bgroup\dodoubleempty\donormalstarttabulate}
+
+\bgroup
+
+\gdef\donormalstarttabulate[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??tt\v!tabulate::][#2]%
+ \fi
+ \iffirstargument
+ \def\next{\dofinalstarttabulate[\v!tabulate][][#1]}%
+ \else
+ \def\next{\dofinalstarttabulate[\v!tabulate][][|l|p|]}%
+ \fi
+ \next}
+
+\egroup
+
+% The much neede hook:
+
+\newtoks\everytabulate
+
+% An example of its usage:
+
+\appendtoks \optimizeverbatimfalse \to \everytabulate
+\appendtoks \let\recodeverbatimmode\plustwo \to \everytabulate
+
+% A status variable:
+
+\chardef\tabulatepass=0
+
+\def\tabulateparameter#1{\csname\??tt\currenttabulate#1\endcsname}
+
+\bgroup
+ \catcode`\|=\@@other \gdef\@@otherbar{|}
+ \catcode`\|=\@@active \gdef\@@useotherbar{\let|\@@otherbar}
+\egroup
+
+\def\dofinalstarttabulate[#1][#2][#3]% identifier sub preamble
+ {\edef\currenttabulate{#1::#2}%
+ \ifinsidefloat \else
+ \whitespace
+ \tabulateparameter\c!before
+ \fi
+ \bgroup
+ \resetcharacteralign
+ % todo: spacing around tabulate when bodyfont is set
+ % expansion en test needed ?
+ \splittabulatetrue
+ \processaction
+ [\tabulateparameter\c!split]
+ [% \v!yes=>\splittabulatetrue,
+ % \v!repeat=>\splittabulatetrue, % todo, default yes
+ \v!no=>\splittabulatefalse,
+ \v!auto=>\ifinsidefloat\ifinsidesplitfloat\else\splittabulatefalse\fi\fi]%
+ \doifvaluesomething{\??tt\currenttabulate\c!bodyfont}
+ {\expanded{\switchtobodyfont[\tabulateparameter\c!bodyfont]}}%
+ \postponenotes % new, to be tested / will be configurable
+ \let\tabulatepass\plusone
+ \widowpenalty\zerocount % otherwise lines are not broken
+ \clubpenalty \zerocount % but overlap in funny ways
+ \the\everytabulate
+ \tabulateparameter\c!inner
+ \scratchdimen\leftskip
+ \advance\scratchdimen \hangindent
+ \doifvalue{\??tt\currenttabulate\c!indenting}\v!yes
+ {\advance\scratchdimen \parindent}% \ctxparindent
+ \edef\tabulateindent{\the\scratchdimen}%
+ \!!toksb\emptytoks
+ \def\dorepeat*##1##2%
+ {\dorecurse{##1}{\appendtoks##2\to\!!toksb}\do}%
+ \def\do
+ {\futurelet\next\dodo}%
+ \def\dodo % \@EAEAEA gebruiken
+ {\ifx\next\relax
+ % exit
+ \else\ifx*\next
+ \let\next\dorepeat
+ \else\ifx\bgroup\next
+ \let\next\dododo
+ \else
+ \let\next\dodododo
+ \fi\fi\fi
+ \next}%
+ \def\dododo##1%
+ {\appendtoks{##1}\to\!!toksb\do}%
+ \def\dodododo##1%
+ {\appendtoks##1\to\!!toksb\do}%
+ \global\tabulatecolumn\zerocount
+% \do#3\relax
+\bgroup\@@useotherbar\expanded{\egroup\noexpand\do#3\relax}%
+ \processcontent
+ {\e!stop#1}% \currenttabulate}
+ \tabulatecontent
+ {\@EA\processtabulate\@EA[\the\!!toksb]}}
+
+\chardef\tabulatetype=0
+
+% 0 = NC column next EQ equal column
+% 1 = RC column raw RQ equal column raw
+% 2 = HC column hook HQ equal column hook
+
+\newif\iftabulatefirstflushed
+
+\def\tabulateEQ
+ {\iftabulatefirstflushed\else\tabulateparameter{EQ}\fi
+ \global\tabulateequalfalse}
+
+% \def\tabulatenormalcolumn#1%
+% {&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&}
+%
+% \def\tabulateequalcolumn#1%
+% {&\tabulateEQ&\global\chardef\tabulatetype#1&}
+%
+% however, \unskip en \ignorespaces permit usage in complex XML/\starttabulate
+
+\def\tabulatenormalcolumn#1%
+ {\unskip&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&%
+ \ignorespaces}
+
+\def\tabulateequalcolumn#1%
+ {\unskip&\tabulateEQ&\global\chardef\tabulatetype#1&%
+ \ignorespaces}
+
+\def\tabulateautocolumn
+ {\tabulatenormalcolumn\zerocount
+ \ifnum\tabulatecolumn>\tabulatecolumns\relax
+ \expandafter\NR
+ \else
+ \expandafter\ignorespaces % interferes with the more tricky hooks
+ \fi}
+
+\def\setquicktabulate#1% see \startlegend \startgiven
+ {\let#1\tabulateautocolumn
+ \let\\\tabulateautocolumn}
+
+%\def\dotabulateruleseperator
+% {\vskip\strutdp}
+
+\def\dotabulateruleseperator % can be sped up
+ {\bgroup
+ \let\factor\!!plusone
+ \scratchskip\strutdp
+ \ExpandFirstAfter\processallactionsinset
+ [\tabulateparameter\c!distance]
+ [ \v!blank=>\scratchskip\bigskipamount,
+ \v!depth=>\scratchskip\strutdp,
+ \v!small=>\def\factor{.25},
+ \v!medium=>\def\factor{.5},
+ \v!big=>,
+ \v!none=>\scratchskip\zeropoint\def\factor{0},
+ \v!grid=>\scratchskip\zeropoint\def\factor{0},
+ \s!unknown=>\scratchskip\commalistelement]%
+ \scratchdimen\factor\scratchskip
+ \ifconditional\tabulatesomeamble\kern\else\vskip\fi\scratchdimen % new
+ \egroup}
+
+\def\dodotabulaterule#1%
+ {\color
+ [\tabulateparameter\c!rulecolor]
+ {\scratchdimen\tabulateparameter\c!rulethickness#1}}
+
+\def\dotabulaterule
+ {\dodotabulaterule
+ {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
+ \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
+ {\kern-\scratchdimen}}} % experimental tm-prikkels
+
+\def\dotabulatelinerule
+ {\multispan\totaltabulatecolumns % \multispan is a plain macro
+ % for the moment this one
+ \strut\hskip\tabulateparameter\c!margin
+ % neg values are ok !
+ \hskip\tabulateindent % new august 2003
+ \dodotabulaterule
+ {\!!heighta.5\lineheight
+ \advance\!!heighta-\strutdepth
+ \!!deptha-\!!heighta
+ \advance\!!deptha\scratchdimen
+ \leaders\hrule\!!height\!!heighta\!!depth\!!deptha\hfill}%
+ \cr}
+
+%D When set to true, no (less) break optimization is done.
+
+\newif\iftolerantTABLEbreak
+
+%D The main processing macro is large but splitting it up
+%D would make things less clear.
+
+\def\doregistertabulateparoptions
+ {\iftrialtypesetting \else
+ \registerparoptions
+ \ifinsidefloat
+ % that is, an unbreakable one
+ \global\let\registertabulateparoptions\empty
+ \else
+ % unsafe in crossing pages, at each b...
+ % \global\let\registertabulateparoptions\empty
+ \fi
+ \fi}
+
+\appendtoks
+ \global\let\registertabulateparoptions\doregistertabulateparoptions
+\to \everytabulate
+
+\newtoks\everytabulaterow
+
+\appendtoks
+ \registertabulateparoptions
+\to \everytabulaterow
+
+\def\flushtabulateindent
+ {\ifnum\tabulatecolumn=\zerocount
+ \hbox to \tabulateindent
+ {% we now have a local hsize, and since we want to
+ % register positional info (i.e. real hsizes) we
+ % need to reconstitute the original hsize
+ \advance\hsize\tabulateindent
+ % this is indeed rather messy and took a few hours
+ % to dis/uncover
+ \the\everytabulaterow
+ \hss}%
+ \fi}
+
+\def\totaltabulatecolumns{0}
+
+\def\handletabulatedigits{\digits}
+
+%D Beware, we cannot use \type {\unexpanded} on \type {\HL}
+%D cum suis, since \TEX's hard coded noalign lookahead fails
+%D on it! I mistakenly added this for a while.
+
+\chardef\tabulaterepeathead\zerocount
+
+\newcount\noftabulatelines
+\newcount\totalnoftabulatelines
+\newcount\minusnoftabulatelines
+
+\setvalue{\??tt:\c!align:\v!normal}{0}
+\setvalue{\??tt:\c!align:\v!right }{1}
+\setvalue{\??tt:\c!align:\v!left }{2}
+\setvalue{\??tt:\c!align:\v!middle}{3}
+
+\setvalue{\??tt:\c!header:\v!repeat}{\plusone}
+\setvalue{\??tt:\c!header:\v!text }{\plustwo}
+
+\bgroup \catcode`\|=\@@other
+
+\newtoks\everyaftertabulaterow
+
+\gdef\processtabulate[|#1|]% in the process of optimizing
+ {\tabulateunit\tabulateparameter\c!unit
+ \checkfulltabulatecontent
+ \globallet\tabulateruledepth \!!zeropoint
+ \globallet\tabulateruleheight\!!zeropoint
+ \edef\@@tabulatealign{\executeifdefined{\??tt:\c!align:\tabulateparameter\c!align}0}%
+% \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
+ \global\nofautotabulate\zerocount
+ \global\noftabulatelines\zerocount
+ \totalnoftabulatelines\noftabulatelines
+ \minusnoftabulatelines\noftabulatelines
+ \global\tabulatepwidth\zeropoint
+ \global\tabulateequalfalse
+ \resettabulatepheight
+ \ifinsidesplitfloat
+ \donetrue
+ \else\ifinsidefloat
+ \donefalse
+ \else
+ \donetrue
+ \fi\fi
+ \ifdone
+ \chardef\tabulaterepeathead\executeifdefined{\??tt:\c!header:\tabulateparameter\c!header}\zerocount
+% \processaction
+% [\tabulateparameter\c!header]
+% [\v!repeat=>\let\tabulaterepeathead\plusone,
+% \v!text=>\let\tabulaterepeathead\plustwo]%
+ \fi
+ \unexpanded \def\NC{\tabulatenormalcolumn0}%
+ \unexpanded \def\RC{\tabulatenormalcolumn1}%
+ \unexpanded \def\HC{\tabulatenormalcolumn2}%
+ \unexpanded \def\EQ{\tabulateequalcolumn 0}%
+ \unexpanded \def\RQ{\tabulateequalcolumn 1}%
+ \unexpanded \def\HQ{\tabulateequalcolumn 2}%
+ \unexpanded \def\NG{\NC\handletabulatecharalign}%
+ \unexpanded \def\NN{\NC\handletabulatedigits}% new, undocumented, test first
+ \unexpanded \def\ND{\NC\handletabulatedigits}% same, for old times sake
+ \def\tabulaterule{\HR}% a rule with lineheight
+ \def\tabulateline{\HL}% just a spaced rule
+ \def\tabulateautorule{\doHR\plusone}%
+ \def\tabulateautoline{\doHL\plusone}%
+ \def\HR{\doHR\zerocount}
+ \def\HL{\doHL\zerocount}
+ \unexpanded \def\NR % next row
+ {\global\advance\noftabulatelines\plusone
+ \global\tabulatefirstflushedfalse
+ \global\tabulateequalfalse
+ \global\tabulatecolumn\zerocount
+ \resettabulatepheight
+ \unskip\unskip\crcr\flushtabulated
+\TABLEnoalign
+ {\the\everyaftertabulaterow}%
+ \TABLEnoalign
+ {\iftolerantTABLEbreak\else
+ \ifconditional\tabulatesomeamble \ifcase\tabulaterepeathead \else
+ \allowbreak
+ \fi \fi
+ \ifnum\noftabulatelines=\plusone
+ \dotabulatenobreak
+ \else\ifnum\noftabulatelines=\minusnoftabulatelines
+ \ifnum\tabulatemaxplines<\plustwo
+ \dotabulatenobreak
+ \else
+ \allowbreak % needed with pbreak prevention
+ \fi
+ \else
+ \allowbreak % needed with pbreak prevention
+ \fi\fi
+ \fi
+ \global\tabulatefirstflushedfalse}}%
+ \let\HL\empty % not needed
+ \let\SR\NR \let\AR\NR
+ \let\FL\empty \let\FR\NR
+ \let\ML\empty \let\MR\NR
+ \let\LL\empty \let\LR\NR
+ \let\doHR\gobbleoneargument
+ \let\doHL\gobbleoneargument
+ \global\let\flushtabulated\empty
+% \let\savedbar|\let|\nexttabulate
+ \tabskip\zeropoint
+ \ifdim\tabulateparameter\c!margin>\zeropoint
+ \!!toksa{&\flushtabulateindent\strut##%
+ \tabskip\tabulateparameter\c!margin\strut
+ &##\tabskip\zeropoint}%
+ \else
+ \!!toksa{&\flushtabulateindent\strut##%
+ &##\tabskip\zeropoint}%
+ \fi
+ \tabulatewidth\zeropoint
+ % |#1X|\relax
+ \nexttabulate #1X|\relax
+ \scratchcounter\tabulatecolumns
+ \multiply\scratchcounter3%
+ \advance\scratchcounter4%
+ \edef\totaltabulatecolumns{\the\scratchcounter}%
+ \tabulatewidth\zeropoint
+ % \dorecurse\tabulatecolumns % can be made faster
+ % {\doifundefinedelse{\@@tabbox@@\recurselevel}
+ % {\expandafter\newbox\csname\@@tabbox@@\recurselevel\endcsname}%
+ % {\global\setbox\csname\@@tabbox@@\recurselevel\endcsname\emptybox}}%
+ \initializetableboxes\tabulatecolumns
+ \appendtoks&##\to\!!toksa
+ \appendtoks\global\advance\tabulatecolumn\plusone\to\!!toksa
+ \appendtoks\NC\unskip\unskip\crcr\flushtabulated\to\tabulatedummy % no count
+ \global\tabulatecolumn\zerocount
+ \resettabulatepheight
+ \def\bskip
+ {\setbox\tabulatebox\vbox\bgroup
+ \global\let\tabulatehook\notabulatehook}%
+ \def\eskip
+ {\par\egroup
+ \global\let\tabulatehook\dotabulatehook}%
+ \def\xbskip
+ {\hbox\bgroup\vbox\bgroup
+ \global\let\tabulatehook\notabulatehook}%
+ \def\xeskip
+ {\par\egroup\egroup
+ \global\let\tabulatehook\dotabulatehook}%
+ % \let|\savedbar
+ \global\let\tabulatehook\dotabulatehook
+ \doifvalue{\??tt\currenttabulate\c!indenting}\v!no\forgetparindent
+ \ifinsidefloat
+ \let\tabulateindent\!!zeropoint
+ \else
+ \setlocalhsize \hsize\localhsize
+ \fi
+ \dontcomplain
+ \forgetall % hm, interference with \forgetparindent ^^^ probably bug, to be solved
+ \setbox0\vbox % outside \if because of line counting
+ {\notesenabledfalse
+ \let\tabulateindent\!!zeropoint
+ \trialtypesettingtrue % very important
+ \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}}%
+ \ifnum\nofautotabulate>\zerocount
+ % so, even if the natural size is larger, in the final
+ % run, we force the calculated width
+ \tabulatewidth\hsize
+ \advance\tabulatewidth -\wd0
+ \advance\tabulatewidth -\tabulatepwidth
+ \ifnum\nofautotabulate>\zerocount
+ \divide\tabulatewidth \nofautotabulate\relax
+ \fi
+ \fi
+ \def\xbskip{\bskip}%
+ \def\xeskip{\eskip}%
+ \ifsplittabulate
+ \splittopskip\strutht
+ \global\let\flushtabulatedindeed\empty
+ \long\def\bbskip
+ {\ifvoid\tablebox\tabulatecolumn
+ \ifx\flushtabulatedindeed\empty\else
+ \setbox0\hbox
+ \fi
+ \fi}%
+ \def\bskip
+ {\ifvoid\tablebox\tabulatecolumn
+ \global\setbox\tablebox\tabulatecolumn\vbox
+ \bgroup
+ \global\let\tabulatehook\notabulatehook
+ \ifautotabulate\hsize\tabulatewidth\fi
+ % \begstrut % interferes with pre-\pars
+ % evt: \appendtoks\begstrut\to\everypar
+ \ignorespaces
+ \def\eskip
+ {\par\egroup
+ \settabulatepheight
+ \global\let\tabulatehook\dotabulatehook
+ \splitofftabulatebox}%
+ \else
+ \let\eskip\empty
+ \dontcomplain
+ \global\let\tabulatehook\dotabulatehook
+ \expandafter\splitofftabulatebox
+ \fi}%
+ \gdef\flushtabulated
+ {\TABLEnoalign % noalign % no interference !
+ {\global\let\flushtabulatedindeed\empty
+ \global\tabulatecolumn\zerocount
+ \handletabulatepbreak
+ \dorecurse\tabulatecolumns % was: \noftabcolumns
+ {\ifvoid\tablebox\recurselevel\else
+ \gdef\flushtabulatedindeed{\the\tabulatedummy}%
+ \fi}%
+ \global\tabulatefirstflushedtrue}%
+ \flushtabulatedindeed}%
+ \else
+ % tabhook op alles ?
+ \def\bskip
+ {\vtop\bgroup
+ \ifautotabulate\hsize\tabulatewidth\fi
+ % \begstrut % interferes with pre-\pars
+ % evt: \appendtoks\begstrut\to\everypar
+ \ignorespaces}%
+ \def\eskip % vertical strut added august 2003
+ {\par\verticalstrut\vskip-\struttotal\egroup}%
+ \fi
+ \totalnoftabulatelines\noftabulatelines
+ \minusnoftabulatelines\numexpr\noftabulatelines+\minusone\relax
+ \global\noftabulatelines\zerocount
+ \def\doHL##1% ##1 ignored
+ {\TABLEnoalign
+ {\csname
+ \ifnum\noftabulatelines=\zerocount F\else
+ \ifnum\noftabulatelines=\totalnoftabulatelines L\else
+ M\fi\fi
+ L\endcsname}}%
+ \def\doHR##1% horizontal rule line (break untested)
+ {\TABLEnoalign
+ {\globallet\TABLEautoline\dotabulatelinerule
+ \ifcase##1\or
+ \ifnum\noftabulatelines=\zerocount
+ \gdef\TABLEautoline{\TABLEnoalign{}}%
+ \else\ifnum\noftabulatelines=\totalnoftabulatelines
+ \gdef\TABLEautoline{\TABLEnoalign{}}%
+ \fi\fi
+ \fi
+ \dotabulatenobreak}%
+ \TABLEautoline
+ \TABLEnoalign
+ {\nobreak
+ \ifx\TABLEautoline\dotabulatelinerule\kern-\lineheight\fi
+ \ifnum\noftabulatelines=\totalnoftabulatelines
+ \@EA\dotabulatenobreak
+ \else
+ \@EA\allowbreak
+ \fi}%
+ \TABLEautoline
+ \TABLEnoalign
+ {\dotabulatenobreak}}%
+ \doifelsevalue{\??tt\currenttabulate\c!rule}\v!line
+ {\let\HL \HR
+ \let\tabulateautoline\tabulateautorule
+ \let\tabulateline \tabulaterule}%
+ {\def\HL{\doHL\zerocount}}%
+ \def\tablebaselinecorrection
+ {\def\dobaselinecorrection
+ {\vskip-\prevdepth
+ \vskip\strutdp
+ \vskip\strutdp}%
+ \baselinecorrection}%
+ \def\FL{\TABLEnoalign
+ {\ifinsidefloat\else
+ \doifemptyvalue{\??tt\currenttabulate\c!before} % no expansion
+ {\tablebaselinecorrection}%
+ \fi
+ \dotabulaterule
+ \dotabulatenobreak
+ \dotabulateruleseperator
+ \prevdepth\strutdp
+ \dotabulatenobreak}}%
+ \def\ML{\TABLEnoalign
+ {\dotabulateruleseperator
+ \dotabulaterule
+ \ifnum\noftabulatelines>\plusone
+ \ifnum\noftabulatelines<\minusnoftabulatelines
+ % \vskip \topskip\allowbreak \vskip-\topskip
+ \vskip1\topskip\allowbreak\vskip-1\topskip
+ \vskip-\tabulateparameter\c!rulethickness
+ \dotabulaterule
+ \fi
+ \fi
+ \dotabulateruleseperator}}%
+ \def\LL{\TABLEnoalign
+ {\dotabulatenobreak
+ \dotabulateruleseperator
+ \dotabulatenobreak
+ \dotabulaterule
+ \ifinsidefloat\else
+ \doifemptyvalue{\??tt\currenttabulate\c!after} % no expansion
+ {\vskip\strutdp
+ \verticalstrut
+ \vskip-\struttotal}%
+ \fi}}%
+ \let\tabulatepass\plustwo
+ %
+ \ifcase\tabulaterepeathead
+ \ifinsidesplitfloat
+ \setbox\tabulatebox\vbox \bgroup
+ \else
+ \startframedcontent[\tabulateparameter\c!frame]%
+ \fi
+ \else
+ \setbox\tabulatebox\vbox \bgroup
+ \fi
+ %
+ \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}%
+ \prevdepth\strutdp % nog eens beter, temporary hack
+ \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
+ {\vskip-\strutdp}% experimental tm-prikkels
+ %
+ \ifcase\tabulaterepeathead
+ \ifinsidesplitfloat
+ \egroup \splittabulatebox\tabulatebox
+ \else
+ \stopframedcontent
+ \fi
+ \else
+ \egroup \splittabulatebox\tabulatebox
+ \fi
+ %
+ \egroup
+ \ifinsidefloat \else
+ \tabulateparameter\c!after
+ \fi
+ \egroup}
+
+\egroup
+
+% \setuptabulate[split=yes,header=text,title=Vervolg van Tabel]
+%
+% % \starttabulatehead
+% % \NC test \NC hans\NC \NR
+% % \stoptabulatehead
+%
+% \starttabulate
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input knuth \relax \NC \NR
+% \NC test \NC \input knuth \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \stoptabulate
+
+% \def\splittabulatebox#1% #1 <> 0/2 / derived from the one in core-ntb.tex
+% {\ifinsidefloat
+% \unvbox#1%
+% \else
+% \ifcase\tabulaterepeathead\or
+% \setbox2\copy#1%
+% \setbox2\vsplit2 to \lineheight
+% \setbox2\vbox{\unvbox2}%
+% \fi
+% \doloop
+% {\setbox0\vsplit#1 to \onepoint % \lineheight
+% \ifdim\pagegoal<\maxdimen
+% \donetrue
+% \else\ifdim\pagetotal=\zeropoint
+% \donetrue
+% \else
+% \donefalse
+% \fi\fi
+% \ifdone
+% \setbox0\vbox{\unvbox0}%
+% \dimen0\pagetotal
+% \advance\dimen0\dp0
+% \advance\dimen0\ht0
+% \ifdim\dimen0>\pagegoal
+% \bgroup \page \egroup % make sure that local vars are kept
+% \ifcase\tabulaterepeathead\or
+% \unvcopy2
+% \or
+% \hbox{\strut\tabulateparameter\c!title}%
+% \fi
+% \fi
+% \fi
+% % test this on icare checklists / quite hacky ! ! !
+% \ifdim\ht0>\tabulateparameter\c!rulethickness\else
+% \kern-2\ht0 % brrrr
+% \fi
+% %
+% \unvbox0
+% \allowbreak
+% \ifvoid#1 \exitloop \fi}%
+% \fi}
+
+\def\splittabulatebox#1% #1 <> 0/2 / derived from the one in core-ntb.tex
+ {\ifinsidesplitfloat
+ \dosplittabulatebox#1%
+ \else\ifinsidefloat
+ \unvbox#1%
+ \else
+ \dosplittabulatebox#1%
+ \fi\fi}
+
+\def\dosplittabulatebox#1%
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{0pt}%
+ \setbox\tsplitcontent\box#1%
+ \ifcase\tabulaterepeathead\or
+ \setbox\tsplithead\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvbox\tsplithead}%
+ \or
+ \setbox\tsplithead\vbox{\hbox{\strut\tabulateparameter\c!title}}%
+ \fi
+ \handletsplit}
+
+%D \starttyping
+%D \setuptabulate[split=no,rule=line]
+%D
+%D \starttabulate
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \stoptabulate
+%D \stoptyping
+
+% \starttabulatie[|mc|]
+% \NC \digits{100.000,00} \NC\NR
+% \NC \digits{@10.000,00} \NC\NR
+% \NC \digits{@@@.100,00} \NC\NR
+% \NC \digits{@@@.@10,@@} \NC\NR
+% \NC \digits{@@@.@@1,@@} \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|mc|]
+% \ND 100.000,00 \NC\NR
+% \ND @10.000,00 \NC\NR
+% \ND @@@.100,00 \NC\NR
+% \ND @@@.@10,@@ \NC\NR
+% \ND @@@.@@1,@@ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \ND $100.000,00$ \NC\NR
+% \ND $@10.000,00$ \NC\NR
+% \ND $@@@.100,00$ \NC\NR
+% \ND $@@@.@10,@@$ \NC\NR
+% \ND $@@@.@@1,@@$ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \NC $\digits 100.000,00 $ \NC\NR
+% \NC $\digits @10.000,00 $ \NC\NR
+% \NC $\digits @@@.100,00 $ \NC\NR
+% \NC $\digits @@@.@10,@@ $ \NC\NR
+% \NC $\digits @@@.@@1,@@ $ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \NC \digits $100.000,00$ \NC\NR
+% \NC \digits $@10.000,00$ \NC\NR
+% \NC \digits $@@@.100,00$ \NC\NR
+% \NC \digits $@@@.@10,@@$ \NC\NR
+% \NC \digits $@@@.@@1,@@$ \NC\NR
+% \stoptabulatie
+
+\def\setuptabulate
+ {\dotripleempty\dosetuptabulate}
+
+\def\dosetuptabulate[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??tt#1::#2][#3]%
+ \else\ifsecondargument
+ \getparameters[\??tt#1::][#2]%
+ \else
+ \getparameters[\??tt\v!tabulate::][#1]%
+ \fi\fi}
+
+\setuptabulate
+ [\c!unit=1em,
+ EQ={:},
+ \c!frame=\v!off,
+ \c!bodyfont=,
+ \c!rule=\v!normal,
+ \c!rulecolor=,
+ \c!rulethickness=\linewidth,
+ \c!inner=,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!distance={\v!depth,\v!medium},
+ \c!align=\v!normal,
+ \c!margin=\!!zeropoint,
+ \c!split=\v!auto,
+ \c!header=\v!yes,
+ \c!title=,
+ \c!indenting=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/tabl-tbl.mkiv b/tex/context/base/tabl-tbl.mkiv
new file mode 100644
index 000000000..400d8a659
--- /dev/null
+++ b/tex/context/base/tabl-tbl.mkiv
@@ -0,0 +1,1516 @@
+%D \module
+%D [ file=core-tbl,
+%D version=1998.11.03,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Text Flow Tabulation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / Tabulation}
+
+% \processbetween gebruiken in head/tail macros
+
+% todo: \aligntab \alignmark (after 0.60 is out)
+
+\unprotect
+
+%D I can probably reimplement this using a \LUA||\TEX\ combination
+%D but it does not pay of in development time. If I need something
+%D else I will write it from scratch anyway.
+
+% watch out: don't change this model else trialtypesetting
+% compatibility problems
+
+% watch out, cells expand pretty late on a per row basis
+
+% |p2|p3| 2:3
+% spanning
+
+% Be careful with changing the hsize calculation in p mode;
+% the following code works quite well:
+%
+% \setupfield [line][location=low,height=1.2\lineheight,width=\hsize]
+% \definefield [test] [line] [line] []
+%
+% \starttabulate[|l|p|]
+% \NC test \NC \field [test] \NC \NR
+% \stoptabulate
+
+% In-text tabbing environment
+%
+% \starttabulate[| separated template] % eg [|l|p|] or [|l|p|p|]
+% \NC ... \NC ... \NC\NR
+% \stoptabulate
+%
+% with: two pass auto width calculation when no p-width
+% specified, even with multiple p's, see examples.
+
+% TaBlE compatible specifications:
+%
+% l align column/paragraph left
+% r align column/paragraph right
+% c align column/paragraph center
+% p p(dimen) of automatisch als alleen p
+% w column width
+% f font#1
+% B bold
+% I italic
+% S slanted
+% T type
+% R roman
+% m math
+% M display math
+% h hook (inner level or par lines)
+% b before (may be command#1)
+% a after
+% i i<n> skip left of column
+% j i<n> skip right of column
+% k i<n> skip around column
+
+% s setups
+
+% g g{char} align at char
+% . align at .
+% , align at ,
+
+% Still to be done
+
+% N math numbers (best hook into existing digits mechanism)
+% n numbers (best hook into existing digits mechanism)
+% Q math numbers (best hook into existing digits mechanism)
+% q numbers (best hook into existing digits mechanism)
+% ~ \hskip.5em
+% | check
+
+% nesting
+
+% 10 evt auto stack; dan wel andere signal dan void nodig
+
+% present but not yet 100% ok
+%
+% \FL top hrule
+% \ML mid hrule (with auto split)
+% \LL bottom hrule
+% \HL
+
+% \VL as soon as needed
+% color as soon as needed
+
+% \EQ \RQ \HQ equal (raw, hook)
+% \NC \RC \HC normal (raw, hook)
+%
+% \NR
+
+% \HR : rule with lineheight
+
+% \autotabulaterule : with lineheight, not first/last
+% \autotabulateline : spaced, not first/last
+% \tabulaterule : with lineheight
+% \tabulateline : spaced
+
+% tricky: align scans ahead, over # and expands ones before
+% while doing
+
+% new:
+%
+% \starttabulate[|cg{.}|cg{,}|cg{,}|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+%
+% \starttabulate[|c.|c,|c,|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+
+% nice demo (for BG)
+%
+% \starttabulate[|r|b{$\star$}|ra{\percent}|b{=}|r|]
+% \NC 500 \NC \NC 60 \NC \NC 300 \NC \NR
+% \NC 500 \NC \NC 55 \NC \NC 275 \NC \NR
+% \NC 500 \NC \NC 50 \NC \NC 250 \NC \NR
+% \NC 500 \NC \NC 45 \NC \NC 225 \NC \NR
+% \NC 500 \NC \NC 40 \NC \NC 200 \NC \NR
+% \NC 500 \NC \NC 35 \NC \NC 175 \NC \NR
+% \NC 500 \NC \NC 30 \NC \NC 150 \NC \NR
+% \NC 500 \NC \NC 25 \NC \NC 125 \NC \NR
+% \NC 500 \NC \NC 20 \NC \NC 100 \NC \NR
+% \stoptabulate
+
+\newtoks \tabulatepreamble
+\newtoks \tabulatebefore
+\newtoks \tabulateafter
+\newtoks \tabulatebmath
+\newtoks \tabulateemath
+\newtoks \tabulatefont
+\newtoks \tabulatesettings
+\newtoks \tabulatedummy
+
+\newcount \nofautotabulate
+\newcount \tabulatecolumns
+\newcount \tabulatecolumn
+
+\newcount \tabulateminplines
+\newcount \tabulatemaxplines
+
+\newif \ifautotabulate
+\newif \ifsplittabulate \splittabulatetrue
+
+\newif \ifhandletabulatepbreak \handletabulatepbreaktrue
+\newif \iftabulatenopbreak \tabulatenopbreakfalse
+
+\newif \iftabulateequal
+\newif \iftracetabulate
+\newif \ifframedtabulate
+
+\newdimen \tabulatepwidth
+\newdimen \tabulatexwidth
+\newdimen \tabulatewidth
+\newdimen \tabulateunit
+\newdimen \tabulatemaxpheight
+
+\newbox \tabulatebox
+
+% [|lg{.}|] => \NG 12.34 \NC
+
+\gdef\handletabulatecharalign#1 % space delimited !
+ {\edef\alignmentclass{\the\tabulatecolumn}%
+ \edef\alignmentcharacter{\csname\??tt:a:\the\tabulatecolumn\endcsname}%
+ \ifcase\tabulatepass\or
+ \setfirstpasscharacteralign\checkalignment{#1}%
+ \fi % force hsize
+ \setsecondpasscharacteralign\checkalignment{#1}}
+
+\def\noftabcolumns{16}
+
+\def\tablebox#1%
+ {\csname\??tt:b:\number#1\endcsname}
+
+\def\initializetablebox#1% also used elsewhere
+ {\ifcsname\??tt:b:\number#1\endcsname
+ \global\setbox\csname\??tt:b:\number#1\endcsname\emptybox
+ \else
+ \expandafter\newbox\csname\??tt:b:\number#1\endcsname
+ \fi}
+
+\def\initializetableboxes#1%
+ {\scratchcounter#1\relax
+ \doinitializetableboxes}
+
+\def\doinitializetableboxes
+ {\ifnum\scratchcounter>\zerocount
+ \initializetablebox\scratchcounter
+ \advance\scratchcounter\minusone
+ \expandafter\doinitializetableboxes
+ \fi}
+
+\initializetableboxes\noftabcolumns
+
+\def\dodotabulatenobreak
+ {\nobreak
+ \iftracetabulate
+ \red\hrule\!!height.5\linewidth\!!depth.5\linewidth
+ \par
+ \kern-\linewidth
+ \nobreak
+ \fi}
+
+\def\dotabulatenobreak
+ {\noalign{\dodotabulatenobreak}}
+
+\unexpanded\def\notabulatehook
+ {}
+
+\unexpanded\def\checktabulatehook
+ {\ifnum\tabulatetype<\plustwo
+ \glet\tabulatehook\notabulatehook
+ \else
+ \glet\tabulatehook\dotabulatehook
+ \fi}
+
+\unexpanded\def\checktabulatesetups
+ {\csname\??tt:s:\the\tabulatecolumn\endcsname}
+
+\let\pretabrule \donothing
+\let\posttabrule\donothing
+
+% 0 = NC column next EQ equal column
+% 1 = RC column raw RQ equal column raw
+% 2 = HC column hook HQ equal column hook
+% some entries can be left out if we test for them being set
+
+% \def\dodosettabulatepreamble#1#2%
+% {\ifzeropt\tabulatewidth
+% \ifcase\tabulatemodus\relax
+% \let\preamblebox\empty
+% \else
+% \def\preamblebox{\autotabulatetrue}%
+% \fi
+% \else
+% \ifcase\tabulatemodus\relax
+% \edef\preamblebox{\hbox to \the\tabulatewidth}%
+% \else
+% \edef\preamblebox{\hsize\the\tabulatewidth}%
+% \fi
+% \fi
+% %
+% % less bytes
+% %
+% %\edef\preamblebox%
+% % {\ifcase\tabulatewidth
+% % \ifcase\tabulatemodus\relax\else\noexpand\autotabulatetrue\fi
+% % \els
+% % \ifcase\tabulatemodus\relax\hbox to\else\hsize\fi\the\tabulatewidth
+% % \fi}%
+% %
+% \@EA\appendtoks \@EA&\@EA\hskip\pretabskip\pretabrule##&\to\!!toksa
+% \appendtoks \ignorespaces\to\!!toksa
+% \@EA\appendtoks\@EA\global\@EA\tabulatecolumn\the\tabulatecolumns\relax\to\!!toksa
+% \appendtoks \checktabulatesetups\to\!!toksa
+% \appendtoks \checktabulatehook\to\!!toksa
+% \@EA\appendtoks \preamblebox\to\!!toksa
+% \appendtoks \bgroup\bbskip\bgroup#1\to\!!toksa
+% \appendtoks\ifnum\tabulatetype=\plusone \else \to\!!toksa
+% \@EA\appendtoks \the\tabulatebmath\to\!!toksa
+% \@EA\appendtoks \the\tabulatefont\to\!!toksa
+% \@EA\appendtoks \the\tabulatesettings\to\!!toksa
+% \@EA\appendtoks \the\tabulatebefore\to\!!toksa
+% \appendtoks\fi \to\!!toksa
+% \appendtoks \bgroup\ignorespaces\to\!!toksa
+% %
+% \appendtoks \tabulatehook##\to\!!toksa
+% %
+% %%\doifdefinedelse{\??tt:a:\tabulatecolumns}
+% %\doifdefinedelse{\??tt:a:\the\tabulatecolumns}
+% % {\appendtoks\handletabulatecharalign## \to\!!toksa}
+% % {\appendtoks\tabulatehook ##\to \!!toksa}%
+% % waarom kan ik hier geen \xx{##} geven, om een of
+% % andere reden passeert dan tex de hele regel (incl \NC's)
+% % als argument; elke delimiter <> space gaat trouwens fout
+% \appendtoks \unskip\unskip\ifmmode\else\endgraf\fi\egroup\to\!!toksa
+% \appendtoks\ifnum\tabulatetype=1 \else \to\!!toksa
+% \@EA\appendtoks \the\tabulateafter\to\!!toksa
+% \@EA\appendtoks \the\tabulateemath\to\!!toksa
+% \appendtoks\fi \to\!!toksa
+% \appendtoks #2\egroup\egroup\to\!!toksa
+% \@EA\appendtoks \@EA&\@EA\posttabrule\@EA\hskip\postabskip##\to\!!toksa
+% \appendtoks\NC\to\tabulatedummy
+% \let\bbskip\empty
+% \def\pretabskip{.5\tabulateunit}%
+% \let\postabskip\pretabskip
+% \let\gettabulateexit\dogettabulateexit
+% \tabulatewidth\zeropoint}
+%
+% speedup:
+
+% is grouping really needed here?
+
+\unexpanded\def\beforetabulateentry{\ignorespaces\tabulatehook}
+\unexpanded\def\aftertabulateentry {\unskip\unskip\ifmmode\else\endgraf\fi}
+
+\unexpanded\def\beginreshapedtabulatepar
+ {\dowithnextbox
+ {\ctxlua{commands.doreshapeframedbox(\number\nextbox)}\ifvmode\unvbox\else\box\fi\nextbox}
+ \vbox\bgroup}
+
+\let\endreshapedtabulatepar\egroup
+
+\def\dodosettabulatepreamble#1#2% only makes sense for many tabulates
+ {\normalexpanded{\!!toksa{\the\!!toksa
+ &\hskip\pretabskip\noexpand\pretabrule##&%
+ % \ignorespaces
+ \global\tabulatecolumn\the\tabulatecolumns\relax
+ \checktabulatesetups % unexpandable
+ \checktabulatehook % unexpandable
+ \ifzeropt\tabulatewidth
+ \ifcase\tabulatemodus\else
+ \noexpand\autotabulatetrue
+ \fi
+ \else
+ \ifnum\tabulatemodus=\zerocount
+ \hbox to
+ \else
+ \hsize
+ \fi
+ \the\tabulatewidth
+ \fi
+ \bgroup
+ \noexpand\bbskip
+ \bgroup % we cannot combine the if because a cell may have only one ##
+ \noexpand#1%
+ \ifcase\tabulatereshape\else
+ \beginreshapedtabulatepar
+ \fi
+ \noexpand\ifnum\noexpand\tabulatetype=\plusone\noexpand\else
+ \the\tabulatebmath % maybe later?
+ \the\tabulatefont
+ \the\tabulatesettings
+ \the\tabulatebefore
+ \noexpand\fi
+ % grouping needs to be outside macros (or expandable), nice test
+ % example \NC \string & \NC which will fail otherwise (mk)
+ \bgroup
+ \beforetabulateentry
+ ##%
+ \aftertabulateentry
+ \egroup
+ \noexpand\ifnum\noexpand\tabulatetype=\plusone\noexpand\else
+ \the\tabulateafter
+ \the\tabulateemath
+ \noexpand\fi
+ \ifcase\tabulatereshape\else
+ \endreshapedtabulatepar
+ \fi
+ \noexpand#2%
+ \egroup
+ \egroup
+ &\noexpand\posttabrule\hskip\postabskip##%
+ }}%
+ \appendtoks\NC\to\tabulatedummy
+ \let\bbskip\empty % ?
+ \def\pretabskip{.5\tabulateunit}%
+ \let\postabskip\pretabskip
+ \let\gettabulateexit\dogettabulateexit
+ \tabulatewidth\zeropoint}
+
+\setvalue{\??tt>\meaning x}{\let\tabulatealign\zerocount\settabulatepreamble} % internal
+\setvalue{\??tt>\meaning l}{\let\tabulatealign\plusone\settabulatepreamble}
+\setvalue{\??tt>\meaning r}{\let\tabulatealign\plustwo\settabulatepreamble}
+\setvalue{\??tt>\meaning c}{\let\tabulatealign\plusthree\settabulatepreamble}
+\setvalue{\??tt>\meaning p}{\gettabulateparagraph}
+\setvalue{\??tt>\meaning s}{\gettabulatesetups}
+\setvalue{\??tt>\meaning w}{\gettabulatewidth}
+\setvalue{\??tt>\meaning f}{\gettabulatefont}
+\setvalue{\??tt>\meaning B}{\tabulatefont{\bf}\settabulatepreamble}
+\setvalue{\??tt>\meaning I}{\tabulatefont{\it}\settabulatepreamble}
+\setvalue{\??tt>\meaning S}{\tabulatefont{\sl}\settabulatepreamble}
+\setvalue{\??tt>\meaning T}{\tabulatefont{\tt}\settabulatepreamble}
+\setvalue{\??tt>\meaning R}{\tabulatefont{\rm}\settabulatepreamble}
+\setvalue{\??tt>\meaning m}{\tabulatebmath{$}\tabulateemath{$}\settabulatepreamble}
+\setvalue{\??tt>\meaning M}{\tabulatebmath{$\displaystyle}\tabulateemath{$}\settabulatepreamble}
+\setvalue{\??tt>\meaning h}{\gettabulatehook}
+\setvalue{\??tt>\meaning b}{\gettabulatebefore}
+\setvalue{\??tt>\meaning a}{\gettabulateafter}
+\setvalue{\??tt>\meaning i}{\gettabulatepreskip}
+\setvalue{\??tt>\meaning j}{\gettabulateposskip}
+\setvalue{\??tt>\meaning k}{\gettabulatepreposskip}
+\setvalue{\??tt>\meaning X}{\gettabulateexit} % internal
+\setvalue{\??tt>\meaning e}{\appendtoks\global\tabulateequaltrue\to\tabulatesettings\settabulatepreamble}
+\setvalue{\??tt>\meaning ~}{\appendtoks\fixedspaces\to\tabulatesettings\settabulatepreamble}
+\setvalue{\??tt>\meaning g}{\gettabulatealign}
+\setvalue{\??tt>\meaning .}{\gettabulatealign.}
+\setvalue{\??tt>\meaning ,}{\gettabulatealign,}
+
+\setvalue{\??tt>\s!unknown}{\message{unknown preamble key [\meaning\next]}\settabulatepreamble}
+\letvalue{\??tt>\meaning\relax}\donothing
+
+\def\dosettabulatepreamble
+ {\csname\??tt>\ifcsname\??tt>\meaning\next\endcsname\meaning\next\else\s!unknown\fi\endcsname}
+
+\def\dogettabulateexit
+ {\let\postabskip\!!zeropoint
+ \settabulatepreamble}
+
+\let\gettabulateexit\dogettabulateexit
+
+\def\gettabulatepreskip#1%
+ {\doifnumberelse{#1}
+ {\edef\pretabskip{\the\dimexpr#1\tabulateunit}\let\next\empty}
+ {\edef\pretabskip{\the\dimexpr.5\tabulateunit}\def\next{#1}}%
+ \@EA\settabulatepreamble\next}
+
+\def\gettabulateposskip#1%
+ {\doifnumberelse{#1}
+ {\edef\postabskip{\the\dimexpr#1\tabulateunit}\let\next\empty}
+ {\edef\postabskip{\the\dimexpr.5\tabulateunit}\def\next{#1}}%
+ \let\gettabulateexit\settabulatepreamble
+ \@EA\settabulatepreamble\next}
+
+\def\gettabulatepreposskip#1%
+ {\doifnumberelse{#1}
+ {\edef\pretabskip{\the\dimexpr#1\tabulateunit}\let\next\empty}
+ {\edef\pretabskip{\the\dimexpr.5\tabulateunit}\def\next{#1}}%
+ \let\postabskip\pretabskip
+ \let\gettabulateexit\settabulatepreamble
+ \@EA\settabulatepreamble\next}
+
+\def\gettabulatesetups#1%
+ {\setvalue{\??tt:s:\the\tabulatecolumns}{\setups[#1]}%
+ \settabulatepreamble}
+
+\def\gettabulatehook#1%
+ {\setvalue{\??tt:h:\the\tabulatecolumns}{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatealign#1%
+ {\setvalue{\??tt:a:\the\tabulatecolumns}{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatebefore#1%
+ {\tabulatebefore{#1}%
+ \settabulatepreamble}
+
+\def\gettabulateafter#1%
+ {\tabulateafter{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatefont#1%
+ {\tabulatefont{#1}%
+ \settabulatepreamble}
+
+\def\gettabulatewidth
+ {\let\tabulatemodus\zerocount
+ \let\tabulatedimen\zerocount
+ \doifnextparenthesiselse\dogettabulatewidth\settabulatepreamble}
+
+\def\gettabulateparagraph
+ {\doifnextparenthesiselse
+ {\let\tabulatemodus\plusone
+ \let\tabulatedimen\plusone
+ \dogettabulatewidth}
+ {\let\tabulatemodus\plustwo
+ \let\tabulatedimen\zerocount
+ \settabulatepreamble}}
+
+% \startbuffer
+% \toplinebox{\framed[width=3cm,height=2cm]{tufte}}
+% \stopbuffer
+% \starttabulate[|p(fixed)|p|]
+% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR}
+% \stoptabulate
+% \starttabulate[|p(fit)|p|]
+% \dorecurse{100}{\NC \getbuffer \NC test \par test \par \NC \NR}
+% \stoptabulate
+
+\def\dogettabulatewidth(#1)%
+ {\processallactionsinset % can be made faster
+ [#1]%
+ [ \v!fit=>\let\tabulatemodus\plusthree,
+ \v!fixed=>\let\tabulatemodus\plusthree
+ \tabulatenopbreaktrue,
+ \v!auto=>\let\tabulatemodus\plusthree
+ \let\tabulatereshape\plusone,
+ \s!unknown=>\tabulatewidth#1\relax]%
+ \ifnum\tabulatedimen=\plusone
+ \global\advance\tabulatepwidth\tabulatewidth
+ \fi
+ \settabulatepreamble}
+
+\def\settabulatepreamble
+ {\afterassignment\dosettabulatepreamble\let\next=}
+
+\def\tabulateraggedright {\ifnum\tabulatetype=\plusone \else\raggedright \fi}
+\def\tabulateraggedcenter{\ifnum\tabulatetype=\plusone \else\raggedcenter\fi}
+\def\tabulateraggedleft {\ifnum\tabulatetype=\plusone \else\raggedleft \fi}
+\def\tabulatenotragged {\ifnum\tabulatetype=\plusone \else\notragged \fi}
+\def\tabulatehss {\ifnum\tabulatetype=\plusone \else\hss \fi} % never change this to a fill
+
+\def\tabulatebskipraggedright {\bskip\tabulateraggedright }
+\def\tabulatebskipraggedleft {\bskip\tabulateraggedleft }
+\def\tabulatebskipraggedcenter{\bskip\tabulateraggedcenter}
+
+\def\tabulatesetpreamblewidthnormal
+ {\ifcase\tabulatealign\relax
+ \dodosettabulatepreamble\empty \tabulatehss \or
+ \dodosettabulatepreamble\empty \tabulatehss \or
+ \dodosettabulatepreamble\tabulatehss\empty \or
+ \dodosettabulatepreamble\tabulatehss\tabulatehss \fi}
+
+\def\tabulatesetpreamblewidthfixed
+ {\ifcase\tabulatealign\relax
+ \dodosettabulatepreamble\bskip \eskip \or
+ \dodosettabulatepreamble\tabulatebskipraggedright \eskip \or
+ \dodosettabulatepreamble\tabulatebskipraggedleft \eskip \or
+ \dodosettabulatepreamble\tabulatebskipraggedcenter\eskip \fi}
+
+\def\tabulatesetpreamblewidthauto
+ {\global\advance\nofautotabulate\plusone
+ \ifcase\tabulatealign\relax
+ \dodosettabulatepreamble\bskip \eskip \or
+ \dodosettabulatepreamble\tabulatebskipraggedright \eskip \or
+ \dodosettabulatepreamble\tabulatebskipraggedleft \eskip \or
+ \dodosettabulatepreamble\tabulatebskipraggedcenter\eskip \fi}
+
+\def\tabulatesetpreamblewidthsimple
+ {\dodosettabulatepreamble\xbskip\xeskip}
+
+\bgroup \catcode`\|=\@@other
+
+\gdef\nexttabulate#1|%
+ {\let\tabulatealign\@@tabulatealign
+ \let\tabulatemodus\zerocount
+ \let\tabulatedimen\zerocount
+ \let\tabulatereshape\zerocount
+ \tabulatebefore\emptytoks
+ \tabulateafter\emptytoks
+ \tabulatebmath\emptytoks
+ \tabulateemath\emptytoks
+ \tabulatefont\emptytoks
+ \tabulatesettings\emptytoks
+ \global\advance\tabulatecolumns\plusone
+ \expandafter\let\csname\??tt:s:\the\tabulatecolumns\endcsname\donothing
+ \settabulatepreamble#1\relax\relax % permits i without n
+ \ifcase\tabulatemodus\relax
+ \tabulatesetpreamblewidthnormal
+ \or % fixed width
+ \tabulatesetpreamblewidthfixed
+ \or % auto width
+ \tabulatesetpreamblewidthauto
+ \or % simple
+ \tabulatesetpreamblewidthsimple
+ \fi
+ \futurelet\next\donexttabulate}
+
+\egroup
+
+\def\donexttabulate
+ {\ifx\next\relax\else
+ \expandafter\nexttabulate
+ \fi}
+
+\def\splitofftabulatebox % overloaded in anch-pgr
+ {\dontcomplain
+ \global\setbox\tabulatebox % % % global ? % % %
+ \vsplit\tablebox\tabulatecolumn to \lineheight
+ \setbox\tabulatebox\normalvbox
+ {\unvbox\tabulatebox}%
+ \setbox\tabulatebox\hbox to \wd\tabulatebox
+ {\hss\dotabulatehook{\box\tabulatebox}\hss}%
+ \ht\tabulatebox\strutht
+ \dp\tabulatebox\strutdp
+ \box\tabulatebox}
+
+\def\dotabulatehook {\csname\??tt:h:\the\tabulatecolumn\endcsname}
+\def\dotabulatealign{\csname\??tt:a:\the\tabulatecolumn\endcsname}
+
+\def\resettabulatepheight
+ {\global\tabulateminplines\plusone
+ \ifdim\tabulatemaxpheight>\zeropoint
+ \getnoflines\tabulatemaxpheight
+ \global\tabulatemaxplines\noflines
+ \else
+ \global\tabulatemaxplines\zerocount
+ \fi
+ \global\tabulatemaxpheight\zeropoint}
+
+\def\settabulatepheight
+ {\scratchdimen\ht\tablebox\tabulatecolumn\relax
+ \ifdim\scratchdimen>\tabulatemaxpheight
+ \global\tabulatemaxpheight\scratchdimen
+ \fi}
+
+% \def\handletabulatepbreak
+% {\TABLEnoalign
+% {\ifhandletabulatepbreak
+% \iftabulatenopbreak
+% \dotabulatenobreak
+% \else\ifnum\tabulatemaxplines>\plusone
+% \ifnum\tabulateminplines=\plusone
+% \dotabulatenobreak
+% \fi
+% \global\advance\tabulateminplines\plusone
+% \ifnum\tabulateminplines=\tabulatemaxplines\relax
+% \dotabulatenobreak
+% \fi
+% \fi \fi
+% \fi}}
+
+\def\dohandletabulatepbreak
+ {\ifhandletabulatepbreak
+ \iftabulatenopbreak
+ \dotabulatenobreak
+ \else\ifnum\tabulatemaxplines>\plusone
+ \ifnum\tabulateminplines=\plusone
+ \dotabulatenobreak
+ \fi
+ \global\advance\tabulateminplines\plusone
+ \ifnum\tabulateminplines=\tabulatemaxplines\relax
+ \dotabulatenobreak
+ \fi
+ \fi \fi
+ \fi}
+
+\def\handletabulatepbreak
+ {\TABLEnoalign{\dohandletabulatepbreak}}
+
+%D \startbuffer
+%D \starttabulate[|c|p|p|]
+%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR
+%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR
+%D \NC 2 \NC \thinrules[n=3] \NC \thinrules[n=3] \NC\NR
+%D \NC 3 \NC oh yes \NC simply no \NC\NR
+%D \NC 4 \NC very true \NC as false as can be \NC\NR
+%D \NC 5 \NC \thinrules[n=5] \NC \thinrules[n=5] \NC\NR
+%D \NC 6 \NC \thinrules[n=3] \NC \thinrules[n=4] \NC\NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer {\tracetabulatetrue\getbuffer}
+%D
+%D \startbuffer
+%D \starttabulate[|c|p|p|]
+%D \NC \bf Alpha \NC \bf Beta \NC \bf Gamma \NC\NR
+%D \NC 1 \NC right indeed \NC definitely wrong \NC\NR
+%D \NC 2 \NC oh yes \NC simply no \NC\NR
+%D \NC 3 \NC very true \NC as false as can be \NC\NR
+%D \NC 4 \NC the whole truth \NC but the truth \NC\NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer {\tracetabulatetrue\getbuffer}
+
+% \definetabulate
+% \redefinetabulate
+% \starttabulate[preamble]
+% \starttabulate -> \starttabulate[|l|p|]
+
+\bgroup \catcode`\|=\@@other
+
+\gdef\definetabulate
+ {\dotripleempty\dodefinetabulate}
+
+\gdef\dodefinetabulate[#1][#2][#3]%
+ {\ifthirdargument
+ \ifcsname\??tt#1::\c!unit\endcsname \else
+ \copyparameters
+ [\??tt#1::][\??tt\v!tabulate::]%
+ [\c!frame,\c!distance,\c!unit,\c!before,\c!bodyfont,\c!after,
+ \c!inner,\c!indenting,\c!margin,\c!align,\c!header,\c!title,
+ \c!rulecolor,\c!rulethickness,\c!split,EQ]%
+ \fi
+ \copyparameters
+ [\??tt#1::#2][\??tt#1::]%
+ [\c!unit,\c!distance,\c!before,\c!bodyfont,\c!after,
+ \c!inner,\c!indenting,\c!frame,\c!split,\c!header,\c!title,
+ \c!margin,\c!align,\c!rulecolor,\c!rulethickness,EQ]%
+ \setvalue{\e!start#1::#2}{\dofinalstarttabulate[#1][#2][#3]}%
+ \setvalue{\e!start#1}{\bgroup\dosubstarttabulate[#1]}%
+ \letvalue{\??tt#1-\v!header}\empty
+ \letvalue{\??tt#1-\v!footer }\empty
+ \else\ifsecondargument
+ \definetabulate[#1][][#2]%
+ \else
+ \definetabulate[#1][][|l|p|]%
+ \fi\fi}
+
+\egroup
+
+\let\tabulateheadcontent\empty
+\let\tabulatetailcontent\empty
+
+\newconditional\tabulatesomeamble
+
+\def\processtabulateheadcontent
+ {\TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ \csname\??tt\currenttabulate-\v!header\endcsname
+ \TABLEnoalign{\global\setfalse\tabulatesomeamble}}%
+
+\def\processtabulatetailcontent
+ {\TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ \csname\??tt\currenttabulate-\v!footer\endcsname
+ \TABLEnoalign{\global\setfalse\tabulatesomeamble}}%
+
+\def\checkfulltabulatecontent % - needed, else confusion with \c!header
+ {\ifcsname\??tt\currenttabulate-\v!header\endcsname
+ \let\tabulateheadcontent\processtabulateheadcontent
+ \else
+ \let\tabulateheadcontent\empty
+ \fi
+ \ifcsname\??tt\currenttabulate-\v!footer\endcsname
+ \let\tabulatetailcontent\processtabulatetailcontent
+ \else
+ \let\tabulatetailcontent\empty
+ \fi}
+
+% \def\fulltabulatecontent
+% {\tabulateheadcontent
+% \tabulatecontent
+% \tabulatetailcontent}
+
+\def\fulltabulatecontent
+ {\tabulateheadcontent
+ \tabulatecontent
+ \tabulatetailcontent
+ \removefunnytabulateline}
+
+\def\removefunnytabulateline
+ {\ifhmode
+ \strut\crcr
+ \TABLEnoalign{\kern-\lineheight}%
+ \fi}
+
+\setvalue{\e!start\v!tabulatehead}%
+ {\dosingleempty\dostartstarttabulatehead}
+
+\def\dostartstarttabulatehead[#1]%
+ {\processcontent{\e!stop\v!tabulatehead}\next
+ {\letvalue{\??tt\iffirstargument#1\else\v!tabulate\fi::-\v!header}\next}}
+
+\setvalue{\e!start\v!tabulatetail}%
+ {\dosingleempty\dostartstarttabulatetail}
+
+\def\dostartstarttabulatetail[#1]%
+ {\processcontent{\e!stop\v!tabulatetail}\next
+ {\letvalue{\??tt\iffirstargument#1\else\v!tabulate\fi::-\v!footer}\next}}
+
+\def\dosubstarttabulate
+ {\dodoubleempty\dodosubstarttabulate}
+
+\def\dodosubstarttabulate[#1][#2]%
+ {\csname\e!start#1::\ifcsname\e!start#1::#2\endcsname#2\fi\endcsname}
+
+\setvalue{\e!start\v!tabulate}%
+ {\bgroup\dodoubleempty\donormalstarttabulate}
+
+\bgroup
+
+\gdef\donormalstarttabulate[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??tt\v!tabulate::][#2]%
+ \fi
+ \iffirstargument
+ \def\next{\dofinalstarttabulate[\v!tabulate][][#1]}%
+ \else
+ \def\next{\dofinalstarttabulate[\v!tabulate][][|l|p|]}%
+ \fi
+ \next}
+
+\egroup
+
+% The much neede hook:
+
+\newtoks\everytabulate
+
+% An example of its usage:
+
+\appendtoks \optimizeverbatimfalse \to \everytabulate
+\appendtoks \let\recodeverbatimmode\plustwo \to \everytabulate
+
+% A status variable:
+
+\chardef\tabulatepass=0
+
+\def\tabulateparameter#1{\csname\??tt\currenttabulate#1\endcsname}
+
+\bgroup
+ \catcode`\|=\@@other \gdef\@@otherbar{|}
+ \catcode`\|=\@@active \gdef\@@useotherbar{\let|\@@otherbar}
+\egroup
+
+\def\doparsetabulate
+ {\futurelet\next\dodoparsetabulate}
+
+% \def\dodoparsetabulate % \@EAEAEA gebruiken
+% {\ifx\next\relax
+% % exit
+% \else\ifx*\next
+% \let\next\dorepeatparsetabulate
+% \else\ifx\bgroup\next
+% \let\next\dododoparsetabulate
+% \else
+% \let\next\dodododoparsetabulate
+% \fi\fi\fi
+% \next}%
+
+\def\dorepeatparsetabulate*#1#2%
+ {\dorecurse{#1}{\!!toksb\expandafter{\the\!!toksb#2}}% \dorecurse{#1}{\appendtoks#2\to\!!toksb}%
+ \doparsetabulate}
+
+\def\dododoparsetabulate#1%
+ {\!!toksb\expandafter{\the\!!toksb{#1}}% \appendtoks{#1}\to\!!toksb
+ \doparsetabulate}
+
+\def\dodododoparsetabulate#1%
+ {\!!toksb\expandafter{\the\!!toksb#1}% \appendtoks#1\to\!!toksb
+ \doparsetabulate}
+
+\letvalue{\??tt<\meaning *}\dorepeatparsetabulate
+\letvalue{\??tt<\meaning \bgroup}\dododoparsetabulate
+\letvalue{\??tt<\meaning \relax}\donothing
+\letvalue{\??tt<\s!unknown }\dodododoparsetabulate
+
+\def\dodoparsetabulate
+ {\csname\??tt<\ifcsname\??tt<\meaning\next\endcsname\meaning\next\else\s!unknown\fi\endcsname}
+
+\setvalue{\??tt:\c!split:\v!yes }{\splittabulatetrue}
+\setvalue{\??tt:\c!split:\v!repeat}{\splittabulatetrue}
+\setvalue{\??tt:\c!split:\v!no }{\splittabulatefalse}
+\setvalue{\??tt:\c!split:\v!auto }{\ifinsidefloat\ifinsidesplitfloat\else\splittabulatefalse\fi\fi}
+
+\def\dofinalstarttabulate[#1][#2][#3]% identifier sub preamble
+ {\edef\currenttabulate{#1::#2}%
+ \ifinsidefloat \else
+ \whitespace
+ \tabulateparameter\c!before
+ \fi
+ \bgroup
+ \resetcharacteralign
+ % todo: spacing around tabulate when bodyfont is set
+ % expansion en test needed ?
+ \splittabulatetrue
+ \csname\??tt:\c!split:\tabulateparameter\c!split\endcsname
+ \doifvaluesomething{\??tt\currenttabulate\c!bodyfont}
+ {\expanded{\switchtobodyfont[\tabulateparameter\c!bodyfont]}}%
+ \postponenotes % new, to be tested / will be configurable
+ \let\tabulatepass\plusone
+ \widowpenalty\zerocount % otherwise lines are not broken
+ \clubpenalty \zerocount % but overlap in funny ways
+ \the\everytabulate
+ \tabulateparameter\c!inner
+ \doifelsevalue{\??tt\currenttabulate\c!indenting}\v!yes
+ {\edef\tabulateindent{\the\dimexpr\leftskip+\hangindent+\parindent}}% \ctxparindent
+ {\edef\tabulateindent{\the\dimexpr\leftskip+\hangindent }}%
+ \global\tabulatecolumn\zerocount
+ \!!toksb\emptytoks
+ \bgroup
+ \@@useotherbar
+ \normalexpanded{\egroup\noexpand\doparsetabulate#3\relax}%
+ \processcontent
+ {\e!stop#1}% \currenttabulate}
+ \tabulatecontent
+ {\@EA\processtabulate\@EA[\the\!!toksb]}}
+
+\chardef\tabulatetype=0
+
+% 0 = NC column next EQ equal column
+% 1 = RC column raw RQ equal column raw
+% 2 = HC column hook HQ equal column hook
+
+\newif\iftabulatefirstflushed
+
+\def\tabulateEQ
+ {\iftabulatefirstflushed\else\tabulateparameter{EQ}\fi
+ \global\tabulateequalfalse}
+
+% \def\tabulatenormalcolumn#1%
+% {&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&}
+%
+% \def\tabulateequalcolumn#1%
+% {&\tabulateEQ&\global\chardef\tabulatetype#1&}
+%
+% however, \unskip en \ignorespaces permit usage in complex XML/\starttabulate
+
+\def\tabulatenormalcolumn#1%
+ {\unskip&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&%
+ \ignorespaces}
+
+\def\tabulateequalcolumn#1%
+ {\unskip&\tabulateEQ&\global\chardef\tabulatetype#1&%
+ \ignorespaces}
+
+\def\tabulateautocolumn
+ {\tabulatenormalcolumn\zerocount
+ \ifnum\tabulatecolumn>\tabulatecolumns\relax
+ \expandafter\NR
+ \else
+ \expandafter\ignorespaces % interferes with the more tricky hooks
+ \fi}
+
+\def\setquicktabulate#1% see \startlegend \startgiven
+ {\let#1\tabulateautocolumn
+ \let\\\tabulateautocolumn}
+
+\def\dotabulateruleseperator % can be sped up (will do when used frequently)
+ {\bgroup
+ \let\factor\!!plusone
+ \scratchskip\strutdp
+ \ExpandFirstAfter\processallactionsinset
+ [\tabulateparameter\c!distance]
+ [ \v!blank=>\scratchskip\bigskipamount,
+ \v!depth=>\scratchskip\strutdp,
+ \v!small=>\def\factor{.25},
+ \v!medium=>\def\factor{.5},
+ \v!big=>,
+ \v!none=>\scratchskip\zeropoint\def\factor{0},
+ \v!grid=>\scratchskip\zeropoint\def\factor{0},
+ \s!unknown=>\scratchskip\commalistelement]%
+ \scratchdimen\factor\scratchskip
+ \ifconditional\tabulatesomeamble\kern\else\vskip\fi\scratchdimen % new
+ \egroup}
+
+\def\dodotabulaterule#1%
+ {\color
+ [\tabulateparameter\c!rulecolor]
+ {\scratchdimen\tabulateparameter\c!rulethickness#1}}
+
+\def\dotabulaterule
+ {\dodotabulaterule
+ {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
+ \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
+ {\kern-\scratchdimen}}} % experimental tm-prikkels
+
+\def\dotabulatelinerule
+ {\multispan\totaltabulatecolumns % \multispan is a plain macro
+ % for the moment this one
+ \strut\hskip\tabulateparameter\c!margin
+ % neg values are ok !
+ \hskip\tabulateindent % new august 2003
+ \dodotabulaterule
+ {\!!heighta.5\lineheight
+ \advance\!!heighta-\strutdepth
+ \!!deptha-\!!heighta
+ \advance\!!deptha\scratchdimen
+ \leaders\hrule\!!height\!!heighta\!!depth\!!deptha\hfill}%
+ \cr}
+
+%D When set to true, no (less) break optimization is done.
+
+\newif\iftolerantTABLEbreak % used in styles !
+
+%D The main processing macro is large but splitting it up
+%D would make things less clear.
+
+\def\doregistertabulateparoptions
+ {\iftrialtypesetting \else
+ \registerparoptions
+ \ifinsidefloat
+ % that is, an unbreakable one
+ \glet\registertabulateparoptions\empty
+ \else
+ % unsafe in crossing pages, at each b...
+ % \glet\registertabulateparoptions\empty
+ \fi
+ \fi}
+
+\appendtoks
+ \glet\registertabulateparoptions\doregistertabulateparoptions
+\to \everytabulate
+
+\newtoks\everytabulaterow
+
+\appendtoks
+ \registertabulateparoptions
+\to \everytabulaterow
+
+\def\flushtabulateindent
+ {\ifnum\tabulatecolumn=\zerocount
+ \hbox to \tabulateindent
+ {% we now have a local hsize, and since we want to
+ % register positional info (i.e. real hsizes) we
+ % need to reconstitute the original hsize
+ \advance\hsize\tabulateindent
+ % this is indeed rather messy and took a few hours
+ % to dis/uncover
+ \the\everytabulaterow
+ \hss}%
+ \fi}
+
+\def\totaltabulatecolumns{0}
+
+\def\handletabulatedigits{\digits}
+
+%D Beware, we cannot use \type {\unexpanded} on \type {\HL}
+%D cum suis, since \TEX's hard coded noalign lookahead fails
+%D on it! I mistakenly added this for a while.
+
+\chardef\tabulaterepeathead\zerocount
+
+\newcount\noftabulatelines
+\newcount\totalnoftabulatelines
+\newcount\minusnoftabulatelines
+
+\setvalue{\??tt:\c!align:\v!normal}{0}
+\setvalue{\??tt:\c!align:\v!right }{1}
+\setvalue{\??tt:\c!align:\v!left }{2}
+\setvalue{\??tt:\c!align:\v!middle}{3}
+
+\setvalue{\??tt:\c!header:\v!repeat}{\plusone}
+\setvalue{\??tt:\c!header:\v!text }{\plustwo}
+
+\newtoks\everyaftertabulaterow
+
+\def\tabulatebskipone {\setbox\tabulatebox\vbox\bgroup\glet\tabulatehook\notabulatehook}
+\def\tabulateeskipone {\par\egroup\glet\tabulatehook\dotabulatehook}
+\def\tabulatexbskipone{\hbox\bgroup\vbox\bgroup\glet\tabulatehook\notabulatehook}
+\def\tabulatexeskipone{\par\egroup\egroup\glet\tabulatehook\dotabulatehook}
+
+\def\tabulatebaselinecorrection
+ {\def\dobaselinecorrection % todo: mkiv
+ {\vskip-\prevdepth
+ \vskip\strutdp
+ \vskip\strutdp}%
+ \baselinecorrection}
+
+\unexpanded\def\tabulateNCone{\tabulatenormalcolumn0}
+\unexpanded\def\tabulateRCone{\tabulatenormalcolumn1}
+\unexpanded\def\tabulateHCone{\tabulatenormalcolumn2}
+\unexpanded\def\tabulateEQone{\tabulateequalcolumn 0}
+\unexpanded\def\tabulateRQone{\tabulateequalcolumn 1}
+\unexpanded\def\tabulateHQone{\tabulateequalcolumn 2}
+\unexpanded\def\tabulateNGone{\NC\handletabulatecharalign}
+\unexpanded\def\tabulateNNone{\NC\handletabulatedigits} % new, undocumented, test first
+\unexpanded\def\tabulateNDone{\NC\handletabulatedigits} % same, for old times sake
+\unexpanded\def\tabulateHRone{\doHR\zerocount}
+\unexpanded\def\tabulateHLone{\doHL\zerocount}
+
+\unexpanded\def\tabulateNRone % next row
+ {\global\advance\noftabulatelines\plusone
+ \global\tabulatefirstflushedfalse
+ \global\tabulateequalfalse
+ \global\tabulatecolumn\zerocount
+ \resettabulatepheight
+ \unskip\unskip\crcr\flushtabulated
+ \TABLEnoalign{\the\everyaftertabulaterow}%
+ \TABLEnoalign{\checktabulatepenaltiesa}}
+
+\def\checktabulatepenaltiesa
+ {\iftolerantTABLEbreak\else
+ \ifnum\totalnoftabulatelines=\plusone
+ % \allowbreak
+ \else
+ \ifconditional\tabulatesomeamble \ifcase\tabulaterepeathead \else
+ \allowbreak
+ \fi \fi
+ \ifnum\noftabulatelines=\plusone
+ \dotabulatenobreak
+ \else\ifnum\noftabulatelines=\minusnoftabulatelines
+ \ifnum\tabulatemaxplines<\plustwo
+ \dotabulatenobreak
+ \else
+ \allowbreak % needed with pbreak prevention
+ \fi
+ \else
+ \allowbreak % needed with pbreak prevention
+ \fi\fi
+ \fi
+ \fi
+ \global\tabulatefirstflushedfalse}
+
+\def\tabulatebbskiptwo
+ {\ifvoid\tablebox\tabulatecolumn
+ \ifx\flushtabulatedindeed\empty\else
+ \setbox0\hbox
+ \fi
+ \fi}
+
+\def\tabulatebskiptwoeskip
+ {\par\egroup
+ \settabulatepheight
+ \glet\tabulatehook\dotabulatehook
+ \splitofftabulatebox}
+
+\def\tabulatebskiptwo
+ {\ifvoid\tablebox\tabulatecolumn
+ \global\setbox\tablebox\tabulatecolumn\vbox
+ \bgroup
+ \glet\tabulatehook\notabulatehook
+ \ifautotabulate\hsize\tabulatewidth\fi
+ % \begstrut % interferes with pre-\pars
+ % evt: \appendtoks\begstrut\to\everypar
+ \ignorespaces
+ \let\eskip\tabulatebskiptwoeskip
+ \else
+ \let\eskip\empty
+ \dontcomplain
+ \glet\tabulatehook\dotabulatehook
+ \expandafter\splitofftabulatebox
+ \fi}
+
+\def\tabulatexbskiptwo{\bskip}
+\def\tabulatexeskiptwo{\eskip}
+
+% \def\tabulateflushtabulatedtwo
+% {\TABLEnoalign % noalign % no interference !
+% {\glet\flushtabulatedindeed\empty
+% \global\tabulatecolumn\zerocount
+% \handletabulatepbreak
+% \dorecurse\tabulatecolumns % was: \noftabcolumns
+% {\ifvoid\tablebox\recurselevel\else
+% \gdef\flushtabulatedindeed{\the\tabulatedummy}%
+% \fi}%
+% \global\tabulatefirstflushedtrue}%
+% \flushtabulatedindeed}
+
+\def\dotabulateflushtabulatedtwo
+ {\glet\flushtabulatedindeed\empty
+ \global\tabulatecolumn\zerocount
+ \handletabulatepbreak
+ \dorecurse\tabulatecolumns % was: \noftabcolumns
+ {\ifvoid\tablebox\recurselevel\else
+ \gdef\flushtabulatedindeed{\the\tabulatedummy}%
+ \fi}%
+ \global\tabulatefirstflushedtrue}
+
+\def\tabulateflushtabulatedtwo
+ {\TABLEnoalign{\dotabulateflushtabulatedtwo}%
+ \flushtabulatedindeed}
+
+\def\tabulatebskipthree
+ {\vtop\bgroup
+ \ifautotabulate\hsize\tabulatewidth\fi
+ % \begstrut % interferes with pre-\pars
+ % evt: \appendtoks\begstrut\to\everypar
+ \ignorespaces}
+
+\def\tabulateeskipthree % vertical strut added august 2003
+ {\par\verticalstrut\vskip-\struttotal\egroup}
+
+\def\tabulatedoHLfour#1% #1 ignored
+ {\TABLEnoalign
+ {\csname
+ \ifnum\noftabulatelines=\zerocount F\else
+ \ifnum\noftabulatelines=\totalnoftabulatelines L\else
+ M\fi\fi
+ L\endcsname}}%
+
+\def\tabulatedoHRfour#1% horizontal rule line (break untested)
+ {\TABLEnoalign
+ {\globallet\TABLEautoline\dotabulatelinerule
+ \ifcase#1\or
+ \ifnum\noftabulatelines=\zerocount
+ \gdef\TABLEautoline{\TABLEnoalign{}}%
+ \else\ifnum\noftabulatelines=\totalnoftabulatelines
+ \gdef\TABLEautoline{\TABLEnoalign{}}%
+ \fi\fi
+ \fi
+ \dotabulatenobreak}%
+ \TABLEautoline
+ \TABLEnoalign
+ {\nobreak
+ \ifx\TABLEautoline\dotabulatelinerule\kern-\lineheight\fi
+ \ifnum\noftabulatelines=\totalnoftabulatelines
+ \@EA\dotabulatenobreak
+ \else
+ \@EA\allowbreak
+ \fi}%
+ \TABLEautoline
+ \TABLEnoalign
+ {\dotabulatenobreak}}
+
+\def\tabulateFLfive{\TABLEnoalign
+ {\ifinsidefloat\else
+ \doifemptyvalue{\??tt\currenttabulate\c!before} % no expansion
+ {\tabulatebaselinecorrection}%
+ \fi
+ \dotabulaterule
+ \dotabulatenobreak
+ \dotabulateruleseperator
+ \prevdepth\strutdp
+ \dotabulatenobreak}}
+
+% see ***
+%
+% \enabletrackers[nodes.page_vspacing]
+% \starttext
+% \starttabulate[||] \dorecurse{100}{\NC Eins \NC \NR \HL} \stoptabulate
+% \stoptext
+
+\def\tabulateMLfive{\TABLEnoalign
+ {\dotabulateruleseperator
+ \dotabulaterule
+ \ifnum\noftabulatelines>\plusone
+ \ifnum\noftabulatelines<\minusnoftabulatelines
+ % *** somehow topskip messes up as it's intercepted
+ % \vskip \topskip\allowbreak\vskip- \topskip
+ % messy anyhow so this needs to be improved, so for
+ % the momenet we keep this bugged variant
+ \vskip1\topskip\allowbreak\vskip-1\topskip
+ \vskip-\tabulateparameter\c!rulethickness
+ \dotabulaterule
+ \fi
+ \fi
+ \dotabulateruleseperator}}
+
+\def\tabulateLLfive{\TABLEnoalign
+ {\dotabulatenobreak
+ \dotabulateruleseperator
+ \dotabulatenobreak
+ \dotabulaterule
+ \ifinsidefloat\else
+ \doifemptyvalue{\??tt\currenttabulate\c!after} % no expansion
+ {\vskip\strutdp
+ \verticalstrut
+ \vskip-\struttotal}%
+ \fi}}
+
+\def\tabulateHLfive
+ {\doHL\zerocount}
+
+\def\tabulaterule {\HR}% a rule with lineheight
+\def\tabulateline {\HL}% just a spaced rule
+\def\tabulateautorule{\doHR\plusone}%
+\def\tabulateautoline{\doHL\plusone}%
+
+\bgroup \catcode`\|=\@@other
+
+\gdef\processtabulate[|#1|]% in the process of optimizing
+ {\tabulateunit\tabulateparameter\c!unit
+ \checkfulltabulatecontent
+ \globallet\tabulateruledepth \!!zeropoint
+ \globallet\tabulateruleheight\!!zeropoint
+ \edef\@@tabulatealign{\executeifdefined{\??tt:\c!align:\tabulateparameter\c!align}0}%
+ \let\pretabskip\!!zeropoint
+ \def\postabskip{.5\tabulateunit}%
+ \global\tabulatecolumns\zerocount
+ \global\nofautotabulate\zerocount
+ \global\noftabulatelines\zerocount
+ \totalnoftabulatelines\noftabulatelines
+ \minusnoftabulatelines\noftabulatelines
+ \global\tabulatepwidth\zeropoint
+ \global\tabulatexwidth\zeropoint
+ \global\tabulateequalfalse
+ \resettabulatepheight
+ \ifinsidesplitfloat
+ \donetrue
+ \else\ifinsidefloat
+ \donefalse
+ \else
+ \donetrue
+ \fi\fi
+ \ifdone
+ \chardef\tabulaterepeathead\executeifdefined{\??tt:\c!header:\tabulateparameter\c!header}\zerocount
+ \fi
+ \let\NC\tabulateNCone
+ \let\RC\tabulateRCone
+ \let\HC\tabulateHCone
+ \let\EQ\tabulateEQone
+ \let\RQ\tabulateRQone
+ \let\HQ\tabulateHQone
+ \let\NG\tabulateNGone
+ \let\NN\tabulateNNone
+ \let\ND\tabulateNDone
+ \let\HR\tabulateHRone
+ \let\HL\tabulateHLone
+ \let\NR\tabulateNRone
+ \let\HL\empty % not needed ? ? ?
+ \let\SR\NR \let\AR\NR
+ \let\FL\empty \let\FR\NR
+ \let\ML\empty \let\MR\NR
+ \let\LL\empty \let\LR\NR
+ \let\doHR\gobbleoneargument
+ \let\doHL\gobbleoneargument
+ \glet\flushtabulated\empty
+ \tabskip\zeropoint
+ \ifdim\tabulateparameter\c!margin>\zeropoint
+ \!!toksa{&\flushtabulateindent\strut##\tabskip\tabulateparameter\c!margin\strut&##\tabskip\zeropoint}%
+ \else
+ \!!toksa{&\flushtabulateindent\strut##&##\tabskip\zeropoint}%
+ \fi
+ \tabulatewidth\zeropoint
+ \nexttabulate #1X|\relax
+ \edef\totaltabulatecolumns{\the\numexpr3*\tabulatecolumns+4}%
+ \tabulatewidth\zeropoint
+ \initializetableboxes\tabulatecolumns
+ \appendtoks&##\global\advance\tabulatecolumn\plusone\to\!!toksa
+ \appendtoks\NC\unskip\unskip\crcr\flushtabulated\to\tabulatedummy % no count
+ \global\tabulatecolumn\zerocount
+ \resettabulatepheight
+ \let\bskip \tabulatebskipone
+ \let\eskip \tabulateeskipone
+ \let\xbskip\tabulatexbskipone
+ \let\xeskip\tabulatexeskipone
+ \glet\tabulatehook\dotabulatehook
+ \doifvalue{\??tt\currenttabulate\c!indenting}\v!no\forgetparindent
+ \ifinsidefloat
+ \let\tabulateindent\!!zeropoint
+ \else
+ \setlocalhsize \hsize\localhsize
+ \fi
+ \dontcomplain
+ \forgetall % hm, interference with \forgetparindent ^^^ probably bug, to be solved
+ \setbox0\vbox % outside \if because of line counting
+ {\notesenabledfalse
+ \let\tabulateindent\!!zeropoint
+ \trialtypesettingtrue % very important
+ \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}}%
+ \ifnum\nofautotabulate>\zerocount
+ % so, even if the natural size is larger, in the final
+ % run, we force the calculated width
+ \tabulatewidth\dimexpr\hsize-\wd0-\tabulatepwidth-\tabulatexwidth\relax
+ \ifnum\nofautotabulate>\zerocount
+ \divide\tabulatewidth \nofautotabulate\relax
+ \fi
+ \fi
+ \let\xbskip\tabulatexbskiptwo
+ \let\xeskip\tabulatexeskiptwo
+ \ifsplittabulate
+ \splittopskip\strutht
+ \glet\flushtabulatedindeed\empty
+ \let\bbskip\tabulatebbskiptwo
+ \let\bskip\tabulatebskiptwo
+ \glet\flushtabulated\tabulateflushtabulatedtwo
+ \else
+ % tabhook op alles ?
+ \let\bskip\tabulatebskipthree
+ \let\eskip\tabulateeskipthree
+ \fi
+ \totalnoftabulatelines\noftabulatelines
+ \minusnoftabulatelines\numexpr\noftabulatelines+\minusone\relax
+ \global\noftabulatelines\zerocount
+ \let\doHL\tabulatedoHLfour
+ \let\doHR\tabulatedoHRfour
+ \doifelsevalue{\??tt\currenttabulate\c!rule}\v!line
+ {\let\HL\HR
+ \let\tabulateautoline\tabulateautorule
+ \let\tabulateline\tabulaterule}%
+ {\let\HL\tabulateHLfive}%
+ \let\FL\tabulateFLfive
+ \let\ML\tabulateMLfive
+ \let\LL\tabulateLLfive
+ \let\tabulatepass\plustwo
+ %
+ \ifcase\tabulaterepeathead
+ \ifinsidesplitfloat
+ \setbox\tabulatebox\vbox \bgroup
+ \else
+ \startframedcontent[\tabulateparameter\c!frame]%
+ \fi
+ \else
+ \setbox\tabulatebox\vbox \bgroup
+ \fi
+ %
+ \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}%
+ \prevdepth\strutdp % nog eens beter, temporary hack
+ \doifvalue{\??tt\currenttabulate\c!distance}\v!grid{\vskip-\strutdp}% experimental tm-prikkels
+ %
+ \ifcase\tabulaterepeathead
+ \ifinsidesplitfloat
+ \egroup \splittabulatebox\tabulatebox
+ \else
+ \stopframedcontent
+ \fi
+ \else
+ \egroup \splittabulatebox\tabulatebox
+ \fi
+ %
+ \egroup
+ \ifinsidefloat \else
+ \tabulateparameter\c!after
+ \fi
+ \egroup}
+
+\egroup
+
+% \setuptabulate[split=yes,header=text,title=Vervolg van Tabel]
+%
+% % \starttabulatehead
+% % \NC test \NC hans\NC \NR
+% % \stoptabulatehead
+%
+% \starttabulate
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input knuth \relax \NC \NR
+% \NC test \NC \input knuth \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \NC test \NC \input tufte \relax \NC \NR
+% \stoptabulate
+
+\def\splittabulatebox#1% #1 <> 0/2 / derived from the one in core-ntb.tex
+ {\ifinsidesplitfloat
+ \dosplittabulatebox#1%
+ \else\ifinsidefloat
+ \unvbox#1%
+ \else
+ \dosplittabulatebox#1%
+ \fi\fi}
+
+\def\dosplittabulatebox#1%
+ {\resettsplit
+ \def\tsplitminimumfreelines{2}%
+ \def\tsplitminimumfreespace{0pt}%
+ \setbox\tsplitcontent\box#1%
+ \ifcase\tabulaterepeathead\or
+ \setbox\tsplithead\vsplit\tsplitcontent to \lineheight
+ \setbox\tsplithead\vbox{\unvbox\tsplithead}%
+ \or
+ \setbox\tsplithead\vbox{\hbox{\strut\tabulateparameter\c!title}}%
+ \fi
+ \handletsplit}
+
+%D \starttyping
+%D \setuptabulate[split=no,rule=line]
+%D
+%D \starttabulate
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
+%D \stoptabulate
+%D \stoptyping
+
+% \starttabulatie[|mc|]
+% \NC \digits{100.000,00} \NC\NR
+% \NC \digits{@10.000,00} \NC\NR
+% \NC \digits{@@@.100,00} \NC\NR
+% \NC \digits{@@@.@10,@@} \NC\NR
+% \NC \digits{@@@.@@1,@@} \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|mc|]
+% \ND 100.000,00 \NC\NR
+% \ND @10.000,00 \NC\NR
+% \ND @@@.100,00 \NC\NR
+% \ND @@@.@10,@@ \NC\NR
+% \ND @@@.@@1,@@ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \ND $100.000,00$ \NC\NR
+% \ND $@10.000,00$ \NC\NR
+% \ND $@@@.100,00$ \NC\NR
+% \ND $@@@.@10,@@$ \NC\NR
+% \ND $@@@.@@1,@@$ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \NC $\digits 100.000,00 $ \NC\NR
+% \NC $\digits @10.000,00 $ \NC\NR
+% \NC $\digits @@@.100,00 $ \NC\NR
+% \NC $\digits @@@.@10,@@ $ \NC\NR
+% \NC $\digits @@@.@@1,@@ $ \NC\NR
+% \stoptabulatie
+%
+% \starttabulatie[|c|]
+% \NC \digits $100.000,00$ \NC\NR
+% \NC \digits $@10.000,00$ \NC\NR
+% \NC \digits $@@@.100,00$ \NC\NR
+% \NC \digits $@@@.@10,@@$ \NC\NR
+% \NC \digits $@@@.@@1,@@$ \NC\NR
+% \stoptabulatie
+
+\unexpanded\def\setuptabulate
+ {\dotripleempty\dosetuptabulate}
+
+\def\dosetuptabulate[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??tt#1::#2][#3]%
+ \else\ifsecondargument
+ \getparameters[\??tt#1::][#2]%
+ \else
+ \getparameters[\??tt\v!tabulate::][#1]%
+ \fi\fi}
+
+\setuptabulate
+ [\c!unit=1em,
+ EQ={:},
+ \c!frame=\v!off,
+ \c!bodyfont=,
+ \c!rule=\v!normal,
+ \c!rulecolor=,
+ \c!rulethickness=\linewidth,
+ \c!inner=,
+ \c!before=\blank,
+ \c!after=\blank,
+ \c!distance={\v!depth,\v!medium},
+ \c!align=\v!normal,
+ \c!margin=\!!zeropoint,
+ \c!split=\v!auto,
+ \c!header=\v!yes,
+ \c!title=,
+ \c!indenting=\v!no]
+
+\protect \endinput
diff --git a/tex/context/base/tabl-tsp.mkii b/tex/context/base/tabl-tsp.mkii
new file mode 100644
index 000000000..49bb7ad90
--- /dev/null
+++ b/tex/context/base/tabl-tsp.mkii
@@ -0,0 +1,427 @@
+%D \module
+%D [ file=tabl-tsp,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Splitting,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / Splitting}
+
+%D The code in this file is move here from other places.
+
+\unprotect
+
+% only to be used with single tokens (will be prim)
+
+\ifx\htdp\undefined \def\htdp#1{\dimexpr\ht#1+\dp#1\relax} \fi
+
+%D Although the name resembles floats, and therefore this should be
+%D a page module, we decided to make it core functionality because the
+%D table code depends on it. Othrwise there would be too much
+%D overloading afterwards involved. Actually, the float part is rather
+%D generic and not that related to floats.
+
+% \splitfloat [settings] {\placetable[optional args]{test}} {content}
+
+\definenumber
+ [\??si]
+ [\c!way=\v!by\v!text,
+ \c!conversion=\@@siconversion]
+
+\def\setupfloatsplitting
+ {\dodoubleargument\getparameters[\??si]}
+
+\newif\ifinsidesplitfloat % will become chardef
+
+\newtoks \everysplitfloatsetup
+
+\def\splitfloat
+ {\dosingleempty\dosplitfloat}
+
+\ifx\floatcaptionsuffix\undefined \else
+ \let\floatcaptionsuffix\empty % will become \splitfloatcaptionsuffix
+\fi
+
+\def\extrasplitfloatlines{0}
+
+\def\dosplitfloat[#1]#2% nog dubbele refs
+ {\bgroup
+ \global\setfalse\splitfloatdone
+ \aftergroup\checksplitfloat
+ \insidefloattrue
+ \insidesplitfloattrue
+ \getparameters[\??si][#1]%
+ \resetnumber[\??si]%
+ \def\floatcaptionsuffix{\convertednumber[\??si]}%
+ \let\extrasplitfloatlines\@@silines
+ \the\everysplitfloatsetup
+ \def\splitfloatcommand{#2}%
+ \global\settrue \onlyonesplitofffloat
+ \global\setfalse\somenextplitofffloat
+ \dopushsavedfloats
+ \@@sibefore
+ \let\next} % \bgroup
+
+\def\checksplitfloat
+ {\ifconditional\splitfloatdone\else
+ \blank{\tttf \getmessage\m!floatblocks{13}\empty}\blank
+ \showmessage\m!floatblocks{13}\empty
+ \fi}
+
+\settrue \onlyonesplitofffloat
+\setfalse\somenextplitofffloat
+
+%D When \type {inbetween} is made empty instead of the
+%D default \type {\page}, we will get delayed flushing
+%D and text may continue below the graphic.
+%D
+%D \starttyping
+%D \dorecurse{2}{\input tufte }
+%D
+%D \splitfloat[lines=auto,inbetween=]
+%D {\placetable{\dorecurse{5}{test\recurselevel\endgraf}}}
+%D {\bTABLE[split=yes]
+%D \bTR \bTD 11 \eTD \bTD \input tufte \eTD \eTR
+%D \bTR \bTD 12 \eTD \bTD \input zapf \eTD \eTR
+%D \bTR \bTD 13 \eTD \bTD \input bryson \eTD \eTR
+%D \bTR \bTD 14 \eTD \bTD test \eTD \eTR
+%D \bTR \bTD 21 \eTD \bTD \input tufte \eTD \eTR
+%D \bTR \bTD 22 \eTD \bTD \input zapf \eTD \eTR
+%D \bTR \bTD 23 \eTD \bTD \input bryson \eTD \eTR
+%D \bTR \bTD 24 \eTD \bTD test \eTD \eTR
+%D \bTR \bTD 31 \eTD \bTD \input tufte \eTD \eTR
+%D \bTR \bTD 32 \eTD \bTD \input zapf \eTD \eTR
+%D \bTR \bTD 33 \eTD \bTD \input bryson \eTD \eTR
+%D \bTR \bTD 34 \eTD \bTD test \eTD \eTR
+%D \eTABLE}
+%D
+%D \dorecurse{10}{\input tufte }
+%D \stoptyping
+
+\newconditional\splitfloatdone
+
+\def\dodowithsplitofffloat
+ {\dowithnextbox
+ {\forgetall
+ \dontcomplain
+ \global\settrue\splitfloatdone
+ \chardef\nodelocationmode\zerocount % bypass auto-renumbering
+ \incrementnumber[\??si]%
+ \ifcase\rawnumber[\??si]\or \ifconditional\onlyonesplitofffloat
+ \let\floatcaptionsuffix\empty
+ \fi \fi
+ \bgroup
+ \ifconditional\somenextplitofffloat
+ \settrue\retainfloatnumber
+\notesenabledfalse % best here, experimental, brrr; test with note in caption
+ \else
+ \setfalse\retainfloatnumber
+ \fi
+ \splitfloatcommand{\box\nextbox}%
+ \egroup
+ \ifconditional\somenextplitofffloat
+ \doifelsenothing\@@siinbetween
+ {\ifconditional\splitfloatfirstdone\else\page\fi}
+ \@@siinbetween
+ \else
+ \@@siafter
+ \dopopsavedfloats
+ \doflushsavedfloats
+ \fi
+ \global\settrue\splitfloatfirstdone}%
+ \vbox}
+
+\def\nodowithsplitofffloat
+ {\dowithnextbox
+ {\forgetall
+ \dontcomplain
+ \box\nextbox % maybe an option to unvbox
+ \global\settrue\splitfloatfirstdone}%
+ \vbox}
+
+\def\dochecksplitofffloat#1% box
+ {\ifinsidesplitfloat
+ \ifdim\ht#1=\zeropoint
+ \global\setfalse\somenextplitofffloat
+ \else
+ \global\settrue \somenextplitofffloat
+ \global\setfalse\onlyonesplitofffloat
+ \fi
+ \fi}
+
+\def\analyzesplitfloatcaption#1% depends on page-flt
+ {\doif\extrasplitfloatlines\v!auto
+ {\bgroup
+ \settrue\retainfloatnumber
+ \chardef\nodelocationmode\zerocount
+ \forcelocalfloats
+ \setuplocalfloats[\c!before=,\c!after=,\c!inbetween=]%
+ \splitfloatcommand{\hbox to \wd#1{\strut}}% dummy line
+ \setbox\scratchbox\vbox{\flushlocalfloats}%
+ \getnoflines{\ht\scratchbox}%
+ \resetlocalfloats
+ \advance\noflines\minusone % compensate dummy line
+ \expanded{\egroup\noexpand\edef\noexpand\extrasplitfloatlines{\the\noflines}}}}
+
+% \def\analyzesplitfloatcaption#1%
+% {\edef\extrasplitfloatlines{11}}
+
+\def\dowithsplitofffloat % nextbox
+ {\ifinsidesplitfloat
+ \expandafter\dodowithsplitofffloat
+ \else
+ \expandafter\nodowithsplitofffloat
+ \fi}
+
+\def\doifnotinsidesplitfloat
+ {\ifinsidesplitfloat\expandafter\gobbleoneargument\fi}
+
+%D Some defaults:
+
+\setupfloatsplitting
+ [\c!conversion=\v!character, % \v!romannumerals
+ \c!lines=3,
+ \c!before=,
+ \c!inbetween=\page,
+ \c!after=]
+
+%D Table splitter, on top of previous code:
+
+\newbox\tsplitcontent
+\newbox\tsplitresult
+\newbox\tsplithead
+\newbox\tsplitnext
+\newbox\tsplittail
+
+\def\resettsplit{% only \def's starting a a new line are seen by the dep checker
+ \def\tsplitminimumfreelines{0}%
+ \def\tsplitminimumfreespace{0pt}%
+ \setbox\tsplitcontent \vbox{}%
+ \setbox\tsplitresult \vbox{}%
+ \setbox\tsplithead \vbox{}%
+ \setbox\tsplitnext \vbox{}%
+ \setbox\tsplittail \vbox{}%
+ \let\tsplitbeforeresult\donothing
+ \let\tsplitafterresult \donothing
+ \let\tsplitinbetween \donothing
+ \let\tsplitbefore \donothing
+ \let\tsplitafter \donothing
+ \let\postprocesstsplit \donothing
+}
+
+\resettsplit
+
+% todo: keep tail to rest, so we need a lookahead
+
+\newconditional\splitfloatfirstdone
+
+\def\handletsplit
+ {\analyzesplitfloatcaption\tsplitcontent
+ \global\setfalse\splitfloatfirstdone
+ \testpagesync % new, sync, but still tricky
+ [\tsplitminimumfreelines]
+ [\dimexpr\tsplitminimumfreespace+\extrasplitfloatlines\lineheight\relax]%
+ \setbox\scratchbox\vbox{\tsplitinbetween}%
+ \edef\tsplitinbetweenheight{\the\htdp\scratchbox}% etex
+ \!!doneafalse
+ \doloop
+ {\ifinsidecolumns
+ % brrr, assumes empty columns
+ \global\setfalse\splitfloatfirstdone
+ \scratchdimen\textheight
+ \!!donectrue
+ \else
+ \ifconditional\splitfloatfirstdone
+ \scratchdimen\textheight
+ \!!donectrue
+ \else\ifdim\pagegoal<\maxdimen
+ \scratchdimen\dimexpr\pagegoal-\pagetotal\relax
+ \!!donecfalse
+ \else
+ \scratchdimen\textheight
+ \!!donectrue
+ \fi\fi
+ \fi
+ \scratchdimen\dimexpr\scratchdimen-\tsplitinbetweenheight-\tsplitminimumfreespace-\extrasplitfloatlines\lineheight\relax
+ \ifdim\htdp\tsplittail>\zeropoint
+ \advance\scratchdimen-\htdp\tsplittail
+ \fi
+ \setbox\tsplitresult\vbox
+ {\ifdim\ht\tsplithead>\zeropoint
+ \unvcopy\tsplithead
+ \tsplitinbetween
+ \fi}%
+ \if!!donea\else\ifdim\ht\tsplitnext>\zeropoint
+ \setbox\tsplithead\box\tsplitnext
+ \fi\fi
+ \!!doneatrue
+ \ifdim\ht\tsplitresult>\zeropoint
+ \!!donedtrue % table head
+ \else
+ \!!donedfalse % no tablehead
+ \fi
+ \splittopskip\zeropoint
+ \doloop
+ {\setbox\scratchbox\vsplit\tsplitcontent to \onepoint % \lineheight
+ \setbox\scratchbox\vbox{\unvbox\scratchbox}%
+ \ifdim\dimexpr\scratchdimen-\htdp\scratchbox-\htdp\tsplitresult\relax>\zeropoint
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvbox\scratchbox}%
+ \ifvoid\tsplitcontent \exitloop \fi
+ \else\if!!doned
+ % we only have a tablehead so far
+ \setbox\tsplitresult\vbox{\unvbox\tsplitresult\unvbox\scratchbox}%
+ \exitloop
+ \else\if!!donec
+ % we have text height available, but the (one) cell is too
+ % large to fit, so, in order to avoid loops/deadcycles we do:
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvbox\scratchbox}%
+ \exitloop
+ \else
+ \setbox\tsplitcontent\vbox
+ {\unvbox\scratchbox
+ \tsplitinbetween
+ \ifvoid\tsplitcontent\else\unvbox\tsplitcontent\fi}%
+ \exitloop
+ \fi\fi\fi
+ \!!donedfalse
+ \!!donecfalse}%
+ \postprocesstsplit
+ \dochecksplitofffloat\tsplitcontent
+ \ifvoid\tsplitcontent
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvcopy\tsplittail}%
+ \dowithsplitofffloat{\tsplitbeforeresult\box\tsplitresult\tsplitafterresult}%
+ \doifnotinsidesplitfloat\tsplitafter
+ \endgraf
+ \exitloop
+ \else
+ % hack
+ \ifdim\pagegoal<\maxdimen
+ \global\pagegoal\dimexpr\pagegoal+\lineheight\relax % etex
+ \fi
+ % brrr
+ \ifdim\ht\tsplitresult>\zeropoint
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvcopy\tsplittail}%
+ \dowithsplitofffloat{\tsplitbeforeresult\box\tsplitresult\tsplitafterresult}%
+ \doifnotinsidesplitfloat\tsplitafter
+ \endgraf
+ \fi
+ \ifinsidecolumns
+ \doifnotinsidesplitfloat\goodbreak
+ \else
+ \doifnotinsidesplitfloat\page
+ \fi
+ \fi}%
+ \global\setfalse\splitfloatfirstdone} % we can use this one for tests
+
+\protect \endinput
+
+% test cases
+
+% \setupTABLE[split=repeat]
+%
+% \input tufte \endgraf
+% \splitfloat[lines=11]
+% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}}
+% {\bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \splitfloat[lines=0]
+% {}
+% {\bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE}
+% \input tufte \endgraf \page
+%
+% \input tufte \endgraf
+% \bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE
+% \input tufte \page
+
+% \setuptabulate[split=yes]
+%
+% \input tufte \endgraf
+% \splitfloat[lines=11]
+% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}}
+% {\starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \splitfloat[lines=0]
+% {}
+% {\starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate
+% \input tufte \page
+
+% \setuptables[split=yes]
+%
+% \newtoks\TestToks
+%
+% \TestToks\emptytoks
+% \appendtoks\starttablehead\to\TestToks
+% \dorecurse{3}{\appendtoks\VL head \VL head \VL \SR\to\TestToks}
+% \appendtoks\stoptablehead\to\TestToks
+% \appendtoks\starttabletail\to\TestToks
+% \dorecurse{3}{\appendtoks\VL tail \VL tail \VL \SR\to\TestToks}
+% \appendtoks\stoptabletail\to\TestToks
+% \appendtoks\starttables[|c|c|]\to\TestToks
+% \dorecurse{100}{\appendtoks\VL test \VL test \VL \SR\to\TestToks}
+% \appendtoks\stoptables\to\TestToks
+%
+% \input tufte \endgraf
+% \splitfloat[lines=auto] % [lines=11]
+% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}}
+% {\the\TestToks}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \splitfloat[lines=0]
+% {}
+% {\the\TestToks}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \the\TestToks
+% \input tufte \page
+%
+% multiple floats
+%
+% \starttext
+% \dorecurse{3}{\input tufte } \endgraf
+% \dorecurse{5}{\placefigure{}{\framed[height=.5\textheight]{}}}
+% \splitfloat[lines=auto,inbetween=]
+% {\placetable{\dorecurse{5}{test\recurselevel\endgraf}}}
+% {\bTABLE[split=yes]
+% \bTR \bTD 11 \eTD \bTD \input tufte \eTD \eTR
+% \bTR \bTD 12 \eTD \bTD \input zapf \eTD \eTR
+% \bTR \bTD 13 \eTD \bTD \input bryson \eTD \eTR
+% \bTR \bTD 14 \eTD \bTD test \eTD \eTR
+% \bTR \bTD 21 \eTD \bTD \input tufte \eTD \eTR
+% \bTR \bTD 22 \eTD \bTD \input zapf \eTD \eTR
+% \bTR \bTD 23 \eTD \bTD \input bryson \eTD \eTR
+% \bTR \bTD 24 \eTD \bTD test \eTD \eTR
+% \bTR \bTD 31 \eTD \bTD \input tufte \eTD \eTR
+% \bTR \bTD 32 \eTD \bTD \input zapf \eTD \eTR
+% \bTR \bTD 33 \eTD \bTD \input bryson \eTD \eTR
+% \bTR \bTD 34 \eTD \bTD test \eTD \eTR
+% \eTABLE}
+% \dorecurse{10}{\input tufte }
+% \stoptext
diff --git a/tex/context/base/tabl-tsp.mkiv b/tex/context/base/tabl-tsp.mkiv
new file mode 100644
index 000000000..9ceb3af6e
--- /dev/null
+++ b/tex/context/base/tabl-tsp.mkiv
@@ -0,0 +1,429 @@
+%D \module
+%D [ file=tabl-tsp,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Table Macros,
+%D subtitle=Splitting,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Table Macros / Splitting}
+
+%D The code in this file is move here from other places.
+
+\unprotect
+
+% only to be used with single tokens (will be prim)
+
+\ifx\htdp\undefined \def\htdp#1{\dimexpr\ht#1+\dp#1\relax} \fi
+
+%D Although the name resembles floats, and therefore this should be
+%D a page module, we decided to make it core functionality because the
+%D table code depends on it. Othrwise there would be too much
+%D overloading afterwards involved. Actually, the float part is rather
+%D generic and not that related to floats.
+
+% \splitfloat [settings] {\placetable[optional args]{test}} {content}
+
+% \def\s!noftablesplits{nofsplittables}
+
+\definenumber % we need a nicer name like nofsplittables, we then also need to set \s!parent
+ [\??si]
+ [\c!way=\v!by\v!text,
+ \c!conversion=\@@siconversion]
+
+\unexpanded\def\setupfloatsplitting
+ {\dodoubleargument\getparameters[\??si]}
+
+\newif\ifinsidesplitfloat % will become chardef
+
+\newtoks \everysplitfloatsetup
+
+\def\splitfloat
+ {\dosingleempty\dosplitfloat}
+
+\ifx\floatcaptionsuffix\undefined \else
+ \let\floatcaptionsuffix\empty % will become \splitfloatcaptionsuffix
+\fi
+
+\def\extrasplitfloatlines{0}
+
+\def\dosplitfloat[#1]#2% nog dubbele refs
+ {\bgroup
+ \global\setfalse\splitfloatdone
+ \aftergroup\checksplitfloat
+ \insidefloattrue
+ \insidesplitfloattrue
+ \getparameters[\??si][#1]%
+ \resetnumber[\??si]%
+ \def\floatcaptionsuffix{\convertednumber[\??si]}%
+ \let\extrasplitfloatlines\@@silines
+ \the\everysplitfloatsetup
+ \def\splitfloatcommand{#2}%
+ \global\settrue \onlyonesplitofffloat
+ \global\setfalse\somenextplitofffloat
+ \dopushsavedfloats
+ \@@sibefore
+ \let\next} % \bgroup
+
+\def\checksplitfloat
+ {\ifconditional\splitfloatdone\else
+ \blank{\tttf \getmessage\m!floatblocks{13}\empty}\blank
+ \showmessage\m!floatblocks{13}\empty
+ \fi}
+
+\settrue \onlyonesplitofffloat
+\setfalse\somenextplitofffloat
+
+%D When \type {inbetween} is made empty instead of the
+%D default \type {\page}, we will get delayed flushing
+%D and text may continue below the graphic.
+%D
+%D \starttyping
+%D \dorecurse{2}{\input tufte }
+%D
+%D \splitfloat[lines=auto,inbetween=]
+%D {\placetable{\dorecurse{5}{test\recurselevel\endgraf}}}
+%D {\bTABLE[split=yes]
+%D \bTR \bTD 11 \eTD \bTD \input tufte \eTD \eTR
+%D \bTR \bTD 12 \eTD \bTD \input zapf \eTD \eTR
+%D \bTR \bTD 13 \eTD \bTD \input bryson \eTD \eTR
+%D \bTR \bTD 14 \eTD \bTD test \eTD \eTR
+%D \bTR \bTD 21 \eTD \bTD \input tufte \eTD \eTR
+%D \bTR \bTD 22 \eTD \bTD \input zapf \eTD \eTR
+%D \bTR \bTD 23 \eTD \bTD \input bryson \eTD \eTR
+%D \bTR \bTD 24 \eTD \bTD test \eTD \eTR
+%D \bTR \bTD 31 \eTD \bTD \input tufte \eTD \eTR
+%D \bTR \bTD 32 \eTD \bTD \input zapf \eTD \eTR
+%D \bTR \bTD 33 \eTD \bTD \input bryson \eTD \eTR
+%D \bTR \bTD 34 \eTD \bTD test \eTD \eTR
+%D \eTABLE}
+%D
+%D \dorecurse{10}{\input tufte }
+%D \stoptyping
+
+\newconditional\splitfloatdone
+
+\def\dodowithsplitofffloat
+ {\dowithnextbox
+ {\forgetall
+ \dontcomplain
+ \global\settrue\splitfloatdone
+ \chardef\nodelocationmode\zerocount % bypass auto-renumbering
+ \incrementnumber[\??si]%
+ \ifcase\rawnumber[\??si]\or \ifconditional\onlyonesplitofffloat
+ \let\floatcaptionsuffix\empty
+ \fi \fi
+ \bgroup
+ \ifconditional\somenextplitofffloat
+ \settrue\retainfloatnumber
+\notesenabledfalse % best here, experimental, brrr; test with note in caption
+ \else
+ \setfalse\retainfloatnumber
+ \fi
+ \splitfloatcommand{\box\nextbox}%
+ \egroup
+ \ifconditional\somenextplitofffloat
+ \doifelsenothing\@@siinbetween
+ {\ifconditional\splitfloatfirstdone\else\page\fi}
+ \@@siinbetween
+ \else
+ \@@siafter
+ \dopopsavedfloats
+ \doflushsavedfloats
+ \fi
+ \global\settrue\splitfloatfirstdone}%
+ \vbox}
+
+\def\nodowithsplitofffloat
+ {\dowithnextbox
+ {\forgetall
+ \dontcomplain
+ \box\nextbox % maybe an option to unvbox
+ \global\settrue\splitfloatfirstdone}%
+ \vbox}
+
+\def\dochecksplitofffloat#1% box
+ {\ifinsidesplitfloat
+ \ifdim\ht#1=\zeropoint
+ \global\setfalse\somenextplitofffloat
+ \else
+ \global\settrue \somenextplitofffloat
+ \global\setfalse\onlyonesplitofffloat
+ \fi
+ \fi}
+
+\def\analyzesplitfloatcaption#1% depends on page-flt
+ {\doif\extrasplitfloatlines\v!auto
+ {\bgroup
+ \settrue\retainfloatnumber
+ \chardef\nodelocationmode\zerocount
+ \forcelocalfloats
+ \setuplocalfloats[\c!before=,\c!after=,\c!inbetween=]%
+ \splitfloatcommand{\hbox to \wd#1{\strut}}% dummy line
+ \setbox\scratchbox\vbox{\flushlocalfloats}%
+ \getnoflines{\ht\scratchbox}%
+ \resetlocalfloats
+ \advance\noflines\minusone % compensate dummy line
+ \expanded{\egroup\noexpand\edef\noexpand\extrasplitfloatlines{\the\noflines}}}}
+
+% \def\analyzesplitfloatcaption#1%
+% {\edef\extrasplitfloatlines{11}}
+
+\def\dowithsplitofffloat % nextbox
+ {\ifinsidesplitfloat
+ \expandafter\dodowithsplitofffloat
+ \else
+ \expandafter\nodowithsplitofffloat
+ \fi}
+
+\def\doifnotinsidesplitfloat
+ {\ifinsidesplitfloat\expandafter\gobbleoneargument\fi}
+
+%D Some defaults:
+
+\setupfloatsplitting
+ [\c!conversion=\v!character, % \v!romannumerals
+ \c!lines=3,
+ \c!before=,
+ \c!inbetween=\page,
+ \c!after=]
+
+%D Table splitter, on top of previous code:
+
+\newbox\tsplitcontent
+\newbox\tsplitresult
+\newbox\tsplithead
+\newbox\tsplitnext
+\newbox\tsplittail
+
+\def\resettsplit{% only \def's starting a a new line are seen by the dep checker
+ \def\tsplitminimumfreelines{0}%
+ \def\tsplitminimumfreespace{0pt}%
+ \setbox\tsplitcontent \vbox{}%
+ \setbox\tsplitresult \vbox{}%
+ \setbox\tsplithead \vbox{}%
+ \setbox\tsplitnext \vbox{}%
+ \setbox\tsplittail \vbox{}%
+ \let\tsplitbeforeresult\donothing
+ \let\tsplitafterresult \donothing
+ \let\tsplitinbetween \donothing
+ \let\tsplitbefore \donothing
+ \let\tsplitafter \donothing
+ \let\postprocesstsplit \donothing
+}
+
+\resettsplit
+
+% todo: keep tail to rest, so we need a lookahead
+
+\newconditional\splitfloatfirstdone
+
+\def\handletsplit
+ {\analyzesplitfloatcaption\tsplitcontent
+ \global\setfalse\splitfloatfirstdone
+ \testpagesync % new, sync, but still tricky
+ [\tsplitminimumfreelines]
+ [\dimexpr\tsplitminimumfreespace+\extrasplitfloatlines\lineheight\relax]%
+ \setbox\scratchbox\vbox{\tsplitinbetween}%
+ \edef\tsplitinbetweenheight{\the\htdp\scratchbox}% etex
+ \!!doneafalse
+ \doloop
+ {\ifinsidecolumns
+ % brrr, assumes empty columns
+ \global\setfalse\splitfloatfirstdone
+ \scratchdimen\textheight
+ \!!donectrue
+ \else
+ \ifconditional\splitfloatfirstdone
+ \scratchdimen\textheight
+ \!!donectrue
+ \else\ifdim\pagegoal<\maxdimen
+ \scratchdimen\dimexpr\pagegoal-\pagetotal\relax
+ \!!donecfalse
+ \else
+ \scratchdimen\textheight
+ \!!donectrue
+ \fi\fi
+ \fi
+ \scratchdimen\dimexpr\scratchdimen-\tsplitinbetweenheight-\tsplitminimumfreespace-\extrasplitfloatlines\lineheight\relax
+ \ifdim\htdp\tsplittail>\zeropoint
+ \advance\scratchdimen-\htdp\tsplittail
+ \fi
+ \setbox\tsplitresult\vbox
+ {\ifdim\ht\tsplithead>\zeropoint
+ \unvcopy\tsplithead
+ \tsplitinbetween
+ \fi}%
+ \if!!donea\else\ifdim\ht\tsplitnext>\zeropoint
+ \setbox\tsplithead\box\tsplitnext
+ \fi\fi
+ \!!doneatrue
+ \ifdim\ht\tsplitresult>\zeropoint
+ \!!donedtrue % table head
+ \else
+ \!!donedfalse % no tablehead
+ \fi
+ \splittopskip\zeropoint
+ \doloop
+ {\setbox\scratchbox\vsplit\tsplitcontent to \onepoint % \lineheight
+ \setbox\scratchbox\vbox{\unvbox\scratchbox}%
+ \ifdim\dimexpr\scratchdimen-\htdp\scratchbox-\htdp\tsplitresult\relax>\zeropoint
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvbox\scratchbox}%
+ \ifvoid\tsplitcontent \exitloop \fi
+ \else\if!!doned
+ % we only have a tablehead so far
+ \setbox\tsplitresult\vbox{\unvbox\tsplitresult\unvbox\scratchbox}%
+ \exitloop
+ \else\if!!donec
+ % we have text height available, but the (one) cell is too
+ % large to fit, so, in order to avoid loops/deadcycles we do:
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvbox\scratchbox}%
+ \exitloop
+ \else
+ \setbox\tsplitcontent\vbox
+ {\unvbox\scratchbox
+ \tsplitinbetween
+ \ifvoid\tsplitcontent\else\unvbox\tsplitcontent\fi}%
+ \exitloop
+ \fi\fi\fi
+ \!!donedfalse
+ \!!donecfalse}%
+ \postprocesstsplit
+ \dochecksplitofffloat\tsplitcontent
+ \ifvoid\tsplitcontent
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvcopy\tsplittail}%
+ \dowithsplitofffloat{\tsplitbeforeresult\box\tsplitresult\tsplitafterresult}%
+ \doifnotinsidesplitfloat\tsplitafter
+ \endgraf
+ \exitloop
+ \else
+ % hack
+ \ifdim\pagegoal<\maxdimen
+ \global\pagegoal\dimexpr\pagegoal+\lineheight\relax % etex
+ \fi
+ % brrr
+ \ifdim\ht\tsplitresult>\zeropoint
+ \setbox\tsplitresult\vbox
+ {\unvbox\tsplitresult
+ \tsplitinbetween
+ \unvcopy\tsplittail}%
+ \dowithsplitofffloat{\tsplitbeforeresult\box\tsplitresult\tsplitafterresult}%
+ \doifnotinsidesplitfloat\tsplitafter
+ \endgraf
+ \fi
+ \ifinsidecolumns
+ \doifnotinsidesplitfloat\goodbreak
+ \else
+ \doifnotinsidesplitfloat\page
+ \fi
+ \fi}%
+ \global\setfalse\splitfloatfirstdone} % we can use this one for tests
+
+\protect \endinput
+
+% test cases
+
+% \setupTABLE[split=repeat]
+%
+% \input tufte \endgraf
+% \splitfloat[lines=11]
+% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}}
+% {\bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \splitfloat[lines=0]
+% {}
+% {\bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE}
+% \input tufte \endgraf \page
+%
+% \input tufte \endgraf
+% \bTABLE\dorecurse{100}{\bTR \bTD test \eTD \eTR}\eTABLE
+% \input tufte \page
+
+% \setuptabulate[split=yes]
+%
+% \input tufte \endgraf
+% \splitfloat[lines=11]
+% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}}
+% {\starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \splitfloat[lines=0]
+% {}
+% {\starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \starttabulate\dorecurse{200}{\NC test \NC test \NC \NR}\stoptabulate
+% \input tufte \page
+
+% \setuptables[split=yes]
+%
+% \newtoks\TestToks
+%
+% \TestToks\emptytoks
+% \appendtoks\starttablehead\to\TestToks
+% \dorecurse{3}{\appendtoks\VL head \VL head \VL \SR\to\TestToks}
+% \appendtoks\stoptablehead\to\TestToks
+% \appendtoks\starttabletail\to\TestToks
+% \dorecurse{3}{\appendtoks\VL tail \VL tail \VL \SR\to\TestToks}
+% \appendtoks\stoptabletail\to\TestToks
+% \appendtoks\starttables[|c|c|]\to\TestToks
+% \dorecurse{100}{\appendtoks\VL test \VL test \VL \SR\to\TestToks}
+% \appendtoks\stoptables\to\TestToks
+%
+% \input tufte \endgraf
+% \splitfloat[lines=auto] % [lines=11]
+% {\placetable{\dorecurse{10}{test\recurselevel\endgraf}}}
+% {\the\TestToks}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \splitfloat[lines=0]
+% {}
+% {\the\TestToks}
+% \input tufte \page
+%
+% \input tufte \endgraf
+% \the\TestToks
+% \input tufte \page
+%
+% multiple floats
+%
+% \starttext
+% \dorecurse{3}{\input tufte } \endgraf
+% \dorecurse{5}{\placefigure{}{\framed[height=.5\textheight]{}}}
+% \splitfloat[lines=auto,inbetween=]
+% {\placetable{\dorecurse{5}{test\recurselevel\endgraf}}}
+% {\bTABLE[split=yes]
+% \bTR \bTD 11 \eTD \bTD \input tufte \eTD \eTR
+% \bTR \bTD 12 \eTD \bTD \input zapf \eTD \eTR
+% \bTR \bTD 13 \eTD \bTD \input bryson \eTD \eTR
+% \bTR \bTD 14 \eTD \bTD test \eTD \eTR
+% \bTR \bTD 21 \eTD \bTD \input tufte \eTD \eTR
+% \bTR \bTD 22 \eTD \bTD \input zapf \eTD \eTR
+% \bTR \bTD 23 \eTD \bTD \input bryson \eTD \eTR
+% \bTR \bTD 24 \eTD \bTD test \eTD \eTR
+% \bTR \bTD 31 \eTD \bTD \input tufte \eTD \eTR
+% \bTR \bTD 32 \eTD \bTD \input zapf \eTD \eTR
+% \bTR \bTD 33 \eTD \bTD \input bryson \eTD \eTR
+% \bTR \bTD 34 \eTD \bTD test \eTD \eTR
+% \eTABLE}
+% \dorecurse{10}{\input tufte }
+% \stoptext
diff --git a/tex/context/base/task-ini.lua b/tex/context/base/task-ini.lua
new file mode 100644
index 000000000..aaa97ec49
--- /dev/null
+++ b/tex/context/base/task-ini.lua
@@ -0,0 +1,94 @@
+if not modules then modules = { } end modules ['task-ini'] = {
+ version = 1.001,
+ comment = "companion to task-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this is a temporary solution, we need to isolate some modules and then
+-- the load order can determine the trickery to be applied to node lists
+--
+-- we can disable more handlers and enable then when really used (*)
+
+tasks.appendaction("processors", "normalizers", "fonts.collections.process") -- todo
+tasks.appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled
+
+tasks.appendaction("processors", "characters", "chars.handle_mirroring") -- disabled
+tasks.appendaction("processors", "characters", "chars.handle_casing") -- disabled
+tasks.appendaction("processors", "characters", "chars.handle_digits") -- disabled
+tasks.appendaction("processors", "characters", "chars.handle_breakpoints") -- disabled
+tasks.appendaction("processors", "characters", "scripts.preprocess")
+
+tasks.appendaction("processors", "words", "kernel.hyphenation") -- always on
+tasks.appendaction("processors", "words", "languages.words.check") -- disabled
+
+tasks.appendaction("processors", "fonts", "nodes.process_characters") -- maybe todo
+tasks.appendaction("processors", "fonts", "nodes.inject_kerns") -- maybe todo
+tasks.appendaction("processors", "fonts", "nodes.protect_glyphs", nil, "nohead") -- maybe todo
+tasks.appendaction("processors", "fonts", "kernel.ligaturing") -- always on
+tasks.appendaction("processors", "fonts", "kernel.kerning") -- always on
+tasks.appendaction("processors", "fonts", "nodes.stripping.process") -- disabled (might move)
+
+tasks.appendaction("processors", "lists", "lists.handle_spacing") -- disabled
+tasks.appendaction("processors", "lists", "lists.handle_kerning") -- disabled
+
+tasks.appendaction("shipouts", "normalizers", "nodes.cleanup_page") -- maybe todo
+tasks.appendaction("shipouts", "normalizers", "nodes.add_references") -- disabled
+tasks.appendaction("shipouts", "normalizers", "nodes.add_destinations") -- disabled
+tasks.appendaction("shipouts", "normalizers", "nodes.rules.process") -- disabled
+tasks.appendaction("shipouts", "normalizers", "nodes.shifts.process") -- disabled
+
+tasks.appendaction("shipouts", "finishers", "shipouts.handle_color") -- disabled
+tasks.appendaction("shipouts", "finishers", "shipouts.handle_transparency") -- disabled
+tasks.appendaction("shipouts", "finishers", "shipouts.handle_colorintent") -- disabled
+tasks.appendaction("shipouts", "finishers", "shipouts.handle_negative") -- disabled
+tasks.appendaction("shipouts", "finishers", "shipouts.handle_effect") -- disabled
+tasks.appendaction("shipouts", "finishers", "shipouts.handle_viewerlayer") -- disabled
+
+tasks.appendaction("math", "normalizers", "noads.relocate_characters", nil, "nohead") -- always on
+tasks.appendaction("math", "normalizers", "noads.resize_characters", nil, "nohead") -- always on
+tasks.appendaction("math", "normalizers", "noads.respace_characters", nil, "nohead") -- always on
+
+tasks.appendaction("math", "builders", "noads.mlist_to_hlist") -- always on
+
+-- quite experimental
+
+tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust") -- todo
+
+-- rather new
+
+tasks.appendaction("mvlbuilders", "normalizers", "nodes.migrate_outwards")
+tasks.appendaction("mvlbuilders", "normalizers", "nodes.handle_page_spacing") -- last !
+
+tasks.appendaction("vboxbuilders", "normalizers", "nodes.handle_vbox_spacing")
+
+-- speedup: only kick in when used
+
+tasks.disableaction("processors", "fonts.checkers.missing")
+tasks.disableaction("processors", "chars.handle_breakpoints")
+tasks.disableaction("processors", "chars.handle_casing")
+tasks.disableaction("processors", "chars.handle_digits")
+tasks.disableaction("processors", "chars.handle_mirroring")
+tasks.disableaction("processors", "languages.words.check")
+tasks.disableaction("processors", "lists.handle_spacing")
+tasks.disableaction("processors", "lists.handle_kerning")
+tasks.disableaction("processors", "nodes.stripping.process")
+
+tasks.disableaction("shipouts", "nodes.rules.process")
+tasks.disableaction("shipouts", "nodes.shifts.process")
+tasks.disableaction("shipouts", "shipouts.handle_color")
+tasks.disableaction("shipouts", "shipouts.handle_transparency")
+tasks.disableaction("shipouts", "shipouts.handle_colorintent")
+tasks.disableaction("shipouts", "shipouts.handle_effect")
+tasks.disableaction("shipouts", "shipouts.handle_negative")
+tasks.disableaction("shipouts", "shipouts.handle_viewerlayer")
+
+tasks.disableaction("shipouts", "nodes.add_references")
+tasks.disableaction("shipouts", "nodes.add_destinations")
+
+tasks.disableaction("mvlbuilders", "nodes.migrate_outwards")
+
+callbacks.freeze("find_.*_file", "find file using resolver")
+callbacks.freeze("read_.*_file", "read file at once")
+callbacks.freeze("open_.*_file", "open file for reading")
diff --git a/tex/context/base/task-ini.mkiv b/tex/context/base/task-ini.mkiv
new file mode 100644
index 000000000..ef32ee87d
--- /dev/null
+++ b/tex/context/base/task-ini.mkiv
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=task-ini,
+%D version=2007.06.06,
+%D title=\CONTEXT\ Task Handler,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Task Handler / initialization}
+
+\unprotect
+
+%D Maybe we will make things configureable (speed up and such).
+
+\registerctxluafile{task-ini}{1.001}
+
+\protect \endinput
diff --git a/tex/context/base/thrd-pic.tex b/tex/context/base/thrd-pic.tex
new file mode 100644
index 000000000..3c25d8a81
--- /dev/null
+++ b/tex/context/base/thrd-pic.tex
@@ -0,0 +1,3694 @@
+% Since this file is not available in every distribution, we
+% have copied the original in this file. The manuals to
+% Wichura's PiCTeX and TaBlE packages are not available on
+% line and are distributed by respectively the TeX Users Group
+% and Personal TeX Inc.
+
+% We've patched this file for catcode ! because in luatex we use
+% catcode tables and using unprotect/protect is cleaner.
+
+% This is PiCTeX, Version 1.1 9/21/87
+
+% CAVEAT: The PiCTeX manual often has a more lucid explanation
+% of any given topic than you will find in the internal documentation
+% of the macros.
+
+% PiCTeX's commands can be classified into two groups: (1) public (or
+% external), and (2) private (or internal). The public macros are
+% discussed at length in the manual. The only discussion of the private
+% macros is the internal documentation. The private macros all have
+% names beginning with an exclamation point (!) of category code 11.
+% Since in normal usage "!" has category code 12, these macros can't
+% be accessed or modified by the general user.
+
+% The macros are organized into thematically related groups. For example,
+% the macros dealing with dots & dashes are all in the DASHPATTERN group.
+% The table below shows which macros are in which groups. The table
+% covers all public macros, and many (but not all) of PiCTeX's upper level
+% private macros. Following the table, the various groups are listed
+% in the order in which they appear in the table.
+
+% *********************** TABLE OF GROUPS OF MACROS **********************
+
+% HACKS: Utility macros
+% \PiC
+% \PiCTeX
+% \placevalueinpts
+% \!!loop
+% \!cfor
+% \!copylist
+% \!ecfor
+% \!etfor
+% \!getnext
+% \!getnextvalueof
+% \!ifempty
+% \!ifnextchar
+% \!leftappend
+% \!listaddon
+% \!loop
+% \!lop
+% \!mlap
+% \!not
+% \!removept
+% \!rightappend
+% \!tfor
+% \!vmlap
+% \!wlet
+
+% ALLOCATION: Allocates registers
+
+% AREAS: Deals with plot areas
+% \axis
+% \grid
+% \invisibleaxes
+% \normalgraphs
+% \plotheading
+% \setplotarea
+% \visibleaxes
+
+% ARROWS: Draws arrows
+% \arrow
+% \betweenarrows
+
+% BARS: Draws bars
+% \putbar
+% \setbars
+
+% BOXES: Draws rectangles
+% \frame
+% \putrectangle
+% \rectangle
+% \shaderectangleson
+% \shaderectanglesoff
+
+% CURVES: Upper level plot commands
+% \hshade
+% \plot
+% \sethistograms
+% \setlinear
+% \setquadratic
+% \vshade
+
+% DASHPATTERNS: Sets up dash patterns
+% \findlength
+% \setdashes
+% \setdashesnear
+% \setdashpattern
+% \setdots
+% \setdotsnear
+% \setsolid
+% \!dashingoff
+% \!dashingon
+
+% DIVISION: Does long division of dimension registers
+% \Divide
+% \!divide
+
+% ELLIPSES: Draws ellipses and circles
+% \circulararc
+% \ellipticalarc
+
+% RULES: Draws rules, i.e., horizontal & vertical lines
+% \putrule
+% \!putdashedhline
+% \!putdashedvline
+% \!puthline
+% \!putsolidhline
+% \!putsolidvline
+% \!putvline
+
+% LINEAR ARC: Draws straight lines -- solid and dashed
+% \inboundscheckoff
+% \inboundscheckon
+% \!advancedashing
+% \!drawlinearsegment
+% \!initinboundscheck
+% \!linearsolid
+% \!lineardashed
+% \!ljoin
+% \!plotifinbounds
+% \!start
+
+% LOGTEN: Log_10 function
+% \!logten
+
+% PICTURES: Basic setups for PiCtures; \put commands
+% \accountingoff
+% \accountingon
+% \beginpicture
+% \endpicture
+% \endpicturesave
+% \lines
+% \multiput
+% \put
+% \setcoordinatemode
+% \setcoordinatesystem
+% \setdimensionmode
+% \stack
+% \Lines
+% \Xdistance
+% \Ydistance
+% \!dimenput
+% \!ifcoordmode
+% \!ifdimenmode
+% \!setcoordmode
+% \!setdimenmode
+% \!setputobject
+
+% PLOTTING: Things to do with plotting
+% \dontsavelinesandcurves
+% \replot
+% \savelinesandcurves
+% \setplotsymbol
+% \writesavefile
+% \!plot
+
+% PYTHAGORAS: Euclidean distance function
+% \placehypotenuse
+% \!Pythag
+
+% QUADRATIC ARC: Draws a quadratic arc
+% \!qjoin
+
+% ROTATIONS: Handles rotations
+% \startrotation
+% \stoprotation
+% \!rotateaboutpivot
+% \!rotateonly
+
+% SHADING: Handles shading
+% \setshadegrid
+% \setshadesymbol
+% \!lshade
+% \!qshade
+% \!starthshade
+% \!startvshade
+
+% TICKS: Draws ticks on graphs
+% \gridlines
+% \loggedticks
+% \nogridlines
+% \ticksin
+% \ticksout
+% \unloggesticks
+
+% ***************** END OF TABLE OF GROUPS OF MACROS ********************
+
+
+% \catcode`!=11 % ***** THIS MUST NEVER BE OMITTED
+
+\unprotect
+
+% *******************************
+% *** HACKS (Utility macros) ***
+% *******************************
+
+% ** User commands
+% ** \PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC}
+% ** \PiCTeX{\PiC\kern-.11em\TeX}
+% ** \placevalueinpts of <DIMENSION REGISTER> in {CONTROL SEQUENCE}
+
+% ** Internal commands
+% ** \!ifnextchar{CHARACTER}{TRUE ACTION}{FALSE ACTION}
+% ** \!tfor NAME := LIST \do {BODY}
+% ** \!etfor NAME:= LIST \do {BODY}
+% ** \!cfor NAME := LIST \do {BODY}
+% ** \!ecfor NAME:= LIST \do {BODY}
+% ** \!ifempty{MACRO}{TRUE ACTION}{FALSE ACTION}
+% ** \!getnext\\ITEMfrom\LIST
+% ** \!getnextvalueof\DIMEN\from\LIST
+% ** \!copylist\LISTMACRO_A\to\LISTMACRO_B
+% ** \!wlet\CONTROL_SEQUENCE_A=\CONTROL_SEQUENCE_B
+% ** \!listaddon ITEM LIST
+% ** \!rightappendITEM\withCS\to\LISTMACRO
+% ** \!leftappendITEM\withCS\to\LISTMACRO
+% ** \!lop\LISTMACRO\to\ITEM
+% ** \!loop ... repeat
+% ** \!!loop ... repeat
+% ** \!removept{DIMENSION REGISTER}{CONTROL SEQUENCE}
+% ** \!mlap{...}
+% ** \!vmlap{...}
+% ** \!not{TEK if-CONDITION}
+
+% ** First, here are the the PiCTeX logo, and the syllable PiC:
+\def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC}
+\def\PiCTeX{\PiC\kern-.11em\TeX}
+
+% ** The following macro expands to parameter #2 or parameter #3 according to
+% ** whether the next non-blank character following the macro is or is not #1.
+% ** Blanks following the macro are gobbled.
+\def\!ifnextchar#1#2#3{%
+ \let\!testchar=#1%
+ \def\!first{#2}%
+ \def\!second{#3}%
+ \futurelet\!nextchar\!testnext}
+\def\!testnext{%
+ \ifx \!nextchar \!spacetoken
+ \let\!next=\!skipspacetestagain
+ \else
+ \ifx \!nextchar \!testchar
+ \let\!next=\!first
+ \else
+ \let\!next=\!second
+ \fi
+ \fi
+ \!next}
+\def\\{\!skipspacetestagain}
+ \expandafter\def\\ {\futurelet\!nextchar\!testnext}
+\def\\{\let\!spacetoken= } \\ % ** set \spacetoken to a space token
+
+
+% ** Borrow the "tfor" macro from Latex:
+% ** \!tfor NAME := LIST \do {BODY}
+% ** if, before expansion, LIST = T1 ... Tn, where each Ti is a token
+% ** or {...}, then executes BODY n times, with NAME = Ti on the
+% ** i-th iteration. Works for n=0.
+\def\!tfor#1:=#2\do#3{%
+ \edef\!fortemp{#2}%
+ \ifx\!fortemp\!empty
+ \else
+ \!tforloop#2\!nil\!nil\!!#1{#3}%
+ \fi}
+\def\!tforloop#1#2\!!#3#4{%
+ \def#3{#1}%
+ \ifx #3\!nnil
+ \let\!nextwhile=\!fornoop
+ \else
+ #4\relax
+ \let\!nextwhile=\!tforloop
+ \fi
+ \!nextwhile#2\!!#3{#4}}
+
+
+% ** \!etfor NAME:= LIST\do {BODY}
+% ** This is like \!cfor, but LIST is any balanced token list whose complete
+% ** expansion has the form T1 ... Tn
+\def\!etfor#1:=#2\do#3{%
+ \def\!!tfor{\!tfor#1:=}%
+ \edef\!!!tfor{#2}%
+ \expandafter\!!tfor\!!!tfor\do{#3}}
+
+
+% ** modify the Latex \tfor (token-for) loop to a \cfor (comma-for) loop.
+% ** \!cfor NAME := LIST \do {BODY}
+% ** if, before expansion, LIST = a1,a2,...an, then executes BODY n times,
+% ** with NAME = ai on the i-th iteration. Works for n=0.
+\def\!cfor#1:=#2\do#3{%
+ \edef\!fortemp{#2}%
+ \ifx\!fortemp\!empty
+ \else
+ \!cforloop#2,\!nil,\!nil\!!#1{#3}%
+ \fi}
+\def\!cforloop#1,#2\!!#3#4{%
+ \def#3{#1}%
+ \ifx #3\!nnil
+ \let\!nextwhile=\!fornoop
+ \else
+ #4\relax
+ \let\!nextwhile=\!cforloop
+ \fi
+ \!nextwhile#2\!!#3{#4}}
+
+
+% ** \!ecfor NAME:= LIST\do {BODY}
+% ** This is like \!cfor, but LIST is any balanced token list whose complete
+% ** expansion has the form a1,a2,...,an.
+\def\!ecfor#1:=#2\do#3{%
+ \def\!!cfor{\!cfor#1:=}%
+ \edef\!!!cfor{#2}%
+ \expandafter\!!cfor\!!!cfor\do{#3}}
+
+
+\def\!empty{}
+\def\!nnil{\!nil}
+\def\!fornoop#1\!!#2#3{}
+
+
+% ** \!ifempty{ARG}{TRUE ACTION}{FALSE ACTION}
+\def\!ifempty#1#2#3{%
+ \edef\!emptyarg{#1}%
+ \ifx\!emptyarg\!empty
+ #2%
+ \else
+ #3%
+ \fi}
+
+% ** \!getnext\\ITEMfrom\LIST
+% ** \LIST has the form \\{item1}\\{item2}\\{item3}...\\{itemk}
+% ** This routine sets \ITEM to item1, and cycles \LIST to
+% ** \\{item2}\\{item3}...\\{itemk}\\{item1}
+\def\!getnext#1\from#2{%
+ \expandafter\!gnext#2\!#1#2}%
+\def\!gnext\\#1#2\!#3#4{%
+ \def#3{#1}%
+ \def#4{#2\\{#1}}%
+ \ignorespaces}
+
+
+% ** \!getnextvalueof\DIMEN\from\LIST
+% ** Similar to !getnext.
+% ** \LIST has the form \\{dimen1}\\{dimen2}\\{dimen3} ...
+% ** \DIMEN is a dimension register
+% ** Works also for counts
+%
+\def\!getnextvalueof#1\from#2{%
+ \expandafter\!gnextv#2\!#1#2}%
+\def\!gnextv\\#1#2\!#3#4{%
+ #3=#1%
+ \def#4{#2\\{#1}}%
+ \ignorespaces}
+
+
+% ** \!copylist\LISTMACROA\to\LISTMACROB
+% ** makes the replacement text of LISTMACRO B identical to that of
+% ** list macro A.
+\def\!copylist#1\to#2{%
+ \expandafter\!!copylist#1\!#2}
+\def\!!copylist#1\!#2{%
+ \def#2{#1}\ignorespaces}
+
+
+% ** \!wlet\CSA=\CSB
+% ** lets control sequence \CSB = control sequence \CSA, and writes a
+% ** message to that effect in the log file using plain TEK's \wlog
+\def\!wlet#1=#2{%
+ \let#1=#2
+ \wlog{\string#1=\string#2}}
+
+% ** \!listaddon ITEM LIST
+% ** LIST <-- LIST \\ ITEM
+\def\!listaddon#1#2{%
+ \expandafter\!!listaddon#2\!{#1}#2}
+\def\!!listaddon#1\!#2#3{%
+ \def#3{#1\\#2}}
+
+% ** \!rightappendITEM\to\LISTMACRO
+% ** \LISTMACRO --> \LISTMACRO\\{ITEM}
+%\def\!rightappend#1\to#2{\expandafter\!!rightappend#2\!{#1}#2}
+%\def\!!rightappend#1\!#2#3{\def#3{#1\\{#2}}}
+
+
+% ** \!rightappendITEM\withCS\to\LISTMACRO
+% ** \LISTMACRO --> \LISTMACRO||CS||{ITEM}
+\def\!rightappend#1\withCS#2\to#3{\expandafter\!!rightappend#3\!#2{#1}#3}
+\def\!!rightappend#1\!#2#3#4{\def#4{#1#2{#3}}}
+
+
+% ** \!leftappendITEM\withCS\to\LISTMACRO
+% ** \LISTMACRO --> CS||{ITEM}||\LISTMACRO
+\def\!leftappend#1\withCS#2\to#3{\expandafter\!!leftappend#3\!#2{#1}#3}
+\def\!!leftappend#1\!#2#3#4{\def#4{#2{#3}#1}}
+
+
+% ** \!lop\LISTMACRO\to\ITEM
+% ** \\{item1}\\{item2}\\{item3} ... --> \\{item2}\\{item3} ...
+% ** item1 --> \ITEM
+\def\!lop#1\to#2{\expandafter\!!lop#1\!#1#2}
+\def\!!lop\\#1#2\!#3#4{\def#4{#1}\def#3{#2}}
+
+
+% ** \!placeNUMBER\of\LISTMACRO\in\ITEM
+% ** the NUMBERth item of \LISTMACRO --> replacement text of \ITEM
+%\def\!place#1\of#2\in#3{\def#3{\outofrange}%
+%{\count0=#1\def\\##1{\advance\count0-1 \ifnum\count0=0 \gdef#3{##1}\fi}#2}}
+
+
+% ** Following code converts a commalist to a list macro, with all items
+% ** fully expanded.
+%\!ecfor\item:=\commalist\do{\expandafter\!rightappend\item\to\list}
+
+
+% ** \!loop ... repeat
+% ** This is exactly like TEX's \loop ... repeat. It can be used in nesting
+% ** two loops, without puting the inner one inside a group.
+\def\!loop#1\repeat{\def\!body{#1}\!iterate}
+\def\!iterate{\!body\let\!next=\!iterate\else\let\!next=\relax\fi\!next}
+
+% ** \!!loop ... repeat
+% ** This is exactly like TEX's \loop ... repeat. It can be used in nesting
+% ** two loops, without puting the inner one inside a group.
+\def\!!loop#1\repeat{\def\!!body{#1}\!!iterate}
+\def\!!iterate{\!!body\let\!!next=\!!iterate\else\let\!!next=\relax\fi\!!next}
+% (\multiput uses \!!loop)
+
+% ** \!removept{DIMENREG}{\CS}
+% ** Defines the control sequence CS to be the value (in points) in the
+% ** dimension register DIMENREG (but without the "pt" TEK usually adds)
+% ** E.g., after \dimen0=12.3pt \!removept\dimen0\A, \A expands to 12.3
+\def\!removept#1#2{\edef#2{\expandafter\!!removePT\the#1}}
+{\catcode`p=12 \catcode`t=12 \gdef\!!removePT#1pt{#1}}
+
+% ** \pladevalueinpts of <DIMENSION REGISTER> in {CONTROL SEQUENCE}
+\def\placevalueinpts of <#1> in #2 {%
+ \!removept{#1}{#2}}
+
+% ** \!mlap{...} \!vmlap{...}
+% ** Center ... in a box of width 0.
+\def\!mlap#1{\hbox to 0pt{\hss#1\hss}}
+\def\!vmlap#1{\vbox to 0pt{\vss#1\vss}}
+
+% ** \!not{TEK if-CONDITION}
+% ** By a TEK if-CONDITION is meant something like
+% ** \ifnum\N<0, or \ifdim\A>\B
+% ** \!not produces an if-condition which is false if the original condition
+% ** is true, and true if the original condition is false.
+\def\!not#1{%
+ #1\relax
+ \!switchfalse
+ \else
+ \!switchtrue
+ \fi
+ \if!switch
+ \ignorespaces}
+
+
+% *******************
+% *** ALLOCATIONS ***
+% *******************
+
+% This section allocates all the registers PiCTeX uses. Following
+% each allocation is a string of the form ....N.D...L......... ;
+% the various letters show which sections of PiCTeX make explicit
+% reference to that register, according to the following code:
+
+% H Hacks
+% A Areas
+% W arroWs
+% B Bars
+% X boXes
+% C Curves
+% D Dashpattterns
+% V diVision
+% E Ellipses
+% U rUles
+% L Linear arc
+% G loGten
+% P Pictures
+% O plOtting
+% Y pYthagoras
+% Q Quadratic arc
+% R Rotations
+% S Shading
+% T Ticks
+
+% Turn off messages from TeX's allocation macros
+\let\!!!wlog=\wlog % "\wlog" is defined in plain TeX
+\def\wlog#1{}
+
+\newdimen\headingtoplotskip %.A.................
+\newdimen\linethickness %.A..X....U........T
+\newdimen\longticklength %.A................T
+\newdimen\plotsymbolspacing %......D...L....Q...
+\newdimen\shortticklength %.A................T
+\newdimen\stackleading %.A..........P......
+\newdimen\tickstovaluesleading %.A................T
+\newdimen\totalarclength %......D...L....Q...
+\newdimen\valuestolabelleading %.A.................
+
+\newbox\!boxA %.AW...............T
+\newbox\!boxB %..W................
+\newbox\!picbox %............P......
+\newbox\!plotsymbol %..........L..O.....
+\newbox\!putobject %............PO...S.
+\newbox\!shadesymbol %.................S.
+
+\newcount\!countA %.A....D..UL....Q.ST
+\newcount\!countB %......D..U.....Q.ST
+\newcount\!countC %...............Q..T
+\newcount\!countD %...................
+\newcount\!countE %.............O....T
+\newcount\!countF %.............O....T
+\newcount\!countG %..................T
+\newcount\!fiftypt %.........U.........
+\newcount\!intervalno %..........L....Q...
+\newcount\!npoints %..........L........
+\newcount\!nsegments %.........U.........
+\newcount\!ntemp %............P......
+\newcount\!parity %.................S.
+\newcount\!scalefactor %..................T
+\newcount\!tfs %.......V...........
+\newcount\!tickcase %..................T
+
+\newdimen\!Xleft %............P......
+\newdimen\!Xright %............P......
+\newdimen\!Xsave %.A................T
+\newdimen\!Ybot %............P......
+\newdimen\!Ysave %.A................T
+\newdimen\!Ytop %............P......
+\newdimen\!angle %........E..........
+\newdimen\!arclength %..W......UL....Q...
+\newdimen\!areabloc %.A........L........
+\newdimen\!arealloc %.A........L........
+\newdimen\!arearloc %.A........L........
+\newdimen\!areatloc %.A........L........
+\newdimen\!bshrinkage %.................S.
+\newdimen\!checkbot %..........L........
+\newdimen\!checkleft %..........L........
+\newdimen\!checkright %..........L........
+\newdimen\!checktop %..........L........
+\newdimen\!dimenA %.AW.X.DVEUL..OYQRST
+\newdimen\!dimenB %....X.DVEU...O.QRS.
+\newdimen\!dimenC %..W.X.DVEU......RS.
+\newdimen\!dimenD %..W.X.DVEU....Y.RS.
+\newdimen\!dimenE %..W........G..YQ.S.
+\newdimen\!dimenF %...........G..YQ.S.
+\newdimen\!dimenG %...........G..YQ.S.
+\newdimen\!dimenH %...........G..Y..S.
+\newdimen\!dimenI %...BX.........Y....
+\newdimen\!distacross %..........L....Q...
+\newdimen\!downlength %..........L........
+\newdimen\!dp %.A..X.......P....S.
+\newdimen\!dshade %.................S.
+\newdimen\!dxpos %..W......U..P....S.
+\newdimen\!dxprime %...............Q...
+\newdimen\!dypos %..WB.....U..P......
+\newdimen\!dyprime %...............Q...
+\newdimen\!ht %.A..X.......P....S.
+\newdimen\!leaderlength %......D..U.........
+\newdimen\!lshrinkage %.................S.
+\newdimen\!midarclength %...............Q...
+\newdimen\!offset %.A................T
+\newdimen\!plotheadingoffset %.A.................
+\newdimen\!plotsymbolxshift %..........L..O.....
+\newdimen\!plotsymbolyshift %..........L..O.....
+\newdimen\!plotxorigin %..........L..O.....
+\newdimen\!plotyorigin %..........L..O.....
+\newdimen\!rootten %...........G.......
+\newdimen\!rshrinkage %.................S.
+\newdimen\!shadesymbolxshift %.................S.
+\newdimen\!shadesymbolyshift %.................S.
+\newdimen\!tenAa %...........G.......
+\newdimen\!tenAc %...........G.......
+\newdimen\!tenAe %...........G.......
+\newdimen\!tshrinkage %.................S.
+\newdimen\!uplength %..........L........
+\newdimen\!wd %....X.......P....S.
+\newdimen\!wmax %...............Q...
+\newdimen\!wmin %...............Q...
+\newdimen\!xB %...............Q...
+\newdimen\!xC %...............Q...
+\newdimen\!xE %..W.....E.L....Q.S.
+\newdimen\!xM %..W.....E......Q.S.
+\newdimen\!xS %..W.....E.L....Q.S.
+\newdimen\!xaxislength %.A................T
+\newdimen\!xdiff %..........L........
+\newdimen\!xleft %............P......
+\newdimen\!xloc %..WB.....U.......S.
+\newdimen\!xorigin %.A........L.P....S.
+\newdimen\!xpivot %................R..
+\newdimen\!xpos %..........L.P..Q.ST
+\newdimen\!xprime %...............Q...
+\newdimen\!xright %............P......
+\newdimen\!xshade %.................S.
+\newdimen\!xshift %..W.........PO...S.
+\newdimen\!xtemp %............P......
+\newdimen\!xunit %.AWBX...EUL.P..QRS.
+\newdimen\!xxE %........E..........
+\newdimen\!xxM %........E..........
+\newdimen\!xxS %........E..........
+\newdimen\!xxloc %..WB....EU.........
+\newdimen\!yB %...............Q...
+\newdimen\!yC %...............Q...
+\newdimen\!yE %..W.....E.L....Q...
+\newdimen\!yM %..W.....E......Q...
+\newdimen\!yS %..W.....E.L....Q...
+\newdimen\!yaxislength %.A................T
+\newdimen\!ybot %............P......
+\newdimen\!ydiff %..........L........
+\newdimen\!yloc %..WB.....U.......S.
+\newdimen\!yorigin %.A........L.P....S.
+\newdimen\!ypivot %................R..
+\newdimen\!ypos %..........L.P..Q.ST
+\newdimen\!yprime %...............Q...
+\newdimen\!yshade %.................S.
+\newdimen\!yshift %..W.........PO...S.
+\newdimen\!ytemp %............P......
+\newdimen\!ytop %............P......
+\newdimen\!yunit %.AWBX...EUL.P..QRS.
+\newdimen\!yyE %........E..........
+\newdimen\!yyM %........E..........
+\newdimen\!yyS %........E..........
+\newdimen\!yyloc %..WB....EU.........
+\newdimen\!zpt %.AWBX.DVEULGP.YQ.ST
+
+\newif\if!axisvisible %.A.................
+\newif\if!gridlinestoo %..................T
+\newif\if!keepPO %...................
+\newif\if!placeaxislabel %.A.................
+\newif\if!switch %H..................
+\newif\if!xswitch %.A................T
+
+\newtoks\!axisLaBeL %.A.................
+\newtoks\!keywordtoks %.A.................
+
+\newwrite\!replotfile %.............O.....
+
+\newhelp\!keywordhelp{The keyword mentioned in the error message in unknown.
+Replace NEW KEYWORD in the indicated response by the keyword that
+should have been specified.} %.A.................
+
+% The following commands assign alternate names to some of the
+% above registers. "\!wlet" is defined in Hacks.
+\!wlet\!!origin=\!xM %.A................T
+\!wlet\!!unit=\!uplength %.A................T
+\!wlet\!Lresiduallength=\!dimenG %.........U.........
+\!wlet\!Rresiduallength=\!dimenF %.........U.........
+\!wlet\!axisLength=\!distacross %.A................T
+\!wlet\!axisend=\!ydiff %.A................T
+\!wlet\!axisstart=\!xdiff %.A................T
+\!wlet\!axisxlevel=\!arclength %.A................T
+\!wlet\!axisylevel=\!downlength %.A................T
+\!wlet\!beta=\!dimenE %...............Q...
+\!wlet\!gamma=\!dimenF %...............Q...
+\!wlet\!shadexorigin=\!plotxorigin %.................S.
+\!wlet\!shadeyorigin=\!plotyorigin %.................S.
+\!wlet\!ticklength=\!xS %..................T
+\!wlet\!ticklocation=\!xE %..................T
+\!wlet\!ticklocationincr=\!yE %..................T
+\!wlet\!tickwidth=\!yS %..................T
+\!wlet\!totalleaderlength=\!dimenE %.........U.........
+\!wlet\!xone=\!xprime %....X..............
+\!wlet\!xtwo=\!dxprime %....X..............
+\!wlet\!ySsave=\!yM %...................
+\!wlet\!ybB=\!yB %.................S.
+\!wlet\!ybC=\!yC %.................S.
+\!wlet\!ybE=\!yE %.................S.
+\!wlet\!ybM=\!yM %.................S.
+\!wlet\!ybS=\!yS %.................S.
+\!wlet\!ybpos=\!yyloc %.................S.
+\!wlet\!yone=\!yprime %....X..............
+\!wlet\!ytB=\!xB %.................S.
+\!wlet\!ytC=\!xC %.................S.
+\!wlet\!ytE=\!downlength %.................S.
+\!wlet\!ytM=\!arclength %.................S.
+\!wlet\!ytS=\!distacross %.................S.
+\!wlet\!ytpos=\!xxloc %.................S.
+\!wlet\!ytwo=\!dyprime %....X..............
+
+
+% Initial values for registers
+\!zpt=0pt % static
+\!xunit=1pt
+\!yunit=1pt
+\!arearloc=\!xunit
+\!areatloc=\!yunit
+\!dshade=5pt
+\!leaderlength=24in
+\!tfs=256 % static
+\!wmax=5.3pt % static
+\!wmin=2.7pt % static
+\!xaxislength=\!xunit
+\!xpivot=\!zpt
+\!yaxislength=\!yunit
+\!ypivot=\!zpt
+\plotsymbolspacing=.4pt
+ \!dimenA=50pt \!fiftypt=\!dimenA % static
+
+\!rootten=3.162278pt % static
+\!tenAa=8.690286pt % static (A5)
+\!tenAc=2.773839pt % static (A3)
+\!tenAe=2.543275pt % static (A1)
+
+% Initial values for control sequences
+\def\!cosrotationangle{1} %................R..
+\def\!sinrotationangle{0} %................R..
+\def\!xpivotcoord{0} %................R..
+\def\!xref{0} %............P......
+\def\!xshadesave{0} %.................S.
+\def\!ypivotcoord{0} %................R..
+\def\!yref{0} %............P......
+\def\!yshadesave{0} %.................S.
+\def\!zero{0} %..................T
+
+% Reset TeX to report allocations
+\let\wlog=\!!!wlog
+% *************************************
+% *** AREAS: Deals with plot areas ***
+% *************************************
+%
+% ** User commands
+% ** \setplotarea x from LEFT XCOORD to RIGTH XCOORD, y from BOTTOM YCOORD
+% ** to TOP YCOORD
+% ** \axis BOTTOM-LEFT-TOP-RIGHT [SHIFTEDTO xy=COORD] [VISIBLE-INVISIBLE]
+% ** [LABEL {label}] [TICKS] /
+% ** \visibleaxes
+% ** \invisibleaxes
+% ** \plotheading {HEADING}
+% ** \grid {# of columns} {# of rows}
+% ** \normalgraphs
+
+% ** \normalgraphs
+% ** Sets defaults for graph setup. See Subsection 3.4 of manual.
+\def\normalgraphs{%
+ \longticklength=.4\baselineskip
+ \shortticklength=.25\baselineskip
+ \tickstovaluesleading=.25\baselineskip
+ \valuestolabelleading=.8\baselineskip
+ \linethickness=.4pt
+ \stackleading=.17\baselineskip
+ \headingtoplotskip=1.5\baselineskip
+ \visibleaxes
+ \ticksout
+ \nogridlines
+ \unloggedticks}
+%
+% ** \setplotarea x from LEFT XCOORD to RIGTH XCOORD, y from BOTTOM YCOORD
+% ** to TOP YCOORD
+% ** Reserves space in PICBOX for a rectangular box with the indicated
+% ** coordinates. Must be specified before calls to \axis,
+% ** \grid, \plotheading.
+% ** See Subsection 3.1 of the manual.
+\def\setplotarea x from #1 to #2, y from #3 to #4 {%
+ \!arealloc=\!M{#1}\!xunit \advance \!arealloc -\!xorigin
+ \!areabloc=\!M{#3}\!yunit \advance \!areabloc -\!yorigin
+ \!arearloc=\!M{#2}\!xunit \advance \!arearloc -\!xorigin
+ \!areatloc=\!M{#4}\!yunit \advance \!areatloc -\!yorigin
+ \!initinboundscheck
+ \!xaxislength=\!arearloc \advance\!xaxislength -\!arealloc
+ \!yaxislength=\!areatloc \advance\!yaxislength -\!areabloc
+ \!plotheadingoffset=\!zpt
+ \!dimenput {{\setbox0=\hbox{}\wd0=\!xaxislength\ht0=\!yaxislength\box0}}
+ [bl] (\!arealloc,\!areabloc)}
+%
+% ** \visibleaxes, \invisibleaxes
+% ** Switches for setting visibility of subsequent axes.
+% ** See Subsection 3.2 of the manual.
+\def\visibleaxes{%
+ \def\!axisvisibility{\!axisvisibletrue}}
+\def\invisibleaxes{%
+ \def\!axisvisibility{\!axisvisiblefalse}}
+%
+% ** The next few macros enable the user to fix up an erroneous keyword
+% ** in the \axis command.
+% \newhelp is in ALLOCATIONS
+% \newhelp\!keywordhelp{The keyword mentioned in the error message in unknown.
+% Replace NEW KEYWORD in the indicated response by the keyword that
+% should have been specified.}
+
+\def\!fixkeyword#1{%
+ \errhelp=\!keywordhelp
+ \errmessage{Unrecognized keyword `#1': \the\!keywordtoks{NEW KEYWORD}'}}
+
+% \newtoks\!keywordtoks In ALLOCATIONS.
+\!keywordtoks={enter `i\fixkeyword}
+
+\def\fixkeyword#1{%
+ \!nextkeyword#1 }
+
+% ** \axis BOTTOM-LEFT-TOP-RIGHT [SHIFTEDTO xy=COORD] [VISIBLE-INVISIBLE]
+% ** [LABEL {label}] [TICKS] /
+% ** Exactly one of the keywords BOTTOM, LEFT, TOP, RIGHT must be
+% ** specified. Axis is drawn along the indicated edge of the current
+% ** plot area, shifted if the SHIFTEDTO option is used, visible or
+% ** invisible according the selected option, with an optional LABEL,
+% ** and optional TICKS (see ticks.tex for the options avialabel with
+% ** TICKS). The TICKS option must be the last one specified. The \axis
+% ** MUST be terminated with a / followed by a space.
+% ** See Subsection 3.2 of the manual for more information.
+
+% ** The various options of the \axis command are processed by the
+% ** \!nextkeyword macro defined below. For example,
+% ** `\!nextkeyword shiftedto ' expands to `\!axisshiftedto'.
+\def\axis {%
+ \def\!nextkeyword##1 {%
+ \expandafter\ifx\csname !axis##1\endcsname \relax
+ \def\!next{\!fixkeyword{##1}}%
+ \else
+ \def\!next{\csname !axis##1\endcsname}%
+ \fi
+ \!next}%
+ \!offset=\!zpt
+ \!axisvisibility
+ \!placeaxislabelfalse
+ \!nextkeyword}
+
+% ** This and the various macros that follow handle the keyword
+% ** specifications on the \axis command
+% ** See Subsection 3.2 of the manual.
+\def\!axisbottom{%
+ \!axisylevel=\!areabloc
+ \def\!tickxsign{0}%
+ \def\!tickysign{-}%
+ \def\!axissetup{\!axisxsetup}%
+ \def\!axislabeltbrl{t}%
+ \!nextkeyword}
+
+\def\!axistop{%
+ \!axisylevel=\!areatloc
+ \def\!tickxsign{0}%
+ \def\!tickysign{+}%
+ \def\!axissetup{\!axisxsetup}%
+ \def\!axislabeltbrl{b}%
+ \!nextkeyword}
+
+\def\!axisleft{%
+ \!axisxlevel=\!arealloc
+ \def\!tickxsign{-}%
+ \def\!tickysign{0}%
+ \def\!axissetup{\!axisysetup}%
+ \def\!axislabeltbrl{r}%
+ \!nextkeyword}
+
+\def\!axisright{%
+ \!axisxlevel=\!arearloc
+ \def\!tickxsign{+}%
+ \def\!tickysign{0}%
+ \def\!axissetup{\!axisysetup}%
+ \def\!axislabeltbrl{l}%
+ \!nextkeyword}
+
+\def\!axisshiftedto#1=#2 {%
+ \if 0\!tickxsign
+ \!axisylevel=\!M{#2}\!yunit
+ \advance\!axisylevel -\!yorigin
+ \else
+ \!axisxlevel=\!M{#2}\!xunit
+ \advance\!axisxlevel -\!xorigin
+ \fi
+ \!nextkeyword}
+
+\def\!axisvisible{%
+ \!axisvisibletrue
+ \!nextkeyword}
+
+\def\!axisinvisible{%
+ \!axisvisiblefalse
+ \!nextkeyword}
+
+\def\!axislabel#1 {%
+ \!axisLaBeL={#1}%
+ \!placeaxislabeltrue
+ \!nextkeyword}
+
+\expandafter\def\csname !axis/\endcsname{%
+ \!axissetup % This could done already by "ticks"; if so, now \relax
+ \if!placeaxislabel
+ \!placeaxislabel
+ \fi
+ \if +\!tickysign % ** (A "top" axis)
+ \!dimenA=\!axisylevel
+ \advance\!dimenA \!offset % ** dimA = top of the axis structure
+ \advance\!dimenA -\!areatloc % ** dimA = excess over the plot area
+ \ifdim \!dimenA>\!plotheadingoffset
+ \!plotheadingoffset=\!dimenA % ** Greatest excess over the plot area
+ \fi
+ \fi}
+
+% ** \grid {c} {r}
+% ** Partitions the plot area into c columns and r rows; see Subsection 3.3
+% ** of the manual.
+% ** (Other grid patterns can be drawn with the TICKS option of the \axis
+% ** command.
+\def\grid #1 #2 {%
+ \!countA=#1\advance\!countA 1
+ \axis bottom invisible ticks length <\!zpt> andacross quantity {\!countA} /
+ \!countA=#2\advance\!countA 1
+ \axis left invisible ticks length <\!zpt> andacross quantity {\!countA} / }
+
+% ** \plotheading{HEADING}
+% ** Places HEADING centered above the top of the plotarea (and above
+% ** any top axis ticks marks, tick labels, and axis label); see
+% ** Subsection 3.3 of the manual.
+\def\plotheading#1 {%
+ \advance\!plotheadingoffset \headingtoplotskip
+ \!dimenput {#1} [B] <.5\!xaxislength,\!plotheadingoffset>
+ (\!arealloc,\!areatloc)}
+
+% ** From here on, the routines are internal.
+\def\!axisxsetup{%
+ \!axisxlevel=\!arealloc
+ \!axisstart=\!arealloc
+ \!axisend=\!arearloc
+ \!axisLength=\!xaxislength
+ \!!origin=\!xorigin
+ \!!unit=\!xunit
+ \!xswitchtrue
+ \if!axisvisible
+ \!makeaxis
+ \fi}
+
+\def\!axisysetup{%
+ \!axisylevel=\!areabloc
+ \!axisstart=\!areabloc
+ \!axisend=\!areatloc
+ \!axisLength=\!yaxislength
+ \!!origin=\!yorigin
+ \!!unit=\!yunit
+ \!xswitchfalse
+ \if!axisvisible
+ \!makeaxis
+ \fi}
+
+\def\!makeaxis{%
+ \setbox\!boxA=\hbox{% (Make a pseudo-y[x] tick for an x[y]-axis)
+ \beginpicture
+ \!setdimenmode
+ \setcoordinatesystem point at {\!zpt} {\!zpt}
+ \putrule from {\!zpt} {\!zpt} to
+ {\!tickysign\!tickysign\!axisLength}
+ {\!tickxsign\!tickxsign\!axisLength}
+ \endpicturesave <\!Xsave,\!Ysave>}%
+ \wd\!boxA=\!zpt
+ \!placetick\!axisstart}
+
+\def\!placeaxislabel{%
+ \advance\!offset \valuestolabelleading
+ \if!xswitch
+ \!dimenput {\the\!axisLaBeL} [\!axislabeltbrl]
+ <.5\!axisLength,\!tickysign\!offset> (\!axisxlevel,\!axisylevel)
+ \advance\!offset \!dp % ** advance offset by the "tallness"
+ \advance\!offset \!ht % ** of the label
+ \else
+ \!dimenput {\the\!axisLaBeL} [\!axislabeltbrl]
+ <\!tickxsign\!offset,.5\!axisLength> (\!axisxlevel,\!axisylevel)
+ \fi
+ \!axisLaBeL={}}
+
+
+% *******************************
+% *** ARROWS (Draws arrows) ***
+% *******************************
+%
+% ** User commands
+% ** \arrow <ARROW HEAD LENGTH> [MID FRACTION, BASE FRACTION]
+% ** [<XSHIFT,YSHIFT>] from XFROM YFROM to XTO YTO
+% ** \betweenarrows {TEXT} [orientation & shift] from XFROM YFROM to XTO YTO
+
+% ** \arrow <ARROW HEAD LENGTH> [MID FRACTION, BASE FRACTION]
+% ** [<XSHIFT,YSHIFT>] from XFROM YFROM to XTO YTO
+% ** Draws an arrow from (XFROM,YFROM) to (XTO,YTO). The arrow head
+% ** is constructed two quadratic arcs, which extend back a distance
+% ** ARROW HEAD LENGTH (a dimension) on both sides of the arrow shaft.
+% ** All the way back the arcs are a distance BASE FRACTION*ARROW HEAD
+% ** LENGTH apart, while half-way back they are a distance MID FRACTION*
+% ** ARROW HEAD LENGTH apart. <XSHIFT,YSHIFT> is optional, and has
+% ** its usual interpreation. See Subsection 5.4 of the manual.
+
+\def\arrow <#1> [#2,#3]{%
+ \!ifnextchar<{\!arrow{#1}{#2}{#3}}{\!arrow{#1}{#2}{#3}<\!zpt,\!zpt> }}
+
+\def\!arrow#1#2#3<#4,#5> from #6 #7 to #8 #9 {%
+%
+% ** convert to dimensions
+ \!xloc=\!M{#8}\!xunit
+ \!yloc=\!M{#9}\!yunit
+ \!dxpos=\!xloc \!dimenA=\!M{#6}\!xunit \advance \!dxpos -\!dimenA
+ \!dypos=\!yloc \!dimenA=\!M{#7}\!yunit \advance \!dypos -\!dimenA
+ \let\!MAH=\!M% ** save current c/d mode
+ \!setdimenmode% ** go into dimension mode
+%
+ \!xshift=#4\relax \!yshift=#5\relax% ** pick up shift
+ \!reverserotateonly\!xshift\!yshift% ** back rotate shift
+ \advance\!xshift\!xloc \advance\!yshift\!yloc
+%
+% ** draw shaft of arrow
+ \!xS=-\!dxpos \advance\!xS\!xshift
+ \!yS=-\!dypos \advance\!yS\!yshift
+ \!start (\!xS,\!yS)
+ \!ljoin (\!xshift,\!yshift)
+%
+% ** find 32*cosine and 32*sine of angle of rotation
+ \!Pythag\!dxpos\!dypos\!arclength
+ \!divide\!dxpos\!arclength\!dxpos
+ \!dxpos=32\!dxpos \!removept\!dxpos\!!cos
+ \!divide\!dypos\!arclength\!dypos
+ \!dypos=32\!dypos \!removept\!dypos\!!sin
+%
+% ** construct arrowhead
+ \!halfhead{#1}{#2}{#3}% ** draw half of arrow head
+ \!halfhead{#1}{-#2}{-#3}% ** draw other half
+%
+ \let\!M=\!MAH% ** restore old c/d mode
+ \ignorespaces}
+%
+% ** draw half of arrow head
+ \def\!halfhead#1#2#3{%
+ \!dimenC=-#1%
+ \divide \!dimenC 2 % ** half way back
+ \!dimenD=#2\!dimenC% ** half the mid width
+ \!rotate(\!dimenC,\!dimenD)by(\!!cos,\!!sin)to(\!xM,\!yM)
+ \!dimenC=-#1% ** all the way back
+ \!dimenD=#3\!dimenC
+ \!dimenD=.5\!dimenD% ** half the full width
+ \!rotate(\!dimenC,\!dimenD)by(\!!cos,\!!sin)to(\!xE,\!yE)
+ \!start (\!xshift,\!yshift)
+ \advance\!xM\!xshift \advance\!yM\!yshift
+ \advance\!xE\!xshift \advance\!yE\!yshift
+ \!qjoin (\!xM,\!yM) (\!xE,\!yE)
+ \ignorespaces}
+
+
+% ** \betweenarrows {TEXT} [orientation & shift] from XFROM YFROM to XTO YTO
+% ** Makes things like <--- text --->, using arrow heads from TeX's fonts.
+% ** See Subsection 5.4 of the manual.
+\def\betweenarrows #1#2 from #3 #4 to #5 #6 {%
+ \!xloc=\!M{#3}\!xunit \!xxloc=\!M{#5}\!xunit%
+ \!yloc=\!M{#4}\!yunit \!yyloc=\!M{#6}\!yunit%
+ \!dxpos=\!xxloc \advance\!dxpos by -\!xloc
+ \!dypos=\!yyloc \advance\!dypos by -\!yloc
+ \advance\!xloc .5\!dxpos
+ \advance\!yloc .5\!dypos
+%
+ \let\!MBA=\!M% ** save current coord\dimen mode
+ \!setdimenmode% ** express locations in dimens
+ \ifdim\!dypos=\!zpt
+ \ifdim\!dxpos<\!zpt \!dxpos=-\!dxpos \fi
+ \put {\!lrarrows{\!dxpos}{#1}}#2{} at {\!xloc} {\!yloc}
+ \else
+ \ifdim\!dxpos=\!zpt
+ \ifdim\!dypos<\!zpt \!dypos=-\!zpt \fi
+ \put {\!udarrows{\!dypos}{#1}}#2{} at {\!xloc} {\!yloc}
+ \fi
+ \fi
+ \let\!M=\!MBA% ** restore previous c/d mode
+ \ignorespaces}
+
+% ** Subroutine for left-right between arrows
+\def\!lrarrows#1#2{% #1=width, #2=text
+ {\setbox\!boxA=\hbox{$\mkern-2mu\mathord-\mkern-2mu$}%
+ \setbox\!boxB=\hbox{$\leftarrow$}\!dimenE=\ht\!boxB
+ \setbox\!boxB=\hbox{}\ht\!boxB=2\!dimenE
+ \hbox to #1{$\mathord\leftarrow\mkern-6mu
+ \cleaders\copy\!boxA\hfil
+ \mkern-6mu\mathord-$%
+ \kern.4em $\vcenter{\box\!boxB}$$\vcenter{\hbox{#2}}$\kern.4em
+ $\mathord-\mkern-6mu
+ \cleaders\copy\!boxA\hfil
+ \mkern-6mu\mathord\rightarrow$}}}
+
+% ** Subroutine for up-down between arrows
+\def\!udarrows#1#2{% #1=width, #2=text
+ {\setbox\!boxB=\hbox{#2}%
+ \setbox\!boxA=\hbox to \wd\!boxB{\hss$\vert$\hss}%
+ \!dimenE=\ht\!boxA \advance\!dimenE \dp\!boxA \divide\!dimenE 2
+ \vbox to #1{\offinterlineskip
+ \vskip .05556\!dimenE
+ \hbox to \wd\!boxB{\hss$\mkern.4mu\uparrow$\hss}\vskip-\!dimenE
+ \cleaders\copy\!boxA\vfil
+ \vskip-\!dimenE\copy\!boxA
+ \vskip\!dimenE\copy\!boxB\vskip.4em
+ \copy\!boxA\vskip-\!dimenE
+ \cleaders\copy\!boxA\vfil
+ \vskip-\!dimenE \hbox to \wd\!boxB{\hss$\mkern.4mu\downarrow$\hss}
+ \vskip .05556\!dimenE}}}
+
+
+% ***************************
+% *** BARS (Draws bars) ***
+% ***************************
+%
+% ** User commands:
+% ** \putbar [<XSHIFT,YSHIFT>] breadth <BREADTH> from XSTART YSTART
+% ** to XEND YEND
+% ** \setbars [<XSHIFT,YSHIFT>] breadth <BREADTH> baseline at XY = COORD
+% ** [baselabels ([B_ORIENTATION_x,B_ORIENTATION_y] <B_XSHIFT,B_YSHIFT>)]
+% ** [endlabels ([E_ORIENTATION_x,E_ORIENTATION_y] <E_XSHIFT,E_YSHIFT>)]
+
+
+% ** \putbar [<XSHIFT,YSHIFT>] breadth <BREADTH> from XSTART YSTART
+% ** to XEND YEND
+% ** Either XSTART=XEND or YSTART=YEND. Draws a rectangle between
+% ** (XSTART,YSTART) & (XEND,YEND). The "depth" of the rectangle
+% ** is determined by those two plot positions; its other
+% ** dimension "breadth" is specified by the dimension BREADTH.
+% ** See Subsection 4.2 of the manual.
+\def\putbar#1breadth <#2> from #3 #4 to #5 #6 {%
+ \!xloc=\!M{#3}\!xunit \!xxloc=\!M{#5}\!xunit%
+ \!yloc=\!M{#4}\!yunit \!yyloc=\!M{#6}\!yunit%
+ \!dypos=\!yyloc \advance\!dypos by -\!yloc
+ \!dimenI=#2
+%
+ \ifdim \!dimenI=\!zpt % ** If 0 breadth
+ \putrule#1from {#3} {#4} to {#5} {#6} % ** Then draw line
+ \else % ** Else, put in a rectangle
+ \let\!MBar=\!M% ** save current c/d mode
+ \!setdimenmode % ** go into dimension mode
+ \divide\!dimenI 2
+ \ifdim \!dypos=\!zpt
+ \advance \!yloc -\!dimenI % ** Equal y coordinates
+ \advance \!yyloc \!dimenI
+ \else
+ \advance \!xloc -\!dimenI % ** Equal x coordinates
+ \advance \!xxloc \!dimenI
+ \fi
+ \putrectangle#1corners at {\!xloc} {\!yloc} and {\!xxloc} {\!yyloc}
+ \let\!M=\!MBar % ** restore c/d mode
+ \fi
+ \ignorespaces}
+
+
+% ** \setbars [<XSHIFT,YSHIFT>] breadth <BREADTH> baseline at XY = COORD
+% ** [baselabels ([B_ORIENTATION_x,B_ORIENTATION_y] <B_XSHIFT,B_YSHIFT>)]
+% ** [endlabels ([E_ORIENTATION_x,E_ORIENTATION_y] <E_XSHIFT,E_YSHIFT>)]
+% ** This command puts PiCTeX into the bar graph drawing mode described
+% ** in Subsection 4.4 of the manual.
+\def\setbars#1breadth <#2> baseline at #3 = #4 {%
+ \edef\!barshift{#1}%
+ \edef\!barbreadth{#2}%
+ \edef\!barorientation{#3}%
+ \edef\!barbaseline{#4}%
+ \def\!bardobaselabel{\!bardoendlabel}%
+ \def\!bardoendlabel{\!barfinish}%
+ \let\!drawcurve=\!barcurve
+ \!setbars}
+\def\!setbars{%
+ \futurelet\!nextchar\!!setbars}
+\def\!!setbars{%
+ \if b\!nextchar
+ \def\!!!setbars{\!setbarsbget}%
+ \else
+ \if e\!nextchar
+ \def\!!!setbars{\!setbarseget}%
+ \else
+ \def\!!!setbars{\relax}%
+ \fi
+ \fi
+ \!!!setbars}
+\def\!setbarsbget baselabels (#1) {%
+ \def\!barbaselabelorientation{#1}%
+ \def\!bardobaselabel{\!!bardobaselabel}%
+ \!setbars}
+\def\!setbarseget endlabels (#1) {%
+ \edef\!barendlabelorientation{#1}%
+ \def\!bardoendlabel{\!!bardoendlabel}%
+ \!setbars}
+
+% ** \!barcurve
+% ** Draws a bargraph with preset values of barshift, barbreadth,
+% ** barorientation (x or y) and barbaseline (coordinate)
+\def\!barcurve #1 #2 {%
+ \if y\!barorientation
+ \def\!basexarg{#1}%
+ \def\!baseyarg{\!barbaseline}%
+ \else
+ \def\!basexarg{\!barbaseline}%
+ \def\!baseyarg{#2}%
+ \fi
+ \expandafter\putbar\!barshift breadth <\!barbreadth> from {\!basexarg}
+ {\!baseyarg} to {#1} {#2}
+ \def\!endxarg{#1}%
+ \def\!endyarg{#2}%
+ \!bardobaselabel}
+
+\def\!!bardobaselabel "#1" {%
+ \put {#1}\!barbaselabelorientation{} at {\!basexarg} {\!baseyarg}
+ \!bardoendlabel}
+
+\def\!!bardoendlabel "#1" {%
+ \put {#1}\!barendlabelorientation{} at {\!endxarg} {\!endyarg}
+ \!barfinish}
+
+\def\!barfinish{%
+ \!ifnextchar/{\!finish}{\!barcurve}}
+
+
+% ********************************
+% *** BOXES (Draws rectangles) ***
+% ********************************
+%
+% ** User commands:
+% ** \putrectangle [<XSHIFT,YSHIFT>] corners at XCOORD1 YCOORD1
+% ** and XCOORD2 YCOORD2
+% ** \shaderectangleson
+% ** \shaderectanglesoff
+% ** \frame [<SEPARATION>] {TEXT}
+% ** \rectangle <WIDTH> <HEIGHT>
+%
+%
+% ** \putrectangle [<XSHIFT,YSHIFT>] corners at XCOORD1 YCOORD1
+% ** and XCOORD2 YCOORD2
+% ** Draws a rectangle with corners at (X1,Y1), (X2,Y1), (X1,Y2), (X2,Y2)
+% ** Lines have thickness \linethickness, and overlap at the corners.
+% ** The optional field <XSHIFT,YSHIFT> functions as with a \put command.
+% ** See Subsection 4.2 of the manual.
+\def\putrectangle{%
+ \!ifnextchar<{\!putrectangle}{\!putrectangle<\!zpt,\!zpt> }}
+\def\!putrectangle<#1,#2> corners at #3 #4 and #5 #6 {%
+%
+% ** get locations
+ \!xone=\!M{#3}\!xunit \!xtwo=\!M{#5}\!xunit%
+ \!yone=\!M{#4}\!yunit \!ytwo=\!M{#6}\!yunit%
+ \ifdim \!xtwo<\!xone
+ \!dimenI=\!xone \!xone=\!xtwo \!xtwo=\!dimenI
+ \fi
+ \ifdim \!ytwo<\!yone
+ \!dimenI=\!yone \!yone=\!ytwo \!ytwo=\!dimenI
+ \fi
+ \!dimenI=#1\relax \advance\!xone\!dimenI \advance\!xtwo\!dimenI
+ \!dimenI=#2\relax \advance\!yone\!dimenI \advance\!ytwo\!dimenI
+ \let\!MRect=\!M% ** save current coord/dimen mode
+ \!setdimenmode
+%
+% ** shade rectangle if appropriate
+ \!shaderectangle
+%
+% ** draw horizontal edges
+ \!dimenI=.5\linethickness
+ \advance \!xone -\!dimenI% ** adjust x-location to overlap corners
+ \advance \!xtwo \!dimenI% ** ditto
+ \putrule from {\!xone} {\!yone} to {\!xtwo} {\!yone}
+ \putrule from {\!xone} {\!ytwo} to {\!xtwo} {\!ytwo}
+%
+% ** draw vertical edges
+ \advance \!xone \!dimenI% ** restore original x-values
+ \advance \!xtwo -\!dimenI%
+ \advance \!yone -\!dimenI% ** adjust y-location to overlap corners
+ \advance \!ytwo \!dimenI% ** ditto
+ \putrule from {\!xone} {\!yone} to {\!xone} {\!ytwo}
+ \putrule from {\!xtwo} {\!yone} to {\!xtwo} {\!ytwo}
+%
+ \let\!M=\!MRect% ** restore coord/dimen mode
+ \ignorespaces}
+
+% ** \shaderectangleson
+% ** Subsequent rectangles will be shaded according to
+% ** the current shading pattern. Affects \putrectangle, \putbar,
+% ** \frame, \sethistograms, and \setbars. See Subsection 7.5 of the manual.
+\def\shaderectangleson{%
+ \def\!shaderectangle{\!!shaderectangle}%
+ \ignorespaces}
+% ** \shaderectanglesoff
+% ** Suppresses \shaderectangleson. The default.
+\def\shaderectanglesoff{%
+ \def\!shaderectangle{}%
+ \ignorespaces}
+
+\shaderectanglesoff
+
+% ** The following internal routine shades the current rectangle, when
+% ** \!shaderectangle = \!!shaderectangle .
+\def\!!shaderectangle{%
+ \!dimenA=\!xtwo \advance \!dimenA -\!xone
+ \!dimenB=\!ytwo \advance \!dimenB -\!yone
+ \ifdim \!dimenA<\!dimenB
+ \!startvshade (\!xone,\!yone,\!ytwo)
+ \!lshade (\!xtwo,\!yone,\!ytwo)
+ \else
+ \!starthshade (\!yone,\!xone,\!xtwo)
+ \!lshade (\!ytwo,\!xone,\!xtwo)
+ \fi
+ \ignorespaces}
+
+% ** \frame [<SEPARATION>] {TEXT}
+% ** Draws a frame of thickness linethickness about the box enclosing
+% ** TEXT; the frame is separated from the box by a distance of
+% ** SEPARATION. The result is an hbox with the same baseline as TEXT.
+% ** If <SEPARATION> is omitted, you get the effect of <0pt>.
+% ** See Subsection 4.2 of the manual.
+\def\frame{%
+ \!ifnextchar<{\!frame}{\!frame<\!zpt> }}
+\long\def\!frame<#1> #2{%
+ \beginpicture
+ \setcoordinatesystem units <1pt,1pt> point at 0 0
+ \put {#2} [Bl] at 0 0
+ \!dimenA=#1\relax
+ \!dimenB=\!wd \advance \!dimenB \!dimenA
+ \!dimenC=\!ht \advance \!dimenC \!dimenA
+ \!dimenD=\!dp \advance \!dimenD \!dimenA
+ \let\!MFr=\!M
+ \!setdimenmode
+ \putrectangle corners at {-\!dimenA} {-\!dimenD} and {\!dimenB} {\!dimenC}
+ \!setcoordmode
+ \let\!M=\!MFr
+ \endpicture
+ \ignorespaces}
+
+% ** \rectangle <WIDTH> <HEIGHT>
+% ** Constructs a rectangle of width WIDTH and heigth HEIGHT.
+% ** See Subsection 4.2 of the manual.
+\def\rectangle <#1> <#2> {%
+ \setbox0=\hbox{}\wd0=#1\ht0=#2\frame {\box0}}
+
+
+% *********************************************
+% *** CURVES (Upper level \plot commands) ***
+% *********************************************
+%
+% ** User commands
+% ** \plot DATA /
+% ** \plot "FILE NAME"
+% ** \setquadratic
+% ** \setlinear
+% ** \sethistograms
+% ** \vshade ...
+% ** \hshade ...
+
+% \plot: multi-purpose command. Draws histograms, bar graphs, piecewise-linear
+% or piecewise quadratic curves, depending on the setting of \!drawcurve.
+% See Subsections 4.3-4.5, 5.1, 5.2 of the manual.
+\def\plot{%
+ \!ifnextchar"{\!plotfromfile}{\!drawcurve}}
+\def\!plotfromfile"#1"{%
+ \expandafter\!drawcurve \normalinput #1 /}
+
+% Command to set piecewise quadratic mode
+% See Subsections 5.1, 7.3, and 7.4 of the manual.
+\def\setquadratic{%
+ \let\!drawcurve=\!qcurve
+ \let\!!Shade=\!!qShade
+ \let\!!!Shade=\!!!qShade}
+
+% Command to set piecewise linear mode
+% See Subsections 5.1, 7.3, and 7.4 of the manual.
+\def\setlinear{%
+ \let\!drawcurve=\!lcurve
+ \let\!!Shade=\!!lShade
+ \let\!!!Shade=\!!!lShade}
+
+% Command to set histogram mode
+% See Subsection 4.3 of the manual.
+\def\sethistograms{%
+ \let\!drawcurve=\!hcurve}
+
+% Commands to cycle through list of coordinates in piecewise quadratic
+% interpolation mode
+\def\!qcurve #1 #2 {%
+ \!start (#1,#2)
+ \!Qjoin}
+\def\!Qjoin#1 #2 #3 #4 {%
+ \!qjoin (#1,#2) (#3,#4) % \!qjoin is defined in QUADRATIC
+ \!ifnextchar/{\!finish}{\!Qjoin}}
+
+% Commands to cycle through list of coordinates in piecewise linear
+% interpolation mode
+\def\!lcurve #1 #2 {%
+ \!start (#1,#2)
+ \!Ljoin}
+\def\!Ljoin#1 #2 {%
+ \!ljoin (#1,#2) % \!ljoin is defined in LINEAR
+ \!ifnextchar/{\!finish}{\!Ljoin}}
+
+\def\!finish/{\ignorespaces}
+
+% Command to cycle through list of coordinates in histogram mode
+\def\!hcurve #1 #2 {%
+ \edef\!hxS{#1}%
+ \edef\!hyS{#2}%
+ \!hjoin}
+\def\!hjoin#1 #2 {%
+ \putrectangle corners at {\!hxS} {\!hyS} and {#1} {#2}
+ \edef\!hxS{#1}%
+ \!ifnextchar/{\!finish}{\!hjoin}}
+
+
+% \vshade: See Subsection 7.3 of the manual.
+\def\vshade #1 #2 #3 {%
+ \!startvshade (#1,#2,#3)
+ \!Shadewhat}
+
+% \hshade: See Subsection 7.4 of the manual.
+\def\hshade #1 #2 #3 {%
+ \!starthshade (#1,#2,#3)
+ \!Shadewhat}
+
+% Commands to cycle through coordinates and optional "edge effect"
+% fields while shading.
+\def\!Shadewhat{%
+ \futurelet\!nextchar\!Shade}
+\def\!Shade{%
+ \if <\!nextchar
+ \def\!nextShade{\!!Shade}%
+ \else
+ \if /\!nextchar
+ \def\!nextShade{\!finish}%
+ \else
+ \def\!nextShade{\!!!Shade}%
+ \fi
+ \fi
+ \!nextShade}
+\def\!!lShade<#1> #2 #3 #4 {%
+ \!lshade <#1> (#2,#3,#4) % \!lshade is defined in SHADING
+ \!Shadewhat}
+\def\!!!lShade#1 #2 #3 {%
+ \!lshade (#1,#2,#3)
+ \!Shadewhat}
+\def\!!qShade<#1> #2 #3 #4 #5 #6 #7 {%
+ \!qshade <#1> (#2,#3,#4) (#5,#6,#7) % \!qshade is defined in SHADING
+ \!Shadewhat}
+\def\!!!qShade#1 #2 #3 #4 #5 #6 {%
+ \!qshade (#1,#2,#3) (#4,#5,#6)
+ \!Shadewhat}
+
+% ** Set default interpolation mode
+\setlinear
+
+
+% ********************************************
+% *** DASHPATTERNS (Sets up dash patterns) ***
+% ********************************************
+
+% ** User commands:
+% ** \setdashpattern <DIMEN1,DIMEN2,DIMEN3,...>
+% ** \setdots <INTRADOT_DISTANCE>
+% ** \setdotsnear <INTRADOT_DISTANCE> for <ARC LENGTH>
+% ** \setdashes <DASH/SKIP_DISTANCE>
+% ** \setdashesnear <DASH/SKIP_DISTANCE> for <ARC LENGTH>
+% ** \setsolid
+% ** \findlength {CURVE CMDS}
+
+% ** Internal commands:
+% ** \!dashingon
+% ** \!dashingoff
+
+% ** Dash patterns are specified by a balanced token list whose complete
+% ** expansion has the form: DIMEN1,DIMEN2,DIMEN3,DIMEN4,... ; this produces
+% ** an arc of length DIMEN1, a skip of length DIMEN2, an arc of length
+% ** DIMEN3, a skip of length DIMEN4, ... . Any number of DIMEN values may
+% ** be given. The pattern is repeated as many times (perhaps fractional)
+% ** as necessary to draw the curve.
+% ** A dash pattern remains in effect until it is overridden by a call to
+% ** \setdashpattern, or to \setdots, \setdotsnear ... , \setdashes,
+% ** \setdashesnear ... , or \setsolid.
+% ** Solid lines are the default.
+
+
+% ** \def\setdashpattern <DIMEN1,DIMEN2,DIMEN3,...>
+% ** The following routine converts a balanced list of tokens whose
+% ** complete expansion has the form DIMEN1,DIMEN2, ... , DIMENk into
+% ** three list macros that are used in drawing dashed rules and curves:
+% ** !Flist: \!Rule{DIMEN1}\!Skip{DIMEN2}\!Rule{DIMEN3}\!Skip{DIMEN4} ...
+% ** !Blist: ...\!Skip{DIMEN4}\!Rule{DIMEN3}\!Skip{DIMEN2}\!Rule{DIMEN1}
+% ** !UDlist: \\{DIMEN1}\\{DIMEN2}\\{DIMEN3}\\{DIMEN4} ...;
+% ** calculates \!leaderlength := DIMEN1 + ... + DIMENk; and
+% ** sets the curve drawing routines to dash mode.
+% ** Those lists are used by the curve drawing routines.
+% ** Dimenj ... may be given as an explicit dimension (e.g., 5pt), or
+% ** as an expression involving a dimension register (e.g., -2.5\dimen0).
+% ** See Subsection 6.2 of the manual
+\def\setdashpattern <#1>{%
+ \def\!Flist{}\def\!Blist{}\def\!UDlist{}%
+ \!countA=0
+ \!ecfor\!item:=#1\do{%
+ \!dimenA=\!item\relax
+ \expandafter\!rightappend\the\!dimenA\withCS{\\}\to\!UDlist%
+ \advance\!countA 1
+ \ifodd\!countA
+ \expandafter\!rightappend\the\!dimenA\withCS{\!Rule}\to\!Flist%
+ \expandafter\!leftappend\the\!dimenA\withCS{\!Rule}\to\!Blist%
+ \else
+ \expandafter\!rightappend\the\!dimenA\withCS{\!Skip}\to\!Flist%
+ \expandafter\!leftappend\the\!dimenA\withCS{\!Skip}\to\!Blist%
+ \fi}%
+ \!leaderlength=\!zpt
+ \def\!Rule##1{\advance\!leaderlength ##1}%
+ \def\!Skip##1{\advance\!leaderlength ##1}%
+ \!Flist%
+ \ifdim\!leaderlength>\!zpt
+ \else
+ \def\!Flist{\!Skip{24in}}\def\!Blist{\!Skip{24in}}\ignorespaces
+ \def\!UDlist{\\{\!zpt}\\{24in}}\ignorespaces
+ \!leaderlength=24in
+ \fi
+ \!dashingon}
+
+
+% ** \!dashingon -- puts the curve drawing routines into dash mode
+% ** \!dashingoff -- puts the curve drawing routines into solid mode
+% ** These are internal commands, invoked by \setdashpattern and \setsolid
+\def\!dashingon{%
+ \def\!advancedashing{\!!advancedashing}%
+ \def\!drawlinearsegment{\!lineardashed}%
+ \def\!puthline{\!putdashedhline}%
+ \def\!putvline{\!putdashedvline}%
+% \def\!putsline{\!putdashedsline}%
+ \ignorespaces}%
+\def\!dashingoff{%
+ \def\!advancedashing{\relax}%
+ \def\!drawlinearsegment{\!linearsolid}%
+ \def\!puthline{\!putsolidhline}%
+ \def\!putvline{\!putsolidvline}%
+% \def\!putsline{\!putsolidsline}%
+ \ignorespaces}
+
+
+% ** \setdots <LENGTH> -- sets up a dot/skip pattern where dot (actually
+% ** the current plotsymbol) is plunked down once for every LENGTH
+% ** traveled along the curve. LENGTH defaults to 5pt.
+% ** See Subsection 6.1 of the manual.
+\def\setdots{%
+ \!ifnextchar<{\!setdots}{\!setdots<5pt>}}
+\def\!setdots<#1>{%
+ \!dimenB=#1\advance\!dimenB -\plotsymbolspacing
+ \ifdim\!dimenB<\!zpt
+ \!dimenB=\!zpt
+ \fi
+\setdashpattern <\plotsymbolspacing,\!dimenB>}
+
+% ** \setdotsnear <LENGTH> for <ARC LENGTH>
+% ** sets up a dot pattern where the dots are approximately LENGTH apart,
+% ** the total length of the pattern is ARC LENGTH, and the pattern
+% ** begins and ends with a dot. See Subsection 6.3 of the manual.
+\def\setdotsnear <#1> for <#2>{%
+ \!dimenB=#2\relax \advance\!dimenB -.05pt
+ \!dimenC=#1\relax \!countA=\!dimenC
+ \!dimenD=\!dimenB \advance\!dimenD .5\!dimenC \!countB=\!dimenD
+ \divide \!countB \!countA
+ \ifnum 1>\!countB
+ \!countB=1
+ \fi
+ \divide\!dimenB \!countB
+ \setdots <\!dimenB>}
+
+% ** \setdashes <LENGTH> -- sets up a dash/skip pattern where the dash
+% ** and the skip are each of length LENGTH (the dash is formed by
+% ** plunking down the current plotsymbol over an arc of length LENGTH
+% ** and so may actually be longer than LENGTH. LENGTH defaults to 5pt.
+% ** See Subsection 6.1 of the manual.
+\def\setdashes{%
+ \!ifnextchar<{\!setdashes}{\!setdashes<5pt>}}
+\def\!setdashes<#1>{\setdashpattern <#1,#1>}
+
+% ** \setdashesnear ...
+% ** Like \setdotsnear; the pattern begins and ends with a dash.
+% ** See Subsection 6.3 of the manual.
+\def\setdashesnear <#1> for <#2>{%
+ \!dimenB=#2\relax
+ \!dimenC=#1\relax \!countA=\!dimenC
+ \!dimenD=\!dimenB \advance\!dimenD .5\!dimenC \!countB=\!dimenD
+ \divide \!countB \!countA
+ \ifodd \!countB
+ \else
+ \advance \!countB 1
+ \fi
+ \divide\!dimenB \!countB
+ \setdashes <\!dimenB>}
+
+% ** \setsolid -- puts the curve drawing routines in "solid line" mode,
+% ** the default mode. See Subsection 6.1 of the manual.
+\def\setsolid{%
+ \def\!Flist{\!Rule{24in}}\def\!Blist{\!Rule{24in}}%
+ \def\!UDlist{\\{24in}\\{\!zpt}}%
+ \!dashingoff}
+\setsolid
+
+% ** \findlength {CURVE CMDS}
+% ** PiCTeX executes the \start, \ljoin, and \qjoin cmds comprising
+% ** CURVE CMDS without plotting anything, but stashes the length
+% ** of the phantom curve away in \totalarclength.
+% ** See Subsection 6.3 of the manual.
+\def\findlength#1{%
+ \begingroup
+ \setdashpattern <0pt, \maxdimen>
+ \setplotsymbol ({})
+ \dontsavelinesandcurves
+ #1%
+ \endgroup
+ \ignorespaces}
+
+
+% *************************************************************
+% *** DIVISION (Does long division of dimension registers) ***
+% *************************************************************
+
+% ** User command:
+% ** \Divide {DIVIDEND} by {DIVISOR} forming {RESULT}
+
+% ** Internal command
+% ** \!divide{DIVIDEND}{DIVISOR}{RESULT}
+
+% ** \!divide DIVIDEND [by] DIVISOR [to get] ANSWER
+% ** Divides the dimension DIVIDEND by the dimension DIVISOR, placing the
+% ** quotient in the dimension register ANSWER. Values are understood to
+% ** be in points. E.g. 12.5pt/1.4pt=8.92857pt.
+% ** Quotient is accurate to 1/65536pt=2**[-16]pt
+% ** |DIVISOR| should be < 2048pt (about 28 inches).
+\def\!divide#1#2#3{%
+ \!dimenB=#1% ** dimB holds current remainder (r)
+ \!dimenC=#2% ** dimC holds divisor (d)
+ \!dimenD=\!dimenB% ** dimD holds quotient q=r/d for this
+ \divide \!dimenD \!dimenC% ** step, in units of scaled pts
+ \!dimenA=\!dimenD% ** dimA eventually holds answer (a)
+ \multiply\!dimenD \!dimenC% ** r <-- r - dq
+ \advance\!dimenB -\!dimenD% ** First step complete. Have integer part
+% ** of a, and corresponding remainder.
+ \!dimenD=\!dimenC% ** Temporarily use dimD to hold |d|
+ \ifdim\!dimenD<\!zpt \!dimenD=-\!dimenD
+ \fi
+ \ifdim\!dimenD<64pt% ** Branch on the magnitude of |d|
+ \!divstep[\!tfs]\!divstep[\!tfs]%
+ \else
+ \!!divide
+ \fi
+ #3=\!dimenA\ignorespaces}
+
+% ** The following code handles divisors d with
+% ** (1) .88in = 64pt <= d < 256pt = 3.54in
+% ** (2) 3.54in = 256pt <= d < 2048pt = 28.34in
+% ** Anything bigger than that may result in an overflow condition.
+% ** For our purposes, we should never even see case (2).
+\def\!!divide{%
+ \ifdim\!dimenD<256pt
+ \!divstep[64]\!divstep[32]\!divstep[32]%
+ \else
+ \!divstep[8]\!divstep[8]\!divstep[8]\!divstep[8]\!divstep[8]%
+ \!dimenA=2\!dimenA
+ \fi}
+
+
+% ** The following macro does the real long division work.
+\def\!divstep[#1]{% ** #1 = "B"
+ \!dimenB=#1\!dimenB% ** r <-- B*r
+ \!dimenD=\!dimenB% ** dimD holds quotient q=r/d for this
+ \divide \!dimenD by \!dimenC% ** step, in units of scaled pts
+ \!dimenA=#1\!dimenA% ** a <-- B*a + q
+ \advance\!dimenA by \!dimenD%
+ \multiply\!dimenD by \!dimenC% ** r <-- r - dq
+ \advance\!dimenB by -\!dimenD}
+
+% ** \Divide: See Subsection 9.3 of the manual.
+\def\Divide <#1> by <#2> forming <#3> {%
+ \!divide{#1}{#2}{#3}}
+
+
+% *********************************************
+% *** ELLIPSES (Draws ellipses and circles) ***
+% *********************************************
+
+% ** User commands
+% ** \ellipticalarc axes ratio A:B DEGREES degrees from XSTART YSTART
+% ** center at XCENTER YCENTER
+% ** \circulararc DEGREES degrees from XSTART YSTART
+% ** center at XCENTER YCENTER
+
+% ** Internal command
+% ** \!sinandcos{32*ANGLE in radians}{32*SIN}{32*COS}
+
+
+% ** \ellipticalarc axes ratio A:B DEGREES degrees from XSTART YSTART
+% ** center at XCENTER YCENTER
+% ** Draws a elliptical arc starting at the coordinate point (XSTART,YSTART).
+% ** The center of the ellipse of which the arc is a segment is at
+% ** (XCENTER,YCENTER).
+% ** The arc extends through an angle of DEGREES degrees (may be + or -).
+% ** A:B is the ratio of the length of the xaxis to the length of
+% ** the yaxis of the ellipse
+% ** Sqrt{[(XSTART-XCENTER)/A]**2 + [(YSTART-YCENTER)/B]**2}
+% ** must be < 512pt (about 7in).
+% ** Doesn't modify the dimensions (ht, dp, wd) of the PiCture under
+% ** construction.
+
+% ** \circulararc -- See Subsection 5.3 of the manual.
+\def\circulararc{%
+ \ellipticalarc axes ratio 1:1 }
+
+% ** \ellipticalarc -- See Subsection 5.3 of the manual.
+\def\ellipticalarc axes ratio #1:#2 #3 degrees from #4 #5 center at #6 #7 {%
+ \!angle=#3pt\relax% ** get angle
+ \ifdim\!angle>\!zpt
+ \def\!sign{}% ** counterclockwise
+ \else
+ \def\!sign{-}\!angle=-\!angle% ** clockwise
+ \fi
+ \!xxloc=\!M{#6}\!xunit% ** convert CENTER to dimension
+ \!yyloc=\!M{#7}\!yunit
+ \!xxS=\!M{#4}\!xunit% ** get STARTing point on rim of ellipse
+ \!yyS=\!M{#5}\!yunit
+ \advance\!xxS -\!xxloc% ** make center of ellipse (0,0)
+ \advance\!yyS -\!yyloc
+ \!divide\!xxS{#1pt}\!xxS % ** scale point on ellipse to point on
+ \!divide\!yyS{#2pt}\!yyS % corresponding circle
+%
+ \let\!MC=\!M% ** save current c/d mode
+ \!setdimenmode% ** go into dimension mode
+%
+ \!xS=#1\!xxS \advance\!xS\!xxloc
+ \!yS=#2\!yyS \advance\!yS\!yyloc
+ \!start (\!xS,\!yS)%
+ \!loop\ifdim\!angle>14.9999pt% ** draw in major portion of ellipse
+ \!rotate(\!xxS,\!yyS)by(\!cos,\!sign\!sin)to(\!xxM,\!yyM)
+ \!rotate(\!xxM,\!yyM)by(\!cos,\!sign\!sin)to(\!xxE,\!yyE)
+ \!xM=#1\!xxM \advance\!xM\!xxloc \!yM=#2\!yyM \advance\!yM\!yyloc
+ \!xE=#1\!xxE \advance\!xE\!xxloc \!yE=#2\!yyE \advance\!yE\!yyloc
+ \!qjoin (\!xM,\!yM) (\!xE,\!yE)
+ \!xxS=\!xxE \!yyS=\!yyE
+ \advance \!angle -15pt
+ \repeat
+ \ifdim\!angle>\!zpt% ** complete remaining arc, if any
+ \!angle=100.53096\!angle% ** convert angle to radians, divide
+ \divide \!angle 360 % ** by 2, and multiply by 32
+ \!sinandcos\!angle\!!sin\!!cos% ** get 32*sin & 32*cos
+ \!rotate(\!xxS,\!yyS)by(\!!cos,\!sign\!!sin)to(\!xxM,\!yyM)
+ \!rotate(\!xxM,\!yyM)by(\!!cos,\!sign\!!sin)to(\!xxE,\!yyE)
+ \!xM=#1\!xxM \advance\!xM\!xxloc \!yM=#2\!yyM \advance\!yM\!yyloc
+ \!xE=#1\!xxE \advance\!xE\!xxloc \!yE=#2\!yyE \advance\!yE\!yyloc
+ \!qjoin (\!xM,\!yM) (\!xE,\!yE)
+ \fi
+%
+ \let\!M=\!MC% ** restore c/d mode
+ \ignorespaces}% ** if appropriate
+
+
+% ** \!rotate(XREG,YREG)by(32cos,32sin)to(XXREG,YYREG)
+% ** rotates (XREG,YREG) by angle with specfied scaled cos & sin to
+% ** (XXREG,YYREG). Uses \!dimenA & \!dimenB as scratch registers.
+\def\!rotate(#1,#2)by(#3,#4)to(#5,#6){%
+ \!dimenA=#3#1\advance \!dimenA -#4#2% ** Rcos(x+t)=Rcosx*cost - Rsinx*sint
+ \!dimenB=#3#2\advance \!dimenB #4#1% ** Rsin(x+t)=Rsinx*cost + Rcosx*sint
+ \divide \!dimenA 32 \divide \!dimenB 32
+ #5=\!dimenA #6=\!dimenB
+ \ignorespaces}
+\def\!sin{4.17684}% ** 32*sin(pi/24) (pi/24=7.5deg)
+\def\!cos{31.72624}% ** 32*cos(pi/24)
+
+
+% ** \!sinandcos{32*ANGLE in radians}{\SINCS}{\COSCS}
+% ** Computes the 32*sine and 32*cosine of a small ANGLE expressed in
+% ** radians/32 and puts these values in the replacement texts of
+% ** \SINCS and \COSCS
+\def\!sinandcos#1#2#3{%
+ \!dimenD=#1% ** angle is expressed in radians/32: 1pt = 1/32rad
+ \!dimenA=\!dimenD% ** dimA will eventually contain 32sin(angle)in pts
+ \!dimenB=32pt% ** dimB will eventually contain 32cos(angle)in pts
+ \!removept\!dimenD\!value% ** get value of 32*angle, without "pt"
+ \!dimenC=\!dimenD% ** holds 32*angle**i/i! in pts
+ \!dimenC=\!value\!dimenC \divide\!dimenC by 64 % ** now 32*angle**2/2
+ \advance\!dimenB by -\!dimenC% ** 32-32*angle**2/2
+ \!dimenC=\!value\!dimenC \divide\!dimenC by 96 % ** now 32*angle**3/3!
+ \advance\!dimenA by -\!dimenC% ** now 32*(angle-angle**3/6)
+ \!dimenC=\!value\!dimenC \divide\!dimenC by 128 % ** now 32*angle**4/4!
+ \advance\!dimenB by \!dimenC%
+ \!removept\!dimenA#2% ** set 32*sin(angle)
+ \!removept\!dimenB#3% ** set 32*cos(angle)
+ \ignorespaces}
+
+
+% *****************************************************************
+% *** RULES (Draws rules, i.e., horizontal & vertical lines) ***
+% *****************************************************************
+
+% ** User command:
+% ** \putrule [<XDIMEN,YDIMEN>] from XCOORD1 YCOORD1
+% ** to XCOORD2 YCOORD2
+
+% ** Internal commands:
+% ** \!puthline [<XDIMEN,YDIMEN>] (h = horizontal)
+% ** Set by dashpat to either: \!putsolidhline or \!putdashedhline
+% ** \!putvline [<XDIMEN,YDIMEN>] (v = vertical)
+% ** Either: \!putsolidvline or \!putdashedvline
+
+
+% ** \putrule [<XDIMEN,YDIMEN>] from XCOORD1 YCOORD1
+% ** to XCOORD2 YCOORD2
+% ** Draws a rule -- dashed or solid depending on the current dash pattern --
+% ** from (X1,Y1) to (X2,Y2). Uses TEK's \hrule & \vrule & \leaders
+% ** constructions to handle horizontal & vertical lines efficiently both
+% ** in terms of execution time and space in the DVI file.
+% ** See Subsection 4.1 of the manual.
+\def\putrule#1from #2 #3 to #4 #5 {%
+ \!xloc=\!M{#2}\!xunit \!xxloc=\!M{#4}\!xunit%
+ \!yloc=\!M{#3}\!yunit \!yyloc=\!M{#5}\!yunit%
+ \!dxpos=\!xxloc \advance\!dxpos by -\!xloc
+ \!dypos=\!yyloc \advance\!dypos by -\!yloc
+%
+ \ifdim\!dypos=\!zpt
+ \def\!!Line{\!puthline{#1}}\ignorespaces
+ \else
+ \ifdim\!dxpos=\!zpt
+ \def\!!Line{\!putvline{#1}}\ignorespaces
+ \else
+ \def\!!Line{}
+ \fi
+ \fi
+ \let\!ML=\!M% ** save current coord\dimen mode
+ \!setdimenmode% ** express locations in dimens
+ \!!Line%
+ \let\!M=\!ML% ** restore previous c/d mode
+ \ignorespaces}
+
+
+% ** \!putsolidhline [<XDIMEN,YDIMEN>]
+% ** Place horizontal solid line
+\def\!putsolidhline#1{%
+ \ifdim\!dxpos>\!zpt
+ \put{\!hline\!dxpos}#1[l] at {\!xloc} {\!yloc}
+ \else
+ \put{\!hline{-\!dxpos}}#1[l] at {\!xxloc} {\!yyloc}
+ \fi
+ \ignorespaces}
+
+% ** \!putsolidvline [shifted <XDIMEN,YDIMEN>]
+% ** Place vertical solid line
+\def\!putsolidvline#1{%
+ \ifdim\!dypos>\!zpt
+ \put{\!vline\!dypos}#1[b] at {\!xloc} {\!yloc}
+ \else
+ \put{\!vline{-\!dypos}}#1[b] at {\!xxloc} {\!yyloc}
+ \fi
+ \ignorespaces}
+
+\def\!hline#1{\hbox to #1{\leaders \hrule height\linethickness\hfill}}
+\def\!vline#1{\vbox to #1{\leaders \vrule width\linethickness\vfill}}
+
+
+% ** \!putdashedhline [<XDIMEN,YDIMEN>]
+% ** Place dashed horizontal line
+\def\!putdashedhline#1{%
+ \ifdim\!dxpos>\!zpt
+ \!DLsetup\!Flist\!dxpos
+ \put{\hbox to \!totalleaderlength{\!hleaders}\!hpartialpattern\!Rtrunc}
+ #1[l] at {\!xloc} {\!yloc}
+ \else
+ \!DLsetup\!Blist{-\!dxpos}
+ \put{\!hpartialpattern\!Ltrunc\hbox to \!totalleaderlength{\!hleaders}}
+ #1[r] at {\!xloc} {\!yloc}
+ \fi
+ \ignorespaces}
+
+% ** \!putdashedhline [<XDIMEN,YDIMEN>]
+% ** Place dashed vertical line
+\def\!putdashedvline#1{%
+ \!dypos=-\!dypos% ** vertical leaders go from top to bottom
+ \ifdim\!dypos>\!zpt
+ \!DLsetup\!Flist\!dypos
+ \put{\vbox{\vbox to \!totalleaderlength{\!vleaders}
+ \!vpartialpattern\!Rtrunc}}#1[t] at {\!xloc} {\!yloc}
+ \else
+ \!DLsetup\!Blist{-\!dypos}
+ \put{\vbox{\!vpartialpattern\!Ltrunc
+ \vbox to \!totalleaderlength{\!vleaders}}}#1[b] at {\!xloc} {\!yloc}
+ \fi
+ \ignorespaces}
+
+
+% ** The rest of the macros in this section are subroutines used by
+% ** \!putdashedhline and \!putdashedvline.
+\def\!DLsetup#1#2{% ** Dashed-Line set up
+ \let\!RSlist=#1% ** set !Rule-Skip list
+ \!countB=#2% ** convert rule length to integer (number of sps)
+ \!countA=\!leaderlength% ** ditto, leaderlength
+ \divide\!countB by \!countA% ** number of complete leader units
+ \!totalleaderlength=\!countB\!leaderlength
+ \!Rresiduallength=#2%
+ \advance \!Rresiduallength by -\!totalleaderlength% \** excess length
+ \!Lresiduallength=\!leaderlength
+ \advance \!Lresiduallength by -\!Rresiduallength
+ \ignorespaces}
+
+\def\!hleaders{%
+ \def\!Rule##1{\vrule height\linethickness width##1}%
+ \def\!Skip##1{\hskip##1}%
+ \leaders\hbox{\!RSlist}\hfill}
+
+\def\!hpartialpattern#1{%
+ \!dimenA=\!zpt \!dimenB=\!zpt
+ \def\!Rule##1{#1{##1}\vrule height\linethickness width\!dimenD}%
+ \def\!Skip##1{#1{##1}\hskip\!dimenD}%
+ \!RSlist}
+
+\def\!vleaders{%
+ \def\!Rule##1{\hrule width\linethickness height##1}%
+ \def\!Skip##1{\vskip##1}%
+ \leaders\vbox{\!RSlist}\vfill}
+
+\def\!vpartialpattern#1{%
+ \!dimenA=\!zpt \!dimenB=\!zpt
+ \def\!Rule##1{#1{##1}\hrule width\linethickness height\!dimenD}%
+ \def\!Skip##1{#1{##1}\vskip\!dimenD}%
+ \!RSlist}
+
+\def\!Rtrunc#1{\!trunc{#1}>\!Rresiduallength}
+\def\!Ltrunc#1{\!trunc{#1}<\!Lresiduallength}
+
+\def\!trunc#1#2#3{%
+ \!dimenA=\!dimenB
+ \advance\!dimenB by #1%
+ \!dimenD=\!dimenB \ifdim\!dimenD#2#3\!dimenD=#3\fi
+ \!dimenC=\!dimenA \ifdim\!dimenC#2#3\!dimenC=#3\fi
+ \advance \!dimenD by -\!dimenC}
+
+
+% ****************************************************************
+% *** LINEAR ARC (Draws straight lines -- solid and dashed) ***
+% ****************************************************************
+
+% ** User commands
+% ** \inboundscheckoff
+% ** \inboundscheckon
+
+% ** Internal commands
+% ** \!start (XCOORD,YCOORD)
+% ** \!ljoin (XCOORD,YCOORD)
+% ** \!drawlinearsegment -- set by \dashpat to either
+% ** \!linearsolid or \!lineardashed
+% ** \!advancedashing -- set by \dashpat to either
+% ** \relax or \!!advancedashing
+% ** \!plotifinbounds -- set by \inboundscheck off/on to either
+% ** \!plot or \!!plotifinbounds
+% ** \!initinboundscheck -- set by \inboundscheck off/on to either
+% ** \relax or \!!initinboundscheck
+
+
+% \plotsymbolspacing ** distance between consecutive plot positions
+% \!xS ** starting x
+% \!yS ** starting y
+% \!xE ** ending x
+% \!yE ** ending y
+% \!xdiff ** x_end - x_start
+% \!ydiff ** y_end - y_start
+% \!distacross ** how far along curve next point to be plotted is
+% \!arclength ** approximate length of arc for current interval
+% \!downlength ** remaining length for "pen" to be down
+% \!uplength ** length for "pen" to be down
+% \!intervalno ** counts segments to curve
+% \totalarclength ** cumulative distance along curve
+% \!npoints ** approximately (arc length / plotsymbolspacing)
+
+% ** Calls -- \!Pythag, \!divide, \!plot
+
+
+% ** \!start (XCOORD,YCOORD)
+% ** Sets initial point for linearly (or quadratically) interpolated curve
+\def\!start (#1,#2){%
+ \!plotxorigin=\!xorigin \advance \!plotxorigin by \!plotsymbolxshift
+ \!plotyorigin=\!yorigin \advance \!plotyorigin by \!plotsymbolyshift
+ \!xS=\!M{#1}\!xunit \!yS=\!M{#2}\!yunit
+ \!rotateaboutpivot\!xS\!yS
+ \!copylist\!UDlist\to\!!UDlist% **\!UDlist has the form \\{dimen1}\\{dimen2}..
+% ** Routine will draw dashed line with pen
+% ** down for dimen1, up for dimen2, ...
+ \!getnextvalueof\!downlength\from\!!UDlist
+ \!distacross=\!zpt% ** 1st point goes at start of curve
+ \!intervalno=0 % ** initialize interval counter
+ \global\totalarclength=\!zpt% ** initialize distance traveled along curve
+ \ignorespaces}
+
+
+% ** \!ljoin (XCOORD,YCOORD)
+% ** Draws a straight line starting at the last point specified
+% ** by the most recent \!start, \!ljoin, or \!qjoin, and
+% ** ending at (XCOORD,YCOORD).
+\def\!ljoin (#1,#2){%
+ \advance\!intervalno by 1
+ \!xE=\!M{#1}\!xunit \!yE=\!M{#2}\!yunit
+ \!rotateaboutpivot\!xE\!yE
+ \!xdiff=\!xE \advance \!xdiff by -\!xS%** xdiff = xE - xS
+ \!ydiff=\!yE \advance \!ydiff by -\!yS%** ydiff = yE - yS
+ \!Pythag\!xdiff\!ydiff\!arclength% ** arclength = sqrt(xdiff**2+ydiff**2)
+ \global\advance \totalarclength by \!arclength%
+ \!drawlinearsegment% ** set by dashpat to \!linearsolid or \!lineardashed
+ \!xS=\!xE \!yS=\!yE% ** shift ending points to starting points
+ \ignorespaces}
+
+
+% ** The following routine is used to draw a "solid" line between (xS,yS)
+% ** and (xE,yE). Points are spaced nearly every \plotsymbolspacing length
+% ** along the line.
+\def\!linearsolid{%
+ \!npoints=\!arclength
+ \!countA=\plotsymbolspacing
+ \divide\!npoints by \!countA% ** now #pts =. arclength/plotsymbolspacing
+ \ifnum \!npoints<1
+ \!npoints=1
+ \fi
+ \divide\!xdiff by \!npoints
+ \divide\!ydiff by \!npoints
+ \!xpos=\!xS \!ypos=\!yS
+%
+ \loop\ifnum\!npoints>-1
+ \!plotifinbounds
+ \advance \!xpos by \!xdiff
+ \advance \!ypos by \!ydiff
+ \advance \!npoints by -1
+ \repeat
+ \ignorespaces}
+
+
+% ** The following routine is used to draw a dashed line between (xS,yS)
+% ** and (xE,yE). The dash pattern continues from the previous segment.
+\def\!lineardashed{%
+% **
+ \ifdim\!distacross>\!arclength
+ \advance \!distacross by -\!arclength %nothing to plot in this interval
+%
+ \else
+%
+ \loop\ifdim\!distacross<\!arclength
+% ** plot point, interpolating linearly in x and y
+ \!divide\!distacross\!arclength\!dimenA% ** dimA = across/arclength
+ \!removept\!dimenA\!t% ** \!t holds value in dimA, without the "pt"
+ \!xpos=\!t\!xdiff \advance \!xpos by \!xS
+ \!ypos=\!t\!ydiff \advance \!ypos by \!yS
+ \!plotifinbounds
+ \advance\!distacross by \plotsymbolspacing
+ \!advancedashing
+ \repeat
+%
+ \advance \!distacross by -\!arclength% ** prepare for next interval
+ \fi
+ \ignorespaces}
+
+
+\def\!!advancedashing{%
+ \advance\!downlength by -\plotsymbolspacing
+ \ifdim \!downlength>\!zpt
+ \else
+ \advance\!distacross by \!downlength
+ \!getnextvalueof\!uplength\from\!!UDlist
+ \advance\!distacross by \!uplength
+ \!getnextvalueof\!downlength\from\!!UDlist
+ \fi}
+
+
+% ** \inboundscheckoff & \inboundscheckon: See Subsection 5.5 of the manual.
+\def\inboundscheckoff{%
+ \def\!plotifinbounds{\!plot(\!xpos,\!ypos)}%
+ \def\!initinboundscheck{\relax}\ignorespaces}
+\def\inboundscheckon{%
+ \def\!plotifinbounds{\!!plotifinbounds}%
+ \def\!initinboundscheck{\!!initinboundscheck}%
+ \!initinboundscheck\ignorespaces}
+\inboundscheckoff
+
+% ** The following code plots the current point only if it falls in the
+% ** current plotarea. It doesn't matter if the coordinate system has
+% ** changed since the plotarea was set up. However, shifts of the plot
+% ** are ignored (how the plotsymbol stands relative to its plot position is
+% ** unknown anyway).
+\def\!!plotifinbounds{%
+ \ifdim \!xpos<\!checkleft
+ \else
+ \ifdim \!xpos>\!checkright
+ \else
+ \ifdim \!ypos<\!checkbot
+ \else
+ \ifdim \!ypos>\!checktop
+ \else
+ \!plot(\!xpos,\!ypos)
+ \fi
+ \fi
+ \fi
+ \fi}
+
+
+\def\!!initinboundscheck{%
+ \!checkleft=\!arealloc \advance\!checkleft by \!xorigin
+ \!checkright=\!arearloc \advance\!checkright by \!xorigin
+ \!checkbot=\!areabloc \advance\!checkbot by \!yorigin
+ \!checktop=\!areatloc \advance\!checktop by \!yorigin}
+
+
+% *********************************
+% *** LOGTEN (Log_10 function) ***
+% *********************************
+%
+% ** \!logten{X}
+% ** Calculates log_10 of X. X and LOG10(X) are in fixed point notation.
+% ** X must be positive; it may have an optional `+' sign; any number
+% ** of digits may be specified for X. The absolute error in LOG10(X) is
+% ** less than .0001 (probably < .00006). That's about as good as you
+% ** hope for, since TEX only operates to 5 figures after the decimal
+% ** point anyway.
+
+% \!rootten=3.162278pt **** These are values are set in ALLOCATIONS
+% \!tenAe=2.543275pt (=A5)
+% \!tenAc=2.773839pt (=A3)
+% \!tenAa=8.690286pt (=A1)
+
+\def\!logten#1#2{%
+ \expandafter\!!logten#1\!nil
+ \!removept\!dimenF#2%
+ \ignorespaces}
+
+\def\!!logten#1#2\!nil{%
+ \if -#1%
+ \!dimenF=\!zpt
+ \def\!next{\ignorespaces}%
+ \else
+ \if +#1%
+ \def\!next{\!!logten#2\!nil}%
+ \else
+ \if .#1%
+ \def\!next{\!!logten0.#2\!nil}%
+ \else
+ \def\!next{\!!!logten#1#2..\!nil}%
+ \fi
+ \fi
+ \fi
+ \!next}
+
+\def\!!!logten#1#2.#3.#4\!nil{%
+ \!dimenF=1pt % ** DimF holds log10 original argument
+ \if 0#1%
+ \!!logshift#3pt % ** Argument < 1
+ \else % ** Argument >= 1
+ \!logshift#2/% ** Shift decimal pt as many places
+ \!dimenE=#1.#2#3pt % ** as there are figures in #2
+ \fi % ** Now dimE holds revised X want log10 of
+ \ifdim \!dimenE<\!rootten% ** Transform X to XX between sqrt(10)
+ \multiply \!dimenE 10 % ** and 10*sqrt(10)
+ \advance \!dimenF -1pt
+ \fi
+ \!dimenG=\!dimenE% ** dimG <- (XX + 10)
+ \advance\!dimenG 10pt
+ \advance\!dimenE -10pt % ** dimE <- (XX - 10)
+ \multiply\!dimenE 10 % ** dimE = 10*(XX-10)
+ \!divide\!dimenE\!dimenG\!dimenE% ** Now dimE=10t==10*(XX-10)/(XX+10)
+ \!removept\!dimenE\!t% ** !t=10t, with "pt" removed
+ \!dimenG=\!t\!dimenE% ** dimG=100t**2
+ \!removept\!dimenG\!tt% ** !tt=100t**2, with "pt" removed
+ \!dimenH=\!tt\!tenAe% ** dimH=10*a5*(10t)**2 /100
+ \divide\!dimenH 100
+ \advance\!dimenH \!tenAc% ** ditto + 10*a3
+ \!dimenH=\!tt\!dimenH% ** ditto * (10t)**2 /100
+ \divide\!dimenH 100
+ \advance\!dimenH \!tenAa% ** ditto + 10*a1
+ \!dimenH=\!t\!dimenH% ** ditto * 10t / 100
+ \divide\!dimenH 100 % ** Now dimH = log10(XX) - 1
+ \advance\!dimenF \!dimenH}% ** dimF = log10(X)
+
+\def\!logshift#1{%
+ \if #1/%
+ \def\!next{\ignorespaces}%
+ \else
+ \advance\!dimenF 1pt
+ \def\!next{\!logshift}%
+ \fi
+ \!next}
+
+ \def\!!logshift#1{%
+ \advance\!dimenF -1pt
+ \if 0#1%
+ \def\!next{\!!logshift}%
+ \else
+ \if p#1%
+ \!dimenF=1pt
+ \def\!next{\!dimenE=1p}%
+ \else
+ \def\!next{\!dimenE=#1.}%
+ \fi
+ \fi
+ \!next}
+
+
+% ***********************************************************
+% *** PICTURES (Basic setups for PiCtures; \put commands) ***
+% ***********************************************************
+
+% ** User Commands:
+% ** \beginpicture
+% ** \endpicture
+% ** \endpicturesave <XREG,YREG>
+% ** \setcoordinatesystem units <XUNIT,YUNIT> point at XREF YREF
+% ** \put {OBJECT} [ORIENTATION] <XSHIFT,YSHIFT> at XCOORD YCOORD
+% ** \multiput {OJBECT} [ORIENTATION] <XSHIFT,YSHIFT>) at
+% ** XCOORD YCOORD
+% ** *NUMBER_OF_TIMES DXCOORD DYCOORD /
+% ** \accountingon
+% ** \accountingoff
+% ** \stack [ORIENTATION] <LEADING> {LIST OF ITEMS}
+% ** \lines [ORIENTATION] {LINES}
+% ** \Lines [ORIENTATION] {LINES}
+% ** \setdimensionmode
+% ** \setcoordinatemode
+% ** \Xdistance
+% ** \Ydistance
+
+% ** Internal commands:
+% ** \!setputobject{OBJECT}{[ORIENTATION]<XSHIFT,YSHIFT>}
+% ** \!dimenput{OBJECT}[ORIENTATION]<XSHIFT,YSHIFT>(XDIMEN,YDIMEN)
+% ** \!setdimenmode
+% ** \!setcoordmode
+% ** \!ifdimenmode
+% ** \!ifcoordmode
+
+
+% ** \beginpicture
+% ** \endpicture
+% ** \endpicturesave <XREG,YREG>
+% ** \beginpicture ... \endpicture creates an hbox. Objects are
+% ** placed in this box using the \put command and the like (see below).
+% ** The location of an object is specified in terms of coordinate system(s)
+% ** established by \setcoordinatesystem. Each coordinate system (there
+% ** might be just one) specifies the length of 1 horizontal unit, the length
+% ** of 1 vertical unit, and the coordinates of a "reference point". The
+% ** reference points of various coordinate systems will be in the same
+% ** physical location. The macros keep track of the size of the objects
+% ** and their locations. The resulting hbox is the smallest hbox which
+% ** encloses all the objects, and whose TEK reference point is the point
+% ** on the left edge of the box closest vertically to the PICTEX reference
+% ** point. Using \endpicturesave, you can (globally) save the distance TEK's
+% ** reference point is to the right (respectively, up from) PICTEX's
+% ** reference point in the dimension register \XREG (respectively \YREG).
+% ** You can then \put the picture OBJECT into a larger picture so that its
+% ** reference point is at (XCOORD,YCOORD) with the command
+% ** \put {picture OBJECT} [Bl] <\XREG, \YREG> at XCOORD YCOORD
+
+% ** \beginpicture : See Subsection 1.1 of the manual.
+\def\beginpicture{%
+ \setbox\!picbox=\hbox\bgroup%
+ \!xleft=\maxdimen
+ \!xright=-\maxdimen
+ \!ybot=\maxdimen
+ \!ytop=-\maxdimen}
+
+% ** \endpicture : See Subsection 1.1 of the manual.
+\def\endpicture{%
+ \ifdim\!xleft=\maxdimen% ** check if nothing was put in picbox
+ \!xleft=\!zpt \!xright=\!zpt \!ybot=\!zpt \!ytop=\!zpt
+ \fi
+ \global\!Xleft=\!xleft \global\!Xright=\!xright
+ \global\!Ybot=\!ybot \global\!Ytop=\!ytop
+ \egroup%
+ \ht\!picbox=\!Ytop \dp\!picbox=-\!Ybot
+ \ifdim\!Ybot>\!zpt
+ \else
+ \ifdim\!Ytop<\!zpt
+ \!Ybot=\!Ytop
+ \else
+ \!Ybot=\!zpt
+ \fi
+ \fi
+ \hbox{\kern-\!Xleft\lower\!Ybot\box\!picbox\kern\!Xright}}
+
+% ** \endpicturesave : See Subsection 8.4 of the manual.
+\def\endpicturesave <#1,#2>{%
+ \endpicture \global #1=\!Xleft \global #2=\!Ybot \ignorespaces}
+
+
+% ** \setcoordinatesystem units <XUNIT,YUNIT>
+% ** point at XREF YREF
+% ** Each of `units <XUNIT,YUNIT>' and `point at XREF YREF'
+% ** are optional.
+% ** Unit lengths must be given in dimensions (e.g., <10pt,1in>).
+% ** Default unit lengths are 1pt, 1pt, or previous unit lengths.
+% ** Reference point is specified in current units (e.g., 3 5 ).
+% ** Default reference point is 0 0 , or previous reference point.
+% ** Unit lengths and reference points obey TEX's scoping rules.
+% ** See Subsection 1.2 of the manual.
+\def\setcoordinatesystem{%
+ \!ifnextchar{u}{\!getlengths }
+ {\!getlengths units <\!xunit,\!yunit>}}
+\def\!getlengths units <#1,#2>{%
+ \!xunit=#1\relax
+ \!yunit=#2\relax
+ \!ifcoordmode
+ \let\!SCnext=\!SCccheckforRP
+ \else
+ \let\!SCnext=\!SCdcheckforRP
+ \fi
+ \!SCnext}
+\def\!SCccheckforRP{%
+ \!ifnextchar{p}{\!cgetreference }
+ {\!cgetreference point at {\!xref} {\!yref} }}
+\def\!cgetreference point at #1 #2 {%
+ \edef\!xref{#1}\edef\!yref{#2}%
+ \!xorigin=\!xref\!xunit \!yorigin=\!yref\!yunit
+ \!initinboundscheck % ** See linear.tex
+ \ignorespaces}
+\def\!SCdcheckforRP{%
+ \!ifnextchar{p}{\!dgetreference}%
+ {\ignorespaces}}
+\def\!dgetreference point at #1 #2 {%
+ \!xorigin=#1\relax \!yorigin=#2\relax
+ \ignorespaces}
+
+
+% ** \put {OBJECT} [XY] <XDIMEN,YDIMEN> at (XCOORD,YCOORD)
+% ** `[XY]' and `<XDIMEN,YDIMEN>' are optional.
+% ** First OBJECT is placed in an hbox (the "objectbox") and then a
+% ** "reference point" is assigned to the objectbox as follows:
+% ** [1] first, the reference point is taken to be the center of the box;
+% ** [2] next, centering is overridden by the specifications
+% ** X=l -- reference point along the left edge of the objectbox
+% ** X=r -- reference point along the right edge of the objectbox
+% ** Y=b -- reference point along the bottom edge of the objectbox
+% ** Y=B -- reference point along the Baseline of the objectbox
+% ** Y=t -- reference point along the top edge of the objectbox;
+% ** [3] finally the reference point is shifted left by XDIMEN, down
+% ** by YDIMEN (both default to 0pt).
+% ** The objectbox is placed within PICBOX with its reference point at
+% ** (XCOORD,YCOORD).
+% ** If OBJECT is a saved box, say box0, you have to write
+% ** \put{\box0}... or \put{\copy0}...
+% ** The objectbox is void after the put.
+% ** See Subsection 2.1 of the manual.
+\long\def\put#1#2 at #3 #4 {%
+ \!setputobject{#1}{#2}%
+ \!xpos=\!M{#3}\!xunit \!ypos=\!M{#4}\!yunit
+ \!rotateaboutpivot\!xpos\!ypos%
+ \advance\!xpos -\!xorigin \advance\!xpos -\!xshift
+ \advance\!ypos -\!yorigin \advance\!ypos -\!yshift
+ \kern\!xpos\raise\!ypos\box\!putobject\kern-\!xpos%
+ \!doaccounting\ignorespaces}
+
+% ** \multiput etc. Like \put. The objectbox is not voided until the
+% ** termininating /, and is placed repeatedly with:
+% ** XCOORD YCOORD -- the objectbox is put down with its reference point
+% ** at (XCOORD,YCOORD);
+% ** *N DXCOORD DYCOORD -- each of N times the current
+% ** (xcoord,ycoord) is incremented by (DXCOORD,DYCOORD), and the
+% ** objectbox is put down with its reference point at (xcoord,ycoord)
+% ** (This specification has to follow an XCOORD YCOORD pair)
+% ** See Subsection 2.2 of the manual.
+\long\def\multiput #1#2 at {%
+ \!setputobject{#1}{#2}%
+ \!ifnextchar"{\!putfromfile}{\!multiput}}
+\def\!putfromfile"#1"{%
+ \expandafter\!multiput \normalinput #1 /}
+\def\!multiput{%
+ \futurelet\!nextchar\!!multiput}
+\def\!!multiput{%
+ \if *\!nextchar
+ \def\!nextput{\!alsoby}%
+ \else
+ \if /\!nextchar
+ \def\!nextput{\!finishmultiput}%
+ \else
+ \def\!nextput{\!alsoat}%
+ \fi
+ \fi
+ \!nextput}
+\def\!finishmultiput/{%
+ \setbox\!putobject=\hbox{}%
+ \ignorespaces}
+
+% ** \!alsoat XCOORD YCOORD
+% ** The objectbox is put down with reference point at XCOORD,YCOORD
+\def\!alsoat#1 #2 {%
+ \!xpos=\!M{#1}\!xunit \!ypos=\!M{#2}\!yunit
+ \!rotateaboutpivot\!xpos\!ypos%
+ \advance\!xpos -\!xorigin \advance\!xpos -\!xshift
+ \advance\!ypos -\!yorigin \advance\!ypos -\!yshift
+ \kern\!xpos\raise\!ypos\copy\!putobject\kern-\!xpos%
+ \!doaccounting
+ \!multiput}
+
+% ** \!alsoby*N DXCOORD DYCOORD
+% ** N times, the current (XCOORD,YCOORD) is advanced by (DXCOORD,DYCOORD),
+% ** and the current (shifted, oriented) OBJECT is put down.
+\def\!alsoby*#1 #2 #3 {%
+ \!dxpos=\!M{#2}\!xunit \!dypos=\!M{#3}\!yunit
+ \!rotateonly\!dxpos\!dypos
+ \!ntemp=#1%
+ \!!loop\ifnum\!ntemp>0
+ \advance\!xpos by \!dxpos \advance\!ypos by \!dypos
+ \kern\!xpos\raise\!ypos\copy\!putobject\kern-\!xpos%
+ \advance\!ntemp by -1
+ \repeat
+ \!doaccounting
+ \!multiput}
+
+% ** \accountingoff : Suspends PiCTeX's accounting of the aggregate
+% ** size of the picture box.
+% ** \accounting on : Reinstates accounting.
+% ** See Subsection 8.2 of the manual.
+\def\accountingon{\def\!doaccounting{\!!doaccounting}\ignorespaces}
+\def\accountingoff{\def\!doaccounting{}\ignorespaces}
+\accountingon
+\def\!!doaccounting{%
+ \!xtemp=\!xpos
+ \!ytemp=\!ypos
+ \ifdim\!xtemp<\!xleft
+ \!xleft=\!xtemp
+ \fi
+ \advance\!xtemp by \!wd
+ \ifdim\!xright<\!xtemp
+ \!xright=\!xtemp
+ \fi
+ \advance\!ytemp by -\!dp
+ \ifdim\!ytemp<\!ybot
+ \!ybot=\!ytemp
+ \fi
+ \advance\!ytemp by \!dp
+ \advance\!ytemp by \!ht
+ \ifdim\!ytemp>\!ytop
+ \!ytop=\!ytemp
+ \fi}
+
+\long\def\!setputobject#1#2{%
+ \setbox\!putobject=\hbox{#1}%
+ \!ht=\ht\!putobject \!dp=\dp\!putobject \!wd=\wd\!putobject
+ \wd\!putobject=\!zpt
+ \!xshift=.5\!wd \!yshift=.5\!ht \advance\!yshift by -.5\!dp
+ \edef\!putorientation{#2}%
+ \expandafter\!SPOreadA\!putorientation[]\!nil%
+ \expandafter\!SPOreadB\!putorientation<\!zpt,\!zpt>\!nil\ignorespaces}
+
+\def\!SPOreadA#1[#2]#3\!nil{\!etfor\!orientation:=#2\do\!SPOreviseshift}
+
+\def\!SPOreadB#1<#2,#3>#4\!nil{\advance\!xshift by -#2\advance\!yshift by -#3}
+
+\def\!SPOreviseshift{%
+ \if l\!orientation
+ \!xshift=\!zpt
+ \else
+ \if r\!orientation
+ \!xshift=\!wd
+ \else
+ \if b\!orientation
+ \!yshift=-\!dp
+ \else
+ \if B\!orientation
+ \!yshift=\!zpt
+ \else
+ \if t\!orientation
+ \!yshift=\!ht
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi}
+
+
+% ** \!dimenput{OBJECT} <XDIMEN,YDIMEN> [XY] (XLOC,YLOC)
+% ** This is an internal put routine, similar to \put, except that
+% ** XLOC=distance right from reference point, YLOC=distance up from
+% ** reference point. XLOC and YLOC are dimensions, so this routine
+% ** is completely independent of the current coordinate system.
+% ** This routine does NOT do ROTATIONS.
+\long\def\!dimenput#1#2(#3,#4){%
+ \!setputobject{#1}{#2}%
+ \!xpos=#3\advance\!xpos by -\!xshift
+ \!ypos=#4\advance\!ypos by -\!yshift
+ \kern\!xpos\raise\!ypos\box\!putobject\kern-\!xpos%
+ \!doaccounting\ignorespaces}
+
+
+% ** The following macros permit the picture drawing routines to be used
+% ** either in the default "coordinate mode", or in "dimension mode".
+% ** In coordinate mode \!M(1.5,\!xunit) expands to 1.5\!xunit
+% ** In dimension mode \!M(1.5pt,\!xunit) expands to 1.5pt
+% ** Dimension mode is useful in coding macros.
+% ** Any special purpose picture macro that sets dimension mode should
+% ** reset coordinate mode before completion.
+% ** See Subsection 9.2 of the manual.
+\def\!setdimenmode{%
+ \let\!M=\!M!!\ignorespaces}
+\def\!setcoordmode{%
+ \let\!M=\!M!\ignorespaces}
+\def\!ifcoordmode{%
+ \ifx \!M \!M!}
+\def\!ifdimenmode{%
+ \ifx \!M \!M!!}
+\def\!M!#1#2{#1#2}
+\def\!M!!#1#2{#1}
+\!setcoordmode
+\let\setdimensionmode=\!setdimenmode
+\let\setcoordinatemode=\!setcoordmode
+
+% ** \Xdistance{XCOORD}, \Ydistance{YCOORD} are the horizontal and
+% ** vertical distances from the origin (0,0) to the point
+% ** (XCOORD,YCOORD) in the current coordinate system.
+% ** See Subsection 9.2 of the manual.
+\def\Xdistance#1{%
+ \!M{#1}\!xunit
+ \ignorespaces}
+\def\Ydistance#1{%
+ \!M{#1}\!yunit
+ \ignorespaces}
+
+% ** The following macros -- \stack, \line, and \Lines -- are useful for
+% ** annotating PiCtures. They can be used outside the \beginpicture ...
+% ** \endpicture environment.
+
+% ** \stack [POSITIONING] <LEADING> {VALUESLIST}
+% ** Builds a vertical stack of the values in VALUESLIST. Values in
+% ** VALUESLIST are separated by commas. In the resulting stack, values are
+% ** centered by default, and positioned flush left (right) if
+% ** POSITIONING = l (r). Values are separated vertically by LEADING,
+% ** which defaults to \stackleading.
+% ** See Subsection 2.3 of the manual.
+\def\stack{%
+ \!ifnextchar[{\!stack}{\!stack[c]}}
+\def\!stack[#1]{%
+ \let\!lglue=\hfill \let\!rglue=\hfill
+ \expandafter\let\csname !#1glue\endcsname=\relax
+ \!ifnextchar<{\!!stack}{\!!stack<\stackleading>}}
+\def\!!stack<#1>#2{%
+ \vbox{\def\!valueslist{}\!ecfor\!value:=#2\do{%
+ \expandafter\!rightappend\!value\withCS{\\}\to\!valueslist}%
+ \!lop\!valueslist\to\!value
+ \let\\=\cr\lineskiplimit=\maxdimen\lineskip=#1%
+ \baselineskip=-1000pt\halign{\!lglue##\!rglue\cr \!value\!valueslist\cr}}%
+ \ignorespaces}
+
+% ** \lines [POSITIONING] {LINES}
+% ** Builds a vertical array of the lines in LINES. Each line in LINES
+% ** is terminated by a \cr. In the resulting array, lines are
+% ** centered by default, and positioned flush left (right) if
+% ** POSITIONING = l (r). The lines in the array are subject to TeX's
+% ** usual spacing rules: in particular the baselines are ordinarily an equal
+% ** distance apart. The baseline of the array is the baseline of the
+% ** the bottom line.
+% ** See Subsection 2.3 of the manual.
+\def\lines{%
+ \!ifnextchar[{\!lines}{\!lines[c]}}
+\def\!lines[#1]#2{%
+ \let\!lglue=\hfill \let\!rglue=\hfill
+ \expandafter\let\csname !#1glue\endcsname=\relax
+ \vbox{\halign{\!lglue##\!rglue\cr #2\crcr}}%
+ \ignorespaces}
+
+% ** \Lines [POSITIONING] {LINES}
+% ** Like \lines, but the baseline of the array is the baseline of the
+% ** top line. See Subsection 2.3 of the manual.
+\def\Lines{%
+ \!ifnextchar[{\!Lines}{\!Lines[c]}}
+\def\!Lines[#1]#2{%
+ \let\!lglue=\hfill \let\!rglue=\hfill
+ \expandafter\let\csname !#1glue\endcsname=\relax
+ \vtop{\halign{\!lglue##\!rglue\cr #2\crcr}}%
+ \ignorespaces}
+
+
+% *********************************************
+% *** PLOTTING (Things to do with plotting) ***
+% *********************************************
+
+% ** User commands
+% ** \setplotsymbol ({PLOTSYMBOL} [ORIENTATION] <XSHIFT,YSHIFT>)
+% ** \savelinesandcurves on "FILE_NAME"
+% ** \dontsavelinesandcurves
+% ** \writesavefile {MESSAGE}
+% ** \replot {FILE_NAME}
+
+% ** Internal command
+% ** \!plot(XDIMEN,YDIMEN)
+
+% ** \setplotsymbol ({PLOTSYMBOL} [ ] < , >)
+% ** Save PLOTSYMBOL away in an hbox for use with curve plotting routines
+% ** See Subsection 5.2 of the manual.
+\def\setplotsymbol(#1#2){%
+ \!setputobject{#1}{#2}
+ \setbox\!plotsymbol=\box\!putobject%
+ \!plotsymbolxshift=\!xshift
+ \!plotsymbolyshift=\!yshift
+ \ignorespaces}
+
+\setplotsymbol({\fiverm .})% ** initialize plotsymbol
+
+
+% ** \!plot is either \!!plot (when no lines and curves are being saved) or
+% ** \!!!plot (when lines and curves are being saved)
+
+% ** \!!plot(XDIMEN,YDIMEN)
+% ** Places the current plotsymbol a horizontal distance=XDIMEN-xorigin
+% ** and a vertical distance=YDIMEN-yorigin from the current
+% ** reference point.
+\def\!!plot(#1,#2){%
+ \!dimenA=-\!plotxorigin \advance \!dimenA by #1% ** over
+ \!dimenB=-\!plotyorigin \advance \!dimenB by #2% ** up
+ \kern\!dimenA\raise\!dimenB\copy\!plotsymbol\kern-\!dimenA%
+ \ignorespaces}
+
+% ** \!!!plot(XDIMEN,YDIMEN)
+% ** Like \!!plot, but also saves the plot location in units of
+% ** scaled point, on file `replotfile'
+\def\!!!plot(#1,#2){%
+ \!dimenA=-\!plotxorigin \advance \!dimenA by #1% ** over
+ \!dimenB=-\!plotyorigin \advance \!dimenB by #2% ** up
+ \kern\!dimenA\raise\!dimenB\copy\!plotsymbol\kern-\!dimenA%
+ \!countE=\!dimenA
+ \!countF=\!dimenB
+ \immediate\write\!replotfile{\the\!countE,\the\!countF.}%
+ \ignorespaces}
+
+
+% ** \savelinesandcurves on "FILE_NAME"
+% ** Switch to save locations used for plotting lines and curves
+% ** (No advantage in saving locations for solid lines; however
+% ** replotting curve locations speeds things up by a factor of about 4.
+% ** \dontsavelinesandcurves
+% ** Terminates \savelinesandcurves. The default.
+% ** See Subsection 5.6 of the manual.
+\def\savelinesandcurves on "#1" {%
+ \immediate\closeout\!replotfile
+ \immediate\openout\!replotfile=#1%
+ \let\!plot=\!!!plot}
+
+\def\dontsavelinesandcurves {%
+ \let\!plot=\!!plot}
+\dontsavelinesandcurves
+
+% ** \writesavefile {MESSAGE}
+% ** The message is preceded by a "%", so that it won't interfere
+% ** with replotting.
+% ** See Subsection 5.6 of the manual.
+{\catcode`\%=11\xdef\!Commentsignal{%}}
+\def\writesavefile#1 {%
+ \immediate\write\!replotfile{\!Commentsignal #1}%
+ \ignorespaces}
+
+% ** \replot "FILE_NAME"
+% ** Replots the locations saved earlier under \savelinesandcurves
+% ** on "FILE_NAME"
+% ** See Subsection 5.6 of the manual.
+\def\replot"#1" {%
+ \expandafter\!replot\normalinput #1 /}
+\def\!replot#1,#2. {%
+ \!dimenA=#1sp
+ \kern\!dimenA\raise#2sp\copy\!plotsymbol\kern-\!dimenA
+ \futurelet\!nextchar\!!replot}
+\def\!!replot{%
+ \if /\!nextchar
+ \def\!next{\!finish}%
+ \else
+ \def\!next{\!replot}%
+ \fi
+ \!next}
+% **************************************************
+% *** PYTHAGORAS (Euclidean distance function) ***
+% **************************************************
+
+% ** User command:
+% ** \placehypotenuse for <dimension1> and <dimension2> in <register>
+
+% ** Internal command:
+% ** \!Pythag{X}{Y}{Z}
+% ** Input X,Y are dimensions, or dimension registers.
+% ** Output Z == sqrt(X**2+Y**2) must be a dimension register.
+% ** Assumes that |X|+|Y| < 2048pt (about 28in).
+
+% ** Without loss of generality, suppose x>0, y>0. Put s = x+y,
+% ** z = sqrt(x**2+y**2). Then z = s*f, where f = sqrt(t**2 + (1-t)**2)
+% ** = sqrt((1+tau**2)/2), where t = x/s and tau = 2(t-1/2) .
+
+% ** Uses the \!divide macro (which uses registers \!dimenA--\!dimenD.
+% ** Uses the \!removept macro (e.g., 123.45pt --> 123.45)
+% ** Uses registers \!dimenE--\!dimenI.
+\def\!Pythag#1#2#3{%
+ \!dimenE=#1\relax
+ \ifdim\!dimenE<\!zpt
+ \!dimenE=-\!dimenE
+ \fi% ** dimE = |x|
+ \!dimenF=#2\relax
+ \ifdim\!dimenF<\!zpt
+ \!dimenF=-\!dimenF
+ \fi% ** dimF = |y|
+ \advance \!dimenF by \!dimenE% ** dimF = s = |x|+|y|
+ \ifdim\!dimenF=\!zpt
+ \!dimenG=\!zpt% ** dimG = z = sqrt(x**2+y**2)
+ \else
+ \!divide{8\!dimenE}\!dimenF\!dimenE% ** now dimE = 8t = (8|x|)/s
+ \advance\!dimenE by -4pt% ** 8tau = (8t-4)*2
+ \!dimenE=2\!dimenE% ** (tau = 2*t - 1)
+ \!removept\!dimenE\!!t% ** 8tau, without "pt"
+ \!dimenE=\!!t\!dimenE% ** (8tau)**2, in pts
+ \advance\!dimenE by 64pt% ** u = [64 + (8tau)**2]/2
+ \divide \!dimenE by 2% ** [u = (8f)**2]
+ \!dimenH=7pt% ** initial guess g at sqrt(u)
+ \!!Pythag\!!Pythag\!!Pythag% ** 3 iterations give sqrt(u)
+ \!removept\!dimenH\!!t% ** 8f=sqrt(u), without "pt"
+ \!dimenG=\!!t\!dimenF% ** z = (8f)*s/8
+ \divide\!dimenG by 8
+ \fi
+ #3=\!dimenG
+ \ignorespaces}
+
+\def\!!Pythag{% ** Newton-Raphson for sqrt
+ \!divide\!dimenE\!dimenH\!dimenI% ** v = u/g
+ \advance\!dimenH by \!dimenI% ** g <-- (g + u/g)/2
+ \divide\!dimenH by 2}
+
+% ** \placehypotenuse for <XI> and <ETA> in <ZETA>
+% ** See Subsection 9.3 of the manual.
+\def\placehypotenuse for <#1> and <#2> in <#3> {%
+ \!Pythag{#1}{#2}{#3}}
+
+
+% **********************************************
+% *** QUADRATIC ARC (Draws a quadratic arc) ***
+% **********************************************
+
+% ** Internal command
+% ** \!qjoin (XCOORD1,YCOORD1) (XCOORD2,YCOORD2)
+
+% ** \!qjoin (XCOORD1,YCOORD1) (XCOORD2,YCOORD2)
+% ** Draws an arc starting at the (last) point specified by the most recent
+% ** \!qjoin, or \!ljoin, or \!start and passing through (X_1,Y_1), (X_2,Y_2).
+% ** Uses quadratic interpolation in both x and y:
+% ** x(t), 0 <= t <= 1, interpolates x_0, x_1, x_2 at t=0, .5, 1
+% ** y(t), 0 <= t <= 1, interpolates y_0, y_1, y_2 at t=0, .5, 1
+
+\def\!qjoin (#1,#2) (#3,#4){%
+ \advance\!intervalno by 1
+ \!ifcoordmode
+ \edef\!xmidpt{#1}\edef\!ymidpt{#2}%
+ \else
+ \!dimenA=#1\relax \edef\!xmidpt{\the\!dimenA}%
+ \!dimenA=#2\relax \edef\!xmidpt{\the\!dimenA}%
+ \fi
+ \!xM=\!M{#1}\!xunit \!yM=\!M{#2}\!yunit \!rotateaboutpivot\!xM\!yM
+ \!xE=\!M{#3}\!xunit \!yE=\!M{#4}\!yunit \!rotateaboutpivot\!xE\!yE
+%
+% ** Find coefficients for x(t)=a_x + b_x*t + c_x*t**2
+ \!dimenA=\!xM \advance \!dimenA by -\!xS% ** dimA = I = xM - xS
+ \!dimenB=\!xE \advance \!dimenB by -\!xM% ** dimB = II = xE-xM
+ \!xB=3\!dimenA \advance \!xB by -\!dimenB% ** b=3I-II
+ \!xC=2\!dimenB \advance \!xC by -2\!dimenA% ** c=2(II-I)
+%
+% ** Find coefficients for y(t)=y_x + b_y*t + c_y*t**2
+ \!dimenA=\!yM \advance \!dimenA by -\!yS%
+ \!dimenB=\!yE \advance \!dimenB by -\!yM%
+ \!yB=3\!dimenA \advance \!yB by -\!dimenB%
+ \!yC=2\!dimenB \advance \!yC by -2\!dimenA%
+%
+% ** Use Simpson's rule to calculate arc length over [0,1/2]:
+% ** arc length = 1/2[1/6 f(0) + 4/6 f(1/4) + 1/6 f(1/2)]
+% ** with f(t) = sqrt(x'(t)**2 + y'(t)**2).
+ \!xprime=\!xB \!yprime=\!yB% ** x'(t) = b + 2ct
+ \!dxprime=.5\!xC \!dyprime=.5\!yC% ** dt=1/4 ==> dx'(t) = c/2
+ \!getf \!midarclength=\!dimenA
+ \!getf \advance \!midarclength by 4\!dimenA
+ \!getf \advance \!midarclength by \!dimenA
+ \divide \!midarclength by 12
+%
+% ** Get arc length over [0,1].
+ \!arclength=\!dimenA
+ \!getf \advance \!arclength by 4\!dimenA
+ \!getf \advance \!arclength by \!dimenA
+ \divide \!arclength by 12% ** Now have arc length over [1/2,1]
+ \advance \!arclength by \!midarclength
+ \global\advance \totalarclength by \!arclength
+%
+%
+% ** Check to see if there's anything to plot in this interval
+ \ifdim\!distacross>\!arclength
+ \advance \!distacross by -\!arclength% ** nothing
+%
+ \else
+ \!initinverseinterp% ** initialize for inverse interpolation on arc length
+ \loop\ifdim\!distacross<\!arclength% ** loop over points on arc
+ \!inverseinterp% ** find t such that arc length[0,t] = distacross,
+% ** using inverse quadratic interpolation
+% ** now evaluate x(t)=(c*t + b)*t + a
+ \!xpos=\!t\!xC \advance\!xpos by \!xB
+ \!xpos=\!t\!xpos \advance \!xpos by \!xS
+% ** evaluate y(t)
+ \!ypos=\!t\!yC \advance\!ypos by \!yB
+ \!ypos=\!t\!ypos \advance \!ypos by \!yS
+ \!plotifinbounds% ** plot point if in bounds
+ \advance\!distacross \plotsymbolspacing%** advance arc length for next pt
+ \!advancedashing% ** see "linear"
+ \repeat
+%
+ \advance \!distacross by -\!arclength% ** prepare for next interval
+ \fi
+%
+ \!xS=\!xE% ** shift ending points to starting points
+ \!yS=\!yE
+ \ignorespaces}
+
+
+% ** \!getf -- Calculates sqrt(x'(t)**2 + y'(t)**2) and advances
+% ** x'(t) and y'(t)
+\def\!getf{\!Pythag\!xprime\!yprime\!dimenA%
+ \advance\!xprime by \!dxprime
+ \advance\!yprime by \!dyprime}
+
+
+% ** \!initinverseinterp -- initializes for inverse quadratic interpolation
+% ** of arc length provided 1/3 < midarclength/arclength < 2/3; otherwise
+% ** initializes for inverse linear interpolation.
+\def\!initinverseinterp{%
+ \ifdim\!arclength>\!zpt
+ \!divide{8\!midarclength}\!arclength\!dimenE% ** dimE=8w=8r/s, where r
+% ** = midarclength, s=arclength
+% ** Test for w out of range: w<1/3 or w>2/3
+ \ifdim\!dimenE<\!wmin \!setinverselinear
+ \else
+ \ifdim\!dimenE>\!wmax \!setinverselinear
+ \else% ** w in range: initialize
+ \def\!inverseinterp{\!inversequad}\ignorespaces
+%
+% ** Calculate the coefficients \!beta and \!gamma of the quadratic
+% ** t = \!beta*v + \!gamma*v**2
+% ** taking the values t=0, 1/2, 1 at v=0, w==r/s, 1 respectively:
+% ** \!beta = (1/2 - w**2)/[w(1-w)]
+% ** \!gamma = 1 - beta.
+%
+ \!removept\!dimenE\!Ew% ** 8w, without "pt"
+ \!dimenF=-\!Ew\!dimenE% ** -(8w)**2
+ \advance\!dimenF by 32pt% ** 32 - (8w)**2
+ \!dimenG=8pt
+ \advance\!dimenG by -\!dimenE% ** 8 - 8w
+ \!dimenG=\!Ew\!dimenG% ** (8w)*(8-8w)
+ \!divide\!dimenF\!dimenG\!beta% ** beta = (32-(8w)**2)/(8w(8-8w))
+% ** = (1/2 - w**2)/(w(1-w))
+ \!gamma=1pt
+ \advance \!gamma by -\!beta% ** gamma = 1-beta
+ \fi% ** end of the \ifdim\!dimenE>\!wmax
+ \fi% ** end of the \ifdim\!dimenE<\!wmin
+ \fi% ** end of the \ifdim\!arclength>\!zpt
+ \ignorespaces}
+
+
+% ** For 0 <= t <= 1, let AL(t) = arclength[0,t]/arclength[0,1]; note
+% ** AL(0)=0, AL(1/2)=midarclength/arclength, AL(1)=1. This routine
+% ** calculates an approximation to AL^{-1}(distance across/arclength),
+% ** using the assumption that AL^{-1} is quadratic. Specifically,
+% ** it finds t such that
+% ** AL^{-1}(v) =. t = v*(\!beta + \!gamma*v)
+% ** where \!beta and \!gamma are set by \!initinv, and where
+% ** v=distance across/arclength
+\def\!inversequad{%
+ \!divide\!distacross\!arclength\!dimenG% ** dimG = v = distacross/arclength
+ \!removept\!dimenG\!v% ** v, without "pt"
+ \!dimenG=\!v\!gamma% ** gamma*v
+ \advance\!dimenG by \!beta% ** beta + gamma*v
+ \!dimenG=\!v\!dimenG% ** t = v*(beta + gamma*v)
+ \!removept\!dimenG\!t}% ** t, without "pt"
+
+
+% ** When w <= 1/3 or w >= 2/3, the following routine writes (using
+% ** plain TEK's \wlog command) a warning message on the user's log file,
+% ** and initializes for inverse linear interpolation on arc length.
+\def\!setinverselinear{%
+ \def\!inverseinterp{\!inverselinear}%
+ \divide\!dimenE by 8 \!removept\!dimenE\!t
+ \!countC=\!intervalno \multiply \!countC 2
+ \!countB=\!countC \advance \!countB -1
+ \!countA=\!countB \advance \!countA -1
+ \wlog{\the\!countB th point (\!xmidpt,\!ymidpt) being plotted
+ doesn't lie in the}%
+ \wlog{ middle third of the arc between the \the\!countA th
+ and \the\!countC th points:}%
+ \wlog{ [arc length \the\!countA\space to \the\!countB]/[arc length
+ \the \!countA\space to \the\!countC]=\!t.}%
+ \ignorespaces}
+
+% ** Inverse linear interpolation
+\def\!inverselinear{%
+ \!divide\!distacross\!arclength\!dimenG
+ \!removept\!dimenG\!t}
+
+
+% **************************************
+% ** ROTATIONS (Handles rotations) ***
+% **************************************
+
+% ** User commands
+% ** \startrotation [by COS_OF_ANGLE SIN_OF_ANGLE] [about XPIVOT YPIVOT]
+% ** \stoprotation
+
+% ** \startrotation [by COS_OF_ANGLE SIN_OF_ANGLE] [about XPIVOT YPIVOT]
+% ** Future (XCOORD,YCOORD)'s will be rotated about (XPIVOT,YPIVOT)
+% ** by the angle with the give COS and SIN. Both fields are optional.
+% ** [COS,SIN] defaults to previous value, or (1,0).
+% ** (XPIVOT,YPIVOT) defaults to previous value, or (0,0)
+% ** You can't change the coordinate system in the scope of a rotation.
+% ** See Subsection 9.1 of the manual.
+\def\startrotation{%
+ \let\!rotateaboutpivot=\!!rotateaboutpivot
+ \let\!rotateonly=\!!rotateonly
+ \!ifnextchar{b}{\!getsincos }%
+ {\!getsincos by {\!cosrotationangle} {\!sinrotationangle} }}
+\def\!getsincos by #1 #2 {%
+ \edef\!cosrotationangle{#1}%
+ \edef\!sinrotationangle{#2}%
+ \!ifcoordmode
+ \let\!ROnext=\!ccheckforpivot
+ \else
+ \let\!ROnext=\!dcheckforpivot
+ \fi
+ \!ROnext}
+\def\!ccheckforpivot{%
+ \!ifnextchar{a}{\!cgetpivot}%
+ {\!cgetpivot about {\!xpivotcoord} {\!ypivotcoord} }}
+\def\!cgetpivot about #1 #2 {%
+ \edef\!xpivotcoord{#1}%
+ \edef\!ypivotcoord{#2}%
+ \!xpivot=#1\!xunit \!ypivot=#2\!yunit
+ \ignorespaces}
+\def\!dcheckforpivot{%
+ \!ifnextchar{a}{\!dgetpivot}{\ignorespaces}}
+\def\!dgetpivot about #1 #2 {%
+ \!xpivot=#1\relax \!ypivot=#2\relax
+ \ignorespaces}
+
+
+% ** Following terminates rotation.
+% ** See Subsection 9.1 of the manual.
+\def\stoprotation{%
+ \let\!rotateaboutpivot=\!!!rotateaboutpivot
+ \let\!rotateonly=\!!!rotateonly
+ \ignorespaces}
+
+% ** !!rotateaboutpivot{XREG}{YREG}
+% ** XREG <-- xpvt + cos(angle)*(XREG-xpvt) - sin(angle)*(YREG-ypvt)
+% ** YREG <-- ypvt + cos(angle)*(YREG-ypvt) + sin(angle)*(XREG-xpvt)
+% ** XREG,YREG are dimension registers. Can't be \!dimenA to \!dimenD
+\def\!!rotateaboutpivot#1#2{%
+ \!dimenA=#1\relax \advance\!dimenA -\!xpivot
+ \!dimenB=#2\relax \advance\!dimenB -\!ypivot
+ \!dimenC=\!cosrotationangle\!dimenA
+ \advance \!dimenC -\!sinrotationangle\!dimenB
+ \!dimenD=\!cosrotationangle\!dimenB
+ \advance \!dimenD \!sinrotationangle\!dimenA
+ \advance\!dimenC \!xpivot \advance\!dimenD \!ypivot
+ #1=\!dimenC #2=\!dimenD
+ \ignorespaces}
+
+% ** \!!rotateonly{XREG}{YREG}
+% ** Like \!!rotateaboutpivot, but with a pivot of (0,0)
+\def\!!rotateonly#1#2{%
+ \!dimenA=#1\relax \!dimenB=#2\relax
+ \!dimenC=\!cosrotationangle\!dimenA
+ \advance \!dimenC -\!rotsign\!sinrotationangle\!dimenB
+ \!dimenD=\!cosrotationangle\!dimenB
+ \advance \!dimenD \!rotsign\!sinrotationangle\!dimenA
+ #1=\!dimenC #2=\!dimenD
+ \ignorespaces}
+\def\!rotsign{}
+\def\!!!rotateaboutpivot#1#2{\relax}
+\def\!!!rotateonly#1#2{\relax}
+\stoprotation
+
+\def\!reverserotateonly#1#2{%
+ \def\!rotsign{-}%
+ \!rotateonly{#1}{#2}%
+ \def\!rotsign{}%
+ \ignorespaces}
+
+
+% **********************************
+% *** SHADING (Handles shading) ***
+% **********************************
+
+% ** User commands
+% ** \setshadegrid [span <SPAN>] [point at XSHADE YSHADE]
+% ** \setshadesymbol [<LS, RS, BS, TS>] ({SHADESYMBOL}
+% ** <XDIMEN,YDIMEN> [ORIENTATION])
+
+% ** Internal commands:
+% ** \!startvshade (xS,ybS,ytS)
+% ** \!starthshade (yS,xlS,xrS)
+% ** \!lshade [<LS,RS,BS,TS>]
+% ** ** when shading vertically:
+% ** [the region from (xS,ybS,ytS) to] (xE,ybE,ytE)
+% ** ** when shading horizontally:
+% ** [the region from (yS,xlS,xrS) to] (yE,xlE,xrE)
+% ** \!qshade [<LS,RS,BS,TS>]
+% ** ** when shading vertically:
+% ** [the region from (xS,ybS,ytS) to] (xM,ybM,ytM) (xE,ybE,ytE)
+% ** ** when shading horizontally:
+% ** [the region from (yS,xlS,xrS) to] (yM,xlM,xrM) (yE,xlE,xrE)
+% ** \!lattice{ANCHOR}{SPAN}{LOCATION}{INDEX}{LATTICE LOCATION}
+% ** \!override{NOMINAL DIMEN}{REPLACEMENT DIMEN}{DIMEN}
+
+
+% ** The shading routine can operate either in a "vertical mode" or a
+% ** "horizontal mode". In vertical mode, the region to be shaded is specified
+% ** in the form
+% ** {(x,y): xl <= x <= xr & yb(x) <= y <= yt(x)}
+% ** where yb and yt are functions of x. In horizontal mode, the region
+% ** is specified in the form
+% ** {(x,y): yb <= y <= yt & xl(y) <= x <= xr(y)}.
+% ** The functions yb and yt may be either both linear or both quadratic;
+% ** similarly for xl and xr. A region with say, piecewise quadratic bottom
+% ** and top boundaries, can be shaded by consecutive (vertical) \!qshades,
+% ** proceeding from left to right. Similarly, a region with piecewise
+% ** quadratic left and right boundaries can be shaded by consecutive
+% ** (horizontal) \!qshades, proceeding from bottom to top. More complex
+% ** regions can be shaded by partitioning them into appropriate subregions,
+% ** and shading those.
+
+% ** Shading is accomplished by placing a user-selected shading symbol at
+% ** those points of a regular grid which fall within the region to be
+% ** shaded. This region can be "shrunk" so that a largish shading symbol
+% ** will not extend outside it. Shrinking is accomplished by specifying
+% ** shrinkages for the left, right, bottom, and top boundaries, in a manner
+% ** discussed further below.
+
+% ** \shades and \!joins MUST NOT be intermingled. Finish drawing a curve
+% ** before starting to shade a region, and finish shading a region before
+% ** starting to draw a curve.
+
+
+% ** \setshadegrid [span <SPAN>] [point at XSHADE YSHADE]
+% ** The shading symbol is placed down on the points of a grid centered
+% ** at the coordinate point (XSHADE,YSHADE). The grid points are of the
+% ** form (j*SPAN,k*SPAN), with j+k even. SPAN is specified
+% ** as a dimension.
+% ** (XSHADE,YSHADE) defaults to previous (XSHADE,YSHADE) (or (0,0) if none)
+% ** SPAN defaults to previous span (or 5pt if none)
+% ** See Subsection 7.2 of the manual.
+\def\setshadegrid{%
+ \!ifnextchar{s}{\!getspan }
+ {\!getspan span <\!dshade>}}
+\def\!getspan span <#1>{%
+ \!dshade=#1\relax
+ \!ifcoordmode
+ \let\!GRnext=\!GRccheckforAP
+ \else
+ \let\!GRnext=\!GRdcheckforAP
+ \fi
+ \!GRnext}
+\def\!GRccheckforAP{%
+ \!ifnextchar{p}{\!cgetanchor }
+ {\!cgetanchor point at {\!xshadesave} {\!yshadesave} }}
+\def\!cgetanchor point at #1 #2 {%
+ \edef\!xshadesave{#1}\edef\!yshadesave{#2}%
+ \!xshade=\!xshadesave\!xunit \!yshade=\!yshadesave\!yunit
+ \ignorespaces}
+\def\!GRdcheckforAP{%
+ \!ifnextchar{p}{\!dgetanchor}%
+ {\ignorespaces}}
+\def\!dgetanchor point at #1 #2 {%
+ \!xshade=#1\relax \!yshade=#2\relax
+ \ignorespaces}
+
+% ** \setshadesymbol [<LS, RS, BS, TS>] ({SHADESYMBOL}
+% ** <XDIMEN,YDIMEN> [ORIENTATION])
+% ** Saves SHADESYMBOL away in an hbox for use with shading routines.
+% ** A shade symbol will not be plotted if its plot position comes within
+% ** distance LS of the left boundary, RS of the right boundary, TS of the
+% ** top boundary, BS of the bottom boundary. These parameters have
+% ** default values that should work in most cases (see below).
+% ** To override a default value, specify the replacement value
+% ** in the appropriate subfield of the shrinkages field.
+% ** 0pt may be coded as "z" (without the quotes). To accept a
+% ** default value, leave the field empty. Thus
+% ** [,z,,5pt] sets LS=default, RS=0pt, BS=default, TS=5pt .
+% ** Skipping the shrinkages field accepts all the defaults.
+% ** See Subsection 7.1 of the manual.
+\def\setshadesymbol{%
+ \!ifnextchar<{\!setshadesymbol}{\!setshadesymbol<,,,> }}
+
+\def\!setshadesymbol <#1,#2,#3,#4> (#5#6){%
+% ** set the shadesymbol
+ \!setputobject{#5}{#6}%
+ \setbox\!shadesymbol=\box\!putobject%
+ \!shadesymbolxshift=\!xshift \!shadesymbolyshift=\!yshift
+%
+% ** set the shrinkages
+ \!dimenA=\!xshift \advance\!dimenA \!smidge% ** default LS = xshift - smidge
+ \!override\!dimenA{#1}\!lshrinkage%
+ \!dimenA=\!wd \advance \!dimenA -\!xshift% ** default RS = width - xshift
+ \advance\!dimenA \!smidge% - smidge
+ \!override\!dimenA{#2}\!rshrinkage
+ \!dimenA=\!dp \advance \!dimenA \!yshift% ** default BS = depth + yshift
+ \advance\!dimenA \!smidge% - smidge
+ \!override\!dimenA{#3}\!bshrinkage
+ \!dimenA=\!ht \advance \!dimenA -\!yshift% ** default TS = height - yshift
+ \advance\!dimenA \!smidge% - smidge
+ \!override\!dimenA{#4}\!tshrinkage
+ \ignorespaces}
+\def\!smidge{-.2pt}%
+
+% ** \!override{NOMINAL DIMEN}{REPLACEMENT DIMEN}{DIMEN}
+% ** Overrides the NOMINAL DIMEN by the REPLACEMENT DIMEN to produce DIMEN,
+% ** according to the following rules:
+% ** REPLACEMENT DIMEN empty: DIMEN <-- NOMINAL DIMEN
+% ** REPLACEMENT DIMEN z: DIMEN <-- 0pt
+% ** otherwise: DIMEN <-- REPLACEMENT DIMEN
+% ** DIMEN must be a dimension register
+\def\!override#1#2#3{%
+ \edef\!!override{#2}%
+ \ifx \!!override\empty
+ #3=#1\relax
+ \else
+ \if z\!!override
+ #3=\!zpt
+ \else
+ \ifx \!!override\!blankz
+ #3=\!zpt
+ \else
+ #3=#2\relax
+ \fi
+ \fi
+ \fi
+ \ignorespaces}
+\def\!blankz{ z}
+
+\setshadesymbol ({\fiverm .})% ** initialize plotsymbol
+% ** \fivesy ^^B is a small cross
+
+
+% ** \!startvshade [at] (xS,ybS,ytS)
+% ** Initiates vertical shading mode
+\def\!startvshade#1(#2,#3,#4){%
+ \let\!!xunit=\!xunit%
+ \let\!!yunit=\!yunit%
+ \let\!!xshade=\!xshade%
+ \let\!!yshade=\!yshade%
+ \def\!getshrinkages{\!vgetshrinkages}%
+ \let\!setshadelocation=\!vsetshadelocation%
+ \!xS=\!M{#2}\!!xunit
+ \!ybS=\!M{#3}\!!yunit
+ \!ytS=\!M{#4}\!!yunit
+ \!shadexorigin=\!xorigin \advance \!shadexorigin \!shadesymbolxshift
+ \!shadeyorigin=\!yorigin \advance \!shadeyorigin \!shadesymbolyshift
+ \ignorespaces}
+
+% ** \!starthshade [at] (yS,xlS,xrS)
+% ** Initiates horizontal shading mode
+\def\!starthshade#1(#2,#3,#4){%
+ \let\!!xunit=\!yunit%
+ \let\!!yunit=\!xunit%
+ \let\!!xshade=\!yshade%
+ \let\!!yshade=\!xshade%
+ \def\!getshrinkages{\!hgetshrinkages}%
+ \let\!setshadelocation=\!hsetshadelocation%
+ \!xS=\!M{#2}\!!xunit
+ \!ybS=\!M{#3}\!!yunit
+ \!ytS=\!M{#4}\!!yunit
+ \!shadexorigin=\!xorigin \advance \!shadexorigin \!shadesymbolxshift
+ \!shadeyorigin=\!yorigin \advance \!shadeyorigin \!shadesymbolyshift
+ \ignorespaces}
+
+
+% ** \!lattice{ANCHOR}{SPAN}{LOCATION}{INDEX}{LATTICE LOCATION}
+% ** Consider the lattice with points ANCHOR + j*SPAN. This routine determines
+% ** the index k of the smallest lattice point >= LOCATION, and sets
+% ** LATTICE LOCATION = ANCHOR + k*SPAN.
+% ** INDEX is assumed to be a count register, LATTICE LOCATION a dimen reg.
+\def\!lattice#1#2#3#4#5{%
+ \!dimenA=#1% ** dimA = ANCHOR
+ \!dimenB=#2% ** dimB = SPAN (assumed > 0pt)
+ \!countB=\!dimenB% ** ctB = SPAN, as a count
+%
+% ** Determine index of smallest lattice point >= LOCATION
+ \!dimenC=#3% ** dimC = LOCATION
+ \advance\!dimenC -\!dimenA% ** now dimC = LOCATION-ANCHOR
+ \!countA=\!dimenC% ** ctA = above, as a count
+ \divide\!countA \!countB% ** now ctA = desired index, if dimC <= 0
+ \ifdim\!dimenC>\!zpt
+ \!dimenD=\!countA\!dimenB% ** (tentative k)*span
+ \ifdim\!dimenD<\!dimenC% ** if this is false, ctA = desired index
+ \advance\!countA 1 % ** if true, have to add 1
+ \fi
+ \fi
+%
+ \!dimenC=\!countA\!dimenB% ** lattice location = anchor + ctA*span
+ \advance\!dimenC \!dimenA
+ #4=\!countA% ** the desired index
+ #5=\!dimenC% ** corresponding lattice location
+ \ignorespaces}
+
+
+% ** \!qshade [with shrinkages] [[LS,RS,BS,TS]]
+% ***** during vertical shading:
+% ** [the region from (xS,ybS,ytS) to] (xM,ybM,ytM) [and] (xE,ybE,ytE)
+% ** Shades the region {(x,y): xS <= x <= xE, yb(x) <= y <= yt(x)}, where
+% ** yb is the quadratic thru (xS,ybS) & (xM,ybM) & (xE,ybE)
+% ** yt is the quadratic thru (xS,ytS) & (xM,ybM) & (xE,ytE)
+% ** xS,ybS,ytS are either given by \!startvshade or carried over
+% ** as the ending values of the immediately preceding \!qshade.
+% ** For the interpretation of LS, RS, BS, & TS, see \setshadesymbol. The
+% ** values set there can be overridden, for the course of this \!qshade
+% ** only, in the same manner as overrides are specified for
+% ** \setshadesymbol.
+% ***** during horizontal shading:
+% ** [the region from (yS,xlS,xrS) to] (yM,xlM,xrM) [and] (yE,xlE,xrE)
+\def\!qshade#1(#2,#3,#4)#5(#6,#7,#8){%
+ \!xM=\!M{#2}\!!xunit
+ \!ybM=\!M{#3}\!!yunit
+ \!ytM=\!M{#4}\!!yunit
+ \!xE=\!M{#6}\!!xunit
+ \!ybE=\!M{#7}\!!yunit
+ \!ytE=\!M{#8}\!!yunit
+ \!getcoeffs\!xS\!ybS\!xM\!ybM\!xE\!ybE\!ybB\!ybC%**Get coefficients B & C for
+ \!getcoeffs\!xS\!ytS\!xM\!ytM\!xE\!ytE\!ytB\!ytC%**y=y0 + B(x-X0) + C(x-X0)**2
+ \def\!getylimits{\!qgetylimits}%
+ \!shade{#1}\ignorespaces}
+
+% ** \!lshade ... (xE,ybE,ytE)
+% ** This is like \!qshade, but the top and bottom boundaries are linear,
+% ** rather than quadratic.
+\def\!lshade#1(#2,#3,#4){%
+ \!xE=\!M{#2}\!!xunit
+ \!ybE=\!M{#3}\!!yunit
+ \!ytE=\!M{#4}\!!yunit
+ \!dimenE=\!xE \advance \!dimenE -\!xS% ** xE-xS
+ \!dimenC=\!ytE \advance \!dimenC -\!ytS% ** ytE-ytS
+ \!divide\!dimenC\!dimenE\!ytB% ** ytB = (ytE-ytS)/(xE-xS)
+ \!dimenC=\!ybE \advance \!dimenC -\!ybS% ** ybE-ybS
+ \!divide\!dimenC\!dimenE\!ybB% ** ybB = (ybE-ybS)/(xE-xS)
+ \def\!getylimits{\!lgetylimits}%
+ \!shade{#1}\ignorespaces}
+
+% ** \!getcoeffs{X0}{Y0}{X1}{Y1}{X2}{Y2}{B}{C}
+% ** Finds B and C such that the quadratic y = Y0 + B(x-X0) + C(x-X0)**2
+% ** passes through (X1,Y1) and (X2,Y2): when X0=0=Y0, the formulas are:
+% ** B = S1 - X1*C, C = (S2-S1)/X2
+% ** with
+% ** S1 = Y1/X1, S2 = (Y2-Y1)/(X2-X1).
+\def\!getcoeffs#1#2#3#4#5#6#7#8{%
+ \!dimenC=#4\advance \!dimenC -#2% ** dimC=Y1-Y0
+ \!dimenE=#3\advance \!dimenE -#1% ** dimE=X1-X0
+ \!divide\!dimenC\!dimenE\!dimenF% ** dimF=S1
+ \!dimenC=#6\advance \!dimenC -#4% ** dimC=Y2-Y1
+ \!dimenH=#5\advance \!dimenH -#3% ** dimH=X2-X1
+ \!divide\!dimenC\!dimenH\!dimenG% ** dimG=S2
+ \advance\!dimenG -\!dimenF% ** dimG=S2-S1
+ \advance \!dimenH \!dimenE% ** dimH=X2-X0
+ \!divide\!dimenG\!dimenH#8% ** C=(S2-S1)/(X2-X0)
+ \!removept#8\!t% ** C, without "pt"
+ #7=-\!t\!dimenE% ** -C*(X1-X0)
+ \advance #7\!dimenF% ** B=S1-C*(X1-X0)
+ \ignorespaces}
+
+
+\def\!shade#1{%
+% ** Get LS,RS,BS,TS for this panel
+ \!getshrinkages#1<,,,>\!nil% % ** now effective LS=dimE, RS=dimF,
+% ** BS=dimG, TS=dimH
+ \advance \!dimenE \!xS% ** now dimE=xS+LS
+ \!lattice\!!xshade\!dshade\!dimenE% ** set parity=index of left-mst x-lattice
+ \!parity\!xpos% ** point >= xS+LS, xpos=its location
+ \!dimenF=-\!dimenF% ** set dimF=xE-RS
+ \advance\!dimenF \!xE
+%
+ \!loop\!not{\ifdim\!xpos>\!dimenF}% ** loop over x-lattice points <= xE-RS
+ \!shadecolumn%
+ \advance\!xpos \!dshade% ** move over to next column
+ \advance\!parity 1% ** increase index of x-point
+ \repeat
+%
+ \!xS=\!xE% ** shift ending values to starting values
+ \!ybS=\!ybE
+ \!ytS=\!ytE
+ \ignorespaces}
+
+
+\def\!vgetshrinkages#1<#2,#3,#4,#5>#6\!nil{%
+ \!override\!lshrinkage{#2}\!dimenE
+ \!override\!rshrinkage{#3}\!dimenF
+ \!override\!bshrinkage{#4}\!dimenG
+ \!override\!tshrinkage{#5}\!dimenH
+ \ignorespaces}
+\def\!hgetshrinkages#1<#2,#3,#4,#5>#6\!nil{%
+ \!override\!lshrinkage{#2}\!dimenG
+ \!override\!rshrinkage{#3}\!dimenH
+ \!override\!bshrinkage{#4}\!dimenE
+ \!override\!tshrinkage{#5}\!dimenF
+ \ignorespaces}
+
+
+\def\!shadecolumn{%
+ \!dxpos=\!xpos
+ \advance\!dxpos -\!xS% ** dx = x - xS
+ \!removept\!dxpos\!dx% ** ditto, without "pt"
+ \!getylimits% ** get top and bottom y-values
+ \advance\!ytpos -\!dimenH% ** less TS
+ \advance\!ybpos \!dimenG% ** plus BS
+ \!yloc=\!!yshade% ** get anchor point for this column
+ \ifodd\!parity
+ \advance\!yloc \!dshade
+ \fi
+ \!lattice\!yloc{2\!dshade}\!ybpos%
+ \!countA\!ypos% ** ypos=smallest y point for this column
+ \!dimenA=-\!shadexorigin \advance \!dimenA \!xpos% ** over
+ \loop\!not{\ifdim\!ypos>\!ytpos}% ** loop over ypos <= yt(t)
+ \!setshadelocation% ** vmode: xloc=xpos, yloc=ypos
+% ** hmode: xloc=ypos, yloc=xpos
+ \!rotateaboutpivot\!xloc\!yloc%
+ \!dimenA=-\!shadexorigin \advance \!dimenA \!xloc% ** over
+ \!dimenB=-\!shadeyorigin \advance \!dimenB \!yloc% ** up
+ \kern\!dimenA \raise\!dimenB\copy\!shadesymbol \kern-\!dimenA
+ \advance\!ypos 2\!dshade
+ \repeat
+ \ignorespaces}
+
+\def\!qgetylimits{%
+ \!dimenA=\!dx\!ytC
+ \advance\!dimenA \!ytB% ** yt(t)=ytS + dx*(Bt + dx*Ct)
+ \!ytpos=\!dx\!dimenA
+ \advance\!ytpos \!ytS
+ \!dimenA=\!dx\!ybC
+ \advance\!dimenA \!ybB% ** yb(t)=ybS + dx*(Bb + dx*Cb)
+ \!ybpos=\!dx\!dimenA
+ \advance\!ybpos \!ybS}
+
+\def\!lgetylimits{%
+ \!ytpos=\!dx\!ytB% ** yt(t)=ytS + dx*Bt
+ \advance\!ytpos \!ytS
+ \!ybpos=\!dx\!ybB% ** yb(t)=ybS + dx*Bb
+ \advance\!ybpos \!ybS}
+
+\def\!vsetshadelocation{% ** vmode: xloc=xpos, yloc=ypos
+ \!xloc=\!xpos
+ \!yloc=\!ypos}
+\def\!hsetshadelocation{% ** hmode: xloc=ypos, yloc=xpos
+ \!xloc=\!ypos
+ \!yloc=\!xpos}
+
+
+% **************************************
+% *** TICKS (Draws ticks on graphs) ***
+% **************************************
+
+% ** User commands
+% ** \ticksout
+% ** \ticksin
+% ** \gridlines
+% ** \nogridlines
+% ** \loggedticks
+% ** \unloggesticks
+% ** See Subsection 3.4 of the manual
+
+% ** The following is an option of the \axis command
+% ** ticks
+% ** [in] [out]
+% ** [long] [short] [length <LENGTH>]
+% ** [width <WIDTH>]
+% ** [andacross] [butnotacross]
+% ** [logged] [unlogged]
+% ** [unlabeled] [numbered] [withvalues VALUE1 VALUE2 ... VALUEk / ]
+% ** [quantity Q] [at LOC1 LOC2 ... LOCk / ] [from LOC1 to LOC2 by
+% ** LOC_INCREMENT]
+% ** See Subsection 3.2 of the manual for the rules.
+
+% ** The various options of the tick field are processed by the
+% ** \!nextkeyword command defined below.
+% ** For example, `\!nextkeyword short ' expands to `\!ticksshort',
+% ** while `\!nextkeyword withvalues' expands to `\!tickswithvalues'.
+
+\def\!axisticks {%
+ \def\!nextkeyword##1 {%
+ \expandafter\ifx\csname !ticks##1\endcsname \relax
+ \def\!next{\!fixkeyword{##1}}%
+ \else
+ \def\!next{\csname !ticks##1\endcsname}%
+ \fi
+ \!next}%
+ \!axissetup
+ \def\!axissetup{\relax}%
+ \edef\!ticksinoutsign{\!ticksinoutSign}%
+ \!ticklength=\longticklength
+ \!tickwidth=\linethickness
+ \!gridlinestatus
+ \!setticktransform
+ \!maketick
+ \!tickcase=0
+ \def\!LTlist{}%
+ \!nextkeyword}
+
+\def\ticksout{%
+ \def\!ticksinoutSign{+}}
+\def\ticksin{%
+ \def\!ticksinoutSign{-}}
+\ticksout
+
+\def\gridlines{%
+ \def\!gridlinestatus{\!gridlinestootrue}}
+\def\nogridlines{%
+ \def\!gridlinestatus{\!gridlinestoofalse}}
+\nogridlines
+
+\def\loggedticks{%
+ \def\!setticktransform{\let\!ticktransform=\!logten}}
+\def\unloggedticks{%
+ \def\!setticktransform{\let\!ticktransform=\!donothing}}
+\def\!donothing#1#2{\def#2{#1}}
+\unloggedticks
+
+% ** \!ticks/ : terminates read of tick options
+\expandafter\def\csname !ticks/\endcsname{%
+ \!not {\ifx \!LTlist\empty}
+ \!placetickvalues
+ \fi
+ \def\!tickvalueslist{}%
+ \def\!LTlist{}%
+ \expandafter\csname !axis/\endcsname}
+
+\def\!maketick{%
+ \setbox\!boxA=\hbox{%
+ \beginpicture
+ \!setdimenmode
+ \setcoordinatesystem point at {\!zpt} {\!zpt}
+ \linethickness=\!tickwidth
+ \ifdim\!ticklength>\!zpt
+ \putrule from {\!zpt} {\!zpt} to
+ {\!ticksinoutsign\!tickxsign\!ticklength}
+ {\!ticksinoutsign\!tickysign\!ticklength}
+ \fi
+ \if!gridlinestoo
+ \putrule from {\!zpt} {\!zpt} to
+ {-\!tickxsign\!xaxislength} {-\!tickysign\!yaxislength}
+ \fi
+ \endpicturesave <\!Xsave,\!Ysave>}%
+ \wd\!boxA=\!zpt}
+
+\def\!ticksin{%
+ \def\!ticksinoutsign{-}%
+ \!maketick
+ \!nextkeyword}
+
+\def\!ticksout{%
+ \def\!ticksinoutsign{+}%
+ \!maketick
+ \!nextkeyword}
+
+\def\!tickslength<#1> {%
+ \!ticklength=#1\relax
+ \!maketick
+ \!nextkeyword}
+
+\def\!tickslong{%
+ \!tickslength<\longticklength> }
+
+\def\!ticksshort{%
+ \!tickslength<\shortticklength> }
+
+\def\!tickswidth<#1> {%
+ \!tickwidth=#1\relax
+ \!maketick
+ \!nextkeyword}
+
+\def\!ticksandacross{%
+ \!gridlinestootrue
+ \!maketick
+ \!nextkeyword}
+
+\def\!ticksbutnotacross{%
+ \!gridlinestoofalse
+ \!maketick
+ \!nextkeyword}
+
+\def\!tickslogged{%
+ \let\!ticktransform=\!logten
+ \!nextkeyword}
+
+\def\!ticksunlogged{%
+ \let\!ticktransform=\!donothing
+ \!nextkeyword}
+
+\def\!ticksunlabeled{%
+ \!tickcase=0
+ \!nextkeyword}
+
+\def\!ticksnumbered{%
+ \!tickcase=1
+ \!nextkeyword}
+
+\def\!tickswithvalues#1/ {%
+ \edef\!tickvalueslist{#1! /}%
+ \!tickcase=2
+ \!nextkeyword}
+
+\def\!ticksquantity#1 {%
+ \ifnum #1>1
+ \!updatetickoffset
+ \!countA=#1\relax
+ \advance \!countA -1
+ \!ticklocationincr=\!axisLength
+ \divide \!ticklocationincr \!countA
+ \!ticklocation=\!axisstart
+ \loop \!not{\ifdim \!ticklocation>\!axisend}
+ \!placetick\!ticklocation
+ \ifcase\!tickcase
+ \relax % Case 0: no labels
+ \or
+ \relax % Case 1: numbered -- not available here
+ \or
+ \expandafter\!gettickvaluefrom\!tickvalueslist
+ \edef\!tickfield{{\the\!ticklocation}{\!value}}%
+ \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
+ \fi
+ \advance \!ticklocation \!ticklocationincr
+ \repeat
+ \fi
+ \!nextkeyword}
+
+\def\!ticksat#1 {%
+ \!updatetickoffset
+ \edef\!Loc{#1}%
+ \if /\!Loc
+ \def\next{\!nextkeyword}%
+ \else
+ \!ticksincommon
+ \def\next{\!ticksat}%
+ \fi
+ \next}
+
+\def\!ticksfrom#1 to #2 by #3 {%
+ \!updatetickoffset
+ \edef\!arg{#3}%
+ \expandafter\!separate\!arg\!nil
+ \!scalefactor=1
+ \expandafter\!countfigures\!arg/
+ \edef\!arg{#1}%
+ \!scaleup\!arg by\!scalefactor to\!countE
+ \edef\!arg{#2}%
+ \!scaleup\!arg by\!scalefactor to\!countF
+ \edef\!arg{#3}%
+ \!scaleup\!arg by\!scalefactor to\!countG
+ \loop \!not{\ifnum\!countE>\!countF}
+ \ifnum\!scalefactor=1
+ \edef\!Loc{\the\!countE}%
+ \else
+ \!scaledown\!countE by\!scalefactor to\!Loc
+ \fi
+ \!ticksincommon
+ \advance \!countE \!countG
+ \repeat
+ \!nextkeyword}
+
+\def\!updatetickoffset{%
+ \!dimenA=\!ticksinoutsign\!ticklength
+ \ifdim \!dimenA>\!offset
+ \!offset=\!dimenA
+ \fi}
+
+\def\!placetick#1{%
+ \if!xswitch
+ \!xpos=#1\relax
+ \!ypos=\!axisylevel
+ \else
+ \!xpos=\!axisxlevel
+ \!ypos=#1\relax
+ \fi
+ \advance\!xpos \!Xsave
+ \advance\!ypos \!Ysave
+ \kern\!xpos\raise\!ypos\copy\!boxA\kern-\!xpos
+ \ignorespaces}
+
+\def\!gettickvaluefrom#1 #2 /{%
+ \edef\!value{#1}%
+ \edef\!tickvalueslist{#2 /}%
+ \ifx \!tickvalueslist\!endtickvaluelist
+ \!tickcase=0
+ \fi}
+\def\!endtickvaluelist{! /}
+
+\def\!ticksincommon{%
+ \!ticktransform\!Loc\!t
+ \!ticklocation=\!t\!!unit
+ \advance\!ticklocation -\!!origin
+ \!placetick\!ticklocation
+ \ifcase\!tickcase
+ \relax % Case 0: no labels
+ \or % Case 1: numbered
+ \ifdim\!ticklocation<-\!!origin
+ \edef\!Loc{$\!Loc$}%
+ \fi
+ \edef\!tickfield{{\the\!ticklocation}{\!Loc}}%
+ \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
+ \or % Case 2: labeled
+ \expandafter\!gettickvaluefrom\!tickvalueslist
+ \edef\!tickfield{{\the\!ticklocation}{\!value}}%
+ \expandafter\!listaddon\expandafter{\!tickfield}\!LTlist%
+ \fi}
+
+\def\!separate#1\!nil{%
+ \!ifnextchar{-}{\!!separate}{\!!!separate}#1\!nil}
+\def\!!separate-#1\!nil{%
+ \def\!sign{-}%
+ \!!!!separate#1..\!nil}
+\def\!!!separate#1\!nil{%
+ \def\!sign{+}%
+ \!!!!separate#1..\!nil}
+\def\!!!!separate#1.#2.#3\!nil{%
+ \def\!arg{#1}%
+ \ifx\!arg\!empty
+ \!countA=0
+ \else
+ \!countA=\!arg
+ \fi
+ \def\!arg{#2}%
+ \ifx\!arg\!empty
+ \!countB=0
+ \else
+ \!countB=\!arg
+ \fi}
+
+\def\!countfigures#1{%
+ \if #1/%
+ \def\!next{\ignorespaces}%
+ \else
+ \multiply\!scalefactor 10
+ \def\!next{\!countfigures}%
+ \fi
+ \!next}
+
+\def\!scaleup#1by#2to#3{%
+ \expandafter\!separate#1\!nil
+ \multiply\!countA #2\relax
+ \advance\!countA \!countB
+ \if -\!sign
+ \!countA=-\!countA
+ \fi
+ #3=\!countA
+ \ignorespaces}
+
+\def\!scaledown#1by#2to#3{%
+ \!countA=#1\relax% ** get original #
+ \ifnum \!countA<0 % ** take abs value,
+ \def\!sign{-}% ** remember sign
+ \!countA=-\!countA
+ \else
+ \def\!sign{}%
+ \fi
+ \!countB=\!countA% ** copy |#|
+ \divide\!countB #2\relax% ** integer part (|#|/sf)
+ \!countC=\!countB% ** get sf * (|#|/sf)
+ \multiply\!countC #2\relax
+ \advance \!countA -\!countC% ** ctA is now remainder
+ \edef#3{\!sign\the\!countB.}% ** +- integerpart.
+ \!countC=\!countA % ** Tack on proper number
+ \ifnum\!countC=0 % ** of zeros after .
+ \!countC=1
+ \fi
+ \multiply\!countC 10
+ \!loop \ifnum #2>\!countC
+ \edef#3{#3\!zero}%
+ \multiply\!countC 10
+ \repeat
+ \edef#3{#3\the\!countA}% ** Add on rest of remainder
+ \ignorespaces}
+
+\def\!placetickvalues{%
+ \advance\!offset \tickstovaluesleading
+ \if!xswitch
+ \setbox\!boxA=\hbox{%
+ \def\\##1##2{%
+ \!dimenput {##2} [B] (##1,\!axisylevel)}%
+ \beginpicture
+ \!LTlist
+ \endpicturesave <\!Xsave,\!Ysave>}%
+ \!dimenA=\!axisylevel
+ \advance\!dimenA -\!Ysave
+ \advance\!dimenA \!tickysign\!offset
+ \if -\!tickysign
+ \advance\!dimenA -\ht\!boxA
+ \else
+ \advance\!dimenA \dp\!boxA
+ \fi
+ \advance\!offset \ht\!boxA
+ \advance\!offset \dp\!boxA
+ \!dimenput {\box\!boxA} [Bl] <\!Xsave,\!Ysave> (\!zpt,\!dimenA)
+ \else
+ \setbox\!boxA=\hbox{%
+ \def\\##1##2{%
+ \!dimenput {##2} [r] (\!axisxlevel,##1)}%
+ \beginpicture
+ \!LTlist
+ \endpicturesave <\!Xsave,\!Ysave>}%
+ \!dimenA=\!axisxlevel
+ \advance\!dimenA -\!Xsave
+ \advance\!dimenA \!tickxsign\!offset
+ \if -\!tickxsign
+ \advance\!dimenA -\wd\!boxA
+ \fi
+ \advance\!offset \wd\!boxA
+ \!dimenput {\box\!boxA} [Bl] <\!Xsave,\!Ysave> (\!dimenA,\!zpt)
+ \fi}
+
+
+\normalgraphs
+
+% \catcode`!=12 % ***** THIS MUST NEVER BE OMITTED
+
+\protect \endinput
diff --git a/tex/context/base/thrd-ran.mkii b/tex/context/base/thrd-ran.mkii
new file mode 100644
index 000000000..276a4f624
--- /dev/null
+++ b/tex/context/base/thrd-ran.mkii
@@ -0,0 +1,168 @@
+% Since we cannot be sure that this file is available at any
+% system, we have copied the original in this file. These
+% macros are encapsulates and extended in supp-ran.tex.
+%
+% This module is slightly recoded to bring it more in tune
+% with \CONTEXT's scratch registers and protection mechanisms.
+
+% RANDOM.TEX v.1 (Donald Arseneau)
+% Generating "random" numbers in TeX.
+%
+% Random integers are generated in the range 1 to 2147483646 by the
+% macro \nextrandom. The result is returned in the counter \randomi.
+% Do not change \randomi except, perhaps, to initialize it at some
+% random value. If you do not initialize it, it will be initialized
+% using the time and date. (This is a sparse initialization, giving
+% fewer than a million different starting values, but you should use
+% other sources of numbers if they are available--just remember that
+% most of the numbers available to TeX are not at all random.)
+%
+% The \nextrandom command is not very useful by itself, unless you
+% have exactly 2147483646 things to choose from. Much more useful
+% is the \setrannum command which sets a given counter to a random
+% value within a specified range. There are three parameters:
+% \setrannum {<counter>} {<minimum>} {<maximum>}. For example, to
+% simulate a die-roll: \setrannum{\die}{1}{6} \ifcase\die... .
+%
+% If you need random numbers that are not integers, you will have to
+% use dimen registers and \setrandimen. For example, to set a random
+% page width: \setrandimen \hsize{3in}{6.5in}. The "\pointless" macro
+% will remove the "pt" that TeX gives so you can use the dimensions
+% as pure `real' numbers. In that case, specify the range in pt units.
+% For example,
+%
+% \setrandimen\answer{2.71828pt}{3.14159pt}
+% The answer is \pointless\answer.
+%
+% The random number generator is the one by Lewis, Goodman, and Miller
+% (1969) and used as "ran0" in "Numerical Recipies" using Schrage's
+% method for avoiding overflows. The multiplier is 16807 (7^5), the
+% added constant is 0, and the modulus is 2147483647 (2^{31}-1). The
+% range of integers generated is 1 - 2147483646. A smaller range would
+% reduce the complexity of the macros a bit, but not much--most of the
+% code deals with initialization and type-conversion. On the other hand,
+% the large range may be wasted due to the sparse seed initialization.
+
+% original code
+%
+% \newcount\randomi % the random number seed (while executing)
+% \global\randomi\catcode`\@ % scratch variable during definitions
+% \catcode`\@=11
+%
+% \def\nextrandom{\begingroup
+% \ifnum\randomi<\plusone % then initialize with time
+% \global\randomi\time
+% \global\multiply\randomi388 \global\advance\randomi\year
+% \global\multiply\randomi31 \global\advance\randomi\day
+% \global\multiply\randomi97 \global\advance\randomi\month
+% \message{Randomizer initialized to \the\randomi.}%
+% \nextrandom \nextrandom \nextrandom
+% \fi
+% \count@ii\randomi
+% \divide\count@ii 127773 % modulus = multiplier * 127773 + 2836
+% \count@\count@ii
+% \multiply\count@ii 127773
+% \global\advance\randomi-\count@ii % random mod 127773
+% \global\multiply\randomi 16807
+% \multiply\count@ 2836
+% \global\advance\randomi-\count@
+% \ifnum\randomi<\z@ \global\advance\randomi 2147483647\relax\fi
+% \endgroup
+% }
+%
+% \countdef\count@ii=2 % use only in boxes!
+% \ifx\@tempcnta\undefined \csname newcount\endcsname \@tempcnta \fi
+% \ifx\@tempcntb\undefined \csname newcount\endcsname \@tempcntb \fi
+%
+% \def\setrannum#1#2#3{% count register, minimum, maximum
+% \@tempcnta#3\advance\@tempcnta-#2\advance\@tempcnta\@ne
+% \@tempcntb 2147483645 % = m - 2 = 2^{31} - 3
+% \divide\@tempcntb\@tempcnta
+% \getr@nval
+% \advance\ranval#2\relax
+% #1\ranval
+% }
+%
+% \def\setrandim#1#2#3{% dimen register, minimum length, maximum length
+% \dimen@#2\dimen@ii#3\relax
+% \setrannum\ranval\dimen@\dimen@ii
+% #1\ranval sp\relax
+% }
+%
+% \def\getr@nval{% The values in \@tempcnta and \@tempcntb are parameters
+% \nextrandom
+% \ranval\randomi \advance\ranval\m@ne \divide\ranval\@tempcntb
+% \ifnum\ranval<\@tempcnta\else \expandafter\getr@nval \fi
+% }
+%
+% %D The next macro is not needed in \CONTEXT, which provides
+% %D the \type {\withoutpt} macro.
+% %D
+% %D \starttyping
+% %D \def\pointless{\expandafter\PoinTless\the}
+% %D {\catcode`p=12 \catcode`t=12 \gdef\PoinTless#1pt{#1}}
+% %D \stoptyping
+%
+% \catcode`\@=\randomi
+% \global\randomi=0
+% \newcount\ranval
+
+% the recoded version, using \CONTEXT\ methods and variables;
+% the magic is kept untouched
+
+\unprotect
+
+\newcount\randomi % the random number seed (while executing)
+\newcount\ranval
+
+\ifx\m!systems\undefined \def\m!systems{systems} \fi
+
+\def\nextrandom
+ {\begingroup
+ \ifnum\randomi<\plusone % then initialize with time
+ \global\randomi\time
+ \global\multiply\randomi388 \global\advance\randomi\year
+ \global\multiply\randomi 31 \global\advance\randomi\day
+ \global\multiply\randomi 97 \global\advance\randomi\month
+ \writestatus\m!systems{randomizer starts with \the\randomi}%
+ \nextrandom \nextrandom \nextrandom
+ \fi
+ \!!countd\randomi
+ \divide\!!countd 127773 % modulus = multiplier * 127773 + 2836
+ \!!countc\!!countd
+ \multiply\!!countd 127773
+ \global\advance\randomi-\!!countd % random mod 127773
+ \global\multiply\randomi 16807
+ \multiply\!!countc 2836
+ \global\advance\randomi-\!!countc\relax
+ \ifnum\randomi<\zerocount
+ \global\advance\randomi 2147483647
+ \fi
+ \endgroup}
+
+\def\setrannum#1#2#3% count register, minimum, maximum
+ {\!!counta#3%
+ \advance\!!counta-#2%
+ \advance\!!counta\plusone
+ \!!countb 2147483645 % = m - 2 = 2^{31} - 3
+ \divide\!!countb\!!counta
+ \getr@nval
+ \advance\ranval#2%
+ #1\ranval}
+
+\def\setrandim#1#2#3% dimen register, minimum length, maximum length
+ {\!!dimenc#2%
+ \!!dimend#3%
+ \setrannum\ranval\!!dimenc\!!dimend
+ #1\ranval\s!sp\relax} % \s!sp not needed
+
+\def\getr@nval % The values in \!!counta and \!!countb are parameters
+ {\nextrandom
+ \ranval\randomi
+ \advance\ranval\minusone
+ \divide\ranval\!!countb
+ \ifnum\ranval<\!!counta \else
+ \expandafter\getr@nval
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/thrd-tab.tex b/tex/context/base/thrd-tab.tex
new file mode 100644
index 000000000..dd3838ce2
--- /dev/null
+++ b/tex/context/base/thrd-tab.tex
@@ -0,0 +1,2006 @@
+% Since this file is not available in every distribution, we
+% have copied the original in this file. The manuals to
+% Wichura's PiCTeX and TaBlE packages are not available on
+% line and are distributed by respectively the TeX Users Group
+% and Personal TeX Inc. Many macros of TaBlE are overloaded
+% and/or extended in core-tab.tex. The extensions concern
+% splitting over pages, color and consistent spacing.
+
+% We've patched this file for catcode ! because in luatex we use
+% catcode tables and using unprotect/protect is cleaner. Late
+% 2007 we also decided no longer to treat quotes and bars the
+% TaBLe way and instead of messy pushing and popping of catcodes
+% we commented a couple of lines here. We just assume that the
+% template has no active bar and quote. Inside tables we now
+% have the regular meaning of active bars in ConTeXt. More
+% drastic extensions and patched can be found in core-tab.tex.
+
+% TABLE 1.0
+% Copyright Michael J. Wichura August 1988 (patched by Hans Hagen)
+
+% The TABLE macros are divided into sections, roughly according to
+% function:
+
+% Section Name Function
+% a Allocation Allocates storage registers for parameters.
+% f Format Reads format section; builds preamble for \halign;
+% processes \ReFormat command.
+% g Get Value Converts "spec"'s (as in spec_{LT}) to
+% corresponding "values"'s (as in value_{LT}).
+% h Hacks Utility macros; error messages; miscellaneous commands.
+% k Keys Definition and scanning of format keys.
+% n Numeric Macros for TABLE's numeric format.
+% s Struts Macros for struts.
+% t Tables Sets up \halign for table; end-of-row processing;
+% alternate vertical rules; spanning; horizontal
+% lines; stretching and shrinking; repositioning
+% commands.
+
+% The name of each internal macro begins with the prefix "\!t", the
+% "!" having category code 11, followed by the letter of the section
+% in which the macro is defined. For example, a macro beginning "\!th"
+% is defined in Section h (Hacks). There a few exceptions:
+% the general purpose macros "\!ttemp", "\!ttempa", "\!ttempb", and
+% "\!tnext" are repeatedly defined on the spot as the need arises.
+
+% External macros (and active characters) are defined in the following
+% sections:
+% Macro Section
+% " t
+% \- t
+% \= t
+% \ActivateBarAndQuote h
+% \AugmentedTableStrut s
+% \BackSpace h
+% \BeginFormat f
+% \BeginTable t
+% \BeginTableParBox a
+% \Center t
+% \ColumnWidthFactor a
+% \ColumnWidthUnit a
+% \DQuote h
+% \EndFormat k (\EndFormat is actually a key)
+% \EndTable t
+% \EndTableParBox a
+% \Enlarge s
+% \enlarge s
+% \EveryTable a
+% \EveryTableParBox a
+% \Expand t
+% \InterColumnSpaceFactor a
+% \InterColumnSpaceUnit a
+% \JustCenter t
+% \JustLeft t
+% \JustRight t
+% \KernFactor a
+% \KernUnit a
+% \Left t
+% \LeftTabskip a
+% \LineThicknessFactor a
+% \LineThicknessUnit a
+% \LongLines t
+% \Lower h
+% \MakeStrut s
+% \NewFormatKey k
+% \NormalCWU a
+% \NormalICSU a
+% \NormalKU a
+% \NormalLTU a
+% \NormalSU a
+% \NormalTableUnits a
+% \OpenUp s
+% \PseudoVrule t
+% \Raise h
+% \ReadFormatKeys k
+% \ReFormat f
+% \Right t
+% \RightTabskip a
+% \SetTableToWidth t
+% \Smash h
+% \StandardTableStrut s
+% \StrutDepthFactor a
+% \StrutHeightFactor a
+% \StrutUnit a
+% \TaBlE h
+% \TracingFormats a
+% \TracingKeys a
+% \Use t
+% \use t
+% \VBar h
+% \Vspace h
+% \VspaceFactor a
+% \WidenTableBy t
+% \\ t
+% \_ t
+% \| t
+% | t
+% ~ t
+
+\unprotect
+
+% \catcode `\!=11
+% \catcode `\@=11
+
+\newif\ifh@ % normally in plain tex
+\newif\ifv@ % normally in plain tex
+
+% Don't try to read the TABLE macros until after you've read the
+% TABLE manual. The internal documentation of the macros is
+% sketchy; you need the manual to understand what's going on.
+% You should also review the material on \halign s in the TeXbook,
+% since TABLE uses an \halign to perform its alignments.
+
+% In studying the TABLE macros, you should start by skimming the
+% macros in the "miscellaneous hacks", "error messages", and "loops"
+% subsections of Section h, as well as the "\GetValue" macro in
+% Section g; these macros are called many times by the other macros.
+% To continue with a "bottom-up" approach, read next Sections k,
+% f, and t. (Top-downers should reverse the order.) The other
+% Sections can be looked at as the need arises.
+
+% *********************************************************************
+% SECTION A: ALLOCATION
+% *********************************************************************
+
+\let\!tacr=\\ % Save meaning of \\ (Needed if TABLE is used with LaTeX
+
+% *********************************************************************
+% TABLE PARAMETERS: Units
+% *********************************************************************
+
+\newdimen\LineThicknessUnit
+\newdimen\StrutUnit
+\newskip \InterColumnSpaceUnit
+\newdimen\ColumnWidthUnit
+\newdimen\KernUnit
+
+\let\!taLTU=\LineThicknessUnit % Used in preamble
+\let\!taCWU=\ColumnWidthUnit % Used in preamble
+\let\!taKU =\KernUnit % Used in preamble
+
+\newtoks\NormalTLTU
+\newtoks\NormalTSU
+\newtoks\NormalTICSU
+\newtoks\NormalTCWU
+\newtoks\NormalTKU
+
+% NOTE: The user should modify the following DEFAULTS to suit his/her
+% taste, and output device:
+%\def\PixelsPerInch{300}
+\NormalTLTU={1in \divide \LineThicknessUnit by 300 }
+\NormalTSU ={\normalbaselineskip
+ \divide \StrutUnit by 11 } % 11 = 8+3 = NormalT Height+Depth Factors
+\NormalTICSU={.5em plus 1fil minus .25em} % .5em = width of a digit
+\NormalTCWU ={.5em}
+\NormalTKU ={.5em}
+
+\def\NormalTableUnits{%
+ \LineThicknessUnit =\the\NormalTLTU
+ \StrutUnit =\the\NormalTSU
+ \InterColumnSpaceUnit=\the\NormalTICSU
+ \ColumnWidthUnit =\the\NormalTCWU
+ \KernUnit =\the\NormalTKU}
+
+\NormalTableUnits
+
+% The user should issue \NormalTableUnits when setting a table
+% in a different point size, since the Table...Units themselves
+% are static while the Normal...Units vary with the point size.
+
+
+% *********************************************************************
+% TABLE PARAMETERS: Factors
+% *********************************************************************
+
+\newcount\LineThicknessFactor
+\newcount\StrutHeightFactor
+\newcount\StrutDepthFactor
+\newcount\InterColumnSpaceFactor
+\newcount\ColumnWidthFactor
+\newcount\KernFactor
+\newcount\VspaceFactor
+
+% DEFAULTS:
+\LineThicknessFactor =2
+\StrutHeightFactor =8
+\StrutDepthFactor =3
+\InterColumnSpaceFactor =3
+\ColumnWidthFactor =10
+\KernFactor =1
+\VspaceFactor =2
+
+
+% *********************************************************************
+% DIAGNOSTIC PARAMETERS
+% *********************************************************************
+
+\newcount\TracingKeys % >=1 reports new keys, >=2 reports key usage
+\newcount\TracingFormats % >=1 reports templates for columns
+ % >=2 reports \halign preamble
+
+
+% *********************************************************************
+% PARBLOCK PARAMETERS
+% *********************************************************************
+
+\def\BeginTableParBox#1{%
+ \vtop\bgroup
+ \hsize=#1
+ \normalbaselines
+ \let~=\!ttTie
+ \let\-=\!ttDH
+ \the\EveryTableParBox}
+
+\def\EndTableParBox{%
+ \MakeStrut{0pt}{\StrutDepthFactor\StrutUnit}
+ \egroup} % finishes the \vtop begun by \BeginTableParbox
+
+\newtoks\EveryTableParBox
+\EveryTableParBox={%
+ \parindent=0pt
+ \raggedright
+ \rightskip=0pt plus 4em % Provide more stretch
+ \relax}
+
+
+% *********************************************************************
+% EVERY TABLE TOKENS
+% *********************************************************************
+
+\newtoks\EveryTable
+\newtoks\!taTableSpread
+
+
+% *********************************************************************
+% Extreme left- and right- tabskips
+% *********************************************************************
+
+\newskip\LeftTabskip
+\newskip\RightTabskip
+
+
+% *********************************************************************
+% INTERNAL VARIABLES
+% *********************************************************************
+
+\newcount\!taCountA
+\newcount\!taColumnNumber
+\newcount\!taRecursionLevel % (Initially 0)
+
+\newdimen\!taDimenA % used by \Enlarge
+\newdimen\!taDimenB % used by \Enlarge
+\newdimen\!taDimenC % used by numeric.tex
+\newdimen\!taMinimumColumnWidth
+
+\newtoks\!taToksA
+
+\newtoks\!taPreamble
+\newtoks\!taDataColumnTemplate
+\newtoks\!taRuleColumnTemplate
+\newtoks\!taOldRuleColumnTemplate
+\newtoks\!taLeftGlue
+\newtoks\!taRightGlue
+
+\newskip\!taLastRegularTabskip
+
+\newif\if!taDigit
+\newif\if!taBeginFormat
+\newif\if!taOnceOnlyTabskip
+
+
+
+% *********************************************************************
+% SECTION H: HACKS
+% *********************************************************************
+
+% ****************************************************************
+% TABLE LOGO
+% ****************************************************************
+\def\TaBlE{%
+ T\kern-.27em\lower.5ex\hbox{A}\kern-.18em B\kern-.1em
+ \lower.5ex\hbox{L}\kern-.075em E}
+
+
+% ****************************************************************
+% ACTIVE CHARACTERS
+% ****************************************************************
+
+% ACTIVATE BAR AND QUOTE: Makes | and " active if they aren't
+% already active (in which case the user will probably have given
+% them special meanings); definitions are provided which effectively
+% undoes the activeness outside a Table.
+
+{\catcode`\|=13 \catcode`\"=13
+ \gdef\ActivateBarAndQuote{%
+ \ifnum \catcode`\|=13
+ \else
+ \catcode`\|=13
+ \def|{%
+ \ifmmode
+ \vert
+ \else
+ \char`\|
+ \fi}%
+ \fi
+ \ifnum \catcode`\"=13
+ \else
+ \catcode`\"=13
+ \def"{\char`\"}%
+ \fi}}
+
+% ****************************************************************
+% Macros for | and " having category code 12.
+% ****************************************************************
+{\catcode `\|=12 \catcode `\"=12
+\gdef\VBar{|}
+\gdef\DQuote{"}}
+
+
+% ****************************************************************
+% MISCELANEOUS HACKS
+% ****************************************************************
+
+% MESSAGE <Message>: Writes out <Message> to terminal and log file.
+\def\!thMessage#1{\immediate\write16{#1}\ignorespaces}
+
+% X: Abbreviation for expandafter
+\let\!thx=\expandafter
+
+% GOBBLE: Eats next token
+\def\!thGobble#1{}
+
+% SPACE TOKEN
+\def\\{\let\!thSpaceToken= }\\
+
+% HEIGHT, DEPTH, AND WIDTH
+\def\!thHeight{height}
+\def\!thDepth{depth}
+\def\!thWidth{width}
+
+% TOKSEDEF <token register>=<replacement text>: Places <replacement
+% text>, fully expanded a la \edef, in the specified <token register>.
+\def\!thToksEdef#1=#2{%
+ \edef\!ttemp{#2}%
+ #1\!thx{\!ttemp}%
+ \ignorespaces}
+
+
+% ****************************************************************
+% ERROR MESSAGES
+% ****************************************************************
+
+% STORE ERROR MSG <Control Sequence> <Message>
+% Replacement text of <Control Sequence> is a macro with Message
+% as its name. E.g., after \StoreErrorMsg\Help{Type <CR>},
+% \Help expands to "\Type <CR>"
+\def\!thStoreErrorMsg#1#2{%
+ \toks0 =\!thx{\csname #2\endcsname}%
+ \edef#1{\the\toks0 }}
+
+% READ ERROR MSG <Control sequence>
+% Continuing the above example, \ReadErrorMsg\Help produces "Type <CR>"
+\def\!thReadErrorMsg#1{%
+ \!thx\!thx\!thx\!thGobble\!thx\string #1}
+
+% ERROR <Error Message> <Error Help>
+\def\!thError#1#2{%
+ \begingroup
+ \newlinechar=`\^^J%
+ \edef\!ttemp{#2}%
+ \errhelp=\!thx{\!ttemp}%
+ \!thMessage{%
+ ^^J\!thReadErrorMsg\!thErrorMsgA
+ ^^J\!thReadErrorMsg\!thErrorMsgB}%
+ \errmessage{#1}%
+ \endgroup}
+
+% TEXT FOR ERROR MESSAGE
+\!thStoreErrorMsg\!thErrorMsgA{%
+ TABLE error; see manual for explanation.}
+\!thStoreErrorMsg\!thErrorMsgB{%
+ Type \space H <return> \space for immediate help.}
+
+% GET REPLACEMENT <Prompt Message> <Replacement Value>
+% <Replacement Vale> must be a control sequence
+\def\!thGetReplacement#1#2{%
+ \begingroup
+ \!thMessage{#1}
+ \endlinechar=-1
+ \global\read16 to#2%
+ \endgroup}
+
+
+% ****************************************************************
+% LOOP MACRO
+% ****************************************************************
+
+% LOOP ... REPEAT macro from TUGboat Vol 8 #2: 1987
+% Syntax is like that of plain TeX's \loop ... \repeat macro
+\def\!thLoop#1\repeat{%
+ \def\!thIterate{%
+ #1%
+ \!thx \!thIterate
+ \fi}%
+ \!thIterate
+ \let\!thIterate\relax}
+
+
+% ***************************************************************
+% VERTICALLY-CENTERED SMASH
+% ***************************************************************
+
+% SMASH: Like TeX's \smash, only the argument
+% is centered vertically before its height and depth are smashed to 0pt.
+\def\Smash{%
+ \relax
+ \ifmmode
+ \expandafter\mathpalette
+ \expandafter\!thDoMathVCS
+ \else
+ \expandafter\!thDoVCS
+ \fi}
+
+% DO VCS
+\def\!thDoVCS#1{%
+ \setbox\zerocount\hbox{#1}%
+ \!thFinishVCS}
+
+% DO MATH VCS
+\def\!thDoMathVCS#1#2{%
+ \setbox\zerocount\hbox{$\mathsurround\zeropoint#1{#2}$}%
+ \!thFinishVCS}
+
+% FINISH VCS
+\def\!thFinishVCS{%
+ \vbox to\zeropoint{\vss\box\zerocount\vss}}
+
+
+% ***************************************************************
+% RAISE AND LOWER
+% ***************************************************************
+
+% Like TeX's \raise and \lower, except: (1) The first argument
+% to these commands is a dimension expressed in TABLE's usual conventions;
+% the default is (StrutHeightFactor+StrutDepthFactor)*StrutUnit/2
+% (2) like \smash, these commands function in math mode as well
+% as horizontal mode; (3) again like \smash, the result is declared
+% to have height and depth 0pt
+
+% Examples \Raise2{Stuff}: "Stuff" is raised 2*StrutUnit
+% \Raise {Stuff}: "Stuff" is raised a half-line
+% $\Lower(10pt){\alpha}$: "$\alpha$" is lowered 10 points
+
+% RAISE
+\def\Raise{%
+ \def\!thSign{+}%
+ \!tgGetValue\!thSetDimen}
+
+% LOWER
+\def\Lower{%
+ \def\!thSign{-}%
+ \!tgGetValue\!thSetDimen}
+
+% SET DIMEN
+\def\!thSetDimen{%
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \!taDimenA \StrutHeightFactor\StrutUnit
+ \advance \!taDimenA \StrutDepthFactor\StrutUnit
+ \divide \!taDimenA 2
+ \else
+ \!taDimenA \!tgValue\StrutUnit
+ \fi
+ \else
+ \!taDimenA \!tgValue
+ \fi
+ \!taDimenA=\!thSign\!taDimenA\relax
+ %
+ % BRANCH ON MODE
+ \ifmmode
+ \expandafter\mathpalette
+ \expandafter\!thDoMathRaise
+ \else
+ \expandafter\!thDoSimpleRaise
+ \fi}
+
+% DO SIMPLE RAISE
+\def\!thDoSimpleRaise#1{%
+ \setbox\zerocount\hbox{\raise \!taDimenA\hbox{#1}}%
+ \!thFinishRaise} % From Plain TeX: \ht0=0pt \dp0=0pt \box0
+
+% DO MATH RAISE
+\def\!thDoMathRaise#1#2{%
+ \setbox\zerocount\hbox{\raise \!taDimenA\hbox{$\mathsurround\zeropoint#1{#2}$}}%
+ \!thFinishRaise}
+
+% FINISH RAISE. This is the same as Plain's \finsm@sh; some macro
+% packages redefine \finsm@sh.
+\def\!thFinishRaise{%
+ \ht\zerocount\zeropoint
+ \dp\zerocount\zeropoint
+ \box\zerocount}
+
+
+% ***************************************************************
+% BACK SPACE
+% ***************************************************************
+\def\BackSpace{%
+ \!tgGetValue\!thKernBack}
+
+\def\!thKernBack{%
+ \kern -
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\KernFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \KernUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi
+ \ignorespaces}%
+
+
+% ***************************************************************
+% Vspace
+% ***************************************************************
+\def\Vspace{%
+ \noalign
+ \bgroup
+ \!tgGetValue\!thVspace}
+
+\def\!thVspace{%
+ \vskip
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\VspaceFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \StrutUnit
+ \else
+ \!tgValue % user-specified skip
+ \fi
+ \egroup} % Ends the \noalign
+
+% *********************************************************************
+% SECTION F: FORMAT
+% *********************************************************************
+
+% As explained in Section 3.3 of the manual, TABLE alternates each
+% of the user's "data" columns with a "rule" column; moreover, TABLE
+% places a "dummy data" column at the left and right of a table.
+% A table with n nominal data columns therefore actually has a
+% total of
+% n (nominal data columns)
+% +(n+1) (rule columns)
+% + 2 (dummy data columns)
+% ____
+% 2n+3
+% columns.
+
+% FORMATs job is to create an \halign preamble for the alignment
+% of these (2n+3) columns. The preamble consists of templates
+% for the various columns, strung together with &'s and interlaced
+% with \tabskip glue specifications.
+
+% FORMAT constructs the template for a nomimal data column according
+% to the user-specified format keys. As the keys are read from left
+% to right, the template is built up "from the inside out" (as
+% illustrated in Section 3.1.9 of the manual), the inner-most part
+% being the "#" sign. A "|" in the format terminates template
+% building; the completed template is adjoined to preamble along
+% with the template for the following rule column.
+
+% Minimum column widths, if specified, are implemented by creating
+% an "artificial row" with data entries of the form
+% \hskip <minimum column width>.
+% This row has zero height and depth and is completely invisible.
+
+
+% BEGIN FORMAT
+\def\BeginFormat{%
+ %catcode`\|=12 % Inhibit expansion if | immediately follows a <number>
+ %catcode`\"=12 % read by \getvalue.
+ \!taPreamble={}%
+ \!taColumnNumber=0
+ \skip0 =\InterColumnSpaceUnit
+ \multiply\skip0 \InterColumnSpaceFactor
+ \divide\skip0 2
+ \!taRuleColumnTemplate=\!thx{%
+ \!thx\tabskip\the\skip0 }%
+ \!taLastRegularTabskip=\skip0
+ \!taOnceOnlyTabskipfalse
+ \!taBeginFormattrue % Used to intercept key "]"
+ \def\!tfRowOfWidths{}% Artificial Table Row with horizontal struts
+ % to enforce specified minimum column widths
+ \ReadFormatKeys}
+
+% SET (MINIMUM COLUMN) WIDTH: Invoked by the key "w".
+\def\!tfSetWidth{%
+ \ifx \!tfRowOfWidths \empty % true if no prior "w" keys
+ \ifnum \!taColumnNumber>0 % true if "w" key is to right of first "|"
+ \begingroup % RowOfWidths={&\omit || n copies of
+ % &\omit&\omit}, where n = number of columns
+ \!taCountA=1 % to the left of this one
+ \aftergroup \edef \aftergroup \!tfRowOfWidths \aftergroup {%
+ \aftergroup &\aftergroup \omit
+ \!thLoop
+ \ifnum \!taCountA<\!taColumnNumber
+ \advance\!taCountA 1
+ \aftergroup \!tfAOAO
+ \repeat
+ \aftergroup }%
+ \endgroup
+ \fi
+ \fi
+ \ifx [\!ttemp % \!tgGetValue sets \!ttemp = token after w
+ \!thx\!tfSetWidthText
+ \else
+ \!thx\!tfSetWidthValue
+ \fi}
+
+% AOAO = (Apersand Omit Ampersand Omit)
+\def\!tfAOAO{%
+ &\omit&\omit}
+
+% SET WIDTH TEXT
+\def\!tfSetWidthText [#1]{% #1 = specified text
+ \def\!tfWidthText{#1}%
+ \ReadFormatKeys}
+
+% SET WIDTH VALUE
+\def\!tfSetWidthValue{%
+ \!taMinimumColumnWidth =
+ \ifnum \!tgCode=1
+ \ifx\!tgValue\empty % Use default multiplier if user didn't specify one
+ \ColumnWidthFactor
+ \else
+ \!tgValue
+ \fi
+ \ColumnWidthUnit
+ \else
+ \!tgValue
+ \fi
+ \def\!tfWidthText{}% Override possible prior `w[sample entry]'
+ \ReadFormatKeys}
+
+
+% SET TABSKIP: Invoked by the tabskip keys "t" and "o"
+\def\!tfSetTabskip{%
+ \ifnum \!tgCode=1
+ \skip0 =\InterColumnSpaceUnit
+ \multiply\skip0
+ \ifx \!tgValue\empty
+ \InterColumnSpaceFactor % Default integer
+ \else
+ \!tgValue % User-specified integer
+ \fi
+ \else
+ \skip0 =\!tgValue % User-specified <skip>
+ \fi
+ \divide\skip0 by 2
+ \ifnum\!taColumnNumber=0
+ \!thToksEdef\!taRuleColumnTemplate={%
+ \the\!taRuleColumnTemplate
+ \tabskip \the\skip0 }
+ \else
+ \!thToksEdef\!taDataColumnTemplate={%
+ \the\!taDataColumnTemplate
+ \tabskip \the\skip0 }
+ \fi
+ \if!taOnceOnlyTabskip
+ % % Tabskip used at right of this col only
+ \else
+ \!taLastRegularTabskip=\skip0 % Remember this Tabskip, for possible
+ \fi % restoration after a subsequent"OnceOnly"
+ \ReadFormatKeys}
+
+
+% SET VRULE: Invoked by the key "|"
+\def\!tfSetVrule{%
+ \!thToksEdef\!taRuleColumnTemplate={%
+ \noexpand\hfil
+ \noexpand\vrule
+ \noexpand\!thWidth
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\LineThicknessFactor % Default integer
+ \else
+ \!tgValue % User-specified integer
+ \fi
+ \!taLTU % \LineThicknessUnit
+ \else
+ \!tgValue % User-specified dimension
+ \fi
+ ####%
+ \noexpand\hfil
+ \the\!taRuleColumnTemplate} % has \tabskips, when column number=0
+ \!tfAdjoinPriorColumn}
+
+% SET ALTERNATE VRULE: Invoked by the key "\|", in the form
+% \|{<template for (rule) column>}. The "{" and "}" are mandatory,
+% and the <template for column> must contain a "#". The key system
+% CAN'T be used to set up this template. The <template> can have the
+% form "\span\macro".
+\def\!tfSetAlternateVrule{%
+ \afterassignment\!tfSetAlternateA
+ \toks0 =} % Put template into \toks0
+
+\def\!tfSetAlternateA{%
+ \!thToksEdef\!taRuleColumnTemplate={%
+ \the\toks0 \the\!taRuleColumnTemplate} % RCT may have \tabskips
+ \!tfAdjoinPriorColumn}
+
+% ADJOIN PRIOR COLUMN
+\def\!tfAdjoinPriorColumn{%
+ \ifnum \!taColumnNumber=0
+ \!taPreamble=\!taRuleColumnTemplate % New \tabskip may have been added
+ \ifnum \TracingFormats>0
+ \!tfShowRuleTemplate
+ \fi
+ \else
+ \ifx\!tfRowOfWidths\empty % no "w" keys specified yet, not even this col
+ \else
+ \!tfUpdateRowOfWidths
+ \fi
+ % Adjoin positioning glues to left and right of template
+ \!thToksEdef\!taDataColumnTemplate={%
+ \the \!taLeftGlue
+ \the \!taDataColumnTemplate
+ \the \!taRightGlue}
+ \ifnum \TracingFormats>0
+ \!tfShowTemplates
+ \fi
+ % Adjoin data- and rule-column templates to preamble
+ \!thToksEdef\!taPreamble={%
+ \the\!taPreamble
+ &
+ \the\!taDataColumnTemplate
+ &
+ \the\!taRuleColumnTemplate}
+ \fi
+%
+% START NEW COLUMN
+ \advance \!taColumnNumber 1
+ % Initialize data-column template, restoring last "regular" tabskip
+ % after a "once only" tabskip
+ \if!taOnceOnlyTabskip
+ \!thToksEdef\!taDataColumnTemplate={%
+ ####\tabskip \the\!taLastRegularTabskip}
+ \else
+ \!taDataColumnTemplate{##}%
+ \fi
+ % Remaining initializations
+ \!taRuleColumnTemplate{}% # is inserted by \SetVrule, or \SetAlternateVrule
+ \!taLeftGlue{\hfil}% % Default positioning is "center"
+ \!taRightGlue{\hfil}%
+ \!taMinimumColumnWidth=0pt
+ \def\!tfWidthText{}%
+ \!taOnceOnlyTabskipfalse % Set true by key "o"
+ \ReadFormatKeys}
+
+% UPDATE ROW OF WIDTHS
+\def\!tfUpdateRowOfWidths{%
+ % If user had a "w[<Text>]" key, set <Text> according to the
+ % template for this column, and find the width of the result
+ \ifx \!tfWidthText\empty
+ \else % set specified text according to current template & find width
+ \!tfComputeMinColWidth
+ \fi
+ \edef\!tfRowOfWidths{%
+ \!tfRowOfWidths
+ &%
+ \omit % Data Column
+ \ifdim \!taMinimumColumnWidth>0pt
+ \hskip \the\!taMinimumColumnWidth
+ \fi
+ &
+ \omit}} % Rule Column
+
+% COMPUTE MINIMUM COLUMN WIDTH (from specified WidthText)
+\def\!tfComputeMinColWidth{%
+ \setbox0 =\vbox{%
+ \ialign{% Plain's initialized \halign; \tabskip=0pt \everycr={}
+ \span\the\!taDataColumnTemplate\cr
+ \!tfWidthText\cr}}%
+ \!taMinimumColumnWidth=\wd0 }
+
+% SHOW (INITIAL) RULE TEMPLATE
+\def\!tfShowRuleTemplate{%
+ \!thMessage{}
+ \!thMessage{TABLE FORMAT}
+ \!thMessage{Column: Template}
+ \!thMessage{%
+ \space *c: ##\tabskip \the\LeftTabskip}
+ \!taOldRuleColumnTemplate=\!taRuleColumnTemplate}
+
+% SHOW TEMPLATES
+\def\!tfShowTemplates{%
+ \!thMessage{%
+ \space \space r: \the\!taOldRuleColumnTemplate}
+ \!taOldRuleColumnTemplate=\!taRuleColumnTemplate
+ \!thMessage{%
+ \ifnum \!taColumnNumber<10
+ \space
+ \fi
+ \the\!taColumnNumber c: \the\!taDataColumnTemplate}
+ \ifdim\!taMinimumColumnWidth>0pt
+ \!thMessage{%
+ \space \space w: \the\!taMinimumColumnWidth}
+ \fi}
+
+
+% FINISH UP: Invoked by the keys "." and \EndFormat
+\def\!tfFinishFormat{%
+ \ifnum \TracingFormats>0
+ \!thMessage{%
+ \space \space r: \the\!taOldRuleColumnTemplate
+ \tabskip \the\RightTabskip}%
+ \!thMessage{%
+ \space *c: ##\tabskip 0pt}
+ \fi
+ \ifnum \!taColumnNumber<2
+ \!thError{%
+ \ifnum \!taColumnNumber=0
+ No
+ \else
+ Only 1
+ \fi
+ "|"}%
+ {\!thReadErrorMsg\!tfTooFewBarsA
+ ^^J\!thReadErrorMsg\!tfTooFewBarsB
+ ^^J\!thReadErrorMsg\!tkFixIt}%
+ \fi
+ \!thToksEdef\!taPreamble={%
+ ####\tabskip\LeftTabskip
+ &
+ \the\!taPreamble \tabskip\RightTabskip
+ &
+ ####\tabskip 0pt \cr}
+ \ifnum \TracingFormats>1
+ \!thMessage{Preamble=\the\!taPreamble}
+ \fi
+ \ifnum \TracingFormats>2
+ \!thMessage{Row Of Widths="\!tfRowOfWidths"}
+ \fi
+ \!taBeginFormatfalse % Intercepts "|", tabskips, and "."
+ %\catcode`\|=13
+ %\catcode`\"=13
+ \!ttDoHalign}
+
+% ERROR MESSAGE FOR NOT ENOUGH "|"'s
+\!thStoreErrorMsg\!tfTooFewBarsA{%
+ There must be at least 2 "\string|"'s (and/or "\string \|"'s)}
+\!thStoreErrorMsg\!tfTooFewBarsB{%
+ between \string\BeginFormat\space and \string\EndFormat\space (or ".").}
+
+
+% REFORMAT [<key letters>]{<text>}: Formats <text> according to
+% <key letters>. Used to override the template for a column,
+% or columns when used after \use.
+\def\ReFormat[#1]{%
+ \omit
+ \!taDataColumnTemplate{##}%
+ \!taLeftGlue{}%
+ \!taRightGlue{}%
+ %\catcode`\|=12 % Inhibit expansion if | immediately follows a <number>
+ %\catcode`\"=12 % read by \getvalue. Actually, '|' and '"' shouldn't
+ \begingroup
+ \@@useotherbar
+ \@@useotherquote
+ \expanded{\endgroup\noexpand\ReadFormatKeys#1]}}% appear in a \ReFormat cmd; this is here as a safeguard.
+
+% END REFORMAT: Invoked by the key "]"
+\def\!tfEndReFormat{%
+ \ifnum \TracingFormats>0
+ \!thMessage{ReF:
+ \the\!taLeftGlue
+ \hbox{\the\!taDataColumnTemplate}% White lie
+ \the\!taRightGlue}
+ \fi
+ %\catcode`\|=13
+ %\catcode`\"=13
+ \!tfReFormat}
+
+\def\!tfReFormat#1{%
+ \the \!taLeftGlue
+ \vbox{%
+ \ialign{%
+ \span\the\!taDataColumnTemplate\cr
+ #1\cr}}%
+ \the \!taRightGlue}
+
+
+
+% *********************************************************************
+% SECTION G: GET VALUE
+% *********************************************************************
+
+% GET_VALUE{<return macro>}<tokens> functions as follows:
+
+% If <tokens> has the form <(stuff)>, then
+% code=2 and value=<stuff>
+
+% Otherwise <tokens> has the form <DDDXYZ> where <DDD> denotes (a possibly
+% empty) string of consecutive digits (0,1,2,...,9) terminated by the first
+% character <X> (possibly a blank) that is not a digit. In this case
+% code=1 and value=<DDD> (= <null>, if <DDD> is non-empty).
+
+% Examples: Code Value
+% "\GetValue{\macro} 3" 1 null
+% "\GetValue{\macro}A " 1 null
+% "\GetValue{\macro}1 " 1 1
+% "\GetValue{\macro}25A" 1 25
+% "\GetValue{\macro}25012 " 1 25012
+% "\GetValue{\macro}(10pt)" 2 10pt
+% "\GetValue{\macro}(1in)" 2 1in
+% "\GetValue{\macro} (1in)" 1 null
+
+
+% GET_VALUE{<macro to execute after value is found>}
+\def\!tgGetValue#1{%
+ \def\!tgReturn{#1}% Set return
+ \futurelet\!ttemp\!tgCheckForParen}% Now \!ttemp is the token
+ % immediately after {}
+
+% CHECK_PAREN: See if \!ttemp is a (
+\def\!tgCheckForParen{%
+ \ifx\!ttemp (%
+ \!thx \!tgDoParen
+ \else
+ \!thx \!tgCheckForSpace
+ \fi}
+
+% DO_PAREN: Set code to 2, value to stuff inside ( )'s
+\def\!tgDoParen(#1){%
+ \def\!tgCode{2}%
+ \def\!tgValue{#1}% NOTE #1 MUST BE A LEGITIMATE VALUE
+ \!tgReturn}
+
+% CHECK_SPACE: See if \!ttemp is a <blank space>
+\def\!tgCheckForSpace{%
+ \def\!tgCode{1}%
+ \def\!tgValue{}% Initialize value to <null>
+ \ifx\!ttemp\!thSpaceToken
+ \!thx \!tgReturn % <blank space> means no value was specified
+ \else
+ \!thx \!tgCheckForDigit
+ \fi}
+
+% CHECK_DIGIT: \!ttemp is not a <blank space>; if its a digit (0,1,...,9)
+% get the <number> starting with that digit.
+\def\!tgCheckForDigit{%
+ \!taDigitfalse
+ \ifx 0\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 1\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 2\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 3\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 4\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 5\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 6\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 7\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 8\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 9\!ttemp
+ \!taDigittrue
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \if!taDigit
+ \!thx \!tgGetNumber
+ \else
+ \!thx \!tgReturn
+ \fi}
+
+% GET_NUMBER
+\def\!tgGetNumber{%
+ \afterassignment\!tgGetNumberA
+ \!taCountA=}
+\def\!tgGetNumberA{%
+ \edef\!tgValue{\the\!taCountA}%
+ \!tgReturn}
+
+
+% ********************************************************************
+% MISCELANEOUS "RETURNS" FROM \getvalue
+% ********************************************************************
+
+% SET UP PAR BOX: Puts \BeginTableParBox{<user-specified \hsize>}
+% to the left of "#" and \EndTableParBox to the right of "#".
+\def\!tgSetUpParBox{%
+ \edef\!ttemp{%
+ \noexpand \ReadFormatKeys
+ b{\noexpand \BeginTableParBox{%
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\ColumnWidthFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \!taCWU % \ColumnWidthUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi}}}%
+ \!ttemp
+ a{\EndTableParBox}}
+
+% SET KERNS
+\def\!tgInsertKern{%
+ \edef\!ttemp{%
+ \kern
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\KernFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \!taKU % \KernUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi}%
+ \edef\!ttemp{%
+ \noexpand\ReadFormatKeys
+ \ifh@ % true if kern goes to left of "#"
+ b{\!ttemp}
+ \fi
+ \ifv@ % true if kern goes to right of "#"
+ a{\!ttemp}
+ \fi}%
+ \!ttemp}
+
+% *********************************************************************
+% SECTION K: KEYS
+% *********************************************************************
+
+% ****************************************************************
+% DEFINING NEW KEYS
+% ****************************************************************
+
+% NEW FORMAT KEY <Key Letter>: Must be followed by
+% <Parameter Text> <Replacement Text>
+% Sets up a new key letter command by expanding (essentially) to
+% \expandafter \def \csname !tk<Key Letter>\endcsname
+% <Parameter Text>{<Replacement Text>}
+% A warning message is issued if <Key Letter> is already in use.
+\def\NewFormatKey#1{%
+ \!thx\def\!thx\!ttempa\!thx{\string #1}%
+ \!thx\def\!thx\!ttempb\!thx{\csname !tk<\!ttempa>\endcsname}%
+ \ifnum \TracingKeys>0
+ \!tkReportNewKey
+ \fi
+ \!thx\ifx \!ttempb \relax
+ \!thx\!tkDefineKey
+ \else
+ \!thx\!tkRejectKey
+ \fi}
+
+% REPORT NEW KEY
+\def\!tkReportNewKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thMessage{NEW KEY: "\the\!taToksA"}}
+
+% DEFINE KEY
+\def\!tkDefineKey{%
+ \!thx\def\!ttempb}%
+
+% DUPLICATE KEY
+\def\!tkRejectKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thError{Key letter "\the\!taToksA" already used}
+ {\!thReadErrorMsg\!tkFixIt}
+ \def\!tkGarbage}%
+
+% ERROR MESSAGE FOR DUPLICATE KEY
+\!thStoreErrorMsg\!tkFixIt{%
+ You'd better type \space 'E' \space and fix your file.}
+
+
+% ****************************************************************
+% READING FORMAT KEYS
+% ****************************************************************
+
+% READ FORMAT KEYS
+\def\ReadFormatKeys#1{%
+ \!thx\def\!thx\!ttempa\!thx{\string #1}%
+ \!thx\def\!thx\!ttempb\!thx{\csname !tk<\!ttempa>\endcsname}%
+ \ifnum \TracingKeys>1
+ \!tkReportKey
+ \fi
+ \!thx\ifx \!ttempb\relax
+ \!thx\!tkReplaceKey
+ \else
+ \!thx\!ttempb
+ \fi}
+
+% REPORT KEY
+\def\!tkReportKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thMessage{KEY: "\the\!taToksA"}}
+
+% REPLACE KEY
+\def\!tkReplaceKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thError {Undefined format key "\the\!taToksA"}
+ {\!thReadErrorMsg\!tkUndefined ^^J\!thReadErrorMsg\!tkBadKey}
+ \!tkReplaceKeyA}
+
+\def\!tkReplaceKeyA{%
+ \!thGetReplacement{\!thReadErrorMsg\!tkReplace}\!tkReplacement
+ \!thx\ReadFormatKeys\!tkReplacement}
+
+% ERROR MESSAGES FOR KEY RELACEMENT
+\!thStoreErrorMsg\!tkUndefined{%
+ The format key in " "'s on the next to top line is undefined.}
+\!thStoreErrorMsg\!tkBadKey{%
+ Type \space E \space to quit now, or
+ \space<CR> \space and respond to next prompt.}
+\!thStoreErrorMsg\!tkReplace{%
+ Type \space<replacement key><CR> \space,
+ or simply \space<CR> \space to skip offending key:}
+
+
+% ****************************************************************
+% PRIMITIVE KEYS
+% ****************************************************************
+
+% Key "b": b{TOKENS} adds TOKENS to the left of (before) the template
+\NewFormatKey b#1{%
+ \!thx\!tkJoin\!thx{\the\!taDataColumnTemplate}{#1}%
+ \ReadFormatKeys}
+
+\def\!tkJoin#1#2{%
+ \!taDataColumnTemplate{#2#1}}%
+
+% Key "a": a{TOKENS} adds TOKENS to the right of (after) the template
+\NewFormatKey a#1{%
+ \!taDataColumnTemplate\!thx{\the\!taDataColumnTemplate #1}%
+ \ReadFormatKeys}
+
+% Key "\{": Enclose template in braces.
+\NewFormatKey \{{%
+ \!taDataColumnTemplate=\!thx{\!thx{\the\!taDataColumnTemplate}}%
+ \ReadFormatKeys}
+
+% Key "*": "*{N}{KEY LETTERS}" is equivalent to specifying
+% <KEY LETTERS> N times.
+% KEY LETTERS may contain further * specifications
+\NewFormatKey *#1#2{%
+ \!taCountA=#1\relax
+ \!taToksA={}%
+ \!thLoop
+ \ifnum \!taCountA > 0
+ \!taToksA\!thx{\the\!taToksA #2}%
+ \advance\!taCountA -1
+ \repeat
+ \!thx\ReadFormatKeys\the\!taToksA}
+
+
+% ****************************************************************
+% POSITIONING KEYS
+% ****************************************************************
+
+% Key "\LeftGlue": Specifies the glue (usually \hfil, or nothing) to be
+% added to extreme left of the template to position a column
+\NewFormatKey \LeftGlue#1{%
+ \!taLeftGlue{#1}%
+ \ReadFormatKeys}
+
+% Key "\RightGlue": Specifies the glue (usually \hfil, or nothing) to be
+% added to the extreme right of the template to position a column
+\NewFormatKey \RightGlue#1{%
+ \!taRightGlue{#1}%
+ \ReadFormatKeys}
+
+% Key "c": Centered column.
+\NewFormatKey c{%
+ \ReadFormatKeys
+ \LeftGlue\hfil
+ \RightGlue\hfil}
+
+% Key "l": Left-adjusted column.
+\NewFormatKey l{%
+ \ReadFormatKeys
+ \LeftGlue{} % In case more than one positioning key is specified.
+ \RightGlue\hfil}
+
+% Key "r": Right-adjusted column.
+\NewFormatKey r{%
+ \ReadFormatKeys
+ \LeftGlue\hfil
+ \RightGlue{}}
+
+% Key "k": Adds kerns to left and right of "#"
+% This key and the two below use Plain TeX's \if@h as if it were \if@left,
+% and \if@v as if it were \if@right. Table making goes on in a group,
+% so even in the unlikely circumstance that a \phantom is currently under
+% construction, there's no problem.
+\NewFormatKey k{%
+ \h@true
+ \v@true
+ \!tgGetValue{\!tgInsertKern}}
+
+% Key "i": Adds a kern to the left of "#"
+\NewFormatKey i{%
+ \h@true
+ \v@false
+ \!tgGetValue{\!tgInsertKern}}
+
+% Key "j": Adds a kern to the right of "#"
+\NewFormatKey j{%
+ \h@false
+ \v@true
+ \!tgGetValue{\!tgInsertKern}}
+
+
+% ****************************************************************
+% NUMERIC ITEM KEYS
+% ****************************************************************
+
+% Key "n": numeric item , non-math mode.
+\NewFormatKey n{%
+ \def\!tnStyle{}%
+ \futurelet\!tnext\!tnTestForBracket}
+
+% Key "N": numeric item, math mode.
+\NewFormatKey N{%
+ \def\!tnStyle{$}%
+ \futurelet\!tnext\!tnTestForBracket}
+
+
+% ****************************************************************
+% ATTRIBUTE KEYS
+% ****************************************************************
+
+% Key "m": Math mode.
+\NewFormatKey m{%
+ \ReadFormatKeys b$ a$}
+
+% Key "M": Displaymath mode.
+\NewFormatKey M{%
+ \ReadFormatKeys \{ b{$\displaystyle} a$}
+
+% Key "\m": Template ${}#\hfil$
+\NewFormatKey \m{%
+ \ReadFormatKeys l b{{}} m}
+
+% Key "\M": Template $\displaystyle{{}#\hfil}$
+\NewFormatKey \M{%
+ \ReadFormatKeys l b{{}} M}
+
+% Key "f": Set font (E.g., f\it sets up italic font (assuming \it
+% has its usual meaning)
+\NewFormatKey f#1{%
+ \ReadFormatKeys b{#1}}
+
+% Key "B": abbreviation for f\bf
+\NewFormatKey B{%
+ \ReadFormatKeys f\bf}
+
+% Key "I": abbreviation for f\it
+\NewFormatKey I{%
+ \ReadFormatKeys f\it}
+
+% Key "S": abbreviation for f\sl
+\NewFormatKey S{%
+ \ReadFormatKeys f\sl}
+
+% Key "R": abbreviation for f\rm
+\NewFormatKey R{%
+ \ReadFormatKeys f\rm}
+
+% Key "T": abbreviation for f\tt
+\NewFormatKey T{%
+ \ReadFormatKeys f\tt}
+
+% Key "p": ParBox
+\NewFormatKey p{%
+ \!tgGetValue{\!tgSetUpParBox}}
+
+
+% ****************************************************************
+% MINIMUM COLUMN WIDTH KEY
+% ****************************************************************
+
+% Key "w": minimum column width
+\NewFormatKey w{%
+ \!tkTestForBeginFormat w{\!tgGetValue{\!tfSetWidth}}}
+
+
+% ****************************************************************
+% TABSKIP KEYS
+% ****************************************************************
+
+% Key "s": Set tabskip for the inter-column space to the right
+% of the current column, and all subsequent spaces, until overriden
+% by a new "s" or "o" key.
+\NewFormatKey s{%
+ \!taOnceOnlyTabskipfalse % in case same column has a prior "o" key
+ \!tkTestForBeginFormat t{\!tgGetValue{\!tfSetTabskip}}}
+
+% Key "o": Apply the \tabskip stated for this column ONLY to the
+% inter-column space just to the right of this column; restore the
+% the previous \tabskip for subsequent columns.
+\NewFormatKey o{%
+ \!taOnceOnlyTabskiptrue
+ \!tkTestForBeginFormat o{\!tgGetValue{\!tfSetTabskip}}}
+
+
+% ****************************************************************
+% RULE KEYS
+% ****************************************************************
+
+% Key "|": Standard rule column designator
+\NewFormatKey |{%
+ \!tkTestForBeginFormat |{\!tgGetValue{\!tfSetVrule}}}
+
+% Key "\|": Non-standard rule column designator
+\NewFormatKey \|{%
+ \!tkTestForBeginFormat \|{\!tfSetAlternateVrule}}
+
+
+% ****************************************************************
+% END-OF-FORMAT KEYS
+% ****************************************************************
+
+% Key ".": PERIOD -- end of \BeginFormat section.
+\NewFormatKey .{%
+ \!tkTestForBeginFormat.{\!tfFinishFormat}}
+
+% Key "\EndFormat": Equivalent to "."
+\NewFormatKey \EndFormat{%
+ \!tkTestForBeginFormat\EndFormat{\!tfFinishFormat}}
+
+% Key "]": End of \ReFormat section
+\NewFormatKey ]{%
+ \!tkTestForReFormat ] \!tfEndReFormat}
+
+
+% ****************************************************************
+% VALIDITY CHECKS
+% ****************************************************************
+
+% TEST FOR BEGIN FORMAT{<Key>}{Intended Action}: This test is run
+% on keys that can only be used by \BeginFormat --- "s", "o",
+% "|", "\|", "w", ".", and "\EndFormat".
+\def\!tkTestForBeginFormat#1#2{%
+ \if!taBeginFormat
+ \def\!ttemp{#2}%
+ \!thx \!ttemp
+ \else
+ \toks0={#1}%
+ \toks2=\!thx{\string\ReFormat}%
+ \!thx \!tkImproperUse
+ \fi}
+
+% TEST FOR RE FORMAT{<Key>}{Intended Action}: This test is run
+% on the key "]", which can only be used by \ReFormat.
+\def\!tkTestForReFormat#1#2{%
+ \if!taBeginFormat
+ \toks0={#1}%
+ \toks2=\!thx{\string\BeginFormat}%
+ \!thx \!tkImproperUse
+ \else
+ \def\!ttemp{#2}%
+ \!thx \!ttemp
+ \fi}
+
+% IMPROPER USE OF KEY
+\def\!tkImproperUse{%
+ \!thError{\!thReadErrorMsg\!tkBadUseA "\the\toks0 "}%
+ {\!thReadErrorMsg\!tkBadUseB \the\toks2 \space command.
+ ^^J\!thReadErrorMsg\!tkBadKey}%
+ \!tkReplaceKeyA}
+
+% ERROR MESSAGES FOR IMPROPER USE OF KEY
+\!thStoreErrorMsg\!tkBadUseA{Improper use of key }
+\!thStoreErrorMsg\!tkBadUseB{%
+ The key mentioned above can't be used in a }
+
+
+
+% *********************************************************************
+% SECTION n: NUMERIC
+% *********************************************************************
+
+% NOTE: THE SPACE BETWEEN A NUMERIC ENTRY AND THE FOLLOWING '|', '"',
+% OR '\|' IS MANDATORY.
+% EMPTY NUMERIC ENTRIES ARE NOT ALLOWED: USE '{}' OR '\omit' INSTEAD.
+
+% TEST FOR BRACKET: Invoked by the keys "n" and "N".
+\def\!tnTestForBracket{%
+ \ifx [\!tnext
+ \!thx\!tnGetArgument
+ \else
+ \!thx\!tnGetCode
+ \fi}
+
+% GET CODE: E.g. "4", or "4.0", "0.4", or "10.2"
+\def\!tnGetCode#1 {% NOTE THE BLANK
+ \!tnConvertCode #1..!}
+
+% CONVERT CODE: E.g. converts above to [0000], [0000.], [.0000],
+% [0000000000.00]
+\def\!tnConvertCode #1.#2.#3!{%
+ \begingroup
+ \aftergroup\edef \aftergroup\!ttemp \aftergroup{%
+ \aftergroup[%
+ \!taCountA #1
+ \!thLoop
+ \ifnum \!taCountA>0
+ \advance\!taCountA -1
+ \aftergroup0
+ \repeat
+ \def\!ttemp{#3}%
+ \ifx\!ttemp \empty
+ \else
+ \aftergroup.
+ \!taCountA #2
+ \!thLoop
+ \ifnum \!taCountA>0
+ \advance\!taCountA -1
+ \aftergroup0
+ \repeat
+ \fi
+ \aftergroup]\aftergroup}%
+ \endgroup\relax
+ \!thx\!tnGetArgument\!ttemp}
+
+% GET ARGUMENT: [<sample left field> <optional .<sample right field>>
+\def\!tnGetArgument[#1]{%
+ \!tnMakeNumericTemplate\!tnStyle#1..!}
+
+% MAKE NUMERIC TEMPLATE
+\def\!tnMakeNumericTemplate#1#2.#3.#4!{% #1=<empty> or $
+ \def\!ttemp{#4}%
+ \ifx\!ttemp\empty
+ \!taDimenC=0pt
+ \else
+ \setbox0=\hbox{\mathsurround\zeropoint #1.#3#1}%
+ \!taDimenC=\wd0
+ \fi
+ \setbox0 =\hbox{\mathsurround\zeropoint #1#2#1}%
+ \!thToksEdef\!taDataColumnTemplate={%
+ \noexpand\!tnSetNumericItem
+ {\the\wd0 }%
+ {\the\!taDimenC}%
+ {#1}%
+ \the\!taDataColumnTemplate} % Might have tabskip glue in here
+ \ReadFormatKeys}
+
+% SET NUMERIC ITEM
+\def\!tnSetNumericItem #1#2#3#4 {% NOTE THE BLANK
+ \!tnSetNumericItemA {#1}{#2}{#3}#4..!}
+
+\def\!tnSetNumericItemA #1#2#3#4.#5.#6!{%
+ \def\!ttemp{#6}%
+ \hbox to #1{\hss \mathsurround\zeropoint #3#4#3}%
+ \hbox to #2{%
+ \ifx\!ttemp\empty
+ \else
+ \mathsurround\zeropoint #3.#5#3%
+ \fi
+ \hss}}
+
+
+
+% *********************************************************************
+% SECTION S: STRUTS
+% *********************************************************************
+
+% The following are in ALLOCATIONS
+ %\newdimen\StrutUnit (normal value \normalbaselineskip / 11)
+ %\newcount\StrutHeightFactor (normal value 8)
+ %\newcount\StrutDepthFactor (normal value 3)
+
+% MAKE STRUT OF SPECIFIED HEIGHT AND DIMENSION
+% \MakeStrut <height><depth>; height and depth are <dimen>'s
+\def\MakeStrut#1#2{%
+ \vrule width0pt height #1 depth #2}
+
+% STANDARD VERTICAL STRUT
+% Makes a strut of height=StrutHeightFactor*StrutUnit
+% depth =StrutDepthFactor *StrutUnit
+\def\StandardTableStrut{%
+ \MakeStrut{\StrutHeightFactor\StrutUnit}
+ {\StrutDepthFactor\StrutUnit}}
+
+
+% STANDARD VERTICAL STRUT, WITH EXTRA HEIGHT/DEPTH
+% \AugmentedTableStrut<multiple for extra height><multiple for extra depth>
+% makes a strut of height=(StrutHeightFactor+#1)*StrutUnit
+% depth =(StrutDepthFactor+#2)*StrutUnit
+\def\AugmentedTableStrut#1#2{%
+ \dimen@=\StrutHeightFactor\StrutUnit
+ \advance\dimen@ #1\StrutUnit
+ \dimen@ii=\StrutDepthFactor\StrutUnit
+ \advance\dimen@ii #2\StrutUnit
+ \MakeStrut{\dimen@}{\dimen@ii}}
+
+
+% ENLARGE<extra height><extra depth><original>
+% Enlarges "original" by extra height and extra depth.
+% Extra height and extra depth are <dimen>'s.
+% Works for various math styles, and takes into account
+% \spacefactor in horizontal mode
+\def\Enlarge#1#2{% 3rd argument is picked up later
+ % #1=extra height
+ % #2=extra depth
+ \!taDimenA=#1\relax
+ \!taDimenB=#2\relax
+ \let\!TsSpaceFactor=\empty
+ \ifmmode
+ \!thx \mathpalette
+ \!thx \!TsEnlargeMath
+ \else
+ \!thx \!TsEnlargeOther
+ \fi}
+
+\def\!TsEnlargeOther#1{%
+ \ifhmode
+ \setbox\zerocount\hbox{#1%
+ \xdef\!TsSpaceFactor{\spacefactor=\the\spacefactor}}%
+ \else
+ \setbox\zerocount\hbox{#1}%
+ \fi
+ \!TsFinishEnlarge}
+
+\def\!TsEnlargeMath#1#2{%
+ \setbox\zerocount\hbox{$\mathsurround\zeropoint#1{#2}$}%
+ \!TsFinishEnlarge}
+
+\def\!TsFinishEnlarge{%
+ \dimen@\ht\zerocount
+ \advance \dimen@ \!taDimenA
+ \ht\zerocount\dimen@
+ \dimen@\dp\zerocount
+ \advance \dimen@ \!taDimenB
+ \dp\zerocount\dimen@
+ \box\zerocount \!TsSpaceFactor{}}
+
+
+% ENLARGE BY MULTIPLES OF StrutUnit
+% \enlarge<multiple for extra height><multiple for extra depth><original>
+% Enlarges by (multiple for extra height)*StrutUnit
+% and (multiple for extra depth) *StrutUnit
+\def\enlarge#1#2{% 3rd argument is picked up later
+ \Enlarge{#1\StrutUnit}{#2\StrutUnit}}
+
+
+% OPENUP#1#2: increases strut height and depth factors by #1 and #2.
+\def\OpenUp#1#2{%
+ \advance \StrutHeightFactor #1\relax
+ \advance \StrutDepthFactor #2\relax}
+
+
+
+% *********************************************************************
+% SECTION T: TABLES
+% *********************************************************************
+
+% Table-making is initiated by \BeginTable. After processing that
+% command, TeX absorbs the instructions in the prologue to the table
+% until it gets to \BeginFormat. \BeginFormat sets up the preamble
+% for the \halign that will be used to create the table. \EndFormat
+% initiates the \halign-ment, which is terminated by \EndTable.
+
+
+% *********************************************************************
+% BEGIN TABLE, (DO HALIGN), END TABLE
+% *********************************************************************
+% BEGIN TABLE
+\def\BeginTable{%
+ \futurelet\!tnext\!ttBeginTable}
+
+\def\!ttBeginTable{%
+ \ifx [\!tnext
+ \def\!tnext{\!ttBeginTableA}%
+ \else
+ \def\!tnext{\!ttBeginTableA[c]}%
+ \fi
+ \!tnext}
+
+\def\!ttBeginTableA[#1]{%
+ \if #1u% % "unboxed" table
+ \ifmmode
+ \def\!ttEndTable{% % user had better be in display math mode
+ \relax}% % and have only one table at the outer level
+ \else % user had better be in vertical mode
+ \bgroup
+ \def\!ttEndTable{%
+ \egroup}%
+ \fi
+ \else
+ \hbox\bgroup $
+ \def\!ttEndTable{%
+ \egroup % for the \vtop, \vbox, or \vcenter, yet to come
+ $% for math mode
+ \egroup}% for the \hbox
+ \if #1t%
+ \vtop
+ \else
+ \if #1b%
+ \vbox
+ \else
+ \vcenter % math mode was essential for this
+ \fi
+ \fi
+ \bgroup % for the \vtop, \vbox, or \vcenter
+ \fi
+ \advance\!taRecursionLevel 1 % RecursionLevel governs initialization
+ \let\!ttRightGlue=\relax % This may be changed by \JustCenter, etc
+ \everycr={}
+ \ifnum \!taRecursionLevel=1
+ \!ttInitializeTable
+ \fi}
+
+% INITIALIZE TABLE
+% \bgroup
+% \catcode`\|=13
+% \catcode`\"=13
+% \catcode`\~=13
+% \gdef\!ttInitializeTable{%
+% \let\!ttTie=~ % Meanings of ~ and \- are
+% \let\!ttDH=\- % restored by \BeginTableParBox
+% \catcode`\|=\active
+% \catcode`\"=\active
+% \catcode`\~=\active
+% \def |{\unskip\!ttRightGlue&&}% Use rule-column template
+% \def\|{\unskip\!ttRightGlue&\omit\!ttAlternateVrule}%
+% % Override rule-column template
+% \def"{\unskip\!ttRightGlue&\omit&}% Omit rule-column template
+% \def~{\kern .5em}% ~ now has the width of a digit
+% \def\\{\!ttEndOfRow}%
+% \def\-{\!ttShortHrule}%
+% \def\={\!ttLongHrule}%
+% \def\_{\!ttFullHrule}%
+% \def\Left##1{##1\hfill\null}% \null prevents \unskip from
+% \def\Center##1{\hfill##1\hfill\null}% killing the \hfill
+% \def\Right##1{\hfill##1}%
+% \def\use{\!ttuse}%
+% \def\Use{\!ttUse}%
+% \the\EveryTable}
+% \egroup
+
+\bgroup
+ %catcode`\|=13
+ %catcode`\"=13
+ \catcode`\~=13
+ \gdef\!ttInitializeTable{%
+ \let\!ttTie=~ %
+ \let\!ttDH=\- %
+ %catcode`\|=\active
+ %catcode`\"=\active
+ \catcode`\~=\active
+ %def |{\unskip\!ttRightGlue&&}%
+ %def\|{\unskip\!ttRightGlue&\omit\!ttAlternateVrule}%
+ %def"{\unskip\!ttRightGlue&\omit&}%
+ \def~{\kern .5em}%
+ %def\\{\!ttEndOfRow}%
+ \def\\{\par}
+ %def\-{\!ttShortHrule}%
+ %def\={\!ttLongHrule}%
+ %def\_{\!ttFullHrule}%
+ \def\Left ##1{##1\hfill\null}% % \null prevents \unskip from
+ \def\Center##1{\hfill##1\hfill\null}% % killing the \hfill
+ \def\Right ##1{\hfill##1}%
+ \def\use{\!ttuse}%
+ \def\Use{\!ttUse}%
+ \the\EveryTable}% comes too soon
+\egroup
+
+\let\!ttRightGlue=\relax % This may be changed, in a group, by
+ % \JustCenter, etc
+
+% DO HALIGN: Invoked by END FORMAT (or the key ".")
+\def\!ttDoHalign{%
+ \baselineskip=0pt \lineskiplimit=0pt \lineskip=0pt %
+ \tabskip=0pt
+ \halign \the\!taTableSpread \bgroup
+ \span\the\!taPreamble
+ \ifx \!tfRowOfWidths \empty
+ \else
+ \!tfRowOfWidths \cr %
+ \fi}
+
+% END TABLE
+\def\EndTable{%
+ \egroup % finishes the \halign
+ \!ttEndTable}% closes off the table envirnoment set up by \BeginTable
+
+
+% *********************************************************************
+% END OF ROW PROCESSING
+% *********************************************************************
+
+% END OF ROW: When followed by
+% 0, inserts no strut
+% +, inserts an AugmentedTableStrut (with <x-height> and <x-depth>
+% as arguments
+% anything else, inserts a StandardTableStrut,
+% and finished off the row with a \cr.
+\def\!ttEndOfRow{%
+ \futurelet\!tnext\!ttTestForBlank}
+
+% TEST FOR BLANK
+\def\!ttTestForBlank{%
+% \!thMessage{At Test For Blank: \meaning\!tnext}
+ \ifx \!tnext\!thSpaceToken % the "usual" case
+ \!thx\!ttDoStandard
+ \else
+ \!thx\!ttTestForZero
+ \fi}
+
+% TEST FOR ZERO
+\def\!ttTestForZero{%
+ \ifx 0\!tnext
+ \!thx \!ttDoZero
+ \else
+ \!thx \!ttTestForPlus
+ \fi}
+
+% TEST FOR PLUS
+\def\!ttTestForPlus{%
+ \ifx +\!tnext
+ \!thx \!ttDoPlus
+ \else
+ \!thx \!ttDoStandard
+ \fi}
+
+% DO ZERO: No strut
+\def\!ttDoZero#1{% #1 eats the 0
+ \cr}
+
+% DO PLUS: Insert "Extra" strut; #2=extra height, #3=extra depth, both
+% as integers (units of \StrutUnit)
+\def\!ttDoPlus#1#2#3{% #1 eats the +
+ \AugmentedTableStrut{#2}{#3}%
+ \cr}
+
+% DO STANDARD: Insert standard table strut
+\def\!ttDoStandard{%
+ \StandardTableStrut
+ \cr}
+
+
+% *********************************************************************
+% ALTERNATE VRULES
+% *********************************************************************
+
+% A '\|' can appear in a rule-column in place of a '|', '"', or '&'.
+
+% If '\|' is immediately followed by a blank, a string of digits, or
+% (...) [... had better be a <dimen>], a \vrule is placed in the
+% rule column; the thickness of the \vrule follows TABLE's usual
+% conventions. Be sure to put a blank after a string of digits.
+
+% If '\|' is immediately followed by a '*', a user-specified default
+% "pseudo"-rule is placed in the rule column. This P.R. is specified
+% by the parameterless macro \PseudoVrule. For example,
+% to place a "double rule" into a rule column, you could make the definition
+% \def\PseudoVrule{\hfil\vrule \hskip1pt \vrule\hfil}
+
+% If none of the above cases applies, a non-space token follows '\|':
+% that token is placed in the rule-column. To put a '*' in a
+% rule-column, enter '\|{*}'. '\|\PseudoVrule' has the same effect
+% as '\|*'.
+
+% ALTERNATE VRULE
+\def\!ttAlternateVrule{%
+ \!tgGetValue{\!ttAVTestForCode}} % AV == Alternate Vrule
+
+% TEST FOR CODE (2)
+\def\!ttAVTestForCode{%
+ \ifnum \!tgCode=2 % (...) follows "\|"
+ \!thx\!ttInsertVrule % \InsertVrule ends with "&"
+ \else
+ \!thx\!ttAVTestForEmpty
+ \fi}
+
+% TEST FOR EMPTY (VALUE)
+\def\!ttAVTestForEmpty{%
+ \ifx \!tgValue\empty % non-digit after "\|"
+ \!thx\!ttAVTestForBlank
+ \else
+ \!thx\!ttInsertVrule % integer after "\|"
+ \fi}
+
+% TEST FOR BLANK
+\def\!ttAVTestForBlank{%
+ \ifx \!ttemp\!thSpaceToken % blank after "\|"
+ \!thx\!ttInsertVrule
+ \else
+ \!thx\!ttAVTestForStar
+ \fi}
+
+% TEST FOR STAR
+\def\!ttAVTestForStar{%
+ \ifx *\!ttemp % "*" after "\|"
+ \!thx\!ttInsertDefaultPR % PR == pseudo-rule
+ \else
+ \!thx\!ttGetPseudoVrule % "Anything else" after "\|"
+ \fi}
+
+% INSERT VRULE
+\def\!ttInsertVrule{%
+ \hfil
+ \vrule \!thWidth
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \LineThicknessFactor
+ \else
+ \!tgValue
+ \fi
+ \LineThicknessUnit
+ \else
+ \!tgValue
+ \fi
+ \hfil
+ &}
+
+% INSERT DEFAULT PSEUDO-RULE
+\def\!ttInsertDefaultPR*{%
+ \PseudoVrule % User-specified default pseudo-rule
+ &}
+
+% GET PSEUDO-RULE
+\def\!ttGetPseudoVrule#1{%
+ \toks0={#1}%
+ #1&}
+
+% DEFAULT PSEUDO-RULE
+\def\PseudoVrule{}
+
+
+% *********************************************************************
+% USE: Version of \multispan for rule-&-column tables
+% *********************************************************************
+
+% USE
+% \use <number> spans the next <number> data columns.
+
+\def\!ttuse#1{%
+ \ifnum #1>\plusone
+ \omit
+ \mscount=#1 % \mscount is in Plain
+ \advance\mscount by \minusone
+ \advance\mscount by \mscount
+ \!thLoop
+ \ifnum\mscount>\plusone
+ % \sp@n: from plain
+ \spanomit \advance\mscount\minusone
+ \repeat
+ \span
+ \fi}
+
+\def\!ttUse#1[{%
+ \!ttuse{#1}%
+ \ReFormat[}
+
+
+% *********************************************************************
+% HRULES
+% *********************************************************************
+
+% FULL HORIZONTAL RULE: Draws a rule across the table,
+% using \noalign{\hrule}
+\def\!ttFullHrule{%
+ \noalign
+ \bgroup
+ \!tgGetValue{\!ttFullHruleA}}
+
+\def\!ttFullHruleA{%
+ \!ttGetHalfRuleThickness % Sets \dimen0 to half of specified thickness
+ \hrule \!thHeight \dimen0 \!thDepth \dimen0
+ \penalty0 % so can break an ``unboxed'' table after a horizontal rule.
+ \egroup} % ends the \noalign
+
+% SHORT HORIZONTAL RULE: Draws a rule across 1 (or more) columns,
+% using \leaders; this rule doesn't extend across the neighboring
+% tabskip glues to join up with adjacent rule columns. By contrast
+% the LONG HORIZONTAL RULE below does just that.
+\def\!ttShortHrule{%
+ \omit
+ \!tgGetValue{\!ttShortHruleA}}
+
+\def\!ttShortHruleA{%
+ \!ttGetHalfRuleThickness % Sets \dimen0 to half of specified thickness
+ \leaders \hrule \!thHeight \dimen0 \!thDepth \dimen0 \hfill
+ \null % prevents an \unskip from annihilating the \leaders
+ \ignorespaces}
+
+% LONG HORIZONTAL RULE: This rule requires special coding.
+% It must be preceded and followed by '&', instead of the usual
+% '|' or '"'. However, '\_' can follow '\use' in the usual manner.
+% And in fact, to insert long-rules in two or more contiguous columns,
+% '\use' MUST be used with an argument = total number of columns involved.
+\def\!ttLongHrule{%
+ \omit\span\omit\span \!ttShortHrule}
+
+% GET RULE THICKNESS
+\def\!ttGetHalfRuleThickness{%
+ \dimen0 =
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \LineThicknessFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \LineThicknessUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi
+ \divide\dimen0 2 }
+
+
+% *********************************************************************
+% STRETCHING AND SHRINKING A TABLE
+% *********************************************************************
+
+% SET TABLE TO WIDTH <dimen>
+\def\SetTableToWidth#1{%
+ \!taTableSpread={to #1}}
+
+% WIDEN TABLE BY <dimen>
+\def\WidenTableBy#1{%
+ \ifdim #1=0pt
+ \!taTableSpread={}%
+ \else
+ \!taTableSpread={spread #1}%
+ \fi}
+
+\def\Expand{%
+ \SetTableToWidth{\hsize}}%
+
+\def\LongLines{%
+ \LeftTabskip =0pt plus 1fill
+ \RightTabskip=\LeftTabskip
+ \Expand}
+
+
+% *********************************************************************
+% REPOSITIONING COMMANDS (\JUSTLEFT, etc.)
+% *********************************************************************
+
+\def\JustLeft{%
+ \omit \let\!ttRightGlue=\hfill}
+\def\JustCenter{%
+ \omit \hfill\null \let\!ttRightGlue=\hfill}
+\def\JustRight{%
+ \omit \hfill\null}
+
+
+% *********************************************************************
+% Restore meaning of \\, and reset category codes
+% *********************************************************************
+\let\\=\!tacr
+
+% \catcode`\!=12
+% \catcode`\@=12
+
+\protect \endinput
diff --git a/tex/context/base/thrd-trg.mkii b/tex/context/base/thrd-trg.mkii
new file mode 100644
index 000000000..c0106f5a3
--- /dev/null
+++ b/tex/context/base/thrd-trg.mkii
@@ -0,0 +1,127 @@
+%D In order to support rotation over arbitrary angles, we need a sine
+%D and cosine calculator. For this purpose we borrow a few macros by
+%D David Carlisle (his trig package). Because local variables are
+%D used, I patched the macros a bit. Also, I used a few different names
+%D for variabels and macros and use existing auxiliary macros.
+
+\unprotect
+
+% compare: \number 0.5 \number -0.5 \number 1.5 \number -1.5
+%
+% so we need:
+
+\def\realnumber#1{\withoutpt\the\dimexpr#1\points\relax} % brrr
+
+\chardef \@iv = 4
+\chardef \@xc = 90 % was \nin@ty
+\chardef \@clxx = 180
+\chardef \@lxxi = 71
+\mathchardef \@mmmmlxviii = 4068
+\mathchardef \@xvi@k = 16384
+
+\chardef \tr@coeffz = 72
+\chardef \tr@coefb = 42
+\mathchardef \tr@coefc = 840
+\mathchardef \tr@coefd = 5040
+
+\def\tg@series
+ {\!!dimena\@lxxi\!!dimena
+ \divide\!!dimena\@mmmmlxviii
+ \edef\!!stringa{\withoutpt\the\!!dimena}%
+ \!!dimena\!!stringa\!!dimena
+ \edef\!!stringb{\withoutpt\the\!!dimena}%
+ \divide\!!dimena\tr@coeffz
+ \advance\!!dimena\minusone\onepoint
+ \!!dimena\!!stringb\!!dimena
+ \advance\!!dimena \tr@coefb\onepoint
+ \!!dimena\!!stringb\!!dimena
+ \advance\!!dimena -\tr@coefc\onepoint
+ \!!dimena\!!stringb\!!dimena
+ \advance\!!dimena \tr@coefd\onepoint
+ \!!dimena\!!stringa\!!dimena
+ \divide\!!dimena \tr@coefd}
+
+\def\tg@reduce#1#2%
+ {\!!dimena#1#2\@xc\onepoint
+ \advance\!!dimena#2-\@clxx\onepoint
+ \!!dimena-\!!dimena
+ \tg@@sin}
+
+\def\tg@@sin
+ {\ifdim\tg@reduce>+\else\ifdim\tg@reduce<-\else
+ \tg@series
+ \fi\fi}
+
+%D Calculating a sine is a two step process: first a value is
+%D calculated, and afterwards it can be used. This saves redundant
+%D calculations.
+
+\def\calculatesin#1%
+ {{\expandafter\ifx\csname sin \realnumber{#1}\endcsname\relax
+ \!!dimena#1\onepoint
+ \tg@@sin
+ \expandafter\xdef\csname sin \realnumber{#1}\endcsname{\withoutpt\the\!!dimena}%
+ \fi}}
+
+\def\calculatecos#1%
+ {{\expandafter\ifx\csname cos \realnumber{#1}\endcsname\relax
+ \!!dimena\@xc\onepoint
+ \advance\!!dimena-#1\onepoint
+ \tg@@sin
+ \expandafter\xdef\csname cos \realnumber{#1}\endcsname{\withoutpt\the\!!dimena}%
+ \fi}}
+
+\def\calculatetan#1%
+ {{\expandafter\ifx\csname tan \realnumber{#1}\endcsname\relax
+ \calculatesin{#1}%
+ \calculatecos{#1}%
+ \!!dimena\calculatedcos{#1}\onepoint
+ \divide\!!dimena\@iv
+ \!!dimenb\calculatedsin{#1}\onepoint
+ \!!dimenb\@xvi@k\!!dimenb
+ \divide\!!dimenb\!!dimena
+ \expandafter\xdef\csname tan \realnumber{#1}\endcsname{\withoutpt\the\!!dimenb}%
+ \fi}}
+
+%D The results are accessed with:
+
+\def\calculatedsin#1{\csname sin \realnumber{#1}\endcsname}
+\def\calculatedcos#1{\csname cos \realnumber{#1}\endcsname}
+\def\calculatedtan#1{\csname tan \realnumber{#1}\endcsname}
+
+%D A more save implementation would be:
+
+\def\calculatedsin#1{\executeifdefined{sin \realnumber{#1}}\!!zerocount}
+\def\calculatedcos#1{\executeifdefined{cos \realnumber{#1}}\!!plusone }
+\def\calculatedtan#1{\executeifdefined{tan \realnumber{#1}}\!!zerocount}
+
+%D The following permits cleaner overloading (\MKIV\ will only have
+%D these):
+
+\def\setcalculatedsin#1#2{\calculatesin{#2}\edef#1{\calculatedsin{#2}}}
+\def\setcalculatedcos#1#2{\calculatecos{#2}\edef#1{\calculatedcos{#2}}}
+\def\setcalculatedtan#1#2{\calculatetan{#2}\edef#1{\calculatedtan{#2}}}
+
+%D A few values are predefined, although, on todays systems there
+%D is no real reason for that. I've added the 270 ones and changed
+%D the -90 tan. Also, I prefer text (\type {\!!..} instead of
+%D counters \type {\..}.
+
+\expandafter\let\csname sin \realnumber{ 0}\endcsname\!!zerocount
+\expandafter\let\csname cos \realnumber{ 0}\endcsname\!!plusone
+\expandafter\let\csname sin \realnumber{ 90}\endcsname\!!plusone
+\expandafter\let\csname cos \realnumber{ 90}\endcsname\!!zerocount
+\expandafter\let\csname sin \realnumber{180}\endcsname\!!zerocount
+\expandafter\let\csname cos \realnumber{180}\endcsname\!!minusone
+\expandafter\let\csname sin \realnumber{270}\endcsname\!!minusone
+\expandafter\let\csname cos \realnumber{270}\endcsname\!!zerocount
+
+\expandafter\let\csname sin \realnumber{-90}\endcsname\!!minusone
+\expandafter\let\csname cos \realnumber{-90}\endcsname\!!zerocount
+
+\expandafter\def\csname tan \realnumber{ 90}\endcsname{\writestatus\m!systems{infinite tan +90}}
+\expandafter\def\csname tan \realnumber{-90}\endcsname{\writestatus\m!systems{infinite tan -90}}
+
+%D Usage: \type {\calculatesin{10}} and \type {\calculatedsin{10}}
+
+\protect \endinput
diff --git a/tex/context/base/toks-ini.lua b/tex/context/base/toks-ini.lua
new file mode 100644
index 000000000..ec60402d8
--- /dev/null
+++ b/tex/context/base/toks-ini.lua
@@ -0,0 +1,326 @@
+if not modules then modules = { } end modules ['toks-ini'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local format, gsub, texsprint = string.format, string.gsub, tex.sprint
+
+local ctxcatcodes = tex.ctxcatcodes
+
+--[[ldx--
+<p>This code is experimental and needs a cleanup. The visualizers will move to
+a module.</p>
+--ldx]]--
+
+-- 1 = command, 2 = modifier (char), 3 = controlsequence id
+--
+-- callback.register('token_filter', token.get_next)
+--
+-- token.get_next()
+-- token.expand()
+-- token.create()
+-- token.csname_id()
+-- token.csname_name(v)
+-- token.command_id()
+-- token.command_name(v)
+-- token.is_expandable()
+-- token.is_activechar()
+-- token.lookup(v)
+
+-- actually, we can use token registers to store tokens
+
+tokens = tokens or { }
+
+tokens.vbox = token.create("vbox")
+tokens.hbox = token.create("hbox")
+tokens.vtop = token.create("vtop")
+tokens.bgroup = token.create(utf.byte("{"), 1)
+tokens.egroup = token.create(utf.byte("}"), 2)
+
+tokens.letter = function(chr) return token.create(utf.byte(chr), 11) end
+tokens.other = function(chr) return token.create(utf.byte(chr), 12) end
+
+tokens.letters = function(str)
+ local t = { }
+ for chr in string.utfvalues(str) do
+ t[#t+1] = token.create(chr, 11)
+ end
+ return t
+end
+
+collectors = collectors or { }
+collectors.data = collectors.data or { }
+
+function tex.printlist(data)
+ callbacks.push('token_filter', function ()
+ callbacks.pop('token_filter') -- tricky but the nil assignment helps
+ return data
+ end)
+end
+
+function collectors.flush(tag)
+ tex.printlist(collectors.data[tag])
+end
+
+function collectors.test(tag)
+ tex.printlist(collectors.data[tag])
+end
+
+collectors.registered = { }
+
+function collectors.register(name)
+ collectors.registered[token.csname_id(name)] = name
+end
+
+--~ function collectors.install(tag,end_cs)
+--~ collectors.data[tag] = { }
+--~ local data = collectors.data[tag]
+--~ local call = token.command_id("call")
+--~ local relax = token.command_id("relax")
+--~ local endcs = token.csname_id(end_cs)
+--~ local expand = collectors.registered
+--~ local get = token.get_next -- so no callback!
+--~ while true do
+--~ local t = get()
+--~ local a, b = t[1], t[3]
+--~ if a == relax and b == endcs then
+--~ return
+--~ elseif a == call and expand[b] then
+--~ token.expand()
+--~ else
+--~ data[#data+1] = t
+--~ end
+--~ end
+--~ end
+
+function collectors.install(tag,end_cs)
+ collectors.data[tag] = { }
+ local data = collectors.data[tag]
+ local call = token.command_id("call")
+ local endcs = token.csname_id(end_cs)
+ local expand = collectors.registered
+ local get = token.get_next
+ while true do
+ local t = get()
+ local a, b = t[1], t[3]
+ if b == endcs then
+ tex.print('\\' ..end_cs)
+ return
+ elseif a == call and expand[b] then
+ token.expand()
+ else
+ data[#data+1] = t
+ end
+ end
+end
+
+function collectors.handle(tag,handle,flush)
+ collectors.data[tag] = handle(collectors.data[tag])
+ if flush then
+ collectors.flush(tag)
+ end
+end
+
+collectors.show_methods = { }
+
+function collectors.show(tag, method)
+ if type(tag) == "table" then
+ collectors.show_methods[method or 'a'](tag)
+ else
+ collectors.show_methods[method or 'a'](collectors.data[tag])
+ end
+end
+
+commands = commands or { }
+
+commands.letter = token.command_id("letter")
+commands.other = token.command_id("other_char")
+
+function collectors.default_words(t,str)
+ t[#t+1] = tokens.bgroup
+ t[#t+1] = token.create("red")
+ for i=1,#str do
+ t[#t+1] = tokens.other('*')
+ end
+ t[#t+1] = tokens.egroup
+end
+
+function collectors.with_words(tag,handle)
+ local t, w = { }, { }
+ handle = handle or collectors.default_words
+ local tagdata = collectors.data[tag]
+ for k=1,#tagdata do
+ local v = tagdata[k]
+ if v[1] == commands.letter then
+ w[#w+1] = v[2]
+ else
+ if #w > 0 then
+ handle(t,w)
+ w = { }
+ end
+ t[#t+1] = v
+ end
+ end
+ if #w > 0 then
+ handle(t,w)
+ end
+ collectors.data[tag] = t
+end
+
+function collectors.show_token(t)
+ if t then
+ local cmd, chr, id, cs, name = t[1], t[2], t[3], nil, token.command_name(t) or ""
+ if cmd == commands.letter or cmd == commands.other then
+ return format("%s-> %s -> %s", name, chr, utf.char(chr))
+ elseif id > 0 then
+ cs = token.csname_name(t) or nil
+ if cs then
+ return format("%s-> %s", name, cs)
+ elseif tonumber(chr) < 0 then
+ return format("%s-> %s", name, id)
+ else
+ return format("%s-> (%s,%s)", name, chr, id)
+ end
+ else
+ return format("%s", name)
+ end
+ else
+ return "no node"
+ end
+end
+
+function collectors.trace()
+ local t = token.get_next()
+ texio.write_nl(collectors.show_token(t))
+ return t
+end
+
+collectors.show_methods.a = function(data) -- no need to store the table, just pass directly
+ local template = "\\NC %s\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR "
+ texsprint(ctxcatcodes, "\\starttabulate[|T|Tr|cT|Tr|T|]")
+ texsprint(ctxcatcodes, format(template,"cmd","chr","","id","name"))
+ texsprint(ctxcatcodes, "\\HL")
+ for _,v in next, data do
+ local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", ""
+ local name = gsub(token.command_name(v) or "","_","\\_")
+ if id > 0 then
+ cs = token.csname_name(v) or ""
+ if cs ~= "" then cs = "\\string " .. cs end
+ else
+ id = ""
+ end
+ if cmd == commands.letter or cmd == commands.other then
+ sym = "\\char " .. chr
+ end
+ if tonumber(chr) < 0 then
+ texsprint(ctxcatcodes, format(template, name, "", sym, id, cs))
+ else
+ texsprint(ctxcatcodes, format(template, name, chr, sym, id, cs))
+ end
+ end
+ texsprint(ctxcatcodes, "\\stoptabulate")
+end
+
+collectors.show_methods.b_c = function(data,swap) -- no need to store the table, just pass directly
+ local template = "\\NC %s\\NC %s\\NC %s\\NC\\NR"
+ if swap then
+ texsprint(ctxcatcodes, "\\starttabulate[|Tl|Tl|Tr|]")
+ else
+ texsprint(ctxcatcodes, "\\starttabulate[|Tl|Tr|Tl|]")
+ end
+ texsprint(ctxcatcodes, format(template,"cmd","chr","name"))
+ texsprint(ctxcatcodes, "\\HL")
+ for _,v in next, data do
+ local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", ""
+ local name = gsub(token.command_name(v) or "","_","\\_")
+ if id > 0 then
+ cs = token.csname_name(v) or ""
+ end
+ if cmd == commands.letter or cmd == commands.other then
+ sym = "\\char " .. chr
+ elseif cs ~= "" then
+ if token.is_activechar(v) then
+ sym = "\\string " .. cs
+ else
+ sym = "\\string\\" .. cs
+ end
+ end
+ if swap then
+ texsprint(ctxcatcodes, format(template, name, sym, chr))
+ elseif tonumber(chr) < 0 then
+ texsprint(ctxcatcodes, format(template, name, "", sym))
+ else
+ texsprint(ctxcatcodes, format(template, name, chr, sym))
+ end
+ end
+ texsprint(ctxcatcodes, "\\stoptabulate")
+end
+
+-- Even more experimental ...
+
+collectors.show_methods.b = function(tag) collectors.show_methods.b_c(tag,false) end
+collectors.show_methods.c = function(tag) collectors.show_methods.b_c(tag,true ) end
+
+collectors.remapper = {
+ -- namespace
+}
+
+collectors.remapper.data = {
+ -- user mappings
+}
+
+function collectors.remapper.store(tag,class,key)
+ local s = collectors.remapper.data[class]
+ if not s then
+ s = { }
+ collectors.remapper.data[class] = s
+ end
+ s[key] = collectors.data[tag]
+ collectors.data[tag] = nil
+end
+
+function collectors.remapper.convert(tag,toks)
+ local data = collectors.remapper.data[tag]
+ local leftbracket, rightbracket = utf.byte('['), utf.byte(']')
+ local skipping = 0
+ -- todo: math
+ if data then
+ local t = { }
+ for s=1,#toks do
+ local tok = toks[s]
+ local one, two = tok[1], tok[2]
+ if one == 11 or one == 12 then
+ if two == leftbracket then
+ skipping = skipping + 1
+ t[#t+1] = tok
+ elseif two == rightbracket then
+ skipping = skipping - 1
+ t[#t+1] = tok
+ elseif skipping == 0 then
+ local new = data[two]
+ if new then
+ if #new > 1 then
+ for n=1,#new do
+ t[#t+1] = new[n]
+ end
+ else
+ t[#t+1] = new[1]
+ end
+ else
+ t[#t+1] = tok
+ end
+ else
+ t[#t+1] = tok
+ end
+ else
+ t[#t+1] = tok
+ end
+ end
+ return t
+ else
+ return toks
+ end
+end
diff --git a/tex/context/base/toks-ini.mkiv b/tex/context/base/toks-ini.mkiv
new file mode 100644
index 000000000..22deca745
--- /dev/null
+++ b/tex/context/base/toks-ini.mkiv
@@ -0,0 +1,78 @@
+%D \module
+%D [ file=toks-ini,
+%D version=2007.03.03,
+%D title=\CONTEXT\ Token Support,
+%D subtitle=Initialization,
+%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}{ConTeXt Token Support / Initialization}
+
+\registerctxluafile{toks-ini}{1.001}
+
+\unprotect
+
+%D Handy for manuals \unknown
+
+\unexpanded\def\starttokens [#1]{\ctxlua{collectors.install("#1", "stoptokens")}}
+\let\stoptokens \relax
+\def\flushtokens [#1]{\ctxlua{collectors.flush("#1")}}
+\def\showtokens [#1]{\ctxlua{collectors.show("#1")}}
+\def\testtokens [#1]{\ctxlua{collectors.with_words("#1")}}
+\def\registertoken #1{\ctxlua{collectors.register("#1")}}
+
+%D Inspired by a prototype by Taco for Thomas cum suis.
+
+% \defineremapper[babelgreek]
+%
+% \remapcharacter[babelgreek][`a]{\alpha}
+% \remapcharacter[babelgreek][`b]{\beta}
+% \remapcharacter[babelgreek][`c]{\gamma}
+% \remapcharacter[babelgreek][`d]{OEPS}
+%
+% \starttext
+%
+% [\startbabelgreek
+% a b c some stuff here \blank[big] oeps b d
+% \stopbabelgreek]
+%
+% [\babelgreek{some stuff here}]
+%
+% \stoptext
+
+% incompatible with mkii ! ! ! ! so we need other names here
+%
+% \def\dograbuntil#1#2%
+% {\long\def\next##1#1{#2##1}\next}
+%
+% \def\grabuntil#1%
+% {\expandafter\dograbuntil\expandafter{\csname#1\endcsname}}
+
+\def\dostartremapper#1%
+ {\ctxlua{collectors.install("#1", "\e!stop#1")}}
+
+\def\dostopremapper#1%
+ {\ctxlua{collectors.handle("#1",function(str) return collectors.remapper.convert("#1",str) end, true)}}
+
+\def\remaptokens#1%
+ {\ctxlua{collectors.handle("#1",function(str) return collectors.remapper.convert("#1",str) end)}}
+
+\unexpanded\def\defineremapper[#1]%
+ {\setvalue{\e!start#1}{\dostartremapper{#1}}%
+ \setvalue{\e!stop #1}{\dostopremapper {#1}}%
+ \def\next##1{\setvalue{#1}####1{\getvalue{\e!start#1}####1##1}}%
+ \expandafter\next\csname\e!stop#1\endcsname}
+
+\def\remapcharacter
+ {\dodoubleempty\doremapcharacter}
+
+\def\doremapcharacter[#1][#2]#3%
+ {\ctxlua{collectors.install("store", "ctxlua")}#3%
+ \ctxlua{collectors.remapper.store("store","#1",\number#2)}}
+
+\protect \endinput
diff --git a/tex/context/base/trac-deb.lua b/tex/context/base/trac-deb.lua
new file mode 100644
index 000000000..97753f3e9
--- /dev/null
+++ b/tex/context/base/trac-deb.lua
@@ -0,0 +1,187 @@
+if not modules then modules = { } end modules ['trac-deb'] = {
+ version = 1.001,
+ comment = "companion to trac-deb.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if not lmx then lmx = { } end
+if not lmx.variables then lmx.variables = { } end
+
+lmx.htmfile = function(name) return environment.jobname .. "-status.html" end
+lmx.lmxfile = function(name) return resolvers.find_file(name,'tex') end
+
+if not tracers then tracers = { } end
+if not tracers.list then tracers.list = { } end
+if not tracers.strings then tracers.strings = { } end
+
+tracers.strings.undefined = "undefined"
+
+local splitter = lpeg.splitat(":")
+local lpegmatch = lpeg.match
+
+function tracers.split(csname)
+ return lpegmatch(splitter,csname)
+end
+
+function tracers.type(csname)
+ tag, name = tracers.split(csname)
+ if tag then return tag else return nil end
+end
+
+function tracers.name(csname)
+ tag, name = tracers.split(csname)
+ if tag then return name else return csname end
+end
+
+function tracers.cs(csname)
+ tag, name = tracers.split(csname)
+ if tracers.types[tag] then
+ return tracers.types[tag](name)
+ else
+ return tracers.primitive(csname)
+ end
+end
+
+function tracers.dimen(name)
+ return (tex.dimen[name] and number.topoints(tex.dimen[name])) or tracers.strings.undefined
+end
+
+function tracers.count(name)
+ return tex.count[name] or tracers.strings.undefined
+end
+
+function tracers.toks(name)
+ return (tex.toks[name] and string.limit(tex.toks[name],40)) or tracers.strings.undefined
+end
+
+function tracers.primitive(name)
+ return tex[name] or tracers.strings.undefined
+end
+
+tracers.types = {
+ ['d'] = tracers.dimen,
+ ['c'] = tracers.count,
+ ['t'] = tracers.toks,
+ ['p'] = tracers.primitive
+}
+
+function tracers.knownlist(name)
+ return tracers.list[name] and #tracers.list[name] > 0
+end
+
+function tracers.showdebuginfo()
+ local variables = {
+ ['title'] = 'ConTeXt Debug Information',
+ ['color-background-one'] = lmx.get('color-background-green'),
+ ['color-background-two'] = lmx.get('color-background-blue'),
+ }
+ lmx.show('context-debug.lmx',variables)
+end
+
+function tracers.showerror()
+ local filename = status.filename
+ local linenumber = tonumber(status.linenumber or "0")
+ local variables = {
+ ['title'] = 'ConTeXt Error Information',
+ ['errormessage'] = status.lasterrorstring,
+ ['linenumber'] = status.linenumber,
+ ['color-background-one'] = lmx.get('color-background-yellow'),
+ ['color-background-two'] = lmx.get('color-background-purple'),
+ }
+ if not filename then
+ variables.filename, variables.errorcontext = 'unknown', 'error in filename'
+ elseif type(filename) == "number" then
+ variables.filename, variables.errorcontext = "<read " .. filename .. ">", 'unknown error'
+ elseif io.exists(filename) then
+ -- todo: use an input opener so that we also catch utf16 an reencoding
+ lines = io.lines(filename)
+ if lines then
+ local context = { }
+ n, m = 1, linenumber
+ b, e = m-10, m+10
+ s = string.len(tostring(e))
+ for line in lines do
+ if n > e then
+ break
+ elseif n > b then
+ if n == m then
+ context[#context+1] = string.format("%" .. s .. "d",n) .. " >> " .. line
+ else
+ context[#context+1] = string.format("%" .. s .. "d",n) .. " " .. line
+ end
+ end
+ n = n + 1
+ end
+ variables.filename, variables.errorcontext = filename, table.concat(context,"\n")
+ else
+ variables.filename, variables.errorcontext = filename, ""
+ end
+ else
+ variables.filename, variables.errorcontext = filename, 'file not found'
+ end
+ lmx.show('context-error.lmx',variables)
+end
+
+function tracers.overloaderror()
+ callback.register('show_error_hook', tracers.showerror)
+end
+
+tracers.list['scratch'] = {
+ 0, 2, 4, 6, 8
+}
+
+tracers.list['internals'] = {
+ 'p:hsize', 'p:parindent', 'p:leftskip','p:rightskip',
+ 'p:vsize', 'p:parskip', 'p:baselineskip', 'p:lineskip', 'p:topskip'
+}
+
+tracers.list['context'] = {
+ 'd:lineheight',
+ 'c:realpageno', 'c:pageno', 'c:subpageno'
+}
+
+-- dumping the hash
+
+-- \starttext
+-- \ctxlua{tracers.dump_hash()}
+-- \stoptext
+
+local saved = { }
+
+function tracers.save_hash()
+ saved = tex.hashtokens()
+end
+
+function tracers.dump_hash(filename,delta)
+ filename = filename or tex.jobname .. "-hash.log"
+ local list = { }
+ local hash = tex.hashtokens()
+ local command_name = token.command_name
+ for name, token in next, hash do
+ if not delta or not saved[name] then
+ -- token: cmd, chr, csid -- combination cmd,chr determines name
+ local kind = command_name(token)
+ local dk = list[kind]
+ if not dk then
+ -- a bit funny names but this sorts better (easier to study)
+ dk = { names = { }, found = 0, code = token[1] }
+ list[kind] = dk
+ end
+ dk.names[name] = { token[2], token[3] }
+ dk.found = dk.found + 1
+ end
+ end
+ io.savedata(filename,table.serialize(list,true))
+end
+
+function tracers.register_dump_hash(delta)
+ if delta then
+ tracers.save_hash()
+ end
+ main.register_stop_actions(1,function() tracers.dump_hash(nil,true) end) -- at front
+end
+
+directives.register("system.dumphash", function() tracers.register_dump_hash(false) end)
+directives.register("system.dumpdelta", function() tracers.register_dump_hash(true ) end)
diff --git a/tex/context/base/trac-deb.mkiv b/tex/context/base/trac-deb.mkiv
new file mode 100644
index 000000000..b004cdeb4
--- /dev/null
+++ b/tex/context/base/trac-deb.mkiv
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=trac-deb,
+%D version=2005.11.06,
+%D title=\CONTEXT\ Tracing Macros,
+%D subtitle=Debugger,
+%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}{ConTeXt Tracing Macros / Debugger}
+
+\registerctxluafile{trac-deb}{1.001}
+
+\def\showdebuginfo{\ctxlua{tracers.showdebuginfo()}}
+\def\overloaderror{\ctxlua{tracers.overloaderror()}}
+
+\def\breakpoint{\showdebuginfo\wait}
+
+\appendtoks
+ \ctxlua {
+ if debugger.tracing() then
+ debugger.enable() ;
+ end
+ }%
+\to \everyjob
+
+\appendtoks
+ \ctxlua {
+ if debugger.tracing() then
+ debugger.disable() ;
+ debugger.savestats("\jobname-luacalls.log") ;
+ end
+ }%
+\to \everybye
+
+\def\showtrackers {\ctxlua{trackers.show()}}
+\def\enabletrackers [#1]{\ctxlua{trackers.enable("#1")}}
+\def\disabletrackers [#1]{\ctxlua{trackers.disable("#1")}}
+\def\resettrackers {\ctxlua{trackers.reset()}}
+
+\def\showdirectives {\ctxlua{directives.show()}}
+\def\enabledirectives [#1]{\ctxlua{directives.enable("#1")}}
+\def\disabledirectives [#1]{\ctxlua{directives.disable("#1")}}
+
+\def\showexperiments {\ctxlua{experiments.show()}}
+\def\enableexperiments [#1]{\ctxlua{experiments.enable("#1")}}
+\def\disableexperiments[#1]{\ctxlua{experiments.disable("#1")}}
diff --git a/tex/context/base/trac-inf.lua b/tex/context/base/trac-inf.lua
new file mode 100644
index 000000000..72f03675a
--- /dev/null
+++ b/tex/context/base/trac-inf.lua
@@ -0,0 +1,197 @@
+if not modules then modules = { } end modules ['trac-inf'] = {
+ version = 1.001,
+ comment = "companion to trac-inf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local statusinfo, n, registered = { }, 0, { }
+
+statistics = statistics or { }
+
+statistics.enable = true
+statistics.threshold = 0.05
+
+-- timing functions
+
+local clock = os.gettimeofday or os.clock
+
+local notimer
+
+function statistics.hastimer(instance)
+ return instance and instance.starttime
+end
+
+function statistics.resettiming(instance)
+ if not instance then
+ notimer = { timing = 0, loadtime = 0 }
+ else
+ instance.timing, instance.loadtime = 0, 0
+ end
+end
+
+function statistics.starttiming(instance)
+ if not instance then
+ notimer = { }
+ instance = notimer
+ end
+ 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
+ else
+--~ logs.report("system","nested timing (%s)",tostring(instance))
+ end
+ instance.timing = it + 1
+end
+
+function statistics.stoptiming(instance, report)
+ if not instance then
+ instance = notimer
+ end
+ if instance then
+ 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
+ statistics.report("load time %0.3f",loadtime)
+ end
+ instance.timing = 0
+ return loadtime
+ end
+ end
+ end
+ return 0
+end
+
+function statistics.elapsedtime(instance)
+ if not instance then
+ instance = notimer
+ end
+ return format("%0.3f",(instance and instance.loadtime) or 0)
+end
+
+function statistics.elapsedindeed(instance)
+ if not instance then
+ instance = notimer
+ end
+ local t = (instance and instance.loadtime) or 0
+ return t > statistics.threshold
+end
+
+function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds
+ if statistics.elapsedindeed(instance) then
+ return format("%s seconds %s", statistics.elapsedtime(instance),rest or "")
+ end
+end
+
+-- general function
+
+function statistics.register(tag,fnc)
+ if statistics.enable and type(fnc) == "function" then
+ local rt = registered[tag] or (#statusinfo + 1)
+ statusinfo[rt] = { tag, fnc }
+ registered[tag] = rt
+ if #tag > n then n = #tag end
+ end
+end
+
+function statistics.show(reporter)
+ if statistics.enable then
+ if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end
+ -- this code will move
+ local register = statistics.register
+ register("luatex banner", function()
+ return string.lower(status.banner)
+ end)
+ register("control sequences", function()
+ return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
+ end)
+ register("callbacks", function()
+ local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
+ return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
+ end)
+ register("current memory usage", statistics.memused)
+ register("runtime",statistics.runtime)
+-- --
+ for i=1,#statusinfo do
+ local s = statusinfo[i]
+ local r = s[2]()
+ if r then
+ reporter(s[1],r,n)
+ end
+ end
+ texio.write_nl("") -- final newline
+ statistics.enable = false
+ end
+end
+
+function statistics.show_job_stat(tag,data,n)
+ texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data))
+end
+
+function statistics.memused() -- no math.round yet -)
+ local round = math.round or math.floor
+ return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+end
+
+if statistics.runtime then
+ -- already loaded and set
+elseif luatex and luatex.starttime then
+ statistics.starttime = luatex.starttime
+ statistics.loadtime = 0
+ statistics.timing = 0
+else
+ statistics.starttiming(statistics)
+end
+
+function statistics.runtime()
+ statistics.stoptiming(statistics)
+ return statistics.formatruntime(statistics.elapsedtime(statistics))
+end
+
+function statistics.formatruntime(runtime)
+ return format("%s seconds", statistics.elapsedtime(statistics))
+end
+
+function statistics.timed(action,report)
+ local timer = { }
+ report = report or logs.simple
+ statistics.starttiming(timer)
+ action()
+ statistics.stoptiming(timer)
+ report("total runtime: %s",statistics.elapsedtime(timer))
+end
+
+-- where, not really the best spot for this:
+
+commands = commands or { }
+
+local timer
+
+function commands.resettimer()
+ statistics.resettiming(timer)
+ statistics.starttiming(timer)
+end
+
+function commands.elapsedtime()
+ statistics.stoptiming(timer)
+ tex.sprint(statistics.elapsedtime(timer))
+end
+
+commands.resettimer()
diff --git a/tex/context/base/trac-lmx.lua b/tex/context/base/trac-lmx.lua
new file mode 100644
index 000000000..664815c66
--- /dev/null
+++ b/tex/context/base/trac-lmx.lua
@@ -0,0 +1,223 @@
+if not modules then modules = { } end modules ['trac-lmx'] = {
+ version = 1.002,
+ comment = "companion to trac-lmx.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: use lpeg instead (although not really needed)
+
+local gsub, format, concat, byte = string.gsub, string.format, table.concat, string.byte
+
+lmx = lmx or { }
+
+local escapes = {
+ ['&'] = '&amp;',
+ ['<'] = '&lt;',
+ ['>'] = '&gt;',
+ ['"'] = '&quot;'
+}
+
+-- variables
+
+lmx.variables = { } -- global, shared
+
+local lmxvariables = lmx.variables
+
+lmxvariables['title-default'] = 'ConTeXt LMX File'
+lmxvariables['title'] = lmx.variables['title-default']
+lmxvariables['color-background-green'] = '#4F6F6F'
+lmxvariables['color-background-blue'] = '#6F6F8F'
+lmxvariables['color-background-yellow'] = '#8F8F6F'
+lmxvariables['color-background-purple'] = '#8F6F8F'
+lmxvariables['color-background-body'] = '#808080'
+lmxvariables['color-background-main'] = '#3F3F3F'
+lmxvariables['color-background-one'] = lmxvariables['color-background-green']
+lmxvariables['color-background-two'] = lmxvariables['color-background-blue']
+
+function lmx.set(key, value)
+ lmxvariables[key] = value
+end
+
+function lmx.get(key)
+ return lmxvariables[key] or ""
+end
+
+-- helpers
+
+local variables, result = { } -- we assume no nesting
+
+local function do_print(one,two,...)
+ if two then
+ result[#result+1] = concat { one, two, ... }
+ else
+ result[#result+1] = one
+ end
+end
+
+local function do_escape(str)
+ str = tostring(str)
+ str = gsub(str,'&','&amp;')
+ str = gsub(str,'[<>"]',escapes)
+ return str
+end
+
+local function do_urlescaped(str)
+ return (gsub(str,"[^%a%d]",format("%%0x",byte("%1"))))
+end
+
+function do_type(str)
+ if str then do_print("<tt>" .. do_escape(str) .. "</tt>") end
+end
+
+local function do_variable(str)
+ return variables[str] or lmxvariables[str] -- or format("<!-- unset lmx instance variable: %s -->",str or "?")
+end
+
+function lmx.loadedfile(name)
+ name = (resolvers and resolvers.find_file and resolvers.find_file(name)) or name
+ return io.loaddata(name)
+end
+
+local function do_include(filename)
+ local stylepath = do_variable('includepath')
+ local data = lmx.loadedfile(filename)
+ if (not data or data == "") and stylepath ~= "" then
+ data = lmx.loadedfile(file.join(stylepath,filename))
+ end
+ if not data or data == "" then
+ data = format("<!-- unknown lmx include file: %s -->",filename)
+ end
+ return data
+end
+
+lmx.print = do_print
+lmx.type = do_type
+lmx.escape = do_escape
+lmx.urlescape = do_escape
+lmx.variable = do_variable
+lmx.include = do_include
+
+function lmx.pv(str)
+ do_print(do_variable(str) or "")
+end
+
+function lmx.tv(str)
+ lmx.type(do_variable(str) or "")
+end
+
+local template = [[
+ local definitions = { }
+ local p, v, e, t, pv, tv = lmx.print, lmx.variable, lmx.escape, lmx.type, lmx.pv, lmx.tv
+ %s
+]]
+
+local cache = { }
+
+local trace = false
+
+function lmx.new(data,variables)
+ data = data or ""
+ local known = cache[data]
+ if not known then
+ local definitions = { }
+ data = gsub(data,"<%?lmx%-include%s+(.-)%s-%?>", function(filename)
+ return lmx.include(filename)
+ end)
+ local definitions = { }
+ data = gsub(data,"<%?lmx%-define%-begin%s+(%S-)%s-%?>(.-)<%?lmx%-define%-end%s-%?>", function(tag,content)
+ definitions[tag] = content
+ return ""
+ end)
+ data = gsub(data,"<%?lmx%-resolve%s+(%S-)%s-%?>", function(tag)
+ return definitions[tag] or ""
+ end)
+ data = gsub(data .. "<?lua ?>","(.-)<%?lua%s+(.-)%s*%?>", function(txt,lua)
+ txt = gsub(txt,"%c+","\n")
+ return format("p(%q)%s ",txt,lua) -- nb! space
+ end)
+ data = format(template,data)
+ known = {
+ data = trace and data,
+ variables = variables or { },
+ converter = loadstring(data),
+ }
+ elseif variables then
+ known.variables = variables
+ end
+ return known, known.variables
+end
+
+function lmx.reset(self)
+ self.variables = { }
+end
+
+function lmx.result(self)
+ if trace then
+ return self.data
+ else
+ variables, result = self.variables, { }
+ self.converter()
+ return concat(result)
+ end
+end
+
+-- file converter
+
+local loaded = { }
+
+function lmx.convert(templatefile,resultfile,variables)
+ local data = loaded[templatefile]
+ if not data then
+ data = lmx.new(lmx.loadedfile(templatefile),variables)
+ loaded[template] = data
+ elseif variables then
+ data.variables = variables
+ end
+ local result = lmx.result(data)
+ if resultfile then
+ io.savedata(resultfile,result)
+ else
+ return lmx.result(data,result)
+ end
+end
+
+-- these can be overloaded; we assume that the os handles filename associations
+
+lmx.lmxfile = function(filename) return filename end -- beware, these can be set!
+lmx.htmfile = function(filename) return filename end -- beware, these can be set!
+
+if os.type == "windows" then
+ lmx.popupfile = function(filename) os.execute("start " .. filename) end
+else
+ lmx.popupfile = function(filename) os.execute(filename) end
+end
+
+function lmx.make(name,variables)
+ local lmxfile = lmx.lmxfile(name)
+ local htmfile = lmx.htmfile(name)
+ if lmxfile == htmfile then
+ htmfile = gsub(lmxfile, "%.%a+$", "html")
+ end
+ lmx.convert(lmxfile,htmfile,variables)
+ return htmfile
+end
+
+function lmx.show(name,variables)
+ local htmfile = lmx.make(name,variables)
+ lmx.popupfile(htmfile)
+ return htmfile
+end
+
+-- test
+
+--~ print(lmx.result(lmx.new(io.loaddata("t:/sources/context-timing.lmx"))))
+
+-- command line
+
+if arg then
+ if arg[1] == "--show" then if arg[2] then lmx.show (arg[2]) end
+ elseif arg[1] == "--convert" then if arg[2] then lmx.convert(arg[2], arg[3] or "temp.html") end
+ end
+end
diff --git a/tex/context/base/trac-lmx.mkiv b/tex/context/base/trac-lmx.mkiv
new file mode 100644
index 000000000..a47d2b8bb
--- /dev/null
+++ b/tex/context/base/trac-lmx.mkiv
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=trac-lmx,
+%D version=2005.09.02,
+%D title=\CONTEXT\ Tracing Macros,
+%D subtitle=LMX,
+%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}{ConTeXt Tracing Macros / LMX}
+
+\registerctxluafile{trac-lmx}{1.001}
diff --git a/tex/context/base/trac-log.lua b/tex/context/base/trac-log.lua
new file mode 100644
index 000000000..0d4a1b0a9
--- /dev/null
+++ b/tex/context/base/trac-log.lua
@@ -0,0 +1,320 @@
+if not modules then modules = { } end modules ['trac-log'] = {
+ version = 1.001,
+ comment = "companion to trac-log.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this is old code that needs an overhaul
+
+--~ io.stdout:setvbuf("no")
+--~ io.stderr:setvbuf("no")
+
+local write_nl, write = texio.write_nl or print, texio.write or io.write
+local format, gmatch = string.format, string.gmatch
+local texcount = tex and tex.count
+
+if texlua then
+ write_nl = print
+ write = io.write
+end
+
+--[[ldx--
+<p>This is a prelude to a more extensive logging module. For the sake
+of parsing log files, in addition to the standard logging we will
+provide an <l n='xml'/> structured file. Actually, any logging that
+is hooked into callbacks will be \XML\ by default.</p>
+--ldx]]--
+
+logs = logs or { }
+logs.xml = logs.xml or { }
+logs.tex = logs.tex or { }
+
+--[[ldx--
+<p>This looks pretty ugly but we need to speed things up a bit.</p>
+--ldx]]--
+
+logs.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
+]]
+
+logs.levels = {
+ ['error'] = 1,
+ ['warning'] = 2,
+ ['info'] = 3,
+ ['debug'] = 4,
+}
+
+logs.functions = {
+ 'report', 'start', 'stop', 'push', 'pop', 'line', 'direct',
+ 'start_run', 'stop_run',
+ 'start_page_number', 'stop_page_number',
+ 'report_output_pages', 'report_output_log',
+ 'report_tex_stat', 'report_job_stat',
+ 'show_open', 'show_close', 'show_load',
+}
+
+logs.tracers = {
+}
+
+logs.level = 0
+logs.mode = string.lower((os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"))
+
+function logs.set_level(level)
+ logs.level = logs.levels[level] or level
+end
+
+function logs.set_method(method)
+ for _, v in next, logs.functions do
+ logs[v] = logs[method][v] or function() end
+ end
+end
+
+-- tex logging
+
+function logs.tex.report(category,fmt,...) -- new
+ if fmt then
+ write_nl(category .. " | " .. format(fmt,...))
+ else
+ write_nl(category .. " |")
+ end
+end
+
+function logs.tex.line(fmt,...) -- new
+ if fmt then
+ write_nl(format(fmt,...))
+ else
+ write_nl("")
+ end
+end
+
+--~ function logs.tex.start_page_number()
+--~ local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+--~ if real > 0 then
+--~ if user > 0 then
+--~ if sub > 0 then
+--~ write(format("[%s.%s.%s",real,user,sub))
+--~ else
+--~ write(format("[%s.%s",real,user))
+--~ end
+--~ else
+--~ write(format("[%s",real))
+--~ end
+--~ else
+--~ write("[-")
+--~ end
+--~ end
+
+--~ function logs.tex.stop_page_number()
+--~ write("]")
+--~ end
+
+local real, user, sub
+
+function logs.tex.start_page_number()
+ real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+end
+
+function logs.tex.stop_page_number()
+ if real > 0 then
+ if user > 0 then
+ if sub > 0 then
+ logs.report("pages", "flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ else
+ logs.report("pages", "flushing realpage %s, userpage %s",real,user)
+ end
+ else
+ logs.report("pages", "flushing realpage %s",real)
+ end
+ else
+ logs.report("pages", "flushing page")
+ end
+ io.flush()
+end
+
+logs.tex.report_job_stat = statistics.show_job_stat
+
+-- xml logging
+
+function logs.xml.report(category,fmt,...) -- new
+ if fmt then
+ write_nl(format("<r category='%s'>%s</r>",category,format(fmt,...)))
+ else
+ write_nl(format("<r category='%s'/>",category))
+ end
+end
+function logs.xml.line(fmt,...) -- new
+ if fmt then
+ write_nl(format("<r>%s</r>",format(fmt,...)))
+ else
+ write_nl("<r/>")
+ end
+end
+
+function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
+function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
+function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
+function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
+
+function logs.xml.start_run()
+ write_nl("<?xml version='1.0' standalone='yes'?>")
+ write_nl("<job>") -- xmlns='www.pragma-ade.com/luatex/schemas/context-job.rng'
+ write_nl("")
+end
+
+function logs.xml.stop_run()
+ write_nl("</job>")
+end
+
+function logs.xml.start_page_number()
+ write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno))
+end
+
+function logs.xml.stop_page_number()
+ write("/>")
+ write_nl("")
+end
+
+function logs.xml.report_output_pages(p,b)
+ write_nl(format("<v k='pages' v='%s'/>", p))
+ write_nl(format("<v k='bytes' v='%s'/>", b))
+ write_nl("")
+end
+
+function logs.xml.report_output_log()
+end
+
+function logs.xml.report_tex_stat(k,v)
+ texiowrite_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
+end
+
+local level = 0
+
+function logs.xml.show_open(name)
+ level = level + 1
+ texiowrite_nl(format("<f l='%s' n='%s'>",level,name))
+end
+
+function logs.xml.show_close(name)
+ texiowrite("</f> ")
+ level = level - 1
+end
+
+function logs.xml.show_load(name)
+ texiowrite_nl(format("<f l='%s' n='%s'/>",level+1,name))
+end
+
+--
+
+local name, banner = 'report', 'context'
+
+local function report(category,fmt,...)
+ if fmt then
+ write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
+ elseif category then
+ write_nl(format("%s | %s",name,category))
+ else
+ write_nl(format("%s |",name))
+ end
+end
+
+local function simple(fmt,...)
+ if fmt then
+ write_nl(format("%s | %s",name,format(fmt,...)))
+ else
+ write_nl(format("%s |",name))
+ end
+end
+
+function logs.setprogram(_name_,_banner_,_verbose_)
+ name, banner = _name_, _banner_
+ if _verbose_ then
+ trackers.enable("resolvers.locating")
+ end
+ logs.set_method("tex")
+ logs.report = report -- also used in libraries
+ logs.simple = simple -- only used in scripts !
+ if utils then
+ utils.report = simple
+ end
+ logs.verbose = _verbose_
+end
+
+function logs.setverbose(what)
+ if what then
+ trackers.enable("resolvers.locating")
+ else
+ trackers.disable("resolvers.locating")
+ end
+ logs.verbose = what or false
+end
+
+function logs.extendbanner(_banner_,_verbose_)
+ banner = banner .. " | ".. _banner_
+ if _verbose_ ~= nil then
+ logs.setverbose(what)
+ end
+end
+
+logs.verbose = false
+logs.report = logs.tex.report
+logs.simple = logs.tex.report
+
+function logs.reportlines(str) -- todo: <lines></lines>
+ for line in gmatch(str,"(.-)[\n\r]") do
+ logs.report(line)
+ end
+end
+
+function logs.reportline() -- for scripts too
+ logs.report()
+end
+
+logs.simpleline = logs.reportline
+
+function logs.reportbanner() -- for scripts too
+ logs.report(banner)
+end
+
+function logs.help(message,option)
+ logs.reportbanner()
+ logs.reportline()
+ logs.reportlines(message)
+ local moreinfo = logs.moreinfo or ""
+ if moreinfo ~= "" and option ~= "nomoreinfo" then
+ logs.reportline()
+ logs.reportlines(moreinfo)
+ end
+end
+
+logs.set_level('error')
+logs.set_method('tex')
+
+function logs.system(whereto,process,jobname,category,...)
+ for i=1,10 do
+ local f = io.open(whereto,"a")
+ if f then
+ f:write(format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)))
+ f:close()
+ break
+ else
+ sleep(0.1)
+ end
+ end
+end
+
+--~ local syslogname = "oeps.xxx"
+--~
+--~ for i=1,10 do
+--~ logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
+--~ end
+
+function logs.fatal(where,...)
+ logs.report(where,"fatal error: %s, aborting now",format(...))
+ os.exit()
+end
diff --git a/tex/context/base/trac-tex.mkiv b/tex/context/base/trac-tex.mkiv
new file mode 100644
index 000000000..9c596feab
--- /dev/null
+++ b/tex/context/base/trac-tex.mkiv
@@ -0,0 +1,55 @@
+%D \module
+%D [ file=trac-tex,
+%D version=2009.07.20,
+%D title=\CONTEXT\ Tracking Macros,
+%D subtitle=\TEX,
+%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 Tracking Macros / TeX}
+
+%D All tracing flags at the \TEX\ end will be redone this way so
+%D that we have a similar mechanism for \TEX\ and \LUA. Also, the
+%D currently used if's might become conditionals.
+
+\unprotect
+
+% \def\enabletextracerwhatever {...}
+% \def\disabletextracerwhatever{...}
+
+\let\alltextracers\empty % so that we can report available tracers
+
+\def\installtextracer#1%
+ {\addtocommalist{#1}\alltextracers}
+
+\def\enabletextracers [#1]{\processcommalist[#1]\doenabletextracer}
+\def\disabletextracers[#1]{\processcommalist[#1]\dodisabletextracer}
+
+\def\doenabletextracer #1{\csname enabletracer#1\endcsname}
+\def\dodisabletextracer#1{\csname disabletracer#1\endcsname}
+
+% context --directives=system.nostatistics ...
+
+\def\nomkivstatistics{\ctxlua{statistics.enable = false}} % for taco
+
+\def\tracersdumphash {\ctxlua{tracers.register_dump_hash(false)}}
+\def\tracersdumpdelta{\ctxlua{tracers.register_dump_hash(true)}}
+
+% wrong place:
+
+\def\traceluausage
+ {\dosingleempty\dotraceluausage}
+
+\def\dotraceluausage[#1]%
+ {\ctxlua{debugger.enable()}%
+ \appendtoks
+ \ctxlua{debugger.disable() debugger.showstats(print,\doifnumberelse{#1}{#1}{5000})}^
+ \to \everybye
+ \gdef\dotraceluausage[#1]{}}
+
+\protect \endinput
diff --git a/tex/context/base/trac-tim.lua b/tex/context/base/trac-tim.lua
new file mode 100644
index 000000000..a8725bb5c
--- /dev/null
+++ b/tex/context/base/trac-tim.lua
@@ -0,0 +1,160 @@
+if not modules then modules = { } end modules ['trac-tim'] = {
+ version = 1.001,
+ comment = "companion to m-timing.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, gsub = string.format, string.gsub
+local concat, sort = table.concat, table.sort
+local next, tonumber = next, tonumber
+
+plugins = plugins or { }
+plugins.progress = plugins.progress or { }
+
+local progress = plugins.progress
+
+progress = progress or { }
+
+progress.defaultfilename = ((tex and tex.jobname) or "whatever") .. "-luatex-progress"
+
+local params = {
+ "cs_count",
+ "dyn_used",
+ "elapsed_time",
+ "luabytecode_bytes",
+ "luastate_bytes",
+ "max_buf_stack",
+ "obj_ptr",
+ "pdf_mem_ptr",
+ "pdf_mem_size",
+ "pdf_os_cntr",
+-- "pool_ptr", -- obsolete
+ "str_ptr",
+}
+
+-- storage
+
+local last = os.clock()
+local data = { }
+
+function progress.save()
+ io.savedata((name or progress.defaultfilename) .. ".lut",table.serialize(data,true))
+ data = { }
+end
+
+function progress.store()
+ local c = os.clock()
+ local t = {
+ elapsed_time = c - last,
+ node_memory = nodes.usage(),
+ }
+ for k, v in next, params do
+ if status[v] then t[v] = status[v] end
+ end
+ data[#data+1] = t
+ last = c
+end
+
+-- conversion
+
+local processed = { }
+
+local function convert(name)
+ name = ((name ~= "") and name) or progress.defaultfilename
+ if not processed[name] then
+ local names, top, bot, pages, paths, keys = { }, { }, { }, 0, { }, { }
+ local data = io.loaddata(name .. ".lut")
+ if data then data = loadstring(data) end
+ if data then data = data() end
+ if data then
+ pages = #data
+ if pages > 1 then
+ local factor = 100
+ for k=1,#data do
+ for k, v in next, data[k].node_memory do
+ keys[k] = true
+ end
+ end
+ for k=1,#data do
+ local m = data[k].node_memory
+ for k, v in next, keys do
+ if not m[k] then m[k] = 0 end
+ end
+ end
+ local function path(tag,subtag)
+ local b, t, s = nil, nil, { }
+ for k=1,#data do
+ local v = data[k][tag]
+ v = v and (subtag and v[subtag]) or v
+ if v then
+ v = tonumber(v)
+ if b then
+ if v > t then t = v end
+ if v < b then b = v end
+ else
+ t = v
+ b = v
+ end
+ s[k] = v
+ else
+ s[k] = 0
+ end
+ end
+ local tagname = subtag or tag
+ top[tagname] = gsub(format("%.3f",t),"%.000$","")
+ bot[tagname] = gsub(format("%.3f",b),"%.000$","")
+ local delta = t-b
+ if delta == 0 then
+ delta = 1
+ else
+ delta = factor/delta
+ end
+ for k=1,#s do
+ s[k] = "(" .. k .. "," .. (s[k]-b)*delta .. ")"
+ end
+ paths[tagname] = concat(s,"--")
+ end
+ for _, tag in next, params do
+ path(tag)
+ end
+ for tag, _ in next, keys do
+ path("node_memory",tag)
+ names[#names+1] = tag
+ end
+ pages = pages - 1
+ end
+ end
+ sort(names)
+ processed[name] = {
+ names = names,
+ top = top,
+ bot = bot,
+ pages = pages,
+ paths = paths,
+ }
+ end
+ return processed[name]
+end
+
+progress.convert = convert
+
+function progress.bot(name,tag)
+ return convert(name).bot[tag] or 0
+end
+function progress.top(name,tag)
+ return convert(name).top[tag] or 0
+end
+function progress.pages(name,tag)
+ return convert(name).pages or 0
+end
+function progress.path(name,tag)
+ return convert(name).paths[tag] or "origin"
+end
+function progress.nodes(name)
+ return convert(name).names or { }
+end
+function progress.parameters(name)
+ return params -- shared
+end
diff --git a/tex/context/base/trac-tra.lua b/tex/context/base/trac-tra.lua
new file mode 100644
index 000000000..052e4bba7
--- /dev/null
+++ b/tex/context/base/trac-tra.lua
@@ -0,0 +1,341 @@
+if not modules then modules = { } end modules ['trac-tra'] = {
+ version = 1.001,
+ comment = "companion to trac-tra.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- the <anonymous> 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)
+
+local debug = require "debug"
+
+local getinfo = debug.getinfo
+local type, next = type, next
+local concat = table.concat
+local format, find, lower, gmatch, gsub = string.format, string.find, string.lower, string.gmatch, string.gsub
+
+debugger = debugger or { }
+
+local counters = { }
+local names = { }
+
+-- 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
+ local cf = counters[f]
+ if cf == nil then
+ counters[f] = 1
+ names[f] = n
+ else
+ 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 '<anonymous>'
+ else
+ -- source short_src linedefined what name namewhat nups func
+ local name = n.name or n.namewhat or n.what
+ if not name or name == "" then name = "?" end
+ return format("%s : %s : %s", n.short_src or "unknown source", n.linedefined or "--", name)
+ end
+ else
+ return "unknown"
+ 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 next, counters do
+ if count > threshold then
+ local name = getname(func)
+ if not find(name,"for generator") then
+ printer(format("%8i %s", count, name))
+ total = total + count
+ end
+ 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
+
+-- 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 next, 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
+ debugger.showstats(function(str) f:write(str) end,threshold)
+ f:close()
+ end
+end
+
+function debugger.enable()
+ debug.sethook(hook,"c")
+end
+
+function debugger.disable()
+ debug.sethook()
+--~ counters[debug.getinfo(2,"f").func] = nil
+end
+
+function debugger.tracing()
+ local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
+ if n > 0 then
+ function debugger.tracing() return true end ; return true
+ else
+ function debugger.tracing() return false end ; return false
+ end
+end
+
+--~ debugger.enable()
+
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+
+--~ debugger.disable()
+
+--~ print("")
+--~ debugger.showstats()
+--~ print("")
+--~ debugger.showstats(print,3)
+
+setters = setters or { }
+setters.data = setters.data or { }
+
+--~ local function set(t,what,value)
+--~ local data, done = t.data, t.done
+--~ if type(what) == "string" then
+--~ what = aux.settings_to_array(what) -- inefficient but ok
+--~ end
+--~ for i=1,#what do
+--~ local w = what[i]
+--~ for d, f in next, data do
+--~ if done[d] then
+--~ -- prevent recursion due to wildcards
+--~ elseif find(d,w) then
+--~ done[d] = true
+--~ for i=1,#f do
+--~ f[i](value)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+local function set(t,what,value)
+ local data, done = t.data, t.done
+ if type(what) == "string" then
+ what = aux.settings_to_hash(what) -- inefficient but ok
+ end
+ for w, v in next, what do
+ if v == "" then
+ v = value
+ else
+ v = toboolean(v)
+ end
+ for d, f in next, data do
+ if done[d] then
+ -- prevent recursion due to wildcards
+ elseif find(d,w) then
+ done[d] = true
+ for i=1,#f do
+ f[i](v)
+ end
+ end
+ end
+ end
+end
+
+local function reset(t)
+ for d, f in next, t.data do
+ for i=1,#f do
+ f[i](false)
+ end
+ end
+end
+
+local function enable(t,what)
+ set(t,what,true)
+end
+
+local function disable(t,what)
+ local data = t.data
+ if not what or what == "" then
+ t.done = { }
+ reset(t)
+ else
+ set(t,what,false)
+ end
+end
+
+function setters.register(t,what,...)
+ local data = t.data
+ what = lower(what)
+ local w = data[what]
+ if not w then
+ w = { }
+ data[what] = w
+ end
+ for _, fnc in next, { ... } do
+ local typ = type(fnc)
+ if typ == "function" then
+ w[#w+1] = fnc
+ elseif typ == "string" then
+ w[#w+1] = function(value) set(t,fnc,value,nesting) end
+ end
+ end
+end
+
+function setters.enable(t,what)
+ local e = t.enable
+ t.enable, t.done = enable, { }
+ enable(t,string.simpleesc(tostring(what)))
+ t.enable, t.done = e, { }
+end
+
+function setters.disable(t,what)
+ local e = t.disable
+ t.disable, t.done = disable, { }
+ disable(t,string.simpleesc(tostring(what)))
+ t.disable, t.done = e, { }
+end
+
+function setters.reset(t)
+ t.done = { }
+ reset(t)
+end
+
+function setters.list(t) -- pattern
+ local list = table.sortedkeys(t.data)
+ local user, system = { }, { }
+ for l=1,#list do
+ local what = list[l]
+ if find(what,"^%*") then
+ system[#system+1] = what
+ else
+ user[#user+1] = what
+ end
+ end
+ return user, system
+end
+
+function setters.show(t)
+ commands.writestatus("","")
+ local list = setters.list(t)
+ for k=1,#list do
+ commands.writestatus(t.name,list[k])
+ end
+ commands.writestatus("","")
+end
+
+-- we could have used a bit of oo and the trackers:enable syntax but
+-- there is already a lot of code around using the singular tracker
+
+-- we could make this into a module
+
+function setters.new(name)
+ local t
+ t = {
+ data = { },
+ name = name,
+ enable = function(...) setters.enable (t,...) end,
+ disable = function(...) setters.disable (t,...) end,
+ register = function(...) setters.register(t,...) end,
+ list = function(...) setters.list (t,...) end,
+ show = function(...) setters.show (t,...) end,
+ }
+ setters.data[name] = t
+ return t
+end
+
+trackers = setters.new("trackers")
+directives = setters.new("directives")
+experiments = setters.new("experiments")
+
+-- nice trick: we overload two of the directives related functions with variants that
+-- do tracing (itself using a tracker) .. proof of concept
+
+local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
+local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
+
+local e = directives.enable
+local d = directives.disable
+
+function directives.enable(...)
+ commands.writestatus("directives","enabling: %s",concat({...}," "))
+ e(...)
+end
+
+function directives.disable(...)
+ commands.writestatus("directives","disabling: %s",concat({...}," "))
+ d(...)
+end
+
+local e = experiments.enable
+local d = experiments.disable
+
+function experiments.enable(...)
+ commands.writestatus("experiments","enabling: %s",concat({...}," "))
+ e(...)
+end
+
+function experiments.disable(...)
+ commands.writestatus("experiments","disabling: %s",concat({...}," "))
+ d(...)
+end
+
+-- a useful example
+
+directives.register("system.nostatistics", function(v)
+ statistics.enable = not v
+end)
+
diff --git a/tex/context/base/trac-vis.mkii b/tex/context/base/trac-vis.mkii
new file mode 100644
index 000000000..23ded2af9
--- /dev/null
+++ b/tex/context/base/trac-vis.mkii
@@ -0,0 +1,748 @@
+%D \module
+%D [ file=trac-vis, % was core-vis,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Tracking Macros,
+%D subtitle=Visualization,
+%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 adds some more visualization cues to the ones
+%D supplied in the support module.
+%D
+%D %\everypar dual character, \the\everypar and \everypar=
+%D %\hrule cannot be grabbed in advance, switches mode
+%D %\vrule cannot be grabbed in advance, switches mode
+%D %
+%D %\indent only explicit ones
+%D %\noindent only explicit ones
+%D %\par only explicit ones
+%D
+%D %\leftskip only if explicit one
+%D %\rightskip only if explicit one
+
+\writestatus{loading}{ConTeXt Tracking Macros / Visualization}
+
+\unprotect
+
+%D \macros
+%D {indent, noindent, par}
+%D
+%D \TeX\ acts upon paragraphs. In mosts documents paragraphs
+%D are separated by empty lines, which internally are handled as
+%D \type{\par}. Paragraphs can be indented or not, depending on
+%D the setting of \type{\parindent}, the first token of a
+%D paragraph and/or user suppressed or forced indentation.
+%D
+%D Because the actual typesetting is based on both explicit
+%D user and implicit system actions, visualization is only
+%D possible for the user supplied \type{\indent},
+%D \type{\noindent}, and \type{\par}. Other
+%D 'clever' tricks will quite certainly lead to more failures
+%D than successes, so we only support these three explicit
+%D primitives and one macro:
+
+\def\showparagraphcue#1#2#3#4#5%
+ {\bgroup
+ \scratchdimen#1\relax
+ \dontinterfere
+ \dontcomplain
+ \boxrulewidth5\testrulewidth
+ #3#4\relax
+ \setbox\scratchbox\normalhbox to \scratchdimen
+ {#2{\ruledhbox to \scratchdimen
+ {\vrule #5 20\testrulewidth \!!width \zeropoint
+ \normalhss}}}%
+ \smashbox\scratchbox
+ \normalpenalty\!!tenthousand
+ \box\scratchbox
+ \egroup}
+
+\def\ruledhanging
+ {\ifdim\hangindent>\zeropoint
+ \ifnum\hangafter<\zerocount
+ \normalhbox
+ {\boxrulewidth5\testrulewidth
+ \setbox\scratchbox\ruledhbox to \hangindent
+ {\scratchdimen\strutht
+ \advance\scratchdimen \strutdp
+ \vrule
+ \!!width \zeropoint
+ \!!height \zeropoint
+ \!!depth -\hangafter\scratchdimen}%
+ \normalhskip-\hangindent
+ \smashbox\scratchbox
+ \raise\strutht\box\scratchbox}%
+ \fi
+ \fi}
+
+\def\ruledparagraphcues
+ {\bgroup
+ \dontcomplain
+ \normalhbox to \zeropoint
+ {\ifdim\leftskip>\zeropoint\relax
+ \showparagraphcue\leftskip\llap\relax\relax\!!depth
+ \normalhskip-\leftskip
+ \fi
+ \ruledhanging
+ \normalhskip\hsize
+ \ifdim\rightskip>\zeropoint\relax
+ \normalhskip-\rightskip
+ \showparagraphcue\rightskip\relax\relax\relax\!!depth
+ \fi}%
+ \egroup}
+
+\def\ruledpar
+ {\relax
+ \ifhmode
+ \showparagraphcue{40\testrulewidth}\relax\rightrulefalse\relax\!!height
+ \fi
+ \normalpar}
+
+\def\rulednoindent
+ {\relax
+ \normalnoindent
+ \ruledparagraphcues
+ \showparagraphcue{40\testrulewidth}\llap\leftrulefalse\relax\!!height}
+
+\def\ruledindent
+ {\relax
+ \normalnoindent
+ \ruledparagraphcues
+ \ifdim\parindent>\zeropoint
+ \showparagraphcue\parindent\relax\relax\relax\!!height
+ \else
+ \showparagraphcue{40\testrulewidth}\llap\relax\relax\!!height
+ \fi
+ \normalhskip\parindent}
+
+\def\dontshowimplicits
+ {\let\noindent \normalnoindent
+ \let\indent \normalindent
+ \let\par \normalpar}
+
+\def\showimplicits
+ {\testrulewidth \defaulttestrulewidth
+ \let\noindent \rulednoindent
+ \let\indent \ruledindent
+ \let\par \ruledpar}
+
+%D The next few||line examples show the four cues. Keep in
+%D mind that we only see them when we explicitly open or close
+%D a paragraph.
+%D
+%D \bgroup
+%D \def\voorbeeld#1%
+%D {#1Visualizing some \TeX\ primitives and Plain \TeX\
+%D macros can be very instructive, at least it is to me.
+%D Here we see {\tt\string#1} and {\tt\string\ruledpar} in
+%D action, while {\tt\string\parindent} equals
+%D {\tt\the\parindent}.\ruledpar}
+%D
+%D \showimplicits
+%D
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D
+%D \parindent=60pt
+%D
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D
+%D \startnarrower
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D \stopnarrower
+%D \egroup
+%D
+%D These examples also demonstrate the visualization of
+%D \type {\leftskip} and \type {\rightskip}. The macro
+%D \type {\nofruledbaselines} determines the number of lines
+%D shown.
+
+\newcounter\ruledbaselines
+
+\def\nofruledbaselines{3}
+
+\def\debuggertext#1%
+ {\ifx\ttxx\undefined
+ $\scriptscriptstyle#1$%
+ \else
+ {\ttxx#1}%
+ \fi}
+
+\def\ruledbaseline
+ {\vrule \!!width \zeropoint
+ \bgroup
+ \dontinterfere
+ \doglobal\increment\ruledbaselines
+ \scratchdimen\nofruledbaselines\baselineskip
+ \setbox\scratchbox\normalvbox to 2\scratchdimen
+ {\leaders
+ \normalhbox
+ {\strut
+ \vrule
+ \!!height \testrulewidth
+ \!!depth \testrulewidth
+ \!!width 120\points}
+ \normalvfill}%
+ \smashbox\scratchbox
+ \advance\scratchdimen \strutheightfactor\baselineskip
+ \setbox\scratchbox\normalhbox
+ {\normalhskip -48\points
+ \normalhbox to 24\points
+ {\normalhss\debuggertext\ruledbaselines\normalhskip6\points}%
+ \raise\scratchdimen\box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup}
+
+\def\showbaselines
+ {\testrulewidth\defaulttestrulewidth
+ \EveryPar{\ruledbaseline}}
+
+%D \macros
+%D {showpagebuilder}
+%D
+%D The next tracing option probaly is only of use to me and a
+%D few \CONTEXT\ hackers.
+
+\def\showpagebuilder
+ {\EveryPar{\doshowpagebuilder}}
+
+\def\doshowpagebuilder
+ {\strut\llap
+ {\startcolor[blue]\vl
+ \high{\infofont v:\the\vsize }\vl
+ \high{\infofont g:\the\pagegoal }\vl
+ \high{\infofont t:\the\pagetotal}\vl
+ \stopcolor}}
+
+%D \macros
+%D {makecutbox, cuthbox, cutvbox, cutvtop}
+%D
+%D Although mainly used for marking the page, these macros can
+%D also serve local use.
+%D
+%D \startbuffer
+%D \setbox0=\vbox{a real \crlf vertical box} \makecutbox0
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This marked \type{\vbox} shows up as:
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D The alternative macros are used as:
+%D
+%D \startbuffer
+%D \cuthbox{a made cut box}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is typeset as:
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D By setting the next macros one can influence the length of
+%D the marks as well as the horizontal and vertical divisions.
+
+\def\cutmarklength {2\bodyfontsize}
+\chardef\horizontalcutmarks = 2
+\chardef\verticalcutmarks = 2
+\chardef\cutmarkoffset = 1
+\let\cutmarksymbol = \relax
+\let\cutmarktoptext = \empty
+\let\cutmarkbottomtext = \empty
+
+\def\horizontalcuts
+ {\normalhbox to \ruledwidth
+ {\dorecurse\horizontalcutmarks
+ {\vrule\!!width\boxrulewidth\!!height\cutmarklength\normalhfill}%
+ \unskip}}
+
+\def\verticalcuts
+ {\scratchdimen\ruledheight
+ \advance\scratchdimen \ruleddepth
+ \normalvbox to \scratchdimen
+ {\hsize\cutmarklength
+ \dorecurse\verticalcutmarks
+ {\vrule\!!height\boxrulewidth\!!width\hsize\normalvfill}%
+ \unskip}}
+
+\def\baselinecuts
+ {\ifdim\ruleddepth>\zeropoint
+ \scratchdimen\ruledheight
+ \advance\scratchdimen \ruleddepth
+ \normalvbox to \scratchdimen
+ {\scratchdimen\cutmarklength
+ \divide\scratchdimen 2
+ \hsize\scratchdimen
+ \normalvskip\zeropoint\!!plus\ruledheight
+ \vrule\!!height\boxrulewidth\!!width\hsize
+ \normalvskip\zeropoint\!!plus\ruleddepth}%
+ \fi}
+
+\def\cutmarksymbols#1%
+ {\normalhbox to \ruledwidth
+ {\setbox\scratchbox\normalhbox to \cutmarklength
+ {\normalhss\infofont\cutmarksymbol\normalhss}%
+ \normalhss
+ \normalvbox to \cutmarklength
+ {\scratchdimen\cutmarklength
+ \divide\scratchdimen \plustwo
+ \normalvss
+ \hbox to \ruledwidth
+ {\llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \normalhskip\scratchdimen\hss\infofont#1\hss\normalhskip\scratchdimen
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}%
+ \normalvss}%
+ \normalhss}}
+
+\def\makecutbox#1% simplier with layers, todo
+ {\edef\ruledheight{\the\ht#1}%
+ \edef\ruleddepth {\the\dp#1}%
+ \edef\ruledwidth {\the\wd#1}%
+ \setbox#1\normalhbox
+ {\dontcomplain
+ \forgetall
+ \boxmaxdepth\maxdimen
+ \offinterlineskip
+ \scratchdimen\cutmarklength
+ \divide\scratchdimen \plustwo
+ \hsize\ruledwidth
+ \setbox\scratchbox\normalvbox
+ {\setbox\scratchbox\normalhbox{\horizontalcuts}%
+ \normalvskip-\cutmarkoffset\scratchdimen
+ \normalvskip-2\scratchdimen
+ \copy\scratchbox
+ \normalvskip\cutmarkoffset\scratchdimen
+ \hbox to \ruledwidth
+ {\setbox\scratchbox\normalhbox{\verticalcuts}%
+ \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \bgroup
+ \setbox\scratchbox\normalhbox{\baselinecuts}%
+ \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \normalhfill
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}%
+ \egroup
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}%
+ \normalvskip\cutmarkoffset\scratchdimen
+ \copy\scratchbox}%
+ \ht\scratchbox\ruledheight
+ \dp\scratchbox\ruleddepth
+ \wd\scratchbox\zeropoint
+ \resetcolorseparation
+ \localstartcolor[\defaulttextcolor]%
+ \box\scratchbox
+ \ifx\cutmarksymbol\relax \else
+ \setbox\scratchbox\normalvbox
+ {\vskip-\cutmarkoffset\scratchdimen
+ \vskip-\cutmarklength
+ \normalhbox{\cutmarksymbols\cutmarktoptext}%
+ \vskip\cutmarkoffset\scratchdimen
+ \vskip\ruledheight
+ \vskip\ruleddepth
+ \vskip\cutmarkoffset\scratchdimen
+ \normalhbox{\cutmarksymbols\cutmarkbottomtext}}%
+ \ht\scratchbox\ruledheight
+ \dp\scratchbox\ruleddepth
+ \wd\scratchbox\zeropoint
+ \box\scratchbox
+ \fi
+ \localstopcolor
+ \box#1}%
+ \wd#1=\ruledwidth
+ \ht#1=\ruledheight
+ \dp#1=\ruleddepth}
+
+\def\cuthbox
+ {\normalhbox\bgroup
+ \dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\normalhbox}
+
+\def\cutvbox
+ {\normalvbox\bgroup
+ \dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\normalvbox}
+
+\def\cutvtop
+ {\normalvtop\bgroup
+ \dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\normalvtop}
+
+%D \macros
+%D {colormarkbox,rastermarkbox}
+%D
+%D This macro is used in the pagebody routine. No other use
+%D is advocated here.
+%D
+%D \starttyping
+%D \colormarkbox0
+%D \stoptyping
+
+\def\colormarkoffset{\cutmarkoffset}
+\def\colormarklength{\cutmarklength}
+
+\def\colorrangeA#1#2#3#4%
+ {\vbox
+ {\scratchdimen-\colormarklength
+ \multiply\scratchdimen 4
+ \advance\scratchdimen \ruledheight
+ \advance\scratchdimen \ruleddepth
+ \divide\scratchdimen 21
+ \def\docommand##1%
+ {\vbox
+ {\hsize3em % \scratchdimen
+ \definecolor
+ [\s!dummy]
+ [\c!c=#2##1\else0\fi,
+ \c!m=#3##1\else0\fi,
+ \c!y=#4##1\else0\fi,
+ \c!k=0]%
+ \localstartcolor[\s!dummy]%
+ \hrule
+ \!!width 3em
+ \!!height \scratchdimen
+ \!!depth \zeropoint
+ \localstopcolor
+ \ifdim\scratchdimen>1ex
+ \vskip-\scratchdimen
+ \vbox to \scratchdimen
+ {\vss
+ \hbox to 3em
+ {\hss
+ \localstartcolor[\s!white]%
+ \ifdim##1\points=\zeropoint#1\else##1\fi
+ \localstopcolor
+ \hss}%
+ \vss}%
+ \fi}}%
+ \offinterlineskip
+ \processcommalist[1.00,0.95,0.75,0.50,0.25,0.05,0.00]\docommand}}
+
+\def\colorrangeB
+ {\hbox
+ {\scratchdimen-\colormarklength
+ \multiply\scratchdimen \plustwo
+ \advance\scratchdimen \ruledwidth
+ \divide\scratchdimen 11
+ \def\docommand ##1 ##2 ##3##4##5##6%
+ {\definecolor
+ [\s!dummy]
+ [\c!c=##3##2\else0\fi,
+ \c!m=##4##2\else0\fi,
+ \c!y=##5##2\else0\fi,
+ \c!k=##6##2\else0\fi]%
+ \localstartcolor[\s!dummy]%
+ \vrule
+ \!!width \scratchdimen
+ \!!height \colormarklength
+ \!!depth \zeropoint
+ \localstopcolor
+ \ifdim\scratchdimen>2em
+ \hskip-\scratchdimen
+ \vbox to \colormarklength
+ {\vss
+ \hbox to \scratchdimen
+ {\hss
+ \localstartcolor[\s!white]%
+ \ifdim##2\points=.5\points##2~\fi##1%
+ \localstopcolor
+ \hss}
+ \vss}%
+ \fi}%
+ \docommand C .5 \iftrue \iffalse\iffalse\iffalse
+ \docommand M .5 \iffalse\iftrue \iffalse\iffalse
+ \docommand Y .5 \iffalse\iffalse\iftrue \iffalse
+ \docommand K .5 \iffalse\iffalse\iffalse\iftrue
+ \docommand C 1 \iftrue \iffalse\iffalse\iffalse
+ \docommand G 1 \iftrue \iffalse\iftrue \iffalse
+ \docommand Y 1 \iffalse\iffalse\iftrue \iffalse
+ \docommand R 1 \iffalse\iftrue \iftrue \iffalse
+ \docommand M 1 \iffalse\iftrue \iffalse\iffalse
+ \docommand B 1 \iftrue \iftrue \iffalse\iffalse
+ \docommand K 1 \iffalse\iffalse\iffalse\iftrue}}
+
+\def\colorrangeC
+ {\hbox
+ {\resetcolorseparation
+ \scratchdimen-\colormarklength
+ \multiply\scratchdimen 2
+ \advance\scratchdimen \ruledwidth
+ \divide\scratchdimen 14
+ \def\docommand##1%
+ {\definecolor[\s!dummy][\c!s=##1]%
+ \localstartcolor[\s!dummy]%
+ \vrule
+ \!!width \scratchdimen
+ \!!height \colormarklength
+ \!!depth \zeropoint
+ \localstopcolor
+ \ifdim\scratchdimen>2em
+ \hskip-\scratchdimen
+ \vbox to \colormarklength
+ {\vss
+ \localstartcolor[\s!white]%
+ \hbox to \scratchdimen{\hss##1\hss}
+ \localstopcolor
+ \vss}%
+ \fi}%
+ \processcommalist[1,.95,.9,.85,.8,.75,.7,.6,.5,.4,.3,.2,.1,0]\docommand}}
+
+\def\docolormarkbox#1#2%
+ {\edef\ruledheight{\the\ht#2}%
+ \edef\ruleddepth {\the\dp#2}%
+ \edef\ruledwidth {\the\wd#2}%
+ \setbox#2\hbox
+ {\scratchdimen\colormarklength
+ \divide\scratchdimen \plustwo
+ \forgetall
+ \ssxx
+ \setbox\scratchbox\vbox
+ {\offinterlineskip
+ \vskip-\colormarkoffset\scratchdimen
+ \vskip-2\scratchdimen\relax % relax needed
+ % beware: no \ifcase, due to nested \iftrue/\iffalse
+ % and lacking \fi's
+ \doifelse{#1}{0}%
+ {\vskip\colormarklength
+ \vskip\colormarkoffset\scratchdimen
+ \vskip\ruledheight}
+ {\hbox to \ruledwidth{\hss\hbox{\colorrangeB}\hss}%
+ \vskip\colormarkoffset\scratchdimen
+ \vbox to \ruledheight
+ {\vss
+ \hbox to \ruledwidth
+ {\llap{\colorrangeA C\iftrue\iffalse\iffalse\hskip\colormarkoffset\scratchdimen}%
+ \hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA R\iffalse\iftrue\iftrue}}%
+ \vss
+ \hbox to \ruledwidth
+ {\llap{\colorrangeA M\iffalse\iftrue\iffalse\hskip\colormarkoffset\scratchdimen}%
+ \hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA G\iftrue\iffalse\iftrue}}%
+ \vss
+ \hbox to \ruledwidth
+ {\llap{\colorrangeA Y\iffalse\iffalse\iftrue\hskip\colormarkoffset\scratchdimen}%
+ \hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA B\iftrue\iftrue\iffalse}}%
+ \vss}}%
+ \vskip\colormarkoffset\scratchdimen
+ \hbox to \ruledwidth
+ {\hss\lower\ruleddepth\hbox{\colorrangeC}\hss}}%
+ \ht\scratchbox\ruledheight
+ \dp\scratchbox\ruleddepth
+ \wd\scratchbox\zeropoint
+ \box\scratchbox
+ \box#2}%
+ \wd#2=\ruledwidth
+ \ht#2=\ruledheight
+ \dp#2=\ruleddepth}
+
+\def\colormarkbox % #1
+ {\ifincolor\@EA\docolormarkbox\else\@EA\gobbletwoarguments\fi1}
+
+\def\rastermarkbox % #1
+ {\ifincolor\@EA\docolormarkbox\else\@EA\gobbletwoarguments\fi0}
+
+%D \macros
+%D {showwhatsits, dontshowwhatsits}
+%D
+%D \TEX\ has three so called whatsits: \type {\mark}, \type
+%D {\write} and \type {\special}. The first one keeps track of
+%D the current state at page boundaries, the last two are used
+%D to communicate to the outside world. Due to fact that
+%D especially \type {\write} is often used in conjunction with
+%D \type {\edef}, we can only savely support that one in \ETEX.
+%D
+%D \bgroup \showwhatsits \setupcolors[state=start]
+%D
+%D Whatsits show up \color[blue]{in color} and are
+%D characterized bij their first character.\footnote [some note]
+%D {So we may encounter \type {w}, \type {m} and \type{s}.}
+%D They are \writestatus{dummy}{demo}\color[yellow]{stacked}.
+%D
+%D \egroup
+
+\newif\ifimmediatewrite
+
+\ifx\eTeXversion\undefined
+
+ \let\showwhatsits \relax
+ \let\dontshowwhatsits\relax
+
+\else
+
+ \let\supernormalmark \normalmark % mark may already been superseded
+ \let\supernormalmarks \normalmarks % mark may already been superseded
+
+ \def\showwhatsits
+ {\protected\def\normalmark {\visualwhatsit100+m\supernormalmark }%
+ \protected\def\normalmarks{\visualwhatsit100+m\supernormalmarks}%
+ \protected\def\special {\visualwhatsit0100s\normalspecial }%
+ \protected\def\write {\visualwhatsit001-w\normalwrite }%
+ \let\immediate\immediatewhatsit
+ \appendtoks\dontshowwhatsits\to\everystoptext}
+
+ \def\immediatewhatsit
+ {\bgroup\futurelet\next\doimmediatewhatsit}
+
+ \def\doimmediatewhatsit
+ {\ifx\next\write
+ \egroup\immediatewritetrue
+ \else
+ \egroup\expandafter\normalimmediate
+ \fi}
+
+ \def\dontshowwhatsits
+ {\let\immediate \normalimmediate
+ \let\normalmark\supernormalmark
+ \let\special \normalspecial
+ \let\write \normalwrite}
+
+ \def\visualwhatsit#1#2#3#4#5%
+ {\bgroup
+ \pushwhatsit
+ \dontinterfere
+ \dontcomplain
+ \dontshowcomposition
+ \dontshowwhatsits
+ \ttx
+ \ifvmode\donetrue\else\donefalse\fi
+ \setbox\scratchbox\hbox
+ {\ifdone\dostartgraycolormode0\else\dostartrgbcolormode#1#2#3\fi
+ #5\dostopcolormode}%
+ \setbox\scratchbox\hbox
+ {\ifdone\dostartrgbcolormode#1#2#3\else\dostartgraycolormode0\fi
+ \vrule\!!width\wd\scratchbox\dostopcolormode
+ \hskip-\wd\scratchbox\box\scratchbox}%
+ \scratchdimen1ex
+ \setbox\scratchbox\hbox
+ {\ifdone\hskip\else\raise#4\fi\scratchdimen\box\scratchbox}%
+ \smashbox\scratchbox
+ \ifdone\nointerlineskip\fi
+ \box\scratchbox
+ \ifvmode\nointerlineskip\fi
+ \popwhatsit
+ \egroup
+ \ifimmediatewrite
+ \immediatewritefalse
+ \expandafter\normalimmediate
+ \fi}
+
+ \def\pushwhatsit
+ {\ifzeropt\lastskip
+ \ifcase\lastpenalty
+ \ifzeropt\lastkern
+ \ifhmode
+ \let\popwhatsit\relax
+ \else
+ \edef\popwhatsit{\prevdepth\the\prevdepth}%
+ \fi
+ \else
+ \ifhmode
+ \edef\popwhatsit{\kern\the\lastkern}\unkern
+ \else
+ \edef\popwhatsit{\kern\the\lastkern\prevdepth\the\prevdepth}%
+ \kern-\lastkern
+ \fi
+ \fi
+ \else
+ \ifhmode
+ \edef\popwhatsit{\the\lastpenalty}%
+ \unpenalty
+ \else
+ \edef\popwhatsit{\penalty\the\lastpenalty\prevdepth\the\prevdepth}%
+ %\nobreak
+ \fi
+ \fi
+ \else
+ \ifhmode
+ \edef\popwhatsit{\hskip\the\lastskip}\unskip
+ \else
+ \edef\popwhatsit{\vskip\the\lastskip\prevdepth\the\prevdepth}%
+ \vskip-\lastskip
+ \fi
+ \fi}
+
+\fi
+
+%D The next macro can be used to keep track of classes of
+%D boxes (handy for development cq.\ tracing).
+
+\def\dodotagbox#1#2#3% can be reimplemented
+ {\def\next##1##2##3##4%
+ {\vbox to \ht#2{##3\hbox to \wd#2{##1#3##2}##4}}%
+ \processaction
+ [#1]
+ [ l=>\next\relax\hfill\vfill\vfill,
+ r=>\next\hfill\relax\vfill\vfill,
+ t=>\next\hfill\hfill\relax\vfill,
+ b=>\next\hfill\hfill\vfill\relax,
+ lt=>\next\relax\hfill\relax\vfill,
+ lb=>\next\relax\hfill\vfill\relax,
+ rt=>\next\hfill\relax\relax\vfill,
+ rb=>\next\hfill\relax\vfill\relax,
+ tl=>\next\relax\hfill\relax\vfill,
+ bl=>\next\relax\hfill\vfill\relax,
+ tr=>\next\hfill\relax\relax\vfill,
+ br=>\next\hfill\relax\vfill\relax,
+ \s!default=>\next\hfill\hfill\vfill\vfill,
+ \s!unknown=>\next\hfill\hfill\vfill\vfill]}
+
+\def\dotagbox[#1]#2%
+ {\bgroup
+ \dowithnextbox
+ {\setbox\scratchbox\flushnextbox
+ \setbox\nextbox\ifhbox\nextbox\hbox\else\vbox\fi
+ \bgroup
+ \startoverlay
+ {\copy\scratchbox}
+ {\dodotagbox{#1}\scratchbox{\framed
+ [\c!background=\v!screen,\c!backgroundscreen=1]{#2}}}
+ \stopoverlay
+ \egroup
+ \nextboxwd\the\wd\scratchbox
+ \nextboxht\the\ht\scratchbox
+ \nextboxdp\the\dp\scratchbox
+ \flushnextbox
+ \egroup}}
+
+\def\tagbox
+ {\dosingleempty\dotagbox}
+
+%D \macros
+%D {coloredhbox,coloredvbox,coloredvtop,
+%D coloredstrut}
+%D
+%D The following visualizations are used in some of the manuals:
+
+\definecolor[boxcolor:ht][r=.5,g=.75,b=.5]
+\definecolor[boxcolor:dp][r=.5,g=.5,b=.75]
+\definecolor[boxcolor:wd][r=.75,g=.5,b=.5]
+\definecolor[strutcolor] [r=.5,g=.25,b=.25]
+
+\def\coloredbox#1%
+ {\dowithnextbox{#1{\hbox
+ {\blackrule[\c!width=\nextboxwd,\c!height=\nextboxht,\c!depth=\zeropoint,\c!color=boxcolor:ht]%
+ \hskip-\nextboxwd
+ \blackrule[\c!width=\nextboxwd,\c!height=\zeropoint,\c!depth=\nextboxdp,\c!color=boxcolor:dp]%
+ \hskip-\nextboxwd
+ \box\nextbox}}}#1}
+
+\def\coloredhbox{\coloredbox\hbox}
+\def\coloredvbox{\coloredbox\vbox}
+\def\coloredvtop{\coloredbox\vtop}
+
+\def\coloredstrut
+ {\color[strutcolor]{\def\strutwidth{2\points}\setstrut\strut}}
+
+\protect \endinput
diff --git a/tex/context/base/trac-vis.mkiv b/tex/context/base/trac-vis.mkiv
new file mode 100644
index 000000000..6b0fdba94
--- /dev/null
+++ b/tex/context/base/trac-vis.mkiv
@@ -0,0 +1,709 @@
+%D \module
+%D [ file=trac-vis, % was core-vis,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Tracking Macros,
+%D subtitle=Visualization,
+%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 adds some more visualization cues to the ones
+%D supplied in the support module.
+%D
+%D %\everypar dual character, \the\everypar and \everypar=
+%D %\hrule cannot be grabbed in advance, switches mode
+%D %\vrule cannot be grabbed in advance, switches mode
+%D %
+%D %\indent only explicit ones
+%D %\noindent only explicit ones
+%D %\par only explicit ones
+%D
+%D %\leftskip only if explicit one
+%D %\rightskip only if explicit one
+
+\writestatus{loading}{ConTeXt Tracking Macros / Visualization}
+
+\unprotect
+
+%D \macros
+%D {indent, noindent, par}
+%D
+%D \TeX\ acts upon paragraphs. In mosts documents paragraphs
+%D are separated by empty lines, which internally are handled as
+%D \type{\par}. Paragraphs can be indented or not, depending on
+%D the setting of \type{\parindent}, the first token of a
+%D paragraph and/or user suppressed or forced indentation.
+%D
+%D Because the actual typesetting is based on both explicit
+%D user and implicit system actions, visualization is only
+%D possible for the user supplied \type{\indent},
+%D \type{\noindent}, and \type{\par}. Other
+%D 'clever' tricks will quite certainly lead to more failures
+%D than successes, so we only support these three explicit
+%D primitives and one macro:
+
+\def\showparagraphcue#1#2#3#4#5%
+ {\bgroup
+ \scratchdimen#1\relax
+ \dontinterfere
+ \dontcomplain
+ \boxrulewidth5\testrulewidth
+ #3#4\relax
+ \setbox\scratchbox\normalhbox to \scratchdimen
+ {#2{\ruledhbox to \scratchdimen
+ {\vrule #5 20\testrulewidth \!!width \zeropoint
+ \normalhss}}}%
+ \smashbox\scratchbox
+ \normalpenalty\!!tenthousand
+ \box\scratchbox
+ \egroup}
+
+\def\ruledhanging
+ {\ifdim\hangindent>\zeropoint
+ \ifnum\hangafter<\zerocount
+ \normalhbox
+ {\boxrulewidth5\testrulewidth
+ \setbox\scratchbox\ruledhbox to \hangindent
+ {\scratchdimen\strutht
+ \advance\scratchdimen \strutdp
+ \vrule
+ \!!width \zeropoint
+ \!!height \zeropoint
+ \!!depth -\hangafter\scratchdimen}%
+ \normalhskip-\hangindent
+ \smashbox\scratchbox
+ \raise\strutht\box\scratchbox}%
+ \fi
+ \fi}
+
+\def\ruledparagraphcues
+ {\bgroup
+ \dontcomplain
+ \normalhbox to \zeropoint
+ {\ifdim\leftskip>\zeropoint\relax
+ \showparagraphcue\leftskip\llap\relax\relax\!!depth
+ \normalhskip-\leftskip
+ \fi
+ \ruledhanging
+ \normalhskip\hsize
+ \ifdim\rightskip>\zeropoint\relax
+ \normalhskip-\rightskip
+ \showparagraphcue\rightskip\relax\relax\relax\!!depth
+ \fi}%
+ \egroup}
+
+\def\ruledpar
+ {\relax
+ \ifhmode
+ \showparagraphcue{40\testrulewidth}\relax\rightrulefalse\relax\!!height
+ \fi
+ \normalpar}
+
+\def\rulednoindent
+ {\relax
+ \normalnoindent
+ \ruledparagraphcues
+ \showparagraphcue{40\testrulewidth}\llap\leftrulefalse\relax\!!height}
+
+\def\ruledindent
+ {\relax
+ \normalnoindent
+ \ruledparagraphcues
+ \ifdim\parindent>\zeropoint
+ \showparagraphcue\parindent\relax\relax\relax\!!height
+ \else
+ \showparagraphcue{40\testrulewidth}\llap\relax\relax\!!height
+ \fi
+ \normalhskip\parindent}
+
+\def\dontshowimplicits
+ {\let\noindent \normalnoindent
+ \let\indent \normalindent
+ \let\par \normalpar}
+
+\def\showimplicits
+ {\testrulewidth \defaulttestrulewidth
+ \let\noindent \rulednoindent
+ \let\indent \ruledindent
+ \let\par \ruledpar}
+
+%D The next few||line examples show the four cues. Keep in
+%D mind that we only see them when we explicitly open or close
+%D a paragraph.
+%D
+%D \bgroup
+%D \def\voorbeeld#1%
+%D {#1Visualizing some \TeX\ primitives and Plain \TeX\
+%D macros can be very instructive, at least it is to me.
+%D Here we see {\tt\string#1} and {\tt\string\ruledpar} in
+%D action, while {\tt\string\parindent} equals
+%D {\tt\the\parindent}.\ruledpar}
+%D
+%D \showimplicits
+%D
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D
+%D \parindent=60pt
+%D
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D
+%D \startnarrower
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D \stopnarrower
+%D \egroup
+%D
+%D These examples also demonstrate the visualization of
+%D \type {\leftskip} and \type {\rightskip}. The macro
+%D \type {\nofruledbaselines} determines the number of lines
+%D shown.
+
+\newcounter\ruledbaselines
+
+\def\nofruledbaselines{3}
+
+\def\debuggertext#1%
+ {\ifx\ttxx\undefined
+ $\scriptscriptstyle#1$%
+ \else
+ {\ttxx#1}%
+ \fi}
+
+\def\ruledbaseline
+ {\vrule \!!width \zeropoint
+ \bgroup
+ \dontinterfere
+ \doglobal\increment\ruledbaselines
+ \scratchdimen\nofruledbaselines\baselineskip
+ \setbox\scratchbox\normalvbox to 2\scratchdimen
+ {\leaders
+ \normalhbox
+ {\strut
+ \vrule
+ \!!height \testrulewidth
+ \!!depth \testrulewidth
+ \!!width 120\points}
+ \normalvfill}%
+ \smashbox\scratchbox
+ \advance\scratchdimen \strutheightfactor\baselineskip
+ \setbox\scratchbox\normalhbox
+ {\normalhskip -48\points
+ \normalhbox to 24\points
+ {\normalhss\debuggertext\ruledbaselines\normalhskip6\points}%
+ \raise\scratchdimen\box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup}
+
+\def\showbaselines
+ {\testrulewidth\defaulttestrulewidth
+ \EveryPar{\ruledbaseline}}
+
+%D \macros
+%D {showpagebuilder}
+%D
+%D The next tracing option probaly is only of use to me and a
+%D few \CONTEXT\ hackers.
+
+\def\showpagebuilder
+ {\EveryPar{\doshowpagebuilder}}
+
+\def\doshowpagebuilder
+ {\strut\llap
+ {\startcolor[blue]\vl
+ \high{\infofont v:\the\vsize }\vl
+ \high{\infofont g:\the\pagegoal }\vl
+ \high{\infofont t:\the\pagetotal}\vl
+ \stopcolor}}
+
+%D \macros
+%D {makecutbox, cuthbox, cutvbox, cutvtop}
+%D
+%D Although mainly used for marking the page, these macros can
+%D also serve local use.
+%D
+%D \startbuffer
+%D \setbox0=\vbox{a real \crlf vertical box} \makecutbox0
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This marked \type{\vbox} shows up as:
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D The alternative macros are used as:
+%D
+%D \startbuffer
+%D \cuthbox{a made cut box}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is typeset as:
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D By setting the next macros one can influence the length of
+%D the marks as well as the horizontal and vertical divisions.
+
+\newdimen\tractempwidth
+\newdimen\tractempheight
+\newdimen\tractempdepth
+
+\def\cutmarklength {2\bodyfontsize}
+
+\chardef\horizontalcutmarks = 2
+\chardef\verticalcutmarks = 2
+\chardef\cutmarkoffset = 1
+
+\let\cutmarksymbol = \relax
+\let\cutmarktoptext = \empty
+\let\cutmarkbottomtext = \empty
+
+\def\horizontalcuts
+ {\normalhbox to \tractempwidth
+ {\dorecurse\horizontalcutmarks{\vrule\!!width\boxrulewidth\!!height\cutmarklength\normalhfill}%
+ \unskip}}
+
+\def\verticalcuts
+ {\normalvbox to \dimexpr\tractempheight+\tractempdepth\relax
+ {\hsize\cutmarklength
+ \dorecurse\verticalcutmarks{\vrule\!!height\boxrulewidth\!!width\hsize\normalvfill}%
+ \unskip}}
+
+\def\baselinecuts
+ {\ifdim\tractempdepth>\zeropoint
+ \normalvbox to \dimexpr\tractempheight+\tractempdepth\relax
+ {\hsize\dimexpr\cutmarklength/2\relax
+ \normalvskip\zeropoint\!!plus\tractempheight
+ \vrule\!!height\boxrulewidth\!!width\hsize
+ \normalvskip\zeropoint\!!plus\tractempdepth}%
+ \fi}
+
+\def\cutmarksymbols#1%
+ {\normalhbox to \tractempwidth
+ {\setbox\scratchbox\normalhbox to \cutmarklength
+ {\normalhss\infofont\cutmarksymbol\normalhss}%
+ \normalhss
+ \normalvbox to \cutmarklength
+ {\scratchdimen\dimexpr\cutmarklength/2\relax
+ \normalvss
+ \hbox to \tractempwidth
+ {\llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \normalhskip\scratchdimen\hss\infofont#1\hss\normalhskip\scratchdimen
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}%
+ \normalvss}%
+ \normalhss}}
+
+\def\makecutbox#1% simplier with layers, todo
+ {\tractempheight\ht#1%
+ \tractempdepth \dp#1%
+ \tractempwidth \wd#1%
+ \setbox#1\normalhbox
+ {\dontcomplain
+ \forgetall
+ \boxmaxdepth\maxdimen
+ \offinterlineskip
+ \scratchdimen\dimexpr\cutmarklength/2\relax
+ \hsize\tractempwidth
+ \setbox\scratchbox\normalvbox
+ {\setbox\scratchbox\normalhbox{\horizontalcuts}%
+ \normalvskip\dimexpr-\cutmarkoffset\scratchdimen-2\scratchdimen\relax
+ \copy\scratchbox
+ \normalvskip\cutmarkoffset\scratchdimen
+ \hbox to \tractempwidth
+ {\setbox\scratchbox\normalhbox{\verticalcuts}%
+ \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \bgroup
+ \setbox\scratchbox\normalhbox{\baselinecuts}%
+ \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \normalhfill
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}%
+ \egroup
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}%
+ \normalvskip\cutmarkoffset\scratchdimen
+ \copy\scratchbox}%
+ \ht\scratchbox\tractempheight
+ \dp\scratchbox\tractempdepth
+ \wd\scratchbox\zeropoint
+ \startcolor[\defaulttextcolor]%
+ \box\scratchbox
+ \ifx\cutmarksymbol\relax \else
+ \setbox\scratchbox\normalvbox
+ {\vskip-\cutmarkoffset\scratchdimen
+ \vskip-\cutmarklength
+ \normalhbox{\cutmarksymbols\cutmarktoptext}%
+ \vskip\cutmarkoffset\scratchdimen
+ \vskip\tractempheight
+ \vskip\tractempdepth
+ \vskip\cutmarkoffset\scratchdimen
+ \normalhbox{\cutmarksymbols\cutmarkbottomtext}}%
+ \ht\scratchbox\tractempheight
+ \dp\scratchbox\tractempdepth
+ \wd\scratchbox\zeropoint
+ \box\scratchbox
+ \fi
+ \stopcolor
+ \box#1}%
+ \wd#1\tractempwidth
+ \ht#1\tractempheight
+ \dp#1\tractempdepth}
+
+\def\cuthbox{\normalhbox\bgroup\dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\normalhbox}
+\def\cutvbox{\normalvbox\bgroup\dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\normalvbox}
+\def\cutvtop{\normalvtop\bgroup\dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\normalvtop}
+
+%D \macros
+%D {colormarkbox,rastermarkbox}
+%D
+%D This macro is used in the pagebody routine. No other use
+%D is advocated here.
+%D
+%D \starttyping
+%D \colormarkbox0
+%D \stoptyping
+
+\def\colormarkoffset{\cutmarkoffset}
+\def\colormarklength{\cutmarklength}
+
+\def\dodocolorrangeA#1%
+ {\fastcolored[#1]{\hrule\!!width3em\!!height\scratchdimen\!!depth\zeropoint}}
+
+\def\docolorrangeA#1 #2 %
+ {\vbox
+ {\hsize3em % \scratchdimen
+ \ifcase#1\or
+ \dodocolorrangeA{c=#2}\or
+ \dodocolorrangeA{m=#2}\or
+ \dodocolorrangeA{y=#2}\or
+ \dodocolorrangeA{m=#2,y=#2}\or
+ \dodocolorrangeA{c=#2,y=#2}\or
+ \dodocolorrangeA{c=#2,m=#2}\fi
+ \ifdim\scratchdimen>1ex
+ \vskip-\scratchdimen
+ \vbox to \scratchdimen
+ {\vss\hbox to 3em{\hss#2\hss}\vss}%
+ \fi}}
+
+\def\colorrangeA#1%
+ {\vbox
+ {\startcolor[\s!white]%
+ \scratchdimen\dimexpr(-\colormarklength*4+\tractempheight+\tractempdepth)/21\relax
+ \offinterlineskip
+ \docolorrangeA #1 1.00 \docolorrangeA #1 0.95
+ \docolorrangeA #1 0.75
+ \docolorrangeA #1 0.50
+ \docolorrangeA #1 0.25 \docolorrangeA #1 0.05
+ \docolorrangeA #1 0.00
+ \stopcolor}}
+
+\def\docolorrangeB #1 #2 #3 #4 #5 %
+ {\fastcolored
+ [\c!c=#2,\c!m=#3,\c!y=#4,\c!k=#5]
+ {\vrule\!!width\scratchdimen\!!height\colormarklength\!!depth\zeropoint}%
+ \ifdim\scratchdimen>2em
+ \hskip-\scratchdimen
+ \vbox to \colormarklength
+ {\vss\hbox to \scratchdimen{\hss#1\hss}\vss}%
+ \fi}
+
+\def\colorrangeB
+ {\hbox
+ {\startcolor[\s!white]%
+ \scratchdimen\dimexpr(-\colormarklength*\plustwo+\tractempwidth)/11\relax
+ \docolorrangeB .5~C .5 0 0 0
+ \docolorrangeB .5~M 0 .5 0 0
+ \docolorrangeB .5~Y 0 0 .5 0
+ \docolorrangeB .5~K 0 0 0 .5
+ \docolorrangeB C 1 0 0 0
+ \docolorrangeB G 1 0 1 0
+ \docolorrangeB Y 0 0 1 0
+ \docolorrangeB R 0 1 1 0
+ \docolorrangeB M 0 1 0 0
+ \docolorrangeB B 1 1 0 0
+ \docolorrangeB K 0 0 0 1
+ \stopcolor}}
+
+\def\docolorrangeC#1 %
+ {\fastcolored
+ [\c!s=#1]%
+ {\vrule\!!width\scratchdimen\!!height\colormarklength\!!depth\zeropoint}%
+ \ifdim\scratchdimen>2em
+ \hskip-\scratchdimen
+ \vbox to \colormarklength
+ {\vss\hbox to \scratchdimen{\hss#1\hss}\vss}%
+ \fi}
+
+\def\colorrangeC
+ {\hbox
+ {\startcolor[\s!white]%
+ \scratchdimen\dimexpr(-\colormarklength*2+\tractempwidth)/14\relax
+ \docolorrangeC 1 \docolorrangeC .95
+ \docolorrangeC .9 \docolorrangeC .85
+ \docolorrangeC .8 \docolorrangeC .75
+ \docolorrangeC .7
+ \docolorrangeC .6
+ \docolorrangeC .5
+ \docolorrangeC .4
+ \docolorrangeC .3
+ \docolorrangeC .2
+ \docolorrangeC .1
+ \docolorrangeC 0
+ \stopcolor}}
+
+\def\docolormarkbox#1#2%
+ {\tractempheight\ht#2%
+ \tractempdepth \dp#2%
+ \tractempwidth \wd#2%
+ \setbox#2\hbox
+ {\scratchdimen\dimexpr\colormarklength/2\relax
+ \forgetall
+ \ssxx
+ \setbox\scratchbox\vbox
+ {\offinterlineskip
+ \vskip\dimexpr-\colormarkoffset\scratchdimen-2\scratchdimen\relax
+ \ifcase#1\relax
+ \vskip\dimexpr\colormarklength+\scratchdimen+\tractempheight\relax
+ \else
+ \hbox to \tractempwidth{\hss\hbox{\colorrangeB}\hss}%
+ \vskip\colormarkoffset\scratchdimen
+ \vbox to \tractempheight
+ {\vss
+ \hbox to \tractempwidth
+ {\llap{\colorrangeA1\hskip\colormarkoffset\scratchdimen}\hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA4}}%
+ \vss
+ \hbox to \tractempwidth
+ {\llap{\colorrangeA2\hskip\colormarkoffset\scratchdimen}\hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA5}}%
+ \vss
+ \hbox to \tractempwidth
+ {\llap{\colorrangeA3\hskip\colormarkoffset\scratchdimen}\hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA6}}%
+ \vss}%
+ \fi
+ \vskip\colormarkoffset\scratchdimen
+ \hbox to \tractempwidth
+ {\hss\lower\tractempdepth\hbox{\colorrangeC}\hss}}%
+ \ht\scratchbox\tractempheight
+ \dp\scratchbox\tractempdepth
+ \wd\scratchbox\zeropoint
+ \box\scratchbox
+ \box#2}%
+ \wd#2\tractempwidth
+ \ht#2\tractempheight
+ \dp#2\tractempdepth}
+
+\def\colormarkbox {\ifincolor\@EA\docolormarkbox\else\@EA\gobbletwoarguments\fi\plusone } % #1
+\def\rastermarkbox{\ifincolor\@EA\docolormarkbox\else\@EA\gobbletwoarguments\fi\zerocount} % #1
+
+%D \macros
+%D {showwhatsits, dontshowwhatsits}
+%D
+%D \TEX\ has three so called whatsits: \type {\mark}, \type
+%D {\write} and \type {\special}. The first one keeps track of
+%D the current state at page boundaries, the last two are used
+%D to communicate to the outside world. Due to fact that
+%D especially \type {\write} is often used in conjunction with
+%D \type {\edef}, we can only savely support that one in \ETEX.
+%D
+%D \bgroup \showwhatsits \setupcolors[state=start]
+%D
+%D Whatsits show up \color[blue]{in color} and are
+%D characterized bij their first character.\footnote [some note]
+%D {So we may encounter \type {w}, \type {m} and \type{s}.}
+%D They are \writestatus{dummy}{demo}\color[yellow]{stacked}.
+%D
+%D \egroup
+
+\newif\ifimmediatewrite
+
+\ifx\eTeXversion\undefined
+
+ \let\showwhatsits \relax
+ \let\dontshowwhatsits\relax
+
+\else
+
+ \let\supernormalmark \normalmark % mark may already been superseded
+ \let\supernormalmarks \normalmarks % mark may already been superseded
+
+ \def\showwhatsits
+ {\protected\def\normalmark {\visualwhatsit100+m\supernormalmark }%
+ \protected\def\normalmarks{\visualwhatsit100+m\supernormalmarks}%
+ \protected\def\special {\visualwhatsit0100s\normalspecial }%
+ \protected\def\write {\visualwhatsit001-w\normalwrite }%
+ \let\immediate\immediatewhatsit
+ \appendtoks\dontshowwhatsits\to\everystoptext}
+
+ \def\immediatewhatsit
+ {\bgroup\futurelet\next\doimmediatewhatsit}
+
+ \def\doimmediatewhatsit
+ {\ifx\next\write
+ \egroup\immediatewritetrue
+ \else
+ \egroup\expandafter\normalimmediate
+ \fi}
+
+ \def\dontshowwhatsits
+ {\let\immediate \normalimmediate
+ \let\normalmark\supernormalmark
+ \let\special \normalspecial
+ \let\write \normalwrite}
+
+ \def\visualwhatsit#1#2#3#4#5%
+ {\bgroup
+ \pushwhatsit
+ \dontinterfere
+ \dontcomplain
+ \dontshowcomposition
+ \dontshowwhatsits
+ \ttx
+ \ifvmode\donetrue\else\donefalse\fi
+ \setbox\scratchbox\hbox
+ {\ifdone
+ \colored[r=#1,g=#2,b=#3]{#5}% temp hack
+ \else
+ \colored[s=0]{#5}% temp hack
+ \fi}%
+ \setbox\scratchbox\hbox
+ {\ifdone
+ \colored[r=#1,g=#2,b=#3]{\vrule\!!width\wd\scratchbox}% temp hack
+ \else
+ \colored[s=0]{\vrule\!!width\wd\scratchbox}% temp hack
+ \fi
+ \hskip-\wd\scratchbox\box\scratchbox}%
+ \scratchdimen1ex
+ \setbox\scratchbox\hbox
+ {\ifdone\hskip\else\raise#4\fi\scratchdimen\box\scratchbox}%
+ \smashbox\scratchbox
+ \ifdone\nointerlineskip\fi
+ \box\scratchbox
+ \ifvmode\nointerlineskip\fi
+ \popwhatsit
+ \egroup
+ \ifimmediatewrite
+ \immediatewritefalse
+ \expandafter\normalimmediate
+ \fi}
+
+ \def\pushwhatsit
+ {\ifzeropt\lastskip
+ \ifcase\lastpenalty
+ \ifzeropt\lastkern
+ \ifhmode
+ \let\popwhatsit\relax
+ \else
+ \edef\popwhatsit{\prevdepth\the\prevdepth}%
+ \fi
+ \else
+ \ifhmode
+ \edef\popwhatsit{\kern\the\lastkern}\unkern
+ \else
+ \edef\popwhatsit{\kern\the\lastkern\prevdepth\the\prevdepth}%
+ \kern-\lastkern
+ \fi
+ \fi
+ \else
+ \ifhmode
+ \edef\popwhatsit{\the\lastpenalty}%
+ \unpenalty
+ \else
+ \edef\popwhatsit{\penalty\the\lastpenalty\prevdepth\the\prevdepth}%
+ %\nobreak
+ \fi
+ \fi
+ \else
+ \ifhmode
+ \edef\popwhatsit{\hskip\the\lastskip}\unskip
+ \else
+ \edef\popwhatsit{\vskip\the\lastskip\prevdepth\the\prevdepth}%
+ \vskip-\lastskip
+ \fi
+ \fi}
+
+\fi
+
+%D The next macro can be used to keep track of classes of
+%D boxes (handy for development cq.\ tracing).
+
+\def\dodotagbox#1#2#3% can be reimplemented
+ {\def\next##1##2##3##4%
+ {\vbox to \ht#2{##3\hbox to \wd#2{##1#3##2}##4}}%
+ \processaction
+ [#1]
+ [ l=>\next\relax\hfill\vfill\vfill,
+ r=>\next\hfill\relax\vfill\vfill,
+ t=>\next\hfill\hfill\relax\vfill,
+ b=>\next\hfill\hfill\vfill\relax,
+ lt=>\next\relax\hfill\relax\vfill,
+ lb=>\next\relax\hfill\vfill\relax,
+ rt=>\next\hfill\relax\relax\vfill,
+ rb=>\next\hfill\relax\vfill\relax,
+ tl=>\next\relax\hfill\relax\vfill,
+ bl=>\next\relax\hfill\vfill\relax,
+ tr=>\next\hfill\relax\relax\vfill,
+ br=>\next\hfill\relax\vfill\relax,
+ \s!default=>\next\hfill\hfill\vfill\vfill,
+ \s!unknown=>\next\hfill\hfill\vfill\vfill]}
+
+\def\dotagbox[#1]#2%
+ {\bgroup
+ \dowithnextbox
+ {\setbox\scratchbox\flushnextbox
+ \setbox\nextbox\ifhbox\nextbox\hbox\else\vbox\fi
+ \bgroup
+ \startoverlay
+ {\copy\scratchbox}
+ {\dodotagbox{#1}\scratchbox{\framed
+ [\c!background=\v!screen,\c!backgroundscreen=1]{#2}}}
+ \stopoverlay
+ \egroup
+ \nextboxwd\the\wd\scratchbox
+ \nextboxht\the\ht\scratchbox
+ \nextboxdp\the\dp\scratchbox
+ \flushnextbox
+ \egroup}}
+
+\def\tagbox
+ {\dosingleempty\dotagbox}
+
+%D \macros
+%D {coloredhbox,coloredvbox,coloredvtop,
+%D coloredstrut}
+%D
+%D The following visualizations are used in some of the manuals:
+
+\definecolor[boxcolor:ht][r=.5,g=.75,b=.5]
+\definecolor[boxcolor:dp][r=.5,g=.5,b=.75]
+\definecolor[boxcolor:wd][r=.75,g=.5,b=.5]
+\definecolor[strutcolor] [r=.5,g=.25,b=.25]
+
+\def\coloredbox#1%
+ {\dowithnextbox{#1{\hbox
+ {\blackrule[\c!width=\nextboxwd,\c!height=\nextboxht,\c!depth=\zeropoint,\c!color=boxcolor:ht]%
+ \hskip-\nextboxwd
+ \blackrule[\c!width=\nextboxwd,\c!height=\zeropoint,\c!depth=\nextboxdp,\c!color=boxcolor:dp]%
+ \hskip-\nextboxwd
+ \box\nextbox}}}#1}
+
+\def\coloredhbox{\coloredbox\hbox}
+\def\coloredvbox{\coloredbox\vbox}
+\def\coloredvtop{\coloredbox\vtop}
+
+\def\coloredstrut
+ {\color[strutcolor]{\def\strutwidth{2\points}\setstrut\strut}}
+
+\protect \endinput
diff --git a/tex/context/base/type-buy.mkii b/tex/context/base/type-buy.mkii
new file mode 100644
index 000000000..56fc92e62
--- /dev/null
+++ b/tex/context/base/type-buy.mkii
@@ -0,0 +1,571 @@
+%D \module
+%D [ file=type-buy,
+%D version=2003.07.08, % 2001.04.12,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=A Few Commercial Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% fallback
+
+% todo \typescriptthree
+
+\starttypescriptcollection[commercial fonts]
+
+% Informal : Vulis
+
+\starttypescript [casual] [informal] [name]
+ \definefontsynonym [Serif] [Informal-Regular]
+ \definefontsynonym [SerifBold] [Informal-Bold]
+ \definefontsynonym [SerifSlanted] [Informal-Oblique]
+ \definefontsynonym [SerifItalic] [Informal-Oblique]
+ \definefontsynonym [SerifBoldSlanted] [Informal-BoldOblique]
+ \definefontsynonym [SerifBoldItalic] [Informal-BoldOblique]
+ \definefontsynonym [SerifCaps] [Informal-Regular]
+\stoptypescript
+
+\starttypescript [math] [informal] [name]
+ \definefontsynonym [MathRoman] [Informal-Regular]
+ \definefontsynonym [MathExtension] [Informal-MathExtendedSymbols]
+ \definefontsynonym [MathItalic] [Informal-MathItalics]
+ \definefontsynonym [MathSymbol] [Informal-MathSymbols]
+\stoptypescript
+
+\starttypescript [casual] [informal] [default]
+ \definefontsynonym [Informal-Regular] [ifrm10cm]
+ \definefontsynonym [Informal-Bold] [ifrb10cm]
+ \definefontsynonym [Informal-Oblique] [ifro10cm]
+ \definefontsynonym [Informal-BoldOblique] [ifbo10cm]
+ \loadmapfile[original-micropress-informal.map]
+\stoptypescript
+
+\starttypescript [math] [informal] [default]
+ \definefontsynonym [Informal-Regular] [ifrm10cm]
+ \definefontsynonym [Informal-MathExtendedSymbols] [ifex10]
+ \definefontsynonym [Informal-MathItalics] [ifmi10]
+ \definefontsynonym [Informal-MathSymbols] [ifsy10]
+ \loadmapfile[original-micropress-informal.map]
+\stoptypescript
+
+% ITC Officina
+
+\starttypescript [serif] [officina] [name]
+ \definefontsynonym [Serif] [OfficinaSerif-Book]
+ \definefontsynonym [SerifItalic] [OfficinaSerif-BookItalic]
+ \definefontsynonym [SerifSlanted] [OfficinaSerif-BookSlanted]
+ \definefontsynonym [SerifBold] [OfficinaSerif-Bold]
+ \definefontsynonym [SerifBoldItalic] [OfficinaSerif-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [OfficinaSerif-BoldSlanted]
+ \definefontsynonym [SerifCaps] [OfficinaSerif-Caps]
+\stoptypescript
+
+\starttypescript [sans] [officina] [name]
+ \definefontsynonym [Sans] [OfficinaSans-Book]
+ \definefontsynonym [SansItalic] [OfficinaSans-BookItalic]
+ \definefontsynonym [SansSlanted] [OfficinaSans-BookSlanted]
+ \definefontsynonym [SansBold] [OfficinaSans-Bold]
+ \definefontsynonym [SansBoldItalic] [OfficinaSans-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [OfficinaSans-BoldSlanted]
+ \definefontsynonym [SansCaps] [OfficinaSans-Caps]
+\stoptypescript
+
+\starttypescript [serif] [officina] [texnansi,ec,8r]
+ \definefontsynonym [OfficinaSerif-Book] [\typescriptthree-ovbk] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BookItalic] [\typescriptthree-ovwi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-Bold] [\typescriptthree-ovb] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BoldItalic] [\typescriptthree-ovbi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BookSlanted] [\typescriptthree-ovbk-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BoldSlanted] [\typescriptthree-ovb-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-Caps] [\typescriptthree-ovbk-capitalized-800] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-itc-officina.map]
+\stoptypescript
+
+\starttypescript [sans] [officina] [texnansi,ec,8r]
+ \definefontsynonym [OfficinaSans-Book] [\typescriptthree-owbk] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BookItalic] [\typescriptthree-owwi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-Bold] [\typescriptthree-owb] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BoldItalic] [\typescriptthree-owbi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BookSlanted] [\typescriptthree-owbk-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BoldSlanted] [\typescriptthree-owb-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-Caps] [\typescriptthree-owbk-capitalized-800] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-itc-officina.map]
+\stoptypescript
+
+% FontFont Meta
+
+\starttypescript [sans] [meta] [name]
+ \definefontsynonym [Sans] [MetaNormal-Roman]
+ \definefontsynonym [SansItalic] [MetaNormal-Italic]
+ \definefontsynonym [SansSlanted] [MetaNormal-Italic]
+ \definefontsynonym [SansBold] [MetaBold-Roman]
+ \definefontsynonym [SansBoldItalic] [MetaBold-Italic]
+ \definefontsynonym [SansBoldSlanted][MetaBold-Italic]
+ \definefontsynonym [SansCaps] [MetaNormal-Caps]
+\stoptypescript
+
+\starttypescript [sans] [meta-medium] [name]
+ \definefontsynonym [Sans] [MetaMedium-Roman]
+ \definefontsynonym [SansItalic] [MetaMedium-Italic]
+ \definefontsynonym [SansSlanted] [MetaMedium-Italic]
+ \definefontsynonym [SansBold] [MetaBold-Roman]
+ \definefontsynonym [SansBoldItalic] [MetaBold-Italic]
+ \definefontsynonym [SansBoldSlanted][MetaBold-Italic]
+ \definefontsynonym [SansCaps] [MetaMedium-Caps]
+\stoptypescript
+
+\starttypescript [sans] [meta-lf] [name]
+ \definefontsynonym [Sans] [MetaBookLF-Roman]
+ \definefontsynonym [SansBold] [MetaBoldLF-Roman]
+ \definefontsynonym [SansItalic] [MetaBookLF-Italic]
+ \definefontsynonym [SansBoldItalic] [MetaBoldLF-Italic]
+ \definefontsynonym [SansCaps] [MetaBookLF-Caps]
+\stoptypescript
+
+\starttypescript [sans] [meta,meta-book] [texnansi,ec,8r]
+ \definefontsynonym [MetaBook-Roman] [\typescriptthree-mtbk] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBook-Italic] [\typescriptthree-mtbki] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBook-Caps] [\typescriptthree-mtbkc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBook-ItalicCaps] [\typescriptthree-mtbkic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-lf,meta-book-lf] [texnansi,ec,8r]
+ \definefontsynonym [MetaBookLF-Roman] [\typescriptthree-mtbkf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBookLF-Italic] [\typescriptthree-mtbkfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBookLF-Caps] [\typescriptthree-mtbkfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBookLF-ItalicCaps] [\typescriptthree-mtbkfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta,meta-bold] [texnansi,ec,8r]
+ \definefontsynonym [MetaBold-Roman] [\typescriptthree-mtbd] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBold-Italic] [\typescriptthree-mtbdi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBold-Caps] [\typescriptthree-mtbdc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBold-ItalicCaps] [\typescriptthree-mtbdic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-lf,meta-bold-lf] [texnansi,ec,8r]
+ \definefontsynonym [MetaBoldLF-Roman] [\typescriptthree-mtbdf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBoldLF-Italic] [\typescriptthree-mtbdfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBoldLF-Caps] [\typescriptthree-mtbdfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBoldLF-ItalicCaps] [\typescriptthree-mtbdfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-normal] [texnansi,ec,8r]
+ \definefontsynonym [MetaNormal-Roman] [\typescriptthree-mtn] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormal-Italic] [\typescriptthree-mtni] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormal-Caps] [\typescriptthree-mtnc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormal-ItalicCaps] [\typescriptthree-mtnic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-normal-lf] [texnansi,ec,8r]
+ \definefontsynonym [MetaNormalLF-Roman] [\typescriptthree-mtnf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormalLF-Italic] [\typescriptthree-mtnfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormalLF-Caps] [\typescriptthree-mtnfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormalLF-ItalicCaps] [\typescriptthree-mtnfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-medium] [texnansi,ec,8r]
+ \definefontsynonym [MetaMedium-Roman] [\typescriptthree-mtm] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMedium-Italic] [\typescriptthree-mtmi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMedium-Caps] [\typescriptthree-mtmc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMedium-ItalicCaps] [\typescriptthree-mtmic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-medium-lf] [texnansi,ec,8r]
+ \definefontsynonym [MetaMediumLF-Roman] [\typescriptthree-mtmf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMediumLF-Italic] [\typescriptthree-mtmfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMediumLF-Caps] [\typescriptthree-mtmfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMediumLF-ItalicCaps] [\typescriptthree-mtmfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-black] [texnansi,ec,8r]
+ \definefontsynonym [MetaBlack-Roman] [\typescriptthree-mtbl] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlack-Italic] [\typescriptthree-mtbli] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlack-Caps] [\typescriptthree-mtblc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlack-ItalicCaps] [\typescriptthree-mtblic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [sans] [meta-black-lf] [texnansi,ec,8r]
+ \definefontsynonym [MetaBlackLF-Roman] [\typescriptthree-mtblf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlackLF-Italic] [\typescriptthree-mtblfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlackLF-Caps] [\typescriptthree-mtblfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlackLF-ItalicCaps] [\typescriptthree-mtblfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+\starttypescript [expert] [meta] % incomplete
+ \definefontsynonym [MetaNormal-Expert] [mtnx]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
+\stoptypescript
+
+%D Linotype Univers
+
+\starttypescript [sans] [univers,univers-light,univers-black] [name]
+ \definefontsynonym [Sans] [Univers]
+ \definefontsynonym [SansBold] [Univers-Bold]
+ \definefontsynonym [SansSlanted] [Univers-Oblique]
+ \definefontsynonym [SansBoldSlanted] [Univers-BoldOblique]
+\stoptypescript
+
+\starttypescript [sans] [univers-light] [name]
+ \definefontsynonym [Sans] [Univers-Light]
+ \definefontsynonym [SansSlanted] [Univers-LightOblique]
+\stoptypescript
+
+\starttypescript [sans] [univers-black] [name]
+ \definefontsynonym [Sans] [Univers-Black]
+ \definefontsynonym [SansSlanted] [Univers-BlackOblique]
+ \definefontsynonym [SansBold] [Univers-Black]
+ \definefontsynonym [SansBoldSlanted] [Univers-BlackOblique]
+\stoptypescript
+
+\starttypescript [sans] [univers,univers-black,univers-light] [texnansi,ec,8r]
+ \definefontsynonym [Univers-Light] [\typescriptthree-lt50136] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-LightOblique] [\typescriptthree-lt50137] [encoding=\typescriptthree]
+ \definefontsynonym [Univers] [\typescriptthree-lt50138] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-Oblique] [\typescriptthree-lt50139] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-Bold] [\typescriptthree-lt50140] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-BoldOblique] [\typescriptthree-lt50141] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-Black] [\typescriptthree-lt50142] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-BlackOblique] [\typescriptthree-lt50143] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-univers.map]
+\stoptypescript
+
+% mendoza
+
+\starttypescript [serif] [mendoza] [name]
+ \definefontsynonym [Serif] [MendozaRoman-Book]
+ \definefontsynonym [SerifCaps] [MendozaRoman-Book]
+ \definefontsynonym [SerifSlanted] [MendozaRoman-BookItalic]
+ \definefontsynonym [SerifItalic] [MendozaRoman-BookItalic]
+ \definefontsynonym [SerifBold] [MendozaRoman-Bold]
+ \definefontsynonym [SerifBoldSlanted] [MendozaRoman-BoldItalic]
+ \definefontsynonym [SerifBoldItalic] [MendozaRoman-BoldItalic]
+\stoptypescript
+
+\starttypescript [serif] [mendoza] [ec,8r,texnansi]
+ \definefontsynonym[MendozaRoman-Bold] [\typescriptthree-zab] [encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-BoldItalic] [\typescriptthree-zabi][encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-Medium] [\typescriptthree-zam] [encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-MediumItalic][\typescriptthree-zami][encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-Book] [\typescriptthree-zaw] [encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-BookItalic] [\typescriptthree-zawi][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-mendoza.map]
+\stoptypescript
+
+% frutiger
+
+\starttypescript [sans] [frutiger] [name]
+ \definefontsynonym [Sans] [Frutiger-Roman]
+ \definefontsynonym [SansCaps] [Frutiger-Roman]
+ \definefontsynonym [SansItalic] [Frutiger-Italic]
+ \definefontsynonym [SansSlanted] [Frutiger-Italic]
+ \definefontsynonym [SansBold] [Frutiger-Bold]
+ \definefontsynonym [SansBoldItalic] [Frutiger-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [Frutiger-BoldItalic]
+\stoptypescript
+
+\starttypescript [sans] [frutiger] [ec,8r,texnansi]
+ \definefontsynonym[Frutiger-Bold] [\typescriptthree-ftb] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-BoldItalic] [\typescriptthree-ftbi] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Black] [\typescriptthree-ftbl] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-BlackItalic][\typescriptthree-ftbli][encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Italic] [\typescriptthree-fti] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Light] [\typescriptthree-ftl] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-LightItalic][\typescriptthree-ftli] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Roman] [\typescriptthree-ftr] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-UltraBlack] [\typescriptthree-ftubl][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-adobe-frutiger.map]
+\stoptypescript
+
+\starttypescript [frutiger] [texnansi,ec,8r,uc]
+ \definetypeface [frutiger] [ss] [sans] [frutiger] [default] [encoding=\typescripttwo]
+% \loadmapfile [\typescripttwo-adobe-frutiger.map]
+\stoptypescript
+
+% kabel
+
+\starttypescript [sans] [kabel] [ec,8r,texnansi]
+ \definefontsynonym [ItcKabel-Bold] [\typescriptthree-kbb] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Demi] [\typescriptthree-kbd] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Medium] [\typescriptthree-kbm] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Ultra] [\typescriptthree-kbu] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Book] [\typescriptthree-kbw] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-itc-kabel.map]
+\stoptypescript
+
+% thesans
+
+\starttypescript [sans] [thesans] [name]
+ \definefontsynonym [Sans] [TheSans-Plain]
+ \definefontsynonym [SansItalic] [TheSans-Italic]
+ \definefontsynonym [SansSlanted] [TheSans-Italic]
+ \definefontsynonym [SansBold] [TheSansBold-Plain]
+ \definefontsynonym [SansBoldItalic] [TheSansBold-Italic]
+ \definefontsynonym [SansBoldSlanted] [TheSansBold-Italic]
+ \definefontsynonym [SansCaps] [TheSans-Caps]
+ \definefontsynonym [SansCapsItalic] [TheSans-CapsItalic]
+ \definefontsynonym [SansCapsSlanted] [TheSans-CapsItalic]
+ \definefontsynonym [SansCapsBold] [TheSansBold-Caps]
+ \definefontsynonym [SansCapsBoldItalic] [TheSansBold-CapsItalic]
+ \definefontsynonym [SansCapsBoldSlanted] [TheSansBold-CapsItalic]
+\stoptypescript
+
+\starttypescript [mono] [thesans] [name]
+ \definefontsynonym [Mono] [TheSansTypewriter-Plain]
+ \definefontsynonym [MonoCaps] [TheSansTypewriter-Plain]
+ \definefontsynonym [MonoItalic] [TheSansTypewriter-Italic]
+ \definefontsynonym [MonoSlanted] [TheSansTypewriter-Italic]
+ \definefontsynonym [MonoBold] [TheSansTypewriter-Bold]
+ \definefontsynonym [MonoBoldItalic] [TheSansTypewriter-BoldItalic]
+ \definefontsynonym [MonoBoldSlanted] [TheSansTypewriter-BoldItalic]
+\stoptypescript
+
+\starttypescript [sans] [thesans] [ec,8r,texnansi]
+ \definefontsynonym [TheSans-Plain] [\typescriptthree-tsan5] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-Italic] [\typescriptthree-tsan5i] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Plain] [\typescriptthree-tsan7] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Italic] [\typescriptthree-tsan7i] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-Caps] [\typescriptthree-tsan5c] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-CapsItalic] [\typescriptthree-tsan5ci] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Caps] [\typescriptthree-tsan7c] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-CapsItalic] [\typescriptthree-tsan7ci] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-lucas-thesans.map]
+\stoptypescript
+
+\starttypescript [mono] [thesans] [ec,8r,texnansi]
+ \definefontsynonym [TheSansTypewriter-Plain] [\typescriptthree-tsaty5] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansTypewriter-Italic] [\typescriptthree-tsaty5i] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansTypewriter-Bold] [\typescriptthree-tsaty7] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansTypewriter-BoldItalic] [\typescriptthree-tsaty7i] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-lucas-thesans.map]
+\stoptypescript
+
+\starttypescript [expert] [thesans]
+ \definefontsynonym [TheSans-Expert] [tsan5e] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-ExpertItalic] [tsan5ei] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Expert] [tsan7e] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-ExpertItalic] [tsan7ei] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-lucas-thesans.map]
+\stoptypescript
+
+% monotype sabon
+
+\starttypescript [serif] [sabon] [name]
+ \definefontsynonym [Serif] [SabonMT]
+ \definefontsynonym [SerifItalic] [SabonMT-Italic]
+ \definefontsynonym [SerifSlanted] [SabonMT-Italic]
+ \definefontsynonym [SerifBold] [SabonMT-SemiBold]
+ \definefontsynonym [SerifBoldItalic] [SabonMT-SemiBoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [SabonMT-SemiBoldItalic]
+ \definefontsynonym [SerifCaps] [SabonMT-RegularSC]
+\stoptypescript
+
+\starttypescript [serif] [sabon] [ec,8r,texnansi]
+ \definefontsynonym[SabonMT] [\typescriptthree-sab] [encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-Italic] [\typescriptthree-sabi] [encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-ItalicOsF] [\typescriptthree-saboi][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBoldOsF] [\typescriptthree-sabos][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBold] [\typescriptthree-sabs] [encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-RegularSC] [\typescriptthree-sabsc][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBoldItalic] [\typescriptthree-sabsi][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBoldItalicOsF][\typescriptthree-sasio][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-monotype-sabon.map]
+\stoptypescript
+
+% itc stone
+
+\starttypescript [sans] [stone] [name]
+ \definefontsynonym [Sans] [StoneSansITC-Medium]
+ \definefontsynonym [SansItalic] [StoneSansITC-MediumItalic]
+ \definefontsynonym [SansSlanted] [StoneSansITC-MediumItalic]
+ \definefontsynonym [SansBold] [StoneSansITC-Bold]
+ \definefontsynonym [SansBoldItalic] [StoneSansITC-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [StoneSansITC-BoldItalic]
+ \definefontsynonym [SansCaps] [StoneSansSCITC-Medium]
+\stoptypescript
+
+\starttypescript [serif] [stone] [name]
+ \definefontsynonym [Serif] [StoneSerifITC-Medium]
+ \definefontsynonym [SerifItalic] [StoneSerifITC-MediumItalic]
+ \definefontsynonym [SerifSlanted] [StoneSerifITC-MediumItalic]
+ \definefontsynonym [SerifBold] [StoneSerifITC-Bold]
+ \definefontsynonym [SerifBoldItalic] [StoneSerifITC-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [StoneSerifITC-BoldItalic]
+ \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium]
+\stoptypescript
+
+\starttypescript [sans] [stone-oldstyle] [name]
+ \definefontsynonym [Sans] [StoneSansOSITC-Medium]
+ \definefontsynonym [SansItalic] [StoneSansOSITC-MediumItalic]
+ \definefontsynonym [SansSlanted] [StoneSansOSITC-MediumItalic]
+ \definefontsynonym [SansBold] [StoneSansOSITC-Bold]
+ \definefontsynonym [SansBoldItalic] [StoneSansOSITC-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [StoneSansOSITC-BoldItalic]
+ \definefontsynonym [SansCaps] [StoneSansSCITC-Medium]
+\stoptypescript
+
+\starttypescript [serif] [stone-oldstyle] [name]
+ \definefontsynonym [Serif] [StoneSerifOSITC-Medium]
+ \definefontsynonym [SerifItalic] [StoneSerifOSITC-MediumItalic]
+ \definefontsynonym [SerifSlanted] [StoneSerifOSITC-MediumItalic]
+ \definefontsynonym [SerifBold] [StoneSerifOSITC-Bold]
+ \definefontsynonym [SerifBoldItalic] [StoneSerifOSITC-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [StoneSerifOSITC-BoldItalic]
+ \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium]
+\stoptypescript
+
+\starttypescript [sans] [stone] [ec,texnansi]
+ \definefontsynonym[StoneSansITC-Bold] [\typescriptthree-stosnb] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansITC-BoldItalic] [\typescriptthree-stosnbi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansITC-Medium] [\typescriptthree-stosnm] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansITC-MediumItalic] [\typescriptthree-stosnmi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-Bold] [\typescriptthree-stosnob] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-BoldItalic] [\typescriptthree-stosnobi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-Medium] [\typescriptthree-stosnom] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-MediumItalic][\typescriptthree-stosnomi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSCITC-Medium] [\typescriptthree-stosnscm][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemITC-Semi] [\typescriptthree-stosns] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemITC-SemiIta] [\typescriptthree-stosnsi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemOSITC-Semi] [\typescriptthree-stosnos] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemOSITC-SemiIta] [\typescriptthree-stosnosi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemSCITC-Semi] [\typescriptthree-stosnscs][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-stone.map]
+\stoptypescript
+
+\starttypescript [serif] [stone] [ec,texnansi]
+ \definefontsynonym[StoneSerifITC-Bold] [\typescriptthree-stosfb] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifITC-BoldItalic] [\typescriptthree-stosfbi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifITC-Medium] [\typescriptthree-stosfm] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifITC-MediumItalic] [\typescriptthree-stosfmi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-Bold] [\typescriptthree-stosfob] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-BoldItalic] [\typescriptthree-stosfobi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-Medium] [\typescriptthree-stosfom] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-MediumItalic][\typescriptthree-stosfomi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSCITC-Medium] [\typescriptthree-stosfscm][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemITC-Semi] [\typescriptthree-stosfs] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemITC-SemiIta] [\typescriptthree-stosfsi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemOSITC-Semi] [\typescriptthree-stosfos] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemOSITC-SemiIta] [\typescriptthree-stosfosi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemSCITC-Semi] [\typescriptthree-stosfscs][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-stone.map]
+\stoptypescript
+
+% linotype industria
+
+\starttypescript [sans] [industria] [ec,texnansi]
+ \definefontsynonym[Industria-Solid][\typescriptthree-lt50545][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-industria.map]
+\stoptypescript
+
+% itc bauhaus
+%
+% texfont --enc=texnansi --ven=itc --col=bauhaus type-buy.dat
+
+\starttypescript [sans] [bauhaus] [ec,texnansi]
+ \definefontsynonym[Bauhaus-Light] [\typescriptthree-bhl] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Medium] [\typescriptthree-bhm] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Demi] [\typescriptthree-bhd] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Bold] [\typescriptthree-bhb] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Heavy] [\typescriptthree-bhh] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Bold-Slanted] [\typescriptthree-bhb-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Demi-Slanted] [\typescriptthree-bhd-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Heavy-Slanted] [\typescriptthree-bhh-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Light-Slanted] [\typescriptthree-bhl-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Medium-Slanted][\typescriptthree-bhm-slanted-167][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-bauhaus.map]
+\stoptypescript
+
+% ef swift
+%
+% texfont --enc=texnansi --ven=ef --col=swift type-buy.dat
+
+\starttypescript [serif] [swift] [name]
+ \definefontsynonym [Serif] [SwiftEF-Regular]
+ \definefontsynonym [SerifItalic] [SwiftEF-RegularItalic]
+ \definefontsynonym [SerifSlanted] [SwiftEF-RegularItalic]
+ \definefontsynonym [SerifBold] [SwiftEF-Bold]
+ \definefontsynonym [SerifBoldItalic] [SwiftEF-Bold]
+ \definefontsynonym [SerifBoldSlanted] [SwiftEF-Bold]
+ \definefontsynonym [SerifCaps] [SwiftSCEF-Regular]
+\stoptypescript
+
+\starttypescript [serif] [swift-light] [name]
+ \definefontsynonym [Serif] [SwiftEF-Light]
+ \definefontsynonym [SerifItalic] [SwiftEF-LightItalic]
+ \definefontsynonym [SerifSlanted] [SwiftEF-LightItalic]
+ \definefontsynonym [SerifBold] [SwiftEF-Regular]
+ \definefontsynonym [SerifBoldItalic] [SwiftEF-RegularItalic]
+ \definefontsynonym [SerifBoldSlanted] [SwiftEF-RegularItalic]
+ \definefontsynonym [SerifCaps] [SwiftSCEF-Regular]
+\stoptypescript
+
+\starttypescript [serif] [swift] [ec,texnansi]
+ \definefontsynonym[SwiftEF-Light] [\typescriptthree-swlt] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-Regular] [\typescriptthree-swrg] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-Bold] [\typescriptthree-swbd] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-ExtraBold] [\typescriptthree-swxb] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-LightItalic] [\typescriptthree-swlti][encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-RegularItalic][\typescriptthree-swrgi][encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-BoldCondensed][\typescriptthree-swbdc][encoding=\typescriptthree]
+ \definefontsynonym[SwiftSCEF-Regular] [\typescriptthree-swrgs][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-ef-swift.map]
+\stoptypescript
+
+% linotype syntax
+
+\starttypescript [sans] [syntax] [name]
+ \definefontsynonym [Sans] [SyntaxLT-Roman]
+ \definefontsynonym [SansItalic] [SyntaxLT-Italic]
+ \definefontsynonym [SansSlanted] [SyntaxLT-Italic]
+ \definefontsynonym [SansBold] [SyntaxLT-Black]
+ \definefontsynonym [SansBoldItalic] [SyntaxLT-Black]
+ \definefontsynonym [SansBoldSlanted][SyntaxLT-Black]
+\stoptypescript
+
+\starttypescript [sans] [syntax] [ec,texnansi]
+ \definefontsynonym [SyntaxLT-Roman] [\typescriptthree-lte50617] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-Italic] [\typescriptthree-lte50618] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-Bold] [\typescriptthree-lte50619] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-Black] [\typescriptthree-lte50620] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-UltraBlack] [\typescriptthree-lte50621] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-syntax.map]
+\stoptypescript
+
+% linotype linoletter
+
+\starttypescript [serif] [linoletter] [name]
+ \definefontsynonym [Serif] [LinoLetterLT-Roman]
+ \definefontsynonym [SerifItalic] [LinoLetterLT-Italic]
+ \definefontsynonym [SerifSlanted] [LinoLetterLT-Italic]
+ \definefontsynonym [SerifBold] [LinoLetterLT-Bold]
+ \definefontsynonym [SerifBoldItalic] [LinoLetterLT-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted][LinoLetterLT-BoldItalic]
+\stoptypescript
+
+\starttypescript [serif] [linoletter] [ec,texnansi]
+ \definefontsynonym[LinoLetterLT-Roman] [texnansi-lte51129] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-Italic] [texnansi-lte51130] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-Bold] [texnansi-lte51133] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-BoldItalic] [texnansi-lte51134] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-BlackItalic] [texnansi-lte51136] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetter-MediumSC] [texnansi-llmsc] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-linoletter.map]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-buy.mkiv b/tex/context/base/type-buy.mkiv
new file mode 100644
index 000000000..becc4361c
--- /dev/null
+++ b/tex/context/base/type-buy.mkiv
@@ -0,0 +1,82 @@
+%D \module
+%D [ file=type-buy,
+%D version=2003.07.08, % 2001.04.12,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=A Few Commercial Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\starttypescriptcollection[commercial fonts]
+
+% Informal : Vulis
+
+\starttypescript [casual] [informal]
+ \definefontsynonym [Serif] [Informal-Regular]
+ \definefontsynonym [SerifBold] [Informal-Bold]
+ \definefontsynonym [SerifSlanted] [Informal-Oblique]
+ \definefontsynonym [SerifItalic] [Informal-Oblique]
+ \definefontsynonym [SerifBoldSlanted] [Informal-BoldOblique]
+ \definefontsynonym [SerifBoldItalic] [Informal-BoldOblique]
+ \definefontsynonym [SerifCaps] [Informal-Regular]
+\stoptypescript
+
+\starttypescript [math] [informal] [name]
+ \definefontsynonym [MathRoman] [Informal-Regular]
+ \definefontsynonym [MathExtension] [Informal-MathExtendedSymbols]
+ \definefontsynonym [MathItalic] [Informal-MathItalics]
+ \definefontsynonym [MathSymbol] [Informal-MathSymbols]
+\stoptypescript
+
+\starttypescript [casual] [informal]
+ \definefontsynonym [Informal-Regular] [file:ifrg]
+ \definefontsynonym [Informal-Bold] [file:ifb]
+ \definefontsynonym [Informal-Oblique] [file:ifo]
+ \definefontsynonym [Informal-BoldOblique] [file:ifbo]
+\stoptypescript
+
+\starttypescript [math] [informal] [default]
+ \loadfontgoodies[informal-math]
+ \definefontsynonym[MathRoman][informalmath@informal-math]
+\stoptypescript
+
+\starttypescript [informal]
+ \definetypeface[informal][rm][casual][informal][default]
+ \definetypeface[informal][tt][mono] [modern] [default][rscale=0.95]
+ \definetypeface[informal][mm][math] [informal][default]
+\stoptypescript
+
+% Sabon
+
+\starttypescript [serif] [sabon] [name]
+
+ \definefontsynonym [Serif] [SabonMT]
+ \definefontsynonym [SerifItalic] [SabonMT-Italic]
+ \definefontsynonym [SerifSlanted] [SabonMT-Italic]
+ \definefontsynonym [SerifBold] [SabonMT-SemiBold]
+ \definefontsynonym [SerifBoldItalic] [SabonMT-SemiBoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [SabonMT-SemiBoldItalic]
+ \definefontsynonym [SerifCaps] [SabonMT-RegularSC]
+
+ \definefontsynonym[SabonMT] [sab_____]
+ \definefontsynonym[SabonMT-Italic] [sabi____]
+ \definefontsynonym[SabonMT-ItalicOsF] [saboi___]
+ \definefontsynonym[SabonMT-SemiBoldOsF] [sabos___]
+ \definefontsynonym[SabonMT-SemiBold] [sabs____]
+ \definefontsynonym[SabonMT-RegularSC] [sabsc___]
+ \definefontsynonym[SabonMT-SemiBoldItalic] [sabsi___]
+ \definefontsynonym[SabonMT-SemiBoldItalicOsF][sasio___]
+\stoptypescript
+
+% \definetypeface[sabon][rm][serif][sabon][default]
+% \setupbodyfont[sabon]
+% \starttext
+% \input tufte
+% \stoptext
+
+\stoptypescriptcollection
+
diff --git a/tex/context/base/type-cbg.mkii b/tex/context/base/type-cbg.mkii
new file mode 100644
index 000000000..93cfa077e
--- /dev/null
+++ b/tex/context/base/type-cbg.mkii
@@ -0,0 +1,352 @@
+%D \module
+%D [ file=type-cbg,
+%D version=2004.08.23,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=CB Greek,
+%D author={Giuseppe Bilotta, Hans Hagen},
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% legend:
+%
+% g=greek
+% r=regular s=sansserif t=typewriter
+% m=medium x=boldextended t=monospaced
+% n=normal o=oblique i=italic u=uprightitalic c=smallcaps
+
+% ruby script to make small zip file:
+%
+% zipfile = 'cbsmall.zip'
+%
+% fontfiles = Array.new
+%
+% fontfiles.push(Dir.glob("fonts/{tfm,vf,afm,type1}/public/cb/{gr,gs,gt}{m,s,t}{n,o,i,u,c}{0800,1000,1200}.{tfm,afm,pfb}"))
+% fontfiles.push(Dir.glob("fonts/{map,enc,lig}/{dvips,pdftex,dvipdfm,dvipdfmx}/cb/{cbgreek,cbsmall}.{map,enc,lig}"))
+%
+% File.delete(zipfile) if FileTest.file?(zipfile)
+% system("zip -r -9 cbsmall #{fontfiles.join(' ')}")
+
+\starttypescriptcollection[cbgreek]
+
+\starttypescript [serif] [cbgreek] [name]
+ \definefontsynonym [CBGreek-Regular-Medium-Normal] [grmn1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Oblique] [grmo1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Italic] [grmi1000]
+ \definefontsynonym [CBGreek-Regular-Medium-UprightItalic] [grmu1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Caps] [grmc1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Leipzig] [grml1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Roman] [grmr1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Normal] [grxn1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Oblique] [grxo1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Italic] [grxi1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-UprightItalic] [grxu1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Caps] [grxc1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Leipzig] [grxl1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Roman] [grxr1000]
+ \loadmapfile [cbgreek.map]
+\stoptypescript
+
+\starttypescript [sans] [cbgreek] [name]
+ \definefontsynonym [CBGreek-Sans-Medium-Normal] [gsmn1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Oblique] [gsmo1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Italic] [gsmi1000]
+ \definefontsynonym [CBGreek-Sans-Medium-UprightItalic] [gsmu1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Caps] [gsmc1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Leipzig] [gsml1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Roman] [gsmr1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Normal] [gsxn1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Oblique] [gsxo1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Italic] [gsxi1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-UprightItalic] [gsxu1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Caps] [gsxc1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Leipzig] [gsxl1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Roman] [gsxr1000]
+ \loadmapfile [cbgreek.map]
+\stoptypescript
+
+\starttypescript [mono] [cbgreek] [name]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Normal] [gttn1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Oblique] [gtto1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Italic] [gtti1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-UprightItalic] [gttu1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Caps] [gttc1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Leipzig] [gttl1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Roman] [gttr1000]
+ \loadmapfile [cbgreek.map]
+\stoptypescript
+
+\starttypescript [serif] [cbgreek] [name]
+ \definefontsynonym [Serif] [CBGreek-Regular-Medium-Normal]
+ \definefontsynonym [SerifSlanted] [CBGreek-Regular-Medium-Oblique]
+ \definefontsynonym [SerifItalic] [CBGreek-Regular-Medium-Italic]
+ \definefontsynonym [SerifCaps] [CBGreek-Regular-Medium-Caps]
+ \definefontsynonym [SerifBold] [CBGreek-Regular-BoldExtended-Normal]
+ \definefontsynonym [SerifBoldSlanted] [CBGreek-Regular-BoldExtended-Oblique]
+ \definefontsynonym [SerifBoldItalic] [CBGreek-Regular-BoldExtended-Italic]
+ \definefontsynonym [SerifBoldCaps] [CBGreek-Regular-BoldExtended-Caps]
+ \loadmapfile [cbgreek.map]
+\stoptypescript
+
+\starttypescript [sans] [cbgreek] [name]
+ \definefontsynonym [Sans] [CBGreek-Sans-Medium-Normal]
+ \definefontsynonym [SansSlanted] [CBGreek-Sans-Medium-Oblique]
+ \definefontsynonym [SansItalic] [CBGreek-Sans-Medium-Italic]
+ \definefontsynonym [SansCaps] [CBGreek-Sans-Medium-Caps]
+ \definefontsynonym [SansBold] [CBGreek-Sans-BoldExtended-Normal]
+ \definefontsynonym [SansBoldSlanted] [CBGreek-Sans-BoldExtended-Oblique]
+ \definefontsynonym [SansBoldItalic] [CBGreek-Sans-BoldExtended-Italic]
+ \definefontsynonym [SansBoldCaps] [CBGreek-Sans-BoldExtended-Caps]
+ \loadmapfile [cbgreek.map]
+\stoptypescript
+
+\starttypescript [mono] [cbgreek] [name]
+ \definefontsynonym [Mono] [CBGreek-Typewriter-Medium-Normal]
+ \definefontsynonym [MonoSlanted] [CBGreek-Typewriter-Medium-Oblique]
+ \definefontsynonym [MonoItalic] [CBGreek-Typewriter-Medium-Italic]
+ \definefontsynonym [MonoCaps] [CBGreek-Typewriter-Medium-Caps]
+ \loadmapfile [cbgreek.map]
+\stoptypescript
+
+% Please note that we use Bold Extended instead of Bold
+
+\starttypescript [serif] [cbgreek-all] [size]
+
+ \definebodyfont [4pt,5pt] [rm]
+ [tf=grmn0500 sa 1,sl=grmo0500 sa 1,it=grmi0500 sa 1,
+ bf=grxn0500 sa 1,bs=grxo0500 sa 1,bi=grxi0500 sa 1,
+ sc=grmc0500 sa 1]
+
+ \definebodyfont [6pt] [rm]
+ [tf=grmn0600,sl=grmo0600,it=grmi0600,
+ bf=grxn0600,bs=grxo0600,bi=grxi0600,
+ sc=grmc0600]
+
+ \definebodyfont [7pt] [rm]
+ [tf=grmn0700,sl=grmo0700,it=grmi0700,
+ bf=grxn0700,bs=grxo0700,bi=grxi0700,
+ sc=grmc0700]
+
+ \definebodyfont [8pt] [rm]
+ [tf=grmn0800,sl=grmo0800,it=grmi0800,
+ bf=grxn0800,bs=grxo0800,bi=grxi0800,
+ sc=grmc0800]
+
+ \definebodyfont [9pt] [rm]
+ [tf=grmn0900,sl=grmo0900,it=grmi0900,
+ bf=grxn0900,bs=grxo0900,bi=grxi0900,
+ sc=grmc0900]
+
+ \definebodyfont [10pt] [rm]
+ [tf=grmn1000,sl=grmo1000,it=grmi1000,
+ bf=grxn1000,bs=grxo1000,bi=grxi1000,
+ sc=grmc1000]
+
+ \definebodyfont [11pt] [rm]
+ [tf=grmn1095,sl=grmo1095,it=grmi1095,
+ bf=grxn1095,bs=grxo1095,bi=grxi1095,
+ sc=grmc1095]
+
+ \definebodyfont [12pt] [rm]
+ [tf=grmn1200,sl=grmo1200,it=grmi1200,
+ bf=grxn1200,bs=grxo1200,bi=grxi1200,
+ sc=grmc1200]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [rm]
+ [tf=grmn1440 sa 1,sl=grmo1440 sa 1,it=grmi1440 sa 1,
+ bf=grxn1440 sa 1,bs=grxo1440 sa 1,bi=grxi1440 sa 1,
+ sc=grmc1440 sa 1]
+
+ \loadmapfile [cbgreek.map]
+
+\stoptypescript
+
+\starttypescript [sans] [cbgreek-all] [size]
+
+ \definebodyfont [4pt,5pt] [ss]
+ [tf=gsmn0500 sa 1,sl=gsmo0500 sa 1,it=gsmi0500 sa 1,
+ bf=gsxn0500 sa 1,bs=gsxo0500 sa 1,bi=gsxi0500 sa 1,
+ sc=gsmc0500 sa 1]
+
+ \definebodyfont [6pt] [ss]
+ [tf=gsmn0600,sl=gsmo0600,it=gsmi0600,
+ bf=gsxn0600,bs=gsxo0600,bi=gsxi0600,
+ sc=gsmc0600]
+
+ \definebodyfont [7pt] [ss]
+ [tf=gsmn0700,sl=gsmo0700,it=gsmi0700,
+ bf=gsxn0700,bs=gsxo0700,bi=gsxi0700,
+ sc=gsmc0700]
+
+ \definebodyfont [8pt] [ss]
+ [tf=gsmn0800,sl=gsmo0800,it=gsmi0800,
+ bf=gsxn0800,bs=gsxo0800,bi=gsxi0800,
+ sc=gsmc0800]
+
+ \definebodyfont [9pt] [ss]
+ [tf=gsmn0900,sl=gsmo0900,it=gsmi0900,
+ bf=gsxn0900,bs=gsxo0900,bi=gsxi0900,
+ sc=gsmc0900]
+
+ \definebodyfont [10pt] [ss]
+ [tf=gsmn1000,sl=gsmo1000,it=gsmi1000,
+ bf=gsxn1000,bs=gsxo1000,bi=gsxi1000,
+ sc=gsmc1000]
+
+ \definebodyfont [11pt] [ss]
+ [tf=gsmn1095,sl=gsmo1095,it=gsmi1095,
+ bf=gsxn1095,bs=gsxo1095,bi=gsxi1095,
+ sc=gsmc1095]
+
+ \definebodyfont [12pt] [ss]
+ [tf=gsmn1200,sl=gsmo1200,it=gsmi1200,
+ bf=gsxn1200,bs=gsxo1200,bi=gsxi1200,
+ sc=gsmc1200]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [ss]
+ [tf=gsmn1440 sa 1,sl=gsmo1440 sa 1,it=gsmi1440 sa 1,
+ bf=gsxn1440 sa 1,bs=gsxo1440 sa 1,bi=gsxi1440 sa 1,
+ sc=gsmc1440 sa 1]
+
+ \loadmapfile [cbgreek.map]
+
+\stoptypescript
+
+\starttypescript [mono] [cbgreek-all] [size]
+
+ \definebodyfont [4pt,5pt] [tt]
+ [tf=gttn0500 sa 1,sl=gtto0500 sa 1,it=gtti0500 sa 1,
+ sc=gttc0500 sa 1]
+
+ \definebodyfont [6pt] [tt]
+ [tf=gttn0600,sl=gtto0600,it=gtti0600,
+ sc=gttc0600]
+
+ \definebodyfont [7pt] [tt]
+ [tf=gttn0700,sl=gtto0700,it=gtti0700,
+ sc=gttc0700]
+
+ \definebodyfont [8pt] [tt]
+ [tf=gttn0800,sl=gtto0800,it=gtti0800,
+ sc=gttc0800]
+
+ \definebodyfont [9pt] [tt]
+ [tf=gttn0900,sl=gtto0900,it=gtti0900,
+ sc=gttc0900]
+
+ \definebodyfont [10pt] [tt]
+ [tf=gttn1000,sl=gtto1000,it=gtti1000,
+ sc=gttc1000]
+
+ \definebodyfont [11pt] [tt]
+ [tf=gttn1095,sl=gtto1095,it=gtti1095,
+ sc=gttc1095]
+
+ \definebodyfont [12pt] [tt]
+ [tf=gttn1200,sl=gtto1200,it=gtti1200,
+ sc=gttc1200]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [tt]
+ [tf=gttn1440 sa 1,sl=gtto1440 sa 1,it=gtti1440 sa 1,
+ sc=gttc1440 sa 1]
+
+ \loadmapfile [cbgreek.map]
+
+\stoptypescript
+
+\starttypescript [serif] [cbgreek-medium] [size]
+
+ \definebodyfont [4pt,5pt,6pt,7pt,8pt,9pt] [rm]
+ [tf=grmn0800 sa 1,sl=grmo0800 sa 1,it=grmi0800 sa 1,
+ bf=grxn0800 sa 1,bs=grxo0800 sa 1,bi=grxi0800 sa 1,
+ sc=grmc0800 sa 1]
+
+ \definebodyfont [10pt,11pt] [rm]
+ [tf=grmn1000 sa 1,sl=grmo1000 sa 1,it=grmi1000 sa 1,
+ bf=grxn1000 sa 1,bs=grxo1000 sa 1,bi=grxi1000 sa 1,
+ sc=grmc1000 sa 1]
+
+ \definebodyfont [12pt,14.4pt,17.3pt,20.7pt] [rm]
+ [tf=grmn1200 sa 1,sl=grmo1200 sa 1,it=grmi1200 sa 1,
+ bf=grxn1200 sa 1,bs=grxo1200 sa 1,bi=grxi1200 sa 1,
+ sc=grmc1200 sa 1]
+
+ \loadmapfile [cbgreek.map]
+
+\stoptypescript
+
+\starttypescript [sans] [cbgreek-medium] [size]
+
+ \definebodyfont [4pt,5pt,6pt,7pt,8pt,9pt] [ss]
+ [tf=gsmn0800 sa 1,sl=gsmo0800 sa 1,it=gsmi0800 sa 1,
+ bf=gsxn0800 sa 1,bs=gsxo0800 sa 1,bi=gsxi0800 sa 1,
+ sc=gsmc0800 sa 1]
+
+ \definebodyfont [10pt,11pt] [ss]
+ [tf=gsmn1000 sa 1,sl=gsmo1000 sa 1,it=gsmi1000 sa 1,
+ bf=gsxn1000 sa 1,bs=gsxo1000 sa 1,bi=gsxi1000 sa 1,
+ sc=gsmc1000 sa 1]
+
+ \definebodyfont [12pt,14.4pt,17.3pt,20.7pt] [ss]
+ [tf=gsmn1200 sa 1,sl=gsmo1200 sa 1,it=gsmi1200 sa 1,
+ bf=gsxn1200 sa 1,bs=gsxo1200 sa 1,bi=gsxi1200 sa 1,
+ sc=gsmc1200 sa 1]
+
+ \loadmapfile [cbgreek.map]
+
+\stoptypescript
+
+\starttypescript [mono] [cbgreek-medium] [size]
+
+ \definebodyfont [4pt,5pt,6pt,7pt,8pt,9pt] [tt]
+ [tf=gttn0800 sa 1,sl=gtto0800 sa 1,it=gtti0800 sa 1,
+ sc=gttc0800 sa 1]
+
+ \definebodyfont [10pt,11pt] [tt]
+ [tf=gttn1000 sa 1,sl=gtto1000 sa 1,it=gtti1000 sa 1,
+ sc=gttc1000 sa 1]
+
+ \definebodyfont [12pt,14.4pt,17.3pt,20.7pt] [tt]
+ [tf=gttn1200 sa 1,sl=gtto1200 sa 1,it=gtti1200 sa 1,
+ sc=gttc1200 sa 1]
+
+ \loadmapfile [cbgreek.map]
+
+\stoptypescript
+
+\starttypescript [cbgreek-all]
+
+ \definebodyfontenvironment [cbgreek] [default] []
+
+ \definetypeface [cbgreek] [rm] [serif] [cbgreek] [cbgreek-all]
+ \definetypeface [cbgreek] [ss] [sans] [cbgreek] [cbgreek-all]
+ \definetypeface [cbgreek] [tt] [mono] [cbgreek] [cbgreek-all]
+
+\stoptypescript
+
+\starttypescript [cbgreek-medium] % lowercase, patched HH
+
+ \definebodyfontenvironment [cbgreek] [default] []
+
+ \definetypeface [cbgreek] [rm] [serif] [cbgreek] [cbgreek-medium]
+ \definetypeface [cbgreek] [ss] [sans] [cbgreek] [cbgreek-medium]
+ \definetypeface [cbgreek] [tt] [mono] [cbgreek] [cbgreek-medium]
+
+\stoptypescript
+
+\starttypescript [cbgreek] % lowercase, patched HH
+
+ \definebodyfontenvironment [cbgreek] [default] []
+
+ \definetypeface [cbgreek] [rm] [serif] [cbgreek] [default]
+ \definetypeface [cbgreek] [ss] [sans] [cbgreek] [default]
+ \definetypeface [cbgreek] [tt] [mono] [cbgreek] [default]
+
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-cow.mkii b/tex/context/base/type-cow.mkii
new file mode 100644
index 000000000..507386443
--- /dev/null
+++ b/tex/context/base/type-cow.mkii
@@ -0,0 +1,85 @@
+%D \module
+%D [ file=type-cow,
+%D version=2006.06.23,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Cow Fonts,
+%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.
+
+%D The cow fonts are a project of Duane Bibby, Hans Hagen and Taco
+%D Hoekwater.
+
+\starttypescriptcollection[cow]
+
+\starttypescript [math,serif] [cow,sheep] [default]
+ \setups[font:fallback:serif]
+ \usemathcollection[cow]
+ \loadmapfile[koeieletters.map]
+ \definefontsynonym [Serif] [Cows] [encoding=\typescriptthree]
+ \definefontsynonym [SerifContour] [CowsContour] [encoding=\typescriptthree]
+ \definefontsynonym [SerifLogo] [CowsLogo] [encoding=\typescriptthree]
+ \definefontsynonym [SerifLogoContour][CowsLogoContour] [encoding=\typescriptthree]
+ \definefontsynonym [MathRoman] [CowsMathRoman] [encoding=\typescriptthree]
+ \definefontsynonym [MathItalic] [CowsMathItalic] [encoding=\typescriptthree]
+ \definefontsynonym [MathSymbol] [CowsMathSymbol] [encoding=\typescriptthree]
+ \definefontsynonym [MathExtension] [CowsMathExtensions][encoding=\typescriptthree]
+\stoptypescript
+
+\starttypescript [math,serif] [sheep] [default]
+ \setups[font:fallback:serif]
+ \usemathcollection[cow]
+ \loadmapfile[koeieletters.map]
+ \definefontsynonym [Serif] [Sheep] [encoding=\typescriptthree]
+ \definefontsynonym [SerifContour] [SheepContour] [encoding=\typescriptthree]
+ \definefontsynonym [SerifLogo] [SheepLogo] [encoding=\typescriptthree]
+ \definefontsynonym [SerifLogoContour][SheepLogoContour] [encoding=\typescriptthree]
+ \definefontsynonym [MathRoman] [SheepMathRoman] [encoding=\typescriptthree]
+ \definefontsynonym [MathItalic] [SheepMathItalic] [encoding=\typescriptthree]
+ \definefontsynonym [MathSymbol] [SheepMathSymbol] [encoding=\typescriptthree]
+ \definefontsynonym [MathExtension] [SheepMathExtensions][encoding=\typescriptthree]
+\stoptypescript
+
+\starttypescript [all] [cow,sheep] [default]
+ \definefontsynonym [Cows] [koeielett]
+ \definefontsynonym [CowsContour] [koeielett-contour]
+ \definefontsynonym [CowsLogo] [koeielogos]
+ \definefontsynonym [CowsLogoContour] [koeielogos-contour]
+ \definefontsynonym [CowsMathRoman] [koeielett]
+ \definefontsynonym [CowsMathItalic] [koeieletter-mi]
+ \definefontsynonym [CowsMathSymbol] [koeieletter-sy]
+ \definefontsynonym [CowsMathExtensions][koeieletter-ex]
+\stoptypescript
+
+\starttypescript [all] [sheep] [default]
+ \definefontsynonym [Sheep] [koeielett]
+ \definefontsynonym [SheepContour] [koeielett-contour]
+ \definefontsynonym [SheepLogo] [koeielogos]
+ \definefontsynonym [SheepLogoContour] [koeielogos-contour]
+ \definefontsynonym [SheepMathRoman] [koeielettx]
+ \definefontsynonym [SheepMathItalic] [koeieletter-mi]
+ \definefontsynonym [SheepMathSymbol] [koeieletter-syx]
+ \definefontsynonym [SheepMathExtensions][koeieletter-ex]
+\stoptypescript
+
+\starttypescript [cow] [default]
+ \definetypeface [cow] [rm][serif][cow] [default][encoding=default]
+ \definetypeface [cow] [ss][serif][cow] [default][encoding=default]
+ \definetypeface [cow] [mm][math] [cow] [default][encoding=default]
+ \definetypeface [cow] [tt][mono] [modern][default][encoding=default,rscale=0.85]
+\stoptypescript
+
+\starttypescript [sheep] [default]
+ \definetypeface [sheep][rm][serif][sheep] [default][encoding=default]
+ \definetypeface [sheep][ss][serif][sheep] [default][encoding=default]
+ \definetypeface [sheep][mm][math] [sheep] [default][encoding=default]
+ \definetypeface [sheep][tt][mono] [modern][default][encoding=default,rscale=0.85]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-cow.mkiv b/tex/context/base/type-cow.mkiv
new file mode 100644
index 000000000..5215e7122
--- /dev/null
+++ b/tex/context/base/type-cow.mkiv
@@ -0,0 +1,85 @@
+%D \module
+%D [ file=type-cow,
+%D version=2006.06.23,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Cow Fonts,
+%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.
+
+%D The cow fonts are a project of Duane Bibby, Hans Hagen and Taco
+%D Hoekwater.
+
+\starttypescriptcollection[cow]
+
+\starttypescript [math,serif] [cow,sheep]
+ \setups[font:fallback:serif]
+ % \usemathcollection[cow]
+ \loadmapfile[koeieletters.map]
+ \definefontsynonym [Serif] [Cows]
+ \definefontsynonym [SerifContour] [CowsContour]
+ \definefontsynonym [SerifLogo] [CowsLogo]
+ \definefontsynonym [SerifLogoContour][CowsLogoContour]
+ \definefontsynonym [MathRoman] [CowsMathRoman]
+ \definefontsynonym [MathItalic] [CowsMathItalic]
+ \definefontsynonym [MathSymbol] [CowsMathSymbol]
+ \definefontsynonym [MathExtension] [CowsMathExtensions]
+\stoptypescript
+
+\starttypescript [math,serif] [sheep]
+ \setups[font:fallback:serif]
+ % \usemathcollection[cow]
+ \loadmapfile[koeieletters.map]
+ \definefontsynonym [Serif] [Sheep]
+ \definefontsynonym [SerifContour] [SheepContour]
+ \definefontsynonym [SerifLogo] [SheepLogo]
+ \definefontsynonym [SerifLogoContour][SheepLogoContour]
+ \definefontsynonym [MathRoman] [SheepMathRoman]
+ \definefontsynonym [MathItalic] [SheepMathItalic]
+ \definefontsynonym [MathSymbol] [SheepMathSymbol]
+ \definefontsynonym [MathExtension] [SheepMathExtensions]
+\stoptypescript
+
+\starttypescript [all] [cow,sheep]
+ \definefontsynonym [Cows] [koeielett]
+ \definefontsynonym [CowsContour] [koeielett-contour]
+ \definefontsynonym [CowsLogo] [koeielogos]
+ \definefontsynonym [CowsLogoContour] [koeielogos-contour]
+ \definefontsynonym [CowsMathRoman] [koeielett]
+ \definefontsynonym [CowsMathItalic] [koeieletter-mi]
+ \definefontsynonym [CowsMathSymbol] [koeieletter-sy]
+ \definefontsynonym [CowsMathExtensions][koeieletter-ex]
+\stoptypescript
+
+\starttypescript [all] [sheep]
+ \definefontsynonym [Sheep] [koeielett]
+ \definefontsynonym [SheepContour] [koeielett-contour]
+ \definefontsynonym [SheepLogo] [koeielogos]
+ \definefontsynonym [SheepLogoContour] [koeielogos-contour]
+ \definefontsynonym [SheepMathRoman] [koeielettx]
+ \definefontsynonym [SheepMathItalic] [koeieletter-mi]
+ \definefontsynonym [SheepMathSymbol] [koeieletter-syx]
+ \definefontsynonym [SheepMathExtensions][koeieletter-ex]
+\stoptypescript
+
+\starttypescript [cow]
+ \definetypeface [cow][rm][serif][cow] [default]
+ \definetypeface [cow][ss][serif][cow] [default]
+ \definetypeface [cow][mm][math] [cow] [default]
+ \definetypeface [cow][tt][mono] [modern][default][rscale=0.85]
+\stoptypescript
+
+\starttypescript [sheep]
+ \definetypeface [sheep][rm][serif][sheep] [default]
+ \definetypeface [sheep][ss][serif][sheep] [default]
+ \definetypeface [sheep][mm][math] [sheep] [default]
+ \definetypeface [sheep][tt][mono] [modern][default][,rscale=0.85]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-def.mkii b/tex/context/base/type-def.mkii
new file mode 100644
index 000000000..f31c93e50
--- /dev/null
+++ b/tex/context/base/type-def.mkii
@@ -0,0 +1,86 @@
+%D \module
+%D [ file=type-def,
+%D version=2005.02.04,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Default 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.
+
+\starttypescriptcollection[simplification]
+
+\starttypescript [serif] [simple] [name]
+ \definefontsynonym [Serif] [Simple]
+ \definefontsynonym [SerifBold] [Serif]
+ \definefontsynonym [SerifItalic] [Serif]
+ \definefontsynonym [SerifSlanted] [Serif]
+ \definefontsynonym [SerifBoldItalic] [Serif]
+ \definefontsynonym [SerifBoldSlanted] [Serif]
+ \definefontsynonym [SerifCaps] [Serif]
+\stoptypescript
+
+\starttypescript [sans] [simple] [name]
+ \definefontsynonym [Sans] [Simple]
+ \definefontsynonym [SansBold] [Sans]
+ \definefontsynonym [SansItalic] [Sans]
+ \definefontsynonym [SansSlanted] [Sans]
+ \definefontsynonym [SansBoldItalic] [Sans]
+ \definefontsynonym [SansBoldSlanted] [Sans]
+ \definefontsynonym [SansCaps] [Sans]
+\stoptypescript
+
+\starttypescript [mono] [simple] [name]
+ \definefontsynonym [Mono] [Simple]
+ \definefontsynonym [MonoBold] [Mono]
+ \definefontsynonym [MonoItalic] [Mono]
+ \definefontsynonym [MonoSlanted] [Mono]
+ \definefontsynonym [MonoBoldItalic] [Mono]
+ \definefontsynonym [MonoBoldSlanted] [Mono]
+ \definefontsynonym [MonoCaps] [Mono]
+\stoptypescript
+
+\stoptypescriptcollection
+
+% handy
+
+% \starttypescript [serif] [simple] [name]
+% \definefontsynonym [Simple] [cmvtt10]
+% \setupfontsynonym [Simple] [handling=pure]
+% \stoptypescript
+
+\starttypescriptcollection[handling-and-hz]
+
+\starttypescript [serif,sans,mono] [handling,hanging] [pure,normal]
+ \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree bold]
+ \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree slanted]
+ \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree italic]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree boldslanted]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree bolditalic]
+\stoptypescript
+
+\starttypescript [serif,sans,mono] [handling,hz] [hz,quality,highquality]
+ \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree]
+\stoptypescript
+
+\starttypescript [serif,sans,mono] [handling] [noligs,prespacing,flexspacing]
+ \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-def.mkiv b/tex/context/base/type-def.mkiv
new file mode 100644
index 000000000..c980a4ee5
--- /dev/null
+++ b/tex/context/base/type-def.mkiv
@@ -0,0 +1,48 @@
+%D \module
+%D [ file=type-def,
+%D version=2005.02.04,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Default 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.
+
+\starttypescriptcollection[simplification]
+
+\starttypescript [serif] [simple] [name]
+ \definefontsynonym [Serif] [Simple]
+ \definefontsynonym [SerifBold] [Serif]
+ \definefontsynonym [SerifItalic] [Serif]
+ \definefontsynonym [SerifSlanted] [Serif]
+ \definefontsynonym [SerifBoldItalic] [Serif]
+ \definefontsynonym [SerifBoldSlanted] [Serif]
+ \definefontsynonym [SerifCaps] [Serif]
+\stoptypescript
+
+\starttypescript [sans] [simple] [name]
+ \definefontsynonym [Sans] [Simple]
+ \definefontsynonym [SansBold] [Sans]
+ \definefontsynonym [SansItalic] [Sans]
+ \definefontsynonym [SansSlanted] [Sans]
+ \definefontsynonym [SansBoldItalic] [Sans]
+ \definefontsynonym [SansBoldSlanted] [Sans]
+ \definefontsynonym [SansCaps] [Sans]
+\stoptypescript
+
+\starttypescript [mono] [simple] [name]
+ \definefontsynonym [Mono] [Simple]
+ \definefontsynonym [MonoBold] [Mono]
+ \definefontsynonym [MonoItalic] [Mono]
+ \definefontsynonym [MonoSlanted] [Mono]
+ \definefontsynonym [MonoBoldItalic] [Mono]
+ \definefontsynonym [MonoBoldSlanted] [Mono]
+ \definefontsynonym [MonoCaps] [Mono]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-exp.mkii b/tex/context/base/type-exp.mkii
new file mode 100644
index 000000000..dae770e98
--- /dev/null
+++ b/tex/context/base/type-exp.mkii
@@ -0,0 +1,95 @@
+%D \module
+%D [ file=type-exp,
+%D version=2007.01.28,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Experimental 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.
+
+% \usetypescript[palatino-light] [texnansi] \setupbodyfont[palatino-light] \input zapf \par
+% \usetypescript[palatino-normal][texnansi] \setupbodyfont[palatino-normal] \input zapf \par
+% \usetypescript[palatino-medium][texnansi] \setupbodyfont[palatino-medium] \input zapf \par
+
+%D This file is used for \LUATEX\ experiments.
+
+\starttypescriptcollection[experiment]
+
+\starttypescript [sans] [palatino-sans-light] [name]
+
+ \definefontsynonym [Sans] [PalatinoSans-Light]
+ \definefontsynonym [SansItalic] [PalatinoSans-LightItalic]
+ \definefontsynonym [SansBold] [PalatinoSans-Regular]
+ \definefontsynonym [SansBoldItalic] [PalatinoSans-Italic]
+ \definefontsynonym [SansSlanted] [PalatinoSans-Regular]
+ \definefontsynonym [SansBoldSlanted] [PalatinoSans-Italic]
+ \definefontsynonym [SansCaps] [PalatinoSans-Light]
+
+\stoptypescript
+
+\starttypescript [sans] [palatino-sans-normal] [name]
+
+ \definefontsynonym [Sans] [PalatinoSans-Regular]
+ \definefontsynonym [SansItalic] [PalatinoSans-Italic]
+ \definefontsynonym [SansBold] [PalatinoSans-Bold]
+ \definefontsynonym [SansBoldItalic] [PalatinoSans-BoldItalic]
+ \definefontsynonym [SansSlanted] [PalatinoSans-Italic]
+ \definefontsynonym [SansBoldSlanted] [PalatinoSans-BoldItalic]
+ \definefontsynonym [SansCaps] [PalatinoSans-Regular]
+
+\stoptypescript
+
+\starttypescript [sans] [palatino-sans-medium] [name]
+
+ \definefontsynonym [Sans] [PalatinoSans-Medium]
+ \definefontsynonym [SansItalic] [PalatinoSans-MediumItalic]
+ \definefontsynonym [SansBold] [PalatinoSans-Bold]
+ \definefontsynonym [SansBoldItalic] [PalatinoSans-BoldItalic]
+ \definefontsynonym [SansSlanted] [PalatinoSans-Bold]
+ \definefontsynonym [SansBoldSlanted] [PalatinoSans-BoldItalic]
+ \definefontsynonym [SansCaps] [PalatinoSans-MediumSC]
+
+\stoptypescript
+
+\starttypescript [sans] [palatino-sans-light,palatino-sans-normal,palatino-sans-medium] [texnansi,ec,8r]
+
+ \definefontsynonym[PalatinoSans-Light] [\typescriptthree-palatinosanscom-light] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoSans-LightItalic] [\typescriptthree-palatinosanscom-lightitalic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoSans-Regular] [\typescriptthree-palatinosanscom-regular] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoSans-Italic] [\typescriptthree-palatinosanscom-italic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoSans-Medium] [\typescriptthree-palatinosanscom-medium] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoSans-MediumItalic][\typescriptthree-palatinosanscom-mediumitalic][encoding=\typescriptthree]
+ \definefontsynonym[PalatinoSans-Bold] [\typescriptthree-palatinosanscom-bold] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoSans-BoldItalic] [\typescriptthree-palatinosanscom-bolditalic] [encoding=\typescriptthree]
+
+\stoptypescript
+
+\starttypescript[palatino-normal][texnansi,ec]
+ \definetypeface[palatino-normal][ss][sans] [palatino-sans-normal] [default][encoding=\typescripttwo]
+ \definetypeface[palatino-normal][rm][serif][palatino-nova] [default][encoding=\typescripttwo]
+ \definetypeface[palatino-normal][tt][mono] [latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[palatino-normal][mm][math] [latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript[palatino-medium][texnansi,ec]
+ \definetypeface[palatino-medium][ss][sans] [palatino-sans-medium] [default][encoding=\typescripttwo]
+ \definetypeface[palatino-medium][rm][serif][palatino-nova] [default][encoding=\typescripttwo]
+ \definetypeface[palatino-medium][tt][mono] [latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[palatino-medium][mm][math] [latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript[palatino-light][texnansi,ec]
+ \definetypeface[palatino-light][ss][sans] [palatino-sans-light] [default][encoding=\typescripttwo]
+ \definetypeface[palatino-light][rm][serif][palatino-nova] [default][encoding=\typescripttwo]
+ \definetypeface[palatino-light][tt][mono] [latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[palatino-light][mm][math] [latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/type-fsf.mkii b/tex/context/base/type-fsf.mkii
new file mode 100644
index 000000000..7813b7b5d
--- /dev/null
+++ b/tex/context/base/type-fsf.mkii
@@ -0,0 +1,94 @@
+%D \module
+%D [ file=page-new,
+%D version=2000.10.20,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Fontsite 500,
+%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'm not sure how correct the fontsite cd is. These are probably
+%D mostly rip-offs. I no longer use these fonts.
+
+% run texfont from currentpath with the fonts on subpath fontsite/500
+
+% texfont --en=texnansi --ve=fontsite --co=opus type-fsf.dat
+% texfont --en=texnansi --ve=fontsite --co=typewriter type-fsf.dat
+
+\starttypescriptcollection[font site 500]
+
+%D Please use the original Optima!
+
+\starttypescript [sans] [opus] [name]
+ \definefontsynonym [Sans] [Opus]
+ \definefontsynonym [SansCaps] [OpusSmCaps]
+ \definefontsynonym [SansItalic] [Opus-Italic]
+ \definefontsynonym [SansBold] [Opus-Bold]
+ \definefontsynonym [SansBoldCaps] [OpusSmCaps-Bold]
+ \definefontsynonym [SansBoldItalic] [Opus-BoldItalic]
+ \definefontsynonym [SansSlanted] [Opus-Slanted] % faked
+ \definefontsynonym [SansBoldSlanted] [Opus-BoldSlanted] % faked
+\stoptypescript
+
+\starttypescript [sans] [opus] [texnansi,ec,8r]
+ \definefontsynonym [Opus] [\typescriptthree-opusrg] [encoding=\typescriptthree]
+ \definefontsynonym [OpusSmCaps] [\typescriptthree-opusscrg] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-Italic] [\typescriptthree-opusi] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-Bold] [\typescriptthree-opusb] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-BoldItalic] [\typescriptthree-opusbi] [encoding=\typescriptthree]
+ \definefontsynonym [OpusSmCaps-Bold] [\typescriptthree-opusscb] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-Slanted] [\typescriptthree-opusrg-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-BoldSlanted] [\typescriptthree-opusb-slanted-167] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-fontsite-opus.map]
+\stoptypescript
+
+\starttypescript [mono] [typewriter] [name]
+ \definefontsynonym [Mono] [Typewriter]
+ \definefontsynonym [MonoItalic] [Typewriter-Italic]
+ \definefontsynonym [MonoBold] [Typewriter-Bold]
+ \definefontsynonym [MonoBoldItalic] [Typewriter-BoldItalic]
+ \definefontsynonym [MonoSlanted] [Typewriter-Slanted] % faked
+ \definefontsynonym [MonoBoldSlanted] [Typewriter-BoldSlanted] % faked
+\stoptypescript
+
+\starttypescript [mono] [typewriter] [texnansi,ec,8r]
+ \definefontsynonym [Typewriter] [\typescriptthree-typerg] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-Italic] [\typescriptthree-typei] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-Bold] [\typescriptthree-typeb] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-BoldItalic] [\typescriptthree-typebi] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-Slanted] [\typescriptthree-typerg-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-BoldSlanted] [\typescriptthree-typeb-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [TypewriterCond] [\typescriptthree-typecrg]
+ \definefontsynonym [TypewriterCond-Bold] [\typescriptthree-typecb]
+ \loadmapfile[\typescriptthree-fontsite-typewriter.map]
+\stoptypescript
+
+\starttypescript [serif] [garamond] [name]
+ \definefontsynonym [Serif] [FSGaramond]
+ \definefontsynonym [SerifCaps] [FSGaramondSmCaps]
+ \definefontsynonym [SerifItalic] [FSGaramond-Italic]
+ \definefontsynonym [SerifBold] [FSGaramond-Bold]
+ \definefontsynonym [SerifBoldCaps] [FSGaramondSmCaps-Bold]
+ \definefontsynonym [SerifSlanted] [FSGaramond-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [FSGaramond-BoldSlanted]
+\stoptypescript
+
+\starttypescript [serif] [garamond] [texnansi,ec,8r]
+ \definefontsynonym [FSGaramond] [\typescriptthree-garamond] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramondSmCaps] [\typescriptthree-garasc] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-Italic] [\typescriptthree-garai] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-Bold] [\typescriptthree-garab] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-BoldItalic] [\typescriptthree-garabi] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramondSmCaps-Bold] [\typescriptthree-garascb] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-Slanted] [\typescriptthree-garamond-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-BoldSlanted] [\typescriptthree-garab-slanted-167] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-fontsite-garamond.map]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-ghz.mkii b/tex/context/base/type-ghz.mkii
new file mode 100644
index 000000000..7e31096ee
--- /dev/null
+++ b/tex/context/base/type-ghz.mkii
@@ -0,0 +1,409 @@
+%D \module
+%D [ file=type-ghz,
+%D version=2005.06.07,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Hermann Zapf's Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \usetypescriptfile[type-ghz]
+%
+% \definetypeface[optima] [ss][sans] [optima-nova] [default]
+% \definetypeface[palatino][rm][serif][palatino-nova][default]
+% \definetypeface[aldus] [rm][serif][aldus-nova] [default]
+%
+% \starttext
+% \setupbodyfont[optima] \input zapf \blank
+% \setupbodyfont[palatino] \input zapf \blank
+% \setupbodyfont[aldus] \input zapf \blank
+% \stoptext
+
+\starttypescriptcollection[zapf collection]
+
+% zapfino
+
+\starttypescript [serif,handwriting] [zapfino] [texnansi,ec,8r] % todo: handwriting
+
+ \definefontsynonym [ZapfinoOne] [\typescriptthree-lt54223] [encoding=\typescriptthree]
+ \definefontsynonym [ZapfinoTwo] [\typescriptthree-lt54224] [encoding=\typescriptthree]
+ \definefontsynonym [ZapfinoThree] [\typescriptthree-lt54225] [encoding=\typescriptthree]
+ \definefontsynonym [ZapfinoFour] [\typescriptthree-lt54226] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-linotype-zapfino.map]
+
+\stoptypescript
+
+% \starttypescript [handwriting] [zapfino-1] \definefontsynonym [Handwriting] [ZapfinoOne] \stoptypescript
+% \starttypescript [handwriting] [zapfino-2] \definefontsynonym [Handwriting] [ZapfinoTwo] \stoptypescript
+% \starttypescript [handwriting] [zapfino-3] \definefontsynonym [Handwriting] [ZapfinoThree] \stoptypescript
+% \starttypescript [handwriting] [zapfino-4] \definefontsynonym [Handwriting] [ZapfinoFour] \stoptypescript
+
+% optima
+
+\starttypescript [sans] [optima] [name]
+
+ \definefontsynonym [Sans] [OptimaLT]
+ \definefontsynonym [SansItalic] [OptimaLT-Italic]
+ \definefontsynonym [SansBold] [OptimaLT-Bold]
+ \definefontsynonym [SansBoldItalic] [OptimaLT-BoldItalic]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [Sans]
+
+\stoptypescript
+
+\starttypescript [sans] [optima,optima-nova] [texnansi,ec,8r]
+
+ \definefontsynonym [OptimaLT] [\typescriptthree-lte50019] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-Italic] [\typescriptthree-lte52401] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-Bold] [\typescriptthree-lte50021] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-BoldItalic] [\typescriptthree-lte54379] [encoding=\typescriptthree]
+
+ \definefontsynonym [OptimaLT-Medium] [\typescriptthree-lte53505] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-MediumItalic] [\typescriptthree-lte53506] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-DemiBold] [\typescriptthree-lte53507] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-DemiBoldItalic] [\typescriptthree-lte53508] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-Black] [\typescriptthree-lte53509] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-BlackItalic] [\typescriptthree-lte53510] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-ExtraBlack] [\typescriptthree-lte53511] [encoding=\typescriptthree]
+ \definefontsynonym [OptimaLT-ExtraBlackItalic] [\typescriptthree-lte53512] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-linotype-optima.map]
+
+\stoptypescript
+
+\starttypescript [optima] [texnansi,ec,qx]
+ \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo]
+ \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo]
+ \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
+% optima nova
+
+% see antykwa, we could define variants for light and osf
+
+\starttypescript [sans] [optima-nova] [name]
+
+ \definefontsynonym [Sans] [OptimaNovaLT-Regular]
+ \definefontsynonym [SansItalic] [OptimaNovaLT-Italic]
+ \definefontsynonym [SansBold] [OptimaNovaLT-Bold]
+ \definefontsynonym [SansBoldItalic] [OptimaNovaLT-BoldItalic]
+ \definefontsynonym [SansSlanted] [OptimaNovaLT-Italic]
+ \definefontsynonym [SansBoldSlanted] [OptimaNovaLT-BoldItalic]
+ \definefontsynonym [SansCaps] [OptimaNovaLT-RegularSC]
+
+ \definefontvariant [Serif][osf][OsF]
+ \definefontvariant [Serif][sc][Caps]
+
+ \definefontsynonym [SansOsF] [OptimaNovaLT-RegularOsF]
+ \definefontsynonym [SansItalicOsF] [OptimaNovaLT-ItalicOsF]
+ \definefontsynonym [SansBoldOsF] [OptimaNovaLT-BoldOsF]
+ \definefontsynonym [SansBoldItalicOsF] [OptimaNovaLT-BoldItalicOsF]
+ \definefontsynonym [SansSlantedOsF] [OptimaNovaLT-ItalicOsF]
+ \definefontsynonym [SansBoldSlantedOsF] [OptimaNovaLT-BoldItalicOsF]
+ \definefontsynonym [SansCapsOsF] [OptimaNovaLT-RegularSC]
+
+ \definefontsynonym [SansCaps] [OptimaNovaLT-RegularSC]
+ \definefontsynonym [SansItalicCaps] [OptimaNovaLT-ItalicSC ]
+ \definefontsynonym [SansBoldCaps] [OptimaNovaLT-BoldSC]
+ \definefontsynonym [SansBoldItalicCaps] [OptimaNovaLT-BoldItalicSC]
+ \definefontsynonym [SansSlantedCaps] [OptimaNovaLT-ItalicSC]
+ \definefontsynonym [SansBoldSlantedCaps] [OptimaNovaLT-BoldItalicSC]
+ \definefontsynonym [SansCapsCaps] [OptimaNovaLT-RegularSC]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova-os] [name]
+
+ \definefontsynonym [Sans] [OptimaNovaLT-RegularOsF]
+ \definefontsynonym [SansItalic] [OptimaNovaLT-ItalicOsF]
+ \definefontsynonym [SansBold] [OptimaNovaLT-BoldOsF]
+ \definefontsynonym [SansBoldItalic] [OptimaNovaLT-BoldItalicOsF]
+ \definefontsynonym [SansSlanted] [OptimaNovaLT-ItalicOsF]
+ \definefontsynonym [SansBoldSlanted] [OptimaNovaLT-BoldItalicOsF]
+ \definefontsynonym [SansCaps] [OptimaNovaLT-RegularSC]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova-light] [name] % may change
+
+ \definefontsynonym [Sans] [OptimaNovaLT-Light]
+ \definefontsynonym [SansItalic] [OptimaNovaLT-LightItalic]
+ \definefontsynonym [SansBold] [OptimaNovaLT-Medium]
+ \definefontsynonym [SansBoldItalic] [OptimaNovaLT-MediumItalic]
+ \definefontsynonym [SansSlanted] [OptimaNovaLT-LightItalic]
+ \definefontsynonym [SansBoldSlanted] [OptimaNovaLT-MediumItalic]
+ \definefontsynonym [SansCaps] [OptimaNovaLT-LightSC]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova-medium] [name] % may change
+
+ \definefontsynonym [Sans] [OptimaNovaLT-Medium]
+ \definefontsynonym [SansItalic] [OptimaNovaLT-MediumItalic]
+ \definefontsynonym [SansBold] [OptimaNovaLT-Heavy]
+ \definefontsynonym [SansBoldItalic] [OptimaNovaLT-HeavyItalic]
+ \definefontsynonym [SansSlanted] [OptimaNovaLT-MediumItalic]
+ \definefontsynonym [SansBoldSlanted] [OptimaNovaLT-HeavyItalic]
+ \definefontsynonym [SansCaps] [OptimaNovaLT-MediumSC]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova,optima-nova-light,optima-nova-medium,optima-nova-os] [texnansi,ec,8r]
+
+ \definefontsynonym[OptimaNovaLT-Light] [\typescriptthree-lt55476][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-LightSC] [\typescriptthree-lt55477][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-LightOsF] [\typescriptthree-lt55478][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-LightItalic] [\typescriptthree-lt55479][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-LightItalicSC] [\typescriptthree-lt55480][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-LightItalicOsF] [\typescriptthree-lt55481][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-LightCond] [\typescriptthree-lt55482][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Regular] [\typescriptthree-lt55483][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-RegularSC] [\typescriptthree-lt55484][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-RegularOsF] [\typescriptthree-lt55485][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Italic] [\typescriptthree-lt55486][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-ItalicSC] [\typescriptthree-lt55487][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-ItalicOsF] [\typescriptthree-lt55488][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Condensed] [\typescriptthree-lt55489][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Medium] [\typescriptthree-lt55490][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-MediumSC] [\typescriptthree-lt55491][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-MediumOsF] [\typescriptthree-lt55492][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-MediumItalic] [\typescriptthree-lt55493][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-MediumItalicSC] [\typescriptthree-lt55494][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-MediumItalicOsF][\typescriptthree-lt55495][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-MediumCond] [\typescriptthree-lt55496][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-TitlingInitials][\typescriptthree-lt55497][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Demi] [\typescriptthree-lt55498][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-DemiSC] [\typescriptthree-lt55499][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-DemiOsF] [\typescriptthree-lt55500][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-DemiItalic] [\typescriptthree-lt55501][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-DemiItalicSC] [\typescriptthree-lt55502][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-DemiItalicOsF] [\typescriptthree-lt55503][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-DemiCond] [\typescriptthree-lt55504][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Bold] [\typescriptthree-lt55505][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-BoldSC] [\typescriptthree-lt55506][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-BoldOsF] [\typescriptthree-lt55507][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-BoldItalic] [\typescriptthree-lt55508][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-BoldItalicSC] [\typescriptthree-lt55509][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-BoldItalicOsF] [\typescriptthree-lt55510][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-BoldCond] [\typescriptthree-lt55511][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Heavy] [\typescriptthree-lt55512][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-HeavyItalic] [\typescriptthree-lt55513][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-Black] [\typescriptthree-lt55514][encoding=\typescriptthree]
+ \definefontsynonym[OptimaNovaLT-BlackItalic] [\typescriptthree-lt55515][encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-linotype-optima-nova.map]
+
+\stoptypescript
+
+\starttypescript[optima-nova][texnansi,ec] % will change to more narrow tt
+ \definetypeface[optima][ss][sans][optima-nova] [default][encoding=\typescripttwo]
+ \definetypeface[optima][rm][sans][optima-nova] [default][encoding=\typescripttwo]
+ \definetypeface[optima][tt][mono][latin-modern][default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[optima][mm][math][latin-modern][default][encoding=\typescripttwo,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript[optima-nova-os][texnansi,ec] % will change to more narrow tt
+ \definetypeface[optima-os][ss][sans][optima-nova-os] [default][encoding=\typescripttwo]
+ \definetypeface[optima-os][rm][sans][optima-nova-os] [default][encoding=\typescripttwo]
+ \definetypeface[optima-os][tt][mono][latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[optima-os][mm][math][latin-modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+% palatino
+
+\starttypescript [serif] [palatino] [name]
+
+ \definefontsynonym [Serif] [PalatinoLT-Roman]
+ \definefontsynonym [SerifItalic] [PalatinoLT-Italic]
+ \definefontsynonym [SerifBold] [PalatinoLT-Bold]
+ \definefontsynonym [SerifBoldItalic] [PalatinoLT-BoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+
+ \definefontsynonym [SerifCaps] [PalatinoSC]
+
+\stoptypescript
+
+\starttypescript [serif] [palatino] [texnansi,ec,8r]
+
+ \definefontsynonym[PalatinoLT-Roman] [\typescriptthree-lte50001] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-Italic] [\typescriptthree-lte50002] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-Bold] [\typescriptthree-lte50003] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-BoldItalic] [\typescriptthree-lte50004] [encoding=\typescriptthree]
+
+ \definefontsynonym[PalatinoLT-Light] [\typescriptthree-lte52168] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-LightItalic] [\typescriptthree-lte52169] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-Medium] [\typescriptthree-lte52170] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-MediumItalic] [\typescriptthree-lte52171] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-Black] [\typescriptthree-lte52172] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoLT-BlackItalic] [\typescriptthree-lte52173] [encoding=\typescriptthree]
+ \definefontsynonym[Palatino-BoldItalicOsF] [\typescriptthree-pobio] [encoding=\typescriptthree]
+ \definefontsynonym[Palatino-BoldOsF] [\typescriptthree-pobos] [encoding=\typescriptthree]
+ \definefontsynonym[Palatino-ItalicOsF] [\typescriptthree-poios] [encoding=\typescriptthree]
+
+ \definefontsynonym[PalatinoSC] [\typescriptthree-posc] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-linotype-palatino.map]
+
+\stoptypescript
+
+% palatino nova
+
+\starttypescript [serif] [palatino-nova] [name]
+
+ \definefontsynonym [Serif] [PalatinoNova-Regular]
+ \definefontsynonym [SerifItalic] [PalatinoNova-Italic]
+ \definefontsynonym [SerifBold] [PalatinoNova-Bold]
+ \definefontsynonym [SerifBoldItalic] [PalatinoNova-BoldItalic]
+ \definefontsynonym [SerifSlanted] [PalatinoNova-Italic]
+ \definefontsynonym [SerifBoldSlanted] [PalatinoNova-BoldItalic]
+ \definefontsynonym [SerifCaps] [PalatinoNova-RegularSC]
+
+ \definefontvariant [Serif][sc][Caps]
+
+ \definefontsynonym [SerifCaps] [PalatinoNova-RegularSC]
+ \definefontsynonym [SerifItalicCaps] [PalatinoNova-ItalicSC]
+ \definefontsynonym [SerifBoldCaps] [PalatinoNova-BoldSC]
+ \definefontsynonym [SerifBoldItalicCaps] [PalatinoNova-BoldItalicSC]
+ \definefontsynonym [SerifSlantedCaps] [PalatinoNova-ItalicSC]
+ \definefontsynonym [SerifBoldSlantedCaps] [PalatinoNova-BoldItalicSC]
+ \definefontsynonym [SerifCapsCaps] [PalatinoNova-RegularSC]
+
+\stoptypescript
+
+\starttypescript [serif] [palatino-nova-light] [name] % may change
+
+ \definefontsynonym [Serif] [PalatinoNova-Light]
+ \definefontsynonym [SerifItalic] [PalatinoNova-LightItalic]
+ \definefontsynonym [SerifBold] [PalatinoNova-Regular]
+ \definefontsynonym [SerifBoldItalic] [PalatinoNova-Italic]
+ \definefontsynonym [SerifSlanted] [PalatinoNova-Regular]
+ \definefontsynonym [SerifBoldSlanted] [PalatinoNova-Italic]
+ \definefontsynonym [SerifCaps] [PalatinoNova-LightSC]
+
+\stoptypescript
+
+\starttypescript [serif] [palatino-nova-medium] [name] % may change
+
+ \definefontsynonym [Serif] [PalatinoNova-Medium]
+ \definefontsynonym [SerifItalic] [PalatinoNova-MediumItalic]
+ \definefontsynonym [SerifBold] [PalatinoNova-Bold]
+ \definefontsynonym [SerifBoldItalic] [PalatinoNova-BoldItalic]
+ \definefontsynonym [SerifSlanted] [PalatinoNova-Bold]
+ \definefontsynonym [SerifBoldSlanted] [PalatinoNova-BoldItalic]
+ \definefontsynonym [SerifCaps] [PalatinoNova-MediumSC]
+
+\stoptypescript
+
+\starttypescript [serif] [palatino-nova,palatino-nova-light,palatino-nova-medium] [texnansi,ec,8r]
+
+ \definefontsynonym[PalatinoNova-Light] [\typescriptthree-PalatinoNova-Light] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-LightItalic] [\typescriptthree-PalatinoNova-LightItalic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-Regular] [\typescriptthree-PalatinoNova-Regular] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-Italic] [\typescriptthree-PalatinoNova-Italic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-Medium] [\typescriptthree-PalatinoNova-Medium] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-MediumItalic][\typescriptthree-PalatinoNova-MediumItalic][encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-Bold] [\typescriptthree-PalatinoNova-Bold] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-BoldItalic] [\typescriptthree-PalatinoNova-BoldItalic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-Imperial] [\typescriptthree-PalatinoNova-Imperial] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-Titling] [\typescriptthree-PalatinoNova-Titling] [encoding=\typescriptthree]
+
+ \definefontsynonym[PalatinoNova-LightSC] [\typescriptthree-sc-PalatinoNova-Light] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-LightItalicSC] [\typescriptthree-sc-PalatinoNova-LightItalic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-RegularSC] [\typescriptthree-sc-PalatinoNova-Regular] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-ItalicSC] [\typescriptthree-sc-PalatinoNova-Italic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-MediumSC] [\typescriptthree-sc-PalatinoNova-Medium] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-MediumItalicSC][\typescriptthree-sc-PalatinoNova-MediumItalic][encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-BoldSC] [\typescriptthree-sc-PalatinoNova-Bold] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-BoldItalicSC] [\typescriptthree-sc-PalatinoNova-BoldItalic] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-ImperialSC] [\typescriptthree-sc-PalatinoNova-Imperial] [encoding=\typescriptthree]
+ \definefontsynonym[PalatinoNova-TitlingSC] [\typescriptthree-sc-PalatinoNova-Titling] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-linotype-palatino-nova.map]
+ \loadmapfile[\typescriptthree-sc-linotype-palatino-nova.map]
+
+\stoptypescript
+
+% aldusnova
+
+\starttypescript [serif] [aldus-nova] [name]
+
+ \definefontsynonym [Serif] [AldusNova-Book]
+ \definefontsynonym [SerifItalic] [AldusNova-BookItalic]
+ \definefontsynonym [SerifBold] [AldusNova-Bold]
+ \definefontsynonym [SerifBoldItalic] [AldusNova-BoldItalic]
+ \definefontsynonym [SerifSlanted] [AldusNova-BookItalic]
+ \definefontsynonym [SerifBoldSlanted] [AldusNova-BoldItalic]
+ \definefontsynonym [SerifCaps] [AldusNova-BookSC]
+
+ \definefontvariant [Serif][sc][Caps]
+
+ \definefontsynonym [SerifCaps] [AldusNova-BookSC]
+ \definefontsynonym [SerifItalicCaps] [AldusNova-BookItalicSC]
+ \definefontsynonym [SerifBoldCaps] [AldusNova-BoldSC]
+ \definefontsynonym [SerifBoldItalicCaps] [AldusNova-BoldItalicSC]
+ \definefontsynonym [SerifSlantedCaps] [AldusNova-BookItalicSC]
+ \definefontsynonym [SerifBoldSlantedCaps] [AldusNova-BoldItalicSC]
+ \definefontsynonym [SerifCapsCaps] [AldusNova-BookSC]
+
+\stoptypescript
+
+\starttypescript [serif] [aldus-nova] [texnansi,ec,8r]
+
+ \definefontsynonym[AldusNova-Book] [\typescriptthree-AldusNova-Book] [encoding=\typescriptthree]
+ \definefontsynonym[AldusNova-BookItalic] [\typescriptthree-AldusNova-BookItalic] [encoding=\typescriptthree]
+ \definefontsynonym[AldusNova-Bold] [\typescriptthree-AldusNova-Bold] [encoding=\typescriptthree]
+ \definefontsynonym[AldusNova-BoldItalic] [\typescriptthree-AldusNova-BoldItalic] [encoding=\typescriptthree]
+
+ \definefontsynonym[AldusNova-BookSC] [\typescriptthree-sc-AldusNova-Book] [encoding=\typescriptthree]
+ \definefontsynonym[AldusNova-BookItalicSC] [\typescriptthree-sc-AldusNova-BookItalic] [encoding=\typescriptthree]
+ \definefontsynonym[AldusNova-BoldSC] [\typescriptthree-sc-AldusNova-Bold] [encoding=\typescriptthree]
+ \definefontsynonym[AldusNova-BoldItalicSC] [\typescriptthree-sc-AldusNova-BoldItalic] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-linotype-aldus-nova.map]
+ \loadmapfile[\typescriptthree-sc-linotype-aldus-nova.map]
+
+\stoptypescript
+
+% melior
+
+\starttypescript [serif] [melior] [name]
+
+ \definefontsynonym [MeliorLT-Roman] [MeliorLT]
+
+ \definefontsynonym [Serif] [MeliorLT-Roman]
+ \definefontsynonym [SerifItalic] [MeliorLT-Italic]
+ \definefontsynonym [SerifBold] [MeliorLT-Bold]
+ \definefontsynonym [SerifBoldItalic] [MeliorLT-BoldItalic]
+
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+
+ \definefontsynonym [SerifCaps] [Serif]
+
+\stoptypescript
+
+\starttypescript [serif] [melior] [texnansi,ec,8r]
+
+ \definefontsynonym [MeliorLT] [texnansi-lte50062] [encoding=\typescriptthree]
+ \definefontsynonym [MeliorLT-Italic] [texnansi-lte50063] [encoding=\typescriptthree]
+ \definefontsynonym [MeliorLT-Bold] [texnansi-lte50064] [encoding=\typescriptthree]
+ \definefontsynonym [MeliorLT-BoldItalic] [texnansi-lte50065] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-linotype-melior.map]
+
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-ghz.mkiv b/tex/context/base/type-ghz.mkiv
new file mode 100644
index 000000000..e6a12d7e3
--- /dev/null
+++ b/tex/context/base/type-ghz.mkiv
@@ -0,0 +1,322 @@
+%D \module
+%D [ file=type-hgz, % variant of ghz
+%D version=2005.06.07,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Hermann Zapf's Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D At some point I will switch to opentype Optima fonts (don't have them).
+
+% \usetypescriptfile[type-ghz]
+%
+% \definetypeface[optima] [ss][sans] [optima-nova] [default]
+% \definetypeface[palatino][rm][serif][palatino-nova][default]
+% \definetypeface[aldus] [rm][serif][aldus-nova] [default]
+%
+% \starttext
+% \setupbodyfont[optima] \input zapf \blank
+% \setupbodyfont[palatino] \input zapf \blank
+% \setupbodyfont[aldus] \input zapf \blank
+% \stoptext
+
+\starttypescriptcollection[zapf collection]
+
+% zapfino
+
+\starttypescript [serif,handwriting] [zapfino]
+
+ \definefontsynonym[zapfino] [file:zapfinoextraltpro]
+ \definefontsynonym[zapfinoextra] [file:zapfinoextraltpro]
+ \definefontsynonym[zapfinoforte] [file:zapfinoextraltpro]
+
+\stoptypescript
+
+% optima nova
+
+\starttypescript [sans] [optima-nova,optima-nova-light,optima-nova-medium,optima-nova-os]
+
+ \definefontsynonym[OptimaNova-Light] [file:lt55476]
+ \definefontsynonym[OptimaNova-LightSC] [file:lt55477]
+ \definefontsynonym[OptimaNova-LightOsF] [file:lt55478]
+ \definefontsynonym[OptimaNova-LightItalic] [file:lt55479]
+ \definefontsynonym[OptimaNova-LightItalicSC] [file:lt55480]
+ \definefontsynonym[OptimaNova-LightItalicOsF] [file:lt55481]
+ \definefontsynonym[OptimaNova-LightCond] [file:lt55482]
+ \definefontsynonym[OptimaNova-Regular] [file:lt55483]
+ \definefontsynonym[OptimaNova-RegularSC] [file:lt55484]
+ \definefontsynonym[OptimaNova-RegularOsF] [file:lt55485]
+ \definefontsynonym[OptimaNova-Italic] [file:lt55486]
+ \definefontsynonym[OptimaNova-ItalicSC] [file:lt55487]
+ \definefontsynonym[OptimaNova-ItalicOsF] [file:lt55488]
+ \definefontsynonym[OptimaNova-Condensed] [file:lt55489]
+ \definefontsynonym[OptimaNova-Medium] [file:lt55490]
+ \definefontsynonym[OptimaNova-MediumSC] [file:lt55491]
+ \definefontsynonym[OptimaNova-MediumOsF] [file:lt55492]
+ \definefontsynonym[OptimaNova-MediumItalic] [file:lt55493]
+ \definefontsynonym[OptimaNova-MediumItalicSC] [file:lt55494]
+ \definefontsynonym[OptimaNova-MediumItalicOsF][file:lt55495]
+ \definefontsynonym[OptimaNova-MediumCond] [file:lt55496]
+ \definefontsynonym[OptimaNova-TitlingInitials][file:lt55497]
+ \definefontsynonym[OptimaNova-Demi] [file:lt55498]
+ \definefontsynonym[OptimaNova-DemiSC] [file:lt55499]
+ \definefontsynonym[OptimaNova-DemiOsF] [file:lt55500]
+ \definefontsynonym[OptimaNova-DemiItalic] [file:lt55501]
+ \definefontsynonym[OptimaNova-DemiItalicSC] [file:lt55502]
+ \definefontsynonym[OptimaNova-DemiItalicOsF] [file:lt55503]
+ \definefontsynonym[OptimaNova-DemiCond] [file:lt55504]
+ \definefontsynonym[OptimaNova-Bold] [file:lt55505]
+ \definefontsynonym[OptimaNova-BoldSC] [file:lt55506]
+ \definefontsynonym[OptimaNova-BoldOsF] [file:lt55507]
+ \definefontsynonym[OptimaNova-BoldItalic] [file:lt55508]
+ \definefontsynonym[OptimaNova-BoldItalicSC] [file:lt55509]
+ \definefontsynonym[OptimaNova-BoldItalicOsF] [file:lt55510]
+ \definefontsynonym[OptimaNova-BoldCond] [file:lt55511]
+ \definefontsynonym[OptimaNova-Heavy] [file:lt55512]
+ \definefontsynonym[OptimaNova-HeavyItalic] [file:lt55513]
+ \definefontsynonym[OptimaNova-Black] [file:lt55514]
+ \definefontsynonym[OptimaNova-BlackItalic] [file:lt55515]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova] [name]
+
+ \definefontsynonym [Sans] [OptimaNova-Regular]
+ \definefontsynonym [SansItalic] [OptimaNova-Italic]
+ \definefontsynonym [SansBold] [OptimaNova-Bold]
+ \definefontsynonym [SansBoldItalic] [OptimaNova-BoldItalic]
+ \definefontsynonym [SansSlanted] [OptimaNova-Italic]
+ \definefontsynonym [SansBoldSlanted] [OptimaNova-BoldItalic]
+ \definefontsynonym [SansCaps] [OptimaNova-RegularSC]
+
+ \definefontsynonym [SansOsF] [OptimaNova-RegularOsF]
+ \definefontsynonym [SansItalicOsF] [OptimaNova-ItalicOsF]
+ \definefontsynonym [SansBoldOsF] [OptimaNova-BoldOsF]
+ \definefontsynonym [SansBoldItalicOsF] [OptimaNova-BoldItalicOsF]
+ \definefontsynonym [SansSlantedOsF] [OptimaNova-ItalicOsF]
+ \definefontsynonym [SansBoldSlantedOsF] [OptimaNova-BoldItalicOsF]
+ \definefontsynonym [SansCapsOsF] [OptimaNova-RegularSC]
+
+ \definefontsynonym [SansCaps] [OptimaNova-RegularSC]
+ \definefontsynonym [SansItalicCaps] [OptimaNova-ItalicSC ]
+ \definefontsynonym [SansBoldCaps] [OptimaNova-BoldSC]
+ \definefontsynonym [SansBoldItalicCaps] [OptimaNova-BoldItalicSC]
+ \definefontsynonym [SansSlantedCaps] [OptimaNova-ItalicSC]
+ \definefontsynonym [SansBoldSlantedCaps] [OptimaNova-BoldItalicSC]
+ \definefontsynonym [SansCapsCaps] [OptimaNova-RegularSC]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova-os] [name]
+
+ \definefontsynonym [Sans] [OptimaNova-RegularOsF]
+ \definefontsynonym [SansItalic] [OptimaNova-ItalicOsF]
+ \definefontsynonym [SansBold] [OptimaNova-BoldOsF]
+ \definefontsynonym [SansBoldItalic] [OptimaNova-BoldItalicOsF]
+ \definefontsynonym [SansSlanted] [OptimaNova-ItalicOsF]
+ \definefontsynonym [SansBoldSlanted] [OptimaNova-BoldItalicOsF]
+ \definefontsynonym [SansCaps] [OptimaNova-RegularSC]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova-light] [name] % may change
+
+ \definefontsynonym [Sans] [OptimaNova-Light]
+ \definefontsynonym [SansItalic] [OptimaNova-LightItalic]
+ \definefontsynonym [SansBold] [OptimaNova-Medium]
+ \definefontsynonym [SansBoldItalic] [OptimaNova-MediumItalic]
+ \definefontsynonym [SansSlanted] [OptimaNova-LightItalic]
+ \definefontsynonym [SansBoldSlanted] [OptimaNova-MediumItalic]
+ \definefontsynonym [SansCaps] [OptimaNova-LightSC]
+
+\stoptypescript
+
+\starttypescript [sans] [optima-nova-medium] [name] % may change
+
+ \definefontsynonym [Sans] [OptimaNova-Medium]
+ \definefontsynonym [SansItalic] [OptimaNova-MediumItalic]
+ \definefontsynonym [SansBold] [OptimaNova-Heavy]
+ \definefontsynonym [SansBoldItalic] [OptimaNova-HeavyItalic]
+ \definefontsynonym [SansSlanted] [OptimaNova-MediumItalic]
+ \definefontsynonym [SansBoldSlanted] [OptimaNova-HeavyItalic]
+ \definefontsynonym [SansCaps] [OptimaNova-MediumSC]
+
+\stoptypescript
+
+\starttypescript[optima-nova]
+ \definetypeface[optima][ss][sans][optima-nova] [default][features=default]
+ \definetypeface[optima][rm][sans][optima-nova] [default][features=default]
+ \definetypeface[optima][tt][mono][latin-modern][default][features=default,rscale=1.1]
+ \definetypeface[optima][mm][math][latin-modern][default][features=default,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript[optima-nova-os]
+ \definetypeface[optima-os][ss][sans][optima-nova-os] [default][features=default]
+ \definetypeface[optima-os][rm][sans][optima-nova-os] [default][features=default]
+ \definetypeface[optima-os][tt][mono][latin-modern] [default][features=default,rscale=1.1]
+ \definetypeface[optima-os][mm][math][latin-modern] [default][features=default,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+% palatino nova
+
+\starttypescript [serif] [palatino-nova,palatino-nova-light,palatino-nova-medium]
+
+ \definefontsynonym[PalatinoNova-Light] [file:palatinonova-light]
+ \definefontsynonym[PalatinoNova-LightItalic] [file:palatinonova-lightitalic]
+ \definefontsynonym[PalatinoNova-Regular] [file:palatinonova-regular]
+ \definefontsynonym[PalatinoNova-Italic] [file:palatinonova-italic]
+ \definefontsynonym[PalatinoNova-Medium] [file:palatinonova-medium]
+ \definefontsynonym[PalatinoNova-MediumItalic][file:palatinonova-mediumitalic]
+ \definefontsynonym[PalatinoNova-Bold] [file:palatinonova-bold]
+ \definefontsynonym[PalatinoNova-BoldItalic] [file:palatinonova-bolditalic]
+ \definefontsynonym[PalatinoNova-Imperial] [file:palatinonova-imperial]
+ \definefontsynonym[PalatinoNova-Titling] [file:palatinonova-titling]
+
+\stoptypescript
+
+\starttypescript [serif] [palatino-nova] [name]
+
+ \definefontsynonym [Serif] [PalatinoNova-Regular]
+ \definefontsynonym [SerifItalic] [PalatinoNova-Italic]
+ \definefontsynonym [SerifBold] [PalatinoNova-Bold]
+ \definefontsynonym [SerifBoldItalic] [PalatinoNova-BoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+
+\stoptypescript
+
+\starttypescript [serif] [palatino-nova-light] [name] % may change
+
+ \definefontsynonym [Serif] [PalatinoNova-Light]
+ \definefontsynonym [SerifItalic] [PalatinoNova-LightItalic]
+ \definefontsynonym [SerifBold] [PalatinoNova-Regular]
+ \definefontsynonym [SerifBoldItalic] [PalatinoNova-Italic]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+
+\stoptypescript
+
+\starttypescript [serif] [palatino-nova-medium] [name] % may change
+
+ \definefontsynonym [Serif] [PalatinoNova-Medium]
+ \definefontsynonym [SerifItalic] [PalatinoNova-MediumItalic]
+ \definefontsynonym [SerifBold] [PalatinoNova-Bold]
+ \definefontsynonym [SerifBoldItalic] [PalatinoNova-BoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+
+\stoptypescript
+
+% palatino sans
+
+\starttypescript [sans] [palatino-sans,palatino-informal]
+
+ % palatino sans com ultra light arrows / Palatino Sans Com Ultra Light Arrows / palatinosanscom-ultltarrows]
+
+ \definefontsynonym[PalatinoSans-UltraLight] [file:palatinosanscom-ultlight]
+ \definefontsynonym[PalatinoSans-UltraLightItalic] [file:palatinosanscom-ultlightita]
+ \definefontsynonym[PalatinoSans-Light] [file:palatinosanscom-light]
+ \definefontsynonym[PalatinoSans-LightItalic] [file:palatinosanscom-lightita]
+ \definefontsynonym[PalatinoSans-Regular] [file:palatinosanscom-regular]
+ \definefontsynonym[PalatinoSans-Italic] [file:palatinosanscom-italic]
+ \definefontsynonym[PalatinoSans-Medium] [file:palatinosanscom-medium]
+ \definefontsynonym[PalatinoSans-MediumItalic] [file:palatinosanscom-mediumita]
+ \definefontsynonym[PalatinoSans-Bold] [file:palatinosanscom-bold]
+ \definefontsynonym[PalatinoSans-BoldItalic] [file:palatinosanscom-boldita]
+
+ \definefontsynonym[PalatinoInformal-UltraLight] [file:palatinosansinflcom-ultlt]
+ \definefontsynonym[PalatinoInformal-UltraLightItalic] [file:palatinosansinflcom-ultltit]
+ \definefontsynonym[PalatinoInformal-Light] [file:palatinosansinflcom-light]
+ \definefontsynonym[PalatinoInformal-LightItalic] [file:palatinosansinflcom-lightit]
+ \definefontsynonym[PalatinoInformal-Regular] [file:palatinosansinflcom-regular]
+ \definefontsynonym[PalatinoInformal-Italic] [file:palatinosansinflcom-italic]
+ \definefontsynonym[PalatinoInformal-Medium] [file:palatinosansinflcom-med]
+ \definefontsynonym[PalatinoInformal-MediumItalic] [file:palatinosansinflcom-medit]
+ \definefontsynonym[PalatinoInformal-Bold] [file:palatinosansinflcom-bold]
+ \definefontsynonym[PalatinoInformal-BoldItalic] [file:palatinosansinflcom-boldit]
+
+\stoptypescript
+
+\starttypescript [sans] [palatino-sans] [name]
+
+ \definefontsynonym [Sans] [PalatinoSans-Medium]
+ \definefontsynonym [SansItalic] [PalatinoSans-MediumItalic]
+ \definefontsynonym [SansBold] [PalatinoSans-Bold]
+ \definefontsynonym [SansBoldItalic] [PalatinoSans-BoldItalic]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+
+\stoptypescript
+
+\starttypescript [sans] [palatino-informal] [name]
+
+ \definefontsynonym [Sans] [PalatinoInformal-Medium]
+ \definefontsynonym [SansItalic] [PalatinoInformal-MediumItalic]
+ \definefontsynonym [SansBold] [PalatinoInformal-Bold]
+ \definefontsynonym [SansBoldItalic] [PalatinoInformal-BoldItalic]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+
+\stoptypescript
+
+\starttypescript[palatino,palatino-nova]
+ \definetypeface[palatino][rm][serif][palatino-nova][default][features=default]
+ \definetypeface[palatino][ss][sans] [palatino-sans][default][features=default]
+ \definetypeface[palatino][tt][mono] [latin-modern] [default][features=default,rscale=1.1]
+ \definetypeface[palatino][mm][math] [palatino] [default][features=default] % ,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript[palatino-sans]
+ \definetypeface[palatino][ss][sans] [palatino-sans][default][features=default]
+ \definetypeface[palatino][rm][serif][palatino-nova][default][features=default]
+ \definetypeface[palatino][tt][mono] [latin-modern] [default][features=default,rscale=1.1]
+ \definetypeface[palatino][mm][math] [palatino] [default][features=default] % ,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript[palatino-informal]
+ \definetypeface[palatino-informal][ss][sans] [palatino-informal][default][features=default]
+ \definetypeface[palatino-informal][rm][serif][palatino-nova] [default][features=default]
+ \definetypeface[palatino-informal][tt][mono] [latin-modern] [default][features=default,rscale=1.1]
+ \definetypeface[palatino-informal][mm][math] [palatino] [default][features=default] % ,rscale=1.1]
+ \quittypescriptscanning
+\stoptypescript
+
+% melior
+
+\starttypescript [serif] [melior] [name]
+
+ \definefontsynonym [MeliorLT-Roman] [MeliorLT]
+
+ \definefontsynonym [Serif] [MeliorLT-Roman]
+ \definefontsynonym [SerifItalic] [MeliorLT-Italic]
+ \definefontsynonym [SerifBold] [MeliorLT-Bold]
+ \definefontsynonym [SerifBoldItalic] [MeliorLT-BoldItalic]
+
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+
+ \definefontsynonym [SerifCaps] [Serif]
+
+\stoptypescript
+
+\starttypescript [serif] [melior]
+
+ \definefontsynonym [MeliorLT] [file:lte50062]
+ \definefontsynonym [MeliorLT-Italic] [file:lte50063]
+ \definefontsynonym [MeliorLT-Bold] [file:lte50064]
+ \definefontsynonym [MeliorLT-BoldItalic] [file:lte50065]
+
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-hgz.mkii b/tex/context/base/type-hgz.mkii
new file mode 100644
index 000000000..4d3e495b0
--- /dev/null
+++ b/tex/context/base/type-hgz.mkii
@@ -0,0 +1 @@
+\input type-ghz.mkii \endinput % can be file synonym
diff --git a/tex/context/base/type-hgz.mkiv b/tex/context/base/type-hgz.mkiv
new file mode 100644
index 000000000..a3c2a7841
--- /dev/null
+++ b/tex/context/base/type-hgz.mkiv
@@ -0,0 +1 @@
+\input type-ghz.mkiv \endinput % can be file synonym
diff --git a/tex/context/base/type-husayni-default.mkiv b/tex/context/base/type-husayni-default.mkiv
new file mode 100644
index 000000000..b3c1af5b7
--- /dev/null
+++ b/tex/context/base/type-husayni-default.mkiv
@@ -0,0 +1,146 @@
+\definefontfeature
+ [husayni-default]
+ [analyze=yes,mode=node,
+ language=dflt,script=arab,
+ ccmp=yes, % adds identity dots to unicode letters; includes dynamic dot placement
+ init=yes,medi=yes,fina=yes, % contextual analysis
+ % dlig=yes, % Hamzahbelow under YaaHamzahabove
+ rlig=yes, % indispensable
+ calt=yes, % ayah+numerals
+ salt=yes, % includes manual justification with Tatwiil
+ % fchr=yes % formatting chars
+ anum=yes, % replace latin numerals with arabic-script ones
+ ss01=yes, % Allah, Muhammad,
+ % ss02=yes, % ss01 + Allah_final
+ ss03=yes, % level-1 stack over Jiim, initial entry only
+ % ss04=yes, % level-1 stack over Jiim, initial/medial entry
+ % ss05=yes, % multi-level Jiim stacking, initial/medial entry
+ % ss06=yes, % aesthetic Faa/Qaaf for FJ_mm, FJ_mf connection
+ ss07=yes, % initial-entry stacking over Haa
+ % ss08=yes, % initial/medial stacking over Haa, minus HM_mf strings
+ % ss09=yes, % initial/medial Haa stacking plus HM_mf strings
+ ss10=yes, % basic dipped Miim, initial-entry B_S-stack over Miim
+ % ss11=yes, % full dipped Miim, initial-entry B_S-stack over Miim
+ ss12=yes, % XBM_im initial-medial entry B_S-stack over Miim,
+ % ss13=yes, % full initial-medial entry B_S-stacked Miim
+ % ss14=yes, initial entry, stacked Laam on Miim
+ ss15=yes, % full stacked Laam-on-Miim
+ ss16=yes, % initial entry, stacked Ayn-on-Miim
+ % ss17=yes, % full stacked Ayn-on-Miim
+ % ss18=yes, % LMJ_im % already contained in ss03--05, may remove
+ ss19=yes, % LM_im
+ % ss20=yes, % KLM_m, sloped Miim
+ % ss21=yes, % KLM_i_mm/LM_mm, sloped Miim
+ % ss22=yes, % filled sloped Miim
+ % ss23=yes, % LM_mm, non-sloped Miim
+ ss24=yes, % BR_i_mf, BN_i_mf
+ ss25=yes, % basic LH_im % might merge with ss24
+ ss26=yes, % full Yaa.final special strings: BY_if, BY_mf, LY_mf
+ ss27=yes, % basic thin Miim.final
+ % ss28=yes, % full thin Miim.final % to be moved to jsnn
+ % ss29=yes, % basic short Miim.final
+ % ss30=yes, % full short Miim.final % to be moved to jsnn
+ ss31=yes, % basic Raa.final strings: JR and SR
+ % ss32=yes, % basic Raa.final strings: JR, SR, and BR
+ % ss33=yes, % TtR % to be moved to jsnn
+ ss34=yes, % AyR style % also available in jsnn
+ ss35=yes, % full Kaaf contexts
+ ss36=yes, % full Laam contexts
+ ss37=yes, % Miim-Miim contexts
+ ss38=yes, % basic dipped Haa, B_SH_mm
+ % ss39=yes, % full dipped Haa, B_S_LH_i_mm_Mf
+ % ss40=yes, % aesthetic dipped medial Haa
+ ss41=yes, % high and low Baa strings
+ ss42=yes, % diagonal entry
+ ss43=yes, % initial alternates
+ % ss44=yes, % hooked final alif
+ % ss45=yes, % BMA_f
+ % ss46=yes, % BM_mm_alt, for JBM combinations
+ % ss47=yes, % Shaddah-<kasrah> combo
+ % ss48=yes, % Auto-sukuun
+ % ss49=yes, % No vowels
+ % ss50=yes, % Shaddah/MaaddahHamzah only
+ % ss51=yes, % No Skuun
+ % ss52=yes, % No Waslah
+ % ss53=yes, % No Waslah
+ % ss54=yes, % chopped finals
+ % ss55=yes, % idgham-tanwin
+ ss60=yes, %
+ % js01=yes, % Raawide
+ % js02=yes, % Yaawide
+ % js03=yes, % Kaafwide
+ % js04=yes, % Nuunwide
+ % js05=yes, % Kaafwide Nuunwide Siinwide Baawide
+ % js06=yes, % final Haa wide
+ % js07=yes, % thin Miim
+ % js08=yes, % short Miim
+ % js09=yes, % wide Siin
+ % js10=yes, % thuluth-style initial Haa, final Miim, MRw_mf
+ % js11=yes, % level-1 stretching
+ % js12=yes, % level-2 stretching
+ % js13=yes, % level-3 stretching
+ % js14=yes, % final Alif
+ % js15=yes, % hooked final Alif
+ js16=yes, % aesthetic medial Faa/Qaaf
+ % js17=yes, % fancy isol Haa after Daal, Raa, and Waaw
+ % js18=yes, % Laamwide, alternate substitution
+ % js19=yes, % level-4 stretching, only siin and Hhaa for basmalah
+ % js20=yes, % level-5 stretching, only siin and Hhaa for basmalah
+ % js21=yes, % Haa.final_alt2
+ % calt=yes, % to be used for vowel/dot-based dynamics
+ % ttwl=yes, % for simple, horizontal stretching, not yet implemented in luatex/mkiv
+ % flts=yes, % Final Glyph On Line Alternates Short: Baa-like
+ % fltw=yes, % Final Glyph On Line Alternates Wide: Baa-like
+ % gclr=yes, % Geometric Cursive LR : for testing GPOS only!
+ % gcrl=yes, % Geometric Cursive RL
+ % gklr=yes, % Geometric Kerning LR
+ % gkrl=yes, % Geometric Kerning RL
+ kern=yes, % includes kerning of dot-base pairs, and final pairs in continuous strings
+ curs=yes, % we don't curs final pairs, padj for that
+ mark=yes, % vowels
+ mkmk=yes, % stacked vowels
+ tlig=yes,
+ colorscheme=husayni:default]
+
+\definefontfeature
+ [husayni-tt]
+ [analyze=yes,mode=node,
+ language=dflt,script=arab,
+ ccmp=yes, % adds identity dots to unicode letters; includes dynamic dot placement
+ init=yes,medi=yes,fina=yes, % contextual analysis
+ rlig=yes, % indispensable
+ fchr=yes,
+ kern=yes, % includes kerning of dot-base pairs, and final pairs in continuous strings
+ curs=yes, % we don't curs final pairs, padj for that
+ mark=yes, % vowels
+ mkmk=yes] % stacked vowels
+
+\definefontfeature
+ [husayni-mono]
+ [analyze=yes,mode=node,
+ language=dflt,script=arab,ccmp=no,
+ init=yes,medi=yes,fina=yes,isol=yes,
+ rlig=yes,liga=yes,
+ mset=yes]
+
+\definedelimitedtext
+ [ornatequote]
+ [left={‏\char"FD3F\penalty10000},
+ right={‏\char"FD3E\penalty10000}]
+
+\definedelimitedtext
+ [arparenthesis]
+ [left={‏\char"0028},
+ right={‏\char"0029}]
+
+\definedelimitedtext
+ [arquotation]
+ [left={‏\symbol[rightquotation]},
+ right={‏\symbol[leftquotation]},
+ leftmargin=standard]
+
+\definedelimitedtext
+ [arquote]
+ [left={‏\symbol[rightquote]},
+ right={‏\symbol[leftquote]},
+ leftmargin=standard] \ No newline at end of file
diff --git a/tex/context/base/type-ini.mkii b/tex/context/base/type-ini.mkii
new file mode 100644
index 000000000..ac1e243f2
--- /dev/null
+++ b/tex/context/base/type-ini.mkii
@@ -0,0 +1,725 @@
+%D \module
+%D [ file=type-ini,
+%D version=2001.03.05,
+%D title=\CONTEXT\ Typescript 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 Typescript Macros / Initialization}
+
+%D The default fontclass is empty. We could demand always using fontclasses,
+%D and then make the calling macros simplier (always assume fontclass) but
+%D apart from downward compatibility issues, it would make global, class
+%D spanning definitions a pain. Some day we will introduce a default class.
+
+% torture test : proper typefaces (and namespace)
+%
+% \starttext
+% \usetypescript[modern][default] default: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][texnansi] texnansi: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][ec] ec: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][qx] qx: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][t5] t5: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \stoptext
+%
+% torture test : no typeface, just definitions
+%
+% \starttext
+% {\setupbodyfont[reset] \setupbodyfont[cmr] cmr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[plr] plr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[csr] csr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[vnr] vnr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[aer] aer: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% \stoptext
+
+% \usetypescript [modern] [texnansi]
+%
+% normal : 1450 ms
+% exa quit : 1300 ms (150 ms)
+% preload : 825 ms (635 ms) (40-50%)
+%
+% \usetypescript [modern] [texnansi]
+% \usetypescript [palatino][texnansi]
+% \usetypescript [times] [texnansi]
+%
+% normal : 3200 ms
+% exa quit : 2700 ms ( 500 ms)
+% preload : 1300 ms (1900 ms) (60-70%)
+
+% \usetypescript [modern][\defaultencoding]
+% \usetypescript [map] [latin-modern-os] [\defaultencoding]
+% \setupbodyfont[modern]
+% test 1234 test
+
+\unprotect
+
+\def\starttypescriptcollection
+ {\dosingleempty\dostarttypescriptcollection}
+
+\def\dostarttypescriptcollection[#1]%
+ {}
+
+\def\stoptypescriptcollection
+ {}
+
+\let\typescriptfiles\empty
+
+\unexpanded\def\usetypescriptfile[#1]%
+ {\doifelse{#1}\v!reset
+ {\let\typescriptfiles\empty}
+ {\splitfiletype{#1}%
+ \addtocommalist\splitoffname\typescriptfiles}}
+
+% SO FAR
+
+\let\currenttypescripts\empty
+
+\newif\iftypescriptfound
+
+\let\@@typescriptone \empty \let\typescriptone \empty
+\let\@@typescripttwo \empty \let\typescripttwo \empty
+\let\@@typescriptthree\empty \let\typescriptthree\empty
+
+% method 2 is for Hans van der Meer
+
+\newtoks\documenttypescripts
+
+\chardef\typescriptmethod\plusone % 1: empty==all==true 2: empty==false
+\chardef\typescriptstate \plustwo % 1: process 2: store
+
+\unexpanded\def\usetypescript {\chardef\typescriptmethod\plusone\dotripleempty\dousetypescript}
+\unexpanded\def\usetypescriptexact{\chardef\typescriptmethod\plustwo\dotripleempty\dousetypescript}
+
+\def\dousetypescript[#1][#2][#3]%
+ {\expanded{\dodousetypescript[#1][#2][#3]}}
+
+\def\dodousetypescript[#1][#2][#3]% also loads type-loc, a user file
+ {\pushmacro\@@typescriptone \edef\@@typescriptone {\truetypescript{#1}}%
+ \pushmacro\@@typescripttwo \edef\@@typescripttwo {\truetypescript{#2}}%
+ \pushmacro\@@typescriptthree\edef\@@typescriptthree{\truetypescript{#3}}%
+ \pushmacro\typescriptone
+ \pushmacro\typescripttwo
+ \pushmacro\typescriptthree
+ \pushmacro\typescriptmethod
+ \pushmacro\typescriptstate \chardef\typescriptstate\plusone % process
+ \pushmacro\stoptypescript
+ \typescriptfoundfalse
+ \iftracetypescripts\writestatus\m!fonts{request: [\@@typescriptone] [\@@typescripttwo] [\@@typescriptthree]}\fi
+ \processcommacommand[\typescriptfiles]\dododousetypescript
+ \the\documenttypescripts
+ \firsttypescriptpassfalse % testen
+ \popmacro\stoptypescript
+ \popmacro\typescriptstate
+ \popmacro\typescriptmethod
+ \popmacro\typescriptthree
+ \popmacro\typescripttwo
+ \popmacro\typescriptone
+ \popmacro\@@typescriptthree
+ \popmacro\@@typescripttwo
+ \popmacro\@@typescriptone}
+
+% simple version:
+%
+% \def\dododousetypescript#1%
+% {\startreadingfile
+% \pushmacro\currenttypefile
+% \def\currenttypefile{#1}%
+% \def\currenttypefile{#1}%
+% \readfile\currenttypefile\donothing\donothing
+% \popmacro\currenttypefile
+% \stopreadingfile}
+%
+% tricky version:
+
+\newconditional\preloadingtypescripts
+
+\def\preloadtypescripts{\ifproductionrun\settrue\preloadingtypescripts\fi}
+
+\def\dododousetypescript#1%
+ {\setfalse\quittingtypescript
+ \pushmacro\currenttypefile
+ \def\currenttypefile{#1}%
+ \ifconditional\preloadingtypescripts
+ % load files once, and use saved data
+ \def\loadedtypescripts{\csname\??ts:\c!file:#1\endcsname}%
+ \@EAEAEA\ifx\loadedtypescripts\relax
+ \@EAEAEA\newtoks\loadedtypescripts
+ \bgroup
+ \long\def\starttypescript##1\stoptypescript
+ {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescript##1\stoptypescript}}%
+ \long\def\starttypescriptcollection##1\stoptypescriptcollection
+ {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescriptcollection##1\stoptypescriptcollection}}%
+ \startreadingfile
+ \pushendofline
+ \unprotect
+ \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}%
+ \protect
+ \popendofline
+ \stopreadingfile
+ \egroup
+ \fi
+ %\message{[\space\currenttypefile}%
+ \the\loadedtypescripts
+ %\message{\ifconditional\quittingtypescript quit\space\fi]}%
+ \else
+ % process files each time
+ \startreadingfile
+ \pushendofline
+ \unprotect
+ \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}%
+ \protect
+ \popendofline
+ \stopreadingfile
+ \fi
+ \popmacro\currenttypefile
+ \ifconditional\quittingtypescript
+ \quitcommalist
+ \setfalse\quittingtypescript
+ \fi}
+
+% % not faster, unless maybe toks
+%
+% \newcount\nofloadedtypescripts
+%
+% \def\startloadedtypescript
+% {\dotripleempty\dostartloadedtypescript}
+%
+% \let\stoploadedtypescript\relax
+%
+% \long\def\dostartloadedtypescript[#1][#2][#3]#4\stoptypescript
+% {\global\advance\nofloadedtypescripts\plusone
+% \long\setgvalue{\??ts=>\the\nofloadedtypescripts}{#4}%
+% \edef\temp%
+% {\iffirstargument [#1]\fi
+% \ifsecondargument[#2]\fi
+% \ifthirdargument [#3]\fi
+% \noexpand\csname\??ts=>\the\nofloadedtypescripts\noexpand\endcsname}%
+% \global\loadedtypescripts\@EA\@EA\@EA{\@EA\the\@EA\loadedtypescripts\@EA\starttypescript\temp\stoptypescript}}
+%
+% \def\startloadedtypescriptcollection
+% {\dosingleempty\dostartloadedtypescriptcollection}
+%
+% \def\dostartloadedtypescriptcollection[#1]{}
+% \def\stoploadedtypescriptcollection {}
+%
+% \def\dododousetypescript#1%
+% {\setfalse\quittingtypescript
+% \pushmacro\currenttypefile
+% \def\currenttypefile{#1}%
+% \ifconditional\preloadingtypescripts
+% % load files once, and use saved data
+% \def\loadedtypescripts{\csname\??ts:\c!file:#1\endcsname}%
+% \@EAEAEA\ifx\loadedtypescripts\relax
+% \@EAEAEA\newtoks\loadedtypescripts
+% \bgroup
+% %
+% \let\starttypescript \startloadedtypescript
+% \let\stoptypescript \stoploadedtypescript
+% \let\starttypescriptcollection\startloadedtypescriptcollection
+% \let\stoptypescriptcollection \stoploadedtypescriptcollection
+% %
+% \startreadingfile
+% \pushendofline
+% \unprotect
+% \readfile\currenttypefile\donothing\donothing
+% \protect
+% \popendofline
+% \stopreadingfile
+% \egroup
+% \fi
+% %\message{[\space\currenttypefile}%
+% \the\loadedtypescripts
+% %\message{\ifconditional\quittingtypescript quit\space\fi]}%
+% \else
+% % process files each time
+% \startreadingfile
+% \pushendofline
+% \unprotect
+% \readfile\currenttypefile\donothing\donothing
+% \protect
+% \popendofline
+% \stopreadingfile
+% \fi
+% \popmacro\currenttypefile
+% \ifconditional\quittingtypescript
+% \quitcommalist
+% \setfalse\quittingtypescript
+% \fi}
+
+\def\usetypescriptonce
+ {\dotripleempty\dousetypescriptonce}
+
+\def\dousetypescriptonce[#1][#2][#3]%
+ {\doifelseflagged{ts:#1:#2:#3}%
+ {\writestatus\m!fonts{once (#1) (#2) (#3)}}
+ {\setflag{ts:#1:#2:#3}%
+ \expanded{\dodousetypescript[#1][#2][#3]}}}
+
+% \definetypescriptsynonym[lbr][cmr]
+
+\def\definetypescriptsynonym
+ {\dodoubleempty\dodefinetypescriptsynonym}
+
+\def\dodefinetypescriptsynonym[#1][#2]%
+ {\ifsecondargument\setevalue{\??tm#1}{#2}\fi}
+
+\def\truetypescript#1%
+ {\ifcsname\??tm#1\endcsname
+ \@EA\truetypescript\csname\??tm#1\endcsname\else#1%
+ \fi}
+
+% script [serif] [default] [size]
+% script [serif] [computer-modern] [size]
+% script [serif] [computer-modern] [ec]
+% script [serif] [computer-modern] [name]
+% script [serif] [computer-modern] [special]
+
+% todo, make firsttypescriptpass conditional
+
+\newif\iffirsttypescriptpass \firsttypescriptpasstrue
+
+\prependtoks\firsttypescriptpasstrue\to\everyjob
+
+\def\typescript@@all{all}
+
+\newif\iftracetypescripts
+
+\def\starttypescript
+ {\ifcase\typescriptstate
+ % 0 = skip
+ \@EA\gobbleuntil\@EA\stoptypescript
+ \or
+ % 1 = process
+ \expandafter\dostarttypescript
+ \or
+ % 2 = store
+ \expandafter\nostarttypescript
+ \else
+ % ? = skip
+ \@EA\gobbleuntil\@EA\stoptypescript
+ \fi}
+
+\long\def\nostarttypescript#1\stoptypescript
+ {\appendtoks\starttypescript#1\stoptypescript\to\documenttypescripts}
+
+\def\dostarttypescript
+ {\let\typescriptone \@@typescriptone
+ \let\typescripttwo \@@typescripttwo
+ \let\typescriptthree\@@typescriptthree
+ \let\typescriptmatch\empty
+ \doifnextoptionalelse\dostarttypescriptone\dostarttypescriptall}
+
+\long\def\dostarttypescriptall
+ {\iffirsttypescriptpass
+ \expandafter\doprocesstypescript
+ \else
+ % skip this since it may do unwanted resets, like
+ % setting symbolic font names to unknown, especially
+ % in run time user type scripts
+ \expandafter\noprocesstypescript
+ \fi}
+
+\long\def\dostarttypescriptyes
+ {\ifdone
+ \typescriptfoundtrue
+ \iftracetypescripts\writestatus\m!fonts{match:\ifx\currenttypefile\relax\space *\fi \typescriptmatch}\fi
+ \expandafter\doprocesstypescript
+ \else
+ \expandafter\noprocesstypescript
+ \fi}
+
+\long\def\dostarttypescriptone
+ {\dochecktypescript\@@typescriptone\typescriptone\redostarttypescriptone}
+
+\long\def\dostarttypescripttwo
+ {\dochecktypescript\@@typescripttwo\typescripttwo\redostarttypescripttwo}
+
+\long\def\dostarttypescriptthree
+ {\dochecktypescript\@@typescriptthree\typescriptthree\redostarttypescriptthree}
+
+\long\def\redostarttypescriptone
+ {\doifnextoptionalelse\dostarttypescripttwo\dostarttypescriptyes}
+
+\long\def\redostarttypescripttwo
+ {\doifnextoptionalelse\dostarttypescriptthree\dostarttypescriptyes}
+
+\long\def\redostarttypescriptthree
+ {\dostarttypescriptyes}
+
+\def\doprocesstypescript
+ {\pushmacro\fontclass}
+
+\def\stoptypescript
+ {\popmacro\fontclass}
+
+\long\def\noprocesstypescript#1\stoptypescript
+ {}
+
+\let\typescriptmatch\empty
+
+\def\dochecktypescript#1#2#3[#4]% script use value next
+ {\donefalse
+ \def\@@typescriptcheck{#4}%
+ \ifx\@@typescriptcheck\empty % no longer needed / met
+ \ifcase\typescriptmethod\or\donetrue\else\donefalse\fi
+ \else\ifx#1\typescript@@all
+ \donetrue
+ \else\ifx\@@typescriptcheck\typescript@@all
+ \donetrue
+ \else\expanded{\doifcommonelse{\@@typescriptcheck}{#1}}\donetrue\donefalse\ifdone
+ \let#2\commalistelement
+ \fi\fi\fi\fi
+ \ifdone
+ \edef\typescriptmatch{\typescriptmatch\space[#4]}%
+ \expandafter#3%
+ \else
+ \expandafter\noprocesstypescript
+ \fi}
+
+%D Yet another speed up: when issued inside typescript, the call
+%D
+%D \starttyping
+%D \quittypescriptscanning
+%D \stoptyping
+%D
+%D quits further loading. For an example, see type-exa:
+
+\newconditional\quittingtypescript \setfalse\quittingtypescript
+
+\def\quittypescriptscanning{\settrue\quittingtypescript}
+
+% status
+%
+% 1 loaded
+% 2 reported
+% 3 preloaded
+
+% flags ipv \c!state, more flag values
+
+\def\dopreloadmapfile#1%
+ {\splitfiletype{#1}%
+ \writestatus\m!fonts{assuming map file: \splitoffname}%
+ \setxvalue{\splitoffname \c!state}{3}%
+ \doglobal\removefromcommalist\splitoffname\allfontmapsfiles}
+
+\def\preloadmapfile[#1]{\expanded{\processcommalist[#1]}\dopreloadmapfile}
+\def\loadmapfile [#1]{\expanded{\processcommalist[#1]}\loadthemapfile}
+\def\unloadmapfile [#1]{\expanded{\processcommalist[#1]}\unloadthemapfile}
+
+% too soon, no driver known, \ifproductionrun \loadallfontmapfiles \fi
+
+% temp hack, will become just \addto
+
+\ifx\pdftexversion\undefined
+
+ \def\loadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\addtocommalist\splitoffname\allfontmapsfiles}
+
+\else\ifnum\pdftexversion<120 % no overloading
+
+ \def\loadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\pretocommalist\splitoffname\allfontmapsfiles}
+
+\else
+
+ \def\loadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\addtocommalist\splitoffname\allfontmapsfiles}
+
+\fi \fi
+
+\def\unloadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\removefromcommalist\splitoffname\allfontmapsfiles}
+
+\let\usedmapfile\gobbletwoarguments
+\let\usedmapline\gobbletwoarguments
+
+\def\doregisterloadedmapfile#1%
+ {\immediatewriteutilitycommand{\usedmapfile{=}{#1}}}
+
+\def\doloadfontmapfile#1%
+ {\ifundefined{#1\c!state}%
+ \writestatus\m!fonts{using map file: #1}%
+ \doregisterloadedmapfile{#1}%
+ \doloadmapfile{=}{#1.\f!fontmapextension}% +/add =/replace -/remove
+ \setxvalue{#1\c!state}{1}%
+ \fi}
+
+\def\doreportfontmapfile#1%
+ {\ifundefined{#1\c!state}%
+ \writestatus\m!fonts{needs map file: #1}%
+ \setxvalue{#1\c!state}{2}%
+ \fi}
+
+\def\loadallfontmapfiles
+ {%\message{[\allfontmapsfiles]}%
+ \ifconditional\resettingmapfile
+ \writestatus\m!fonts{resetting map file list}%
+ \doresetmapfilelist
+ \global\setfalse\resettingmapfile
+ \fi
+ \ifx\allfontmapsfiles\empty \else
+ \ifautoloadmapfiles
+ \processcommacommand[\allfontmapsfiles]\doloadfontmapfile
+ \else
+ \processcommacommand[\allfontmapsfiles]\doreportfontmapfile
+ \fi
+ \forgetmapfiles
+ \fi}
+
+\def\loadmapline
+ {\dodoubleempty\dodoloadmapline}
+
+\def\dodoloadmapline[#1][#2]%
+ {\loadallfontmapfiles % ! ! !
+ \ifsecondargument
+ \immediatewriteutilitycommand{\usedmapline{#1}{#2}}%
+ \doloadmapline{#1}{#2}% special
+ \else
+ \loadmapline[=][#1]%
+ %\immediatewriteutilitycommand{\usedmapline{=}{#2}}%
+ %\doloadmapline{=}{#1}% special
+ \fi}
+
+% since this is driver dependent, and since we may set map files
+% before an output format is defined, we need to postpone it; we
+% cannot use starttext as hook because an output switch can be part
+% of a style; an alternative is to no longer permit driver switching
+% after the first \starttext, but that will break compatibility
+% because \startcomponent ... \environment ... is pretty legal.
+
+% the map directives need to end up in the right place in the stream
+
+% hm, the timing of when pdftex needs the map file info keeps changing;
+% it's really time to move to map line support
+
+% \appendtoks \loadallfontmapfiles \to \everyPDFximage
+% \appendtoks \loadallfontmapfiles \to \everystarttext
+% \appendtoks \loadallfontmapfiles \to \everybeforepagebody
+
+\everybeforeshipout \expandafter
+ {\expandafter\appendtoks
+ \expandafter\loadallfontmapfiles
+ \expandafter\to
+ \expandafter\pageboundsettings
+ \the\everybeforeshipout}
+
+\newif\ifautoloadmapfiles
+
+\let\allfontmapsfiles\empty
+
+\def\forgetmapfiles
+ {\globallet\allfontmapsfiles\empty}
+
+\newconditional\resettingmapfile
+
+\def\resetmapfiles
+ {\global\settrue\resettingmapfile}
+
+\def\disablemapfiles
+ {\resetmapfiles
+ \forgetmapfiles}
+
+%D A handy shortcut:
+
+% \definetypescriptprefix[serif][Serif]
+% \definetypescriptprefix[sans] [Sans]
+% \definetypescriptprefix[mono] [Mono]
+%
+%\starttypescript [serif,sans,mono] [handling,hanging,hz] [pure,normal,hz,quality]
+% \setupfontsynonym [\typescriptprefix\typescriptone] [handling=\typescriptthree]
+% \stoptypescript
+
+\def\definetypescriptprefix
+ {\dodoubleargument\dodefinetypescriptprefix}
+
+\def\dodefinetypescriptprefix[#1][#2]%
+ {\setgvalue{\??ts::#1}{#2}} % made global
+
+% without testing:
+%
+% \def\typescriptprefix#1%
+% {\csname\??ts::#1\endcsname}
+%
+% with testing:
+
+\def\typescriptprefix#1%
+ {\executeifdefined{\??ts::#1}{#1}}
+
+% defining typefaces:
+%
+% \definetypeface [#1:joke] [#2:rm]
+% \definetypeface [#1:joke] [#2:rm] [#3:...]
+% \definetypeface [#1:joke] [#2:rm] [#3:serif] [#4:lucida] [#5:size] [#6:...]
+
+\def\definetypeface
+ {\dosixtupleargument\dodefinetypeface}
+
+\def\tsvar#1#2% \executeifdefined{\??ts#1}{#2}
+ {\@EA\ifx\csname\??ts#1\endcsname\empty
+ #2%
+ \else
+ \csname\??ts#1\endcsname
+ \fi}
+
+% #1=main #2=rm #3=serif #4=fontname #5=size #6=settings
+
+\def\typefaceencoding{\defaultencoding}
+
+% we can use \rawgetparameters or \rawgeteparameters
+
+\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!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!fallbacks}\@@tsfallbacks % new per 12/10/2008
+ \saverelativefontsize{#2}\relativefontsize % fall back
+ \savemathtextstyle\@@tstext % math text style (new per 28/4/2006)
+ \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4] / \typefaceencoding}\fi
+ \usetypescript[#3,\t!map][#4][\t!name,\t!default,\typefaceencoding,\t!special]% map is needed for backward cmp
+ \usetypescript[#3][#5][\t!size]%
+ \popmacro\fontclass
+ \popmacro\typefaceencoding
+ \popmacro\relativefontsize
+ \else\iffourthargument
+ \definetypeface[#1][#2][#3][#4][\s!default]%
+ \else\ifthirdargument
+ \getparameters[\??tf#1#2][#3]%
+ \fi\fi\fi}
+
+\def\dododefinetypeface[#1][#2]% saveguard against redefinition
+ {\doifsomething{#1}
+ {\ifcsname\??tf#1\s!default\endcsname \else
+ \registerfontclass{#1}%
+ \setgvalue{\??tf#1\s!default}{#2}%
+ \fi
+ \ifcsname#1\endcsname \else
+ \unexpanded\setgvalue{#1}{\switchtotypeface[#1][#2]}%
+ \fi}}
+
+\def\setuptypeface% [class] [settings]
+ {\doquadrupleempty\doswitchtotypeface[\setupbodyfont][\fontclass]}
+
+\unexpanded\def\switchtotypeface% [class] [settings]
+ {\doquadrupleempty\doswitchtotypeface[\switchtobodyfont][\globalfontclass]}
+
+\def\doswitchtotypeface[#1][#2][#3][#4]%
+ {%\doifinsetelse{\s!default,\v!reset}{#3}
+ % {\setcurrentfontclass\empty}
+ % {\setcurrentfontclass{#3}}%
+ \setcurrentfontclass{#3}%
+ \let\globalfontclass#2%
+ \iffourthargument
+ #1[#4]%
+ \else\ifx\fontclass\empty
+ #1[\c!rm]%
+ \else
+ \doifdefinedelse{\??tf\fontclass\s!default}
+ {#1[\getvalue{\??tf\fontclass\s!default}]}
+ {#1[\c!rm]}%
+ \fi \fi
+ \ifmmode\mr\else\tf\fi} % needed ?
+
+\def\usetypefile[#1]% recurses on path ! ?
+ {\readfile{\f!typeprefix#1}\donothing\donothing}
+
+%D For Taco:
+%D
+%D \starttyping
+%D \inherittypeface[palatino][rm][postscript]
+%D \inherittypeface[palatino][rm][\fontclass]
+%D \inherittypeface[palatino][rm] % == \fontclass
+%D \inherittypeface[palatino] % == [rm,ss,tt,mm]
+%D \stoptyping
+
+\def\inherittypeface
+ {\dotripleempty\doinherittypeface}
+
+\def\doinherittypeface[#1][#2][#3]%
+ {\doifelsenothing{#2}
+ {\doinherittypeface[#1][\c!rm,\c!ss,\c!tt,\c!mm][\fontclass]}
+ {\doifnot{#1}{#3}
+ {\def\docommand##1{\setevalue{#1-##1}{#3}}%
+ \processcommalist[#2]\docommand}}}
+
+%D This hook sinto the font mechanism with:
+
+\def\checkfontclass#1%
+ {\edef\fontclass{\executeifdefined{\fontclass-#1}{\fontclass}}}
+
+%D For backward compatibility we reimplement the font file
+%D loading macro.
+
+\ifx\normaldoreadfontdefinitionfile\undefined
+ \let\normaldoreadfontdefinitionfile\doreadfontdefinitionfile
+\fi
+
+% old and obsolete
+%
+% \def\doreadfontdefinitionfile#1#2% #1 = set/switch state
+% {\ifundefined{\??tf#2\c!default}%
+% \pushmacro\fontclass
+% \setcurrentfontclass\empty
+% \pushmacro\@@typescriptone \edef\@@typescriptone {\truetypescript{#2}}%
+% \pushmacro\@@typescripttwo \let\@@typescripttwo \empty
+% \pushmacro\@@typescriptthree\let\@@typescriptthree\empty
+% \typescriptfoundfalse
+% \dododousetypescript{\f!typeprefix pre}%
+% \popmacro\@@typescriptthree
+% \popmacro\@@typescripttwo
+% \popmacro\@@typescriptone
+% \iftypescriptfound \else
+% \normaldoreadfontdefinitionfile{#1}{#2}%
+% \fi
+% \setcurrentfontclass\empty
+% \popmacro\fontclass
+% \else\ifcase#1\relax
+% \switchtotypeface[#2]%
+% \else
+% \setuptypeface[#2]%
+% \fi\fi}
+%
+% new and obeying fontclasses (but still obsolete)
+
+\def\doreadfontdefinitionfile#1#2% #1 = set/switch state
+ {\ifcsname\??tf#2\c!default\endcsname
+ \ifcase#1\relax
+ \switchtotypeface[#2]%
+ \else
+ \setuptypeface[#2]%
+ \fi
+ \else
+ \pushmacro\starttypescript
+ \scratchtoks\emptytoks
+ % locate downward compatibility definitions, one argument !
+ \long\def\starttypescript[##1]##2\stoptypescript
+ {\doif{##1}{#2}{\scratchtoks{##2}}}
+ \startreadingfile
+ \readfile{\f!typeprefix pre}\donothing\donothing
+ \stopreadingfile
+ \popmacro\starttypescript
+ \the\scratchtoks
+ \fi}
+
+\fetchruntimecommand \typetypescript {\f!typeprefix\s!run.mkii}
+
+% \usetypescript [berry] [ec]
+
+\protect \endinput
diff --git a/tex/context/base/type-ini.mkiv b/tex/context/base/type-ini.mkiv
new file mode 100644
index 000000000..cd65f8abb
--- /dev/null
+++ b/tex/context/base/type-ini.mkiv
@@ -0,0 +1,578 @@
+%D \module
+%D [ file=type-ini,
+%D version=2001.03.05,
+%D title=\CONTEXT\ Typescript 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 Typescript Macros / Initialization}
+
+%D The default fontclass is empty. We could demand always using fontclasses,
+%D and then make the calling macros simplier (always assume fontclass) but
+%D apart from downward compatibility issues, it would make global, class
+%D spanning definitions a pain. Some day we will introduce a default class.
+
+% torture test : proper typefaces (and namespace)
+%
+% \starttext
+% \usetypescript[modern][default] default: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][texnansi] texnansi: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][ec] ec: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][qx] qx: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][t5] t5: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \stoptext
+%
+% torture test : no typeface, just definitions
+%
+% \starttext
+% {\setupbodyfont[reset] \setupbodyfont[cmr] cmr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[plr] plr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[csr] csr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[vnr] vnr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[aer] aer: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% \stoptext
+
+% \usetypescript [modern] [texnansi]
+%
+% normal : 1450 ms
+% exa quit : 1300 ms (150 ms)
+% preload : 825 ms (635 ms) (40-50%)
+%
+% \usetypescript [modern] [texnansi]
+% \usetypescript [palatino][texnansi]
+% \usetypescript [times] [texnansi]
+%
+% normal : 3200 ms
+% exa quit : 2700 ms ( 500 ms)
+% preload : 1300 ms (1900 ms) (60-70%)
+
+% \usetypescript [modern][\defaultencoding]
+% \usetypescript [map] [latin-modern-os] [\defaultencoding]
+% \setupbodyfont[modern]
+% test 1234 test
+
+\unprotect
+
+\unexpanded\def\starttypescriptcollection
+ {\dosingleempty\dostarttypescriptcollection}
+
+\def\dostarttypescriptcollection[#1]%
+ {}
+
+\unexpanded\def\stoptypescriptcollection
+ {}
+
+\let\typescriptfiles\empty
+
+\unexpanded\def\usetypescriptfile[#1]%
+ {\doifelse{#1}\v!reset
+ {\let\typescriptfiles\empty}
+ {\splitfiletype{#1}%
+ \addtocommalist\splitoffname\typescriptfiles}}
+
+% SO FAR
+
+\let\currenttypescripts\empty
+
+\newif\iftypescriptfound
+
+\let\@@typescriptone \empty \let\typescriptone \empty
+\let\@@typescripttwo \empty \let\typescripttwo \empty
+\let\@@typescriptthree\empty \let\typescriptthree\empty
+
+% method 2 is for Hans van der Meer
+
+\newtoks\documenttypescripts
+
+\chardef\typescriptmethod\plusone % 1: empty==all==true 2: empty==false
+\chardef\typescriptstate \plustwo % 1: process 2: store
+
+\unexpanded\def\usetypescript {\let\typescriptmethod\plusone\dotripleempty\dousetypescript}
+\unexpanded\def\usetypescriptexact{\let\typescriptmethod\plustwo\dotripleempty\dousetypescript}
+
+\def\dousetypescript[#1][#2][#3]%
+ {\normalexpanded{\noexpand\dodousetypescript[#1][#2][#3]}}
+
+\def\dodousetypescript[#1][#2][#3]% also loads type-loc, a user file
+ {\pushmacro\@@typescriptone \edef\@@typescriptone {\truetypescript{#1}}%
+ \pushmacro\@@typescripttwo \edef\@@typescripttwo {\truetypescript{#2}}%
+ \pushmacro\@@typescriptthree\edef\@@typescriptthree{\truetypescript{#3}}%
+ \pushmacro\typescriptone
+ \pushmacro\typescripttwo
+ \pushmacro\typescriptthree
+ \pushmacro\typescriptmethod
+ \pushmacro\typescriptstate \let\typescriptstate\plusone % process
+ \pushmacro\stoptypescript
+ \typescriptfoundfalse
+ \iftracetypescripts\writestatus\m!fonts{request: [\@@typescriptone] [\@@typescripttwo] [\@@typescriptthree]}\fi
+ \processcommacommand[\typescriptfiles]\dododousetypescriptfile
+ \the\documenttypescripts
+ \firsttypescriptpassfalse % testen
+ \popmacro\stoptypescript
+ \popmacro\typescriptstate
+ \popmacro\typescriptmethod
+ \popmacro\typescriptthree
+ \popmacro\typescripttwo
+ \popmacro\typescriptone
+ \popmacro\@@typescriptthree
+ \popmacro\@@typescripttwo
+ \popmacro\@@typescriptone}
+
+\newconditional\preloadingtypescripts
+
+\def\preloadtypescripts{\ifproductionrun\settrue\preloadingtypescripts\fi}
+
+\long\def\xxstarttypescript#1\stoptypescript
+ {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescript#1\stoptypescript}}
+
+\long\def\xxstarttypescriptcollection#1\stoptypescriptcollection
+ {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescriptcollection#1\stoptypescriptcollection}}
+
+\def\dododousetypescriptfile#1%
+ {\setfalse\quittingtypescript
+ \pushmacro\currenttypefile
+ \def\currenttypefile{#1}%
+ \ifconditional\preloadingtypescripts
+ \doprocessandbuffertypescriptfile
+ \else
+ \doprocesstypescriptfile
+ \fi
+ \popmacro\currenttypefile
+ \ifconditional\quittingtypescript
+ \quitcommalist
+ \setfalse\quittingtypescript
+ \fi}
+
+\def\doprocessandbuffertypescriptfile
+ {\expandafter\let\expandafter\loadedtypescripts\csname\??ts:\c!file:\currenttypefile\endcsname
+ \ifx\loadedtypescripts\relax
+ \dobuffertypescriptfile
+ \fi
+ \the\loadedtypescripts}
+
+\def\dobuffertypescriptfile
+ {\newtoks\loadedtypescripts
+ \bgroup
+ \let\starttypescript\xxstarttypescript
+ \let\starttypescriptcollection\xxstarttypescriptcollection
+ \doprocesstypescriptfile
+ \egroup
+ \expandafter\let\csname\??ts:\c!file:\currenttypefile\endcsname\loadedtypescripts}
+
+\def\doprocesstypescriptfile
+ {\startreadingfile
+ \pushendofline
+ \unprotect
+ % we could have something readfilewithMKfallback
+ \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}%
+ \protect
+ \popendofline
+ \stopreadingfile}
+
+\def\usetypescriptonce
+ {\dotripleempty\dousetypescriptonce}
+
+\def\dousetypescriptonce[#1][#2][#3]%
+ {\doifelseflagged{ts:#1:#2:#3}%
+ {\writestatus\m!fonts{once (#1) (#2) (#3)}}
+ {\setflag{ts:#1:#2:#3}%
+ \normalexpanded{\noexpand\dodousetypescript[#1][#2][#3]}}}
+
+% \definetypescriptsynonym[lbr][cmr]
+
+\unexpanded\def\definetypescriptsynonym
+ {\dodoubleempty\dodefinetypescriptsynonym}
+
+\def\dodefinetypescriptsynonym[#1][#2]%
+ {\ifsecondargument\setevalue{\??tm#1}{#2}\fi}
+
+\def\truetypescript#1%
+ {\ifcsname\??tm#1\endcsname
+ \@EA\truetypescript\csname\??tm#1\endcsname\else#1%
+ \fi}
+
+% script [serif] [default] [size]
+% script [serif] [computer-modern] [size]
+% script [serif] [computer-modern] [ec]
+% script [serif] [computer-modern] [name]
+% script [serif] [computer-modern] [special]
+
+% todo, make firsttypescriptpass conditional
+
+\newif\iffirsttypescriptpass \firsttypescriptpasstrue
+
+\prependtoks\firsttypescriptpasstrue\to\everyjob
+
+\def\typescript@@all{all}
+
+\newif\iftracetypescripts
+
+\let\stoptypescript\relax
+
+\unexpanded\def\starttypescript
+ {\ifcase\typescriptstate
+ % 0 = skip
+ \@EA\gobbleuntil\@EA\stoptypescript
+ \or
+ % 1 = process
+ \expandafter\dostarttypescript
+ \or
+ % 2 = store
+ \expandafter\nostarttypescript
+ \else
+ % ? = skip
+ \@EA\gobbleuntil\@EA\stoptypescript
+ \fi}
+
+\long\def\nostarttypescript#1\stoptypescript
+ {\appendtoks\starttypescript#1\stoptypescript\to\documenttypescripts}
+
+\def\dostarttypescript
+ {\let\typescriptone \@@typescriptone
+ \let\typescripttwo \@@typescripttwo
+ \let\typescriptthree\@@typescriptthree
+ \let\typescriptmatch\empty
+ \doifnextoptionalelse\dostarttypescriptone\dostarttypescriptall}
+
+\long\def\dostarttypescriptall
+ {\iffirsttypescriptpass
+ \expandafter\doprocesstypescript
+ \else
+ % skip this since it may do unwanted resets, like
+ % setting symbolic font names to unknown, especially
+ % in run time user type scripts
+ \expandafter\noprocesstypescript
+ \fi}
+
+\def\typescriptwritestatus
+ {\writestatus\m!fonts{match:\ifx\currenttypefile\relax\space *\fi \typescriptmatch}}
+
+\long\def\dostarttypescriptyes
+ {\ifdone
+ \typescriptfoundtrue
+ \iftracetypescripts\typescriptwritestatus\fi
+ \expandafter\doprocesstypescript
+ \else
+ \expandafter\noprocesstypescript
+ \fi}
+
+\long\def\dostarttypescriptone
+ {\dochecktypescript\@@typescriptone\typescriptone\redostarttypescriptone}
+
+\long\def\dostarttypescripttwo
+ {\dochecktypescript\@@typescripttwo\typescripttwo\redostarttypescripttwo}
+
+\long\def\dostarttypescriptthree
+ {\dochecktypescript\@@typescriptthree\typescriptthree\redostarttypescriptthree}
+
+\long\def\redostarttypescriptone
+ {\doifnextoptionalelse\dostarttypescripttwo\dostarttypescriptyes}
+
+\long\def\redostarttypescripttwo
+ {\doifnextoptionalelse\dostarttypescriptthree\dostarttypescriptyes}
+
+\long\def\redostarttypescriptthree
+ {\dostarttypescriptyes}
+
+\def\doprocesstypescript
+ {\pushmacro\fontclass}
+
+\unexpanded\def\stoptypescript
+ {\popmacro\fontclass}
+
+\long\def\noprocesstypescript#1\stoptypescript
+ {}
+
+\let\typescriptmatch\empty
+
+\def\dochecktypescript#1#2#3[#4]% script use value next
+ {\donefalse
+ \def\@@typescriptcheck{#4}%
+ \ifx\@@typescriptcheck\empty % no longer needed / met
+ \ifcase\typescriptmethod\or\donetrue\fi
+ \else\ifx#1\typescript@@all
+ \donetrue
+ \else\ifx\@@typescriptcheck\typescript@@all
+ \donetrue
+ \else\ifx#1\@@typescriptcheck % saves 10% trace so probably faster too
+ \donetrue
+ \let#2\@@typescriptcheck
+ \else
+ \normalexpanded{\noexpand\doifcommonelse{\@@typescriptcheck}{#1}}\donetrue\donefalse
+ \ifdone
+ \let#2\commalistelement
+ \fi
+ \fi\fi\fi\fi
+ \ifdone
+ \edef\typescriptmatch{\typescriptmatch\space[#4]}%
+ \expandafter#3%
+ \else
+ \expandafter\noprocesstypescript
+ \fi}
+
+%D Yet another speed up: when issued inside typescript, the call
+%D
+%D \starttyping
+%D \quittypescriptscanning
+%D \stoptyping
+%D
+%D quits further loading. For an example, see type-exa:
+
+\newconditional\quittingtypescript \setfalse\quittingtypescript
+
+\def\quittypescriptscanning{\settrue\quittingtypescript}
+
+%D Map files will go away in \LUATEX, but till that happens we
+%D use stripped down support for loading them.
+
+\def\loadmapfile{\dosingleempty\doloadmapfile}
+\def\loadmapline{\dodoubleempty\doloadmapline}
+
+\def\doloadmapfile [#1]{\ctxlua{fonts.map.loadfile("#1")}}
+\def\doloadmapline [#1][#2]{\ctxlua{fonts.map.loadline("#1","#2")}}
+\def\forgetmapfiles {\ctxlua{fonts.map.reset()}}
+
+\let\loadallfontmapfiles\relax
+\let\allfontmapsfiles \empty
+\let\preloadmapfile \loadmapfile
+\let\resetmapfiles \forgetmapfiles
+\let\disablemapfiles \forgetmapfiles
+
+\newif\ifautoloadmapfiles
+
+% \appendtoks
+% \pdfmapfile{}% somehow does not work at the lua end
+% \to \everyjob
+
+\prependtoks
+ \loadmapfile[mkiv-base.map]%
+\to \everystarttext
+
+%D A handy shortcut:
+
+% \definetypescriptprefix[serif][Serif]
+% \definetypescriptprefix[sans] [Sans]
+% \definetypescriptprefix[mono] [Mono]
+%
+%\starttypescript [serif,sans,mono] [handling,hanging,hz] [pure,normal,hz,quality]
+% \setupfontsynonym [\typescriptprefix\typescriptone] [handling=\typescriptthree]
+% \stoptypescript
+
+\unexpanded\def\definetypescriptprefix
+ {\dodoubleargument\dodefinetypescriptprefix}
+
+\def\dodefinetypescriptprefix[#1][#2]%
+ {\setgvalue{\??ts::#1}{#2}} % made global
+
+% without testing:
+%
+% \def\typescriptprefix#1%
+% {\csname\??ts::#1\endcsname}
+%
+% with testing:
+
+\def\typescriptprefix#1%
+ {\executeifdefined{\??ts::#1}{#1}}
+
+% defining typefaces:
+%
+% \definetypeface [#1:joke] [#2:rm]
+% \definetypeface [#1:joke] [#2:rm] [#3:...]
+% \definetypeface [#1:joke] [#2:rm] [#3:serif] [#4:lucida] [#5:size] [#6:...]
+
+\unexpanded\def\definetypeface
+ {\dosixtupleargument\dodefinetypeface}
+
+\def\tsvar#1#2% \executeifdefined{\??ts#1}{#2}
+ {\@EA\ifx\csname\??ts#1\endcsname\empty
+ #2%
+ \else
+ \csname\??ts#1\endcsname
+ \fi}
+
+% #1=main #2=rm #3=serif #4=fontname #5=size #6=settings
+
+% we can use \rawgetparameters or \rawgeteparameters
+
+\def\typefaceencoding{\defaultencoding}
+
+% we need to keep typefaceencoding for a while as it can still be used to filter
+% old scripts as we just strip the texnansi- prefix
+
+% \def\dostarttypefacedefining#1#2%
+% {\pushmacro\fontclass
+% \setcurrentfontclass{#1}%
+% \pushmacro\relativefontsize
+% \let\relativefontsize\@@tsrscale % still needed ?
+% \savefontclassparameters{#2}\@@tsrscale\@@tsfeatures\@@tsfallbacks}
+%
+% \def\dostoptypefacedefining
+% {\popmacro\relativefontsize
+% \popmacro\fontclass}
+%
+% \def\dodefinetypeface[#1][#2][#3][#4][#5][#6]%
+% {\dododefinetypeface[#1][#2]%
+% \iffifthargument % sixth is optional, we need to expand since in #6 there can be a \typescripttwo
+% % \normalexpanded{\noexpand\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,#6]}% \geteparameters
+% \geteparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,#6]%
+% \dostarttypefacedefining{#1}{#2}%
+% \pushmacro\typefaceencoding
+% \let\typefaceencoding\@@tsencoding
+% \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi
+% \ifx\typefaceencoding\t!default
+% \usetypescript[#3][#4][\t!name,\t!default]% will be default some day
+% \else
+% \usetypescript[#3][#4][\t!name,\t!default,\typefaceencoding]%
+% \fi
+% \usetypescript[#3][#5][\t!size]%
+% %
+% \dostoptypefacedefining
+% %
+% \popmacro\typefaceencoding
+% \else\iffourthargument
+% \definetypeface[#1][#2][#3][#4][\s!default]%
+% \else\ifthirdargument
+% \getparameters[\??tf#1#2][#3]%
+% \fi\fi\fi}
+
+\def\dostarttypefacedefining#1#2#3%
+ {\geteparameters[\??ts][\s!rscale=\plusone,\s!features=,\s!fallbacks=,#3]%
+ \pushmacro\fontclass
+ \setcurrentfontclass{#1}%
+ \pushmacro\relativefontsize
+ \let\relativefontsize\@@tsrscale % still needed ?
+ \savefontclassparameters{#2}\@@tsrscale\@@tsfeatures\@@tsfallbacks}
+
+\def\dostoptypefacedefining
+ {\popmacro\relativefontsize
+ \popmacro\fontclass}
+
+\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
+ \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi
+ \dostarttypefacedefining{#1}{#2}{#6}%
+ \usetypescript[#3][#4][\t!name,\t!default]%
+ \usetypescript[#3][#5][\t!size]%
+ \dostoptypefacedefining
+ \else\iffourthargument
+ \definetypeface[#1][#2][#3][#4][\s!default]%
+ \else\ifthirdargument
+ \getparameters[\??tf#1#2][#3]%
+ \fi\fi\fi}
+
+\def\dododefinetypeface[#1][#2]% saveguard against redefinition
+ {\doifsomething{#1}
+ {\ifcsname\??tf#1\s!default\endcsname \else
+ \registerfontclass{#1}%
+ \setgvalue{\??tf#1\s!default}{#2}%
+ \fi
+ \ifcsname#1\endcsname \else
+ \setugvalue{#1}{\switchtotypeface[#1][#2]}%
+ \fi}}
+
+\unexpanded\def\setuptypeface% [class] [settings]
+ {\doquadrupleempty\doswitchtotypeface[\setupbodyfont][\fontclass]}
+
+\unexpanded\def\switchtotypeface% [class] [settings]
+ {\doquadrupleempty\doswitchtotypeface[\switchtobodyfont][\globalfontclass]}
+
+\def\doswitchtotypeface[#1][#2][#3][#4]%
+ {%\doifinsetelse{\s!default,\v!reset}{#3}
+ % {\setcurrentfontclass\empty}
+ % {\setcurrentfontclass{#3}}%
+ \setcurrentfontclass{#3}%
+ \let\globalfontclass#2%
+ \iffourthargument
+ #1[#4]%
+ \else\ifx\fontclass\empty
+ #1[\c!rm]%
+ \else\ifcsname\??tf\fontclass\s!default\endcsname
+ #1[\csname\??tf\fontclass\s!default\endcsname]%
+ \else
+ #1[\c!rm]%
+ \fi \fi \fi
+ \ifmmode\mr\else\tf\fi} % needed ?
+
+\def\usetypefile[#1]% recurses on path !
+ {\edef\currenttypefile{\f!typeprefix#1}%
+ \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}}
+
+%D For Taco:
+%D
+%D \starttyping
+%D \inherittypeface[palatino][rm][postscript]
+%D \inherittypeface[palatino][rm][\fontclass]
+%D \inherittypeface[palatino][rm] % == \fontclass
+%D \inherittypeface[palatino] % == [rm,ss,tt,mm]
+%D \stoptyping
+
+\def\inherittypeface
+ {\dotripleempty\doinherittypeface}
+
+\def\doinherittypeface[#1][#2][#3]%
+ {\doifelsenothing{#2}
+ {\doinherittypeface[#1][\c!rm,\c!ss,\c!tt,\c!mm][\fontclass]}
+ {\doifnot{#1}{#3}
+ {\global\let\checkfontclass\docheckfontclass
+ \def\docommand##1{\setevalue{#1-##1}{#3}}%
+ \processcommalist[#2]\docommand}}}
+
+%D This hooks into the font mechanism with:
+
+% \def\checkfontclass#1% called often
+% {\edef\fontclass{\executeifdefined{\fontclass-#1}{\fontclass}}}
+
+% \def\checkfontclass#1% called often
+% {\edef\fontclass{\ifcsname\fontclass-#1\endcsname\csname\fontclass-#1\endcsname\else\fontclass\fi}}
+
+\def\docheckfontclass#1% called often
+ {\ifcsname\fontclass-#1\endcsname
+ \expandafter\let\expandafter\fontclass\csname\fontclass-#1\endcsname
+ \fi}
+
+\let\checkfontclass\gobbleoneargument
+
+\fetchruntimecommand \typetypescript {\f!typeprefix\s!run.mkiv} % will become module
+
+\protect \endinput
+
+% Computer Modern Roman : Donald Knuth
+% Latin Modern: LM Font Revision Team
+
+% LM math vs CM math (analysis by Taco):
+%
+% lmex10.tfm % identical
+% lmmi5.tfm % identical
+% lmmi6.tfm % identical
+% lmmi7.tfm % identical
+% lmmi8.tfm % identical
+% lmmi9.tfm % identical
+% lmmi10.tfm % identical
+% lmmi12.tfm % identical
+% lmmib10.tfm % identical
+% lmsy5.tfm % extra chars: 254,255 (octal)
+% lmsy6.tfm % extra chars: 254,255 (octal)
+% lmsy7.tfm % extra chars: 254,255 (octal)
+% lmsy8.tfm % extra chars: 254,255 (octal)
+% lmsy9.tfm % extra chars: 254,255 (octal)
+% lmsy10.tfm % extra chars: 254,255 (octal)
+% lmbsy10.tfm % extra chars: 254,255 (octal)
+%
+% From the 'AMS' set:
+%
+% lmmib5.tfm % identical
+% lmmib7.tfm % identical
+% lmbsy5.tfm % extra chars: 254,255 (octal)
+% lmbsy7.tfm % extra chars: 254,255 (octal)
+%
+% The two extra characters are:
+%
+% /lessorequalslant
+% /greaterorequalslant
diff --git a/tex/context/base/type-lua.mkiv b/tex/context/base/type-lua.mkiv
new file mode 100644
index 000000000..a6799671e
--- /dev/null
+++ b/tex/context/base/type-lua.mkiv
@@ -0,0 +1,88 @@
+%D \module
+%D [ file=type-lua,
+%D version=2009.11.27,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=\MKIV\ goodies,
+%D author=Hans Hagen \& Wolfgang Schuster,
+%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
+
+\starttypescriptcollection [luatex]
+
+\starttypescript [specserif] [all] [name]
+ \definefontsynonym [Serif] [spec:\cleanfontname\typescripttwo-\s!normal-\s!normal] [\s!features=\s!default]
+ \definefontsynonym [SerifItalic] [spec:\cleanfontname\typescripttwo-\s!normal-\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SerifSlanted] [spec:\cleanfontname\typescripttwo-\s!normal-\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SerifBold] [spec:\cleanfontname\typescripttwo-\s!bold -\s!normal] [\s!features=\s!default]
+ \definefontsynonym [SerifBoldItalic] [spec:\cleanfontname\typescripttwo-\s!bold -\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SerifBoldSlanted] [spec:\cleanfontname\typescripttwo-\s!bold -\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SerifCaps] [spec:\cleanfontname\typescripttwo-\s!normal-\s!normal] [\s!features=\s!smallcaps]
+\stoptypescript
+
+\starttypescript [specsans] [all] [name]
+ \definefontsynonym [Sans] [spec:\cleanfontname\typescripttwo-\s!normal-\s!normal] [\s!features=\s!default]
+ \definefontsynonym [SansItalic] [spec:\cleanfontname\typescripttwo-\s!normal-\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SansSlanted] [spec:\cleanfontname\typescripttwo-\s!normal-\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SansBold] [spec:\cleanfontname\typescripttwo-\s!bold -\s!normal] [\s!features=\s!default]
+ \definefontsynonym [SansBoldItalic] [spec:\cleanfontname\typescripttwo-\s!bold -\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SansBoldSlanted] [spec:\cleanfontname\typescripttwo-\s!bold -\s!italic] [\s!features=\s!default]
+ \definefontsynonym [SansCaps] [spec:\cleanfontname\typescripttwo-\s!normal-\s!normal] [\s!features=\s!smallcaps]
+\stoptypescript
+
+\starttypescript [specmono] [all] [name]
+ \definefontsynonym [Mono] [spec:\cleanfontname\typescripttwo-\s!normal-\s!normal] [\s!features=\s!default]
+ \definefontsynonym [MonoItalic] [spec:\cleanfontname\typescripttwo-\s!normal-\s!italic] [\s!features=\s!default]
+ \definefontsynonym [MonoSlanted] [spec:\cleanfontname\typescripttwo-\s!normal-\s!italic] [\s!features=\s!default]
+ \definefontsynonym [MonoBold] [spec:\cleanfontname\typescripttwo-\s!bold -\s!normal] [\s!features=\s!default]
+ \definefontsynonym [MonoBoldItalic] [spec:\cleanfontname\typescripttwo-\s!bold -\s!italic] [\s!features=\s!default]
+ \definefontsynonym [MonoBoldSlanted] [spec:\cleanfontname\typescripttwo-\s!bold -\s!italic] [\s!features=\s!default]
+ \definefontsynonym [MonoCaps] [spec:\cleanfontname\typescripttwo-\s!normal-\s!normal] [\s!features=\s!smallcaps]
+\stoptypescript
+
+% we could combine these in the normal serif settings
+
+\starttypescript [specserif] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt] [rm]
+ [\s!default]
+\stoptypescript
+
+\starttypescript [specsans] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [ss] [\s!default]
+\stoptypescript
+
+\starttypescript [specmono] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [tt] [\s!default]
+\stoptypescript
+
+\starttypescript [specserif] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [rm] [\s!default]
+\stoptypescript
+
+\starttypescript [specsans] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [ss] [\s!default]
+\stoptypescript
+
+\starttypescript [specmono] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [tt] [\s!default]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\protect \endinput
diff --git a/tex/context/base/type-mac.mkii b/tex/context/base/type-mac.mkii
new file mode 100644
index 000000000..ac57726cb
--- /dev/null
+++ b/tex/context/base/type-mac.mkii
@@ -0,0 +1,593 @@
+%D \module
+%D [ file=type-mac,
+%D version=2009.03.10,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Mac OS X Definitions,
+%D author=Wolfgang Schuster,
+%D date=\currentdate,
+%D copyright=Wolfgang Schuster]
+%C
+%C This module is part of the \CONTEXT\ macro||package. See
+%C mreadme.pdf for details.
+
+\definetypescriptprefix [f:andalemono] [Andale Mono]
+\definetypescriptprefix [f:chalkboard] [Chalkboard]
+\definetypescriptprefix [f:cochin] [Cochin]
+\definetypescriptprefix [f:comicsans] [Comic Sans MS]
+\definetypescriptprefix [f:couriernew] [Courier New]
+\definetypescriptprefix [f:georgia] [Georgia]
+\definetypescriptprefix [f:lucidagrande] [Lucida Grande]
+\definetypescriptprefix [f:monaco] [Monaco]
+\definetypescriptprefix [f:tahoma] [Tahoma]
+\definetypescriptprefix [f:timesnewroman] [Times New Roman]
+\definetypescriptprefix [f:trebuchet] [Trebuchet MS]
+\definetypescriptprefix [f:verdana] [Verdana]
+
+\definetypescriptprefix [n:andalemono] [AndaleMono]
+\definetypescriptprefix [n:chalkboard] [Chalkboard]
+\definetypescriptprefix [n:cochin] [Cochin]
+\definetypescriptprefix [n:comicsans] [ComicSans]
+\definetypescriptprefix [n:couriernew] [CourierNew]
+\definetypescriptprefix [n:georgia] [Georgia]
+\definetypescriptprefix [n:lucidagrande] [LucidaGrande]
+\definetypescriptprefix [n:monaco] [Monaco]
+\definetypescriptprefix [n:tahoma] [Tahoma]
+\definetypescriptprefix [n:timesnewroman] [TimesNewRoman]
+\definetypescriptprefix [n:trebuchet] [Trebuchet]
+\definetypescriptprefix [n:verdana] [Verdana]
+
+\starttypescriptcollection [macosx]
+
+% American Typewriter
+
+\starttypescript [serif] [americantypewriter-light-condensed,americantypewriter-condensed,americantypewriter-light,americantypewriter]
+ \definefontsynonym [AmericanTypewriter-Light] [name:American Typewriter Light] [features=default]
+ \definefontsynonym [AmericanTypewriter-Regular] [name:American Typewriter] [features=default]
+ \definefontsynonym [AmericanTypewriter-Bold] [name:American Typewriter Bold] [features=default]
+ \definefontsynonym [AmericanTypewriter-LightCond] [name:American Typewriter Condensed Light] [features=default]
+ \definefontsynonym [AmericanTypewriter-Condensed] [name:American Typewriter Condensed] [features=default]
+ \definefontsynonym [AmericanTypewriter-BoldCond] [name:American Typewriter Condensed Bold] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter-light-condensed]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-LightCond] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-Condensed] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter-condensed]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-Condensed] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-BoldCond] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter-light]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-Light] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-Regular] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-Bold] [features=default]
+\stoptypescript
+
+\starttypescript [americantypewriter-light-condensed,americantypewriter-condensed,americantypewriter-light,americantypewriter]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Arial / Arial Narrow / Arial Rounded / Arial Unicode
+
+\starttypescript [sans] [arial-narrow,arial-condensed,arial,arial-rounded,arial-unicode]
+ \definefontsynonym [Arial-Condensed] [name:Arial Narrow] [features=default]
+ \definefontsynonym [Arial-ItalicCond] [name:Arial Narrow Italic] [features=default]
+ \definefontsynonym [Arial-BoldCond] [name:Arial Narrow Bold] [features=default]
+ \definefontsynonym [Arial-BoldItalicCond] [name:Arial Narrow Bold Italic] [features=default]
+ \definefontsynonym [Arial-Regular] [name:Arial] [features=default]
+ \definefontsynonym [Arial-Italic] [name:Arial Italic] [features=default]
+ \definefontsynonym [Arial-Bold] [name:Arial Bold] [features=default]
+ \definefontsynonym [Arial-BoldItalic] [name:Arial Bold Italic] [features=default]
+ \definefontsynonym [Arial-Black] [name:Arial Black] [features=default]
+ \definefontsynonym [Arial-Unicode] [name:Arial Unicode MS] [features=default]
+ \definefontsynonym [Arial-Rounded] [name:Arial Rounded MT Bold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial-narrow,arial-condensed]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Condensed] [features=default]
+ \definefontsynonym [SansItalic] [Arial-ItalicCond] [features=default]
+ \definefontsynonym [SansBold] [Arial-BoldCond] [features=default]
+ \definefontsynonym [SansBoldItalic] [Arial-BoldItalicCond] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Regular] [features=default]
+ \definefontsynonym [SansItalic] [Arial-Italic] [features=default]
+ \definefontsynonym [SansBold] [Arial-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [Arial-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial-rounded]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Rounded] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial-unicode]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Unicode] [features=default]
+\stoptypescript
+
+\starttypescript [arial-narrow,arial-condensed,arial,arial-rounded,arial-unicode]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Baskerville
+
+\starttypescript [serif] [baskerville]
+ \definefontsynonym [Baskerville-Regular] [name:Baskerville] [features=default]
+ \definefontsynonym [Baskerville-Italic] [name:Baskerville Italic] [features=default]
+ \definefontsynonym [Baskerville-Medium] [name:Baskerville SemiBold] [features=default]
+ \definefontsynonym [Baskerville-MediumItalic] [name:Baskerville SemiBold Italic] [features=default]
+ \definefontsynonym [Baskerville-Bold] [name:Baskerville Bold] [features=default]
+ \definefontsynonym [Baskerville-BoldItalic] [name:Baskerville Bold Italic] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [baskerville]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [Baskerville-Regular] [features=default]
+ \definefontsynonym [SerifItalic] [Baskerville-Italic] [features=default]
+ \definefontsynonym [SerifBold] [Baskerville-Medium] [features=default]
+ \definefontsynonym [SerifBoldItalic] [Baskerville-MediumItalic] [features=default]
+\stoptypescript
+
+\starttypescript [baskerville]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Big Caslon
+
+\starttypescript [serif] [caslon,bigcaslon]
+ \definefontsynonym [BigCaslon-Medium] [name:Big Caslon Medium] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [caslon,bigcaslon]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [BigCaslon-Medium] [features=default]
+\stoptypescript
+
+\starttypescript [caslon,bigcaslon]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Copperplate
+
+\starttypescript [sans] [copperplate-light,copperplate]
+ \definefontsynonym [Copperplate-Light] [name:Copperplate Light] [features=default]
+ \definefontsynonym [Copperplate-Regular] [name:Copperplate] [features=default]
+ \definefontsynonym [Copperplate-Bold] [name:Copperplate Bold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [copperplate-light]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Copperplate-Light] [features=default]
+ \definefontsynonym [SansBold] [Copperplate-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [copperplate]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Copperplate-Regular] [features=default]
+ \definefontsynonym [SansBold] [Copperplate-Bold] [features=default]
+\stoptypescript
+
+\starttypescript [copperplate-light,copperplate]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Futura
+
+\starttypescript [sans] [futura-condensed,futura]
+ \definefontsynonym [Futura-MediumCond] [name:Futura Condensed Medium] [features=default]
+ \definefontsynonym [Futura-Medium] [name:Futura Medium] [features=default]
+ \definefontsynonym [Futura-MediumItalic] [name:Futura Medium Italic] [features=default]
+ \definefontsynonym [Futura-BoldCond] [name:Futura Condensed ExtraBold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [futura-condensed]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Futura-MediumCond] [features=default]
+ \definefontsynonym [SansBold] [Futura-BoldCond] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [futura]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Futura-Medium] [features=default]
+ \definefontsynonym [SansItalic] [Futura-MediumItalic] [features=default]
+\stoptypescript
+
+\starttypescript [futura-condensed,futura]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Gill Sans
+
+\starttypescript [sans] [gillsans-light,gillsans]
+ \definefontsynonym [GillSans-Light] [name:Gill Sans Light] [features=default]
+ \definefontsynonym [GillSans-LightItalic] [name:Gill Sans Light Italic] [features=default]
+ \definefontsynonym [GillSans-Regular] [name:Gill Sans] [features=default]
+ \definefontsynonym [GillSans-Italic] [name:Gill Sans Italic] [features=default]
+ \definefontsynonym [GillSans-Bold] [name:Gill Sans Bold] [features=default]
+ \definefontsynonym [GillSans-BoldItalic] [name:Gill Sans Bold Italic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [gillsans-light]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [GillSans-Light] [features=default]
+ \definefontsynonym [SansItalic] [GillSans-LightItalic] [features=default]
+ \definefontsynonym [SansBold] [GillSans-Regular] [features=default]
+ \definefontsynonym [SansBoldItalic] [GillSans-Italic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [gillsans]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [GillSans-Regular] [features=default]
+ \definefontsynonym [SansItalic] [GillSans-Italic] [features=default]
+ \definefontsynonym [SansBold] [GillSans-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [GillSans-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [gillsans-light,gillsans]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Helvetica Neuse
+
+\starttypescript [sans] [helvetica-neue-ultralight,helvetica-neue-light,helvetica-neue,helvetica-neue-boldcondensed]
+ \definefontsynonym [HelveticaNeue-UltraLight] [name:Helvetica Neue UltraLight] [features=default]
+ \definefontsynonym [HelveticaNeue-UltraLightItalic] [name:Helvetica Neue UltraLight Italic] [features=default]
+ \definefontsynonym [HelveticaNeue-Light] [name:Helvetica Neue Light] [features=default]
+ \definefontsynonym [HelveticaNeue-LightItalic] [name:Helvetica Neue Light Italic] [features=default]
+ \definefontsynonym [HelveticaNeue-Regular] [name:Helvetica Neue] [features=default]
+ \definefontsynonym [HelveticaNeue-Italic] [name:Helvetica Neue Italic] [features=default]
+ \definefontsynonym [HelveticaNeue-Bold] [name:Helvetica Neue Bold] [features=default]
+ \definefontsynonym [HelveticaNeue-BoldItalic] [name:Helvetica Neue Bold Italic] [features=default]
+ \definefontsynonym [HelveticaNeue-BoldCond] [name:Helvetica Neue Condensed Bold] [features=default]
+ \definefontsynonym [HelveticaNeue-BlackCond] [name:Helvetica Neue Condensed Black] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue-ultralight]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-UltraLight] [features=default]
+ \definefontsynonym [SansItalic] [HelveticaNeue-UltraLightItalic] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-Light] [features=default]
+ \definefontsynonym [SansBoldItalic] [HelveticaNeue-LightItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue-light]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-Light] [features=default]
+ \definefontsynonym [SansItalic] [HelveticaNeue-LightItalic] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-Regular] [features=default]
+ \definefontsynonym [SansBoldItalic] [HelveticaNeue-Italic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-Regular] [features=default]
+ \definefontsynonym [SansItalic] [HelveticaNeue-Italic] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [HelveticaNeue-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue-boldcondensed]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-BoldCond] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-BlackCond] [features=default]
+\stoptypescript
+
+\starttypescript [helvetica-neue-ultralight,helvetica-neue-light,helvetica-neue,helvetica-neue-boldcondensed]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Hiragino Mincho
+
+\starttypescript [serif] [hiragino-mincho]
+ \definefontsynonym [HiraginoMinchoPro-Regular] [name:Hiragino Mincho Pro W3] [features=japanese]
+ \definefontsynonym [HiraginoMinchoPro-Bold] [name:Hiragino Mincho Pro W6] [features=japanese]
+ \definefontsynonym [HiraginoMinchoProN-Regular] [name:Hiragino Mincho ProN W3] [features=japanese]
+ \definefontsynonym [HiraginoMinchoProN-Bold] [name:Hiragino Mincho ProN W6] [features=japanese]
+\stoptypescript
+
+\starttypescript [serif] [hiragino-mincho]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [HiraginoMinchoPro-Regular] [features=japanese]
+ \definefontsynonym [SerifBold] [HiraginoMinchoPro-Bold] [features=japanese]
+\stoptypescript
+
+% \starttypescript [serif] [hiragino-mincho]
+% \setups[font:fallback:serif]
+% \definefontsynonym [Serif] [HiraginoMinchoProN-Regular] [features=japanese]
+% \definefontsynonym [SerifBold] [HiraginoMinchoProN-Bold] [features=japanese]
+% \stoptypescript
+
+\starttypescript [hiragino-mincho]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Hiragino Maru
+
+\starttypescript [sans] [hiragino-maru]
+ \definefontsynonym [HiraginoMaruGothicPro-Regular] [name:Hiragino Maru Gothic Pro W4] [features=japanese]
+ \definefontsynonym [HiraginoMaruGothicProN-Regular] [name:Hiragino Maru Gothic ProN W4] [features=japanese]
+\stoptypescript
+
+\starttypescript [sans] [hiragino-maru]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HiraginoMaruGothicPro-Regular] [features=japanese]
+\stoptypescript
+
+% \starttypescript [sans] [hiragino-maru]
+% \setups[font:fallback:sans]
+% \definefontsynonym [Sans] [HiraginoMaruGothicProN-Regular] [features=japanese]
+% \stoptypescript
+
+\starttypescript [hiragino-maru]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Hiragino Kaku
+
+\starttypescript [sans] [hiragino-kaku]
+ \definefontsynonym [HiraginoKakuGothicPro-Regular] [name:Hiragino Kaku Gothic Pro W3] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicPro-Bold] [name:Hiragino Kaku Gothic Pro W6] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicStd-Black] [name:Hiragino Kaku Gothic Std W8] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicProN-Regular] [name:Hiragino Kaku Gothic Pron W3] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicProN-Bold] [name:Hiragino Kaku Gothic ProN W6] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicStdN-Black] [name:Hiragino Kaku Gothic StdN W8] [features=japanese]
+\stoptypescript
+
+\starttypescript [sans] [hiragino-kaku]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HiraginoKakuGothicPro-Regular] [features=japanese]
+ \definefontsynonym [SansBold] [HiraginoKakuGothicPro-Bold] [features=japanese]
+\stoptypescript
+
+% \starttypescript [sans] [hiragino-kaku]
+% \setups[font:fallback:sans]
+% \definefontsynonym [Sans] [HiraginoKakuGothicProN-Regular] [features=japanese]
+% \definefontsynonym [SansBold] [HiraginoKakuGothicProN-Bold] [features=japanese]
+% \stoptypescript
+
+\starttypescript [hiragino-kaku]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Hoefler Text
+
+\starttypescript [serif] [hoefler]
+ \definefontsynonym [HoeflerText-Regular] [name:Hoefler Text] [features=default]
+ \definefontsynonym [HoeflerText-Italic] [name:Hoefler Text Italic] [features=default]
+ \definefontsynonym [HoeflerText-Black] [name:Hoefler Text Black] [features=default]
+ \definefontsynonym [HoeflerText-BlackItalic] [name:Hoefler Text Black Italic] [features=default]
+ \definefontsynonym [HoeflerText-Ornaments] [name:Hoefler Text Ornaments] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [hoefler]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [HoeflerText-Regular] [features=default]
+ \definefontsynonym [SerifItalic] [HoeflerText-Italic] [features=default]
+ \definefontsynonym [SerifBold] [HoeflerText-Black] [features=default]
+ \definefontsynonym [SerifBoldItalic] [HoeflerText-BlackItalic] [features=default]
+\stoptypescript
+
+\starttypescript [hoefler]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Impact
+
+\starttypescript [sans] [impact]
+ \definefontsynonym [Impact-Regular] [name:Impact] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [impact]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Impact-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [impact]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Andale Mono / Monaco
+
+\starttypescript [mono] [andalemono,monaco]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+\stoptypescript
+
+\starttypescript [mono] [andalemono,monaco]
+ \setups[font:fallback:mono]
+ \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [andalemono,monaco]
+ \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+\stoptypescript
+
+% Optima
+
+\starttypescript [sans] [optima,optima-bold]
+ \definefontsynonym [Optima-Regular] [name:Optima Regular] [features=default]
+ \definefontsynonym [Optima-Italic] [name:Optima Italic] [features=default]
+ \definefontsynonym [Optima-Bold] [name:Optima Bold] [features=default]
+ \definefontsynonym [Optima-BoldItalic] [name:Optima Bold Italic] [features=default]
+ \definefontsynonym [Optima-Black] [name:Optima ExtraBlack] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [optima]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Optima-Regular] [features=default]
+ \definefontsynonym [SansItalic] [Optima-Italic] [features=default]
+ \definefontsynonym [SansBold] [Optima-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [Optima-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [optima-bold]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Optima-Bold] [features=default]
+ \definefontsynonym [SansItalic] [Optima-BoldItalic] [features=default]
+ \definefontsynonym [SansBold] [Optima-Black] [features=default]
+\stoptypescript
+
+\starttypescript [optima,optima-bold]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Papyrus
+
+\starttypescript [sans] [papyrus]
+ \definefontsynonym [Papyrus-Regular] [name:Papyrus] [features=default]
+ \definefontsynonym [Papyrus-Condensed] [name:Papyrus Condensed] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [papyrus]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Papyrus-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [papyrus]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% STFangsong
+
+\starttypescript [serif] [stfangsong]
+ \definefontsynonym [STFangsong-Regular] [name:STFangsong] [features=chinese]
+\stoptypescript
+
+\starttypescript [serif] [stfangsong]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Serif] [STFangsong-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stfangsong]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% STHeiti
+
+\starttypescript [sans] [stheiti]
+ \definefontsynonym [STXihei-Light] [name:STHeiti Light] [features=chinese]
+ \definefontsynonym [STHeiti-Regular] [name:STHeiti Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [sans] [stheiti]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [STXihei-Light] [features=chinese]
+ \definefontsynonym [SansBold] [STKaiti-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stheiti]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% STKaiti
+
+\starttypescript [serif] [stkaiti]
+ \definefontsynonym [STKaiti-Regular] [name:STKaiti] [features=chinese]
+\stoptypescript
+
+\starttypescript [serif] [stkaiti]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Serif] [STKaiti-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stkaiti]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% STSong
+
+\starttypescript [serif] [stsong]
+ \definefontsynonym [STSong-Regular] [name:STSong] [features=chinese]
+\stoptypescript
+
+\starttypescript [serif] [stsong]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Serif] [STSong-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stsong]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Chalkboard / Comic Sans / Tahoma
+
+\starttypescript [sans] [chalkboard,comicsans,lucidagrande,tahoma]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [name:\typescriptprefix{f:\typescripttwo} Bold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [chalkboard,comicsans,lucidagrande,tahoma]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+\stoptypescript
+
+\starttypescript [chalkboard,comicsans,tahoma]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Cochin / Courier New / Georgia / Times New Roman / Trebuchet / Verdana
+
+\starttypescript [serif,sans,mono] [cochin,georgia,timesnewroman,trebuchet,verdana,couriernew]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [name:\typescriptprefix{f:\typescripttwo} Italic] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [name:\typescriptprefix{f:\typescripttwo} Bold] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [name:\typescriptprefix{f:\typescripttwo} Bold Italic] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [cochin,georgia,timesnewroman]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+ \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [cochin,georgia,timesnewroman]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Courier New
+
+% \starttypescript [mono] [couriernew]
+% \setups[font:fallback:mono]
+% \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+% \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+% \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+% \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+% \stoptypescript
+
+% \starttypescript [couriernew]
+% \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+% \stoptypescript
+
+% Trebuchet / Verdana
+
+% \starttypescript [sans] [trebuchet,verdana]
+% \setups[font:fallback:sans]
+% \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+% \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+% \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+% \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+% \stoptypescript
+
+% \starttypescript [trebuchet,verdana]
+% \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+% \stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-mac.mkiv b/tex/context/base/type-mac.mkiv
new file mode 100644
index 000000000..9856439da
--- /dev/null
+++ b/tex/context/base/type-mac.mkiv
@@ -0,0 +1,593 @@
+%D \module
+%D [ file=type-mac,
+%D version=2009.03.10,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Mac OS X Definitions,
+%D author=Wolfgang Schuster,
+%D date=\currentdate,
+%D copyright=Wolfgang Schuster]
+%C
+%C This module is part of the \CONTEXT\ macro||package. See
+%C mreadme.pdf for details.
+
+\definetypescriptprefix [f:andalemono] [andalemono]
+\definetypescriptprefix [f:chalkboard] [chalkboard]
+\definetypescriptprefix [f:cochin] [cochin]
+\definetypescriptprefix [f:comicsans] [comicsansms]
+\definetypescriptprefix [f:couriernew] [couriernew]
+\definetypescriptprefix [f:georgia] [georgia]
+\definetypescriptprefix [f:lucidagrande] [lucidagrande]
+\definetypescriptprefix [f:monaco] [monaco]
+\definetypescriptprefix [f:tahoma] [tahoma]
+\definetypescriptprefix [f:timesnewroman] [timesnewroman]
+\definetypescriptprefix [f:trebuchet] [trebuchetms]
+\definetypescriptprefix [f:verdana] [verdana]
+
+\definetypescriptprefix [n:andalemono] [AndaleMono]
+\definetypescriptprefix [n:chalkboard] [Chalkboard]
+\definetypescriptprefix [n:cochin] [Cochin]
+\definetypescriptprefix [n:comicsans] [ComicSans]
+\definetypescriptprefix [n:couriernew] [CourierNew]
+\definetypescriptprefix [n:georgia] [Georgia]
+\definetypescriptprefix [n:lucidagrande] [LucidaGrande]
+\definetypescriptprefix [n:monaco] [Monaco]
+\definetypescriptprefix [n:tahoma] [Tahoma]
+\definetypescriptprefix [n:timesnewroman] [TimesNewRoman]
+\definetypescriptprefix [n:trebuchet] [Trebuchet]
+\definetypescriptprefix [n:verdana] [Verdana]
+
+\starttypescriptcollection [macosx]
+
+% American Typewriter
+
+\starttypescript [serif] [americantypewriter-light-condensed,americantypewriter-condensed,americantypewriter-light,americantypewriter]
+ \definefontsynonym [AmericanTypewriter-Light] [name:americantypewriterlight] [features=default]
+ \definefontsynonym [AmericanTypewriter-Regular] [name:americantypewriter] [features=default]
+ \definefontsynonym [AmericanTypewriter-Bold] [name:americantypewriterbold] [features=default]
+ \definefontsynonym [AmericanTypewriter-LightCond] [name:americantypewritercondensedlight] [features=default]
+ \definefontsynonym [AmericanTypewriter-Condensed] [name:americantypewritercondensed] [features=default]
+ \definefontsynonym [AmericanTypewriter-BoldCond] [name:americantypewritercondensedbold] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter-light-condensed]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-LightCond] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-Condensed] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter-condensed]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-Condensed] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-BoldCond] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter-light]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-Light] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [americantypewriter]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [AmericanTypewriter-Regular] [features=default]
+ \definefontsynonym [SerifBold] [AmericanTypewriter-Bold] [features=default]
+\stoptypescript
+
+\starttypescript [americantypewriter-light-condensed,americantypewriter-condensed,americantypewriter-light,americantypewriter]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Arial / Arial Narrow / Arial Rounded / Arial Unicode
+
+\starttypescript [sans] [arial-narrow,arial-condensed,arial,arial-rounded,arial-unicode]
+ \definefontsynonym [Arial-Condensed] [name:arialnarrow] [features=default]
+ \definefontsynonym [Arial-ItalicCond] [name:arialnarrowitalic] [features=default]
+ \definefontsynonym [Arial-BoldCond] [name:arialnarrowbold] [features=default]
+ \definefontsynonym [Arial-BoldItalicCond] [name:arialnarrowbolditalic] [features=default]
+ \definefontsynonym [Arial-Regular] [name:arial] [features=default]
+ \definefontsynonym [Arial-Italic] [name:arialitalic] [features=default]
+ \definefontsynonym [Arial-Bold] [name:arialbold] [features=default]
+ \definefontsynonym [Arial-BoldItalic] [name:arialbolditalic] [features=default]
+ \definefontsynonym [Arial-Black] [name:arialblack] [features=default]
+ \definefontsynonym [Arial-Unicode] [name:arialunicodems] [features=default]
+ \definefontsynonym [Arial-Rounded] [name:arialroundedmtbold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial-narrow,arial-condensed]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Condensed] [features=default]
+ \definefontsynonym [SansItalic] [Arial-ItalicCond] [features=default]
+ \definefontsynonym [SansBold] [Arial-BoldCond] [features=default]
+ \definefontsynonym [SansBoldItalic] [Arial-BoldItalicCond] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Regular] [features=default]
+ \definefontsynonym [SansItalic] [Arial-Italic] [features=default]
+ \definefontsynonym [SansBold] [Arial-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [Arial-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial-rounded]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Rounded] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial-unicode]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Arial-Unicode] [features=default]
+\stoptypescript
+
+\starttypescript [arial-narrow,arial-condensed,arial,arial-rounded,arial-unicode]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Baskerville
+
+\starttypescript [serif] [baskerville]
+ \definefontsynonym [Baskerville-Regular] [name:baskerville] [features=default]
+ \definefontsynonym [Baskerville-Italic] [name:baskervilleitalic] [features=default]
+ \definefontsynonym [Baskerville-Medium] [name:baskervillesemibold] [features=default]
+ \definefontsynonym [Baskerville-MediumItalic] [name:baskervillesemibolditalic] [features=default]
+ \definefontsynonym [Baskerville-Bold] [name:baskervillebold] [features=default]
+ \definefontsynonym [Baskerville-BoldItalic] [name:baskervillebolditalic] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [baskerville]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [Baskerville-Regular] [features=default]
+ \definefontsynonym [SerifItalic] [Baskerville-Italic] [features=default]
+ \definefontsynonym [SerifBold] [Baskerville-Medium] [features=default]
+ \definefontsynonym [SerifBoldItalic] [Baskerville-MediumItalic] [features=default]
+\stoptypescript
+
+\starttypescript [baskerville]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Big Caslon
+
+\starttypescript [serif] [caslon,bigcaslon]
+ \definefontsynonym [BigCaslon-Medium] [name:bigcaslonmedium] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [caslon,bigcaslon]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [BigCaslon-Medium] [features=default]
+\stoptypescript
+
+\starttypescript [caslon,bigcaslon]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Copperplate
+
+\starttypescript [sans] [copperplate-light,copperplate]
+ \definefontsynonym [Copperplate-Light] [name:copperplatelight] [features=default]
+ \definefontsynonym [Copperplate-Regular] [name:copperplate] [features=default]
+ \definefontsynonym [Copperplate-Bold] [name:copperplatebold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [copperplate-light]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Copperplate-Light] [features=default]
+ \definefontsynonym [SansBold] [Copperplate-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [copperplate]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Copperplate-Regular] [features=default]
+ \definefontsynonym [SansBold] [Copperplate-Bold] [features=default]
+\stoptypescript
+
+\starttypescript [copperplate-light,copperplate]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Futura
+
+\starttypescript [sans] [futura-condensed,futura]
+ \definefontsynonym [Futura-MediumCond] [name:futuracondensedmedium] [features=default]
+ \definefontsynonym [Futura-Medium] [name:futuramedium] [features=default]
+ \definefontsynonym [Futura-MediumItalic] [name:futuramediumitalic] [features=default]
+ \definefontsynonym [Futura-BoldCond] [name:futuracondensedextrabold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [futura-condensed]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Futura-MediumCond] [features=default]
+ \definefontsynonym [SansBold] [Futura-BoldCond] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [futura]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Futura-Medium] [features=default]
+ \definefontsynonym [SansItalic] [Futura-MediumItalic] [features=default]
+\stoptypescript
+
+\starttypescript [futura-condensed,futura]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Gill Sans
+
+\starttypescript [sans] [gillsans-light,gillsans]
+ \definefontsynonym [GillSans-Light] [name:gillsanslight] [features=default]
+ \definefontsynonym [GillSans-LightItalic] [name:gillsanslightitalic] [features=default]
+ \definefontsynonym [GillSans-Regular] [name:gillsans] [features=default]
+ \definefontsynonym [GillSans-Italic] [name:gillsansitalic] [features=default]
+ \definefontsynonym [GillSans-Bold] [name:gillsansbold] [features=default]
+ \definefontsynonym [GillSans-BoldItalic] [name:gillsansbolditalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [gillsans-light]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [GillSans-Light] [features=default]
+ \definefontsynonym [SansItalic] [GillSans-LightItalic] [features=default]
+ \definefontsynonym [SansBold] [GillSans-Regular] [features=default]
+ \definefontsynonym [SansBoldItalic] [GillSans-Italic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [gillsans]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [GillSans-Regular] [features=default]
+ \definefontsynonym [SansItalic] [GillSans-Italic] [features=default]
+ \definefontsynonym [SansBold] [GillSans-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [GillSans-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [gillsans-light,gillsans]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Helvetica Neuse
+
+\starttypescript [sans] [helvetica-neue-ultralight,helvetica-neue-light,helvetica-neue,helvetica-neue-boldcondensed]
+ \definefontsynonym [HelveticaNeue-UltraLight] [name:helveticaneueultralight] [features=default]
+ \definefontsynonym [HelveticaNeue-UltraLightItalic] [name:helveticaneueultralightitalic] [features=default]
+ \definefontsynonym [HelveticaNeue-Light] [name:helveticaneuelight] [features=default]
+ \definefontsynonym [HelveticaNeue-LightItalic] [name:helveticaneuelightitalic] [features=default]
+ \definefontsynonym [HelveticaNeue-Regular] [name:helveticaneue] [features=default]
+ \definefontsynonym [HelveticaNeue-Italic] [name:helveticaneueitalic] [features=default]
+ \definefontsynonym [HelveticaNeue-Bold] [name:helveticaneuebold] [features=default]
+ \definefontsynonym [HelveticaNeue-BoldItalic] [name:helveticaneuebolditalic] [features=default]
+ \definefontsynonym [HelveticaNeue-BoldCond] [name:helveticaneuecondensedbold] [features=default]
+ \definefontsynonym [HelveticaNeue-BlackCond] [name:helveticaneuecondensedblack] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue-ultralight]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-UltraLight] [features=default]
+ \definefontsynonym [SansItalic] [HelveticaNeue-UltraLightItalic] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-Light] [features=default]
+ \definefontsynonym [SansBoldItalic] [HelveticaNeue-LightItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue-light]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-Light] [features=default]
+ \definefontsynonym [SansItalic] [HelveticaNeue-LightItalic] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-Regular] [features=default]
+ \definefontsynonym [SansBoldItalic] [HelveticaNeue-Italic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-Regular] [features=default]
+ \definefontsynonym [SansItalic] [HelveticaNeue-Italic] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [HelveticaNeue-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [helvetica-neue-boldcondensed]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HelveticaNeue-BoldCond] [features=default]
+ \definefontsynonym [SansBold] [HelveticaNeue-BlackCond] [features=default]
+\stoptypescript
+
+\starttypescript [helvetica-neue-ultralight,helvetica-neue-light,helvetica-neue,helvetica-neue-boldcondensed]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Hiragino Mincho
+
+\starttypescript [serif] [hiragino-mincho]
+ \definefontsynonym [HiraginoMinchoPro-Regular] [name:hiraminprow3] [features=japanese]
+ \definefontsynonym [HiraginoMinchoPro-Bold] [name:hiraminprow6] [features=japanese]
+ \definefontsynonym [HiraginoMinchoProN-Regular] [name:hiraminpronw3] [features=japanese]
+ \definefontsynonym [HiraginoMinchoProN-Bold] [name:hiraminpronw6] [features=japanese]
+\stoptypescript
+
+\starttypescript [serif] [hiragino-mincho]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [HiraginoMinchoPro-Regular] [features=japanese]
+ \definefontsynonym [SerifBold] [HiraginoMinchoPro-Bold] [features=japanese]
+\stoptypescript
+
+% \starttypescript [serif] [hiragino-mincho]
+% \setups[font:fallback:serif]
+% \definefontsynonym [Serif] [HiraginoMinchoProN-Regular] [features=japanese]
+% \definefontsynonym [SerifBold] [HiraginoMinchoProN-Bold] [features=japanese]
+% \stoptypescript
+
+\starttypescript [hiragino-mincho]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Hiragino Maru
+
+\starttypescript [sans] [hiragino-maru]
+ \definefontsynonym [HiraginoMaruGothicPro-Regular] [name:hiramaruprow4] [features=japanese]
+ \definefontsynonym [HiraginoMaruGothicProN-Regular] [name:hiramarupronw4] [features=japanese]
+\stoptypescript
+
+\starttypescript [sans] [hiragino-maru]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HiraginoMaruGothicPro-Regular] [features=japanese]
+\stoptypescript
+
+% \starttypescript [sans] [hiragino-maru]
+% \setups[font:fallback:sans]
+% \definefontsynonym [Sans] [HiraginoMaruGothicProN-Regular] [features=japanese]
+% \stoptypescript
+
+\starttypescript [hiragino-maru]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Hiragino Kaku
+
+\starttypescript [sans] [hiragino-kaku]
+ \definefontsynonym [HiraginoKakuGothicPro-Regular] [name:hirakakuprow3] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicPro-Bold] [name:hirakakuprow6] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicStd-Black] [name:hirakakustdw8] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicProN-Regular] [name:hirakakupronw3] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicProN-Bold] [name:hirakakupronw6] [features=japanese]
+ \definefontsynonym [HiraginoKakuGothicStdN-Black] [name:hirakakustdnw8] [features=japanese]
+\stoptypescript
+
+\starttypescript [sans] [hiragino-kaku]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [HiraginoKakuGothicPro-Regular] [features=japanese]
+ \definefontsynonym [SansBold] [HiraginoKakuGothicPro-Bold] [features=japanese]
+\stoptypescript
+
+% \starttypescript [sans] [hiragino-kaku]
+% \setups[font:fallback:sans]
+% \definefontsynonym [Sans] [HiraginoKakuGothicProN-Regular] [features=japanese]
+% \definefontsynonym [SansBold] [HiraginoKakuGothicProN-Bold] [features=japanese]
+% \stoptypescript
+
+\starttypescript [hiragino-kaku]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Hoefler Text
+
+\starttypescript [serif] [hoefler]
+ \definefontsynonym [HoeflerText-Regular] [name:hoeflertext] [features=default]
+ \definefontsynonym [HoeflerText-Italic] [name:hoeflertextitalic] [features=default]
+ \definefontsynonym [HoeflerText-Black] [name:hoeflertextblack] [features=default]
+ \definefontsynonym [HoeflerText-BlackItalic] [name:hoeflertextblackitalic] [features=default]
+ \definefontsynonym [HoeflerText-Ornaments] [name:hoeflertextornaments] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [hoefler]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [HoeflerText-Regular] [features=default]
+ \definefontsynonym [SerifItalic] [HoeflerText-Italic] [features=default]
+ \definefontsynonym [SerifBold] [HoeflerText-Black] [features=default]
+ \definefontsynonym [SerifBoldItalic] [HoeflerText-BlackItalic] [features=default]
+\stoptypescript
+
+\starttypescript [hoefler]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Impact
+
+\starttypescript [sans] [impact]
+ \definefontsynonym [Impact-Regular] [name:impact] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [impact]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Impact-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [impact]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Andale Mono / Monaco
+
+\starttypescript [mono] [andalemono,monaco]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+\stoptypescript
+
+\starttypescript [mono] [andalemono,monaco]
+ \setups[font:fallback:mono]
+ \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [andalemono,monaco]
+ \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+\stoptypescript
+
+% Optima
+
+\starttypescript [sans] [optima,optima-bold]
+ \definefontsynonym [Optima-Regular] [name:optimaregular] [features=default]
+ \definefontsynonym [Optima-Italic] [name:optimaitalic] [features=default]
+ \definefontsynonym [Optima-Bold] [name:optimabold] [features=default]
+ \definefontsynonym [Optima-BoldItalic] [name:optimabolditalic] [features=default]
+ \definefontsynonym [Optima-Black] [name:optimaextrablack] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [optima]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Optima-Regular] [features=default]
+ \definefontsynonym [SansItalic] [Optima-Italic] [features=default]
+ \definefontsynonym [SansBold] [Optima-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [Optima-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [optima-bold]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Optima-Bold] [features=default]
+ \definefontsynonym [SansItalic] [Optima-BoldItalic] [features=default]
+ \definefontsynonym [SansBold] [Optima-Black] [features=default]
+\stoptypescript
+
+\starttypescript [optima,optima-bold]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Papyrus
+
+\starttypescript [sans] [papyrus]
+ \definefontsynonym [Papyrus-Regular] [name:papyrus] [features=default]
+ \definefontsynonym [Papyrus-Condensed] [name:papyruscondensed] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [papyrus]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Papyrus-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [papyrus]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% STFangsong
+
+\starttypescript [serif] [stfangsong]
+ \definefontsynonym [STFangsong-Regular] [name:stfangsong] [features=chinese]
+\stoptypescript
+
+\starttypescript [serif] [stfangsong]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Serif] [STFangsong-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stfangsong]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% STHeiti
+
+\starttypescript [sans] [stheiti]
+ \definefontsynonym [STXihei-Light] [name:stxihei] [features=chinese]
+ \definefontsynonym [STHeiti-Regular] [name:stheiti] [features=chinese]
+\stoptypescript
+
+\starttypescript [sans] [stheiti]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [STXihei-Light] [features=chinese]
+ \definefontsynonym [SansBold] [STKaiti-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stheiti]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% STKaiti
+
+\starttypescript [serif] [stkaiti]
+ \definefontsynonym [STKaiti-Regular] [name:stkaiti] [features=chinese]
+\stoptypescript
+
+\starttypescript [serif] [stkaiti]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Serif] [STKaiti-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stkaiti]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% STSong
+
+\starttypescript [serif] [stsong]
+ \definefontsynonym [STSong-Regular] [name:stsong] [features=chinese]
+\stoptypescript
+
+\starttypescript [serif] [stsong]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Serif] [STSong-Regular] [features=chinese]
+\stoptypescript
+
+\starttypescript [stsong]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Chalkboard / Comic Sans / Tahoma
+
+\starttypescript [sans] [chalkboard,comicsans,tahoma]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [name:\typescriptprefix{f:\typescripttwo}bold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [chalkboard,comicsans,lucidagrande,tahoma]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+\stoptypescript
+
+\starttypescript [chalkboard,comicsans,tahoma]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+% Cochin / Courier New / Georgia / Times New Roman / Trebuchet / Verdana
+
+\starttypescript [serif,sans,mono] [cochin,georgia,timesnewroman,trebuchet,verdana,couriernew]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [name:\typescriptprefix{f:\typescripttwo}italic] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [name:\typescriptprefix{f:\typescripttwo}bold] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [name:\typescriptprefix{f:\typescripttwo}bolditalic] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [cochin,georgia,timesnewroman]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+ \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [cochin,georgia,timesnewroman]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+% Courier New
+
+% \starttypescript [mono] [couriernew]
+% \setups[font:fallback:mono]
+% \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+% \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+% \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+% \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+% \stoptypescript
+
+% \starttypescript [couriernew]
+% \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+% \stoptypescript
+
+% Trebuchet / Verdana
+
+% \starttypescript [sans] [trebuchet,verdana]
+% \setups[font:fallback:sans]
+% \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+% \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+% \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+% \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+% \stoptypescript
+
+% \starttypescript [trebuchet,verdana]
+% \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+% \stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-msw.mkii b/tex/context/base/type-msw.mkii
new file mode 100644
index 000000000..26ec190cb
--- /dev/null
+++ b/tex/context/base/type-msw.mkii
@@ -0,0 +1 @@
+\input type-win.mkii \endinput % could be a file synonym
diff --git a/tex/context/base/type-msw.mkiv b/tex/context/base/type-msw.mkiv
new file mode 100644
index 000000000..2e741f7a0
--- /dev/null
+++ b/tex/context/base/type-msw.mkiv
@@ -0,0 +1 @@
+\input type-win.mkiv \endinput % could be a file synonym
diff --git a/tex/context/base/type-one.mkii b/tex/context/base/type-one.mkii
new file mode 100644
index 000000000..efe31ed21
--- /dev/null
+++ b/tex/context/base/type-one.mkii
@@ -0,0 +1,2748 @@
+%D \module
+%D [ file=type-one,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Type One Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file merges the traditional enc, syn and map files into one. If
+%D you think that it looks messy you're right. It shows some history of
+%D \TEX\ fonts and the development towards latin modern.
+
+% texfont --ven=public --col=antt --enc=ec --sou=auto
+% texfont --ven=public --col=antp --enc=ec --sou=auto
+% texfont --ven=urw --col=palatino --enc=ec --sou=auto
+% texfont --ven-lucas --col=sun --enc=ec --sou=.
+
+% \usetypescript [all] [modern] [texnansi]
+% \setupbodyfont[reset] \setupbodyfont[cmr]
+% \starttext \showfont[Serif] \stoptext
+
+\starttypescriptcollection[latinmodern]
+
+ \starttypescript [map] [all]
+ \loadmapfile[original-base.map]
+ \loadmapfile[original-ams-base.map]
+ \stoptypescript
+
+ \starttypescript[all][modern,latin-modern][all]
+ % fallbacks, no math in latin modern
+ \definefontsynonym[lmdunh10][cmdunh10]
+ \definefontsynonym[lmff10] [cmff10]
+ \definefontsynonym[lmfi10] [cmfi10]
+ \definefontsynonym[lmfib8] [cmfib8]
+ \definefontsynonym[lmtex10] [cmtex10]
+ \definefontsynonym[lmtex8] [cmtex8]
+ \definefontsynonym[lmtex9] [cmtex9]
+ \loadmapfile[original-public-lm.map]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,latin-modern] [texnansi,ec,qx,t5]
+ \definefontsynonym [LMRoman5-Regular] [\typescriptthree-lmr5] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman6-Regular] [\typescriptthree-lmr6] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman7-Regular] [\typescriptthree-lmr7] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Regular] [\typescriptthree-lmr8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Regular] [\typescriptthree-lmr9] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Regular] [\typescriptthree-lmr10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Regular] [\typescriptthree-lmr12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman17-Regular] [\typescriptthree-lmr17] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman5-Bold] [\typescriptthree-lmbx5] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman6-Bold] [\typescriptthree-lmbx6] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman7-Bold] [\typescriptthree-lmbx7] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Bold] [\typescriptthree-lmbx8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Bold] [\typescriptthree-lmbx9] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Bold] [\typescriptthree-lmbx10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Bold] [\typescriptthree-lmbx12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman7-Italic] [\typescriptthree-lmri7] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Italic] [\typescriptthree-lmri8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Italic] [\typescriptthree-lmri9] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Italic] [\typescriptthree-lmri10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Italic] [\typescriptthree-lmri12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-BoldItalic] [\typescriptthree-lmbxi10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Oblique] [\typescriptthree-lmro8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Oblique] [\typescriptthree-lmro9] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Oblique] [\typescriptthree-lmro10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Oblique] [\typescriptthree-lmro12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman17-Oblique] [\typescriptthree-lmro17] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-BoldOblique] [\typescriptthree-lmbxo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Demi] [\typescriptthree-lmb10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-DemiOblique] [\typescriptthree-lmbo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-CapsRegular] [\typescriptthree-lmcsc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-CapsOblique] [\typescriptthree-lmcsco10] [encoding=\typescriptthree]
+
+ \definefontsynonym [LMRoman10-Dunhill] [\typescriptthree-lmdunh10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-DunhillOblique] [\typescriptthree-lmduno10] [encoding=\typescriptthree]
+ \loadmapfile[lm-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern] [texnansi,ec,qx,t5]
+ \definefontsynonym [LMSans8-Regular] [\typescriptthree-lmss8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans9-Regular] [\typescriptthree-lmss9] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-Regular] [\typescriptthree-lmss10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans12-Regular] [\typescriptthree-lmss12] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans17-Regular] [\typescriptthree-lmss17] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-Bold] [\typescriptthree-lmssbx10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans8-Oblique] [\typescriptthree-lmsso8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans9-Oblique] [\typescriptthree-lmsso9] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-Oblique] [\typescriptthree-lmsso10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans12-Oblique] [\typescriptthree-lmsso12] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans17-Oblique] [\typescriptthree-lmsso17] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-BoldOblique] [\typescriptthree-lmssbo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-DemiCondensed] [\typescriptthree-lmssdc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-DemiCondensedOblique] [\typescriptthree-lmssdo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-Regular] [\typescriptthree-lmssq8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-Bold] [\typescriptthree-lmssqbx8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-Oblique] [\typescriptthree-lmssqo8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-BoldOblique] [\typescriptthree-lmssqbo8] [encoding=\typescriptthree]
+ \loadmapfile[lm-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] [texnansi,ec,qx,t5]
+ \definefontsynonym [LMTypewriter8-Regular] [\typescriptthree-lmtt8] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter9-Regular] [\typescriptthree-lmtt9] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Regular] [\typescriptthree-lmtt10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter12-Regular] [\typescriptthree-lmtt12] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Italic] [\typescriptthree-lmtti10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Oblique] [\typescriptthree-lmtto10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-CapsRegular] [\typescriptthree-lmtcsc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-CapsOblique] [\typescriptthree-lmtcso10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Light] [\typescriptthree-lmtl10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-LightOblique] [\typescriptthree-lmtlo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-LightCondensed] [\typescriptthree-lmtlc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-LightCondensedOblique] [\typescriptthree-lmtlco10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Dark] [\typescriptthree-lmtk10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-DarkOblique] [\typescriptthree-lmtko10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Unslanted] [\typescriptthree-lmu10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-Regular] [\typescriptthree-lmvtt10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-Oblique] [\typescriptthree-lmvtto10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-Light] [\typescriptthree-lmvtl10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-LightOblique] [\typescriptthree-lmvtlo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-Dark] [\typescriptthree-lmvtk10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\typescriptthree-lmvtko10] [encoding=\typescriptthree]
+ \loadmapfile[lm-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern]
+ \definefontsynonym [LMMathRoman5-Regular] [rm-lmr5]
+ \definefontsynonym [LMMathRoman6-Regular] [rm-lmr6]
+ \definefontsynonym [LMMathRoman7-Regular] [rm-lmr7]
+ \definefontsynonym [LMMathRoman8-Regular] [rm-lmr8]
+ \definefontsynonym [LMMathRoman9-Regular] [rm-lmr9]
+ \definefontsynonym [LMMathRoman10-Regular] [rm-lmr10]
+ \definefontsynonym [LMMathRoman12-Regular] [rm-lmr12]
+ \definefontsynonym [LMMathRoman17-Regular] [rm-lmr17]
+ \definefontsynonym [LMMathRoman5-Bold] [rm-lmbx5]
+ \definefontsynonym [LMMathRoman6-Bold] [rm-lmbx6]
+ \definefontsynonym [LMMathRoman7-Bold] [rm-lmbx7]
+ \definefontsynonym [LMMathRoman8-Bold] [rm-lmbx8]
+ \definefontsynonym [LMMathRoman9-Bold] [rm-lmbx9]
+ \definefontsynonym [LMMathRoman10-Bold] [rm-lmbx10]
+ \definefontsynonym [LMMathRoman12-Bold] [rm-lmbx12]
+ \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5]
+ \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7]
+ \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10]
+ \definefontsynonym [LMMathSymbols5-Italic] [lmsy5]
+ \definefontsynonym [LMMathSymbols6-Italic] [lmsy6]
+ \definefontsynonym [LMMathSymbols7-Italic] [lmsy7]
+ \definefontsynonym [LMMathSymbols8-Italic] [lmsy8]
+ \definefontsynonym [LMMathSymbols9-Italic] [lmsy9]
+ \definefontsynonym [LMMathSymbols10-Italic] [lmsy10]
+ \definefontsynonym [LMMathExtension10-Regular] [lmex10]
+ \definefontsynonym [LMMathItalic5-Italic] [lmmi5]
+ \definefontsynonym [LMMathItalic6-Italic] [lmmi6]
+ \definefontsynonym [LMMathItalic7-Italic] [lmmi7]
+ \definefontsynonym [LMMathItalic8-Italic] [lmmi8]
+ \definefontsynonym [LMMathItalic9-Italic] [lmmi9]
+ \definefontsynonym [LMMathItalic10-Italic] [lmmi10]
+ \definefontsynonym [LMMathItalic12-Italic] [lmmi12]
+ \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5]
+ \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7]
+ \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10]
+ \usemathcollection[default]
+ \loadmapfile[lm-math.map]
+ \loadmapfile[lm-rm.map]
+ \stoptypescript
+
+ %D {\em Comments by Victor Figurnov:} the wcmb10, wcmbx10,
+ %D \unknown\ fonts below are taken from the Paradissa
+ %D collection by Basil Malyshev. These fonts don't conform t2a
+ %D encoding but are in MS Windows Cyrillic codepage 1251
+ %D encoding. These fonts contain only 33 russian letters in
+ %D upper and lower case, the number sign, and guillemots. But
+ %D even among these characters only the basic 32 russian
+ %D letters (in upper and lower case) will be typeset correctly
+ %D with this definition. The letters cyrillicYO and
+ %D cyrillicyo, as well as number sign (textnumero) and
+ %D guillemots won't be typeset properly, because these symbols
+ %D have different positions in t2a and MS CP1251 encodings.
+ %D
+ %D I think that the russian lh fonts and|/|or cm-super provide
+ %D better alternatives (type1). Therefore, the names below
+ %D match those of cm-super (\type {0NNN} instead of \type
+ %D {NNN}, i.e.\ four digit numbers).
+
+ \starttypescript [serif] [computer-modern] [cyr]
+ \definefontsynonym [cmb10] [wcmb10] [encoding=t2a]
+ \definefontsynonym [cmbsy10] [wcmbsy10] [encoding=t2a]
+ \definefontsynonym [cmbx10] [wcmbx10] [encoding=t2a]
+ \definefontsynonym [cmbx12] [wcmbx12] [encoding=t2a]
+ \definefontsynonym [cmbx5] [wcmbx5] [encoding=t2a]
+ \definefontsynonym [cmbx6] [wcmbx6] [encoding=t2a]
+ \definefontsynonym [cmbx7] [wcmbx7] [encoding=t2a]
+ \definefontsynonym [cmbx8] [wcmbx8] [encoding=t2a]
+ \definefontsynonym [cmbx9] [wcmbx9] [encoding=t2a]
+ \definefontsynonym [cmbxsl10] [wcmbxsl10] [encoding=t2a]
+ \definefontsynonym [cmbxti10] [wcmbxti10] [encoding=t2a]
+ \definefontsynonym [cmcsc10] [wcmcsc10] [encoding=t2a]
+ %definefontsynonym [cmdunh10] [wcmdunh10] [encoding=t2a]
+ \definefontsynonym [cminch] [wcminch] [encoding=t2a]
+ \definefontsynonym [cmr10] [wcmr10] [encoding=t2a]
+ \definefontsynonym [cmr12] [wcmr12] [encoding=t2a]
+ \definefontsynonym [cmr17] [wcmr17] [encoding=t2a]
+ \definefontsynonym [cmr5] [wcmr5] [encoding=t2a]
+ \definefontsynonym [cmr6] [wcmr6] [encoding=t2a]
+ \definefontsynonym [cmr7] [wcmr7] [encoding=t2a]
+ \definefontsynonym [cmr8] [wcmr8] [encoding=t2a]
+ \definefontsynonym [cmr9] [wcmr9] [encoding=t2a]
+ \definefontsynonym [cmsl10] [wcmsl10] [encoding=t2a]
+ \definefontsynonym [cmsl12] [wcmsl12] [encoding=t2a]
+ \definefontsynonym [cmsl8] [wcmsl8] [encoding=t2a]
+ \definefontsynonym [cmsl9] [wcmsl9] [encoding=t2a]
+ \definefontsynonym [cmti10] [wcmti10] [encoding=t2a]
+ \definefontsynonym [cmti12] [wcmti12] [encoding=t2a]
+ \definefontsynonym [cmti7] [wcmti7] [encoding=t2a]
+ \definefontsynonym [cmti8] [wcmti8] [encoding=t2a]
+ \definefontsynonym [cmti9] [wcmti9] [encoding=t2a]
+ \definefontsynonym [cmu10] [wcmu10] [encoding=t2a]
+ \stoptypescript
+
+ \starttypescript [sans] [computer-modern] [cyr]
+ \definefontsynonym [cmss10] [wcmss10] [encoding=t2a]
+ \definefontsynonym [cmss12] [wcmss12] [encoding=t2a]
+ \definefontsynonym [cmss17] [wcmss17] [encoding=t2a]
+ \definefontsynonym [cmss8] [wcmss8] [encoding=t2a]
+ \definefontsynonym [cmss9] [wcmss9] [encoding=t2a]
+ %definefontsynonym [cmssbi10] [wcmssbi10] [encoding=t2a]
+ \definefontsynonym [cmssbx10] [wcmssbx10] [encoding=t2a]
+ \definefontsynonym [cmssdc10] [wcmssdc10] [encoding=t2a]
+ \definefontsynonym [cmssi10] [wcmssi10] [encoding=t2a]
+ \definefontsynonym [cmssi12] [wcmssi12] [encoding=t2a]
+ \definefontsynonym [cmssi17] [wcmssi17] [encoding=t2a]
+ \definefontsynonym [cmssi8] [wcmssi8] [encoding=t2a]
+ \definefontsynonym [cmssi9] [wcmssi9] [encoding=t2a]
+ \definefontsynonym [cmssq8] [wcmssq8] [encoding=t2a]
+ \definefontsynonym [cmssqi8] [wcmssqi8] [encoding=t2a]
+ \stoptypescript
+
+ \starttypescript [mono] [computer-modern] [cyr]
+ \definefontsynonym [cmitt10] [wcmitt10] [encoding=t2a]
+ \definefontsynonym [cmsltt10] [wcmsltt10] [encoding=t2a]
+ \definefontsynonym [cmtt10] [wcmtt10] [encoding=t2a]
+ \definefontsynonym [cmtt12] [wcmtt12] [encoding=t2a]
+ \definefontsynonym [cmtt8] [wcmtt8] [encoding=t2a]
+ \definefontsynonym [cmtt9] [wcmtt9] [encoding=t2a]
+ %definefontsynonym [cmvtt10] [wcmvtt10] [encoding=t2a]
+ \stoptypescript
+
+ \definetypescriptprefix [c:t2a] [la]
+ \definetypescriptprefix [c:t2b] [lb]
+ \definetypescriptprefix [c:t2c] [lc]
+ \definetypescriptprefix [c:x2] [rx]
+
+ \starttypescript [all] [computer-modern] [t2a,t2b,t2c,x2]
+ \loadmapfile[subset-cmsuper-\typescriptthree.map]
+ \loadmapfile[subset-cmsuper-\typescriptthree.map]
+ \loadmapfile[cm-super-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [cmb10] [\typescriptprefix{c:\typescriptthree}rb1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx10] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx12] [\typescriptprefix{c:\typescriptthree}bx1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx5] [\typescriptprefix{c:\typescriptthree}bx0500] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx6] [\typescriptprefix{c:\typescriptthree}bx0600] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx7] [\typescriptprefix{c:\typescriptthree}bx0700] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx8] [\typescriptprefix{c:\typescriptthree}bx0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx9] [\typescriptprefix{c:\typescriptthree}bx0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmbxsl10] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmbxti10] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmcsc10] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmdunh10] [\typescriptprefix{c:\typescriptthree}dh1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmff10] [\typescriptprefix{c:\typescriptthree}ff1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmfi10] [\typescriptprefix{c:\typescriptthree}fi1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmfib8] [\typescriptprefix{c:\typescriptthree}fb0800] [encoding=\typescriptthree]
+ %\definefontsynonym [cminch] [\typescriptprefix{c:\typescriptthree}inch00] [encoding=\typescriptthree]
+ \definefontsynonym [cmr10] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmr12] [\typescriptprefix{c:\typescriptthree}rm1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmr17] [\typescriptprefix{c:\typescriptthree}rm1700] [encoding=\typescriptthree]
+ \definefontsynonym [cmr5] [\typescriptprefix{c:\typescriptthree}rm0500] [encoding=\typescriptthree]
+ \definefontsynonym [cmr6] [\typescriptprefix{c:\typescriptthree}rm0600] [encoding=\typescriptthree]
+ \definefontsynonym [cmr7] [\typescriptprefix{c:\typescriptthree}rm0700] [encoding=\typescriptthree]
+ \definefontsynonym [cmr8] [\typescriptprefix{c:\typescriptthree}rm0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmr9] [\typescriptprefix{c:\typescriptthree}rm0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl10] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl12] [\typescriptprefix{c:\typescriptthree}sl1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl8] [\typescriptprefix{c:\typescriptthree}sl0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl9] [\typescriptprefix{c:\typescriptthree}sl0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmtcsc10] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmti10] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmti12] [\typescriptprefix{c:\typescriptthree}ti1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmti7] [\typescriptprefix{c:\typescriptthree}ti0700] [encoding=\typescriptthree]
+ \definefontsynonym [cmti8] [\typescriptprefix{c:\typescriptthree}ti0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmti9] [\typescriptprefix{c:\typescriptthree}ti0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmu10] [\typescriptprefix{c:\typescriptthree}ui1000] [encoding=\typescriptthree]
+ \stoptypescript
+
+ \starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [cmss10] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmss12] [\typescriptprefix{c:\typescriptthree}ss1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmss17] [\typescriptprefix{c:\typescriptthree}ss1700] [encoding=\typescriptthree]
+ \definefontsynonym [cmss8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmss9] [\typescriptprefix{c:\typescriptthree}ss0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmssbx10] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree]
+ %\definefontsynonym [cmssdc10] [\typescriptprefix{c:\typescriptthree}ssdc1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi10] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi12] [\typescriptprefix{c:\typescriptthree}si1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi17] [\typescriptprefix{c:\typescriptthree}si1700] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi9] [\typescriptprefix{c:\typescriptthree}si0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmssq8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmssqi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree]
+ \stoptypescript
+
+ \starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [cmitt10] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmsltt10] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt10] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt12] [\typescriptprefix{c:\typescriptthree}tt1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt8] [\typescriptprefix{c:\typescriptthree}tt0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt9] [\typescriptprefix{c:\typescriptthree}tt0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmvtt10] [\typescriptprefix{c:\typescriptthree}vt1000] [encoding=\typescriptthree]
+ \stoptypescript
+
+ \starttypescript [serif] [computer-modern] [lcy]
+ \definefontsynonym [cmb10] [lhb10] [encoding=lcy]
+ \definefontsynonym [cmbx10] [lhbx10] [encoding=lcy]
+ \definefontsynonym [cmbx12] [lhbx12] [encoding=lcy]
+ \definefontsynonym [cmbx5] [lhbx5] [encoding=lcy]
+ \definefontsynonym [cmbx6] [lhbx6] [encoding=lcy]
+ \definefontsynonym [cmbx7] [lhbx7] [encoding=lcy]
+ \definefontsynonym [cmbx8] [lhbx8] [encoding=lcy]
+ \definefontsynonym [cmbx9] [lhbx9] [encoding=lcy]
+ \definefontsynonym [cmbxsl10] [lhbxsl10] [encoding=lcy]
+ \definefontsynonym [cmbxti10] [lhbxti10] [encoding=lcy]
+ \definefontsynonym [cmcsc10] [lhcsc10] [encoding=lcy]
+ \definefontsynonym [cmdunh10] [lhdunh10] [encoding=lcy]
+ \definefontsynonym [cmff10] [lhff10] [encoding=lcy]
+ \definefontsynonym [cmfi10] [lhfi10] [encoding=lcy]
+ \definefontsynonym [cmfib8] [lhfib8] [encoding=lcy]
+ \definefontsynonym [cminch] [lhinch] [encoding=lcy]
+ \definefontsynonym [cmr10] [lhr10] [encoding=lcy]
+ \definefontsynonym [cmr12] [lhr12] [encoding=lcy]
+ \definefontsynonym [cmr17] [lhr17] [encoding=lcy]
+ \definefontsynonym [cmr5] [lhr5] [encoding=lcy]
+ \definefontsynonym [cmr6] [lhr6] [encoding=lcy]
+ \definefontsynonym [cmr7] [lhr7] [encoding=lcy]
+ \definefontsynonym [cmr8] [lhr8] [encoding=lcy]
+ \definefontsynonym [cmr9] [lhr9] [encoding=lcy]
+ \definefontsynonym [cmsl10] [lhsl10] [encoding=lcy]
+ \definefontsynonym [cmsl12] [lhsl12] [encoding=lcy]
+ \definefontsynonym [cmsl8] [lhsl8] [encoding=lcy]
+ \definefontsynonym [cmsl9] [lhsl9] [encoding=lcy]
+ \definefontsynonym [cmtcsc10] [lhtcsc10] [encoding=lcy]
+ \definefontsynonym [cmtex10] [lhtex10] [encoding=lcy]
+ \definefontsynonym [cmtex8] [lhtex8] [encoding=lcy]
+ \definefontsynonym [cmtex9] [lhtex9] [encoding=lcy]
+ \definefontsynonym [cmti10] [lhti10] [encoding=lcy]
+ \definefontsynonym [cmti12] [lhti12] [encoding=lcy]
+ \definefontsynonym [cmti7] [lhti7] [encoding=lcy]
+ \definefontsynonym [cmti8] [lhti8] [encoding=lcy]
+ \definefontsynonym [cmti9] [lhti9] [encoding=lcy]
+ \definefontsynonym [cmu10] [lhu10] [encoding=lcy]
+ \stoptypescript
+
+ \starttypescript [sans] [computer-modern] [lcy]
+ \definefontsynonym [cmss10] [lhss10] [encoding=lcy]
+ \definefontsynonym [cmss12] [lhss12] [encoding=lcy]
+ \definefontsynonym [cmss17] [lhss17] [encoding=lcy]
+ \definefontsynonym [cmss8] [lhss8] [encoding=lcy]
+ \definefontsynonym [cmss9] [lhss9] [encoding=lcy]
+ \definefontsynonym [cmssbi10] [lhssbi10] [encoding=lcy]
+ \definefontsynonym [cmssbx10] [lhssbx10] [encoding=lcy]
+ \definefontsynonym [cmssdc10] [lhssdc10] [encoding=lcy]
+ \definefontsynonym [cmssi10] [lhssi10] [encoding=lcy]
+ \definefontsynonym [cmssi12] [lhssi12] [encoding=lcy]
+ \definefontsynonym [cmssi17] [lhssi17] [encoding=lcy]
+ \definefontsynonym [cmssi8] [lhssi8] [encoding=lcy]
+ \definefontsynonym [cmssi9] [lhssi9] [encoding=lcy]
+ \definefontsynonym [cmssq8] [lhssq8] [encoding=lcy]
+ \definefontsynonym [cmssqi8] [lhssqi8] [encoding=lcy]
+ \stoptypescript
+
+ \starttypescript [mono] [computer-modern] [lcy]
+ \definefontsynonym [cmitt10] [lhitt10] [encoding=lcy]
+ \definefontsynonym [cmsltt10] [lhsltt10] [encoding=lcy]
+ \definefontsynonym [cmtt10] [lhtt10] [encoding=lcy]
+ \definefontsynonym [cmtt12] [lhtt12] [encoding=lcy]
+ \definefontsynonym [cmtt8] [lhtt8] [encoding=lcy]
+ \definefontsynonym [cmtt9] [lhtt9] [encoding=lcy]
+ \definefontsynonym [cmvtt10] [lhvtt10] [encoding=lcy]
+ \stoptypescript
+
+ %
+
+ \starttypescript [math] [modern,computer-modern,latin-modern] % [default]
+ % watch the space, it prevents remapping
+ \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10]% [lmr10 ]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic] [lmmi10]
+ \definefontsynonym [ComputerModernMath-Symbol] [lmsy10]
+ \stoptypescript
+
+ \starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] % [default]
+ % watch the space, it prevents remapping
+ \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10] % [lmb10 ]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10]
+ \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10]
+ \stoptypescript
+
+ % Till we have cyrilic in lm:
+
+ % \usetypescript[modern-base][t2a]
+ % \setupbodyfont[modern,10pt]
+
+ \starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [Serif] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree]
+ \definefontsynonym [SerifSlanted] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree]
+ \definefontsynonym [SerifBold] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree]
+ \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree]
+ \definefontsynonym [SerifCaps] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree]
+ \definefontsynonym [SerifCapsSlanted] [\typescriptprefix{c:\typescriptthree}sc1000] [encoding=\typescriptthree]
+ \stoptypescript
+
+ \starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [Sans] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree]
+ \definefontsynonym [SansItalic] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree]
+ \definefontsynonym [SansSlanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree]
+ \definefontsynonym [SansBold] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree]
+ \definefontsynonym [SansBoldItalic] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree]
+ \definefontsynonym [SansBoldSlanted] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree]
+ \definefontsynonym [SansCaps] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree]
+ \definefontsynonym [SansCapsSlanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree]
+ \stoptypescript
+
+ \starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [Mono] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree]
+ \definefontsynonym [MonoItalic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree]
+ \definefontsynonym [MonoSlanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree]
+ \definefontsynonym [MonoBold] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree]
+ \definefontsynonym [MonoBoldItalic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree]
+ \definefontsynonym [MonoBoldSlanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree]
+ \definefontsynonym [MonoCaps] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree]
+ \definefontsynonym [MonoCapsSlanted] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree]
+ \stoptypescript
+
+ % Computer Concrete (AMS)
+
+ \starttypescript [serif] [concrete] [default]
+ \definefontsynonym [ComputerConcrete] [ccr10]
+ \definefontsynonym [ComputerConcrete-Italic] [ccti10]
+ \definefontsynonym [ComputerConcrete-Slanted] [ccsl10]
+ \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete]
+ \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [ComputerConcrete-Caps] [cccsc10]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Serif] [LMRoman-Regular]
+ \definefontsynonym [SerifBold] [LMRoman-Bold]
+ \definefontsynonym [SerifItalic] [LMRoman-Italic]
+ \definefontsynonym [SerifSlanted] [LMRoman-Oblique]
+ \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [SerifCaps] [LMRoman-CapsRegular]
+ \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Sans] [LMSans-Regular]
+ \definefontsynonym [SansBold] [LMSans-Bold]
+ \definefontsynonym [SansItalic] [LMSans-Oblique]
+ \definefontsynonym [SansSlanted] [LMSans-Oblique]
+ \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [SansCaps] [LMSans-Regular]
+ \definefontsynonym [SansCapsSlanted] [LMSans-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Regular]
+ \definefontsynonym [MonoBold] [LMTypewriter-Dark]
+ \definefontsynonym [MonoItalic] [LMTypewriter-Italic]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRoman] [LMMathRoman-Regular]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalic] [LMMathItalic-Italic]
+ \definefontsynonym [MathSymbol] [LMMathSymbols-Italic]
+ \stoptypescript
+
+ \starttypescript [boldmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRoman] [LMMathRoman-Bold]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalic] [LMMathItalic-BoldItalic]
+ \definefontsynonym [MathSymbol] [LMMathSymbols-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [bfmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRomanBold] [LMMathRoman-Bold]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalicBold] [LMMathItalic-BoldItalic]
+ \definefontsynonym [MathSymbolBold] [LMMathSymbols-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [math,boldmath,bfmath] [modern,computer-modern,latin-modern] [name]
+ \usemathcollection[default]
+ \stoptypescript
+
+ \starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name]
+ \definefontsynonym [Serif] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name]
+ \definefontsynonym [Mono] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed]
+ \stoptypescript
+
+ \starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Light]
+ \definefontsynonym [MonoBold] [LMTypewriter-Light]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light]
+ \definefontsynonym [MonoCaps] [LMTypewriter-Light]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light]
+ \stoptypescript
+
+ % Later we will map the real fonts, here we just map synonyms.
+
+ \starttypescript [serif] [modern,latin-modern]
+ \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique]
+ \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold]
+ \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic]
+ \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique]
+ \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular]
+ \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique]
+ \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular]
+ \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic]
+ \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern]
+ \definefontsynonym [LMSans-Regular] [LMSans10-Regular]
+ \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique]
+ \definefontsynonym [LMSans-Bold] [LMSans10-Bold]
+ \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed]
+ \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique]
+ \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond]
+ \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular]
+ \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique]
+ \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light]
+ \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique]
+ \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed]
+ \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique]
+ \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark]
+ \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique]
+ \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular]
+ \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic]
+ \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular]
+ \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light]
+ \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique]
+ \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark]
+ \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModern] [LMRoman-Regular]
+ \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic]
+ \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique]
+ \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold]
+ \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular]
+ \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernSans] [LMSans-Regular]
+ \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold]
+ \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular]
+ \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular]
+ \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic]
+ \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique]
+ \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark]
+ \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % !
+ \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular]
+ \stoptypescript
+
+ \starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari]
+ \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern]
+ \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ \definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic]
+ \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ \definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic]
+ \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \stoptypescript
+
+ % can boldmath and bfmath be joined?
+ \starttypescript [boldmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [bfmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmr5] [LMRoman5-Regular]
+ \definefontsynonym [cmr6] [LMRoman6-Regular]
+ \definefontsynonym [cmr7] [LMRoman7-Regular]
+ \definefontsynonym [cmr8] [LMRoman8-Regular]
+ \definefontsynonym [cmr9] [LMRoman9-Regular]
+ \definefontsynonym [cmr10] [LMRoman10-Regular]
+ \definefontsynonym [cmr12] [LMRoman12-Regular]
+ \definefontsynonym [cmr17] [LMRoman17-Regular]
+ \definefontsynonym [cmbx5] [LMRoman5-Bold]
+ \definefontsynonym [cmbx6] [LMRoman6-Bold]
+ \definefontsynonym [cmbx7] [LMRoman7-Bold]
+ \definefontsynonym [cmbx8] [LMRoman8-Bold]
+ \definefontsynonym [cmbx9] [LMRoman9-Bold]
+ \definefontsynonym [cmbx10] [LMRoman10-Bold]
+ \definefontsynonym [cmbx12] [LMRoman12-Bold]
+ \definefontsynonym [cmsl10] [LMRoman10-Oblique]
+ \definefontsynonym [cmsl12] [LMRoman12-Oblique]
+ \definefontsynonym [cmsl17] [LMRoman17-Oblique]
+ \definefontsynonym [cmsl8] [LMRoman8-Oblique]
+ \definefontsynonym [cmsl9] [LMRoman9-Oblique]
+ \definefontsynonym [cmti7] [LMRoman7-Italic]
+ \definefontsynonym [cmti8] [LMRoman8-Italic]
+ \definefontsynonym [cmti9] [LMRoman9-Italic]
+ \definefontsynonym [cmti10] [LMRoman10-Italic]
+ \definefontsynonym [cmti12] [LMRoman12-Italic]
+ \definefontsynonym [cmbsl10] [LMRoman10-DemiOblique]
+ \definefontsynonym [cmbxsl10] [LMRoman10-BoldOblique]
+ \definefontsynonym [cmbxti10] [LMRoman10-BoldItalic]
+ \definefontsynonym [cmcsc10] [LMRoman10-CapsRegular]
+ \definefontsynonym [cmcscsl10][LMRoman10-CapsOblique]
+
+ %definefontsynonym [cmb10]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmss8] [LMSans8-Regular]
+ \definefontsynonym [cmss9] [LMSans9-Regular]
+ \definefontsynonym [cmss10] [LMSans10-Regular]
+ \definefontsynonym [cmss12] [LMSans12-Regular]
+ \definefontsynonym [cmss17] [LMSans17-Regular]
+ \definefontsynonym [cmssi10] [LMSans10-Oblique]
+ \definefontsynonym [cmssi12] [LMSans12-Oblique]
+ \definefontsynonym [cmssi17] [LMSans17-Oblique]
+ \definefontsynonym [cmssi8] [LMSans8-Oblique]
+ \definefontsynonym [cmssi9] [LMSans9-Oblique]
+ \definefontsynonym [cmssq8] [LMSansQuotation8-Regular]
+ \definefontsynonym [cmssqb8] [LMSansQuotation8-Bold]
+ \definefontsynonym [cmssqbi8] [LMSansQuotation8-BoldOblique]
+ \definefontsynonym [cmssqi8] [LMSansQuotation8-Oblique]
+ \definefontsynonym [cmssbx10] [LMSans10-Bold]
+ \definefontsynonym [cmssdc10] [LMSans10-DemiCondensed]
+ \definefontsynonym [cmssbi10] [LMSans10-BoldOblique]
+ \definefontsynonym [cmssdi10] [LMSans10-DemiCondensedOblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmtt8] [LMTypewriter8-Regular]
+ \definefontsynonym [cmtt9] [LMTypewriter9-Regular]
+ \definefontsynonym [cmtt10] [LMTypewriter10-Regular]
+ \definefontsynonym [cmtt12] [LMTypewriter12-Regular]
+ \definefontsynonym [cmitt10] [LMTypewriter10-Italic]
+ \definefontsynonym [cmsltt10] [LMTypewriter10-Oblique]
+ \definefontsynonym [cmvtt10] [LMTypewriterVarWd10-Regular]
+ \definefontsynonym [cmvtti10] [LMTypewriterVarWd10-Oblique]
+ \definefontsynonym [cmtcsc10] [LMTypewriter10-CapsRegular]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmbsy5] [LMMathSymbols5-BoldItalic]
+ \definefontsynonym [cmbsy7] [LMMathSymbols7-BoldItalic]
+ \definefontsynonym [cmbsy10] [LMMathSymbols10-BoldItalic]
+ \definefontsynonym [cmsy5] [LMMathSymbols5-Italic]
+ \definefontsynonym [cmsy6] [LMMathSymbols6-Italic]
+ \definefontsynonym [cmsy7] [LMMathSymbols7-Italic]
+ \definefontsynonym [cmsy8] [LMMathSymbols8-Italic]
+ \definefontsynonym [cmsy9] [LMMathSymbols9-Italic]
+ \definefontsynonym [cmsy10] [LMMathSymbols10-Italic]
+ \definefontsynonym [cmex10] [LMMathExtension10-Regular]
+ \definefontsynonym [cmmi5] [LMMathItalic5-Italic]
+ \definefontsynonym [cmmi6] [LMMathItalic6-Italic]
+ \definefontsynonym [cmmi7] [LMMathItalic7-Italic]
+ \definefontsynonym [cmmi8] [LMMathItalic8-Italic]
+ \definefontsynonym [cmmi9] [LMMathItalic9-Italic]
+ \definefontsynonym [cmmi10] [LMMathItalic10-Italic]
+ \definefontsynonym [cmmi12] [LMMathItalic12-Italic]
+ \definefontsynonym [cmmib5] [LMMathItalic5-BoldItalic]
+ \definefontsynonym [cmmib7] [LMMathItalic7-BoldItalic]
+ \definefontsynonym [cmmib10] [LMMathItalic10-BoldItalic]
+ \stoptypescript
+
+ % This will change some day.
+
+ \starttypescript [math] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [msbm10]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [cmsy10]
+ \stoptypescript
+
+ \starttypescript [fallback] [texnansi,ec,qx,t5,default]
+ \definetypeface [] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modern] [texnansi,ec,qx,t5,default]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [modern] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modern-base] [texnansi,ec,qx,t5,default]
+ \definetypeface [modern] [rm] [serif] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [mm] [math] [modern] [default] [encoding=\typescripttwo]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modern-base] [t2a,t2b,t2c,x2]
+ \definetypeface [modern] [rm] [serif] [computer-modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [ss] [sans] [computer-modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [tt] [mono] [computer-modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [mm] [math] [computer-modern] [default] [encoding=\typescripttwo]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modernvariable] [texnansi,ec,qx,8r,t5]
+ \definetypeface [modernvariable] [rm] [serif] [simple] [default] [encoding=\typescripttwo]
+ \definetypeface [modernvariable] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modernvariable] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modernvariable] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it
+ \definefontsynonym [Simple] [cmvtt10]
+ \setupfontsynonym [Simple] [handling=pure]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[concrete]
+
+ \starttypescript [serif] [concrete] [name]
+ \definefontsynonym [Serif] [ComputerConcrete]
+ \definefontsynonym [SerifBold] [ComputerConcrete]
+ \definefontsynonym [SerifItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [SerifSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [SerifBoldItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [SerifBoldSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [SerifCaps] [ComputerConcrete-Caps]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[euler]
+
+ \starttypescript [math] [euler] [default]
+ \definefontsynonym [Euler-Roman] [zeurm10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol] [zeusm10]
+ \definefontsynonym [Euler-Fraktur] [eufm10]
+ \usemathcollection[eul]
+ \loadmapfile[original-ams-euler.map]
+ \stoptypescript
+
+ \starttypescript [boldmath,bfmath] [euler] [default]
+ \definefontsynonym [Euler-Roman-Bold] [zeurb10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol-Bold] [zeusb10]
+ \definefontsynonym [Euler-Fraktur-Bold] [eufb10]
+ \usemathcollection[eul]
+ \loadmapfile[original-ams-euler.map]
+ \stoptypescript
+
+ \starttypescript [math] [euler] [name]
+ \definefontsynonym [MathRoman] [Euler-Roman] % mr
+ \definefontsynonym [MathItalic] [Euler-Fraktur] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbol] [Euler-Symbol] % sy
+ \stoptypescript
+
+ \starttypescript [boldmath] [euler] [name]
+ \definefontsynonym [MathRoman] [Euler-Roman-Bold] % mr
+ \definefontsynonym [MathItalic] [Euler-Fraktur-Bold] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbol] [Euler-Symbol-Bold] % sy
+ \stoptypescript
+
+ \starttypescript [bfmath] [euler] [name]
+ \definefontsynonym [MathRomanBold] [Euler-Roman-Bold] % mr
+ \definefontsynonym [MathItalicBold] [Euler-Fraktur-Bold] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbolBold] [Euler-Symbol-Bold] % sy
+ \stoptypescript
+
+ \starttypescript [math] [euler] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [MathItalic]
+ \definefontsynonym [Gothic] [MathItalic]
+ \definefontsynonym [Calligraphic] [MathSymbol]
+ \stoptypescript
+
+ \starttypescript [boldmath] [euler] [name]
+ \definefontsynonym [OldStyle] [MathItalicBold]
+ \definefontsynonym [Fraktur] [MathItalicBold]
+ \definefontsynonym [Gothic] [MathItalicBold]
+ \definefontsynonym [Calligraphic] [MathSymbolBold]
+ \stoptypescript
+
+ \starttypescript [math,boldmath,bfmath] [euler] [name]
+ \usemathcollection[eul]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[amssymbols]
+
+ \starttypescript [math] [modern,computer-modern,latin-modern,ams] [default]
+ \definefontsynonym [AMS-SymbolA] [msam10]
+ \definefontsynonym [AMS-SymbolB] [msbm10]
+ \usemathcollection[default]
+ \stoptypescript
+
+ \starttypescript [math] [modern,computer-modern,latin-modern,ams] [name]
+ \definefontsynonym [MathAlpha] [AMS-SymbolA]
+ \definefontsynonym [MathBeta] [AMS-SymbolB]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[utopia]
+
+ \starttypescript [math] [fourier] [default,ec]
+ \definefontsynonym [Fourier-Math-Letters] [futr8t] [encoding=ec]
+ %definefontsynonym [Fourier-Math-Letters] [futmi]
+ \definefontsynonym [Fourier-Math-Letters-Italic] [futmii]
+ \definefontsynonym [Fourier-Math-Symbols] [futsy]
+ \definefontsynonym [Fourier-Math-Extension] [fourier-mex]
+ \usemathcollection[fou]
+ \loadmapfile[fourier.map]
+ \stoptypescript
+
+ \starttypescript [serif] [utopia] [name]
+ \definefontsynonym [Serif] [Utopia-Regular]
+ \definefontsynonym [SerifItalic] [Utopia-Italic]
+ \definefontsynonym [SerifBold] [Utopia-Bold]
+ \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic]
+ \definefontsynonym [SerifSlanted] [Utopia-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Utopia-Regular-Caps]
+ \stoptypescript
+
+ \starttypescript [serif] [fourier] [ec]
+ \definefontsynonym [Fourier-Regular] [futr8t] [encoding=ec]
+ \definefontsynonym [Fourier-Slanted] [futro8t] [encoding=ec]
+ \definefontsynonym [Fourier-Italic] [futri8t] [encoding=ec]
+ \definefontsynonym [Fourier-RegularCaps] [futrc8t] [encoding=ec]
+ \definefontsynonym [Fourier-Bold] [futb8t] [encoding=ec]
+ \definefontsynonym [Fourier-BoldSlanted] [futbo8t] [encoding=ec]
+ \definefontsynonym [Fourier-BoldItalic] [futbi8t] [encoding=ec]
+ \definefontsynonym [Fourier-BoldCaps] [futbc8t] [encoding=ec]
+ \definefontsynonym [Fourier-Regular-Expert] [futr9e] [encoding=ec]
+ \definefontsynonym [Fourier-Slanted-Expert] [futro9e] [encoding=ec]
+ \definefontsynonym [Fourier-Italic-Expert] [futri9e] [encoding=ec]
+ \definefontsynonym [Fourier-RegularCaps-Expert] [futrc9e] [encoding=ec]
+ \definefontsynonym [Fourier-Semi-Expert] [futs9e] [encoding=ec]
+ \definefontsynonym [Fourier-SemiSlanted-Expert] [futso9e] [encoding=ec]
+ \definefontsynonym [Fourier-SemiItalic-Expert] [futsi9e] [encoding=ec]
+ \definefontsynonym [Fourier-SemiCaps-Expert] [futsc9e] [encoding=ec]
+ \definefontsynonym [Fourier-Bold-Expert] [futb9e] [encoding=ec]
+ \definefontsynonym [Fourier-BoldSlanted-Expert] [futbo9e] [encoding=ec]
+ \definefontsynonym [Fourier-BoldItalic-Expert] [futbi9e] [encoding=ec]
+ \definefontsynonym [Fourier-Black-Expert] [futc9e] [encoding=ec]
+ \definefontsynonym [Fourier-Regular-OldStyle] [futr9d] [encoding=ec]
+ \definefontsynonym [Fourier-Slanted-OldStyle] [futro9d] [encoding=ec]
+ \definefontsynonym [Fourier-Italic-OldStyle] [futri9d] [encoding=ec]
+ \definefontsynonym [Fourier-RegularCaps-OldStyle] [futrc9d] [encoding=ec]
+ \definefontsynonym [Fourier-Semi-OldStyle] [futs9d] [encoding=ec]
+ \definefontsynonym [Fourier-SemiSlanted-OldStyle] [futso9d] [encoding=ec]
+ \definefontsynonym [Fourier-SemiItalic-OldStyle] [futsi9d] [encoding=ec]
+ \definefontsynonym [Fourier-SemiCaps-OldStyle] [futsc9d] [encoding=ec]
+ \definefontsynonym [Fourier-Bold-OldStyle] [futb9d] [encoding=ec]
+ \definefontsynonym [Fourier-BoldSlanted-OldStyle] [futbo9d] [encoding=ec]
+ \definefontsynonym [Fourier-BoldItalic-OldStyle] [futbi9d] [encoding=ec]
+ \definefontsynonym [Fourier-Black-OldStyle] [futc9d] [encoding=ec]
+ \loadmapfile[fourier.map]
+ \loadmapfile[fourier-utopia-expert.map]
+ \stoptypescript
+
+ \starttypescript [serif] [fourier] [name]
+ \definefontsynonym [Serif] [Fourier-Regular]
+ \definefontsynonym [SerifSlanted] [Fourier-Slanted]
+ \definefontsynonym [SerifItalic] [Fourier-Italic]
+ \definefontsynonym [SerifCaps] [Fourier-RegularCaps]
+ \definefontsynonym [SerifBold] [Fourier-Bold]
+ \definefontsynonym [SerifBoldSlanted] [Fourier-BoldSlanted]
+ \definefontsynonym [SerifBoldItalic] [Fourier-BoldItalic]
+ \definefontsynonym [SerifBoldCaps] [Fourier-BoldCaps]
+
+ \definefontsynonym [Serif-Expert] [Fourier-Regular-Expert]
+ \definefontsynonym [SerifSlanted-Expert] [Fourier-Slanted-Expert]
+ \definefontsynonym [SerifItalic-Expert] [Fourier-Italic-Expert]
+ \definefontsynonym [SerifCaps-Expert] [Fourier-RegularCaps-Expert]
+ \definefontsynonym [SerifSemiBold-Expert] [Fourier-Semi-Expert]
+ \definefontsynonym [SerifSemiSlanted-Expert] [Fourier-SemiSlanted-Expert]
+ \definefontsynonym [SerifSemiItalic-Expert] [Fourier-SemiItalic-Expert]
+ \definefontsynonym [SerifSemiCaps-Expert] [Fourier-SemiCaps-Expert]
+ \definefontsynonym [SerifBold-Expert] [Fourier-Bold-Expert]
+ \definefontsynonym [SerifBoldSlanted-Expert] [Fourier-BoldSlanted-Expert]
+ \definefontsynonym [SerifBoldItalic-Expert] [Fourier-BoldItalic-Expert]
+ \definefontsynonym [SerifBlack-Expert] [Fourier-Black-Expert]
+
+ \definefontsynonym [Serif-OldStyle] [Fourier-Regular-OldStyle]
+ \definefontsynonym [SerifSlanted-OldStyle] [Fourier-Slanted-OldStyle]
+ \definefontsynonym [SerifItalic-OldStyle] [Fourier-Italic-OldStyle]
+ \definefontsynonym [SerifCaps-OldStyle] [Fourier-RegularCaps-OldStyle]
+ \definefontsynonym [SerifSemiBold-OldStyle] [Fourier-Semi-OldStyle]
+ \definefontsynonym [SerifSemiSlanted-OldStyle] [Fourier-SemiSlanted-OldStyle]
+ \definefontsynonym [SerifSemiItalic-OldStyle] [Fourier-SemiItalic-OldStyle]
+ \definefontsynonym [SerifSemiCaps-OldStyle] [Fourier-SemiCaps-OldStyle]
+ \definefontsynonym [SerifBold-OldStyle] [Fourier-Bold-OldStyle]
+ \definefontsynonym [SerifBoldSlanted-OldStyle] [Fourier-BoldSlanted-OldStyle]
+ \definefontsynonym [SerifBoldItalic-OldStyle] [Fourier-BoldItalic-OldStyle]
+ \definefontsynonym [SerifBlack-OldStyle] [Fourier-Black-OldStyle]
+ \definefontsynonym [SerifBlackSlanted-OldStyle] [Fourier-BlackSlanted-OldStyle]
+ \stoptypescript
+
+ \starttypescript [math] [fourier] [name]
+ \definefontsynonym [MathRoman] [Fourier-Math-Letters]
+ \definefontsynonym [MathItalic] [Fourier-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [Fourier-Math-Symbols]
+ \definefontsynonym [MathExtension] [Fourier-Math-Extension]
+ \stoptypescript
+
+ \starttypescript [math] [fourier] [name] % todo
+ \definefontsynonym [OldStyle] [Serif-OldStyle] % strange, no oldstyles
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [msbm10]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+ \stoptypescript
+
+ \starttypescript [serif] [utopia] [ec,texnansi]
+ \definefontsynonym [Utopia-Regular] [\typescriptthree-putr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Italic] [\typescriptthree-putri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Bold] [\typescriptthree-putb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-BoldItalic] [\typescriptthree-putbi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Slanted] [\typescriptthree-putr8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-BoldSlanted] [\typescriptthree-putb8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Regular-Caps][\typescriptthree-putr8a-capitalized-800] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-adobe-utopia.map]
+ \stoptypescript
+
+ \starttypescript [fourier] [ec]
+ \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec]
+ \definetypeface [fourier] [ss] [sans] [modern] [default] [encoding=ec,rscale=1.07]
+ \definetypeface [fourier] [tt] [mono] [modern] [default] [encoding=ec,rscale=1.07]
+ \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[antykwa]
+
+ % Antykwa Torunska (GUST)
+
+ % \starttypescript [serif] [antykwa-torunska] [texnansi,ec,8r]
+ % \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree]
+ % \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree]
+ % \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree]
+ % \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec,t2a,t2b,t2c,greek]
+ \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalic] [\typescriptthree-anttbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Light] [\typescriptthree-anttl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalic] [\typescriptthree-anttli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Medium] [\typescriptthree-anttm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalic] [\typescriptthree-anttmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondRegular] [\typescriptthree-anttcr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalic] [\typescriptthree-anttcri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBold] [\typescriptthree-anttcb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalic] [\typescriptthree-anttcbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLight] [\typescriptthree-anttcl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalic][\typescriptthree-anttcli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedium] [\typescriptthree-anttcm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalic] [\typescriptthree-anttcmi] [encoding=\typescriptthree]
+ \loadmapfile[antt-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec]
+ \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttrcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttricap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttbcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttlcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttlicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttmcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcrcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcricap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcbcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttclcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttclicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcmcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmicap] [encoding=\typescriptthree]
+ \loadmapfile[antt-\typescriptthree.map]
+ \stoptypescript
+
+ % duplicates ? ?
+ % atl: no: fallbacks for the named variants
+
+ \starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c,greek]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree]
+ \loadmapfile[antt-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree]
+ \loadmapfile[antt-\typescriptthree.map]
+ \stoptypescript
+
+ % mabye no -Regular etc
+ % dunny reverse of condlight lightcond
+
+ \starttypescript [math] [antykwa-torunska] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Italic] [mi-anttri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-light] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-cond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondItalic] [mi-anttcri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-lightcond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [default]
+ \usemathcollection[default]
+ \loadmapfile[antt-rm.map]
+ \loadmapfile[antt-mi.map]
+ \loadmapfile[antt-sy.map]
+ \loadmapfile[antt-ex.map]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][lt][Light]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][cond][Cond]
+
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][dk][Dark]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][cond][Cond]
+
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][lt][Light]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][exp][Exp]
+
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][dk][Dark]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][exp][Exp]
+
+ \stoptypescript
+
+ % maybe no -Regular etc
+
+ \starttypescript [math] [antykwa-torunska-light] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-cond] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight]
+ \stoptypescript
+
+ \starttypescript [antykwa-torunska] [texnansi,ec,8r,uc,t5,t2a]
+ \definetypeface[antykwa][rm][serif][antykwa-torunska] [default][encoding=\typescripttwo]
+ \definetypeface[antykwa][ss][sans] [modern] [default][encoding=\typescripttwo,rscale=1.05]
+ \definetypeface[antykwa][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[antykwa][mm][math] [antykwa-torunska] [default][encoding=\typescripttwo]
+ \quittypescriptscanning
+ \stoptypescript
+
+ % Antykwa Poltawskiego (GUST)
+
+ \starttypescript [serif] [antykwa-poltawskiego,antykwa-poltawskiego-light] [ec,texnansi,qx,t5]
+
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Light] [\typescriptthree-antpl17] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-LightItalic] [\typescriptthree-antpli17] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Regular] [\typescriptthree-antpr17] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Italic] [\typescriptthree-antpri17] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Medium] [\typescriptthree-antpm17] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-MediumItalic] [\typescriptthree-antpmi17] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Bold] [\typescriptthree-antpb17] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-BoldItalic] [\typescriptthree-antpbi17] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsLight] [\typescriptthree-antpl17-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsLightItalic] [\typescriptthree-antpli17-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsRegular] [\typescriptthree-antpr17-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsItalic] [\typescriptthree-antpri17-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsMedium] [\typescriptthree-antpm17-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsMediumItalic] [\typescriptthree-antpmi17-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsBold] [\typescriptthree-antpb17-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsBoldItalic] [\typescriptthree-antpbi17-sc] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Regular] [\typescriptthree-antpl12] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Italic] [\typescriptthree-antpli12] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Regular] [\typescriptthree-antpr12] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Italic] [\typescriptthree-antpri12] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Medium] [\typescriptthree-antpm12] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-MediumItalic] [\typescriptthree-antpmi12] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Bold] [\typescriptthree-antpb12] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-BoldItalic] [\typescriptthree-antpbi12] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsRegular] [\typescriptthree-antpl12-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsItalic] [\typescriptthree-antpli12-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsRegular] [\typescriptthree-antpr12-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsItalic] [\typescriptthree-antpri12-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsMedium] [\typescriptthree-antpm12-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsMediumItalic] [\typescriptthree-antpmi12-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsBold] [\typescriptthree-antpb12-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsBoldItalic] [\typescriptthree-antpbi12-sc] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-Light] [\typescriptthree-antpl10] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-LightItalic] [\typescriptthree-antpli10] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Regular] [\typescriptthree-antpr10] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Italic] [\typescriptthree-antpri10] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Medium] [\typescriptthree-antpm10] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-MediumItalic] [\typescriptthree-antpmi10] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Bold] [\typescriptthree-antpb10] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\typescriptthree-antpbi10] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-CapsLight] [\typescriptthree-antpl10-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-CapsLightItalic] [\typescriptthree-antpli10-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-CapsRegular] [\typescriptthree-antpr10-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-CapsItalic] [\typescriptthree-antpri10-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-CapsMedium] [\typescriptthree-antpm10-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-CapsMediumItalic] [\typescriptthree-antpmi10-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-CapsBold] [\typescriptthree-antpb10-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-CapsBoldItalic] [\typescriptthree-antpbi10-sc] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Light] [\typescriptthree-antpl8] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-LightItalic] [\typescriptthree-antpli8] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Regular] [\typescriptthree-antpr8] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Italic] [\typescriptthree-antpri8] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Medium] [\typescriptthree-antpm8] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-MediumItalic] [\typescriptthree-antpmi8] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Bold] [\typescriptthree-antpb8] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-BoldItalic] [\typescriptthree-antpbi8] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsLight] [\typescriptthree-antpl8-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsLightItalic] [\typescriptthree-antpli8-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsRegular] [\typescriptthree-antpr8-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsItalic] [\typescriptthree-antpri8-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsMedium] [\typescriptthree-antpm8-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsMediumItalic] [\typescriptthree-antpmi8-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsBold] [\typescriptthree-antpb8-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsBoldItalic] [\typescriptthree-antpbi8-sc] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Light] [\typescriptthree-antpl6] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-LightItalic] [\typescriptthree-antpli6] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Regular] [\typescriptthree-antpr6] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Italic] [\typescriptthree-antpri6] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Medium] [\typescriptthree-antpm6] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-MediumItalic] [\typescriptthree-antpmi6] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Bold] [\typescriptthree-antpb6] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-BoldItalic] [\typescriptthree-antpbi6] [encoding=\typescriptthree]
+
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsLight] [\typescriptthree-antpl6-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsLightItalic] [\typescriptthree-antpli6-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsRegular] [\typescriptthree-antpr6-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsItalic] [\typescriptthree-antpri6-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsMedium] [\typescriptthree-antpm6-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsMediumItalic] [\typescriptthree-antpmi6-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsBold] [\typescriptthree-antpb6-sc] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsBoldItalic] [\typescriptthree-antpbi6-sc] [encoding=\typescriptthree]
+
+ \loadmapfile[poltawski-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-poltawskiego] [name]
+ \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular]
+ \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-BoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-CapsRegular]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-poltawskiego-light] [name]
+ \definefontsynonym [Serif] [AntykwaPoltawskiego-Light]
+ \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Medium]
+ \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-LightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-LightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-MediumItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-MediumItalic]
+ \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-CapsLight]
+ \stoptypescript
+
+ % condensed and extended variants are still missing
+
+ \starttypescript [antykwa-poltawskiego,antykwa-poltawskiego-light] [ec,texnansi,qx,t5]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo,rscale=1.05] % scaling?
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05] % scaling?
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=\typescripttwo,rscale=1.05] % scaling?
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[iwona]
+
+ % maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic
+
+ \starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond] [texnansi,ec,el,qx,t5]
+ \definefontsynonym[Iwona-Regular] [\typescriptthree-iwonar] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Italic] [\typescriptthree-iwonari] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Bold] [\typescriptthree-iwonab] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-BoldItalic] [\typescriptthree-iwonabi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Light-Regular] [\typescriptthree-iwonal] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Light-Italic] [\typescriptthree-iwonali] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Medium-Regular] [\typescriptthree-iwonam] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Medium-Italic] [\typescriptthree-iwonami] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Heavy-Regular] [\typescriptthree-iwonah] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Heavy-Italic] [\typescriptthree-iwonahi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsRegular] [\typescriptthree-iwonarcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsItalic] [\typescriptthree-iwonaricap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsBold] [\typescriptthree-iwonabcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsBoldItalic] [\typescriptthree-iwonabicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsLight-Regular] [\typescriptthree-iwonalcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsLight-Italic] [\typescriptthree-iwonalicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsMedium-Regular] [\typescriptthree-iwonamcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsMedium-Italic] [\typescriptthree-iwonamicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsHeavy-Regular] [\typescriptthree-iwonahcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsHeavy-Italic] [\typescriptthree-iwonahicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondRegular] [\typescriptthree-iwonacr] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondItalic] [\typescriptthree-iwonacri] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondBold] [\typescriptthree-iwonacb] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondBoldItalic] [\typescriptthree-iwonacbi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondLight-Regular] [\typescriptthree-iwonacl] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondLight-Italic] [\typescriptthree-iwonacli] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondMedium-Regular] [\typescriptthree-iwonacm] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondMedium-Italic] [\typescriptthree-iwonacmi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondHeavy-Regular] [\typescriptthree-iwonach] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondHeavy-Italic] [\typescriptthree-iwonachi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondRegular] [\typescriptthree-iwonacrcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondItalic] [\typescriptthree-iwonacricap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondBold] [\typescriptthree-iwonacbcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondBoldItalic] [\typescriptthree-iwonacbicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondLight-Regular] [\typescriptthree-iwonaclcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondLight-Italic] [\typescriptthree-iwonaclicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondMedium-Regular][\typescriptthree-iwonacmcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondMedium-Italic] [\typescriptthree-iwonacmicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondHeavy-Regular] [\typescriptthree-iwonachcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsCondHeavy-Italic] [\typescriptthree-iwonachicap] [encoding=\typescriptthree]
+ \loadmapfile[iwona-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [math] [iwona] [default]
+ \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar]
+ \definefontsynonym [Iwona-Math-Letters-Italic] [mi-iwonari]
+ \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz]
+ \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-light] [default]
+ \definefontsynonym [Iwona-Math-Letters-Light-Regular] [rm-iwonal]
+ \definefontsynonym [Iwona-Math-Letters-Light-Italic] [mi-iwonali]
+ \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz]
+ \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-medium] [default]
+ \definefontsynonym [Iwona-Math-Letters-Medium-Regular][rm-iwonam]
+ \definefontsynonym [Iwona-Math-Letters-Medium-Italic] [mi-iwonami]
+ \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz]
+ \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-heavy] [default]
+ \definefontsynonym [Iwona-Math-Letters-Heavy-Regular] [rm-iwonah]
+ \definefontsynonym [Iwona-Math-Letters-Heavy-Italic] [mi-iwonahi]
+ \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz]
+ \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah]
+ \stoptypescript
+
+ \starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default]
+ \usemathcollection[default]
+ \loadmapfile[iwona-rm.map]
+ \loadmapfile[iwona-mi.map]
+ \loadmapfile[iwona-sy.map]
+ \loadmapfile[iwona-ex.map]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Light-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Light-Italic]
+ \definefontsynonym [SansBold] [Iwona-Medium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Medium-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsLight]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Italic]
+ \definefontsynonym [SansBold] [Iwona-Bold]
+ \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalic] [Iwona-CapsItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Medium-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Medium-Italic]
+ \definefontsynonym [SansBold] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsMedium-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-heavy] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansBold] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-heavy-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CondLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CondMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondMedium-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondLight-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondLight-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondMedium-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-cond-caps,iwona-light-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondRegular]
+ \definefontsynonym [SansItalic] [Iwona-CondItalic]
+ \definefontsynonym [SansBold] [Iwona-CondBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-cond-caps,iwona-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondRegular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondMedium-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CondMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CondHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondHeavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondMedium-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-cond-caps,iwona-medium-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-light] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Light-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Light]
+ \stoptypescript
+
+ \starttypescript [math] [iwona] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-medium] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Medium-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-heavy] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Heavy-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy]
+ \stoptypescript
+
+ \starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] [texnansi,ec,8r,uc,t2a]
+ \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[kurier]
+
+ \starttypescript [sans] [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5]
+ \definefontsynonym[Kurier-Regular] [\typescriptthree-kurierr] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Italic] [\typescriptthree-kurierri] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-RegularItalic] [Kurier-Italic]
+ \definefontsynonym[Kurier-Bold] [\typescriptthree-kurierb] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-BoldItalic] [\typescriptthree-kurierbi] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Light] [\typescriptthree-kurierl] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-LightItalic] [\typescriptthree-kurierli] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Medium] [\typescriptthree-kurierm] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-MediumItalic] [\typescriptthree-kuriermi] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Heavy] [\typescriptthree-kurierh] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-HeavyItalic] [\typescriptthree-kurierhi] [encoding=\typescriptthree]
+ \loadmapfile[kurier-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [math] [kurier] [default]
+ \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr]
+ \definefontsynonym [Kurier-Math-Letters-Italic] [mi-kurierri]
+ \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz]
+ \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-light] [default]
+ \definefontsynonym [Kurier-Math-Letters-Light-Regular] [rm-kurierl]
+ \definefontsynonym [Kurier-Math-Letters-Light-Italic] [mi-kurierli]
+ \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz]
+ \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-medium] [default]
+ \definefontsynonym [Kurier-Math-Letters-Medium-Regular][rm-kurierm]
+ \definefontsynonym [Kurier-Math-Letters-Medium-Italic] [mi-kuriermi]
+ \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz]
+ \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm]
+ \stoptypescript
+
+ \starttypescript [math] [kurier,kurier-light,kurier-medium] [default]
+ \usemathcollection[default]
+ \loadmapfile[kurier-rm.map]
+ \loadmapfile[kurier-mi.map]
+ \loadmapfile[kurier-sy.map]
+ \loadmapfile[kurier-ex.map]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Light-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Light-Italic]
+ \definefontsynonym [SansBold] [Kurier-Medium-Regular]
+ \definefontsynonym [SansBoldItalic] [Kurier-Medium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Italic]
+ \definefontsynonym [SansBold] [Kurier-Bold]
+ \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Medium-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Medium-Italic]
+ \definefontsynonym [SansBold] [Kurier-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Kurier-Heavy-Italic]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-light] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light-Regular]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-Light-Italic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Light]
+ \stoptypescript
+
+ \starttypescript [math] [kurier] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-medium] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium-Regular]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-Medium-Italic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium]
+ \stoptypescript
+
+ \starttypescript [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5]
+ \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.05]
+ \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[charter]
+
+ \starttypescript [serif] [charter] [ec,texnansi,8r]
+ \definefontsynonym [Charter-Roman] [\typescriptthree-bchr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Italic] [\typescriptthree-bchri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Bold] [\typescriptthree-bchb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-BoldItalic] [\typescriptthree-bchbi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Slanted] [\typescriptthree-bchr8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-BoldSlanted][\typescriptthree-bchb8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Roman-Caps] [\typescriptthree-bchr8a-capitalized-800] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-bitstrea-charter.map]
+ \stoptypescript
+
+ \starttypescript [serif] [charter] [name]
+ \definefontsynonym [Serif] [Charter-Roman]
+ \definefontsynonym [SerifItalic] [Charter-Italic]
+ \definefontsynonym [SerifBold] [Charter-Bold]
+ \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic]
+ \definefontsynonym [SerifSlanted] [Charter-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Charter-Roman-Caps]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[symbols]
+
+ \starttypescript
+ \definefontsynonym [ZapfDingbats] [uzdr]
+ \definefontsynonym [RalfSmithFormalScript] [rsfs10]
+ \definefontsynonym [MartinVogel] [fmvr8x]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[texgyre]
+
+ \definetypescriptprefix [f:pagella] [pl] \definetypescriptprefix [f:palatino] [pl]
+ \definetypescriptprefix [f:termes] [tm] \definetypescriptprefix [f:times] [tm]
+ \definetypescriptprefix [f:heros] [hv] \definetypescriptprefix [f:helvetica] [hv]
+ \definetypescriptprefix [f:bonum] [bk] \definetypescriptprefix [f:bookman] [bk]
+ \definetypescriptprefix [f:schola] [cs] \definetypescriptprefix [f:schoolbook] [cs]
+ \definetypescriptprefix [f:adventor][ag] %definetypescriptprefix [f:adventor] [ag]
+ \definetypescriptprefix [f:cursor] [cr] \definetypescriptprefix [f:courier] [cr]
+ \definetypescriptprefix [f:chorus] [zc] \definetypescriptprefix [f:chancery] [zc] % not the full set
+
+ \starttypescript [serif,sans,mono] [pagella,palatino,termes,times,adventor,bonum,bookman,cursor,courier,heros,helvetica,schola,schoolbook] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi] [encoding=\typescriptthree]
+ \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [serif,sans,mono] [pagella,palatino,termes,times,adventor,bonum,bookman,cursor,courier,heros,helvetica,schola,schoolbook] [ec,texnansi,cs,qx,rm,t5,l7x]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r-sc] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri-sc] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b-sc] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi-sc] [encoding=\typescriptthree]
+ \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map]
+ \stoptypescript
+
+ \starttypescript [serif] [chorus,chancery] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definefontsynonym [TeXGyreChorus-MediumItalic] [\typescriptthree-qzcmi] [encoding=\typescriptthree]
+ \loadmapfile[qzc-\typescriptthree.map]
+ \stoptypescript
+
+ \definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella]
+ \definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes]
+ \definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros]
+ \definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum]
+ \definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola]
+ \definetypescriptprefix [n:adventor] [TeXGyreAdventor] %definetypescriptprefix [n:adventor] [TeXGyreAdventor]
+ \definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor]
+ \definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set
+
+ \starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name]
+ \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+ \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [SerifCaps]
+ \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SerifSlantedCaps] [SerifItalicCaps]
+ \definefontsynonym [SerifBoldSlantedCaps] [SerifBoldItalicCaps]
+ \definefontsynonym [SerifCapsCaps] [SerifCaps]
+ \stoptypescript
+
+ \starttypescript [serif] [chorus,chancery] [name]
+ \definefontsynonym [SerifMediumItalic] [TeXGyreChorus-MediumItalic]
+ \definefontsynonym [Serif] [SerifMediumItalic]
+ \definefontsynonym [SerifItalic] [SerifMediumItalic]
+ \definefontsynonym [SerifBold] [SerifMediumItalic]
+ \definefontsynonym [SerifBoldItalic] [SerifMediumItalic]
+ \definefontsynonym [SerifSlanted] [SerifMediumItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifMediumItalic]
+ \definefontsynonym [SerifCaps] [SerifMediumItalic]
+ \stoptypescript
+
+ \starttypescript [calligraphy] [chorus,chancery] [name]
+ \definefontsynonym [Calligraphy] [TeXGyreChorus-MediumItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [heros,helvetica,adventor] [name]
+ \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+
+ \definefontvariant [Sans][osf][Caps]
+ \definefontvariant [Sans][sc] [Caps]
+
+ \definefontsynonym [SansRegular] [Sans]
+ \definefontsynonym [SansRegularCaps] [SansCaps]
+ \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SansSlantedCaps] [SansItalicCaps]
+ \definefontsynonym [SansBoldSlantedCaps] [SansBoldItalicCaps]
+ \definefontsynonym [SansCapsCaps] [SansCaps]
+ \stoptypescript
+
+ \starttypescript [mono] [cursor,courier] [name]
+ \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+
+ \definefontvariant [Mono][osf][Caps]
+ \definefontvariant [Mono][sc] [Caps]
+
+ \definefontsynonym [MonoRegular] [Mono]
+ \definefontsynonym [MonoRegularCaps] [MonoCaps]
+ \definefontsynonym [MonoItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [MonoBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [MonoBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [MonoSlantedCaps] [MonoItalicCaps]
+ \definefontsynonym [MonoBoldSlantedCaps] [MonoBoldItalicCaps]
+ \definefontsynonym [MonoCapsCaps] [MonoCaps]
+ \stoptypescript
+
+ % bonus definitions
+
+ % when these fonts are in tex live ...
+ %
+ % \definefontsynonym [Palatino-Caps] [TeXPalladioL-SC] [encoding=\typescriptthree]
+ %
+ % \starttypescript [serif] [palatino] [ec,texnansi]
+ % \definefontsynonym[TeXPalladioL-BoldItalicOsF][\typescriptthree-fplbij8a][encoding=\typescriptthree]
+ % \definefontsynonym[TeXPalladioL-BoldOsF] [\typescriptthree-fplbj8a] [encoding=\typescriptthree]
+ % \definefontsynonym[TeXPalladioL-SC] [\typescriptthree-fplrc8a] [encoding=\typescriptthree]
+ % \definefontsynonym[TeXPalladioL-ItalicOsF] [\typescriptthree-fplrij8a][encoding=\typescriptthree]
+ % \loadmapfile[\typescriptthree-urw-palatino.map]
+ % \stoptypescript
+
+ % Faces:
+
+ \starttypescript [times,termes] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05]
+ \definetypeface [\typescriptone] [mm] [math] [times] [default] [encoding=\typescripttwo]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [palatino,pagella] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo,rscale=1.075]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.075]
+ \definetypeface [\typescriptone] [mm] [math] [palatino] [default] [encoding=default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [schoolbook,schola] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [bookman,bonum] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [chancery,chorus] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [helvetica,heros] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo,rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.15]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default,rscale=1.15]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [avantgarde,adventor] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [ss] [sans] [adventor] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo,rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.15]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [courier,cursor] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [encoding=default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[xmath]
+
+ \starttypescript [math] [palatino] [all]
+ \definefontsynonym [Palatino-Roman-Upright] [pxr]
+ \definefontsynonym [Palatino-Roman-Italic] [pxi]
+ \definefontsynonym [Palatino-Roman-Slanted] [pxsl]
+ \definefontsynonym [Palatino-Roman-Caps] [pxsc]
+ \definefontsynonym [Palatino-Companion-Upright] [pcxr]
+ \definefontsynonym [Palatino-Companion-Italic] [pcxi]
+ \definefontsynonym [Palatino-Companion-Slanted] [pcxsl]
+ \definefontsynonym [Palatino-Math-Italic] [pxmi]
+ \definefontsynonym [Palatino-Math-Symbols] [pxsy]
+ \definefontsynonym [Palatino-Math-Extension] [pxex]
+ \definefontsynonym [Palatino-Math-SymbolsA] [pxsya]
+ \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb]
+ \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc]
+ \definefontsynonym [Palatino-Math-Italic-A] [pxmia]
+ \definefontsynonym [Palatino-Math-Extension-A] [pxexa]
+ \usemathcollection[default]
+ \loadmapfile[original-youngryu-px.map]
+ \stoptypescript
+
+ \starttypescript [math] [times] [all]
+ \definefontsynonym [Times-Roman-Upright] [txr]
+ \definefontsynonym [Times-Roman-Italic] [txi]
+ \definefontsynonym [Times-Roman-Slanted] [txsl]
+ \definefontsynonym [Times-Roman-Caps] [txsc]
+ \definefontsynonym [Times-Companion-Upright] [tcxr]
+ \definefontsynonym [Times-Companion-Italic] [tcxi]
+ \definefontsynonym [Times-Companion-Slanted] [tcxsl]
+ \definefontsynonym [Times-Math-Italic] [txmi]
+ \definefontsynonym [Times-Math-Symbols] [txsy]
+ \definefontsynonym [Times-Math-Extension] [txex]
+ \definefontsynonym [Times-Math-SymbolsA] [txsya]
+ \definefontsynonym [Times-Math-SymbolsB] [txsyb]
+ \definefontsynonym [Times-Math-SymbolsC] [txsyc]
+ \definefontsynonym [Times-Math-Italic-A] [txmia]
+ \definefontsynonym [Times-Math-Extension-A] [txexa]
+ \usemathcollection[default]
+ \loadmapfile[original-youngryu-tx.map]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[pregyre]
+
+ %D These are just fallbacks in case anyone stil uses the
+ %D old names (might also be removed?).
+
+ % TeXGyrePagella
+
+ \starttypescript [serif] [palatino]
+ \definefontsynonym [Palatino] [TeXGyrePagella-Regular]
+ \definefontsynonym [Palatino-Italic] [TeXGyrePagella-Italic]
+ \definefontsynonym [Palatino-Bold] [TeXGyrePagella-Bold]
+ \definefontsynonym [Palatino-BoldItalic] [TeXGyrePagella-BoldItalic]
+ \definefontsynonym [Palatino-Slanted] [TeXGyrePagella-Italic]
+ \definefontsynonym [Palatino-BoldSlanted] [TeXGyrePagella-BoldItalic]
+ \definefontsynonym [Palatino-Caps] [TeXGyrePagella-Caps]
+ \stoptypescript
+
+ \starttypescript [serif] [palatino] [name]
+ \definefontsynonym [Serif] [Palatino]
+ \definefontsynonym [SerifBold] [Palatino-Bold]
+ \definefontsynonym [SerifItalic] [Palatino-Italic]
+ \definefontsynonym [SerifSlanted] [Palatino-Slanted]
+ \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Palatino-Caps]
+ \stoptypescript
+
+ \starttypescript [math] [palatino] [name]
+ \definefontsynonym [MathRoman] [Palatino-Roman-Upright]
+ \definefontsynonym [MathExtension] [Palatino-Math-Extension]
+ \definefontsynonym [MathItalic] [Palatino-Math-Italic]
+ \definefontsynonym [MathSymbol] [Palatino-Math-Symbols]
+ \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA]
+ \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB]
+ \stoptypescript
+
+ \starttypescript [math] [palatino] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathBeta]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+ \stoptypescript
+
+ % TeXGyreTermes
+
+ \starttypescript [serif] [times]
+ \definefontsynonym [Times-Roman] [TeXGyreTermes-Regular]
+ \definefontsynonym [Times-Italic] [TeXGyreTermes-Italic]
+ \definefontsynonym [Times-Bold] [TeXGyreTermes-Bold]
+ \definefontsynonym [Times-BoldItalic] [TeXGyreTermes-BoldItalic]
+ \definefontsynonym [Times-Slanted] [TeXGyreTermes-Italic]
+ \definefontsynonym [Times-BoldSlanted] [TeXGyreTermes-BoldItalic]
+ \definefontsynonym [Times-Caps] [TeXGyreTermes-Caps]
+ \stoptypescript
+
+ \starttypescript [serif] [times] [name]
+ \definefontsynonym [Serif] [Times-Roman]
+ \definefontsynonym [SerifBold] [Times-Bold]
+ \definefontsynonym [SerifItalic] [Times-Italic]
+ \definefontsynonym [SerifSlanted] [Times-Italic]
+ \definefontsynonym [SerifBoldItalic] [Times-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic]
+ \definefontsynonym [SerifCaps] [Times-Caps]
+ \stoptypescript
+
+ \starttypescript [math] [times] [name]
+ \definefontsynonym [MathRoman] [Times-Roman-Upright]
+ \definefontsynonym [MathExtension] [Times-Math-Extension]
+ \definefontsynonym [MathItalic] [Times-Math-Italic]
+ \definefontsynonym [MathSymbol] [Times-Math-Symbols]
+ \definefontsynonym [MathAlpha] [Times-Math-SymbolsA]
+ \definefontsynonym [MathBeta] [Times-Math-SymbolsB]
+ \stoptypescript
+
+ \starttypescript [math] [times] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathBeta]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+ \stoptypescript
+
+ % TeXGyreHeros
+
+ \starttypescript [sans] [helvetica]
+ \definefontsynonym [Helvetica] [TeXGyreHeros-Regular]
+ \definefontsynonym [Helvetica-Oblique] [TeXGyreHeros-Italic]
+ \definefontsynonym [Helvetica-Bold] [TeXGyreHeros-Bold]
+ \definefontsynonym [Helvetica-BoldOblique] [TeXGyreHeros-BoldItalic]
+ \definefontsynonym [Helvetica-Caps] [TeXGyreHeros-Caps]
+ \stoptypescript
+
+ \starttypescript [sans] [helvetica] [name]
+ \definefontsynonym [Sans] [Helvetica]
+ \definefontsynonym [SansBold] [Helvetica-Bold]
+ \definefontsynonym [SansItalic] [Helvetica-Oblique]
+ \definefontsynonym [SansSlanted] [Helvetica-Oblique]
+ \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique]
+ \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique]
+ \definefontsynonym [SansCaps] [Helvetica-Caps]
+ \stoptypescript
+
+ \starttypescript [math] [helvetica] [name]
+ \definefontsynonym [MathRoman] [Helvetica-MathRoman]
+ \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols]
+ \definefontsynonym [MathItalic] [Helvetica-MathItalics]
+ \definefontsynonym [MathSymbol] [Helvetica-MathSymbols]
+ \stoptypescript
+
+ % TeXGyreBonum
+
+ \starttypescript [serif] [bookman]
+ \definefontsynonym [Bookman-Light] [TeXGyreBonum-Regular]
+ \definefontsynonym [Bookman-LightItalic] [TeXGyreBonum-Italic]
+ \definefontsynonym [Bookman-DemiBold] [TeXGyreBonum-Bold]
+ \definefontsynonym [Bookman-DemiBoldItalic] [TeXGyreBonum-BoldItalic]
+ \definefontsynonym [Bookman-LightSlanted] [TeXGyreBonum-Italic]
+ \definefontsynonym [Bookman-DemiBoldSlanted] [TeXGyreBonum-BoldItalic]
+ \definefontsynonym [Bookman-Light-Caps] [TeXGyreBonum-Caps]
+ \stoptypescript
+
+ \starttypescript [serif] [bookman] [name]
+ \definefontsynonym [Serif] [Bookman-Light]
+ \definefontsynonym [SerifItalic] [Bookman-LightItalic]
+ \definefontsynonym [SerifBold] [Bookman-DemiBold]
+ \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic]
+ \definefontsynonym [SerifSlanted] [Bookman-LightSlanted]
+ \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted]
+ \definefontsynonym [SerifCaps] [Bookman-Light-Caps]
+ \stoptypescript
+
+ % TeXGyreScola
+
+ \starttypescript [serif] [schoolbook]
+ \definefontsynonym [Schoolbook-Roman] [TeXGyreScola-Regular]
+ \definefontsynonym [Schoolbook-Italic] [TeXGyreScola-Italic]
+ \definefontsynonym [Schoolbook-Bold] [TeXGyreScola-Bold]
+ \definefontsynonym [Schoolbook-BoldItalic] [TeXGyreScola-BoldItalic]
+ \definefontsynonym [Schoolbook-Slanted] [TeXGyreScola-Italic]
+ \definefontsynonym [Schoolbook-BoldSlanted] [TeXGyreScola-BoldItalic]
+ \definefontsynonym [Schoolbook-Roman-Caps] [TeXGyreScola-Caps]
+ \stoptypescript
+
+ \starttypescript [serif] [schoolbook] [name]
+ \definefontsynonym [Serif] [Schoolbook-Roman]
+ \definefontsynonym [SerifItalic] [Schoolbook-Italic]
+ \definefontsynonym [SerifBold] [Schoolbook-Bold]
+ \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic]
+ \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted]
+ \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps]
+ \stoptypescript
+
+ % TeXGyreAdventor
+
+ % TeXGyreCursor
+
+ \starttypescript [mono] [courier]
+ \definefontsynonym [Courier] [TeXGyreCursor-Regular]
+ \definefontsynonym [Courier-Bold] [TeXGyreCursor-Bold]
+ \definefontsynonym [Courier-Oblique] [TeXGyreCursor-Italic]
+ \definefontsynonym [Courier-BoldOblique] [TeXGyreCursor-BoldItalic]
+ \fakecontrolspace
+ \stoptypescript
+
+ \starttypescript [mono] [courier] [name]
+ \definefontsynonym [Mono] [Courier]
+ \definefontsynonym [MonoBold] [Courier-Bold]
+ \definefontsynonym [MonoItalic] [Courier-Oblique]
+ \definefontsynonym [MonoSlanted] [Courier-Oblique]
+ \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique]
+ \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique]
+ \definefontsynonym [MonoCaps] [Courier]
+ \stoptypescript
+
+ % TeXGyreChorus
+
+ \starttypescript [calligraphy] [chancery]
+ \definefontsynonym [Chancery] [TeXGyreChorus-MediumItalic]
+ \stoptypescript
+
+ \starttypescript [calligraphy] [chancery] [name]
+ \definefontsynonym [Calligraphy] [Chancery]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[Lucida]
+
+ \definetypescriptprefix [e:ec] [8t]
+ \definetypescriptprefix [e:texnansi] [8y]
+ \definetypescriptprefix [e:8r] [8r]
+
+ % Lucida Bright
+
+ \starttypescript [serif] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lbr] [hlhr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright
+ \definefontsynonym [\typescriptthree-lbd] [hlhb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Demi
+ \definefontsynonym [\typescriptthree-lbi] [hlhri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Italic
+ \definefontsynonym [\typescriptthree-lbdi] [hlhbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-DemiItalic
+ \definefontsynonym [\typescriptthree-lbsl] [hlhro\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Oblique
+ \definefontsynonym [\typescriptthree-lbrsc] [hlhrc\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBrightSmallcaps
+ \definefontsynonym [\typescriptthree-lbdsc] [hlhbc\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBrightSmallcaps-Demi
+
+ \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Demi] [\typescriptthree-lbd] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Italic] [\typescriptthree-lbi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-DemiItalic] [\typescriptthree-lbdi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Oblique] [\typescriptthree-lbsl] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBrightSmallcaps] [\typescriptthree-lbrsc] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typescriptthree-lbdsc] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Bright Sans
+
+ \starttypescript [sans] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lsr] [hlsr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans
+ \definefontsynonym [\typescriptthree-lsd] [hlsb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Demi
+ \definefontsynonym [\typescriptthree-lsb] [hlsu\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Bold
+ \definefontsynonym [\typescriptthree-lsi] [hlsri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Italic
+ \definefontsynonym [\typescriptthree-lsdi] [hlsbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-DemiItalic
+ \definefontsynonym [\typescriptthree-lsbi] [hlsui\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-BoldItalic
+
+ \definefontsynonym [LucidaSans] [\typescriptthree-lsr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Demi] [\typescriptthree-lsd] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Bold] [\typescriptthree-lsb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Italic] [\typescriptthree-lsi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-DemiItalic] [\typescriptthree-lsdi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-BoldItalic] [\typescriptthree-lsbi] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Bright Typewriter
+
+ \starttypescript [mono] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lbtr] [hlcrt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriter
+ \definefontsynonym [\typescriptthree-lbtb] [hlcbt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterBold
+ \definefontsynonym [\typescriptthree-lbto] [hlcrot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterOblique
+ \definefontsynonym [\typescriptthree-lbtbo] [hlcbot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterBoldOblique
+
+ \definefontsynonym [LucidaTypewriter] [\typescriptthree-lbtr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaTypewriterBold] [\typescriptthree-lbtb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaTypewriterOblique] [\typescriptthree-lbto] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaTypewriterBoldOblique] [\typescriptthree-lbtbo] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Bright Sans Typewriter
+
+ \starttypescript [mono] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lstr] [hlsrt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Typewriter
+ \definefontsynonym [\typescriptthree-lstb] [hlsbt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterBold
+ \definefontsynonym [\typescriptthree-lsto] [hlsrot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterOblique
+ \definefontsynonym [\typescriptthree-lstbo] [hlsbot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterBoldOblique
+
+ \definefontsynonym [LucidaSans-Typewriter] [\typescriptthree-lstr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterBold] [\typescriptthree-lstb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterOblique] [\typescriptthree-lsto] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typescriptthree-lstbo] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Calligraphy
+
+ \starttypescript [calligraphy] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbc] [hlcrie\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCalligraphy-Italic
+
+ \definefontsynonym [LucidaCalligraphy-Italic] [\typescriptthree-lbc] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Casual
+
+ \starttypescript [casual] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbkr] [hlcrn\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCasual
+ \definefontsynonym [\typescriptthree-lbki] [hlcrin\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCasual-Italic
+
+ \definefontsynonym [LucidaCasual] [\typescriptthree-lbkr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaCasual-Italic] [\typescriptthree-lbki] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Handwriting
+
+ \starttypescript [handwriting] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbh] [hlcriw\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaHandwriting-Italic
+
+ \definefontsynonym [LucidaHandwriting-Italic] [\typescriptthree-lbh] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Fax
+
+ \starttypescript [fax] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lfr] [hlxr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax
+ \definefontsynonym [\typescriptthree-lfd] [hlxb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-Demi
+ \definefontsynonym [\typescriptthree-lfi] [hlxri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-Italic
+ \definefontsynonym [\typescriptthree-lfdi] [hlxbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-DemiItalic
+
+ \definefontsynonym [LucidaFax] [\typescriptthree-lfr] [encoding=\typescriptthree] % LucidaFax
+ \definefontsynonym [LucidaFax-Demi] [\typescriptthree-lfd] [encoding=\typescriptthree] % LucidaFax-Demi
+ \definefontsynonym [LucidaFax-Italic] [\typescriptthree-lfi] [encoding=\typescriptthree] % LucidaFax-Italic
+ \definefontsynonym [LucidaFax-DemiItalic] [\typescriptthree-lfdi] [encoding=\typescriptthree] % LucidaFax-DemiItalic
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [blackletter] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbl] [hlcrf\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBlackletter
+
+ \definefontsynonym [LucidaBlackletter] [\typescriptthree-lbl] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r]
+ \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [math] [lucida] [default]
+ \definefontsynonym [LucidaNewMath-AltItalic] [hlcrima]
+ \definefontsynonym [LucidaNewMath-Arrows] [hlcra]
+ \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
+ \definefontsynonym [LucidaNewMath-Roman] [hlcrm]
+ \definefontsynonym [LucidaNewMath-Italic] [hlcrim]
+ \definefontsynonym [LucidaNewMath-Symbol] [hlcry]
+ \definefontsynonym [LucidaBlackletter] [hlcrf8y] % what a mess
+ \usemathcollection[lbr]
+ \loadmapfile [lucida.map]
+ \stoptypescript
+
+ \starttypescript [boldmath,bfmath] [lucida] [default]
+ \definefontsynonym [LucidaNewMath-AltDemiItalic] [hlcdima]
+ \definefontsynonym [LucidaNewMath-Arrows-Demi] [hlcda]
+ \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
+ \definefontsynonym [LucidaNewMath-Demi] [hlcdm]
+ \definefontsynonym [LucidaNewMath-DemiItalic] [hlcdim]
+ \definefontsynonym [LucidaNewMath-Symbol-Demi] [hlcdy]
+ \loadmapfile [lucida.map]
+ \stoptypescript
+
+ % Lucida Bright
+
+ \starttypescript [serif] [lucida] [name]
+ \definefontsynonym [Serif] [LucidaBright]
+ \definefontsynonym [SerifBold] [LucidaBright-Demi]
+ \definefontsynonym [SerifItalic] [LucidaBright-Italic]
+ \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifSlanted] [LucidaBright-Oblique]
+ \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps]
+ \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi]
+ \stoptypescript
+
+ % Lucida Bright Sans
+
+ \starttypescript [sans] [lucida] [name]
+ \definefontsynonym [Sans] [LucidaSans]
+ \definefontsynonym [SansBold] [LucidaSans-Demi]
+ \definefontsynonym [SansItalic] [LucidaSans-Italic]
+ \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansSlanted] [LucidaSans-Italic]
+ \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansCaps] [LucidaSans]
+ \stoptypescript
+
+ % Lucida Bright Typewriter
+
+ % only one family may be used as mono; sans used to be that since the beginning,
+ % so we keep using that as default
+
+ % \starttypescript [mono] [lucida] [name]
+ % \definefontsynonym [Mono] [LucidaTypewriter]
+ % \definefontsynonym [MonoBold] [LucidaTypewriterBold]
+ % \definefontsynonym [MonoItalic] [LucidaTypewriterOblique]
+ % \definefontsynonym [MonoBoldItalic] [LucidaTypewriterBoldOblique]
+ % \definefontsynonym [MonoSlanted] [LucidaTypewriterOblique]
+ % \definefontsynonym [MonoBoldSlanted] [LucidaTypewriterBoldOblique]
+ % \definefontsynonym [MonoCaps] [LucidaTypewriter]
+ % \stoptypescript
+
+ % Lucida Bright Sans Typewriter
+
+ \starttypescript [mono] [lucida] [name]
+ \definefontsynonym [Mono] [LucidaSans-Typewriter]
+ \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold]
+ \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoCaps] [LucidaSans-Typewriter]
+ \stoptypescript
+
+ % Lucida Calligraphy
+
+ \starttypescript [calligraphy] [lucida] [name]
+ \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic]
+ \stoptypescript
+
+ % Lucida Casual
+
+ % \starttypescript [casual] [lucida] [name]
+ % % LucidaCasual
+ % % LucidaCasual-Italic
+ % \stoptypescript
+
+ % Lucida Handwriting
+
+ \starttypescript [handwriting] [lucida] [name]
+ \definefontsynonym [Handwriting] [LucidaHandwriting-Italic]
+ \stoptypescript
+
+ % Lucida Fax
+ %
+ % \starttypescript [fax] [lucida] [name]
+ % \definefontsynonym [FaksRegular] [LucidaFax]
+ % \definefontsynonym [FaksBold] [LucidaFax-Demi]
+ % \definefontsynonym [FaksItalic] [LucidaFax-Italic]
+ % \definefontsynonym [FaksBoldItalic] [LucidaFax-DemiItalic]
+ % \stoptypescript
+
+ % Lucida Black Letter
+ %
+ % \starttypescript [blackletter] [lucida] [name]
+ % \definefontsynonym [Blackletter] [LucidaBlackletter]
+ % \stoptypescript
+
+ % Lucida Math
+
+ \starttypescript [math] [lucida] [name]
+ % \definefontsynonym [MathRoman] [LucidaBright]
+ \definefontsynonym [MathRoman] [LucidaNewMath-Roman]
+ \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalic] [LucidaNewMath-AltItalic]
+ \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol]
+ \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows]
+ \definefontsynonym [MathBeta] [LucidaNewMath-Roman]
+ \stoptypescript
+
+ \starttypescript [math] [lucida] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathAlpha]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [MathSymbol] % math caligraphic !
+ \stoptypescript
+
+ \starttypescript [boldmath] [lucida] [name]
+ \definefontsynonym [MathRoman] [LucidaBright-Demi]
+ \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalic] [LucidaNewMath-AltDemiItalic]
+ \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol-Demi]
+ \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows-Demi]
+ \definefontsynonym [MathBeta] [LucidaNewMath-Demi]
+ \stoptypescript
+
+ \starttypescript [bfmath] [lucida] [name]
+ \definefontsynonym [MathRomanBold] [LucidaNewMath-Demi]
+ \definefontsynonym [MathExtensionBold] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalicBold] [LucidaNewMath-AltDemiItalic]
+ \definefontsynonym [MathSymbolBold] [LucidaNewMath-Symbol-Demi]
+ \definefontsynonym [MathAlphaBold] [LucidaNewMath-Arrows-Demi]
+ \definefontsynonym [MathBetaBold] [LucidaNewMath-Demi]
+ \stoptypescript
+
+ \starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r,uc]
+ \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+ \loadmapfile [lucida.map]
+ \stoptypescript
+
+ \starttypescript [lucida] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [math] [lucida] [default] [encoding=\typescripttwo]
+ \stoptypescript
+
+ \starttypescript [lucidabfm] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
+ \stoptypescript
+
+ \starttypescript [lucidaboldmath] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
+ \stoptypescript
+
+ \starttypescript [lucidabfm] [texnansi,ec,8r,uc]
+ \definetypeface [lucidabfm] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
+ \loadmapfile [lucida.map]
+ \stoptypescript
+
+ \starttypescript [lucidaboldmath] [texnansi,ec,8r,uc]
+ \definetypeface [lucidaboldmath] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
+ \loadmapfile [bh-lucida.map]
+ \stoptypescript
+
+ \starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r]
+ \usemathcollection[lbr]
+ \quittypescriptscanning % last in the row
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[postscript]
+
+ \starttypescript [postscript] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo]
+ \definetypeface [postscript] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9]
+ \definetypeface [postscript] [tt] [mono] [courier] [default] [encoding=\typescripttwo,rscale=1.1]
+ \definetypeface [postscript] [mm] [math] [times] [default] [encoding=\typescripttwo]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[libertine]
+
+ \starttypescript [serif] [libertine] [ec]
+ \definefontsynonym [Libertine-Regular] [fxlr-t1] [encoding=ec]
+ \definefontsynonym [Libertine-Italic] [fxlri-t1] [encoding=ec]
+ \definefontsynonym [Libertine-Bold] [fxlb-t1] [encoding=ec]
+ \definefontsynonym [Libertine-BoldItalic] [fxlbi-t1] [encoding=ec]
+ \definefontsynonym [Libertine-SmallCaps] [fxlrc-t1] %[encoding=ec]
+ \loadmapfile [libertine.map]
+ \stoptypescript
+
+ \starttypescript [serif] [libertine] [name]
+ \definefontsynonym [Serif] [Libertine-Regular]
+ \definefontsynonym [SerifItalic] [Libertine-Italic]
+ \definefontsynonym [SerifSlanted] [Libertine-Italic]
+ \definefontsynonym [SerifBold] [Libertine-Bold]
+ \definefontsynonym [SerifBoldItalic] [Libertine-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted][Libertine-BoldItalic]
+ \definefontsynonym [SerifCaps] [Libertine-SmallCaps]
+ \stoptypescript
+
+ \starttypescript [libertine] [ec]
+ \definetypeface [libertine] [tt] [mono] [default] [default] [encoding=ec]
+ \definetypeface [libertine] [ss] [sans] [default] [default] [encoding=ec]
+ \definetypeface [libertine] [rm] [serif] [libertine] [default] [encoding=ec]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[inconsolata]
+
+ \starttypescript [mono] [inconsolata] [ec]
+ \definefontsynonym [Inconsolata] [ec-inconsolata] [encoding=ec]
+ \pdfmapline{ec-inconsolata Inconsolata "fi4ECEncoding ReEncodeFont" <[fi4-ec.enc <Inconsolata.pfb}
+ \stoptypescript
+
+ \starttypescript [mono] [inconsolata] [name]
+ \definefontsynonym [Mono] [Inconsolata]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-one.mkiv b/tex/context/base/type-one.mkiv
new file mode 100644
index 000000000..fa5d9b08a
--- /dev/null
+++ b/tex/context/base/type-one.mkiv
@@ -0,0 +1,113 @@
+%D \module
+%D [ file=type-one,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Type One Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% We use open type fonts in \MKIV. However we can still use type
+% one fonts but there are not that many useful left that only
+% come in type one.
+
+\starttypescriptcollection[allkindofafm]
+
+ % \starttypescript [serif] [bookman] [name]
+ % \definefontsynonym [Serif] [Bookman-Light]
+ % \definefontsynonym [SerifItalic] [Bookman-LightItalic]
+ % \definefontsynonym [SerifBold] [Bookman-DemiBold]
+ % \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic]
+ % \definefontsynonym [SerifSlanted] [Bookman-LightSlanted]
+ % \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted]
+ % \definefontsynonym [SerifCaps] [Bookman-Light-Caps]
+ % \stoptypescript
+
+ % \starttypescript [calligraphy] [chancery] [name]
+ % \definefontsynonym [Calligraphy] [Chancery]
+ % \stoptypescript
+
+ % \starttypescript [serif] [schoolbook] [name]
+ % \definefontsynonym [Serif] [Schoolbook-Roman]
+ % \definefontsynonym [SerifItalic] [Schoolbook-Italic]
+ % \definefontsynonym [SerifBold] [Schoolbook-Bold]
+ % \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic]
+ % \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted]
+ % \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted]
+ % \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps]
+ % \stoptypescript
+
+ % \starttypescript [serif] [utopia] [name]
+ % \definefontsynonym [Serif] [Utopia-Regular]
+ % \definefontsynonym [SerifItalic] [Utopia-Italic]
+ % \definefontsynonym [SerifBold] [Utopia-Bold]
+ % \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic]
+ % \definefontsynonym [SerifSlanted] [Utopia-Slanted]
+ % \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted]
+ % \definefontsynonym [SerifCaps] [Utopia-Regular-Caps]
+ % \stoptypescript
+
+ % \starttypescript [serif] [charter] [name]
+ % \definefontsynonym [Serif] [Charter-Roman]
+ % \definefontsynonym [SerifItalic] [Charter-Italic]
+ % \definefontsynonym [SerifBold] [Charter-Bold]
+ % \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic]
+ % \definefontsynonym [SerifSlanted] [Charter-Slanted]
+ % \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted]
+ % \definefontsynonym [SerifCaps] [Charter-Roman-Caps]
+ % \stoptypescript
+
+ % \starttypescript [serif] [times] [name]
+ % \definefontsynonym [Serif] [Times-Roman]
+ % \definefontsynonym [SerifBold] [Times-Bold]
+ % \definefontsynonym [SerifItalic] [Times-Italic]
+ % \definefontsynonym [SerifSlanted] [Times-Italic]
+ % \definefontsynonym [SerifBoldItalic] [Times-BoldItalic]
+ % \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic]
+ % \definefontsynonym [SerifCaps] [Times-Caps]
+ % \stoptypescript
+
+ % \starttypescript [sans] [helvetica] [name]
+ % \definefontsynonym [Sans] [Helvetica]
+ % \definefontsynonym [SansBold] [Helvetica-Bold]
+ % \definefontsynonym [SansItalic] [Helvetica-Oblique]
+ % \definefontsynonym [SansSlanted] [Helvetica-Oblique]
+ % \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique]
+ % \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique]
+ % \definefontsynonym [SansCaps] [Helvetica-Caps]
+ % \stoptypescript
+
+ % \starttypescript [math] [helvetica] [name]
+ % \definefontsynonym [MathRoman] [Helvetica-MathRoman]
+ % \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols]
+ % \definefontsynonym [MathItalic] [Helvetica-MathItalics]
+ % \definefontsynonym [MathSymbol] [Helvetica-MathSymbols]
+ % \stoptypescript
+
+ % \starttypescript [mono] [courier] [name]
+ % \definefontsynonym [Mono] [Courier]
+ % \definefontsynonym [MonoBold] [Courier-Bold]
+ % \definefontsynonym [MonoItalic] [Courier-Oblique]
+ % \definefontsynonym [MonoSlanted] [Courier-Oblique]
+ % \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique]
+ % \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique]
+ % \definefontsynonym [MonoCaps] [Courier]
+ % \stoptypescript
+
+ % \starttypescript [serif] [palatino] [name]
+ % \definefontsynonym [Serif] [Palatino]
+ % \definefontsynonym [SerifBold] [Palatino-Bold]
+ % \definefontsynonym [SerifItalic] [Palatino-Italic]
+ % \definefontsynonym [SerifSlanted] [Palatino-Slanted]
+ % \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic]
+ % \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted]
+ % \definefontsynonym [SerifCaps] [Palatino-Caps]
+ % \stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-otf.mkii b/tex/context/base/type-otf.mkii
new file mode 100644
index 000000000..1e22a9df2
--- /dev/null
+++ b/tex/context/base/type-otf.mkii
@@ -0,0 +1,2033 @@
+%D \module
+%D [ file=type-otf,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Opentype Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Actually, \LUATEX\ does not need all these definitions since it can
+%D consult its database. However, here we use the names that we used
+%D in good old \TEX, and these may differ a bit. Here we also see
+%D some oldstyle definitions which normally are done with features.
+
+\starttypescriptcollection[fallback]
+
+\starttypescript [fallback]
+ \definetypeface [] [rm] [serif] [modern] [computer-modern]
+ \definetypeface [] [ss] [sans] [modern] [computer-modern]
+ \definetypeface [] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [] [mm] [math] [modern] [computer-modern]
+ \quittypescriptscanning
+\stoptypescript
+
+% faster
+%
+% \starttypescript [fallback]
+% \definetypeface [] [rm] [serif] [modern] [default]
+% \definetypeface [] [ss] [sans] [modern] [default]
+% \definetypeface [] [tt] [mono] [modern] [default]
+% \definetypeface [] [mm] [math] [modern] [default]
+% \quittypescriptscanning
+% \stoptypescript
+
+\stoptypescriptcollection
+
+% if a fontname equals the filename, then use
+%
+% \setupfontsynonym [LMRoman10-DemiOblique] [features=default] % file is lowercase, so fails
+% \definefontsynonym [LMRoman10-DemiOblique] [name:LMRoman10-DemiOblique] [features=default]
+% \definefontsynonym [LMRoman10-DemiOblique] [lmroman10-demioblique] [features=default]
+
+\starttypescriptcollection[latinmodern]
+
+ %D The names have changed (again) ... but I will not change the symbolic names
+ %D any more. Filename changes will be catched in luatex (fallbacks) but not in
+ %D other tex's.
+
+ \starttypescript [serif] [modern,latin-modern]
+ \definefontsynonym [LMRoman5-Regular] [file:lmroman5-regular] [features=default]
+ \definefontsynonym [LMRoman6-Regular] [file:lmroman6-regular] [features=default]
+ \definefontsynonym [LMRoman7-Regular] [file:lmroman7-regular] [features=default]
+ \definefontsynonym [LMRoman8-Regular] [file:lmroman8-regular] [features=default]
+ \definefontsynonym [LMRoman9-Regular] [file:lmroman9-regular] [features=default]
+ \definefontsynonym [LMRoman10-Regular] [file:lmroman10-regular] [features=default]
+ \definefontsynonym [LMRoman12-Regular] [file:lmroman12-regular] [features=default]
+ \definefontsynonym [LMRoman17-Regular] [file:lmroman17-regular] [features=default]
+ \definefontsynonym [LMRoman5-Bold] [file:lmroman5-bold] [features=default]
+ \definefontsynonym [LMRoman6-Bold] [file:lmroman6-bold] [features=default]
+ \definefontsynonym [LMRoman7-Bold] [file:lmroman7-bold] [features=default]
+ \definefontsynonym [LMRoman8-Bold] [file:lmroman8-bold] [features=default]
+ \definefontsynonym [LMRoman9-Bold] [file:lmroman9-bold] [features=default]
+ \definefontsynonym [LMRoman10-Bold] [file:lmroman10-bold] [features=default]
+ \definefontsynonym [LMRoman12-Bold] [file:lmroman12-bold] [features=default]
+ \definefontsynonym [LMRoman7-Italic] [file:lmroman7-italic] [features=default]
+ \definefontsynonym [LMRoman8-Italic] [file:lmroman8-italic] [features=default]
+ \definefontsynonym [LMRoman9-Italic] [file:lmroman9-italic] [features=default]
+ \definefontsynonym [LMRoman10-Italic] [file:lmroman10-italic] [features=default]
+ \definefontsynonym [LMRoman12-Italic] [file:lmroman12-italic] [features=default]
+ \definefontsynonym [LMRoman10-BoldItalic] [file:lmroman10-bolditalic] [features=default]
+ \definefontsynonym [LMRoman8-Oblique] [file:lmromanslant8-regular] [features=default]
+ \definefontsynonym [LMRoman9-Oblique] [file:lmromanslant9-regular] [features=default]
+ \definefontsynonym [LMRoman10-Oblique] [file:lmromanslant10-regular][features=default]
+ \definefontsynonym [LMRoman12-Oblique] [file:lmromanslant12-regular][features=default]
+ \definefontsynonym [LMRoman17-Oblique] [file:lmromanslant17-regular][features=default]
+ \definefontsynonym [LMRoman10-BoldOblique] [file:lmromanslant10-bold] [features=default]
+ \definefontsynonym [LMRoman10-Demi] [file:lmromandemi10-regular] [features=default]
+ \definefontsynonym [LMRoman10-DemiOblique] [file:lmromandemi10-oblique] [features=default]
+ \definefontsynonym [LMRoman10-CapsRegular] [file:lmromancaps10-regular] [features=default] % features=smallcaps?
+ \definefontsynonym [LMRoman10-CapsOblique] [file:lmromancaps10-oblique] [features=default]
+
+ \definefontsynonym [LMRoman10-Dunhill] [file:lmromandunh10-regular] [features=default]
+ \definefontsynonym [LMRoman10-DunhillOblique] [file:lmromandunh10-oblique] [features=default]
+ \definefontsynonym [LMRoman10-Unslanted] [file:lmromanunsl10-regular] [features=default]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern]
+ \definefontsynonym [LMSans8-Regular] [file:lmsans8-regular] [features=default]
+ \definefontsynonym [LMSans9-Regular] [file:lmsans9-regular] [features=default]
+ \definefontsynonym [LMSans10-Regular] [file:lmsans10-regular] [features=default]
+ \definefontsynonym [LMSans12-Regular] [file:lmsans12-regular] [features=default]
+ \definefontsynonym [LMSans17-Regular] [file:lmsans17-regular] [features=default]
+ \definefontsynonym [LMSans10-Bold] [file:lmsans10-bold] [features=default]
+ \definefontsynonym [LMSans8-Oblique] [file:lmsans8-oblique] [features=default]
+ \definefontsynonym [LMSans9-Oblique] [file:lmsans9-oblique] [features=default]
+ \definefontsynonym [LMSans10-Oblique] [file:lmsans10-oblique] [features=default]
+ \definefontsynonym [LMSans12-Oblique] [file:lmsans12-oblique] [features=default]
+ \definefontsynonym [LMSans17-Oblique] [file:lmsans17-oblique] [features=default]
+ \definefontsynonym [LMSans10-BoldOblique] [file:lmsans10-boldoblique] [features=default]
+
+ \definefontsynonym [LMSans10-DemiCondensed] [file:lmsansdemicond10-regular] [features=default]
+ \definefontsynonym [LMSans10-DemiCondensedOblique] [file:lmsansdemicond10-oblique] [features=default]
+
+ \definefontsynonym [LMSansQuotation8-Regular] [file:lmsansquot8-regular] [features=default]
+ \definefontsynonym [LMSansQuotation8-Bold] [file:lmsansquot8-bold] [features=default]
+ \definefontsynonym [LMSansQuotation8-Oblique] [file:lmsansquot8-oblique] [features=default]
+ \definefontsynonym [LMSansQuotation8-BoldOblique] [file:lmsansquot8-boldoblique] [features=default]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond]
+ \definefontsynonym [LMTypewriter8-Regular] [file:lmmono8-regular] [features=none]
+ \definefontsynonym [LMTypewriter9-Regular] [file:lmmono9-regular] [features=none]
+ \definefontsynonym [LMTypewriter10-Regular] [file:lmmono10-regular] [features=none]
+ \definefontsynonym [LMTypewriter12-Regular] [file:lmmono12-regular] [features=none]
+ \definefontsynonym [LMTypewriter10-Italic] [file:lmmono10-italic] [features=none]
+ \definefontsynonym [LMTypewriter10-Oblique] [file:lmmonoslant10-regular] [features=none]
+ \definefontsynonym [LMTypewriter10-CapsRegular] [file:lmmonocaps10-regular] [features=none] % features=smallcaps?
+ \definefontsynonym [LMTypewriter10-CapsOblique] [file:lmmonocaps10-oblique] [features=none]
+
+ \definefontsynonym [LMTypewriter10-Light] [file:lmmonolt10-regular] [features=none]
+ \definefontsynonym [LMTypewriter10-LightOblique] [file:lmmonolt10-oblique] [features=none]
+ \definefontsynonym [LMTypewriter10-LightCondensed] [file:lmmonoltcond10-regular] [features=none]
+ \definefontsynonym [LMTypewriter10-LightCondensedOblique] [file:lmmonoltcond10-oblique] [features=none]
+
+ \definefontsynonym [LMTypewriter10-Dark] [file:lmmonolt10-bold] [features=none]
+ \definefontsynonym [LMTypewriter10-DarkOblique] [file:lmmonolt10-boldoblique] [features=none]
+
+ \definefontsynonym [LMTypewriterVarWd10-Regular] [file:lmmonoproplt10-regular] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-Oblique] [file:lmmonoproplt10-oblique] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-Light] [file:lmmonoprop10-regular] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-LightOblique] [file:lmmonoprop10-oblique] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-Dark] [file:lmmonoproplt10-bold] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [file:lmmonoproplt10-boldoblique] [features=default]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern]
+ \definefontsynonym [LMMathRoman5-Regular] [rm-lmr5]
+ \definefontsynonym [LMMathRoman6-Regular] [rm-lmr6]
+ \definefontsynonym [LMMathRoman7-Regular] [rm-lmr7]
+ \definefontsynonym [LMMathRoman8-Regular] [rm-lmr8]
+ \definefontsynonym [LMMathRoman9-Regular] [rm-lmr9]
+ \definefontsynonym [LMMathRoman10-Regular] [rm-lmr10]
+ \definefontsynonym [LMMathRoman12-Regular] [rm-lmr12]
+ \definefontsynonym [LMMathRoman17-Regular] [rm-lmr17]
+ \definefontsynonym [LMMathRoman5-Bold] [rm-lmbx5]
+ \definefontsynonym [LMMathRoman6-Bold] [rm-lmbx6]
+ \definefontsynonym [LMMathRoman7-Bold] [rm-lmbx7]
+ \definefontsynonym [LMMathRoman8-Bold] [rm-lmbx8]
+ \definefontsynonym [LMMathRoman9-Bold] [rm-lmbx9]
+ \definefontsynonym [LMMathRoman10-Bold] [rm-lmbx10]
+ \definefontsynonym [LMMathRoman12-Bold] [rm-lmbx12]
+ \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5]
+ \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7]
+ \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10]
+ \definefontsynonym [LMMathSymbols5-Italic] [lmsy5]
+ \definefontsynonym [LMMathSymbols6-Italic] [lmsy6]
+ \definefontsynonym [LMMathSymbols7-Italic] [lmsy7]
+ \definefontsynonym [LMMathSymbols8-Italic] [lmsy8]
+ \definefontsynonym [LMMathSymbols9-Italic] [lmsy9]
+ \definefontsynonym [LMMathSymbols10-Italic] [lmsy10]
+ \definefontsynonym [LMMathExtension10-Regular] [lmex10]
+ \definefontsynonym [LMMathItalic5-Italic] [lmmi5]
+ \definefontsynonym [LMMathItalic6-Italic] [lmmi6]
+ \definefontsynonym [LMMathItalic7-Italic] [lmmi7]
+ \definefontsynonym [LMMathItalic8-Italic] [lmmi8]
+ \definefontsynonym [LMMathItalic9-Italic] [lmmi9]
+ \definefontsynonym [LMMathItalic10-Italic] [lmmi10]
+ \definefontsynonym [LMMathItalic12-Italic] [lmmi12]
+ \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5]
+ \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7]
+ \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10]
+
+ \loadmapfile[lm-math.map]
+ \loadmapfile[lm-rm.map]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Serif] [LMRoman-Regular]
+ \definefontsynonym [SerifBold] [LMRoman-Bold]
+ \definefontsynonym [SerifItalic] [LMRoman-Italic]
+ \definefontsynonym [SerifSlanted] [LMRoman-Oblique]
+ \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [SerifCaps] [LMRoman-CapsRegular]
+ \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Sans] [LMSans-Regular]
+ \definefontsynonym [SansBold] [LMSans-Bold]
+ \definefontsynonym [SansItalic] [LMSans-Oblique]
+ \definefontsynonym [SansSlanted] [LMSans-Oblique]
+ \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [SansCaps] [LMSans-Regular]
+ \definefontsynonym [SansCapsSlanted] [LMSans-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Regular]
+ \definefontsynonym [MonoBold] [LMTypewriter-Dark]
+ \definefontsynonym [MonoItalic] [LMTypewriter-Italic]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRoman] [LMMathRoman-Regular]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalic] [LMMathItalic-Italic]
+ \definefontsynonym [MathSymbol] [LMMathSymbols-Italic]
+ \stoptypescript
+
+ \starttypescript [boldmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRoman] [LMMathRoman-Bold]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalic] [LMMathItalic-BoldItalic]
+ \definefontsynonym [MathSymbol] [LMMathSymbols-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [bfmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRomanBold] [LMMathRoman-Bold]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalicBold] [LMMathItalic-BoldItalic]
+ \definefontsynonym [MathSymbolBold] [LMMathSymbols-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [math,boldmath,bfmath] [modern,computer-modern,latin-modern] [name]
+ \usemathcollection[default]
+ \stoptypescript
+
+ \starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name]
+ \definefontsynonym [Serif] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name]
+ \definefontsynonym [Mono] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed]
+ \stoptypescript
+
+ \starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Light]
+ \definefontsynonym [MonoBold] [LMTypewriter-Light]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light]
+ \definefontsynonym [MonoCaps] [LMTypewriter-Light]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light]
+ \stoptypescript
+
+ % Later we will map the real fonts, here we just map synonyms.
+
+ \starttypescript [serif] [modern,latin-modern]
+ \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique]
+ \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold]
+ \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic]
+ \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique]
+ \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular]
+ \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique]
+ \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular]
+ \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic]
+ \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern]
+ \definefontsynonym [LMSans-Regular] [LMSans10-Regular]
+ \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique]
+ \definefontsynonym [LMSans-Bold] [LMSans10-Bold]
+ \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed]
+ \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique]
+ \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond]
+ \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular]
+ \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique]
+ \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light]
+ \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique]
+ \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed]
+ \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique]
+ \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark]
+ \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique]
+ \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular]
+ \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic]
+ \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular]
+ \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light]
+ \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique]
+ \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark]
+ \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModern] [LMRoman-Regular]
+ \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic]
+ \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique]
+ \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold]
+ \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular]
+ \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernSans] [LMSans-Regular]
+ \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold]
+ \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular]
+ \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular]
+ \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic]
+ \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique]
+ \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark]
+ \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % !
+ \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular]
+ \stoptypescript
+
+ \starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari]
+ \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern]
+ \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ \definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic]
+ \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ \definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic]
+ \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \stoptypescript
+
+ % can boldmath and bfmath be joined?
+ \starttypescript [boldmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [bfmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmr5] [LMRoman5-Regular]
+ \definefontsynonym [cmr6] [LMRoman6-Regular]
+ \definefontsynonym [cmr7] [LMRoman7-Regular]
+ \definefontsynonym [cmr8] [LMRoman8-Regular]
+ \definefontsynonym [cmr9] [LMRoman9-Regular]
+ \definefontsynonym [cmr10] [LMRoman10-Regular]
+ \definefontsynonym [cmr12] [LMRoman12-Regular]
+ \definefontsynonym [cmr17] [LMRoman17-Regular]
+ \definefontsynonym [cmbx5] [LMRoman5-Bold]
+ \definefontsynonym [cmbx6] [LMRoman6-Bold]
+ \definefontsynonym [cmbx7] [LMRoman7-Bold]
+ \definefontsynonym [cmbx8] [LMRoman8-Bold]
+ \definefontsynonym [cmbx9] [LMRoman9-Bold]
+ \definefontsynonym [cmbx10] [LMRoman10-Bold]
+ \definefontsynonym [cmbx12] [LMRoman12-Bold]
+ \definefontsynonym [cmsl10] [LMRoman10-Oblique]
+ \definefontsynonym [cmsl12] [LMRoman12-Oblique]
+ \definefontsynonym [cmsl17] [LMRoman17-Oblique]
+ \definefontsynonym [cmsl8] [LMRoman8-Oblique]
+ \definefontsynonym [cmsl9] [LMRoman9-Oblique]
+ \definefontsynonym [cmti7] [LMRoman7-Italic]
+ \definefontsynonym [cmti8] [LMRoman8-Italic]
+ \definefontsynonym [cmti9] [LMRoman9-Italic]
+ \definefontsynonym [cmti10] [LMRoman10-Italic]
+ \definefontsynonym [cmti12] [LMRoman12-Italic]
+ \definefontsynonym [cmbsl10] [LMRoman10-DemiOblique]
+ \definefontsynonym [cmbxsl10] [LMRoman10-BoldOblique]
+ \definefontsynonym [cmbxti10] [LMRoman10-BoldItalic]
+ \definefontsynonym [cmcsc10] [LMRoman10-CapsRegular]
+ \definefontsynonym [cmcscsl10][LMRoman10-CapsOblique]
+
+ %definefontsynonym [cmb10]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmss8] [LMSans8-Regular]
+ \definefontsynonym [cmss9] [LMSans9-Regular]
+ \definefontsynonym [cmss10] [LMSans10-Regular]
+ \definefontsynonym [cmss12] [LMSans12-Regular]
+ \definefontsynonym [cmss17] [LMSans17-Regular]
+ \definefontsynonym [cmssi10] [LMSans10-Oblique]
+ \definefontsynonym [cmssi12] [LMSans12-Oblique]
+ \definefontsynonym [cmssi17] [LMSans17-Oblique]
+ \definefontsynonym [cmssi8] [LMSans8-Oblique]
+ \definefontsynonym [cmssi9] [LMSans9-Oblique]
+ \definefontsynonym [cmssq8] [LMSansQuotation8-Regular]
+ \definefontsynonym [cmssqb8] [LMSansQuotation8-Bold]
+ \definefontsynonym [cmssqbi8] [LMSansQuotation8-BoldOblique]
+ \definefontsynonym [cmssqi8] [LMSansQuotation8-Oblique]
+ \definefontsynonym [cmssbx10] [LMSans10-Bold]
+ \definefontsynonym [cmssdc10] [LMSans10-DemiCondensed]
+ \definefontsynonym [cmssbi10] [LMSans10-BoldOblique]
+ \definefontsynonym [cmssdi10] [LMSans10-DemiCondensedOblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmtt8] [LMTypewriter8-Regular]
+ \definefontsynonym [cmtt9] [LMTypewriter9-Regular]
+ \definefontsynonym [cmtt10] [LMTypewriter10-Regular]
+ \definefontsynonym [cmtt12] [LMTypewriter12-Regular]
+ \definefontsynonym [cmitt10] [LMTypewriter10-Italic]
+ \definefontsynonym [cmsltt10] [LMTypewriter10-Oblique]
+ \definefontsynonym [cmvtt10] [LMTypewriterVarWd10-Regular]
+ \definefontsynonym [cmvtti10] [LMTypewriterVarWd10-Oblique]
+ \definefontsynonym [cmtcsc10] [LMTypewriter10-CapsRegular]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmbsy5] [LMMathSymbols5-BoldItalic]
+ \definefontsynonym [cmbsy7] [LMMathSymbols7-BoldItalic]
+ \definefontsynonym [cmbsy10] [LMMathSymbols10-BoldItalic]
+ \definefontsynonym [cmsy5] [LMMathSymbols5-Italic]
+ \definefontsynonym [cmsy6] [LMMathSymbols6-Italic]
+ \definefontsynonym [cmsy7] [LMMathSymbols7-Italic]
+ \definefontsynonym [cmsy8] [LMMathSymbols8-Italic]
+ \definefontsynonym [cmsy9] [LMMathSymbols9-Italic]
+ \definefontsynonym [cmsy10] [LMMathSymbols10-Italic]
+ \definefontsynonym [cmex10] [LMMathExtension10-Regular]
+ \definefontsynonym [cmmi5] [LMMathItalic5-Italic]
+ \definefontsynonym [cmmi6] [LMMathItalic6-Italic]
+ \definefontsynonym [cmmi7] [LMMathItalic7-Italic]
+ \definefontsynonym [cmmi8] [LMMathItalic8-Italic]
+ \definefontsynonym [cmmi9] [LMMathItalic9-Italic]
+ \definefontsynonym [cmmi10] [LMMathItalic10-Italic]
+ \definefontsynonym [cmmi12] [LMMathItalic12-Italic]
+ \definefontsynonym [cmmib5] [LMMathItalic5-BoldItalic]
+ \definefontsynonym [cmmib7] [LMMathItalic7-BoldItalic]
+ \definefontsynonym [cmmib10] [LMMathItalic10-BoldItalic]
+ \stoptypescript
+
+ % This will change some day.
+
+ \starttypescript [math] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [msbm10]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [cmsy10]
+ \stoptypescript
+
+ % Concrete Modern Roman : Donald Knuth
+
+ \starttypescript [serif] [concrete] [name]
+ \definefontsynonym [Serif] [ComputerConcrete]
+ \definefontsynonym [SerifBold] [ComputerConcrete]
+ \definefontsynonym [SerifItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [SerifSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [SerifBoldItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [SerifBoldSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [SerifCaps] [ComputerConcrete-Caps]
+ \stoptypescript
+
+ \starttypescript [math] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic] [lmmi10]
+ \definefontsynonym [ComputerModernMath-Symbol] [lmsy10]
+ \stoptypescript
+
+ \starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10]
+ \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10]
+ \stoptypescript
+
+ \starttypescript [modern]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern]
+ \definetypeface [modern] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [modern] [mm] [math] [modern] [computer-modern]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modern-base]
+ \definetypeface [modern] [rm] [serif] [modern] [default]
+ \definetypeface [modern] [ss] [sans] [modern] [default]
+ \definetypeface [modern] [tt] [mono] [modern] [default]
+ \definetypeface [modern] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modernvariable]
+ \definetypeface [modernvariable] [rm] [serif] [simple] [default]
+ \definetypeface [modernvariable] [ss] [sans] [modern] [default]
+ \definetypeface [modernvariable] [tt] [mono] [modern] [default]
+ \definetypeface [modernvariable] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it
+ \definefontsynonym [Simple] [cmvtt10]
+ \setupfontsynonym [Simple] [handling=pure]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[concrete]
+
+ % Computer Concrete (AMS)
+
+ \starttypescript [serif] [concrete]
+ \definefontsynonym [ComputerConcrete] [ccr10]
+ \definefontsynonym [ComputerConcrete-Italic] [ccti10]
+ \definefontsynonym [ComputerConcrete-Slanted] [ccsl10]
+ \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete]
+ \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [ComputerConcrete-Caps] [cccsc10]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[euler]
+
+ \starttypescript [math] [euler]
+ \definefontsynonym [Euler-Roman] [zeurm10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol] [zeusm10]
+ \definefontsynonym [Euler-Fraktur] [eufm10]
+
+ \loadmapfile[original-ams-euler.map]
+ \stoptypescript
+
+ \starttypescript [boldmath,bfmath] [euler]
+ \definefontsynonym [Euler-Roman-Bold] [zeurb10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol-Bold] [zeusb10]
+ \definefontsynonym [Euler-Fraktur-Bold] [eufb10]
+
+ \loadmapfile[original-ams-euler.map]
+ \stoptypescript
+
+ \starttypescript [math] [euler] [name]
+ \definefontsynonym [MathRoman] [Euler-Roman] % mr
+ \definefontsynonym [MathItalic] [Euler-Fraktur] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbol] [Euler-Symbol] % sy
+ \stoptypescript
+
+ \starttypescript [boldmath] [euler] [name]
+ \definefontsynonym [MathRoman] [Euler-Roman-Bold] % mr
+ \definefontsynonym [MathItalic] [Euler-Fraktur-Bold] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbol] [Euler-Symbol-Bold] % sy
+ \stoptypescript
+
+ \starttypescript [bfmath] [euler] [name]
+ \definefontsynonym [MathRomanBold] [Euler-Roman-Bold] % mr
+ \definefontsynonym [MathItalicBold] [Euler-Fraktur-Bold] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbolBold] [Euler-Symbol-Bold] % sy
+ \stoptypescript
+
+ \starttypescript [math] [euler] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [MathItalic]
+ \definefontsynonym [Gothic] [MathItalic]
+ \definefontsynonym [Calligraphic] [MathSymbol]
+ \stoptypescript
+
+ \starttypescript [boldmath] [euler] [name]
+ \definefontsynonym [OldStyle] [MathItalicBold]
+ \definefontsynonym [Fraktur] [MathItalicBold]
+ \definefontsynonym [Gothic] [MathItalicBold]
+ \definefontsynonym [Calligraphic] [MathSymbolBold]
+ \stoptypescript
+
+ \starttypescript [math,boldmath,bfmath] [euler] [name]
+ \usemathcollection[eul]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[amssymbols]
+
+ \starttypescript [math] [modern,computer-modern,latin-modern,ams] [name]
+ \definefontsynonym [MathAlpha] [AMS-SymbolA]
+ \definefontsynonym [MathBeta] [AMS-SymbolB]
+ \stoptypescript
+
+ \starttypescript [math] [modern,computer-modern,latin-modern,ams]
+ \definefontsynonym [AMS-SymbolA] [msam10]
+ \definefontsynonym [AMS-SymbolB] [msbm10]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[texgyre]
+
+ \definetypescriptprefix [f:pagella] [pagella] \definetypescriptprefix [f:palatino] [pagella]
+ \definetypescriptprefix [f:termes] [termes] \definetypescriptprefix [f:times] [termes]
+ \definetypescriptprefix [f:heros] [heros] \definetypescriptprefix [f:helvetica] [heros]
+ \definetypescriptprefix [f:bonum] [bonum] \definetypescriptprefix [f:bookman] [bonum]
+ \definetypescriptprefix [f:schola] [schola] \definetypescriptprefix [f:schoolbook] [schola]
+ \definetypescriptprefix [f:adventor][adventor] %definetypescriptprefix [f:adventor] [adventor]
+ \definetypescriptprefix [f:cursor] [cursor] \definetypescriptprefix [f:courier] [cursor]
+ \definetypescriptprefix [f:chorus] [chorus] \definetypescriptprefix [f:chancery] [chorus] % not the full set
+
+ % \starttypescript [serif,sans,mono] [adventor,bonum,cursor,heros,pagella,palatino,schola,termes]
+ % \starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name]
+
+ \starttypescript [serif,sans,mono] [adventor,bonum,bookman,cursor,courier,heros,helvetica,pagella,palatino,schola,schoolbook,termes,times]
+ \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]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [file:texgyre\typescriptprefix{f:\typescripttwo}-bolditalic] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [file:texgyre\typescriptprefix{f:\typescripttwo}-regular] [features=smallcaps]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [file:texgyre\typescriptprefix{f:\typescripttwo}-italic] [features=smallcaps]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [file:texgyre\typescriptprefix{f:\typescripttwo}-bold] [features=smallcaps]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [file:texgyre\typescriptprefix{f:\typescripttwo}-bolditalic] [features=smallcaps]
+ \stoptypescript
+
+ \starttypescript [serif,calligraphy] [chorus,chancery]
+ \definefontsynonym [TeXGyreChorus-MediumItalic] [file:texgyrechorus-mediumitalic] [features=default]
+ \stoptypescript
+
+ \definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella]
+ \definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes]
+ \definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros]
+ \definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum]
+ \definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola]
+ \definetypescriptprefix [n:adventor] [TeXGyreAdventor] %definetypescriptprefix [n:adventor] [TeXGyreAdventor]
+ \definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor]
+ \definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set
+
+ \starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name]
+ \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+ \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [SerifCaps]
+ \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SerifSlantedCaps] [SerifItalicCaps]
+ \definefontsynonym [SerifBoldSlantedCaps] [SerifBoldItalicCaps]
+ \definefontsynonym [SerifCapsCaps] [SerifCaps]
+ \stoptypescript
+
+ \starttypescript [serif] [chorus,chancery] [name]
+ \definefontsynonym [SerifMediumItalic] [TeXGyreChorus-MediumItalic]
+ \definefontsynonym [Serif] [SerifMediumItalic]
+ \definefontsynonym [SerifItalic] [SerifMediumItalic]
+ \definefontsynonym [SerifBold] [SerifMediumItalic]
+ \definefontsynonym [SerifBoldItalic] [SerifMediumItalic]
+ \definefontsynonym [SerifSlanted] [SerifMediumItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifMediumItalic]
+ \definefontsynonym [SerifCaps] [SerifMediumItalic]
+ \stoptypescript
+
+ \starttypescript [calligraphy] [chorus,chancery] [name]
+ \definefontsynonym [Calligraphy] [TeXGyreChorus-MediumItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [heros,helvetica,adventor] [name]
+ \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+
+ \definefontvariant [Sans][osf][Caps]
+ \definefontvariant [Sans][sc] [Caps]
+
+ \definefontsynonym [SansRegular] [Sans]
+ \definefontsynonym [SansRegularCaps] [SansCaps]
+ \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SansSlantedCaps] [SansItalicCaps]
+ \definefontsynonym [SansBoldSlantedCaps] [SansBoldItalicCaps]
+ \definefontsynonym [SansCapsCaps] [SansCaps]
+ \stoptypescript
+
+ \starttypescript [mono] [cursor,courier] [name]
+ \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+
+ \definefontvariant [Mono][osf][Caps]
+ \definefontvariant [Mono][sc] [Caps]
+
+ \definefontsynonym [MonoRegular] [Mono]
+ \definefontsynonym [MonoRegularCaps] [MonoCaps]
+ \definefontsynonym [MonoItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [MonoBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [MonoBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [MonoSlantedCaps] [MonoItalicCaps]
+ \definefontsynonym [MonoBoldSlantedCaps] [MonoBoldItalicCaps]
+ \definefontsynonym [MonoCapsCaps] [MonoCaps]
+ \stoptypescript
+
+ \starttypescript [times,termes]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [helvetica] [default] [rscale=0.9]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [mm] [math] [times] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [palatino,pagella]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.075]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.075]
+ \definetypeface [\typescriptone] [mm] [math] [palatino] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [schoolbook,schola]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.1]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [bookman,bonum]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.1]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [chancery,chorus]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [helvetica,heros]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.15]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [avantgarde,adventor]
+ \definetypeface [\typescriptone] [ss] [sans] [adventor] [default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [courier,cursor]
+ \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[xmath]
+
+ \starttypescript [math] [times] [all]
+ \definefontsynonym [Times-Roman-Upright] [txr]
+ \definefontsynonym [Times-Roman-Italic] [txi]
+ \definefontsynonym [Times-Roman-Slanted] [txsl]
+ \definefontsynonym [Times-Roman-Caps] [txsc]
+ \definefontsynonym [Times-Companion-Upright] [tcxr]
+ \definefontsynonym [Times-Companion-Italic] [tcxi]
+ \definefontsynonym [Times-Companion-Slanted] [tcxsl]
+ \definefontsynonym [Times-Math-Italic] [txmi]
+ \definefontsynonym [Times-Math-Symbols] [txsy]
+ \definefontsynonym [Times-Math-Extension] [txex]
+ \definefontsynonym [Times-Math-SymbolsA] [txsya]
+ \definefontsynonym [Times-Math-SymbolsB] [txsyb]
+ \definefontsynonym [Times-Math-SymbolsC] [txsyc]
+ \definefontsynonym [Times-Math-Italic-A] [txmia]
+ \definefontsynonym [Times-Math-Extension-A] [txexa]
+
+ \loadmapfile[original-youngryu-tx.map]
+ \usemathcollection[default]
+ \stoptypescript
+
+ \starttypescript [math] [palatino] [all]
+ \definefontsynonym [Palatino-Roman-Upright] [pxr]
+ \definefontsynonym [Palatino-Roman-Italic] [pxi]
+ \definefontsynonym [Palatino-Roman-Slanted] [pxsl]
+ \definefontsynonym [Palatino-Roman-Caps] [pxsc]
+ \definefontsynonym [Palatino-Companion-Upright] [pcxr]
+ \definefontsynonym [Palatino-Companion-Italic] [pcxi]
+ \definefontsynonym [Palatino-Companion-Slanted] [pcxsl]
+ \definefontsynonym [Palatino-Math-Italic] [pxmi]
+ \definefontsynonym [Palatino-Math-Symbols] [pxsy]
+ \definefontsynonym [Palatino-Math-Extension] [pxex]
+ \definefontsynonym [Palatino-Math-SymbolsA] [pxsya]
+ \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb]
+ \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc]
+ \definefontsynonym [Palatino-Math-Italic-A] [pxmia]
+ \definefontsynonym [Palatino-Math-Extension-A] [pxexa]
+
+ \loadmapfile[original-youngryu-px.map]
+ \usemathcollection[default]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[antykwa]
+
+ % Antykwa Torunska (GUST)
+
+ \starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
+ \definefontsynonym [AntykwaTorunska-Regular] [file:AntykwaTorunska-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-Italic] [file:AntykwaTorunska-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-Bold] [file:AntykwaTorunska-Bold] [features=default]
+ \definefontsynonym [AntykwaTorunska-BoldItalic] [file:AntykwaTorunska-BoldItalic] [features=default]
+ \definefontsynonym [AntykwaTorunska-Light] [file:AntykwaTorunskaLight-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-LightItalic] [file:AntykwaTorunskaLight-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-Medium] [file:AntykwaTorunskaMed-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-MedItalic] [file:AntykwaTorunskaMed-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondRegular] [file:AntykwaTorunskaCond-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondItalic] [file:AntykwaTorunskaCond-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondBold] [file:AntykwaTorunskaCond-Bold] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalic] [file:AntykwaTorunskaCond-BoldItalic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondLight] [file:AntykwaTorunskaCondLight-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondLightItalic] [file:AntykwaTorunskaCondLight-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondMedium] [file:AntykwaTorunskaCondMed-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondMedItalic] [file:AntykwaTorunskaCondMed-Italic] [features=default]
+
+ \definefontsynonym [AntykwaTorunska-Cap] [file:AntykwaTorunska-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [file:AntykwaTorunska-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [file:AntykwaTorunska-Bold] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [file:AntykwaTorunska-BoldItalic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-LightCap] [file:AntykwaTorunskaLight-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [file:AntykwaTorunskaLight-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [file:AntykwaTorunskaMed-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [file:AntykwaTorunskaMed-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondCap] [file:AntykwaTorunskaCond-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [file:AntykwaTorunskaCond-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [file:AntykwaTorunskaCond-Bold] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [file:AntykwaTorunskaCond-BoldItalic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [file:AntykwaTorunskaCondLight-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][file:AntykwaTorunskaCondLight-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [file:AntykwaTorunskaCondMed-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [file:AntykwaTorunskaCondMed-Italic] [features=smallcaps]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Italic] [mi-anttri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-light] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-cond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondItalic] [mi-anttcri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-lightcond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
+ \usemathcollection[default]
+ \loadmapfile[antt-rm.map]
+ \loadmapfile[antt-mi.map]
+ \loadmapfile[antt-sy.map]
+ \loadmapfile[antt-ex.map]
+ \stoptypescript
+
+ \starttypescript [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
+ \definetypeface[antykwa][rm][serif][\typescriptone] [default]
+ \definetypeface[antykwa][ss][sans] [modern] [default,rscale=1.05]
+ \definetypeface[antykwa][tt][mono] [modern] [default,rscale=1.05]
+ \definetypeface[antykwa][mm][math] [\typescriptone] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][lt][Light]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][cond][Cond]
+
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][dk][Dark]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][cond][Cond]
+
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][lt][Light]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][exp][Exp]
+
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][dk][Dark]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][exp][Exp]
+
+ \stoptypescript
+
+ % maybe no -Regular etc
+
+ \starttypescript [math] [antykwa-torunska-light] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-cond] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular]
+ \stoptypescript
+
+ \starttypescript [math] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight]
+ \stoptypescript
+
+ % Antykwa Poltawskiego (GUST)
+
+ % \starttypescript [serif] [antykwa-poltawskiego]
+ % \definefontsynonym [AntykwaPoltawskiego-Regular] [antpr]
+ % \definefontsynonym [AntykwaPoltawskiego-Bold] [antpb]
+ % \definefontsynonym [AntykwaPoltawskiego-Italic] [antpri]
+ % \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [antpbi]
+ % \stoptypescript
+
+ % \starttypescript [serif] [antykwa-poltawskiego] [name]
+ % \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular]
+ % \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold]
+ % \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic]
+ % \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic]
+ % \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold]
+ % \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold]
+ % \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular]
+ % \stoptypescript
+
+ \starttypescript [serif] [antykwa-poltawskiego,antykwa-poltawskiego-light]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Light] [\s!file:AntPoltLtCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-LightItalic] [\s!file:AntPoltLtCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Regular] [\s!file:AntPoltCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Italic] [\s!file:AntPoltCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Medium] [\s!file:AntPoltMdCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-MediumItalic] [\s!file:AntPoltMdCond-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Bold] [\s!file:AntPoltCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-BoldItalic] [\s!file:AntPoltCond-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsLight] [\s!file:AntPoltLtCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsLightItalic] [\s!file:AntPoltLtCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsRegular] [\s!file:AntPoltCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsItalic] [\s!file:AntPoltCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsMedium] [\s!file:AntPoltMdCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsMediumItalic] [\s!file:AntPoltMdCond-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsBold] [\s!file:AntPoltCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsBoldItalic] [\s!file:AntPoltCond-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Regular] [\s!file:AntPoltLtSemiCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Italic] [\s!file:AntPoltLtSemiCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Regular] [\s!file:AntPoltSemiCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Italic] [\s!file:AntPoltSemiCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Medium] [\s!file:AntPoltMdSemiCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-MediumItalic] [\s!file:AntPoltMdSemiCond-BdItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Bold] [\s!file:AntPoltSemiCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-BoldItalic] [\s!file:AntPoltSemiCond-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsRegular] [\s!file:AntPoltLtSemiCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsItalic] [\s!file:AntPoltLtSemiCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsRegular] [\s!file:AntPoltSemiCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsItalic] [\s!file:AntPoltSemiCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsMedium] [\s!file:AntPoltMdSemiCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsMediumItalic] [\s!file:AntPoltMdSemiCond-BdItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsBold] [\s!file:AntPoltSemiCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsBoldItalic] [\s!file:AntPoltSemiCond-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-Light] [\s!file:AntPoltLt-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-LightItalic] [\s!file:AntPoltLt-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Regular] [\s!file:AntPolt-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Italic] [\s!file:AntPolt-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Medium] [\s!file:AntPoltMd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-MediumItalic] [\s!file:AntPoltMd-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Bold] [\s!file:AntPolt-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\s!file:AntPolt-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-CapsLight] [\s!file:AntPoltLt-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsLightItalic] [\s!file:AntPoltLt-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsRegular] [\s!file:AntPolt-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsItalic] [\s!file:AntPolt-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsMedium] [\s!file:AntPoltMd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsMediumItalic] [\s!file:AntPoltMd-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsBold] [\s!file:AntPolt-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsBoldItalic] [\s!file:AntPolt-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Light] [\s!file:AntPoltLtSemiExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-LightItalic] [\s!file:AntPoltLtSemiExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Regular] [\s!file:AntPoltSemiExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Italic] [\s!file:AntPoltSemiExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Medium] [\s!file:AntPoltMdSemiExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-MediumItalic] [\s!file:AntPoltMdSemiExtd-BdItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Bold] [\s!file:AntPoltSemiExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-BoldItalic] [\s!file:AntPoltSemiExtd-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsLight] [\s!file:AntPoltLtSemiExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsLightItalic] [\s!file:AntPoltLtSemiExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsRegular] [\s!file:AntPoltSemiExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsItalic] [\s!file:AntPoltSemiExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsMedium] [\s!file:AntPoltMdSemiExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsMediumItalic] [\s!file:AntPoltMdSemiExtd-BdItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsBold] [\s!file:AntPoltSemiExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsBoldItalic] [\s!file:AntPoltSemiExtd-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Light] [\s!file:AntPoltLtExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-LightItalic] [\s!file:AntPoltLtExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Regular] [\s!file:AntPoltExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Italic] [\s!file:AntPoltExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Medium] [\s!file:AntPoltMdExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-MediumItalic] [\s!file:AntPoltMdExtd-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Bold] [\s!file:AntPoltExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-BoldItalic] [\s!file:AntPoltExtd-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsLight] [\s!file:AntPoltLtExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsLightItalic] [\s!file:AntPoltLtExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsRegular] [\s!file:AntPoltExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsItalic] [\s!file:AntPoltExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsMedium] [\s!file:AntPoltMdExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsMediumItalic] [\s!file:AntPoltMdExtd-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsBold] [\s!file:AntPoltExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsBoldItalic] [\s!file:AntPoltExtd-BoldItalic] [\s!features=\s!smallcaps]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-poltawskiego] [name]
+ \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular]
+ \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-BoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-CapsRegular]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-poltawskiego-light] [name]
+ \definefontsynonym [Serif] [AntykwaPoltawskiego-Light]
+ \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Medium]
+ \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-LightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-LightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-MediumItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-MediumItalic]
+ \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-CapsLight]
+ \stoptypescript
+
+ % condensed and extended variants are still missing
+
+ \starttypescript [antykwa-poltawskiego,antykwa-poltawskiego-light]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.05]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[iwona]
+
+ % maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic
+
+ % These names are a depressing mess. They have changed over time and are
+ % still not consistent. I'd expect Bold-Regular and Bold-Italic.
+
+ \starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond]
+
+ \definefontsynonym [Iwona-Regular] [file:Iwona-Regular] [features=default]
+ \definefontsynonym [Iwona-Italic] [file:Iwona-Italic] [features=default]
+ \definefontsynonym [Iwona-Bold] [file:Iwona-Bold] [features=default]
+ \definefontsynonym [Iwona-BoldItalic] [file:Iwona-BoldItalic] [features=default]
+ \definefontsynonym [Iwona-Light-Regular] [file:IwonaLight-Regular] [features=default]
+ \definefontsynonym [Iwona-Light-Italic] [file:IwonaLight-Italic] [features=default]
+ \definefontsynonym [Iwona-Medium-Regular] [file:IwonaMedium-Regular] [features=default]
+ \definefontsynonym [Iwona-Medium-Italic] [file:IwonaMedium-Italic] [features=default]
+ \definefontsynonym [Iwona-Heavy-Regular] [file:IwonaHeavy-Regular] [features=default]
+ \definefontsynonym [Iwona-Heavy-Italic] [file:IwonaHeavy-Italic] [features=default]
+
+ \definefontsynonym [Iwona-CapsRegular] [file:Iwona-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsItalic] [file:Iwona-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsBold] [file:Iwona-Bold] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsBoldItalic] [file:Iwona-BoldItalic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsLight] [file:IwonaLight-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsLight-Italic] [file:IwonaLight-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsMedium] [file:IwonaMedium-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsMedium-Italic] [file:IwonaMedium-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsHeavy] [file:IwonaHeavy-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsHeavy-Italic] [file:IwonaHeavy-Italic] [features=smallcaps]
+
+ \definefontsynonym [Iwona-CondRegular] [file:IwonaCond-Regular] [features=default]
+ \definefontsynonym [Iwona-CondItalic] [file:IwonaCond-Italic] [features=default]
+ \definefontsynonym [Iwona-CondBold] [file:IwonaCond-Bold] [features=default]
+ \definefontsynonym [Iwona-CondBoldItalic] [file:IwonaCond-BoldItalic] [features=default]
+ \definefontsynonym [Iwona-CondLight-Regular] [file:IwonaCondLight-Regular] [features=default]
+ \definefontsynonym [Iwona-CondLight-Italic] [file:IwonaCondLight-Italic] [features=default]
+ \definefontsynonym [Iwona-CondMedium-Regular] [file:IwonaCondMedium-Regular] [features=default]
+ \definefontsynonym [Iwona-CondMedium-Italic] [file:IwonaCondMedium-Italic] [features=default]
+ \definefontsynonym [Iwona-CondHeavy-Regular] [file:IwonaCondHeavy-Regular] [features=default]
+ \definefontsynonym [Iwona-CondHeavy-Italic] [file:IwonaCondHeavy-Italic] [features=default]
+
+ \definefontsynonym [Iwona-CapsCondRegular] [file:IwonaCond-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondItalic] [file:IwonaCond-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondBold] [file:IwonaCond-Bold] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondBoldItalic] [file:IwonaCond-BoldItalic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondLight-Regular] [file:IwonaCondLight-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondLight-Italic] [file:IwonaCondLight-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondMedium-Regular][file:IwonaCondMedium-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondMedium-Italic] [file:IwonaCondMedium-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondHeavy-Regular] [file:IwonaCondHeavy-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsCondHeavy-Italic] [file:IwonaCondHeavy-Italic] [features=smallcaps]
+
+ \stoptypescript
+
+ \starttypescript [math] [iwona] [default]
+ \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar]
+ \definefontsynonym [Iwona-Math-Letters-Italic] [mi-iwonari]
+ \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz]
+ \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-light] [default]
+ \definefontsynonym [Iwona-Math-Letters-Light-Regular] [rm-iwonal]
+ \definefontsynonym [Iwona-Math-Letters-Light-Italic] [mi-iwonali]
+ \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz]
+ \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-medium] [default]
+ \definefontsynonym [Iwona-Math-Letters-Medium-Regular][rm-iwonam]
+ \definefontsynonym [Iwona-Math-Letters-Medium-Italic] [mi-iwonami]
+ \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz]
+ \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-heavy] [default]
+ \definefontsynonym [Iwona-Math-Letters-Heavy-Regular] [rm-iwonah]
+ \definefontsynonym [Iwona-Math-Letters-Heavy-Italic] [mi-iwonahi]
+ \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz]
+ \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah]
+ \stoptypescript
+
+ \starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default]
+ \usemathcollection[default]
+ \loadmapfile[iwona-rm.map]
+ \loadmapfile[iwona-mi.map]
+ \loadmapfile[iwona-sy.map]
+ \loadmapfile[iwona-ex.map]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Light-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Light-Italic]
+ \definefontsynonym [SansBold] [Iwona-Medium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Medium-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsLight]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Italic]
+ \definefontsynonym [SansBold] [Iwona-Bold]
+ \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalic] [Iwona-CapsItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Medium-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Medium-Italic]
+ \definefontsynonym [SansBold] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsMedium-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-heavy] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansBold] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-heavy-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CondLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CondMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondMedium-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondLight-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondLight-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondMedium-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-cond-caps,iwona-light-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondRegular]
+ \definefontsynonym [SansItalic] [Iwona-CondItalic]
+ \definefontsynonym [SansBold] [Iwona-CondBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-cond-caps,iwona-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondRegular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondMedium-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CondMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CondHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondHeavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondMedium-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-cond-caps,iwona-medium-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-light] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Light-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Light]
+ \stoptypescript
+
+ \starttypescript [math] [iwona] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-medium] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Medium-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium]
+ \stoptypescript
+
+ \starttypescript [math] [iwona-heavy] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-Heavy-Italic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy]
+ \stoptypescript
+
+ \starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium]
+ \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default]
+ \definetypeface[\typescriptone][rm][serif][modern] [default]
+ \definetypeface[\typescriptone][tt][mono] [modern] [default]
+ \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][text=ss]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[kurier]
+
+ \starttypescript [sans] [kurier-light,kurier,kurier-medium]
+ \definefontsynonym[Kurier-Light] [kurierl]
+ \definefontsynonym[Kurier-Regular] [kurierr]
+ \definefontsynonym[Kurier-Medium] [kurierm]
+ \definefontsynonym[Kurier-Bold] [kurierb]
+ \definefontsynonym[Kurier-Heavy] [kurierh]
+ \definefontsynonym[Kurier-LightItalic] [kurierli]
+ \definefontsynonym[Kurier-Italic] [kurierri]
+ \definefontsynonym[Kurier-MediumItalic] [kuriermi]
+ \definefontsynonym[Kurier-BoldItalic] [kurierbi]
+ \definefontsynonym[Kurier-HeavyItalic] [kurierhi]
+ \stoptypescript
+
+ \starttypescript [math] [kurier] [default]
+ \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr]
+ \definefontsynonym [Kurier-Math-Letters-Italic] [mi-kurierri]
+ \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz]
+ \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-light] [default]
+ \definefontsynonym [Kurier-Math-Letters-Light-Regular] [rm-kurierl]
+ \definefontsynonym [Kurier-Math-Letters-Light-Italic] [mi-kurierli]
+ \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz]
+ \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-medium] [default]
+ \definefontsynonym [Kurier-Math-Letters-Medium-Regular] [rm-kurierm]
+ \definefontsynonym [Kurier-Math-Letters-Medium-Italic] [mi-kuriermi]
+ \definefontsynonym [Kurier-Math-Symbols-Medium-Regular] [sy-kuriermz]
+ \definefontsynonym [Kurier-Math-Extension-Medium] [ex-kurierm]
+ \stoptypescript
+
+ \starttypescript [math] [kurier,kurier-light,kurier-medium] [default]
+ \loadmapfile[kurier-rm.map]
+ \loadmapfile[kurier-mi.map]
+ \loadmapfile[kurier-sy.map]
+ \loadmapfile[kurier-ex.map]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Light-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Light-Italic]
+ \definefontsynonym [SansBold] [Kurier-Medium-Regular]
+ \definefontsynonym [SansBoldItalic] [Kurier-Medium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Italic]
+ \definefontsynonym [SansBold] [Kurier-Bold]
+ \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Medium-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Medium-Italic]
+ \definefontsynonym [SansBold] [Kurier-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Kurier-Heavy-Italic]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-light] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light-Regular]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-Light-Italic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Light]
+ \stoptypescript
+
+ \starttypescript [math] [kurier] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [kurier-medium] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium-Regular]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-Medium-Italic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[symbols]
+
+ \starttypescript
+ \definefontsynonym [ZapfDingbats] [uzdr]
+ \definefontsynonym [RalfSmithFormalScript] [rsfs10]
+ \definefontsynonym [MartinVogel] [fmvr8x]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[charter]
+
+ % is this ok?
+
+ \starttypescript [serif] [charter]
+ \definefontsynonym [Charter-Roman] [name:CharterBT-Roman] % or: [bchr8a]
+ \definefontsynonym [Charter-Italic] [name:CharterBT-Italic] % or: [bchri8a]
+ \definefontsynonym [Charter-Bold] [name:CharterBT-Bold] % or: [bchb8a]
+ \definefontsynonym [Charter-BoldItalic] [name:CharterBT-BoldItalic] % or: [bchbi8a]
+ \definefontsynonym [Charter-Slanted] [name:CharterBT-Italic] % or: [bchri8a]
+ \definefontsynonym [Charter-BoldSlanted] [name:CharterBT-BoldItalic] % or: [bchbi8a]
+ \definefontsynonym [Charter-Roman-Caps] [Charter-Roman] % not present
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[postscript]
+
+ \starttypescript [postscript]
+ \definetypeface [postscript] [rm] [serif] [times] [default]
+ \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=0.9]
+ \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1]
+ \definetypeface [postscript] [mm] [math] [times] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[lucida]
+
+ \definetypescriptprefix [e:ec] [8t]
+ \definetypescriptprefix [e:texnansi] [8y]
+ \definetypescriptprefix [e:8r] [8r]
+
+ % Lucida Bright
+
+ \starttypescript [serif] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lbr] [hlhr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright
+ \definefontsynonym [\typescriptthree-lbd] [hlhb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Demi
+ \definefontsynonym [\typescriptthree-lbi] [hlhri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Italic
+ \definefontsynonym [\typescriptthree-lbdi] [hlhbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-DemiItalic
+ \definefontsynonym [\typescriptthree-lbsl] [hlhro\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Oblique
+ \definefontsynonym [\typescriptthree-lbrsc] [hlhrc\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBrightSmallcaps
+ \definefontsynonym [\typescriptthree-lbdsc] [hlhbc\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBrightSmallcaps-Demi
+
+ \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Demi] [\typescriptthree-lbd] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Italic] [\typescriptthree-lbi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-DemiItalic] [\typescriptthree-lbdi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Oblique] [\typescriptthree-lbsl] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBrightSmallcaps] [\typescriptthree-lbrsc] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typescriptthree-lbdsc] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Bright Sans
+
+ \starttypescript [sans] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lsr] [hlsr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans
+ \definefontsynonym [\typescriptthree-lsd] [hlsb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Demi
+ \definefontsynonym [\typescriptthree-lsb] [hlsu\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Bold
+ \definefontsynonym [\typescriptthree-lsi] [hlsri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Italic
+ \definefontsynonym [\typescriptthree-lsdi] [hlsbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-DemiItalic
+ \definefontsynonym [\typescriptthree-lsbi] [hlsui\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-BoldItalic
+
+ \definefontsynonym [LucidaSans] [\typescriptthree-lsr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Demi] [\typescriptthree-lsd] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Bold] [\typescriptthree-lsb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Italic] [\typescriptthree-lsi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-DemiItalic] [\typescriptthree-lsdi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-BoldItalic] [\typescriptthree-lsbi] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Bright Typewriter
+
+ \starttypescript [mono] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lbtr] [hlcrt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriter
+ \definefontsynonym [\typescriptthree-lbtb] [hlcbt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterBold
+ \definefontsynonym [\typescriptthree-lbto] [hlcrot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterOblique
+ \definefontsynonym [\typescriptthree-lbtbo] [hlcbot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterBoldOblique
+
+ \definefontsynonym [LucidaTypewriter] [\typescriptthree-lbtr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaTypewriterBold] [\typescriptthree-lbtb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaTypewriterOblique] [\typescriptthree-lbto] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaTypewriterBoldOblique] [\typescriptthree-lbtbo] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Bright Sans Typewriter
+
+ \starttypescript [mono] [lucida] [ec,texnansi,8r]
+ \definefontsynonym [\typescriptthree-lstr] [hlsrt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Typewriter
+ \definefontsynonym [\typescriptthree-lstb] [hlsbt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterBold
+ \definefontsynonym [\typescriptthree-lsto] [hlsrot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterOblique
+ \definefontsynonym [\typescriptthree-lstbo] [hlsbot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterBoldOblique
+
+ \definefontsynonym [LucidaSans-Typewriter] [\typescriptthree-lstr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterBold] [\typescriptthree-lstb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterOblique] [\typescriptthree-lsto] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typescriptthree-lstbo] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Calligraphy
+
+ \starttypescript [calligraphy] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbc] [hlcrie\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCalligraphy-Italic
+
+ \definefontsynonym [LucidaCalligraphy-Italic] [\typescriptthree-lbc] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Casual
+
+ \starttypescript [casual] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbkr] [hlcrn\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCasual
+ \definefontsynonym [\typescriptthree-lbki] [hlcrin\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCasual-Italic
+
+ \definefontsynonym [LucidaCasual] [\typescriptthree-lbkr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaCasual-Italic] [\typescriptthree-lbki] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Handwriting
+
+ \starttypescript [handwriting] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbh] [hlcriw\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaHandwriting-Italic
+
+ \definefontsynonym [LucidaHandwriting-Italic] [\typescriptthree-lbh] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ % Lucida Fax
+
+ \starttypescript [fax] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lfr] [hlxr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax
+ \definefontsynonym [\typescriptthree-lfd] [hlxb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-Demi
+ \definefontsynonym [\typescriptthree-lfi] [hlxri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-Italic
+ \definefontsynonym [\typescriptthree-lfdi] [hlxbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-DemiItalic
+
+ \definefontsynonym [LucidaFax] [\typescriptthree-lfr] [encoding=\typescriptthree] % LucidaFax
+ \definefontsynonym [LucidaFax-Demi] [\typescriptthree-lfd] [encoding=\typescriptthree] % LucidaFax-Demi
+ \definefontsynonym [LucidaFax-Italic] [\typescriptthree-lfi] [encoding=\typescriptthree] % LucidaFax-Italic
+ \definefontsynonym [LucidaFax-DemiItalic] [\typescriptthree-lfdi] [encoding=\typescriptthree] % LucidaFax-DemiItalic
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [blackletter] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [\typescriptthree-lbl] [hlcrf\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBlackletter
+
+ \definefontsynonym [LucidaBlackletter] [\typescriptthree-lbl] [encoding=\typescriptthree]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r]
+ \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [math] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaBright] [hlcrm] % [encoding=\typescriptthree]
+ \definefontsynonym [LucidaNewMath-AltItalic] [hlcrima]
+ \definefontsynonym [LucidaNewMath-Arrows] [hlcra]
+ \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
+ \definefontsynonym [LucidaNewMath-Roman] [hlcrm]
+ \definefontsynonym [LucidaNewMath-Italic] [hlcrim]
+ \definefontsynonym [LucidaNewMath-Symbol] [hlcry]
+ \definefontsynonym [LucidaBlackletter] [hlcrf8y] % what a mess
+ \loadmapfile [lucida.map]
+ \stoptypescript
+
+ \starttypescript [boldmath,bfmath] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaNewMath-AltDemiItalic] [hlcdima]
+ \definefontsynonym [LucidaNewMath-Arrows-Demi] [hlcda]
+ \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
+ \definefontsynonym [LucidaNewMath-Demi] [hlcdm]
+ \definefontsynonym [LucidaNewMath-DemiItalic] [hlcdim]
+ \definefontsynonym [LucidaNewMath-Symbol-Demi] [hlcdy]
+ \loadmapfile [lucida.map]
+ \stoptypescript
+
+ % Lucida Bright
+
+ \starttypescript [serif] [lucida] [name]
+ \definefontsynonym [Serif] [LucidaBright]
+ \definefontsynonym [SerifBold] [LucidaBright-Demi]
+ \definefontsynonym [SerifItalic] [LucidaBright-Italic]
+ \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifSlanted] [LucidaBright-Oblique]
+ \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps]
+ \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi]
+ \stoptypescript
+
+ % Lucida Bright Sans
+
+ \starttypescript [sans] [lucida] [name]
+ \definefontsynonym [Sans] [LucidaSans]
+ \definefontsynonym [SansBold] [LucidaSans-Demi]
+ \definefontsynonym [SansItalic] [LucidaSans-Italic]
+ \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansSlanted] [LucidaSans-Italic]
+ \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansCaps] [LucidaSans]
+ \stoptypescript
+
+ % Lucida Bright Typewriter
+
+ % only one family may be used as mono; sans used to be that since the beginning,
+ % so we keep using that as default
+
+ % \starttypescript [mono] [lucida] [name]
+ % \definefontsynonym [Mono] [LucidaTypewriter]
+ % \definefontsynonym [MonoBold] [LucidaTypewriterBold]
+ % \definefontsynonym [MonoItalic] [LucidaTypewriterOblique]
+ % \definefontsynonym [MonoBoldItalic] [LucidaTypewriterBoldOblique]
+ % \definefontsynonym [MonoSlanted] [LucidaTypewriterOblique]
+ % \definefontsynonym [MonoBoldSlanted] [LucidaTypewriterBoldOblique]
+ % \definefontsynonym [MonoCaps] [LucidaTypewriter]
+ % \stoptypescript
+
+ % Lucida Bright Sans Typewriter
+
+ \starttypescript [mono] [lucida] [name]
+ \definefontsynonym [Mono] [LucidaSans-Typewriter]
+ \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold]
+ \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoCaps] [LucidaSans-Typewriter]
+ \stoptypescript
+
+ % Lucida Calligraphy
+
+ \starttypescript [calligraphy] [lucida] [name]
+ \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic]
+ \stoptypescript
+
+ % Lucida Casual
+
+ % \starttypescript [casual] [lucida] [name]
+ % % LucidaCasual
+ % % LucidaCasual-Italic
+ % \stoptypescript
+
+ % Lucida Handwriting
+
+ \starttypescript [handwriting] [lucida] [name]
+ \definefontsynonym [Handwriting] [LucidaHandwriting-Italic]
+ \stoptypescript
+
+ % Lucida Fax
+ %
+ % \starttypescript [fax] [lucida] [name]
+ % \definefontsynonym [FaksRegular] [LucidaFax]
+ % \definefontsynonym [FaksBold] [LucidaFax-Demi]
+ % \definefontsynonym [FaksItalic] [LucidaFax-Italic]
+ % \definefontsynonym [FaksBoldItalic] [LucidaFax-DemiItalic]
+ % \stoptypescript
+
+ % Lucida Black Letter
+ %
+ % \starttypescript [blackletter] [lucida] [name]
+ % \definefontsynonym [Blackletter] [LucidaBlackletter]
+ % \stoptypescript
+
+ % Lucida Math
+
+ \starttypescript [math] [lucida] [name]
+ \definefontsynonym [MathRoman] [LucidaBright]
+ \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalic] [LucidaNewMath-AltItalic]
+ \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol]
+ \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows]
+ \definefontsynonym [MathBeta] [LucidaNewMath-Roman]
+ \stoptypescript
+
+ \starttypescript [math] [lucida] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathAlpha]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [MathSymbol] % math caligraphic !
+ \stoptypescript
+
+ \starttypescript [boldmath] [lucida] [name]
+ \definefontsynonym [MathRoman] [LucidaBright-Demi]
+ \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalic] [LucidaNewMath-AltDemiItalic]
+ \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol-Demi]
+ \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows-Demi]
+ \definefontsynonym [MathBeta] [LucidaNewMath-Demi]
+ \stoptypescript
+
+ \starttypescript [bfmath] [lucida] [name]
+ \definefontsynonym [MathRomanBold] [LucidaNewMath-Demi]
+ \definefontsynonym [MathExtensionBold] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalicBold] [LucidaNewMath-AltDemiItalic]
+ \definefontsynonym [MathSymbolBold] [LucidaNewMath-Symbol-Demi]
+ \definefontsynonym [MathAlphaBold] [LucidaNewMath-Arrows-Demi]
+ \definefontsynonym [MathBetaBold] [LucidaNewMath-Demi]
+ \stoptypescript
+
+ \starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r,uc]
+ \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [lucida] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [math] [lucida] [default] [encoding=\typescripttwo]
+ \stoptypescript
+
+ \starttypescript [lucidabfm] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
+ \stoptypescript
+
+ \starttypescript [lucidaboldmath] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
+ \stoptypescript
+
+ \starttypescript [lucidabfm] [texnansi,ec,8r,uc]
+ \definetypeface [lucidabfm] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidabfm] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+ \starttypescript [lucidaboldmath] [texnansi,ec,8r,uc]
+ \definetypeface [lucidaboldmath] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
+ \loadmapfile[lucida.map]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-otf.mkiv b/tex/context/base/type-otf.mkiv
new file mode 100644
index 000000000..486fa1a57
--- /dev/null
+++ b/tex/context/base/type-otf.mkiv
@@ -0,0 +1,1796 @@
+%D \module
+%D [ file=type-otf,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Opentype Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Actually, \LUATEX\ does not need all these definitions since it can
+%D consult its database. However, here we use the names that we used
+%D in good old \TEX, and these may differ a bit. Here we also see
+%D some oldstyle definitions which normally are done with features.
+
+
+% \starttypescriptcollection[myfonts]
+%
+% \starttypescript [serif] [myserif] [name]
+% \setups[font:fallback:serif]
+% \definefontsynonym [Serif] [file:myserif.ttf] [features=default]
+% \definefontsynonym [SerifBold] [file:myserifbold.ttf] [features=default]
+% \definefontsynonym [SerifItalic] [file:myserifitalic.ttf] [features=default]
+% \definefontsynonym [SerifBoldItalic] [file:myserifbolditalic.ttf] [features=default]
+% \stoptypescript
+%
+% \starttypescript[myfont]
+% \definetypeface [myfont] [rm] [serif] [myserif] [default]
+% \stoptypescript
+%
+% \stoptypescriptcollection
+%
+% \setupbodyfont[myfont]
+
+\starttypescriptcollection[fallback]
+
+\starttypescript [fallback]
+ \definetypeface [] [rm] [serif] [modern] [computer-modern]
+ \definetypeface [] [ss] [sans] [modern] [computer-modern]
+ \definetypeface [] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [] [mm] [math] [modern] [computer-modern]
+ \quittypescriptscanning
+\stoptypescript
+
+% faster
+%
+% \starttypescript [fallback]
+% \definetypeface [] [rm] [serif] [modern] [default]
+% \definetypeface [] [ss] [sans] [modern] [default]
+% \definetypeface [] [tt] [mono] [modern] [default]
+% \definetypeface [] [mm] [math] [modern] [default]
+% \quittypescriptscanning
+% \stoptypescript
+
+\stoptypescriptcollection
+
+% if a fontname equals the filename, then use
+%
+% \setupfontsynonym [LMRoman10-DemiOblique] [\s!features=\s!default] % file is lowercase, so fails
+% \definefontsynonym [LMRoman10-DemiOblique] [\s!name:LMRoman10-DemiOblique] [\s!features=\s!default]
+% \definefontsynonym [LMRoman10-DemiOblique] [lmroman10-demioblique] [\s!features=\s!default]
+
+\unprotect
+
+% \starttypescript [math] [modern,computer-modern,latin-modern]
+% \definefontsynonym[MathSymbol][MathSymbol-Regular@symbol-math]
+% \loadfontgoodies[symbol-math]
+% \stoptypescript
+
+\starttypescriptcollection[latinmodern]
+
+ %D The names have changed (again) ... but I will not change the symbolic names
+ %D any more. Filename changes will be catched in luatex (fallbacks) but not in
+ %D other tex's.
+
+ \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \definefontsynonym [LMRoman5-Regular] [\s!file:lmroman5-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman6-Regular] [\s!file:lmroman6-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman7-Regular] [\s!file:lmroman7-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman8-Regular] [\s!file:lmroman8-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman9-Regular] [\s!file:lmroman9-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-Regular] [\s!file:lmroman10-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman12-Regular] [\s!file:lmroman12-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman17-Regular] [\s!file:lmroman17-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman5-Bold] [\s!file:lmroman5-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman6-Bold] [\s!file:lmroman6-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman7-Bold] [\s!file:lmroman7-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman8-Bold] [\s!file:lmroman8-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman9-Bold] [\s!file:lmroman9-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-Bold] [\s!file:lmroman10-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman12-Bold] [\s!file:lmroman12-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman7-Italic] [\s!file:lmroman7-italic] [\s!features=\s!default]
+ \definefontsynonym [LMRoman8-Italic] [\s!file:lmroman8-italic] [\s!features=\s!default]
+ \definefontsynonym [LMRoman9-Italic] [\s!file:lmroman9-italic] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-Italic] [\s!file:lmroman10-italic] [\s!features=\s!default]
+ \definefontsynonym [LMRoman12-Italic] [\s!file:lmroman12-italic] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-BoldItalic] [\s!file:lmroman10-bolditalic] [\s!features=\s!default]
+ \definefontsynonym [LMRoman8-Oblique] [\s!file:lmromanslant8-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman9-Oblique] [\s!file:lmromanslant9-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-Oblique] [\s!file:lmromanslant10-regular][\s!features=\s!default]
+ \definefontsynonym [LMRoman12-Oblique] [\s!file:lmromanslant12-regular][\s!features=\s!default]
+ \definefontsynonym [LMRoman17-Oblique] [\s!file:lmromanslant17-regular][\s!features=\s!default]
+ \definefontsynonym [LMRoman10-BoldOblique] [\s!file:lmromanslant10-bold] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-Demi] [\s!file:lmromandemi10-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-DemiOblique] [\s!file:lmromandemi10-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-CapsRegular] [\s!file:lmromancaps10-regular] [\s!features=\s!default] % features=smallcaps?
+ \definefontsynonym [LMRoman10-CapsOblique] [\s!file:lmromancaps10-oblique] [\s!features=\s!default]
+
+ \definefontsynonym [LMRoman10-Dunhill] [\s!file:lmromandunh10-regular] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-DunhillOblique] [\s!file:lmromandunh10-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMRoman10-Unslanted] [\s!file:lmromanunsl10-regular] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \definefontsynonym [LMSans8-Regular] [\s!file:lmsans8-regular] [\s!features=\s!default]
+ \definefontsynonym [LMSans9-Regular] [\s!file:lmsans9-regular] [\s!features=\s!default]
+ \definefontsynonym [LMSans10-Regular] [\s!file:lmsans10-regular] [\s!features=\s!default]
+ \definefontsynonym [LMSans12-Regular] [\s!file:lmsans12-regular] [\s!features=\s!default]
+ \definefontsynonym [LMSans17-Regular] [\s!file:lmsans17-regular] [\s!features=\s!default]
+ \definefontsynonym [LMSans10-Bold] [\s!file:lmsans10-bold] [\s!features=\s!default]
+ \definefontsynonym [LMSans8-Oblique] [\s!file:lmsans8-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMSans9-Oblique] [\s!file:lmsans9-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMSans10-Oblique] [\s!file:lmsans10-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMSans12-Oblique] [\s!file:lmsans12-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMSans17-Oblique] [\s!file:lmsans17-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMSans10-BoldOblique] [\s!file:lmsans10-boldoblique] [\s!features=\s!default]
+
+ \definefontsynonym [LMSans10-DemiCondensed] [\s!file:lmsansdemicond10-regular] [\s!features=\s!default]
+ \definefontsynonym [LMSans10-DemiCondensedOblique] [\s!file:lmsansdemicond10-oblique] [\s!features=\s!default]
+
+ \definefontsynonym [LMSansQuotation8-Regular] [\s!file:lmsansquot8-regular] [\s!features=\s!default]
+ \definefontsynonym [LMSansQuotation8-Bold] [\s!file:lmsansquot8-bold] [\s!features=\s!default]
+ \definefontsynonym [LMSansQuotation8-Oblique] [\s!file:lmsansquot8-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMSansQuotation8-BoldOblique] [\s!file:lmsansquot8-boldoblique] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,modern-variable,modern-condensed,latin-modern,latin-modern-variable,latin-modern-condensed,computer-modern]
+
+ \definefontsynonym [LMTypewriter8-Regular] [\s!file:lmmono8-regular] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter9-Regular] [\s!file:lmmono9-regular] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-Regular] [\s!file:lmmono10-regular] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter12-Regular] [\s!file:lmmono12-regular] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-Italic] [\s!file:lmmono10-italic] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-Oblique] [\s!file:lmmonoslant10-regular] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-CapsRegular] [\s!file:lmmonocaps10-regular] [\s!features=\s!none] % features=smallcaps?
+ \definefontsynonym [LMTypewriter10-CapsOblique] [\s!file:lmmonocaps10-oblique] [\s!features=\s!none]
+
+ \definefontsynonym [LMTypewriter10-Light] [\s!file:lmmonolt10-regular] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-LightOblique] [\s!file:lmmonolt10-oblique] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-LightCondensed] [\s!file:lmmonoltcond10-regular] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-LightCondensedOblique] [\s!file:lmmonoltcond10-oblique] [\s!features=\s!none]
+
+ \definefontsynonym [LMTypewriter10-Dark] [\s!file:lmmonolt10-bold] [\s!features=\s!none]
+ \definefontsynonym [LMTypewriter10-DarkOblique] [\s!file:lmmonolt10-boldoblique] [\s!features=\s!none]
+
+ \definefontsynonym [LMTypewriterVarWd10-Regular] [\s!file:lmmonoproplt10-regular] [\s!features=\s!default]
+ \definefontsynonym [LMTypewriterVarWd10-Oblique] [\s!file:lmmonoproplt10-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMTypewriterVarWd10-Light] [\s!file:lmmonoprop10-regular] [\s!features=\s!default]
+ \definefontsynonym [LMTypewriterVarWd10-LightOblique] [\s!file:lmmonoprop10-oblique] [\s!features=\s!default]
+ \definefontsynonym [LMTypewriterVarWd10-Dark] [\s!file:lmmonoproplt10-bold] [\s!features=\s!default]
+ \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\s!file:lmmonoproplt10-boldoblique] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern,computer-modern]
+ \definefontsynonym[LMMathRoman5-Regular] [LMMath5-Regular@lmroman5-math]
+ \definefontsynonym[LMMathRoman6-Regular] [LMMath6-Regular@lmroman6-math]
+ \definefontsynonym[LMMathRoman7-Regular] [LMMath7-Regular@lmroman7-math]
+ \definefontsynonym[LMMathRoman8-Regular] [LMMath8-Regular@lmroman8-math]
+ \definefontsynonym[LMMathRoman9-Regular] [LMMath9-Regular@lmroman9-math]
+ \definefontsynonym[LMMathRoman10-Regular][LMMath10-Regular@lmroman10-math]
+ \definefontsynonym[LMMathRoman12-Regular][LMMath12-Regular@lmroman12-math]
+ \definefontsynonym[LMMathRoman17-Regular][LMMath17-Regular@lmroman17-math]
+
+ \definefontsynonym[LMMathRoman5-Bold] [LMMath10-Bold@lmroman10-boldmath]
+ \definefontsynonym[LMMathRoman6-Bold] [LMMath10-Bold@lmroman10-boldmath]
+ \definefontsynonym[LMMathRoman7-Bold] [LMMath10-Bold@lmroman10-boldmath]
+ \definefontsynonym[LMMathRoman8-Bold] [LMMath10-Bold@lmroman10-boldmath]
+ \definefontsynonym[LMMathRoman9-Bold] [LMMath10-Bold@lmroman10-boldmath]
+ \definefontsynonym[LMMathRoman10-Bold] [LMMath10-Bold@lmroman10-boldmath]
+ \definefontsynonym[LMMathRoman12-Bold] [LMMath10-Bold@lmroman10-boldmath]
+ \definefontsynonym[LMMathRoman17-Bold] [LMMath10-Bold@lmroman10-boldmath]
+
+ % are these needed?
+ %
+ % \definefontsynonym[MathRoman][LMMath10-Regular@lmroman10-math]
+ % \definefontsynonym[MathBold] [LMMath10-Bold@lmroman10-boldmath]
+
+ \loadfontgoodies[lm-math]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,latin-modern,computer-modern] [name]
+ \definefontsynonym [Serif] [LMRoman-Regular]
+ \definefontsynonym [SerifBold] [LMRoman-Bold]
+ \definefontsynonym [SerifItalic] [LMRoman-Italic]
+ \definefontsynonym [SerifSlanted] [LMRoman-Oblique]
+ \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [SerifCaps] [LMRoman-CapsRegular]
+ \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern,computer-modern] [name]
+ \definefontsynonym [Sans] [LMSans-Regular]
+ \definefontsynonym [SansBold] [LMSans-Bold]
+ \definefontsynonym [SansItalic] [LMSans-Oblique]
+ \definefontsynonym [SansSlanted] [LMSans-Oblique]
+ \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [SansCaps] [LMSans-Regular]
+ \definefontsynonym [SansCapsSlanted] [LMSans-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,computer-modern] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Regular]
+ \definefontsynonym [MonoBold] [LMTypewriter-Dark]
+ \definefontsynonym [MonoItalic] [LMTypewriter-Italic]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern,computer-modern] [name]
+ \definefontsynonym [MathRoman] [LMMathRoman-Regular]
+ %definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ %definefontsynonym [MathItalic] [LMMathItalic-Italic]
+ %definefontsynonym [MathSymbol] [LMMathSymbols-Italic]
+ \stoptypescript
+
+ \starttypescript [serif] [modern-variable,latin-modern-variable] [name]
+ \definefontsynonym [Serif] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern-condensed,latin-modern-condensed,modern-light-condensed,latin-modern-light-condensed] [name]
+ \definefontsynonym [Mono] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed]
+ \stoptypescript
+
+ \starttypescript [mono] [modern-light,latin-modern-light] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Light]
+ \definefontsynonym [MonoBold] [LMTypewriter-Light]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light]
+ \definefontsynonym [MonoCaps] [LMTypewriter-Light]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light]
+ \stoptypescript
+
+ % Later we will map the real fonts, here we just map synonyms.
+
+ \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique]
+ \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold]
+ \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic]
+ \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique]
+ \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular]
+ \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique]
+ \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular]
+ \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic]
+ \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \definefontsynonym [LMSans-Regular] [LMSans10-Regular]
+ \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique]
+ \definefontsynonym [LMSans-Bold] [LMSans10-Bold]
+ \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed]
+ \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique]
+ \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,modern-variable,latin-modern-variable,modern-condensed,latin-modern-condensed]
+ \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular]
+ \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique]
+ \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light]
+ \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique]
+ \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed]
+ \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique]
+ \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark]
+ \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique]
+ \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular]
+ \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic]
+ \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular]
+ \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light]
+ \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique]
+ \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark]
+ \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique]
+ \stoptypescript
+
+ \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \definefontsynonym [ComputerModern] [LMRoman-Regular]
+ \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic]
+ \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique]
+ \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold]
+ \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular]
+ \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \definefontsynonym [ComputerModernSans] [LMSans-Regular]
+ \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold]
+ \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular]% [LMSans-CapsRegular]
+ \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique]% [LMSans-CapsOblique]
+ \stoptypescript
+
+ \starttypescript [mono] [modern,latin-modern,computer-modern]
+ \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular]
+ \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic]
+ \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique]
+ \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark]
+ \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique]
+ \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular]
+ \stoptypescript
+
+ \starttypescript [mono] [modern-light,latin-modern-light]
+ \definefontsynonym [ComputerModernMono] [LMTypewriter-Light]
+ \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-LightOblique]
+ \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-LightOblique]
+ \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark]
+ \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique]
+ \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-Light]
+ \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-LightOblique]
+ \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Light]
+ \stoptypescript
+
+ \starttypescript [serif] [modern-variable,latin-modern-variable]
+ \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique]
+ \stoptypescript
+
+ \starttypescript [serif] [modern-variable-light,latin-modern-variable-light]
+ \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Light]
+ \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-LightOblique]
+ \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-LightOblique]
+ \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Light]
+ \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-LightOblique]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern]
+ % isn't this obsolete now?
+ \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ %definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ %definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic]
+ %definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ %definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic]
+ %definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [modern]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern]
+ \definetypeface [modern] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [modern] [mm] [math] [modern] [computer-modern]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modern-base]
+ \definetypeface [modern] [rm] [serif] [modern] [default]
+ \definetypeface [modern] [ss] [sans] [modern] [default]
+ \definetypeface [modern] [tt] [mono] [modern] [default]
+ \definetypeface [modern] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modernvariable,modern-variable]
+ \definetypeface [modernvariable] [rm] [serif] [modern-variable] [default]
+ \definetypeface [modernvariable] [tt] [mono] [modern-variable] [default]
+ \definetypeface [modernvariable] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modernvariablelight,modern-variable-light]
+ \definetypeface [modernvariable] [rm] [serif] [modern-variable-light] [default]
+ \definetypeface [modernvariable] [tt] [mono] [modern-variable-light] [default]
+ \definetypeface [modernvariable] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modern-mono]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern]
+ \definetypeface [modern] [tt] [mono] [modern-light] [computer-modern]
+ \definetypeface [modern] [mm] [math] [modern] [computer-modern]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [modern-base-mono]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [default]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [default]
+ \definetypeface [modern] [tt] [mono] [modern-light] [computer-modern] [default]
+ \definetypeface [modern] [mm] [math] [modern] [computer-modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it
+ \definefontsynonym [Simple] [cmvtt10]
+ %setupfontsynonym [Simple] [handling=pure]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[texgyre]
+
+ \definetypescriptprefix [f:pagella] [pagella] \definetypescriptprefix [f:palatino] [pagella]
+ \definetypescriptprefix [f:termes] [termes] \definetypescriptprefix [f:times] [termes]
+ \definetypescriptprefix [f:heros] [heros] \definetypescriptprefix [f:helvetica] [heros]
+ \definetypescriptprefix [f:bonum] [bonum] \definetypescriptprefix [f:bookman] [bonum]
+ \definetypescriptprefix [f:schola] [schola] \definetypescriptprefix [f:schoolbook] [schola]
+ \definetypescriptprefix [f:adventor][adventor] %definetypescriptprefix [f:adventor] [adventor]
+ \definetypescriptprefix [f:cursor] [cursor] \definetypescriptprefix [f:courier] [cursor]
+ \definetypescriptprefix [f:chorus] [chorus] \definetypescriptprefix [f:chancery] [chorus] % not the full set
+
+ \starttypescript [serif,sans,mono] [adventor,bonum,bookman,cursor,courier,heros,helvetica,pagella,palatino,schola,schoolbook,termes,times]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-regular] [\s!features=\s!default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-italic] [\s!features=\s!default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bold] [\s!features=\s!default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bolditalic] [\s!features=\s!default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bolditalic] [\s!features=\s!smallcaps]
+ \stoptypescript
+
+ \starttypescript [serif,calligraphy] [chorus,chancery]
+ \definefontsynonym [TeXGyreChorus-MediumItalic] [\s!file:texgyrechorus-mediumitalic] [\s!features=\s!default]
+ \stoptypescript
+
+ \definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella]
+ \definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes]
+ \definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros]
+ \definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum]
+ \definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola]
+ \definetypescriptprefix [n:adventor] [TeXGyreAdventor] %definetypescriptprefix [n:adventor] [TeXGyreAdventor]
+ \definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor]
+ \definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set
+
+ \starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name]
+ \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+ \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [SerifCaps]
+ \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SerifSlantedCaps] [SerifItalicCaps]
+ \definefontsynonym [SerifBoldSlantedCaps] [SerifBoldItalicCaps]
+ \definefontsynonym [SerifCapsCaps] [SerifCaps]
+ \stoptypescript
+
+ \starttypescript [serif] [chorus,chancery] [name]
+ \definefontsynonym [SerifMediumItalic] [TeXGyreChorus-MediumItalic]
+ \definefontsynonym [Serif] [SerifMediumItalic]
+ \definefontsynonym [SerifItalic] [SerifMediumItalic]
+ \definefontsynonym [SerifBold] [SerifMediumItalic]
+ \definefontsynonym [SerifBoldItalic] [SerifMediumItalic]
+ \definefontsynonym [SerifSlanted] [SerifMediumItalic]
+ \definefontsynonym [SerifBoldSlanted] [SerifMediumItalic]
+ \definefontsynonym [SerifCaps] [SerifMediumItalic]
+ \stoptypescript
+
+ \starttypescript [calligraphy] [chorus,chancery] [name]
+ \definefontsynonym [Calligraphy] [TeXGyreChorus-MediumItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [heros,helvetica,adventor] [name]
+ \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+
+ \definefontsynonym [SansRegular] [Sans]
+ \definefontsynonym [SansRegularCaps] [SansCaps]
+ \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SansSlantedCaps] [SansItalicCaps]
+ \definefontsynonym [SansBoldSlantedCaps] [SansBoldItalicCaps]
+ \definefontsynonym [SansCapsCaps] [SansCaps]
+ \stoptypescript
+
+ \starttypescript [mono] [cursor,courier] [name]
+ \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+
+ \definefontsynonym [MonoRegular] [Mono]
+ \definefontsynonym [MonoRegularCaps] [MonoCaps]
+ \definefontsynonym [MonoItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [MonoBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [MonoBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [MonoSlantedCaps] [MonoItalicCaps]
+ \definefontsynonym [MonoBoldSlantedCaps] [MonoBoldItalicCaps]
+ \definefontsynonym [MonoCapsCaps] [MonoCaps]
+ \stoptypescript
+
+ \starttypescript [times,termes]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [helvetica] [default] [rscale=0.9]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [mm] [math] [times] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [palatino,pagella]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.075]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.075]
+ \definetypeface [\typescriptone] [mm] [math] [palatino] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [schoolbook,schola]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.1]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [bookman,bonum]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.1]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [chancery,chorus]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [helvetica,heros]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.15]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [avantgarde,adventor]
+ \definetypeface [\typescriptone] [ss] [sans] [adventor] [default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [courier,cursor]
+ \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[xmath]
+
+ % Times Math (tx)
+
+ \starttypescript [math][times][all]
+ \loadfontgoodies[tx-math]
+ \definefontsynonym[MathRoman][txmath@tx-math]
+ \stoptypescript
+
+ % Palatino Math (px)
+
+ \starttypescript [math][palatino][all]
+ \loadfontgoodies[px-math]
+ \definefontsynonym[MathRoman][pxmath@px-math]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[antykwa]
+
+ % Antykwa Torunska (GUST)
+
+ \starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
+ \definefontsynonym [AntykwaTorunska-Regular] [\s!file:AntykwaTorunska-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-Italic] [\s!file:AntykwaTorunska-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-Bold] [\s!file:AntykwaTorunska-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-BoldItalic] [\s!file:AntykwaTorunska-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-Light] [\s!file:AntykwaTorunskaLight-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-LightItalic] [\s!file:AntykwaTorunskaLight-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-Medium] [\s!file:AntykwaTorunskaMed-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-MedItalic] [\s!file:AntykwaTorunskaMed-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondRegular] [\s!file:AntykwaTorunskaCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondItalic] [\s!file:AntykwaTorunskaCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondBold] [\s!file:AntykwaTorunskaCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalic] [\s!file:AntykwaTorunskaCond-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondLight] [\s!file:AntykwaTorunskaCondLight-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondLightItalic] [\s!file:AntykwaTorunskaCondLight-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondMedium] [\s!file:AntykwaTorunskaCondMed-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaTorunska-CondMedItalic] [\s!file:AntykwaTorunskaCondMed-Italic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaTorunska-Cap] [\s!file:AntykwaTorunska-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [\s!file:AntykwaTorunska-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [\s!file:AntykwaTorunska-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\s!file:AntykwaTorunska-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-LightCap] [\s!file:AntykwaTorunskaLight-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [\s!file:AntykwaTorunskaLight-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [\s!file:AntykwaTorunskaMed-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [\s!file:AntykwaTorunskaMed-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondCap] [\s!file:AntykwaTorunskaCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [\s!file:AntykwaTorunskaCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [\s!file:AntykwaTorunskaCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\s!file:AntykwaTorunskaCond-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [\s!file:AntykwaTorunskaCondLight-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\s!file:AntykwaTorunskaCondLight-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [\s!file:AntykwaTorunskaCondMed-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\s!file:AntykwaTorunskaCondMed-Italic] [\s!features=\s!smallcaps]
+ \stoptypescript
+
+ \starttypescript [math][antykwa-torunska][all]
+ \loadfontgoodies[antykwa-math]
+ \definefontsynonym[MathRoman][antykwamath@antykwa-math]
+ \stoptypescript
+
+ \starttypescript [math][antykwa-torunska-light][all]
+ \loadfontgoodies[antykwa-math]
+ \definefontsynonym[MathRoman][antykwalightmath@antykwa-light-math]
+ \stoptypescript
+
+ \starttypescript [math][antykwa-torunska-cond][all]
+ \loadfontgoodies[antykwa-math]
+ \definefontsynonym[MathRoman][antykwacondmath@antykwa-cond-math]
+ \stoptypescript
+
+ \starttypescript [math][antykwa-torunska-lightcond][all]
+ \loadfontgoodies[antykwa-math]
+ \definefontsynonym[MathRoman][antykwalightcondmath@antykwa-lightcond-math]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap]
+ \stoptypescript
+
+ \starttypescript [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
+ \definetypeface[antykwa][rm][serif][\typescriptone] [default]
+ \definetypeface[antykwa][ss][sans] [modern] [default] [rscale=1.05]
+ \definetypeface[antykwa][tt][mono] [modern] [default] [rscale=1.05]
+ \definetypeface[antykwa][mm][math] [\typescriptone] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+ % Antykwa Poltawskiego (GUST)
+
+% \starttypescript [serif] [antykwa-poltawskiego]
+% \definefontsynonym [AntykwaPoltawskiego-Regular] [antpr]
+% \definefontsynonym [AntykwaPoltawskiego-Bold] [antpb]
+% \definefontsynonym [AntykwaPoltawskiego-Italic] [antpri]
+% \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [antpbi]
+% \stoptypescript
+
+% \starttypescript [serif] [antykwa-poltawskiego] [name]
+% \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular]
+% \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold]
+% \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic]
+% \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic]
+% \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold]
+% \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold]
+% \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular]
+% \stoptypescript
+
+ % names of "Caps" may still change
+ \starttypescript [serif] [antykwa-poltawskiego,antykwa-poltawskiego-light]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Light] [\s!file:AntPoltLtCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-LightItalic] [\s!file:AntPoltLtCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Regular] [\s!file:AntPoltCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Italic] [\s!file:AntPoltCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Medium] [\s!file:AntPoltMdCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-MediumItalic] [\s!file:AntPoltMdCond-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-Bold] [\s!file:AntPoltCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-BoldItalic] [\s!file:AntPoltCond-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsLight] [\s!file:AntPoltLtCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsLightItalic] [\s!file:AntPoltLtCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsRegular] [\s!file:AntPoltCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsItalic] [\s!file:AntPoltCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsMedium] [\s!file:AntPoltMdCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsMediumItalic] [\s!file:AntPoltMdCond-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsBold] [\s!file:AntPoltCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Condensed-CapsBoldItalic] [\s!file:AntPoltCond-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Regular] [\s!file:AntPoltLtSemiCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Italic] [\s!file:AntPoltLtSemiCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Regular] [\s!file:AntPoltSemiCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Italic] [\s!file:AntPoltSemiCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Medium] [\s!file:AntPoltMdSemiCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-MediumItalic] [\s!file:AntPoltMdSemiCond-BdItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-Bold] [\s!file:AntPoltSemiCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-BoldItalic] [\s!file:AntPoltSemiCond-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsRegular] [\s!file:AntPoltLtSemiCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsItalic] [\s!file:AntPoltLtSemiCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsRegular] [\s!file:AntPoltSemiCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsItalic] [\s!file:AntPoltSemiCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsMedium] [\s!file:AntPoltMdSemiCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsMediumItalic] [\s!file:AntPoltMdSemiCond-BdItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsBold] [\s!file:AntPoltSemiCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiCondensed-CapsBoldItalic] [\s!file:AntPoltSemiCond-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-Light] [\s!file:AntPoltLt-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-LightItalic] [\s!file:AntPoltLt-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Regular] [\s!file:AntPolt-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Italic] [\s!file:AntPolt-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Medium] [\s!file:AntPoltMd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-MediumItalic] [\s!file:AntPoltMd-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Bold] [\s!file:AntPolt-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\s!file:AntPolt-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-CapsLight] [\s!file:AntPoltLt-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsLightItalic] [\s!file:AntPoltLt-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsRegular] [\s!file:AntPolt-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsItalic] [\s!file:AntPolt-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsMedium] [\s!file:AntPoltMd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsMediumItalic] [\s!file:AntPoltMd-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsBold] [\s!file:AntPolt-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-CapsBoldItalic] [\s!file:AntPolt-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Light] [\s!file:AntPoltLtSemiExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-LightItalic] [\s!file:AntPoltLtSemiExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Regular] [\s!file:AntPoltSemiExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Italic] [\s!file:AntPoltSemiExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Medium] [\s!file:AntPoltMdSemiExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-MediumItalic] [\s!file:AntPoltMdSemiExtd-BdItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-Bold] [\s!file:AntPoltSemiExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-BoldItalic] [\s!file:AntPoltSemiExtd-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsLight] [\s!file:AntPoltLtSemiExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsLightItalic] [\s!file:AntPoltLtSemiExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsRegular] [\s!file:AntPoltSemiExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsItalic] [\s!file:AntPoltSemiExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsMedium] [\s!file:AntPoltMdSemiExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsMediumItalic] [\s!file:AntPoltMdSemiExtd-BdItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsBold] [\s!file:AntPoltSemiExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-SemiExtended-CapsBoldItalic] [\s!file:AntPoltSemiExtd-BoldItalic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Light] [\s!file:AntPoltLtExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-LightItalic] [\s!file:AntPoltLtExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Regular] [\s!file:AntPoltExtd-Regular] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Italic] [\s!file:AntPoltExtd-Italic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Medium] [\s!file:AntPoltMdExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-MediumItalic] [\s!file:AntPoltMdExtd-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-Bold] [\s!file:AntPoltExtd-Bold] [\s!features=\s!default]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-BoldItalic] [\s!file:AntPoltExtd-BoldItalic] [\s!features=\s!default]
+
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsLight] [\s!file:AntPoltLtExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsLightItalic] [\s!file:AntPoltLtExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsRegular] [\s!file:AntPoltExtd-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsItalic] [\s!file:AntPoltExtd-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsMedium] [\s!file:AntPoltMdExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsMediumItalic] [\s!file:AntPoltMdExtd-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsBold] [\s!file:AntPoltExtd-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [AntykwaPoltawskiego-Extended-CapsBoldItalic] [\s!file:AntPoltExtd-BoldItalic] [\s!features=\s!smallcaps]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-poltawskiego] [name]
+ \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular]
+ \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-BoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-CapsRegular]
+ \stoptypescript
+
+ \starttypescript [serif] [antykwa-poltawskiego-light] [name]
+ \definefontsynonym [Serif] [AntykwaPoltawskiego-Light]
+ \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Medium]
+ \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-LightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-LightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-MediumItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-MediumItalic]
+ \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-CapsLight]
+ \stoptypescript
+
+ % condensed and extended variants are still missing
+
+ \starttypescript [antykwa-poltawskiego,antykwa-poltawskiego-light]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.05]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[iwona]
+
+ % maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic
+
+ % These names are a depressing mess. They have changed over time and are
+ % still not consistent. I'd expect Bold-Regular and Bold-Italic.
+
+ \starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond]
+
+ \definefontsynonym [Iwona-Regular] [\s!file:Iwona-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Italic] [\s!file:Iwona-Italic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Bold] [\s!file:Iwona-Bold] [\s!features=\s!default]
+ \definefontsynonym [Iwona-BoldItalic] [\s!file:Iwona-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Light-Regular] [\s!file:IwonaLight-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Light-Italic] [\s!file:IwonaLight-Italic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Medium-Regular] [\s!file:IwonaMedium-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Medium-Italic] [\s!file:IwonaMedium-Italic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Heavy-Regular] [\s!file:IwonaHeavy-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-Heavy-Italic] [\s!file:IwonaHeavy-Italic] [\s!features=\s!default]
+
+ \definefontsynonym [Iwona-CapsRegular] [\s!file:Iwona-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsItalic] [\s!file:Iwona-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsBold] [\s!file:Iwona-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsBoldItalic] [\s!file:Iwona-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsLight] [\s!file:IwonaLight-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsLight-Italic] [\s!file:IwonaLight-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsMedium] [\s!file:IwonaMedium-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsMedium-Italic] [\s!file:IwonaMedium-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsHeavy] [\s!file:IwonaHeavy-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsHeavy-Italic] [\s!file:IwonaHeavy-Italic] [\s!features=\s!smallcaps]
+
+ \definefontsynonym [Iwona-CondRegular] [\s!file:IwonaCond-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondItalic] [\s!file:IwonaCond-Italic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondBold] [\s!file:IwonaCond-Bold] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondBoldItalic] [\s!file:IwonaCond-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondLight-Regular] [\s!file:IwonaCondLight-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondLight-Italic] [\s!file:IwonaCondLight-Italic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondMedium-Regular] [\s!file:IwonaCondMedium-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondMedium-Italic] [\s!file:IwonaCondMedium-Italic] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondHeavy-Regular] [\s!file:IwonaCondHeavy-Regular] [\s!features=\s!default]
+ \definefontsynonym [Iwona-CondHeavy-Italic] [\s!file:IwonaCondHeavy-Italic] [\s!features=\s!default]
+
+ \definefontsynonym [Iwona-CapsCondRegular] [\s!file:IwonaCond-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondItalic] [\s!file:IwonaCond-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondBold] [\s!file:IwonaCond-Bold] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondBoldItalic] [\s!file:IwonaCond-BoldItalic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondLight-Regular] [\s!file:IwonaCondLight-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondLight-Italic] [\s!file:IwonaCondLight-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondMedium-Regular][\s!file:IwonaCondMedium-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondMedium-Italic] [\s!file:IwonaCondMedium-Italic] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondHeavy-Regular] [\s!file:IwonaCondHeavy-Regular] [\s!features=\s!smallcaps]
+ \definefontsynonym [Iwona-CapsCondHeavy-Italic] [\s!file:IwonaCondHeavy-Italic] [\s!features=\s!smallcaps]
+
+ \stoptypescript
+
+ % [all] is redundant
+
+ \starttypescript [math][iwona][all]
+ \definefontsynonym[MathRoman][iwonamath@iwona-math]
+ \stoptypescript
+ \starttypescript [math][iwona-light][all]
+ \definefontsynonym[MathRoman][iwonalightmath@iwona-light-math]
+ \stoptypescript
+ \starttypescript [math][iwona-medium][all]
+ \definefontsynonym[MathRoman][iwonamediummath@iwona-medium-math]
+ \stoptypescript
+ \starttypescript [math][iwona-heavy][all]
+ \definefontsynonym[MathRoman][iwonaheavymath@iwona-heavy-math]
+ \stoptypescript
+
+ \starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [all]
+ \loadfontgoodies[iwona-math]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Light-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Light-Italic]
+ \definefontsynonym [SansBold] [Iwona-Medium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Medium-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsLight]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Italic]
+ \definefontsynonym [SansBold] [Iwona-Bold]
+ \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalic] [Iwona-CapsItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Medium-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Medium-Italic]
+ \definefontsynonym [SansBold] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsMedium-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-heavy] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansBold] [Iwona-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-Heavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-heavy-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavy-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CondLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CondMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondMedium-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondLight-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondLight-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondMedium-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-light-cond-caps,iwona-light-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondLight-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondLight-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondMedium-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondMedium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondRegular]
+ \definefontsynonym [SansItalic] [Iwona-CondItalic]
+ \definefontsynonym [SansBold] [Iwona-CondBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-cond-caps,iwona-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondRegular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondBoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondMedium-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CondMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CondHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondHeavy-Italic]
+ \definefontsynonym [SansCaps] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsCondMedium-Italic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsCondHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [iwona-medium-cond-caps,iwona-medium-caps-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansItalic] [Iwona-CapsCondMedium-Italic]
+ \definefontsynonym [SansBold] [Iwona-CapsCondHeavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsCondHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium]
+ \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default]
+ \definetypeface[\typescriptone][rm][serif][modern] [default]
+ \definetypeface[\typescriptone][tt][mono] [modern] [default]
+ \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][text=ss]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[kurier]
+
+ % Kurier (JMN) / no open type fonts yet so this should be in type-one.mkiv
+
+ \starttypescript [sans] [kurier-light,kurier,kurier-medium]
+ \definefontsynonym[Kurier-Light] [kurierl]
+ \definefontsynonym[Kurier-Regular] [kurierr]
+ \definefontsynonym[Kurier-Medium] [kurierm]
+ \definefontsynonym[Kurier-Bold] [kurierb]
+ \definefontsynonym[Kurier-Heavy] [kurierh]
+ \definefontsynonym[Kurier-LightItalic] [kurierli]
+ \definefontsynonym[Kurier-Italic] [kurierri]
+ \definefontsynonym[Kurier-MediumItalic] [kuriermi]
+ \definefontsynonym[Kurier-BoldItalic] [kurierbi]
+ \definefontsynonym[Kurier-HeavyItalic] [kurierhi]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Light-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Light-Italic]
+ \definefontsynonym [SansBold] [Kurier-Medium-Regular]
+ \definefontsynonym [SansBoldItalic] [Kurier-Medium-Italic]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Italic]
+ \definefontsynonym [SansBold] [Kurier-Bold]
+ \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [sans] [kurier-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Medium-Regular]
+ \definefontsynonym [SansItalic] [Kurier-Medium-Italic]
+ \definefontsynonym [SansBold] [Kurier-Heavy-Regular]
+ \definefontsynonym [SansBoldItalic] [Kurier-Heavy-Italic]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[symbols]
+
+ \starttypescript
+ \definefontsynonym [ZapfDingbats] [uzdr]
+ \definefontsynonym [RalfSmithFormalScript] [rsfs10]
+ \definefontsynonym [MartinVogel] [fmvr8x]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[charter]
+
+ \starttypescript [serif] [charter]
+ \definefontsynonym [Charter-Roman] [\s!name:CharterBT-Roman] % or: [bchr8a]
+ \definefontsynonym [Charter-Italic] [\s!name:CharterBT-Italic] % or: [bchri8a]
+ \definefontsynonym [Charter-Bold] [\s!name:CharterBT-Bold] % or: [bchb8a]
+ \definefontsynonym [Charter-BoldItalic] [\s!name:CharterBT-BoldItalic] % or: [bchbi8a]
+ \definefontsynonym [Charter-Slanted] [\s!name:CharterBT-Italic] % or: [bchri8a]
+ \definefontsynonym [Charter-BoldSlanted] [\s!name:CharterBT-BoldItalic] % or: [bchbi8a]
+ \definefontsynonym [Charter-Roman-Caps] [Charter-Roman] % not present
+ \stoptypescript
+
+ \starttypescript [serif] [charter] [name]
+ \definefontsynonym [Serif] [Charter-Roman]
+ \definefontsynonym [SerifItalic] [Charter-Italic]
+ \definefontsynonym [SerifBold] [Charter-Bold]
+ \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic]
+ \definefontsynonym [SerifSlanted] [Charter-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Charter-Roman-Caps]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[mathtimes]
+
+ \starttypescript [math] [mathtimes] [all]
+ \loadfontgoodies[mathtimes-math]
+ \definefontsynonym[MathRoman][mathtimes@mathtimes-math]
+ \stoptypescript
+
+ \starttypescript [mathtimes]
+ \definetypeface [mathtimes] [rm] [serif] [times] [default]
+ \definetypeface [mathtimes] [ss] [sans] [helvetica] [default] [rscale=0.9]
+ \definetypeface [mathtimes] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [mathtimes] [mm] [math] [mathtimes] [default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[lucida]
+
+ \starttypescript [serif] [lucida]
+ \definefontsynonym [LucidaBright] [\s!name:LucidaBright]
+ \definefontsynonym [LucidaBright-Demi] [\s!name:LucidaBright-Demi]
+ \definefontsynonym [LucidaBright-Italic] [\s!name:LucidaBright-Italic]
+ \definefontsynonym [LucidaBright-DemiItalic] [\s!name:LucidaBright-DemiItalic]
+ \definefontsynonym [LucidaBright-Oblique] [\s!name:LucidaBright-Oblique]
+ \definefontsynonym [LucidaBrightSmallcaps] [\s!name:LucidaBrightSmallcaps]
+ \definefontsynonym [LucidaBrightSmallcaps-Demi] [\s!name:LucidaBrightSmallcaps-Demi]
+ \stoptypescript
+
+ \starttypescript [sans] [lucida]
+ \definefontsynonym [LucidaSans] [\s!name:LucidaSans]
+ \definefontsynonym [LucidaSans-Demi] [\s!name:LucidaSans-Demi]
+ \definefontsynonym [LucidaSans-Bold] [\s!name:LucidaSans-Bold]
+ \definefontsynonym [LucidaSans-Italic] [\s!name:LucidaSans-Italic]
+ \definefontsynonym [LucidaSans-DemiItalic] [\s!name:LucidaSans-DemiItalic]
+ \definefontsynonym [LucidaSans-BoldItalic] [\s!name:LucidaSans-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [mono] [lucida]
+ \definefontsynonym [LucidaTypewriter] [\s!name:LucidaTypewriter]
+ \definefontsynonym [LucidaTypewriterBold] [\s!name:LucidaTypewriterBold]
+ \definefontsynonym [LucidaTypewriterOblique] [\s!name:LucidaTypewriterOblique]
+ \definefontsynonym [LucidaTypewriterBoldOblique] [\s!name:LucidaTypewriterBoldOblique]
+ \stoptypescript
+
+ \starttypescript [mono] [lucida]
+ \definefontsynonym [LucidaSans-Typewriter] [\s!name:LucidaSans-Typewriter]
+ \definefontsynonym [LucidaSans-TypewriterBold] [\s!name:LucidaSans-TypewriterBold]
+ \definefontsynonym [LucidaSans-TypewriterOblique] [\s!name:LucidaSans-TypewriterOblique]
+ \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\s!name:LucidaSans-TypewriterBoldOblique]
+ \stoptypescript
+
+ \starttypescript [calligraphy] [lucida]
+ \definefontsynonym [LucidaCalligraphy-Italic] [\s!name:LucidaCalligraphy-Italic]
+ \stoptypescript
+
+ \starttypescript [casual] [lucida]
+ \definefontsynonym [LucidaCasual] [\s!name:LucidaCasual]
+ \definefontsynonym [LucidaCasual-Italic] [\s!name:LucidaCasual-Italic]
+ \stoptypescript
+
+ \starttypescript [handwriting] [lucida]
+ \definefontsynonym [LucidaHandwriting-Italic] [\s!name:LucidaHandwriting-Italic]
+ \stoptypescript
+
+ \starttypescript [fax] [lucida]
+ \definefontsynonym [LucidaFax] [\s!name:LucidaFax]
+ \definefontsynonym [LucidaFax-Demi] [\s!name:LucidaFax-Demi]
+ \definefontsynonym [LucidaFax-Italic] [\s!name:LucidaFax-Italic]
+ \definefontsynonym [LucidaFax-DemiItalic] [\s!name:LucidaFax-DemiItalic]
+ \stoptypescript
+
+ \starttypescript [blackletter] [lucida]
+ \definefontsynonym [LucidaBlackletter] [\s!name:LucidaBlackletter]
+ \stoptypescript
+
+ \starttypescript [math] [lucida]
+ \loadfontgoodies[lucida-math]
+ \definefontsynonym[MathRoman][lucidamath@lucida-math]
+ \stoptypescript
+
+ \starttypescript [serif] [lucida] [name]
+ \definefontsynonym [Serif] [LucidaBright]
+ \definefontsynonym [SerifBold] [LucidaBright-Demi]
+ \definefontsynonym [SerifItalic] [LucidaBright-Italic]
+ \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifSlanted] [LucidaBright-Oblique]
+ \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps]
+ \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi]
+ \stoptypescript
+
+ % Lucida Bright Sans
+
+ \starttypescript [sans] [lucida] [name]
+ \definefontsynonym [Sans] [LucidaSans]
+ \definefontsynonym [SansBold] [LucidaSans-Demi]
+ \definefontsynonym [SansItalic] [LucidaSans-Italic]
+ \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansSlanted] [LucidaSans-Italic]
+ \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansCaps] [LucidaSans]
+ \stoptypescript
+
+ % Lucida Bright Typewriter
+
+ % only one family may be used as mono; sans used to be that since the beginning,
+ % so we keep using that as default
+
+ % \starttypescript [mono] [lucida] [name]
+ % \definefontsynonym [Mono] [LucidaTypewriter]
+ % \definefontsynonym [MonoBold] [LucidaTypewriterBold]
+ % \definefontsynonym [MonoItalic] [LucidaTypewriterOblique]
+ % \definefontsynonym [MonoBoldItalic] [LucidaTypewriterBoldOblique]
+ % \definefontsynonym [MonoSlanted] [LucidaTypewriterOblique]
+ % \definefontsynonym [MonoBoldSlanted] [LucidaTypewriterBoldOblique]
+ % \definefontsynonym [MonoCaps] [LucidaTypewriter]
+ % \stoptypescript
+
+ % Lucida Bright Sans Typewriter
+
+ \starttypescript [mono] [lucida] [name]
+ \definefontsynonym [Mono] [LucidaSans-Typewriter]
+ \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold]
+ \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoCaps] [LucidaSans-Typewriter]
+ \stoptypescript
+
+ % Lucida Calligraphy
+
+ \starttypescript [calligraphy] [lucida] [name]
+ \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic]
+ \stoptypescript
+
+ % Lucida Casual
+
+ % \starttypescript [casual] [lucida] [name]
+ % % LucidaCasual
+ % % LucidaCasual-Italic
+ % \stoptypescript
+
+ % Lucida Handwriting
+
+ \starttypescript [handwriting] [lucida] [name]
+ \definefontsynonym [Handwriting] [LucidaHandwriting-Italic]
+ \stoptypescript
+
+ % Lucida Fax
+ %
+ % \starttypescript [fax] [lucida] [name]
+ % \definefontsynonym [FaksRegular] [LucidaFax]
+ % \definefontsynonym [FaksBold] [LucidaFax-Demi]
+ % \definefontsynonym [FaksItalic] [LucidaFax-Italic]
+ % \definefontsynonym [FaksBoldItalic] [LucidaFax-DemiItalic]
+ % \stoptypescript
+
+ % Lucida Black Letter
+ %
+ % \starttypescript [blackletter] [lucida] [name]
+ % \definefontsynonym [Blackletter] [LucidaBlackletter]
+ % \stoptypescript
+
+ \starttypescript [lucida]
+ \definetypeface [lucida] [rm] [\s!serif] [lucida] [\s!default] [\s!features=\s!default]
+ \definetypeface [lucida] [ss] [\s!sans] [lucida] [\s!default] [\s!features=\s!default]
+ \definetypeface [lucida] [tt] [\s!mono] [lucida] [\s!default] [\s!features=\s!default]
+ \definetypeface [lucida] [hw] [\s!handwriting] [lucida] [\s!default] [\s!features=\s!default]
+ \definetypeface [lucida] [cg] [\s!calligraphy] [lucida] [\s!default] [\s!features=\s!default]
+ \definetypeface [lucida] [mm] [\s!math] [lucida] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection [mathdesign]
+
+ \starttypescript [math] [charter,mathdesignch] [all]
+ \loadfontgoodies[charter-math]
+ \definefontsynonym[MathRoman][chartermath@charter-math]
+ \stoptypescript
+
+ \starttypescript [math] [garamond,mathdesigngm] [all]
+ \loadfontgoodies[garamond-math]
+ \definefontsynonym[MathRoman][garamondmath@garamond-math]
+ \stoptypescript
+
+ \starttypescript [math] [utopia,mathdesignut] [all]
+ \loadfontgoodies[utopia-math]
+ \definefontsynonym[MathRoman][utopiamath@utopia-math]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection [asanamath]
+
+ \starttypescript [math] [asana]
+ \definefontsynonym [AsanaMath] [\s!name:asanamath]
+ \stoptypescript
+
+ \starttypescript [math] [asana] [name]
+ \definefontsynonym [MathRoman] [AsanaMath] [\s!features=math\mathsizesuffix]
+ \stoptypescript
+
+ \starttypescript[asana]
+ \definetypeface [\typescriptone] [rm] [\s!serif] [palatino] [\s!default]
+ \definetypeface [\typescriptone] [ss] [\s!sans] [modern] [\s!default] [rscale=1.075]
+ \definetypeface [\typescriptone] [tt] [\s!mono] [modern] [\s!default] [rscale=1.075]
+ \definetypeface [\typescriptone] [mm] [\s!math] [\typescriptone] [\s!default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[cleartype]
+
+ % microsoft: cambria.ttc cambriab.ttf cambriai.ttf cambriaz.ttf
+ % ascender : cambmath.ttf cambria.ttf cambriab.ttf cambriai.ttf cambriaz.ttf
+
+ \starttypescript [math,serif] [cambria,cambria-x,cambria-y]
+ % whatever matches
+ \definefontsynonym [CambriaMath] [\s!name:cambriamath]
+ \definefontsynonym [CambriaSerif] [\s!name:cambria]
+ \stoptypescript
+ \starttypescript [math,serif] [cambria-m]
+ % microsoft cabria
+ \definefontsynonym [CambriaMath] [\s!file:cambria.ttc(Cambria Math)]
+ \definefontsynonym [CambriaSerif] [\s!file:cambria.ttc(Cambria)]
+ \stoptypescript
+ \starttypescript [math,serif] [cambria-a]
+ % ascender cambria
+ \definefontsynonym [CambriaMath] [\s!file:cambmath.ttf]
+ \definefontsynonym [CambriaSerif] [\s!file:cambria.ttf]
+ \stoptypescript
+
+ \starttypescript [math] [cambria,cambria-m,cambria-a] [name]
+ \definefontsynonym [MathRoman] [CambriaMath] [\s!features=math\mathsizesuffix]
+ \stoptypescript
+ \starttypescript [math] [cambria-x] [name]
+ \definefontsynonym [MathRoman] [CambriaMath] [\s!features=math]
+ \stoptypescript
+ \starttypescript [math] [cambria-y] [name]
+ \definefontsynonym [MathRoman] [CambriaMath] [\s!features=math-nostack\mathsizesuffix]
+ \stoptypescript
+
+ \starttypescript [serif] [cambria,cambria-m,cambria-a] [name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [CambriaSerif] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBold] [\s!name:cambriabold] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifItalic] [\s!name:cambriaitalic] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBoldItalic] [\s!name:cambriabolditalic] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [cambria,cambria-m,cambria-a]
+ % any
+ \definetypeface [cambria] [rm] [\s!serif] [\typescriptone] [\s!default]
+ \definetypeface [cambria] [tt] [\s!mono] [modern] [\s!default]
+ \definetypeface [cambria] [mm] [\s!math] [\typescriptone] [\s!default]
+ \stoptypescript
+ \starttypescript [cambria-x,cambria-y]
+ % test x
+ \definetypeface [\typescriptone] [rm] [\s!serif] [cambria] [\s!default]
+ \definetypeface [\typescriptone] [tt] [\s!mono] [modern] [\s!default]
+ \definetypeface [\typescriptone] [mm] [\s!math] [\typescriptone] [\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [candara] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:candara] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:candarab] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:candarai] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:candaraz] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [consolas] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:consola] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:consolab] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:consolai] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:consolaz] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [serif] [constantia] [name]
+ \setups[\s!font:\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [\s!file:constan] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBold] [\s!file:constanb] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifItalic] [\s!file:constani] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBoldItalic] [\s!file:constanz] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [corbel] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:corbel] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:corbelb] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:corbeli] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:corbelz] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [calibri] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:calibri] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:calibrib] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:calibrii] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:calibriz] [\s!features=\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[mscore]
+
+ % .ttf not really needed but we want to force the originals
+
+ \starttypescript [serif] [mscoretimes] [name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [\s!file:times.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBold] [\s!file:timesbd.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifItalic] [\s!file:timesi.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBoldItalic] [\s!file:timesbi.ttf] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [mscorearial] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:arial.ttf] [\s!features=default]
+ \definefontsynonym [\s!SansBold] [\s!file:arialbd.ttf] [\s!features=default]
+ \definefontsynonym [\s!SansItalic] [\s!file:ariali.ttf] [\s!features=default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:arialbi.ttf] [\s!features=default]
+ \stoptypescript
+
+ \starttypescript [mono] [mscorecourier] [name]
+ \setups[\s!font:\s!fallback:\s!mono]
+ \definefontsynonym [\s!Mono] [\s!file:cour.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!MonoBold] [\s!file:courbd.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!MonoItalic] [\s!file:couri.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!MonoBoldItalic] [\s!file:courbi.ttf] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [mscoreverdana] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:verdana.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:verdanab.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:verdanai.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:verdanaz.ttf] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript[mscore]
+ \definetypeface [mscore] [rm] [serif] [mscoretimes] [default]
+ \definetypeface [mscore] [ss] [sans] [mscorearial] [default] [rscale=0.860]
+ \definetypeface [mscore] [tt] [mono] [mscorecourier] [default] [rscale=1.065]
+ \definetypeface [mscore] [mm] [math] [times] [default] [rscale=1.020]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[liberation]
+
+ \starttypescript [serif] [liberationserif] [name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [\s!file:liberationserif-regular] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBold] [\s!file:liberationserif-bold] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifItalic] [\s!file:liberationserif-italic] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBoldItalic] [\s!file:liberationserif-bolditalic] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [sans] [liberationsans] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:liberationsans-regular] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:liberationsans-bold] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:liberationsans-italic] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:liberationsans-bolditalic] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [mono] [liberationmono] [name]
+ \setups[\s!font:\s!fallback:\s!mono]
+ \definefontsynonym [\s!Mono] [\s!file:liberationmono-regular] [\s!features=\s!default]
+ \definefontsynonym [\s!MonoBold] [\s!file:liberationmono-bold] [\s!features=\s!default]
+ \definefontsynonym [\s!MonoItalic] [\s!file:liberationmono-italic] [\s!features=\s!default]
+ \definefontsynonym [\s!MonoBoldItalic] [\s!file:liberationmono-bolditalic] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript[liberation]
+ \definetypeface [liberation] [rm] [serif] [liberationserif] [default]
+ \definetypeface [liberation] [ss] [sans] [liberationsans] [default] [rscale=0.870]
+ \definetypeface [liberation] [tt] [mono] [liberationmono] [default] [rscale=0.870]
+ \definetypeface [liberation] [mm] [math] [times] [default] [rscale=1.040]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+%D For some reason the libertine collection has not retained its
+%D original names. We force the \OPENTYPE\ variant. Once these fonts
+%D are stable we might switch to the by then hopefully cleaner internal
+%D names.
+
+\starttypescriptcollection[libertine]
+
+% \starttypescript [serif] [libertine] [name]
+% \setups[\s!font:\s!fallback:\s!serif]
+% \definefontsynonym [\s!Serif] [\s!file:fxlr.otf] [\s!features=\s!default]
+% \definefontsynonym [\s!SerifBold] [\s!file:fxlb.otf] [\s!features=\s!default]
+% \definefontsynonym [\s!SerifItalic] [\s!file:fxlri.otf] [\s!features=\s!default]
+% \definefontsynonym [\s!SerifBoldItalic] [\s!file:fxlbi.otf] [\s!features=\s!default]
+% \stoptypescript
+
+ \starttypescript [serif] [libertine]
+ \definefontsynonym [Libertine-Regular] [\s!file:fxlr]
+ \definefontsynonym [Libertine-Italic] [\s!file:fxlri]
+ \definefontsynonym [Libertine-Bold] [\s!file:fxlb]
+ \definefontsynonym [Libertine-BoldItalic] [\s!file:fxlbi]
+ \definefontsynonym [Libertine-SmallCaps] [file:fxlrc]
+ \stoptypescript
+
+ \starttypescript [serif] [libertine] [name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [Libertine-Regular] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifItalic] [Libertine-Italic] [\s!features=\s!default]
+ % \definefontsynonym [\s!SerifSlanted] [Libertine-Italic] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBold] [Libertine-Bold] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBoldItalic] [Libertine-BoldItalic] [\s!features=\s!default]
+ % \definefontsynonym [\s!SerifBoldSlanted][Libertine-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifCaps] [Libertine-SmallCaps] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [libertine]
+ \definetypeface [libertine] [tt] [mono] [default] [default]
+ \definetypeface [libertine] [ss] [sans] [default] [default]
+ \definetypeface [libertine] [rm] [serif] [libertine] [default]
+ \stoptypescript
+
+ \starttypescript [sans] [biolinum] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [\s!file:fxbr.otf] [\s!features=\s!default]
+ %definefontsynonym [\s!SansBold] [\s!file:fxbb.otf] [\s!features=\s!default] % unfinished
+ %definefontsynonym [\s!SansItalic] [\s!file:fxbri.otf] [\s!features=\s!default] % nonexistent
+ %definefontsynonym [\s!SansBoldItalic] [\s!file:fxbbi.otf] [\s!features=\s!default] % nonexistent
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[inconsolata]
+
+ \starttypescript [mono] [inconsolata]
+ \definefontsynonym [Inconsolata] [\s!file:inconsolata.otf]
+ \stoptypescript
+
+ \starttypescript [mono] [inconsolata] [name]
+ \setups[\s!font:\s!fallback:\s!mono]
+ \definefontsynonym [\s!Mono] [Inconsolata]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[postscript]
+
+ \starttypescript [postscript]
+ \definetypeface [postscript] [rm] [\s!serif] [times] [\s!default]
+ \definetypeface [postscript] [ss] [\s!sans] [helvetica] [\s!default] [\s!rscale=0.9]
+ \definetypeface [postscript] [tt] [\s!mono] [courier] [\s!default] [\s!rscale=1.1]
+ \definetypeface [postscript] [mm] [\s!math] [times] [\s!default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[pagella-euler]
+
+ \starttypescript [math] [euler]
+ \definefontsynonym [EulerMath] [\s!file:euler.otf]
+ \stoptypescript
+
+ \starttypescript [math] [euler] [name]
+ % \definefontsynonym [MathRoman] [EulerMath] [\s!features=math]
+ \definefontsynonym [MathRoman] [EulerMath] [\s!features=math\mathsizesuffix]
+ \stoptypescript
+
+ \starttypescript [pagella-euler]
+ \definetypeface [\typescriptone] [rm] [\s!serif] [pagella] [\s!default]
+ % \definetypeface [\typescriptone] [ss] [\s!sans] [pagella] [\s!default] [\s!rscale=auto]
+ \definetypeface [\typescriptone] [tt] [\s!mono] [modern] [\s!default] [\s!rscale=auto]
+ \definetypeface [\typescriptone] [mm] [\s!math] [euler] [\s!default] [\s!rscale=auto]
+ \quittypescriptscanning
+ \stoptypescript
+
+ \starttypescript [serif] [euler] [name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [Serif] [\s!file:euler.otf] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript [euler]
+ \definetypeface [euler] [rm] [\s!serif] [euler] [\s!default]
+ \definetypeface [euler] [tt] [\s!mono] [modern] [\s!default] [\s!rscale=auto]
+ \definetypeface [euler] [mm] [\s!math] [euler] [\s!default]
+ \quittypescriptscanning
+ \stoptypescript
+
+\stoptypescriptcollection
+
+% \starttypescript [math] [hvmath]
+% \definefontsynonym[MathRoman][hvmath@hvmath-math]
+% \loadfontgoodies[hvmath-math]
+% \stoptypescript
+
+\protect \endinput
diff --git a/tex/context/base/type-pre.mkii b/tex/context/base/type-pre.mkii
new file mode 100644
index 000000000..ad2109a65
--- /dev/null
+++ b/tex/context/base/type-pre.mkii
@@ -0,0 +1,253 @@
+%D \module
+%D [ file=type-pre,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Compatibility scripts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file is obsolete. We now have latin modern and proper
+%D typescripts. Forget about this file.
+
+%D This file defines some typescripts that simulate the pre-typescript way
+%D of defining fonts. This file will not be extended.
+
+\starttypescriptcollection[previous]
+
+%D The Computer Modern Roman is derived from the Monotype~8a
+%D Times Roman. In this module, that is loaded by default, we
+%D define all relevant alternatives.
+
+\starttypescript [cmr]
+ \usetypescript[modern][default]
+ \setupbodyfont[modern]
+\stoptypescript
+
+%D This script remaps the default Computer Modern Font Files
+%D onto the EC ones, so that hyphenations work well. (The proper
+%D latin modern ec variants have replaed the ae ones.)
+
+\starttypescript [aer]
+ \usetypescript[modern][ec]
+ \setupbodyfont[modern]
+ %\enableregime[ec]
+\stoptypescript
+
+%D This script defines the Computer Modern Roman with a pseudo kind
+%D of iso latin 2 encoding.
+
+\starttypescript [csr]
+ \usetypescript[modern][ec]
+ \setupbodyfont[modern]
+ \enableregime[il2]
+\stoptypescript
+
+%D This script defines the Computer Modern Roman with a
+%D polish encoding.
+
+\starttypescript [plr]
+ \usetypescript[modern][qx]
+ \setupbodyfont[modern]
+ \enableregime[pl0]
+\stoptypescript
+
+%D Vietnamese.
+
+\starttypescript [vnr]
+ \usetypescript[modern][t5]
+ \setupbodyfont[modern]
+\stoptypescript
+
+%D Cyrillic alternatives are available under the symbolic
+%D name \type {cyr}.
+
+\starttypescript [cyr]
+ \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,cyr]
+ \usemathcollection[default]
+\stoptypescript
+
+\starttypescript [lh-ec]
+ \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,ec]
+ \usemathcollection[default]
+\stoptypescript
+
+\starttypescript [lh-t2a]
+ \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,t2a]
+ \usemathcollection[default]
+\stoptypescript
+
+\starttypescript [lh-t2b]
+ \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,t2b]
+ \usemathcollection[default]
+\stoptypescript
+
+\starttypescript [lh-t2c]
+ \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,t2c]
+ \usemathcollection [default]
+\stoptypescript
+
+\starttypescript [lh-x2]
+ \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,x2]
+ \usemathcollection [default]
+\stoptypescript
+
+\starttypescript [lh-lcy]
+ \usetypescript [serif,sans,mono,math] [computer-modern,latin-modern] [default,name,size,lcy]
+ \usemathcollection [default]
+\stoptypescript
+
+%D Here we implement the symbol fonts as provided by the
+%D American Mathematical Society. The names of these symbols
+%D can be found in The Joy of \TeX\ by M.~Spivak.
+
+% \starttypescript [ams]
+% \usetypescript [math] [ams] [all]
+% \usemathcollection[default]
+% \stoptypescript
+
+%D The Concrete Modern Roman is just an alternative Computer
+%D Modern Roman.
+
+% \starttypescript [con]
+% \usetypescript [serif] [concrete] [all]
+% \usemathcollection[default]
+% \stoptypescript
+
+%D The Euler Fonts are designed by Herman Zapf and can be
+%D used with the Concrete Fonts defined elsewhere.
+
+% \starttypescript [eul]
+% \usetypescript [math] [euler] [all]
+% \usemathcollection[eul]
+% \stoptypescript
+
+%D The Lucida Bright fonts are both good looking and and
+%D complete. These fonts have prebuilt accented characters,
+%D which means that we use another encoding vector: \YandY\
+%D texnansi. These fonts are a good illustration that a 12
+%D point bodyfont is indeed never that size. The Lucida Bright
+%D fonts come in one design size.
+
+% \starttypescript [lbr]
+% \usetypescript [serif,sans,mono,math,calligraphy,handwriting] [lucida] [name,special,\defaultencoding]
+% \usetypescript [serif,sans,mono,math,calligraphy,handwriting] [default] [size]
+% \usemathcollection[lbr]
+% \usetypescript [all] [lucida] [\defaultencoding]
+% \stoptypescript
+
+\starttypescript [lbr]
+ \usetypescript[lucida][\defaultencoding]
+\stoptypescript
+
+%D Times
+
+\starttypescript [tim]
+ \usetypescript [times] [\defaultencoding]
+ \setupbodyfont [times]
+\stoptypescript
+
+%D The Antikwa Torunska font family is a rather nice
+%D and subtle one. Although primary meant for the polish
+%D language, it can be used for other languages as well.
+
+\starttypescript [ant]
+ \usetypescript [antykwa-torunska] [\defaultencoding]
+ \setupbodyfont [antykwa,rm]
+\stoptypescript
+
+%D This script defines the Standard Adobe Courier fonts.
+
+% \starttypescript [pcr]
+% \usetypescript [mono] [courier] [name,\defaultencoding]
+% \usetypescript [mono] [default] [size]
+% \usetypescript [all] [courier] [\defaultencoding]
+% \stoptypescript
+
+\starttypescript [pcr]
+ \usetypescript [postscript] [\defaultencoding]
+ \setupbodyfont [postscript,tt]
+\stoptypescript
+
+%D This script defines the Standard Adobe Helvetica fonts.
+
+% \starttypescript [phv]
+% \usetypescript [sans] [helvetica] [name,\defaultencoding]
+% \usetypescript [sans] [default] [size]
+% \usetypescript [all] [helvetica] [\defaultencoding]
+% \stoptypescript
+
+\starttypescript [phv]
+ \usetypescript [postscript] [\defaultencoding]
+ \setupbodyfont [postscript,ss]
+\stoptypescript
+
+%D This script defines the Standard Adobe Times fonts.
+
+% \starttypescript [ptm]
+% \usetypescript [serif] [times] [name,\defaultencoding]
+% \usetypescript [serif] [default] [size]
+% \usetypescript [all] [times] [\defaultencoding]
+% \stoptypescript
+
+\starttypescript [ptm]
+ \usetypescript [postscript] [\defaultencoding]
+ \setupbodyfont [postscript,rm]
+\stoptypescript
+
+%D This script loads the Adobe Times Roman, Helvetica and
+%D Courier.
+
+% \starttypescript [pos]
+% \usetypescript [serif] [times] [name,\defaultencoding]
+% \usetypescript [sans] [helvetica] [name,\defaultencoding]
+% \usetypescript [mono] [courier] [name,\defaultencoding]
+% \usetypescript [serif,sans,mono] [default] [size]
+% \usetypescript [all] [times,helvetica,courier] [\defaultencoding]
+% \stoptypescript
+
+\starttypescript [pos]
+ \usetypescript [postscript] [\defaultencoding]
+ \setupbodyfont [postscript]
+\stoptypescript
+
+%D This script defines the Palatino font.
+
+\starttypescript [ppl]
+ \usetypescript [palatino] [\defaultencoding]
+ \setupbodyfont [palatino]
+\stoptypescript
+
+%D The following scripts fake the old \type {font-ber} and
+%D alike files.
+
+\starttypescript[fil]
+ % fake to prevent loading font-fil.tex and signal 'done'
+\stoptypescript
+
+%D But for old time sake we provide:
+
+\starttypescript[ber]
+ \usetypescript [berry] [ec,t5] % could be [all]
+\stoptypescript
+
+\stoptypescriptcollection
+
+%D Special scripts:
+
+\unprotect
+
+\starttypescriptcollection[special scripts]
+
+ \starttypescript[chi] \readfile{\f!fontprefix chi}\donothing\donothing \stoptypescript
+ \starttypescript[jap] \readfile{\f!fontprefix jap}\donothing\donothing \stoptypescript
+ \starttypescript[arb] \readfile{\f!fontprefix arb}\donothing\donothing \stoptypescript
+ \starttypescript[heb] \readfile{\f!fontprefix heb}\donothing\donothing \stoptypescript
+
+\stoptypescriptcollection
+
+\protect \endinput
diff --git a/tex/context/base/type-run.mkii b/tex/context/base/type-run.mkii
new file mode 100644
index 000000000..1b64c102e
--- /dev/null
+++ b/tex/context/base/type-run.mkii
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=type-run,
+%D version=2001.04.20,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\gdef\typetypescript
+ {\dotripleempty\dotypetypescript}
+
+\gdef\dotypetypescript[#1][#2][#3]%
+ {\bgroup
+ \def\dochecktypescript##1##2% script use
+ {\doifelsenothing{##1##2}
+ {\donetrue}
+ {\ExpandBothAfter\doifcommonelse{##1}{##2}\donetrue\donefalse}}
+ \edef\typescriptone {\truetypescript{#1}}%
+ \edef\typescripttwo {\truetypescript{#2}}%
+ \edef\typescriptthree{\truetypescript{#3}}%
+ \def\starttypescript
+ {\bgroup
+ \obeylines % else we loose the first line due to lookahead
+ \dotripleempty\dostarttypescript}
+ \def\dostarttypescript[##1][##2][##3]%
+ {\long\def\next####1\stoptypescript{\egroup}
+ \dochecktypescript{##1}\typescriptone \ifdone
+ \dochecktypescript{##2}\typescripttwo \ifdone
+ \dochecktypescript{##3}\typescriptthree\ifdone
+ \def\next%
+ {\def\stoptypescript{\egroup\type{\stoptypescript}}
+ % what follows now is quite ugly
+ \skipfirstverbatimlinefalse
+ \type{\starttypescript}
+ \doifsomething{##1}{\type{[##1]}}
+ \doifsomething{##2}{\type{[##2]}}
+ \doifsomething{##3}{\type{[##3]}}
+ \processdisplayverbatim{\stoptypescript}}%
+ \fi\fi\fi
+ \next}
+ \processcommacommand[\typescriptfiles]\ReadFile % \dodousetypescript
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/type-run.mkiv b/tex/context/base/type-run.mkiv
new file mode 100644
index 000000000..e91398095
--- /dev/null
+++ b/tex/context/base/type-run.mkiv
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=type-run,
+%D version=2001.04.20,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Runtime Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\gdef\typetypescript
+ {\dotripleempty\dotypetypescript}
+
+\gdef\dotypetypescript[#1][#2][#3]%
+ {\bgroup
+ \def\dochecktypescript##1##2% script use
+ {\doifelsenothing{##1##2}
+ {\donetrue}
+ {\ExpandBothAfter\doifcommonelse{##1}{##2}\donetrue\donefalse}}
+ \edef\typescriptone {\truetypescript{#1}}%
+ \edef\typescripttwo {\truetypescript{#2}}%
+ \edef\typescriptthree{\truetypescript{#3}}%
+ \unexpanded\def\starttypescript
+ {\bgroup
+ \obeylines % else we loose the first line due to lookahead
+ \dotripleempty\dostarttypescript}
+ \def\dostarttypescript[##1][##2][##3]%
+ {\long\def\next####1\stoptypescript{\egroup}
+ \dochecktypescript{##1}\typescriptone \ifdone
+ \dochecktypescript{##2}\typescripttwo \ifdone
+ \dochecktypescript{##3}\typescriptthree\ifdone
+ \def\next%
+ {\unexpanded\def\stoptypescript{\egroup\type{\stoptypescript}}
+ % what follows now is quite ugly
+ \skipfirstverbatimlinefalse
+ \type{\starttypescript}
+ \doifsomething{##1}{\type{[##1]}}
+ \doifsomething{##2}{\type{[##2]}}
+ \doifsomething{##3}{\type{[##3]}}
+ \processdisplayverbatim{\stoptypescript}}%
+ \fi\fi\fi
+ \next}
+ \processcommacommand[\typescriptfiles]\ReadFile % \dodousetypescript
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/type-set.mkii b/tex/context/base/type-set.mkii
new file mode 100644
index 000000000..0316f95c7
--- /dev/null
+++ b/tex/context/base/type-set.mkii
@@ -0,0 +1,81 @@
+%D \module
+%D [ file=type-set,
+%D version=2005.02.04, % moved from ini/def
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Default Settings,
+%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
+
+\definetypescriptprefix [serif] [Serif]
+\definetypescriptprefix [sans] [Sans]
+\definetypescriptprefix [mono] [Mono]
+
+\definefontsynonym [DefaultFont] [cmvtt10]
+
+\startsetups [font:fallback:serif]
+ \definefontsynonym [Serif] [DefaultFont]
+ \definefontsynonym [SerifBold] [Serif]
+ \definefontsynonym [SerifItalic] [Serif]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldItalic] [Serif]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+ \definefontsynonym [SerifCaps] [Serif]
+\stopsetups
+
+\startsetups [font:fallback:sans]
+ \definefontsynonym [Sans] [DefaultFont]
+ \definefontsynonym [SansBold] [Sans]
+ \definefontsynonym [SansItalic] [Sans]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldItalic] [Sans]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [Sans]
+\stopsetups
+
+\startsetups [font:fallback:mono]
+ \definefontsynonym [Mono] [DefaultFont]
+ \definefontsynonym [MonoBold] [Mono]
+ \definefontsynonym [MonoItalic] [Mono]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldItalic] [Mono]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+ \definefontsynonym [MonoCaps] [Mono]
+\stopsetups
+
+\startsetups [font:allbold:serif]
+ \definefontsynonym [Serif] [SerifBold]
+ \definefontsynonym [SerifItalic] [SerifBoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
+ %definefontsynonym [SerifCaps] [SerifBold]
+\stopsetups
+
+\startsetups [font:allbold:sans]
+ \definefontsynonym [Sans] [SansBold]
+ \definefontsynonym [SansItalic] [SansBoldItalic]
+ \definefontsynonym [SansSlanted] [SansBoldSlanted]
+ %definefontsynonym [SansCaps] [SansBold]
+\stopsetups
+
+\ifnum\texengine=\xetexengine
+ \usetypescriptfile[\f!typeprefix def]
+ %usetypescriptfile[\f!typeprefix tmf]
+ \usetypescriptfile[\f!typeprefix siz]
+ \usetypescriptfile[\f!typeprefix otf]
+ \usetypescriptfile[\f!typeprefix xtx]
+ \usetypescriptfile[\f!typeprefix loc]
+\else
+ \usetypescriptfile[\f!typeprefix def]
+ %usetypescriptfile[\f!typeprefix tmf]
+ \usetypescriptfile[\f!typeprefix siz]
+ \usetypescriptfile[\f!typeprefix one]
+ \usetypescriptfile[\f!typeprefix loc]
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/type-set.mkiv b/tex/context/base/type-set.mkiv
new file mode 100644
index 000000000..d12c333fe
--- /dev/null
+++ b/tex/context/base/type-set.mkiv
@@ -0,0 +1,77 @@
+%D \module
+%D [ file=type-set,
+%D version=2005.02.04, % moved from ini/def
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Default Settings,
+%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
+
+\definetypescriptprefix [serif] [Serif]
+\definetypescriptprefix [sans] [Sans]
+\definetypescriptprefix [mono] [Mono]
+
+\definefontsynonym [DefaultFont] [cmvtt10]
+
+\startsetups [font:fallback:serif]
+ \definefontsynonym [Serif] [DefaultFont]
+ \definefontsynonym [SerifBold] [Serif]
+ \definefontsynonym [SerifItalic] [Serif]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldItalic] [Serif]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+ \definefontsynonym [SerifCaps] [Serif]
+\stopsetups
+
+\startsetups [font:fallback:sans]
+ \definefontsynonym [Sans] [DefaultFont]
+ \definefontsynonym [SansBold] [Sans]
+ \definefontsynonym [SansItalic] [Sans]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldItalic] [Sans]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [Sans]
+\stopsetups
+
+\startsetups [font:fallback:mono]
+ \definefontsynonym [Mono] [DefaultFont]
+ \definefontsynonym [MonoBold] [Mono]
+ \definefontsynonym [MonoItalic] [Mono]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldItalic] [Mono]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+ \definefontsynonym [MonoCaps] [Mono]
+\stopsetups
+
+\starttypescript [serif,sans,mono] [fallback]
+ \setups[\s!font:\s!fallback:\typescriptone]
+\stoptypescript
+
+\startsetups [font:allbold:serif]
+ \definefontsynonym [Serif] [SerifBold]
+ \definefontsynonym [SerifItalic] [SerifBoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
+ %definefontsynonym [SerifCaps] [SerifBold]
+\stopsetups
+
+\startsetups [font:allbold:sans]
+ \definefontsynonym [Sans] [SansBold]
+ \definefontsynonym [SansItalic] [SansBoldItalic]
+ \definefontsynonym [SansSlanted] [SansBoldSlanted]
+ %definefontsynonym [SansCaps] [SansBold]
+\stopsetups
+
+\usetypescriptfile[\f!typeprefix def]
+\usetypescriptfile[\f!typeprefix lua]
+%usetypescriptfile[\f!typeprefix tmf]
+\usetypescriptfile[\f!typeprefix siz]
+\usetypescriptfile[\f!typeprefix otf]
+\usetypescriptfile[\f!typeprefix loc]
+
+\protect \endinput
diff --git a/tex/context/base/type-siz.mkii b/tex/context/base/type-siz.mkii
new file mode 100644
index 000000000..831019e95
--- /dev/null
+++ b/tex/context/base/type-siz.mkii
@@ -0,0 +1,748 @@
+%D \module
+%D [ file=type-siz,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Sizing scripts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\starttypescriptcollection[size]
+
+\starttypescript [serif] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [rm] [default]
+\stoptypescript
+
+\starttypescript [sans] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [ss] [default]
+\stoptypescript
+
+\starttypescript [mono] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [tt] [default]
+\stoptypescript
+
+\starttypescript [math,boldmath] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [mm] [default]
+\stoptypescript
+
+\starttypescript [bfmath] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [mm] [bfmath]
+\stoptypescript
+
+\starttypescript [handwriting] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [hw] [default]
+\stoptypescript
+
+\starttypescript [calligraphy] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [cg] [default]
+\stoptypescript
+
+\starttypescript [casual] [default] [size] % maps onto rm !
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [rm] [default]
+\stoptypescript
+
+\starttypescript [all] [dtp] [size]
+
+ \definebodyfontenvironment
+ [4pt]
+ [\s!text=4pt,\s!script=4pt,\s!scriptscript=4pt,
+ \c!x=4pt,\c!xx=4pt,\c!big=6pt,\c!small=4pt]
+
+ \definebodyfontenvironment
+ [5pt]
+ [\s!text=5pt,\s!script=5pt,\s!scriptscript=5pt,
+ \c!x=5pt,\c!xx=5pt,\c!big=7pt,\c!small=5pt]
+
+ \definebodyfontenvironment
+ [6pt]
+ [\s!text=6pt,\s!script=5pt,\s!scriptscript=5pt,
+ \c!x=5pt,\c!xx=5pt,\c!big=8pt,\c!small=5pt]
+
+ \definebodyfontenvironment
+ [7pt]
+ [\s!text=7pt,\s!script=6pt,\s!scriptscript=5pt,
+ \c!x=6pt,\c!xx=5pt,\c!big=9pt,\c!small=5pt]
+
+ \definebodyfontenvironment
+ [8pt]
+ [\s!text=8pt,\s!script=6pt,\s!scriptscript=5pt,
+ \c!x=6pt,\c!xx=5pt,\c!big=10pt,\c!small=6pt]
+
+ \definebodyfontenvironment
+ [9pt]
+ [\s!text=9pt,\s!script=7pt,\s!scriptscript=5pt,
+ \c!x=7pt,\c!xx=5pt,\c!big=11pt,\c!small=7pt]
+
+ \definebodyfontenvironment
+ [10pt]
+ [\s!text=10pt,\s!script=7pt,\s!scriptscript=5pt,
+ \c!x=8pt,\c!xx=6pt,\c!big=12pt,\c!small=8pt]
+
+ \definebodyfontenvironment
+ [11pt]
+ [\s!text=11pt,\s!script=8pt,\s!scriptscript=6pt,
+ \c!x=9pt,\c!xx=7pt,\c!big=13pt,\c!small=9pt]
+
+ \definebodyfontenvironment
+ [12pt]
+ [\s!text=12pt,\s!script=9pt,\s!scriptscript=7pt,
+ \c!x=10pt,\c!xx=8pt,\c!big=14pt,\c!small=10pt]
+
+ \definebodyfontenvironment
+ [13pt]
+ [\s!text=13pt,\s!script=10pt,\s!scriptscript=8pt,
+ \c!x=11pt,\c!xx=9pt,\c!big=16pt,\c!small=11pt]
+
+ \definebodyfontenvironment
+ [14pt]
+ [\s!text=14pt,\s!script=10pt,\s!scriptscript=7pt,
+ \c!x=12pt,\c!xx=10pt,\c!big=16pt,\c!small=12pt]
+
+ \definebodyfontenvironment
+ [16pt]
+ [\s!text=16pt,\s!script=12pt,\s!scriptscript=9pt,
+ \c!x=13pt,\c!xx=11pt,\c!big=18pt,\c!small=14pt]
+
+ % suboptimal math sizes
+
+ \definebodyfontenvironment
+ [18pt]
+ [\s!text=18pt,\s!script=16pt,\s!scriptscript=14pt,
+ \c!x=16pt,\c!xx=14pt,\c!big=22pt,\c!small=16pt]
+
+ \definebodyfontenvironment
+ [22pt]
+ [\s!text=22pt,\s!script=22pt,\s!scriptscript=18pt,
+ \c!x=18pt,\c!xx=16pt,\c!big=28pt,\c!small=18pt]
+
+ \definebodyfontenvironment
+ [28pt]
+ [\s!text=28pt,\s!script=22pt,\s!scriptscript=18pt,
+ \c!x=22pt,\c!xx=18pt,\c!big=28pt,\c!small=22pt]
+
+\stoptypescript
+
+\starttypescript [serif] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [rm] [default]
+\stoptypescript
+
+\starttypescript [sans] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [ss] [default]
+\stoptypescript
+
+\starttypescript [mono] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [tt] [default]
+\stoptypescript
+
+\starttypescript [math,boldmath] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [mm] [default]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[size-mkii]
+
+% todo: instead of assuming designsize we will set it explicitly (saves these
+% -1000 problems at the lua end)
+
+% cmr
+
+\starttypescript [serif] [computer-modern] [size]
+
+ \definebodyfont [12pt] [rm]
+ [tf=cmr12,
+ bf=cmbx12,
+ it=cmti12,
+ sl=cmsl12,
+ bi=cmbxti10 at 12pt,
+ bs=cmbxsl10 at 12pt,
+ sc=cmcsc10 at 12pt]
+
+ \definebodyfont [11pt] [rm]
+ [tf=cmr10 at 11pt,
+ bf=cmbx10 at 11pt,
+ sl=cmsl10 at 11pt,
+ it=cmti10 at 11pt,
+ bi=cmbxti10 at 11pt,
+ bs=cmbxsl10 at 11pt,
+ sc=cmcsc10 at 11pt]
+
+ \definebodyfont [10pt] [rm]
+ [tf=cmr10,
+ bf=cmbx10,
+ it=cmti10,
+ sl=cmsl10,
+ bi=cmbxti10,
+ bs=cmbxsl10,
+ sc=cmcsc10]
+
+ \definebodyfont [9pt] [rm]
+ [tf=cmr9,
+ bf=cmbx9,
+ it=cmti9,
+ sl=cmsl9,
+ bi=cmbxti10 at 9pt,
+ bs=cmbxsl10 at 9pt,
+ sc=cmcsc10 at 9pt]
+
+ \definebodyfont [8pt] [rm]
+ [tf=cmr8,
+ bf=cmbx8,
+ it=cmti8,
+ sl=cmsl8,
+ bi=cmbxti10 at 8pt,
+ bs=cmbxsl10 at 8pt,
+ sc=cmcsc10 at 8pt]
+
+ \definebodyfont [7pt] [rm]
+ [tf=cmr7,
+ bf=cmbx7,
+ it=cmti10 at 7pt,
+ sl=cmsl10 at 7pt,
+ bi=cmbxti10 at 7pt,
+ bs=cmbxsl10 at 7pt,
+ sc=cmcsc10 at 7pt]
+
+ \definebodyfont [6pt] [rm]
+ [tf=cmr6,
+ bf=cmbx6,
+ it=cmti10 at 6pt,
+ sl=cmsl10 at 6pt,
+ bi=cmbxti10 at 6pt,
+ bs=cmbxsl10 at 6pt,
+ sc=cmcsc10 at 6pt]
+
+ \definebodyfont [5pt] [rm]
+ [tf=cmr5,
+ bf=cmbx5,
+ it=cmti10 at 5pt,
+ sl=cmsl10 at 5pt,
+ bi=cmbxti10 at 5pt,
+ bs=cmbxsl10 at 5pt,
+ sc=cmcsc10 at 5pt]
+
+ \definebodyfont [4pt] [rm]
+ [tf=cmr10 at 4pt,
+ bf=cmbx10 at 4pt,
+ it=cmti10 at 4pt,
+ sl=cmsl10 at 4pt,
+ bi=cmbxti10 at 4pt,
+ bs=cmbxsl10 at 4pt,
+ sc=cmr10 at 4pt]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [rm]
+ [tf=cmr12 sa 1,
+ bf=cmbx12 sa 1,
+ it=cmti12 sa 1,
+ sl=cmsl12 sa 1,
+ bi=cmbxti10 sa 1,
+ bs=cmbxsl10 sa 1,
+ sc=cmcsc10 sa 1]
+
+\stoptypescript
+
+\starttypescript [sans] [computer-modern] [size]
+
+ \definebodyfont [12pt] [ss]
+ [tf=cmss12,
+ bf=cmssbx10 at 12pt,
+ it=cmssi12,
+ sl=cmssi12,
+ bi=cmssbx10 at 12pt,
+ bs=cmssbx10 at 12pt,
+ sc=cmss10 at 12pt]
+
+ \definebodyfont [11pt] [ss]
+ [tf=cmss10 at 11pt,
+ bf=cmssbx10 at 11pt,
+ it=cmssi10 at 11pt,
+ sl=cmssi10 at 11pt,
+ bi=cmssbx10 at 11pt,
+ bs=cmssbx10 at 11pt,
+ sc=cmss10 at 11pt]
+
+ \definebodyfont [10pt] [ss]
+ [tf=cmss10,
+ bf=cmssbx10,
+ it=cmssi10,
+ sl=cmssi10,
+ bi=cmssbx10,
+ bs=cmssbx10,
+ sc=cmss10]
+
+ \definebodyfont [9pt] [ss]
+ [tf=cmss9,
+ bf=cmssbx10 at 9pt,
+ it=cmssi9,
+ sl=cmssi9,
+ bi=cmssbx10 at 9pt,
+ bs=cmssbx10 at 9pt,
+ sc=cmss9]
+
+ \definebodyfont [8pt] [ss]
+ [tf=cmss8,
+ bf=cmssbx10 at 8pt,
+ it=cmssi8,
+ sl=cmssi8,
+ bi=cmssbx10 at 8pt,
+ bs=cmssbx10 at 8pt,
+ sc=cmss8]
+
+ \definebodyfont [7pt] [ss]
+ [tf=cmss10 at 7pt,
+ bf=cmssbx10 at 7pt,
+ it=cmssi10 at 7pt,
+ sl=cmssi10 at 7pt,
+ bs=cmssbx10 at 7pt,
+ bi=cmssbx10 at 7pt,
+ sc=cmss10 at 7pt]
+
+ \definebodyfont [6pt] [ss]
+ [tf=cmss10 at 6pt,
+ bf=cmssbx10 at 6pt,
+ it=cmssi10 at 6pt,
+ sl=cmssi10 at 6pt,
+ bs=cmssbx10 at 6pt,
+ bi=cmssbx10 at 6pt,
+ sc=cmss10 at 6pt]
+
+ \definebodyfont [5pt] [ss]
+ [tf=cmss10 at 5pt,
+ bf=cmssbx10 at 5pt,
+ it=cmssi10 at 5pt,
+ sl=cmssi10 at 5pt,
+ bs=cmssbx10 at 5pt,
+ bi=cmssbx10 at 5pt,
+ sc=cmss10 at 5pt]
+
+ \definebodyfont [4pt] [ss]
+ [tf=cmss10 at 4pt,
+ bf=cmssbx10 at 4pt,
+ it=cmssi10 at 4pt,
+ sl=cmssi10 at 4pt,
+ bs=cmssbx10 at 4pt,
+ bi=cmssbx10 at 4pt,
+ sc=cmss10 at 4pt]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [ss]
+ [tf=cmss12 sa 1,
+ bf=cmssbx10 sa 1,
+ it=cmssi12 sa 1,
+ sl=cmssi12 sa 1,
+ bi=cmssbx10 sa 1,
+ bs=cmssbx10 sa 1,
+ sc=cmss12 sa 1]
+
+\stoptypescript
+
+\starttypescript [mono] [computer-modern] [size]
+
+ \definebodyfont [12pt] [tt]
+ [tf=cmtt12,
+ sl=cmsltt10 at 12pt,
+ it=cmitt10 at 12pt,
+ sc=cmtcsc10 at 12pt]
+
+ \definebodyfont [9pt] [tt]
+ [tf=cmtt9,
+ sl=cmsltt10 at 9pt,
+ it=cmitt10 at 9pt,
+ sc=cmtcsc10 at 9pt]
+
+ \definebodyfont [8pt] [tt]
+ [tf=cmtt8,
+ sl=cmsltt10 at 8pt,
+ it=cmitt10 at 8pt,
+ sc=cmtcsc10 at 8pt]
+
+ \definebodyfont [11pt,10pt,7pt,6pt,5pt,4pt] [tt]
+ [tf=cmtt10 sa 1,
+ sl=cmsltt10 sa 1,
+ it=cmitt10 sa 1,
+ sc=cmtcsc10 sa 1]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [tt]
+ [tf=cmtt12 sa 1,
+ sl=cmsltt10 sa 1,
+ it=cmitt10 sa 1,
+ sc=cmtcsc10 sa 1]
+
+\stoptypescript
+
+\starttypescript [math] [modern,computer-modern,latin-modern] [size]
+
+ % hack to prevent mapping of filenames, watch the space! before
+ % latin modern came aroudn we needed this trick to make sure that
+ % we loaded the raw cmr12 etc instead of the ones mapped onto
+ % an encoding (this trick is no longer needed with lm)
+ %
+ % \definefontsynonym[xcmr12][cmr12 ]
+ % \definefontsynonym[xcmr10][cmr10 ]
+ % \definefontsynonym[xcmr9] [cmr9 ]
+ % \definefontsynonym[xcmr8] [cmr8 ]
+ % \definefontsynonym[xcmr7] [cmr7 ]
+ % \definefontsynonym[xcmr6] [cmr6 ]
+ % \definefontsynonym[xcmr5] [cmr5 ]
+
+ \definefontsynonym[xcmr12][rm-lmr12]
+ \definefontsynonym[xcmr10][rm-lmr10]
+ \definefontsynonym[xcmr9] [rm-lmr9]
+ \definefontsynonym[xcmr8] [rm-lmr8]
+ \definefontsynonym[xcmr7] [rm-lmr7]
+ \definefontsynonym[xcmr6] [rm-lmr6]
+ \definefontsynonym[xcmr5] [rm-lmr5]
+
+ \definebodyfont [12pt] [mm]
+ [mr=xcmr12,
+ ex=cmex10 at 12pt,
+ mi=cmmi12,
+ sy=cmsy10 at 12pt]
+
+ \definebodyfont [11pt] [mm]
+ [mr=xcmr10 at 11pt,
+ ex=cmex10 at 11pt,
+ mi=cmmi10 at 11pt,
+ sy=cmsy10 at 11pt]
+
+ \definebodyfont [10pt] [mm]
+ [mr=xcmr10,
+ ex=cmex10,
+ mi=cmmi10,
+ sy=cmsy10]
+
+ \definebodyfont [9pt] [mm]
+ [mr=xcmr9,
+ ex=cmex10 at 9pt,
+ mi=cmmi9,
+ sy=cmsy9]
+
+ \definebodyfont [8pt] [mm]
+ [mr=xcmr8,
+ ex=cmex10 at 8pt,
+ mi=cmmi8,
+ sy=cmsy8]
+
+ \definebodyfont [7pt] [mm]
+ [mr=xcmr7,
+ ex=cmex10 at 7pt,
+ mi=cmmi7,
+ sy=cmsy7]
+
+ \definebodyfont [6pt] [mm]
+ [mr=xcmr6,
+ ex=cmex10 at 6pt,
+ mi=cmmi6,
+ sy=cmsy6]
+
+ \definebodyfont [5pt] [mm]
+ [mr=xcmr5,
+ ex=cmex10 at 5pt,
+ mi=cmmi5,
+ sy=cmsy5]
+
+ \definebodyfont [4pt] [mm]
+ [mr=xcmr5 at 4pt,
+ ex=cmex10 at 4pt,
+ mi=cmmi5 at 4pt,
+ sy=cmsy5 at 4pt]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [mm]
+ [mr=xcmr12 sa 1,
+ ex=cmex10 sa 1,
+ mi=cmmi12 sa 1,
+ sy=cmsy10 sa 1]
+
+\stoptypescript
+
+\starttypescript [boldmath] [modern,computer-modern,latin-modern] [size]
+
+% hack to prevent mapping of filenames, watch the space!
+
+ \definefontsynonym[xcmb12][cmbx12 ]
+ \definefontsynonym[xcmb10][cmbx10 ]
+ \definefontsynonym[xcmb9] [cmbx9 ]
+ \definefontsynonym[xcmb8] [cmbx8 ]
+ \definefontsynonym[xcmb7] [cmbx7 ]
+ \definefontsynonym[xcmb6] [cmbx6 ]
+ \definefontsynonym[xcmb5] [cmbx5 ]
+
+ \definebodyfont [12pt] [mm]
+ [mr=xcmb12,
+ ex=cmex10 at 12pt,
+ mi=cmmib10 at 12pt,
+ sy=cmbsy10 at 12pt]
+
+ \definebodyfont [11pt] [mm]
+ [mr=xcmb10 at 11pt,
+ ex=cmex10 at 11pt,
+ mi=cmmib10 at 11pt,
+ sy=cmbsy10 at 11pt]
+
+ \definebodyfont [10pt] [mm]
+ [mr=xcmb10,
+ ex=cmex10,
+ mi=cmmib10,
+ sy=cmbsy10]
+
+ \definebodyfont [9pt] [mm]
+ [mr=xcmb9,
+ ex=cmex10 at 9pt,
+ mi=cmmib10 at 9pt,
+ sy=cmbsy10 at 9pt]
+
+ \definebodyfont [8pt] [mm]
+ [mr=xcmb8,
+ ex=cmex10 at 8pt,
+ mi=cmmib7 at 8pt,
+ sy=cmbsy7 at 8pt]
+
+ \definebodyfont [7pt] [mm]
+ [mr=xcmb7,
+ ex=cmex10 at 7pt,
+ mi=cmmib7,
+ sy=cmbsy7]
+
+ \definebodyfont [6pt] [mm]
+ [mr=xcmb6,
+ ex=cmex10 at 6pt,
+ mi=cmmib5 at 6pt,
+ sy=cmbsy5 at 6pt]
+
+ \definebodyfont [5pt] [mm]
+ [mr=xcmb5,
+ ex=cmex10 at 5pt,
+ mi=cmmib5,
+ sy=cmbsy5]
+
+ \definebodyfont [4pt] [mm]
+ [mr=xcmb5 at 4pt,
+ ex=cmex10 at 4pt,
+ mi=cmmib5 at 4pt,
+ sy=cmbsy5 at 4pt]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [mm]
+ [mr=xcmb12 sa 1,
+ ex=cmex10 sa 1,
+ mi=cmmib10 sa 1,
+ sy=cmbsy10 sa 1]
+
+\stoptypescript
+
+\starttypescript [bfmath] [modern,computer-modern,latin-modern] [size]
+
+% hack to prevent mapping of filenames, watch the space!
+
+ \definefontsynonym[xcmb12][cmbx12 ]
+ \definefontsynonym[xcmb10][cmbx10 ]
+ \definefontsynonym[xcmb9] [cmbx9 ]
+ \definefontsynonym[xcmb8] [cmbx8 ]
+ \definefontsynonym[xcmb7] [cmbx7 ]
+ \definefontsynonym[xcmb6] [cmbx6 ]
+ \definefontsynonym[xcmb5] [cmbx5 ]
+
+ \definebodyfont [12pt] [mm]
+ [mrbf=xcmb12,
+ exbf=cmex10 at 12pt,
+ mibf=cmmib10 at 12pt,
+ sybf=cmbsy10 at 12pt]
+
+ \definebodyfont [11pt] [mm]
+ [mrbf=xcmb10 at 11pt,
+ exbf=cmex10 at 11pt,
+ mibf=cmmib10 at 11pt,
+ sybf=cmbsy10 at 11pt]
+
+ \definebodyfont [10pt] [mm]
+ [mrbf=xcmb10,
+ exbf=cmex10,
+ mibf=cmmib10,
+ sybf=cmbsy10]
+
+ \definebodyfont [9pt] [mm]
+ [mrbf=xcmb9,
+ exbf=cmex10 at 9pt,
+ mibf=cmmib10 at 9pt,
+ sybf=cmbsy10 at 9pt]
+
+ \definebodyfont [8pt] [mm]
+ [mrbf=xcmb8,
+ exbf=cmex10 at 8pt,
+ mibf=cmmib7 at 8pt,
+ sybf=cmbsy7 at 8pt]
+
+ \definebodyfont [7pt] [mm]
+ [mrbf=xcmb7,
+ exbf=cmex10 at 7pt,
+ mibf=cmmib7,
+ sybf=cmbsy7]
+
+ \definebodyfont [6pt] [mm]
+ [mrbf=xcmb6,
+ exbf=cmex10 at 6pt,
+ mibf=cmmib5 at 6pt,
+ sybf=cmbsy5 at 6pt]
+
+ \definebodyfont [5pt] [mm]
+ [mrbf=xcmb5,
+ exbf=cmex10 at 5pt,
+ mibf=cmmib5,
+ sybf=cmbsy5]
+
+ \definebodyfont [4pt] [mm]
+ [mrbf=xcmb5 at 4pt,
+ exbf=cmex10 at 4pt,
+ mibf=cmmib5 at 4pt,
+ sybf=cmbsy5 at 4pt]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [mm]
+ [mrbf=xcmb12 sa 1,
+ exbf=cmex10 sa 1,
+ mibf=cmmib10 sa 1,
+ sybf=cmbsy10 sa 1]
+
+\stoptypescript
+
+\starttypescript [serif] [concrete] [size]
+
+ \definebodyfont [10pt,11pt,12pt,14.4pt,17.3pt] [rm]
+ [tf=ccr10 sa 1,
+ it=ccti10 sa 1,
+ sl=ccsl10 sa 1,
+ sc=cccsc10 sa 1]
+
+ \definebodyfont [5pt,6pt,7pt,8pt,9pt] [rm]
+ [it=ccr9 sa 1,
+ sl=ccr9 sa 1,
+ sc=ccr9 sa 1]
+
+ \definebodyfont [9pt] [rm] [tf=ccr9]
+ \definebodyfont [8pt] [rm] [tf=ccr8]
+ \definebodyfont [7pt] [rm] [tf=ccr7]
+ \definebodyfont [6pt] [rm] [tf=ccr6]
+ \definebodyfont [5pt] [rm] [tf=ccr5]
+
+\stoptypescript
+
+\starttypescript [math] [euler] [size]
+
+ \definebodyfont [9pt,10pt,11pt,12pt,14.4pt,17.3pt,20.7pt] [mm]
+ [mr=zeurm10 sa 1,
+ ex=zeuex10 sa 1,
+ sy=zeusm10 sa 1,
+ mi=eufm10 sa 1]
+
+ \definebodyfont [6pt,7pt,8pt] [mm]
+ [mr=zeurm7 sa 1,
+ sy=zeusm7 sa 1,
+ mi=eufm7 sa 1,
+ ex=zeuex10 sa 1]
+
+ \definebodyfont [5pt] [mm]
+ [mr=zeurm5,
+ sy=zeusm5,
+ mi=eufm5,
+ ex=zeuex10 at 5pt]
+
+\stoptypescript
+
+\starttypescript [bfmath] [euler] [size]
+
+ \definebodyfont [9pt,10pt,11pt,12pt,14.4pt,17.3pt,20.7pt] [mm]
+ [mrbf=zeurb10 sa 1,
+ exbf=zeuex10 sa 1,
+ sybf=zeusb10 sa 1,
+ mibf=eufb10 sa 1]
+
+ \definebodyfont [6pt,7pt,8pt] [mm]
+ [mrbf=zeurb7 sa 1,
+ sybf=zeusb7 sa 1,
+ mibf=eufb7 sa 1,
+ exbf=zeuex10 sa 1]
+
+ \definebodyfont [5pt] [mm]
+ [mrbf=zeurb5,
+ sybf=zeusb5,
+ mibf=eufb5,
+ exbf=zeuex10 at 5pt]
+
+\stoptypescript
+
+\starttypescript [boldmath] [euler] [size]
+
+ \definebodyfont [9pt,10pt,11pt,12pt,14.4pt,17.3pt,20.7pt] [mm]
+ [mr=zeurb10 sa 1,
+ ex=zeuex10 sa 1,
+ sy=zeusb10 sa 1,
+ mi=eufb10 sa 1]
+
+ \definebodyfont [6pt,7pt,8pt] [mm]
+ [mr=zeurb7 sa 1,
+ sy=zeusb7 sa 1,
+ mi=eufb7 sa 1,
+ ex=zeuex10 sa 1]
+
+ \definebodyfont [5pt] [mm]
+ [mr=zeurb5,
+ sy=zeusb5,
+ mi=eufb5,
+ ex=zeuex10 at 5pt]
+
+\stoptypescript
+
+\starttypescript [math] [modern,computer-modern,latin-modern,ams] [size]
+ \definebodyfont [17.3pt,14.4pt,12pt,11pt,10pt,9pt] [mm]
+ [ma=msam10 sa 1,
+ mb=msbm10 sa 1]
+ \definebodyfont [8pt,7pt] [mm]
+ [ma=msam7 sa 1,
+ mb=msbm7 sa 1]
+ \definebodyfont [6pt,5pt,4pt] [mm]
+ [ma=msam5 sa 1,
+ mb=msbm5 sa 1]
+\stoptypescript
+
+\starttypescript [math] [times] [size]
+
+ \mapfontsize [5pt] [6.0pt]
+ \mapfontsize [6pt] [6.8pt]
+ \mapfontsize [7pt] [7.6pt]
+ \mapfontsize [8pt] [8.4pt]
+ \mapfontsize [9pt] [9.2pt]
+ \mapfontsize [10pt] [10pt]
+ \mapfontsize [11pt] [10.8pt]
+ \mapfontsize [12pt] [11.6pt]
+ \mapfontsize [14.4pt] [13.2pt]
+
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-siz.mkiv b/tex/context/base/type-siz.mkiv
new file mode 100644
index 000000000..f513c7392
--- /dev/null
+++ b/tex/context/base/type-siz.mkiv
@@ -0,0 +1,398 @@
+%D \module
+%D [ file=type-siz,
+%D version=2001.04.12,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Sizing scripts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\starttypescriptcollection[size]
+
+\starttypescript [serif] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [rm] [default]
+\stoptypescript
+
+\starttypescript [sans] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [ss] [default]
+\stoptypescript
+
+\starttypescript [mono] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [tt] [default]
+\stoptypescript
+
+\starttypescript [math,boldmath] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [mm] [default]
+\stoptypescript
+
+\starttypescript [bfmath] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [mm] [bfmath]
+\stoptypescript
+
+\starttypescript [handwriting] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [hw] [default]
+\stoptypescript
+
+\starttypescript [calligraphy] [default] [size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [cg] [default]
+\stoptypescript
+
+\starttypescript [casual] [default] [size] % maps onto rm !
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [rm] [default]
+\stoptypescript
+
+\starttypescript [all] [dtp] [size]
+
+ \definebodyfontenvironment
+ [4pt]
+ [\s!text=4pt,\s!script=4pt,\s!scriptscript=4pt,
+ \c!x=4pt,\c!xx=4pt,\c!big=6pt,\c!small=4pt]
+
+ \definebodyfontenvironment
+ [5pt]
+ [\s!text=5pt,\s!script=5pt,\s!scriptscript=5pt,
+ \c!x=5pt,\c!xx=5pt,\c!big=7pt,\c!small=5pt]
+
+ \definebodyfontenvironment
+ [6pt]
+ [\s!text=6pt,\s!script=5pt,\s!scriptscript=5pt,
+ \c!x=5pt,\c!xx=5pt,\c!big=8pt,\c!small=5pt]
+
+ \definebodyfontenvironment
+ [7pt]
+ [\s!text=7pt,\s!script=6pt,\s!scriptscript=5pt,
+ \c!x=6pt,\c!xx=5pt,\c!big=9pt,\c!small=5pt]
+
+ \definebodyfontenvironment
+ [8pt]
+ [\s!text=8pt,\s!script=6pt,\s!scriptscript=5pt,
+ \c!x=6pt,\c!xx=5pt,\c!big=10pt,\c!small=6pt]
+
+ \definebodyfontenvironment
+ [9pt]
+ [\s!text=9pt,\s!script=7pt,\s!scriptscript=5pt,
+ \c!x=7pt,\c!xx=5pt,\c!big=11pt,\c!small=7pt]
+
+ \definebodyfontenvironment
+ [10pt]
+ [\s!text=10pt,\s!script=7pt,\s!scriptscript=5pt,
+ \c!x=8pt,\c!xx=6pt,\c!big=12pt,\c!small=8pt]
+
+ \definebodyfontenvironment
+ [11pt]
+ [\s!text=11pt,\s!script=8pt,\s!scriptscript=6pt,
+ \c!x=9pt,\c!xx=7pt,\c!big=13pt,\c!small=9pt]
+
+ \definebodyfontenvironment
+ [12pt]
+ [\s!text=12pt,\s!script=9pt,\s!scriptscript=7pt,
+ \c!x=10pt,\c!xx=8pt,\c!big=14pt,\c!small=10pt]
+
+ \definebodyfontenvironment
+ [13pt]
+ [\s!text=13pt,\s!script=10pt,\s!scriptscript=8pt,
+ \c!x=11pt,\c!xx=9pt,\c!big=16pt,\c!small=11pt]
+
+ \definebodyfontenvironment
+ [14pt]
+ [\s!text=14pt,\s!script=10pt,\s!scriptscript=7pt,
+ \c!x=12pt,\c!xx=10pt,\c!big=16pt,\c!small=12pt]
+
+ \definebodyfontenvironment
+ [16pt]
+ [\s!text=16pt,\s!script=12pt,\s!scriptscript=9pt,
+ \c!x=13pt,\c!xx=11pt,\c!big=18pt,\c!small=14pt]
+
+ % suboptimal math sizes
+
+ \definebodyfontenvironment
+ [18pt]
+ [\s!text=18pt,\s!script=16pt,\s!scriptscript=14pt,
+ \c!x=16pt,\c!xx=14pt,\c!big=22pt,\c!small=16pt]
+
+ \definebodyfontenvironment
+ [22pt]
+ [\s!text=22pt,\s!script=22pt,\s!scriptscript=18pt,
+ \c!x=18pt,\c!xx=16pt,\c!big=28pt,\c!small=18pt]
+
+ \definebodyfontenvironment
+ [28pt]
+ [\s!text=28pt,\s!script=22pt,\s!scriptscript=18pt,
+ \c!x=22pt,\c!xx=18pt,\c!big=28pt,\c!small=22pt]
+
+\stoptypescript
+
+\starttypescript [serif] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [rm] [default]
+\stoptypescript
+
+\starttypescript [sans] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [ss] [default]
+\stoptypescript
+
+\starttypescript [mono] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [tt] [default]
+\stoptypescript
+
+\starttypescript [math,boldmath] [dtp] [size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [mm] [default]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[size-mkiv]
+
+\starttypescript [serif] [computer-modern] [size]
+
+ \definebodyfont [12pt] [rm]
+ [tf=LMRoman12-Regular,
+ bf=LMRoman12-Bold,
+ it=LMRoman12-Italic,
+ sl=LMRoman12-Oblique,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [11pt] [rm]
+ [tf=LMRoman10-Regular sa 1,
+ bf=LMRoman10-Bold sa 1,
+ it=LMRoman10-Italic sa 1,
+ sl=LMRoman10-Oblique sa 1,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [10pt] [rm]
+ [tf=LMRoman10-Regular,
+ bf=LMRoman10-Bold,
+ it=LMRoman10-Italic,
+ sl=LMRoman10-Oblique,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [9pt] [rm]
+ [tf=LMRoman9-Regular,
+ bf=LMRoman9-Bold,
+ it=LMRoman9-Italic,
+ sl=LMRoman9-Oblique,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [8pt] [rm]
+ [tf=LMRoman8-Regular,
+ bf=LMRoman8-Bold,
+ it=LMRoman8-Italic,
+ sl=LMRoman8-Oblique,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [7pt] [rm]
+ [tf=LMRoman7-Regular,
+ bf=LMRoman7-Bold,
+ it=LMRoman7-Italic sa 1,
+ sl=LMRoman8-Oblique sa 1,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [6pt] [rm]
+ [tf=LMRoman6-Regular,
+ bf=LMRoman6-Bold,
+ it=LMRoman7-Italic sa 1,
+ sl=LMRoman8-Oblique sa 1,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [5pt] [rm]
+ [tf=LMRoman5-Regular,
+ bf=LMRoman5-Bold,
+ it=LMRoman7-Italic sa 1,
+ sl=LMRoman8-Oblique sa 1,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [4pt] [rm]
+ [tf=LMRoman5-Regular sa 1,
+ bf=LMRoman5-Bold sa 1,
+ it=LMRoman7-Italic sa 1,
+ sl=LMRoman8-Oblique sa 1,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [rm]
+ [tf=LMRoman12-Regular sa 1,
+ bf=LMRoman12-Bold sa 1,
+ it=LMRoman12-Italic sa 1,
+ sl=LMRoman12-Oblique sa 1,
+ bi=LMRoman10-BoldItalic sa 1,
+ bs=LMRoman10-BoldOblique sa 1,
+ sc=LMRoman10-CapsRegular sa 1]
+
+\stoptypescript
+
+\starttypescript [sans] [computer-modern] [size]
+
+ \definebodyfont [12pt] [ss]
+ [tf=LMSans12-Regular,
+ bf=LMSans10-Bold sa 1,
+ it=LMSans12-Oblique,
+ sl=LMSans12-Oblique,
+ bi=LMSans10-BoldOblique sa 1,
+ bs=LMSans10-BoldOblique sa 1,
+ sc=LMSans12-Regular]
+
+ \definebodyfont [11pt] [ss]
+ [tf=LMSans10-Regular sa 1,
+ bf=LMSans10-Bold sa 1,
+ it=LMSans10-Oblique sa 1,
+ sl=LMSans10-Oblique sa 1,
+ bi=LMSans10-BoldOblique sa 1,
+ bs=LMSans10-BoldOblique sa 1,
+ sc=LMSans10-Regular sa 1]
+
+ \definebodyfont [10pt] [ss]
+ [tf=LMSans10-Regular,
+ bf=LMSans10-Bold,
+ it=LMSans10-Oblique,
+ sl=LMSans10-Oblique,
+ bi=LMSans10-BoldOblique,
+ bs=LMSans10-BoldOblique,
+ sc=LMSans10-Regular]
+
+ \definebodyfont [9pt] [ss]
+ [tf=LMSans9-Regular,
+ bf=LMSans10-Bold sa 1,
+ it=LMSans9-Oblique sa 1,
+ sl=LMSans9-Oblique sa 1,
+ bi=LMSans10-BoldOblique sa 1,
+ bs=LMSans10-BoldOblique sa 1,
+ sc=LMSans9-Regular]
+
+ \definebodyfont [8pt] [ss]
+ [tf=LMSans8-Regular,
+ bf=LMSans10-Bold sa 1,
+ it=LMSans8-Oblique,
+ sl=LMSans8-Oblique,
+ bi=LMSans10-BoldOblique sa 1,
+ bs=LMSans10-BoldOblique sa 1,
+ sc=LMSans8-Regular]
+
+ \definebodyfont [7pt,6pt,5pt,4pt] [ss]
+ [tf=LMSans8-Regular sa 1,
+ bf=LMSans10-Bold sa 1,
+ it=LMSans8-Oblique sa 1,
+ sl=LMSans8-Oblique sa 1,
+ bi=LMSans10-BoldOblique sa 1,
+ bs=LMSans10-BoldOblique sa 1,
+ sc=LMSans8-Regular sa 1]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [ss]
+ [tf=LMSans12-Regular sa 1,
+ bf=LMSans10-Bold sa 1,
+ it=LMSans12-Oblique sa 1,
+ sl=LMSans12-Oblique sa 1,
+ bi=LMSans10-BoldOblique sa 1,
+ bs=LMSans10-BoldOblique sa 1,
+ sc=LMSans12-Regular sa 1]
+
+\stoptypescript
+
+\starttypescript [mono] [computer-modern] [size]
+
+ \definebodyfont [12pt] [tt]
+ [tf=LMTypewriter12-Regular,
+ it=LMTypewriter10-Italic sa 1,
+ sl=LMTypewriter10-Oblique sa 1,
+ bf=LMTypewriter10-Dark sa 1,
+ bs=LMTypewriter10-DarkOblique sa 1,
+ sc=LMTypewriter10-CapsRegular sa 1]
+
+ \definebodyfont [9pt] [tt]
+ [tf=LMTypewriter9-Regular,
+ it=LMTypewriter10-Italic sa 1,
+ sl=LMTypewriter10-Oblique sa 1,
+ bf=LMTypewriter10-Dark sa 1,
+ bs=LMTypewriter10-DarkOblique sa 1,
+ sc=LMTypewriter10-CapsRegular sa 1]
+
+ \definebodyfont [8pt] [tt]
+ [tf=LMTypewriter8-Regular,
+ it=LMTypewriter10-Italic sa 1,
+ sl=LMTypewriter10-Oblique sa 1,
+ bf=LMTypewriter10-Dark sa 1,
+ bs=LMTypewriter10-DarkOblique sa 1,
+ sc=LMTypewriter10-CapsRegular sa 1]
+
+ \definebodyfont [11pt,10pt,7pt,6pt,5pt,4pt] [tt]
+ [tf=LMTypewriter10-Regular sa 1,
+ it=LMTypewriter10-Italic sa 1,
+ sl=LMTypewriter10-Oblique sa 1,
+ bf=LMTypewriter10-Dark sa 1,
+ bs=LMTypewriter10-DarkOblique sa 1,
+ sc=LMTypewriter10-CapsRegular sa 1]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [tt]
+ [tf=LMTypewriter12-Regular sa 1,
+ it=LMTypewriter10-Italic sa 1,
+ sl=LMTypewriter10-Oblique sa 1,
+ bf=LMTypewriter10-Dark sa 1,
+ bs=LMTypewriter10-DarkOblique sa 1,
+ sc=LMTypewriter10-CapsRegular sa 1]
+
+\stoptypescript
+
+% ms=MathSymbol sa 1
+
+\starttypescript [math] [modern,computer-modern,latin-modern] [size]
+
+ \definebodyfont [12pt] [mm] [mr=LMMathRoman12-Regular sa 1, mb=LMMathRoman12-Bold sa 1]
+ \definebodyfont [11pt] [mm] [mr=LMMathRoman10-Regular sa 1, mb=LMMathRoman10-Bold sa 1]
+ \definebodyfont [10pt] [mm] [mr=LMMathRoman10-Regular sa 1, mb=LMMathRoman10-Bold sa 1]
+ \definebodyfont [9pt] [mm] [mr=LMMathRoman9-Regular sa 1, mb=LMMathRoman9-Bold sa 1]
+ \definebodyfont [8pt] [mm] [mr=LMMathRoman8-Regular sa 1, mb=LMMathRoman8-Bold sa 1]
+ \definebodyfont [7pt] [mm] [mr=LMMathRoman7-Regular sa 1, mb=LMMathRoman7-Bold sa 1]
+ \definebodyfont [6pt] [mm] [mr=LMMathRoman6-Regular sa 1, mb=LMMathRoman6-Bold sa 1]
+ \definebodyfont [5pt] [mm] [mr=LMMathRoman5-Regular sa 1, mb=LMMathRoman5-Bold sa 1]
+ \definebodyfont [4pt] [mm] [mr=LMMathRoman5-Regular sa 1, mb=LMMathRoman5-Bold sa 1]
+
+ \definebodyfont [14.4pt,17.3pt,20.7pt] [mm] [mr=LMMathRoman12-Regular sa 1, mb=LMMathRoman12-Bold sa 1]
+
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-tmf.mkii b/tex/context/base/type-tmf.mkii
new file mode 100644
index 000000000..af9280c73
--- /dev/null
+++ b/tex/context/base/type-tmf.mkii
@@ -0,0 +1,14 @@
+%D \module
+%D [ file=type-tmf,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Core \TEX\ Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\endinput
diff --git a/tex/context/base/type-tmf.mkiv b/tex/context/base/type-tmf.mkiv
new file mode 100644
index 000000000..af9280c73
--- /dev/null
+++ b/tex/context/base/type-tmf.mkiv
@@ -0,0 +1,14 @@
+%D \module
+%D [ file=type-tmf,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Core \TEX\ Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\endinput
diff --git a/tex/context/base/type-win.mkii b/tex/context/base/type-win.mkii
new file mode 100644
index 000000000..cb0ad19f5
--- /dev/null
+++ b/tex/context/base/type-win.mkii
@@ -0,0 +1,69 @@
+%D \module
+%D [ file=type-msw,
+%D version=2005.02.04,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Microsoft Windows Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \usetypescriptfile[type-msw]
+%
+% \definetypeface[verdana][ss][sans] [verdana] [default][encoding=texnansi]
+% \definetypeface[verdana][rm][serif][palatino][default][encoding=texnansi,rscale=1.1]
+% \definetypeface[verdana][mm][math] [palatino][default][encoding=texnansi,rscale=1.1]
+% \definetypeface[verdana][tt][mono] [modern] [default][encoding=texnansi,rscale=1.25]
+%
+% \setupbodyfont[verdana] \showfontstrip
+%
+% \startlines
+% {\rm test {\sl test} {\it test} {\bf test} {\bs test} {\bi test}}
+% {\ss test {\sl test} {\it test} {\bf test} {\bs test} {\bi test}}
+% {\tt test {\sl test} {\it test} {\bf test} {\bs test} {\bi test}}
+% \stoplines
+
+\starttypescriptcollection[windows]
+
+% verdana
+
+\starttypescript [sans] [verdana] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Verdana]
+ \definefontsynonym [SansBold] [Verdana-Bold]
+ \definefontsynonym [SansItalic] [Verdana-Italic]
+ \definefontsynonym [SansBoldItalic] [Verdana-BoldItalic]
+\stoptypescript
+
+\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[\typescriptthree-microsoft-verdana.map]
+\stoptypescript
+
+% arial
+
+\starttypescript [sans] [arial] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [ArialMT]
+ \definefontsynonym [SansBold] [Arial-BoldMT]
+ \definefontsynonym [SansItalic] [Arial-ItalicMT]
+ \definefontsynonym [SansBoldItalic] [Arial-BoldItalicMT]
+\stoptypescript
+
+\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[\typescriptthree-microsoft-arial.map]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-win.mkiv b/tex/context/base/type-win.mkiv
new file mode 100644
index 000000000..3f06fa4db
--- /dev/null
+++ b/tex/context/base/type-win.mkiv
@@ -0,0 +1,118 @@
+%D \module
+%D [ file=type-win,
+%D version=2009.03.10,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=MS Windows Definitions,
+%D author=Vyatcheslav Yatskovsky,
+%D date=\currentdate,
+%D copyright=Vyatcheslav Yatskovsky]
+%C
+%C This module is part of the \CONTEXT\ macro||package. See
+%C mreadme.pdf for details.
+
+\starttypescriptcollection[windows]
+
+\starttypescript [serif] [georgia,palatino,times]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [\typescripttwo-Regular] [features=default]
+ \definefontsynonym [SerifBold] [\typescripttwo-Bold] [features=default]
+ \definefontsynonym [SerifItalic] [\typescripttwo-Italic] [features=default]
+ \definefontsynonym [SerifBoldItalic] [\typescripttwo-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [sylfaen]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [\typescripttwo-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial,trebuchet,verdana]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [\typescripttwo-Regular] [features=default]
+ \definefontsynonym [SansBold] [\typescripttwo-Bold] [features=default]
+ \definefontsynonym [SansItalic] [\typescripttwo-Italic] [features=default]
+ \definefontsynonym [SansBoldItalic] [\typescripttwo-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arialblack,impact,lucidasans,microsans]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [\typescripttwo-Regular] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [comic,tahoma]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [\typescripttwo-Regular] [features=default]
+ \definefontsynonym [SansBold] [\typescripttwo-Bold] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [franklin]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [\typescripttwo-Regular] [features=default]
+ \definefontsynonym [SansItalic] [\typescripttwo-Italic] [features=default]
+\stoptypescript
+
+\starttypescript [mono] [courier]
+ \setups[font:fallback:mono]
+ \definefontsynonym [Mono] [\typescripttwo-Regular] [features=default]
+ \definefontsynonym [MonoBold] [\typescripttwo-Bold] [features=default]
+ \definefontsynonym [MonoItalic] [\typescripttwo-Italic] [features=default]
+ \definefontsynonym [MonoBoldItalic] [\typescripttwo-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [mono] [lucidaconsole]
+ \setups[font:fallback:mono]
+ \definefontsynonym [Mono] [\typescripttwo-Regular] [features=default]
+\stoptypescript
+
+\definetypescriptprefix [f:arial] [Arial]
+\definetypescriptprefix [f:arialblack] [Arial Black]
+\definetypescriptprefix [f:comic] [Comic Sans MS]
+\definetypescriptprefix [f:courier] [Courier New]
+\definetypescriptprefix [f:franklin] [Franklin Gothic Medium]
+\definetypescriptprefix [f:georgia] [Georgia]
+\definetypescriptprefix [f:impact] [Impact]
+\definetypescriptprefix [f:lucidaconsole] [Lucida Console]
+\definetypescriptprefix [f:lucidasans] [Lucida Sans Unicode]
+\definetypescriptprefix [f:microsans] [Microsoft Sans Serif]
+\definetypescriptprefix [f:palatino] [Palatino Linotype]
+\definetypescriptprefix [f:sylfaen] [Sylfaen]
+\definetypescriptprefix [f:tahoma] [Tahoma]
+\definetypescriptprefix [f:times] [Times New Roman]
+\definetypescriptprefix [f:trebuchet] [Trebuchet MS]
+\definetypescriptprefix [f:verdana] [Verdana]
+
+\starttypescript [serif] [georgia,palatino,sylfaen,times]
+ \definefontsynonym [\typescripttwo-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+ \definefontsynonym [\typescripttwo-Bold] [name:\typescriptprefix{f:\typescripttwo} Bold] [features=default]
+ \definefontsynonym [\typescripttwo-Italic] [name:\typescriptprefix{f:\typescripttwo} Italic] [features=default]
+ \definefontsynonym [\typescripttwo-BoldItalic] [name:\typescriptprefix{f:\typescripttwo} Bold Italic] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [arial,arialblack,comic,franklin,impact,lucidasans,microsans,tahoma,trebuchet,verdana]
+ \definefontsynonym [\typescripttwo-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+ \definefontsynonym [\typescripttwo-Bold] [name:\typescriptprefix{f:\typescripttwo} Bold] [features=default]
+ \definefontsynonym [\typescripttwo-Italic] [name:\typescriptprefix{f:\typescripttwo} Italic] [features=default]
+ \definefontsynonym [\typescripttwo-BoldItalic] [name:\typescriptprefix{f:\typescripttwo} Bold Italic] [features=default]
+\stoptypescript
+
+\starttypescript [mono] [courier,lucidaconsole]
+ \definefontsynonym [\typescripttwo-Regular] [name:\typescriptprefix{f:\typescripttwo}] [features=default]
+ \definefontsynonym [\typescripttwo-Bold] [name:\typescriptprefix{f:\typescripttwo} Bold] [features=default]
+ \definefontsynonym [\typescripttwo-Italic] [name:\typescriptprefix{f:\typescripttwo} Italic] [features=default]
+ \definefontsynonym [\typescripttwo-BoldItalic] [name:\typescriptprefix{f:\typescripttwo} Bold Italic] [features=default]
+\stoptypescript
+
+\starttypescript [georgia,palatino,sylfaen,times]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
+\stoptypescript
+
+\starttypescript [arial,arialblack,comic,franklin,impact,lucidasans,microsans,tahoma,trebuchet,verdana]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
+\stoptypescript
+
+\starttypescript [courier,lucidaconsole]
+ \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-xtx.mkii b/tex/context/base/type-xtx.mkii
new file mode 100644
index 000000000..0ee0130f7
--- /dev/null
+++ b/tex/context/base/type-xtx.mkii
@@ -0,0 +1,563 @@
+%D \module
+%D [ file=type-xtx,
+%D version=2004.11.15, % prereleased earlier
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=\XETEX's font treasures,
+%D author=Adam T. Lindsay,
+%D date=\currentdate,
+%D copyright={Adam T. Lindsay / PRAGMA}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Here are some fonts definitions that can get you started with
+%D \XETEX\ (for more details see Adam's MyWay documents).
+%D
+%D Most typescripts in this file are mostly independent of the other
+%D typescript files. Generally, you can speed things up a lot by
+%D eliminating all but one of \CONTEXT's typescript files:
+%D
+%D \starttyping
+%D \usetypescriptfiles[reset] % HH: watch out, new feature, since
+%D \usetypescriptfiles[type-siz] % I disliked the low level redef.
+%D \stoptyping
+%D
+%D The exceptions are the \quotation {legacy} fonts Times, Palatino,
+%D Courier, and Helvetica, which also depend on \type {type-syn}.
+%D
+%D These following six typescripts call the basic four variants on any
+%D given font, given the name of the \quotation {Regular} variant in the
+%D name slot. These typescripts default to a Unicode encoding,
+%D accepts sizes \quotation {default} and \quotation {dtp}, and are
+%D activated with the identifiers \quotation {Xserif}, \quotation {Xsans},
+%D and \quotation {Xmono}. They can have relative scaling within the
+%D typeface. Any of the following work:
+%D
+%D \starttyping
+%D \definetypeface[basic][rm][Xserif][Baskerville]
+%D \definetypeface[basic][ss][Xsans] [Optima Regular][default][features=default,rscale=0.87]
+%D \definetypeface[basic][tt][Xmono] [Courier] [default]
+%D \stoptyping
+%D
+%D Activate the typeface with:
+%D
+%D \starttyping
+%D \setupbodyfont[basic]
+%D \stoptyping
+
+%D This file is hacked by Taco Hoekwater in an attempt to figure out the right approach
+%D to font loading in \XeTeX. (jun19,2007)
+
+%D The General \XeTeX\ low-level font syntax is (at least) as follows.
+%D
+%D Named font:
+%D \starttyping
+%D \font\x = "<fontname><engine-options>:<featurelist>" <at or scaled>
+%D \stoptyping
+%D \type{<fontname>} = Font name as seen in a system font menu or the output of fc-list
+%D
+%D \type{<engine-options>} = \type{/B} or \type{/I} or \tupe{/BI}, and||or \type{/S=<X>}.
+%D That last one selects an optical scaled variant for size \type{<X>}
+%D (it is a bare number, the unit is points).
+%D
+%D \type{<featurelist>} = comma- or semicolon- separated list of font features.
+%D
+%D Opentype features are selected using \type{+<tag>}, and deselected using \type{-<tag>},
+%D except that key||value pairs are used for \type{script=<tag>} and \type{language=<tag>}
+%D
+%D AAT features are always key||value pairs, often including spaces.
+%D
+%D \XETEX's own features are key||value pairs, and can be applied to both OpenType
+%D and AAT fonts:
+%D \type{mapping=<font map>} for glyph remapping
+%D \type{color=RRGGBB[TT]} for color (hex numbers, with optional transparancy),
+%D \type{letterspace=<x>} to add \type{<x>/<fontsize>} intercharacter spacing.
+%D
+%D Full example showing all parts of the syntax for an OTF font:
+%D \starttyping
+%D \font\f= "Warnock Pro/I/S=5:+smcp,-liga,mapping=tex-text,script=latn"
+%D \stoptyping
+
+%D Non-installed (filename-based) fonts :
+%D
+%D \starttyping
+%D \font\x = "[<fontname>]:<featurelist>" <at or scaled>
+%D \stoptyping
+%D
+%D Here, there are no \type{<engine-options>}, because there is no
+%D font discovery engine available to be queried.
+
+%D TH: This \type{\xetexcolon} definition seems needed because the name/file \
+%D parser otherwise drops the rest of the argument into oblivion.
+
+\unexpanded\def\xetexcolon{:}
+
+\starttypescriptcollection[xetex]
+
+\starttypescript[Xserif][all][name]
+
+%D TH: I removed all single quotes because they don't seem to add anything. And I added
+%D the \type{name:} everywhere, because passing that information on \type{\typescripttwo}
+%D doesn't work either (maybe \type{\typescripttwo} is expanded incorrectly)
+%D
+%D And even if that would have worked, \type{file:} will not work properly anyway
+%D in this case since tricks like \type{/I} will never, ever work for local fonts,
+%D so there is really only one choice.
+
+%D HH: todo, define feature set switch mapping=tex-tex
+
+\definefontsynonym[Dummy] [name:\typescripttwo] [features=default]
+\definefontsynonym[DummyItalic] [name:\typescripttwo/I] [features=default]
+\definefontsynonym[DummyBold] [name:\typescripttwo/B] [features=default]
+\definefontsynonym[DummyBoldItalic][name:\typescripttwo/BI][features=default]
+
+\definefontsynonym[DummyCaps] [name:\typescripttwo] [features=smallcaps]
+
+\definefontsynonym[Serif] [Dummy]
+\definefontsynonym[SerifBold] [DummyBold]
+\definefontsynonym[SerifItalic] [DummyItalic]
+\definefontsynonym[SerifBoldItalic] [DummyBoldItalic]
+\definefontsynonym[SerifSlanted] [DummyItalic]
+\definefontsynonym[SerifBoldSlanted][DummyBoldItalic]
+\definefontsynonym[SerifCaps] [DummyCaps]
+
+\stoptypescript
+
+\starttypescript[Xsans][all][name]
+
+\definefontsynonym[DummySans] [name:\typescripttwo] [features=default]
+\definefontsynonym[DummySansItalic] [name:\typescripttwo/I] [features=default]
+\definefontsynonym[DummySansBold] [name:\typescripttwo/B] [features=default]
+\definefontsynonym[DummySansBoldItalic][name:\typescripttwo/BI][features=default]
+
+\definefontsynonym[DummySansCaps] [name:\typescripttwo] [features=smallcaps]
+
+\definefontsynonym[Sans] [DummySans]
+\definefontsynonym[SansBold] [DummySansBold]
+\definefontsynonym[SansItalic] [DummySansItalic]
+\definefontsynonym[SansBoldItalic] [DummySansBoldItalic]
+\definefontsynonym[SansSlanted] [DummySansItalic]
+\definefontsynonym[SansBoldSlanted][DummySansBoldItalic]
+\definefontsynonym[SansCaps] [DummySansCaps]
+
+\stoptypescript
+
+\starttypescript[Xmono][all][name]
+
+\definefontsynonym[DummyMono] [name:\typescripttwo]
+\definefontsynonym[DummyMonoItalic] [name:\typescripttwo/I]
+\definefontsynonym[DummyMonoBold] [name:\typescripttwo/B]
+\definefontsynonym[DummyMonoBoldItalic][name:\typescripttwo/BI]
+
+% TODO: smallcaps without other features
+
+\definefontsynonym[Mono] [DummyMono]
+\definefontsynonym[MonoBold] [DummyMonoBold]
+\definefontsynonym[MonoItalic] [DummyMonoItalic]
+\definefontsynonym[MonoBoldItalic] [DummyMonoBoldItalic]
+\definefontsynonym[MonoSlanted] [DummyMonoItalic]
+\definefontsynonym[MonoBoldSlanted][DummyMonoBoldItalic]
+\definefontsynonym[MonoCaps] [DummyMono]
+
+\stoptypescript
+
+\starttypescript[Xserif][default][size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt] [rm]
+ [default]
+\stoptypescript
+
+\starttypescript[Xsans][default][size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [ss] [default]
+\stoptypescript
+
+\starttypescript [Xmono][default][size]
+ \definebodyfont
+ [4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
+ [tt] [default]
+\stoptypescript
+
+\starttypescript[Xserif][dtp][size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [rm] [default]
+\stoptypescript
+
+\starttypescript[Xsans][dtp][size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [ss] [default]
+\stoptypescript
+
+\starttypescript[Xmono][dtp][size]
+ \definebodyfont
+ [5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,13pt,14pt,16pt,18pt,22pt,28pt]
+ [tt] [default]
+\stoptypescript
+
+%D The following are \quotation {legacy} named fonts. Times, Palatino,
+%D and Helvetica are familiar to most users of modern \TEX\
+%D systems. These versions are accessed via the Unicode encoding
+%D enabled by \XETEX. There is no attempt to match metrics with
+%D the actual legacy fonts. These are simply familiar names.
+
+%D These typescripts, unlike others in this file, depend on those in
+%D \type{type-pre}.
+
+\starttypescript[serif][times][uc]
+
+\definefontsynonym[Times-Roman] [name:Times Roman] [features=default]
+\definefontsynonym[Times-Italic] [name:Times Italic] [features=default]
+\definefontsynonym[Times-Bold] [name:Times Bold] [features=default]
+\definefontsynonym[Times-BoldItalic][name:Times Bold Italic][features=default]
+
+\stoptypescript
+
+%D Book Antiqua is Mac OS X's Palatino clone.
+
+\starttypescript[serif][palatino][uc]
+
+\definefontsynonym[Palatino] [name:Book Antiqua] [features=default]
+\definefontsynonym[Palatino-Italic] [name:Book Antiqua Italic] [features=default]
+\definefontsynonym[Palatino-Bold] [name:Book Antiqua Bold] [features=default]
+\definefontsynonym[Palatino-BoldItalic] [name:Book Antiqua Bold Italic][features=default]
+
+\definefontsynonym[Palatino-Slanted] [Palatino-Italic]
+\definefontsynonym[Palatino-BoldSlanted] [Palatino-BoldItalic]
+\definefontsynonym[Palatino-Caps] [Palatino]
+
+\stoptypescript
+
+%D The default Helvetica doesn't have an oblique variant, so we'll
+%D go ahead and name Helvertica Neue here.
+
+\starttypescript[sans][helvetica][uc]
+
+\definefontsynonym[Helvetica] [name:Helvetica Neue] [features=default]
+\definefontsynonym[Helvetica-Oblique] [name:Helvetica Neue Italic] [features=default]
+\definefontsynonym[Helvetica-Bold] [name:Helvetica Neue Bold] [features=default]
+\definefontsynonym[Helvetica-BoldOblique][name:Helvetica Neue Bold Italic][features=default]
+
+\stoptypescript
+
+%D Courier, as delivered on MacOSX 10.3, doesn't have an oblique
+%D variant, either. Unfortunately, none of the default Mono fonts in
+%D MacOSX have oblique|/|italic versions!
+
+\starttypescript[mono][courier][uc]
+
+\definefontsynonym[Courier] [name:Courier]
+\definefontsynonym[Courier-Oblique] [Courier]
+\definefontsynonym[Courier-Bold] [name:Courier Bold]
+\definefontsynonym[Courier-BoldOblique][Courier-Bold]
+
+\stoptypescript
+
+%D The following fonts go beyond the usual four variants that
+%D are accessible via the above wildcard typescripts, so they
+%D get a more expanded treatment here\xetexcolon
+
+\starttypescript[serif][hoefler][uc]
+
+\definefontsynonym[Hoefler] [name:Hoefler Text\xetexcolon mapping=tex-text;%
+ Ligatures=Diphthongs] [encoding=uc]
+\definefontsynonym[HoeflerItalic][name:Hoefler Text Italic\xetexcolon mapping=tex-text;%
+ Ligatures=Diphthongs] [encoding=uc]
+\definefontsynonym[HoeflerBlack] [name:Hoefler Text Black\xetexcolon mapping=tex-text;%
+ Ligatures=Diphthongs] [encoding=uc]
+\definefontsynonym[HoeflerBlackItalic][name:Hoefler Text Black Italic\xetexcolon mapping=tex-text;%
+ Ligatures=Diphthongs] [encoding=uc]
+\definefontsynonym[HoeflerSmCap] [name:Hoefler Text\xetexcolon mapping=tex-text;%
+ Ligatures=Diphthongs;%
+ Letter Case=Small Caps][encoding=uc]
+\stoptypescript
+
+\starttypescript[serif][hoefler][name]
+
+\definefontsynonym[Serif] [Hoefler]
+\definefontsynonym[SerifBold] [HoeflerBlack]
+\definefontsynonym[SerifItalic] [HoeflerItalic]
+\definefontsynonym[SerifBoldItalic] [HoeflerBlackItalic]
+\definefontsynonym[SerifSlanted] [HoeflerItalic]
+\definefontsynonym[SerifBoldSlanted][HoeflerBlackItalic]
+\definefontsynonym[SerifCaps] [HoeflerSmCap]
+
+\stoptypescript
+
+\starttypescript[sans][lucidagrande][uc]
+
+\definefontsynonym[LucidaGrande] [name:Lucida Grande] [features=default]
+\definefontsynonym[LucidaGrandeBold][name:Lucida Grande Bold][features=default]
+
+\stoptypescript
+
+\starttypescript[sans][lucidagrande][name]
+
+\definefontsynonym[Sans] [LucidaGrande]
+\definefontsynonym[SansBold] [LucidaGrandeBold]
+\definefontsynonym[SansItalic] [LucidaGrande]
+\definefontsynonym[SansBoldItalic] [LucidaGrandeBold]
+\definefontsynonym[SansSlanted] [LucidaGrande]
+\definefontsynonym[SansBoldSlanted][LucidaGrandeBold]
+\definefontsynonym[SansCaps] [LucidaGrande]
+
+\stoptypescript
+
+\starttypescript[sans][optima][uc]
+\definefontsynonym[Optima] [name:Optima Regular] [features=default]
+\definefontsynonym[OptimaItalic] [name:Optima Italic] [features=default]
+\definefontsynonym[OptimaBold] [name:Optima Bold] [features=default]
+\definefontsynonym[OptimaBoldItalic][name:Optima Bold Italic][features=default]
+\definefontsynonym[OptimaBlack] [name:Optima ExtraBlack] [features=default]
+\stoptypescript
+
+\starttypescript[sans][optima][name]
+
+\definefontsynonym[Sans] [Optima]
+\definefontsynonym[SansBold] [OptimaBold]
+\definefontsynonym[SansItalic] [OptimaItalic]
+\definefontsynonym[SansBoldItalic] [OptimaBoldItalic]
+\definefontsynonym[SansSlanted] [OptimaItalic]
+\definefontsynonym[SansBoldSlanted][OptimaBoldItalic]
+\definefontsynonym[SansCaps] [Optima]
+
+\stoptypescript
+
+\starttypescript[sans][gillsans,gillsanslt][uc]
+
+\definefontsynonym[GillSans] [name:Gill Sans] [features=default]
+\definefontsynonym[GillSansItalic] [name:Gill Sans Italic] [features=default]
+\definefontsynonym[GillSansBold] [name:Gill Sans Bold] [features=default]
+\definefontsynonym[GillSansBoldItalic] [name:Gill Sans Bold Italic] [features=default]
+\definefontsynonym[GillSansLight] [name:Gill Sans Light] [features=default]
+\definefontsynonym[GillSansLightItalic][name:Gill Sans Light Italic][features=default]
+
+\stoptypescript
+
+\starttypescript[sans][gillsans][name]
+
+\definefontsynonym[Sans] [GillSans]
+\definefontsynonym[SansBold] [GillSansBold]
+\definefontsynonym[SansItalic] [GillSansItalic]
+\definefontsynonym[SansBoldItalic] [GillSansBoldItalic]
+\definefontsynonym[SansSlanted] [GillSansItalic]
+\definefontsynonym[SansBoldSlanted][GillSansBoldItalic]
+\definefontsynonym[SansCaps] [GillSans]
+
+\stoptypescript
+
+\starttypescript[sans][gillsanslt][name]
+
+\definefontsynonym[Sans] [GillSansLight]
+\definefontsynonym[SansBold] [GillSans]
+\definefontsynonym[SansItalic] [GillSansLightItalic]
+\definefontsynonym[SansBoldItalic] [GillSansItalic]
+\definefontsynonym[SansSlanted] [GillSansLightItalic]
+\definefontsynonym[SansBoldSlanted][GillSansItalic]
+\definefontsynonym[SansCaps] [GillSansLight]
+
+\stoptypescript
+
+\starttypescript[serif,handwriting][zapfino][uc]
+
+\definefontsynonym[ZapfinoOne] [name:Zapfino\xetexcolon mapping=tex-text] [encoding=uc]
+\definefontsynonym[ZapfinoTwo] [name:Zapfino\xetexcolon mapping=tex-text;%
+ Stylistic Variants=First variant glyph set] [encoding=uc]
+\definefontsynonym[ZapfinoThree][name:Zapfino\xetexcolon mapping=tex-text;%
+ Stylistic Variants=Second variant glyph set][encoding=uc]
+\definefontsynonym[ZapfinoFour] [name:Zapfino\xetexcolon mapping=tex-text;%
+ Stylistic Variants=Third variant glyph set] [encoding=uc]
+\stoptypescript
+
+\starttypescript[handwriting][zapfino][name]
+
+\definefontsynonym[Handwriting][ZapfinoOne]
+
+\stoptypescript
+
+\starttypescript[serif][zapfino][name]
+
+\definefontsynonym[Serif] [ZapfinoOne]
+\definefontsynonym[SerifBold] [ZapfinoThree]
+\definefontsynonym[SerifItalic] [ZapfinoTwo]
+\definefontsynonym[SerifBoldItalic] [ZapfinoTwo]
+\definefontsynonym[SerifSlanted] [ZapfinoThree]
+\definefontsynonym[SerifBoldSlanted][ZapfinoThree]
+\definefontsynonym[SerifCaps] [ZapfinoOne]
+
+\stoptypescript
+
+\starttypescript[serif,calligraphy][applechancery][uc]
+
+\definefontsynonym[AppleChanceryOne] [name:Apple Chancery\xetexcolon mapping=tex-text;%
+ Number Case=Old Styles] [encoding=uc]
+\definefontsynonym[AppleChanceryTwo] [name:Apple Chancery\xetexcolon mapping=tex-text;%
+ Number Case=Old Styles;%
+ Design Complexity=Elegant Design Level][encoding=uc]
+\definefontsynonym[AppleChanceryThree] [name:Apple Chancery\xetexcolon mapping=tex-text;%
+ Number Case=Old Styles;%
+ Design Complexity=Flourishes Set A] [encoding=uc]
+\definefontsynonym[AppleChanceryFour] [name:Apple Chancery\xetexcolon mapping=tex-text;%
+ Number Case=Old Styles;%
+ Design Complexity=Flourishes Set B] [encoding=uc]
+\definefontsynonym[AppleChanceryCaps] [name:Apple Chancery\xetexcolon mapping=tex-text;%
+ Number Case=Old Styles;%
+ Letter Case=Small Caps] [encoding=uc]
+\definefontsynonym[AppleChanceryCapsTwo][name:Apple Chancery\xetexcolon mapping=tex-text;%
+ Number Case=Old Styles;%
+ Letter Case=Small Caps;%
+ Design Complexity=Flourishes Set B] [encoding=uc]
+\stoptypescript
+
+\starttypescript[calligraphy][applechancery][name]
+
+\definefontsynonym[Calligraphy][AppleChanceryOne]
+
+\stoptypescript
+
+\starttypescript[serif][applechancery][name]
+
+\definefontsynonym[Serif] [AppleChanceryOne]
+\definefontsynonym[SerifBold] [AppleChanceryThree]
+\definefontsynonym[SerifItalic] [AppleChanceryTwo]
+\definefontsynonym[SerifBoldItalic] [AppleChanceryFour]
+\definefontsynonym[SerifSlanted] [AppleChanceryThree]
+\definefontsynonym[SerifBoldSlanted][AppleChanceryFour]
+\definefontsynonym[SerifCaps] [AppleChanceryCaps]
+
+\stoptypescript
+
+% MS Office 2004 for Mac has impressive Unicode coverage in
+% many of its fonts.
+
+\starttypescript[serif][timesnewroman][uc]
+
+\definefontsynonym[MSTimes] [name:Times New Roman] [features=default]
+\definefontsynonym[MSTimesItalic] [name:Times New Roman Italic] [features=default]
+\definefontsynonym[MSTimesBold] [name:Times New Roman Bold] [features=default]
+\definefontsynonym[MSTimesBoldItalic][name:Times New Roman Bold Italic][features=default]
+
+\stoptypescript
+
+\starttypescript[serif][timesnewroman][name]
+
+\definefontsynonym[Serif] [MSTimes]
+\definefontsynonym[SerifBold] [MSTimesBold]
+\definefontsynonym[SerifItalic] [MSTimesItalic]
+\definefontsynonym[SerifBoldItalic] [MSTimesBoldItalic]
+\definefontsynonym[SerifSlanted] [MSTimesItalic]
+\definefontsynonym[SerifBoldSlanted][MSTimesBoldItalic]
+\definefontsynonym[SerifCaps] [MSTimes]
+
+\stoptypescript
+
+\starttypescript[sans][arial][uc]
+
+\definefontsynonym[Arial] [name:Arial] [features=default]
+\definefontsynonym[ArialItalic] [name:Arial Italic] [features=default]
+\definefontsynonym[ArialBold] [name:Arial Bold] [features=default]
+\definefontsynonym[ArialBoldItalic][name:Arial Bold Italic][features=default]
+
+\stoptypescript
+
+\starttypescript[sans][arial][name]
+
+\definefontsynonym[Sans] [Arial]
+\definefontsynonym[SansBold] [ArialBold]
+\definefontsynonym[SansItalic] [ArialItalic]
+\definefontsynonym[SansBoldItalic] [ArialBoldItalic]
+\definefontsynonym[SansSlanted] [ArialItalic]
+\definefontsynonym[SansBoldSlanted][ArialBoldItalic]
+\definefontsynonym[SansCaps] [Arial]
+
+\stoptypescript
+
+%D MS Office comes with an installation of the Lucida family in
+%D TrueType form. It's nice, except\dots\ no math, no slanted, no caps
+%D and some other auxiliary fonts.
+
+\starttypescript [serif] [lucida] [uc]
+
+ \definefontsynonym [LucidaBright] [name:Lucida Bright] [features=default]
+ \definefontsynonym [LucidaBright-Demi] [name:Lucida Bright Demibold][features=default]
+ \definefontsynonym [LucidaBright-DemiItalic] [name:Lucida Bright Demibold][features=default]
+ \definefontsynonym [LucidaBright-Italic] [name:Lucida Bright] [features=default]
+
+ \definefontsynonym [LucidaBrightSmallcaps] [LucidaBright]
+ \definefontsynonym [LucidaBrightSmallcaps-Demi][LucidaBright-Demi]
+ \definefontsynonym [LucidaBright-Oblique] [LucidaBright-Italic]
+
+\stoptypescript
+
+\starttypescript [sans] [lucida] [uc]
+ \definefontsynonym [LucidaSans] [name:Lucida Sans Regular] [features=default]
+ \definefontsynonym [LucidaSans-Demi] [name:Lucida Sans Demibold Roman] [features=default]
+ \definefontsynonym [LucidaSans-DemiItalic][name:Lucida Sans Demibold Italic][features=default]
+ \definefontsynonym [LucidaSans-Italic] [name:Lucida Sans Italic] [features=default]
+
+ \definefontsynonym [LucidaSans-Bold] [LucidaSans-Demi]
+ \definefontsynonym [LucidaSans-BoldItalic][LucidaSans-DemiItalic]
+
+\stoptypescript
+
+\starttypescript [mono] [lucida] [uc]
+
+ \definefontsynonym [LucidaSans-Typewriter] [name:Lucida Sans Typewriter Regular] [encoding=uc]
+ \definefontsynonym [LucidaSans-TypewriterBold] [name:Lucida Sans Typewriter Bold] [encoding=uc]
+ \definefontsynonym [LucidaSans-TypewriterBoldOblique][name:Lucida Sans Typewriter Bold Oblique][encoding=uc]
+ \definefontsynonym [LucidaSans-TypewriterOblique] [name:Lucida Sans Typewriter Oblique] [encoding=uc]
+
+\stoptypescript
+
+\starttypescript [calligraphy] [lucida] [uc]
+
+ \definefontsynonym[LucidaCalligraphy-Italic][name:Lucida Calligraphy Italic][features=default]
+
+\stoptypescript
+
+% No casual that I know of
+
+\starttypescript[handwriting][lucida][uc]
+
+ \definefontsynonym[LucidaHandwriting-Italic][name:Lucida Handwriting Italic][features=default]
+
+\stoptypescript
+
+\starttypescript[fax][lucida][uc]
+
+ \definefontsynonym[LucidaFax] [name:Lucida Fax Regular] [features=default]
+ \definefontsynonym[LucidaFax-Demi] [name:Lucida Fax Demibold] [features=default]
+ \definefontsynonym[LucidaFax-DemiItalic][name:Lucida Fax Demibold Italic][features=default]
+ \definefontsynonym[LucidaFax-Italic] [name:Lucida Fax Italic] [features=default]
+
+\stoptypescript
+
+%D Gentium is from SIL, the fine makers of \XETEX, and it's not only
+%D very complete with Roman and Italic Unicode support, but very
+%D attractive.
+
+\starttypescript[serif][gentium][uc]
+
+\definefontsynonym[Gentium] [name:Gentium] [features=default]
+\definefontsynonym[GentiumItalic][name:Gentium Italic][features=default]
+
+\stoptypescript
+
+\starttypescript[serif][gentium][name]
+
+\definefontsynonym[Serif] [Gentium]
+\definefontsynonym[SerifBold] [Gentium]
+\definefontsynonym[SerifItalic] [GentiumItalic]
+\definefontsynonym[SerifBoldItalic] [GentiumItalic]
+\definefontsynonym[SerifSlanted] [GentiumItalic]
+\definefontsynonym[SerifBoldSlanted][GentiumItalic]
+\definefontsynonym[SerifCaps] [Gentium]
+
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/typo-brk.lua b/tex/context/base/typo-brk.lua
new file mode 100644
index 000000000..8f7a00f9d
--- /dev/null
+++ b/tex/context/base/typo-brk.lua
@@ -0,0 +1,208 @@
+if not modules then modules = { } end modules ['typo-brk'] = {
+ version = 1.001,
+ comment = "companion to typo-brk.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this code dates from the beginning and is kind of experimental; it
+-- will be optimized and improved soon
+
+local next, type, tonumber = next, type, tonumber
+local utfbyte, utfchar = utf.byte, utf.char
+local format = string.format
+
+local settings_to_array = aux.settings_to_array
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local copy_node = node.copy
+local free_node = node.free
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local make_penalty_node = nodes.penalty
+local make_glue_node = nodes.glue
+local make_disc_node = nodes.disc
+local make_glyph_node = nodes.glyph
+local remove_node = nodes.remove -- ! nodes
+local tonodes = blobs.tonodes
+
+local glyph = node.id("glyph")
+local kern = node.id("kern")
+
+breakpoints = breakpoints or { }
+breakpoints.mapping = breakpoints.mapping or { }
+breakpoints.methods = breakpoints.methods or { }
+breakpoints.attribute = attributes.private("breakpoint")
+
+storage.register("breakpoints/mapping", breakpoints.mapping, "breakpoints.mapping")
+
+local mapping = breakpoints.mapping
+
+function breakpoints.setreplacement(id,char,language,settings)
+ char = utfbyte(char)
+ local map = mapping[id]
+ if not map then
+ map = { }
+ mapping[id] = map
+ end
+ local cmap = map[char]
+ if not cmap then
+ cmap = { }
+ map[char] = cmap
+ end
+ local left, right, middle = settings.left, settings.right, settings.middle
+ cmap[language or ""] = {
+ kind = tonumber(settings.kind) or 1,
+ nleft = tonumber(settings.nleft) or 1,
+ nright = tonumber(settings.nright) or 1,
+ left = left ~= "" and left or nil,
+ right = right ~= "" and right or nil,
+ middle = middle ~= "" and middle or nil,
+ } -- was { kind or 1, before or 1, after or 1 }
+end
+
+local function insert_break(head,start,before,after)
+ insert_node_before(head,start,make_penalty_node(before))
+ insert_node_before(head,start,make_glue_node(0))
+ insert_node_after(head,start,make_glue_node(0))
+ insert_node_after(head,start,make_penalty_node(after))
+end
+
+breakpoints.methods[1] = function(head,start)
+ if start.prev and start.next then
+ insert_break(head,start,10000,0)
+ end
+ return head, start
+end
+breakpoints.methods[2] = function(head,start) -- ( => (-
+ if start.prev and start.next then
+ local tmp
+ head, start, tmp = remove_node(head,start)
+ head, start = insert_node_before(head,start,make_disc_node())
+ start.replace = tmp
+ local tmp, hyphen = copy_node(tmp), copy_node(tmp)
+ hyphen.char = languages.prehyphenchar(tmp.lang)
+ tmp.next, hyphen.prev = hyphen, tmp
+ start.post = tmp
+ insert_break(head,start,10000,10000)
+ end
+ return head, start
+end
+breakpoints.methods[3] = function(head,start) -- ) => -)
+ if start.prev and start.next then
+ local tmp
+ head, start, tmp = remove_node(head,start)
+ head, start = insert_node_before(head,start,make_disc_node())
+ start.replace = tmp
+ local tmp, hyphen = copy_node(tmp), copy_node(tmp)
+ hyphen.char = languages.prehyphenchar(tmp.lang)
+ tmp.prev, hyphen.next = hyphen, tmp
+ start.pre = hyphen
+ insert_break(head,start,10000,10000)
+ end
+ return head, start
+end
+breakpoints.methods[4] = function(head,start) -- - => - - -
+ if start.prev and start.next then
+ local tmp
+ head, start, tmp = remove_node(head,start)
+ head, start = insert_node_before(head,start,make_disc_node())
+ start.pre, start.post, start.replace = copy_node(tmp), copy_node(tmp), tmp
+ insert_break(head,start,10000,10000)
+ end
+ return head, start
+end
+breakpoints.methods[5] = function(head,start,settings) -- x => p q r
+ if start.prev and start.next then
+ local tmp
+ head, start, tmp = remove_node(head,start)
+ head, start = insert_node_before(head,start,make_disc_node())
+ start.pre, start.post, start.replace = tonodes(settings.right,tmp), tonodes(settings.left,tmp), tonodes(settings.middle,tmp)
+ free_node(tmp)
+ insert_break(head,start,10000,10000)
+ end
+ return head, start
+end
+
+local methods = breakpoints.methods
+
+function breakpoints.process(namespace,attribute,head)
+ local done, numbers = false, languages.numbers
+ local start, n = head, 0
+ while start do
+ local id = start.id
+ if id == glyph then
+ local attr = has_attribute(start,attribute)
+ if attr and attr > 0 then
+ unset_attribute(start,attribute) -- maybe test for subtype > 256 (faster)
+ -- look ahead and back n chars
+ local map = mapping[attr]
+ if map then
+ local cmap = map[start.char]
+ if cmap then
+ local lang = start.lang
+ -- we do a sanity check for language
+ local smap = lang and lang >= 0 and lang < 0x7FFF and (cmap[numbers[lang]] or cmap[""])
+ if smap then
+ if n >= smap.nleft then
+ local m = smap.nright
+ local next = start.next
+ while next do -- gamble on same attribute (not that important actually)
+ local id = next.id
+ if id == glyph then -- gamble on same attribute (not that important actually)
+ if map[next.char] then
+ break
+ elseif m == 1 then
+ local method = methods[smap.kind]
+ if method then
+ head, start = method(head,start,smap)
+ done = true
+ end
+ break
+ else
+ m = m - 1
+ next = next.next
+ end
+ elseif id == kern and next.subtype == 0 then
+ next = next.next
+ -- ignore intercharacter kerning, will go way
+ else
+ -- we can do clever and set n and jump ahead but ... not now
+ break
+ end
+ end
+ end
+ n = 0
+ else
+ n = n + 1
+ end
+ else
+ n = n + 1
+ end
+ else
+ n = 0
+ end
+ else
+ -- n = n + 1 -- if we want single char handling (|-|) then we will use grouping and then we need this
+ end
+ elseif id == kern and start.subtype == 0 then
+ -- ignore intercharacter kerning, will go way
+ else
+ n = 0
+ end
+ start = start.next
+ end
+ return head, done
+end
+
+chars.handle_breakpoints = nodes.install_attribute_handler {
+ name = "breakpoint",
+ namespace = breakpoints,
+ processor = breakpoints.process,
+}
+
+function breakpoints.enable()
+ tasks.enableaction("processors","chars.handle_breakpoints")
+end
diff --git a/tex/context/base/typo-brk.mkiv b/tex/context/base/typo-brk.mkiv
new file mode 100644
index 000000000..38afbb454
--- /dev/null
+++ b/tex/context/base/typo-brk.mkiv
@@ -0,0 +1,93 @@
+%D \module
+%D [ file=typo-brk,
+%D version=2009.03.27, % code moved from core-spa.mkiv
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Breakpoints,
+%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}{ConTeXt Typesetting Macros / Breakpoints}
+
+\unprotect
+
+\registerctxluafile{typo-brk}{1.001}
+
+\definesystemattribute[breakpoint] \chardef\breakpointattribute \dogetattributeid{breakpoint}
+
+% compound stuff (under construction)
+
+\newbox\breakpointbox
+
+\exhyphenchar\minusone % we use a different order then base tex, so we really need this
+
+\newcount \maxbreakpointsid
+
+\unexpanded\def\definebreakpoints
+ {\dosingleargument\dodefinebreakpoints}
+
+\def\dodefinebreakpoints[#1]%
+ {\ifcsname\??bp:#1\endcsname \else
+ \global\advance\maxbreakpointsid\plusone
+ \setxvalue{\??bp:#1}{\the\maxbreakpointsid}%
+ \fi}
+
+\def\installbreakpoint
+ {\dotripleempty\doinstallbreakpoint}
+
+% hm, we cannot prebuild lists, font dependent
+%
+% -- type nleft nright language left right middle
+%
+% -- we might eventually stick to only method 5
+
+\def\doinstallbreakpoint[#1][#2][#3]%
+ {\ifcsname\??bp:#1\endcsname
+ \begingroup
+ \getparameters[\??bp][\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
+ \ctxlua{breakpoints.setreplacement(\csname\??bp:#1\endcsname, "#2", "\@@bplanguage", {
+ kind = \@@bptype,
+ nleft = "\@@bpnleft",
+ nright = "\@@bpnright",
+ right = "\@@bpright",
+ left = "\@@bpleft",
+ middle = "\@@bpmiddle"
+ } )}% todo: table
+ \endgroup
+ \fi}
+
+\def\setbreakpoints
+ {\ctxlua{breakpoints.enable()}%
+ \gdef\setbreakpoints[##1]{\attribute\breakpointattribute\csname\??bp:##1\endcsname\relax}%
+ \setbreakpoints}
+
+\letvalue{\??bp:\s!reset}\attributeunsetvalue
+
+\definebreakpoints[compound]
+
+\installbreakpoint [compound] [+] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\installbreakpoint [compound] [-] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\installbreakpoint [compound] [/] [\c!nleft=3,\c!nright=3,\c!type=1] % middle=+,left=,right=
+\installbreakpoint [compound] [(] [\c!nleft=3,\c!nright=3,\c!type=2] % type=5,middle=(,left=(-,right=
+\installbreakpoint [compound] [)] [\c!nleft=3,\c!nright=3,\c!type=3] % type=5,middle=),left=,right=-)
+
+% \start \hsize 1.5cm \setbreakpoints[compound]
+% \installbreakpoint [compound] [-] [nleft=3,nright=3,type=5,left=,right={-},middle={-}]
+% \installbreakpoint [compound] [(] [nleft=3,nright=3,type=5,left=,right={(-},middle={(}]
+% \installbreakpoint [compound] [)] [nleft=3,nright=3,type=5,left={-)},right=,middle={)}]
+% composed-word\par composed(word)\par
+% \stop
+
+% \mainlanguage[czech]
+% \installbreakpoint [compound] [\number`-] [language=cs,nleft=3,nright=3,type=4]
+% \setbreakpoints[compound]
+% \start \hsize 1mm test-test \par \stop
+
+% \setbreakpoints[compound]
+
+\protect \endinput
+
diff --git a/tex/context/base/typo-cap.lua b/tex/context/base/typo-cap.lua
new file mode 100644
index 000000000..5f741da7c
--- /dev/null
+++ b/tex/context/base/typo-cap.lua
@@ -0,0 +1,210 @@
+if not modules then modules = { } end modules ['typo-cap'] = {
+ version = 1.001,
+ comment = "companion to typo-cap.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, type = next, type
+local format, insert = string.format, table.insert
+
+local trace_casing = false trackers.register("nodes.casing", function(v) trace_casing = v end)
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local traverse_id = node.traverse_id
+
+local glyph = node.id("glyph")
+local kern = node.id("kern")
+
+local fontdata = fonts.ids
+local fontchar = fonts.chr
+local chardata = characters.data
+
+cases = cases or { }
+cases.actions = { }
+cases.attribute = attributes.private("case")
+
+local actions = cases.actions
+local lastfont = nil
+
+-- we use char0 as placeholder for the larger font
+
+local function helper(start, code, codes, special, attribute, once)
+ local char = start.char
+ local dc = chardata[char]
+ if dc then
+ local fnt = start.font
+ if special then
+ if start.char == 0 then
+ lastfont = fnt
+ local prev, next = start.prev, start.next
+ prev.next = next
+ if next then
+ next.prev = prev
+ end
+ return prev, true
+ elseif lastfont and start.prev.id ~= glyph then
+ fnt = lastfont
+ start.font = lastfont
+ end
+ end
+ -- local ifc = fontdata[fnt].characters
+ local ifc = fontchar[fnt]
+ local ucs = dc[codes]
+ if ucs then
+ local ok = true
+ for i=1,#ucs do
+ ok = ok and ifc[ucs[i]]
+ end
+ if ok then
+ local prev, original = start, start
+ for i=1,#ucs do
+ local chr = ucs[i]
+ prev = start
+ if i == 1 then
+ start.char = chr
+ else
+ local g = copy_node(original)
+ g.char = chr
+ local next = start.next
+ g.prev = start
+ if next then
+ g.next = next
+ start.next = g
+ next.prev = g
+ end
+ start = g
+ end
+ end
+ if once then lastfont = nil end
+ return prev, true
+ end
+ if once then lastfont = nil end
+ return start, false
+ end
+ local uc = dc[code]
+ if uc and ifc[uc] then
+ start.char = uc
+ if once then lastfont = nil end
+ return start, true
+ end
+ end
+ if once then lastfont = nil end
+ return start, false
+end
+
+actions[1] = function(start,attribute)
+ lastfont = nil
+ return helper(start,'uccode','uccodes')
+end
+
+actions[2] = function(start,attribute)
+ lastfont = nil
+ return helper(start,'lccode','lccodes')
+end
+
+actions[3] = function(start,attribute)
+ lastfont = nil
+ local prev = start.prev
+ if prev and prev.id == kern and prev.subtype == 0 then
+ prev = prev.prev
+ end
+ if not prev or prev.id ~= glyph then
+ --- only the first character is treated
+ for n in traverse_id(glyph,start.next) do
+ if has_attribute(n,attribute) then
+ unset_attribute(n,attribute)
+ end
+ end
+ return helper(start,'uccode','uccodes')
+ else
+ return start, false
+ end
+end
+
+actions[4] = function(start,attribute)
+ lastfont = nil
+ local prev = start.prev
+ if prev and prev.id == kern and prev.subtype == 0 then
+ prev = prev.prev
+ end
+ if not prev or prev.id ~= glyph then
+ return helper(start,'uccode','uccodes')
+ else
+ return start, false
+ end
+end
+
+actions[5] = function(start,attribute) -- 3
+ return helper(start,'uccode','uccodes',true,attribute,true)
+end
+
+actions[6] = function(start,attribute) -- 4
+ return helper(start,'uccode','uccodes',true,attribute,false)
+end
+
+actions[8] = function(start)
+ lastfont = nil
+ local ch = start.char
+ local mr = math.random
+ -- local tfm = fontdata[start.font].characters
+ local tfm = fontchar[start.font]
+ if chardata[ch].lccode then
+ while true do
+ local d = chardata[mr(1,0xFFFF)]
+ if d then
+ local uc = d.uccode
+ if uc and tfm[uc] then
+ start.char = uc
+ return start, true
+ end
+ end
+ end
+ elseif chardata[ch].uccode then
+ while true do
+ local d = chardata[mr(1,0xFFFF)]
+ if d then
+ local lc = d.lccode
+ if lc and tfm[lc] then
+ start.char = lc
+ return start, true
+ end
+ end
+ end
+ else
+ return start, false
+ end
+end
+
+-- node.traverse_id_attr
+
+function cases.process(namespace,attribute,head) -- not real fast but also not used on much data
+ lastfont = nil
+ local done = false
+ for start in traverse_id(glyph,head) do
+ local attr = has_attribute(start,attribute)
+ if attr and attr > 0 then
+ unset_attribute(start,attribute)
+ local action = actions[attr]
+ if action then
+ local _, ok = action(start,attribute)
+ done = done and ok
+ end
+ end
+ end
+ lastfont = nil
+ return head, done
+end
+
+chars.handle_casing = nodes.install_attribute_handler {
+ name = "case",
+ namespace = cases,
+ processor = cases.process,
+}
+
+function cases.enable()
+ tasks.enableaction("processors","chars.handle_casing")
+end
diff --git a/tex/context/base/typo-cap.mkiv b/tex/context/base/typo-cap.mkiv
new file mode 100644
index 000000000..af4e12bc2
--- /dev/null
+++ b/tex/context/base/typo-cap.mkiv
@@ -0,0 +1,212 @@
+%D \module
+%D [ file=typo-cap,
+%D version=2009.03.27, % code moved from core-spa.mkiv
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Mirroring,
+%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}{ConTeXt Typesetting Macros / Caps}
+
+\unprotect
+
+\registerctxluafile{typo-cap}{1.001}
+
+\definesystemattribute[case] \chardef\caseattribute \dogetattributeid{case}
+
+%D \macros
+%D {Word, Words, WORD, WORDS}
+%D
+%D This is probably not the right place to present the next set
+%D of macros.
+%D
+%D \starttyping
+%D \Word {far too many words}
+%D \Words{far too many words}
+%D \WORD {far too many words}
+%D \WORDS{far too many words}
+%D \stoptyping
+%D
+%D \typebuffer
+%D
+%D This calls result in:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D \showsetup{Word}
+%D \showsetup{Words}
+%D \showsetup{WORD}
+%D \showsetup{WORDS}
+
+% test \WORD{test TEST \TeX} test
+% test \word{test TEST \TeX} test
+% test \Word{test TEST \TeX} test
+
+\unexpanded\def\setcharactercasing
+ {\ctxlua{cases.enable()}%
+ \gdef\setcharactercasing[##1]{\attribute\caseattribute##1\relax}%
+ \setcharactercasing}
+
+% todo: names casings
+
+\unexpanded\def\WORD {\groupedcommand{\setcharactercasing[\plusone ]}{}}
+\unexpanded\def\word {\groupedcommand{\setcharactercasing[\plustwo ]}{}}
+\unexpanded\def\Word {\groupedcommand{\setcharactercasing[\plusthree]}{}}
+\unexpanded\def\Words{\groupedcommand{\setcharactercasing[\plusfour ]}{}}
+
+\let\WORDS\WORD
+\let\words\word
+
+%D \macros
+%D {kap,KAP,Kap,Kaps,nokap,userealcaps,usepseudocaps}
+%D
+%D We already introduced \type{\cap} as way to capitalize
+%D words. This command comes in several versions:
+%D
+%D \startbuffer
+%D \cap {let's put on a \cap{cap}}
+%D \cap {let's put on a \nocap{cap}}
+%D \CAP {let's put on a \\{cap}}
+%D \Cap {let's put on a \\{cap}}
+%D \Caps{let's put on a cap}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Note the use of \type{\nocap}, \type{\\} and the nested
+%D \type{\cap}.
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+%D
+%D These macros show te main reason why we introduced the
+%D smaller \type{\tx} and \type{\txx}.
+%D
+%D \starttyping
+%D \cap\romannumerals{1995}
+%D \stoptyping
+%D
+%D This at first sight unusual capitilization is completely
+%D legal.
+%D
+%D \showsetup{smallcapped}
+%D \showsetup{notsmallcapped}
+%D \showsetup{CAPPED}
+%D \showsetup{SmallCapped}
+%D \showsetup{SmallCaps}
+%D
+%D The difference between pseudo and real caps is demonstrated
+%D below:
+%D
+%D \startbuffer
+%D \usepseudocaps \cap{Hans Hagen}
+%D \userealcaps \cap{Hans Hagen}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D The \type {\bgroup} trickery below is needed because of
+%D \type {\groupedcommand}.
+
+\let\disablepseudocaps\relax % maybe used elsewhere
+
+\newconditional\pseudocapsenabled
+
+\def\usepseudocaps{\settrue \pseudocapsenabled}
+\def\userealcaps {\setfalse\pseudocapsenabled}
+
+\usepseudocaps
+
+% we use char0 as placeholder for the larger font
+
+\unexpanded\def\pseudosmallcapped{\groupedcommand{\setcharactercasing[\plusone ]\char\zerocount\tx}{}} % all upper
+\unexpanded\def\pseudoSmallcapped{\groupedcommand{\setcharactercasing[\plusfive]\char\zerocount\tx}{}} % one upper + font
+\unexpanded\def\pseudoSmallCapped{\groupedcommand{\setcharactercasing[\plussix ]\char\zerocount\tx}{}} % some upper + font
+
+\unexpanded\def\realsmallcapped {\groupedcommand{\sc\setcharactercasing[\plusone ]}{}} % all lower
+\unexpanded\def\realSmallcapped {\groupedcommand{\sc\setcharactercasing[\plusthree]}{}} % one upper + font
+\unexpanded\def\realSmallCapped {\groupedcommand{\sc\setcharactercasing[\plusfour ]}{}} % some upper
+
+\unexpanded\def\dohandlesmallcaps
+ {\ifconditional\pseudocapsenabled
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\unexpanded\def\smallcapped{\dohandlesmallcaps\pseudosmallcapped\realsmallcapped}
+\unexpanded\def\Smallcapped{\dohandlesmallcaps\pseudoSmallcapped\realSmallcapped}
+\unexpanded\def\SmallCapped{\dohandlesmallcaps\pseudoSmallCapped\realSmallCapped}
+
+\unexpanded\def\autocap{\ifmmode\expandafter\normalcap\else\expandafter\smallcapped\fi}
+
+\appendtoks
+ \let\normalcap\cap % mathmode cap
+ \let\cap\autocap
+\to \everydump
+
+\let\kap\cap % for old times sake
+\let\Caps\SmallCapped % for old times sake
+
+\let\normalsmallcapped\smallcapped
+\let\normalWORD \WORD
+\let\normalword \word
+
+%D As suggested by WS:
+
+\unexpanded\def\notsmallcapped{\groupedcommand{\setcharactercasing[\plustwo]\char\zerocount}{}}
+
+%D \macros
+%D {setupcapitals}
+%D
+%D By default we use pseudo small caps in titles. This can be
+%D set up with:
+%D
+%D \showsetup{setupcapitals}
+
+\let\normalsmallcapped\smallcapped
+
+\unexpanded\def\setupcapitals
+ {\dosingleempty\dosetupcapitals}
+
+\def\dosetupcapitals[#1]% todo: don't use grouping just a switch
+ {\getparameters[\??kk][#1]%
+ \doifelse\@@kktitle\v!yes
+ {\definealternativestyle[\v!capital][\normalsmallcapped][\normalsmallcapped]%
+ \definealternativestyle[\v!smallcaps][\sc][\sc]}
+ {\definealternativestyle[\v!capital][\normalsmallcapped][\normalWORD]%
+ \definealternativestyle[\v!smallcaps][\sc][\normalWORD]}%
+ \doifelse\@@kksc\v!yes\userealcaps\usepseudocaps}
+
+\let\uppercased\normalWORD
+\let\lowercased\normalword
+
+\setupcapitals
+ [\c!title=\v!yes,
+ \c!sc=\v!no]
+
+% \definestartstop is not yet in available at core-spa time
+%
+% \startrandomized \input tufte \stoprandomized
+%
+% \definestartstop[randomized][\c!before=\dosetattribute{case}{8},\c!after=]
+
+\def\randomizetext{\groupedcommand{\attribute\caseattribute\pluseight}{}}
+
+\definestartstop[randomized][\c!before=\dosetattribute{case}{8},\c!after=]
+
+\protect \endinput
diff --git a/tex/context/base/typo-dig.lua b/tex/context/base/typo-dig.lua
new file mode 100644
index 000000000..c1b44e39f
--- /dev/null
+++ b/tex/context/base/typo-dig.lua
@@ -0,0 +1,106 @@
+if not modules then modules = { } end modules ['typo-dig'] = {
+ version = 1.001,
+ comment = "companion to typo-dig.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, type = next, type
+local format, insert = string.format, table.insert
+local round = math.round
+
+local trace_digits = false trackers.register("nodes.digits", function(v) trace_digits = v end)
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local hpack_node = node.hpack
+local traverse_id = node.traverse_id
+local insert_before = node.insert_before
+local insert_after = node.insert_after
+
+local glyph = node.id("glyph")
+local kern = node.id("kern")
+
+local new_glue = nodes.glue
+
+local fontdata = fonts.identifiers
+local chardata = fonts.characters
+local quaddata = fonts.quads
+local charbase = characters.data
+
+digits = digits or { }
+digits.actions = { }
+digits.attribute = attributes.private("digits")
+
+local actions = digits.actions
+
+-- at some point we can manipulate the glyph node so then i need
+-- to rewrite this
+
+function nodes.aligned(start,stop,width,how)
+ local prv, nxt, head = start.prev, stop.next, nil
+ start.prev, stop.next = nil, nil
+ if how == "flushright" or how == "middle" then
+ head, start = insert_before(start,start,new_glue(0,65536,65536))
+ end
+ if how == "flushleft" or how == "middle" then
+ head, stop = insert_after(start,stop,new_glue(0,65536,65536))
+ end
+ local packed = hpack_node(start,width,"exactly") -- no directional mess here, just lr
+ if prv then
+ prv.next, packed.prev = packed, prv
+ end
+ if nxt then
+ nxt.prev, packed.next = packed, nxt
+ end
+ return packed, prv, nxt
+end
+
+actions[1] = function(start,attribute)
+ local char = start.char
+ if charbase[char].category == "nd" then
+ local font = start.font
+ local oldwidth, newwidth = start.width, fonts.get_digit_width(font)
+ if newwidth ~= oldwidth then
+ local start = nodes.aligned(start,start,newwidth,"middle") -- return three node pointers
+ return start, true
+ end
+ end
+ return start, false
+end
+
+function digits.process(namespace,attribute,head)
+ local done, current, ok = false, head, false
+ while current do
+ if current.id == glyph then
+ local attr = has_attribute(current,attribute)
+ if attr and attr > 0 then
+ unset_attribute(current,attribute)
+ local action = actions[attr]
+ if action then
+ if current == head then
+ head, ok = action(current,attribute)
+ current = head
+ else
+ current, ok = action(current,attribute)
+ end
+ done = done and ok
+ end
+ end
+ end
+ current = current and current.next
+ end
+ return head, done
+end
+
+chars.handle_digits = nodes.install_attribute_handler {
+ name = "digits",
+ namespace = digits,
+ processor = digits.process,
+}
+
+function digits.enable()
+ tasks.enableaction("processors","chars.handle_digits")
+end
diff --git a/tex/context/base/typo-dig.mkiv b/tex/context/base/typo-dig.mkiv
new file mode 100644
index 000000000..d8f731418
--- /dev/null
+++ b/tex/context/base/typo-dig.mkiv
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=typo-dig,
+%D version=2010.01.18,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Digits,
+%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}{ConTeXt Typesetting Macros / Digits}
+
+\unprotect
+
+\registerctxluafile{typo-dig}{1.001}
+
+\definesystemattribute[digits] \chardef\digitsattribute \dogetattributeid{digits}
+
+%D This could as well be a dynamic font feature but why bother.
+%D
+%D \macros
+%D {\equaldigits}
+%D
+%D \starttyping
+%D test test \ruledhbox{123} test test\par
+%D test test \ruledhbox{\equaldigits{123}} test test\par
+%D test test \equaldigits{123} test test\par
+%D \stoptyping
+%D
+%D \typebuffer
+%D
+%D This calls result in:
+%D
+%D \startvoorbeeld
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D \stopvoorbeeld
+
+\unexpanded\def\setdigitsmanipulation
+ {\ctxlua{digits.enable()}%
+ \gdef\setdigitsmanipulation[##1]{\attribute\digitsattribute##1\relax}%
+ \setdigitsmanipulation}
+
+\unexpanded\def\equaldigits{\groupedcommand{\setdigitsmanipulation[\plusone]}{}}
+\unexpanded\def\dummydigit {\hphantom{\setdigitsmanipulation[\plusone]0}}
+
+\protect \endinput
diff --git a/tex/context/base/typo-ini.mkii b/tex/context/base/typo-ini.mkii
new file mode 100644
index 000000000..1317021ef
--- /dev/null
+++ b/tex/context/base/typo-ini.mkii
@@ -0,0 +1,40 @@
+%D \module
+%D [ file=typo-ini,
+%D version=2000.16.09,
+%D title=\CONTEXT\ Typographic 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 Since \CONTEXT\ is dealing with typographics, isn't
+%D September 2000 a bit late to start writing this module? It
+%D may seem so, but since more and more languages are
+%D supported, we think it is time to isolate language specific
+%D typographic extensions in modules. The first language that
+%D demands this is Chinese, and more will follow.
+
+\writestatus{loading}{ConTeXt Typographic Macros / Initialization}
+
+\unprotect
+
+%D \macros
+%D {ifvertical}
+%D
+%D The following switch can be used to signal macros that they
+%D should adapt their behaviour.
+
+\newif\ifvertical % maybe also ifreverse
+
+%D \macros
+%D {vhbox}
+%D
+%D A stupid but useful macro.
+
+\def\vhbox{\ifvertical\vbox\else\hbox\fi}
+
+\protect \endinput
diff --git a/tex/context/base/typo-ini.mkiv b/tex/context/base/typo-ini.mkiv
new file mode 100644
index 000000000..1317021ef
--- /dev/null
+++ b/tex/context/base/typo-ini.mkiv
@@ -0,0 +1,40 @@
+%D \module
+%D [ file=typo-ini,
+%D version=2000.16.09,
+%D title=\CONTEXT\ Typographic 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 Since \CONTEXT\ is dealing with typographics, isn't
+%D September 2000 a bit late to start writing this module? It
+%D may seem so, but since more and more languages are
+%D supported, we think it is time to isolate language specific
+%D typographic extensions in modules. The first language that
+%D demands this is Chinese, and more will follow.
+
+\writestatus{loading}{ConTeXt Typographic Macros / Initialization}
+
+\unprotect
+
+%D \macros
+%D {ifvertical}
+%D
+%D The following switch can be used to signal macros that they
+%D should adapt their behaviour.
+
+\newif\ifvertical % maybe also ifreverse
+
+%D \macros
+%D {vhbox}
+%D
+%D A stupid but useful macro.
+
+\def\vhbox{\ifvertical\vbox\else\hbox\fi}
+
+\protect \endinput
diff --git a/tex/context/base/typo-krn.lua b/tex/context/base/typo-krn.lua
new file mode 100644
index 000000000..746773e0a
--- /dev/null
+++ b/tex/context/base/typo-krn.lua
@@ -0,0 +1,223 @@
+if not modules then modules = { } end modules ['typo-krn'] = {
+ version = 1.001,
+ comment = "companion to typo-krn.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local next, type = next, type
+local utfchar = utf.char
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local find_node_tail = node.tail or node.slide
+local free_node = node.free
+local copy_node = node.copy
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local make_glue_spec = nodes.glue_spec
+local make_kern_node = nodes.kern
+
+local glyph = node.id("glyph")
+local kern = node.id("kern")
+local disc = node.id('disc')
+local glue = node.id('glue')
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+
+local fontdata = fonts.identifiers
+local chardata = fonts.characters
+local quaddata = fonts.quads
+
+kerns = kerns or { }
+kerns.mapping = kerns.mapping or { }
+kerns.factors = kerns.factors or { }
+kerns.attribute = attributes.private("kern")
+
+storage.register("kerns/mapping", kerns.mapping, "kerns.mapping")
+storage.register("kerns/factors", kerns.factors, "kerns.factors")
+
+local mapping = kerns.mapping
+local factors = kerns.factors
+
+function kerns.setspacing(factor)
+ local a = factors[factor]
+ if not a then
+ a = #mapping + 1
+ factors[factors], mapping[a] = a, factor
+ end
+ tex.attribute[kerns.attribute] = a
+ return a
+end
+
+-- one must use liga=no and mode=base and kern=yes
+-- use more helpers
+-- make sure it runs after all others
+-- there will be a width adaptor field in nodes so this will change
+-- todo: interchar kerns / disc nodes / can be made faster
+
+local function process(namespace,attribute,head,force)
+ local scale = tex.scale -- will go
+ local start, done, lastfont = head, false, nil
+ while start do
+ -- faster to test for attr first
+ local attr = force or has_attribute(start,attribute)
+ if attr and attr > 0 then
+ unset_attribute(start,attribute)
+ local krn = mapping[attr]
+ if krn and krn ~= 0 then
+ local id = start.id
+ if id == glyph then
+ lastfont = start.font
+ local c = start.components
+ if c then
+ local s = start
+ local tail = find_node_tail(c)
+ if s.prev then
+ s.prev.next = c
+ c.prev = s.prev
+ else
+ head = c
+ end
+ if s.next then
+ s.next.prev = tail
+ end
+ tail.next = s.next
+ start = c
+ start.attr = s.attr
+ s.attr = nil
+ s.components = nil
+ free_node(s)
+ done = true
+ end
+ local prev = start.prev
+ if prev then
+ local pid = prev.id
+ if not pid then
+ -- nothing
+ elseif pid == kern and prev.subtype == 0 then
+ prev.subtype = 1
+ prev.kern = prev.kern + scale(quaddata[lastfont],krn)
+ done = true
+ elseif pid == glyph then
+ if prev.font == lastfont then
+ local prevchar, lastchar = prev.char, start.char
+ local kerns = chardata[lastfont][prevchar].kerns
+ local kern = kerns and kerns[lastchar] or 0
+ krn = scale(kern+quaddata[lastfont],krn)
+ else
+ krn = scale(quaddata[lastfont],krn)
+ end
+ insert_node_before(head,start,make_kern_node(krn))
+ done = true
+ elseif pid == disc then
+ -- a bit too complicated, we can best not copy and just calculate
+ -- but we could have multiple glyphs involved so ...
+ local disc = prev -- disc
+ local pre, post, replace = disc.pre, disc.post, disc.replace
+ local prv, nxt = disc.prev, disc.next
+ if pre and prv then -- must pair with start.prev
+ -- this one happens in most cases
+ local before = copy_node(prv)
+ pre.prev = before
+ before.next = pre
+ before.prev = nil
+ pre = process(namespace,attribute,before,attr)
+ pre = pre.next
+ pre.prev = nil
+ disc.pre = pre
+ free_node(before)
+ end
+ if post and nxt then -- must pair with start
+ local after = copy_node(nxt)
+ local tail = find_node_tail(post)
+ tail.next = after
+ after.prev = tail
+ after.next = nil
+ post = process(namespace,attribute,post,attr)
+ tail.next = nil
+ disc.post = post
+ free_node(after)
+ end
+ if replace and prv and nxt then -- must pair with start and start.prev
+ local before = copy_node(prv)
+ local after = copy_node(nxt)
+ local tail = find_node_tail(replace)
+ replace.prev = before
+ before.next = replace
+ before.prev = nil
+ tail.next = after
+ after.prev = tail
+ after.next = nil
+ replace = process(namespace,attribute,before,attr)
+ replace = replace.next
+ replace.prev = nil
+ after.prev.next = nil
+ disc.replace = replace
+ free_node(after)
+ free_node(before)
+ else
+ if prv and prv.id == glyph and prv.font == lastfont then
+ local prevchar, lastchar = prv.char, start.char
+ local kerns = chardata[lastfont][prevchar].kerns
+ local kern = kerns and kerns[lastchar] or 0
+ krn = scale(kern+quaddata[lastfont],krn)
+ else
+ krn = scale(quaddata[lastfont],krn)
+ end
+ disc.replace = make_kern_node(krn)
+ end
+ end
+ end
+ elseif id == glue and start.subtype == 0 then
+ local s = start.spec
+ local w = s.width
+ if w > 0 then
+ local width, stretch, shrink = w+2*scale(w,krn), s.stretch, s.shrink
+ start.spec = make_glue_spec(width,scale(stretch,width/w),scale(shrink,width/w))
+ -- local width, stretch, shrink = w+2*w*krn, s.stretch, s.shrink
+ -- start.spec = make_glue_spec(width,stretch*width/w,shrink*width/w))
+ done = true
+ end
+ elseif false and id == kern and start.subtype == 0 then -- handle with glyphs
+ local sk = start.kern
+ if sk > 0 then
+ -- start.kern = scale(sk,krn)
+ start.kern = sk*krn
+ done = true
+ end
+ elseif lastfont and (id == hlist or id == vlist) then -- todo: lookahead
+ if start.prev then
+ insert_node_before(head,start,make_kern_node(scale(quaddata[lastfont],krn)))
+ done = true
+ end
+ if start.next then
+ insert_node_after(head,start,make_kern_node(scale(quaddata[lastfont],krn)))
+ done = true
+ end
+ end
+ end
+ end
+ if start then
+ start = start.next
+ end
+ end
+ return head, done
+end
+
+kerns.process = function(namespace,attribute,head)
+ return process(namespace,attribute,head) -- no direct map, because else fourth argument is tail == true
+end
+
+lists.handle_kerning = nodes.install_attribute_handler {
+ name = "kern",
+ namespace = kerns,
+ processor = kerns.process,
+}
+
+function kerns.enable()
+ tasks.enableaction("processors","lists.handle_kerning")
+end
diff --git a/tex/context/base/typo-krn.mkiv b/tex/context/base/typo-krn.mkiv
new file mode 100644
index 000000000..b7a6113bc
--- /dev/null
+++ b/tex/context/base/typo-krn.mkiv
@@ -0,0 +1,79 @@
+%D \module
+%D [ file=typo-krn,
+%D version=2009.03.27, % code moved from core-spa.mkiv
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Spacing,
+%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}{ConTeXt Typesetting Macros / Kerning}
+
+\unprotect
+
+\registerctxluafile{typo-krn}{1.001}
+
+\definesystemattribute[kern] \chardef\kernattribute\dogetattributeid{kern}
+
+% more
+%
+% {\setcharacterkerning[extrakerning]\input davis\relax}
+
+\unexpanded\def\definecharacterkerning
+ {\dodoubleargument\dodefinecharacterkerning}
+
+\def\dodefinecharacterkerning[#1][#2]%
+ {\getparameters[\??ck#1][\c!factor=0.125,#2]%
+ \setgvalue{\??ck:#1}{\ctxlua{kerns.setspacing(\csname\??ck#1\c!factor\endcsname)}}}
+
+\unexpanded\def\setupcharacterkerning
+ {\dodoubleargument\dosetupcharacterkerning}
+
+\def\dosetupcharacterkerning[#1][#2]%
+ {\ifcsname\??ck:#1\endcsname
+ \getparameters[\??ck#1][#2]%
+ \else
+ \dodefinecharacterkerning[#1][#2]% bonus
+ \fi}
+
+\unexpanded\def\setcharacterkerning
+ {\ctxlua{kerns.enable()}%
+ \unexpanded\gdef\setcharacterkerning[##1]{\csname\??ck:##1\endcsname}%
+ \setcharacterkerning}
+
+\letvalue{\??ck:\s!reset}\attributeunsetvalue
+
+\definecharacterkerning [extrakerning] [\c!factor=.125] % used in manuals
+
+%D Added after discussion on list (posted by WS, adapted abit by HH)
+%D \unknown\ this needs to be interfaced (\type {\v!kerncharacters}).
+%D
+%D \starttyping
+%D \setuphead[section][style=\sca,textstyle={\kerncharacters[.5]}] \section{Section}
+%D \stoptyping
+%D
+%D We could combine this with the previous definition command but
+%D then we alwasy would get a command defined which is not beforehand
+%D a good idea.
+
+\def\v!kerncharacters{kerncharacters} % no time now for translations
+
+\definecharacterkerning [\v!kerncharacters] [\c!factor=.125]
+
+\unexpanded\def\kerncharacters
+ {\dosingleempty\dokerncharacters}
+
+\def\dokerncharacters[#1]%
+ {\groupedcommand{\dodokerncharacters{#1}}\donothing}
+
+\def\dodokerncharacters#1%
+ {\iffirstargument
+ \setupcharacterkerning[\v!kerncharacters][\c!factor=#1]%
+ \fi
+ \setcharacterkerning[\v!kerncharacters]}
+
+\protect \endinput
diff --git a/tex/context/base/typo-mir.lua b/tex/context/base/typo-mir.lua
new file mode 100644
index 000000000..6c119c2f2
--- /dev/null
+++ b/tex/context/base/typo-mir.lua
@@ -0,0 +1,419 @@
+if not modules then modules = { } end modules ['typo-mir'] = {
+ version = 1.001,
+ comment = "companion to typo-mir.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local next, type = next, type
+local format, insert, sub, find, match = string.format, table.insert, string.sub, string.find, string.match
+local utfchar = utf.char
+
+-- vertical space handler
+
+local trace_mirroring = false trackers.register("nodes.mirroring", function(v) trace_mirroring = v end)
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local traverse_id = node.traverse_id
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local remove_node = nodes.remove
+
+local glyph = node.id("glyph")
+local whatsit = node.id("whatsit")
+local mthnode = node.id('math')
+
+local fontdata = fonts.ids
+local fontchar = fonts.chr
+local chardata = characters.data
+
+--~ Analysis by Idris:
+--~
+--~ 1. Assuming the reading- vs word-order distinction (bidi-char types) is governing;
+--~ 2. Assuming that 'ARAB' represents an actual arabic string in raw input order, not word-order;
+--~ 3. Assuming that 'BARA' represent the correct RL word order;
+--~
+--~ Then we have, with input: LATIN ARAB
+--~
+--~ \textdir TLT LATIN ARAB => LATIN BARA
+--~ \textdir TRT LATIN ARAB => LATIN BARA
+--~ \textdir TRT LRO LATIN ARAB => LATIN ARAB
+--~ \textdir TLT LRO LATIN ARAB => LATIN ARAB
+--~ \textdir TLT RLO LATIN ARAB => NITAL ARAB
+--~ \textdir TRT RLO LATIN ARAB => NITAL ARAB
+
+-- elseif d == "es" then -- European Number Separator
+-- elseif d == "et" then -- European Number Terminator
+-- elseif d == "cs" then -- Common Number Separator
+-- elseif d == "nsm" then -- Non-Spacing Mark
+-- elseif d == "bn" then -- Boundary Neutral
+-- elseif d == "b" then -- Paragraph Separator
+-- elseif d == "s" then -- Segment Separator
+-- elseif d == "ws" then -- Whitespace
+-- elseif d == "on" then -- Other Neutrals
+
+mirroring = mirroring or { }
+mirroring.strip = false
+mirroring.attribute = attributes.private("mirroring")
+
+local state = attributes.private('state')
+local mirrora = attributes.private('mirroring')
+
+local directions = characters.directions -- maybe make a special mirror table
+
+-- todo: delayed inserts here
+-- todo: get rid of local functions here
+
+-- beware, math adds whatsits afterwards so that will mess things up
+
+local skipmath = true
+
+local finish, autodir, embedded, override, done = nil, 0, 0, 0, false
+local list, glyphs = nil, false
+local finished, finidir, finipos = nil, nil, 1
+local head, current, inserted = nil, nil, nil
+
+local function finish_auto_before()
+ head, inserted = insert_node_before(head,current,nodes.textdir("-"..finish))
+ finished, finidir = inserted, finish
+ if trace_mirroring then
+ insert(list,#list,format("finish %s",finish))
+ finipos = #list-1
+ end
+ finish, autodir, done = nil, 0, true
+end
+
+local function finish_auto_after()
+ head, current = insert_node_after(head,current,nodes.textdir("-"..finish))
+ finished, finidir = current, finish
+ if trace_mirroring then
+ list[#list+1] = format("finish %s",finish)
+ finipos = #list
+ end
+ finish, autodir, done = nil, 0, true
+end
+
+local function force_auto_left_before()
+ if finish then
+ finish_auto_before()
+ end
+ if embedded >= 0 then
+ finish, autodir, done = "TLT", 1, true
+ else
+ finish, autodir, done = "TRT", -1, true
+ end
+ if finidir == finish then
+ remove_node(head,finished,true)
+ if trace_mirroring then
+ list[finipos] = list[finipos].." (deleted)"
+ insert(list,#list,format("start %s (deleted)",finish))
+ end
+ else
+ head, inserted = insert_node_before(head,current,nodes.textdir("+"..finish))
+ if trace_mirroring then
+ insert(list,#list,format("start %s",finish))
+ end
+ end
+end
+
+local function force_auto_right_before()
+ if finish then
+ finish_auto_before()
+ end
+ if embedded <= 0 then
+ finish, autodir, done = "TRT", -1, true
+ else
+ finish, autodir, done = "TLT", 1, true
+ end
+ if finidir == finish then
+ remove_node(head,finished,true)
+ if trace_mirroring then
+ list[finipos] = list[finipos].." (deleted)"
+ insert(list,#list,format("start %s (deleted)",finish))
+ end
+ else
+ head, inserted = insert_node_before(head,current,nodes.textdir("+"..finish))
+ if trace_mirroring then
+ insert(list,#list,format("start %s",finish))
+ end
+ end
+end
+
+function mirroring.process(namespace,attribute,start) -- todo: make faster
+ if not start.next then
+ return start, false
+ end
+ head, current, inserted = start, start, nil
+ finish, autodir, embedded, override, done = nil, 0, 0, 0, false
+ list, glyphs = trace_mirroring and { }, false
+ finished, finidir, finipos = nil, nil, 1
+ local stack, top, obsolete = { }, 0, { }
+ local lro, rlo, prevattr, inmath = false, false, 0, false
+ while current do
+ local id = current.id
+--~ print(id,attribute,has_attribute(current,attribute))
+ if skipmath and id == mthnode then
+ local subtype = current.subtype
+ if subtype == 0 then
+ -- begin math
+ inmath = true
+ elseif subtype == 1 then
+ inmath = false
+ else
+ -- todo
+ end
+ current = current.next
+ elseif inmath then
+ current = current.next
+ else
+ local attr = has_attribute(current,attribute)
+ if attr and attr > 0 then
+ -- unset_attribute(current,attribute) -- slow, needed?
+ if attr == 1 then
+ -- bidi parsing mode
+ elseif attr ~= prevattr then
+ -- no pop, grouped driven (2=normal,3=lro,4=rlo)
+ if attr == 3 then
+ if trace_mirroring then
+ list[#list+1] = format("override right -> left (lro) (bidi=%s)",attr)
+ end
+ lro, rlo = true, false
+ elseif attr == 4 then
+ if trace_mirroring then
+ list[#list+1] = format("override left -> right (rlo) (bidi=%s)",attr)
+ end
+ lro, rlo = false, true
+ else
+ if trace_mirroring and
+ current ~= head then list[#list+1] = format("override reset (bidi=%s)",attr)
+ end
+ lro, rlo = false, false
+ end
+ prevattr = attr
+ end
+ end
+ if id == glyph then
+ glyphs = true
+ if attr and attr > 0 then
+ local char = current.char
+ local d = directions[char]
+ if rlo or override > 0 then
+ if d == "l" then
+ if trace_mirroring then
+ list[#list+1] = format("char %s (%s / U+%04X) of class %s overidden to r (bidi=%s)",utfchar(char),char,char,d,attr)
+ end
+ d = "r"
+ elseif trace_mirroring then
+ if d == "lro" or d == "rlo" or d == "pdf" then -- else side effects on terminal
+ list[#list+1] = format("override char of class %s (bidi=%s)",d,attr)
+ else -- todo: rle lre
+ list[#list+1] = format("char %s (%s / U+%04X) of class %s (bidi=%s)",utfchar(char),char,char,d,attr)
+ end
+ end
+ elseif lro or override < 0 then
+ if d == "r" or d == "al" then
+ set_attribute(current,state,4) -- maybe better have a special bidi attr value -> override (9) -> todo
+ if trace_mirroring then
+ list[#list+1] = format("char %s (%s / U+%04X) of class %s overidden to l (bidi=%s) (state=isol)",utfchar(char),char,char,d,attr)
+ end
+ d = "l"
+ elseif trace_mirroring then
+ if d == "lro" or d == "rlo" or d == "pdf" then -- else side effects on terminal
+ list[#list+1] = format("override char of class %s (bidi=%s)",d,attr)
+ else -- todo: rle lre
+ list[#list+1] = format("char %s (%s / U+%04X) of class %s (bidi=%s)",utfchar(char),char,char,d,attr)
+ end
+ end
+ elseif trace_mirroring then
+ if d == "lro" or d == "rlo" or d == "pdf" then -- else side effects on terminal
+ list[#list+1] = format("override char of class %s (bidi=%s)",d,attr)
+ else -- todo: rle lre
+ list[#list+1] = format("char %s (%s / U+%04X) of class %s (bidi=%s)",utfchar(char),char,char,d,attr)
+ end
+ end
+ if d == "on" then
+ local mirror = chardata[char].mirror -- maybe make a special mirror table
+ if mirror and fontchar[current.font][mirror] then
+ -- todo: set attribute
+ if autodir < 0 then
+ current.char = mirror
+ done = true
+ --~ elseif left or autodir > 0 then
+ --~ if not is_right(current.prev) then
+ --~ current.char = mirror
+ --~ done = true
+ --~ end
+ end
+ end
+ elseif d == "l" or d == "en" then -- european number
+ if autodir <= 0 then
+ force_auto_left_before()
+ end
+ elseif d == "r" or d == "al" then -- arabic number
+ if autodir >= 0 then
+ force_auto_right_before()
+ end
+ elseif d == "an" then -- arabic number
+ -- actually this is language dependent ...
+ if autodir <= 0 then
+--~ force_auto_right_before()
+ force_auto_left_before()
+ end
+ elseif d == "lro" then -- Left-to-Right Override -> right becomes left
+ if trace_mirroring then
+ list[#list+1] = "override right -> left"
+ end
+ top = top + 1
+ stack[top] = { override, embedded }
+ override = -1
+ obsolete[#obsolete+1] = current
+ elseif d == "rlo" then -- Right-to-Left Override -> left becomes right
+ if trace_mirroring then
+ list[#list+1] = "override left -> right"
+ end
+ top = top + 1
+ stack[top] = { override, embedded }
+ override = 1
+ obsolete[#obsolete+1] = current
+ elseif d == "lre" then -- Left-to-Right Embedding -> TLT
+ if trace_mirroring then
+ list[#list+1] = "embedding left -> right"
+ end
+ top = top + 1
+ stack[top] = { override, embedded }
+ embedded = 1
+ obsolete[#obsolete+1] = current
+ elseif d == "rle" then -- Right-to-Left Embedding -> TRT
+ if trace_mirroring then
+ list[#list+1] = "embedding right -> left"
+ end
+ top = top + 1
+ stack[top] = { override, embedded }
+ embedded = 1
+ obsolete[#obsolete+1] = current
+ elseif d == "pdf" then -- Pop Directional Format
+ -- override = 0
+ if top > 0 then
+ local s = stack[top]
+ override, embedded = s[1], s[2]
+ top = top - 1
+ if trace_mirroring then
+ list[#list+1] = format("state: override: %s, embedded: %s, autodir: %s",override,embedded,autodir)
+ end
+ else
+ if trace_mirroring then
+ list[#list+1] = "pop (error, too many pops)"
+ end
+ end
+ obsolete[#obsolete+1] = current
+ end
+ elseif trace_mirroring then
+ local char = current.char
+ local d = directions[char]
+ list[#list+1] = format("char %s (%s / U+%04X) of class %s (no bidi)",utfchar(char),char,char,d or "?")
+ end
+ elseif id == whatsit then
+ if finish then
+ finish_auto_before()
+ end
+ local subtype = current.subtype
+ if subtype == 6 then
+ local dir = current.dir
+ local d = sub(dir,2,2)
+ if d == 'R' then -- find(dir,".R.") / dir == "TRT"
+ autodir = -1
+ else
+ autodir = 1
+ end
+ embeddded = autodir
+ if trace_mirroring then
+ list[#list+1] = format("pardir %s",dir)
+ end
+ elseif subtype == 7 then
+ local dir = current.dir
+ -- local sign = sub(dir,1,1)
+ -- local dire = sub(dir,3,3)
+ local sign, dire = match(dir,"^(.).(.)")
+ if dire == "R" then
+ if sign == "+" then
+ finish, autodir = "TRT", -1
+ else
+ finish, autodir = nil, 0
+ end
+ else
+ if sign == "+" then
+ finish, autodir = "TLT", 1
+ else
+ finish, autodir = nil, 0
+ end
+ end
+ if trace_mirroring then
+ list[#list+1] = format("textdir %s",dir)
+ end
+ end
+ else
+ if trace_mirroring then
+ list[#list+1] = format("node %s (subtype %s)",node.type(id),current.subtype)
+ end
+ if finish then
+ finish_auto_before()
+ end
+ end
+ local cn = current.next
+ if not cn then
+ if finish then
+ finish_auto_after()
+ end
+ end
+ current = cn
+ end
+ end
+ if trace_mirroring and glyphs then
+ logs.report("bidi","start log")
+ for i=1,#list do
+ logs.report("bidi","%02i: %s",i,list[i])
+ end
+ logs.report("bidi","stop log")
+ end
+ if done and mirroring.strip then
+ local n = #obsolete
+ if n > 0 then
+ for i=1,n do
+ remove_node(head,obsolete[i],true)
+ end
+ logs.report("bidi","%s character nodes removed",n)
+ end
+ end
+ return head, done
+end
+
+--~ local function is_right(n) -- keep !
+--~ if n then
+--~ local id = n.id
+--~ if id == glyph then
+--~ local attr = has_attribute(n,attribute)
+--~ if attr and attr > 0 then
+--~ local d = directions[n.char]
+--~ if d == "r" or d == "al" then -- override
+--~ return true
+--~ end
+--~ end
+--~ end
+--~ end
+--~ return false
+--~ end
+
+chars.handle_mirroring = nodes.install_attribute_handler {
+ name = "mirroring",
+ namespace = mirroring,
+ processor = mirroring.process,
+}
+
+function mirroring.enable()
+ tasks.enableaction("processors","chars.handle_mirroring")
+end
diff --git a/tex/context/base/typo-mir.mkiv b/tex/context/base/typo-mir.mkiv
new file mode 100644
index 000000000..4c85262aa
--- /dev/null
+++ b/tex/context/base/typo-mir.mkiv
@@ -0,0 +1,144 @@
+%D \module
+%D [ file=typo-mir,
+%D version=2009.03.27, % code moved from core-spa.mkiv
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Mirroring,
+%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}{ConTeXt Typesetting Macros / Mirroring}
+
+\unprotect
+
+\registerctxluafile{typo-mir}{1.001}
+
+\definesystemattribute[mirroring] \chardef\mirroringattribute \dogetattributeid{mirroring}
+
+% experimental mirroring
+
+\def\setcharactermirroring
+ {\ctxlua{mirroring.enable()}%
+ \gdef\setcharactermirroring[##1]{\attribute\mirroringattribute##1\relax}%
+ \setcharactermirroring}
+
+\def\resetcharactermirroring
+ {\attribute\mirroringattribute\attributeunsetvalue}
+
+\newtoks\everysetupdirections
+
+\unexpanded\def\setupdirections[#1]% there will be more like setting up directions themselves
+ {\getparameters[\??di][#1]%
+ \the\everysetupdirections}
+
+\chardef\directionsbidimode=0
+
+\letvalue{\??di:bidi:\v!off }\zerocount
+\letvalue{\??di:bidi:\v!global}\plusone
+\letvalue{\??di:bidi:\v!local }\plustwo
+\letvalue{\??di:bidi:\v!on }\plustwo
+
+\appendtoks
+ \chardef\directionsbidimode\executeifdefined{\??di:bidi:\@@dibidi}\zerocount\relax
+ \ifcase\directionsbidimode
+ \resetcharactermirroring
+ \or
+ \setcharactermirroring[1]% global, chars
+ \or
+ \setcharactermirroring[2]% local, attributes
+ \or
+ \setcharactermirroring[1]% default
+ \fi
+\to \everysetupdirections
+
+% bidi: local=obey grouping, global=ignore grouping (unicode has no grouping)
+
+\setupdirections % maybe start/stop
+ [bidi=\v!off]
+
+\unexpanded\def\bidilre{\utfchar{"0x202A}}
+\unexpanded\def\bidirle{\utfchar{"0x202B}}
+\unexpanded\def\bidipop{\utfchar{"0x202C}}
+\unexpanded\def\bidilro{\utfchar{"0x202D}}
+\unexpanded\def\bidirlo{\utfchar{"0x202E}}
+
+\unexpanded\def\dirlre{\ifcase\directionsbidimode\or\bidilre\or\textdir TLT\fi}
+\unexpanded\def\dirrle{\ifcase\directionsbidimode\or\bidirle\or\textdir TRT\fi}
+\unexpanded\def\dirlro{\ifcase\directionsbidimode\or\bidilro\or\setcharactermirroring[3]\fi}
+\unexpanded\def\dirrlo{\ifcase\directionsbidimode\or\bidirlo\or\setcharactermirroring[4]\fi}
+
+% for the moment: \setcharactermirroring[\plusone]
+
+\protect \endinput
+
+% bidi test
+
+\definefontfeature
+ [arab]
+ [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]
+
+\font\Arabic=arabtype*arab at 20pt
+
+\def\LATIN{LATIN} {\setcharactermirroring[1]} % enable this
+\def\ARAB {محمد}
+
+\startluacode
+ function document.split_tokens(str)
+ for s in str:bytes() do
+ tex.sprint(tex.ctxcatcodes,string.format("\\hbox{\\char %s}",s))
+ end
+ end
+\stopluacode
+
+\def\biditest#1#2#3% font text raw
+ {\dontleavehmode\hbox
+ {\framed[offset=overlay]{\tttf#2}\quad
+ \enabletrackers[nodes.mirroring]%
+ \framed[offset=overlay]{#1#3}\quad
+ \disabletrackers[nodes.mirroring]%
+ \tttf\ctxlua{document.split_tokens([[\detokenize{#3}]])}}}
+
+\startbuffer[bidi-sample]
+\biditest\Arabic{LATIN BARA}{\textdir TLT\relax \LATIN\ \ARAB}\par
+\biditest\Arabic{BARA LATIN}{\textdir TRT\relax \LATIN\ \ARAB}\par
+\biditest\Arabic{LATIN ARAB}{\textdir TLT{\bidilro \LATIN\ \ARAB}}\par % right -> left
+\biditest\Arabic{LATIN ARAB}{\textdir TRT{\bidilro \LATIN\ \ARAB}}\par % right -> left
+\biditest\Arabic{BARA NITAL}{\textdir TLT{\bidirlo \LATIN\ \ARAB}}\par % left -> right
+\biditest\Arabic{BARA NITAL}{\textdir TRT{\bidirlo \LATIN\ \ARAB}}\par % left -> right
+\stopbuffer
+
+\startbuffer[bidi-sample]
+\biditest\Arabic{LATIN BARA}{\textdir TLT\relax \LATIN\ \ARAB}\par
+\biditest\Arabic{BARA LATIN}{\textdir TRT\relax \LATIN\ \ARAB}\par
+\biditest\Arabic{LATIN ARAB}{\textdir TLT\bidilro \LATIN\ \ARAB}\par % right -> left
+\biditest\Arabic{LATIN ARAB}{\textdir TRT\bidilro \LATIN\ \ARAB}\par % right -> left
+\biditest\Arabic{BARA NITAL}{\textdir TLT\bidirlo \LATIN\ \ARAB}\par % left -> right
+\biditest\Arabic{BARA NITAL}{\textdir TRT\bidirlo \LATIN\ \ARAB}\par % left -> right
+\stopbuffer
+
+\startbuffer[bidi-setup]
+\setupdirections[bidi=off]
+\stopbuffer
+
+{\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]}
+
+\startbuffer[bidi-setup]
+\setupdirections[bidi=global]
+\stopbuffer
+
+{\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]}
+
+\startbuffer[bidi-setup]
+\setupdirections[bidi=local]
+\stopbuffer
+
+{\typebuffer[bidi-setup] \getbuffer[bidi-setup] \getbuffer[bidi-sample]}
+
+\stoptext
diff --git a/tex/context/base/typo-rep.lua b/tex/context/base/typo-rep.lua
new file mode 100644
index 000000000..6fde21482
--- /dev/null
+++ b/tex/context/base/typo-rep.lua
@@ -0,0 +1,135 @@
+if not modules then modules = { } end modules ['typo-rep'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This was rather boring to program (more of the same) but I could
+-- endure it by listening to a couple cd's by The Scene and The Lau
+-- on the squeezebox on my desk.
+
+local trace_stripping = false trackers.register("nodes.stripping", function(v) trace_stripping = v end)
+ trackers.register("fonts.stripping", function(v) trace_stripping = v end)
+
+local delete_node = nodes.delete
+local replace_node = nodes.replace
+local copy_node = node.copy
+local has_attribute = node.has_attribute
+
+local chardata = characters.data
+local collected = false
+local glyph = node.id("glyph")
+local attribute = attributes.private("stripping")
+local fontdata = fonts.ids
+
+nodes.stripping = nodes.stripping or { }
+local stripping = nodes.stripping
+stripping.glyphs = stripping.glyphs or { }
+local glyphs = stripping.glyphs
+
+local function initialize()
+ for k,v in next, chardata do
+ if v.category == "cf" and v.visible ~= "yes" then
+ if not glyphs[k] then
+ glyphs[k] = true
+ end
+ end
+ end
+ initialize = nil
+end
+
+local function process(what,head,current,char)
+ if what == true then
+ if trace_stripping then
+ logs.report("fonts","deleting 0x%05X from text",char)
+ end
+ head, current = delete_node(head,current)
+ elseif type(what) == "function" then
+ head, current = what(head,current)
+ current = current.next
+ if trace_stripping then
+ logs.report("fonts","processing 0x%05X in text",char)
+ end
+ elseif what then -- assume node
+ head, current = replace_node(head,current,copy_node(what))
+ current = current.next
+ if trace_stripping then
+ logs.report("fonts","replacing 0x%05X in text",char)
+ end
+ end
+ return head, current
+end
+
+function nodes.stripping.process(head)
+ local current, done = head, false
+ while current do
+ if current.id == glyph then
+ -- it's more efficient to keep track of what needs to be kept
+ local todo = has_attribute(current,attribute)
+ if todo == 1 then
+ local char = current.char
+ local what = glyphs[char]
+ if what then
+ head, current = process(what,head,current,char)
+ done = true
+ else -- handling of spacing etc has to be done elsewhere
+ current = current.next
+ end
+ else
+ current = current.next
+ end
+ else
+ current = current.next
+ end
+ end
+ return head, done
+end
+
+tasks.appendaction("processors","fonts","nodes.stripping.process",nil,"nodes.process_characters")
+tasks.disableaction("processors","nodes.stripping.process")
+
+function nodes.stripping.enable()
+ if initialize then initialize() end
+ tasks.enableaction("processors","nodes.stripping.process")
+ function nodes.stripping.enable() end
+end
+
+-- bonus:
+
+local initializers, methods = fonts.initializers, fonts.methods
+
+local function processformatters(head,font)
+ local how = fontdata[font].shared.features.formatters -- slow
+ if how == nil or how == "strip" then -- nil when forced
+ local current, done = head, false
+ while current do
+ if current.id == glyph and current.subtype<256 and current.font == font then
+ local char = current.char
+ local what = glyphs[char]
+ if what then
+ head, current = process(what,head,current,char)
+ done = true
+ else -- handling of spacing etc has to be done elsewhere
+ current = current.next
+ end
+ else
+ current = current.next
+ end
+ end
+ return head, done
+ else
+ return head, false
+ end
+end
+
+function initializers.common.formatters(tfmdata,value)
+ if initialize then initialize() end
+end
+
+initializers.base.otf.formatters = initializers.common.formatters
+initializers.node.otf.formatters = initializers.common.formatters
+
+methods.node.otf.formatters = processformatters
+methods.base.otf.formatters = processformatters
diff --git a/tex/context/base/typo-rep.mkiv b/tex/context/base/typo-rep.mkiv
new file mode 100644
index 000000000..2f1d8b4cb
--- /dev/null
+++ b/tex/context/base/typo-rep.mkiv
@@ -0,0 +1,53 @@
+%D \module
+%D [ file=typo-rep,
+%D version=2010.05.23,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Stripping,
+%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}{ConTeXt Typesetting Macros / Stripping}
+
+% experimental stripping
+
+%D For a while we had stripping built into the analyzer. Khaled
+%D suggested to generalize this so I changed the code into a
+%D manipulator there.
+%D
+%D \starttyping
+%D \definefontfeature[default][default][mode=node,formatters=strip]
+%D \stoptyping
+%D
+%D However, in \MKIV\ it makes more sense to also provide it as a more
+%D general feature. Here we implement this as experiment. I might
+%D cook up a few more variants in both variants.
+%D
+%D \starttyping
+%D \setcharacterstripping[1]
+%D \stoptyping
+
+\unprotect
+
+\registerctxluafile{typo-rep}{1.001}
+
+\definesystemattribute[stripping] \chardef\strippingattribute \dogetattributeid{stripping}
+
+\def\setcharacterstripping
+ {\ctxlua{nodes.stripping.enable()}%
+ \gdef\setcharacterstripping[##1]{\attribute\strippingattribute##1\relax}%
+ \setcharacterstripping}
+
+\def\resetcharacterstripping
+ {\attribute\strippingattribute\attributeunsetvalue}
+
+% maybe .. this might disappear, but is handy for testing
+
+\def\forcecharacterstripping % secret command
+ {\ctxlua{fonts.otf.features.register("formatters",true)}}
+
+\protect \endinput
diff --git a/tex/context/base/typo-spa.lua b/tex/context/base/typo-spa.lua
new file mode 100644
index 000000000..48c7263c7
--- /dev/null
+++ b/tex/context/base/typo-spa.lua
@@ -0,0 +1,167 @@
+if not modules then modules = { } end modules ['typo-spa'] = {
+ version = 1.001,
+ comment = "companion to typo-spa.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- get rid of tex.scale here
+
+local utf = unicode.utf8
+
+local next, type = next, type
+local utfchar = utf.char
+
+local trace_hspacing = false trackers.register("nodes.hspacing", function(v) trace_hspacing = v end)
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local remove_node = nodes.remove
+local make_penalty_node = nodes.penalty
+local make_glue_node = nodes.glue
+local glyph = node.id("glyph")
+
+local fontdata = fonts.identifiers
+local quaddata = fonts.quads
+
+spacings = spacings or { }
+spacings.mapping = spacings.mapping or { }
+spacings.attribute = attributes.private("spacing")
+
+storage.register("spacings/mapping", spacings.mapping, "spacings.mapping")
+
+function spacings.setspacing(id,char,left,right,alternative)
+ local mapping = spacings.mapping[id]
+ if not mapping then
+ mapping = { }
+ spacings.mapping[id] = mapping
+ end
+ local map = mapping[char]
+ if not map then
+ map = { }
+ mapping[char] = map
+ end
+ map.left, map.right, map.alternative = left, right, alternative
+end
+
+function spacings.process(namespace,attribute,head)
+ local done, mapping = false, spacings.mapping
+ 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
+ map = map[start.char]
+ unset_attribute(start,attribute) -- needed?
+ if map then
+ local left, right, alternative = map.left, map.right, map.alternative
+ local quad = quaddata[start.font]
+ 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_hspacing then
+ logs.report("spacing","removing penalty and space before %s", utfchar(start.char))
+ end
+ head, _ = remove_node(head,prev,true)
+ head, _ = remove_node(head,prevprev,true)
+ else
+ local somespace = nodes.somespace(prev,true)
+ if somespace then
+ if trace_hspacing then
+ logs.report("spacing","removing space before %s", utfchar(start.char))
+ end
+ head, _ = remove_node(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_hspacing then
+ logs.report("spacing","inserting penalty and space before %s", utfchar(start.char))
+ end
+ insert_node_before(head,start,make_penalty_node(10000))
+ insert_node_before(head,start,make_glue_node(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_hspacing then
+ logs.report("spacing","removing penalty and space after %s", utfchar(start.char))
+ end
+ head, _ = remove_node(head,next,true)
+ head, _ = remove_node(head,nextnext,true)
+ end
+ else
+ local somespace = nodes.somespace(next,true)
+ if somespace then
+ if trace_hspacing then
+ logs.report("spacing","removing space after %s", utfchar(start.char))
+ end
+ head, _ = remove_node(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_hspacing then
+ logs.report("spacing","inserting penalty and space after %s", utfchar(start.char))
+ end
+ insert_node_after(head,start,make_glue_node(tex.scale(quad,right)))
+ insert_node_after(head,start,make_penalty_node(10000))
+ done = true
+ end
+ end
+ end
+ end
+ end
+ end
+ start = start.next
+ end
+ return head, done
+end
+
+lists.handle_spacing = nodes.install_attribute_handler {
+ name = "spacing",
+ namespace = spacings,
+ processor = spacings.process,
+}
+
+function spacings.enable()
+ tasks.enableaction("processors","lists.handle_spacing")
+end
+
+--~ local data = {
+--~ name = "spacing",
+--~ namespace = spacings,
+--~ processor = spacings.process,
+--~ }
+--~ nodes.process_attribute = process_attribute
+--~ function lists.handle_spacing(head)
+--~ return process_attribute(head,data)
+--~ end
diff --git a/tex/context/base/typo-spa.mkiv b/tex/context/base/typo-spa.mkiv
new file mode 100644
index 000000000..e059b62e4
--- /dev/null
+++ b/tex/context/base/typo-spa.mkiv
@@ -0,0 +1,69 @@
+%D \module
+%D [ file=typo-spa,
+%D version=2009.03.27, % code moved from cors-spa.mkiv
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Spacing,
+%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}{ConTeXt Typesetting Macros / Spacing}
+
+\unprotect
+
+\registerctxluafile{typo-spa}{1.001}
+
+\definesystemattribute[spacing] \chardef\spacingattribute \dogetattributeid{spacing}
+
+% experimental spacing
+%
+% test: oeps {\setcharacterspacing[frenchpunctuation]x: xx \bfd x: xx} oeps: test
+
+\newcount \maxcharacterspacingid
+
+\unexpanded\def\definecharacterspacing[#1]%
+ {\ifcsname\??ch#1\endcsname \else
+ \global\advance\maxcharacterspacingid\plusone
+ \setxvalue{\??ch:#1}{\the\maxcharacterspacingid}%
+ \fi}
+
+\unexpanded\def\setupcharacterspacing
+ {\dotripleargument\dosetupcharacterspacing}
+
+\def\dosetupcharacterspacing[#1][#2][#3]%
+ {\ifcsname\??ch:#1\endcsname
+ \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}
+
+\def\setcharacterspacing
+ {\ctxlua{spacings.enable()}%
+ \gdef\setcharacterspacing[##1]{\attribute\spacingattribute\csname\??ch:##1\endcsname\relax}%
+ \setcharacterspacing}
+
+\def\resetcharacterspacing
+ {\attribute\spacingattribute\attributeunsetvalue}
+
+\letvalue{\??ch:\s!reset}\attributeunsetvalue
+
+% \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,\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)
+
+\protect \endinput
diff --git a/tex/context/base/unic-000.mkii b/tex/context/base/unic-000.mkii
new file mode 100644
index 000000000..cb4c1fe8a
--- /dev/null
+++ b/tex/context/base/unic-000.mkii
@@ -0,0 +1,135 @@
+%D \module
+%D [ file=unic-000,
+%D version=2002.12.03,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 0,
+%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
+
+% \startunicodevector 0
+% \ifcase\numexpr(#1-159)
+% \@@unknownchar\or
+% \@@unknownchar\or
+% exclamdown\or
+% textcent\or
+% textsterling\or
+% textcurrency\or
+% ydiaeresis\else
+% \@@unknownchar
+% \fi
+% \stopunicodevector
+%
+% 20\% faster:
+
+\startunicodevector 0
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1-159\relax
+ \unknownchar \or
+ \nonbreakablespace \or
+ \exclamdown \or
+ \textcent \or
+ \textsterling \or
+ \textcurrency \or
+ \textyen \or
+ \textbrokenbar \or
+ \sectionmark \or
+ \textdiaeresis \or
+ \copyright \or
+ \ordfeminine \or % FEMININE ORDINAL INDICATOR
+ \leftguillemot \or % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ \textlognot \or
+ \softhyphen \or
+ \registered \or
+ \textmacron \or
+ \textdegree \or
+ \textpm \or
+ \twosuperior \or
+ \threesuperior \or
+ \textacute \or
+ \textmu \or % MICRO SIGN
+ \paragraphmark \or % PILCROW SIGN
+ \periodcentered \or
+ \textcedilla \or
+ \onesuperior \or
+ \ordmasculine \or % MASCULINE ORDINAL INDICATOR
+ \rightguillemot \or % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ \onequarter \or
+ \onehalf \or
+ \threequarter \or
+ \questiondown \or
+ \Agrave \or
+ \Aacute \or
+ \Acircumflex \or
+ \Atilde \or
+ \Adiaeresis \or
+ \Aring \or
+ \AEligature \or
+ \Ccedilla \or
+ \Egrave \or
+ \Eacute \or
+ \Ecircumflex \or
+ \Ediaeresis \or
+ \Igrave \or
+ \Iacute \or
+ \Icircumflex \or
+ \Idiaeresis \or
+ \Eth \or % \Eth \or
+ \Ntilde \or
+ \Ograve \or
+ \Oacute \or
+ \Ocircumflex \or
+ \Otilde \or
+ \Odiaeresis \or
+ \textmultiply \or
+ \Ostroke \or
+ \Ugrave \or
+ \Uacute \or
+ \Ucircumflex \or
+ \Udiaeresis \or
+ \Yacute \or
+ \Thorn \or
+ \ssharp \or
+ \agrave \or
+ \aacute \or
+ \acircumflex \or
+ \atilde \or
+ \adiaeresis \or
+ \aring \or
+ \aeligature \or
+ \ccedilla \or
+ \egrave \or
+ \eacute \or
+ \ecircumflex \or
+ \ediaeresis \or
+ \igrave \or
+ \iacute \or
+ \icircumflex \or
+ \idiaeresis \or
+ \eth \or % \eth \or
+ \ntilde \or
+ \ograve \or
+ \oacute \or
+ \ocircumflex \or
+ \otilde \or
+ \odiaeresis \or
+ \textdiv \or
+ \ostroke \or
+ \ugrave \or
+ \uacute \or
+ \ucircumflex \or
+ \udiaeresis \or
+ \yacute \or
+ \thorn \or
+ \ydiaeresis \else
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-001.mkii b/tex/context/base/unic-001.mkii
new file mode 100644
index 000000000..e37de9136
--- /dev/null
+++ b/tex/context/base/unic-001.mkii
@@ -0,0 +1,220 @@
+%D \module
+%D [ file=unic-001,
+%D version=2002.12.03,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 1,
+%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
+
+%D Readable:
+%D
+%D \starttyping
+%D \startunicodevector 1
+%D \ifcase#1\or
+%D unknownchar\or Abreve\or abreve\or
+%D ....
+%D Zcaron\or zcaron\else unknownchar\fi
+%D \stopunicodevector
+%D
+%D \stoptyping
+%D But we can speed things up, watch how we avoid zero and \TEX's
+%D automatically added \type {\relax}.
+
+% remark:
+% - gcommaaccent, kcomaaccent, lcomaaccent, ncomaaccent, rcomaaccent
+% bear the name "WITH CEDILLA" in Unicode
+% - scomaaccent and tcomaaccent point to the "WITH CEDILLA" in the
+% Adobe Glyph List
+
+\startunicodevector 1
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \Amacron \or
+ \amacron \or
+ \Abreve \or
+ \abreve \or
+ \Aogonek \or
+ \aogonek \or
+ \Cacute \or
+ \cacute \or
+ \Ccircumflex \or
+ \ccircumflex \or
+ \Cdotaccent \or
+ \cdotaccent \or
+ \Ccaron \or
+ \ccaron \or
+ \Dcaron \or
+ \dcaron \or
+ \Dstroke \or
+ \dstroke \or
+ \Emacron \or
+ \emacron \or
+ \Ebreve \or
+ \ebreve \or
+ \Edotaccent \or
+ \edotaccent \or
+ \Eogonek \or
+ \eogonek \or
+ \Ecaron \or
+ \ecaron \or
+ \Gcircumflex \or
+ \gcircumflex \or
+ \Gbreve \or
+ \gbreve \or
+ \Gdotaccent \or
+ \gdotaccent \or
+ \Gcommaaccent \or % WITH CEDILLA
+ \gcommaaccent \or % WITH CEDILLA
+ \Hcircumflex \or
+ \hcircumflex \or
+ \Hstroke \or
+ \hstroke \or
+ \Itilde \or
+ \itilde \or
+ \Imacron \or
+ \imacron \or
+ \Ibreve \or
+ \ibreve \or
+ \Iogonek \or
+ \iogonek \or
+ \Idotaccent \or
+ \dotlessi \or
+ \IJligature \or
+ \ijligature \or
+ \Jcircumflex \or
+ \jcircumflex \or
+ \Kcommaaccent \or % WITH CEDILLA
+ \kcommaaccent \or % WITH CEDILLA
+ \kkra \or % \kkra \or
+ \Lacute \or
+ \lacute \or
+ \Lcommaaccent \or % WITH CEDILLA
+ \lcommaaccent \or % WITH CEDILLA
+ \Lcaron \or
+ \lcaron \or
+ \Ldotmiddle \or % \Ldotmiddle \or
+ \ldotmiddle \or % \ldotmiddle \or
+ \Lstroke \or
+ \lstroke \or
+ \Nacute \or
+ \nacute \or
+ \Ncommaaccent \or % WITH CEDILLA
+ \ncommaaccent \or % WITH CEDILLA
+ \Ncaron \or
+ \ncaron \or
+ \napostrophe \or
+ \Neng \or
+ \neng \or
+ \Omacron \or
+ \omacron \or
+ \Obreve \or
+ \obreve \or
+ \Ohungarumlaut \or
+ \ohungarumlaut \or
+ \OEligature \or
+ \oeligature \or
+ \Racute \or
+ \racute \or
+ \Rcommaaccent \or % WITH CEDILLA
+ \rcommaaccent \or % WITH CEDILLA
+ \Rcaron \or
+ \rcaron \or
+ \Sacute \or
+ \sacute \or
+ \Scircumflex \or
+ \scircumflex \or
+ \Scedilla \or
+ \scedilla \or
+ \Scaron \or
+ \scaron \or
+ \Tcedilla \or
+ \tcedilla \or
+ \Tcaron \or
+ \tcaron \or
+ \Tstroke \or
+ \tstroke \or
+ \Utilde \or
+ \utilde \or
+ \Umacron \or
+ \umacron \or
+ \Ubreve \or
+ \ubreve \or
+ \Uring \or
+ \uring \or
+ \Uhungarumlaut \or
+ \uhungarumlaut \or
+ \Uogonek \or
+ \uogonek \or
+ \Wcircumflex \or
+ \wcircumflex \or
+ \Ycircumflex \or
+ \ycircumflex \or
+ \Ydiaeresis \or
+ \Zacute \or
+ \zacute \or
+ \Zdotaccent \or
+ \zdotaccent \or
+ \Zcaron \or
+ \zcaron \or
+ \slong \or % 127 \slong \else
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \textflorin \or % 146
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \Ohorn \or % 160
+ \ohorn \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \unknownchar \or
+ \Uhorn \or % 175
+ \uhorn \else
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-002.mkii b/tex/context/base/unic-002.mkii
new file mode 100644
index 000000000..ae7deb12a
--- /dev/null
+++ b/tex/context/base/unic-002.mkii
@@ -0,0 +1,104 @@
+%D \module
+%D [ file=unic-002,
+%D version=2006.08.02,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 2,
+%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
+
+\startunicodevector 2
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \Adoublegrave \or
+ \adoublegrave \or
+ \Ainvertedbreve \or
+ \ainvertedbreve \or
+ \Edoublegrave \or
+ \edoublegrave \or
+ \Einvertedbreve \or
+ \einvertedbreve \or
+ \Idoublegrave \or
+ \idoublegrave \or
+ \Iinvertedbreve \or
+ \iinvertedbreve \or
+ \Odoublegrave \or
+ \odoublegrave \or
+ \Oinvertedbreve \or
+ \oinvertedbreve \or
+ \Rdoublegrave \or
+ \rdoublegrave \or
+ \Rinvertedbreve \or
+ \rinvertedbreve \or
+ \Udoublegrave \or
+ \udoublegrave \or
+ \Uinvertedbreve \or
+ \uinvertedbreve \or
+ \Scommaaccent \or
+ \scommaaccent \or
+ \Tcommaaccent \or
+ \tcommaaccent \or
+ \unknownchar \or % Yogh
+ \unknownchar \or % yogh
+ \Hcaron \or
+ \hcaron \or
+ \unknownchar \or % n with long right leg
+ \dcurl \or
+ \unknownchar \or % Ou
+ \unknownchar \or % ou
+ \Zhook \or
+ \zhook \or
+ \Adotaccent \or
+ \adotaccent \or
+ \Ecedilla \or
+ \ecedilla \or
+ \Odiaeresismacron \or
+ \odiaeresismacron \or
+ \Otildemacron \or
+ \otildemacron \or
+ \Odotaccent \or
+ \odotaccent \or
+ \Odotaccentmacron \or
+ \odotaccentmacron \or
+ \Ymacron \or
+ \ymacron \or
+ \lcurl \or
+ \ncurl \or
+ \tcurl \or
+ \dotlessj \or
+ \unknownchar \or % db digraph
+ \unknownchar \or % qp digraph
+ \Astroke \or
+ \Cstroke \or
+ \cstroke \or
+ \Lbar \else
+ \ifcase\numexpr#1-83\relax
+ \bhook \or
+ \unknownchar \or % open o
+ \ccurl \or
+ \dtail \or
+ \dhook \or
+ \unknownchar \or % reversed e
+ \schwa \or
+ \schwahook \else
+ \ifcase\numexpr#1-198\relax
+ \textcircumflex \or
+ \textcaron \else
+ \ifcase\numexpr#1-216\relax
+ \textbreve \or
+ \textdotaccent \or
+ \textring \or
+ \textogonek \or
+ \texttilde \or
+ \texthungarumlaut \else
+ \unknownchar
+ \fi\fi\fi\fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-003.mkii b/tex/context/base/unic-003.mkii
new file mode 100644
index 000000000..d37563d26
--- /dev/null
+++ b/tex/context/base/unic-003.mkii
@@ -0,0 +1,147 @@
+%D \module
+%D [ file=unic-003,
+%D version=2005.01.26,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 3,
+%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
+
+\startunicodevector 3
+ \ifcase\numexpr#1-126\relax
+ % special greek
+ \strippedcsname \greekquestionmark \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \greektonos \or
+ \strippedcsname \greekdialytikatonos \or
+ \strippedcsname \greekAlphatonos \or
+ \strippedcsname \greekanoteleia \or
+ \strippedcsname \greekEpsilontonos \or
+ \strippedcsname \greekEtatonos \or
+ \strippedcsname \greekIotatonos \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \greekOmicrontonos \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \greekUpsilontonos \or
+ \strippedcsname \greekOmegatonos \or
+ \strippedcsname \greekiotadialytikatonos \or
+ % normal greek
+ \strippedcsname \greekAlpha \or
+ \strippedcsname \greekBeta \or
+ \strippedcsname \greekGamma \or
+ \strippedcsname \greekDelta \or
+ \strippedcsname \greekEpsilon \or
+ \strippedcsname \greekZeta \or
+ \strippedcsname \greekEta \or
+ \strippedcsname \greekTheta \or
+ \strippedcsname \greekIota \or
+ \strippedcsname \greekKappa \or
+ \strippedcsname \greekLambda \or
+ \strippedcsname \greekMu \or
+ \strippedcsname \greekNu \or
+ \strippedcsname \greekXi \or
+ \strippedcsname \greekOmicron \or
+ \strippedcsname \greekPi \or
+ \strippedcsname \greekRho \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \greekSigma \or
+ \strippedcsname \greekTau \or
+ \strippedcsname \greekUpsilon \or
+ \strippedcsname \greekPhi \or
+ \strippedcsname \greekChi \or
+ \strippedcsname \greekPsi \or
+ \strippedcsname \greekOmega \or
+ % special greek
+ \strippedcsname \greekIotadialytika \or
+ \strippedcsname \greekUpsilondialytika \or
+ \strippedcsname \greekalphatonos \or
+ \strippedcsname \greekepsilontonos \or
+ \strippedcsname \greeketatonos \or
+ \strippedcsname \greekiotatonos \or
+ \strippedcsname \greekupsilondialytikatonos \or
+ % normal greek
+ \strippedcsname \greekalpha \or
+ \strippedcsname \greekbeta \or
+ \strippedcsname \greekgamma \or
+ \strippedcsname \greekdelta \or
+ \strippedcsname \greekepsilon \or
+ \strippedcsname \greekzeta \or
+ \strippedcsname \greeketa \or
+ \strippedcsname \greektheta \or
+ \strippedcsname \greekiota \or
+ \strippedcsname \greekkappa \or
+ \strippedcsname \greeklambda \or
+ \strippedcsname \greekmu \or
+ \strippedcsname \greeknu \or
+ \strippedcsname \greekxi \or
+ \strippedcsname \greekomicron \or
+ \strippedcsname \greekpi \or
+ \strippedcsname \greekrho \or
+ \strippedcsname \greekfinalsigma \or
+ \strippedcsname \greeksigma \or
+ \strippedcsname \greektau \or
+ \strippedcsname \greekupsilon \or
+ \strippedcsname \greekphi \or
+ \strippedcsname \greekchi \or
+ \strippedcsname \greekpsi \or
+ \strippedcsname \greekomega \or
+ % special greek
+ \strippedcsname \greekiotadialytika \or
+ \strippedcsname \greekupsilondialytika \or
+ \strippedcsname \greekomicrontonos \or
+ \strippedcsname \greekupsilontonos \or
+ \strippedcsname \greekomegatonos \or % was greeek!
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or % beta alt
+ \strippedcsname \greekthetaalt \or
+ \strippedcsname \unknownchar \or % upsilon hook
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \greekphialt \or
+ \strippedcsname \greekpialt \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or % Sampi
+ \strippedcsname \unknownchar \or % sampi
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or % kappa alt
+ \strippedcsname \greekrhoalt \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \unknownchar \or
+ \strippedcsname \greekepsilonalt \else
+ \strippedcsname \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-004.mkii b/tex/context/base/unic-004.mkii
new file mode 100644
index 000000000..b6e210193
--- /dev/null
+++ b/tex/context/base/unic-004.mkii
@@ -0,0 +1,291 @@
+%D \module
+%D [ file=unic-004,
+%D version=2005.01.27,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 4,
+%D author=Mikael Persson \& 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
+
+\startunicodevector 4
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \cyrillicEgrave \or % 04-00 \uchar0{200} aswell
+ \cyrillicYO \or % 04-01 Capital YO (or IO)
+ \cyrillicDJE \or % 04-02
+ \cyrillicGJE \or % 04-03 not in enco-uc.tex
+ \cyrillicIE \or % 04-04 Ukrainian IE
+ \cyrillicDZE \or % 04-05
+ \cyrillicII \or % 04-06 Byelorussian-ukrainian I
+ \cyrillicYI \or % 04-07
+ \cyrillicJE \or % 04-08 same letter as latin J?
+ \cyrillicLJE \or % 04-09
+ \cyrillicNJE \or % 04-0A
+ \cyrillicTSHE \or % 04-0B
+ \cyrillicKJE \or % 04-0C
+ \cyrillicIgrave \or % 04-0D I with grave
+ \cyrillicUSHRT \or % 04-0E
+ \cyrillicDZHE \or % 04-0F
+ \cyrillicA \or % 04-10
+ \cyrillicB \or
+ \cyrillicV \or
+ \cyrillicG \or
+ \cyrillicD \or
+ \cyrillicE \or
+ \cyrillicZH \or
+ \cyrillicZ \or
+ \cyrillicI \or
+ \cyrillicISHRT \or
+ \cyrillicK \or
+ \cyrillicL \or
+ \cyrillicM \or
+ \cyrillicN \or
+ \cyrillicO \or
+ \cyrillicP \or
+ \cyrillicR \or
+ \cyrillicS \or
+ \cyrillicT \or
+ \cyrillicU \or
+ \cyrillicF \or
+ \cyrillicH \or
+ \cyrillicC \or
+ \cyrillicCH \or
+ \cyrillicSH \or
+ \cyrillicSHCH \or
+ \cyrillicHRDSN \or
+ \cyrillicERY \or
+ \cyrillicSFTSN \or
+ \cyrillicEREV \or
+ \cyrillicYU \or
+ \cyrillicYA \or
+ \cyrillica \or % 04-30
+ \cyrillicb \or
+ \cyrillicv \or
+ \cyrillicg \or
+ \cyrillicd \or
+ \cyrillice \or
+ \cyrilliczh \or
+ \cyrillicz \or
+ \cyrillici \or
+ \cyrillicishrt \or
+ \cyrillick \or
+ \cyrillicl \or
+ \cyrillicm \or
+ \cyrillicn \or
+ \cyrillico \or
+ \cyrillicp \or
+ \cyrillicr \or
+ \cyrillics \or
+ \cyrillict \or
+ \cyrillicu \or
+ \cyrillicf \or
+ \cyrillich \or
+ \cyrillicc \or
+ \cyrillicch \or
+ \cyrillicsh \or
+ \cyrillicshch \or
+ \cyrillichrdsn \or
+ \cyrillicery \or
+ \cyrillicsftsn \or
+ \cyrillicerev \or
+ \cyrillicyu \or
+ \cyrillicya \or % 044F
+ \cyrillicegrave \or % 0450 not i enco-uc.tex but same as \uchar0{232}
+ \cyrillicyo \or % 0451 small yo (or io)
+ \cyrillicdje \or % 0452 serbian letter
+ \cyrillicgje \or % 0453 macedonian letter not in enco-uc.tex
+ \cyrillicie \or % 0454 ukrainian ie
+ \cyrillicdze \or % 0455 macedonian zelo
+ \cyrillicii \or % 0456 byelorussian-ukrainian i.
+ \cyrillicyi \or % 0457
+ \cyrillicje \or % 0458 not in enco-uc.tex same as latin j?
+ \cyrilliclje \or % 0459
+ \cyrillicnje \or % 045A
+ \cyrillictshe \or % 045B
+ \cyrillickje \or % 045C macedonian, not in enco-uc.tex
+ \cyrillicigrave \or % 045D macedonian, cyr i with grave not in enco-uc.tex
+ \cyrillicushrt \or % 045E
+ \cyrillicdzhe \or % 045F
+ \cyrillicOMEGA \or % 0460 Omega not in enco-uc.tex
+ \cyrillicomega \or % 0461 omega not in enco-uc.tex
+ \cyrillicYAT \or % 0462 Yat not in enco-uc.tex
+ \cyrillicyat \or % 0463 Yat not in enco-uc.tex
+ \cyrillicEiotified \or % 0464 iotified E not in enco-uc.tex
+ \cyrilliceiotified \or % 0465 iotified e not in enco-uc.tex
+ \cyrillicLITTLEYUS \or % 0466 Little Yus not in enco-enc.tex
+ \cyrilliclittleyus \or % 0467 Little yus not in enco-enc.tex
+ \cyrillicLITTLEYUSiotified \or % 0468 Little Yus iotified not in enco-enc.tex
+ \cyrilliclittleyusiotified \or % 0469 Little yus iotified not in enco-enc.tex
+ \cyrillicBIGYUS \or % 046A Big Yus not in enco-enc.tex
+ \cyrillicbigyus \or % 046B Big yus not in enco-enc.tex
+ \cyrillicBIGYUSiotified \or % 046C Big Yus iotified not in enco-enc.tex
+ \cyrillicbigyusiotified \or % 046D Big yus iotified not in enco-enc.tex
+ \cyrillicKSI \or % 046E Ksi not in enco-enc.tex
+ \cyrillicksi \or % 046F ksi not in enco-enc.tex
+ \cyrillicPSI \or % 0470 Psi not in enco-enc.tex
+ \cyrillicpsi \or % 0471 psi not in enco-enc.tex
+ \cyrillicFITA \or % 0472 Fita not in enco-enc.tex
+ \cyrillicfita \or % 0473 fita not in enco-enc.tex
+ \cyrillicIZHITSA \or % 0474 Izhitsa not in enco-enc.tex
+ \cyrillicizhitsa \or % 0475 izhitsa not in enco-enc.tex
+ \cyrillicIZHITSAdoublegrave \or % 0476 Izhitsa double grave not in enco-enc.tex
+ \cyrillicizhitsadoublegrave \or % 0477 izhitsa double grave not in enco-enc.tex
+ \cyrillicUK \or % 0478 UK not in enco-enc.tex
+ \cyrillicuk \or % 0479 uk not in enco-enc.tex
+ \cyrillicOMEGAround \or % 047A Round Omega not in enco-enc.tex
+ \cyrillicomegaround \or % 047B Round omega not in enco-enc.tex
+ \cyrillicOMEGAtitlo \or % 047C Omega with titlo not in enco-enc.tex
+ \cyrillicomegatitlo \or % 047D omega with titlo not in enco-enc.tex
+ \cyrillicOT \or % 047E OT not in enco-enc.tex
+ \cyrillicot \or % 047F ot not in enco-enc.tex
+ \cyrillicKOPPA \or % 0480 KOPPA not in enco-enc.tex
+ \cyrillickoppa \or % 0481 koppa not in enco-enc.tex
+ \unknownchar \or % 0482
+ \cyrillicTITLO \or % 0483 TITLO not in enco-enc.tex
+ \cyrillicPALATALIZATION \or % 0484 PALATALIZATION not in enco-enc.tex
+ \cyrillicDASIAPNEUMATA \or % 0485 DASIA PNEUMATA not in enco-enc.tex
+ \cyrillicPSILIPNEUMATA \or % 0486 PSILI PNEUMATA not in enco-enc.tex
+ \unknownchar \or % 0487
+ \unknownchar \or % 0488
+ \unknownchar \or % 0489
+ \cyrillicISHRTtail \or % 048A ISHRT with tail not in enco-enc.tex
+ \cyrillicishrttail \or % 048B ishrt with tail not in enco-enc.tex
+ \cyrillicSEMISOFT \or % 048C SEMISOFT not in enco-enc.tex
+ \cyrillicsemisoft \or % 048D semisoft not in enco-enc.tex
+ \cyrillicERtick \or % 048E ER with tick not in enco-enc.tex
+ \cyrillicertick \or % 048F er with tick not in enco-enc.tex
+ \cyrillicGHEupturn \or % 0490 GHE with upturn not in enco-enc.tex
+ \cyrillicgheupturn \or % 0491 ghe with upturn not in enco-enc.tex
+ \cyrillicGHEstroke \or % 0492 GHE with stroke not in enco-enc.tex
+ \cyrillicghestroke \or % 0493 ghe with stroke not in enco-enc.tex
+ \cyrillicGHEmidhook \or % 0494 GHE with middle hook
+ \cyrillicghemidhook \or % 0495 ghe with middle hook
+ \cyrillicZHEdescender \or % 0496 ZHE with descender
+ \cyrilliczhedescender \or % 0497 zhe with descender
+ \cyrillicZDSC \or % 0498 ZE with descender
+ \cyrilliczdsc \or % 0499 ze with descender
+ \cyrillicKADC \or % 049A KA with descender
+ \cyrillickadc \or % 049B ka with descender
+ \cyrillicKAvertstroke \or % 049C KA with vertical stroke
+ \cyrillickavertstroke \or % 049D ka with vertical stroke
+ \cyrillicKAstroke \or % 049E KA with stroke
+ \cyrillickastroke \or % 049F ka with stroke
+ \cyrillicKAbashkir \or % 04A0 KA bashkir
+ \cyrillickabashkir \or % 04A1 ka bashkir
+ \cyrillicENDC \or % 04A2 EN with descender
+ \cyrillicendc \or % 04A3 en with descender
+ \cyrillicENGHE \or % 04A4 EN GHE
+ \cyrillicenghe \or % 04A5 en ghe
+ \cyrillicPEmidhook \or % 04A6 PE with middle hook
+ \cyrillicpemidhook \or % 04A7 pe with middle hook
+ \cyrillicHA \or % 04A8 Abkhasian HA
+ \cyrillicha \or % 04A9 Abkhasian ha
+ \cyrillicSDSC \or % 04AA S with descender
+ \cyrilliccdsc \or % 04AB s with descender
+ \cyrillicTEDC \or % 04AC TE with descender
+ \cyrillictedc \or % 04AD te with descender
+ \cyrillicYstr \or % 04AE Y straight
+ \cyrillicystr \or % 04AF y straight
+ \cyrillicYstrstroke \or % 04B0 Y straight with stroke
+ \cyrillicystrstroke \or % 04B1 y straight with stroke
+ \cyrillicHADC \or % 04B2 HA with descender
+ \cyrillichadc \or % 04B3 ha with descender
+ \cyrillicTETSE \or % 04B4 TE TSE
+ \cyrillictetse \or % 04B5 te tse
+ \cyrillicCHEDC \or % 04B6 CHE with descender
+ \cyrillicchedc \or % 04B7 che with descender
+ \cyrillicCHEvertstroke \or % 04B8 CHE with vertical stroke
+ \cyrillicchevertstroke \or % 04B9 che with vertical stroke
+ \cyrillicSHHA \or % 04BA SHHA
+ \cyrillicshha \or % 04BB
+ \cyrillicCHEabkhasian \or % 04BC Abkhasian CHE
+ \cyrilliccheabkhasian \or % 04BD Abkhasian che
+ \cyrillicCHEDCabkhasian \or % 04BE Abkhasian CHE with descender
+ \cyrillicchedcabkhasian \or % 04BF Abkhasian che with descender
+ \cyrillicPALOCHKA \or % 04C0 PALOCHKA
+ \cyrillicZHEbreve \or % 04C1 ZHE with breve
+ \cyrilliczhebreve \or % 04C2 zhe with breve
+ \cyrillicKAhook \or % 04C3 KA with hook
+ \cyrillickahook \or % 04C4 ka with hook
+ \cyrillicELtail \or % 04C5 EL with tail
+ \cyrilliceltail \or % 04C6 el with tail
+ \cyrillicENhook \or % 04C7 EN with hook
+ \cyrillicenhook \or % 04C8 en with hook
+ \cyrillicENtail \or % 04C9 EN with tail
+ \cyrillicentail \or % 04CA en with tail
+ \cyrillicCHEkhakassian \or % 04CB Khakassian CHE
+ \cyrillicchekhakassian \or % 04CC Khakassian che
+ \cyrillicEMtail \or % 04CD EM with tail
+ \cyrillicemtail \or % 04CE em with tail
+ \unknownchar \or % 04CF Added to fix off-by-1 error
+ \cyrillicAbreve \or % 04D0 A with breve (\uchar1{2})
+ \cyrillicabreve \or % 04D1 a with breve (\uchar1{3})
+ \cyrillicAdiaeresis \or % 04D2 A with diaeresis (\uchar0{196})
+ \cyrillicadiaeresis \or % 04D3 a with diaeresis (\uchar0{228})
+ \cyrillicAE \or % 04D4 AE (\uchar0{198})
+ \cyrillicae \or % 04D5 ae (\uchar0{230})
+ \cyrillicEbreve \or % 04D6
+ \cyrillicebreve \or % 04D7
+ \cyrillicSCHWA \or % 04D8
+ \cyrillicschwa \or % 04D9
+ \cyrillicSCHWAdiaeresis \or % 04DA
+ \cyrillicschwadiaeresis \or % 04DB
+ \cyrillicZHEdiaeresis \or % 04DC
+ \cyrilliczhediaeresis \or % 04DD
+ \cyrillicZEdiaeresis \or % 04DE
+ \cyrilliczediaeresis \or % 04DF
+ \cyrillicDZEabkhasian \or % 04E0
+ \cyrillicdzeabkhasian \or % 04E1
+ \cyrillicImacron \or % 04E2
+ \cyrillicimacron \or % 04E3
+ \cyrillicIdiaeresis \or % 04E4
+ \cyrillicidiaeresis \or % 04E5
+ \cyrillicOdiaeresis \or % 04E6
+ \cyrillicodiaeresis \or % 04E7
+ \cyrillicObarred \or % 04E8
+ \cyrillicobarred \or % 04E9
+ \cyrillicObarreddiaeresis \or % 04EA
+ \cyrillicobarreddiaeresis \or % 04EB
+ \cyrillicEdiaeresis \or % 04EC
+ \cyrillicediaeresis \or % 04ED
+ \cyrillicUmacron \or % 04EE
+ \cyrillicumacron \or % 04EF
+ \cyrillicUdiaeresis \or % 04F0
+ \cyrillicudiaeresis \or % 04F1
+ \cyrillicUdoubleacute \or % 04F2
+ \cyrillicudoubleacute \or % 04F3
+ \cyrillicCHEdiaeresis \or % 04F4
+ \cyrillicchediaeresis \or % 04F5
+ \unknownchar \or % 04F6
+ \unknownchar \or % 04F7
+ \cyrillicYERUdiaeresis \or % 04F8
+ \cyrillicyerudiaeresis \else
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
+
+% \enableregime[utf]
+%
+% \definetypeface [russian] [rm] [serif] [computer-modern] [default] [encoding=t2a]
+%
+% \setupbodyfont[russian]
+%
+% \starttext
+%
+% \startbuffer
+% Мама и Папа % Some russian characters
+% \stopbuffer
+%
+% \chardef\utfunicodetracer=0 \blank \getbuffer \blank
+% \chardef\utfunicodetracer=2 \blank \getbuffer \blank
+% \chardef\utfunicodetracer=7 \blank \getbuffer \blank
+%
+% \stoptext
diff --git a/tex/context/base/unic-005.mkii b/tex/context/base/unic-005.mkii
new file mode 100644
index 000000000..d15b74dbe
--- /dev/null
+++ b/tex/context/base/unic-005.mkii
@@ -0,0 +1,50 @@
+%D \module
+%D [ file=unic-005,
+%D version=2005.01.27,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 5,
+%D author=Adam Lindsay,
+%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.
+
+\unprotect
+
+\startunicodevector 5
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1-208\relax % Was 224 - changed to fix off-by-16 error
+ \hebrewAlef \or % 05D0
+ \hebrewBet \or
+ \hebrewGimel \or
+ \hebrewDalet \or
+ \hebrewHe \or
+ \hebrewVav \or
+ \hebrewZayin \or
+ \hebrewHet \or
+ \hebrewTet \or
+ \hebrewYod \or
+ \hebrewKaffinal \or
+ \hebrewKaf \or
+ \hebrewLamed \or
+ \hebrewMemfinal \or
+ \hebrewMem \or
+ \hebrewNunfinal \or
+ \hebrewNun \or
+ \hebrewSamekh \or
+ \hebrewAyin \or
+ \hebrewPefinal \or
+ \hebrewPe \or
+ \hebrewTsadifinal \or
+ \hebrewTsadi \or
+ \hebrewQof \or
+ \hebrewResh \or
+ \hebrewShin \or
+ \hebrewTav \else % 05EA
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput \ No newline at end of file
diff --git a/tex/context/base/unic-030.mkii b/tex/context/base/unic-030.mkii
new file mode 100644
index 000000000..ef42c807a
--- /dev/null
+++ b/tex/context/base/unic-030.mkii
@@ -0,0 +1,113 @@
+%D \module
+%D [ file=unic-030,
+%D version=2004.11.18,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 30,
+%D author=Adam Lindsay,
+%D date=\currentdate,
+%D copyright={PRAGMA / Adam Lindsay}]
+%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
+
+\startunicodevector 30
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1-160\relax
+ \Adotbelow \or
+ \adotbelow \or
+ \Ahook \or
+ \ahook \or
+ \Acircumflexacute \or
+ \acircumflexacute \or
+ \Acircumflexgrave \or
+ \acircumflexgrave \or
+ \Acircumflexhook \or
+ \acircumflexhook \or
+ \Acircumflextilde \or
+ \acircumflextilde \or
+ \Acircumflexdotbelow \or
+ \acircumflexdotbelow \or
+ \Abreveacute \or
+ \abreveacute \or
+ \Abrevegrave \or
+ \abrevegrave \or
+ \Abrevehook \or
+ \abrevehook \or
+ \Abrevetilde \or
+ \abrevetilde \or
+ \Abrevedotbelow \or
+ \abrevedotbelow \or
+ \Edotbelow \or
+ \edotbelow \or
+ \Ehook \or
+ \ehook \or
+ \Etilde \or
+ \etilde \or
+ \Ecircumflexacute \or
+ \ecircumflexacute \or
+ \Ecircumflexgrave \or
+ \ecircumflexgrave \or
+ \Ecircumflexhook \or
+ \ecircumflexhook \or
+ \Ecircumflextilde \or
+ \ecircumflextilde \or
+ \Ecircumflexdotbelow \or
+ \ecircumflexdotbelow \or
+ \Ihook \or
+ \ihook \or
+ \Idotbelow \or
+ \idotbelow \or
+ \Odotbelow \or
+ \odotbelow \or
+ \Ohook \or
+ \ohook \or
+ \Ocircumflexacute \or
+ \ocircumflexacute \or
+ \Ocircumflexgrave \or
+ \ocircumflexgrave \or
+ \Ocircumflexhook \or
+ \ocircumflexhook \or
+ \Ocircumflextilde \or
+ \ocircumflextilde \or
+ \Ocircumflexdotbelow \or
+ \ocircumflexdotbelow \or
+ \Ohornacute \or
+ \ohornacute \or
+ \Ohorngrave \or
+ \ohorngrave \or
+ \Ohornhook \or
+ \ohornhook \or
+ \Ohorntilde \or
+ \ohorntilde \or
+ \Ohorndotbelow \or
+ \ohorndotbelow \or
+ \Udotbelow \or
+ \udotbelow \or
+ \Uhook \or
+ \uhook \or
+ \Uhornacute \or
+ \uhornacute \or
+ \Uhorngrave \or
+ \uhorngrave \or
+ \Uhornhook \or
+ \uhornhook \or
+ \Uhorntilde \or
+ \uhorntilde \or
+ \Uhorndotbelow \or
+ \uhorndotbelow \or
+ \Ygrave \or
+ \ygrave \or
+ \Ydotbelow \or
+ \ydotbelow \or
+ \Yhook \or
+ \yhook \or
+ \Ytilde \or
+ \ytilde \else
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-031.mkii b/tex/context/base/unic-031.mkii
new file mode 100644
index 000000000..13fd47a54
--- /dev/null
+++ b/tex/context/base/unic-031.mkii
@@ -0,0 +1,273 @@
+%D \module
+%D [ file=unic-031,
+%D version=2005.02.20,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 31,
+%D author=Thomas A. Schmitz,
+%D date=\currentdate]
+
+\unprotect
+
+\startunicodevector 31
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \greekalphapsili \or %1f00
+ \greekalphadasia \or
+ \greekalphapsilivaria \or
+ \greekalphadasiavaria \or
+ \greekalphapsilitonos \or
+ \greekalphadasiatonos \or
+ \greekalphapsiliperispomeni \or
+ \greekalphadasiaperispomeni \or
+ \greekAlphapsili \or
+ \greekAlphadasia \or
+ \greekAlphapsilivaria \or
+ \greekAlphadasiavaria \or
+ \greekAlphapsilitonos \or
+ \greekAlphadasiatonos \or
+ \greekAlphapsiliperispomeni \or
+ \greekAlphadasiaperispomeni \or
+ \greekepsilonpsili \or %1f10
+ \greekepsilondasia \or
+ \greekepsilonpsilivaria \or
+ \greekepsilondasiavaria \or
+ \greekepsilonpsilitonos \or
+ \greekepsilondasiatonos \or
+ \unknownchar \or
+ \unknownchar \or
+ \greekEpsilonpsili \or
+ \greekEpsilondasia \or
+ \greekEpsilonpsilivaria \or
+ \greekEpsilondasiavaria \or
+ \greekEpsilonpsilitonos \or
+ \greekEpsilondasiatonos \or
+ \unknownchar \or
+ \unknownchar \or
+ \greeketapsili \or %1f20
+ \greeketadasia \or
+ \greeketapsilivaria \or
+ \greeketadasiavaria \or
+ \greeketapsilitonos \or
+ \greeketadasiatonos \or
+ \greeketapsiliperispomeni \or
+ \greeketadasiaperispomeni \or
+ \greekEtapsili \or
+ \greekEtadasia \or
+ \greekEtapsilivaria \or
+ \greekEtadasiavaria \or
+ \greekEtapsilitonos \or
+ \greekEtadasiatonos \or
+ \greekEtapsiliperispomeni \or
+ \greekEtadasiaperispomeni \or
+ \greekiotapsili \or %1f30
+ \greekiotadasia \or
+ \greekiotapsilivaria \or
+ \greekiotadasiavaria \or
+ \greekiotapsilitonos \or
+ \greekiotadasiatonos \or
+ \greekiotapsiliperispomeni \or
+ \greekiotadasiaperispomeni \or
+ \greekIotapsili \or
+ \greekIotadasia \or
+ \greekIotapsilivaria \or
+ \greekIotadasiavaria \or
+ \greekIotapsilitonos \or
+ \greekIotadasiatonos \or
+ \greekIotapsiliperispomeni \or
+ \greekIotadasiaperispomeni \or
+ \greekomicronpsili \or %1f40
+ \greekomicrondasia \or
+ \greekomicronpsilivaria \or
+ \greekomicrondasiavaria \or
+ \greekomicronpsilitonos \or
+ \greekomicrondasiatonos \or
+ \unknownchar \or
+ \unknownchar \or
+ \greekOmicronpsili \or
+ \greekOmicrondasia \or
+ \greekOmicronpsilivaria \or
+ \greekOmicrondasiavaria \or
+ \greekOmicronpsilitonos \or
+ \greekOmicrondasiatonos \or
+ \unknownchar \or
+ \unknownchar \or
+ \greekupsilonpsili \or %1f50
+ \greekupsilondasia \or
+ \greekupsilonpsilivaria \or
+ \greekupsilondasiavaria \or
+ \greekupsilonpsilitonos \or
+ \greekupsilondasiatonos \or
+ \greekupsilonpsiliperispomeni \or
+ \greekupsilondasiaperispomeni \or
+ \unknownchar \or
+ \greekUpsilondasia \or
+ \unknownchar \or
+ \greekUpsilondasiavaria \or
+ \unknownchar \or
+ \greekUpsilondasiatonos \or
+ \unknownchar \or
+ \greekUpsilondasiaperispomeni \or
+ \greekomegapsili \or %1f60
+ \greekomegadasia \or
+ \greekomegapsilivaria \or
+ \greekomegadasiavaria \or
+ \greekomegapsilitonos \or
+ \greekomegadasiatonos \or
+ \greekomegapsiliperispomeni \or
+ \greekomegadasiaperispomeni \or
+ \greekOmegapsili \or
+ \greekOmegadasia \or
+ \greekOmegapsilivaria \or
+ \greekOmegadasiavaria \or
+ \greekOmegapsilitonos \or
+ \greekOmegadasiatonos \or
+ \greekOmegapsiliperispomeni \or
+ \greekOmegadasiaperispomeni \or
+ \greekalphavaria \or %1f70
+ \greekalphaoxia \or
+ \greekepsilonvaria \or
+ \greekepsilonoxia \or
+ \greeketavaria \or
+ \greeketaoxia \or
+ \greekiotavaria \or
+ \greekiotaoxia \or
+ \greekomicronvaria \or
+ \greekomicronoxia \or
+ \greekupsilonvaria \or
+ \greekupsilonoxia \or
+ \greekomegavaria \or
+ \greekomegaoxia \or
+ \unknownchar \or
+ \unknownchar \or
+ \greekalphaiotasubpsili \or %1f80
+ \greekalphaiotasubdasia \or
+ \greekalphaiotasubpsilivaria \or
+ \greekalphaiotasubdasiavaria \or
+ \greekalphaiotasubpsilitonos \or
+ \greekalphaiotasubdasiatonos \or
+ \greekalphaiotasubpsiliperispomeni \or
+ \greekalphaiotasubdasiaperispomeni \or
+ \greekAlphaiotasubpsili \or
+ \greekAlphaiotasubdasia \or
+ \greekAlphaiotasubpsilivaria \or
+ \greekAlphaiotasubdasiavaria \or
+ \greekAlphaiotasubpsilitonos \or
+ \greekAlphaiotasubdasiatonos \or
+ \greekAlphaiotasubpsiliperispomeni \or
+ \greekAlphaiotasubdasiaperispomeni \or
+ \greeketaiotasubpsili \or %1f90
+ \greeketaiotasubdasia \or
+ \greeketaiotasubpsilivaria \or
+ \greeketaiotasubdasiavaria \or
+ \greeketaiotasubpsilitonos \or
+ \greeketaiotasubdasiatonos \or
+ \greeketaiotasubpsiliperispomeni \or
+ \greeketaiotasubdasiaperispomeni \or
+ \greekEtaiotasubpsili \or
+ \greekEtaiotasubdasia \or
+ \greekEtaiotasubpsilivaria \or
+ \greekEtaiotasubdasiavaria \or
+ \greekEtaiotasubpsilitonos \or
+ \greekEtaiotasubdasiatonos \or
+ \greekEtaiotasubpsiliperispomeni \or
+ \greekEtaiotasubdasiaperispomeni \or
+ \greekomegaiotasubpsili \or %1fa0
+ \greekomegaiotasubdasia \or
+ \greekomegaiotasubpsilivaria \or
+ \greekomegaiotasubdasiavaria \or
+ \greekomegaiotasubpsilitonos \or
+ \greekomegaiotasubdasiatonos \or
+ \greekomegaiotasubpsiliperispomeni \or
+ \greekomegaiotasubdasiaperispomeni \or
+ \greekOmegaiotasubpsili \or
+ \greekOmegaiotasubdasia \or
+ \greekOmegaiotasubpsilivaria \or
+ \greekOmegaiotasubdasiavaria \or
+ \greekOmegaiotasubpsilitonos \or
+ \greekOmegaiotasubdasiatonos \or
+ \greekOmegaiotasubpsiliperispomeni \or
+ \greekOmegaiotasubdasiaperispomeni \or
+ \greekalphavrachy \or %1fb0
+ \greekalphamacron \or
+ \greekalphaiotasubvaria \or
+ \greekalphaiotasub \or
+ \greekalphaiotasubtonos \or
+ \unknownchar \or
+ \greekalphaperispomeni \or
+ \greekalphaiotasubperispomeni \or
+ \greekAlphavrachy \or
+ \greekAlphamacron \or
+ \greekAlphavaria \or
+ \greekAlphaoxia \or
+ \greekAlphaiotasub \or
+ \greekCoronis \or
+ \greekprosgegrammeni \or
+ \greekpsili \or
+ \greekperispomeni \or %1fc0
+ \greekdialytikaperispomeni \or
+ \greeketaiotasubvaria \or
+ \greeketaiotasub \or
+ \greeketaiotasubtonos \or
+ \unknownchar \or
+ \greeketaperispomeni \or
+ \greeketaiotasubperispomeni \or
+ \greekEpsilonvaria \or
+ \greekEpsilonoxia \or
+ \greekEtavaria \or
+ \greekEtaoxia \or
+ \greekEtaiotasub \or
+ \greekpsilivaria \or
+ \greekpsilitonos \or
+ \greekpsiliperispomeni \or
+ \greekiotavrachy \or %1fd0
+ \greekiotamacron \or
+ \greekiotadialytikavaria \or
+ \greekiotadialytikatonos \or
+ \unknownchar \or
+ \unknownchar \or
+ \greekiotaperispomeni \or
+ \greekiotadialytikaperispomeni \or
+ \greekIotavrachy \or
+ \greekIotamacron \or
+ \greekIotavaria \or
+ \greekIotaoxia \or
+ \unknownchar \or
+ \greekdasiavaria \or
+ \greekdasiatonos \or
+ \greekdasiaperispomeni \or
+ \greekupsilonvrachy \or %1fe0
+ \greekupsilonmacron \or
+ \greekupsilondialytikavaria \or
+ \greekupsilondialytikatonos \or
+ \greekrhopsili \or
+ \greekrhodasia \or
+ \greekupsilonperispomeni \or
+ \greekupsilondialytikaperispomeni \or
+ \greekUpsilonvrachy \or
+ \greekUpsilonmacron \or
+ \greekUpsilonvaria \or
+ \greekUpsilonoxia \or
+ \greekRhodasia \or
+ \greekdialytikavaria \or
+ \greekdialytikaoxia \or
+ \greekvaria \or
+ \unknownchar \or %1ff0
+ \unknownchar \or
+ \greekomegaiotasubvaria \or
+ \greekomegaiotasub \or
+ \greekomegaiotasubtonos \or
+ \unknownchar \or
+ \greekomegaperispomeni \or
+ \greekomegaiotasubperispomeni \or
+ \greekOmicronvaria \or
+ \greekOmicronoxia \or
+ \greekOmegavaria \or
+ \greekOmegaoxia \or
+ \greekOmegaiotasub \or
+ \greekoxia \or
+ \greekdasia \else
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-032.mkii b/tex/context/base/unic-032.mkii
new file mode 100644
index 000000000..32c25e4e2
--- /dev/null
+++ b/tex/context/base/unic-032.mkii
@@ -0,0 +1,278 @@
+%D \module
+%D [ file=unic-032,
+%D version=2006.03.30,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 32,
+%D author={Hans Hagen \& Taco Hoekwater},
+%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
+
+\startunicodevector 32
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \enspace \or % U+2000 EN QUAD
+ \emspace \or % U+2001 EM QUAD
+ \enspace \or % U+2002 EN SPACE
+ \emspace \or % U+2003 EM SPACE
+ \unic@threeperemspace \or % U+2004 THREE-PER-EM SPACE
+ \unic@fourperemspace \or % U+2005 FOUR-PER-EM SPACE
+ \unic@sixperemspace \or % U+2006 SIX-PER-EM SPACE
+ \unic@figurespace \or % U+2007 FIGURE SPACE
+ \unmic@punctiationspace \or % U+2008 PUNCTUATION SPACE
+ \thinspace \or % U+2009 THIN SPACE
+ \unic@hairspace \or % U+200A HAIR SPACE
+ \unic@zerowidthspace \or % U+200B ZERO WIDTH SPACE
+ \unic@zerowidthnonjoiner \or % U+200C ZERO WIDTH NON-JOINER
+ \unic@zerowidthjoiner \or % U+200D ZERO WIDTH JOINER
+ \unknownchar \or % U+200E LEFT-TO-RIGHT MARK
+ \unknownchar \or % U+200F RIGHT-TO-LEFT MARK
+ \breakinghyphen \or % U+2010 HYPHEN
+ \nonbreakinghyphen \or % U+2011 NON-BREAKING HYPHEN
+ \endash \or % U+2012 FIGURE DASH
+ \endash \or % U+2013 EN DASH
+ \emdash \or % U+2014 EM DASH
+ \emdash \or % U+2015 HORIZONTAL BAR
+ \unic@doubleverticalline \or % U+2016 DOUBLE VERTICAL LINE
+ \unic@doublelowline \or % U+2017 DOUBLE LOW LINE
+ \quoteleft \or % U+2018 LEFT SINGLE QUOTATION MARK
+ \quoteright \or % U+2019 RIGHT SINGLE QUOTATION MARK
+ \quotesinglebase \or % U+201A SINGLE LOW-9 QUOTATION MARK
+ \unic@quoteleftreversed \or % U+201B SINGLE HIGH-REVERSED-9 QUOTATION MARK
+ \quotedblleft \or % U+201C LEFT DOUBLE QUOTATION MARK
+ \quotedblright \or % U+201D RIGHT DOUBLE QUOTATION MARK
+ \quotedblbase \or % U+201E DOUBLE LOW-9 QUOTATION MARK
+ \unic@quotedblleftreversed \or % U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+ \textdag \or % U+2020 DAGGER
+ \textddag \or % U+2021 DOUBLE DAGGER
+ \textbullet \or % U+2022 BULLET
+ \blacktriangleright \or % U+2023 TRIANGULAR BULLET
+ \unic@onedotleader \or % U+2024 ONE DOT LEADER
+ \unic@twodotleader \or % U+2025 TWO DOT LEADER
+ \periods \or % U+2026 HORIZONTAL ELLIPSIS % was: \textellipsis
+ \unic@hyphenationpoint \or % U+2027 HYPHENATION POINT
+ \crlf \or % U+2028 LINE SEPARATOR
+ \endgraf \or % U+2029 PARAGRAPH SEPARATOR
+ \unknownchar \or % U+202A LEFT-TO-RIGHT EMBEDDING
+ \unknownchar \or % U+202B RIGHT-TO-LEFT EMBEDDING
+ \unknownchar \or % U+202C POP DIRECTIONAL FORMATTING
+ \unknownchar \or % U+202D LEFT-TO-RIGHT OVERRIDE
+ \unknownchar \or % U+202E RIGHT-TO-LEFT OVERRIDE
+ \ \or % U+202F NARROW NO-BREAK SPACE
+ \perthousand \or % U+2030 PER MILLE SIGN
+ \unknownchar \or % U+2031 PER TEN THOUSAND SIGN
+ \prime \or % U+2032 PRIME
+ \unic@doubleprime \or % U+2033 DOUBLE PRIME
+ \unic@tripleprime \or % U+2034 TRIPLE PRIME
+ \backprime \or % U+2035 REVERSED PRIME
+ \unic@reverseddoubleprime \or % U+2036 REVERSED DOUBLE PRIME
+ \unic@reversedtripleprime \or % U+2037 REVERSED TRIPLE PRIME
+ \unknownchar \or % U+2038 CARET
+ \guilsingleleft \or % U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ \guilsingleright \or % U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ \unknownchar \or % U+203B REFERENCE MARK
+ \unic@doubleexclamationmark \or % U+203C DOUBLE EXCLAMATION MARK
+ \unknownchar \or % U+203D INTERROBANG
+ \unknownchar \or % U+203E OVERLINE
+ \unknownchar \or % U+203F UNDERTIE
+ \unknownchar \or % U+2040 CHARACTER TIE
+ \unknownchar \or % U+2041 CARET INSERTION POINT
+ \unknownchar \or % U+2042 ASTERISM
+ \unknownchar \or % U+2043 HYPHEN BULLET
+ \unic@fractionslash \or % U+2044 FRACTION SLASH
+ \unknownchar \or % U+2045 LEFT SQUARE BRACKET WITH QUILL
+ \unknownchar \or % U+2046 RIGHT SQUARE BRACKET WITH QUILL
+ \unic@doublequestionmark \or % U+2047 DOUBLE QUESTION MARK
+ \unic@exclamationquestionmark\or % U+2048 QUESTION EXCLAMATION MARK
+ \unic@questionexclamationmark\or % U+2049 EXCLAMATION QUESTION MARK
+ \unknownchar \or % U+204A TIRONIAN SIGN ET
+ \unic@reversedpilcrowsign \or % U+204B REVERSED PILCROW SIGN
+ \unknownchar \or % U+204C BLACK LEFTWARDS BULLET
+ \unknownchar \or % U+204D BLACK RIGHTWARDS BULLET
+ \unic@lowasterisk \or % U+204E LOW ASTERISK
+ \unic@reversedsemicolon \or % U+204F REVERSED SEMICOLON
+ \unknownchar \or % U+2050 CLOSE UP
+ \unknownchar \or % U+2051 TWO ASTERISKS ALIGNED VERTICALLY
+ \unknownchar \or % U+2052 COMMERCIAL MINUS SIGN
+ \unknownchar \or % U+2053 SWUNG DASH
+ \unknownchar \or % U+2054 INVERTED UNDERTIE
+ \unknownchar \or % U+2055 FLOWER PUNCTUATION MARK
+ \unknownchar \or % U+2056 THREE DOT PUNCTUATION
+ \unknownchar \or % U+2057 QUADRUPLE PRIME
+ \unknownchar \or % U+2058 FOUR DOT PUNCTUATION
+ \unknownchar \or % U+2059 FIVE DOT PUNCTUATION
+ \unknownchar \or % U+205A TWO DOT PUNCTUATION
+ \unknownchar \or % U+205B FOUR DOT MARK
+ \unknownchar \or % U+205C DOTTED CROSS
+ \unknownchar \or % U+205D TRICOLON
+ \unknownchar \or % U+205E VERTICAL FOUR DOTS
+ \thickspace \or % U+205F MEDIUM MATHEMATICAL SPACE
+ \relax \or % U+2060 WORD JOINER
+ \unic@functionapplication \or % U+2061 FUNCTION APPLICATION
+ \unic@invisibletimes \or % U+2062 INVISIBLE TIMES
+ \unic@invisibleseparator \or % U+2063 INVISIBLE SEPARATOR (COMMA)
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \relax \or % U+206A INHIBIT SYMMETRIC SWAPPING
+ \relax \or % U+206B ACTIVATE SYMMETRIC SWAPPING
+ \relax \or % U+206C INHIBIT ARABIC FORM SHAPING
+ \relax \or % U+206D ACTIVATE ARABIC FORM SHAPING
+ \relax \or % U+206E NATIONAL DIGIT SHAPES
+ \relax \or % U+206F NOMINAL DIGIT SHAPES
+ \unic@superscriptzero \or % U+2070 SUPERSCRIPT ZERO
+ \unic@superscripti \or % U+2071 SUPERSCRIPT LATIN SMALL LETTER I
+ \unknownchar \or % U+2072 <reserved>
+ \unknownchar \or % U+2073 <reserved>
+ \unic@superscriptfour \or % U+2074 SUPERSCRIPT FOUR
+ \unic@superscriptfive \or % U+2075 SUPERSCRIPT FIVE
+ \unic@superscriptsix \or % U+2076 SUPERSCRIPT SIX
+ \unic@superscriptseven \or % U+2077 SUPERSCRIPT SEVEN
+ \unic@superscripteight \or % U+2078 SUPERSCRIPT EIGHT
+ \unic@superscriptnine \or % U+2079 SUPERSCRIPT NINE
+ \unic@superscriptplus \or % U+207A SUPERSCRIPT PLUS SIGN
+ \unic@superscriptminus \or % U+207B SUPERSCRIPT MINUS
+ \unic@superscriptequals \or % U+207C SUPERSCRIPT EQUALS SIGN
+ \unic@superscriptleft \or % U+207D SUPERSCRIPT LEFT PARENTHESIS
+ \unic@superscriptright \or % U+207E SUPERSCRIPT RIGHT PARENTHESIS
+ \unic@superscriptn \or % U+207F SUBSCRIPT LATIN SMALL LETTER N
+ \unic@subscriptzero \or % U+2080 SUBSCRIPT ZERO
+ \unic@subscriptone \or % U+2081 SUBSCRIPT ONE
+ \unic@subscripttwo \or % U+2082 SUBSCRIPT TWO
+ \unic@subscriptthree \or % U+2083 SUBSCRIPT THREE
+ \unic@subscriptfour \or % U+2084 SUBSCRIPT FOUR
+ \unic@subscriptfive \or % U+2085 SUBSCRIPT FIVE
+ \unic@subscriptsix \or % U+2086 SUBSCRIPT SIX
+ \unic@subscriptseven \or % U+2087 SUBSCRIPT SEVEN
+ \unic@subscripteight \or % U+2088 SUBSCRIPT EIGHT
+ \unic@subscriptnine \or % U+2089 SUBSCRIPT NINE
+ \unic@subscriptplus \or % U+208A SUBSCRIPT PLUS SIGN
+ \unic@subscriptminus \or % U+208B SUBSCRIPT MINUS
+ \unic@subscriptequals \or % U+208C SUBSCRIPT EQUALS SIGN
+ \unic@subscriptleft \or % U+208D SUBSCRIPT LEFT PARENTHESIS
+ \unic@subscriptright \or % U+208E SUBSCRIPT RIGHT PARENTHESIS
+ \unknownchar \or %
+ \unic@subscripta \or % U+2090 LATIN SUBSCRIPT SMALL LETTER A
+ \unic@subscripte \or % U+2091 LATIN SUBSCRIPT SMALL LETTER E
+ \unic@subscripto \or % U+2092 LATIN SUBSCRIPT SMALL LETTER O
+ \unic@subscriptx \or % U+2093 LATIN SUBSCRIPT SMALL LETTER X
+ \unic@subscriptschwa \or % U+2094 LATIN SUBSCRIPT SMALL LETTER SCHWA
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or % U+20A0 EURO-CURRENCY SIGN
+ \unknownchar \or % U+20A1 COLON SIGN
+ \unknownchar \or % U+20A2 CRUZEIRO SIGN
+ \unknownchar \or % U+20A3 FRENCH FRANC SIGN
+ \unknownchar \or % U+20A4 LIRA SIGN
+ \unknownchar \or % U+20A5 MILL SIGN
+ \unknownchar \or % U+20A6 NAIRA SIGN
+ \unknownchar \or % U+20A7 PESETA SIGN
+ \unknownchar \or % U+20A8 RUPEE SIGN
+ \unknownchar \or % U+20A9 WON SIGN
+ \unknownchar \or % U+20AA NEW SHEQEL SIGN
+ \textdong \or % U+20AB DONG SIGN
+ \texteuro \or % U+20AC EURO SIGN
+ \unknownchar \or % U+20AD KIP SIGN
+ \unknownchar \or % U+20AE TUGRIK SIGN
+ \unknownchar \or % U+20AF DRACHMA SIGN
+ \unknownchar \or % U+20B0 GERMAN PENNY SIGN
+ \unknownchar \or % U+20B1 PESO SIGN
+ \unknownchar \or % U+20B2 GUARANI SIGN
+ \unknownchar \or % U+20B3 AUSTRAL SIGN
+ \unknownchar \or % U+20B4 HRYVNIA SIGN
+ \unknownchar \or % U+20B5 CEDI SIGN
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or % U+20D0 COMBINING LEFT HARPOON ABOVE
+ \unknownchar \or % U+20D1 COMBINING RIGHT HARPOON ABOVE
+ \unknownchar \or % U+20D2 COMBINING LONG VERTICAL LINE OVERLAY
+ \unknownchar \or % U+20D3 COMBINING SHORT VERTICAL LINE OVERLAY
+ \unknownchar \or % U+20D4 COMBINING ANTICLOCKWISE ARROW ABOVE
+ \unknownchar \or % U+20D5 COMBINING CLOCKWISE ARROW ABOVE
+ \unknownchar \or % U+20D6 COMBINING LEFT ARROW ABOVE
+ \unknownchar \or % U+20D7 COMBINING RIGHT ARROW ABOVE
+ \unknownchar \or % U+20D8 COMBINING RING OVERLAY
+ \unknownchar \or % U+20D9 COMBINING CLOCKWISE RING OVERLAY
+ \unknownchar \or % U+20DA COMBINING ANTICLOCKWISE RING OVERLAY
+ \unknownchar \or % U+20DB COMBINING THREE DOTS ABOVE
+ \unknownchar \or % U+20DC COMBINING FOUR DOTS ABOVE
+ \unknownchar \or % U+20DD COMBINING ENCLOSING CIRCLE
+ \unknownchar \or % U+20DE COMBINING ENCLOSING SQUARE
+ \unknownchar \or % U+20DF COMBINING ENCLOSING DIAMOND
+ \unknownchar \or % U+20E0 COMBINING ENCLOSING CIRCLE BACKSLASH
+ \unknownchar \or % U+20E1 COMBINING LEFT RIGHT ARROW ABOVE
+ \unknownchar \or % U+20E2 COMBINING ENCLOSING SCREEN
+ \unknownchar \or % U+20E3 COMBINING ENCLOSING KEYCAP
+ \unknownchar \or % U+20E4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+ \unknownchar \or % U+20E5 COMBINING REVERSE SOLIDUS OVERLAY
+ \unknownchar \or % U+20E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY
+ \unknownchar \or % U+20E7 COMBINING ANNUITY SYMBOL
+ \unknownchar \or % U+20E8 COMBINING TRIPLE UNDERDOT
+ \unknownchar \or % U+20E9 COMBINING WIDE BRIDGE ABOVE
+ \unknownchar \or % U+20EA COMBINING LEFTWARDS ARROW OVERLAY
+ \unknownchar \or % U+20EB COMBINING LONG DOUBLE SOLIDUS OVERLAY
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \or %
+ \unknownchar \else %
+ \unknownchar \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-033.mkii b/tex/context/base/unic-033.mkii
new file mode 100644
index 000000000..91311a029
--- /dev/null
+++ b/tex/context/base/unic-033.mkii
@@ -0,0 +1,275 @@
+%D \module
+%D [ file=unic-033,
+%D version=2006.03.29,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 33,
+%D author={Nikolai Weibull \& Hans Hagen \& Taco Hoekwater},
+%D date=\currentdate,
+%D copyright={PRAGMA / Nikolai Weibull}]
+
+\unprotect
+
+\startunicodevector 33
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \unic@accountof \or % 2100 ACCOUNT OF
+ \unic@addressedtothesubject \or % 2101 ADDRESSED TO THE SUBJECT
+ \unic@doublestruckC \or % 2102 DOUBLE-STRUCK CAPITAL C
+ \unic@degreecelsius \or % 2103 DEGREE CELSIUS
+ \unic@centrelinesymbol \or % 2104 CENTRE LINE SYMBOL
+ \unic@careof \or % 2105 CARE OF
+ \unic@cadauna \or % 2106 CADA UNA
+ \unic@eulerconstant \or % 2107 EULER CONSTANT
+ \unic@scruple \or % 2108 SCRUPLE
+ \unic@degreefahrenheit \or % 2109 DEGREE FAHRENHEIT
+ \unic@scriptg \or % 210A SCRIPT SMALL G
+ \unic@scriptH \or % 210B SCRIPT CAPITAL H
+ \unic@blackletterH \or % 210C BLACK-LETTER CAPITAL H
+ \unic@doublestruckH \or % 210D DOUBLE-STRUCK CAPITAL H
+ \unic@planckconstant \or % 210E PLANCK CONSTANT
+ \unic@planckconstantovertwopi \or % 210F PLANCK CONSTANT OVER TWO PI
+ \unic@scriptI \or % 2110 SCRIPT CAPITAL I
+ \unic@blackletterI \or % 2111 BLACK-LETTER CAPITAL I
+ \unic@scriptL \or % 2112 SCRIPT CAPITAL L
+ \unic@scriptl \or % 2113 SCRIPT SMALL L
+ \unic@lbbarsymbol \or % 2114 L B BAR SYMBOL
+ \unic@doublestruckN \or % 2115 DOUBLE-STRUCK CAPITAL N
+ \unic@numerosign \or % 2116 NUMERO SIGN
+ \unic@soundrecordingcopyright \or % 2117 SOUND RECORDING COPYRIGHT
+ \unic@scriptP \or % 2118 SCRIPT CAPITAL P
+ \unic@doublestruckP \or % 2119 DOUBLE-STRUCK CAPITAL P
+ \unic@doublestruckQ \or % 211A DOUBLE-STRUCK CAPITAL Q
+ \unic@scriptR \or % 211B SCRIPT CAPITAL R
+ \unic@blackletterR \or % 211C BLACK-LETTER CAPITAL R
+ \unic@doublestruckR \or % 211D DOUBLE-STRUCK CAPITAL R
+ \unic@prescriptiontake \or % 211E PRESCRIPTION TAKE
+ \unic@response \or % 211F RESPONSE
+ \unic@servicemark \or % 2120 SERVICE MARK
+ \unic@telephonesign \or % 2121 TELEPHONE SIGN
+ \unic@trademarksign \or % 2122 TRADE MARK SIGN
+ \unic@versickle \or % 2123 VERSICLE
+ \unic@doublestruckZ \or % 2124 DOUBLE-STRUCK CAPITAL Z
+ \unic@ouncesign \or % 2125 OUNCE SIGN
+ \unic@ohmsign \or % 2126 OHM SIGN
+ \unic@invertedohmsign \or % 2127 INVERTED OHM SIGN
+ \unic@blackletterZ \or % 2128 BLACK-LETTER CAPITAL Z
+ \unic@turnedgreekletteriota \or % 2129 TURNED GREEK SMALL LETTER IOTA
+ \unic@kelvinsign \or % 212A KELVIN SIGN
+ \unic@angstromsign \or % 212B ANGSTROM SIGN
+ \unic@scriptB \or % 212C SCRIPT CAPITAL B
+ \unic@blackletterC \or % 212D BLACK-LETTER CAPITAL C
+ \unic@estimatedsymbol \or % 212E ESTIMATED SYMBOL
+ \unic@scripte \or % 212F SCRIPT SMALL E
+ \unic@scriptE \or % 2130 SCRIPT CAPITAL E
+ \unic@scriptF \or % 2131 SCRIPT CAPITAL F
+ \unic@turnedF \or % 2132 TURNED CAPITAL F
+ \unic@scriptM \or % 2133 SCRIPT CAPITAL M
+ \unic@scripto \or % 2134 SCRIPT SMALL O
+ \aleph \or % 2135 ALEF SYMBOL
+ \beth \or % 2136 BET SYMBOL
+ \gimel \or % 2137 GIMEL SYMBOL
+ \daleth \or % 2138 DALET SYMBOL
+ \unic@informationsource \or % 2139 INFORMATION SOURCE
+ \unic@rotatedQ \or % 213A ROTATED CAPITAL Q
+ \unic@facsimilesign \or % 213B FACSIMILE SIGN
+ \unic@doublestruckpi \or % 213C DOUBLE-STRUCK SMALL PI
+ \unic@doublestruckgamma \or % 213D DOUBLE-STRUCK SMALL GAMMA
+ \unic@doublestruckGamma \or % 213E DOUBLE-STRUCK CAPITAL GAMMA
+ \unic@doublestruckPi \or % 213F DOUBLE-STRUCK CAPITAL PI
+ \unic@doublestrucknarysummation \or % 2140 DOUBLE-STRUCK N-ARY SUMMATION
+ \unic@turnedsansserifG \or % 2141 TURNED SANS-SERIF CAPITAL G
+ \unic@turnedsansserifL \or % 2142 TURNED SANS-SERIF CAPITAL L
+ \unic@reversedsansserifL \or % 2143 REVERSED SANS-SERIF CAPITAL L
+ \unic@turnedsansserifY \or % 2144 TURNED SANS-SERIF CAPITAL Y
+ \unic@doublestruckitalicD \or % 2145 DOUBLE-STRUCK ITALIC CAPITAL D
+ \unic@doublestruckitalicd \or % 2146 DOUBLE-STRUCK ITALIC SMALL D
+ \unic@doublestruckitalice \or % 2147 DOUBLE-STRUCK ITALIC SMALL E
+ \unic@doublestruckitalici \or % 2148 DOUBLE-STRUCK ITALIC SMALL I
+ \unic@doublestruckitalicj \or % 2149 DOUBLE-STRUCK ITALIC SMALL J
+ \unic@propertyline \or % 214A PROPERTY LINE
+ \unic@turnedampersand \or % 214B TURNED AMPERSAND
+ \unic@persign \or % 214C PER SIGN
+ \unknownchar \or % 214D
+ \unknownchar \or % 214E
+ \unknownchar \or % 214F
+ \unknownchar \or % 2150
+ \unknownchar \or % 2151
+ \unknownchar \or % 2152
+ \unic@fractiononethird \or % 2153 VULGAR FRACTION ONE THIRD
+ \unic@fractiontwothirds \or % 2154 VULGAR FRACTION TWO THIRDS
+ \unic@fractiononefifth \or % 2155 VULGAR FRACTION ONE FIFTH
+ \unic@fractiontwofifths \or % 2156 VULGAR FRACTION TWO FIFTHS
+ \unic@fractionthreefifths \or % 2157 VULGAR FRACTION THREE FIFTHS
+ \unic@fractionfourfifths \or % 2158 VULGAR FRACTION FOUR FIFTHS
+ \unic@fractiononesixth \or % 2159 VULGAR FRACTION ONE SIXTH
+ \unic@fractionfivesixths \or % 215A VULGAR FRACTION FIVE SIXTHS
+ \unic@fractiononeeighth \or % 215B VULGAR FRACTION ONE EIGHTH
+ \unic@fractionthreeeighths \or % 215C VULGAR FRACTION THREE EIGHTHS
+ \unic@fractionfiveeighths \or % 215D VULGAR FRACTION FIVE EIGHTHS
+ \unic@fractionseveneighths \or % 215E VULGAR FRACTION SEVEN EIGHTHS
+ \unic@fractionnumeratorone \or % 215F FRACTION NUMERATOR ONE
+ \unic@romannumeralOne \or % 2160 ROMAN NUMERAL ONE
+ \unic@romannumeralTwo \or % 2161 ROMAN NUMERAL TWO
+ \unic@romannumeralThree \or % 2162 ROMAN NUMERAL THREE
+ \unic@romannumeralFour \or % 2163 ROMAN NUMERAL FOUR
+ \unic@romannumeralFive \or % 2164 ROMAN NUMERAL FIVE
+ \unic@romannumeralSix \or % 2165 ROMAN NUMERAL SIX
+ \unic@romannumeralSeven \or % 2166 ROMAN NUMERAL SEVEN
+ \unic@romannumeralEight \or % 2167 ROMAN NUMERAL EIGHT
+ \unic@romannumeralNine \or % 2168 ROMAN NUMERAL NINE
+ \unic@romannumeralTen \or % 2169 ROMAN NUMERAL TEN
+ \unic@romannumeralEleven \or % 216A ROMAN NUMERAL ELEVEN
+ \unic@romannumeralTwelve \or % 216B ROMAN NUMERAL TWELVE
+ \unic@romannumeralFifty \or % 216C ROMAN NUMERAL FIFTY
+ \unic@romannumeralOnehundred \or % 216D ROMAN NUMERAL ONE HUNDRED
+ \unic@romannumeralFivehundred \or % 216E ROMAN NUMERAL FIVE HUNDRED
+ \unic@romannumeralOnethousand \or % 216F ROMAN NUMERAL ONE THOUSAND
+ \unic@romannumeralone \or % 2170 SMALL ROMAN NUMERAL ONE
+ \unic@romannumeraltwo \or % 2171 SMALL ROMAN NUMERAL TWO
+ \unic@romannumeralthree \or % 2172 SMALL ROMAN NUMERAL THREE
+ \unic@romannumeralfour \or % 2173 SMALL ROMAN NUMERAL FOUR
+ \unic@romannumeralfive \or % 2174 SMALL ROMAN NUMERAL FIVE
+ \unic@romannumeralsix \or % 2175 SMALL ROMAN NUMERAL SIX
+ \unic@romannumeralseven \or % 2176 SMALL ROMAN NUMERAL SEVEN
+ \unic@romannumeraleight \or % 2177 SMALL ROMAN NUMERAL EIGHT
+ \unic@romannumeralnine \or % 2178 SMALL ROMAN NUMERAL NINE
+ \unic@romannumeralten \or % 2179 SMALL ROMAN NUMERAL TEN
+ \unic@romannumeraleleven \or % 217A SMALL ROMAN NUMERAL ELEVEN
+ \unic@romannumeraltwelve \or % 217B SMALL ROMAN NUMERAL TWELVE
+ \unic@romannumeralfifty \or % 217C SMALL ROMAN NUMERAL FIFTY
+ \unic@romannumeralonehundred \or % 217D SMALL ROMAN NUMERAL ONE HUNDRED
+ \unic@romannumeralfivehundred \or % 217E SMALL ROMAN NUMERAL FIVE HUNDRED
+ \unic@romannumeralonethousand \or % 217F SMALL ROMAN NUMERAL ONE THOUSAND
+ \unic@romannumeralonethousandCD \or % 2180 ROMAN NUMERAL ONE THOUSAND C D
+ \unic@romannumeralfivethousand \or % 2181 ROMAN NUMERAL FIVE THOUSAND
+ \unic@romannumeraltenthousand \or % 2182 ROMAN NUMERAL TEN THOUSAND
+ \unic@romannumeralreversedonehundred\or % 2183 ROMAN NUMERAL REVERSED ONE HUNDRED
+ \unknownchar \or % 2184
+ \unknownchar \or % 2185
+ \unknownchar \or % 2186
+ \unknownchar \or % 2187
+ \unknownchar \or % 2188
+ \unknownchar \or % 2189
+ \unknownchar \or % 218A
+ \unknownchar \or % 218B
+ \unknownchar \or % 218C
+ \unknownchar \or % 218D
+ \unknownchar \or % 218E
+ \unknownchar \or % 218F
+ \leftarrow \or % LEFTWARDS ARROW
+ \uparrow \or % UPWARDS ARROW
+ \rightarrow \or % RIGHTWARDS ARROW
+ \downarrow \or % DOWNWARDS ARROW
+ \leftrightarrow \or % LEFT RIGHT ARROW
+ \updownarrow \or % UP DOWN ARROW
+ \nwarrow \or % NORTH WEST ARROW
+ \nearrow \or % NORTH EAST ARROW
+ \searrow \or % SOUTH EAST ARROW
+ \swarrow \or % SOUTH WEST ARROW
+ \nleftarrow \or % LEFTWARDS ARROW WITH STROKE
+ \nrightarrow \or % RIGHTWARDS ARROW WITH STROKE
+ \unknownchar \or % LEFTWARDS WAVE ARROW
+ \unknownchar \or % RIGHTWARDS WAVE ARROW
+ \twoheadedleftarrow \or % LEFTWARDS TWO HEADED ARROW
+ \unknownchar \or % UPWARDS TWO HEADED ARROW
+ \twoheadedrightarrow \or % RIGHTWARDS TWO HEADED ARROW
+ \unknownchar \or % DOWNWARDS TWO HEADED ARROW
+ \leftarrowtail \or % LEFTWARDS ARROW WITH TAIL
+ \rightarrowtail \or % RIGHTWARDS ARROW WITH TAIL
+ \mapsfrom \or % LEFTWARDS ARROW FROM BAR
+ \unknownchar \or % UPWARDS ARROW FROM BAR
+ \mapsto \or % RIGHTWARDS ARROW FROM BAR
+ \unknownchar \or % DOWNWARDS ARROW FROM BAR
+ \unknownchar \or % UP DOWN ARROW WITH BASE
+ \hookleftarrow \or % LEFTWARDS ARROW WITH HOOK
+ \hookrightarrow \or % RIGHTWARDS ARROW WITH HOOK
+ \loopleftarrow \or % LEFTWARDS ARROW WITH LOOP
+ \looprightarrow \or % RIGHTWARDS ARROW WITH LOOP
+ \unknownchar \or % LEFT RIGHT WAVE ARROW
+ \nleftrightarrow \or % LEFT RIGHT ARROW WITH STROKE
+ \lightning \or % DOWNWARDS ZIGZAG ARROW
+ \Lsh \or % UPWARDS ARROW WITH TIP LEFTWARDS
+ \Rsh \or % UPWARDS ARROW WITH TIP RIGHTWARDS
+ \unknownchar \or % DOWNWARDS ARROW WITH TIP LEFTWARDS
+ \unknownchar \or % DOWNWARDS ARROW WITH TIP RIGHTWARDS
+ \unknownchar \or % RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+ \unknownchar \or % DOWNWARDS ARROW WITH CORNER LEFTWARDS
+ \curveleftarrow \or % ANTICLOCKWISE TOP SEMICIRCLE ARROW
+ \curverightarrow \or % CLOCKWISE TOP SEMICIRCLE ARROW
+ \unknownchar \or % NORTH WEST ARROW TO LONG BAR
+ \unknownchar \or % LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+ \circlearrowleft \or % ANTICLOCKWISE OPEN CIRCLE ARROW
+ \circlearrowright \or % CLOCKWISE OPEN CIRCLE ARROW
+ \leftharpoonup \or % LEFTWARDS HARPOON WITH BARB UPWARDS
+ \leftharpoondown \or % LEFTWARDS HARPOON WITH BARB DOWNWARDS
+ \upharpoonright \or % UPWARDS HARPOON WITH BARB RIGHTWARDS
+ \upharpoonleft \or % UPWARDS HARPOON WITH BARB LEFTWARDS
+ \rightharpoonup \or % RIGHTWARDS HARPOON WITH BARB UPWARDS
+ \rightharpoondown \or % RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+ \downharpoonright \or % DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+ \downharpoonleft \or % DOWNWARDS HARPOON WITH BARB LEFTWARDS
+ \rightleftarrows \or % RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+ \unknownchar \or % UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+ \leftrightarrows \or % LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+ \leftleftarrows \or % LEFTWARDS PAIRED ARROWS
+ \upuparrows \or % UPWARDS PAIRED ARROWS
+ \rightrightarrows \or % RIGHTWARDS PAIRED ARROWS
+ \downdownarrows \or % DOWNWARDS PAIRED ARROWS
+ \leftrightharpoons \or % LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+ \rightleftharpoons \or % RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+ \nLeftarrow \or % LEFTWARDS DOUBLE ARROW WITH STROKE
+ \nLeftrightarrow \or % LEFT RIGHT DOUBLE ARROW WITH STROKE
+ \nRightarrow \or % RIGHTWARDS DOUBLE ARROW WITH STROKE
+ \Leftarrow \or % LEFTWARDS DOUBLE ARROW
+ \Uparrow \or % UPWARDS DOUBLE ARROW
+ \Rightarrow \or % RIGHTWARDS DOUBLE ARROW
+ \Downarrow \or % DOWNWARDS DOUBLE ARROW
+ \Leftrightarrow \or % LEFT RIGHT DOUBLE ARROW
+ \Updownarrow \or % UP DOWN DOUBLE ARROW
+ \unknownchar \or % NORTH WEST DOUBLE ARROW
+ \unknownchar \or % NORTH EAST DOUBLE ARROW
+ \unknownchar \or % SOUTH EAST DOUBLE ARROW
+ \unknownchar \or % SOUTH WEST DOUBLE ARROW
+ \Lleftarrow \or % LEFTWARDS TRIPLE ARROW
+ \unknownchar \or % RIGHTWARDS TRIPLE ARROW
+ \leftsquidarrow \or % LEFTWARDS SQUIGGLE ARROW
+ \rightsquidarrow \or % RIGHTWARDS SQUIGGLE ARROW
+ \unknownchar \or % UPWARDS ARROW WITH DOUBLE STROKE
+ \unknownchar \or % DOWNWARDS ARROW WITH DOUBLE STROKE
+ \dashleftarrow \or % LEFTWARDS DASHED ARROW
+ \unknownchar \or % UPWARDS DASHED ARROW
+ \dashrightarrow \or % RIGHTWARDS DASHED ARROW
+ \unknownchar \or % DOWNWARDS DASHED ARROW
+ \unic@leftarrowtobar \or % LEFTWARDS ARROW TO BAR
+ \unknownchar \or % RIGHTWARDS ARROW TO BAR
+ \unknownchar \or % LEFTWARDS WHITE ARROW
+ \unknownchar \or % UPWARDS WHITE ARROW
+ \unknownchar \or % RIGHTWARDS WHITE ARROW
+ \unknownchar \or % DOWNWARDS WHITE ARROW
+ \unknownchar \or % UPWARDS WHITE ARROW FROM BAR
+ \unknownchar \or % UPWARDS WHITE ARROW ON PEDESTAL
+ \unknownchar \or % UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+ \unknownchar \or % UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+ \unknownchar \or % UPWARDS WHITE DOUBLE ARROW
+ \unknownchar \or % UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+ \unknownchar \or % RIGHTWARDS WHITE ARROW FROM WALL
+ \unknownchar \or % NORTH WEST ARROW TO CORNER
+ \unknownchar \or % SOUTH EAST ARROW TO CORNER
+ \unknownchar \or % UP DOWN WHITE ARROW
+ \unknownchar \or % RIGHT ARROW WITH SMALL CIRCLE
+ \unknownchar \or % DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+ \unknownchar \or % THREE RIGHTWARDS ARROWS
+ \unknownchar \or % LEFTWARDS ARROW WITH VERTICAL STROKE
+ \unknownchar \or % RIGHTWARDS ARROW WITH VERTICAL STROKE
+ \unknownchar \or % LEFT RIGHT ARROW WITH VERTICAL STROKE
+ \unknownchar \or % LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+ \unknownchar \or % RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+ \unknownchar \or % LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+ \leftarrowtriangle \or % LEFTWARDS OPEN-HEADED ARROW
+ \rightarrowtriangle \or % RIGHTWARDS OPEN-HEADED ARROW
+ \leftrightarrowtriangle \else % LEFT RIGHT OPEN-HEADED ARROW
+ \unknowncharacter
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-034.mkii b/tex/context/base/unic-034.mkii
new file mode 100644
index 000000000..fece26bff
--- /dev/null
+++ b/tex/context/base/unic-034.mkii
@@ -0,0 +1,274 @@
+%D \module
+%D [ file=unic-034,
+%D version=2005.06.11,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 34,
+%D author=Nikolai Weibull,
+%D date=\currentdate,
+%D copyright={PRAGMA / Nikolai Weibull}]
+
+\unprotect
+
+\startunicodevector 34
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \forall \or % FOR ALL
+ \complement \or % COMPLEMENT
+ \partial \or % PARTIAL DIFFERENTIAL
+ \exists \or % THERE EXISTS
+ \nexists \or % THERE DOES NOT EXIST
+ \emptyset \or % EMPTY SET
+ \vartriangle \or % INCREMENT
+ \nabla \or % NABLA
+ \unic@in \or % ELEMENT OF
+ \unic@nin \or % NOT AN ELEMENT OF
+ \unknownchar \or % SMALL ELEMENT OF
+ \ni \or % CONTAINS AS MEMBER
+ \unic@nni \or % DOES NOT CONTAIN AS MEMBER
+ \unknownchar \or % SMALL CONTAINS AS MEMBER
+ \QED \or % END OF PROOF
+ \prod \or % N-ARY PRODUCT
+ \coprod \or % N-ARY COPRODUCT
+ \sum \or % N-ARY SUMMATION
+ \unic@minus \or % MINUS SIGN
+ \mp \or % MINUS-OR-PLUS SIGN
+ \dotplus \or % DOT PLUS
+ \unic@divisionslash \or % DIVISION SLASH
+ \setminus \or % SET MINUS
+ \ast \or % ASTERISK OPERATOR
+ \circ \or % RING OPERATOR
+ \bullet \or % BULLET OPERATOR
+ \unic@sqrt \or % SQUARE ROOT
+ \unic@cubesqrt \or % CUBE ROOT
+ \unic@fourthsqrt \or % FOURTH ROOT
+ \propto \or % PROPORTIONAL TO
+ \infty \or % INFINITY
+ \unknownchar \or % RIGHT ANGLE
+ \angle \or % ANGLE
+ \measuredangle \or % MEASURED ANGLE
+ \sphericalangle \or % SPHERICAL ANGLE
+ \unic@divides \or % DIVIDES
+ \unic@ndivides \or % DOES NOT DIVIDE
+ \parallel \or % PARALLEL TO
+ \nparallel \or % NOT PARALLEL TO
+ \land \or % LOGICAL AND
+ \lor \or % LOGICAL OR
+ \unic@cap \or % INTERSECTION
+ \cup \or % UNION
+ \int \or % INTEGRAL
+ \unic@dblint \or % DOUBLE INTEGRAL
+ \unic@triint \or % TRIPLE INTEGRAL
+ \oint \or % CONTOUR INTEGRAL
+ \unknownchar \or % SURFACE INTEGRAL
+ \unknownchar \or % VOLUME INTEGRAL
+ \unknownchar \or % CLOCKWISE INTEGRAL
+ \unknownchar \or % CLOCKWISE CONTOUR INTEGRAL
+ \unknownchar \or % ANTICLOCKWISE CONTOUR INTEGRAL
+ \therefore \or % THEREFORE
+ \because \or % BECAUSE
+ \unic@ratio \or % RATIO
+ \unic@proportion \or % PROPORTION
+ \unknownchar \or % DOT MINUS
+ \unic@excess \or % EXCESS
+ \unic@geompropr \or % GEOMETRIC PROPORTION
+ \unic@homothetic \or % HOMOTHETIC
+ \sim \or % TILDE OPERATOR
+ \backsim \or % REVERSED TILDE
+ \unknownchar \or % INVERTED LAZY S
+ \unknownchar \or % SINE WAVE
+ \wr \or % WREATH PRODUCT
+ \nsim \or % NOT TILDE
+ \eqsim \or % MINUS TILDE
+ \simeq \or % ASYMPTOTICALLY EQUAL TO
+ \nsimeq \or % NOT ASYMPTOTICALLY EQUAL TO
+ \approxeq \or % APPROXIMATELY EQUAL TO
+ \unic@cong \or % APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+ \unic@napproxeq \or % NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+ \approx \or % ALMOST EQUAL TO
+ \unic@napprox \or % NOT ALMOST EQUAL TO
+ \approxeq \or % ALMOST EQUAL OR EQUAL TO
+ \unknownchar \or % TRIPLE TILDE
+ \unknownchar \or % ALL EQUAL TO
+ \asymp \or % EQUIVALENT TO
+ \Bumpeq \or % GEOMETRICALLY EQUIVALENT TO
+ \bumpeq \or % DIFFERENCE BETWEEN
+ \unic@doteq \or % APPROACHES THE LIMIT
+ \doteqdot \or % GEOMETRICALLY EQUAL TO
+ \fallingdotseq \or % APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ \risingdotseq \or % IMAGE OF OR APPROXIMATELY EQUAL TO
+ \unknownchar \or % COLON EQUALS
+ \unknownchar \or % EQUALS COLON
+ \eqcirc \or % RING IN EQUAL TO
+ \circeq \or % RING EQUAL TO
+ \unic@correspondsto \or % CORRESPONDS TO
+ \unic@estimates \or % ESTIMATES
+ \unic@equiangularto \or % EQUIANGULAR TO
+ \unic@stareq \or % STAR EQUALS
+ \unic@triangleq \or % DELTA EQUAL TO
+ \unic@eqbydef \or % EQUAL TO BY DEFINITION
+ \unic@measuredby \or % MEASURED BY
+ \unic@questionedeq \or % QUESTIONED EQUAL TO
+ \neq \or % NOT EQUAL TO
+ \equiv \or % IDENTICAL TO
+ \unic@nequiv \or % NOT IDENTICAL TO
+ \unknownchar \or % STRICTLY EQUIVALENT TO
+ \leq \or % LESS-THAN OR EQUAL TO
+ \geq \or % GREATER-THAN OR EQUAL TO
+ \leqq \or % LESS-THAN OVER EQUAL TO
+ \geqq \or % GREATER-THAN OVER EQUAL TO
+ \lneqq \or % LESS-THAN BUT NOT EQUAL TO
+ \gneqq \or % GREATER-THAN BUT NOT EQUAL TO
+ \ll \or % MUCH LESS-THAN
+ \gg \or % MUCH GREATER-THAN
+ \between \or % BETWEEN
+ \nasymp \or % NOT EQUIVALENT TO
+ \nless \or % NOT LESS-THAN
+ \ngtr \or % NOT GREATER-THAN
+ \nleq \or % NEITHER LESS-THAN NOR EQUAL TO
+ \ngeq \or % NEITHER GREATER-THAN NOR EQUAL TO
+ \lesssim \or % LESS-THAN OR EQUIVALENT TO
+ \gtrsim \or % GREATER-THAN OR EQUIVALENT TO
+ \unic@nlesssim \or % NEITHER LESS-THAN NOR EQUIVALENT TO
+ \unic@ngtrsim \or % NEITHER GREATER-THAN NOR EQUIVALENT TO
+ \lessgtr \or % LESS-THAN OR GREATER-THAN
+ \gtrless \or % GREATER-THAN OR LESS-THAN
+ \unic@nlessgtr \or % NEITHER LESS-THAN NOR GREATER-THAN
+ \unic@ngtrless \or % NEITHER GREATER-THAN NOR LESS-THAN
+ \prec \or % PRECEDES
+ \succ \or % SUCCEEDS
+ \preceq \or % PRECEDES OR EQUAL TO
+ \succeq \or % SUCCEEDS OR EQUAL TO
+ \precsim \or % PRECEDES OR EQUIVALENT TO
+ \succsim \or % SUCCEEDS OR EQUIVALENT TO
+ \nprec \or % DOES NOT PRECEDE
+ \nsucc \or % DOES NOT SUCCEED
+ \subset \or % SUBSET OF
+ \supset \or % SUPERSET OF
+ \unic@nsubset \or % NOT A SUBSET OF
+ \unic@nsupset \or % NOT A SUPERSET OF
+ \subseteq \or % SUBSET OF OR EQUAL TO
+ \supseteq \or % SUPERSET OF OR EQUAL TO
+ \nsubseteq \or % NEITHER A SUBSET OF NOR EQUAL TO
+ \nsupseteq \or % NEITHER A SUPERSET OF NOR EQUAL TO
+ \subsetneq \or % SUBSET OF WITH NOT EQUAL TO
+ \supsetneq \or % SUPERSET OF WITH NOT EQUAL TO
+ \unknownchar \or % MULTISET
+ \unknownchar \or % MULTISET MULTIPLICATION
+ \biguplus \or % MULTISET UNION
+ \sqsubset \or % SQUARE IMAGE OF
+ \sqsupset \or % SQUARE ORIGINAL OF
+ \sqsubseteq \or % SQUARE IMAGE OF OR EQUAL TO
+ \sqsupseteq \or % SQUARE ORIGINAL OF OR EQUAL TO
+ \sqcap \or % SQUARE CAP
+ \sqcup \or % SQUARE CUP
+ \oplus \or % CIRCLED PLUS
+ \ominus \or % CIRCLED MINUS
+ \otimes \or % CIRCLED TIMES
+ \oslash \or % CIRCLED DIVISION SLASH
+ \odot \or % CIRCLED DOT OPERATOR
+ \circledcirc \or % CIRCLED RING OPERATOR
+ \circledast \or % CIRCLED ASTERISK OPERATOR
+ \unknownchar \or % CIRCLED EQUALS
+ \circleddash \or % CIRCLED DASH
+ \boxplus \or % SQUARED PLUS
+ \boxminus \or % SQUARED MINUS
+ \boxtimes \or % SQUARED TIMES
+ \boxdot \or % SQUARED DOT OPERATOR
+ \vdash \or % RIGHT TACK
+ \dashv \or % LEFT TACK
+ \top \or % DOWN TACK
+ \bot \or % UP TACK
+ \unknownchar \or % ASSERTION
+ \models \or % MODELS
+ \vDash \or % TRUE
+ \unknownchar \or % FORCES
+ \Vvdash \or % TRIPLE VERTICAL BAR RIGHT TURNSTILE
+ \unknownchar \or % DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+ \nvdash \or % DOES NOT PROVE
+ \nvDash \or % NOT TRUE
+ \unknownchar \or % DOES NOT FORCE
+ \unknownchar \or % NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+ \unknownchar \or % PRECEDES UNDER RELATION
+ \unknownchar \or % SUCCEEDS UNDER RELATION
+ \lhd \or % NORMAL SUBGROUP OF
+ \rhd \or % CONTAINS AS NORMAL SUBGROUP
+ \unlhd \or % NORMAL SUBGROUP OF OR EQUAL TO
+ \unrhd \or % CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+ \unknownchar \or % ORIGINAL OF
+ \unknownchar \or % IMAGE OF
+ \unknownchar \or % MULTIMAP
+ \unknownchar \or % HERMITIAN CONJUGATE MATRIX
+ \unknownchar \or % INTERCALATE
+ \veebar \or % XOR
+ \barwedge \or % NAND
+ \unknownchar \or % NOR
+ \unknownchar \or % RIGHT ANGLE WITH ARC
+ \unknownchar \or % RIGHT TRIANGLE
+ \bigwedge \or % N-ARY LOGICAL AND
+ \bigvee \or % N-ARY LOGICAL OR
+ \bigcap \or % N-ARY INTERSECTION
+ \bigcup \or % N-ARY UNION
+ \diamond \or % DIAMOND OPERATOR
+ \cdot \or % DOT OPERATOR
+ \star \or % STAR OPERATOR
+ \divideontimes \or % DIVISION TIMES
+ \bowtie \or % BOWTIE
+ \ltimes \or % LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+ \rtimes \or % RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+ \leftthreetimes \or % LEFT SEMIDIRECT PRODUCT
+ \rightthreetimes \or % RIGHT SEMIDIRECT PRODUCT
+ \backsimeq \or % REVERSED TILDE EQUALS
+ \unknownchar \or % CURLY LOGICAL OR
+ \unknownchar \or % CURLY LOGICAL AND
+ \Subset \or % DOUBLE SUBSET
+ \Supset \or % DOUBLE SUPERSET
+ \Cap \or % DOUBLE INTERSECTION
+ \Cup \or % DOUBLE UNION
+ \pitchfork \or % PITCHFORK
+ \unknownchar \or % EQUAL AND PARALLEL TO
+ \unknownchar \or % LESS-THAN WITH DOT
+ \unknownchar \or % GREATER-THAN WITH DOT
+ \lll \or % VERY MUCH LESS-THAN
+ \ggg \or % VERY MUCH GREATER-THAN
+ \lesseqgtr \or % LESS-THAN EQUAL TO OR GREATER-THAN
+ \gtreqless \or % GREATER-THAN EQUAL TO OR LESS-THAN
+ \unknownchar \or % EQUAL TO OR LESS-THAN
+ \unknownchar \or % EQUAL TO OR GREATER-THAN
+ \curlyeqprec \or % EQUAL TO OR PRECEDES
+ \curlyeqsucc \or % EQUAL TO OR SUCCEEDS
+ \npreceq \or % DOES NOT PRECEDE OR EQUAL
+ \nsucceq \or % DOES NOT SUCCEED OR EQUAL
+ \unic@nsqsubseteq \or % NOT SQUARE IMAGE OF OR EQUAL TO
+ \unic@nsqsupseteq \or % NOT SQUARE ORIGINAL OF OR EQUAL TO
+ \unknownchar \or % SQUARE IMAGE OF OR NOT EQUAL TO
+ \unknownchar \or % SQUARE ORIGINAL OF OR NOT EQUAL TO
+ \lnsim \or % LESS-THAN BUT NOT EQUIVALENT TO
+ \gnsim \or % GREATER-THAN BUT NOT EQUIVALENT TO
+ \precnsim \or % PRECEDES BUT NOT EQUIVALENT TO
+ \succnsim \or % SUCCEEDS BUT NOT EQUIVALENT TO
+ \ntriangleleft \or % NOT NORMAL SUBGROUP OF
+ \ntriangleright \or % DOES NOT CONTAIN AS NORMAL SUBGROUP
+ \ntrianglelefteq \or % NOT NORMAL SUBGROUP OF OR EQUAL TO
+ \ntrianglerighteq \or % DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+ \vdots \or % VERTICAL ELLIPSIS
+ \cdots \or % MIDLINE HORIZONTAL ELLIPSIS
+ \unknownchar \or % UP RIGHT DIAGONAL ELLIPSIS
+ \ddots \or % DOWN RIGHT DIAGONAL ELLIPSIS
+ \unknownchar \or % ELEMENT OF WITH LONG HORIZONTAL STROKE
+ \unknownchar \or % ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ \unknownchar \or % SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ \unknownchar \or % ELEMENT OF WITH DOT ABOVE
+ \unknownchar \or % ELEMENT OF WITH OVERBAR
+ \unknownchar \or % SMALL ELEMENT OF WITH OVERBAR
+ \unknownchar \or % ELEMENT OF WITH UNDERBAR
+ \unknownchar \or % ELEMENT OF WITH TWO HORIZONTAL STROKES
+ \unknownchar \or % CONTAINS WITH LONG HORIZONTAL STROKE
+ \unknownchar \or % CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ \unknownchar \or % SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ \unknownchar \or % CONTAINS WITH OVERBAR
+ \unknownchar \else % SMALL CONTAINS WITH OVERBAR
+ \unknownchar % Z NOTATION BAG MEMBERSHIP
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-035.mkii b/tex/context/base/unic-035.mkii
new file mode 100644
index 000000000..272799512
--- /dev/null
+++ b/tex/context/base/unic-035.mkii
@@ -0,0 +1,32 @@
+%D \module
+%D [ file=unic-035,
+%D version=2009.05.25,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 35,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+\unprotect
+
+\startunicodevector 35
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \varnothing \or % DIAMETER SIGN
+ \unknownchar \or % ELECTRIC ARROW
+ \unknownchar \or % HOUSE
+ \unknownchar \or % UP ARROWHEAD
+ \unknownchar \or % DOWN ARROWHEAD
+ \unknownchar \or % PROJECTIVE
+ \unknownchar \or % PERSPECTIVE
+ \unknownchar \or % WAVY LINE
+ \lceil \or % LEFT CEILING
+ \rceil \or % RIGHT CEILING
+ \lfloor \or % LEFT FLOOR
+ \rfloor \or % RIGHT FLOOR
+ \unknownchar \else
+ \unknownchar %
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-037.mkii b/tex/context/base/unic-037.mkii
new file mode 100644
index 000000000..87f655a68
--- /dev/null
+++ b/tex/context/base/unic-037.mkii
@@ -0,0 +1,278 @@
+%D \module
+%D [ file=unic-037,
+%D version=2006.02.13,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 37,
+%D author=Luigi Scarso,
+%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.
+
+\unprotect
+
+\startunicodevector 37
+ \expandafter\strippedcsname
+ \ifcase\numexpr #1+1\relax\or %%
+ \UnicodeLightHorizontal\or
+ \UnicodeHeavyHorizontal\or
+ \UnicodeLightVertical\or
+ \UnicodeHeavyVertical\or
+ \UnicodeLightTripleDashHorizontal\or
+ \UnicodeHeavyTripleDashHorizontal\or
+ \UnicodeLightTripleDashVertical\or
+ \UnicodeHeavyTripleDashVertical\or
+ \UnicodeLightQuadrupleDashHorizontal\or
+ \UnicodeHeavyQuadrupleDashHorizontal\or
+ \UnicodeLightQuadrupleDashVertical\or
+ \UnicodeHeavyQuadrupleDashVertical\or
+ \UnicodeLightDownAndRight\or
+ \UnicodeDownLightAndRightHeavy\or
+ \UnicodeDownHeavyAndRightLight\or
+ \UnicodeHeavyDownAndRight\or
+ \UnicodeLightDownAndLeft\or
+ \UnicodeDownLightAndLeftHeavy\or
+ \UnicodeDownHeavyAndLeftLight\or
+ \UnicodeHeavyDownAndLeft\or
+ \UnicodeLightUpAndRight\or
+ \UnicodeUpLightAndRightHeavy\or
+ \UnicodeUpHeavyAndRightLight\or
+ \UnicodeHeavyUpAndRight\or
+ \UnicodeLightUpAndLeft\or
+ \UnicodeUpLightAndLeftHeavy\or
+ \UnicodeUpHeavyAndLeftLight\or
+ \UnicodeHeavyUpAndLeft\or
+ \UnicodeLightVerticalAndRight\or
+ \UnicodeVerticalLightAndRightHeavy\or
+ \UnicodeUpHeavyAndRightDownLight\or
+ \UnicodeDownHeavyAndRightUpLight\or
+ \UnicodeVerticalHeavyAndRightLight\or
+ \UnicodeDownLightAndRightUpHeavy\or
+ \UnicodeUpLightAndRightDownHeavy\or
+ \UnicodeHeavyVerticalAndRight\or
+ \UnicodeLightVerticalAndLeft\or
+ \UnicodeVerticalLightAndLeftHeavy\or
+ \UnicodeUpHeavyAndLeftDownLight\or
+ \UnicodeDownHeavyAndLeftUpLight\or
+ \UnicodeVerticalHeavyAndLeftLight\or
+ \UnicodeDownLightAndLeftUpHeavy\or
+ \UnicodeUpLightAndLeftDownHeavy\or
+ \UnicodeHeavyVerticalAndLeft\or
+ \UnicodeLightDownAndHorizontal\or
+ \UnicodeLeftHeavyAndRightDownLight\or
+ \UnicodeRightHeavyAndLeftDownLight\or
+ \UnicodeDownLightAndHorizontalHeavy\or
+ \UnicodeDownHeavyAndHorizontalLight\or
+ \UnicodeRightLightAndLeftDownHeavy\or
+ \UnicodeLeftLightAndRightDownHeavy\or
+ \UnicodeHeavyDownAndHorizontal\or
+ \UnicodeLightUpAndHorizontal\or
+ \UnicodeLeftHeavyAndRightUpLight\or
+ \UnicodeRightHeavyAndLeftUpLight\or
+ \UnicodeUpLightAndHorizontalHeavy\or
+ \UnicodeUpHeavyAndHorizontalLight\or
+ \UnicodeRightLightAndLeftUpHeavy\or
+ \UnicodeLeftLightAndRightUpHeavy\or
+ \UnicodeHeavyUpAndHorizontal\or
+ \UnicodeLightVerticalAndHorizontal\or
+ \UnicodeLeftHeavyAndRightVerticalLight\or
+ \UnicodeRightHeavyAndLeftVerticalLight\or
+ \UnicodeVerticalLightAndHorizontalHeavy\or
+ \UnicodeUpHeavyAndDownHorizontalLight\or
+ \UnicodeDownHeavyAndUpHorizontalLight\or
+ \UnicodeVerticalHeavyAndHorizontalLight\or
+ \UnicodeLeftUpHeavyAndRightDownLight\or
+ \UnicodeRightUpHeavyAndLeftDownLight\or
+ \UnicodeLeftDownHeavyAndRightUpLight\or
+ \UnicodeRightDownHeavyAndLeftUpLight\or
+ \UnicodeDownLightAndUpHorizontalHeavy\or
+ \UnicodeUpLightAndDownHorizontalHeavy\or
+ \UnicodeRightLightAndLeftVerticalHeavy\or
+ \UnicodeLeftLightAndRightVerticalHeavy\or
+ \UnicodeHeavyVerticalAndHorizontal\or
+ \UnicodeLightDoubleDashHorizontal\or
+ \UnicodeHeavyDoubleDashHorizontal\or
+ \UnicodeLightDoubleDashVertical\or
+ \UnicodeHeavyDoubleDashVertical\or
+ \UnicodeDoubleHorizontal\or
+ \UnicodeDoubleVertical\or
+ \UnicodeDownSingleAndRightDouble\or
+ \UnicodeDownDoubleAndRightSingle\or
+ \UnicodeDoubleDownAndRight\or
+ \UnicodeDownSingleAndLeftDouble\or
+ \UnicodeDownDoubleAndLeftSingle\or
+ \UnicodeDoubleDownAndLeft\or
+ \UnicodeUpSingleAndRightDouble\or
+ \UnicodeUpDoubleAndRightSingle\or
+ \UnicodeDoubleUpAndRight\or
+ \UnicodeUpSingleAndLeftDouble\or
+ \UnicodeUpDoubleAndLeftSingle\or
+ \UnicodeDoubleUpAndLeft\or
+ \UnicodeVerticalSingleAndRightDouble\or
+ \UnicodeVerticalDoubleAndRightSingle\or
+ \UnicodeDoubleVerticalAndRight\or
+ \UnicodeVerticalSingleAndLeftDouble\or
+ \UnicodeVerticalDoubleAndLeftSingle\or
+ \UnicodeDoubleVerticalAndLeft\or
+ \UnicodeDownSingleAndHorizontalDouble\or
+ \UnicodeDownDoubleAndHorizontalSingle\or
+ \UnicodeDoubleDownAndHorizontal\or
+ \UnicodeUpSingleAndHorizontalDouble\or
+ \UnicodeUpDoubleAndHorizontalSingle\or
+ \UnicodeDoubleUpAndHorizontal\or
+ \UnicodeVerticalSingleAndHorizontalDouble\or
+ \UnicodeVerticalDoubleAndHorizontalSingle\or
+ \UnicodeDoubleVerticalAndHorizontal\or
+ \UnicodeLightArcDownAndRight\or
+ \UnicodeLightArcDownAndLeft\or
+ \UnicodeLightArcUpAndLeft\or
+ \UnicodeLightArcUpAndRight\or
+ \UnicodeLightDiagonalUpperRightToLowerLeft\or
+ \UnicodeLightDiagonalUpperLeftToLowerRight\or
+ \UnicodeLightDiagonalCross\or
+ \UnicodeLightLeft\or
+ \UnicodeLightUp\or
+ \UnicodeLightRight\or
+ \UnicodeLightDown\or
+ \UnicodeHeavyLeft\or
+ \UnicodeHeavyUp\or
+ \UnicodeHeavyRight\or
+ \UnicodeHeavyDown\or
+ \UnicodeLightLeftAndHeavyRight\or
+ \UnicodeLightUpAndHeavyDown\or
+ \UnicodeHeavyLeftAndLightRight\or
+ \UnicodeHeavyUpAndLightDown\or
+ \UnicodeUpperHalfBlock\or
+ \UnicodeLowerOneEighthBlock\or
+ \UnicodeLowerOneQuarterBlock\or
+ \UnicodeLowerThreeEighthsBlock\or
+ \UnicodeLowerHalfBlock\or
+ \UnicodeLowerFiveEighthsBlock\or
+ \UnicodeLowerThreeQuartersBlock\or
+ \UnicodeLowerSevenEighthsBlock\or
+ \UnicodeFullBlock\or
+ \UnicodeLeftSevenEighthsBlock\or
+ \UnicodeLeftThreeQuartersBlock\or
+ \UnicodeLeftFiveEighthsBlock\or
+ \UnicodeLeftHalfBlock\or
+ \UnicodeLeftThreeEighthsBlock\or
+ \UnicodeLeftOneQuarterBlock\or
+ \UnicodeLeftOneEighthBlock\or
+ \UnicodeRightHalfBlock\or
+ \UnicodeLightShade\or
+ \UnicodeMediumShade\or
+ \UnicodeDarkShade\or
+ \UnicodeUpperOneEighthBlock\or
+ \UnicodeRightOneEighthBlock\or
+ \UnicodeQuadrantLowerLeft\or
+ \UnicodeQuadrantLowerRight\or
+ \UnicodeQuadrantUpperLeft\or
+ \UnicodeQuadrantUpperLeftAndLowerLeftAndLowerRight\or
+ \UnicodeQuadrantUpperLeftAndLowerRight\or
+ \UnicodeQuadrantUpperLeftAndUpperRightandLowerLeft\or
+ \UnicodeQuadrantUpperLeftAndUpperRightAndLowerRight\or
+ \UnicodeQuadrantUpperRight\or
+ \UnicodeQuadrantUpperRightAndLowerLeft\or
+ \UnicodeQuadrantUpperRightAndLowerLeftAndLowerRight\or
+ \UnicodeBlackSquare\or
+ \UnicodeWhiteSquare\or
+ \UnicodeWhiteSquareWithRoundedCorners\or
+ \UnicodeWhiteSquareContainingBlackSmallSquare\or
+ \UnicodeSquareWithHorizontalFill\or
+ \UnicodeSquareWithVerticalFill\or
+ \UnicodeSquareWithOrthogonalCrosshatchFill\or
+ \UnicodeSquareWithUpperLeftToLowerRightFill\or
+ \UnicodeSquareWithUpperRightToLowerLeftFill\or
+ \UnicodeSquareWithDiagonalCrosshatchFill\or
+ \UnicodeBlackSmallSquare\or
+ \UnicodeWhiteSmallSquare\or
+ \UnicodeBlackRectangle\or
+ \UnicodeWhiteRectangle\or
+ \UnicodeBlackVerticalRectangle\or
+ \UnicodeWhiteVerticalRectangle\or
+ \UnicodeBlackParallelogram\or
+ \UnicodeWhiteParallelogram\or
+ \UnicodeBlackUpPointingTriangle\or
+ \UnicodeWhiteUpPointingTriangle\or
+ \UnicodeBlackUpPointingSmallTriangle\or
+ \UnicodeWhiteUpPointingSmallTriangle\or
+ \UnicodeBlackRightPointingTriangle\or
+ \UnicodeWhiteRightPointingTriangle\or
+ \UnicodeBlackRightPointingSmallTriangle\or
+ \UnicodeWhiteRightPointingSmallTriangle\or
+ \UnicodeBlackRightPointingPointer\or
+ \UnicodeWhiteRightPointingPointer\or
+ \UnicodeBlackDownPointingTriangle\or
+ \UnicodeWhiteDownPointingTriangle\or
+ \UnicodeBlackDownPointingSmallTriangle\or
+ \UnicodeWhiteDownPointingSmallTriangle\or
+ \UnicodeBlackLeftPointingTriangle\or
+ \UnicodeWhiteLeftPointingTriangle\or
+ \UnicodeBlackLeftPointingSmallTriangle\or
+ \UnicodeWhiteLeftPointingSmallTriangle\or
+ \UnicodeBlackLeftPointingPointer\or
+ \UnicodeWhiteLeftPointingPointer\or
+ \UnicodeBlackDiamond\or
+ \UnicodeWhiteDiamond\or
+ \UnicodeWhiteDiamondContainingBlackSmallDiamond\or
+ \UnicodeFisheye\or
+ \UnicodeLozenge\or
+ \UnicodeWhiteCircle\or
+ \UnicodeDottedCircle\or
+ \UnicodeCircleWithVerticalFill\or
+ \UnicodeBullseye\or
+ \UnicodeBlackCircle\or
+ \UnicodeCircleWithLeftHalfBlack\or
+ \UnicodeCircleWithRightHalfBlack\or
+ \UnicodeCircleWithLowerHalfBlack\or
+ \UnicodeCircleWithUpperHalfBlack\or
+ \UnicodeCircleWithUpperRightQuadrantBlack\or
+ \UnicodeCircleWithAllButUpperLeftQuadrantBlack\or
+ \UnicodeLeftHalfBlackCircle\or
+ \UnicodeRightHalfBlackCircle\or
+ \UnicodeInverseBullet\or
+ \UnicodeInverseWhiteCircle\or
+ \UnicodeUpperHalfInverseWhiteCircle\or
+ \UnicodeLowerHalfInverseWhiteCircle\or
+ \UnicodeUpperLeftQuadrantCircularArc\or
+ \UnicodeUpperRightQuadrantCircularArc\or
+ \UnicodeLowerRightQuadrantCircularArc\or
+ \UnicodeLowerLeftQuadrantCircularArc\or
+ \UnicodeUpperHalfCircle\or
+ \UnicodeLowerHalfCircle\or
+ \UnicodeBlackLowerRightTriangle\or
+ \UnicodeBlackLowerLeftTriangle\or
+ \UnicodeBlackUpperLeftTriangle\or
+ \UnicodeBlackUpperRightTriangle\or
+ \UnicodeWhiteBullet\or
+ \UnicodeSquareWithLeftHalfBlack\or
+ \UnicodeSquareWithRightHalfBlack\or
+ \UnicodeSquareWithUpperLeftDiagonalHalfBlack\or
+ \UnicodeSquareWithLowerRightDiagonalHalfBlack\or
+ \UnicodeWhiteSquareWithVerticalBisectingLine\or
+ \UnicodeWhiteUpPointingTriangleWithDot\or
+ \UnicodeUpPointingTriangleWithLeftHalfBlack\or
+ \UnicodeUpPointingTriangleWithRightHalfBlack\or
+ \UnicodeLargeCircle\or
+ \UnicodeWhiteSquareWithUpperLeftQuadrant\or
+ \UnicodeWhiteSquareWithLowerLeftQuadrant\or
+ \UnicodeWhiteSquareWithLowerRightQuadrant\or
+ \UnicodeWhiteSquareWithUpperRightQuadrant\or
+ \UnicodeWhiteCircleWithUpperLeftQuadrant\or
+ \UnicodeWhiteCircleWithLowerLeftQuadrant\or
+ \UnicodeWhiteCircleWithLowerRightQuadrant\or
+ \UnicodeWhiteCircleWithUpperRightQuadrant\or
+ \UnicodeUpperLeftTriangle\or
+ \UnicodeUpperRightTriangle\or
+ \UnicodeLowerLeftTriangle\or
+ \UnicodeWhiteMediumSquare\or
+ \UnicodeBlackMediumSquare\or
+ \UnicodeWhiteMediumSmallSquare\or
+ \UnicodeBlackMediumSmallSquare\or
+ \UnicodeLowerRightTriangle\else%
+ \unknownchar\fi
+\stopunicodevector
+\protect \endinput
+
diff --git a/tex/context/base/unic-039.mkii b/tex/context/base/unic-039.mkii
new file mode 100644
index 000000000..bcf649090
--- /dev/null
+++ b/tex/context/base/unic-039.mkii
@@ -0,0 +1,68 @@
+%D \module
+%D [ file=unic-039,
+%D version=2005.06.16,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 39,
+%D author=Nikolai Weibull,
+%D date=\currentdate,
+%D copyright={PRAGMA / Nikolai Weibull}]
+
+\unprotect
+
+\startunicodevector 39
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1-192\relax
+ \unknownchar \or % THREE DIMENSIONAL ANGLE
+ \unknownchar \or % WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+ \perp \or % PERPENDICULAR
+ \unknownchar \or % OPEN SUBSET
+ \unknownchar \or % OPEN SUPERSET
+ \lbag \or % LEFT S-SHAPED BAG DELIMITER
+ \rbag \or % RIGHT S-SHAPED BAG DELIMITER
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % WHITE DIAMOND WITH CENTRED DOT
+ \unknownchar \or % AND WITH DOT
+ \unknownchar \or % ELEMENT OF OPENING UPWARDS
+ \unknownchar \or % LOWER RIGHT CORNER WITH DOT
+ \unknownchar \or % UPPER LEFT CORNER WITH DOT
+ \unknownchar \or % LEFT OUTER JOIN
+ \unknownchar \or % RIGHT OUTER JOIN
+ \unknownchar \or % FULL OUTER JOIN
+ \unknownchar \or % LARGE UP TACK
+ \unknownchar \or % LARGE DOWN TACK
+ \unknownchar \or % LEFT AND RIGHT DOUBLE TURNSTILE
+ \unknownchar \or % LEFT AND RIGHT TACK
+ \unknownchar \or % LEFT MULTIMAP
+ \unknownchar \or % LONG RIGHT TACK
+ \unknownchar \or % LONG LEFT TACK
+ \unknownchar \or % UP TACK WITH CIRCLE ABOVE
+ \unknownchar \or % LOZENGE DIVIDED BY HORIZONTAL RULE
+ \unknownchar \or % WHITE CONCAVE-SIDED DIAMOND
+ \unknownchar \or % WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+ \unknownchar \or % WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+ \unknownchar \or % WHITE SQUARE WITH LEFTWARDS TICK
+ \unknownchar \or % WHITE SQUARE WITH RIGHTWARDS TICK
+ \unic@Lbracket \or % MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ \unic@Rbracket \or % MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ \langle \or % MATHEMATICAL LEFT ANGLE BRACKET
+ \rangle \or % MATHEMATICAL RIGHT ANGLE BRACKET
+ \unic@Langle \or % MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+ \unic@Rangle \or % MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \or % <reserved>
+ \unknownchar \else % <reserved>
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-251.mkii b/tex/context/base/unic-251.mkii
new file mode 100644
index 000000000..150ade456
--- /dev/null
+++ b/tex/context/base/unic-251.mkii
@@ -0,0 +1,34 @@
+%D \module
+%D [ file=unic-251,
+%D version=2006.04.20,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=Vector 251,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+
+\unprotect
+
+\def\ffligature {ff}
+\def\filigature {fi}
+\def\flligature {fl}
+\def\ffiligature {ffi}
+\def\fflligature {ffl}
+\def\ftligature {ft}
+\def\stligature {st}
+
+\startunicodevector 251
+ \expandafter\strippedcsname
+ \ifcase\numexpr#1\relax
+ \ffligature \or % LATIN SMALL LIGATURE FF
+ \filigature \or % LATIN SMALL LIGATURE FI
+ \flligature \or % LATIN SMALL LIGATURE FL
+ \ffiligature \or % LATIN SMALL LIGATURE FFI
+ \fflligature \or % LATIN SMALL LIGATURE FFL
+ \ftligature \or % LATIN SMALL LIGATURE FT
+ \stligature \else % LATIN SMALL LIGATURE ST
+ \unknownchar
+ \fi
+\stopunicodevector
+
+\protect \endinput
diff --git a/tex/context/base/unic-cjk.mkii b/tex/context/base/unic-cjk.mkii
new file mode 100644
index 000000000..786546318
--- /dev/null
+++ b/tex/context/base/unic-cjk.mkii
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=unic-cjk,
+%D version=2005.12.14,
+%D title=\CONTEXT\ \UNICODE\ Macros,
+%D subtitle=CJK Vectors,
+%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.
+
+\dostepwiserecurse {40}{159}{1}{\expanded{\defineunicodecommand{\recurselevel}} {\lookaheaduchar}}
+\dostepwiserecurse{172}{215}{1}{\expanded{\defineunicodecommand{\recurselevel}} {\lookaheaduchar}}
+\dostepwiserecurse{249}{250}{1}{\expanded{\defineunicodecommand{\recurselevel}} {\lookaheaduchar}}
+
+% special chars
+
+\dostepwiserecurse{255}{255}{1}{\expanded{\defineunicodecommand{\recurselevel}} {\lookaheaduchar}}
+
+\endinput
diff --git a/tex/context/base/unic-exp.mkii b/tex/context/base/unic-exp.mkii
new file mode 100644
index 000000000..027aedab8
--- /dev/null
+++ b/tex/context/base/unic-exp.mkii
@@ -0,0 +1,82 @@
+%D \module
+%D [ file=unic-exp,
+%D version=2002.12.05,
+%D title=\CONTEXT\ \UNICODE\ Support,
+%D subtitle=Expansion,
+%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 Unicode Support / Expansion)}
+
+%D \macros
+%D {expandunivector}
+%D
+%D The \type {\expandunivector} macro can be used to expand
+%D vectors, which leads to a faster run in case of documents
+%D with lots of \UTF-8 code.
+
+\unprotect
+
+\def\expandunivector[#1]%
+ {\processcommalist[#1]\doexpandunivector}
+
+\def\doexpandunivector#1%
+ {\ifcsname\@@univector#1\endcsname
+ \ifcsname\@@univector\@@univector#1\endcsname\else
+ \writestatus{unicode}{expanding vector #1}%
+ \setvalue{\@@univector\@@univector#1}{\expandedunivector{#1}}%
+ \dorecurse{255}
+ {\@EA\ifx\csname\csname\@@univector#1\endcsname\recurselevel\endcsname\unknownchar
+ % skip
+ \else
+ \@EA\let\csname\@@univector\@@univector#1:\recurselevel\@EA\endcsname
+ \csname\csname\@@univector#1\endcsname\recurselevel\endcsname
+ \fi}%
+ \letbeundefined{\@@univector#1}%
+ \fi
+ \fi}
+
+\def\expandedunivector#1#2%
+ {\ifcsname\@@univector\@@univector#1:\number#2\endcsname
+ \@@univector\@@univector#1:\number#2%
+ \else
+ \@@unknownchar
+ \fi}
+
+%D For this purpose, we need to redefine the resolver.
+
+\def\doutfunihash#1#2%
+ {\csname \@@univector
+ \ifcsname\@@univector\@@univector#1\endcsname \@@univector#1\else
+ \ifcsname\@@univector #1\endcsname #1\else
+ \s!unknown\fi\fi
+ \endcsname{\utfmod{#2}}}
+
+\setvalue{\@@univector\s!unknown}#1%
+ {\@@unknownchar}
+
+\def\doutfunihashglyph#1#2#3% div mod raw
+ {\csname utf!\ifnum#3<\utf@i1\else
+ \ifcsname\@@unicommand#1\endcsname2\else
+ \ifcsname\@@univector\@@univector#1\endcsname3\else
+ \ifcsname\@@univector #1\endcsname4\else
+ 5\fi\fi\fi\fi !\endcsname{#1}{#2}}
+
+\setvalue{utf!1!}#1{\unicodeasciicharacter} % {#2}
+\setvalue{utf!2!}#1{\csname\@@unicommand#1\endcsname} % {#2}
+\setvalue{utf!3!}#1#2{\csname\csname\@@univector\@@univector#1\endcsname{#2}\endcsname} % watch the nested csname; it's a speed up
+\setvalue{utf!4!}#1#2{\csname\csname\@@univector#1\endcsname{#2}\endcsname} % watch the nested csname; it's a speed up
+\setvalue{utf!5!}#1#2{\unicodeunknowncharacter}
+
+% \let\utfunihash\utfunihashglyph
+
+%D Let's use it:
+
+\expandunivector[0,1,2,3,4,5,30,31,32,33,34,37,39]
+
+\protect \endinput
diff --git a/tex/context/base/unic-ini.mkii b/tex/context/base/unic-ini.mkii
new file mode 100644
index 000000000..f386494f2
--- /dev/null
+++ b/tex/context/base/unic-ini.mkii
@@ -0,0 +1,777 @@
+%D \module
+%D [ file=unic-ini,
+%D version=2002.12.03,
+%D title=\CONTEXT\ \UNICODE\ Support,
+%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 Unicode Support / Initialization}
+
+%D Sorry, we only support his in \ETEX.
+
+\unprotect
+
+% ÀÁÂÃÄÅàáâãäå
+% ÆÇæç
+% ÈÉÊËèéêë
+% ÌÍÎÏÞìíîïþ
+% Ðð
+% Ññ
+% ÒÓÔÕÖòóôõö
+% Øø
+% ÙÚÛÜùúû
+% Ýýÿ
+% ß
+
+%D This module deals with unicode, and in particular with
+%D \UTF-8 conversion. The prelude to this module was \type
+%D {xtag-utf}, which is now replaced by a one||liner. The
+%D macros below deal with conversions. Thanks to Taco for
+%D providing the following conversion rules.
+%D
+%D \starttabulate[|c|c|c|c|c|]
+%D \NC $b_1$ \NC $b_2$ \NC $b_3$ \NC $b_4$ \NC unicode \NC \NR
+%D \NC192---223\NC128---191\NC \NC \NC 0x80---0x7FF \NC \NR
+%D \NC224---239\NC128---191\NC128---191\NC \NC 0x800---0xFFFF \NC \NR
+%D \NC240---247\NC128---191\NC128---191\NC128---191\NC0x10000---0x1FFFF\NC \NR
+%D \stoptabulate
+%D
+%D In \UTF-8 the characters in the range 128---191 are illegal
+%D as first characters. The characters 254 and 255 are
+%D completely illegal and should not appear at all (they are
+%D related to UTF-16).
+%D
+%D The unicode number for an \UTF-8 sequence can be calculated
+%D as follows:
+%D
+%D \starttabulate[|mc|m|mc|m|mc|m|mc|m|]
+%D \NC b_1 \NC \NC \NC \NC \NC \NC \NC if b_1<=127\NC \NR
+%D \NC 64(b_1-192)\NC+\NC (b_2-128)\NC \NC \NC \NC \NC if 192<=b1<=223\NC \NR
+%D \NC 4096(b_1-224)\NC+\NC 64(b_2-128)\NC+\NC (b_3-128)\NC \NC \NC if 224<=b1<=239\NC \NR
+%D \NC262144(b_1-240)\NC+\NC4096(b_2-128)\NC+\NC64(b_3-128)\NC+\NC(b_4-128)\NC if 240<=b1<=247\NC \NR
+%D \stoptabulate
+%D
+%D A lot of information about unicode can be found on the
+%D web (search for Markus Kuhn and unicode and you'll
+%D probably end up at the right place).
+
+%D In \ETEX\ vocabulary such a conversion looks as follows.
+%D We need the \type {`} in order to turn a character into a
+%D number.
+%D
+%D \starttyping
+%D \def\utftwounicode#1#2%
+%D {\number\numexpr (64*(\numexpr (#1-192))+%
+%D (\numexpr(`#2-128)))}
+%D
+%D \def\utfthreeunicode#1#2#3%
+%D {\number\numexpr (4096*(\numexpr (#1-224))+
+%D 64*(\numexpr(`#2-128))+%
+%D (\numexpr(`#3-128)))}
+%D
+%D \def\utffourunicode#1#2#3#4%
+%D {\number\numexpr(262144*(\numexpr (#1-240))+
+%D 4096*(\numexpr(`#1-128))+
+%D 64*(\numexpr(`#2-128))+%
+%D (\numexpr(`#3-128)))}
+%D \stoptyping
+%D
+%D When we map the unicode number on one of the 256 char wide
+%D unicode tables, we need to do a bit of div and mod. Watch
+%D out: an \ETEX\ \type {/} is not the same as \TEX's \type
+%D {\divide}. The former rounds, while the later truncates, so
+%D we need to trucate ourselves. In case you wonder why we
+%D use \type {\numexpr}: this is not only more convenient, but
+%D also makes it possible to avoid scratch counters, so that we
+%D get fast and fully expandable conversions.
+%D
+%D \starttyping
+%D \def\utfdiv#1{\number\numexpr((#1-128)/256)}
+%D \def\utfmod#1{\number\numexpr((#1)-(256*(\utfdiv{#1})))}
+%D \stoptyping
+%D
+%D So far for the readable alternatives. When using \type
+%D {\numexpr} you should be aware of rather unexpected look
+%D ahead effects. The next implementation uses registers,
+%D which saves tokens and is faster. In this case we gain
+%D some 10\% time.
+
+\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
+
+%D The definitions now become:
+%D
+%D \starttyping
+%D \def\utftwounicode#1#2%
+%D {\number\numexpr(\utf@a*(\numexpr (#1-\utf@d))+%
+%D (\numexpr(`#2-\utf@g)))}
+%D
+%D \def\utfthreeunicode#1#2#3%
+%D {\number\numexpr(\utf@b*(\numexpr (#1-\utf@e))+
+%D \utf@a*(\numexpr(`#2-\utf@g))+%
+%D (\numexpr(`#3-\utf@g)))}
+%D
+%D \def\utffourunicode#1#2#3#4%
+%D {\number\numexpr(\utf@c*(\numexpr (#1-\utf@f))+
+%D \utf@b*(\numexpr(`#2-\utf@g))+
+%D \utf@a*(\numexpr(`#3-\utf@g))+%
+%D (\numexpr(`#4-\utf@g)))}
+%D \stoptyping
+%D
+%D And:
+%D
+%D \starttyping
+%D \def\utfdiv#1{\number\numexpr((#1-\utf@g)/\utf@h)}
+%D \def\utfmod#1{\number\numexpr((#1)-(\utf@h*(\utfdiv{#1})))}
+%D \stoptyping
+%D
+%D Depending on the usage, you can rely on parenthesis only:
+%D
+%D \starttyping
+%D \def\utftwounicode#1#2%
+%D {\numexpr(\utf@a*(#1-\utf@d)+%
+%D `#2-\utf@g)}
+%D
+%D \def\utfthreeunicode#1#2#3%
+%D {\numexpr(\utf@b*(#1-\utf@e)+%
+%D \utf@a*(`#2-\utf@g)+%
+%D `#3-\utf@g)}
+%D
+%D \def\utffourunicode#1#2#3#4%
+%D {\numexpr(\utf@c*(#1-\utf@f)+%
+%D \utf@b*(`#2-\utf@g)+%
+%D \utf@a*(`#3-\utf@g)+%
+%D `#4-\utf@g)}
+%D \stoptyping
+
+% beware, unless surrounded by \numexpr .. \relax, a division
+% results in a float until the final result is calculated
+
+\def\utfdiv#1{\the\numexpr (#1-\utf@g)/\utf@h \relax}
+\def\utfmod#1{\the\numexpr#1-\utf@h*((#1-\utf@g)/\utf@h)\relax}
+
+%D The next one also handles the zero case well: (not really utf specific btw)
+
+\def\utfdiv#1{\the\numexpr\ifcase\numexpr#1\relax0\else (#1-\utf@g)/\utf@h \fi\relax}
+\def\utfmod#1{\the\numexpr\ifcase\numexpr#1\relax0\else#1-\utf@h*((#1-\utf@g)/\utf@h)\fi\relax}
+
+% or
+%
+% \def\utfdiv#1{\ifcase\numexpr#1\relax0\else\the\numexpr(#1-\utf@g)/\utf@h\relax\fi}
+% \def\utfmod#1{\ifcase\numexpr#1\relax0\else\the\numexpr#1-\utf@h*((#1-\utf@g)/\utf@h)\relax\fi}
+
+%D When tracing we also need:
+
+\def\utfvid#1{\the\numexpr(#1-\medcard)/\maxcard\relax}
+
+%D Using the three conversion macros, we can now implement
+%D a few handlers. They all call the general \type
+%D {\unicodechar} conversion macro.
+%D
+%D \starttyping
+%D \def\utftwouniglph#1#2%
+%D {\unicodechar{\utftwounicode {#1}{#2}}}
+%D
+%D \def\utfthreeuniglph#1#2#3%
+%D {\unicodechar{\utfthreeunicode{#1}{#2}{#3}}}
+%D
+%D \def\utffouruniglph#1#2#3#4%
+%D {\unicodechar{\utffourunicode {#1}{#2}{#3}{#4}}}
+%D \stoptyping
+%D
+%D Because the unicode number is used a few times per
+%D conversion, we can expand it once (\type {\the} and \type
+%D {\number} make sure of this). This saves us another 10\%.
+%D
+%D \starttyping
+%D \def\utftwouniglph#1#2%
+%D {\@EA\unicodechar\@EA{\the\utftwounicode{#1}{#2}}}
+%D
+%D \def\utfthreeuniglph#1#2#3%
+%D {\@EA\unicodechar\@EA{\the\utfthreeunicode{#1}{#2}{#3}}}
+%D
+%D \def\utffouruniglph#1#2#3#4%
+%D {\@EA\unicodechar\@EA{\the\utffourunicode{#1}{#2}{#3}{#4}}}
+%D \stoptyping
+%D
+%D We can rewrite these macros to faster alternatives: the
+%D less arguments we pass, the faster the conversion will be,
+%D but at the price of readability. So we have:
+%D
+%D \starttyping
+%D \def\utftwouniglph#1#2%
+%D {\@EA\unicodechar\@EA{\the\numexpr(\utf@a*(#1-\utf@d)+%
+%D `#2-\utf@g)}}
+%D
+%D \def\utfthreeuniglph#1#2#3%
+%D {\@EA\unicodechar\@EA{\the\numexpr(\utf@b*(#1-\utf@e)+%
+%D \utf@a*(`#2-\utf@g)+`#3-\utf@g)}}
+%D
+%D \def\utffouruniglph#1#2#3#4%
+%D {\@EA\unicodechar\@EA{\the\numexpr(\utf@c*(#1-\utf@f)+%
+%D \utf@b*(`#2-\utf@g)+\utf@a*(`#3-\utf@g)+`#4-\utf@g)}}
+%D \stoptyping
+%D
+%D Less parsing, and therefore faster:
+
+% beware, this may change: #1 rawchar (=> `#1 and such, saves tokens)
+
+\def\utftwouniglph#1#2%
+ {\@EA\unicodechar\@EA{\the\numexpr\utf@a*(#1-\utf@d)+`#2-\utf@g\relax}}
+
+\def\utfthreeuniglph#1#2#3%
+ {\@EA\unicodechar\@EA{\the\numexpr\utf@b*(#1-\utf@e)+\utf@a*(`#2-\utf@g)+`#3-\utf@g\relax}}
+
+\def\utffouruniglph#1#2#3#4%
+ {\@EA\unicodechar\@EA{\the\numexpr\utf@c*(#1-\utf@f)+\utf@b*(`#2-\utf@g)+\utf@a*(`#3-\utf@g)+`#4-\utf@g\relax}}
+
+% \def\keeputfcharacters
+% {\def\utftwouniglph ##1##2{\rawcharacter{##1}\string##2}%
+% \def\utfthreeuniglph ##1##2##3{\rawcharacter{##1}\string##2\string##3}%
+% \def\utffouruniglph ##1##2##3##4{\rawcharacter{##1}\string##2\string##3\string##4}}
+
+\def\keeputfcharacters
+ {\let\utftwouniglph \rawcharacter
+ \let\utfthreeuniglph\rawcharacter
+ \let\utffouruniglph \rawcharacter}
+
+\appendtoks \keeputfcharacters \to \everywritestring
+
+% \bgroup
+% \keeputfcharacters
+% \expanded{\index{\XMLflush{whatever}}}
+% \egroup
+
+%D Now we come to the unicode handler itself. We will use a few
+%D constants, which saves us (at least at the time of writing
+%D and testing these macros) another 10\%.
+
+\def\@@univector {univ}
+\def\@@unicommand {unic}
+\def\@@unknownchar{unknownchar}
+
+%D Now comes the nice part: turning codes into glyphs. The
+%D actual conversion does not take place here, but is done by
+%D macros in \type{unic-nnn} files. There we map a range onto
+%D named glyphs, so that they fit well into the rest of
+%D \CONTEXT.
+
+%D \macros
+%D {utfunicodetracer}
+%D
+%D By default, the converter produces a character representation,
+%D but for tracing purposes, you can set a trace option.
+
+\chardef\utfunicodetracer=0
+
+%D \def\TraceUnic#1%
+%D {\chardef\utfunicodetracer#1\relax\enableregime[utf]Ű}
+%D
+%D \starttabulate[|c|c|c|c|c|c|]
+%D \NC option \NC number\NC mapping\NC glyph\NC string\NC example \NC \NR
+%D \NC 0 \NC \NC \NC \star\NC \NC \TraceUnic0\NC \NR
+%D \NC 1 \NC \star \NC \NC \NC \NC \TraceUnic1\NC \NR
+%D \NC 2 \NC \NC \star \NC \NC \NC \TraceUnic2\NC \NR
+%D \NC 3 \NC \star \NC \star \NC \NC \NC \TraceUnic3\NC \NR
+%D \NC 4 \NC \star \NC \NC \star\NC \NC \TraceUnic4\NC \NR
+%D \NC 5 \NC \NC \star \NC \star\NC \NC \TraceUnic5\NC \NR
+%D \NC 6 \NC \star \NC \star \NC \star\NC \NC \TraceUnic6\NC \NR
+%D \NC 7 \NC \NC \NC \NC \star \NC \TraceUnic7\NC \NR
+%D \NC 8 \NC \star \NC \NC \NC \NC \TraceUnic8\NC \NR
+%D \NC otherwise\NC \NC \NC \star\NC \NC \TraceUnic9\NC \NR
+%D \stoptabulate
+
+%D \macros
+%D {unicodechar}
+%D
+%D Next we implement the character handler:
+
+\def\unicodechar
+ {\ifcase\utfunicodetracer
+ \expandafter\utfunihash \or
+ \expandafter\utfunichar \or
+ \expandafter\utfunisplit \or
+ \expandafter\utfuniboth \or
+ \expandafter\utfunihashchar \or
+ \expandafter\utfunihashsplit \or
+ \expandafter\utfunihashboth \or
+ \expandafter\utfuniglyphname \or
+ \expandafter\utfunientity \else
+ \expandafter\utfunihash
+ \fi}
+
+%D \startbuffer
+%D \enableregime[utf] \dostepwiserecurse{0}{8}{1}
+%D {\recurselevel:
+%D \chardef\utfunicodetracer=\recurselevel aap‒noot coördinatie – één
+%D \crlf}
+%D \stopbuffer
+%D
+%D \typebuffer \start \getbuffer \stop
+
+%D \macros
+%D {unicodehexnumber}
+%D
+%D A few auxiliary macros, producing the range||char pair:
+
+\def\unicodepair#1%
+ {\utfdiv{#1}:\utfmod{#1}}
+
+\def\unicodenumber#1{\number#1}
+
+\def\unicodehexnumber#1%
+ {\ifnum#1>\maxcard
+ \expanded{\uchexnumbers{\utfvid{#1}}}%
+ \expanded{\uchexnumbers{\utfdiv{\utfdiv{#1}}}}%
+ \else
+ 00%
+ \expanded{\uchexnumbers{\utfdiv{#1}}}%
+ \fi
+ \expanded{\uchexnumbers{\utfmod{#1}}}}
+
+%D The following macros visualize the unicode character. The
+%D \type {\relax} in front of the \type {-} prevents lookahead
+%D problems; somehow \type {\numexpr} cannot look beyond this
+%D sign, and expects a number.
+
+\ifx\tttf\undefined \let\tttf\relax \fi
+
+\def\utfunichar #1{{\tttf U\low{\tx\unicodenumber{#1}}}}
+\def\utfunisplit #1{{\tttf U\low{\tx\unicodepair{#1}}}}
+\def\utfuniboth #1{{\tttf U\low{\tx\unicodenumber{#1}->\unicodepair{#1}}}}
+\def\utfunientity #1{{\tttf\&\#x\unicodehexnumber{#1};}}
+
+%D The character itself is accessed and typeset by:
+%D
+%D \starttyping
+%D \def\utfunihash#1%
+%D {\executeifdefined{\@@univector\utfdiv{#1}}%
+%D \gobbleoneargument{\utfmod{#1}}}
+%D \stoptyping
+%D
+%D Again, we can provide a faster alternative, because inside
+%D the conditional executer, the argument is expanded twice,
+%D and therefore the calculation done once more than needed.
+%D So, we make sure that the argument is expansion on
+%D forehand. Just to remind you: \type {#1} is the \UNICODE\
+%D number.
+%D
+%D \starttyping
+%D \def\utfunihash#1%
+%D {\@EA\executeifdefined\@EA{\@EA\@@univector\number\utfdiv{#1}}%
+%D {\unknownchar\gobbleoneargument}{\utfmod{#1}}}
+%D \stoptyping
+%D
+%D In order to save calculation time, I decided to change
+%D this definition into:
+
+%D \starttyping
+%D \def\utfunihash#1%
+%D {\@EA\doutfunihash\@EA{\number\utfdiv{#1}}{#1}}
+%D
+%D \def\doutfunihash#1#2%
+%D {\ifcsname\@@univector\number#1\endcsname
+%D \csname\csname\@@univector#1\endcsname{\utfmod{#2}}\endcsname
+%D \else
+%D \unknownchar
+%D \fi}
+%D \stoptyping
+%D
+%D Or leaner and meaner:
+%D
+%D \starttyping
+%D \def\doutfunihash#1#2%
+%D {\csname
+%D \ifcsname\@@univector\number#1\endcsname
+%D \csname\@@univector#1\endcsname{\utfmod{#2}}%
+%D \else
+%D \@@unknownchar
+%D \fi
+%D \endcsname}
+%D \stoptyping
+%D
+%D And finaly it became:
+
+\def\doutfunihash#1#2%
+ {\ifcsname\@@univector\number#1\endcsname
+ \csname\@@univector#1\endcsname{\utfmod{#2}}%
+ \else
+ \@@unknownchar
+ \fi}
+
+\def\utfunihashglyph#1%
+ {\csname\@EA\doutfunihash\@EA{\number\utfdiv{#1}}{#1}\endcsname}
+
+\def\utfunihashcommand
+ {\@EAEAEA\string\utfunihashglyph}
+
+%D For practical purposes, we handle the normal \ASCII\
+%D characters here:
+
+\def\utfunihashglyph#1%
+ {\csname
+ \ifnum#1<\utf@i
+ \strippedcsname\unicodeasciicharacter\endcsname{#1}%
+ \else
+ \@EA\doutfunihash\@EA{\number\utfdiv{#1}}{#1}\endcsname
+ \fi}
+
+%D Well, we also want a plug-in mechanism, so we en dup with
+%D a messy:
+
+\def\utfunihashglyph#1%
+ {\@EA\doutfunihashglyph\@EA{\number\numexpr\utfdiv{#1}\@EA\relax\@EA}\@EA{\number\utfmod{#1}}{#1}}
+
+% \def\doutfunihashglyph#1#2#3% div mod raw
+% {\csname
+% \ifnum#3<\utf@i
+% \strippedcsname\unicodeasciicharacter\endcsname{#2}%
+% \else\ifcsname\@@unicommand#1\endcsname
+% \@@unicommand#1\endcsname{#2}%
+% \else\ifcsname\@@univector#1\endcsname
+% \csname\@@univector#1\endcsname{#2}\endcsname % watch the nested csname; it's a speed up
+% \else
+% \strippedcsname\unicodeunknowncharacter\endcsname{#2}%
+% \fi\fi\fi}
+%
+% \def\unicodeunknowncharacter#1%
+% {\unknownchar}
+%
+% The next one permits lookahead
+
+\def\doutfunihashglyph#1#2#3% div mod raw
+ {\csname utf!\ifnum#3<\utf@i 1\else
+ \ifcsname\@@unicommand#1\endcsname2\else
+ \ifcsname\@@univector #1\endcsname3\else
+ 4\fi\fi\fi !\endcsname{#1}{#2}}
+
+\setvalue{utf!1!}#1{\unicodeasciicharacter} % {#2}
+\setvalue{utf!2!}#1{\csname\@@unicommand#1\endcsname} % {#2}
+\setvalue{utf!3!}#1#2{\csname\csname\@@univector#1\endcsname{#2}\endcsname} % watch the nested csname; it's a speed up
+\setvalue{utf!4!}#1#2{\unicodeunknowncharacter}
+
+\def\unicodeunknowncharacter
+ {\unknownchar}
+
+%D With:
+
+\let\unicodeasciicharacter\rawcharacter
+
+%D Commands are defined with:
+
+\def\defineunicodecommand #1 #2% #2{range number}{char number}
+ {\setvalue{\@@unicommand#1}##1{#2{#1}{##1}}}
+
+%D For instance:
+%D
+%D \starttyping
+%D \defineutfcommand 81 {\uchar}
+%D \stoptyping
+
+%D Now we can also say:
+
+\let\utfunihash\utfunihashglyph
+
+%D We also need:
+
+\def\utfuniglyphname#1%
+ {{\tttf
+ \ifnum#1<\utf@i
+ \unicodeasciicharacter{#1}%
+ \else
+ \expandafter\string\csname\doutfunihash{\number\utfdiv{#1}}{#1}\endcsname
+ \fi}}
+
+%D The combined presentation is implemented by:
+
+\def\utfunihashchar #1%
+ {\utfunihash{#1}\low{\infofont\unicodenumber{#1}}}
+
+\def\utfunihashsplit#1%
+ {\utfunihash{#1}\low{\infofont\unicodepair{#1}}}
+
+\def\utfunihashboth #1%
+ {\utfunihash{#1}\low{\infofont\unicodenumber{#1}->\unicodepair{#1}}}
+
+%D Unknown characters get a placeholder.
+
+\unexpanded\def\unknownchar % {} prevents problems with arguments
+ {{\hbox{\vrule\!!width.5em\!!height1ex\!!depth\zeropoint}}}
+
+%D So far for the conversion macros. The optimizations we
+%D did, brought down the runtime some 50\%, which, given that
+%D the majority of characters will be normal \ASCII\
+%D characters, the penalty of conversion is not that large.
+
+%D \macros
+%D {useunicodevector}
+%D
+%D Since we end up with many encodings, it starts making
+%D sense to postpone loading, so let's start doing this
+%D with \UNICODE.
+
+\def\doifunicodevector#1%
+ {\doifdefined{\@@univector#1}}
+
+\def\useunicodevector[#1]%
+ {\processcommalist[#1]\douseunicodevector}
+
+\def\douseunicodevector#1%
+ {\ifundefined{\@@univector#1}%
+ % \readsysfile{\f!unicprefix\threedigits{#1}}
+ \readsysfile{\f!unicprefix\doifnumberelse{#1}{\threedigits{#1}}{#1}.mkii}
+ {\writestatus{unicode}{loading vector #1}}
+ {\writestatus{unicode}{unknown vector #1}}%
+ \fi}
+
+%D \macros
+%D {startunicodevector}
+%D
+%D A vector roughly looks as follows. By putting the text
+%D inside the name constructor, we prevent problems with
+%D partial expansion in macros and special cases.
+%D
+%D \starttyping
+%D \startunicodevector 0
+%D \ifcase\numexpr(#1-159)\or
+%D \@@unknownchar\or % NO-BREAK SPACE
+%D exclamdown\or
+%D textcent\or
+%D ....\else
+%D \@@unknowncharacter
+%D \fi
+%D \stopunicodevector
+%D \stoptyping
+%D
+%D In vector \type {unix-000} you will find another
+%D optimizations. By using as less tokens as possible, we limit
+%D the time skipping branches in the test, and save upto 20\%
+%D runtime.
+
+\def\startunicodevector #1 #2\stopunicodevector
+ {\setgvalue{\@@univector#1}##1{#2}}
+
+%D We define (as a practical example) the utf signal FEFF:
+
+\ifx\zwnbsp\undefined
+ \let\zwnbsp\relax % zerowidthnonbreakablespace
+\fi
+
+\startunicodevector 254
+ \expandafter\strippedcsname\ifnum#1<255 \unknownchar\else\zwnbsp\fi
+\stopunicodevector
+
+%D Here we provide another auxiliary macro:
+%D
+%D \startbuffer
+%D \unicodeinfoline{196}{Ä}{LATIN CAPITAL LETTER A WITH DIAERESIS}
+%D \unicodeinfoline{197}{Å}{LATIN CAPITAL LETTER A WITH RING ABOVE}
+%D \unicodeinfoline{198}{Æ}{LATIN CAPITAL LETTER AE}
+%D \unicodeinfoline{199}{Ç}{LATIN CAPITAL LETTER C WITH CEDILLA}
+%D \unicodeinfoline{200}{È}{LATIN CAPITAL LETTER E WITH GRAVE}
+%D \unicodeinfoline{201}{É}{LATIN CAPITAL LETTER E WITH ACUTE}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \start \enableregime[utf]\getbuffer \stop
+
+\def\unicodeinfoline#1#2#3%
+ {\ifnum#1>\utf@g % 128
+ \noindent \hbox
+ {\hbox to 4em{\tttf\unicodehexnumber{#1}\hss}\quad
+ \hbox to 1em{#2\hss}\quad
+ \hbox to 9em{\tttf\unicodenumber{#1}->\unicodepair{#1}\hss}\quad
+ \hbox to 9em{\tttf\let\utfunihash\utfunihashcommand#2\hss}\quad % tricky
+ \lowercase {\tttf#3}}\par
+ \fi}
+
+%D The next code permits utf code in hyperlinks:
+
+\def\cleanunicodechar#1{.#1.}
+
+\appendtoks \let\unicodechar\cleanunicodechar \to \everycleanupfeatures
+
+%D We will now hook this mechanism in the existing font
+%D handler. More documentation will follow. Probably, some
+%D features in \type {font-uni.tex} will be generalized
+%D and moved here.
+
+\def\unidiv{0} \def\unimod{0}
+
+\chardef\utfunihashmode=0 % 0=hash glyph / 1=font glyph
+
+\def\utfunifontglyph#1%
+ {\xdef\unidiv{\number\utfdiv{#1}}%
+ \xdef\unimod{\number\utfmod{#1}}%
+ \ifnum#1<\utf@i
+ \char\unimod % \unicodeascii\unimod
+ \else\ifcsname\@@univector\unidiv\endcsname
+ \csname\doutfunihash{\unidiv}{#1}\endcsname
+ \else % so, these can be different fonts !
+ \unicodeglyph\unidiv\unimod % no \uchar (yet)
+ \fi\fi}
+
+\chardef\utfunicommandmode=0 % 1 = hex
+
+\def\unicodecommandchar#1#2%
+ {\string\char
+ \ifcase\utfunicommandmode
+ #1:#2\else\lchexnumbers#1:\lchexnumbers#2%
+ \fi}
+
+\def\utfunifontcommand#1%
+ {\xdef\unidiv{\number\utfdiv{#1}}%
+ \xdef\unimod{\number\utfmod{#1}}%
+ \ifnum#1<\utf@i
+ \unicodecommandchar\unidiv\unimod
+ \else\ifcsname\@@univector\unidiv\endcsname
+ \@EA\string\csname\doutfunihash{\unidiv}{#1}\endcsname
+ \else
+ \unicodecommandchar\unidiv\unimod
+ \fi\fi}
+
+\def\utfunihash
+ {\ifcase\utfunihashmode
+ \@EA\utfunihashglyph
+ \else
+ \@EA\utfunifontglyph
+ \fi}
+
+\def\utfunihushcommand
+ {\@EAEAEA\string\utfunihashglyph}
+
+\def\utfunihashcommand
+ {\ifcase\utfunihashmode
+ \@EA\utfunihushcommand
+ \else
+ \@EA\utfunifontcommand
+ \fi}
+
+%D We can convert from a number to some UTF code with the folowing
+%D conversion macro.
+
+% The first, na\"ive version:
+%
+% \def\numbertoutf#1%
+% {\ifnum#1<128
+% \rawcharacter{#1}%
+% \else\ifnum#1<2048
+% \rawcharacter{\the\numexpr192+#1/64\relax}%
+% \rawcharacter{\the\numexpr128+#1-(#1/64)*64\relax}%
+% \else % 3 bytes
+% \rawcharacter{\the\numexpr224+#1/4096\relax}%
+% \rawcharacter{\the\numexpr128+(#1-(#1/4096)*4096)/128\relax}%
+% \rawcharacter{\the\numexpr128+(#1-(#1/4096)*4096)+(#1-(#1/4096)*4096)/128\relax}%
+% \fi\fi}
+
+% 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<\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}
+
+\def\numbertohexstring#1{0x\uchexnumbers{\utfdiv{#1}}\uchexnumbers{\utfmod{#1}}}
+
+\ifnum\texengine=\xetexengine
+ \let\numbertoutf\numbertohexstring
+\fi
+
+\def\uchartoutf#1#2%
+ {\expandafter\numbertoutf\expandafter{\the\numexpr#1*\utf@h+#2\relax}}
+
+%D Here is a mapping trick. By mapping the tex specific characters to
+%D private ones, we can prevent problems with utility files.
+
+\defineunicodecommand{240} {\doprivateunicodechar}
+
+\def\doprivateunicodechar#1#2{\char#2\relax}
+
+\def\registerprivateunicodechar#1 {\letvalue{puc::\number#1}\relax}
+
+\registerprivateunicodechar `\%
+\registerprivateunicodechar `\$
+\registerprivateunicodechar `\{
+\registerprivateunicodechar `\}
+\registerprivateunicodechar `\~
+\registerprivateunicodechar `\_
+\registerprivateunicodechar `\^
+\registerprivateunicodechar `\#
+
+\def\numbertoutp#1{\numbertoutf{\the\numexpr#1\ifcsname puc::\number#1\endcsname+"F000\fi\relax}}
+
+%D In the \XML\ expander we will do:
+%D
+%D \starttyping
+%D \def\getXMLhexcharacter##1{\numbertoutp{"##1}}%
+%D \def\getXMLdeccharacter##1{\numbertoutp {##1}}%
+%D \stoptyping
+
+%D Goodies:
+
+\fetchruntimecommand \showunicodevector {\f!unicprefix\s!run.mkii}
+\fetchruntimecommand \showunicodetable {\f!unicprefix\s!run.mkii}
+
+%D Well, let's at least preload a few familiar ones. Here we
+%D also load the \UTF\ regime.
+
+\useunicodevector[0,1,2,3,4,5,30,31,32,33,34,35,37,39,251]
+\useunicodevector[cjk]
+
+\useregime[utf]
+
+% 31, text mem usage first
+
+\protect \endinput
diff --git a/tex/context/base/unic-ini.mkiv b/tex/context/base/unic-ini.mkiv
new file mode 100644
index 000000000..51c300e4c
--- /dev/null
+++ b/tex/context/base/unic-ini.mkiv
@@ -0,0 +1,29 @@
+%D \module
+%D [ file=unic-ini,
+%D version=2002.12.03,
+%D title=\CONTEXT\ \UNICODE\ Support,
+%D subtitle=\UNICODE\ \& UTF-8 support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Unicode Support / Initialization}
+
+\unprotect
+
+\let \keeputfcharacters\relax % used in xtag
+\chardef\utfunicodetracer \zerocount % used in xtag
+
+\def\unicodechar #1{\char\numexpr#1\relax} % no lookahead
+\def\unicodenumber #1{\the \numexpr#1\relax} % no lookahead
+\def\unicodehexnumber#1{\ctxlua{tex.sprint(number.toevenhex(\number#1))}}
+
+\unexpanded\def\unknownchar{{\hbox{\vrule\!!width.5em\!!height1ex\!!depth\zeropoint}}}
+
+\ifx\zwnbsp\undefined \let\zwnbsp\relax \fi % zerowidthnonbreakablespace
+
+\protect \endinput
diff --git a/tex/context/base/unic-run.mkii b/tex/context/base/unic-run.mkii
new file mode 100644
index 000000000..b8e154fd4
--- /dev/null
+++ b/tex/context/base/unic-run.mkii
@@ -0,0 +1,130 @@
+%D \module
+%D [ file=unic-run,
+%D version=2005.06.22,
+%D title=\CONTEXT\ \UNICODE\ Support,
+%D subtitle=Goodies,
+%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
+
+%D \macros
+%D {showunicodevector}
+%D
+%D Original version by Nikolai Weibull. Adapted a bit (no local count
+%D definitions, stepwiserecurse instead of -1 calculations, a bit less
+%D code and such). BTW, this is kind of tricky and somehow we don't
+%D have align interference.
+
+\gdef\doshowunicodevectorrow#1#2%
+ {\NC
+ \ttx\uchexnumber{#2}%
+ \VL
+ \dostepwiserecurse{0}{15}{1}{\unicodechar{\numexpr#1*256+#2+\recurselevel*16\relax}\VL}%
+ \AR}
+
+\gdef\showunicodevector[#1]%
+ {\starttable[|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|]
+ \NC\NC\dostepwiserecurse{0}{15}{1}{\ttx\uchexnumber\recurselevel\NC}\AR
+ \DC\DL[16]\DR
+ \dostepwiserecurse{0}{15}{1}
+ {\expanded{\doshowunicodevectorrow{#1}{\recurselevel}}%
+ \DC\DL[16]\DR}
+ \NC \use{17}{\hfill \ttx unicode table hex:\uchexnumbers{#1} dec:\threedigits{#1}\kern-.25em}\NC \AR
+ \stoptable}
+
+%D \starttyping
+%D \chardef\utfunicodetracer=0
+%D \chardef\utfunicodetracer=7
+%D
+%D \showunicodevector[000]
+%D \showunicodevector[001]
+%D \showunicodevector[002]
+%D \showunicodevector[003]
+%D \showunicodevector[004]
+%D \showunicodevector[005]
+%D \showunicodevector[030]
+%D \showunicodevector[031]
+%D \showunicodevector[032]
+%D \showunicodevector[033]
+%D \showunicodevector[034]
+%D \stoptyping
+
+%D \macros
+%D {showunicodetable}
+%D
+%D A more verbose variant:
+
+\gdef\doshowunicodetablerow#1#2%
+ {\bTR
+ \bTD\uchexnumber{#2}\eTD
+ \dostepwiserecurse{0}{15}{1}
+ {\bTD
+ \edef\entrypoint{\the\numexpr#1*256+#2+##1*16\relax}%
+ \chardef\utfunicodetracer0{\dontleavehmode \strut\unicodechar\entrypoint\endgraf}%
+ \tt
+ \chardef\utfunicodetracer7{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
+ \chardef\utfunicodetracer3{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
+ \chardef\utfunicodetracer8{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
+ \eTD}%
+ \bTD\uchexnumber{#2}\eTD
+ \eTR}
+
+\gdef\showunicodetable[#1]%
+ {\vbox\bgroup
+ \setupcolors[\c!state=\v!start]%
+ \setupTABLE[\c!background=\v!screen,\c!backgroundscreen=.90,\c!frame=\v!off,\c!frameoffset=0pt,\c!width=8em,\c!height=6em]%
+ \setupTABLE[c] [\v!each] [\c!align={middle,lohi}]%
+ \setupTABLE[c] [\v!first][\c!background=\v!screen,\c!backgroundscreen=.85,\c!style=\tt\tfa]%
+ \setupTABLE[c] [\v!last] [\c!background=\v!screen,\c!backgroundscreen=.85,\c!style=\tt\tfa]%
+ \setupTABLE[r] [\v!first][\c!background=\v!screen,\c!backgroundscreen=.85,\c!style=\tt\tfa]%
+ \setupTABLE[r] [\v!last] [\c!background=\v!screen,\c!backgroundscreen=.85,\c!style=\tt\tfa]%
+ \setupTABLE[r] [\v!odd] [\c!background=\v!screen,\c!backgroundscreen=.80]%
+ \setupTABLE[c] [\v!odd] [\c!background=\v!screen,\c!backgroundscreen=.80]%
+ \setupTABLE[\v!odd][\v!odd] [\c!background=\v!screen,\c!backgroundscreen=.90]%
+ \bTABLE
+ \bTR
+ \bTD dec: \numbers{#1}\endgraf hex: \uchexnumbers{#1}\eTD
+ \dostepwiserecurse{0}{15}{1}{\bTD\uchexnumber{##1}\eTD}%
+ \bTD dec: \numbers{#1}\endgraf hex: \uchexnumbers{#1}\eTD
+ \eTR
+ \dostepwiserecurse{0}{15}{1}{\doshowunicodetablerow{#1}{##1}}%
+ \bTR
+ \bTD dec: \numbers{#1}\endgraf hex: \uchexnumbers{#1}\eTD
+ \dostepwiserecurse{0}{15}{1}{\bTD\uchexnumber{##1}\eTD}%
+ \bTD dec: \numbers{#1}\endgraf hex: \uchexnumbers{#1}\eTD
+ \eTR
+ \eTABLE
+ \egroup}
+
+\protect \endinput
+
+% alternative
+%
+% \gdef\doshowunicodevectorrowa#1#2#3#4%
+% {\NC
+% \ttx\uchexnumber{#2}%
+% \VL
+% \dostepwiserecurse{#3}{#4}{1}{\unicodechar{\numexpr#1*256+#2+\recurselevel*16\relax}\VL}%
+% \AR}
+%
+% \gdef\doshowunicodevectorrowb#1#2#3#4%
+% {\NC
+% \relax
+% \VL
+% \dostepwiserecurse{#3}{#4}{1}{\unicodechar{\numexpr#1*256+#2+\recurselevel*16\relax}\VL}%
+% \AR}
+%
+% \gdef\showunicodevector#1%
+% {\starttable[|c|c|c|c|c|c|c|c|c|]
+% \NC\NC\dostepwiserecurse{0}{7}{1}{\ttx\uchexnumber\recurselevel/\uchexnumber{\the\numexpr2*\recurselevel\relax}\NC}\AR\DC\DL[8]\DR
+% \dostepwiserecurse{0}{15}{1}
+% {\expanded{\doshowunicodevectorrowa{#1}{\recurselevel}{0} {7}}\DC\DL[8]\DR%
+% \expanded{\doshowunicodevectorrowb{#1}{\recurselevel}{8}{15}}\DC\DL[8]\DR}%
+% \NC \use{9}{\hfill \ttx unicode table hex:\uchexnumbers{#1} dec:\threedigits{#1}\kern-.25em}\NC \AR
+% \stoptable}
diff --git a/tex/context/base/verb-c.mkii b/tex/context/base/verb-c.mkii
new file mode 100644
index 000000000..1ecb0afc2
--- /dev/null
+++ b/tex/context/base/verb-c.mkii
@@ -0,0 +1,484 @@
+%D \module
+%D [ file=verb-c,
+%D version=2006.04.17,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty C Verbatim,
+%D author=Nikolai Weibull,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Verbatim Macros / Pretty C Verbatim}
+
+% HH:
+%
+% - extra !!pretty definitions moved to verb-ini
+% - added a c!
+% - did a few small cosmetic things
+
+\unprotect
+
+\doglobal\newif\ifinCsingle
+\doglobal\newif\ifinCdouble
+\doglobal\newif\ifinCcomment
+\doglobal\newif\ifinCsinglelinecomment
+\doglobal\newif\ifinCmultilinecomment
+\doglobal\newif\ifcontinueCsinglelinecomment
+
+\gdef\Csetcontrols
+ {\saveprettycontrols
+ \def\obeyedspace
+ {\endCtypesix
+ \oldobeyedspace}%
+ \def\flushrestofverbatimline
+ {\endCtypesix
+ \ifinCsinglelinecomment
+ \ifcontinueCsinglelinecomment
+ \continueCsinglelinecommentfalse
+ \else
+ \tttf
+ \endofpretty
+ \global\inCsinglelinecommentfalse
+ \global\inCcommentfalse
+ \fi
+ \fi}%
+ \def\obeyedline
+ {\oldobeyedline}%
+ \let\obeytabs\ignoretabs}
+
+\gdef\setupprettyCtype
+ {\def\prettyidentifier{C}%
+ \Csetvariables
+ \Csetcontrols
+ \Csethandlers
+ \Csetspecials
+ \Csetdiagnostics}
+
+\gdef\Csetvariables
+ {\global\inCsinglefalse
+ \global\inCdoublefalse
+ \global\inCcommentfalse
+ \global\continueCsinglelinecommentfalse
+ \global\naturaltextexttrue
+ \global\let\Csequence\empty
+ \global\let\Cprefix\empty}
+
+% TODO: should handle -> as well
+
+\gdef\Csetspecials
+ {\setpretty`\{=10 \setpretty`\}=10
+ \setpretty`\$=20 \setpretty`\@=20
+ \setpretty`\[=30 \setpretty`\]=30 \setpretty`\(=30 \setpretty`\)=30
+ \setpretty`\==30 \setpretty`\~=30 \setpretty`\<=30 \setpretty`\>=30
+ \setpretty`\%=30
+ \setpretty`\-=41 \setpretty`\+=41
+ \setpretty`\|=41 \setpretty`\`=41 \setpretty`\!=41 \setpretty`\?=41
+ \setpretty`\^=41 \setpretty`\&=41
+ \setpretty`\/=43 \setpretty`\*=44
+ \setpretty`\#=45
+ \setpretty`\\=50
+ \setpretty`\1=61 \setpretty`\2=61 \setpretty`\3=61 \setpretty`\4=61 \setpretty`\5=61
+ \setpretty`\6=61 \setpretty`\7=61 \setpretty`\8=61 \setpretty`\9=61 \setpretty`\0=61
+ \setpretty`\A=62 \setpretty`\B=62 \setpretty`\C=62 \setpretty`\D=62 \setpretty`\E=62
+ \setpretty`\F=62 \setpretty`\G=62 \setpretty`\H=62 \setpretty`\I=62 \setpretty`\J=62
+ \setpretty`\K=62 \setpretty`\L=62 \setpretty`\M=62 \setpretty`\N=62 \setpretty`\O=62
+ \setpretty`\P=62 \setpretty`\Q=62 \setpretty`\R=62 \setpretty`\S=62 \setpretty`\T=62
+ \setpretty`\U=62 \setpretty`\V=62 \setpretty`\W=62 \setpretty`\X=62 \setpretty`\Y=62
+ \setpretty`\Z=62
+ \setpretty`\a=62 \setpretty`\b=62 \setpretty`\c=62 \setpretty`\d=62 \setpretty`\e=62
+ \setpretty`\f=62 \setpretty`\g=62 \setpretty`\h=62 \setpretty`\i=62 \setpretty`\j=62
+ \setpretty`\k=62 \setpretty`\l=62 \setpretty`\m=62 \setpretty`\n=62 \setpretty`\o=62
+ \setpretty`\p=62 \setpretty`\q=62 \setpretty`\r=62 \setpretty`\s=62 \setpretty`\t=62
+ \setpretty`\u=62 \setpretty`\v=62 \setpretty`\w=62 \setpretty`\x=62 \setpretty`\y=62
+ \setpretty`\z=62
+ \setpretty`\_=62
+ \setpretty`\;=70 \setpretty`\:=70 \setpretty`\,=70 \setpretty`\.=70
+ \setpretty`\'=80
+ \setpretty`\"=90 }
+
+\gdef\Csethandlers
+ {\installprettyhandler 10 \Ctypeone
+ \installprettyhandler 20 \Ctypetwo
+ \installprettyhandler 30 \Ctypethree
+ \installprettyhandler 41 \Ctypefourone
+ \installprettyhandler 43 \Ctypefourthree
+ \installprettyhandler 44 \Ctypefourfour
+ \installprettyhandler 45 \Ctypefourfive
+ \installprettyhandler 50 \Ctypefive
+ \installprettyhandler 61 \Ctypesixone
+ \installprettyhandler 62 \Ctypesixtwo
+ \installprettyhandler 70 \Ctypeseven
+ \installprettyhandler 80 \Ctypeeight
+ \installprettyhandler 90 \Ctypenine}
+
+\gdef\Ctypeone#1%
+ {\ifinCdouble
+ \ifinCcomment
+ \endCtypesix
+ \getpretty{#1}%
+ \else\ifx\Cprefix\empty
+ \endCtypesix
+ \getpretty{#1}%
+ \else
+ \endCtypesix
+ \xdef\Cprefix{\getpretty{#1}}%
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi
+ \else
+ \endCtypesix
+ \ifinCcomment
+ \getpretty{#1}%
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi
+ \fi}
+
+\gdef\Ctypetwo#1%
+ {\endCtypesix
+ \getpretty{#1}}
+
+\gdef\Ctypethree#1%
+ {\endCtypesix
+ \ifinCcomment
+ \getpretty{#1}%
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \else\ifinCdouble
+ \getprettydata{#1}%
+ \ifx\Cprefix\empty
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\Ctypefourone#1%
+ {\endCtypesix
+ \ifinCcomment
+ \getpretty{#1}%
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \else\ifinCdouble
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\doCtypefourtwo#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=62
+ \expandafter\Ctypetwo
+ \else
+ \expandafter\Ctypefourone
+ \fi
+ {#1}#2}
+
+\gdef\Ctypefourtwo
+ {\handlenextnextpretty\doCtypefourtwo\Ctypefourone}
+
+\gdef\Ctypefourthree
+ {\handlenextnextpretty\doCtypefourthree\Ctypefourtwo}
+
+\gdef\doCtypefourthree#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \let\next\dodoCtypefourthree
+ \else\ifnum\prettytype=44
+ \global\inCcommenttrue
+ \global\inCmultilinecommenttrue
+ \let\next\Cstartcomment
+ \else
+ \let\next\Ctypefourtwo
+ \fi\fi
+ \next{#1}#2}
+
+\gdef\Cstartcomment#1#2%
+ {\beginofpretty[\!!prettyfourthree]\ttsl\getpretties{#1}{#2}}
+
+\gdef\dodoCtypefourthree% #1%
+ {\endCtypesix
+ \handlenextnextpretty\dododoCtypefourthree\dodododoCtypefourthree}
+
+\gdef\dododoCtypefourthree
+ {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoCtypefourthree}
+
+\gdef\dodododoCtypefourthree#1#2%
+ {\ifinCcomment
+ \getpretties{#1}{#2}%
+ \else
+ \global\inCcommenttrue
+ \global\inCsinglelinecommenttrue
+ \def\next{\beginofpretty[\!!prettyfourthree]\ttsl\getpretties{#1}{#2}}%
+ \expandafter\next
+ \fi}
+
+\gdef\Ctypefourfour
+ {\handlenextnextpretty\doCtypefourfour\Ctypefourtwo}
+
+\gdef\doCtypefourfour#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=44
+ % \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \ifinCcomment
+ \getpretty{#1}%
+ \else
+ \endCtypesix
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi
+ \expandafter#2%
+ \else\ifnum\prettytype=43
+ \getpretties{#1}{#2}%
+ \tttf
+ \endofpretty
+ \global\inCcommentfalse
+ \global\inCmultilinecommentfalse
+ \else\ifinCcomment
+ \getpretty{#1}%
+ \expandafter#2%
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \expandafter#2%
+ \else\ifinCdouble
+ \getpretty{#1}%
+ \expandafter#2%
+ \else
+ \endCtypesix
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \expandafter#2%
+ \fi\fi\fi\fi\fi}
+
+\gdef\Ctypefourfive#1%
+ {\ifinCcomment
+ \getpretty{#1}%
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \else\ifinCdouble
+ \getpretty{#1}%
+ \else
+ \endCtypesix
+ \global\inCcommenttrue
+ \global\inCsinglelinecommenttrue
+ \def\next{\beginofpretty[\!!prettyfourthree]\ttsl\getpretty{#1}}%
+ \expandafter\next
+ \fi\fi\fi}
+
+\gdef\doCtypefiveA#1#2%
+ {\endCtypesix
+ \ifinCcomment
+ \getpretties{#1}{#2}%
+ \else\ifinCsingle
+ \getprettydata{#2}%
+ \ifnum\prettytype=50
+ \beginofpretty[\!!prettyfive]\getpretties{#1}{#2}\endofpretty\beginofpretty[\!!prettyeight]%
+ \else\ifnum\prettytype=80
+ \beginofpretty[\!!prettyfive]\getpretties{#1}{#2}\endofpretty\beginofpretty[\!!prettyeight]%
+ \else
+ \getpretties{#1}{#2}%
+ \fi\fi
+ \else\ifinCdouble
+ \beginofpretty[\!!prettyfive]\getpretties{#1}{#2}\endofpretty\beginofpretty[\!!prettynine]%
+ \else
+ \beginofpretty[\!!prettyfive]\getpretties{#1}{#2}\endofpretty
+ \fi\fi\fi}
+
+\gdef\doCtypefiveB#1%
+ {\endCtypesix
+ \ifinCcomment
+ \ifcat#1\relax
+ \continueCsinglelinecommenttrue
+ \getpretty{#1}%
+ \else
+ \getpretty{#1}%
+ \fi
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \else\ifinCdouble
+ \beginofpretty[\!!prettyfive]\getpretty{#1}\endofpretty\beginofpretty[\!!prettynine]%
+ \else
+ \beginofpretty[\!!prettyfive]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\Ctypefive
+ {\expandafter\handlenextnextpretty\expandafter\doCtypefiveA\expandafter\doCtypefiveB}
+
+\gdef\endCtypesix
+ {\ifx\Csequence\empty\else
+ \ifinCcomment
+ \Csequence
+ \else\ifinCsingle
+ \Csequence
+ \else\ifinCdouble
+ \Csequence
+ \else\ifx\Cprefix\empty
+ \doendCtypesix\!!prettytwo
+ \else
+ \doendCtypesixtype\!!prettytwo
+ \fi\fi\fi\fi
+ \global\let\Csequence\empty
+ \global\let\Cprefix\empty
+ \fi}
+
+\gdef\doendCtypesix#1%
+ {\doifprettyidentifierelse{\Csequence}{\Ckeywords}
+ {\beginofpretty[#1]%
+ {\prettyidentifierfont\Csequence}%
+ \endofpretty}
+ {\doifprettyidentifierelse{\Csequence}{\Ctypes}
+ {\beginofpretty[\!!prettytwoone]%
+ {\prettyvariablefont\Csequence}%
+ \endofpretty}
+ {\Csequence}}}
+
+\gdef\doendCtypesixtype#1%
+ {\doifprettyidentifierelse{\Cprefix\Csequence}{\Ctypes}
+ {\beginofpretty[#1]%
+ {\prettyvariablefont\Csequence}%
+ \endofpretty}
+ {\Csequence}}
+
+\gdef\Ctypesixone#1%
+ {\ifinCcomment
+ \def\next{\getpretty{#1}}%
+ \else\ifinCsingle
+ \def\next{\getpretty{#1}}%
+ \else\ifinCdouble
+ \def\next{\getpretty{#1}}%
+ \else\ifx\Csequence\empty
+ \def\next{\beginofpretty[\!!prettyeight]\getpretty{#1}\endofpretty}%
+ \else
+ \def\next{\Ctypesixtwo{#1}}%
+ \fi\fi\fi\fi
+ \expandafter\next}
+
+\gdef\Ctypesixtwo#1%
+ {\ifinCcomment
+ \getpretty{#1}%
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \else\ifinCdouble
+ \ifx\Cprefix\empty
+ \getpretty{#1}%
+ \else
+ \xdef\Csequence{\Csequence\getpretty{#1}}%
+ \fi
+ \else
+ \xdef\Csequence{\Csequence\getpretty{#1}}%
+ \fi\fi\fi}
+
+\gdef\Ctypeseven#1%
+ {\endCtypesix
+ \getpretty{#1}}
+
+\gdef\Ctypeeight#1% single quote
+ {\endCtypesix
+ \ifinCcomment
+ \getpretty{#1}%
+ \else\ifinCdouble
+ \getpretty{#1}%
+ \else\ifinCsingle
+ \global\inCsinglefalse
+ \getpretty{#1}%
+ \endofpretty
+ \else
+ \global\inCsingletrue
+ \beginofpretty[\!!prettyeight]\getpretty{#1}
+ \fi\fi\fi}
+
+\gdef\Ctypenine#1% double quote
+ {\endCtypesix
+ \ifinCcomment
+ \getpretty{#1}%
+ \else\ifinCsingle
+ \getpretty{#1}%
+ \else\ifinCdouble
+ \global\inCdoublefalse
+ \getpretty{#1}%
+ \endofpretty
+ \else
+ \global\inCdoubletrue
+ \beginofpretty[\!!prettynine]\getpretty{#1}
+ \fi\fi\fi}
+
+\gdef\doreportprettyCtype#1#2#3#4%
+ {#1%
+ [C \string#2 typing conflict, use \string#3 instead]
+ \writestatus
+ {C typing}
+ {use \string#3 instead of \string#2 to enable propper visualization}%
+ \global#4%
+ \expandafter\doemptyverbatimline
+ \fi}
+
+\gdef\reportprettyCtype
+ {\doreportprettyCtype\ifinCsingle'\'\inCsinglefalse
+ \doreportprettyCtype\ifinCdouble"\"\inCdoublefalse}
+
+\gdef\Csetdiagnostics
+ {\let\normaldoemptyverbatimline\doemptyverbatimline
+ \def\doemptyverbatimline
+ {\normaldoemptyverbatimline
+ \reportprettyCtype}}
+
+\useprettyidentifiers \Ckeywords \Csetspecials
+ break case continue default do else for goto if return sizeof switch while
+
+\useprettyidentifiers \Ctypes \Csetspecials
+ auto char const double enum extern float int long register restrict short
+ signed static struct typedef union unsigned void volatile bool
+
+\installprettytype [C] [C]
+
+\definetyping[C][\c!option=C]
+
+\definecolor [colorprettyone] [black]
+\definecolor [colorprettytwo] [r=.46, g=.38, b=.13]
+\definecolor [colorprettytwoone] [r=.38, g=.18, b=.5]
+\definecolor [colorprettythree] [black]
+\definecolor [colorprettyfour] [black]
+\definecolor [colorprettyfourthree] [r=.15, g=.45, r=.15]
+\definecolor [colorprettyfive] [r=.94, g=.15, b=.15]
+\definecolor [colorprettyeight] [r=.58, g=.09, b=.09]
+\definecolor [colorprettynine] [r=.58, g=.09, b=.09]
+
+\definecolor [grayprettyone] [s=.30]
+\definecolor [grayprettytwo] [s=.45]
+\definecolor [grayprettythree] [s=.60]
+\definecolor [grayprettyfour] [s=.75]
+\definecolor [grayprettyfourthree] [s=.70]
+
+\definepalet
+ [colorpretty]
+ [ prettyone=colorprettyone,
+ prettytwo=colorprettytwo,
+ prettytwoone=colorprettytwoone,
+ prettythree=colorprettythree,
+ prettyfour=colorprettyfour,
+ prettyfourthree=colorprettyfourthree,
+ prettyfive=colorprettyfive,
+ prettyeight=colorprettyeight,
+ prettynine=colorprettynine]
+
+\definepalet
+ [graypretty]
+ [ prettyone=grayprettyone,
+ prettytwo=grayprettytwo,
+ prettythree=grayprettythree,
+ prettyfour=grayprettyfour,
+ prettyfourthree=grayprettyfourthree]
+
+\definepalet [Ccolorpretty] [colorpretty]
+\definepalet [Cgraypretty] [graypretty]
+
+\setuptyping
+ [C]
+ [\c!icommand=\tttf]
+
+\protect \endinput
+
diff --git a/tex/context/base/verb-eif.mkii b/tex/context/base/verb-eif.mkii
new file mode 100644
index 000000000..68c84d4be
--- /dev/null
+++ b/tex/context/base/verb-eif.mkii
@@ -0,0 +1,211 @@
+%D \module
+%D [ file=verb-eif,
+%D version=2000.08.23,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty Eiffel Verbatim,
+%D author={Berend de Boer \& Hans Hagen},
+%D date=\currentdate,
+%D copyright={Berend de Boer \& 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.
+
+% This module will be cleaned up a bit in the process of more
+% flexible verbatim options.
+
+\writestatus{loading}{ConTeXt Verbatim Macros / Pretty EIFFEL Verbatim}
+
+%D \startbuffer
+%D \startEIFFEL
+%D class TEST
+%D
+%D creation
+%D make
+%D
+%D feature -- creation
+%D
+%D make is
+%D do
+%D print ("hello world")
+%D end
+%D
+%D end
+%D \stopEIFFEL
+%D \stopbuffer
+%D
+%D
+%D If a variable in a comment is quoted with `..', it is typeset
+%D as a variable (common Eiffel convention for pretty typesetters):
+%D
+%D \startbuffer
+%D \startEIFFEL
+%D class TEST
+%D
+%D feature
+%D
+%D say (something: STRING) is
+%D -- say `something' to stdout
+%D do
+%D print (something)
+%D end
+%D
+%D end -- class TEST
+%D \stopEIFFEL
+%D \stopbuffer
+%D
+%D
+%D Recommended, OOSC2 style setting is:
+%D
+%D \setuptyping
+%D [EIFFEL]
+%D [margin=1em,palet=,color=blue,style=\it,icommand=\bf,ccommand=\tf]
+%D
+
+%D We borrow most of the macros from the \PERL\ driver.
+
+\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi
+
+\unprotect
+
+%D \EIFFEL\ has only the one line comment sequence \type{--}.
+
+\gdef\EIFsetspecials%
+ {\PLsetspecials
+ \setpretty`\#=32
+ \setpretty`\{=33 \setpretty`\}=33
+ \setpretty`\[=33 \setpretty`\]=33 \setpretty`\(=33 \setpretty`\)=33
+ \setpretty`\;=33 \setpretty`\:=33
+ \setpretty`\!=33 \setpretty`\?=33
+ \setpretty`\==33 \setpretty`\~=33 \setpretty`\<=33 \setpretty`\>=33
+ \setpretty`\-=33 \setpretty`\+=33 \setpretty`\/=33 \setpretty`\*=33
+ \setpretty`\^=33
+ \setpretty`\%=41 \setpretty`\-=45
+ \setpretty`\`=81 \setpretty`\'=82 }
+
+\gdef\EIFsethandlers%
+ {\PLsethandlers
+ \installprettyhandler 33 \EIFtypesymbol
+ \installprettyhandler 45 \EIFtypefourfive
+ \installprettyhandler 81 \EIFtypeeightone
+ \installprettyhandler 82 \EIFtypeeighttwo
+ \installprettyhandler 90 \EIFtypenine }
+
+\gdef\EIFsetcontrols%
+ {\PLsetcontrols
+ \def\flushrestofverbatimline%
+ {\endPLtypesix
+ \inPLcommentfalse
+ \verbatimfont
+ \PLverbosefalse
+ \PLverboseskipped=0}}
+
+\gdef\EIFsetvariables
+ {\PLsetvariables}
+
+\gdef\setupprettyEIFtype%
+ {\def\prettyidentifier{EIF}%
+ \let\PLidentifiers=\EIFidentifiers
+ \let\PLvariables=\EIFvariables
+ \EIFsetvariables
+ \EIFsetcontrols
+ \EIFsethandlers
+ \EIFsetspecials
+ \PLsetdiagnostics}
+
+% symbols should appear in roman
+
+\gdef\EIFtypesymbol#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else
+ {\prettynaturalfont\/%
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty}%
+ \fi}
+
+% recognize comments
+
+\gdef\EIFtypefourfive%
+ {\handlenextnextpretty\doEIFtypefourfive\PLtypefourtwo}
+
+\gdef\doEIFtypefourfive#1#2%
+ {\endPLtypesix
+ \getprettydata{#2}%
+ \ifnum\prettytype=45
+ \let\next=\dodoEIFtypefourfive
+ \else
+ \let\next=\PLtypefourtwo
+ \fi
+ \next{#1}#2}
+
+\gdef\dodoEIFtypefourfive% #1%
+ {\endPLtypesix
+ \handlenextnextpretty\dododoEIFtypefourfive\dodododoPLtypefourfive}
+
+\gdef\dododoEIFtypefourfive%
+ {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoEIFtypefourfive}
+
+\gdef\dodododoEIFtypefourfive#1#2%
+ {\ifinPLcomment
+ \getpretties{#1}{#2}%
+ \else
+ \ifinPLdouble
+ \getpretties{#1}{#2}%
+ \else
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \def\next{\beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty\prettynaturalfont}%
+ \expandafter\next
+ \fi
+ \fi}
+
+% recognize `name' in comments and format them like variables
+
+\gdef\EIFtypeeightone#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \verbatimfont
+ \else
+ \getpretty{#1}%
+ \fi}
+
+\gdef\EIFtypeeighttwo#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \prettynaturalfont
+ \else
+ {\prettynaturalfont\/%
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty}%
+ \fi}
+
+% double quote
+
+\gdef\EIFtypenine#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \global\inPLdoublefalse
+ {\prettynaturalfont\/%
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty}%
+ \else
+ \global\inPLdoubletrue
+ {\prettynaturalfont
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty}%
+ \fi\fi\fi}
+
+\useprettyidentifiers \EIFidentifiers \EIFsetspecials
+ alias all and as check class create creation debug deferred do else
+ elseif end ensure expanded export external false feature from frozen
+ if implies indexing infix inherit inspect invariant is like local
+ loop not obsolete old once or prefix redefine rename require rescue
+ precursor retry select separate strip then true undefine unique
+ until variant when xor
+
+\useprettyidentifiers \EIFvariables \EIFsetspecials
+ not-yet-defined
+
+\protect \endinput
diff --git a/tex/context/base/verb-ini.mkii b/tex/context/base/verb-ini.mkii
new file mode 100644
index 000000000..829e10fd8
--- /dev/null
+++ b/tex/context/base/verb-ini.mkii
@@ -0,0 +1,1789 @@
+%D \module
+%D [ file=verb-ini,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim 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 Today I would implement the pretty handler slightly
+%D different, using stack and intermediate flushing. Maybe
+%D even without active chars. So, someday \unknown. Also
+%D I think that there are better ways (the current approach
+%D is an accumulation; for instance, we could save a second
+%D argument by turning chars into numbers and vise versa.
+
+%D Because this module is quite independant of system macros,
+%D it can be used as a stand||alone verbatim environment.
+%D
+%D This is a sort of second release of \type{supp-ver} and
+%D therefore differs in some aspects from the implementation
+%D published in the \MAPS. The first change concern
+%D optimization of breaks, that is, the first and last two
+%D lines of verbatim blocks are kept together. The second
+%D adaption is due to the fact that I wanted to support pretty
+%D printing not only for \TEX\ sources, but also for \PERL,
+%D \METAPOST\ and probably more. The \JAVASCRIPT\ module is
+%D closely related to \PERL, so we will not mention that one
+%D again.
+
+\ifx \undefined \writestatus \input supp-mis.tex \fi
+
+%D Verbatim typesetting, especially of \TEX\ sources, is a
+%D non||trivial task. This is a direct results of the fact that
+%D characters can have \CATCODES\ other than~11 and such
+%D characters needs a special treatment. What for instance is
+%D \TEX\ supposed to do when it encounters a \type{$} or an
+%D \type{#}? This module deals with these matters.
+
+\writestatus{loading}{ConTeXt Verbatim Macros / Initialization}
+
+%D The verbatim environment has some features, like coloring
+%D \TEX\ text, seldom found in other environments. Especially
+%D when the output of \TEX\ is viewed on an electronic medium,
+%D coloring has a positive influence on the readability of
+%D \TEX\ sources, so we found it very acceptable to dedicate
+%D half of this module to typesetting \TEX\ specific character
+%D sequences in color. In this module we'll also present some
+%D macro's for typesetting inline, display and file verbatim.
+%D The macro's are capable of handling \TAB\ too.
+%D
+%D This module shows a few tricks that are often overseen by
+%D novice, like the use of the \TEX\ primitive \type{\meaning}.
+%D First I'll show in what way the users are confronted with
+%D verbatim typesetting. Because we want to be able to test for
+%D symmetry and because we hate the method of closing down the
+%D verbatim mode with some strange active character, we will
+%D use the following construction for display verbatim:
+%D
+%D \starttyping
+%D The Dutch word 'typen' stands for 'typing', therefore in the Dutch version
+%D one will not find the word 'verbatim'.
+%D \stoptyping
+%D
+%D In \CONTEXT\ files can be typed with \type{\typefile} and
+%D inline verbatim can be accomplished with \type{\type}. This
+%D last command comes in many flavors:
+%D
+%D \starttyping
+%D We can say \type<<something>> or \type{something}. The first one is a bit
+%D longer but also supports slanted typing, which accomplished by typing
+%D \type<<a <<slanted>> word>>. We can also use commands to enhance the text
+%D \type<<with <</bf boldfaced>> text>>. Just to be complete, we decided
+%D to accept also \LaTeX\ alike verbatim, which means that \type+something+
+%D and \type|something| are valid commands too. Of course we want the grouped
+%D alternatives to process \type{hello {\bf big} world} with braces.
+%D \stoptyping
+%D
+%D In the core modules, we will build this support on top of
+%D this module. There these commands can be tuned with
+%D accompanying setup commands. There we can enable commands,
+%D slanted typing, control spaces, \TAB||handling and (here we
+%D are:) coloring. We can also setup surrounding white space
+%D and indenting. Here we'll only show some examples.
+
+\unprotect
+
+%D \macros
+%D {verbatimfont}
+%D
+%D When we are typesetting verbatim we use a non||proportional
+%D (mono spaced) font. Normally this font is available by
+%D calling \type{\tt}. In \CONTEXT\ this command does a
+%D complete font||style switch. There we could have stuck with
+%D \type{\tttf}.
+
+\ifx\verbatimfont\undefined \def\verbatimfont{\tt\normalnoligatures\font} \fi
+
+\ifx\normalnoligatures\undefined \let\normalnoligatures\gobbleoneargument \fi
+
+%D \macros
+%D {obeyedspace, obeyedtab, obeyedline, obeyedpage}
+%D
+%D We have followed Knuth in naming macros that make \SPACE,
+%D \NEWLINE\ and \NEWPAGE\ active and assigning them
+%D \type{\obeysomething}, but first we set some default values.
+
+\def\obeyedspace {\hbox{ }}
+\def\obeyedtab {\obeyedspace}
+\def\obeyedline {\par}
+\def\obeyedpage {\vfill\eject}
+
+%D Because we will introduce a status variable, we can define
+%D a better \type {\obeyedspace}.
+
+\def\obeyedspace {\ifprocessingverbatim\hbox{ }\else\space\fi}
+
+%D \macros
+%D {controlspace,setcontrolspaces}
+%D
+%D First we define \type{\obeyspaces}. When we want visible
+%D spaces (control spaces) we only have to adapt the definition
+%D of \type{\obeyedspace} to:
+
+\def\controlspace{\hbox{\char32}}
+\def\normalspace { }
+\def\normalspaces{\catcode`\ =\@@space}
+
+\bgroup
+\catcode`\ =\@@active
+\gdef\obeyspaces{\catcode`\ =\@@active\def {\obeyedspace}}
+\gdef\setcontrolspaces{\catcode`\ =\@@active\def {\controlspace}}
+\egroup
+
+%D \macros
+%D {obeytabs, obeylines, obeypages,
+%D ignoretabs, ignorelines, ignorepages}
+%D
+%D Next we take care of \NEWLINE\ and \NEWPAGE\ and because we
+%D want to be able to typeset listings that contain \TAB, we
+%D have to handle those too. Because we have to redefine the
+%D \NEWPAGE\ character locally, we redefine the meaning of
+%D this (often already) active character.
+
+\catcode`\^^L=\@@active \def^^L{\par}
+
+%D The following indirect definitions enable us to implement
+%D all kind of \type{\obeyed} handlers.
+
+\bgroup
+
+\catcode`\^^I=\@@active
+\catcode`\^^M=\@@active
+\catcode`\^^L=\@@active
+
+\gdef\obeytabs {\catcode`\^^I=\@@active\def^^I{\obeyedtab}}
+\gdef\obeylines {\catcode`\^^M=\@@active\def^^M{\obeyedline}}
+\gdef\obeypages {\catcode`\^^L=\@@active\def^^L{\obeyedpage}}
+
+\gdef\ignoretabs {\catcode`\^^I=\@@active\def^^I{\obeyedspace}}
+\gdef\ignorelines {\catcode`\^^M=\@@active\def^^M{\obeyedspace}}
+\gdef\ignorepages {\catcode`\^^L=\@@ignore} % \@@active\def^^L{\obeyedline}}
+\gdef\ignoreeofs {\catcode`\^^Z=\@@ignore}
+
+%D For testing (see digit parser) we need an indirect macro
+%D in order to compare the next (\type {\next}) token
+%D (possibly \type {^^M}) being \type {\obeyedline}.
+
+\gdef\nextobeyedline{\obeyedline}
+
+\egroup
+
+%D \macros
+%D {obeycharacters}
+%D
+%D We also predefine \type{\obeycharacters}, which will
+%D enable us to implement character||specific behavior, like
+%D colored verbatim.
+
+\let\obeycharacters=\relax
+
+%D \macros
+%D {settabskips}
+%D
+%D The macro \type{\settabskip} can be used to enable tab
+%D handling. Processing tabs is sometimes needed when one
+%D processes a plain \ASCII\ listing. Tab handling slows down
+%D verbatim typesetting considerably.
+
+\bgroup
+
+\catcode`\^^I=\@@active
+
+\gdef\settabskips
+ {\let\processverbatimline\doprocesstabskipline
+ \catcode`\^^I\@@active
+ \let^^I\doprocesstabskip}
+
+\gdef\setfixedtabskips#1%
+ {\catcode`\^^I\@@active
+ \def^^I{\kern#1\spaceskip}}
+
+\egroup
+
+%D \macros
+%D {processingverbatim}
+%D
+%D Typesetting a file in most cases results in more than one
+%D page. Because we don't want problems with files that are
+%D read in during the construction of the page, we set \type
+%D {\ifprocessingverbatim}, so the output routine can adapt
+%D its behavior. Originally we used \type {\scratchread}, but
+%D because we want to support nesting, we decided to use a
+%D separate input file.
+
+\newif\ifprocessingverbatim
+
+%D \macros
+%D {processinlineverbatim}
+%D
+%D Although the inline verbatim commands presented here will be
+%D extended and embedded in the core modules of \CONTEXT,
+%D they can be used separately. Both grouped and character
+%D alternatives are provided but \type{<<} and nested
+%D braces are implemented in the core module. This commands
+%D takes one argument: the closing command.
+%D
+%D \starttyping
+%D \processinlineverbatim{\closingcommand}
+%D \stoptyping
+%D
+%D One can define his own verbatim commands, which can be very
+%D simple:
+%D
+%D \starttyping
+%D \def\Verbatim {\processinlineverbatim\relax}
+%D \stoptyping
+%D
+%D or a bit more more complex:
+%D
+%D \starttyping
+%D \def\GroupedVerbatim%
+%D {\bgroup
+%D \dosomeusefullthings
+%D \processinlineverbatim\egroup}
+%D \stoptyping
+%D
+%D Before entering inline verbatim mode, we take care of the
+%D unwanted \TAB, \NEWLINE\ and \NEWPAGE\ characters and
+%D turn them into \SPACE. We need the double \type{\bgroup}
+%D construction to keep the closing command local.
+
+\def\setverbatimspaceskip
+ {\setbox\scratchbox\hbox{x}%
+ \spaceskip\wd\scratchbox
+ \xspaceskip\spaceskip}
+
+\def\setupinlineverbatim
+ {\verbatimfont
+ \setverbatimspaceskip
+ \let\obeytabs\ignoretabs
+ \let\obeylines\ignorelines
+ \let\obeypages\ignorepages
+ \setupcopyverbatim}
+
+\def\doprocessinlineverbatim
+ {\ifx\next\bgroup
+ \setupinlineverbatim
+ \catcode`\{\@@begingroup
+ \catcode`\}\@@endgroup
+ \def\next{\let\next=}%
+ \else
+ \setupinlineverbatim
+ \def\next##1{\catcode`##1=\@@endgroup}%
+ \fi
+ \next}
+
+\def\processinlineverbatim#1%
+ {\bgroup
+ \processingverbatimtrue
+ \localcatcodestrue % TeX processes paragraph's
+ \def\endofverbatimcommand{#1\egroup}%
+ \bgroup
+ \aftergroup\endofverbatimcommand
+ \futurelet\next\doprocessinlineverbatim}
+
+%D The closing command is executed afterwards as an internal
+%D command and therefore should not be given explicitly when
+%D typesetting inline verbatim.
+
+%D \macros
+%D {optimizeverbatim}
+%D
+%D One day, a collegue asked me why I didn't prevent breaking
+%D after a first or before a last verbatim line. At first sight
+%D I thought of using the two pass mechanism, but because we're
+%D already keeping track of individual lines, a more direct
+%D solution is possible: we just keep track of in what line
+%D we are. One can turn this feature off.
+
+\newif\ifoptimizeverbatim \optimizeverbatimtrue
+
+%D Before we implement display and file verbatim, we define
+%D some macros that deal with typesetting the individual lines.
+%D We keep track of the status by means of a character
+%D specification. This status variable tells us if we're
+%D skipping a first line or placing a first or last line.
+%D The next few examples show us where breaks are inserted.
+%D
+%D \bgroup
+%D
+%D \def\doverbatimnobreak
+%D {\nobreak\hrule width 10cm\par\penalty500} % == \nobreak
+%D
+%D \def\doverbatimgoodbreak
+%D {\nobreak\hrule width 3cm \par\penalty\linepenalty}
+%D
+%D \starttyping
+%D test
+%D test
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D test
+%D test
+%D test
+%D test
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D test
+%D
+%D test
+%D test
+%D test
+%D \stoptyping
+%D
+%D \egroup
+%D
+%D The long ones are \type{\nobreaks} and the short ones
+%D \type{\goodbreaks}. And this is how it's done:
+
+\def\doverbatimnobreak
+ {\ifoptimizeverbatim\penalty500 \fi}
+
+\def\doverbatimgoodbreak
+ {\ifoptimizeverbatim\penalty\linepenalty\fi}
+
+\def\doflushverbatimline
+ {\expandafter\dodoverbatimline\expandafter{\savedverbatimline}}
+
+\def\doverbatimbeginofline#1% linenumber (optional provided by mkiv / todo)
+ {\dontleavehmode
+ \strut
+ \the\everyline}
+
+\def\doverbatimendofline
+ {\par}
+
+\def\doverbatimemptyline
+ {\strut
+ \par}
+
+\let\handleverbatimline=\relax
+
+% \def\initializeverbatimline%
+% {\global\let\savedverbatimline=\empty
+% \ifskipfirstverbatimline
+% \global\chardef\verbatimstatus=0
+% \else
+% \global\chardef\verbatimstatus=1
+% \fi}
+%
+% more efficient
+
+\global\chardef\verbatimstatus0
+
+\def\initializeverbatimline
+ {\global\let\savedverbatimline\empty
+ \global\chardef\verbatimstatus\ifskipfirstverbatimline0 \else1 \fi}
+
+\chardef\verbatimemptylinemode\zerocount
+
+\def\presetemptyverbatimline
+ {\ifcase\verbatimstatus
+ \global\chardef\verbatimstatus\plusone
+ \or
+ \ifcase\verbatimemptylinemode\or\or
+ \doemptyverbatimline
+ \fi
+ \or
+ \ifcase\verbatimemptylinemode\else
+ \doemptyverbatimline
+ \fi
+ \or
+ \doflushverbatimline
+ \global\let\savedverbatimline\empty
+ \doemptyverbatimline
+ \global\chardef\verbatimstatus\plustwo
+ \else
+ \kern\zeropoint
+ \doverbatimnobreak
+ \doflushverbatimline
+ \global\let\savedverbatimline\empty
+ \doemptyverbatimline
+ \global\chardef\verbatimstatus\plustwo
+ \fi}
+
+\def\presetnormalverbatimline
+ {\ifcase\verbatimstatus
+ \global\chardef\verbatimstatus\plustwo
+ \or
+ \global\chardef\verbatimstatus\plusthree
+ \or
+ \global\chardef\verbatimstatus\plusthree
+ \or
+ \doflushverbatimline
+ \global\chardef\verbatimstatus\plusfour
+ \or
+ \kern\zeropoint
+ \doverbatimnobreak
+ \doflushverbatimline
+ \global\chardef\verbatimstatus\plusfive
+ \or
+ \doverbatimgoodbreak
+ \doflushverbatimline
+ \fi
+ \global\let\savedverbatimline\verbatimline}
+
+\def\presetlastverbatimline
+ {\ifcase \verbatimstatus
+ \or
+ \or
+ \or
+ \doflushverbatimline
+ \else
+ \kern \zeropoint
+ \doverbatimnobreak
+ \doflushverbatimline
+ \fi
+ \ifcase\verbatimemptylinemode\or\else
+ \kern \zeropoint
+ \fi}
+
+%D \macros
+%D {skipfirstverbatimline}
+%D
+%D By default the rest of the first line is ignored. We can
+%D turn this feature off by saying:
+%D
+%D \starttyping
+%D \skipfirstverbatimlinefalse
+%D \stoptyping
+
+\newif\ifskipfirstverbatimline \skipfirstverbatimlinetrue
+
+%D \macros
+%D {processdisplayverbatim}
+%D
+%D We can define a display verbatim environment with the
+%D command \type{\processdisplayverbatim} in the following way:
+%D
+%D \starttyping
+%D \processdisplayverbatim{\closingcommand}
+%D \stoptyping
+%D
+%D \noindent For instance, we can define a simple command like:
+%D
+%D \starttyping
+%D \def\BeginVerbatim {\processdisplayverbatim{EndVerbatim}}
+%D \stoptyping
+%D
+%D \noindent But we can also do more advance things like:
+%D
+%D \starttyping
+%D \def\BeginVerbatim {\bigskip \processdisplayverbatim{\EndVerbatim}}
+%D \def\EndVerbatim {\bigskip}
+%D \stoptyping
+%D
+%D When we compare these examples, we see that the backslash in
+%D the closing command is optional. One is free in actually
+%D defining a closing command. If one is defined, the command
+%D is executed after ending verbatim mode.
+
+\def\processdisplayverbatim#1%
+ {\par
+ \bgroup
+ \escapechar=-1
+ \xdef\verbatimname{\string#1}%
+ \egroup
+ \def\endofdisplayverbatim{\csname\verbatimname\endcsname}%
+ \bgroup
+ \parindent\zeropoint
+ \ifdim\lastskip<\parskip
+ \removelastskip
+ \vskip\parskip
+ \fi
+ \parskip\zeropoint
+ \processingverbatimtrue
+ \global\linepartrue
+ \expandafter\let\csname\verbatimname\endcsname\relax
+ \edef\endofverbatimcommand{\csname\verbatimname\endcsname}%
+ \edef\endofverbatimcommand{\meaning\endofverbatimcommand}%
+ \verbatimfont
+ \setverbatimspaceskip
+ \global\linepartrue % needed for paragraph numbering
+ \setupcopyverbatim
+ \initializeverbatimline
+ \copyverbatimline}
+
+%D We save the closing sequence in \type{\endofverbatimcommand}
+%D in such a way that it can be compared on a line by line
+%D basis. For the conversion we use \type{\meaning}, which
+%D converts the line to non||expandable tokens. We reset
+%D \type{\parskip}, because we don't want inter||paragraph
+%D skips to creep into the verbatim source. Furthermore we
+%D \type{\relax} the line||processing macro while getting the
+%D rest of the first line. The initialization command
+%D \type{\setupcopyverbatim} does just what we expect it to do:
+%D it assigns all characters \CATCODE~11. Next we switch to
+%D french spacing and call for obeyance.
+
+\newevery \everysetupverbatim \relax
+
+\def\setupcopyverbatim
+ {\uncatcodecharacters
+ \frenchspacing
+ \obeyspaces
+ \obeytabs
+ \obeylines
+ \obeypages
+ \obeycharacters
+ \the\everysetupverbatim}
+
+%D The main copying routine of display verbatim does an
+%D ordinary string||compare on the saved closing command and
+%D the current line. The space after \type{#1} in the
+%D definition of \type{\next} is essential! As a result of
+%D using \type{\obeylines}, we have to use \type{%}'s after
+%D each line but none after the first \type{#1}.
+
+{\obeylines%
+ \long\gdef\copyverbatimline#1
+ {\def\next{#1 }%
+ \gdef\verbatimline{#1}%
+ \ifx\next\emptyspace%
+ \presetemptyverbatimline%
+ \else%
+ \edef\next{\meaning\next}%
+ \ifx\next\endofverbatimcommand%
+ \presetlastverbatimline%
+ \def\copyverbatimline{\egroup\endofdisplayverbatim}%
+ \else%
+ \presetnormalverbatimline%
+ \fi%
+ \fi%
+ \handleverbatimline%
+ \copyverbatimline}}
+
+%D The actual typesetting of a line is done by a separate
+%D macro, which enables us to implement \TAB\ handling. The
+%D \type{\do} and \type{\dodo} macros take care of the
+%D preceding \type{\parskip}, while skipping the rest of the
+%D first line. The \type{\relax} is used as an signal.
+
+%D \macros
+%D {iflinepar}
+%D
+%D A careful reader will see that \type{\linepar} is reset.
+%D This boolean can be used to determine if the current line is
+%D the first line in a pseudo paragraph and this boolean is set
+%D after each empty line. The \type{\relax} can be used to
+%D determine the end of the line when one implements a scanner
+%D routine.
+
+\newif\iflinepar
+
+\let\doopenupverbatimline=\empty
+
+\let\beginverbatimline\relax
+\let\endverbatimline \relax
+
+\long\def\dodoverbatimline#1% we don't want to group
+ {\bgroup % due to pretty status
+ \iflinepar\else\EveryPar{}\fi
+ \dontleavehmode % \leavevmode
+ \xdef\dokeepverbatimlinedata % why was this?
+ {\parindent \the\parindent
+ \hangindent\the\hangindent
+ \hangafter \the\hangafter
+ \leftskip \the\leftskip
+ \rightskip \the\rightskip}%
+ \egroup
+ \dokeepverbatimlinedata
+ \doopenupverbatimline
+ \the\everyline\strut
+ \beginverbatimline
+ \processverbatimline{#1\relax\flushrestofverbatimline}%
+ \endverbatimline
+ \global\lineparfalse
+ \obeyedline\par}
+
+%D \macros
+%D {flushrestofverbatimline}
+%D
+%D Some pretty drivers will collect tokens for the sake of
+%D testing on keywords. This collected string needs to be
+%D flushed. The \type {\relax} can serve as signal that there
+%D is nothing more to be interpreted.
+
+\let\flushrestofverbatimline\empty
+
+%D \macros
+%D {obeyemptylines,verbatimbaselineskip}
+%D
+%D Empty lines in verbatim can lead to white space on top of
+%D a new page. Because this is not what we want, we turn
+%D them into vertical skips. This default behavior can be
+%D overruled by:
+%D
+%D \starttyping
+%D \obeyemptylines
+%D \stoptyping
+%D
+%D Although it would cost us only a few lines of code, we
+%D decided not to take care of multiple empty lines. When a
+%D (display) verbatim text contains more successive empty
+%D lines, this probably suits some purpose. When applicable,
+%D one can set the verbatim baselineskip.
+
+\bgroup
+\catcode`\^^L=\@@active \gdef\emptypage {^^L}
+\catcode`\^^M=\@@active \gdef\emptyline {^^M}
+ \gdef\emptyspace { }
+\egroup
+
+\def\verbatimbaselineskip% We don't use \let here!
+ {\baselineskip}
+
+\def\doemptyverbatimline
+ {\vskip\verbatimbaselineskip
+ {\setbox0\hbox{\the\everyline}}%
+ \global\linepartrue}
+
+% \def\obeyemptylines
+% {\let\donextemptyverbatimline\doemptyverbatimline}
+
+\def\obeyemptylines % tricky, only in verbatim (should be token list)!
+ {\chardef\verbatimemptylinemode\plusone}
+
+\def\obeyallemptylines % tricky, only in verbatim (should be token list)!
+ {\chardef\verbatimemptylinemode\plustwo}
+
+%D \TEX\ does not offer \type{\everyline}, which is a direct
+%D result of its advanced multi||pass paragraph typesetting
+%D mechanism. Because in verbatim mode paragraphs and lines are
+%D more or less equal, we can easily implement our own simple
+%D \type{\everyline} support.
+
+%D \macros
+%D {EveryPar, EveryLine}
+%D
+%D In this module we've reserved \type{\everypar} for the
+%D things to be done with paragraphs and \type{\everyline} for
+%D line specific actions. In \CONTEXT\ however, we use
+%D \type{\everypar} for placing side- and columnfloats,
+%D inhibiting indentation and some other purposes. In verbatim
+%D mode, every line becomes a paragraph, which means that
+%D \type{\everypar} is executed frequently. To be sure, the
+%D user specific use of both \type{\everyline} and
+%D \type{\everypar} is implemented by means of
+%D \type{\EveryLine} and \type{\EveryPar}.
+%D
+%D We still have to take care of the \TAB. A \TAB\ takes eight
+%D spaces and a \SPACE\ normally has a width of 0.5~em. Because
+%D we can be halfway a tabulation, we must keep track of the
+%D position. This takes time, especially when we print complete
+%D files, therefore we \type{\relax} this mechanism by default.
+
+\chardef\spacespertab=7
+
+\def\doprocesstabskip
+ {\obeyedspace % \hskip.5em or \hbox to .5em{}
+ \ifdone
+ \donefalse
+ \advance\scratchcounter \plusone
+ \@EA\doprocesstabskip
+ \else\ifnum\scratchcounter>\spacespertab
+ % nothing
+ \else
+ \advance\scratchcounter \plusone
+ \@EAEAEA\doprocesstabskip
+ \fi\fi}
+
+\let\endoftabskipping=\relax % will become obsolete
+
+\def\doprocesstabskipline#1%
+ {\bgroup
+ \scratchcounter\plusone
+ \dodoprocesstabskipline#1\relax
+ \egroup}
+
+\def\dodoprocesstabskipline#1%
+ {\ifnum\scratchcounter>\spacespertab\relax
+ \donetrue \else \donefalse \advance
+ \fi \scratchcounter \plusone
+ \ifx#1\relax \else
+ \ifcase\tabskipmode
+ % can't happen
+ \or
+ % go on
+ \else\ifnum`#1<128
+ % ok, no special character
+ \else\ifnum\catcode`#1=\active
+ % quits parsing, else utf lookahead problems
+ \chardef\tabskipmode\zerocount
+ \fi\fi\fi
+ \ifcase\tabskipmode
+ \@EAEAEA#1%
+ \else
+ \@EAEAEA#1\@EAEAEA\dodoprocesstabskipline
+ \fi
+ \fi}
+
+% ^ will be replaced
+
+\chardef\tabskipmode=1 % 0=quit 1=no test 2=test on active>128
+
+\long\def\processverbatimline#1{#1} % remove the fake grouping
+
+%D \macros
+%D {processfileverbatim}
+%D
+%D The verbatim typesetting of files is done on a bit different
+%D basis. This time we don't check for a closing command, but
+%D look for \EOF\ and when we've met, we make sure it does not
+%D turn into an empty line.
+%D
+%D \starttyping
+%D \processfileverbatim{filename}
+%D \stoptyping
+%D
+%D We reserve a dedicated file handle.
+
+\newread\verbatiminput
+
+\newcount\verbatimlinenumber
+
+\let \beginofverbatimlines \relax
+\let \endofverbatimlines \relax
+
+\def\processfileverbatim#1%
+ {\par
+ \bgroup
+ \processingverbatimtrue
+ \global\verbatimlinenumber\zerocount
+ \global\linepartrue
+ \beginofverbatimlines
+ \bgroup
+ \parindent\zeropoint
+ \ifdim\lastskip<\parskip
+ \removelastskip
+ \vskip\parskip
+ \fi
+ \parskip\zeropoint
+ \verbatimfont
+ \uncatcodecharacters
+ \setverbatimspaceskip
+ \frenchspacing
+ \obeyspaces
+ \obeytabs
+ \obeylines
+ \obeypages
+ \obeycharacters
+ \ignoreeofs
+ \catcode`\^^M=\@@ignore % \par is already taken care of
+% \openin\verbatiminput=#1\relax
+ \openinputfile\verbatiminput{#1}%
+ \skipfirstverbatimlinefalse
+ \initializeverbatimline
+ \def\readline%
+ {\ifeof\verbatiminput \else
+ \ifx\firstverbatimfileline\empty
+ \global\advance\verbatimlinenumber\plusone
+ \read\verbatiminput to \verbatimline
+ \else
+ \let\verbatimline\firstverbatimfileline
+ \let\firstverbatimfileline\empty
+ \fi
+ \fi
+ \ifeof\verbatiminput
+ \ifx\lastverbatimfileline\empty
+ \presetlastverbatimline
+ \let\readline\relax
+ \else % we will re-enter the \ifeof branch twice
+ \presetnormalverbatimline
+ \def\readline%
+ {\let\verbatimline\lastverbatimfileline
+ \let\lastverbatimfileline\empty}%
+ \fi
+ \else\ifx\verbatimline\empty
+ \presetemptyverbatimline
+ \else\ifx\verbatimline\emptyline
+ \presetemptyverbatimline
+ \else\ifx\verbatimline\emptypage
+ \presetemptyverbatimline
+ \else
+ \presetnormalverbatimline
+ \fi\fi\fi\fi
+ \handleverbatimline
+ \readline}%
+ \ifeof\verbatiminput \else
+ \expandafter\readline
+ \fi
+ \closein\verbatiminput
+ \egroup
+ \endofverbatimlines
+ \egroup
+ \ignorespaces}
+
+%D Something new:
+
+\def\processfilelinesverbatim#1#2#3%
+ {\bgroup
+ \let\saveddoflushverbatimline\doflushverbatimline
+ \let\saveddoemptyverbatimline\doemptyverbatimline
+ \def\checkverbatimfileline##1%
+ {\ifnum\verbatimlinenumber<#2\else
+ \ifnum\verbatimlinenumber>#3\else
+ ##1%
+ \fi\fi}%
+ \def\doflushverbatimline
+ {\checkverbatimfileline\saveddoflushverbatimline}%
+ \def\doemptyverbatimline
+ {\checkverbatimfileline\saveddoemptyverbatimline}%
+ \processfileverbatim{#1}%
+ \egroup}
+
+%D \macros
+%D {firstverbatimfileline, lastverbatimfileline}
+%D
+%D The following two macros can be set to achieve special
+%D effects, like:
+%D
+%D \starttyping
+%D \convertargument\StartFake{something}\to\firstverbatimfileline
+%D \convertargument\StopFake\to\firstverbatimfileline
+%D \stoptyping
+%D
+%D These hooks were needed for typesetting flowchart
+%D definitions verbatim, since the temporary files does not
+%D have the start and stop commands embedded.
+
+\let\firstverbatimfileline\empty
+\let\lastverbatimfileline \empty
+
+%D One can use the different \type{\obeysomething} commands to
+%D influence the behavior of these macro's. We use for instance
+%D \type{\obeycharacters} for making \type{/} an active
+%D character when we want to include typesetting commands.
+
+%D The next part of this module deals with pretty printing. The
+%D best way to understand how pretty verbatim typeseting works
+%D is to take a look at the output produced by the \TEX, \PERL\
+%D and \METAPOST\ modules first. Each of these modules has a
+%D few setup macros that tag the individual characters with a
+%D number that itself is associated to a interpretation macro.
+%D A previous implementation linked characters (after making
+%D them active) directly to such interpreters, but the more
+%D indirect way makes it possible to inspect the next
+%D character(s) without much expansion problems and/or
+%D increasing run time.
+
+%D By the way, \TEX\ defines \type{\+} as an outer macro, so we
+%D have to redefine this one to keep ourselves out of complaints.
+
+\def\+{\tabalign}
+
+%D Just to keep things consistant and to speed up some macros a
+%D but, we define a few private constants.
+
+\def\!!PRETTY {PRETTY}
+
+\def\!!prettyone {prettyone}
+\def\!!prettytwo {prettytwo}
+\def\!!prettythree {prettythree}
+\def\!!prettyfour {prettyfour}
+\def\!!prettyfive {prettyfive}
+\def\!!prettynine {prettynine}
+\def\!!prettyeight {prettyeight}
+\def\!!prettytwoone {prettytwoone}
+\def\!!prettyfourthree {prettyfourthree}
+
+%D The first step in defining a pretty interpreter is to assign
+%D each character that needs special attention a number, like:
+%D
+%D \starttyping
+%D \setpretty \`A 21
+%D \stoptyping
+%D
+%D Here the macro \type{\setpretty} makes the character
+%D \type{A} active, and sets it meaning to the auxiliary macro
+%D \type{\handleprettytoken}. This auxiliary macro takes the
+%D character code (a number) and the interpretation number. The
+%D three step implementation uses the \TEX book \type{~} trick.
+
+\def\dodosetpretty
+ {\!!countb=\uccode`~\relax
+ \catcode\!!countb=\@@active
+ \uppercase{\edef~{\noexpand\handleprettytoken{\the\!!counta}{\the\!!countb}}}}
+
+\def\dosetpretty
+ {\afterassignment\dodosetpretty\!!counta}
+
+\def\setpretty
+ {\afterassignment\dosetpretty\uccode`~=}
+
+%D The macro \type{\handleprettytoken} is rather trivial and
+%D calls for an interpreter macro.
+
+\def\handleprettytoken#1%
+ {\csname\!!PRETTY#1\endcsname} % \getvalue{\!!PRETTY#1}}
+
+%D This interpreter is installed by saying
+%D
+%D \starttyping
+%D \installprettyhandler 21 \SOMEprettyone
+%D \stoptyping
+
+\def\installprettyhandler#1 #2%
+ {\letvalue{\!!PRETTY#1}#2}
+
+%D Such an interpreter gets the character number:
+%D
+%D \starttyping
+%D \def\SOMEprettyone#1{...\getpretty{#1}...}
+%D \stoptyping
+%D
+%D where \type{\getpretty} equals \type{\char}. We can't
+%D use \type{\let} here because we have to get rid of the
+%D braces.
+
+\def\getpretty#1%
+ {\char#1}
+
+%D Sometimes the action depends on the next token. This token
+%D can be passed to the macro \type{\getprettydata}, that sets
+%D \type{\prettytype} to the interpreter code. The character
+%D code is saved in \type{\prettychar}.
+
+\def\setprettydata#1#2%
+ {\global\chardef\prettytype#1%
+ \global\chardef\prettychar#2\relax}
+
+\def\getprettydata#1%
+ {\global\chardef\prettytype\zerocount
+ \global\chardef\prettychar\zerocount
+ \bgroup
+ \let\handleprettytoken\setprettydata
+ \setbox0\hbox{#1}% expands #1 and ignores space
+ \egroup}
+
+%D If needed the current and next token can be handled alongside:
+
+\def\getpretties#1#2%
+ {\char#1\bgroup\let\handleprettytoken\getsecondpretty#2\egroup}
+
+\def\getsecondpretty#1#2%
+ {\char#2}
+
+%D When needed, one can reassign an interpreter by using
+%D \type{\newpretty} and its associates.
+%D
+%D \bgroup
+%D \setuptyping[file][optionoptie=tex,paletpalet=colorpretty]
+%D
+%D \startbuffer
+%D \bgroup
+%D \catcode`\|=\@@escape %%\|\
+%D \catcode`\\=\@@active %%\\+
+%D |gdef|dohandlenewpretty#1%
+%D {|def|dodohandlenewpretty##1%
+%D {|def|oldprettychar{#1}%
+%D |getprettydata{##1}%
+%D |ifnum|oldprettychar=|prettychar
+%D |def|dododohandlenewpretty####1%
+%D {|getprettydata{\}%
+%D |let|oldprettytype=|prettytype
+%D |getprettydata{####1}%
+%D |ifnum|prettytype=|oldprettytype
+%D |let|next=|newpretty
+%D |else
+%D |def|next{|newprettycommand{#1}##1####1}%
+%D |fi
+%D |next}%
+%D |let|next=|dododohandlenewpretty
+%D |else
+%D |def|next{|newprettycommand{#1}##1}%
+%D |fi
+%D |next}%
+%D |def|donohandlenewpretty##1%
+%D {|newprettycommand{#1}##1}%
+%D |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty}
+%D |egroup
+%D \stopbuffer
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D In this example we see that the colors differ from what we
+%D expect, but conform the definitions in the macro. This kind
+%D of recoloring can be achieved by saying:
+%D
+%D \typebuffer
+%D
+%D We'll show some more examples:
+%D
+%D \startbuffer[pretty]
+%D \installnewpretty r \red
+%D \installnewpretty g \green
+%D \installnewpretty b \blue
+%D \stopbuffer
+%D
+%D \getbuffer[pretty]
+%D
+%D \startbuffer
+%D %%\ r{Red
+%D %%\ g\Green
+%D %%\ b[Blue
+%D \stopbuffer
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D Watch the green \type{\Green}! This lines are specified as:
+%D
+%D \typebuffer
+%D
+%D along with:
+%D
+%D \typebuffer[pretty]
+%D
+%D When needed, one can use grouping.
+%D
+%D \startbuffer
+%D {yes} %%\ B %%\{[ %%\}]
+%D {no}
+%D {no} %%\ E
+%D {yes}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we tell the visualizer that the \type +{+ should be
+%D treated like a \type +[+ so we get:
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D I won't explain the details of this mechanism. Those who
+%D want to build their own pretty interpreters have to close
+%D read the source anyway.
+%D
+%D Last we show an example of mixed pretty typesetting:
+%D
+%D \startbuffer
+%D \ziezo{test} %%\ P ##\ B##\ T % enter PERL mode %%\ E
+%D if $test eq "test" ##\ B ##\ B##\ T % begin group (\bgroup) %%\ E
+%D if $test eq "test"; ##\ T %%\ B%%\ T % enter TEX mode %%\ E
+%D \ziezo{test} %%\ M %%\ B%%\ T % enter METAPOST mode %%\ E
+%D draw (0,0)--(10,10); %%\ E ##\ B##\ T % end group (\egroup) %%\ E
+%D if $test eq "test";
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we use \type{%%\ T}, \type{%%\ P} and \type{%%\ M} for
+%D switching between \TEX, \PERL\ and \METAPOST\ mode.
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D \egroup
+%D
+%D Don't forget to set:
+
+\newif\ifnewpretty
+
+\def\installnewpretty
+ {\def\doinstallnewpretty##1%
+ {\setvalue{NP::\the\scratchcounter}{##1}}%
+ \afterassignment\doinstallnewpretty\scratchcounter=`}
+
+%D Let's define the options we used here:
+
+\newevery\everyprettyend\relax
+
+\let\prettyend=\relax
+
+\def\prettybegin
+ {\bgroup\def\prettyend{\the\everyprettyend\egroup}}
+
+\installnewpretty B \prettybegin
+\installnewpretty E \prettyend
+
+\installnewpretty J \setupprettyJVtype
+\installnewpretty M \setupprettyMPtype
+\installnewpretty P \setupprettyPLtype
+\installnewpretty T \setupprettyTEXtype
+
+%D \macros
+%D {ifnaturaltextext}
+%D
+%D When one uses \ETEX, switching to normal \TEX\ is possible
+%D too. We also introduce a switch that can be used in the
+%D drivers and set in higher level shell macros.
+
+\newif\ifnaturaltextext
+
+% \starttyping
+% test /naturaltextext\hpos{word}{test}/relax test
+% \stoptyping
+%
+% \MPxy{word}
+
+\def\naturaltextext#1\relax
+ {\bgroup
+ \prettynaturalfont{\restorecatcodes\scantokens{\ignorespaces#1}}%
+ \egroup}
+
+\def\naturaltextext#1\relax
+ {\bgroup
+ \def\ascii{#1}%
+ \setnormalcatcodes
+ \restorecatcodes
+ \prettynaturalfont{\scantokens\expandafter{\ascii}\ifhmode\unskip\fi}%
+ \egroup}
+
+\installnewpretty N \naturaltextext
+
+%D When seen in action this gives:
+%D
+%D \startbuffer
+%D \startTEX
+%D \def\mathematics#1% %%\ N usage: \type {\mathematics{x^2}}
+%D {\ifmmode#1\else$#1$\fi} %%\ N becomes: \mathematics{X^2}
+%D \stopTEX
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D This is keyed in as:
+%D
+%D \typebuffer
+
+%D This means that when the interpreter modules support this
+%D mechanism, by default we have some keys already available.
+
+\def\newpretty#1%
+ {\getprettydata{#1}%
+ \ifcase\prettytype
+ \expandafter\nonewpretty
+ \else
+ \expandafter\donewpretty
+ \fi
+ #1}
+
+\def\nonewpretty#1#2%
+ {\getprettydata{#2}%
+ \getvalue{NP::\the\prettychar}}
+
+\def\donewpretty#1%
+ {\bgroup
+ \def\handleprettytoken##1##2##3%
+ {\getprettydata{##3}%
+ \egroup
+ \ifcase\prettytype\else
+ \setpretty##2=\prettytype\relax
+ \fi}%
+ #1}
+
+%D When implementing new pretty macros, one only needs to
+%D define something like:
+%D
+%D \starttyping
+%D \def\TEXtypezero%
+%D {\handlenewpretty\TEXtypethree}
+%D \stoptyping
+%D
+%D Here the number states the category (in our examples the
+%D backslash). The second argument takes care of normal
+%D situations.
+
+\def\handlenewpretty#1%
+ {\let\newprettycommand=#1%
+ \handlenextnextpretty\dohandlenewpretty\newprettycommand}
+
+%D The previous shown implementation only interprets single
+%D comments, but the final one also accepts double ones. The
+%D main reason for this is that in \JAVA\ we have to deal with
+%D \type{//}. Personally I prefer the double \type{%%} because
+%D is stands out and is more symmetrical with the double
+%D slash.
+
+\bgroup
+\catcode`\|=\@@escape
+\catcode`\\=\@@active
+|gdef|dohandlenewpretty#1%
+ {|def|dodohandlenewpretty##1%
+ {|def|oldprettychar{#1}%
+ |getprettydata{##1}%
+ |ifnum|oldprettychar=|prettychar
+ |def|dododohandlenewpretty####1%
+ {|getprettydata{\}%
+ |let|oldprettytype=|prettytype
+ |getprettydata{####1}%
+ |ifnum|prettytype=|oldprettytype
+ |let|next|newpretty
+ |else
+ |def|next{|newprettycommand{#1}##1####1}%
+ |fi
+ |next}%
+ |let|next|dododohandlenewpretty
+ |else
+ |def|next{|newprettycommand{#1}##1}%
+ |fi
+ |next}%
+ |def|donohandlenewpretty##1%
+ {|newprettycommand{#1}##1}%
+ |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty}
+|egroup
+
+%D The `nextnext' macro we used in the previous definition
+%D looks ahead. This is needed because individual lines are
+%D handles by macro's and the next character can be something
+%D that ends the line and/or does not belong to the verbatim
+%D data.
+
+\def\handlenextnextpretty#1#2#3%
+ {\def\dohandlenextnextpretty%
+ {\ifx\next\bgroup % something {}
+ \@EA#2%
+ \else\ifx\next\relax % end of line / signal
+ \@EAEAEA#2%
+ \else
+ \@EAEAEA#1%
+ \fi\fi
+ {#3}}%
+ \futurelet\next\dohandlenextnextpretty}
+
+%D The pretty interpreters can (and will) change the meaning of
+%D some controls. To enable them calling the originals we save
+%D their meanings and to enable nesting we permit this only
+%D once.
+
+\def\saveprettycontrols
+ {\global\let\oldobeyedspace \obeyedspace
+ \global\let\oldobeyedline \obeyedline
+ \global\let\oldobeyedpage \obeyedpage
+ \let\saveprettycontrols \relax}
+
+%D The \PERL\ and \METAPOST\ interpreters will also handle
+%D reserved words. Sets of identifiers are defined like:
+%D
+%D \starttyping
+%D \useprettyidentifiers \MODULAidentifiers \MODULAsetspecials
+%D if then else elsif case while do repeat until ...
+%D \stoptyping
+%D
+%D New entries can be added to existing sets by repeatedly
+%D using this command.
+
+\def\useprettyidentifiers#1#2% \variable \presetcatcodes
+ {\bgroup
+ \ifx#1\undefined
+ \global\let#1=\empty
+ \fi
+ \def\handleprettytoken##1##2{\char##2}%
+ #2\relax
+ \def\douseprettyidentifiers##1\par%
+ {\xdef#1{\space#1\space##1}%
+ \egroup}%
+ \douseprettyidentifiers}
+
+%D We can test om identifiers with:
+
+\def\doifprettyidentifierelse#1%
+ {\doifincsnameelse{\space#1\space}}
+
+%D \macros
+%D {prettyidentifierfont,prettyvariablefont,prettynaturalfont}
+%D
+%D When one want to typeset identifiers and system variables
+%D in a different typeface, one has to set the next two
+%D variables.
+
+\let\prettyidentifierfont=\relax
+\let\prettyvariablefont =\relax
+\let\prettynaturalfont =\relax
+
+%D The interpreter macros are loaded at run time. The main
+%D reason lays in the fact that we don't want to have the
+%D identifier lists hard coded in the format file. To prevent
+%D repetitive loading, one should load the modules before the
+%D first call to the macros.
+%D
+%D \starttyping
+%D \input verb-tex.tex
+%D \input verb-pl.tex
+%D \input verb-mp.tex
+%D \input verb-jv.tex
+%D \stoptyping
+%D
+%D In \CONTEXT\ we follow a different thread, and therefore all
+%D macros in the additional modules use \type {\gdef}'s and
+%D \type {\doglobal}'s. Manipulating \type {\globaldef} is
+%D possible but leads to fuzzy situations.
+
+%D \macros
+%D {ifdisablepretty,disableprettynow,disableprettyafterwards}
+%D
+%D Although for pretty printing \PERL\ and \JAVASCRIPT\ code
+%D one has to implement a bit more clever mechanism, the next
+%D switches can be used to turn off pretty printing. The
+%D boolean turns on this feature.
+
+\newif\ifdisablepretty \disableprettyfalse
+\newif\ifprettydisabled \prettydisabledfalse
+
+\def\disableprettynow
+ {\ifdisablepretty\ifprettydisabled\else
+ \let\prettyidentifierfont\relax
+ \let\prettyvariablefont\relax
+ \let\prettycomment\relax
+ \def\beginofpretty[##1]{}%
+ \let\endofpretty\relax
+ \prettydisabledtrue
+ \fi\fi}
+
+\def\disableprettyafterwards
+ {\ifdisablepretty\ifprettydisabled\else
+ \def\endofpretty{\normalendofpretty\disableprettynow}%
+ \fi\fi}
+
+\def\enableprettynow
+ {\prettydisabledfalse
+ \let\prettyidentifierfont\normalprettyidentifierfont
+ \let\prettyvariablefont \normalprettyvariablefont
+ \let\prettynaturalfont \normalprettynaturalfont
+ \let\beginofpretty \normalbeginofpretty
+ \let\endofpretty \normalendofpretty}
+
+%D This feature is hooked into the verbatim line handling
+%D routine with:
+
+\def\beginverbatimline
+ {\prettydisabledfalse
+ \ifnewpretty\else\let\handlenewpretty\empty\fi % moved
+ \let\normalprettyidentifierfont\prettyidentifierfont
+ \let\normalprettyvariablefont \prettyvariablefont
+ \let\normalprettynaturalfont \prettynaturalfont
+ \let\normalbeginofpretty \beginofpretty
+ \let\normalendofpretty \endofpretty}
+
+\def\endverbatimline
+ {\enableprettynow}
+
+%D The rest of this module is dedicated to non \CONTEXT\ users
+%D and shows an example of an verbatim environment based on the
+%D previous macros.
+%D
+%D The macro's can be used to construct the commands we
+%D mentioned in the beginning of this documentation. We leave
+%D this to the fantasy of the reader and only show some \PLAIN\
+%D \TEX\ alternatives for display verbatim and listings. We
+%D define three commands for typesetting inline text, display
+%D text and files verbatim. The inline alternative also accepts
+%D user supplied delimiters.
+%D
+%D
+%D \type{text}
+%D
+%D \starttyping
+%D ... verbatim text ...
+%D \stoptyping
+%D
+%D \typefile{filename}
+%D
+%D We can turn on the options by:
+%D
+%D \starttyping
+%D \controlspacetrue
+%D \verbatimtabstrue
+%D \prettyverbatimtrue
+%D \stoptyping
+%D
+%D Here is the implementation:
+
+\newif\ifcontrolspace
+\newif\ifverbatimtabs
+\newif\ifprettyverbatim
+
+\ifCONTEXT \else
+
+ \def\presettyping
+ {\ifcontrolspace \let\obeyspace \setcontrolspace \fi
+ \ifverbatimtabs \let\obeytabs \settabskips \fi
+ \ifprettyverbatim \let\obeycharacters\setupprettytype \fi}
+
+ \def\type
+ {\bgroup
+ \def\_{\string_}%
+ \def\^{\string^}%
+ \presettyping
+ \processinlineverbatim\egroup}
+
+ \def\starttyping
+ {\bgroup
+ \presettyping
+ \processdisplayverbatim\stoptyping}
+
+ \def\stoptyping
+ {\egroup}
+
+ \def\typefile#1%
+ {\bgroup
+ \presettyping
+ \processfileverbatim{#1}%
+ \egroup}
+
+\fi
+
+%D In \CONTEXT\ users say things like:
+%D
+%D \starttyping
+%D \definetyping [TEX] [option=TEX]
+%D \definetyping [MP] [option=MP]
+%D \definetyping [PL] [option=PL]
+%D \definetyping [JV] [option=JV]
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D \setuptyping[file][option=color]
+%D \stoptyping
+%D
+%D That way \CONTEXT\ selects the appropriate interpreter
+%D itself, but more on that in another module. In other
+%D packages one can define:
+
+\ifCONTEXT \else
+
+ \input verb-tex.mkii
+ \input verb-mp.mkii
+
+ \def\startTEX
+ {\bgroup \everypar{}%
+ \let\obeycharacters\setupprettyTEXtype
+ \processdisplayverbatim{\stopTEX}}
+
+ \def\startMP
+ {\bgroup \everypar{}%
+ \let\obeycharacters\setupprettyMPtype
+ \processdisplayverbatim{\stopMP}}
+
+ \let\stopTEX=\egroup
+ \let\stopMP =\egroup
+
+\fi
+
+%D This following poor mans implementation of color is based on
+%D PostScript. One can of course use grayscales too. In the
+%D core modules these macros are redefined to using the color
+%D mechanism present in \CONTEXT.
+
+\ifCONTEXT \else
+
+ \def\setcolorverbatim
+ {\def\prettyone {.9 .0 .0 } % red
+ \def\prettytwo {.0 .8 .0 } % green
+ \def\prettythree {.0 .0 .9 } % blue
+ \def\prettyfour {.8 .8 .6 } % yellow
+ \def\beginofpretty[##1]%
+ {\special{ps:: \csname##1\endcsname setrgbcolor}}
+ \def\endofpretty%
+ {\special{ps:: 0 0 0 setrgbcolor}}} % black
+
+ \def\setgrayverbatim
+ {\def\prettyone {.30 } % gray
+ \def\prettytwo {.45 } % gray
+ \def\prettythree {.60 } % gray
+ \def\prettyfour {.75 } % gray
+ \def\beginofpretty[##1]%
+ {\special{ps:: \csname##1\endcsname setgray}}
+ \def\endofpretty%
+ {\special{ps:: 0 setgray}}} % black
+
+\fi
+
+%D One can redefine these two commands after loading this
+%D module. When available, one can also use appropriate
+%D font||switch macro's. We default to color.
+
+\ifCONTEXT \else \setcolorverbatim \fi
+
+%D Here come the commands that are responsible for entering and
+%D leaving the two states. As we can see, they've got much in
+%D common.
+
+%D The previous version of this module was published in the
+%D \MAPS\ of the dutch \TEX\ users group \NTG. In that article,
+%D the verbatim part of the text was typeset with the following
+%D commands for the examples:
+%D
+%D \starttyping
+%D \def\starttyping% We simplify the \ConTeXt\ macro.
+%D {\bgroup
+%D \everypar{} % We disable some troublesome mechanisms.
+%D \advance\leftskip by 1em
+%D \processdisplayverbatim{\stoptyping}}
+%D
+%D \let\stoptyping=\egroup
+%D \stoptyping
+%D
+%D We also used:
+%D
+%D \starttyping
+%D \def\startdefinition%
+%D {\bgroup
+%D \everypar{} % Again we disable some troublesome mechanisms.
+%D \let\obeycharacters=\setupprettyTEXtype % See verb-tex.tex!
+%D \EveryPar{\showparagraphcounter}%
+%D \EveryLine{\showlinecounter}%
+%D \verbatimbodyfont
+%D \processdisplayverbatim{\stopdefinition}}
+%D
+%D \def\stopdefinition%
+%D {\egroup}
+%D \stoptyping
+%D
+%D And because we have both \type{\EveryPar} and
+%D \type{\EveryLine} available, we can implement a dual
+%D numbering mechanism:
+%D
+%D \starttyping
+%D \newcount\paragraphcounter
+%D \newcount\linecounter
+%D
+%D \def\showparagraphcounter%
+%D {\llap
+%D {\bgroup
+%D \counterfont
+%D \hbox to 4em
+%D {\global\advance\paragraphcounter by 1
+%D \hss \the\paragraphcounter \hskip2em}%
+%D \egroup
+%D \hskip1em}}
+%D
+%D \def\showlinecounter%
+%D {\llap
+%D {\bgroup
+%D \counterfont
+%D \hbox to 2em
+%D {\global\advance\linecounter by 1
+%D \hss \the\linecounter}%
+%D \egroup
+%D \hskip1em}}
+%D \stoptyping
+%D
+%D One may have noticed that the \type{\EveryPar} is only
+%D executed once, because we consider each piece of verbatim
+%D as one paragraph. When one wants to take the empty lines
+%D into account, the following assignments are appropriate:
+%D
+%D \starttyping
+%D \EveryLine
+%D {\iflinepar
+%D \showparagraphcounter
+%D \fi
+%D \showlinecounter}
+%D \stoptyping
+%D
+%D In this case, nothing has to be assigned to \type{\EveryPar},
+%D maybe except of just another extra numbering scheme. The
+%D macros used to typeset this documentation are a bit more
+%D complicated, because we have to take take 'long' margin
+%D lists into account. When such a list exceeds the previous
+%D pargraph we postpone placement of the paragraph number till
+%D there's room. This way so it does not clash with the margin
+%D words.
+
+%D Normally such commands have to be embedded in a decent setup
+%D structure, where options can be set at will.
+%D
+%D Now let's summarize the most important commands.
+%D
+%D \starttyping
+%D \processinlineverbatim{\closingcommand}
+%D \processdisplayverbatim{\closingcommand}
+%D \processfileverbatim{filename}
+%D \stoptyping
+%D
+%D We can satisfy our own specific needs with the following
+%D interfacing macro's:
+%D
+%D \starttyping
+%D \obeyspaces \obeytabs \obeylines \obeypages \obeycharacters
+%D \stoptyping
+%D
+%D We can influence the verbatim environment with the following
+%D macro:
+%D
+%D \starttyping
+%D \obeyemptylines
+%D \stoptyping
+%D
+%D Some needs are fulfilled already with:
+%D
+%D \starttyping
+%D \setcontrolspace \settabskips
+%D \stoptyping
+%D
+%D lines can be enhanced with ornaments using:
+%D
+%D \starttyping
+%D \everypar \everyline \iflinepar
+%D \stoptyping
+%D
+%D and pretty verbatim support is implemented by:
+%D
+%D \starttyping
+%D \beginofpretty[#1] ... \endofpretty
+%D \stoptyping
+%D
+%D and some setup macro, like:
+%D
+%D \starttyping
+%D \setupprettyIDENTIFIERtype
+%D \stoptyping
+%D
+%D The color support macro can be redefined by the user. The
+%D parameter \type{#1} can be one of the four 'fixed'
+%D identifiers {\em prettyone}, {\em prettytwo}, {\em
+%D prettythree} and {\em prettyfour}. We have implemented a
+%D more or less general PostScript color support mechanism,
+%D using \type{specials}. One can toggle between color and
+%D grayscale with:
+%D
+%D \starttyping
+%D \setgrayverbatim \setcolorverbatim
+%D \stoptyping
+
+%D \macros
+%D {permitshiftedendofverbatim}
+%D
+%D We did not mention one drawback of the mechanism described
+%D here. The closing command must start at the first position
+%D of the line. In \CONTEXT\ we will not have this drawback,
+%D because we can test if the end command is a substring of the
+%D current line. The testing is done by two of the support
+%D macros, which of course are not available in a stand alone
+%D application of this module.
+
+\ifCONTEXT
+
+ \let\doifendofverbatim=\doifelse
+
+ \def\permitshiftedendofverbatim
+ {\let\doifendofverbatim\doifinstringelse}
+
+ {\obeylines%
+ \long\gdef\copyverbatimline#1
+ {\convertargument#1 \to\next%
+ \gdef\verbatimline{#1}%
+ \ifx\next\emptyspace%
+ \presetemptyverbatimline%
+ \else%
+ \doifendofverbatim{\endofverbatimcommand}{\next}%
+ {\presetlastverbatimline%
+ \def\copyverbatimline{\egroup\endofdisplayverbatim}}%
+ {\presetnormalverbatimline}%
+ \fi%
+ \handleverbatimline%
+ \copyverbatimline}}
+
+%D As a bonus, we provide the next alternative, which takes
+%D end tags like \type {Hello World!}.
+
+ \def\doprocessdisplayverbatim#1#2%
+ {\par
+ \beginofverbatimlines
+ \bgroup
+ \escapechar-1
+ \xdef\verbatimname{\string#2}%
+ \egroup
+ \ifcase#1%
+ \let\endofdisplayverbatim\relax
+ \else
+ \def\endofdisplayverbatim{\endofverbatimlines\csname\verbatimname\endcsname}%
+ \fi
+ \bgroup
+ \parindent\zeropoint
+ \ifdim\lastskip<\parskip
+ \removelastskip
+ \vskip\parskip
+ \fi
+ \parskip\zeropoint
+ \processingverbatimtrue
+ \ifcase#1%
+ \convertargument#2\to\endofverbatimcommand
+ \else
+ \expandafter\let\csname\verbatimname\endcsname=\relax
+ \expandafter\convertargument\csname\verbatimname\endcsname
+ \to\endofverbatimcommand
+ \fi
+ \verbatimfont
+ \setverbatimspaceskip
+ \global\linepartrue % needed for paragraph numbering
+ \setupcopyverbatim
+ \initializeverbatimline
+ \copyverbatimline}
+
+ \def\processdisplayverbatim {\doprocessdisplayverbatim1}
+ \def\processtaggeddisplayverbatim{\doprocessdisplayverbatim0}
+
+\fi
+
+%D \macros
+%D {installprettyescape}
+%D
+%D The next feature is dedicated to Fabrice Popineau who
+%D wanted math inside verbatim.
+
+\def\prettyescapecnt{255}
+
+\def\installprettyescape
+ {\dodoubleempty\doinstallprettyescape}
+
+\def\doinstallprettyescape[#1][#2]#3 #4%
+ {\bgroup
+ \doglobal\decrement\prettyescapecnt
+ \def\docommand##1%
+ {\def\next{\dodoinstallprettyescape{##1}{#3}{#4}}%
+ \catcode`#3=\@@active
+ \@EA\scantokens\@EA{\next}}%
+ \iffirstargument
+ \processcommalist[#1]\docommand
+ \else
+ \docommand\empty
+ \fi}
+
+\def\dodoinstallprettyescape#1#2#3%
+ {\unexpanded\setgvalue{PRETTY@#1@\prettyescapecnt}##1##2#2{#3{##2}}%
+ \expanded % we need to freeze the counter
+ {\doglobal\noexpand\appendtoks
+ \noexpand\doif{#1}\noexpand\prettyidentifier
+ {\noexpand\setpretty`\string#2=\prettyescapecnt
+ \noexpand\installprettyhandler \prettyescapecnt\space\getvalue{PRETTY@#1@\prettyescapecnt}}%
+ }\to \everysetupverbatim
+ \egroup}
+
+%D An example of its usage is:
+%D
+%D \startbuffer
+%D \def\xverbatimmath#1#2{\naturaltextext\mathematics{#1}\relax}
+%D \def\yverbatimmath#1#2{\naturaltextext\mathematics{[[#1]]}\relax}
+%D \def\zverbatimmath#1#2{\naturaltextext\mathematics{(#1)}\relax}
+%D
+%D \installprettyescape [MP] $ \xverbatimmath
+%D \installprettyescape [MP] ~ \yverbatimmath
+%D \installprettyescape [MP] * \zverbatimmath
+%D
+%D \startMP
+%D if $x>10$ :
+%D $x := 20$
+%D ~x := 20~
+%D *x := 20*
+%D end
+%D \stopMP
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\protect \endinput
diff --git a/tex/context/base/verb-js.mkii b/tex/context/base/verb-js.mkii
new file mode 100644
index 000000000..e497e475b
--- /dev/null
+++ b/tex/context/base/verb-js.mkii
@@ -0,0 +1,171 @@
+%D \module
+%D [ file=verb-js,
+%D version=1998.02.07,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \JAVASCRIPT\ Verbatim,
+%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 Verbatim Macros / Pretty JavaScript Verbatim}
+
+%D In \CONTEXT\ we support \JAVASCRIPT\ inclusion in \PDF\
+%D documents and thereby enter the field of authoring. Of
+%D course we also want to pretty print such scripts, that look
+%D like:
+%D
+%D \startJS
+%D alfa = beta*2 ; // both alfa and beta are numbers // indeed
+%D if (odd(alfa))
+%D { do_something() }
+%D else
+%D { do_nothing() } /* As we can see /* in this example */ there
+%D how_about(alfa) ; is no fi needed. Also no semicolons are
+%D or_about(beta) ; needed after a right brace. */
+%D \stopJS
+%D
+%D Because \JAVASCRIPT\ looks much like \PERL, we will use
+%D a slightly adapted \PERL\ visualization. First we load the
+%D \PERL\ module:
+
+\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi
+
+\unprotect
+
+%D The main difference between the \JAVASCRIPT\ and \PERL\
+%D interpreters concern comments. Where \TEX, \METAPOST\ and
+%D \PERL\ have one comment symbol (\type{%}, \type{%} and
+%D \type{#}), \JAVA\ has the one line comment sequence
+%D \type{//} and the multi line comment delimiters \type{/*}
+%D and \type{*/}.
+%D
+%D We need a counter to keep track of multi line comment
+%D nesting.
+
+\newcount\JScommentlevel
+
+%D We handle both \type{%} and \type{#} a bit different:
+
+\gdef\JSsetspecials%
+ {\PLsetspecials
+ \setpretty`\#=32
+ \setpretty`\%=41
+ \setpretty`\/=43
+ \setpretty`\*=44 }
+
+%D We also need a few more handlers: one for \type{//} and
+%D \type{/*} and one for \type{*/}.
+
+\gdef\JSsethandlers%
+ {\PLsethandlers
+ \installprettyhandler 43 \JStypefourthree
+ \installprettyhandler 44 \JStypefourfour }
+
+%D We can inherit most of the settings:
+
+\gdef\JSsetcontrols%
+ {\PLsetcontrols
+ \def\flushrestofverbatimline%
+ {\endPLtypesix
+ \ifcase\JScommentlevel \inPLcommentfalse \fi
+ \PLverbosefalse
+ \PLverboseskipped=0}}
+
+\gdef\JSsetvariables
+ {\PLsetvariables
+ \global\JScommentlevel=0 }
+
+\gdef\setupprettyJStype%
+ {\def\prettyidentifier{JS}%
+ \let\PLidentifiers=\JSidentifiers
+ \let\PLvariables=\JSvariables
+ \JSsetvariables
+ \JSsetcontrols
+ \JSsethandlers
+ \JSsetspecials
+ \PLsetdiagnostics}
+
+%D The main complication is that we have to look upto four
+%D characters ahead. Such macros are hard to understand but
+%D they do work!
+
+\gdef\JStypefourthree%
+ {\handlenextnextpretty\doJStypefourthree\PLtypefourtwo}
+
+\gdef\doJStypefourthree#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \let\next=\dodoJStypefourthree
+ \else\ifnum\prettytype=44
+ \global\advance\JScommentlevel by 1
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \let\next=\JStogglecomment
+ \else
+ \let\next=\PLtypefourtwo
+ \fi\fi
+ \next{#1}#2}
+
+\gdef\JStogglecomment#1#2%
+ {\ifnum\JScommentlevel=1
+ \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
+ \else
+ \getpretties{#1}{#2}%
+ \fi}
+
+\gdef\dodoJStypefourthree% #1%
+ {\endPLtypesix
+ \handlenextnextpretty\dododoJStypefourthree\dodododoPLtypefourthree}
+
+\gdef\dododoJStypefourthree%
+ {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoJStypefourthree}
+
+\gdef\dodododoJStypefourthree#1#2%
+ {\ifinPLcomment
+ \getpretties{#1}{#2}%
+ \else
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \ifnaturaltextext
+ \let\next\naturaltextext
+ \else
+ \def\next{\beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}%
+ \fi
+ \expandafter\next
+ \fi}
+
+\gdef\JStypefourfour%
+ {\handlenextnextpretty\doJStypefourfour\PLtypefourtwo}
+
+\gdef\doJStypefourfour#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \JStogglecomment{#1}#2%
+ \global\advance\JScommentlevel by -1
+ \ifcase\JScommentlevel \global\inPLcommentfalse \fi
+ \else
+ \endPLtypesix
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \expandafter#2%
+ \fi}
+
+%D We need different (less) reserved words. This list replaces
+%D the \PERL\ one.
+
+\useprettyidentifiers \JSidentifiers \JSsetspecials
+ abstract boolean break byte case catch char class const
+ continue default delete do double else extends false final
+ finally float for function goto if implements import in
+ instanceof int interface long native new null package
+ private protected public return short static super switch
+ synchronized this throw throws transient true try var void
+ while with
+
+\useprettyidentifiers \JSvariables \JSsetspecials
+ not-yet-defined
+
+\protect \endinput
diff --git a/tex/context/base/verb-jv.mkii b/tex/context/base/verb-jv.mkii
new file mode 100644
index 000000000..ee79e5c03
--- /dev/null
+++ b/tex/context/base/verb-jv.mkii
@@ -0,0 +1,222 @@
+%D \module
+%D [ file=verb-jv,
+%D version=2002.02.27,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \JAVA\ Verbatim,
+%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 Verbatim Macros / Pretty Java Verbatim}
+
+%D This module differs from the \JAVASCRIPT\ driver in its
+%D handling of comments. We also need a few more handlers: one
+%D for \type {//} and \type {/*} and one for \type {*/} as
+%D well as the \JAVA doc trigger \type {/**}.
+
+%D We build this driver on top of the \PERL\ one. Since this
+%D driver looks much like the \JAVASCRIPT\ one, we don't
+%D comment it extensively.
+
+\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi
+
+\unprotect
+
+\newcount\JVcommentlevel
+
+\gdef\JVsetspecials
+ {\PLsetspecials
+ \setpretty`\#=32
+ \setpretty`\%=41
+ \setpretty`\-=45
+ \setpretty`\/=43
+ \setpretty`\*=44 }
+
+\gdef\JVsethandlers
+ {\PLsethandlers
+ \installprettyhandler 43 \JVtypefourthree
+ \installprettyhandler 44 \JVtypefourfour
+ \installprettyhandler 45 \JVtypefourfive }
+
+\gdef\JVsetcontrols
+ {\PLsetcontrols
+ \def\flushrestofverbatimline
+ {\endPLtypesix
+ \ifcase\JVcommentlevel \inPLcommentfalse \fi
+ \PLverbosefalse
+ \PLverboseskipped=0}}
+
+\gdef\JVsetvariables
+ {\PLsetvariables
+ \global\JVcommentlevel=0 }
+
+\gdef\setupprettyJVtype
+ {\def\prettyidentifier{JV}%
+ \let\PLidentifiers\JVidentifiers
+ \let\PLvariables\JVvariables
+ \JVsetvariables
+ \JVsetcontrols
+ \JVsethandlers
+ \JVsetspecials
+ \PLsetdiagnostics}
+
+\gdef\JVtypefourthree
+ {\handlenextnextpretty\doJVtypefourthree\PLtypefourtwo}
+
+\gdef\doJVtypefourthree#1#2#3%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \let\next\dodoJVtypefourthree
+ \else\ifnum\prettytype=44
+ \global\advance\JVcommentlevel 1
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \getprettydata{#3}%
+ \ifnum\prettytype=44
+ \inPLdoctrue
+ \fi
+ \let\next\JVtogglecomment
+ \else
+ \let\next\PLtypefourtwo
+ \fi\fi
+ \next{#1}#2#3}
+
+\gdef\JVtogglecomment#1#2%
+ {\ifnum\JVcommentlevel=1
+ \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
+ \else
+ \getpretties{#1}{#2}%
+ \fi}
+
+\gdef\dodoJVtypefourthree
+ {\endPLtypesix
+ \handlenextnextpretty\dododoJVtypefourthree\dodododoPLtypefourthree}
+
+\gdef\dododoJVtypefourthree
+ {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoJVtypefourthree}
+
+\gdef\dodododoJVtypefourthree#1#2%
+ {\ifinPLcomment
+ \getpretties{#1}{#2}%
+ \else
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \ifnaturaltextext
+ \let\next\naturaltextext
+ \else
+ \def\next{\beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}%
+ \fi
+ \expandafter\next
+ \fi}
+
+\gdef\JVtypefourfour
+ {\ifinPLdoc
+ \@EA\noJVtypefourfour
+ \else
+ \@EA\handlenextnextpretty\@EA\doJVtypefourfour\@EA\PLtypefourtwo
+ \fi}
+
+\gdef\noJVtypefourfour#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \JVtogglecomment{#1}#2%
+ \inPLdocfalse
+ \global\advance\JVcommentlevel -1
+ \ifcase\JVcommentlevel \global\inPLcommentfalse \fi
+ \else
+ \ifPLdocdone
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \PLdocdonetrue
+ \fi
+ \expandafter#2%
+ \fi}
+
+\gdef\doJVtypefourfour#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \JVtogglecomment{#1}#2%
+ \inPLdocfalse
+ \global\advance\JVcommentlevel -1
+ \ifcase\JVcommentlevel \global\inPLcommentfalse \fi
+ \else
+ \endPLtypesix
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \expandafter#2%
+ \fi}
+
+\gdef\JVtypefourfive % permit - in javadoc @tags
+ {\ifinPLdoc
+ \@EA\PLtypesixtwo
+ \else
+ \@EA\PLtypefourone
+ \fi}
+
+\useprettyidentifiers \JVidentifiers \JVsetspecials
+ abstract assert boolean break byte case catch char class const
+ continue default do double else extends false final
+ finally float for goto if implements import instanceof
+ int interface long native new null package private protected
+ public return short static strictfp super switch synchronized
+ this throw throws transient true try void volatile while
+
+\useprettyidentifiers \JVvariables \JVsetspecials
+ @author @docRoot @deprecated @exception @inheritDoc @link
+ @linkplain @param @return @see @serial @serialData @serialField
+ @since @throws @value @version
+
+%D The \JAVA doc feature was requested by Robert F.~Beeger,
+%D who also provided this test class:
+%D
+%D \startJV
+%D package de.jwamalpha.handling.web.rbdipl;
+%D
+%D import java.io.IOException;
+%D import java.io.PrintWriter;
+%D import javax.servlet.http.HttpServlet;
+%D import javax.servlet.http.HttpServletRequest;
+%D import javax.servlet.http.HttpServletResponse;
+%D import javax.servlet.ServletException;
+%D
+%D /**
+%D * The simple login servlet
+%D *
+%D * @author Robert F. Beeger
+%D * @version 1.0
+%D */
+%D
+%D public class LoginServlet extends HttpServlet
+%D {
+%D //
+%D // public interface
+%D //
+%D /**
+%D * Process the get-request.
+%D *
+%D * @param request the request
+%D * @param response the response.
+%D */
+%D protected void doGet (HttpServletRequest request, HttpServletResponse response)
+%D throws ServletException, IOException
+%D {
+%D response.setContentType("text/html");
+%D PrintWriter writer = response.getWriter();
+%D writer.println("<html>");
+%D writer.println(" <head>");
+%D writer.println(" <title>Login</title>");
+%D writer.println(" </head>");
+%D writer.println(" <body>");
+%D writer.println(" Hallo, Benutzer " + request.getParameter("username") + "!");
+%D writer.println(" </body>");
+%D writer.println("</html>");
+%D writer.flush();
+%D }
+%D }
+%D \stopJV
+
+\protect \endinput
diff --git a/tex/context/base/verb-mp.mkii b/tex/context/base/verb-mp.mkii
new file mode 100644
index 000000000..7affaf0c4
--- /dev/null
+++ b/tex/context/base/verb-mp.mkii
@@ -0,0 +1,364 @@
+%D \module
+%D [ file=verb-mp,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \METAPOST\ Verbatim,
+%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 Verbatim Macros / Pretty METAPOST Verbatim}
+
+% bug: in mp-char.mp the char should not be highlighted
+
+% can be simplified
+
+%D This module was first used when I documented our new
+%D company logo. This interpreter is modeled after the \PERL\
+%D one.
+%D
+%D \startMP
+%D beginfig(1);
+%D z1 = (0,0);
+%D z2 = (100,0);
+%D z3 = (0,100);
+%D draw z1--z2--z3--cycle;
+%D endfig;
+%D \stopMP
+%D
+%D Of course we cannot (yet) provide a nice layout, so some
+%D formatting is still needed.
+
+\unprotect
+
+%D \macros
+%D {prettyMPvariables}
+%D
+%D Identifiers and system variables are typeset in a different
+%D style. One can turn of this mechanism for the variables by
+%D setting th enext boolean.
+%D
+
+\doglobal\newif\ifprettyMPvariables
+
+\global\prettyMPvariablestrue
+
+%D We support \METAFONT\ as well as \METAPOST.
+
+\gdef\MPsetcontrols
+ {\saveprettycontrols
+ \everyprettyend
+ {\endMPtypesix}%
+ \def\obeyedspace%
+ {\endMPtypesix
+ \oldobeyedspace}%
+ \def\flushrestofverbatimline%
+ {\endMPtypesix}%
+ \let\obeytabs=\ignoretabs}
+
+\gdef\setupprettyMPtype
+ {\def\prettyidentifier{MP}%
+ \global\inMPtexmodefalse
+ \MPsetvariables
+ \MPsetcontrols
+ \MPsethandlers
+ \MPsetspecials}
+
+\doglobal\newif\ifinMPtexmode
+
+\gdef\MPsetvariables
+ {\global\inMPtexmodefalse
+ \global\let\MPsequence=\empty}
+
+\gdef\MPsetspecials
+ {\setpretty`\;=11 \setpretty`\$=12 \setpretty`\@=12 \setpretty`\#=12
+ \setpretty`\%=20
+ \setpretty`\[=31 \setpretty`\]=31 \setpretty`\(=32 \setpretty`\)=32
+ \setpretty`\:=33 \setpretty`\==34 \setpretty`\<=34 \setpretty`\>=34
+ \setpretty`\-=41 \setpretty`\+=41 \setpretty`\/=41 \setpretty`\*=41
+ \setpretty`\|=41 \setpretty`\`=41 \setpretty`\!=41 \setpretty`\?=41
+ \setpretty`\^=41 \setpretty`\&=42
+ \setpretty`\\=50
+ \setpretty`\1=61 \setpretty`\2=61 \setpretty`\3=61 \setpretty`\4=61
+ \setpretty`\5=61 \setpretty`\6=61 \setpretty`\7=61 \setpretty`\8=61
+ \setpretty`\9=61 \setpretty`\0=61
+ \setpretty`\A=62 \setpretty`\B=62 \setpretty`\C=62 \setpretty`\D=62 \setpretty`\E=62
+ \setpretty`\F=62 \setpretty`\G=62 \setpretty`\H=62 \setpretty`\I=62 \setpretty`\J=62
+ \setpretty`\K=62 \setpretty`\L=62 \setpretty`\M=62 \setpretty`\N=62 \setpretty`\O=62
+ \setpretty`\P=62 \setpretty`\Q=62 \setpretty`\R=62 \setpretty`\S=62 \setpretty`\T=62
+ \setpretty`\U=62 \setpretty`\V=62 \setpretty`\W=62 \setpretty`\X=62 \setpretty`\Y=62
+ \setpretty`\Z=62
+ \setpretty`\a=62 \setpretty`\b=62 \setpretty`\c=62 \setpretty`\d=62 \setpretty`\e=62
+ \setpretty`\f=62 \setpretty`\g=62 \setpretty`\h=62 \setpretty`\i=62 \setpretty`\j=62
+ \setpretty`\k=62 \setpretty`\l=62 \setpretty`\m=62 \setpretty`\n=62 \setpretty`\o=62
+ \setpretty`\p=62 \setpretty`\q=62 \setpretty`\r=62 \setpretty`\s=62 \setpretty`\t=62
+ \setpretty`\u=62 \setpretty`\v=62 \setpretty`\w=62 \setpretty`\x=62 \setpretty`\y=62
+ \setpretty`\z=62
+ \setpretty`\_=62
+ \setpretty`\,=70 \setpretty`\.=70
+ \setpretty`\'=81 \setpretty`\"=82
+ \setpretty`\{=90 \setpretty`\}=90 }
+
+\gdef\MPsethandlers
+ {\installprettyhandler 11 \MPtypeone
+ \installprettyhandler 12 \MPtypeone
+ \installprettyhandler 20 \MPtypetwo
+ \installprettyhandler 31 \MPtypethreeA
+ \installprettyhandler 32 \MPtypethreeA
+ \installprettyhandler 33 \MPtypethreeB
+ \installprettyhandler 34 \MPtypethreeB
+ \installprettyhandler 41 \MPtypefour
+ \installprettyhandler 42 \MPtypefour
+ \installprettyhandler 50 \MPtypefive
+ \installprettyhandler 61 \MPtypesixone
+ \installprettyhandler 62 \MPtypesixtwo
+ \installprettyhandler 70 \MPtypeseven
+ \installprettyhandler 81 \MPtypeeightone
+ \installprettyhandler 82 \MPtypeeighttwo
+ \installprettyhandler 90 \MPtypenine }
+
+\gdef\MPtypeone#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty%
+ \fi}
+
+\gdef\doMPtypetwo#1%
+ {\ifnaturaltextext
+ \let\next\naturaltextext
+ \else
+ \disableprettytrue\disableprettyafterwards
+ \def\next{\beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty}%
+ \fi
+ \next}
+
+\gdef\MPtypetwo
+ {\endMPtypesix
+ \ifnewpretty\expandafter\handlenewpretty\fi\doMPtypetwo}
+
+\gdef\MPtypethreeA#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\MPtypethreeB#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\MPtypefour#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\MPtypefive#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\endMPtypesix
+ {\ifx\MPsequence\empty\else
+ \doifprettyidentifierelse{\MPsequence}{\MPidentifiers}
+ {\doifprettyidentifierelse{\MPsequence}{\MPbtex}
+ {\beginofpretty[\!!prettytwo]%
+ {\prettyidentifierfont\MPsequence}%
+ \endofpretty
+ \global\inMPtexmodetrue}
+ {\ifinMPtexmode
+ \doifprettyidentifierelse{\MPsequence}{\MPetex}
+ {\global\inMPtexmodefalse}{}%
+ \fi
+ \beginofpretty[\!!prettytwo]%
+ {\prettyidentifierfont\MPsequence}%
+ \endofpretty}}
+ {\ifprettyMPvariables
+ \doifprettyidentifierelse{\MPsequence}{\MPvariables}
+ {\beginofpretty[\!!prettytwo]%
+ {\prettyvariablefont\MPsequence}%
+ \endofpretty}
+ {\MPsequence}%
+ \else
+ \MPsequence
+ \fi}%
+ \global\let\MPsequence=\empty
+ \fi}
+
+\gdef\MPtypesixone
+ {\endMPtypesix
+ \getpretty}
+
+\gdef\MPtypesixtwo#1%
+ {\xdef\MPsequence{\MPsequence\getpretty{#1}}}
+
+\gdef\MPtypeseven#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\MPtypeeightone#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\MPtypeeighttwo#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\MPtypenine#1%
+ {\endMPtypesix
+ \ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \getpretty{#1}%
+ \fi}
+
+%D \METAPOST\ \TEX||ies:
+
+\useprettyidentifiers \MPbtex \MPsetspecials
+ btex verbatimtex
+
+\useprettyidentifiers \MPetex \MPsetspecials
+ etex
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ btex etex verbatimtex
+
+%D \METAPOST\ internal variables \& predefined variables:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ charcode day linecap linejoin miterlimit month pausing
+ prologues showstopping time tracingcapsules tracingchoices mpprocset
+ tracingcommands tracingequations tracinglostchars
+ tracingmacros tracingonline tracingoutput tracingrestores
+ tracingspecs tracingstats tracingtitles truecorners
+ warningcheck year
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ ahangle ahlength bboxmargin defaultpen defaultscale
+ labeloffset background currentpen currentpicture cuttings
+ defaultfont extra_beginfig extra_endfig
+
+%D \METAPOST\ predefined constants:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ false nullpicture pencircle true
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ beveled black blue bp butt cc cm dd ditto down epsilon
+ evenly fullcircle green halfcircle identity in infinity left
+ mitered mm origin pensquare pt quartercircle red right
+ rounded squared unitsquare up white withdots
+
+%D \METAPOST\ operators:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ and angle arclength arctime ASCII bluepart boolean bot
+ char color cosd cycle decimal directiontime floor fontsize
+ greenpart hex infont intersectiontimes known length llcorner
+ lrcorner makepath makepen mexp mlog normaldeviate not
+ numeric oct odd or path pair pen penoffset picture point
+ postcontrol precontrol redpart reverse rotated scaled
+ shifted sind slanted sqrt str string subpath substring
+ transform transformed ulcorner uniformdeviate unknown
+ urcorner xpart xscaled xxpart xypart ypart yscaled yxpart
+ yypart zscaled
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ abs bbox ceiling center cutafter cutbefore dir
+ directionpoint div dotprod intersectionpoint inverse mod lft
+ round rt unitvector whatever
+
+%D \METAPOST\ commands:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ addto clip input interim let newinternal save setbounds
+ shipout show showdependencies showtoken showvariable
+ special
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ cutdraw draw drawarrow drawdblarrow fill filldraw
+ loggingall pickup tracingall tracingnone undraw unfill
+ unfilldraw drawdot
+
+%D \METAPOST\ macro||like functions:
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ buildcycle dashpattern decr dotlabel dotlabels drawoptions
+ incr label labels max min thelabel z
+
+%D More \METAPOST:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ begingroup endgroup of curl tension and controls
+ reflectedabout rotatedaround interpath on off beginfig
+ endfig def vardef enddef epxr suffix text primary secondary
+ tertiary primarydef secondarydef tertiarydef top bottom
+ ulft urt llft lrt randomseed also contour doublepath
+ withcolor withpen dashed if else elseif fi for endfor
+ forsuffixes forever downto upto step until end
+
+%D \METAFONT\ stuff:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ charlist extensible fontdimen headerbyte kern ligtable
+ boundarychar chardp charext charht charic charwd designsize
+ fontmaking charexists
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ beginchar blacker capsule_end change_width
+ define_blacker_pixels define_corrected_pixels
+ define_good_x_pixels define_good_y_pixels
+ define_horizontal_corrected_pixels define_pixels
+ define_whole_blacker_pixels define_whole_pixels
+ define_whole_vertical_blacker_pixels
+ define_whole_vertical_pixels endchar extra_beginchar
+ extra_endchar extra_setup font_coding_scheme
+ font_extra_space
+
+%D \METAFONT\ no||op stuff:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ cullit currenttransform gfcorners grayfont hround
+ imagerules lowres_fix nodisplays notransforms openit
+ displaying currentwindow screen_rows screen_cols
+ pixels_per_inch cull display openwindow numspecial
+ totalweight autorounding fillin proofing tracingpens
+ xoffset chardx granularity smoothing turningcheck yoffset
+ chardy hppp tracingedges vppp
+
+%D \METAPOST\ goodies:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ extra_beginfig extra_endfig mpxbreak
+
+\protect
+
+\endinput
diff --git a/tex/context/base/verb-pas.mkii b/tex/context/base/verb-pas.mkii
new file mode 100644
index 000000000..71c0b5a12
--- /dev/null
+++ b/tex/context/base/verb-pas.mkii
@@ -0,0 +1,266 @@
+%D \module
+%D [ file=verb-pas,
+%D version=1999.12.09,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \PASCAL\ and \MODULA\ Verbatim,
+%D author=Berend de Boer,
+%D date=\currentdate,
+%D copyright={Berend de Boer \& 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.
+
+% This module will be cleaned up a bit in the process of more
+% flexible verbatim options.
+
+\writestatus{loading}{ConTeXt Verbatim Macros / Pretty PASCAL Verbatim}
+
+%D Typeset Pascal(-like) code:
+%D
+%D \startbuffer
+%D \startPAS
+%D program Hello;
+%D
+%D begin
+%D writeln('hello world.');
+%D end.
+%D \stopPAS
+%D \stopbuffer
+%D
+%D Berend's preferences:
+%D
+%D \startbuffer[setup]
+%D \setuptyping
+%D [DELPHI]
+%D [palet=,icommand=\bf,vcommand=,ccommand=\it]
+%D \stopbuffer
+
+\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi
+
+\unprotect
+
+\doglobal\newif\ifinPASbracketcomment
+\doglobal\newif\ifinPASslashstarcomment
+\doglobal\newif\ifinPASslashslashcomment
+
+
+\gdef\PASsetspecials%
+ {\PLsetspecials
+ \setpretty`\#=32
+ \setpretty`\%=41
+ \setpretty`\:=41
+ \setpretty`\/=43
+ \setpretty`\*=44
+ \setpretty`\{=45 \setpretty`\}=46 }
+
+\gdef\PASsethandlers%
+ {\PLsethandlers
+ \installprettyhandler 43 \PAStypefourthree
+ \installprettyhandler 44 \PAStypefourfour
+ \installprettyhandler 45 \PAStypefourfive
+ \installprettyhandler 46 \PAStypefoursix }
+
+\gdef\PASsetcontrols%
+ {\PLsetcontrols
+ \def\flushrestofverbatimline%
+ {\endPLtypesix
+ \ifinPASslashslashcomment
+ \PASstopslashslashcomment
+ \fi
+ \PLverbosefalse
+ \PLverboseskipped=0}}
+
+\gdef\PASsetvariables
+ {\PLsetvariables
+ \global\inPASbracketcommentfalse
+ \global\inPASslashstarcommentfalse
+ \global\inPASslashslashcommentfalse}
+
+\gdef\setupprettyPAStype%
+ {\def\prettyidentifier{PAS}%
+ \let\PLidentifiers=\PASidentifiers
+ \let\PLvariables=\PASvariables
+ \PASsetvariables
+ \PASsetcontrols
+ \PASsethandlers
+ \PASsetspecials
+ \PLsetdiagnostics}
+
+% the // and /* comments
+
+\gdef\PAStypefourthree%
+ {\handlenextnextpretty\doPAStypefourthree\PLtypefourtwo}
+
+\gdef\doPAStypefourthree#1#2%
+ {\endPLtypesix
+ \ifinPLcomment
+ \let\next=\PLtypefourtwo
+ \else
+ \ifinPLsingle
+ \let\next=\PLtypefourtwo
+ \else
+ \getprettydata{#2}%
+ \ifnum\prettytype=43
+ \PLverbosecorrection
+ \let\next=\PASstartslashslashcomment
+ \else\ifnum\prettytype=44
+ \PLverbosecorrection
+ \let\next=\PASstartslashstarcomment
+ \else
+ \let\next=\PLtypefourtwo
+ \fi\fi
+ \fi
+ \fi
+ \next{#1}#2}
+
+\gdef\PASstartslashstarcomment#1#2%
+ {\global\inPLcommenttrue
+ \global\inPASslashstarcommenttrue
+ \prettynaturalfont
+ \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}
+
+\gdef\PASstopslashstarcomment#1#2%
+ {\beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
+ \verbatimfont
+ \global\inPLcommentfalse
+ \global\inPASslashstarcommentfalse}
+
+\gdef\PASstartslashslashcomment#1#2%
+ {\global\inPLcommenttrue
+ \global\inPASslashslashcommenttrue
+ \prettynaturalfont
+ \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}
+
+\gdef\PASstopslashslashcomment%
+ {\verbatimfont
+ \inPLcommentfalse
+ \inPASslashslashcommentfalse}
+
+% \gdef\dodoPAStypefourthree% #1%
+% {\endPLtypesix
+% \handlenextnextpretty\dododoPAStypefourthree\dodododoPLtypefourthree}
+
+% \gdef\dododoPAStypefourthree%
+% {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoPAStypefourthree}
+
+% \gdef\dodododoPAStypefourthree#1#2%
+% {\ifinPLcomment
+% \getpretties{#1}{#2}%
+% \else
+% \global\inPLcommenttrue
+% \PLverbosecorrection
+% \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
+% \fi}
+
+\gdef\PAStypefourfour%
+ {\handlenextnextpretty\doPAStypefourfour\PLtypefourtwo}
+
+\gdef\doPAStypefourfour#1#2%
+ {\ifinPASslashstarcomment
+ \getprettydata{#2}%
+ \ifnum\prettytype=43
+ \PASstopslashstarcomment{#1}#2%
+ \else
+ \endPLtypesix
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \expandafter#2%
+ \fi
+ \else
+ \endPLtypesix
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \expandafter#2%
+ \fi}
+
+
+% the { and } comments
+% we assume { is closed by } and do not follow the braindead Standard
+% Pascal standard in this respect
+% Note: brackets are not output correctly if natural font is \tf.
+% Therefore natural font is default to \tttf now (Hans is this ok??)
+% You have to use postscript fonts it seems to get brackets in that case.
+
+\gdef\PAStypefourfive#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else
+ \ifinPLsingle
+ \getpretty{#1}%
+ \else
+ \global\inPLcommenttrue
+ \global\inPASbracketcommenttrue
+ \prettynaturalfont
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi
+ \fi}
+
+\gdef\PAStypefoursix#1%
+ {\endPLtypesix
+ \ifinPASbracketcomment
+ \prettynaturalfont\beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \verbatimfont
+ \global\inPLcommentfalse
+ \global\inPASbracketcommentfalse
+ \else
+ \getpretty{#1}%
+ \fi}
+
+
+% Standard Pascal keywords (ISO/IEC 7185)
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ and array begin case const div do downto else end file
+ for function goto if in label mod nil not of or packed
+ procedure program record repeat set then to type until
+ var while with
+
+% Standard Pascal directives (ISO/IEC 7185)
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ forward
+
+% Extended Pascal keywords (ISO/IEC 10206)
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ and_then bindable export import module only or_else
+ otherwise pow protected qualified restricted
+
+% Extended Pascal directives (ISO/IEC 10206)
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ implementation interface
+
+% Object Pascal keywords (draft September 20, 1993)
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ abstract class constructor destructor inherited is
+ property view
+
+% Object Pascal directives (draft September 20, 1993)
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ override
+
+% Delphi keywords
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ as asm dispinterface except exports finalization finally
+ initialization inline library object out raise resourcestring
+ shl shr string threadvar try unit uses xor
+
+% Delphi directives
+% the read and write directive have been skipped
+% as they're pretty common procedure calls too
+
+\useprettyidentifiers \PASidentifiers \PASsetspecials
+ absolute assembler automated cdecl contains default dispid
+ dynamic external far implements index message name near
+ nodefault overload override package pascal private protected
+ public published readonly register reintroduce requires
+ resident safecall stdcall stored virtual writeonly
+
+\useprettyidentifiers \PASvariables \PASsetspecials
+ not-yet-defined
+
+\protect \endinput
diff --git a/tex/context/base/verb-pl.mkii b/tex/context/base/verb-pl.mkii
new file mode 100644
index 000000000..47ce9a54f
--- /dev/null
+++ b/tex/context/base/verb-pl.mkii
@@ -0,0 +1,547 @@
+%D \module
+%D [ file=verb-pl,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \PERL\ Verbatim,
+%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 Verbatim Macros / Pretty PERL Verbatim}
+
+%D When I rewrote \TEXUTIL\ in \PERL\ I decided to write a
+%D pretty \PERL\ interpreter too. In fact, this was the main
+%D reason for rewriting the pretty verbatim mechanisms to
+%D handle more that \TEX.
+%D
+%D \startPL
+%D $alfa = $beta{gamma};
+%D if ($alfa="delta")
+%D { print "epsilon" }
+%D \stopPL
+%D
+%D When looking at the macros, watch the \type{\doglobal}'s!
+%D They're something \CONTEXT\ specific.
+
+\unprotect
+
+%D \macros
+%D {prettyPLvariables}
+%D
+%D Identifiers and system variables get a special treatment.
+%D One can disable this option for the variables by resetting
+%D the next switch.
+
+\doglobal\newif\ifprettyPLvariables
+
+\global\prettyPLvariablestrue
+
+%D As said before, the global assignment is needed in
+%D \CONTEXT\ (for once||only loading on demand).
+
+\doglobal\newif\ifinPLsingle
+\doglobal\newif\ifinPLdouble
+\doglobal\newif\ifinPLcomment
+\doglobal\newif\ifinPLdoc % only used in java filter
+\doglobal\newif\ifPLdocdone % only used in java filter
+\doglobal\newif\ifPLverbose
+
+\newcount\PLverboseskipped
+
+\gdef\PLverbosecorrection%
+ {\ifnum\PLverboseskipped>0
+ \obeyedspace
+ \advance\PLverboseskipped -1
+ \@EA\PLverbosecorrection
+ \fi}
+
+\gdef\PLsetcontrols%
+ {\saveprettycontrols
+ \def\obeyedspace%
+ {\endPLtypesix
+ \ifPLverbose
+ \advance\PLverboseskipped 1
+ \else
+ \oldobeyedspace
+ \fi}%
+ \def\flushrestofverbatimline%
+ {\endPLtypesix
+ \global\inPLcommentfalse}%
+ \def\obeyedline%
+ {\PLverbosefalse
+ \PLverboseskipped=0
+ \PLdocdonefalse
+ \oldobeyedline}%
+ \let\obeytabs=\ignoretabs}
+
+\gdef\JVsetcontrols%
+ {\PLsetcontrols
+ {\endPLtypesix
+ \ifcase\JVcommentlevel \inPLcommentfalse \fi
+ \PLverbosefalse
+ \PLverboseskipped=0}}
+
+\gdef\setupprettyPLtype%
+ {\def\prettyidentifier{PL}%
+ \PLsetvariables
+ \PLsetcontrols
+ \PLsethandlers
+ \PLsetspecials
+ \PLsetdiagnostics}
+
+\gdef\PLsetvariables%
+ {\global\inPLsinglefalse
+ \global\inPLdoublefalse
+ \global\inPLcommentfalse
+ \global\let\PLsequence=\empty
+ \global\let\PLprefix=\empty}
+
+\gdef\PLsetspecials%
+ {\setpretty`\{=10 \setpretty`\}=10
+ \setpretty`\$=21 \setpretty`\@=21 \setpretty`\%=22
+ \setpretty`\[=31 \setpretty`\]=31 \setpretty`\(=32 \setpretty`\)=32
+ \setpretty`\==32 \setpretty`\~=32 \setpretty`\<=32 \setpretty`\>=32
+ \setpretty`\-=41 \setpretty`\+=41 \setpretty`\/=41 \setpretty`\*=41
+ \setpretty`\|=41 \setpretty`\`=41 \setpretty`\!=41 \setpretty`\?=41
+ \setpretty`\^=41 \setpretty`\&=42
+ \setpretty`\\=50
+ \setpretty`\1=61 \setpretty`\2=61 \setpretty`\3=61 \setpretty`\4=61
+ \setpretty`\5=61 \setpretty`\6=61 \setpretty`\7=61 \setpretty`\8=61
+ \setpretty`\9=61 \setpretty`\0=61 \setpretty`\_=61
+ \setpretty`\A=62 \setpretty`\B=62 \setpretty`\C=62 \setpretty`\D=62 \setpretty`\E=62
+ \setpretty`\F=62 \setpretty`\G=62 \setpretty`\H=62 \setpretty`\I=62 \setpretty`\J=62
+ \setpretty`\K=62 \setpretty`\L=62 \setpretty`\M=62 \setpretty`\N=62 \setpretty`\O=62
+ \setpretty`\P=62 \setpretty`\Q=62 \setpretty`\R=62 \setpretty`\S=62 \setpretty`\T=62
+ \setpretty`\U=62 \setpretty`\V=62 \setpretty`\W=62 \setpretty`\X=62 \setpretty`\Y=62
+ \setpretty`\Z=62
+ \setpretty`\a=62 \setpretty`\b=62 \setpretty`\c=62 \setpretty`\d=62 \setpretty`\e=62
+ \setpretty`\f=62 \setpretty`\g=62 \setpretty`\h=62 \setpretty`\i=62 \setpretty`\j=62
+ \setpretty`\k=62 \setpretty`\l=62 \setpretty`\m=62 \setpretty`\n=62 \setpretty`\o=62
+ \setpretty`\p=62 \setpretty`\q=62 \setpretty`\r=62 \setpretty`\s=62 \setpretty`\t=62
+ \setpretty`\u=62 \setpretty`\v=62 \setpretty`\w=62 \setpretty`\x=62 \setpretty`\y=62
+ \setpretty`\z=62
+ \setpretty`\;=71 \setpretty`\:=72 \setpretty`\,=71 \setpretty`\.=71
+ \setpretty`\'=80
+ \setpretty`\"=90
+ \setpretty`\#= 0 }
+
+\gdef\PLsethandlers%
+ {\installprettyhandler 10 \PLtypeone
+ \installprettyhandler 21 \PLtypetwo
+ \installprettyhandler 22 \PLtypetwo
+ \installprettyhandler 31 \PLtypethree
+ \installprettyhandler 32 \PLtypethree
+ \installprettyhandler 41 \PLtypefourone
+ \installprettyhandler 42 \PLtypefourtwo
+ \installprettyhandler 50 \PLtypefive
+ \installprettyhandler 61 \PLtypesixone
+ \installprettyhandler 62 \PLtypesixtwo
+ \installprettyhandler 71 \PLtypesevenone
+ \installprettyhandler 72 \PLtypeseventwo
+ \installprettyhandler 80 \PLtypeeight
+ \installprettyhandler 90 \PLtypenine
+ \installprettyhandler 0 \PLtypezero}
+
+\gdef\PLtypeone#1%
+ {\ifinPLdouble
+ \PLverbosefalse
+ \ifinPLcomment
+ \endPLtypesix
+ \getpretty{#1}%
+ \else\ifx\PLprefix\empty
+ \endPLtypesix
+ \getpretty{#1}%
+ \else
+ \endPLtypesix
+ \xdef\PLprefix{\getpretty{#1}}%
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi
+ \else
+ \endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi
+ \fi}
+
+% \gdef\PLtypetwo#1%
+% {\endPLtypesix
+% \xdef\PLprefix{\getpretty{#1}}%
+% \ifinPLcomment
+% \getpretty{#1}%
+% \else\ifinPLsingle
+% \getpretty{#1}%
+% \else\ifinPLdouble
+% \getprettydata{#1}%
+% \ifnum\prettytype=21
+% \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+% \else
+% \getpretty{#1}%
+% \fi
+% \else
+% \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+% \fi\fi\fi}
+
+\gdef\PLtypetwo#1%
+ {\endPLtypesix
+ \ifinPLdoc
+ \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+ \else\ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getprettydata{#1}%
+ \ifnum\prettytype=21
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \else
+ \getpretty{#1}%
+ \fi
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \fi\fi\fi\fi}
+
+\gdef\PLtypethree#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getprettydata{#1}%
+ \ifnum\prettytype=31
+ \ifx\PLprefix\empty
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi
+ \else
+ \getpretty{#1}%
+ \fi
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\PLtypefourone#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\doPLtypefourtwo#1#2%
+ {\PLverbosefalse
+ \getprettydata{#2}%
+ \ifnum\prettytype=62
+ \expandafter\PLtypetwo
+ \else
+ \expandafter\PLtypefourone
+ \fi
+ {#1}#2}
+
+\gdef\PLtypefourtwo%
+ {\handlenextnextpretty\doPLtypefourtwo\PLtypefourone}
+
+\gdef\doPLtypefiveA#1#2%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretties{#1}{#2}%
+ \else\ifinPLsingle
+ \getprettydata{#2}%
+ \ifnum\prettytype=50
+ \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty
+ \else\ifnum\prettytype=80
+ \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty
+ \else
+ \getpretties{#1}{#2}%
+ \fi\fi
+ \else
+ \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty
+ \fi\fi}
+
+\gdef\doPLtypefiveB#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\PLtypefive%
+ {\ifPLverbose
+ \expandafter\PLtypesixtwo
+ \else
+ \expandafter\handlenextnextpretty\expandafter\doPLtypefiveA\expandafter\doPLtypefiveB
+ \fi}
+
+% \gdef\endPLtypesix%
+% {\ifx\PLsequence\empty\else
+% \ifinPLcomment
+% \PLsequence
+% \else\ifinPLsingle
+% \PLsequence
+% \else\ifinPLdouble
+% \PLsequence
+% \else\ifPLverbose
+% \beginofpretty[\!!prettytwo]\PLsequence\endofpretty
+% \PLverbosefalse
+% \else\ifx\PLprefix\empty
+% \doifprettyidentifierelse{\PLsequence}{\PLverboses}
+% {\PLverbosetrue\PLverboseskipped=3 }
+% {\doifprettyidentifierelse{\PLsequence}{\PLidentifiers}
+% {\beginofpretty[\!!prettytwo]%
+% {\prettyidentifierfont\PLsequence}%
+% \endofpretty}
+% {\ifprettyPLvariables
+% \doifprettyidentifierelse{\PLsequence}{\PLvariables}
+% {\beginofpretty[\!!prettytwo]%
+% {\prettyvariablefont\PLsequence}%
+% \endofpretty}
+% {\PLsequence}%
+% \else
+% \PLsequence
+% \fi}}%
+% \else\ifprettyPLvariables
+% \doifprettyidentifierelse{\PLprefix\PLsequence}{\PLvariables}
+% {\beginofpretty[\!!prettytwo]%
+% {\prettyvariablefont\PLsequence}%
+% \endofpretty}
+% {\PLsequence}%
+% \else
+% \PLsequence
+% \fi\fi\fi\fi\fi\fi
+% \global\let\PLsequence=\empty
+% \global\let\PLprefix=\empty
+% \fi}
+
+\gdef\endPLtypesix
+ {\ifx\PLsequence\empty\else
+ \ifinPLdoc
+ \doendPLtypesixvar\!!prettythree
+ \else\ifinPLcomment
+ \PLsequence
+ \else\ifinPLsingle
+ \PLsequence
+ \else\ifinPLdouble
+ \PLsequence
+ \else\ifPLverbose
+ \beginofpretty[\!!prettytwo]\PLsequence\endofpretty
+ \PLverbosefalse
+ \else\ifx\PLprefix\empty
+ \doendPLtypesix\!!prettytwo
+ \else\ifprettyPLvariables
+ \doendPLtypesixvar\!!prettytwo
+ \else
+ \PLsequence
+ \fi\fi\fi\fi\fi\fi\fi
+ \global\let\PLsequence\empty
+ \global\let\PLprefix\empty
+ \fi}
+
+\gdef\doendPLtypesix#1%
+ {\doifprettyidentifierelse{\PLsequence}{\PLverboses}
+ {\PLverbosetrue\PLverboseskipped=3 }
+ {\doifprettyidentifierelse{\PLsequence}{\PLidentifiers}
+ {\beginofpretty[#1]%
+ {\prettyidentifierfont\PLsequence}%
+ \endofpretty}
+ {\ifprettyPLvariables
+ \doifprettyidentifierelse{\PLsequence}{\PLvariables}
+ {\beginofpretty[#1]%
+ {\prettyvariablefont\PLsequence}%
+ \endofpretty}
+ {\PLsequence}%
+ \else
+ \PLsequence
+ \fi}}}
+
+\gdef\doendPLtypesixvar#1%
+ {\doifprettyidentifierelse{\PLprefix\PLsequence}{\PLvariables}
+ {\beginofpretty[#1]%
+ {\prettyvariablefont\PLsequence}%
+ \endofpretty}
+ {\PLsequence}}
+
+\gdef\PLtypesixone
+ {\ifx\PLsequence\empty
+ \expandafter\getpretty
+ \else
+ \expandafter\PLtypesixtwo
+ \fi}
+
+% \gdef\PLtypesixtwo#1%
+% {\ifinPLcomment
+% \getpretty{#1}%
+% \else\ifinPLsingle
+% \getpretty{#1}%
+% \else\ifinPLdouble
+% \ifx\PLprefix\empty
+% \getpretty{#1}%
+% \else
+% \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+% \fi
+% \else
+% \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+% \fi\fi\fi}
+
+\gdef\PLtypesixtwo#1%
+ {\ifinPLdoc
+ \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+ \else\ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \ifx\PLprefix\empty
+ \getpretty{#1}%
+ \else
+ \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+ \fi
+ \else
+ \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+ \fi\fi\fi\fi}
+
+\gdef\PLtypesevenone#1%
+ {\endPLtypesix
+ \getpretty{#1}}
+
+\gdef\PLtypeseventwo%
+ {\handlenextnextpretty\doPLtypeseventwo\PLtypesevenone}
+
+\gdef\doPLtypeseventwo#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=72
+ \PLtypesixtwo{#1}\PLtypesixtwo{#1}%
+ \else
+ \PLtypesevenone{#1}\expandafter#2%
+ \fi}
+
+\gdef\PLtypeeight#1% single quote
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \global\inPLsinglefalse
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \else
+ \global\inPLsingletrue
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\PLtypenine#1% double quote
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \global\inPLdoublefalse
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \else
+ \global\inPLdoubletrue
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\PLtypezero%
+ {\endPLtypesix
+ \ifnewpretty\expandafter\handlenewpretty\fi\doPLtypezero}
+
+\gdef\doPLtypezero#1%
+ {\ifinPLcomment
+ \getpretty{#1}%
+ \else
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \ifnaturaltextext % non tested yet
+ \let\next\naturaltextext
+ \else
+ \def\next{\beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty}%
+ \fi
+ \expandafter\next
+ \fi}
+
+\gdef\doreportprettyPLtype#1#2#3#4%
+ {#1%
+ [PERL \string#2 typing conflict, use \string#3 instead]
+ \writestatus
+ {PERL typing}
+ {use \string#3 instead of \string#2 to enable propper visualization}%
+ \global#4%
+ \expandafter\doemptyverbatimline
+ \fi}
+
+\gdef\reportprettyPLtype%
+ {\doreportprettyPLtype\ifinPLsingle'\'\inPLsinglefalse
+ \doreportprettyPLtype\ifinPLdouble"\"\inPLdoublefalse}
+
+\gdef\PLsetdiagnostics%
+ {\let\normaldoemptyverbatimline=\doemptyverbatimline
+ \def\doemptyverbatimline%
+ {\normaldoemptyverbatimline
+ \reportprettyPLtype}}
+
+%D The official \PERL\ version 5 keywords:
+
+\useprettyidentifiers \PLidentifiers \PLsetspecials
+ abs accept alarm and atan atan2 bind binmode bless caller
+ chdir chmod chomp chop chown chr chroot close closedir cmp
+ connect continue cos crypt dbmclose dbmopen defined delete
+ die do dump each echo else elsif endgrent endhostent
+ endnetent endprotoend endpwent endservent eof eq eval exec
+ exists exit exp fcntl fileno flock for foreach fork format
+ formline getc getgrent getgrgid getgrnam gethostbyaddr
+ gethostbyname gethostent getlogin getnetbyaddr getnetbyname
+ getnetent getpeername getpgrp getppid getpriority
+ getprotobyname getprotobynumber getprotoent getpwent
+ getpwnam getpwuid getservbyname getservbyport getservent
+ getsockname getsockopt glob gmtime goto grep gt hex if
+ import index int integer ioctl join keys kill last lc
+ lcfirst le length lib link listen local localtime log lstat
+ lt map method mkdir msgctl msgget msgrcv msgsnd my ne next
+ no not oct open opendir or ord pack package pipe pop pos
+ print printf process prompt push quotemeta rand read readdir
+ readlink recv redo ref rename require reset return reverse
+ rewinddir rindex rmdir scalar seek seekdir select semctl
+ semget semop send setgrent sethostent setnetent setpgrp
+ setpriority setprotoent setpwent setservent setsockopt shift
+ shmctl shmget shmread shmwrite shutdown sin sleep socket
+ socketpair sort splice split sprintf sqrt srand stat strict
+ study sub subs substr symlink syscall sysopen sysread system
+ syswrite tell telldir tie tied time times times truncate uc
+ ucfirst ucmask umask unary undef unless unlink unpack
+ unshift untie until use utime values vars vec wait waitpid
+ wantarray warn warn while write xor
+
+%D Additional module keywords (still incomplete):
+
+\useprettyidentifiers \PLvariables \PLsetspecials
+ Getopt::Long
+ $Getopt::Long::passthrough
+ $Getopt::Long::autoabbrev
+ &GetOptions
+
+%D A funny hack. When prefixes by \type{TEX}, a \type{\csname}
+%D is typeset as \TEX\ sequence.
+
+\useprettyidentifiers \PLverboses \PLsetspecials
+ TEX
+
+\protect
+
+\endinput
diff --git a/tex/context/base/verb-raw.mkii b/tex/context/base/verb-raw.mkii
new file mode 100644
index 000000000..43a0891a0
--- /dev/null
+++ b/tex/context/base/verb-raw.mkii
@@ -0,0 +1,7 @@
+\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi
+
+\gdef\setupprettyRAWtype%
+ {\setupprettyTEXtype
+ \def\prettyidentifier{RAW}}
+
+\endinput
diff --git a/tex/context/base/verb-sql.mkii b/tex/context/base/verb-sql.mkii
new file mode 100644
index 000000000..f145607f8
--- /dev/null
+++ b/tex/context/base/verb-sql.mkii
@@ -0,0 +1,230 @@
+%D \module
+%D [ file=verb-sql,
+%D version=2000.05.09,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \SQL\ Verbatim,
+%D author={Berend de Boer \& Hans Hagen},
+%D date=\currentdate,
+%D copyright={Berend de Boer \& 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.
+
+\writestatus{loading}{ConTeXt Verbatim Macros / Pretty SQL Verbatim}
+
+%D \quotation {He, I want pretty pretting too!}, Berend cried out
+%D one day, \quotation {But now for \SQL.}. This query language
+%D shows code like:
+%D
+%D \startbuffer
+%D \startSQL
+%D select * -- some comment
+%D from tableA
+%D where 1 = 2
+%D \stopSQL
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D and this should become something pretty like:
+%D
+%D \getbuffer
+%D
+%D or, with Berend's preferences:
+%D
+%D \startbuffer[setup]
+%D \setuptyping
+%D [SQL]
+%D [text=yes,palet=,icommand=\bf,vcommand=,ccommand=\it]
+%D \stopbuffer
+%D
+%D \getbuffer[setup]
+%D \getbuffer
+%D
+%D This kind of pretty printing is accomplished by:
+%D
+%D \typebuffer
+
+%D Like we did with the \JAVASCRIPT\ driver, we will borrow
+%D most of the macros from the \PERL\ driver.
+
+\ifdefined\setupprettyPLtype \else \loadmarkfile{verb-pl} \fi
+
+\unprotect
+
+%D \SQL\ has the one line comment sequence \type{--} and the
+%D multi line comment delimiters \type{/*} and \type{*/}. The
+%D next counter keeps track of multi line comment nesting.
+
+\newcount\SQLcommentlevel
+
+%D We need to handle \type{%}, \type{#} and \type{-} a bit
+%D different than in the \PERL\ driver. Compared to the
+%D \JAVASCRIPT\ driver |<|we copied most of the code from
+%D that one|>|, we now also have type~45.
+
+\gdef\SQLsetspecials%
+ {\PLsetspecials
+ \setpretty`\#=32
+ \setpretty`\:=41
+ \setpretty`\%=41
+ \setpretty`\/=43
+ \setpretty`\*=44
+ \setpretty`\-=45 }
+
+%D We need three additional handlers:
+
+\gdef\SQLsethandlers%
+ {\PLsethandlers
+ \installprettyhandler 43 \SQLtypefourthree
+ \installprettyhandler 44 \SQLtypefourfour
+ \installprettyhandler 45 \SQLtypefourfive }
+
+%D Next we have to do some general housekeeping.
+
+\gdef\SQLsetcontrols%
+ {\PLsetcontrols
+ \def\flushrestofverbatimline%
+ {\endPLtypesix
+ \ifcase\SQLcommentlevel
+ \inPLcommentfalse
+ \verbatimfont
+ \fi
+ \PLverbosefalse
+ \PLverboseskipped=0}}
+
+\gdef\SQLsetvariables
+ {\PLsetvariables
+ \global\SQLcommentlevel=0 }
+
+\gdef\setupprettySQLtype%
+ {\def\prettyidentifier{SQL}%
+ \let\PLidentifiers=\SQLidentifiers
+ \let\PLvariables=\SQLvariables
+ \SQLsetvariables
+ \SQLsetcontrols
+ \SQLsethandlers
+ \SQLsetspecials
+ \PLsetdiagnostics}
+
+%D We have to look upto four characters ahead. If you don't
+%D grab the picture, just skip reading these macros.
+
+\gdef\SQLtypefourthree%
+ {\handlenextnextpretty\doSQLtypefourthree\PLtypefourtwo}
+
+\gdef\doSQLtypefourthree#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \let\next=\dodoSQLtypefourthree
+ \else\ifnum\prettytype=44
+ \global\advance\SQLcommentlevel by 1
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \let\next=\SQLtogglecomment
+ \else
+ \let\next=\PLtypefourtwo
+ \fi\fi
+ \next{#1}#2}
+
+\gdef\SQLtogglecomment#1#2%
+ {\ifnum\SQLcommentlevel=1
+ \prettynaturalfont
+ \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
+ \else
+ \getpretties{#1}{#2}%
+ \fi}
+
+\gdef\dodoSQLtypefourthree% #1%
+ {\endPLtypesix
+ \handlenextnextpretty\dododoSQLtypefourthree\dodododoPLtypefourthree}
+
+\gdef\dododoSQLtypefourthree%
+ {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoSQLtypefourthree}
+
+\gdef\dodododoSQLtypefourthree#1#2%
+ {\ifinPLcomment
+ \getpretties{#1}{#2}%
+ \else
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty
+ \fi}
+
+\gdef\SQLtypefourfour%
+ {\handlenextnextpretty\doSQLtypefourfour\PLtypefourtwo}
+
+\gdef\doSQLtypefourfour#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=43
+ \SQLtogglecomment{#1}#2%
+ \global\advance\SQLcommentlevel by -1
+ \ifcase\SQLcommentlevel
+ \global\inPLcommentfalse
+ \prettyverbatimfont
+ \fi
+ \else
+ \endPLtypesix
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \expandafter#2%
+ \fi}
+
+%D Much of the indirect calls (\type {dodo..}) is due to
+%D looking ahead as well as midway pretty print changing.
+
+\gdef\SQLtypefourfive%
+ {\handlenextnextpretty\doSQLtypefourfive\PLtypefourtwo}
+
+\gdef\doSQLtypefourfive#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=45
+ \let\next=\dodoSQLtypefourfive
+ \else
+ \let\next=\PLtypefourtwo
+ \fi
+ \next{#1}#2}
+
+\gdef\dodoSQLtypefourfive% #1%
+ {\endPLtypesix
+ \handlenextnextpretty\dododoSQLtypefourfive\dodododoPLtypefourfive}
+
+\gdef\dododoSQLtypefourfive%
+ {\ifnewpretty\expandafter\handlenewpretty\fi\dodododoSQLtypefourfive}
+
+\gdef\dodododoSQLtypefourfive#1#2%
+ {\ifinPLcomment
+ \getpretties{#1}{#2}%
+ \else
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \ifnaturaltextext
+ \let\next\naturaltextext
+ \else
+ \prettynaturalfont
+ \def\next{\beginofpretty[\!!prettyone]\getpretties{#1}{#2}\endofpretty}%
+ \fi
+ \expandafter\next
+ \fi}
+
+%D We need a different list of reserved words. This list
+%D replaces the \PERL\ one.
+
+\useprettyidentifiers \SQLidentifiers \SQLsetspecials
+ add all alter and any as asc avg begin between break
+ browse bulk by cascade case check close clustered coalesce
+ column commit constraint contains count create cross
+ cursor database default delete desc distinct drop else end
+ exec execute exists exit fetch for foreign from grant
+ group having if in index inner insert into is join key
+ left like max min nocheck nonclustered not null of on open
+ or order outer over plan prepare proc procedure public
+ references return revoce right rollback rule select set
+ sum table then to tran transaction trigger truncate
+ uncommited union unique update use values varying view
+ when where while with work primary
+
+\useprettyidentifiers \SQLvariables \SQLsetspecials
+ not-yet-defined
+
+\protect \endinput
diff --git a/tex/context/base/verb-tex.mkii b/tex/context/base/verb-tex.mkii
new file mode 100644
index 000000000..75e99fcef
--- /dev/null
+++ b/tex/context/base/verb-tex.mkii
@@ -0,0 +1,294 @@
+%D \module
+%D [ file=verb-tex,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \TEX\ verbatim,
+%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 Verbatim Macros / Pretty TEX Verbatim}
+
+%D The original module \type{supp-ver} had the \TEX\
+%D interpreter built in. The current implementation is more
+%D natural and less complicated.
+
+%D \startTEX
+%D \definetyping[niceTEX][option=TEX,paletpalet=graypretty]
+%D
+%D \startniceTEX
+%D \message{A vivid look at TeX}
+%D \stopniceTEX
+%D \stopTEX
+
+\unprotect
+
+%D \macros
+%D {ifsplitTEXparameters}
+%D
+%D The mechanism described here, is meant to be used with
+%D color. It is nevertheless possible to use different fonts
+%D instead of distinctive colors. When using color, it's better
+%D to end parameter mode after the \type{#}. When on the
+%D other hand we use a slanted typeface for the hashmark, then
+%D a slanted number looks better.
+
+\doglobal\newif\ifsplitTEXparameters \global\splitTEXparameterstrue
+
+%D \macros
+%D {ifsplitTEXcontrols}
+%D
+%D With \type{\splittexcontrols} we can influence the way
+%D control characters are processed in macro names. By default,
+%D the \type{^^} part is uncolored. When this boolean is set to
+%D false, they get the same color as the other characters.
+
+\doglobal\newif\ifsplitTEXcontrols \global\splitTEXcontrolstrue
+
+%D The next boolean is used for internal purposes only and
+%D keeps track of the length of the name. Because two||character
+%D sequences starting with a backslash are always seen as a
+%D command.
+
+\doglobal\newif\iffirstinTEXcommand
+
+%D We use a maximum of four colors because more colors will
+%D distract too much. In the following table we show the
+%D logical names of the colors, their color and \cap{RGB} values.
+%D
+%D \placetable{geen}
+%D \starttable[|l|l|c|c|c|c|]
+%D \HL
+%D \FC\bf identifier \MC\bf color \MC\bf r \MC\bf g \MC\bf b \MC\bf bw \LC\SR
+%D \HL
+%D \FC prettyone \MC red \MC 0.9 \MC 0.0 \MC 0.0 \MC 0.30 \LC\FR
+%D \FC prettytwo \MC green \MC 0.0 \MC 0.8 \MC 0.0 \MC 0.45 \LC\MR
+%D \FC prettythree \MC yellow \MC 0.0 \MC 0.0 \MC 0.9 \MC 0.60 \LC\MR
+%D \FC prettyfour \MC blue \MC 0.8 \MC 0.8 \MC 0.6 \MC 0.75 \LC\LR
+%D \HL
+%D \stoptable
+%D
+%D Outside \CONTEXT\ these colors are defined in
+%D \type{verb-ini}, in \CONTEXT\ their definitions can be found
+%D in \type{core-ver}, where in fact we use the color palet
+%D mechanism. That way we can use different schemes i a quite
+%D natural way.
+
+\gdef\setupprettyTEXtype
+ {\def\prettyidentifier{TEX}%
+ \global\inTEXcommandfalse
+ \global\firstinTEXcommandfalse
+ \global\inTEXparameterfalse
+ \TEXsetcontrols
+ \TEXsethandlers
+ \TEXsetspecials}
+
+\gdef\TEXsetcontrols
+ {\saveprettycontrols
+ \everyprettyend
+ {\TEXendofcommand
+ \TEXendofparameter}%
+ \def\obeyedspace
+ {\TEXendofcommand
+ \TEXendofparameter
+ \oldobeyedspace}%
+ \def\flushrestofverbatimline
+ {\TEXendofcommand
+ \TEXendofparameter}%
+ \let\obeytabs=\ignoretabs}
+
+\gdef\TEXsetspecials
+ {\setpretty`\$=1 \setpretty`\{=1 \setpretty`\}=1
+ \setpretty`\[=2 \setpretty`\]=2 \setpretty`\(=2 \setpretty`\)=2
+ \setpretty`\==2 \setpretty`\<=2 \setpretty`\>=2 \setpretty`\"=2
+ \setpretty`\-=3 \setpretty`\+=3 \setpretty`\/=3
+ \setpretty`\|=3 \setpretty`\%=3 \setpretty`\'=3 \setpretty`\`=3
+ \setpretty`\_=3 \setpretty`\&=3 \setpretty`\~=3
+ \setpretty`\.=4 \setpretty`\,=4 \setpretty`\:=4 \setpretty`\;=4 \setpretty`\*=4
+ \setpretty`\#=5
+ \setpretty`\1=6 \setpretty`\2=6 \setpretty`\3=6 \setpretty`\4=6 \setpretty`\5=6
+ \setpretty`\6=6 \setpretty`\7=6 \setpretty`\8=6 \setpretty`\9=6 \setpretty`\0=6
+ \setpretty`\\=7
+ \setpretty`\^=8
+ \setpretty`\A=9 \setpretty`\B=9 \setpretty`\C=9 \setpretty`\D=9 \setpretty`\E=9
+ \setpretty`\F=9 \setpretty`\G=9 \setpretty`\H=9 \setpretty`\I=9 \setpretty`\J=9
+ \setpretty`\K=9 \setpretty`\L=9 \setpretty`\M=9 \setpretty`\N=9 \setpretty`\O=9
+ \setpretty`\P=9 \setpretty`\Q=9 \setpretty`\R=9 \setpretty`\S=9 \setpretty`\T=9
+ \setpretty`\U=9 \setpretty`\V=9 \setpretty`\W=9 \setpretty`\X=9 \setpretty`\Y=9
+ \setpretty`\Z=9
+ \setpretty`\a=9 \setpretty`\b=9 \setpretty`\c=9 \setpretty`\d=9 \setpretty`\e=9
+ \setpretty`\f=9 \setpretty`\g=9 \setpretty`\h=9 \setpretty`\i=9 \setpretty`\j=9
+ \setpretty`\k=9 \setpretty`\l=9 \setpretty`\m=9 \setpretty`\n=9 \setpretty`\o=9
+ \setpretty`\p=9 \setpretty`\q=9 \setpretty`\r=9 \setpretty`\s=9 \setpretty`\t=9
+ \setpretty`\u=9 \setpretty`\v=9 \setpretty`\w=9 \setpretty`\x=9 \setpretty`\y=9
+ \setpretty`\z=9
+ \setpretty`\?=9 \setpretty`\!=9 \setpretty`\@=9
+ \setpretty`\%=0 }
+
+\gdef\TEXsethandlers
+ {\installprettyhandler 1 \TEXtypeone
+ \installprettyhandler 2 \TEXtypetwo
+ \installprettyhandler 3 \TEXtypethree
+ \installprettyhandler 4 \TEXtypefour
+ \installprettyhandler 5 \TEXtypefive
+ \installprettyhandler 6 \TEXtypesix
+ \installprettyhandler 7 \TEXtypeseven
+ \installprettyhandler 8 \TEXtypeeight
+ \installprettyhandler 9 \TEXtypenine
+ \installprettyhandler 0 \TEXtypezero}
+
+\doglobal\newif\ifinTEXcommand
+\doglobal\newif\ifinTEXparameter
+
+\gdef\TEXbeginofcommand
+ {\TEXendofparameter
+ \ifinTEXcommand
+ \else
+ \global\inTEXcommandtrue
+ \global\firstinTEXcommandtrue
+ \beginofpretty[\!!prettytwo]%
+ \fi}
+
+\gdef\TEXendofcommand
+ {\ifinTEXcommand
+ \endofpretty
+ \global\inTEXcommandfalse
+ \global\firstinTEXcommandfalse
+ \fi}
+
+\gdef\TEXbeginofparameter
+ {\TEXendofcommand
+ \ifinTEXparameter
+ \else
+ \global\inTEXparametertrue
+ \beginofpretty[\!!prettythree]%
+ \fi}
+
+\gdef\TEXendofparameter
+ {\ifinTEXparameter
+ \endofpretty
+ \global\inTEXparameterfalse
+ \fi}
+
+\gdef\ifnotfirstinTEXcommand#1
+ {\iffirstinTEXcommand
+ \getpretty{#1}%
+ \TEXendofcommand
+ \else}
+
+\gdef\TEXtypeone#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\TEXtypetwo#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\TEXtypethree#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\TEXtypefour#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \getpretty{#1}%
+ \fi}
+
+\gdef\TEXtypefive#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXbeginofparameter
+ \getpretty{#1}%
+ \fi}
+
+\gdef\TEXtypesix#1%
+ {\ifnotfirstinTEXcommand#1
+ \ifinTEXparameter
+ \ifsplitTEXparameters
+ \TEXendofparameter
+ \getpretty{#1}%
+ \else
+ \getpretty{#1}%
+ \TEXendofparameter
+ \fi
+ \else
+ \TEXendofcommand
+ \getpretty{#1}%
+ \fi
+ \fi}
+
+\gdef\TEXtypeseven#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXbeginofcommand
+ \getpretty{#1}%
+ \fi}
+
+\gdef\TEXtypeeightA#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=80
+ \TEXendofparameter
+ \ifsplitTEXcontrols
+ \ifinTEXcommand
+ \def\next{\TEXendofcommand\getpretty{#1}\getpretty{#1}\TEXbeginofcommand}%
+ \else
+ \def\next{\getpretty{#1}\getpretty{#1}}%
+ \fi
+ \else
+ \def\next{\getpretty{#1}\getpretty{#1}}%
+ \fi
+ \else
+ \def\next{\TEXtypeeightB{#1}#2}%
+ \fi
+ \next}
+
+\gdef\TEXtypeeightB
+ {\TEXendofparameter
+ \ifinTEXcommand
+ \firstinTEXcommandfalse
+ \expandafter\getpretty
+ \else
+ \expandafter\TEXtypethree
+ \fi}
+
+\gdef\TEXtypeeight
+ {\handlenextnextpretty\TEXtypeeightA\TEXtypeeightB}
+
+\gdef\TEXtypenine
+ {\TEXendofparameter
+ \global\firstinTEXcommandfalse
+ \getpretty}
+
+%\gdef\TEXtypezero
+% {\disableprettyafterwards % only when enabled of course
+% \ifnewpretty\expandafter\handlenewpretty\fi\TEXtypethree}
+
+\long\gdef\naturalTEXtext#1#2\relax% local alternative for \naturaltextext
+ {\convertargument#2\to\ascii
+ \doifinstringelse{\letterpercent}{\ascii}
+ {\long\def\next{\TEXtypethree{#1}#2\relax}}
+ %{\long\def\next{\bgroup\prettynaturalfont\restorecatcodes\scantokens{\ignorespaces#2}\egroup}}%
+ {\long\def\next{\bgroup\prettynaturalfont{\restorecatcodes\scantokens{\ignorespaces#2}}\egroup}}%
+ \next}
+
+\gdef\TEXtypezero
+ {\ifnaturaltextext
+ \expandafter\naturalTEXtext
+ \else
+ \disableprettyafterwards % only when enabled of course
+ \expandafter\handlenewpretty\expandafter\TEXtypethree
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/verb-xml.mkii b/tex/context/base/verb-xml.mkii
new file mode 100644
index 000000000..dbf6635f6
--- /dev/null
+++ b/tex/context/base/verb-xml.mkii
@@ -0,0 +1,441 @@
+%D \module
+%D [ file=verb-xml,
+%D version=2000.05.09,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty XML verbatim,
+%D author=Berend de Boer,
+%D date=2000.05.08,
+%D copyright={Berend de Boer \& 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.
+
+% This module will be cleaned up a bit in the process of more
+% flexible verbatim options.
+
+\writestatus{loading}{ConTeXt Verbatim Macros / Pretty XML Verbatim}
+
+\unprotect
+
+%D Formats XML more or less like XMLWriter (http://XMLwriter.net)
+%D does.
+%D
+%D Known bugs:
+%D - CDATA not handled yet.
+%D
+%D Expects well-formed XML. Else parsing errors may occur, because
+%D this XML state machine is not robust.
+%D
+%D Examples:
+%D
+%D \startXML
+%D <?xml version="1.0" encoding="ISO-8859-1" ?>
+%D <!-- comment: example of a <resource> tag -->
+%D <resources>
+%D <resource id="5">
+%D <capacity>
+%D <kind>1</kind>
+%D <value>100</value>
+%D </capacity>
+%D </resource>
+%D </resources>
+%D \stopXML
+%D
+%D Another format:
+%D
+%D \startXML
+%D <?xml version="1.0" encoding="ISO-8859-1" ?>
+%D <address id="10"/>
+%D \stopXML
+%D
+%D A typical setup:
+%D
+%D \setuptyping[XML]
+%D [margin=1cm,
+%D before={\switchtobodyfont[9pt]\blank[medium]},
+%D after={\switchtobodyfont[11pt]\blank[medium]},
+%D style=\ss]
+%D
+
+\ifx\XMLlinebreak\undefined
+ \gdef\XMLlinebreak{\ifhmode\allowbreak\fi} % new, often long lines
+\fi
+
+\doglobal\newif\ifXMLmarkkeys \global\XMLmarkkeystrue
+
+\gdef\setupprettyXMLtype%
+ {\def\prettyidentifier{XML}%
+ \XMLsetvariables
+ \XMLsetcontrols
+ \XMLsetspecials
+ \XMLsethandlers}
+
+\gdef\XMLsetvariables
+ {\global\inXMLpifalse
+ \global\inXMLtagfalse
+ \global\inXMLvaluefalse
+ \global\inXMLspecialfalse
+ \global\inXMLcommentfalse
+ \global\inXMLtagnamefalse
+ \global\inXMLattributefalse
+ \global\inXMLentityfalse}
+
+\gdef\XMLsetcontrols%
+ {\saveprettycontrols
+ \def\obeyedspace%
+ {\ifinXMLvalue
+ \else % more tests ?
+ \XMLstartattribute
+ \fi
+ \oldobeyedspace
+ \XMLlinebreak}%
+ \def\flushrestofverbatimline%
+ {\endXMLtagname}%
+ \let\obeytabs=\ignoretabs}
+
+\gdef\XMLsetspecials%
+ {\setpretty`\<=10 \setpretty`\>=11
+ \setpretty`\?=12 \setpretty`\/=13
+ \setpretty`\!=14 \setpretty`\-=15
+ \setpretty`\\=17
+ \setpretty`\0=17
+ \setpretty`\1=17 \setpretty`\2=17 \setpretty`\3=17
+ \setpretty`\4=17 \setpretty`\5=17 \setpretty`\6=17
+ \setpretty`\7=17 \setpretty`\8=17 \setpretty`\9=17
+ \setpretty`\==16
+ \setpretty`\"=20
+ \setpretty`\(=31 \setpretty`\)=31 \setpretty`\,=31
+ \setpretty`\*=31 \setpretty`\+=31 \setpretty`\#=31
+ \setpretty`\:=32
+ \setpretty`\&=41 \setpretty`\;=42 }
+
+\gdef\XMLsethandlers%
+ {\installprettyhandler 17 \XMLnormal
+ \installprettyhandler 10 \XMLwhattag
+ \installprettyhandler 11 \XMLstoptag
+ \installprettyhandler 12 \XMLtypeonetwo
+ \installprettyhandler 13 \XMLtypeonethree
+ \installprettyhandler 14 \XMLtypeonefour
+ \installprettyhandler 15 \XMLtypeonefive
+ \installprettyhandler 16 \XMLtypeonesix
+ \installprettyhandler 20 \XMLdoublequote
+ \installprettyhandler 31 \XMLtypethreeone
+ \installprettyhandler 32 \XMLtypethreetwo
+ \installprettyhandler 41 \XMLbampersand
+ \installprettyhandler 42 \XMLeampersand }
+
+\doglobal\newif\ifinXMLpi
+\doglobal\newif\ifinXMLtag
+\doglobal\newif\ifinXMLvalue
+\doglobal\newif\ifinXMLspecial
+\doglobal\newif\ifinXMLcomment
+\doglobal\newif\ifinXMLtagname
+\doglobal\newif\ifinXMLattribute
+\doglobal\newif\ifinXMLentity
+
+% the list of actions to be executed per state
+
+% test if we have a normal tag, processing instruction or a special,
+% i.e. <, <? or <!
+
+\gdef\XMLnormal#1{\getpretty{#1}}
+
+\gdef\XMLwhattag%
+ {\handlenextnextpretty\XMLdowhattag\XMLstarttag}
+
+\gdef\XMLdowhattag#1#2%
+ {\ifinXMLcomment
+ \let\next=\getpretties
+ \else
+ \getprettydata{#2}%
+ \ifnum\prettytype=12 % ?
+ \let\next=\XMLstartpi
+ \else\ifnum\prettytype=14 % !
+ \let\next=\XMLstartspecial
+ \else
+ \let\next=\XMLstarttag
+ \fi\fi
+ \fi
+ \next{#1}{#2}}
+
+% formats <?
+
+\gdef\XMLstartpi#1#2%
+ {\beginofpretty[\!!prettythree]\getpretties{#1}{#2}\endofpretty%
+ \global\inXMLtagtrue
+ \global\inXMLpitrue
+ \global\inXMLtagnametrue
+ \beginofpretty[\!!prettyone]}
+
+% format <!, <!--, <!DOCTYPE, <![CDATA[ and such
+
+\gdef\XMLstartspecial#1#2%
+ {\beginofpretty[\!!prettythree]\getpretties{#1}{#2}\endofpretty%
+ \global\inXMLtagtrue
+ \global\inXMLspecialtrue
+ \global\inXMLtagnametrue
+ \beginofpretty[\!!prettyone]}
+
+% formats plain <
+
+\gdef\XMLstarttag#1%
+ {\XMLlinebreak
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \global\inXMLtagtrue
+ \global\inXMLtagnametrue
+ \beginofpretty[\!!prettyone]}
+
+
+% catch >
+
+\gdef\XMLstoptag#1%
+ {\ifinXMLcomment
+ \getpretty{#1}%
+ \else
+ \ifinXMLvalue
+ \getpretty{#1}%
+ \else
+ \endXMLtagname
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \doXMLstoptag
+ \XMLlinebreak
+ \fi
+ \fi}
+
+\gdef\doXMLstoptag%
+ {\global\inXMLpifalse % either end process instruction
+ \global\inXMLspecialfalse % or special
+ \global\inXMLtagfalse % tag ends always
+ \global\inXMLtagnamefalse} % just to be sure
+
+% end typeset name of tag
+% because called often, we also use it to end the default
+% attribute color.
+
+\gdef\endXMLtagname%
+ {\ifinXMLtagname
+ \endofpretty
+ \inXMLtagnamefalse
+ \else
+ \XMLstopattribute
+ \fi}
+
+% start attribute formatting inside a tag if applicable
+
+\gdef\XMLstartattribute%
+ {\ifinXMLcomment \else
+ \ifinXMLpi
+ \ifXMLmarkkeys\else\endXMLtagname\fi % option
+ \else
+ \endXMLtagname
+ \ifinXMLtag
+ \doXMLstartattribute
+ \fi
+ \fi
+ \fi}
+
+\gdef\XMLstopattribute%
+ {\ifinXMLattribute
+ \endofpretty
+ \inXMLattributefalse
+ \fi}
+
+\gdef\doXMLstartattribute
+ {\inXMLattributetrue
+ \beginofpretty[\!!prettythree]}
+
+% `?' character, needed to recognize ?>
+
+\gdef\XMLtypeonetwo%
+ {\endXMLtagname
+ \handlenextnextpretty\doXMLtypeonetwo\doXMLout}
+
+\gdef\doXMLtypeonetwo#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=11 % >
+ \expandafter\dododoXMLtypeonetwo
+ \else % treat as `green' character
+ \expandafter\XMLtypethreeone
+ \fi
+ {#1}#2}
+
+\gdef\dododoXMLtypeonetwo#1#2%
+ {\ifinXMLcomment
+ \getpretties{#1}{#2}%
+ \else
+ \ifinXMLtag
+ \ifinXMLvalue
+ \getpretties{#1}{#2}%
+ \else
+ \ifinXMLpi
+ \beginofpretty[\!!prettythree]\getpretties{#1}{#2}\endofpretty
+ \else % treat as green character
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \beginofpretty[\!!prettythree]#2\endofpretty
+ \fi
+ \doXMLstoptag
+ \fi
+ \else
+ \getpretties{#1}{#2}%
+ \fi
+ \fi}
+
+% '/' character, catch /> and </, do nothing else
+
+\gdef\XMLtypeonethree#1%
+ {\ifinXMLcomment
+ \getpretty{#1}%
+ \else
+ \ifinXMLtag
+ \ifinXMLvalue
+ \getpretty{#1}%
+ \else
+ \endofpretty
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \beginofpretty[\!!prettyone]%
+ \fi
+ \else
+ \getpretty{#1}%
+ \fi
+ \fi}
+
+% used to parse <!
+
+\gdef\XMLtypeonefour#1%
+ {\getpretty{#1}}
+
+% used to parse <!-- and -->
+% when <! is parsed we already assumed this is a comment
+% when -- is encountered, we only need to see if --> is ahead
+% so the comment can stop.
+
+\gdef\XMLtypeonefive%
+ {\handlenextnextpretty\doXMLtypeonefive\doXMLout}
+
+\gdef\doXMLtypeonefive#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=15
+ \ifinXMLcomment
+ \let\next=\dodoXMLtypeonefive
+ \else
+ \ifinXMLspecial
+ \let\next=\startXMLcomment
+ \else
+ \let\next=\doXMLouttwo
+ \fi
+ \fi
+ \else
+ \let\next=\doXMLouttwo
+ \fi
+ \next{#1}#2}
+
+\gdef\startXMLcomment#1#2%
+ {\beginofpretty[\!!prettythree]\getpretties{#1}{#2}\endofpretty
+ \beginofpretty[\!!prettyfour]%
+ \global\inXMLcommenttrue}
+
+\gdef\dodoXMLtypeonefive#1% encountered -
+ {\def\prev{#1}\handlenextnextpretty\dododoXMLtypeonefive\doXMLout}
+
+\gdef\nodoXMLtypeonefive% encountered -
+ {\getpretty{\prev}\doXMLout}
+
+\gdef\dododoXMLtypeonefive#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=11
+ \endofpretty\getpretty{\prev}#1\empty\global\inXMLcommentfalse#2%
+ \else
+ \getpretty{\prev}#1#2%
+ \fi}
+
+\global\let\doXMLout \getpretty
+\global\let\doXMLouttwo\getpretties
+
+% '=' inside tags needs to be blue
+
+\gdef\XMLtypeonesix#1%
+ {\ifinXMLtag
+ \endofpretty
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \beginofpretty[\!!prettyone]%
+ \else
+ \getpretty{#1}%
+ \fi}
+
+% catch attribute value parts
+
+\gdef\XMLdoublequote#1%
+ {\ifinXMLcomment
+ \getpretty{#1}%
+ \else
+ \ifinXMLtag
+ \ifinXMLvalue
+ \global\inXMLvaluefalse
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \ifXMLmarkkeys\beginofpretty[\!!prettyone]\fi
+ \else
+ \endofpretty
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \global\inXMLvaluetrue
+ \fi
+ \else
+ \getpretty{#1}%
+ \fi
+ \fi}
+
+% symbols like `(', `)' and `,' should be green
+
+\gdef\XMLtypethreeone#1%
+ {\ifinXMLcomment
+ \getpretty{#1}%
+ \else
+ \ifinXMLtag
+ \endXMLtagname
+ \ifinXMLvalue
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \XMLstartattribute% again
+ \fi
+ \else
+ \getpretty{#1}%
+ \fi
+ \fi}
+
+% \gdef\XMLtypethreetwo#1%
+% {\ifinXMLcomment
+% \getpretty{#1}%
+% \else
+% \ifinXMLtagname
+% \endofpretty
+% \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+% \beginofpretty[\!!prettyone]%
+% \else
+% \getpretty{#1}%
+% \fi
+% \fi}
+
+\gdef\XMLtypethreetwo#1%
+ {\getpretty{#1}}
+
+% special characters with `&'
+
+\gdef\XMLbampersand#1%
+ {\ifinXMLcomment
+ \getpretty{#1}%
+ \else
+ \endXMLtagname
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \global\inXMLentitytrue
+ \fi}
+
+\gdef\XMLeampersand#1%
+ {\ifinXMLcomment
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \global\inXMLentityfalse
+ \fi}
+
+\protect \endinput
diff --git a/tex/context/base/x-asciimath.lua b/tex/context/base/x-asciimath.lua
new file mode 100644
index 000000000..c2b15e313
--- /dev/null
+++ b/tex/context/base/x-asciimath.lua
@@ -0,0 +1,267 @@
+if not modules then modules = { } end modules ['x-asciimath'] = {
+ version = 1.001,
+ comment = "companion to x-asciimath.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Some backgrounds are discussed in <t>x-asciimath.mkiv</t>.</p>
+--ldx]]--
+
+local trace_mapping = false if trackers then trackers.register("asciimath.mapping", function(v) trace_mapping = v end) end
+
+local format = string.format
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local lpegmatch = lpeg.match
+
+local S, P, R, C, V, Cc, Ct, Cs = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct, lpeg.Cs
+
+local letter = lpeg.patterns.utf8
+local space = S(" \n\r\t")
+local spaces = space^0/""
+local integer = P("-")^-1 * R("09")^1
+local realpart = P("-")^-1 * R("09")^1 * S(".")^1 * R("09")^1
+local number = integer -- so we can support nice formatting if needed
+local real = realpart -- so we can support nice formatting if needed
+local float = realpart * P("E") * integer -- so we can support nice formatting if needed
+local texnic = P("\\") * (R("az","AZ")^1)
+
+local premapper = Cs ( (
+
+ P("@") / "\\degrees " +
+ P("O/") / "\\varnothing " +
+ P("o+") / "\\oplus " +
+ P("o.") / "\\ocirc " +
+ P("!in") / "\\not\\in " +
+ P("!=") / "\\neq " +
+ P("**") / "\\star " +
+ P("*") / "\\cdot " +
+ P("//") / "\\slash " +
+ P("/_") / "\\angle " +
+ P("\\\\") / "\\backslash " +
+ P("^^^") / "\\wedge " +
+ P("^^") / "\\wedge " +
+ P("<<") / "\\left\\langle " +
+ P(">>") / "\\right\\rangle " +
+ P("<=") / "\\leq " +
+ P(">=") / "\\geq " +
+ P("-<") / "\\precc " +
+ P(">-") / "\\succ " +
+ P("~=") / "\\cong " +
+ P("~~") / "\\approx " +
+ P("=>") / "\\Rightarrow " +
+ P("(:") / "\\left\\langle " +
+ P(":)") / "\\right\\rangle " +
+ P(":.") / "\\therefore " +
+ P("~|") / "\\right\\rceil " +
+ P("_|_") / "\\bot " +
+ P("_|") / "\\right\\rfloor " +
+ P("+-") / "\\pm " +
+ P("|--") / "\\vdash " +
+ P("|==") / "\\models " +
+ P("|_") / "\\left\\lfloor " +
+ P("|~") / "\\left\\lceil " +
+ P("-:") / "\\div " +
+ P("_=") / "\\equiv " +
+
+ P("|") / "\\middle\\| " +
+
+ P("dx") / "(dx)" +
+ P("dy") / "(dy)" +
+ P("dz") / "(dz)" +
+
+ letter + P(1)
+
+)^0 )
+
+local reserved = {
+ ["aleph"] = "\\aleph ",
+ ["vdots"] = "\\vdots ",
+ ["ddots"] = "\\ddots ",
+ ["oint"] = "\\oint ",
+ ["grad"] = "\\nabla ",
+ ["prod"] = "\\prod ",
+ ["prop"] = "\\propto ",
+ ["sube"] = "\\subseteq ",
+ ["supe"] = "\\supseteq ",
+ ["sinh"] = "\\sinh ",
+ ["cosh"] = "\\cosh ",
+ ["tanh"] = "\\tanh ",
+ ["sum"] = "\\sum ",
+ ["vvv"] = "\\vee ",
+ ["nnn"] = "\\cap ",
+ ["uuu"] = "\\cup ",
+ ["sub"] = "\\subset ",
+ ["sup"] = "\\supset ",
+ ["not"] = "\\lnot ",
+ ["iff"] = "\\Leftrightarrow ",
+ ["int"] = "\\int ",
+ ["del"] = "\\partial ",
+ ["and"] = "\\and ",
+ ["not"] = "\\not ",
+ ["sin"] = "\\sin ",
+ ["cos"] = "\\cos ",
+ ["tan"] = "\\tan ",
+ ["csc"] = "\\csc ",
+ ["sec"] = "\\sec ",
+ ["cot"] = "\\cot ",
+ ["log"] = "\\log ",
+ ["det"] = "\\det ",
+ ["lim"] = "\\lim ",
+ ["mod"] = "\\mod ",
+ ["gcd"] = "\\gcd ",
+ ["lcm"] = "\\lcm ",
+ ["min"] = "\\min ",
+ ["max"] = "\\max ",
+ ["xx"] = "\\times ",
+ ["in"] = "\\in ",
+ ["ox"] = "\\otimes ",
+ ["vv"] = "\\vee ",
+ ["nn"] = "\\cap ",
+ ["uu"] = "\\cup ",
+ ["oo"] = "\\infty ",
+ ["ln"] = "\\ln ",
+ ["or"] = "\\or ",
+
+ ["AA"] = "\\forall ",
+ ["EE"] = "\\exists ",
+ ["TT"] = "\\top ",
+ ["CC"] = "\\Bbb{C}",
+ ["NN"] = "\\Bbb{N}",
+ ["QQ"] = "\\Bbb{Q}",
+ ["RR"] = "\\Bbb{R}",
+ ["ZZ"] = "\\Bbb{Z}",
+
+}
+
+local postmapper = Cs ( (
+
+ P("\\mathoptext ") * spaces * (P("\\bgroup ")/"{") * (1-P("\\egroup "))^1 * (P("\\egroup ")/"}") +
+
+ (P("\\bgroup ")) / "{" +
+ (P("\\egroup ")) / "}" +
+
+ P("\\") * (R("az","AZ")^2) +
+
+ (R("AZ","az")^2) / reserved +
+
+ P("{:") / "\\left." +
+ P(":}") / "\\right." +
+ P("(") / "\\left(" +
+ P(")") / "\\right)" +
+ P("[") / "\\left[" +
+ P("]") / "\\right]" +
+ P("{") / "\\left\\{" +
+ P("}") / "\\right\\}" +
+
+ letter + P(1)
+)^0 )
+
+local parser
+
+local function converted(original,totex)
+ local ok, result
+ if trace_mapping then
+ logs.report("asciimath","original : %s",original)
+ end
+ local premapped = lpegmatch(premapper,original)
+ if premapped then
+ if trace_mapping then
+ logs.report("asciimath","prepared : %s",premapped)
+ end
+ local parsed = lpegmatch(parser,premapped)
+ if parsed then
+ if trace_mapping then
+ logs.report("asciimath","parsed : %s",parsed)
+ end
+ local postmapped = lpegmatch(postmapper,parsed)
+ if postmapped then
+ if trace_mapping then
+ logs.report("asciimath","finalized : %s",postmapped)
+ end
+ result, ok = postmapped, true
+ else
+ result = "error in postmapping"
+ end
+ else
+ result = "error in mapping"
+ end
+ else
+ result = "error in premapping"
+ end
+ if totex then
+ if ok then
+ texsprint(ctxcatcodes,"\\mathematics{",result,"}")
+ else
+ texsprint(ctxcatcodes,"{\\tt",result,"}")
+ end
+ else
+ return result
+ end
+end
+
+local function onlyconverted(str)
+ local parsed = lpegmatch(parser,str)
+ return parsed or str
+end
+
+local sqrt = P("sqrt") / "\\rootradical \\bgroup \\egroup "
+local root = P("root") / "\\rootradical "
+local frac = P("frac") / "\\frac "
+local stackrel = P("stackrel") / "\\stackrel "
+local text = P("text") / "\\mathoptext "
+local hat = P("hat") / "\\widehat "
+local overbar = P("bar") / "\\overbar "
+local underline = P("ul") / "\\underline "
+local vec = P("vec") / "\\overrightarrow "
+local dot = P("dot") / "\\dot "
+local ddot = P("ddot") / "\\ddot "
+
+local left = P("(:") + P("{:") + P("(") + P("[") + P("{")
+local right = P(":)") + P(":}") + P(")") + P("]") + P("}")
+local leftnorright = 1 - left - right
+local singles = sqrt + text + hat + underline + overbar + vec + ddot + dot
+local doubles = root + frac + stackrel
+local ignoreleft = (left/"") * spaces * spaces
+local ignoreright = spaces * (right/"") * spaces
+local ignoreslash = spaces * (P("/")/"") * spaces
+local comma = P(",")
+local nocomma = 1-comma
+local anychar = P(1)
+local openmatrix = left * spaces * Cc("\\matrix\\bgroup ")
+local closematrix = Cc("\\egroup ") * spaces * right
+local nextcolumn = spaces * (comma/"&") * spaces
+local nextrow = spaces * (comma/"\\cr ") * spaces
+local finishrow = Cc("\\cr ")
+local opengroup = left/"\\bgroup "
+local closegroup = right/"\\egroup "
+local somescript = S("^_") * spaces
+local beginargument = Cc("\\bgroup ")
+local endargument = Cc("\\egroup ")
+
+parser = Cs { "main",
+
+ scripts = somescript * V("argument"),
+ division = Cc("\\frac") * V("argument") * spaces * ignoreslash * spaces * V("argument"),
+ double = doubles * spaces * V("argument") * spaces * V("argument"),
+ single = singles * spaces * V("argument"),
+
+ balanced = opengroup * (C((leftnorright + V("balanced"))^0)/onlyconverted) * closegroup,
+ argument = V("balanced") + V("token"),
+
+ element = (V("step") + (V("argument") + V("step")) - ignoreright - nextcolumn - comma)^1,
+ commalist = ignoreleft * V("element") * (nextcolumn * spaces * V("element"))^0 * ignoreright,
+ matrix = openmatrix * spaces * (V("commalist") * (nextrow * V("commalist"))^0) * finishrow * closematrix,
+
+ token = beginargument * (texnic + float + real + number + letter) * endargument,
+
+ step = V("scripts") + V("division") + V("single") + V("double"),
+ main = (V("matrix") + V("step") + anychar)^0,
+
+}
+
+asciimath = { }
+asciimath.reserved = reserved
+asciimath.convert = converted
diff --git a/tex/context/base/x-asciimath.mkiv b/tex/context/base/x-asciimath.mkiv
new file mode 100644
index 000000000..c9252408d
--- /dev/null
+++ b/tex/context/base/x-asciimath.mkiv
@@ -0,0 +1,96 @@
+%D \module
+%D [ file=m-asciimath,
+%D version=2006.04.24, % 1999.11.06,
+%D title=\CONTEXT\ Modules,
+%D subtitle=AsciiMath,
+%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.
+
+%D Lua code.
+
+\ctxloadluafile{x-asciimath}{}
+
+%D The following code is not officially supported and is only meant
+%D for the Math4All project.
+%D
+%D The following code kind of maps ascii math
+%D http://www1.chapman.edu/~jipsen/mathml/asciimath.html onto \TEX. The
+%D code was written for the math4all project but in retrospect we
+%D could have used just tex code as the web version can handle that
+%D as well. Anyhow, as we use \MATHML\ as basis it makes sense to add
+%D this to the repertoire as annotation variant, so now we have
+%D content \MATHML\ (prefered), presentation \MATHML\ (often messy),
+%D \OPENMATH\ (what was which we started with in this project)
+%D calcmath (handy for students who are accustomed to calculators),
+%D asciimath (to make Frits's live easier) and of course \TEX. Of
+%D course all are used mixed.
+%D
+%D We don't support all quirks of asciimath as I am not in the mood to
+%D write a complex parser while a bit of sane coding can work as well.
+%D
+%D \startitemize
+%D \item We support only the syntactically clear variants and as long
+%D as lpeg does not support left recursion this is as far as we
+%D want to go.
+%D \item The parser is rather insensitive for spaces but yet the advice is
+%D to avoid weird coding like \type {d/dxf(x)} but use \type {d/dx
+%D f(x)} instead. After all we're not in a compact coding cq.\
+%D parser challenge.
+%D \item We also don't support the somewhat confusing \type {sqrt sqrt 2}
+%D nor \type {root3x} (although the second one kind of works). A bit
+%D of defensive coding does not hurt.
+%D \item We can process \type {a/b/c/d} but it's not compatible with the
+%D default behaviour of asciimath. Use grouping instead. Yes, we do
+%D support the somewhat nonstandard grouping token mix.
+%D \item You should use explicit \type {text(..)} directives as one can
+%D never be sure what is a reserved word and not.
+%D \stopitemize
+%D
+%D Actually, as the only parsing sensitive elements of \TEX\ are
+%D fractions (\type {\over} and friends, a restricted use of \TEX\
+%D coding is probably as comprehensive and parseble.
+%D
+%D The webpage with examples served as starting point so anything beyond
+%D what can be found there isn't supported.
+
+\unprotect
+
+\writestatus{asciimath}{beware, this is an experimental (m4all only) module}
+
+\unexpanded\def\asciimath#1{\ctxlua{asciimath.convert(\!!bs\detokenize{#1}\!!es,true)}}
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\enabletrackers[asciimath.mapping]
+
+\starttext
+
+\startlines
+\asciimath{x^2+y_1+z_12^34}
+\asciimath{sin^-1(x)}
+\asciimath{d/dx f(x)=lim_(h->0) (f(x+h)-f(x))/h}
+\asciimath{f(x)=sum_(n=0)^oo(f^((n))(a))/(n!)(x-a)^n}
+\asciimath{int_0^1 f(x)dx}
+\asciimath{int^1_0 f(x)dx}
+\asciimath{a//b}
+\asciimath{(a/b)/(d/c)}
+\asciimath{((a*b))/(d/c)}
+\asciimath{[[a,b],[c,d]]((n),(k))}
+\asciimath{1/x={(1,text{if } x!=0),(text{undefined},if x=0):}}
+\asciimath{{ (1,2), (x,(x + text(x))) }}
+\asciimath{{(1,2),(x,(x+text(x))),(x,text(x))}}
+\asciimath{{(1,2),(x,(x+text(x))),(x,x text(x))}}
+\asciimath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,x text(xyz))}}
+\asciimath{{(1,2/2),(x,(x+x^22+sqrt(xx))),(x,text(xyz)+1+text(hans))}}
+\asciimath{<<a,b>> text{and} {:(x,y),(u,v):}}
+\asciimath{(a,b] = {x text(in) RR | a < x <= b}}
+\stoplines
+
+\stoptext
diff --git a/tex/context/base/x-calcmath.lua b/tex/context/base/x-calcmath.lua
new file mode 100644
index 000000000..e4d5da139
--- /dev/null
+++ b/tex/context/base/x-calcmath.lua
@@ -0,0 +1,363 @@
+if not modules then modules = { } end modules ['x-calcmath'] = {
+ version = 1.001,
+ comment = "companion to x-calcmath.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, lower, upper, gsub, sub = string.format, string.lower, string.upper, string.gsub, string.sub
+local lpegmatch = lpeg.match
+
+tex = tex or { }
+
+texsprint = tex.sprint or function(catcodes,str) print(str) end
+
+calcmath = { }
+
+local list_1 = {
+ "median", "min", "max", "round", "ln", "log",
+ "sin", "cos", "tan", "sinh", "cosh", "tanh"
+}
+local list_2 = {
+ "int", "sum", "prod"
+}
+local list_3 = {
+ "f", "g"
+}
+local list_4 = {
+ "pi", "inf"
+}
+
+local list_1_1 = { }
+local list_2_1 = { }
+local list_2_2 = { }
+local list_2_3 = { }
+local list_4_1 = { }
+
+local frozen = false
+
+local function freeze()
+ for k=1,#list_1 do
+ local v = list_1[k]
+ list_1_1[v] = "\\".. upper(v) .." "
+ end
+ for k=1,#list_2 do
+ local v = list_2[k]
+ list_2_1[v .. "%((.-),(.-),(.-)%)"] = "\\" .. upper(v) .. "^{%1}_{%2}{%3}"
+ list_2_2[v .. "%((.-),(.-)%)"] = "\\" .. upper(v) .. "^{%1}{%2}"
+ list_2_3[v .. "%((.-)%)"] = "\\" .. upper(v) .. "{%1}"
+ end
+ for k=1,#list_4 do
+ local v = list_4[k]
+ list_4_1[v] = "\\" .. upper(v)
+ end
+ frozen = true
+end
+
+local entities = {
+ ['gt'] = '>',
+ ['lt'] = '<',
+}
+
+local symbols = {
+ ["<="] = "\\LE ",
+ [">="] = "\\GE ",
+ ["=<"] = "\\LE ",
+ ["=>"] = "\\GE ",
+ ["=="] = "\\EQ ",
+ ["<" ] = "\\LT ",
+ [">" ] = "\\GT ",
+ ["="] = "\\EQ ",
+}
+
+local function nsub(str,tag,pre,post)
+ return (gsub(str,tag .. "(%b())", function(body)
+ return pre .. nsub(sub(body,2,-2),tag,pre,post) .. post
+ end))
+end
+
+function calcmath.totex(str,mode)
+ if not frozen then freeze() end
+ local n = 0
+ -- crap
+ str = gsub(str,"%s+",' ')
+ -- xml
+ str = gsub(str,"&(.-);",entities)
+ -- ...E...
+ str = gsub(str,"([%-%+]?[%d%.%+%-]+)E([%-%+]?[%d%.]+)", "{\\SCINOT{%1}{%2}}")
+ -- ^-..
+ str = gsub(str,"%^([%-%+]*%d+)", "^{%1}")
+ -- ^(...)
+ str = nsub(str,"%^", "^{", "}")
+ -- 1/x^2
+ repeat
+ str, n = gsub(str,"([%d%w%.]+)/([%d%w%.]+%^{[%d%w%.]+})", "\\frac{%1}{%2}")
+ until n == 0
+ -- todo: autoparenthesis
+ -- int(a,b,c)
+ for k, v in next, list_2_1 do
+ repeat str, n = gsub(str,k,v) until n == 0
+ end
+ -- int(a,b)
+ for k, v in next, list_2_2 do
+ repeat str, n = gsub(str,k,v) until n == 0
+ end
+ -- int(a)
+ for k, v in next, list_2_3 do
+ repeat str, n = gsub(str,k,v) until n == 0
+ end
+ -- sin(x) => {\\sin(x)}
+ for k, v in next, list_1_1 do
+ repeat str, n = gsub(str,k,v) until n == 0
+ end
+ -- mean
+ str = nsub(str, "mean", "\\OVERLINE{", "}")
+ -- (1+x)/(1+x) => \\FRAC{1+x}{1+x}
+ repeat
+ str, n = gsub(str,"(%b())/(%b())", function(a,b)
+ return "\\FRAC{" .. sub(a,2,-2) .. "}{" .. sub(b,2,-2) .. "}"
+ end )
+ until n == 0
+ -- (1+x)/x => \\FRAC{1+x}{x}
+ repeat
+ str, n = gsub(str,"(%b())/([%+%-]?[%.%d%w]+)", function(a,b)
+ return "\\FRAC{" .. sub(a,2,-2) .. "}{" .. b .. "}"
+ end )
+ until n == 0
+ -- 1/(1+x) => \\FRAC{1}{1+x}
+ repeat
+ str, n = gsub(str,"([%.%d%w]+)/(%b())", function(a,b)
+ return "\\FRAC{" .. a .. "}{" .. sub(b,2,-2) .. "}"
+ end )
+ until n == 0
+ -- 1/x => \\FRAC{1}{x}
+ repeat
+ str, n = gsub(str,"([%.%d%w]+)/([%+%-]?[%.%d%w]+)", "\\FRAC{%1}{%2}")
+ until n == 0
+ -- times
+ str = gsub(str,"%*", " ")
+ -- symbols -- we can use a table substitution here
+ str = gsub(str,"([<>=][<>=]*)", symbols)
+ -- functions
+ str = nsub(str,"sqrt", "\\SQRT{", "}")
+ str = nsub(str,"exp", "e^{", "}")
+ str = nsub(str,"abs", "\\left|", "\\right|")
+ -- d/D
+ str = nsub(str,"D", "{\\FRAC{\\MBOX{d}}{\\MBOX{d}x}{(", ")}}")
+ str = gsub(str,"D([xy])", "\\FRAC{{\\RM d}%1}{{\\RM d}x}")
+ -- f/g
+ for k,v in next, list_3 do -- todo : prepare k,v
+ str = nsub(str,"D"..v,"{\\RM "..v.."}^{\\PRIME}(",")")
+ str = nsub(str,v,"{\\RM "..v.."}(",")")
+ end
+ -- more symbols
+ for k,v in next, list_4_1 do
+ str = gsub(str,k,v)
+ end
+ -- parenthesis (optional)
+ if mode == 2 then
+ str = gsub(str,"%(", "\\left\(")
+ str = gsub(str,"%)", "\\right\)")
+ end
+ -- csnames
+ str = gsub(str,"(\\[A-Z]+)", lower)
+ -- trace
+--~ print(str)
+ -- report
+ return str
+end
+
+function calcmath.tex(str,mode)
+ texsprint(tex.texcatcodes,calcmath.totex(str))
+end
+
+function calcmath.xml(id,mode)
+ local str = lxml.id(id).dt[1]
+ texsprint(tex.texcatcodes,calcmath.totex(str,mode))
+end
+
+-- work in progress ... lpeg variant
+
+if false then
+
+ -- todo:
+
+ -- maybe rewrite to current lpeg, i.e. string replacement and no Cc's
+
+ -- table approach we have now is less efficient but more flexible
+
+ -- D \frac {\rm d} {{\rm d}x}
+ -- Dx Dy \frac {{\rm d}y} {{\rm d}x}
+ -- Df Dg {\rm f}^{\prime}
+ -- f() g() {\rm f}()
+
+
+ -- valid utf8
+
+ local S, P, R, C, V, Cc, Ct = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct
+
+ local space = S(" \n\r\t")^0
+ local integer = P("-")^-1 * R("09")^1
+ local realpart = P("-")^-1 * R("09")^1 * S(".")^1 * R("09")^1
+ local number = Cc("number") * C(integer) * space
+ local real = Cc("real") * C(realpart) * space
+ local float = Cc("float") * C(realpart) * lpeg.P("E") * lpeg.C(integer) * space
+ local identifier = Cc("identifier") * C(R("az","AZ")) * space
+ local compareop = Cc("compare") * C(P("<") + P("=") + P(">") + P(">=") + P("<=") + P("&gt;") + P("&lt;")) * space
+ local factorop = Cc("factor") * C(S("+-^_,")) * space
+ local termop = Cc("term") * C(S("*/")) * space
+ local constant = Cc("constant") * C(P("pi") + lpeg.P("inf")) * space
+ local functionop = Cc("function") * C(R("az")^1) * space
+ local open = P("(") * space
+ local close = P(")") * space
+
+ local grammar = P {
+ "expression",
+ expression = Ct(V("factor") * ((factorop+compareop) * V("factor"))^0),
+ factor = Ct(V("term") * (termop * V("term"))^0),
+ term = Ct(
+ float + real + number +
+ (open * V("expression") * close) +
+ (functionop * open * (V("expression") * (P(",") * V("expression"))^0) * close) +
+ (functionop * V("term")) +
+ constant + identifier
+ ),
+ }
+
+
+ local parser = space * grammar * -1
+
+ local texprint = function(...) texio.write(table.concat{ ... }) end
+
+ local function has_factor(t)
+ for i=1,#t do
+ if t[i] == "factor" then
+ return true
+ end
+ end
+ end
+
+ function totex(t)
+ if t then
+ local one = t[1]
+ if type(one) == "string" then
+ local two, three = t[2], t[3]
+ if one == "number" then
+ texprint(two)
+ elseif one == "real" then
+ texprint(two)
+ elseif one == "float" then
+ texprint("\\scinot{",two,"}{",three,"}")
+ elseif one == "identifier" then
+ texprint(two)
+ elseif one == "constant" then
+ texprint("\\"..two)
+ elseif one == "function" then
+ if two == "sqrt" then
+ texprint("\\sqrt{")
+ totex(three)
+ texprint("}")
+ elseif two == "exp" then
+ texprint(" e^{")
+ totex(three)
+ texprint("}")
+ elseif two == "abs" then
+ texprint("\\left|")
+ totex(three)
+ texprint("\\right|")
+ elseif two == "mean" then
+ texprint("\\overline{")
+ totex(three)
+ texprint("}")
+ elseif two == "int" or two == "prod" or two == "sum" then
+ local four, five = t[4], t[5]
+ if five then
+ texprint("\\"..two.."^{")
+ totex(three)
+ texprint("}_{")
+ totex(four)
+ texprint("}")
+ totex(five)
+ elseif four then
+ texprint("\\"..two.."^{")
+ totex(three)
+ texprint("}")
+ totex(four)
+ elseif three then
+ texprint("\\"..two.." ") -- " " not needed
+ totex(three)
+ else
+ texprint("\\"..two)
+ end
+ else
+ texprint("\\"..two.."(")
+ totex(three)
+ texprint(")")
+ end
+ end
+ else
+ local nt = #t
+ local hasfactor = has_factor(t)
+ if hasfactor then
+ texprint("\\left(")
+ end
+ totex(one)
+ for i=2,nt,3 do
+ local what, how, rest = t[i], t[i+1], t[i+2]
+ if what == "factor" then
+ if how == '^' or how == "_" then
+ texprint(how)
+ texprint("{")
+ totex(rest)
+ texprint("}")
+ else
+ texprint(how)
+ totex(rest)
+ end
+ elseif what == "term" then
+ if how == '/' then
+ texprint("\\frac{")
+ totex(rest)
+ texprint("}{")
+ totex(t[i+3] or "")
+ texprint("}")
+ elseif how == '*' then
+ texprint("\\times")
+ totex(rest)
+ else
+ texprint(how)
+ totex(three)
+ end
+ elseif what == "compare" then
+ if two == ">=" then
+ texprint("\\ge")
+ elseif two == "<=" then
+ texprint("\\le")
+ elseif two == "&gt;" then
+ texprint(">")
+ elseif two == "&lt;" then
+ texprint("<")
+ end
+ totex(three)
+ end
+ end
+ if hasfactor then
+ texprint("\\right)")
+ end
+ end
+ end
+ end
+
+ calcmath = { }
+
+ function calcmath.parse(str)
+ return lpegmatch(parser,str)
+ end
+
+ function calcmath.tex(str)
+ str = totex(lpegmatch(parser,str))
+ return (str == "" and "[error]") or str
+ end
+
+end
diff --git a/tex/context/base/x-calcmath.mkii b/tex/context/base/x-calcmath.mkii
new file mode 100644
index 000000000..68119b2fd
--- /dev/null
+++ b/tex/context/base/x-calcmath.mkii
@@ -0,0 +1,24 @@
+%D \module
+%D [ file=m-calcmath,
+%D version=2006.04.24, % 1999.11.06,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Calculator Math,
+%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.
+
+\unprotect
+
+\writestatus{calcmath}{this is not supported in mkii}
+
+\let\inlinecalcmath \inlinemathematics
+\def\displaycalcmath \displaymathematics
+\let\calcmath \inlinecalcmath
+\let\icm \inlinecalcmath
+\let\dcm \displaycalcmath
+
+\protect \endinput
diff --git a/tex/context/base/x-calcmath.mkiv b/tex/context/base/x-calcmath.mkiv
new file mode 100644
index 000000000..c726843fa
--- /dev/null
+++ b/tex/context/base/x-calcmath.mkiv
@@ -0,0 +1,87 @@
+%D \module
+%D [ file=m-calcmath,
+%D version=2006.04.24, % 1999.11.06,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Calculator Math,
+%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.
+
+%D Lua code.
+
+\ctxloadluafile{x-calcmath}{}
+
+%D Interface:
+
+\unprotect
+
+\def\inlinecalcmath #1{\mathematics{\ctxlua{calcmath.tex("#1",1)}}}
+\def\displaycalcmath#1{\startformula\ctxlua{calcmath.tex("#1",2)}\stopformula}
+
+\let\calcmath\inlinecalcmath
+
+\let\icm\inlinecalcmath
+\let\dcm\displaycalcmath
+
+\startxmlsetups xml:cam:define
+ \xmlsetsetup {\xmldocument} {cam:*} {*}
+ \xmlsetsetup {\xmldocument} {(icm|dcm)} {cam:*}
+\stopxmlsetups
+
+\xmlregisterns{cam}{calcmath}
+
+\xmlregistersetup{xml:cam:define}
+
+% tex -> lua -> tex -> lua -> tex
+% \mathematics{\ctxlua{calcmath.xml(\!!bs\xmlflush{#1}\!!es,1)}}
+% tex -> lua -> tex
+% \mathematics{\ctxlua{calcmath.xml("#1",1)}}%
+
+\startxmlsetups cam:i
+ \mathematics{\ctxlua{calcmath.xml("#1",1)}}%
+\stopxmlsetups
+
+\startxmlsetups cam:d
+ \startformula\ctxlua{calcmath.xml("#1",2)}\stopformula
+\stopxmlsetups
+
+\startxmlsetups cam:icm
+ \mathematics{\ctxlua{calcmath.xml("#1",1)}}
+\stopxmlsetups
+
+\startxmlsetups cam:dcm
+ \startformula\ctxlua{calcmath.xml("#1",2)}\stopformula
+\stopxmlsetups
+
+\protect \endinput
+
+\starttext
+
+% \calcmath{sin(x) + x^2 + x^(1+x) + 1/x^2 + mean(x+mean(y))}
+% \calcmath{int(a,b,c)}
+% \calcmath{(1+x)/(1+x) + (1+x)/(1+(1+x)/(1+x))}
+% \calcmath{10E-2}
+% \calcmath{(1+x)/x}
+% \calcmath{(1+x)/12}
+% \calcmath{(1+x)/-12}
+% \calcmath{1/-12}
+% \calcmath{12x/(1+x)}
+% \calcmath{exp(x+exp(x+1))}
+% \calcmath{abs(x+abs(x+1)) + pi + inf}
+% \calcmath{Dx Dy}
+% \calcmath{D(x+D(y))}
+% \calcmath{Df(x)}
+% \calcmath{g(x)}
+
+\calcmath{sqrt(sin^2(x)+cos^2(x))}
+
+\startXMLdata
+test <icm>sqrt(sin^2(x)+cos^2(x))</icm> test
+test <dcm>sqrt(sin^2(x)+cos^2(x))</dcm> test
+\stopXMLdata
+
+\stoptext
diff --git a/tex/context/base/x-cals.lua b/tex/context/base/x-cals.lua
new file mode 100644
index 000000000..5d15b4e30
--- /dev/null
+++ b/tex/context/base/x-cals.lua
@@ -0,0 +1,209 @@
+if not modules then modules = { } end modules ['x-cals'] = {
+ version = 1.001,
+ comment = "companion to x-cals.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, lower = string.format, string.lower
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local xmlsprint, xmlcprint, xmlcollected = xml.sprint, xml.cprint, xml.collected
+local n_todimen, s_todimen = number.todimen, string.todimen
+
+-- there is room for speedups as well as cleanup (using context functions)
+
+lxml.cals = lxml.cals or { }
+
+local cals = lxml.cals
+
+cals.ignore_widths = false
+cals.shrink_widths = false
+cals.stretch_widths = false
+
+-- the following flags only apply to columns that have a specified width
+--
+-- proportional : shrink or stretch proportionally to the width
+-- equal : shrink or stretch equaly distributed
+-- n < 1 : shrink or stretch proportionally to the width but multiplied by n
+--
+-- more clever things, e.g. the same but applied to unspecified widths
+-- has to happen at the core-ntb level (todo)
+
+local halignments = {
+ left = "flushleft",
+ right = "flushright",
+ center = "middle",
+ centre = "middle",
+ justify = "normal",
+}
+
+local valignments = {
+ top = "high",
+ bottom = "low",
+ middle = "lohi",
+}
+
+local function adapt(widths,b,w,delta,sum,n,what)
+ if b == "equal" then
+ delta = delta/n
+ for k, v in next, w do
+ widths[k] = n_todimen(v - delta)
+ end
+ elseif b == "proportional" then
+ delta = delta/sum
+ for k, v in next, w do
+ widths[k] = n_todimen(v - v*delta)
+ end
+ elseif type(b) == "number" and b < 1 then
+ delta = b*delta/sum
+ for k, v in next, w do
+ widths[k] = n_todimen(v - v*delta)
+ end
+ end
+end
+
+local function getspecs(root, pattern, names, widths)
+ -- here, but actually we need this in core-ntb.tex
+ -- but ideally we need an mkiv enhanced core-ntb.tex
+ local ignore_widths = cals.ignore_widths
+ local shrink_widths = cals.shrink_widths
+ local stretch_widths = cals.stretch_widths
+ for e in xmlcollected(root,pattern) do
+ local at = e.at
+ local column = at.colnum
+ if column then
+ if not ignore_widths then
+ local width = at.colwidth
+ if width then
+ widths[tonumber(column)] = lower(width)
+ end
+ end
+ local name = at.colname
+ if name then
+ names[name] = tonumber(column)
+ end
+ end
+ end
+ if ignore_width then
+ -- forget about it
+ elseif shrink_widths or stretch_widths then
+ local sum, n, w = 0, 0, { }
+ for _, v in next, widths do
+ n = n + 1
+ v = (type(v) == "string" and s_todimen(v)) or v
+ if v then
+ w[n] = v
+ sum = sum + v
+ end
+ end
+ local hsize = tex.hsize
+ if type(hsize) == "string" then
+ hsize = s_todimen(hsize)
+ end
+ local delta = sum - hsize
+ if shrink_widths and delta > 0 then
+ adapt(widths,shrink_widths,w,delta,sum,n,"shrink")
+ elseif stretch_widths and delta < 0 then
+ adapt(widths,stretch_widths,w,delta,sum,n,"stretch")
+ end
+ end
+end
+
+local function getspans(root, pattern, names, spans)
+ for e in xmlcollected(root,pattern) do
+ local at = e.at
+ local name, namest, nameend = at.colname, names[at.namest or "?"], names[at.nameend or "?"]
+ if name and namest and nameend then
+ spans[name] = tonumber(nameend) - tonumber(namest) + 1
+ end
+ end
+end
+
+--local function texsprint(a,b) print(b) end
+--local function xmlsprint(a) print(a) end
+
+function cals.table(root,namespace)
+
+ local prefix = (namespace or "cals") .. ":"
+ local p = "/" .. prefix
+
+ local tgroupspec = p .. "tgroup"
+ local colspec = p .. "colspec"
+ local spanspec = p .. "spanspec"
+ local hcolspec = p .. "thead" .. p .. "colspec"
+ local bcolspec = p .. "tbody" .. p .. "colspec"
+ local fcolspec = p .. "tfoot" .. p .. "colspec"
+ local entryspec = p .. "entry" .. "|" ..prefix .. "entrytbl"
+ local hrowspec = p .. "thead" .. p .. "row"
+ local browspec = p .. "tbody" .. p .. "row"
+ local frowspec = p .. "tfoot" .. p .. "row"
+
+ local function tablepart(root, xcolspec, xrowspec, before, after) -- move this one outside
+ texsprint(ctxcatcodes,before)
+ local at = root.at
+ local pphalign, ppvalign = at.align, at.valign
+ local names, widths, spans = { }, { }, { }
+ getspecs(root, colspec , names, widths)
+ getspecs(root, xcolspec, names, widths)
+ getspans(root, spanspec, names, spans)
+ for r, d, k in xml.elements(root,xrowspec) do
+ texsprint(ctxcatcodes,"\\bTR")
+ local dk = d[k]
+ local at = dk.at
+ local phalign, pvalign = at.align or pphalign, at.valign or ppvalign -- todo: __p__ test
+ local col = 1
+ for rr, dd, kk in xml.elements(dk,entryspec) do
+ local dk = dd[kk]
+ if dk.tg == "entrytbl" then
+ texsprint(ctxcatcodes,"\\bTD{")
+ cals.table(dk)
+ texsprint(ctxcatcodes,"}\\eTD")
+ col = col + 1
+ else
+ local at = dk.at
+ local b, e, s, m = names[at.namest or "?"], names[at.nameend or "?"], spans[at.spanname or "?"], at.morerows
+ local halign, valign = at.align or phalign, at.valign or pvalign
+ if b and e then
+ s = e - b + 1
+ end
+ if halign then
+ halign = halignments[halign]
+ end
+ if valign then
+ valign = valignments[valign]
+ end
+ local width = widths[col]
+ if s or m or halign or valign or width then -- only english interface !
+ texsprint(ctxcatcodes,format("\\bTD[nx=%s,ny=%s,align={%s,%s},width=%s]",
+ s or 1, (m or 0)+1, halign or "flushleft", valign or "high", width or "fit"))
+ -- texsprint(ctxcatcodes,"\\bTD[nx=",s or 1,"ny=",(m or 0)+1,"align={",halign or "flushleft",",",valign or "high","},width=",width or "fit","]")
+ else
+ texsprint(ctxcatcodes,"\\bTD[align={flushleft,high},width=fit]") -- else problems with vertical material
+ end
+ xmlcprint(dk)
+ texsprint(ctxcatcodes,"\\eTD")
+ col = col + (s or 1)
+ end
+ end
+ texsprint(ctxcatcodes,"\\eTR")
+ end
+ texsprint(ctxcatcodes,after)
+ end
+
+ for tgroup in lxml.collected(root,tgroupspec) do
+ texsprint(ctxcatcodes, "\\directsetup{cals:table:before}")
+ lxml.directives.before(root,"cdx") -- "cals:table"
+ texsprint(ctxcatcodes, "\\bgroup")
+ lxml.directives.setup(root,"cdx") -- "cals:table"
+ texsprint(ctxcatcodes, "\\bTABLE")
+ tablepart(tgroup, hcolspec, hrowspec, "\\bTABLEhead", "\\eTABLEhead")
+ tablepart(tgroup, bcolspec, browspec, "\\bTABLEbody", "\\eTABLEbody")
+ tablepart(tgroup, fcolspec, frowspec, "\\bTABLEfoot", "\\eTABLEfoot")
+ texsprint(ctxcatcodes, "\\eTABLE")
+ texsprint(ctxcatcodes, "\\egroup")
+ lxml.directives.after(root,"cdx") -- "cals:table"
+ texsprint(ctxcatcodes, "\\directsetup{cals:table:after}")
+ end
+
+end
diff --git a/tex/context/base/x-cals.mkiv b/tex/context/base/x-cals.mkiv
new file mode 100644
index 000000000..32d5767c1
--- /dev/null
+++ b/tex/context/base/x-cals.mkiv
@@ -0,0 +1,36 @@
+%D \module
+%D [ file=x-cals,
+%D version=2007.09.05,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Cals table renderer,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt XML Macros / Cals Tables}
+
+\startmodule [cals]
+
+\ctxloadluafile{x-cals}{}
+
+% \startxmlsetups xml:cals:process
+% \xmlsetsetup {\xmldocument} {cals:table} {*}
+% \stopxmlsetups
+% \startxmlsetups cals:table
+% \ctxlua{lxml.cals.table("#1")}
+% \stopxmlsetups
+% \xmlregistersetup{xml:cals:process}
+
+\startxmlsetups xml:cals:process
+ \xmlsetfunction {\xmldocument} {cals:table} {lxml.cals.table}
+\stopxmlsetups
+
+\xmlregistersetup{xml:cals:process}
+
+\xmlregisterns{cals}{cals}
+
+\stopmodule
diff --git a/tex/context/base/x-chemml.mkii b/tex/context/base/x-chemml.mkii
new file mode 100644
index 000000000..68b52cdd1
--- /dev/null
+++ b/tex/context/base/x-chemml.mkii
@@ -0,0 +1,212 @@
+%D \module
+%D [ file=m-chemml,
+%D version=2001.09.12,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading CHEMML Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\useXMLfilter[cml]
+
+%D Structural formulas are codes in a \PPCHTEX\ way; this
+%D will change -)
+%D
+%D \startbuffer
+%D <dchem>
+%D <structure>
+%D <component>
+%D <graphic>SIX,B</graphic>
+%D <graphic>R135</graphic>
+%D </component>
+%D <component>
+%D <graphic>R246</graphic>
+%D </component>
+%D <component>
+%D <graphic>RZ</graphic>
+%D <text>A,B,C,D,E,F</text>
+%D </component>
+%D <component>
+%D <graphic>Z</graphic>
+%D <oxidation n="3">A</oxidation>
+%D <text>A</text>
+%D <annotation location="t">
+%D <text>B</text>
+%D <caption>x<context:b>x<context:compound token="*"/>x</context:b>x</caption>
+%D </annotation>
+%D <oxidation n="3" sign="+">B</oxidation>
+%D <text>C,D,E,F</text>
+%D </component>
+%D </structure>
+%D <structure>
+%D <component>
+%D <graphic>SIX,B</graphic>
+%D <graphic>r135</graphic>
+%D </component>
+%D <component>
+%D <graphic>R246</graphic>
+%D </component>
+%D <component>
+%D <graphic>RZ</graphic>
+%D <text>A,B,C,D,E,F</text>
+%D </component>
+%D </structure>
+%D </dchem>
+%D \stopbuffer
+%D
+%D \typebuffer
+
+% \ifx\XMLgtoks\undefined \newtoks\XMLgtoks \fi
+% \ifx\XMLttoks\undefined \newtoks\XMLttoks \fi
+%
+% \defineXMLenvironment [structure]
+% {\startchemical\ignorespaces}
+% {\relax\stopchemical}
+%
+% \def\chemicalXMLg#1% \defineXMLcollect [graphic] \XMLgtoks
+% {\doifelsenothing{\the\XMLgtoks}
+% {\doglobal\appendtoks #1\to\XMLgtoks\ignorespaces}
+% {\doglobal\appendtoks,#1\to\XMLgtoks\ignorespaces}}
+%
+% \def\chemicalXMLt#1%
+% {\doifelsenothing{\the\XMLttoks}
+% {\doglobal\appendtoks #1\to\XMLttoks\ignorespaces}
+% {\doglobal\appendtoks,#1\to\XMLttoks\ignorespaces}}
+%
+% \defineXMLenvironment [component] [type=]
+% {\global\XMLgtoks\emptytoks
+% \global\XMLttoks\emptytoks
+% \defineXMLargument[graphic]\chemicalXMLg
+% \defineXMLargument[text]\chemicalXMLt
+% \ignorespaces}
+% {\expanded{\chemical[\the\XMLgtoks][\the\XMLttoks]}%
+% \ignorespaces}
+%
+% \defineXMLargument [oxidation] [sign=,n=1] \chemicalXMLo % +/- 1..7
+%
+% \def\chemicalXMLo#1%
+% {\expanded{\chemicalXMLt
+% {\noexpand\chemicaloxidation{\XMLop{sign}}{\XMLop{n}}{#1}}}%
+% \ignorespaces}
+%
+% \defineXMLenvironment [annotation] [location=]
+% {\bgroup
+% \defineXMLenvironmentsave[text]{\ignorespaces}{\ignorespaces}%
+% \defineXMLenvironmentsave[caption]{\ignorespaces}{\ignorespaces}%
+% \ignorespaces}
+% {\scratchtoks{\chemicalright}%
+% \processaction
+% [\XMLop{location}]
+% [ t=>\scratchtoks{\chemicaltop},
+% b=>\scratchtoks{\chemicalbottom},
+% l=>\scratchtoks{\chemicalleft},
+% r=>\scratchtoks{\chemicalright},
+% lc=>\scratchtoks{\chemicalleftcentered},
+% rc=>\scratchtoks{\chemicalrightcentered},
+% tl=>\scratchtoks{\chemicaltopleft},
+% bl=>\scratchtoks{\chemicalbottomleft},
+% tr=>\scratchtoks{\chemicaltopright},
+% br=>\scratchtoks{\chemicalbottomright},
+% lt=>\scratchtoks{\chemicallefttop},
+% lb=>\scratchtoks{\chemicalleftbottom},
+% rt=>\scratchtoks{\chemicalrighttop},
+% rb=>\scratchtoks{\chemicalrightbottom},
+% x=>\scratchtoks{\chemicaltighttext},
+% sl=>\scratchtoks{\chemicalsmashedleft},
+% sm=>\scratchtoks{\chemicalsmashedmiddle},
+% sr=>\scratchtoks{\chemicalsmashedright}]%
+% \expanded{\chemicalXMLt
+% {\the\scratchtoks{\XMLflush{text}}{\XMLflush{caption}}}}%
+% \egroup
+% \ignorespaces}
+%
+% \defineXMLenvironment [forever]
+% {\chemicalXMLt{\[}\ignorespaces}
+% {\chemicalXMLt{\]}\ignorespaces}
+
+\ifx\XMLgtoks\undefined \newtoks\XMLgtoks \fi
+\ifx\XMLttoks\undefined \newtoks\XMLttoks \fi
+
+\startXMLmapping [cml]
+
+% this will be a more natural method; this also triggers it
+
+\installXMLunknownremapping
+
+% extensions
+
+\remapXMLsequence [structure] [CPA] \doCMLstructure
+\remapXMLsequence [component] [CPA] \doCMLcomponent
+\remapXMLsequence [graphic] [CPA] \doCMLgraphic
+\remapXMLsequence [text] [CPA] \doCMLtext
+
+\remapXMLsequence [caption] [CPA] \doCMLcaption
+\remapXMLsequence [oxidation] [CPA] \doCMLoxidation
+\remapXMLsequence [annotation][CPA] \doCMLannotation
+\remapXMLsequence [forever] [CPA] \doCMLforever
+
+\def\doCMLstructure#1#2%
+ {\startchemical\ignorespaces#2\unskip\stopchemical}
+
+\def\doCMLgraphic#1#2%
+ {\doifelsenothing{\the\XMLgtoks}
+ {\uppercase{\doglobal\appendtoks #2\to\XMLgtoks\ignorespaces}}
+ {\uppercase{\doglobal\appendtoks,#2\to\XMLgtoks\ignorespaces}}%
+ \ignorespaces}
+
+\def\doCMLtext#1#2%
+ {\doifelsenothing{\the\XMLttoks}
+ {\doglobal\appendtoks #2\to\XMLttoks\ignorespaces}
+ {\doglobal\appendtoks,#2\to\XMLttoks\ignorespaces}%
+ \ignorespaces}
+
+\def\doCMLcomponent#1#2%
+ {\global\XMLgtoks\emptytoks
+ \global\XMLttoks\emptytoks
+ \ignorespaces#2\unskip
+ \expanded{\chemical[\the\XMLgtoks][\the\XMLttoks]}%
+ \ignorespaces}
+
+\def\doCMLannotation#1#2%
+ {\getXMLarguments{cml}{location="" #1}%
+ \def\dodoCMLannotation##1%
+ {\doCMLtext\empty{##1%
+ {\let\doCMLtext \secondoftwoarguments\processXMLRchild{text}{#2}}%
+ {\let\doCMLcaption\unmapXMLdata \processXMLRchild{caption}{#2}}}}%
+ \processaction
+ [\XMLpar{cml}{location}{r}]
+ [ t=>\dodoCMLannotation\chemicaltop,
+ b=>\dodoCMLannotation\chemicalbottom,
+ l=>\dodoCMLannotation\chemicalleft,
+ r=>\dodoCMLannotation\chemicalright,
+ lc=>\dodoCMLannotation\chemicalleftcentered,
+ rc=>\dodoCMLannotation\chemicalrightcentered,
+ tl=>\dodoCMLannotation\chemicaltopleft,
+ bl=>\dodoCMLannotation\chemicalbottomleft,
+ tr=>\dodoCMLannotation\chemicaltopright,
+ br=>\dodoCMLannotation\chemicalbottomright,
+ lt=>\dodoCMLannotation\chemicallefttop,
+ lb=>\dodoCMLannotation\chemicalleftbottom,
+ rt=>\dodoCMLannotation\chemicalrighttop,
+ rb=>\dodoCMLannotation\chemicalrightbottom,
+ x=>\dodoCMLannotation\chemicaltighttext,
+ sl=>\dodoCMLannotation\chemicalsmashedleft,
+ sm=>\dodoCMLannotation\chemicalsmashedmiddle,
+ sr=>\dodoCMLannotation\chemicalsmashedright]%
+ \ignorespaces}
+
+\def\doCMLoxidation#1#2%
+ {\getXMLarguments{cml}{sign="" n="1" #1}%
+ \expanded{\doCMLtext{}%
+ {\noexpand\chemicaloxidation{\XMLpar{cml}{sign}{}}{\XMLpar{cml}{n}{}}{#2}}}%
+ \ignorespaces}
+
+\def\doCMLforever#1#2{\[#2\]}
+
+\stopXMLmapping
+
+\endinput
diff --git a/tex/context/base/x-chemml.mkiv b/tex/context/base/x-chemml.mkiv
new file mode 100644
index 000000000..f9ed32960
--- /dev/null
+++ b/tex/context/base/x-chemml.mkiv
@@ -0,0 +1,262 @@
+%D \module
+%D [ file=x-cml,
+%D version=2007.09.03, % reimplementation
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=MkIV ChemML renderer,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt XML Macros / Chemistry}
+
+\usemodule[pictex,chemic] % someday we will do structural fomulas in mp
+
+%D The following code assumes a load||flush approach to \XML.
+
+\unprotect
+
+\startxmlsetups xml:cml:process
+
+ \xmlstrip {\xmldocument} {cml:chem|cml:ichem|cml:dchem|cml:reaction|cml:molecule|cml:ion|cml:structure}
+
+ \xmlgrab {\xmldocument} {cml:*} {*}
+ \xmlgrab {\xmldocument} {cml:gives|cml:equilibrium|cml:mesomeric} {cml:arrow}
+ \xmlgrab {\xmldocument} {cml:plus|cml:minus|cml:equal} {cml:operator}
+ \xmlgrab {\xmldocument} {cml:bond|cml:singlebond|cml:doublebound|cml:triplebond} {cml:bond}
+
+ \xmlgrab {\xmldocument} {pi::chemml} {cml:pi}
+\stopxmlsetups
+
+\xmlregistersetup{xml:cml:process}
+
+\xmlregisterns{cml}{chemml}
+
+\unexpanded\def\setupCMLappearance[#1]{\dodoubleargument\getparameters[@@CML#1]}
+
+\setupCMLappearance [ion] [\c!alternative=\v!a]
+
+\startluacode
+ function lxml.cml_do_pi(id)
+ local str = xml.content(lxml.id(id))
+ local _, class, key, value = str:match("^(%S+)%s+(%S+)%s+(%S+)%s+(%S+)%s*$")
+ if key and value then
+ tex.sprint(tex.ctxcatcodes,string.format("\\setupCMLappearance[%s][%s=%s]",class, key, value))
+ end
+ end
+\stopluacode
+
+\def\doifelseCMLvariable#1#2#3% id key value
+ {\doifelse{\xmlatt{#1}{#2}}{#3}
+ \firstoftwoarguments
+ {\doifelse{\getvalue{@@CML\xmltag{#1}#2}}{#3}
+ \firstoftwoarguments
+ \secondoftwoarguments}}
+
+\startxmlsetups cml:pi
+ \ctxlua{lxml.cml_do_pi(#1)}
+\stopxmlsetups
+
+\startxmlsetups cml:chem
+ \automathematics{\xmlflush{#1}}
+\stopxmlsetups
+\startxmlsetups cml:ichem
+ \inlinemathematics{\xmlflush{#1}}
+\stopxmlsetups
+\startxmlsetups cml:dchem
+ \displaymathematics{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups cml:reaction
+ \xmlflush{#1}
+\stopxmlsetups
+
+\def\doCMLtext#1#2#3% main top bot
+ {\setbox0\hbox{\doifsomething{#2}{\txx\setstrut\strut\ignorespaces#2\unskip}}%
+ \setbox2\hbox{\ignorespaces\strut#1\unskip}%
+ \setbox4\hbox{\doifsomething{#3}{\txx\setstrut\strut\ignorespaces#3\unskip}}%
+ \scratchdimen=\wd2\advance\scratchdimen-.5em
+ \ifdim\wd0>\scratchdimen
+ \setbox0\hbox spread .5em{\hss\box0\hss}%
+ \fi
+ \ifdim\wd4>\scratchdimen
+ \setbox4\hbox spread .5em{\hss\box4\hss}%
+ \fi
+ \setbox6=\vbox
+ {\offinterlineskip\halign{\hss##\hss\cr\copy0\cr\copy2\cr\copy4\cr}}%
+ \hbox{\lower\ht4\hbox{\lower\dp2\box6}}}
+
+\def\doCMLamount#1%
+ {\scratchcounter0\xmlatt{#1}{n}\relax
+ \ifnum\scratchcounter>0 \number\scratchcounter \fi}
+
+\startxmlsetups cml:molecule
+ \doCMLtext
+ {\doCMLamount{#1}
+ \xmlall{#1}{cml:atom|cml:bond|cml:singlebond|cml:doublebond|cml:triplebond}}
+ {\xmlindex{#1}{cml:caption}{2}}
+ {\xmlindex{#1}{cml:caption}{1}}
+\stopxmlsetups
+
+\startxmlsetups cml:atom
+ \doCMLtext {
+ \lohi {
+ $\tfxx\xmlatt{#1}{protons}$
+ } {
+ $\tfxx\xmlatt{#1}{weight}$
+ }
+ \xmlflush{#1}
+ \lohi {
+ $\tfxx\xmlatt{#1}{n}$
+ } {
+ $\tfxx\xmlatt{#1}{charge}$%
+ }
+ }
+ {\xmlindex{#1}{cml:caption}{2}}
+ {\xmlindex{#1}{cml:caption}{1}}
+\stopxmlsetups
+
+\startxmlsetups cml:ion
+ \doifelseCMLvariable{#1}{alternative}{b} {
+ \left[
+ \doCMLtext
+ {\doCMLamount{#1}
+ \xmlall{#1}{cml:atom}}
+ {\xmlindex{#1}{cml:caption}{2}}
+ {\xmlindex{#1}{cml:caption}{1}}
+ \right]
+ } {
+ \doCMLtext
+ {\doCMLamount{#1}
+ \xmlall{#1}{cml:atom}}
+ {\xmlindex{#1}{cml:caption}{2}}
+ {\xmlindex{#1}{cml:caption}{1}}
+ }
+ \high {\xmlatt{#1}{charge}}
+\stopxmlsetups
+
+\def\doCMLgives {\xrightarrow}
+\def\doCMLequilibrium{\xleftrightarrow}
+\def\doCMLmesomeric {\xrightoverleftarrow}
+\def\doCMLplus {+}
+\def\doCMLminus {-}
+\def\doCMLequal {=}
+
+\startxmlsetups cml:arrow
+ \quad
+ \executeifdefined{doCML\xmlname{#1}}\doCMLgives{\tf\xmlindex{#1}{cml:caption}{2}}{\tf\xmlindex{#1}{cml:caption}{1}}
+ \quad
+\stopxmlsetups
+
+\startxmlsetups cml:operator
+ \quad
+ \mathop{\executeifdefined{doCML\xmlname{#1}}\doCMLplus}
+ \quad
+\stopxmlsetups
+
+\startxmlsetups cml:bond
+ \executeifdefined{doCML\xmlname{#1}} {
+ \ifcase0\xmlatt{#1}{n}\relax
+ \doCMLsinglebond
+ \or
+ \doCMLdoublebond
+ \or
+ \doCMLtriplebond
+ \fi
+ }
+\stopxmlsetups
+
+\def\doCMLbond
+ {\hrule\!!width\hsize\!!height.1ex\relax}
+
+\def\dodoCMLbond#1#2#3%
+ {\begingroup
+ \setbox\scratchbox\hbox{$M$}%
+ \vbox to \ht\scratchbox
+ {\hsize\wd\scratchbox
+ \vskip.1\wd\scratchbox
+ #1\vfill#2\vfill#3%
+ \vskip.1\wd\scratchbox}%
+ \endgroup}
+
+\def\doCMLsinglebond{\dodoCMLbond\relax \doCMLbond\relax }
+\def\doCMLdoublebond{\dodoCMLbond\doCMLbond\relax \doCMLbond}
+\def\doCMLtriplebond{\dodoCMLbond\doCMLbond\doCMLbond\doCMLbond}
+
+\startxmlsetups cml:structure
+ \startchemical
+ \xmlall{#1}{cml:component}
+ \stopchemical
+\stopxmlsetups
+
+% It makes not much sense to adapt ppchtex to accept different input. Maybe some day.
+
+\startluacode
+ function lxml.cml_do_graphic(id)
+ local t = { }
+ for r, d, k in xml.elements(lxml.id(id),"cml:graphic") do
+ t[#t+1] = xml.tostring(d[k].dt)
+ end
+ tex.sprint(tex.ctxcatcodes,table.concat(t,","))
+ end
+ function lxml.cml_no_graphic(id)
+ local t = { }
+ for r, d, k in xml.elements(lxml.id(id),"cml:text|cml:oxidation|cml:annotation") do
+ local dk = d[k]
+ if dk.tg == "oxidation" then
+ t[#t+1] = string.format("\\chemicaloxidation{%s}{%s}{%s}",r.at.sign or "",r.at.n or 1,xml.tostring(dk.dt))
+ elseif dk.tg == "annotation" then
+ local location = r.at.location or "r"
+ local caption = xml.content(xml.first(dk,"cml:caption"))
+ local text = xml.content(xml.first(dk,"cml:text"))
+ t[#t+1] = string.format("\\doCMLannotation{%s}{%s}{%s}",location,caption,text)
+ else
+ t[#t+1] = xml.tostring(dk.dt) or ""
+ end
+ end
+ tex.sprint(tex.ctxcatcodes,table.concat(t,","))
+ end
+\stopluacode
+
+\startxmlsetups cml:component
+ \expanded {
+ \chemical
+ [\ctxlua{lxml.cml_do_graphic("#1")}]
+ [\ctxlua{lxml.cml_no_graphic("#1")}]
+ }
+\stopxmlsetups
+
+\unexpanded\def\doCMLannotation#1% #2#3% loc caption text
+ {\XMLval{cml:a:l}{#1}{\chemicalright}}% {#2}{#3}}
+
+\mapXMLvalue {cml:a:l} {t} {\chemicaltop}
+\mapXMLvalue {cml:a:l} {b} {\chemicalbottom}
+\mapXMLvalue {cml:a:l} {l} {\chemicalleft}
+\mapXMLvalue {cml:a:l} {r} {\chemicalright}
+\mapXMLvalue {cml:a:l} {lc} {\chemicalleftcentered} % \mapXMLvalue {cml:a:l} {cl} {\chemicalleftcentered}
+\mapXMLvalue {cml:a:l} {rc} {\chemicalrightcentered} % \mapXMLvalue {cml:a:l} {cr} {\chemicalrightcentered}
+\mapXMLvalue {cml:a:l} {tl} {\chemicaltopleft} % \mapXMLvalue {cml:a:l} {lt} {\chemicaltopleft}
+\mapXMLvalue {cml:a:l} {bl} {\chemicalbottomleft} % \mapXMLvalue {cml:a:l} {lb} {\chemicalbottomleft}
+\mapXMLvalue {cml:a:l} {tr} {\chemicaltopright} % \mapXMLvalue {cml:a:l} {rt} {\chemicaltopright}
+\mapXMLvalue {cml:a:l} {br} {\chemicalbottomright} % \mapXMLvalue {cml:a:l} {rb} {\chemicalbottomright}
+\mapXMLvalue {cml:a:l} {lt} {\chemicallefttop} % \mapXMLvalue {cml:a:l} {tl} {\chemicallefttop}
+\mapXMLvalue {cml:a:l} {lb} {\chemicalleftbottom} % \mapXMLvalue {cml:a:l} {bl} {\chemicalleftbottom}
+\mapXMLvalue {cml:a:l} {rt} {\chemicalrighttop} % \mapXMLvalue {cml:a:l} {tr} {\chemicalrighttop}
+\mapXMLvalue {cml:a:l} {rb} {\chemicalrightbottom} % \mapXMLvalue {cml:a:l} {br} {\chemicalrightbottom}
+\mapXMLvalue {cml:a:l} {x} {\chemicaltighttext}
+\mapXMLvalue {cml:a:l} {sl} {\chemicalsmashedleft} % \mapXMLvalue {cml:a:l} {ls} {\chemicalsmashedleft}
+\mapXMLvalue {cml:a:l} {sm} {\chemicalsmashedmiddle} % \mapXMLvalue {cml:a:l} {ms} {\chemicalsmashedmiddle}
+\mapXMLvalue {cml:a:l} {sr} {\chemicalsmashedright} % \mapXMLvalue {cml:a:l} {rs} {\chemicalsmashedright}
+
+\startxmlsetups cml:forever
+ \left[\xmlflush{#1}\right]
+\stopxmlsetups
+
+% \starttext
+% \xmlprocess{main}{cmltest.xml}{xml:process}
+% \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/x-chemml.tex b/tex/context/base/x-chemml.tex
new file mode 100644
index 000000000..65d33b5ec
--- /dev/null
+++ b/tex/context/base/x-chemml.tex
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=m-chemml,
+%D version=2001.09.12,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading CHEMML Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{x-chemml}
+
+\endinput
diff --git a/tex/context/base/x-chemml.xsd b/tex/context/base/x-chemml.xsd
new file mode 100644
index 000000000..b51121911
--- /dev/null
+++ b/tex/context/base/x-chemml.xsd
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+<xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ <p>This schema covers (basic presentational) Chemical
+ markup. We will extend this schema with names and
+ predefined components.</p>
+ <p>author: Hans Hagen, copyright: PRAGMA-ADE / Hasselt NL</p>
+ </xsd:documentation>
+</xsd:annotation>
+
+<xsd:element type="chemType">
+ <xsd:sequence>
+ <xsd:element ref="chemicalComponentType" />
+ <xsd:choice>
+ <xsd:element ref="chemicalActionType" />
+ <xsd:element ref="chemicalBondType" />
+ </xsd:choice>
+ </xsd:sequence>
+</xsd:element>
+
+<xsd:element name="chem" type="chemType" />
+<xsd:element name="ichem" type="chemType" />
+<xsd:element name="dchem" type="chemType" />
+
+<xsd:element name="molecule">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element name="ion" />
+ <xsd:element name="atom" />
+ </xsd:choice>
+ <xsd:element name="caption" type="chemicalCaptionType" />
+ </xsd:sequence>
+ <xsd:attribute name="n" type="xsd:positiveInteger" />
+ </xsd:complexType>
+</xsd:element>
+
+<xsd:element name="ion">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="atom" />
+ </xsd:sequence>
+ <xsd:attribute name="n" type="xsd:positiveInteger" />
+ <xsd:attribute name="charge" type="xsd:integer" />
+ </xsd:complexType>
+</xsd:element>
+
+<xsd:element name="atom" type="xsd:string">
+ <xsd:complexType>
+ <xsd:attribute name="n" type="xsd:positiveInteger"/>
+ <xsd:attribute name="charge" type="xsd:integer" />
+ <xsd:attribute name="protons" type="xsd:positiveInteger" />
+ <xsd:attribute name="weight" type="xsd:positiveInteger" />
+ </xsd:complexType>
+</xsd:element>
+
+<xsd:complexType name="chemicalActionType">
+ <xsd:choice>
+ <xsd:element name="plus" type="chemicalCaptionType" />
+ <xsd:element name="minus" type="chemicalCaptionType" />
+ <xsd:element name="equal" type="chemicalCaptionType" />
+ <xsd:element name="gives" type="chemicalCaptionType" />
+ <xsd:element name="equilibrium" type="chemicalCaptionType" />
+ <xsd:element name="mesomeric" type="chemicalCaptionType" />
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:complexType name="chemicalBondType">
+ <xsd:choice>
+ <xsd:element name="singlebond" />
+ <xsd:element name="doublebond" />
+ <xsd:element name="triplebond" />
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:complexType name="chemicalComponentType">
+ <xsd:choice>
+ <xsd:element ref="molecule" />
+ <xsd:element ref="ion" />
+ <xsd:element ref="atom" />
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:complexType name="chemicalCaptionType" minOccurs="0" maxOccurs="2">
+ <xsd:sequence>
+ <xsd:element name="caption" type="xsd:string" minOccurs="0" maxOccurs="2" />
+ </xsd:sequence>
+</xsd:complexType>
+
+</xsd:schema>
diff --git a/tex/context/base/x-contml.mkii b/tex/context/base/x-contml.mkii
new file mode 100644
index 000000000..a582d8eb9
--- /dev/null
+++ b/tex/context/base/x-contml.mkii
@@ -0,0 +1,491 @@
+%M \usemodule [contml] \autoXMLnamespace [context]
+%M \definefilesynonym [context] [x-contml.xsd]
+
+%D \module
+%D [ file=x-contml,
+%D version=mid 2001,
+%D title=\CONTEXT\ XML Support,
+%D subtitle=Basic \CONTEXT\ commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% This module provides some basic \XML\ elements. These definitions
+% are highly experimental and serve as a playground for interface
+% development.
+
+\unprotect
+
+%D \elements {include}
+%D
+%D \startbuffer
+%D You can include another file in the current document with the
+%D <element>include</element> element. When including the file, &context;
+%D will look at the suffix, in order to decide how to include the file.
+%D
+%D <verbatim>
+%D <line><include name="mine"/></line>
+%D <line><include name="mine" type="txt"/></line>
+%D <line><include name="mine" type="tex"/></line>
+%D </verbatim>
+%D \stopbuffer
+%D
+%D \showelements [context] [include]
+
+\defineXMLsingular [context:include] [name=,type=xml]
+ {\doifsomethingXMLop{name}
+ {\processaction
+ [\XMLop{type}]
+ [xml=>\readfile{\XMLop{name}}\donothing\donothing,
+ tex=>{{\disableXML\readfile{\XMLop{name}}\donothing\donothing}},
+ txt=>{{\disableXML\typefile{\XMLop{name}}}}]}}
+
+% or, nicer:
+%
+% \defineXMLsingular [context:include] [name=unknown,type=txt]
+% {\XMLval{include:type}{\XMLop{type}}{}}
+%
+% \mapXMLvalue {include:type} {xml} {\readfile{\XMLop{name}}\donothing\donothing}
+% \mapXMLvalue {include:type} {tex} {{\disableXML\readfile{\XMLop{name}}\donothing\donothing}}
+% \mapXMLvalue {include:type} {txt} {{\disableXML\typefile{\XMLop{name}}}}
+
+%D \elements {compound}
+%D
+%D \startbuffer
+%D Instead of using hard coded compound tokens, you should use the
+%D <element>compound</element> element, as in high<compound token="/" />low.
+%D The overhead in keying is rewarded with proper symbols and hyphenation.
+%D \stopbuffer
+%D
+%D \showelements [context] [compound]
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+% \defineXMLsingular [context:compound] [token=]
+% {\expanded{\normalcompound\XMLop{token}}|}
+
+% \defineXMLsingular [context:compound] [token=]
+% {\ifmmode
+% \doifXMLop{token}{\XMLop{token}}{\compoundhyphen}%
+% \else
+% \expanded{\normalcompound\XMLop{token}}|%
+% \fi}
+
+\defineXMLsingular [context:compound] [token=]
+ {\mathortext % disc comm looks ahead, so \relax
+ {\doifXMLop{token}{\XMLop{token}}\compoundhyphen}%
+ {\expanded{\directdiscretionary{\XMLop{token}}}\relax}}
+
+\defineXMLenvironmentsave [context:cp]
+ {}
+ {\expanded{\directdiscretionary{\XMLflush{cp}}}\relax}
+
+%D \elements {p}
+%D
+%D \startbuffer
+%D <p>Although for &tex; it is often enough to mark the end of a paragraph,
+%D in &xml; we want to add a bit more structure. <p/> This permits a more
+%D robust implementation of begin<compound/>of<compound/>par actions</p>
+%D \stopbuffer
+%D
+%D \showelements [context] [p]
+
+\defineXMLenvironment [context:p] {} \endgraf
+\defineXMLsingular [context:p] \endgraf
+
+%D \elements {pageref,textref,lineref}
+%D
+%D \startbuffer
+%D You can ask for a page (<pageref label="lastpage">the last pagenumber
+%D is</pageref> aka page <pageref label="lastpage"/>), text or line reference
+%D with the following three elements. The label may be any valid &context;
+%D reference label.
+%D \stopbuffer
+%D
+%D \showelements [context] [references]
+
+\defineXMLpickup [context:pageref] [label=] {\at} {[\XMLop{label}]}
+\defineXMLpickup [context:textref] [label=] {\in} {[\XMLop{label}]}
+\defineXMLpickup [context:lineref] [label=] {\inline} {[\XMLop{label}]}
+
+%D \elements{text}
+%D
+%D \startbuffer
+%D If you have a self contained &xml; file, you need to signal &context; the
+%D begin and end of the document. The following elements can be used for
+%D that purpose:
+%D
+%D <verbatim>
+%D <line><text></line>
+%D <line> ...</line>
+%D <line></text></line>
+%D </verbatim>
+%D \stopbuffer
+%D
+%D \showelements [context] [text]
+
+\defineXMLenvironment [context:text] \starttext \stoptext
+
+%D \elements {em}
+%D
+%D \startbuffer
+%D Authors often want some control over the way a text is typeset, which is
+%D why we provide the <element>em</element> element. We may only hope that
+%D the author is <em>consistent</em> in his decisions on what to emphasize.
+%D \stopbuffer
+%D
+%D \showelements [context] [em]
+
+\defineXMLgrouped [context:em] \em
+
+%D \elements {b}
+%D
+%D \startbuffer
+%D Bold is not always <b>beautiful</b> but if you really want it, you can
+%D get it by using this element.
+%D \stopbuffer
+%D
+%D \showelements [context] [b]
+
+\defineXMLgrouped [context:b] \bf
+
+%D \elements {verbatim,typing,line,verb,type}
+%D
+%D \startbuffer
+%D Although the following method can be used to typeset a piece of code
+%D verbatim
+%D
+%D <![CDATA[
+%D Dit \is nogal verbatim !
+%D Dit is {nogal} verbatim !
+%D Dit is <nogal> verbatim !
+%D ]]>
+%D
+%D we prefer the more structured:
+%D
+%D <verbatim>
+%D <line>Dit \is nogal verbatim !</line>
+%D <line>Dit is {nogal} verbatim !</line>
+%D <line>Dit is <nogal> verbatim !</line>
+%D </verbatim>
+%D \stopbuffer
+%D
+%D The element to tag in<compound/>line verbatim is <type><verb></type>.
+%D
+%D \showelements [context] [verbatim]
+
+\defineXMLenvironment [context:verbatim]
+ {\startpacked
+ \defineXMLargument[context:line]{\endgraf\type}}
+ {\stoppacked}
+
+\defineXMLenvironment [context:typing]
+ {\startpacked\defineXMLargument[context:line]{\endgraf\type}}
+ {\stoppacked}
+
+\defineXMLargument [context:verb] \type
+\defineXMLargument [context:type] \type
+
+%D \elements {itemize,item}
+%D
+%D \startbuffer
+%D Itemized lists are quite common in documents, al least in the ones that
+%D we produce. For the moment we only provide a few options, later we will
+%D hook it into the &context; attribute handler.
+%D
+%D <itemize type="a">
+%D <item label="bla"> test </item>
+%D <item> test </item>
+%D </itemize>
+%D
+%D <itemize packed="yes">
+%D <item label="more bla"> test </item>
+%D <item> test <em>what?</em></item>
+%D </itemize>
+%D \stopbuffer
+%D
+%D \showelements [context] [itemize]
+
+\defineXMLenvironment [context:itemize] [type=,packed=]
+ {\let\XMLoptions\empty
+ \doifsomethingXMLop{type}{\addtocommalist{\XMLop{type}}\XMLoptions}%
+ \doifXMLop{packed}{yes}{\addtocommalist{packed}\XMLoptions}%
+ \expanded{\startitemize[\XMLoptions]}}
+ {\stopitemize}
+
+\defineXMLenvironment [context:item] [label=]
+ {\expanded{\item[\XMLop{label}]}}
+ {\endgraf}
+
+%D \elements {externalfigure}
+%D
+%D \startbuffer
+%D The previous examples already demonstrated how we can include a graphic:
+%D
+%D <verbatim>
+%D <line><externalfigure file="cow" width="5cm" /></line>
+%D </verbatim>
+%D \stopbuffer
+%D
+%D \showelements [context] [externalfigure]
+
+\defineXMLsingular [context:externalfigure] [\??ef] [base=,label=,file=]
+ {\bgroup % \getXMLta \expandXMLta \expandXMLtp{file}%
+ \expandXMLta
+ \getXMLta % expand entities first
+ \doifelsenothing{\XMLtp{label}}
+ {\expanded{\externalfigure[\XMLtp{file}][\XMLta]}}
+ {\doifsomething{\XMLtp{base}}{\usefigurebase[\XMLtp{base}]}%
+ \expanded{\externalfigure[\XMLtp{label}][\XMLta]}}
+ \egroup}
+
+%D \elements {fixed}
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D Something fixed will end up at the place where it defined in the input
+%D stream. The main idea behind this element is that it gives you control
+%D over the placement.
+%D
+%D <itemize>
+%D <item>
+%D <fixed align="high">
+%D <content>
+%D <externalfigure file="cow" frame="on" height="1cm" />
+%D </content>
+%D </fixed>
+%D </item>
+%D </itemize>
+%D \stopbuffer
+%D
+%D \showelements [context] [fixed]
+
+\defineXMLenvironment [context:fixed] [type=figure,location=,label=]
+ {\bgroup
+ \defineXMLsave[context:caption]
+ \defineXMLsave[context:content]}
+ {\expanded{\startfixed[\XMLop{location}]}%
+ \doifXMLdataelse{context:caption}
+ {\startcombination[1*1]
+ {\XMLflush{context:content}} {\XMLflush{context:caption}}
+ \stopcombination}
+ {\XMLflush{context:content}}%
+ \stopfixed
+ \egroup}
+
+%D \elements {float}
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D A floating body will be placed at the first location available, unless
+%D a location is specified. As with the <element>fixed</element> element,
+%D you can provide a caption.
+%D
+%D <float type="figure">
+%D <content>
+%D <externalfigure file="cow" frame="on" height="3cm" />
+%D </content>
+%D <caption>This is a cow!</caption>
+%D </float>
+%D \stopbuffer
+%D
+%D \showelements [context] [float]
+
+\defineXMLenvironment [context:float] [type=figure,location=here,label=]
+ {\bgroup
+ \defineXMLsave[context:caption]
+ \defineXMLsave[context:content]}
+ {\expanded
+ {\placefloat
+ [\XMLop{type}] [\XMLop{location}] [\XMLop{label}]
+ {\XMLflush{context:caption}} {\XMLflush{context:content}}}
+ \egroup}
+
+%D \elements {quotation,quote}
+%D
+%D \startbuffer
+%D There is a (not so) subtle difference between a display
+%D <quotation>quotation</quotation> and an <quote>in<compound/>line</quote>
+%D one.
+%D \stopbuffer
+%D
+%D \showelements [context] [table]
+
+\defineXMLgrouped [context:quote] \quote
+\defineXMLgrouped [context:quotation] \quotation
+
+%D \elements {table,tr,td}
+%D
+%D \startbuffer
+%D There are (currently) three table mechanisms in &context;. One of them
+%D resembles the well known &html; tables.
+%D
+%D <?context-command \startlinecorrection[blank] ?>
+%D <table>
+%D <tr> <td>one</td> <td>a</td> <td>first </td> </tr>
+%D <tr> <td>two</td> <td>b</td> <td>second</td> </tr>
+%D </table>
+%D <?context-command \stoplinecorrection ?>
+%D
+%D As you can see here, we use a similar syntax but stick to the &context;
+%D attributes (which provide quite advanced control over the layout).
+%D
+%D <?context-command \startlinecorrection[blank] ?>
+%D <table frame="off" background="color" color="white">
+%D <tr backgroundcolor="red"> <td>xx</td> <td>xx</td> </tr>
+%D <tr backgroundcolor="green"> <td>xx</td> <td>xx</td> </tr>
+%D </table>
+%D <?context-command \stoplinecorrection ?>
+%D \stopbuffer
+%D
+%D \showelements [context] [table]
+
+\defineXMLenvironment [context:table] [\@@tbl\@@tbl]
+ {\bgroup
+ \defineXMLnested [context:tr] [\@@tbl] {\expanded{\bTR[\theXMLarguments{\@@tbl}}]} \eTR
+ \defineXMLnested [context:td] [\@@tbl] {\expanded{\bTD[\theXMLarguments{\@@tbl}}]} \eTD
+ \expanded{\bTABLE[\theXMLarguments{\@@tbl\@@tbl}]}}
+ {\eTABLE
+ \egroup}
+
+%D \elements {tabulate,tspec,thead,tbody,ttail,trule,tr,td}
+%D
+%D \startbuffer
+%D The second mechanism that we support is tabulation. The advantage of this
+%D mechanism is that it it well tuned for tables that have much text in the
+%D cells and cross page boundaires.
+%D
+%D <tabulate>
+%D <tspec>
+%D <tcell align="left"/> <tcell align="middle"/> <tcell align="right"/>
+%D </tspec>
+%D <thead>
+%D <trule/>
+%D <tr> <td> bagger </td> <td> bagger </td> <td> bagger </td> </tr>
+%D <trule/>
+%D </thead>
+%D <ttail>
+%D <trule/>
+%D </ttail>
+%D <tbody>
+%D <tr> <td> bagger </td> <td> bagger </td> <td> bagger </td> </tr>
+%D <tr> <td> bagg </td> <td> ger </td> <td> gr </td> </tr>
+%D <tr> <td> bag </td> <td> er </td> <td> gger </td> </tr>
+%D </tbody>
+%D </tabulate>
+%D \stopbuffer
+%D
+%D \showelements [context] [tabulate]
+
+\newtoks\XMLtabtoks
+
+\defineXMLgrouped [context:tabulate] {\XMLtabtoks{|l|p|}}
+
+\defineXMLpickup [context:tbody]
+ {\expanded{\definetabulate[dummy][\the\XMLtabtoks]}
+ \startdummy\XMLflush{context:thead}}
+ {\XMLflush{context:ttail}\stopdummy}
+
+\defineXMLsave [context:thead]
+\defineXMLsave [context:ttail]
+
+\defineXMLenvironment[context:tspec]
+ {\XMLtabtoks\emptytoks}
+ {\appendtoks|\to\XMLtabtoks}
+
+\defineXMLsingular [context:trule] % verrrry ugly
+ {\crcr\noalign{\kern-\lineheight}\HL}
+
+\defineXMLsingular [context:tcell] [align=]
+ {\appendtoks|\to\XMLtabtoks
+ \expanded{\processallactionsinset
+ [\XMLop{align}]}
+ [ paragraph=>\appendtoks p\to\XMLtabtoks,
+ left=>\appendtoks l\to\XMLtabtoks,
+ right=>\appendtoks r\to\XMLtabtoks,
+ center=>\appendtoks c\to\XMLtabtoks,
+ middle=>\appendtoks c\to\XMLtabtoks]}
+
+\defineXMLenvironment [context:tr] {\ignorespaces} {\NC\NR}
+\defineXMLenvironment [context:td] {\NC} {\ignorespaces}
+
+%D \elements {hide}
+%D
+%D \startbuffer
+%D This is the way to [<hide>this is gone</hide>] something for the
+%D typesetting engine. Normally this element is only used for testing
+%D purposes.
+%D \stopbuffer
+%D
+%D \showelements [context] [tabulate]
+
+\defineXMLignore[context:hide]
+
+%D \elements {unknown}
+%D
+%D \startbuffer
+%D We can go on and on and <unknown/> with defining elements that map onto
+%D &context; commands, but why not just use &tex; input syntax then?
+%D \stopbuffer
+%D
+%D \showelements [context] [unknown]
+
+\defineXMLsingular [context:unknown] \unknown
+
+%D A (for the moment) private one.
+
+\defineXMLargument [context:element] \type
+
+%D The following common schema definitions apply:
+%D
+%D {\setupcolors[state=stop]\showXSDcomponent[context][definitions]}
+
+\defineXMLargument [context:chapter] [label=] {\chapter[\XMLop{label}]}
+\defineXMLargument [context:section] [label=] {\section[\XMLop{label}]}
+\defineXMLargument [context:subsection] [label=] {\subsection[\XMLop{label}]}
+\defineXMLargument [context:subsubsection] [label=] {\subsubsection[\XMLop{label}]}
+\defineXMLargument [context:subsubsubsection] [label=] {\subsubsubsection[\XMLop{label}]}
+
+\defineXMLargument [context:title] [label=] {\title[\XMLop{label}]}
+\defineXMLargument [context:subject] [label=] {\subject[\XMLop{label}]}
+\defineXMLargument [context:subsubject] [label=] {\subsubject[\XMLop{label}]}
+\defineXMLargument [context:subsubsubject] [label=] {\subsubsubject[\XMLop{label}]}
+\defineXMLargument [context:subsubsubsubject] [label=] {\subsubsubsubject[\XMLop{label}]}
+
+\defineXMLenvironment [context:frontmatter] \startfrontmatter \stopfrontmatter
+\defineXMLenvironment [context:bodymatter] \startbodymatter \stopbodymatter
+\defineXMLenvironment [context:backmatter] \startbackmatter \stopbackmatter
+\defineXMLenvironment [context:appendices] \startappendices \stopappendices
+
+\defineXMLargument [context:index] [key=]
+ {\doifelsenothingXMLop{key}{\index}{\expanded{\index[\XMLop{key}]}}}
+
+% \enableXMLfiledata
+
+% Needed for example (stickers and so):
+
+\defineXMLenvironment [context:makeup]
+ \startstandardmakeup \stopstandardmakeup
+
+\protect \endinput
+
+% TO DO
+
+\defineXMLenvironment [combination] [columns=2,rows=1]
+ {\scratchtoks\emptytoks
+ \expanded{\appendtoks \noexpand \startcombination
+ [\XMLop{columns}*\XMLop{rows}]}\to \scratchtoks}
+ {\appendtoks \stopcombination \to \scratchtoks
+ \the\scratchtoks}
+
+\defineXMLprocess[combinationentry]
+
+\defineXMLpickup [combinationitem]
+ {\appendtoks\bgroup}{\egroup\to\scratchtoks}
+
+\defineXMLpickup [combinationcaption]
+ {\appendtoks\bgroup}{\egroup\to\scratchtoks}
+
+\endinput
diff --git a/tex/context/base/x-contml.xsd b/tex/context/base/x-contml.xsd
new file mode 100644
index 000000000..3b71e31e8
--- /dev/null
+++ b/tex/context/base/x-contml.xsd
@@ -0,0 +1,375 @@
+<?xml version="1.0"?>
+
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+
+<xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ This schema describes a class of presentations. The structure is
+ (normally) reflected in the design.
+
+ author: Hans Hagen, copyright: PRAGMA-ADE / Hasselt NL
+ </xsd:documentation>
+</xsd:annotation>
+
+
+<?context-block begin definitions ?>
+
+ <xsd:complexType name="filename.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value='[a-zA-Z0-9\-\:\.]*' />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:complexType name="filetype.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="tex" />
+ <xsd:enumeration value="xml" />
+ <xsd:enumeration value="txt" />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:complexType name="confirmation.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="yes" />
+ <xsd:enumeration value="no" />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:complexType name="conversion.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value='(a|A|n|g|G|r|R|1|2|3|4)' />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:complexType name="reference.label.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value='([a-zA-Z0-9\-\:]*' />
+ </xsd:restriction>
+ </xsd:complexType>
+
+<?context-block end definitions ?>
+
+
+<?context-block begin text ?>
+
+ <xsd:element name="presentation" mixed="true" />
+
+<?context-block end text ?>
+
+
+<?context-block begin p ?>
+
+ <xsd:element name="p" mixed="true" />
+
+<?context-block end p ?>
+
+
+<?context-block begin hide ?>
+
+ <xsd:element name="hide" mixed="true" />
+
+<?context-block end hide ?>
+
+
+<?context-block begin em ?>
+
+ <xsd:element name="em" mixed="true" />
+
+<?context-block end em ?>
+
+
+<?context-block begin b ?>
+
+ <xsd:element name="b" mixed="true" />
+
+<?context-block end b ?>
+
+
+<?context-block begin quote ?>
+
+ <xsd:element name="quote" mixed="true" />
+ <xsd:element name="quotation" mixed="true" />
+
+<?context-block end quote ?>
+
+
+<?context-block begin include ?>
+
+ <xsd:attributeGroup name="include.attributes">
+ <xsd:attribute name="file" type="filename.value" use="required" />
+ <xsd:attribute name="type" type="filetype.value" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType type="include.type">
+ <xsd:attributeGroup ref="include.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="include" type="include.type" />
+
+<?context-block end include ?>
+
+
+<?context-block begin compound ?>
+
+ <xsd:attributeGroup name="compound.attributes">
+ <xsd:attribute name="token" type="xsd:string" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType type="compound.type">
+ <xsd:attributeGroup ref="compound.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="compound" type="compound.type" />
+
+<?context-block end compound ?>
+
+
+<?context-block begin references ?>
+
+ <xsd:attributeGroup name="reference.attributes">
+ <xsd:attribute name="label" type="reference.label.value" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType type="reference.type">
+ <xsd:attributeGroup ref="reference.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="lineref" type="reference.type" />
+ <xsd:element name="pageref" type="reference.type" />
+ <xsd:element name="textref" type="reference.type" />
+
+<?context-block end references ?>
+
+
+<?context-block begin unknown ?>
+
+ <xsd:element name="unknown"/>
+
+<?context-block end unknown ?>
+
+
+<?context-block begin verbatim ?> <!-- string or anyType -->
+
+ <xsd:complexType name="verbatim.verbatim">
+ <xsd:sequence maxOccurs="unbounded" >
+ <xsd:element name="line" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="verbatim" type="verbatim.verbatim" />
+ <xsd:element name="typing" type="verbatim.verbatim" />
+
+ <xsd:element name="verb" type="xsd:string" />
+ <xsd:element name="type" type="xsd:string" />
+
+<?context-block end verbatim ?>
+
+
+<?context-block begin itemize ?>
+
+ <xsd:attributeGroup name="itemize.attributes">
+ <xsd:attribute name="type" type="conversion.value" />
+ <xsd:attribute name="packed" type="confirmation.value" />
+ <xsd:attribute name="label" type="reference.label.value" />
+ </xsd:attributeGroup>
+
+ <xsd:attributeGroup name="item.attributes">
+ <xsd:attribute name="label" type="reference.label.value" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType name="item.type" mixed="true">
+ <xsd:attributeGroup ref="item.attributes" />
+ </xsd:complexType>
+
+ <xsd:complexType name="itemize.type">
+ <xsd:sequence minOccurs="1" maxOccurs="unbounded">
+ <xml:element name="item" type="item.type" />
+ </xsd:sequence>
+ <xsd:attributeGroup ref="itemize.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="itemize" type="itemize.type" />
+
+<?context-block end itemize ?>
+
+
+<?context-block begin fixed ?>
+
+ <xsd:complexType name="fixed.type.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="figure" />
+ <xsd:enumeration value="table" />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:complexType name="fixed.location.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="high" />
+ <xsd:enumeration value="low" />
+ <xsd:enumeration value="lohi" />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:attributeGroup name="fixed.attributes">
+ <xsd:attribute name="type" type="fixed.type.value" />
+ <xsd:attribute name="location" type="fixed.location.value" />
+ <xsd:attribute name="label" type="reference.label.value" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType name="fixed.type">
+ <xsd:all>
+ <xsd:element name="caption" mixed="true" />
+ <xsd:element name="content" mixed="true" />
+ </xsd:all>
+ <xsd:attributeGroup ref="fixed.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="fixed" type="fixed.type" />
+
+<?context-block end fixed ?>
+
+
+<?context-block begin float ?>
+
+ <xsd:complexType name="float.type.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="figure" />
+ <xsd:enumeration value="table" />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:complexType name="float.location.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="high" />
+ <xsd:enumeration value="low" />
+ <xsd:enumeration value="lohi" />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:attributeGroup name="float.attributes">
+ <xsd:attribute name="type" type="float.type.value" />
+ <xsd:attribute name="location" type="float.location.value" />
+ <xsd:attribute name="label" type="reference.label.value" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType name="float.type">
+ <xsd:all>
+ <xsd:element name="caption" mixed="true" />
+ <xsd:element name="content" mixed="true" />
+ </xsd:all>
+ <xsd:attributeGroup ref="float.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="float" type="float.type" />
+
+<?context-block end float ?>
+
+
+<?context-block begin externalfigure ?>
+
+ <xsd:attributeGroup name="externalfigure.attributes">
+ <xsd:extension base="context.kernel.externalfigure.attributes">
+ <xsd:attribute name="base" type="filename.value"/>
+ <xsd:attribute name="file" type="filename.value"/>
+ <xsd:attribute name="label" type="reference.label.value"/>
+ </xsd:extension>
+ </xsd:attributeGroup>
+
+ <xsd:complexType name="externalfigure.type">
+ <xsd:attributeGroup ref="externalfigure.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="externalfigure" type="externalfigure.type" />
+
+<?context-block end externalfigure ?>
+
+
+<?context-block begin table ?>
+
+ <xsd:attributeGroup name="table.attributes">
+ <!-- these elements inherit ConTeXt TABLE parameters -->
+ <xsd:extension base="context.kernel.table.attributes" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType name="table.td.type" mixed="true">
+ <xsd:attributeGroup name="table.attributes" />
+ </xsd:complexType>
+
+ <xsd:complexType name="table.tr.type">
+ <xsd:sequence maxOccurs="unbounded">
+ <xsd:element name="td" type="table.td.type" />
+ </xsd:sequence>
+ <xsd:attributeGroup name="table.attributes" />
+ </xsd:complexType>
+
+ <xsd:complexType name="table.type">
+ <xsd:sequence maxOccurs="unbounded">
+ <xsd:element name="tr" type="table.tr.type" />
+ </xsd:sequence>
+ <xsd:attributeGroup name="table.attributes" />
+ </xsd:complexType>
+
+ <xsd:element name="table" type="table.type" />
+
+<?context-block end table ?>
+
+
+<?context-block begin tabulate ?>
+
+ <xsd:complexType name="tabulate.td.type" mixed="true">
+ </xsd:complexType>
+
+ <xsd:complexType name="tabulate.tr.type">
+ <xsd:sequence maxOccurs="unbounded">
+ <xsd:element name="td" type="tabulate.td.type" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="tabulate.base.type">
+ <xsd:sequence maxOccurs="unbounded">
+ <xsd:element name="tr" type="tabulate.tr.type" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="tabulate.align.value">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="high" />
+ <xsd:enumeration value="low" />
+ <xsd:enumeration value="lohi" />
+ </xsd:restriction>
+ </xsd:complexType>
+
+ <xsd:attributeGroup name="tabulate.tcell.attributes">
+ <xsd:attribute name="align" type="tabulate.align.value" />
+ </xsd:attributeGroup>
+
+ <xsd:complexType name="tabulate.tcell.type" mixed="true">
+ <xsd:attributeGroup ref="tabulate.tcell.attributes" />
+ </xsd:complexType>
+
+ <xsd:complexType name="tabulate.tcell.type">
+ </xsd:complexType>
+
+ <xsd:complexType name="tabulate.tcells.type">
+ <xsd:sequence maxOccurs="unbounded">
+ <xsd:element name="tcell" type="tabulate.tcell.type" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="tabulate.type">
+ <xsd:sequence>
+ <xsd:element name="tcells" type="tabulate.tcells.type" />
+ <xsd:element name="thead" type="tabulate.base.type" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="ttail" type="tabulate.base.type" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="tbody" type="tabulate.base.type" minOccurs="1" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="tabulate" type="tabulate.type" />
+
+<?context-block end tabulate ?>
+
+
+</xsd:schema>
diff --git a/tex/context/base/x-corres.mkii b/tex/context/base/x-corres.mkii
new file mode 100644
index 000000000..09c7263dc
--- /dev/null
+++ b/tex/context/base/x-corres.mkii
@@ -0,0 +1,136 @@
+%D \module
+%D [ file=x-corres,
+%D version=2003.12.15, % replaces keep-02a cum suis
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Handling Correspondence Base,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The selection spec:
+
+\setvariables
+ [contacts]
+ [selection=,
+ file=x-corres.xml] % fall back
+
+%D First we define the group expansion pass:
+
+\startsetups[contacts:collect]
+
+ \defineXMLprocess [contacts]
+
+ \defineXMLignore [contact]
+
+ \defineXMLargument [contactfile]
+ \processfile
+
+ \defineXMLenvironmentsave [contactgroup] [label=]
+ {\startXMLmappinggroup[contacts]}
+ {\XMLaddcontactgrouptoselection
+ \stopXMLmappinggroup}
+
+\stopsetups
+
+%D Next we define the main processing pass:
+
+\startsetups[contacts:process]
+
+ \defineXMLprocess[contacts]
+
+ \defineXMLignore [contactgroup]
+
+ \defineXMLargument [contactfile]
+ \processfile
+
+ \defineXMLenvironmentsave[contact] [label=]
+ {\startXMLmappinggroup[contacts]}
+ {\XMLselectcontact
+ \stopXMLmappinggroup}
+
+\stopsetups
+
+\startXMLmapping[contacts]
+
+ \defineXMLsave [initials]
+ \defineXMLsave [formalname]
+ \defineXMLsave [informalname]
+ \defineXMLsave [title]
+ \defineXMLsave [prefix]
+ \defineXMLsave [suffix]
+ \defineXMLsave [telephone]
+ \defineXMLsave [mobiletelephone]
+ \defineXMLsave [telefax]
+ \defineXMLsave [email]
+ \defineXMLsave [address]
+ \defineXMLsave [information]
+
+ \defineXMLenvironment [p] \endgraf \endgraf
+
+ \defineXMLargument [member] \XMLaddcontacttoselection
+
+\stopXMLmapping
+
+%D The selection macros: we expand groups and replace them
+%D by contact labels in the selection spec.
+
+\def\XMLaddcontactgrouptoselection
+ {\edef\XMLcontactlist{\getvariable{contacts}{selection}}%
+ \edef\XMLgrouplabel {\XMLop{label}}%
+ \expanded{\doifinset{\XMLgrouplabel}{\XMLcontactlist}}
+ {\let\XMLgrouplist\empty
+ \XMLflush{contactgroup}%
+ \substituteincommalist\XMLgrouplabel\XMLgrouplist\XMLcontactlist
+ \expanded
+ {\globalsetvariables
+ [contacts]
+ [selection={\XMLcontactlist}]}}}
+
+\def\XMLaddcontacttoselection#1%
+ {\addtocommalist{#1}\XMLgrouplist}
+
+%D The main selector:
+
+\def\XMLselectcontact
+ {\edef\XMLcontactlist {\getvariable{contacts}{selection}}%
+ \edef\XMLcontactlabel{\XMLop{label}}%
+ \doifelsenothing{\XMLcontactlist}
+ {\donetrue}
+ {\expanded{\doifinsetelse{\XMLcontactlabel}{\XMLcontactlist}}
+ {\donetrue}
+ {\donefalse}}%
+ \ifdone
+ \XMLflush{contact}%
+ \setups[contact:handle]%
+ \fi}
+
+%D The default:
+
+\startsetups[contact:handle]
+
+ \XMLflush{address}
+
+\stopsetups
+
+\setups[contacts:process]
+
+%D Handy:
+
+\def\XMLprocesscontacts
+ {\dosingleempty\XMLprocesscontacts}
+
+\def\XMLprocesscontacts[#1]%
+ {\bgroup
+ \doifelsenothing{#1}
+ {\XMLprocesscontacts[\getvariable{contacts}{file}]}
+ {\setups[contacts:collect]%
+ \processcommacommand[#1]\processXMLfile
+ \setups[contacts:process]%
+ \processcommacommand[#1]\processXMLfile}%
+ \egroup}
+
+\endinput
diff --git a/tex/context/base/x-corres.rng b/tex/context/base/x-corres.rng
new file mode 100644
index 000000000..09de5d267
--- /dev/null
+++ b/tex/context/base/x-corres.rng
@@ -0,0 +1,170 @@
+<?xml version="1.0" ?>
+
+<?context-block begin grammar ?>
+
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+ <?context-block end grammar ?>
+
+ <?context-block begin contacts ?>
+
+ <start>
+ <ref name="contacts"/>
+ </start>
+
+ <define name="contacts">
+ <element name="contacts">
+ <zeroOrMore>
+ <choice>
+ <ref name="contacts.contact"/>
+ <ref name="contacts.contactgroup"/>
+ <ref name="contacts.contactfile"/>
+ </choice>
+ </zeroOrMore>
+ </element>
+ </define>
+
+ <?context-block end contacts ?>
+
+ <?context-block begin contact ?>
+
+ <define name="contacts.contact">
+ <element name="contact">
+ <interleave>
+ <optional> <ref name="contact.initials"/> </optional>
+ <optional> <ref name="contact.formalname"/> </optional>
+ <optional> <ref name="contact.informalname"/> </optional>
+ <optional> <ref name="contact.title"/> </optional>
+ <optional> <ref name="contact.prefix"/> </optional>
+ <optional> <ref name="contact.suffix"/> </optional>
+ <optional> <ref name="contact.telephone"/> </optional>
+ <optional> <ref name="contact.mobiletelephone"/> </optional>
+ <optional> <ref name="contact.telefax"/> </optional>
+ <optional> <ref name="contact.email"/> </optional>
+ <optional> <ref name="contact.address"/> </optional>
+ <optional> <ref name="contact.information"/> </optional>
+ </interleave>
+ <attribute name="label"/>
+ </element>
+ </define>
+
+ <?context-block end contact ?>
+
+ <?context-block begin fields ?>
+
+ <define name="contact.initials">
+ <element name="initials">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.formalname">
+ <element name="formalname">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.informalname">
+ <element name="informalname">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.title">
+ <element name="title">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.prefix">
+ <element name="prefix">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.suffix">
+ <element name="suffix">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.telephone">
+ <element name="telephone">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.mobiletelephone">
+ <element name="mobiletelephone">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.telefax">
+ <element name="telefax">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.email">
+ <element name="email">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.address">
+ <element name="address">
+ <zeroOrMore>
+ <ref name="contact.address.p"/>
+ </zeroOrMore>
+ </element>
+ </define>
+
+ <define name="contact.information">
+ <element name="information">
+ <text/>
+ </element>
+ </define>
+
+ <define name="contact.address.p">
+ <element name="p">
+ <text/>
+ </element>
+ </define>
+
+ <?context-block end fields ?>
+
+ <?context-block begin contactgroup ?>
+
+ <define name="contacts.contactgroup">
+ <element name="contactgroup">
+ <zeroOrMore>
+ <ref name="contactgroup.member"/>
+ </zeroOrMore>
+ <attribute name="label"/>
+ </element>
+ </define>
+
+ <define name="contactgroup.member">
+ <element name="member">
+ <text/>
+ </element>
+ </define>
+
+ <?context-block end contactgroup ?>
+
+ <?context-block begin contactfile ?>
+
+ <define name="contacts.contactfile">
+ <element name="contactfile">
+ <text/>
+ </element>
+ </define>
+
+ <?context-block end contactfile ?>
+
+ <?context-block begin grammar ?>
+
+</grammar>
+
+<?context-block end grammar ?> \ No newline at end of file
diff --git a/tex/context/base/x-ct.lua b/tex/context/base/x-ct.lua
new file mode 100644
index 000000000..222a127ce
--- /dev/null
+++ b/tex/context/base/x-ct.lua
@@ -0,0 +1,182 @@
+if not modules then modules = { } end modules ['x-ct'] = {
+ version = 1.001,
+ comment = "companion to x-ct.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local xmlsprint, xmlfilter, xmlcollected = xml.sprint, xml.filter, xml.collected
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local format, concat, rep, find = string.format, table.concat, string.rep, string.find
+
+lxml.context = { }
+
+local halignments = {
+ left = 'l',
+ flushleft = 'l',
+ right = 'r',
+ flushright = 'r',
+ center = 'c',
+ middle = 'c',
+ centre = 'c',
+ justify = '',
+}
+
+local function roottemplate(root)
+ local rt = root.at.template
+ if rt then
+ if not find(rt,"|") then
+ rt = gsub(rt,",","|")
+ end
+ if not find(rt,"^|") then rt = "|" .. rt end
+ if not find(rt,"|$") then rt = rt .. "|" end
+ end
+ return rt
+end
+
+local function specifiedtemplate(root,templatespec)
+ local template = { }
+ for e in xmlcollected(root,templatespec) do
+ local at = e.at
+ local tm = halignments[at.align] or ""
+ if toboolean(at.paragraph) then
+ tm = tm .. "p"
+ end
+ template[#template+1] = tm
+ end
+ if #template > 0 then
+ return "|" .. concat(template,"|") .. "|"
+ else
+ return nil
+ end
+end
+
+local function autotemplate(root,rowspec,cellspec)
+ local max = 0
+ for e in xmlcollected(root,rowspec) do
+ local n = xml.count(e,cellspec)
+ if n > max then max = n end
+ end
+ if max == 2 then
+ return "|l|p|"
+ elseif max > 0 then
+ return "|" .. rep("p|",max)
+ else
+ return nil
+ end
+end
+
+local defaulttemplate = "|l|p|"
+
+function lxml.context.tabulate(root,namespace)
+ if not root then
+ return
+ else
+ root = lxml.id(root)
+ end
+
+ local prefix = (namespace or "context") .. ":"
+
+ local templatespec = "/" .. prefix .. "template" .. "/" .. prefix .. "column"
+ local bodyrowspec = "/" .. prefix .. "body" .. "/" .. prefix .. "row"
+ local cellspec = "/" .. prefix .. "cell"
+
+ local template =
+ roottemplate (root) or
+ specifiedtemplate (root,templatespec) or
+ autotemplate (root,bodyrowspec,cellspec) or
+ defaulttemplate
+
+ -- todo: head and foot
+
+--~ lxml.directives.before(root,'cdx')
+--~ texsprint(ctxcatcodes, "\\bgroup")
+--~ lxml.directives.setup(root,'cdx')
+--~ texsprint(ctxcatcodes, format("\\starttabulate[%s]",template))
+--~ for e in xmlcollected(root,bodyrowspec) do
+--~ texsprint(ctxcatcodes, "\\NC ")
+--~ for e in xmlcollected(e,cellspec) do
+--~ texsprint(xml.text(e)) -- use some xmlprint
+--~ texsprint(ctxcatcodes, "\\NC")
+--~ end
+--~ texsprint(ctxcatcodes, "\\NR")
+--~ end
+--~ texsprint(ctxcatcodes, "\\stoptabulate")
+--~ texsprint(ctxcatcodes, "\\egroup")
+--~ lxml.directives.after(root,'cdx')
+
+ local NC, NR = context.NC, context.NR
+
+ lxml.directives.before(root,'cdx')
+ context.bgroup()
+ lxml.directives.setup(root,'cdx')
+ context.starttabulate { template }
+ for e in xmlcollected(root,bodyrowspec) do
+ NC()
+ for e in xmlcollected(e,cellspec) do
+ texsprint(xml.text(e)) -- test: xmlcprint(e)
+ NC()
+ end
+ NR()
+ end
+ context.stoptabulate()
+ context.egroup()
+ lxml.directives.after(root,'cdx')
+
+end
+
+function lxml.context.combination(root,namespace)
+
+ if not root then
+ return
+ else
+ root = lxml.id(root)
+ end
+
+ local prefix = (namespace or "context") .. ":"
+
+ local pairspec = "/" .. prefix .. "pair"
+ local contentspec = "/" .. prefix .. "content" .. "/text()"
+ local captionspec = "/" .. prefix .. "caption" .. "/text()"
+
+ local nx, ny = root.at.nx, root.at.ny
+
+ if not (nx or ny) then
+ nx = xml.count(root,pairspec) or 2
+ end
+ local template = format("%s*%s", nx or 1, ny or 1)
+
+ -- todo: alignments
+
+--~ lxml.directives.before(root,'cdx')
+--~ texsprint(ctxcatcodes, "\\bgroup")
+--~ lxml.directives.setup(root,'cdx')
+--~ texsprint(ctxcatcodes, "\\startcombination[",template,"]")
+--~ for e in xmlcollected(root,pairspec) do
+--~ texsprint(ctxcatcodes,"{")
+--~ xmlfilter(e,contentspec)
+--~ texsprint(ctxcatcodes,"}{")
+--~ xmlfilter(e,captionspec)
+--~ texsprint(ctxcatcodes,"}")
+--~ end
+--~ texsprint(ctxcatcodes, "\\stopcombination")
+--~ texsprint(ctxcatcodes, "\\egroup")
+--~ lxml.directives.after(root,'cdx')
+
+ lxml.directives.before(root,'cdx')
+ context.bgroup()
+ lxml.directives.setup(root,'cdx')
+ context.startcombination { template }
+ for e in xmlcollected(root,pairspec) do
+ texsprint(ctxcatcodes,"{")
+ xmlfilter(e,contentspec)
+ texsprint(ctxcatcodes,"}{")
+ xmlfilter(e,captionspec)
+ texsprint(ctxcatcodes,"}")
+ end
+ context.stopcombination()
+ context.egroup()
+ lxml.directives.after(root,'cdx')
+
+end
diff --git a/tex/context/base/x-ct.mkiv b/tex/context/base/x-ct.mkiv
new file mode 100644
index 000000000..d282193a1
--- /dev/null
+++ b/tex/context/base/x-ct.mkiv
@@ -0,0 +1,29 @@
+%D \module
+%D [ file=x-cals,
+%D version=2007.09.05,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=\CONTEXT\ Structures,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt XML Macros / Basics}
+
+\startmodule [ct]
+
+\ctxloadluafile{x-ct}{}
+
+\startxmlsetups xml:context:process
+ \xmlsetfunction {\xmldocument} {context:tabulate} {lxml.context.tabulate}
+ \xmlsetfunction {\xmldocument} {context:combination} {lxml.context.combination}
+\stopxmlsetups
+
+\xmlregistersetup{xml:context:process}
+
+\xmlregisterns{context}{context}
+
+\stopmodule
diff --git a/tex/context/base/x-dir-01.tex b/tex/context/base/x-dir-01.tex
new file mode 100644
index 000000000..b1056fdd5
--- /dev/null
+++ b/tex/context/base/x-dir-01.tex
@@ -0,0 +1,145 @@
+%D \module
+%D [ file=x-dir-01,
+%D version=2003.05.10, % around that time -)
+%D title=\CONTEXT\ Directory Handling,
+%D subtitle=Overview (1),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ backspace=12pt,
+ topspace=12pt,
+ bottomspace=32pt,
+ header=0pt,
+ footer=0pt,
+ bottomdistance=9pt,
+ bottom=18pt]
+
+\setupinteractionmenu
+ [bottom]
+ [state=start,
+ frame=off,
+ rightoffset=-3pt,
+ background=color,
+ backgroundcolor=TextColor,
+ middle=\hskip4pt,
+ left=\hfill]
+
+\startinteractionmenu[bottom]
+ \but [PreviousJump] Previous Jump \\
+ \but [previouspage] Previous Page \\
+ \but [nextpage] Next Page \\
+\stopinteractionmenu
+
+\setupbackgrounds
+ [page]
+ [backgroundoffset=3pt,
+ background=color,
+ backgroundcolor=PageColor]
+
+\setupbackgrounds
+ [text]
+ [background=color,
+ backgroundcolor=TextColor]
+
+\definecolor [PageColor] [r=.6,g=.7,b=.8]
+\definecolor [TextColor] [r=.7,g=.8,b=.9]
+\definecolor [DoneColor] [s=.5]
+
+\startmode[colorscheme-red]
+
+ \definecolor [PageColor] [r=.9,g=.7,b=.6]
+ \definecolor [TextColor] [r=.9,g=.8,b=.7]
+
+\stopmode
+
+\startmode[colorscheme-green]
+
+ \definecolor [PageColor] [r=.6,g=.8,b=.7]
+ \definecolor [TextColor] [r=.7,g=.9,b=.8]
+
+\stopmode
+
+\setupcolors
+ [state=start]
+
+\setupinteraction
+ [state=start,
+ menu=on,
+ color=,
+ display=new,
+ contrastcolor=DoneColor,
+ style=]
+
+\definehead
+ [directory]
+ [subject]
+
+\setuphead
+ [directory]
+ [style=\tfc]
+
+\setupbodyfont
+ [tt]
+
+\defineXMLenvironment [files] [url=]
+ {\doifelsenothing{\XMLop{url}}
+ {\xdef\XMLDIRurl{}}
+ {\xdef\XMLDIRurl{\XMLop{url}/}}
+ \startXMLignore}
+ {\stopXMLignore}
+
+\newcounter\NOfEntries
+
+\startsetups[xmldir:file]
+
+ \doglobal\increment\NOfEntries
+
+ \goto {\hbox to \hsize \bgroup
+
+ \XMLflush{base}
+ \hss
+ \hbox to 2em{\XMLflush{type}\hss}
+ \quad
+ \quad
+ \hbox to 5em{\hss\XMLflush{size}}
+ \quad
+ \quad
+ \XMLflush{date}
+
+ \egroup} [url(\XMLDIRurl\XMLop{name})]% [program(\XMLDIRurl\XMLop{name})]
+
+\stopsetups
+
+\defineXMLenvironment [directory] [name=]
+ {\directory{Path \XMLop{name}}}
+ {}
+
+\defineXMLenvironment [file] [name=]
+ {\bgroup}
+ {\setups[xmldir:file]
+ \endgraf
+ \egroup}
+
+\defineXMLsave[base]
+\defineXMLsave[type]
+\defineXMLsave[size]
+\defineXMLsave[date]
+
+\starttext
+
+ \processXMLfilegrouped{\inputfilename}
+
+ \ifnum\NOfEntries=0 There are no files found that match the pattern. \fi
+
+\stoptext
diff --git a/tex/context/base/x-dir-05.mkii b/tex/context/base/x-dir-05.mkii
new file mode 100644
index 000000000..0d0edd832
--- /dev/null
+++ b/tex/context/base/x-dir-05.mkii
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=x-dir-05,
+%D version=2003.05.10, % around that time -)
+%D title=\CONTEXT\ Directory Handling,
+%D subtitle=Access,
+%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.
+
+\setvariables
+ [filestate]
+ [name=,base=,type=,size=,permissions=,date=]
+
+\def\savefilestate
+ {\dodoubleargument\dosavefilestate}
+
+\def\dosavefilestate[#1][#2]%
+ {\startnointerference
+ \setxvariables
+ [#1]
+ [name=#2,base=,type=,size=,permissions=,date=]
+ \executesystemcommand{texmfstart xmltools.rb --dir --pattern=\getvariable{#1}{name} --output=xmldir.tmp}
+ \defineXMLprocess [files]
+ \defineXMLprocess [directory]
+ \defineXMLenvironment [file]
+ {\defineXMLsave [base]
+ \defineXMLsave [type]
+ \defineXMLsave [size]
+ \defineXMLsave [permissions]
+ \defineXMLsave [date]}
+ {\setxvariables
+ [#1]
+ [name=\XMLop{name},
+ base=\XMLflush{base},
+ type=\XMLflush{type},
+ size=\XMLflush{size},
+ permissions=\XMLflush{permissions},
+ date=\XMLflush{date}]}
+ \startXMLignore
+ \processXMLfile{xmldir.tmp}
+ \stopXMLignore
+ \stopnointerference}
+
+\def\getfilestate#1% old one
+ {\savefilestate[filestate][#1]}
+
+\endinput
diff --git a/tex/context/base/x-dir-05.mkiv b/tex/context/base/x-dir-05.mkiv
new file mode 100644
index 000000000..c29c9ea2a
--- /dev/null
+++ b/tex/context/base/x-dir-05.mkiv
@@ -0,0 +1,72 @@
+%D \module
+%D [ file=x-dir-05,
+%D version=2003.05.10, % around that time -)
+%D title=\CONTEXT\ Directory Handling,
+%D subtitle=Access,
+%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.
+
+\setvariables
+ [filestate]
+ [name=,
+ base=,
+ type=,
+ size=,
+ permissions=,
+ date=]
+
+% \savefilestate[zip-latest][context/latest/cont-#2.zip]%
+
+\startluacode
+ local filestates = { }
+ function commands.savefilestate(tag,name)
+ if not filestates[tag] then
+ local attr = lfs.attributes(name)
+ if attr then attr.name = name end
+ filestates[tag] = attr
+ end
+ end
+ function commands.getfilestatevariable(tag,name)
+ local fs = filestates[tag]
+ if fs then
+ local value
+ if name == "base" then
+ value = file.basename(fs.name)
+ elseif name == "type" then
+ value = file.extname(fs.name)
+ elseif name == "date" then
+ value = os.date("%Y-%m-%d %H:%M",fs.modification)
+ else
+ value = fs[name] or ""
+ end
+ tex.sprint(tex.vrbcatcodes,value)
+ end
+ end
+\stopluacode
+
+\def\getfilestatevariable#1#2%
+ {\ctxlua{commands.getfilestatevariable("#1","#2")}}
+
+\def\savefilestate
+ {\dodoubleargument\dosavefilestate}
+
+\def\dosavefilestate[#1][#2]%
+ {\ctxlua{commands.savefilestate("#1","#2")}%
+ \setxvariables
+ [#1]
+ [name={#2},
+ base=\getfilestatevariable{#1}{base},
+ type=\getfilestatevariable{#1}{type},
+ size=\getfilestatevariable{#1}{size},
+ date=\getfilestatevariable{#1}{date},
+ permissions=\getfilestatevariable{#1}{permissions}]}
+
+\def\getfilestate#1% old one
+ {\savefilestate[filestate][#1]}
+
+\endinput
diff --git a/tex/context/base/x-fdf-00.tex b/tex/context/base/x-fdf-00.tex
new file mode 100644
index 000000000..fd4bea7e7
--- /dev/null
+++ b/tex/context/base/x-fdf-00.tex
@@ -0,0 +1,41 @@
+% <xfdf>
+% <fields>
+% <field name="one">
+% <value>first</value>
+% </field>
+% <field name="two">
+% <value>second</value>
+% </field>
+% </fields>
+% </xfdf>
+%
+% previous method:
+%
+% object
+% data
+% fields
+% field
+
+\defineXMLprocess[fdf:xfdf]
+\defineXMLprocess[fdf:fields]
+\defineXMLignore [fdf:f]
+\defineXMLpush [fdf:value]
+
+\defineXMLenvironment [fdf:field] [name=,value=]
+ {\XMLerase{fdf:value}}
+ {\gsaveXMLdata{fdf:\XMLop{name}}{fdf:value}}
+
+\defineXMLsingular [fdf:field] [name=,value=]
+ {\gsaveXMLasdata{fdf:\XMLop{name}}{\XMLop{value}}}
+
+\def\doifelseFDFfield#1{\doifelseXMLelement{fdf:#1}}
+\def\flushFDFfield #1{\flushXMLelement {fdf:#1}}
+\def\processFDFfield #1{\processXMLelement {fdf:#1}}
+
+\def\loadFDFfile#1%
+ {\bgroup
+ \autoXMLnamespace[fdf]%
+ \processXMLfilegrouped{#1}%
+ \egroup}
+
+\endinput
diff --git a/tex/context/base/x-fe.mkii b/tex/context/base/x-fe.mkii
new file mode 100644
index 000000000..8562b1d52
--- /dev/null
+++ b/tex/context/base/x-fe.mkii
@@ -0,0 +1,143 @@
+%D \module
+%D [ file=x-fe,
+%D version=2004.03.12, % based on earlier experiments
+%D title=\FOXET,
+%D subtitle=Simple Extensions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Extensions: fe:definecolor
+
+% menus
+% extra areas
+% protruding and hz
+% compound
+% title container
+% more float placements
+
+\unprotect
+
+% \XMLattributes{aural},
+
+\defineXMLnested
+ [fe:table-next]
+ [id=,
+ \XMLattributes{accessibility},
+ \XMLattributes{border-padding-background},
+ \XMLattributes{relative-position},
+ border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ visibility=]
+ {\bTABLEnext}
+ {\eTABLEnext}
+
+% definitions
+
+\defineXMLcommand
+ [fe:definecolor]
+ [name=,r=,g=,b=,c=,m=,y=,k=,s=,p=,a=,t=]
+ {\expanded{\definecolor[\XMLop{name}]
+ [r=\XMLop r,g=\XMLop g,b=\XMLop b,
+ c=\XMLop c,m=\XMLop m,y=\XMLop y,k=\XMLop k,
+ s=\XMLop s,p=\XMLop p,a=\XMLop a,t=\XMLop t]}}
+
+\defineXMLcommand
+ [fe:definefontsynonym]
+ [name=,file=,encoding=]
+ {\doifelsenothing{\XMLop{encoding}}
+ {\expanded{\definefontsynonym[\XMLop{name}][\XMLop{file}][encoding=\XMLop{encoding}]}}
+ {\expanded{\definefontsynonym[\XMLop{name}][\XMLop{file}]}}}
+
+%D Extensions: fe:include
+
+\defineXMLsingular
+ [fe:include]
+ [url=,n=1]
+ {\doifelse{\XMLop{n}}{1}
+ {\readfile{\XMLpar{fe:include}{url}{}}{}{}}
+ {\dorecurse{\XMLop{n}}{\readfile{\XMLpar{fe:include}{url}{}}{}{}\endgraf}}}
+
+%D Extensions: fe:sample
+
+\defineXMLenvironment
+ [fe:sample]
+ [origin=unknown]
+ {\removeunwantedspaces\ignorespaces}
+ {\removeunwantedspaces}
+
+%D Extensions: fe:
+
+% \defineXMLenvironmentsave
+% [fe:loop]
+% [n=1]
+% {}
+% {\dorecurse{\XMLop{n}}{\XMLflush{fe:loop}}}
+
+\defineXMLargument
+ [fe:loop]
+ [n=1]
+ {\dorecurse{\XMLop{n}}}
+
+%D Extensions: fe:compound
+
+\defineXMLsingular
+ [fe:compound]
+ [character=-]
+ {\prewordbreak\XMLop{character}\prewordbreak}
+
+%D Extensions: fe:message
+
+\defineXMLargument
+ [fe:message]
+ [category=XML-FO]
+ {\expanded{\writestatus{\XMLop{category}}}}
+
+%D Handy
+
+\defineXMLargument
+ [fe:trace]
+ [attribute=,option=]
+ {\showXMLinh[\XMLop{attribute}]%
+ \XMLval{fe:trace}{\XMLop{option}}{}}
+
+\mapXMLvalue
+ {fe:trace}
+ {font}
+ {\hbox\bgroup\infofont[%
+ \xFOfont/\xFOfontsize/\xFOfontsizeadjust/\xFOfontfamily/\xFOfontweight/\xFOfontstyle/\xFOfontvariant:\FOfontdefinition
+ ]\egroup}
+
+%D Extensions:
+
+\startsetups fe:page:option:fit:start
+ \startTEXpage[margin=page]
+\stopsetups
+
+\startsetups fe:page:option:fit:stop
+ \stopTEXpage
+\stopsetups
+
+\useMPlibrary[pre]
+
+\mapXMLvalue {fe:tracing} {true} {\tracingFOtrue}
+\mapXMLvalue {fe:tracing} {false} {\tracingFOfalse}
+\mapXMLvalue {fe:testgrid} {true} {\setupbackgrounds[page][background=pagegrid]}
+
+\startsetups fe:setup
+ \XMLval{fe:tracing} {\XMLop{fe:tracing}} {}
+ \XMLval{fe:testgrid}{\XMLop{fe:testgrid}}{}
+\stopsetups
+
+%D Private (testing)
+
+\defineXMLcommand[fe:synchronizeoutput]{\synchronizeoutput}
+
+
+\protect \endinput
diff --git a/tex/context/base/x-fig-00.dtd b/tex/context/base/x-fig-00.dtd
new file mode 100644
index 000000000..34b4d0bef
--- /dev/null
+++ b/tex/context/base/x-fig-00.dtd
@@ -0,0 +1,24 @@
+<!-- author : Taco Hoekwater / Hans Hagen
+ info : x-fig-00.tex / x-fig-01.tex
+ usage : <!DOCTYPE figurelibrary SYSTEM "x-fig-00.dtd">
+ -->
+
+<!ELEMENT figurelibrary (description?,figure*)>
+
+<!ATTLIST figurelibrary language CDATA #IMPLIED>
+<!ATTLIST dummy width CDATA #IMPLIED>
+<!ATTLIST dummy height CDATA #IMPLIED>
+
+<!ELEMENT description (organization?,project?,product?,comment?)>
+<!ELEMENT organization (#PCDATA)>
+<!ELEMENT project (#PCDATA)>
+<!ELEMENT product (#PCDATA)>
+
+<!ELEMENT figure (label,file?,dummy?,copyright?,comment?,status?)>
+<!ELEMENT dummy (#PCDATA)>
+<!ELEMENT file (#PCDATA)>
+<!ELEMENT label (#PCDATA)>
+<!ELEMENT copyright (#PCDATA)>
+<!ELEMENT status (#PCDATA)>
+
+<!ELEMENT comment (#PCDATA)>
diff --git a/tex/context/base/x-fig-00.tex b/tex/context/base/x-fig-00.tex
new file mode 100644
index 000000000..d293dc39f
--- /dev/null
+++ b/tex/context/base/x-fig-00.tex
@@ -0,0 +1,252 @@
+%D \module
+%D [ file=x-fig-00,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base Loading,
+%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.
+
+% \readfile{x-res-04} \donothing \donothing \endinput
+
+% naast label, ook fig als ref en dan naar fig ref springen
+
+%D This module implements an interface to a figure database
+%D and file. The database is formatted in \XML\ conforming
+%D the following \DTD:
+%D
+%D \typefile{x-fig-00.dtd}
+%D
+%D A figure base coded this way looks like:
+%D
+%D \starttyping
+%D <!-- texexec --pdf --use=fig-01 figtest.xml -->
+%D
+%D <figurelibrary language="nl">
+%D
+%D <description>
+%D <organization>PRAGMA Advanced Document Engineering</organization>
+%D <project>Manuals</project>
+%D <product>Beginners Manual</product>
+%D <comment>A bunch of figures.</comment>
+%D </description>
+%D
+%D <figure>
+%D <file>koe.pdf</file>
+%D <label>a dutch cow</label>
+%D <copyright>Corel Draw Suite</copyright>
+%D <comment>I bet that you've seen this cow before.</comment>
+%D </figure>
+%D
+%D <figure>
+%D <dummy width="4cm" height="3cm">non existent</dummy>
+%D <label>a european cow</label>
+%D <copyright>Nobody</copyright>
+%D <comment>When will we talk about European cows?</comment>
+%D </figure>
+%D
+%D </figurelibrary>
+%D \stoptyping
+%D
+%D You can convert this base into a \PDF\ file using
+%D \TEXEXEC\ and another module in this suite.
+%D
+%D \starttyping
+%D texexec --pdf --use=fig-make yourfile.xml
+%D \stoptyping
+%D
+%D You can now select a graphic from this file using the
+%D
+%D \starttyping
+%D \externalfigure[a dutch cow][width=4cm]
+%D \stoptyping
+%D
+%D This module overloads this command so that a figure is
+%D it first searched in the list of databases.
+%D
+%D \starttyping
+%D \usemodule [fig-base]
+%D \usefigurebases[yourfile]
+%D \stoptyping
+%D
+%D The special keyword \type {reset} can be used to reset
+%D this list.
+
+%D We park some mkiv code here. Eventually we will hook this into mkiv
+%D searching differently (just a standard feature, no need for loading
+%D modules because we need less code). Actually, what we do here is more
+%D like res-*: we load the xml file once.
+
+% \startluacode
+%
+% document.figurebases = { }
+% document.figurebases.data = { }
+% document.figurebases.found = { }
+%
+% function document.figurebases.find(basename,askedlabel)
+% document.figurebases.found = { }
+% local base = document.figurebases.data[basename]
+% local page = 0
+% if not base then
+% base = xml.load(basename)
+% document.figurebases.data[basename] = base
+% end
+% for e, d, k in xml.elements(base,"figurelibrary/figure/label") do
+% page = page + 1
+% if xml.content(d[k]) == askedlabel then
+% document.figurebases.found = {
+% name = xml.filters.text(e,"file"),
+% page = page,
+% }
+% return true
+% end
+% end
+% return false
+% end
+%
+% function commands.findfigurefilenameinbase(basename,askedlabel)
+% if document.figurebases.find(basename,askedlabel) then
+% commands.xdef("figurefilename",document.figurebases.found.name or "")
+% commands.xdef("figurefilepage",document.figurebases.found.page or "")
+% end
+% end
+%
+% \stopluacode
+%
+% \def\findfigurefilenameinbase#1#2%
+% {\ctxlua{commands.findfigurefilenameinbase("#1","\askedlabel")}}
+
+\startcommands dutch english
+ german czech
+ italian romanian
+
+ usefigurebase: gebruikfiguurbestand usefigurebase
+ usefigurebase usefigurebase
+ usefigurebase usefigurebase
+
+\stopcommands
+
+\unprotect
+
+\consultutilityfilefalse
+
+\startXMLmapping [-] [figbase]
+
+\defineXMLprocess [figurelibrary]
+\defineXMLignore [description]
+\defineXMLignore [copyright]
+\defineXMLignore [comment]
+\defineXMLignore [status]
+\defineXMLpush [file]
+\defineXMLpush [label]
+\defineXMLpush [dummy]
+\defineXMLenvironment [figure] \figbase@StartFigure \figbase@StopFigure
+
+\stopXMLmapping
+
+\newcounter\figurefilepage
+
+\def\figbase@StartFigure
+ {\bgroup}
+
+\def\figbase@StopFigure
+ {\doglobal\increment\figurefilepage
+ \doif\askedlabel{\XMLpop{label}}
+ {\doglobal\settrue\figurefiledone
+ \xdef\figurefilename{\XMLpop{file}}\endinput}%
+ \egroup}
+
+\def\findfigurefilenameinbase#1#2% sets \figurefilename and \figurefilepage
+ {\processXMLfilegrouped{#1}}
+
+\def\getfigurefilename#1#2%
+ {\startnointerference
+ \traceXMLelementsfalse
+ \startXMLmapping[-][figbase]
+ \resetfigurefilebase
+ \XMLerase{file}
+ \XMLerase{dummy}
+ \XMLerase{label}
+ \xdef\figurefilebase{#1}%
+ \doglobal\newcounter\figurefilepage
+ \def\askedlabel{#2}
+ \processcommacommand[\figurepathlist]\dogetfigurefilename
+ \stopXMLmapping
+ \stopnointerference}
+
+\globalletempty\figurebasepath
+
+\def\dogetfigurefilename#1%
+ {\ifx\figurefilename\empty
+ \bgroup
+ \xdef\figurefilebasepath{#1}%
+ \assignfullfilename{#1}{\figurefilebase}\to\filename
+ \doiffileelse{\filename.xml}
+ {\doshowfigurestate{base file : \filename}%
+ \expanded{\findfigurefilenameinbase{\filename.xml}{\askedlabel}}}
+ \donothing
+ \ifx\figurefilename\empty\else
+% \globallet\figurefilebase\figurefilebase
+ \globallet\figurefilebase\filename % hm, bad omen that this is needed
+ \fi
+ \egroup
+ \fi}
+
+\def\resetfigurefilebase
+ {\globalletempty\figurefilebase
+ \globalletempty\figurefilename
+ \globalletempty\figurefilebasepath
+ \globalletempty\figurefilepage}
+
+\def\doanalyzefiguredimensionsfromfile
+ {\ifcase\figurestatus \ifx\figurebaselist\empty \else
+ \resetfigurefilebase
+ \doshowfigurestate{base list : \figurebaselist}%
+ \processcommacommand[\figurebaselist]\dodoanalyzefiguredimensionsfromfile
+ \ifx\figurefilename\empty
+ \doshowfigurestate{base warning : no matching name found}%
+ \else
+ \doiffileelse{\figurefilebase.pdf}
+ {\doshowfigurestate{base file : \figurefilebase.pdf}%
+ \doshowfigurestate{base page : \figurefilepage}%
+ \let\figurepathlist\figurefilebasepath
+ \analyzefigurefilename{\figurefilebase.pdf}\wantedfigurelabel
+ \let\wantedfigurepage\figurefilepage}
+ {\doshowfigurestate{base missing : \figurefilebase.pdf}}
+ \fi
+ \ifcase\figurestatus
+ \analyzefigurefilename\expandedfigurename\wantedfigurelabel
+ \fi
+ \fi \fi}
+
+\def\dodoanalyzefiguredimensionsfromfile#1%
+ {\doshowfigurestate{base check : \wantedfigurename\space in #1}%
+ \getfigurefilename{#1}\wantedfigurename
+ \ifx\figurefilename\empty\else
+ \quitcommalist
+ \fi}
+
+\def\usefigurebase[#1]%
+ {\doifelse{#1}\v!reset
+ {\let\figurebaselist\empty}
+ {\addtocommalist{#1}\figurebaselist}}
+
+\let\figurebaselist\empty
+
+\resetfigurefilebase
+
+\protect \endinput
+
+\usefigurebase[figtest]
+
+\externalfigure[koetje] [width=3cm]
+\externalfigure[de molen op de dijk][width=3cm]
+\externalfigure[de molen op de dijk][width=2cm]
+\externalfigure[weet ik veel] [width=3cm]
+\externalfigure[weet ik veel] [width=2cm]
+\externalfigure[weet ik wat] [width=2cm]
+\externalfigure[koe] [width=2cm]
diff --git a/tex/context/base/x-fig-00.xsd b/tex/context/base/x-fig-00.xsd
new file mode 100644
index 000000000..615841a1e
--- /dev/null
+++ b/tex/context/base/x-fig-00.xsd
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+<xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ <p>This schema described the figure database. This base
+ can be used to collect graphics that later can be used
+ in applications like ConTeXt.</p>
+ <p>author: Tobias Burnus &amp; Hans Hagen, copyright:
+ PRAGMA-ADE / Hasselt NL</p>
+ </xsd:documentation>
+</xsd:annotation>
+
+<xsd:element name="figurelibrary" type="figureLibraryType" />
+
+<xsd:element name="comment" type="nonZeroString" />
+
+<xsd:complexType name="figureLibraryType">
+ <xsd:sequence>
+ <xsd:element name="description" type="descriptionType" />
+ <xsd:element name="figure" type="figureType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="language" type="xsd:language" />
+</xsd:complexType>
+
+<xsd:complexType name="descriptionType">
+ <xsd:sequence>
+ <xsd:element name="organization" type="nonZeroString" />
+ <xsd:element name="project" type="nonZeroString" />
+ <xsd:element name="product" type="nonZeroString" />
+ <xsd:element ref="comment" minOccurs="0" />
+ </xsd:sequence>
+</xsd:complexType>
+
+<xsd:complexType name="figureType">
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element name="file" type="NZNormalizedString" />
+ <xsd:element name="dummy" type="dummyType" />
+ </xsd:choice>
+ <xsd:element name="label" type="NZNormalizedString" />
+ <xsd:element name="copyright" type="nonZeroString" />
+ <xsd:element ref="comment" minOccurs="0" />
+ </xsd:sequence>
+</xsd:complexType>
+
+<xsd:complexType name="dummyType">
+ <xsd:simpleContent>
+ <xsd:extension base="nonZeroString">
+ <xsd:attribute name="width" type="TeXUnit" use="required" />
+ <xsd:attribute name="height" type="TeXUnit" use="required" />
+ </xsd:extension>
+ </xsd:simpleContent>
+</xsd:complexType>
+
+<xsd:simpleType name="nonZeroString">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1" />
+ </xsd:restriction>
+</xsd:simpleType>
+
+<xsd:simpleType name="NZNormalizedString">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:minLength value="1" />
+ </xsd:restriction>
+</xsd:simpleType>
+
+<xsd:simpleType name="TeXUnit">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern
+ value='[0-9]*(,|\.|[0-9])?[0-9]*(cm|mm|in|pt|pc|em|ex|bp|dd|cc|sp)' />
+ </xsd:restriction>
+</xsd:simpleType>
+
+</xsd:schema>
diff --git a/tex/context/base/x-fig-01.tex b/tex/context/base/x-fig-01.tex
new file mode 100644
index 000000000..c2f97fea9
--- /dev/null
+++ b/tex/context/base/x-fig-01.tex
@@ -0,0 +1,461 @@
+%D \module
+%D [ file=x-fig-01,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base 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.
+
+% \readfile {x-res-01} \donothing \donothing \endinput
+
+%D See \type {x-fig-00.tex} for more information on how to use
+%D and generate figure databases. This file loads the file
+%D named \type {\jobfilename} (\TEXEXEC\ will set this
+%D variable). You can apply this style to a database by
+%D saying:
+%D
+%D \starttyping
+%D texexec --pdf --use=fig-make yourfile.xml
+%D \stoptyping
+%D
+%D The following modes are supported:
+%D
+%D \starttabulate[|lT|l|]
+%D \NC letter \NC map the preview on letter size \NC \NR
+%D \NC compact \NC use an alternative presentation \NC \NR
+%D \stoptabulate
+%D
+%D The resulting file has the following characteristics:
+%D
+%D \startitemize[packed]
+%D \item the document is split into three sections: first each
+%D figure is shown at its own page, then an overview of
+%D figures is shown with some data alongside, and
+%D finally an index and table of contents shows up
+%D \item there is no title page, which means that one can
+%D access a figure by page number without offset
+%D \item the document is opened at the first overview page,
+%D that is, when the viewer supports it
+%D \item the graphic is shown 3~times: on a page of its own,
+%D scaled to a fixed dimension, and relative to a4 or
+%D letter paper size
+%D \item the labels can be accessed in an index and list at
+%D the end of the document
+%D \stopitemize
+%D
+%D We use named destinations, which means that one can
+%D access a figure by name from an external application.
+
+\usemodule[fig-00]
+
+\setupoutput[pdftex] \overcomePDFspacefalse
+
+\doifnothing {\jobfilename} {\end}
+\doiffileelse {\jobfilename.xml} {} {\end}
+
+\definesymbol [attachment] [{\bf\color[darkred]{\jobname.xml}}]
+\setupattachments [symbol=attachment]
+\useattachment [datafile] [\jobname.xml]
+
+\def\StartDescription
+ {\bgroup
+ \defineXMLpush[organization]
+ \defineXMLpush[project]
+ \defineXMLpush[product]
+ \defineXMLpush[comment]}
+
+\def\StopDescription
+ {\subject {Figure collection}
+ \starttabulate[|lBe|p|]
+ \doifXMLdataelse{organization}
+ {\NC organization \NC \XMLpop{organization} \NC \NR}{}
+ \doifXMLdataelse{project}
+ {\NC project \NC \XMLpop{project} \NC \NR}{}
+ \doifXMLdataelse{product}
+ {\NC product \NC \XMLpop{product} \NC \NR}{}
+ \doifXMLdataelse{comment}
+ {\NC comment \NC \XMLpop{comment} \NC \NR}{}
+ \NC specification \NC \attachment[datafile] \NC \NR
+ \stoptabulate
+ \blank[2*big]
+ \egroup}
+
+\def\StartFigureA
+ {\bgroup
+ \defineXMLpush[file]
+ \XMLassign{file}{buffer}
+ \defineXMLpush[dummy]
+ \defineXMLpush[label]
+ \defineXMLpush[copyright]
+ \defineXMLpush[comment]
+ \defineXMLpush[status]}
+
+\defineoverlay[page][\overlaybutton{Description}]
+
+\startbuffer
+ \framed
+ [width=\XMLpar{dummy}{width}{12cm},
+ height=\XMLpar{dummy}{height}{8cm},
+ background=color,
+ backgroundcolor=gray,
+ foregroundcolor=darkred,
+ frame=off]
+ {\bf \XMLpop{dummy}}
+\stopbuffer
+
+\def\StopFigureA
+ {\doglobal\increment\CurrentPage
+ \setupbackgrounds[page][background=page]
+ \doifelsenothing{\XMLpop{label}}
+ {\expanded{\definereference[Description][about: \XMLpop{file}]}%
+ \pagereference[\XMLpop{file}]}
+ {\expanded{\definereference[Description][about: \XMLpop{label}]}%
+ \pagereference[\XMLpop{label}]}
+ \pagefigure[\XMLpop{file}]
+ \setupbackgrounds[page][background=]
+ \egroup}
+
+\def\StartFigureB
+ {\StartFigureA}
+
+\defineregister
+ [figureindex]
+ [figureindices]
+
+\setupregister
+ [figureindex]
+ [ownnumber=yes,
+ criterium=text,
+ interaction=text,
+ indicator=no]
+
+\definelist
+ [figurelist]
+
+\setuplist
+ [figurelist]
+ [criterium=text,
+ pagenumber=no,
+ width=2em,
+ interaction=all]
+
+\setupcolors
+ [state=start]
+
+\setuptolerance
+ [verytolerant]
+
+% Ugly:
+
+\startnotmode[previewpage-letter,previewpage-S6]
+ \enablemode[previewpage-A4]
+\stopnotmode
+
+\startmode[letter] % downward compatible
+ \enablemode[previewpage-letter]
+\stopmode
+
+%startbuffer[paper]
+\startsetups[paper]
+\startmode[previewpage-A4]
+ \framed
+ [width=210mm,height=297mm,offset=overlay,frame=off,
+ background=color,backgroundcolor=white]
+ {\externalfigure[\XMLpop{file}][reset=yes]}
+\stopmode
+\startmode[previewpage-letter]
+ \framed
+ [width=8.5in,height=11in,offset=overlay,frame=off,
+ background=color,backgroundcolor=white]
+ {\externalfigure[\XMLpop{file}][reset=yes]}
+\stopmode
+\startmode[previewpage-S6]
+ \framed
+ [width=600pt,height=450pt,offset=overlay,frame=off,
+ background=color,backgroundcolor=white]
+ {\externalfigure[\XMLpop{file}][reset=yes]}
+\stopmode
+\stopsetups
+%stopbuffer
+
+\setupbuttons
+ [offset=10pt,
+ width=broad,
+ strut=no,
+ rulethickness=1pt,
+ framecolor=darkred]
+
+\def\StopFigureB
+ {\par
+ \doglobal\increment\CurrentPage
+ \doifelsenothing{\XMLpop{label}}
+ {\expanded{\definereference[Figure][\XMLpop{file}]}%
+ \expanded{\definereference[GridPg][grid:\XMLpop{file}]}}
+ {\expanded{\definereference[Figure][\XMLpop{label}]}%
+ \expanded{\definereference[GridPg][grid:\XMLpop{label}]}}%
+ \button % content in setup
+ {\hbox to \hsize
+ {\forgetall \dontcomplain
+ \doifelsenothing{\XMLpop{label}}
+ {\pagereference[about: \XMLpop{file}]}
+ {\pagereference[about: \XMLpop{label}]}%
+ % moved here, because descriptions may be absent
+ \ifnum\CurrentPage=1 \pagereference[begin]\fi
+ %
+ \expanded{\writetolist[figurelist]{\CurrentPage}{\XMLpop{label}}}%
+ \expanded{\figureindex{\CurrentPage}{\XMLpop{label}}}%
+ \startnotmode[compact]%
+ \vbox to 100pt
+ {\hsize30pt
+ \vskip5pt
+ \hbox to \hsize{\hss\strut\bf\CurrentPage\hss}%
+ \vfill}%
+ \advance\hsize by -30pt
+ \stopnotmode
+ \startmode[compact]%
+ \advance\hsize by -10pt
+ \hskip10pt
+ \stopmode
+ \button % \framed
+ [width=150pt,height=100pt,offset=10pt,frame=off,
+ background=color,backgroundcolor=white,color=]
+ {\externalfigure
+ [\XMLpop{file}]
+ [maxheight=80pt,frame=off,maxwidth=130pt,factor=max]}%
+ [GridPg]%
+ \let\FigWid\figurenaturalwidth
+ \let\FigHei\figurenaturalheight
+ \advance\hsize by -150pt
+ \hskip10pt
+ \advance\hsize by -10pt
+ \vbox to 100pt
+ {\hsize40pt
+ %\externalfigure
+ % [paper]
+ % [type=buffer,frame=on,
+ % framecolor=darkred,rulethickness=.5pt,
+ % width=40pt,object=no]
+ \framed
+ [offset=overlay,
+ framecolor=darkred,
+ rulethickness=.5pt]
+ {\scale[width=40pt]{\setups[paper]}}% {\disableXML\getbuffer[paper]}}%
+ \startmode[compact]%
+ \vfill
+ \hbox to \hsize{\hss\strut\bf\CurrentPage\hss}%
+ \stopmode
+ \vfill}%
+ \advance\hsize by -40pt
+ \hskip10pt
+ \advance\hsize by -10pt
+ \vbox to 100pt
+ {\blank[disable]
+ \starttabulate[|Bel|p|]
+ \NC file \NC \XMLpop{file} \NC \NR
+ \doifXMLdata{label}
+ {\NC label \NC \XMLpop{label} \NC \NR}
+ \NC w$\times$h \NC \FigWid$\times$\FigHei \NC \NR
+ \doifXMLdata{copyright}
+ {\NC copyright \NC \XMLpop{copyright} \NC \NR}
+ \doifXMLdata{status}
+ {\doifelse{\XMLpop{status}}{obsolete}
+ {\NC status \NC \bf\darkred\XMLpop{status} \NC \NR}
+ {\NC status \NC \XMLpop{status} \NC \NR}}
+ \doifXMLdata{comment}
+ {\NC comment \NC \XMLpop{comment} \NC \NR}
+ \stoptabulate
+ \vfill}}}%
+ [Figure]
+ \vskip10pt
+ \egroup}
+
+\def\StartFigureC
+ {\StartFigureA}
+
+\def\StopFigureC
+ {\doglobal\increment\NumberOfFigures
+ \egroup}
+
+\setuplayout
+ [topspace=15pt,backspace=15pt,
+ header=0pt,footer=0pt,bottom=20pt,bottomdistance=10pt,
+ width=middle,height=fit]
+
+\setupbackgrounds
+ [page]
+ [background=,
+ backgroundcolor=gray]
+
+\setupinteractionscreen
+ [width=max,
+ height=max]
+
+\setupcolors
+ [state=start]
+
+\setupinteraction
+ [style=,
+ color=,
+ contrastcolor=,
+ state=start]
+
+\setuphead
+ [section]
+ [style=bfb]
+
+\setupbodyfont
+ [pos]
+
+\setupinteractionmenu
+ [bottom]
+ [left=\hfill,
+ middle=\hskip10pt,
+ frame=off,
+ style=bold,
+ background=color,
+ backgroundcolor=darkred,
+ foregroundcolor=white]
+
+\startinteractionmenu[bottom]
+ \but [begin] begin \\
+ \but [index] index \\
+ \but [list] list \\
+ \but [CloseDocument] close \\
+ \but [PreviousJump] go back \\
+\stopinteractionmenu
+
+\setupinteraction
+ [openaction=begin]
+
+\defineXMLenvironment [figurelibrary] \StartLibrary \StopLibrary
+
+\starttext
+
+\def\StartLibrary{\mainlanguage[\XMLpar{figurelibrary}{language}{en}]}
+\def\StopLibrary {}
+
+\defineXMLignore [description]
+\defineXMLenvironment [figure] \StartFigureC \StopFigureC
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfilename.xml}
+
+\increment\NumberOfFigures
+
+\defineXMLignore [description]
+\defineXMLenvironment [figure] \StartFigureA \StopFigureA
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfilename.xml}
+
+\setuppapersize
+ [S6][S6]
+
+\setupbackgrounds
+ [page]
+ [background=color]
+
+\setupinteraction
+ [menu=on]
+
+\defineXMLenvironment [description] \StartDescription \StopDescription
+\defineXMLenvironment [figure] \StartFigureB \StopFigureB
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfilename.xml} \page
+
+\subject [list] {List of figures}
+
+\placelist[figurelist] \page
+
+\subject [index] {Index of figures}
+
+\startcolumns
+\placeregister[figureindex]
+\stopcolumns
+
+\doifmodeelse{clipgrid-distance,clipgrid-steps}{\page}{\stoptext}
+
+\startuniqueMPgraphic{clipgrid}{dx,dy,nx,ny,type}
+ numeric gdx, gdy, lbx, lby ;
+ if \MPvar{type}=1 :
+ gdx := \MPvar{dy} ;
+ gdy := \MPvar{dx} ;
+ else :
+ gdx := OverlayWidth /\MPvar{nx} ;
+ gdy := OverlayHeight/\MPvar{ny} ;
+ fi ;
+ lbx := gdx ;
+ lby := gdy ;
+ defaultfont := "\truefontname{Mono}" ;
+ defaultscale := .5 ;
+ numeric pen ; pen := .25pt ;
+ def MyGrid text t =
+ draw vlingrid (0,OverlayWidth ,gdy,OverlayWidth ,OverlayHeight) t ;
+ draw hlingrid (0,OverlayHeight,gdx,OverlayHeight,OverlayWidth ) t ;
+ enddef ;
+ pickup pencircle scaled pen ;
+ MyGrid withcolor white ;
+ MyGrid dashed evenly scaled pen ;
+ draw OverlayBox withcolor white ;
+ draw OverlayBox dashed evenly scaled pen ;
+ draw vlinlabel.bot(0,eps+OverlayWidth /lby,2,OverlayWidth ) ;
+ draw hlinlabel.lft(0,eps+OverlayHeight/lbx,2,OverlayHeight) ;
+ setbounds currentpicture to OverlayBox enlarged (2*EmWidth) ;
+\stopuniqueMPgraphic
+
+\presetMPvariable[clipgrid][dx=10pt]
+\presetMPvariable[clipgrid][dy=10pt]
+\presetMPvariable[clipgrid][nx=10]
+\presetMPvariable[clipgrid][ny=10]
+
+\startmode[clipgrid-distance]
+ \defineoverlay[grid][\uniqueMPgraphic{clipgrid}{type=1}]
+\stopmode
+
+\startmode[clipgrid-steps]
+ \defineoverlay[grid][\uniqueMPgraphic{clipgrid}{type=2}]
+\stopmode
+
+\setupexternalfigures
+ [background={color,foreground,grid},
+ backgroundcolor=white]
+
+\def\StartFigureD
+ {\StartFigureA}
+
+\def\StopFigureD
+ {\doglobal\increment\CurrentPage
+ \setupbackgrounds[page][background=page]
+ \startpagefigure[\XMLpop{file}][offset=20pt]%
+ \doifelsenothing{\XMLpop{label}}
+ {\expanded{\definereference[Description][about: \XMLpop{file}]}%
+ \pagereference[grid:\XMLpop{file}]}
+ {\expanded{\definereference[Description][about: \XMLpop{label}]}%
+ \pagereference[grid:\XMLpop{label}]}
+ \stoppagefigure
+ %\pagefigure[\XMLpop{file}][offset=20pt]
+ \setupbackgrounds[page][background=]
+ \egroup}
+
+\defineXMLignore
+ [description]
+
+\defineXMLenvironment
+ [figure]
+ \StartFigureD
+ \StopFigureD
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfilename.xml} \page
+
+\stoptext
diff --git a/tex/context/base/x-fig-02.tex b/tex/context/base/x-fig-02.tex
new file mode 100644
index 000000000..22d49d27a
--- /dev/null
+++ b/tex/context/base/x-fig-02.tex
@@ -0,0 +1,78 @@
+%D \module
+%D [ file=x-fig-02,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base Inclusion (I),
+%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.
+
+% \readfile {x-res-02} \donothing \donothing \endinput
+
+%D This module enables non||\ConTeXt\ users to access the
+%D database. For this, you need to run
+%D
+%D \starttyping
+%D texexec --pdf --use=fig-fake yourfile.xml
+%D \stoptyping
+%D
+%D The resulting file, \type {yourfile.fig}, can be loaded
+%D in the normal way. The figures can be accessed with:
+%D
+%D \starttyping
+%D \getfigurefile{label}
+%D \getfigurepage{label}
+%D \stoptyping
+%D
+%D A a bonus, the following macro is defined:
+%D
+%D \starttyping
+%D \includefigurefile width 10cm {label}
+%D \stoptyping
+
+\usemodule[fig-00]
+
+\doifnothing {\jobfilename} {\end}
+\doiffileelse {\jobfilename.xml} {} {\end}
+
+\defineXMLenvironment [figurelibrary] \StartLibrary \StopLibrary
+\defineXMLignore [description]
+\defineXMLenvironment [figure] \StartFigure \StopFigure
+
+\def\StartLibrary
+ {\immediate\openout \scratchwrite=\jobfilename.fig
+ \immediate\write\scratchwrite{\string\input\space x-fig-03.tex \string\relax}
+ \immediate\write\scratchwrite{}}
+
+\def\StopLibrary
+ {\immediate\write\scratchwrite{}
+ \immediate\write\scratchwrite{\string\endinput}
+ \immediate\closeout\scratchwrite}
+
+\def\StartFigure
+ {\defineXMLpush[file]
+ \defineXMLpush[dummy]
+ \defineXMLpush[label]
+ \defineXMLpush[copyright]
+ \defineXMLpush[comment]
+ \defineXMLpush[status]}
+
+\def\StopFigure
+ {\doglobal\increment\CurrentPage
+ \immediate\write\scratchwrite
+ {\string\setfiguredata\space
+ {\XMLpop{label}}
+ {\jobfilename}
+ {\CurrentPage}}}
+
+\doglobal\newcounter\CurrentPage
+
+\starttext
+
+\processXMLfilegrouped{\jobfilename.xml}
+
+\stoptext
diff --git a/tex/context/base/x-fig-03.tex b/tex/context/base/x-fig-03.tex
new file mode 100644
index 000000000..131752823
--- /dev/null
+++ b/tex/context/base/x-fig-03.tex
@@ -0,0 +1,44 @@
+%D \module
+%D [ file=x-fig-03,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base Inclusion (II),
+%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.
+
+\ifx \undefined \convertMPtoPDF \input supp-pdf.mkii \fi
+\ifx \undefined \includefigurefile \else \expandafter \endinput \fi
+
+\gdef\getfigurefile#1%
+ {\expandafter\ifx\csname x-fig-f-#1\endcsname\relax
+ \currentfigurefile
+ \else
+ \csname x-fig-f-#1\endcsname
+ \fi}
+
+\gdef\getfigurepage#1%
+ {\expandafter\ifx\csname x-fig-p-#1\endcsname\relax
+ 1%
+ \else
+ \csname x-fig-p-#1\endcsname
+ \fi}
+
+\gdef\setfiguredata#1#2#3%
+ {\gdef\currentfigurefile{#2}%
+ \expandafter\gdef\csname x-fig-f-#1\endcsname{#2}%
+ \expandafter\gdef\csname x-fig-p-#1\endcsname{#3}}
+
+\def\includefigurefile#1#%
+ {\doincludefigurefile{#1}}
+
+\def\doincludefigurefile#1#2%
+ {\edef\next{\noexpand\pdfimage
+ #1 page \getfigurepage{#2} {\getfigurefile{#2}.pdf}}%
+ \next}
+
+\endinput
diff --git a/tex/context/base/x-fo.mkii b/tex/context/base/x-fo.mkii
new file mode 100644
index 000000000..b2b0b59f9
--- /dev/null
+++ b/tex/context/base/x-fo.mkii
@@ -0,0 +1,4059 @@
+%D \module
+%D [ file=x-fo,
+%D version=2004.03.12, % based on earlier experiments
+%D title=\FOXET,
+%D subtitle=Formatting Objects,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \showframe
+
+% This is a first implementation, maybe I will write another one with mixed
+% element indifferent vars and something 'when set, act upon it, and forget',
+% for instance: in each element check if font set, if so, change font and
+% reset font attributes. I'm not sure if this is wise.
+
+% todo: global assignment in order to limit restore
+% todo: combine mp graphics (see end) saves 30%
+% todo: using contants and variables (for internal use)
+
+% todo: language at more levels
+
+% beware: aftergroup vs egroup/endgroup
+
+\useXMLfilter[prs,run]
+
+% \input xtag-run
+
+\unprotect
+
+% syst-new.tex
+
+\long\def\unstringed#1% " ' space
+ {\csname\ifcsname @u@s@#1\endcsname @u@s@#1\else\s!empty\fi\endcsname#1}
+
+\long\setvalue{@u@s@"}#1#2"{#2}
+\long\setvalue{@u@s@'}#1#2'{#2}
+\long\setvalue{@u@s@ }#1#2 {#2}
+
+% xtag-ini
+
+\def\letXMLpar #1#2{\@EA \let\csname\@@XMLvariable:#1:#2\endcsname}
+\def\setXMLpar #1#2{\@EA \def\csname\@@XMLvariable:#1:#2\endcsname}
+\def\setXMLepar#1#2{\@EA\edef\csname\@@XMLvariable:#1:#2\endcsname}
+
+\protect
+
+%D Most time went into figuring out the specifications, especially
+%D because there are no examples included. Samples that circulate on the
+%D web are often border cases and torture test and don't have much to do
+%D with real live. Another complication lays in the inheritance model:
+%D some of the attributes are inherited. This also leaves some room for
+%D interpretation, for instance do values that are used at a certain
+%D point migrate downwards or not.
+%D
+%D The \CONTEXT\ \XML handler can deal with attributes in several ways
+%D and for this purpose I have played with a few experimental mechanisms
+%D just to end up with the existing begin/end mechanism combined with
+%D a recursive attribute resolver which means that one has to implicitly
+%D ask for an inherited attributes. This approach is probably one of the
+%D most efficient ways of dealing with formatting objects in \CONTEXT,
+%D unless of course I start adding rather specific support to the kernel.
+%D
+%D This module is rather experimental. More information about its usage
+%D can be found in the \FOXET\ manual.
+
+%D Since we're not dealing with the fine points of typesetting here, we
+%D can safely ignore \TEX's warnings about overful or underful boxes.
+
+\dontcomplain
+
+%D We will use fonts that have the characters in the normal (ascii)
+%D slots. We will also use the stupid verbatim handler.
+
+\chardef\XMLtokensreduction = 2
+\chardef\XMLcdatamethod = 2
+
+%D For the purpose of testing.
+
+\startmode[fo-verbose]
+ \def\writeFOstatus{\writestatus{XML-FO}}
+\stopmode
+
+\startnotmode[fo-verbose]
+ \let\writeFOstatus\gobbleoneargument
+\stopnotmode
+
+%D For the moment we stick to utf-8.
+
+\useXMLfilter[utf]
+
+%D This will be sorted out later (esp in relation to mathml).
+
+\setupbodyfont[pos,10pt]
+
+%D There are a couple of predefined colors. Don't ask me why, but
+%D formatting objects are not a fresh start but a mix of existing
+%D technologies. Color support is poluted by cascading stylesheets.
+%D
+%D Because hexadecimal color specifications are not enabled by
+%D default, this feature has to be enables by loading the appropriate
+%D color module. Here we define colors in \RGB\ values because we
+%D don't want to loose accuracy.
+
+\setupcolors[state=start] \setupcolor[hex]
+
+\definecolor [black] [s=0] % [h=000000]
+\definecolor [gray] [s=.5] % [h=808080]
+\definecolor [silver] [s=.75] % [h=C0C0C0]
+\definecolor [white] [s=1] % [h=FFFFFF]
+\definecolor [maroon] [r=.5] % [h=800000]
+\definecolor [red] [r=1] % [h=FF0000]
+\definecolor [purple] [r=.5,b=.5] % [h=800080]
+\definecolor [fuchsia] [r=1,b=1] % [h=FF00FF]
+\definecolor [green] [g=.5] % [h=008000]
+\definecolor [lime] [g=1] % [h=00FF00]
+\definecolor [olive] [r=.5,g=.5] % [h=808000]
+\definecolor [yellow] [r=1,g=1] % [h=FFFF00]
+\definecolor [navy] [r=1,g=1] % [h=000080]
+\definecolor [blue] [b=1] % [h=0000FF]
+\definecolor [teal] [g=.5,b=.5] % [h=008080]
+\definecolor [aqua] [g=1,b=1] % [h=00FFFF]
+
+%D The layout is rather basic. Of the 25 available areas we
+%D only use the text area. Maybe some day I will plug in a
+%D more dedicated page builder.
+
+\setuplayout
+ [backspace=0pt,
+ topspace=0pt,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle,
+ % marking=on,
+ location=middle]
+
+\setuppagenumbering
+ [alternative={doublesided,singlesided}, % sic
+ location=]
+
+\setuptolerance
+ [verytolerant,stretch]
+
+%D We will position the regions using layers.
+
+\definelayer[regions][width=\paperwidth,height=\paperheight]
+
+\definelayer[xsl-region-before]
+\definelayer[xsl-region-after]
+\definelayer[xsl-region-start]
+\definelayer[xsl-region-end]
+\definelayer[xsl-region-body]
+
+\setupbackgrounds[page][background=regions]
+
+%D We now enter the part of this module where the action takes
+%D place. As usual we provide some tracing options.
+
+\newif\iftracingFO \readsysfile{page-run}\donothing\donothing
+
+%D We will organize the attribute definitions in a similar fashion as in
+%D the specification. Unfortunately there are more sets defined in there
+%D than are actually used, so the definitions later on will look a bit
+%D messy.
+%D
+%D Quite some attributes can be inherited, which means that they can
+%D end up in all elements and influence those way down the tree.
+
+\defineXMLattributeset
+ [fo:inherited]
+
+%D The properties:
+
+% \defineXMLattributeset
+% [fe:tracing]
+% [tracing=]
+
+\defineXMLattributeset
+ [fo:accessibility]
+ [source-document=none,
+ role=none]
+
+\defineXMLattributeset
+ [fo:absolute-position]
+ [absolute-position=auto,
+ top=auto,
+ right=auto,
+ bottom=auto,
+ left=auto]
+
+% \defineXMLattributeset
+% [fo:aural]
+% [azitmuth=,
+% cue-after=,
+% cue-before=,
+% elevation=,
+% pause-after=,
+% pause-before=,
+% pitch=,
+% pitch-range=,
+% play-during=,
+% richness=,
+% speak=,
+% speak-header=,
+% speak-numeral=,
+% speak-punctuation=,
+% speech-rate=,
+% stress=,
+% voice-family=,
+% volume=]
+
+\defineXMLattributeset
+ [fo:border-padding-background]
+ [background-attachment=scroll,
+ background-color=transparent,
+ background-image=none,
+ background-repeat=repeat,
+ background-position-horizontal=left,
+ background-position-vertical=top,
+ border-color=transparent,
+ border-style=none,
+ border-width=medium,
+ background-position=,
+ border-top=,
+ border-bottom=,
+ border-left=,
+ border-right=,
+ border-before-color=\XMLop{border-color},
+ border-before-style=\XMLop{border-style},
+ border-before-width=\XMLop{border-width},
+ border-after-color=\XMLop{border-color},
+ border-after-style=\XMLop{border-style},
+ border-after-width=\XMLop{border-width},
+ border-start-color=\XMLop{border-color},
+ border-start-style=\XMLop{border-style},
+ border-start-width=\XMLop{border-width},
+ border-end-color=\XMLop{border-color},
+ border-end-style=\XMLop{border-style},
+ border-end-width=\XMLop{border-width},
+ border-top-color=\XMLop{border-before-color},
+ border-top-style=\XMLop{border-before-style},
+ border-top-width=\XMLop{border-before-width},
+ border-bottom-color=\XMLop{border-after-color},
+ border-bottom-style=\XMLop{border-after-style},
+ border-bottom-width=\XMLop{border-after-width},
+ border-left-color=\XMLop{border-start-color},
+ border-left-style=\XMLop{border-start-style},
+ border-left-width=\XMLop{border-start-width},
+ border-right-color=\XMLop{border-end-color},
+ border-right-style=\XMLop{border-end-style},
+ border-right-width=\XMLop{border-end-width},
+ padding=,% 0pt,
+ padding-before=0pt,%\XMLop{padding},
+ padding-after=0pt,%\XMLop{padding},
+ padding-start=0pt,%\XMLop{padding},
+ padding-end=0pt,%\XMLop{padding},
+ padding-top=\XMLop{padding-before},
+ padding-bottom=\XMLop{padding-after},
+ padding-left=\XMLop{padding-start},
+ padding-right=\XMLop{padding-end}]
+
+\extendXMLattributeset
+ [fo:border-padding-background]
+ [fe:background-height=,
+ fe:background-width=]
+
+\defineXMLattributeset
+ [fo:font]
+ []
+
+\extendXMLattributeset
+ [fo:inherited]
+ [font=,
+ font-family=,% Times,
+ font-selection-strategy=,
+ font-size=,% 12pt,
+ font-size-adjust=, % 1,
+ font-style=, % normal,
+ font-variant=, % normal,
+ font-weight=] % normal]
+
+\defineXMLattributeset
+ [fo:hyphenation]
+ []
+
+\extendXMLattributeset
+ [fo:inherited]
+ [country=,
+ language=,
+ script=,
+ hyphenate=,
+ hyphenation-character=,
+ hyphenation-push-character-count=,
+ hyphenation-remain-character-count=]
+
+\defineXMLattributeset
+ [fo:margin-block]
+ [margin=, % 0pt,
+ margin-top=0pt,% \XMLop{margin},
+ margin-bottom=0pt,% \XMLop{margin},
+ margin-left=0pt,% \XMLop{margin},
+ margin-right=0pt,% \XMLop{margin},
+ space-before=0pt,
+ space-after=0pt,
+ space-before.precedence=,
+ space-before.conditionality=,
+ space-before.minimum=,
+ space-before.optimum=,
+ space-before.maximum=,
+ space-after.precedence=,
+ space-after.conditionality=,
+ space-after.minimum=,
+ space-after.optimum=,
+ space-after.maximum=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [start-indent=,
+ end-indent=]
+
+\defineXMLattributeset
+ [fo:margin-inline]
+ [space-start=,
+ space-end=]
+
+\defineXMLattributeset
+ [fo:relative-position]
+ [relative-position=,
+ top=auto,
+ right=auto,
+ bottom=auto,
+ left=auto]
+
+\defineXMLattributeset
+ [fo:area-alignment]
+ [alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ dominant-baseline=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [display-align=,
+ relative-align=]
+
+\defineXMLattributeset
+ [fo:area-dimension]
+ [block-progression-dimension=,
+ inline-progression-dimension=,
+ content-height=,
+ content-width=,
+ height=,
+ width=,
+ max-height=,
+ max-width=,
+ min-height=,
+ min-width=,
+ scaling=,
+ scaling-method=]
+
+\defineXMLattributeset
+ [fo:block-and-line]
+ []
+
+\extendXMLattributeset
+ [fo:inherited]
+ [hyphenation-keep=,
+ hyphenation-ladder-count=,
+ last-line-end-indent=,
+ line-height=,
+ line-height-shift-adjustment=,
+ line-stacking-strategy=,
+ linefeed-treatment=,
+ white-space-treatment=,
+ text-align=,
+ text-align-last=,
+ text-indent=,
+ white-space-collapse=,
+ wrap-option=]
+
+\defineXMLattributeset
+ [fo:character]
+ [character=,
+ suppress-at-line-break=,
+ text-decoration=,
+ text-shadow=,
+ treat-as-word-space=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [letter-spacing=,
+ text-transform=,
+ word-spacing=]
+
+\defineXMLattributeset
+ [fo:color]
+ [color-profile-name=,
+ rendering-intent=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [color=]
+
+\defineXMLattributeset
+ [fo:float]
+ [clear=,
+ float=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [intrusion-displace=]
+
+\defineXMLattributeset
+ [fo:keeps-and-breaks]
+ [break-after=,
+ break-before=,
+ keep-with-next.within-line=,
+ keep-with-next.within-column=,
+ keep-with-next.within-page=,
+ keep-with-previous.within-line=,
+ keep-with-previous.within-column=,
+ keep-with-previous.within-page=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [keep-together.within-line=,
+ keep-together.within-column=,
+ keep-together.within-page=,
+ orphans=,
+ widows=]
+
+\defineXMLattributeset
+ [fo:layout]
+ [clip=,
+ overflow=
+ span=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [reference-orientation=]
+
+\defineXMLattributeset
+ [fo:leader-and-rule]
+ []
+
+\extendXMLattributeset
+ [fo:inherited]
+ [leader-alignment=,
+ leader-pattern=,
+ leader-pattern-width=,
+ leader-pattern-width=,
+ leader-length=,
+ rule-style=,
+ rule-thickness=]
+
+\defineXMLattributeset
+ [fo:dynamic-effects]
+ [active-state=,
+ case-name=,
+ case-title=,
+ destination-placement-offset=,
+ external-destination=,
+ indicate-destination=,
+ internal-destination=,
+ show-destination=,
+ starting-state=,
+ switch-to=,
+ target-presentation-context=,
+ target-processing-context=,
+ target-stylesheet=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [auto-restore=]
+
+\defineXMLattributeset
+ [fo:markers]
+ [marker-class-name=,
+ retrieve-class-name=,
+ retrieve-position=,
+ retrieve-boundary=]
+
+\defineXMLattributeset
+ [fo:number-to-string]
+ [country=,
+ language=,
+ format=,
+ grouping-separator=,
+ grouping-size=,
+ letter-value=]
+
+% \defineXMLattributeset
+% [fo:pagination-and-layout]
+% [black-or-not-blank=,
+% column-count=1,
+% column-gap=12pt,
+% extent=,
+% flow-name=,
+% force-page-count=,
+% initial-page-number=,
+% master-name=,
+% master-reference=,
+% maximum-repeats=,
+% media-usage=,
+% odd-or-even=,
+% page-height=,
+% page-position=,
+% page-width=,
+% precedence=,
+% region-name=]
+
+\defineXMLattributeset
+ [fo:table]
+ [border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ column-number=,
+ column-width=,
+ ends-row=,
+ number-columns-repeated=,
+ number-columns-spanned=,
+ number-rows-spanned=,
+ starts-row=,
+ table-layout=,
+ table-omit-footer-at-break=,
+ table-omit-header-at-break=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [border-collapse=,
+ border-separation=,
+ caption-side=,
+ empty-cells=]
+
+\defineXMLattributeset
+ [fo:writing-mode]
+ [%text-altitude=,
+ %text-depth=,
+ unicode-bidi=]
+
+\extendXMLattributeset % for practical reasons we inherit along the whole chain
+ [fo:inherited] % unless we implement relax skipping
+ [text-altitude=,
+ text-depth=]
+
+\extendXMLattributeset
+ [fo:inherited]
+ [direction=,
+ glyph-orientation-horizontal=,
+ glyph-orientation-vertical=,
+ writing-mode=]
+
+\defineXMLattributeset
+ [fo:list-block]
+ []
+
+\extendXMLattributeset
+ [fo:inherited]
+ [provisional-label-separation=,
+ provisional-distance-between-starts=]
+
+% \starttext
+% \setuplayout[topspace=1cm,height=middle,header=0pt,footer=0pt]
+% \setupbodyfont[small,tt]
+% \expanded{\processcommalist[\XMLattributeset{fo:inherited}]}\endgraf
+% \stoptext
+
+% content-type
+% id
+
+% ref-id
+% score-spaces % inherited
+% src
+% visibility % inherited
+% z-index
+
+% shorthands:
+%
+% background
+% background-position
+% border
+% border-bottom
+% border-left
+% border-top
+% border-right
+% border-style
+% border-color
+% border-spacing % inherited
+% border-width
+% cue
+% font % inherited
+% margin
+% padding
+% page-break-after
+% page-break-before
+% page-break-inside % inherited
+% pause
+% position
+% size
+% vertical-align
+% white-space % inherited
+
+%D We will speed up the process of setting up attributes by compiling the
+%D definitions. Sometimes we need to access attributes explicitly by
+%D element (for instance when handling regions). We also need to deal
+%D with nested elements (for instance blocks) or a sequence of similar
+%D ones, while we may not always want to use grouping. As a result, the
+%D next series of definitions and macros are quite ugly. The begin|/|end
+%D is needed in order to comfortably fetch attribute values from
+%D ancestors.
+
+\startXMLcompiling[inherit]
+
+%D Element: fo:root
+
+%D todo: set defaults here
+
+\defineXMLenvironment
+ [fo:root]
+ [\XMLattributeset{fo:inherited},
+leader-pattern=spaces,
+leader-pattern-width=12pt,
+ media-usage=]
+ {\directsetup{fo:root:start}}
+ {\directsetup{fo:root:stop}}
+
+\startsetups fo:root:start
+ \starttext \beginXMLelement \startXMLignore
+ \doifsomething{\XMLop{language}}{\mainlanguage[\XMLop{language}]}% todo, everywhere
+\stopsetups
+
+\startsetups fo:root:stop
+ \stopXMLignore \endXMLelement \stoptext
+\stopsetups
+
+%D Element: fo:declarations
+
+\defineXMLprocess
+ [fo:declarations]
+
+%D Element: fo:color-profile
+
+\defineXMLignore
+ [fo:color-profile]
+ [src=,
+ color-profile-name=,
+ rendering-intent=]
+
+%D Element: fo:page-sequence
+
+% master-name and master-reference are often mixed up in examples
+
+\defineXMLenvironment
+ [fo:page-sequence]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fe:tracing},
+ \XMLattributeset{fo:number-to-string},
+ initial-page-number=auto,
+ master-reference=any,
+ force-page-count=auto]
+ {\beginXMLelement\directsetup{fo:page-sequence:start}}
+ {\directsetup{fo:page-sequence:stop}\endXMLelement}
+
+\mapXMLvalue {fo:page-initial} {auto} {\relax}
+\mapXMLvalue {fo:page-initial} {auto-odd} {\ifodd\pageno \expanded{\setuppagenumber[number=\the\dimexpr(\pageno+1)]}\fi}
+\mapXMLvalue {fo:page-initial} {auto-even} {\ifodd\pageno\else\expanded{\setuppagenumber[number=\the\dimexpr(\pageno+1)]}\fi}
+
+% todo: blokkeer left/right/etc in geval van blank
+
+\mapXMLvalue {fo:page-start} {auto} {\page}
+\mapXMLvalue {fo:page-start} {even} {\page\setuplayout[blank]\page[even]}
+\mapXMLvalue {fo:page-start} {odd} {\page\setuplayout[blank]\page[odd]}
+\mapXMLvalue {fo:page-end} {end-on-even} {\page\setuplayout[blank]\page[even]}
+\mapXMLvalue {fo:page-end} {end-on-odd} {\page\setuplayout[blank]\page[odd]}
+\mapXMLvalue {fo:page-start} {no-force} {\page}
+
+\startsetups fo:page-sequence:start
+
+ % we're still in the previous page-sequence
+
+ \XMLval{fo:page-start}{\XMLop{force-page-count}}{\page} \begingroup
+
+ \directsetup{fe:setup}
+
+ \iftracingFO \showframe[text] \fi
+
+ \xdef\SavedPageNumber{\the\realpageno}
+
+ % now we enter the new page-sequence
+
+ % todo: check on number
+
+ \doifXMLvalelse{fo:page-initial}{\XMLop{initial-page-number}}
+ {\XMLval{fo:page-initial}{\XMLop{initial-page-number}}{}}
+ {\doifnot{\XMLop{initial-page-number}}{auto}
+ {\expanded{\setuppagenumber[number=\XMLop{initial-page-number}]}}}
+
+ \doifsomething{\XMLpar{fo:page-sequence}{master-reference}{}}
+ {\doifelseXMLelement{fo:page-sequence-master:\XMLpar{fo:page-sequence}{master-reference}{}}
+ {%[starting page sequence master: \XMLpar{fo:page-sequence}{master-reference}{}]\endgraf
+ \flushXMLelement{fo:page-sequence-master:\XMLpar{fo:page-sequence}{master-reference}{}}}
+ {%[starting simple page master: \XMLpar{fo:page-sequence}{master-reference}{any}]\endgraf
+ \flushXMLelement{fo:simple-page-master:\XMLpar{fo:page-sequence}{master-reference}{any}}}}
+
+ \doif{\XMLpar{fo:simple-page-master-do}{fe:option}{}}{fit}
+ {\directsetup{fe:page:option:fit:start}}
+
+ \doifnot{\XMLpar{fo:region-body}{column-count}{1}}{1}
+ {\directsetup{fo:columns:start}}
+
+\stopsetups
+
+\startsetups fo:page-sequence:stop
+
+ \doifnot{\XMLpar{fo:region-body}{column-count}{1}}{1}
+ {\directsetup{fo:columns:stop}}
+
+ \doif{\XMLpar{fo:simple-page-master-do}{fe:option}{}}{fit}
+ {\directsetup{fe:page:option:fit:stop}}
+
+ % \XMLval{fo:page-end}{\XMLop{force-page-count}}{\page} \endgroup
+
+ \ifnum\SavedPageNumber=\realpageno
+
+ \ifdim\pagetotal<.5\textheight \null \vfill \fi % force a page with only containers
+
+ \fi
+
+ \XMLval{fo:page-end}{\XMLpar{fo:page-sequence}{force-page-count}{}}{\page} \endgroup
+
+\stopsetups
+
+\newdimen\FOcolumngap
+
+\startsetups fo:columns:start
+
+ \FOcolumngap\textwidth
+
+ \setpercentdimen\FOcolumngap{\XMLpar{fo:region-body}{column-gap}{12pt}}
+
+ % we need to freeze the lineheight here
+
+ \expanded{\definecolumnset
+ [fo:set]
+ [n=\XMLpar{fo:region-body}{column-count}{1},
+ distance=\FOcolumngap]}
+
+ \expanded{\definecolumnsetspan
+ [fo:set]
+ [n=\XMLpar{fo:region-body}{column-count}{1}]}
+
+ \directsetup{fo:font:setup} % else problems
+
+ \directsetup{fo:line-height:setup}
+
+% \parseXMLattributes{fo:flow}{line-height='normal'}
+
+ \startcolumnset[fo:set]
+
+ % \startcolumns[\XMLpar{fo:region-body}{column-count}{1}]
+
+\stopsetups
+
+\startsetups fo:columns:stop
+
+ % \stopcolumns
+
+ \stopcolumnset
+
+\stopsetups
+
+%D Element: fo:layout-master-set
+
+\defineXMLprocess
+ [fo:layout-master-set]
+
+%D Element: fo:page-sequence-master
+
+\defineXMLenvironmentsave
+ [fo:page-sequence-master]
+ [\XMLattributeset{fo:inherited},
+ master-name=any]
+ {}
+ {%[saved page sequence master: \XMLop{master-name}]\endgraf
+ \gsaveXMLdatainelement
+ {fo:page-sequence-master:\XMLop{master-name}}
+ {fo:page-sequence-master-do}
+ {fo:page-sequence-master}}
+
+\defineXMLprocess
+ [fo:page-sequence-master-do]
+ [\XMLattributeset{fo:inherited}]
+
+%D Element: fo:single-page-master-reference
+
+% makeup - one page
+
+\defineXMLcommand
+ [fo:single-page-master-reference]
+ [master-reference=any]
+ {\flushXMLelement{fo:simple-page-master:\XMLop{master-reference}}}
+
+%D Element: fo:repeatable-page-master-reference
+
+\defineXMLcommand
+ [fo:repeatable-page-master-reference]
+ [master-reference=any,
+ maximum-repeats=]
+ {\flushXMLelement{fo:simple-page-master:\XMLop{master-reference}}}
+
+%D Element: fo:repeatable-page-master-alternatives
+
+\defineXMLprocess
+ [fo:repeatable-page-master-alternatives]
+ [maximum-repeats=]
+
+%D Element: fo:conditional-page-master-reference
+
+% page-position : first last rest any
+% odd-or-even : odd even any
+% blank-or-not-blank : blank not-blank
+
+% The page-position default is needed (else possible loops)
+
+\defineXMLcommand
+ [fo:conditional-page-master-reference]
+ [master-reference=any,
+ page-position=\XMLpar{fo:conditional-page-master-reference}{master-reference}{any},
+ blank-or-not-blank=,
+ odd-or-even=]
+ {\flushXMLelement{fo:simple-page-master:\XMLpar{fo:conditional-page-master-reference}{master-reference}{}}}
+
+%D Element: fo:simple-page-master
+
+% first-page left-page right-page blank-page
+
+% default dimensions
+
+\defineXMLenvironmentsave
+ [fo:simple-page-master]
+ [master-name=any]
+ {}
+ {%[saved simple page master: \XMLop{master-name}]\endgraf
+ \gsaveXMLdatainelement
+ {fo:simple-page-master:\XMLop{master-name}}
+ {fo:simple-page-master-do}
+ {fo:simple-page-master}}
+
+% reference-orientation=0deg,
+% writing-mode=
+
+\defineXMLenvironment
+ [fo:simple-page-master-do]
+ [\XMLattributeset{fo:inherited}, % added
+ \XMLattributeset{fo:margin-block},
+ page-height=29.7cm,
+ page-width=21cm]
+ {\directsetup{fo:simple-page-master:start}}
+ {\directsetup{fo:simple-page-master:stop}}
+
+% not needed any more:
+
+\mapXMLvalue {fo:reference-orientation} {0deg} {0}
+\mapXMLvalue {fo:reference-orientation} {90deg} {90}
+\mapXMLvalue {fo:reference-orientation} {180deg} {180}
+\mapXMLvalue {fo:reference-orientation} {270deg} {270}
+\mapXMLvalue {fo:reference-orientation} {-90deg} {270}
+\mapXMLvalue {fo:reference-orientation} {-180deg} {180}
+\mapXMLvalue {fo:reference-orientation} {-270deg} {90}
+
+\startsetups fo:simple-page-master:start
+
+ % nothing
+
+\stopsetups
+
+% can be low level tex
+
+\startsetups fo:simple-page-master:stop
+
+ \writeFOstatus{defining papersize '\directsetup{fo:layout:kind}'}
+
+ \expanded
+ {\definepapersize
+ [\directsetup{fo:layout:kind}]
+ [width=\XMLop{page-width},
+ height=\XMLop{page-height}]}
+
+ \checkFOpadding {fo:region-body}
+ \checkFOmargin {fo:region-body}
+ \checkFOmargin {fo:simple-page-master-do}
+
+ \writeFOstatus{defining layout '\directsetup{fo:layout:kind}'}
+
+ \FOscratchMT\paperheight \setpercentdimen\FOscratchMT{\XMLpar{fo:simple-page-master-do}{margin-top} \zeropoint}
+ \FOscratchMB\paperheight \setpercentdimen\FOscratchMB{\XMLpar{fo:simple-page-master-do}{margin-bottom}\zeropoint}
+ \FOscratchML\paperwidth \setpercentdimen\FOscratchML{\XMLpar{fo:simple-page-master-do}{margin-left} \zeropoint}
+ \FOscratchMR\paperwidth \setpercentdimen\FOscratchMR{\XMLpar{fo:simple-page-master-do}{margin-right} \zeropoint}
+
+ \FOscratchRB\paperheight \setpercentdimen\FOscratchRB{\XMLpar{fo:region-body}{margin-top} \zeropoint}
+ \FOscratchRA\paperheight \setpercentdimen\FOscratchRA{\XMLpar{fo:region-body}{margin-bottom}\zeropoint}
+ \FOscratchRS\paperwidth \setpercentdimen\FOscratchRS{\XMLpar{fo:region-body}{margin-left} \zeropoint}
+ \FOscratchRE\paperwidth \setpercentdimen\FOscratchRE{\XMLpar{fo:region-body}{margin-right} \zeropoint}
+
+ \FOscratchPB\paperheight \setpercentdimen\FOscratchPB{\XMLpar{fo:region-body}{padding-top} \zeropoint}
+ \FOscratchPA\paperheight \setpercentdimen\FOscratchPA{\XMLpar{fo:region-body}{padding-bottom}\zeropoint}
+ \FOscratchPS\paperwidth \setpercentdimen\FOscratchPS{\XMLpar{fo:region-body}{padding-left} \zeropoint}
+ \FOscratchPE\paperwidth \setpercentdimen\FOscratchPE{\XMLpar{fo:region-body}{padding-right} \zeropoint}
+
+ \expanded
+ {\definelayout
+ [\directsetup{fo:layout:kind}]
+ [ page={\directsetup{fo:layout:kind},\XMLval{fo:reference-orientation}{\XMLop{reference-orientation}}{}},
+ paper=\directsetup{fo:layout:kind},
+ backspace=\the\dimexpr(\FOscratchML+\FOscratchPS+\FOscratchRS),
+ cutspace=\the\dimexpr(\FOscratchMR+\FOscratchPE+\FOscratchRE),
+ topspace=\the\dimexpr(\FOscratchMT+\FOscratchPB+\FOscratchRB),
+ bottomspace=\the\dimexpr(\FOscratchMB+\FOscratchPA+\FOscratchRA)]}
+
+ \expanded{\setuplayout[\directsetup{fo:layout:kind}]}
+
+ % this is a nasty bit of code: this local setup stores some data that
+ % needs to be used later
+
+ \startexpanded
+ \noexpand \startlocalsetups[layout:\directsetup{fo:layout:kind}]
+ \noexpand \writeFOstatus{processing simple page master '\XMLpar{fo:simple-page-master-do}{master-name}{any}'}
+ \noexpand \resetsetups[fo:simple-page-master:start]
+ \noexpand \resetsetups[fo:simple-page-master:stop]
+ \noexpand \flushXMLelement{fo:simple-page-master:\XMLpar{fo:simple-page-master-do}{master-name}{any}}
+ \noexpand \stoplocalsetups
+ \stopexpanded
+
+\stopsetups
+
+% \defineXMLcommand[fo:simple-page-master-do-do]
+% {\writeFOstatus{setting up master \XMLop{master-name} in page body}}
+
+%D Element: fo:region-body
+
+% display-align=,
+% reference-orientation=,
+% writing-mode=,
+
+\defineXMLcommand % or process
+ [fo:region-body]
+ [\XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-block},
+ fe:z-order=above,
+ clip=,
+ column-count=1,
+ column-gap=12pt,
+ overflow=,
+ region-name=]
+ {\directsetup{fo:region-body:process}}
+
+\startsetups fo:region-body:process
+ \writeFOstatus{refreshing region-body parameters}
+\stopsetups
+
+% todo: naar realfolio handelen ipv folio
+
+\mapXMLvalue {fo:odd-or-even} {odd} {odd}
+\mapXMLvalue {fo:odd-or-even} {even} {even}
+
+\mapXMLvalue {fo:page-position} {any} {rest} % todo
+\mapXMLvalue {fo:page-position} {first} {current}
+\mapXMLvalue {fo:page-position} {last} {last} % todo
+\mapXMLvalue {fo:page-position} {rest} {rest} % todo
+
+%mapXMLvalue {fo:blank-or-not-blank} {any} {} % todo
+%mapXMLvalue {fo:blank-or-not-blank} {not-blank} {} % todo
+%mapXMLvalue {fo:blank-or-not-blank} {blank} {} % todo
+
+% check this one esp default value
+
+\startsetups fo:layout:kind
+
+ \XMLpav
+ {fo:odd-or-even}
+ {fo:conditional-page-master-reference}
+ {odd-or-even}
+ {\XMLpav
+ {fo:page-position}
+ {fo:conditional-page-master-reference}
+ {page-position}
+ {\XMLpar{fo:page-sequence-master}{master-reference}{any}}}
+
+\stopsetups
+
+% common border things
+
+% clip
+% display-align
+% extent
+% overflow
+% precedence
+% region-name
+% reference-orientation
+% writing-mode
+
+%D Element: fo:region-before fo:region-after fo:region-start fo:region-end
+
+% border-before-color : <color> | inherit
+% border-before-style : <border style> | inherit
+% border-before-width.length|conditional : <border width> | <length conditional> | inherit
+%
+% style: none hidden dotted dashed solid double groove ridge inset outset
+% width: thin medium thick length
+
+\mapXMLvalue {fo:display-align} {auto} {before} % todo: related to relative-align
+\mapXMLvalue {fo:display-align} {before} {high}
+\mapXMLvalue {fo:display-align} {after} {low}
+\mapXMLvalue {fo:display-align} {center} {lohi}
+
+% display-align=,
+% reference-orientation=,
+% writing-mode=,
+
+\defineXMLcommand % will become process when stable
+ [fo:region-before]
+ [\XMLattributeset{fo:border-padding-background},
+ clip=,
+ extent=,
+ overflow=,
+ precedence=,
+ region-name=]
+ {\directsetup{fo:region-before:process}}
+
+\startsetups fo:region-before:process
+ \writeFOstatus{refreshing region-before parameters}
+\stopsetups
+
+\defineXMLprocess
+ [fo:region-after]
+ [\XMLattributeset{fo:border-padding-background},
+ clip=,
+ extent=,
+ overflow=,
+ precedence=,
+ region-name=]
+
+\defineXMLprocess
+ [fo:region-start]
+ [\XMLattributeset{fo:border-padding-background},
+ clip=,
+ extent=,
+ overflow=,
+ region-name=]
+
+\defineXMLprocess
+ [fo:region-end]
+ [\XMLattributeset{fo:border-padding-background},
+ clip=,
+ extent=,
+ overflow=,
+ region-name=]
+
+\mapXMLvalue {fo:border-style} {none} {0}
+\mapXMLvalue {fo:border-style} {hidden} {1}
+\mapXMLvalue {fo:border-style} {dotted} {2}
+\mapXMLvalue {fo:border-style} {dashed} {3}
+\mapXMLvalue {fo:border-style} {solid} {4}
+\mapXMLvalue {fo:border-style} {double} {5}
+\mapXMLvalue {fo:border-style} {groove} {6}
+\mapXMLvalue {fo:border-style} {ridge} {7}
+\mapXMLvalue {fo:border-style} {inset} {8}
+\mapXMLvalue {fo:border-style} {outset} {9}
+
+\mapXMLvalue {fo:border-width} {thin} {.25pt}
+\mapXMLvalue {fo:border-width} {medium} {.5pt}
+\mapXMLvalue {fo:border-width} {thick} {1pt}
+
+\startsetups fo:regions:check
+
+ \startprocesscommalist[body,before,after,start,end]
+
+ \checkFOborder{fo:region-\currentcommalistitem}{bottom}
+ \checkFOborder{fo:region-\currentcommalistitem}{top}
+ \checkFOborder{fo:region-\currentcommalistitem}{left}
+ \checkFOborder{fo:region-\currentcommalistitem}{right}
+
+ \checkhexcolor[\XMLpar{fo:region-\currentcommalistitem}{border-bottom-color}{}]
+ \checkhexcolor[\XMLpar{fo:region-\currentcommalistitem}{border-top-color}{}]
+ \checkhexcolor[\XMLpar{fo:region-\currentcommalistitem}{border-left-color}{}]
+ \checkhexcolor[\XMLpar{fo:region-\currentcommalistitem}{border-right-color}{}]
+ \checkhexcolor[\XMLpar{fo:region-\currentcommalistitem}{background-color}{}]
+
+ \checkFOposition{fo:region-\currentcommalistitem}{background}
+ \checkFOpadding {fo:region-\currentcommalistitem}
+ \checkFOmargin {fo:region-\currentcommalistitem}
+
+ \stopprocesscommalist
+
+\stopsetups
+
+%D Element: fo:flow
+
+\defineXMLenvironment
+ [fo:flow]
+ [\XMLattributeset{fo:inherited},
+ flow-name=unknown]
+ {\beginXMLelement\directsetup{fo:flow:start}}
+ {\directsetup{fo:flow:stop}\endXMLelement}
+
+\startsetups fo:flow:start
+ \begingroup
+\stopsetups
+
+\startsetups fo:flow:stop
+ \endgroup
+\stopsetups
+
+%D Element: fo:static-content
+
+% \beginXMLelement \endXMLelement - maybe save with attributes
+
+\defineXMLenvironmentsave
+ [fo:static-content]
+ [flow-name=unknown]
+ {}
+ {\directsetup{fo:static-content:process}}
+
+\startsetups fo:static-content:process
+
+ \gsaveXMLdata{fo:static-content:\XMLop{flow-name}}{fo:static-content}
+
+\stopsetups
+
+\newdimen\FOscratchML \newdimen\FOscratchMR \newdimen\FOscratchMT \newdimen\FOscratchMB
+\newdimen\FOscratchPB \newdimen\FOscratchPA \newdimen\FOscratchPS \newdimen\FOscratchPE
+\newdimen\FOscratchRB \newdimen\FOscratchRA \newdimen\FOscratchRS \newdimen\FOscratchRE
+
+\mapXMLvalue {fo:background-repeat} {no-repeat} {0}
+\mapXMLvalue {fo:background-repeat} {repeat} {1}
+\mapXMLvalue {fo:background-repeat} {repeat-x} {2}
+\mapXMLvalue {fo:background-repeat} {repeat-y} {3}
+
+\expanded {\mapXMLvalue {fo:background-location} {left} {0\letterpercent}}
+\expanded {\mapXMLvalue {fo:background-location} {right} {100\letterpercent}}
+\expanded {\mapXMLvalue {fo:background-location} {top} {0\letterpercent}}
+\expanded {\mapXMLvalue {fo:background-location} {bottom} {100\letterpercent}}
+\expanded {\mapXMLvalue {fo:background-location} {center} {50\letterpercent}}
+
+\newdimen\FObgpositionH
+\newdimen\FObgpositionV
+
+\def\FObackgroundimage#1#2#3%
+ {\doifnot{\XMLpar{fo:#1}{background-image}{none}}{none}
+ {\setFOimagename{\XMLpar{fo:#1}{background-image}{dummy}}%
+ \FObgpositionH#2%
+ \setpercentdimen\FObgpositionH{\XMLpav
+ {fo:background-location}
+ {fo:#1}
+ {background-position-horizontal}
+ {\XMLpar{fo:#1}{background-position-horizontal}{}}}%
+ \ifpercentdimendone
+ \skip0\zeropoint plus \FObgpositionH
+ \skip2\zeropoint plus \dimexpr(#2-\FObgpositionH)%
+ \else
+ \skip0\FObgpositionH
+ \skip2\zeropoint plus 1fill\relax
+ \fi
+ \FObgpositionV#3%
+ \setpercentdimen\FObgpositionV{\XMLpav
+ {fo:background-location}{fo:#1}{background-position-vertical}
+ {\XMLpar{fo:#1}{background-position-vertical}{}}}%
+ \ifpercentdimendone
+ \skip4\zeropoint plus \FObgpositionV
+ \skip6\zeropoint plus \dimexpr(#3-\FObgpositionV)%
+ \else
+ \skip4\FObgpositionV
+ \skip6\zeropoint plus 1fill\relax
+ \fi
+ \vbox to #3 \bgroup
+ \vskip\skip4\relax
+ \hbox to #2 \bgroup
+ \hskip\skip0\relax
+ \backgroundimage
+ {\XMLpav{fo:background-repeat}{fo:#1}{background-repeat}{}}{#2}{#3}%
+ {\externalfigure
+ [\FOimagename]
+ [width=\XMLpar{fo:#1}{fe:background-width}{},
+ height=\XMLpar{fo:#1}{fe:background-height}{}]}%
+ \hskip\skip2\relax
+ \egroup
+ \vskip\skip6\relax
+ \egroup}}
+
+\def\checkFOclipping#1%
+ {\doifsomething{\XMLpar{#1}{clip}{}}
+ {\analyzefunction{\XMLpar{#1}{clip}{}}%
+ \doif\functionname{rect}
+ {\def\postprocessframebox##1%
+ {\edef\next{\dimen0=\the\wd##1\dimen2=\the\ht##1\dimen4=\the\dp##1}%
+ \setbox##1\hbox
+ {\clip % expanded?
+ [topoffset=-\functionA,
+ bottomoffset=-\functionC,
+ leftoffset=-\functionD,
+ rightoffset=-\functionB]
+ {\box##1}}%
+ \next}}}}
+
+\def\clipFOarea#1%
+ {\doifsomething{\XMLpar{#1}{clip}{}}%
+ {\analyzefunction{\XMLpar{#1}{clip}{}}%
+ \doif\functionname{rect}
+ {\setbox\scratchbox\hbox{\foregroundbox}%
+ \edef\next{\dimen0=\the\wd\scratchbox\dimen2=\the\ht\scratchbox\dimen4=\the\dp\scratchbox}%
+ \setbox\scratchbox\hbox
+ {\clip % expanded?
+ [topoffset=-\functionA,
+ bottomoffset=-\functionC,
+ leftoffset=-\functionD,
+ rightoffset=-\functionB]
+ {\box\scratchbox}}%
+ \next
+ \box\scratchbox}}}
+
+\defineoverlay
+ [text]
+ [\clipFOarea{fo:region-body}]
+
+\setupbackgrounds
+ [text]
+ [background=text]
+
+\def\FOregionbuilder#1#2#3#4#5#6% #1=location #2=preset #3=x #4=y #5=width #6=height
+ {\writeFOstatus{building region #1}%
+ \defineoverlay
+ [image]
+ [{\framed
+ [frame=off,
+ orientation=\XMLpav{fo:reference-orientation}{fo:#1}{reference-orientation}{0},
+ offset=overlay,
+ height=\overlayheight,
+ width=\overlaywidth]
+ {\FObackgroundimage{#1}\hsize\vsize}}]%
+ \setlayerframed
+ [regions]
+ [preset=#2,x=\dimexpr(#3),y=\dimexpr(#4)]
+ [frame=off,
+ offset=overlay,background={#1-graphic,image,xsl-#1},
+ width=\dimexpr(#5),height=\dimexpr(#6)]
+ {\lrtbbox
+ {\XMLpar{fo:#1}{padding-left}\zeropoint}%
+ {\XMLpar{fo:#1}{padding-right}\zeropoint}%
+ {\XMLpar{fo:#1}{padding-top}\zeropoint}%
+ {\XMLpar{fo:#1}{padding-bottom}\zeropoint}%
+ {\checkFOclipping{fo:#1}%
+ \framed
+ [frame=off,
+ offset=overlay,
+ orientation=\XMLpav{fo:reference-orientation}{fo:#1}{reference-orientation}{0},
+ align={\XMLpav{fo:display-align}{fo:#1}{display-align}{high},\XMLpav{fo:align-key}{fo:#1}{text-align}{normal}},
+ width=\hsize,height=\vsize]
+ {\doFObeforeskip{fo:#1}%
+ \flushXMLelement{fo:static-content:\XMLpar{fo:#1}{region-name}{xsl-#1}}}%
+ \doFOafterskip{fo:#1}}}}
+
+\startsetups fo:regions:process
+
+ \directsetup{fo:regions:check}
+
+ \checkFOmargin{fo:simple-page-master-do}
+
+ \FOscratchMT\paperheight \setpercentdimen\FOscratchMT{\XMLpar{fo:simple-page-master-do}{margin-top} \zeropoint}
+ \FOscratchMB\paperheight \setpercentdimen\FOscratchMB{\XMLpar{fo:simple-page-master-do}{margin-bottom}\zeropoint}
+ \FOscratchML\paperwidth \setpercentdimen\FOscratchML{\XMLpar{fo:simple-page-master-do}{margin-left} \zeropoint}
+ \FOscratchMR\paperwidth \setpercentdimen\FOscratchMR{\XMLpar{fo:simple-page-master-do}{margin-right} \zeropoint}
+
+ \doif{\XMLpar{fo:region-body}{fe:z-order}{above}}{below}{\directsetup{fo:regions:process:body}}
+
+ \FOscratchRB\paperheight \setpercentdimen\FOscratchRB{\XMLpar{fo:region-before}{extent}\zeropoint}
+ \FOscratchRA\paperheight \setpercentdimen\FOscratchRA{\XMLpar{fo:region-after} {extent}\zeropoint}
+ \FOscratchRS\paperwidth \setpercentdimen\FOscratchRS{\XMLpar{fo:region-start} {extent}\zeropoint}
+ \FOscratchRE\paperwidth \setpercentdimen\FOscratchRE{\XMLpar{fo:region-end} {extent}\zeropoint}
+
+ \doifelse{\XMLpar{fo:region-before}{precedence}{false}}{true}
+ {\doifelse{\XMLpar{fo:region-after}{precedence}{false}}{true}
+ {\directsetup{fo:regions:process:true:true}}
+ {\directsetup{fo:regions:process:true:false}}}
+ {\doifelse{\XMLpar{fo:region-after}{precedence}{false}}{true}
+ {\directsetup{fo:regions:process:false:true}}
+ {\directsetup{fo:regions:process:false:false}}}
+
+ \doif{\XMLpar{fo:region-body}{fe:z-order}{above}}{above}{\directsetup{fo:regions:process:body}}
+
+\stopsetups
+
+\newdimen\FOscratchEB
+\newdimen\FOscratchEA
+
+\chardef\FOregionmode\zerocount
+
+\startmode[fo-pt]
+ \chardef\FOregionmode\plusone % fotex mode -)
+\stopmode
+
+\startsetups fo:regions:modes
+
+ \ifcase\FOregionmode
+ \FOscratchEB\zeropoint
+ \FOscratchEA\zeropoint
+ \or
+ \FOscratchEB\paperheight \setpercentdimen\FOscratchEB{\XMLpar{fo:region-before}{extent}\zeropoint}
+ \FOscratchEA\paperheight \setpercentdimen\FOscratchEA{\XMLpar{fo:region-after} {extent}\zeropoint}
+ \else
+ \FOscratchEB\zeropoint
+ \FOscratchEA\zeropoint
+ \fi
+
+\stopsetups
+
+\startsetups fo:regions:process:body
+
+ \bgroup
+
+ \FOscratchRB\paperheight \setpercentdimen\FOscratchRB{\XMLpar{fo:region-body}{margin-top} \zeropoint}
+ \FOscratchRA\paperheight \setpercentdimen\FOscratchRA{\XMLpar{fo:region-body}{margin-bottom}\zeropoint}
+ \FOscratchRS\paperwidth \setpercentdimen\FOscratchRS{\XMLpar{fo:region-body}{margin-left} \zeropoint}
+ \FOscratchRE\paperwidth \setpercentdimen\FOscratchRE{\XMLpar{fo:region-body}{margin-right} \zeropoint}
+
+ \FOregionbuilder
+ {region-body}
+ {lefttop}
+ {\FOscratchML+\FOscratchRS}
+ {\FOscratchMT+\FOscratchRA}
+ {\paperwidth -\FOscratchML-\FOscratchMR-\FOscratchRS-\FOscratchRE}
+ {\paperheight-\FOscratchMT-\FOscratchMB-\FOscratchRB-\FOscratchRA}
+
+ \egroup
+
+\stopsetups
+
+\startsetups fo:regions:process:true:true
+
+ \directsetup{fo:regions:modes}
+
+ \ifdim\FOscratchRB>\zeropoint \FOregionbuilder
+ {region-before}{lefttop}
+ {\FOscratchML}{\FOscratchMT-\FOscratchEB}
+ {\paperwidth-\FOscratchML-\FOscratchMR}{\FOscratchRB}
+ \fi \ifdim\FOscratchRA>\zeropoint \FOregionbuilder
+ {region-after}{leftbottom}
+ {\FOscratchML}{\FOscratchMB-\FOscratchEA}
+ {\paperwidth-\FOscratchML-\FOscratchMR}{\FOscratchRA}
+ \fi \ifdim\FOscratchRS>\zeropoint \FOregionbuilder
+ {region-start}{lefttop}
+ {\FOscratchML}{\FOscratchMT+\FOscratchRB}
+ {\FOscratchRS}{\paperheight-\FOscratchMT-\FOscratchMB-\FOscratchRA-\FOscratchRB}
+ \fi \ifdim\FOscratchRE>\zeropoint \FOregionbuilder
+ {region-end}{righttop}
+ {\FOscratchMR}{\FOscratchMT+\FOscratchRA}
+ {\FOscratchRE}{\paperheight-\FOscratchMT-\FOscratchMB-\FOscratchRA-\FOscratchRB}
+ \fi
+
+\stopsetups
+
+\startsetups fo:regions:process:false:true
+
+ \directsetup{fo:regions:modes}
+
+ \ifdim\FOscratchRB>\zeropoint \FOregionbuilder
+ {region-before}{lefttop}
+ {\FOscratchML+\FOscratchRS}{\FOscratchMT-\FOscratchEB}
+ {\paperwidth-\FOscratchML-\FOscratchMR-\FOscratchRS-\FOscratchRE}{\FOscratchRB}
+ \fi \ifdim\FOscratchRA>\zeropoint \FOregionbuilder
+ {region-after}{leftbottom}
+ {\FOscratchML}{\FOscratchMB-\FOscratchEA}
+ {\paperwidth-\FOscratchML-\FOscratchMR}{\FOscratchRA}
+ \fi \ifdim\FOscratchRS>\zeropoint \FOregionbuilder
+ {region-start}{lefttop}
+ {\FOscratchML}{\FOscratchMT}
+ {\FOscratchRS}{\paperheight-\FOscratchMB-\FOscratchRA-\FOscratchRB}
+ \fi \ifdim\FOscratchRE>\zeropoint \FOregionbuilder
+ {region-end}{righttop}
+ {\FOscratchMR}{\FOscratchMT}
+ {\FOscratchRE}{\paperheight-\FOscratchMB-\FOscratchRA-\FOscratchRB}
+ \fi
+
+\stopsetups
+
+\startsetups fo:regions:process:true:false
+
+ \directsetup{fo:regions:modes}
+
+ \ifdim\FOscratchRB>\zeropoint \FOregionbuilder
+ {region-before}{lefttop}
+ {\FOscratchML}{\FOscratchMT-\FOscratchEB}
+ {\paperwidth-\FOscratchML-\FOscratchMR}{\FOscratchRB}
+ \fi \ifdim\FOscratchRA>\zeropoint \FOregionbuilder
+ {region-after}{leftbottom}
+ {\FOscratchML+\FOscratchRS}{\FOscratchMB-\FOscratchEA}
+ {\paperwidth-\FOscratchML-\FOscratchMR-\FOscratchRS-\FOscratchRE}{\FOscratchRA}
+ \fi \ifdim\FOscratchRS>\zeropoint \FOregionbuilder
+ {region-start}{lefttop}
+ {\FOscratchML}{\FOscratchMT+\FOscratchRB}
+ {\FOscratchRS}{\paperheight-\FOscratchMT-\FOscratchMB-\FOscratchRB}
+ \fi \ifdim\FOscratchRE>\zeropoint \FOregionbuilder
+ {region-end}{righttop}
+ {\FOscratchMR}{\FOscratchMT+\FOscratchRA}
+ {\FOscratchRE}{\paperheight-\FOscratchMT-\FOscratchMB-\FOscratchRB}
+ \fi
+
+\stopsetups
+
+\startsetups fo:regions:process:false:false
+
+ \directsetup{fo:regions:modes}
+
+ \ifdim\FOscratchRB>\zeropoint \FOregionbuilder
+ {region-before}{lefttop}
+ {\FOscratchML+\FOscratchRS}{\FOscratchMT-\FOscratchEB}
+ {\paperwidth-\FOscratchML-\FOscratchMR-\FOscratchRS-\FOscratchRE}{\FOscratchRB}
+ \fi \ifdim\FOscratchRA>\zeropoint \FOregionbuilder
+ {region-after}{leftbottom}
+ {\FOscratchML+\FOscratchRS}{\FOscratchMB-\FOscratchEA}
+ {\paperwidth-\FOscratchML-\FOscratchMR-\FOscratchRS-\FOscratchRE}{\FOscratchRA}
+ \fi \ifdim\FOscratchRS>\zeropoint \FOregionbuilder
+ {region-start}{lefttop}
+ {\FOscratchML}{\FOscratchMT}
+ {\FOscratchRS}{\paperheight-\FOscratchMT-\FOscratchMB}
+ \fi \ifdim\FOscratchRE>\zeropoint \FOregionbuilder
+ {region-end}{righttop}
+ {\FOscratchMR}{\FOscratchMT}
+ {\FOscratchRE}{\paperheight-\FOscratchMT-\FOscratchMB}
+ \fi
+
+\stopsetups
+
+\startsetups fo:before:each:page
+
+ \writeFOstatus{setting up layout \currentlayout}
+ \directsetup{layout:\currentlayout}
+ \directsetup{fo:regions:process}
+
+\stopsetups
+
+\prependtoks
+ \directsetup{fo:before:each:page}%
+\to \everybeforepagebody
+
+%D Element: fo:title
+
+% \XMLattributeset{fo:aural},
+% color=,
+% line-height=,
+
+\defineXMLignore
+ [fo:title]
+ [\XMLattributeset{fo:inherited},\XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:margin-inline},
+ visibility=]
+
+%D Element: fo:block
+
+\defineXMLenvironment
+ [fo:block]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fe:tracing},
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:hyphenation},
+ \XMLattributeset{fo:margin-block},
+ \XMLattributeset{fo:relative-position},
+ \XMLattributeset{fo:keeps-and-breaks},
+% text-depth=,
+% text-altitude=,
+ span=,
+ visibility=]
+ {\beginXMLelement\directsetup{fo:block:start}}
+ {\directsetup{fo:block:stop}\endXMLelement}
+
+\startsetups fo:block:start
+
+ \endgraf
+
+ \writeFOstatus{fo:block in line \the\inputlineno}
+
+\doif{\XMLpar{fo:block}{span}{}}{all}{\ifinsidecolumns \startcolumnsetspan[fo:set] \fi}
+
+ \begingroup
+
+ \directsetup{fe:setup}
+
+ \directsetup{fo:break-and-space:before}
+
+ \begingroup
+
+ \setFOreference{fo:block}
+
+ \increment\FOblocklevel
+
+ \directsetup{fo:font:setup}
+
+ % \setupinterlinespace % no, interferes with columnset and lineheight
+
+ \directsetup{fo:line-height:setup}
+
+ \directsetup{fo:indent:setup}% hier ?
+
+ \doifsomething{\XMLop{background-color}}
+ {\checkhexcolor[\XMLop{background-color}]
+ \doifcolorelse{\XMLop{background-color}}
+ \donothing
+ {\setXMLpar{fo:block}{background-color}{}}}
+
+ \doifsomething{\XMLop{color}}
+ {\checkhexcolor[\XMLop{color}]
+ \doifcolorelse{\XMLop{color}}
+ \donothing
+ {\setXMLpar{fo:block}{color}{}}}
+
+ \doifsomething{\XMLop{background-color}}
+ {\expanded
+ {\definetextbackground
+ [FOattribute-\FOblocklevel]
+ [location=paragraph,
+ color=\XMLop{color},
+ style=,
+ before=,
+ after=,
+ background=color,
+ backgroundcolor=\XMLop{background-color}]}}
+
+ \endgraf
+
+ \getvalue{startFOattribute-\FOblocklevel}
+
+ \directsetup{fo:hyphenation:setup}
+ \directsetup{fo:align:setup}
+ \directsetup{fo:margin:setup}
+
+ \doif{\XMLop{wrap-option}}{no-wrap}
+ {\obeylines}
+
+ \doif{\XMLop{white-space-collapse}}{false}
+ {\obeyspaces}
+
+ % todo : remember old one and do like fonts
+
+ \directsetup{fo:textindent:setup}
+
+\stopsetups
+
+\startsetups fo:block:stop
+
+ \endstrut \endgraf
+
+ \getvalue{stopFOattribute-\FOblocklevel}
+
+ \endgraf
+
+ \endgroup
+
+ \directsetup{fo:break-and-space:after}
+
+ \endgroup
+
+ \doif{\XMLpar{fo:block}{span}{}}{all}{\ifinsidecolumns \stopcolumnsetspan \fi}
+
+\stopsetups
+
+\startsetups fo:textindent:setup
+
+ \edefXMLinh\xFOtextindent{text-indent}
+
+ \doifsomething\xFOtextindent
+ {\scratchdimen\hsize
+ \setpercentdimen\scratchdimen\xFOtextindent
+ \expanded{\setupindenting[\the\scratchdimen]}}
+
+\stopsetups
+
+\indenting[always] % can be zero points
+
+% todo: map
+
+\mapXMLvalue {fo:break} {column} {\column}
+\mapXMLvalue {fo:break} {page} {\page}
+\mapXMLvalue {fo:break} {even-page} {\page[even]}
+\mapXMLvalue {fo:break} {odd-page} {\page[odd]}
+
+% keep-together : either vbox or something \interlinepenalty\maxdimen ?
+%
+% nasty interference with accumulated skips
+
+\mapXMLvalue {fo:keep-next} {auto} {}
+\mapXMLvalue {fo:keep-next} {always} {\nobreak}
+
+\mapXMLvalue {fo:keep-prev} {auto} {}
+\mapXMLvalue {fo:keep-prev} {always} {\nobreak}
+
+\mapXMLvalue {fo:keep-start} {auto} {}
+\mapXMLvalue {fo:keep-start} {always} {\interlinepenalty\maxdimen}
+
+\mapXMLvalue {fo:keep-stop} {auto} {}
+\mapXMLvalue {fo:keep-stop} {always} {}
+
+\newskip\FOsavedlastskip
+
+\startsetups fo:break-and-space:before
+
+ \XMLval{fo:break}{\XMLop{break-before}}{}
+
+ \FOsavedlastskip \lastskip \ifdim\FOsavedlastskip>\zeropoint \vskip-\FOsavedlastskip \fi
+
+ \XMLval{fo:keep-start}{\XMLop{keep-together}}\empty
+ \XMLval{fo:keep-start}{\XMLop{keep-together.within-column}}\empty
+ \XMLval{fo:keep-start}{\XMLop{keep-together.within-page}}\empty
+
+ \XMLval{fo:keep-prev} {\XMLop{keep-with-previous}}\empty
+ \XMLval{fo:keep-prev} {\XMLop{keep-with-previous.within-column}}\empty
+ \XMLval{fo:keep-prev} {\XMLop{keep-with-previous.within-page}}\empty
+
+ \ifdim\FOsavedlastskip>\zeropoint \vskip\FOsavedlastskip \fi
+
+ \doFObeforeskip\currentXMLelement
+
+\stopsetups
+
+\startsetups fo:break-and-space:after
+
+% \doFOafterskip\currentXMLelement
+
+ \FOsavedlastskip \lastskip \ifdim\FOsavedlastskip>\zeropoint \vskip-\FOsavedlastskip \fi
+
+ \XMLval{fo:keep-stop}{\XMLop{keep-together}}\empty
+ \XMLval{fo:keep-stop}{\XMLop{keep-together.within-column}}\empty
+ \XMLval{fo:keep-stop}{\XMLop{keep-together.within-page}}\empty
+
+ \XMLval{fo:keep-next}{\XMLop{keep-with-next}}\empty
+ \XMLval{fo:keep-next}{\XMLop{keep-with-next.within-column}}\empty
+ \XMLval{fo:keep-next}{\XMLop{keep-with-next.within-page}}\empty
+
+ \ifdim\FOsavedlastskip>\zeropoint \vskip\FOsavedlastskip \fi
+
+ \doFOafterskip\currentXMLelement
+
+ \XMLval{fo:break}{\XMLop{break-after}}{}
+
+\stopsetups
+
+\startsetups fo:space:start
+ \doFOstartspace\currentXMLelement
+\stopsetups
+
+\startsetups fo:space:end
+ \doFOendspace\currentXMLelement
+\stopsetups
+
+\startsetups fo:indent:setup
+
+ \doifsomething{\XMLop{start-indent}}{\advance\leftskip \XMLop{start-indent}\relax}
+ \doifsomething{\XMLop{end-indent}} {\advance\rightskip\XMLop{end-indent} \relax}
+
+% \FOattributeT
+% \FOattributeR
+% \FOattributeB
+% \FOattributeL
+
+
+\stopsetups
+
+\mapXMLvalue {fo:align} {center} {\raggedcenter}
+\mapXMLvalue {fo:align} {left} {\raggedright}
+\mapXMLvalue {fo:align} {right} {\raggedleft}
+\mapXMLvalue {fo:align} {begin} {\raggedright}
+\mapXMLvalue {fo:align} {start} {\raggedright}
+\mapXMLvalue {fo:align} {end} {\raggedleft}
+
+\mapXMLvalue {fo:align-key} {center} {middle}
+\mapXMLvalue {fo:align-key} {left} {flushleft}
+\mapXMLvalue {fo:align-key} {right} {flushright}
+\mapXMLvalue {fo:align-key} {begin} {flushleft}
+\mapXMLvalue {fo:align-key} {start} {flushleft}
+\mapXMLvalue {fo:align-key} {end} {flushright}
+
+\startsetups fo:align:setup
+
+ \XMLval{fo:align}{\XMLop{text-align}}{}
+
+\stopsetups
+
+\startsetups fo:margin:setup
+
+ \checkFOmargin{fo:block}
+
+ \FOscratchML \XMLpar{fo:block}{margin-left} \zeropoint
+ \FOscratchMR \XMLpar{fo:block}{margin-right} \zeropoint
+ \FOscratchMT \XMLpar{fo:block}{margin-top} \zeropoint
+ \FOscratchMB \XMLpar{fo:block}{margin-bottom}\zeropoint
+
+ \advance\leftskip \FOscratchML
+ \advance\rightskip\FOscratchMR
+
+\stopsetups
+
+% todo: font-stretch
+%
+% ultra-condensed
+% extra-condensed
+% condensed
+% semi-condensed
+% expanded
+% extra-expanded
+% ultra-expanded
+%
+% wider narrower
+
+\mapXMLvalue {fo:font-size} {xx-small} {\dFOfontsize0.58\dFOfontsize}
+\mapXMLvalue {fo:font-size} {x-small} {\dFOfontsize0.69\dFOfontsize}
+\mapXMLvalue {fo:font-size} {small} {\dFOfontsize0.83\dFOfontsize}
+\mapXMLvalue {fo:font-size} {medium} {\relax}
+\mapXMLvalue {fo:font-size} {large} {\dFOfontsize1.20\dFOfontsize}
+\mapXMLvalue {fo:font-size} {x-large} {\dFOfontsize1.44\dFOfontsize}
+\mapXMLvalue {fo:font-size} {xx-large} {\dFOfontsize1.73\dFOfontsize}
+
+\mapXMLvalue {fo:font-size} {smaller} {\dFOfontsize0.83\dFOfontsize}
+\mapXMLvalue {fo:font-size} {larger} {\dFOfontsize1.20\dFOfontsize}
+
+\newdimen\dFOfontsize
+
+% evt class Times Helvetica
+
+\definefontsynonym [FO:Times] [Times-Roman]
+\definefontsynonym [FO:Times:bold] [Times-Bold]
+\definefontsynonym [FO:Times:italic] [Times-Italic]
+\definefontsynonym [FO:Times:bold:italic] [Times-BoldItalic]
+
+\definefontsynonym [FO:Times:small-caps] [Times-Roman]
+\definefontsynonym [FO:Times:bold:small-caps] [Times-Bold]
+\definefontsynonym [FO:Times:italic:small-caps] [Times-Italic]
+\definefontsynonym [FO:Times:bold:italic:small-caps] [Times-BoldItalic]
+
+\definefontsynonym [FO:Helvetica] [Helvetica]
+\definefontsynonym [FO:Helvetica:bold] [Helvetica-Bold]
+\definefontsynonym [FO:Helvetica:italic] [Helvetica-Italic]
+\definefontsynonym [FO:Helvetica:bold:italic] [Helvetica-BoldItalic]
+
+\definefontsynonym [FO:Helvetica:small-caps] [Helvetica]
+\definefontsynonym [FO:Helvetica:bold:small-caps] [Helvetica-Bold]
+\definefontsynonym [FO:Helvetica:italic:small-caps] [Helvetica-Italic]
+\definefontsynonym [FO:Helvetica:bold:italic:small-caps] [Helvetica-BoldItalic]
+
+\definefontsynonym [FO:Courier] [Courier]
+\definefontsynonym [FO:Courier:bold] [Courier-Bold]
+\definefontsynonym [FO:Courier:italic] [Courier-Oblique]
+\definefontsynonym [FO:Courier:bold:italic] [Courier-BoldOblique]
+
+\definefontsynonym [FO:Courier:small-caps] [Courier]
+\definefontsynonym [FO:Courier:bold:small-caps] [Courier-Bold]
+\definefontsynonym [FO:Courier:italic:small-caps] [Courier-Oblique]
+\definefontsynonym [FO:Courier:bold:italic:small-caps] [Courier-BoldOblique]
+
+\definefontsynonym [FO:Symbol] [ZapfDingbats]
+
+\definefontsynonym [FO:Computer-Modern-Typewriter] [ComputerModernMono]
+\definefontsynonym [FO:Computer-Modern-Typewriter:italic] [ComputerModernMono-Slanted]
+
+\definefontsynonym [*Times Roman*] [Times]
+
+% nasty: no FO prefix
+
+\definefontsynonym [*serif*] [Times]
+\definefontsynonym [*sans-serif*] [Helvetica]
+\definefontsynonym [*monospace*] [Courier]
+
+\definefontsynonym [*cursive*] [Times]
+\definefontsynonym [*fantasy*] [Helvetica]
+
+\definefontsynonym [*Arial*] [Helvetica]
+\definefontsynonym [*Times Roman*] [Times]
+\definefontsynonym [*Wingdings*] [ZapfDingbats]
+
+% \definefontsynonym [Computer-Modern-Typewriter] [ComputerModernMono]
+% \definefontsynonym [monospace] [ComputerModernMono]
+
+\startsetups fo:fonts:reset
+
+ \dFOfontsize=\bodyfontsize
+
+ \def\FOfontsize {10pt}% {12pt}
+ \def\FOfontfamily {Times}
+ \def\FOfontweight {normal}
+ \def\FOfontstyle {normal}
+ \def\FOfontvariant {normal}
+ \def\FOfontsizeadjust{1}
+
+ \def\FOtextdepth {}
+ \def\FOtextaltitude {}
+ \def\FOlineheight {}
+
+ \def\FOfontdefinition{}
+ \def\FOfontname {}
+
+\stopsetups
+
+\def\FOfontdefinition{}
+\def\FOfontname {}
+
+\directsetup{fo:fonts:reset}
+
+% test for \FOfontvariant: normal or else
+
+\def\setFOfontname
+ {\edef\xFOfontname{FO:\FOfontfamily:\FOfontweight:\FOfontstyle:\FOfontvariant}%
+ %\begingroup\infofont\xFOfontname]\endgroup
+ \doifelsefontsynonym\xFOfontname
+ {\let\FOfontname\xFOfontname}
+ {\edef\xFOfontname{FO:\FOfontfamily:\FOfontweight:\FOfontstyle}%
+ \doifelsefontsynonym\xFOfontname
+ {\let\FOfontname\xFOfontname}
+ {\edef\xFOfontname{FO:\FOfontfamily:\FOfontstyle}%
+ \doifelsefontsynonym\xFOfontname
+ {\let\FOfontname\xFOfontname}
+ {\edef\xFOfontname{FO:\FOfontfamily:\FOfontweight}%
+ \doifelsefontsynonym\xFOfontname
+ {\let\FOfontname\xFOfontname}
+ {\edef\xFOfontname{FO:\FOfontfamily}%
+ \doifelsefontsynonym\xFOfontname
+ {\let\FOfontname\xFOfontname}
+ {}}}}}}
+
+% \unprotected \def\doifelseFOfontsynonym#1#2#3#4#5% family weight style variant default
+% {\edef\FOfontname
+% {\ifcsname \??ff\fontclass FO:#1:#2:#3:#4\endcsname FO:#1:#2:#3:#4%
+% \else\ifcsname\??ff\fontclass FO:#1:#2:#3\endcsname FO:#1:#2:#3%
+% \else\ifcsname\??ff\fontclass FO:#1:#3\endcsname FO:#1:#3%
+% \else\ifcsname\??ff\fontclass FO:#1:#2\endcsname FO:#1:#2%
+% \else\ifcsname\??ff\fontclass FO:#1\endcsname FO:#1%
+% \else #5%
+% \fi\fi\fi\fi\fi}}
+
+\startsetups fo:font:family:check
+
+ \doifelsefontsynonym{*\FOfontfamily*}
+ {\expandfontsynonym\FOfontfamily{*\FOfontfamily*}}
+ {}
+
+\stopsetups
+
+\let\FOfont\empty
+
+\startsetups fo:font:setup
+
+ % todo: optimize, define fonts first time and do that global
+
+ \edefXMLinh\xFOfont {font}
+ \edefXMLinh\xFOfontsize {font-size}
+ \edefXMLinh\xFOfontsizeadjust{font-size-adjust}
+ \edefXMLinh\xFOfontfamily {font-family}
+ \edefXMLinh\xFOfontweight {font-weight}
+ \edefXMLinh\xFOfontstyle {font-style}
+ \edefXMLinh\xFOfontvariant {font-variant}
+
+% \edef\xFOfont {\XMLpar{fo}{font}{}}
+% \edef\xFOfontsize {\XMLpar{fo}{font-size}{}}
+% \edef\xFOfontsizeadjust{\XMLpar{fo}{font-size-adjust}{}}
+% \edef\xFOfontfamily {\XMLpar{fo}{font-family}{}}
+% \edef\xFOfontweight {\XMLpar{fo}{font-weight}{}}
+% \edef\xFOfontstyle {\XMLpar{fo}{font-style}{}}
+% \edef\xFOfontvariant {\XMLpar{fo}{font-variant}{}}
+
+ \donefalse
+
+ \ifx\xFOfont\empty \else \ifx\xFOfont\relax \else
+ \let\FOfont\xFOfont
+ \checkFOfont\FOfont
+ \fi \fi
+
+ \ifx\xFOfontsize\empty \else \ifx\xFOfontsize\FOfontsize \else
+ \let\FOfontsize\xFOfontsize
+ \doifXMLvalelse{fo:font-size}\FOfontsize
+ {\XMLval{fo:font-size}\FOfontsize\empty}
+ {\setpercentdimen\dFOfontsize\FOfontsize}
+ \fi \fi
+
+ \ifx\xFOfontsizeadjust\empty \else
+ \doifelse\xFOfontsizeadjust{none}
+ {\def\FOfontsizeadjust{1}}
+ {\let\FOfontsizeadjust\xFOfontsizeadjust}
+ \fi
+
+ \ifx\xFOfontfamily\empty \else \ifx\xFOfontfamily\FOfontfamily \else
+ \donetrue \let\FOfontfamily\xFOfontfamily \directsetup{fo:font:family:check}
+ \fi \fi
+ \ifx\xFOfontweight\empty \else \ifx\xFOfontweight\FOfontweight \else
+ \donetrue \let\FOfontweight\xFOfontweight
+ \fi \fi
+ \ifx\xFOfontstyle\empty \else \ifx\xFOfontstyle\FOfontstyle \else
+ \donetrue \let\FOfontstyle\xFOfontstyle
+ \fi \fi
+ \ifx\xFOfontvariant\empty \else \ifx\xFOfontvariant\FOfontvariant \else
+ \donetrue \let\FOfontvariant\xFOfontvariant
+ \fi \fi
+
+ \ifdone
+ \setFOfontname
+ \ifx\FOfontname\empty % klopt dit
+ \edef\xFOfontdefinition{\purefontname{\font} at \the\dimexpr(\FOfontsizeadjust\dFOfontsize)}
+% \let\xFOfontdefinition\empty
+ \else
+ \edef\xFOfontdefinition{\FOfontname\space at \the\dimexpr(\FOfontsizeadjust\dFOfontsize)}
+ \fi
+ \else
+ \edef\xFOfontdefinition{\purefontname{\font} at \the\dimexpr(\FOfontsizeadjust\dFOfontsize)}
+ \fi
+
+ \ifx\xFOfontdefinition\empty \else
+ \ifx\FOfontdefinition\xFOfontdefinition
+ \else
+ \let\FOfontdefinition\xFOfontdefinition
+ \expanded{\definedfont[\FOfontdefinition]}
+ \fi
+ \fi
+
+\stopsetups
+
+\newdimen\dFOlineheight
+\newdimen\dFOdepth
+\newdimen\dFOaltitude
+
+\let\FOlineheight \empty
+\let\FOtextdepth \empty
+\let\FOtextaltitude\empty
+
+\startsetups fo:line-height:setup
+
+ \edefXMLinh\xFOtextdepth {text-depth}
+ \edefXMLinh\xFOtextaltitude{text-altitude}
+ \edefXMLinh\xFOlineheight {line-height}
+
+% \edef\xFOtextdepth {\XMLpar{fo}{text-depth}{}}
+% \edef\xFOtextaltitude{\XMLpar{fo}{text-altitude}{}}
+% \edef\xFOlineheight {\XMLpar{fo}{line-height}{}}
+
+ \ifx\xFOtextdepth\empty \else \ifx\xFOtextdepth\FOtextdepth \else
+ \let\FOtextdepth\xFOtextdepth
+ \doifnot\FOtextdepth{use-font-metrics}
+ {\setstrut \dFOdepth\strutdepth
+ \setpercentdimen\dFOdepth\FOtextdepth
+ \setupinterlinespace[mindepth=\dFOdepth]}
+ \fi \fi
+
+ \ifx\xFOtextaltitude\empty \else \ifx\xFOtextaltitude\FOtextaltitude \else
+ \let\FOtextaltitude\xFOtextaltitude
+ \doifnot\FOtextaltitude{use-font-metrics}
+ {\setstrut \dFOaltitude\strutheight \advance\dFOaltitude\strutdepth
+ \setpercentdimen\dFOaltitude\FOtextaltitude
+ \setupinterlinespace[minheight=\dFOaltitude]}
+ \fi \fi
+
+\ifinsidecolumns \else
+
+ \ifx\xFOlineheight\empty \else \ifx\xFOlineheight\FOlineheight \else
+ \let\FOlineheight\xFOlineheight
+ \doifelse\FOlineheight{normal}
+ {\dFOlineheight2.8ex
+ \setupinterlinespace[line=\dFOlineheight]}
+ {\doifnot\FOlineheight{use-font-metrics}
+ {\setstrut \dFOlineheight\strutheight \advance\dFOlineheight\strutdepth
+ \setpercentdimen\dFOlineheight\FOlineheight
+ \setupinterlinespace[line=\dFOlineheight]}}
+ \fi \fi
+
+\fi
+
+\stopsetups
+
+\let\orphanpenalty \clubpenalty
+\let\orphanpenalties\clubpenalties
+
+\newcount\FOwidows \FOwidows =2
+\newcount\FOorphans \FOorphans=2
+
+\mapXMLvalue {fo:hyphens} {false} {\nohyphens}
+\mapXMLvalue {fo:hyphens} {true} {\dohyphens}
+
+\startsetups fo:hyphenation:setup
+
+ \edefXMLinh\xFOhyphenate {hyphenate}
+ \edefXMLinh\xFOwidows {widows}
+ \edefXMLinh\xFOorphans {orphans}
+
+% \edef\xFOhyphenate {\XMLpar{fo}{hyphenate}{}}
+% \edef\xFOwidows {\XMLpar{fo}{widows}{}}
+% \edef\xFOorphans {\XMLpar{fo}{orphans}{}}
+
+ \ifx\xFOhyphenate\empty \else
+ \XMLval{fo:hyphens}{\xFOhyphenate}\empty
+ \fi
+ \ifx\xFOwidows\empty \else \ifnum\xFOwidows=\FOwidows \else
+ \FOwidows\xFOwidows \setpenalties\widowpenalties\FOwidows\maxdimen
+ \fi \fi
+ \ifx\xFOorphans\empty \else \ifnum\xFOorphans=\FOorphans \else
+ \FOorphans\xFOorphans \setpenalties\clubpenalties\FOorphans\maxdimen
+ \fi \fi
+
+ % hyphenation-character
+
+\stopsetups
+
+%D fo:block-container
+
+% todo: potential optimization: set fonts and spacing at container level
+
+% display-align=,
+% intrusion-displace=,
+% reference-orientation=,
+% writing-mode=,
+
+\defineXMLenvironment
+ [fo:block-container]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fe:tracing},
+ \XMLattributeset{fo:absolute-positioning},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-block},
+ \XMLattributeset{fo:keeps-and-breaks},
+ block-progression-dimension=,
+ inline-progression-dimension=,
+ clip=,
+ height=,
+ overflow=,
+ span=,
+ width=,
+ z-index=]
+ {\beginXMLelement\directsetup{fo:block-container:start}}
+ {\directsetup{fo:block-container:stop}\endXMLelement}
+
+\mapXMLvalue {fo:block-container:start} {absolute} {\directsetup{fo:block-container:start:pos}}
+\mapXMLvalue {fo:block-container:start} {fixed} {\directsetup{fo:block-container:start:pos}}
+
+\mapXMLvalue {fo:block-container:stop} {absolute} {\directsetup{fo:block-container:stop:pos}}
+\mapXMLvalue {fo:block-container:stop} {fixed} {\directsetup{fo:block-container:stop:pos}}
+
+\startsetups fo:block-container:start
+
+ \XMLval{fo:block-container:start}{\XMLpar{fo:block-container}{absolute-position}{}}{}
+
+ \setFOreference{fo:block-container}
+
+\stopsetups
+
+\startsetups fo:block-container:stop
+
+ \XMLval{fo:block-container:stop}{\XMLpar{fo:block-container}{absolute-position}{}}{}
+
+\stopsetups
+
+% i need to figure out the details (specs are a bit fuzzy)
+
+% replaced, see position
+
+\newdimen\FOcontainerW \newdimen\FOcontainerX \newdimen\FOcontainerL \newdimen\FOcontainerR \newdimen\FOcontainerWW
+\newdimen\FOcontainerH \newdimen\FOcontainerY \newdimen\FOcontainerT \newdimen\FOcontainerB \newdimen\FOcontainerHH
+
+\startsetups fo:block-container:start:pos
+
+ % todo: textwidth -> region dimensions
+
+ \begingroup % \forgetall
+
+ \FOcontainerWW\textwidth
+ \FOcontainerHH\textheight
+ \def\FOlayername{\XMLpar{fo:flow}{flow-name}{xsl-region-body}}
+
+ \iftracingFO \tracelayerstrue \fi
+
+ \directsetup{fo:preset:layer}
+
+ \setlayerframed
+ [\XMLpar{fo:flow}{flow-name}{xsl-region-body}]
+ [frame=off,
+ width=\FOcontainerW,
+ height=\FOcontainerH]
+
+ \bgroup
+
+\stopsetups
+
+\startsetups fo:block-container:stop:pos
+
+ \egroup
+
+ \endgroup
+
+\stopsetups
+
+%D fo:bidi-override
+
+% \XMLattributeset{aural},
+% color=,
+% direction=,
+% letter-spacing=,
+% line-height=,
+% word-spacing=,
+
+\defineXMLenvironment
+ [fo:bidi-override]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:relative-position},
+ score-spaces=,
+ unicode-bidi=]
+ {\beginXMLelement}
+ {\endXMLelement}
+
+% todo
+
+%D fo:character
+
+% \XMLattributeset{fo:aural},
+% color=,
+% glyph-orientation-horizontal=,
+% glyph-orientation-vertical=,
+% line-height=,
+
+\defineXMLsingular
+ [fo:character]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fe:tracing},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:hyphenation},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ \XMLattributeset{fo:character},
+ alignment-adjust=,
+ baseline-shift=,
+ dominant-baseline=,
+% text-depth=,
+% text-altitude=,
+ keep-with-next=,
+ keep-with-previous=,
+ score-spaces=,
+ visibility=]
+ {\directsetup{fo:character:process}}
+
+\mapXMLvalue {fo:vertical-align} {baseline} {\hbox}
+\mapXMLvalue {fo:vertical-align} {sub} {\low}
+\mapXMLvalue {fo:vertical-align} {super} {\high}
+\mapXMLvalue {fo:vertical-align} {inherit} {\firstofoneargument}
+
+\startsetups fo:character:process
+
+ % border
+ % font
+ % margin
+ % positioning
+ % baseline
+ % color
+ % depth and altitude
+ % keep-with
+ % lineheight
+
+ \dontleavehmode \begingroup
+
+ \directsetup{fe:setup}
+ \directsetup{fo:font:setup}
+
+ \iftracingFO \ruledhbox \else \hbox \fi \bgroup
+
+ \doifsomethingXMLop{vertical-align}
+ {\doifXMLvalelse{fo:vertical-align}{\XMLop{vertical-align}}
+ {\XMLval{fo:vertical-align}{\XMLop{vertical-align}}{}}
+ {\wordshiftamount\lineheight
+ \setpercentdimen\wordshiftamount{\XMLop{vertical-align}}
+ \shiftedword}}
+
+ {\directsetup{fo:character:orient}}
+
+ \egroup \endgroup
+
+\stopsetups
+
+\startsetups fo:character:orient
+
+% \rotate[rotation=-\XMLop{glyph-orientation-horizontal}]
+
+ \doifsomethingXMLop{glyph-orientation-horizontal}
+ {\rotate[rotation=\XMLval{fo:reference-orientation}{\XMLop{glyph-orientation-horizontal}}{0}]}
+ {\XMLop{character}}
+
+\stopsetups
+
+%D fo:initial-property-set
+
+% \XMLattributeset{fo:aural},
+% color=,
+% letter-spacing=,
+% line-height=,
+% text-transform=,
+% word-spacing=,
+
+\defineXMLprocess
+ [fo:initial-property-set]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:relative-position},
+ score-spaces=,
+ text-decoration=,
+ text-shadow=]
+
+%D fo:external-graphic
+
+\useMPlibrary[dum]
+
+% \XMLattributeset{fo:aural},
+% display-align=,
+% height=,
+% text-align=,
+
+\defineXMLenvironmentsave
+ [fo:external-graphic]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ block-progression-dimension=,
+ clip=,
+ content-height=,
+ content-type=,
+ content-width=,
+ dominant-baseline=,
+ height=,
+ inline-progression-dimension=,
+ keep-with-next=,
+ keep-with-previous=,
+ overflow=,
+ scaling=,
+ scaling-method=,
+ src=dummy,
+ width=]
+ {}
+ {\directsetup{fo:external-graphic:process}}
+
+\newdimen\FOgraphicwidth
+\newdimen\FOgraphicheight
+
+\mapXMLvalue {external-graphic:align} {top} {\tbox}
+\mapXMLvalue {external-graphic:align} {bottom} {\bbox}
+\mapXMLvalue {external-graphic:align} {center} {\cbox}
+
+\startsetups fo:external-graphic:process
+
+ \doifelsenothing{\XMLop{content-height}}
+ {\FOgraphicheight\zeropoint}
+ {\doifelse{\XMLop{content-height}}{scale-to-fit}% is this official ?
+ {\FOgraphicwidth\zeropoint}
+ {\doifelse{\XMLop{content-height}}{auto}
+ {\FOgraphicheight\zeropoint}
+ {\FOgraphicheight\lineheight
+ \setpercentdimen\FOgraphicheight{\XMLop{content-height}}}}}
+
+ \doifelsenothing{\XMLop{content-width}}
+ {\FOgraphicwidth\zeropoint}
+ {\doifelse{\XMLop{content-width}}{scale-to-fit}% is this official ?
+ {\FOgraphicwidth\zeropoint}
+ {\doifelse{\XMLop{content-width}}{auto}
+ {\FOgraphicwidth\zeropoint}
+ {\FOgraphicwidth1em
+ \setpercentdimen\FOgraphicwidth {\XMLop{content-width}}}}}
+
+ % leeg maken vars gaat ook goed, dan een \externalfigure
+
+ % todo : height/width scale-to-fit: factor=...
+
+ \setbox\scratchbox\hbox
+ {\setFOimagename{\XMLpar{fo:external-graphic}{src}{dummy}}
+ \ifdim\FOgraphicheight>\zeropoint
+ \ifdim\FOgraphicwidth>\zeropoint
+ \externalfigure[\FOimagename][height=\FOgraphicheight,width=\FOgraphicwidth]
+ \else
+ \externalfigure[\FOimagename][height=\FOgraphicheight]
+ \fi
+ \else
+ \ifdim\FOgraphicwidth>\zeropoint
+ \externalfigure[\FOimagename][width=\FOgraphicwidth]
+ \else
+ \externalfigure[\FOimagename]
+ \fi
+ \fi}
+
+ \dontleavehmode \XMLval{external-graphic:align}{\XMLop{vertical-align}}{}{\box\scratchbox}
+
+\stopsetups
+
+%D fo:instream-foreign-object
+
+% like external-graphic, only no src
+
+% \XMLattributeset{fo:aural},
+% display-align=,
+% line-height=,
+% text-align=,
+
+\defineXMLprocess
+ [fo:instream-foreign-object]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:relative-position},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ block-progression-dimension=,
+ clip=,
+ content-height=,
+ content-type=,
+ content-width=,
+ dominant-baseline=,
+ height=,
+ inline-progression-dimension=,
+ keep-with-next=,
+ keep-with-previous=,
+ overflow=,
+ scaling=,
+ scaling-method=,
+ width=]
+
+%D Element: fo:inline
+
+% \XMLattributeset{fo:aural},
+% line-height=,
+% wrap-option=,
+% color=,
+% keep-together=,
+
+\defineXMLnestedenvironmentsave
+ [fo:inline]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ block-progression-dimension=,
+ dominant-baseline=,
+ height=,
+ inline-progression-dimension=,
+ keep-with-next=,
+ keep-with-previous=,
+ text-decoration=,
+ visibility=,
+ width=]
+ {\beginXMLelement}
+ {\directsetup{fo:inline:process}\endXMLelement}
+
+\defineXMLsingular
+ [fo:inline]
+ {}
+
+% baseline-shift: baseline sub super % dimen inherit
+
+\chardef\isolatedwordsmode=1
+
+\newdimen\wordshiftamount
+
+\def\shiftedword{\raise\wordshiftamount\hbox}
+
+\long\def\shiftedwords#1{\processisolatedwords{#1}\shiftedword}
+\long\def\normalwords #1{\processisolatedwords{#1}\hbox}
+\long\def\highwords #1{\processisolatedwords{#1}\high}
+\long\def\lowwords #1{\processisolatedwords{#1}\low}
+
+\mapXMLvalue {fo:baseline-shift} {baseline} {\normalwords}
+\mapXMLvalue {fo:baseline-shift} {sub} {\lowwords}
+\mapXMLvalue {fo:baseline-shift} {super} {\highwords}
+\mapXMLvalue {fo:baseline-shift} {inherit} {\firstofoneargument}
+
+\startsetups fo:inline:process
+
+ \directsetup{fo:position:start}
+
+ \dontleavehmode
+
+ \doFOreference{fo:inline}
+
+ \begingroup
+
+ \directsetup{fe:setup}
+ \directsetup{fo:space:start}
+
+ \begingroup
+
+ \directsetup{fo:hyphenation:setup}
+ \directsetup{fo:font:setup}
+
+ \doifelsenothing{\XMLop{baseline-shift}}
+ {\XMLflushself}
+ {\doifXMLvalelse{fo:baseline-shift}{\XMLop{baseline-shift}}
+ {\XMLval{fo:baseline-shift}{\XMLop{baseline-shift}}{}{\XMLflushself}}
+ {\wordshiftamount\lineheight
+ \setpercentdimen\wordshiftamount{\XMLop{baseline-shift}}
+ \shiftedwords{\XMLflushself}}}
+
+ \endgroup
+
+ \directsetup{fo:space:end}
+
+ \endgroup
+
+ \directsetup{fo:position:stop}
+
+\stopsetups
+
+\startsetups fo:position:start
+ \begingroup
+ \directsetup{fo:position:\XMLop{position}:start}
+ \begingroup
+\stopsetups
+
+\startsetups fo:position:stop
+ \endgroup
+ \directsetup{fo:position:\XMLop{position}:stop}
+ \endgroup
+\stopsetups
+
+\startsetups fo:position:static:start
+\stopsetups
+
+\startsetups fo:position:static:stop
+\stopsetups
+
+\startsetups fo:position:fixed:start
+ \FOcontainerWW\paperwidth
+ \FOcontainerHH\paperheight
+ \def\FOlayername{regions}
+ \directsetup{fo:preset:layer}
+ \setlayer[regions]{\vbox \bgroup \setlocalhsize}
+\stopsetups
+
+\startsetups fo:position:fixed:stop
+ \egroup
+\stopsetups
+
+\enableparpositions % slows down but who uses fo anyway ...
+
+\startsetups fo:position:absolute:start
+ \setbox\FOpositionbox\hbox\bgroup
+\stopsetups
+
+\startsetups fo:position:absolute:stop
+ \egroup
+ % evt uitstellen tot otr, zodat text/realfolio is solved
+ \edef\FOpartag{p:\number\parposcounter}
+ \edef\FOtxttag{text:\realfolio}
+ \FOcontainerWW\MPplus\FOpartag{1}{0pt}
+ \FOcontainerHH\zeropoint % todo: add anchors to each 'object'
+ \directsetup{fo:preset:position}
+ \setlayer
+ [xsl-region-body]
+ [preset=lefttop,
+ hoffset=\dimexpr(\MPx\FOtxttag-\MPx\FOpartag),
+ voffset=\dimexpr(\MPy\FOtxttag+\MPh\FOtxttag-\MPy\FOpartag-\MPh\FOpartag)]
+ {\iftracingFO \ruledhbox \bgroup \fi
+ \offset
+ [method=fixed,
+ leftoffset=\FOcontainerL,
+ rightoffset=\FOcontainerR,
+ topoffset=\FOcontainerT,
+ bottomoffset=\FOcontainerB]
+ {\box\FOpositionbox}
+ \iftracingFO \egroup \fi}
+\stopsetups
+
+\newbox\FOpositionbox
+
+\startsetups fo:position:relative:start
+ \setbox\FOpositionbox\hbox\bgroup
+\stopsetups
+
+\startsetups fo:position:relative:stop
+ \egroup
+ \FOcontainerWW\wd\FOpositionbox
+ \FOcontainerHH\dimexpr(\ht\FOpositionbox+\dp\FOpositionbox)
+ \directsetup{fo:preset:position}
+ \iftracingFO \ruledhbox \bgroup \fi
+ \offset
+ [method=fixed,
+ leftoffset=\FOcontainerL,
+ rightoffset=\FOcontainerR,
+ topoffset=\FOcontainerT,
+ bottomoffset=\FOcontainerB]
+ {\box\FOpositionbox}
+ \iftracingFO \egroup \fi
+\stopsetups
+
+%
+
+\startsetups fo:preset:position
+
+ \FOcontainerW\zeropoint \FOcontainerL\zeropoint \FOcontainerR\zeropoint
+ \FOcontainerH\zeropoint \FOcontainerT\zeropoint \FOcontainerB\zeropoint
+
+ \doifnot{\XMLop{left}} {auto}{\FOcontainerL\FOcontainerWW\setpercentdimen\FOcontainerL{\XMLop{left}}}
+ \doifnot{\XMLop{right}} {auto}{\FOcontainerR\FOcontainerWW\setpercentdimen\FOcontainerR{\XMLop{right}}}
+ \doifnot{\XMLop{top}} {auto}{\FOcontainerT\FOcontainerHH\setpercentdimen\FOcontainerT{\XMLop{top}}}
+ \doifnot{\XMLop{bottom}}{auto}{\FOcontainerB\FOcontainerHH\setpercentdimen\FOcontainerB{\XMLop{bottom}}}
+
+ \doifnot{\XMLop{width}} {auto}{\FOcontainerW\FOcontainerWW\setpercentdimen\FOcontainerW{\XMLop{width}}}
+ \doifnot{\XMLop{height}}{auto}{\FOcontainerH\FOcontainerHH\setpercentdimen\FOcontainerH{\XMLop{height}}}
+
+\stopsetups
+
+\startsetups fo:preset:layer
+
+ \directsetup{fo:preset:position}
+
+ \setuplayer
+ [\FOlayername]
+ [width=\FOcontainerWW,
+ height=\FOcontainerHH]
+
+ \ifzeropt\FOcontainerW
+ \FOcontainerW\dimexpr(\FOcontainerWW-\FOcontainerL-\FOcontainerR)
+ \fi
+ \ifzeropt\FOcontainerH
+ \FOcontainerH\dimexpr(\FOcontainerHH-\FOcontainerT-\FOcontainerB)
+ \fi
+
+ \ifzeropt\FOcontainerB
+ \ifzeropt\FOcontainerL
+ \setuplayer[\FOlayername][preset=righttop, x=\FOcontainerR,y=\FOcontainerT]
+ \else
+ \setuplayer[\FOlayername][preset=lefttop, x=\FOcontainerL,y=\FOcontainerT]
+ \fi
+ \else
+ \ifzeropt\FOcontainerL
+ \setuplayer[\FOlayername][preset=rightbottom,x=\FOcontainerR,y=\FOcontainerB]
+ \else
+ \setuplayer[\FOlayername][preset=leftbottom, x=\FOcontainerL,y=\FOcontainerB]
+ \fi
+ \fi
+
+\stopsetups
+
+%D Element: fo:inline-container
+
+% display-align=,
+% line-height=,
+% reference-orientation=,
+% writing-mode=,
+% keep-together=,
+
+\defineXMLenvironment
+ [fo:inline-container]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ block-progression-dimension=,
+ clip=,
+ dominant-baseline=,
+ height=,
+ inline-progression-dimension=,
+ keep-with-next=,
+ keep-with-previous=,
+ overflow=,
+ width=]
+ {\beginXMLelement\begingroup}
+ {\endgroup\endXMLelement}
+
+%D Element: fo:leader
+
+% also a kind of fake fill
+
+% \XMLattributeset{fo:aural},
+% color=,
+% line-height=,
+% word-spacing=,
+
+\defineXMLenvironmentsave
+ [fo:leader]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ \XMLattributeset{fo:leader-and-rule},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ dominant-baseline=,
+ % text-depth=,
+ % text-altitude=,
+ keep-with-next=,
+ keep-with-previous=,
+ letter-spacing=,
+ text-shadow=,
+ visibility=]
+ {\beginXMLelement}
+ {\directsetup{fo:leader:process}\endXMLelement}
+
+\mapXMLvalue {fo:leader-pattern} {space} {\hfill}
+\mapXMLvalue {fo:leader-pattern} {dots} {.}
+\mapXMLvalue {fo:leader-pattern} {rule} {\hrulefill}
+\mapXMLvalue {fo:leader-pattern} {use-content} {\XMLflushself}
+
+% todo: speed up
+
+\startsetups fo:leader:process
+
+ %tracebackXMLattribute{leader-pattern-width}
+
+ \strut \leaders
+ %edefXMLinh \FOlepatwd {leader-pattern-width}
+ \hbox to \XMLinh{leader-pattern-width}
+ {\hss\XMLval{fo:leader-pattern}{\XMLinh{leader-pattern}}{\hfill}\hss}
+ \hfill \strut
+
+\stopsetups
+
+%D Element: fo:pagenumber
+
+% \XMLattributeset{fo:aural},
+% line-height=,
+% wrap-option=,
+% letter-spacing=,
+% text-transform=,
+% word-spacing=,
+
+\defineXMLsingular
+ [fo:page-number]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ dominant-baseline=,
+ keep-with-next=,
+ keep-with-previous=,
+ score-spaces=,
+% text-altitude=,
+ text-decoration=,
+% text-depth=,
+ text-shadow=,
+ visibility=]
+ {\directsetup{fo:page-number:process}}
+
+\newcount\FOpnrefcounter
+
+\startsetups fo:page-number:process
+
+ \doifelsenothing{\XMLpar{fo:page-sequence}{format}{}}
+ {\pagenumber}
+ {\ifinotr
+ \globallet\FOpnrefnumber\folio
+ \else
+ \global\advance\FOpnrefcounter\plusone
+ \pagereference[pnref:\the\FOpnrefcounter]
+ \doifreferencefoundelse{pnref:\the\FOpnrefcounter}
+ {\globallet\FOpnrefnumber\currentfolioreference}
+ {\globallet\FOpnrefnumber\folio}
+ \fi
+ \expanded{\handletokens\XMLpar{fo:page-sequence}{format}{}}\with{\handleFOformat{\FOpnrefnumber}}}
+
+\stopsetups
+
+\defineconversion[1][\numbers]
+
+\long\def\handleFOformat#1#2%
+ {\defconvertedargument\ascii{#2}%
+ \doifconversiondefinedelse\ascii{\convertnumber\ascii{#1}}{#2}}
+
+%D Element: fo:pagenumber-citation
+
+% same as page-number
+
+% \XMLattributeset{fo:aural},
+% line-height=,
+% wrap-option=,
+% letter-spacing=,
+% text-transform=,
+% word-spacing=,
+
+\defineXMLsingular
+ [fo:page-number-citation]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ ref-id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:font},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ dominant-baseline=,
+ keep-with-next=,
+ keep-with-previous=,
+ score-spaces=,
+% text-altitude=,
+ text-decoration=,
+% text-depth=,
+ text-shadow=,
+ visibility=]
+ {\directsetup{fo:page-number-citation:process}}
+
+\startsetups fo:page-number-citation:process
+
+ \doifreferencefoundelse{\XMLop{ref-id}}
+ {\globallet\FOpnrefnumber\currentfolioreference
+ \globallet\FOpnrefformat\currenttextreference}
+ {\gdef\FOpnrefnumber{?}
+ \gdef\FOpnrefformat{}}
+
+ \doifelsenothing{\FOpnrefformat}
+ {\FOpnrefnumber}
+ {\expanded{\handletokens\FOpnrefformat}\with{\handleFOformat{\FOpnrefnumber}}}
+
+\stopsetups
+
+%D Element: fo:table-and-caption
+
+% \XMLattributeset{fo:aural},
+% text-align=,
+% caption-side=,
+% intrusion-displace=,
+% keep-together=,
+
+\defineXMLenvironment
+ [fo:table-and-caption]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-block},
+ \XMLattributeset{fo:relative-position},
+ break-after=,
+ break-before=,
+ keep-with-next=,
+ keep-with-previous=]
+ {\beginXMLelement}
+ {\endXMLelement}
+
+%D Element: fo:table fo:table-caption fo:table-header fo:table-footer
+%D to:table-column fo:table-body fo:table-row fo:table-cell
+
+% \XMLattributeset{fo:aural},
+% border-collapse=,
+% border-separation=,
+% intrusion-displace=,
+% keep-together=,
+% writing-mode=,
+
+\defineXMLenvironment
+ [fo:table]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-block},
+ \XMLattributeset{fo:relative-position},
+ block-progression-dimension=,
+ border-after-precedence=,
+ border-before-precedence=,
+ border-start-precedence=,
+ border-end-precedence=,
+ break-after=,
+ break-before=,
+ inline-progression-dimension=,
+ height=,
+ keep-with-next=,
+ keep-with-previous=,
+ table-layout=,
+ table-omit-footer-at-break=,
+ table-omit-header-at-break=,
+% text-indent=0pt, % yes or no?
+ width=]
+ {\beginXMLelement
+ \bTABLE % [option=stretch] %
+ \newcounter\FOtablecolumn}
+ {\eTABLE
+ \endXMLelement}
+
+\newdimen\FOtableW
+\newdimen\FOtableH
+
+\defineXMLsingular
+ [fo:table-column]
+ [\XMLattributeset{fo:inherited},
+ \XMLattributeset{fo:border-padding-background}, % only background, not the rest, make subset
+ border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ column-width=,
+ column-number=,
+ number-columns-repeated=,
+ number-columns-spanned=,
+ visibility=]
+ {\directsetup{fo:table-column:action}}
+
+% \XMLattributeset{fo:aural},
+% intrusion-displace=,
+% keep-together=,
+
+\defineXMLprocess
+ [fo:table-caption]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:relative-position},
+ block-progression-dimension=,
+ height=,
+ inline-progression-dimension=,
+ width=]
+
+% \XMLattributeset{fo:aural},
+
+\defineXMLnested
+ [fo:table-header]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:relative-position},
+ border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ visibility=]
+ {\beginXMLelement\bTABLEhead}
+ {\eTABLEhead\endXMLelement}
+
+% \XMLattributeset{fo:aural},
+
+\defineXMLnested
+ [fo:table-footer]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:relative-position},
+ border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ visibility=]
+ {\beginXMLelement\bTABLEfoot}
+ {\eTABLEfoot\endXMLelement}
+
+% \XMLattributeset{fo:aural},
+
+\defineXMLnested
+ [fo:table-body]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:relative-position},
+ border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ visibility=]
+ {\beginXMLelement\bTABLEbody}
+ {\eTABLEbody\endXMLelement}
+
+% TODO: when stretch and when not
+
+% \XMLattributeset{fo:aural},
+% keep-together=,
+
+\defineXMLnested
+ [fo:table-row]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:relative-position},
+ border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ break-after=,
+ break-before=,
+ height=,
+ keep-with-next=,
+ keep-with-previous=,
+ visibility=]
+ {\beginXMLelement
+ \directsetup{fo:table-row:start}%
+ \expanded{\bTR[\the\scratchtoks]}%
+ \beginXMLelement}
+ {\endXMLelement
+ \eTR
+ \directsetup{fo:table-row:stop}
+ \endXMLelement}
+
+\startsetups fo:table-row:start
+
+ \inTABLErowtrue
+
+ \scratchtoks\emptytoks
+
+ \doifsomething{\XMLop{height}}
+ {\FOtableH\textheight
+ \setpercentdimen\FOtableH{\XMLop{height}}
+ \appendetoks
+ height=\the\FOtableH
+ \to \scratchtoks}
+
+ \appendetoks
+ ,extras={\rescanXMLattributes{fo:table-row}}
+ \to\scratchtoks
+
+\stopsetups
+
+\startsetups fo:table-row:stop
+
+ \inTABLErowfalse
+
+\stopsetups
+
+% \XMLattributeset{fo:aural},
+% display-align=,
+% relative-align=,
+% empty-cells=,
+
+\newif\ifinTABLErow
+\newdimen\FOtablecellwidth
+\newdimen\FOtablecellheight
+
+\defineXMLnested
+ [fo:table-cell]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:relative-position},
+ border-after-precedence=,
+ border-before-precedence=,
+ border-end-precedence=,
+ border-start-precedence=,
+ column-number=,
+ ends-row=,
+ height=,
+ inline-progression-dimension=,
+ number-columns-spanned=1,
+ number-rows-spanned=1,
+ starts-row=,
+ width=]
+ {\directsetup{fo:table-cell:start}%
+ \expanded{\bTD[\the\scratchtoks]}%
+ \beginXMLelement}
+ {\endXMLelement
+ \eTD
+ \directsetup{fo:table-cell:stop}}
+
+\startsetups fo:table-column:action
+
+ \doifelsenothing{\XMLop{column-number}}
+ {\increment\FOtablecolumn}
+ {\edef\FOtablecolumn{\XMLop{column-number}}
+ \expanded{\setupTABLE[column][\FOtablecolumn][n=\FOtablecolumn]}}
+
+ \doifsomething{\XMLop{column-width}}
+ {%\setlocalhsize
+ %\FOtableW\localhsize
+ \analyzefunction{\XMLop{column-width}}%
+ % hm, we need to set localhsize earlier
+ \doifelse\functionname{proportional-column-width}
+ {\FOtableW\functionA\textwidth}
+ {\FOtableW\textwidth
+ \setpercentdimen\FOtableW{\XMLop{column-width}}}%
+ \expanded{\setupTABLE[column][\FOtablecolumn][width=\the\FOtableW]}}
+
+ \doif{\XMLop{border-style}}{none}
+ {\expanded{\setupTABLE[column][\FOtablecolumn][frame=off]}}
+
+ \doifelsenothing{\XMLop{display-align}}
+ {\doifsomething{\XMLop{text-align}}
+ {\expanded{\setupTABLE[column][\FOtablecolumn]
+ [align=\XMLpav{fo:align-key}{fo:table-column}{text-align}{normal}]}}}
+ {\doifsomething{\XMLop{text-align}}
+ {\expanded{\setupTABLE[column][\FOtablecolumn]
+ [align={\XMLpav{fo:display-align}{fo:table-column}{display-align}{high},\XMLpav{fo:align-key}{fo:table-column}{text-align}{normal}}]}}
+ {\expanded{\setupTABLE[column][\FOtablecolumn]
+ [align=\XMLpav{fo:display-align}{fo:table-column}{display-align}{high}]}}}
+
+\expanded{\setupTABLE[column][\FOtablecolumn][extras={\rescanXMLattributes{fo:table-column}}]}
+
+\stopsetups
+
+\startsetups fo:table-cell:start
+
+ \doif{\XMLop{starts-row}}{true}{\ifinTABLErow\eTR\inTABLErowfalse\fi}
+
+ \ifinTABLErow\else\bTR\inTABLErowtrue\fi
+
+ \doifelsenothing{\XMLop{background-color}}
+ {\let\FoTableBG\empty}
+ {\checkhexcolor[\XMLop{background-color}]
+ \doifcolorelse{\XMLop{background-color}}
+ {\def\FoTableBG{color}}
+ {\setXMLpar{fo:table-cell}{background-color}{}
+ \let\FoTableBG\empty}}
+
+% \doifelse{\XMLpar{fo:table-cell}{width}{}}{}
+% {\def\pFOtablewidth{fit}}
+% {\FOtablecellwidth\textwidth % probably must be localhsize or frozen at an outer level
+% \setpercentdimen\FOtablecellwidth{\XMLpar{fo:table-cell}{width}{0pt}}%
+% \edef\pFOtablewidth{\the\FOtablecellwidth}}%
+
+% \doifelse{\XMLpar{fo:table-cell}{height}{}}{}
+% {\def\pFOtableheight{fit}}
+% {\FOtablecellheight\textheight % probably must be localhsize or frozen at an outer level
+% \setpercentdimen\FOtablecellheight{\XMLpar{fo:table-cell}{height}{0pt}}%
+% \edef\pFOtableheight{\the\FOtablecellheight}}%
+
+ \scratchtoks\emptytoks \appendetoks
+% style=\noexpand\directsetup{fo:font:setup}, % else not expanded
+ nx=\XMLop{number-columns-spanned},
+ ny=\XMLop{number-rows-spanned},
+ n=\XMLop{column-number},
+ background=\FoTableBG
+ \to \scratchtoks
+
+ \doifnot{\XMLop{border-style}}{none}
+ {\appendetoks
+ ,frame=on
+ \to\scratchtoks}
+
+ \doifsomething{\XMLop{background-color}}
+ {\appendetoks
+ ,backgroundcolor=\XMLop{background-color}
+ \to \scratchtoks}
+
+ % todo : padding
+
+ \doifsomething{\XMLop{padding}}
+ {\appendetoks
+ ,offset=\XMLop{padding}
+ \to \scratchtoks}
+
+ % todo: interference with presets in column (outer level) -> \setupcolumn[column] ...;
+ % misschien meerdere align switches
+
+ \doifelsenothing{\XMLop{display-align}}
+ {\doifsomething{\XMLop{text-align}}
+ {\appendetoks
+ ,align=\XMLpav{fo:align-key}{fo:table-cell}{text-align}{normal}
+ \to \scratchtoks}}
+ {\doifsomething{\XMLop{text-align}}
+ {\appendetoks
+ ,align={\XMLpav{fo:display-align}{fo:table-cell}{display-align}{high},\XMLpav{fo:align-key}{fo:table-cell}{text-align}{normal}},
+ \to \scratchtoks}
+ {\appendetoks
+ ,align=\XMLpav{fo:display-align}{fo:table-cell}{display-align}{high}
+ \to \scratchtoks}}
+
+ \appendetoks
+ ,extras={\rescanXMLattributes{fo:table-cell}}
+ \to\scratchtoks
+
+\stopsetups
+
+% \startsetups fo:table-cell:setup
+
+% [\XMLpar{fo:table-cell}{text-indent}{}]
+
+% \edefXMLinhpar\xFOtextindent{fo:table-cell}{text-indent}
+
+% \doifsomething\xFOtextindent
+% {\scratchdimen\hsize
+% \setpercentdimen\scratchdimen\xFOtextindent
+% \expanded{\setupindenting[\the\scratchdimen]}}
+
+% \stopsetups
+
+\startsetups fo:table-cell:stop
+
+ \doif{\XMLop{ends-row}}{true}{\eTR\inTABLErowfalse}
+
+\stopsetups
+
+%D Element: fo:list-block fo:list-item fo:list-body fo:list-item-label
+
+% \XMLattributeset{fo:aural},
+% intrusion-displace=,
+% keep-together=,
+% provisional-distance-between-starts=24pt,
+% provisional-label-separation=6pt,
+
+\defineXMLenvironment
+ [fo:list-block]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fe:tracing},
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-block},
+ \XMLattributeset{fo:relative-position},
+ break-after=,
+ break-before=,
+ keep-with-next=,
+% space-between-list-rows=, % ? mentioned in bradley
+text-indent=0pt, % yes
+ keep-with-previous=]
+ {\beginXMLelement\directsetup{fo:list:start}}
+ {\directsetup{fo:list:stop}\endXMLelement}
+
+\startsetups fo:list:start
+ \endgraf
+ \begingroup
+ \directsetup{fe:setup}
+ \disablemode[fo:in-list]
+ % \forgetall, no!
+% \directsetup{fo:break-and-space:before}
+ \directsetup{fo:indent:setup}
+ \begingroup
+\stopsetups
+
+\startsetups fo:list:stop
+ \endgraf
+ \endgroup
+% \directsetup{fo:break-and-space:after}
+ \endgroup
+\stopsetups
+
+% \XMLattributeset{fo:aural},
+% relative-align=,
+% intrusion-displace=,
+% keep-together=,
+
+% The list model is plain stupid. Instead of just defining a few mechanism
+% or using some kind of type attribute, a strange mechanism of functions is
+% used. Why on the one hand introduce redundant attributes and on the other
+% hand safe a few elements. A proper segmentation of the problem would have
+% brought better solutions.
+
+\defineXMLenvironment
+ [fo:list-item]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fe:tracing},
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-block},
+ \XMLattributeset{fo:relative-position},
+ break-after=,
+ break-before=,
+ keep-with-next=,
+ keep-with-previous=]
+ {\beginXMLelement\directsetup{fo:list-item:start}}
+ {\directsetup{fo:list-item:stop}\endXMLelement}
+
+% check what is needed
+
+\newdimen\FOlistitemlabelhsize \newdimen\FOlistitembodyhsize \newdimen\FOlistitemdistance
+\newdimen\FOlistitemlabelleftskip \newdimen\FOlistitembodyleftskip
+\newdimen\FOlistitemlabelrightskip \newdimen\FOlistitembodyrightskip
+
+\defineXMLnestedsave
+ [fo:list-item-body]
+ [\XMLattributeset{fo:inherited},
+ id=, % keep-together=,
+ \XMLattributeset{fo:accessibility}]
+
+\defineXMLnestedsave
+ [fo:list-item-label]
+ [\XMLattributeset{fo:inherited},
+ id=, % keep-together=,
+ \XMLattributeset{fo:accessibility}]
+
+\startsetups fo:list-item:start
+
+ \bgroup
+
+% \startmode[fo:in-list]
+% \doifsomething{\XMLpar{fo:list-block}{space-between-list-rows}{}}
+% {\vskip\XMLpar{fo:list-block}{space-between-list-rows}{}} % todo ! ! ! !
+% \stopmode
+
+ \enablemode[fo:in-list]
+
+\stopsetups
+
+% todo : relative-align in list item
+
+\newif\ifFOlabelend
+\newif\ifFObodystart
+
+\startsetups fo:list-item:stop
+
+ % 24pt en 6pt in fo:root instellen
+
+ % \tracebackXMLattribute{provisional-distance-between-starts}
+
+ \edefXMLinh \FOprodis {provisional-distance-between-starts}
+ \edefXMLinh \FOprolab {provisional-label-separation}
+
+% \edef\FOprodis{\XMLpar{fo}{provisional-distance-between-starts}{}}
+% \edef\FOprolab{\XMLpar{fo}{provisional-label-separation}{}}
+
+ \edef\FOprodis{\ifx\FOprodis\empty24pt\else\FOprodis\fi}
+ \edef\FOprolab{\ifx\FOprolab\empty 6pt\else\FOprolab\fi}
+
+ \setlocalhsize
+
+ \FOlistitemlabelleftskip \zeropoint
+ \FOlistitemlabelrightskip\zeropoint
+ \FOlistitembodyleftskip \zeropoint
+ \FOlistitembodyrightskip \zeropoint
+
+ \doifelse{\XMLpar{fo:list-item-label}{end-indent} {}}{label-end()} \FOlabelendtrue \FOlabelendfalse
+ \doifelse{\XMLpar{fo:list-item-body} {start-indent}{}}{body-start()}\FObodystarttrue\FObodystartfalse
+
+ \setpercentdimen\FOlistitemlabelleftskip {\XMLpar{fo:list-item-label}{start-indent}{0pt}}
+ \setpercentdimen\FOlistitembodyrightskip {\XMLpar{fo:list-item-body} {end-indent} {0pt}}
+
+ % maybe i need to implement something configurable
+
+ \ifFObodystart
+ \ifFOlabelend
+ \FOlistitemlabelrightskip\dimexpr(\localhsize-\FOlistitemlabelleftskip-\FOprodis+\FOprolab)
+ \FOlistitembodyleftskip\dimexpr(\FOlistitemlabelleftskip+\FOprodis)
+ \FOlistitemlabelhsize\dimexpr(\FOprodis-\FOprolab)
+ \else
+ \setpercentdimen\FOlistitemlabelrightskip{\XMLpar{fo:list-item-label}{end-indent}{0pt}}
+ \FOlistitemlabelhsize\dimexpr(\localhsize-\FOlistitemlabelleftskip-\FOlistitemlabelrightskip)
+ \FOlistitembodyleftskip\dimexpr(\FOlistitemlabelleftskip+\FOlistitemlabelhsize+\FOprolab)
+ \fi
+ \FOlistitemdistance \dimexpr(\FOprolab)
+ \else
+ \setpercentdimen\FOlistitembodyleftskip{\XMLpar{fo:list-item-body}{start-indent}{0pt}}
+ \ifFOlabelend
+ \FOlistitemlabelrightskip\dimexpr(\localhsize-\FOlistitembodyleftskip+\FOprolab)
+ \FOlistitemlabelhsize\dimexpr(\localhsize-\FOlistitemlabelleftskip-\FOlistitemlabelrightskip)
+ \FOlistitemdistance \dimexpr(\FOprolab)
+ \else
+ \setpercentdimen\FOlistitemlabelrightskip{\XMLpar{fo:list-item-label}{end-indent}{0pt}}
+ \FOlistitemlabelhsize\dimexpr(\localhsize-\FOlistitemlabelleftskip-\FOlistitemlabelrightskip)
+ \FOlistitemdistance \dimexpr(\FOlistitembodyleftskip-\FOlistitemlabelleftskip-\FOlistitemlabelhsize)
+ \fi
+ \fi
+
+ % is this fall back permitted ?
+
+ \ifzeropt\FOlistitemlabelleftskip \ifzeropt\FOlistitemlabelrightskip
+ \FOlistitembodyleftskip\FOprodis
+ \FOlistitemdistance\FOprolab
+ \FOlistitemlabelhsize\dimexpr(\FOlistitembodyleftskip-\FOlistitemdistance)
+ \fi \fi
+
+ %
+
+ \FOlistitembodyhsize\localhsize
+
+ \advance\FOlistitembodyhsize-\FOlistitembodyleftskip
+ \advance\FOlistitembodyhsize-\FOlistitembodyrightskip
+
+ \doifelse{\XMLpar{fo:list-item}{display-align}{}}{center}
+ {\directsetup{fo:list-item:display}}
+ {\directsetup{fo:list-item:text}}
+
+ \egroup
+
+\stopsetups
+
+% todo: textindent
+
+\startsetups fo:list-item:display
+
+ \endgraf
+
+ \advance\leftskip \FOlistitemlabelleftskip
+ \advance\rightskip\FOlistitembodyrightskip
+
+ \dontleavehmode \valign\bgroup\forgetall\vss##\vss\cr
+ \iftracingFO\ruledvtop\else\vbox\fi{\hsize\FOlistitemlabelhsize\directsetup{fo:list-item-label:setup}\XMLflush{fo:list-item-label}}\cr
+ \iftracingFO\ruledvtop\else\vbox\fi{\hsize\FOlistitembodyhsize \directsetup{fo:list-item-body:setup}\XMLflush{fo:list-item-body}}\cr
+ \egroup
+
+% \dontleavehmode \placesidebyside % or maybe paired boxes (legends)
+% {\ruledvtop{\forgetall\hsize\FOlistitemlabelhsize\XMLflush{fo:list-item-label}}}
+% {\ruledvtop{\forgetall\hsize\FOlistitembodyhsize \XMLflush{fo:list-item-body}}}
+
+ \endgraf
+
+\stopsetups
+
+\newtoks\savedeverypar \savedeverypar\everypar
+
+\startsetups fo:list-item:text
+
+ \everypar\savedeverypar % \appendtoksonce\insertparagraphintro\to\everypar % hack, binnen footnote ...
+
+ \advance\leftskip \FOlistitembodyleftskip
+ \advance\rightskip\FOlistitembodyrightskip
+
+ \setupparagraphintro[first][\directsetup{fo:list-item-label:process}]
+ \setupparagraphintro[next] [\begstrut\resetpenalties\clubpenalties]
+ \directsetup{fo:list-item-body:setup}
+ \XMLflush{fo:list-item-body}\endstrut
+
+\stopsetups
+
+\startsetups fo:list-item-label:setups
+
+ \edefXMLinhpar\xFOtextindent{fo:item-label}{text-indent}
+
+ \doifsomething\xFOtextindent
+ {\scratchdimen\hsize
+ \setpercentdimen\scratchdimen\xFOtextindent
+ \expanded{\setupindenting[\the\scratchdimen]}}
+
+\stopsetups
+
+\startsetups fo:list-item-body:setups
+
+ \edefXMLinh\xFOtextindent{fo:item-body}{text-indent}
+
+ \doifsomething\xFOtextindent
+ {\scratchdimen\hsize
+ \setpercentdimen\scratchdimen\xFOtextindent
+ \expanded{\setupindenting[\the\scratchdimen]}}
+
+\stopsetups
+
+\newbox\FOitembox
+
+\startsetups fo:list-item-label:process
+
+ \setbox \FOitembox \iftracingFO \ruledvtop \else \vtop \fi \bgroup
+ \forgetall
+ \postponenotes
+ \hsize\FOlistitemlabelhsize
+ \directsetup{fo:list-item-label:setup}
+ \XMLflush{fo:list-item-label}
+ \egroup
+ \getnoflines{\dimexpr(\ht\FOitembox+\dp\FOitembox)}
+ \setpenalties\clubpenalties\noflines\maxdimen
+ \strut\llap{\box\FOitembox\hskip\FOlistitemdistance}
+
+\stopsetups
+
+% \setlocalhsize \hsize\localhsize
+
+%D Element: fo:basic-link
+
+% \XMLattributeset{fo:aural},
+% keep-together=,
+% line-height=,
+
+\defineXMLenvironmentsave
+ [fo:basic-link]
+ [\XMLattributeset{fo:inherited},
+ id=,
+ \XMLattributeset{fo:accessibility},
+ \XMLattributeset{fo:border-padding-background},
+ \XMLattributeset{fo:margin-inline},
+ \XMLattributeset{fo:relative-position},
+ alignment-adjust=,
+ alignment-baseline=,
+ baseline-shift=,
+ destination-placement-offset=,
+ dominant-baseline=,
+ external-destination=,
+ indicate-destination=,
+ internal-destination=,
+ keep-with-next=,
+ keep-with-previous=,
+ show-destination=,
+ target-processing-context=,
+ target-presentation-context=,
+ target-stylesheet=]
+ {}
+ {\directsetup{fo:basic-link}}
+
+\startsetups fo:basic-link
+
+ \goto{\XMLflushself}[unknown]
+
+\stopsetups
+
+%D Element: fo:multi-switch fo:multi-case fo:multi-toggle fo:multi-properties fo:multi-property-set
+
+\defineXMLprocess[fo:multi-switch]
+\defineXMLprocess[fo:multi-case]
+\defineXMLprocess[fo:multi-toggle]
+\defineXMLprocess[fo:multi-properties]
+\defineXMLprocess[fo:multi-property-set]
+
+%D Element: fo:float
+
+\defineXMLenvironmentsave
+ [fo:float]
+ [\XMLattributeset{fo:inherited},
+ float=before,
+ clear=]
+ {}
+ {\directsetup{fo:float:process}}
+
+% clear: start end left right both none inherit
+% float: before start end left right none
+
+\mapXMLvalue {fo:float-position} {before} {here} % todo
+\mapXMLvalue {fo:float-position} {start} {here} % todo
+\mapXMLvalue {fo:float-position} {end} {here} % todo
+\mapXMLvalue {fo:float-position} {left} {left}
+\mapXMLvalue {fo:float-position} {right} {right}
+\mapXMLvalue {fo:float-position} {none} {here} % todo
+
+\startsetups fo:float:process
+
+ \placefigure
+ [\XMLval{fo:float-position}{\XMLop{float}},none]
+ {}
+ {\XMLflushself}
+
+\stopsetups
+
+%D Element: fo:footnote fo:footnote-body
+
+% Let's assume that 'whatever' contains the number or footnote marker.
+%
+% <fo:footnote>whatever<fo:footnote-body>note</fo:footnote-body></fo:footnote>
+
+% todo xsl-footnote area
+
+\defineXMLprocess
+ [fo:footnote]
+ [\XMLattributeset{fo:accessibility}]
+
+\defineXMLargument
+ [fo:footnote-body]
+ [\XMLattributeset{fo:accessibility}]
+ {\footnote[-]}
+
+%D Element: fo:wrapper
+
+\defineXMLenvironment % todo: all inheritable
+ [fo:wrapper]
+ [\XMLattributeset{fo:inherited},
+ \XMLattributeset{fe:tracing},
+ \XMLattributeset{fo:fonts},
+ \XMLattributeset{fo:hyphenation}]
+ {\beginXMLelement\begingroup\directsetup{fo:wrapper}}
+ {\endgroup\endXMLelement}
+
+\startsetups fo:wrapper
+
+ \directsetup{fe:setup}
+ \directsetup{fo:hyphenation:setup}
+ \directsetup{fo:font:setup}
+
+\stopsetups
+
+%D Element: fo:marker fo:retrieve-marker
+
+% In order to support 'retrieve-boundary' (page, page-sequence,
+% document) I need to extend the context mark handler.
+
+% This object will probably interfere with a too spacy layout since
+% it is unaware if its surrounding.
+
+\defineXMLenvironmentsave
+ [fo:marker]
+ [marker-class-name=unknown]
+ {}
+ {\directsetup{fo:marker:process}}
+
+\startsetups fo:marker:process
+
+ \doifelsemarking{fo:\XMLop{marker-class-name}}
+ {} {\definerawmarking[fo:\XMLop{marker-class-name}]}
+
+ \expanded{\marking[fo:\XMLop{marker-class-name}]{\XMLflushself}}
+
+\stopsetups
+
+\defineXMLcommand
+ [fo:retrieve-marker]
+ [retrieve-class-name=unknown,
+ retrieve-position=first-starting-within-page,
+ retrieve-boundary=]
+ {\directsetup{fo:retrieve-marker:process}}
+
+\mapXMLvalue {fo:marker-position} {first-starting-within-page} {first} % first mark
+\mapXMLvalue {fo:marker-position} {first-including-carryover} {previous} % top mark
+\mapXMLvalue {fo:marker-position} {last-starting-within-page} {first} % dunno
+\mapXMLvalue {fo:marker-position} {last-ending-within-page} {last} % bot mark
+
+\startsetups fo:retrieve-marker:process
+
+ \expanded{\getmarking
+ [fo:\XMLop{retrieve-class-name}]
+ [\XMLval{fo:marker-position}{\XMLop{retrieve-position}}{first}]}
+
+\stopsetups
+
+%D Auxiliary macros
+
+\unprotect
+
+\long\def\noFOchecks#1\od{}
+
+\def\FOassignskip#1#2#3%
+ {\edef\!!stringa{\XMLpar{#1}{#2}\empty}%
+ \edef\!!stringb{\XMLpar{#1}{#2.optimum}\empty}%
+ \edef\!!stringc{\XMLpar{#1}{#2.minimum}\empty}%
+ \edef\!!stringd{\XMLpar{#1}{#2.maximum}\empty}%
+ \dimen0=\ifx\!!stringa\empty\zeropoint\else\!!stringa\fi
+ \dimen2=\ifx\!!stringb\empty\dimen0 \else\!!stringb\fi
+ \dimen4=\dimexpr(\ifx\!!stringd\empty\dimen0 \else\!!stringd\fi-\dimen2)\relax
+ \dimen6=\dimexpr(\ifx\!!stringc\empty\dimen0 \else\!!stringc\fi-\dimen2)\relax
+ #3=\dimen2 \ifzeropt\dimen4 \else\!!plus\dimen4 \fi\ifzeropt\dimen6 \else\!!minus\dimen6 \fi\relax}
+
+\mapXMLvalue{fo:space:conditionality} {retain} {\let\next\retainedskip }
+\mapXMLvalue{fo:space:conditionality} {discard} {\let\next\discardedskip}
+\mapXMLvalue{fo:space:conditionality} {} {\let\next\discardedskip}
+
+\mapXMLvalue{fo:space:precedence} {force} {\let\next\forcedskip}
+
+\def\FOdoskip#1#2%
+ {\begingroup
+ \iftracingFO\showskips\fi
+ \FOassignskip{#1}{#2}\scratchskip
+ \XMLval{fo:space:conditionality}{\XMLpar{#1}{#2.conditionality}\empty}\empty
+ \XMLval{fo:space:precedence}{\XMLpar{#1}{#2.precedence}\empty}\empty
+ \ifdim\scratchskip=\zeropoint
+ \ifdim\gluestretch\scratchskip=\zeropoint
+ \ifdim\glueshrink\scratchskip=\zeropoint
+ \let\next\gobbleoneargument
+ \fi
+ \fi
+ \fi
+ \next\scratchskip
+ \endgroup}
+
+\def\doFObeforeskip#1{\FOdoskip{#1}{space-before}}
+\def\doFOafterskip #1{\FOdoskip{#1}{space-after}}
+
+\def\FOassignspace#1#2#3%
+ {\edef\!!stringa{\XMLpar{#1}{#2}\empty}%
+ \ifx\!!stringa\empty
+ #3=\zeropoint
+ \else
+ #3=1em% ?
+ \setpercentdimen#3\!!stringa
+ \fi
+ \relax}
+
+\def\FOdospace#1#2%
+ {\begingroup
+ \iftracingFO\showskips\fi
+ \FOassignspace{#1}{#2}\scratchskip
+ \ifdim\scratchskip=\zeropoint \else
+ \hskip\scratchskip
+ \fi
+ \endgroup}
+
+\def\doFOstartspace#1{\FOdospace{#1}{space-start}}
+\def\doFOendspace #1{\FOdospace{#1}{space-end}}
+
+\def\checkFOborder#1#2%
+ {\edef\FOattribute{\XMLpar{#1}{border-#2}\empty}%
+ \ifx\FOattribute\empty\else
+ \edef\FOtag{#1}%
+ \edef\FOatt{border-#2}%
+ \expanded{\docheckFOborder\FOattribute\space\relax\space\relax}\od
+ \fi}
+
+\def\docheckFOborder#1#2 #3%
+ {\ifx#1\relax
+ \expandafter\noFOchecks
+ \else
+ \doifhexcolorelse{#1#2}
+ {\setXMLpar\FOtag{\FOatt-color}{#1#2}}
+ {\doifelsenothing{\XMLval{fo:border-style}{#1#2}\empty}
+ {\doifcolorelse{#1#2}
+ {\setXMLpar\FOtag{\FOatt-color}{#1#2}}
+ {\setXMLpar\FOtag{\FOatt-width}{#1#2}}}
+ {\setXMLpar\FOtag{\FOatt-style}{#1#2}}}%
+ \expandafter\docheckFOborder
+ \fi#3}
+
+\def\checkFOposition#1#2%
+ {\edef\FOattribute{\XMLpar{#1}{#2-position}\empty}%
+ \ifx\FOattribute\empty\else
+ \edef\FOtag{#1}%
+ \edef\FOatt{#2-position}%
+ \scratchcounter\zerocount
+ \expanded{\docheckFOposition\FOattribute\space\relax\space\relax}\od
+ \fi}
+
+\def\docheckFOposition#1#2 #3%
+ {\ifx#1\relax
+ \expandafter\noFOchecks
+ \else
+ \advance\scratchcounter\plusone
+ \ifcase\scratchcounter
+ \or
+ \setXMLpar\FOtag{\FOatt-vertical}{#1#2}%
+ \or
+ \setXMLpar\FOtag{\FOatt-horizontal}{#1#2}%
+ \fi
+ \expandafter\docheckFOposition
+ \fi#3}
+
+\def\checkFOpadding{\def\FOatt{padding}\checkFOquadruple}
+\def\checkFOmargin {\def\FOatt{margin}\checkFOquadruple}
+
+\def\checkFOquadruple#1%
+ {\edef\FOattribute{\XMLpar{#1}\FOatt\empty}%
+ \ifx\FOattribute\empty\else
+ \edef\FOtag{#1}%
+ \scratchcounter\zerocount
+ \expanded{\docheckFOquadruple\FOattribute\space\relax\space\relax}\od
+ \ifcase\scratchcounter
+ \let\FOattributeT\FOattribute
+ \let\FOattributeR\FOattribute
+ \let\FOattributeB\FOattribute
+ \let\FOattributeL\FOattribute
+ \or % (tblr)
+ \let\FOattributeT\FOattribute
+ \let\FOattributeR\FOattribute
+ \let\FOattributeB\FOattribute
+ \let\FOattributeL\FOattribute
+ \or % (tb)(lr)
+ \let\FOattributeB\FOattributeT
+ \let\FOattributeL\FOattributeR
+ \or % (t)(lr)(b)
+ \let\FOattributeL\FOattributeR
+ \or % (t)(r)(b)(l)
+ % already ok
+ \fi
+ \letXMLpar\FOtag{\FOatt-top}\FOattributeT
+ \letXMLpar\FOtag{\FOatt-right}\FOattributeR
+ \letXMLpar\FOtag{\FOatt-bottom}\FOattributeB
+ \letXMLpar\FOtag{\FOatt-left}\FOattributeL
+ \fi}
+
+\def\docheckFOquadruple#1#2 #3%
+ {\ifx#1\relax
+ \expandafter\noFOchecks
+ \else
+ \advance\scratchcounter\plusone
+ \ifcase\scratchcounter
+ \or
+ \edef\FOattributeT{#1#2}%
+ \or
+ \edef\FOattributeR{#1#2}%
+ \or
+ \edef\FOattributeB{#1#2}%
+ \or
+ \edef\FOattributeL{#1#2}%
+ \fi
+ \expandafter\docheckFOquadruple
+ \fi#3}
+
+% \def\setFOimagename#1%
+% {\edef\FOimagename{#1}%
+% \aftersplitstring \FOimagename\at url('\to\xFOimagename
+% \ifx\xFOimagename\empty \else
+% \beforesplitstring\xFOimagename\at ')\to\FOimagename
+% \fi
+% \aftersplitstring \FOimagename\at url("\to\xFOimagename
+% \ifx\xFOimagename\empty \else
+% \beforesplitstring\xFOimagename\at ")\to\FOimagename
+% \fi}
+%
+% let's overkill:
+
+\def\setFOimagename#1%
+ {\analyzefunction{#1}%
+ \doifelse\functionname{url}
+ {\edef\FOimagename{\@EA\unstringed\functionA}}
+ {\ifx\functionname\empty
+ \def\FOimagename{#1}%
+ \else
+ \def\FOimagename{dummy}%
+ \fi}}
+
+% font
+
+\mapXMLvalue {fo:weight} {normal} {}
+\mapXMLvalue {fo:weight} {bold} {bold}
+\mapXMLvalue {fo:weight} {bolder} {bold}
+\mapXMLvalue {fo:weight} {lighter} {normal}
+\mapXMLvalue {fo:weight} {100} {normal}
+\mapXMLvalue {fo:weight} {200} {normal}
+\mapXMLvalue {fo:weight} {300} {normal}
+\mapXMLvalue {fo:weight} {400} {normal}
+\mapXMLvalue {fo:weight} {500} {normal}
+\mapXMLvalue {fo:weight} {600} {normal}
+\mapXMLvalue {fo:weight} {700} {normal}
+\mapXMLvalue {fo:weight} {800} {normal}
+\mapXMLvalue {fo:weight} {900} {normal}
+
+\mapXMLvalue {fo:variant} {normal} {}
+\mapXMLvalue {fo:variant} {small-caps} {small-caps}
+
+\mapXMLvalue {fo:style} {normal} {normal}
+\mapXMLvalue {fo:style} {italic} {italic}
+\mapXMLvalue {fo:style} {oblique} {oblique}
+\mapXMLvalue {fo:style} {backslant} {normal}
+
+% we can get crap like: 10pt/1.5 bold "Times Roman" ; i'm really puzzled why an
+% otherwise rather verbose coding occasionally packs attributes; a design flaw
+
+\newtoks\FOfonttoks
+
+\def\checkFOfontSS#1'{}
+\def\checkFOfontDD#1"{}
+\def\checkFOfontII#1 {}
+
+\bgroup
+\catcode`\'=\active
+\catcode`\"=\active
+\catcode`\/=\active
+\gdef\setcheckFOfontX
+ {\catcode`\'=\active
+ \catcode`\"=\active
+ \catcode`\/=\active
+ \def'##1'{\global\FOfonttoks\expandafter{\the\FOfonttoks\def\FOfontfamily{##1}}}%
+ \def"##1"{\global\FOfonttoks\expandafter{\the\FOfonttoks\def\FOfontfamily{##1}}}%
+ \def/##1 {}}% todo linespacing
+\gdef\setcheckFOfontXX
+ {\catcode`\'=\active
+ \catcode`\"=\active
+ \catcode`\/=\active
+ \def'##1'{}%
+ \def"##1"{}%
+ \def/##1 {}}% todo linespacing
+\egroup
+
+\globallet\xFOattribute\empty
+
+\def\checkFOfont#1%
+ {\FOfonttoks\emptytoks
+ \bgroup
+ \catcode`\\=\@@escape
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup
+% \catcode`\:=\@@letter
+% \catcode`\-=\@@letter
+ \setcheckFOfontX
+ \xdef\xFOattribute{#1 }%
+ \setbox\scratchbox\hbox{\scantokens\@EA{\xFOattribute}}%
+ \setcheckFOfontXX
+ \scantokens\@EA{\@EA\xdef\@EA\xFOattribute\@EA{\xFOattribute}}%
+ \egroup
+ \the\FOfonttoks
+ \ifx\xFOattribute\empty\else
+ \expanded{\docheckFOfont\xFOattribute\space\relax\space\relax}\od
+ \fi
+ \directsetup{fo:font:family:check}}
+
+\def\docheckFOfont#1#2 #3%
+ {\ifx#1\relax
+ \expandafter\noFOchecks
+ \else
+ \directsetup{fo:fonts:reset}%
+ \doifelsefontsynonym{#1#2}
+ {\def\FOfontfamily{#1#2}}
+ {\doifelsenothing{\XMLval{fo:weight}{#1#2}{}}
+ {\doifelsenothing{\XMLval{fo:variant}{#1#2}{}}
+ {\doifelsenothing{\XMLval{fo:style}{#1#2}{}}
+ {\setpercentdimen\dFOfontsize{#1#2}}
+ {\edef\FOfontstyle{\XMLval{fo:style}{#1#2}{}}}}
+ {\edef\FOfontvariant{\XMLval{fo:variant}{#1#2}{}}}}
+ {\edef\FOfontweight{\XMLval{fo:weight}{#1#2}{}}}}%
+ \expandafter\docheckFOfont
+ \fi#3}
+
+\protect
+
+\newtoks\FOreferences
+
+\def\setFOreference#1%
+ {\doifsomething{\XMLpar{#1}{id}{}}
+ {\expanded{\appendtoks
+ \noexpand\reference[\XMLpar{#1}{id}{}]{\XMLpar{fo:page-sequence}{format}{}}}%
+ \to\FOreferences}}
+
+\def\flushFOreferences
+ {\the\FOreferences
+ \global\FOreferences\emptytoks}
+
+\def\doFOreference#1%
+ {\doifsomething{\XMLpar{#1}{id}{}}
+ {\expanded{\reference[\XMLpar{#1}{id}{}]{\XMLpar{fo:page-sequence}{format}{}}}}}
+
+\appendtoks \flushFOreferences \to \everypar
+\appendtoks \flushFOreferences \to \neverypar % check !
+
+%D Graphics: static frames
+
+\startMPinclusions
+ input mp-fobg.mp ;
+\stopMPinclusions
+
+\def\unknownMPcolor{FoNoColor}
+
+% todo: combine into one en alleen tweede run, immers toch geen invloed; is
+% aangezien de referentiepunten vast liggen
+
+\def\FoRegionWidth#1%
+ {\XMLpav
+ {fo:border-width}
+ {fo:region-\MPvar{location}}
+ {border-#1-width}
+ {FoMedium}}
+
+\def\FoRegionStyle#1%
+ {\XMLpav
+ {fo:border-style}
+ {fo:region-\MPvar{location}}
+ {border-#1-style}
+ {FoNone}}
+
+\def\FoRegionColor#1%
+ {\MPcolor{\XMLpar
+ {fo:region-\MPvar{location}}
+ {border-#1-color}
+ {black}}}
+
+\def\FoRegionBackgroundColor
+ {\MPcolor{\XMLpar
+ {fo:region-\MPvar{location}}
+ {background-color}
+ {FoNoColor}}}
+
+% todo: when connected and same color : one draw
+
+\startuseMPgraphic{region-do}
+ FoBackgroundColor := \FoRegionBackgroundColor ;
+ FoLineColor[FoTop] := \FoRegionColor{top} ;
+ FoLineColor[FoBottom] := \FoRegionColor{bottom} ;
+ FoLineColor[FoLeft] := \FoRegionColor{left} ;
+ FoLineColor[FoRight] := \FoRegionColor{right} ;
+ FoLineStyle[FoTop] := \FoRegionStyle{top} ;
+ FoLineStyle[FoBottom] := \FoRegionStyle{bottom} ;
+ FoLineStyle[FoLeft] := \FoRegionStyle{left} ;
+ FoLineStyle[FoRight] := \FoRegionStyle{right} ;
+ FoLineWidth[FoTop] := \FoRegionWidth{top} ;
+ FoLineWidth[FoBottom] := \FoRegionWidth{bottom} ;
+ FoLineWidth[FoLeft] := \FoRegionWidth{left} ;
+ FoLineWidth[FoRight] := \FoRegionWidth{right} ;
+ if FoBackgroundColor <> FoNoColor :
+ fill OverlayBox
+ withcolor FoBackgroundColor ;
+ fi ;
+ path OverlayFrameBox ;
+ interim linecap := butt ;
+ OverlayFrameBox := OverlayBox
+ topenlarged -.5FoLineWidth[FoTop]
+ bottomenlarged -.5FoLineWidth[FoBottom]
+ leftenlarged -.5FoLineWidth[FoLeft]
+ rightenlarged -.5FoLineWidth[FoRight] ;
+ DrawFoFrame(FoTop, topboundary OverlayFrameBox) ;
+ DrawFoFrame(FoBottom, bottomboundary OverlayFrameBox) ;
+ DrawFoFrame(FoLeft, leftboundary OverlayFrameBox) ;
+ DrawFoFrame(FoRight, rightboundary OverlayFrameBox) ;
+\stopuseMPgraphic
+
+\startuseMPgraphic{region-body} \includeMPgraphic{region-do} \stopuseMPgraphic
+\startuseMPgraphic{region-before} \includeMPgraphic{region-do} \stopuseMPgraphic
+\startuseMPgraphic{region-after} \includeMPgraphic{region-do} \stopuseMPgraphic
+\startuseMPgraphic{region-start} \includeMPgraphic{region-do} \stopuseMPgraphic
+\startuseMPgraphic{region-end} \includeMPgraphic{region-do} \stopuseMPgraphic
+
+\startnotmode[fo-no-bg]
+
+\defineoverlay[region-body-graphic] [\useMPgraphic{region-body}{location=body}]
+\defineoverlay[region-before-graphic][\useMPgraphic{region-before}{location=before}]
+\defineoverlay[region-after-graphic] [\useMPgraphic{region-after}{location=after}]
+\defineoverlay[region-start-graphic] [\useMPgraphic{region-start}{location=start}]
+\defineoverlay[region-end-graphic] [\useMPgraphic{region-end}{location=end}]
+
+\stopnotmode
+
+% more efficient: todo: relocate and move to page background
+
+% \def\FoRegionWidth#1#2%
+% {\XMLpav
+% {fo:border-width}
+% {fo:region-#2}
+% {border-#1-width}
+% {FoMedium}}
+
+% \def\FoRegionStyle#1#2%
+% {\XMLpav
+% {fo:border-style}
+% {fo:region-#2}
+% {border-#1-style}
+% {FoNone}}
+
+% \def\FoRegionColor#1#2%
+% {\MPcolor{\XMLpar
+% {fo:region-#2}
+% {border-#1-color}
+% {black}}}
+
+% \def\FoRegionBackgroundColor#1%
+% {\MPcolor{\XMLpar
+% {fo:region-#1}
+% {background-color}
+% {FoNoColor}}}
+
+% \def\combinedFOgraphic#1%
+% {FoBackgroundColor := \FoRegionBackgroundColor{#1} ;
+% FoLineColor[FoTop] := \FoRegionColor{top}{#1} ;
+% FoLineColor[FoBottom] := \FoRegionColor{bottom}{#1} ;
+% FoLineColor[FoLeft] := \FoRegionColor{left}{#1} ;
+% FoLineColor[FoRight] := \FoRegionColor{right}{#1} ;
+% FoLineStyle[FoTop] := \FoRegionStyle{top}{#1} ;
+% FoLineStyle[FoBottom] := \FoRegionStyle{bottom}{#1} ;
+% FoLineStyle[FoLeft] := \FoRegionStyle{left}{#1} ;
+% FoLineStyle[FoRight] := \FoRegionStyle{right}{#1} ;
+% FoLineWidth[FoTop] := \FoRegionWidth{top}{#1} ;
+% FoLineWidth[FoBottom] := \FoRegionWidth{bottom}{#1} ;
+% FoLineWidth[FoLeft] := \FoRegionWidth{left}{#1} ;
+% FoLineWidth[FoRight] := \FoRegionWidth{right}{#1} ;
+% if FoBackgroundColor <> FoNoColor :
+% fill OverlayBox
+% withcolor FoBackgroundColor ;
+% fi ;
+% path OverlayFrameBox ;
+% interim linecap := butt ;
+% OverlayFrameBox := OverlayBox
+% topenlarged -.5FoLineWidth[FoTop]
+% bottomenlarged -.5FoLineWidth[FoBottom]
+% leftenlarged -.5FoLineWidth[FoLeft]
+% rightenlarged -.5FoLineWidth[FoRight] ;
+% DrawFoFrame(FoTop, topboundary OverlayFrameBox) ;
+% DrawFoFrame(FoBottom, bottomboundary OverlayFrameBox) ;
+% DrawFoFrame(FoLeft, leftboundary OverlayFrameBox) ;
+% DrawFoFrame(FoRight, rightboundary OverlayFrameBox) ;}
+
+% \startuseMPgraphic{region-body}
+% \combinedFOgraphic{before}
+% \combinedFOgraphic{body}
+% \combinedFOgraphic{after}
+% \combinedFOgraphic{start}
+% \combinedFOgraphic{end}
+% \stopuseMPgraphic
+
+% \defineoverlay[region-body-graphic] [\useMPgraphic{region-body}{location=body}]
+% \defineoverlay[region-before-graphic][]
+% \defineoverlay[region-after-graphic] []
+% \defineoverlay[region-start-graphic] []
+% \defineoverlay[region-end-graphic] []
+
+\stopXMLcompiling
+
+\endinput
+
+% we can follow two approaches: set the attributes global, using
+%
+% \defineXML...[tag][prefix][empty]
+%
+% in that case we trust the fo-file to be correct, i.e. the xslt style
+% sheets should not put attributes in the wrong places; however, we need
+% to do that with care, since for instance the attributes of some objects
+% (regions) are used mixed
+%
+% \defineXMLprocess [fo:root] [XMLFO] [test=unset]
+%
+% \defineXMLenvironment [fo:block-container] [XMLFO]
+% {\begingroup}
+% {\endgroup}
+%
+% \defineXMLenvironment [fo:block] [XMLFO]
+% {\begingroup\getXMLparameters[XMLFO]\begingroup}
+% {\endgroup\XMLFOtest\endgraf\endgroup}
+%
+% \startXMLdata
+% <fo:root>
+% <fo:block-container test='first'><fo:block test='second'>second:</fo:block></fo:block-container>
+% <fo:block>unset:</fo:block>
+% <fo:block test='outer'><fo:block test='nested'>nested:</fo:block>outer:</fo:block>
+% <fo:block test='last'>last:</fo:block>
+% </fo:root>
+% \stopXMLdata
+%
+% the other approach is to set the attributes explicitly for each
+% element, which is slower but more robust
+%
+% A mix is:
+%
+% \defineXMLenvironment
+% [fo:root]
+% [test=unset]
+% {\beginXMLelement}
+% {\endXMLelement}
+%
+% \defineXMLenvironment
+% [fo:block-container]
+% [test=\XMLpar\XMLpureparent{test}{}]
+% {\beginXMLelement}
+% {\endXMLelement}
+%
+% \defineXMLenvironment
+% [fo:block]
+% [test=\XMLpar\XMLpureparent{test}{}]
+% {\beginXMLelement
+% \begingroup}
+% {\endgroup
+% \XMLpar{fo:block}{test}{}
+% \endXMLelement}
+%
+% \startXMLdata
+% <fo:root>
+% <fo:block-container test='first'><fo:block test='second'>second:</fo:block></fo:block-container>
+% <fo:block>unset:</fo:block>
+% <fo:block test='outer'><fo:block test='nested'>nested:</fo:block>outer:</fo:block>
+% <fo:block test='last'>last:</fo:block>
+% </fo:root>
+% \stopXMLdata
diff --git a/tex/context/base/x-foxet.mkii b/tex/context/base/x-foxet.mkii
new file mode 100644
index 000000000..0f8e43af9
--- /dev/null
+++ b/tex/context/base/x-foxet.mkii
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=x-foxet,
+%D version=2004.03.12, % based on earlier experiments
+%D title=\FOXET,
+%D subtitle=Formatting Objects,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module is just a shortcut for:
+
+% fo = basic formatting objects
+% fe = basic formatting extensions
+% fx = extra formatting objects
+% fu = user formatting objects
+% fs = setup
+
+\usemodule[fo,fe,fx,fu,fs,mathml]
+
+\usemodule[fp] % passivetex bonus
+
+% \autoXMLnamespace[mml,mm,mathml]
+
+\endinput
diff --git a/tex/context/base/x-foxet.mkiv b/tex/context/base/x-foxet.mkiv
new file mode 100644
index 000000000..b27969721
--- /dev/null
+++ b/tex/context/base/x-foxet.mkiv
@@ -0,0 +1,29 @@
+%D \module
+%D [ file=x-foxet,
+%D version=2004.03.12, % based on earlier experiments
+%D title=\FOXET,
+%D subtitle=Formatting Objects,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Nota bene: I will reimplement formatting object in proper
+%D \MKIV\ code.
+
+\writestatus{foxet}{the mkiv variant is under construction}
+
+%D This module is just a shortcut for:
+
+% fo = basic formatting objects
+% fe = basic formatting extensions
+% fx = extra formatting objects
+% fu = user formatting objects
+% fs = setup
+
+% \usemodule[fo,fe,fx,fu,fs,mathml]
+
+\endinput
diff --git a/tex/context/base/x-ldx.ctx b/tex/context/base/x-ldx.ctx
new file mode 100644
index 000000000..0dddc9734
--- /dev/null
+++ b/tex/context/base/x-ldx.ctx
@@ -0,0 +1,23 @@
+<?xml version='1.0' standalone='yes'?>
+
+<ctx:job>
+ <ctx:message>Lua Documentation Generator</ctx:message>
+ <ctx:preprocess>
+ <ctx:processors>
+ <ctx:processor name='ldx'>mtxrun --internal x-ldx.lua <ctx:value name='old'/> <ctx:value name='new'/></ctx:processor>
+ </ctx:processors>
+ <ctx:files>
+ <ctx:file processor='ldx'><ctx:value name='old'/></ctx:file>
+ </ctx:files>
+ </ctx:preprocess>
+ <ctx:flags>
+ <ctx:flag>purge</ctx:flag>
+ <ctx:flag>forcexml</ctx:flag>
+ </ctx:flags>
+ <ctx:process>
+ <ctx:resources>
+ <ctx:module>ldx</ctx:module>
+ </ctx:resources>
+ </ctx:process>
+</ctx:job>
+
diff --git a/tex/context/base/x-ldx.tex b/tex/context/base/x-ldx.tex
new file mode 100644
index 000000000..398ca2345
--- /dev/null
+++ b/tex/context/base/x-ldx.tex
@@ -0,0 +1,191 @@
+\doifnotmode{mkiv}{\endinput}
+
+\setupxml[method=mkiv,default=hidden]
+
+\usemodule[x][mathml]
+
+\xmlregisterdocumentsetup{ldx}{xml:mml:define}
+\xmlregisterdocumentsetup{ldx}{xml:ldx:define}
+
+\xmlregisterns{ldx}{ldx}
+
+\startxmlsetups xml:ldx:define
+% \xmlgrab {\xmldocument} {ldx:*} {*}
+ \xmlsetsetup {#1} {ldx:*} {ldx:*}
+\stopxmlsetups
+
+% % %
+
+\startxmlsetups ldx:p
+ \xmlflush{#1}\par
+\stopxmlsetups
+
+\startxmlsetups ldx:source
+ \source{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups ldx:key
+ \dontleavehmode{\bf\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups ldx:variable
+ \xmlflush{#1}
+% \expanded{\variable{\xmlflush{#1}}}
+\stopxmlsetups
+
+\startxmlsetups ldx:function
+ \dontleavehmode{\bf function}\space\xmlflush{#1}
+% \expanded{\function{\xmlflush{#1}}}
+\stopxmlsetups
+
+\startxmlsetups ldx:com
+ \dontleavehmode{\tt--\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups ldx:document
+ \page
+ \xmlflush{#1}
+ \determineregistercharacteristics[function]
+ \startmode[*register]
+ \testpage[4]
+ \extra{Functions}
+ \placeregister[function]
+ \stopmode
+ \determineregistercharacteristics[variable]
+ \startmode[*register]
+ \testpage[4]
+ \extra{Variables}
+ \placeregister[variable]
+ \stopmode
+\stopxmlsetups
+
+\newcounter\CommentCounter
+
+\startxmlsetups ldx:comment
+ \blank
+ \doglobal\increment\CommentCounter
+ \margintitle{\bf\CommentCounter}
+ \xmlflush{#1}
+ \blank
+\stopxmlsetups
+
+\startxmlsetups ldx:dqs
+ \dontleavehmode\bgroup\tt"\xmlflush{#1}"\egroup
+\stopxmlsetups
+
+\startxmlsetups ldx:sqs
+ \dontleavehmode\bgroup\tt'\xmlflush{#1}'\egroup
+\stopxmlsetups
+
+\startxmlsetups ldx:code
+ \startpacked
+ \xmlflush{#1}\relax
+ \stoppacked
+\stopxmlsetups
+
+\startxmlsetups ldx:lines
+ \startpacked
+ \xmlflush{#1}
+ \stoppacked
+\stopxmlsetups
+
+\startxmlsetups ldx:line
+ \doifelsenothing {\xmlflush{#1}} {
+ \xmlflush{#1}\crlf
+ } {
+ \dontleavehmode \hbox to \hsize \bgroup
+ \strut
+ \hskip.25\dimexpr\xmlattdef{#1}{n}{0}em\relax\relax % extra relax needed !
+ \doif {\xmlatt{#1}{comment}} {yes} {\tt}
+ \xmlflush{#1}
+ \hss
+ \egroup
+ \endgraf
+ }
+\stopxmlsetups
+
+\startxmlsetups ldx:logo
+ \uppercasestring\xmlatt{#1}{label}\xmlatt{#1}{name}\to\ascii
+ \ifx\ascii\empty\else\getvalue{\ascii}\fi
+\stopxmlsetups
+
+\startxmlsetups ldx:l
+ \uppercasestring\xmlatt{#1}{l}\xmlatt{#1}{n}\to\ascii
+ \ifx\ascii\empty\else\getvalue{\ascii}\fi
+\stopxmlsetups
+
+\startxmlsetups ldx:typing
+ \blank
+ \startpacked \tt
+ \xmlverbatim{#1}
+ \stoppacked
+ \blank
+\stopxmlsetups
+
+\startxmlsetups ldx:type
+ \dontleavehmode{\tt\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups ldx:t
+ \dontleavehmode{\tt\xmlflush{#1}}
+\stopxmlsetups
+
+%
+
+\def\xmldocument{ldx}
+
+\usemodule[abr-02]
+
+% key -> kw
+% dqs -> dq
+% sqs -> sq
+% line -> ln
+% code -> cd
+% comment -> tx (text)
+
+\definetypeface[mainfacenormal] [ss][sans] [iwona] [default]
+\definetypeface[mainfacenormal] [rm][serif][palatino] [default]
+\definetypeface[mainfacenormal] [tt][mono] [modern] [default][rscale=1] % 1.1
+\definetypeface[mainfacenormal] [mm][math] [iwona] [default][encoding=default]
+
+\definetypeface[mainfacemedium] [ss][sans] [iwona-medium][default]
+\definetypeface[mainfacenormal] [rm][serif][palatino] [default]
+\definetypeface[mainfacemedium] [tt][mono] [modern] [default][rscale=1] % 1.1
+\definetypeface[mainfacemedium] [mm][math] [iwona-medium][default][encoding=default]
+
+\definetypeface[mainfacenarrowtt][tt][mono] [modern-cond] [default][rscale=1] % 1.1
+
+\setupbodyfont
+ [mainfacenormal,11pt]
+
+\setupwhitespace
+ [big]
+
+\defineregister[function][functions]
+\defineregister[variable][variables]
+
+\definehead[source][subject]
+\definehead[extra] [subsubject]
+\definehead[topic] [subsubsubject]
+
+\setuphead
+ [source]
+ [style=\bfb]
+
+\setuphead
+ [extra]
+ [style=\bfa]
+
+\setuphead
+ [topic]
+ [style=\bf]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ backspace=2cm,
+ topspace=2cm]
+
+% \usemodule[inf-02]
+
+\endinput
diff --git a/tex/context/base/x-mathml.lua b/tex/context/base/x-mathml.lua
new file mode 100644
index 000000000..2ee3cd090
--- /dev/null
+++ b/tex/context/base/x-mathml.lua
@@ -0,0 +1,784 @@
+if not modules then modules = { } end modules ['x-mathml'] = {
+ version = 1.001,
+ comment = "companion to x-mathml.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type, next = type, next
+local utf = unicode.utf8
+local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local format, lower, find, gsub = string.format, string.lower, string.find, string.gsub
+local utfchar, utffind, utfgmatch, utfgsub = utf.char, utf.find, utf.gmatch, utf.gsub
+local xmlsprint, xmlcprint, xmltext, xmlcontent = xml.sprint, xml.cprint, xml.text, xml.content
+local lxmltext, get_id = lxml.text, lxml.get_id
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local lpegmatch = lpeg.match
+
+lxml.mml = lxml.mml or { }
+
+-- an alternative is to remap to private codes, where we can have
+-- different properties .. to be done; this will move and become
+-- generic
+
+-- todo: handle opening/closing mo's here ... presentation mml is such a mess ...
+
+local doublebar = utfchar(0x2016)
+
+local n_replacements = {
+-- [" "] = utfchar(0x2002), -- "&textspace;" -> tricky, no &; in mkiv
+ ["."] = "{.}",
+ [","] = "{,}",
+ [" "] = "",
+}
+
+local l_replacements = { -- in main table
+ ["|"] = "\\mmlleftdelimiter\\vert",
+ ["{"] = "\\mmlleftdelimiter\\lbrace",
+ ["("] = "\\mmlleftdelimiter(",
+ ["["] = "\\mmlleftdelimiter[",
+ ["<"] = "\\mmlleftdelimiter<",
+ [doublebar] = "\\mmlleftdelimiter\\Vert",
+}
+local r_replacements = { -- in main table
+ ["|"] = "\\mmlrightdelimiter\\vert",
+ ["}"] = "\\mmlrightdelimiter\\rbrace",
+ [")"] = "\\mmlrightdelimiter)",
+ ["]"] = "\\mmlrightdelimiter]",
+ [">"] = "\\mmlrightdelimiter>",
+ [doublebar] = "\\mmlrightdelimiter\\Vert",
+}
+
+local o_replacements = { -- in main table
+ ["@l"] = "\\mmlleftdelimiter.",
+ ["@r"] = "\\mmlrightdelimiter.",
+ ["{"] = "\\mmlleftdelimiter\\lbrace",
+ ["}"] = "\\mmlrightdelimiter\\rbrace",
+ ["|"] = "\\mmlleftorrightdelimiter\\vert",
+ [doublebar] = "\\mmlleftorrightdelimiter\\Vert",
+ ["("] = "\\mmlleftdelimiter(",
+ [")"] = "\\mmlrightdelimiter)",
+ ["["] = "\\mmlleftdelimiter[",
+ ["]"] = "\\mmlrightdelimiter]",
+ ["<"] = "\\mmlleftdelimiter<",
+ [">"] = "\\mmlrightdelimiter>",
+ ["#"] = "\\mmlchar{35}",
+ ["$"] = "\\mmlchar{36}", -- $
+ ["%"] = "\\mmlchar{37}",
+ ["&"] = "\\mmlchar{38}",
+ ["^"] = "\\mmlchar{94}{}", -- strange, sometimes luatex math sees the char instead of \char
+ ["_"] = "\\mmlchar{95}{}", -- so we need the {}
+ ["~"] = "\\mmlchar{126}",
+ [" "] = "",
+ ["°"] = "^\\circ", -- hack
+
+ [utfchar(0xF103C)] = "\\mmlleftdelimiter<",
+ [utfchar(0xF1026)] = "\\mmlchar{38}",
+ [utfchar(0xF103E)] = "\\mmlleftdelimiter>",
+
+}
+
+local i_replacements = {
+ ["sin"] = "\\mathopnolimits{sin}",
+ ["cos"] = "\\mathopnolimits{cos}",
+ ["abs"] = "\\mathopnolimits{abs}",
+ ["arg"] = "\\mathopnolimits{arg}",
+ ["codomain"] = "\\mathopnolimits{codomain}",
+ ["curl"] = "\\mathopnolimits{curl}",
+ ["determinant"] = "\\mathopnolimits{det}",
+ ["divergence"] = "\\mathopnolimits{div}",
+ ["domain"] = "\\mathopnolimits{domain}",
+ ["gcd"] = "\\mathopnolimits{gcd}",
+ ["grad"] = "\\mathopnolimits{grad}",
+ ["identity"] = "\\mathopnolimits{id}",
+ ["image"] = "\\mathopnolimits{image}",
+ ["lcm"] = "\\mathopnolimits{lcm}",
+ ["max"] = "\\mathopnolimits{max}",
+ ["median"] = "\\mathopnolimits{median}",
+ ["min"] = "\\mathopnolimits{min}",
+ ["mode"] = "\\mathopnolimits{mode}",
+ ["mod"] = "\\mathopnolimits{mod}",
+ ["polar"] = "\\mathopnolimits{Polar}",
+ ["exp"] = "\\mathopnolimits{exp}",
+ ["ln"] = "\\mathopnolimits{ln}",
+ ["log"] = "\\mathopnolimits{log}",
+ ["sin"] = "\\mathopnolimits{sin}",
+ ["arcsin"] = "\\mathopnolimits{arcsin}",
+ ["sinh"] = "\\mathopnolimits{sinh}",
+ ["arcsinh"] = "\\mathopnolimits{arcsinh}",
+ ["cos"] = "\\mathopnolimits{cos}",
+ ["arccos"] = "\\mathopnolimits{arccos}",
+ ["cosh"] = "\\mathopnolimits{cosh}",
+ ["arccosh"] = "\\mathopnolimits{arccosh}",
+ ["tan"] = "\\mathopnolimits{tan}",
+ ["arctan"] = "\\mathopnolimits{arctan}",
+ ["tanh"] = "\\mathopnolimits{tanh}",
+ ["arctanh"] = "\\mathopnolimits{arctanh}",
+ ["cot"] = "\\mathopnolimits{cot}",
+ ["arccot"] = "\\mathopnolimits{arccot}",
+ ["coth"] = "\\mathopnolimits{coth}",
+ ["arccoth"] = "\\mathopnolimits{arccoth}",
+ ["csc"] = "\\mathopnolimits{csc}",
+ ["arccsc"] = "\\mathopnolimits{arccsc}",
+ ["csch"] = "\\mathopnolimits{csch}",
+ ["arccsch"] = "\\mathopnolimits{arccsch}",
+ ["sec"] = "\\mathopnolimits{sec}",
+ ["arcsec"] = "\\mathopnolimits{arcsec}",
+ ["sech"] = "\\mathopnolimits{sech}",
+ ["arcsech"] = "\\mathopnolimits{arcsech}",
+ [" "] = "",
+
+ ["false"] = "{\\mr false}",
+ ["notanumber"] = "{\\mr NaN}",
+ ["otherwise"] = "{\\mr otherwise}",
+ ["true"] = "{\\mr true}",
+ ["declare"] = "{\\mr declare}",
+ ["as"] = "{\\mr as}",
+}
+
+local csymbols = {
+ arith1 = {
+ lcm = "lcm",
+ big_lcm = "lcm",
+ gcd = "gcd",
+ big_gcd = "big_gcd",
+ plus = "plus",
+ unary_minus = "minus",
+ minus = "minus",
+ times = "times",
+ divide = "divide",
+ power = "power",
+ abs = "abs",
+ root = "root",
+ sum = "sum",
+ product ="product",
+ },
+ fns = {
+ domain = "domain",
+ range = "codomain",
+ image = "image",
+ identity = "ident",
+--~ left_inverse = "",
+--~ right_inverse = "",
+ inverse = "inverse",
+ left_compose = "compose",
+ lambda = "labmda",
+ },
+ linalg1 = {
+ vectorproduct = "vectorproduct",
+ scalarproduct = "scalarproduct",
+ outerproduct = "outerproduct",
+ transpose = "transpose",
+ determinant = "determinant",
+ vector_selector = "selector",
+--~ matrix_selector = "matrix_selector",
+ },
+ logic1 = {
+ equivalent = "equivalent",
+ ["not"] = "not",
+ ["and"] = "and",
+--~ big_and = "",
+ ["xor"] = "xor",
+--~ big_xor = "",
+ ["or"] = "or",
+--~ big-or= "",
+ implies = "implies",
+ ["true"] = "true",
+ ["false"] = "false",
+ },
+ nums1 = {
+--~ based_integer = "based_integer"
+ rational = "rational",
+ inifinity = "infinity",
+ e = "expenonentiale",
+ i ="imaginaryi",
+ pi = "pi",
+ gamma = "gamma",
+ NaN, "NaN",
+ },
+ relation1 = {
+ eq = "eq",
+ lt = "lt",
+ gt = "gt",
+ neq = "neq",
+ leq = "leq",
+ geq = "geq",
+ approx = "approx",
+ },
+ set1 = {
+ cartesian_product = "cartesianproduct",
+ empty_set = "emptyset",
+ map = "map",
+ size = "card",
+--~ suchthat = "suchthat",
+ set = "set",
+ intersect = "intersect",
+--~ big_intersect = "",
+ union = "union",
+--~ big_union = "",
+ setdiff = "setdiff",
+ subset = "subset",
+ ["in"] = "in",
+ notin = "notin",
+ prsubset = "prsubset",
+ notsubset = "notsubset",
+ notprsubset = "notprsubset",
+ },
+ veccalc1 = {
+ divergence = "divergence",
+ grad = "grad",
+ curl = "curl",
+ Laplacian = "laplacian",
+ },
+ calculus1 = {
+ diff = "diff",
+--~ nthdiff = "",
+ partialdiff = "partialdiff",
+ int = "int",
+--~ defint = "defint",
+ },
+ integer1 = {
+ factorof = "factorof",
+ factorial = "factorial",
+ quotient = "quotient",
+ remainder = "rem",
+ },
+ linalg2 = {
+ vector = "vector",
+ matrix = "matrix",
+ matrixrow = "matrixrow",
+ },
+ mathmkeys = {
+--~ equiv = "",
+--~ contentequiv = "",
+--~ contentequiv_strict = "",
+ },
+ rounding1 = {
+ ceiling = "ceiling",
+ floor = "floor",
+--~ trunc = "trunc",
+--~ round = "round",
+ },
+ setname1 = {
+ P = "primes",
+ N = "naturalnumbers",
+ Z = "integers",
+ rationals = "rationals",
+ R = "reals",
+ complexes = "complexes",
+ },
+ complex1 = {
+--~ complex_cartesian = "complex_cartesian", -- ci ?
+ real = "real",
+ imaginary = "imaginary",
+--~ complex_polar = "complex_polar", -- ci ?
+ argument = "arg",
+ conjugate = "conjugate",
+ },
+ interval1 = { -- not an apply
+--~ "integer_interval" = "integer_interval",
+ interval = "interval",
+ interval_oo = { tag = "interval", closure = "open" },
+ interval_cc = { tag = "interval", closure = "closed" },
+ interval_oc = { tag = "interval", closure = "open-closed" },
+ interval_co = { tag = "interval", closure = "closed-open" },
+ },
+ linalg3 = {
+--~ vector = "vector.column",
+--~ matrixcolumn = "matrixcolumn",
+--~ matrix = "matrix.column",
+ },
+ minmax1 = {
+ min = "min",
+--~ big_min = "",
+ max = "max",
+--~ big_max = "",
+ },
+ piece1 = {
+ piecewise = "piecewise",
+ piece = "piece",
+ otherwise = "otherwise",
+ },
+ error1 = {
+--~ unhandled_symbol = "",
+--~ unexpected_symbol = "",
+--~ unsupported_CD = "",
+ },
+ limit1 = {
+--~ limit = "limit",
+--~ both_sides = "both_sides",
+--~ above = "above",
+--~ below = "below",
+--~ null = "null",
+ tendsto = "tendsto",
+ },
+ list1 = {
+--~ map = "",
+--~ suchthat = "",
+--~ list = "list",
+ },
+ multiset1 = {
+ size = { tag = "card", type="multiset" },
+ cartesian_product = { tag = "cartesianproduct", type="multiset" },
+ empty_set = { tag = "emptyset", type="multiset" },
+--~ multi_set = { tag = "multiset", type="multiset" },
+ intersect = { tag = "intersect", type="multiset" },
+--~ big_intersect = "",
+ union = { tag = "union", type="multiset" },
+--~ big_union = "",
+ setdiff = { tag = "setdiff", type="multiset" },
+ subset = { tag = "subset", type="multiset" },
+ ["in"] = { tag = "in", type="multiset" },
+ notin = { tag = "notin", type="multiset" },
+ prsubset = { tag = "prsubset", type="multiset" },
+ notsubset = { tag = "notsubset", type="multiset" },
+ notprsubset = { tag = "notprsubset", type="multiset" },
+ },
+ quant1 = {
+ forall = "forall",
+ exists = "exists",
+ },
+ s_dist = {
+--~ mean = "mean.dist",
+--~ sdev = "sdev.dist",
+--~ variance = "variance.dist",
+--~ moment = "moment.dist",
+ },
+ s_data = {
+ mean = "mean",
+ sdev = "sdev",
+ variance = "vriance",
+ mode = "mode",
+ median = "median",
+ moment = "moment",
+ },
+ transc1 = {
+ log = "log",
+ ln = "ln",
+ exp = "exp",
+ sin = "sin",
+ cos = "cos",
+ tan = "tan",
+ sec = "sec",
+ csc = "csc",
+ cot = "cot",
+ sinh = "sinh",
+ cosh = "cosh",
+ tanh = "tanh",
+ sech = "sech",
+ csch = "cscs",
+ coth = "coth",
+ arcsin = "arcsin",
+ arccos = "arccos",
+ arctan = "arctan",
+ arcsec = "arcsec",
+ arcscs = "arccsc",
+ arccot = "arccot",
+ arcsinh = "arcsinh",
+ arccosh = "arccosh",
+ arctanh = "arstanh",
+ arcsech = "arcsech",
+ arccsch = "arccsch",
+ arccoth = "arccoth",
+ },
+}
+
+function xml.functions.remapmmlcsymbol(e)
+ local at = e.at
+ local cd = at.cd
+ if cd then
+ cd = csymbols[cd]
+ if cd then
+ local tx = e.dt[1]
+ if tx and tx ~= "" then
+ local tg = cd[tx]
+ if tg then
+ at.cd = nil
+ at.cdbase = nil
+ e.dt = { }
+ if type(tg) == "table" then
+ for k, v in next, tg do
+ if k == "tag" then
+ e.tg = v
+ else
+ at[k] = v
+ end
+ end
+ else
+ e.tg = tg
+ end
+ end
+ end
+ end
+ end
+end
+
+function xml.functions.remapmmlbind(e)
+ e.tg = "apply"
+end
+
+function xml.functions.remapopenmath(e)
+ local tg = e.tg
+ if tg == "OMOBJ" then
+ e.tg = "math"
+ elseif tg == "OMA" then
+ e.tg = "apply"
+ elseif tg == "OMB" then
+ e.tg = "apply"
+ elseif tg == "OMS" then
+ local at = e.at
+ e.tg = "csymbol"
+ e.dt = { at.name or "unknown" }
+ at.name = nil
+ elseif tg == "OMV" then
+ local at = e.at
+ e.tg = "ci"
+ e.dt = { at.name or "unknown" }
+ at.name = nil
+ elseif tg == "OMI" then
+ e.tg = "ci"
+ end
+ e.rn = "mml"
+end
+
+function lxml.mml.checked_operator(str)
+ texsprint(ctxcatcodes,(utfgsub(str,".",o_replacements)))
+end
+
+function lxml.mml.stripped(str)
+ tex.sprint(ctxcatcodes,str:strip())
+end
+
+function table.keys_as_string(t)
+ local k = { }
+ for k,_ in next, t do
+ k[#k+1] = k
+ end
+ return concat(k,"")
+end
+
+--~ local leftdelimiters = "[" .. table.keys_as_string(l_replacements) .. "]"
+--~ local rightdelimiters = "[" .. table.keys_as_string(r_replacements) .. "]"
+
+function characters.remapentity(chr,slot)
+ texsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr))
+end
+
+function lxml.mml.mn(id,pattern)
+ -- maybe at some point we need to interpret the number, but
+ -- currently we assume an upright font
+ local str = xmlcontent(get_id(id)) or ""
+ str = gsub(str,"(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen)
+ texsprint(ctxcatcodes,(gsub(str,".",n_replacements)))
+end
+
+function lxml.mml.mo(id)
+ local str = xmlcontent(get_id(id)) or ""
+ texsprint(ctxcatcodes,(utfgsub(str,".",o_replacements)))
+end
+
+function lxml.mml.mi(id)
+ local str = xmlcontent(get_id(id)) or ""
+ -- str = gsub(str,"^%s*(.-)%s*$","%1")
+ local rep = i_replacements[str]
+ if rep then
+ texsprint(ctxcatcodes,rep)
+ else
+ texsprint(ctxcatcodes,(gsub(str,".",i_replacements)))
+ end
+end
+
+function lxml.mml.mfenced(id) -- multiple separators
+ id = get_id(id)
+ local left, right, separators = id.at.open or "(", id.at.close or ")", id.at.separators or ","
+ local l, r = l_replacements[left], r_replacements[right]
+ texsprint(ctxcatcodes,"\\enabledelimiter")
+ if l then
+ texsprint(ctxcatcodes,l_replacements[left] or o_replacements[left] or "")
+ else
+ texsprint(ctxcatcodes,o_replacements["@l"])
+ texsprint(ctxcatcodes,left)
+ end
+ texsprint(ctxcatcodes,"\\disabledelimiter")
+ local collected = lxml.filter(id,"/*") -- check the *
+ if collected then
+ local n = #collected
+ if n == 0 then
+ -- skip
+ elseif n == 1 then
+ xmlsprint(collected[1]) -- to be checked
+--~ lxml.all(id,"/*")
+ else
+ local t = { }
+ for s in utfgmatch(separators,"[^%s]") do
+ t[#t+1] = s
+ end
+ for i=1,n do
+ xmlsprint(collected[i]) -- to be checked
+ if i < n then
+ local m = t[i] or t[#t] or ""
+ if m == "|" then
+ m = "\\enabledelimiter\\middle|\\relax\\disabledelimiter"
+ elseif m == doublebar then
+ m = "\\enabledelimiter\\middle|\\relax\\disabledelimiter"
+ elseif m == "{" then
+ m = "\\{"
+ elseif m == "}" then
+ m = "\\}"
+ end
+ texsprint(ctxcatcodes,m)
+ end
+ end
+ end
+ end
+ texsprint(ctxcatcodes,"\\enabledelimiter")
+ if r then
+ texsprint(ctxcatcodes,r_replacements[right] or o_replacements[right] or "")
+ else
+ texsprint(ctxcatcodes,right)
+ texsprint(ctxcatcodes,o_replacements["@r"])
+ end
+ texsprint(ctxcatcodes,"\\disabledelimiter")
+end
+
+local function flush(e,tag,toggle)
+ -- texsprint(ctxcatcodes,(toggle and "^{") or "_{")
+ if toggle then
+ texsprint(ctxcatcodes,"^{")
+ else
+ texsprint(ctxcatcodes,"_{")
+ end
+ if tag == "none" then
+ texsprint(ctxcatcodes,"{}")
+ else
+ xmlsprint(e.dt)
+ end
+ if not toggle then
+ texsprint(ctxcatcodes,"}")
+ else
+ texsprint(ctxcatcodes,"}{}")
+ end
+ return not toggle
+end
+
+function lxml.mml.mmultiscripts(id)
+ local done, toggle = false, false
+ for e in lxml.collected(id,"/*") do
+ local tag = e.tg
+ if tag == "mprescripts" then
+ texsprint(ctxcatcodes,"{}")
+ done = true
+ elseif done then
+ toggle = flush(e,tag,toggle)
+ end
+ end
+ local done, toggle = false, false
+ for e in lxml.collected(id,"/*") do
+ local tag = e.tg
+ if tag == "mprescripts" then
+ break
+ elseif done then
+ toggle = flush(e,tag,toggle)
+ else
+ xmlsprint(e.dt)
+ done = true
+ end
+ end
+end
+
+local columnalignments = {
+ left = "flushleft",
+ right = "flushright",
+ center = "middle",
+}
+
+local rowalignments = {
+ top = "high",
+ bottom = "low",
+ center = "lohi",
+ baseline = "top",
+ axis = "lohi",
+}
+
+local frametypes = {
+ none = "off",
+ solid = "on",
+ dashed = "on",
+}
+
+-- crazy element ... should be a proper structure instead of such a mess
+
+function lxml.mml.mcolumn(root)
+ root = get_id(root)
+ local matrix, numbers = { }, 0
+ local function collect(m,e)
+ local tag = e.tg
+ if tag == "mi" or tag == "mn" or tag == "mo" or tag == "mtext" then
+ local str = xmltext(e)
+ for s in utfcharacters(str) do -- utf.gmatch(str,".") btw, the gmatch was bugged
+ m[#m+1] = { tag, s }
+ end
+ if tag == "mn" then
+ local n = utf.len(str)
+ if n > numbers then
+ numbers = n
+ end
+ end
+ elseif tag == "mspace" or tag == "mline" then
+ local str = e.at.spacing or ""
+ for s in utfcharacters(str) do -- utf.gmatch(str,".") btw, the gmatch was bugged
+ m[#m+1] = { tag, s }
+ end
+ elseif tag == "mline" then
+ m[#m+1] = { tag, e }
+ end
+ end
+ for e in lxml.collected(root,"/*") do
+ local m = { }
+ matrix[#matrix+1] = m
+ if e.tg == "mrow" then
+ -- only one level
+ for e in lxml.collected(e,"/*") do
+ collect(m,e)
+ end
+ else
+ collect(m,e)
+ end
+ end
+ tex.sprint(ctxcatcodes,"\\halign\\bgroup\\hss$#$&$#$\\cr")
+ for i=1,#matrix do
+ local m = matrix[i]
+ local mline = true
+ for j=1,#m do
+ if m[j][1] ~= "mline" then
+ mline = false
+ break
+ end
+ end
+ if mline then
+ tex.sprint(ctxcatcodes,"\\noalign{\\obeydepth\\nointerlineskip}")
+ end
+ for j=1,#m do
+ local mm = m[j]
+ local tag, chr = mm[1], mm[2]
+ if tag == "mline" then
+--~ local n, p = true, true
+--~ for c=1,#matrix do
+--~ local mc = matrix[c][j]
+--~ if mc then
+--~ mc = mc[2]
+--~ if type(mc) ~= "string" then
+--~ n, p = false, false
+--~ break
+--~ elseif find(mc,"^[%d ]$") then -- rangecheck is faster
+--~ -- digit
+--~ elseif not find(mc,"^[%.%,]$") then -- rangecheck is faster
+--~ -- punctuation
+--~ else
+--~ n = false
+--~ break
+--~ end
+--~ end
+--~ end
+--~ if n then
+--~ chr = "\\mmlmcolumndigitrule"
+--~ elseif p then
+--~ chr = "\\mmlmcolumnpunctuationrule"
+--~ else
+--~ chr = "\\mmlmcolumnsymbolrule" -- should be widest char
+--~ end
+ chr = "\\hrulefill"
+ elseif tag == "mspace" then
+ chr = "\\mmlmcolumndigitspace" -- utfchar(0x2007)
+ end
+ if j == numbers + 1 then
+ tex.sprint(ctxcatcodes,"&")
+ end
+ local nchr = n_replacements[chr]
+ tex.sprint(ctxcatcodes,nchr or chr)
+ end
+ tex.sprint(ctxcatcodes,"\\crcr")
+ end
+ tex.sprint(ctxcatcodes,"\\egroup")
+end
+
+local spacesplitter = lpeg.Ct(lpeg.splitat(" "))
+
+function lxml.mml.mtable(root)
+ -- todo: align, rowspacing, columnspacing, rowlines, columnlines
+ root = get_id(root)
+ local at = root.at
+ local rowalign = at.rowalign
+ local columnalign = at.columnalign
+ local frame = at.frame
+ local rowaligns = rowalign and lpegmatch(spacesplitter,rowalign)
+ local columnaligns = columnalign and lpegmatch(spacesplitter,columnalign)
+ local frames = frame and lpegmatch(spacesplitter,frame)
+ local framespacing = at.framespacing or "0pt"
+ local framespacing = at.framespacing or "-\\ruledlinewidth" -- make this an option
+
+ texsprint(ctxcatcodes, format("\\bTABLE[frame=%s,offset=%s]",frametypes[frame or "none"] or "off",framespacing))
+--~ context.bTABLE { frame = frametypes[frame or "none"] or "off", offset = framespacing }
+ for e in lxml.collected(root,"/(mml:mtr|mml:mlabeledtr)") do
+ texsprint(ctxcatcodes,"\\bTR")
+--~ context.bTR()
+ local at = e.at
+ local col = 0
+ local rfr = at.frame or (frames and frames [#frames])
+ local rra = at.rowalign or (rowaligns and rowaligns [#rowaligns])
+ local rca = at.columnalign or (columnaligns and columnaligns[#columnaligns])
+ local ignorelabel = e.tg == "mlabeledtr"
+ for e in lxml.collected(e,"/mml:mtd") do -- nested we can use xml.collected
+ col = col + 1
+ if ignorelabel and col == 1 then
+ -- get rid of label, should happen at the document level
+ else
+ local at = e.at
+ local rowspan, columnspan = at.rowspan or 1, at.columnspan or 1
+ local cra = rowalignments [at.rowalign or (rowaligns and rowaligns [col]) or rra or "center"] or "lohi"
+ local cca = columnalignments[at.columnalign or (columnaligns and columnaligns[col]) or rca or "center"] or "middle"
+ local cfr = frametypes [at.frame or (frames and frames [col]) or rfr or "none" ] or "off"
+ texsprint(ctxcatcodes,format("\\bTD[align={%s,%s},frame=%s,nx=%s,ny=%s]$\\ignorespaces",cra,cca,cfr,columnspan,rowspan))
+--~ texfprint("\\bTD[align={%s,%s},frame=%s,nx=%s,ny=%s]$\\ignorespaces",cra,cca,cfr,columnspan,rowspan)
+--~ context.bTD { align = format("{%s,%s}",cra,cca), frame = cfr, nx = columnspan, ny = rowspan }
+--~ context.bmath()
+--~ context.ignorespaces()
+ xmlcprint(e)
+ texsprint(ctxcatcodes,"\\removeunwantedspaces$\\eTD") -- $
+--~ context.emath()
+--~ context.removeunwantedspaces()
+--~ context.eTD()
+ end
+ end
+--~ if e.tg == "mlabeledtr" then
+--~ texsprint(ctxcatcodes,"\\bTD")
+--~ xmlcprint(xml.first(e,"/!mml:mtd"))
+--~ texsprint(ctxcatcodes,"\\eTD")
+--~ end
+ texsprint(ctxcatcodes,"\\eTR")
+--~ context.eTR()
+ end
+ texsprint(ctxcatcodes, "\\eTABLE")
+--~ context.eTABLE()
+end
+
+function lxml.mml.csymbol(root)
+ root = get_id(root)
+ local at = root.at
+ local encoding = at.encoding or ""
+ local hash = url.hashed(lower(at.definitionUrl or ""))
+ local full = hash.original or ""
+ local base = hash.path or ""
+ local text = string.strip(lxmltext(root))
+--~ texsprint(ctxcatcodes,format("\\mmlapplycsymbol{%s}{%s}{%s}{%s}",full,base,encoding,text))
+ texsprint(ctxcatcodes,"\\mmlapplycsymbol{",full,"}{",base,"}{",encoding,"}{",text,"}")
+end
+
+function lxml.mml.menclosepattern(root)
+ root = get_id(root)
+ local a = root.at.notation
+ if a and a ~= "" then
+ texsprint("mml:enclose:",gsub(a," +",",mml:enclose:"))
+ end
+end
diff --git a/tex/context/base/x-mathml.mkii b/tex/context/base/x-mathml.mkii
new file mode 100644
index 000000000..101f65c5b
--- /dev/null
+++ b/tex/context/base/x-mathml.mkii
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=x-mathml,
+%D version=1999.12.20,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading \MATHML\ Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We have to make sure that some basic entities are
+%D loaded:
+
+\useXMLfilter[ent]
+
+%D Then we load the math:
+
+\useXMLfilter[mml,mmp,mmc]
+
+%D And we also load the whole bunch of entities:
+
+% \useXMLfilter[mea,meb,mec,meh,men,meo,mer]
+% \useXMLfilter[mxa,mxb,mxc,mxh,mxn,mxo,mxr]
+
+\endinput
diff --git a/tex/context/base/x-mathml.mkiv b/tex/context/base/x-mathml.mkiv
new file mode 100644
index 000000000..a5245c835
--- /dev/null
+++ b/tex/context/base/x-mathml.mkiv
@@ -0,0 +1,2369 @@
+%D \module
+%D [ file=x-mathml,
+%D version=2008.05.29,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading \MATHML\ Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \xmlfilter{#1}{/*/name()} -> \xmltag
+
+% This module is under construction and will be cleaned up.
+
+\writestatus{loading}{ConTeXt XML Macros / MathML Renderer}
+
+\unprotect
+
+\startmodule [mathml]
+
+\ctxloadluafile{x-mathml}{}
+
+\startxmlsetups xml:mml:define
+ \xmlsetsetup{\xmldocument} {(formula|subformula)} {mml:formula}
+ \xmlfilter {\xmldocument} {omt:*/function(remapopenmath)}
+ \xmlfilter {\xmldocument} {mml:bind/function(remapmmlbind)}
+ \xmlfilter {\xmldocument} {mml:csymbol/function(remapmmlcsymbol)}
+ \xmlsetsetup{\xmldocument} {mml:*} {mml:*}
+ \xmlsetsetup{\xmldocument} {mml:apply/mml:apply/mml:inverse/../../..} {mml:apply:inverse}
+ \xmlstrip {\xmldocument} {(mml:mi|mml:mo|mml:mn|mml:mtext|mml:csymbol)}
+\stopxmlsetups
+
+\xmlregisterns{omt}{openmath}
+\xmlregisterns{mml}{mathml}
+
+\xmlregistersetup{xml:mml:define}
+
+\unexpanded\def\setupMMLappearance[#1]{\dodoubleargument\getparameters[@@MML#1]}
+
+\def\MMLhack{\let\MMLpar\par \let\par\relax \everyvbox{\let\par\MMLpar}}
+
+\xmlmapvalue {mml:math:mode} {display} {\displaymathematics}
+\xmlmapvalue {mml:math:mode} {inline} {\inlinemathematics}
+
+\startxmlsetups mml:math
+ \xmlval{mml:math:mode}{\xmlatt{#1}{mode}}{\automathematics}{\MMLhack\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups mml:imath
+ \inlinemathematics{\MMLhack\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups mml:dmath
+ \displaymathematics{\MMLhack\xmlflush{#1}}
+\stopxmlsetups
+
+%D First we define some general formula elements.
+
+\startxmlsetups mml:formula
+ \edef\mmlformulalabel {\xmlatt{#1}{label}\xmlatt{#1}{id}}
+ \edef\mmlformulasublabel{\xmlatt{#1}{sublabel}\xmlatt{#1}{id}}
+ \doifsomething\mmlformulalabel{\placeformula[\mmlformulalabel]{\mmlformulasublabel}}
+ \startformula\MMLhack\xmlfirst{#1}{/mml:math}\stopformula
+\stopxmlsetups
+
+\setfalse\mmlignoredelimiter
+\settrue \mmlsomeleftdelimiter
+
+\def\MMLleftorright
+ {\ifconditional\mmlsomeleftdelimiter
+ \setfalse\mmlsomeleftdelimiter\expandafter\MMLleft
+ \else
+ \settrue \mmlsomeleftdelimiter\expandafter\MMLright
+ \fi}
+
+\ifx\MMLleft \undefined \let\MMLleft \firstofoneargument \fi
+\ifx\MMLright \undefined \let\MMLright \firstofoneargument \fi
+\ifx\MMLmiddle\undefined \let\MMLmiddle\firstofoneargument \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\mmlleftorrightdelimiter#1{\ifconditional\mmlignoredelimiter#1\else\normalordelimiter{#1}{\MMLleftorright#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
+%D some namespace limitations. Here we do it the \MKIV\ way.
+
+\def\widevec#1%
+ {\vbox{\mathsurround\zeropoint\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\nointerlineskip}%
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+
+%D The rendering macros:
+
+\def\MMLrm{\mr}
+
+\def\MMLseparator#1{\removeunwantedspaces{#1}\ignorespaces} % nils space after separator
+\def\MMLseparator#1{,} % todo, for europe we need to block the space
+
+%D Since I only had the draft of MathML 2 and later 3 as example of
+%D rendering, there are probably a lot of omissions and
+%D misinterpretations. At least I learned some bits and
+%D pieces of math rendering.
+%D
+%D The main complications were not so much the math, but to
+%D find the most efficient way to handle elements without
+%D spacing beging messed up. The first implementation was
+%D aimed at getting reasonable output, this second
+%D implementation is already better in terms of handling
+%D nesting, and I will definitely need a third one that has
+%D more efficient and less ugly code.
+%D
+%D The \TEX\ part is not that complicated and once the
+%D preprocessor was okay, the rest way just a lot of keying
+%D and testing. It all comes down to gobbling, redefining,
+%D and not so much to parsing.
+%D
+%D The second implementation expanded the whole math sequence
+%D into an internal \TEX\ representation. This is a rather clean
+%D and fast process. Filtering and testing takes place by
+%D redefining teh internal representation macros.
+%D
+%D The third implementation may look a bit more messy in some
+%D respects. This is because in \TEX\ it's not that trivial to
+%D implement a tree handler. We use a stack for the \type {apply}
+%D element and other sequential content. Occasionally we need to
+%D peek into child elements which involves messy code. This
+%D implementation is closer to the normal \XML\ handling in
+%D \CONTEXT.
+
+%D We start with the parent elements and the option handler.
+
+\def\xmlmathmldirective#1{\dosetvalue{MML#1}}
+
+%def\xmlmathmldirective#1#2#3{[#1][#2][#3]\dosetvalue{MML#1}{#2}{#3}}
+
+%D In the styles, options can be set with:
+
+\unexpanded\def\setupMMLappearance[#1]{\dodoubleargument\getparameters[MML#1]} % no @@ because passed to lua
+
+%D We will apply inner math to all bits and pieces made up by an
+%D \type {apply}.
+
+\def\MMLmathinner
+ {\ifinner \expandafter \firstofoneargument \else \expandafter \mathinner \fi}
+
+%D Auxiliary MathML macros: (to be generalized)
+
+\def\mmlfirst #1{\xmlelement{#1}{1}} % we can move these inline if needed
+\def\mmlsecond #1{\xmlelement{#1}{2}}
+\def\mmlthird #1{\xmlelement{#1}{3}}
+\def\mmlprelast#1{\xmlelement{#1}{-2}}
+\def\mmllast #1{\xmlelement{#1}{-1}}
+
+\starttexdefinition doifelsemmlfunction #1
+ \xmldoifelse {#1} {/mml:fn} {
+ \firstoftwoarguments
+ } {
+ \xmldoifelse {#1} {/mml:apply/mml:fn} {
+ \firstoftwoarguments
+ } {
+ \xmldoifelse {#1} {/mml:ci[@type=='fn']} {
+ \firstoftwoarguments
+ } {
+ \secondoftwoarguments
+ }
+ }
+ }
+\stoptexdefinition
+
+%D Special features:
+
+ \newtoks \@@postponedMMLactions \setfalse \somepostponedMMLactions
+
+ \def\postponeMMLactions#1%
+ {\global\settrue\somepostponedMMLactions
+ \global\@@postponedMMLactions\expandafter{\the\@@postponedMMLactions#1}}
+
+ \def\postponedMMLactions
+ {\global\setfalse\somepostponedMMLactions
+ \@EA\global\@EA\@@postponedMMLactions\@EA\emptytoks
+ \the\@@postponedMMLactions}
+
+%D A couple of lists:
+
+\convertargument
+ mml:times|mml:divide|mml:power|%
+ mml:lt|mml:gt|mml:eq|mml:leq|mml:geq|%
+ mml:in|mml:inverse|%
+ mml:fn|%
+ mml:floor|mml:ceiling|%
+ mml:mean|%
+ mml:selector|%
+ mml:abs|mml:int|mml:limit|mml:sum|mml:product|%
+ mml:outerproduct|mml:innerproduct|mml:scalarproduct%
+\to \MMLcmainresetlist
+
+\convertargument
+ mml:sin|mml:arcsin|mml:sinh|mml:arcsinh|%
+ mml:cos|mml:arccos|mml:cosh|mml:arccosh|%
+ mml:tan|mml:arctan|mml:tanh|mml:arctanh|%
+ mml:cot|mml:arccot|mml:coth|mml:arccoth|%
+ mml:csc|mml:arccsc|mml:csch|mml:arccsch|%
+ mml:sec|mml:arcsec|mml:sech|mml:arcsech|%
+ mml:ln|mml:exp|mml:log|%
+ mml:abs|mml:int|mml:limit|mml:sum|mml:product|%
+ mml:fn%
+\to \MMLcfunctionlist
+
+\convertargument
+ mml:sin|mml:arcsin|mml:sinh|mml:arcsinh|%
+ mml:cos|mml:arccos|mml:cosh|mml:arccosh|%
+ mml:tan|mml:arctan|mml:tanh|mml:arctanh|%
+ mml:cot|mml:arccot|mml:coth|mml:arccoth|%
+ mml:csc|mml:arccsc|mml:csch|mml:arccsch|%
+ mml:sec|mml:arcsec|mml:sech|mml:arcsech|%
+ mml:ln|mml:exp|mml:log|%
+ mml:abs%
+\to \MMLcpurefunctionlist
+
+\convertargument
+ mml:diff|mml:partialdiff|mml:root%
+\to \MMLcconstructlist
+
+%D We use inner and grouping (begin/end and no b/e) else we
+%D get problems with 1/2(1+2) and alike (todo: ask taco).
+%D
+%D The problem with apply is that we need to take care of
+%D several situations, like:
+%D
+%D \starttyping
+%D <apply> <.../> ...
+%D <apply> <fn> ...
+%D <apply> <apply> <ci> ...
+%D <apply> <apply> <fn> <ci> ...
+%D \stoptyping
+%D
+%D Because we translated version 2 of this renderer into
+%D version 3 the following definitions may be sub optimal or
+%D more complex than actually needed.
+
+% simple version
+
+\newcount\@MMLlevel \def\MMLcreset{\@MMLlevel\zerocount}
+
+\let\MMLctempresetlist\empty \def\setMMLcreset{\edef\MMLctempresetlist}
+
+\let\MMLdoL\donothing
+\let\MMLdoR\donothing
+
+\newcount\mmlapplydepth \def\MMLcreset{\mmlapplydepth\zerocount}
+
+\startxmlsetups mml:apply
+ \MMLmathinner {
+ \xmldoif {#1} {/(\MMLcmainresetlist\string|\MMLctempresetlist)} {
+ % \MMLcreset
+ }
+ \edef\mmlapplyopentoken {\xmlatt{#1}{open}}
+ \edef\mmlapplyclosetoken{\xmlatt{#1}{close}}
+ \ifcase\mmlapplydepth \else
+ \ifx\mmlapplyopentoken\empty
+ \def\mmlapplyopentoken {(}
+ \def\mmlapplyclosetoken{)}
+ \fi
+ \fi
+ \advance\mmlapplydepth\plusone
+ \begingroup
+ \ifx\mmlapplyopentoken\empty
+ \let\MMLdoL\donothing
+ \let\MMLdoR\donothing
+ \else
+ \edef\MMLdoL{\noexpand\left \mmlapplyopentoken }
+ \edef\MMLdoR{\noexpand\right\mmlapplyclosetoken}
+ \fi
+ \let\MMLctempresetlist\empty
+ \xmldoifelse {#1} {/mml:apply} {
+% % <apply> <apply> ... </apply> <ci> .. </ci> </apply>
+% \xmldoifelse {#1} {/mml:apply(mml:plus|mml:minus)} {% [a]
+% % yet incomplete and rather untested
+% % <apply> <apply> <minus/> <tan/> <cos/> </apply> <ci>x</ci> </apply>
+ } {% [b]
+% \MMLcreset
+ }
+% \MMLdoL
+% \mmlfirst{#1}
+% \ifconditional\somepostponedMMLactions
+% \postponedMMLactions
+% \else
+% \left(\MMLcreset\mmlsecond{#1}\right)
+% \fi
+% \MMLdoR
+% } {
+ \edef\mmlapplyaction{\xmlfilter{#1}{/*/name()}}
+ \doifsetupselse {mml:apply:\mmlapplyaction} {
+ \xmlsetup{#1}{mml:apply:\mmlapplyaction}
+ } {
+% \MMLdoL
+ \xmlsetup{#1}{\xmlfilter{#1}{/*/name()}}
+% \MMLdoR
+ }
+% }
+ \endgroup
+ \advance\mmlapplydepth\minusone
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:apply:mml:apply
+ \xmlflush{#1}
+ \xmlall{#1}{../[position()>1]}
+\stopxmlsetups
+
+\startxmlsetups mml:apply:mml:fn
+ \xmldoifelse {#1} {/mml:ci} {
+ \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}% replaces \XMLfnoperator
+ \doifsetupselse{mml:fn:\mmlfnci} { % was mmc:fn:...
+ \xmlsetup{#1}{mml:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
+ } {
+ \MMLcreset
+ \MMLdoL
+ \mmlfirst{#1}
+ \ifnum\xmlcount{#1}>\plusone
+ \negthinspace % not enough
+ \left(\MMLcreset\xmlconcatrange{#1}{/*}{2}{}{\MMLseparator,}\right)
+ \fi
+ \MMLdoR
+ }
+ } {
+ \MMLcreset
+ \MMLdoL
+ \xmlall{#1}{/*}
+ \MMLdoR
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:apply:mml:csymbol
+ \xmlsetup{#1}{mml:csymbol} % \MMLdoL/MMLdoR to be handled in plugin
+\stopxmlsetups
+
+\startxmlsetups mml:apply:mml:ci
+ \xmlfirst{#1}{/mml:ci}
+ \ifnum\xmlcount{#1}>\plusone
+ \left(\MMLcreset\xmlconcatrange{#1}{/*}{2}{}{\MMLseparator,}\right)
+ \fi
+\stopxmlsetups
+
+% reln
+
+\startxmlsetups mml:reln
+ \writestatus{XML}{MathML element "reln" is obsolete}
+\stopxmlsetups
+
+% fn
+
+\startxmlsetups mmc:fn:\utfchar{"00B1} % plusminus ±
+ \ifnum\xmlcount{#1}>\plustwo
+ \MMLcreset
+ \left(\xmlconcat{#1}{/*}{2}{}{\mmlfirst{#1}}\right)
+ \else
+ \mmlfirst{#1}
+ \fi
+\stopxmlsetups
+
+\startxmlsetups mmc:fn:\utfchar{"2213} % minusplus
+ \xmlsetup{#1}{mmc:fn:plusminus}
+\stopxmlsetups
+
+\startxmlsetups mmc:fn
+ \begingroup
+ \edef\mmlnoffn{\xmlcount{#1}}
+ \ifnum\mmlnoffn>\plustwo
+ \def\MMCfnleft {\left(}
+ \def\MMCfnright{\right)}
+ \else
+ \let\MMCfnleft \relax
+ \let\MMCfnright\relax
+ \fi
+ \xmldoifelse {#1} {/mml:ci} { % first
+ \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}% replaces \XMLfnoperator
+ \doifsetupselse{mml:fn:\mmlfnci} { % was mmc:fn:...
+ \xmlsetup{#1}{mml:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
+ } {
+ \MMLcreset
+ \getXMLstackdata\plusone
+ }
+ } {
+ \xmldoifelse {#1} {/mml:apply} { % first
+ \xmldoifelse {#1} {/(mml:plus\string|mml:minus)} {
+ \left(\mmlfirst{#1}\right)
+ } {
+ \mmlfirst{#1}
+ }
+ \ifnum\mmlnoffn>\plusone
+ \left(\xmlall{#1}{/!mml:apply}\right)
+ \fi
+ } {
+ \MMLcreset
+ \negthinspace
+ \MMCfnleft
+ \ifnum\mmlnoffn=\plustwo,\fi
+ \xmlconcat{#1}{/*}{2}{}{\MMLseparator,}
+ \MMCfnright
+ }
+ }
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mmc:fn:apply % where used?
+ \xmldoifelse {#1} {/mml:ci} { % first
+ \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}% replaces \XMLfnoperator
+ \doifsetupselse{mml:fn:\mmlfnci} { % was mmc:fn:...
+ \xmlsetup{#1}{mml:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
+ } {
+ \MMLcreset
+ \mmlfirst{#1}
+ \ifnum\xmlcount{#1}>\plusone
+ \negthinspace
+ \left(\MMLcreset\xmlconcat{#1}{2}{}{\MMLseparator,}\right)
+ \fi
+ }
+ } {
+ \endgroup
+ \MMLcreset
+ \mmlfirst{#1}
+ }
+\stopxmlsetups
+
+%D The next definition provide a kind of plug-in mechanism (see
+%D the open math extension module).
+
+% http://www.publishers.com/somename
+
+\starttexdefinition mmlapplycsymbol #1#2#3#4
+ % #1=full url, #2=name, #3=encoding, #4=text
+ \doifelse {#3} {text} {
+ {\mr #4}
+ } {
+ \doifsetupselse {mml:csymbol:#1} {
+ % full url
+ \directsetup{mml:csymbol:#1}
+ } {
+ % somename (fallback)
+ \doifsetupselse {mml:csymbol:#2} {
+ \directsetup{mml:csymbol:#2}
+ } {
+ \xmlval{mmc:cs}{#3}{}% todo
+ }
+ }
+ }
+\stoptexdefinition
+
+\startxmlsetups mml:csymbol
+ \ctxlua{lxml.mml.csymbol("#1")}
+\stopxmlsetups
+
+\startxmlsetups mml:csymbol:cdots
+ \cdots
+\stopxmlsetups
+
+% \startxmlsetups mml:csymbol:<url> \stopxmlsetups
+
+%D Alternative b will convert periods into comma's:
+%D
+%D \startbuffer
+%D \startXMLdata
+%D <imath><apply><cn>1.23</cn></apply></imath>
+%D <dmath><apply><cn>1.23</cn></apply></dmath>
+%D \stopXMLdata
+%D
+%D \type{\setupMMLappearance[cn] [alternative=b]}
+%D
+%D \startXMLdata
+%D <imath><apply><cn>1.23</cn></apply></imath>
+%D <dmath><apply><cn>1.23</cn></apply></dmath>
+%D \stopXMLdata
+%D \stopbuffer
+%D
+%D \start \typebuffer \getbuffer \stop
+
+\setupMMLappearance[cn] [\c!alternative=\v!a]
+\setupMMLappearance[polar] [\c!alternative=\v!a] % a|b|c
+\setupMMLappearance[float] [\c!symbol=\v!no] % \v!yes|dot
+\setupMMLappearance[enotation][\c!symbol=\v!no] % \v!yes|dot
+\setupMMLappearance[base] [\c!symbol=\v!numbers] % digits|characters|text|no
+
+\startxmlsetups mml:cs \xmlcommand{#1}{/}{mml:cs:\xmlattdef{#1}{type}{default}} \stopxmlsetups
+\startxmlsetups mml:ci \xmlcommand{#1}{/}{mml:ci:\xmlattdef{#1}{type}{default}} \stopxmlsetups
+\startxmlsetups mml:cn \xmlcommand{#1}{/}{mml:cn:\xmlattdef{#1}{type}{default}} \stopxmlsetups
+
+% helpers cn
+
+\startxmlsetups mml:cn:default
+ \mathopnolimits{\xmlflush{#1}}
+\stopxmlsetups
+
+% helpers ci
+
+\startxmlsetups mml:ci:default
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups mml:ci:set
+ {\blackboard{\xmlflush{#1}}} % todo
+\stopxmlsetups
+
+\startxmlsetups mml:ci:vector
+ \widevec{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups mml:ci:matrix
+ {\bi\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups mml:ci:function
+ \xmlflush{#1}% \negthinspace
+\stopxmlsetups
+
+\startxmlsetups mml:ci:fn
+ \xmlsetup{#1}{mml:ci:function}
+\stopxmlsetups
+
+\startxmlsetups mml:ci:complex-cartesian
+ \xmlsetup{#1}{mml:cn:complex}
+\stopxmlsetups
+
+\startxmlsetups mml:ci:complex
+ \xmlsetup{#1}{mml:cn:complex}
+\stopxmlsetups
+
+\startxmlsetups mml:ci:complex-polar
+ \xmlsetup{#1}{mml:cn:polar}
+\stopxmlsetups
+
+\startxmlsetups mml:ci:polar
+ \xmlsetup{#1}{mml:cn:polar}
+\stopxmlsetups
+
+% helpers ci
+
+\startxmlsetups mml:cn:default
+ \xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups mml:cn:integer
+ \edef\mmlintegerbase{\xmlattdef{#1}{base}{}}
+ \ifx\mmlintegerbase\empty
+ \xmlflush{#1}
+ \else
+ \doifelse \MMLbasesymbol \v!no {
+ \MMLcCNbasedata{\xmlflush{#1}}
+ } {
+ \MMLcCNbasedata{\xmlflush{#1}}_{
+ \hbox {$
+ \mr
+ \scriptscriptstyle
+ \processaction
+ [\MMLbasesymbol]
+ [\v!characters=>\MMLcCNbasestring BODH,
+ \v!text=>\MMLcCNbasestring{BIN}{OCT}{DEC}{HEX},
+ \s!unknown=>\mmlintegerbase]
+ $}
+ }
+ }
+ \fi
+\stopxmlsetups
+
+\def\MMLcCNbasedata#1%
+ {\ifnum\mmlintegerbase>10 \relax{\mr#1}\else#1\fi}
+
+\def\MMLcCNbasestring#1#2#3#4%
+ {\ifnum\mmlintegerbase= 2 #1\else
+ \ifnum\mmlintegerbase= 8 #2\else
+ \ifnum\mmlintegerbase=10 #3\else
+ \ifnum\mmlintegerbase=16 #4\else
+ \mmlintegerbase \fi\fi\fi\fi}
+
+\startxmlsetups mml:cn:polar
+ \xmlsetup{#1}{mml:cn:polar:\MMLpolaralternative}
+\stopxmlsetups
+
+\startxmlsetups mml:cn:polar:a
+ \mathopnolimits{Polar}% ? ? ?
+ \left(\xmlsnippet{#1}{1},\xmlsnippet{#1}{3}\right)
+\stopxmlsetups
+
+\startxmlsetups mml:cn:polar:b
+% {\mr e}^{\xmlsnippet{#1}{1}\mskip2mu\getXMLentity{imaginaryi}}
+ {\mr e}^{\xmlsnippet{#1}{1}+\xmlsnippet{#1}{3}\thinspace{\mr i}}
+\stopxmlsetups
+
+\startxmlsetups mml:cn:polar:c
+% \exp\left(\xmlsnippet{#1}{1}\mskip2mu\getXMLentity{imaginaryi}\right)}
+ \exp\left(\xmlsnippet{#1}{1}+\xmlsnippet{#1}{3}\thinspace\getXMLentity{imaginaryi}\right)
+\stopxmlsetups
+
+\startxmlsetups mml:cn:complex-polar
+ \xmlsetup{#1}{mml:cn:polar}
+\stopxmlsetups
+
+\startxmlsetups mml:cn:complex % todo ( )
+ \left(\xmlsnippet{#1}{1} + \xmlsnippet{#1}{3}\thinspace{\mr i}\right)
+\stopxmlsetups
+
+\startxmlsetups mml:cn:complex-cartesian
+ \xmlsetup{#1}{mml:cn:complex}
+\stopxmlsetups
+
+\startxmlsetups mml:cn:float
+ \doifelse \MMLfloatsymbol \v!no {
+ % make sure that e shows up ok
+ \mathopnolimits{\xmlflush{#1}}
+ } {
+ % we should ignore \entities !
+ \edef\mmlfloatstring{\xmlflush{#1}}
+ \splitstring\mmlfloatstring\at e\to\first\and\last
+ \ifx\first\empty
+ \mmlfloatstring
+ \else\ifx\last\empty
+ \mmlfloatstring
+ \else
+ \first
+ \doifelse \MMLfloatsymbol {dot} \cdot \times
+ 10^{\last}
+ \fi \fi
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:cn:real
+ \xmlsetup{#1}{mml:cn:float}
+\stopxmlsetups
+
+\startxmlsetups mml:cn:e-notation
+ \doifelse \MMLenotationsymbol \v!no {
+ \xmlsnippet{#1}{1}
+ \unskip\mathopnolimits{e}\ignorespaces
+ \xmlsnippet{#1}{3}
+ } {
+ \xmlsnippet{#1}{1}
+ \doifelse \MMLenotationsymbol {dot} \cdot
+ \times10^{\xmlsnippet{#1}{3}}
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:cn:logical
+ \mathopnolimits{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups mml:cn:rational
+ \xmldoifelse {#1} {/mml:sep} {
+ \frac
+ {\xmlsnippet{#1}{1}}
+ {\xmlsnippet{#1}{3}}
+ } {
+ \xmlflush{#1}
+ }
+\stopxmlsetups
+
+% interval
+
+\setupMMLappearance[interval][\c!alternative=\v!a,\c!separator={,}]
+
+% when empty element, then it's an apply
+
+\startxmlsetups mml:interval
+ \xmldoifelseempty {#1} {} {
+ % #1 == interval
+ \let\mmlintervalfirst \mmlfirst
+ \let\mmlintervalsecond\mmlsecond
+ \xmlsetup{#1}{mml:interval:\xmlattdef{#1}{closure}{closed}}
+ } {
+ % #1 == apply
+ \let\mmlintervalfirst \mmlsecond
+ \let\mmlintervalsecond\mmlthird
+ \xmlsetup{#1}{mml:interval:\xmlattributedef{#1}{/mml:interval}{closure}{closed}}
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:interval:closed
+ \left[\mmlintervalfirst{#1}\MMLseparator\MMLintervalseparator\mmlintervalsecond{#1}\right]
+\stopxmlsetups
+
+\startxmlsetups mml:interval:open-closed
+ \doifelse \MMLintervalalternative \v!b {
+ \left<\mmlintervalfirst{#1}\MMLseparator\MMLintervalseparator\mmlintervalsecond{#1}\right]
+ } {
+ \left(\mmlintervalfirst{#1}\MMLseparator\MMLintervalseparator\mmlintervalsecond{#1}\right]
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:interval:closed-open
+ \doifelse \MMLintervalalternative \v!b {
+ \left[\mmlintervalfirst{#1}\MMLseparator\MMLintervalseparator\mmlintervalsecond{#1}\right>
+ } {
+ \left[\mmlintervalfirst{#1}\MMLseparator\MMLintervalseparator\mmlintervalsecond{#1}\right)
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:interval:open
+ \doifelse \MMLintervalalternative \v!b {
+ \left<\mmlintervalfirst{#1}\MMLseparator\MMLintervalseparator\mmlintervalsecond{#1}\right>
+ } {
+ \left(\mmlintervalfirst{#1}\MMLseparator\MMLintervalseparator\mmlintervalsecond{#1}\right)
+ }
+\stopxmlsetups
+
+% inverse
+
+\setfalse\xmlinversefunction
+
+\startxmlsetups mml:apply:inverse
+ \settrue\xmlinversefunction
+ \xmlsetup{#1}{\xmlfilter{#1}{/mml:apply/*/name(1)}}
+\stopxmlsetups
+
+% condition
+
+% maybe a fast \xmlnonfirst
+
+% instead of the following we could do \xmlcontent{#1}{/mml:bvar} etc
+
+\startxmlsetups mml:bvar \xmlflush{#1} \stopxmlsetups
+\startxmlsetups mml:lowlimit \xmlflush{#1} \stopxmlsetups
+\startxmlsetups mml:uplimit \xmlflush{#1} \stopxmlsetups
+\startxmlsetups mml:degree \xmlflush{#1} \stopxmlsetups
+\startxmlsetups mml:logbase \xmlflush{#1} \stopxmlsetups
+\startxmlsetups mml:fn \xmlflush{#1} \stopxmlsetups
+
+\startxmlsetups mml:condition
+% \xmldoif {#1} {/mml:bvar} {
+% \xmlfirst{#1}{/mml:bvar}\mid
+% }
+ \xmlall{#1}{/!(mml:condition\string|mml:bvar)}
+\stopxmlsetups
+
+% declare
+
+\setupMMLappearance[declare][\c!state=\v!start]
+
+\startxmlsetups mml:declare
+ \doif \MMLdeclarestate \v!start {
+ \mathopnolimits{declare}
+ \mmlfirst{#1}
+ \ifnum\xmlcount{#1}>\plusone
+ \thickspace
+ \mathopnolimits{as}
+ \thickspace
+ \fi
+ \mmlsecond{#1}
+ }
+\stopxmlsetups
+
+% lambda
+
+\setupMMLappearance[lambda][\c!alternative=b]
+
+\startxmlsetups mml:lambda
+ \begingroup
+ \doifelse \MMLlambdaalternative \v!a {
+ \lambda\left(\xmlconcat{#1}{/!mml:lambda}{\MMLseparator,}\right)
+ } {
+ \ifnum\xmlcount{#1}{/mml:bvar}>\plusone
+ \left(\xmlconcat{#1}{/mml:bvar}{\MMLseparator,}\right)
+ \else
+ \xmlfirst{#1}{/mml:bvar}
+ \fi
+ \mapsto
+ \MMLcreset
+ \xmlall{#1}{/!(mml:bvar|mml:lambda)}
+ }
+ \endgroup
+\stopxmlsetups
+
+% compose
+
+\startxmlsetups mml:compose
+ \begingroup
+ \MMLcreset
+% \let\MMLcCIfunction\firstofoneargument % brrr ? ? ?
+ \doifelsemmlfunction {#1} {
+ \left(\xmlconcat{#1}{/!mml:compose}{\circ}\right)
+ } {
+ \xmlconcat{#1}{/!mml:compose}{\circ}
+ }
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:image
+ \mathopnolimits{image} \left( {\mr\xmlfilter{#1}{/!mml:image/tag()}} \right)
+\stopxmlsetups
+
+\setupMMLappearance[piece][\c!separator=]
+
+\startxmlsetups mml:piecewise
+ \processaction
+ [\MMLpieceseparator]
+ [ \v!yes=>\def\theMMLpieceseparator{,&},
+ \v!no=>\def\theMMLpieceseparator{&},
+ \s!default=>\def\theMMLpieceseparator{&},
+ \s!unknown=>\def\theMMLpieceseparator{\,\,\hbox{\MMLpieceseparator}\,\,}]
+ \cases{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups mml:piece
+ \mmlfirst{#1}\theMMLpieceseparator\mathematics{\mmlsecond{#1}}\crcr
+\stopxmlsetups
+
+\startxmlsetups mml:otherwise
+% \xmlflush{#1}\MMLcPIECEseparator&{\mr otherwise}\crcr
+ \xmlflush{#1}&{\mr otherwise}\crcr
+\stopxmlsetups
+
+% end of piece
+
+\startxmlsetups mml:quotient
+ \lfloor\mmlsecond{#1}/\mmlthird{#1}\rfloor
+\stopxmlsetups
+
+\startxmlsetups mml:factorial
+ \xmlall{#1}{/!factorial}!
+\stopxmlsetups
+
+\setupMMLappearance [divide] [\c!level=\!!maxcard,\c!alternative=\v!a]
+
+\newcount\mmldividelevel
+
+\startxmlsetups mml:divide
+ \advance\mmldividelevel\plusone
+ \doifelse \MMLdividealternative \v!b {
+ \mmlsecond{#1}/\mmlthird{#1}
+ } {
+ \ifnum \mmldividelevel > \MMLdividelevel \relax % threshold
+ \mmlsecond{#1}/\mmlthird{#1}
+ \else
+ \MMLcreset
+ \frac{\MMLcreset\mmlsecond{#1}}{\MMLcreset\mmlthird{#1}}
+ \fi
+ }
+ \advance\mmldividelevel\minusone
+\stopxmlsetups
+
+% min max
+
+\startxmlsetups mml:min \mathopnolimits{min} \xmlsetup{#1}{mml:minmax} \stopxmlsetups
+\startxmlsetups mml:max \mathopnolimits{max} \xmlsetup{#1}{mml:minmax} \stopxmlsetups
+
+\startxmlsetups mml:minmax
+ \xmldoif {#1} {/mml:bvar} {
+ {}_{\xmlfirst{#1}{/mml:bvar}}
+ }
+ \left\{
+ \xmlconcat{#1}{/!(mml:bvar\string|mml:max\string|mml:min)}{\MMLseparator,}
+ \right\}
+\stopxmlsetups
+
+% minus plus
+
+\setupMMLappearance [plus] [\c!alternative=\v!a] % b = no sign -> 3 1/4
+\setupMMLappearance [sign] [\c!reduction=\v!yes]
+
+% alternative b -> geen sign
+
+% branch needed, else (a-b) + (c-d) goes wrong
+% reset check in case of (-x) + 37
+% reset check in case of (-x) + 37
+
+\newcount\mmlpluscounter
+
+\startxmlsetups mml:plus
+ \doifelse \MMLsignreduction \v!yes {
+ \MMLdoL
+ \xmlsetup{#1}{mml:plus:reset}
+ \xmlcommand{#1}{/!mml:plus}{mml:plus:body}
+ \MMLdoR
+ } {
+ \ifnum\xmlcount{#1}{/!mml:plus}=\plusone
+ +\xmlfirst{#1}{/!mml:plus}
+ \else
+ \MMLdoL
+ \xmlconcat{#1}{/!mml:plus}{+}
+ \MMLdoR
+ \fi
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:plus:reset
+ \mmlpluscounter\zerocount
+\stopxmlsetups
+
+\startxmlsetups mml:plus:body
+ \advance\mmlpluscounter\plusone
+ \ifnum\mmlpluscounter>\plusone
+ \xmldoifelse{#1}{/mml:minus} {
+ \ifnum\xmlcount{#1}{/!mml:minus}>\plusone
+ +
+ \fi
+ } {
+ \doifelse {\xmlatt{#1}{type}} {rational} {
+ % fraction
+ } {
+ +
+ }
+ }
+ \fi
+ \xmldirect{#1}
+\stopxmlsetups
+
+\newcount\mmlminuscounter
+
+\startsetups mml:minus
+ \doifelse \MMLsignreduction \v!yes {
+ \ifnum\xmlcount{#1}{/!mml:minus}=\plusone
+ -\xmlfirst{#1}{/!mml:minus}
+ \else
+ \MMLdoL
+ \xmlsetup{#1}{mml:minus:reset}
+ \xmlcommand{#1}{/!mml:minus}{mml:minus:body}
+ \MMLdoR
+ \fi
+ } {
+ \left( % \MMLdoL
+ \ifnum\xmlcount{#1}{/!mml:minus}=\plusone
+ -\xmlfirst{#1}{/!mml:minus}
+ \else
+ \xmlsetup{#1}{mml:minus:reset}
+ \xmlcommand{#1}{/!mml:minus}{mml:minus:body}
+ \fi
+ \right) % \MMLdoR
+ }
+\stopsetups
+
+\startxmlsetups mml:minus:reset
+ \mmlminuscounter\zerocount
+\stopxmlsetups
+
+\startxmlsetups mml:minus:body
+ % we can slso use concat here
+ \advance\mmlminuscounter\plusone
+ \ifnum\mmlminuscounter>\plusone
+ -
+ \fi
+ \xmldirect{#1}
+\stopxmlsetups
+
+% power
+
+\setupMMLappearance[power][\c!reduction=\v!yes]
+
+\let\MMLpowerelement\empty
+
+\startxmlsetups mml:power
+ \xmldoifelse {#1} {/mml:apply} {
+ \doifelse \MMLpowerreduction \v!yes {
+ \xmldoifelse {#1} {/mml:apply/(\MMLcfunctionlist)} {
+ \gdef\MMLpowerelement{\mmlthird{#1}}% postpone, no xdef
+ \MMLcreset\mmlsecond{#1}
+ } {
+ \left(\MMLcreset\mmlsecond{#1}\right)^{\MMLcreset\mmlthird{#1}}
+ }
+ } {
+ \left(\MMLcreset\mmlsecond{#1}\right)^{\MMLcreset\mmlthird{#1}}
+ }
+ } {
+ \mmlsecond{#1}^{\MMLcreset\mmlthird{#1}}
+ }
+\stopxmlsetups
+
+% rem
+
+\startxmlsetups mml:rem
+ \xmlconcat{#1}{/!mml:rem}{\mathopnolimits{mod}}
+\stopxmlsetups
+
+\setupMMLappearance [times] [\c!symbol=\v!no,\c!auto=\v!yes] % new, auto catches cn cn cn
+
+\startxmlsetups mml:times
+ \setMMLcreset{\MMLcfunctionlist\string|\MMLcconstructlist}%
+ \doifelse\MMLtimesauto\v!no {
+ \let\MMLtimes@@symbol\MMLtimessymbol
+ } {
+ \xmldoifelse {#1} {/mml:cn[name(1) == 'mml:cn']} {% name(1) is next one
+ \doifinsetelse\MMLtimessymbol{\v!yes,\v!no} {
+ \let\MMLtimes@@symbol\v!yes
+ } {
+ \let\MMLtimes@@symbol\MMLtimessymbol
+ }
+ } {
+ \let\MMLtimes@@symbol\MMLtimessymbol
+ }
+ }
+ \doifelse\MMLtimes@@symbol\v!yes {
+ \xmlconcat{#1}{/!mml:times}{\times}
+ } {
+ \doifelse\MMLtimes@@symbol{dot} {
+ \xmlconcat{#1}{/!mml:times}{\cdot}
+ } {
+ \doifelse\MMLtimes@@symbol{times} {
+ \xmlconcat{#1}{/!mml:times}{\times}
+ } {
+ \xmlall{#1}{/!mml:times}
+ }
+ }
+ }
+\stopxmlsetups
+
+\setupMMLappearance[root][\c!symbol=\v!yes]
+
+\startxmlsetups mml:root
+ \xmldoifelse {#1} {/mml:degree} {
+ \root
+ \doifnot\MMLrootsymbol\v!no{\MMLcreset\xmltext{#1}{/mml:degree}}
+ \of
+ } {
+ \sqrt
+ }
+ {\MMLcreset\xmlall{#1}{/!(mml:degree\string|mml:root)}}
+\stopxmlsetups
+
+% gcd
+
+\startxmlsetups mml:gcd
+ \begingroup
+ \gcd\left(\MMLcreset\xmlconcat{#1}{/!mml:gcd}{\MMLseparator,}\right)
+ \endgroup
+\stopxmlsetups
+
+% and or xor implies, not
+
+\startxmlsetups mml:and \xmlconcat{#1}{/!mml:and} {\wedge} \stopxmlsetups
+\startxmlsetups mml:or \xmlconcat{#1}{/!mml:or} {\vee} \stopxmlsetups
+\startxmlsetups mml:xor \xmlconcat{#1}{/!mml:xor} {\mathopnolimits{xor}} \stopxmlsetups
+\startxmlsetups mml:implies \xmlconcat{#1}{/!mml:implies}{\Rightarrow} \stopxmlsetups
+\startxmlsetups mml:not \neg \xmlall {#1}{/!mml:not} \stopxmlsetups
+
+% forall exists
+
+%D We need to shift left below rotated A.
+
+\startxmlsetups mml:forall
+ \forall \negthinspace \xmlsetup{#1}{mml:forallexists}
+\stopxmlsetups
+
+\startxmlsetups mml:exists
+ \exists \xmlsetup{#1}{mml:forallexists}
+\stopxmlsetups
+
+\def\mmlforallexistslist{mml:bvar\string|mml:forall\string|mml:exists\string|mml:condition}
+
+\startxmlsetups mml:forallexists
+ _{\xmlconcat{#1}{/mml:bvar}{\MMLseparator,}}
+ \xmldoifelse {#1} {/mml:condition} {
+ \thickspace
+ \begingroup
+ \xmlfirst{#1}{/mml:condition}
+ \endgroup
+ \ifcase\xmlcount{#1}{/!(\mmlforallexistslist)}\relax
+ % nothing
+ \or
+ % == snelle volgende
+ \left\vert
+ \MMLcreset \medspace \xmlconcat{#1}{/!(\mmlforallexistslist)}{}
+ \right.
+ \else
+ % special case
+ \left\vert
+ \matrix {
+ \xmlconcat{#1}{/!(\mmlforallexistslist)}{\hfill\crcr}
+ }
+ \right.
+ \fi
+ } {
+ :\xmlfirst{#1}{/!(\mmlforallexistslist)}
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:abs
+ \left\vert \MMLcreset\xmlall{#1}{/!mml:abs} \right\vert
+\stopxmlsetups
+
+\startxmlsetups mml:conjugate % watch extra {}
+ {\overline{\MMLcreset\xmlall{#1}{/!mml:conjugate}}}
+\stopxmlsetups
+
+\startxmlsetups mml:arg
+ \mathopnolimits{arg} \left( \MMLcreset\xmlall{#1}{/!mml:arg} \right)
+\stopxmlsetups
+
+\startxmlsetups mml:real
+ \Re \left( \MMLcreset \xmlall{#1}{/!mml:real} \right)
+\stopxmlsetups
+
+\startxmlsetups mml:imaginary
+ \Im \ left( \MMLcreset \xmlall{#1}{/!mml:imaginary} \right)
+\stopxmlsetups
+
+\startxmlsetups mml:lcm
+ \mathopnolimits{lcm} \left( \xmlconcat{#1}{/!mml:lcm}{\MMLseparator,} \right)
+\stopxmlsetups
+
+\startxmlsetups mml:floor
+ \lfloor \xmlall{#1}{/!mml:floor} \rfloor
+\stopxmlsetups
+
+\startxmlsetups mml:ceiling
+ \lceiling \xmlall{#1}{/!mml:ceiling} \rceiling
+\stopxmlsetups
+
+% relations
+
+% apply attr or eq
+
+\setupMMLappearance[relation][\c!align=\v!no]
+
+\xmlmapvalue {mml:relation} {mml:eq} {=}
+\xmlmapvalue {mml:relation} {mml:neq} {\neq}
+\xmlmapvalue {mml:relation} {mml:gt} {>}
+\xmlmapvalue {mml:relation} {mml:lt} {<}
+\xmlmapvalue {mml:relation} {mml:geq} {\geq}
+\xmlmapvalue {mml:relation} {mml:leq} {\leq}
+\xmlmapvalue {mml:relation} {mml:equivalent} {\equiv}
+\xmlmapvalue {mml:relation} {mml:approx} {\approx}
+\xmlmapvalue {mml:relation} {mml:factorof} {\mid}
+
+\startxmlsetups mml:eq \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:neq \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:gt \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:lt \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:geq \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:leq \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:equivalent \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:approx \xmlsetup{#1}{mml:relation} \stopxmlsetups
+\startxmlsetups mml:factorof \xmlsetup{#1}{mml:relation} \stopxmlsetups
+
+\startxmlsetups mml:relation
+ \edef\mmlapplyaction{\xmlfilter{#1}{/*/name()}}
+ \MMLcreset \xmlsetup{#1}{mml:relation:\xmlattdef{#1}{align}{\MMLrelationalign}}
+\stopxmlsetups
+
+\startxmlsetups mml:relation:default
+ \xmlconcatrange{#1}{/*}{2}{}{\xmlval{mml:relation}{\mmlapplyaction}{?}}
+\stopxmlsetups
+\startxmlsetups mml:relation:last
+ \eqalign {
+ \xmlconcatrange{#1}{/*}{2}{-2}{&\xmlval{mml:relation}{\mmlapplyaction}{?}\crcr}
+ \mmlprelast{#1}&\xmlval{mml:relation}{\mmlapplyaction}{?}{}\mmllast{#1}
+ }
+\stopxmlsetups
+\startxmlsetups mml:relation:first
+ \eqalign {
+ \mmlsecond{#1}\xmlval{mml:relation}{\mmlapplyaction}{?}{}
+ &\xmlconcatrange{#1}{/*}{3}{}{\crcr\xmlval{mml:relation}{\mmlapplyaction}{?}{}&}
+ }
+\stopxmlsetups
+\startxmlsetups mml:relation:left
+ \eqalign {
+ \xmlconcatrange{#1}{/*}{2}{}{&\xmlval{mml:relation}{\mmlapplyaction}{?}\crcr}
+ }
+\stopxmlsetups
+\startxmlsetups mml:relation:right
+ \eqalign {
+ &\xmlconcatrange{#1}{/*}{2}{}{\crcr\xmlval{mml:relation}{\mmlapplyaction}{?}{}&}
+ }
+\stopxmlsetups
+\startxmlsetups mml:relation:no
+ \xmlsetup{#1}{mml:relation:default}
+\stopxmlsetups
+\startxmlsetups mml:relation:yes
+ \xmlsetup{#1}{mml:relation:left}
+\stopxmlsetups
+
+% personal goody:
+
+\edef\MMLcmainresetlist{\MMLcmainresetlist\string|becomes}
+
+\xmlmapvalue {mml:relation} {mml:becomes} {:=}
+
+\startxmlsetups mml:becomes \xmlsetup{#1}{mml:relation} \stopxmlsetups
+
+% calculus and vector calculus
+
+\startxmlsetups mml:domainofapplication
+ \xmlall{#1}{/!mml:domainofapplication}
+\stopxmlsetups
+
+\setupMMLappearance[int][\c!location=\v!top]
+
+\def\doMMLlimits#1{\doifelsevalue{MML#1\c!location}\v!top\limits\nolimits}
+
+\startxmlsetups mml:int
+ \MMLcreset
+ \xmldoifelse {#1} {/mml:domainofapplication} {
+ \int \doMMLlimits{int}_{\xmlfirst{#1}{/mml:domainofapplication}}\relax
+ } {
+ \xmldoifelse {#1} {/mml:condition} {
+ \int \doMMLlimits{int}_{\xmlfirst{#1}{/mml:condition}}\relax
+ } {
+ \xmldoifelse {#1} {/mml:lowlimit} {
+ \int \doMMLlimits{int}_{\xmlfirst{#1}{/mml:lowlimit}}^{\xmlfirst{#1}{/mml:uplimit}}
+ } {
+ % funny, why do we have lowlimit/uplimit then
+ \xmldoifelse {#1} {/mml:apply/mml:interval} {
+ \int \doMMLlimits{int}_{\xmlindex{#1}{/mml:apply}{2}}^{\xmlindex{#1}{/mml:apply}{3}}
+ } {
+ \int
+ }
+ }
+ }
+ }
+ \MMLcreset
+ \xmldoifelse {#1} {/mml:apply} {
+ \doifelsemmlfunction {#1} { % todo test
+ \xmlfirst{#1}{/mml:apply}
+ } {
+ % if there are too many () now, we need to be more clever
+ \left( \xmlfirst{#1}{/mml:apply} \right)
+ }
+ } {
+ \xmlfirst{#1}{/mml:ci}
+ }
+ \xmldoifelse {#1} {/mml:bvar} {
+ \thinspace {\mr d} \xmlfirst{#1}{/mml:bvar}
+ } {
+ % nothing
+ }
+\stopxmlsetups
+
+\setupMMLappearance[diff][\c!location=\v!top,\c!alternative=\v!a]
+
+% \setupMMLappearance[diff][alternative=b]
+%
+% \startXMLdata
+% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><ci>f</ci></apply><ci>a</ci></apply></math>
+% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><degree>2</degree><ci>f</ci></apply><ci>a</ci></apply></math>
+% \stopXMLdata
+
+% d^y/dx^2
+%
+% \startXMLdata
+% <math><apply><diff/>
+% <bvar><ci>x</ci><cn type="integer">2</cn></bvar>
+% <lambda><bvar><ci>x</ci></bvar><ci>y</ci></lambda>
+% </apply></math>
+% \stopXMLdata
+
+\startxmlsetups mml:diff
+ \MMLcreset
+ \doifelse \MMLdiffalternative \v!a {
+ \xmldoifelse {#1} {/mml:lambda} {
+ % a special case (mathadore/openmath)
+ \frac {
+ d^{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}}{\xmlfirst{#1}{/mml:lambda}\xmlfirst{#1}{/mml:ci}}
+ } {
+ d{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:ci}}^{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}}
+ }
+ } {
+ \xmldoifelse {#1} {/mml:bvar} {
+ \frac {
+ {\mr d}{
+ \xmldoifelse {#1} {/mml:degree} {
+ ^{\xmlconcat{#1}{/mml:degree}\empty}
+ } {
+ \xmldoif {#1} {/mml:bvar/mml:degree} {
+ ^{\xmlconcat{#1}{/mml:bvar/mml:degree}+}
+ }
+ }
+ }
+ \doif \MMLdifflocation \v!top {
+ \xmldoifelse {#1} {/mml:ci} {
+ \xmlfirst{#1}{/mml:ci}
+ } {
+ \MMLcreset
+ \xmlfirst{#1}{/mml:apply}
+ }
+ }
+ } {
+ {\mr d}
+ \xmlfirst{#1}{/mml:bvar/!mml:degree}
+ \xmldoif {#1} {/mml:bvar/mml:degree} {
+ ^{\xmlfirst{#1}{/mml:bvar/mml:degree}}
+ }
+ }
+ \doifnot \MMLdifflocation \v!top {
+ \left(\MMLcreset\xmlfirst{#1}{/(mml:apply\string|mml:ci)}\right)
+ }
+ } {
+ \xmlconcatrange{#1}{/*}{2}{}^\prime
+ }
+ }
+ } {
+ \MMLcreset
+ \xmlfirst{#1}{/(mml:apply\string|mml:ci)}
+ % there can be problems with nested diff's: ^^{} error
+ % so we add an empty group here
+ {}^
+ {
+ \xmldoifelse {#1} {/mml:degree} {
+ \edef\mmldegree{\xmlfirst{#1}{/mml:degree/mml:cn}}
+ \ifx\mmldegree\empty
+ % what to do here
+ \else
+ \dorecurse\mmldegree\prime
+ \fi
+ } {
+ \prime
+ }
+ }
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:partialdiff
+ \xmldoifelse {#1} {/mml:list} {
+ {\mr D}_{
+ \begingroup
+ \setfalse\mmllistdelimiters
+ \xmlall{#1}{/mml:list}
+ \endgroup
+ }
+ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
+ } {
+ \xmldoifelse {#1} {/mml:bvar} {
+ \frac {
+ {\mr d}^{
+ \xmldoifelse {#1} {/mml:degree} {
+ \xmlconcat{#1}{/mml:degree}\empty
+ } {
+ \xmlconcat{#1}{/mml:bvar/mml:degree}+
+ }
+ }
+ \MMLcreset
+ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
+ } {
+ \xmldoif {#1}{/mml:bvar/!mml:degree} {
+ \xmlfirst{#1}{/mml:bvar/!mml:degree} \,
+ }
+ {\mr d}\xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
+ \xmldoif {#1} {/mml:bvar/mml:degree} {
+ ^{\xmlfirst{#1}{/mml:bvar/mml:degree}}
+ }
+ }
+ } {
+ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
+ }
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:divergence \mathopnolimits{div} \xmlall{#1}{/!mml:divergence} \stopxmlsetups
+\startxmlsetups mml:grad \mathopnolimits{grad} \xmlall{#1}{/!mml:grad} \stopxmlsetups
+\startxmlsetups mml:curl \mathopnolimits{curl} \xmlall{#1}{/!mml:curl} \stopxmlsetups
+\startxmlsetups mml:laplacian \nabla^2 \xmlall{#1}{/!mml:laplacian} \stopxmlsetups
+\startxmlsetups mml:ident \mathopnolimits{identity} \xmlall{#1}{/!mml:ident} \stopxmlsetups
+
+\setupMMLappearance[domain] [symbol=]
+\setupMMLappearance[codomain][symbol=]
+
+\startxmlsetups mml:domain
+ \doifelsenothing \MMLdomainsymbol {
+ \mathopnolimits{domain}\MMLcreset\xmlall{#1}{/!mml:domain}
+ } {
+ \MMLdomainsymbol_{\xmlall{#1}{/!mml:domain}}
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:codomain
+ \doifelsenothing \MMLcodomainsymbol {
+ \mathopnolimits{codomain}\MMLcreset\xmlall{#1}{/!mml:codomain}
+ } {
+ \MMLcodomainsymbol_{\xmlall{#1}{/!mml:codomain}}
+ }
+\stopxmlsetups
+
+% theory of sets
+
+\startxmlsetups mml:set
+ \left\{
+ \xmldoifelse {#1} {/mml:condition} {
+ \xmlfirst{#1}{/mml:bvar}\,\middle\vert\,\xmlfirst{#1}{/mml:condition}
+ } {
+ \xmlconcat{#1}{/!mml:set}{\MMLseparator,}
+ }
+ \right\}
+ \relax % needed
+\stopxmlsetups
+
+\settrue\mmllistdelimiters
+
+\startxmlsetups mml:list
+ \begingroup
+ \ifconditional\mmllistdelimiters\left [\fi
+ \begingroup
+ \settrue\mmllistdelimiters
+ \xmlconcat{#1}{/!mml:list}{\MMLseparator,}
+ \endgroup
+ \ifconditional\mmllistdelimiters\right]\fi
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:union \mmlsecond{#1} \cup \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:intersect \mmlsecond{#1} \cap \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:in \mmlsecond{#1} \in \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:notin \mmlsecond{#1} {\not\in} \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:subset \mmlsecond{#1} \subset \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:prsubset \mmlsecond{#1} \subseteq \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:notsubset \mmlsecond{#1} {\not\subset} \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:notprsubset \mmlsecond{#1} {\not\subseteq} \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:setdiff \mmlsecond{#1} \setminus \mmlthird{#1} \stopxmlsetups
+
+\startxmlsetups mml:card
+ \left\vert \xmlall{#1}{/!mml:card} \right\vert
+\stopxmlsetups
+
+\startxmlsetups mml:cartesianproduct
+ \xmlconcat{#1}{/!mml:cartesianproduct}{\times}
+\stopxmlsetups
+
+% sequences and series
+
+\setupMMLappearance[sum] [\c!location=\v!top]
+\setupMMLappearance[product][\c!location=\v!top]
+
+\xmlmapvalue {mml:sumprod} {sum} {\sum}
+\xmlmapvalue {mml:sumprod} {product} {\prod}
+
+\startxmlsetups mml:sum \edef\mmlsumprodname{sum} \xmlsetup{#1}{mml:sumprod} \stopxmlsetups
+\startxmlsetups mml:product \edef\mmlsumprodname{product} \xmlsetup{#1}{mml:sumprod} \stopxmlsetups
+
+\def\mmlstackedsubscripts#1%
+ {\vbox
+ {\baselineskip\zeropoint % hack, taco vragen
+ \halign{$\scriptstyle\hss##\hss$\cr#1\crcr}}}
+
+% unfinished
+
+\startxmlsetups mml:sumprod
+ \begingroup
+ \xmldoifelse {#1} {/(mml:condition\string|mml:bvar\string|mml:lowlimit)} {
+ \def\mmlsumprodlower{
+ _{
+ \xmldoifelse {#1} {/mml:condition} {
+ \mmlstackedsubscripts{\xmlconcat{#1}{/mml:condition}{\crcr}}
+ } {
+ \xmldoif {#1} {/mml:bvar} {
+ \xmlfirst{#1}{/mml:bvar}
+ \xmldoif{#1}{/mml:lowlimit}{=}
+ }
+ \xmlfirst{#1}{/mml:lowlimit}
+ }
+ }
+ }
+ } {
+ \let\mmlsumprodlower\empty
+ }
+ \xmldoifelse {#1} {/mml:uplimit} {
+ \def\mmlsumprodupper{^{\xmlfirst{#1}{/mml:uplimit}}}
+ } {
+ \let\mmlsumprodupper\empty
+ }
+ \xmldoif {#1} {/mml:interval} { % open math converter gives this
+ \edef\mmlintervalfrom{\xmlindex{#1}{/mml:interval}{1}}
+ \edef\mmlintervalto {\xmlindex{#1}{/mml:interval}{2}}
+ \ifx \mmlintervalfrom \empty \else
+ \def\mmlsumprodlower{_{\xmldoif{#1}{/mml:bvar}{\xmlfirst{#1}{/mml:bvar}{=}}\mmlintervalfrom}}
+ \fi
+ \ifx \mmlintervalto \empty \else
+ \def\mmlsumprodupper{^{\mmlintervalto}}
+ \fi
+ }
+ \MMLcreset
+ \xmlval{mml:sumprod}{\mmlsumprodname}{}\doMMLlimits\mmlsumprodname\mmlsumprodupper\mmlsumprodlower
+ \MMLcreset
+ \xmldoifelse {#1} {/mml:lambda/mml:apply} {
+ \xmlfirst{#1}{/mml:lambda/mml:apply}% a bit of open math conversion mess
+ } {
+ \xmlfirst{#1}{/(mml:apply\string|mml:lambda\string|mml:ci)}%
+ }
+ \endgroup
+\stopxmlsetups
+
+\setupMMLappearance[limit][\c!location=\v!top]
+
+\startxmlsetups mml:limit
+ \MMLcreset \lim
+ \doMMLlimits {limit}_{
+ \MMLcreset
+ \xmldoifelse {#1} {/mml:condition} {
+ \xmlfirst{#1}{/mml:condition}
+ } {
+ \xmldoif {#1} {/mml:bvar} {
+ \xmlfirst{#1}{/mml:bvar}\rightarrow
+ }
+ \xmlfirst{#1}{/mml:lowlimit}
+ }
+ }
+ \begingroup
+ % a bit of open math conversion mess, lambda needed for openmath, ok?
+ \MMLcreset
+ \xmlfirst{#1}{/mml:lambda/mml:apply}
+ \xmlfirst{#1}{/(mml:apply\string|mml:lambda)}
+ \endgroup
+\stopxmlsetups
+
+% consider a faster index
+
+\startxmlsetups mml:tendsto
+ \MMLcreset \mmlsecond{#1}
+ \xmlval {mml:tendsto:type} {\xmlattdef{#1}{type}{default}} {\rightarrow}
+ \MMLcreset \mmlthird{#1}
+\stopxmlsetups
+
+\xmlmapvalue {mml:tendsto:type} {above} {\downarrow}
+\xmlmapvalue {mml:tendsto:type} {below} {\uparrow}
+\xmlmapvalue {mml:tendsto:type} {default} {\rightarrow}
+
+% elementary classical functions
+
+\setupMMLappearance[log][\c!location=\v!right]
+
+\startxmlsetups mml:exp
+% {\mr e}^{\xmlfirst{#1}{/mml:apply\string|mml:reln\string|mml:ci\string|mml:cn}}
+ {\mr e}^{\xmlfirst{#1}{/!mml:exp}}
+\stopxmlsetups
+
+\startxmlsetups mml:log
+ \xmldoifelse {#1} {/mml:logbase} {
+ \doifelse \MMLloglocation \v!left {
+ \mathop {
+ {}^{\xmlfirst{#1}{/mml:logbase}}\negthinspace\mathopnolimits{log}
+ }
+ } {
+ \mathopnolimits{log}_{\xmlfirst{#1}{/mml:logbase}}
+ }
+% \MMLcreset
+ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
+% \xmlsetup{#1}{mml:function} % todo, we start elsewhere
+% \mmlthird{#1}
+ } {
+ \mathopnolimits{log}
+% \MMLcreset
+% \xmlsetup{#1}{mml:function} % todo, we start elsewhere
+ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
+% \mmlsecond{#1}
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:ln
+ \mathopnolimits{ln}
+ \xmlsetup{#1}{mml:function}
+\stopxmlsetups
+
+% statistics
+
+\startxmlsetups mml:mean \overline {\mmlsecond{#1}} \stopxmlsetups
+\startxmlsetups mml:sdev \sigma \left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
+\startxmlsetups mml:variance \sigma \left(\MMLcreset\mmlsecond{#1}\right)^2 \stopxmlsetups
+\startxmlsetups mml:median \mathopnolimits{median}\left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
+\startxmlsetups mml:mode \mathopnolimits{mode} \left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
+
+% moments
+
+\startxmlsetups mml:moment
+ \left\langle
+ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}^{\xmlfirst{#1}{/mml:degree}}
+ \right\rangle
+ \xmldoif {#1} {mml:momentabout} {
+ _{\xmlfirst{#1}{mml:momentabout}}
+ }
+\stopxmlsetups
+
+% linear algebra
+
+\setupMMLappearance [vector] [\c!direction=\v!horizontal,\c!separator={,}]
+
+\startxmlsetups mml:vector
+ \begingroup
+ \ifnum\xmlcount{#1}>\plusone
+ \doifelse\MMLvectordirection\v!horizontal {
+ \left(\xmlconcat{#1}{/*}{\MMLseparator\MMLvectorseparator}\right)
+ } {
+ \MMLcreset\left(\matrix{\xmlconcat{#1}{/*}{\MMLseparator\MMLvectorseparator}}\right)
+ }
+ \else
+ \overrightarrow{\charhtstrut\mmlfirst{#1}}
+ \fi
+ \endgroup
+\stopxmlsetups
+
+\settrue\MMCdelmatrix % ( ) when true
+
+\startxmlsetups mml:matrix
+ \begingroup
+ \MMLcreset
+ \ifconditional\MMCdelmatrix
+ \left(\matrix{\xmlcommand{#1}{/mml:matrixrow}{mml:matrixrow:do}}\right)
+ \else
+ \settrue\MMCdelmatrix
+ \matrix{\xmlcommand{#1}{/mml:matrixrow}{mml:matrixrow:do}}
+ \fi
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:matrixrow
+ \begingroup
+ \MMLcreset
+ \left(\xmlsetup{#1}{mml:matrixrow:do}\right)
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:matrixrow:do
+ \xmlconcat{#1}{/*}{&}\crcr
+\stopxmlsetups
+
+\startxmlsetups mml:determinant
+ \begingroup
+ \setfalse\MMCdelmatrix
+ \left|\mmlsecond{#1}\right|
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:transpose
+ \mmlsecond{#1}^{\mathopnolimits{T}}
+\stopxmlsetups
+
+\startxmlsetups mml:selector
+ \MMLmathinner{\mmlsecond{#1}_{\MMLcreset\xmlconcatrange{#1}{/*}{3}{}{\MMLseparator,}}}
+\stopxmlsetups
+
+\startxmlsetups mml:vectorproduct \mmlsecond{#1}\times \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:scalarproduct \mmlsecond{#1}\cdot \mmlthird{#1} \stopxmlsetups
+\startxmlsetups mml:outerproduct \mmlsecond{#1}\otimes\mmlthird{#1} \stopxmlsetups
+
+% semantic mapping elements
+
+\setupMMLappearance[semantics][\c!state=\v!start]
+
+\startxmlsetups mml:semantics
+ \doifelse\MMLsemanticsstate\v!start {
+ \xmlall{#1}{/mml:annotation}
+ } {
+ \xmlall{#1}{/!mml:annotation}
+ }
+\stopxmlsetups
+
+\usemodule[x][calcmath]
+%usemodule[x][asciimath]
+
+\startxmlsetups mml:annotation
+ \xmldoifelse {#1} {.[oneof(@encoding,'TeX','tex','TEX','ConTeXt','context','CONTEXT','ctx')]} {
+ \xmlflushcontext{#1}
+ } {
+ \xmldoifelse {#1} {.[oneof(@encoding,'calcmath','cm')]} {
+ \expanded{\calcmath{\xmlflush{#1}}}
+ } {
+ \xmldoifelse {#1} {.[oneof(@encoding,'asciimath','am')]} {
+ \ifdefined\asciimath
+ \expanded{\asciimath{\xmlflush{#1}}}
+ \else
+ \hbox{\tt no am loaded}%
+ \fi
+ } {
+ \xmlall{#1}{../!mml:annotation}
+ }
+ }
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:annotation-xml
+ % maybe diagnostics
+\stopxmlsetups
+
+% misc
+
+\startxmlsetups mml:integers \integers \stopxmlsetups
+\startxmlsetups mml:reals \reals \stopxmlsetups
+\startxmlsetups mml:rationals \rationals \stopxmlsetups
+\startxmlsetups mml:naturalnumbers \naturalnumbers \stopxmlsetups
+\startxmlsetups mml:complexes \complexes \stopxmlsetups
+\startxmlsetups mml:primes \primes \stopxmlsetups
+\startxmlsetups mml:exponentiale \mathopnolimits{e} \stopxmlsetups
+\startxmlsetups mml:imaginaryi \mathopnolimits{i} \stopxmlsetups
+\startxmlsetups mml:notanumber \mathopnolimits{NaN} \stopxmlsetups
+\startxmlsetups mml:true \mathopnolimits{true} \stopxmlsetups
+\startxmlsetups mml:false \mathopnolimits{false} \stopxmlsetups
+\startxmlsetups mml:emptyset \mathopnolimits{\O} \stopxmlsetups
+\startxmlsetups mml:pi \pi \stopxmlsetups
+\startxmlsetups mml:eulergamma \gamma \stopxmlsetups
+\startxmlsetups mml:infinity \infty \stopxmlsetups
+
+% gonio functions
+
+\setupMMLappearance[function][\c!reduction=\v!yes]
+
+% todo: \mfunction which adapts itself when registered as command
+
+% todo: \def\mmlcfunction#1#2{\mathopnolimits{#2}\xmlsetup{#1}{mml:function}}
+
+\startxmlsetups mml:sin \mathopnolimits {sin}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:sinh \mathopnolimits {sinh}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:cos \mathopnolimits {cos}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:cosh \mathopnolimits {cosh}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:tan \mathopnolimits {tan}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:tanh \mathopnolimits {tanh}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:cot \mathopnolimits {cot}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:coth \mathopnolimits {coth}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:csc \mathopnolimits {csc}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:csch \mathopnolimits {csch}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:sec \mathopnolimits {sec}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:sech \mathopnolimits {sech}\xmlsetup{#1}{mml:function} \stopxmlsetups
+
+\startxmlsetups mml:arcsin \mathopnolimits {arcsin}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arcsinh \mathopnolimits{arcsinh}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arccos \mathopnolimits {arccos}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arccosh \mathopnolimits{arccosh}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arctan \mathopnolimits {arctan}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arctanh \mathopnolimits{arctanh}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arccot \mathopnolimits {arccot}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arccoth \mathopnolimits{arccoth}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arccsc \mathopnolimits {arccsc}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arccsch \mathopnolimits{arccsch}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arcsec \mathopnolimits {arcsec}\xmlsetup{#1}{mml:function} \stopxmlsetups
+\startxmlsetups mml:arcsech \mathopnolimits{arcsech}\xmlsetup{#1}{mml:function} \stopxmlsetups
+
+\startxmlsetups mml:function
+ \ifx\MMLpowerelement\empty
+ \ifconditional\xmlinversefunction^{-1}\fi
+ \setfalse\xmlinversefunction
+ \else
+ ^{\ifconditional\xmlinversefunction-\fi\MMLpowerelement}
+ \setfalse\xmlinversefunction
+ \glet\MMLpowerelement\empty
+ \fi
+ \xmlsetup{#1}{mml:function:argument}
+\stopxmlsetups
+
+\startxmlsetups mml:function:argument
+ \doifelse \MMLfunctionreduction \v!yes {
+ \xmldoifelse {#1} {/mml:apply} {
+ \xmldoifelse {#1} {/mml:apply/(\MMLcfunctionlist\string|mml:divide)}
+ \donefalse
+ \donetrue
+ } {
+ \donefalse
+ }
+ } {
+ \donetrue
+ }
+ % beware, we still flush from 2 up
+ \ifdone
+ \left(
+ \MMLcreset
+ \xmlall{#1}{/[position()>1]}% \xmlconcatrange{#1}{/*}{2}{}\empty
+ \right)
+ \else
+ \MMLcreset
+ \xmlall{#1}{/[position()>1]}
+ \fi
+\stopxmlsetups
+
+% PRESENTATION MATHML
+%
+% there are some rough edges that need to be sorted out
+
+% helpers
+
+\xmlmapvalue {mml} {normal} {\tf}
+\xmlmapvalue {mml} {double-struck} {\bf}
+\xmlmapvalue {mml} {italic} {\it}
+\xmlmapvalue {mml} {fraktur} {\bf}
+\xmlmapvalue {mml} {script} {\tf}
+\xmlmapvalue {mml} {bold} {\bf}
+\xmlmapvalue {mml} {bold-italic} {\bi}
+\xmlmapvalue {mml} {bold-fraktur} {\bf}
+\xmlmapvalue {mml} {bold-script} {\bf}
+\xmlmapvalue {mml} {sans-serif} {\ss}
+\xmlmapvalue {mml} {bold-sans-serif} {\ss\bf}
+\xmlmapvalue {mml} {sans-serif-italic} {\ss\it}
+\xmlmapvalue {mml} {sans-serif-bold-italic} {\ss\bi}
+\xmlmapvalue {mml} {monospace} {\tt}
+
+% todo: displaystyle=true/false (or whatever else shows up)
+
+\starttexdefinition setmmlmathstyle #1
+ \xmlval {mml} {\xmlatt{#1}{mathvariant}} \empty % was: \mmmr
+\stoptexdefinition
+
+\starttexdefinition applymmlmathcolor #1#2
+ \edef\mmlmathcolor{\xmlatt{#1}{mathcolor}}
+ \ifx \mmlmathcolor \empty
+ #2
+ \else
+ \color[\mmlmathcolor]{#2}
+ \fi
+\stoptexdefinition
+
+% todo: textbackgrounds
+
+\starttexdefinition applymmlmathbackground #1#2
+ \edef\mmlmathbackground{\xmlatt{#1}{mathbackground}}
+ \ifx \mmlmathbackground \empty
+ #2
+ \else
+ \backgroundline[\mmlmathbackground]{#2}
+ \fi
+\stoptexdefinition
+
+\newsignal\mmltextsignal % not used
+
+\starttexdefinition applymmlsometext #1#2
+ \applymmlmathbackground {#1} {
+ \applymmlmathcolor {#1} {
+ \setmmlmathstyle {#1}
+ #2
+ }
+ }
+\stoptexdefinition
+
+% probably bugged:
+
+\starttexdefinition doMMLfiller #1
+ \pushmacro\doMMLfiller
+ \let\doMMLfiller\gobbleoneargument
+ \gdef\dodoMMLfiller{% where used
+ \disablefiller
+ \mathematics{#1}
+ }
+ \hbox {
+ \def\normalorfiller##1##2{
+ \gdef\dodoMMLfiller{\enablefiller#1}%
+ \let\normalorfiller\gobbletwoarguments
+ }
+ \mathematics{#1}
+ }
+ \popmacro\doMMLfiller
+\stoptexdefinition
+
+% setups
+
+\startxmlsetups mml:mi % todo: mathvariant mathsize mathcolor mathbackground
+ \ctxlua{lxml.mml.mi("#1")}
+\stopxmlsetups
+
+\startxmlsetups mml:mn % todo: mathvariant mathsize mathcolor mathbackground
+ \begingroup
+ \mr \ctxlua{lxml.mml.mn("#1")}% no \hbox, would be ok for . , but spoils rest
+ \endgroup
+\stopxmlsetups
+
+% <m:mo>-</m:mo><m:mn>2</m:mn> and <m:mn>1</m:mn><m:mo>-</m:mo><m:mn>2</m:mn>
+%
+% spacing between - and 2 is taken care of by tex itself
+
+\startxmlsetups mml:mo
+ \doif {\xmlatt{#1}{maxsize}} {1} {\settrue\mmlignoredelimiter}
+ \doif {\xmlatt{#1}{stretchy}} {false} {\settrue\mmlignoredelimiter}
+ \ctxlua{lxml.mml.mo("#1")}
+ \setfalse\mmlignoredelimiter
+\stopxmlsetups
+
+\startxmlsetups mml:mfenced % {} around separator is needed for spacing
+ \def\MMLleft {\left }% weird
+ \def\MMLright {\right}
+ \def\MMLmiddle{\middle}
+ \ctxlua{lxml.mml.mfenced("#1")}
+\stopxmlsetups
+
+\defineoverlay [mml:enclose:box] [\useMPgraphic{mml:enclose:box}]
+\defineoverlay [mml:enclose:roundedbox] [\useMPgraphic{mml:enclose:roundedbox}]
+\defineoverlay [mml:enclose:circle] [\useMPgraphic{mml:enclose:circle}]
+\defineoverlay [mml:enclose:left] [\useMPgraphic{mml:enclose:left}]
+\defineoverlay [mml:enclose:right] [\useMPgraphic{mml:enclose:right}]
+\defineoverlay [mml:enclose:top] [\useMPgraphic{mml:enclose:top}]
+\defineoverlay [mml:enclose:bottom] [\useMPgraphic{mml:enclose:bottom}]
+\defineoverlay [mml:enclose:updiagonalstrike] [\useMPgraphic{mml:enclose:updiagonalstrike}]
+\defineoverlay [mml:enclose:downdiagonalstrike] [\useMPgraphic{mml:enclose:downdiagonalstrike}]
+\defineoverlay [mml:enclose:horizontalstrike] [\useMPgraphic{mml:enclose:horizontalstrike}]
+\defineoverlay [mml:enclose:verticalstrike] [\useMPgraphic{mml:enclose:verticalstrike}]
+
+\startuseMPgraphic{mml:enclose:box}
+ draw OverlayBox withpen pencircle scaled (ExHeight/10) ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:roundedbox}
+ draw OverlayBox cornered .5ExHeight withpen pencircle scaled (ExHeight/10) ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:circle}
+ draw fullcircle xysized(bbwidth(OverlayBox),bbheight(OverlayBox)) withpen pencircle scaled (ExHeight/10) ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:left}
+ draw leftboundary OverlayBox withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:right}
+ draw rightboundary OverlayBox withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:top}
+ draw topboundary OverlayBox withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:bottom}
+ draw bottomboundary OverlayBox withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:updiagonalstrike}
+ path p ; p := OverlayBox enlarged -.25ExHeight ;
+ draw llcorner p -- urcorner p withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:downdiagonalstrike}
+ path p ; p := OverlayBox enlarged -.25ExHeight ;
+ draw ulcorner p -- lrcorner p withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:horizontalstrike}
+ path p ; p := OverlayBox enlarged -.25ExHeight ;
+ draw .5[llcorner p,ulcorner p] -- .5[lrcorner p,urcorner p] withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+\startuseMPgraphic{mml:enclose:verticalstrike}
+ path p ; p := OverlayBox enlarged -.25ExHeight ;
+ draw .5[llcorner p,lrcorner p] -- .5[ulcorner p,urcorner p] withpen pencircle scaled (ExHeight/10) ;
+ setbounds currentpicture to OverlayBox ;
+\stopuseMPgraphic
+
+\startxmlsetups mml:menclose
+ \edef\mmlmenclosenotation{\ctxlua{lxml.mml.menclosepattern("#1")}}
+ \ifx\mmlmenclosenotation\empty
+ \xmlflush{#1}
+ \else
+ \doifelse \mmlmenclosenotation {mml:enclose:longdiv} {
+ \overline{\left)\strut\xmlflush{#1}\right.}
+ } {
+ \doifelse \mmlmenclosenotation {mml:enclose:actuarial} {
+ \overline{\left.\strut\xmlflush{#1}\right|}
+ } {
+ \doifelse \mmlmenclosenotation {mml:enclose:radical} {
+ \sqrt{\xmlflush{#1}}
+ } {
+ % todo: no framed when longdiv, actuarial or radical ? spec ?
+ \vcenter {
+ \framed
+ [frame=off,strut=no,background={\mmlmenclosenotation}] % offset is kind of undefined
+ {$
+ \expanded{\doifinsetelse {mml:enclose:longdiv} {\mmlmenclosenotation}} {
+ \overline{\left)\strut\xmlflush{#1}\right.}
+ } {
+ \expanded{\doifinsetelse {mml:enclose:actuarial} {\mmlmenclosenotation}} {
+ \overline{\left.\strut\xmlflush{#1}\right|}
+ } {
+ \expanded{\doifinsetelse {mml:enclose:radical} {\mmlmenclosenotation}} {
+ \sqrt{\xmlflush{#1}}
+ } {
+ \xmlflush{#1}
+ }
+ }
+ }
+ $}
+ }
+ }
+ }
+ }
+ \fi
+\stopxmlsetups
+
+\xmlmapvalue {mml:mfrac:linethickness} {thin} {.2pt}
+\xmlmapvalue {mml:mfrac:linethickness} {medium} {.4pt}
+\xmlmapvalue {mml:mfrac:linethickness} {thick} {.8pt}
+
+\startxmlsetups mml:mfrac % dodo: handle linethickness in lua + unit
+ \begingroup
+ \edef\mmlfraclinethickness{\xmlatt{#1}{linethickness}}
+ \ifx\mmlfraclinethickness\empty
+ \doifelse{\xmlatt{#1}{bevelled}}{true} {
+ \left.\mmlfirst{#1}\middle/\mmlsecond{#1}\right.% \thinspace\middle/\thinspace
+ } {
+ \frac{\mmlfirst{#1}}{\mmlsecond{#1}}
+ }
+ \else
+ \doifXMLvalelse {mml:mfrac:linethickness} \mmlfraclinethickness {
+ \scratchdimen\xmlval{mml:mfrac:linethickness}\mmlfraclinethickness{.4pt}
+ } {
+ \setdimensionwithunit\scratchdimen\mmlfraclinethickness{pt}
+ }
+ {
+ {\mmlfirst{#1}}
+ \above\scratchdimen
+ {\mmlsecond{#1}}
+ }
+ \fi
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:ms
+ \hbox {
+ \tf % else encoding problems
+ \edef\mmllquote{\xmlatt{#1}{lquote}}
+ \edef\mmlrquote{\xmlatt{#1}{rquote}}
+ \ifx\mmllquote\empty\symbol[leftquotation]\else\mmllquote\fi
+ \applymmlsometext{#1}{\xmlflush{#1}}
+ \ifx\mmlrquote\empty\symbol[rightquotation]\else\mmlrquote\fi
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:mstyle
+ \begingroup
+ \setmmlmathstyle{#1}
+ \xmlflush{#1}
+ \endgroup
+\stopxmlsetups
+
+\setupMMLappearance[text][\c!alternative=\v!a] % a=normal, b=keep spaces
+
+\startxmlsetups mml:mtext
+ \domathtext {
+ \applymmlsometext{#1}{
+ \doifelse\MMLscriptsalternative\v!a {
+ %\ctxlua{lxml.mml.stripped(\!!bs\xmlflush{#1}\!!es)}
+ \ignorespaces
+ \xmlflush{#1}
+ \unskip
+ } {
+ \xmlflush{#1}
+ }
+ }
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:merror
+ \hbox{$\displaystyle\xmlflush{#1}$}
+\stopxmlsetups
+
+\startxmlsetups mml:mphantom
+% \phantom{\ignorespaces{}\xmlflush{#1}\unskip} % watch spacing {} hack
+ \phantom{\mathstyle{\ignorespaces{}\xmlflush{#1}\unskip}}%
+% \mktriggereffect\v!hidden
+% \ignorespaces{}\xmlflush{#1}\unskip % no attributes in math yet
+% \mktriggereffect\v!normal
+\stopxmlsetups
+
+\startxmlsetups mml:mpadded % todo
+ \xmlflush{#1}
+\stopxmlsetups
+
+% mrow
+
+% \startxmlsetups mml:mrow
+% \begingroup
+% \ifcase\xmlcount{#1}{/mml:mo}\relax
+% \xmlflush{#1}
+% \else % no \let
+% \def\MMLleft {\left }
+% \def\MMLright {\right}
+% \def\MMLmiddle{\middle}
+% \enabledelimiter
+% \checkdelimiters{\xmlall{#1}{/mml:mo}}
+% \fakeleftdelimiter
+% \xmlflush{#1}
+% \fakerightdelimiter
+% \disabledelimiter
+% \fi
+% \endgroup
+% \stopxmlsetups
+
+% option: no fenced
+
+\startxmlsetups mml:mrow
+ \begingroup
+ \edef\nofmmlrows{\xmlcount{#1}{/mml:mo}}%
+ \ifnum\nofmmlrows=\plustwo
+ \xmldoifelse {#1} {/mml:mo[position()==1 or position()==\nofmmlrows]} {% we need a {}
+ \def\MMLleft {\left }
+ \def\MMLright {\right}
+ \def\MMLmiddle{\middle}
+ \enabledelimiter
+ \checkdelimiters{\xmlall{#1}{/mml:mo}}
+ \fakeleftdelimiter
+ \xmlflush{#1}
+ \fakerightdelimiter
+ \disabledelimiter
+ } {
+ \xmlflush{#1}
+ }
+ \else
+ \xmlflush{#1}
+ \fi
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:msqrt
+ \sqrt{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups mml:mroot
+ \root{\mmlsecond{#1}}\of{\mmlfirst{#1}}
+\stopxmlsetups
+
+\setupMMLappearance[scripts][\c!alternative=\v!a] % {} rond base
+
+\startxmlsetups mml:msub
+ \doifelse\MMLscriptsalternative\v!a {
+ {\mmlfirst{#1}}_{\mmlsecond{#1}}
+ } {
+ \mmlfirst{#1} _{\mmlsecond{#1}}
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:msup
+ \doifelse\MMLscriptsalternative\v!a {
+ {\mmlfirst{#1}}^{\mmlsecond{#1}}
+ } {
+ \mmlfirst{#1} ^{\mmlsecond{#1}}
+ }
+\stopxmlsetups
+
+\startxmlsetups mml:msubsup
+ \doifelse\MMLscriptsalternative\v!a {
+ {\mmlfirst{#1}}_{\mmlsecond{#1}}^{\mmlthird{#1}}
+ } {
+ \mmlfirst{#1} _{\mmlsecond{#1}}^{\mmlthird{#1}}
+ }
+\stopxmlsetups
+
+\def\mmlexecuteifdefined#1%
+ {\ifx#1\empty
+ \expandafter\secondoftwoarguments
+ \else\ifcsname#1\endcsname
+ \expandafter\expandafter\expandafter\firstoftwoarguments
+ \else
+ \expandafter\expandafter\expandafter\secondoftwoarguments
+ \fi\fi
+ {\csname#1\endcsname}}
+
+\startxmlsetups mml:mover
+% \mathop {
+ \edef\mmlovertoken{\xmlraw{#1}{/mml:*[2]}}
+ \doifelse{\utfmathclass\mmlovertoken}{accent} {
+ \edef\mmlovercommand{\utfmathcommand\mmlovertoken}
+ \mmlexecuteifdefined\mmlovercommand\mathematics{\mmlfirst{#1}}
+ } {
+ \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}
+ \edef\mmlbasecommand{\utfmathfiller\mmlbasetoken}
+ \edef\mmlovercommand{\utfmathfiller\mmlovertoken}
+ \vbox {
+ \mathsurround\zeropoint \ialign {
+ \hss##\hss\crcr
+ \noalign{\kern3\onepoint}%
+ \mmlexecuteifdefined\mmlovercommand{\mathematics{\mmlsecond{#1}}}\crcr
+ \noalign{\kern3\onepoint\nointerlineskip}%
+ \mmlexecuteifdefined\mmlbasecommand{\mathematics{\mmlfirst{#1}}}\crcr
+ }
+ }
+ }
+% }
+% \limits % spoils spacing
+\stopxmlsetups
+
+\startxmlsetups mml:munder
+% \mathop {
+ \edef\mmlundertoken{\xmlraw{#1}{/mml:*[2]}}
+ \doifelse{\utfmathclass\mmlundertoken}{accent} {
+ \edef\mmlundercommand{\utfmathcommand\mmlundertoken}
+ \mmlexecuteifdefined\mmlundercommand\mathematics{\mmlfirst{#1}}
+ } {
+ \edef\mmlbasetoken {\xmlraw{#1}{/mml:*[1]}}
+ \edef\mmlbasecommand {\utfmathfiller\mmlbasetoken}
+ \edef\mmlundercommand{\utfmathfiller\mmlundertoken}
+ \vtop {
+ \mathsurround\zeropoint \ialign {
+ \hss##\hss\crcr
+ \mmlexecuteifdefined\mmlbasecommand {\mathematics{\mmlfirst{#1}}}\crcr
+ \noalign{\kern3\onepoint\nointerlineskip}%
+ \mmlexecuteifdefined\mmlundercommand{\mathematics{\mmlsecond{#1}}}\crcr
+ \noalign{\kern3\onepoint}
+ }
+ }
+ }
+% }
+% \limits % spoils spacing
+\stopxmlsetups
+
+\startxmlsetups mml:munderover
+ \edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}
+ \edef\mmlbasecommand{\utfmathcommand\mmlbasetoken}
+ \mmlexecuteifdefined\mmlbasecommand{\mathematics{\mmlfirst{#1}}}_{\mmlsecond{#1}}^{\mmlthird{#1}}
+\stopxmlsetups
+
+% tables (mml:mtable, mml:mtr, mml:mlabledtr, mml:mtd)
+
+\startxmlsetups mml:mtable % some more attributes need to be supported
+ \vcenter{\ctxlua{lxml.mml.mtable("#1")}}
+\stopxmlsetups
+
+\startxmlsetups mml:mcolumn
+ \ctxlua{lxml.mml.mcolumn("#1")}
+\stopxmlsetups
+
+\def\mmlsetfakewidth#1{\setbox\scratchbox\hbox{#1}\scratchdimen\wd\scratchbox}
+
+\def\mmlmcolumndigitspace {\mmlsetfakewidth {0}\kern\scratchdimen}
+\def\mmlmcolumndigitrule {\mmlsetfakewidth {0}\vrule width \scratchdimen height .2pt depth .2pt\relax}
+\def\mmlmcolumnsymbolrule {\mmlsetfakewidth{\times}\vrule width \scratchdimen height .2pt depth .2pt\relax}
+\def\mmlmcolumnpunctuationrule{\mmlsetfakewidth {.}\vrule width \scratchdimen height .2pt depth .2pt\relax}
+
+\startxmlsetups mml:mspace
+ \begingroup
+ \edef\mmlspacetext{\xmlatt{#1}{spacing}}
+ \ifx\mmlspacetext\empty
+ \!!widtha \xmlattdef{#1}{width} \!!zeropoint % must be string
+ \!!heighta\xmlattdef{#1}{height}\!!zeropoint
+ \!!deptha \xmlattdef{#1}{depth} \!!zeropoint
+ \ifdim\!!heighta=\zeropoint
+ \ifdim\!!deptha=\zeropoint\else
+ \hbox{\vrule\!!depth\!!deptha\!!height\zeropoint\!!width\zeropoint}%
+ \fi
+ \else
+ \hbox{\vrule\!!depth\zeropoint\!!height\!!heighta\!!width\zeropoint}%
+ \fi
+ \ifdim\!!widtha=\zeropoint\else
+ \hskip\!!widtha
+ \fi
+ \else
+ \phantom{\mathstyle{\mmlspacetext}}%
+ \fi
+ \endgroup
+\stopxmlsetups
+
+% later we can do a better job by manipulating node lists
+
+\startxmlsetups mml:mline
+ % new, rather undefined, we need to capture a few keywords
+ \edef\mmllinewidth {\xmlatt{#1}{linethickness}}
+ \edef\mmllinetext {\xmlatt{#1}{spacing}}
+ \edef\mmllinelength{\xmlattdef{#1}{length}\!!zeropoint}
+ \ifx\mmllinewidth\empty
+ \!!deptha.5\linewidth
+ \else
+ \!!deptha.5\dimexpr\mmllinewidth\relax
+ \fi
+ \!!heighta\!!deptha
+ \ifx\mmllinetext\empty
+ \ifx\mmllinelength\empty
+ \!!widtha\zeropoint
+ \else
+ \!!widtha\mmllinelength
+ \fi
+ \else
+ \setbox\scratchbox\hbox{\mathematics{\mathstyle{\mmllinetext}}}% not ok
+ \!!widtha\wd\scratchbox
+ \fi
+ \hbox{\vrule\!!width\!!widtha\!!depth\!!deptha\!!height\!!heighta}
+\stopxmlsetups
+
+\startxmlsetups mml:mglyph % probably never ok
+ \begingroup
+ \edef\mmlglyphfontfamily{\xmlatt {#1}{fontfamily}}
+ \edef\mmlglyphalt {\xmlattdef{#1}{alt}{unknown}}
+ \edef\mmlglyphindex {\xmlatt {#1}{index}}
+ \ifx \mmlglyphfontfamily \empty
+ \hbox{\tttf[no fontfamily specified for \mmlglyphalt]}
+ \else\ifx\mmlglyphindex\empty
+ \hbox{\tttf[no index specified for \mmlglyphalt]}
+ \else
+ \getglyph\mmlglyphfontfamily\mmlglyphindex
+ \fi\fi
+ \endgroup
+\stopxmlsetups
+
+\startxmlsetups mml:maligngroup \stopxmlsetups % will be done when needed
+\startxmlsetups mml:malignmark \stopxmlsetups % will be done when needed
+
+\startxmlsetups mml:none \stopxmlsetups
+\startxmlsetups mml:mprescripts \stopxmlsetups
+
+\startxmlsetups mml:mmultiscripts
+ \ctxlua{lxml.mml.mmultiscripts("#1")}
+\stopxmlsetups
+
+\stopmodule
+
+\protect \endinput
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% TODO:
+
+\startmoduletestsection
+
+\def\xflushXMLstackwith#1#2#3#4% num bgroup egroup whatever
+ {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {#2\relax
+ \ifnum\recurselevel>#1\relax#4\fi
+ \getXMLstackdata\recurselevel
+ #3}}
+
+\def\xflushXMLstackfrom#1#2#3%
+ {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {#2\getXMLstackdata\recurselevel#3}}
+
+% <apply><divide/>
+% <apply><minus/>
+% <apply><minus/><ci>b</ci></apply>
+% <apply><minus/><ci>b</ci></apply>
+% <apply><root/> <ci>a</ci></apply>
+% </apply>
+% <apply><minus/>
+% <apply><minus/><ci>b</ci><ci>b</ci></apply>
+% <apply><minus/><ci>b</ci></apply>
+% <apply><root/> <ci>a</ci></apply>
+% </apply>
+% </apply>
+
+\startxmlsetups mml:minus
+ \doif \MMLsignreduction \v!yes {
+ \setMMLcreset{fn,\MMLcfunctionlist}
+ }
+ \ifcase\XMLstacklevel
+ \or
+ % self
+ \or
+ -\getXMLstackdata\plustwo
+ \else
+ \dostepwiserecurse \plustwo \XMLstacklevel \plusone {
+ \begingroup
+ \doifelse {\getXMLstackname\recurselevel} {apply} {
+ \ifnum\recurselevel=\plustwo
+ \begingroup
+ \dodoifelseMMCfunctioninapply \recurselevel {minus} {
+ \ifnum\XMLstacklevel>\plustwo
+ \endgroup
+ \else
+ \endgroup
+ \MMLcreset
+ \fi
+ } {
+ \endgroup
+ }
+ \else
+ \doifelseMMCfunctioninapply \recurselevel {\MMLcfunctionlist,\MMLcconstructlist} {
+ \MMLcreset
+ } {
+ }
+ \fi
+ } {
+ }
+ \getXMLstackdata\recurselevel
+ \ifnum\recurselevel<\XMLstacklevel\relax
+ -
+ \fi
+ \endgroup
+ }
+ \fi
+\stopxmlsetups
+
+\stopmoduletestsection
diff --git a/tex/context/base/x-mathml.tex b/tex/context/base/x-mathml.tex
new file mode 100644
index 000000000..8ad493eeb
--- /dev/null
+++ b/tex/context/base/x-mathml.tex
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=x-mathml,
+%D version=1999.12.20,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading \MATHML\ Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{x-mathml}
+
+\endinput
diff --git a/tex/context/base/x-mathml.xsd b/tex/context/base/x-mathml.xsd
new file mode 100644
index 000000000..17f0bea2a
--- /dev/null
+++ b/tex/context/base/x-mathml.xsd
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xds="http://www.w3.org/?">
+
+<xsd:schema>
+
+<xsd:element name="imath" type="mathml:math" />
+<xsd:element name="dmath" type="mathml:math" />
+
+</xsd:schema>
diff --git a/tex/context/base/x-newcml.tex b/tex/context/base/x-newcml.tex
new file mode 100644
index 000000000..76d69ed51
--- /dev/null
+++ b/tex/context/base/x-newcml.tex
@@ -0,0 +1,456 @@
+%D \module
+%D [ file=x-newmml,
+%D version=2006.04.09, % reimplementation
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=ChemML,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This used to be an xtag filter using remapping but the
+%D following is nore in sync with the new mathml methods.
+
+\writestatus{loading}{ConTeXt XML Macros / ChemML}
+
+\useXMLfilter[stk]
+
+\unprotect
+
+\def\setupCMLappearance[#1]{\dodoubleargument\getparameters[@@CML#1]}
+
+\defineXMLdirective [chemml] \setupCMLappearance
+
+\defineXMLargument [chem] \automathematics % \rm
+\defineXMLargument [ichem] \inlinemathematics % \rm
+\defineXMLargument [dchem] \displaymathematics % \rm
+
+\def\doifnotXMLparzero#1#2#3%
+ {\ifcase\XMLpar{#1}{#2}{0}\else#3{\XMLpar{#1}{#2}{0}}\fi}
+
+\defineXMLargument [caption] \doCMLcaption
+
+\let\CMLtopcaption\empty
+\let\CMLbotcaption\empty
+
+\chardef\CMLcaptionmode\plusone
+
+\def\doCMLcaption#1%
+ {\ifcase\CMLcaptionmode
+ % can't happen
+ \or
+ \def\CMLbotcaption{#1}%
+ \chardef\CMLcaptionmode\plustwo
+ \or
+ \def\CMLtopcaption{#1}%
+ \chardef\CMLcaptionmode\plusthree
+ \fi}
+
+\def\resetCMLcaption
+ {\let\CMLtopcaption\empty
+ \let\CMLbotcaption\empty
+ \chardef\CMLcaptionmode\plusone}
+
+\resetCMLcaption
+
+\def\doCMLtext#1%
+ {\ifx\CMLtopcaption\empty
+ \setbox0\null
+ \else
+ \setbox0\hbox{\txx\setstrut\strut\ignorespaces\CMLtopcaption\unskip}%
+ \fi
+ \setbox2\hbox{\ignorespaces\strut#1\unskip}%
+ \ifx\CMLbotcaption\empty
+ \setbox4\null
+ \else
+ \setbox4\hbox{\txx\setstrut\strut\ignorespaces\CMLbotcaption\unskip}%
+ \fi
+ \scratchdimen=\wd2\advance\scratchdimen-.5em
+ \ifdim\wd0>\scratchdimen
+ \setbox0\hbox spread .5em{\hss\box0\hss}%
+ \fi
+ \ifdim\wd4>\scratchdimen
+ \setbox4\hbox spread .5em{\hss\box4\hss}%
+ \fi
+ \setbox6=\vbox
+ {\offinterlineskip\halign{\hss##\hss\cr\copy0\cr\copy2\cr\copy4\cr}}%
+ \hbox{\lower\ht4\hbox{\lower\dp2\box6}}}
+
+\def\CMLscript#1%
+ {$\scriptscriptstyle\ignorespaces#1\unskip$}
+
+% \startsetups cml:flush:all
+% \ignorespaces
+% \XMLallnamed{atom,bond,singlebond,doublebond,triplebond}
+% \removeunwantedspaces
+% \stopsetups
+
+\newcounter\currentCMLatom
+\newcounter\nofCMLatoms
+
+\defineXMLenvironmentsave
+ [atom]
+ [n=0,weight=0,protons=0,charge=0]
+ {\directsetup{cml:atom:start}}
+ {\directsetup{cml:atom:stop}}
+
+\startsetups cml:atom:start
+ \removeunwantedspaces
+\stopsetups
+
+\startsetups cml:atom:stop
+ \increment\currentCMLatom
+ \resetCMLcaption
+ \doCMLtext {
+ \bgroup
+ \lohi {
+ \doifnotXMLparzero{atom}{protons}\CMLscript
+ } {
+ \doifnotXMLparzero{atom}{weight}\CMLscript
+ }
+ \ignorespaces
+ \XMLflush{atom}
+ \removeunwantedspaces
+ \lohi {
+ \doifnotXMLparzero{atom}{n}\CMLscript
+ } {
+ \ifnum\nofCMLatoms=\currentCMLatom\relax
+ \doifnotXMLparzero{ion}{charge}\CMLscript
+ \else
+ \doifnotXMLparzero{atom}{charge}\CMLscript
+ \fi
+ }
+ \egroup
+ }
+ \ignorespaces
+\stopsetups
+
+\defineXMLnested % why not environment
+ [molecule]
+ [n=0]
+ {\directsetup{cml:molecule:start}}
+ {\directsetup{cml:molecule:stop}}
+
+\startsetups cml:molecule:start
+ \removeunwantedspaces
+ \begingroup
+ \startsavingXMLelements
+ \ignorespaces
+\stopsetups
+
+\startsetups cml:molecule:stop
+ \removeunwantedspaces
+ \stopsavingXMLelements
+ \resetCMLcaption
+ \XMLfirstnamed{caption}
+ \doCMLtext {
+ \newcounter\currentCMLatom
+ \newcounter\nofCMLatoms
+ \doifnotXMLparzero{molecule}{n}\firstofoneargument
+ \ignorespaces
+ \XMLallnamed{atom,ion,bond,singlebond,doublebond,triplebond}
+ \removeunwantedspaces
+ }
+ \endgroup
+ \ignorespaces
+\stopsetups
+
+\setupCMLappearance [ion] [\c!alternative=\v!a]
+
+\defineXMLnested
+ [ion]
+ [n=0,charge=0]
+ {\directsetup{cml:ion:start}}
+ {\directsetup{cml:ion:stop}}
+
+\startsetups cml:ion:start
+ \begingroup
+ \startsavingXMLelements
+\ignorespaces
+\stopsetups
+
+\startsetups cml:ion:stop
+ \removeunwantedspaces
+ \stopsavingXMLelements
+ \resetCMLcaption
+ \XMLfirstnamed{caption}
+ \doCMLtext {
+ \newcounter\currentCMLatom
+ \newcounter\nofCMLatoms
+ \doifnotXMLparzero{ion}{n}\firstofoneargument
+ \doifelse\@@CMLionalternative\v!b {
+ [\ignorespaces
+ \XMLallnamed{atom,bond,singlebond,doublebond,triplebond}
+ \removeunwantedspaces]
+ \high {
+ \doifnotXMLparzero{ion}{charge}\CMLscript
+ }
+ } {
+ \countXMLnamedstack{atom}
+ \edef\nofCMLatoms{\the\scratchcounter}% todo: \nofXMLchildren
+ \ignorespaces
+ \XMLallnamed{atom,bond,singlebond,doublebond,triplebond}
+ \removeunwantedspaces
+ }
+ }
+ \endgroup
+ \ignorespaces
+\stopsetups
+
+\let\doCMLsymbol\gobbleoneargument
+\let\doCMLarrow \gobblethreearguments
+
+\defineXMLenvironment
+ [reaction]
+ {\directsetup{cml:reaction:start}}
+ {\directsetup{cml:reaction:stop}}
+
+\startsetups cml:reaction:start
+ \begingroup
+ \let\doCMLsymbol\dodoCMLsymbol
+ \let\doCMLarrow \dodoCMLarrow
+\stopsetups
+
+\startsetups cml:reaction:stop
+ \endgroup
+\stopsetups
+
+\defineXMLcommand [plus] {\doCMLsymbol{+}}
+\defineXMLcommand [minus] {\doCMLsymbol{-}}
+\defineXMLcommand [equal] {\doCMLsymbol{=}}
+
+\def\dodoCMLsymbol#1%
+ {\removeunwantedspaces\quad
+ \mathop{#1}%
+ \quad\kern\zeropoint\ignorespaces}
+
+\defineXMLcommand [gives] {\resetCMLcaption\doCMLgives}
+\defineXMLcommand [equilibrium] {\resetCMLcaption\doCMLequilibrium}
+\defineXMLcommand [mesomeric] {\resetCMLcaption\doCMLmesomeric}
+
+\def\dodoCMLarrow#1%
+ {\removeunwantedspaces\quad
+ \doCMLtext{$\vcenter{\offinterlineskip\halign{##\cr\hskip3em\cr#1\cr}}$}%
+ \quad\kern\zeropoint\ignorespaces}
+
+\def\doCMLgives
+ {\doCMLarrow{\rightarrowfill}}
+
+\def\doCMLequilibrium
+ {\doCMLarrow{\rightarrowfill\cr\noalign{\nointerlineskip}\leftarrowfill}}
+
+\def\doCMLmesomeric
+ {\doCMLarrow{$\leftarrow\hskip-1em$\rightarrowfill}}
+
+\defineXMLcommand [bond] [n=1] \doCMLbond
+\defineXMLcommand [singlebond] [n=1] \doCMLsinglebond
+\defineXMLcommand [doublebond] [n=1] \doCMLdoublebond
+\defineXMLcommand [triplebond] [n=1] \doCMLtriplebond
+
+\def\doCMLbond
+ {\ifcase\XMLop{n}\relax
+ \doCMLsinglebond
+ \or
+ \doCMLdoublebond
+ \or
+ \doCMLtriplebond
+ \fi}
+
+\def\doCMLbond
+ {\removeunwantedspaces
+ \hrule \!!width \hsize \!!height .1ex\relax % .4pt
+ \ignorespaces}
+
+\def\dodoCMLbond#1#2#3%
+ {\removeunwantedspaces
+ \begingroup
+ \setbox\scratchbox\hbox{$M$}%
+ \vbox to \ht\scratchbox
+ {\hsize\wd\scratchbox
+ \vskip.1\wd\scratchbox
+ #1\vfill#2\vfill#3%
+ \vskip.1\wd\scratchbox}%
+ \endgroup
+ \ignorespaces}
+
+\def\doCMLsinglebond{\dodoCMLbond\relax \doCMLbond\relax }
+\def\doCMLdoublebond{\dodoCMLbond\doCMLbond\relax \doCMLbond}
+\def\doCMLtriplebond{\dodoCMLbond\doCMLbond\doCMLbond\doCMLbond}
+
+% extensions (uses m-chemic, which thenneeds to be loaded)
+
+% <dchem>
+% <structure>
+% <component>
+% <graphic>SIX,B</graphic>
+% <graphic>R135</graphic>
+% </component>
+% <component>
+% <graphic>R246</graphic>
+% </component>
+% <component>
+% <graphic>RZ</graphic>
+% <text>A,B,C,D,E,F</text>
+% </component>
+% <component>
+% <graphic>Z</graphic>
+% <oxidation n="3">A</oxidation>
+% <annotation location="tl">
+% <text>B</text>
+% <caption>x</caption>
+% </annotation>
+% <oxidation n="3" sign="+">C</oxidation>
+% <text>D,E,F</text>
+% </component>
+% </structure>
+% <structure>
+% <component>
+% <graphic>SIX,B</graphic>
+% <graphic>r135</graphic>
+% </component>
+% <component>
+% <graphic>R246</graphic>
+% </component>
+% <component>
+% <graphic>RZ</graphic>
+% <text>A,B,C,D,E,F</text>
+% </component>
+% </structure>
+% </dchem>
+
+\ifx\XMLttoks \undefined \newtoks \XMLttoks \fi
+\ifx\XMLgtoks \undefined \newtoks \XMLgtoks \fi
+
+\ifx\startchemical\undefined
+ \def\startchemical {\hbox{module chemic is not loaded}}
+ \let\stopchemical \relax
+ \def\chemical[#1][#2]{}
+\fi
+
+\defineXMLenvironment
+ [structure]
+ {\startchemical
+ \ignorespaces}
+ {\removeunwantedspaces
+ \stopchemical}
+
+\defineXMLenvironment
+ [component]
+ {\global\XMLgtoks\emptytoks
+ \global\XMLttoks\emptytoks
+ \defineXMLargument[graphic]{\dogetCMLgraphic}%
+ \defineXMLargument[text] {\dogetCMLtext}%
+ \ignorespaces}
+ {\removeunwantedspaces
+ \expanded{\chemical[\the\XMLgtoks][\the\XMLttoks]}%
+ \ignorespaces}
+
+\def\dogetCMLgraphic#1%
+ {\doifelsenothing{\the\XMLgtoks}
+ {\uppercase{\doglobal\appendtoks #1\to\XMLgtoks}}
+ {\uppercase{\doglobal\appendtoks,#1\to\XMLgtoks}}%
+ \ignorespaces}
+
+\def\dogetCMLtext#1%
+ {\doifelsenothing{\the\XMLttoks}
+ {\uppercase{\doglobal\appendtoks #1\to\XMLttoks}}
+ {\uppercase{\doglobal\appendtoks,#1\to\XMLttoks}}%
+ \ignorespaces}
+
+\defineXMLargument
+ [oxidation]
+ [sign=,n=1]
+ {\doCMLoxidation}
+
+\def\doCMLoxidation#1%
+ {\expanded{\dogetCMLtext{\noexpand\chemicaloxidation{\XMLop{sign}}{\XMLop{n}}{#1}}}%
+ \ignorespaces}
+
+% \defineXMLenvironment
+% [annotation]
+% [location=]
+% {\defineXMLsave[text]%
+% \defineXMLsave[caption]}
+% {\removeunwantedspaces
+% \processaction
+% [\XMLpar{annotation}{location}{r}]
+% [ t=>\dodoCMLannotation\chemicaltop,
+% b=>\dodoCMLannotation\chemicalbottom,
+% l=>\dodoCMLannotation\chemicalleft,
+% r=>\dodoCMLannotation\chemicalright,
+% lc=>\dodoCMLannotation\chemicalleftcentered,
+% rc=>\dodoCMLannotation\chemicalrightcentered,
+% tl=>\dodoCMLannotation\chemicaltopleft,
+% bl=>\dodoCMLannotation\chemicalbottomleft,
+% tr=>\dodoCMLannotation\chemicaltopright,
+% br=>\dodoCMLannotation\chemicalbottomright,
+% lt=>\dodoCMLannotation\chemicallefttop,
+% lb=>\dodoCMLannotation\chemicalleftbottom,
+% rt=>\dodoCMLannotation\chemicalrighttop,
+% rb=>\dodoCMLannotation\chemicalrightbottom,
+% x=>\dodoCMLannotation\chemicaltighttext,
+% sl=>\dodoCMLannotation\chemicalsmashedleft,
+% sm=>\dodoCMLannotation\chemicalsmashedmiddle,
+% sr=>\dodoCMLannotation\chemicalsmashedright]%
+% \ignorespaces}
+
+% todo: generic mapper t -> top etc
+
+\mapXMLvalue {cml:a:l} {t} {\dodoCMLannotation\chemicaltop}
+\mapXMLvalue {cml:a:l} {b} {\dodoCMLannotation\chemicalbottom}
+\mapXMLvalue {cml:a:l} {l} {\dodoCMLannotation\chemicalleft}
+\mapXMLvalue {cml:a:l} {r} {\dodoCMLannotation\chemicalright}
+\mapXMLvalue {cml:a:l} {lc} {\dodoCMLannotation\chemicalleftcentered}
+\mapXMLvalue {cml:a:l} {rc} {\dodoCMLannotation\chemicalrightcentered}
+\mapXMLvalue {cml:a:l} {tl} {\dodoCMLannotation\chemicaltopleft}
+\mapXMLvalue {cml:a:l} {bl} {\dodoCMLannotation\chemicalbottomleft}
+\mapXMLvalue {cml:a:l} {tr} {\dodoCMLannotation\chemicaltopright}
+\mapXMLvalue {cml:a:l} {br} {\dodoCMLannotation\chemicalbottomright}
+\mapXMLvalue {cml:a:l} {lt} {\dodoCMLannotation\chemicallefttop}
+\mapXMLvalue {cml:a:l} {lb} {\dodoCMLannotation\chemicalleftbottom}
+\mapXMLvalue {cml:a:l} {rt} {\dodoCMLannotation\chemicalrighttop}
+\mapXMLvalue {cml:a:l} {rb} {\dodoCMLannotation\chemicalrightbottom}
+\mapXMLvalue {cml:a:l} {x} {\dodoCMLannotation\chemicaltighttext}
+\mapXMLvalue {cml:a:l} {sl} {\dodoCMLannotation\chemicalsmashedleft}
+\mapXMLvalue {cml:a:l} {sm} {\dodoCMLannotation\chemicalsmashedmiddle}
+\mapXMLvalue {cml:a:l} {sr} {\dodoCMLannotation\chemicalsmashedright}
+
+% \mapXMLvalue {cml:a:l} {cl} {\dodoCMLannotation\chemicalleftcentered}
+% \mapXMLvalue {cml:a:l} {cr} {\dodoCMLannotation\chemicalrightcentered}
+% \mapXMLvalue {cml:a:l} {lt} {\dodoCMLannotation\chemicaltopleft}
+% \mapXMLvalue {cml:a:l} {lb} {\dodoCMLannotation\chemicalbottomleft}
+% \mapXMLvalue {cml:a:l} {rt} {\dodoCMLannotation\chemicaltopright}
+% \mapXMLvalue {cml:a:l} {rb} {\dodoCMLannotation\chemicalbottomright}
+% \mapXMLvalue {cml:a:l} {tl} {\dodoCMLannotation\chemicallefttop}
+% \mapXMLvalue {cml:a:l} {bl} {\dodoCMLannotation\chemicalleftbottom}
+% \mapXMLvalue {cml:a:l} {tr} {\dodoCMLannotation\chemicalrighttop}
+% \mapXMLvalue {cml:a:l} {br} {\dodoCMLannotation\chemicalrightbottom}
+% \mapXMLvalue {cml:a:l} {ls} {\dodoCMLannotation\chemicalsmashedleft}
+% \mapXMLvalue {cml:a:l} {ms} {\dodoCMLannotation\chemicalsmashedmiddle}
+% \mapXMLvalue {cml:a:l} {rs} {\dodoCMLannotation\chemicalsmashedright}
+
+\defineXMLenvironment
+ [annotation]
+ [location=]
+ {\pushXMLmeaning{text}%
+ \pushXMLmeaning{caption}%
+ \defineXMLsave[text]%
+ \defineXMLsave[caption]}
+ {\removeunwantedspaces
+ \XMLval{cml:a:l}{\XMLpar{annotation}{location}{r}}{\XMLflush{text}}%
+ \popXMLmeaning{text}%
+ \popXMLmeaning{caption}%
+ \ignorespaces}
+
+\def\dodoCMLannotation#1%
+ {\expanded{\dogetCMLtext{\noexpand#1{\XMLflush{caption}}{\XMLflush{text}}}}}
+
+\defineXMLenvironment
+ [forever]
+ {\left[}
+ {\right]}
+
+\protect \endinput
diff --git a/tex/context/base/x-newmme.tex b/tex/context/base/x-newmme.tex
new file mode 100644
index 000000000..5e17ea7a4
--- /dev/null
+++ b/tex/context/base/x-newmme.tex
@@ -0,0 +1,423 @@
+%D \module
+%D [ file=m-newmme,
+%D version=2005.06.10, % 1999.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=MathML Entities,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt XML Macros / MathML Entities}
+
+\unprotect
+
+%D Used in the manual:
+
+\def\showMMLentity#1%
+ {\bgroup
+ \doifXMLentityelse{#1}
+ {\let\MMLleft\empty\let\MMLright\empty\mathematics{\getXMLentity{#1}{}}}
+ {\getXMLentity{unknown}}%
+ \egroup}
+
+\newbox\unknownXMLentity
+\setbox\unknownXMLentity\hbox{\inframed[\c!strut=\v!no,\c!offset=1pt]{\ttx ?}}
+
+\defineXMLentity [unknown] {\copy\unknownXMLentity}
+
+%D A (not really needed) precaution:
+
+\ifx\blackboard\undefined
+ \def\blackboard{\ifx\Bbb\undefined\else\expandafter\Bbb\fi}
+\fi
+
+%D Basic entities, greek:
+
+\defineXMLentity [alpha] {\mathematics \alpha}
+\defineXMLentity [beta] {\mathematics \beta}
+\defineXMLentity [gamma] {\mathematics \gamma}
+\defineXMLentity [delta] {\mathematics \delta}
+\defineXMLentity [epsilon] {\mathematics \epsilon}
+\defineXMLentity [zeta] {\mathematics \zeta}
+\defineXMLentity [eta] {\mathematics \eta}
+\defineXMLentity [theta] {\mathematics \theta}
+\defineXMLentity [iota] {\mathematics \iota}
+\defineXMLentity [kappa] {\mathematics \kappa}
+\defineXMLentity [lambda] {\mathematics \lambda}
+\defineXMLentity [theta] {\mathematics \theta}
+\defineXMLentity [mu] {\mathematics \mu}
+\defineXMLentity [nu] {\mathematics \nu}
+\defineXMLentity [xi] {\mathematics \xi}
+\defineXMLentity [pi] {\mathematics \pi}
+\defineXMLentity [rho] {\mathematics \rho}
+\defineXMLentity [sigma] {\mathematics \sigma}
+\defineXMLentity [tau] {\mathematics \tau}
+\defineXMLentity [upsilon] {\mathematics \upsilon}
+\defineXMLentity [phi] {\mathematics \phi}
+\defineXMLentity [chi] {\mathematics \chi}
+\defineXMLentity [psi] {\mathematics \psi}
+\defineXMLentity [omega] {\mathematics \omega}
+
+\defineXMLentity [varepsilon] {\mathematics \varepsilon}
+\defineXMLentity [vartheta] {\mathematics \vartheta}
+\defineXMLentity [varpi] {\mathematics \varpi}
+\defineXMLentity [varrho] {\mathematics \varrho}
+\defineXMLentity [varsigma] {\mathematics \varsigma}
+\defineXMLentity [varphi] {\mathematics \varphi}
+
+\defineXMLentity [epsilonv] {\mathematics \varepsilon}
+\defineXMLentity [thetav] {\mathematics \vartheta}
+\defineXMLentity [piv] {\mathematics \varpi}
+\defineXMLentity [rhov] {\mathematics \varrho}
+\defineXMLentity [sigmav] {\mathematics \varsigma}
+\defineXMLentity [phiv] {\mathematics \varphi}
+
+\defineXMLentity [epsi] {\mathematics \epsilon}
+\defineXMLentity [epsiv] {\mathematics \varepsilon}
+
+\defineXMLentity [Alpha] {A}
+\defineXMLentity [Beta] {B}
+\defineXMLentity [Gamma] {\mathematics \Gamma}
+\defineXMLentity [Delta] {\mathematics \Delta}
+\defineXMLentity [Epsilon] {E}
+\defineXMLentity [Zeta] {Z}
+\defineXMLentity [Eta] {N}
+\defineXMLentity [Theta] {\mathematics \Theta}
+\defineXMLentity [Iota] {I}
+\defineXMLentity [Kappa] {K}
+\defineXMLentity [Lambda] {\mathematics \Lambda}
+\defineXMLentity [Mu] {M}
+\defineXMLentity [Nu] {N}
+\defineXMLentity [Xi] {\mathematics \Xi}
+\defineXMLentity [Pi] {\mathematics \Pi}
+\defineXMLentity [Ro] {R}
+\defineXMLentity [Sigma] {\mathematics \Sigma}
+\defineXMLentity [Tau] {T}
+\defineXMLentity [Upsilon] {\mathematics \Upsilon}
+\defineXMLentity [Phi] {\mathematics \Phi}
+\defineXMLentity [Chi] {X}
+\defineXMLentity [Psi] {\mathematics \Psi}
+\defineXMLentity [Omega] {\mathematics \Omega}
+
+%D Basic entities, hebrew:
+
+\defineXMLentity [aleph] {\mathematics \aleph}
+
+%D Basic entities, functions:
+
+\defineXMLentity [abs] {\mathopnolimits{abs}}
+\defineXMLentity [arg] {\mathopnolimits{arg}}
+\defineXMLentity [codomain] {\mathopnolimits{codomain}}
+\defineXMLentity [curl] {\mathopnolimits{curl}}
+\defineXMLentity [determinant] {\mathopnolimits{det}}
+\defineXMLentity [divergence] {\mathopnolimits{div}}
+\defineXMLentity [domain] {\mathopnolimits{domain}}
+\defineXMLentity [false] {\mathopnolimits{false}}
+\defineXMLentity [gcd] {\mathopnolimits{gcd}}
+\defineXMLentity [grad] {\mathopnolimits{grad}}
+\defineXMLentity [identity] {\mathopnolimits{id}}
+\defineXMLentity [image] {\mathopnolimits{image}}
+\defineXMLentity [lcm] {\mathopnolimits{lcm}}
+\defineXMLentity [max] {\mathopnolimits{max}}
+\defineXMLentity [median] {\mathopnolimits{median}}
+\defineXMLentity [min] {\mathopnolimits{min}}
+\defineXMLentity [mode] {\mathopnolimits{mode}}
+\defineXMLentity [mod] {\mathopnolimits{mod}}
+\defineXMLentity [notanumber] {\mathopnolimits{NaN}}
+\defineXMLentity [otherwise] {\mathopnolimits{otherwise}}
+\defineXMLentity [true] {\mathopnolimits{true}}
+\defineXMLentity [declare] {\mathopnolimits{declare}}
+\defineXMLentity [as] {\mathopnolimits{as}}
+\defineXMLentity [polar] {\mathopnolimits{Polar}}
+
+\defineXMLentity [mathematicald] {d}
+
+\defineXMLentity [imaginaryi] {{\rm i}}
+\defineXMLentity [differentiald] {\partial}
+\defineXMLentity [exponentiale] {{\rm e}}
+\defineXMLentity [capitaldifferentiald] {D}
+
+\defineXMLentity [ii] {\getXMLentity{imaginaryi}}
+\defineXMLentity [dd] {\getXMLentity{differentiald}}
+\defineXMLentity [ee] {\getXMLentity{exponentiale}}
+\defineXMLentity [DD] {\getMMLentity{capitaldifferentiald}}
+
+\defineXMLentity [ImaginaryI] {\getXMLentity{imaginaryi}}
+\defineXMLentity [DifferentialD] {\getXMLentity{differentiald}}
+\defineXMLentity [ExponentialE] {\getXMLentity{exponentiale}}
+\defineXMLentity [CapitalDifferentialD] {\getXMLentity{differentiald}}
+
+\defineXMLentity [NaN] {\getXMLentity{notanumber}}
+\defineXMLentity [NotANumber] {\getXMLentity{notanumber}}
+
+\defineXMLentity [and] {\wedge}
+\defineXMLentity [exists] {\exists}
+\defineXMLentity [forall] {\forall}
+\defineXMLentity [implies] {\Rightarrow}
+\defineXMLentity [not] {\neg}
+\defineXMLentity [or] {\vee}
+\defineXMLentity [xor] {\mathopnolimits{xor}}
+
+\defineXMLentity [imaginary] {\Im}
+\defineXMLentity [real] {\Re}
+
+\defineXMLentity [lceiling] {\lceil}
+\defineXMLentity [rceiling] {\rceil}
+
+\defineXMLentity [lfloor] {\lfloor}
+\defineXMLentity [rfloor] {\rfloor}
+
+\defineXMLentity [ne] {\neq}
+\defineXMLentity [neq] {\neq}
+\defineXMLentity [gt] {>}
+\defineXMLentity [lt] {<}
+\defineXMLentity [ge] {\geq}
+\defineXMLentity [geq] {\geq}
+\defineXMLentity [le] {\leq}
+\defineXMLentity [leq] {\leq}
+
+\defineXMLentity [equivalent] {\equiv}
+\defineXMLentity [equiv] {\equiv}
+\defineXMLentity [approx] {\approx}
+
+\defineXMLentity [factorof] {\mid}
+\defineXMLentity [mapsto] {\mapsto}
+
+\defineXMLentity [int] {\int}
+\defineXMLentity [prime] {\prime}
+\defineXMLentity [laplacian] {\nabla^2}
+\defineXMLentity [partial] {\partial}
+
+\defineXMLentity [union] {\cup}
+\defineXMLentity [intersect] {\cap}
+\defineXMLentity [in] {\in}
+\defineXMLentity [notin] {\not\in}
+\defineXMLentity [subset] {\subset}
+\defineXMLentity [prsubset] {\subseteq}
+\defineXMLentity [notsubset] {\not\subset}
+\defineXMLentity [notprsubset] {\not\subseteq}
+\defineXMLentity [setdiff] {\setminus}
+
+\defineXMLentity [card] {\vert}
+\defineXMLentity [cartesianproduct] {\times}
+
+\defineXMLentity [sum] {\sum}
+\defineXMLentity [prod] {\prod}
+\defineXMLentity [product] {\prod}
+\defineXMLentity [lim] {\lim}
+
+\defineXMLentity [exp] {\mathopnolimits{exp}} % {\exp}
+\defineXMLentity [ln] {\mathopnolimits{ln}} % {\ln}
+\defineXMLentity [log] {\mathopnolimits{log}} % {\log}
+
+\defineXMLentity [sin] {\mathopnolimits{sin}}
+\defineXMLentity [arcsin] {\mathopnolimits{arcsin}}
+\defineXMLentity [sinh] {\mathopnolimits{sinh}}
+\defineXMLentity [arcsinh] {\mathopnolimits{arcsinh}}
+\defineXMLentity [cos] {\mathopnolimits{cos}}
+\defineXMLentity [arccos] {\mathopnolimits{arccos}}
+\defineXMLentity [cosh] {\mathopnolimits{cosh}}
+\defineXMLentity [arccosh] {\mathopnolimits{arccosh}}
+\defineXMLentity [tan] {\mathopnolimits{tan}}
+\defineXMLentity [arctan] {\mathopnolimits{arctan}}
+\defineXMLentity [tanh] {\mathopnolimits{tanh}}
+\defineXMLentity [arctanh] {\mathopnolimits{arctanh}}
+\defineXMLentity [cot] {\mathopnolimits{cot}}
+\defineXMLentity [arccot] {\mathopnolimits{arccot}}
+\defineXMLentity [coth] {\mathopnolimits{coth}}
+\defineXMLentity [arccoth] {\mathopnolimits{arccoth}}
+\defineXMLentity [csc] {\mathopnolimits{csc}}
+\defineXMLentity [arccsc] {\mathopnolimits{arccsc}}
+\defineXMLentity [csch] {\mathopnolimits{csch}}
+\defineXMLentity [arccsch] {\mathopnolimits{arccsch}}
+\defineXMLentity [sec] {\mathopnolimits{sec}}
+\defineXMLentity [arcsec] {\mathopnolimits{arcsec}}
+\defineXMLentity [sech] {\mathopnolimits{sech}}
+\defineXMLentity [arcsech] {\mathopnolimits{arcsech}}
+
+\defineXMLentity [transpose] {^{\rm T}}
+
+\defineXMLentity [plusminus] {\mathematics{\pm}}
+\defineXMLentity [minusplus] {\mathematics{\mp}}
+
+\defineXMLentity [vectorproduct] {\times}
+\defineXMLentity [scalarproduct] {\cdot}
+\defineXMLentity [outerproduct] {\otimes}
+
+\defineXMLentity [integers] {\integers}
+\defineXMLentity [reals] {\reals}
+\defineXMLentity [rationals] {\rationals}
+\defineXMLentity [naturalnumbers] {\naturalnumbers}
+\defineXMLentity [complexes] {\complexes}
+\defineXMLentity [primes] {\primes}
+
+\defineXMLentity [emptyset] {\emptyset}
+\defineXMLentity [pi] {\pi}
+\defineXMLentity [eulergamma] {\gamma}
+\defineXMLentity [infinity] {\mathematics{\infty}}
+
+\defineXMLentity [InvisibleTimes] {}
+\defineXMLentity [InvisibleComma] {}
+\defineXMLentity [ApplyFunction] {}
+
+\defineXMLentity [it] {\getXMLentity{InvisibleTines}}
+\defineXMLentity [ic] {\getXMLentity{InvisibleComma}}
+\defineXMLentity [af] {\getXMLentity{ApplyFunction}}
+
+\defineXMLentity [PlusMinus] {\getXMLentity{plusminus}}
+
+\defineXMLentity [infin] {\getXMLentity{infinity}}
+\defineXMLentity [infty] {\getXMLentity{infinity}}
+\defineXMLentity [part] {\getXMLentity{differentiald}}
+
+\defineXMLentity [RightArrow] {\normalorfiller\rightarrow\rightarrowfill}
+\defineXMLentity [LeftArrow] {\normalorfiller\leftarrow\leftarrowfill}
+\defineXMLentity [UnderBrace] {\normalorfiller\empty\upbracefill}
+\defineXMLentity [OverBrace] {\normalorfiller\empty\downbracefill}
+\defineXMLentity [UnderBar] {\normalorfiller\hrule\hrulefill}
+\defineXMLentity [OverBar] {\normalorfiller\hrule\hrulefill}
+\defineXMLentity [Hat] {\normalorfiller\empty\empty} % todo
+
+\defineXMLentity [downarrow] {\mathortext\downarrow\empty}
+\defineXMLentity [uparrow] {\mathortext\uparrow\empty}
+
+\defineXMLentity [Tab] {\hskip4em}
+\defineXMLentity [NewLine] {\mathortext\empty\crlf}
+\defineXMLentity [IndentingNewLine] {\mathortext\empty\crlf}
+
+\defineXMLentity [NoBreak] {\nobreak}
+\defineXMLentity [GoodBreak] {\goodbreak}
+\defineXMLentity [BadBreak] {\nobreak}
+
+\defineXMLentity [Space] {\getXMLentity{MediumSpace}}
+\defineXMLentity [NonBreakingSpace] {\getXMLentity{MediumSpace}}
+\defineXMLentity [ZeroWidthSpace] {}
+
+\def\somespaceentity#1#2%
+ {\mathortext
+ {\mskip#1mu}
+ {\ifvmode\dontleavehmode\else\unskip\fi\hskip#2em\strut\hskip\zeropoint\ignorespaces}%
+ \relax}
+
+\defineXMLentity [VeryThinSpace] {\somespaceentity {2}{.125}}
+\defineXMLentity [ThinSpace] {\somespaceentity {3}{.25}}
+\defineXMLentity [MediumSpace] {\somespaceentity {4}{.5}}
+\defineXMLentity [ThickSpace] {\somespaceentity {5}{1}}
+\defineXMLentity [NegativeVeryThinSpace] {\somespaceentity{-2}{-.125}}
+\defineXMLentity [NegativeThinSpace] {\somespaceentity{-3}{-.25}}
+\defineXMLentity [NegativeMediumSpace] {\somespaceentity{-4}{-.5}}
+\defineXMLentity [NegativeThickSpace] {\somespaceentity{-5}{-1}}
+
+\defineXMLentity [NegVeryThinSpace] {\getXMLentity{NegativeVeryThinSpace}}
+\defineXMLentity [NegThinSpace] {\getXMLentity{NegativeThinSpace}}
+\defineXMLentity [NegMediumSpace] {\getXMLentity{NegativeMediumSpace}}
+\defineXMLentity [NegThickSpace] {\getXMLentity{NegativeThickSpace}}
+
+\defineXMLentity [nbsp] {\getXMLentity{NonBreakingSpace}}
+\defineXMLentity [thinsp] {\getXMLentity{ThinSpace}}
+\defineXMLentity [medsp] {\getXMLentity{MediumSpace}}
+\defineXMLentity [thicksp] {\getXMLentity{ThickSpace}}
+
+\defineXMLentity [larr] {\getXMLentity{LeftArrow}}
+\defineXMLentity [rarr] {\getXMLentity{RightArrow}}
+
+\ifx\MMLleft \undefined \let\MMLleft \firstofoneargument \fi
+\ifx\MMLright\undefined \let\MMLright\firstofoneargument \fi
+
+\defineXMLentity [lbrace] {\normalordelimiter{\{}{\MMLleft \{}}
+\defineXMLentity [rbrace] {\normalordelimiter{\}}{\MMLright\}}}
+\defineXMLentity [lbracket] {\normalordelimiter{[}{\MMLleft [}}
+\defineXMLentity [rbracket] {\normalordelimiter{]}{\MMLright]}}
+\defineXMLentity [lparenthesis] {\normalordelimiter{(}{\MMLleft (}}
+\defineXMLentity [rparenthesis] {\normalordelimiter{)}{\MMLright)}}
+\defineXMLentity [langle] {\normalordelimiter{\langle}{\MMLleft \langle}}
+\defineXMLentity [rangle] {\normalordelimiter{\rangle}{\MMLright\rangle}}
+
+\defineXMLentity [lang] {\getXMLentity{langle}}
+\defineXMLentity [rang] {\getXMLentity{rangle}}
+\defineXMLentity [lbrack] {\getXMLentity{lbracket}}
+\defineXMLentity [rbrack] {\getXMLentity{rbracket}}
+\defineXMLentity [lparent] {\getXMLentity{lparenthesis}}
+\defineXMLentity [rparent] {\getXMLentity{rparenthesis}}
+
+\defineXMLentity [\letterleftbrace ] {\getXMLentity{lbrace}}
+\defineXMLentity [\letterrightbrace] {\getXMLentity{rbrace}}
+
+\defineXMLentity [{[}] {\getXMLentity{lbracket}}
+\defineXMLentity [{]}] {\getXMLentity{rbracket}}
+\defineXMLentity [{(}] {\getXMLentity{lparenthesis}}
+\defineXMLentity [{)}] {\getXMLentity{rparenthesis}}
+
+
+\defineXMLentity [times] {\mathematics{\times}}
+\defineXMLentity [minus] {\mathematics{-}}
+\defineXMLentity [plus] {\mathematics{+}}
+\defineXMLentity [plusmn] {\mathematics{\pm}}
+
+\defineXMLentity [nabla] {\nabla}
+
+\def\myspecialnormalvert {\mathematics{\vert}}
+\def\myspecialstretchvert{\;\vrule\;}
+
+\defineXMLentity [,] {{,}}
+\defineXMLentity [.] {{.}}
+\defineXMLentity [+] {+}
+\defineXMLentity [-] {-}
+\defineXMLentity [|] {\myspecialnormalvert}
+\defineXMLentity [/] {/}
+\defineXMLentity [*] {\times}
+\defineXMLentity [=] {=}
+
+% \defineXMLentity [(] {(}
+% \defineXMLentity [)] {)}
+% \defineXMLentity [<] {\mathematics{<}}
+% \defineXMLentity [>] {\mathematics{>}}
+
+% \defineXMLentity [(] {\MMLleft (}
+% \defineXMLentity [)] {\MMLright)}
+
+% \defineXMLentity [{[}] {\MMLleft [}
+% \defineXMLentity [{]}] {\MMLright]}
+
+\defineXMLentity [++] {++}
+\defineXMLentity [--] {--}
+\defineXMLentity [//] {//}
+\defineXMLentity [**] {\times\times}
+\defineXMLentity [==] {==}
+\defineXMLentity [...] {\cdots}
+
+\defineXMLentity [quot] {"}
+
+\defineXMLentity [triangle] {\mathematics\triangle}
+\defineXMLentity [otimes] {\mathematics\otimes}
+\defineXMLentity [oplus] {\mathematics\oplus}
+\defineXMLentity [cup] {\mathematics\cup}
+\defineXMLentity [cap] {\mathematics\cap}
+\defineXMLentity [sdot] {\mathematics\cdot}
+\defineXMLentity [dot] {\mathematics\cdot}
+\defineXMLentity [sim] {\mathematics\sim}
+\defineXMLentity [circ] {\mathematics\circ}
+\defineXMLentity [dagger] {\mathematics\dagger}
+\defineXMLentity [cdots] {\mathematics\cdots}
+
+\defineXMLentity [...] {\getXMLentity{cdots}}
+\defineXMLentity [continued] {\getXMLentity{cdots}}
+
+\defineXMLentity [sub] {\getXMLentity{subset}}
+\defineXMLentity [sube] {\getXMLentity{prsubset}}
+\defineXMLentity [notprsubset] {\getXMLentity{notprsubset}}
+
+\defineXMLentity [ndash] {\endash}
+\defineXMLentity [mdash] {\emdash}
+
+\defineXMLentity [tex-bar] {\mathematics{\vert}}
+\defineXMLentity [tex-dollar] {\dollar}
+\defineXMLentity [tex-backslash] {\backslash}
+\defineXMLentity [tex-leftbrace] {\mathematics{\{}}
+\defineXMLentity [tex-rightbrace] {\mathematics{\}}}
+
+\protect \endinput
diff --git a/tex/context/base/x-newmml.mkii b/tex/context/base/x-newmml.mkii
new file mode 100644
index 000000000..17eda5276
--- /dev/null
+++ b/tex/context/base/x-newmml.mkii
@@ -0,0 +1,2744 @@
+%D \module
+%D [ file=x-newmml,
+%D version=2005.06.10, % 1999.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=MathML,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Remark: from now on this is a module and no longer an xtag
+%D filter. In due time it will replace the older renderer (which
+%D we will keep around for sentimental reasons). This variant has
+%D no namespace support yet, but eventually we will use a \MKIV\
+%D version.
+
+\useXMLfilter[stk]
+
+\ifx\inlinemathematics\undefined
+ \def\inlinemathematics {\dontleavehmode\mathematics} % already in kernel
+ \long\def\inlinemath #1{\dontleavehmode\relax\ifmmode#1\else $#1$\fi}
+\fi
+
+% \defineXMLentity[x000AF]{\normalorfiller{x}\hrulefill}
+% CHECK FOR: \xmlrent
+% \enablemathpunctuation
+
+%D Then we start defining the rendering macros:
+
+\writestatus{loading}{ConTeXt XML Macros / MathML}
+
+\startmodule [mathml]
+
+%D First we load the entities:
+
+\usemodule[newmme]
+
+% \setupmodule[a=c]
+% \setupmodule[a=c]
+
+\unprotect
+
+\def\MMLrm{\mr}
+
+\def\MMLseparator#1{{#1}} % nils space after separator
+
+%D First we define some general formula elements.
+
+\defineXMLenvironment [formula] [label=,sublabel=]
+ {\dostartXMLformula\placeformula}
+ {\dostopXMLformula}
+
+\defineXMLenvironment [subformula] [label=,sublabel=]
+ {\dostartXMLformula\placesubformula}
+ {\dostopXMLformula}
+
+\def\dostartXMLformula#1%
+ {\doifelsenothingXMLop{label}
+ {\startformula}
+ {\expanded{#1[\XMLop{label}]{\XMLop{sublabel}}}\startformula}}
+
+\def\dostopXMLformula
+ {\stopformula}
+
+%D Since I only had the draft of MathML 2 as example of
+%D rendering, there are probably a lot of omissions and
+%D misinterpretations. At least I learned some bits and
+%D pieces of math rendering.
+%D
+%D The main complications were not so much the math, but to
+%D find the most efficient way to handle elements without
+%D spacing beging messed up. The first implementation was
+%D aimed at getting reasonable output, this second
+%D implementation is already better in terms of handling
+%D nesting, and I will definitely need a third one that has
+%D more efficient and less ugly code.
+%D
+%D The \TEX\ part is not that complicated and once the
+%D preprocessor was okay, the rest way just a lot of keying
+%D and testing. It all comes down to gobbling, redefining,
+%D and not so much to parsing.
+%D
+%D The second implementation expanded the whole math sequence
+%D into an internal \TEX\ representation. This is a rather clean
+%D and fast process. Filtering and testing takes place by
+%D redefining the internal representation macros.
+%D
+%D The third implementation may look a bit more messy in some
+%D respects. This is because in \TEX\ it's not that trivial to
+%D implement a tree handler. We use a stack for the \type {apply}
+%D element and other sequential content. Occasionally we need to
+%D peek into child elements which involves messy code. This
+%D implementation is closer to the normal \XML\ handling in
+%D \CONTEXT.
+
+%D We start with the parent elements and the option handler.
+
+\defineXMLdirective [mathml] \setupMMLappearance
+
+\defineXMLargument [math] \automathematics
+\defineXMLargument [imath] \inlinemathematics
+\defineXMLargument [dmath] \displaymathematics
+\defineXMLargument [m] \inlinemathematics
+
+%D In the styles, options can be set with:
+
+\def\setupMMLappearance[#1]{\dodoubleargument\getparameters[@@MML#1]}
+
+\def\startusingMMLarguments % optional maken
+ {\begingroup
+ %\expandXMLta % expand entities first
+ \getXMLta}
+
+\def\stopusingMMLarguments % optional maken
+ {\endgroup}
+
+\def\MMLargumentprefix{@@MML\currentXMLelement}
+
+%D We will apply inner math to all bits and pieces made up by an
+%D \type {apply}.
+
+\def\MMLmathinner
+ {\ifinner \expandafter \firstofoneargument \else \expandafter \mathinner \fi}
+
+%D A few math related macros:
+
+\let\MMLctempresetlist\empty \def\setMMLcreset{\edef\MMLctempresetlist}
+
+\newcount\MMLapplydepth \def\MMLcreset{\MMLapplydepth\zerocount}
+
+% Stack handler
+
+\startXMLmapping[xmlstack:test]
+
+ \defineXMLnested
+ [apply]
+ {\startsavingXMLelements}
+ {\stopsavingXMLelements}
+
+\stopXMLmapping
+
+%D Auxiliary MathML macros: (to be generalized)
+
+\def\doifelseMMCfunction
+ {\begingroup
+ \XMLdoifonstackelse{fn}
+ {\donetrue}
+ {\XMLdoifonstackelse{apply}
+ {\defXMLfirstnamedtext\ascii{apply}%
+ \startsavingXMLelements % best use a substack so that we do not need to \edef
+ \ascii
+ \stopsavingXMLelements}
+ {}%
+ \XMLdoifonstackelse{fn}
+ {\donetrue}
+ {\defineXMLsave[ci][type=]%
+ \XMLfirstnamed{ci}%
+ \doifelse{\XMLpar{ci}{type}{}}{fn}
+ {\donetrue}
+ {\donefalse}}}%
+ \ifdone
+ \endgroup\expandafter\firstoftwoarguments
+ \else
+ \endgroup\expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifelseMMCfunctioninapply#1#2% grouped
+ {\begingroup
+ \startXMLmapping[xmlstack:test]% take fast alternative
+ \getXMLstackdata{#1}%
+ \expanded{\doifinsetelse{\getXMLstackname\plusone}{#2}}
+ {\stopXMLmapping
+ \endgroup\firstoftwoarguments }
+ {\stopXMLmapping
+ \endgroup\secondoftwoarguments}}
+
+\def\dodoifelseMMCfunctioninapply#1#2%
+ {\startXMLmapping[xmlstack:test]% take fast alternative
+ \getXMLstackdata{#1}%
+ \expanded{\doifinsetelse{\getXMLstackname\plusone}{#2}}
+ {\stopXMLmapping
+ \firstoftwoarguments }
+ {\stopXMLmapping
+ \secondoftwoarguments}}
+
+%D Special features:
+
+\newtoks \@@postponedMMLactions \setfalse \somepostponedMMLactions
+
+\def\postponeMMLactions#1%
+ {\global\settrue\somepostponedMMLactions
+ \global\@@postponedMMLactions\expandafter{\the\@@postponedMMLactions#1}}
+
+\def\postponedMMLactions
+ {\global\setfalse\somepostponedMMLactions
+ \@EA\global\@EA\@@postponedMMLactions\@EA\emptytoks
+ \the\@@postponedMMLactions}
+
+%D A couple of lists:
+
+\def\MMLcmainresetlist
+ {times,divide,power,%
+ lt,gt,eq,leq,geq,%
+ in,inverse,%
+ fn,%
+ floor,ceiling,%
+ mean,%
+ selector,%
+ abs,int,limit,sum,product,%
+ outerproduct,innerproduct,scalarproduct}
+
+\def\MMLcfunctionlist
+ {sin,arcsin,sinh,arcsinh,%
+ cos,arccos,cosh,arccosh,%
+ tan,arctan,tanh,arctanh,%
+ cot,arccot,coth,arccoth,%
+ csc,arccsc,csch,arccsch,%
+ sec,arcsec,sech,arcsech,%
+ ln,exp,log,%
+ abs,int,limit,sum,product,%
+ fn} % ?
+
+\def\MMLcconstructlist
+ {diff,partialdiff,root} % apply goes wrong on 1/2 * (a_2 + b_3)
+
+% apply
+%
+%D We use inner and grouping (begin/end and no b/e) else we
+%D get problems with 1/2(1+2) and alike (todo: ask taco).
+%D
+%D The problem with apply is that we need to take care of
+%D several situations, like:
+%D
+%D \starttyping
+%D <apply> <.../> ...
+%D <apply> <fn> ...
+%D <apply> <apply> <ci> ...
+%D <apply> <apply> <fn> <ci> ...
+%D \stoptyping
+%D
+%D Because we translated version 2 of this renderer into
+%D version 3 the following definitions may be sub optimal or
+%D more complex than actually needed.
+
+\defineXMLnested % why nested? could be just an environment
+ [apply]
+ [open=,close=]
+ {\setups{mmc:apply:start}}
+ {\setups{mmc:apply:stop}}
+
+\startsetups mmc:apply:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:apply:stop
+ \stopsavingXMLelements
+ \MMLmathinner {
+ \expanded{\doifinsetelse{\getXMLstackname\plusone}{\MMLcmainresetlist,\MMLctempresetlist}}
+ \MMLcreset
+ \donothing
+ \ifcase\MMLapplydepth \else
+ \doifXMLparelse{apply}{open} \donothing{\getXMLarguments{apply}{open="("}}% slow
+ \doifXMLparelse{apply}{close}\donothing{\getXMLarguments{apply}{close=")"}}% slow
+ \fi
+ \doifXMLparelse{apply}{open}{\left\XMLpar{apply}{open}{}}\donothing
+ \advance\MMLapplydepth\plusone
+ \begingroup
+ \let\MMLctempresetlist\empty
+ \doifelse {\getXMLstackname\plusone} {apply} {
+ % <apply> <apply> ... </apply> <ci> .. </ci> </apply>
+ \doifelseMMCfunctioninapply \plusone {plus,minus} {
+ % yet incomplete and rather untested
+ % <apply> <apply> <minus/> <tan/> <cos/> </apply> <ci>x</ci> </apply>
+ } {
+ \MMLcreset
+ }
+ \getXMLstackdata\plusone
+ \ifconditional\somepostponedMMLactions
+ \postponedMMLactions
+ \else
+ \left(\MMLcreset\getXMLstackdata\plustwo\right)
+ \fi
+ } {
+ \doifelse {\getXMLstackname\plusone} {fn} {
+ % also postpone
+ \directsetup{mmc:fn:apply}
+ } {
+ \doifelse {\getXMLstackname\plusone} {csymbol} {
+ % also postpone
+ \directsetup{mmc:csymbol:apply}
+ } {
+ \doifelse {\getXMLstackname\plusone} {ci} {
+ \getXMLstackdata\plusone
+ \ifnum\XMLstacklevel>\plusone
+ \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
+ \fi
+ } {
+ \getXMLstackdata\plusone
+ }
+ }
+ }
+ }
+ \endgroup
+ \advance\MMLapplydepth\minusone
+ \directsetup{apply:flush}
+ \doifXMLparelse{apply}{close}{\right\XMLpar{apply}{close}{}}\donothing
+ }
+ \endgroup
+\stopsetups
+
+\startsetups apply:flush
+\relax
+ \ifcase\MMLapplydepth
+ \ifconditional\somepostponedMMLactions
+ \postponedMMLactions
+ \ifx\MMLpowerelement\empty\else
+ ^{\MMLcreset\MMLpowerelement\empty}
+ \global\let\MMLpowerelement\empty
+ \fi
+ \fi
+ \fi
+\stopsetups
+
+% reln
+
+\defineXMLnestedenvironmentsave [reln]
+ {\writestatus{XML}{MathML element "reln" is obsolete}}
+ {}
+
+% fn
+
+\startsetups mmc:fn:plusminus
+ \ifnum\XMLstacklevel>\plustwo
+ \MMLcreset
+ \left(\expandafter\flushXMLstackwith\expandafter\plustwo\expandafter{\XMLfnoperator}\right)
+ \else
+ \getXMLstackdata\plustwo
+ \fi
+\stopsetups
+
+\startsetups mmc:fn:minusplus
+ \directsetup{mmc:fn:plusminus}
+\stopsetups
+
+\defineXMLnested
+ [fn]
+ {\directsetup{mmc:fn:start}}
+ {\directsetup{mmc:fn:stop}}
+
+\startsetups mmc:fn:apply
+ \begingroup
+ \startsavingXMLelements
+ \rawXMLstacktext\plusone % still on stack, no check, just fn content
+ \stopsavingXMLelements
+ \doifelse {\getXMLstackname\plusone} {ci} {
+ \flattenXMLcontent{\getXMLstackdata\plusone}
+ \doifsetupselse{mmc:fn:\flattenedXMLcontent} {
+ \global\defXMLstackdata\XMLfnoperator\plusone
+ \expanded{\endgroup\noexpand\directsetup{mmc:fn:\flattenedXMLcontent}}
+ } {
+ \endgroup
+ \MMLcreset
+ \getXMLstackdata\plusone
+ \ifnum\XMLstacklevel>\plusone
+ \getXMLentity{NegThinSpace}
+ \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
+ \fi
+ }
+ } {
+ \endgroup
+ \MMLcreset
+ \getXMLstackdata\plusone
+ }
+\stopsetups
+
+\startsetups mmc:fn:start
+ \ifnum\XMLstacklevel>\plustwo
+ \def\MMCfnleft {\left(}
+ \def\MMCfnright{\right)}
+ \else
+ \let\MMCfnleft \relax
+ \let\MMCfnright\relax
+ \fi
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:fn:stop
+ \stopsavingXMLelements
+ \doifelse {\getXMLstackname\plusone} {ci} {
+ \flattenXMLcontent{\getXMLstackdata\plusone}
+ \doifsetupselse{mmc:fn:\flattenedXMLcontent} {
+ \global\defXMLstackdata\XMLfnoperator\plusone
+ \directsetup{mmc:fn:\flattenedXMLcontent}
+ } {
+ \MMLcreset
+ \getXMLstackdata\plusone
+ }
+ \endgroup
+ } {
+ \doifelse {\getXMLstackname\plusone} {apply} {
+ \doifelseMMCfunctioninapply \plusone {plus,minus} {
+ \left(
+ \getXMLstackdata\plusone
+ \right)
+ } {
+ \getXMLstackdata\plusone
+ }
+ \endgroup
+ \ifnum\XMLstacklevel>\plusone
+ \left(
+ \getXMLstackdata\plustwo
+ \right)
+ \fi
+ } {
+ \MMLcreset
+ \getXMLentity{NegThinSpace}
+ \MMCfnleft
+ \ifnum\XMLstacklevel=\plustwo\MMLccomma\fi
+ \flushXMLstackwith\plustwo\MMLccomma
+ \MMCfnright
+ \endgroup
+ }
+ }
+\stopsetups
+
+% c*
+
+\defineXMLargument [ci] [type=] {\XMLval{mmc:ci}{\XMLop{type}} {\firstofoneargument}}
+\defineXMLargument [cn] [type=,base=] {\XMLval{mmc:cn}{\XMLop{type}} {\firstofoneargument}}
+\defineXMLargument [csymbol] [encoding=text] {\XMLval{mmc:cs}{\XMLop{encoding}}{\firstofoneargument}}
+
+%D The next definition provide a kind of plug-in mechanism (see
+%D the open math extension module).
+
+\defineXMLsingular
+ [csymbol]
+ [encoding=text,
+ definitionURL=]
+ {\doifsomething{\XMLop{definitionURL}}{\directsetup{mmc:csymbol:apply}}}
+
+\startsetups mmc:csymbol:apply
+ \begingroup
+ \startsavingXMLelements
+ \rawXMLstacktext\plusone % still on stack, no check, just attr test
+ \stopsavingXMLelements
+ % http://www.publishers.com/SomeName
+ \lowercasestring\XMLpar{csymbol}{definitionURL}{}\to\mmcSymbolURL
+ \doifsetupselse{mmc:csymbol:} {\mmcSymbolURL} {
+ \expanded{\endgroup\noexpand\directsetup{mmc:csymbol:\mmcSymbolURL}}
+ } {
+ % SomeName (fallback)
+ \splitfilename{\XMLpar{csymbol}{definitionURL}{}}
+ \doifsetupselse{mmc:csymbol:\splitoffbase} {
+ \expanded{\endgroup\noexpand\directsetup{mmc:csymbol:\splitoffbase}}
+ } {
+ \endgroup
+ \XMLval{mmc:cs}{\XMLop{encoding}}{\firstofoneargument}
+ }
+ }
+\stopsetups
+
+%D Alternative b will convert periods into comma's:
+%D
+%D \startbuffer
+%D \startXMLdata
+%D <imath><apply><cn>1.23</cn></apply></imath>
+%D <dmath><apply><cn>1.23</cn></apply></dmath>
+%D \stopXMLdata
+%D
+%D \type{\setupMMLappearance[cn] [alternative=b]}
+%D
+%D \startXMLdata
+%D <imath><apply><cn>1.23</cn></apply></imath>
+%D <dmath><apply><cn>1.23</cn></apply></dmath>
+%D \stopXMLdata
+%D \stopbuffer
+%D
+%D \start \typebuffer \getbuffer \stop
+
+\setupMMLappearance[cn] [\c!alternative=\v!a]
+
+\defineXMLargument[cn][type=,base=]{\MMLdocn}
+
+\def\MMLdocn#1%
+ {\begingroup
+ \doif\@@MMLcnalternative\v!b{\redefinemathcharacter [.][ord][mi]["3B]\relax}%
+ \XMLval{mmc:cn}{\XMLop{type}}{\firstofoneargument}{#1}%
+ \endgroup}
+
+\defineXMLsingular [sep] {\MMLcsep} \def\MMLcsep{\,}
+
+\setupMMLappearance[polar] [\c!alternative=\v!a] % a|b|c
+\setupMMLappearance[float] [\c!symbol=\v!no] % \v!yes|dot
+\setupMMLappearance[enotation][\c!symbol=\v!no] % \v!yes|dot
+\setupMMLappearance[base] [\c!symbol=\v!numbers] % digits|characters|text|no
+
+\mapXMLvalue {mmc:ci} {set} {\MMLcCIset}
+\mapXMLvalue {mmc:ci} {vector} {\MMLcCIvector}
+\mapXMLvalue {mmc:ci} {matrix} {\MMLcCImatrix}
+\mapXMLvalue {mmc:ci} {function} {\MMLcCIfunction}
+\mapXMLvalue {mmc:ci} {complex-cartesian} {\MMLccartesian}
+\mapXMLvalue {mmc:ci} {complex} {\MMLccartesian}
+\mapXMLvalue {mmc:ci} {complex-polar} {\MMLcpolar}
+\mapXMLvalue {mmc:ci} {polar} {\MMLcpolar}
+\mapXMLvalue {mmc:ci} {fn} {\MMLcCIfunction}
+
+\mapXMLvalue {mmc:cn} {integer} {\MMLcCNinteger}
+\mapXMLvalue {mmc:cn} {logical} {\MMLcCNlogical}
+\mapXMLvalue {mmc:cn} {rational} {\MMLcCNrational}
+\mapXMLvalue {mmc:cn} {complex-cartesian} {\MMLccartesian}
+\mapXMLvalue {mmc:cn} {complex} {\MMLccartesian}
+\mapXMLvalue {mmc:cn} {complex-polar} {\MMLcpolar}
+\mapXMLvalue {mmc:cn} {polar} {\MMLcpolar}
+\mapXMLvalue {mmc:cn} {e-notation} {\MMLcenotation} % new
+\mapXMLvalue {mmc:cn} {float} {\MMLcfloat} % obsolete
+\mapXMLvalue {mmc:cn} {real} {\MMLcfloat}
+
+\mapXMLvalue {mmc:cs} {text} {\MMLcCStext}
+
+\def\MMLcpolar#1%
+ {\doifdefinedelse{MMLcdopolar\@@MMLpolaralternative}
+ {\getvalue{MMLcdopolar\@@MMLpolaralternative}{#1}}
+ {#1}}
+
+\def\MMLcdopolara#1%
+ {\def\MMLcsep{\MMLseparator,}\getXMLentity{polar}\left(#1\right)}
+
+\def\MMLcdopolarb#1%
+ {\def\MMLcsep##1\empty
+ {\getXMLentity{exponentiale}^{##1\mskip2mu\getXMLentity{imaginaryi}}}
+ #1\empty}
+
+\def\MMLcdopolarc#1%
+ {\def\MMLcsep##1\empty
+ {\getXMLentity{exp}\left(##1\mskip2mu\getXMLentity{imaginaryi}\right)}%
+ #1\empty}
+
+\def\MMLccartesian#1%
+ {\def\MMLcsep{+}#1\getXMLentity{imaginaryi}}
+
+% float will be obsolete, and is replace by e-notation
+
+\def\MMLcfloat#1%
+ {\doifelse\@@MMLfloatsymbol\v!no
+% {{\MMLrm#1}}% make sure that e shows up ok
+ {\mfunction{#1}}% make sure that e shows up ok
+ {% we should ignore \entities !
+ \beforesplitstring#1\at e\to\first
+ \aftersplitstring #1\at e\to\last
+ \ifx\first\empty #1\else
+ \ifx\last \empty #1\else
+ \first
+ \doifelse\@@MMLfloatsymbol{dot}\cdot\times
+ 10^{\last}%
+ \fi\fi}}
+
+% we now have:
+
+\def\MMLcenotation#1%
+ {\doifelse\@@MMLenotationsymbol\v!no
+% {\def\MMLcsep {\unskip{\MMLrm e}\ignorespaces}}
+ {\def\MMLcsep {\unskip\mfunction{e}\ignorespaces}}
+ {\def\MMLcsep##1\empty{\doifelse\@@MMLenotationsymbol{dot}\cdot\times10^{##1}}}%
+ #1\empty}
+
+\def\MMLcCIset#1%
+ {{\bbd#1}}
+
+\def\widevec#1%
+ {\vbox{\mathsurround\zeropoint\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\nointerlineskip}%
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+
+\def\MMLcCIvector#1%
+ {\widevec{#1}}
+
+\def\MMLcCImatrix#1%
+ {{\bi#1}}
+
+\def\MMLcCIfunction#1%
+ {#1\getXMLentity{NegThinSpace}}
+
+\def\MMLcCNinteger#1%
+ {\doifXMLparelse{cn}{base}
+ {\def\MMLcCNbase{\XMLpar{cn}{base}{}}%
+ \doifelse\@@MMLbasesymbol\v!no
+ {\MMLcCNbasedata{#1}}
+% {\MMLcCNbasedata{#1}_{\hbox{$\MMLrm\scriptscriptstyle
+ {\MMLcCNbasedata{#1}_{\mfunction{%
+ \processaction
+ [\@@MMLbasesymbol]
+ [\v!characters=>\MMLcCNbasestring BODH,
+ \v!text=>\MMLcCNbasestring{BIN}{OCT}{DEC}{HEX},
+% \s!unknown=>\MMLcCNbase]$}}}}
+ \s!unknown=>\MMLcCNbase]}}}}
+ {#1}}
+
+\def\MMLcCNbasedata#1%
+% {\ifnum\MMLcCNbase>10{\MMLrm#1}\else#1\fi}
+ {\ifnum\MMLcCNbase>10\mfunction{#1}\else#1\fi}
+
+\def\MMLcCNbasestring#1#2#3#4%
+ {\ifnum\MMLcCNbase= 2 #1\else
+ \ifnum\MMLcCNbase= 8 #2\else
+ \ifnum\MMLcCNbase=10 #3\else
+ \ifnum\MMLcCNbase=16 #4\else
+ \MMLcCNbase \fi\fi\fi\fi}
+
+\def\MMLcCNlogical#1%
+% {{\MMLrm#1}}
+ {\mfunction{#1}}
+
+\bgroup \catcode`\<=\active
+
+ % quick and dirty, best track the stack (todo)
+
+ \gdef\MMLcCNrational#1%
+ {\ConvertConstantAfter\doifinstringelse{sep}{#1}
+ {\doMMLcCNrational#1\empty}
+ {#1}}
+
+ \gdef\doMMLcCNrational#1<sep#2>#3\empty
+ {\hbox{$\frac{#1}{#3}$}}
+
+\egroup
+
+\def\MMLcCStext#1%
+% {{\MMLrm#1}}
+ {\mfunction{#1}}
+
+% interval
+
+\defineXMLnested [interval]
+ [closure=closed]
+ {\directsetup{mmc:interval:start}}
+ {\directsetup{mmc:interval:stop}}
+
+\startsetups mmc:interval:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:interval:stop
+ \stopsavingXMLelements
+ \XMLval{mmc:int}{\XMLpar{interval}{closure}{closed}}{error}
+ \endgroup
+\stopsetups
+
+\startsetups mmc:interval:fetch
+ \defineXMLnested [interval]
+ [closure=closed]
+ {\directsetup{mmc:interval:fetch:start}}
+ {\directsetup{mmc:interval:fetch:stop}}
+\stopsetups
+
+\startsetups mmc:interval:fetch:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:interval:fetch:stop
+ \stopsavingXMLelements
+ \globallet\MMCintervalfrom\empty
+ \globallet\MMCintervalto \empty
+ \ifcase\XMLstacklevel
+ \or
+ \xdef\MMCintervalfrom{\getXMLstackdata\plusone}
+ \or
+ \xdef\MMCintervalfrom{\getXMLstackdata\plusone}
+ \xdef\MMCintervalto {\getXMLstackdata\plustwo}
+ \fi
+ \endgroup
+\stopsetups
+
+\setupMMLappearance[interval][\c!alternative=\v!a,\c!separator={,}]
+
+\mapXMLvalue {mmc:int} {closed}
+ {\left[\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right]}
+
+\mapXMLvalue {mmc:int} {open-closed}
+ {\doifelse\@@MMLintervalalternative\v!b
+ {\left<\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right]}
+ {\left(\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right]}}
+
+\mapXMLvalue {mmc:int} {closed-open}
+ {\doifelse\@@MMLintervalalternative\v!b
+ {\left[\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right>}
+ {\left[\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right)}}
+
+\mapXMLvalue {mmc:int} {open}
+ {\doifelse\@@MMLintervalalternative\v!b
+ {\left<\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right>}
+ {\left(\getXMLstackdata\plusone\MMLseparator\@@MMLintervalseparator\getXMLstackdata\plustwo\right)}}
+
+% inverse
+
+\defineXMLcommand [inverse] {\directsetup{mmc:inverse}}
+
+\startsetups mmc:inverse
+ \ifnum\XMLstacklevel>\plustwo
+ \getXMLentity{\getXMLstackname\plustwo}^{-1}
+ \left[\getXMLstackdata\plusthree\right]
+ \else
+ \xdef\MMLpowerelement{-1}
+ \expanded{\postponeMMLactions{\rawXMLstackdata\plustwo}}
+ \eraseXMLdataonstack\plustwo
+ \fi
+\stopsetups
+
+% condition
+
+\defineXMLnested
+ [condition]
+ {\directsetup{mmc:condition:start}}
+ {\directsetup{mmc:condition:stop}}
+
+\startsetups mmc:condition:start
+% \XMLdoifonstackelse{bvar} {
+% \XMLfirstnamed{bvar}\mid
+% } { }
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:condition:stop
+ \stopsavingXMLelements
+ \flushXMLstackfrom\plusone
+ \endgroup
+\stopsetups
+
+% declare
+
+\setupMMLappearance[declare][\c!state=\v!start]
+
+\defineXMLnested
+ [declare]
+ {\directsetup{mmc:declare:start}}
+ {\directsetup{mmc:declare:stop}}
+
+\startsetups mmc:declare:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:declare:stop
+ \stopsavingXMLelements
+ \doif\@@MMLdeclarestate\v!start {
+ \getXMLentity{declare}\getXMLstackdata\plusone
+ \ifnum\XMLstacklevel>\plusone
+ \getXMLentity{ThickSpace}
+ \getXMLentity{as}
+ \getXMLentity{ThickSpace}
+ \fi
+ \getXMLstackdata\plustwo
+ }
+ \endgroup
+\stopsetups
+
+% lambda
+
+\setupMMLappearance[lambda][\c!alternative=b]
+
+\defineXMLnested
+ [lambda]
+ {\directsetup{mmc:lambda:start}}
+ {\directsetup{mmc:lambda:stop}}
+
+\startsetups mmc:lambda:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:lambda:stop
+ \stopsavingXMLelements
+ \doifelse\@@MMLlambdaalternative\v!a {
+ \getXMLentity{lambda}(\flushXMLstackwith\plusone{\MMLseparator,})
+ } {
+ \countXMLnamedstack{bvar}
+ \ifnum\scratchcounter>\plusone
+ \left(\flushXMLnamedstackwith\plusone{bvar}{\MMLseparator,}\right)
+ \else
+ \XMLfirstnamed{bvar}
+ \fi
+ \getXMLentity{mapsto}
+ \MMLcreset
+ \XMLfirstnamed{apply,reln,ci,cn}
+ }
+ \endgroup
+\stopsetups
+
+\startsetups mmc:lambda:simple
+ \defineXMLnested
+ [lambda]
+ {\directsetup{mmc:lambda:simple:start}}
+ {\directsetup{mmc:lambda:simple:stop}}
+\stopsetups
+
+\startsetups mmc:lambda:simple:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:lambda:simple:stop
+ \stopsavingXMLelements
+ \MMLcreset % new
+ \XMLfirstnamed{apply}
+ \endgroup
+\stopsetups
+
+% compose
+
+\defineXMLcommand [compose] {\directsetup{mmc:compose}}
+
+\startsetups mmc:compose
+ \begingroup
+ \MMLcreset
+ \let\MMLcCIfunction\firstofoneargument % brrr
+ \doifelseMMCfunction {
+ \left(\flushXMLstackwith\plustwo\circ\right)
+ } {
+ \flushXMLstackwith\plustwo\circ
+ }
+ \endgroup
+\stopsetups
+
+\defineXMLcommand [image] {\directsetup{mmc:image}}
+
+\startsetups mmc:image
+ \getXMLentity{image}
+ \left(
+ \begingroup
+ \startlocalsetups [mmc:function]
+ \getXMLentity\currentXMLelement
+ \stoplocalsetups
+ \getXMLstackdata\plustwo
+ \endgroup
+ \right)
+\stopsetups
+
+\setupMMLappearance[piece][\c!separator=]
+
+\def\setMMLcPIECEseparator
+ {\processaction
+ [\@@MMLpieceseparator]
+ [ \v!yes=>\def\theMMLpieceseparator{,\@col@amp@},
+ \v!no=>\let\theMMLpieceseparator\@col@amp@,
+ \s!default=>\let\theMMLpieceseparator\@col@amp@,
+ \s!unknown=>\def\theMMLpieceseparator{\,\,\hbox{\@@MMLpieceseparator}\,\,}]}
+
+\defineXMLargument[piecewise] {\cases}
+
+\defineXMLnested
+ [piece]
+ {\directsetup{mmc:piece:start}}
+ {\directsetup{mmc:piece:stop}}
+
+\defineXMLenvironmentsave
+ [otherwise]
+ {}
+ {\directsetup{mmc:otherwise}}
+
+\startsetups mmc:piece:start
+ \startsavingXMLelements
+ \setMMLcPIECEseparator
+\stopsetups
+
+\startsetups mmc:piece:stop
+ \stopsavingXMLelements
+ \edef\ascii{\getXMLstackdata\plusone}
+ \@EA\XMLRtoks\@EA{\ascii\theMMLpieceseparator}
+ \edef\ascii{\getXMLstackdata\plustwo}
+ \@EA\appendtoks\@EA\mathematics\@EA{\ascii}\to\XMLRtoks
+ \the\XMLRtoks\crcr
+\stopsetups
+
+\startsetups mmc:otherwise
+ \XMLflush{otherwise}\MMLcPIECEseparator\@col@amp@\mathematics{\getXMLentity{otherwise}}\crcr
+\stopsetups
+
+\defineXMLcommand [quotient] {\directsetup{mmc:quotient}}
+
+\startsetups mmc:quotient
+ \lfloor\getXMLstackdata\plustwo/\getXMLstackdata\plusthree\rfloor
+\stopsetups
+
+\defineXMLcommand [factorial] {\getXMLstackdata\plustwo !}
+
+\defineXMLcommand [divide] [\MMLargumentprefix] [] {\directsetup{mmc:divide}} % brr not nested
+
+\setupMMLappearance [divide] [\c!level=\!!maxcard,\c!alternative=\v!a]
+
+\startsetups mmc:divide
+ \startusingMMLarguments
+ \increment\MMLcDIVIDElevel
+ \doifelse \@@MMLdividealternative\v!b {
+ \getXMLstackdata\plustwo/\getXMLstackdata\plusthree
+ } {
+ \ifnum\MMLcDIVIDElevel>\@@MMLdividelevel\space
+ \getXMLstackdata\plustwo/\getXMLstackdata\plusthree
+ \else
+ \MMLcreset
+ \frac{\MMLcreset\getXMLstackdata\plustwo}{\MMLcreset\getXMLstackdata\plusthree}%
+ \fi
+ }
+ \decrement\MMLcDIVIDElevel
+ \stopusingMMLarguments
+\stopsetups
+
+% min max
+
+\defineXMLcommand [min] {\min\directsetup{mmc:minmax}}
+\defineXMLcommand [max] {\max\directsetup{mmc:minmax}}
+
+\startsetups mmc:minmax
+ \doifelse{\getXMLstackdata\plustwo}{bvar} {
+ {}_{\getXMLstackdata\plustwo}
+ \left\{\flushXMLstackwith\plusthree{\MMLseparator,}\right\}
+ } {
+ \left\{\flushXMLstackwith\plustwo {\MMLseparator,}\right\}
+ }
+\stopsetups
+
+% minus plus
+
+\defineXMLcommand [minus] {\directsetup{mmc:minus}}
+\defineXMLcommand [plus] [\MMLargumentprefix] [] {\directsetup{mmc:plus}}
+
+\setupMMLappearance [plus] [\c!alternative=\v!a] % b = no sign -> 3 1/4
+\setupMMLappearance [sign] [\c!reduction=\v!yes]
+
+\startsetups mmc:minus
+ \doif \@@MMLsignreduction \v!yes {
+ \setMMLcreset{fn,\MMLcfunctionlist}
+ }
+ \ifcase\XMLstacklevel
+ \or
+ % self
+ \or
+ -\getXMLstackdata\plustwo
+ \else
+ \flushXMLstackwith\plustwo-
+ \fi
+\stopsetups
+
+\startsetups mmc:plus
+ \startusingMMLarguments
+ \doifelse \@@MMLsignreduction \v!yes {
+ \setMMLcreset{fn,plus,minus,\MMLcfunctionlist,\MMLcconstructlist}% was plus/, minus/
+ \doifelse{\getXMLstackname\plustwo} {apply} {
+ % branch needed, else (a-b) + (c-d) goes wrong
+ % reset check in case of (-x) + 37
+ \begingroup
+ \dodoifelseMMCfunctioninapply \plustwo {minus} {
+ \ifnum\XMLstacklevel>\plustwo
+ \endgroup
+ \else
+ \endgroup
+ \MMLcreset
+ \fi
+ } {
+ \endgroup
+ }
+ \doifelse \@@MMLplusalternative \v!b {
+ \getXMLstackdata\plustwo \,
+ } {
+ \flushXMLstackwith\plustwo +
+ }
+
+ } {
+ \flushXMLstackwith\plustwo {
+ \doifelse {\getXMLstackname\recurselevel} {apply} {
+ \begingroup
+ \dodoifelseMMCfunctioninapply \recurselevel {minus} {
+ \ifnum\XMLstacklevel>\plustwo +\fi
+ } {
+ \doifelse \@@MMLplusalternative \v!b {
+ \, % maybe 2 1/3
+ } {
+ +
+ }
+ }
+ \endgroup
+ \MMLcreset
+ } {
+ +
+ }
+ }
+ }
+ } {
+ \ifcase\XMLstacklevel
+ \or
+ % self
+ \or
+ +\getXMLstackdata\plustwo
+ \else
+ \flushXMLstackwith\plustwo+
+ \fi
+ }
+ \stopusingMMLarguments
+\stopsetups
+
+% power
+
+\defineXMLcommand [power] {\directsetup{mmc:power}}
+
+\setupMMLappearance[power][\c!reduction=\v!yes]
+
+\let\MMLpowerelement\empty
+
+\startsetups mmc:power
+ \doifelse {\getXMLstackname\plustwo} {apply} {
+ \doifelse\@@MMLpowerreduction\v!yes {
+ \doifelseMMCfunctioninapply \plustwo \MMLcfunctionlist {
+ \xdef\MMLpowerelement{\getXMLstackdata\plusthree}% postpone
+ \MMLcreset\getXMLstackdata\plustwo
+ } {
+ \left(\MMLcreset\getXMLstackdata\plustwo\right)^{\MMLcreset\getXMLstackdata\plusthree}
+ }
+ } {
+ \left(\MMLcreset\getXMLstackdata\plustwo\right)^{\MMLcreset\getXMLstackdata\plusthree}
+ }
+ } {
+ \getXMLstackdata\plustwo^{\MMLcreset\getXMLstackdata\plusthree}
+ }
+\stopsetups
+
+% rem
+
+\defineXMLcommand [rem] {\flushXMLstackwith\plustwo{\getXMLentity{mod}}}
+
+\setupMMLappearance [times] [\c!symbol=\v!no,\c!auto=\v!yes] % new, auto catches cn cn cn
+
+\defineXMLcommand [times] [\MMLargumentprefix] [] {\directsetup{mmc:times}}
+
+\startsetups mmc:times
+ \startusingMMLarguments
+ \setMMLcreset{\MMLcfunctionlist,\MMLcconstructlist}%
+ \doifelse\@@MMLtimesauto\v!no {
+ \let\@@MMLtimes@@symbol\@@MMLtimessymbol
+ } {
+ \countXMLnamedstack {cn}
+ \ifnum\scratchcounter>\plusone
+ \doifinsetelse\@@MMLtimessymbol{\v!yes,\v!no} {
+ \let\@@MMLtimes@@symbol\v!yes
+ } {
+ \let\@@MMLtimes@@symbol\@@MMLtimessymbol
+ }
+ \else
+ \let\@@MMLtimes@@symbol\@@MMLtimessymbol
+ \fi
+ }
+ \doifelse\@@MMLtimes@@symbol\v!yes {
+ \flushXMLstackwith\plustwo\times
+ } {
+ \doifelse\@@MMLtimes@@symbol{dot} {
+ \flushXMLstackwith\plustwo\cdot
+ } {
+ \doifelse\@@MMLtimes@@symbol{times} {
+ \flushXMLstackwith\plustwo\times
+ } {
+ \flushXMLstackwith\plustwo\empty
+ }
+ }
+ }
+ \stopusingMMLarguments
+\stopsetups
+
+\defineXMLcommand [root] {\directsetup{mmc:root}}
+
+\setupMMLappearance[root][\c!symbol=\v!yes]
+
+\startsetups mmc:root
+ \XMLdoifonstackelse {degree} {
+ \root
+ \doifnot\@@MMLrootsymbol\v!no{\MMLcreset\XMLfirstnamed{degree}}
+ \of
+ } {
+ \sqrt
+ }
+ {\MMLcreset\XMLfirstnamed{apply,reln,ci,cn}}
+\stopsetups
+
+% gcd
+
+\defineXMLcommand [gcd] {\gcd\left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)}
+
+% and or xor implies
+
+\defineXMLcommand [and] {\flushXMLstackwith\plustwo{\getXMLentity{and}}}
+\defineXMLcommand [or] {\flushXMLstackwith\plustwo{\getXMLentity{or}}}
+\defineXMLcommand [xor] {\flushXMLstackwith\plustwo{\getXMLentity{xor}}}
+\defineXMLcommand [implies] {\flushXMLstackwith\plustwo{\getXMLentity{implies}}}
+
+% not
+
+\defineXMLcommand [not] {\getXMLentity{not}\getXMLstackdata\plustwo}
+
+% forall exists
+
+\defineXMLcommand [forall] {\directsetup{mmc:forall}}
+\defineXMLcommand [exists] {\directsetup{mmc:exists}}
+
+%D We need to shift left below rotated A.
+
+\startsetups mmc:forall
+ \getXMLentity{forall}
+ \getXMLentity{NegThinSpace}
+ \directsetup{mmc:forall-exists}
+\stopsetups
+
+\startsetups mmc:exists
+ \getXMLentity{exists}
+ \directsetup{mmc:forall-exists}
+\stopsetups
+
+\startsetups mmc:forall-exists
+ _{\flushXMLnamedstackwith\plustwo{bvar}{\MMLseparator,}}
+ \XMLdoifonstackelse {condition} {
+ \getXMLentity{ThickSpace}
+ \begingroup
+ \XMLfirstnamed{condition}
+ \endgroup
+ \countXMLnamedstack {apply,reln,ci,cn}
+ \ifcase\scratchcounter
+ \or
+ % == snelle volgende
+ \left\vert \MMLcreset
+ \getXMLentity{MediumSpace}
+ \flushXMLnamedstackwith\plustwo{apply,reln,ci,cn}\empty
+ \right.
+ \else
+ % special case
+ % \defineXMLignore[condition]
+ \collectXMLnamedstack{apply,reln,ci,cn}{\hfill\crcr}
+ \left\vert
+ \matrix{\the\XMLRtoks}
+ \right.
+ \fi
+ } {
+ :\XMLfirstnamed{apply,reln,ci,cn}
+ }
+\stopsetups
+
+\defineXMLcommand [abs] {\left\vert \MMLcreset \flushXMLstackfrom\plustwo \right\vert}
+\defineXMLcommand [conjugate] {{\overline{\MMLcreset \flushXMLstackfrom\plustwo}}} % watch extra {}
+\defineXMLcommand [arg] {\getXMLentity{arg} \left(\MMLcreset\flushXMLstackfrom\plustwo\right)}
+\defineXMLcommand [real] {\getXMLentity{real} \left(\MMLcreset\flushXMLstackfrom\plustwo\right)}
+\defineXMLcommand [imaginary] {\getXMLentity{imaginary}\left(\MMLcreset\flushXMLstackfrom\plustwo\right)}
+\defineXMLcommand [lcm] {\getXMLentity{lcm} \left(\flushXMLstackwith\plustwo{\MMLseparator,}\right)}
+\defineXMLcommand [floor] {\getXMLentity{lfloor} \flushXMLstackfrom\plustwo \getXMLentity{rfloor}}
+\defineXMLcommand [ceiling] {\getXMLentity{lceiling} \flushXMLstackfrom\plustwo \getXMLentity{rceiling}}
+
+% relations
+
+\defineXMLcommand [eq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation=}
+\defineXMLcommand [neq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\neq}
+\defineXMLcommand [gt] [\MMLargumentprefix] [\c!align=] {\MMLcrelation>}
+\defineXMLcommand [lt] [\MMLargumentprefix] [\c!align=] {\MMLcrelation<}
+\defineXMLcommand [geq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\geq}
+\defineXMLcommand [leq] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\leq}
+\defineXMLcommand [equivalent] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\equiv}
+\defineXMLcommand [approx] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\approx}
+\defineXMLcommand [factorof] [\MMLargumentprefix] [\c!align=] {\MMLcrelation\mid}
+
+\setupMMLappearance[relation][\c!align=\v!no]
+
+\def\MMLcrelation
+ {\startusingMMLarguments
+ \MMLcreset
+ \edef\@@MMLrelationalign{\executeifdefined{\MMLargumentprefix\c!align}\@@MMLrelationalign}%
+ \processaction
+ [\@@MMLrelationalign]
+ [\v!last=>\let\next\lastMMLcrelation ,
+ \v!first=>\let\next\firstMMLcrelation,
+ \v!yes=>\let\next\leftMMLcrelation ,
+ \v!left=>\let\next\leftMMLcrelation ,
+ \v!right=>\let\next\rightMMLcrelation,
+ \s!default=>\let\next\noMMLcrelation ,
+ \s!unknown=>\let\next\noMMLcrelation ]
+ \next}
+
+\def\noMMLcrelation#1%
+ {\flushXMLstackwith\plustwo{#1}
+ \stopusingMMLarguments}
+
+\def\lastMMLcrelation#1% weird, probably bugged
+ {\XMLRtoks\emptytoks
+ \dostepwiserecurse\plustwo\XMLstacklevel\plusone
+ {\appendetoks\noexpand\getXMLstackdata{\recurselevel}\to\XMLRtoks
+ \ifnum\recurselevel<\numexpr\XMLstacklevel-1\relax
+ \appendtoks\@col@amp@#1\crcr\to\XMLRtoks
+ \else\ifnum\recurselevel=\numexpr\XMLstacklevel-1\relax
+ \appendtoks\@col@amp@#1\to\XMLRtoks
+ \fi\fi}%
+ \eqalign{\the\XMLRtoks\crcr}%
+ \stopusingMMLarguments}
+
+\def\firstMMLcrelation#1%
+ {\collectXMLstackrows\plusthree{\crcr\@col@amp@#1}%
+ \eqalign{\getXMLstackdata\plustwo\@col@amp@#1\the\XMLRtoks}%
+ \stopusingMMLarguments}
+
+\def\leftMMLcrelation#1%
+ {\collectXMLstackrows\plustwo{\@col@amp@#1\crcr}%
+ \eqalign{\the\XMLRtoks}%
+ \stopusingMMLarguments}
+
+\def\rightMMLcrelation#1%
+ {\collectXMLstackrows\plustwo{\crcr#1{}\@col@amp@}%
+ \eqalign{\@col@amp@\the\XMLRtoks\crcr}%
+ \stopusingMMLarguments}
+
+\defineXMLcommand [becomes] {\MMLcrelation{:=}}
+
+\addtocommalist{becomes/}\MMLcmainresetlist
+
+% calculus and vector calculus
+
+\setupMMLappearance[int][\c!location=\v!top]
+
+\def\doMMLlimits#1%
+ {\doifelsevalue{@@MML#1\c!location}\v!top\limits\nolimits}
+
+\defineXMLnested
+ [domainofapplication]
+ {\directsetup{mmc:domainofapplication:start}}
+ {\directsetup{mmc:domainofapplication:stop}}
+
+\startsetups mmc:domainofapplication:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:domainofapplication:stop
+ \stopsavingXMLelements
+% \MMLcreset
+ \flushXMLstackfrom\plusone
+ \endgroup
+\stopsetups
+
+\defineXMLcommand [int] {\directsetup{mmc:int}}
+
+\startsetups mmc:int
+ \MMLcreset
+ \XMLdoifonstackelse{domainofapplication} {
+ \int\doMMLlimits{int}_{\XMLfirstnamed{domainofapplication}}\relax
+ } {
+ \XMLdoifonstackelse{condition} {
+ \int\doMMLlimits{int}_{\XMLfirstnamed{condition}}\relax
+ } {
+ \XMLdoifonstackelse{lowlimit} {
+ \int\doMMLlimits{int}
+ _{\XMLfirstnamed{lowlimit}}
+ ^{\XMLfirstnamed{uplimit}}
+ } {
+ % funny, why do we have lowlimit/uplimit then
+ \XMLdoifonstackelse{interval} {
+ \begingroup
+ \startlocalsetups mmc:interval:start %
+ \begingroup
+ \startsavingXMLelements
+ \stoplocalsetups
+ \startlocalsetups mmc:interval:stop %
+ \stopsavingXMLelements
+ \xdef\MMLfirstelement {\getXMLstackdata\plusone}
+ \xdef\MMLsecondelement{\getXMLstackdata\plustwo}
+ \endgroup
+ \stoplocalsetups
+ \globallet\MMLfirstelement \empty
+ \globallet\MMLsecondelement\empty
+ \XMLfirstnamed{interval}
+ \endgroup
+ \int\doMMLlimits{int}
+ _{\MMLfirstelement}
+ ^{\MMLsecondelement}
+ } {
+ \int
+ }
+ }
+ }
+ }
+ \MMLcreset
+ \XMLdoifonstackelse{apply} {
+ \doifelseMMCfunction {
+ \XMLfirstnamed{apply}
+ } {
+ % if there are too many () now, we need to be more clever
+ \left(\XMLfirstnamed{apply}\right)
+ }
+ } {
+ \XMLfirstnamed{ci}
+ }
+ \XMLdoifonstackelse{bvar} {
+ \,% \getXMLentity{ThinSpace}%
+% {\MMLrm\getXMLentity{mathematicald}}
+ \mfunction{\getXMLentity{mathematicald}}
+ \XMLfirstnamed{bvar}
+ } {
+ % nothing
+ }
+\stopsetups
+
+\setupMMLappearance[diff][\c!location=\v!top,\c!alternative=\v!a]
+
+\defineXMLcommand [diff] {\directsetup{mmc:diff}}
+\defineXMLcommand [partialdiff] {\directsetup{mmc:partialdiff}}
+
+% \setupMMLappearance[diff][alternative=b]
+%
+% \startXMLdata
+% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><ci>f</ci></apply><ci>a</ci></apply></math>
+% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><degree>2</degree><ci>f</ci></apply><ci>a</ci></apply></math>
+% \stopXMLdata
+
+% d^y/dx^2
+%
+% \startXMLdata
+% <math><apply><diff/>
+% <bvar><ci>x</ci><cn type="integer">2</cn></bvar>
+% <lambda><bvar><ci>x</ci></bvar><ci>y</ci></lambda>
+% </apply></math>
+% \stopXMLdata
+
+\startsetups mmc:diff
+ \MMLcreset
+ \doifelse\@@MMLdiffalternative\v!a {
+ \XMLdoifonstackelse{lambda} {
+ % a special case (mathadore/openmath)
+ \begingroup
+ \defineXMLsave[ci]
+ \defineXMLsave[cn]
+ \defineXMLprocess[lambda]
+ \defineXMLprocess[bvar]
+ \frac {
+ d^{\XMLfirstnamed{bvar}\XMLflush{cn}}{\XMLfirstnamed{lambda}\XMLflush{ci}}
+ } {
+ d{\XMLfirstnamed{bvar}\XMLflush{ci}}^{\XMLfirstnamed{bvar}\XMLflush{cn}}
+ }
+ \endgroup
+ } {
+ \XMLdoifonstackelse{bvar} {
+ \frac {
+ \XMLdoifonstackelse{degree} {
+ \collectXMLnamedstack{degree}\empty
+ } {
+ \collectXMLnamedstacknamed{bvar}{degree}+
+ }
+ \mfunction{\getXMLentity{mathematicald}}
+ ^{\the\XMLRtoks}
+ \doif\@@MMLdifflocation\v!top {
+ \XMLdoifonstackelse{ci} {
+ \XMLfirstnamed{ci}
+ } {
+ \MMLcreset\XMLfirstnamed{apply}
+ }
+ }
+ } {
+ \mfunction{\getXMLentity{mathematicald}}
+ \begingroup
+ \defineXMLsave[degree]
+ \XMLfirstnamed{bvar}
+ \doifXMLdata{degree} {
+ ^{\XMLflush{degree}}
+ }
+ \endgroup
+ }
+ \doifnot\@@MMLdifflocation\v!top {
+ \left(\MMLcreset\XMLfirstnamed{apply,ci}\right)
+ }
+ } {
+ \flushXMLstackfrom\plustwo^\prime
+ }
+ }
+ } {
+ \MMLcreset
+ \XMLfirstnamed{apply,ci}
+ % there can be problems with nested diff's: ^^{} error
+ % so we add an empty group here
+ {}^
+ {
+ \XMLdoifonstackelse{degree} {
+ \defXMLfirstnamedtext\ascii{degree}
+ \dorecurse\ascii\prime
+ } {
+ \prime
+ }
+ }
+ }
+\stopsetups
+
+\startsetups mmc:partialdiff
+ \XMLdoifonstackelse{list} {
+ \getXMLentity{capitaldifferentiald}_{
+ \begingroup
+ \setfalse\MMLlistdelimiters
+ \XMLallnamed{list}
+ \endgroup
+ }
+ \XMLfirstnamed{apply,reln,ci,cn}
+ } {
+ \XMLdoifonstackelse{bvar} {
+ \frac {
+ \XMLdoifonstackelse{degree} {
+ \collectXMLnamedstack{degree}\empty
+ } {
+ \collectXMLnamedstacknamed{bvar}{degree}+
+ }
+ \getXMLentity{differentiald}^{\the\XMLRtoks}
+ % \let\MMLcDEGREE\gobbletwoarguments
+ % \doifelseMMCfunction\MMLcreset\donothing
+ \MMLcreset
+ \XMLfirstnamed{apply,reln,ci,cn}
+ } {
+ \defineXMLnested[bvar]
+ {\directsetup{mmc:bvar:diff:start}}
+ {\directsetup{mmc:bvar:diff:stop}}
+ \XMLfirstnamed{bvar}
+ }
+ } {
+ \XMLfirstnamed{apply,reln,ci,cn}
+ }
+ }
+\stopsetups
+
+\startsetups mmc:bvar:diff:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:bvar:diff:stop
+ \stopsavingXMLelements
+ \getXMLentity{differentiald}\XMLfirstnamed{apply,reln,ci,cn}
+ \XMLdoifonstackelse{degree} {
+ ^{\XMLfirstnamed{degree}}
+ } {
+ % nothing
+ }
+ \endgroup
+\stopsetups
+
+\def\subMMLcelement #1#2{_{#2}}
+\def\superMMLcelement#1#2{^{#2}}
+
+\defineXMLprocess [lowlimit]
+\defineXMLprocess [uplimit]
+\defineXMLprocess [bvar]
+\defineXMLprocess [degree]
+
+% option:
+%
+% \defineXMLentity [div] {\mathematics{\triangledown\times}}
+% \defineXMLentity [curl] {\mathematics{\triangledown .}}
+% \defineXMLentity [grad] {\mathematics{\triangledown }}
+
+\defineXMLcommand [divergence] {\getXMLentity{divergence}\directsetup{mmc:donamedfunction}}
+\defineXMLcommand [grad] {\getXMLentity {grad}\directsetup{mmc:donamedfunction}}
+\defineXMLcommand [curl] {\getXMLentity {curl}\directsetup{mmc:donamedfunction}}
+\defineXMLcommand [laplacian] {\getXMLentity {laplacian}\directsetup{mmc:donamedfunction}}
+
+\defineXMLcommand [ident] {\getXMLentity {identity}\directsetup{mmc:donamedfunction}}
+% \defineXMLcommand [domain] {\getXMLentity {domain}\directsetup{mmc:donamedfunction}}
+% \defineXMLcommand [codomain] {\getXMLentity {codomain}\directsetup{mmc:donamedfunction}}
+
+\defineXMLcommand[domain] {\directsetup{mmc:domain:action}}
+\defineXMLcommand[codomain]{\directsetup{mmc:codomain:action}}
+
+\setupMMLappearance[domain] [symbol=]
+\setupMMLappearance[codomain][symbol=]
+
+\startsetups mmc:domain:action
+ \doifelsenothing\@@MMLdomainsymbol {
+ \getXMLentity{domain}\directsetup{mmc:donamedfunction}
+ } {
+ \@@MMLdomainsymbol_{\flushXMLstackfrom\plustwo}
+ }
+\stopsetups
+\startsetups mmc:codomain:action
+ \doifelsenothing\@@MMLcodomainsymbol {
+ \getXMLentity{codomain}\directsetup{mmc:donamedfunction}
+ } {
+ \@@MMLcodomainsymbol_{\flushXMLstackfrom\plustwo}
+ }
+\stopsetups
+
+
+\startsetups mmc:donamedfunction
+% \left(
+% \begingroup
+ \MMLcreset\flushXMLstackfrom\plustwo
+% \endgroup
+% \right)
+\stopsetups
+
+% theory of sets
+
+\defineXMLnested [set]
+ {\setups{mmc:set:start}}
+ {\setups{mmc:set:stop}}
+
+\startsetups mmc:set:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:set:stop
+ \stopsavingXMLelements
+ \XMLdoifonstackelse{condition} {
+ \left\{\XMLfirstnamed{bvar}\,\middle\vert\,\XMLfirstnamed{condition}\right\}
+ } {
+ \left\{\flushXMLstackwith\plusone{\MMLseparator,}\right\}
+ }
+ \endgroup
+\stopsetups
+
+\defineXMLnested [list]
+ {\setups{mmc:list:start}}
+ {\setups{mmc:list:stop}}
+
+\settrue\MMLlistdelimiters
+
+\startsetups mmc:list:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:list:stop
+ \stopsavingXMLelements
+ \ifconditional\MMLlistdelimiters\left [\fi
+ \begingroup
+ \settrue\MMLlistdelimiters
+ \flushXMLstackwith\plusone{\MMLseparator,}
+ \endgroup
+ \ifconditional\MMLlistdelimiters\right]\fi
+ \endgroup
+\stopsetups
+
+\defineXMLcommand [union] {\MMLcset\cup}
+\defineXMLcommand [intersect] {\MMLcset\cap}
+\defineXMLcommand [in] {\MMLcset\in}
+\defineXMLcommand [notin] {\MMLcset{\not\in}}
+\defineXMLcommand [subset] {\MMLcset\subset}
+\defineXMLcommand [prsubset] {\MMLcset\subseteq}
+\defineXMLcommand [notsubset] {\MMLcset{\not\subset}}
+\defineXMLcommand [notprsubset] {\MMLcset{\not\subseteq}}
+\defineXMLcommand [setdiff] {\MMLcset\setminus}
+
+\def\MMLcset#1{\getXMLstackdata\plustwo#1\getXMLstackdata\plusthree}
+
+\defineXMLcommand [card] {\left\vert\flushXMLstackfrom\plustwo\right\vert}
+\defineXMLcommand [cartesianproduct] {\flushXMLstackwith\plustwo\times}
+
+% sequences and series
+
+\defineXMLcommand [sum] {\MMLcSUMandPRODUCT{sum}\sum}
+\defineXMLcommand [product]{\MMLcSUMandPRODUCT{product}\prod}
+
+\setupMMLappearance[sum] [\c!location=\v!top]
+\setupMMLappearance[product][\c!location=\v!top]
+
+\def\stackMMLsubscripts#1%
+ {\vbox
+ {\baselineskip\zeropoint % hack, taco vragen
+ \halign{$\scriptstyle\hss##\hss$\cr#1\crcr}}}
+
+\def\MMLcSUMandPRODUCT#1#2%
+ {\begingroup
+ \XMLdoifonstackelse{condition,bvar,lowlimit}
+ {\def\MMLcSUMlow
+ {_{\XMLdoifonstackelse{condition}
+ {\collectXMLnamedstack{condition}{\crcr}%
+ \stackMMLsubscripts{\the\XMLRtoks}}
+ {\XMLdoifonstackelse{bvar}
+ {\XMLfirstnamed{bvar}%
+ \XMLdoifonstackelse{lowlimit}{=}{}}%
+ {}%
+ \XMLfirstnamed{lowlimit}}}}}
+ {\let\MMLcSUMlow\empty}%
+ \XMLdoifonstackelse{uplimit}
+ {\def\MMLcSUMup{^{\XMLfirstnamed{uplimit}}}}
+ {\let\MMLcSUMup\empty}%
+ \XMLdoifonstackelse{interval} % open math converter gives this
+ {\begingroup
+ \directsetup{mmc:interval:fetch}%
+ \XMLfirstnamed{interval}%
+ \endgroup
+ \ifx\MMCintervalfrom\empty\else
+ \def\MMLcSUMlow{_{\XMLdoifonstackelse{bvar}{\XMLfirstnamed{bvar}{=}}{}\MMCintervalfrom}}%
+ \fi
+ \ifx\MMCintervalto\empty \else
+ \def\MMLcSUMup{^{\MMCintervalto}}%
+ \fi}
+ {}%
+ \MMLcreset#2\doMMLlimits{#1}\MMLcSUMup\MMLcSUMlow
+ \directsetup{mmc:lambda:simple}% a bit of open math conversion mess
+ \MMLcreset\XMLfirstnamed{apply,lambda,ci}%
+ \endgroup}
+
+\defineXMLcommand [limit] {\directsetup{mmc:limit}}
+
+\setupMMLappearance[limit][\c!location=\v!top]
+
+\startsetups mmc:limit
+ \MMLcreset \lim
+ \doMMLlimits{limit}_{
+ \MMLcreset
+ \XMLdoifonstackelse {condition} {
+ \XMLfirstnamed{condition}
+ } {
+ \XMLdoifonstackelse {bvar} {
+ \XMLfirstnamed{bvar}\rightarrow
+ } {
+ }
+ \XMLfirstnamed{lowlimit}
+ }
+ }
+ \begingroup
+ \MMLcreset
+ \directsetup{mmc:lambda:simple}% a bit of open math conversion mess
+ \XMLfirstnamed{apply,lambda}% lambda needed for openmath
+ \endgroup
+\stopsetups
+
+\defineXMLcommand [tendsto] [type=default] {\directsetup{mmc:tendsto}}
+
+\startsetups mmc:tendsto
+ \MMLcreset \getXMLstackdata\plustwo
+ \processaction
+ [\XMLpar{tendsto}{type}{default}]
+ [ above=>\downarrow,
+ below=>\uparrow,
+ unknown=>\rightarrow]
+ \MMLcreset \getXMLstackdata\plusthree
+\stopsetups
+
+% elementary classical functions
+
+\defineXMLcommand [exp] {\directsetup{mmc:exp}}
+\defineXMLcommand [ln] {\directsetup{mmc:function}}
+\defineXMLcommand [log] {\directsetup{mmc:log}}
+\defineXMLignore [logbase]
+
+\setupMMLappearance[log][\c!location=\v!right]
+
+\startsetups mmc:exp
+ \getXMLentity{exponentiale}^{\XMLfirstnamed{apply,reln,ci,cn}}
+\stopsetups
+
+\startsetups mmc:log
+ \XMLdoifonstackelse {logbase} {
+ \doifelse\@@MMLloglocation\v!left {
+ \mathop{{}^{{\defineXMLprocess[logbase]\XMLfirstnamed{logbase}}}
+ \getXMLentity{NegThinSpace}
+ \getXMLentity{log}}
+ } {
+ \getXMLentity{log}_{{\defineXMLprocess[logbase]\XMLfirstnamed{logbase}}}
+ }
+ } {
+ \getXMLentity{log}
+ }
+ \MMLcreset
+ % mmc:function:argument assumes that the apply is second in the row (*1*)
+ % \removeXMLdatafromstack{logbase}
+ \directsetup{mmc:function:argument}
+\stopsetups
+
+% statistics
+
+\defineXMLcommand [mean] {\overline{\getXMLstackdata\plustwo}}
+\defineXMLcommand [sdev] {\sigma(\MMLcreset\getXMLstackdata\plustwo)}
+\defineXMLcommand [variance] {\sigma(\MMLcreset\getXMLstackdata\plustwo)^2}
+\defineXMLcommand [median] {\getXMLentity{median}(\MMLcreset\getXMLstackdata\plustwo)}
+\defineXMLcommand [mode] {\getXMLentity{mode}(\MMLcreset\getXMLstackdata\plustwo)}
+
+% moments
+
+\defineXMLcommand [moment] {\directsetup{mmc:moment}}
+\defineXMLprocess [momentabout]
+
+\startsetups mmc:moment
+ \left\langle\XMLfirstnamed{apply,reln,ci,cn}^{\XMLfirstnamed{degree}}\right\rangle
+ \XMLdoifonstackelse{momentabout} {
+ _{\XMLfirstnamed{momentabout}}
+ } {
+ }
+\stopsetups
+
+% linear algebra
+
+\defineXMLcommand [vector] {\directsetup{mmc:vector}} % sequence
+
+\setupMMLappearance [vector] [\c!direction=\v!horizontal,\c!separator={,}]
+
+\defineXMLnested
+ [vector]
+ {\directsetup{mmc:vector:start}}
+ {\directsetup{mmc:vector:stop}}
+
+\startsetups mmc:vector:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:vector:stop
+ \stopsavingXMLelements
+ \ifnum\XMLstacklevel>\plusone
+ \doifelse\@@MMLvectordirection\v!horizontal {
+ \left(\flushXMLstackwith\plusone{\MMLseparator\@@MMLvectorseparator}\right)
+ } {
+ \collectXMLstack\crcr
+ \MMLcreset\left(\matrix{\the\XMLRtoks}\right)
+ }
+ \else
+ \overrightarrow{\charhtstrut\getXMLstackdata\plusone}
+ \fi
+ \endgroup
+\stopsetups
+
+\defineXMLnestedenvironmentsave [matrix] {} {\directsetup{mmc:matrix}}
+\defineXMLnestedenvironmentsave [matrixrow] {} {\directsetup{mmc:matrixrow}}
+
+\unexpanded\def\@col@amp@{&}
+
+\settrue\MMCdelmatrix %( ) when true
+
+\startsetups mmc:matrix
+ \begingroup
+ \MMLcreset
+ \defineXMLnestedenvironmentsave [matrixrow] {} {\directsetup{mmc:matrixrow:do}}
+ \ifconditional\MMCdelmatrix
+ \left(\matrix{\XMLflush{matrix}}\right)
+ \else
+ \settrue\MMCdelmatrix
+ \matrix{\XMLflush{matrix}}
+ \fi
+ \endgroup
+\stopsetups
+
+\startsetups mmc:matrixrow
+ \begingroup
+ \MMLcreset
+ \left(\matrix{\directsetup{mmc:matrixrow:do}}\right)
+ \endgroup
+\stopsetups
+
+\startsetups mmc:matrixrow:do
+ \begingroup
+ \startsavingXMLelements
+ \XMLflush{matrixrow}
+ \stopsavingXMLelements
+ \collectXMLstackrows\plusone\@col@amp@
+ \edef\ascii{\the\XMLRtoks}
+ \edef\ascii{\ascii}
+ \expandafter\endgroup\ascii\crcr
+\stopsetups
+
+\defineXMLcommand [determinant] {\directsetup{mmc:determinant}}
+\defineXMLcommand [transpose] {\directsetup{mmc:transpose}}
+\defineXMLcommand [selector] {\directsetup{mmc:selector}}
+
+\startsetups mmc:determinant
+ \begingroup
+ \left|
+ \setfalse\MMCdelmatrix
+ \getXMLstackdata\plustwo
+ \right|
+ \endgroup
+\stopsetups
+
+\startsetups mmc:transpose
+% \getXMLstackdata\plustwo^{\MMLrm T}
+ \getXMLstackdata\plustwo^{\mfunction{T}}
+\stopsetups
+
+\startsetups mmc:selector
+ \MMLmathinner{\getXMLstackdata\plustwo}_{\MMLcreset\flushXMLstackwith\plusthree{\MMLseparator,}}
+\stopsetups
+
+\defineXMLcommand [vectorproduct] {\getXMLstackdata\plustwo\getXMLentity{vectorproduct}\getXMLstackdata\plusthree}
+\defineXMLcommand [scalarproduct] {\getXMLstackdata\plustwo\getXMLentity{scalarproduct}\getXMLstackdata\plusthree}
+\defineXMLcommand [outerproduct] {\getXMLstackdata\plustwo\getXMLentity {outerproduct}\getXMLstackdata\plusthree}
+
+% semantic mapping elements
+
+\defineXMLnested
+ [semantics]
+ {\directsetup{mmc:semantics:start}}
+ {\directsetup{mmc:semantics:stop}}
+
+\startsetups mmc:semantics:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:semantics:stop
+ \stopsavingXMLelements
+ \XMLdoifonstackelse {annotation} {
+ \flushXMLnamedstackwith\plusone{annotation}\empty
+ } {
+ \flushXMLnamedstackwith\plusone{apply}\empty
+ }
+ \endgroup
+\stopsetups
+
+\defineXMLenvironmentsave
+ [annotation]
+ [encoding=]
+ {}
+ {\directsetup{mmc:annotation}}
+
+\startsetups mmc:annotation
+ \expanded{\doifinset{\XMLpar{annotation}{encoding}{}}{TeX,tex,TEX,ConTeXt,context,CONTEXT}} {
+ \XMLtexdata{annotation}
+ }
+\stopsetups
+
+\defineXMLignore [annotation-xml]
+
+% misc
+
+\defineXMLcommand [integers] {\getXMLentity{integers}}
+\defineXMLcommand [reals] {\getXMLentity{reals}}
+\defineXMLcommand [rationals] {\getXMLentity{rationals}}
+\defineXMLcommand [naturalnumbers] {\getXMLentity{naturalnumbers}}
+\defineXMLcommand [complexes] {\getXMLentity{complexes}}
+\defineXMLcommand [primes] {\getXMLentity{primes}}
+\defineXMLcommand [exponentiale] {\getXMLentity{ExponentialE}}
+\defineXMLcommand [imaginaryi] {\getXMLentity{ImaginaryI}}
+\defineXMLcommand [notanumber] {\mathop{\mfunction{NaN}}}
+\defineXMLcommand [true] {\mathop{\mfunction{true}}}
+\defineXMLcommand [false] {\mathop{\mfunction{false}}}
+\defineXMLcommand [emptyset] {\mathop{\O}}
+\defineXMLcommand [pi] {\pi}
+\defineXMLcommand [eulergamma] {\gamma}
+\defineXMLcommand [infinity] {\infty}
+
+% gonio functions
+
+\defineXMLcommand[sin] {\directsetup{mmc:function}} \defineXMLcommand[arcsin] {\directsetup{mmc:function}}
+\defineXMLcommand[sinh]{\directsetup{mmc:function}} \defineXMLcommand[arcsinh]{\directsetup{mmc:function}}
+\defineXMLcommand[cos] {\directsetup{mmc:function}} \defineXMLcommand[arccos] {\directsetup{mmc:function}}
+\defineXMLcommand[cosh]{\directsetup{mmc:function}} \defineXMLcommand[arccosh]{\directsetup{mmc:function}}
+\defineXMLcommand[tan] {\directsetup{mmc:function}} \defineXMLcommand[arctan] {\directsetup{mmc:function}}
+\defineXMLcommand[tanh]{\directsetup{mmc:function}} \defineXMLcommand[arctanh]{\directsetup{mmc:function}}
+\defineXMLcommand[cot] {\directsetup{mmc:function}} \defineXMLcommand[arccot] {\directsetup{mmc:function}}
+\defineXMLcommand[coth]{\directsetup{mmc:function}} \defineXMLcommand[arccoth]{\directsetup{mmc:function}}
+\defineXMLcommand[csc] {\directsetup{mmc:function}} \defineXMLcommand[arccsc] {\directsetup{mmc:function}}
+\defineXMLcommand[csch]{\directsetup{mmc:function}} \defineXMLcommand[arccsch]{\directsetup{mmc:function}}
+\defineXMLcommand[sec] {\directsetup{mmc:function}} \defineXMLcommand[arcsec] {\directsetup{mmc:function}}
+\defineXMLcommand[sech]{\directsetup{mmc:function}} \defineXMLcommand[arcsech]{\directsetup{mmc:function}}
+
+\setupMMLappearance[function][\c!reduction=\v!yes]
+
+\startsetups mmc:function
+ \getXMLentity\currentXMLelement
+ \ifx\MMLpowerelement\empty\else
+ ^{\MMLcreset\MMLpowerelement\empty}
+ \getXMLentity{NegThinSpace}
+ \global\let\MMLpowerelement\empty
+ \fi
+ \doif {\getXMLstackname\plusone} {\currentXMLelement} {
+ % rather fuzzy test; looks like an apply case
+ \directsetup{mmc:function:argument}
+ }
+\stopsetups
+
+\startsetups mmc:function:argument
+ \doifelse\@@MMLfunctionreduction\v!yes {
+ % \doifelse {\getXMLstackname\plustwo} {apply} {
+ % \doifelseMMCfunctioninapply \plustwo \MMLcfunctionlist \donefalse \donetrue
+ %
+ % best is to grab the apply (independent of order), (*1*), so:
+ %
+ \XMLdoifonstackelse {apply} {
+ \doifelseMMCfunctioninapply \XMLstackposition {\MMLcfunctionlist,divide} \donefalse \donetrue
+ } {
+ \donefalse
+ }
+ } {
+ \donetrue
+ }
+ % beware, we still flush from 2 up
+ \ifdone
+ \left(\MMLcreset\flushXMLstackfrom\plustwo\right)
+ \else
+ \MMLcreset\flushXMLstackfrom\plustwo
+ \fi
+\stopsetups
+
+% presentation mml
+
+\def\resetMMLseparator
+ {\newcounter\MMLxxcounter
+ \let\lastMMLseparator\empty}
+
+\def\grabMMLseparator#1%
+ {\increment\MMLxxcounter
+ \newcounter\MMLyycounter
+ \expanded{\dograbMMLseparator#1\noexpand\relax}}
+
+\def\dograbMMLseparator
+ {\increment\MMLyycounter
+ \doifnextcharelse\relax
+ {\lastMMLseparator\gobbleoneargument}
+ {\doifnextcharelse\xmlrent\grabMMLseparatora\grabMMLseparatorb}}
+
+\def\grabMMLseparatora#1\xmlrent#2%
+ {\ifnum\MMLxxcounter=\MMLyycounter\space
+ \def\lastMMLseparator{\xmlrent{#2}}%
+ \fi
+ \dograbMMLseparator}
+
+\def\grabMMLseparatorb#1%
+ {\ifnum\MMLxxcounter=\MMLyycounter\space
+ \doifXMLentityelse{#1}
+ {\def\lastMMLseparator{\xmlrent{#1}}}
+ {\def\lastMMLseparator{#1}}%
+ \fi
+ \dograbMMLseparator}
+
+%
+
+\defineXMLargument [mi] \MMLpMI
+\defineXMLargument [mn] \MMLpMN
+\defineXMLargument [mo] \MMLpMO
+
+\def\MMLpMI#1%
+ {\begingroup
+ \setMMLpmathstyle{mstyle}%
+ #1%
+ \endgroup}
+
+% \def\MMLpMN#1%
+% {\begingroup
+% \MMLrm
+% \setMMLpmathstyle{mstyle}%
+% #1%
+% \endgroup}
+
+\def\MMLpMN#1%
+ {\mfunction{\setMMLpmathstyle{mstyle}#1}}
+
+\def\MMLpMO#1% yes or no
+ {\flattenXMLcontent{#1}%
+ \doifXMLentityelse\flattenedXMLcontent
+ {\getXMLentity\flattenedXMLcontent}
+ {\ConvertConstantAfter\doifinstringelse{\xmlrent}{#1} % TODO ! ! ! ! ! ! ! !
+ {#1}
+ {\hbox
+ {\setMMLpmathstyle{mstyle}%
+ \ignorespaces#1\unskip}}}}
+
+% we need to get rid of spaces: <mo> &RightArrow; </mo>
+
+\def\MMLpMO#1% yes or no
+ {\flattenXMLcontent{#1}%
+ \doifXMLentityelse\flattenedXMLcontent
+ {\getXMLentity\flattenedXMLcontent}
+ {\ignorespaces#1\removeunwantedspaces}}
+
+\def\doMMLleft #1{\pushmacro\left \let\left \empty\normalleft #1\popmacro\left}
+\def\doMMLright#1{\pushmacro\right\let\right\empty\normalright#1\popmacro\right}
+
+\let\MMLpopen \empty
+\let\MMLpclose\empty
+
+\defineXMLnested [mfenced] [open=(,close=),separators=]
+ {\directsetup{mmp:mfenced:start}}
+ {\directsetup{mmp:mfenced:stop}}
+
+\startsetups mmp:mfenced:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:mfenced:stop
+ \stopsavingXMLelements
+ \edef\MMLpopen {\XMLpar{mfenced}{open} {}}
+ \edef\MMLpclose{\XMLpar{mfenced}{close}{}}
+ \ifx\MMLpopen \space\let\MMLpopen \empty\fi
+ \ifx\MMLpclose\space\let\MMLpclose\empty\fi
+ \ifx\MMLpopen\empty
+ \ifx\MMLpclose\empty
+ \else
+ \doMMLleft.
+ \fi
+ \else
+ \doMMLleft\MMLpopen
+ \fi
+ \pushmacro\MMLpopen
+ \pushmacro\MMLpclose
+ \doifelsenothing{\XMLpar{mfenced}{separators}{}} {
+ \flushXMLstackfrom\plusone
+ } {
+ \resetMMLseparator
+ \flushXMLstackwith\plusone {
+ \begingroup
+ \let\myspecialnormalvert\myspecialstretchvert
+ \grabMMLseparator{\XMLpar{mfenced}{separators}{}}
+ \endgroup
+ }
+ }
+ \popmacro\MMLpclose
+ \popmacro\MMLpopen
+ \ifx\MMLpclose\empty
+ \ifx\MMLpopen\empty
+ \else
+ \doMMLright.
+ \fi
+ \else
+ \doMMLright\MMLpclose
+ \fi
+ \endgroup
+\stopsetups
+
+% \startbuffer
+% <math><mfenced separators="" open="(" close=")"><mi>x</mi></mfenced></math>
+% <math><mfenced separators="" open="" close=")"><mi>x</mi></mfenced></math>
+% <math><mfenced separators="" open="(" close="" ><mi>x</mi></mfenced></math>
+% <math><mfenced separators="" open="" close="" ><mi>x</mi></mfenced></math>
+% <math><mfenced separators="" open="" close=" "><mi>x</mi></mfenced></math>
+% \stopbuffer
+%
+% \processXMLbuffer
+
+\defineXMLnestedenvironmentsave [menclose] [notation=]
+ {\directsetup{mmp:menclose:start}}
+ {\directsetup{mmp:menclose:stop}}
+
+\startsetups mmp:menclose:start
+ \begingroup
+\stopsetups
+
+\startsetups mmp:menclose:stop
+ \doifelse{\XMLpar{menclose}{notation}{}}{longdiv} {
+ \overline{)\XMLflush{menclose}}
+ } {
+ \XMLflush{menclose}
+ }
+ \endgroup
+\stopsetups
+
+\defineXMLnested [mfrac] [linethickness=]
+ {\directsetup{mmp:mfrac:start}}
+ {\directsetup{mmp:mfrac:stop}}
+
+\startsetups mmp:mfrac:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:mfrac:stop
+ \stopsavingXMLelements
+ \doifXMLparelse{mfrac}{linethickness} {
+ \edef\theXMLpar{\XMLpar{mfrac}{linethickness}{1}}
+ \processaction
+ [\theXMLpar]
+ [ thin=>\scratchdimen=.2pt,
+ medium=>\scratchdimen=.4pt,
+ thick=>\scratchdimen=.8pt,
+ unknown=>\setdimensionwithunit\scratchdimen{\theXMLpar}{}]
+ {{\getXMLstackdata\plusone}\above\scratchdimen{\getXMLstackdata\plustwo}}
+ } {
+ \frac{\getXMLstackdata\plusone}{\getXMLstackdata\plustwo}
+ }
+ \endgroup
+\stopsetups
+
+\defineXMLargument
+ [ms]
+ [lquote=\xmlrent{quot},
+ rquote=\xmlrent{quot},
+ fontweight=,
+ fontstyle=,
+ mathstyle=,
+ mathvariant=,
+ background=,
+ color=]
+ {\MMLpSTRING}
+
+\def\MMLpSTRING#1%
+ {\hbox
+ {\tf % else encoding problems
+ \MMLpTEXT{\XMLpar{ms}{lquote}{}%
+ \doMMPpbackground{ms}{\doMMPpcolor{ms}{\setMMLptextstyle{ms}\ignorespaces#1\removeunwantedspaces}}%
+ \XMLpar{ms}{rquote}{}}}}
+
+\defineXMLenvironment
+ [mstyle]
+ [fontweight=,
+ fontstyle=,
+ mathstyle=,
+ mathvariant=,
+ background=,
+ color=]
+ {\begingroup}
+ {\endgroup}
+
+\defineXMLargument [mtext] [CPA] \MMLpTEXT
+\defineXMLargument [merror] [CPA] \MMLpERROR
+\defineXMLargument [mphantom] [CPA] \MMLpPHANTOM
+\defineXMLargument [mpadded] [CPA] \MMLpPADDED
+
+\mapXMLvalue{mmp}{normal} {\tf} \mapXMLvalue{mmp}{double-stuck} {\bf}
+\mapXMLvalue{mmp}{bolditalic} {\bi} \mapXMLvalue{mmp}{bold-italic} {\bi}
+\mapXMLvalue{mmp}{boldslanted}{\bs} \mapXMLvalue{mmp}{bold-slanted} {\bs}
+\mapXMLvalue{mmp}{boldnormal} {\bf} \mapXMLvalue{mmp}{bold} {\bf}
+\mapXMLvalue{mmp}{slanted} {\sl} \mapXMLvalue{mmp}{normalslanted}{\sl}
+\mapXMLvalue{mmp}{italic} {\it} \mapXMLvalue{mmp}{normalitalic} {\it}
+\mapXMLvalue{mmp}{fraktur} {\bf} \mapXMLvalue{mmp}{bold-fraktur} {\bf}
+\mapXMLvalue{mmp}{script} {\tf} \mapXMLvalue{mmp}{bold-script} {\bf}
+
+% and all kind of other crappy names
+
+\def\setMMLptextstyle#1%
+ {\XMLval{mmp}{\XMLpar{#1}{fontweight}{}\XMLpar{#1}{fontstyle}{}}{}}
+
+\def\setMMLpmathstyle#1%
+ {\XMLval{mmp}{\XMLpar{#1}{mathvariant}{}}{}}
+
+\def\doMMPpcolor#1#2%
+ {\doifXMLparelse{#1}{color}{\color[\XMLpar{#1}{color}{}]{#2}}{#2}}
+
+\def\doMMPpbackground#1#2%
+ {\doifXMLparelse{#1}{background}
+ {\inframed
+ [\c!frame=\v!off,
+ \c!background=\v!color,
+ \c!backgroundcolor=\XMLpar{#1}{background}{}]
+ {#2}}
+ {#2}}
+
+\def\MMLpTEXT#1%
+ {\hbox
+ {\tf % else encoding problems
+ \doMMPpbackground{ms}{\doMMPpcolor{ms}{\setMMLptextstyle{ms}\ignorespaces#1\removeunwantedspaces}}}}
+
+\def\MMLpERROR#1%
+ {\hbox{$\displaystyle#1$}}
+
+\def\MMLpPHANTOM#1%
+ {\phantom{\ignorespaces{}#1\unskip}} % watch spacing {} hack
+
+\def\MMLpPADDED#1%
+ {#1}
+
+% mrow
+
+\defineXMLenvironment [mrow] {\resetMMLbounds} {\finishMMLbounds}
+
+% \def\MMLleft #1{\increment\MMLboundslevel\left #1}
+% \def\MMLright#1{\right#1\decrement\MMLboundslevel}
+
+% \def\resetMMLbounds
+% {\let\MMLboundslevel\!!plusone\left.}
+
+% \def\finishMMLbounds
+% {\dorecurse\MMLboundslevel{\right.}}
+
+\def\resetMMLbounds
+ {\pushmacro\MMLboundslevel
+ \newcounter\MMLboundslevel}
+
+\def\MMLleft #1%
+ {\increment\MMLboundslevel
+ \normalleft#1}
+
+\def\MMLright#1%
+ {\ifnum\MMLboundslevel=0 \normalleft.\!\fi
+ \normalright#1%
+ \decrement\MMLboundslevel}
+
+\def\finishMMLbounds
+ {\ifnum\MMLboundslevel>0
+ \normalright.\!%
+ \decrement\MMLboundslevel
+ \expandafter\finishMMLbounds
+ \else
+ \popmacro\MMLboundslevel
+ \fi}
+
+\defineXMLnested [msqrt] {\directsetup{mmp:msqrt:start}} {\directsetup{mmp:msqrt:stop}}
+\defineXMLnested [mroot] {\directsetup{mmp:mroot:start}} {\directsetup{mmp:mroot:stop}}
+
+\startsetups mmp:msqrt:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:msqrt:stop
+ \stopsavingXMLelements
+ \sqrt{\flushXMLstackfrom\plusone}
+ \endgroup
+\stopsetups
+
+\startsetups mmp:mroot:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:mroot:stop
+ \stopsavingXMLelements
+ \root{\getXMLstackdata\plustwo}\of{\getXMLstackdata\plusone}
+ \endgroup
+\stopsetups
+
+\setupMMLappearance[scripts][\c!alternative=\v!a]
+
+\defineXMLnested [msub] {\directsetup{mmp:msub:start}} {\directsetup{mmp:msub:stop}}
+\defineXMLnested [msup] {\directsetup{mmp:msup:start}} {\directsetup{mmp:msup:stop}}
+\defineXMLnested [msubsup] {\directsetup{mmp:msbp:start}} {\directsetup{mmp:msbp:stop}}
+
+\startsetups mmp:msub:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:msub:stop
+ \stopsavingXMLelements
+ \doifelse\@@MMLscriptsalternative\v!a {
+ {\getXMLstackdata\plusone}_{\getXMLstackdata\plustwo}
+ } {
+ \getXMLstackdata\plusone_{\getXMLstackdata\plustwo}
+ }
+ \endgroup
+\stopsetups
+
+\startsetups mmp:msup:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:msup:stop
+ \stopsavingXMLelements
+ \doifelse\@@MMLscriptsalternative\v!a {
+ {\getXMLstackdata\plusone}^{\getXMLstackdata\plustwo}
+ } {
+ \getXMLstackdata\plusone^{\getXMLstackdata\plustwo}
+ }
+ \endgroup
+\stopsetups
+
+\startsetups mmp:msbp:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:msbp:stop
+ \stopsavingXMLelements
+ \getXMLstackdata\plusone_{\getXMLstackdata\plustwo}^{\getXMLstackdata\plusthree}
+ \endgroup
+\stopsetups
+
+\defineXMLnested [mover] {\directsetup{mmp:mover:start}} {\directsetup{mmp:mover:stop}}
+\defineXMLnested [munder] {\directsetup{mmp:munder:start}} {\directsetup{mmp:munder:stop}}
+\defineXMLnested [munderover] {\directsetup{mmp:munderover:start}} {\directsetup{mmp:munderover:stop}}
+
+\startsetups mmp:mover:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:mover:stop
+ \stopsavingXMLelements
+ \mathop{\vbox{\mathsurround\zeropoint\ialign{\hss##\hss\crcr\noalign{\kern3\points}%
+ \disabledelimiter\doMMLfiller{\getXMLstackdata\plustwo}
+ \crcr\noalign{\kern3\points\nointerlineskip}%
+ \disabledelimiter\doMMLfiller{\getXMLstackdata\plusone}
+ \crcr}}}
+ \limits
+ \endgroup
+\stopsetups
+
+\startsetups mmp:munder:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:munder:stop
+ \stopsavingXMLelements
+ \mathop{\vtop{\mathsurround\zeropoint\ialign{\hss##\hss\crcr
+ \disabledelimiter\doMMLfiller{\getXMLstackdata\plusone}
+ \crcr\noalign{\kern3\points\nointerlineskip}%
+ \disabledelimiter\doMMLfiller{\getXMLstackdata\plustwo}
+ \crcr\noalign{\kern3\points}}}}
+ \limits
+ \endgroup
+\stopsetups
+
+\startsetups mmp:munderover:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:munderover:stop
+ \stopsavingXMLelements
+ \getXMLstackdata\plusone
+ _{\disablefiller\disabledelimiter\getXMLstackdata\plustwo}
+ ^{\disablefiller\disabledelimiter\getXMLstackdata\plusthree}
+ \endgroup
+\stopsetups
+
+\def\doMMLfiller#1% bugged
+ {\pushmacro\doMMLfiller
+ \let\doMMLfiller\gobbleoneargument
+ \gdef\dodoMMLfiller{\disablefiller\mathematics{#1}}%
+ \hbox
+ {\def\normalorfiller##1##2%
+ {\gdef\dodoMMLfiller{\enablefiller#1}%
+ \let\normalorfiller\gobbletwoarguments}%
+ $#1$}%
+ \popmacro\doMMLfiller
+ \dodoMMLfiller}
+
+% tables
+
+% obsolete: \setupMMLappearance[mtable][\c!alternative=\v!a]
+
+\mapXMLvalue {mmp:mtable} {align:left} {right}
+\mapXMLvalue {mmp:mtable} {align:right} {left}
+\mapXMLvalue {mmp:mtable} {align:center} {middle}
+
+\mapXMLvalue {mmp:mtable} {frame:none} {off}
+\mapXMLvalue {mmp:mtable} {frame:solid} {on}
+\mapXMLvalue {mmp:mtable} {frame:on} {on}
+
+\defineXMLnested
+ [mtable]
+ [columnalign=,
+ columnspacing=.25ex,
+ rowspacing=.25ex,
+ frame=,
+ color=,
+ background=]
+ {\directsetup{mmp:mtable:start}}
+ {\directsetup{mmp:mtable:stop}}
+
+\defineXMLnestedargument
+ [mtr]
+ {\MMPmtableHANDLEtr}
+
+\defineXMLnestedargument
+ [mlabeledtr]
+ {\MMPmtableHANDLEtr}
+
+\defineXMLnestedargument
+ [mtd]
+ [columnalign=,
+ columnspacing=.25ex,
+ rowspacing=.25ex,
+ frame=,
+ color=,
+ background=]
+ {\MMPmtableHANDLEtd}
+
+\startsetups mmp:mtable:start
+ \vcenter \bgroup
+ \MMLpTABLEsplitter{background} \c!backgroundcolor
+ \MMLpTABLEsplitter{color} \c!color
+ \MMLpTABLEmapper {frame} \c!frame
+ \MMLpTABLEmapper {columnalign}\c!align
+ \setMMLpunit{\XMLpar{mtable}{rowspacing}\empty}{.25ex}
+ \let\MMLpTABLEoffset\MMLpunit
+ \bTABLE[\c!frame=\v!off,\c!background=\v!color,\c!offset=\MMLpTABLEoffset]
+\stopsetups
+
+\startsetups mmp:mtable:stop
+ \eTABLE
+ \egroup
+\stopsetups
+
+\long\def\MMPmtableHANDLEtr#1{%
+ \bTR\ignorespaces#1\removeunwantedspaces\eTR
+}
+
+\long\def\MMPmtableHANDLEtd#1{%
+ \let\theMMLpTABLEmap\empty
+ \MMLpTABLEmap{background} \c!backgroundcolor
+ \MMLpTABLEmap{color} \c!color
+ \MMLpTABLEmap{frame} \c!frame
+ \MMLpTABLEmap{columnalign}\c!align
+ \expanded{\bTD[\theMMLpTABLEmap]}%
+ $\ignorespaces#1\removeunwantedspaces$\eTD
+}
+
+\def\MMLpTABLEmapper#1#2%
+ {\doifXMLparelse{mtable}{#1}
+ {\newcounter\MMLcounter
+ \def\docommand##1%
+ {\increment\MMLcounter
+ \expanded{\setupTABLE[column][\MMLcounter][#2=\XMLval{mmp:mtable}{#2:##1}\empty]}}%
+ \expanded{\processseparatedlist[\XMLpar{mtable}{#1}\empty]}[ ]\docommand}
+ {}}
+
+\def\MMLpTABLEsplitter#1#2%
+ {\doifXMLparelse{mtable}{#1}
+ {\newcounter\MMLcounter
+ \def\docommand##1%
+ {\increment\MMLcounter
+ \expanded{\setupTABLE[column][\MMLcounter][#2=##1]}}%
+ \expanded{\processseparatedlist[\XMLpar{mtable}{#1}\empty]}[ ]\docommand}
+ {}}
+
+\def\MMLpTABLEmap#1#2%
+ {\doifXMLparelse{mtd}{#1}
+ {\edef\theMMLpTABLEmap{#2=\XMLval{mmp:mtable}{#2:\XMLpar{mtd}{#1}\empty}\empty,\theMMLpTABLEmap}}
+ {}}
+
+\defineXMLsingular [mspace] [width=.5em] {\directsetup{mmp:mspace}}
+
+\startsetups mmp:mspace
+ \setMMLpunit{\XMLpar{mspace}{width}{}}{.5em}
+ \hskip\MMLpunit\relax
+\stopsetups
+
+\def\setMMLpunit#1#2% i've forgotten what this means
+ {\setbox\scratchbox=\hbox
+ {\edef\ascii{#1}%
+ \@EA\aftersplitstring\ascii\at.\to\ascii
+ \scratchcounter=\ifx\ascii\empty#1\else\ascii\fi
+ \unskip\unskip}%
+ \ifdim\wd\scratchbox=\zeropoint
+ \edef\MMLpunit{#1em}%
+ \else
+ \edefconvertedargument\ascii{#1}%
+ \convertasciiafter\doifinstringelse{em}{\ascii}{\edef\MMLpunit{#1}}{%
+ \convertasciiafter\doifinstringelse{ex}{\ascii}{\edef\MMLpunit{#1}}{%
+ \convertasciiafter\doifinstringelse{pt}{\ascii}{\edef\MMLpunit{#1}}{%
+ \edef\MMLpunit{#2}}}}%
+ \fi}
+
+% end of tables
+
+\def\setMMLpunit#1#2%
+ {\setbox\scratchbox=\hbox
+ {\edef\ascii{#1}%
+ \@EA\aftersplitstring\ascii\at.\to\ascii
+ \scratchcounter=\ifx\ascii\empty#1\else\ascii\fi
+ \unskip\unskip}%
+ \ifdim\wd\scratchbox=\zeropoint
+ \edef\MMLpunit{#1em}%
+ \else
+ \edefconvertedargument\ascii{#1}%
+ \convertasciiafter\doifinstringelse{em}{\ascii}{\edef\MMLpunit{#1}}{%
+ \convertasciiafter\doifinstringelse{ex}{\ascii}{\edef\MMLpunit{#1}}{%
+ \convertasciiafter\doifinstringelse{pt}{\ascii}{\edef\MMLpunit{#1}}{%
+ \edef\MMLpunit{#2}}}}%
+ \fi}
+
+\defineXMLsingular [mspace] [width=.5em] {\directsetup{mmp:mspace}}
+
+\startsetups mmp:mspace
+ \setMMLpunit{\XMLpar{mspace}{width}{}}{.5em}
+ \hskip\MMLpunit
+\stopsetups
+
+\defineXMLsingular [mglyph] [fontfamily=,index=1,alt=] {\directsetup{mmp:mglyph}}
+
+\startsetups mmp:mglyph
+ \def\MMLpglyph{\XMLpar{mglyph}{fontfamily}{}}%
+ \doifelsenothing{\MMLpglyph} {
+ \hbox{\tttf[fontfamily unspecified]}
+ } {
+ \doifdefinedelse{\MMLpglyph} {
+ \hbox{\getvalue{\MMLpglyph}\char0\XMLpar{mglyph}{index}{1}}
+ } {
+ \doifelsenothing{\XMLpar{mglyph}{alt}{}} {
+ \hbox{\tttf[unknown fontfamily \XMLpar{mglyph}{fontfamily}{}]}
+ } {
+ \hbox{\tttf\XMLpar{mglyph}{alt}{}}
+ }
+ }
+ }
+\stopsetups
+
+\defineXMLsingular [malignmark] {}
+\defineXMLsingular [none] {}
+\defineXMLsingular [mprescripts] {}
+
+\defineXMLnested
+ [mmultiscripts]
+ {\setups{mmp:mmultiscripts:start}}
+ {\setups{mmp:mmultiscripts:stop}}
+
+\startsetups mmp:mmultiscripts:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmp:mmultiscripts:stop
+ \stopsavingXMLelements
+ \donefalse
+ \scratchcounter\zerocount
+ \dorecurse\XMLstacklevel {
+ % watch the extra {}'s
+ \ifdone
+ \ifodd\scratchcounter
+ _{\getXMLstackdata\recurselevel}
+ \else
+ ^{\getXMLstackdata\recurselevel}{}
+ \fi
+ \else
+ \doif{\getXMLstackname\recurselevel}{mprescripts}{\donetrue{}}
+ \fi
+ \ifdone \advance\scratchcounter\plusone \fi
+
+ }
+ \donetrue
+ \scratchcounter\zerocount
+ \dorecurse\XMLstacklevel {
+ \ifdone
+ % watch the extra {}'s
+ \ifcase\scratchcounter
+ \getXMLstackdata\recurselevel
+ \else\ifodd\scratchcounter
+ _{\getXMLstackdata\recurselevel}
+ \else
+ ^{\getXMLstackdata\recurselevel}{}
+ \fi\fi
+ \fi
+ \doif{\getXMLstackname\recurselevel}{mprescripts}{\donefalse}
+ \ifdone \advance\scratchcounter\plusone \fi
+ }
+ \endgroup
+\stopsetups
+
+% experimental patches
+
+\startmoduletestsection
+
+\let\MMLdoL\donothing
+\let\MMLdoR\donothing
+
+\startsetups mmc:apply:start
+ \begingroup
+ \startsavingXMLelements
+\stopsetups
+
+\startsetups mmc:apply:stop
+ \stopsavingXMLelements
+ \MMLmathinner {
+ \expanded{\doifinsetelse{\getXMLstackname\plusone}{\MMLcmainresetlist,\MMLctempresetlist}}
+ \MMLcreset
+ \donothing
+ \ifcase\MMLapplydepth \else
+ \doifXMLparelse{apply}{open} \donothing{\getXMLarguments{apply}{open="("}}% slow
+ \doifXMLparelse{apply}{close}\donothing{\getXMLarguments{apply}{close=")"}}% slow
+ \fi
+ \advance\MMLapplydepth\plusone
+ \begingroup
+ \doifXMLparelse{apply}{open} % now inside the group
+ {\edef\MMLdoL{\noexpand\left \XMLpar{apply}{open} {(}}
+ \edef\MMLdoR{\noexpand\right\XMLpar{apply}{close}{)}}}
+ {\let\MMLdoL\donothing
+ \let\MMLdoR\donothing}
+ \let\MMLctempresetlist\empty
+ \doifelse {\getXMLstackname\plusone} {apply} {
+ % <apply> <apply> ... </apply> <ci> .. </ci> </apply>
+ \doifelseMMCfunctioninapply \plusone {plus,minus} {
+% [a]
+ % yet incomplete and rather untested
+ % <apply> <apply> <minus/> <tan/> <cos/> </apply> <ci>x</ci> </apply>
+ } {
+% [b]
+ \MMLcreset
+ }
+ \MMLdoL
+ \getXMLstackdata\plusone
+ \ifconditional\somepostponedMMLactions
+ \postponedMMLactions
+ \else
+ \left(\MMLcreset\getXMLstackdata\plustwo\right)
+ \fi
+ \MMLdoR
+ } {
+ \doifelse {\getXMLstackname\plusone} {fn} {
+% [c]
+ % \MMLdoL/R are to be taken care of in the next setup
+ \directsetup{mmc:fn:apply}
+ } {
+ \doifelse {\getXMLstackname\plusone} {csymbol} {
+ % \MMLdoL/R are to be taken care of in the next setup
+% [d]
+ \directsetup{mmc:csymbol:apply}
+ } {
+ \doifelse {\getXMLstackname\plusone} {ci} {
+% [e]
+ % \MMLdoL/R are to be taken care of in the next setup
+ \directsetup{mmc:ci:apply}
+ } {
+% [f]
+ \MMLdoL
+ \getXMLstackdata\plusone
+ \MMLdoR
+ }
+ }
+ }
+ }
+ \endgroup
+ \advance\MMLapplydepth\minusone
+ \directsetup{apply:flush}
+ }
+ \endgroup
+\stopsetups
+
+\startsetups mmc:fn:apply
+ \begingroup
+ \startsavingXMLelements
+ \rawXMLstacktext\plusone % still on stack, no check, just fn content
+ \stopsavingXMLelements
+ \doifelse {\getXMLstackname\plusone} {ci} {
+ \flattenXMLcontent{\getXMLstackdata\plusone}
+ \doifsetupselse{mmc:fn:\flattenedXMLcontent} {
+ % \MMLdoL/MMLdoR to be handled in plugin
+ \global\defXMLstackdata\XMLfnoperator\plusone
+ \expanded{\endgroup\noexpand\directsetup{mmc:fn:\flattenedXMLcontent}}
+ } {
+ \endgroup
+ \MMLcreset
+ \MMLdoL
+ \getXMLstackdata\plusone
+ \ifnum\XMLstacklevel>\plusone
+ \getXMLentity{NegThinSpace}
+ \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
+ \fi
+ \MMLdoR
+ }
+ } {
+ \endgroup
+ \MMLcreset
+ \MMLdoL
+ \getXMLstackdata\plusone
+ \MMLdoR
+ }
+\stopsetups
+
+\startsetups mmc:csymbol:apply
+ \begingroup
+ \defineXMLsave[csymbol][definitionURL=,encoding=]
+ \rawXMLstackdata\plusone % was text % still on stack, no check, just attr test
+ % \MMLdoL/MMLdoR to be handled in plugin
+ \lowercasestring\XMLpar{csymbol}{definitionURL}{}\to\mmcSymbolURL
+ \doifsetupselse{mmc:csymbol:\mmcSymbolURL} {
+ \expanded{\endgroup\noexpand\directsetup{mmc:csymbol:\mmcSymbolURL}}
+ } {
+ \endgroup
+ %\XMLval{mmc:cs}{\XMLop{encoding}}{\firstofoneargument}% fails when no content
+ \XMLval{mmc:cs}{\XMLop{encoding}}{}
+ }
+\stopsetups
+
+\defineXMLsingular
+ [csymbol]
+ [encoding=text,
+ definitionURL=]
+ {\directsetup{mmc:csymbol:apply:singular}}
+
+\startsetups mmc:csymbol:apply:singular
+ \lowercasestring\XMLpar{csymbol}{definitionURL}{}\to\mmcSymbolURL
+ \directsetup{mmc:csymbol:\mmcSymbolURL}
+\stopsetups
+
+\startsetups mmc:ci:apply
+ \getXMLstackdata\plusone
+ \ifnum\XMLstacklevel>\plusone
+ \left(\MMLcreset\flushXMLstackwith\plustwo{\MMLseparator,}\right)
+ \fi
+\stopsetups
+
+\def\xflushXMLstackwith#1#2#3#4% num bgroup egroup whatever
+ {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {#2\relax
+ \ifnum\recurselevel>#1\relax#4\fi
+ \getXMLstackdata\recurselevel
+ #3}}
+
+\def\xflushXMLstackfrom#1#2#3%
+ {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {#2\getXMLstackdata\recurselevel#3}}
+
+% <apply><divide/>
+% <apply><minus/>
+% <apply><minus/><ci>b</ci></apply>
+% <apply><minus/><ci>b</ci></apply>
+% <apply><root/> <ci>a</ci></apply>
+% </apply>
+% <apply><minus/>
+% <apply><minus/><ci>b</ci><ci>b</ci></apply>
+% <apply><minus/><ci>b</ci></apply>
+% <apply><root/> <ci>a</ci></apply>
+% </apply>
+% </apply>
+
+\startsetups mmc:minus
+ \doif \@@MMLsignreduction \v!yes {
+ \setMMLcreset{fn,\MMLcfunctionlist}
+ }
+ \ifcase\XMLstacklevel
+ \or
+ % self
+ \or
+ -\getXMLstackdata\plustwo
+ \else
+ \dostepwiserecurse\plustwo\XMLstacklevel\plusone {
+ \begingroup
+ \doifelse {\getXMLstackname\recurselevel} {apply} {
+ \ifnum\recurselevel=\plustwo
+ \begingroup
+ \dodoifelseMMCfunctioninapply \recurselevel {minus} {
+ \ifnum\XMLstacklevel>\plustwo
+ \endgroup
+ \else
+ \endgroup
+ \MMLcreset
+ \fi
+ } {
+ \endgroup
+ }
+ \else
+ \doifelseMMCfunctioninapply \recurselevel {\MMLcfunctionlist,\MMLcconstructlist} {
+ \MMLcreset
+ } {
+ }
+ \fi
+ } {
+ }
+ \getXMLstackdata\recurselevel
+ \ifnum\recurselevel<\XMLstacklevel\relax
+ -
+ \fi
+ \endgroup
+ }
+ \fi
+\stopsetups
+
+\stopmoduletestsection
+
+\stopmodule
+
+\protect \endinput
diff --git a/tex/context/base/x-newmml.mkiv b/tex/context/base/x-newmml.mkiv
new file mode 100644
index 000000000..757dcf389
--- /dev/null
+++ b/tex/context/base/x-newmml.mkiv
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=x-newmml,
+%D version=2008.05.28,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=MathML Renderer,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\input x-mathml.mkiv
+
+\endinput
diff --git a/tex/context/base/x-newmml.tex b/tex/context/base/x-newmml.tex
new file mode 100644
index 000000000..9eb994021
--- /dev/null
+++ b/tex/context/base/x-newmml.tex
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=x-newmml,
+%D version=2005.06.10, % 1999.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=MathML Renderer,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{x-newmml}
+
+\endinput
diff --git a/tex/context/base/x-newmmo.tex b/tex/context/base/x-newmmo.tex
new file mode 100644
index 000000000..c3b56cc16
--- /dev/null
+++ b/tex/context/base/x-newmmo.tex
@@ -0,0 +1,210 @@
+%D \module
+%D [ file=x-newmmo,
+%D version=2006.05.17,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=MathML Renderer/Open Math Extensions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Strange things, why not mapped onto normal content MathML and/or
+%D onto processing instructions.
+
+\unprotect
+
+%D \startbuffer
+%D <math xmlns="http://www.w3.org/1998/Math/MathML">
+%D <vector>
+%D <apply>
+%D <csymbol definitionURL="http://www.openmath.org/cd/nums1#rational"/>
+%D <ci>a</ci>
+%D <cn type="integer">2</cn>
+%D </apply>
+%D <ci>a</ci>
+%D </vector>
+%D </math>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/nums1\letterhash rational
+ \MMLcreset
+ \getXMLstackdata\plustwo/\getXMLstackdata\plusthree
+\stopsetups
+
+%D \startbuffer
+%D <math xmlns="http://www.w3.org/1998/Math/MathML">
+%D <apply>
+%D <csymbol definitionURL="http://www.openmath.org/cd/math4all#diffquot"/>
+%D <ci>y</ci>
+%D <ci>x</ci>
+%D </apply>
+%D </math>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash diffquot
+ \MMLcreset
+ \frac {
+ \Delta\getXMLstackdata\plustwo
+ } {
+ \Delta\getXMLstackdata\plusthree
+ }
+\stopsetups
+
+%D \startbuffer
+%D <math xmlns="http://www.w3.org/1998/Math/MathML">
+%D <apply>
+%D <csymbol definitionURL="http://www.openmath.org/cd/math4all#difference"/>
+%D <ci>y</ci>
+%D </apply>
+%D </math>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D \startbuffer
+%D <math xmlns="http://www.w3.org/1998/Math/MathML">
+%D <apply>
+%D <csymbol definitionURL="http://www.openmath.org/cd/math4all#difference"/>
+%D <apply>
+%D <eq/>
+%D <ci>y</ci>
+%D <apply>
+%D <minus/>
+%D <apply>
+%D <ci>f</ci>
+%D <ci>x</ci>
+%D </apply>
+%D <apply>
+%D <ci>f</ci>
+%D <apply>
+%D <minus/>
+%D <ci>x</ci>
+%D <cn type="integer">1</cn>
+%D </apply>
+%D </apply>
+%D </apply>
+%D </apply>
+%D </apply>
+%D </math>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash difference
+ \MMLcreset
+ \Delta\getXMLstackdata\plustwo
+\stopsetups
+
+%D \startbuffer
+%D <math xmlns="http://www.w3.org/1998/Math/MathML">
+%D <apply>
+%D <csymbol definitionURL="http://www.openmath.org/cd/math4all#diff"/>
+%D <ci>s</ci>
+%D <ci>t</ci>
+%D </apply>
+%D </math>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash diff
+ \MMLcreset
+ \frac {
+ \mfunction{\getXMLentity{mathematicald}}\getXMLstackdata\plustwo
+ } {
+ \mfunction{\getXMLentity{mathematicald}}\getXMLstackdata\plusthree
+ }
+\stopsetups
+
+%D A unit mess.
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@second {\mr s}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@minute {\mr m}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@hour {\mr h}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@day {\mr d}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@week {\mr w}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@month {\mr m}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@year {\mr y}\stopsetups
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@meter {\mr m}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@gram {\mr g}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@liter {\mr l}\stopsetups
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@watt {\mr W}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@pascal {\mr P}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@kelvin {\mr K}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@celsius {\mr C}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@newton {\mr N}\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@byte {\mr B}\stopsetups
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@pico {\mr p}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@micro \mu\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@milli {\mr m}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@centi {\mr c}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@deci {\mr d}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@deca {\mr d}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@hecto {\mr h}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@kilo {\mr k}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@mega {\mr m}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@giga {\mr g}\getXMLstackdata\plustwo\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_siprefix1@tera {\mr t}\getXMLstackdata\plustwo\stopsetups
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash procent \procent\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash promille \promille\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash degree ^\circ\stopsetups
+
+% whatever
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash triangle
+ \Delta\,
+\stopsetups
+
+% crap
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@degree_celsius
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@celsius}
+\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@degree_kelvin
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@kelvin}
+\stopsetups
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@metre
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@meter}
+\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@gramme
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@gram}
+\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@litre
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_metric1@liter}
+\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@calendar_month
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@month}
+\stopsetups
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@calendar_year
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash units_time1@year}
+\stopsetups
+
+\startsetups mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash degree_angle
+ \directsetup{mmc:csymbol:http://www.openmath.org/cd/mathadore\letterhash degree}
+\stopsetups
+
+\defineXMLargument
+ [ci]
+ {\checkMMLciSYMBOL}
+
+\def\checkMMLciSYMBOL#1%
+ {\defconvertedargument\ascii{#1}%
+ \executeifdefined{ci:symbol:crap:\ascii}{#1}}
+
+\setvalue{ci:symbol:crap:alpha}{\alpha}
+\setvalue{ci:symbol:crap:beta}{\beta}
+\setvalue{ci:symbol:crap:gamma}{\gamma}
+
+\protect \endinput
diff --git a/tex/context/base/x-newpml.tex b/tex/context/base/x-newpml.tex
new file mode 100644
index 000000000..d69231e3f
--- /dev/null
+++ b/tex/context/base/x-newpml.tex
@@ -0,0 +1,250 @@
+%D \module
+%D [ file=xtag-pml,
+%D version=2001.06.10,
+%D title=\CONTEXT\ XML Support,
+%D subtitle=Units,
+%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 XML Macros / Units}
+
+\usemodule[newmml]
+
+%D Quick and dirty in||line units:
+%D
+%D \startbuffer
+%D <phys>
+%D <cn> 10 </cn>
+%D <cu> <Newton/> <Square/> <Meter/> <Per/> <Sec/> </cu>
+%D </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D A more \MATHML||like unit application:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <cn> 10 </cn>
+%D <csymbol> <Square/> <Meter/> <Per/> <Sec/> </csymbol>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D A bit more compact:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <cn> 10 </cn>
+%D <cu> <Square/> <Meter/> <Per/> <Sec/> </cu>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D A bit more complicated:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <apply> <divide/> <ci> a </ci> <cn> 10 </cn> </apply>
+%D <cu> <Square/> <Meter/> <Per/> <Sec/> </cu>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D An alternative (equivalent) for \type {</cu>}:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <cn> 10 </cn> <cunseq> <Square/> <Meter/> <Per/> <Sec/> </cunseq>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+
+\usemodule[units]
+
+\unprotect
+
+\defineXMLargument [phys] \automathematics
+\defineXMLargument [iphys] \inlinemathematics
+\defineXMLargument [dphys] \displaymathematics
+
+\defineXMLcommand [unit] {\directsetup{pml:unit}}
+
+\startsetups pml:unit
+ \flushXMLstackwith\plustwo\relax
+\stopsetups
+
+% \defineXMLenvironment
+% [unit]
+% {\ignorespaces}
+% {\removeunwantedspaces}
+
+\defineXMLsingular
+ [unit]
+ [label=]
+ {\XMLop{label}}
+
+\defineXMLsingular
+ [unitmeaning]
+ [label=]
+ {\expanded{\unitmeaning{\XMLop{label}}}}
+
+\let\handlePMLunit\firstofoneargument
+
+%D All unit commands are remapped in a similar way.
+
+\defineXMLsingular [Atto] {\handlePMLunit\Atto}
+\defineXMLsingular [Femto] {\handlePMLunit\Femto}
+\defineXMLsingular [Pico] {\handlePMLunit\Pico}
+\defineXMLsingular [Nano] {\handlePMLunit\Nano}
+\defineXMLsingular [Micro] {\handlePMLunit\Micro}
+\defineXMLsingular [Milli] {\handlePMLunit\Milli}
+\defineXMLsingular [Centi] {\handlePMLunit\Centi}
+\defineXMLsingular [Deci] {\handlePMLunit\Deci}
+\defineXMLsingular [Hecto] {\handlePMLunit\Hecto}
+\defineXMLsingular [Kilo] {\handlePMLunit\Kilo}
+\defineXMLsingular [Mega] {\handlePMLunit\Mega}
+\defineXMLsingular [Giga] {\handlePMLunit\Giga}
+\defineXMLsingular [Terra] {\handlePMLunit\Terra}
+\defineXMLsingular [Peta] {\handlePMLunit\Peta}
+\defineXMLsingular [Exa] {\handlePMLunit\Exa}
+
+\defineXMLsingular [Times] {\handlePMLunit\Times}
+\defineXMLsingular [Solidus] {\handlePMLunit\Solidus}
+\defineXMLsingular [Per] {\handlePMLunit\Per}
+\defineXMLsingular [OutOf] {\handlePMLunit\OutOf}
+
+\defineXMLsingular [Linear] {\handlePMLunit\Linear}
+\defineXMLsingular [Square] {\handlePMLunit\Square}
+\defineXMLsingular [Cubic] {\handlePMLunit\Cubic}
+
+\defineXMLsingular [Inverse] {\handlePMLunit\Inverse}
+
+\defineXMLsingular [Degrees] {\handlePMLunit\Degrees}
+\defineXMLsingular [Meter] {\handlePMLunit\Meter}
+\defineXMLsingular [Liter] {\handlePMLunit\Liter}
+\defineXMLsingular [Sec] {\handlePMLunit\Sec}
+\defineXMLsingular [Year] {\handlePMLunit\Year}
+\defineXMLsingular [Month] {\handlePMLunit\Month}
+\defineXMLsingular [Week] {\handlePMLunit\Week}
+\defineXMLsingular [Day] {\handlePMLunit\Day}
+\defineXMLsingular [Hour] {\handlePMLunit\Hour}
+\defineXMLsingular [Min] {\handlePMLunit\Min}
+\defineXMLsingular [Minute] {\handlePMLunit\Min}
+\defineXMLsingular [Second] {\handlePMLunit\Sec}
+\defineXMLsingular [Rad] {\handlePMLunit\Rad}
+\defineXMLsingular [Deg] {\handlePMLunit\Deg}
+\defineXMLsingular [Hertz] {\handlePMLunit\Hertz}
+\defineXMLsingular [RevPerSec] {\handlePMLunit\RevPerSec}
+\defineXMLsingular [RevPerMin] {\handlePMLunit\RevPerMin}
+\defineXMLsingular [Gram] {\handlePMLunit\Gram}
+\defineXMLsingular [Atom] {\handlePMLunit\Atom}
+\defineXMLsingular [Newton] {\handlePMLunit\Newton}
+\defineXMLsingular [Pascal] {\handlePMLunit\Pascal}
+\defineXMLsingular [Joule] {\handlePMLunit\Joule}
+\defineXMLsingular [Watt] {\handlePMLunit\Watt}
+\defineXMLsingular [Celsius] {\handlePMLunit\Celsius}
+\defineXMLsingular [Kelvin] {\handlePMLunit\Kelvin}
+\defineXMLsingular [Fahrenheit] {\handlePMLunit\Fahrenheit}
+\defineXMLsingular [Mol] {\handlePMLunit\Mol}
+\defineXMLsingular [Molair] {\handlePMLunit\Molair}
+\defineXMLsingular [Equivalent] {\handlePMLunit\Equivalent}
+\defineXMLsingular [Farad] {\handlePMLunit\Farad}
+\defineXMLsingular [Ohm] {\handlePMLunit\Ohm}
+\defineXMLsingular [Siemens] {\handlePMLunit\Siemens}
+\defineXMLsingular [Ampere] {\handlePMLunit\Ampere}
+\defineXMLsingular [Coulomb] {\handlePMLunit\Coulomb}
+\defineXMLsingular [Volt] {\handlePMLunit\Volt}
+\defineXMLsingular [eVolt] {\handlePMLunit\eVolt}
+\defineXMLsingular [Tesla] {\handlePMLunit\Tesla}
+\defineXMLsingular [VoltAC] {\handlePMLunit\VoltAC}
+\defineXMLsingular [VoltDC] {\handlePMLunit\VoltDC}
+\defineXMLsingular [Baud] {\handlePMLunit\Baud}
+\defineXMLsingular [Bit] {\handlePMLunit\Bit}
+\defineXMLsingular [Byte] {\handlePMLunit\Byte}
+\defineXMLsingular [Bequerel] {\handlePMLunit\Bequerel}
+\defineXMLsingular [Sievert] {\handlePMLunit\Sievert}
+\defineXMLsingular [Candela] {\handlePMLunit\Candela}
+\defineXMLsingular [Bell] {\handlePMLunit\Bell}
+\defineXMLsingular [At] {\handlePMLunit\At}
+\defineXMLsingular [Atm] {\handlePMLunit\Atm}
+\defineXMLsingular [Bar] {\handlePMLunit\Bar}
+\defineXMLsingular [EVolt] {\handlePMLunit\EVolt}
+\defineXMLsingular [Foot] {\handlePMLunit\Foot}
+\defineXMLsingular [Inch] {\handlePMLunit\Inch}
+\defineXMLsingular [Cal] {\handlePMLunit\Cal}
+\defineXMLsingular [Force] {\handlePMLunit\Force}
+\defineXMLsingular [Lux] {\handlePMLunit\Lux}
+\defineXMLsingular [Gray] {\handlePMLunit\Gray}
+\defineXMLsingular [Weber] {\handlePMLunit\Weber}
+\defineXMLsingular [Henry] {\handlePMLunit\Henry}
+\defineXMLsingular [Sterant] {\handlePMLunit\Sterant}
+\defineXMLsingular [Angstrom] {\handlePMLunit\Angstrom}
+\defineXMLsingular [Gauss] {\handlePMLunit\Gauss}
+
+\defineXMLsingular [Percent] {\handlePMLunit\Percent}
+\defineXMLsingular [Promille] {\handlePMLunit\Promille}
+\defineXMLsingular [Permille] {\handlePMLunit\Permille}
+
+\defineXMLsingular [Unit] {\handlePMLunit\Unit}
+\defineXMLsingular [NoUnit] {\handlePMLunit\NoUnit}
+
+\protect \doifnotmode{demo}{\endinput}
+
+\starttext
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 1 </cn>
+ <ci><unit><Milli/><Sec/><Per/><Square/><Kilo/><Meter/></unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <divide/>
+ <cn> 2 </cn>
+ <ci> <unit><Unit/><Milli/><Sec/><Per/><Square/><Kilo/><Meter/></unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 3 </cn>
+ <ci> <unit> <Milli/> <Sec/> <Per/> <Square/> <Kilo/> <Meter/> </unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 4 </cn>
+ <ci> <unit><Milli/><Sec/><Per/><Square/><Kilo/><Meter/></unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 5 </cn>
+ <ci> <unit> <Milli/> <Sec/> <Per/> <Square/> <Kilo/> <Meter/> </unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\stoptext
diff --git a/tex/context/base/x-om2cml.xsl b/tex/context/base/x-om2cml.xsl
new file mode 100644
index 000000000..4070d94dc
--- /dev/null
+++ b/tex/context/base/x-om2cml.xsl
@@ -0,0 +1,1342 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ This style sheet is used in the Math4All project. This project
+ will provide an on-line math method for secondary and tertiary
+ education. In addition to the web-bases content the project
+ provides high quality typeset output as well.
+
+ This stylesheet is a copy of the one used by the group of Arjeh
+ Cohen (TU Eindhoven). This steet has multiple authors: David
+ Carlisle, and Clare M. So and Hans Cuypers (also see notice
+ below.)
+
+ In due time we may extend this sheet with options needed for the
+ project (alternative rendering, additional dictionaries).
+
+ Hans Hagen, PRAGMA ADE, Hasselt NL / 2006-04-14
+
+-->
+
+<!-- ********************************************************** -->
+<!-- XSL Transform of OpenMath to Content MathML -->
+<!-- (Based on initial version by David Carlisle) -->
+<!-- -->
+<!-- Author: Clare M. So <clare@scl.csd.uwo.ca> -->
+<!-- -->
+<!-- May to August 2002 -->
+<!-- -->
+<!-- (Last updated July 9, 2003) -->
+<!-- ********************************************************** -->
+
+<!-- ********************************************************** -->
+<!-- CHANGE LOG -->
+<!-- ********************************************************** -->
+<!-- May 13, 2003 - Add template nthdiff of calculus1 CD -->
+<!-- May 14, 2003 - Add templates for moreerrors CD -->
+<!-- May 15, 2003 - Split templates for multiset1, set1, -->
+<!-- and list1 CDs -->
+<!-- Split templates for s_dist1 and s_data1 CDs -->
+<!-- June 4, 2003 - Fix bugs in splitting set1, multiset1, and -->
+<!-- set1 CDs -->
+<!-- - Add templates for transc3 CD -->
+<!-- July 9, 2003 - Add template for nthdiff -->
+
+<!-- Special MathML entities -->
+
+<!DOCTYPE stylesheet [
+<!ENTITY pi "&#x003C0;">
+<!ENTITY e "&#x02147E;">
+<!ENTITY ee "&#x02147E;">
+<!ENTITY ExponentialE "&#x02147E;">
+<!ENTITY ImaginaryI "&#x02148;">
+<!ENTITY ii "&#x02148;">
+<!ENTITY gamma "&#x003B3;">
+<!ENTITY infin "&#x0221E;">
+<!ENTITY infty "&#x0221E;">
+<!ENTITY true "&#xF0002;">
+<!ENTITY false "&#xF0003;">
+<!ENTITY NotANumber "&#xF0001;">
+<!ENTITY NaN "&#xF0001;">
+]>
+
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:om="http://www.openmath.org/OpenMath"
+ xmlns="http://www.w3.org/1998/Math/MathML"
+ exclude-result-prefixes="om"
+ version="1.0">
+
+ <!-- xsl:output method="xml" indent="yes"/ -->
+ <xsl:output method="xml"/>
+
+ <xsl:strip-space elements="*"/>
+
+ <xsl:variable name="defaultOMSpriority">-10</xsl:variable>
+
+ <!-- **************************************************** -->
+ <!-- ****************** Basic Elements ****************** -->
+ <!-- **************************************************** -->
+
+ <!-- OMOBJ (D. Carlisle) / adapted by HH -->
+
+<xsl:template match="om:OMOBJ">
+ <xsl:choose>
+ <xsl:when test="@style='inline'">
+ <imath>
+ <xsl:apply-templates/>
+ </imath>
+ </xsl:when>
+ <xsl:when test="@style='display'">
+ <dmath>
+ <xsl:apply-templates/>
+ </dmath>
+ </xsl:when>
+ <xsl:otherwise>
+ <math>
+ <xsl:apply-templates/>
+ </math>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+ <!-- OMI (D. Carlisle) -->
+ <xsl:template match="om:OMI">
+ <cn type="integer">
+ <xsl:variable name="x" select="normalize-space(.)"/>
+ <xsl:choose>
+ <xsl:when test="contains($x,'x')">
+ <xsl:attribute name="base">16</xsl:attribute>
+ <xsl:value-of select="concat(substring-before($x,'x'),substring-after($x,'x'))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$x"/> <!-- default is decimal -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </cn>
+ </xsl:template>
+
+ <!-- OMV (D. Carlisle) -->
+ <xsl:template match="om:OMV">
+ <ci>
+ <xsl:value-of select="normalize-space(@name)"/>
+ </ci>
+ </xsl:template>
+
+ <!-- OMF (decimal) -->
+ <xsl:template match="om:OMF[@dec]">
+ <cn>
+ <xsl:value-of select="normalize-space(@dec)"/>
+ </cn>
+ </xsl:template>
+
+ <!-- OMF (hex) -->
+ <xsl:template match="om:OMF[@hex]">
+ <cn base="16">
+ <xsl:value-of select="normalize-space(@hex)"/>
+ </cn>
+ </xsl:template>
+
+ <!-- OMA (D. Carlisle) -->
+ <xsl:template match="om:OMA">
+ <apply>
+ <xsl:apply-templates/>
+ </apply>
+ </xsl:template>
+
+ <!-- OMB -->
+ <!-- Note: No Content MathML equivalent -->
+ <xsl:template match="om:OMB">
+ <mtext definitionURL="http://www.openmath.org/objects#OMB">
+ <xsl:value-of select="."/>
+ </mtext>
+ </xsl:template>
+
+ <!-- OMSTR (D. Carlisle) -->
+ <!-- Note: mtext is a presentational MathML tag -->
+ <xsl:template match="om:OMSTR">
+ <mtext>
+ <xsl:value-of select="."/>
+ </mtext>
+ </xsl:template>
+
+ <!-- ***************************************************** -->
+ <!-- ****************** MathML group ******************** -->
+ <!-- ***************************************************** -->
+
+ <!-- Content Dicitionary: alg1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: zero, one -->
+
+ <!-- Trivial cases: none -->
+ <xsl:template match="om:OMS[@cd='alg1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- zero -->
+ <xsl:template match="om:OMS[@cd='alg1' and @name='zero']">
+ <cn type="integer">0</cn>
+ </xsl:template>
+
+ <!-- one -->
+ <xsl:template match="om:OMS[@cd='alg1' and @name='one']">
+ <cn type="integer">1</cn>
+ </xsl:template>
+
+ <!-- Content Dictionary: arith1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD conatains: abs, divide, gcd, lcm, minus, plus, power, product,
+ root, sum, unary_minus -->
+
+ <!-- Trivial Cases: abs, divide, gcd, lcm, minus, plus -->
+ <xsl:template match="om:OMS[@cd='arith1']">
+ <xsl:element name="{@name}">
+ <xsl:choose>
+ <xsl:when test="@name='times'">
+ <xsl:choose>
+ <xsl:when test="../@style='empty'">
+ <xsl:attribute name='symbol'></xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@style='cross'">
+ <xsl:attribute name='symbol'>times</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@style=''">
+ <!-- inherit from parent times -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name='symbol'><xsl:value-of select="../@style"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="@name='divide'">
+ <xsl:choose>
+ <xsl:when test="../@style='inline'">
+ <xsl:attribute name='alternative'>b</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="@name='plus'">
+ <xsl:choose>
+ <xsl:when test="../@style='empty'">
+ <xsl:attribute name='alternative'>b</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- forget about it -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- unary_minus -->
+ <xsl:template match="om:OMS[@cd='arith1' and @name='unary_minus']">
+ <minus/>
+ </xsl:template>
+
+ <!-- root -->
+ <xsl:template match="om:OMA[om:OMS[@cd='arith1' and @name='root']]">
+ <apply>
+ <root/>
+ <degree>
+ <xsl:apply-templates select="*[3]"/>
+ </degree>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- sum and product -->
+ <xsl:template match="om:OMA[om:OMS[@cd='arith1' and (@name='sum' or @name='product')]]">
+ <apply>
+ <xsl:element name="{om:OMS[1]/@name}"/>
+ <bvar>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="3"/> <!-- the bounded var is in the func -->
+ </xsl:apply-templates>
+ </bvar>
+ <xsl:apply-templates select="*[2]"/> <!-- range of product/summation -->
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: bigfloat1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: bigfloat, bigfloatprec -->
+
+ <!-- Trivial cases: none -->
+
+ <!-- bigfloat -->
+ <xsl:template match="om:OMA[om:OMS[@cd='bigfloat1' and @name='bigfloat']]">
+ <apply>
+ <times/>
+ <xsl:apply-templates select="*[2]"/>
+ <apply>
+ <power/>
+ <xsl:apply-templates select="*[3]"/>
+ <xsl:apply-templates select="*[4]"/>
+ </apply>
+ </apply>
+ </xsl:template>
+
+ <!-- bigfloatprec -->
+ <!-- Note: No Content MathML equivalent -->
+ <xsl:template match="om:OMS[@cd='bigfloat1' and @name='bigfloatprec']">
+ <csymbol encoding="OpenMath"
+ definitionURL="http://www.openmath.org/cd/bigfloat1#bigfloatprec"/>
+ </xsl:template>
+
+ <!-- Content Dictionary: calculus1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: defint, diff, int, nthdiff, partialdiff -->
+
+ <!-- Trivial cases: partialdiff -->
+ <xsl:template match="om:OMS[@cd='calculus1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- diff, int -->
+ <xsl:template match="om:OMA[om:OMS[@cd='calculus1' and (@name='diff' or @name='int')]]">
+ <apply>
+ <xsl:element name="{om:OMS[1]/@name}"/>
+ <bvar>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="2"/>
+ </xsl:apply-templates>
+ </bvar>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- defint -->
+ <xsl:template match="om:OMA[om:OMS[@cd='calculus1' and @name='defint']]">
+ <apply>
+ <int/> <!-- pretty much the same as sum and product... CHECK domainofapp -->
+ <bvar> <!-- perphaps write a method for the similar parts... -->
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="3"/>
+ </xsl:apply-templates>
+ </bvar>
+ <xsl:apply-templates select="*[2]"/> <!-- range of diff -->
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- nthdiff -->
+ <xsl:template match="om:OMA[om:OMS[@cd='calculus1' and @name='nthdiff']]">
+ <apply>
+ <diff/>
+ <bvar>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="3"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="*[2]"/>
+ </bvar>
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionaries: complex1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: argument, complex_cartesian, complex_polar, conjugate,
+ imaginary, real -->
+
+ <!-- Trivial cases: conjugate, imaginary, real -->
+ <xsl:template match="om:OMS[@cd='complex1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- argument -->
+ <xsl:template match="om:OMS[@cd='complex1' and @name='argument']">
+ <arg/>
+ </xsl:template>
+
+ <!-- complex_cartesian or complex_polar -->
+ <xsl:template match="om:OMA[om:OMS[@cd='complex1' and (@name='complex_cartesian' or @name='complex_polar')]]">
+ <xsl:variable name="type_name" select="translate(om:OMS[1]/@name,'_','-')"/>
+ <xsl:choose>
+ <xsl:when test="child::om:OMV or child::om:OMA">
+ <apply>
+ <csymbol definitionURL="{concat('http://www.openmath.org/cd/complex1#',om:OMS[1]/@name)}"/>
+ <xsl:apply-templates select="*[2]"/>
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:when>
+ <xsl:otherwise>
+ <cn type="{$type_name}">
+ <xsl:apply-templates select="*[2]" mode="convert"/>
+ <sep/>
+ <xsl:apply-templates select="*[3]" mode="convert"/>
+ </cn>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Content Dictionary: fns1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: domain, domainofapplication, identity, image, inverse,
+ lambda, left_compose, left_inverse, right_inverse -->
+
+ <!-- Trivial cases: domain, image, inverse -->
+ <xsl:template match="om:OMS[@cd='fns1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- domainofapplication -->
+ <xsl:template match="om:OMA[om:OMS[@cd='fns1' and @name='domainofapplication']]">
+ <domainofapplication>
+ <xsl:apply-templates select="*[2]"/>
+ </domainofapplication>
+ </xsl:template>
+
+ <!-- identity -->
+ <xsl:template match="om:OMS[@cd='fns1' and @name='identity']">
+ <ident/>
+ </xsl:template>
+
+ <!-- lambda -->
+ <xsl:template match="om:OMBIND[om:OMS[@cd='fns1' and @name='lambda']]">
+ <lambda>
+ <xsl:for-each select="om:OMBVAR/child::om:OMV">
+ <bvar>
+ <xsl:apply-templates select="."/>
+ </bvar>
+ </xsl:for-each>
+ <xsl:apply-templates select="*[3]"/>
+ </lambda>
+ </xsl:template>
+
+ <!-- range -->
+ <xsl:template match="om:OMS[@cd='fns1' and @name='range']">
+ <codomain/>
+ </xsl:template>
+
+ <!-- left_compose -->
+ <xsl:template match="om:OMS[@cd='fns1' and @name='left_compose']">
+ <compose/>
+ </xsl:template>
+
+ <!-- left_inverse -->
+ <xsl:template match="om:OMS[@cd='fns1' and @name='left_inverse']">
+ <inverse/>
+ </xsl:template>
+
+ <!-- right_inverse -->
+ <!-- Note: No Content MathML equivalent -->
+ <xsl:template match="om:OMS[@cd='fns1' and @name='right_inverse']">
+ <inverse encoding="OpenMath" definitionURL="http://www.openmath.org/cd/fns1#right_inverse"/>
+ </xsl:template>
+
+ <!-- Content Dictionary: integer1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: factorial, factorof, quotient, remainder -->
+
+ <!-- Trivial cases: factorof, factorial, quotient -->
+ <xsl:template match="om:OMS[@cd='integer1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- remainder -->
+ <xsl:template match="om:OMS[@cd='integer1' and @name='remainder']">
+ <rem/>
+ </xsl:template>
+
+ <!-- Content Dictionary: interval1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: integer_interval, interval, interval_oo, interval_cc,
+ interval_oc, interval_co -->
+
+ <!-- Trivial case: none -->
+
+ <!-- (All) -->
+ <xsl:template match="om:OMA[om:OMS[@cd='interval1']]">
+ <interval>
+ <xsl:choose>
+ <xsl:when test="om:OMS[1]/@name='interval_oo'">
+ <xsl:attribute name='closure'>open</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="om:OMS[1]/@name='interval_cc'">
+ <xsl:attribute name='closure'>closed</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="om:OMS[1]/@name='interval_oc'">
+ <xsl:attribute name='closure'>open-closed</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="om:OMS[1]/@name='interval_co'">
+ <xsl:attribute name='closure'>closed-open</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:apply-templates select="*[2]"/>
+ <xsl:apply-templates select="*[3]"/>
+ </interval>
+ </xsl:template>
+
+ <!-- Content Dictionary: linalg1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: determinant, matrix_selector, outerproduct,
+ scalarproduct, transpose, vector_selector, vector_product -->
+
+ <!-- Trivial cases: determinant, outerproduct, scalarproduct, transpose,
+ vectorproduct -->
+ <xsl:template match="om:OMS[@cd='linalg1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- vector_selector -->
+ <xsl:template match="om:OMA[om:OMS[@cd='linalg1' and @name='vector_selector']]">
+ <apply>
+ <selector/>
+ <xsl:apply-templates select="*[3]"/> <!-- the vector -->
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- matrix_selector -->
+ <xsl:template match="om:OMA[om:OMS[@cd='linalg1' and @name='matrix_selector']]">
+ <apply>
+ <selector/>
+ <xsl:apply-templates select="*[4]"/> <!-- the matrix -->
+ <xsl:apply-templates select="*[3]"/>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: linalg2 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: matrix, matrixrow, vector -->
+
+ <!-- Trivial cases: none -->
+
+ <!-- matrixrow, matrix -->
+ <xsl:template match="om:OMA[om:OMS[@cd='linalg2']]">
+ <xsl:element name="{om:OMS[1]/@name}">
+ <xsl:apply-templates select="*[position()>1]"/>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- (row) vector -->
+ <xsl:template match="om:OMA[om:OMS[@cd='linalg2' and @name='vector']]">
+ <apply>
+ <transpose/>
+ <vector>
+ <xsl:apply-templates select="*[position()>1]"/>
+ </vector>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: limit1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: above, below, bothsides, limit, null -->
+
+ <!-- Trivial cases: none -->
+
+ <!-- both_sides, above, below, null -->
+ <xsl:template match="om:OMA[om:OMS[@cd='limit1']]">
+ <apply>
+ <limit/>
+ <bvar>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="4"/>
+ </xsl:apply-templates>
+ </bvar>
+ <xsl:choose>
+ <xsl:when test="om:OMS[2]/@name='null'">
+ <lowlimit>
+ <xsl:apply-templates select="*[2]"/>
+ </lowlimit>
+ </xsl:when>
+ <xsl:otherwise>
+ <condition>
+ <apply>
+ <tendsto>
+ <xsl:choose>
+ <xsl:when test="om:OMS[2]/@name='both_sides'">
+ <xsl:attribute name="type">all</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="om:OMS[2]/@name='above'">
+ <xsl:attribute name="type">above</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="om:OMS[2]/@name='below'">
+ <xsl:attribute name="type">below</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </tendsto>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="4"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </condition>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="*[4]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: list1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: list, map, suchthat -->
+
+ <!-- Trivial cases: none -->
+
+ <!-- list -->
+ <xsl:template match="om:OMA[om:OMS[@cd='list1' and @name='list']]">
+ <list>
+ <xsl:apply-templates select="*[position()>1]"/>
+ </list>
+ </xsl:template>
+
+ <!-- map -->
+ <xsl:template match="om:OMA[om:OMS[@cd='list1' and @name='map']]">
+ <list>
+ <xsl:apply-templates select="." mode="map"/>
+ </list>
+ </xsl:template>
+
+ <!-- suchthat -->
+ <xsl:template match="om:OMA[om:OMS[@cd='list1' and @name='suchthat']]">
+ <list>
+ <xsl:apply-templates select="." mode="suchthat"/>
+ </list>
+ </xsl:template>
+
+ <!-- Content Dictionary: logic1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: and, equivalent, false, implies, not, or, true, xor -->
+
+ <!-- Trivial cases: all -->
+ <xsl:template match="om:OMS[@cd='logic1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- Content Dictionary: mathmltypes -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: complex_cartesian_type, complex_polar_type, constant_type,
+ fn_type, integer_type, list_type, matrix_type, rational_type, real_type,
+ set_type, type, vector_type -->
+
+ <!-- (All mathmltypes elements) -->
+ <xsl:template match="om:OMATTR[om:OMATP[om:OMS[@cd='mathmltypes' and @name='type']]]">
+ <xsl:variable name="type_name" select="normalize-space(translate(substring-before(om:OMATP/om:OMS[2]/@name,'_type'),'_','-'))"/>
+ <xsl:choose>
+ <xsl:when test="*[2]=om:OMV">
+ <ci type="{$type_name}">
+ <xsl:value-of select="normalize-space(*[2]/@name)"/>
+ </ci>
+ </xsl:when>
+ <xsl:when test="*[2]=om:OMI">
+ <cn type="{$type_name}">
+ <xsl:variable name="x" select="normalize-space(*[2])"/>
+ <xsl:choose>
+ <xsl:when test="contains($x,'x')">
+ <xsl:attribute name="base">16</xsl:attribute>
+ <xsl:value-of select="concat(substring-before($x,'x'),substring-after($x,'x'))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$x"/> <!-- default is decimal -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </cn>
+ </xsl:when>
+ <xsl:when test="*[2]=om:OMF[@dec]">
+ <cn type="{$type_name}">
+ <xsl:value-of select="normalize-space(*[2]/@dec)"/>
+ </cn>
+ </xsl:when>
+ <xsl:when test="*[2]=om:OMF[@hex]">
+ <cn type="{$type_name}" base="16">
+ <xsl:value-of select="normalize-space(*[2]/@hex)"/>
+ </cn>
+ </xsl:when>
+ <xsl:otherwise> <!-- MathML cannot add type attribute to other objects -->
+ <xsl:comment>
+ Content MathML cannot add type <xsl:value-of select="$type_name"/> for the object after this comment.
+ </xsl:comment>
+ <xsl:apply-templates select="*[2]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Content Dictionary: minmax1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: max, min -->
+ <xsl:template match="om:OMS[@cd='minmax1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- Trivial cases: none -->
+
+ <!-- max, min -->
+ <xsl:template match="om:OMA[om:OMS[@cd='minmax1']]">
+ <apply>
+ <xsl:element name="{om:OMS/@name}"/>
+ <xsl:choose>
+ <xsl:when test="*[2]=om:OMA[om:OMS[@cd='set1' and @name='set']]">
+ <xsl:apply-templates select="om:OMA/*[position()>1]"/>
+ </xsl:when>
+ <xsl:when test="*[2]=om:OMA[om:OMS[@cd='multiset1' and @name='multiset']]">
+ <xsl:apply-templates select="om:OMA/*[position()>1]"/>
+ </xsl:when>
+ <xsl:when test="*[2]=om:OMA[om:OMS[@cd='set1' and @name='suchthat']]">
+ <xsl:apply-templates select="*[2]" mode="suchthat"/>
+ </xsl:when>
+ <xsl:when test="*[2]=om:OMA[om:OMS[@cd='set1' and @name='map']]">
+ <xsl:apply-templates select="*[2]" mode="map"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <bvar><ci>x</ci></bvar>
+ <condition>
+ <apply>
+ <in/>
+ <ci>x</ci>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </condition>
+ </xsl:otherwise>
+ </xsl:choose>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: multiset1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: cartesian_product, emptyset, in, intersect, multiset,
+ notin, notprsubset, notsubset, prsubset, setdiff, size, subset, union -->
+
+ <!-- Trivial cases: emptyset, in, interset, notin, notprsubset, notsubset, prsubset,
+ subset, union -->
+ <xsl:template match="om:OMS[@cd='multiset1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- cartesian_product -->
+ <xsl:template match="om:OMS[@cd='multiset1' and @name='cartesian_product']">
+ <cartesianproduct/>
+ </xsl:template>
+
+
+ <!-- multiset -->
+ <xsl:template match="om:OMA[om:OMS[@cd='multiset1' and @name='multiset']]">
+ <set type="multiset">
+ <xsl:apply-templates select="*[position()>1]"/>
+ </set>
+ </xsl:template>
+
+ <!-- size -->
+ <xsl:template match="om:OMS[@cd='multiset1' and @name='size']">
+ <card/>
+ </xsl:template>
+
+ <!-- Content Dictionary: nums1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains based_integer, e, gamma, i, infinity, NaN, pi, rational -->
+
+ <!-- Trivial cases: pi, infinity -->
+ <xsl:template match="om:OMS[@cd='nums1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- based_integer -->
+ <!-- Note: Content MathML does not support base that is represented by a variable -->
+ <xsl:template match="om:OMA[om:OMS[@cd='nums1' and @name='based_integer']]">
+ <xsl:choose>
+ <xsl:when test="*[2]=om:OMV">
+ <apply>
+ <csymbol encoding="OpenMath" definitionURL="http://www.openmath.org/cd/nums1#based_integer"/>
+ <xsl:apply-templates select="*[2]"/>
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:when>
+ <xsl:otherwise>
+ <cn type="integer" base="{normalize-space(*[2])}">
+ <xsl:value-of select="normalize-space(om:OMSTR)"/>
+ </cn>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- e -->
+ <xsl:template match="om:OMS[@cd='nums1' and @name='e']">
+ <exponentiale/>
+ </xsl:template>
+
+ <!-- gamma -->
+ <xsl:template match="om:OMS[@cd='nums1' and @name='gamma']">
+ <eulergamma/>
+ </xsl:template>
+
+ <!-- i -->
+ <xsl:template match="om:OMS[@cd='nums1' and @name='i']">
+ <imaginaryi/>
+ </xsl:template>
+
+ <!-- NaN -->
+ <xsl:template match="om:OMS[@cd='nums1' and @name='NaN']">
+ <notanumber/>
+ </xsl:template>
+
+ <!-- rational -->
+ <!-- Note: Content MathML does not support rational numbers that are
+ made up of variables or other mathematical objects -->
+ <xsl:template match="om:OMA[om:OMS[@cd='nums1' and @name='rational']]">
+ <xsl:choose>
+ <xsl:when test="child::om:OMV or child::om:OMA">
+ <apply>
+ <csymbol definitionURL="http://www.openmath.org/cd/nums1#rational"/>
+ <xsl:apply-templates select="*[2]"/>
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:when>
+ <xsl:otherwise>
+ <cn type="rational">
+ <xsl:apply-templates select="*[2]" mode="convert"/>
+ <sep/>
+ <xsl:apply-templates select="*[3]" mode="convert"/>
+ </cn>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Content Dictionary: piece1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: otherwise, piece, piecewise -->
+
+ <!-- Trivial cases: (All of the OMSs here are almost trivial, except
+ that these functions are used without "apply" in Content MathML) -->
+
+ <!-- piecewise, piece, otherwise -->
+ <xsl:template match="om:OMA[om:OMS[@cd='piece1']]">
+ <xsl:element name="{om:OMS/@name}">
+ <xsl:apply-templates select="*[position()>1]"/>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- Content Dictionary: quant1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: forall, exists -->
+
+ <!-- forall,exists -->
+ <xsl:template match="om:OMBIND[om:OMS[@cd='quant1']]">
+ <apply>
+ <xsl:element name="{om:OMS[1]/@name}"/>
+ <xsl:for-each select="om:OMBVAR/om:OMV">
+ <bvar>
+ <xsl:apply-templates select="."/>
+ </bvar>
+ </xsl:for-each>
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: relation1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: approx, eq, geq, gt, leq, lt, neq -->
+
+ <!-- Trivial cases: all -->
+
+ <xsl:template match="om:OMS[@cd='relation1']">
+ <xsl:element name="{@name}">
+ <xsl:if test="../@style!=''">
+ <xsl:attribute name='align'><xsl:value-of select="../@style"/></xsl:attribute>
+ </xsl:if>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- Content Dictionary: setname1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: C, N, P, Q, R, Z -->
+
+ <!-- Trivial cases: none -->
+
+ <!-- P -->
+ <xsl:template match="om:OMS[@cd='setname1' and @name='P']">
+ <primes/>
+ </xsl:template>
+
+ <!-- N -->
+ <xsl:template match="om:OMS[@cd='setname1' and @name='N']">
+ <naturalnumbers/>
+ </xsl:template>
+
+ <!-- Z -->
+ <xsl:template match="om:OMS[@cd='setname1' and @name='Z']">
+ <integers/>
+ </xsl:template>
+
+ <!-- Z -->
+ <xsl:template match="om:OMS[@cd='setname1' and @name='Q']">
+ <rationals/>
+ </xsl:template>
+
+ <!-- R -->
+ <xsl:template match="om:OMS[@cd='setname1' and @name='R']">
+ <reals/>
+ </xsl:template>
+
+ <!-- C -->
+ <xsl:template match="om:OMS[@cd='setname1' and @name='C']">
+ <complexes/>
+ </xsl:template>
+
+ <!-- Content Dictionary: rounding1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: ceiling, floor, round, trunc -->
+
+ <!-- Trivial Cases: ceiling, floor -->
+ <xsl:template match="om:OMS[@cd='rounding1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- trunc -->
+ <xsl:template match="om:OMA[om:OMS[@cd='rounding1' and @name='trunc']]">
+ <apply>
+ <quotient/>
+ <xsl:apply-templates select="*[2]"/>
+ <cn>1</cn>
+ </apply>
+ </xsl:template>
+
+ <!-- round -->
+ <xsl:template match="om:OMA[om:OMS[@cd='rounding1' and @name='round']]">
+ <piecewise>
+ <piece>
+ <apply>
+ <floor/>
+ <apply>
+ <plus/>
+ <cn>0.5</cn>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </apply>
+ <apply>
+ <geq/>
+ <xsl:apply-templates select="*[2]"/>
+ <cn>0</cn>
+ </apply>
+ </piece>
+ <piece>
+ <apply>
+ <ceiling/>
+ <apply>
+ <minus/>
+ <xsl:apply-templates select="*[2]"/>
+ <cn>0.5</cn>
+ </apply>
+ </apply>
+ <apply>
+ <lt/>
+ <xsl:apply-templates select="*[2]"/>
+ <cn>0</cn>
+ </apply>
+ </piece>
+ </piecewise>
+ </xsl:template>
+
+ <!-- Content Dictionary: set1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: cartesian_product, emptyset, in, intersect, map, notin,
+ notprsubset, notsubset, prsubset, set, setdiff, size, subset, suchthat, union -->
+
+ <!-- Trivial cases: emptyset, in, intersect, notin, notprsubset, notsubset, prsubset
+ setdiff, subset, union -->
+ <xsl:template match="om:OMS[@cd='set1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- cartesian_product -->
+ <xsl:template match="om:OMS[@cd='set1' and @name='cartesian_product']">
+ <cartesianproduct/>
+ </xsl:template>
+
+ <!-- map -->
+ <xsl:template match="om:OMA[om:OMS[@cd='set1' and @name='map']]">
+ <set>
+ <xsl:apply-templates select="." mode="map"/>
+ </set>
+ </xsl:template>
+
+ <!-- size -->
+ <xsl:template match="om:OMS[@cd='set1' and @name='size']">
+ <card/>
+ </xsl:template>
+
+ <!-- suchthat -->
+ <xsl:template match="om:OMA[om:OMS[@cd='set1' and @name='suchthat']]">
+ <set>
+ <xsl:apply-templates select="." mode="suchthat"/>
+ </set>
+ </xsl:template>
+
+ <!-- Content Dictionary: s_data1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: mean, median, mode, moment, sdev, variance -->
+
+ <!-- Trivial cases: mean, median, mode, sdev, variance -->
+ <xsl:template match="om:OMS[@cd='s_data1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- moment -->
+ <xsl:template match="om:OMA[om:OMS[@cd='s_data1' and @name='moment']]">
+ <apply>
+ <moment/>
+ <degree>
+ <xsl:apply-templates select="*[2]"/>
+ </degree>
+ <momentabout>
+ <xsl:apply-templates select="*[3]"/>
+ </momentabout>
+ <xsl:apply-templates select="*[position()>3]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: s_dist1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: mean, moment, sdev, variance -->
+
+ <!-- Trivial cases: mean, sdev, variance -->
+ <xsl:template match="om:OMS[@cd='s_dist1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- moment -->
+ <xsl:template match="om:OMA[om:OMS[@cd='s_dist1' and @name='moment']]">
+ <apply>
+ <moment/>
+ <degree>
+ <xsl:apply-templates select="*[2]"/>
+ </degree>
+ <momentabout>
+ <xsl:apply-templates select="*[3]"/>
+ </momentabout>
+ <xsl:apply-templates select="*[position()>3]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: transc1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: arccos, arccosh, arccot, arccoth, arccsc,
+ arccsch, arcsec, arcsech, arcsin, arcsinh, arctan, arctanh, cos,
+ cosh, cot, coth, csc, csch, exp, ln, log, sec, sech, sin, sinh,
+ tan, tanh -->
+
+ <!-- Trivial cases: all except log -->
+ <xsl:template match="om:OMS[@cd='transc1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- log -->
+ <xsl:template match="om:OMA[om:OMS[@cd='transc1' and @name='log']]">
+ <apply>
+ <log/>
+ <logbase>
+ <xsl:apply-templates select="*[2]"/>
+ </logbase>
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- Content Dictionary: veccalc1 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: curl, divergence, grad, Laplacian -->
+
+ <!-- Trivial cases: all except Laplacian -->
+ <xsl:template match="om:OMS[@cd='veccalc1']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- Laplacian -->
+ <!-- Note: Capital "L" -->
+ <xsl:template match="om:OMS[@cd='veccalc1' and @name='Laplacian']">
+ <laplacian/>
+ </xsl:template>
+
+ <!-- Content Dictionary: altenc -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: TeX_encoding, MathML_encoding -->
+
+ <!-- Trivial cases: none -->
+
+ <!-- (Everything in altenc) -->
+ <xsl:template match="om:OMATTR[om:OMATP[om:OMS[@cd='altenc']]]">
+ <semantics>
+ <xsl:apply-templates select="*[2]"/>
+ <xsl:apply-templates select="om:OMATP/child::om:OMS"/>
+ </semantics>
+ </xsl:template>
+
+ <!-- MathML_encoding -->
+ <xsl:template match="om:OMS[@cd='altenc' and @name='MathML_encoding']">
+ <annotation-xml encoding="MathML">
+ <xsl:value-of select="normalize-space(following-sibling::*[position()=1])"/> <!-- OMXML or OMSTR-->
+ </annotation-xml>
+ </xsl:template>
+
+ <!-- TeX_encoding -->
+ <xsl:template match="om:OMS[@cd='altenc' and @name='TeX_encoding']">
+ <annotation encoding="TeX">
+ <xsl:value-of select="normalize-space(following::om:OMSTR)"/>
+ </annotation>
+ </xsl:template>
+
+ <!-- **************************************************** -->
+ <!-- ************** Not in MathML group CDs ************* -->
+ <!-- **************************************************** -->
+
+ <!-- Everything below should not be handled by the Trivial case!) -->
+
+ <!-- Content Dictionary: linalg3 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- (column) vector -->
+ <xsl:template match="om:OMA[om:OMS[@cd='linalg3' and @name='vector']]">
+ <vector>
+ <xsl:apply-templates select="*[position()>1]"/>
+ </vector>
+ </xsl:template>
+
+ <!-- Content Dictionary: arith2 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: inverse, times -->
+
+ <!-- times -->
+ <!-- Note: This function is n-ary just like MathML! -->
+ <xsl:template match="om:OMS[@cd='arith2' and @name='times']">
+ <times/>
+ </xsl:template>
+
+ <!-- Content Dictionary: error -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- (all errors) -->
+ <xsl:template match="om:OME">
+ <mtext>
+ <xsl:text>ERROR:</xsl:text>
+ <xsl:text> Error Type: </xsl:text><xsl:value-of select="om:OMS[1]/@name"/>
+ <xsl:text> Error occured in CD: </xsl:text><xsl:value-of select="om:OMS[2]/@cd"/>
+ <xsl:text> Error occured in symbol: </xsl:text><xsl:value-of select="om:OMS[2]/@name"/>
+ </mtext>
+ </xsl:template>
+
+ <!-- Content Dictionary: moreerrors -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: algorithm, asynchronousError, encodingError, limitation,
+ unexpected -->
+
+ <!-- (all) -->
+ <xsl:template match="om:OMA[om:OMS[@cd='moreerrors']]">
+ <mtext>
+ <xsl:text>ERROR:</xsl:text>
+ <xsl:text> Error Type: </xsl:text><xsl:value-of select="normalize-space(om:OMS/@name)"/>
+ <xsl:text> Description: </xsl:text><xsl:value-of select="normalize-space(om:OMSTR)"/>
+ </mtext>
+ </xsl:template>
+
+ <!-- Content Dicitionary: transc3 -->
+ <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+
+ <!-- This CD contains: arccos, arccosh, arccot, arccoth, arccsc, arccsch,
+ arcsec, arcsech, arcsin, arcsinh, arctan, arctanh, ln, log -->
+
+ <!-- (all except log) -->
+ <xsl:template match="om:OMS[@cd='transc3']">
+ <xsl:element name="{@name}"/>
+ </xsl:template>
+
+ <!-- log -->
+ <xsl:template match="om:OMA[om:OMS[@cd='transc3' and @name='log']]">
+ <apply>
+ <log/>
+ <logbase>
+ <xsl:apply-templates select="*[3]"/>
+ </logbase>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </xsl:template>
+
+ <!-- **************************************************** -->
+ <!-- **************** EVERYTHING ELSE ******************* -->
+ <!-- **************************************************** -->
+
+ <!-- Note: Rather than hard code all of the CDs, I just assign the lowest
+ priority among all templates. -->
+
+ <xsl:template match="om:OMS[@cd and @name]" priority="-10">
+ <csymbol>
+ <xsl:attribute name="definitionURL">
+ <xsl:value-of select="concat(concat(concat('http://www.openmath.org/cd/',@cd),'#'),@name)"/>
+ </xsl:attribute>
+ </csymbol>
+ </xsl:template>
+
+ <!-- **************************************************** -->
+ <!-- **************** HELPER TEMPLATES ****************** -->
+ <!-- **************************************************** -->
+
+ <!-- All mode "convert" templates are for converting OMSs or OMIs to
+ numbers including in various cn containing <sep/> -->
+
+ <xsl:template match="om:OMS[@cd='alg1' and @name='zero']" mode="convert">0</xsl:template>
+
+ <xsl:template match="om:OMS[@cd='alg1' and @name='one']" mode="convert">1</xsl:template>
+
+ <xsl:template match="om:OMS" mode="convert">
+ <xsl:choose>
+ <xsl:when test="@name='pi'">&pi;</xsl:when>
+ <xsl:when test="@name='i'">&ii;</xsl:when>
+ <xsl:when test="@name='NaN'">&NaN;</xsl:when>
+ <xsl:when test="@name='gamma'">&gamma;</xsl:when>
+ <xsl:when test="@name='e'">&ee;</xsl:when>
+ <xsl:when test="@name='true'">&true;</xsl:when>
+ <xsl:when test="@name='false'">&false;</xsl:when>
+ <xsl:when test="@name='infinity'">&infin;</xsl:when>
+ <xsl:otherwise><xsl:value-of select="normalize-space(.)"/></xsl:otherwise> <!-- for debugging -->
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="om:OMI" mode="convert">
+ <xsl:variable name="x" select="normalize-space(.)"/>
+ <xsl:choose>
+ <xsl:when test="contains($x,'x')">
+ <xsl:value-of select="concat(substring-before($x,'x'),substring-after($x,'x'))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$x"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="om:OMF" mode="convert">
+ <xsl:value-of select="@*"/>
+ </xsl:template>
+
+ <!-- The following templates, with mode "map" and "suchthat", are used to contruct sets or lists
+ without enumerating every element -->
+
+ <xsl:template match="om:OMA" mode="map">
+ <bvar>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="2"/>
+ </xsl:apply-templates>
+ </bvar>
+ <condition>
+ <apply>
+ <in/>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="2"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="*[3]"/>
+ </apply>
+ </condition>
+ <xsl:apply-templates select="*[2]"/>
+ </xsl:template>
+
+ <xsl:template match="om:OMA" mode="suchthat">
+ <bvar>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="3"/>
+ </xsl:apply-templates>
+ </bvar>
+ <condition>
+ <apply>
+ <and/>
+ <xsl:apply-templates select="*[3]"/>
+ <apply>
+ <in/>
+ <xsl:apply-templates select="." mode="getVar">
+ <xsl:with-param name="NUM" select="3"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="*[2]"/>
+ </apply>
+ </apply>
+ </condition>
+ </xsl:template>
+
+ <!-- This template is for getting bound variables (all variables in <OMBIND>) -->
+ <!-- Note: Default bound variable is "x" -->
+
+ <xsl:template match="om:OMA" mode="getVar">
+ <xsl:param name="NUM" select="3"/>
+ <xsl:choose>
+ <xsl:when test="*[$NUM]=om:OMBIND">
+ <xsl:apply-templates select="*[$NUM]/om:OMBVAR/om:OMV[position()>0]"/>
+ </xsl:when>
+ <xsl:otherwise> <!-- default -->
+ <ci>x</ci>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Added by Hans Hagen -->
+
+ <xsl:template match="om:OMS[@cd='altenc' and @name='TeX_encoding']">
+ <annotation encoding="TeX">
+ <xsl:value-of select="normalize-space(following::om:OMSTR)"/>
+ </annotation>
+ </xsl:template>
+
+ <xsl:template match="om:OMS[(@cd='math4all' or @cd='mathadore' or @cd='m4all') and @name]">
+ <csymbol>
+ <xsl:attribute name="definitionURL">
+ <xsl:value-of select="concat(concat('http://www.openmath.org/cd/mathadore','#'),@name)"/>
+ </xsl:attribute>
+ </csymbol>
+ </xsl:template>
+
+<!--
+ <xsl:template match="om:OMS[@cd='mathadore' and @name]">
+ <csymbol>
+ <xsl:attribute name="definitionURL">
+ <xsl:value-of select="concat(concat(@cd,'#'),@name)"/>
+ </xsl:attribute>
+ </csymbol>
+ </xsl:template>
+-->
+
+ <xsl:template match="om:OMA[om:OMS[@cd='combinat1' and @name='binomial']]">
+ <matrix>
+ <matrixrow><xsl:apply-templates select="*[2]"/></matrixrow>
+ <matrixrow><xsl:apply-templates select="*[3]"/></matrixrow>
+ </matrix>
+ </xsl:template>
+
+ <!-- <OMS cd="units_siprefix1" name="centi" cdbase="mathadore"/> -->
+ <!-- <OMS cd="units_metric1" name="metre" cdbase="mathadore"/> -->
+
+ <xsl:template match="om:OMS[contains(@cd,'units_')]">
+ <csymbol>
+ <xsl:attribute name="definitionURL">
+ <xsl:value-of select="concat(concat(concat(concat(
+ 'http://www.openmath.org/cd/mathadore','#'),@cd),'@'),@name)"/>
+ </xsl:attribute>
+ </csymbol>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/tex/context/base/x-openmath.tex b/tex/context/base/x-openmath.tex
new file mode 100644
index 000000000..38474996e
--- /dev/null
+++ b/tex/context/base/x-openmath.tex
@@ -0,0 +1,4 @@
+% This module is yet empty. We assume a transformation using
+% x-openmath.xsl.
+
+\endinput
diff --git a/tex/context/base/x-openmath.xsl b/tex/context/base/x-openmath.xsl
new file mode 100644
index 000000000..ffb404939
--- /dev/null
+++ b/tex/context/base/x-openmath.xsl
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:output method="xml"/>
+
+ <!-- newline, temp hack, latest texexec handles it okay -->
+
+ <xsl:template match="processing-instruction()"><xsl:copy/><xsl:text>
+ </xsl:text></xsl:template>
+
+ <!-- xsl:template match="*"><xsl:copy/></xsl:template -->
+ <!-- xsl:element name="{name(current())}"><xsl:apply-templates/></xsl:element -->
+
+<!--
+ <xsl:template match="*">
+ <xsl:copy>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+-->
+
+ <xsl:template match="node()|@*" >
+ <xsl:copy>
+ <xsl:apply-templates select = "node()|@*" />
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="comment"></xsl:template>
+
+ <xsl:variable name='openmath-to-content-mathml'><value-of select='$stylesheet-path'/>/x-openmath.xsl</xsl:variable>
+
+ <xsl:include href="x-om2cml.xsl"/>
+
+</xsl:stylesheet>
diff --git a/tex/context/base/x-pending.mkiv b/tex/context/base/x-pending.mkiv
new file mode 100644
index 000000000..20fe5fb6a
--- /dev/null
+++ b/tex/context/base/x-pending.mkiv
@@ -0,0 +1,39 @@
+%D \module
+%D [ file=x-pending,
+%D version=2008.04.04,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Track \MKII\ \XML\ usage in \MKIV,
+%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 Including this module will result in the production of
+%D a file \type {jobname-pending-xml.log} which has a
+%D \LUA\ table with \XML\ elements that are still catched by
+%D \MKII\ code, when enabled.
+
+\startluacode
+ dofile(resolvers.find_file("lxml-inf.lua"))
+ local list = { }
+ function document.check_pending_xml_element(str)
+ list[str] = (list[str] and (list[str]+1)) or 1
+ end
+ function document.show_pending_xml_elements()
+ io.savedata("\jobname-pending-xml-mkii.log", table.serialize(list))
+ io.savedata("\jobname-pending-xml-mkiv.log", table.serialize(lxml.get_command_status()))
+ end
+\stopluacode
+
+\defineXMLcommand
+ [default]
+ {\ctxlua{document.check_pending_xml_element("\currentXMLelement")}}
+
+\appendtoks
+ \ctxlua{document.show_pending_xml_elements()}%
+\to \everystoptext
+
+\endinput
diff --git a/tex/context/base/x-physml.mkii b/tex/context/base/x-physml.mkii
new file mode 100644
index 000000000..7f6a94642
--- /dev/null
+++ b/tex/context/base/x-physml.mkii
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=m-physml,
+%D version=2001.09.04,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading PHYSML Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[units] \useXMLfilter[pml,pmu]
+
+\endinput
diff --git a/tex/context/base/x-physml.mkiv b/tex/context/base/x-physml.mkiv
new file mode 100644
index 000000000..508c70c52
--- /dev/null
+++ b/tex/context/base/x-physml.mkiv
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=m-physml,
+%D version=2001.09.04,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading PHYSML Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% todo
+
+\endinput
diff --git a/tex/context/base/x-physml.tex b/tex/context/base/x-physml.tex
new file mode 100644
index 000000000..10768db51
--- /dev/null
+++ b/tex/context/base/x-physml.tex
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=m-physml,
+%D version=2001.09.04,
+%D title=\CONTEXT\ XML Modules,
+%D subtitle=Loading PHYSML Filters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{x-physml}
+
+\endinput
diff --git a/tex/context/base/x-physml.xsd b/tex/context/base/x-physml.xsd
new file mode 100644
index 000000000..865d88c58
--- /dev/null
+++ b/tex/context/base/x-physml.xsd
@@ -0,0 +1,172 @@
+<?xml version="1.0"?>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+<xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ This schema covers (basic presentational) Physics
+ markup. It combines the power of MathML and the ConTeXt
+ units engine.
+
+ author: Hans Hagen, copyright: PRAGMA-ADE / Hasselt NL
+ </xsd:documentation>
+</xsd:annotation>
+
+<xsd:complexType name="unit.power.type">
+ <xsd:element name="Inverse" minOccurs="0" maxOccurs="1" />
+ <xsd:choice>
+ <xsd:element name="Linear" />
+ <xsd:element name="Square" />
+ <xsd:element name="Cubic" />
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:complexType name="unit.prefix.type">
+ <xsd:choice>
+ <xsd:element name="Atto" />
+ <xsd:element name="Femto" />
+ <xsd:element name="Pico" />
+ <xsd:element name="Nano" />
+ <xsd:element name="Micro" />
+ <xsd:element name="Milli" />
+ <xsd:element name="Centi" />
+ <xsd:element name="Deci" />
+ <xsd:element name="Hecto" />
+ <xsd:element name="Kilo" />
+ <xsd:element name="Mega" />
+ <xsd:element name="Giga" />
+ <xsd:element name="Terra" />
+ <xsd:element name="Peta" />
+ <xsd:element name="Exa" />
+
+ <xsd:element name="NoUnit" />
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:complexType name="unit.midfix.type">
+ <xsd:choice>
+ <xsd:element name="Per" />
+ <xsd:element name="Times" />
+ <xsd:element name="Solidus" />
+ <xsd:element name="OutOf" />
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:complexType name="unit.suffix.type">
+ <xsd:choice>
+ <xsd:element name="Ampere" />
+ <xsd:element name="Angstrom" />
+ <xsd:element name="At" />
+ <xsd:element name="Atm" />
+ <xsd:element name="Atom" />
+ <xsd:element name="Bar" />
+ <xsd:element name="Baud" />
+ <xsd:element name="Bell" />
+ <xsd:element name="Bequerel" />
+ <xsd:element name="Bit" />
+ <xsd:element name="Byte" />
+ <xsd:element name="Cal" />
+ <xsd:element name="Candela" />
+ <xsd:element name="Celsius" />
+ <xsd:element name="Coulomb" />
+ <xsd:element name="Day" />
+ <xsd:element name="Deg" />
+ <xsd:element name="Degrees" />
+ <xsd:element name="Equivalent" />
+ <xsd:element name="EVolt" />
+ <xsd:element name="eVolt" />
+ <xsd:element name="Fahrenheit" />
+ <xsd:element name="Farad" />
+ <xsd:element name="Foot" />
+ <xsd:element name="Force" />
+ <xsd:element name="Gauss" />
+ <xsd:element name="Gram" />
+ <xsd:element name="Gray" />
+ <xsd:element name="Henry" />
+ <xsd:element name="Hertz" />
+ <xsd:element name="Hour" />
+ <xsd:element name="Inch" />
+ <xsd:element name="Joule" />
+ <xsd:element name="Kelvin" />
+ <xsd:element name="Liter" />
+ <xsd:element name="Lux" />
+ <xsd:element name="Meter" />
+ <xsd:element name="Min" />
+ <xsd:element name="Mol" />
+ <xsd:element name="Molair" />
+ <xsd:element name="Month" />
+ <xsd:element name="Newton" />
+ <xsd:element name="Ohm" />
+ <xsd:element name="Pascal" />
+ <xsd:element name="Rad" />
+ <xsd:element name="RevPerMin" />
+ <xsd:element name="RevPerSec" />
+ <xsd:element name="Sec" />
+ <xsd:element name="Second" />
+ <xsd:element name="Siemens" />
+ <xsd:element name="Sievert" />
+ <xsd:element name="Sterant" />
+ <xsd:element name="Tesla" />
+ <xsd:element name="Volt" />
+ <xsd:element name="VoltAC" />
+ <xsd:element name="VoltDC" />
+ <xsd:element name="Watt" />
+ <xsd:element name="Weber" />
+ <xsd:element name="Week" />
+ <xsd:element name="Year" />
+
+ <xsd:element name="Unit" />
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:complexType name="unit.component.type">
+ <xsd:sequence>
+ <xsd:element ref="unit.power.type" minOccurs="0" maxOccurs="1" />
+ <xsd:element ref="unit.prefix.type" minOccurs="0" maxOccurs="1" />
+ <xsd:element ref="unit.suffix.type" minOccurs="0" maxOccurs="1" />
+ </xsd:sequence>
+</xsd:complexType>
+
+<xsd:complexType name="unit.type">
+ <xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="unit.component.type" minOccurs="1" maxOccurs="1" />
+ </xsd:sequence>
+ <xsd:sequence>
+ <xsd:element ref="unit.component.type" minOccurs="1" maxOccurs="1" />
+ <xsd:element ref="unit.midfix.type" minOccurs="1" maxOccurs="1" />
+ <xsd:element ref="unit.component.type" minOccurs="1" maxOccurs="1" />
+ </xsd:sequence>
+ </xsd:choice>
+</xsd:complexType>
+
+<xsd:element name="unit" type="unit.type" />
+
+<xsd:element name="physics.type">
+ <choice>
+ <xsd:element name="apply">
+ <xsd:sequence>
+ <xsd:element name="unit" minOccurs="1" maxOccurs="1" />
+ <xsd:element name="some kind of mml result" minOccurs="0" maxOccurs="1" />
+ <choice>
+ <xsd:element name="cu" type=unit.type minOccurs="0" maxOccurs="1" />
+ <xsd:element name="cunseq" type=unit.type minOccurs="0" maxOccurs="1" />
+ <xsd:element name="csymbol" type=unit.type minOccurs="0" maxOccurs="1" />
+ </choice>
+ </xsd:sequence>
+ </xsd:element>
+ <xsd:sequence>
+ <choice>
+ <xsd:element name="cn" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="ci" minOccurs="0" maxOccurs="1" />
+ </choice>
+ <xsd:element name="cu" type="unit.type" minOccurs="0" maxOccurs="1" />
+ </xsd:sequence>
+ </choice>
+</xsd:element>
+
+<xsd:element name="phys" type="physics.type" />
+<xsd:element name="iphys" type="physics.type" />
+<xsd:element name="dphys" type="physics.type" />
+
+</xsd:schema>
diff --git a/tex/context/base/x-res-00.tex b/tex/context/base/x-res-00.tex
new file mode 100644
index 000000000..9878d0a58
--- /dev/null
+++ b/tex/context/base/x-res-00.tex
@@ -0,0 +1,67 @@
+%D \module
+%D [ file=x-res-00,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Resource Libraries,
+%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
+
+% \defineXMLcommandpush [rl:instance] (todo)
+% \rawframed == [frame=off,offset=overlay]
+
+% resource library
+
+\defineXMLprocess [rl:figurelibrary] % not to be used any longer
+\defineXMLprocess [rl:library]
+
+% resource library description
+
+\defineXMLignore [rl:description]
+
+\defineXMLpush [rl:organization]
+\defineXMLpush [rl:product]
+\defineXMLpush [rl:project]
+\defineXMLpush [rl:collection]
+
+% resource library entries (better use XMLignore)
+
+\defineXMLignore [rl:applet]
+\defineXMLignore [rl:application]
+\defineXMLignore [rl:figure]
+\defineXMLignore [rl:movie]
+\defineXMLignore [rl:sound]
+
+\defineXMLpush [rl:type]
+\defineXMLpush [rl:state]
+\defineXMLpush [rl:width]
+\defineXMLpush [rl:height]
+\defineXMLpush [rl:file]
+\defineXMLpush [rl:label]
+\defineXMLpush [rl:original]
+\defineXMLpush [rl:title]
+\defineXMLpush [rl:alternative]
+\defineXMLpush [rl:dummy]
+\defineXMLpush [rl:icon]
+\defineXMLpush [rl:copyright]
+\defineXMLpush [rl:comment]
+\defineXMLpush [rl:status]
+\defineXMLpush [rl:original]
+\defineXMLpush [rl:manipulation]
+
+% instances
+
+\defineXMLignore [rl:instance]
+
+\defineXMLpush [rl:background]
+\defineXMLpush [rl:viewport]
+\defineXMLpush [rl:dimension]
+\defineXMLpush [rl:position]
+
+\protect \endinput
diff --git a/tex/context/base/x-res-01.tex b/tex/context/base/x-res-01.tex
new file mode 100644
index 000000000..dc14e7054
--- /dev/null
+++ b/tex/context/base/x-res-01.tex
@@ -0,0 +1,487 @@
+%D \module
+%D [ file=x-fig-01,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base 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 See \type {x-fig-00.tex} and \type {x-fig-04.tex} for more
+%D information on how to use and generate figure databases.
+%D This file loads the file named \type {\jobfilename}
+%D (\TEXEXEC\ will set this variable). You can apply this
+%D style to a database by saying:
+%D
+%D \starttyping
+%D texexec --pdf --use=fig-make yourfile.xml
+%D \stoptyping
+%D
+%D The following modes are supported:
+%D
+%D \starttabulate[|lT|l|]
+%D \NC letter \NC map the preview on letter size \NC \NR
+%D \NC compact \NC use an alternative presentation \NC \NR
+%D \NC clipgrid-distance \NC add a copy with grid overlayed \NC \NR
+%D \NC clipgrid-steps \NC add a copy with grid overlayed \NC \NR
+%D \NC previewpage-A4 \NC show graphic relative to A4 \NC \NR
+%D \NC previewpage-letter \NC show graphic relative to letter \NC \NR
+%D \NC previewpage-S6 \NC show graphic relative to S6 \NC \NR
+%D \stoptabulate
+%D
+%D The resulting file has the following characteristics:
+%D
+%D \startitemize[packed]
+%D \item the document is split into three sections: first each
+%D figure is shown at its own page, then an overview of
+%D figures is shown with some data alongside, and
+%D finally an index and table of contents shows up
+%D \item there is no title page, which means that one can
+%D access a figure by page number without offset
+%D \item the document is opened at the first overview page,
+%D that is, when the viewer supports it
+%D \item the graphic is shown 3~times: on a page of its own,
+%D scaled to a fixed dimension, and relative to a4 or
+%D letter paper size
+%D \item the labels can be accessed in an index and list at
+%D the end of the document
+%D \stopitemize
+%D
+%D We use named destinations, which means that one can
+%D access a figure by name from an external application.
+
+\usemodule[res-00]
+
+\autoXMLnamespace[rl]
+
+\setupoutput[pdftex] \overcomePDFspacefalse
+
+\setjobfullname {xml} % default suffix
+
+\doifnothing {\jobfullname} {\end}
+\doiffileelse {\jobfullname} {} {\end}
+
+\definesymbol [attachment] [{\bf\color[darkred]{\jobname.xml}}]
+\setupattachments [symbol=attachment]
+\useattachment [datafile] [\jobname.xml]
+
+\def\StartDescription
+ {\bgroup}
+
+\def\StopDescription
+ {\subject {Figure collection}
+ \starttabulate[|lBe|p|]
+ \doifXMLdataelse{rl:organization}
+ {\NC organization \NC \XMLflush{rl:organization} \NC \NR}{}
+ \doifXMLdataelse{rl:project}
+ {\NC project \NC \XMLflush{rl:project} \NC \NR}{}
+ \doifXMLdataelse{rl:product}
+ {\NC product \NC \XMLflush{rl:product} \NC \NR}{}
+ \doifXMLdataelse{rl:comment}
+ {\NC comment \NC \XMLflush{rl:comment} \NC \NR}{}
+ \NC specification \NC \attachment[datafile] \NC \NR
+ \stoptabulate
+ \blank[2*big]
+ \egroup}
+
+
+\def\localexternalfigurereplacement#1#2#3% hack, no reuse of dummies (yet), todo: pass objname
+ {\doifelsenothing{\XMLflush{rl:label}}
+ {\edef\FigureName{\XMLflush{rl:label}}}
+ {\edef\FigureName{\XMLflush{rl:file}}}%
+ \doifobjectfoundelse{rl}\FigureName
+ {}
+ {\setobject{rl}\FigureName\vbox{\normalexternalfigurereplacement{#1}{#2}{#3}}}%
+ \getobject{rl}\FigureName}
+
+\startmode[dummy]
+
+ \useMPlibrary[dum]
+
+ \def\StartFigureA
+ {\bgroup
+ \XMLassign{rl:file}{dummy}}
+
+ \let\normalexternalfigurereplacement\externalfigurereplacement
+ \let\externalfigurereplacement \localexternalfigurereplacement
+
+\stopmode
+
+\startnotmode[dummy]
+
+ \def\StartFigureA
+ {\bgroup
+ \XMLassign{rl:file}{unknown}}
+
+\stopnotmode
+
+\startbuffer[unknown]
+ \framed
+ [width=\XMLpar{rl:dummy}{width}{12cm},
+ height=\XMLpar{rl:dummy}{height}{8cm},
+ background=color,
+ backgroundcolor=gray,
+ foregroundcolor=darkred,
+ align={lohi,middle}, % normal,
+ frame=off]
+ {\bf \XMLflush{rl:dummy}}
+\stopbuffer
+
+\useexternalfigure[unknown][unknown][type=buffer,object=no]
+
+\defineoverlay[page][\overlaybutton{Description}]
+
+% \def\externalfigurereplacement#1#2#3%
+% {\getbuffer[rl-unknown]}
+
+\def\StopFigureA
+ {\doglobal\increment\CurrentPage
+ \setupbackgrounds[page][background=page]
+ \doifelsenothing{\XMLflush{rl:label}}
+ {\expanded{\definereference[Description][about:\XMLflush{rl:file}]}%
+ \expanded{\pagereference[\XMLflush{rl:file}]}}
+ {\expanded{\definereference[Description][about:\XMLflush{rl:label}]}%
+ \expanded{\pagereference[\XMLflush{rl:label}]}}
+ \pagefigure[\XMLflush{rl:file}]
+ \setupbackgrounds[page][background=]
+ \egroup}
+
+\def\StartFigureB
+ {\StartFigureA}
+
+\defineregister
+ [figureindex]
+ [figureindices]
+
+\setupregister
+ [figureindex]
+ [ownnumber=yes,
+ criterium=text,
+ interaction=text,
+ indicator=no]
+
+\definelist
+ [figurelist]
+
+\setuplist
+ [figurelist]
+ [criterium=text,
+ pagenumber=no,
+ width=2em,
+ interaction=all]
+
+\setupcolors
+ [state=start]
+
+\setuptolerance
+ [verytolerant]
+
+% Ulgy:
+
+\startmode[letter] % downward compatible
+ \enablemode[previewpage-letter]
+\stopmode
+
+\startnotmode[previewpage-letter,previewpage-S6]
+ \enablemode[previewpage-A4]
+\stopnotmode
+
+\startsetups[paper]
+\startmode[previewpage-A4]
+ \framed
+ [width=210mm,height=297mm,offset=overlay,frame=off,
+ background=color,backgroundcolor=white]
+ {\externalfigure[\XMLflush{rl:file}][reset=yes]}
+\stopmode
+\startmode[previewpage-letter]
+ \framed
+ [width=8.5in,height=11in,offset=overlay,frame=off,
+ background=color,backgroundcolor=white]
+ {\externalfigure[\XMLflush{rl:file}][reset=yes]}
+\stopmode
+\startmode[previewpage-S6]
+ \framed
+ [width=600pt,height=450pt,offset=overlay,frame=off,
+ background=color,backgroundcolor=white]
+ {\externalfigure[\XMLflush{rl:file}][reset=yes]}
+\stopmode
+\stopsetups
+
+\setupbuttons
+ [offset=10pt,
+ width=broad,
+ strut=no,
+ rulethickness=1pt,
+ framecolor=darkred]
+
+\definecolor[XMLRLcolor][white]
+
+\def\StopFigureB
+ {\doglobal\increment\CurrentPage
+ \doifelsenothing{\XMLflush{rl:label}}
+ {\expanded{\definereference[Figure][\XMLflush{rl:file}]}%
+ \expanded{\definereference[GridPg][grid:\XMLflush{rl:file}]}}
+ {\expanded{\definereference[Figure][\XMLflush{rl:label}]}%
+ \expanded{\definereference[GridPg][grid:\XMLflush{rl:label}]}}%
+ \button
+ {\hbox to \hsize
+ {\forgetall \dontcomplain
+ \doifelsenothing{\XMLflush{rl:label}}
+ {\expanded{\pagereference[about:\XMLflush{rl:file}]}}
+ {\expanded{\pagereference[about:\XMLflush{rl:label}]}}%
+ % moved here, because descriptions may be absent
+ \ifnum\CurrentPage=1 \pagereference[begin]\fi
+ %
+ \expanded{\writetolist[figurelist]{\CurrentPage}{\XMLflush{rl:label}}}%
+ \expanded{\figureindex{\CurrentPage}{\XMLflush{rl:label}}}%
+ \startnotmode[compact]%
+ \vbox to 100pt
+ {\hsize30pt
+ \vskip5pt
+ \hbox to \hsize{\hss\strut\bf\CurrentPage\hss}%
+ \vfill}%
+ \advance\hsize by -30pt
+ \stopnotmode
+ \startmode[compact]%
+ \advance\hsize by -10pt
+ \hskip10pt
+ \stopmode
+ \button % \framed
+ [width=150pt,height=100pt,offset=10pt,frame=off,
+ background=color,backgroundcolor=white,color=]
+ {\externalfigure
+ [\XMLflush{rl:file}]
+ %[maxheight=80pt,frame=off,maxwidth=130pt,factor=max]}%
+ [factor=max]}%
+ [GridPg]%
+ \let\FigWid\figurenaturalwidth
+ \let\FigHei\figurenaturalheight
+ \advance\hsize by -150pt
+ \hskip10pt
+ \advance\hsize by -10pt
+ \vbox to 100pt
+ {\hsize40pt
+ %\externalfigure
+ % [paper]
+ % [type=buffer,frame=on,
+ % framecolor=darkred,rulethickness=.5pt,
+ % width=40pt,object=no]
+ \framed
+ [offset=overlay,
+ framecolor=darkred,
+ rulethickness=.5pt]
+ {\scale[width=40pt]{\setups[paper]}}%
+ \startmode[compact]%
+ \vfill
+ \hbox to \hsize{\hss\strut\bf\CurrentPage\hss}%
+ \stopmode
+ \vfill}%
+ \advance\hsize by -40pt
+ \hskip10pt
+ \advance\hsize by -10pt
+ \vbox to 100pt
+ {\blank[disable]
+ \starttabulate[|Bel|p|]
+ \NC file \NC \XMLflush{rl:file} \NC \NR
+ \doifXMLdata{rl:label}
+ {\NC label \NC \XMLflush{rl:label} \NC \NR}
+ \NC w$\times$h \NC \FigWid$\times$\FigHei \NC \NR
+ \doifXMLdata{rl:copyright}
+ {\NC copyright \NC \XMLflush{rl:copyright} \NC \NR}
+ \doifXMLdata{rl:status}
+ {\doifelse{\XMLflush{rl:status}}{obsolete}
+ {\NC status \NC \dontleavehmode \color[darkred]{\bf\XMLflush{rl:status}} \NC \NR}
+ {\NC status \NC \XMLflush{rl:status} \NC \NR}}
+ \doifXMLdata{rl:comment}
+ {\NC comment \NC \XMLflush{rl:comment} \NC \NR}
+ \stoptabulate
+ \vfill}}}%
+ [Figure]
+ \vskip10pt
+ \egroup}
+
+\def\StartFigureC
+ {\StartFigureA}
+
+\def\StopFigureC
+ {\doglobal\increment\NumberOfFigures
+ \egroup}
+
+\setuplayout
+ [topspace=15pt,backspace=15pt,
+ header=0pt,footer=0pt,bottom=20pt,bottomdistance=10pt,
+ width=middle,height=fit]
+
+\setupbackgrounds
+ [page]
+ [background=,
+ backgroundcolor=gray]
+
+\setupinteractionscreen
+ [width=max,
+ height=max]
+
+\setupcolors
+ [state=start]
+
+\setupinteraction
+ [style=,
+ color=,
+ contrastcolor=,
+ state=start]
+
+\setuphead
+ [section]
+ [style=bfb]
+
+% \setupbodyfont
+% [pos]
+
+\setupinteractionmenu
+ [bottom]
+ [left=\hfill,
+ middle=\hskip10pt,
+ frame=off,
+ style=bold,
+ background=color,
+ backgroundcolor=darkred,
+ foregroundcolor=white]
+
+\startinteractionmenu[bottom]
+ \but [begin] begin \\
+ \but [index] index \\
+ \but [list] list \\
+ \but [CloseDocument] close \\
+ \but [PreviousJump] go back \\
+\stopinteractionmenu
+
+\setupinteraction
+ [openaction=begin]
+
+\defineXMLenvironment [rl:figurelibrary] \StartLibrary \StopLibrary
+\defineXMLenvironment [rl:library] \StartLibrary \StopLibrary
+
+\starttext
+
+\def\StartLibrary{\mainlanguage[\XMLpar{rl:library}{language}{en}]}
+\def\StopLibrary {}
+
+\defineXMLignore [rl:description]
+\defineXMLenvironment [rl:figure] \StartFigureC \StopFigureC
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfullname}
+
+\increment\NumberOfFigures
+
+\defineXMLignore [rl:description]
+\defineXMLenvironment [rl:figure] \StartFigureA \StopFigureA
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfullname}
+
+\setuppapersize
+ [S6][S6]
+
+\setupbackgrounds
+ [page]
+ [background=color]
+
+\setupinteraction
+ [menu=on]
+
+\defineXMLenvironment [rl:description] \StartDescription \StopDescription
+\defineXMLenvironment [rl:figure] \StartFigureB \StopFigureB
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfullname} \page
+
+\subject [list] {List of figures}
+
+\placelist[figurelist] \page
+
+\subject [index] {Index of figures}
+
+\startcolumns
+\placeregister[figureindex]
+\stopcolumns
+
+\doifmodeelse{clipgrid-distance,clipgrid-steps}{\page}{\stoptext}
+
+\startuniqueMPgraphic{clipgrid}{dx,dy,nx,ny,type}
+ numeric gdx, gdy, lbx, lby ;
+ if \MPvar{type}=1 :
+ gdx := \MPvar{dy} ;
+ gdy := \MPvar{dx} ;
+ else :
+ gdx := OverlayWidth /\MPvar{nx} ;
+ gdy := OverlayHeight/\MPvar{ny} ;
+ fi ;
+ lbx := gdx ;
+ lby := gdy ;
+ defaultfont := "\truefontname{Mono}" ;
+ defaultscale := .5 ;
+ numeric pen ; pen := .25pt ;
+ def MyGrid text t =
+ draw vlingrid (0,OverlayWidth ,gdy,OverlayWidth ,OverlayHeight) t ;
+ draw hlingrid (0,OverlayHeight,gdx,OverlayHeight,OverlayWidth ) t ;
+ enddef ;
+ pickup pencircle scaled pen ;
+ MyGrid withcolor white ;
+ MyGrid dashed evenly scaled pen ;
+ draw OverlayBox withcolor white ;
+ draw OverlayBox dashed evenly scaled pen ;
+ draw vlinlabel.bot(0,eps+OverlayWidth /lby,2,OverlayWidth ) ;
+ draw hlinlabel.lft(0,eps+OverlayHeight/lbx,2,OverlayHeight) ;
+ setbounds currentpicture to OverlayBox enlarged (2*EmWidth) ;
+\stopuniqueMPgraphic
+
+\presetMPvariable[clipgrid][dx=10pt]
+\presetMPvariable[clipgrid][dy=10pt]
+\presetMPvariable[clipgrid][nx=10]
+\presetMPvariable[clipgrid][ny=10]
+
+\startmode[clipgrid-distance]
+ \defineoverlay[grid][\uniqueMPgraphic{clipgrid}{type=1}]
+\stopmode
+
+\startmode[clipgrid-steps]
+ \defineoverlay[grid][\uniqueMPgraphic{clipgrid}{type=2}]
+\stopmode
+
+\setupexternalfigures
+ [background={color,foreground,grid},
+ backgroundcolor=white]
+
+\def\StartFigureD
+ {\StartFigureA}
+
+\def\StopFigureD
+ {\doglobal\increment\CurrentPage
+ \setupbackgrounds[page][background=page]
+ \startpagefigure[\XMLflush{rl:file}][offset=20pt]%
+ \doifelsenothing{\XMLflush{rl:label}}
+ {\expanded{\definereference[Description][about:\XMLflush{rl:file}]}%
+ \expanded{\pagereference[grid:\XMLflush{rl:file}]}}
+ {\expanded{\definereference[Description][about:\XMLflush{rl:label}]}%
+ \expanded{\pagereference[grid:\XMLflush{rl:label}]}}
+ \stoppagefigure
+ %\pagefigure[\XMLflush{rl:file}][offset=20pt]
+ \setupbackgrounds[page][background=]
+ \egroup}
+
+\defineXMLignore [rl:description]
+\defineXMLenvironment [rl:figure] \StartFigureD \StopFigureD
+
+\doglobal\newcounter\CurrentPage
+
+\processXMLfilegrouped{\jobfullname} \page
+
+\stoptext
diff --git a/tex/context/base/x-res-02.tex b/tex/context/base/x-res-02.tex
new file mode 100644
index 000000000..a29f446f3
--- /dev/null
+++ b/tex/context/base/x-res-02.tex
@@ -0,0 +1,72 @@
+%D \module
+%D [ file=x-res-02,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base Inclusion (I),
+%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 enables non||\ConTeXt\ users to access the
+%D database. For this, you need to run
+%D
+%D \starttyping
+%D texexec --pdf --use=fig-fake yourfile.xml
+%D \stoptyping
+%D
+%D The resulting file, \type {yourfile.fig}, can be loaded
+%D in the normal way. The figures can be accessed with:
+%D
+%D \starttyping
+%D \getfigurefile{label}
+%D \getfigurepage{label}
+%D \stoptyping
+%D
+%D A a bonus, the following macro is defined:
+%D
+%D \starttyping
+%D \includefigurefile width 10cm {label}
+%D \stoptyping
+
+\usemodule[res-00]
+
+\doifnothing {\jobfullname} {\end}
+\doiffileelse {\jobfullname} {} {\end}
+
+\defineXMLenvironment [rl:figurelibrary] \StartLibrary \StopLibrary
+\defineXMLenvironment [rl:library] \StartLibrary \StopLibrary
+\defineXMLenvironment [rl:figure] \StartFigure \StopFigure
+
+\def\StartLibrary
+ {\immediate\openout \scratchwrite=\jobfilename.fig
+ \immediate\write\scratchwrite{\string\input\space x-fig-03.tex \string\relax}
+ \immediate\write\scratchwrite{}}
+
+\def\StopLibrary
+ {\immediate\write\scratchwrite{}
+ \immediate\write\scratchwrite{\string\endinput}
+ \immediate\closeout\scratchwrite}
+
+\def\StartFigure
+ {\bgroup}
+
+\def\StopFigure
+ {\doglobal\increment\CurrentPage
+ \immediate\write\scratchwrite
+ {\string\setfiguredata\space
+ {\XMLpop{rl:label}}
+ {\jobfilename}
+ {\CurrentPage}}
+ \egroup}
+
+\doglobal\newcounter\CurrentPage
+
+\starttext
+
+\processXMLfilegrouped{\jobfullname}
+
+\stoptext
diff --git a/tex/context/base/x-res-03.tex b/tex/context/base/x-res-03.tex
new file mode 100644
index 000000000..bf5ea226c
--- /dev/null
+++ b/tex/context/base/x-res-03.tex
@@ -0,0 +1,44 @@
+%D \module
+%D [ file=x-fig-03,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base Inclusion (II),
+%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.
+
+\ifx \undefined \convertMPtoPDF \input supp-pdf.tex \fi
+\ifx \undefined \includefigurefile \else \expandafter \endinput \fi
+
+\gdef\getfigurefile#1%
+ {\expandafter\ifx\csname x-fig-f-#1\endcsname\relax
+ \currentfigurefile
+ \else
+ \csname x-fig-f-#1\endcsname
+ \fi}
+
+\gdef\getfigurepage#1%
+ {\expandafter\ifx\csname x-fig-p-#1\endcsname\relax
+ 1%
+ \else
+ \csname x-fig-p-#1\endcsname
+ \fi}
+
+\gdef\setfiguredata#1#2#3%
+ {\gdef\currentfigurefile{#2}%
+ \expandafter\gdef\csname x-fig-f-#1\endcsname{#2}%
+ \expandafter\gdef\csname x-fig-p-#1\endcsname{#3}}
+
+\def\includefigurefile#1#%
+ {\doincludefigurefile{#1}}
+
+\def\doincludefigurefile#1#2%
+ {\edef\next{\noexpand\pdfimage
+ #1 page \getfigurepage{#2} {\getfigurefile{#2}.pdf}}%
+ \next}
+
+\endinput
diff --git a/tex/context/base/x-res-04.tex b/tex/context/base/x-res-04.tex
new file mode 100644
index 000000000..b5032f550
--- /dev/null
+++ b/tex/context/base/x-res-04.tex
@@ -0,0 +1,336 @@
+%D \module
+%D [ file=x-fig-04,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base Loading,
+%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.
+
+% hele base laden
+
+\setXMLfallbackmode3
+
+% icon : preview
+% caption : \figurebasevariable{caption}
+% background : rgb cmyk gray name
+% dimensions : width height offset (l,r,t,b) area
+% alternative : tag label / evt list
+%
+% movie
+% sound
+% applet
+% application
+
+\usemodule[res-00] % basic element definitions
+
+%D This module implements an interface to a figure database
+%D and file. The database is formatted in \XML\ conforming
+%D the following \DTD:
+%D
+%D \typefile{x-fig-00.dtd}
+%D
+%D A figure base coded this way looks like:
+%D
+%D \starttyping
+%D <!-- texexec --pdf --use=fig-01 figtest.xml -->
+%D
+%D <?xml version='1.0'?>
+%D
+%D <rl:library language="nl">
+%D
+%D <rl:description>
+%D <organization>PRAGMA Advanced Document Engineering</rl:organization>
+%D <project>Manuals</rl:project>
+%D <product>Beginners Manual</rl:product>
+%D <comment>A bunch of figures.</rl:comment>
+%D </rl:description>
+%D
+%D <rl:figure>
+%D <rl:file>koe.pdf</rl:file>
+%D <rl:label>a dutch cow</rl:label>
+%D <rl:copyright>Corel Draw Suite</rl:copyright>
+%D <rl:comment>I bet that you've seen this cow before.</rl:comment>
+%D </rl:figure>
+%D
+%D <rl:figure>
+%D <rl:dummy width="4cm" height="3cm">non existent</rl:dummy>
+%D <rl:label>a european cow</rl:label>
+%D <rl:copyright>Nobody</rl:copyright>
+%D <rl:comment>When will we talk about European cows?</rl:comment>
+%D </rl:figure>
+%D
+%D </rl:library>
+%D \stoptyping
+%D
+%D You can convert this base into a \PDF\ file using
+%D \TEXEXEC\ and another module in this suite.
+%D
+%D \starttyping
+%D texexec --pdf --use=fig-make yourfile.xml
+%D \stoptyping
+%D
+%D You can now select a graphic from this file using the
+%D
+%D \starttyping
+%D \externalfigure[a dutch cow][width=4cm]
+%D \stoptyping
+%D
+%D This module overloads this command so that a figure is
+%D it first searched in the list of databases.
+%D
+%D \starttyping
+%D \usemodule [fig-base]
+%D \usefigurebases[yourfile]
+%D \stoptyping
+%D
+%D The special keyword \type {reset} can be used to reset
+%D this list.
+
+\startcommands dutch english
+ german czech
+ italian romanian
+
+ usefigurebase: gebruikfiguurbestand usefigurebase
+ usefigurebase usefigurebase
+ usefigurebase usefigurebase
+
+\stopcommands
+
+\unprotect
+
+\consultutilityfilefalse
+
+% 0 = no loading
+% 1 = selective loading
+% 2 = full loading
+
+\chardef\figurebasemode=1 % 2
+
+\newcounter\figurefilepage
+
+% loading a complete figure base
+
+\startXMLmapping[rl:load]
+
+\defineXMLenvironmentsave [rl:figure]
+ {\bgroup}
+ {\XMLflush{rl:figure}
+ \doglobal\increment\figurefilepage
+ \figbase@savedata{\XMLflush{rl:label}}\figurefilepage
+ \egroup}
+
+\stopXMLmapping
+
+\def\loadfigurebase#1%
+ {\doifnotflagged{rl:#1}
+ {\writestatus{figbase}{loading #1 into memory}%
+ \startnointerference
+ \autoXMLnamespace[rl]
+ \startXMLmapping[rl:load]
+ \doglobal\newcounter\figurefilepage
+ \processXMLfilegrouped{#1.xml}
+ \stopXMLmapping
+ \doglobal\setflag{rl:#1}
+ \stopnointerference}}
+
+\def\figbase@savedata#1#2%
+ {%\writestatus{figbase}{data of #1 loaded}%
+ \doglobal\saveXMLdatastructure{rl:rl:#1}{record}{page="#2"}{}{rl:figure}{}}
+
+% locating and if needed loading one figure record
+
+\startXMLmapping[rl:find]
+
+\defineXMLenvironment[rl:instance]
+ {\bgroup}
+ {\doif\askedlabel{\XMLflush{rl:label}}
+ {\doglobal\saveXMLdata{rl:g:manipulation}{rl:manipulation}%
+ \doifXMLdata{rl:original}
+ {\xdef\askedlabel{\XMLflush{rl:original}}}}%
+ \egroup}
+
+\defineXMLenvironmentsave [rl:figure]
+ {\bgroup}
+ {\XMLflush{rl:figure}
+ \doglobal\increment\figurefilepage
+ %\doshowfigurestate{base : comparing \askedlabel\space with \XMLflush{rl:label}}%
+ \doif\askedlabel{\XMLflush{rl:label}}
+ {\doshowfigurestate{base label : found \askedlabel}%
+ \ifnum\figurebasemode=\plusone % load used ones
+ \figbase@savedata\askedlabel\figurefilepage
+ \fi
+ \doglobal\saveXMLdata{rl:l:manipulation}{rl:manipulation}%
+ \xdef\figurefilelabel {\XMLflush{rl:label}}%
+ \xdef\figurefilefile {\XMLflush{rl:file}}%
+ \xdef\figurefileoriginal{\XMLflush{rl:original}}%
+ \xdef\figurefilename {\XMLflush{rl:file}}
+ \endinput}%
+ \egroup}
+
+\defineXMLenvironment [rl:record]
+ {}
+ {\xdef\figurefilename{\XMLpop{rl:file}}
+ \xdef\figurefilepage{\XMLop {page}}}
+
+\stopXMLmapping
+
+\def\getfigurefilename#1#2%
+ {\ifnum\figurebasemode=\plustwo \loadfigurebase{#1} \fi
+ \startnointerference
+ \traceXMLelementsfalse
+ \resetfigurefilebase
+ \doglobal\newcounter\figurefilepage
+ \autoXMLnamespace[rl]
+ \startXMLmapping[rl:find]
+ \xdef\figurefilebase{#1}%
+ \def\askedlabel{#2}%
+ \doifelseXMLelement{rl:rl:\askedlabel}
+ {\enableXMLelements\flushXMLelement{rl:rl:\askedlabel}}
+ {\doshowfigurestate{base path : \figurepathlist}%
+ \processcommacommand[\figurepathlist]\dogetfigurefilename}%
+ \stopXMLmapping
+ \stopnointerference}
+
+% todo: niet toegekende naam doorgeven aan calculate en pad
+% in padstring
+
+\def\dogetfigurefilename#1%
+ {\ifx\figurefilename\empty
+ \bgroup
+ \doglobal\newcounter\figurefilepage
+ \globalletempty\figurefilelabel
+ \globalletempty\figurefileoriginal
+ \globalletempty\figurefilefile
+ \xdef\figurefilebasepath{#1}%
+ \assignfullfilename{#1}{\figurefilebase}\to\filename
+ \doiffileelse{\filename.xml}
+ {\doshowfigurestate{base file : \filename}%
+ \expanded{\processXMLfilegrouped{\filename.xml}}}
+ \donothing
+ \ifx\figurefilename\empty \else
+% \global\let\figurefilebase\figurefilebase
+ \globallet\figurefilebase\filename % hm, bad omen that this is needed
+ \fi
+ \egroup
+ \fi}
+
+\newtoks\figurebaseresets
+
+\appendtoks
+ \globalletempty\figurefilebase
+ \globalletempty\figurefilename
+ \globalletempty\figurefilebasepath
+ \globalletempty\figurefilepage
+ \globalletempty\figurefilelabel
+ %\globalletempty\figurefileoriginal
+ %\globalletempty\figurefilefile
+\to\figurebaseresets
+
+\def\resetfigurefilebase
+ {\the\figurebaseresets}
+
+\ifx\doshowfigurestate\undefined \let\doshowfigurestate\gobbleoneargument \fi
+
+\def\doanalyzefiguredimensionsfromfile
+ {\ifcase\figurestatus \ifx\figurebaselist\empty \else
+ \resetfigurefilebase
+ \doshowfigurestate{base list : \figurebaselist}%
+ \processcommacommand[\figurebaselist]\dodoanalyzefiguredimensionsfromfile
+ \ifx\figurefilename\empty
+ \doshowfigurestate{base warning : no matching name found}%
+ \else
+ \doiffileelse{\figurefilebase.pdf}
+ {\doshowfigurestate{base file : \figurefilebase.pdf}%
+ \doshowfigurestate{base page : \figurefilepage}%
+ \let\figurepathlist\figurefilebasepath
+ \analyzefigurefilename{\figurefilebase.pdf}\wantedfigurelabel
+ \let\wantedfigurepage\figurefilepage}
+ {\doshowfigurestate{base missing : \figurefilebase.pdf}}
+ \fi
+ \ifcase\figurestatus
+ \analyzefigurefilename\expandedfigurename\wantedfigurelabel
+ \fi
+ \fi \fi}
+
+\def\dodoanalyzefiguredimensionsfromfile#1%
+ {\doshowfigurestate{base check : \wantedfigurename\space in #1}%
+ \getfigurefilename{#1}\wantedfigurename
+ \ifx\figurefilename\empty\else
+ \quitcommalist
+ \fi}
+
+% management
+
+% will become \useresourcelibrary
+
+\def\usefigurebase[#1]%
+ {\doifelse{#1}\v!reset
+ {\let\figurebaselist\empty}
+ {\addtocommalist{#1}\figurebaselist}}
+
+\let\figurebaselist\empty
+
+\resetfigurefilebase
+
+% manipulations / todo: fixed order
+
+\defineXMLsave [rl:manipulation]
+
+\defineXMLsingular [rl:background] [r=0,g=0,b=0,s=0,c=0,m=0,y=0,k=0]
+ {\global\setbox\foundexternalfigure\vbox
+ {\definecolor
+ [XMLRLcolor]
+ [r=\XMLop{r},g=\XMLop{g},b=\XMLop{b},s=\XMLop{s},%
+ c=\XMLop{c},m=\XMLop{m},y=\XMLop{y},k=\XMLop{k}]%
+ \framed
+ [\c!frame=\v!off,\c!offset=\v!overlay,
+ \c!background=\v!color,\c!backgroundcolor=XMLRLcolor]
+ {\box\foundexternalfigure}}}
+
+\defineXMLsingular [rl:viewport] [\??cp] % []
+ {\global\setbox\foundexternalfigure\vbox
+ {\expandXMLta \getXMLta
+ \clip
+ [\XMLta]
+ {\box\foundexternalfigure}}%
+ \global\setbox\foundexternalfigure\vbox
+ {\scale
+ [\c!width=\figurewidth,\c!height=\figureheight]
+ {\box\foundexternalfigure}}}
+
+\defineXMLsingular [rl:dimensions] [width=,height=]
+ {}
+
+\defineXMLsingular [rl:position] [offset=,width=,height=,hoffset=,voffset=]
+ {}
+
+\appendtoks
+ \doglobal\eraseXMLelement{rl:l:manipulation}%
+ \doglobal\eraseXMLelement{rl:g:manipulation}%
+\to \figurebaseresets
+
+\appendtoks
+ \startnointerference
+ \processXMLelement{rl:l:manipulation}%
+ \processXMLelement{rl:g:manipulation}%
+ \stopnointerference
+\to \externalfigurepostprocessors
+
+\protect \doifnotmode{demo}{\endinput}
+
+\starttext
+
+\setupcolors[state=start]
+
+\usefigurebase[d-fig-01]
+
+\externalfigure[part of a dutch cow][width=3cm,frame=on]
+\externalfigure[a simple dutch cow][width=5cm,frame=on]
+\externalfigure[another simple dutch cow][width=5cm,frame=on]
+
+\stoptext
diff --git a/tex/context/base/x-res-08.tex b/tex/context/base/x-res-08.tex
new file mode 100644
index 000000000..3d0625f8c
--- /dev/null
+++ b/tex/context/base/x-res-08.tex
@@ -0,0 +1,131 @@
+%D \module
+%D [ file=x-fig-08,
+%D version=2002.06.27,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Resource Reporting,
+%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 TODO: make rlxtools callable from texexec (class), speeds up things.
+
+%D Experimental module!
+%D
+%D \starttyping
+%D <rl:library>
+%D <rl:usage>
+%D <rl:type>figure</rl:type>
+%D <rl:state>found|missing</rl:state>
+%D <rl:name>filename</rl:name>
+%D <rl:suffix>filesuffix</rl:suffix>
+%D <rl:width>width in pt</rl:width>
+%D <rl:height>height in pt</rl:height>
+%D <rl:comment>text</rl:comment>
+%D </rl:usage>
+%D </rl:library>
+%D \stoptyping
+
+\doifnotmode{\systemmodeprefix\v!first}{\endinput}
+
+\unprotect
+
+\def\XMLrlprefix{rl:}
+
+\newwrite\XMLrllog
+
+\def\openXMLresourcelog
+ {\immediate\openout\XMLrllog\jobname.rlg\relax
+ \immediate\write\XMLrllog{\XMLbanner{standalone='yes'}}%
+ \immediate\write\XMLrllog{\writtenXMLstart{\XMLrlprefix library}}}
+
+\def\closeXMLresourcelog
+ {\immediate\write\XMLrllog{\writtenXMLend{\XMLrlprefix library}}%
+ \immediate\closeout\XMLrllog}
+
+\let\figurefilelabel \empty
+\let\figurefileoriginal \empty
+\let\figurefilefile \empty
+\let\figurefilepath \empty
+\let\figurefileconversion\empty
+\let\figurefileprefix \empty
+
+\def\XMLfeedbackresource#1#2%
+ {\begingroup
+ \defconvertedcommand\currentresourcecomment\currentresourcecomment
+ \doifnothing\figurefilefile{\edef\figurefilefile{\figurefilename.\figurefiletype}}%
+ \immediate\write\XMLrllog
+ {\writtenXMLelement{\XMLrlprefix usage}%
+ {\writtenXMLelement{\XMLrlprefix type}{#2}% 'figure' not the type in \extenalfigure
+ \writtenXMLelement{\XMLrlprefix state}{#1}% 'missing' 'found' etc
+ \ifx\figurefilelabel\empty
+ \ifx\figurelabel\s!dummy \else % otherwise label equals filename
+ \writtenXMLelementcs{\XMLrlprefix label}\figurelabel
+ \fi
+ \writtenXMLelementcs{\XMLrlprefix file}\figurefilefile % complete name
+ \writtenXMLelementcs{\XMLrlprefix name}\figurefilename % no suffix
+ \writtenXMLelementcs{\XMLrlprefix suffix}\figurefiletype
+ \else
+ % \figurefilelabel is set in x-res-04 and since
+ % we fetch from this base using the normal
+ % \externalfigure macro, the label becomes the
+ % name of the figurebase
+ \writtenXMLelementcs{\XMLrlprefix base}\figurefilename
+ \writtenXMLelementcs{\XMLrlprefix label}\figurefilelabel
+ \writtenXMLelementcs{\XMLrlprefix file}\figurefilefile
+ \fi
+ \writtenXMLelementcs{\XMLrlprefix path}\figurefilepath
+ \writtenXMLelementcs{\XMLrlprefix original}\figurefileoriginal
+ \writtenXMLelementcs{\XMLrlprefix conversion}\figurefileconversion
+ \writtenXMLelementcs{\XMLrlprefix prefix}\figurefileprefix
+ \writtenXMLelementcs{\XMLrlprefix cache}\figurefilecache
+ \ifnum\figurefilepage>\zerocount
+ \writtenXMLelement{\XMLrlprefix page}\figurefilepage
+ \fi
+ \writtenXMLelementcs{\XMLrlprefix comment}\currentresourcecomment
+ \ifconditional\externalfigureflush
+ \writtenXMLelementcs{\XMLrlprefix width}\figurewidth
+ \writtenXMLelementcs{\XMLrlprefix height}\figureheight
+ \fi}}%
+ \endgroup}
+
+\def\XMLfeedbackexternalfigure
+ {\doifmodeelse{*\v!figure}%
+ {\XMLfeedbackresource{found}}%
+ {\XMLfeedbackresource{\ifconditional\externalfigureflush missing\else registered\fi}}%
+ {figure}}
+
+\setvariables
+ [rl:manipulate]
+ [file=rlxtools.rlx]
+
+% \startsetups[rl:manipulate]
+% \doiflocfileelse{\jobname.rlx}
+% {\installprogram{texmfstart rlxtools --manipulate kpse:\jobname.rlx \jobname.rlg}}
+% {\installprogram{texmfstart rlxtools --manipulate kpse:\getvariabledefault{rl:manipulate}{file}{rlxtools.rlx} \jobname.rlg}}
+% \stopsetups
+%
+% no longer need for \setups[rl:manipulate]
+
+\ifx\nofconversionfigures\undefined \chardef\nofconversionfigures\plusone \fi
+
+\appendtoks
+ \ifcase\nofconversionfigures
+ \writestatus\m!systems{not registering rlxtools (manipulator)}%
+ \else
+ \writestatus\m!systems{registering rlxtools (manipulator)}%
+ \doiflocfileelse{\jobname.rlx}
+ {\installprogram{texmfstart rlxtools --manipulate "kpse:\jobname.rlx" "\jobname.rlg"}}
+ {\installprogram{texmfstart rlxtools --manipulate "kpse:\getvariabledefault{rl:manipulate}{file}{rlxtools.rlx}" "\jobname.rlg"}}%
+ \fi
+\to \everybye % \everylastshipout
+
+\appendtoks \openXMLresourcelog \to \everystarttext
+\appendtoks \closeXMLresourcelog \to \everystoptext
+
+\let \feedbackexternalfigure \XMLfeedbackexternalfigure
+
+\protect \endinput
diff --git a/tex/context/base/x-res-09.tex b/tex/context/base/x-res-09.tex
new file mode 100644
index 000000000..608236156
--- /dev/null
+++ b/tex/context/base/x-res-09.tex
@@ -0,0 +1,69 @@
+%D \module
+%D [ file=x-fig-09,
+%D version=2002.06.27,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Resource Reporting (2),
+%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.
+
+\usemodule[res-00]
+
+\defineXMLenvironment [rl:library]
+ {\starttext}
+ {\stoptext}
+
+\defineXMLenvironment [rl:usage]
+ {\bgroup}
+ {\doifnot{\XMLflush{rl:file}}{dummy}{\setups[rl:usage]}%
+ \egroup}
+
+\defineXMLsave [rl:base] % base
+\defineXMLsave [rl:type] % figure
+\defineXMLsave [rl:state] % found|missing
+\defineXMLsave [rl:label] % label
+\defineXMLsave [rl:file] % filename
+\defineXMLsave [rl:suffix] % filesuffix
+\defineXMLsave [rl:comment] % text
+\defineXMLsave [rl:width] % width in pt
+\defineXMLsave [rl:height] % height in pt
+\defineXMLsave [rl:page] % page from file
+
+\def\XMLbpentry#1%
+ {\PointsToWholeBigPoints{\XMLflush{#1}}\temp\temp bp}
+
+% \def\XMLrlentry#1#2#3%
+% {\doiftextelse{\XMLflush{#2}}
+% {\NC\bf#1\NC\XMLflush{#2}\doif{#3}{1}{ (\XMLbpentry{#2})}\NC\NR}
+% {}}
+
+\def\XMLrlentry#1#2#3%
+ {\tableiftextelse{\XMLflush{#2}}
+ {\NC\bf#1\NC\XMLflush{#2}\doif{#3}{1}{ (\XMLbpentry{#2})}\NC\NR}{}}
+
+\startsetups[rl:usage]
+
+% by using a dedicated tabulation, we permit usage in dutch interface
+
+\definetabulate[XMLRLG][|lw(4.5em)|p|]
+
+\startXMLRLG
+ \XMLrlentry {base} {rl:base} {0}
+ \XMLrlentry {type} {rl:type} {0}
+ \XMLrlentry {state} {rl:state} {0}
+ \XMLrlentry {file} {rl:file} {0}
+ \XMLrlentry {label} {rl:label} {0}
+ \XMLrlentry {suffix} {rl:suffix} {0}
+ \XMLrlentry {page} {rl:page} {0}
+ \XMLrlentry {width} {rl:width} {1}
+ \XMLrlentry {height} {rl:height} {1}
+ \XMLrlentry {comment}{rl:comment}{0}
+\stopXMLRLG
+
+\stopsetups
+
+\endinput
diff --git a/tex/context/base/x-res-10.tex b/tex/context/base/x-res-10.tex
new file mode 100644
index 000000000..f23c50358
--- /dev/null
+++ b/tex/context/base/x-res-10.tex
@@ -0,0 +1,75 @@
+%D \module
+%D [ file=x-fig-10,
+%D version=2003.08.02,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Resource Dummy 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.
+
+\usemodule[res-00]
+
+\defineXMLenvironment [rl:library]
+ {\starttext}
+ {\stoptext}
+
+\defineXMLenvironment [rl:usage]
+ {\bgroup}
+ {\doif{\XMLflush{rl:type}-\XMLflush{rl:state}}{figure-missing}
+ {\doifnot{\XMLflush{rl:file}}{dummy}{\setups[rl:usage]}}
+ \egroup}
+
+\defineXMLsave [rl:type] % figure
+\defineXMLsave [rl:state] % found|missing
+\defineXMLsave [rl:file] % filename
+
+\defineXMLsavecontent [rl:width] {12cm} % width in pt
+\defineXMLsavecontent [rl:height] {9cm} % height in pt
+
+\useMPlibrary
+ [dum]
+
+\setupcolors
+ [state=start]
+
+\defineoverlay
+ [rl:banner]
+ [\setups{rl:banner}]
+
+\startsetups[rl:banner]
+
+ \framed [frame=off,offset=none,align={lohi,middle}]
+ \bgroup
+ \tt \white \XMLflush{rl:file}
+ \egroup
+
+\stopsetups
+
+\startsetups[rl:usage]
+
+ \startTEXpage
+
+ % \externalfigure
+ % [\XMLflush{rl:file}] % goes wrong when file present
+ % [object=no,
+ % backgroundcolor=green,background={foreground,color,rl:banner},
+ % width=\XMLflush{rl:width},
+ % height=\XMLflush{rl:height}]
+
+ \def\figurewidth {\XMLflush{rl:width}}
+ \def\figureheight{\XMLflush{rl:height}}
+
+ \externalfigurereplacement
+ {\XMLflush{rl:file}}
+ {\XMLflush{rl:file}}
+ {\XMLflush{rl:state}}
+
+ \stopTEXpage
+
+\stopsetups
+
+\endinput
diff --git a/tex/context/base/x-res-11.tex b/tex/context/base/x-res-11.tex
new file mode 100644
index 000000000..b8569d22e
--- /dev/null
+++ b/tex/context/base/x-res-11.tex
@@ -0,0 +1,110 @@
+%D \module
+%D [ file=x-fig-11,
+%D version=2003.02.08,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Resource Reporting (3),
+%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.
+
+\usemodule[res-00]
+
+\defineXMLenvironment [rl:library]
+ {\starttext
+ \doiffileelse{\outputfilename.zip}{\setups[rl:attach]}{}
+ \disablemode[rl:used]}
+ {\doifnotmode{rl:used}{No images processed.}
+ \page
+ \stoptext}
+
+\defineXMLenvironment [rl:usage]
+ {\bgroup}
+ {\doifnot{\XMLflush{rl:file}}{dummy}
+ {\setups[rl:usage]
+ \enablemode[rl:used]}
+ \egroup}
+
+\defineXMLsave [rl:base] % base
+\defineXMLsave [rl:type] % figure
+\defineXMLsave [rl:state] % found|missing
+\defineXMLsave [rl:label] % label
+\defineXMLsave [rl:file] % filename
+\defineXMLsave [rl:suffix] % filesuffix
+\defineXMLsave [rl:comment] % text
+\defineXMLsave [rl:width] % width in pt
+\defineXMLsave [rl:height] % height in pt
+\defineXMLsave [rl:page] % page from file
+
+\def\XMLbpentry#1%
+ {\PointsToWholeBigPoints{\XMLflush{#1}}\temp\temp bp}
+
+\def\XMLrlentry#1#2#3%
+ {\tableiftextelse{\XMLflush{#2}}
+ {\NC\bf#1\NC\XMLflush{#2}\doif{#3}{1}{ (\XMLbpentry{#2})}\NC\NR}{}}
+
+\unprotect
+
+\setuplayout[\v!middle]
+
+\startsetups[rl:figure]
+
+ \externalfigure[\XMLflush{rl:file}][\c!width=4cm]
+
+\stopsetups
+
+\startsetups[rl:table]
+
+% by using a dedicated tabulation, we permit usage in dutch interface
+
+\definetabulate[XMLRLG][|lw(4.5em)|p|]
+
+\startXMLRLG
+ \XMLrlentry {base} {rl:base} {0}
+ \XMLrlentry {type} {rl:type} {0}
+ \XMLrlentry {state} {rl:state} {0}
+ \XMLrlentry {file} {rl:file} {0}
+ \XMLrlentry {label} {rl:label} {0}
+ \XMLrlentry {suffix} {rl:suffix} {0}
+ \XMLrlentry {page} {rl:page} {0}
+ \XMLrlentry {width} {rl:width} {1}
+ \XMLrlentry {height} {rl:height} {1}
+ \XMLrlentry {comment}{rl:comment}{0}
+\stopXMLRLG
+
+\stopsetups
+
+\startsetups[rl:usage]
+
+ \startfiguretext {\v!none} {\setups[rl:figure]}
+ \setups[rl:table]
+ \stopfiguretext
+
+\stopsetups
+
+\startsetups[rl:attach]
+
+ \useMPlibrary[nav]
+
+ \setupcolors[\c!state=\v!start]
+
+ \setupinteraction[\c!state=\v!start]
+
+ \useattachment[whatever][\outputfilename.zip]
+
+ \startlocalsetups[rl:attach:button]
+
+ \inframed
+ [\c!offset=\v!overlay,\c!frame=\v!off]
+ {\attachment[whatever]}
+
+ \stoplocalsetups
+
+ \setupfootertexts[archive with dummies: \setups{rl:attach:button}]
+
+\stopsetups
+
+\protect \endinput
diff --git a/tex/context/base/x-res-12.tex b/tex/context/base/x-res-12.tex
new file mode 100644
index 000000000..1cff48717
--- /dev/null
+++ b/tex/context/base/x-res-12.tex
@@ -0,0 +1,53 @@
+%D \module
+%D [ file=x-fig-12,
+%D version=2005.05.05,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Resource Checking,
+%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 dimension checking using \RLXTOOLS.
+
+\unprotect
+
+\chardef\figurerlxmode\plusone % rlx permitted
+
+\startXMLmapping[rli]
+ \defineXMLprocess[rl:identify]
+ \defineXMLsavecontent[rl:width] {\!!zeropoint}
+ \defineXMLsavecontent[rl:height]{\!!zeropoint}
+\stopXMLmapping
+
+\def\doanalyzefiguredimensionsrlx
+ {\ifcase\figurestatus \ifcase\figurerlxmode \else
+ \doifnotfile{\wantedfigurefullname.rli}
+ {% let's try runtime running first
+ \doshowfiguremessage6\wantedfigurefullname
+ \executesystemcommand{texmfstart rlxtools --identify \wantedfigurefullname}}%
+ \doifnotfile{\wantedfigurefullname.rli}
+ {% we assume that runtime running failed
+ \doshowfiguremessage6\wantedfigurefullname
+ \installprogram{texmfstart rlxtools --identify \wantedfigurefullname}}%
+ \doiffile{\wantedfigurefullname.rli}
+ {\global\let\analyzedfigurewidth \!!zeropoint
+ \global\let\analyzedfigureheight\!!zeropoint
+ \startnointerference % groups
+ \startXMLmapping[rli]%
+ \startXMLignore
+ \processXMLfile{\wantedfigurefullname.rli}%
+ \xdef\analyzedfigurewidth {\the\dimexpr\XMLflush{rl:width} \relax}% turn whatever into pt
+ \xdef\analyzedfigureheight{\the\dimexpr\XMLflush{rl:height}\relax}% turn whatever into pt
+ \stopXMLignore
+ \stopXMLmapping
+ \stopnointerference
+ \setanalyzedfiguredimensions\!!twelve}%
+ \fi\fi}
+
+\let\doanalyzefiguredimensionsexternal\doanalyzefiguredimensionsrlx
+
+\protect \endinput
diff --git a/tex/context/base/x-res-20.tex b/tex/context/base/x-res-20.tex
new file mode 100644
index 000000000..3ff069ffd
--- /dev/null
+++ b/tex/context/base/x-res-20.tex
@@ -0,0 +1,231 @@
+%D \module
+%D [ file=x-res-20,
+%D version=2006.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Lists,
+%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 For the beginning we have used \TEXUTIL\ to hels us deal with
+%D graphics whose dimensions could not be determines and|/|or to
+%D provide placeholder info for graphics that were not available.
+%D Much of this functionality is now moved to \RLXTOOLS\ and
+%D therefore it makes sense to reimplement the code that deals with
+%D producing an overview of grapghics as well. At the same time we
+%D move some \TEX\ code from \TEXEXEC\ to here.
+%D
+%D Because the show commands are not used in real documents, but
+%D only for special purposed, it does not harm that this
+%D functionality is now part of a module. We no longer use the
+%D parsing code in \TEXUTIL, but rely on \IMAGEMAGICK's
+%D identify functionility.
+%D
+%D At the end of the file we kept the old code from \type {core-fig}.
+
+\unprotect
+
+\startXMLmapping[rlx:list]
+
+ \defineXMLprocess
+ [rl:identification]
+
+ \defineXMLenvironment
+ [rl:identify] [name=]
+ {\bgroup\ignorespaces}
+ {\removeunwantedspaces\doRLhandlegraphic\egroup}
+
+ \defineXMLsave[rl:size]
+ \defineXMLsave[rl:path]
+ \defineXMLsave[rl:width]
+ \defineXMLsave[rl:height]
+
+\stopXMLmapping
+
+\def\showexternalfigures
+ {\dosingleempty\doshowexternalfigures}
+
+\let\doRLhandlegraphic\relax
+\let\doRLstartgraphics\relax
+\let\doRLstopgraphics \relax
+
+\let\RLfigurewidth \empty
+\let\RLfigureheight\empty
+\let\RLfiguresize \empty
+\let\RLfigurefile \empty
+
+\def\doRLpresetgraphic
+ {\edef\RLfigurewidth {\the\dimexpr \XMLflush{rl:width}\relax}%
+ \edef\RLfigureheight{\the\dimexpr \XMLflush{rl:height}\relax}%
+ \edef\RLfiguresize {\the\numexpr0\XMLflush{rl:size}\relax}%
+ \edef\RLfigurefile {\XMLpar{rl:identify}{name}{unknown}}}
+
+\def\doshowexternalfigures[#1]%
+ {\bgroup
+ \dontcomplain
+ \setupcolors[\c!state=\v!start]% to prevent mps color conversion
+ \getparameters[\??ex][\c!file=rlxtools.rli,\c!alternative=a,\c!offset=\!!zeropoint,\c!size=,#1]%
+ \getvalue{\strippedcsname\doRLhandlegraphic\@@exalternative}%
+ \startXMLmapping[rlx:list]%
+ \startXMLignore
+ \doRLstartgraphics
+ \processXMLfilegrouped{\@@exfile}% \readjobfile\@@exfile\donothing\donothing
+ \doRLstopgraphics
+ \stopXMLignore
+ \stopXMLmapping
+ \egroup}
+
+\def\doRLhandlegraphica
+ {\def\doRLhandlegraphic
+ {\doRLpresetgraphic
+ \getvalue{\e!start\v!figure\e!text}[\v!left,\v!none][]
+ {}
+ {\hbox
+ {\externalfigure[\RLfigurefile][\c!frame=\v!on,\c!width=6cm,\c!size=\@@exsize]%
+ \quad
+ \framed[\c!width=\figurewidth,\c!height=\figureheight]{}%
+ \quad}}%
+ {\hbox{\tt\tfa\setstrut\strut\expanded{\asciistr{\RLfigurefile}}}}%
+ \blank
+ \tfx
+ \starttabulate[|l|l|]
+ \NC width \EQ \RLfigurewidth \NC \NR
+ \NC height \EQ \RLfigureheight \NC \NR
+ \NC size \EQ \RLfiguresize \NC \NR
+ \stoptabulate
+ \getvalue{\e!stop\v!figure\e!text}}}
+
+\def\doRLhandlegraphicb
+ {\def\doRLhandlegraphic
+ {\dontleavehmode
+ \vbox
+ {\doRLpresetgraphic
+ \hsize\dimexpr.2\hsize-.8em\relax
+ \cbox{\externalfigure[\RLfigurefile][\c!frame=\v!on,\c!factor=\v!max,\c!width=\hsize,\c!size=\@@exsize]}%
+ \vskip.5\lineheight
+ \midaligned{\tttf\RLfigurefile}}%
+ \vadjust{\vskip.2\lineheight}%
+ \quad\allowbreak}}
+
+\def\doRLhandlegraphicc
+ {\def\doRLhandlegraphic
+ {\doRLpresetgraphic
+ \pagefigure[\RLfigurefile]}}
+
+\def\doRLhandlegraphicd % this one builds a dimension file for metapost/metafun
+ {\def\doRLstartgraphics
+ {\immediate\openout\scratchwrite=mpfigs.mp\relax
+ \immediate\write\scratchwrite{\letterpercent\space graphic dimension file for metapost/metafun}}%
+ \def\doRLstopgraphics
+ {\immediate\closeout\scratchwrite}%
+ \def\doRLhandlegraphic
+ {\doRLpresetgraphic
+ \immediate\write\scratchwrite{registerfigure("\RLfigurefile",\RLfigurewidth,\RLfigureheight);}}}
+
+% \showexternalfigures[alternative=b]
+
+\protect \endinput
+
+%D Old code:
+
+\def\doshowexternalfigures[#1]%
+ {\bgroup
+ \setupcolors[\c!state=\v!start]% to prevent mps color conversion
+ \getparameters[\??ex][\c!alternative=a,\c!offset=\!!zeropoint,\c!size=,#1]%
+ \getvalue{\strippedcsname\showexternalfigure\@@exalternative}%
+ \egroup}
+
+\def\showexternalfigures
+ {\dosingleempty\doshowexternalfigures}
+
+\def\showexternalfigurea
+ {\bgroup
+ \dontcomplain
+ \def\presetfigure[##1][##2]%
+ {\getvalue{\e!start\v!figure\e!text}[\v!left,\v!none][]
+ {}
+ {\hbox
+ {\externalfigure[##1][\c!frame=\v!on,\c!width=6cm,\c!size=\@@exsize][##2]%
+ \tfskip
+ \framed[\c!width=\figurewidth,\c!height=\figureheight]{}}}%
+ {\tt\tfa\expanded{\asciistr{##1}}}%
+ \blank
+ \tfx
+ \def\docommand####1%
+ {\beforesplitstring####1\at=\to\asciia
+ \aftersplitstring ####1\at=\to\asciib
+ \defconvertedcommand\asciib\asciib
+ \doifsomething\asciib
+ {\hsmash{\hbox to .75em{\asciia\hss}: \asciib}\endgraf}}%
+ \processcommalist[##2]\docommand
+ \strut
+ \endgraf
+ \getvalue{\e!stop\v!figure\e!text}}%
+ \pushendofline
+ \readjobfile\@@exfile\donothing\donothing
+ \popendofline
+ \egroup}
+
+\def\showexternalfigureb % instelbaar maken
+ {\bgroup
+ \def\total{5}%
+ \globalletempty\allfigures
+ \doglobal\newcounter\figurecounter
+ \dontcomplain
+ \def\docommand##1{##1&}%
+ \def\figurecaptions%
+ {\crcr
+ \noalign{\nobreak\vskip.5em}%
+ \@EA\globalprocesscommalist\@EA[\allfigures]\docommand
+ \globalletempty\allfigures
+ \crcr
+ \noalign{\vskip1em\goodbreak}}%
+ \def\presetfigure[##1][##2]%
+ {\vbox
+ {\divide\hsize \total
+ \advance\hsize -1em
+ \externalfigure
+ [##1]
+ [\c!frame=\v!on,\c!factor=\v!max,\c!width=\hsize,\c!size=\@@exsize][##2]}%
+ \doglobal\addtocommalist{##1}\allfigures
+ %\getvalue{\s!figurepreset}%
+ \doglobal\increment\figurecounter
+ \ifnum\figurecounter=\total
+ \doglobal\newcounter\figurecounter
+ \def\next{\figurecaptions}%
+ \else
+ \def\next{&}%
+ \fi
+ \next}%
+ \pushendofline
+ \tabskip\zeropoint \!!plus 1fill
+ \halign to \hsize
+ {&\hss##\hss\cr\readjobfile\@@exfile\donothing\donothing\crcr
+ \figurecaptions}
+ \popendofline
+ \egroup}
+
+\def\showexternalfigurec
+ {\bgroup
+ \def\presetfigure[##1][##2]{\expanded{\pagefigure[##1][\c!size=\@@exsize]}}% else loop
+ \pushendofline
+ \readjobfile\@@exfile\donothing\donothing
+ \popendofline
+ \egroup}
+
+\def\showexternalfigured % to be documented; this one builds a dimension file for
+ {\bgroup % metapost/metafun
+ \immediate\openout\scratchwrite=mpfigs.mp
+ \def\presetfigure[##1][##2]%
+ {\getfiguredimensionsonly[##1]% \pagefigure[##1]%
+ \immediate\write\scratchwrite
+ {registerfigure("##1",\figurewidth,\figureheight);}}
+ \pushendofline
+ \readjobfile\@@exfile\donothing\donothing
+ \popendofline
+ \immediate\closeout\scratchwrite
+ \egroup}
diff --git a/tex/context/base/x-res-50.tex b/tex/context/base/x-res-50.tex
new file mode 100644
index 000000000..382256fd4
--- /dev/null
+++ b/tex/context/base/x-res-50.tex
@@ -0,0 +1,425 @@
+%D \module
+%D [ file=x-res-50,
+%D version=2004.02.18,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Multimedia Presentation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={\PRAGMA\ / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is a preliminary module, using a preliminary xml media format that
+%D looks as follows (record is embedded in resource library element):
+%D
+%D \starttyping
+%D <rl:mediaclip label="sample 1">
+%D <rl:name>Sample One</rl:name>
+%D <rl:mime>application/x-shockwave-flash</rl:mime>
+%D <rl:file>http://localhost/mb.swf</rl:file>
+%D <rl:width>8cm</rl:width>
+%D <rl:height>6cm</rl:height>
+%D <rl:text>Nothing special to be said.</rl:text>
+%D <rl:picture>cow.pdf</rl:picture>
+%D </rl:mediaclip>
+%D
+%D <rl:mediaclip label="sample 2">
+%D <rl:name>Sample Two</rl:name>
+%D <rl:mime>audio/mpeg</rl:mime>
+%D <rl:file>mb.mp3</rl:file>
+%D <rl:picture>mb.jpg</rl:picture>
+%D </rl:mediaclip>
+%D \stoptyping
+%D
+%D \starttyping
+%D texexec --pdf --use=med-show yourfile.xml
+%D \stoptyping
+%D
+%D Bonus:
+%D
+%D \starttyping
+%D --arg="url=http://localhost:8881/e:/media"
+%D \stoptyping
+
+% output=pdftex
+
+% bugs in recognizing embedded stream cq. player
+% bugs in layers + hide/vide
+% bugs in save javascripts
+% bugs all over the place
+
+% in principe kan menu overal hetzelfde zijn als we via JS per pagina de clip var zetten,
+% hoewel, misschien zal het menu gaan afhangen van de soort clip
+
+% property (eigenschap) aan framed en layer
+
+\usemodule[meta-dum] \usemodule[contml] \autoXMLnamespace [context]
+
+\doifelsevariable{environment}{url}
+ {\setvariables[mediaclip][url=\getvariable{environment}{url}/]}
+ {\setvariables[mediaclip][url=]}
+
+\startmode [silent]
+
+ \setvariables[mediaclip:option][start=]
+
+\stopmode
+
+\startnotmode [silent]
+
+ \setvariables[mediaclip:option][start=auto]
+
+\stopnotmode
+
+\chardef\XMLtokensreduction=1 \dontcomplain % \showframe \pdfcompresslevel=0
+
+\setuppapersize
+ [S6][S6]
+
+\definemeasure [GapSize] [\dimexpr( 15pt)]
+\definemeasure [EdgeWidth] [\dimexpr(100pt)]
+\definemeasure [TextWidth] [\dimexpr(.5\textwidth)]
+\definemeasure [RenderingWidth] [\dimexpr(\textwidth)]
+\definemeasure [RenderingHeight] [\dimexpr(\textheight)]
+
+% \XMLflush{rl:ratio}\dimexpr(.75\textwidth),
+
+\setuplayout
+ [backspace=\measure{GapSize},
+ topspace=\measure{GapSize},
+ header=0pt,
+ footer=0pt,
+ margin=0pt,
+ edgedistance=2\measure{GapSize},
+ rightedge=\measure{EdgeWidth},
+ bottomdistance=2\measure{GapSize},
+ bottom=2\measure{GapSize},
+ height=fit,
+ width=fit]
+
+\setupinteraction
+ [state=start,
+ color=lightgray,
+ contrastcolor=lightgray,
+ openaction=PresetFields,
+ closeaction=ForgetChanges,
+ menu=on,
+ click=no]
+
+\setupinteractionscreen
+ [option=max]
+
+\setupcolors
+ [state=start]
+
+\usetypescript
+ [palatino][texnansi]
+
+\setupbodyfont
+ [palatino]
+
+\definecolor[darkgray] [s=.2]
+\definecolor[mediumgray][s=.5]
+\definecolor[lightgray] [s=.8]
+\definecolor[transgray] [s=1,t=.9,a=1]
+
+\setupbackgrounds
+ [page]
+ [backgroundoffset=\measure{GapSize},
+ background={color,pagebutton},
+ backgroundcolor=black]
+
+\definelayer
+ [main]
+ [width=\textwidth,
+ height=\textheight]
+
+\definelayer
+ [extra]
+ [width=\rightedgewidth,
+ height=\bottomheight]
+
+\setupbackgrounds
+ [text]
+ [backgroundoffset=0pt,
+ background=main]
+
+\setupbackgrounds
+ [bottom][rightedge]
+ [backgroundoffset=0pt,
+ background=extra]
+
+% java scripts
+
+\startJSpreamble {handy} used now
+
+ function ForgetChanges ()
+ { this.dirty = false }
+
+ function PresetFields ()
+ { this.syncAnnotScan() }
+
+\stopJSpreamble
+
+\definereference[PresetFields] [JS(PresetFields)]
+\definereference[ForgetChanges][JS(ForgetChanges)]
+
+% layers
+
+\defineproperty [menulayer] [layer] [title=menulayer]
+\defineproperty [textlayer] [layer] [title=textlayer,state=stop]
+\defineproperty [datalayer] [layer] [title=datalayer,state=stop]
+
+\setupfield
+ [rollbutton]
+ [fieldlayer=menulayer]
+
+\setupfield
+ [rollbutton]
+ [option=auto]
+
+\definepalet
+ [rollover]
+ [n=darkgray,
+ r=lightgray,
+ d=darkgray]
+
+% list
+
+\definelist
+ [clips]
+ [expansion=yes,
+ criterium=text,
+ alternative=f]
+
+% navigation
+
+\defineoverlay[pagebutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer},ToggleLayer{menulayer}}]
+\defineoverlay[textbutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer}}]
+\defineoverlay[databutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer}}]
+
+% clips
+
+\defineXMLenvironment
+ [rl:mediaclip]
+ {\setups[mediaclip:start]}
+ {\setups[mediaclip:stop]}
+
+\newcounter\MediaClip
+
+\startsetups[mediaclip:start]
+
+ \bgroup \startXMLignore
+
+ % no \startstandardmakeup here since we need the dsta in the menuconstruction
+
+ \defineXMLsave [rl:name]
+ \defineXMLsave [rl:visualization]
+ \defineXMLsave [rl:file]
+ \defineXMLsave [rl:mime]
+ \defineXMLsave [rl:picture] [backgroundcolor=lightgray]
+
+ \defineXMLsavecontent [rl:text] {No additional info.}
+ \defineXMLsavecontent [rl:width] {\measure{RenderingWidth}}
+ \defineXMLsavecontent [rl:height] {\measure{RenderingHeight}}
+ \defineXMLsavecontent [rl:aspect] {1}
+
+\stopsetups
+
+\startsetups[mediaclip:stop]
+
+ \startstandardmakeup
+
+ \doifXMLdataelse{rl:file}
+ {\setups[mediaclip:file:yes]}
+ {}
+
+ \doifXMLdataelse{rl:picture}
+ {\doifelse{\XMLflush{rl:picture}}{self}
+ {\setups[mediaclip:picture:self]}
+ {\setups[mediaclip:picture:yes]}}
+ {\setups[mediaclip:picture:no]}
+
+ \doifXMLdata{rl:text}
+ {\setups[mediaclip:text]}
+
+ \setlayerframed
+ [extra]
+ [preset=rightbottom]
+ [frame=off,offset=overlay,width=fit,background=databutton,align=left]
+ {\startproperty[datalayer]\setups[mediaclip:data]\stopproperty}
+
+ \doifXMLdataelse{rl:name}
+ {\writetolist[clips]{}{\XMLflush{rl:name}}}
+ {\writetolist[clips]{}{\XMLpar{rl:mediaclip}{label}{unknown}}}
+
+ \stopstandardmakeup
+
+ \stopXMLignore \egroup
+
+\stopsetups
+
+\setuptabulate
+ [before=,
+ after=]
+
+\def\rlCleanupFileName#1%
+ {\bgroup
+ \def\cleanup##1##2{\ifnum##1##2=20 \space\else\char\octnumber{##1##2}\fi}%
+ \defineactivecharacter 37 {\cleanup}%
+ \scantokens{#1}%
+ \egroup}
+
+\startsetups[mediaclip:data]
+
+ \noindent \buttonframed
+ [framecolor=lightgray,
+ foregroundcolor=lightgray]
+ {\bf\expanded{\rlCleanupFileName{\XMLflush{rl:file}}}}
+
+ \vskip.75\measure{GapSize}
+
+ \noindent \buttonframed
+ [framecolor=lightgray,
+ foregroundcolor=lightgray]
+ {\bf\XMLflush{rl:mime}}
+
+\stopsetups
+
+\startsetups[mediaclip:picture:self]
+
+ \definerenderingwindow
+ [mediaclip]
+ [width=\XMLflush{rl:width},
+ height=\XMLflush{rl:height},
+ frame=off,
+ openpageaction=StartCurrentRendering,
+ closepageaction=StopCurrentRendering]
+
+ \setlayer
+ [main]
+ {\placerenderingwindow[mediaclip][mediaclip-\MediaClip]}
+
+\stopsetups
+
+\startsetups[mediaclip:picture:yes]
+
+ \setlayer
+ [main]
+ {\externalfigure
+ [\XMLflush{rl:picture}]
+ [background=color,
+ backgroundcolor=\XMLpar{rl:picture}{backgroundcolor}{lightgray},
+ factor=max,
+ width=\XMLflush{rl:width},
+ height=\XMLflush{rl:height}]}
+
+\stopsetups
+
+\startsetups[mediaclip:picture:no]
+
+ \setlayer
+ [main]
+ {\externalfigure
+ [dummy]
+ [width=\XMLflush{rl:width},
+ height=\XMLflush{rl:height}]}
+
+\stopsetups
+
+\startsetups[mediaclip:file:yes]
+
+ \doglobal\increment\MediaClip
+
+ \useexternalrendering
+ [mediaclip-\MediaClip]
+ [\XMLflush{rl:mime}]
+ [\getvariable{mediaclip}{url}\XMLflush{rl:file}]
+ [\getvariable{mediaclip:option}{start}]
+
+\stopsetups
+
+\defineinteractionmenu
+ [navigation] [right]
+
+\defineinteractionmenu
+ [control] [bottom]
+
+\setupinteractionmenu
+ [navigation,control]
+ [state=start,
+ frame=on,
+ middle=\hskip.5\measure{GapSize},
+ inbetween=\vskip.5\measure{GapSize}]
+
+\setupinteractionmenu
+ [right,bottom]
+ [distance=overlay]
+
+\startinteractionmenu [navigation]
+ \rob [HideLayer{textlayer},FirstPage] First Page \\
+ \rob [HideLayer{textlayer},PreviousPage] Previous Page \\
+ \rob [HideLayer{textlayer},NextPage] Next Page \\
+ \rob [HideLayer{textlayer},LastPage] Last Page \\
+ \rob [HideLayer{textlayer},clips] List Of Clips \\
+ \rob [ForgetChanges,CloseDocument] Close Document \\
+\stopinteractionmenu
+
+\startinteractionmenu [control]
+ \rob [StartRendering{mediaclip-\MediaClip}] Start \\
+ \rob [StopRendering{mediaclip-\MediaClip}] Stop \\
+ \rob [PauseRendering{mediaclip-\MediaClip}] Pause \\
+ \rob [ResumeRendering{mediaclip-\MediaClip}] Resume \\
+ \rob [ToggleLayer{datalayer}] Info \\
+ \doifXMLdata{rl:text}{\rob [HideLayer{datalayer},ToggleLayer{textlayer}] Text \\}
+\stopinteractionmenu
+
+\startsetups[mediaclip:text]
+
+ \setlayer
+ [extra]
+ [preset=rightbottom]
+ {\startproperty[textlayer]
+ \framed
+ [align=normal,
+ frame=off,
+ width=\measure{TextWidth},
+ foregroundcolor=darkgray,
+ background={color,textbutton},
+ backgroundcolor=lightgray]
+ {\XMLflush{rl:text}}
+ \stopproperty}
+
+\stopsetups
+
+\setupcolors[textcolor=lightgray]
+
+\startsetups [library:start]
+
+ \starttext
+
+ \setupinteractionmenu[control][state=stop]
+
+ \title[clips]{List of Media Clips}
+
+ \placelist[clips] \page
+
+ \setupinteractionmenu[control][state=start]
+
+\stopsetups
+
+\startsetups [library:stop]
+
+ \stoptext
+
+\stopsetups
+
+\defineXMLenvironment [rl:resourcelibrary]
+ {\setups[library:start]}
+ {\setups[library:stop]}
+
+\doifelsenothing{\inputfilename}
+ {\processXMLfile{mediaclient.xml}}
+ {\processXMLfile{\inputfilename}}
diff --git a/tex/context/base/x-sch-00.tex b/tex/context/base/x-sch-00.tex
new file mode 100644
index 000000000..379d19cf2
--- /dev/null
+++ b/tex/context/base/x-sch-00.tex
@@ -0,0 +1,382 @@
+%D \module
+%D [ file=x-sch-00,
+%D version=2001.10.02,
+%D title=\CONTEXT\ Style File,
+%D subtitle=XML Schema Basics,
+%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 Schema support was implemented right after euro\TeX\ 2001,
+%D when Tobias Burnus send me a schema for the XML figure
+%D base. Since it happened that I needed schemata for other
+%D projects too, I wrote this mapper. Thanks to Tobias for
+%D testing it.
+
+\newcounter\XSDprefix
+\newif\ifXDScomposite
+
+\definelist [xsd:names]
+\defineregister [xsd:index] [xsd:indices]
+
+\setuplist [xsd:names] [expansion=yes]
+\setupregister [xsd:index] [expansion=yes]
+
+\def\dodoXSDkeyval#1#2#3%
+ {\framed
+ [width=\hsize,background=color,backgroundcolor=xsd:0,
+ framecolor=xsd:0,frame=off,align=right]
+ {\hbox to 5em % %to 8em % .2\hsize
+ {\bf
+ %\doifsomething{#1}{#1 }
+ \ignorespaces#2\unskip\hss}
+ %\ignorespaces#2\unskip:}%
+ \space
+ \ignorespaces#3\unskip}}
+
+\def\doXSDkeyval#1#2#3#4%
+ {\bgroup
+ \edef\XSDtemp{\XMLpar{#3}{#4}{}}%
+ \doifsomething{\XSDtemp}
+ {\def\doXSDtemp{\dodoXSDkeyval{#1}{#2}{\XSDtemp}}%
+ \def\doXSDtype{\dodoXSDkeyval{#1}{#2}{\XMLtyp{#3}{#4}{}}}%
+ \setupinteraction[color=,contrastcolor=,style=]%
+ \processaction
+ [#4]
+ [ value=>\doXSDtype,
+ name=>{\writetolist[xsd:names]{}{\XSDtemp}%
+ \writetoregister[xsd:index]{\XSDtemp}%
+ \ifXDScomposite \else
+ \pagereference[xsd:\XSDprefix:\XSDtemp]%
+ \fi
+ \doXSDtemp},
+ type=>{\doifinstringelse{xsd:}{\XSDtemp}
+ {\doXSDtemp}
+ {\gotobox{\doXSDtemp}[xsd:\XSDprefix:\XSDtemp]}},
+ ref=>{\doifinstringelse{xsd:}{\XSDtemp}
+ {\doXSDtemp}
+ {\gotobox{\doXSDtemp}[xsd:\XSDprefix:\XSDtemp]}},
+ unknown=>\doXSDtemp]}%
+ \endgraf
+ \egroup}
+
+\def\doXSDkeyvals#1#2#3%
+ {\def\docommand##1{\doXSDkeyval{#1}{##1}{#2}{##1}}%
+ \processcommalist[#3]\docommand}
+
+\def\dodoXSDbanner#1%
+ {\framed
+ [width=\hsize,framecolor=xsd:0,frame=off,
+ background=color,backgroundcolor=xsd:0]
+ {\ignorespaces#1\unskip}}
+
+\def\doXSDtitle#1#2#3%
+ {\edef\XSDtemp{\XMLpar{#2}{#3}{}}%
+ \dodoXSDbanner
+ {{\bf\ignorespaces#1\unskip}%
+ \doifsomething{\XSDtemp}
+ {:\space\ignorespaces\XSDtemp\unskip
+ \pagereference[xsd:\XSDprefix:\XSDtemp]}}}
+
+\def\doXSDbanner#1%
+ {\dodoXSDbanner{\bf#1}}
+
+%D We use colored backgrounds for meaningful blocks.
+
+\definecolor [xsd:0] [white]
+
+\definecolor [xsd:1] [s=.30]
+\definecolor [xsd:2] [s=.55]
+\definecolor [xsd:3] [s=.70]
+\definecolor [xsd:4] [s=.85]
+
+\definecolor [xsd:5] [r=.6,g=.7,b=.8]
+\definecolor [xsd:6] [r=.7,g=.8,b=.6]
+\definecolor [xsd:7] [r=1,g=1,b=.6]
+\definecolor [xsd:8] [r=.8,g=.7,b=.6]
+
+\defineframedtext [XSDannotation] [backgroundcolor=xsd:0]
+
+\defineframedtext [XSDelement] [backgroundcolor=xsd:5]
+\defineframedtext [XSDattribute] [backgroundcolor=xsd:6]
+\defineframedtext [XSDsimpleType] [backgroundcolor=xsd:7]
+\defineframedtext [XSDcomplexType] [backgroundcolor=xsd:8]
+
+\defineframedtext [XSDcomplexContent] [backgroundcolor=xsd:1]
+\defineframedtext [XSDsimpleContent] [backgroundcolor=xsd:1]
+\defineframedtext [XSDattributeGroup] [backgroundcolor=xsd:1]
+
+\defineframedtext [XSDcapsule] [backgroundcolor=xsd:2]
+\defineframedtext [XSDsequence] [backgroundcolor=xsd:3]
+
+\def\XDSstructures% handy for external settings
+ {XSDannotation,
+ XSDcomplexType,XSDsimpleType,XSDelement,XSDattribute,
+ XSDcomplexContent,XSDsimpleContent,XSDattributeGroup,
+ XSDcapsule,XSDsequence}
+
+\setupframedtexts
+ [\XDSstructures]
+ [width=\hsize,
+ offset=.5\bodyfontsize,
+ location=none,
+ background=color,
+ framecolor=xsd:0,
+ before=\ifinframed\else\blank\fi,
+ after=\ifinframed\else\blank\fi,
+ depthcorrection=off,
+ rulethickness=1pt,
+ strut=no]
+
+\definesymbol[xsd][{\blackrule[width=4em]}]
+
+\def\placeXSDlegenda
+ {\startbaselinecorrection
+ \starttabulate[|l|l|]
+ \HL
+ \NC \bf color \NC \bf meaning \NC \NR
+ \HL
+ \NC \color[xsd:1]{\symbol[xsd]} \NC complexContent \unskip\quad
+ simpleContent \unskip\quad
+ attributeGroup \NC \NR
+ \NC \color[xsd:2]{\symbol[xsd]} \NC capsule \NC \NR
+ \NC \color[xsd:3]{\symbol[xsd]} \NC sequence \NC \NR
+ \HL
+ \NC \color[xsd:5]{\symbol[xsd]} \NC element \NC \NR
+ \NC \color[xsd:6]{\symbol[xsd]} \NC attribute \NC \NR
+ \NC \color[xsd:7]{\symbol[xsd]} \NC simpleType \NC \NR
+ \NC \color[xsd:8]{\symbol[xsd]} \NC complexType \NC \NR
+ \HL
+ \stoptabulate
+ \stopbaselinecorrection}
+
+\defineXMLenvironment [xsd:all] [id=]
+ {\startXSDcapsule
+ \doXSDbanner{all}
+ \doXSDkeyvals{all}{xsd:all}{id}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:annotation]
+ {\startXSDcapsule
+ \doXSDbanner{annotation}
+ \startXSDannotation}
+ {\stopXSDannotation
+ \stopXSDcapsule}
+
+\defineXMLignore [xsd:appInfo]
+
+\defineXMLenvironment [xsd:attribute]
+ [id=,name=,ref=,type=,form=,use=,value=]
+ {\startXSDattribute
+ \doifelsenothing{\XMLpar{xsd:attribute}{ref}{}}
+ {\doXSDkeyvals{attribute}{xsd:attribute}{name,type}}
+ {\doXSDkeyvals{attribute}{xsd:attribute}{ref}}
+ \doXSDkeyvals{attribute}{xsd:attribute}{id,form,use,value}
+ \XDScompositetrue}
+ {\stopXSDattribute}
+
+\defineXMLenvironment [xsd:attributeGroup] [id=,name=,ref=]
+ {\startXSDattributeGroup
+ \doXSDtitle{attribute group}{xsd:attributeGroup}{name}
+ \doXSDkeyvals{attr group}{xsd:attributeGroup}{id,name,ref}
+ \XDScompositetrue}
+ {\stopXSDattributeGroup}
+
+\defineXMLenvironment [xsd:choice] [id=,minOccurs=,maxOccurs=]
+ {\startXSDcapsule
+ \doXSDbanner{choice}
+ \doXSDkeyvals{choice}{xsd:choice}{id,minOccurs,maxOccurs}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:complexContent] [id=,mixed=]
+ {\startXSDcomplexContent
+ \doXSDkeyvals{complex content}{xsd:complexContent}{id,mixed}
+ \XDScompositetrue}
+ {\stopXSDcomplexContent}
+
+\defineXMLenvironment [xsd:complexType]
+ [id=,abstract=,block=,final=,mixed=,name=]
+ {\startXSDcomplexType
+ \doXSDtitle{complex type}{xsd:complexType}{name}
+ \doXSDkeyvals{complex type}{xsd:complexType}{id,abstract,block,final,mixed}
+ \XDScompositetrue}
+ {\stopXSDcomplexType}
+
+\defineXMLenvironment [xsd:documentation] [source=,xml:lang=]
+ {\endgraf\bgroup\setupwhitespace[big]}
+ {\endgraf\egroup}
+
+\defineXMLenvironment [xsd:element]
+ [name=,type=,ref=,
+ abstract=,block=,default=,final=,fixed=,form=,id=,
+ minOccurs=,maxOccurs=,nullable=,substitutionGroup=]
+ {\startXSDelement
+ \doifelsenothing{\XMLpar{xsd:element}{ref}{}}
+ {\doXSDkeyvals{element}{xsd:element}{name,type}}
+ {\doXSDkeyvals{element}{xsd:element}{ref}}
+ \doXSDkeyvals{element}{xsd:element}
+ {id,abstract,block,default,final,fixed,form,
+ minOccurs,maxOccurs,nullable,substitutionGroup}
+ \XDScompositetrue}
+ {\stopXSDelement}
+
+\defineXMLenvironment [xsd:extension] [id=,base=]
+ {\startXSDcapsule
+ \doXSDbanner{extension}
+ \doXSDkeyvals{extension}{xsd:extension}{id,base}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:group]
+ [id=,name=,ref=,minOccurs=,maxOccurs=]
+ {\startXSDcapsule
+ \doXSDbanner{group}
+ \doXSDkeyvals{group}{xsd:group}{id,name,ref,minOccurs,maxOccurs}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:key] [id=,name=]
+ {\startXSDcapsule
+ \doXSDbanner{key}
+ \doXSDkeyvals{key}{xsd:key}{id,name}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:keyref] [id=,name=,refer=]
+ {\startXSDcapsule
+ \doXSDbanner{keyref}
+ \doXSDkeyvals{key ref}{xsd:keyref}{id,name,refer}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:list] [id=,itemType=]
+ {\startXSDcapsule
+ \doXSDbanner{list}
+ \doXSDkeyvals{list}{xsd:list}{id,itemType}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:redefine] [schemaLocation=]
+ {\startXSDcapsule
+ \doXSDbanner{redefine}
+ \doXSDkeyvals{redefine}{xsd:redefine}{schemaLocation}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:restriction] [id=,base=]
+ {\startXSDcapsule
+ \doXSDbanner{restriction}
+ \doXSDkeyvals{restriction}{xsd:restriction}{id,base}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:schema]
+ [attributeFormDefault=,blockDefault=,elementFormDefault=,
+ finalDefault=,id=,targetNamespace=,version=]
+ {\startXSDcapsule
+ \doglobal\increment\XSDprefix
+ \doXSDbanner{schema}
+ \doXSDkeyvals{schema}{xsd:schema}
+ {attributeFormDefault,blockDefault,elementFormDefault,
+ finalDefault,id,targetNamespace,version}
+ \stopXSDcapsule}
+ {}
+
+\defineXMLenvironment [xsd:sequence] [id=,minOccurs=,maxOccurs=]
+ {\startXSDsequence
+ \doXSDbanner{sequence}
+ \doXSDkeyvals{sequence}{xsd:sequence}{id,minOccurs,maxOccurs}
+ \XDScompositetrue}
+ {\stopXSDsequence}
+
+\defineXMLenvironment [xsd:simpleContent] [id=]
+ {\startXSDsimpleContent
+ \doXSDkeyvals{simple content}{xsd:simpleContent}{id}
+ \XDScompositetrue}
+ {\stopXSDsimpleContent}
+
+\defineXMLenvironment [xsd:simpleType] [id=,name=]
+ {\startXSDsimpleType
+ \doXSDtitle{simple type}{xsd:simpleType}{name}
+ \doXSDkeyvals{simple type}{xsd:simpleType}{id}
+ \XDScompositetrue}
+ {\stopXSDsimpleType}
+
+\defineXMLenvironment [xsd:union] [id=,memberTypes=]
+ {\startXSDcapsule
+ \doXSDbanner{union}
+ \doXSDkeyvals{union}{xsd:union}{id,memberTypes}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\defineXMLenvironment [xsd:unique] [id=,name=]
+ {\startXSDcapsule
+ \doXSDbanner{unique}
+ \doXSDkeyvals{unique}{xsd:unique}{id,name}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+
+\def\defineXSDfacet
+ {\dotripleempty\dodefineXSDfacet}
+
+\def\dodefineXSDfacet[#1][#2][#3]%
+ {\defineXMLenvironment[xsd:#1][#2]
+ {\startXSDcapsule
+ \doXSDkeyvals{#1}{xsd:#1}{#3}
+ \XDScompositetrue}
+ {\stopXSDcapsule}
+ \defineXMLsingular[xsd:#1][#2]
+ {\doXSDkeyvals{#1}{xsd:#1}{#3}}}
+
+\defineXSDfacet [duration] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [encoding] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [enumeration] [id=,value=,fixed=] [id,value,fixed]
+
+\defineXSDfacet [length] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [minLength] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [maxLength] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [minInclusive] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [maxInclusive] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [minExclusive] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [maxExclusive] [id=,value=,fixed=] [id,value,fixed]
+
+\defineXSDfacet [pattern] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [period] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [precision] [id=,value=,fixed=] [id,value,fixed]
+\defineXSDfacet [scale] [id=,value=,fixed=] [id,value,fixed]
+
+\defineXSDfacet [field] [id=,xpath=] [id,xpath]
+\defineXSDfacet [selector] [id=,xpath=] [id,xpath]
+
+\defineXSDfacet
+ [any]
+ [id=,namespace=,minOccurs=,maxOccurs=,processContents=]
+ [id,namespace,minOccurs,maxOccurs,processContent]
+
+\defineXSDfacet
+ [anyAttribute]
+ [id=,namespace=,processContents=]
+ [id,namespace,processContents]
+
+\defineXSDfacet
+ [import]
+ [id=,namespace=,schemaLocation=]
+ [id,namespace,schemaLocation]
+
+\defineXSDfacet
+ [include]
+ [id=,schemaLocation=]
+ [id,schemaLocation]
+
+\defineXSDfacet
+ [notation]
+ [id=,name=,public=,system=]
+ [id,name,public,system]
+
+\endinput
diff --git a/tex/context/base/x-sch-01.tex b/tex/context/base/x-sch-01.tex
new file mode 100644
index 000000000..d72cbf89c
--- /dev/null
+++ b/tex/context/base/x-sch-01.tex
@@ -0,0 +1,122 @@
+%D \module
+%D [ file=x-sch-01,
+%D version=2001.10.04,
+%D title=\CONTEXT\ Style File,
+%D subtitle=XML Schema Presentation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This style wraps around the core schema visualizer,
+%D implemented in \type {x-sch-00}. This is an experimental
+%D style, more will follow.
+%D
+%D \starttyping
+%D texexec --use=sch-01 x-fig-00.xsd --pdf
+%D \stoptyping
+
+\doifnothing {\jobfilename} {\end}
+\doiffileelse {\jobfilename.xsd} {} {\end}
+
+\usemodule[sch-00,con-01]
+
+\remapXMLnamespace [xs] [xsd]
+
+\setuplayout
+ [backspace=1.5cm,
+ topspace=1.5cm,
+ bottomspace=1cm,
+ width=middle,
+ height=middle,
+ header=1.5cm,
+ footer=1.5cm]
+
+\setupcolors
+ [state=start]
+
+\setupbackgrounds
+ [page]
+ [background=goback]
+
+\setupbackgrounds
+ [text]
+ [background=gonext]
+
+\defineoverlay
+ [goback]
+ [\overlaybutton{PreviousJump}]
+
+\defineoverlay
+ [gonext]
+ [\overlaybutton{nextpage}]
+
+\setuppagenumbering
+ [location=footer]
+
+\usetypescript
+ [palatino]
+ [\defaultencoding]
+
+\setupbodyfont
+ [palatino,10pt]
+
+%\setupinteraction
+% [state=start,
+% color=,
+% contrastcolor=,
+% style=]
+
+\setuplist
+ [xsd:names]
+ [interaction=all,
+ width=0pt,
+ alternative=c]
+
+\setupregister
+ [xsd:index]
+ [interaction=text,
+ symbol=none]
+
+\setuphead
+ [chapter]
+ [style=\bfd,
+ header=high]
+
+\setuphead
+ [section]
+ [style=\bfb]
+
+\lowercasestring \jobfilename \to \lcjobfilename
+
+\setupheadertexts
+ [\lcjobfilename]
+
+\starttext
+
+\title{Schema \quote{\lcjobfilename.xsd}}
+
+\subject{Names in order of definition}
+
+\startcolumns[n=3]
+ \placelist[xsd:names][criterium=current]
+\stopcolumns
+
+\subject{Names in alphabetic order}
+
+\startcolumns[n=3]
+ \placeregister[xsd:index][criterium=current]
+\stopcolumns
+
+\subject{Meaning of background colors}
+
+\placeXSDlegenda
+
+\subject{Schema components}
+
+\processXMLfilegrouped{\jobfilename.xsd}
+
+\stoptext
diff --git a/tex/context/base/x-set-01.tex b/tex/context/base/x-set-01.tex
new file mode 100644
index 000000000..75e1d43e2
--- /dev/null
+++ b/tex/context/base/x-set-01.tex
@@ -0,0 +1,79 @@
+%D \module
+%D [ file=x-set-01,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Mappings,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file is obsolete.
+
+\endinput
+
+\unprotect
+
+\def\SETUPnamespace{xmlns:cd="http://www.pragma-ade.com/commands"}
+
+\bgroup \catcode`\<=\@@other
+
+\unexpanded\gdef\dostring#1#2#3%
+ {\immediate\write\scratchwrite{#1<#2cd:#3>}}
+
+\gdef\doline#1%
+ {\immediate\write\scratchwrite{#1}}
+
+\egroup
+
+\def\startsetupfile
+ {\immediate\openout\scratchwrite=keys-\currentlanguage.xml
+ \doline{\string<?xml version="1.0"?>}
+ \doline{}
+ \dostring{}{}{interface \SETUPnamespace\space name="context" language="\currentlanguage" version="\contextversion"}}
+
+\def\stopsetupfile
+ {\doline{}
+ \dostring{}{/}{interface}
+ \immediate\closeout\scratchwrite}
+
+\def\interfacecomponenttoxml#1#2#3%
+ {\doifelse{#3}\nointerfaceobject
+ {\dostring{\space\space\space\space}{}{#1 name="#2" value="#2"/}}
+ {\dostring{\space\space\space\space}{}{#1 name="#2" value="#3"/}}}
+
+\def\setinterfaceconstant{\interfacecomponenttoxml{constant}}
+\def\setinterfacevariable{\interfacecomponenttoxml{variable}}
+\def\setinterfaceelement {\interfacecomponenttoxml{element}}
+\def\setinterfacecommand {\interfacecomponenttoxml{command}}
+
+\def\startinterfacexmlcomponent{\doline{}\dostring{\space\space}{}} % #1
+\def\stopinterfacexmlcomponent {\dostring{\space\space}{/}} % #1
+
+\let\normalstartvariables\startvariables \let\normalstopvariables\stopvariables
+\let\normalstartconstants\startconstants \let\normalstopconstants\stopconstants
+\let\normalstartcommands \startcommands \let\normalstopcommands \stopcommands
+\let\normalstartelements \startelements \let\normalstopelements \stopelements
+
+\def\startvariables{\startinterfacexmlcomponent{variables}\normalstartvariables}
+\def\startconstants{\startinterfacexmlcomponent{constants}\normalstartconstants}
+\def\startcommands {\startinterfacexmlcomponent{commands} \normalstartcommands }
+\def\startelements {\startinterfacexmlcomponent{elements} \normalstartelements }
+
+\def\stopvariables{\stopinterfacexmlcomponent{variables}\normalstopvariables}
+\def\stopconstants{\stopinterfacexmlcomponent{constants}\normalstopconstants}
+\def\stopcommands {\stopinterfacexmlcomponent{commands} \normalstopcommands }
+\def\stopelements {\stopinterfacexmlcomponent{elements} \normalstopelements }
+
+\protect
+
+\starttext
+ \startsetupfile
+ \input mult-con.tex
+ \input mult-com.tex
+ \stopsetupfile
+\stoptext
diff --git a/tex/context/base/x-set-02.tex b/tex/context/base/x-set-02.tex
new file mode 100644
index 000000000..bb0b7583c
--- /dev/null
+++ b/tex/context/base/x-set-02.tex
@@ -0,0 +1,30 @@
+%D \module
+%D [ file=x-set-02,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Mappings,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect \bgroup \catcode`\<=\@@other
+
+\def\setinterfacecomponent#1#2#3%
+ {\setgvalue{\string<#1\string:#2\string>}{#3}}
+
+\gdef\getinterfacecomponent#1#2%
+ {\executeifdefined{\string<#1\string:#2\string>}{#2}}
+
+\def\setinterfaceconstant{\setinterfacecomponent{constant}} % constant
+\def\setinterfacevariable{\setinterfacecomponent{variable}} % variable
+\def\setinterfaceelement {\setinterfacecomponent{string}} % element
+\def\setinterfacecommand {\setinterfacecomponent{string}} % command
+
+\input mult-\userinterfacetag
+
+\egroup \protect \endinput
diff --git a/tex/context/base/x-set-11.mkii b/tex/context/base/x-set-11.mkii
new file mode 100644
index 000000000..450382a95
--- /dev/null
+++ b/tex/context/base/x-set-11.mkii
@@ -0,0 +1,573 @@
+%D \module
+%D [ file=x-set-11,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Definitions,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% module x-set-02 loads the mapping, after that we can say:
+%
+% texmfstart texexec --int=nl --pdf --global --result=setup-nl x-set-12
+
+\usemodule[set-99] % interface messages
+
+\unprotect
+
+% general
+
+\def\setupnumfont {}
+\def\setuptxtfont {}
+\def\setupintfont#1{\uppercase{#1}}
+\def\setupvarfont {\sl}
+\def\setupoptfont {\sl}
+\def\setupalwcolor {}
+\def\setupoptcolor {darkgray}
+
+\defineXMLenvironmentsave [cd:content] [list=,state=]
+ {\simpleSETUPargument{content}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\def\c!setup!internal!#1%
+ {{\setmessagetext{setup}{#1}%
+ \expanded{\setupintfont{\currentmessagetext}}}}
+
+\def\c!setup!text!#1%
+ {{\setmessagetext{setup}{#1}%
+ \setupvarfont{\currentmessagetext}}}
+
+\def\c!setup!command!#1%
+ {{\setupvarfont{\texescape...#1}}}
+
+\def\??stp{@@stp}
+
+\defineregister
+ [texmacro]
+ [texmacros]
+
+\definesorting
+ [texcommand]
+ [texcommands]
+
+\setupsorting
+ [texcommand]
+ [\c!command=\@@stpcommand,
+ \c!criterium=\@@stpcriterium]
+
+\definesorting
+ [eachtexcommand]
+ [alltexcommands]
+
+\setupsorting
+ [eachtexcommand]
+ [\c!command=\@@stpcommand,
+ \c!criterium=\v!all]
+
+\pushmacro\setuptext
+
+\defineframedtext
+ [setuptext]
+ [\c!width=\hsize,
+ \c!height=\v!fit,
+ \c!align=\v!right,
+ \c!offset=0.75em]
+
+\popmacro\setuptext
+
+\newif\ifshortsetup
+
+\def\doshowsetup
+ {\dosingleempty\dodoshowsetup}
+
+\def\dodoshowsetup[#1]%
+ {\iffirstargument
+ \doshowsetup{#1}%
+ \else
+ \expandafter\doshowsetup
+ \fi}
+
+\bgroup \catcode`\<=\active
+
+\gdef\doshowsetup#1%
+ {\bgroup
+ \def<<##1>>{##1}%
+ \edef\ascii{#1}%
+ \enableXML
+ \doifelseXMLelement{stp:\ascii}
+ {\expanded{\flushXMLelement{stp:\ascii}}}
+ {\doifelseXMLelement{stp:\ascii:1}
+ {\expanded{\flushXMLelement{stp:\ascii:1}}}
+ {\defconvertedargument\ascii{#1}%
+ \em unknown setup \quote{\ascii}}}
+ \egroup}
+
+\egroup
+
+\def\setup {\shortsetupfalse\doshowsetup}
+\def\showsetup {\shortsetupfalse\doshowsetup}
+\def\shortsetup{\shortsetuptrue \doshowsetup}
+\def\setupsetup{\dodoubleargument\getparameters[\??stp]}
+
+\setupsetup
+ [\c!before=,
+ \c!after=,
+ \c!command=\setup,
+ \c!criterium=\v!used]
+
+% verwijzing: 0 geen verwijzingen plaatsen / wel genereren
+% 1 alleen bij zie plaatsen / wel genereren
+% 2 alle verwijzingen plaatsen / niet genereren
+% 3 bij zie commando klikken / wel genereren
+
+\setupsetup
+ [\c!reference=0]
+
+\def\placesetup
+ {\bgroup
+ \getvalue{\e!place\e!listof texcommands}%
+ \egroup}
+
+\def\placeallsetups
+ {\bgroup
+ \setupsetup[\c!reference=2]%
+ \setupreferencing[\c!state=\v!stop]%
+ \getvalue{\e!place\e!listof alltexcommands}%
+ \egroup}
+
+\let\placeeverysetup\placeallsetups
+
+\let\plaatssetup \placesetup
+\let\plaatselkesetup\placeallsetups
+
+% we use :1 as fallback
+%
+% \setup{setupinterlinespace}
+% \setup{setupinterlinespace:1}
+% \setup{setupinterlinespace:2}
+
+% todo: make this proper mkiv xml
+
+\defineXMLenvironmentsave [cd:define] [name=]
+ {}
+ {\setxvalue{cd:def:\XMLop{name}}{\XMLflush{cd:define}}}
+
+\defineXMLsingular [cd:resolve] [name=]
+ {\ignorespaces\getvalue{cd:def:\XMLop{name}}\ignorespaces}
+
+\defineXMLenvironment [cd:command] [name=,type=,generated=,interactive=,variant=]
+ {}
+ {\showSETUPrecord}
+
+\def\showSETUPrecord
+ {\getvalue{\e!start setuptext}
+ \tttf
+ \nohyphens
+ \veryraggedright
+ \startXMLmapping [one]
+ \doglobal\newcounter\currentSETUPargument
+ \global\let\maximumSETUPargument\currentSETUPargument
+ \bgroup
+ \doif{\XMLpar{cd:command}{generated}{}}{yes}{\ttsl}%
+ \doifelseXMLop{type}{environment}
+ {\tex{\e!start}}{\tex{}}\ignorespaces
+ \XMLflush{cd:sequence}\ignorespaces
+ \egroup
+ \doifelseXMLempty{cd:arguments}
+ {}
+ {\bgroup
+ \setbox0=\hbox{\XMLflush{cd:arguments}}%
+ \global\let\maximumSETUPargument\currentSETUPargument
+ \doglobal\newcounter\currentSETUPargument
+ \ignorespaces\XMLflush{cd:arguments}%
+ \doif{\XMLpar{cd:command}{type}{}}{environment}
+ {\hskip.5em\unknown\hskip.5em
+ \doif{\XMLpar{cd:command}{generated}{}}{yes}{\ttsl}%
+ \tex{\e!stop}\ignorespaces\XMLflush{cd:sequence}}%
+ \endgraf
+ \egroup
+ %\bgroup
+ % \tx
+ % \doif{\XMLpar{cd:command}{interactive}{}}{yes} {\quad INTERACTIVE}%
+ % \doif{\XMLpar{cd:command}{interactive}{}}{exclusive}{\quad INTERACTIVE ONLY}%
+ %\egroup
+ \startXMLmapping [two]
+ \bgroup
+ \doglobal\newcounter\currentSETUPargument
+ \blank[\v!line]
+ \switchtobodyfont[small] % kan sneller
+ \ignorespaces\XMLflush{cd:arguments}\endgraf
+ \egroup
+ \stopXMLmapping}
+ \stopXMLmapping
+ \getvalue{\e!stop setuptext}}
+
+\defineXMLenvironmentsave [cd:sequence] \ignorespaces \ignorespaces
+\defineXMLenvironmentsave [cd:arguments] \ignorespaces \ignorespaces
+
+%D This is the first pass; here we generate the top line.
+
+\newcounter\currentSETUPargument
+\def\currentSETUPwidth{0pt}
+
+% environmentsave ?
+
+\startXMLmapping [one]
+
+\defineXMLenvironmentsave [cd:string] [value=]
+ {\XMLop{value}\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:variable] [value=]
+ {{\expanded{\setupintfont{\XMLop{value}}}}\ignorespaces}
+ {\ignorespaces}
+
+% moet een standaard type worden
+
+\defineXMLenvironmentsave [cd:assignments] [list=,state=]
+ {\showSETUPassignment\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:keywords] [list=,state=]
+ {\showSETUPkeyword\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:content] [list=,state=]
+ {\showSETUPcontent\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:displaymath] [list=,state=]
+ {\showSETUPdisplaymath\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:index] [list=,state=]
+ {\showSETUPindex\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:math] [list=,state=]
+ {\showSETUPmath\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:nothing] [list=,state=]
+ {\showSETUPnothing\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:file] [list=,state=]
+ {\showSETUPfile\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:position] [list=,state=]
+ {\showSETUPposition\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:reference] [list=,state=]
+ {\showSETUPreference\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:csname] [list=,state=]
+ {\showSETUPcsname\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:destination] [list=,state=]
+ {\showSETUPdestination\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:triplet] [list=,state=]
+ {\showSETUPtriplet\ignorespaces} {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:word] [list=,state=]
+ {\showSETUPword\ignorespaces} {\ignorespaces}
+
+\stopXMLmapping
+
+%D This is the second pass; here we generate the table.
+
+\startXMLmapping [two]
+
+\def\startfirstSETUPcolumn#1%
+ {\bgroup
+ \advance\leftskip 2em
+ \noindent\llap{\hbox to 2em{#1\hss}}}
+
+\def\stopfirstSETUPcolumn
+ {\endgraf
+ \egroup}
+
+\def\startsecondSETUPcolumn#1#2%
+ {\bgroup
+ \advance\hangindent \currentSETUPwidth
+ \advance\hangindent 2.5em
+ \noindent \hbox to \hangindent{#1\hss\hbox to 2.5em{\hss#2\hss}}%
+ \ignorespaces}
+
+\def\stopsecondSETUPcolumn
+ {\endgraf
+ \egroup}
+
+\def\secondSETUPcolumn#1#2%
+ {\startsecondSETUPcolumn{#1}{#2}\stopsecondSETUPcolumn}
+
+\def\previousSETUPargument{\currentSETUPargument}
+
+\defineXMLenvironmentsave [cd:assignments]
+ {}
+ {\xdef\currentSETUPwidth{0pt}%
+ \bgroup
+ \defineXMLenvironment [cd:parameter] [name=]
+ {\setbox0=\hbox{\potentialXMLentity{\XMLop{name}}}%
+ \ifdim\wd0>\currentSETUPwidth\xdef\currentSETUPwidth{\the\wd0}\fi}%
+ {}%
+ \setbox0=\vbox{\XMLflush{cd:assignments}}%
+ \egroup
+ \startfirstSETUPcolumn{\showSETUPnumber}%
+ \doifelseXMLempty{cd:assignments}
+ {\secondSETUPcolumn{\c!setup!text!{see} \previousSETUPargument}{}}
+ {\ignorespaces
+ \XMLflush{cd:assignments}%
+ \let\previousSETUPargument\currentSETUPargument}%
+ \stopfirstSETUPcolumn
+ \blank[\v!halfline]
+ \ignorespaces}
+
+\defineXMLenvironmentsave [cd:keywords] [optional=no]
+ {}
+ {\startfirstSETUPcolumn{\showSETUPnumber}%
+ \doifelseXMLempty{cd:keywords}
+ {\secondSETUPcolumn{see \previousSETUPargument}{}}
+ {\ignorespaces
+ \XMLflush{cd:keywords}%
+ \let\previousSETUPargument\currentSETUPargument}%
+ \stopfirstSETUPcolumn
+ \blank[\v!halfline]
+ \ignorespaces}
+
+\defineXMLenvironment [cd:parameter] [name=]
+ {\startsecondSETUPcolumn{\potentialXMLentity{\XMLop{name}}}{=}%
+ \ignorespaces}
+ {\stopsecondSETUPcolumn
+ \ignorespaces}
+
+\defineXMLenvironmentsave [cd:constant] [type=,default=]
+ {\doifXMLop{default}{yes}{\underbar}%
+ {\potentialXMLentity{\XMLop{type}}}\space\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:variable] [value=]
+ {\potentialXMLentity{\XMLop{value}}\space\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:inherit] [name=]
+ {\secondSETUPcolumn{\c!setup!text!{inherits} \tex{}\XMLop{name}}{}\ignorespaces}
+ {\ignorespaces}
+
+\def\simpleSETUPargument#1%
+ {\startfirstSETUPcolumn{\showSETUPnumber}%
+ \c!setup!internal!{#1}%
+ \stopfirstSETUPcolumn}
+
+\defineXMLenvironmentsave [cd:content] [list=,state=]
+ {\simpleSETUPargument{content}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:displaymath] [list=,state=]
+ {\simpleSETUPargument{display math}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:index] [list=,state=]
+ {\simpleSETUPargument{index}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:math] [list=,state=]
+ {\simpleSETUPargument{math}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:nothing] [list=,state=]
+ {\simpleSETUPargument{nothing}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:file] [list=,state=]
+ {\simpleSETUPargument{file name}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:position] [list=,state=]
+ {\simpleSETUPargument{position}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:reference] [list=,state=]
+ {\simpleSETUPargument{reference}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:csname] [list=,state=]
+ {\simpleSETUPargument{csname}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:destination] [list=,state=]
+ {\simpleSETUPargument{destination}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:triplet] [list=,state=]
+ {\simpleSETUPargument{triplet}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\defineXMLenvironmentsave [cd:word] [list=,state=]
+ {\simpleSETUPargument{word}\blank[\v!halfline]\ignorespaces}
+ {\ignorespaces}
+
+\stopXMLmapping
+
+\defineXMLentity [cd:command] {\c!setup!internal!{command}}
+\defineXMLentity [cd:dimension] {\c!setup!internal!{dimension}}
+\defineXMLentity [cd:file] {\c!setup!internal!{file}}
+\defineXMLentity [cd:name] {\c!setup!internal!{identifier}}
+\defineXMLentity [cd:character] {\c!setup!internal!{character}}
+\defineXMLentity [cd:mark] {\c!setup!internal!{mark}}
+\defineXMLentity [cd:number] {\c!setup!internal!{number}}
+\defineXMLentity [cd:reference] {\c!setup!internal!{reference}}
+\defineXMLentity [cd:plural] {\c!setup!internal!{plural}}
+\defineXMLentity [cd:singular] {\c!setup!internal!{singular}}
+\defineXMLentity [cd:text] {\c!setup!internal!{text}}
+\defineXMLentity [cd:formula] {\c!setup!internal!{formula}}
+\defineXMLentity [cd:file] {\c!setup!internal!{file}}
+\defineXMLentity [cd:matrix] {\c!setup!internal!{matrix}}
+\defineXMLentity [cd:list] {\c!setup!internal!{list}}
+\defineXMLentity [cd:section] {\c!setup!internal!{section}}
+
+\defineXMLentity [cd:noargument] {\c!setup!command!{}}
+\defineXMLentity [cd:oneargument] {\c!setup!command!{\#1}}
+\defineXMLentity [cd:twoarguments] {\c!setup!command!{\#1\#2}}
+\defineXMLentity [cd:threearguments] {\c!setup!command!{\#1\#2\#3}}
+
+%D Todo:
+
+\defineXMLprocess [cd:choice]
+
+%D Auxiliary.
+
+\unexpanded\def\showSETUP#1#2%
+ {\bgroup
+ \doglobal\increment\currentSETUPargument
+ \setbox0=\hbox
+ {\doifelseXMLop{list}{yes}{#2}{#1}}%
+ \setbox2=\hbox to \wd0
+ {\hss
+ \raise1ex\hbox
+ {\tx\ifcase\maximumSETUPargument\relax
+ \or*\else\currentSETUPargument
+ \fi}%
+ \hss}%
+ \setbox4=\hbox to \wd0
+ {\hss
+ \lower2ex\hbox
+ \bgroup
+ \txx\doifXMLop{optional}{yes}{\c!setup!internal!{optional}}%
+ \egroup
+ \hss}%
+ \ht2\ht\strutbox
+ \dp4\dp\strutbox
+ \hskip.5em\hsmash{\box0}\hsmash{\box4}\box2%
+ \egroup}
+
+\def\showSETUPnumber
+ {\doglobal\increment\currentSETUPargument
+ \hbox to 2em
+ {\ifcase\maximumSETUPargument\relax
+ \or*\else\currentSETUPargument
+ \fi
+ \hss}}
+
+\def\showSETUPassignment {\showSETUP
+ {[.\lower.5ex\hbox{=}.]}
+ {[..,.\lower.5ex\hbox{=}.,..]}}
+
+\def\showSETUPkeyword {\showSETUP
+ {[...]}
+ {[...,...]}}
+
+\def\showSETUPargument {\showSETUP
+ {\leftargument..\rightargument}
+ {\leftargument..,...,..\rightargument}}
+
+\def\showSETUPdisplaymath {\showSETUP
+ {\$\$...\$\$}
+ {\$\$...\$\$}}
+
+\def\showSETUPindex {\showSETUP
+ {\leftargument...\rightargument}
+ {\leftargument..+...+..\rightargument}}
+
+\def\showSETUPmath {\showSETUP
+ {\$...\$}
+ {\$...\$}}
+
+\def\showSETUPnothing {\showSETUP
+ {...}
+ {}}
+
+\def\showSETUPfile {\showSETUP
+ {~...~}
+ {}}
+
+\def\showSETUPposition {\showSETUP
+ {(...)}
+ {(...,...)}}
+
+\def\showSETUPreference {\showSETUP
+ {[...]}
+ {[...,...]}}
+
+\def\showSETUPcsname {\showSETUP
+ {{\c!setup!command!{}}}
+ {}}
+
+\def\showSETUPdestination {\showSETUP
+ {[\leftargument..[ref]\rightargument]}
+ {[..,\leftargument..[ref,..]\rightargument,..]}}
+
+\def\showSETUPtriplet {\showSETUP
+ {[x:y:z=]}
+ {[x:y:z=,..]}}
+
+\def\showSETUPword {\showSETUP
+ {\leftargument...\rightargument}
+ {\leftargument.. ... ..\rightargument}}
+
+\def\showSETUPcontent {\showSETUP
+ {\leftargument...\rightargument}
+ {\leftargument.. ... ..\rightargument}}
+
+%\def\c!par!{\c!setup!internal!{endofpar}}
+%\def\c!repeat!{\c!opt!{{\setupvarfont n}*}}
+%\showSETUP\def\c!par!{\texescape par}
+%\showSETUP\def\c!sep!{\texescape\texescape}
+%\def\c!par!{\addtypespec{delimiter}{par}} % \par
+%\def\c!sep!{\addtypespec{separator}{backslash}} % \\
+%\def\c!repeat!{}
+%\def\c!tex!#1{\addtypespec{command}{#1}\doanother{tex}}
+
+\startXMLmapping[zero]
+
+\defineXMLenvironmentsave [cd:command] [name=,type=,generated=,interactive=,variant=]
+ {}
+ {\doifelseXMLop{type}{environment}
+ {\edef\currentSETUPname{start\XMLop{name}}}
+ {\edef\currentSETUPname{\XMLop{name}}}%
+ \doifsomething{\XMLop{variant}}
+ {\edef\currentSETUPname{\currentSETUPname:\XMLop{variant}}}% like setupinterlinespace:1
+ \doifXMLop{generated}{yes}
+ {\edef\currentSETUPname{\currentSETUPname*}}%
+ \doglobal\saveXMLdatainelement{stp:\currentSETUPname}{cd:command}{cd:command}%
+ \expanded{\eachtexcommand[stp:x:\currentSETUPname]{\currentSETUPname}}%
+ \expanded{\texcommand [stp:y:\currentSETUPname]{\currentSETUPname}}}
+
+\stopXMLmapping
+
+\def\loadsetups{\complexorsimple\loadsetups}
+
+\def\simpleloadsetups
+ {\doifnotmode{no-setup-main}
+ {\complexloadsetups[cont-en.xml]}}
+
+\def\complexloadsetups[#1]%
+ {\doifsomething{#1}
+ {\doifnotmode{no-setup-all}
+ {\startXMLmapping[zero]
+ \expanded{\processXMLfilegrouped{#1}}%
+ \stopXMLmapping}}}
+
+\defineXMLsingular [cd:include] [file=]
+ {\complexloadsetups[\XMLop{file}]}
+
+\protect \endinput
diff --git a/tex/context/base/x-set-11.mkiv b/tex/context/base/x-set-11.mkiv
new file mode 100644
index 000000000..784df3113
--- /dev/null
+++ b/tex/context/base/x-set-11.mkiv
@@ -0,0 +1,476 @@
+%D \module
+%D [ file=x-set-11,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Definitions,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \startluacode
+% collectgarbage("stop")
+% function collectgarbage() return 0 end
+% \stopluacode
+
+% todo: for fun: pure lua interface, but as this style evolved over 15 years
+% it's a waste of time
+%
+% todo:
+%
+% \setup{setupinterlinespace}
+% \setup{setupinterlinespace:1}
+% \setup{setupinterlinespace:2}
+%
+% cd:include -> @file
+% cd:choice
+%
+% register, interaction
+
+\usemodule[set-99] % interface messages
+
+\unprotect
+
+% general
+
+\unexpanded\def\setupnumfont {}
+\unexpanded\def\setuptxtfont {}
+\unexpanded\def\setupintfont {\WORD}
+\unexpanded\def\setupvarfont {\sl}
+\unexpanded\def\setupoptfont {\sl}
+\unexpanded\def\setupalwcolor {}
+\unexpanded\def\setupoptcolor {darkgray}
+
+\def\c!setup!definereserved#1#2%
+ {\setvalue{c!setup!:r:#1}{#2}}
+
+\def\c!setup!reserved!#1%
+ {\executeifdefined{c!setup!:r:#1}{#1}}
+
+\def\c!setup!internal!#1%
+ {\dontleavehmode
+ \begingroup
+ \setupintfont{#1}%
+ \endgroup}
+
+\def\c!setup!text!#1%
+ {\dontleavehmode
+ \begingroup
+ \setupvarfont{#1}%
+ \endgroup}
+
+\def\c!setup!command!#1%
+ {{\setupvarfont{\texescape...#1}}}
+
+\def\??stp{@@stp}
+
+\defineregister
+ [texmacro]
+ [texmacros]
+
+\definesorting
+ [texcommand]
+ [texcommands]
+
+\setupsorting
+ [texcommand]
+ [\c!command=\showsetupinlist,
+ \c!criterium=\@@stpcriterium]
+
+\pushmacro\setuptext
+
+\defineframedtext
+ [setuptext]
+ [\c!width=\hsize,
+ \c!height=\v!fit,
+ \c!align=\v!right,
+ \c!offset=0.75em]
+
+\popmacro\setuptext
+
+%D Loading:
+
+\let\currentSETUPfullname\s!unknown
+
+\startxmlsetups xml:setups:assemblename
+ \doifelse {\xmlatt{#1}{environment}} {yes} {
+ \let\currentSETUPprefix\e!start
+ } {
+ \let\currentSETUPprefix\empty
+ }
+ \edef\currentSETUPname{\xmlatt{#1}{name}}
+ \doifelse {\xmlatt{#1}{generated}} {yes} {
+ \def\currentSETUPgenerated{*}
+ } {
+ \let\currentSETUPgenerated\empty
+ }
+ \doifelsenothing {\xmlatt{#1}{variant}} {
+ \let\currentSETUPvariant\empty
+ } {
+ \def\currentSETUPvariant{:\xmlatt{#1}{variant}}
+ }
+ \edef\currentSETUPfullname {
+ \currentSETUPprefix
+ \currentSETUPname
+ \currentSETUPvariant
+ \currentSETUPgenerated
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:register
+ \xmlsetup{#1}{xml:setups:assemblename}
+ \expanded{\texcommand[stp:x:\currentSETUPfullname]{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:basics
+ \xmlsetsetup {#1} {
+ sequence|string|variable|assignments|keywords|content|displaymath|index|math|
+ nothing|file|position|reference|csname|destination|triplet|word|
+ resolve|parameter|constant|inherit|parameter|define
+ } {xml:setups:*}
+\stopxmlsetups
+
+\xmlregisterdocumentsetup{setups}{xml:setups:basics}
+
+\def\loadsetups{\complexorsimple\loadsetups}
+
+\let\loadedsetups\empty % we load more setups, setups:<name>
+
+\def\simpleloadsetups
+ {\doifnotmode{no-setup-main}{\complexloadsetups[cont-en.xml]}}
+
+\def\complexloadsetups[#1]%
+ {\doifsomething{#1}
+ {\doonlyonce{setups:#1}
+ {\doglobal\prependtocommalist{setups:#1}\loadedsetups % last overloads first
+ \xmlloadonly{setups:#1}{#1}{setups}%
+ \xmlfilter{setups:#1}{/interface/command/command(xml:setups:register)}}}} % qualified path saves > 50% runtime
+
+\newif\ifshortsetup
+
+\unexpanded\def\setup {\shortsetupfalse\doshowsetup}
+\def\showsetup {\shortsetupfalse\doshowsetup}
+\def\shortsetup{\shortsetuptrue \doshowsetup}
+\unexpanded\def\setupsetup{\dodoubleargument\getparameters[\??stp]}
+
+%unexpanded\def\showsetupinlist#1#2#3{\shortsetupfalse\showsetupindeed{#3}\par}
+\unexpanded\def\showsetupinlist#1#2#3{\shortsetupfalse\xmlsetup{#3}{xml:setups:typeset}\par}
+
+% todo: only references in lists
+
+\def\doshowsetup
+ {\dosingleempty\dodoshowsetup}
+
+\def\dodoshowsetup[#1]%
+ {\iffirstargument
+ \dododoshowsetup{#1}%
+ \else
+ \expandafter\dododoshowsetup
+ \fi}
+
+\def\dododoshowsetup#1% this will trigger 'used'
+ {\registersort[texcommand][stp:x:#1]%
+ \showsetupindeed{#1}}
+
+\def\showsetupindeed#1%
+ {\xmlfilterlist{\loadedsetups}{/interface/command[@name='#1']/command(xml:setups:typeset)}}
+
+\unexpanded\def\placesetup {\placelistofsorts[texcommand][\c!criterium=\v!used]}
+\unexpanded\def\placeallsetups{\placelistofsorts[texcommand][\c!criterium=\v!all ]}
+
+\let\placeeverysetup\placeallsetups
+
+%D Typesetting:
+
+\setupxml
+ [\c!method=mkiv, % mixed mode
+ \c!default=\v!hidden, % ignore elements that are not defined
+ \c!compress=\v!yes, % strip comment
+ \c!entities=\v!yes] % replace entities
+
+\newcounter\currentSETUPargument
+\newcounter\maximumSETUPargument
+
+\def\currentSETUPwidth{0pt}
+
+\startxmlsetups xml:setups:typeset
+ \getvalue{\e!start setuptext}
+ \tttf
+ \nohyphens
+ \veryraggedright
+ \doglobal\newcounter\currentSETUPargument
+ \xdef\maximumSETUPargument{\xmlcount{#1}{/arguments/*}}
+ \bgroup
+ \doif {\xmlatt{#1}{generated}} {yes} {
+ \ttsl
+ }
+ \doifelse {\xmlatt{#1}{type}} {environment} {
+ \tex{\e!start}
+ } {
+ \tex{}
+ }
+ \xmlfilter{#1}{/sequence/first()}
+ \ignorespaces
+ \egroup
+ \xmldoif{#1}{/arguments} {
+ \bgroup
+ \enablemode[setups-pass-one]
+ \doglobal\newcounter\currentSETUPargument
+ \ignorespaces
+ \xmlfilter{#1}{/arguments/text()}
+ \egroup
+ }
+ \doif {\xmlatt{#1}{type}} {environment} {
+ \bgroup
+ \hskip.5em\unknown\hskip.5em
+ \doif {\xmlatt{#1}{generated}} {yes} {
+ \ttsl
+ }
+ \tex{\e!stop}
+ \xmlfilter{#1}{/sequence/variable/first()}
+ \ignorespaces
+ \egroup
+ }
+ \endgraf
+ \xmldoif{#1}{/arguments} {
+ \bgroup
+ \enablemode[setups-pass-two]
+ \doglobal\newcounter\currentSETUPargument
+ \blank[\v!line]
+ \switchtobodyfont[small]
+ \ignorespaces\xmlfilter{#1}{/arguments/text()}\endgraf
+ \egroup
+ }
+ \getvalue{\e!stop setuptext}
+\stopxmlsetups
+
+\setupsetup
+ [\c!before=,
+ \c!after=,
+ \c!command=\setup,
+ \c!criterium=\v!used]
+
+\startxmlsetups xml:setups:resolve
+ \ignorespaces
+ \xmlfilterlist{\loadedsetups}{/interface/define[@name='\xmlatt{#1}{name}']/first()}
+\stopxmlsetups
+
+%D This is the first pass; here we generate the top line.
+
+\startxmlsetups xml:setups:define
+ \ignorespaces\xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:sequence
+ \ignorespaces\xmlflush{#1}
+\stopxmlsetups
+
+\startxmlsetups xml:setups:string
+ \xmlatt{#1}{value}\ignorespaces
+\stopxmlsetups
+
+\startxmlsetups xml:setups:content \showSETUPcomponent{#1}{content} {content} \stopxmlsetups
+\startxmlsetups xml:setups:displaymath \showSETUPcomponent{#1}{displaymath}{display math}\stopxmlsetups
+\startxmlsetups xml:setups:index \showSETUPcomponent{#1}{index} {index} \stopxmlsetups
+\startxmlsetups xml:setups:math \showSETUPcomponent{#1}{math} {math} \stopxmlsetups
+\startxmlsetups xml:setups:nothing \showSETUPcomponent{#1}{nothing} {nothing} \stopxmlsetups
+\startxmlsetups xml:setups:file \showSETUPcomponent{#1}{file} {file name} \stopxmlsetups
+\startxmlsetups xml:setups:position \showSETUPcomponent{#1}{position} {position} \stopxmlsetups
+\startxmlsetups xml:setups:reference \showSETUPcomponent{#1}{reference} {reference} \stopxmlsetups
+\startxmlsetups xml:setups:csname \showSETUPcomponent{#1}{csname} {csname} \stopxmlsetups
+\startxmlsetups xml:setups:destination \showSETUPcomponent{#1}{destination}{destination} \stopxmlsetups
+\startxmlsetups xml:setups:triplet \showSETUPcomponent{#1}{triplet} {triplet} \stopxmlsetups
+\startxmlsetups xml:setups:word \showSETUPcomponent{#1}{word} {word} \stopxmlsetups
+
+\def\showSETUPcomponent#1#2#3%
+ {\doifmodeelse{setups-pass-one}
+ {\getvalue{showSETUP#2}{#1}}
+ {\simpleSETUPargument{#3}}}
+
+%D This is the second pass; here we generate the table.
+
+\unexpanded\def\startfirstSETUPcolumn#1%
+ {\bgroup
+ \advance\leftskip 2em
+ \noindent\llap{\hbox to 2em{#1\hss}}}
+
+\unexpanded\def\stopfirstSETUPcolumn
+ {\endgraf
+ \egroup}
+
+\unexpanded\def\startsecondSETUPcolumn#1#2%
+ {\bgroup
+ \advance\hangindent\dimexpr\currentSETUPwidth+2.5em\relax
+ \noindent \hbox to \hangindent{#1\hss\hbox to 2.5em{\hss#2\hss}}}
+
+\unexpanded\def\stopsecondSETUPcolumn
+ {\endgraf
+ \egroup}
+
+\def\secondSETUPcolumn#1#2%
+ {\startsecondSETUPcolumn{#1}{#2}\stopsecondSETUPcolumn}
+
+\def\previousSETUPargument{\currentSETUPargument}
+
+\startxmlsetups xml:setups:parameter:measure
+ \setbox0=\hbox{\c!setup!reserved!{\xmlatt{#1}{name}}}
+ \ifdim\wd0>\currentSETUPwidth\xdef\currentSETUPwidth{\the\wd0}\fi
+\stopxmlsetups
+
+\startxmlsetups xml:setups:assignments
+ \doifmodeelse{setups-pass-one} {
+ \showSETUPassignment{#1}
+ } {
+ \xdef\currentSETUPwidth{0pt}%
+ \bgroup
+ \xmlfilter{#1}{/parameter/command(xml:setups:parameter:measure)}
+ \egroup
+ \startfirstSETUPcolumn{\showSETUPnumber}%
+ \ignorespaces
+ \xmlflush{#1}
+ \let\previousSETUPargument\currentSETUPargument
+ \stopfirstSETUPcolumn
+ \blank[\v!halfline]
+ \ignorespaces
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:keywords
+ \doifmodeelse{setups-pass-one} {
+ \showSETUPkeyword{#1}
+ } {
+ \startfirstSETUPcolumn{\showSETUPnumber}%
+ \ignorespaces
+ \xmlflush{#1}
+ \let\previousSETUPargument\currentSETUPargument
+ \stopfirstSETUPcolumn
+ \blank[\v!halfline]
+ \ignorespaces
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:parameter
+ \startsecondSETUPcolumn{\c!setup!reserved!{\xmlatt{#1}{name}}}{=}
+ \ignorespaces
+ \xmlflush{#1}
+ \stopsecondSETUPcolumn
+ \ignorespaces
+\stopxmlsetups
+
+\startxmlsetups xml:setups:constant
+ \doifmodeelse {setups-pass-one} {
+ } {
+ \doif {\xmlatt{#1}{default}} {yes} {
+ \underbar % next needs to be {braced}
+ }
+ {\c!setup!reserved!{\xmlatt{#1}{type}}}
+ \space
+ \ignorespaces
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:variable
+ \doifmodeelse {setups-pass-one} {
+ \expanded{\setupintfont{\xmlatt{#1}{value}}}\ignorespaces
+ } {
+ \c!setup!reserved!{\xmlatt{#1}{value}}
+ \space
+ \ignorespaces
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:setups:inherit
+ \secondSETUPcolumn {
+ \c!setup!text!{\getmessage{setup}{inherits}}
+ \enspace
+ \tex{}
+ \xmlatt{#1}{name}
+ } {}
+ \ignorespaces
+\stopxmlsetups
+
+\def\simpleSETUPargument#1%
+ {\startfirstSETUPcolumn{\showSETUPnumber}%
+ \c!setup!internal!{#1}%
+ \stopfirstSETUPcolumn
+ \blank[\v!halfline]
+ \ignorespaces}
+
+\c!setup!definereserved {cd:command} {\c!setup!internal!{\getmessage{setup}{command}}}
+\c!setup!definereserved {cd:dimension} {\c!setup!internal!{\getmessage{setup}{dimension}}}
+\c!setup!definereserved {cd:file} {\c!setup!internal!{\getmessage{setup}{file}}}
+\c!setup!definereserved {cd:name} {\c!setup!internal!{\getmessage{setup}{identifier}}}
+\c!setup!definereserved {cd:character} {\c!setup!internal!{\getmessage{setup}{character}}}
+\c!setup!definereserved {cd:mark} {\c!setup!internal!{\getmessage{setup}{mark}}}
+\c!setup!definereserved {cd:number} {\c!setup!internal!{\getmessage{setup}{number}}}
+\c!setup!definereserved {cd:reference} {\c!setup!internal!{\getmessage{setup}{reference}}}
+\c!setup!definereserved {cd:plural} {\c!setup!internal!{\getmessage{setup}{plural}}}
+\c!setup!definereserved {cd:singular} {\c!setup!internal!{\getmessage{setup}{singular}}}
+\c!setup!definereserved {cd:text} {\c!setup!internal!{\getmessage{setup}{text}}}
+\c!setup!definereserved {cd:formula} {\c!setup!internal!{\getmessage{setup}{formula}}}
+\c!setup!definereserved {cd:file} {\c!setup!internal!{\getmessage{setup}{file}}}
+\c!setup!definereserved {cd:matrix} {\c!setup!internal!{\getmessage{setup}{matrix}}}
+\c!setup!definereserved {cd:list} {\c!setup!internal!{\getmessage{setup}{list}}}
+\c!setup!definereserved {cd:section} {\c!setup!internal!{\getmessage{setup}{section}}}
+
+\c!setup!definereserved {cd:noargument} {\c!setup!command! {}}
+\c!setup!definereserved {cd:oneargument} {\c!setup!command! {\#1}}
+\c!setup!definereserved {cd:twoarguments} {\c!setup!command! {\#1\#2}}
+\c!setup!definereserved {cd:threearguments} {\c!setup!command! {\#1\#2\#3}}
+
+%D Auxiliary.
+
+\unexpanded\def\showSETUP#1#2#3%
+ {\bgroup
+ \doglobal\increment\currentSETUPargument
+ \setbox0=\hbox
+ {\doifelse{\xmlatt{#1}{list}}{yes}{#3}{#2}}%
+ \setbox2=\hbox to \wd0
+ {\hss
+ \raise1ex\hbox
+ {\tx\ifcase\maximumSETUPargument\relax
+ \or*\else\currentSETUPargument
+ \fi}%
+ \hss}%
+ \setbox4=\hbox to \wd0
+ {\hss
+ \lower2ex\hbox
+ \bgroup
+ \txx\doif{\xmlatt{#1}{optional}}{yes}{\c!setup!internal!{\getmessage{setup}{optional}}}%
+ \egroup
+ \hss}%
+ \ht2\ht\strutbox
+ \dp4\dp\strutbox
+ \hskip.5em\hsmash{\box0}\hsmash{\box4}\box2%
+ \egroup
+ \ignorespaces}
+
+\def\showSETUPnumber
+ {\doglobal\increment\currentSETUPargument
+ \hbox to 2em
+ {\ifcase\maximumSETUPargument\relax
+ \or*\else\currentSETUPargument
+ \fi
+ \hss}}
+
+\def\showSETUPassignment #1{\showSETUP{#1}{[.\lower.5ex\hbox{=}.]} {[..,.\lower.5ex\hbox{=}.,..]}}
+\def\showSETUPkeyword #1{\showSETUP{#1}{[...]} {[...,...]}}
+\def\showSETUPargument #1{\showSETUP{#1}{\leftargument..\rightargument} {\leftargument..,...,..\rightargument}}
+\def\showSETUPdisplaymath#1{\showSETUP{#1}{\$\$...\$\$} {\$\$...\$\$}}
+\def\showSETUPindex #1{\showSETUP{#1}{\leftargument...\rightargument} {\leftargument..+...+..\rightargument}}
+\def\showSETUPmath #1{\showSETUP{#1}{\$...\$} {\$...\$}}
+\def\showSETUPnothing #1{\showSETUP{#1}{...} {}}
+\def\showSETUPfile #1{\showSETUP{#1}{~...~} {}}
+\def\showSETUPposition #1{\showSETUP{#1}{(...)} {(...,...)}}
+\def\showSETUPreference #1{\showSETUP{#1}{[...]} {[...,...]}}
+\def\showSETUPcsname #1{\showSETUP{#1}{{\c!setup!command!{}}} {}}
+\def\showSETUPdestination#1{\showSETUP{#1}{[\leftargument..[ref]\rightargument]}{[..,\leftargument..[ref,..]\rightargument,..]}}
+\def\showSETUPtriplet #1{\showSETUP{#1}{[x:y:z=]} {[x:y:z=,..]}}
+\def\showSETUPword #1{\showSETUP{#1}{\leftargument...\rightargument} {\leftargument.. ... ..\rightargument}}
+\def\showSETUPcontent #1{\showSETUP{#1}{\leftargument...\rightargument} {\leftargument.. ... ..\rightargument}}
+
+\protect \endinput
diff --git a/tex/context/base/x-set-11.tex b/tex/context/base/x-set-11.tex
new file mode 100644
index 000000000..920fd7426
--- /dev/null
+++ b/tex/context/base/x-set-11.tex
@@ -0,0 +1,110 @@
+%D \module
+%D [ file=x-set-11,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Definitions,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmarkfile{x-set-11}
+
+\endinput
+
+% Old code, a mixture of loading in mkiv and processing in mkii.
+
+\startluacode
+ do
+ document = document or { }
+
+ document.setups = {
+ loaded = { },
+ root = nil,
+ used = { },
+ }
+
+ function document.setups.load(filename)
+ filename = resolvers.find_file(filename) or ""
+ if filename ~= "" and not document.setups.loaded[filename] then
+ local loaded = xml.load(filename)
+ if loaded then
+ if document.setups.root then
+ xml.inject(document.setups.root,"/",loaded)
+ else
+ document.setups.root = loaded
+ end
+ document.setups.loaded[filename] = true
+ end
+ end
+ end
+ function document.setups.name(ek)
+ local at = ek.at
+ local name = at.name
+ if at.type == 'environment' then
+ name = "start" .. name
+ end
+ if at.variant then
+ name = name .. ":" .. at.variant
+ end
+ if at.generated == "yes" then
+ name = name .. "*"
+ end
+ return name:lower()
+ end
+ function document.setups.show(name)
+ if document.setups.root then
+ local name = name:gsub("[<>]","")
+ local setup = xml.first(document.setups.root,"cd:command[@name='" .. name .. "']")
+ document.setups.used[#document.setups.used+1] = setup
+ xml.sprint(setup)
+ end
+ end
+ function document.setups.showused()
+ if document.setups.root and next(document.setups.used) then
+ for k,v in ipairs(table.sortedkeys(document.setups.used)) do
+ xml.sprint(document.setups.used[v])
+ end
+ end
+ end
+ function document.setups.showall()
+ if document.setups.root then
+ local list = { }
+ xml.each_element(document.setups.root,"cd:command", function(r,d,t)
+ local ek = d[t]
+ list[document.setups.name(ek)] = ek
+ end )
+ for k,v in ipairs(table.sortedkeys(list)) do
+ xml.sprint(list[v])
+ end
+ end
+ end
+ function document.setups.resolve(name)
+ if document.setups.root then
+ local e = xml.filter(document.setups.root,string.format("cd:define[@name='%s']/text()",name))
+ if e then
+ xml.sprint(e)
+ end
+ end
+ end
+ end
+\stopluacode
+
+\def\mkloadsetups #1{\ctxlua{document.setups.load("#1")}}
+\def\mkshowsetup #1{\ctxlua{document.setups.show("#1")}}
+\def\mkshowusedsetups {\bgroup\enableXML\ctxlua{document.setups.showused()}\egroup}
+\def\mkshowallsetups {\bgroup\enableXML\ctxlua{document.setups.showall ()}\egroup}
+
+\def\mkshowsetup #1{\bgroup\enableXML\ctxlua{document.setups.show("#1")}\egroup}
+
+\defineXMLenvironmentsave [cd:define] [name=]
+ {}
+
+\defineXMLsingular [cd:resolve] [name=]
+ {\enableXML\ignorespaces\ctxlua{document.setups.resolve("\XMLop{name}")}}
+
+\endinput
diff --git a/tex/context/base/x-set-12.tex b/tex/context/base/x-set-12.tex
new file mode 100644
index 000000000..d79901433
--- /dev/null
+++ b/tex/context/base/x-set-12.tex
@@ -0,0 +1,258 @@
+%D \module
+%D [ file=x-set-12,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Definitions,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[set-11]
+
+\unprotect
+
+% \starttext
+% \setup{installlanguage}
+% \placesetup
+% \stoptext
+
+\definecolor[TitleColor][r=.375,g=.125,b=.125]
+\definecolor[TitleColor][r=.125,g=.375,b=.125]
+\definecolor[TitleColor][r=.125,g=.125,b=.375]
+\definecolor[TitleColor][r=.375,g=.375,b=.125]
+\definecolor[TitleColor][r=.375,g=.125,b=.375]
+\definecolor[TitleColor][r=.125,g=.375,b=.375]
+
+\definecolor[TitleColor][r=.25,g=.20,b=.15]
+\definecolor[TitleColor][r=.25,g=.15,b=.20]
+\definecolor[TitleColor][r=.20,g=.15,b=.25]
+\definecolor[TitleColor][r=.20,g=.25,b=.15]
+\definecolor[TitleColor][r=.15,g=.20,b=.25]
+\definecolor[TitleColor][r=.15,g=.25,b=.20]
+
+\startinterface english \loadsetups[cont-en.xml] \stopinterface
+\startinterface dutch \loadsetups[cont-nl.xml] \stopinterface
+\startinterface german \loadsetups[cont-de.xml] \stopinterface
+\startinterface french \loadsetups[cont-fr.xml] \stopinterface
+\startinterface italian \loadsetups[cont-it.xml] \stopinterface
+\startinterface czech \loadsetups[cont-cs.xml] \stopinterface
+\startinterface romanian \loadsetups[cont-ro.xml] \stopinterface
+
+\startinterface dutch \definecolor[LocalColor][r=.75,g=.25,b=.25] \stopinterface
+\startinterface english \definecolor[LocalColor][r=.25,g=.75,b=.25] \stopinterface
+\startinterface german \definecolor[LocalColor][r=.25,g=.25,b=.75] \stopinterface
+\startinterface french \definecolor[LocalColor][r=.75,g=.75,b=.25] \stopinterface
+\startinterface czech \definecolor[LocalColor][r=.75,g=.25,b=.75] \stopinterface
+\startinterface italian \definecolor[LocalColor][r=.25,g=.75,b=.75] \stopinterface
+\startinterface romanian \definecolor[LocalColor][r=.5,g=.4,b=.3] \stopinterface
+% \definecolor[LocalColor][r=.5,g=.3,b=.4]
+% \definecolor[LocalColor][r=.4,g=.3,b=.5]
+% \definecolor[LocalColor][r=.4,g=.5,b=.3]
+% \definecolor[LocalColor][r=.3,g=.4,b=.5]
+% \definecolor[LocalColor][r=.3,g=.5,b=.4]
+
+\startinterface english \definecolor[TitleColor][r=.375,g=.125,b=.125] \stopinterface
+\startinterface dutch \definecolor[TitleColor][r=.125,g=.375,b=.125] \stopinterface
+\startinterface german \definecolor[TitleColor][r=.125,g=.125,b=.375] \stopinterface
+\startinterface french \definecolor[TitleColor][r=.375,g=.375,b=.125] \stopinterface
+\startinterface italian \definecolor[TitleColor][r=.375,g=.125,b=.375] \stopinterface
+\startinterface czech \definecolor[TitleColor][r=.125,g=.375,b=.375] \stopinterface
+\startinterface romanian \definecolor[TitleColor][r=.25,g=.20,b=.15] \stopinterface
+% \definecolor[TitleColor][r=.25,g=.15,b=.20]
+% \definecolor[TitleColor][r=.20,g=.15,b=.25]
+% \definecolor[TitleColor][r=.20,g=.25,b=.15]
+% \definecolor[TitleColor][r=.15,g=.20,b=.25]
+% \definecolor[TitleColor][r=.15,g=.25,b=.20]
+
+\definecolor [lightgray] [s=.9]
+\definecolor [darkgray] [s=.1]
+
+\usetypescript[palatino]
+\setupbodyfont[palatino,9pt]
+
+\setupcolors
+ [\c!state=\v!start]
+
+\defineoverlay
+ [cover]
+ [\hbox to \paperwidth{\hss\reuseMPgraphic{cover+back}}]
+
+\defineoverlay
+ [back]
+ [\hbox to \paperwidth{\reuseMPgraphic{cover+back}\hss}]
+
+\startreusableMPgraphic{cover+back}
+ numeric h, w ; path p, q, r ; color f, d ; pair s ;
+ h := OverlayHeight ; w := 2*OverlayWidth ;
+ r := unitsquare xyscaled (w,h) ;
+ fill r withcolor \MPcolor{lightgray} ;
+ set_grid(w,h,w/8,w/16) ;
+ forever :
+ s := center r randomized (w,h) ;
+ if new_on_grid(xpart s, ypart s) :
+ s := (dx,dy) ;
+ p := fullsquare xyscaled(w/4,w/8) ;
+ q := (-4w,ypart ulcorner p) --
+ .5[ulcorner p, urcorner p] --
+ (4w,ypart urcorner p) ;
+ q := q shifted (0,-w/24) ;
+ p := p randomized (w/40,w/40) ;
+ q := q randomized (0,w/100) ;
+ q := q cutafter (p cutafter point 3 of p) ;
+ q := q cutbefore (p cutbefore point 3 of p) ;
+ d := .5[\MPcolor{LocalColor},\MPcolor{lightgray}] randomized (.5,.9) ;
+ f := \MPcolor{lightgray} randomized (.5,.9) ;
+ pickup pencircle scaled (w/100) ;
+ fill p shifted s withcolor f ;
+ draw p shifted s withcolor d ;
+ draw q shifted s withcolor d ;
+ fi ;
+ exitif grid_full ;
+ endfor ;
+ setbounds currentpicture to r ;
+\stopreusableMPgraphic
+
+\definelayout
+ [titlepage]
+ [\c!backspace=1cm,
+ \c!topspace=1cm,
+ \c!width=\v!middle,
+ \c!height=\v!middle,
+ \c!header=0pt,
+ \c!footer=0pt]
+
+\setuplayout
+ [\c!backspace=2cm,
+ \c!topspace=1.5cm,
+ \c!header=0cm,
+ \c!footer=0cm,
+ \c!width=\v!middle,
+ \c!height=\v!middle]
+
+\setuppagenumbering
+ [\c!alternative=\v!doublesided]
+
+\setupsetup
+ [\c!criterium=\v!all,
+ \c!reference=0]
+
+\setupframedtexts
+ [setuptext]
+ [\c!frame=\v!on,
+ \c!rulethickness=1pt,
+ \c!framecolor=TitleColor]
+
+\setupunderbar
+ [\c!rulethickness=1pt,
+ \c!rulecolor=TitleColor]
+
+\starttext
+
+\setupbackgrounds
+ [\v!rightpage]
+ [\c!background=cover]
+
+\setuplayout
+ [titlepage]
+
+\startsetups text:commands
+ \startinterface dutch \strut commando's \par \stopinterface
+ \startinterface english \strut commands \par \stopinterface
+ \startinterface german \strut befehle \par \stopinterface
+ \startinterface french \strut commandes \par \stopinterface
+ \startinterface czech \strut p\v{r}ikazy \par \stopinterface
+ \startinterface italian \strut comandi \par \stopinterface
+ \startinterface romanian \strut comenzile \par \stopinterface
+\stopsetups
+
+\startsetups text:uppercase
+ \startinterface dutch NL\stopinterface
+ \startinterface english EN\stopinterface
+ \startinterface german DE\stopinterface
+ \startinterface french FR\stopinterface
+ \startinterface czech CS\stopinterface
+ \startinterface italian IT\stopinterface
+ \startinterface romanian RO\stopinterface
+\stopsetups
+
+\startsetups text:lowercase
+ \startinterface dutch \strut nl / nederlands \par \stopinterface
+ \startinterface english \strut en / english \par \stopinterface
+ \startinterface german \strut de / deutsch \par \stopinterface
+ \startinterface french \strut fr / fran\c{c}ais \par \stopinterface
+ \startinterface czech \strut cs / \v{c}esk\'y \par \stopinterface
+ \startinterface italian \strut it / italiano \par \stopinterface
+ \startinterface romanian \strut ro / rom\^{a}n\u{a} \par \stopinterface
+\stopsetups
+
+\startmakeup[\v!standard]
+ \dontcomplain
+ \setupalign[\v!left]
+ \startcolor[TitleColor]
+ \definedfont[RegularBold at 100pt]\setstrut
+ \strut Con\TeX t \par
+ \definedfont[RegularBold at 50pt]\setstrut
+ \setups[text:commands]
+ \vfill
+ \definedfont[RegularBold at 150pt]\setstrut
+ \setups[text:uppercase]
+ \stopcolor
+\stopmakeup
+
+\setuplayout % needed ?
+
+\setupbackgrounds
+ [\v!rightpage]
+ [\c!background=]
+
+\startmakeup[\v!standard]
+ \dontcomplain
+ \startcolor[TitleColor]
+ \definedfont[RegularBold at 100pt]\setstrut
+ \setupalign[\v!left]
+ \strut Con\TeX t \par
+ \definedfont[RegularBold at 50pt]\setstrut
+ \setups[text:commands]
+ \vfill
+ \definedfont[RegularBold at 24pt]\setupinterlinespace
+ \setups[text:lowercase]
+ \par \strut \currentdate \par
+ \stopcolor
+\stopmakeup
+
+\protect
+
+\placeeverysetup
+
+\unprotect
+
+\page[\v!yes,\v!blank,\v!right,\v!left]
+
+\setuplayout
+ [titlepage]
+
+\setupbackgrounds
+ [\v!leftpage]
+ [\c!background=back]
+
+\startmakeup[\v!standard][\c!page=]
+ \dontcomplain
+ \startcolor[TitleColor]
+ \definedfont[RegularBold at 24pt]\setupinterlinespace
+ \setupalign[\v!left]
+ \vfill
+ PRAGMA ADE \par
+ Ridderstraat 27 \par
+ 8061GH Hasselt NL \par
+ www.pragma-ade.com \par
+ \stopcolor
+\stopmakeup
+
+\protect
+
+\stoptext
diff --git a/tex/context/base/x-set-99.tex b/tex/context/base/x-set-99.tex
new file mode 100644
index 000000000..64d2b1db3
--- /dev/null
+++ b/tex/context/base/x-set-99.tex
@@ -0,0 +1,283 @@
+%D \module
+%D [ file=x-set-99,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Definitions,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% shared list
+
+\startmessages dutch library: setup
+ title: setup
+ formula: formule
+ number: getal
+ list: lijst
+ dimension: maat
+ mark: markering
+ reference: verwijzing
+ command: commando
+ file: file
+ name: naam
+ identifier: naam
+ text: tekst
+ section: sectie
+ singular: naam enkelvoud
+ plural: naam meervoud
+ matrix: n*m
+ see: zie
+ inherits: erft van
+ 1: de karakters < en > zijn globaal actief!
+ 2: -- wordt verwerkt
+ 3: -- is niet gedefinieerd
+ 4: -- wordt nogmaals verwerkt
+ optional: optioneel
+ displaymath: formule
+ index: ingang
+ math: formule
+ nothing: leeg
+ file: file
+ position: positie
+ reference: verwijzing
+ csname: naam
+ destination: bestemming
+ triplet: triplet
+ word: woord
+ content: tekst
+\stopmessages
+
+\startmessages english library: setup
+ title: setup
+ formula: formula
+ number: number
+ list: list
+ dimension: dimension
+ mark: mark
+ reference: reference
+ command: command
+ file: file
+ name: name
+ identifier: identifier
+ text: text
+ section: section
+ singular: singular name
+ plural: plural name
+ matrix: n*m
+ see: see
+ inherits: inherits from
+ 1: the characters < and > are globally active!
+ 2: -- is processed
+ 3: -- is undefined
+ 4: -- is processed again
+ optional: optional
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages german library: setup
+ title: Setup
+ formula: Formel
+ number: Nummer
+ list: Liste
+ dimension: Dimension
+ mark: Beschriftung
+ reference: Referenz
+ command: Befehl
+ file: Datei
+ name: Name
+ identifier: Name
+ text: Text
+ section: Abschnitt
+ singular: singular
+ plural: plural
+ matrix: n*m
+ see: siehe
+ inherits: inherits from
+ 1: Die Zeichen < und > gelten global!
+ 2: -- wird verarbeitet
+ 3: -- ist undefiniert
+ 4: -- ist mehrmals verarbeitet
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages czech library: setup
+ title: setup
+ formula: rovnice
+ number: cislo
+ list: seznam
+ dimension: dimenze
+ mark: znacka
+ reference: reference
+ command: prikaz
+ file: soubor
+ name: jmeno
+ identifier: jmeno
+ text: text
+ section: sekce
+ singular: jmeno v singularu
+ plural: jmeno v pluralu
+ matrix: n*m
+ see: viz
+ inherits: inherits from
+ 1: znaky < a > jsou globalne aktivni!
+ 2: -- je zpracovano
+ 3: -- je nedefinovano
+ 4: -- je zpracovano znovu
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages italian library: setup
+ title: setup
+ formula: formula
+ number: number
+ list: list
+ dimension: dimension
+ mark: mark
+ reference: reference
+ command: command
+ file: file
+ name: name
+ identifier: name
+ text: text
+ section: section
+ singular: singular name
+ plural: plural name
+ matrix: n*m
+ see: see
+ inherits: inherits from
+ 1: the characters < and > are globally active!
+ 2: -- is processed
+ 3: -- is undefined
+ 4: -- is processed again
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages romanian library: setup
+ title: setari
+ formula: formula
+ number: numar
+ list: lista
+ dimension: dimensiune
+ mark: marcaj
+ reference: referinta
+ command: comanda
+ file: fisier
+ name: nume
+ identifier: nume
+ text: text
+ section: sectiune
+ singular: nume singular
+ plural: nume pluram
+ matrix: n*m
+ see: vezi
+ inherits: inherits from
+ 1: caracterele < si > sunt active global!
+ 2: este procesat --
+ 3: -- este nedefinit
+ 4: -- este procesat din nou
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages french library: setup
+ title: réglage
+ formula: formule
+ number: numéro
+ list: liste
+ dimension: dimension
+ mark: marquage
+ reference: reference
+ command: commande
+ file: fichier
+ name: nom
+ identifier: identificateur
+ text: texte
+ section: section
+ singular: nom singulier
+ plural: nom pluriel
+ matrix: n*m
+ see: vois
+ inherits: herite de
+ 1: les caractères < et > sont globalement actifs !
+ 2: -- est traité
+ 3: -- n'est pas défini
+ 4: -- est traité de nouveau
+ optional: optionel
+ displaymath: formule
+ index: entrée
+ math: formule
+ nothing: vide
+ file: fichier
+ position: position
+ reference: réference
+ csname: nom
+ destination: destination
+ triplet: triplet
+ word: mot
+ content: texte
+\stopmessages
+
+\endinput
diff --git a/tex/context/base/x-sm2om.xsl b/tex/context/base/x-sm2om.xsl
new file mode 100644
index 000000000..93e1a12c5
--- /dev/null
+++ b/tex/context/base/x-sm2om.xsl
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ This style sheet is used in the Math4All project. This project
+ will provide an on-line math method for secondary and tertiary
+ education. In addition to the web-bases content the project
+ provides high quality typeset output as well.
+
+ This style converts some elements to open math alternatives and
+ its sole purpose is to easy the input of inline math.
+
+ <i>x</i> identifier (use <v>x</v> when possible)
+ <n>5</n> number
+ <v>5</v> variable
+ <r>1:2</r> interval (range)
+ <r>x:y</r> interval (range) using variables
+
+ This style is dedicated to Frits Spijkers, an open minded math
+ author who patiently tested all the related TeX things.
+
+ Hans Hagen, PRAGMA ADE, Hasselt NL / 2006-04-27
+
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:output method="xml"/>
+
+ <xsl:template match="processing-instruction()"><xsl:copy/><xsl:text>
+ </xsl:text></xsl:template>
+
+ <xsl:template match="node()|@*" >
+ <xsl:copy>
+ <xsl:apply-templates select = "node()|@*" />
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="comment"></xsl:template>
+
+ <xsl:variable name='openmath-to-content-mathml'><value-of select='$stylesheet-path'/>/x-openmath.xsl</xsl:variable>
+
+ <xsl:template name='om-minus'>
+ <OMS cd="arith1" name="unary_minus"/>
+ </xsl:template>
+ <xsl:template name='om-infinity'>
+ <OMS cd="nums1" name="infinity"/>
+ </xsl:template>
+ <xsl:template name='om-interval-oo'>
+ <OMS cd="interval1" name="interval_oo"/>
+ </xsl:template>
+ <xsl:template name='om-interval-oc'>
+ <OMS cd="interval1" name="interval_oc"/>
+ </xsl:template>
+ <xsl:template name='om-interval-co'>
+ <OMS cd="interval1" name="interval_co"/>
+ </xsl:template>
+ <xsl:template name='om-interval-cc'>
+ <OMS cd="interval1" name="interval_cc"/>
+ </xsl:template>
+
+ <xsl:template name='om-kind-of-data'>
+ <xsl:param name='arg'/>
+ <xsl:choose>
+ <xsl:when test="contains($arg,'/')">
+ <xsl:element name="OMA">
+ <xsl:element name="OMS">
+ <xsl:attribute name="cd">nums1</xsl:attribute>
+ <xsl:attribute name="name">rational</xsl:attribute>
+ </xsl:element>
+ <xsl:call-template name="om-kind-of-data">
+ <xsl:with-param name='arg' select="substring-before($arg,'/')"/>
+ </xsl:call-template>
+ <xsl:call-template name="om-kind-of-data">
+ <xsl:with-param name='arg' select="substring-after($arg,'/')"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="contains($arg,'.') or contains($arg,',')">
+ <xsl:element name="OMF">
+ <xsl:attribute name="dec"><xsl:value-of select="$arg"/></xsl:attribute>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="number($arg)">
+ <xsl:choose>
+ <xsl:when test="contains($arg,'-')">
+ <xsl:element name="OMA">
+ <xsl:call-template name='om-minus'/>
+ <xsl:element name="OMI">
+ <xsl:value-of select="substring-after($arg,'-')"/>
+ </xsl:element>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="contains($arg,'+')">
+ <xsl:element name="OMI">
+ <xsl:value-of select="substring-after($arg,'+')"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="OMI">
+ <xsl:value-of select="$arg"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="OMV">
+ <xsl:attribute name="name"><xsl:value-of select="$arg"/></xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='i|n'>
+ <xsl:element name="OMOBJ">
+ <xsl:attribute name="style">inline</xsl:attribute>
+ <xsl:attribute name="xmlns">http://www.openmath.org/OpenMath</xsl:attribute>
+ <xsl:attribute name="version">2.0</xsl:attribute>
+ <xsl:call-template name="om-kind-of-data">
+ <xsl:with-param name='arg' select="text()"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match='v'>
+ <xsl:element name="OMOBJ">
+ <xsl:attribute name="style">inline</xsl:attribute>
+ <xsl:attribute name="xmlns">http://www.openmath.org/OpenMath</xsl:attribute>
+ <xsl:attribute name="version">2.0</xsl:attribute>
+ <xsl:element name="OMV">
+ <xsl:attribute name="name"><xsl:apply-templates/></xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- r a/b split in two parts -->
+
+ <xsl:template match='r'>
+ <xsl:element name="OMOBJ">
+ <xsl:attribute name="style">inline</xsl:attribute>
+ <xsl:attribute name="xmlns">http://www.openmath.org/OpenMath</xsl:attribute>
+ <xsl:attribute name="version">2.0</xsl:attribute>
+ <xsl:element name="OMA">
+ <xsl:variable name='type'>
+ <xsl:choose>
+ <xsl:when test="@type=''">
+ cc
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@type"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="@type='io'">
+ <xsl:call-template name='om-interval-oo'/>
+ <xsl:element name="OMA">
+ <xsl:call-template name='om-minus'/>
+ <xsl:call-template name='om-infinity'/>
+ </xsl:element>
+ <xsl:element name="OMI">
+ <xsl:call-template name='om-kind-of-data'>
+ <xsl:with-param name='arg' select='text()'/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="@type='oi'">
+ <xsl:call-template name='om-interval-oo'/>
+ <xsl:element name="OMI">
+ <xsl:call-template name='om-kind-of-data'>
+ <xsl:with-param name='arg' select='text()'/>
+ </xsl:call-template>
+ </xsl:element>
+ <xsl:call-template name='om-infinity'/>
+ </xsl:when>
+ <xsl:when test="@type='ic'">
+ <xsl:call-template name='om-interval-oc'/>
+ <xsl:element name="OMA">
+ <xsl:call-template name='om-minus'/>
+ <xsl:call-template name='om-infinity'/>
+ </xsl:element>
+ <xsl:element name="OMI">
+ <xsl:call-template name='om-kind-of-data'>
+ <xsl:with-param name='arg' select='text()'/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="@type='ci'">
+ <xsl:call-template name='om-interval-co'/>
+ <xsl:element name="OMI">
+ <xsl:call-template name='om-kind-of-data'>
+ <xsl:with-param name='arg' select='text()'/>
+ </xsl:call-template>
+ </xsl:element>
+ <xsl:call-template name='om-infinity'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="OMS">
+ <xsl:attribute name="cd">interval1</xsl:attribute>
+ <xsl:attribute name="name">interval_<xsl:value-of select="$type"/></xsl:attribute>
+ </xsl:element>
+ <xsl:call-template name="om-kind-of-data">
+ <xsl:with-param name='arg' select="substring-before(text(),':')"/>
+ </xsl:call-template>
+ <xsl:call-template name="om-kind-of-data">
+ <xsl:with-param name='arg' select="substring-after(text(),':')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match='c'>
+ <xsl:element name="OMOBJ">
+ <xsl:attribute name="style">inline</xsl:attribute>
+ <xsl:attribute name="xmlns">http://www.openmath.org/OpenMath</xsl:attribute>
+ <xsl:attribute name="version">2.0</xsl:attribute>
+ <xsl:element name="OMA">
+ <xsl:element name="OMS">
+ <xsl:attribute name="cd">linalg3</xsl:attribute>
+ <xsl:attribute name="name">vector</xsl:attribute>
+ </xsl:element>
+ <xsl:call-template name="om-kind-of-data">
+ <xsl:with-param name='arg' select="substring-before(text(),':')"/>
+ </xsl:call-template>
+ <xsl:call-template name="om-kind-of-data">
+ <xsl:with-param name='arg' select="substring-after(text(),':')"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:element>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/tex/context/base/x-xml-01.tex b/tex/context/base/x-xml-01.tex
new file mode 100644
index 000000000..9502ab71a
--- /dev/null
+++ b/tex/context/base/x-xml-01.tex
@@ -0,0 +1,91 @@
+%D \module
+%D [ file=x-xml-01,
+%D version=2001.10.10,
+%D title=\CONTEXT\ XML Style File,
+%D subtitle=Formatting X?? files,
+%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.
+
+% texexec --use=xml-format yourfile.x** [--mode=packed,wide]
+%
+% pdftotext yourfile.pdf yournewfile.x**
+
+\doifnothing {\inputfilename} {\end}
+\doiffileelse {\inputfilename} {} {\end}
+
+% The following makes pdftotext too slow:
+%
+% \definepapersize
+% [mine]
+% [height=.99\maxdimen,
+% width=200cm]
+%
+% \setuppapersize
+% [mine]
+% [mine]
+%
+% \setupbodyfont
+% [0.4pt,tt]
+%
+% this is faster
+%
+% \setuppapersize
+% [A0][A0]
+%
+% but normal A4 combined with 1 pt font size is the best
+%
+% An alternative is to use a small size, but this leads to
+% too many messages
+%
+% \setupbodyfont
+% [1pt,tt]
+%
+% so we stick to a more normal alternive.
+
+\unprotect
+
+\setuplayout
+ [\c!backspace=0cm,
+ \c!topspace=0cm,
+ %\c!width=40em,
+ \c!width=\v!middle,
+ \c!height=\v!middle,
+ \c!header=0cm,
+ \c!footer=0cm]
+
+\setupbodyfont [tt,10pt]
+\setuptolerance [\v!verytolerant]
+\setupalign [\v!broad,\v!right]
+\setupXMLfile [\c!level=2]
+
+\startmode[wide]
+
+ \setuplayout [\c!width=250cm]
+
+\stopmode
+
+\startmode[packed]
+
+% \setupXMLfile [inbetween=]
+ \setupXMLfile [\c!tussen=]
+
+\stopmode
+
+\protect
+
+% The main text:
+
+\def\XMLbannerprocessor#1{\string<\string ?xml #1\string ?\string>\endgraf}
+
+\defineXMLprocessor [xml] {\XMLbannerprocessor}
+
+\starttext
+
+ \dontcomplain \showXMLfile{\inputfilename}
+
+\stoptext
diff --git a/tex/context/base/x-xml-02.tex b/tex/context/base/x-xml-02.tex
new file mode 100644
index 000000000..24f811c4d
--- /dev/null
+++ b/tex/context/base/x-xml-02.tex
@@ -0,0 +1,91 @@
+%D \module
+%D [ file=x-xml-02,
+%D version=2001.10.10,
+%D title=\CONTEXT\ XML Style File,
+%D subtitle=Pretty Printing,
+%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.
+
+% texexec --use=xml-pretty yourfile.x** [--mode=letter]
+
+\doifnothing {\inputfilename} {\end}
+\doiffileelse {\inputfilename} {} {\end}
+
+\startmode[letter]
+ \setuppapersize[letter][letter]
+\stopmode
+
+\setuplayout
+ [backspace=1.5cm,
+ topspace=1.5cm,
+ bottomspace=1cm,
+ width=middle,
+ height=middle,
+ header=1.5cm,
+ footer=1.5cm]
+
+\setupcolors
+ [state=local]
+
+\setuppagenumbering
+ [location=]
+
+\setuplayout
+ [style=type]
+
+\setupbodyfont
+ [10pt,tt]
+
+\setuptolerance
+ [verytolerant]
+
+\setupalign
+ [broad,right]
+
+\lowercasestring\inputfilename \to \lcinputfilename
+\defconvertedcommand\lcinputfilename\lcinputfilename % make _ safe
+
+\setupheadertexts
+ [\lcinputfilename]
+
+\setupfootertexts
+ [\currentdate\space\string| \currenttime\space \string| \pagenumber]
+
+% let's have a look at the type of content:
+
+\setupXMLfile
+ [level=2]
+
+\startmode[*suffix-xml]
+ % ok
+\stopmode
+
+\startmode[*suffix-rng]
+ \showXMLlin[value]
+\stopmode
+
+\startmode[*suffix-rlg]
+ \showXMLlin
+ [rl:type,rl:state,rl:name,rl:suffix,rl:label,rl:file,rl:original,
+ rl:width,rl:height,rl:base,rl:page]
+\stopmode
+
+\startmode[*suffix-exa]
+ \showXMLlin
+ [exa:resolve,exa:include]
+\stopmode
+
+\def\XMLbannerprocessor#1{\string<\string ?xml #1\string ?\string>\endgraf}
+
+\defineXMLprocessor [xml] {\XMLbannerprocessor}
+
+\starttext
+
+\showXMLfile{\inputfilename}
+
+\stoptext
diff --git a/tex/context/base/x-xml-11.tex b/tex/context/base/x-xml-11.tex
new file mode 100644
index 000000000..c1b185b55
--- /dev/null
+++ b/tex/context/base/x-xml-11.tex
@@ -0,0 +1,134 @@
+%D \module
+%D [ file=x-xml-11,
+%D version=2004.09.16,
+%D title=\CONTEXT\ XML Style File,
+%D subtitle=Formatting X?? files,
+%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.
+
+% xmltools --analyze yourfile.xml
+% texexec --use=xml-analyze yourfile.*
+
+% \doifnothing {\inputfilename} {\end}
+% \doiffileelse {\inputfilename} {} {\end}
+
+\doifnothing {\jobfullname} {\end}
+\doiffileelse {\jobfullname} {} {\end}
+
+\useXMLfilter[ent]
+\useXMLfilter[utf]
+
+\chardef\XMLtokensreduction\plustwo
+
+\definehead
+ [SomeElement]
+ [subsection]
+
+\setuphead
+ [SomeElement]
+ [ownnumber=yes,
+ style=\tfb,
+ numberstyle=\tfxx,
+ alternative=margin]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ backspace=2cm,
+ cutspace=1cm,
+ topspace=1cm,
+ header=0pt]
+
+\setupfootertexts
+ [\jobfullname] % [\inputfilename]
+
+\usetypescript[modern][texnansi] \setupbodyfont[modern,tt,10pt]
+
+\defineXMLenvironment
+ [document]
+ {}
+ {}
+
+\defineXMLpickup
+ [entities][n=0]
+ {\expanded{\SomeElement{\XMLop{n}}{Entities}}
+ \starttabulate[|l|l|l|]}
+ {\stoptabulate}
+
+\defineXMLcommand % ugly hack (make macro of it)
+ [entity][name=,n=0]
+ {\startexpanded
+ \noexpand \NC \XMLop{name}
+ \noexpand \NC \XMLop{n}
+ \noexpand \NC \noexpand\doXMLentity\XMLop{name};
+ \noexpand \NC
+ \noexpand \NR
+ \stopexpanded}
+
+\defineXMLpickup
+ [characters][n=0]
+ {\expanded{\SomeElement{\XMLop{n}}{Characters}}
+ \bgroup
+ \let\nonbreakablespace\empty % messes up the table
+ \starttabulate[|l|r|r|l|l|l|l|]}
+ {\stoptabulate
+ \egroup}
+
+% todo: narrowtt
+
+\defineXMLcommand
+ [character][number=,utf=,n=0,uname=,pname=,cname=]
+ {\startexpanded
+ \noexpand \NC \noexpand \unicodehexnumber{\XMLop{number}}
+ \noexpand \NC \XMLop{number}
+ \noexpand \NC \XMLop{n}
+ \noexpand \NC \noexpand \unicodechar {\XMLop{number}}
+ \noexpand \NC \tx \lowercase\expandafter{\XMLop{uname}}
+ \noexpand \NC \tx \noexpand \unicodepair {\XMLop{number}}
+ \noexpand \NC \tx \XMLop{cname}
+ \noexpand \NC
+ \noexpand \NR
+ \stopexpanded}
+
+\defineXMLenvironment
+ [elements]
+ {}
+ {}
+
+\newtoks \TabulateToks
+
+\defineXMLpickup
+ [element][name=,n=0]
+ {\expanded{\SomeElement{\XMLop{n}}{\XMLop{name}}}
+ \TabulateToks\emptytoks}
+ {\starttabulate[|l|r|p|]
+ \the\TabulateToks
+ \stoptabulate}
+
+\defineXMLenvironment
+ [attribute][name=]
+ {\xdef\AttributeName{\XMLop{name}}}
+ {}
+
+\defineXMLenvironment
+ [instance][value=,n=0]
+ {\appendetoks
+ \noexpand \NC \AttributeName
+ \noexpand \NC \XMLop{n}
+ \noexpand \NC \XMLop{value}
+ \noexpand \NC
+ \noexpand \NR
+ \to \TabulateToks}
+ {\xdef\AttributeName{}}
+
+\starttext
+
+% \processXMLfilegrouped{\inputfilename}
+\processXMLfilegrouped{\jobfullname}
+
+\stoptext
diff --git a/tex/context/base/x-xtag.mkiv b/tex/context/base/x-xtag.mkiv
new file mode 100644
index 000000000..d7e2f2559
--- /dev/null
+++ b/tex/context/base/x-xtag.mkiv
@@ -0,0 +1,23 @@
+%D \module
+%D [ file=x-xtag,
+%D version=2009.09.23,
+%D title=\CONTEXT\ Modules,
+%D subtitle=\XML\ stream handler,
+%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.
+
+\ifdefined\XMLbanner \endinput \fi
+
+\loadcorefile{xtag-ini}
+\loadcorefile{xtag-ext}
+\loadcorefile{xtag-exp}
+\loadcorefile{xtag-pre} % has old encoding code
+\loadcorefile{xtag-xsd} % will go away (stub anyway)
+\loadcorefile{xtag-rng} % will go away (stub anyway)
+
+\endinput
diff --git a/tex/context/base/xetx-chr.mkii b/tex/context/base/xetx-chr.mkii
new file mode 100644
index 000000000..31f15a0cb
--- /dev/null
+++ b/tex/context/base/xetx-chr.mkii
@@ -0,0 +1,1167 @@
+% filename : xetx-chr.tex
+% comment : generated by mtxrun --script chars --xtx
+% author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+% copyright: PRAGMA ADE / ConTeXt Development Team
+% license : see context related readme files
+
+% named characters mapped onto utf (\\char is needed for accents)
+
+\def\textbackslash {\char"0005C } % REVERSE SOLIDUS: \
+\def\textasciicircum {\char"0005E } % CIRCUMFLEX ACCENT: ^
+\def\textunderscore {\char"0005F } % LOW LINE: _
+\def\textgrave {\char"00060 } % GRAVE ACCENT: `
+\def\idotaccent {\char"00069 } % LATIN SMALL LETTER I: i
+\def\textbraceleft {\char"0007B } % LEFT CURLY BRACKET: {
+\def\textbar {\char"0007C } % VERTICAL LINE: |
+\def\textbraceright {\char"0007D } % RIGHT CURLY BRACKET: }
+\def\textasciitilde {\char"0007E } % TILDE: ~
+\def\nobreakspace {\char"000A0 } % NO-BREAK SPACE:  
+\def\exclamdown {\char"000A1 } % INVERTED EXCLAMATION MARK: ¡
+\def\textcent {\char"000A2 } % CENT SIGN: ¢
+\def\textsterling {\char"000A3 } % POUND SIGN: £
+\def\textcurrency {\char"000A4 } % CURRENCY SIGN: ¤
+\def\textyen {\char"000A5 } % YEN SIGN: ¥
+\def\textbrokenbar {\char"000A6 } % BROKEN BAR: ¦
+\def\sectionmark {\char"000A7 } % SECTION SIGN: §
+\def\textdiaeresis {\char"000A8 } % DIAERESIS: ¨
+\def\copyright {\char"000A9 } % COPYRIGHT SIGN: ©
+\def\ordfeminine {\char"000AA } % FEMININE ORDINAL INDICATOR: ª
+\def\leftguillemot {\char"000AB } % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK: «
+\def\textlognot {\char"000AC } % NOT SIGN: ¬
+\def\softhyphen {\char"000AD } % SOFT HYPHEN: ­
+\def\registered {\char"000AE } % REGISTERED SIGN: ®
+\def\textmacron {\char"000AF } % MACRON: ¯
+\def\textdegree {\char"000B0 } % DEGREE SIGN: °
+\def\textpm {\char"000B1 } % PLUS-MINUS SIGN: ±
+\def\twosuperior {\char"000B2 } % SUPERSCRIPT TWO: ²
+\def\threesuperior {\char"000B3 } % SUPERSCRIPT THREE: ³
+\def\textacute {\char"000B4 } % ACUTE ACCENT: ´
+\def\textmu {\char"000B5 } % MICRO SIGN: µ
+\def\paragraphmark {\char"000B6 } % PILCROW SIGN: ¶
+\def\periodcentered {\char"000B7 } % MIDDLE DOT: ·
+\def\textcedilla {\char"000B8 } % CEDILLA: ¸
+\def\onesuperior {\char"000B9 } % SUPERSCRIPT ONE: ¹
+\def\ordmasculine {\char"000BA } % MASCULINE ORDINAL INDICATOR: º
+\def\rightguillemot {\char"000BB } % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK: »
+\def\onequarter {\char"000BC } % VULGAR FRACTION ONE QUARTER: ¼
+\def\onehalf {\char"000BD } % VULGAR FRACTION ONE HALF: ½
+\def\threequarter {\char"000BE } % VULGAR FRACTION THREE QUARTERS: ¾
+\def\questiondown {\char"000BF } % INVERTED QUESTION MARK: ¿
+\def\Agrave {\char"000C0 } % LATIN CAPITAL LETTER A WITH GRAVE: À
+\def\Aacute {\char"000C1 } % LATIN CAPITAL LETTER A WITH ACUTE: Á
+\def\Acircumflex {\char"000C2 } % LATIN CAPITAL LETTER A WITH CIRCUMFLEX: Â
+\def\Atilde {\char"000C3 } % LATIN CAPITAL LETTER A WITH TILDE: Ã
+\def\Adiaeresis {\char"000C4 } % LATIN CAPITAL LETTER A WITH DIAERESIS: Ä
+\def\Aring {\char"000C5 } % LATIN CAPITAL LETTER A WITH RING ABOVE: Å
+\def\AEligature {\char"000C6 } % LATIN CAPITAL LETTER AE: Æ
+\def\Ccedilla {\char"000C7 } % LATIN CAPITAL LETTER C WITH CEDILLA: Ç
+\def\Egrave {\char"000C8 } % LATIN CAPITAL LETTER E WITH GRAVE: È
+\def\Eacute {\char"000C9 } % LATIN CAPITAL LETTER E WITH ACUTE: É
+\def\Ecircumflex {\char"000CA } % LATIN CAPITAL LETTER E WITH CIRCUMFLEX: Ê
+\def\Ediaeresis {\char"000CB } % LATIN CAPITAL LETTER E WITH DIAERESIS: Ë
+\def\Igrave {\char"000CC } % LATIN CAPITAL LETTER I WITH GRAVE: Ì
+\def\Iacute {\char"000CD } % LATIN CAPITAL LETTER I WITH ACUTE: Í
+\def\Icircumflex {\char"000CE } % LATIN CAPITAL LETTER I WITH CIRCUMFLEX: Î
+\def\Idiaeresis {\char"000CF } % LATIN CAPITAL LETTER I WITH DIAERESIS: Ï
+\def\Eth {\char"000D0 } % LATIN CAPITAL LETTER ETH: Ð
+\def\Ntilde {\char"000D1 } % LATIN CAPITAL LETTER N WITH TILDE: Ñ
+\def\Ograve {\char"000D2 } % LATIN CAPITAL LETTER O WITH GRAVE: Ò
+\def\Oacute {\char"000D3 } % LATIN CAPITAL LETTER O WITH ACUTE: Ó
+\def\Ocircumflex {\char"000D4 } % LATIN CAPITAL LETTER O WITH CIRCUMFLEX: Ô
+\def\Otilde {\char"000D5 } % LATIN CAPITAL LETTER O WITH TILDE: Õ
+\def\Odiaeresis {\char"000D6 } % LATIN CAPITAL LETTER O WITH DIAERESIS: Ö
+\def\textmultiply {\char"000D7 } % MULTIPLICATION SIGN: ×
+\def\Ostroke {\char"000D8 } % LATIN CAPITAL LETTER O WITH STROKE: Ø
+\def\Ugrave {\char"000D9 } % LATIN CAPITAL LETTER U WITH GRAVE: Ù
+\def\Uacute {\char"000DA } % LATIN CAPITAL LETTER U WITH ACUTE: Ú
+\def\Ucircumflex {\char"000DB } % LATIN CAPITAL LETTER U WITH CIRCUMFLEX: Û
+\def\Udiaeresis {\char"000DC } % LATIN CAPITAL LETTER U WITH DIAERESIS: Ü
+\def\Yacute {\char"000DD } % LATIN CAPITAL LETTER Y WITH ACUTE: Ý
+\def\Thorn {\char"000DE } % LATIN CAPITAL LETTER THORN: Þ
+\def\ssharp {\char"000DF } % LATIN SMALL LETTER SHARP S: ß
+\def\agrave {\char"000E0 } % LATIN SMALL LETTER A WITH GRAVE: à
+\def\aacute {\char"000E1 } % LATIN SMALL LETTER A WITH ACUTE: á
+\def\acircumflex {\char"000E2 } % LATIN SMALL LETTER A WITH CIRCUMFLEX: â
+\def\atilde {\char"000E3 } % LATIN SMALL LETTER A WITH TILDE: ã
+\def\adiaeresis {\char"000E4 } % LATIN SMALL LETTER A WITH DIAERESIS: ä
+\def\aring {\char"000E5 } % LATIN SMALL LETTER A WITH RING ABOVE: å
+\def\aeligature {\char"000E6 } % LATIN SMALL LETTER AE: æ
+\def\ccedilla {\char"000E7 } % LATIN SMALL LETTER C WITH CEDILLA: ç
+\def\egrave {\char"000E8 } % LATIN SMALL LETTER E WITH GRAVE: è
+\def\eacute {\char"000E9 } % LATIN SMALL LETTER E WITH ACUTE: é
+\def\ecircumflex {\char"000EA } % LATIN SMALL LETTER E WITH CIRCUMFLEX: ê
+\def\ediaeresis {\char"000EB } % LATIN SMALL LETTER E WITH DIAERESIS: ë
+\def\igrave {\char"000EC } % LATIN SMALL LETTER I WITH GRAVE: ì
+\def\iacute {\char"000ED } % LATIN SMALL LETTER I WITH ACUTE: í
+\def\icircumflex {\char"000EE } % LATIN SMALL LETTER I WITH CIRCUMFLEX: î
+\def\idiaeresis {\char"000EF } % LATIN SMALL LETTER I WITH DIAERESIS: ï
+\def\ntilde {\char"000F1 } % LATIN SMALL LETTER N WITH TILDE: ñ
+\def\ograve {\char"000F2 } % LATIN SMALL LETTER O WITH GRAVE: ò
+\def\oacute {\char"000F3 } % LATIN SMALL LETTER O WITH ACUTE: ó
+\def\ocircumflex {\char"000F4 } % LATIN SMALL LETTER O WITH CIRCUMFLEX: ô
+\def\otilde {\char"000F5 } % LATIN SMALL LETTER O WITH TILDE: õ
+\def\odiaeresis {\char"000F6 } % LATIN SMALL LETTER O WITH DIAERESIS: ö
+\def\textdiv {\char"000F7 } % DIVISION SIGN: ÷
+\def\ostroke {\char"000F8 } % LATIN SMALL LETTER O WITH STROKE: ø
+\def\ugrave {\char"000F9 } % LATIN SMALL LETTER U WITH GRAVE: ù
+\def\uacute {\char"000FA } % LATIN SMALL LETTER U WITH ACUTE: ú
+\def\ucircumflex {\char"000FB } % LATIN SMALL LETTER U WITH CIRCUMFLEX: û
+\def\udiaeresis {\char"000FC } % LATIN SMALL LETTER U WITH DIAERESIS: ü
+\def\yacute {\char"000FD } % LATIN SMALL LETTER Y WITH ACUTE: ý
+\def\thorn {\char"000FE } % LATIN SMALL LETTER THORN: þ
+\def\ydiaeresis {\char"000FF } % LATIN SMALL LETTER Y WITH DIAERESIS: ÿ
+\def\Amacron {\char"00100 } % LATIN CAPITAL LETTER A WITH MACRON: Ā
+\def\amacron {\char"00101 } % LATIN SMALL LETTER A WITH MACRON: ā
+\def\Abreve {\char"00102 } % LATIN CAPITAL LETTER A WITH BREVE: Ă
+\def\abreve {\char"00103 } % LATIN SMALL LETTER A WITH BREVE: ă
+\def\Aogonek {\char"00104 } % LATIN CAPITAL LETTER A WITH OGONEK: Ą
+\def\aogonek {\char"00105 } % LATIN SMALL LETTER A WITH OGONEK: ą
+\def\Cacute {\char"00106 } % LATIN CAPITAL LETTER C WITH ACUTE: Ć
+\def\cacute {\char"00107 } % LATIN SMALL LETTER C WITH ACUTE: ć
+\def\Ccircumflex {\char"00108 } % LATIN CAPITAL LETTER C WITH CIRCUMFLEX: Ĉ
+\def\ccircumflex {\char"00109 } % LATIN SMALL LETTER C WITH CIRCUMFLEX: ĉ
+\def\Cdotaccent {\char"0010A } % LATIN CAPITAL LETTER C WITH DOT ABOVE: Ċ
+\def\cdotaccent {\char"0010B } % LATIN SMALL LETTER C WITH DOT ABOVE: ċ
+\def\Ccaron {\char"0010C } % LATIN CAPITAL LETTER C WITH CARON: Č
+\def\ccaron {\char"0010D } % LATIN SMALL LETTER C WITH CARON: č
+\def\Dcaron {\char"0010E } % LATIN CAPITAL LETTER D WITH CARON: Ď
+\def\dcaron {\char"0010F } % LATIN SMALL LETTER D WITH CARON: ď
+\def\Dstroke {\char"00110 } % LATIN CAPITAL LETTER D WITH STROKE: Đ
+\def\dstroke {\char"00111 } % LATIN SMALL LETTER D WITH STROKE: đ
+\def\Emacron {\char"00112 } % LATIN CAPITAL LETTER E WITH MACRON: Ē
+\def\emacron {\char"00113 } % LATIN SMALL LETTER E WITH MACRON: ē
+\def\Ebreve {\char"00114 } % LATIN CAPITAL LETTER E WITH BREVE: Ĕ
+\def\ebreve {\char"00115 } % LATIN SMALL LETTER E WITH BREVE: ĕ
+\def\Edotaccent {\char"00116 } % LATIN CAPITAL LETTER E WITH DOT ABOVE: Ė
+\def\edotaccent {\char"00117 } % LATIN SMALL LETTER E WITH DOT ABOVE: ė
+\def\Eogonek {\char"00118 } % LATIN CAPITAL LETTER E WITH OGONEK: Ę
+\def\eogonek {\char"00119 } % LATIN SMALL LETTER E WITH OGONEK: ę
+\def\Ecaron {\char"0011A } % LATIN CAPITAL LETTER E WITH CARON: Ě
+\def\ecaron {\char"0011B } % LATIN SMALL LETTER E WITH CARON: ě
+\def\Gcircumflex {\char"0011C } % LATIN CAPITAL LETTER G WITH CIRCUMFLEX: Ĝ
+\def\gcircumflex {\char"0011D } % LATIN SMALL LETTER G WITH CIRCUMFLEX: ĝ
+\def\Gbreve {\char"0011E } % LATIN CAPITAL LETTER G WITH BREVE: Ğ
+\def\gbreve {\char"0011F } % LATIN SMALL LETTER G WITH BREVE: ğ
+\def\Gdotaccent {\char"00120 } % LATIN CAPITAL LETTER G WITH DOT ABOVE: Ġ
+\def\gdotaccent {\char"00121 } % LATIN SMALL LETTER G WITH DOT ABOVE: ġ
+\def\Gcommaaccent {\char"00122 } % LATIN CAPITAL LETTER G WITH CEDILLA: Ģ
+\def\gcommaaccent {\char"00123 } % LATIN SMALL LETTER G WITH CEDILLA: ģ
+\def\Hcircumflex {\char"00124 } % LATIN CAPITAL LETTER H WITH CIRCUMFLEX: Ĥ
+\def\hcircumflex {\char"00125 } % LATIN SMALL LETTER H WITH CIRCUMFLEX: ĥ
+\def\Hstroke {\char"00126 } % LATIN CAPITAL LETTER H WITH STROKE: Ħ
+\def\hstroke {\char"00127 } % LATIN SMALL LETTER H WITH STROKE: ħ
+\def\Itilde {\char"00128 } % LATIN CAPITAL LETTER I WITH TILDE: Ĩ
+\def\itilde {\char"00129 } % LATIN SMALL LETTER I WITH TILDE: ĩ
+\def\Imacron {\char"0012A } % LATIN CAPITAL LETTER I WITH MACRON: Ī
+\def\imacron {\char"0012B } % LATIN SMALL LETTER I WITH MACRON: ī
+\def\Ibreve {\char"0012C } % LATIN CAPITAL LETTER I WITH BREVE: Ĭ
+\def\ibreve {\char"0012D } % LATIN SMALL LETTER I WITH BREVE: ĭ
+\def\Iogonek {\char"0012E } % LATIN CAPITAL LETTER I WITH OGONEK: Į
+\def\iogonek {\char"0012F } % LATIN SMALL LETTER I WITH OGONEK: į
+\def\Idotaccent {\char"00130 } % LATIN CAPITAL LETTER I WITH DOT ABOVE: İ
+\def\dotlessi {\char"00131 } % LATIN SMALL LETTER DOTLESS I: ı
+\def\IJligature {\char"00132 } % LATIN CAPITAL LIGATURE IJ: IJ
+\def\ijligature {\char"00133 } % LATIN SMALL LIGATURE IJ: ij
+\def\Jcircumflex {\char"00134 } % LATIN CAPITAL LETTER J WITH CIRCUMFLEX: Ĵ
+\def\jcircumflex {\char"00135 } % LATIN SMALL LETTER J WITH CIRCUMFLEX: ĵ
+\def\Kcommaaccent {\char"00136 } % LATIN CAPITAL LETTER K WITH CEDILLA: Ķ
+\def\kcommaaccent {\char"00137 } % LATIN SMALL LETTER K WITH CEDILLA: ķ
+\def\kkra {\char"00138 } % LATIN SMALL LETTER KRA: ĸ
+\def\Lacute {\char"00139 } % LATIN CAPITAL LETTER L WITH ACUTE: Ĺ
+\def\lacute {\char"0013A } % LATIN SMALL LETTER L WITH ACUTE: ĺ
+\def\Lcommaaccent {\char"0013B } % LATIN CAPITAL LETTER L WITH CEDILLA: Ļ
+\def\lcommaaccent {\char"0013C } % LATIN SMALL LETTER L WITH CEDILLA: ļ
+\def\Lcaron {\char"0013D } % LATIN CAPITAL LETTER L WITH CARON: Ľ
+\def\lcaron {\char"0013E } % LATIN SMALL LETTER L WITH CARON: ľ
+\def\Ldotmiddle {\char"0013F } % LATIN CAPITAL LETTER L WITH MIDDLE DOT: Ŀ
+\def\ldotmiddle {\char"00140 } % LATIN SMALL LETTER L WITH MIDDLE DOT: ŀ
+\def\Lstroke {\char"00141 } % LATIN CAPITAL LETTER L WITH STROKE: Ł
+\def\lstroke {\char"00142 } % LATIN SMALL LETTER L WITH STROKE: ł
+\def\Nacute {\char"00143 } % LATIN CAPITAL LETTER N WITH ACUTE: Ń
+\def\nacute {\char"00144 } % LATIN SMALL LETTER N WITH ACUTE: ń
+\def\Ncommaaccent {\char"00145 } % LATIN CAPITAL LETTER N WITH CEDILLA: Ņ
+\def\ncommaaccent {\char"00146 } % LATIN SMALL LETTER N WITH CEDILLA: ņ
+\def\Ncaron {\char"00147 } % LATIN CAPITAL LETTER N WITH CARON: Ň
+\def\ncaron {\char"00148 } % LATIN SMALL LETTER N WITH CARON: ň
+\def\napostrophe {\char"00149 } % LATIN SMALL LETTER N PRECEDED BY APOSTROPHE: ʼn
+\def\Neng {\char"0014A } % LATIN CAPITAL LETTER ENG: Ŋ
+\def\neng {\char"0014B } % LATIN SMALL LETTER ENG: ŋ
+\def\Omacron {\char"0014C } % LATIN CAPITAL LETTER O WITH MACRON: Ō
+\def\omacron {\char"0014D } % LATIN SMALL LETTER O WITH MACRON: ō
+\def\Obreve {\char"0014E } % LATIN CAPITAL LETTER O WITH BREVE: Ŏ
+\def\obreve {\char"0014F } % LATIN SMALL LETTER O WITH BREVE: ŏ
+\def\Ohungarumlaut {\char"00150 } % LATIN CAPITAL LETTER O WITH DOUBLE ACUTE: Ő
+\def\ohungarumlaut {\char"00151 } % LATIN SMALL LETTER O WITH DOUBLE ACUTE: ő
+\def\OEligature {\char"00152 } % LATIN CAPITAL LIGATURE OE: Œ
+\def\oeligature {\char"00153 } % LATIN SMALL LIGATURE OE: œ
+\def\Racute {\char"00154 } % LATIN CAPITAL LETTER R WITH ACUTE: Ŕ
+\def\racute {\char"00155 } % LATIN SMALL LETTER R WITH ACUTE: ŕ
+\def\Rcommaaccent {\char"00156 } % LATIN CAPITAL LETTER R WITH CEDILLA: Ŗ
+\def\rcommaaccent {\char"00157 } % LATIN SMALL LETTER R WITH CEDILLA: ŗ
+\def\Rcaron {\char"00158 } % LATIN CAPITAL LETTER R WITH CARON: Ř
+\def\rcaron {\char"00159 } % LATIN SMALL LETTER R WITH CARON: ř
+\def\Sacute {\char"0015A } % LATIN CAPITAL LETTER S WITH ACUTE: Ś
+\def\sacute {\char"0015B } % LATIN SMALL LETTER S WITH ACUTE: ś
+\def\Scircumflex {\char"0015C } % LATIN CAPITAL LETTER S WITH CIRCUMFLEX: Ŝ
+\def\scircumflex {\char"0015D } % LATIN SMALL LETTER S WITH CIRCUMFLEX: ŝ
+\def\Scedilla {\char"0015E } % LATIN CAPITAL LETTER S WITH CEDILLA: Ş
+\def\scedilla {\char"0015F } % LATIN SMALL LETTER S WITH CEDILLA: ş
+\def\Scaron {\char"00160 } % LATIN CAPITAL LETTER S WITH CARON: Š
+\def\scaron {\char"00161 } % LATIN SMALL LETTER S WITH CARON: š
+\def\Tcedilla {\char"00162 } % LATIN CAPITAL LETTER T WITH CEDILLA: Ţ
+\def\tcedilla {\char"00163 } % LATIN SMALL LETTER T WITH CEDILLA: ţ
+\def\Tcaron {\char"00164 } % LATIN CAPITAL LETTER T WITH CARON: Ť
+\def\tcaron {\char"00165 } % LATIN SMALL LETTER T WITH CARON: ť
+\def\Tstroke {\char"00166 } % LATIN CAPITAL LETTER T WITH STROKE: Ŧ
+\def\tstroke {\char"00167 } % LATIN SMALL LETTER T WITH STROKE: ŧ
+\def\Utilde {\char"00168 } % LATIN CAPITAL LETTER U WITH TILDE: Ũ
+\def\utilde {\char"00169 } % LATIN SMALL LETTER U WITH TILDE: ũ
+\def\Umacron {\char"0016A } % LATIN CAPITAL LETTER U WITH MACRON: Ū
+\def\umacron {\char"0016B } % LATIN SMALL LETTER U WITH MACRON: ū
+\def\Ubreve {\char"0016C } % LATIN CAPITAL LETTER U WITH BREVE: Ŭ
+\def\ubreve {\char"0016D } % LATIN SMALL LETTER U WITH BREVE: ŭ
+\def\Uring {\char"0016E } % LATIN CAPITAL LETTER U WITH RING ABOVE: Ů
+\def\uring {\char"0016F } % LATIN SMALL LETTER U WITH RING ABOVE: ů
+\def\Uhungarumlaut {\char"00170 } % LATIN CAPITAL LETTER U WITH DOUBLE ACUTE: Ű
+\def\uhungarumlaut {\char"00171 } % LATIN SMALL LETTER U WITH DOUBLE ACUTE: ű
+\def\Uogonek {\char"00172 } % LATIN CAPITAL LETTER U WITH OGONEK: Ų
+\def\uogonek {\char"00173 } % LATIN SMALL LETTER U WITH OGONEK: ų
+\def\Wcircumflex {\char"00174 } % LATIN CAPITAL LETTER W WITH CIRCUMFLEX: Ŵ
+\def\wcircumflex {\char"00175 } % LATIN SMALL LETTER W WITH CIRCUMFLEX: ŵ
+\def\Ycircumflex {\char"00176 } % LATIN CAPITAL LETTER Y WITH CIRCUMFLEX: Ŷ
+\def\ycircumflex {\char"00177 } % LATIN SMALL LETTER Y WITH CIRCUMFLEX: ŷ
+\def\Ydiaeresis {\char"00178 } % LATIN CAPITAL LETTER Y WITH DIAERESIS: Ÿ
+\def\Zacute {\char"00179 } % LATIN CAPITAL LETTER Z WITH ACUTE: Ź
+\def\zacute {\char"0017A } % LATIN SMALL LETTER Z WITH ACUTE: ź
+\def\Zdotaccent {\char"0017B } % LATIN CAPITAL LETTER Z WITH DOT ABOVE: Ż
+\def\zdotaccent {\char"0017C } % LATIN SMALL LETTER Z WITH DOT ABOVE: ż
+\def\Zcaron {\char"0017D } % LATIN CAPITAL LETTER Z WITH CARON: Ž
+\def\zcaron {\char"0017E } % LATIN SMALL LETTER Z WITH CARON: ž
+\def\slong {\char"0017F } % LATIN SMALL LETTER LONG S: ſ
+\def\bstroke {\char"00180 } % LATIN SMALL LETTER B WITH STROKE: ƀ
+\def\Bhook {\char"00181 } % LATIN CAPITAL LETTER B WITH HOOK: Ɓ
+\def\Chook {\char"00187 } % LATIN CAPITAL LETTER C WITH HOOK: Ƈ
+\def\chook {\char"00188 } % LATIN SMALL LETTER C WITH HOOK: ƈ
+\def\Dafrican {\char"00189 } % LATIN CAPITAL LETTER AFRICAN D: Ɖ
+\def\Dhook {\char"0018A } % LATIN CAPITAL LETTER D WITH HOOK: Ɗ
+\def\Schwa {\char"0018F } % LATIN CAPITAL LETTER SCHWA: Ə
+\def\Fhook {\char"00191 } % LATIN CAPITAL LETTER F WITH HOOK: Ƒ
+\def\fhook {\char"00192 } % LATIN SMALL LETTER F WITH HOOK: ƒ
+\def\Ghook {\char"00193 } % LATIN CAPITAL LETTER G WITH HOOK: Ɠ
+\def\Istroke {\char"00197 } % LATIN CAPITAL LETTER I WITH STROKE: Ɨ
+\def\Khook {\char"00198 } % LATIN CAPITAL LETTER K WITH HOOK: Ƙ
+\def\khook {\char"00199 } % LATIN SMALL LETTER K WITH HOOK: ƙ
+\def\lbar {\char"0019A } % LATIN SMALL LETTER L WITH BAR: ƚ
+\def\Ohorn {\char"001A0 } % LATIN CAPITAL LETTER O WITH HORN: Ơ
+\def\ohorn {\char"001A1 } % LATIN SMALL LETTER O WITH HORN: ơ
+\def\Phook {\char"001A4 } % LATIN CAPITAL LETTER P WITH HOOK: Ƥ
+\def\phook {\char"001A5 } % LATIN SMALL LETTER P WITH HOOK: ƥ
+\def\Thook {\char"001AC } % LATIN CAPITAL LETTER T WITH HOOK: Ƭ
+\def\thook {\char"001AD } % LATIN SMALL LETTER T WITH HOOK: ƭ
+\def\Uhorn {\char"001AF } % LATIN CAPITAL LETTER U WITH HORN: Ư
+\def\uhorn {\char"001B0 } % LATIN SMALL LETTER U WITH HORN: ư
+\def\Uhook {\char"001B2 } % LATIN CAPITAL LETTER V WITH HOOK: Ʋ
+\def\Yhook {\char"001B3 } % LATIN CAPITAL LETTER Y WITH HOOK: Ƴ
+\def\yhook {\char"001B4 } % LATIN SMALL LETTER Y WITH HOOK: ƴ
+\def\Zstroke {\char"001B5 } % LATIN CAPITAL LETTER Z WITH STROKE: Ƶ
+\def\zstroke {\char"001B6 } % LATIN SMALL LETTER Z WITH STROKE: ƶ
+\def\DZcaronligature {\char"001C4 } % LATIN CAPITAL LETTER DZ WITH CARON: DŽ
+\def\Dzcaronligature {\char"001C5 } % LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON: Dž
+\def\dzcaronligature {\char"001C6 } % LATIN SMALL LETTER DZ WITH CARON: dž
+\def\LJligature {\char"001C7 } % LATIN CAPITAL LETTER LJ: LJ
+\def\Ljligature {\char"001C8 } % LATIN CAPITAL LETTER L WITH SMALL LETTER J: Lj
+\def\ljligature {\char"001C9 } % LATIN SMALL LETTER LJ: lj
+\def\NJligature {\char"001CA } % LATIN CAPITAL LETTER NJ: NJ
+\def\Njligature {\char"001CB } % LATIN CAPITAL LETTER N WITH SMALL LETTER J: Nj
+\def\njligature {\char"001CC } % LATIN SMALL LETTER NJ: nj
+\def\Acaron {\char"001CD } % LATIN CAPITAL LETTER A WITH CARON: Ǎ
+\def\acaron {\char"001CE } % LATIN SMALL LETTER A WITH CARON: ǎ
+\def\Icaron {\char"001CF } % LATIN CAPITAL LETTER I WITH CARON: Ǐ
+\def\icaron {\char"001D0 } % LATIN SMALL LETTER I WITH CARON: ǐ
+\def\Ocaron {\char"001D1 } % LATIN CAPITAL LETTER O WITH CARON: Ǒ
+\def\ocaron {\char"001D2 } % LATIN SMALL LETTER O WITH CARON: ǒ
+\def\Ucaron {\char"001D3 } % LATIN CAPITAL LETTER U WITH CARON: Ǔ
+\def\ucaron {\char"001D4 } % LATIN SMALL LETTER U WITH CARON: ǔ
+\def\Udiaeresismacron {\char"001D5 } % LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON: Ǖ
+\def\udiaeresismacron {\char"001D6 } % LATIN SMALL LETTER U WITH DIAERESIS AND MACRON: ǖ
+\def\Udiaeresisacute {\char"001D7 } % LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE: Ǘ
+\def\udiaeresisacute {\char"001D8 } % LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE: ǘ
+\def\Udiaeresiscaron {\char"001D9 } % LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON: Ǚ
+\def\udiaeresiscaron {\char"001DA } % LATIN SMALL LETTER U WITH DIAERESIS AND CARON: ǚ
+\def\Udiaeresisgrave {\char"001DB } % LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE: Ǜ
+\def\udiaeresisgrave {\char"001DC } % LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE: ǜ
+\def\Adiaeresismacron {\char"001DE } % LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON: Ǟ
+\def\adiaeresismacron {\char"001DF } % LATIN SMALL LETTER A WITH DIAERESIS AND MACRON: ǟ
+\def\Adotaccentmacron {\char"001E0 } % LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON: Ǡ
+\def\adotaccentmacron {\char"001E1 } % LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON: ǡ
+\def\AEmacron {\char"001E2 } % LATIN CAPITAL LETTER AE WITH MACRON: Ǣ
+\def\aemacron {\char"001E3 } % LATIN SMALL LETTER AE WITH MACRON: ǣ
+\def\Gstroke {\char"001E4 } % LATIN CAPITAL LETTER G WITH STROKE: Ǥ
+\def\gstroke {\char"001E5 } % LATIN SMALL LETTER G WITH STROKE: ǥ
+\def\Gcaron {\char"001E6 } % LATIN CAPITAL LETTER G WITH CARON: Ǧ
+\def\gcaron {\char"001E7 } % LATIN SMALL LETTER G WITH CARON: ǧ
+\def\Kcaron {\char"001E8 } % LATIN CAPITAL LETTER K WITH CARON: Ǩ
+\def\kcaron {\char"001E9 } % LATIN SMALL LETTER K WITH CARON: ǩ
+\def\Oogonek {\char"001EA } % LATIN CAPITAL LETTER O WITH OGONEK: Ǫ
+\def\oogonek {\char"001EB } % LATIN SMALL LETTER O WITH OGONEK: ǫ
+\def\Oogonekmacron {\char"001EC } % LATIN CAPITAL LETTER O WITH OGONEK AND MACRON: Ǭ
+\def\oogonekmacron {\char"001ED } % LATIN SMALL LETTER O WITH OGONEK AND MACRON: ǭ
+\def\jcaron {\char"001F0 } % LATIN SMALL LETTER J WITH CARON: ǰ
+\def\DZligature {\char"001F1 } % LATIN CAPITAL LETTER DZ: DZ
+\def\Dzligature {\char"001F2 } % LATIN CAPITAL LETTER D WITH SMALL LETTER Z: Dz
+\def\dzligature {\char"001F3 } % LATIN SMALL LETTER DZ: dz
+\def\Gacute {\char"001F4 } % LATIN CAPITAL LETTER G WITH ACUTE: Ǵ
+\def\gacute {\char"001F5 } % LATIN SMALL LETTER G WITH ACUTE: ǵ
+\def\Ngrave {\char"001F8 } % LATIN CAPITAL LETTER N WITH GRAVE: Ǹ
+\def\ngrave {\char"001F9 } % LATIN SMALL LETTER N WITH GRAVE: ǹ
+\def\Aringacute {\char"001FA } % LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE: Ǻ
+\def\aringacute {\char"001FB } % LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE: ǻ
+\def\AEacute {\char"001FC } % LATIN CAPITAL LETTER AE WITH ACUTE: Ǽ
+\def\aeacute {\char"001FD } % LATIN SMALL LETTER AE WITH ACUTE: ǽ
+\def\Ostrokeacute {\char"001FE } % LATIN CAPITAL LETTER O WITH STROKE AND ACUTE: Ǿ
+\def\ostrokeacute {\char"001FF } % LATIN SMALL LETTER O WITH STROKE AND ACUTE: ǿ
+\def\Adoublegrave {\char"00200 } % LATIN CAPITAL LETTER A WITH DOUBLE GRAVE: Ȁ
+\def\adoublegrave {\char"00201 } % LATIN SMALL LETTER A WITH DOUBLE GRAVE: ȁ
+\def\Ainvertedbreve {\char"00202 } % LATIN CAPITAL LETTER A WITH INVERTED BREVE: Ȃ
+\def\ainvertedbreve {\char"00203 } % LATIN SMALL LETTER A WITH INVERTED BREVE: ȃ
+\def\Edoublegrave {\char"00204 } % LATIN CAPITAL LETTER E WITH DOUBLE GRAVE: Ȅ
+\def\edoublegrave {\char"00205 } % LATIN SMALL LETTER E WITH DOUBLE GRAVE: ȅ
+\def\Einvertedbreve {\char"00206 } % LATIN CAPITAL LETTER E WITH INVERTED BREVE: Ȇ
+\def\einvertedbreve {\char"00207 } % LATIN SMALL LETTER E WITH INVERTED BREVE: ȇ
+\def\Idoublegrave {\char"00208 } % LATIN CAPITAL LETTER I WITH DOUBLE GRAVE: Ȉ
+\def\idoublegrave {\char"00209 } % LATIN SMALL LETTER I WITH DOUBLE GRAVE: ȉ
+\def\Iinvertedbreve {\char"0020A } % LATIN CAPITAL LETTER I WITH INVERTED BREVE: Ȋ
+\def\iinvertedbreve {\char"0020B } % LATIN SMALL LETTER I WITH INVERTED BREVE: ȋ
+\def\Odoublegrave {\char"0020C } % LATIN CAPITAL LETTER O WITH DOUBLE GRAVE: Ȍ
+\def\odoublegrave {\char"0020D } % LATIN SMALL LETTER O WITH DOUBLE GRAVE: ȍ
+\def\Oinvertedbreve {\char"0020E } % LATIN CAPITAL LETTER O WITH INVERTED BREVE: Ȏ
+\def\oinvertedbreve {\char"0020F } % LATIN SMALL LETTER O WITH INVERTED BREVE: ȏ
+\def\Rdoublegrave {\char"00210 } % LATIN CAPITAL LETTER R WITH DOUBLE GRAVE: Ȑ
+\def\rdoublegrave {\char"00211 } % LATIN SMALL LETTER R WITH DOUBLE GRAVE: ȑ
+\def\Rinvertedbreve {\char"00212 } % LATIN CAPITAL LETTER R WITH INVERTED BREVE: Ȓ
+\def\rinvertedbreve {\char"00213 } % LATIN SMALL LETTER R WITH INVERTED BREVE: ȓ
+\def\Udoublegrave {\char"00214 } % LATIN CAPITAL LETTER U WITH DOUBLE GRAVE: Ȕ
+\def\udoublegrave {\char"00215 } % LATIN SMALL LETTER U WITH DOUBLE GRAVE: ȕ
+\def\Uinvertedbreve {\char"00216 } % LATIN CAPITAL LETTER U WITH INVERTED BREVE: Ȗ
+\def\uinvertedbreve {\char"00217 } % LATIN SMALL LETTER U WITH INVERTED BREVE: ȗ
+\def\Scommaaccent {\char"00218 } % LATIN CAPITAL LETTER S WITH COMMA BELOW: Ș
+\def\scommaaccent {\char"00219 } % LATIN SMALL LETTER S WITH COMMA BELOW: ș
+\def\Tcommaaccent {\char"0021A } % LATIN CAPITAL LETTER T WITH COMMA BELOW: Ț
+\def\tcommaaccent {\char"0021B } % LATIN SMALL LETTER T WITH COMMA BELOW: ț
+\def\Hcaron {\char"0021E } % LATIN CAPITAL LETTER H WITH CARON: Ȟ
+\def\hcaron {\char"0021F } % LATIN SMALL LETTER H WITH CARON: ȟ
+\def\dcurl {\char"00221 } % LATIN SMALL LETTER D WITH CURL: ȡ
+\def\Zhook {\char"00224 } % LATIN CAPITAL LETTER Z WITH HOOK: Ȥ
+\def\zhook {\char"00225 } % LATIN SMALL LETTER Z WITH HOOK: ȥ
+\def\Adotaccent {\char"00226 } % LATIN CAPITAL LETTER A WITH DOT ABOVE: Ȧ
+\def\adotaccent {\char"00227 } % LATIN SMALL LETTER A WITH DOT ABOVE: ȧ
+\def\Ecedilla {\char"00228 } % LATIN CAPITAL LETTER E WITH CEDILLA: Ȩ
+\def\ecedilla {\char"00229 } % LATIN SMALL LETTER E WITH CEDILLA: ȩ
+\def\Odiaeresismacron {\char"0022A } % LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON: Ȫ
+\def\odiaeresismacron {\char"0022B } % LATIN SMALL LETTER O WITH DIAERESIS AND MACRON: ȫ
+\def\Otildemacron {\char"0022C } % LATIN CAPITAL LETTER O WITH TILDE AND MACRON: Ȭ
+\def\otildemacron {\char"0022D } % LATIN SMALL LETTER O WITH TILDE AND MACRON: ȭ
+\def\Odotaccent {\char"0022E } % LATIN CAPITAL LETTER O WITH DOT ABOVE: Ȯ
+\def\odotaccent {\char"0022F } % LATIN SMALL LETTER O WITH DOT ABOVE: ȯ
+\def\Odotaccentmacron {\char"00230 } % LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON: Ȱ
+\def\odotaccentmacron {\char"00231 } % LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON: ȱ
+\def\Ymacron {\char"00232 } % LATIN CAPITAL LETTER Y WITH MACRON: Ȳ
+\def\ymacron {\char"00233 } % LATIN SMALL LETTER Y WITH MACRON: ȳ
+\def\lcurl {\char"00234 } % LATIN SMALL LETTER L WITH CURL: ȴ
+\def\ncurl {\char"00235 } % LATIN SMALL LETTER N WITH CURL: ȵ
+\def\tcurl {\char"00236 } % LATIN SMALL LETTER T WITH CURL: ȶ
+\def\dotlessj {\char"00237 } % LATIN SMALL LETTER DOTLESS J: ȷ
+\def\Astroke {\char"0023A } % LATIN CAPITAL LETTER A WITH STROKE: Ⱥ
+\def\Cstroke {\char"0023B } % LATIN CAPITAL LETTER C WITH STROKE: Ȼ
+\def\cstroke {\char"0023C } % LATIN SMALL LETTER C WITH STROKE: ȼ
+\def\Lbar {\char"0023D } % LATIN CAPITAL LETTER L WITH BAR: Ƚ
+\def\bhook {\char"00253 } % LATIN SMALL LETTER B WITH HOOK: ɓ
+\def\ccurl {\char"00255 } % LATIN SMALL LETTER C WITH CURL: ɕ
+\def\dtail {\char"00256 } % LATIN SMALL LETTER D WITH TAIL: ɖ
+\def\dhook {\char"00257 } % LATIN SMALL LETTER D WITH HOOK: ɗ
+\def\schwa {\char"00259 } % LATIN SMALL LETTER SCHWA: ə
+\def\schwahook {\char"0025A } % LATIN SMALL LETTER SCHWA WITH HOOK: ɚ
+\def\dotlessjstroke {\char"0025F } % LATIN SMALL LETTER DOTLESS J WITH STROKE: ɟ
+\def\textcircumflex {\char"002C6 } % MODIFIER LETTER CIRCUMFLEX ACCENT: ˆ
+\def\textcaron {\char"002C7 } % CARON: ˇ
+\def\textbreve {\char"002D8 } % BREVE: ˘
+\def\textdotaccent {\char"002D9 } % DOT ABOVE: ˙
+\def\textring {\char"002DA } % RING ABOVE: ˚
+\def\textogonek {\char"002DB } % OGONEK: ˛
+\def\texttilde {\char"002DC } % SMALL TILDE: ˜
+\def\texthungarumlaut {\char"002DD } % DOUBLE ACUTE ACCENT: ˝
+\def\textbottomdot {\char"00323 } % COMBINING DOT BELOW: ̣
+\def\textbottomcomma {\char"00326 } % COMBINING COMMA BELOW: ̦
+\def\greektonos {\char"00384 } % GREEK TONOS: ΄
+\def\greekdialytikatonos {\char"00385 } % GREEK DIALYTIKA TONOS: ΅
+\def\greekAlphatonos {\char"00386 } % GREEK CAPITAL LETTER ALPHA WITH TONOS: Ά
+\def\greekEpsilontonos {\char"00388 } % GREEK CAPITAL LETTER EPSILON WITH TONOS: Έ
+\def\greekEtatonos {\char"00389 } % GREEK CAPITAL LETTER ETA WITH TONOS: Ή
+\def\greekIotatonos {\char"0038A } % GREEK CAPITAL LETTER IOTA WITH TONOS: Ί
+\def\greekOmicrontonos {\char"0038C } % GREEK CAPITAL LETTER OMICRON WITH TONOS: Ό
+\def\greekUpsilontonos {\char"0038E } % GREEK CAPITAL LETTER UPSILON WITH TONOS: Ύ
+\def\greekOmegatonos {\char"0038F } % GREEK CAPITAL LETTER OMEGA WITH TONOS: Ώ
+\def\greekiotadialytikatonos {\char"00390 } % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS: ΐ
+\def\greekAlpha {\char"00391 } % GREEK CAPITAL LETTER ALPHA: Α
+\def\greekBeta {\char"00392 } % GREEK CAPITAL LETTER BETA: Β
+\def\greekGamma {\char"00393 } % GREEK CAPITAL LETTER GAMMA: Γ
+\def\greekDelta {\char"00394 } % GREEK CAPITAL LETTER DELTA: Δ
+\def\greekEpsilon {\char"00395 } % GREEK CAPITAL LETTER EPSILON: Ε
+\def\greekZeta {\char"00396 } % GREEK CAPITAL LETTER ZETA: Ζ
+\def\greekEta {\char"00397 } % GREEK CAPITAL LETTER ETA: Η
+\def\greekTheta {\char"00398 } % GREEK CAPITAL LETTER THETA: Θ
+\def\greekIota {\char"00399 } % GREEK CAPITAL LETTER IOTA: Ι
+\def\greekKappa {\char"0039A } % GREEK CAPITAL LETTER KAPPA: Κ
+\def\greekLambda {\char"0039B } % GREEK CAPITAL LETTER LAMDA: Λ
+\def\greekMu {\char"0039C } % GREEK CAPITAL LETTER MU: Μ
+\def\greekNu {\char"0039D } % GREEK CAPITAL LETTER NU: Ν
+\def\greekXi {\char"0039E } % GREEK CAPITAL LETTER XI: Ξ
+\def\greekOmicron {\char"0039F } % GREEK CAPITAL LETTER OMICRON: Ο
+\def\greekPi {\char"003A0 } % GREEK CAPITAL LETTER PI: Π
+\def\greekRho {\char"003A1 } % GREEK CAPITAL LETTER RHO: Ρ
+\def\greekSigma {\char"003A3 } % GREEK CAPITAL LETTER SIGMA: Σ
+\def\greekTau {\char"003A4 } % GREEK CAPITAL LETTER TAU: Τ
+\def\greekUpsilon {\char"003A5 } % GREEK CAPITAL LETTER UPSILON: Υ
+\def\greekPhi {\char"003A6 } % GREEK CAPITAL LETTER PHI: Φ
+\def\greekChi {\char"003A7 } % GREEK CAPITAL LETTER CHI: Χ
+\def\greekPsi {\char"003A8 } % GREEK CAPITAL LETTER PSI: Ψ
+\def\greekOmega {\char"003A9 } % GREEK CAPITAL LETTER OMEGA: Ω
+\def\greekIotadialytika {\char"003AA } % GREEK CAPITAL LETTER IOTA WITH DIALYTIKA: Ϊ
+\def\greekUpsilondialytika {\char"003AB } % GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA: Ϋ
+\def\greekalphatonos {\char"003AC } % GREEK SMALL LETTER ALPHA WITH TONOS: ά
+\def\greekepsilontonos {\char"003AD } % GREEK SMALL LETTER EPSILON WITH TONOS: έ
+\def\greeketatonos {\char"003AE } % GREEK SMALL LETTER ETA WITH TONOS: ή
+\def\greekiotatonos {\char"003AF } % GREEK SMALL LETTER IOTA WITH TONOS: ί
+\def\greekupsilondialytikatonos {\char"003B0 } % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS: ΰ
+\def\greekalpha {\char"003B1 } % GREEK SMALL LETTER ALPHA: α
+\def\greekbeta {\char"003B2 } % GREEK SMALL LETTER BETA: β
+\def\greekgamma {\char"003B3 } % GREEK SMALL LETTER GAMMA: γ
+\def\greekdelta {\char"003B4 } % GREEK SMALL LETTER DELTA: δ
+\def\greekepsilon {\char"003B5 } % GREEK SMALL LETTER EPSILON: ε
+\def\greekzeta {\char"003B6 } % GREEK SMALL LETTER ZETA: ζ
+\def\greeketa {\char"003B7 } % GREEK SMALL LETTER ETA: η
+\def\greektheta {\char"003B8 } % GREEK SMALL LETTER THETA: θ
+\def\greekiota {\char"003B9 } % GREEK SMALL LETTER IOTA: ι
+\def\greekkappa {\char"003BA } % GREEK SMALL LETTER KAPPA: κ
+\def\greeklambda {\char"003BB } % GREEK SMALL LETTER LAMDA: λ
+\def\greekmu {\char"003BC } % GREEK SMALL LETTER MU: μ
+\def\greeknu {\char"003BD } % GREEK SMALL LETTER NU: ν
+\def\greekxi {\char"003BE } % GREEK SMALL LETTER XI: ξ
+\def\greekomicron {\char"003BF } % GREEK SMALL LETTER OMICRON: ο
+\def\greekpi {\char"003C0 } % GREEK SMALL LETTER PI: π
+\def\greekrho {\char"003C1 } % GREEK SMALL LETTER RHO: ρ
+\def\greekfinalsigma {\char"003C2 } % GREEK SMALL LETTER FINAL SIGMA: ς
+\def\greeksigma {\char"003C3 } % GREEK SMALL LETTER SIGMA: σ
+\def\greektau {\char"003C4 } % GREEK SMALL LETTER TAU: τ
+\def\greekupsilon {\char"003C5 } % GREEK SMALL LETTER UPSILON: υ
+\def\greekphi {\char"003C6 } % GREEK SMALL LETTER PHI: φ
+\def\greekchi {\char"003C7 } % GREEK SMALL LETTER CHI: χ
+\def\greekpsi {\char"003C8 } % GREEK SMALL LETTER PSI: ψ
+\def\greekomega {\char"003C9 } % GREEK SMALL LETTER OMEGA: ω
+\def\greekiotadialytika {\char"003CA } % GREEK SMALL LETTER IOTA WITH DIALYTIKA: ϊ
+\def\greekupsilondiaeresis {\char"003CB } % GREEK SMALL LETTER UPSILON WITH DIALYTIKA: ϋ
+\def\greekomicrontonos {\char"003CC } % GREEK SMALL LETTER OMICRON WITH TONOS: ό
+\def\greekupsilontonos {\char"003CD } % GREEK SMALL LETTER UPSILON WITH TONOS: ύ
+\def\greekomegatonos {\char"003CE } % GREEK SMALL LETTER OMEGA WITH TONOS: ώ
+\def\greekthetaalt {\char"003D1 } % GREEK THETA SYMBOL: ϑ
+\def\greekphialt {\char"003D5 } % GREEK PHI SYMBOL: ϕ
+\def\greekpialt {\char"003D6 } % GREEK PI SYMBOL: ϖ
+\def\greekkoppa {\char"003D9 } % GREEK SMALL LETTER ARCHAIC KOPPA: ϙ
+\def\greekstigma {\char"003DB } % GREEK SMALL LETTER STIGMA: ϛ
+\def\greekdigamma {\char"003DD } % GREEK SMALL LETTER DIGAMMA: ϝ
+\def\greeknumkoppa {\char"003DF } % GREEK SMALL LETTER KOPPA: ϟ
+\def\greeksampi {\char"003E1 } % GREEK SMALL LETTER SAMPI: ϡ
+\def\greekrhoalt {\char"003F1 } % GREEK RHO SYMBOL: ϱ
+\def\greeksigmalunate {\char"003F2 } % GREEK LUNATE SIGMA SYMBOL: ϲ
+\def\greekepsilonalt {\char"003F5 } % GREEK LUNATE EPSILON SYMBOL: ϵ
+\def\greekSigmalunate {\char"003F9 } % GREEK CAPITAL LUNATE SIGMA SYMBOL: Ϲ
+\def\cyrillicEgrave {\char"00400 } % CYRILLIC CAPITAL LETTER IE WITH GRAVE: Ѐ
+\def\cyrillicYO {\char"00401 } % CYRILLIC CAPITAL LETTER IO: Ё
+\def\cyrillicDJE {\char"00402 } % CYRILLIC CAPITAL LETTER DJE: Ђ
+\def\cyrillicGJE {\char"00403 } % CYRILLIC CAPITAL LETTER GJE: Ѓ
+\def\cyrillicIE {\char"00404 } % CYRILLIC CAPITAL LETTER UKRAINIAN IE: Є
+\def\cyrillicDZE {\char"00405 } % CYRILLIC CAPITAL LETTER DZE: Ѕ
+\def\cyrillicII {\char"00406 } % CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I: І
+\def\cyrillicYI {\char"00407 } % CYRILLIC CAPITAL LETTER YI: Ї
+\def\cyrillicJE {\char"00408 } % CYRILLIC CAPITAL LETTER JE: Ј
+\def\cyrillicLJE {\char"00409 } % CYRILLIC CAPITAL LETTER LJE: Љ
+\def\cyrillicNJE {\char"0040A } % CYRILLIC CAPITAL LETTER NJE: Њ
+\def\cyrillicTSHE {\char"0040B } % CYRILLIC CAPITAL LETTER TSHE: Ћ
+\def\cyrillicKJE {\char"0040C } % CYRILLIC CAPITAL LETTER KJE: Ќ
+\def\cyrillicIgrave {\char"0040D } % CYRILLIC CAPITAL LETTER I WITH GRAVE: Ѝ
+\def\cyrillicUSHRT {\char"0040E } % CYRILLIC CAPITAL LETTER SHORT U: Ў
+\def\cyrillicDZHE {\char"0040F } % CYRILLIC CAPITAL LETTER DZHE: Џ
+\def\cyrillicA {\char"00410 } % CYRILLIC CAPITAL LETTER A: А
+\def\cyrillicB {\char"00411 } % CYRILLIC CAPITAL LETTER BE: Б
+\def\cyrillicV {\char"00412 } % CYRILLIC CAPITAL LETTER VE: В
+\def\cyrillicG {\char"00413 } % CYRILLIC CAPITAL LETTER GHE: Г
+\def\cyrillicD {\char"00414 } % CYRILLIC CAPITAL LETTER DE: Д
+\def\cyrillicE {\char"00415 } % CYRILLIC CAPITAL LETTER IE: Е
+\def\cyrillicZH {\char"00416 } % CYRILLIC CAPITAL LETTER ZHE: Ж
+\def\cyrillicZ {\char"00417 } % CYRILLIC CAPITAL LETTER ZE: З
+\def\cyrillicI {\char"00418 } % CYRILLIC CAPITAL LETTER I: И
+\def\cyrillicISHRT {\char"00419 } % CYRILLIC CAPITAL LETTER SHORT I: Й
+\def\cyrillicK {\char"0041A } % CYRILLIC CAPITAL LETTER KA: К
+\def\cyrillicL {\char"0041B } % CYRILLIC CAPITAL LETTER EL: Л
+\def\cyrillicM {\char"0041C } % CYRILLIC CAPITAL LETTER EM: М
+\def\cyrillicN {\char"0041D } % CYRILLIC CAPITAL LETTER EN: Н
+\def\cyrillicO {\char"0041E } % CYRILLIC CAPITAL LETTER O: О
+\def\cyrillicP {\char"0041F } % CYRILLIC CAPITAL LETTER PE: П
+\def\cyrillicR {\char"00420 } % CYRILLIC CAPITAL LETTER ER: Р
+\def\cyrillicS {\char"00421 } % CYRILLIC CAPITAL LETTER ES: С
+\def\cyrillicT {\char"00422 } % CYRILLIC CAPITAL LETTER TE: Т
+\def\cyrillicU {\char"00423 } % CYRILLIC CAPITAL LETTER U: У
+\def\cyrillicF {\char"00424 } % CYRILLIC CAPITAL LETTER EF: Ф
+\def\cyrillicH {\char"00425 } % CYRILLIC CAPITAL LETTER HA: Х
+\def\cyrillicC {\char"00426 } % CYRILLIC CAPITAL LETTER TSE: Ц
+\def\cyrillicCH {\char"00427 } % CYRILLIC CAPITAL LETTER CHE: Ч
+\def\cyrillicSH {\char"00428 } % CYRILLIC CAPITAL LETTER SHA: Ш
+\def\cyrillicSHCH {\char"00429 } % CYRILLIC CAPITAL LETTER SHCHA: Щ
+\def\cyrillicHRDSN {\char"0042A } % CYRILLIC CAPITAL LETTER HARD SIGN: Ъ
+\def\cyrillicERY {\char"0042B } % CYRILLIC CAPITAL LETTER YERU: Ы
+\def\cyrillicSFTSN {\char"0042C } % CYRILLIC CAPITAL LETTER SOFT SIGN: Ь
+\def\cyrillicEREV {\char"0042D } % CYRILLIC CAPITAL LETTER E: Э
+\def\cyrillicYU {\char"0042E } % CYRILLIC CAPITAL LETTER YU: Ю
+\def\cyrillicYA {\char"0042F } % CYRILLIC CAPITAL LETTER YA: Я
+\def\cyrillica {\char"00430 } % CYRILLIC SMALL LETTER A: а
+\def\cyrillicb {\char"00431 } % CYRILLIC SMALL LETTER BE: б
+\def\cyrillicv {\char"00432 } % CYRILLIC SMALL LETTER VE: в
+\def\cyrillicg {\char"00433 } % CYRILLIC SMALL LETTER GHE: г
+\def\cyrillicd {\char"00434 } % CYRILLIC SMALL LETTER DE: д
+\def\cyrillice {\char"00435 } % CYRILLIC SMALL LETTER IE: е
+\def\cyrilliczh {\char"00436 } % CYRILLIC SMALL LETTER ZHE: ж
+\def\cyrillicz {\char"00437 } % CYRILLIC SMALL LETTER ZE: з
+\def\cyrillici {\char"00438 } % CYRILLIC SMALL LETTER I: и
+\def\cyrillicishrt {\char"00439 } % CYRILLIC SMALL LETTER SHORT I: й
+\def\cyrillick {\char"0043A } % CYRILLIC SMALL LETTER KA: к
+\def\cyrillicl {\char"0043B } % CYRILLIC SMALL LETTER EL: л
+\def\cyrillicm {\char"0043C } % CYRILLIC SMALL LETTER EM: м
+\def\cyrillicn {\char"0043D } % CYRILLIC SMALL LETTER EN: н
+\def\cyrillico {\char"0043E } % CYRILLIC SMALL LETTER O: о
+\def\cyrillicp {\char"0043F } % CYRILLIC SMALL LETTER PE: п
+\def\cyrillicr {\char"00440 } % CYRILLIC SMALL LETTER ER: р
+\def\cyrillics {\char"00441 } % CYRILLIC SMALL LETTER ES: с
+\def\cyrillict {\char"00442 } % CYRILLIC SMALL LETTER TE: т
+\def\cyrillicu {\char"00443 } % CYRILLIC SMALL LETTER U: у
+\def\cyrillicf {\char"00444 } % CYRILLIC SMALL LETTER EF: ф
+\def\cyrillich {\char"00445 } % CYRILLIC SMALL LETTER HA: х
+\def\cyrillicc {\char"00446 } % CYRILLIC SMALL LETTER TSE: ц
+\def\cyrillicch {\char"00447 } % CYRILLIC SMALL LETTER CHE: ч
+\def\cyrillicsh {\char"00448 } % CYRILLIC SMALL LETTER SHA: ш
+\def\cyrillicshch {\char"00449 } % CYRILLIC SMALL LETTER SHCHA: щ
+\def\cyrillichrdsn {\char"0044A } % CYRILLIC SMALL LETTER HARD SIGN: ъ
+\def\cyrillicery {\char"0044B } % CYRILLIC SMALL LETTER YERU: ы
+\def\cyrillicsftsn {\char"0044C } % CYRILLIC SMALL LETTER SOFT SIGN: ь
+\def\cyrillicerev {\char"0044D } % CYRILLIC SMALL LETTER E: э
+\def\cyrillicyu {\char"0044E } % CYRILLIC SMALL LETTER YU: ю
+\def\cyrillicya {\char"0044F } % CYRILLIC SMALL LETTER YA: я
+\def\cyrillicegrave {\char"00450 } % CYRILLIC SMALL LETTER IE WITH GRAVE: ѐ
+\def\cyrillicyo {\char"00451 } % CYRILLIC SMALL LETTER IO: ё
+\def\cyrillicdje {\char"00452 } % CYRILLIC SMALL LETTER DJE: ђ
+\def\cyrillicgje {\char"00453 } % CYRILLIC SMALL LETTER GJE: ѓ
+\def\cyrillicie {\char"00454 } % CYRILLIC SMALL LETTER UKRAINIAN IE: є
+\def\cyrillicdze {\char"00455 } % CYRILLIC SMALL LETTER DZE: ѕ
+\def\cyrillicii {\char"00456 } % CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I: і
+\def\cyrillicyi {\char"00457 } % CYRILLIC SMALL LETTER YI: ї
+\def\cyrillicje {\char"00458 } % CYRILLIC SMALL LETTER JE: ј
+\def\cyrilliclje {\char"00459 } % CYRILLIC SMALL LETTER LJE: љ
+\def\cyrillicnje {\char"0045A } % CYRILLIC SMALL LETTER NJE: њ
+\def\cyrillictshe {\char"0045B } % CYRILLIC SMALL LETTER TSHE: ћ
+\def\cyrillickje {\char"0045C } % CYRILLIC SMALL LETTER KJE: ќ
+\def\cyrillicigrave {\char"0045D } % CYRILLIC SMALL LETTER I WITH GRAVE: ѝ
+\def\cyrillicushrt {\char"0045E } % CYRILLIC SMALL LETTER SHORT U: ў
+\def\cyrillicdzhe {\char"0045F } % CYRILLIC SMALL LETTER DZHE: џ
+\def\cyrillicOMEGA {\char"00460 } % CYRILLIC CAPITAL LETTER OMEGA: Ѡ
+\def\cyrillicomega {\char"00461 } % CYRILLIC SMALL LETTER OMEGA: ѡ
+\def\cyrillicYAT {\char"00462 } % CYRILLIC CAPITAL LETTER YAT: Ѣ
+\def\cyrillicyat {\char"00463 } % CYRILLIC SMALL LETTER YAT: ѣ
+\def\cyrillicEiotified {\char"00464 } % CYRILLIC CAPITAL LETTER IOTIFIED E: Ѥ
+\def\cyrilliceiotified {\char"00465 } % CYRILLIC SMALL LETTER IOTIFIED E: ѥ
+\def\cyrillicLITTLEYUS {\char"00466 } % CYRILLIC CAPITAL LETTER LITTLE YUS: Ѧ
+\def\cyrilliclittleyus {\char"00467 } % CYRILLIC SMALL LETTER LITTLE YUS: ѧ
+\def\cyrillicLITTLEYUSiotified {\char"00468 } % CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS: Ѩ
+\def\cyrilliclittleyusiotified {\char"00469 } % CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS: ѩ
+\def\cyrillicBIGYUS {\char"0046A } % CYRILLIC CAPITAL LETTER BIG YUS: Ѫ
+\def\cyrillicbigyus {\char"0046B } % CYRILLIC SMALL LETTER BIG YUS: ѫ
+\def\cyrillicBIGYUSiotified {\char"0046C } % CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS: Ѭ
+\def\cyrillicbigyusiotified {\char"0046D } % CYRILLIC SMALL LETTER IOTIFIED BIG YUS: ѭ
+\def\cyrillicKSI {\char"0046E } % CYRILLIC CAPITAL LETTER KSI: Ѯ
+\def\cyrillicksi {\char"0046F } % CYRILLIC SMALL LETTER KSI: ѯ
+\def\cyrillicPSI {\char"00470 } % CYRILLIC CAPITAL LETTER PSI: Ѱ
+\def\cyrillicpsi {\char"00471 } % CYRILLIC SMALL LETTER PSI: ѱ
+\def\cyrillicFITA {\char"00472 } % CYRILLIC CAPITAL LETTER FITA: Ѳ
+\def\cyrillicfita {\char"00473 } % CYRILLIC SMALL LETTER FITA: ѳ
+\def\cyrillicIZHITSA {\char"00474 } % CYRILLIC CAPITAL LETTER IZHITSA: Ѵ
+\def\cyrillicizhitsa {\char"00475 } % CYRILLIC SMALL LETTER IZHITSA: ѵ
+\def\cyrillicIZHITSAdoublegrave {\char"00476 } % CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT: Ѷ
+\def\cyrillicizhitsadoublegrave {\char"00477 } % CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT: ѷ
+\def\cyrillicUK {\char"00478 } % CYRILLIC CAPITAL LETTER UK: Ѹ
+\def\cyrillicuk {\char"00479 } % CYRILLIC SMALL LETTER UK: ѹ
+\def\cyrillicOMEGAround {\char"0047A } % CYRILLIC CAPITAL LETTER ROUND OMEGA: Ѻ
+\def\cyrillicomegaround {\char"0047B } % CYRILLIC SMALL LETTER ROUND OMEGA: ѻ
+\def\cyrillicOMEGAtitlo {\char"0047C } % CYRILLIC CAPITAL LETTER OMEGA WITH TITLO: Ѽ
+\def\cyrillicomegatitlo {\char"0047D } % CYRILLIC SMALL LETTER OMEGA WITH TITLO: ѽ
+\def\cyrillicOT {\char"0047E } % CYRILLIC CAPITAL LETTER OT: Ѿ
+\def\cyrillicot {\char"0047F } % CYRILLIC SMALL LETTER OT: ѿ
+\def\cyrillicKOPPA {\char"00480 } % CYRILLIC CAPITAL LETTER KOPPA: Ҁ
+\def\cyrillickoppa {\char"00481 } % CYRILLIC SMALL LETTER KOPPA: ҁ
+\def\cyrillicTITLO {\char"00483 } % COMBINING CYRILLIC TITLO: ҃
+\def\cyrillicPALATALIZATION {\char"00484 } % COMBINING CYRILLIC PALATALIZATION: ҄
+\def\cyrillicDASIAPNEUMATA {\char"00485 } % COMBINING CYRILLIC DASIA PNEUMATA: ҅
+\def\cyrillicPSILIPNEUMATA {\char"00486 } % COMBINING CYRILLIC PSILI PNEUMATA: ҆
+\def\cyrillicISHRTtail {\char"0048A } % CYRILLIC CAPITAL LETTER SHORT I WITH TAIL: Ҋ
+\def\cyrillicishrttail {\char"0048B } % CYRILLIC SMALL LETTER SHORT I WITH TAIL: ҋ
+\def\cyrillicSEMISOFT {\char"0048C } % CYRILLIC CAPITAL LETTER SEMISOFT SIGN: Ҍ
+\def\cyrillicsemisoft {\char"0048D } % CYRILLIC SMALL LETTER SEMISOFT SIGN: ҍ
+\def\cyrillicERtick {\char"0048E } % CYRILLIC CAPITAL LETTER ER WITH TICK: Ҏ
+\def\cyrillicertick {\char"0048F } % CYRILLIC SMALL LETTER ER WITH TICK: ҏ
+\def\cyrillicGHEupturn {\char"00490 } % CYRILLIC CAPITAL LETTER GHE WITH UPTURN: Ґ
+\def\cyrillicgheupturn {\char"00491 } % CYRILLIC SMALL LETTER GHE WITH UPTURN: ґ
+\def\cyrillicGHEstroke {\char"00492 } % CYRILLIC CAPITAL LETTER GHE WITH STROKE: Ғ
+\def\cyrillicghestroke {\char"00493 } % CYRILLIC SMALL LETTER GHE WITH STROKE: ғ
+\def\cyrillicGHEmidhook {\char"00494 } % CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK: Ҕ
+\def\cyrillicghemidhook {\char"00495 } % CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK: ҕ
+\def\cyrillicZHEdescender {\char"00496 } % CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER: Җ
+\def\cyrilliczhedescender {\char"00497 } % CYRILLIC SMALL LETTER ZHE WITH DESCENDER: җ
+\def\cyrillicZDSC {\char"00498 } % CYRILLIC CAPITAL LETTER ZE WITH DESCENDER: Ҙ
+\def\cyrilliczdsc {\char"00499 } % CYRILLIC SMALL LETTER ZE WITH DESCENDER: ҙ
+\def\cyrillicKADC {\char"0049A } % CYRILLIC CAPITAL LETTER KA WITH DESCENDER: Қ
+\def\cyrillickadc {\char"0049B } % CYRILLIC SMALL LETTER KA WITH DESCENDER: қ
+\def\cyrillicKAvertstroke {\char"0049C } % CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE: Ҝ
+\def\cyrillickavertstroke {\char"0049D } % CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE: ҝ
+\def\cyrillicKAstroke {\char"0049E } % CYRILLIC CAPITAL LETTER KA WITH STROKE: Ҟ
+\def\cyrillickastroke {\char"0049F } % CYRILLIC SMALL LETTER KA WITH STROKE: ҟ
+\def\cyrillicKAbashkir {\char"004A0 } % CYRILLIC CAPITAL LETTER BASHKIR KA: Ҡ
+\def\cyrillickabashkir {\char"004A1 } % CYRILLIC SMALL LETTER BASHKIR KA: ҡ
+\def\cyrillicENDC {\char"004A2 } % CYRILLIC CAPITAL LETTER EN WITH DESCENDER: Ң
+\def\cyrillicendc {\char"004A3 } % CYRILLIC SMALL LETTER EN WITH DESCENDER: ң
+\def\cyrillicENGHE {\char"004A4 } % CYRILLIC CAPITAL LIGATURE EN GHE: Ҥ
+\def\cyrillicenghe {\char"004A5 } % CYRILLIC SMALL LIGATURE EN GHE: ҥ
+\def\cyrillicPEmidhook {\char"004A6 } % CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK: Ҧ
+\def\cyrillicpemidhook {\char"004A7 } % CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK: ҧ
+\def\cyrillicHA {\char"004A8 } % CYRILLIC CAPITAL LETTER ABKHASIAN HA: Ҩ
+\def\cyrillicha {\char"004A9 } % CYRILLIC SMALL LETTER ABKHASIAN HA: ҩ
+\def\cyrillicSDSC {\char"004AA } % CYRILLIC CAPITAL LETTER ES WITH DESCENDER: Ҫ
+\def\cyrillicsdsc {\char"004AB } % CYRILLIC SMALL LETTER ES WITH DESCENDER: ҫ
+\def\cyrillicTEDC {\char"004AC } % CYRILLIC CAPITAL LETTER TE WITH DESCENDER: Ҭ
+\def\cyrillictedc {\char"004AD } % CYRILLIC SMALL LETTER TE WITH DESCENDER: ҭ
+\def\cyrillicYstr {\char"004AE } % CYRILLIC CAPITAL LETTER STRAIGHT U: Ү
+\def\cyrillicystr {\char"004AF } % CYRILLIC SMALL LETTER STRAIGHT U: ү
+\def\cyrillicYstrstroke {\char"004B0 } % CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE: Ұ
+\def\cyrillicystrstroke {\char"004B1 } % CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE: ұ
+\def\cyrillicHADC {\char"004B2 } % CYRILLIC CAPITAL LETTER HA WITH DESCENDER: Ҳ
+\def\cyrillichadc {\char"004B3 } % CYRILLIC SMALL LETTER HA WITH DESCENDER: ҳ
+\def\cyrillicTETSE {\char"004B4 } % CYRILLIC CAPITAL LIGATURE TE TSE: Ҵ
+\def\cyrillictetse {\char"004B5 } % CYRILLIC SMALL LIGATURE TE TSE: ҵ
+\def\cyrillicCHEDC {\char"004B6 } % CYRILLIC CAPITAL LETTER CHE WITH DESCENDER: Ҷ
+\def\cyrillicchedc {\char"004B7 } % CYRILLIC SMALL LETTER CHE WITH DESCENDER: ҷ
+\def\cyrillicCHEvertstroke {\char"004B8 } % CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE: Ҹ
+\def\cyrillicchevertstroke {\char"004B9 } % CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE: ҹ
+\def\cyrillicSHHA {\char"004BA } % CYRILLIC CAPITAL LETTER SHHA: Һ
+\def\cyrillicshha {\char"004BB } % CYRILLIC SMALL LETTER SHHA: һ
+\def\cyrillicCHEabkhasian {\char"004BC } % CYRILLIC CAPITAL LETTER ABKHASIAN CHE: Ҽ
+\def\cyrilliccheabkhasian {\char"004BD } % CYRILLIC SMALL LETTER ABKHASIAN CHE: ҽ
+\def\cyrillicCHEDCabkhasian {\char"004BE } % CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER: Ҿ
+\def\cyrillicchedcabkhasian {\char"004BF } % CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER: ҿ
+\def\cyrillicPALOCHKA {\char"004C0 } % CYRILLIC LETTER PALOCHKA: Ӏ
+\def\cyrillicZHEbreve {\char"004C1 } % CYRILLIC CAPITAL LETTER ZHE WITH BREVE: Ӂ
+\def\cyrilliczhebreve {\char"004C2 } % CYRILLIC SMALL LETTER ZHE WITH BREVE: ӂ
+\def\cyrillicKAhook {\char"004C3 } % CYRILLIC CAPITAL LETTER KA WITH HOOK: Ӄ
+\def\cyrillickahook {\char"004C4 } % CYRILLIC SMALL LETTER KA WITH HOOK: ӄ
+\def\cyrillicELtail {\char"004C5 } % CYRILLIC CAPITAL LETTER EL WITH TAIL: Ӆ
+\def\cyrilliceltail {\char"004C6 } % CYRILLIC SMALL LETTER EL WITH TAIL: ӆ
+\def\cyrillicENhook {\char"004C7 } % CYRILLIC CAPITAL LETTER EN WITH HOOK: Ӈ
+\def\cyrillicenhook {\char"004C8 } % CYRILLIC SMALL LETTER EN WITH HOOK: ӈ
+\def\cyrillicENtail {\char"004C9 } % CYRILLIC CAPITAL LETTER EN WITH TAIL: Ӊ
+\def\cyrillicentail {\char"004CA } % CYRILLIC SMALL LETTER EN WITH TAIL: ӊ
+\def\cyrillicCHEkhakassian {\char"004CB } % CYRILLIC CAPITAL LETTER KHAKASSIAN CHE: Ӌ
+\def\cyrillicchekhakassian {\char"004CC } % CYRILLIC SMALL LETTER KHAKASSIAN CHE: ӌ
+\def\cyrillicEMtail {\char"004CD } % CYRILLIC CAPITAL LETTER EM WITH TAIL: Ӎ
+\def\cyrillicemtail {\char"004CE } % CYRILLIC SMALL LETTER EM WITH TAIL: ӎ
+\def\cyrillicAbreve {\char"004D0 } % CYRILLIC CAPITAL LETTER A WITH BREVE: Ӑ
+\def\cyrillicabreve {\char"004D1 } % CYRILLIC SMALL LETTER A WITH BREVE: ӑ
+\def\cyrillicAdiaeresis {\char"004D2 } % CYRILLIC CAPITAL LETTER A WITH DIAERESIS: Ӓ
+\def\cyrillicadiaeresis {\char"004D3 } % CYRILLIC SMALL LETTER A WITH DIAERESIS: ӓ
+\def\cyrillicAE {\char"004D4 } % CYRILLIC CAPITAL LIGATURE A IE: Ӕ
+\def\cyrillicae {\char"004D5 } % CYRILLIC SMALL LIGATURE A IE: ӕ
+\def\cyrillicEbreve {\char"004D6 } % CYRILLIC CAPITAL LETTER IE WITH BREVE: Ӗ
+\def\cyrillicebreve {\char"004D7 } % CYRILLIC SMALL LETTER IE WITH BREVE: ӗ
+\def\cyrillicSCHWA {\char"004D8 } % CYRILLIC CAPITAL LETTER SCHWA: Ә
+\def\cyrillicschwa {\char"004D9 } % CYRILLIC SMALL LETTER SCHWA: ә
+\def\cyrillicSCHWAdiaeresis {\char"004DA } % CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS: Ӛ
+\def\cyrillicschwadiaeresis {\char"004DB } % CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS: ӛ
+\def\cyrillicZHEdiaeresis {\char"004DC } % CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS: Ӝ
+\def\cyrilliczhediaeresis {\char"004DD } % CYRILLIC SMALL LETTER ZHE WITH DIAERESIS: ӝ
+\def\cyrillicZEdiaeresis {\char"004DE } % CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS: Ӟ
+\def\cyrilliczediaeresis {\char"004DF } % CYRILLIC SMALL LETTER ZE WITH DIAERESIS: ӟ
+\def\cyrillicDZEabkhasian {\char"004E0 } % CYRILLIC CAPITAL LETTER ABKHASIAN DZE: Ӡ
+\def\cyrillicdzeabkhasian {\char"004E1 } % CYRILLIC SMALL LETTER ABKHASIAN DZE: ӡ
+\def\cyrillicImacron {\char"004E2 } % CYRILLIC CAPITAL LETTER I WITH MACRON: Ӣ
+\def\cyrillicimacron {\char"004E3 } % CYRILLIC SMALL LETTER I WITH MACRON: ӣ
+\def\cyrillicIdiaeresis {\char"004E4 } % CYRILLIC CAPITAL LETTER I WITH DIAERESIS: Ӥ
+\def\cyrillicidiaeresis {\char"004E5 } % CYRILLIC SMALL LETTER I WITH DIAERESIS: ӥ
+\def\cyrillicOdiaeresis {\char"004E6 } % CYRILLIC CAPITAL LETTER O WITH DIAERESIS: Ӧ
+\def\cyrillicodiaeresis {\char"004E7 } % CYRILLIC SMALL LETTER O WITH DIAERESIS: ӧ
+\def\cyrillicObarred {\char"004E8 } % CYRILLIC CAPITAL LETTER BARRED O: Ө
+\def\cyrillicobarred {\char"004E9 } % CYRILLIC SMALL LETTER BARRED O: ө
+\def\cyrillicObarreddiaeresis {\char"004EA } % CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS: Ӫ
+\def\cyrillicobarreddiaeresis {\char"004EB } % CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS: ӫ
+\def\cyrillicEdiaeresis {\char"004EC } % CYRILLIC CAPITAL LETTER E WITH DIAERESIS: Ӭ
+\def\cyrillicediaeresis {\char"004ED } % CYRILLIC SMALL LETTER E WITH DIAERESIS: ӭ
+\def\cyrillicUmacron {\char"004EE } % CYRILLIC CAPITAL LETTER U WITH MACRON: Ӯ
+\def\cyrillicumacron {\char"004EF } % CYRILLIC SMALL LETTER U WITH MACRON: ӯ
+\def\cyrillicUdiaeresis {\char"004F0 } % CYRILLIC CAPITAL LETTER U WITH DIAERESIS: Ӱ
+\def\cyrillicudiaeresis {\char"004F1 } % CYRILLIC SMALL LETTER U WITH DIAERESIS: ӱ
+\def\cyrillicUdoubleacute {\char"004F2 } % CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE: Ӳ
+\def\cyrillicudoubleacute {\char"004F3 } % CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE: ӳ
+\def\cyrillicCHEdiaeresis {\char"004F4 } % CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS: Ӵ
+\def\cyrillicchediaeresis {\char"004F5 } % CYRILLIC SMALL LETTER CHE WITH DIAERESIS: ӵ
+\def\cyrillicYERUdiaeresis {\char"004F8 } % CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS: Ӹ
+\def\cyrillicyerudiaeresis {\char"004F9 } % CYRILLIC SMALL LETTER YERU WITH DIAERESIS: ӹ
+\def\hebrewAlef {\char"005D0 } % HEBREW LETTER ALEF: א
+\def\hebrewBet {\char"005D1 } % HEBREW LETTER BET: ב
+\def\hebrewGimel {\char"005D2 } % HEBREW LETTER GIMEL: ג
+\def\hebrewDalet {\char"005D3 } % HEBREW LETTER DALET: ד
+\def\hebrewHe {\char"005D4 } % HEBREW LETTER HE: ה
+\def\hebrewVav {\char"005D5 } % HEBREW LETTER VAV: ו
+\def\hebrewZayin {\char"005D6 } % HEBREW LETTER ZAYIN: ז
+\def\hebrewHet {\char"005D7 } % HEBREW LETTER HET: ח
+\def\hebrewTet {\char"005D8 } % HEBREW LETTER TET: ט
+\def\hebrewYod {\char"005D9 } % HEBREW LETTER YOD: י
+\def\hebrewKaffinal {\char"005DA } % HEBREW LETTER FINAL KAF: ך
+\def\hebrewKaf {\char"005DB } % HEBREW LETTER KAF: כ
+\def\hebrewLamed {\char"005DC } % HEBREW LETTER LAMED: ל
+\def\hebrewMemfinal {\char"005DD } % HEBREW LETTER FINAL MEM: ם
+\def\hebrewMem {\char"005DE } % HEBREW LETTER MEM: מ
+\def\hebrewNunfinal {\char"005DF } % HEBREW LETTER FINAL NUN: ן
+\def\hebrewNun {\char"005E0 } % HEBREW LETTER NUN: נ
+\def\hebrewSamekh {\char"005E1 } % HEBREW LETTER SAMEKH: ס
+\def\hebrewAyin {\char"005E2 } % HEBREW LETTER AYIN: ע
+\def\hebrewPefinal {\char"005E3 } % HEBREW LETTER FINAL PE: ף
+\def\hebrewPe {\char"005E4 } % HEBREW LETTER PE: פ
+\def\hebrewTsadifinal {\char"005E5 } % HEBREW LETTER FINAL TSADI: ץ
+\def\hebrewTsadi {\char"005E6 } % HEBREW LETTER TSADI: צ
+\def\hebrewQof {\char"005E7 } % HEBREW LETTER QOF: ק
+\def\hebrewResh {\char"005E8 } % HEBREW LETTER RESH: ר
+\def\hebrewShin {\char"005E9 } % HEBREW LETTER SHIN: ש
+\def\hebrewTav {\char"005EA } % HEBREW LETTER TAV: ת
+\def\Adotbelow {\char"01EA0 } % LATIN CAPITAL LETTER A WITH DOT BELOW: Ạ
+\def\adotbelow {\char"01EA1 } % LATIN SMALL LETTER A WITH DOT BELOW: ạ
+\def\Ahook {\char"01EA2 } % LATIN CAPITAL LETTER A WITH HOOK ABOVE: Ả
+\def\ahook {\char"01EA3 } % LATIN SMALL LETTER A WITH HOOK ABOVE: ả
+\def\Acircumflexacute {\char"01EA4 } % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE: Ấ
+\def\acircumflexacute {\char"01EA5 } % LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE: ấ
+\def\Acircumflexgrave {\char"01EA6 } % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE: Ầ
+\def\acircumflexgrave {\char"01EA7 } % LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE: ầ
+\def\Acircumflexhook {\char"01EA8 } % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE: Ẩ
+\def\acircumflexhook {\char"01EA9 } % LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE: ẩ
+\def\Acircumflextilde {\char"01EAA } % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE: Ẫ
+\def\acircumflextilde {\char"01EAB } % LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE: ẫ
+\def\Acircumflexdotbelow {\char"01EAC } % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW: Ậ
+\def\acircumflexdotbelow {\char"01EAD } % LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW: ậ
+\def\Abreveacute {\char"01EAE } % LATIN CAPITAL LETTER A WITH BREVE AND ACUTE: Ắ
+\def\abreveacute {\char"01EAF } % LATIN SMALL LETTER A WITH BREVE AND ACUTE: ắ
+\def\Abrevegrave {\char"01EB0 } % LATIN CAPITAL LETTER A WITH BREVE AND GRAVE: Ằ
+\def\abrevegrave {\char"01EB1 } % LATIN SMALL LETTER A WITH BREVE AND GRAVE: ằ
+\def\Abrevehook {\char"01EB2 } % LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE: Ẳ
+\def\abrevehook {\char"01EB3 } % LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE: ẳ
+\def\Abrevetilde {\char"01EB4 } % LATIN CAPITAL LETTER A WITH BREVE AND TILDE: Ẵ
+\def\abrevetilde {\char"01EB5 } % LATIN SMALL LETTER A WITH BREVE AND TILDE: ẵ
+\def\Abrevedotbelow {\char"01EB6 } % LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW: Ặ
+\def\abrevedotbelow {\char"01EB7 } % LATIN SMALL LETTER A WITH BREVE AND DOT BELOW: ặ
+\def\Edotbelow {\char"01EB8 } % LATIN CAPITAL LETTER E WITH DOT BELOW: Ẹ
+\def\edotbelow {\char"01EB9 } % LATIN SMALL LETTER E WITH DOT BELOW: ẹ
+\def\Ehook {\char"01EBA } % LATIN CAPITAL LETTER E WITH HOOK ABOVE: Ẻ
+\def\ehook {\char"01EBB } % LATIN SMALL LETTER E WITH HOOK ABOVE: ẻ
+\def\Etilde {\char"01EBC } % LATIN CAPITAL LETTER E WITH TILDE: Ẽ
+\def\etilde {\char"01EBD } % LATIN SMALL LETTER E WITH TILDE: ẽ
+\def\Ecircumflexacute {\char"01EBE } % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE: Ế
+\def\ecircumflexacute {\char"01EBF } % LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE: ế
+\def\Ecircumflexgrave {\char"01EC0 } % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE: Ề
+\def\ecircumflexgrave {\char"01EC1 } % LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE: ề
+\def\Ecircumflexhook {\char"01EC2 } % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE: Ể
+\def\ecircumflexhook {\char"01EC3 } % LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE: ể
+\def\Ecircumflextilde {\char"01EC4 } % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE: Ễ
+\def\ecircumflextilde {\char"01EC5 } % LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE: ễ
+\def\Ecircumflexdotbelow {\char"01EC6 } % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW: Ệ
+\def\ecircumflexdotbelow {\char"01EC7 } % LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW: ệ
+\def\Ihook {\char"01EC8 } % LATIN CAPITAL LETTER I WITH HOOK ABOVE: Ỉ
+\def\ihook {\char"01EC9 } % LATIN SMALL LETTER I WITH HOOK ABOVE: ỉ
+\def\Idotbelow {\char"01ECA } % LATIN CAPITAL LETTER I WITH DOT BELOW: Ị
+\def\idotbelow {\char"01ECB } % LATIN SMALL LETTER I WITH DOT BELOW: ị
+\def\Odotbelow {\char"01ECC } % LATIN CAPITAL LETTER O WITH DOT BELOW: Ọ
+\def\odotbelow {\char"01ECD } % LATIN SMALL LETTER O WITH DOT BELOW: ọ
+\def\Ohook {\char"01ECE } % LATIN CAPITAL LETTER O WITH HOOK ABOVE: Ỏ
+\def\ohook {\char"01ECF } % LATIN SMALL LETTER O WITH HOOK ABOVE: ỏ
+\def\Ocircumflexacute {\char"01ED0 } % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE: Ố
+\def\ocircumflexacute {\char"01ED1 } % LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE: ố
+\def\Ocircumflexgrave {\char"01ED2 } % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE: Ồ
+\def\ocircumflexgrave {\char"01ED3 } % LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE: ồ
+\def\Ocircumflexhook {\char"01ED4 } % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE: Ổ
+\def\ocircumflexhook {\char"01ED5 } % LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE: ổ
+\def\Ocircumflextilde {\char"01ED6 } % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE: Ỗ
+\def\ocircumflextilde {\char"01ED7 } % LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE: ỗ
+\def\Ocircumflexdotbelow {\char"01ED8 } % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW: Ộ
+\def\ocircumflexdotbelow {\char"01ED9 } % LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW: ộ
+\def\Ohornacute {\char"01EDA } % LATIN CAPITAL LETTER O WITH HORN AND ACUTE: Ớ
+\def\ohornacute {\char"01EDB } % LATIN SMALL LETTER O WITH HORN AND ACUTE: ớ
+\def\Ohorngrave {\char"01EDC } % LATIN CAPITAL LETTER O WITH HORN AND GRAVE: Ờ
+\def\ohorngrave {\char"01EDD } % LATIN SMALL LETTER O WITH HORN AND GRAVE: ờ
+\def\Ohornhook {\char"01EDE } % LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE: Ở
+\def\ohornhook {\char"01EDF } % LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE: ở
+\def\Ohorntilde {\char"01EE0 } % LATIN CAPITAL LETTER O WITH HORN AND TILDE: Ỡ
+\def\ohorntilde {\char"01EE1 } % LATIN SMALL LETTER O WITH HORN AND TILDE: ỡ
+\def\Ohorndotbelow {\char"01EE2 } % LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW: Ợ
+\def\ohorndotbelow {\char"01EE3 } % LATIN SMALL LETTER O WITH HORN AND DOT BELOW: ợ
+\def\Udotbelow {\char"01EE4 } % LATIN CAPITAL LETTER U WITH DOT BELOW: Ụ
+\def\udotbelow {\char"01EE5 } % LATIN SMALL LETTER U WITH DOT BELOW: ụ
+\def\Uhook {\char"01EE6 } % LATIN CAPITAL LETTER U WITH HOOK ABOVE: Ủ
+\def\uhook {\char"01EE7 } % LATIN SMALL LETTER U WITH HOOK ABOVE: ủ
+\def\Uhornacute {\char"01EE8 } % LATIN CAPITAL LETTER U WITH HORN AND ACUTE: Ứ
+\def\uhornacute {\char"01EE9 } % LATIN SMALL LETTER U WITH HORN AND ACUTE: ứ
+\def\Uhorngrave {\char"01EEA } % LATIN CAPITAL LETTER U WITH HORN AND GRAVE: Ừ
+\def\uhorngrave {\char"01EEB } % LATIN SMALL LETTER U WITH HORN AND GRAVE: ừ
+\def\Uhornhook {\char"01EEC } % LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE: Ử
+\def\uhornhook {\char"01EED } % LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE: ử
+\def\Uhorntilde {\char"01EEE } % LATIN CAPITAL LETTER U WITH HORN AND TILDE: Ữ
+\def\uhorntilde {\char"01EEF } % LATIN SMALL LETTER U WITH HORN AND TILDE: ữ
+\def\Uhorndotbelow {\char"01EF0 } % LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW: Ự
+\def\uhorndotbelow {\char"01EF1 } % LATIN SMALL LETTER U WITH HORN AND DOT BELOW: ự
+\def\Ygrave {\char"01EF2 } % LATIN CAPITAL LETTER Y WITH GRAVE: Ỳ
+\def\ygrave {\char"01EF3 } % LATIN SMALL LETTER Y WITH GRAVE: ỳ
+\def\Ydotbelow {\char"01EF4 } % LATIN CAPITAL LETTER Y WITH DOT BELOW: Ỵ
+\def\ydotbelow {\char"01EF5 } % LATIN SMALL LETTER Y WITH DOT BELOW: ỵ
+\def\Yhook {\char"01EF6 } % LATIN CAPITAL LETTER Y WITH HOOK ABOVE: Ỷ
+\def\yhook {\char"01EF7 } % LATIN SMALL LETTER Y WITH HOOK ABOVE: ỷ
+\def\Ytilde {\char"01EF8 } % LATIN CAPITAL LETTER Y WITH TILDE: Ỹ
+\def\ytilde {\char"01EF9 } % LATIN SMALL LETTER Y WITH TILDE: ỹ
+\def\greekalphapsili {\char"01F00 } % GREEK SMALL LETTER ALPHA WITH PSILI: ἀ
+\def\greekalphadasia {\char"01F01 } % GREEK SMALL LETTER ALPHA WITH DASIA: ἁ
+\def\greekalphapsilivaria {\char"01F02 } % GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA: ἂ
+\def\greekalphadasiavaria {\char"01F03 } % GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA: ἃ
+\def\greekalphapsilitonos {\char"01F04 } % GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA: ἄ
+\def\greekalphadasiatonos {\char"01F05 } % GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA: ἅ
+\def\greekalphapsiliperispomeni {\char"01F06 } % GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI: ἆ
+\def\greekalphadasiaperispomeni {\char"01F07 } % GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI: ἇ
+\def\greekAlphapsili {\char"01F08 } % GREEK CAPITAL LETTER ALPHA WITH PSILI: Ἀ
+\def\greekAlphadasia {\char"01F09 } % GREEK CAPITAL LETTER ALPHA WITH DASIA: Ἁ
+\def\greekAlphapsilivaria {\char"01F0A } % GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA: Ἂ
+\def\greekAlphadasiavaria {\char"01F0B } % GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA: Ἃ
+\def\greekAlphapsilitonos {\char"01F0C } % GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA: Ἄ
+\def\greekAlphadasiatonos {\char"01F0D } % GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA: Ἅ
+\def\greekAlphapsiliperispomeni {\char"01F0E } % GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI: Ἆ
+\def\greekAlphadasiaperispomeni {\char"01F0F } % GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI: Ἇ
+\def\greekepsilonpsili {\char"01F10 } % GREEK SMALL LETTER EPSILON WITH PSILI: ἐ
+\def\greekepsilondasia {\char"01F11 } % GREEK SMALL LETTER EPSILON WITH DASIA: ἑ
+\def\greekepsilonpsilivaria {\char"01F12 } % GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA: ἒ
+\def\greekepsilondasiavaria {\char"01F13 } % GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA: ἓ
+\def\greekepsilonpsilitonos {\char"01F14 } % GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA: ἔ
+\def\greekepsilondasiatonos {\char"01F15 } % GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA: ἕ
+\def\greekEpsilonpsili {\char"01F18 } % GREEK CAPITAL LETTER EPSILON WITH PSILI: Ἐ
+\def\greekEpsilondasia {\char"01F19 } % GREEK CAPITAL LETTER EPSILON WITH DASIA: Ἑ
+\def\greekEpsilonpsilivaria {\char"01F1A } % GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA: Ἒ
+\def\greekEpsilondasiavaria {\char"01F1B } % GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA: Ἓ
+\def\greekEpsilonpsilitonos {\char"01F1C } % GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA: Ἔ
+\def\greekEpsilondasiatonos {\char"01F1D } % GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA: Ἕ
+\def\greeketapsili {\char"01F20 } % GREEK SMALL LETTER ETA WITH PSILI: ἠ
+\def\greeketadasia {\char"01F21 } % GREEK SMALL LETTER ETA WITH DASIA: ἡ
+\def\greeketapsilivaria {\char"01F22 } % GREEK SMALL LETTER ETA WITH PSILI AND VARIA: ἢ
+\def\greeketadasiavaria {\char"01F23 } % GREEK SMALL LETTER ETA WITH DASIA AND VARIA: ἣ
+\def\greeketapsilitonos {\char"01F24 } % GREEK SMALL LETTER ETA WITH PSILI AND OXIA: ἤ
+\def\greeketadasiatonos {\char"01F25 } % GREEK SMALL LETTER ETA WITH DASIA AND OXIA: ἥ
+\def\greeketapsiliperispomeni {\char"01F26 } % GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI: ἦ
+\def\greeketadasiaperispomeni {\char"01F27 } % GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI: ἧ
+\def\greekEtapsili {\char"01F28 } % GREEK CAPITAL LETTER ETA WITH PSILI: Ἠ
+\def\greekEtadasia {\char"01F29 } % GREEK CAPITAL LETTER ETA WITH DASIA: Ἡ
+\def\greekEtapsilivaria {\char"01F2A } % GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA: Ἢ
+\def\greekEtadasiavaria {\char"01F2B } % GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA: Ἣ
+\def\greekEtapsilitonos {\char"01F2C } % GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA: Ἤ
+\def\greekEtadasiatonos {\char"01F2D } % GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA: Ἥ
+\def\greekEtapsiliperispomeni {\char"01F2E } % GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI: Ἦ
+\def\greekEtadasiaperispomeni {\char"01F2F } % GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI: Ἧ
+\def\greekiotapsili {\char"01F30 } % GREEK SMALL LETTER IOTA WITH PSILI: ἰ
+\def\greekiotadasia {\char"01F31 } % GREEK SMALL LETTER IOTA WITH DASIA: ἱ
+\def\greekiotapsilivaria {\char"01F32 } % GREEK SMALL LETTER IOTA WITH PSILI AND VARIA: ἲ
+\def\greekiotadasiavaria {\char"01F33 } % GREEK SMALL LETTER IOTA WITH DASIA AND VARIA: ἳ
+\def\greekiotapsilitonos {\char"01F34 } % GREEK SMALL LETTER IOTA WITH PSILI AND OXIA: ἴ
+\def\greekiotadasiatonos {\char"01F35 } % GREEK SMALL LETTER IOTA WITH DASIA AND OXIA: ἵ
+\def\greekiotapsiliperispomeni {\char"01F36 } % GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI: ἶ
+\def\greekiotadasiaperispomeni {\char"01F37 } % GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI: ἷ
+\def\greekIotapsili {\char"01F38 } % GREEK CAPITAL LETTER IOTA WITH PSILI: Ἰ
+\def\greekIotadasia {\char"01F39 } % GREEK CAPITAL LETTER IOTA WITH DASIA: Ἱ
+\def\greekIotapsilivaria {\char"01F3A } % GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA: Ἲ
+\def\greekIotadasiavaria {\char"01F3B } % GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA: Ἳ
+\def\greekIotapsilitonos {\char"01F3C } % GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA: Ἴ
+\def\greekIotadasiatonos {\char"01F3D } % GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA: Ἵ
+\def\greekIotapsiliperispomeni {\char"01F3E } % GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI: Ἶ
+\def\greekIotadasiaperispomeni {\char"01F3F } % GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI: Ἷ
+\def\greekomicronpsili {\char"01F40 } % GREEK SMALL LETTER OMICRON WITH PSILI: ὀ
+\def\greekomicrondasia {\char"01F41 } % GREEK SMALL LETTER OMICRON WITH DASIA: ὁ
+\def\greekomicronpsilivaria {\char"01F42 } % GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA: ὂ
+\def\greekomicrondasiavaria {\char"01F43 } % GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA: ὃ
+\def\greekomicronpsilitonos {\char"01F44 } % GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA: ὄ
+\def\greekomicrondasiatonos {\char"01F45 } % GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA: ὅ
+\def\greekOmicronpsili {\char"01F48 } % GREEK CAPITAL LETTER OMICRON WITH PSILI: Ὀ
+\def\greekOmicrondasia {\char"01F49 } % GREEK CAPITAL LETTER OMICRON WITH DASIA: Ὁ
+\def\greekOmicronpsilivaria {\char"01F4A } % GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA: Ὂ
+\def\greekOmicrondasiavaria {\char"01F4B } % GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA: Ὃ
+\def\greekOmicronpsilitonos {\char"01F4C } % GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA: Ὄ
+\def\greekOmicrondasiatonos {\char"01F4D } % GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA: Ὅ
+\def\greekupsilonpsili {\char"01F50 } % GREEK SMALL LETTER UPSILON WITH PSILI: ὐ
+\def\greekupsilondasia {\char"01F51 } % GREEK SMALL LETTER UPSILON WITH DASIA: ὑ
+\def\greekupsilonpsilivaria {\char"01F52 } % GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA: ὒ
+\def\greekupsilondasiavaria {\char"01F53 } % GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA: ὓ
+\def\greekupsilonpsilitonos {\char"01F54 } % GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA: ὔ
+\def\greekupsilondasiatonos {\char"01F55 } % GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA: ὕ
+\def\greekupsilonpsiliperispomeni {\char"01F56 } % GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI: ὖ
+\def\greekupsilondasiaperispomeni {\char"01F57 } % GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI: ὗ
+\def\greekUpsilondasia {\char"01F59 } % GREEK CAPITAL LETTER UPSILON WITH DASIA: Ὑ
+\def\greekUpsilondasiavaria {\char"01F5B } % GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA: Ὓ
+\def\greekUpsilondasiatonos {\char"01F5D } % GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA: Ὕ
+\def\greekUpsilondasiaperispomeni {\char"01F5F } % GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI: Ὗ
+\def\greekomegapsili {\char"01F60 } % GREEK SMALL LETTER OMEGA WITH PSILI: ὠ
+\def\greekomegadasia {\char"01F61 } % GREEK SMALL LETTER OMEGA WITH DASIA: ὡ
+\def\greekomegapsilivaria {\char"01F62 } % GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA: ὢ
+\def\greekomegadasiavaria {\char"01F63 } % GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA: ὣ
+\def\greekomegapsilitonos {\char"01F64 } % GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA: ὤ
+\def\greekomegadasiatonos {\char"01F65 } % GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA: ὥ
+\def\greekomegapsiliperispomeni {\char"01F66 } % GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI: ὦ
+\def\greekomegadasiaperispomeni {\char"01F67 } % GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI: ὧ
+\def\greekOmegapsili {\char"01F68 } % GREEK CAPITAL LETTER OMEGA WITH PSILI: Ὠ
+\def\greekOmegadasia {\char"01F69 } % GREEK CAPITAL LETTER OMEGA WITH DASIA: Ὡ
+\def\greekOmegapsilivaria {\char"01F6A } % GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA: Ὢ
+\def\greekOmegadasiavaria {\char"01F6B } % GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA: Ὣ
+\def\greekOmegapsilitonos {\char"01F6C } % GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA: Ὤ
+\def\greekOmegadasiatonos {\char"01F6D } % GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA: Ὥ
+\def\greekOmegapsiliperispomeni {\char"01F6E } % GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI: Ὦ
+\def\greekOmegadasiaperispomeni {\char"01F6F } % GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI: Ὧ
+\def\greekalphavaria {\char"01F70 } % GREEK SMALL LETTER ALPHA WITH VARIA: ὰ
+\def\greekalphaoxia {\char"01F71 } % GREEK SMALL LETTER ALPHA WITH OXIA: ά
+\def\greekepsilonvaria {\char"01F72 } % GREEK SMALL LETTER EPSILON WITH VARIA: ὲ
+\def\greekepsilonoxia {\char"01F73 } % GREEK SMALL LETTER EPSILON WITH OXIA: έ
+\def\greeketavaria {\char"01F74 } % GREEK SMALL LETTER ETA WITH VARIA: ὴ
+\def\greeketaoxia {\char"01F75 } % GREEK SMALL LETTER ETA WITH OXIA: ή
+\def\greekiotavaria {\char"01F76 } % GREEK SMALL LETTER IOTA WITH VARIA: ὶ
+\def\greekiotaoxia {\char"01F77 } % GREEK SMALL LETTER IOTA WITH OXIA: ί
+\def\greekomicronvaria {\char"01F78 } % GREEK SMALL LETTER OMICRON WITH VARIA: ὸ
+\def\greekomicronoxia {\char"01F79 } % GREEK SMALL LETTER OMICRON WITH OXIA: ό
+\def\greekupsilonvaria {\char"01F7A } % GREEK SMALL LETTER UPSILON WITH VARIA: ὺ
+\def\greekupsilonoxia {\char"01F7B } % GREEK SMALL LETTER UPSILON WITH OXIA: ύ
+\def\greekomegavaria {\char"01F7C } % GREEK SMALL LETTER OMEGA WITH VARIA: ὼ
+\def\greekomegaoxia {\char"01F7D } % GREEK SMALL LETTER OMEGA WITH OXIA: ώ
+\def\greekalphaiotasubpsili {\char"01F80 } % GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI: ᾀ
+\def\greekalphaiotasubdasia {\char"01F81 } % GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI: ᾁ
+\def\greekalphaiotasubpsilivaria {\char"01F82 } % GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI: ᾂ
+\def\greekalphaiotasubdasiavaria {\char"01F83 } % GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI: ᾃ
+\def\greekalphaiotasubpsilitonos {\char"01F84 } % GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI: ᾄ
+\def\greekalphaiotasubdasiatonos {\char"01F85 } % GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI: ᾅ
+\def\greekalphaiotasubpsiliperispomeni{\char"01F86 } % GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI: ᾆ
+\def\greekalphaiotasubdasiaperispomeni{\char"01F87 } % GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI: ᾇ
+\def\greekAlphaiotasubpsili {\char"01F88 } % GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI: ᾈ
+\def\greekAlphaiotasubdasia {\char"01F89 } % GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI: ᾉ
+\def\greekAlphaiotasubpsilivaria {\char"01F8A } % GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI: ᾊ
+\def\greekAlphaiotasubdasiavaria {\char"01F8B } % GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI: ᾋ
+\def\greekAlphaiotasubpsilitonos {\char"01F8C } % GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI: ᾌ
+\def\greekAlphaiotasubdasiatonos {\char"01F8D } % GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI: ᾍ
+\def\greekAlphaiotasubpsiliperispomeni{\char"01F8E } % GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI: ᾎ
+\def\greekAlphaiotasubdasiaperispomeni{\char"01F8F } % GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI: ᾏ
+\def\greeketaiotasubpsili {\char"01F90 } % GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI: ᾐ
+\def\greeketaiotasubdasia {\char"01F91 } % GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI: ᾑ
+\def\greeketaiotasubpsilivaria {\char"01F92 } % GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI: ᾒ
+\def\greeketaiotasubdasiavaria {\char"01F93 } % GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI: ᾓ
+\def\greeketaiotasubpsilitonos {\char"01F94 } % GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI: ᾔ
+\def\greeketaiotasubdasiatonos {\char"01F95 } % GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI: ᾕ
+\def\greeketaiotasubpsiliperispomeni {\char"01F96 } % GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI: ᾖ
+\def\greeketaiotasubdasiaperispomeni {\char"01F97 } % GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI: ᾗ
+\def\greekEtaiotasubpsili {\char"01F98 } % GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI: ᾘ
+\def\greekEtaiotasubdasia {\char"01F99 } % GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI: ᾙ
+\def\greekEtaiotasubpsilivaria {\char"01F9A } % GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI: ᾚ
+\def\greekEtaiotasubdasiavaria {\char"01F9B } % GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI: ᾛ
+\def\greekEtaiotasubpsilitonos {\char"01F9C } % GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI: ᾜ
+\def\greekEtaiotasubdasiatonos {\char"01F9D } % GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI: ᾝ
+\def\greekEtaiotasubpsiliperispomeni {\char"01F9E } % GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI: ᾞ
+\def\greekEtaiotasubdasiaperispomeni {\char"01F9F } % GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI: ᾟ
+\def\greekomegaiotasubpsili {\char"01FA0 } % GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI: ᾠ
+\def\greekomegaiotasubdasia {\char"01FA1 } % GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI: ᾡ
+\def\greekomegaiotasubpsilivaria {\char"01FA2 } % GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI: ᾢ
+\def\greekomegaiotasubdasiavaria {\char"01FA3 } % GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI: ᾣ
+\def\greekomegaiotasubpsilitonos {\char"01FA4 } % GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI: ᾤ
+\def\greekomegaiotasubdasiatonos {\char"01FA5 } % GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI: ᾥ
+\def\greekomegaiotasubpsiliperispomeni{\char"01FA6 } % GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI: ᾦ
+\def\greekomegaiotasubdasiaperispomeni{\char"01FA7 } % GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI: ᾧ
+\def\greekOmegaiotasubpsili {\char"01FA8 } % GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI: ᾨ
+\def\greekOmegaiotasubdasia {\char"01FA9 } % GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI: ᾩ
+\def\greekOmegaiotasubpsilivaria {\char"01FAA } % GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI: ᾪ
+\def\greekOmegaiotasubdasiavaria {\char"01FAB } % GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI: ᾫ
+\def\greekOmegaiotasubpsilitonos {\char"01FAC } % GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI: ᾬ
+\def\greekOmegaiotasubdasiatonos {\char"01FAD } % GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI: ᾭ
+\def\greekOmegaiotasubpsiliperispomeni{\char"01FAE } % GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI: ᾮ
+\def\greekOmegaiotasubdasiaperispomeni{\char"01FAF } % GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI: ᾯ
+\def\greekalphavrachy {\char"01FB0 } % GREEK SMALL LETTER ALPHA WITH VRACHY: ᾰ
+\def\greekalphamacron {\char"01FB1 } % GREEK SMALL LETTER ALPHA WITH MACRON: ᾱ
+\def\greekalphaiotasubvaria {\char"01FB2 } % GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI: ᾲ
+\def\greekalphaiotasub {\char"01FB3 } % GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI: ᾳ
+\def\greekalphaiotasubtonos {\char"01FB4 } % GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI: ᾴ
+\def\greekalphaperispomeni {\char"01FB6 } % GREEK SMALL LETTER ALPHA WITH PERISPOMENI: ᾶ
+\def\greekalphaiotasubperispomeni {\char"01FB7 } % GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI: ᾷ
+\def\greekAlphavrachy {\char"01FB8 } % GREEK CAPITAL LETTER ALPHA WITH VRACHY: Ᾰ
+\def\greekAlphamacron {\char"01FB9 } % GREEK CAPITAL LETTER ALPHA WITH MACRON: Ᾱ
+\def\greekAlphavaria {\char"01FBA } % GREEK CAPITAL LETTER ALPHA WITH VARIA: Ὰ
+\def\greekAlphatonos {\char"01FBB } % GREEK CAPITAL LETTER ALPHA WITH OXIA: Ά
+\def\greekAlphaiotasub {\char"01FBC } % GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI: ᾼ
+\def\greekCoronis {\char"01FBD } % GREEK KORONIS: ᾽
+\def\greekprosgegrammeni {\char"01FBE } % GREEK PROSGEGRAMMENI: ι
+\def\greekpsili {\char"01FBF } % GREEK PSILI: ᾿
+\def\greekperispomeni {\char"01FC0 } % GREEK PERISPOMENI: ῀
+\def\greekdialytikaperispomeni {\char"01FC1 } % GREEK DIALYTIKA AND PERISPOMENI: ῁
+\def\greeketaiotasubvaria {\char"01FC2 } % GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI: ῂ
+\def\greeketaiotasub {\char"01FC3 } % GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI: ῃ
+\def\greeketaiotasubtonos {\char"01FC4 } % GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI: ῄ
+\def\greeketaperispomeni {\char"01FC6 } % GREEK SMALL LETTER ETA WITH PERISPOMENI: ῆ
+\def\greeketaiotasubperispomeni {\char"01FC7 } % GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI: ῇ
+\def\greekEpsilonvaria {\char"01FC8 } % GREEK CAPITAL LETTER EPSILON WITH VARIA: Ὲ
+\def\greekEpsilontonos {\char"01FC9 } % GREEK CAPITAL LETTER EPSILON WITH OXIA: Έ
+\def\greekEtavaria {\char"01FCA } % GREEK CAPITAL LETTER ETA WITH VARIA: Ὴ
+\def\greekEtatonos {\char"01FCB } % GREEK CAPITAL LETTER ETA WITH OXIA: Ή
+\def\greekEtaiotasub {\char"01FCC } % GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI: ῌ
+\def\greekpsilivaria {\char"01FCD } % GREEK PSILI AND VARIA: ῍
+\def\greekpsilitonos {\char"01FCE } % GREEK PSILI AND OXIA: ῎
+\def\greekpsiliperispomeni {\char"01FCF } % GREEK PSILI AND PERISPOMENI: ῏
+\def\greekiotavrachy {\char"01FD0 } % GREEK SMALL LETTER IOTA WITH VRACHY: ῐ
+\def\greekiotamacron {\char"01FD1 } % GREEK SMALL LETTER IOTA WITH MACRON: ῑ
+\def\greekiotadialytikavaria {\char"01FD2 } % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA: ῒ
+\def\greekiotadialytikatonos {\char"01FD3 } % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA: ΐ
+\def\greekiotaperispomeni {\char"01FD6 } % GREEK SMALL LETTER IOTA WITH PERISPOMENI: ῖ
+\def\greekiotadialytikaperispomeni {\char"01FD7 } % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI: ῗ
+\def\greekIotavrachy {\char"01FD8 } % GREEK CAPITAL LETTER IOTA WITH VRACHY: Ῐ
+\def\greekIotamacron {\char"01FD9 } % GREEK CAPITAL LETTER IOTA WITH MACRON: Ῑ
+\def\greekIotavaria {\char"01FDA } % GREEK CAPITAL LETTER IOTA WITH VARIA: Ὶ
+\def\greekIotatonos {\char"01FDB } % GREEK CAPITAL LETTER IOTA WITH OXIA: Ί
+\def\greekdasiavaria {\char"01FDD } % GREEK DASIA AND VARIA: ῝
+\def\greekdasiatonos {\char"01FDE } % GREEK DASIA AND OXIA: ῞
+\def\greekdasiaperispomeni {\char"01FDF } % GREEK DASIA AND PERISPOMENI: ῟
+\def\greekupsilonvrachy {\char"01FE0 } % GREEK SMALL LETTER UPSILON WITH VRACHY: ῠ
+\def\greekupsilonmacron {\char"01FE1 } % GREEK SMALL LETTER UPSILON WITH MACRON: ῡ
+\def\greekupsilondialytikavaria {\char"01FE2 } % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA: ῢ
+\def\greekupsilondialytikatonos {\char"01FE3 } % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA: ΰ
+\def\greekrhopsili {\char"01FE4 } % GREEK SMALL LETTER RHO WITH PSILI: ῤ
+\def\greekrhodasia {\char"01FE5 } % GREEK SMALL LETTER RHO WITH DASIA: ῥ
+\def\greekupsilonperispomeni {\char"01FE6 } % GREEK SMALL LETTER UPSILON WITH PERISPOMENI: ῦ
+\def\greekupsilondialytikaperispomeni {\char"01FE7 } % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI: ῧ
+\def\greekUpsilonvrachy {\char"01FE8 } % GREEK CAPITAL LETTER UPSILON WITH VRACHY: Ῠ
+\def\greekUpsilonmacron {\char"01FE9 } % GREEK CAPITAL LETTER UPSILON WITH MACRON: Ῡ
+\def\greekUpsilonvaria {\char"01FEA } % GREEK CAPITAL LETTER UPSILON WITH VARIA: Ὺ
+\def\greekUpsilontonos {\char"01FEB } % GREEK CAPITAL LETTER UPSILON WITH OXIA: Ύ
+\def\greekRhodasia {\char"01FEC } % GREEK CAPITAL LETTER RHO WITH DASIA: Ῥ
+\def\greekdialytikavaria {\char"01FED } % GREEK DIALYTIKA AND VARIA: ῭
+\def\greekdialytikatonos {\char"01FEE } % GREEK DIALYTIKA AND OXIA: ΅
+\def\greekvaria {\char"01FEF } % GREEK VARIA: `
+\def\greekomegaiotasubvaria {\char"01FF2 } % GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI: ῲ
+\def\greekomegaiotasub {\char"01FF3 } % GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI: ῳ
+\def\greekomegaiotasubtonos {\char"01FF4 } % GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI: ῴ
+\def\greekomegaperispomeni {\char"01FF6 } % GREEK SMALL LETTER OMEGA WITH PERISPOMENI: ῶ
+\def\greekomegaiotasubperispomeni {\char"01FF7 } % GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI: ῷ
+\def\greekOmicronvaria {\char"01FF8 } % GREEK CAPITAL LETTER OMICRON WITH VARIA: Ὸ
+\def\greekOmicrontonos {\char"01FF9 } % GREEK CAPITAL LETTER OMICRON WITH OXIA: Ό
+\def\greekOmegavaria {\char"01FFA } % GREEK CAPITAL LETTER OMEGA WITH VARIA: Ὼ
+\def\greekOmegatonos {\char"01FFB } % GREEK CAPITAL LETTER OMEGA WITH OXIA: Ώ
+\def\greekOmegaiotasub {\char"01FFC } % GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI: ῼ
+\def\greekoxia {\char"01FFD } % GREEK OXIA: ´
+\def\greekdasia {\char"01FFE } % GREEK DASIA: ῾
+\def\enspace {\char"02002 } % EN SPACE:  
+\def\emspace {\char"02003 } % EM SPACE:  
+\def\threeperemspace {\char"02004 } % THREE-PER-EM SPACE:  
+\def\fourperemspace {\char"02005 } % FOUR-PER-EM SPACE:  
+\def\sixperemspace {\char"02006 } % SIX-PER-EM SPACE:  
+\def\figurespace {\char"02007 } % FIGURE SPACE:  
+\def\punctuationspace {\char"02008 } % PUNCTUATION SPACE:  
+\def\thinspace {\char"02009 } % THIN SPACE:  
+\def\figurespace {\char"0200A } % HAIR SPACE:  
+\def\zerowidthspace {\char"0200B } % ZERO WIDTH SPACE: ​
+\def\textminus {\char"02012 } % FIGURE DASH: ‒
+\def\endash {\char"02013 } % EN DASH: –
+\def\emdash {\char"02014 } % EM DASH: —
+\def\texthorizontalbar {\char"02015 } % HORIZONTAL BAR: ―
+\def\quoteleft {\char"02018 } % LEFT SINGLE QUOTATION MARK: ‘
+\def\quoteright {\char"02019 } % RIGHT SINGLE QUOTATION MARK: ’
+\def\quotesinglebase {\char"0201A } % SINGLE LOW-0x0009 QUOTATION MARK: ‚
+\def\quotedblleft {\char"0201C } % LEFT DOUBLE QUOTATION MARK: “
+\def\quotedblright {\char"0201D } % RIGHT DOUBLE QUOTATION MARK: ”
+\def\quotedblbase {\char"0201E } % DOUBLE LOW-0x0009 QUOTATION MARK: „
+\def\textdag {\char"02020 } % DAGGER: †
+\def\textddag {\char"02021 } % DOUBLE DAGGER: ‡
+\def\textbullet {\char"02022 } % BULLET: •
+\def\textellipsis {\char"02026 } % HORIZONTAL ELLIPSIS: …
+\def\narrownobreakspace {\char"0202F } % NARROW NO-BREAK SPACE:  
+\def\perthousand {\char"02030 } % PER MILLE SIGN: ‰
+\def\guilsingleleft {\char"02039 } % SINGLE LEFT-POINTING ANGLE QUOTATION MARK: ‹
+\def\guilsingleright {\char"0203A } % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK: ›
+\def\textfraction {\char"02044 } % FRACTION SLASH: ⁄
+\def\medspace {\char"0205F } % MEDIUM MATHEMATICAL SPACE:  
+\def\textdong {\char"020AB } % DONG SIGN: ₫
+\def\texteuro {\char"020AC } % EURO SIGN: €
+\def\textcelsius {\char"02103 } % DEGREE CELSIUS: ℃
+\def\textnumero {\char"02116 } % NUMERO SIGN: №
+\def\textcircledP {\char"02117 } % SOUND RECORDING COPYRIGHT: ℗
+\def\trademark {\char"02122 } % TRADE MARK SIGN: ™
+\def\textounce {\char"02125 } % OUNCE SIGN: ℥
+\def\textohm {\char"02126 } % OHM SIGN: Ω
+\def\textmho {\char"02127 } % INVERTED OHM SIGN: ℧
+\def\textkelvin {\char"0212A } % KELVIN SIGN: K
+\def\textAngstrom {\char"0212B } % ANGSTROM SIGN: Å
+\def\onethird {\char"02153 } % VULGAR FRACTION ONE THIRD: ⅓
+\def\twothirds {\char"02154 } % VULGAR FRACTION TWO THIRDS: ⅔
+\def\onefifth {\char"02155 } % VULGAR FRACTION ONE FIFTH: ⅕
+\def\twofifths {\char"02156 } % VULGAR FRACTION TWO FIFTHS: ⅖
+\def\threefifths {\char"02157 } % VULGAR FRACTION THREE FIFTHS: ⅗
+\def\fourfifths {\char"02158 } % VULGAR FRACTION FOUR FIFTHS: ⅘
+\def\onesixth {\char"02159 } % VULGAR FRACTION ONE SIXTH: ⅙
+\def\fivesixths {\char"0215A } % VULGAR FRACTION FIVE SIXTHS: ⅚
+\def\oneeighth {\char"0215B } % VULGAR FRACTION ONE EIGHTH: ⅛
+\def\threeeighths {\char"0215C } % VULGAR FRACTION THREE EIGHTHS: ⅜
+\def\fiveeighths {\char"0215D } % VULGAR FRACTION FIVE EIGHTHS: ⅝
+\def\seveneighths {\char"0215E } % VULGAR FRACTION SEVEN EIGHTHS: ⅞
+\def\romanI {\char"02160 } % ROMAN NUMERAL ONE: Ⅰ
+\def\romanII {\char"02161 } % ROMAN NUMERAL TWO: Ⅱ
+\def\romanIII {\char"02162 } % ROMAN NUMERAL THREE: Ⅲ
+\def\romanIV {\char"02163 } % ROMAN NUMERAL FOUR: Ⅳ
+\def\romanV {\char"02164 } % ROMAN NUMERAL FIVE: Ⅴ
+\def\romanVI {\char"02165 } % ROMAN NUMERAL SIX: Ⅵ
+\def\romanVII {\char"02166 } % ROMAN NUMERAL SEVEN: Ⅶ
+\def\romanVIII {\char"02167 } % ROMAN NUMERAL EIGHT: Ⅷ
+\def\romanIX {\char"02168 } % ROMAN NUMERAL NINE: Ⅸ
+\def\romanX {\char"02169 } % ROMAN NUMERAL TEN: Ⅹ
+\def\romanXI {\char"0216A } % ROMAN NUMERAL ELEVEN: Ⅺ
+\def\romanXII {\char"0216B } % ROMAN NUMERAL TWELVE: Ⅻ
+\def\romanL {\char"0216C } % ROMAN NUMERAL FIFTY: Ⅼ
+\def\romanC {\char"0216D } % ROMAN NUMERAL ONE HUNDRED: Ⅽ
+\def\romanD {\char"0216E } % ROMAN NUMERAL FIVE HUNDRED: Ⅾ
+\def\romanM {\char"0216F } % ROMAN NUMERAL ONE THOUSAND: Ⅿ
+\def\romani {\char"02170 } % SMALL ROMAN NUMERAL ONE: ⅰ
+\def\romanii {\char"02171 } % SMALL ROMAN NUMERAL TWO: ⅱ
+\def\romaniii {\char"02172 } % SMALL ROMAN NUMERAL THREE: ⅲ
+\def\romaniv {\char"02173 } % SMALL ROMAN NUMERAL FOUR: ⅳ
+\def\romanv {\char"02174 } % SMALL ROMAN NUMERAL FIVE: ⅴ
+\def\romanvi {\char"02175 } % SMALL ROMAN NUMERAL SIX: ⅵ
+\def\romanvii {\char"02176 } % SMALL ROMAN NUMERAL SEVEN: ⅶ
+\def\romanviii {\char"02177 } % SMALL ROMAN NUMERAL EIGHT: ⅷ
+\def\romanix {\char"02178 } % SMALL ROMAN NUMERAL NINE: ⅸ
+\def\romanx {\char"02179 } % SMALL ROMAN NUMERAL TEN: ⅹ
+\def\romanxi {\char"0217A } % SMALL ROMAN NUMERAL ELEVEN: ⅺ
+\def\romanxii {\char"0217B } % SMALL ROMAN NUMERAL TWELVE: ⅻ
+\def\romanl {\char"0217C } % SMALL ROMAN NUMERAL FIFTY: ⅼ
+\def\romanc {\char"0217D } % SMALL ROMAN NUMERAL ONE HUNDRED: ⅽ
+\def\romand {\char"0217E } % SMALL ROMAN NUMERAL FIVE HUNDRED: ⅾ
+\def\romanm {\char"0217F } % SMALL ROMAN NUMERAL ONE THOUSAND: ⅿ
+\def\carriagereturn {\char"021B5 } % DOWNWARDS ARROW WITH CORNER LEFTWARDS: ↵
+\def\ideographicspace {\char"03000 } % IDEOGRAPHIC SPACE:  
+\def\ideographichalffillspace {\char"0303F } % IDEOGRAPHIC HALF FILL SPACE: 〿
+\def\ffligature {\char"0FB00 } % LATIN SMALL LIGATURE FF: ff
+\def\filigature {\char"0FB01 } % LATIN SMALL LIGATURE FI: fi
+\def\flligature {\char"0FB02 } % LATIN SMALL LIGATURE FL: fl
+\def\ffiligature {\char"0FB03 } % LATIN SMALL LIGATURE FFI: ffi
+\def\fflligature {\char"0FB04 } % LATIN SMALL LIGATURE FFL: ffl
+\def\stligature {\char"0FB06 } % LATIN SMALL LIGATURE ST: st
+\def\zerowidthnobreakspace {\char"0FEFF } % ZERO WIDTH NO-BREAK SPACE: 
+
+\endinput
diff --git a/tex/context/base/xetx-cls.mkii b/tex/context/base/xetx-cls.mkii
new file mode 100644
index 000000000..6ce696f71
--- /dev/null
+++ b/tex/context/base/xetx-cls.mkii
@@ -0,0 +1,378 @@
+% filename : xetx-cls.tex
+% comment : generated by mtxrun --script chars --xtx
+% author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+% copyright: PRAGMA ADE / ConTeXt Development Team
+% license : see context related readme files
+
+% some character classes for xetex; seems to be rather hard coded, these numbers
+% and also a mix of several classes; here we do linebreaks
+
+\defineXTXcharinjectionclass[lb:cl]
+\defineXTXcharinjectionclass[lb:ex]
+\defineXTXcharinjectionclass[lb:ns]
+\defineXTXcharinjectionclass[lb:id]
+\defineXTXcharinjectionclass[lb:op]
+\defineXTXcharinjectionclass[lb:cm]
+\defineXTXcharinjectionclass[lb:is]
+
+\dofastrecurse{"00000}{"00008}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"0000E}{"0001F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00021}{lb:ex}
+\dosetXTXcharacterclass{"00028}{lb:op}
+\dosetXTXcharacterclass{"00029}{lb:cl}
+\dosetXTXcharacterclass{"0002C}{lb:is}
+\dosetXTXcharacterclass{"0002E}{lb:is}
+\dofastrecurse{"0003A}{"0003B}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:is}}
+\dosetXTXcharacterclass{"0003F}{lb:ex}
+\dosetXTXcharacterclass{"0005B}{lb:op}
+\dosetXTXcharacterclass{"0005D}{lb:cl}
+\dosetXTXcharacterclass{"0007B}{lb:op}
+\dosetXTXcharacterclass{"0007D}{lb:cl}
+\dofastrecurse{"0007F}{"00084}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00086}{"0009F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00300}{"0034E}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00350}{"0035B}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00363}{"0036F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"0037E}{lb:is}
+\dofastrecurse{"00483}{"00489}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00589}{lb:is}
+\dofastrecurse{"00591}{"005BD}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"005BF}{lb:cm}
+\dofastrecurse{"005C1}{"005C2}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"005C4}{"005C5}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"005C6}{lb:ex}
+\dosetXTXcharacterclass{"005C7}{lb:cm}
+\dosetXTXcharacterclass{"0060C}{lb:ex}
+\dosetXTXcharacterclass{"0060D}{lb:is}
+\dofastrecurse{"00610}{"00615}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"0061B}{"0061F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ex}}
+\dofastrecurse{"0064B}{"0065E}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"0066A}{lb:ex}
+\dosetXTXcharacterclass{"00670}{lb:cm}
+\dosetXTXcharacterclass{"006D4}{lb:ex}
+\dofastrecurse{"006D6}{"006DC}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"006DE}{"006E4}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"006E7}{"006E8}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"006EA}{"006ED}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00711}{lb:cm}
+\dofastrecurse{"00730}{"0074A}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"007A6}{"007B0}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"007EB}{"007F3}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"007F8}{lb:is}
+\dosetXTXcharacterclass{"007F9}{lb:ex}
+\dofastrecurse{"00901}{"00903}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"0093C}{lb:cm}
+\dofastrecurse{"0093E}{"0094D}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00951}{"00954}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00962}{"00963}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00981}{"00983}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"009BC}{lb:cm}
+\dofastrecurse{"009BE}{"009CD}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"009D7}{lb:cm}
+\dofastrecurse{"009E2}{"009E3}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00A01}{"00A03}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00A3C}{"00A4D}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00A70}{"00A71}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00A81}{"00A83}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00ABC}{lb:cm}
+\dofastrecurse{"00ABE}{"00ACD}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00AE2}{"00AE3}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00B01}{"00B03}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00B3C}{lb:cm}
+\dofastrecurse{"00B3E}{"00B57}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00B82}{lb:cm}
+\dofastrecurse{"00BBE}{"00BD7}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00C01}{"00C03}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00C3E}{"00C56}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00C82}{"00C83}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00CBC}{lb:cm}
+\dofastrecurse{"00CBE}{"00CD6}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00CE2}{"00CE3}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00D02}{"00D03}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00D3E}{"00D57}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00D82}{"00D83}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00DCA}{"00DF3}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00F0D}{"00F11}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ex}}
+\dosetXTXcharacterclass{"00F14}{lb:ex}
+\dofastrecurse{"00F18}{"00F19}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00F35}{lb:cm}
+\dosetXTXcharacterclass{"00F37}{lb:cm}
+\dosetXTXcharacterclass{"00F39}{lb:cm}
+\dosetXTXcharacterclass{"00F3A}{lb:op}
+\dosetXTXcharacterclass{"00F3B}{lb:cl}
+\dosetXTXcharacterclass{"00F3C}{lb:op}
+\dosetXTXcharacterclass{"00F3D}{lb:cl}
+\dofastrecurse{"00F3E}{"00F3F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00F71}{"00F7E}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00F80}{"00F84}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00F86}{"00F87}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"00F90}{"00FBC}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"00FC6}{lb:cm}
+\dosetXTXcharacterclass{"0135F}{lb:cm}
+\dosetXTXcharacterclass{"0169B}{lb:op}
+\dosetXTXcharacterclass{"0169C}{lb:cl}
+\dofastrecurse{"01712}{"01714}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01732}{"01734}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01752}{"01753}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01772}{"01773}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"017D6}{lb:ns}
+\dofastrecurse{"0180B}{"0180D}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"018A9}{lb:cm}
+\dofastrecurse{"01920}{"0193B}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01944}{"01945}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ex}}
+\dofastrecurse{"01A17}{"01A1B}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01B00}{"01B04}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01B34}{"01B44}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01B6B}{"01B73}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"01DC0}{"01DFF}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"0200C}{"0200F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"0201A}{lb:op}
+\dosetXTXcharacterclass{"0201E}{lb:op}
+\dofastrecurse{"0202A}{"0202E}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"0203C}{"0203D}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dosetXTXcharacterclass{"02044}{lb:is}
+\dosetXTXcharacterclass{"02045}{lb:op}
+\dosetXTXcharacterclass{"02046}{lb:cl}
+\dofastrecurse{"02047}{"02049}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"0206A}{"0206F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"0207D}{lb:op}
+\dosetXTXcharacterclass{"0207E}{lb:cl}
+\dosetXTXcharacterclass{"0208D}{lb:op}
+\dosetXTXcharacterclass{"0208E}{lb:cl}
+\dofastrecurse{"020D0}{"020EF}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"02329}{lb:op}
+\dosetXTXcharacterclass{"0232A}{lb:cl}
+\dofastrecurse{"02762}{"02763}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ex}}
+\dosetXTXcharacterclass{"02768}{lb:op}
+\dosetXTXcharacterclass{"02769}{lb:cl}
+\dosetXTXcharacterclass{"0276A}{lb:op}
+\dosetXTXcharacterclass{"0276B}{lb:cl}
+\dosetXTXcharacterclass{"0276C}{lb:op}
+\dosetXTXcharacterclass{"0276D}{lb:cl}
+\dosetXTXcharacterclass{"0276E}{lb:op}
+\dosetXTXcharacterclass{"0276F}{lb:cl}
+\dosetXTXcharacterclass{"02770}{lb:op}
+\dosetXTXcharacterclass{"02771}{lb:cl}
+\dosetXTXcharacterclass{"02772}{lb:op}
+\dosetXTXcharacterclass{"02773}{lb:cl}
+\dosetXTXcharacterclass{"02774}{lb:op}
+\dosetXTXcharacterclass{"02775}{lb:cl}
+\dosetXTXcharacterclass{"027C5}{lb:op}
+\dosetXTXcharacterclass{"027C6}{lb:cl}
+\dosetXTXcharacterclass{"027E6}{lb:op}
+\dosetXTXcharacterclass{"027E7}{lb:cl}
+\dosetXTXcharacterclass{"027E8}{lb:op}
+\dosetXTXcharacterclass{"027E9}{lb:cl}
+\dosetXTXcharacterclass{"027EA}{lb:op}
+\dosetXTXcharacterclass{"027EB}{lb:cl}
+\dosetXTXcharacterclass{"02983}{lb:op}
+\dosetXTXcharacterclass{"02984}{lb:cl}
+\dosetXTXcharacterclass{"02985}{lb:op}
+\dosetXTXcharacterclass{"02986}{lb:cl}
+\dosetXTXcharacterclass{"02987}{lb:op}
+\dosetXTXcharacterclass{"02988}{lb:cl}
+\dosetXTXcharacterclass{"02989}{lb:op}
+\dosetXTXcharacterclass{"0298A}{lb:cl}
+\dosetXTXcharacterclass{"0298B}{lb:op}
+\dosetXTXcharacterclass{"0298C}{lb:cl}
+\dosetXTXcharacterclass{"0298D}{lb:op}
+\dosetXTXcharacterclass{"0298E}{lb:cl}
+\dosetXTXcharacterclass{"0298F}{lb:op}
+\dosetXTXcharacterclass{"02990}{lb:cl}
+\dosetXTXcharacterclass{"02991}{lb:op}
+\dosetXTXcharacterclass{"02992}{lb:cl}
+\dosetXTXcharacterclass{"02993}{lb:op}
+\dosetXTXcharacterclass{"02994}{lb:cl}
+\dosetXTXcharacterclass{"02995}{lb:op}
+\dosetXTXcharacterclass{"02996}{lb:cl}
+\dosetXTXcharacterclass{"02997}{lb:op}
+\dosetXTXcharacterclass{"02998}{lb:cl}
+\dosetXTXcharacterclass{"029D8}{lb:op}
+\dosetXTXcharacterclass{"029D9}{lb:cl}
+\dosetXTXcharacterclass{"029DA}{lb:op}
+\dosetXTXcharacterclass{"029DB}{lb:cl}
+\dosetXTXcharacterclass{"029FC}{lb:op}
+\dosetXTXcharacterclass{"029FD}{lb:cl}
+\dofastrecurse{"02E80}{"03000}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"03001}{"03002}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cl}}
+\dofastrecurse{"03003}{"03004}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"03005}{lb:ns}
+\dofastrecurse{"03006}{"03007}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"03008}{lb:op}
+\dosetXTXcharacterclass{"03009}{lb:cl}
+\dosetXTXcharacterclass{"0300A}{lb:op}
+\dosetXTXcharacterclass{"0300B}{lb:cl}
+\dosetXTXcharacterclass{"0300C}{lb:op}
+\dosetXTXcharacterclass{"0300D}{lb:cl}
+\dosetXTXcharacterclass{"0300E}{lb:op}
+\dosetXTXcharacterclass{"0300F}{lb:cl}
+\dosetXTXcharacterclass{"03010}{lb:op}
+\dosetXTXcharacterclass{"03011}{lb:cl}
+\dofastrecurse{"03012}{"03013}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"03014}{lb:op}
+\dosetXTXcharacterclass{"03015}{lb:cl}
+\dosetXTXcharacterclass{"03016}{lb:op}
+\dosetXTXcharacterclass{"03017}{lb:cl}
+\dosetXTXcharacterclass{"03018}{lb:op}
+\dosetXTXcharacterclass{"03019}{lb:cl}
+\dosetXTXcharacterclass{"0301A}{lb:op}
+\dosetXTXcharacterclass{"0301B}{lb:cl}
+\dosetXTXcharacterclass{"0301C}{lb:ns}
+\dosetXTXcharacterclass{"0301D}{lb:op}
+\dofastrecurse{"0301E}{"0301F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cl}}
+\dofastrecurse{"03020}{"03029}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"0302A}{"0302F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"03030}{"0303A}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"0303B}{"0303C}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"0303D}{"0303F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"03041}{lb:ns}
+\dosetXTXcharacterclass{"03042}{lb:id}
+\dosetXTXcharacterclass{"03043}{lb:ns}
+\dosetXTXcharacterclass{"03044}{lb:id}
+\dosetXTXcharacterclass{"03045}{lb:ns}
+\dosetXTXcharacterclass{"03046}{lb:id}
+\dosetXTXcharacterclass{"03047}{lb:ns}
+\dosetXTXcharacterclass{"03048}{lb:id}
+\dosetXTXcharacterclass{"03049}{lb:ns}
+\dofastrecurse{"0304A}{"03062}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"03063}{lb:ns}
+\dofastrecurse{"03064}{"03082}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"03083}{lb:ns}
+\dosetXTXcharacterclass{"03084}{lb:id}
+\dosetXTXcharacterclass{"03085}{lb:ns}
+\dosetXTXcharacterclass{"03086}{lb:id}
+\dosetXTXcharacterclass{"03087}{lb:ns}
+\dofastrecurse{"03088}{"0308D}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0308E}{lb:ns}
+\dofastrecurse{"0308F}{"03094}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"03095}{"03096}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"03099}{"0309A}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"0309B}{"0309E}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dosetXTXcharacterclass{"0309F}{lb:id}
+\dofastrecurse{"030A0}{"030A1}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dosetXTXcharacterclass{"030A2}{lb:id}
+\dosetXTXcharacterclass{"030A3}{lb:ns}
+\dosetXTXcharacterclass{"030A4}{lb:id}
+\dosetXTXcharacterclass{"030A5}{lb:ns}
+\dosetXTXcharacterclass{"030A6}{lb:id}
+\dosetXTXcharacterclass{"030A7}{lb:ns}
+\dosetXTXcharacterclass{"030A8}{lb:id}
+\dosetXTXcharacterclass{"030A9}{lb:ns}
+\dofastrecurse{"030AA}{"030C2}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"030C3}{lb:ns}
+\dofastrecurse{"030C4}{"030E2}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"030E3}{lb:ns}
+\dosetXTXcharacterclass{"030E4}{lb:id}
+\dosetXTXcharacterclass{"030E5}{lb:ns}
+\dosetXTXcharacterclass{"030E6}{lb:id}
+\dosetXTXcharacterclass{"030E7}{lb:ns}
+\dofastrecurse{"030E8}{"030ED}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"030EE}{lb:ns}
+\dofastrecurse{"030EF}{"030F4}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"030F5}{"030F6}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"030F7}{"030FA}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"030FB}{"030FE}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"030FF}{"031CF}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"031F0}{"031FF}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"03200}{"03400}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"04E00}{"0A014}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0A015}{lb:ns}
+\dofastrecurse{"0A016}{"0A4C6}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0A802}{lb:cm}
+\dosetXTXcharacterclass{"0A806}{lb:cm}
+\dosetXTXcharacterclass{"0A80B}{lb:cm}
+\dofastrecurse{"0A823}{"0A827}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"0A876}{"0A877}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ex}}
+\dofastrecurse{"0F900}{"0FAD9}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FB1E}{lb:cm}
+\dosetXTXcharacterclass{"0FD3E}{lb:op}
+\dosetXTXcharacterclass{"0FD3F}{lb:cl}
+\dofastrecurse{"0FE00}{"0FE0F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dosetXTXcharacterclass{"0FE10}{lb:is}
+\dofastrecurse{"0FE11}{"0FE12}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cl}}
+\dofastrecurse{"0FE13}{"0FE14}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:is}}
+\dofastrecurse{"0FE15}{"0FE16}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ex}}
+\dosetXTXcharacterclass{"0FE17}{lb:op}
+\dosetXTXcharacterclass{"0FE18}{lb:cl}
+\dofastrecurse{"0FE20}{"0FE23}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"0FE30}{"0FE34}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FE35}{lb:op}
+\dosetXTXcharacterclass{"0FE36}{lb:cl}
+\dosetXTXcharacterclass{"0FE37}{lb:op}
+\dosetXTXcharacterclass{"0FE38}{lb:cl}
+\dosetXTXcharacterclass{"0FE39}{lb:op}
+\dosetXTXcharacterclass{"0FE3A}{lb:cl}
+\dosetXTXcharacterclass{"0FE3B}{lb:op}
+\dosetXTXcharacterclass{"0FE3C}{lb:cl}
+\dosetXTXcharacterclass{"0FE3D}{lb:op}
+\dosetXTXcharacterclass{"0FE3E}{lb:cl}
+\dosetXTXcharacterclass{"0FE3F}{lb:op}
+\dosetXTXcharacterclass{"0FE40}{lb:cl}
+\dosetXTXcharacterclass{"0FE41}{lb:op}
+\dosetXTXcharacterclass{"0FE42}{lb:cl}
+\dosetXTXcharacterclass{"0FE43}{lb:op}
+\dosetXTXcharacterclass{"0FE44}{lb:cl}
+\dofastrecurse{"0FE45}{"0FE46}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FE47}{lb:op}
+\dosetXTXcharacterclass{"0FE48}{lb:cl}
+\dofastrecurse{"0FE49}{"0FE4F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FE50}{lb:cl}
+\dosetXTXcharacterclass{"0FE51}{lb:id}
+\dosetXTXcharacterclass{"0FE52}{lb:cl}
+\dofastrecurse{"0FE54}{"0FE55}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"0FE56}{"0FE57}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ex}}
+\dosetXTXcharacterclass{"0FE58}{lb:id}
+\dosetXTXcharacterclass{"0FE59}{lb:op}
+\dosetXTXcharacterclass{"0FE5A}{lb:cl}
+\dosetXTXcharacterclass{"0FE5B}{lb:op}
+\dosetXTXcharacterclass{"0FE5C}{lb:cl}
+\dosetXTXcharacterclass{"0FE5D}{lb:op}
+\dosetXTXcharacterclass{"0FE5E}{lb:cl}
+\dofastrecurse{"0FE5F}{"0FE68}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FE6B}{lb:id}
+\dosetXTXcharacterclass{"0FF01}{lb:ex}
+\dofastrecurse{"0FF02}{"0FF03}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"0FF06}{"0FF07}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FF08}{lb:op}
+\dosetXTXcharacterclass{"0FF09}{lb:cl}
+\dofastrecurse{"0FF0A}{"0FF0B}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FF0C}{lb:cl}
+\dosetXTXcharacterclass{"0FF0D}{lb:id}
+\dosetXTXcharacterclass{"0FF0E}{lb:cl}
+\dofastrecurse{"0FF0F}{"0FF19}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"0FF1A}{"0FF1B}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"0FF1C}{"0FF1E}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FF1F}{lb:ex}
+\dofastrecurse{"0FF20}{"0FF3A}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FF3B}{lb:op}
+\dosetXTXcharacterclass{"0FF3C}{lb:id}
+\dosetXTXcharacterclass{"0FF3D}{lb:cl}
+\dofastrecurse{"0FF3E}{"0FF5A}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dosetXTXcharacterclass{"0FF5B}{lb:op}
+\dosetXTXcharacterclass{"0FF5C}{lb:id}
+\dosetXTXcharacterclass{"0FF5D}{lb:cl}
+\dosetXTXcharacterclass{"0FF5E}{lb:id}
+\dosetXTXcharacterclass{"0FF5F}{lb:op}
+\dofastrecurse{"0FF60}{"0FF61}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cl}}
+\dosetXTXcharacterclass{"0FF62}{lb:op}
+\dofastrecurse{"0FF63}{"0FF64}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cl}}
+\dosetXTXcharacterclass{"0FF65}{lb:ns}
+\dofastrecurse{"0FF67}{"0FF70}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"0FF9E}{"0FF9F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:ns}}
+\dofastrecurse{"0FFE2}{"0FFE4}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"0FFF9}{"0FFFB}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"10A01}{"10A0F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"10A38}{"10A3F}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"1D165}{"1D169}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"1D16D}{"1D182}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"1D185}{"1D18B}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"1D1AA}{"1D1AD}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"1D242}{"1D244}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+\dofastrecurse{"20000}{"2FA1D}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"E0001}{"E01EF}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:cm}}
+
+\dofastrecurse{"03400}{"04DB5}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"04E00}{"09FBB}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+\dofastrecurse{"20000}{"2A6D6}{1}{\dosetXTXcharacterclass\fastrecursecounter{lb:id}}
+
+\endinput
diff --git a/tex/context/base/xetx-ini.mkii b/tex/context/base/xetx-ini.mkii
new file mode 100644
index 000000000..db3cccabd
--- /dev/null
+++ b/tex/context/base/xetx-ini.mkii
@@ -0,0 +1,132 @@
+%D \module
+%D [ file=xetx-ini,
+%D version=2004.09.11,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=\XETEX\ Initializations,
+%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 moved some code around and now have reorganized the xetex
+%D code in the \type {xetx} module namespace.
+
+\unprotect
+
+%D Some defaults.
+
+\ifdefined\XeTeXuseglyphmetrics
+ \XeTeXuseglyphmetrics\plusone
+\fi
+
+%D Character classes.
+
+\newcount\nofXTXcharinjections
+
+\def\defineXTXcharinjectionclass[#1]%
+ {\global\advance\nofXTXcharinjections\plusone
+ \setxvalue{@xtx@cc@#1}{\number\nofXTXcharinjections}}
+
+\setxvalue{@xtx@cc@\s!default}{0}
+
+\def\getXTXcharinjectionclass#1%
+ {\csname @xtx@cc@\ifcsname @xtx@cc@#1\endcsname#1\else\s!default\fi\endcsname}
+
+\let\currentXTXcharinjection\s!default
+
+\def\startXTXcharinjecxtions[#1]%
+ {\pushmacro\currentXTXcharinjection
+ \def\currentXTXcharinjection{#1}}
+
+\def\stopXTXcharinjections
+ {\popmacro\currentXTXcharinjection}
+
+\def\defineXTXcharinjection #1 #2 %
+ {\doifnumberelse{#1}{\edef\XTXclassone{\number#1}}{\edef\XTXclassone{\getXTXcharinjectionclas{#1}}}%
+ \doifnumberelse{#2}{\edef\XTXclasstwo{\number#2}}{\edef\XTXclasstwo{\getXTXcharinjectionclas{#2}}}%
+ \expanded{\dodefineXTXcharinjection{\XTXclassone}{\XTXclasstwo}}}
+
+\def\setXTXcharcodes #1 #2 #3 % encoding syntax
+ {\catcode#1=11 \lccode #1=#2 \uccode #1=#3 }
+
+\def\dosetXTXcharcodes#1#2#3% compact syntax
+ {\catcode#1=11 \lccode #1=#2 \uccode #1=#3 }
+
+\ifdefined\XeTeXinterchartoks
+
+ \long\def\dodefineXTXcharinjection#1#2#3%
+ {\XeTeXinterchartoks #1 #2 {\XTXcharinjection{#1}{#2}}%
+ \setvalue{@xtx@ch@\currentXTXcharinjection @#1@#2@}{#3}}
+
+ \def\setXTXcharacterclass #1 #2 %
+ {\doifnumberelse{#2}
+ {\XeTeXcharclass#1=#2\relax}
+ {\XeTeXcharclass#1=\getXTXcharinjectionclass{#2}\relax}}
+
+ \def\dosetXTXcharacterclass#1% #2 fast one
+ {\XeTeXcharclass#1=\getXTXcharinjectionclass}
+
+\else
+
+ \long\def\dodefineXTXcharinjection#1#2#3%
+ {\setvalue{@xtx@ch@\currentXTXcharinjection @#1@#2@}{#3}}
+
+ \def\setXTXcharacterclass #1 #2 %
+ {}
+
+\fi
+
+\chardef\XTXcharinjectionsmode=1
+
+\letvalue{@xtx@ch@\s!empty}\empty
+
+\def\XTXcharinjection#1#2%
+ {\csname @xtx@ch@%
+ \ifcase\XTXcharinjectionsmode
+ \s!empty
+ \or
+ \ifcsname @xtx@ch@\currentXTXcharinjection @#1@#2@\endcsname \currentXTXcharinjection @#1@#2@\fi
+ \or
+ \ifcsname @xtx@ch@\currentXTXcharinjection @#1@#2@\endcsname \currentXTXcharinjection @#1@#2@\else
+ \ifcsname @xtx@ch@\s!default @#1@#2@\endcsname \s!default @#1@#2@\else
+ \s!empty
+ \fi\fi
+ \else
+ \s!empty
+ \fi
+ \endcsname}
+
+\def\enableXTXcharinjections[#1]%
+ {\def\currentXTXcharinjection{#1}}
+
+\protect \endinput
+
+\starttext
+
+\startXTXcharinjecxtions[default]
+ \defineXTXcharinjection 10 40 {[default]}
+\stopXTXcharinjections
+
+\startXTXcharinjecxtions[whatever]
+ \defineXTXcharinjection 20 40 {[whatever]}
+\stopXTXcharinjections
+
+\chardef\XTXcharinjectionsmode=0
+
+\enableXTXcharinjections[default] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
+\enableXTXcharinjections[whatever] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
+
+\chardef\XTXcharinjectionsmode=1
+
+\enableXTXcharinjections[default] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
+\enableXTXcharinjections[whatever] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
+
+\chardef\XTXcharinjectionsmode=2
+
+\enableXTXcharinjections[default] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
+\enableXTXcharinjections[whatever] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
+
+\stoptext
diff --git a/tex/context/base/xetx-utf.mkii b/tex/context/base/xetx-utf.mkii
new file mode 100644
index 000000000..79bd00745
--- /dev/null
+++ b/tex/context/base/xetx-utf.mkii
@@ -0,0 +1,1989 @@
+% filename : xetx-utf.tex
+% comment : generated by mtxrun --script chars --xtx
+% author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+% copyright: PRAGMA ADE / ConTeXt Development Team
+% license : see context related readme files
+
+% lc/uc/catcode mappings
+
+\setXTXcharcodes "00041 "00061 "00041 % LATIN CAPITAL LETTER A
+\setXTXcharcodes "00042 "00062 "00042 % LATIN CAPITAL LETTER B
+\setXTXcharcodes "00043 "00063 "00043 % LATIN CAPITAL LETTER C
+\setXTXcharcodes "00044 "00064 "00044 % LATIN CAPITAL LETTER D
+\setXTXcharcodes "00045 "00065 "00045 % LATIN CAPITAL LETTER E
+\setXTXcharcodes "00046 "00066 "00046 % LATIN CAPITAL LETTER F
+\setXTXcharcodes "00047 "00067 "00047 % LATIN CAPITAL LETTER G
+\setXTXcharcodes "00048 "00068 "00048 % LATIN CAPITAL LETTER H
+\setXTXcharcodes "00049 "00069 "00049 % LATIN CAPITAL LETTER I
+\setXTXcharcodes "0004A "0006A "0004A % LATIN CAPITAL LETTER J
+\setXTXcharcodes "0004B "0006B "0004B % LATIN CAPITAL LETTER K
+\setXTXcharcodes "0004C "0006C "0004C % LATIN CAPITAL LETTER L
+\setXTXcharcodes "0004D "0006D "0004D % LATIN CAPITAL LETTER M
+\setXTXcharcodes "0004E "0006E "0004E % LATIN CAPITAL LETTER N
+\setXTXcharcodes "0004F "0006F "0004F % LATIN CAPITAL LETTER O
+\setXTXcharcodes "00050 "00070 "00050 % LATIN CAPITAL LETTER P
+\setXTXcharcodes "00051 "00071 "00051 % LATIN CAPITAL LETTER Q
+\setXTXcharcodes "00052 "00072 "00052 % LATIN CAPITAL LETTER R
+\setXTXcharcodes "00053 "00073 "00053 % LATIN CAPITAL LETTER S
+\setXTXcharcodes "00054 "00074 "00054 % LATIN CAPITAL LETTER T
+\setXTXcharcodes "00055 "00075 "00055 % LATIN CAPITAL LETTER U
+\setXTXcharcodes "00056 "00076 "00056 % LATIN CAPITAL LETTER V
+\setXTXcharcodes "00057 "00077 "00057 % LATIN CAPITAL LETTER W
+\setXTXcharcodes "00058 "00078 "00058 % LATIN CAPITAL LETTER X
+\setXTXcharcodes "00059 "00079 "00059 % LATIN CAPITAL LETTER Y
+\setXTXcharcodes "0005A "0007A "0005A % LATIN CAPITAL LETTER Z
+\setXTXcharcodes "00061 "00061 "00041 % LATIN SMALL LETTER A
+\setXTXcharcodes "00062 "00062 "00042 % LATIN SMALL LETTER B
+\setXTXcharcodes "00063 "00063 "00043 % LATIN SMALL LETTER C
+\setXTXcharcodes "00064 "00064 "00044 % LATIN SMALL LETTER D
+\setXTXcharcodes "00065 "00065 "00045 % LATIN SMALL LETTER E
+\setXTXcharcodes "00066 "00066 "00046 % LATIN SMALL LETTER F
+\setXTXcharcodes "00067 "00067 "00047 % LATIN SMALL LETTER G
+\setXTXcharcodes "00068 "00068 "00048 % LATIN SMALL LETTER H
+\setXTXcharcodes "00069 "00069 "00049 % LATIN SMALL LETTER I
+\setXTXcharcodes "0006A "0006A "0004A % LATIN SMALL LETTER J
+\setXTXcharcodes "0006B "0006B "0004B % LATIN SMALL LETTER K
+\setXTXcharcodes "0006C "0006C "0004C % LATIN SMALL LETTER L
+\setXTXcharcodes "0006D "0006D "0004D % LATIN SMALL LETTER M
+\setXTXcharcodes "0006E "0006E "0004E % LATIN SMALL LETTER N
+\setXTXcharcodes "0006F "0006F "0004F % LATIN SMALL LETTER O
+\setXTXcharcodes "00070 "00070 "00050 % LATIN SMALL LETTER P
+\setXTXcharcodes "00071 "00071 "00051 % LATIN SMALL LETTER Q
+\setXTXcharcodes "00072 "00072 "00052 % LATIN SMALL LETTER R
+\setXTXcharcodes "00073 "00073 "00053 % LATIN SMALL LETTER S
+\setXTXcharcodes "00074 "00074 "00054 % LATIN SMALL LETTER T
+\setXTXcharcodes "00075 "00075 "00055 % LATIN SMALL LETTER U
+\setXTXcharcodes "00076 "00076 "00056 % LATIN SMALL LETTER V
+\setXTXcharcodes "00077 "00077 "00057 % LATIN SMALL LETTER W
+\setXTXcharcodes "00078 "00078 "00058 % LATIN SMALL LETTER X
+\setXTXcharcodes "00079 "00079 "00059 % LATIN SMALL LETTER Y
+\setXTXcharcodes "0007A "0007A "0005A % LATIN SMALL LETTER Z
+\setXTXcharcodes "000AA "000AA "000AA % FEMININE ORDINAL INDICATOR
+\setXTXcharcodes "000B5 "000B5 "0039C % MICRO SIGN
+\setXTXcharcodes "000BA "000BA "000BA % MASCULINE ORDINAL INDICATOR
+\setXTXcharcodes "000C0 "000E0 "000C0 % LATIN CAPITAL LETTER A WITH GRAVE
+\setXTXcharcodes "000C1 "000E1 "000C1 % LATIN CAPITAL LETTER A WITH ACUTE
+\setXTXcharcodes "000C2 "000E2 "000C2 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+\setXTXcharcodes "000C3 "000E3 "000C3 % LATIN CAPITAL LETTER A WITH TILDE
+\setXTXcharcodes "000C4 "000E4 "000C4 % LATIN CAPITAL LETTER A WITH DIAERESIS
+\setXTXcharcodes "000C5 "000E5 "000C5 % LATIN CAPITAL LETTER A WITH RING ABOVE
+\setXTXcharcodes "000C6 "000E6 "000C6 % LATIN CAPITAL LETTER AE
+\setXTXcharcodes "000C7 "000E7 "000C7 % LATIN CAPITAL LETTER C WITH CEDILLA
+\setXTXcharcodes "000C8 "000E8 "000C8 % LATIN CAPITAL LETTER E WITH GRAVE
+\setXTXcharcodes "000C9 "000E9 "000C9 % LATIN CAPITAL LETTER E WITH ACUTE
+\setXTXcharcodes "000CA "000EA "000CA % LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+\setXTXcharcodes "000CB "000EB "000CB % LATIN CAPITAL LETTER E WITH DIAERESIS
+\setXTXcharcodes "000CC "000EC "000CC % LATIN CAPITAL LETTER I WITH GRAVE
+\setXTXcharcodes "000CD "000ED "000CD % LATIN CAPITAL LETTER I WITH ACUTE
+\setXTXcharcodes "000CE "000EE "000CE % LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+\setXTXcharcodes "000CF "000EF "000CF % LATIN CAPITAL LETTER I WITH DIAERESIS
+\setXTXcharcodes "000D0 "000F0 "000D0 % LATIN CAPITAL LETTER ETH
+\setXTXcharcodes "000D1 "000F1 "000D1 % LATIN CAPITAL LETTER N WITH TILDE
+\setXTXcharcodes "000D2 "000F2 "000D2 % LATIN CAPITAL LETTER O WITH GRAVE
+\setXTXcharcodes "000D3 "000F3 "000D3 % LATIN CAPITAL LETTER O WITH ACUTE
+\setXTXcharcodes "000D4 "000F4 "000D4 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+\setXTXcharcodes "000D5 "000F5 "000D5 % LATIN CAPITAL LETTER O WITH TILDE
+\setXTXcharcodes "000D6 "000F6 "000D6 % LATIN CAPITAL LETTER O WITH DIAERESIS
+\setXTXcharcodes "000D8 "000F8 "000D8 % LATIN CAPITAL LETTER O WITH STROKE
+\setXTXcharcodes "000D9 "000F9 "000D9 % LATIN CAPITAL LETTER U WITH GRAVE
+\setXTXcharcodes "000DA "000FA "000DA % LATIN CAPITAL LETTER U WITH ACUTE
+\setXTXcharcodes "000DB "000FB "000DB % LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+\setXTXcharcodes "000DC "000FC "000DC % LATIN CAPITAL LETTER U WITH DIAERESIS
+\setXTXcharcodes "000DD "000FD "000DD % LATIN CAPITAL LETTER Y WITH ACUTE
+\setXTXcharcodes "000DE "000FE "000DE % LATIN CAPITAL LETTER THORN
+\setXTXcharcodes "000DF "000DF "000DF % LATIN SMALL LETTER SHARP S
+\setXTXcharcodes "000E0 "000E0 "000C0 % LATIN SMALL LETTER A WITH GRAVE
+\setXTXcharcodes "000E1 "000E1 "000C1 % LATIN SMALL LETTER A WITH ACUTE
+\setXTXcharcodes "000E2 "000E2 "000C2 % LATIN SMALL LETTER A WITH CIRCUMFLEX
+\setXTXcharcodes "000E3 "000E3 "000C3 % LATIN SMALL LETTER A WITH TILDE
+\setXTXcharcodes "000E4 "000E4 "000C4 % LATIN SMALL LETTER A WITH DIAERESIS
+\setXTXcharcodes "000E5 "000E5 "000C5 % LATIN SMALL LETTER A WITH RING ABOVE
+\setXTXcharcodes "000E6 "000E6 "000C6 % LATIN SMALL LETTER AE
+\setXTXcharcodes "000E7 "000E7 "000C7 % LATIN SMALL LETTER C WITH CEDILLA
+\setXTXcharcodes "000E8 "000E8 "000C8 % LATIN SMALL LETTER E WITH GRAVE
+\setXTXcharcodes "000E9 "000E9 "000C9 % LATIN SMALL LETTER E WITH ACUTE
+\setXTXcharcodes "000EA "000EA "000CA % LATIN SMALL LETTER E WITH CIRCUMFLEX
+\setXTXcharcodes "000EB "000EB "000CB % LATIN SMALL LETTER E WITH DIAERESIS
+\setXTXcharcodes "000EC "000EC "000CC % LATIN SMALL LETTER I WITH GRAVE
+\setXTXcharcodes "000ED "000ED "000CD % LATIN SMALL LETTER I WITH ACUTE
+\setXTXcharcodes "000EE "000EE "000CE % LATIN SMALL LETTER I WITH CIRCUMFLEX
+\setXTXcharcodes "000EF "000EF "000CF % LATIN SMALL LETTER I WITH DIAERESIS
+\setXTXcharcodes "000F0 "000F0 "000D0 % LATIN SMALL LETTER ETH
+\setXTXcharcodes "000F1 "000F1 "000D1 % LATIN SMALL LETTER N WITH TILDE
+\setXTXcharcodes "000F2 "000F2 "000D2 % LATIN SMALL LETTER O WITH GRAVE
+\setXTXcharcodes "000F3 "000F3 "000D3 % LATIN SMALL LETTER O WITH ACUTE
+\setXTXcharcodes "000F4 "000F4 "000D4 % LATIN SMALL LETTER O WITH CIRCUMFLEX
+\setXTXcharcodes "000F5 "000F5 "000D5 % LATIN SMALL LETTER O WITH TILDE
+\setXTXcharcodes "000F6 "000F6 "000D6 % LATIN SMALL LETTER O WITH DIAERESIS
+\setXTXcharcodes "000F8 "000F8 "000D8 % LATIN SMALL LETTER O WITH STROKE
+\setXTXcharcodes "000F9 "000F9 "000D9 % LATIN SMALL LETTER U WITH GRAVE
+\setXTXcharcodes "000FA "000FA "000DA % LATIN SMALL LETTER U WITH ACUTE
+\setXTXcharcodes "000FB "000FB "000DB % LATIN SMALL LETTER U WITH CIRCUMFLEX
+\setXTXcharcodes "000FC "000FC "000DC % LATIN SMALL LETTER U WITH DIAERESIS
+\setXTXcharcodes "000FD "000FD "000DD % LATIN SMALL LETTER Y WITH ACUTE
+\setXTXcharcodes "000FE "000FE "000DE % LATIN SMALL LETTER THORN
+\setXTXcharcodes "000FF "000FF "00178 % LATIN SMALL LETTER Y WITH DIAERESIS
+\setXTXcharcodes "00100 "00101 "00100 % LATIN CAPITAL LETTER A WITH MACRON
+\setXTXcharcodes "00101 "00101 "00100 % LATIN SMALL LETTER A WITH MACRON
+\setXTXcharcodes "00102 "00103 "00102 % LATIN CAPITAL LETTER A WITH BREVE
+\setXTXcharcodes "00103 "00103 "00102 % LATIN SMALL LETTER A WITH BREVE
+\setXTXcharcodes "00104 "00105 "00104 % LATIN CAPITAL LETTER A WITH OGONEK
+\setXTXcharcodes "00105 "00105 "00104 % LATIN SMALL LETTER A WITH OGONEK
+\setXTXcharcodes "00106 "00107 "00106 % LATIN CAPITAL LETTER C WITH ACUTE
+\setXTXcharcodes "00107 "00107 "00106 % LATIN SMALL LETTER C WITH ACUTE
+\setXTXcharcodes "00108 "00109 "00108 % LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+\setXTXcharcodes "00109 "00109 "00108 % LATIN SMALL LETTER C WITH CIRCUMFLEX
+\setXTXcharcodes "0010A "0010B "0010A % LATIN CAPITAL LETTER C WITH DOT ABOVE
+\setXTXcharcodes "0010B "0010B "0010A % LATIN SMALL LETTER C WITH DOT ABOVE
+\setXTXcharcodes "0010C "0010D "0010C % LATIN CAPITAL LETTER C WITH CARON
+\setXTXcharcodes "0010D "0010D "0010C % LATIN SMALL LETTER C WITH CARON
+\setXTXcharcodes "0010E "0010F "0010E % LATIN CAPITAL LETTER D WITH CARON
+\setXTXcharcodes "0010F "0010F "0010E % LATIN SMALL LETTER D WITH CARON
+\setXTXcharcodes "00110 "00111 "00110 % LATIN CAPITAL LETTER D WITH STROKE
+\setXTXcharcodes "00111 "00111 "00110 % LATIN SMALL LETTER D WITH STROKE
+\setXTXcharcodes "00112 "00113 "00112 % LATIN CAPITAL LETTER E WITH MACRON
+\setXTXcharcodes "00113 "00113 "00112 % LATIN SMALL LETTER E WITH MACRON
+\setXTXcharcodes "00114 "00115 "00114 % LATIN CAPITAL LETTER E WITH BREVE
+\setXTXcharcodes "00115 "00115 "00114 % LATIN SMALL LETTER E WITH BREVE
+\setXTXcharcodes "00116 "00117 "00116 % LATIN CAPITAL LETTER E WITH DOT ABOVE
+\setXTXcharcodes "00117 "00117 "00116 % LATIN SMALL LETTER E WITH DOT ABOVE
+\setXTXcharcodes "00118 "00119 "00118 % LATIN CAPITAL LETTER E WITH OGONEK
+\setXTXcharcodes "00119 "00119 "00118 % LATIN SMALL LETTER E WITH OGONEK
+\setXTXcharcodes "0011A "0011B "0011A % LATIN CAPITAL LETTER E WITH CARON
+\setXTXcharcodes "0011B "0011B "0011A % LATIN SMALL LETTER E WITH CARON
+\setXTXcharcodes "0011C "0011D "0011C % LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+\setXTXcharcodes "0011D "0011D "0011C % LATIN SMALL LETTER G WITH CIRCUMFLEX
+\setXTXcharcodes "0011E "0011F "0011E % LATIN CAPITAL LETTER G WITH BREVE
+\setXTXcharcodes "0011F "0011F "0011E % LATIN SMALL LETTER G WITH BREVE
+\setXTXcharcodes "00120 "00121 "00120 % LATIN CAPITAL LETTER G WITH DOT ABOVE
+\setXTXcharcodes "00121 "00121 "00120 % LATIN SMALL LETTER G WITH DOT ABOVE
+\setXTXcharcodes "00122 "00123 "00122 % LATIN CAPITAL LETTER G WITH CEDILLA
+\setXTXcharcodes "00123 "00123 "00122 % LATIN SMALL LETTER G WITH CEDILLA
+\setXTXcharcodes "00124 "00125 "00124 % LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+\setXTXcharcodes "00125 "00125 "00124 % LATIN SMALL LETTER H WITH CIRCUMFLEX
+\setXTXcharcodes "00126 "00127 "00126 % LATIN CAPITAL LETTER H WITH STROKE
+\setXTXcharcodes "00127 "00127 "00126 % LATIN SMALL LETTER H WITH STROKE
+\setXTXcharcodes "00128 "00129 "00128 % LATIN CAPITAL LETTER I WITH TILDE
+\setXTXcharcodes "00129 "00129 "00128 % LATIN SMALL LETTER I WITH TILDE
+\setXTXcharcodes "0012A "0012B "0012A % LATIN CAPITAL LETTER I WITH MACRON
+\setXTXcharcodes "0012B "0012B "0012A % LATIN SMALL LETTER I WITH MACRON
+\setXTXcharcodes "0012C "0012D "0012C % LATIN CAPITAL LETTER I WITH BREVE
+\setXTXcharcodes "0012D "0012D "0012C % LATIN SMALL LETTER I WITH BREVE
+\setXTXcharcodes "0012E "0012F "0012E % LATIN CAPITAL LETTER I WITH OGONEK
+\setXTXcharcodes "0012F "0012F "0012E % LATIN SMALL LETTER I WITH OGONEK
+\setXTXcharcodes "00130 "00069 "00130 % LATIN CAPITAL LETTER I WITH DOT ABOVE
+\setXTXcharcodes "00131 "00131 "00049 % LATIN SMALL LETTER DOTLESS I
+\setXTXcharcodes "00132 "00133 "00132 % LATIN CAPITAL LIGATURE IJ
+\setXTXcharcodes "00133 "00133 "00132 % LATIN SMALL LIGATURE IJ
+\setXTXcharcodes "00134 "00135 "00134 % LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+\setXTXcharcodes "00135 "00135 "00134 % LATIN SMALL LETTER J WITH CIRCUMFLEX
+\setXTXcharcodes "00136 "00137 "00136 % LATIN CAPITAL LETTER K WITH CEDILLA
+\setXTXcharcodes "00137 "00137 "00136 % LATIN SMALL LETTER K WITH CEDILLA
+\setXTXcharcodes "00138 "00138 "00138 % LATIN SMALL LETTER KRA
+\setXTXcharcodes "00139 "0013A "00139 % LATIN CAPITAL LETTER L WITH ACUTE
+\setXTXcharcodes "0013A "0013A "00139 % LATIN SMALL LETTER L WITH ACUTE
+\setXTXcharcodes "0013B "0013C "0013B % LATIN CAPITAL LETTER L WITH CEDILLA
+\setXTXcharcodes "0013C "0013C "0013B % LATIN SMALL LETTER L WITH CEDILLA
+\setXTXcharcodes "0013D "0013E "0013D % LATIN CAPITAL LETTER L WITH CARON
+\setXTXcharcodes "0013E "0013E "0013D % LATIN SMALL LETTER L WITH CARON
+\setXTXcharcodes "0013F "00140 "0013F % LATIN CAPITAL LETTER L WITH MIDDLE DOT
+\setXTXcharcodes "00140 "00140 "0013F % LATIN SMALL LETTER L WITH MIDDLE DOT
+\setXTXcharcodes "00141 "00142 "00141 % LATIN CAPITAL LETTER L WITH STROKE
+\setXTXcharcodes "00142 "00142 "00141 % LATIN SMALL LETTER L WITH STROKE
+\setXTXcharcodes "00143 "00144 "00143 % LATIN CAPITAL LETTER N WITH ACUTE
+\setXTXcharcodes "00144 "00144 "00143 % LATIN SMALL LETTER N WITH ACUTE
+\setXTXcharcodes "00145 "00146 "00145 % LATIN CAPITAL LETTER N WITH CEDILLA
+\setXTXcharcodes "00146 "00146 "00145 % LATIN SMALL LETTER N WITH CEDILLA
+\setXTXcharcodes "00147 "00148 "00147 % LATIN CAPITAL LETTER N WITH CARON
+\setXTXcharcodes "00148 "00148 "00147 % LATIN SMALL LETTER N WITH CARON
+\setXTXcharcodes "00149 "00149 "00149 % LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+\setXTXcharcodes "0014A "0014B "0014A % LATIN CAPITAL LETTER ENG
+\setXTXcharcodes "0014B "0014B "0014A % LATIN SMALL LETTER ENG
+\setXTXcharcodes "0014C "0014D "0014C % LATIN CAPITAL LETTER O WITH MACRON
+\setXTXcharcodes "0014D "0014D "0014C % LATIN SMALL LETTER O WITH MACRON
+\setXTXcharcodes "0014E "0014F "0014E % LATIN CAPITAL LETTER O WITH BREVE
+\setXTXcharcodes "0014F "0014F "0014E % LATIN SMALL LETTER O WITH BREVE
+\setXTXcharcodes "00150 "00151 "00150 % LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+\setXTXcharcodes "00151 "00151 "00150 % LATIN SMALL LETTER O WITH DOUBLE ACUTE
+\setXTXcharcodes "00152 "00153 "00152 % LATIN CAPITAL LIGATURE OE
+\setXTXcharcodes "00153 "00153 "00152 % LATIN SMALL LIGATURE OE
+\setXTXcharcodes "00154 "00155 "00154 % LATIN CAPITAL LETTER R WITH ACUTE
+\setXTXcharcodes "00155 "00155 "00154 % LATIN SMALL LETTER R WITH ACUTE
+\setXTXcharcodes "00156 "00157 "00156 % LATIN CAPITAL LETTER R WITH CEDILLA
+\setXTXcharcodes "00157 "00157 "00156 % LATIN SMALL LETTER R WITH CEDILLA
+\setXTXcharcodes "00158 "00159 "00158 % LATIN CAPITAL LETTER R WITH CARON
+\setXTXcharcodes "00159 "00159 "00158 % LATIN SMALL LETTER R WITH CARON
+\setXTXcharcodes "0015A "0015B "0015A % LATIN CAPITAL LETTER S WITH ACUTE
+\setXTXcharcodes "0015B "0015B "0015A % LATIN SMALL LETTER S WITH ACUTE
+\setXTXcharcodes "0015C "0015D "0015C % LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+\setXTXcharcodes "0015D "0015D "0015C % LATIN SMALL LETTER S WITH CIRCUMFLEX
+\setXTXcharcodes "0015E "0015F "0015E % LATIN CAPITAL LETTER S WITH CEDILLA
+\setXTXcharcodes "0015F "0015F "0015E % LATIN SMALL LETTER S WITH CEDILLA
+\setXTXcharcodes "00160 "00161 "00160 % LATIN CAPITAL LETTER S WITH CARON
+\setXTXcharcodes "00161 "00161 "00160 % LATIN SMALL LETTER S WITH CARON
+\setXTXcharcodes "00162 "00163 "00162 % LATIN CAPITAL LETTER T WITH CEDILLA
+\setXTXcharcodes "00163 "00163 "00162 % LATIN SMALL LETTER T WITH CEDILLA
+\setXTXcharcodes "00164 "00165 "00164 % LATIN CAPITAL LETTER T WITH CARON
+\setXTXcharcodes "00165 "00165 "00164 % LATIN SMALL LETTER T WITH CARON
+\setXTXcharcodes "00166 "00167 "00166 % LATIN CAPITAL LETTER T WITH STROKE
+\setXTXcharcodes "00167 "00167 "00166 % LATIN SMALL LETTER T WITH STROKE
+\setXTXcharcodes "00168 "00169 "00168 % LATIN CAPITAL LETTER U WITH TILDE
+\setXTXcharcodes "00169 "00169 "00168 % LATIN SMALL LETTER U WITH TILDE
+\setXTXcharcodes "0016A "0016B "0016A % LATIN CAPITAL LETTER U WITH MACRON
+\setXTXcharcodes "0016B "0016B "0016A % LATIN SMALL LETTER U WITH MACRON
+\setXTXcharcodes "0016C "0016D "0016C % LATIN CAPITAL LETTER U WITH BREVE
+\setXTXcharcodes "0016D "0016D "0016C % LATIN SMALL LETTER U WITH BREVE
+\setXTXcharcodes "0016E "0016F "0016E % LATIN CAPITAL LETTER U WITH RING ABOVE
+\setXTXcharcodes "0016F "0016F "0016E % LATIN SMALL LETTER U WITH RING ABOVE
+\setXTXcharcodes "00170 "00171 "00170 % LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+\setXTXcharcodes "00171 "00171 "00170 % LATIN SMALL LETTER U WITH DOUBLE ACUTE
+\setXTXcharcodes "00172 "00173 "00172 % LATIN CAPITAL LETTER U WITH OGONEK
+\setXTXcharcodes "00173 "00173 "00172 % LATIN SMALL LETTER U WITH OGONEK
+\setXTXcharcodes "00174 "00175 "00174 % LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+\setXTXcharcodes "00175 "00175 "00174 % LATIN SMALL LETTER W WITH CIRCUMFLEX
+\setXTXcharcodes "00176 "00177 "00176 % LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+\setXTXcharcodes "00177 "00177 "00176 % LATIN SMALL LETTER Y WITH CIRCUMFLEX
+\setXTXcharcodes "00178 "000FF "00178 % LATIN CAPITAL LETTER Y WITH DIAERESIS
+\setXTXcharcodes "00179 "0017A "00179 % LATIN CAPITAL LETTER Z WITH ACUTE
+\setXTXcharcodes "0017A "0017A "00179 % LATIN SMALL LETTER Z WITH ACUTE
+\setXTXcharcodes "0017B "0017C "0017B % LATIN CAPITAL LETTER Z WITH DOT ABOVE
+\setXTXcharcodes "0017C "0017C "0017B % LATIN SMALL LETTER Z WITH DOT ABOVE
+\setXTXcharcodes "0017D "0017E "0017D % LATIN CAPITAL LETTER Z WITH CARON
+\setXTXcharcodes "0017E "0017E "0017D % LATIN SMALL LETTER Z WITH CARON
+\setXTXcharcodes "0017F "0017F "00053 % LATIN SMALL LETTER LONG S
+\setXTXcharcodes "00180 "00180 "00243 % LATIN SMALL LETTER B WITH STROKE
+\setXTXcharcodes "00181 "00253 "00181 % LATIN CAPITAL LETTER B WITH HOOK
+\setXTXcharcodes "00182 "00183 "00182 % LATIN CAPITAL LETTER B WITH TOPBAR
+\setXTXcharcodes "00183 "00183 "00182 % LATIN SMALL LETTER B WITH TOPBAR
+\setXTXcharcodes "00184 "00185 "00184 % LATIN CAPITAL LETTER TONE SIX
+\setXTXcharcodes "00185 "00185 "00184 % LATIN SMALL LETTER TONE SIX
+\setXTXcharcodes "00186 "00254 "00186 % LATIN CAPITAL LETTER OPEN O
+\setXTXcharcodes "00187 "00188 "00187 % LATIN CAPITAL LETTER C WITH HOOK
+\setXTXcharcodes "00188 "00188 "00187 % LATIN SMALL LETTER C WITH HOOK
+\setXTXcharcodes "00189 "00256 "00189 % LATIN CAPITAL LETTER AFRICAN D
+\setXTXcharcodes "0018A "00257 "0018A % LATIN CAPITAL LETTER D WITH HOOK
+\setXTXcharcodes "0018B "0018C "0018B % LATIN CAPITAL LETTER D WITH TOPBAR
+\setXTXcharcodes "0018C "0018C "0018B % LATIN SMALL LETTER D WITH TOPBAR
+\setXTXcharcodes "0018D "0018D "0018D % LATIN SMALL LETTER TURNED DELTA
+\setXTXcharcodes "0018E "001DD "0018E % LATIN CAPITAL LETTER REVERSED E
+\setXTXcharcodes "0018F "00259 "0018F % LATIN CAPITAL LETTER SCHWA
+\setXTXcharcodes "00190 "0025B "00190 % LATIN CAPITAL LETTER OPEN E
+\setXTXcharcodes "00191 "00192 "00191 % LATIN CAPITAL LETTER F WITH HOOK
+\setXTXcharcodes "00192 "00192 "00191 % LATIN SMALL LETTER F WITH HOOK
+\setXTXcharcodes "00193 "00260 "00193 % LATIN CAPITAL LETTER G WITH HOOK
+\setXTXcharcodes "00194 "00263 "00194 % LATIN CAPITAL LETTER GAMMA
+\setXTXcharcodes "00195 "00195 "001F6 % LATIN SMALL LETTER HV
+\setXTXcharcodes "00196 "00269 "00196 % LATIN CAPITAL LETTER IOTA
+\setXTXcharcodes "00197 "00268 "00197 % LATIN CAPITAL LETTER I WITH STROKE
+\setXTXcharcodes "00198 "00199 "00198 % LATIN CAPITAL LETTER K WITH HOOK
+\setXTXcharcodes "00199 "00199 "00198 % LATIN SMALL LETTER K WITH HOOK
+\setXTXcharcodes "0019A "0019A "0023D % LATIN SMALL LETTER L WITH BAR
+\setXTXcharcodes "0019B "0019B "0019B % LATIN SMALL LETTER LAMBDA WITH STROKE
+\setXTXcharcodes "0019C "0026F "0019C % LATIN CAPITAL LETTER TURNED M
+\setXTXcharcodes "0019D "00272 "0019D % LATIN CAPITAL LETTER N WITH LEFT HOOK
+\setXTXcharcodes "0019E "0019E "00220 % LATIN SMALL LETTER N WITH LONG RIGHT LEG
+\setXTXcharcodes "0019F "00275 "0019F % LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+\setXTXcharcodes "001A0 "001A1 "001A0 % LATIN CAPITAL LETTER O WITH HORN
+\setXTXcharcodes "001A1 "001A1 "001A0 % LATIN SMALL LETTER O WITH HORN
+\setXTXcharcodes "001A2 "001A3 "001A2 % LATIN CAPITAL LETTER OI
+\setXTXcharcodes "001A3 "001A3 "001A2 % LATIN SMALL LETTER OI
+\setXTXcharcodes "001A4 "001A5 "001A4 % LATIN CAPITAL LETTER P WITH HOOK
+\setXTXcharcodes "001A5 "001A5 "001A4 % LATIN SMALL LETTER P WITH HOOK
+\setXTXcharcodes "001A6 "00280 "001A6 % LATIN LETTER YR
+\setXTXcharcodes "001A7 "001A8 "001A7 % LATIN CAPITAL LETTER TONE TWO
+\setXTXcharcodes "001A8 "001A8 "001A7 % LATIN SMALL LETTER TONE TWO
+\setXTXcharcodes "001A9 "00283 "001A9 % LATIN CAPITAL LETTER ESH
+\setXTXcharcodes "001AA "001AA "001AA % LATIN LETTER REVERSED ESH LOOP
+\setXTXcharcodes "001AB "001AB "001AB % LATIN SMALL LETTER T WITH PALATAL HOOK
+\setXTXcharcodes "001AC "001AD "001AC % LATIN CAPITAL LETTER T WITH HOOK
+\setXTXcharcodes "001AD "001AD "001AC % LATIN SMALL LETTER T WITH HOOK
+\setXTXcharcodes "001AE "00288 "001AE % LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+\setXTXcharcodes "001AF "001B0 "001AF % LATIN CAPITAL LETTER U WITH HORN
+\setXTXcharcodes "001B0 "001B0 "001AF % LATIN SMALL LETTER U WITH HORN
+\setXTXcharcodes "001B1 "0028A "001B1 % LATIN CAPITAL LETTER UPSILON
+\setXTXcharcodes "001B2 "0028B "001B2 % LATIN CAPITAL LETTER V WITH HOOK
+\setXTXcharcodes "001B3 "001B4 "001B3 % LATIN CAPITAL LETTER Y WITH HOOK
+\setXTXcharcodes "001B4 "001B4 "001B3 % LATIN SMALL LETTER Y WITH HOOK
+\setXTXcharcodes "001B5 "001B6 "001B5 % LATIN CAPITAL LETTER Z WITH STROKE
+\setXTXcharcodes "001B6 "001B6 "001B5 % LATIN SMALL LETTER Z WITH STROKE
+\setXTXcharcodes "001B7 "00292 "001B7 % LATIN CAPITAL LETTER EZH
+\setXTXcharcodes "001B8 "001B9 "001B8 % LATIN CAPITAL LETTER EZH REVERSED
+\setXTXcharcodes "001B9 "001B9 "001B8 % LATIN SMALL LETTER EZH REVERSED
+\setXTXcharcodes "001BA "001BA "001BA % LATIN SMALL LETTER EZH WITH TAIL
+\setXTXcharcodes "001BC "001BD "001BC % LATIN CAPITAL LETTER TONE FIVE
+\setXTXcharcodes "001BD "001BD "001BC % LATIN SMALL LETTER TONE FIVE
+\setXTXcharcodes "001BE "001BE "001BE % LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
+\setXTXcharcodes "001BF "001BF "001F7 % LATIN LETTER WYNN
+\setXTXcharcodes "001C4 "001C6 "001C5 % LATIN CAPITAL LETTER DZ WITH CARON
+\setXTXcharcodes "001C5 "001C6 "001C4 % LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+\setXTXcharcodes "001C6 "001C6 "001C4 % LATIN SMALL LETTER DZ WITH CARON
+\setXTXcharcodes "001C7 "001C9 "001C8 % LATIN CAPITAL LETTER LJ
+\setXTXcharcodes "001C8 "001C9 "001C7 % LATIN CAPITAL LETTER L WITH SMALL LETTER J
+\setXTXcharcodes "001C9 "001C9 "001C7 % LATIN SMALL LETTER LJ
+\setXTXcharcodes "001CA "001CC "001CB % LATIN CAPITAL LETTER NJ
+\setXTXcharcodes "001CB "001CC "001CA % LATIN CAPITAL LETTER N WITH SMALL LETTER J
+\setXTXcharcodes "001CC "001CC "001CA % LATIN SMALL LETTER NJ
+\setXTXcharcodes "001CD "001CE "001CD % LATIN CAPITAL LETTER A WITH CARON
+\setXTXcharcodes "001CE "001CE "001CD % LATIN SMALL LETTER A WITH CARON
+\setXTXcharcodes "001CF "001D0 "001CF % LATIN CAPITAL LETTER I WITH CARON
+\setXTXcharcodes "001D0 "001D0 "001CF % LATIN SMALL LETTER I WITH CARON
+\setXTXcharcodes "001D1 "001D2 "001D1 % LATIN CAPITAL LETTER O WITH CARON
+\setXTXcharcodes "001D2 "001D2 "001D1 % LATIN SMALL LETTER O WITH CARON
+\setXTXcharcodes "001D3 "001D4 "001D3 % LATIN CAPITAL LETTER U WITH CARON
+\setXTXcharcodes "001D4 "001D4 "001D3 % LATIN SMALL LETTER U WITH CARON
+\setXTXcharcodes "001D5 "001D6 "001D5 % LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+\setXTXcharcodes "001D6 "001D6 "001D5 % LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+\setXTXcharcodes "001D7 "001D8 "001D7 % LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+\setXTXcharcodes "001D8 "001D8 "001D7 % LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+\setXTXcharcodes "001D9 "001DA "001D9 % LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+\setXTXcharcodes "001DA "001DA "001D9 % LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+\setXTXcharcodes "001DB "001DC "001DB % LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+\setXTXcharcodes "001DC "001DC "001DB % LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+\setXTXcharcodes "001DD "001DD "0018E % LATIN SMALL LETTER TURNED E
+\setXTXcharcodes "001DE "001DF "001DE % LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+\setXTXcharcodes "001DF "001DF "001DE % LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+\setXTXcharcodes "001E0 "001E1 "001E0 % LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+\setXTXcharcodes "001E1 "001E1 "001E0 % LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+\setXTXcharcodes "001E2 "001E3 "001E2 % LATIN CAPITAL LETTER AE WITH MACRON
+\setXTXcharcodes "001E3 "001E3 "001E2 % LATIN SMALL LETTER AE WITH MACRON
+\setXTXcharcodes "001E4 "001E5 "001E4 % LATIN CAPITAL LETTER G WITH STROKE
+\setXTXcharcodes "001E5 "001E5 "001E4 % LATIN SMALL LETTER G WITH STROKE
+\setXTXcharcodes "001E6 "001E7 "001E6 % LATIN CAPITAL LETTER G WITH CARON
+\setXTXcharcodes "001E7 "001E7 "001E6 % LATIN SMALL LETTER G WITH CARON
+\setXTXcharcodes "001E8 "001E9 "001E8 % LATIN CAPITAL LETTER K WITH CARON
+\setXTXcharcodes "001E9 "001E9 "001E8 % LATIN SMALL LETTER K WITH CARON
+\setXTXcharcodes "001EA "001EB "001EA % LATIN CAPITAL LETTER O WITH OGONEK
+\setXTXcharcodes "001EB "001EB "001EA % LATIN SMALL LETTER O WITH OGONEK
+\setXTXcharcodes "001EC "001ED "001EC % LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+\setXTXcharcodes "001ED "001ED "001EC % LATIN SMALL LETTER O WITH OGONEK AND MACRON
+\setXTXcharcodes "001EE "001EF "001EE % LATIN CAPITAL LETTER EZH WITH CARON
+\setXTXcharcodes "001EF "001EF "001EE % LATIN SMALL LETTER EZH WITH CARON
+\setXTXcharcodes "001F0 "001F0 "001F0 % LATIN SMALL LETTER J WITH CARON
+\setXTXcharcodes "001F1 "001F3 "001F2 % LATIN CAPITAL LETTER DZ
+\setXTXcharcodes "001F2 "001F3 "001F1 % LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+\setXTXcharcodes "001F3 "001F3 "001F1 % LATIN SMALL LETTER DZ
+\setXTXcharcodes "001F4 "001F5 "001F4 % LATIN CAPITAL LETTER G WITH ACUTE
+\setXTXcharcodes "001F5 "001F5 "001F4 % LATIN SMALL LETTER G WITH ACUTE
+\setXTXcharcodes "001F6 "00195 "001F6 % LATIN CAPITAL LETTER HWAIR
+\setXTXcharcodes "001F7 "001BF "001F7 % LATIN CAPITAL LETTER WYNN
+\setXTXcharcodes "001F8 "001F9 "001F8 % LATIN CAPITAL LETTER N WITH GRAVE
+\setXTXcharcodes "001F9 "001F9 "001F8 % LATIN SMALL LETTER N WITH GRAVE
+\setXTXcharcodes "001FA "001FB "001FA % LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+\setXTXcharcodes "001FB "001FB "001FA % LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+\setXTXcharcodes "001FC "001FD "001FC % LATIN CAPITAL LETTER AE WITH ACUTE
+\setXTXcharcodes "001FD "001FD "001FC % LATIN SMALL LETTER AE WITH ACUTE
+\setXTXcharcodes "001FE "001FF "001FE % LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+\setXTXcharcodes "001FF "001FF "001FE % LATIN SMALL LETTER O WITH STROKE AND ACUTE
+\setXTXcharcodes "00200 "00201 "00200 % LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+\setXTXcharcodes "00201 "00201 "00200 % LATIN SMALL LETTER A WITH DOUBLE GRAVE
+\setXTXcharcodes "00202 "00203 "00202 % LATIN CAPITAL LETTER A WITH INVERTED BREVE
+\setXTXcharcodes "00203 "00203 "00202 % LATIN SMALL LETTER A WITH INVERTED BREVE
+\setXTXcharcodes "00204 "00205 "00204 % LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+\setXTXcharcodes "00205 "00205 "00204 % LATIN SMALL LETTER E WITH DOUBLE GRAVE
+\setXTXcharcodes "00206 "00207 "00206 % LATIN CAPITAL LETTER E WITH INVERTED BREVE
+\setXTXcharcodes "00207 "00207 "00206 % LATIN SMALL LETTER E WITH INVERTED BREVE
+\setXTXcharcodes "00208 "00209 "00208 % LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+\setXTXcharcodes "00209 "00209 "00208 % LATIN SMALL LETTER I WITH DOUBLE GRAVE
+\setXTXcharcodes "0020A "0020B "0020A % LATIN CAPITAL LETTER I WITH INVERTED BREVE
+\setXTXcharcodes "0020B "0020B "0020A % LATIN SMALL LETTER I WITH INVERTED BREVE
+\setXTXcharcodes "0020C "0020D "0020C % LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+\setXTXcharcodes "0020D "0020D "0020C % LATIN SMALL LETTER O WITH DOUBLE GRAVE
+\setXTXcharcodes "0020E "0020F "0020E % LATIN CAPITAL LETTER O WITH INVERTED BREVE
+\setXTXcharcodes "0020F "0020F "0020E % LATIN SMALL LETTER O WITH INVERTED BREVE
+\setXTXcharcodes "00210 "00211 "00210 % LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+\setXTXcharcodes "00211 "00211 "00210 % LATIN SMALL LETTER R WITH DOUBLE GRAVE
+\setXTXcharcodes "00212 "00213 "00212 % LATIN CAPITAL LETTER R WITH INVERTED BREVE
+\setXTXcharcodes "00213 "00213 "00212 % LATIN SMALL LETTER R WITH INVERTED BREVE
+\setXTXcharcodes "00214 "00215 "00214 % LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+\setXTXcharcodes "00215 "00215 "00214 % LATIN SMALL LETTER U WITH DOUBLE GRAVE
+\setXTXcharcodes "00216 "00217 "00216 % LATIN CAPITAL LETTER U WITH INVERTED BREVE
+\setXTXcharcodes "00217 "00217 "00216 % LATIN SMALL LETTER U WITH INVERTED BREVE
+\setXTXcharcodes "00218 "00219 "00218 % LATIN CAPITAL LETTER S WITH COMMA BELOW
+\setXTXcharcodes "00219 "00219 "00218 % LATIN SMALL LETTER S WITH COMMA BELOW
+\setXTXcharcodes "0021A "0021B "0021A % LATIN CAPITAL LETTER T WITH COMMA BELOW
+\setXTXcharcodes "0021B "0021B "0021A % LATIN SMALL LETTER T WITH COMMA BELOW
+\setXTXcharcodes "0021C "0021D "0021C % LATIN CAPITAL LETTER YOGH
+\setXTXcharcodes "0021D "0021D "0021C % LATIN SMALL LETTER YOGH
+\setXTXcharcodes "0021E "0021F "0021E % LATIN CAPITAL LETTER H WITH CARON
+\setXTXcharcodes "0021F "0021F "0021E % LATIN SMALL LETTER H WITH CARON
+\setXTXcharcodes "00220 "0019E "00220 % LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+\setXTXcharcodes "00221 "00221 "00221 % LATIN SMALL LETTER D WITH CURL
+\setXTXcharcodes "00222 "00223 "00222 % LATIN CAPITAL LETTER OU
+\setXTXcharcodes "00223 "00223 "00222 % LATIN SMALL LETTER OU
+\setXTXcharcodes "00224 "00225 "00224 % LATIN CAPITAL LETTER Z WITH HOOK
+\setXTXcharcodes "00225 "00225 "00224 % LATIN SMALL LETTER Z WITH HOOK
+\setXTXcharcodes "00226 "00227 "00226 % LATIN CAPITAL LETTER A WITH DOT ABOVE
+\setXTXcharcodes "00227 "00227 "00226 % LATIN SMALL LETTER A WITH DOT ABOVE
+\setXTXcharcodes "00228 "00229 "00228 % LATIN CAPITAL LETTER E WITH CEDILLA
+\setXTXcharcodes "00229 "00229 "00228 % LATIN SMALL LETTER E WITH CEDILLA
+\setXTXcharcodes "0022A "0022B "0022A % LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+\setXTXcharcodes "0022B "0022B "0022A % LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+\setXTXcharcodes "0022C "0022D "0022C % LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+\setXTXcharcodes "0022D "0022D "0022C % LATIN SMALL LETTER O WITH TILDE AND MACRON
+\setXTXcharcodes "0022E "0022F "0022E % LATIN CAPITAL LETTER O WITH DOT ABOVE
+\setXTXcharcodes "0022F "0022F "0022E % LATIN SMALL LETTER O WITH DOT ABOVE
+\setXTXcharcodes "00230 "00231 "00230 % LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+\setXTXcharcodes "00231 "00231 "00230 % LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+\setXTXcharcodes "00232 "00233 "00232 % LATIN CAPITAL LETTER Y WITH MACRON
+\setXTXcharcodes "00233 "00233 "00232 % LATIN SMALL LETTER Y WITH MACRON
+\setXTXcharcodes "00234 "00234 "00234 % LATIN SMALL LETTER L WITH CURL
+\setXTXcharcodes "00235 "00235 "00235 % LATIN SMALL LETTER N WITH CURL
+\setXTXcharcodes "00236 "00236 "00236 % LATIN SMALL LETTER T WITH CURL
+\setXTXcharcodes "00237 "00237 "00237 % LATIN SMALL LETTER DOTLESS J
+\setXTXcharcodes "00238 "00238 "00238 % LATIN SMALL LETTER DB DIGRAPH
+\setXTXcharcodes "00239 "00239 "00239 % LATIN SMALL LETTER QP DIGRAPH
+\setXTXcharcodes "0023A "02C65 "0023A % LATIN CAPITAL LETTER A WITH STROKE
+\setXTXcharcodes "0023B "0023C "0023B % LATIN CAPITAL LETTER C WITH STROKE
+\setXTXcharcodes "0023C "0023C "0023B % LATIN SMALL LETTER C WITH STROKE
+\setXTXcharcodes "0023D "0019A "0023D % LATIN CAPITAL LETTER L WITH BAR
+\setXTXcharcodes "0023E "02C66 "0023E % LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+\setXTXcharcodes "0023F "0023F "0023F % LATIN SMALL LETTER S WITH SWASH TAIL
+\setXTXcharcodes "00240 "00240 "00240 % LATIN SMALL LETTER Z WITH SWASH TAIL
+\setXTXcharcodes "00241 "00242 "00241 % LATIN CAPITAL LETTER GLOTTAL STOP
+\setXTXcharcodes "00242 "00242 "00241 % LATIN SMALL LETTER GLOTTAL STOP
+\setXTXcharcodes "00243 "00180 "00243 % LATIN CAPITAL LETTER B WITH STROKE
+\setXTXcharcodes "00244 "00289 "00244 % LATIN CAPITAL LETTER U BAR
+\setXTXcharcodes "00245 "0028C "00245 % LATIN CAPITAL LETTER TURNED V
+\setXTXcharcodes "00246 "00247 "00246 % LATIN CAPITAL LETTER E WITH STROKE
+\setXTXcharcodes "00247 "00247 "00246 % LATIN SMALL LETTER E WITH STROKE
+\setXTXcharcodes "00248 "00249 "00248 % LATIN CAPITAL LETTER J WITH STROKE
+\setXTXcharcodes "00249 "00249 "00248 % LATIN SMALL LETTER J WITH STROKE
+\setXTXcharcodes "0024A "0024B "0024A % LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+\setXTXcharcodes "0024B "0024B "0024A % LATIN SMALL LETTER Q WITH HOOK TAIL
+\setXTXcharcodes "0024C "0024D "0024C % LATIN CAPITAL LETTER R WITH STROKE
+\setXTXcharcodes "0024D "0024D "0024C % LATIN SMALL LETTER R WITH STROKE
+\setXTXcharcodes "0024E "0024F "0024E % LATIN CAPITAL LETTER Y WITH STROKE
+\setXTXcharcodes "0024F "0024F "0024E % LATIN SMALL LETTER Y WITH STROKE
+\setXTXcharcodes "00250 "00250 "00250 % LATIN SMALL LETTER TURNED A
+\setXTXcharcodes "00251 "00251 "00251 % LATIN SMALL LETTER ALPHA
+\setXTXcharcodes "00252 "00252 "00252 % LATIN SMALL LETTER TURNED ALPHA
+\setXTXcharcodes "00253 "00253 "00181 % LATIN SMALL LETTER B WITH HOOK
+\setXTXcharcodes "00254 "00254 "00186 % LATIN SMALL LETTER OPEN O
+\setXTXcharcodes "00255 "00255 "00255 % LATIN SMALL LETTER C WITH CURL
+\setXTXcharcodes "00256 "00256 "00189 % LATIN SMALL LETTER D WITH TAIL
+\setXTXcharcodes "00257 "00257 "0018A % LATIN SMALL LETTER D WITH HOOK
+\setXTXcharcodes "00258 "00258 "00258 % LATIN SMALL LETTER REVERSED E
+\setXTXcharcodes "00259 "00259 "0018F % LATIN SMALL LETTER SCHWA
+\setXTXcharcodes "0025A "0025A "0025A % LATIN SMALL LETTER SCHWA WITH HOOK
+\setXTXcharcodes "0025B "0025B "00190 % LATIN SMALL LETTER OPEN E
+\setXTXcharcodes "0025C "0025C "0025C % LATIN SMALL LETTER REVERSED OPEN E
+\setXTXcharcodes "0025D "0025D "0025D % LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+\setXTXcharcodes "0025E "0025E "0025E % LATIN SMALL LETTER CLOSED REVERSED OPEN E
+\setXTXcharcodes "0025F "0025F "0025F % LATIN SMALL LETTER DOTLESS J WITH STROKE
+\setXTXcharcodes "00260 "00260 "00193 % LATIN SMALL LETTER G WITH HOOK
+\setXTXcharcodes "00261 "00261 "00261 % LATIN SMALL LETTER SCRIPT G
+\setXTXcharcodes "00262 "00262 "00262 % LATIN LETTER SMALL CAPITAL G
+\setXTXcharcodes "00263 "00263 "00194 % LATIN SMALL LETTER GAMMA
+\setXTXcharcodes "00264 "00264 "00264 % LATIN SMALL LETTER RAMS HORN
+\setXTXcharcodes "00265 "00265 "00265 % LATIN SMALL LETTER TURNED H
+\setXTXcharcodes "00266 "00266 "00266 % LATIN SMALL LETTER H WITH HOOK
+\setXTXcharcodes "00267 "00267 "00267 % LATIN SMALL LETTER HENG WITH HOOK
+\setXTXcharcodes "00268 "00268 "00197 % LATIN SMALL LETTER I WITH STROKE
+\setXTXcharcodes "00269 "00269 "00196 % LATIN SMALL LETTER IOTA
+\setXTXcharcodes "0026A "0026A "0026A % LATIN LETTER SMALL CAPITAL I
+\setXTXcharcodes "0026B "0026B "02C62 % LATIN SMALL LETTER L WITH MIDDLE TILDE
+\setXTXcharcodes "0026C "0026C "0026C % LATIN SMALL LETTER L WITH BELT
+\setXTXcharcodes "0026D "0026D "0026D % LATIN SMALL LETTER L WITH RETROFLEX HOOK
+\setXTXcharcodes "0026E "0026E "0026E % LATIN SMALL LETTER LEZH
+\setXTXcharcodes "0026F "0026F "0019C % LATIN SMALL LETTER TURNED M
+\setXTXcharcodes "00270 "00270 "00270 % LATIN SMALL LETTER TURNED M WITH LONG LEG
+\setXTXcharcodes "00271 "00271 "00271 % LATIN SMALL LETTER M WITH HOOK
+\setXTXcharcodes "00272 "00272 "0019D % LATIN SMALL LETTER N WITH LEFT HOOK
+\setXTXcharcodes "00273 "00273 "00273 % LATIN SMALL LETTER N WITH RETROFLEX HOOK
+\setXTXcharcodes "00274 "00274 "00274 % LATIN LETTER SMALL CAPITAL N
+\setXTXcharcodes "00275 "00275 "0019F % LATIN SMALL LETTER BARRED O
+\setXTXcharcodes "00276 "00276 "00276 % LATIN LETTER SMALL CAPITAL OE
+\setXTXcharcodes "00277 "00277 "00277 % LATIN SMALL LETTER CLOSED OMEGA
+\setXTXcharcodes "00278 "00278 "00278 % LATIN SMALL LETTER PHI
+\setXTXcharcodes "00279 "00279 "00279 % LATIN SMALL LETTER TURNED R
+\setXTXcharcodes "0027A "0027A "0027A % LATIN SMALL LETTER TURNED R WITH LONG LEG
+\setXTXcharcodes "0027B "0027B "0027B % LATIN SMALL LETTER TURNED R WITH HOOK
+\setXTXcharcodes "0027C "0027C "0027C % LATIN SMALL LETTER R WITH LONG LEG
+\setXTXcharcodes "0027D "0027D "02C64 % LATIN SMALL LETTER R WITH TAIL
+\setXTXcharcodes "0027E "0027E "0027E % LATIN SMALL LETTER R WITH FISHHOOK
+\setXTXcharcodes "0027F "0027F "0027F % LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+\setXTXcharcodes "00280 "00280 "001A6 % LATIN LETTER SMALL CAPITAL R
+\setXTXcharcodes "00281 "00281 "00281 % LATIN LETTER SMALL CAPITAL INVERTED R
+\setXTXcharcodes "00282 "00282 "00282 % LATIN SMALL LETTER S WITH HOOK
+\setXTXcharcodes "00283 "00283 "001A9 % LATIN SMALL LETTER ESH
+\setXTXcharcodes "00284 "00284 "00284 % LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+\setXTXcharcodes "00285 "00285 "00285 % LATIN SMALL LETTER SQUAT REVERSED ESH
+\setXTXcharcodes "00286 "00286 "00286 % LATIN SMALL LETTER ESH WITH CURL
+\setXTXcharcodes "00287 "00287 "00287 % LATIN SMALL LETTER TURNED T
+\setXTXcharcodes "00288 "00288 "001AE % LATIN SMALL LETTER T WITH RETROFLEX HOOK
+\setXTXcharcodes "00289 "00289 "00244 % LATIN SMALL LETTER U BAR
+\setXTXcharcodes "0028A "0028A "001B1 % LATIN SMALL LETTER UPSILON
+\setXTXcharcodes "0028B "0028B "001B2 % LATIN SMALL LETTER V WITH HOOK
+\setXTXcharcodes "0028C "0028C "00245 % LATIN SMALL LETTER TURNED V
+\setXTXcharcodes "0028D "0028D "0028D % LATIN SMALL LETTER TURNED W
+\setXTXcharcodes "0028E "0028E "0028E % LATIN SMALL LETTER TURNED Y
+\setXTXcharcodes "0028F "0028F "0028F % LATIN LETTER SMALL CAPITAL Y
+\setXTXcharcodes "00290 "00290 "00290 % LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+\setXTXcharcodes "00291 "00291 "00291 % LATIN SMALL LETTER Z WITH CURL
+\setXTXcharcodes "00292 "00292 "001B7 % LATIN SMALL LETTER EZH
+\setXTXcharcodes "00293 "00293 "00293 % LATIN SMALL LETTER EZH WITH CURL
+\setXTXcharcodes "00295 "00295 "00295 % LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+\setXTXcharcodes "00296 "00296 "00296 % LATIN LETTER INVERTED GLOTTAL STOP
+\setXTXcharcodes "00297 "00297 "00297 % LATIN LETTER STRETCHED C
+\setXTXcharcodes "00298 "00298 "00298 % LATIN LETTER BILABIAL CLICK
+\setXTXcharcodes "00299 "00299 "00299 % LATIN LETTER SMALL CAPITAL B
+\setXTXcharcodes "0029A "0029A "0029A % LATIN SMALL LETTER CLOSED OPEN E
+\setXTXcharcodes "0029B "0029B "0029B % LATIN LETTER SMALL CAPITAL G WITH HOOK
+\setXTXcharcodes "0029C "0029C "0029C % LATIN LETTER SMALL CAPITAL H
+\setXTXcharcodes "0029D "0029D "0029D % LATIN SMALL LETTER J WITH CROSSED-TAIL
+\setXTXcharcodes "0029E "0029E "0029E % LATIN SMALL LETTER TURNED K
+\setXTXcharcodes "0029F "0029F "0029F % LATIN LETTER SMALL CAPITAL L
+\setXTXcharcodes "002A0 "002A0 "002A0 % LATIN SMALL LETTER Q WITH HOOK
+\setXTXcharcodes "002A1 "002A1 "002A1 % LATIN LETTER GLOTTAL STOP WITH STROKE
+\setXTXcharcodes "002A2 "002A2 "002A2 % LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+\setXTXcharcodes "002A3 "002A3 "002A3 % LATIN SMALL LETTER DZ DIGRAPH
+\setXTXcharcodes "002A4 "002A4 "002A4 % LATIN SMALL LETTER DEZH DIGRAPH
+\setXTXcharcodes "002A5 "002A5 "002A5 % LATIN SMALL LETTER DZ DIGRAPH WITH CURL
+\setXTXcharcodes "002A6 "002A6 "002A6 % LATIN SMALL LETTER TS DIGRAPH
+\setXTXcharcodes "002A7 "002A7 "002A7 % LATIN SMALL LETTER TESH DIGRAPH
+\setXTXcharcodes "002A8 "002A8 "002A8 % LATIN SMALL LETTER TC DIGRAPH WITH CURL
+\setXTXcharcodes "002A9 "002A9 "002A9 % LATIN SMALL LETTER FENG DIGRAPH
+\setXTXcharcodes "002AA "002AA "002AA % LATIN SMALL LETTER LS DIGRAPH
+\setXTXcharcodes "002AB "002AB "002AB % LATIN SMALL LETTER LZ DIGRAPH
+\setXTXcharcodes "002AC "002AC "002AC % LATIN LETTER BILABIAL PERCUSSIVE
+\setXTXcharcodes "002AD "002AD "002AD % LATIN LETTER BIDENTAL PERCUSSIVE
+\setXTXcharcodes "002AE "002AE "002AE % LATIN SMALL LETTER TURNED H WITH FISHHOOK
+\setXTXcharcodes "002AF "002AF "002AF % LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+\setXTXcharcodes "0037B "0037B "003FD % GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+\setXTXcharcodes "0037C "0037C "003FE % GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+\setXTXcharcodes "0037D "0037D "003FF % GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+\setXTXcharcodes "00386 "003AC "00386 % GREEK CAPITAL LETTER ALPHA WITH TONOS
+\setXTXcharcodes "00388 "003AD "00388 % GREEK CAPITAL LETTER EPSILON WITH TONOS
+\setXTXcharcodes "00389 "003AE "00389 % GREEK CAPITAL LETTER ETA WITH TONOS
+\setXTXcharcodes "0038A "003AF "0038A % GREEK CAPITAL LETTER IOTA WITH TONOS
+\setXTXcharcodes "0038C "003CC "0038C % GREEK CAPITAL LETTER OMICRON WITH TONOS
+\setXTXcharcodes "0038E "003CD "0038E % GREEK CAPITAL LETTER UPSILON WITH TONOS
+\setXTXcharcodes "0038F "003CE "0038F % GREEK CAPITAL LETTER OMEGA WITH TONOS
+\setXTXcharcodes "00390 "00390 "00390 % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+\setXTXcharcodes "00391 "003B1 "00391 % GREEK CAPITAL LETTER ALPHA
+\setXTXcharcodes "00392 "003B2 "00392 % GREEK CAPITAL LETTER BETA
+\setXTXcharcodes "00393 "003B3 "00393 % GREEK CAPITAL LETTER GAMMA
+\setXTXcharcodes "00394 "003B4 "00394 % GREEK CAPITAL LETTER DELTA
+\setXTXcharcodes "00395 "003B5 "00395 % GREEK CAPITAL LETTER EPSILON
+\setXTXcharcodes "00396 "003B6 "00396 % GREEK CAPITAL LETTER ZETA
+\setXTXcharcodes "00397 "003B7 "00397 % GREEK CAPITAL LETTER ETA
+\setXTXcharcodes "00398 "003B8 "00398 % GREEK CAPITAL LETTER THETA
+\setXTXcharcodes "00399 "003B9 "00399 % GREEK CAPITAL LETTER IOTA
+\setXTXcharcodes "0039A "003BA "0039A % GREEK CAPITAL LETTER KAPPA
+\setXTXcharcodes "0039B "003BB "0039B % GREEK CAPITAL LETTER LAMDA
+\setXTXcharcodes "0039C "003BC "0039C % GREEK CAPITAL LETTER MU
+\setXTXcharcodes "0039D "003BD "0039D % GREEK CAPITAL LETTER NU
+\setXTXcharcodes "0039E "003BE "0039E % GREEK CAPITAL LETTER XI
+\setXTXcharcodes "0039F "003BF "0039F % GREEK CAPITAL LETTER OMICRON
+\setXTXcharcodes "003A0 "003C0 "003A0 % GREEK CAPITAL LETTER PI
+\setXTXcharcodes "003A1 "003C1 "003A1 % GREEK CAPITAL LETTER RHO
+\setXTXcharcodes "003A3 "003C3 "003A3 % GREEK CAPITAL LETTER SIGMA
+\setXTXcharcodes "003A4 "003C4 "003A4 % GREEK CAPITAL LETTER TAU
+\setXTXcharcodes "003A5 "003C5 "003A5 % GREEK CAPITAL LETTER UPSILON
+\setXTXcharcodes "003A6 "003C6 "003A6 % GREEK CAPITAL LETTER PHI
+\setXTXcharcodes "003A7 "003C7 "003A7 % GREEK CAPITAL LETTER CHI
+\setXTXcharcodes "003A8 "003C8 "003A8 % GREEK CAPITAL LETTER PSI
+\setXTXcharcodes "003A9 "003C9 "003A9 % GREEK CAPITAL LETTER OMEGA
+\setXTXcharcodes "003AA "003CA "003AA % GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+\setXTXcharcodes "003AB "003CB "003AB % GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+\setXTXcharcodes "003AC "003AC "00386 % GREEK SMALL LETTER ALPHA WITH TONOS
+\setXTXcharcodes "003AD "003AD "00388 % GREEK SMALL LETTER EPSILON WITH TONOS
+\setXTXcharcodes "003AE "003AE "00389 % GREEK SMALL LETTER ETA WITH TONOS
+\setXTXcharcodes "003AF "003AF "0038A % GREEK SMALL LETTER IOTA WITH TONOS
+\setXTXcharcodes "003B0 "003B0 "003B0 % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+\setXTXcharcodes "003B1 "003B1 "00391 % GREEK SMALL LETTER ALPHA
+\setXTXcharcodes "003B2 "003B2 "00392 % GREEK SMALL LETTER BETA
+\setXTXcharcodes "003B3 "003B3 "00393 % GREEK SMALL LETTER GAMMA
+\setXTXcharcodes "003B4 "003B4 "00394 % GREEK SMALL LETTER DELTA
+\setXTXcharcodes "003B5 "003B5 "00395 % GREEK SMALL LETTER EPSILON
+\setXTXcharcodes "003B6 "003B6 "00396 % GREEK SMALL LETTER ZETA
+\setXTXcharcodes "003B7 "003B7 "00397 % GREEK SMALL LETTER ETA
+\setXTXcharcodes "003B8 "003B8 "00398 % GREEK SMALL LETTER THETA
+\setXTXcharcodes "003B9 "003B9 "00399 % GREEK SMALL LETTER IOTA
+\setXTXcharcodes "003BA "003BA "0039A % GREEK SMALL LETTER KAPPA
+\setXTXcharcodes "003BB "003BB "0039B % GREEK SMALL LETTER LAMDA
+\setXTXcharcodes "003BC "003BC "0039C % GREEK SMALL LETTER MU
+\setXTXcharcodes "003BD "003BD "0039D % GREEK SMALL LETTER NU
+\setXTXcharcodes "003BE "003BE "0039E % GREEK SMALL LETTER XI
+\setXTXcharcodes "003BF "003BF "0039F % GREEK SMALL LETTER OMICRON
+\setXTXcharcodes "003C0 "003C0 "003A0 % GREEK SMALL LETTER PI
+\setXTXcharcodes "003C1 "003C1 "003A1 % GREEK SMALL LETTER RHO
+\setXTXcharcodes "003C2 "003C2 "003A3 % GREEK SMALL LETTER FINAL SIGMA
+\setXTXcharcodes "003C3 "003C3 "003A3 % GREEK SMALL LETTER SIGMA
+\setXTXcharcodes "003C4 "003C4 "003A4 % GREEK SMALL LETTER TAU
+\setXTXcharcodes "003C5 "003C5 "003A5 % GREEK SMALL LETTER UPSILON
+\setXTXcharcodes "003C6 "003C6 "003A6 % GREEK SMALL LETTER PHI
+\setXTXcharcodes "003C7 "003C7 "003A7 % GREEK SMALL LETTER CHI
+\setXTXcharcodes "003C8 "003C8 "003A8 % GREEK SMALL LETTER PSI
+\setXTXcharcodes "003C9 "003C9 "003A9 % GREEK SMALL LETTER OMEGA
+\setXTXcharcodes "003CA "003CA "003AA % GREEK SMALL LETTER IOTA WITH DIALYTIKA
+\setXTXcharcodes "003CB "003CB "003AB % GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+\setXTXcharcodes "003CC "003CC "0038C % GREEK SMALL LETTER OMICRON WITH TONOS
+\setXTXcharcodes "003CD "003CD "0038E % GREEK SMALL LETTER UPSILON WITH TONOS
+\setXTXcharcodes "003CE "003CE "0038F % GREEK SMALL LETTER OMEGA WITH TONOS
+\setXTXcharcodes "003D0 "003D0 "00392 % GREEK BETA SYMBOL
+\setXTXcharcodes "003D1 "003D1 "00398 % GREEK THETA SYMBOL
+\setXTXcharcodes "003D2 "003D2 "003D2 % GREEK UPSILON WITH HOOK SYMBOL
+\setXTXcharcodes "003D3 "003D3 "003D3 % GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+\setXTXcharcodes "003D4 "003D4 "003D4 % GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+\setXTXcharcodes "003D5 "003D5 "003A6 % GREEK PHI SYMBOL
+\setXTXcharcodes "003D6 "003D6 "003A0 % GREEK PI SYMBOL
+\setXTXcharcodes "003D7 "003D7 "003D7 % GREEK KAI SYMBOL
+\setXTXcharcodes "003D8 "003D9 "003D8 % GREEK LETTER ARCHAIC KOPPA
+\setXTXcharcodes "003D9 "003D9 "003D8 % GREEK SMALL LETTER ARCHAIC KOPPA
+\setXTXcharcodes "003DA "003DB "003DA % GREEK LETTER STIGMA
+\setXTXcharcodes "003DB "003DB "003DA % GREEK SMALL LETTER STIGMA
+\setXTXcharcodes "003DC "003DD "003DC % GREEK LETTER DIGAMMA
+\setXTXcharcodes "003DD "003DD "003DC % GREEK SMALL LETTER DIGAMMA
+\setXTXcharcodes "003DE "003DF "003DE % GREEK LETTER KOPPA
+\setXTXcharcodes "003DF "003DF "003DE % GREEK SMALL LETTER KOPPA
+\setXTXcharcodes "003E0 "003E1 "003E0 % GREEK LETTER SAMPI
+\setXTXcharcodes "003E1 "003E1 "003E0 % GREEK SMALL LETTER SAMPI
+\setXTXcharcodes "003E2 "003E3 "003E2 % COPTIC CAPITAL LETTER SHEI
+\setXTXcharcodes "003E3 "003E3 "003E2 % COPTIC SMALL LETTER SHEI
+\setXTXcharcodes "003E4 "003E5 "003E4 % COPTIC CAPITAL LETTER FEI
+\setXTXcharcodes "003E5 "003E5 "003E4 % COPTIC SMALL LETTER FEI
+\setXTXcharcodes "003E6 "003E7 "003E6 % COPTIC CAPITAL LETTER KHEI
+\setXTXcharcodes "003E7 "003E7 "003E6 % COPTIC SMALL LETTER KHEI
+\setXTXcharcodes "003E8 "003E9 "003E8 % COPTIC CAPITAL LETTER HORI
+\setXTXcharcodes "003E9 "003E9 "003E8 % COPTIC SMALL LETTER HORI
+\setXTXcharcodes "003EA "003EB "003EA % COPTIC CAPITAL LETTER GANGIA
+\setXTXcharcodes "003EB "003EB "003EA % COPTIC SMALL LETTER GANGIA
+\setXTXcharcodes "003EC "003ED "003EC % COPTIC CAPITAL LETTER SHIMA
+\setXTXcharcodes "003ED "003ED "003EC % COPTIC SMALL LETTER SHIMA
+\setXTXcharcodes "003EE "003EF "003EE % COPTIC CAPITAL LETTER DEI
+\setXTXcharcodes "003EF "003EF "003EE % COPTIC SMALL LETTER DEI
+\setXTXcharcodes "003F0 "003F0 "0039A % GREEK KAPPA SYMBOL
+\setXTXcharcodes "003F1 "003F1 "003A1 % GREEK RHO SYMBOL
+\setXTXcharcodes "003F2 "003F2 "003F9 % GREEK LUNATE SIGMA SYMBOL
+\setXTXcharcodes "003F3 "003F3 "003F3 % GREEK LETTER YOT
+\setXTXcharcodes "003F4 "003B8 "003F4 % GREEK CAPITAL THETA SYMBOL
+\setXTXcharcodes "003F5 "003F5 "00395 % GREEK LUNATE EPSILON SYMBOL
+\setXTXcharcodes "003F7 "003F8 "003F7 % GREEK CAPITAL LETTER SHO
+\setXTXcharcodes "003F8 "003F8 "003F7 % GREEK SMALL LETTER SHO
+\setXTXcharcodes "003F9 "003F2 "003F9 % GREEK CAPITAL LUNATE SIGMA SYMBOL
+\setXTXcharcodes "003FA "003FB "003FA % GREEK CAPITAL LETTER SAN
+\setXTXcharcodes "003FB "003FB "003FA % GREEK SMALL LETTER SAN
+\setXTXcharcodes "003FC "003FC "003FC % GREEK RHO WITH STROKE SYMBOL
+\setXTXcharcodes "003FD "0037B "003FD % GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+\setXTXcharcodes "003FE "0037C "003FE % GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+\setXTXcharcodes "003FF "0037D "003FF % GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+\setXTXcharcodes "00400 "00450 "00400 % CYRILLIC CAPITAL LETTER IE WITH GRAVE
+\setXTXcharcodes "00401 "00451 "00401 % CYRILLIC CAPITAL LETTER IO
+\setXTXcharcodes "00402 "00452 "00402 % CYRILLIC CAPITAL LETTER DJE
+\setXTXcharcodes "00403 "00453 "00403 % CYRILLIC CAPITAL LETTER GJE
+\setXTXcharcodes "00404 "00454 "00404 % CYRILLIC CAPITAL LETTER UKRAINIAN IE
+\setXTXcharcodes "00405 "00455 "00405 % CYRILLIC CAPITAL LETTER DZE
+\setXTXcharcodes "00406 "00456 "00406 % CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+\setXTXcharcodes "00407 "00457 "00407 % CYRILLIC CAPITAL LETTER YI
+\setXTXcharcodes "00408 "00458 "00408 % CYRILLIC CAPITAL LETTER JE
+\setXTXcharcodes "00409 "00459 "00409 % CYRILLIC CAPITAL LETTER LJE
+\setXTXcharcodes "0040A "0045A "0040A % CYRILLIC CAPITAL LETTER NJE
+\setXTXcharcodes "0040B "0045B "0040B % CYRILLIC CAPITAL LETTER TSHE
+\setXTXcharcodes "0040C "0045C "0040C % CYRILLIC CAPITAL LETTER KJE
+\setXTXcharcodes "0040D "0045D "0040D % CYRILLIC CAPITAL LETTER I WITH GRAVE
+\setXTXcharcodes "0040E "0045E "0040E % CYRILLIC CAPITAL LETTER SHORT U
+\setXTXcharcodes "0040F "0045F "0040F % CYRILLIC CAPITAL LETTER DZHE
+\setXTXcharcodes "00410 "00430 "00410 % CYRILLIC CAPITAL LETTER A
+\setXTXcharcodes "00411 "00431 "00411 % CYRILLIC CAPITAL LETTER BE
+\setXTXcharcodes "00412 "00432 "00412 % CYRILLIC CAPITAL LETTER VE
+\setXTXcharcodes "00413 "00433 "00413 % CYRILLIC CAPITAL LETTER GHE
+\setXTXcharcodes "00414 "00434 "00414 % CYRILLIC CAPITAL LETTER DE
+\setXTXcharcodes "00415 "00435 "00415 % CYRILLIC CAPITAL LETTER IE
+\setXTXcharcodes "00416 "00436 "00416 % CYRILLIC CAPITAL LETTER ZHE
+\setXTXcharcodes "00417 "00437 "00417 % CYRILLIC CAPITAL LETTER ZE
+\setXTXcharcodes "00418 "00438 "00418 % CYRILLIC CAPITAL LETTER I
+\setXTXcharcodes "00419 "00439 "00419 % CYRILLIC CAPITAL LETTER SHORT I
+\setXTXcharcodes "0041A "0043A "0041A % CYRILLIC CAPITAL LETTER KA
+\setXTXcharcodes "0041B "0043B "0041B % CYRILLIC CAPITAL LETTER EL
+\setXTXcharcodes "0041C "0043C "0041C % CYRILLIC CAPITAL LETTER EM
+\setXTXcharcodes "0041D "0043D "0041D % CYRILLIC CAPITAL LETTER EN
+\setXTXcharcodes "0041E "0043E "0041E % CYRILLIC CAPITAL LETTER O
+\setXTXcharcodes "0041F "0043F "0041F % CYRILLIC CAPITAL LETTER PE
+\setXTXcharcodes "00420 "00440 "00420 % CYRILLIC CAPITAL LETTER ER
+\setXTXcharcodes "00421 "00441 "00421 % CYRILLIC CAPITAL LETTER ES
+\setXTXcharcodes "00422 "00442 "00422 % CYRILLIC CAPITAL LETTER TE
+\setXTXcharcodes "00423 "00443 "00423 % CYRILLIC CAPITAL LETTER U
+\setXTXcharcodes "00424 "00444 "00424 % CYRILLIC CAPITAL LETTER EF
+\setXTXcharcodes "00425 "00445 "00425 % CYRILLIC CAPITAL LETTER HA
+\setXTXcharcodes "00426 "00446 "00426 % CYRILLIC CAPITAL LETTER TSE
+\setXTXcharcodes "00427 "00447 "00427 % CYRILLIC CAPITAL LETTER CHE
+\setXTXcharcodes "00428 "00448 "00428 % CYRILLIC CAPITAL LETTER SHA
+\setXTXcharcodes "00429 "00449 "00429 % CYRILLIC CAPITAL LETTER SHCHA
+\setXTXcharcodes "0042A "0044A "0042A % CYRILLIC CAPITAL LETTER HARD SIGN
+\setXTXcharcodes "0042B "0044B "0042B % CYRILLIC CAPITAL LETTER YERU
+\setXTXcharcodes "0042C "0044C "0042C % CYRILLIC CAPITAL LETTER SOFT SIGN
+\setXTXcharcodes "0042D "0044D "0042D % CYRILLIC CAPITAL LETTER E
+\setXTXcharcodes "0042E "0044E "0042E % CYRILLIC CAPITAL LETTER YU
+\setXTXcharcodes "0042F "0044F "0042F % CYRILLIC CAPITAL LETTER YA
+\setXTXcharcodes "00430 "00430 "00410 % CYRILLIC SMALL LETTER A
+\setXTXcharcodes "00431 "00431 "00411 % CYRILLIC SMALL LETTER BE
+\setXTXcharcodes "00432 "00432 "00412 % CYRILLIC SMALL LETTER VE
+\setXTXcharcodes "00433 "00433 "00413 % CYRILLIC SMALL LETTER GHE
+\setXTXcharcodes "00434 "00434 "00414 % CYRILLIC SMALL LETTER DE
+\setXTXcharcodes "00435 "00435 "00415 % CYRILLIC SMALL LETTER IE
+\setXTXcharcodes "00436 "00436 "00416 % CYRILLIC SMALL LETTER ZHE
+\setXTXcharcodes "00437 "00437 "00417 % CYRILLIC SMALL LETTER ZE
+\setXTXcharcodes "00438 "00438 "00418 % CYRILLIC SMALL LETTER I
+\setXTXcharcodes "00439 "00439 "00419 % CYRILLIC SMALL LETTER SHORT I
+\setXTXcharcodes "0043A "0043A "0041A % CYRILLIC SMALL LETTER KA
+\setXTXcharcodes "0043B "0043B "0041B % CYRILLIC SMALL LETTER EL
+\setXTXcharcodes "0043C "0043C "0041C % CYRILLIC SMALL LETTER EM
+\setXTXcharcodes "0043D "0043D "0041D % CYRILLIC SMALL LETTER EN
+\setXTXcharcodes "0043E "0043E "0041E % CYRILLIC SMALL LETTER O
+\setXTXcharcodes "0043F "0043F "0041F % CYRILLIC SMALL LETTER PE
+\setXTXcharcodes "00440 "00440 "00420 % CYRILLIC SMALL LETTER ER
+\setXTXcharcodes "00441 "00441 "00421 % CYRILLIC SMALL LETTER ES
+\setXTXcharcodes "00442 "00442 "00422 % CYRILLIC SMALL LETTER TE
+\setXTXcharcodes "00443 "00443 "00423 % CYRILLIC SMALL LETTER U
+\setXTXcharcodes "00444 "00444 "00424 % CYRILLIC SMALL LETTER EF
+\setXTXcharcodes "00445 "00445 "00425 % CYRILLIC SMALL LETTER HA
+\setXTXcharcodes "00446 "00446 "00426 % CYRILLIC SMALL LETTER TSE
+\setXTXcharcodes "00447 "00447 "00427 % CYRILLIC SMALL LETTER CHE
+\setXTXcharcodes "00448 "00448 "00428 % CYRILLIC SMALL LETTER SHA
+\setXTXcharcodes "00449 "00449 "00429 % CYRILLIC SMALL LETTER SHCHA
+\setXTXcharcodes "0044A "0044A "0042A % CYRILLIC SMALL LETTER HARD SIGN
+\setXTXcharcodes "0044B "0044B "0042B % CYRILLIC SMALL LETTER YERU
+\setXTXcharcodes "0044C "0044C "0042C % CYRILLIC SMALL LETTER SOFT SIGN
+\setXTXcharcodes "0044D "0044D "0042D % CYRILLIC SMALL LETTER E
+\setXTXcharcodes "0044E "0044E "0042E % CYRILLIC SMALL LETTER YU
+\setXTXcharcodes "0044F "0044F "0042F % CYRILLIC SMALL LETTER YA
+\setXTXcharcodes "00450 "00450 "00400 % CYRILLIC SMALL LETTER IE WITH GRAVE
+\setXTXcharcodes "00451 "00451 "00401 % CYRILLIC SMALL LETTER IO
+\setXTXcharcodes "00452 "00452 "00402 % CYRILLIC SMALL LETTER DJE
+\setXTXcharcodes "00453 "00453 "00403 % CYRILLIC SMALL LETTER GJE
+\setXTXcharcodes "00454 "00454 "00404 % CYRILLIC SMALL LETTER UKRAINIAN IE
+\setXTXcharcodes "00455 "00455 "00405 % CYRILLIC SMALL LETTER DZE
+\setXTXcharcodes "00456 "00456 "00406 % CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+\setXTXcharcodes "00457 "00457 "00407 % CYRILLIC SMALL LETTER YI
+\setXTXcharcodes "00458 "00458 "00408 % CYRILLIC SMALL LETTER JE
+\setXTXcharcodes "00459 "00459 "00409 % CYRILLIC SMALL LETTER LJE
+\setXTXcharcodes "0045A "0045A "0040A % CYRILLIC SMALL LETTER NJE
+\setXTXcharcodes "0045B "0045B "0040B % CYRILLIC SMALL LETTER TSHE
+\setXTXcharcodes "0045C "0045C "0040C % CYRILLIC SMALL LETTER KJE
+\setXTXcharcodes "0045D "0045D "0040D % CYRILLIC SMALL LETTER I WITH GRAVE
+\setXTXcharcodes "0045E "0045E "0040E % CYRILLIC SMALL LETTER SHORT U
+\setXTXcharcodes "0045F "0045F "0040F % CYRILLIC SMALL LETTER DZHE
+\setXTXcharcodes "00460 "00461 "00460 % CYRILLIC CAPITAL LETTER OMEGA
+\setXTXcharcodes "00461 "00461 "00460 % CYRILLIC SMALL LETTER OMEGA
+\setXTXcharcodes "00462 "00463 "00462 % CYRILLIC CAPITAL LETTER YAT
+\setXTXcharcodes "00463 "00463 "00462 % CYRILLIC SMALL LETTER YAT
+\setXTXcharcodes "00464 "00465 "00464 % CYRILLIC CAPITAL LETTER IOTIFIED E
+\setXTXcharcodes "00465 "00465 "00464 % CYRILLIC SMALL LETTER IOTIFIED E
+\setXTXcharcodes "00466 "00467 "00466 % CYRILLIC CAPITAL LETTER LITTLE YUS
+\setXTXcharcodes "00467 "00467 "00466 % CYRILLIC SMALL LETTER LITTLE YUS
+\setXTXcharcodes "00468 "00469 "00468 % CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+\setXTXcharcodes "00469 "00469 "00468 % CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+\setXTXcharcodes "0046A "0046B "0046A % CYRILLIC CAPITAL LETTER BIG YUS
+\setXTXcharcodes "0046B "0046B "0046A % CYRILLIC SMALL LETTER BIG YUS
+\setXTXcharcodes "0046C "0046D "0046C % CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+\setXTXcharcodes "0046D "0046D "0046C % CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+\setXTXcharcodes "0046E "0046F "0046E % CYRILLIC CAPITAL LETTER KSI
+\setXTXcharcodes "0046F "0046F "0046E % CYRILLIC SMALL LETTER KSI
+\setXTXcharcodes "00470 "00471 "00470 % CYRILLIC CAPITAL LETTER PSI
+\setXTXcharcodes "00471 "00471 "00470 % CYRILLIC SMALL LETTER PSI
+\setXTXcharcodes "00472 "00473 "00472 % CYRILLIC CAPITAL LETTER FITA
+\setXTXcharcodes "00473 "00473 "00472 % CYRILLIC SMALL LETTER FITA
+\setXTXcharcodes "00474 "00475 "00474 % CYRILLIC CAPITAL LETTER IZHITSA
+\setXTXcharcodes "00475 "00475 "00474 % CYRILLIC SMALL LETTER IZHITSA
+\setXTXcharcodes "00476 "00477 "00476 % CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+\setXTXcharcodes "00477 "00477 "00476 % CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+\setXTXcharcodes "00478 "00479 "00478 % CYRILLIC CAPITAL LETTER UK
+\setXTXcharcodes "00479 "00479 "00478 % CYRILLIC SMALL LETTER UK
+\setXTXcharcodes "0047A "0047B "0047A % CYRILLIC CAPITAL LETTER ROUND OMEGA
+\setXTXcharcodes "0047B "0047B "0047A % CYRILLIC SMALL LETTER ROUND OMEGA
+\setXTXcharcodes "0047C "0047D "0047C % CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+\setXTXcharcodes "0047D "0047D "0047C % CYRILLIC SMALL LETTER OMEGA WITH TITLO
+\setXTXcharcodes "0047E "0047F "0047E % CYRILLIC CAPITAL LETTER OT
+\setXTXcharcodes "0047F "0047F "0047E % CYRILLIC SMALL LETTER OT
+\setXTXcharcodes "00480 "00481 "00480 % CYRILLIC CAPITAL LETTER KOPPA
+\setXTXcharcodes "00481 "00481 "00480 % CYRILLIC SMALL LETTER KOPPA
+\setXTXcharcodes "0048A "0048B "0048A % CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+\setXTXcharcodes "0048B "0048B "0048A % CYRILLIC SMALL LETTER SHORT I WITH TAIL
+\setXTXcharcodes "0048C "0048D "0048C % CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+\setXTXcharcodes "0048D "0048D "0048C % CYRILLIC SMALL LETTER SEMISOFT SIGN
+\setXTXcharcodes "0048E "0048F "0048E % CYRILLIC CAPITAL LETTER ER WITH TICK
+\setXTXcharcodes "0048F "0048F "0048E % CYRILLIC SMALL LETTER ER WITH TICK
+\setXTXcharcodes "00490 "00491 "00490 % CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+\setXTXcharcodes "00491 "00491 "00490 % CYRILLIC SMALL LETTER GHE WITH UPTURN
+\setXTXcharcodes "00492 "00493 "00492 % CYRILLIC CAPITAL LETTER GHE WITH STROKE
+\setXTXcharcodes "00493 "00493 "00492 % CYRILLIC SMALL LETTER GHE WITH STROKE
+\setXTXcharcodes "00494 "00495 "00494 % CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+\setXTXcharcodes "00495 "00495 "00494 % CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+\setXTXcharcodes "00496 "00497 "00496 % CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+\setXTXcharcodes "00497 "00497 "00496 % CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+\setXTXcharcodes "00498 "00499 "00498 % CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+\setXTXcharcodes "00499 "00499 "00498 % CYRILLIC SMALL LETTER ZE WITH DESCENDER
+\setXTXcharcodes "0049A "0049B "0049A % CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+\setXTXcharcodes "0049B "0049B "0049A % CYRILLIC SMALL LETTER KA WITH DESCENDER
+\setXTXcharcodes "0049C "0049D "0049C % CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+\setXTXcharcodes "0049D "0049D "0049C % CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+\setXTXcharcodes "0049E "0049F "0049E % CYRILLIC CAPITAL LETTER KA WITH STROKE
+\setXTXcharcodes "0049F "0049F "0049E % CYRILLIC SMALL LETTER KA WITH STROKE
+\setXTXcharcodes "004A0 "004A1 "004A0 % CYRILLIC CAPITAL LETTER BASHKIR KA
+\setXTXcharcodes "004A1 "004A1 "004A0 % CYRILLIC SMALL LETTER BASHKIR KA
+\setXTXcharcodes "004A2 "004A3 "004A2 % CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+\setXTXcharcodes "004A3 "004A3 "004A2 % CYRILLIC SMALL LETTER EN WITH DESCENDER
+\setXTXcharcodes "004A4 "004A5 "004A4 % CYRILLIC CAPITAL LIGATURE EN GHE
+\setXTXcharcodes "004A5 "004A5 "004A4 % CYRILLIC SMALL LIGATURE EN GHE
+\setXTXcharcodes "004A6 "004A7 "004A6 % CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+\setXTXcharcodes "004A7 "004A7 "004A6 % CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+\setXTXcharcodes "004A8 "004A9 "004A8 % CYRILLIC CAPITAL LETTER ABKHASIAN HA
+\setXTXcharcodes "004A9 "004A9 "004A8 % CYRILLIC SMALL LETTER ABKHASIAN HA
+\setXTXcharcodes "004AA "004AB "004AA % CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+\setXTXcharcodes "004AB "004AB "004AA % CYRILLIC SMALL LETTER ES WITH DESCENDER
+\setXTXcharcodes "004AC "004AD "004AC % CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+\setXTXcharcodes "004AD "004AD "004AC % CYRILLIC SMALL LETTER TE WITH DESCENDER
+\setXTXcharcodes "004AE "004AF "004AE % CYRILLIC CAPITAL LETTER STRAIGHT U
+\setXTXcharcodes "004AF "004AF "004AE % CYRILLIC SMALL LETTER STRAIGHT U
+\setXTXcharcodes "004B0 "004B1 "004B0 % CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+\setXTXcharcodes "004B1 "004B1 "004B0 % CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+\setXTXcharcodes "004B2 "004B3 "004B2 % CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+\setXTXcharcodes "004B3 "004B3 "004B2 % CYRILLIC SMALL LETTER HA WITH DESCENDER
+\setXTXcharcodes "004B4 "004B5 "004B4 % CYRILLIC CAPITAL LIGATURE TE TSE
+\setXTXcharcodes "004B5 "004B5 "004B4 % CYRILLIC SMALL LIGATURE TE TSE
+\setXTXcharcodes "004B6 "004B7 "004B6 % CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+\setXTXcharcodes "004B7 "004B7 "004B6 % CYRILLIC SMALL LETTER CHE WITH DESCENDER
+\setXTXcharcodes "004B8 "004B9 "004B8 % CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+\setXTXcharcodes "004B9 "004B9 "004B8 % CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+\setXTXcharcodes "004BA "004BB "004BA % CYRILLIC CAPITAL LETTER SHHA
+\setXTXcharcodes "004BB "004BB "004BA % CYRILLIC SMALL LETTER SHHA
+\setXTXcharcodes "004BC "004BD "004BC % CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+\setXTXcharcodes "004BD "004BD "004BC % CYRILLIC SMALL LETTER ABKHASIAN CHE
+\setXTXcharcodes "004BE "004BF "004BE % CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+\setXTXcharcodes "004BF "004BF "004BE % CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+\setXTXcharcodes "004C0 "004CF "004C0 % CYRILLIC LETTER PALOCHKA
+\setXTXcharcodes "004C1 "004C2 "004C1 % CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+\setXTXcharcodes "004C2 "004C2 "004C1 % CYRILLIC SMALL LETTER ZHE WITH BREVE
+\setXTXcharcodes "004C3 "004C4 "004C3 % CYRILLIC CAPITAL LETTER KA WITH HOOK
+\setXTXcharcodes "004C4 "004C4 "004C3 % CYRILLIC SMALL LETTER KA WITH HOOK
+\setXTXcharcodes "004C5 "004C6 "004C5 % CYRILLIC CAPITAL LETTER EL WITH TAIL
+\setXTXcharcodes "004C6 "004C6 "004C5 % CYRILLIC SMALL LETTER EL WITH TAIL
+\setXTXcharcodes "004C7 "004C8 "004C7 % CYRILLIC CAPITAL LETTER EN WITH HOOK
+\setXTXcharcodes "004C8 "004C8 "004C7 % CYRILLIC SMALL LETTER EN WITH HOOK
+\setXTXcharcodes "004C9 "004CA "004C9 % CYRILLIC CAPITAL LETTER EN WITH TAIL
+\setXTXcharcodes "004CA "004CA "004C9 % CYRILLIC SMALL LETTER EN WITH TAIL
+\setXTXcharcodes "004CB "004CC "004CB % CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+\setXTXcharcodes "004CC "004CC "004CB % CYRILLIC SMALL LETTER KHAKASSIAN CHE
+\setXTXcharcodes "004CD "004CE "004CD % CYRILLIC CAPITAL LETTER EM WITH TAIL
+\setXTXcharcodes "004CE "004CE "004CD % CYRILLIC SMALL LETTER EM WITH TAIL
+\setXTXcharcodes "004CF "004CF "004C0 % CYRILLIC SMALL LETTER PALOCHKA
+\setXTXcharcodes "004D0 "004D1 "004D0 % CYRILLIC CAPITAL LETTER A WITH BREVE
+\setXTXcharcodes "004D1 "004D1 "004D0 % CYRILLIC SMALL LETTER A WITH BREVE
+\setXTXcharcodes "004D2 "004D3 "004D2 % CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+\setXTXcharcodes "004D3 "004D3 "004D2 % CYRILLIC SMALL LETTER A WITH DIAERESIS
+\setXTXcharcodes "004D4 "004D5 "004D4 % CYRILLIC CAPITAL LIGATURE A IE
+\setXTXcharcodes "004D5 "004D5 "004D4 % CYRILLIC SMALL LIGATURE A IE
+\setXTXcharcodes "004D6 "004D7 "004D6 % CYRILLIC CAPITAL LETTER IE WITH BREVE
+\setXTXcharcodes "004D7 "004D7 "004D6 % CYRILLIC SMALL LETTER IE WITH BREVE
+\setXTXcharcodes "004D8 "004D9 "004D8 % CYRILLIC CAPITAL LETTER SCHWA
+\setXTXcharcodes "004D9 "004D9 "004D8 % CYRILLIC SMALL LETTER SCHWA
+\setXTXcharcodes "004DA "004DB "004DA % CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+\setXTXcharcodes "004DB "004DB "004DA % CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+\setXTXcharcodes "004DC "004DD "004DC % CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+\setXTXcharcodes "004DD "004DD "004DC % CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+\setXTXcharcodes "004DE "004DF "004DE % CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+\setXTXcharcodes "004DF "004DF "004DE % CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+\setXTXcharcodes "004E0 "004E1 "004E0 % CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+\setXTXcharcodes "004E1 "004E1 "004E0 % CYRILLIC SMALL LETTER ABKHASIAN DZE
+\setXTXcharcodes "004E2 "004E3 "004E2 % CYRILLIC CAPITAL LETTER I WITH MACRON
+\setXTXcharcodes "004E3 "004E3 "004E2 % CYRILLIC SMALL LETTER I WITH MACRON
+\setXTXcharcodes "004E4 "004E5 "004E4 % CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+\setXTXcharcodes "004E5 "004E5 "004E4 % CYRILLIC SMALL LETTER I WITH DIAERESIS
+\setXTXcharcodes "004E6 "004E7 "004E6 % CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+\setXTXcharcodes "004E7 "004E7 "004E6 % CYRILLIC SMALL LETTER O WITH DIAERESIS
+\setXTXcharcodes "004E8 "004E9 "004E8 % CYRILLIC CAPITAL LETTER BARRED O
+\setXTXcharcodes "004E9 "004E9 "004E8 % CYRILLIC SMALL LETTER BARRED O
+\setXTXcharcodes "004EA "004EB "004EA % CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+\setXTXcharcodes "004EB "004EB "004EA % CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+\setXTXcharcodes "004EC "004ED "004EC % CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+\setXTXcharcodes "004ED "004ED "004EC % CYRILLIC SMALL LETTER E WITH DIAERESIS
+\setXTXcharcodes "004EE "004EF "004EE % CYRILLIC CAPITAL LETTER U WITH MACRON
+\setXTXcharcodes "004EF "004EF "004EE % CYRILLIC SMALL LETTER U WITH MACRON
+\setXTXcharcodes "004F0 "004F1 "004F0 % CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+\setXTXcharcodes "004F1 "004F1 "004F0 % CYRILLIC SMALL LETTER U WITH DIAERESIS
+\setXTXcharcodes "004F2 "004F3 "004F2 % CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+\setXTXcharcodes "004F3 "004F3 "004F2 % CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+\setXTXcharcodes "004F4 "004F5 "004F4 % CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+\setXTXcharcodes "004F5 "004F5 "004F4 % CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+\setXTXcharcodes "004F6 "004F7 "004F6 % CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+\setXTXcharcodes "004F7 "004F7 "004F6 % CYRILLIC SMALL LETTER GHE WITH DESCENDER
+\setXTXcharcodes "004F8 "004F9 "004F8 % CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+\setXTXcharcodes "004F9 "004F9 "004F8 % CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+\setXTXcharcodes "004FA "004FB "004FA % CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+\setXTXcharcodes "004FB "004FB "004FA % CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+\setXTXcharcodes "004FC "004FD "004FC % CYRILLIC CAPITAL LETTER HA WITH HOOK
+\setXTXcharcodes "004FD "004FD "004FC % CYRILLIC SMALL LETTER HA WITH HOOK
+\setXTXcharcodes "004FE "004FF "004FE % CYRILLIC CAPITAL LETTER HA WITH STROKE
+\setXTXcharcodes "004FF "004FF "004FE % CYRILLIC SMALL LETTER HA WITH STROKE
+\setXTXcharcodes "00500 "00501 "00500 % CYRILLIC CAPITAL LETTER KOMI DE
+\setXTXcharcodes "00501 "00501 "00500 % CYRILLIC SMALL LETTER KOMI DE
+\setXTXcharcodes "00502 "00503 "00502 % CYRILLIC CAPITAL LETTER KOMI DJE
+\setXTXcharcodes "00503 "00503 "00502 % CYRILLIC SMALL LETTER KOMI DJE
+\setXTXcharcodes "00504 "00505 "00504 % CYRILLIC CAPITAL LETTER KOMI ZJE
+\setXTXcharcodes "00505 "00505 "00504 % CYRILLIC SMALL LETTER KOMI ZJE
+\setXTXcharcodes "00506 "00507 "00506 % CYRILLIC CAPITAL LETTER KOMI DZJE
+\setXTXcharcodes "00507 "00507 "00506 % CYRILLIC SMALL LETTER KOMI DZJE
+\setXTXcharcodes "00508 "00509 "00508 % CYRILLIC CAPITAL LETTER KOMI LJE
+\setXTXcharcodes "00509 "00509 "00508 % CYRILLIC SMALL LETTER KOMI LJE
+\setXTXcharcodes "0050A "0050B "0050A % CYRILLIC CAPITAL LETTER KOMI NJE
+\setXTXcharcodes "0050B "0050B "0050A % CYRILLIC SMALL LETTER KOMI NJE
+\setXTXcharcodes "0050C "0050D "0050C % CYRILLIC CAPITAL LETTER KOMI SJE
+\setXTXcharcodes "0050D "0050D "0050C % CYRILLIC SMALL LETTER KOMI SJE
+\setXTXcharcodes "0050E "0050F "0050E % CYRILLIC CAPITAL LETTER KOMI TJE
+\setXTXcharcodes "0050F "0050F "0050E % CYRILLIC SMALL LETTER KOMI TJE
+\setXTXcharcodes "00510 "00511 "00510 % CYRILLIC CAPITAL LETTER REVERSED ZE
+\setXTXcharcodes "00511 "00511 "00510 % CYRILLIC SMALL LETTER REVERSED ZE
+\setXTXcharcodes "00512 "00513 "00512 % CYRILLIC CAPITAL LETTER EL WITH HOOK
+\setXTXcharcodes "00513 "00513 "00512 % CYRILLIC SMALL LETTER EL WITH HOOK
+\setXTXcharcodes "00531 "00561 "00531 % ARMENIAN CAPITAL LETTER AYB
+\setXTXcharcodes "00532 "00562 "00532 % ARMENIAN CAPITAL LETTER BEN
+\setXTXcharcodes "00533 "00563 "00533 % ARMENIAN CAPITAL LETTER GIM
+\setXTXcharcodes "00534 "00564 "00534 % ARMENIAN CAPITAL LETTER DA
+\setXTXcharcodes "00535 "00565 "00535 % ARMENIAN CAPITAL LETTER ECH
+\setXTXcharcodes "00536 "00566 "00536 % ARMENIAN CAPITAL LETTER ZA
+\setXTXcharcodes "00537 "00567 "00537 % ARMENIAN CAPITAL LETTER EH
+\setXTXcharcodes "00538 "00568 "00538 % ARMENIAN CAPITAL LETTER ET
+\setXTXcharcodes "00539 "00569 "00539 % ARMENIAN CAPITAL LETTER TO
+\setXTXcharcodes "0053A "0056A "0053A % ARMENIAN CAPITAL LETTER ZHE
+\setXTXcharcodes "0053B "0056B "0053B % ARMENIAN CAPITAL LETTER INI
+\setXTXcharcodes "0053C "0056C "0053C % ARMENIAN CAPITAL LETTER LIWN
+\setXTXcharcodes "0053D "0056D "0053D % ARMENIAN CAPITAL LETTER XEH
+\setXTXcharcodes "0053E "0056E "0053E % ARMENIAN CAPITAL LETTER CA
+\setXTXcharcodes "0053F "0056F "0053F % ARMENIAN CAPITAL LETTER KEN
+\setXTXcharcodes "00540 "00570 "00540 % ARMENIAN CAPITAL LETTER HO
+\setXTXcharcodes "00541 "00571 "00541 % ARMENIAN CAPITAL LETTER JA
+\setXTXcharcodes "00542 "00572 "00542 % ARMENIAN CAPITAL LETTER GHAD
+\setXTXcharcodes "00543 "00573 "00543 % ARMENIAN CAPITAL LETTER CHEH
+\setXTXcharcodes "00544 "00574 "00544 % ARMENIAN CAPITAL LETTER MEN
+\setXTXcharcodes "00545 "00575 "00545 % ARMENIAN CAPITAL LETTER YI
+\setXTXcharcodes "00546 "00576 "00546 % ARMENIAN CAPITAL LETTER NOW
+\setXTXcharcodes "00547 "00577 "00547 % ARMENIAN CAPITAL LETTER SHA
+\setXTXcharcodes "00548 "00578 "00548 % ARMENIAN CAPITAL LETTER VO
+\setXTXcharcodes "00549 "00579 "00549 % ARMENIAN CAPITAL LETTER CHA
+\setXTXcharcodes "0054A "0057A "0054A % ARMENIAN CAPITAL LETTER PEH
+\setXTXcharcodes "0054B "0057B "0054B % ARMENIAN CAPITAL LETTER JHEH
+\setXTXcharcodes "0054C "0057C "0054C % ARMENIAN CAPITAL LETTER RA
+\setXTXcharcodes "0054D "0057D "0054D % ARMENIAN CAPITAL LETTER SEH
+\setXTXcharcodes "0054E "0057E "0054E % ARMENIAN CAPITAL LETTER VEW
+\setXTXcharcodes "0054F "0057F "0054F % ARMENIAN CAPITAL LETTER TIWN
+\setXTXcharcodes "00550 "00580 "00550 % ARMENIAN CAPITAL LETTER REH
+\setXTXcharcodes "00551 "00581 "00551 % ARMENIAN CAPITAL LETTER CO
+\setXTXcharcodes "00552 "00582 "00552 % ARMENIAN CAPITAL LETTER YIWN
+\setXTXcharcodes "00553 "00583 "00553 % ARMENIAN CAPITAL LETTER PIWR
+\setXTXcharcodes "00554 "00584 "00554 % ARMENIAN CAPITAL LETTER KEH
+\setXTXcharcodes "00555 "00585 "00555 % ARMENIAN CAPITAL LETTER OH
+\setXTXcharcodes "00556 "00586 "00556 % ARMENIAN CAPITAL LETTER FEH
+\setXTXcharcodes "00561 "00561 "00531 % ARMENIAN SMALL LETTER AYB
+\setXTXcharcodes "00562 "00562 "00532 % ARMENIAN SMALL LETTER BEN
+\setXTXcharcodes "00563 "00563 "00533 % ARMENIAN SMALL LETTER GIM
+\setXTXcharcodes "00564 "00564 "00534 % ARMENIAN SMALL LETTER DA
+\setXTXcharcodes "00565 "00565 "00535 % ARMENIAN SMALL LETTER ECH
+\setXTXcharcodes "00566 "00566 "00536 % ARMENIAN SMALL LETTER ZA
+\setXTXcharcodes "00567 "00567 "00537 % ARMENIAN SMALL LETTER EH
+\setXTXcharcodes "00568 "00568 "00538 % ARMENIAN SMALL LETTER ET
+\setXTXcharcodes "00569 "00569 "00539 % ARMENIAN SMALL LETTER TO
+\setXTXcharcodes "0056A "0056A "0053A % ARMENIAN SMALL LETTER ZHE
+\setXTXcharcodes "0056B "0056B "0053B % ARMENIAN SMALL LETTER INI
+\setXTXcharcodes "0056C "0056C "0053C % ARMENIAN SMALL LETTER LIWN
+\setXTXcharcodes "0056D "0056D "0053D % ARMENIAN SMALL LETTER XEH
+\setXTXcharcodes "0056E "0056E "0053E % ARMENIAN SMALL LETTER CA
+\setXTXcharcodes "0056F "0056F "0053F % ARMENIAN SMALL LETTER KEN
+\setXTXcharcodes "00570 "00570 "00540 % ARMENIAN SMALL LETTER HO
+\setXTXcharcodes "00571 "00571 "00541 % ARMENIAN SMALL LETTER JA
+\setXTXcharcodes "00572 "00572 "00542 % ARMENIAN SMALL LETTER GHAD
+\setXTXcharcodes "00573 "00573 "00543 % ARMENIAN SMALL LETTER CHEH
+\setXTXcharcodes "00574 "00574 "00544 % ARMENIAN SMALL LETTER MEN
+\setXTXcharcodes "00575 "00575 "00545 % ARMENIAN SMALL LETTER YI
+\setXTXcharcodes "00576 "00576 "00546 % ARMENIAN SMALL LETTER NOW
+\setXTXcharcodes "00577 "00577 "00547 % ARMENIAN SMALL LETTER SHA
+\setXTXcharcodes "00578 "00578 "00548 % ARMENIAN SMALL LETTER VO
+\setXTXcharcodes "00579 "00579 "00549 % ARMENIAN SMALL LETTER CHA
+\setXTXcharcodes "0057A "0057A "0054A % ARMENIAN SMALL LETTER PEH
+\setXTXcharcodes "0057B "0057B "0054B % ARMENIAN SMALL LETTER JHEH
+\setXTXcharcodes "0057C "0057C "0054C % ARMENIAN SMALL LETTER RA
+\setXTXcharcodes "0057D "0057D "0054D % ARMENIAN SMALL LETTER SEH
+\setXTXcharcodes "0057E "0057E "0054E % ARMENIAN SMALL LETTER VEW
+\setXTXcharcodes "0057F "0057F "0054F % ARMENIAN SMALL LETTER TIWN
+\setXTXcharcodes "00580 "00580 "00550 % ARMENIAN SMALL LETTER REH
+\setXTXcharcodes "00581 "00581 "00551 % ARMENIAN SMALL LETTER CO
+\setXTXcharcodes "00582 "00582 "00552 % ARMENIAN SMALL LETTER YIWN
+\setXTXcharcodes "00583 "00583 "00553 % ARMENIAN SMALL LETTER PIWR
+\setXTXcharcodes "00584 "00584 "00554 % ARMENIAN SMALL LETTER KEH
+\setXTXcharcodes "00585 "00585 "00555 % ARMENIAN SMALL LETTER OH
+\setXTXcharcodes "00586 "00586 "00556 % ARMENIAN SMALL LETTER FEH
+\setXTXcharcodes "00587 "00587 "00587 % ARMENIAN SMALL LIGATURE ECH YIWN
+\setXTXcharcodes "010A0 "02D00 "010A0 % GEORGIAN CAPITAL LETTER AN
+\setXTXcharcodes "010A1 "02D01 "010A1 % GEORGIAN CAPITAL LETTER BAN
+\setXTXcharcodes "010A2 "02D02 "010A2 % GEORGIAN CAPITAL LETTER GAN
+\setXTXcharcodes "010A3 "02D03 "010A3 % GEORGIAN CAPITAL LETTER DON
+\setXTXcharcodes "010A4 "02D04 "010A4 % GEORGIAN CAPITAL LETTER EN
+\setXTXcharcodes "010A5 "02D05 "010A5 % GEORGIAN CAPITAL LETTER VIN
+\setXTXcharcodes "010A6 "02D06 "010A6 % GEORGIAN CAPITAL LETTER ZEN
+\setXTXcharcodes "010A7 "02D07 "010A7 % GEORGIAN CAPITAL LETTER TAN
+\setXTXcharcodes "010A8 "02D08 "010A8 % GEORGIAN CAPITAL LETTER IN
+\setXTXcharcodes "010A9 "02D09 "010A9 % GEORGIAN CAPITAL LETTER KAN
+\setXTXcharcodes "010AA "02D0A "010AA % GEORGIAN CAPITAL LETTER LAS
+\setXTXcharcodes "010AB "02D0B "010AB % GEORGIAN CAPITAL LETTER MAN
+\setXTXcharcodes "010AC "02D0C "010AC % GEORGIAN CAPITAL LETTER NAR
+\setXTXcharcodes "010AD "02D0D "010AD % GEORGIAN CAPITAL LETTER ON
+\setXTXcharcodes "010AE "02D0E "010AE % GEORGIAN CAPITAL LETTER PAR
+\setXTXcharcodes "010AF "02D0F "010AF % GEORGIAN CAPITAL LETTER ZHAR
+\setXTXcharcodes "010B0 "02D10 "010B0 % GEORGIAN CAPITAL LETTER RAE
+\setXTXcharcodes "010B1 "02D11 "010B1 % GEORGIAN CAPITAL LETTER SAN
+\setXTXcharcodes "010B2 "02D12 "010B2 % GEORGIAN CAPITAL LETTER TAR
+\setXTXcharcodes "010B3 "02D13 "010B3 % GEORGIAN CAPITAL LETTER UN
+\setXTXcharcodes "010B4 "02D14 "010B4 % GEORGIAN CAPITAL LETTER PHAR
+\setXTXcharcodes "010B5 "02D15 "010B5 % GEORGIAN CAPITAL LETTER KHAR
+\setXTXcharcodes "010B6 "02D16 "010B6 % GEORGIAN CAPITAL LETTER GHAN
+\setXTXcharcodes "010B7 "02D17 "010B7 % GEORGIAN CAPITAL LETTER QAR
+\setXTXcharcodes "010B8 "02D18 "010B8 % GEORGIAN CAPITAL LETTER SHIN
+\setXTXcharcodes "010B9 "02D19 "010B9 % GEORGIAN CAPITAL LETTER CHIN
+\setXTXcharcodes "010BA "02D1A "010BA % GEORGIAN CAPITAL LETTER CAN
+\setXTXcharcodes "010BB "02D1B "010BB % GEORGIAN CAPITAL LETTER JIL
+\setXTXcharcodes "010BC "02D1C "010BC % GEORGIAN CAPITAL LETTER CIL
+\setXTXcharcodes "010BD "02D1D "010BD % GEORGIAN CAPITAL LETTER CHAR
+\setXTXcharcodes "010BE "02D1E "010BE % GEORGIAN CAPITAL LETTER XAN
+\setXTXcharcodes "010BF "02D1F "010BF % GEORGIAN CAPITAL LETTER JHAN
+\setXTXcharcodes "010C0 "02D20 "010C0 % GEORGIAN CAPITAL LETTER HAE
+\setXTXcharcodes "010C1 "02D21 "010C1 % GEORGIAN CAPITAL LETTER HE
+\setXTXcharcodes "010C2 "02D22 "010C2 % GEORGIAN CAPITAL LETTER HIE
+\setXTXcharcodes "010C3 "02D23 "010C3 % GEORGIAN CAPITAL LETTER WE
+\setXTXcharcodes "010C4 "02D24 "010C4 % GEORGIAN CAPITAL LETTER HAR
+\setXTXcharcodes "010C5 "02D25 "010C5 % GEORGIAN CAPITAL LETTER HOE
+\setXTXcharcodes "01D00 "01D00 "01D00 % LATIN LETTER SMALL CAPITAL A
+\setXTXcharcodes "01D01 "01D01 "01D01 % LATIN LETTER SMALL CAPITAL AE
+\setXTXcharcodes "01D02 "01D02 "01D02 % LATIN SMALL LETTER TURNED AE
+\setXTXcharcodes "01D03 "01D03 "01D03 % LATIN LETTER SMALL CAPITAL BARRED B
+\setXTXcharcodes "01D04 "01D04 "01D04 % LATIN LETTER SMALL CAPITAL C
+\setXTXcharcodes "01D05 "01D05 "01D05 % LATIN LETTER SMALL CAPITAL D
+\setXTXcharcodes "01D06 "01D06 "01D06 % LATIN LETTER SMALL CAPITAL ETH
+\setXTXcharcodes "01D07 "01D07 "01D07 % LATIN LETTER SMALL CAPITAL E
+\setXTXcharcodes "01D08 "01D08 "01D08 % LATIN SMALL LETTER TURNED OPEN E
+\setXTXcharcodes "01D09 "01D09 "01D09 % LATIN SMALL LETTER TURNED I
+\setXTXcharcodes "01D0A "01D0A "01D0A % LATIN LETTER SMALL CAPITAL J
+\setXTXcharcodes "01D0B "01D0B "01D0B % LATIN LETTER SMALL CAPITAL K
+\setXTXcharcodes "01D0C "01D0C "01D0C % LATIN LETTER SMALL CAPITAL L WITH STROKE
+\setXTXcharcodes "01D0D "01D0D "01D0D % LATIN LETTER SMALL CAPITAL M
+\setXTXcharcodes "01D0E "01D0E "01D0E % LATIN LETTER SMALL CAPITAL REVERSED N
+\setXTXcharcodes "01D0F "01D0F "01D0F % LATIN LETTER SMALL CAPITAL O
+\setXTXcharcodes "01D10 "01D10 "01D10 % LATIN LETTER SMALL CAPITAL OPEN O
+\setXTXcharcodes "01D11 "01D11 "01D11 % LATIN SMALL LETTER SIDEWAYS O
+\setXTXcharcodes "01D12 "01D12 "01D12 % LATIN SMALL LETTER SIDEWAYS OPEN O
+\setXTXcharcodes "01D13 "01D13 "01D13 % LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+\setXTXcharcodes "01D14 "01D14 "01D14 % LATIN SMALL LETTER TURNED OE
+\setXTXcharcodes "01D15 "01D15 "01D15 % LATIN LETTER SMALL CAPITAL OU
+\setXTXcharcodes "01D16 "01D16 "01D16 % LATIN SMALL LETTER TOP HALF O
+\setXTXcharcodes "01D17 "01D17 "01D17 % LATIN SMALL LETTER BOTTOM HALF O
+\setXTXcharcodes "01D18 "01D18 "01D18 % LATIN LETTER SMALL CAPITAL P
+\setXTXcharcodes "01D19 "01D19 "01D19 % LATIN LETTER SMALL CAPITAL REVERSED R
+\setXTXcharcodes "01D1A "01D1A "01D1A % LATIN LETTER SMALL CAPITAL TURNED R
+\setXTXcharcodes "01D1B "01D1B "01D1B % LATIN LETTER SMALL CAPITAL T
+\setXTXcharcodes "01D1C "01D1C "01D1C % LATIN LETTER SMALL CAPITAL U
+\setXTXcharcodes "01D1D "01D1D "01D1D % LATIN SMALL LETTER SIDEWAYS U
+\setXTXcharcodes "01D1E "01D1E "01D1E % LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+\setXTXcharcodes "01D1F "01D1F "01D1F % LATIN SMALL LETTER SIDEWAYS TURNED M
+\setXTXcharcodes "01D20 "01D20 "01D20 % LATIN LETTER SMALL CAPITAL V
+\setXTXcharcodes "01D21 "01D21 "01D21 % LATIN LETTER SMALL CAPITAL W
+\setXTXcharcodes "01D22 "01D22 "01D22 % LATIN LETTER SMALL CAPITAL Z
+\setXTXcharcodes "01D23 "01D23 "01D23 % LATIN LETTER SMALL CAPITAL EZH
+\setXTXcharcodes "01D24 "01D24 "01D24 % LATIN LETTER VOICED LARYNGEAL SPIRANT
+\setXTXcharcodes "01D25 "01D25 "01D25 % LATIN LETTER AIN
+\setXTXcharcodes "01D26 "01D26 "01D26 % GREEK LETTER SMALL CAPITAL GAMMA
+\setXTXcharcodes "01D27 "01D27 "01D27 % GREEK LETTER SMALL CAPITAL LAMDA
+\setXTXcharcodes "01D28 "01D28 "01D28 % GREEK LETTER SMALL CAPITAL PI
+\setXTXcharcodes "01D29 "01D29 "01D29 % GREEK LETTER SMALL CAPITAL RHO
+\setXTXcharcodes "01D2A "01D2A "01D2A % GREEK LETTER SMALL CAPITAL PSI
+\setXTXcharcodes "01D2B "01D2B "01D2B % CYRILLIC LETTER SMALL CAPITAL EL
+\setXTXcharcodes "01D62 "01D62 "01D62 % LATIN SUBSCRIPT SMALL LETTER I
+\setXTXcharcodes "01D63 "01D63 "01D63 % LATIN SUBSCRIPT SMALL LETTER R
+\setXTXcharcodes "01D64 "01D64 "01D64 % LATIN SUBSCRIPT SMALL LETTER U
+\setXTXcharcodes "01D65 "01D65 "01D65 % LATIN SUBSCRIPT SMALL LETTER V
+\setXTXcharcodes "01D66 "01D66 "01D66 % GREEK SUBSCRIPT SMALL LETTER BETA
+\setXTXcharcodes "01D67 "01D67 "01D67 % GREEK SUBSCRIPT SMALL LETTER GAMMA
+\setXTXcharcodes "01D68 "01D68 "01D68 % GREEK SUBSCRIPT SMALL LETTER RHO
+\setXTXcharcodes "01D69 "01D69 "01D69 % GREEK SUBSCRIPT SMALL LETTER PHI
+\setXTXcharcodes "01D6A "01D6A "01D6A % GREEK SUBSCRIPT SMALL LETTER CHI
+\setXTXcharcodes "01D6B "01D6B "01D6B % LATIN SMALL LETTER UE
+\setXTXcharcodes "01D6C "01D6C "01D6C % LATIN SMALL LETTER B WITH MIDDLE TILDE
+\setXTXcharcodes "01D6D "01D6D "01D6D % LATIN SMALL LETTER D WITH MIDDLE TILDE
+\setXTXcharcodes "01D6E "01D6E "01D6E % LATIN SMALL LETTER F WITH MIDDLE TILDE
+\setXTXcharcodes "01D6F "01D6F "01D6F % LATIN SMALL LETTER M WITH MIDDLE TILDE
+\setXTXcharcodes "01D70 "01D70 "01D70 % LATIN SMALL LETTER N WITH MIDDLE TILDE
+\setXTXcharcodes "01D71 "01D71 "01D71 % LATIN SMALL LETTER P WITH MIDDLE TILDE
+\setXTXcharcodes "01D72 "01D72 "01D72 % LATIN SMALL LETTER R WITH MIDDLE TILDE
+\setXTXcharcodes "01D73 "01D73 "01D73 % LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+\setXTXcharcodes "01D74 "01D74 "01D74 % LATIN SMALL LETTER S WITH MIDDLE TILDE
+\setXTXcharcodes "01D75 "01D75 "01D75 % LATIN SMALL LETTER T WITH MIDDLE TILDE
+\setXTXcharcodes "01D76 "01D76 "01D76 % LATIN SMALL LETTER Z WITH MIDDLE TILDE
+\setXTXcharcodes "01D77 "01D77 "01D77 % LATIN SMALL LETTER TURNED G
+\setXTXcharcodes "01D79 "01D79 "01D79 % LATIN SMALL LETTER INSULAR G
+\setXTXcharcodes "01D7A "01D7A "01D7A % LATIN SMALL LETTER TH WITH STRIKETHROUGH
+\setXTXcharcodes "01D7B "01D7B "01D7B % LATIN SMALL CAPITAL LETTER I WITH STROKE
+\setXTXcharcodes "01D7C "01D7C "01D7C % LATIN SMALL LETTER IOTA WITH STROKE
+\setXTXcharcodes "01D7D "01D7D "02C63 % LATIN SMALL LETTER P WITH STROKE
+\setXTXcharcodes "01D7E "01D7E "01D7E % LATIN SMALL CAPITAL LETTER U WITH STROKE
+\setXTXcharcodes "01D7F "01D7F "01D7F % LATIN SMALL LETTER UPSILON WITH STROKE
+\setXTXcharcodes "01D80 "01D80 "01D80 % LATIN SMALL LETTER B WITH PALATAL HOOK
+\setXTXcharcodes "01D81 "01D81 "01D81 % LATIN SMALL LETTER D WITH PALATAL HOOK
+\setXTXcharcodes "01D82 "01D82 "01D82 % LATIN SMALL LETTER F WITH PALATAL HOOK
+\setXTXcharcodes "01D83 "01D83 "01D83 % LATIN SMALL LETTER G WITH PALATAL HOOK
+\setXTXcharcodes "01D84 "01D84 "01D84 % LATIN SMALL LETTER K WITH PALATAL HOOK
+\setXTXcharcodes "01D85 "01D85 "01D85 % LATIN SMALL LETTER L WITH PALATAL HOOK
+\setXTXcharcodes "01D86 "01D86 "01D86 % LATIN SMALL LETTER M WITH PALATAL HOOK
+\setXTXcharcodes "01D87 "01D87 "01D87 % LATIN SMALL LETTER N WITH PALATAL HOOK
+\setXTXcharcodes "01D88 "01D88 "01D88 % LATIN SMALL LETTER P WITH PALATAL HOOK
+\setXTXcharcodes "01D89 "01D89 "01D89 % LATIN SMALL LETTER R WITH PALATAL HOOK
+\setXTXcharcodes "01D8A "01D8A "01D8A % LATIN SMALL LETTER S WITH PALATAL HOOK
+\setXTXcharcodes "01D8B "01D8B "01D8B % LATIN SMALL LETTER ESH WITH PALATAL HOOK
+\setXTXcharcodes "01D8C "01D8C "01D8C % LATIN SMALL LETTER V WITH PALATAL HOOK
+\setXTXcharcodes "01D8D "01D8D "01D8D % LATIN SMALL LETTER X WITH PALATAL HOOK
+\setXTXcharcodes "01D8E "01D8E "01D8E % LATIN SMALL LETTER Z WITH PALATAL HOOK
+\setXTXcharcodes "01D8F "01D8F "01D8F % LATIN SMALL LETTER A WITH RETROFLEX HOOK
+\setXTXcharcodes "01D90 "01D90 "01D90 % LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+\setXTXcharcodes "01D91 "01D91 "01D91 % LATIN SMALL LETTER D WITH HOOK AND TAIL
+\setXTXcharcodes "01D92 "01D92 "01D92 % LATIN SMALL LETTER E WITH RETROFLEX HOOK
+\setXTXcharcodes "01D93 "01D93 "01D93 % LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+\setXTXcharcodes "01D94 "01D94 "01D94 % LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+\setXTXcharcodes "01D95 "01D95 "01D95 % LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+\setXTXcharcodes "01D96 "01D96 "01D96 % LATIN SMALL LETTER I WITH RETROFLEX HOOK
+\setXTXcharcodes "01D97 "01D97 "01D97 % LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+\setXTXcharcodes "01D98 "01D98 "01D98 % LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+\setXTXcharcodes "01D99 "01D99 "01D99 % LATIN SMALL LETTER U WITH RETROFLEX HOOK
+\setXTXcharcodes "01D9A "01D9A "01D9A % LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+\setXTXcharcodes "01E00 "01E01 "01E00 % LATIN CAPITAL LETTER A WITH RING BELOW
+\setXTXcharcodes "01E01 "01E01 "01E00 % LATIN SMALL LETTER A WITH RING BELOW
+\setXTXcharcodes "01E02 "01E03 "01E02 % LATIN CAPITAL LETTER B WITH DOT ABOVE
+\setXTXcharcodes "01E03 "01E03 "01E02 % LATIN SMALL LETTER B WITH DOT ABOVE
+\setXTXcharcodes "01E04 "01E05 "01E04 % LATIN CAPITAL LETTER B WITH DOT BELOW
+\setXTXcharcodes "01E05 "01E05 "01E04 % LATIN SMALL LETTER B WITH DOT BELOW
+\setXTXcharcodes "01E06 "01E07 "01E06 % LATIN CAPITAL LETTER B WITH LINE BELOW
+\setXTXcharcodes "01E07 "01E07 "01E06 % LATIN SMALL LETTER B WITH LINE BELOW
+\setXTXcharcodes "01E08 "01E09 "01E08 % LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+\setXTXcharcodes "01E09 "01E09 "01E08 % LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+\setXTXcharcodes "01E0A "01E0B "01E0A % LATIN CAPITAL LETTER D WITH DOT ABOVE
+\setXTXcharcodes "01E0B "01E0B "01E0A % LATIN SMALL LETTER D WITH DOT ABOVE
+\setXTXcharcodes "01E0C "01E0D "01E0C % LATIN CAPITAL LETTER D WITH DOT BELOW
+\setXTXcharcodes "01E0D "01E0D "01E0C % LATIN SMALL LETTER D WITH DOT BELOW
+\setXTXcharcodes "01E0E "01E0F "01E0E % LATIN CAPITAL LETTER D WITH LINE BELOW
+\setXTXcharcodes "01E0F "01E0F "01E0E % LATIN SMALL LETTER D WITH LINE BELOW
+\setXTXcharcodes "01E10 "01E11 "01E10 % LATIN CAPITAL LETTER D WITH CEDILLA
+\setXTXcharcodes "01E11 "01E11 "01E10 % LATIN SMALL LETTER D WITH CEDILLA
+\setXTXcharcodes "01E12 "01E13 "01E12 % LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E13 "01E13 "01E12 % LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E14 "01E15 "01E14 % LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+\setXTXcharcodes "01E15 "01E15 "01E14 % LATIN SMALL LETTER E WITH MACRON AND GRAVE
+\setXTXcharcodes "01E16 "01E17 "01E16 % LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+\setXTXcharcodes "01E17 "01E17 "01E16 % LATIN SMALL LETTER E WITH MACRON AND ACUTE
+\setXTXcharcodes "01E18 "01E19 "01E18 % LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E19 "01E19 "01E18 % LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E1A "01E1B "01E1A % LATIN CAPITAL LETTER E WITH TILDE BELOW
+\setXTXcharcodes "01E1B "01E1B "01E1A % LATIN SMALL LETTER E WITH TILDE BELOW
+\setXTXcharcodes "01E1C "01E1D "01E1C % LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+\setXTXcharcodes "01E1D "01E1D "01E1C % LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+\setXTXcharcodes "01E1E "01E1F "01E1E % LATIN CAPITAL LETTER F WITH DOT ABOVE
+\setXTXcharcodes "01E1F "01E1F "01E1E % LATIN SMALL LETTER F WITH DOT ABOVE
+\setXTXcharcodes "01E20 "01E21 "01E20 % LATIN CAPITAL LETTER G WITH MACRON
+\setXTXcharcodes "01E21 "01E21 "01E20 % LATIN SMALL LETTER G WITH MACRON
+\setXTXcharcodes "01E22 "01E23 "01E22 % LATIN CAPITAL LETTER H WITH DOT ABOVE
+\setXTXcharcodes "01E23 "01E23 "01E22 % LATIN SMALL LETTER H WITH DOT ABOVE
+\setXTXcharcodes "01E24 "01E25 "01E24 % LATIN CAPITAL LETTER H WITH DOT BELOW
+\setXTXcharcodes "01E25 "01E25 "01E24 % LATIN SMALL LETTER H WITH DOT BELOW
+\setXTXcharcodes "01E26 "01E27 "01E26 % LATIN CAPITAL LETTER H WITH DIAERESIS
+\setXTXcharcodes "01E27 "01E27 "01E26 % LATIN SMALL LETTER H WITH DIAERESIS
+\setXTXcharcodes "01E28 "01E29 "01E28 % LATIN CAPITAL LETTER H WITH CEDILLA
+\setXTXcharcodes "01E29 "01E29 "01E28 % LATIN SMALL LETTER H WITH CEDILLA
+\setXTXcharcodes "01E2A "01E2B "01E2A % LATIN CAPITAL LETTER H WITH BREVE BELOW
+\setXTXcharcodes "01E2B "01E2B "01E2A % LATIN SMALL LETTER H WITH BREVE BELOW
+\setXTXcharcodes "01E2C "01E2D "01E2C % LATIN CAPITAL LETTER I WITH TILDE BELOW
+\setXTXcharcodes "01E2D "01E2D "01E2C % LATIN SMALL LETTER I WITH TILDE BELOW
+\setXTXcharcodes "01E2E "01E2F "01E2E % LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+\setXTXcharcodes "01E2F "01E2F "01E2E % LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+\setXTXcharcodes "01E30 "01E31 "01E30 % LATIN CAPITAL LETTER K WITH ACUTE
+\setXTXcharcodes "01E31 "01E31 "01E30 % LATIN SMALL LETTER K WITH ACUTE
+\setXTXcharcodes "01E32 "01E33 "01E32 % LATIN CAPITAL LETTER K WITH DOT BELOW
+\setXTXcharcodes "01E33 "01E33 "01E32 % LATIN SMALL LETTER K WITH DOT BELOW
+\setXTXcharcodes "01E34 "01E35 "01E34 % LATIN CAPITAL LETTER K WITH LINE BELOW
+\setXTXcharcodes "01E35 "01E35 "01E34 % LATIN SMALL LETTER K WITH LINE BELOW
+\setXTXcharcodes "01E36 "01E37 "01E36 % LATIN CAPITAL LETTER L WITH DOT BELOW
+\setXTXcharcodes "01E37 "01E37 "01E36 % LATIN SMALL LETTER L WITH DOT BELOW
+\setXTXcharcodes "01E38 "01E39 "01E38 % LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+\setXTXcharcodes "01E39 "01E39 "01E38 % LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+\setXTXcharcodes "01E3A "01E3B "01E3A % LATIN CAPITAL LETTER L WITH LINE BELOW
+\setXTXcharcodes "01E3B "01E3B "01E3A % LATIN SMALL LETTER L WITH LINE BELOW
+\setXTXcharcodes "01E3C "01E3D "01E3C % LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E3D "01E3D "01E3C % LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E3E "01E3F "01E3E % LATIN CAPITAL LETTER M WITH ACUTE
+\setXTXcharcodes "01E3F "01E3F "01E3E % LATIN SMALL LETTER M WITH ACUTE
+\setXTXcharcodes "01E40 "01E41 "01E40 % LATIN CAPITAL LETTER M WITH DOT ABOVE
+\setXTXcharcodes "01E41 "01E41 "01E40 % LATIN SMALL LETTER M WITH DOT ABOVE
+\setXTXcharcodes "01E42 "01E43 "01E42 % LATIN CAPITAL LETTER M WITH DOT BELOW
+\setXTXcharcodes "01E43 "01E43 "01E42 % LATIN SMALL LETTER M WITH DOT BELOW
+\setXTXcharcodes "01E44 "01E45 "01E44 % LATIN CAPITAL LETTER N WITH DOT ABOVE
+\setXTXcharcodes "01E45 "01E45 "01E44 % LATIN SMALL LETTER N WITH DOT ABOVE
+\setXTXcharcodes "01E46 "01E47 "01E46 % LATIN CAPITAL LETTER N WITH DOT BELOW
+\setXTXcharcodes "01E47 "01E47 "01E46 % LATIN SMALL LETTER N WITH DOT BELOW
+\setXTXcharcodes "01E48 "01E49 "01E48 % LATIN CAPITAL LETTER N WITH LINE BELOW
+\setXTXcharcodes "01E49 "01E49 "01E48 % LATIN SMALL LETTER N WITH LINE BELOW
+\setXTXcharcodes "01E4A "01E4B "01E4A % LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E4B "01E4B "01E4A % LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E4C "01E4D "01E4C % LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+\setXTXcharcodes "01E4D "01E4D "01E4C % LATIN SMALL LETTER O WITH TILDE AND ACUTE
+\setXTXcharcodes "01E4E "01E4F "01E4E % LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+\setXTXcharcodes "01E4F "01E4F "01E4E % LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+\setXTXcharcodes "01E50 "01E51 "01E50 % LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+\setXTXcharcodes "01E51 "01E51 "01E50 % LATIN SMALL LETTER O WITH MACRON AND GRAVE
+\setXTXcharcodes "01E52 "01E53 "01E52 % LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+\setXTXcharcodes "01E53 "01E53 "01E52 % LATIN SMALL LETTER O WITH MACRON AND ACUTE
+\setXTXcharcodes "01E54 "01E55 "01E54 % LATIN CAPITAL LETTER P WITH ACUTE
+\setXTXcharcodes "01E55 "01E55 "01E54 % LATIN SMALL LETTER P WITH ACUTE
+\setXTXcharcodes "01E56 "01E57 "01E56 % LATIN CAPITAL LETTER P WITH DOT ABOVE
+\setXTXcharcodes "01E57 "01E57 "01E56 % LATIN SMALL LETTER P WITH DOT ABOVE
+\setXTXcharcodes "01E58 "01E59 "01E58 % LATIN CAPITAL LETTER R WITH DOT ABOVE
+\setXTXcharcodes "01E59 "01E59 "01E58 % LATIN SMALL LETTER R WITH DOT ABOVE
+\setXTXcharcodes "01E5A "01E5B "01E5A % LATIN CAPITAL LETTER R WITH DOT BELOW
+\setXTXcharcodes "01E5B "01E5B "01E5A % LATIN SMALL LETTER R WITH DOT BELOW
+\setXTXcharcodes "01E5C "01E5D "01E5C % LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+\setXTXcharcodes "01E5D "01E5D "01E5C % LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+\setXTXcharcodes "01E5E "01E5F "01E5E % LATIN CAPITAL LETTER R WITH LINE BELOW
+\setXTXcharcodes "01E5F "01E5F "01E5E % LATIN SMALL LETTER R WITH LINE BELOW
+\setXTXcharcodes "01E60 "01E61 "01E60 % LATIN CAPITAL LETTER S WITH DOT ABOVE
+\setXTXcharcodes "01E61 "01E61 "01E60 % LATIN SMALL LETTER S WITH DOT ABOVE
+\setXTXcharcodes "01E62 "01E63 "01E62 % LATIN CAPITAL LETTER S WITH DOT BELOW
+\setXTXcharcodes "01E63 "01E63 "01E62 % LATIN SMALL LETTER S WITH DOT BELOW
+\setXTXcharcodes "01E64 "01E65 "01E64 % LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+\setXTXcharcodes "01E65 "01E65 "01E64 % LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+\setXTXcharcodes "01E66 "01E67 "01E66 % LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+\setXTXcharcodes "01E67 "01E67 "01E66 % LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+\setXTXcharcodes "01E68 "01E69 "01E68 % LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+\setXTXcharcodes "01E69 "01E69 "01E68 % LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+\setXTXcharcodes "01E6A "01E6B "01E6A % LATIN CAPITAL LETTER T WITH DOT ABOVE
+\setXTXcharcodes "01E6B "01E6B "01E6A % LATIN SMALL LETTER T WITH DOT ABOVE
+\setXTXcharcodes "01E6C "01E6D "01E6C % LATIN CAPITAL LETTER T WITH DOT BELOW
+\setXTXcharcodes "01E6D "01E6D "01E6C % LATIN SMALL LETTER T WITH DOT BELOW
+\setXTXcharcodes "01E6E "01E6F "01E6E % LATIN CAPITAL LETTER T WITH LINE BELOW
+\setXTXcharcodes "01E6F "01E6F "01E6E % LATIN SMALL LETTER T WITH LINE BELOW
+\setXTXcharcodes "01E70 "01E71 "01E70 % LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E71 "01E71 "01E70 % LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E72 "01E73 "01E72 % LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+\setXTXcharcodes "01E73 "01E73 "01E72 % LATIN SMALL LETTER U WITH DIAERESIS BELOW
+\setXTXcharcodes "01E74 "01E75 "01E74 % LATIN CAPITAL LETTER U WITH TILDE BELOW
+\setXTXcharcodes "01E75 "01E75 "01E74 % LATIN SMALL LETTER U WITH TILDE BELOW
+\setXTXcharcodes "01E76 "01E77 "01E76 % LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E77 "01E77 "01E76 % LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+\setXTXcharcodes "01E78 "01E79 "01E78 % LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+\setXTXcharcodes "01E79 "01E79 "01E78 % LATIN SMALL LETTER U WITH TILDE AND ACUTE
+\setXTXcharcodes "01E7A "01E7B "01E7A % LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+\setXTXcharcodes "01E7B "01E7B "01E7A % LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+\setXTXcharcodes "01E7C "01E7D "01E7C % LATIN CAPITAL LETTER V WITH TILDE
+\setXTXcharcodes "01E7D "01E7D "01E7C % LATIN SMALL LETTER V WITH TILDE
+\setXTXcharcodes "01E7E "01E7F "01E7E % LATIN CAPITAL LETTER V WITH DOT BELOW
+\setXTXcharcodes "01E7F "01E7F "01E7E % LATIN SMALL LETTER V WITH DOT BELOW
+\setXTXcharcodes "01E80 "01E81 "01E80 % LATIN CAPITAL LETTER W WITH GRAVE
+\setXTXcharcodes "01E81 "01E81 "01E80 % LATIN SMALL LETTER W WITH GRAVE
+\setXTXcharcodes "01E82 "01E83 "01E82 % LATIN CAPITAL LETTER W WITH ACUTE
+\setXTXcharcodes "01E83 "01E83 "01E82 % LATIN SMALL LETTER W WITH ACUTE
+\setXTXcharcodes "01E84 "01E85 "01E84 % LATIN CAPITAL LETTER W WITH DIAERESIS
+\setXTXcharcodes "01E85 "01E85 "01E84 % LATIN SMALL LETTER W WITH DIAERESIS
+\setXTXcharcodes "01E86 "01E87 "01E86 % LATIN CAPITAL LETTER W WITH DOT ABOVE
+\setXTXcharcodes "01E87 "01E87 "01E86 % LATIN SMALL LETTER W WITH DOT ABOVE
+\setXTXcharcodes "01E88 "01E89 "01E88 % LATIN CAPITAL LETTER W WITH DOT BELOW
+\setXTXcharcodes "01E89 "01E89 "01E88 % LATIN SMALL LETTER W WITH DOT BELOW
+\setXTXcharcodes "01E8A "01E8B "01E8A % LATIN CAPITAL LETTER X WITH DOT ABOVE
+\setXTXcharcodes "01E8B "01E8B "01E8A % LATIN SMALL LETTER X WITH DOT ABOVE
+\setXTXcharcodes "01E8C "01E8D "01E8C % LATIN CAPITAL LETTER X WITH DIAERESIS
+\setXTXcharcodes "01E8D "01E8D "01E8C % LATIN SMALL LETTER X WITH DIAERESIS
+\setXTXcharcodes "01E8E "01E8F "01E8E % LATIN CAPITAL LETTER Y WITH DOT ABOVE
+\setXTXcharcodes "01E8F "01E8F "01E8E % LATIN SMALL LETTER Y WITH DOT ABOVE
+\setXTXcharcodes "01E90 "01E91 "01E90 % LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+\setXTXcharcodes "01E91 "01E91 "01E90 % LATIN SMALL LETTER Z WITH CIRCUMFLEX
+\setXTXcharcodes "01E92 "01E93 "01E92 % LATIN CAPITAL LETTER Z WITH DOT BELOW
+\setXTXcharcodes "01E93 "01E93 "01E92 % LATIN SMALL LETTER Z WITH DOT BELOW
+\setXTXcharcodes "01E94 "01E95 "01E94 % LATIN CAPITAL LETTER Z WITH LINE BELOW
+\setXTXcharcodes "01E95 "01E95 "01E94 % LATIN SMALL LETTER Z WITH LINE BELOW
+\setXTXcharcodes "01E96 "01E96 "01E96 % LATIN SMALL LETTER H WITH LINE BELOW
+\setXTXcharcodes "01E97 "01E97 "01E97 % LATIN SMALL LETTER T WITH DIAERESIS
+\setXTXcharcodes "01E98 "01E98 "01E98 % LATIN SMALL LETTER W WITH RING ABOVE
+\setXTXcharcodes "01E99 "01E99 "01E99 % LATIN SMALL LETTER Y WITH RING ABOVE
+\setXTXcharcodes "01E9A "01E9A "01E9A % LATIN SMALL LETTER A WITH RIGHT HALF RING
+\setXTXcharcodes "01E9B "01E9B "01E60 % LATIN SMALL LETTER LONG S WITH DOT ABOVE
+\setXTXcharcodes "01EA0 "01EA1 "01EA0 % LATIN CAPITAL LETTER A WITH DOT BELOW
+\setXTXcharcodes "01EA1 "01EA1 "01EA0 % LATIN SMALL LETTER A WITH DOT BELOW
+\setXTXcharcodes "01EA2 "01EA3 "01EA2 % LATIN CAPITAL LETTER A WITH HOOK ABOVE
+\setXTXcharcodes "01EA3 "01EA3 "01EA2 % LATIN SMALL LETTER A WITH HOOK ABOVE
+\setXTXcharcodes "01EA4 "01EA5 "01EA4 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+\setXTXcharcodes "01EA5 "01EA5 "01EA4 % LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+\setXTXcharcodes "01EA6 "01EA7 "01EA6 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+\setXTXcharcodes "01EA7 "01EA7 "01EA6 % LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+\setXTXcharcodes "01EA8 "01EA9 "01EA8 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+\setXTXcharcodes "01EA9 "01EA9 "01EA8 % LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+\setXTXcharcodes "01EAA "01EAB "01EAA % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+\setXTXcharcodes "01EAB "01EAB "01EAA % LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+\setXTXcharcodes "01EAC "01EAD "01EAC % LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+\setXTXcharcodes "01EAD "01EAD "01EAC % LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+\setXTXcharcodes "01EAE "01EAF "01EAE % LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+\setXTXcharcodes "01EAF "01EAF "01EAE % LATIN SMALL LETTER A WITH BREVE AND ACUTE
+\setXTXcharcodes "01EB0 "01EB1 "01EB0 % LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+\setXTXcharcodes "01EB1 "01EB1 "01EB0 % LATIN SMALL LETTER A WITH BREVE AND GRAVE
+\setXTXcharcodes "01EB2 "01EB3 "01EB2 % LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+\setXTXcharcodes "01EB3 "01EB3 "01EB2 % LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+\setXTXcharcodes "01EB4 "01EB5 "01EB4 % LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+\setXTXcharcodes "01EB5 "01EB5 "01EB4 % LATIN SMALL LETTER A WITH BREVE AND TILDE
+\setXTXcharcodes "01EB6 "01EB7 "01EB6 % LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+\setXTXcharcodes "01EB7 "01EB7 "01EB6 % LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+\setXTXcharcodes "01EB8 "01EB9 "01EB8 % LATIN CAPITAL LETTER E WITH DOT BELOW
+\setXTXcharcodes "01EB9 "01EB9 "01EB8 % LATIN SMALL LETTER E WITH DOT BELOW
+\setXTXcharcodes "01EBA "01EBB "01EBA % LATIN CAPITAL LETTER E WITH HOOK ABOVE
+\setXTXcharcodes "01EBB "01EBB "01EBA % LATIN SMALL LETTER E WITH HOOK ABOVE
+\setXTXcharcodes "01EBC "01EBD "01EBC % LATIN CAPITAL LETTER E WITH TILDE
+\setXTXcharcodes "01EBD "01EBD "01EBC % LATIN SMALL LETTER E WITH TILDE
+\setXTXcharcodes "01EBE "01EBF "01EBE % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+\setXTXcharcodes "01EBF "01EBF "01EBE % LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+\setXTXcharcodes "01EC0 "01EC1 "01EC0 % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+\setXTXcharcodes "01EC1 "01EC1 "01EC0 % LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+\setXTXcharcodes "01EC2 "01EC3 "01EC2 % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+\setXTXcharcodes "01EC3 "01EC3 "01EC2 % LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+\setXTXcharcodes "01EC4 "01EC5 "01EC4 % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+\setXTXcharcodes "01EC5 "01EC5 "01EC4 % LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+\setXTXcharcodes "01EC6 "01EC7 "01EC6 % LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+\setXTXcharcodes "01EC7 "01EC7 "01EC6 % LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+\setXTXcharcodes "01EC8 "01EC9 "01EC8 % LATIN CAPITAL LETTER I WITH HOOK ABOVE
+\setXTXcharcodes "01EC9 "01EC9 "01EC8 % LATIN SMALL LETTER I WITH HOOK ABOVE
+\setXTXcharcodes "01ECA "01ECB "01ECA % LATIN CAPITAL LETTER I WITH DOT BELOW
+\setXTXcharcodes "01ECB "01ECB "01ECA % LATIN SMALL LETTER I WITH DOT BELOW
+\setXTXcharcodes "01ECC "01ECD "01ECC % LATIN CAPITAL LETTER O WITH DOT BELOW
+\setXTXcharcodes "01ECD "01ECD "01ECC % LATIN SMALL LETTER O WITH DOT BELOW
+\setXTXcharcodes "01ECE "01ECF "01ECE % LATIN CAPITAL LETTER O WITH HOOK ABOVE
+\setXTXcharcodes "01ECF "01ECF "01ECE % LATIN SMALL LETTER O WITH HOOK ABOVE
+\setXTXcharcodes "01ED0 "01ED1 "01ED0 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+\setXTXcharcodes "01ED1 "01ED1 "01ED0 % LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+\setXTXcharcodes "01ED2 "01ED3 "01ED2 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+\setXTXcharcodes "01ED3 "01ED3 "01ED2 % LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+\setXTXcharcodes "01ED4 "01ED5 "01ED4 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+\setXTXcharcodes "01ED5 "01ED5 "01ED4 % LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+\setXTXcharcodes "01ED6 "01ED7 "01ED6 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+\setXTXcharcodes "01ED7 "01ED7 "01ED6 % LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+\setXTXcharcodes "01ED8 "01ED9 "01ED8 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+\setXTXcharcodes "01ED9 "01ED9 "01ED8 % LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+\setXTXcharcodes "01EDA "01EDB "01EDA % LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+\setXTXcharcodes "01EDB "01EDB "01EDA % LATIN SMALL LETTER O WITH HORN AND ACUTE
+\setXTXcharcodes "01EDC "01EDD "01EDC % LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+\setXTXcharcodes "01EDD "01EDD "01EDC % LATIN SMALL LETTER O WITH HORN AND GRAVE
+\setXTXcharcodes "01EDE "01EDF "01EDE % LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+\setXTXcharcodes "01EDF "01EDF "01EDE % LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+\setXTXcharcodes "01EE0 "01EE1 "01EE0 % LATIN CAPITAL LETTER O WITH HORN AND TILDE
+\setXTXcharcodes "01EE1 "01EE1 "01EE0 % LATIN SMALL LETTER O WITH HORN AND TILDE
+\setXTXcharcodes "01EE2 "01EE3 "01EE2 % LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+\setXTXcharcodes "01EE3 "01EE3 "01EE2 % LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+\setXTXcharcodes "01EE4 "01EE5 "01EE4 % LATIN CAPITAL LETTER U WITH DOT BELOW
+\setXTXcharcodes "01EE5 "01EE5 "01EE4 % LATIN SMALL LETTER U WITH DOT BELOW
+\setXTXcharcodes "01EE6 "01EE7 "01EE6 % LATIN CAPITAL LETTER U WITH HOOK ABOVE
+\setXTXcharcodes "01EE7 "01EE7 "01EE6 % LATIN SMALL LETTER U WITH HOOK ABOVE
+\setXTXcharcodes "01EE8 "01EE9 "01EE8 % LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+\setXTXcharcodes "01EE9 "01EE9 "01EE8 % LATIN SMALL LETTER U WITH HORN AND ACUTE
+\setXTXcharcodes "01EEA "01EEB "01EEA % LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+\setXTXcharcodes "01EEB "01EEB "01EEA % LATIN SMALL LETTER U WITH HORN AND GRAVE
+\setXTXcharcodes "01EEC "01EED "01EEC % LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+\setXTXcharcodes "01EED "01EED "01EEC % LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+\setXTXcharcodes "01EEE "01EEF "01EEE % LATIN CAPITAL LETTER U WITH HORN AND TILDE
+\setXTXcharcodes "01EEF "01EEF "01EEE % LATIN SMALL LETTER U WITH HORN AND TILDE
+\setXTXcharcodes "01EF0 "01EF1 "01EF0 % LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+\setXTXcharcodes "01EF1 "01EF1 "01EF0 % LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+\setXTXcharcodes "01EF2 "01EF3 "01EF2 % LATIN CAPITAL LETTER Y WITH GRAVE
+\setXTXcharcodes "01EF3 "01EF3 "01EF2 % LATIN SMALL LETTER Y WITH GRAVE
+\setXTXcharcodes "01EF4 "01EF5 "01EF4 % LATIN CAPITAL LETTER Y WITH DOT BELOW
+\setXTXcharcodes "01EF5 "01EF5 "01EF4 % LATIN SMALL LETTER Y WITH DOT BELOW
+\setXTXcharcodes "01EF6 "01EF7 "01EF6 % LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+\setXTXcharcodes "01EF7 "01EF7 "01EF6 % LATIN SMALL LETTER Y WITH HOOK ABOVE
+\setXTXcharcodes "01EF8 "01EF9 "01EF8 % LATIN CAPITAL LETTER Y WITH TILDE
+\setXTXcharcodes "01EF9 "01EF9 "01EF8 % LATIN SMALL LETTER Y WITH TILDE
+\setXTXcharcodes "01F00 "01F00 "01F08 % GREEK SMALL LETTER ALPHA WITH PSILI
+\setXTXcharcodes "01F01 "01F01 "01F09 % GREEK SMALL LETTER ALPHA WITH DASIA
+\setXTXcharcodes "01F02 "01F02 "01F0A % GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+\setXTXcharcodes "01F03 "01F03 "01F0B % GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+\setXTXcharcodes "01F04 "01F04 "01F0C % GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+\setXTXcharcodes "01F05 "01F05 "01F0D % GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+\setXTXcharcodes "01F06 "01F06 "01F0E % GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F07 "01F07 "01F0F % GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F08 "01F00 "01F08 % GREEK CAPITAL LETTER ALPHA WITH PSILI
+\setXTXcharcodes "01F09 "01F01 "01F09 % GREEK CAPITAL LETTER ALPHA WITH DASIA
+\setXTXcharcodes "01F0A "01F02 "01F0A % GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+\setXTXcharcodes "01F0B "01F03 "01F0B % GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+\setXTXcharcodes "01F0C "01F04 "01F0C % GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+\setXTXcharcodes "01F0D "01F05 "01F0D % GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+\setXTXcharcodes "01F0E "01F06 "01F0E % GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F0F "01F07 "01F0F % GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F10 "01F10 "01F18 % GREEK SMALL LETTER EPSILON WITH PSILI
+\setXTXcharcodes "01F11 "01F11 "01F19 % GREEK SMALL LETTER EPSILON WITH DASIA
+\setXTXcharcodes "01F12 "01F12 "01F1A % GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+\setXTXcharcodes "01F13 "01F13 "01F1B % GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+\setXTXcharcodes "01F14 "01F14 "01F1C % GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+\setXTXcharcodes "01F15 "01F15 "01F1D % GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+\setXTXcharcodes "01F18 "01F10 "01F18 % GREEK CAPITAL LETTER EPSILON WITH PSILI
+\setXTXcharcodes "01F19 "01F11 "01F19 % GREEK CAPITAL LETTER EPSILON WITH DASIA
+\setXTXcharcodes "01F1A "01F12 "01F1A % GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+\setXTXcharcodes "01F1B "01F13 "01F1B % GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+\setXTXcharcodes "01F1C "01F14 "01F1C % GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+\setXTXcharcodes "01F1D "01F15 "01F1D % GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+\setXTXcharcodes "01F20 "01F20 "01F28 % GREEK SMALL LETTER ETA WITH PSILI
+\setXTXcharcodes "01F21 "01F21 "01F29 % GREEK SMALL LETTER ETA WITH DASIA
+\setXTXcharcodes "01F22 "01F22 "01F2A % GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+\setXTXcharcodes "01F23 "01F23 "01F2B % GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+\setXTXcharcodes "01F24 "01F24 "01F2C % GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+\setXTXcharcodes "01F25 "01F25 "01F2D % GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+\setXTXcharcodes "01F26 "01F26 "01F2E % GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F27 "01F27 "01F2F % GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F28 "01F20 "01F28 % GREEK CAPITAL LETTER ETA WITH PSILI
+\setXTXcharcodes "01F29 "01F21 "01F29 % GREEK CAPITAL LETTER ETA WITH DASIA
+\setXTXcharcodes "01F2A "01F22 "01F2A % GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+\setXTXcharcodes "01F2B "01F23 "01F2B % GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+\setXTXcharcodes "01F2C "01F24 "01F2C % GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+\setXTXcharcodes "01F2D "01F25 "01F2D % GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+\setXTXcharcodes "01F2E "01F26 "01F2E % GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F2F "01F27 "01F2F % GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F30 "01F30 "01F38 % GREEK SMALL LETTER IOTA WITH PSILI
+\setXTXcharcodes "01F31 "01F31 "01F39 % GREEK SMALL LETTER IOTA WITH DASIA
+\setXTXcharcodes "01F32 "01F32 "01F3A % GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+\setXTXcharcodes "01F33 "01F33 "01F3B % GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+\setXTXcharcodes "01F34 "01F34 "01F3C % GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+\setXTXcharcodes "01F35 "01F35 "01F3D % GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+\setXTXcharcodes "01F36 "01F36 "01F3E % GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F37 "01F37 "01F3F % GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F38 "01F30 "01F38 % GREEK CAPITAL LETTER IOTA WITH PSILI
+\setXTXcharcodes "01F39 "01F31 "01F39 % GREEK CAPITAL LETTER IOTA WITH DASIA
+\setXTXcharcodes "01F3A "01F32 "01F3A % GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+\setXTXcharcodes "01F3B "01F33 "01F3B % GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+\setXTXcharcodes "01F3C "01F34 "01F3C % GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+\setXTXcharcodes "01F3D "01F35 "01F3D % GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+\setXTXcharcodes "01F3E "01F36 "01F3E % GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F3F "01F37 "01F3F % GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F40 "01F40 "01F48 % GREEK SMALL LETTER OMICRON WITH PSILI
+\setXTXcharcodes "01F41 "01F41 "01F49 % GREEK SMALL LETTER OMICRON WITH DASIA
+\setXTXcharcodes "01F42 "01F42 "01F4A % GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+\setXTXcharcodes "01F43 "01F43 "01F4B % GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+\setXTXcharcodes "01F44 "01F44 "01F4C % GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+\setXTXcharcodes "01F45 "01F45 "01F4D % GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+\setXTXcharcodes "01F48 "01F40 "01F48 % GREEK CAPITAL LETTER OMICRON WITH PSILI
+\setXTXcharcodes "01F49 "01F41 "01F49 % GREEK CAPITAL LETTER OMICRON WITH DASIA
+\setXTXcharcodes "01F4A "01F42 "01F4A % GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+\setXTXcharcodes "01F4B "01F43 "01F4B % GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+\setXTXcharcodes "01F4C "01F44 "01F4C % GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+\setXTXcharcodes "01F4D "01F45 "01F4D % GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+\setXTXcharcodes "01F50 "01F50 "01F50 % GREEK SMALL LETTER UPSILON WITH PSILI
+\setXTXcharcodes "01F51 "01F51 "01F59 % GREEK SMALL LETTER UPSILON WITH DASIA
+\setXTXcharcodes "01F52 "01F52 "01F52 % GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+\setXTXcharcodes "01F53 "01F53 "01F5B % GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+\setXTXcharcodes "01F54 "01F54 "01F54 % GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+\setXTXcharcodes "01F55 "01F55 "01F5D % GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+\setXTXcharcodes "01F56 "01F56 "01F56 % GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F57 "01F57 "01F5F % GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F59 "01F51 "01F59 % GREEK CAPITAL LETTER UPSILON WITH DASIA
+\setXTXcharcodes "01F5B "01F53 "01F5B % GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+\setXTXcharcodes "01F5D "01F55 "01F5D % GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+\setXTXcharcodes "01F5F "01F57 "01F5F % GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F60 "01F60 "01F68 % GREEK SMALL LETTER OMEGA WITH PSILI
+\setXTXcharcodes "01F61 "01F61 "01F69 % GREEK SMALL LETTER OMEGA WITH DASIA
+\setXTXcharcodes "01F62 "01F62 "01F6A % GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+\setXTXcharcodes "01F63 "01F63 "01F6B % GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+\setXTXcharcodes "01F64 "01F64 "01F6C % GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+\setXTXcharcodes "01F65 "01F65 "01F6D % GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+\setXTXcharcodes "01F66 "01F66 "01F6E % GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F67 "01F67 "01F6F % GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F68 "01F60 "01F68 % GREEK CAPITAL LETTER OMEGA WITH PSILI
+\setXTXcharcodes "01F69 "01F61 "01F69 % GREEK CAPITAL LETTER OMEGA WITH DASIA
+\setXTXcharcodes "01F6A "01F62 "01F6A % GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+\setXTXcharcodes "01F6B "01F63 "01F6B % GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+\setXTXcharcodes "01F6C "01F64 "01F6C % GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+\setXTXcharcodes "01F6D "01F65 "01F6D % GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+\setXTXcharcodes "01F6E "01F66 "01F6E % GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+\setXTXcharcodes "01F6F "01F67 "01F6F % GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+\setXTXcharcodes "01F70 "01F70 "01FBA % GREEK SMALL LETTER ALPHA WITH VARIA
+\setXTXcharcodes "01F71 "01F71 "01FBB % GREEK SMALL LETTER ALPHA WITH OXIA
+\setXTXcharcodes "01F72 "01F72 "01FC8 % GREEK SMALL LETTER EPSILON WITH VARIA
+\setXTXcharcodes "01F73 "01F73 "01FC9 % GREEK SMALL LETTER EPSILON WITH OXIA
+\setXTXcharcodes "01F74 "01F74 "01FCA % GREEK SMALL LETTER ETA WITH VARIA
+\setXTXcharcodes "01F75 "01F75 "01FCB % GREEK SMALL LETTER ETA WITH OXIA
+\setXTXcharcodes "01F76 "01F76 "01FDA % GREEK SMALL LETTER IOTA WITH VARIA
+\setXTXcharcodes "01F77 "01F77 "01FDB % GREEK SMALL LETTER IOTA WITH OXIA
+\setXTXcharcodes "01F78 "01F78 "01FF8 % GREEK SMALL LETTER OMICRON WITH VARIA
+\setXTXcharcodes "01F79 "01F79 "01FF9 % GREEK SMALL LETTER OMICRON WITH OXIA
+\setXTXcharcodes "01F7A "01F7A "01FEA % GREEK SMALL LETTER UPSILON WITH VARIA
+\setXTXcharcodes "01F7B "01F7B "01FEB % GREEK SMALL LETTER UPSILON WITH OXIA
+\setXTXcharcodes "01F7C "01F7C "01FFA % GREEK SMALL LETTER OMEGA WITH VARIA
+\setXTXcharcodes "01F7D "01F7D "01FFB % GREEK SMALL LETTER OMEGA WITH OXIA
+\setXTXcharcodes "01F80 "01F80 "01F88 % GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+\setXTXcharcodes "01F81 "01F81 "01F89 % GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F82 "01F82 "01F8A % GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F83 "01F83 "01F8B % GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F84 "01F84 "01F8C % GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F85 "01F85 "01F8D % GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F86 "01F86 "01F8E % GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01F87 "01F87 "01F8F % GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01F88 "01F80 "01F88 % GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+\setXTXcharcodes "01F89 "01F81 "01F89 % GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F8A "01F82 "01F8A % GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F8B "01F83 "01F8B % GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F8C "01F84 "01F8C % GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F8D "01F85 "01F8D % GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F8E "01F86 "01F8E % GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+\setXTXcharcodes "01F8F "01F87 "01F8F % GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+\setXTXcharcodes "01F90 "01F90 "01F98 % GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+\setXTXcharcodes "01F91 "01F91 "01F99 % GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F92 "01F92 "01F9A % GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F93 "01F93 "01F9B % GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F94 "01F94 "01F9C % GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F95 "01F95 "01F9D % GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01F96 "01F96 "01F9E % GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01F97 "01F97 "01F9F % GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01F98 "01F90 "01F98 % GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+\setXTXcharcodes "01F99 "01F91 "01F99 % GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F9A "01F92 "01F9A % GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F9B "01F93 "01F9B % GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F9C "01F94 "01F9C % GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F9D "01F95 "01F9D % GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01F9E "01F96 "01F9E % GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+\setXTXcharcodes "01F9F "01F97 "01F9F % GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+\setXTXcharcodes "01FA0 "01FA0 "01FA8 % GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA1 "01FA1 "01FA9 % GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA2 "01FA2 "01FAA % GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA3 "01FA3 "01FAB % GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA4 "01FA4 "01FAC % GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA5 "01FA5 "01FAD % GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA6 "01FA6 "01FAE % GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA7 "01FA7 "01FAF % GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01FA8 "01FA0 "01FA8 % GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+\setXTXcharcodes "01FA9 "01FA1 "01FA9 % GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01FAA "01FA2 "01FAA % GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01FAB "01FA3 "01FAB % GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01FAC "01FA4 "01FAC % GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01FAD "01FA5 "01FAD % GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+\setXTXcharcodes "01FAE "01FA6 "01FAE % GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+\setXTXcharcodes "01FAF "01FA7 "01FAF % GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+\setXTXcharcodes "01FB0 "01FB0 "01FB8 % GREEK SMALL LETTER ALPHA WITH VRACHY
+\setXTXcharcodes "01FB1 "01FB1 "01FB9 % GREEK SMALL LETTER ALPHA WITH MACRON
+\setXTXcharcodes "01FB2 "01FB2 "01FB2 % GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FB3 "01FB3 "01FBC % GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+\setXTXcharcodes "01FB4 "01FB4 "01FB4 % GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FB6 "01FB6 "01FB6 % GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+\setXTXcharcodes "01FB7 "01FB7 "01FB7 % GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01FB8 "01FB0 "01FB8 % GREEK CAPITAL LETTER ALPHA WITH VRACHY
+\setXTXcharcodes "01FB9 "01FB1 "01FB9 % GREEK CAPITAL LETTER ALPHA WITH MACRON
+\setXTXcharcodes "01FBA "01F70 "01FBA % GREEK CAPITAL LETTER ALPHA WITH VARIA
+\setXTXcharcodes "01FBB "01F71 "01FBB % GREEK CAPITAL LETTER ALPHA WITH OXIA
+\setXTXcharcodes "01FBC "01FB3 "01FBC % GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+\setXTXcharcodes "01FBE "01FBE "00399 % GREEK PROSGEGRAMMENI
+\setXTXcharcodes "01FC2 "01FC2 "01FC2 % GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FC3 "01FC3 "01FCC % GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+\setXTXcharcodes "01FC4 "01FC4 "01FC4 % GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FC6 "01FC6 "01FC6 % GREEK SMALL LETTER ETA WITH PERISPOMENI
+\setXTXcharcodes "01FC7 "01FC7 "01FC7 % GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01FC8 "01F72 "01FC8 % GREEK CAPITAL LETTER EPSILON WITH VARIA
+\setXTXcharcodes "01FC9 "01F73 "01FC9 % GREEK CAPITAL LETTER EPSILON WITH OXIA
+\setXTXcharcodes "01FCA "01F74 "01FCA % GREEK CAPITAL LETTER ETA WITH VARIA
+\setXTXcharcodes "01FCB "01F75 "01FCB % GREEK CAPITAL LETTER ETA WITH OXIA
+\setXTXcharcodes "01FCC "01FC3 "01FCC % GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+\setXTXcharcodes "01FD0 "01FD0 "01FD8 % GREEK SMALL LETTER IOTA WITH VRACHY
+\setXTXcharcodes "01FD1 "01FD1 "01FD9 % GREEK SMALL LETTER IOTA WITH MACRON
+\setXTXcharcodes "01FD2 "01FD2 "01FD2 % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+\setXTXcharcodes "01FD3 "01FD3 "01FD3 % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+\setXTXcharcodes "01FD6 "01FD6 "01FD6 % GREEK SMALL LETTER IOTA WITH PERISPOMENI
+\setXTXcharcodes "01FD7 "01FD7 "01FD7 % GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+\setXTXcharcodes "01FD8 "01FD0 "01FD8 % GREEK CAPITAL LETTER IOTA WITH VRACHY
+\setXTXcharcodes "01FD9 "01FD1 "01FD9 % GREEK CAPITAL LETTER IOTA WITH MACRON
+\setXTXcharcodes "01FDA "01F76 "01FDA % GREEK CAPITAL LETTER IOTA WITH VARIA
+\setXTXcharcodes "01FDB "01F77 "01FDB % GREEK CAPITAL LETTER IOTA WITH OXIA
+\setXTXcharcodes "01FE0 "01FE0 "01FE8 % GREEK SMALL LETTER UPSILON WITH VRACHY
+\setXTXcharcodes "01FE1 "01FE1 "01FE9 % GREEK SMALL LETTER UPSILON WITH MACRON
+\setXTXcharcodes "01FE2 "01FE2 "01FE2 % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+\setXTXcharcodes "01FE3 "01FE3 "01FE3 % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+\setXTXcharcodes "01FE4 "01FE4 "01FE4 % GREEK SMALL LETTER RHO WITH PSILI
+\setXTXcharcodes "01FE5 "01FE5 "01FEC % GREEK SMALL LETTER RHO WITH DASIA
+\setXTXcharcodes "01FE6 "01FE6 "01FE6 % GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+\setXTXcharcodes "01FE7 "01FE7 "01FE7 % GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+\setXTXcharcodes "01FE8 "01FE0 "01FE8 % GREEK CAPITAL LETTER UPSILON WITH VRACHY
+\setXTXcharcodes "01FE9 "01FE1 "01FE9 % GREEK CAPITAL LETTER UPSILON WITH MACRON
+\setXTXcharcodes "01FEA "01F7A "01FEA % GREEK CAPITAL LETTER UPSILON WITH VARIA
+\setXTXcharcodes "01FEB "01F7B "01FEB % GREEK CAPITAL LETTER UPSILON WITH OXIA
+\setXTXcharcodes "01FEC "01FE5 "01FEC % GREEK CAPITAL LETTER RHO WITH DASIA
+\setXTXcharcodes "01FF2 "01FF2 "01FF2 % GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FF3 "01FF3 "01FFC % GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+\setXTXcharcodes "01FF4 "01FF4 "01FF4 % GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+\setXTXcharcodes "01FF6 "01FF6 "01FF6 % GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+\setXTXcharcodes "01FF7 "01FF7 "01FF7 % GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+\setXTXcharcodes "01FF8 "01F78 "01FF8 % GREEK CAPITAL LETTER OMICRON WITH VARIA
+\setXTXcharcodes "01FF9 "01F79 "01FF9 % GREEK CAPITAL LETTER OMICRON WITH OXIA
+\setXTXcharcodes "01FFA "01F7C "01FFA % GREEK CAPITAL LETTER OMEGA WITH VARIA
+\setXTXcharcodes "01FFB "01F7D "01FFB % GREEK CAPITAL LETTER OMEGA WITH OXIA
+\setXTXcharcodes "01FFC "01FF3 "01FFC % GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+\setXTXcharcodes "02071 "02071 "02071 % SUPERSCRIPT LATIN SMALL LETTER I
+\setXTXcharcodes "0207F "0207F "0207F % SUPERSCRIPT LATIN SMALL LETTER N
+\setXTXcharcodes "02102 "02102 "02102 % DOUBLE-STRUCK CAPITAL C
+\setXTXcharcodes "02107 "02107 "02107 % EULER CONSTANT
+\setXTXcharcodes "0210A "0210A "0210A % SCRIPT SMALL G
+\setXTXcharcodes "0210B "0210B "0210B % SCRIPT CAPITAL H
+\setXTXcharcodes "0210C "0210C "0210C % BLACK-LETTER CAPITAL H
+\setXTXcharcodes "0210D "0210D "0210D % DOUBLE-STRUCK CAPITAL H
+\setXTXcharcodes "0210E "0210E "0210E % PLANCK CONSTANT
+\setXTXcharcodes "0210F "0210F "0210F % PLANCK CONSTANT OVER TWO PI
+\setXTXcharcodes "02110 "02110 "02110 % SCRIPT CAPITAL I
+\setXTXcharcodes "02111 "02111 "02111 % BLACK-LETTER CAPITAL I
+\setXTXcharcodes "02112 "02112 "02112 % SCRIPT CAPITAL L
+\setXTXcharcodes "02113 "02113 "02113 % SCRIPT SMALL L
+\setXTXcharcodes "02115 "02115 "02115 % DOUBLE-STRUCK CAPITAL N
+\setXTXcharcodes "02119 "02119 "02119 % DOUBLE-STRUCK CAPITAL P
+\setXTXcharcodes "0211A "0211A "0211A % DOUBLE-STRUCK CAPITAL Q
+\setXTXcharcodes "0211B "0211B "0211B % SCRIPT CAPITAL R
+\setXTXcharcodes "0211C "0211C "0211C % BLACK-LETTER CAPITAL R
+\setXTXcharcodes "0211D "0211D "0211D % DOUBLE-STRUCK CAPITAL R
+\setXTXcharcodes "02124 "02124 "02124 % DOUBLE-STRUCK CAPITAL Z
+\setXTXcharcodes "02126 "003C9 "02126 % OHM SIGN
+\setXTXcharcodes "02128 "02128 "02128 % BLACK-LETTER CAPITAL Z
+\setXTXcharcodes "0212A "0006B "0212A % KELVIN SIGN
+\setXTXcharcodes "0212B "000E5 "0212B % ANGSTROM SIGN
+\setXTXcharcodes "0212C "0212C "0212C % SCRIPT CAPITAL B
+\setXTXcharcodes "0212D "0212D "0212D % BLACK-LETTER CAPITAL C
+\setXTXcharcodes "0212F "0212F "0212F % SCRIPT SMALL E
+\setXTXcharcodes "02130 "02130 "02130 % SCRIPT CAPITAL E
+\setXTXcharcodes "02131 "02131 "02131 % SCRIPT CAPITAL F
+\setXTXcharcodes "02132 "0214E "02132 % TURNED CAPITAL F
+\setXTXcharcodes "02133 "02133 "02133 % SCRIPT CAPITAL M
+\setXTXcharcodes "02134 "02134 "02134 % SCRIPT SMALL O
+\setXTXcharcodes "02139 "02139 "02139 % INFORMATION SOURCE
+\setXTXcharcodes "0213C "0213C "0213C % DOUBLE-STRUCK SMALL PI
+\setXTXcharcodes "0213D "0213D "0213D % DOUBLE-STRUCK SMALL GAMMA
+\setXTXcharcodes "0213E "0213E "0213E % DOUBLE-STRUCK CAPITAL GAMMA
+\setXTXcharcodes "0213F "0213F "0213F % DOUBLE-STRUCK CAPITAL PI
+\setXTXcharcodes "02145 "02145 "02145 % DOUBLE-STRUCK ITALIC CAPITAL D
+\setXTXcharcodes "02146 "02146 "02146 % DOUBLE-STRUCK ITALIC SMALL D
+\setXTXcharcodes "02147 "02147 "02147 % DOUBLE-STRUCK ITALIC SMALL E
+\setXTXcharcodes "02148 "02148 "02148 % DOUBLE-STRUCK ITALIC SMALL I
+\setXTXcharcodes "02149 "02149 "02149 % DOUBLE-STRUCK ITALIC SMALL J
+\setXTXcharcodes "0214E "0214E "02132 % TURNED SMALL F
+\setXTXcharcodes "02183 "02184 "02183 % ROMAN NUMERAL REVERSED ONE HUNDRED
+\setXTXcharcodes "02184 "02184 "02183 % LATIN SMALL LETTER REVERSED C
+\setXTXcharcodes "02C00 "02C30 "02C00 % GLAGOLITIC CAPITAL LETTER AZU
+\setXTXcharcodes "02C01 "02C31 "02C01 % GLAGOLITIC CAPITAL LETTER BUKY
+\setXTXcharcodes "02C02 "02C32 "02C02 % GLAGOLITIC CAPITAL LETTER VEDE
+\setXTXcharcodes "02C03 "02C33 "02C03 % GLAGOLITIC CAPITAL LETTER GLAGOLI
+\setXTXcharcodes "02C04 "02C34 "02C04 % GLAGOLITIC CAPITAL LETTER DOBRO
+\setXTXcharcodes "02C05 "02C35 "02C05 % GLAGOLITIC CAPITAL LETTER YESTU
+\setXTXcharcodes "02C06 "02C36 "02C06 % GLAGOLITIC CAPITAL LETTER ZHIVETE
+\setXTXcharcodes "02C07 "02C37 "02C07 % GLAGOLITIC CAPITAL LETTER DZELO
+\setXTXcharcodes "02C08 "02C38 "02C08 % GLAGOLITIC CAPITAL LETTER ZEMLJA
+\setXTXcharcodes "02C09 "02C39 "02C09 % GLAGOLITIC CAPITAL LETTER IZHE
+\setXTXcharcodes "02C0A "02C3A "02C0A % GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+\setXTXcharcodes "02C0B "02C3B "02C0B % GLAGOLITIC CAPITAL LETTER I
+\setXTXcharcodes "02C0C "02C3C "02C0C % GLAGOLITIC CAPITAL LETTER DJERVI
+\setXTXcharcodes "02C0D "02C3D "02C0D % GLAGOLITIC CAPITAL LETTER KAKO
+\setXTXcharcodes "02C0E "02C3E "02C0E % GLAGOLITIC CAPITAL LETTER LJUDIJE
+\setXTXcharcodes "02C0F "02C3F "02C0F % GLAGOLITIC CAPITAL LETTER MYSLITE
+\setXTXcharcodes "02C10 "02C40 "02C10 % GLAGOLITIC CAPITAL LETTER NASHI
+\setXTXcharcodes "02C11 "02C41 "02C11 % GLAGOLITIC CAPITAL LETTER ONU
+\setXTXcharcodes "02C12 "02C42 "02C12 % GLAGOLITIC CAPITAL LETTER POKOJI
+\setXTXcharcodes "02C13 "02C43 "02C13 % GLAGOLITIC CAPITAL LETTER RITSI
+\setXTXcharcodes "02C14 "02C44 "02C14 % GLAGOLITIC CAPITAL LETTER SLOVO
+\setXTXcharcodes "02C15 "02C45 "02C15 % GLAGOLITIC CAPITAL LETTER TVRIDO
+\setXTXcharcodes "02C16 "02C46 "02C16 % GLAGOLITIC CAPITAL LETTER UKU
+\setXTXcharcodes "02C17 "02C47 "02C17 % GLAGOLITIC CAPITAL LETTER FRITU
+\setXTXcharcodes "02C18 "02C48 "02C18 % GLAGOLITIC CAPITAL LETTER HERU
+\setXTXcharcodes "02C19 "02C49 "02C19 % GLAGOLITIC CAPITAL LETTER OTU
+\setXTXcharcodes "02C1A "02C4A "02C1A % GLAGOLITIC CAPITAL LETTER PE
+\setXTXcharcodes "02C1B "02C4B "02C1B % GLAGOLITIC CAPITAL LETTER SHTA
+\setXTXcharcodes "02C1C "02C4C "02C1C % GLAGOLITIC CAPITAL LETTER TSI
+\setXTXcharcodes "02C1D "02C4D "02C1D % GLAGOLITIC CAPITAL LETTER CHRIVI
+\setXTXcharcodes "02C1E "02C4E "02C1E % GLAGOLITIC CAPITAL LETTER SHA
+\setXTXcharcodes "02C1F "02C4F "02C1F % GLAGOLITIC CAPITAL LETTER YERU
+\setXTXcharcodes "02C20 "02C50 "02C20 % GLAGOLITIC CAPITAL LETTER YERI
+\setXTXcharcodes "02C21 "02C51 "02C21 % GLAGOLITIC CAPITAL LETTER YATI
+\setXTXcharcodes "02C22 "02C52 "02C22 % GLAGOLITIC CAPITAL LETTER SPIDERY HA
+\setXTXcharcodes "02C23 "02C53 "02C23 % GLAGOLITIC CAPITAL LETTER YU
+\setXTXcharcodes "02C24 "02C54 "02C24 % GLAGOLITIC CAPITAL LETTER SMALL YUS
+\setXTXcharcodes "02C25 "02C55 "02C25 % GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+\setXTXcharcodes "02C26 "02C56 "02C26 % GLAGOLITIC CAPITAL LETTER YO
+\setXTXcharcodes "02C27 "02C57 "02C27 % GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+\setXTXcharcodes "02C28 "02C58 "02C28 % GLAGOLITIC CAPITAL LETTER BIG YUS
+\setXTXcharcodes "02C29 "02C59 "02C29 % GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+\setXTXcharcodes "02C2A "02C5A "02C2A % GLAGOLITIC CAPITAL LETTER FITA
+\setXTXcharcodes "02C2B "02C5B "02C2B % GLAGOLITIC CAPITAL LETTER IZHITSA
+\setXTXcharcodes "02C2C "02C5C "02C2C % GLAGOLITIC CAPITAL LETTER SHTAPIC
+\setXTXcharcodes "02C2D "02C5D "02C2D % GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+\setXTXcharcodes "02C2E "02C5E "02C2E % GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+\setXTXcharcodes "02C30 "02C30 "02C00 % GLAGOLITIC SMALL LETTER AZU
+\setXTXcharcodes "02C31 "02C31 "02C01 % GLAGOLITIC SMALL LETTER BUKY
+\setXTXcharcodes "02C32 "02C32 "02C02 % GLAGOLITIC SMALL LETTER VEDE
+\setXTXcharcodes "02C33 "02C33 "02C03 % GLAGOLITIC SMALL LETTER GLAGOLI
+\setXTXcharcodes "02C34 "02C34 "02C04 % GLAGOLITIC SMALL LETTER DOBRO
+\setXTXcharcodes "02C35 "02C35 "02C05 % GLAGOLITIC SMALL LETTER YESTU
+\setXTXcharcodes "02C36 "02C36 "02C06 % GLAGOLITIC SMALL LETTER ZHIVETE
+\setXTXcharcodes "02C37 "02C37 "02C07 % GLAGOLITIC SMALL LETTER DZELO
+\setXTXcharcodes "02C38 "02C38 "02C08 % GLAGOLITIC SMALL LETTER ZEMLJA
+\setXTXcharcodes "02C39 "02C39 "02C09 % GLAGOLITIC SMALL LETTER IZHE
+\setXTXcharcodes "02C3A "02C3A "02C0A % GLAGOLITIC SMALL LETTER INITIAL IZHE
+\setXTXcharcodes "02C3B "02C3B "02C0B % GLAGOLITIC SMALL LETTER I
+\setXTXcharcodes "02C3C "02C3C "02C0C % GLAGOLITIC SMALL LETTER DJERVI
+\setXTXcharcodes "02C3D "02C3D "02C0D % GLAGOLITIC SMALL LETTER KAKO
+\setXTXcharcodes "02C3E "02C3E "02C0E % GLAGOLITIC SMALL LETTER LJUDIJE
+\setXTXcharcodes "02C3F "02C3F "02C0F % GLAGOLITIC SMALL LETTER MYSLITE
+\setXTXcharcodes "02C40 "02C40 "02C10 % GLAGOLITIC SMALL LETTER NASHI
+\setXTXcharcodes "02C41 "02C41 "02C11 % GLAGOLITIC SMALL LETTER ONU
+\setXTXcharcodes "02C42 "02C42 "02C12 % GLAGOLITIC SMALL LETTER POKOJI
+\setXTXcharcodes "02C43 "02C43 "02C13 % GLAGOLITIC SMALL LETTER RITSI
+\setXTXcharcodes "02C44 "02C44 "02C14 % GLAGOLITIC SMALL LETTER SLOVO
+\setXTXcharcodes "02C45 "02C45 "02C15 % GLAGOLITIC SMALL LETTER TVRIDO
+\setXTXcharcodes "02C46 "02C46 "02C16 % GLAGOLITIC SMALL LETTER UKU
+\setXTXcharcodes "02C47 "02C47 "02C17 % GLAGOLITIC SMALL LETTER FRITU
+\setXTXcharcodes "02C48 "02C48 "02C18 % GLAGOLITIC SMALL LETTER HERU
+\setXTXcharcodes "02C49 "02C49 "02C19 % GLAGOLITIC SMALL LETTER OTU
+\setXTXcharcodes "02C4A "02C4A "02C1A % GLAGOLITIC SMALL LETTER PE
+\setXTXcharcodes "02C4B "02C4B "02C1B % GLAGOLITIC SMALL LETTER SHTA
+\setXTXcharcodes "02C4C "02C4C "02C1C % GLAGOLITIC SMALL LETTER TSI
+\setXTXcharcodes "02C4D "02C4D "02C1D % GLAGOLITIC SMALL LETTER CHRIVI
+\setXTXcharcodes "02C4E "02C4E "02C1E % GLAGOLITIC SMALL LETTER SHA
+\setXTXcharcodes "02C4F "02C4F "02C1F % GLAGOLITIC SMALL LETTER YERU
+\setXTXcharcodes "02C50 "02C50 "02C20 % GLAGOLITIC SMALL LETTER YERI
+\setXTXcharcodes "02C51 "02C51 "02C21 % GLAGOLITIC SMALL LETTER YATI
+\setXTXcharcodes "02C52 "02C52 "02C22 % GLAGOLITIC SMALL LETTER SPIDERY HA
+\setXTXcharcodes "02C53 "02C53 "02C23 % GLAGOLITIC SMALL LETTER YU
+\setXTXcharcodes "02C54 "02C54 "02C24 % GLAGOLITIC SMALL LETTER SMALL YUS
+\setXTXcharcodes "02C55 "02C55 "02C25 % GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+\setXTXcharcodes "02C56 "02C56 "02C26 % GLAGOLITIC SMALL LETTER YO
+\setXTXcharcodes "02C57 "02C57 "02C27 % GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+\setXTXcharcodes "02C58 "02C58 "02C28 % GLAGOLITIC SMALL LETTER BIG YUS
+\setXTXcharcodes "02C59 "02C59 "02C29 % GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+\setXTXcharcodes "02C5A "02C5A "02C2A % GLAGOLITIC SMALL LETTER FITA
+\setXTXcharcodes "02C5B "02C5B "02C2B % GLAGOLITIC SMALL LETTER IZHITSA
+\setXTXcharcodes "02C5C "02C5C "02C2C % GLAGOLITIC SMALL LETTER SHTAPIC
+\setXTXcharcodes "02C5D "02C5D "02C2D % GLAGOLITIC SMALL LETTER TROKUTASTI A
+\setXTXcharcodes "02C5E "02C5E "02C2E % GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+\setXTXcharcodes "02C60 "02C61 "02C60 % LATIN CAPITAL LETTER L WITH DOUBLE BAR
+\setXTXcharcodes "02C61 "02C61 "02C60 % LATIN SMALL LETTER L WITH DOUBLE BAR
+\setXTXcharcodes "02C62 "0026B "02C62 % LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+\setXTXcharcodes "02C63 "01D7D "02C63 % LATIN CAPITAL LETTER P WITH STROKE
+\setXTXcharcodes "02C64 "0027D "02C64 % LATIN CAPITAL LETTER R WITH TAIL
+\setXTXcharcodes "02C65 "02C65 "0023A % LATIN SMALL LETTER A WITH STROKE
+\setXTXcharcodes "02C66 "02C66 "0023E % LATIN SMALL LETTER T WITH DIAGONAL STROKE
+\setXTXcharcodes "02C67 "02C68 "02C67 % LATIN CAPITAL LETTER H WITH DESCENDER
+\setXTXcharcodes "02C68 "02C68 "02C67 % LATIN SMALL LETTER H WITH DESCENDER
+\setXTXcharcodes "02C69 "02C6A "02C69 % LATIN CAPITAL LETTER K WITH DESCENDER
+\setXTXcharcodes "02C6A "02C6A "02C69 % LATIN SMALL LETTER K WITH DESCENDER
+\setXTXcharcodes "02C6B "02C6C "02C6B % LATIN CAPITAL LETTER Z WITH DESCENDER
+\setXTXcharcodes "02C6C "02C6C "02C6B % LATIN SMALL LETTER Z WITH DESCENDER
+\setXTXcharcodes "02C74 "02C74 "02C74 % LATIN SMALL LETTER V WITH CURL
+\setXTXcharcodes "02C75 "02C76 "02C75 % LATIN CAPITAL LETTER HALF H
+\setXTXcharcodes "02C76 "02C76 "02C75 % LATIN SMALL LETTER HALF H
+\setXTXcharcodes "02C77 "02C77 "02C77 % LATIN SMALL LETTER TAILLESS PHI
+\setXTXcharcodes "02C80 "02C81 "02C80 % COPTIC CAPITAL LETTER ALFA
+\setXTXcharcodes "02C81 "02C81 "02C80 % COPTIC SMALL LETTER ALFA
+\setXTXcharcodes "02C82 "02C83 "02C82 % COPTIC CAPITAL LETTER VIDA
+\setXTXcharcodes "02C83 "02C83 "02C82 % COPTIC SMALL LETTER VIDA
+\setXTXcharcodes "02C84 "02C85 "02C84 % COPTIC CAPITAL LETTER GAMMA
+\setXTXcharcodes "02C85 "02C85 "02C84 % COPTIC SMALL LETTER GAMMA
+\setXTXcharcodes "02C86 "02C87 "02C86 % COPTIC CAPITAL LETTER DALDA
+\setXTXcharcodes "02C87 "02C87 "02C86 % COPTIC SMALL LETTER DALDA
+\setXTXcharcodes "02C88 "02C89 "02C88 % COPTIC CAPITAL LETTER EIE
+\setXTXcharcodes "02C89 "02C89 "02C88 % COPTIC SMALL LETTER EIE
+\setXTXcharcodes "02C8A "02C8B "02C8A % COPTIC CAPITAL LETTER SOU
+\setXTXcharcodes "02C8B "02C8B "02C8A % COPTIC SMALL LETTER SOU
+\setXTXcharcodes "02C8C "02C8D "02C8C % COPTIC CAPITAL LETTER ZATA
+\setXTXcharcodes "02C8D "02C8D "02C8C % COPTIC SMALL LETTER ZATA
+\setXTXcharcodes "02C8E "02C8F "02C8E % COPTIC CAPITAL LETTER HATE
+\setXTXcharcodes "02C8F "02C8F "02C8E % COPTIC SMALL LETTER HATE
+\setXTXcharcodes "02C90 "02C91 "02C90 % COPTIC CAPITAL LETTER THETHE
+\setXTXcharcodes "02C91 "02C91 "02C90 % COPTIC SMALL LETTER THETHE
+\setXTXcharcodes "02C92 "02C93 "02C92 % COPTIC CAPITAL LETTER IAUDA
+\setXTXcharcodes "02C93 "02C93 "02C92 % COPTIC SMALL LETTER IAUDA
+\setXTXcharcodes "02C94 "02C95 "02C94 % COPTIC CAPITAL LETTER KAPA
+\setXTXcharcodes "02C95 "02C95 "02C94 % COPTIC SMALL LETTER KAPA
+\setXTXcharcodes "02C96 "02C97 "02C96 % COPTIC CAPITAL LETTER LAULA
+\setXTXcharcodes "02C97 "02C97 "02C96 % COPTIC SMALL LETTER LAULA
+\setXTXcharcodes "02C98 "02C99 "02C98 % COPTIC CAPITAL LETTER MI
+\setXTXcharcodes "02C99 "02C99 "02C98 % COPTIC SMALL LETTER MI
+\setXTXcharcodes "02C9A "02C9B "02C9A % COPTIC CAPITAL LETTER NI
+\setXTXcharcodes "02C9B "02C9B "02C9A % COPTIC SMALL LETTER NI
+\setXTXcharcodes "02C9C "02C9D "02C9C % COPTIC CAPITAL LETTER KSI
+\setXTXcharcodes "02C9D "02C9D "02C9C % COPTIC SMALL LETTER KSI
+\setXTXcharcodes "02C9E "02C9F "02C9E % COPTIC CAPITAL LETTER O
+\setXTXcharcodes "02C9F "02C9F "02C9E % COPTIC SMALL LETTER O
+\setXTXcharcodes "02CA0 "02CA1 "02CA0 % COPTIC CAPITAL LETTER PI
+\setXTXcharcodes "02CA1 "02CA1 "02CA0 % COPTIC SMALL LETTER PI
+\setXTXcharcodes "02CA2 "02CA3 "02CA2 % COPTIC CAPITAL LETTER RO
+\setXTXcharcodes "02CA3 "02CA3 "02CA2 % COPTIC SMALL LETTER RO
+\setXTXcharcodes "02CA4 "02CA5 "02CA4 % COPTIC CAPITAL LETTER SIMA
+\setXTXcharcodes "02CA5 "02CA5 "02CA4 % COPTIC SMALL LETTER SIMA
+\setXTXcharcodes "02CA6 "02CA7 "02CA6 % COPTIC CAPITAL LETTER TAU
+\setXTXcharcodes "02CA7 "02CA7 "02CA6 % COPTIC SMALL LETTER TAU
+\setXTXcharcodes "02CA8 "02CA9 "02CA8 % COPTIC CAPITAL LETTER UA
+\setXTXcharcodes "02CA9 "02CA9 "02CA8 % COPTIC SMALL LETTER UA
+\setXTXcharcodes "02CAA "02CAB "02CAA % COPTIC CAPITAL LETTER FI
+\setXTXcharcodes "02CAB "02CAB "02CAA % COPTIC SMALL LETTER FI
+\setXTXcharcodes "02CAC "02CAD "02CAC % COPTIC CAPITAL LETTER KHI
+\setXTXcharcodes "02CAD "02CAD "02CAC % COPTIC SMALL LETTER KHI
+\setXTXcharcodes "02CAE "02CAF "02CAE % COPTIC CAPITAL LETTER PSI
+\setXTXcharcodes "02CAF "02CAF "02CAE % COPTIC SMALL LETTER PSI
+\setXTXcharcodes "02CB0 "02CB1 "02CB0 % COPTIC CAPITAL LETTER OOU
+\setXTXcharcodes "02CB1 "02CB1 "02CB0 % COPTIC SMALL LETTER OOU
+\setXTXcharcodes "02CB2 "02CB3 "02CB2 % COPTIC CAPITAL LETTER DIALECT-P ALEF
+\setXTXcharcodes "02CB3 "02CB3 "02CB2 % COPTIC SMALL LETTER DIALECT-P ALEF
+\setXTXcharcodes "02CB4 "02CB5 "02CB4 % COPTIC CAPITAL LETTER OLD COPTIC AIN
+\setXTXcharcodes "02CB5 "02CB5 "02CB4 % COPTIC SMALL LETTER OLD COPTIC AIN
+\setXTXcharcodes "02CB6 "02CB7 "02CB6 % COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+\setXTXcharcodes "02CB7 "02CB7 "02CB6 % COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+\setXTXcharcodes "02CB8 "02CB9 "02CB8 % COPTIC CAPITAL LETTER DIALECT-P KAPA
+\setXTXcharcodes "02CB9 "02CB9 "02CB8 % COPTIC SMALL LETTER DIALECT-P KAPA
+\setXTXcharcodes "02CBA "02CBB "02CBA % COPTIC CAPITAL LETTER DIALECT-P NI
+\setXTXcharcodes "02CBB "02CBB "02CBA % COPTIC SMALL LETTER DIALECT-P NI
+\setXTXcharcodes "02CBC "02CBD "02CBC % COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+\setXTXcharcodes "02CBD "02CBD "02CBC % COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+\setXTXcharcodes "02CBE "02CBF "02CBE % COPTIC CAPITAL LETTER OLD COPTIC OOU
+\setXTXcharcodes "02CBF "02CBF "02CBE % COPTIC SMALL LETTER OLD COPTIC OOU
+\setXTXcharcodes "02CC0 "02CC1 "02CC0 % COPTIC CAPITAL LETTER SAMPI
+\setXTXcharcodes "02CC1 "02CC1 "02CC0 % COPTIC SMALL LETTER SAMPI
+\setXTXcharcodes "02CC2 "02CC3 "02CC2 % COPTIC CAPITAL LETTER CROSSED SHEI
+\setXTXcharcodes "02CC3 "02CC3 "02CC2 % COPTIC SMALL LETTER CROSSED SHEI
+\setXTXcharcodes "02CC4 "02CC5 "02CC4 % COPTIC CAPITAL LETTER OLD COPTIC SHEI
+\setXTXcharcodes "02CC5 "02CC5 "02CC4 % COPTIC SMALL LETTER OLD COPTIC SHEI
+\setXTXcharcodes "02CC6 "02CC7 "02CC6 % COPTIC CAPITAL LETTER OLD COPTIC ESH
+\setXTXcharcodes "02CC7 "02CC7 "02CC6 % COPTIC SMALL LETTER OLD COPTIC ESH
+\setXTXcharcodes "02CC8 "02CC9 "02CC8 % COPTIC CAPITAL LETTER AKHMIMIC KHEI
+\setXTXcharcodes "02CC9 "02CC9 "02CC8 % COPTIC SMALL LETTER AKHMIMIC KHEI
+\setXTXcharcodes "02CCA "02CCB "02CCA % COPTIC CAPITAL LETTER DIALECT-P HORI
+\setXTXcharcodes "02CCB "02CCB "02CCA % COPTIC SMALL LETTER DIALECT-P HORI
+\setXTXcharcodes "02CCC "02CCD "02CCC % COPTIC CAPITAL LETTER OLD COPTIC HORI
+\setXTXcharcodes "02CCD "02CCD "02CCC % COPTIC SMALL LETTER OLD COPTIC HORI
+\setXTXcharcodes "02CCE "02CCF "02CCE % COPTIC CAPITAL LETTER OLD COPTIC HA
+\setXTXcharcodes "02CCF "02CCF "02CCE % COPTIC SMALL LETTER OLD COPTIC HA
+\setXTXcharcodes "02CD0 "02CD1 "02CD0 % COPTIC CAPITAL LETTER L-SHAPED HA
+\setXTXcharcodes "02CD1 "02CD1 "02CD0 % COPTIC SMALL LETTER L-SHAPED HA
+\setXTXcharcodes "02CD2 "02CD3 "02CD2 % COPTIC CAPITAL LETTER OLD COPTIC HEI
+\setXTXcharcodes "02CD3 "02CD3 "02CD2 % COPTIC SMALL LETTER OLD COPTIC HEI
+\setXTXcharcodes "02CD4 "02CD5 "02CD4 % COPTIC CAPITAL LETTER OLD COPTIC HAT
+\setXTXcharcodes "02CD5 "02CD5 "02CD4 % COPTIC SMALL LETTER OLD COPTIC HAT
+\setXTXcharcodes "02CD6 "02CD7 "02CD6 % COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+\setXTXcharcodes "02CD7 "02CD7 "02CD6 % COPTIC SMALL LETTER OLD COPTIC GANGIA
+\setXTXcharcodes "02CD8 "02CD9 "02CD8 % COPTIC CAPITAL LETTER OLD COPTIC DJA
+\setXTXcharcodes "02CD9 "02CD9 "02CD8 % COPTIC SMALL LETTER OLD COPTIC DJA
+\setXTXcharcodes "02CDA "02CDB "02CDA % COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+\setXTXcharcodes "02CDB "02CDB "02CDA % COPTIC SMALL LETTER OLD COPTIC SHIMA
+\setXTXcharcodes "02CDC "02CDD "02CDC % COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+\setXTXcharcodes "02CDD "02CDD "02CDC % COPTIC SMALL LETTER OLD NUBIAN SHIMA
+\setXTXcharcodes "02CDE "02CDF "02CDE % COPTIC CAPITAL LETTER OLD NUBIAN NGI
+\setXTXcharcodes "02CDF "02CDF "02CDE % COPTIC SMALL LETTER OLD NUBIAN NGI
+\setXTXcharcodes "02CE0 "02CE1 "02CE0 % COPTIC CAPITAL LETTER OLD NUBIAN NYI
+\setXTXcharcodes "02CE1 "02CE1 "02CE0 % COPTIC SMALL LETTER OLD NUBIAN NYI
+\setXTXcharcodes "02CE2 "02CE3 "02CE2 % COPTIC CAPITAL LETTER OLD NUBIAN WAU
+\setXTXcharcodes "02CE3 "02CE3 "02CE2 % COPTIC SMALL LETTER OLD NUBIAN WAU
+\setXTXcharcodes "02CE4 "02CE4 "02CE4 % COPTIC SYMBOL KAI
+\setXTXcharcodes "02D00 "02D00 "010A0 % GEORGIAN SMALL LETTER AN
+\setXTXcharcodes "02D01 "02D01 "010A1 % GEORGIAN SMALL LETTER BAN
+\setXTXcharcodes "02D02 "02D02 "010A2 % GEORGIAN SMALL LETTER GAN
+\setXTXcharcodes "02D03 "02D03 "010A3 % GEORGIAN SMALL LETTER DON
+\setXTXcharcodes "02D04 "02D04 "010A4 % GEORGIAN SMALL LETTER EN
+\setXTXcharcodes "02D05 "02D05 "010A5 % GEORGIAN SMALL LETTER VIN
+\setXTXcharcodes "02D06 "02D06 "010A6 % GEORGIAN SMALL LETTER ZEN
+\setXTXcharcodes "02D07 "02D07 "010A7 % GEORGIAN SMALL LETTER TAN
+\setXTXcharcodes "02D08 "02D08 "010A8 % GEORGIAN SMALL LETTER IN
+\setXTXcharcodes "02D09 "02D09 "010A9 % GEORGIAN SMALL LETTER KAN
+\setXTXcharcodes "02D0A "02D0A "010AA % GEORGIAN SMALL LETTER LAS
+\setXTXcharcodes "02D0B "02D0B "010AB % GEORGIAN SMALL LETTER MAN
+\setXTXcharcodes "02D0C "02D0C "010AC % GEORGIAN SMALL LETTER NAR
+\setXTXcharcodes "02D0D "02D0D "010AD % GEORGIAN SMALL LETTER ON
+\setXTXcharcodes "02D0E "02D0E "010AE % GEORGIAN SMALL LETTER PAR
+\setXTXcharcodes "02D0F "02D0F "010AF % GEORGIAN SMALL LETTER ZHAR
+\setXTXcharcodes "02D10 "02D10 "010B0 % GEORGIAN SMALL LETTER RAE
+\setXTXcharcodes "02D11 "02D11 "010B1 % GEORGIAN SMALL LETTER SAN
+\setXTXcharcodes "02D12 "02D12 "010B2 % GEORGIAN SMALL LETTER TAR
+\setXTXcharcodes "02D13 "02D13 "010B3 % GEORGIAN SMALL LETTER UN
+\setXTXcharcodes "02D14 "02D14 "010B4 % GEORGIAN SMALL LETTER PHAR
+\setXTXcharcodes "02D15 "02D15 "010B5 % GEORGIAN SMALL LETTER KHAR
+\setXTXcharcodes "02D16 "02D16 "010B6 % GEORGIAN SMALL LETTER GHAN
+\setXTXcharcodes "02D17 "02D17 "010B7 % GEORGIAN SMALL LETTER QAR
+\setXTXcharcodes "02D18 "02D18 "010B8 % GEORGIAN SMALL LETTER SHIN
+\setXTXcharcodes "02D19 "02D19 "010B9 % GEORGIAN SMALL LETTER CHIN
+\setXTXcharcodes "02D1A "02D1A "010BA % GEORGIAN SMALL LETTER CAN
+\setXTXcharcodes "02D1B "02D1B "010BB % GEORGIAN SMALL LETTER JIL
+\setXTXcharcodes "02D1C "02D1C "010BC % GEORGIAN SMALL LETTER CIL
+\setXTXcharcodes "02D1D "02D1D "010BD % GEORGIAN SMALL LETTER CHAR
+\setXTXcharcodes "02D1E "02D1E "010BE % GEORGIAN SMALL LETTER XAN
+\setXTXcharcodes "02D1F "02D1F "010BF % GEORGIAN SMALL LETTER JHAN
+\setXTXcharcodes "02D20 "02D20 "010C0 % GEORGIAN SMALL LETTER HAE
+\setXTXcharcodes "02D21 "02D21 "010C1 % GEORGIAN SMALL LETTER HE
+\setXTXcharcodes "02D22 "02D22 "010C2 % GEORGIAN SMALL LETTER HIE
+\setXTXcharcodes "02D23 "02D23 "010C3 % GEORGIAN SMALL LETTER WE
+\setXTXcharcodes "02D24 "02D24 "010C4 % GEORGIAN SMALL LETTER HAR
+\setXTXcharcodes "02D25 "02D25 "010C5 % GEORGIAN SMALL LETTER HOE
+\setXTXcharcodes "0FB00 "0FB00 "0FB00 % LATIN SMALL LIGATURE FF
+\setXTXcharcodes "0FB01 "0FB01 "0FB01 % LATIN SMALL LIGATURE FI
+\setXTXcharcodes "0FB02 "0FB02 "0FB02 % LATIN SMALL LIGATURE FL
+\setXTXcharcodes "0FB03 "0FB03 "0FB03 % LATIN SMALL LIGATURE FFI
+\setXTXcharcodes "0FB04 "0FB04 "0FB04 % LATIN SMALL LIGATURE FFL
+\setXTXcharcodes "0FB05 "0FB05 "0FB05 % LATIN SMALL LIGATURE LONG S T
+\setXTXcharcodes "0FB06 "0FB06 "0FB06 % LATIN SMALL LIGATURE ST
+\setXTXcharcodes "0FB13 "0FB13 "0FB13 % ARMENIAN SMALL LIGATURE MEN NOW
+\setXTXcharcodes "0FB14 "0FB14 "0FB14 % ARMENIAN SMALL LIGATURE MEN ECH
+\setXTXcharcodes "0FB15 "0FB15 "0FB15 % ARMENIAN SMALL LIGATURE MEN INI
+\setXTXcharcodes "0FB16 "0FB16 "0FB16 % ARMENIAN SMALL LIGATURE VEW NOW
+\setXTXcharcodes "0FB17 "0FB17 "0FB17 % ARMENIAN SMALL LIGATURE MEN XEH
+\setXTXcharcodes "0FF21 "0FF41 "0FF21 % FULLWIDTH LATIN CAPITAL LETTER A
+\setXTXcharcodes "0FF22 "0FF42 "0FF22 % FULLWIDTH LATIN CAPITAL LETTER B
+\setXTXcharcodes "0FF23 "0FF43 "0FF23 % FULLWIDTH LATIN CAPITAL LETTER C
+\setXTXcharcodes "0FF24 "0FF44 "0FF24 % FULLWIDTH LATIN CAPITAL LETTER D
+\setXTXcharcodes "0FF25 "0FF45 "0FF25 % FULLWIDTH LATIN CAPITAL LETTER E
+\setXTXcharcodes "0FF26 "0FF46 "0FF26 % FULLWIDTH LATIN CAPITAL LETTER F
+\setXTXcharcodes "0FF27 "0FF47 "0FF27 % FULLWIDTH LATIN CAPITAL LETTER G
+\setXTXcharcodes "0FF28 "0FF48 "0FF28 % FULLWIDTH LATIN CAPITAL LETTER H
+\setXTXcharcodes "0FF29 "0FF49 "0FF29 % FULLWIDTH LATIN CAPITAL LETTER I
+\setXTXcharcodes "0FF2A "0FF4A "0FF2A % FULLWIDTH LATIN CAPITAL LETTER J
+\setXTXcharcodes "0FF2B "0FF4B "0FF2B % FULLWIDTH LATIN CAPITAL LETTER K
+\setXTXcharcodes "0FF2C "0FF4C "0FF2C % FULLWIDTH LATIN CAPITAL LETTER L
+\setXTXcharcodes "0FF2D "0FF4D "0FF2D % FULLWIDTH LATIN CAPITAL LETTER M
+\setXTXcharcodes "0FF2E "0FF4E "0FF2E % FULLWIDTH LATIN CAPITAL LETTER N
+\setXTXcharcodes "0FF2F "0FF4F "0FF2F % FULLWIDTH LATIN CAPITAL LETTER O
+\setXTXcharcodes "0FF30 "0FF50 "0FF30 % FULLWIDTH LATIN CAPITAL LETTER P
+\setXTXcharcodes "0FF31 "0FF51 "0FF31 % FULLWIDTH LATIN CAPITAL LETTER Q
+\setXTXcharcodes "0FF32 "0FF52 "0FF32 % FULLWIDTH LATIN CAPITAL LETTER R
+\setXTXcharcodes "0FF33 "0FF53 "0FF33 % FULLWIDTH LATIN CAPITAL LETTER S
+\setXTXcharcodes "0FF34 "0FF54 "0FF34 % FULLWIDTH LATIN CAPITAL LETTER T
+\setXTXcharcodes "0FF35 "0FF55 "0FF35 % FULLWIDTH LATIN CAPITAL LETTER U
+\setXTXcharcodes "0FF36 "0FF56 "0FF36 % FULLWIDTH LATIN CAPITAL LETTER V
+\setXTXcharcodes "0FF37 "0FF57 "0FF37 % FULLWIDTH LATIN CAPITAL LETTER W
+\setXTXcharcodes "0FF38 "0FF58 "0FF38 % FULLWIDTH LATIN CAPITAL LETTER X
+\setXTXcharcodes "0FF39 "0FF59 "0FF39 % FULLWIDTH LATIN CAPITAL LETTER Y
+\setXTXcharcodes "0FF3A "0FF5A "0FF3A % FULLWIDTH LATIN CAPITAL LETTER Z
+\setXTXcharcodes "0FF41 "0FF41 "0FF21 % FULLWIDTH LATIN SMALL LETTER A
+\setXTXcharcodes "0FF42 "0FF42 "0FF22 % FULLWIDTH LATIN SMALL LETTER B
+\setXTXcharcodes "0FF43 "0FF43 "0FF23 % FULLWIDTH LATIN SMALL LETTER C
+\setXTXcharcodes "0FF44 "0FF44 "0FF24 % FULLWIDTH LATIN SMALL LETTER D
+\setXTXcharcodes "0FF45 "0FF45 "0FF25 % FULLWIDTH LATIN SMALL LETTER E
+\setXTXcharcodes "0FF46 "0FF46 "0FF26 % FULLWIDTH LATIN SMALL LETTER F
+\setXTXcharcodes "0FF47 "0FF47 "0FF27 % FULLWIDTH LATIN SMALL LETTER G
+\setXTXcharcodes "0FF48 "0FF48 "0FF28 % FULLWIDTH LATIN SMALL LETTER H
+\setXTXcharcodes "0FF49 "0FF49 "0FF29 % FULLWIDTH LATIN SMALL LETTER I
+\setXTXcharcodes "0FF4A "0FF4A "0FF2A % FULLWIDTH LATIN SMALL LETTER J
+\setXTXcharcodes "0FF4B "0FF4B "0FF2B % FULLWIDTH LATIN SMALL LETTER K
+\setXTXcharcodes "0FF4C "0FF4C "0FF2C % FULLWIDTH LATIN SMALL LETTER L
+\setXTXcharcodes "0FF4D "0FF4D "0FF2D % FULLWIDTH LATIN SMALL LETTER M
+\setXTXcharcodes "0FF4E "0FF4E "0FF2E % FULLWIDTH LATIN SMALL LETTER N
+\setXTXcharcodes "0FF4F "0FF4F "0FF2F % FULLWIDTH LATIN SMALL LETTER O
+\setXTXcharcodes "0FF50 "0FF50 "0FF30 % FULLWIDTH LATIN SMALL LETTER P
+\setXTXcharcodes "0FF51 "0FF51 "0FF31 % FULLWIDTH LATIN SMALL LETTER Q
+\setXTXcharcodes "0FF52 "0FF52 "0FF32 % FULLWIDTH LATIN SMALL LETTER R
+\setXTXcharcodes "0FF53 "0FF53 "0FF33 % FULLWIDTH LATIN SMALL LETTER S
+\setXTXcharcodes "0FF54 "0FF54 "0FF34 % FULLWIDTH LATIN SMALL LETTER T
+\setXTXcharcodes "0FF55 "0FF55 "0FF35 % FULLWIDTH LATIN SMALL LETTER U
+\setXTXcharcodes "0FF56 "0FF56 "0FF36 % FULLWIDTH LATIN SMALL LETTER V
+\setXTXcharcodes "0FF57 "0FF57 "0FF37 % FULLWIDTH LATIN SMALL LETTER W
+\setXTXcharcodes "0FF58 "0FF58 "0FF38 % FULLWIDTH LATIN SMALL LETTER X
+\setXTXcharcodes "0FF59 "0FF59 "0FF39 % FULLWIDTH LATIN SMALL LETTER Y
+\setXTXcharcodes "0FF5A "0FF5A "0FF3A % FULLWIDTH LATIN SMALL LETTER Z
+
+\dofastrecurse{"03400}{"04DB5}{1}{\dosetXTXcharcodes\recurselevel\recurselevel\recurselevel}
+\dofastrecurse{"04E00}{"09FBB}{1}{\dosetXTXcharcodes\recurselevel\recurselevel\recurselevel}
+\dofastrecurse{"0AC00}{"0D7A3}{1}{\dosetXTXcharcodes\recurselevel\recurselevel\recurselevel}
+\dofastrecurse{"20000}{"2A6D6}{1}{\dosetXTXcharcodes\recurselevel\recurselevel\recurselevel}
+
+% patch needed for turkish
+
+\setXTXcharcodes "201C "201C "201C
+\setXTXcharcodes "201D "201D "201D
+
+\endinput
diff --git a/tex/context/base/xtag-cml.tex b/tex/context/base/xtag-cml.tex
new file mode 100644
index 000000000..6da7fd26f
--- /dev/null
+++ b/tex/context/base/xtag-cml.tex
@@ -0,0 +1,228 @@
+% see mathml, == \defineXMLdirective [mathml] \setupMMLappearance
+
+% will be rewritten avoiding the mapper
+
+\useXMLfilter[map]
+
+\unprotect
+
+\def\setupCMLappearance[#1]{\dodoubleargument\getparameters[@@CML#1]}
+
+\defineXMLdirective [chemml] \setupCMLappearance
+
+\defineXMLargument [chem] \doXMLchem
+\defineXMLargument [ichem] \doXMLichem
+\defineXMLargument [dchem] \doXMLdchem
+
+\unexpanded\def\doXMLchem {\ifhmode\@EA\doXMLichem\else\@EA\doXMLdchem\fi}
+\unexpanded\def\doXMLichem{\XMLremapdata[cml]{$\rm}{$}}
+\unexpanded\def\doXMLdchem{\XMLremapdata[cml]{\dostartformula{}\rm}{\dostopformula}}
+
+\startXMLmapping [cml]
+
+\remapXMLsequence [molecule] [CPA] \doCMLmolecule
+\remapXMLsequence [ion] [CPA] \doCMLion
+\remapXMLsequence [atom] [CPA] \doCMLatom
+
+\setupCMLappearance [ion] [\c!alternative=\v!a]
+
+\let\CMLtopcaption\empty
+\let\CMLbotcaption\empty
+
+\def\someCMLtext#1%
+ {\ifx\CMLtopcaption\empty
+ \setbox0\null
+ \else
+ \setbox0\hbox{\txx\setstrut\strut\ignorespaces\CMLtopcaption\unskip}%
+ \fi
+ \setbox2\hbox{\ignorespaces\strut#1\unskip}%
+ \ifx\CMLbotcaption\empty
+ \setbox4\null
+ \else
+ \setbox4\hbox{\txx\setstrut\strut\ignorespaces\CMLbotcaption\unskip}%
+ \fi
+ \scratchdimen=\wd2\advance\scratchdimen-.5em
+ \ifdim\wd0>\scratchdimen
+ \setbox0\hbox spread .5em{\hss\box0\hss}%
+ \fi
+ \ifdim\wd4>\scratchdimen
+ \setbox4\hbox spread .5em{\hss\box4\hss}%
+ \fi
+ \setbox6=\vbox
+ {\offinterlineskip\halign{\hss##\hss\cr\copy0\cr\copy2\cr\copy4\cr}}%
+ \hbox{\lower\ht4\hbox{\lower\dp2\box6}}}
+
+\def\CMLscript#1%
+ {$\scriptscriptstyle\ignorespaces#1\unskip$}
+
+\def\doifnotXMLzero#1#2#3%
+ {\ifcase\XMLpar{#1}{#2}{0}\else#3{\XMLpar{#1}{#2}{0}}\fi}
+
+\newcounter\currentCMLatom
+\newcounter\nofCMLatoms
+
+\def\doCMLmolecule#1#2%
+ {\resetCMLcaption
+ \processXMLRchild{caption}{#2}%
+ \someCMLtext
+ {\bgroup
+ \newcounter\currentCMLatom
+ \newcounter\nofCMLatoms
+ \getXMLarguments{cml-m}{n="0" #1}%
+ \doifnotXMLzero{cml-m}{n}\firstofoneargument
+ \ignorespaces
+ \processXMLRchild{atom,ion,bond/,singlebond/,doublebond/,triplebond/}{#2}%
+ \unskip
+ \egroup}%
+ \ignorespaces}
+
+\def\doCMLion#1#2%
+ {\resetCMLcaption
+ \processXMLRchild{caption}{#2}%
+ \someCMLtext
+ {\bgroup
+ \newcounter\currentCMLatom
+ \newcounter\nofCMLatoms
+ \getXMLarguments{cml-i}{n="0" charge="0" #1}%
+ \doifnotXMLzero{cml-i}{n}\firstofoneargument
+ \doifelse\@@CMLionalternative\v!b
+ {[\ignorespaces
+ \processXMLRchild{atom,bond/,singlebond/,doublebond/,triplebond/}{#2}%
+ \unskip]%
+ \high{\doifnotXMLzero{cml-i}{charge}\CMLscript}}
+ {\countXMLRchild{atom}{\ignorespaces#2\unskip}%
+ \let\nofCMLatoms\nofXMLRchildren
+ \ignorespaces
+ \processXMLRchild{atom,bond/,singlebond/,doublebond/,triplebond/}{#2}%
+ \unskip}%
+ \egroup}%
+ \ignorespaces}
+
+\def\doCMLatom#1#2%
+ {\getXMLarguments{cml-a}{n="0" weight="0" protons="0" charge="0" #1}%
+ \increment\currentCMLatom
+ \resetCMLcaption
+ \someCMLtext
+ {\bgroup
+ \lohi
+ {\doifnotXMLzero{cml-a}{protons}\CMLscript}
+ {\doifnotXMLzero{cml-a}{weight}\CMLscript}%
+ \ignorespaces#2\unskip
+ \lohi
+ {\doifnotXMLzero{cml-a}{n}\CMLscript}
+ {\ifnum\nofCMLatoms=\currentCMLatom\relax
+ \doifnotXMLzero{cml-i}{charge}\CMLscript
+ \else
+ \doifnotXMLzero{cml-a}{charge}\CMLscript
+ \fi}%
+ \egroup}%
+ \ignorespaces}
+
+\remapXMLsequence [reaction] [CPA] \doCMLreaction
+
+\let\someCMLsymbol\gobbleoneargument
+\let\someCMLarrow \gobblethreearguments
+
+\def\doCMLreaction#1#2%
+ {\begingroup
+ \let\someCMLsymbol\dosomeCMLsymbol
+ \let\someCMLarrow \dosomeCMLarrow
+ #2%
+ \endgroup}
+
+\remapXMLsequence [plus] [CPA] \doCMLplus
+\remapXMLsingular [plus] [CPA] \doCMLplus
+\remapXMLsequence [minus] [CPA] \doCMLminus
+\remapXMLsingular [minus] [CPA] \doCMLminus
+\remapXMLsequence [equal] [CPA] \doCMLequal
+\remapXMLsingular [equal] [CPA] \doCMLequal
+
+\def\doCMLplus #1#2{\someCMLsymbol{+}}
+\def\doCMLminus#1#2{\someCMLsymbol{-}}
+\def\doCMLequal#1#2{\someCMLsymbol{=}}
+
+\def\dosomeCMLsymbol#1%
+ {\quad\mathop{#1}\quad}
+
+\remapXMLsequence [gives] [CPA] \doCMLgives
+\remapXMLsingular [gives] [CPA] \doCMLgives
+\remapXMLsequence [equilibrium] [CPA] \doCMLequilibrium
+\remapXMLsingular [equilibrium] [CPA] \doCMLequilibrium
+\remapXMLsequence [mesomeric] [CPA] \doCMLmesomeric
+\remapXMLsingular [mesomeric] [CPA] \doCMLmesomeric
+
+\def\doCMLgives #1#2{\resetCMLcaption#2\someCMLgives }
+\def\doCMLequilibrium#1#2{\resetCMLcaption#2\someCMLequilibrium}
+\def\doCMLmesomeric #1#2{\resetCMLcaption#2\someCMLmesomeric }
+
+\def\dosomeCMLarrow#1%
+ {\quad
+ \someCMLtext
+ {$\vcenter{\offinterlineskip\halign{##\cr\hskip3em\cr#1\cr}}$}%
+ \quad}
+
+\def\someCMLgives
+ {\someCMLarrow{\rightarrowfill}}
+
+\def\someCMLequilibrium
+ {\someCMLarrow{\rightarrowfill\cr\noalign{\nointerlineskip}\leftarrowfill}}
+
+\def\someCMLmesomeric
+ {\someCMLarrow{$\leftarrow\hskip-1em$\rightarrowfill}}
+
+\remapXMLsequence [cml] [caption] [CPA] \doCMLcaption
+
+\let\CMLtopcaption\empty
+\let\CMLbotcaption\empty
+
+\def\dodoCMLcaption#1#2%
+ {\def\CMLbotcaption{#2}%
+ \def\doCMLcaption##1##2%
+ {\def\CMLtopcaption{##2}%
+ \let\doCMLcaption\gobbletwoarguments}}
+
+\def\resetCMLcaption
+ {\let\CMLtopcaption\empty
+ \let\CMLbotcaption\empty
+ \let\doCMLcaption\dodoCMLcaption}
+
+\resetCMLcaption
+
+\remapXMLsingular [bond] [CPA] \doCMLbond
+\remapXMLsingular [singlebond] [CPA] \doCMLsinglebond
+\remapXMLsingular [doublebond] [CPA] \doCMLdoublebond
+\remapXMLsingular [triplebond] [CPA] \doCMLtriplebond
+
+\def\doCMLbond#1#2%
+ {\getXMLarguments{cml-b}{n="0" #1}%
+ \ifcase\XMLpar{cml-b}{n}{0}\relax
+ \doCMLsinglebond
+ \or
+ \doCMLdoublebond
+ \or
+ \doCMLtriplebond
+ \fi}
+
+\def\someCMLbond
+ {\hrule \!!width \hsize \!!height .1ex} % .4pt
+
+\def\dosomeCMLbond#1#2#3%
+ {{\setbox\scratchbox=\hbox{$M$}%
+ \vbox to \ht\scratchbox
+ {\hsize\wd\scratchbox
+ \vskip.1\wd\scratchbox
+ #1\vfill#2\vfill#3%
+ \vskip.1\wd\scratchbox}}}
+
+\def\doCMLsinglebond
+ {\dosomeCMLbond\relax\someCMLbond\relax}
+
+\def\doCMLdoublebond
+ {\dosomeCMLbond\someCMLbond\relax\someCMLbond}
+
+\def\doCMLtriplebond
+ {\dosomeCMLbond\someCMLbond\someCMLbond\someCMLbond}
+
+\stopXMLmapping
+
+\protect \endinput
diff --git a/tex/context/base/xtag-ent.tex b/tex/context/base/xtag-ent.tex
new file mode 100644
index 000000000..f4c3e4b06
--- /dev/null
+++ b/tex/context/base/xtag-ent.tex
@@ -0,0 +1,117 @@
+%D \module
+%D [ file=xtag-ent,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=A bunch of Entities,
+%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 need this for French and Hungarian.
+
+\defineXMLentity [colon] {\directdiscretionary{:}}
+\defineXMLentity [semicolon] {\directdiscretionary{;}}
+\defineXMLentity [questionmark] {\directdiscretionary{?}}
+\defineXMLentity [exclamationmark] {\directdiscretionary{!}}
+
+% These will fall back to the raw encoding vector
+
+\defineXMLentity [Aacute] {\Aacute}
+\defineXMLentity [aacute] {\aacute}
+\defineXMLentity [Cacute] {\Cacute} % unofficial
+\defineXMLentity [cacute] {\cacute} % unofficial
+\defineXMLentity [Eacute] {\Eacute}
+\defineXMLentity [eacute] {\eacute}
+\defineXMLentity [Iacute] {\Iacute}
+\defineXMLentity [iacute] {\iacute}
+\defineXMLentity [Oacute] {\Oacute}
+\defineXMLentity [oacute] {\oacute}
+\defineXMLentity [Uacute] {\Uacute}
+\defineXMLentity [uacute] {\uacute}
+\defineXMLentity [Yacute] {\Yacute}
+\defineXMLentity [yacute] {\yacute}
+\defineXMLentity [Nacute] {\Nacute}
+\defineXMLentity [nacute] {\nacute}
+
+\defineXMLentity [Ccedil] {\Ccedilla}
+\defineXMLentity [ccedil] {\ccedilla}
+
+\defineXMLentity [AElig] {\AEligature}
+\defineXMLentity [aelig] {\aeligature}
+
+\defineXMLentity [Agrave] {\Agrave}
+\defineXMLentity [agrave] {\agrave}
+\defineXMLentity [Egrave] {\Egrave}
+\defineXMLentity [egrave] {\egrave}
+\defineXMLentity [Igrave] {\Igrave}
+\defineXMLentity [igrave] {\igrave}
+\defineXMLentity [Ograve] {\Ograve}
+\defineXMLentity [ograve] {\ograve}
+\defineXMLentity [Ugrave] {\Ugrave}
+\defineXMLentity [ugrave] {\ugrave}
+
+\defineXMLentity [THORN] {\Thorn}
+\defineXMLentity [thorn] {\thorn}
+
+\defineXMLentity [Aring] {\Aring}
+\defineXMLentity [aring] {\aring}
+
+\defineXMLentity [Oslash] {\Oslash} % stroke
+\defineXMLentity [oslash] {\oslash}
+\defineXMLentity [Lslash] {\Lslash} % unofficial
+\defineXMLentity [lslash] {\lslash} % unofficial
+
+\defineXMLentity [eth] {\eth} % ?
+\defineXMLentity [ETH] {\Eth} % ?
+
+\defineXMLentity [Atilde] {\Atilde}
+\defineXMLentity [atilde] {\atilde}
+\defineXMLentity [Etilde] {\Etilde}
+\defineXMLentity [etilde] {\etilde}
+\defineXMLentity [Itilde] {\Itilde}
+\defineXMLentity [itilde] {\itilde}
+\defineXMLentity [Ntilde] {\Ntilde}
+\defineXMLentity [ntilde] {\ntilde}
+\defineXMLentity [Otilde] {\Otilde}
+\defineXMLentity [otilde] {\otilde}
+\defineXMLentity [Utilde] {\Utilde}
+\defineXMLentity [utilde] {\utilde}
+
+\defineXMLentity [Auml] {\Adiaeresis}
+\defineXMLentity [auml] {\adiaeresis}
+\defineXMLentity [Euml] {\Ediaeresis}
+\defineXMLentity [euml] {\ediaeresis}
+\defineXMLentity [Iuml] {\Idiaeresis}
+\defineXMLentity [iuml] {\idiaeresis}
+\defineXMLentity [Ouml] {\Odiaeresis}
+\defineXMLentity [ouml] {\odiaeresis}
+\defineXMLentity [Uuml] {\Udiaeresis}
+\defineXMLentity [uuml] {\udiaeresis}
+\defineXMLentity [Yuml] {\Ydiaeresis}
+\defineXMLentity [yuml] {\ydiaeresis}
+
+\defineXMLentity [szlig] {\Ssharp}
+
+\defineXMLentity [Acirc] {\Acircumflex}
+\defineXMLentity [acirc] {\acircumflex}
+\defineXMLentity [Ecirc] {\Ecircumflex}
+\defineXMLentity [ecirc] {\ecircumflex}
+\defineXMLentity [Icirc] {\Icircumflex}
+\defineXMLentity [icirc] {\icircumflex}
+\defineXMLentity [Ocirc] {\Ocircumflex}
+\defineXMLentity [ocirc] {\ocircumflex}
+\defineXMLentity [Ucirc] {\Ucircumflex}
+\defineXMLentity [ucirc] {\ucircumflex}
+
+\defineXMLentity [ccaron] {\ccaron} % unofficial
+\defineXMLentity [rcaron] {\rcaron} % unofficial
+\defineXMLentity [scaron] {\scaron} % unofficial
+\defineXMLentity [zcaron] {\zcaron} % unofficial
+
+\defineXMLentity [dots] {\unknown}
+\defineXMLentity [amp] {\&}
+\defineXMLentity [nbsp] {\nonbreakablespace}
diff --git a/tex/context/base/xtag-exp.tex b/tex/context/base/xtag-exp.tex
new file mode 100644
index 000000000..337b49348
--- /dev/null
+++ b/tex/context/base/xtag-exp.tex
@@ -0,0 +1,88 @@
+%D \module
+%D [ file=xtag-exp,
+%D version=2001.08.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Expansion,
+%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 XML Macros / Expansion}
+
+\unprotect
+
+%D Files
+
+\newcounter\XMLfilenesting \let\restoreXMLelements\relax
+
+\def\startXMLreading
+ {\increment \XMLfilenesting \relax
+ \ifcase\XMLfilenesting\or
+ \ifprocessingXML
+ \let\restoreXMLelements\relax
+ \else
+ \let\restoreXMLelements\disableXMLelements
+ \enableXMLelements
+ \fi
+ \fi}
+
+\def\stopXMLreading
+ {\ifcase\XMLfilenesting\or
+ \restoreXMLelements
+ \let\restoreXMLelements\relax
+ \fi
+ \decrement \XMLfilenesting \relax}
+
+\ifnum\texengine=\luatexengine
+ \def\enableXMLfiledata
+ {\prependtoks \enableXMLelements \to \mainoutput % brrr, will change
+ \appendtoks \forcefileexpansiontrue \to \everyenableXML
+ \let\enableXMLfiledata\relax}
+\else
+ \def\enableXMLfiledata
+ {\prependtoks \enableXMLelements \to \mainoutput % brrr, will change
+ \appendtoks \startXMLreading \to \everybeforeutilityread
+ \appendtoks \stopXMLreading \to \everyafterutilityread
+ \appendtoks \forcefileexpansiontrue \to \everyenableXML
+ \let\enableXMLfiledata\relax}
+\fi
+
+\setupXMLprocessing[\c!state=\v!start]
+
+\appendtoks
+ \ifproductionrun \enableXMLfiledata \fi
+\to \aftersetupXMLprocessing
+
+%D Here we overload the mark handler.
+
+\ifnum\texengine=\luatexengine \else
+
+ \def\XMLexpanded#1%
+ {\bgroup
+ \honorunexpanded
+ \dontexpandencoding
+ \xdef\@@globalexpanded{\noexpand#1}% why \noexpand?
+ \egroup
+ \@@globalexpanded}
+
+ \let\normalsetnormalmark\setnormalmark
+
+ \long\def\setnormalmark#1% overloaded
+ {\ifprocessingXML
+ \expandafter\setXMLexpandedmark
+ \else
+ \expandafter\normalsetnormalmark
+ \fi#1}
+
+ \def\setXMLexpandedmark#1#2% using a tok prevents unwanted expansion in mark
+ {\XMLexpanded{\scratchtoks{\enableXMLelements#2}}%
+ \setxvalue{\@@crk\string#1}{\the\scratchtoks}%
+ \normalmarks#1{\the\scratchtoks}}
+
+\fi
+
+\protect \endinput
diff --git a/tex/context/base/xtag-ext.tex b/tex/context/base/xtag-ext.tex
new file mode 100644
index 000000000..9a132c677
--- /dev/null
+++ b/tex/context/base/xtag-ext.tex
@@ -0,0 +1,439 @@
+%D \module
+%D [ file=xtag-ext,
+%D version=2001.03.21,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Extra Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt XML Macros / Extras}
+
+\unprotect
+
+%D \macros
+%D {startXMLmapping}
+%D
+%D You can define macros within a namespace, so that they
+%D will not conflict (don't confuse this with \XML\
+%D namespaces.)
+%D
+%D \starttyping
+%D \startXMLmapping [tag] | [-] [tag] | [+] [tag]
+%D definitions
+%D \stopXMLmapping
+%D \stoptyping
+%D
+%D When a \type {[+]} is specified, the mappings will
+%D nest.
+
+\def\resetXMLmapping
+ {\let\@@XMLelement\normal@@XMLelement
+ \let\@@XMLmapping\empty}
+
+\resetXMLmapping
+
+\def\startXMLmapping
+ {\dodoubleempty\dostartXMLmapping}
+
+% \def\dostartXMLmapping[#1][#2]% sneller maken
+% {\pushmacro\@@XMLelement
+% \pushmacro\@@XMLmapping
+% \ifsecondargument
+% \doifelse{#1}{-}
+% {\donostartXMLmapping{#2}}
+% {\doifelse{#1}{+}
+% {\dodostartXMLmapping{#2}}
+% {\donostartXMLmapping{#2}}}%
+% \else
+% \donostartXMLmapping{#1}%
+% \fi
+% \unprotect}
+
+\def\dostartXMLmapping[#1#2][#3]%
+ {\pushmacro\@@XMLelement
+ \pushmacro\@@XMLmapping
+ \ifsecondargument
+ \if\noexpand#1-%
+ \@EA\donostartXMLmapping
+ \else\if\noexpand#1+%
+ \@EAEAEA\dodostartXMLmapping
+ \else
+ \@EAEAEA\donostartXMLmapping
+ \fi\fi{#3}%
+ \else
+ \donostartXMLmapping{#1#2}%
+ \fi
+ \unprotect}
+
+\def\donostartXMLmapping#1%
+ {\let\@@XMLprevelement\@@XMLelement
+ \edef\@@XMLmapping{#1}%
+ \edef\@@XMLelement{\normal@@XMLelement+#1}}
+
+\def\dodostartXMLmapping#1%
+ {\let\@@XMLprevelement\@@XMLelement
+ \edef\@@XMLmapping{\@@XMLmapping+#1}%
+ \edef\@@XMLelement{\@@XMLelement+#1}}
+
+\def\stopXMLmapping
+ {\protect
+ \popmacro\@@XMLmapping
+ \popmacro\@@XMLelement}
+
+%D \macros
+%D {startXMLmappinggroup}
+%D
+%D Imagine something:
+%D
+%D \starttyping
+%D \defineXMLenvironment [something]
+%D {\startXMLmapping[whatever]}
+%D {\stopXMLmapping}
+%D \stoptyping
+%D
+%D Here the \type {\stopXMLmapping} will never be reached
+%D because we are in a mapping. Therefore we need:
+
+\def\startXMLmappinggroup
+ {\dodoubleempty\dostartXMLmappinggroup}
+
+\def\dostartXMLmappinggroup[#1][#2]%
+ {\bgroup
+ \letcscsname\savedXMLmeaning\csname\@@XMLelement:/\currentXMLelement\endcsname
+ \dostartXMLmapping[#1][#2]% do ! else wrong !
+ \letcsnamecs\csname\@@XMLelement:/\currentXMLelement\endcsname\savedXMLmeaning}
+
+\def\stopXMLmappinggroup
+ {\stopXMLmapping
+ \egroup}
+
+%D Context Directives:
+
+\def\@@CTXML{@@CTXML}
+
+\def\defineXMLdirective
+ {\dodoubleempty\dodefineXMLdirective}
+
+\long\def\dodefineXMLdirective[#1][#2]#3%
+ {\defineXMLprocessor[context-#1-directive]{\dohandleXMLdirective{#1}{#3}}%
+ \ifsecondargument
+ \long\setvalue{\@@CTXML-#1-#2}{#3}%
+ \fi}
+
+\def\dohandleXMLdirective#1#2#3%
+ {\dodohandleXMLdirective#3 @ @ @\end{#1}{#2}}
+
+%\def\dodohandleXMLdirective#1 #2 #3 #4\end#5#6%
+% {\doifdefinedelse{\@@CTXML-#5-#1}
+% {\getvalue{\@@CTXML-#5-#1}[#2=#3]}
+% {#6[#1][#2=#3]}}
+
+\def\dodohandleXMLdirective#1 #2 #3 #4\end#5#6%
+ {\executeifdefined{\@@CTXML-#5-#1}{#6[#1]}[#2=#3]}
+
+% \defineXMLdirective [mathml] \setupMMLappearance % [#1][#2=#3]
+% \defineXMLdirective [flowchart] [shapes] \setupFLOWshapes % [#2=#3]
+% \defineXMLdirective [flowchart] [lines] \setupFLOWlines % [#2=#3]
+
+\defineXMLprocessor [context-begin-group] {\bgroup\gobbleoneargument}
+\defineXMLprocessor [context-end-group] {\egroup\gobbleoneargument}
+
+% \def\XMLnspart#1:#2\empty{#1} % call ...:\empty\empty
+% \def\XMLidpart#1:#2#3\empty{\ifx#2\empty#1\else\XMLidpart#2#3\empty\empty\fi}
+
+% trial macros (used in setupx), to be sped up !
+
+\bgroup \catcode`\<=\active
+
+\gdef\saveXMLasdata#1#2% name raw data
+ {\dodoglobal\setevalue{\@@XMLsave:#1}{#2}} % \edef!
+
+\gdef\saveXMLdata#1#2% name data-name ; definitely no \edef
+ {\dodoglobal\copycsname\@@XMLsave:#1\endcsname\csname\@@XMLdata:#2\endcsname}
+
+% \gdef\saveXMLdatainelement#1#2#3% name element data
+% {\dodoglobal\setevalue{\@@XMLsave:#1}% todo: one level expansion
+% {<#2 \currentXMLarguments>\XMLflush{#3}</#2>}}
+%
+% \gdef\saveXMLdatastructure#1#2#3#4#5#6% name element args before data after
+% {\dodoglobal\setevalue{\@@XMLsave:#1}% todo: one level expansion
+% {<#2 #3 \currentXMLarguments>#4\XMLflush{#5}#6</#2>}}
+%
+% better (no expansion):
+
+\newtoks\XMLdatatoks
+
+\gdef\saveXMLdatainelement#1#2#3% name element data
+ {\XMLdatatoks\@EAEAEA{\csname\@@XMLdata:#3\endcsname}% no check
+ \dodoglobal\setevalue{\@@XMLsave:#1}{<#2 \currentXMLarguments>\the\XMLdatatoks</#2>}}
+
+\gdef\saveXMLdatastructure#1#2#3#4#5#6% name element args before data after
+ {\XMLdatatoks\@EAEAEA{\csname\@@XMLdata:#5\endcsname}% no check
+ \dodoglobal\setevalue{\@@XMLsave:#1}{<#2 #3 \currentXMLarguments>#4\the\XMLdatatoks#6</#2>}}
+
+\gdef\gsaveXMLasdata {\doglobal\saveXMLasdata}
+\gdef\gsaveXMLdata {\doglobal\saveXMLdata}
+\gdef\gsaveXMLdatainelement{\doglobal\saveXMLdatainelement}
+\gdef\gsaveXMLdatastructure{\doglobal\saveXMLdatastructure}
+
+\gdef\doifelseXMLelement#1%
+ {\doifdefinedelse{\@@XMLsave:#1}}
+
+\gdef\doifelseXMLelementcontent#1%
+ {\ifcsname\@@XMLsave:#1\endcsname
+ \bgroup
+ \@EA\defconvertedcommand\@EA\ascii\csname\@@XMLsave:#1\endcsname
+ \setbox\scratchbox\hbox{\ignorespaces\ascii\unskip\unskip\unskip}%
+ \ifdim\wd\scratchbox>\zeropoint
+ \egroup\@EAEAEA\firstoftwoarguments
+ \else
+ \egroup\@EAEAEA\secondoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\gdef\doifelseXMLelementequals#1#2%
+ {\ifcsname\@@XMLsave:#1\endcsname
+ \bgroup
+ \@EA\defconvertedcommand\@EA\asciia\csname\@@XMLsave:#1\endcsname
+ \defconvertedargument\asciib{#2}%
+ \ifx\asciia\asciib
+ \egroup\@EAEAEA\firstoftwoarguments
+ \else
+ \egroup\@EAEAEA\secondoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\gdef\doifXMLtextelse#1% new
+ {\doiftextelse{\simplifyXMLelements#1}}
+
+\gdef\doifXMLtext#1#2% new
+ {\doiftextelse{\simplifyXMLelements#1}{#2}\donothing}
+
+\gdef\convertXMLelement#1\to#2%
+ {\ifcsname\@@XMLsave:#1\endcsname
+ \@EA\defconvertedcommand\@EA#2\csname\@@XMLsave:#1\endcsname
+ \else
+ \let#2\ascii
+ \fi}
+
+\gdef\flushXMLelement#1%
+ {\csname
+ \@@XMLsave:\ifcsname\@@XMLsave:#1\endcsname#1\else\@@XMLsave\fi
+ \endcsname}
+
+\gdef\defXMLelement#1#2%
+ {\@EA\let\@EA#1\csname
+ \@@XMLsave:\ifcsname\@@XMLsave:#2\endcsname#2\else\@@XMLsave\fi
+ \endcsname}
+
+\letgvalueempty{\@@XMLsave:\@@XMLsave}
+
+\gdef\showXMLelement#1%
+ {\showvalue{\@@XMLsave:#1}}
+
+\gdef\eraseXMLelement#1%
+ {\dodoglobal\letbeundefined{\@@XMLsave:#1}}
+
+\gdef\geraseXMLelement
+ {\doglobal\eraseXMLelement}
+
+\gdef\processXMLelement#1%
+ {\bgroup
+ \enableXMLelements
+ \getvalue{\@@XMLsave:#1}%
+ \egroup}
+
+\gdef\texXMLelement#1%
+ {\begingroup
+% \setnormalcatcodes
+ \disableXML
+ \scantokens\@EA\@EA\@EA{\csname\@@XMLsave:#1\endcsname}%
+ \endgroup}
+
+\gdef\reduceXMLescapeentities
+ {\setXMLentity{amp}{\string&}%
+ \setXMLentity{lt}{\string<}%
+ \setXMLentity{gt}{\string>}%
+ \setXMLentity{quot}{\string'}%
+ \setXMLentity{dquot}{\string"}}
+
+\gdef\reduceXMLelement#1\to#2%
+ {\ifcsname\@@XMLsave:#1\endcsname
+ \bgroup
+ \reduceXMLescapetokens
+ \reduceXMLescapeentities
+ \expanded{\egroup\noexpand\def\noexpand#2{\csname\@@XMLsave:#1\endcsname}}%
+ \else
+ \let#2\empty
+ \fi}
+
+\egroup
+
+% \defineXMLcommand
+% [whatever]
+% [test=unknown]
+% {\XMLop{test}}
+%
+% \startXMLdata
+% <whatever test="{\bf test}"/>
+% \stopXMLdata
+%
+% \defineXMLcommand
+% [whatever]
+% [test=unknown]
+% {\defXMLtex\SomethingTex{\XMLop{test}}%
+% \SomethingTex}
+%
+% \startXMLdata
+% <whatever test="{\bf test}"/>
+% \stopXMLdata
+
+\def\defXMLtex#1#2% the appended space will go away when
+ {\begingroup % \scantokens is fixed
+ \disableXML
+ \everyeof{\noexpand}% br's hack
+ \edef\ascii{#2}%
+ \edef\ascii{\scantokens\expandafter{\ascii}}% space appended
+ \expandafter\endgroup\expandafter\def\expandafter#1\expandafter{\ascii}}
+
+\def\potentialXMLentity#1%
+ {\doifXMLentityelse{#1}{\getXMLentity{#1}}{#1}}
+
+% \def\XMLnoschema{standalone='yes'}
+
+\def\writtenXMLelement #1#2{<#1>#2</#1>}
+\def\writtenXMLstart #1{<#1>}
+\def\writtenXMLend #1{</#1>}
+\def\writtenXMLempty #1{<#1/>}
+\def\writtenXMLelementcs#1#2{\ifx#2\empty\else<#1>#2</#1>\fi}
+\def\writtenXMLemptycs #1#2{\ifx#2\empty<#1/>\else<#1>#2</#1>\fi}
+
+%D This one can be used to get sound tuo files.
+%D
+%D \starttyping
+%D \setuphead[chapter][expansion=xml]
+%D % \setuplist[chapter][textcommand=\enableXML]
+%D
+%D \enableregime[utf] \autoXMLentitiestrue
+%D \stoptyping
+%D
+%D with:
+%D
+%D \starttyping
+%D <chapter>test &#xEB; test &ediaeresis; test <e>ediaeresis</e></chapter>
+%D \stoptyping
+%D
+%D This gives:
+%D
+%D \starttyping
+%D test ë test</b> <e>ediaeresis</e> test <e>ediaeresis</e>
+%D \stoptyping
+
+\def\XMLprocessingparameter#1%
+ {\csname\??xp#1\endcsname}
+
+\appendtoks
+ \defineXMLargument[\XMLprocessingparameter\c!escape]\getXMLentity
+\to \aftersetupXMLprocessing
+
+\setupXMLprocessing
+ [\c!escape=e]
+
+\bgroup \catcode`\<=\active
+
+\long\gdef\defexpandedxmlargument#1#2#3%
+ {\begingroup
+ \let\uppercase\firstofoneargument
+ \def\getXMLhexcharacter##1{\numbertoutp{"##1}}% maps to private if needed
+ \def\getXMLdeccharacter##1{\numbertoutp {##1}}% maps to private if needed
+ \def\getXMLentity##1{<e>##1</e>}%
+ \def<{\noexpand<}%
+ \ifcase\xmlexpandmode
+ \or
+ % 1 = default
+ \or
+ % 2 = keep utf
+ \keeputfcharacters % new, needed for chinese and such
+ \fi
+ \let\uchar\relax
+ \let\unicodechar\relax
+ \xdef\@@globalexpanded{#3}%
+ \endgroup
+ #1#2\@@globalexpanded}
+
+\egroup
+
+% test.xml: <test>test % test</test>
+%
+% \starttext
+% \enableregime[utf] \chardef\XMLtokensreduction=0
+% \setuphead[chapter][expansion=xml]
+% \defineXMLargument[test]{\chapter}
+% \placelist[chapter][criterium=text]
+% \processXMLfilegrouped{test.xml}
+% \stoptext
+
+% obsolete in mkiv
+
+\chardef\xmlexpandmode\plusone
+
+\def\defexpandedxmlargumentcmd {\chardef\xmlexpandmode\plusone\defexpandedxmlargument\defconvertedcommand}
+\def\defexpandedxmlargumentutf {\chardef\xmlexpandmode\plustwo\defexpandedxmlargument\defconvertedcommand}
+\def\gdefexpandedxmlargumentcmd{\chardef\xmlexpandmode\plusone\defexpandedxmlargument\gdefconvertedcommand}
+\def\gdefexpandedxmlargumentutf{\chardef\xmlexpandmode\plustwo\defexpandedxmlargument\gdefconvertedcommand}
+
+\installexpander {xml} \defexpandedxmlargumentcmd \gdefexpandedxmlargumentcmd
+\installexpander {xml:cmd} \defexpandedxmlargumentcmd \gdefexpandedxmlargumentcmd
+\installexpander {xml:utf} \defexpandedxmlargumentutf \gdefexpandedxmlargumentutf
+
+\def\XMLtexmath#1{\begingroup\setnormalcatcodes\scantokens{\mathematics{#1}\ignorespaces}\endgroup}
+
+% \defineXMLargument[tm]{\XMLtexmath}
+%
+% \startbuffer[test]
+% Sometimes it makes sense to use simple math, as in: <tm>e=mc^2</tm>.
+% \stopbuffer
+%
+% \processXMLbuffer[test]
+
+%D Undocumented ...
+
+\def\defineXMLstore {\doquadrupleargument\dodefineXMLstore[\saveXMLasdata]}
+\def\defineXMLgstore{\doquadrupleargument\dodefineXMLstore[\gsaveXMLasdata]}
+
+\def\dodefineXMLstore[#1][#2][#3][#4]% element attribute prefix % will become faster
+ {\defineXMLargument[#2][#3=\s!dummy]{#1{#4:\XMLop{#3}}}}
+
+\def\countXMLchildren[#1]#2%
+ {\startnointerference
+ \doglobal\newcounter\nofXMLchildren
+ \defineXMLargument[#1]{\doglobal\increment\nofXMLchildren}%
+ \startXMLignore
+ #2%
+ \stopXMLignore
+ \stopnointerference}
+
+% Typical \MKII. We will not explore this route any further as in \MKIV\ we
+% have better ways.
+
+\prependtoks \setnormalcatcodes \to \everyTEXinputmode
+\appendtoks \processingXMLfalse \to \everyTEXinputmode
+
+\let\normalenableXML\enableXML % some day we move the normal \enableXML into the toks
+
+\prependtoks \normalenableXML \to \everyXMLinputmode
+\appendtoks \processingXMLtrue \to \everyXMLinputmode
+
+\unexpanded\def\enableXML {\setinputmode[XML]} % \enableXML is used in edef's and marks
+\unexpanded\def\disableXML{\setinputmode[TEX]}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-hyp.tex b/tex/context/base/xtag-hyp.tex
new file mode 100644
index 000000000..e4e048e2b
--- /dev/null
+++ b/tex/context/base/xtag-hyp.tex
@@ -0,0 +1,69 @@
+%D \module
+%D [ file=xtag-hyp,
+%D version=2003.11.24,
+%D title=\CONTEXT\ XML MAcros,
+%D subtitle=Hyphenation,
+%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 XML Macros / Hyphenation}
+
+%D This filter is kind of obsolete, since \UTF\ is not
+%D limited to \XML. So, here we only enable \UTF\ support.
+
+\ifnum\texengine=\luatexengine
+ \defineXMLenvironment [hyphenations] [language=\currentlanguage,regime=utf,encoding=\defaultencoding]
+ {\startnointerference
+ \defineXMLargument [hyphenation] \hyphenation
+ \language[\XMLop{language}]}
+ {\stopnointerference}
+\else
+ \defineXMLenvironment [hyphenations] [language=\currentlanguage,regime=utf,encoding=\defaultencoding]
+ {\startnointerference
+ \defineXMLargument [hyphenation] \hyphenation
+ \language[\XMLop{language}]%
+ \enableregime[\XMLop{regime}]%
+ \enableencoding[\XMLop{encoding}]}
+ {\stopnointerference}
+\fi
+
+\defineXMLsingular [hyphenate]
+ {\-}
+
+\defineXMLgrouped [language] [code=\currentlanguage,scope=local]
+ {\doifelse{\XMLop{scope}}{global}\mainlanguage\language[\XMLop{code}]}
+
+\defineXMLsingular [language] [code=\currentlanguage]
+ {\doifelse{\XMLop{scope}}{global}\mainlanguage\language[\XMLop{code}]}
+
+\defineXMLsingular [compound] [token=-]
+ {\expanded{\directdiscretionary{\XMLop{token}}}}
+
+\endinput
+
+% \mainlanguage[nl] \setupbodyfont[pos] \useXMLfilter[utf,hyp]
+%
+% \starttext
+%
+% \hyphenatedword{pati\ediaeresis nten}
+% \hyphenatedword{pati\ediaeresis ntenorganisatie}
+% \hyphenatedword{pati\ediaeresis ntenplatform}
+%
+% \startXMLdata
+% <hyphenations language='nl' regime='utf'>
+% <hyphenation>pa-tiën-ten</hyphenation>
+% <hyphenation>pa-tiën-ten-or-ga-ni-sa-tie</hyphenation>
+% <hyphenation>pa-tiën-ten-plat-form</hyphenation>
+% </hyphenations>
+% \stopXMLdata
+%
+% \hyphenatedword{pati\ediaeresis nten}
+% \hyphenatedword{pati\ediaeresis ntenorganisatie}
+% \hyphenatedword{pati\ediaeresis ntenplatform}
+%
+% \stoptext
diff --git a/tex/context/base/xtag-ini.tex b/tex/context/base/xtag-ini.tex
new file mode 100644
index 000000000..e48ef3da6
--- /dev/null
+++ b/tex/context/base/xtag-ini.tex
@@ -0,0 +1,2999 @@
+%D \module
+%D [ file=xtag-ini,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML 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 XML Macros / Initialization}
+
+%D Beware: don't rely on \longempty things, since this may
+%D change!
+
+%D This module is highly optimized for speed, which sometimes
+%D leads to rather unreadable code. Sorry for this.
+
+\bgroup \obeylines
+
+\gdef\startXMLdefinitions% keep %
+ {\bgroup\obeylines\dostartXMLdefinitions}
+
+\gdef\dostartXMLdefinitions #1
+ {\egroup\doifsomething{#1}{\writestatus{XML}{loading #1 support}}}
+
+\global\let\stopXMLdefinitions\relax
+
+\egroup
+
+% todo: XMLfullsave == also attributes
+% csnames
+% XMLelse -> elseXML
+
+%D Remark: some hard coded character things will be replaced
+%D by named glyphs as soon as the upgraded encoding modules
+%D are released. At that moment, unicode support will be
+%D provided in accordance with the normal support in \CONTEXT.
+
+%D Like it or not, this module deals with angle bracketed
+%D input. Processing \XML\ alike input in \CONTEXT\ has been
+%D possible since 1995, and till 2000 several methods ran in
+%D parallel. These were implemented in modules like the semi
+%D public \type {m-sgml}.
+%D
+%D There is not one optimal solution for processing \XML\ data.
+%D The oldest method was based on a very simple preprocessor
+%D written in \MODULA\ and later \PERL: \type {<command>} was
+%D converted into \type {\begSGML[command]} and optional
+%D parameters were passed.
+%D
+%D A second method uses a \PERL\ or \XSL\ transformation
+%D script that produces \CONTEXT\ commands. This method is
+%D much slower, mainly because the whole document is read into
+%D memory and a document tree is to be build. The advantage is
+%D that processing of the resulting document is fast.
+%D
+%D The third method uses a basic parser written in the \TEX\
+%D language, and apart from a few pitfalls, this method is
+%D clean and efficient, but not always robust. Because errors
+%D in the input are not catched on forehand, processing in
+%D \TEX\ may fail due to errors. But, given that a document
+%D can be validated on forehand, this is no big problem.
+%D
+%D Each method has its advantage, but especially the third
+%D method puts some demands on \CONTEXT, since no interference
+%D between the parser and the core commands may occur. What
+%D method is used, depends on the situation.
+%D
+%D All three methods introduce some problems in interfacing to
+%D core \CONTEXT\ functionality. This is due to the fact that
+%D sometimes we want to typeset content directly, while in
+%D other cases we just want to pick up data for later usage,
+%D either or not using delimited arguments. And, when moving
+%D data around, there is always the expansion problem to deal
+%D with.
+%D
+%D As can be expected, we have to map begin and end tags onto
+%D \CONTEXT's start- and stopcommands. This is the easy part.
+%D When we have to pass the content of an element to a macro
+%D as argument, we need to do a delimited grab. Such mappings
+%D are not that hard to implement and were part of \type
+%D {m-sgml.tex} already. New in this core module is nested
+%D grabbing. Also new here is the support for namespaces and
+%D extensive attribute handling. On the other hand, recursive
+%D traceback of attributes is no longer supported. Because
+%D this feature was not really used, we can hereby safely we
+%D declare the \type {m-sgml.tex} module obsolete.
+%D
+%D In order to be able to incorporate \XML\ style definitions
+%D into basic \TEX\ styles, we will provide some basic
+%D functionality in the core itself. Some of the functionality
+%D can be set up with this general command. We use a token
+%D list register to handle post||setup actions. This permits
+%D us to extend this command.
+
+\unprotect
+
+\newtoks\aftersetupXMLprocessing
+
+\def\setupXMLprocessing
+ {\dosingleargument\dosetupXMLprocessing}
+
+\def\dosetupXMLprocessing[#1]%
+ {\getparameters[\??xp][#1]\the\aftersetupXMLprocessing}
+
+\def\XMLprocessingparameter#1%
+ {\csname\??xp#1\endcsname}
+
+\protect
+
+%D Formally an \XML\ file starts with an unique sequence
+%D \type {<?xml}, but in most of the unilities that come with
+%D \CONTEXT\ we will be more tolerant, and gobble preceding
+%D spaces.
+
+\def\XMLbanner#1{\string<\string ?xml version='1.0' #1\string ?\string>}
+
+%D We will be dealing with elements, which means that we have
+%D to take care of \type {<this>} and \type {</that>}, but
+%D also with \type {<such/>} and \type {<so />}. In some cases
+%D the upper and lowercase alternatives need to be dealt with,
+%D although this is not realy needed since XML is case
+%D sensitive.
+%D
+%D We also have to handle entities, like \type {&you;} and
+%D \type {&me;}. These are quite easy to deal with and need to
+%D be hooked into the encoding and abbreviation mechanisms.
+%D
+%D And then there are the parameters to be taken care of. Here
+%D we meet \type {key="value"} but also \type {key='eulav'}
+%D and even the spacy \typ {key = "value"}.
+%D
+%D Since we have to handlers for each element and entity, we
+%D will create a few namespaces. Special care has to be
+%D given to preformated code.
+%D
+%D There are two namespace mechanisms in place: one for
+%D \TEX, and one for \XML. The later mechanism permits
+%D remapping and ignoring.
+
+\unprotect
+
+\def \@@XML {XML:}
+\edef\@@XMLentity {\@@XML ent} % &crap;
+\edef\@@XMLelement {\@@XML ele} % <this> </this> <that/>
+\edef\@@XMLvariable {\@@XML var} % key="val"
+\edef\@@XMLvalue {\@@XML val} % key="val"
+\edef\@@XMLpars {\@@XML par} %
+\edef\@@XMLdata {\@@XML dat} % mem buffer
+\edef\@@XMLcode {\@@XML cod} % named mem buffers
+\edef\@@XMLinstruction {\@@XML ins} % <?
+\edef\@@XMLmap {\@@XML map} % mapping on context attr
+\edef\@@XMLlist {\@@XML lst} %
+\edef\@@XMLnamespace {\@@XML nam} % namespace:element
+\edef\@@XMLurlspace {\@@XML url} %
+\edef\@@XMLescape {\@@XML esc} % <!
+\edef\@@XMLdepth {\@@XML dep} % used to track nesting
+\edef\@@XMLdopth {\@@XML dop} % used to track nesting
+\edef\@@XMLsave {\@@XML sav} % namespace for saved elements
+
+\iffalse % slightly faster
+
+\edef\@@XML {*}
+\edef\@@XMLentity {\@@XML a} % &crap;
+\edef\@@XMLelement {\@@XML b} % <this> </this> <that/>
+\edef\@@XMLvariable {\@@XML c} % key="val"
+\edef\@@XMLvalue {\@@XML d} % key="val"
+\edef\@@XMLpars {\@@XML e} %
+\edef\@@XMLdata {\@@XML f} % mem buffer
+\edef\@@XMLcode {\@@XML g} % named mem buffers
+\edef\@@XMLinstruction {\@@XML h} % <?
+\edef\@@XMLmap {\@@XML i} % mapping on context attr
+\edef\@@XMLlist {\@@XML j} %
+\edef\@@XMLnamespace {\@@XML k} % namespace:element
+\edef\@@XMLurlspace {\@@XML l} %
+\edef\@@XMLescape {\@@XML m} % <!
+\edef\@@XMLdepth {\@@XML n} % used to track nesting
+\edef\@@XMLdopth {\@@XML o} % used to track nesting
+\edef\@@XMLsave {\@@XML p} % namespace for saved elements
+
+\fi
+
+\let\normal@@XMLelement\@@XMLelement % we may overload this one later inside a group
+
+\newtoks\XMLtoks
+\newtoks\XMLresetlist
+
+\newif\ifignoreXMLspaces
+\newif\iffixedXMLfont
+\newif\iftraceXMLelements
+%newif\ifprocessingXML
+
+\newcount\XMLlevel % scratchcounter
+\newcount\XMLdepth % used here
+
+\newtoks\everyenableXML
+
+%D We will implement the parser by making a few characters
+%D active. For that reason we also have to save their
+%D original meaning.
+
+%D \macros
+%D {enableXML}
+%D
+%D The macro \type {\enableXML} will be used to turn on the
+%D parser. This means that after that, \TEX\ commands starting
+%D with a backslash will not longer be read as such. There is
+%D a way around this, but for convenience \TEXEXEC\ will take
+%D care of processing raw \XML\ files in a transparant way.
+
+% cmr -- best for tui and such
+%
+% \chardef\XMLtokensreduction\zerocount
+%
+% lmr -- best but problematic for tui file:
+
+\chardef\XMLtokensreduction\plustwo
+
+% \def\alwaysreduceXMLtokens {\XMLtokensreduction\plusone}
+% \def\permanentreduceXMLtokens{\XMLtokensreduction\plustwo}
+
+% part of this should move to a low level module
+
+% we predefine some macros, just to satisfy the dep parser
+
+\let\enableXMLexpansion \relax
+\let\disableXMLexpansion \relax
+\let\enableXML \relax
+\let\activateXMLescapetokens\relax
+\let\entitleXMLescapetokens \relax
+\let\reduceXMLescapetokens \relax
+\let\ignoreXMLescapetokens \relax
+\let\enableXMLelements \relax
+\let\disableXMLelements \relax
+
+% \bgroup
+% \catcode`\*=\@@comment
+% \catcode`\.=\@@escape
+% .catcode`.B=.@@begingroup
+% .catcode`.E=.@@endgroup
+% .catcode`.P=.@@parameter
+%
+% .catcode`.&=.@@active
+% .catcode`.<=.@@active
+%
+% .catcode`.#=.@@active
+% .catcode`.$=.@@active
+% .catcode`.%=.@@active
+% .catcode`.\=.@@active
+% .catcode`.^=.@@active
+% .catcode`._=.@@active
+% .catcode`.{=.@@active
+% .catcode`.}=.@@active
+% .catcode`.|=.@@active
+% .catcode`.~=.@@active
+%
+% .gdef.enableXMLexpansion
+% B.def<B.doXMLelementE.let&=.doXMLentityE
+%
+% .gdef.disableXMLexpansion
+% B.unexpanded.def<B.doXMLelementE.let&=.doXMLentityE
+%
+% * internally the # becomes two #'s (before expanding, during
+% * the parsing stage) which is why we let the first # gobble
+% * the second one
+% *
+% * since this only takes place when reading arguments, as in
+% * \startXMLdata ... cum, suis, we can take place of it
+% * there; this is needed because reading from file goes wrong
+% * (eating up argument)
+%
+% .unexpanded.gdef.enableXML
+% B.catcode`.!=.@@other
+% .catcode`.?=.@@other
+% .catcode`.:=.@@other * active in french
+% .catcode`.;=.@@other * active in french
+% .catcode`.&=.@@active
+% .catcode`.<=.@@active
+% .catcode`.>=.@@other
+% .catcode`."=.@@other
+% .catcode`./=.@@other
+% .catcode`.'=.@@other
+% .catcode`.~=.@@other
+% .catcode`.#=.@@other
+% .let &=.doXMLentity
+% .unexpanded.def<B.doXMLelementE*
+% .ifcase.XMLtokensreduction
+% .entitleXMLescapetokens
+% .or
+% .reduceXMLescapetokens
+% .else
+% .ignoreXMLescapetokens
+% .fi
+% .processingXMLtrue
+% .the.everyenableXML
+% E
+%
+% .gdef.activateXMLescapetokens
+% B.catcode`.$=.@@active
+% .catcode`.%=.@@active
+% .catcode`.\=.@@active
+% .catcode`.^=.@@active
+% .catcode`._=.@@active
+% .catcode`.{=.@@active
+% .catcode`.}=.@@active
+% .catcode`.|=.@@active
+% E
+%
+% .xdef.entitleXMLescapetokens
+% B.noexpand.activateXMLescapetokens
+% .noexpand.def.noexpand#B.noexpand&.string#035;E*
+% .noexpand.def.noexpand$B.noexpand&.string#036;E*
+% .noexpand.def.noexpand%B.noexpand&.string#037;E*
+% .noexpand.def.noexpand\B.noexpand&.string#092;E*
+% .noexpand.def.noexpand^B.noexpand&.string#094;E*
+% .noexpand.def.noexpand_B.noexpand&.string#095;E*
+% .noexpand.def.noexpand{B.noexpand&.string#123;E*
+% .noexpand.def.noexpand}B.noexpand&.string#125;E*
+% .noexpand.def.noexpand|B.noexpand&.string#124;E*
+% E
+%
+% .gdef.reduceXMLescapetokens
+% B.activateXMLescapetokens
+% .def#B.string#E*
+% .def$B.string$E*
+% .def%B.string%E*
+% .def\B.string\E*
+% .def^B.string^E*
+% .def_B.string_E*
+% .def{B.string{E*
+% .def}B.string}E*
+% .def|B.string|E*
+% E
+%
+% .gdef.ignoreXMLescapetokens
+% B.catcode`.$=.@@other
+% .catcode`.%=.@@other
+% .catcode`.\=.@@other
+% .catcode`.^=.@@other
+% .catcode`._=.@@other
+% .catcode`.{=.@@other
+% .catcode`.}=.@@other
+% .catcode`.|=.@@other
+% E
+%
+% * The following macro can be invokes when reading from
+% * an auxiliary file.
+%
+% .unexpanded.gdef.enableXMLelements
+% B.catcode60=.@@active * .catcode`.<=.@@active
+% .catcode62=.@@other * .catcode`.>=.@@other
+% .unexpanded.def<B.doXMLelementE*
+% .processingXMLtrue
+% E
+%
+% .unexpanded.gdef.disableXMLelements
+% B.catcode60=.@@active * .catcode`.<=.@@active
+% .catcode62=.@@other * .catcode`.>=.@@other
+% .let<.relax * new
+% .processingXMLfalse
+% E
+%
+% .global.let<.relax * new
+% .global.let&.relax * new
+%
+% .egroup
+%
+% \def\disableXML
+% {\setnormalcatcodes\processingXMLfalse}
+
+\defcatcodecommand\xmlcatcodese `\& \doXMLentity
+\defcatcodecommand\xmlcatcodese `\< \doXMLelement
+\defcatcodecommand\xmlcatcodesr `\& \doXMLentity
+\defcatcodecommand\xmlcatcodesr `\< \doXMLelement
+\defcatcodecommand\xmlcatcodesn `\& \doXMLentity
+\defcatcodecommand\xmlcatcodesn `\< \doXMLelement
+
+\letcatcodecommand\xmlcatcodesr `\# \letterhash
+\letcatcodecommand\xmlcatcodesr `\$ \letterdollar
+\letcatcodecommand\xmlcatcodesr `\% \letterpercent
+\letcatcodecommand\xmlcatcodesr `\\ \letterbackslash
+\letcatcodecommand\xmlcatcodesr `\^ \letterhat
+\letcatcodecommand\xmlcatcodesr `\_ \letterunderscore
+\letcatcodecommand\xmlcatcodesr `\{ \letterleftbrace
+\letcatcodecommand\xmlcatcodesr `\} \letterrightbrace
+\letcatcodecommand\xmlcatcodesr `\| \letterbar
+
+\bgroup \catcode`\&=13 \let&\relax
+
+\xdef\entityhash {&\string#035;}
+\xdef\entitydollar {&\string#036;}
+\xdef\entitypercent {&\string#037;}
+\xdef\entitybackslash {&\string#092;}
+\xdef\entityhat {&\string#094;}
+\xdef\entityunderscore{&\string#095;}
+\xdef\entityleftbrace {&\string#123;}
+\xdef\entityrightbrace{&\string#125;}
+\xdef\entitybar {&\string#124;}
+
+\egroup
+
+\letcatcodecommand\xmlcatcodese `\# \entityhash
+\letcatcodecommand\xmlcatcodese `\$ \entitydollar
+\letcatcodecommand\xmlcatcodese `\% \entitypercent
+\letcatcodecommand\xmlcatcodese `\\ \entitybackslash
+\letcatcodecommand\xmlcatcodese `\^ \entityhat
+\letcatcodecommand\xmlcatcodese `\_ \entityunderscore
+\letcatcodecommand\xmlcatcodese `\{ \entityleftbrace
+\letcatcodecommand\xmlcatcodese `\} \entityrightbrace
+\letcatcodecommand\xmlcatcodese `\| \entitybar
+
+% we speed things up by explicitly setting the active char's < &
+
+\doifmodeelse {mkiv} {
+
+ \def\mksetXMLtokensreduction % mkiv
+ {\setcatcodetable\xmlcatcodesn}
+
+} {
+
+ \def\mksetXMLtokensreduction % mkii
+ {\ifcase\XMLtokensreduction
+ \setcatcodetable\xmlcatcodese \or
+ \setcatcodetable\xmlcatcodesr \else
+ \setcatcodetable\xmlcatcodesn
+ \fi}
+
+}
+
+\bgroup \catcode`\<=13 \catcode`\&=13
+
+\gdef\enableXML
+ {\mksetXMLtokensreduction
+ \let&\doXMLentity
+ \unexpanded\def<{\doXMLelement}%
+ \processingXMLtrue
+ \the\everyenableXML}
+
+\gdef\disableXML
+ {\setcatcodetable\ctxcatcodes % maybe \texcatcodes
+ \processingXMLfalse}
+
+\gdef\enableXMLexpansion
+ {\def<{\doXMLelement}%
+ \let&\doXMLentity}
+
+\gdef\disableXMLexpansion
+ {\unexpanded\def<{\doXMLelement}%
+ \let&\doXMLentity}
+
+\unexpanded\gdef\enableXMLelements
+ {\catcode60=\@@active
+ \catcode62=\@@other
+ \unexpanded\def<{\doXMLelement}%
+ \processingXMLtrue}
+
+\unexpanded\gdef\disableXMLelements
+ {\catcode60=\@@active
+ \catcode62=\@@other
+ \let<\relax
+ \processingXMLfalse}
+
+\global\let<\relax
+\global\let&\relax
+
+\egroup
+
+%D An element can be singular or paired. A singular element is
+%D called an empty element. The following definitions are
+%D equivalent:
+%D
+%D \starttyping
+%D <eerste></eerste> <eerste/> <eerste />
+%D \stoptyping
+%D
+%D Empty elements can have arguments too. Conforming the
+%D standard, each key must have a value. These are separated
+%D by an \type {=} sign and the value is delimited by either
+%D \type {"} or \type {'}. There may be spaces around the
+%D equal sign.
+%D
+%D \starttyping
+%D <eerste a= "b" c ="d" /> <eerste a = "b" c="d"/>
+%D \stoptyping
+%D
+%D Officially the following definition is not valid:
+%D
+%D \starttyping
+%D <eerste>some text</eerste> <eerste/> <eerste />
+%D \stoptyping
+%D
+%D Although we can handle both cases independently, this is
+%D seldom needed.
+%D
+%D Processing instructions are identified by a~\type {?} and are
+%D like empty elements.
+%D
+%D \starttyping
+%D <?doel a="b" c="d"?> <?doel a="b" c="d" ?>
+%D \stoptyping
+%D
+%D Comment is formatted as follows.
+%D
+%D \starttyping
+%D <!-- comment -->
+%D \stoptyping
+%D
+%D Verbatim code inits purest form is called \type {CDATA} and
+%D is embedded in the following ugly and therefore recognizable
+%D way:
+%D
+%D \starttyping
+%D <![CDATA[
+%D Dit is nogal verbatim !
+%D Dit is nogal verbatim !
+%D Dit is nogal verbatim !
+%D ]]>
+%D \stoptyping
+
+%D The parser is implemented as a multi||step macro. Because
+%D \type {!} and \type {?} should be picked up correctly, we
+%D need to define a few macros in unprotected mode!
+%D
+%D Because \XML\ is defined with some restrictions in mind,
+%D parsing the elements is not that complicated. First we have
+%D to determine if we're dealing with a comment or processing
+%D instruction. We need a bit of grouping because we have to
+%D mess up with catcodes. We probably have to treat a few
+%D more catcode and first character cases. We need to use
+%D \type {\begingroup} here, otherwise we get funny spaces in
+%D math.
+
+%D Maybe I will remove grouping here and introduce \type
+%D {\obeyXMLlines}.
+
+%D By using a few {\expandafter}'s we can avoid a \type {\next}
+%D construction. We could speed the first char test up a bit
+%D by using an installer and something \typ {\getvalue
+%D {#1doXMLelement}} (todo).
+
+\protect % we need an normal ! ?
+
+% \long\def\doXMLelement#1%
+% {\if#1!\expandafter \xparseXMLescape \else
+% \if#1?\expandafter\expandafter\expandafter \xparseXMLprocess \else
+% \expandafter\expandafter\expandafter \xparseXMLelement \fi\fi
+% #1}
+
+\def\expandthree{\expandafter\expandafter\expandafter}
+
+\long\def\doXMLelement#1%
+ {\if#1!\expandafter \xparseXMLescape \else
+ \if#1?\expandthree \xparseXMLprocess \else
+ \expandthree \xparseXMLelement \fi\fi
+ #1}
+
+% does it end with ? or ?>
+
+\long\def\xparseXMLescape !#1 {\parseXMLescape{#1}}
+\long\def\xparseXMLprocess ?#1 #2>{\parseXMLprocess{#1}{#2}}
+\long\def\xparseXMLelement #1>{\parseXMLelement #1 >}
+
+%D The escape handler takes care of the fuzzy \type {<!}
+%D constructs. Unfortunately, we need to catch \type {<--text}
+%D too, so we need another handler:
+
+\long\def\xparseXMLescape !#1#2%
+ {\if#1-%
+ \if#2-%
+ \expandafter\expandafter\expandafter\xxparseXMLescape
+ \else
+ \expandafter\expandafter\expandafter\xyparseXMLescape
+ \fi
+ \else
+ \if#1[%
+ \expandafter\expandafter\expandafter\xzparseXMLescape
+ \else
+ \expandafter\expandafter\expandafter\xyparseXMLescape
+ \fi
+ \fi#1#2}
+
+\long\def\xxparseXMLescape--#1{\parseXMLescape{--}#1}
+\long\def\xyparseXMLescape#1 {\parseXMLescape{#1}}
+\long\def\xzparseXMLescape[#1[{\parseXMLescape{#1}}
+
+%D Now the real work can begin.
+
+\unprotect
+
+\def\defineXMLescape[#1]#2%
+ {\unspaceargument#1\to\ascii % get rid of {}, like in {CDATA[}
+ \long\setvalue{\@@XMLescape:\ascii}{#2}}
+
+\def\parseXMLescape#1% #2> parsing takes place in macros
+ {\executeifdefined{\@@XMLescape:#1}{\csname\@@XMLescape:\s!default\endcsname}}
+
+%D In our case, processing instructions are only needed if
+%D we want specific \CONTEXT\ support. This may be useful in
+%D applications where the data is generated by an
+%D application. We will implement a \CONTEXT\ code handler
+%D later.
+
+%D The processing instructions handler is implemented as
+%D follows.
+
+\long\def\defineXMLprocessor[#1]#2%
+ {\long\setvalue{\@@XMLinstruction:#1}{#2}}
+
+% \def\parseXMLprocess#1#2%
+% {\executeifdefined{\@@XMLinstruction:#1}\gobbleoneargument{#2}}
+
+%D Because we support \type {.. ?>} as well as \type {.. >}
+%D end||of||pi situations, we need to clean up the ending
+%D \type {?}.
+
+\protect
+
+\long\def\cleanupXMLprocess#1%
+ {\docleanupXMLprocess#1 ? \relax}
+
+\long\def\docleanupXMLprocess#1? #2\relax
+ {\def\currentXMLprocess{#1}}
+
+\unprotect
+
+\def\parseXMLprocess#1#2%
+ {\cleanupXMLprocess{#2}%
+ \defconvertedcommand\ascii{#1}%
+ %\writestatus{xml-process}{\ascii}
+ \expanded
+ {\executeifdefined
+ {\@@XMLinstruction:\ascii}
+ \noexpand\gobbleoneargument
+ {\expandafter\noexpand\currentXMLprocess}}}
+
+%D One never knows:
+
+\let\normalparseXMLescape \parseXMLescape
+\let\normalparseXMLelement\parseXMLelement
+\let\normalparseXMLprocess\parseXMLprocess
+
+%D Next we will implement the normal element handler. This
+%D piece of code is complicated by the fact that we need to
+%D handle namespaces.
+
+\let\currentXMLarguments \empty
+\let\currentXMLelement \empty % name
+\let\currentXMLidentifier\empty % name or name/
+\let\currentXMLnamespace \empty % the (remapped) namespace
+\let\originalXMLnamespace\empty % the unremapped namespace
+\let\rawXMLidentifier \empty
+
+\def\rawXMLnamespace
+ {\ifx\currentXMLnamespace\empty\else\currentXMLnamespace:\fi}
+
+\def\rawXMLelement{\rawXMLnamespace\rawXMLidentifier}
+
+%D The following token list register provided the user a hook
+%D for extensions.
+
+\newtoks\everyXMLelement
+
+%D We try to keep track of the nature of an element. This
+%D flag can be used for special purposes (as in the pretty
+%D printing macros).
+
+\chardef\kindofXMLelement=0
+
+\chardef\beginXMLtag=1
+\chardef\endXMLtag =2
+\chardef\emptyXMLtag=3
+
+%D We do a rather hard coded scan for the namespace attribute. This
+%D is needed because its value determines further namespace related
+%D actions.
+
+\def\openXMLargument{ /}
+
+\long\def\parseXMLelement#1#2 #3>%
+ {\def\currentXMLarguments{#3}% including end /
+ \if#1/%
+ \chardef\kindofXMLelement\endXMLtag
+ \def\currentXMLelement{#2}%
+ \else
+ \docleanupXMLelement#1#2/\empty\relax
+ \fi
+ \ifx\currentXMLarguments\openXMLargument
+ \chardef\kindofXMLelement\emptyXMLtag
+ \fi
+ \@EA\splitoffXMLnamespace\currentXMLelement::\relax
+ \ifcase\kindofXMLelement
+ % can't happen
+ \or
+ % begintag or emptytag with arguments or space before /
+ \the\everyXMLelement % only for begin/empty tag !
+ \ifx\currentXMLarguments\empty \else
+ \dogetXMLarguments\rawXMLelement#3>%
+ \fi
+ \or
+ % no arguments
+ \or
+ % empty element without arguments (but possible presets)
+ \the\everyXMLelement
+ \fi
+ \ifcase\kindofXMLelement\or
+ \let \currentXMLidentifier \rawXMLidentifier
+ \edef\currentXMLfullidentifier {\rawXMLelement }%
+ \or
+ \edef\currentXMLidentifier {/\rawXMLidentifier }%
+ \edef\currentXMLfullidentifier{/\rawXMLelement }%
+ \or
+ \edef\currentXMLidentifier {\rawXMLidentifier/}%
+ \edef\currentXMLfullidentifier {\rawXMLelement /}%
+ \fi
+ \iftraceXMLelements\traceXMLelement\fi
+ \executeXMLelement}
+
+\long\def\docleanupXMLelement#1/#2#3\relax
+ {\def\currentXMLelement{#1}% watch out: \empty == begin or empty tag
+ \chardef\kindofXMLelement\ifx#2\empty\beginXMLtag\else\emptyXMLtag\fi}
+
+\def\@@traceXMLelement
+ {\originalXMLfullidentifier
+ \ifx\originalXMLfullidentifier\currentXMLfullidentifier\else
+ \space=>\space\currentXMLfullidentifier
+ \fi
+ \ifx\currentXMLarguments\empty\else
+ \space\string|\space\currentXMLarguments
+ \fi}
+
+\long\def\traceXMLelement
+ {\edef\originalXMLfullidentifier{\someXMLelementID\currentXMLelement}%
+ \cleanupXMLarguments\writestatus{xml-element}{\@@traceXMLelement}}
+
+%D We split off the namespace part, construct the
+%D identifier, and remap the namespace if needed.
+
+\def\splitoffXMLnamespace#1:#2:#3\relax
+ {\def\rawXMLidentifier{#2}%
+ \ifx\rawXMLidentifier\empty
+ \let\currentXMLnamespace\empty
+ \edef\rawXMLidentifier{#1}%
+ \else
+ \edef\currentXMLnamespace{#1}%
+ \fi
+ \let\originalXMLnamespace\currentXMLnamespace
+ \checkXMLnamespace\rawXMLidentifier}
+
+\def\xsplitoffXMLnamespace% fast resplit
+ {\ifcsname\@@XMLnamespace:\currentXMLnamespace\endcsname
+ \csname\@@XMLnamespace:\currentXMLnamespace\endcsname
+ \fi}
+
+%D We will implement this macro later.
+
+\let\checkXMLnamespace\gobbleoneargument % see below
+
+%D The namespace attribute checking is part of the element
+%D parser, since the value of \type {xmlns} may influence other
+%D namespace mapping.
+
+\def\@@XMLns{xmlns}
+
+\def\checkXMLnamespaceattr#1% xmlns:\@@XMLname="\XMLns"
+ {\edef\XMLns{#1}%
+ \ifx\XMLns\empty \else
+ \ifcsname\@@XMLurlspace:\XMLns\endcsname
+ % get remapped namespace (from url)
+ % \edef\XMLns{\csname\@@XMLurlspace:\XMLns\endcsname}%
+ \@EA\let\@EA\XMLns\csname\@@XMLurlspace:\XMLns\endcsname
+ % remap this one
+ \ifx\@@XMLname\empty
+ % not watertight since no implicit grouping
+ \xautoXMLnamespace\XMLns
+ \else
+ \xremapXMLnamespace\@@XMLname\XMLns
+ % redo namespace remapping of self if needed
+ \ifx\XMLns\currentXMLnamespace
+ % i'm still not sure if this is ok
+ \else
+ \xsplitoffXMLnamespace
+ \fi
+ \fi
+ \fi
+ \fi}
+
+%D Although not really needed, we clean up the arguments.
+
+% \long\def\cleanupXMLarguments
+% {\ifnum\kindofXMLelement=\emptyXMLtag
+% \ifx\currentXMLarguments\empty \else
+% \@EA\docleanupXMLarguments\currentXMLarguments/\empty
+% \fi
+% \fi}
+%
+% \long\def\docleanupXMLarguments#1/#2\empty
+% {\edef\currentXMLarguments{#1}}
+%
+% we need to be ...="/" .... /> safe
+
+\long\def\cleanupXMLarguments
+ {\ifnum\kindofXMLelement=\emptyXMLtag
+ \ifx\currentXMLarguments\empty \else
+ \@EA\docleanupXMLarguments\currentXMLarguments/ \relax
+ \fi
+ \else\ifnum\kindofXMLelement=\beginXMLtag
+ \ifx\currentXMLarguments\space
+ \let\currentXMLarguments\empty
+ \fi
+ \fi\fi}
+
+% \long\def\docleanupXMLarguments#1/ #2\relax % space added earlier
+% {\edef\currentXMLarguments{#1}}
+%
+% \startbuffer
+% <xsl:value-of select="map[@att=$variable]/@att2"/>
+% \stopbuffer
+%
+% \showXMLbuffer
+%
+% No \type {\edef} in the following, else \showXMLbuffer fails:
+
+\long\def\docleanupXMLarguments#1/ #2\relax % space added earlier
+ {\def\currentXMLarguments{#1}} % no \edef, goes wrong in \showXML
+
+\def\executeXMLelementA % no fallback
+ {\ifcsname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \csname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \fi}
+
+\def\executeXMLelementB % default fallback
+ {\csname \@@XMLelement:%
+ \ifcsname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \currentXMLfullidentifier
+ \else
+ \defaultXMLelementID % was \s!default
+ \fi
+ \endcsname}
+
+\def\executeXMLelementC % no namespace of default fallback
+ {\csname \@@XMLelement:%
+ \ifcsname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \currentXMLfullidentifier
+ \else\ifcsname\@@XMLelement:\currentXMLidentifier\endcsname
+ \currentXMLidentifier
+ \else
+ \defaultXMLelementID % was \s!default
+ \fi\fi
+ \endcsname}
+
+\def\executeXMLelementD
+ {\csname
+ \ifcsname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \@@XMLelement:\currentXMLfullidentifier
+ \else\ifcsname\@@XMLelement:\currentXMLidentifier\endcsname
+ \@@XMLelement:\currentXMLidentifier
+ \else
+ \executeXMLelementDD % less skipping and thereby faster
+ \fi\fi
+ \endcsname}
+
+\def\executeXMLelementDD % now forget about tex mapping
+ {\ifcsname\normal@@XMLelement:\currentXMLfullidentifier\endcsname
+ \normal@@XMLelement:\currentXMLfullidentifier
+ \else\ifcsname\normal@@XMLelement:\currentXMLidentifier\endcsname
+ \normal@@XMLelement:\currentXMLidentifier
+ \else
+ \normal@@XMLelement:\defaultXMLelementID % was \@@XMLelement:\s!default
+ \fi\fi}
+
+\def\setXMLfallbackmode#1%
+ {\ifcase#1\relax
+ \let\executeXMLelement \executeXMLelementA
+ \let\automateXMLnamespace\automateXMLnamespaceA
+ \or % 1
+ \let\executeXMLelement \executeXMLelementB
+ \let\automateXMLnamespace\automateXMLnamespaceB
+ \or % 2
+ \let\executeXMLelement \executeXMLelementC
+ \let\automateXMLnamespace\automateXMLnamespaceC
+ \or % 3
+ \let\executeXMLelement \executeXMLelementD
+ \let\automateXMLnamespace\automateXMLnamespaceD
+ \fi}
+
+\setXMLfallbackmode3 % was 2
+
+%D An example of fall back modes is given below.
+
+%D The automated namespace stuff is new and yet undocumented
+%D (see resource libraries for usage).
+
+\def\xautoXMLnamespace#1% fast internal one
+ {\ifcsname\@@XMLnamespace-#1\endcsname\else
+ \@EA\appendtoks\csname\@@XMLnamespace-#1\endcsname\to\autoXMLnamespaces
+ \fi
+ \@EA\edef\csname\@@XMLnamespace-#1\endcsname
+ {\noexpand\edef\noexpand\@axmlns@{#1}% quicker #1 -> \#1
+ \noexpand\doautoXMLnamespace\noexpand\@axmlns@}}
+
+\def\doautoXMLnamespace#1% \done is set before list
+ {\ifdone\else\automateXMLnamespace#1\fi}
+
+\def\automateXMLnamespaceA#1%
+ {\ifcsname\@@XMLelement:#1:\checkedXMLnamespace\endcsname
+ \let\currentXMLnamespace#1%
+ \else\ifcsname\@@XMLelement:#1:\checkedXMLnamespace/\endcsname
+ \let\currentXMLnamespace#1%
+ \fi\fi}
+
+\let\automateXMLnamespaceB\automateXMLnamespaceA
+\let\automateXMLnamespaceC\automateXMLnamespaceA
+
+\def\automateXMLnamespaceD#1%
+ {\ifcsname\@@XMLelement:#1:\checkedXMLnamespace\endcsname
+ \let\currentXMLnamespace#1%
+ \else\ifcsname\normal@@XMLelement:#1:\checkedXMLnamespace\endcsname
+ \let\currentXMLnamespace#1%
+ \else
+ \automateXMLnamespaceDD#1%
+ \fi\fi}
+
+\def\automateXMLnamespaceDD#1%
+ {\ifcsname\@@XMLelement:#1:\checkedXMLnamespace/\endcsname
+ \let\currentXMLnamespace#1%
+ \else\ifcsname\normal@@XMLelement:#1:\checkedXMLnamespace/\endcsname
+ \let\currentXMLnamespace#1%
+ \fi\fi}
+
+%D Later we will implement the error handler, here we handle
+%D the default case.
+
+\def\someXMLelementID#1%
+ {\ifnum\kindofXMLelement=\endXMLtag /\fi
+ #1%
+ \ifnum\kindofXMLelement=\emptyXMLtag/\fi}
+
+\def\defaultXMLelementID
+ {\someXMLelementID\s!default}
+
+%D It is possible to keep track of nesting automatically,
+%D but this would kind of prohibit things like \type
+%D {\ignorespaces}. In the future we may provide an
+%D automatic depth tracking as an alternative (exclusive)
+%D mode of operation combined with space grabbing.
+
+\def\beginXMLelement
+ {\global\advance\XMLdepth\plusone
+ \global\@EA\let\csname\@@XMLdepth:\the\XMLdepth\endcsname\currentXMLelement
+ }%\writestatus{XML TRACE}{[begin] [\the\XMLdepth] [\XMLself]}}
+
+\def\endXMLelement
+ {%\writestatus{XML TRACE}{[end] [\the\XMLdepth] [\XMLself]}%
+ \global\@EA\let\csname\@@XMLdepth:\the\XMLdepth\endcsname\undefined
+ \global\advance\XMLdepth\minusone}
+
+% 0 = nothing
+% 1 = unknown
+% 2 = current element
+
+\chardef\XMLancestormode=2 % never change this one globally
+
+% \def\XMLancestor#1%
+% {\ifnum\numexpr(\XMLdepth-#1)>0
+% \csname\@@XMLdepth:\the\numexpr(\XMLdepth-#1)\endcsname
+% \else
+% \ifcase\XMLancestormode\or\s!unknown\or\currentXMLelement\fi
+% \fi}
+
+\def\XMLancestor#1%
+ {\ifnum\numexpr\XMLdepth-#1\relax>\zerocount
+ \csname\@@XMLdepth:\the\numexpr\XMLdepth-#1\relax\endcsname
+ \else
+ \ifcase\XMLancestormode\or\s!unknown\or\currentXMLelement\fi
+ \fi}
+
+% \def\XMLpureancestor#1%
+% {\ifnum\numexpr(\XMLdepth-#1)>0
+% \csname\@@XMLdepth:\the\numexpr(\XMLdepth-#1)\endcsname
+% \fi}
+
+\def\XMLpureancestor#1%
+ {\ifcase\numexpr\XMLdepth-#1\relax\or
+ \csname\@@XMLdepth:\the\numexpr\XMLdepth-#1\relax\endcsname
+ \fi}
+
+\def\XMLparent {\XMLancestor \plusone }
+\def\XMLself {\XMLancestor \zerocount}
+\def\XMLpureparent{\XMLpureancestor\plusone }
+\def\XMLpureself {\XMLpureancestor\zerocount}
+
+% \def\XMLpureancestor#1%
+% {\csname
+% \ifnum\numexpr(\XMLdepth-#1)>\zerocount
+% \@@XMLdepth:\the\numexpr(\XMLdepth-#1)%
+% \else
+% \s!empty
+% \fi
+% \endcsname}
+
+\def\XMLpureparent
+ {\XMLpureancestor\plusone}
+
+% probleem: depth is vast en dus ook ancestor
+
+% \XMLinh{...} will backtrack definitions (given that the elements
+% use begin/end, the backtracking stops when a non-empty value is
+% encountered; maybe we will add some keyword (inherit) some day
+
+\def\XMLinhpar#1#2%
+ {\@EA\ifx\csname\@@XMLvariable:#1:#2\endcsname\empty
+ \@EA\pXMLinh
+ \else
+ \csname\@@XMLvariable:#1:#2\endcsname
+ \@EA\gobbletwoarguments
+ \fi\XMLdepth{#2}}
+
+\def\XMLinh
+ {\XMLinhpar\currentXMLelement}
+
+% \def\pXMLinh#1%
+% {\@EA\ppXMLinh\@EA{\the\numexpr(#1-\plusone)}}
+
+\def\pXMLinh#1%
+ {\@EA\ppXMLinh\@EA{\the\numexpr#1-\plusone\relax}}
+
+\def\ppXMLinh#1#2%
+ {\@EA\ifx\csname\@@XMLvariable:#1:#2\endcsname\empty
+ \ifnum#1>\plusone
+ \@EAEAEA\pXMLinh
+ \else
+ \@EAEAEA\gobbletwoarguments
+ \fi
+ \else
+ \csname\@@XMLvariable:#1:#2\endcsname
+ \@EA\gobbletwoarguments
+ \fi{#1}{#2}}
+
+% better
+%
+% \def\XMLpureancestor#1%
+% {\ifcsname\@@XMLdepth:\the\numexpr(\XMLdepth-#1)\endcsname
+% \csname\@@XMLdepth:\the\numexpr(\XMLdepth-#1)\endcsname
+% \fi}
+
+% replaces macro in xtag-ini: ! ! !
+
+\def\edefXMLop#1#2% \macro{att}
+ {\edef#1%
+ {\csname\ifcsname\@@XMLvariable:\ownXMLelement:#2\endcsname
+ \@@XMLvariable:\ownXMLelement:#2\else\s!empty
+ \fi\endcsname}}
+
+\def\edefXMLinh#1#2% \macro{att}
+ {\edef#1{\XMLinh{#2}}}
+
+\def\edefXMLinhpar#1#2#3% \macro{tag}{att}
+ {\edef#1{\XMLinhpar{#2}{#3}}}
+
+% \def\doifXMLopdef#1#2% \macro{att}
+% {\ifcsname\@@XMLvariable:\ownXMLelement:#1\endcsname
+% \@EA\let\@EA#1\csname\@@XMLvariable:\ownXMLelement:#1\endcsname
+% \expandafter\firstofoneargument
+% \else
+% \expandafter\gobbleoneargument
+% \fi}
+
+\fetchruntimecommand \tracebackXMLattribute {\f!xtagprefix\s!run}
+\fetchruntimecommand \showXMLinh {\f!xtagprefix\s!run}
+
+% \defineXMLenvironment[one]
+% {\beginXMLelement}
+% {\endXMLelement}
+%
+% \defineXMLenvironment[two]
+% {\beginXMLelement
+% \starttabulatie
+% \NC ancestor 1 \NC \XMLancestor{1} \NC \NR
+% \NC ancestor 2 \NC \XMLancestor{2} \NC \NR
+% \NC ancestor 3 \NC \XMLancestor{3} \NC \NR
+% \NC ancestor 4 \NC \XMLancestor{4} \NC \NR
+% \stoptabulatie}
+% {\endXMLelement}
+%
+% \startbuffer
+% <x:one> <x:two> <one> <two> </two> </one> </x:two> </x:one>
+% \stopbuffer
+%
+% {fallback A: \setXMLfallbackmode 0 \processXMLbuffer}\par
+% {fallback B: \setXMLfallbackmode 1 \processXMLbuffer}\par
+% {fallback C: \setXMLfallbackmode 2 \processXMLbuffer}\par
+
+% todo: split #1 into raws en reconstruct, set current etc, push and pop
+%
+% \def\beginXMLelement
+% {\dosingleempty\dobeginXMLelement}
+%
+% \def\dobeginXMLelement[#1]%
+% {\global\advance\XMLdepth 1
+% \global\@EA\let\csname\@@XMLdepth:\the\XMLdepth\endcsname\currentXMLelement
+% \global\@EA\edef\csname\@@XMLdopth:\the\XMLdepth\endcsname{\ownXMLelement}%
+% \iffirstargument\edef\ownXMLelement{#1}\fi}
+%
+% \def\endXMLelement
+% {\@EA\let\@EA\ownXMLelement\csname\@@XMLdopth:\the\XMLdepth\endcsname
+% \global\advance\XMLdepth -1 }
+
+%D \defineXMLenvironment[one]
+%D {\beginXMLelement}
+%D {\endXMLelement}
+%D
+%D \defineXMLenvironment[two]
+%D {\beginXMLelement
+%D \starttabulate
+%D \NC parent 1 \NC \XMLancestor{1} \NC \NR
+%D \NC parent 2 \NC \XMLancestor{2} \NC \NR
+%D \NC parent 3 \NC \XMLancestor{3} \NC \NR
+%D \NC parent 4 \NC \XMLancestor{4} \NC \NR
+%D \stoptabulate}
+%D {\endXMLelement}
+%D
+%D \startbuffer
+%D <x:one> <x:two> <one> <two> </two> </one> </x:two> </x:one>
+%D \stopbuffer
+%D
+%D fallback A: \setXMLfallbackmode0 \processXMLbuffer
+%D fallback B: \setXMLfallbackmode1 \processXMLbuffer
+%D fallback C: \setXMLfallbackmode2 \processXMLbuffer
+
+%D Here we do the namespace (re)mapping. More examples are
+%D provided in the manual.
+%D
+%D \starttyping
+%D \supportXMLnamespace [test] % needed to get a namespace working
+%D \skipXMLnamespace [test] % slow
+%D \ignoreXMLnamespace [test] % faster
+%D \defineXMLenvironment [rubish:itemize] {[} {]}
+%D \defineXMLenvironment [rubish:item] {(} {)}
+%D \remapXMLnamespace [crap] [rubish]
+%D \remapXMLnamespace [con] [context]
+%D \remapXMLurlspace [http://www.pragma-ade.com/dtd/context] [context]
+%D \autoXMLnamespace [context] % fallback
+%D \autoXMLnamespace [whatever] % second fall back
+%D \stoptyping
+
+\newtoks\autoXMLnamespaces
+
+%D The automatically mapped namespaces (the fallbacks so to
+%D day) are collected in a token list.
+
+\let\checkedXMLnamespace\empty
+
+\def\checkXMLnamespace#1%
+ {\edef\checkedXMLnamespace{#1}%
+ \ifcsname\@@XMLnamespace:\currentXMLnamespace\endcsname
+ \csname\@@XMLnamespace:\currentXMLnamespace\endcsname
+ % forced namespace
+ \else\ifcsname\@@XMLelement:\currentXMLelement\endcsname
+ % natural element
+ \else\ifcsname\@@XMLelement:\currentXMLelement/\endcsname
+ % natural element
+ \else
+ % locate fallback
+ \donefalse\the\autoXMLnamespaces
+ \fi\fi\fi}
+
+\def\skipXMLnamespace[#1]%
+ {\letvalue{\@@XMLnamespace:#1}\doXMLskipnamespace}
+
+\def\doXMLskipnamespace
+ {\long\@EA\def\csname\@@XMLelement:\checkedXMLnamespace\endcsname
+ {\getXMLgroupedignore\checkedXMLnamespace}}
+
+\def\hideXMLnamespace[#1]%
+ {\letvalue{\@@XMLnamespace:#1}\doXMLhidenamespace}
+
+\def\doXMLhidenamespace
+ {\long\@EA\def\csname\@@XMLelement:\checkedXMLnamespace\endcsname
+ {\redoXMLignore\checkedXMLnamespace}}
+
+\def\ignoreXMLnamespace[#1]%
+ {\letvalue{\@@XMLnamespace:#1}\doXMLignorenamespace}
+
+\def\doXMLignorenamespace % \let binnen def
+ {\long\@EA\def\csname\@@XMLelement:\checkedXMLnamespace\endcsname
+ {\@EA\redoXMLignore\@EA{\checkedXMLnamespace}}} % EA ?
+
+\def\remapXMLnamespace
+ {\dodoubleargument\doremapXMLnamespace}
+
+\def\doremapXMLnamespace[#1][#2]%
+ {\ifsecondargument
+ \setvalue{\@@XMLnamespace:#1}{\def\currentXMLnamespace{#2}}%
+ \else
+ \letvalue{\@@XMLnamespace:#1}\relax
+ \fi}
+
+\def\supportXMLnamespace%
+ {\dosingleargument\dosupportXMLnamespace}
+
+\def\dosupportXMLnamespace[#1]%
+ {\setvalue{\@@XMLnamespace:#1}{\def\currentXMLnamespace{#1}}}
+
+\def\xremapXMLnamespace#1#2% fast internal one
+ {\@EA\edef\csname\@@XMLnamespace:#1\endcsname
+ {\def\noexpand\currentXMLnamespace{#2}}}
+
+\def\autoXMLnamespace[#1]%
+ {\xautoXMLnamespace{#1}}
+
+\def\xautoXMLnamespace#1% fast internal one
+ {\ifcsname\@@XMLnamespace-#1\endcsname\else
+ \@EA\appendtoks\csname\@@XMLnamespace-#1\endcsname\to\autoXMLnamespaces
+ \fi
+ \@EA\edef\csname\@@XMLnamespace-#1\endcsname
+ {\noexpand\doautoXMLnamespace{#1}}}
+
+\def\doautoXMLnamespace#1% \done is set before list
+ {\ifdone\else
+ \ifcsname\@@XMLelement:#1:\checkedXMLnamespace\endcsname
+ \def\currentXMLnamespace{#1}%
+ \else\ifcsname\@@XMLelement:#1:\checkedXMLnamespace/\endcsname
+ \def\currentXMLnamespace{#1}%
+ \fi\fi
+ \fi}
+
+\def\resetXMLnamespace[#1]%
+ {\letvalue{\@@XMLnamespace-#1}\gobbleoneargument
+ \letvalue{\@@XMLnamespace:#1}\gobbleoneargument}
+
+\def\remapXMLurlspace
+ {\dodoubleargument\doremapXMLurlspace}
+
+\def\doremapXMLurlspace[#1][#2]%
+ {\setvalue{\@@XMLurlspace:#1}{#2}}
+
+%D Entities needs a bit more work, as well as a connection
+%D with the encoding handlers.
+
+% we need to be able to do:
+%
+% \defineXMLentity[amp] {\FunnyAmp} \def\FunnyAmp#1;{\getXMLentity{#1}}
+%
+% \defineXMLentity [pound] {(why not use euro's?)}
+%
+% \startXMLdata
+% test &amp;pound; test
+% \stopXMLdata
+%
+% so we need an ifless implementation
+%
+% also .. this should work:
+%
+% \defineXMLentity[ctx-var-textwidth] {\textwidth}
+%
+% \defineXMLcommand[test][width=\textwidth]
+% {\the\dimexpr\XMLop{width}\relax}
+%
+% \startXMLdata
+% <test width=".45&ctx-var-textwidth;"/>
+% <test width="&ctx-var-textwidth;"/>
+% \stopXMLdata
+
+% \eacute -> simplified -> e (via raw encoding)
+% -> raw -> eacute (via handler)
+%
+% naming sucks
+
+\newif\ifXMLrawentities % proper fallback
+\newif\ifXMLsimpleentities % last resort
+
+\def\simpleXMLencoding{raw}
+
+\ifnum\texengine=\luatexengine
+ \def\simplifyXMLentities
+ {\XMLsimpleentitiestrue}
+\else
+ \def\simplifyXMLentities
+ {\fastenableencoding\simpleXMLencoding
+ \XMLsimpleentitiestrue}
+\fi
+
+\def\defineXMLentity
+ {\dodoubleempty\dodefineXMLentity}
+
+\def\dodefineXMLentity[#1][#2]#3%
+ {\ifsecondargument
+ \defineXMLentities[#1]{#2}{#3}%
+ \else
+ \dododefineXMLentity{#1}{#3}%
+ \fi}
+
+\def\defineXMLentities[#1]#2#3%
+ {\dododefineXMLentity{#1}{\ifXMLsimpleentities#2\else#3\fi}}
+
+\def\dododefineXMLentity#1#2%
+ {\unspaceargument#1\to\ascii % #1 can be {[} or so
+ \long\setvalue{\@@XMLentity:\@EA\firstofoneargument\ascii}{#2}}
+
+\def\setXMLentity#1% fast one
+ {\long\@EA\def\csname\@@XMLentity:#1\endcsname}
+
+%D May this wile become dodo (more in tune with rest);
+%D beware: also remapped in xtag-map.
+
+\def\doXMLentity#1#2;% interesting: # is now ##
+ {\if\string#1\letterhash
+ \@EA\parseXMLcharacter
+ \else\ifXMLrawentities
+ \@EAEAEA\firstofoneargument
+ \else
+ \@EAEAEA\executeXMLentity
+ \fi\fi{#1#2}}
+
+%D Here we need to get rid of the double hash and act upon the
+%D number. Proper hex/oct number support can be implemented by
+%D redefining \type {\executeXMLcharacter}.
+
+% \def\parseXMLcharacter#1% gobble the ##x
+% {\@EA\executeXMLcharacter\@EA{\gobblethreearguments#1}}
+%
+% single hash now
+%
+% \def\parseXMLcharacter#1%
+% {\@EA\executeXMLcharacter\@EA{\gobbleoneargument#1}}
+%
+% \def\executeXMLcharacter#1% can be overloaded
+% {\ifnum"#1<256
+% \@EA\getXMLcharacter
+% \else\ifXMLrawentities
+% \@EAEAEA\firstofoneargument
+% \else
+% \@EAEAEA\unknownXMLcharacter
+% \fi\fi{\number"#1}}
+%
+% \unexpanded\def\getXMLcharacter#1{\rawcharacter{#1}}
+
+\def\parseXMLcharacter#1%
+ {\@EA\executeXMLcharacter\gobbleoneargument#1\empty\relax}
+
+\def\executeXMLcharacter#1#2\relax
+ {\if#1x%
+ \@EA\noexecuteXMLhexcharacter
+ \else
+ \@EA\doexecuteXMLdeccharacter
+ \fi#1#2\relax}
+
+\def\noexecuteXMLhexcharacter x#1\relax
+ {\uppercase{\doexecuteXMLhexcharacter#1\relax}}
+
+% \unexpanded\def\getXMLcharacter#1%
+% {\ifXMLrawentities
+% \@EA\firstofoneargument
+% \else\ifcsname\@@XMLentity:#1\endcsname
+% \@EAEAEA\getXMLentity
+% \else
+% \@EAEAEA\unicodechar % was: \rawcharacter
+% \fi\fi{#1}}
+%
+% \def\doexecuteXMLhexcharacter#1\relax{\getXMLcharacter{"#1}}
+% \def\doexecuteXMLdeccharacter#1\relax{\getXMLcharacter {#1}}
+%
+% if we want to support x in entity overloading, we prefer:
+
+\unexpanded\def\getXMLdeccharacter#1%
+ {\ifXMLrawentities
+ \@EA\rawXMLdecentity
+ \else\ifcsname\@@XMLentity:#1\endcsname
+ \@EAEAEA\getXMLdecentity
+ \else
+ \@EAEAEA\unicodechar
+ \fi\fi{#1}}
+
+\unexpanded\def\getXMLhexcharacter#1%
+ {\ifXMLrawentities
+ \@EA\rawXMLhexentity
+ \else\ifcsname\@@XMLentity:x#1\endcsname
+ \@EAEAEA\getXMLhexentity
+ \else
+ \@EAEAEA\unicodehexchar
+ \fi\fi{#1}}
+
+\def\unicodehexchar#1{\unicodechar{"#1}}
+
+\let\getXMLcharacter\getXMLdeccharacter
+
+\def\getXMLdecentity#1{\getXMLentity {#1}}
+\def\getXMLhexentity#1{\getXMLentity{x#1}}
+
+\def\rawXMLdecentity#1{#1}
+\def\rawXMLhexentity#1{x#1}
+
+\def\doexecuteXMLhexcharacter#1\relax{\getXMLhexcharacter{#1}}
+\def\doexecuteXMLdeccharacter#1\relax{\getXMLdeccharacter{#1}}
+
+% \defineXMLentity[8218] {Adam}
+% \defineXMLentity[x007D]{Eve}
+%
+% \startbuffer
+% &#64; &#8216; &#8218; &#8220; &#8221; &#8222;&#8226;
+% &amp;
+% &#x0024; &#x007B; &#x007D; &#x00A0; &#x2026;
+% \stopbuffer
+%
+% \typebuffer \processXMLbuffer
+
+% left overs
+
+\def\unknownXMLcharacter#1{[#1]}
+
+\ifx\unicodechar\undefined\let\unicodechar\rawcharacter\fi % brrrr
+
+% \useXMLfilter[ent]
+%
+% \defineXMLsingular[test]{{\simplifyXMLentities\XMLpar{test}{bla}{}}}
+%
+% \startXMLdata
+% <test bla="&#xD3;bla&eacute;bla&tex;and$and&#xFC;ziezo&#xF99;" />
+% \stopXMLdata
+%
+% \defineXMLentity[45]{|it works|} % {|-|}
+%
+% \startXMLdata
+% text&#045;&#046;text
+% text&#x045;&#x046;text
+% \stopXMLdata
+
+%D May be this will change a bit ...
+
+\def\executeXMLentity#1% named one
+ {\getXMLentity{#1}}
+
+%\def\expandedXMLentity#1%
+% {\ifcsname\@@XMLentity:#1\endcsname\csname\@@XMLentity:#1\endcsname\fi}
+%
+%\unexpanded\def\getXMLentity#1%
+% {\ifcsname\@@XMLentity:#1\endcsname\csname\@@XMLentity:#1\endcsname\fi}
+%
+%\def\expandedXMLentity#1%
+% {\csname\@@XMLentity:#1\endcsname}
+%
+%\unexpanded\def\getXMLentity#1%
+% {\csname\@@XMLentity:#1\endcsname}
+
+\doifundefined{autoXMLentitiestrue}{\expandafter\newif\csname ifautoXMLentities\endcsname} % fall back on context commands
+
+\def\expandedXMLentity#1%
+ {\ifcsname\@@XMLentity:#1\endcsname \@EA \execXMLentity
+ \else\ifautoXMLentities \@EAEAEA \autoXMLentity
+ \else \@EAEAEA \crapXMLentity
+ \fi\fi{#1}}
+
+\def\execXMLentity#1{\csname\@@XMLentity:#1\endcsname}
+\def\crapXMLentity#1{\inframed[\c!offset=.1ex]{\tttf#1}}
+\def\autoXMLentity#1{\ifcsname#1\endcsname\csname#1\endcsname\fi}
+
+\unexpanded\def\getXMLentity{\expandedXMLentity}
+
+%\def\doifXMLentityelse#1#2#3%
+% {\ifcsname\@@XMLentity:#1\endcsname#2\else#3\fi}
+
+\def\doifXMLentityelse#1%
+ {\ifcsname\@@XMLentity:#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% \letvalue{1@2}\firstoftwoarguments
+% \letvalue{2@2}\secondoftwoarguments
+%
+% \def\doifXMLentityelse#1%
+% {\csname\ifcsname\@@XMLentity:#1\endcsname1\else2\fi @2\endcsname}
+
+% see \defineXML... commands:
+%
+% [key=val] => \presetXMLarguments{element} => default key/vals
+% [blabla] => \theXMLarguments{blabla} => user key/vals
+% [blabla] [key=val] => \presetXMLarguments{element} => default key/vals
+% \theXMLarguments{blabla} => user key/vals
+%
+% <element key="val"> stored in case of [blabla] else set as \XMLpar
+%
+% see m-steps for an example of usage
+
+\let\@@XMLmapmap\empty
+\newif\ifXMLnamespace
+
+\long\def\getXMLarguments#1#2%
+ {\XMLnamespacefalse
+ \dogetXMLarguments{#1}#2>}
+
+\let\dosetXMLattributeA\gobbleoneargument
+
+\def\dosetXMLattributeB#1%
+ {\ifx\@@XMLspac\originalXMLnamespace
+ \@EA\def\csname\@@XMLvariable:\@@XMLclass:\@@XMLname\endcsname{#1}%
+ % maybe some day global handling here as well
+ \fi}
+
+\def\dosetXMLattributeC
+ {\@EA\def\csname\@@XMLvariable:\@@XMLclass\ifx\@@XMLspac
+ \originalXMLnamespace\else:\@@XMLspac\fi:\@@XMLname\endcsname}
+
+\def\dosetXMLattributeD
+ {\@EA\def\csname\@@XMLvariable:\@@XMLclass:\ifx\@@XMLspac
+ \originalXMLnamespace\currentXMLnamespace\else\@@XMLspac\fi:\@@XMLname\endcsname}
+
+\def\setXMLattributemode#1%
+ {\ifcase#1\relax
+ \let\dosetXMLattribute\dosetXMLattributeA
+ \or
+ \let\dosetXMLattribute\dosetXMLattributeB
+ \or
+ \let\dosetXMLattribute\dosetXMLattributeC
+ \or
+ \let\dosetXMLattribute\dosetXMLattributeD
+ \fi}
+
+\setXMLattributemode{2} % a reasonable default
+
+\let\@@XMLspac\empty % argumentnamespace
+
+\long\def\dogetXMLarguments#1%
+ {\XMLtoks\emptytoks
+ \ifcsname\@@XMLmap:#1\endcsname
+ \let\dodosetXMLargument\dodosetXMLargumentB
+ \else
+ \def\@@XMLclass{#1}%
+ \let\dodosetXMLargument\dodosetXMLargumentA
+ \fi
+ \let\dodoparseXMLarguments\doparseXMLarguments
+ \doparseXMLarguments}
+
+% \long\def\doparseXMLarguments#1% space goes ok
+% {\if#1>%
+% \let\dodoparseXMLarguments\empty
+% \else\if#1=%
+% \edef\@@XMLname{\the\XMLtoks}%
+% \XMLtoks\emptytoks
+% \else\if#1"%
+% \let\dodoparseXMLarguments\dodoparseXMLargumentsD
+% \else\if#1'%
+% \let\dodoparseXMLarguments\dodoparseXMLargumentsS
+% \else\if#1:%
+% \XMLnamespacetrue
+% \edef\@@XMLspac{\the\XMLtoks}%
+% \XMLtoks\emptytoks
+% \else\if#1/%
+% \chardef\kindofXMLelement\emptyXMLtag
+% \else
+% \XMLtoks\@EA{\the\XMLtoks#1}%
+% \fi\fi\fi\fi\fi\fi
+% \dodoparseXMLarguments}
+%
+% The next speed optimization is suggested by Taco. Since we
+% are dealing with validated code, we can grab larger chunks.
+%
+% \long\def\doparseXMLarguments#1% space goes ok
+% {\if#1>%
+% \let\dodoparseXMLarguments\empty
+% \else\if#1/%
+% \chardef\kindofXMLelement\emptyXMLtag
+% \else
+% \XMLtoks{#1}%
+% \let\dodoparseXMLarguments\dodoparseXMLargumentsX
+% \fi\fi
+% \dodoparseXMLarguments}
+%
+% we can get rid of one more assignment
+
+\long\def\doparseXMLarguments#1% space goes ok
+ {\if#1>%
+ %\let\dodoparseXMLarguments\empty
+ \expandafter\gobbleoneargument % speedup
+ \else\if#1/%
+ \chardef\kindofXMLelement\emptyXMLtag
+ \else
+ \XMLtoks{#1}%
+ \let\dodoparseXMLarguments\dodoparseXMLargumentsX
+ \fi\fi
+ \dodoparseXMLarguments}
+
+% slightly faster:
+%
+% \long\def\doparseXMLarguments#1% space goes ok
+% {\if#1>%
+% \@EA\gobbleoneargument
+% \else\if#1/%
+% \chardef\kindofXMLelement\emptyXMLtag
+% \@EAEAEA\gobbletwoarguments
+% \else
+% \@EAEAEA\dodoparseXMLargumentsX
+% \fi\fi#1}
+%
+% \def\dodoparseXMLargumentsX#1=#2%
+% {\def\@@XMLname{#1}%
+% \getXMLNSSSS#1:\relax
+% \if#2"%
+% \expandafter\dodoparseXMLargumentsD
+% \else
+% \expandafter\dodoparseXMLargumentsS
+% \fi}
+
+\def\dodoparseXMLargumentsX#1=#2%
+ {\edef\@@XMLname{\the\XMLtoks#1}%
+ \@EA\getXMLNSSSS\@@XMLname:\relax
+ \XMLtoks\emptytoks
+ \if#2"%
+ \let\dodoparseXMLarguments\dodoparseXMLargumentsD
+ \else
+ \let\dodoparseXMLarguments\dodoparseXMLargumentsS
+ \fi
+ \dodoparseXMLarguments}
+
+\def\gobbleuntilcolon#1:{#1}
+
+\def\getXMLNSSSS#1:#2\relax
+ {\def\!!stringa{#2}%
+ \ifx\!!stringa\empty \else
+ \XMLnamespacetrue
+ \edef\@@XMLname{\gobbleuntilcolon#2}%
+ \edef\@@XMLspac{#1}%
+ \fi}
+
+% ok ?
+%
+% \def\dodoparseXMLargumentsX#1=#2%
+% {\edef\@@XMLname{\the\XMLtoks#1}%
+% \@EA\getXMLNSSSS\@@XMLname:\relax
+% \XMLtoks\emptytoks
+% \if#2"%
+% \@EA\dodoparseXMLargumentsD
+% \else
+% \@EA\dodoparseXMLargumentsS
+% \fi}
+
+% Storing \type {#1} in a macro in order to minimize the
+% amount of data passed as argument does not improve
+% performance, so we keep the readable form.
+
+\def\dodoparseXMLargumentsD#1"{\dosetXMLargument{#1}}
+\def\dodoparseXMLargumentsS#1'{\dosetXMLargument{#1}}
+
+% the readable version
+%
+% \def\dosetXMLargument#1%
+% {\ifXMLnamespace
+% \ifx\@@XMLspac\@@XMLns
+% \checkXMLnamespaceattr{#1}% xmlns:\@@XMLname="#1"
+% \else
+% \dosetXMLattribute{#1}% some:\@@XMLname="#1"
+% \fi
+% \XMLnamespacefalse
+% \else\ifx\@@XMLname\@@XMLns
+% \checkXMLnamespaceattr{#1}% xmlns="#1"
+% \else
+% \dodosetXMLargument{#1}%
+% \fi\fi
+% \let\dodoparseXMLarguments\doparseXMLarguments
+% \dodoparseXMLarguments}
+%
+% the ugly alternative
+
+% \def\dosetXMLargument#1% ugly alternative
+% {\ifXMLnamespace
+% \XMLnamespacefalse
+% \ifx\@@XMLspac\@@XMLns
+% \@EAEAEA\checkXMLnamespaceattr % xmlns:\@@XMLname="#1"
+% \else
+% \@EAEAEA\dosetXMLattribute % some:\@@XMLname="#1"
+% \fi
+% \else\ifx\@@XMLname\@@XMLns
+% \@EAEAEA\checkXMLnamespaceattr % xmlns="#1"
+% \else
+% \@EAEAEA\dodosetXMLargument
+% \fi\fi{#1}%
+% \let\dodoparseXMLarguments\doparseXMLarguments
+% \dodoparseXMLarguments}
+
+\def\dosetXMLargument#1% ugly alternative
+ {\ifXMLnamespace
+ \XMLnamespacefalse
+ \ifx\@@XMLspac\@@XMLns
+ \@EAEAEA\checkXMLnamespaceattr % xmlns:\@@XMLname="#1"
+ \else
+ \@EAEAEA\dosetXMLattribute % some:\@@XMLname="#1"
+ \fi
+ \else\ifx\@@XMLname\@@XMLns
+ \@EAEAEA\checkXMLnamespaceattr % xmlns="#1"
+ \else
+ \@EAEAEA\dodosetXMLargument
+ \fi\fi{#1}%
+ \dodocopyXMLargument
+ \let\dodoparseXMLarguments\doparseXMLarguments
+ \dodoparseXMLarguments}
+
+\let\dodocopyXMLargument\relax
+
+% \def\dododocopyXMLargument
+% {\@EA\let\csname\@@XMLvariable:\the\numexpr(\XMLdepth+1):\@@XMLname\@EA\endcsname
+% \csname\@@XMLvariable:\@@XMLclass:\@@XMLname\endcsname}
+
+\def\dododocopyXMLargument
+ {\@EA\let\csname\@@XMLvariable:\the\numexpr\XMLdepth+\plusone\relax:\@@XMLname\@EA\endcsname
+ \csname\@@XMLvariable:\@@XMLclass:\@@XMLname\endcsname}
+
+\def\copyXMLargumentindeed
+ {\let\dodocopyXMLargument\dododocopyXMLargument
+ \let\copyXMLargumentindeed\relax}
+
+\def\dodosetXMLargumentA
+ {\@EA\def\csname\@@XMLvariable:\@@XMLclass:\@@XMLname\endcsname}
+
+% \def\dodosetXMLargumentB#1%
+% {\@EA\edef\csname\@@XMLmap:\@@XMLmapmap\endcsname
+% {\@EA\ifx\csname\@@XMLmap:\@@XMLmapmap\endcsname\empty\else
+% \csname\@@XMLmap:\@@XMLmapmap\endcsname,%
+% \fi
+% \@@XMLname=#1}}
+
+\def\dodosetXMLargumentB#1%
+ {\@EA\edef\csname\@@XMLmap:\@@XMLmapmap\endcsname
+ {\@EA\ifx\csname\@@XMLmap:\@@XMLmapmap\endcsname\empty\else
+ \csname\@@XMLmap:\@@XMLmapmap\endcsname,%
+ \fi
+ \@@XMLname={#1}}} % {} is needed for aa='bb,cc'
+
+\appendtoks
+ \resetXMLarguments{\rawXMLnamespace\rawXMLidentifier}%
+\to \everyXMLelement
+
+\def\resetXMLarguments#1%
+ {\ifcsname\@@XMLmap:#1\endcsname
+ \@EA\let\@EA\@@XMLmapmap\csname\@@XMLmap:#1\endcsname
+ \@EA\let\csname\@@XMLmap:\@@XMLmapmap\endcsname\empty
+ \fi}
+
+\def\theXMLarguments#1%
+ {\ifcsname\@@XMLmap:#1\endcsname\csname\@@XMLmap:#1\endcsname\fi}
+
+\def\doexpandXMLvalue#1#2%
+ {\ifcsname#2\endcsname
+ \bgroup
+ \enableXMLexpansion
+ \let\getXMLentity\expandedXMLentity
+ #1% simplify maps entities back to _ and alike
+ \expanded{\global\globalscratchtoks{\csname#2\endcsname}}%
+ \egroup
+ \@EA\edef\csname#2\endcsname{\the\globalscratchtoks}%
+ \fi}
+
+\def\expandXMLvalue {\doexpandXMLvalue\relax}
+\def\simplifyXMLvalue{\doexpandXMLvalue\XMLsimpleentitiestrue}
+
+\def\expandTEXpar #1#2{\expandXMLvalue{#1\interfaced{#2}}}
+\def\expandXMLpar #1#2{\expandXMLvalue{\@@XMLvariable:#1:#2}}
+\def\expandXMLarguments #1{\expandXMLvalue{\@@XMLmap:#1}}
+
+\def\simplifyTEXpar #1#2{\simplifyXMLvalue{#1\interfaced{#2}}}
+\def\simplifyXMLpar #1#2{\simplifyXMLvalue{\@@XMLvariable:#1:#2}}
+\def\simplifyXMLarguments#1{\simplifyXMLvalue{\@@XMLmap:#1}}
+
+%D \startbuffer[tex]
+%D \defineXMLsingular [fx:root]
+%D {\XMLNSpar{fx:root}{xml}{lang}{}
+%D \XMLpar{fx:root}{xml:lang}{}
+%D \starttabulate[||||]
+%D \HL
+%D \NC \bf mode \NC \bf call \NC \bf result \NC\NR
+%D \HL
+%D \NC 0\NC\asciistr{\XMLpar {fx:root} {crap} {}} \NC dirt \NC\NR
+%D \NC \NC\asciistr{\XMLpar {fx:root} {junk} {}} \NC \NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {fx} {crap} {}}\NC \NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {xml} {lang} {}}\NC \NC\NR
+%D \HL
+%D \NC 1\NC\asciistr{\XMLpar {fx:root} {crap} {}} \NC dirt \NC\NR
+%D \NC \NC\asciistr{\XMLpar {fx:root} {junk} {}} \NC junk \NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {fx} {crap} {}}\NC \NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {xml} {lang} {}}\NC \NC\NR
+%D \HL
+%D \NC 2\NC\asciistr{\XMLpar {fx:root} {crap} {}} \NC dirt \NC\NR
+%D \NC \NC\asciistr{\XMLpar {fx:root} {junk} {}} \NC junk \NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {fx} {crap} {}}\NC \NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {xml} {lang} {}}\NC en \NC\NR
+%D \HL
+%D \NC 3\NC\asciistr{\XMLpar {fx:root} {crap} {}} \NC dirt \NC\NR
+%D \NC \NC\asciistr{\XMLpar {fx:root} {junk} {}} \NC junk \NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {fx} {crap} {}}\NC rubish\NC\NR
+%D \NC \NC\asciistr{\XMLNSpar {fx:root} {xml} {lang} {}}\NC en \NC\NR
+%D \HL
+%D \stoptabulate}
+%D
+%D \remapXMLurlspace [http://www.w3.org/1999/XSL/Format] [fx]
+%D \stopbuffer
+%D
+%D \startbuffer[xml]
+%D <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
+%D fo:crap="rubish"
+%D fo:junk="junk"
+%D xml:lang="en"
+%D crap="dirt" />
+%D \stopbuffer
+%D
+%D \typebuffer[tex] \processTEXbuffer[tex]
+%D \typebuffer[xml] \processXMLbuffer[xml]
+
+%D The previous macros were the basic parser and their working
+%D is left to the imagination of the reader. These macros
+%D will be improved over time. We use rather low level
+%D definitions so that the mappings will run as fast as
+%D possible.
+
+\bgroup \catcode`<=\@@active
+
+\long\gdef\dododefineXMLsingular#1#2%
+ {\long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2}}
+
+\long\gdef\dododefineXMLcommand#1#2%
+ {\long\@EA\def\csname\@@XMLelement:#1\endcsname{#2}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2}}
+
+\long\gdef\dododefineXMLgrouped#1#2%
+ {\long\@EA\def\csname\@@XMLelement:#1\endcsname{\groupedcommand{#2}\donothing\bgroup}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\egroup
+ \@EA\let\csname\@@XMLelement:#1/\endcsname\donothing}
+
+\long\gdef\dododefineXMLargument#1#2% watch the {} around ##1
+ {\long\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLargument{#1}{#2}}
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2{}}}
+
+\long\gdef\redoXMLargument#1#2% potential optimization: globalnext
+ {\long\@EA\gdef\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>{#2{##1}}%
+ \next}
+
+\long\gdef\dododefineXMLignore#1%
+ {\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLignore{#1}}
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \@EA\let\csname\@@XMLelement:#1/\endcsname\donothing}
+
+\long\gdef\redoXMLignore#1%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>{}%
+ \next}
+
+\long\gdef\dododefineXMLpickup#1#2#3%
+ {\long\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLpickup{#1}{#2}{#3}}
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2#3}}
+
+\long\gdef\redoXMLpickup#1#2#3%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>{#2##1#3}%
+ \next}
+
+\long\gdef\dododefineXMLenvironment#1#2#3%
+ {\long\@EA\def\csname\@@XMLelement:#1\endcsname{#2}%
+ \long\@EA\def\csname\@@XMLelement:/#1\endcsname{#3}%
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2#3}}
+
+\long\gdef\dododefineXMLsave#1%
+ {\@EA\let\csname\@@XMLdata:#1\endcsname\longempty
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname {\redoXMLsave{#1}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{\@EA\let\csname\@@XMLdata:#1\endcsname\longempty}}
+
+\long\gdef\dododefineXMLsavecontent#1#2%
+ {\long\@EA\def\csname\@@XMLdata:#1\endcsname{#2}%
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLsave{#1}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{\@EA\let\csname\@@XMLdata:#1\endcsname\longempty}}
+
+\long\gdef\redoXMLsave#1%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>%
+ {\long\@EA\def\csname\@@XMLdata:#1\endcsname{##1}}%
+ \next}
+
+\long\gdef\dododefineXMLgsave#1%
+ {\global\@EA\let\csname\@@XMLdata:#1\endcsname\longempty
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLgsave{#1}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{\global\@EA\let\csname\@@XMLdata:#1\endcsname\longempty}}
+
+\long\gdef\dododefineXMLgsavecontent#1#2%
+ {\long\@EA\gdef\csname\@@XMLdata:#1\endcsname{#2}%
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLgsave{#1}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{\global\@EA\let\csname\@@XMLdata:#1\endcsname\longempty}}
+
+\long\gdef\redoXMLgsave#1%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>%
+ {\long\@EA\gdef\csname\@@XMLdata:#1\endcsname{##1}}%
+ \next}
+
+\long\gdef\dododefineXMLenvironmentsave#1#2#3%
+ {\@EA\let\csname\@@XMLdata:#1\endcsname\longempty
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLenvironmentsave{#1}{#2}{#3}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2\@EA\let\csname\@@XMLdata:#1\endcsname\longempty#3}}
+
+% maybe \globalnext
+
+\long\gdef\redoXMLenvironmentsave#1#2#3%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>%
+ {#2\long\@EA\def\csname\@@XMLdata:#1\endcsname{##1}#3}%
+ \next}
+
+\long\gdef\dododefineXMLenvironmentgsave#1#2#3%
+ {\global\@EA\let\csname\@@XMLdata:#1\endcsname\longempty
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname{\redoXMLenvironmentgsave{#1}{#2}{#3}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2\global\@EA\let\csname\@@XMLdata:#1\endcsname\longempty#3}}
+
+\long\gdef\redoXMLenvironmentgsave#1#2#3%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>%
+ {#2\long\@EA\gdef\csname\@@XMLdata:#1\endcsname{##1}#3}%
+ \next}
+
+\long\gdef\dododefineXMLprocess#1%
+ {\@EA\let\csname\@@XMLelement:#1\endcsname\donothing
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \@EA\let\csname\@@XMLelement:#1/\endcsname\donothing}
+
+\long\gdef\dododefineXMLnestedenvironment#1#2#3%
+ {\long\@EA\def\csname\@@XMLelement:#1\endcsname{\getXMLgroupedenvironment{#1}{#2}{#3}}%
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2#3}}
+
+\long\gdef\dododefineXMLnestedargument#1#2%
+ {\long\@EA\def\csname\@@XMLelement:#1\endcsname{\getXMLgroupedargument{#1}{#2}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2{}}}
+
+\long\gdef\dododefineXMLnestedsave#1%
+ {\@EA\let\csname\@@XMLdata:#1\endcsname\longempty
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname {\getXMLgroupednestedsave{#1}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{\@EA\let\csname\@@XMLdata:#1\endcsname\longempty}}
+
+\long\unexpanded\gdef\getXMLgroupednestedsave#1%
+ {\collectXMLgroupedtrue
+ \long\def\dodogetgrouped{\long\@EA\edef\csname\@@XMLdata:#1\endcsname{\the\groupedtoks}}%
+ \getXMLgrouped{#1}}
+
+\long\gdef\dododefineXMLnestedenvironmentsave#1#2#3%
+ {\@EA\let\csname\@@XMLdata:#1\endcsname\longempty
+ \long\@EA\def\csname\@@XMLelement:#1\endcsname {\getXMLgroupednestedenvironmentsave{#1}{#2}{#3}}%
+ \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+ \long\@EA\def\csname\@@XMLelement:#1/\endcsname{#2\@EA\let\csname\@@XMLdata:#1\endcsname\longempty#3}}
+
+\long\unexpanded\gdef\getXMLgroupednestedenvironmentsave#1#2#3%
+ {\collectXMLgroupedtrue
+ \long\def\dodogetgrouped{#2\long\@EA\edef\csname\@@XMLdata:#1\endcsname{\the\groupedtoks}#3}%
+ \getXMLgrouped{#1}}
+
+\egroup
+
+%D The high level definition macros.
+
+\def\defineXMLsingular {\dotripleempty\dodefineXMLsingular}
+\def\defineXMLcommand {\dotripleempty\dodefineXMLcommand}
+\def\defineXMLgrouped {\dotripleempty\dodefineXMLgrouped}
+\def\defineXMLargument {\dotripleempty\dodefineXMLargument}
+\def\defineXMLignore {\dotripleempty\dodefineXMLignore}
+\def\defineXMLpickup {\dotripleempty\dodefineXMLpickup}
+\def\defineXMLenvironment {\dotripleempty\dodefineXMLenvironment}
+\def\defineXMLsave {\dotripleempty\dodefineXMLsave}
+\def\defineXMLsavecontent {\dotripleempty\dodefineXMLsavecontent}
+\def\defineXMLgsave {\dotripleempty\dodefineXMLgsave}
+\def\defineXMLgsavecontent {\dotripleempty\dodefineXMLgsavecontent}
+\def\defineXMLenvironmentsave {\dotripleempty\dodefineXMLenvironmentsave}
+\def\defineXMLenvironmentgsave {\dotripleempty\dodefineXMLenvironmentgsave}
+\def\defineXMLprocess {\dotripleempty\dodefineXMLprocess}
+\def\defineXMLnested {\dotripleempty\dodefineXMLnestedenvironment}
+\def\defineXMLnestedenvironment {\dotripleempty\dodefineXMLnestedenvironment}
+\def\defineXMLnestedargument {\dotripleempty\dodefineXMLnestedargument}
+\def\defineXMLnestedsave {\dotripleempty\dodefineXMLnestedsave}
+\def\defineXMLnestedenvironmentsave{\dotripleempty\dodefineXMLnestedenvironmentsave}
+
+%D We can nill definitions with:
+
+\def\resetXMLelement[#1]{\dododefineXMLprocess{#1}}
+
+%D This is equivalent to:
+%D
+%D \starttyping
+%D \def\resetXMLelement[#1]% handy in case only singular
+%D {\@EA\let\csname\@@XMLelement:#1\endcsname \donothing
+%D \@EA\let\csname\@@XMLelement:/#1\endcsname\donothing
+%D \@EA\let\csname\@@XMLelement:#1/\endcsname\donothing}
+%D \stoptyping
+
+% push is (not yet) a real push, so:
+
+\def\defineXMLpush {\dotripleempty\dodefineXMLsave}
+\def\defineXMLenvironmentpush{\dotripleempty\dodefineXMLenvironmentsave}
+
+% goes for all types
+
+\long\def\dodefineXMLsingular[#1][#2][#3]#4%
+ {\defineXMLmethod\dododefineXMLsingular{#1}{#2}{#3}{#4}{}}
+
+\long\def\dodefineXMLcommand[#1][#2][#3]#4%
+ {\defineXMLmethod\dododefineXMLcommand{#1}{#2}{#3}{#4}{}}
+
+\long\def\dodefineXMLgrouped[#1][#2][#3]#4%
+ {\defineXMLmethod\dododefineXMLgrouped{#1}{#2}{#3}{#4}{}}
+
+\long\def\dodefineXMLargument[#1][#2][#3]#4%
+ {\defineXMLmethod\dododefineXMLargument{#1}{#2}{#3}{#4}{}}
+
+\long\def\dodefineXMLignore[#1][#2][#3]%
+ {\defineXMLmethod\dododefineXMLignore{#1}{#2}{#3}{}{}}
+
+\long\def\dodefineXMLpickup[#1][#2][#3]#4#5%
+ {\defineXMLmethod\dododefineXMLpickup{#1}{#2}{#3}{#4}{#5}}
+
+\long\def\dodefineXMLenvironment[#1][#2][#3]#4#5%
+ {\defineXMLmethod\dododefineXMLenvironment{#1}{#2}{#3}{#4}{#5}}
+
+\long\def\dodefineXMLsave[#1][#2][#3]%
+ {\defineXMLmethod\dododefineXMLsave{#1}{#2}{#3}{}{}}
+
+\long\def\dodefineXMLsavecontent[#1][#2][#3]#4%
+ {\defineXMLmethod\dododefineXMLsavecontent{#1}{#2}{#3}{#4}{}}
+
+\long\def\dodefineXMLgsave[#1][#2][#3]%
+ {\defineXMLmethod\dododefineXMLgsave{#1}{#2}{#3}{}{}}
+
+\long\def\dodefineXMLgsavecontent[#1][#2][#3]#4%
+ {\defineXMLmethod\dododefineXMLgsavecontent{#1}{#2}{#3}{#4}{}}
+
+\long\def\dodefineXMLenvironmentsave[#1][#2][#3]#4#5%
+ {\defineXMLmethod\dododefineXMLenvironmentsave{#1}{#2}{#3}{#4}{#5}}
+
+\long\def\dodefineXMLenvironmentgsave[#1][#2][#3]#4#5%
+ {\defineXMLmethod\dododefineXMLenvironmentgsave{#1}{#2}{#3}{#4}{#5}}
+
+\long\def\dodefineXMLprocess[#1][#2][#3]%
+ {\defineXMLmethod\dododefineXMLprocess{#1}{#2}{#3}{}{}}
+
+\long\def\dodefineXMLnestedenvironment[#1][#2][#3]#4#5%
+ {\defineXMLmethod\dododefineXMLnestedenvironment{#1}{#2}{#3}{#4}{#5}}
+
+\long\def\dodefineXMLnestedargument[#1][#2][#3]#4%
+ {\defineXMLmethod\dododefineXMLnestedargument{#1}{#2}{#3}{#4}{}}
+
+\long\def\dodefineXMLnestedsave[#1][#2][#3]%
+ {\defineXMLmethod\dododefineXMLnestedsave{#1}{#2}{#3}{}{}}
+
+\long\def\dodefineXMLnestedenvironmentsave[#1][#2][#3]#4#5%
+ {\defineXMLmethod\dododefineXMLnestedenvironmentsave{#1}{#2}{#3}{#4}{#5}}
+
+% [key=val] => \presetXMLarguments{element} => default key/vals
+% [blabla] => \theXMLarguments{blabla} => user key/vals
+% [blabla] [key=val] => \presetXMLarguments{element} => default key/vals
+% \theXMLarguments{blabla} => user key/vals
+
+% command element [map] [parlst] begin end
+
+\long\def\defineXMLmethod#1#2#3#4#5#6%
+ {\ifsecondargument
+ \setXMLarguments{#2}{#3}{#4}%
+ \else
+ \resetXMLarguments{#2}% new
+ \fi
+ #1{#2}{#5}{#6}}
+
+%D Arguments (attributes) \unknown
+
+% \long\def\setXMLarguments#1#2#3% element [tag] settings
+% {\doifassignmentelse{#2}
+% {\long\setvalue{\@@XMLpars:#1}{\getrawparameters[\@@XMLvariable:#1:][#2]}}
+% {\long\setvalue{\@@XMLmap :#1}{#2}% later we can init vars by this name
+% \doifsomething{#3}{\long\setvalue{\@@XMLpars:#1}{\getrawparameters[#2][#3]}}}}
+
+\long\def\setXMLarguments#1#2#3% element [tag] settings
+ {\doifassignmentelse{#2} % ROOM FOR OPTIMIZATION
+ {\letbeundefined{\@@XMLmap:#1}%
+ \long\setvalue{\@@XMLpars:#1}{\getrawparameters[\@@XMLvariable:#1:][#2]}}
+ {\long\setvalue{\@@XMLmap:#1}{#2}% later we can init vars by this name
+ \doifsomething{#3}{\long\setvalue{\@@XMLpars:#1}{\getrawparameters[#2][#3]}}}}
+
+\def\presetXMLarguments#1%
+ {\csname\@@XMLpars:\rawXMLnamespace#1\endcsname} % == \getvalue{}
+
+\prependtoks
+ \presetXMLarguments\rawXMLidentifier
+\to \everyXMLelement
+
+%D We now overload the previously defined argument setter by one
+%D that is faster when definitions are surrounded by
+%D
+%D \starttyping
+%D \startXMLcompiling ... \stopXMLcompiling
+%D \stoptyping
+%D
+%D This method is twice as fast on (for instance) 100K calls to
+%D an empty element with 10 arguments.
+
+% \long\def\prepareXMLargument#1#2#3%
+% {\scratchtoks\expandafter{\the\scratchtoks\@EA\def\csname#1#2\endcsname{#3}}}
+
+% \long\def\prepareXMLargument#1#2#3%
+% {\scratchtoks\@EA\@EA\@EA{\@EA\the\@EA\scratchtoks\@EA\def\csname\@@XMLvariable:#1:#2\endcsname{#3}}}
+
+% \let\@@globalprefix\empty
+
+% \long\def\prepareXMLargument#1#2#3%
+% {\expanded{\scratchtoks
+% {\the\scratchtoks
+% \def\@EA\noexpand\csname\@@XMLvariable:#1:#2\endcsname{#3}%
+% \noexpand\@EA\let\noexpand\csname\@@XMLvariable:\noexpand\the\numexpr(\XMLdepth+1):#2\endcsname
+% \@EA\noexpand\csname\@@XMLvariable:#1:#2\endcsname}}}
+
+\long\def\prepareXMLargument#1#2#3%
+ {\expanded{\scratchtoks
+ {\the\scratchtoks
+ \def\@EA\noexpand\csname\@@XMLvariable:#1:#2\endcsname{#3}%
+ \noexpand\@EA\let\noexpand\csname\@@XMLvariable:\noexpand\the\numexpr\XMLdepth+\plusone\relax:#2\endcsname
+ \@EA\noexpand\csname\@@XMLvariable:#1:#2\endcsname}}}
+
+\long\def\setXMLargumentsN#1#2#3% element [tag] settings
+ {\doifassignmentelse{#2}
+ {\letbeundefined{\@@XMLmap:#1}%
+ \long\setvalue{\@@XMLpars:#1}{\getrawparameters[\@@XMLvariable:#1:][#2]}}
+ {\long\setvalue{\@@XMLmap:#1}{#2}% later we can init vars by this name
+ \doifsomething{#3}{\long\setvalue{\@@XMLpars:#1}{\getrawparameters[#2][#3]}}}}
+
+\long\def\setXMLargumentsP#1#2#3% element settings empty (we cannot test for assignment)
+ {\letbeundefined{\@@XMLmap:#1}%
+ \bgroup
+ %def\XMLinheritance{\noexpand\XMLinheritance}
+ \def\XMLop##1{\noexpand\XMLpar{#1}{##1}{}}%
+ \def\XMLpar{\noexpand\XMLpar}%
+ \def\XMLanc{\noexpand\XMLanc}%
+ \def\XMLinh{\noexpand\XMLinh}%
+ \xdef\!!XMLattr{[#1][#2]}%
+ \scratchtoks\emptytoks
+ \@EA\dogetparameters\@EA\prepareXMLargument\!!XMLattr
+ \xdef\globalnext{\the\scratchtoks}%
+ \egroup
+ \letvalue{\@@XMLpars:#1}\globalnext
+ \globallet\globalnext\relax}
+
+\def\defineXMLattributeset{\dodoubleargument\dodefineXMLattributeset}
+\def\extendXMLattributeset{\dodoubleargument\doextendXMLattributeset}
+
+\def\dodefineXMLattributeset[#1][#2]{\setvalue {\@@XMLpars::#1}{#2}}
+\def\doextendXMLattributeset[#1][#2]{\appendvalue{\@@XMLpars::#1}{,#2}}
+
+\def\XMLattributeset #1{\executeifdefined{\@@XMLpars::#1}\empty}
+%def\XMLinheritance #1{\executeifdefined{\@@XMLpars:#1}\empty}
+\def\showXMLattributes#1{\showvalue{\@@XMLpars:#1}}
+
+\chardef\@@precompile\zerocount
+
+\def\setXMLarguments
+ {\ifcase\@@precompile
+ \expandafter\setXMLargumentsN
+ \else
+ \expandafter\setXMLargumentsP
+ \fi}
+
+\def\startXMLcompiling
+ {\dosingleargument\dostartXMLcompiling}
+
+% \def\dostartXMLcompiling[#1]%
+% {\iffirstargument
+% \copyXMLargumentindeed % when needed, from now on -)
+% \def\@@globalprefix{#1}%
+% \fi
+% \chardef\@@precompile\plusone}
+
+\def\dostartXMLcompiling[#1]%
+ {\doif{#1}\v!inherit
+ \copyXMLargumentindeed
+ \chardef\@@precompile\plusone}
+
+\def\stopXMLcompiling
+ {\chardef\@@precompile\zerocount} % no \let\@@globalprefix\empty
+
+%D Interesting what kind of things are needed \unknown
+
+\appendtoks
+ \ifdefined\disablelanguagespecifics\disablelanguagespecifics\fi
+\to \everyenableXML
+
+\long\def\longempty{}
+\long\def\longspace{ }
+
+% \def\doifelseXMLdata#1% always empty at start [gets a long assignment]
+% {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty
+% \expandafter\secondoftwoarguments
+% \else
+% \expandafter\firstoftwoarguments
+% \fi}
+%
+% \def\doifXMLdata#1% always empty at start [gets a long assignment]
+% {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty
+% \expandafter\gobbleoneargument
+% \else
+% \expandafter\firstofoneargument
+% \fi}
+%
+% \let\doifXMLdataelse\doifelseXMLdata
+
+\def\doifelseXMLdata#1% always empty at start [gets a long assignment]
+ {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\doifXMLdata#1% always empty at start [gets a long assignment]
+ {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
+
+\let\doifXMLdataelse\doifelseXMLdata
+
+\def\doifelseXMLempty#1%
+ {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty
+ \expandafter\firstoftwoarguments
+ \else\@EA\ifx\csname\@@XMLdata:#1\endcsname\longspace
+ \expandthree\firstoftwoarguments
+ \else
+ \expandthree\secondoftwoarguments
+ \fi\fi}
+
+% test case:
+%
+% \defineXMLenvironmentsave[test]
+% {}
+% {\message{[\XMLflush{test}]}
+% \message{\doifelseXMLdata {test}{}{no }data}
+% \message{/}
+% \message{\doifelseXMLempty{test}{}{not }empty}
+% \wait}
+%
+% \startXMLdata
+% <test>xxx</test>
+% <test></test>
+% <test> </test>
+% <test> </test>
+% <test> </test>
+% <test> x </test>
+% \stopXMLdata
+
+% \def\XMLflush#1% one level
+% {\csname\@@XMLdata:#1\endcsname}
+
+% evt meer van dit gedoe en alle \longempty's vervangen
+
+\def\XMLflush#1% one level
+ {\csname\ifcsname\@@XMLdata:#1\endcsname\@@XMLdata:#1\else\s!empty\fi\endcsname}
+
+%D \starttyping
+%D \defineXMLenvironmentsave[formula]{}{$\XMLtexdata{formula}$}
+%D
+%D \startXMLdata
+%D <formula>t+3+x+t\neq m\alpha\frac\theta\hbar</formula>
+%D \stopXMLdata
+%D \stoptyping
+
+\def\XMLtexdata#1%
+ {\begingroup
+ \disableXML
+ \scantokens\@EA\@EA\@EA{\csname\@@XMLdata:#1\endcsname}%
+ \endgroup}
+
+\def\XMLflushdata#1% see m-steps for usage
+ {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty\else
+ %\@EAEAEA\XMLdata\@EA\@EA\@EA{\csname\@@XMLdata:#1\endcsname}%
+ \@EA\XMLdata\csname\@@XMLdata:#1\endcsname
+ \fi}
+
+\def\XMLflushasis#1%
+ {\detokenize\@EAEAEA{\csname\@@XMLdata:#1\endcsname}}
+
+\let\XMLpop \XMLflush
+\let\XMLpopdata\XMLflushdata
+
+\def\XMLappend#1#2% let to empty expands to nothing -)
+ {\long\@EA\edef\csname\@@XMLdata:#1\endcsname{\csname\@@XMLdata:#1\endcsname#2}}
+
+\def\XMLprepend#1#2% let to empty expands to nothing -)
+ {\long\@EA\edef\csname\@@XMLdata:#1\endcsname{#2\csname\@@XMLdata:#1\endcsname}}
+
+\def\XMLerase#1%
+ {\@EA\let\csname\@@XMLdata:#1\endcsname\longempty}
+
+\def\XMLassign#1%
+ {\long\@EA\def\csname\@@XMLdata:#1\endcsname}
+
+\def\dontparseXMLelement#1>{}
+
+\def\simplifyXMLelements{\let\parseXMLelement\dontparseXMLelement}
+
+\def\defXMLstring#1#2%
+ {\bgroup
+ \enableXMLexpansion
+ \simplifyXMLelements
+ \let\getXMLentity\firstofoneargument
+ \XMLrawentitiestrue
+ \chardef\utfunicodetracer7% new
+ \xdef\@@XML@@string{\csname\@@XMLdata:#2\endcsname}%
+ \egroup
+ \defconvertedcommand#1\@@XML@@string}
+
+% this has to expand nicely:
+%
+% <!DOCTYPE XXX SYSTEM "xxx" [ <!ENTITY aaa "../www/"> <!ENTITY bbb SYSTEM "&aaa;mmm.eps"> ]>
+%
+% so keep the following as is!
+
+\def\defXMLclean#1#2%
+ {\bgroup
+ \enableXMLexpansion
+ \simplifyXMLelements
+ \simplifyXMLentities
+ \chardef\utfunicodetracer7% new
+ \let\getXMLentity\expandedXMLentity % should this go in \simplify ?
+ \xdef\@@XML@@string{\csname\@@XMLdata:#2\endcsname}%
+ \egroup
+ \defconvertedcommand#1\@@XML@@string}
+
+\def\defXMLpar#1#2#3% to be documented
+ {\@EA\def\@EA#1\csname\ifcsname\@@XMLvariable:#2:#3\endcsname\@@XMLvariable:#2:#3\else\s!empty\fi\endcsname}
+
+\def\setvalueXMLpar#1#2#3% to be documented
+ {\@EA\let\csname#1\@EA\endcsname\csname\ifcsname\@@XMLvariable:#2:#3\endcsname\@@XMLvariable:#2:#3\else\s!empty\fi\endcsname}
+
+\def\XMLshow#1%
+ {\showvalue{\@@XMLdata:#1}}
+
+\def\XMLunspace#1% kan sneller
+ {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty\else
+ \long\@EA\edef\csname\@@XMLdata:#1\endcsname
+ {\@EAEAEA\dounspaced\csname\@@XMLdata:#1\endcsname\end}%
+ \fi}
+
+\chardef\asciispacecode=32
+
+\def\defXMLlowerclean#1% lowercase ! evt tzt upper too
+ {\bgroup
+ \lccode`\#\asciispacecode
+ \lccode`\$\asciispacecode
+ \lccode`\%\asciispacecode
+ \lccode`\\\asciispacecode
+ \lccode`\^\asciispacecode
+ \lccode`\_\asciispacecode
+ \lccode`\{\asciispacecode
+ \lccode`\}\asciispacecode
+ \lccode`\|\asciispacecode
+ \lccode`\~\asciispacecode
+ \@EA\lowercase\@EA{\@EA\xdef\@EA#1\@EA{#1}}%
+ \egroup}
+
+\def\processXMLparelse#1#2#3#4%
+ {\processaction
+ [\XMLpar{#1}{#2}{}]
+ [#3,\s!unknown=>{#4},\s!default={#4}]}
+
+%D We can pick up key|/|value pairs, but we still need a way
+%D to process these.
+
+% bugged
+%
+% \def\mapXMLvalue#1#2#3% td align center -> middle
+% {\setvalue{\@@XMLvalue:#1:#2:#3}}
+
+\def\mapXMLvalue#1#2#3% td:align center -> middle
+ {\setvalue{\@@XMLvalue:#1:#2}{#3}} % keep #3 to grab spaces
+
+\def\XMLvar#1#2#3% td align center
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \XMLval{#1}{#2}{\csname\@@XMLvariable:#1:#2\endcsname}%
+ \else
+ \XMLval{#1}{#2}{#3}% evt inline code
+ \fi}
+
+% \def\XMLvar#1#2#3% td align center
+% {\XMLval{#1}{#2}{\ifcsname\@@XMLvariable:#1:#2\endcsname
+% \csname\@@XMLvariable:#1:#2\endcsname\else#3\fi}}
+
+% \def\XMLval#1#2#3% td:align value default
+% {\ifcsname\@@XMLvalue:#1:#2\endcsname
+% \csname\@@XMLvalue:#1:#2\endcsname
+% \else
+% #3%
+% \fi}
+%
+% The next one permits commands instead of strings in #3
+
+\def\XMLval#1#2% #1=td:align #2=value #3=default
+ {\ifcsname\@@XMLvalue:#1:#2\endcsname
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi
+ {\csname\@@XMLvalue:#1:#2\endcsname}}
+
+\def\XMLpar#1#2#3%
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \csname\@@XMLvariable:#1:#2\endcsname
+ \else
+ #3%
+ \fi}
+
+\def\XMLNSpar#1#2#3#4% element namespace name default
+ {\ifcsname\@@XMLvariable:#1:#2:#3\endcsname
+ \csname\@@XMLvariable:#1:#2:#3\endcsname
+ \else
+ #4%
+ \fi}
+
+% \def\setXMLpar#1#2%
+% {\@EA\def\csname\@@XMLvariable:#1:#2\endcsname}
+
+\def\letXMLpar #1#2{\@EA \let\csname\@@XMLvariable:#1:#2\endcsname}
+\def\setXMLpar #1#2{\@EA \def\csname\@@XMLvariable:#1:#2\endcsname}
+\def\setXMLepar#1#2{\@EA\edef\csname\@@XMLvariable:#1:#2\endcsname}
+
+% ancestor arguments:
+%
+% \defineXMLenvironment
+% [fo:root]
+% [test=unset]
+% {\beginXMLelement}
+% {\endXMLelement}
+%
+% \defineXMLenvironment
+% [fo:block-container]
+% [test=oeps]
+% {\beginXMLelement}
+% {\endXMLelement}
+%
+% \defineXMLenvironment
+% [fo:block]
+% {\beginXMLelement
+% \begingroup}
+% {\endgroup
+% \XMLanc{test}{}
+% \endXMLelement}
+%
+% \startXMLdata
+% <fo:root>
+% <fo:block-container test='first'><fo:block test='second'>second:</fo:block></fo:block-container>
+% <fo:block>unset:</fo:block>
+% <fo:block test='outer'><fo:block test='nested'><fo:block>deep:</fo:block>nested:</fo:block>outer:</fo:block>
+% <fo:block test='last'>last:</fo:block>
+% </fo:root>
+% \stopXMLdata
+%
+% \startXMLdata
+% <fo:root>
+% <fo:block-container test='first'><fo:block>second:</fo:block></fo:block-container>
+% <fo:block>unset:</fo:block>
+% <fo:block test='second'><fo:block><fo:block>deep:</fo:block>nested:</fo:block>outer:</fo:block>
+% <fo:block>last:</fo:block>
+% </fo:root>
+% \stopXMLdata
+%
+% \startXMLdata
+% <fo:root>
+% <fo:block-container test='first'><fo:block>second:</fo:block></fo:block-container>
+% <fo:block>unset:</fo:block>
+% <fo:block><fo:block><fo:block>deep:</fo:block>nested:</fo:block>outer:</fo:block>
+% <fo:block>last:</fo:block>
+% </fo:root>
+% \stopXMLdata
+
+% dit werkt alleen ok in niet <a> <b> <b> ... situaties omdat anders
+% de laatste b de attributen van de vorige heeft:
+
+\def\XMLanc#1%
+ {\ifcsname\@@XMLvariable:\currentXMLelement:#1\endcsname % \ownXMLelement
+ \csname\@@XMLvariable:\currentXMLelement:#1\endcsname % \ownXMLelement
+ \@EA\gobblethreearguments
+ \else
+ \@EA\pXMLanc
+ \fi\XMLdepth{#1}}
+
+% \def\pXMLanc#1%
+% {\@EA\ppXMLanc\@EA{\the\numexpr(#1-\plusone)}}
+
+\def\pXMLanc#1%
+ {\@EA\ppXMLanc\@EA{\the\numexpr#1-\plusone\relax}}
+
+\def\ppXMLanc#1#2#3%
+ {\ifcsname\@@XMLdepth:#1\endcsname % is er altijd dus redundant
+ \ifcsname\@@XMLvariable:\csname\@@XMLdepth:#1\endcsname:#2\endcsname
+ \csname\@@XMLvariable:\csname\@@XMLdepth:#1\endcsname:#2\endcsname
+ \@EAEAEA\gobblethreearguments
+ \else
+ \@EAEAEA\pppXMLanc
+ \fi
+ \else
+ \@EA\pppXMLanc
+ \fi{#1}{#2}{#3}}
+
+\def\pppXMLanc#1%
+ {\ifnum#1>\zerocount
+ \@EA\pXMLanc
+ \else
+ \@EA\thirdofthreearguments
+ \fi{#1}}
+
+%D Experimental (not sure if this will stay):
+%D
+%D \starttyping
+%D \startdefineXMLhandlers[one,two]
+%D
+%D \defineXMLenvironment[a=b,c=\XMLop{a}]
+%D {}{}
+%D
+%D \stopdefineXMLhandlers
+%D \stoptyping
+
+\long\def\startdefineXMLhandlers
+ {\bgroup\catcode`\^^M=\@@space
+ \dodoubleempty\dostartdefineXMLhandlers}
+
+\long\def\dostartdefineXMLhandlers[#1][#2]#3#4\stopdefineXMLhandlers % #2 is dummy
+ {\egroup
+ \long\def\dodefineXMLhandlers##1{#3[##1]#4}%
+ \processcommalist[#1]\dodefineXMLhandlers}
+
+\let\currentXMLhandler\s!unknown
+
+% \long\def\dostartdefineXMLhandlers[#1][#2]#3#4[#5]#6\stopdefineXMLhandlers % #2 is dummy
+% {\egroup
+% \pushmacro\XMLop
+% \pushmacro\XMLpar
+% \pushmacro\currentXMLhandler
+% \long\def\dodefineXMLhandlers##1%
+% {\edef\currentXMLhandler{##1}%
+% \def\XMLop####1{\noexpand\XMLpar{##1}{####1}{}}%
+% \def\XMLpar{\noexpand\XMLpar}%
+% \def\XMLanc{\noexpand\XMLanc}%
+% \edef\!!stringa{[##1][#5]}%
+% \expandafter#3\!!stringa#6}%
+% \processcommalist[#1]\dodefineXMLhandlers
+% \popmacro\currentXMLhandler
+% \popmacro\XMLpar
+% \popmacro\XMLop}
+
+\long\def\dostartdefineXMLhandlers[#1][#2]#3#4[#5]#6\stopdefineXMLhandlers % #2 is dummy
+ {\egroup
+ \long\def\dodefineXMLhandlers##1%
+ {\bgroup
+ \edef\currentXMLhandler{##1}%
+ \def\XMLop####1{\noexpand\XMLpar{##1}{####1}{}}%
+ \def\XMLpar{\noexpand\XMLpar}%
+ \def\XMLanc{\noexpand\XMLanc}%
+ \def\XMLinh{\noexpand\XMLinh}%
+ \xdef\!!XMLattr{[##1][#5]}%
+ \egroup
+ \expandafter#3\!!XMLattr#6}%
+ \processcommalist[#1]\dodefineXMLhandlers}
+
+\def\XMLpav#1#2#3#4%
+ {\XMLval{#1}{\XMLpar{#2}{#3}{}}{#4}}
+
+%D A few weird ones:
+
+\def\TEXpar#1#2%
+ {\csname#1\interfaced{#2}\endcsname}
+
+\let\texXMLpar\TEXpar % soon obsolete
+
+\let\XMLtex\TEXpar
+
+% handy one
+
+\def\XMLtyp#1#2#3%
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \@EA\defconvertedcommand\@EA\ascii\csname\@@XMLvariable:#1:#2\endcsname
+ \else
+ \defconvertedargument\ascii{#3}%
+ \fi
+ \ascii}
+
+\defineXMLsingular [begingroup] {\begingroup}
+\defineXMLsingular [endgroup] {\endgroup}
+\defineXMLsingular [gobblespacetokens] {\gobblespacetokens}
+\defineXMLsingular [disableXML] {\disableXML}
+
+\long\def\XMLstr#1%
+ {{\enableXML\scantokens{#1}\unskip}}
+
+\long\def\XMLstr#1% test, does not work
+ {\ifprocessingXML
+ % \begingroup\enableXML\scantokens{#1<endgroup/><gobblespacetokens/>}%
+ \scantokens{#1<gobblespacetokens/>}%
+ \else
+ \begingroup\enableXML\scantokens{#1<endgroup/>\ignorespaces}%
+ \fi}
+
+\def\XMLgetvariable#1#2% hooks into generic \getvariable and setvariables
+ {\expanded{\XMLstr{\getvariable{#1}{#2}}}}
+
+\long\def\XMLstrpar#1#2#3% test
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \scantokens\@EAEAEA{\@EA\begingroup\@EA\enableXML
+ \csname\@@XMLvariable:#1:#2\endcsname<endgroup/>}%
+ \else
+ \scantokens{\begingroup\enableXML#3<endgroup/>}%
+ \fi}
+
+\def\doifXMLvarelse#1#2% geen etex, \relax too
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \expandafter\ifx\csname\@@XMLvariable:#1:#2\endcsname\empty
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\doifXMLvar#1#2% geen etex, \relax too
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \expandafter\ifx\csname\@@XMLvariable:#1:#2\endcsname\empty
+ \@EAEAEA\gobbleoneargument
+ \else
+ \@EAEAEA\firstofoneargument
+ \fi
+ \else
+ \@EA\gobbleoneargument
+ \fi}
+
+\def\doifXMLvalelse#1#2% geen etex, \relax too
+ {\ifcsname\@@XMLvalue:#1:#2\endcsname
+ \expandafter\ifx\csname\@@XMLvalue:#1:#2\endcsname\empty
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\let\doifXMLparelse\doifXMLvarelse
+\let\doifXMLpar \doifXMLvar
+
+%D Used in x-fo: I really need to document this!
+
+\bgroup \catcode`\<=\active
+
+% usage: \expanded{\rescanXMLatttributes{fo:table-cell}}
+
+\gdef\rescanXMLattributes #1{\noexpand\dogetXMLarguments{#1}\currentXMLarguments>}
+\gdef\parseXMLattributes #1#2{\dogetXMLarguments{#1}#2>}
+
+\egroup
+
+\def\defXMLattributestring#1#2#3#4%
+ {\ifcsname\@@XMLvariable:#2:#3\endcsname
+ \@EA\defconvertedcommand\@EA#1\csname\@@XMLvariable:#2:#3\endcsname
+ \else
+ \defconvertedargument#1{#4}%
+ \fi}
+
+\def\XMLprocess#1%
+ {\begingroup\enableXML\XMLflush{#1}\endgroup}
+
+\bgroup \catcode`<=\@@active
+
+\long\gdef\ignoreuntilXMLelement#1<{<}
+\long\gdef\grabuntilXMLelement #1<\to#2{\def#2{#1}<}
+
+\egroup
+
+%D Saves tokens and typing.
+
+\def\XMLownvar {\XMLvar {\rawXMLnamespace\rawXMLidentifier}}
+\def\XMLownval {\XMLval {\rawXMLnamespace\rawXMLidentifier}}
+\def\XMLownpar {\XMLpar {\rawXMLnamespace\rawXMLidentifier}}
+\def\XMLownstrpar {\XMLstrpar {\rawXMLnamespace\rawXMLidentifier}}
+\def\doifXMLownvarelse{\doifXMLvarelse{\rawXMLnamespace\rawXMLidentifier}}
+\def\doifXMLownvalelse{\doifXMLvalelse{\rawXMLnamespace\rawXMLidentifier}}
+\def\doifXMLownparelse{\doifXMLparelse{\rawXMLnamespace\rawXMLidentifier}}
+
+\def\letXMLpar #1#2{\@EA \let\csname\@@XMLvariable:#1:#2\endcsname}
+\def\setXMLpar #1#2{\@EA \def\csname\@@XMLvariable:#1:#2\endcsname}
+\def\setXMLepar#1#2{\@EA\edef\csname\@@XMLvariable:#1:#2\endcsname}
+
+\def\ownXMLelement{\rawXMLnamespace\rawXMLidentifier}
+
+\def\XMLop#1% ownpar
+ {\csname\ifcsname\@@XMLvariable:\ownXMLelement:#1\endcsname
+ \@@XMLvariable:\ownXMLelement:#1\else\s!empty
+ \fi\endcsname}
+
+\def\XMLtp#1% texpar
+ {\csname\ifcsname\@@XMLmapmap\interfaced{#1}\endcsname
+ \@@XMLmapmap\interfaced{#1}\else\s!empty
+ \fi\endcsname}
+
+\def\doifelseXMLop#1{\doifelse{\XMLop{#1}}}
+\def\doifXMLop #1{\doif {\XMLop{#1}}}
+\def\doifnotXMLop #1{\doifnot {\XMLop{#1}}}
+
+\def\doifelsenothingXMLop#1{\doifelsenothing{\XMLop{#1}}}
+\def\doifsomethingXMLop #1{\doifsomething {\XMLop{#1}}}
+\def\doifnothingXMLop #1{\doifnothing {\XMLop{#1}}}
+
+\def\doifelseXMLtp#1{\doifelse{\XMLtp{#1}}}
+\def\doifXMLtp #1{\doif {\XMLtp{#1}}}
+\def\doifnotXMLtp #1{\doifnot {\XMLtp{#1}}}
+
+\def\doifelsenothingXMLtp#1{\doifelsenothing{\XMLtp{#1}}}
+\def\doifsomethingXMLtp #1{\doifsomething {\XMLtp{#1}}}
+\def\doifnothingXMLtp #1{\doifnothing {\XMLtp{#1}}}
+
+\def\XMLflushself{\csname\@@XMLdata:\ownXMLelement\endcsname}
+
+\def\showXMLdata#1{\showvalue{\@@XMLdata:#1}}
+
+\def\XMLta {\theXMLarguments\@@XMLmapmap}
+\def\getXMLta {\expanded{\getparameters[\@@XMLmapmap][\XMLta]}}
+\def\expandXMLta{\expandXMLarguments\@@XMLmapmap}
+\def\expandXMLtp{\expandTEXpar\@@XMLmapmap} % #1
+
+\def\getXMLparameters[#1]% faster than \rawgetparameters[#1][\theXMLar..]
+ {\ifcsname\@@XMLmap:#1\endcsname
+ \expanded{\rawgetparameters[#1][\csname\@@XMLmap:#1\endcsname]}%
+ \fi}
+
+\def\defXMLop#1#2{\@EA\let\@EA#1\csname\@@XMLvariable:\ownXMLelement:#2\endcsname}
+\def\defXMLtp#1#2{\@EA\let\@EA#1\csname\@@XMLmapmap\interfaced{#2}\endcsname}
+
+%D ...
+
+\def\protectXMLdata
+ {\catcode`\^^I\@@space
+ \catcode`\^^M\@@space
+ \catcode`\^^L\@@space
+ \catcode`\#\@@other}
+
+\long\def\startXMLcode
+ {\begingroup
+ \protectXMLdata
+ \dostartXMLcode}
+
+\long\def\dostartXMLcode[#1] #2 \stopXMLcode
+ {\@EA\gdef\csname\@@XMLcode:#1\endcsname{\startXMLdata#2\stopXMLdata}%
+ \endgroup}
+
+\def\getXMLcode[#1]% \expandXMLcode
+ {\csname\@@XMLcode:#1\endcsname}
+
+% \long\def\startXMLdata#1\stopXMLdata%
+% {\begingroup\enableXML\scantokens{#1}\endgroup}
+%
+% \defineXMLentity[tex-backslash] {\catchXMLpar}
+%
+% \def\catchXMLpar#1#2#3
+% {\if#1p\if#2a\if#3r\ifmmode\else\endgraf\fi
+% \else\texescape\fi\else\texescape\fi\else\texescape\fi}
+
+\long\def\startXMLdata
+ {\begingroup
+ \protectXMLdata
+ \dostartXMLdata}
+
+\long\def\dostartXMLdata#1\stopXMLdata % evt \everyeof{}
+ {\enableXML\scantokens{#1<gobblespacetokens/>}%
+ \endgroup
+ \ifhmode\unskip\unskip\fi}
+
+% suboptimal:
+%
+% \unexpanded\def\XMLdata#1% % \unexpanded added 22/5/2001
+% {\begingroup
+% \enableXML\scantokens{#1}\ifhmode\unskip\unskip\fi
+% \endgroup}
+%
+% better but does not work in tables:
+%
+% \unexpanded\def\XMLdata#1% % grouping changed 20/5/2001
+% {\scantokens{\begingroup\enableXML#1<endgroup/>\gobblespacetokens}}
+%
+% currently:
+
+\unexpanded\def\XMLdata % # safe
+ {\begingroup
+ \protectXMLdata
+ \doXMLdata}
+
+\def\doXMLdata#1%
+ {\enableXML
+ \scantokens{#1<gobblespacetokens/>}%
+ \endgroup}
+
+%D
+
+\def\bXMLs{\ifignoreXMLspaces\ignorespaces\fi}
+\def\eXMLs{\ifignoreXMLspaces\ifhmode\unskip\fi\fi}
+
+\protect
+
+% \defineXMLcommand{placeindex/}
+% {\placeindex[criterium=all]}
+%
+% \defineXMLargument{index}
+% {\index[\XMLvar{index}{key}{}]}
+
+%D Here we implement the handling of preformatted code.
+
+\unprotect
+
+\def\startXMLpreformatted#1%
+ {\startpacked
+ #1%
+ \fixedXMLfonttrue
+ \obeylines
+ \obeyspaces
+ \setbox\scratchbox=\hbox{x}%
+ \edef\obeyedspace{\noindent\noexpand\kern\the\wd\scratchbox}}
+
+\def\stopXMLpreformatted#1%
+ {\stoppacked}
+
+%D
+
+\def\XMLinput{\enableXML\input} \global\let\inputXML\XMLinput
+
+% options
+
+\def\processXMLfile #1{\enableXML\processfile{#1}}
+\def\processXMLfilegrouped#1{{\enableXML\processfile{#1}\relax\ifmmode\else\par\fi}}
+
+%D \type
+%D {processXMLbuffer}
+%D
+%D For illustrative purposes, we need to be able to reuse
+%D definitions, which is why we implement a buffer processor
+%D here. The macro \type {\processXMLbuffer} behaves like
+%D any buffer processor.
+
+\def\processXMLbuffer
+ {\dosingleempty\doprocessXMLbuffer}
+
+\def\doprocessXMLbuffer[#1]%
+ {\doifelsenothing{#1}
+ {\doprocessXMLbuffer[\jobname]}
+ {\begingroup
+ \enableXML
+ \def\dodoprocessXMLbuffer##1{\getbuffer[##1]}%
+ \processcommalist[#1]\dodoprocessXMLbuffer
+ \endgroup}}
+
+%D Loading specific modules takes place with \type
+%D {\useXMLfilters}.
+
+% todo: flag
+
+\def\useXMLfilter[#1]%
+ {\processcommalist[#1]\douseXMLfilter}
+
+\def\douseXMLfilter#1%
+ {\doifundefined{\c!file\f!xtagprefix#1}
+ {\letvalue{\c!file\f!xtagprefix#1}\empty
+ \makeshortfilename[\truefilename{\f!xtagprefix#1}]%
+ \startreadingfile
+ % will be \showmessage
+ \readsysfile\shortfilename{\writestatus{xml}{loading module #1}}\donothing
+ \stopreadingfile}}
+
+%D Temporarily here.
+
+\newtoks\groupedtoks
+\newif\ifcollectXMLgrouped
+
+\bgroup \catcode`\<=\@@active
+
+\newtoks\XMLgtoks
+
+\long\unexpanded\gdef\getXMLgroupedenvironment#1#2#3%
+ {\collectXMLgroupedtrue
+ \XMLgtoks{#2}%
+ \long\def\dodogetgrouped{\@EA\the\@EA\XMLgtoks\the\groupedtoks#3}%
+ \getXMLgrouped{#1}}
+
+\long\unexpanded\gdef\getXMLgroupedargument#1#2%
+ {\collectXMLgroupedtrue
+ \XMLgtoks{#2}%
+ \long\def\dodogetgrouped{\@EA\the\@EA\XMLgtoks\@EA{\the\groupedtoks}}%
+ \getXMLgrouped{#1}}
+
+\long\unexpanded\gdef\getXMLgroupedignore#1%
+ {\collectXMLgroupedfalse
+ \let\dodogetgrouped\relax
+ \getXMLgrouped{#1}}
+
+\long\gdef\docountXMLgrouped#1\end#2\end % 1 relax is enough since it's
+ {\long\def\dosplitXMLstring##1#1##2\relax\relax##3\end % another regime
+ {\def\ascii{##2}%
+ \ifx\ascii\empty \else
+ \advance\scratchcounter \plusone
+ \dosplitXMLstring##2\relax\relax#1\relax\relax\end
+ \fi}%
+ \dosplitXMLstring#2\relax\relax#1\relax\relax\end}
+
+\long\unexpanded\gdef\getXMLgrouped#1% #1 kan weg % klopt dit nu?
+ {\groupedtoks\emptytoks
+ \scratchcounter\zerocount
+ \edef\theXMLnamespace
+ {\ifx\originalXMLnamespace\empty\else\originalXMLnamespace:\fi
+ \currentXMLidentifier}%
+ \expanded{\long\noexpand\def\noexpand\dogetgrouped####1\noexpand</\currentXMLelement>}%
+ {\ifcollectXMLgrouped\appendtoks##1\to\groupedtoks\fi
+ \@EA\docountXMLgrouped\@EA<\theXMLnamespace>\end##1\end
+ \@EAEAEA\docountXMLgrouped\@EA\@EA\@EA<\@EA\theXMLnamespace\space \end##1\end
+ \ifcase\scratchcounter
+ \let\dogetgrouped\dodogetgrouped
+ \else
+ \advance\scratchcounter \minusone
+ \ifcollectXMLgrouped\@EA\appendtoks\@EA<\@EA/\currentXMLelement>\to\groupedtoks\fi
+ \fi
+ \dogetgrouped}%
+ \dogetgrouped}
+
+\egroup
+
+% interesting and fully expandable
+
+\def\XMLownifequalelse#1#2%
+ {\@EAEAEA\@@ifequal\csname\@@XMLvariable:\ownXMLelement:#1\endcsname\relax\@@and#2\relax\@@then}
+
+% \def\XMLifequalelse#1#2#3%
+% {\@EAEAEA\@@ifequal\csname\@@XMLvariable:#1:#2\endcsname\relax\@@and#3\relax\@@then}
+
+\def\XMLifequalelse#1#2%
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ % \@EAEAEA\doXMLifequalelse\@EA\@EA\csname\@@XMLvariable:#1:#2\endcsname
+ \@EA\doXMLifequalelse\csname\@@XMLvariable:#1:#2\@EA\endcsname
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\doXMLifequalelse#1#2%
+ {\@EA\@@ifequal#1\relax\@@and#2\relax\@@then}
+
+%D \starttyping
+%D \defineXMLenvironment[test][a=1]
+%D {\XMLownifequalelse{a}{2}{YES}{NO}}
+%D {}
+%D
+%D \defineXMLenvironment[test][a=1]
+%D {\XMLifequalelse{test}{a}{1}{YES}{NO}}
+%D {}
+%D
+%D \startXMLdata
+%D <test a="1">test</test>
+%D \stopXMLdata
+%D \stoptyping
+
+\def\XMLyes#1{\XMLownifequalelse{#1}{yes}{#1}{}}
+
+%D The next macro will set the variable \type {\flattenedXMLcontent}
+%D to the content with elements removed and entity names.
+
+\bgroup
+
+\catcode`\<\active
+\catcode`\&\active
+
+\gdef\flattenXMLcontent#1% we need taco's 'over one group'
+ {\begingroup
+ \keeputfcharacters
+ \def<##1>{}%
+ \def&##1;{##1}%
+ \edef\flattenedXMLcontent{#1}%
+ \edef\flattenedXMLcontent{\expandafter\dounspaced\flattenedXMLcontent\end}%
+ \@EA\endgroup
+ \@EA\def\@EA\flattenedXMLcontent\@EA{\flattenedXMLcontent}}
+
+\egroup
+
+\def\defXMLexpanded#1#2%
+ {\begingroup
+ \let\getXMLentity\expandedXMLentity
+ \expanded{\endgroup\edef\noexpand#1{#2}}}
+
+\def\gdefXMLexpanded#1#2%
+ {\begingroup
+ \let\getXMLentity\expandedXMLentity
+ \expanded{\endgroup\xdef\noexpand#1{#2}}}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-map.tex b/tex/context/base/xtag-map.tex
new file mode 100644
index 000000000..f8471d6a7
--- /dev/null
+++ b/tex/context/base/xtag-map.tex
@@ -0,0 +1,746 @@
+%D \module
+%D [ file=xtag-map,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Remapping,
+%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 There is a more versatile mapper available in \type {xtag-rem.tex}!
+
+%D We also need something that lets content as-is, like for
+%D instance XML embedded in a chemical caption.
+
+\writestatus{loading}{ConTeXt XML Macros / Remapping}
+
+%D A fundamental characteristic of \TEX\ is that much
+%D processing depends on picking up one or more arguments and
+%D acting upon them. In \type {xtag-ini} we have implemented
+%D the normal (high) level interface between \XML\ and
+%D \CONTEXT, and there we already saw some ways to pick up an
+%D element as argument.
+%D
+%D In this module we will implement a preprocessor. An element
+%D that feeds its content to the preprocessor, becomes a token
+%D list consisting of \TEX\ macros, which in turn may expand to
+%D their meanings.
+%D
+%D This module is only tested with \ETEX. In principle we can
+%D make it work with good old \TEX, but we see no objection
+%D against using \ETEX, especially since it's part of every
+%D grown up \TEX\ distribution.
+
+\unprotect
+
+\let\normalparseXMLescape \parseXMLescape
+\let\normalparseXMLelement\parseXMLelement
+\let\normalparseXMLprocess\parseXMLprocess
+
+\let\normaldoXMLelement \doXMLelement
+\let\normaldoXMLentity \doXMLentity
+
+\def\setnormalXMLhandler
+ {\let\doXMLelement \normaldoXMLelement
+ \let\parseXMLelement\normalparseXMLelement
+ \let\parseXMLescape \normalparseXMLescape
+ \let\parseXMLprocess\normalparseXMLprocess
+ \let\doXMLentity \normaldoXMLentity}
+
+%D A careful reader will notice that we do a full expansion of
+%D the content of the element, although commands that are
+%D protected will stay untouched. In this stage we also
+%D collect key|/|value pairs and pass them onto the \TEX\
+%D macros if needed. Again, we need a fully expandable parser
+%D to handle this, which make the core macros slightly
+%D unreadable.
+%D
+%D The interface presented here evolved from an older module,
+%D written on top of \type {m-sgml}, that could take care of
+%D \MATHML\ (version 1). The implementation here is more
+%D advanced in the sense that it permits all kind of parsers.
+
+\def\findendofXMLelement#1% space after 0/1 prevents auto \relax
+ {\if#1>0 \else
+ \if#1/1 \endofXMLelementE\else
+ \if#1"\endofXMLelementD \else
+ \if#1'\endofXMLelementS \else
+ \endofXMLelementN \fi\fi\fi\fi}
+
+\def\endofXMLelementE#1\fi\fi\fi\fi#2>{\fi\fi}
+\def\endofXMLelementD#1\fi\fi\fi\fi#2"{\fi\fi\fi \findendofXMLelement}
+\def\endofXMLelementS#1\fi\fi\fi\fi#2'{\fi\fi\fi\fi\findendofXMLelement}
+\def\endofXMLelementN \fi\fi\fi\fi {\fi\fi\fi\fi\findendofXMLelement}
+
+% not faster
+%
+% \def\findendofXMLelement#1%
+% {\csname**\if#1>>\else\if#1//\else\if#1""\else\if#1''\else.\fi\fi\fi\fi\endcsname}
+%
+% \def\findendofXMLelement#1%
+% {\csname**\ifcsname**#1\endcsname#1\else.\fi\endcsname}
+%
+% \setvalue{**>}{0 }
+% \setvalue{**/}#1>{1 }
+% \setvalue{**"}#1"{\findendofXMLelement}
+% \setvalue{**'}#1'{\findendofXMLelement}
+% \letvalue{**.}\findendofXMLelement
+
+\newif\ifremapXMLunknown
+
+%D We need three steps to avoid namespace: tag since comment
+%D and processing instructions don't have a namespace. The
+%D first step distinguishes between comment, processing
+%D instructions and elements. The second step (which is
+%D defined in the main mapping macro) either or not grabs the
+%D namespace. We may extend this model later to a more
+%D versatile one, using remapping.
+
+%D Parsing escapes is done by specific macros. For the
+%D moment we assume that the sequence ends with an \type {>}
+%D (which is definietly not the case for \type {CDATA}).
+
+\long\def\remapXMLescape#1#2>{}
+
+%D Processing instructions are remapped and only certain
+%D cases are handled.
+
+\long\def\remapXMLprocess#1#2{\xmlp{procins/}{X}{#1}{#2}}
+
+%D This one is more efficient (although no one will notice
+%D this since this macro is used seldom).
+
+\long\def\remapXMLprocess{\xmlp{procins/}{X}}
+
+%D Element need a bit more work; \type {#4} consumes spaces.
+
+% \def\remapXMLunknownONE#1#2% name args
+% {\ifremapXMLunknown\remapXMLone{\s!unknown}{#1 #2}\fi}
+%
+% \def\remapXMLunknownTWO#1#2% name args
+% {\ifremapXMLunknown\remapXMLtwo{\s!unknown}{#1 #2}\fi}
+%
+% \def\remapXMLunknownTHREE#1#2% name args
+% {\ifremapXMLunknown\remapXMLthree{\s!unknown/}{#1 #2}\fi}
+%
+% \long\def\remapXMLelement#1#2 #3>#4% todo: we need to get rid of the end /
+% {\ifcase\findendofXMLelement#2#3>%
+% \if#1/%
+% \expandafter\ifx\csname\@@XML\@@XMLmapping:#2:M\endcsname\relax
+% \remapXMLunknownONE{#2}{}%
+% \else
+% \remapXMLone{#2}{}%
+% \fi
+% \else
+% \expandafter\ifx\csname\@@XML\@@XMLmapping:#1#2:M\endcsname\relax
+% \remapXMLunknownTWO{#1#2}{#3}%
+% \else
+% \remapXMLtwo{#1#2}{#3}%
+% \fi
+% \fi
+% \else
+% \expandafter\ifx\csname\@@XML\@@XMLmapping:#1#2:M\endcsname\relax
+% \expandafter\ifx\csname\@@XML\@@XMLmapping:#1#2/:M\endcsname\relax
+% \remapXMLunknownTHREE{#1#2}{#3}%
+% \else
+% \remapXMLthree{#1#2/}{#3}%
+% \fi
+% \else
+% \remapXMLthree{#1#2}{#3}%
+% \fi
+% \fi#4}
+
+\def\remapXMLthreeempty#1%
+ {\remapXMLthree{#1/}}
+
+\def\remapXMLunknownONE#1#2% name args
+ {\ifremapXMLunknown\remapXMLone\s!unknown{#1 #2}\fi}
+
+\def\remapXMLunknownTWO#1#2% name args
+ {\ifremapXMLunknown\remapXMLtwo\s!unknown{#1 #2}\fi}
+
+\def\remapXMLunknownTHREE#1#2% name args
+ {\ifremapXMLunknown\remapXMLthreeempty\s!unknown{#1 #2}\fi}
+
+\long\def\remapXMLelement#1#2 #3>#4% todo: we need to get rid of the end /
+ {\ifcase\findendofXMLelement#2#3>%
+ \if#1/%
+ \expandafter\ifx\csname\@@XML\@@XMLmapping:#2:M\endcsname\relax
+ \@EA\remapXMLunknownONE
+ \else
+ \@EA\remapXMLone
+ \fi{#2}\empty
+ \else
+ \expandafter\ifx\csname\@@XML\@@XMLmapping:#1#2:M\endcsname\relax
+ \@EA\remapXMLunknownTWO
+ \else
+ \@EA\remapXMLtwo
+ \fi{#1#2}{#3}%
+ \fi
+ \else
+ \expandafter\ifx\csname\@@XML\@@XMLmapping:#1#2:M\endcsname\relax
+ \expandafter\ifx\csname\@@XML\@@XMLmapping:#1#2/:M\endcsname\relax
+ \@EAEAEA\remapXMLunknownTHREE
+ \else
+ \@EAEAEA\remapXMLthreeempty
+ \fi
+ \else
+ \@EA\remapXMLthree
+ \fi{#1#2}{#3}%
+ \fi#4}
+
+\unexpanded\def\xmlr#1#2{\csname\@@XML\@@XMLmapping:#1:#2\endcsname}
+\unexpanded\def\xmlp#1#2{\csname\@@XML :#1:#2\endcsname}
+\def \expandedxmlr#1#2{\csname\@@XML\@@XMLmapping:#1:#2\endcsname}
+
+\def\expandXMLremapping{\let\xmlr\expandedxmlr}
+
+\def\@@XMLremap{XMLremap}
+
+\def\remapXMLone#1#2%
+ {\ifcase\csname\@@XMLremap\csname\@@XML\@@XMLmapping:#1:M\endcsname\endcsname
+ \or % GCPA
+ \XMLeg\XMLeg
+ \or % GCP-
+ \XMLeg
+ \or % GC-A
+ \XMLeg\XMLeg
+ \or % GC--
+ \XMLeg
+ \or % -CPA
+ \XMLeg
+ \or % -CP-
+ %
+ \or % -C-A
+ \XMLeg
+ \or % -C--
+ %
+ \or % G---
+ \XMLeg
+ \or % GLR-
+ \xmlr{#1}{R}\XMLeg
+ \or % -LR-
+ \xmlr{#1}{R}%
+ \fi}
+
+\def\remapXMLtwo#1#2%
+ {\ifcase\csname\@@XMLremap\csname\@@XML\@@XMLmapping:#1:M\endcsname\endcsname
+ \or % GCPA
+ \XMLbg\xmlr{#1}{X}{#2}\XMLbg
+ \or % GCP-
+ \XMLbg\xmlr{#1}{X}{#2}%
+ \or % GC-A
+ \XMLbg\xmlr{#1}{X}\XMLbg
+ \or % GC--
+ \XMLbg\xmlr{#1}{X}%
+ \or % -CPA
+ \xmlr{#1}{X}{#2}\XMLbg
+ \or % -CP-
+ \xmlr{#1}{X}{#2}%
+ \or % -C-A
+ \xmlr{#1}{X}\XMLbg
+ \or % -C--
+ \xmlr{#1}{X}%
+ \or % G---
+ \XMLbg
+ \or % GLR-
+ \XMLbg\xmlr{#1}{L}%
+ \or % -LR-
+ \xmlr{#1}{L}%
+ \fi}
+
+\def\remapXMLthree#1#2%
+ {\ifcase\csname\@@XMLremap\csname\@@XML\@@XMLmapping:#1:M\endcsname\endcsname
+ \or % GCPA
+ \XMLbg\xmlr{#1}{X}{#2}\XMLbg\XMLeg\XMLeg
+ \or % GCP-
+ \XMLbg\xmlr{#1}{X}{#2}\XMLeg
+ \or % GC-A
+ \XMLbg\xmlr{#1}{X}\XMLbg\XMLeg\XMLeg
+ \or % GC--
+ \XMLbg\xmlr{#1}{X}\XMLeg
+ \or % -CPA
+ \xmlr{#1}{X}{#2}\XMLbg\XMLeg
+ \or % -CP-
+ \xmlr{#1}{X}{#2}%
+ \or % -C-A
+ \xmlr{#1}{X}\XMLbg\XMLeg
+ \or % -C--
+ \xmlr{#1}{X}%
+ \or % G---
+ \XMLbg\XMLeg
+ \fi}
+
+\scratchtoks\@EA{\string{} \edef\XMLbg{\the\scratchtoks}
+\scratchtoks\@EA{\string}} \edef\XMLeg{\the\scratchtoks}
+
+\chardef\XMLremapGCPA = 1 % {\command {arg} { } }
+\chardef\XMLremapGCP = 2 % {\command {arg} } %
+\chardef\XMLremapGCA = 3 % {\command { } }
+\chardef\XMLremapGC = 4 % {\command } %
+\chardef\XMLremapCPA = 5 % \command {arg} { }
+\chardef\XMLremapCP = 6 % \command {arg} %
+\chardef\XMLremapCA = 7 % \command { }
+\chardef\XMLremapC = 8 % \command %
+\chardef\XMLremapG = 9 % { }
+\chardef\XMLremapGLR = 10 % { \bcom \ecom }
+\chardef\XMLremapLR = 11 % \bcom \ecom
+
+%D The remapping is controlled by only a few definition
+%D macros, that both deal with elements. We distinguish
+%D between normal and empty elements.
+%D
+%D \starttyping
+%D \remapXMLsequence [name] [result map] \unexpandablecommand
+%D \remapXMLsequence [name] [result map] \unexpandablecommand
+%D \stoptyping
+%D
+%D The \MATHML\ module demonstrates how these can be used.
+%D The element is converted into a sequence with one or more
+%D of the following components.
+%D
+%D \starttyping
+%D { \command {parameters} {argument} }
+%D \stoptyping
+%D
+%D The following combinations are supported.
+%D
+%D \starttabulate[|c|c|c|c|c|]
+%D \NC GCPA \NC grouped \NC command \NC parameters \NC argument \NC \NR
+%D \NC GCP \NC grouped \NC command \NC parameters \NC \NC \NR
+%D \NC GCA \NC grouped \NC command \NC \NC argument \NC \NR
+%D \NC GC \NC grouped \NC command \NC \NC \NC \NR
+%D \NC CPA \NC \NC command \NC parameters \NC argument \NC \NR
+%D \NC CP \NC \NC command \NC parameters \NC \NC \NR
+%D \NC CA \NC \NC command \NC \NC argument \NC \NR
+%D \NC C \NC \NC command \NC \NC \NC \NR
+%D \NC G \NC grouped \NC \NC \NC \NC \NR
+%D \stoptabulate
+%D
+%D Empty elements (singular ones) never get an argument,
+%D which makes sense, since they have at most parameters.
+
+\def\remapXMLsequence{\doquadrupleargument\doremapXML []}
+\def\remapXMLsingular{\doquadrupleargument\doremapXML[/]}
+
+\def\doremapXML[#1][#2][#3][#4]%
+ {\iffourthargument
+ \def\next{\dodoremapXML[#2][#1][#3][#4]}%
+ \else
+ \def\next{\dodoremapXML[\@@XMLmapping][#1][#2][#3]}%
+ \fi
+ \next}
+
+%\def\dodoremapXML[#1][#2][#3][#4]% class / name pattern
+% {\doifinstringelse{LR}{#4}
+% {\let\next\doremapXMLtwo}
+% {\let\next\doremapXMLone}%
+% \next[#1][#2][#3][#4]}%
+
+\def\dodoremapXML[#1][#2][#3][#4]% class / name pattern
+ {\doifinstringelse{LR}{#4}\doremapXMLtwo\doremapXMLone[#1][#2][#3][#4]}
+
+\def\doremapXMLone[#1][#2][#3][#4]#5%
+ {\setvalue{\@@XML#1:#3#2:M}{#4}%
+ \setvalue{\@@XML#1:#3#2:X}{#5}}
+
+\def\doremapXMLtwo[#1][#2][#3][#4]#5#6%
+ {\setvalue{\@@XML#1:#3:M}{#4}%
+ \setvalue{\@@XML#1:#3:L}{#5}%
+ \setvalue{\@@XML#1:#3:R}{#6}}
+
+\let\dowithentity\empty
+
+%D We handle processing instructions and unknown elements with:
+
+\remapXMLsingular [procins] [CPA] \normalparseXMLprocess
+\remapXMLsingular [\s!unknown] [CPA] \doXMLunknownSI
+\remapXMLsequence [\s!unknown] [CPA] \doXMLunknownSE
+
+\def\doXMLunknownSI#1#2{{\tttf[#1 #2]}}
+\def\doXMLunknownSE#1#2{{\tttf[#1 #2]}}
+
+%D In a similar way, we can remap entities.
+
+\def\remapXMLentity#1;#2%
+ {\doremapXMLentity{#1}#2}%
+
+\def\doremapXMLentity
+ {\xmlrent}
+
+% \unexpanded\def\xmlrent#1%
+% {\getXMLentity{#1}}
+%
+% replaced by:
+
+\unexpanded\def\xmlrent#1%
+ {\doXMLentity#1;}
+
+%D The remapping is taken care of by the following macro,
+%D which takes three arguments.
+%D
+%D \starttyping
+%D \XMLremapdata{before}{after}{content}
+%D \stoptyping
+%D
+%D After the remapping, the content is executed (expanded)
+%D under the normal \TEX\ catcode regime. The intermediate
+%D result can be traced by turning on the following switch.
+
+\newif\iftraceXMLremapping
+
+\newtoks \everyXMLremapping
+
+\appendtoks
+ \defineXMLentity[tex-hash]{\letterhash}%
+ \defineXMLentity[tex-bar]{\myspecialnormalvert}%
+\to \everyXMLremapping
+
+\def\setnormalXMLentities% will change ! ! ! ! !
+ {\defineXMLentity[tex-hash]\letterhash
+ \defineXMLentity[tex-dollar]\letterdollar
+ \defineXMLentity[tex-percent]\letterpercent
+ \defineXMLentity[tex-backslash]\letterbackslash
+ \defineXMLentity[tex-hat]\letterhat
+ \defineXMLentity[tex-underscore]\letterunderscore
+ \defineXMLentity[tex-leftbrace]\letterbgroup
+ \defineXMLentity[tex-rightbrace]\letteregroup
+ \defineXMLentity[tex-bar]\letterbar}
+
+\let\XMLremappedpar\empty
+
+%D Here we implement the second step in the element grabber.
+
+\long\def\XMLremapdata
+ {\dosingleempty\doXMLremapdata}
+
+\long\def\doXMLremapdata[#1]#2#3#4%
+ {\bgroup
+ \startXMLmapping[#1]%
+ % enable unknown elements (should be macro)
+ \doifsomething{#1}
+ {\doifdefinedelse{\@@XML#1:\s!unknown:M}
+ {\remapXMLunknowntrue}{\remapXMLunknownfalse}}%
+ %
+ \pushmacro\doXMLentity % needed ?
+ % this will change, proper split in element itself
+ \ifx\currentXMLnamespace\empty
+ \let\parseXMLelement\remapXMLelement
+ \else
+ % here we need to get rid of the namespace; we also
+ % have to preserve the leading / if present
+ \@EA\long\@EA\def\@EA\parseXMLelement\@EA
+ ##\@EA1\currentXMLnamespace:{\remapXMLelement##1}%
+ % ##2 removes leading spaces
+ \fi
+ %
+ \let\parseXMLescape \remapXMLescape
+ \let\parseXMLprocess\remapXMLprocess
+ %
+ \let\doXMLentity \remapXMLentity
+ %
+ \enableXML % sets entities
+ \enableXMLexpansion
+ \let\par\XMLremappedpar
+ \the\everyXMLremapping
+ %\ignorelines
+ \catcode`\^^I=\@@space
+ \catcode`\^^M=\@@space
+ \catcode`\^^L=\@@space
+ \catcode`\^^Z=\@@space
+ \pushmacro\unicodechar
+ \let\unicodechar\relax
+ \xdef\remappedXMLdata{#4\empty}%
+ \popmacro\unicodechar
+ \let\par\endgraf
+ \popmacro\doXMLentity % needed ?
+ \disableXMLexpansion
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup
+ \catcode`\\=\@@escape
+ \iftraceXMLremapping
+ \ifmmode\vbox\fi\bgroup
+ \defconvertedcommand\ascii\remappedXMLdata
+ \tttf\veryraggedright\ascii\par
+ \writestatus{xml-remap}{\ascii}%
+ \egroup
+ \fi
+ #2\scantokens\@EA{\remappedXMLdata\empty\empty}#3%
+ \stopXMLmapping
+ \egroup}
+
+% testcase:
+%
+% aap‒noot coördinatie – één
+%
+% \startXMLdata
+% aap‒noot coördinatie – één
+% <formula><math><mtext>aap‒noot coördinatie – één</mtext></math></formula>
+% \stopXMLdata
+%
+% weird case:
+%
+% \chardef\XMLtokensreduction\zerocount
+% \startXMLdata
+% <formula><math><mtext>\"{a}\"{o}\"{u}\v{c}\v{s}\v{z}</mtext></math></formula>
+% \stopXMLdata
+%
+% \chardef\XMLtokensreduction\plustwo
+% \startXMLdata
+% <formula><math><mtext>\"{a}\"{o}\"{u}\v{c}\v{s}\v{z}</mtext></math></formula>
+% \stopXMLdata
+
+% rename to better names
+
+\newtoks \XMLRtoks
+\newcount \nofXMLRchildren
+
+\def\naturalxmlr#1#2{\getvalue{\@@XML\@@XMLmapping:#1:#2}}
+
+\def\ignoreXMLRelement#1#2{}
+\def\normalXMLRelement#1#2{#2}
+
+\let\nextXMLRelement \empty
+\let\firstXMLRelement \empty
+\let\secondXMLRelement\empty
+
+% \def\withnextXMLRelement#1%
+% {\pushmacro\dowithnextXMLRelement
+% \def\dowithnextXMLRelement##1##2##3##4##5%
+% {\popmacro\dowithnextXMLRelement
+% \def\nextXMLRelement{##1{##2}{##3}{##4}{##5}}%
+% #1}%
+% \doifnextcharelse\empty\empty\dowithnextXMLRelement}
+%
+% better and faster:
+
+\def\dowithnextXMLRelement#1#2#3#4#5#6%
+ {\def\nextXMLRelement{#2{#3}{#4}{#5}{#6}}#1}%
+
+\def\withnextXMLRelement#1%
+ {\doifnextcharelse\empty\empty{\dowithnextXMLRelement{#1}}}
+
+\def\withnexttwoXMLRelements#1%
+ {\pushmacro\firstXMLRelement
+ \pushmacro\secondXMLRelement
+ \withnextXMLRelement
+ {\let\firstXMLRelement\nextXMLRelement
+ \withnextXMLRelement
+ {\let\secondXMLRelement\nextXMLRelement
+ #1%
+ \popmacro\secondXMLRelement
+ \popmacro\firstXMLRelement}}}
+
+\def\withnextthreeXMLRelements#1% korter, met two
+ {\pushmacro\firstXMLRelement
+ \pushmacro\secondXMLRelement
+ \pushmacro\thirdXMLRelement
+ \withnextXMLRelement
+ {\let\firstXMLRelement\nextXMLRelement
+ \withnextXMLRelement
+ {\let\secondXMLRelement\nextXMLRelement
+ \withnextXMLRelement
+ {\let\thirdXMLRelement\nextXMLRelement
+ #1%
+ \popmacro\thirdXMLRelement
+ \popmacro\secondXMLRelement
+ \popmacro\firstXMLRelement}}}}
+
+\def\doifXMLRchildelse#1#2#3#4%
+ {\pushmacro\xmlr
+ \def\next{#4}%
+ \def\xmlr##1##2##3##4% the / should be sorted out in the mapper
+ {\rawdoifinsetelse{##1}{#1}
+ {\def\next{#3}}
+ {\doif{##1}{#1/}{\def\next{#3}}}}%
+ #2\empty
+ \popmacro\xmlr
+ \next}
+
+\def\doifXMLRchild#1#2#3%
+ {\pushmacro\xmlr
+ \let\next\empty
+ \def\xmlr##1##2##3##4% the / should be sorted out in the mapper
+ {\rawdoifinsetelse{##1}{#1}
+ {\def\next{#3}}
+ {\doif{##1}{#1/}{\def\next{#3}}}}%
+ #2\empty
+ \popmacro\xmlr
+ \next}
+
+\def\encapsulateXMLRchild#1#2#3#4#5%
+ {\pushmacro\xmlr
+ \def\xmlr##1##2##3##4%
+ {\doifelse{##1}{#1}
+ {\def\next{\doencapsulateXMLRchild{#2}{#3}{#4}{##4}}}
+ {\let\next\empty}%
+ \next}%
+ #5\empty
+ \popmacro\xmlr}
+
+\def\encapsulateXMLRchildren#1#2#3#4#5%
+ {\pushmacro\xmlr
+ \pushmacro\betweenXMLRchild
+ \def\betweenXMLRchild{\def\betweenXMLRchild{#3}}%
+ \def\xmlr##1##2##3##4%
+ {\rawdoifinsetelse{##1}{#1}
+ {\pushmacro\xmlr
+ \let\xmlr\naturalxmlr
+ \betweenXMLRchild\xmlr{##1}{##2}{##3}{##4}%
+ \popmacro\xmlr}
+ {}}%
+ #2#5\empty#4%
+ \popmacro\betweenXMLRchild
+ \popmacro\xmlr}
+
+\def\doencapsulateXMLRchild#1#2#3#4%
+ {\pushmacro\xmlr
+ \pushmacro\betweenXMLRchild
+ \def\betweenXMLRchild{\def\betweenXMLRchild{#2}}%
+ \def\xmlr##1##2##3##4%
+ {\pushmacro\xmlr
+ \let\xmlr\naturalxmlr
+ \betweenXMLRchild\xmlr{##1}{##2}{##3}{##4}%
+ \popmacro\xmlr}%
+ #1#4\empty#3%
+ \popmacro\betweenXMLRchild
+ \popmacro\xmlr}
+
+\let\encapsulateXMLR\doencapsulateXMLRchild
+
+\def\withnextXMLRelementelse#1#2%
+ {\def\xdowithnextXMLRelement##1##2##3##4##5%
+ {\def\nextXMLRelement{##1{##2}{##3}{##4}{##5}}#1}%
+ \def\xnowithnextXMLRelement%
+ {\let\nextXMLRelement\empty#2}%
+ \doifnextcharelse\xmlr\xdowithnextXMLRelement\xnowithnextXMLRelement}
+
+\def\encapsulatenextXMLRelements#1#2#3#4% oude bewaren
+ {\pushmacro\betweenXMLRchild
+ \pushmacro\afterXMLRchild
+ \def\betweenXMLRchild{#1\def\betweenXMLRchild{#2}}%
+ \let\afterXMLRchild\empty
+ \withnextXMLRelementelse
+ {\betweenXMLRchild
+ \def\afterXMLRchild{#3}%
+ \nextXMLRelement
+ \doifnextcharelse\empty\xnowithnextXMLRelement\xdowithnextXMLRelement}
+ {\afterXMLRchild
+ \popmacro\afterXMLRchild
+ \popmacro\betweenXMLRchild}%
+ #4}
+
+\def\collectXMLRchild#1#2%
+ {\XMLRtoks\emptytoks
+ \pushmacro\xmlr
+ \def\xmlr##1##2##3##4%
+ {\doif{##1}{#1}{\appendtoks##4\to\XMLRtoks}}%
+ #2\empty
+ \popmacro\xmlr}
+
+\def\doifelseXMLRneighbors#1#2%
+ {\XMLRtoks\emptytoks
+ \pushmacro\xmlr
+ \donefalse
+ \let\prevXMLRchild\empty
+ \def\xmlr##1##2##3##4%
+ {\doif{##1}{#1}{\doif{##1}\prevXMLRchild{\donetrue}}%
+ \def\prevXMLRchild{##1}}%
+ #2\empty
+ \popmacro\xmlr
+ \ifdone
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\collectbetweenXMLRchild#1#2#3%
+ {\XMLRtoks\emptytoks
+ \pushmacro\xmlr
+ \pushmacro\betweenXMLRchild
+ \def\betweenXMLRchild{\def\betweenXMLRchild{\appendtoks#2\to\XMLRtoks}}%
+ \def\xmlr##1##2##3##4%
+ {\rawdoifinsetelse{##1}{#1}
+ {\betweenXMLRchild\appendtoks\xmlr{##1}{##2}{##3}{##4}\to\XMLRtoks}{}}%
+ #3\empty
+ \popmacro\betweenXMLRchild
+ \popmacro\xmlr}
+
+\def\dorawcollectbetweenXMLR#1#2%
+ {\pushmacro\xmlr
+ \pushmacro\betweenXMLRchild
+ \def\betweenXMLRchild{\def\betweenXMLRchild{#1}}%
+ \def\xmlr##1##2##3##4%
+ {\betweenXMLRchild\appendtoks\xmlr{##1}{##2}{##3}{##4}\to\XMLRtoks}%
+ #2\empty
+ \popmacro\betweenXMLRchild
+ \popmacro\xmlr}
+
+\def\rawcollectbetweenXMLR%
+ {\XMLRtoks\emptytoks\dorawcollectbetweenXMLR}
+
+\def\docollectbetweenXMLR#1%
+ {\dorawcollectbetweenXMLR{\appendtoks#1\to\XMLRtoks}}
+
+\def\collectbetweenXMLR%
+ {\XMLRtoks\emptytoks\docollectbetweenXMLR}
+
+\def\processXMLRchildren#1%
+ {\pushmacro\xmlr
+ \let\xmlr\naturalxmlr
+ #1\empty
+ \popmacro\xmlr}
+
+\def\processXMLRchild#1#2% slow but more versatile
+ {\pushmacro\xmlr
+ \XMLRtoks\emptytoks
+ \def\xmlr##1##2##3##4%
+ {\rawdoifinsetelse{##1}{#1}
+ {\appendtoks\xmlr{##1}{##2}{##3}{##4}\to\XMLRtoks}{}}%
+ #2%
+ \popmacro\xmlr
+ \the\XMLRtoks\empty}
+
+\def\countXMLRchildren#1%
+ {\pushmacro\xmlr
+ \nofXMLRchildren=0
+ \def\xmlr##1##2##3##4{\advance\nofXMLRchildren\plusone}
+ #1\empty
+ \popmacro\xmlr}
+
+\def\countXMLRchild#1#2%
+ {\pushmacro\xmlr
+ \nofXMLRchildren=0
+ \def\xmlr##1##2##3##4%
+ {\rawdoifinsetelse{##1}{#1}{\advance\nofXMLRchildren\plusone}{}}
+ #2\empty
+ \popmacro\xmlr}
+
+\def\installXMLunknownremapping
+ {\remapXMLsingular[\s!unknown][CPA]\doXMLunknownSI
+ \remapXMLsequence[\s!unknown][CPA]\doXMLunknownSE}
+
+\bgroup \catcode`<=\active
+
+\gdef\revertXMLremapping
+ {\gdef\doXMLunknownSE##1##2{<##1>##2</##1>}%
+ \gdef\doXMLunknownSI##1##2{<##1>}}
+
+\gdef\unmapXMLdata#1#2% todo: singular, evt ##2 space ervoor en ##1##2
+ {\bgroup
+ \revertXMLremapping
+ \expandXMLremapping % now we can roll back
+ \setnormalXMLhandler % using the normal parser
+ \resetXMLmapping % and leaving the mapping namespace
+ \xdef\unmappedXMLdata{#2}% recreate the original
+ \enableXMLelements % enable normal handler
+ \unmappedXMLdata % off we go ...
+ \egroup}
+
+\egroup
+
+\protect \endinput
diff --git a/tex/context/base/xtag-mea.tex b/tex/context/base/xtag-mea.tex
new file mode 100644
index 000000000..d56d6c54b
--- /dev/null
+++ b/tex/context/base/xtag-mea.tex
@@ -0,0 +1,152 @@
+% filtered from html files by Patrick Ion
+%
+% ISOAMSA Characters Extended
+%
+% Added Math Symbols: Arrow Relations
+
+\defineMMLentity angzarr E248 {unknown} angle with down zig-zag arrow
+\defineMMLentity cirmid E250 {unknown} circle, mid below
+\defineMMLentity cudarrl E23E {unknown} left, curved, down arrow
+\defineMMLentity cudarrr E400 {unknown} right, curved, down arrow
+\defineMMLentity cularr 21B6 {unknown} left curved arrow
+\defineMMLentity cularrp E24A {unknown} curved left arrow with plus
+\defineMMLentity curarr 21B7 {unknown} right curved arrow
+\defineMMLentity curarrm E249 {unknown} curved right arrow with minus
+\defineMMLentity Darr 21A1 {unknown} down two-headed arrow
+\defineMMLentity dArr 21D3 {\Downarrow} down double arrow
+\defineMMLentity ddarr 21CA {unknown} two down arrows
+\defineMMLentity DDotrahd E238 {unknown} right arrow with dotted stem
+\defineMMLentity dfisht E24C {unknown} down fish tail
+\defineMMLentity dHar E227 {unknown} down harpoon-left, down harpoon-right
+\defineMMLentity dharl 21C3 {unknown} down harpoon-left
+\defineMMLentity dharr 21C2 {unknown} down harpoon-rt
+\defineMMLentity duarr E216 {unknown} down arrow, up arrow
+\defineMMLentity duhar E217 {unknown} down harp, up harp
+\defineMMLentity dzigrarr 21DD {unknown} right long zig-zag arrow
+\defineMMLentity erarr E236 {unknown} equal, right arrow below
+\defineMMLentity hArr 21D4 {\Leftrightarrow} left and right double arrow
+\defineMMLentity harr 2194 {\leftrightarrow} left and right arrow
+\defineMMLentity harrcir E240 {unknown} left and right arrow with a circle
+\defineMMLentity harrw 21AD {unknown} left and right arr-wavy
+\defineMMLentity hoarr E243 {unknown} horizontal open arrow
+\defineMMLentity imof 22B7 {unknown} image of
+\defineMMLentity lAarr 21DA {unknown} left triple arrow
+\defineMMLentity Larr 219E {unknown} twoheadleftarrow
+\defineMMLentity larrbfs E220 {unknown} left arrow-bar, filled square
+\defineMMLentity larrfs E222 {unknown} left arrow, filled square
+\defineMMLentity larrhk 21A9 {unknown} left arrow-hooked
+\defineMMLentity larrlp 21AB {unknown} left arrow-looped
+\defineMMLentity larrpl E23F {unknown} left arrow, plus
+\defineMMLentity larrsim E24E {unknown} left arrow, similar
+\defineMMLentity larrtl 21A2 {unknown} left arrow-tailed
+\defineMMLentity lAtail E23D {unknown} left double arrow-tail
+\defineMMLentity latail E23C {unknown} left arrow-tail
+\defineMMLentity lBarr E206 {unknown} left doubly broken arrow
+\defineMMLentity lbarr E402 {unknown} left broken arrow
+\defineMMLentity ldca E21A {unknown} left down curved arrow
+\defineMMLentity ldrdhar E22C {unknown} left harpoon-down over right harpoon-down
+\defineMMLentity ldrushar E228 {unknown} left-down-right-up harpoon
+\defineMMLentity ldsh 21B2 {unknown} left down angled arrow
+\defineMMLentity lfisht E214 {unknown} left fish tail
+\defineMMLentity lHar E225 {unknown} left harpoon-up over left harpoon-down
+\defineMMLentity lhard 21BD {\leftharpoondown} left harpoon-down
+\defineMMLentity lharu 21BC {\leftharpoonup} left harpoon-up
+\defineMMLentity lharul E22E {unknown} left harpoon-up over long dash
+\defineMMLentity llarr 21C7 {unknown} two left arrows
+\defineMMLentity llhard E231 {unknown} left harpoon-down below long dash
+\defineMMLentity loarr E242 {unknown} left open arrow
+\defineMMLentity lrarr 21C6 {unknown} left arr over right arr
+\defineMMLentity lrhar 21CB {unknown} left harp over r
+\defineMMLentity lrhard E22F {unknown} right harpoon-down below long dash
+\defineMMLentity lsh 21B0 {\Lsh} Lsh
+\defineMMLentity lurdshar E229 {unknown} left-up-right-down harpoon
+\defineMMLentity luruhar E22B {unknown} left harpoon-up over right harpoon-up
+\defineMMLentity Map E212 {unknown} twoheaded mapsto
+\defineMMLentity map 21A6 {\mapsto} mapsto
+\defineMMLentity midcir E20F {unknown} mid, circle below
+\defineMMLentity mumap 22B8 {unknown} multimap
+\defineMMLentity nearhk E20D {unknown} NE arrow-hooked
+\defineMMLentity neArr 21D7 {unknown} NE pointing double arrow
+\defineMMLentity nearr 2197 {\nearrow} NE pointing arrow
+\defineMMLentity nesear E20E {unknown} NE \& SE arrows
+\defineMMLentity nhArr 21CE {unknown} not left and right double arr
+\defineMMLentity nharr 21AE {unknown} not left and right arrow
+\defineMMLentity nlArr 21CD {unknown} not implied by
+\defineMMLentity nlarr 219A {unknown} not left arrow
+\defineMMLentity nrArr 21CF {unknown} not implies
+\defineMMLentity nrarr 219B {unknown} not right arrow
+\defineMMLentity nrarrc E21D {unknown} not right arrow-curved
+\defineMMLentity nrarrw E21B {unknown} not right arrow-wavy
+\defineMMLentity nvhArr* 21CE {unknown} not, vert, left and right double arrow
+\defineMMLentity nvlArr 21CD {unknown} not, vert, left double arrow
+\defineMMLentity nvrArr 21CF {unknown} not, vert, right double arrow
+\defineMMLentity nwarhk E20C {unknown} NW arrow-hooked
+\defineMMLentity nwArr 21D6 {unknown} NW pointing double arrow
+\defineMMLentity nwarr 2196 {\nwarrow} NW pointing arrow
+\defineMMLentity nwnear E211 {unknown} NW \& NE arrows
+\defineMMLentity olarr 21BA {unknown} left arr in circle
+\defineMMLentity orarr 21BB {unknown} right arr in circle
+\defineMMLentity origof 22B6 {unknown} original of
+\defineMMLentity rAarr 21DB {unknown} right triple arrow
+\defineMMLentity Rarr 21A0 {unknown} twoheadrightarrow
+\defineMMLentity rarrap E235 {unknown} approximate, right arrow above
+\defineMMLentity rarrbfs E221 {unknown} right arrow-bar, filled square
+\defineMMLentity rarrc E21C {unknown} right arrow-curved
+\defineMMLentity rarrfs E223 {unknown} right arrow, filled square
+\defineMMLentity rarrhk 21AA {\hookrightarrow} right arrow-hooked
+\defineMMLentity rarrlp 21AC {unknown} right arrow-looped
+\defineMMLentity rarrpl E21E {unknown} right arrow, plus
+\defineMMLentity rarrsim E24D {unknown} right arrow, similar
+\defineMMLentity Rarrtl E239 {unknown} right two-headed arrow with tail
+\defineMMLentity rarrtl 21A3 {unknown} right arrow-tailed
+\defineMMLentity rarrw 219D {unknown} right arrow-wavy
+\defineMMLentity rAtail E23B {unknown} right double arrow-tail
+\defineMMLentity ratail 21A3 {unknown} right arrow-tail
+\defineMMLentity RBarr E209 {unknown} twoheaded right broken arrow
+\defineMMLentity rBarr E207 {unknown} right doubly broken arrow
+\defineMMLentity rbarr E405 {unknown} right broken arrow
+\defineMMLentity rdca E219 {unknown} right down curved arrow
+\defineMMLentity rdldhar E22D {unknown} right harpoon-down over left harpoon-down
+\defineMMLentity rdsh 21B3 {unknown} right down angled arrow
+\defineMMLentity rfisht E215 {unknown} right fish tail
+\defineMMLentity rHar E224 {unknown} right harpoon-up over right harpoon-down
+\defineMMLentity rhard 21C1 {\rightharpoondown} right harpoon-down
+\defineMMLentity rharu 21C0 {\rightharpoonup} right harpoon-up
+\defineMMLentity rharul E230 {unknown} right harpoon-up over long dash
+\defineMMLentity rlarr 21C4 {unknown} right arr over left arr
+\defineMMLentity rlhar 21CC {unknown} right harp over l
+\defineMMLentity roarr E241 {unknown} right open arrow
+\defineMMLentity rrarr 21C9 {unknown} two right arrows
+\defineMMLentity rsh 21B1 {\Rsh} Rsh
+\defineMMLentity ruluhar E22A {unknown} right harpoon-up over left harpoon-up
+\defineMMLentity searhk E20B {unknown} SE arrow-hooked
+\defineMMLentity seArr 21D8 {unknown} SE pointing double arrow
+\defineMMLentity searr 2198 {\searrow} SE pointing arrow
+\defineMMLentity seswar E406 {unknown} SE \& SW arrows
+\defineMMLentity simrarr E234 {unknown} similar, right arrow below
+\defineMMLentity slarr E233 {unknown} short left arrow
+\defineMMLentity srarr E232 {unknown} short right arrow
+\defineMMLentity swarhk E20A {unknown} SW arrow-hooked
+\defineMMLentity swArr 21D9 {unknown} SW pointing double arrow
+\defineMMLentity swarr 2199 {\swarrow} SW pointing arrow
+\defineMMLentity swnwar E210 {unknown} SW \& NW arrows
+\defineMMLentity Uarr 219F {unknown} up two-headed arrow
+\defineMMLentity uArr 21D1 {\Uparrow} up double arrow
+\defineMMLentity Uarrocir E237 {unknown} up two-headed arrow above circle
+\defineMMLentity udarr 21C5 {unknown} up arrow, down arrow
+\defineMMLentity udhar E218 {unknown} up harp, down harp
+\defineMMLentity ufisht E24B {unknown} up fish tail
+\defineMMLentity uHar E226 {unknown} up harpoon-left, up harpoon-right
+\defineMMLentity uharl 21BF {unknown} up harpoon-left
+\defineMMLentity uharr 21BE {unknown} up harp-r
+\defineMMLentity uuarr 21C8 {unknown} two up arrows
+\defineMMLentity vArr 21D5 {\Updownarrow} up \& down double arrow
+\defineMMLentity varr 2195 {\updownarrow} up \& down arrow
+\defineMMLentity xhArr E202 {unknown} long left and right double arr
+\defineMMLentity xharr E203 {unknown} long left and right arr
+\defineMMLentity xlArr E200 {unknown} long left double arrow
+\defineMMLentity xlarr E201 {unknown} long left arrow
+\defineMMLentity xmap E208 {unknown} longmapsto
+\defineMMLentity xrArr E204 {unknown} long right double arr
+\defineMMLentity xrarr E205 {unknown} long right arrow
+\defineMMLentity zigrarr E244 {unknown} right zig-zag arrow
diff --git a/tex/context/base/xtag-meb.tex b/tex/context/base/xtag-meb.tex
new file mode 100644
index 000000000..ba370cadf
--- /dev/null
+++ b/tex/context/base/xtag-meb.tex
@@ -0,0 +1,124 @@
+% filtered from html files by Patrick Ion
+%
+% ISOAMSB Characters Extended
+%
+% Added Math Symbols: Binary Operators
+
+\defineMMLentity ac E207 {unknown} most positive
+\defineMMLentity acE E290 {unknown} most positive, two lines below
+\defineMMLentity amalg E251 {\amalg} amalgamation or coproduct
+\defineMMLentity barvee 22BD {unknown} bar, vee
+\defineMMLentity Barwed 2306 {unknown} logical and, double bar above
+\defineMMLentity barwed 22BC {unknown} logical and, bar above
+\defineMMLentity bsolb E280 {unknown} reverse solidus in square
+\defineMMLentity Cap 22D2 {unknown} double intersection
+\defineMMLentity capand E281 {unknown} intersection, and
+\defineMMLentity capbrcup E271 {unknown} intersection, bar, union
+\defineMMLentity capcap E273 {unknown} intersection, intersection, joined
+\defineMMLentity capcup E26F {unknown} intersection above union
+\defineMMLentity capdot E261 {unknown} intersection, with dot
+\defineMMLentity caps E275 {unknown} intersection, serifs
+\defineMMLentity ccaps E279 {unknown} closed intersection, serifs
+\defineMMLentity ccups E278 {unknown} closed union, serifs
+\defineMMLentity ccupssm E27A {unknown} closed union, serifs, smash product
+\defineMMLentity coprod 2210 {\coprod} coproduct operator
+\defineMMLentity Cup 22D3 {unknown} double union
+\defineMMLentity cupbrcap E270 {unknown} union, bar, intersection
+\defineMMLentity cupcap E26E {unknown} union above intersection
+\defineMMLentity cupcup E272 {unknown} union, union, joined
+\defineMMLentity cupdot 228D {unknown} union, with dot
+\defineMMLentity cupor E282 {unknown} union, or
+\defineMMLentity cups E274 {unknown} union, serifs
+\defineMMLentity cuvee 22CE {unknown} curly logical or
+\defineMMLentity cuwed 22CF {unknown} curly logical and
+\defineMMLentity Dagger 2021 {\ddagger} double dagger relation
+\defineMMLentity dagger 2020 {\dagger} dagger relation
+\defineMMLentity diam 22C4 {unknown} open diamond
+\defineMMLentity divonx 22C7 {unknown} division on times
+\defineMMLentity eplus E268 {unknown} equal, plus
+\defineMMLentity hercon 22B9 {unknown} hermitian conjugate matrix
+\defineMMLentity intcal 22BA {\intercal} intercal
+\defineMMLentity iprod E259 {unknown} interior product
+\defineMMLentity loplus E25C {unknown} plus sign in left half circle
+\defineMMLentity lotimes E25E {unknown} multiply sign in left half circle
+\defineMMLentity lthree 22CB {unknown} leftthreetimes
+\defineMMLentity ltimes 22C9 {unknown} times sign, left closed
+\defineMMLentity midast 2217 {\ast} centered asterisk
+\defineMMLentity minusb 229F {unknown} minus sign in box
+\defineMMLentity minusd 2238 {unknown} minus sign, dot above
+\defineMMLentity minusdu E25B {unknown} minus sign, dot below
+\defineMMLentity ncap E284 {unknown} bar, intersection
+\defineMMLentity ncup E283 {unknown} bar, union
+\defineMMLentity oast 229B {unknown} asterisk in circle
+\defineMMLentity ocir 229A {unknown} small circle in circle
+\defineMMLentity odash 229D {unknown} hyphen in circle
+\defineMMLentity odiv E285 {unknown} divide in circle
+\defineMMLentity odot 2299 {\odot} middle dot in circle
+\defineMMLentity odsold E286 {unknown} dot, solidus, dot in circle
+\defineMMLentity ofcir E287 {unknown} filled circle in circle
+\defineMMLentity ogt E289 {unknown} greater-than in circle
+\defineMMLentity ohbar E260 {unknown} circle with horizontal bar
+\defineMMLentity olcir E409 {unknown} large circle in circle
+\defineMMLentity olt E288 {unknown} less-than in circle
+\defineMMLentity omid E40A {unknown} vertical bar in circle
+\defineMMLentity ominus 2296 {\ominus} minus sign in circle
+\defineMMLentity opar E28A {unknown} parallel in circle
+\defineMMLentity operp E28B {unknown} perpendicular in circle
+\defineMMLentity oplus 2295 {\oplus} plus sign in circle
+\defineMMLentity osol 2298 {unknown} solidus in circle
+\defineMMLentity Otimes E28C {unknown} multiply sign in double circle
+\defineMMLentity otimes 2297 {\otimes} multiply sign in circle
+\defineMMLentity otimesas E28D {unknown} multiply sign in circle, circumflex accent
+\defineMMLentity ovbar E40B {unknown} circle with vertical bar
+\defineMMLentity plusacir E26A {unknown} plus, circumflex accent above
+\defineMMLentity plusb 229E {unknown} plus sign in box
+\defineMMLentity pluscir E266 {unknown} plus, small circle above
+\defineMMLentity plusdo 2214 {unknown} plus sign, dot above
+\defineMMLentity plusdu E25A {unknown} plus sign, dot below
+\defineMMLentity pluse E267 {unknown} plus, equals
+\defineMMLentity plussim E26C {unknown} plus, similar below
+\defineMMLentity plustwo E269 {unknown} plus, two; Nim-addition
+\defineMMLentity race E40C {unknown} reverse most positive, line below
+\defineMMLentity roplus E25D {unknown} plus sign in right half circle
+\defineMMLentity rotimes E40D {unknown} multiply sign in right half circle
+\defineMMLentity rthree 22CC {unknown} rightthreetimes
+\defineMMLentity rtimes 22CA {unknown} times sign, right closed
+\defineMMLentity sdot 22C5 {\cdot} small middle dot
+\defineMMLentity sdotb 22A1 {unknown} small dot in box
+\defineMMLentity setmn 2216 {unknown} reverse solidus
+\defineMMLentity simplus E26B {unknown} plus, similar above
+\defineMMLentity smashp E264 {unknown} smash product
+\defineMMLentity solb E27F {unknown} solidus in square
+\defineMMLentity sqcap 2293 {\sqcap} square intersection
+\defineMMLentity sqcaps E277 {unknown} square intersection, serifs
+\defineMMLentity sqcup 2294 {\sqcup} square union
+\defineMMLentity sqcups E276 {unknown} square union, serifs
+\defineMMLentity ssetmn E844 {unknown} sm reverse solidus
+\defineMMLentity sstarf 22C6 {\star} small star, filled, low
+\defineMMLentity subdot E262 {unknown} subset, with dot
+\defineMMLentity sum 2211 {\sum} summation operator
+\defineMMLentity supdot E263 {unknown} superset, with dot
+\defineMMLentity timesb 22A0 {unknown} multiply sign in box
+\defineMMLentity timesbar E28E {unknown} multiply sign, bar below
+\defineMMLentity timesd E26D {unknown} times, dot
+\defineMMLentity tridot 25EC {unknown} dot in triangle
+\defineMMLentity triminus E27C {unknown} minus in triangle
+\defineMMLentity triplus E27B {unknown} plus in triangle
+\defineMMLentity trisb E27E {unknown} triangle, serifs at bottom
+\defineMMLentity tritime E27D {unknown} multiply in triangle
+\defineMMLentity uplus 228E {\uplus} plus sign in union
+\defineMMLentity veebar 22BB {unknown} logical or, bar below
+\defineMMLentity wedbar E265 {unknown} wedge, bar below
+\defineMMLentity wreath 2240 {unknown} wreath product
+\defineMMLentity xcap 22C2 {\bigcap} intersection operator
+\defineMMLentity xcirc 25CB {\bigcirc} large circle
+\defineMMLentity xcup 22C3 {\bigcup} union operator
+\defineMMLentity xdtri 25BD {\bigtriangledown} big down triangle, open
+\defineMMLentity xodot 2299 {\bigodot} circle dot operator
+\defineMMLentity xoplus 2295 {\bigoplus} circle plus operator
+\defineMMLentity xotime 2297 {\bigotimes} circle times operator
+\defineMMLentity xsqcup 2294 {\bigsqcup} square union operator
+\defineMMLentity xuplus 228E {\biguplus} biguplus
+\defineMMLentity xutri 25B3 {\bigtriangleup} big up triangle, open
+\defineMMLentity xvee 22C1 {\bigvee} logical and operator
+\defineMMLentity xwedge 22C0 {\bigwedge} logical or operator
diff --git a/tex/context/base/xtag-mec.tex b/tex/context/base/xtag-mec.tex
new file mode 100644
index 000000000..9e941897c
--- /dev/null
+++ b/tex/context/base/xtag-mec.tex
@@ -0,0 +1,28 @@
+% filtered from html files by Patrick Ion
+%
+% ISOAMSC Characters Extended
+%
+% Added Math Symbols: Delimiters
+
+\defineMMLentity dlcorn 231E {unknown} lower left corner
+\defineMMLentity drcorn 231F {unknown} lower right corner
+\defineMMLentity gtlPar E296 {unknown} double left parenthesis, greater
+\defineMMLentity langd E297 {unknown} left angle, dot
+\defineMMLentity lbrke E299 {unknown} left bracket, equal
+\defineMMLentity lbrksld E29D {unknown} left bracket, solidus bottom corner
+\defineMMLentity lbrkslu E29B {unknown} left bracket, solidus top corner
+\defineMMLentity lceil 2308 {\lceil} left ceiling
+\defineMMLentity lfloor 230A {\lfloor} left floor
+\defineMMLentity lmoust E294 {\lmoustache} left moustache
+\defineMMLentity lparlt E292 {unknown} left parenthesis, lt
+\defineMMLentity ltrPar E295 {unknown} double right parenthesis, less
+\defineMMLentity rangd E298 {unknown} right angle, dot
+\defineMMLentity rbrke E29A {unknown} right bracket, equal
+\defineMMLentity rbrksld E29C {unknown} right bracket, solidus bottom corner
+\defineMMLentity rbrkslu E29E {unknown} right bracket, solidus top corner
+\defineMMLentity rceil 2309 {\rceil} right ceiling
+\defineMMLentity rfloor 230B {\rfloor} right floor
+\defineMMLentity rmoust E293 {\rmoustache} right moustache
+\defineMMLentity rpargt E291 {unknown} right paren, gt
+\defineMMLentity ulcorn 231C {unknown} upper left corner
+\defineMMLentity urcorn 231D {unknown} upper right corner
diff --git a/tex/context/base/xtag-meh.tex b/tex/context/base/xtag-meh.tex
new file mode 100644
index 000000000..1636f2a2b
--- /dev/null
+++ b/tex/context/base/xtag-meh.tex
@@ -0,0 +1,166 @@
+% filtered from html files by Patrick Ion
+%
+% ISOTECH Characters Extended
+%
+% General Technical
+
+\defineMMLentity acd E3A6 {unknown} ac current
+\defineMMLentity aleph 2135 {\aleph} aleph, Hebrew
+\defineMMLentity And E374 {unknown} double logical and
+\defineMMLentity and 2227 {\wedge} logical and
+\defineMMLentity andand E36E {unknown} two logical and
+\defineMMLentity andd E394 {unknown} and, horizontal dash
+\defineMMLentity andslope E50A {unknown} sloping large and
+\defineMMLentity andv E391 {unknown} and with middle stem
+\defineMMLentity angrt 221F {unknown} right (90 degree) angle
+\defineMMLentity angsph 2222 {unknown} angle-spherical
+\defineMMLentity angst 212B {\Angstrom} Angstrom capital A, ring
+\defineMMLentity ap 2248 {\approx} approximate
+\defineMMLentity apacir E38C {unknown} approximate, circumflex accent
+\defineMMLentity awconint 2233 {unknown} contour integral, anti-clockwise
+\defineMMLentity awint E39B {unknown} anti clock-wise integration
+\defineMMLentity becaus 2235 {unknown} because
+\defineMMLentity bernou 212C {unknown} Bernoulli function (script capital B)
+\defineMMLentity bne E388 {unknown} reverse not equal
+\defineMMLentity bnequiv E387 {unknown} reverse not equivalent
+\defineMMLentity bNot E3AD {unknown} reverse not with two horizontal strokes
+\defineMMLentity bnot 2310 {unknown} reverse not
+\defineMMLentity bottom 22A5 {unknown} bottom
+\defineMMLentity cap 2229 {\cap} intersection
+\defineMMLentity Cconint 2230 {unknown} triple contour integral operator
+\defineMMLentity cirfnint E395 {unknown} circulation function
+\defineMMLentity compfn 2218 {\circ} composite function (small circle)
+\defineMMLentity cong 2245 {\cong} congruent with
+\defineMMLentity Conint 222F {unknown} double contour integral operator
+\defineMMLentity conint 222E {\oint} contour integral operator
+\defineMMLentity ctdot 22EF {\cdots} three dots, centered
+\defineMMLentity cup 222A {\cup} union or logical sum
+\defineMMLentity cwconint 2232 {unknown} contour integral, clockwise
+\defineMMLentity cwint 2231 {unknown} clockwise integral
+\defineMMLentity cylcty 232D {unknown} cylindricity
+\defineMMLentity disin E3A0 {unknown} set membership, long horizontal stroke
+\defineMMLentity Dot 0308 {unknown} dieresis or umlaut mark
+\defineMMLentity DotDot 20DC {unknown} four dots above
+\defineMMLentity dsol E3A9 {unknown} solidus, bar above
+\defineMMLentity dtdot 22F1 {\ddots} three dots, descending
+\defineMMLentity dwangle E3AA {unknown} large downward pointing angle
+\defineMMLentity elinters E3A7 {unknown} electrical intersection
+\defineMMLentity epar 22D5 {unknown} parallel, equal; equal or parallel
+\defineMMLentity eparsl E384 {unknown} parallel, slanted, equal; homothetically co
+\defineMMLentity equiv 2261 {\equiv} identical with
+\defineMMLentity eqvparsl E386 {unknown} equivalent, equal; congruent and parallel
+\defineMMLentity exist 2203 {\exists} at least one exists
+\defineMMLentity fltns E381 {unknown} flatness
+\defineMMLentity forall 2200 {\forall} for all
+\defineMMLentity fpartint E396 {unknown} finite part integral
+\defineMMLentity ge 2265 {\geq} greater-than-or-equal
+\defineMMLentity hamilt 210B {unknown} Hamiltonian (script capital H)
+\defineMMLentity iff E365 {unknown} if and only if
+\defineMMLentity iinfin E372 {unknown} infinity sign, incomplete
+\defineMMLentity imped E50B {unknown} impedance
+\defineMMLentity infin 221E {\infty} infinity
+\defineMMLentity infintie E50C {unknown} tie, infinity
+\defineMMLentity Int 222C {unknown} double integral operator
+\defineMMLentity int 222B {\int} integral operator
+\defineMMLentity intlarhk E39A {unknown} integral, left arrow with hook
+\defineMMLentity isin 220A {\in} set membership
+\defineMMLentity isindot E39C {unknown} set membership, dot above
+\defineMMLentity isinE E39E {unknown} set membership, two horizontal strokes
+\defineMMLentity isins E3A4 {unknown} set membership, vertical bar on horizontal
+\defineMMLentity isinsv E3A2 {unknown} large set membership, vertical bar on horiz
+\defineMMLentity isinv 2208 {unknown} set membership, variant
+\defineMMLentity lagran 2112 {unknown} Lagrangian (script capital L)
+\defineMMLentity Lang 300A {unknown} left angle bracket, double
+\defineMMLentity lang 3008 {\langle} left angle bracket
+\defineMMLentity lArr 21D0 {\Leftarrow} is implied by
+\defineMMLentity lbbrk 3014 {unknown} left broken bracket
+\defineMMLentity le 2264 {\leq} less-than-or-equal
+\defineMMLentity loang 3018 {unknown} left open angular bracket
+\defineMMLentity lobrk 301A {unknown} left open bracket
+\defineMMLentity lopar E379 {unknown} left open parenthesis
+\defineMMLentity lowast 2217 {unknown} low asterisk
+\defineMMLentity minus 2212 {unknown} minus sign
+\defineMMLentity mnplus 2213 {\mp} minus-or-plus sign
+\defineMMLentity nabla 2207 {\nabla} del, Hamilton operator
+\defineMMLentity ne 2260 {\ne} not equal
+\defineMMLentity nedot E38A {unknown} not equal, dot
+\defineMMLentity nhpar E38D {unknown} not, horizontal, parallel
+\defineMMLentity ni 220D {unknown} contains
+\defineMMLentity nis E3A5 {unknown} contains, vertical bar on horizontal stroke
+\defineMMLentity nisd E3A1 {unknown} contains, long horizontal stroke
+\defineMMLentity niv 220B {\ni} contains, variant
+\defineMMLentity Not E3AC {unknown} not with two horizontal strokes
+\defineMMLentity notin 2209 {\notin} negated set membership
+\defineMMLentity notindot E39D {unknown} negated set membership, dot above
+\defineMMLentity notinE E50D {unknown} negated set membership, two horizontal strokes
+\defineMMLentity notinva E370 {unknown} negated set membership, variant
+\defineMMLentity notinvb E37B {unknown} negated set membership, variant
+\defineMMLentity notinvc E37C {unknown} negated set membership, variant
+\defineMMLentity notni 220C {unknown} negated contains
+\defineMMLentity notniva 220C {unknown} negated contains, variant
+\defineMMLentity notnivb E37D {unknown} contains, variant
+\defineMMLentity notnivc E37E {unknown} contains, variant
+\defineMMLentity nparsl E389 {unknown} not parallel, slanted
+\defineMMLentity npart E390 {unknown} not partial differential
+\defineMMLentity npolint E399 {unknown} line integration, not including the pole
+\defineMMLentity nvinfin E38E {unknown} not, vert, infinity
+\defineMMLentity olcross E3A8 {unknown} circle, cross
+\defineMMLentity Or E375 {unknown} double logical or
+\defineMMLentity or 2228 {\vee} logical or
+\defineMMLentity ord E393 {unknown} or, horizontal dash
+\defineMMLentity order 2134 {unknown} order of (script small o)
+\defineMMLentity oror E50E {unknown} two logical or
+\defineMMLentity orslope E3AE {unknown} sloping large or
+\defineMMLentity orv E392 {unknown} or with middle stem
+\defineMMLentity par 2225 {\parallel} parallel
+\defineMMLentity parsl E382 {unknown} parallel, slanted
+\defineMMLentity part 2202 {\partial} partial differential
+\defineMMLentity permil 2030 {unknown} per thousand
+\defineMMLentity perp 22A5 {\perp} perpendicular
+\defineMMLentity pertenk 2031 {unknown} per 10 thousand
+\defineMMLentity phmmat 2133 {unknown} physics M-matrix (script capital M)
+\defineMMLentity pointint E376 {unknown} integral around a point operator
+\defineMMLentity Prime 2033 {unknown} double prime or second
+\defineMMLentity prime 2032 {\prime} prime or minute
+\defineMMLentity profalar 232E {unknown} all-around profile
+\defineMMLentity profline 2312 {unknown} profile of a line
+\defineMMLentity profsurf 2313 {unknown} profile of a surface
+\defineMMLentity prop 221D {\propto} is proportional to
+\defineMMLentity qint E378 {unknown} quadruple integral operator
+\defineMMLentity qprime E371 {unknown} quadruple prime
+\defineMMLentity quatint E377 {unknown} quaternion integral operator
+\defineMMLentity radic 221A {\surd} radical
+\defineMMLentity Rang 300B {unknown} right angle bracket, double
+\defineMMLentity rang 3009 {\rangle} right angle bracket
+\defineMMLentity rArr 21D2 {\Rightarrow} implies
+\defineMMLentity rbbrk 3015 {unknown} right broken bracket
+\defineMMLentity roang 3019 {unknown} right open angular bracket
+\defineMMLentity robrk 301B {unknown} right open bracket
+\defineMMLentity ropar E37A {unknown} right open parenthesis
+\defineMMLentity rppolint E397 {unknown} line integration, rectangular path around pole
+\defineMMLentity scpolint E398 {unknown} line integration, semi-circular path around pole
+\defineMMLentity sim 223C {\sim} similar
+\defineMMLentity simdot E38B {unknown} similar, dot
+\defineMMLentity sime 2243 {\simeq} similar, equals
+\defineMMLentity smeparsl E385 {unknown} similar, parallel, slanted, equal
+\defineMMLentity square 25A1 {\square} square
+\defineMMLentity squarf 25A0 {unknown} square, filled
+\defineMMLentity strns E380 {unknown} straightness
+\defineMMLentity sub 2282 {\subset} subset or is implied by
+\defineMMLentity sube 2286 {\subseteq} subset, equals
+\defineMMLentity sup 2283 {\supset} superset or implies
+\defineMMLentity supe 2287 {\supseteq} superset, equals
+\defineMMLentity tdot 20DB {unknown} three dots above
+\defineMMLentity there4 2234 {unknown} therefore
+\defineMMLentity tint 222D {unknown} triple integral operator
+\defineMMLentity top 22A4 {\top} top
+\defineMMLentity topbot 2336 {unknown} top and bottom
+\defineMMLentity topcir E383 {unknown} top, circle below
+\defineMMLentity tprime 2034 {unknown} triple prime
+\defineMMLentity utdot 22F0 {unknown} three dots, ascending
+\defineMMLentity uwangle E3AB {unknown} large upward pointing angle
+\defineMMLentity vangrt 22BE {unknown} right angle, variant (with arc)
+\defineMMLentity veeeq 225A {unknown} logical or, equals
+\defineMMLentity Verbar 2016 {\Vert} double vertical bar
+\defineMMLentity wedgeq 2259 {unknown} corresponds to (wedge, equals)
+\defineMMLentity xnis E3A3 {unknown} large contains, vertical bar on horizontal stroke
diff --git a/tex/context/base/xtag-men.tex b/tex/context/base/xtag-men.tex
new file mode 100644
index 000000000..d548c8394
--- /dev/null
+++ b/tex/context/base/xtag-men.tex
@@ -0,0 +1,98 @@
+% filtered from html files by Patrick Ion
+%
+% ISOAMSN Characters Extended
+%
+% Added Math Symbols: Negated Relations
+
+\defineMMLentity gnap E411 {unknown} greater, not approximate
+\defineMMLentity gnE 2269 {unknown} greater, not double equals
+\defineMMLentity gne 2269 {unknown} greater, not equals
+\defineMMLentity gnsim 22E7 {unknown} greater, not similar
+\defineMMLentity gvnE E2A1 {unknown} gt, vert, not double equals
+\defineMMLentity lnap E2A2 {unknown} less, not approximate
+\defineMMLentity lnE 2268 {unknown} less, not double equals
+\defineMMLentity lne 2268 {unknown} less, not equals
+\defineMMLentity lnsim 22E6 {unknown} less, not similar
+\defineMMLentity lvnE E2A4 {unknown} less, vert, not double equals
+\defineMMLentity nap 2249 {unknown} not approximate
+\defineMMLentity napE E2C7 {unknown} not approximately equal or equal to
+\defineMMLentity napid E2BC {unknown} not approximately identical to
+\defineMMLentity ncong 2247 {unknown} not congruent with
+\defineMMLentity ncongdot E2C5 {unknown} not congruent, dot
+\defineMMLentity nequiv 2262 {unknown} not identical with
+\defineMMLentity ngE 2271 {unknown} not greater, double equals
+\defineMMLentity nge E2A6 {unknown} not greater-than-or-equal
+\defineMMLentity nges 2271 {unknown} not gt-or-equals, slanted
+\defineMMLentity nGg E2CE {unknown} not triple greater than
+\defineMMLentity ngsim 2275 {unknown} not greater, similar
+\defineMMLentity nGt E2CA {unknown} not, vert, much greater than
+\defineMMLentity ngt 226F {unknown} not greater-than
+\defineMMLentity nGtv E2CC {unknown} not much greater than, variant
+\defineMMLentity nlE 2270 {unknown} not less, double equals
+\defineMMLentity nle E2A7 {unknown} not less-than-or-equal
+\defineMMLentity nles 2270 {unknown} not less-or-equals, slant
+\defineMMLentity nLl E2CD {unknown} not triple less than
+\defineMMLentity nlsim 2274 {unknown} not less, similar
+\defineMMLentity nLt E2C9 {unknown} not, vert, much less than
+\defineMMLentity nlt 226E {unknown} not less-than
+\defineMMLentity nltri 22EA {unknown} not left triangle
+\defineMMLentity nltrie 22EC {unknown} not left triangle, equals
+\defineMMLentity nLtv E2CB {unknown} not much less than, variant
+\defineMMLentity nmid 2224 {unknown} negated mid
+\defineMMLentity npar 2226 {unknown} not parallel
+\defineMMLentity npr 2280 {unknown} not precedes
+\defineMMLentity nprcue 22E0 {unknown} not curly precedes, equals
+\defineMMLentity npre E412 {unknown} not precedes, equals
+\defineMMLentity nrtri 22EB {unknown} not right triangle
+\defineMMLentity nrtrie 22ED {unknown} not right triangle, equals
+\defineMMLentity nsc 2281 {unknown} not succeeds
+\defineMMLentity nsccue 22E1 {unknown} not succeeds, curly equals
+\defineMMLentity nsce E413 {unknown} not succeeds, equals
+\defineMMLentity nsim 2241 {unknown} not similar
+\defineMMLentity nsime 2244 {unknown} not similar, equals
+\defineMMLentity nsmid E2AA {unknown} negated short mid
+\defineMMLentity nspar E2AB {unknown} not short par
+\defineMMLentity nsqsube 22E2 {unknown} not, square subset, equals
+\defineMMLentity nsqsupe 22E3 {unknown} not, square superset, equals
+\defineMMLentity nsub 2284 {unknown} not subset
+\defineMMLentity nsubE 2288 {unknown} not subset, double equals
+\defineMMLentity nsube 2288 {unknown} not subset, equals
+\defineMMLentity nsup 2285 {unknown} not superset
+\defineMMLentity nsupE 2289 {unknown} not superset, double equals
+\defineMMLentity nsupe 2289 {unknown} not superset, equals
+\defineMMLentity ntgl 2279 {unknown} not greater, less
+\defineMMLentity ntlg 2278 {unknown} not less, greater
+\defineMMLentity ntvgl 2279 {unknown} not, vert, greater, less
+\defineMMLentity ntvlg 2278 {unknown} not, vert, less, greater
+\defineMMLentity nvap E2C6 {unknown} not, vert, approximate
+\defineMMLentity nVDash 22AF {unknown} not double vert, double dash
+\defineMMLentity nVdash 22AE {unknown} not double vertical, dash
+\defineMMLentity nvDash 22AD {unknown} not vertical, double dash
+\defineMMLentity nvdash 22AC {unknown} not vertical, dash
+\defineMMLentity nvge 2271 {unknown} not, vert, greater-than-or-equal
+\defineMMLentity nvgt 226F {unknown} not, vert, greater-than
+\defineMMLentity nvle 2270 {unknown} not, vert, less-than-or-equal
+\defineMMLentity nvlt 226E {unknown} not, vert, less-than
+\defineMMLentity nvltrie E2D0 {unknown} not, vert, left triangle, equals
+\defineMMLentity nvrtrie E2CF {unknown} not, vert, right triangle, equals
+\defineMMLentity nvsim E415 {unknown} not, vert, similar
+\defineMMLentity parsim E2C8 {unknown} parallel, similar
+\defineMMLentity prnap 22E8 {unknown} precedes, not approx
+\defineMMLentity prnE E2B3 {unknown} precedes, not double equals
+\defineMMLentity prnsim 22E8 {unknown} precedes, not similar
+\defineMMLentity rnmid E2D1 {unknown} reverse nmid
+\defineMMLentity scnap 22E9 {unknown} succeeds, not approx
+\defineMMLentity scnE E2B5 {unknown} succeeds, not double equals
+\defineMMLentity scnsim 22E9 {unknown} succeeds, not similar
+\defineMMLentity simne 2246 {unknown} similar, not equals
+\defineMMLentity solbar E416 {unknown} solidus, bar through
+\defineMMLentity subnE 228A {unknown} subset, not double equals
+\defineMMLentity subne 228A {unknown} subset, not equals
+\defineMMLentity supnE 228B {unknown} superset, not double equals
+\defineMMLentity supne 228B {unknown} superset, not equals
+\defineMMLentity vnsub 2284 {unknown} not subset, variant
+\defineMMLentity vnsup 2285 {unknown} not superset, variant
+\defineMMLentity vsubnE E2B8 {unknown} subset not double equals, variant
+\defineMMLentity vsubne E2B9 {unknown} subset, not equals, variant
+\defineMMLentity vsupnE E2BB {unknown} super not double equals, variant
+\defineMMLentity vsupne E2BA {unknown} superset, not equals, variant
diff --git a/tex/context/base/xtag-meo.tex b/tex/context/base/xtag-meo.tex
new file mode 100644
index 000000000..f19f80fbe
--- /dev/null
+++ b/tex/context/base/xtag-meo.tex
@@ -0,0 +1,58 @@
+% filtered from html files by Patrick Ion
+%
+% ISOAMSO Characters Extended
+%
+% Added Math Symbols: Ordinary
+
+\defineMMLentity ang 2220 {\angle} angle
+\defineMMLentity ange E2D6 {unknown} angle, equal
+\defineMMLentity angmsd 2221 {unknown} angle-measured
+\defineMMLentity angmsdaa E2D9 {unknown} angle-measured, arrow, up, right
+\defineMMLentity angmsdab E2DA {unknown} angle-measured, arrow, up, left
+\defineMMLentity angmsdac E2DB {unknown} angle-measured, arrow, down, right
+\defineMMLentity angmsdad E2DC {unknown} angle-measured, arrow, down, left
+\defineMMLentity angmsdae E2DD {unknown} angle-measured, arrow, right, up
+\defineMMLentity angmsdaf E2DE {unknown} angle-measured, arrow, left, up
+\defineMMLentity angmsdag E2DF {unknown} angle-measured, arrow, right, down
+\defineMMLentity angmsdah E2E0 {unknown} angle-measured, arrow, left, down
+\defineMMLentity angrtvb E418 {unknown} right angle-measured
+\defineMMLentity angrtvbd E2E1 {unknown} right angle-measured, dot
+\defineMMLentity bbrk E2EE {unknown} bottom square bracket
+\defineMMLentity bbrktbrk E419 {unknown} bottom above top square bracket
+\defineMMLentity bemptyv E41A {unknown} reversed circle, slash
+\defineMMLentity beth 2136 {unknown} beth, Hebrew
+\defineMMLentity boxbox E2E6 {unknown} two joined squares
+\defineMMLentity bprime 2035 {unknown} reverse prime
+\defineMMLentity bsemi E2ED {unknown} reverse semi-colon
+\defineMMLentity cemptyv E2E8 {unknown} circle, slash, small circle above
+\defineMMLentity cirE E41B {unknown} circle, two horizontal stroked to the right
+\defineMMLentity cirscir E41C {unknown} circle, small circle to the right
+\defineMMLentity comp 2201 {unknown} complement sign
+\defineMMLentity daleth 2138 {unknown} daleth, Hebrew
+\defineMMLentity demptyv E2E7 {unknown} circle, slash, bar above
+\defineMMLentity ell 2113 {\ell} cursive small l
+\defineMMLentity empty E2D3 {unknown} letter O slashed
+\defineMMLentity emptyv 2205 {unknown} circle, slash
+\defineMMLentity gimel 2137 {unknown} gimel, Hebrew
+\defineMMLentity iiota 2129 {unknown} inverted iota
+\defineMMLentity image 2111 {\Im} imaginary
+\defineMMLentity imath 0131 {\imath} small i, no dot
+\defineMMLentity jmath E2D4 {unknown} small j, no dot
+\defineMMLentity laemptyv E2EA {unknown} circle, slash, left arrow above
+\defineMMLentity lltri E2E5 {unknown} lower left triangle
+\defineMMLentity lrtri E2E3 {unknown} lower right triangle
+\defineMMLentity mho 2127 {unknown} conductance
+\defineMMLentity nang E2D8 {unknown} not, vert, angle
+\defineMMLentity nexist 2204 {unknown} negated exists
+\defineMMLentity oS E41D {unknown} capital S in circle
+\defineMMLentity plank E2D5 {unknown} Planck's over 2pi
+\defineMMLentity plankv 210F {unknown} variant Planck's over 2pi
+\defineMMLentity raemptyv E2E9 {unknown} circle, slash, right arrow above
+\defineMMLentity range E2D7 {unknown} reverse angle, equal
+\defineMMLentity real 211C {\Re} real
+\defineMMLentity tbrk E2EF {unknown} top square bracket
+\defineMMLentity trpezium E2EC {unknown} trapezium
+\defineMMLentity ultri E2E4 {unknown} upper left triangle
+\defineMMLentity urtri E2E2 {unknown} upper right triangle
+\defineMMLentity vzigzag E2EB {unknown} vertical zig-zag line
+\defineMMLentity weierp 2118 {\wp} Weierstrass p
diff --git a/tex/context/base/xtag-mer.tex b/tex/context/base/xtag-mer.tex
new file mode 100644
index 000000000..becff584a
--- /dev/null
+++ b/tex/context/base/xtag-mer.tex
@@ -0,0 +1,185 @@
+% filtered from html files by Patrick Ion
+%
+% ISOAMSR Characters Extended
+%
+% Added Math Symbols: Relations
+
+\defineMMLentity apE E315 {unknown} approximately equal or equal to
+\defineMMLentity ape 224A {unknown} approximate, equals
+\defineMMLentity apid 224B {unknown} approximately identical to
+\defineMMLentity asymp 224D {\asymp} asymptotically equal to
+\defineMMLentity Barv E311 {unknown} vert, double bar (over)
+\defineMMLentity bcong 224C {unknown} reverse congruent
+\defineMMLentity bepsi E420 {unknown} such that
+\defineMMLentity bowtie 22C8 {unknown} bowtie
+\defineMMLentity bsim 223D {unknown} reverse similar
+\defineMMLentity bsime 22CD {unknown} reverse similar, equals
+\defineMMLentity bsolhsub E34D {unknown} reverse solidus, subset
+\defineMMLentity bump 224E {unknown} bumpy equals
+\defineMMLentity bumpe 224F {unknown} bumpy equals, equals
+\defineMMLentity cire 2257 {unknown} circle, equals
+\defineMMLentity Colon 2237 {unknown} two colons
+\defineMMLentity Colone E30E {unknown} double colon, equals
+\defineMMLentity colone 2254 {unknown} colon, equals
+\defineMMLentity congdot E314 {unknown} congruent, dot
+\defineMMLentity csub E351 {unknown} subset, closed
+\defineMMLentity csube E353 {unknown} subset, closed, equals
+\defineMMLentity csup E352 {unknown} superset, closed
+\defineMMLentity csupe E354 {unknown} superset, closed, equals
+\defineMMLentity cuepr 22DE {unknown} curly equals, precedes
+\defineMMLentity cuesc 22DF {unknown} curly equals, succeeds
+\defineMMLentity Dashv E30F {unknown} double dash, vertical
+\defineMMLentity dashv 22A3 {\dashv} dash, vertical
+\defineMMLentity easter 225B {unknown} equal, asterisk above
+\defineMMLentity ecir 2256 {unknown} circle on equals sign
+\defineMMLentity ecolon 2255 {unknown} equals, colon
+\defineMMLentity eDDot E309 {unknown} equal with four dots
+\defineMMLentity eDot 2251 {unknown} equals, even dots
+\defineMMLentity efDot 2252 {unknown} equals, falling dots
+\defineMMLentity eg E328 {unknown} equal-or-greater
+\defineMMLentity egs 22DD {unknown} equal-or-gtr, slanted
+\defineMMLentity egsdot E324 {unknown} equal-or-greater, slanted, dot inside
+\defineMMLentity el E327 {unknown} equal-or-less
+\defineMMLentity els 22DC {unknown} eq-or-less, slanted
+\defineMMLentity elsdot E323 {unknown} equal-or-less, slanted, dot inside
+\defineMMLentity equest 225F {unknown} equal with questionmark
+\defineMMLentity equivDD E318 {unknown} equivalent, four dots above
+\defineMMLentity erDot 2253 {unknown} equals, rising dots
+\defineMMLentity esdot 2250 {unknown} equals, single dot above
+\defineMMLentity Esim E317 {unknown} equal, similar
+\defineMMLentity esim 2242 {unknown} equals, similar
+\defineMMLentity fork 22D4 {unknown} pitchfork
+\defineMMLentity forkv E31B {unknown} fork, variant
+\defineMMLentity frown 2322 {\frown} down curve
+\defineMMLentity gap 2273 {unknown} greater, approximate
+\defineMMLentity gE 2267 {unknown} greater, double equals
+\defineMMLentity gEl 22DB {unknown} gt, double equals, less
+\defineMMLentity gel 22DB {unknown} greater, equals, less
+\defineMMLentity ges E421 {unknown} gt-or-equal, slanted
+\defineMMLentity gescc E358 {unknown} greater than, closed by curve, equal, slanted
+\defineMMLentity gesdot E31E {unknown} greater-than-or-equal, slanted, dot inside
+\defineMMLentity gesdoto E320 {unknown} greater-than-or-equal, slanted, dot above
+\defineMMLentity gesdotol E322 {unknown} greater-than-or-equal, slanted, dot above left
+\defineMMLentity gesl E32C {unknown} greater, equal, slanted, less
+\defineMMLentity gesles E332 {unknown} greater, equal, slanted, less, equal, slanted
+\defineMMLentity Gg 22D9 {unknown} triple gtr-than
+\defineMMLentity gl 2277 {unknown} greater, less
+\defineMMLentity gla E330 {unknown} greater, less, apart
+\defineMMLentity glE E32E {unknown} greater, less, equal
+\defineMMLentity glj E32F {unknown} greater, less, overlapping
+\defineMMLentity gsim 2273 {unknown} greater, similar
+\defineMMLentity gsime E334 {unknown} greater, similar, equal
+\defineMMLentity gsiml E336 {unknown} greater, similar, less
+\defineMMLentity Gt 226B {unknown} double greater-than sign
+\defineMMLentity gtcc E356 {unknown} greater than, closed by curve
+\defineMMLentity gtcir E326 {unknown} greater than, circle inside
+\defineMMLentity gtdot 22D7 {unknown} greater than, with dot
+\defineMMLentity gtquest E32A {unknown} greater than, questionmark above
+\defineMMLentity gtrarr E35F {unknown} greater than, right arrow
+\defineMMLentity homtht 223B {unknown} homothetic
+\defineMMLentity lap 2272 {unknown} less, approximate
+\defineMMLentity lat E33A {unknown} larger than
+\defineMMLentity late E33C {unknown} larger than or equal
+\defineMMLentity lates E33E {unknown} larger than or equal, slanted
+\defineMMLentity lE 2266 {unknown} less, double equals
+\defineMMLentity lEg 22DA {unknown} less, double equals, greater
+\defineMMLentity leg 22DA {unknown} less, equals, greater
+\defineMMLentity les E425 {unknown} less-than-or-equals, slant
+\defineMMLentity lescc E357 {unknown} less than, closed by curve, equal, slanted
+\defineMMLentity lesdot E31D {unknown} less-than-or-equal, slanted, dot inside
+\defineMMLentity lesdoto E31F {unknown} less-than-or-equal, slanted, dot above
+\defineMMLentity lesdotor E321 {unknown} less-than-or-equal, slanted, dot above right
+\defineMMLentity lesg E32B {unknown} less, equal, slanted, greater
+\defineMMLentity lesges E331 {unknown} less, equal, slanted, greater, equal, slanted
+\defineMMLentity lg 2276 {unknown} less, greater
+\defineMMLentity lgE E32D {unknown} less, greater, equal
+\defineMMLentity Ll 22D8 {unknown} triple less-than
+\defineMMLentity lsim 2272 {unknown} less, similar
+\defineMMLentity lsime E333 {unknown} less, similar, equal
+\defineMMLentity lsimg E335 {unknown} less, similar, greater
+\defineMMLentity Lt 226A {unknown} double less-than sign
+\defineMMLentity ltcc E355 {unknown} less than, closed by curve
+\defineMMLentity ltcir E325 {unknown} less than, circle inside
+\defineMMLentity ltdot 22D6 {unknown} less than, with dot
+\defineMMLentity ltlarr E35E {unknown} less than, left arrow
+\defineMMLentity ltquest E329 {unknown} less than, questionmark above
+\defineMMLentity ltrie 22B4 {unknown} left triangle, equals
+\defineMMLentity mcomma E31A {unknown} minus, comma above
+\defineMMLentity mDDot 223A {unknown} minus with four dots, geometric properties
+\defineMMLentity mid 2223 {\mid} mid
+\defineMMLentity mlcp E30A {unknown} transversal intersection
+\defineMMLentity models 22A7 {\models} models
+\defineMMLentity mstpos 223E {unknown} most positive
+\defineMMLentity Pr E35C {unknown} double precedes
+\defineMMLentity pr 227A {\prec} precedes
+\defineMMLentity prap 227E {unknown} precedes, approximate
+\defineMMLentity prcue 227C {unknown} precedes, curly equals
+\defineMMLentity prE 227C {unknown} precedes, double equals
+\defineMMLentity pre 227C {\preceq} precedes, equals
+\defineMMLentity prsim 227E {unknown} precedes, similar
+\defineMMLentity prurel 22B0 {unknown} element precedes under relation
+\defineMMLentity ratio 2236 {unknown} ratio
+\defineMMLentity rtrie 22B5 {unknown} right triangle, equals
+\defineMMLentity rtriltri E359 {unknown} right triangle above left triangle
+\defineMMLentity Sc E35D {unknown} double succeeds
+\defineMMLentity sc 227B {\succ} succeeds
+\defineMMLentity scap 227F {unknown} succeeds, approximate
+\defineMMLentity sccue 227D {unknown} succeeds, curly equals
+\defineMMLentity scE 227E {unknown} succeeds, double equals
+\defineMMLentity sce 227D {\succeq} succeeds, equals
+\defineMMLentity scsim 227F {unknown} succeeds, similar
+\defineMMLentity sdote E319 {unknown} equal, dot below
+\defineMMLentity sfrown E426 {unknown} small down curve
+\defineMMLentity simg E30C {unknown} similar, greater
+\defineMMLentity simgE E338 {unknown} similar, greater, equal
+\defineMMLentity siml E30B {unknown} similar, less
+\defineMMLentity simlE E337 {unknown} similar, less, equal
+\defineMMLentity smid E301 {unknown} shortmid
+\defineMMLentity smile 2323 {\smile} up curve
+\defineMMLentity smt E339 {unknown} smaller than
+\defineMMLentity smte E33B {unknown} smaller than or equal
+\defineMMLentity smtes E33D {unknown} smaller than or equal, slanted
+\defineMMLentity spar E302 {unknown} short parallel
+\defineMMLentity sqsub 228F {unknown} square subset
+\defineMMLentity sqsube 2291 {\sqsubseteq} square subset, equals
+\defineMMLentity sqsup 2290 {unknown} square superset
+\defineMMLentity sqsupe 2292 {\sqsupseteq} square superset, equals
+\defineMMLentity ssmile E303 {unknown} small up curve
+\defineMMLentity Sub 22D0 {unknown} double subset
+\defineMMLentity subE 2286 {unknown} subset, double equals
+\defineMMLentity subedot E34F {unknown} subset, equals, dot
+\defineMMLentity submult E343 {unknown} subset, multiply
+\defineMMLentity subplus E341 {unknown} subset, plus
+\defineMMLentity subrarr E33F {unknown} subset, right arrow
+\defineMMLentity subsim E345 {unknown} subset, similar
+\defineMMLentity subsub E349 {unknown} subset above subset
+\defineMMLentity subsup E347 {unknown} subset above superset
+\defineMMLentity Sup 22D1 {unknown} double superset
+\defineMMLentity supdsub E34C {unknown} superset, subset, dash joining them
+\defineMMLentity supE 2287 {unknown} superset, double equals
+\defineMMLentity supedot E350 {unknown} superset, equals, dot
+\defineMMLentity suphsol E34E {unknown} superset, solidus
+\defineMMLentity suphsub E34B {unknown} superset, subset
+\defineMMLentity suplarr E340 {unknown} superset, left arrow
+\defineMMLentity supmult E344 {unknown} superset, multiply
+\defineMMLentity supplus E342 {unknown} superset, plus
+\defineMMLentity supsim E346 {unknown} superset, similar
+\defineMMLentity supsub E348 {unknown} superset above subset
+\defineMMLentity supsup E34A {unknown} superset above superset
+\defineMMLentity thkap E306 {unknown} thick approximate
+\defineMMLentity thksim E429 {unknown} thick similar
+\defineMMLentity topfork E31C {unknown} fork with top
+\defineMMLentity trie 225C {unknown} triangle, equals
+\defineMMLentity twixt 226C {unknown} between
+\defineMMLentity Vbar E30D {unknown} double vert, bar (under)
+\defineMMLentity vBar E310 {unknown} vert, double bar (under)
+\defineMMLentity vBarv E312 {unknown} double bar, vert over and under
+\defineMMLentity VDash 22AB {unknown} double vert, double dash
+\defineMMLentity Vdash 22A9 {unknown} double vertical, dash
+\defineMMLentity vDash 22A8 {unknown} vertical, double dash
+\defineMMLentity vdash 22A2 {\vdash} vertical, dash
+\defineMMLentity Vdashl E313 {unknown} vertical, dash (long)
+\defineMMLentity vltri 22B2 {\triangleleft} left triangle, open, variant
+\defineMMLentity vprop 221D {unknown} proportional, variant
+\defineMMLentity vrtri 22B3 {\triangleright} right triangle, open, variant
+\defineMMLentity Vvdash 22AA {unknown} triple vertical, dash
diff --git a/tex/context/base/xtag-mmc.tex b/tex/context/base/xtag-mmc.tex
new file mode 100644
index 000000000..27e2c42ea
--- /dev/null
+++ b/tex/context/base/xtag-mmc.tex
@@ -0,0 +1,1265 @@
+%D \module
+%D [ file=xtag-mmc,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Content MathML,
+%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 XML Macros / Content MathML}
+
+% this is the first, experimental, shabby implementation, as
+% always, the third will do -)
+
+% okay, now this is the second one, with a more kid based
+% approach, which we needed for proper nesting, but the
+% code is still too ugly
+
+\startXMLmapping[mml]
+
+\unprotect
+
+\def\MMLccomma{{,}}
+
+\def\getmmlarguments#1#2#3#4#5#6% {class} {defaults} mmlargs
+ {\getXMLarguments{#1}{#2 #5}}%
+
+\def\doifMMLoperatorelse#1#2#3% temp hack
+ {\pushmacro\xmlrent
+ \let\xmlrent\firstofoneargument
+ \edef\mmloperator{#1}%
+ \@EA\unspaceargument\mmloperator\to\mmloperator
+ \popmacro\xmlrent
+ \doifXMLentityelse\mmloperator
+ {\doifdefinedelse{doMMLcFN\mmloperator}{#2}{#3}}
+ {#3}}
+
+\remapXMLsequence [ci] [CPA] \MMLcCI
+\remapXMLsequence [cn] [CPA] \MMLcCN
+\remapXMLsequence [csymbol] [CPA] \MMLcCSYMBOL
+
+\setupMMLappearance[polar][\c!alternative=\v!a] % a|b|c
+
+\def\MMLcpolar#1%
+ {\doifdefinedelse{MMLcdopolar\@@MMLpolaralternative}
+ {\getvalue{MMLcdopolar\@@MMLpolaralternative}{#1}}
+ {#1}}
+
+\def\MMLcdopolara#1%
+ {\def\MMLcsep{\MMLccomma}\getXMLentity{polar}\left(#1\right)}
+
+\def\MMLcdopolarb#1%
+ {\def\MMLcsep##1\empty%
+ {\getXMLentity{exponentiale}^{##1\mskip2mu\getXMLentity{imaginaryi}}}#1}
+
+\def\MMLcdopolarc#1%
+ {\def\MMLcsep##1\empty%
+ {\getXMLentity{exp}\left(##1\mskip2mu\getXMLentity{imaginaryi}\right)}#1}
+
+\def\MMLccartesian#1%
+ {\def\MMLcsep{+}#1\getXMLentity{imaginaryi}}
+
+% float will be obsolete, an is replace by e-notation
+
+\setupMMLappearance[float][\c!symbol=\v!no] % \v!yes|dot
+
+\def\MMLcfloat#1%
+ {\doifelse\@@MMLfloatsymbol\v!no
+ {{\rm#1}} % make sure that e shows up ok
+ {% we should ignore \entities !
+ \beforesplitstring#1\at e\to\first
+ \aftersplitstring #1\at e\to\last
+ \ifx\first\empty #1\else
+ \ifx\last \empty #1\else
+ \first
+ \doifelse\@@MMLfloatsymbol{dot}\cdot\times
+ 10^{\last}%
+ \fi\fi}}
+
+% we now have:
+
+\setupMMLappearance[enotation][\c!symbol=\v!no] % \v!yes|dot
+
+\def\MMLcenotation#1%
+ {\doifelse\@@MMLenotationsymbol\v!no
+ {\def\MMLcsep {\unskip{\rm e}\ignorespaces}}
+ {\def\MMLcsep##1\empty{\doifelse\@@MMLenotationsymbol{dot}\cdot\times10^{##1}}}%
+ #1\empty}
+
+\def\MMLcCI#1% #2% can be sped up with \doifundefined ...
+ {\getXMLarguments{ci}{type="" #1}%
+ \doifXMLparelse{ci}{type}
+ {\processaction
+ [\XMLpar{ci}{type}{}]
+ [ set=>\let\next\MMLcCIset,
+ vector=>\let\next\MMLcCIvector,
+ matrix=>\let\next\MMLcCImatrix,
+ function=>\let\next\MMLcCIfunction,
+complex-cartesian=>\let\next\MMLccartesian,
+ complex=>\let\next\MMLccartesian,
+ complex-polar=>\let\next\MMLcpolar,
+ polar=>\let\next\MMLcpolar,
+ fn=>\let\next\MMLcCIfunction,
+ unknown=>\let\next\firstofoneargument]} % integer constant real float
+ {\let\next\firstofoneargument}%
+ \next}
+
+\def\MMLcCIset#1%
+ {{\bbd#1}}
+
+\def\widevec#1%
+ {\vbox{\mathsurround\zeropoint\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\nointerlineskip}%
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+
+\def\MMLcCIvector#1%
+ {\widevec{#1}}
+
+\def\MMLcCImatrix#1%
+ {{\bi#1}}
+
+\def\MMLcCIfunction#1%
+ {\doifMMLoperatorelse{#1}\MMLcCIdefault\MMLcFNdefault{}{#1}}
+
+\def\MMLcCIdefault#1#2% #1=dummy
+ {#2%\!% \getXMLentity{NegThinSpace}% looks bad in A(x)
+ \doifnextcharelse\xmlr
+ {\encapsulatenextXMLRelements{\left(}{\MMLccomma}{\right)}}
+ {}}
+
+% \def\MMLcFNdefault#1#2% neg space needed because of \left
+% {#2\!% \getXMLentity{NegThinSpace}%
+% \MMLcreset\encapsulatenextXMLRelements{\left(}{\MMLccomma}{\right)}}
+
+\def\MMLcCN#1% #2% can be sped up with \doifundefined ...
+ {\getXMLarguments{cn}{type="" #1}%
+ \doifXMLparelse{cn}{type}
+ {\processaction
+ [\XMLpar{cn}{type}{}]
+ [ integer=>\let\next\MMLcCNinteger,
+ logical=>\let\next\MMLcCNlogical,
+ rational=>\let\next\MMLcCNrational,
+complex-cartesian=>\let\next\MMLccartesian,
+ complex=>\let\next\MMLccartesian,
+ complex-polar=>\let\next\MMLcpolar,
+ polar=>\let\next\MMLcpolar,
+ e-notation=>\let\next\MMLcenotation, % new
+ float=>\let\next\MMLcfloat, % obsolete
+ real=>\let\next\MMLcfloat, % ?
+ unknown=>\let\next\firstofoneargument]}
+ {\let\next\firstofoneargument}
+ \next}
+
+\setupMMLappearance[base][\c!symbol=\v!numbers] % cijfers|letters|tekst|nee
+
+\def\MMLcCNinteger#1%
+ {\doifXMLparelse{cn}{base}
+ {\def\MMLcCNbase{\XMLpar{cn}{base}{}}%
+ \doifelse\@@MMLbasesymbol\v!no
+ {\MMLcCNbasedata{#1}}
+ {\MMLcCNbasedata{#1}_{\hbox{$\rm\scriptscriptstyle
+ \processaction
+ [\@@MMLbasesymbol]
+ [\v!characters=>\MMLcCNbasestring BODH,
+ \v!text=>\MMLcCNbasestring{BIN}{OCT}{DEC}{HEX},
+ \s!unknown=>\MMLcCNbase]$}}}}
+ {#1}}
+
+\def\MMLcCNbasedata#1%
+ {\ifnum\MMLcCNbase>10{\rm#1}\else#1\fi}
+
+\def\MMLcCNbasestring#1#2#3#4%
+ {\ifnum\MMLcCNbase= 2 #1\else
+ \ifnum\MMLcCNbase= 8 #2\else
+ \ifnum\MMLcCNbase=10 #3\else
+ \ifnum\MMLcCNbase=16 #4\else
+ \MMLcCNbase \fi\fi\fi\fi}
+
+\def\MMLcCNlogical#1%
+ {{\rm#1}}
+
+\def\MMLcCNrational#1%
+ {\ConvertConstantAfter\doifinstringelse{sep}{#1}
+ {\doMMLcCNrational#1\empty}
+ {#1}}
+
+\def\doMMLcCNrational#1\xmlr#2#3#4#5\empty
+ {\hbox{$\frac{#1}{#5}$}}
+
+\def\MMLcCSYMBOL#1#2% TO DO
+ {\getXMLarguments{csymbol}{encoding="text" #1}%
+ \doifelse{\XMLpar{csymbol}{encoding}{}}{text}
+ {{\rm#2}}{#2}}
+
+%%% basic content elements
+
+\remapXMLsequence [apply] [CPA] \MMLcAPPLY
+
+\newcount\@MMLlevel \def\MMLcreset{\@MMLlevel=0 }
+
+\let\MMLctempresetlist\empty \def\setMMLcreset{\edef\MMLctempresetlist}
+
+\def\MMLcmainresetlist%
+ {times/,divide/,power/,%
+ lt/,gt/,eq/,leq/,geq/,%
+ in/,inverse/,%
+ fn,%
+ floor/,ceiling/,%
+ mean/,%
+ selector/,%
+ abs/,int/,limit/,sum/,product/,%
+ outerproduct/,innerproduct/,scalarproduct/}
+
+\def\MMLcfunctionlist
+ {sin/,arcsin/,sinh/,arcsinh/,%
+ cos/,arccos/,cosh/,arccosh/,%
+ tan/,arctan/,tanh/,arctanh/,%
+ cot/,arccot/,coth/,arccoth/,%
+ csc/,arccsc/,csch/,arccsch/,%
+ sec/,arcsec/,sech/,arcsech/,%
+ ln/,exp/,log/,%
+ abs/,int/,limit/,sum/,product/,%
+ fn} % ?
+
+\def\MMLcconstructlist
+ {diff/,partialdiff/,root/} % apply goes wrong on 1/2 * (a_2 + b_3)
+
+% better: no () here but explicitly when needed, which is in
+% less cases
+
+\def\MMLcAPPLY#1#2%
+ {\mathinner{\begingroup % new, else 1/2(1+2) problem / inner: ask taco
+ \pushmacro\xmlr
+ \@EA\@EA\@EA\doifXMLRchild\@EA\@EA\@EA{\@EA\MMLcmainresetlist\@EA,\MMLctempresetlist}{#2}
+ {\MMLcreset}%
+ \ifcase\@MMLlevel
+ \getXMLarguments{apply}{open="" close="" #1}%
+ \else
+ \getXMLarguments{apply}{open="(" close=")" #1}%
+ \fi
+ \doifXMLparelse{apply}{open}{\left\XMLpar{apply}{open}{}}{}%
+ \advance\@MMLlevel+1
+ \begingroup
+ \let\MMLctempresetlist\empty
+ \let\xmlr\naturalxmlr % beter een \pushmacro\xmlr
+ #2\empty
+ \endgroup % ook level push
+ \advance\@MMLlevel-1
+ \doifXMLparelse{apply}{close}{\right\XMLpar{apply}{close}{}}{}%
+ \popmacro\xmlr
+ \endgroup}}
+
+\remapXMLsequence [reln] [CPA] \MMLcRELN
+
+\def\MMLcRELN%
+ {\writestatus{XML}{MathML element "reln" is obsolete}\MMLcAPPLY}
+
+\remapXMLsequence [fn] [CPA] \MMLcFN
+
+\def\MMLcFN#1#2% neg space needed because of \left
+ {\doifXMLRchildelse{ci}{#2}
+ {\collectXMLRchild{ci}{#2}%
+ \@EA\doifMMLoperatorelse\@EA{\the\XMLRtoks}
+ \MMLcFNoperator\MMLcFNdefault}
+ {\MMLcFNdefault}%
+ {#1}{#2}}
+
+\def\MMLcFNdefault#1#2% neg space needed because of \left
+ {#2\!% \getXMLentity{NegThinSpace}%
+ \MMLcreset\encapsulatenextXMLRelements{\left(}{\MMLccomma}{\right)}}
+
+% special function handlers
+
+\def\MMLcFNoperator
+ {\getvalue{doMMLcFN\mmloperator}}
+
+% \def\doMMLcFNplusminus#1#2#3\empty
+% {\countXMLRchildren{#3}%
+% \ifcase\nofXMLRchildren\or
+% #2#3%
+% \else % suboptimal for instance under root
+% \encapsulateXMLR{\left(}{#2}{\right)}{\MMLcreset#3}%
+% \fi}
+
+\def\doMMLcFNplusminus#1#2#3\empty
+ {\countXMLRchildren{#3}%
+ \ifcase\nofXMLRchildren\or
+ \def\next{#2#3}%
+ \else
+ \def\next
+ {\doifnextcharelse\xmlr
+ {\encapsulateXMLR{\left(}{#2}{\right)}{\MMLcreset#3}}%
+ {\encapsulateXMLR{}{#2}{}{\MMLcreset#3}}}%
+ \fi
+ \next}
+
+\let\doMMLcFNminusplus\doMMLcFNplusminus
+
+\def\doMMLcFNcontinued#1#2#3\empty
+ {#3\getXMLentity{continued}}
+
+% so far for the special handlers
+
+\remapXMLsequence [interval] [CPA] \MMLcINTERVAL
+
+\def\MMLcINTERVAL#1#2%
+ {\withnexttwoXMLRelements
+ {\getXMLarguments{interval}{closure="closed" #1}%
+ \processaction
+ [\XMLpar{interval}{closure}{closed}]
+ [ closed=>{[\firstXMLRelement,\secondXMLRelement]},
+ open-closed=>{(\firstXMLRelement,\secondXMLRelement]},
+ closed-open=>{[\firstXMLRelement,\secondXMLRelement)},
+ open=>{(\firstXMLRelement,\secondXMLRelement)},
+ \s!unknown=>{[\firstXMLRelement,\secondXMLRelement]}]}%
+ #2\empty}
+
+\remapXMLsingular [inverse] [CPA] \MMLcINVERSE
+
+\def\MMLcINVERSE#1#2%
+ {\withnextXMLRelement
+ {\nextXMLRelement\empty^{-1}% \empty kills MMLcfunction lookahead
+ \withnextXMLRelement
+ {\ifx\nextXMLRelement\empty \else
+ \left[\nextXMLRelement\right]%
+ \fi}}}
+
+\remapXMLsingular [sep] [CPA] \MMLcSEP
+
+\def\MMLcSEP#1#2{\MMLcsep} \def\MMLcsep{\,}
+
+\remapXMLsequence [condition] [CPA] \MMLcCONDITION
+
+\def\MMLcCONDITION#1#2%
+ {\pushmacro\MMLcBVAR
+ \doifXMLRchild{bvar}{#2}{\processXMLRchild{bvar}{#2}\mid}%
+ \let\MMLcBVAR\ignoreXMLRelement
+ \processXMLRchildren{#2}%
+ \popmacro\MMLcBVAR}
+
+\remapXMLsequence [declare] [CPA] \MMLcDECLARE
+
+\setupMMLappearance[declare][\c!state=\v!start]
+
+\def\MMLcDECLARE#1#2%
+ {\doif\@@MMLdeclarestate\v!start
+ {\withnextXMLRelement
+ {\getXMLentity{declare}\nextXMLRelement
+ \countXMLRchildren{#2}%
+ \ifnum\nofXMLRchildren>1
+ \;% \getXMLentity{ThickSpace}%
+ \getXMLentity{as}%
+ \;% \getXMLentity{ThickSpace}%
+ \fi}%
+ #2\empty}}
+
+\remapXMLsequence [lambda] [CPA] \MMLcLAMBDA
+
+\setupMMLappearance[lambda][\c!alternative=b]
+
+\def\MMLcLAMBDA#1#2%
+ {\doifelse\@@MMLlambdaalternative\v!a
+ {\encapsulateXMLR{\getXMLentity{lambda}(}{\MMLccomma}{)}{#2}}
+ {\countXMLRchild{bvar}{#2}%
+ \ifnum\nofXMLRchildren>1
+ \collectXMLRchild{bvar}{#2}%
+ \encapsulateXMLR{\left(}{\MMLccomma}{\right)}{\the\XMLRtoks}%
+ \else
+ \processXMLRchild{bvar}{#2}%
+ \fi
+ \getXMLentity{mapsto}%
+ \processXMLRchild{apply,reln,ci,cn}{#2}}}
+
+\remapXMLsingular [compose] [CPA] \MMLcCOMPOSE
+
+\def\MMLcCOMPOSE#1#2#3\empty
+ {\doifMMLfunctionelse{#3}
+ {\encapsulateXMLR{\left(}{\circ}{\right)}{#3}}
+ {\encapsulateXMLR{}{\circ}{}{#3}}}
+
+\remapXMLsingular [ident] [CPA] \MMLcIDENT
+
+\def\MMLcIDENT#1#2{\getXMLentity{identity}}
+
+\remapXMLsingular [domain] [CPA] \MMLcDOMAIN
+\remapXMLsingular [codomain] [CPA] \MMLcCODOMAIN
+
+\def\MMLcDOMAIN #1#2#3\empty
+ {\getXMLentity{domain}(\MMLcreset\processXMLRchildren{#3})}
+
+\def\MMLcCODOMAIN#1#2#3\empty
+ {\getXMLentity{codomain}(\MMLcreset\processXMLRchildren{#3})}
+
+\remapXMLsingular [image] [CPA] \MMLcIMAGE
+
+\def\MMLcIMAGE#1#2%
+ {\withnextXMLRelement{\getXMLentity{image}(\nextXMLRelement)}}
+
+\remapXMLsequence [domainofapplication] [CPA] \MMLcDOMAINOFAPPLICATION
+
+\def\MMLcDOMAINOFAPPLICATION#1#2{#2}
+
+\remapXMLsequence [piecewise] [CPA] \MMLcPIECEWISE
+\remapXMLsequence [piece] [CPA] \MMLcPIECE
+\remapXMLsequence [otherwise] [CPA] \MMLcOTHERWISE
+
+\setupMMLappearance[piece][\c!separator=]
+
+\def\MMLcPIECEWISE#1#2%
+ {\cases{#2}}
+
+\def\MMLcPIECEseparator{\doif\@@MMLpieceseparator\v!yes,}
+
+\def\MMLcPIECE#1#2%
+ {\withnexttwoXMLRelements
+ {\@EA\XMLRtoks\@EA{\firstXMLRelement\MMLcPIECEseparator\@col@amp@}%
+ \@EA\appendtoks\@EA\mathematics\@EA{\secondXMLRelement}\to\XMLRtoks
+ \the\XMLRtoks\crcr}%
+ #2}
+
+\def\MMLcOTHERWISE#1#2%
+ {#2\MMLcPIECEseparator\@col@amp@\mathematics{\getXMLentity{otherwise}}\crcr}
+
+%%% arithmic, algebra and logic
+
+\remapXMLsingular [quotient] [CPA] \MMLcQUOTIENT
+
+\def\MMLcQUOTIENT#1#2%
+ {\withnexttwoXMLRelements{\lfloor\firstXMLRelement/\secondXMLRelement\rfloor}}
+
+\remapXMLsingular [factorial] [CPA] \MMLcFACTORIAL
+
+\def\MMLcFACTORIAL#1#2%
+ {\withnextXMLRelement{\nextXMLRelement !}}
+
+\remapXMLsingular [divide] [CPA] \MMLcDIVIDE
+
+\setupMMLappearance [divide] [\c!level=\!!maxcard]
+
+\def\MMLcDIVIDE#1#2%
+ {\withnexttwoXMLRelements
+ {\increment\MMLcDIVIDElevel
+ \ifnum\MMLcDIVIDElevel>\@@MMLdividelevel\space
+ \firstXMLRelement/\secondXMLRelement
+ \else
+ \frac{\MMLcreset\firstXMLRelement}{\MMLcreset\secondXMLRelement}%
+ \fi
+ \decrement\MMLcDIVIDElevel}}
+
+\remapXMLsingular [min] [CPA] \MMLcMIN
+\remapXMLsingular [max] [CPA] \MMLcMAX
+
+\def\MMLcMIN#1#2#3\empty
+ {\encapsulateXMLR
+ {\min\doifXMLRchild{bvar}{#3}{_{\processXMLRchild{bvar}{#3}}}\left\{}
+ {\MMLccomma}{\right\}}{#3}}
+
+\def\MMLcMAX#1#2#3\empty
+ {\encapsulateXMLR
+ {\max\doifXMLRchild{bvar}{#3}{_{\processXMLRchild{bvar}{#3}}}\left\{}
+ {\MMLccomma}{\right\}}{#3}}
+
+\remapXMLsingular [minus] [CPA] \MMLcMINUS
+\remapXMLsingular [plus] [CPA] \MMLcPLUS
+
+\setupMMLappearance[sign][\c!reduction=\v!yes]
+
+\def\MMLcMINUS % expandafter needed ?
+ {\doifelse\@@MMLsignreduction\v!yes
+ {\expandafter\MMLcMINUSyes}{\expandafter\MMLcMINUSno}}
+
+\def\MMLcPLUS % expandafter needed ?
+ {\doifelse\@@MMLsignreduction\v!yes
+ {\expandafter\MMLcPLUSyes}{\expandafter\MMLcPLUSno}}
+
+\def\MMLcMINUSno#1#2#3\empty
+ {\countXMLRchildren{#3}%
+ \encapsulateXMLR{\ifcase\nofXMLRchildren\or-\fi}{-}{}{#3}}
+
+\def\MMLcPLUSno#1#2#3\empty
+ {\countXMLRchildren{#3}%
+ \encapsulateXMLR{\ifcase\nofXMLRchildren\or+\fi}{+}{}{#3}}
+
+\def\MMLcMINUSyes#1#2#3\empty
+ {\setMMLcreset{\MMLcfunctionlist}%
+ \countXMLRchildren{#3}%
+ \encapsulateXMLR{\ifcase\nofXMLRchildren\or-\fi}{-}{}{#3}}
+
+\def\MMLcPLUSyes#1#2#3\empty
+ {\setMMLcreset{plus/,minus/,\MMLcfunctionlist,\MMLcconstructlist}%
+ \encapsulatenextXMLRelements
+ {}
+ {\doifXMLRchildelse{apply}{\nextXMLRelement}%
+ {\collectXMLRchild{apply}{\nextXMLRelement}%
+ \doifXMLRchildelse{minus/}{\the\XMLRtoks}
+ {\countXMLRchildren{\the\XMLRtoks}
+ \ifnum\nofXMLRchildren>2 +\else\fi}{+}}
+ {+}}
+ {}
+ {#3\empty}}
+
+\remapXMLsingular [power] [CPA] \MMLcPOWER
+
+\setupMMLappearance[power][\c!reduction=\v!yes]
+
+\let\MMLpowerelement\empty
+
+\def\MMLcPOWER#1#2%
+ {\withnexttwoXMLRelements
+ {\doifXMLRchildelse{apply}{\firstXMLRelement}
+ {\doifelse\@@MMLpowerreduction\v!yes
+ {\collectXMLRchild{apply}{\firstXMLRelement}%
+ \@EA\doifXMLRchildelse\@EA{\MMLcfunctionlist}{\the\XMLRtoks}
+ {\let\MMLpowerelement\secondXMLRelement
+ \MMLcreset\firstXMLRelement\empty}
+ {\left(\MMLcreset\firstXMLRelement\empty\right)^{\MMLcreset\secondXMLRelement}}}
+ {\left(\MMLcreset\firstXMLRelement\empty\right)^{\MMLcreset\secondXMLRelement}}}
+ {\firstXMLRelement^{\MMLcreset\secondXMLRelement}}}}
+
+\remapXMLsingular [rem] [CPA] \MMLcREM
+
+\def\MMLcREM#1#2%
+ {\withnexttwoXMLRelements
+ {\firstXMLRelement\getXMLentity{mod}\secondXMLRelement}}
+
+\remapXMLsingular [times] [CPA] \MMLcTIMES
+
+\setupMMLappearance[times][\c!symbol=\v!no] %
+\setupMMLappearance[times][\c!auto=\v!yes] % new, auto catches cn cn cn
+
+\def\MMLcTIMES#1#2#3\empty
+ {\setMMLcreset{\MMLcfunctionlist,\MMLcconstructlist}%
+ \doifelse\@@MMLtimesauto\v!no
+ {\let\@@MMLtimes@@symbol\@@MMLtimessymbol}
+ {\doifelseXMLRneighbors{cn}{#3}
+ {\let\@@MMLtimes@@symbol\v!yes}
+ {\let\@@MMLtimes@@symbol\@@MMLtimessymbol}}%
+ \doifelse\@@MMLtimes@@symbol\v!yes
+ {\encapsulateXMLR{}{\times}{}{#3\empty}}
+ {\doifelse\@@MMLtimes@@symbol{dot}
+ {\encapsulateXMLR{}{\cdot}{}{#3\empty}}
+ {#3\empty}}}
+
+\remapXMLsingular [root] [CPA] \MMLcROOT
+
+\setupMMLappearance[root][\c!symbol=\v!yes]
+
+\def\MMLcROOT#1#2#3\empty
+ {\doifXMLRchildelse{degree}{#3}\donetrue\donefalse
+ \doif\@@MMLrootsymbol\v!no\donefalse
+ \ifdone
+ \root\processXMLRchild{degree}{#3}\of
+ {\let\MMLcDEGREE\ignoreXMLRelement
+ \MMLcreset\processXMLRchildren{#3}}%
+ \else
+ \sqrt
+ {\MMLcreset\processXMLRchildren{#3}}%
+ \fi}
+
+\remapXMLsingular [gcd] [CPA] \MMLcGCD
+
+\def\MMLcGCD#1#2#3\empty{\encapsulateXMLR{\gcd(}{\MMLccomma}{)}{#3}}
+
+\remapXMLsingular [and] [CPA] \MMLcAND
+\remapXMLsingular [or] [CPA] \MMLcOR
+\remapXMLsingular [xor] [CPA] \MMLcXOR
+\remapXMLsingular [implies] [CPA] \MMLcIMPLIES
+
+\def\MMLcAND #1#2#3\empty{\encapsulateXMLR{}{\getXMLentity{and}}{}{#3}}
+\def\MMLcOR #1#2#3\empty{\encapsulateXMLR{}{\getXMLentity{or}}{}{#3}}
+\def\MMLcXOR #1#2#3\empty{\encapsulateXMLR{}{\getXMLentity{xor}}{}{#3}}
+\def\MMLcIMPLIES#1#2#3\empty{\encapsulateXMLR{}{\getXMLentity{implies}}{}{#3}}
+
+\remapXMLsingular [not] [CPA] \MMLcNOT
+
+\def\MMLcNOT#1#2#3\empty{\getXMLentity{not}\processXMLRchildren{#3}}
+
+\remapXMLsingular [forall] [CPA] \MMLcFORALL
+\remapXMLsingular [exists] [CPA] \MMLcEXISTS
+
+\def\MMLcFORALL%
+ {\getXMLentity{forall}%
+ \!% \getXMLentity{NegThinSpace}%
+ \MMLcFORALLandEXISTS}
+
+\def\MMLcEXISTS%
+ {\getXMLentity{exists}%
+ \MMLcFORALLandEXISTS}
+
+\def\MMLcFORALLandEXISTS#1#2#3\empty
+ {\MMLcreset
+ _{\encapsulateXMLRchildren{bvar}{}{\MMLccomma}{}{#3}}%
+ \doifXMLRchildelse{condition}{#3}
+ {\;% \getXMLentity{ThickSpace}%
+ \processXMLRchild{condition}{#3}
+ \doifXMLRchildelse{apply,reln,ci,cn}{#3}
+ {\countXMLRchild{apply,reln,ci,cn}{#3}%
+ \ifcase\nofXMLRchildren\or % == snelle volgende
+ \encapsulateXMLRchildren{apply,reln,ci,cn}
+ {\left\vert}%
+ {}
+ {\right.}
+ {#3\empty}%
+ \else % special case
+ \pushmacro\MMLcCONDITION
+ \let\MMLcCONDITION\gobbletwoarguments
+ \collectbetweenXMLRchild{apply,reln,ci,cn}{\hfill\crcr}{#3}%
+ \left\vert\matrix{\the\XMLRtoks}\right.%
+ \popmacro\MMLcCONDITION
+ \fi}
+ {}}
+ {:\processXMLRchild{apply,reln,ci,cn}{#3\empty}}}
+
+\remapXMLsingular [abs] [CPA] \MMLcABS
+
+\def\MMLcABS#1#2#3\empty
+ {\left\vert\MMLcreset\processXMLRchildren{#3}\right\vert}
+
+\remapXMLsingular [conjugate] [CPA] \MMLcCONJUGATE
+
+\def\MMLcCONJUGATE#1#2#3\empty%
+ {\overline{\MMLcreset\processXMLRchildren{#3}}}
+
+\remapXMLsingular [arg] [CPA] \MMLcARG
+
+\def\MMLcARG#1#2#3\empty
+ {\getXMLentity{arg}(\MMLcreset\processXMLRchildren{#3})}
+
+\remapXMLsingular [real] [CPA] \MMLcREAL
+\remapXMLsingular [imaginary] [CPA] \MMLcIMAGINARY
+
+\def\MMLcREAL#1#2#3\empty
+ {\getXMLentity{real}(\MMLcreset\processXMLRchildren{#3})}
+
+\def\MMLcIMAGINARY#1#2#3\empty
+ {\getXMLentity{imaginary}(\MMLcreset\processXMLRchildren{#3})}
+
+\remapXMLsingular [lcm] [CPA] \MMLcLCM
+
+\def\MMLcLCM#1#2#3\empty
+ {\encapsulateXMLR{\getXMLentity{lcm}(}{\MMLccomma}{)}{#3}}
+
+\remapXMLsingular [floor] [CPA] \MMLcFLOOR
+\remapXMLsingular [ceiling] [CPA] \MMLcCEILING
+
+\def\MMLcFLOOR#1#2#3\empty
+ {\getXMLentity{lfloor}\processXMLRchildren{#3}\getXMLentity{rfloor}}
+
+\def\MMLcCEILING#1#2#3\empty
+ {\getXMLentity{lceiling}\processXMLRchildren{#3}\getXMLentity{rceiling}}
+
+%%% relations
+
+\remapXMLsingular [eq] [CPA] \MMLcEQ
+\remapXMLsingular [neq] [CPA] \MMLcNEQ
+\remapXMLsingular [gt] [CPA] \MMLcGT
+\remapXMLsingular [lt] [CPA] \MMLcLT
+\remapXMLsingular [geq] [CPA] \MMLcGEQ
+\remapXMLsingular [leq] [CPA] \MMLcLEQ
+\remapXMLsingular [equivalent] [CPA] \MMLcEQUIVALENT
+\remapXMLsingular [approx] [CPA] \MMLcAPPROX
+\remapXMLsingular [factorof] [CPA] \MMLcFACTOROF
+
+\setupMMLappearance[relation][\c!align=\v!no]
+
+\def\noMMLcrelation#1#2%
+ {\encapsulatenextXMLRelements{}{#1}{}#2\empty}
+
+\def\lastMMLcrelation#1#2%
+ {\countXMLRchildren{#2}%
+ \rawcollectbetweenXMLR
+ {\advance\nofXMLRchildren -1
+ \ifnum\nofXMLRchildren>1
+ \appendtoks\@col@amp@#1\crcr\to\XMLRtoks
+ \else
+ \appendtoks\@col@amp@#1\to\XMLRtoks
+ \fi}
+ {#2}%
+ \eqalign{\the\XMLRtoks\crcr}}
+
+\def\firstMMLcrelation#1#2%
+ {\nofXMLRchildren=0
+ \rawcollectbetweenXMLR
+ {\advance\nofXMLRchildren 1
+ \ifnum\nofXMLRchildren=1
+ \appendtoks\@col@amp@#1\to\XMLRtoks
+ \else
+ \appendtoks\crcr\@col@amp@#1\to\XMLRtoks
+ \fi}
+ {#2}%
+ \eqalign{\the\XMLRtoks\crcr}}
+
+\def\leftMMLcrelation#1#2%
+ {\collectbetweenXMLR{\@col@amp@#1\crcr}{#2}%
+ \eqalign{\the\XMLRtoks}}
+
+\def\rightMMLcrelation#1#2%
+ {\collectbetweenXMLR{\crcr#1{}\@col@amp@}{#2}% watch the {}
+ \prependtoks\@col@amp@\to\XMLRtoks
+ \eqalign{\the\XMLRtoks\crcr}}
+
+\def\MMLcrelation#1#2\empty
+ {\MMLcreset
+ \processaction
+ [\@@MMLrelationalign]
+ [\v!last=>\let\next\lastMMLcrelation ,
+ \v!first=>\let\next\firstMMLcrelation,
+ \v!yes=>\let\next\leftMMLcrelation ,
+ \v!left=>\let\next\leftMMLcrelation ,
+ \v!right=>\let\next\rightMMLcrelation,
+ \s!default=>\let\next\noMMLcrelation ,
+ \s!unknown=>\let\next\noMMLcrelation ]
+ \next{#1}{#2}}
+
+\def\MMLcEQ #1#2{\MMLcrelation=}
+\def\MMLcNEQ #1#2{\MMLcrelation\neq}
+\def\MMLcGT #1#2{\MMLcrelation>}
+\def\MMLcLT #1#2{\MMLcrelation<}
+\def\MMLcGEQ #1#2{\MMLcrelation\geq}
+\def\MMLcLEQ #1#2{\MMLcrelation\leq}
+\def\MMLcEQUIVALENT#1#2{\MMLcrelation\equiv}
+\def\MMLcAPPROX #1#2{\MMLcrelation\approx}
+\def\MMLcFACTOROF #1#2{\MMLcrelation\mid}
+
+%%% introduced when making an example for Thorsten Bahne:
+
+\remapXMLsingular [becomes] [CPA] \MMLcBECOMES
+
+\def\MMLcBECOMES#1#2{\MMLcrelation{:=}}
+
+\addtocommalist{becomes/}\MMLcmainresetlist
+
+%%% calculus and vector calculus
+
+\setupMMLappearance[int][\c!location=\v!top]
+
+\remapXMLsingular [int] [CPA] \MMLcINT
+
+\def\doMMLlimits#1%
+ {\doifelsevalue{@@MML#1\c!location}\v!top\limits\nolimits}
+
+\def\MMLcINT#1#2#3\empty
+ {\pushmacro\xmlr
+ \MMLcreset
+ \doifXMLRchildelse{domainofapplication}{#3}
+ {\int\doMMLlimits{int}_{\processXMLRchild{domainofapplication}{#3}}}
+ {\doifXMLRchildelse{condition}{#3}
+ {\int\doMMLlimits{int}_{\processXMLRchild{condition}{#3}}}
+ {\doifXMLRchildelse{lowlimit}{#3}
+ {\int\doMMLlimits{int}
+ _{\processXMLRchild{lowlimit}{#3}}
+ ^{\processXMLRchild {uplimit}{#3}}}
+ {\int}}}%
+ \doifXMLRchildelse{apply}{#3}
+ {\doifMMLfunctionelse{#3}%
+ {\MMLcreset % TEST
+ \processXMLRchild{apply}{#3}}
+ {\left(\MMLcreset % TEST
+ \processXMLRchild{apply}{#3}\right)}}
+ {\MMLcreset % TEST
+ \processXMLRchild{ci}{#3}}%
+ \doifXMLRchild{bvar}{#3}
+ {\,% \getXMLentity{ThinSpace}%
+ {\rm\getXMLentity{mathematicald}}\processXMLRchild{bvar}{#3}}%
+ \popmacro\xmlr}
+
+\remapXMLsingular [diff] [CPA] \MMLcDIFF
+
+\setupMMLappearance[diff][\c!location=\v!top]
+
+\def\MMLcDIFF#1#2#3\empty
+ {\pushmacro\xmlr
+ \MMLcreset
+ \doifXMLRchildelse{bvar}{#3}
+ {\frac
+ {{\rm \getXMLentity{mathematicald}}%
+ \collectXMLRchild{bvar}{#3}%
+ \let\MMLcDEGREE\superMMLcelement
+ \expanded{\processXMLRchild{degree}{\the\XMLRtoks}}%
+ \doif\@@MMLdifflocation\v!top
+ {\doifXMLRchildelse{ci}{#3}
+ {\processXMLRchild{ci}{#3}}
+ {\doifMMLfunctionelse{#3}
+ {\MMLcreset\processXMLRchild{apply}{#3}}
+ {\left(\MMLcreset\processXMLRchild{apply}{#3}\right)}}}}
+ {\let\MMLcDEGREE\superMMLcelement
+ \begingroup\rm\getXMLentity{mathematicald}\endgroup
+ \processXMLRchild{bvar}{#3}}%
+ \doifnot\@@MMLdifflocation\v!top
+ {\left(\MMLcreset\processXMLRchild{apply,ci}{#3}\right)}}
+ {\processXMLRchildren{#3}^\prime}%
+ \popmacro\xmlr}
+
+\remapXMLsingular [partialdiff] [CPA] \MMLcPARTIALDIFF
+
+\def\MMLcBVARpartialdiff#1#2%
+ {\getXMLentity{differentiald}\processXMLRchild{apply,reln,ci,cn}{#2}
+ \doifXMLRchild{degree}{#2}{^{\processXMLRchild{degree}{#2}}}}
+
+\def\MMLcPARTIALDIFF#1#2#3\empty
+ {\pushmacro\xmlr
+ \doifXMLRchildelse{list}{#3}
+ {\getXMLentity{capitaldifferentiald}_{\encapsulateXMLRchild{list}{}{\MMLccomma}{}{#3}}%
+ \processXMLRchild{apply,reln,ci,cn}{#3}}
+ {\countXMLRchild{bvar}{#3}%
+ \ifnum\nofXMLRchildren>0
+ \pushmacro\MMLcDEGREE
+ \pushmacro\MMLcBVAR
+ \frac
+ {\doifXMLRchildelse{degree}{#3}
+ {\collectXMLRchild{degree}{#3}}
+ {\collectXMLRchild{bvar}{#3}%
+ \expanded{\collectXMLRchild{degree}{\the\XMLRtoks}}}%
+ \getXMLentity{differentiald}^{\encapsulateXMLR{}{+}{}{\the\XMLRtoks}}%
+ \let\MMLcDEGREE\gobbletwoarguments
+ \doifMMLfunctionelse{#3}{\MMLcreset}{}%
+ \processXMLRchild{apply,reln,ci,cn}{#3}}
+ {\let\MMLcBVAR\MMLcBVARpartialdiff
+ \processXMLRchild{bvar}{#3}}%
+ \popmacro\MMLcBVAR
+ \popmacro\MMLcDEGREE
+ \else
+ \processXMLRchild{apply,reln,ci,cn}{#3}%
+ \fi}%
+ \popmacro\xmlr}
+
+\def\doifMMLfunctionelse#1#2#3%
+ {\collectXMLRchild{apply}{#1}%
+ \doifXMLRchildelse{fn}{\the\XMLRtoks#1}
+ {#2}
+ {\doifXMLRchildelse{ci}{\the\XMLRtoks#1}
+ {\pushmacro\xmlr
+ \getXMLarguments{dummy}{type=""}%
+ \def\xmlr{\getmmlarguments{dummy}{}}%
+ \the\XMLRtoks % what if more than one ?
+ \popmacro\xmlr
+ \doif{\XMLpar{dummy}{type}{}}{fn}{#2}{#3}}
+ {#2}}}
+
+\def\subMMLcelement #1#2{_{#2}}
+\def\superMMLcelement#1#2{^{#2}}
+
+\remapXMLsequence [lowlimit][CPA] \MMLcLOWLIMIT
+\remapXMLsequence [uplimit] [CPA] \MMLcUPLIMIT
+\remapXMLsequence [bvar] [CPA] \MMLcBVAR
+\remapXMLsequence [degree] [CPA] \MMLcDEGREE
+
+\def\MMLcLOWLIMIT#1#2{#2}
+\def\MMLcUPLIMIT #1#2{#2}
+\def\MMLcBVAR #1#2{#2}
+\def\MMLcDEGREE #1#2{#2}
+
+\remapXMLsingular [divergence] [CPA] \MMLcDIVERGENCE
+\remapXMLsingular [grad] [CPA] \MMLcGRAD
+\remapXMLsingular [curl] [CPA] \MMLcCURL
+\remapXMLsingular [laplacian] [CPA] \MMLcLAPLACIAN
+
+\def\MMLcDIVERGENCE#1#2#3\empty{\getXMLentity{divergence}\processXMLRchildren{#3}}
+\def\MMLcGRAD #1#2#3\empty{\getXMLentity{grad}\processXMLRchildren{#3}}
+\def\MMLcCURL #1#2#3\empty{\getXMLentity{curl}\processXMLRchildren{#3}}
+\def\MMLcLAPLACIAN #1#2#3\empty{\getXMLentity{laplacian}\processXMLRchildren{#3}}
+
+%%% theory of sets
+
+\remapXMLsequence [set] [CPA] \MMLcSET
+
+\def\MMLcSET#1#2%
+ {\doifXMLRchildelse{condition}{#2}
+ {\{\processXMLRchild{bvar}{#2}\,\vert\,\processXMLRchild{condition}{#2}\}}
+ {\encapsulateXMLR{\{}{\MMLccomma}{\}}{#2}}}
+
+\remapXMLsequence [list] [CPA] \MMLcLIST
+
+\def\MMLcLIST#1#2{\encapsulateXMLR{[}{\MMLccomma}{]}{#2}}
+
+\remapXMLsingular [union] [CPA] \MMLcUNION
+\remapXMLsingular [intersect] [CPA] \MMLcINTERSECT
+\remapXMLsingular [in] [CPA] \MMLcIN
+\remapXMLsingular [notin] [CPA] \MMLcNOTIN
+\remapXMLsingular [subset] [CPA] \MMLcSUBSET
+\remapXMLsingular [prsubset] [CPA] \MMLcPRSUBSET
+\remapXMLsingular [notsubset] [CPA] \MMLcNOTSUBSET
+\remapXMLsingular [notprsubset] [CPA] \MMLcNOTPRSUBSET
+\remapXMLsingular [setdiff] [CPA] \MMLcSETDIFF
+
+\def\MMLcset#1{\withnexttwoXMLRelements{\firstXMLRelement#1\secondXMLRelement}}
+
+\def\MMLcUNION #1#2{\MMLcset\cup}
+\def\MMLcINTERSECT #1#2{\MMLcset\cap}
+\def\MMLcIN #1#2{\MMLcset\in}
+\def\MMLcNOTIN #1#2{\MMLcset{\not\in}}
+\def\MMLcSUBSET #1#2{\MMLcset\subset}
+\def\MMLcPRSUBSET #1#2{\MMLcset\subseteq}
+\def\MMLcNOTSUBSET #1#2{\MMLcset{\not\subset}}
+\def\MMLcNOTPRSUBSET #1#2{\MMLcset{\not\subseteq}}
+\def\MMLcSETDIFF #1#2{\MMLcset\setminus}
+
+\remapXMLsingular [card] [CPA] \MMLcCARD
+
+\def\MMLcCARD#1#2#3\empty{\encapsulateXMLR{\vert}{}{\vert}{#3}}
+
+\remapXMLsingular [cartesianproduct] [CPA] \MMLcCARTESIANPRODUCT
+
+\def\MMLcCARTESIANPRODUCT#1#2#3\empty{\encapsulateXMLR{}{\times}{}{#3}}
+
+%%% sequences and series
+
+\remapXMLsingular [sum] [CPA] \MMLcSUM
+\remapXMLsingular [product] [CPA] \MMLcPRODUCT
+
+\def\MMLcSUM {\MMLcSUMandPRODUCT{sum}\sum}
+\def\MMLcPRODUCT{\MMLcSUMandPRODUCT{product}\prod}
+
+\setupMMLappearance[sum][\c!location=\v!top]
+\setupMMLappearance[product][\c!location=\v!top]
+
+\def\stackMMLsubscripts#1%
+ {\vbox
+ {\baselineskip\zeropoint % hack, taco vragen
+ \halign{$\scriptstyle\hss##\hss$\cr#1\crcr}}}
+
+\def\MMLcSUMandPRODUCT#1#2#3#4\empty
+ {\pushmacro\xmlr
+ \doifXMLRchildelse{condition,bvar,lowlimit}{#4}
+ {\def\MMLcSUMlow
+ {_{\doifXMLRchildelse{condition}{#4}
+ {\collectXMLRchild{condition}{#4}%
+ \expanded{\collectbetweenXMLR{\crcr}{\the\XMLRtoks}}%
+ \stackMMLsubscripts{\the\XMLRtoks}}
+ {\doifXMLRchild{bvar}{#4}
+ {\processXMLRchild{bvar}{#4}%
+ \doifXMLRchild{lowlimit}{#4}{=}}%
+ \processXMLRchild{lowlimit}{#4}}}}}
+ {\let\MMLcSUMlow\empty}%
+ \doifXMLRchildelse{uplimit}{#4}
+ {\def\MMLcSUMup{^{\processXMLRchild{uplimit}{#4}}}}
+ {\let\MMLcSUMup\empty}%
+ \MMLcreset#2\doMMLlimits{#1}\MMLcSUMup\MMLcSUMlow
+ \MMLcreset
+ \processXMLRchild{apply,ci}{#4}%
+ \popmacro\xmlr}
+
+\remapXMLsingular [limit] [CPA] \MMLcLIMIT
+
+\setupMMLappearance[limit][\c!location=\v!top]
+
+\def\MMLcLIMIT#1#2#3\empty
+ {\pushmacro\xmlr
+ \MMLcreset
+ \lim\doMMLlimits{limit}_
+ {\MMLcreset
+ \doifXMLRchildelse{condition}{#3}
+ {\processXMLRchild{condition}{#3}}
+ {\doifXMLRchild{bvar}{#3}
+ {\processXMLRchild{bvar}{#3}\rightarrow}%
+ \processXMLRchild{lowlimit}{#3}}}%
+ \processXMLRchild{apply}{#3}%
+ \popmacro\xmlr}
+
+\remapXMLsingular [tendsto] [CPA] \MMLcTENDSTO
+
+\def\MMLcTENDSTO#1#2%
+ {\getXMLarguments{tendsto}{type="default" #1}%
+ \withnexttwoXMLRelements
+ {\MMLcreset\firstXMLRelement
+ \processaction
+ [\XMLpar{tendsto}{type}{default}]
+ [ above=>\downarrow,
+ below=>\uparrow,
+ unknown=>\rightarrow]%
+ \MMLcreset\secondXMLRelement}}
+
+%%% elementary classical functions
+
+\remapXMLsingular [exp] [CPA] \MMLcEXP
+
+\def\MMLcEXP#1#2#3\empty
+ {\getXMLentity{exponentiale}^{\MMLcreset#3}}
+
+\remapXMLsingular [ln] [CPA] \MMLcLN
+
+%\def\MMLcLN#1#2#3\empty
+% {\ln\left(\MMLcreset#3\right)}
+
+\def\MMLcLN#1#2%
+ {\doMMLcfunction{ln}}
+
+\remapXMLsingular [log] [CPA] \MMLcLOG
+
+\setupMMLappearance[log][\c!location=\v!right]
+
+\def\MMLcLOG#1#2#3\empty
+ {\pushmacro\MMLcLOGBASE
+ \let\MMLcLOGBASE\secondoftwoarguments
+ \doifXMLRchildelse{logbase}{#3}
+ {\doifelse\@@MMLloglocation\v!left
+ {\mathop{{}^{\processXMLRchild{logbase}{#3}}\!\getXMLentity{log}}}
+ {\getXMLentity{log}_{\processXMLRchild{logbase}{#3}}}}
+ {\getXMLentity{log}}%
+ \let\MMLcLOGBASE\ignoreXMLRelement
+ \nodoMMLcfunction#3\empty
+ \popmacro\MMLcLOGBASE}
+
+\remapXMLsequence [logbase] [CPA] \MMLcLOGBASE
+
+\def\MMLcLOGBASE#1#2{#2}
+
+\remapXMLsingular [sin] [CPA] \MMLcSIN
+\remapXMLsingular [arcsin] [CPA] \MMLcARCSIN
+\remapXMLsingular [sinh] [CPA] \MMLcSINH
+\remapXMLsingular [arcsinh] [CPA] \MMLcARCSINH
+\remapXMLsingular [cos] [CPA] \MMLcCOS
+\remapXMLsingular [arccos] [CPA] \MMLcARCCOS
+\remapXMLsingular [cosh] [CPA] \MMLcCOSH
+\remapXMLsingular [arccosh] [CPA] \MMLcARCCOSH
+\remapXMLsingular [tan] [CPA] \MMLcTAN
+\remapXMLsingular [arctan] [CPA] \MMLcARCTAN
+\remapXMLsingular [tanh] [CPA] \MMLcTANH
+\remapXMLsingular [arctanh] [CPA] \MMLcARCTANH
+\remapXMLsingular [cot] [CPA] \MMLcCOT
+\remapXMLsingular [arccot] [CPA] \MMLcARCCOT
+\remapXMLsingular [coth] [CPA] \MMLcCOTH
+\remapXMLsingular [arccoth] [CPA] \MMLcARCCOTH
+\remapXMLsingular [csc] [CPA] \MMLcCSC
+\remapXMLsingular [arccsc] [CPA] \MMLcARCCSC
+\remapXMLsingular [csch] [CPA] \MMLcCSCH
+\remapXMLsingular [arccsch] [CPA] \MMLcARCCSCH
+\remapXMLsingular [sec] [CPA] \MMLcSEC
+\remapXMLsingular [arcsec] [CPA] \MMLcARCSEC
+\remapXMLsingular [sech] [CPA] \MMLcSECH
+\remapXMLsingular [arcsech] [CPA] \MMLcARCSECH
+
+\setupMMLappearance[function][\c!reduction=\v!yes]
+
+\def\doMMLcfunction#1%
+ {\doifnextcharelse\xmlr{\dodoMMLcfunction{#1}}{\getXMLentity{#1}}}
+
+\def\dodoMMLcfunction#1%
+ {\getXMLentity{#1}%
+ \nodoMMLcfunction}
+
+\def\nodoMMLcfunction#1\empty
+ {\ifx\MMLpowerelement\empty\else
+ ^{\MMLcreset\MMLpowerelement\empty}\!\let\MMLpowerelement\empty
+ \fi
+ \doifelse\@@MMLfunctionreduction\v!yes
+ {\doifXMLRchildelse{apply}{#1}
+ {\collectXMLRchild{apply}{#1}%
+ \@EA\doifXMLRchildelse\@EA{\MMLcfunctionlist}{\the\XMLRtoks}
+ {\MMLcreset#1\empty}
+ {\left(\MMLcreset#1\empty\right)}}
+ {\MMLcreset#1\empty}}
+ {\left(\MMLcreset#1\empty\right)}}
+
+\def\MMLcSIN #1#2{\doMMLcfunction{sin}}
+\def\MMLcARCSIN #1#2{\doMMLcfunction{arcsin}}
+\def\MMLcSINH #1#2{\doMMLcfunction{sinh}}
+\def\MMLcARCSINH#1#2{\doMMLcfunction{arcsinh}}
+\def\MMLcCOS #1#2{\doMMLcfunction{cos}}
+\def\MMLcARCCOS #1#2{\doMMLcfunction{arccos}}
+\def\MMLcCOSH #1#2{\doMMLcfunction{cosh}}
+\def\MMLcARCCOSH#1#2{\doMMLcfunction{arccosh}}
+\def\MMLcTAN #1#2{\doMMLcfunction{tan}}
+\def\MMLcARCTAN #1#2{\doMMLcfunction{arctan}}
+\def\MMLcTANH #1#2{\doMMLcfunction{tanh}}
+\def\MMLcARCTANH#1#2{\doMMLcfunction{arctanh}}
+\def\MMLcCOT #1#2{\doMMLcfunction{cot}}
+\def\MMLcARCCOT #1#2{\doMMLcfunction{arccot}}
+\def\MMLcCOTH #1#2{\doMMLcfunction{coth}}
+\def\MMLcARCCOTH#1#2{\doMMLcfunction{arccoth}}
+\def\MMLcCSC #1#2{\doMMLcfunction{csc}}
+\def\MMLcARCCSC #1#2{\doMMLcfunction{arccsc}}
+\def\MMLcCSCH #1#2{\doMMLcfunction{csch}}
+\def\MMLcARCCSCH#1#2{\doMMLcfunction{arccsch}}
+\def\MMLcSEC #1#2{\doMMLcfunction{sec}}
+\def\MMLcARCSEC #1#2{\doMMLcfunction{arcsec}}
+\def\MMLcSECH #1#2{\doMMLcfunction{sech}}
+\def\MMLcARCSECH#1#2{\doMMLcfunction{arcsech}}
+
+%%% statistics
+
+\remapXMLsingular [mean] [CPA] \MMLcMEAN
+\remapXMLsingular [sdev] [CPA] \MMLcSDEV
+\remapXMLsingular [variance] [CPA] \MMLcVARIANCE
+\remapXMLsingular [median] [CPA] \MMLcMEDIAN
+\remapXMLsingular [mode] [CPA] \MMLcMODE
+
+\def\MMLcMEAN #1#2{\withnextXMLRelement{\overline{\nextXMLRelement}}}
+\def\MMLcSDEV #1#2{\withnextXMLRelement{\sigma(\MMLcreset\nextXMLRelement)}}
+\def\MMLcVARIANCE#1#2{\withnextXMLRelement{\sigma(\MMLcreset\nextXMLRelement)^2}}
+\def\MMLcMEDIAN #1#2{\withnextXMLRelement{\getXMLentity{median}(\MMLcreset\nextXMLRelement)}}
+\def\MMLcMODE #1#2{\withnextXMLRelement{\getXMLentity{mode}(\MMLcreset\nextXMLRelement)}}
+
+\remapXMLsingular [moment] [CPA] \MMLcMOMENT
+\remapXMLsequence [momentabout] [CPA] \MMLcMOMENTABOUT
+
+\def\MMLcMOMENT#1#2#3\empty
+ {\left\langle\processXMLRchild{apply,reln,ci,cn}{#3}%
+ ^{\processXMLRchild{degree}{#3}}\right\rangle}
+
+\def\MMLcMOMENTABOUT#1#2{}
+
+%%% linear algebra
+
+\remapXMLsequence [vector] [CPA] \MMLcVECTOR
+
+\setupMMLappearance[vector][\c!direction=\v!horizontal] % \v!vertical
+
+\def\MMLcVECTOR#1#2%
+ {\countXMLRchildren{#2}%
+ \ifnum\nofXMLRchildren>1
+ \doifelse\@@MMLvectordirection\v!horizontal
+ {\encapsulateXMLR{\left(}{\MMLccomma}{\right)}{#2}}
+ {\collectbetweenXMLR{\crcr}{#2}%
+ \MMLcreset\left(\matrix{\the\XMLRtoks}\right)}%
+ \else
+ \overrightarrow{#2}%
+ \fi}
+
+\remapXMLsequence [matrix] [CPA] \MMLcMATRIX
+\remapXMLsequence [matrixrow] [CPA] \MMLcMATRIXROW
+
+\unexpanded\def\@col@amp@{&}
+
+\def\doMMLcMATRIX#1#2#3%
+ {\pushmacro\MMLcMATRIXROW
+ \let\MMLcMATRIXROW\normalMMLcMATRIXROW
+ \MMLcreset
+ \ifcase#1\matrix{#3}\else\left(\matrix{#3}\right)\fi
+ \popmacro\MMLcMATRIXROW}
+
+\def\MMLcMATRIX#1#2%
+ {\doMMLcMATRIX1{#1}{#2}}
+
+\def\MMLcMATRIXROW#1#2%
+ {\collectbetweenXMLR{\@col@amp@}{#2}\the\XMLRtoks\crcr}
+
+\let\normalMMLcMATRIXROW\MMLcMATRIXROW
+
+\def\MMLcMATRIXROW#1#2%
+ {\collectbetweenXMLR{\@col@amp@}{#2}%
+ \left(\matrix{\the\XMLRtoks\crcr}\right)}
+
+\remapXMLsingular [determinant] [CPA] \MMLcDETERMINANT
+
+% \def\MMLcDETERMINANT#1#2{\getXMLentity{determinant}} % optie
+
+\def\MMLcDETERMINANT#1#2\empty
+ {\pushmacro\MMLcMATRIX
+ \def\MMLcMATRIX##1##2{\doMMLcMATRIX0{##1}{##2}}%
+ \left|#2\empty\right|%
+ \popmacro\MMLcMATRIX}
+
+\remapXMLsingular [transpose] [CPA] \MMLcTRANSPOSE
+
+\def\MMLcTRANSPOSE#1#2{\withnextXMLRelement{\nextXMLRelement^{\rm T}}}
+
+\remapXMLsingular [selector] [CPA] \MMLcSELECTOR
+
+\def\MMLcSELECTOR#1#2#3\empty
+ {\pushmacro\xmlr
+ \withnextXMLRelement
+ {\mathinner{\nextXMLRelement}% hm, assumes a matrix or so
+ \doMMLcSELECTOR}%
+ #3\empty
+ \popmacro\xmlr}
+
+\def\doMMLcSELECTOR#1\empty
+ {_{\MMLcreset\encapsulateXMLR{}{\MMLccomma}{}{#1\empty}}}
+
+\remapXMLsingular [vectorproduct] [CPA] \MMLcVECTORPRODUCT
+\remapXMLsingular [scalarproduct] [CPA] \MMLcSCALARPRODUCT
+\remapXMLsingular [outerproduct] [CPA] \MMLcOUTERPRODUCT
+
+\def\MMLcvector#1%
+ {\withnexttwoXMLRelements{\firstXMLRelement#1\secondXMLRelement}}
+
+\def\MMLcVECTORPRODUCT#1#2{\MMLcvector{\getXMLentity{vectorproduct}}#2}% #2?%
+\def\MMLcSCALARPRODUCT#1#2{\MMLcvector{\getXMLentity{scalarproduct}}#2}
+\def\MMLcOUTERPRODUCT #1#2{\MMLcvector{\getXMLentity{outerproduct}}#2}
+
+%%% semantic mapping elements
+
+\remapXMLsequence [semantics] [CPA] \MMLcSEMANTICS
+
+\def\MMLcSEMANTICS#1#2%
+ {\doifXMLRchildelse{annotation}{#2}
+ {\processXMLRchild{annotation}{#2}}
+ {#2}}
+
+\remapXMLsequence [annotation] [CPA] \MMLcANNOTATION
+
+\def\MMLcANNOTATION#1#2% we need a better unmapper
+ {\getXMLarguments{annotation}{encoding="" #1}%
+ \doif{\XMLpar{annotation}{encoding}{}}{TeX}%
+ {\begingroup
+ \setnormalXMLentities % better: \simplifyXMLentities ; test first
+ \let\xmlrent\expandedXMLentity
+ \edef\mmlascii{#2}%
+ \setnormalcatcodes
+ \ifx\mmlascii\empty
+ \donefalse
+ \else
+ \def\do##1##2\end % hack
+ {\edef\!!stringa{\string##1}%
+ \edef\!!stringb{\letterdollar}%
+ \ifx\!!stringa\!!stringb
+ \donetrue
+ \else
+ \donefalse
+ \fi}%
+ \expandafter\do\mmlascii\end
+ \fi
+ \ifdone
+ \hbox{\scantokens\@EA{\mmlascii}}%
+ \else
+ \scantokens\@EA{\mmlascii}%
+ \fi
+ \endgroup}}
+
+\remapXMLsequence [annotation-xml] [CPA] \MMLcANNOTATIONXML
+
+\def\MMLcANNOTATIONXML#1#2{}
+
+%%% constant and symbol elements
+
+\remapXMLsingular [integers] [CPA] \MMLcINTEGERS
+\remapXMLsingular [reals] [CPA] \MMLcREALS
+\remapXMLsingular [rationals] [CPA] \MMLcRATIONALS
+\remapXMLsingular [naturalnumbers] [CPA] \MMLcNATURALNUMBERS
+\remapXMLsingular [complexes] [CPA] \MMLcCOMPLEXES
+\remapXMLsingular [primes] [CPA] \MMLcPRIMES
+\remapXMLsingular [exponentiale] [CPA] \MMLcEXPONENTIALE
+\remapXMLsingular [imaginaryi] [CPA] \MMLcIMAGINARYI
+\remapXMLsingular [notanumber] [CPA] \MMLcNOTANUMBER
+\remapXMLsingular [true] [CPA] \MMLcTRUE
+\remapXMLsingular [false] [CPA] \MMLcFALSE
+\remapXMLsingular [emptyset] [CPA] \MMLcEMPTYSET
+\remapXMLsingular [pi] [CPA] \MMLcPI
+\remapXMLsingular [eulergamma] [CPA] \MMLcEULERGAMMA
+\remapXMLsingular [infinity] [CPA] \MMLcINFINITY
+
+\def\MMLcINTEGERS #1#2{\getXMLentity{integers}}
+\def\MMLcREALS #1#2{\getXMLentity{reals}}
+\def\MMLcRATIONALS #1#2{\getXMLentity{rationals}}
+\def\MMLcNATURALNUMBERS#1#2{\getXMLentity{naturalnumbers}}
+\def\MMLcCOMPLEXES #1#2{\getXMLentity{complexes}}
+\def\MMLcPRIMES #1#2{\getXMLentity{primes}}
+\def\MMLcEXPONENTIALE #1#2{\getXMLentity{ExponentialE}}
+\def\MMLcIMAGINARYI #1#2{\getXMLentity{ImaginaryI}}
+\def\MMLcNOTANUMBER #1#2{\mathop{\rm NaN}}
+\def\MMLcTRUE #1#2{\mathop{\rm true}}
+\def\MMLcFALSE #1#2{\mathop{\rm false}}
+\def\MMLcEMPTYSET #1#2{\mathop{\hbox{\O}}}
+\def\MMLcPI #1#2{\pi}
+\def\MMLcEULERGAMMA #1#2{\gamma}
+\def\MMLcINFINITY #1#2{\infty}
+
+\stopXMLmapping
+
+\protect \endinput
diff --git a/tex/context/base/xtag-mml.tex b/tex/context/base/xtag-mml.tex
new file mode 100644
index 000000000..051d15b00
--- /dev/null
+++ b/tex/context/base/xtag-mml.tex
@@ -0,0 +1,515 @@
+%D \module
+%D [ file=xtag-mml,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=MathML,
+%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 XML Macros / MathML}
+
+% I will reimplement this one without mapping since we now have more
+% tricks available
+
+\useXMLfilter[map]
+
+%\enablemathpunctuation
+
+% First some general formula element definitions.
+
+\defineXMLenvironment [formula] [label=,sublabel=]
+ {\dostartXMLformula\placeformula}
+ {\dostopXMLformula}
+
+\defineXMLenvironment [subformula] [label=,sublabel=]
+ {\dostartXMLformula\placesubformula}
+ {\dostopXMLformula}
+
+\def\dostartXMLformula#1%
+ {\doifelsenothingXMLop{label}
+ {\startformula}
+ {\expanded{#1[\XMLop{label}]{\XMLop{sublabel}}}\startformula}}
+
+\def\dostopXMLformula
+ {\stopformula}
+
+% Since I only had the draft of mml 2 as example of
+% rendering, there are probably a lot of omissions and
+% misinterpretations. At least I learned some bits and
+% pieces of math rendering.
+%
+% The main complications were not so much the math, but to
+% find the most efficient way to handle elements without
+% spacing beging messed up. The first implementation was
+% aimed at getting reasonable output, this second
+% implementation is already better in terms of handling
+% nesting, and I will definitely need a third one that has
+% more efficient and less ugly code.
+%
+% The TeX part is not that complicated and once the
+% preprocessor was okay, the rest way just a lot of keying
+% and testing. It all comes down to gobbling, redefining,
+% and not so much to parsing.
+
+\unprotect
+
+\def\setupMMLappearance[#1]{\dodoubleargument\getparameters[@@MML#1]}
+
+\defineXMLdirective [mathml] \setupMMLappearance
+
+\defineXMLargument [math] \doXMLmath
+\defineXMLargument [imath] \doXMLimath
+\defineXMLargument [dmath] \doXMLdmath
+\defineXMLargument [m] \doXMLimath
+
+\unexpanded\def\doXMLmath {\ifhmode\@EA\doXMLimath\else\@EA\doXMLdmath\fi}
+\unexpanded\def\doXMLimath{\XMLremapdata[mml]{$}{$}}
+\unexpanded\def\doXMLdmath{\XMLremapdata[mml]{\dostartformula{}}{\dostopformula}}
+
+\ifx\XMLRtoks\undefined \newtoks\XMLRtoks \fi
+
+\def\convertasciiafter#1#2%
+ {\defconvertedargument\asciiafter{#2}%
+ \@EA#1\@EA{\asciiafter}}
+
+\def\checkMMLoperator#1% #2
+ {\unspaceargument#1\to\ascii
+ \doifXMLentityelse\ascii{\getXMLentity\ascii}} % {#2}
+
+% this will be done in a more safe way
+
+\def\MMLtodo#1{\enspace\hbox{\rm#1}\enspace}
+
+% this goes to core-mat
+
+\def\normalorfiller #1#2{#1}
+\def\normalordelimiter#1#2{#2}
+
+\def\enabledelimiter {\let\normalordelimiter\secondoftwoarguments}
+\def\disabledelimiter{\let\normalordelimiter\firstoftwoarguments}
+
+\def\enablefiller {\let\normalorfiller\secondoftwoarguments}
+\def\disablefiller {\let\normalorfiller\firstoftwoarguments}
+
+\def\mathopnolimits#1{\mathop{\rm#1}\nolimits}
+
+% Auxiliary macros
+
+\bgroup \obeylines
+
+\gdef\defineMMLentity% % needed !
+ {\bgroup\obeylines\xdefineMMLentity}
+
+\gdef\xdefineMMLentity #1 #2 #3 #4
+ {\egroup\dodefineMMLentity{#1}{#2}{#3}{#4}}
+
+\global\let\dodefineMMLentity\gobblefourarguments
+
+\gdef\defineMMLsynonym% % needed !
+ {\bgroup\obeylines\xdefineMMLsynonym}
+
+\gdef\xdefineMMLsynonym #1 #2
+ {\egroup\dodefineMMLsynonym{#1}{#2}}
+
+\global\let\dodefineMMLsynonym\gobbletwoarguments
+
+\egroup
+
+% some more
+
+\def\showMMLentity#1%
+ {\bgroup
+ \doifXMLentityelse{#1}
+ {\let\left\empty\let\right\empty\mathematics{\getXMLentity{#1}{}}}
+ {\getXMLentity{unknown}}%
+ \egroup}
+
+\newbox\unknownXMLentity
+\setbox\unknownXMLentity\hbox{\inframed[\c!strut=\v!no,\c!offset=1pt]{\ttx ?}}
+
+\defineXMLentity [unknown] {\copy\unknownXMLentity}
+
+% the definitions
+
+\ifx\blackboard\undefined
+ \def\blackboard{\ifx\Bbb\undefined\else\expandafter\Bbb\fi}
+\fi
+
+% basic entities, greek
+
+\defineXMLentity [alpha] {\mathematics \alpha}
+\defineXMLentity [beta] {\mathematics \beta}
+\defineXMLentity [gamma] {\mathematics \gamma}
+\defineXMLentity [delta] {\mathematics \delta}
+\defineXMLentity [epsilon] {\mathematics \epsilon}
+\defineXMLentity [zeta] {\mathematics \zeta}
+\defineXMLentity [eta] {\mathematics \eta}
+\defineXMLentity [theta] {\mathematics \theta}
+\defineXMLentity [iota] {\mathematics \iota}
+\defineXMLentity [kappa] {\mathematics \kappa}
+\defineXMLentity [lambda] {\mathematics \lambda}
+\defineXMLentity [theta] {\mathematics \theta}
+\defineXMLentity [mu] {\mathematics \mu}
+\defineXMLentity [nu] {\mathematics \nu}
+\defineXMLentity [xi] {\mathematics \xi}
+\defineXMLentity [pi] {\mathematics \pi}
+\defineXMLentity [rho] {\mathematics \rho}
+\defineXMLentity [sigma] {\mathematics \sigma}
+\defineXMLentity [tau] {\mathematics \tau}
+\defineXMLentity [upsilon] {\mathematics \upsilon}
+\defineXMLentity [phi] {\mathematics \phi}
+\defineXMLentity [chi] {\mathematics \chi}
+\defineXMLentity [psi] {\mathematics \psi}
+\defineXMLentity [omega] {\mathematics \omega}
+
+\defineXMLentity [varepsilon] {\mathematics \varepsilon}
+\defineXMLentity [vartheta] {\mathematics \vartheta}
+\defineXMLentity [varpi] {\mathematics \varpi}
+\defineXMLentity [varrho] {\mathematics \varrho}
+\defineXMLentity [varsigma] {\mathematics \varsigma}
+\defineXMLentity [varphi] {\mathematics \varphi}
+
+\defineXMLentity [epsilonv] {\mathematics \varepsilon}
+\defineXMLentity [thetav] {\mathematics \vartheta}
+\defineXMLentity [piv] {\mathematics \varpi}
+\defineXMLentity [rhov] {\mathematics \varrho}
+\defineXMLentity [sigmav] {\mathematics \varsigma}
+\defineXMLentity [phiv] {\mathematics \varphi}
+
+\defineXMLentity [epsi] {\mathematics \epsilon}
+\defineXMLentity [epsiv] {\mathematics \varepsilon}
+
+\defineXMLentity [Alpha] {A}
+\defineXMLentity [Beta] {B}
+\defineXMLentity [Gamma] {\mathematics \Gamma}
+\defineXMLentity [Delta] {\mathematics \Delta}
+\defineXMLentity [Epsilon] {E}
+\defineXMLentity [Zeta] {Z}
+\defineXMLentity [Eta] {N}
+\defineXMLentity [Theta] {\mathematics \Theta}
+\defineXMLentity [Iota] {I}
+\defineXMLentity [Kappa] {K}
+\defineXMLentity [Lambda] {\mathematics \Lambda}
+\defineXMLentity [Mu] {M}
+\defineXMLentity [Nu] {N}
+\defineXMLentity [Xi] {\mathematics \Xi}
+\defineXMLentity [Pi] {\mathematics \Pi}
+\defineXMLentity [Ro] {R}
+\defineXMLentity [Sigma] {\mathematics \Sigma}
+\defineXMLentity [Tau] {T}
+\defineXMLentity [Upsilon] {\mathematics \Upsilon}
+\defineXMLentity [Phi] {\mathematics \Phi}
+\defineXMLentity [Chi] {X}
+\defineXMLentity [Psi] {\mathematics \Psi}
+\defineXMLentity [Omega] {\mathematics \Omega}
+
+% basic entities, hebrew
+
+\defineXMLentity [aleph] {\mathematics \aleph}
+
+% basic entities, functions
+
+\defineXMLentity [abs] {\mathopnolimits{abs}}
+\defineXMLentity [arg] {\mathopnolimits{arg}}
+\defineXMLentity [codomain] {\mathopnolimits{codomain}}
+\defineXMLentity [curl] {\mathopnolimits{curl}}
+\defineXMLentity [determinant] {\mathopnolimits{det}}
+\defineXMLentity [divergence] {\mathopnolimits{div}}
+\defineXMLentity [domain] {\mathopnolimits{domain}}
+\defineXMLentity [false] {\mathopnolimits{false}}
+\defineXMLentity [gcd] {\mathopnolimits{gcd}}
+\defineXMLentity [grad] {\mathopnolimits{grad}}
+\defineXMLentity [identity] {\mathopnolimits{id}}
+\defineXMLentity [image] {\mathopnolimits{image}}
+\defineXMLentity [lcm] {\mathopnolimits{lcm}}
+\defineXMLentity [max] {\mathopnolimits{max}}
+\defineXMLentity [median] {\mathopnolimits{median}}
+\defineXMLentity [min] {\mathopnolimits{min}}
+\defineXMLentity [mode] {\mathopnolimits{mode}}
+\defineXMLentity [mod] {\mathopnolimits{mod}}
+\defineXMLentity [notanumber] {\mathopnolimits{NaN}}
+\defineXMLentity [otherwise] {\mathopnolimits{otherwise}}
+\defineXMLentity [true] {\mathopnolimits{true}}
+\defineXMLentity [declare] {\mathopnolimits{declare}}
+\defineXMLentity [as] {\mathopnolimits{as}}
+\defineXMLentity [polar] {\mathopnolimits{Polar}}
+
+\defineXMLentity [mathematicald] {d}
+
+\defineXMLentity [imaginaryi] {{\rm i}}
+\defineXMLentity [differentiald] {\partial}
+\defineXMLentity [exponentiale] {{\rm e}}
+\defineXMLentity [capitaldifferentiald] {D}
+
+\defineXMLentity [ii] {\getXMLentity{imaginaryi}}
+\defineXMLentity [dd] {\getXMLentity{differentiald}}
+\defineXMLentity [ee] {\getXMLentity{exponentiale}}
+\defineXMLentity [DD] {\getMMLentity{capitaldifferentiald}}
+
+\defineXMLentity [ImaginaryI] {\getXMLentity{imaginaryi}}
+\defineXMLentity [DifferentialD] {\getXMLentity{differentiald}}
+\defineXMLentity [ExponentialE] {\getXMLentity{exponentiale}}
+\defineXMLentity [CapitalDifferentialD] {\getXMLentity{differentiald}}
+
+\defineXMLentity [NaN] {\getXMLentity{notanumber}}
+\defineXMLentity [NotANumber] {\getXMLentity{notanumber}}
+
+\defineXMLentity [and] {\wedge}
+\defineXMLentity [exists] {\exists}
+\defineXMLentity [forall] {\forall}
+\defineXMLentity [implies] {\Rightarrow}
+\defineXMLentity [not] {\neg}
+\defineXMLentity [or] {\vee}
+\defineXMLentity [xor] {\mathopnolimits{xor}}
+
+\defineXMLentity [imaginary] {\Im}
+\defineXMLentity [real] {\Re}
+
+\defineXMLentity [lceiling] {\lceil}
+\defineXMLentity [rceiling] {\rceil}
+
+\defineXMLentity [lfloor] {\lfloor}
+\defineXMLentity [rfloor] {\rfloor}
+
+\defineXMLentity [ne] {\neq}
+\defineXMLentity [neq] {\neq}
+\defineXMLentity [gt] {>}
+\defineXMLentity [lt] {<}
+\defineXMLentity [ge] {\geq}
+\defineXMLentity [geq] {\geq}
+\defineXMLentity [le] {\leq}
+\defineXMLentity [leq] {\leq}
+
+\defineXMLentity [equivalent] {\equiv}
+\defineXMLentity [equiv] {\equiv}
+\defineXMLentity [approx] {\approx}
+
+\defineXMLentity [factorof] {\mid}
+\defineXMLentity [mapsto] {\mapsto}
+
+\defineXMLentity [int] {\int}
+\defineXMLentity [prime] {\prime}
+\defineXMLentity [laplacian] {\nabla^2}
+\defineXMLentity [partial] {\partial}
+
+\defineXMLentity [union] {\cup}
+\defineXMLentity [intersect] {\cap}
+\defineXMLentity [in] {\in}
+\defineXMLentity [notin] {\not\in}
+\defineXMLentity [subset] {\subset}
+\defineXMLentity [prsubset] {\subseteq}
+\defineXMLentity [notsubset] {\not\subset}
+\defineXMLentity [notprsubset] {\not\subseteq}
+\defineXMLentity [setdiff] {\setminus}
+
+\defineXMLentity [card] {\vert}
+\defineXMLentity [cartesianproduct] {\times}
+
+\defineXMLentity [sum] {\sum}
+\defineXMLentity [prod] {\prod}
+\defineXMLentity [product] {\prod}
+\defineXMLentity [lim] {\lim}
+
+\defineXMLentity [exp] {\mathopnolimits{exp}} % {\exp}
+\defineXMLentity [ln] {\mathopnolimits{ln}} % {\ln}
+\defineXMLentity [log] {\mathopnolimits{log}} % {\log}
+
+\defineXMLentity [sin] {\mathopnolimits{sin}}
+\defineXMLentity [arcsin] {\mathopnolimits{arcsin}}
+\defineXMLentity [sinh] {\mathopnolimits{sinh}}
+\defineXMLentity [arcsinh] {\mathopnolimits{arcsinh}}
+\defineXMLentity [cos] {\mathopnolimits{cos}}
+\defineXMLentity [arccos] {\mathopnolimits{arccos}}
+\defineXMLentity [cosh] {\mathopnolimits{cosh}}
+\defineXMLentity [arccosh] {\mathopnolimits{arccosh}}
+\defineXMLentity [tan] {\mathopnolimits{tan}}
+\defineXMLentity [arctan] {\mathopnolimits{arctan}}
+\defineXMLentity [tanh] {\mathopnolimits{tanh}}
+\defineXMLentity [arctanh] {\mathopnolimits{arctanh}}
+\defineXMLentity [cot] {\mathopnolimits{cot}}
+\defineXMLentity [arccot] {\mathopnolimits{arccot}}
+\defineXMLentity [coth] {\mathopnolimits{coth}}
+\defineXMLentity [arccoth] {\mathopnolimits{arccoth}}
+\defineXMLentity [csc] {\mathopnolimits{csc}}
+\defineXMLentity [arccsc] {\mathopnolimits{arccsc}}
+\defineXMLentity [csch] {\mathopnolimits{csch}}
+\defineXMLentity [arccsch] {\mathopnolimits{arccsch}}
+\defineXMLentity [sec] {\mathopnolimits{sec}}
+\defineXMLentity [arcsec] {\mathopnolimits{arcsec}}
+\defineXMLentity [sech] {\mathopnolimits{sech}}
+\defineXMLentity [arcsech] {\mathopnolimits{arcsech}}
+
+\defineXMLentity [transpose] {^{\rm T}}
+
+\defineXMLentity [plusminus] {\pm}
+\defineXMLentity [minusplus] {\mp}
+
+\defineXMLentity [vectorproduct] {\times}
+\defineXMLentity [scalarproduct] {\cdot}
+\defineXMLentity [outerproduct] {\otimes}
+
+\defineXMLentity [integers] {\integers}
+\defineXMLentity [reals] {\reals}
+\defineXMLentity [rationals] {\rationals}
+\defineXMLentity [naturalnumbers] {\naturalnumbers}
+\defineXMLentity [complexes] {\complexes}
+\defineXMLentity [primes] {\primes}
+
+\defineXMLentity [emptyset] {\emptyset}
+\defineXMLentity [pi] {\pi}
+\defineXMLentity [eulergamma] {\gamma}
+\defineXMLentity [infinity] {\mathematics{\infty}}
+
+\defineXMLentity [InvisibleTimes] {}
+\defineXMLentity [InvisibleComma] {}
+\defineXMLentity [ApplyFunction] {}
+
+\defineXMLentity [it] {\getXMLentity{InvisibleTines}}
+\defineXMLentity [ic] {\getXMLentity{InvisibleComma}}
+\defineXMLentity [af] {\getXMLentity{ApplyFunction}}
+
+\defineXMLentity [PlusMinus] {\getXMLentity{plusminus}}
+
+\defineXMLentity [infin] {\getXMLentity{infinity}}
+\defineXMLentity [infty] {\getXMLentity{infinity}}
+\defineXMLentity [part] {\getXMLentity{differentiald}}
+
+\defineXMLentity [RightArrow] {\normalorfiller\rightarrow\rightarrowfill}
+\defineXMLentity [LeftArrow] {\normalorfiller\leftarrow\leftarrowfill}
+\defineXMLentity [UnderBrace] {\normalorfiller\empty\upbracefill}
+\defineXMLentity [OverBrace] {\normalorfiller\empty\downbracefill}
+\defineXMLentity [UnderBar] {\normalorfiller\hrule\hrulefill}
+\defineXMLentity [OverBar] {\normalorfiller\hrule\hrulefill}
+\defineXMLentity [Hat] {\normalorfiller\empty\empty} % todo
+
+\defineXMLentity [downarrow] {\mathortext\downarrow\empty}
+\defineXMLentity [uparrow] {\mathortext\uparrow\empty}
+
+\defineXMLentity [Tab] {\hskip4em}
+\defineXMLentity [NewLine] {\mathortext\empty\crlf}
+\defineXMLentity [IndentingNewLine] {\mathortext\empty\crlf}
+
+\defineXMLentity [NoBreak] {\nobreak}
+\defineXMLentity [GoodBreak] {\goodbreak}
+\defineXMLentity [BadBreak] {\nobreak}
+
+\defineXMLentity [Space] {\getXMLentity{MediumSpace}}
+\defineXMLentity [NonBreakingSpace] {\getXMLentity{MediumSpace}}
+\defineXMLentity [ZeroWidthSpace] {}
+
+\def\somespaceentity#1#2%
+ {\mathortext
+ {\mskip#1mu}
+ {\ifvmode\dontleavehmode\else\unskip\fi\hskip#2em\strut\hskip\zeropoint\ignorespaces}%
+ \relax}
+
+\defineXMLentity [VeryThinSpace] {\somespaceentity {2}{.125}}
+\defineXMLentity [ThinSpace] {\somespaceentity {3}{.25}}
+\defineXMLentity [MediumSpace] {\somespaceentity {4}{.5}}
+\defineXMLentity [ThickSpace] {\somespaceentity {5}{1}}
+\defineXMLentity [NegativeVeryThinSpace] {\somespaceentity{-2}{-.125}}
+\defineXMLentity [NegativeThinSpace] {\somespaceentity{-3}{-.25}}
+\defineXMLentity [NegativeMediumSpace] {\somespaceentity{-4}{-.5}}
+\defineXMLentity [NegativeThickSpace] {\somespaceentity{-5}{-1}}
+
+\defineXMLentity [NegVeryThinSpace] {\getXMLentity{NegativeVeryThinSpace}}
+\defineXMLentity [NegThinSpace] {\getXMLentity{NegativeThinSpace}}
+\defineXMLentity [NegMediumSpace] {\getXMLentity{NegativeMediumSpace}}
+\defineXMLentity [NegThickSpace] {\getXMLentity{NegativeThickSpace}}
+
+\defineXMLentity [nbsp] {\getXMLentity{NonBreakingSpace}}
+\defineXMLentity [thinsp] {\getXMLentity{ThinSpace}}
+\defineXMLentity [medsp] {\getXMLentity{MediumSpace}}
+\defineXMLentity [thicksp] {\getXMLentity{ThickSpace}}
+
+\defineXMLentity [larr] {\getXMLentity{LeftArrow}}
+\defineXMLentity [rarr] {\getXMLentity{RightArrow}}
+
+\defineXMLentity [lbrace] {\normalordelimiter{\{}{\left \{}}
+\defineXMLentity [rbrace] {\normalordelimiter{\}}{\right\}}}
+\defineXMLentity [lbracket] {\normalordelimiter{[}{\left [}}
+\defineXMLentity [rbracket] {\normalordelimiter{]}{\right]}}
+\defineXMLentity [lparenthesis] {\normalordelimiter{(}{\left (}}
+\defineXMLentity [rparenthesis] {\normalordelimiter{)}{\right)}}
+\defineXMLentity [langle] {\normalordelimiter{\langle}{\left \langle}}
+\defineXMLentity [rangle] {\normalordelimiter{\rangle}{\right\rangle}}
+
+\defineXMLentity [lang] {\getXMLentity{langle}}
+\defineXMLentity [rang] {\getXMLentity{rangle}}
+\defineXMLentity [lbrack] {\getXMLentity{lbracket}}
+\defineXMLentity [rbrack] {\getXMLentity{rbracket}}
+\defineXMLentity [lparent] {\getXMLentity{lparenthesis}}
+\defineXMLentity [rparent] {\getXMLentity{rparenthesis}}
+
+\defineXMLentity [\letterleftbrace ] {\getXMLentity{lbrace}}
+\defineXMLentity [\letterrightbrace] {\getXMLentity{rbrace}}
+
+\defineXMLentity [{[}] {\getXMLentity{lbracket}}
+\defineXMLentity [{]}] {\getXMLentity{rbracket}}
+\defineXMLentity [{(}] {\getXMLentity{lparenthesis}}
+\defineXMLentity [{)}] {\getXMLentity{rparenthesis}}
+
+\defineXMLentity [times] {\times}
+\defineXMLentity [minus] {-}
+\defineXMLentity [plus] {+}
+\defineXMLentity [plusmn] {\pm}
+
+\defineXMLentity [nabla] {\nabla}
+
+\def\myspecialnormalvert{\mathematics{\vert}} % temp hack, should stretch
+
+\defineXMLentity [,] {{,}}
+\defineXMLentity [.] {{.}}
+\defineXMLentity [+] {+}
+\defineXMLentity [-] {-}
+\defineXMLentity [(] {(}
+\defineXMLentity [)] {)}
+\defineXMLentity [<] {\mathematics{<}}
+\defineXMLentity [>] {\mathematics{>}}
+\defineXMLentity [|] {\myspecialnormalvert}
+\defineXMLentity [/] {/}
+\defineXMLentity [*] {\times}
+\defineXMLentity [=] {=}
+
+\defineXMLentity [++] {++}
+\defineXMLentity [--] {--}
+\defineXMLentity [//] {//}
+\defineXMLentity [**] {\times\times}
+\defineXMLentity [==] {==}
+
+\defineXMLentity [quot] {"}
+
+\defineXMLentity [triangle] {\mathematics\triangle}
+\defineXMLentity [otimes] {\mathematics\otimes}
+\defineXMLentity [oplus] {\mathematics\oplus}
+\defineXMLentity [cup] {\mathematics\cup}
+\defineXMLentity [cap] {\mathematics\cap}
+\defineXMLentity [sdot] {\mathematics\cdot}
+\defineXMLentity [dot] {\mathematics\cdot}
+\defineXMLentity [sim] {\mathematics\sim}
+\defineXMLentity [circ] {\mathematics\circ}
+\defineXMLentity [dagger] {\mathematics\dagger}
+\defineXMLentity [cdots] {\mathematics\cdots}
+
+\defineXMLentity [...] {\getXMLentity{cdots}}
+\defineXMLentity [continued] {\getXMLentity{cdots}}
+
+\defineXMLentity [sub] {\getXMLentity{subset}}
+\defineXMLentity [sube] {\getXMLentity{prsubset}}
+\defineXMLentity [notprsubset] {\getXMLentity{notprsubset}}
+
+\defineXMLentity [ndash] {\endash}
+\defineXMLentity [mdash] {\emdash}
+
+\defineXMLentity [tex-bar] {\mathematics{\vert}}
+\defineXMLentity [tex-dollar] {\dollar}
+\defineXMLentity [tex-backslash] {\backslash}
+\defineXMLentity [tex-leftbrace] {\mathematics{\{}}
+\defineXMLentity [tex-rightbrace] {\mathematics{\}}}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-mmp.tex b/tex/context/base/xtag-mmp.tex
new file mode 100644
index 000000000..ef1479ee6
--- /dev/null
+++ b/tex/context/base/xtag-mmp.tex
@@ -0,0 +1,553 @@
+%D \module
+%D [ file=xtag-mmp,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Presentation MathML,
+%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.
+
+% \points should become \bodyfontsize
+
+% under reconstruction
+%
+% \starttext
+% \usemodule[mathml] \useXMLfilter[utf]
+% \unprotect
+%
+% \remapXMLsequence [mover] [CPA] \MMLpOVER
+% \remapXMLsequence [munder] [CPA] \MMLpUNDER
+%
+% \def\MMLpUNDER#1#2%
+% {\getXMLarguments{munder}{accent="false" #1}%
+% \withnexttwoXMLRelements\doMMLpUNDER#2}
+%
+% \def\MMLpOVER#1#2%
+% {\getXMLarguments{mover}{accent="false" #1}%
+% \withnexttwoXMLRelements\doMMLpOVER #2}
+%
+% \def\doMMLpUNDER
+% {\doifelse{\XMLpar{munder}{accent}{}}{true}
+% {\secondXMLRelement\firstXMLRelement}
+% {\mathop{\vtop{\mathsurround\zeropoint\ialign{\hss##\hss\crcr
+% \disabledelimiter\doMMLfiller\firstXMLRelement
+% \crcr\noalign{\kern3\points\nointerlineskip}%
+% \disabledelimiter\doMMLfiller\secondXMLRelement
+% \crcr\noalign{\kern3\points}}}}\limits}}
+%
+% \def\doMMLpOVER
+% {\doifelse{\XMLpar{mover}{accent}{}}{true}
+% {\secondXMLRelement\firstXMLRelement}
+% {\mathop{\vbox{\mathsurround\zeropoint\ialign{\hss##\hss\crcr\noalign{\kern3\points}%
+% \disabledelimiter\doMMLfiller\secondXMLRelement
+% \crcr\noalign{\kern3\points\nointerlineskip}%
+% \disabledelimiter\doMMLfiller\firstXMLRelement
+% \crcr}}}\limits}}
+%
+% \protect
+%
+% Normal: \startXMLdata<math><mover ><mi>a</mi><mo>¯</mo></mover></math>\stopXMLdata \par
+% Accent: \startXMLdata<math><mover accent="true"><mi>x</mi><mo>¯</mo></mover></math>\stopXMLdata \par
+%
+% \stoptext
+
+\writestatus{loading}{ConTeXt XML Macros / Presentational MathML}
+
+\unprotect
+
+\def\convertasciiafter#1#2%
+ {\defconvertedargument\asciiafter{#2}%
+ \@EA#1\@EA{\asciiafter}}
+
+\def\checkMMLoperator#1#2% temp hack
+ {\unspaceargument#1\to\ascii
+ \doifXMLentityelse\ascii{\getXMLentity\ascii}{#2}}
+
+\startXMLmapping [mml]
+
+\remapXMLsequence [mi] [CPA] \MMLpMI
+\remapXMLsequence [mn] [CPA] \MMLpMN
+\remapXMLsequence [mo] [CPA] \MMLpMO
+
+\def\MMLpmath#1#2%
+ {\begingroup
+ \getXMLarguments{mstyle}{#1}\setMMLpmathstyle{mstyle}#2%
+ \endgroup}
+
+\def\MMLpMI#1#2%
+ {\MMLpmath{#1}{\checkMMLoperator{#2}{#2}}}
+
+\def\MMLpMN#1#2%
+ {\begingroup\rm\MMLpmath{#1}{#2}\endgroup}
+
+\def\MMLpMO#1#2% yes or no
+ {\checkMMLoperator
+ {#2}
+ {\ConvertConstantAfter\doifinstringelse{\xmlrent}{#2}
+ {#2}{\hbox{\MMLpmath{#1}{\ignorespaces#2\unskip}}}}} % \hbox ?
+
+\remapXMLsequence [mfenced] [CPA] \MMLpFENCED
+
+\def\doMMLleft #1{\pushmacro\left \let\left \empty\normalleft #1\popmacro\left}
+\def\doMMLright#1{\pushmacro\right\let\right\empty\normalright#1\popmacro\right}
+
+\let\MMLpopen \empty
+\let\MMLpclose\empty
+
+\def\MMLpFENCED#1#2%
+ {\getXMLarguments{mfenced}{open="(" close=")" separators="" #1}%
+ \edef\MMLpopen {\XMLpar{mfenced}{open}{}}%
+ \edef\MMLpclose{\XMLpar{mfenced}{close}{}}%
+ \ifx\MMLpopen\empty\else\doMMLleft\MMLpopen\fi
+ \pushmacro\MMLpopen
+ \pushmacro\MMLpclose
+ \doifXMLparelse{mfenced}{separators}
+ {\resetMMLseparator
+ \encapsulateXMLR
+ {}%
+ {\pushmacro\myspecialnormalvert % hack
+ \def\myspecialnormalvert{\;\vrule\;}%
+ \grabMMLseparator{\XMLpar{mfenced}{separators}{}}%
+ \popmacro\myspecialnormalvert}
+ {}%
+ {#2\empty}}
+ {#2}%
+ \popmacro\MMLpclose
+ \popmacro\MMLpopen
+ \ifx\MMLpclose\empty
+ \ifx\MMLpopen\empty\else\right.\fi
+ \else\doMMLright\MMLpclose\fi}
+
+\def\resetMMLseparator
+ {\newcounter\MMLxxcounter
+ \let\lastMMLseparator\empty}
+
+\def\grabMMLseparator#1%
+ {\increment\MMLxxcounter
+ \newcounter\MMLyycounter
+ \expanded{\dograbMMLseparator#1\noexpand\relax}}
+
+\def\dograbMMLseparator
+ {\increment\MMLyycounter
+ \doifnextcharelse\relax
+ {\lastMMLseparator\gobbleoneargument}
+ {\doifnextcharelse\xmlrent\grabMMLseparatora\grabMMLseparatorb}}
+
+\def\grabMMLseparatora#1\xmlrent#2%
+ {\ifnum\MMLxxcounter=\MMLyycounter\space
+ \def\lastMMLseparator{\xmlrent{#2}}%
+ \fi
+ \dograbMMLseparator}
+
+\def\grabMMLseparatorb#1% better use \checkMMLoperator
+ {\ifnum\MMLxxcounter=\MMLyycounter\space
+\doifXMLentityelse{#1}
+ {\def\lastMMLseparator{\xmlrent{#1}}}
+ {\def\lastMMLseparator{#1}}%
+ \fi
+ \dograbMMLseparator}
+
+\remapXMLsequence [menclose] [CPA] \MMLpENCLOSE
+
+\def\MMLpENCLOSE#1#2%
+ {\getXMLarguments{menclose}{notation="" #1}%
+ \doifelse{\XMLpar{menclose}{notation}{}}{longdiv}
+ {\overline{)#2}}
+ {#2}}
+
+\remapXMLsequence [mfrac] [CPA] \MMLpFRAC
+
+\def\MMLpFRAC#1#2% \above is suboptimal since the spacing changes
+ {\withnexttwoXMLRelements
+ {\getXMLarguments{mfrac}{linethickness="" #1}%
+ \doifXMLparelse{mfrac}{linethickness}
+ {\edef\theXMLpar{\XMLpar{mfrac}{linethickness}{1}}%
+ \processaction
+ [\theXMLpar]
+ [ thin=>\scratchdimen=.2pt,
+ medium=>\scratchdimen=.4pt,
+ thick=>\scratchdimen=.8pt,
+ unknown=>\setdimensionwithunit\scratchdimen{\theXMLpar}{}]%
+ {{\firstXMLRelement}\above\scratchdimen{\secondXMLRelement}}}
+ {\frac{\firstXMLRelement}{\secondXMLRelement}}}%
+ #2}
+
+\remapXMLsequence [ms] [CPA] \MMLpSTRING
+
+\def\MMLpSTRING#1#2%
+ {\MMLpTEXT{#1}
+ {\getXMLarguments{mstyle}{#1}%
+ \getXMLarguments{ms}{lquote="\xmlrent{quot}" rquote="\xmlrent{quot}" #1}%
+ \XMLpar{ms}{lquote}{}\ignorespaces#2\unskip\unskip\XMLpar{ms}{rquote}{}}}
+
+\remapXMLsequence [mstyle] [CPA] \MMLpSTYLE
+
+\getXMLarguments
+ {mstyle}
+ {fontweight="" fontstyle="" mathstyle="" mathvariant="" background="" color=""}
+
+\def\MMLpSTYLE#1#2%
+ {\getXMLarguments{mstyle}{#1}#2}
+
+\remapXMLsequence [mtext] [CPA] \MMLpTEXT
+\remapXMLsequence [merror] [CPA] \MMLpERROR
+\remapXMLsequence [mphantom] [CPA] \MMLpPHANTOM
+\remapXMLsequence [mpadded] [CPA] \MMLpPADDED
+
+\def\MMLpTEXT#1#2%
+ {\hbox
+ {\tf % else encoding problems
+ \getXMLarguments{mstyle}{#1}%
+ \doMMPpbackground{mstyle}
+ {\doMMPpcolor{mstyle}
+ {\setMMLptextstyle{mstyle}%
+ \ignorespaces#2\unskip\unskip}}}}
+
+\def\setMMLpstyle#1%
+ {\doifdefined{MMLpstyle:#1}{\getvalue{MMLpstyle:#1}}}
+
+\def\defineMMLstyle[#1]#2%
+ {\setvalue{MMLpstyle:#1}{#2}}
+
+\defineMMLstyle[normal] {\tf} \defineMMLstyle[double-stuck] {\bf}
+\defineMMLstyle[bolditalic] {\bi} \defineMMLstyle[bold-italic] {\bi}
+\defineMMLstyle[boldslanted]{\bs} \defineMMLstyle[bold-slanted] {\bs}
+\defineMMLstyle[boldnormal] {\bf} \defineMMLstyle[bold] {\bf}
+\defineMMLstyle[slanted] {\sl} \defineMMLstyle[normalslanted]{\sl}
+\defineMMLstyle[italic] {\it} \defineMMLstyle[normalitalic] {\it}
+\defineMMLstyle[fraktur] {\bf} \defineMMLstyle[bold-fraktur] {\bf}
+\defineMMLstyle[script] {\tf} \defineMMLstyle[bold-script] {\bf}
+
+% and all kind of other crappy names
+
+\def\setMMLptextstyle#1%
+ {\setMMLpstyle{\XMLpar{#1}{fontweight}{}\XMLpar{#1}{fontstyle}{}}}
+
+\def\setMMLpmathstyle#1%
+ {\setMMLpstyle{\XMLpar{#1}{mathvariant}{}}}
+
+\def\doMMPpcolor#1#2%
+ {\doifXMLparelse{#1}{color}{\color[\XMLpar{#1}{color}{}]{#2}}{#2}}
+
+\def\doMMPpbackground#1#2%
+ {\doifXMLparelse{#1}{background}
+ {\inframed
+ [\c!frame=\v!off,
+ \c!background=\v!color,
+ \c!backgroundcolor=\XMLpar{#1}{background}{}]
+ {#2}}
+ {#2}}
+
+\def\MMLpERROR #1#2{\hbox{$\displaystyle#2$}}
+\def\MMLpPHANTOM#1#2{\phantom{\ignorespaces{}#2\unskip}} % watch spacing {} hack
+\def\MMLpPADDED #1#2{#2}
+
+\remapXMLsequence [mrow] [CPA] \MMLpROW
+
+\def\MMLpROW#1#2{#2}
+
+\remapXMLsequence [msqrt] [CPA] \MMLpSQRT
+\remapXMLsequence [mroot] [CPA] \MMLpROOT
+
+\def\MMLpSQRT#1#2%
+ {\sqrt{#2}}
+
+\def\MMLpROOT#1#2%
+ {\withnexttwoXMLRelements{\root{\secondXMLRelement}\of{\firstXMLRelement}}#2}
+
+\remapXMLsequence [msup] [CPA] \MMLpSUP
+\remapXMLsequence [msub] [CPA] \MMLpSUB
+
+\setupMMLappearance[scripts][\c!alternative=\v!a]
+
+\def\MMLpSUBP#1#2%
+ {\withnexttwoXMLRelements
+ {\doifelse\@@MMLscriptsalternative\v!a
+ {{\firstXMLRelement}#1{\secondXMLRelement}} % both {} essential
+ {\firstXMLRelement#1{\secondXMLRelement}}}%
+ #2}
+
+\def\MMLpSUP#1{\MMLpSUBP^}
+\def\MMLpSUB#1{\MMLpSUBP_}
+
+\remapXMLsequence [msubsup] [CPA] \MMLpSUBSUP
+
+\def\MMLpSUBSUP#1#2%
+ {\withnextthreeXMLRelements
+ {\firstXMLRelement_{\secondXMLRelement}^{\thirdXMLRelement}}%
+ #2}
+
+\remapXMLsequence [mover] [CPA] \MMLpOVER
+\remapXMLsequence [munder] [CPA] \MMLpUNDER
+\remapXMLsequence [munderover] [CPA] \MMLpUNDEROVER
+
+% hack, cannot be nested
+
+\def\MMLpUNDER#1#2{\withnexttwoXMLRelements\doMMLpUNDER#2}
+\def\MMLpOVER #1#2{\withnexttwoXMLRelements\doMMLpOVER #2}
+
+\def\doMMLfiller#1%
+ {\pushmacro\doMMLfiller
+ \let\doMMLfiller\gobbleoneargument
+ \gdef\dodoMMLfiller{\disablefiller\mathematics{#1}}%
+ \setbox\scratchbox=\hbox
+ {\def\normalorfiller##1##2%
+ {\gdef\dodoMMLfiller{\enablefiller#1}%
+ \let\normalorfiller\gobbletwoarguments}%
+ $#1$}%
+ \popmacro\doMMLfiller
+ \dodoMMLfiller}
+
+\def\doMMLpUNDER
+ {\mathop{\vtop{\mathsurround\zeropoint\ialign{\hss##\hss\crcr
+ \disabledelimiter\doMMLfiller\firstXMLRelement
+ \crcr\noalign{\kern3\points\nointerlineskip}%
+ \disabledelimiter\doMMLfiller\secondXMLRelement
+ \crcr\noalign{\kern3\points}}}}\limits}
+
+\def\doMMLpOVER
+ {\mathop{\vbox{\mathsurround\zeropoint\ialign{\hss##\hss\crcr\noalign{\kern3\points}%
+ \disabledelimiter\doMMLfiller\secondXMLRelement
+ \crcr\noalign{\kern3\points\nointerlineskip}%
+ \disabledelimiter\doMMLfiller\firstXMLRelement
+ \crcr}}}\limits}
+
+\def\MMLpUNDEROVER#1#2%
+ {\withnextthreeXMLRelements
+ {\firstXMLRelement
+ _{\disablefiller\disabledelimiter\secondXMLRelement}%
+ ^{\disablefiller\disabledelimiter\thirdXMLRelement}}#2}
+
+\remapXMLsequence [mtable] [CPA] \MMLpTABLE
+\remapXMLsequence [mtr] [CPA] \MMLpTR
+\remapXMLsequence [mtd] [CPA] \MMLpTD
+\remapXMLsequence [mlabeledtr] [CPA] \MMLpLABELEDTR
+
+\unexpanded\def\@col@amp@{&}
+
+\def\MMLpTR#1#2{\collectbetweenXMLR{\@col@amp@}{#2}\the\XMLRtoks\crcr}
+\def\MMLpTD#1#2{#2}
+
+\def\MMLpLABELEDTR{\MMLpTR}
+
+\def\MMLpTABLEmapper#1#2#3%
+ {\doifXMLparelse{mtable}{#1}
+ {\newcounter\MMLcounter
+ \def\docommand##1%
+ {\increment\MMLcounter
+ \let\MMLpREMAP\doMMLpREMAP
+ \def\MMLsetting{##1}#3% remap list
+ \expanded{\setupTABLE[column][\MMLcounter][#2=\MMLsetting]}}%
+ \expanded{\processseparatedlist[\XMLpar{mtable}{#1}{}][ ]\noexpand\docommand}}
+ {}}
+
+\def\MMLpTABLEmap#1#2#3%
+ {\doifXMLparelse{mtbl}{#1}
+ {\edef\MMLsetting{\XMLpar{mtbl}{#1}{}}#3% remap list
+ \edef\theMMLpTABLEmap{#2=\MMLsetting,\theMMLpTABLEmap}}
+ {}}
+
+\def\doMMLpREMAP#1#2%
+ {\doif{\MMLsetting}{#1}
+ {\def\MMLsetting{#2}%
+ \let\MMLpREMAP\gobbletwoarguments}}
+
+\let\MMLpREMAP\doMMLpREMAP
+
+\def\doMMLpTABLE#1#2%
+ {\begingroup
+ \getXMLarguments{mtable}
+ {columnalign="" columnspacing=".25ex" rowspacing=".25ex"
+ frame="" color="" background="" #1}%
+ \setupTABLE[\c!frame=\v!off]%
+ \MMLpTABLEmapper{background}{\c!backgroundcolor}{}%
+ \MMLpTABLEmapper{color}{\c!color}{}%
+ \MMLpTABLEmapper{frame}{\c!frame}
+ {\MMLpREMAP{none}{off}\MMLpREMAP{solid}{on}}%
+ \MMLpTABLEmapper{columnalign}{\c!align}
+ {\MMLpREMAP{left}{right}%
+ \MMLpREMAP{right}{left}%
+ \MMLpREMAP{center}{middle}}%
+ \setMMLpunit{\XMLpar{mtable}{rowspacing}{}}{.25ex}%
+ \let\MMLpTABLEoffset\MMLpunit
+ \let\MMLpTR\doMMLpTR
+ \let\MMLpTD\doMMLpTD
+ \bTABLE[\c!background=\v!color,\c!offset=\MMLpTABLEoffset]#2\eTABLE
+ \endgroup}
+
+\def\doMMLpTR#1#2%
+ {\doifXMLRchildelse{mtd}{#2}
+ {\bTR\ignorespaces#2\unskip\eTR}
+ {\bTR\doMMLpTD{#1}{#2}\eTR}}
+
+\def\doMMLpTD#1#2%
+ {\getXMLarguments{mtbl}
+ {columnalign="" columnspacing="" rowspacing=""
+ frame="" color="" background="" #1}%
+ \let\theMMLpTABLEmap\empty
+ \MMLpTABLEmap{background}{\c!backgroundcolor}{}%
+ \MMLpTABLEmap{color}{\c!color}{}%
+ \MMLpTABLEmap{frame}{\c!frame}
+ {\MMLpREMAP{none}{off}\MMLpREMAP{solid}{on}}%
+ \MMLpTABLEmap{columnalign}{\c!align}
+ {\MMLpREMAP{left}{right}\MMLpREMAP{right}{left}}%
+ \@EA\bTD\@EA[\theMMLpTABLEmap]$\ignorespaces#2\unskip$\eTD}
+
+\setupMMLappearance[mtable][\c!alternative=\v!a]
+
+\def\MMLpTABLE
+ {\doifelse\@@MMLmtablealternative\v!a
+ {\expandafter\MMLpTABLEa}
+ {\expandafter\MMLpTABLEb}}
+
+\def\MMLpTABLEa#1#2%
+ {\begingroup
+ \doifelsenothing{#1}
+ {\global\setfalse\mmlTABLEargs}
+ {\global\settrue\mmlTABLEargs}%
+ \ifconditional\mmlTABLEargs \else
+ \setbox\scratchbox=\hbox
+ {$\displaystyle
+ \def\MMLpTABLE##1##2%
+ {\ifconditional\mmlTABLEargs \else
+ \doifelsenothing{##1}{##2}{\global\settrue\mmlTABLEargs}%
+ \fi}%
+ \let\MMLpTR\MMLpTABLE
+ \let\MMLpTD\MMLpTABLE
+ #2$}%
+ \fi
+ \ifconditional\mmlTABLEargs
+ \let\MMLpTABLE\doMMLpTABLE
+ \def\next{\MMLpTABLE{#1}}%
+ \else
+ \let\next\matrix
+ \fi
+ \next{#2}%
+ \endgroup}
+
+\let\MMLpTABLEb\doMMLpTABLE
+
+\remapXMLsingular [mspace] [CPA] \MMLpSPACE
+
+\def\setMMLpunit#1#2%
+ {\setbox\scratchbox=\hbox
+ {\edef\ascii{#1}%
+ \@EA\aftersplitstring\ascii\at.\to\ascii
+ \scratchcounter=\ifx\ascii\empty#1\else\ascii\fi
+ \unskip\unskip}%
+ \ifdim\wd\scratchbox=\zeropoint
+ \edef\MMLpunit{#1em}%
+ \else
+ \edefconvertedargument\ascii{#1}%
+ \convertasciiafter\doifinstringelse{em}{\ascii}{\edef\MMLpunit{#1}}{%
+ \convertasciiafter\doifinstringelse{ex}{\ascii}{\edef\MMLpunit{#1}}{%
+ \convertasciiafter\doifinstringelse{pt}{\ascii}{\edef\MMLpunit{#1}}{%
+ \edef\MMLpunit{#2}}}}%
+ \fi}
+
+\def\MMLpSPACE#1#2%
+ {\getXMLarguments{mspace}{width=".5em" #1}%
+ \setMMLpunit{\XMLpar{mspace}{width}{}}{.5em}%
+ \hskip\MMLpunit\relax}
+
+
+\remapXMLsingular [mglyph] [CPA] \MMLpGLYPH
+
+\def\MMLpGLYPH#1#2% we assume \definefont usage
+ {\getXMLarguments{mglyph}{fontfamily="" index="1" alt="" #1}%
+ \def\MMLpglyph{\XMLpar{mglyph}{fontfamily}{}}%
+ \doifelsenothing{\MMLpglyph}
+ {\hbox{\tttf[fontfamily unspecified]}}
+ {\doifdefinedelse{\MMLpglyph}
+ {\hbox{\getvalue{\MMLpglyph}\char0\XMLpar{mglyph}{index}{1}}}
+ {\doifelsenothing{\XMLpar{mglyph}{alt}{}}
+ {\hbox{\tttf[unknown fontfamily \XMLpar{mglyph}{fontfamily}{}]}}
+ {\hbox{\tttf\XMLpar{mglyph}{alt}{}}}}}}
+
+\remapXMLsingular [malignmark] [CPA] \MMLpALIGNMARK
+
+\def\MMLpALIGNMARK#1#2%
+ {}
+
+\remapXMLsingular [none] [CPA] \MMLpNONE
+\remapXMLsingular [mprescripts] [CPA] \MMLpMPRESCRIPTS
+\remapXMLsequence [mmultiscripts] [CPA] \MMLpMULTISCRIPTS
+
+\def\MMLpNONE #1#2{}
+\def\MMLpMPRESCRIPTS#1#2{}
+
+\def\MMLpMULTISCRIPTS#1#2%
+ {\pushmacro\xmlr
+ \let\xmlr\pMULTISCRIPTmmlPRE
+ \donefalse \scratchcounter=0 #2\empty
+ \let\xmlr\pMULTISCRIPTmmlPOST
+ \donetrue \scratchcounter=0 #2\empty
+ \popmacro\xmlr}
+
+\def\pMULTISCRIPTmmlPRE#1#2#3#4%
+ {\ifdone
+ \ifodd\scratchcounter
+ _{\naturalxmlr{#1}{#2}{#3}{#4}}%
+ \else
+ ^{\naturalxmlr{#1}{#2}{#3}{#4}}{}%
+ \fi
+ \else
+ \doif{mprescripts/}{#1}{\donetrue{}}% weak, the / here
+ \fi
+ \ifdone \advance\scratchcounter \plusone \fi}
+
+\let\pMULTISCRIPTmmlPOST\pMULTISCRIPTmmlPRE
+
+\stopXMLmapping
+
+\protect \endinput
+
+% extra samples
+
+\startXMLdata
+<formula>
+ <dmath>
+ <mfrac>
+ <mrow>
+ <mfrac>
+ <mrow>
+ <mtext>Q</mtext>
+ </mrow>
+ <mrow>
+ <mtext>P</mtext>
+ </mrow>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mtext>R</mtext>
+ </mrow>
+ </mfrac>
+ </dmath>
+</formula>
+\stopXMLdata
+
+\startXMLdata
+<formula>
+ <dmath>
+ <mfrac>
+ <mrow>
+ <mfrac>
+ <mrow>
+ <mi mathvariant='normal'>R</mi>
+ </mrow>
+ <mrow>
+ <mi mathvariant='normal'>P</mi>
+ </mrow>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mi mathvariant='normal'>R</mi>
+ </mrow>
+ </mfrac>
+ </dmath>
+</formula>
+\stopXMLdata
diff --git a/tex/context/base/xtag-mxa.tex b/tex/context/base/xtag-mxa.tex
new file mode 100644
index 000000000..5e83367df
--- /dev/null
+++ b/tex/context/base/xtag-mxa.tex
@@ -0,0 +1,101 @@
+\defineMMLsynonym bkarow rbarr
+\defineMMLsynonym circlearrowleft olarr
+\defineMMLsynonym circlearrowright orarr
+\defineMMLsynonym curvearrowleft cularr
+\defineMMLsynonym curvearrowright curarr
+\defineMMLsynonym dbkarow rBarr
+\defineMMLsynonym DoubleDownArrow dArr
+\defineMMLsynonym DoubleLeftRightArrow hArr
+\defineMMLsynonym DoubleLongLeftArrow xlArr
+\defineMMLsynonym DoubleLongLeftRightArrow xhArr
+\defineMMLsynonym DoubleLongRightArrow xrArr
+\defineMMLsynonym DoubleUpArrow uArr
+\defineMMLsynonym DoubleUpDownArrow vArr
+\defineMMLsynonym Downarrow dArr
+\defineMMLsynonym DownArrowUpArrow duarr
+\defineMMLsynonym downdownarrows ddarr
+\defineMMLsynonym downharpoonleft dharl
+\defineMMLsynonym downharpoonright dharr
+\defineMMLsynonym DownLeftVector lhard
+\defineMMLsynonym DownRightVector rhard
+\defineMMLsynonym drbkarow RBarr
+\defineMMLsynonym Equilibrium rlhar
+\defineMMLsynonym hksearow searhk
+\defineMMLsynonym hkswarow swarhk
+\defineMMLsynonym hookleftarrow larrhk
+\defineMMLsynonym hookrightarrow rarrhk
+\defineMMLsynonym LeftArrowRightArrow lrarr
+\defineMMLsynonym leftarrowtail larrtl
+\defineMMLsynonym LeftDownVector dharl
+\defineMMLsynonym leftharpoondown lhard
+\defineMMLsynonym leftharpoonup lharu
+\defineMMLsynonym leftleftarrows llarr
+\defineMMLsynonym LeftRightArrow harr
+\defineMMLsynonym Leftrightarrow hArr
+\defineMMLsynonym leftrightarrow harr
+\defineMMLsynonym leftrightarrows lrarr
+\defineMMLsynonym leftrightharpoons lrhar
+\defineMMLsynonym leftrightsquigarrow harrw
+\defineMMLsynonym LeftUpVector uharl
+\defineMMLsynonym LeftVector lharu
+\defineMMLsynonym Lleftarrow lAarr
+\defineMMLsynonym LongLeftArrow xlarr
+\defineMMLsynonym Longleftarrow xlArr
+\defineMMLsynonym longleftarrow xlarr
+\defineMMLsynonym LongLeftRightArrow xharr
+\defineMMLsynonym Longleftrightarrow xhArr
+\defineMMLsynonym longleftrightarrow xharr
+\defineMMLsynonym longmapsto xmap
+\defineMMLsynonym LongRightArrow xrarr
+\defineMMLsynonym Longrightarrow xrArr
+\defineMMLsynonym longrightarrow xrarr
+\defineMMLsynonym looparrowleft larrlp
+\defineMMLsynonym looparrowright rarrlp
+\defineMMLsynonym LowerLeftArrow swarr
+\defineMMLsynonym LowerRightArrow searr
+\defineMMLsynonym Lsh lsh
+\defineMMLsynonym mapsto map
+\defineMMLsynonym multimap mumap
+\defineMMLsynonym nearrow nearr
+\defineMMLsynonym nLeftarrow nlArr
+\defineMMLsynonym nleftarrow nlarr
+\defineMMLsynonym nLeftrightarrow nhArr
+\defineMMLsynonym nleftrightarrow nharr
+\defineMMLsynonym nRightarrow nrArr
+\defineMMLsynonym nrightarrow nrarr
+\defineMMLsynonym nwarrow nwarr
+\defineMMLsynonym ReverseEquilibrium lrhar
+\defineMMLsynonym ReverseUpEquilibrium duhar
+\defineMMLsynonym RightArrowLeftArrow rlarr
+\defineMMLsynonym rightarrowtail rarrtl
+\defineMMLsynonym RightDownVector dharr
+\defineMMLsynonym rightharpoondown rhard
+\defineMMLsynonym rightharpoonup rharu
+\defineMMLsynonym rightleftarrows rlarr
+\defineMMLsynonym rightleftharpoons rlhar
+\defineMMLsynonym rightrightarrows rrarr
+\defineMMLsynonym rightsquigarrow rarrw
+\defineMMLsynonym RightTeeArrow map
+\defineMMLsynonym RightUpVector uharr
+\defineMMLsynonym RightVector rharu
+\defineMMLsynonym Rrightarrow rAarr
+\defineMMLsynonym Rsh rsh
+\defineMMLsynonym searrow searr
+\defineMMLsynonym ShortLeftArrow slarr
+\defineMMLsynonym ShortRightArrow srarr
+\defineMMLsynonym swarrow swarr
+\defineMMLsynonym toea nesear
+\defineMMLsynonym tosa seswar
+\defineMMLsynonym twoheadleftarrow Larr
+\defineMMLsynonym twoheadrightarrow Rarr
+\defineMMLsynonym Uparrow uArr
+\defineMMLsynonym UpArrowDownArrow udarr
+\defineMMLsynonym UpDownArrow varr
+\defineMMLsynonym Updownarrow vArr
+\defineMMLsynonym updownarrow varr
+\defineMMLsynonym UpEquilibrium udhar
+\defineMMLsynonym upharpoonleft uharl
+\defineMMLsynonym upharpoonright uharr
+\defineMMLsynonym UpperLeftArrow nwarr
+\defineMMLsynonym UpperRightArrow nearr
+\defineMMLsynonym upuparrows uuarr
diff --git a/tex/context/base/xtag-mxb.tex b/tex/context/base/xtag-mxb.tex
new file mode 100644
index 000000000..c325a9e44
--- /dev/null
+++ b/tex/context/base/xtag-mxb.tex
@@ -0,0 +1,55 @@
+\defineMMLsynonym ast midast
+\defineMMLsynonym Backslash setmn
+\defineMMLsynonym barwedge barwed
+\defineMMLsynonym bigcap xcap
+\defineMMLsynonym bigcirc xcirc
+\defineMMLsynonym bigcup xcup
+\defineMMLsynonym bigodot xodot
+\defineMMLsynonym bigoplus xoplus
+\defineMMLsynonym bigotimes xotime
+\defineMMLsynonym bigsqcup xsqcup
+\defineMMLsynonym bigtriangledown xdtri
+\defineMMLsynonym bigtriangleup xutri
+\defineMMLsynonym biguplus xuplus
+\defineMMLsynonym bigvee xvee
+\defineMMLsynonym bigwedge xwedge
+\defineMMLsynonym boxminus minusb
+\defineMMLsynonym boxplus plusb
+\defineMMLsynonym boxtimes timesb
+\defineMMLsynonym cdot sdot
+\defineMMLsynonym circledast oast
+\defineMMLsynonym circledcirc ocir
+\defineMMLsynonym circleddash odash
+\defineMMLsynonym CircleDot odot
+\defineMMLsynonym CircleMinus ominus
+\defineMMLsynonym CirclePlus oplus
+\defineMMLsynonym CircleTimes otimes
+\defineMMLsynonym Coproduct coprod
+\defineMMLsynonym curlyvee cuvee
+\defineMMLsynonym curlywedge cuwed
+\defineMMLsynonym ddagger Dagger
+\defineMMLsynonym diamond diam
+\defineMMLsynonym divideontimes divonx
+\defineMMLsynonym dotminus minusd
+\defineMMLsynonym dotplus plusdo
+\defineMMLsynonym dotsquare sdotb
+\defineMMLsynonym doublebarwedge Barwed
+\defineMMLsynonym intercal intcal
+\defineMMLsynonym Intersection xcap
+\defineMMLsynonym intprod iprod
+\defineMMLsynonym leftthreetimes lthree
+\defineMMLsynonym oslash osol
+\defineMMLsynonym rightthreetimes rthree
+\defineMMLsynonym setminus setmn
+\defineMMLsynonym smallsetminus ssetmn
+\defineMMLsynonym SquareIntersection sqcap
+\defineMMLsynonym SquareUnion sqcup
+\defineMMLsynonym Star sstarf
+\defineMMLsynonym star sstarf
+\defineMMLsynonym Sum sum
+\defineMMLsynonym Union xcup
+\defineMMLsynonym UnionPlus uplus
+\defineMMLsynonym Vee xvee
+\defineMMLsynonym VerticalTilde wreath
+\defineMMLsynonym Wedge xwedge
+\defineMMLsynonym wr wreath
diff --git a/tex/context/base/xtag-mxc.tex b/tex/context/base/xtag-mxc.tex
new file mode 100644
index 000000000..e692f2a24
--- /dev/null
+++ b/tex/context/base/xtag-mxc.tex
@@ -0,0 +1,10 @@
+\defineMMLsynonym LeftCeiling lceil
+\defineMMLsynonym LeftFloor lfloor
+\defineMMLsynonym llcorner dlcorn
+\defineMMLsynonym lmoustache lmoust
+\defineMMLsynonym lrcorner drcorn
+\defineMMLsynonym RightCeiling rceil
+\defineMMLsynonym RightFloor rfloor
+\defineMMLsynonym rmoustache rmoust
+\defineMMLsynonym ulcorner ulcorn
+\defineMMLsynonym urcorner urcorn
diff --git a/tex/context/base/xtag-mxh.tex b/tex/context/base/xtag-mxh.tex
new file mode 100644
index 000000000..3cf0103c8
--- /dev/null
+++ b/tex/context/base/xtag-mxh.tex
@@ -0,0 +1,67 @@
+\defineMMLsynonym approx ap
+\defineMMLsynonym Because becaus
+\defineMMLsynonym because becaus
+\defineMMLsynonym blacksquare squarf
+\defineMMLsynonym bot bottom
+\defineMMLsynonym circ compfn
+\defineMMLsynonym ClockwiseContourIntegral cwconint
+\defineMMLsynonym Congruent equiv
+\defineMMLsynonym ContourIntegral conint
+\defineMMLsynonym CounterClockwiseContourIntegral awconint
+\defineMMLsynonym Del nabla
+\defineMMLsynonym DoubleContourIntegral Conint
+\defineMMLsynonym DoubleLeftArrow lArr
+\defineMMLsynonym DoubleRightArrow rArr
+\defineMMLsynonym DoubleVerticalBar par
+\defineMMLsynonym DownTee top
+\defineMMLsynonym Element isinv
+\defineMMLsynonym Exists exist
+\defineMMLsynonym ForAll forall
+\defineMMLsynonym geq ge
+\defineMMLsynonym GreaterEqual ge
+\defineMMLsynonym iiiint qint
+\defineMMLsynonym iiint tint
+\defineMMLsynonym Implies rArr
+\defineMMLsynonym in isin
+\defineMMLsynonym Integral int
+\defineMMLsynonym langle lang
+\defineMMLsynonym LeftAngleBracket lang
+\defineMMLsynonym Leftarrow lArr
+\defineMMLsynonym leq le
+\defineMMLsynonym MinusPlus mnplus
+\defineMMLsynonym mp mnplus
+\defineMMLsynonym NotElement notin
+\defineMMLsynonym NotEqual ne
+\defineMMLsynonym NotReverseElement notniva
+\defineMMLsynonym oint conint
+\defineMMLsynonym parallel par
+\defineMMLsynonym PartialD part
+\defineMMLsynonym Proportional prop
+\defineMMLsynonym propto prop
+\defineMMLsynonym rangle rang
+\defineMMLsynonym ReverseElement niv
+\defineMMLsynonym RightAngleBracket rang
+\defineMMLsynonym Rightarrow rArr
+\defineMMLsynonym simeq sime
+\defineMMLsynonym SmallCircle compfn
+\defineMMLsynonym Sqrt radic
+\defineMMLsynonym Subset sub
+\defineMMLsynonym subset sub
+\defineMMLsynonym subseteq sube
+\defineMMLsynonym SubsetEqual sube
+\defineMMLsynonym SuchThat ni
+\defineMMLsynonym Superset sup
+\defineMMLsynonym SupersetEqual supe
+\defineMMLsynonym supset sup
+\defineMMLsynonym supseteq supe
+\defineMMLsynonym Therefore there4
+\defineMMLsynonym therefore there4
+\defineMMLsynonym Tilde sim
+\defineMMLsynonym TildeEqual sime
+\defineMMLsynonym TildeFullEqual cong
+\defineMMLsynonym TildeTilde ap
+\defineMMLsynonym TripleDot tdot
+\defineMMLsynonym UpTee perp
+\defineMMLsynonym vee or
+\defineMMLsynonym Vert Verbar
+\defineMMLsynonym wedge and
diff --git a/tex/context/base/xtag-mxn.tex b/tex/context/base/xtag-mxn.tex
new file mode 100644
index 000000000..35eeade9a
--- /dev/null
+++ b/tex/context/base/xtag-mxn.tex
@@ -0,0 +1,84 @@
+\defineMMLsynonym gnapprox gnap
+\defineMMLsynonym gneq gne
+\defineMMLsynonym gneqq gnE
+\defineMMLsynonym gvertneqq gvnE
+\defineMMLsynonym lnapprox lnap
+\defineMMLsynonym lneq lne
+\defineMMLsynonym lneqq lnE
+\defineMMLsynonym lvertneqq lvnE
+\defineMMLsynonym napprox nap
+\defineMMLsynonym ngeq nge
+\defineMMLsynonym ngeqq ngE
+\defineMMLsynonym ngeqslant nges
+\defineMMLsynonym ngtr ngt
+\defineMMLsynonym nleq nle
+\defineMMLsynonym nleqq nlE
+\defineMMLsynonym nleqslant nles
+\defineMMLsynonym nless nlt
+\defineMMLsynonym NotCongruent nequiv
+\defineMMLsynonym NotDoubleVerticalBar npar
+\defineMMLsynonym NotGreater ngt
+\defineMMLsynonym NotGreaterEqual nge
+\defineMMLsynonym NotGreaterFullEqual ngE
+\defineMMLsynonym NotGreaterGreater nGtv
+\defineMMLsynonym NotGreaterLess ntvgl
+\defineMMLsynonym NotGreaterSlantEqual nges
+\defineMMLsynonym NotGreaterTilde ngsim
+\defineMMLsynonym NotLeftTriangle nltri
+\defineMMLsynonym NotLeftTriangleEqual nltrie
+\defineMMLsynonym NotLess nlt
+\defineMMLsynonym NotLessEqual nle
+\defineMMLsynonym NotLessFullEqual nlE
+\defineMMLsynonym NotLessGreater ntvlg
+\defineMMLsynonym NotLessLess nLtv
+\defineMMLsynonym NotLessSlantEqual nles
+\defineMMLsynonym NotLessTilde nlsim
+\defineMMLsynonym NotPrecedes npr
+\defineMMLsynonym NotPrecedesEqual npre
+\defineMMLsynonym NotPrecedesSlantEqual nprcue
+\defineMMLsynonym NotRightTriangle nrtri
+\defineMMLsynonym NotRightTriangleEqual nrtrie
+\defineMMLsynonym NotSquareSubsetEqual nsqsube
+\defineMMLsynonym NotSquareSupersetEqual nsqsupe
+\defineMMLsynonym NotSubset vnsub
+\defineMMLsynonym NotSucceeds nsc
+\defineMMLsynonym NotSucceedsEqual nsce
+\defineMMLsynonym NotSucceedsSlantEqual nsccue
+\defineMMLsynonym NotSuperset vnsup
+\defineMMLsynonym NotTilde nsim
+\defineMMLsynonym NotTildeEqual nsime
+\defineMMLsynonym NotTildeFullEqual ncong
+\defineMMLsynonym NotTildeTilde nap
+\defineMMLsynonym NotVerticalBar nmid
+\defineMMLsynonym nparallel npar
+\defineMMLsynonym nprec npr
+\defineMMLsynonym npreceq npre
+\defineMMLsynonym nshortmid nsmid
+\defineMMLsynonym nshortparallel nspar
+\defineMMLsynonym nsimeq nsime
+\defineMMLsynonym nsubset vnsub
+\defineMMLsynonym nsubseteq nsube
+\defineMMLsynonym nsubseteqq nsubE
+\defineMMLsynonym nsucc nsc
+\defineMMLsynonym nsucceq nsce
+\defineMMLsynonym nsupset vnsup
+\defineMMLsynonym nsupseteq nsupe
+\defineMMLsynonym nsupseteqq nsupE
+\defineMMLsynonym ntriangleleft nltri
+\defineMMLsynonym ntrianglelefteq nltrie
+\defineMMLsynonym ntriangleright nrtri
+\defineMMLsynonym ntrianglerighteq nrtrie
+\defineMMLsynonym precnapprox prnap
+\defineMMLsynonym precneqq prnE
+\defineMMLsynonym precnsim prnsim
+\defineMMLsynonym subsetneq subne
+\defineMMLsynonym subsetneqq subnE
+\defineMMLsynonym succnapprox scnap
+\defineMMLsynonym succneqq scnE
+\defineMMLsynonym succnsim scnsim
+\defineMMLsynonym supsetneq supne
+\defineMMLsynonym supsetneqq supnE
+\defineMMLsynonym varsubsetneq vsubne
+\defineMMLsynonym varsubsetneqq vsubnE
+\defineMMLsynonym varsupsetneq vsupne
+\defineMMLsynonym varsupsetneqq vsupnE
diff --git a/tex/context/base/xtag-mxo.tex b/tex/context/base/xtag-mxo.tex
new file mode 100644
index 000000000..045b4f406
--- /dev/null
+++ b/tex/context/base/xtag-mxo.tex
@@ -0,0 +1,14 @@
+\defineMMLsynonym angle ang
+\defineMMLsynonym backprime bprime
+\defineMMLsynonym circledS oS
+\defineMMLsynonym complement comp
+\defineMMLsynonym emptyset empty
+\defineMMLsynonym hbar plank
+\defineMMLsynonym hslash plankv
+\defineMMLsynonym Im image
+\defineMMLsynonym measuredangle angmsd
+\defineMMLsynonym nexists nexist
+\defineMMLsynonym NotExists nexist
+\defineMMLsynonym Re real
+\defineMMLsynonym varnothing emptyv
+\defineMMLsynonym wp weierp
diff --git a/tex/context/base/xtag-mxr.tex b/tex/context/base/xtag-mxr.tex
new file mode 100644
index 000000000..ed1498f81
--- /dev/null
+++ b/tex/context/base/xtag-mxr.tex
@@ -0,0 +1,112 @@
+\defineMMLsynonym approxeq ape
+\defineMMLsynonym backcong bcong
+\defineMMLsynonym backepsilon bepsi
+\defineMMLsynonym backsim bsim
+\defineMMLsynonym backsimeq bsime
+\defineMMLsynonym between twixt
+\defineMMLsynonym Bumpeq bump
+\defineMMLsynonym bumpeq bumpe
+\defineMMLsynonym circeq cire
+\defineMMLsynonym coloneq colone
+\defineMMLsynonym Cup smile
+\defineMMLsynonym CupCap asymp
+\defineMMLsynonym curlyeqprec cuepr
+\defineMMLsynonym curlyeqsucc cuesc
+\defineMMLsynonym ddotseq eDDot
+\defineMMLsynonym doteq esdot
+\defineMMLsynonym doteqdot eDot
+\defineMMLsynonym DotEqual esdot
+\defineMMLsynonym DoubleRightTee vDash
+\defineMMLsynonym eqcirc ecir
+\defineMMLsynonym eqcolon ecolon
+\defineMMLsynonym eqsim esim
+\defineMMLsynonym eqslantgtr egs
+\defineMMLsynonym eqslantless els
+\defineMMLsynonym EqualTilde esim
+\defineMMLsynonym fallingdotseq efDot
+\defineMMLsynonym geqq gE
+\defineMMLsynonym geqslant ges
+\defineMMLsynonym gg Gt
+\defineMMLsynonym ggg Gg
+\defineMMLsynonym GreaterEqualLess gel
+\defineMMLsynonym GreaterFullEqual gE
+\defineMMLsynonym GreaterLess gl
+\defineMMLsynonym GreaterSlantEqual ges
+\defineMMLsynonym GreaterTilde gsim
+\defineMMLsynonym gtrapprox gap
+\defineMMLsynonym gtrdot gtdot
+\defineMMLsynonym gtreqless gel
+\defineMMLsynonym gtreqqless gEl
+\defineMMLsynonym gtrless gl
+\defineMMLsynonym gtrsim gsim
+\defineMMLsynonym HumpDownHump bump
+\defineMMLsynonym HumpEqual bumpe
+\defineMMLsynonym LeftTee dashv
+\defineMMLsynonym LeftTriangle vltri
+\defineMMLsynonym LeftTriangleEqual ltrie
+\defineMMLsynonym leqq lE
+\defineMMLsynonym leqslant les
+\defineMMLsynonym lessapprox lap
+\defineMMLsynonym lessdot ltdot
+\defineMMLsynonym lesseqgtr leg
+\defineMMLsynonym lesseqqgtr lEg
+\defineMMLsynonym LessEqualGreater leg
+\defineMMLsynonym LessFullEqual lE
+\defineMMLsynonym LessGreater lg
+\defineMMLsynonym lessgtr lg
+\defineMMLsynonym lesssim lsim
+\defineMMLsynonym LessSlantEqual les
+\defineMMLsynonym LessTilde lsim
+\defineMMLsynonym ll Lt
+\defineMMLsynonym NestedGreaterGreater Gt
+\defineMMLsynonym NestedLessLess Lt
+\defineMMLsynonym pitchfork fork
+\defineMMLsynonym prec pr
+\defineMMLsynonym precapprox prap
+\defineMMLsynonym preccurlyeq prcue
+\defineMMLsynonym Precedes pr
+\defineMMLsynonym PrecedesEqual pre
+\defineMMLsynonym PrecedesSlantEqual prcue
+\defineMMLsynonym PrecedesTilde prsim
+\defineMMLsynonym preceq pre
+\defineMMLsynonym precsim prsim
+\defineMMLsynonym Proportion Colon
+\defineMMLsynonym questeq equest
+\defineMMLsynonym RightTee vdash
+\defineMMLsynonym RightTriangle vrtri
+\defineMMLsynonym RightTriangleEqual rtrie
+\defineMMLsynonym risingdotseq erDot
+\defineMMLsynonym shortmid smid
+\defineMMLsynonym shortparallel spar
+\defineMMLsynonym smallfrown sfrown
+\defineMMLsynonym smallsmile ssmile
+\defineMMLsynonym sqsubset sqsub
+\defineMMLsynonym sqsubseteq sqsube
+\defineMMLsynonym sqsupset sqsup
+\defineMMLsynonym sqsupseteq sqsupe
+\defineMMLsynonym SquareSubset sqsub
+\defineMMLsynonym SquareSubsetEqual sqsube
+\defineMMLsynonym SquareSuperset sqsup
+\defineMMLsynonym SquareSupersetEqual sqsupe
+\defineMMLsynonym Subset Sub
+\defineMMLsynonym subseteqq subE
+\defineMMLsynonym succ sc
+\defineMMLsynonym succapprox scap
+\defineMMLsynonym succcurlyeq sccue
+\defineMMLsynonym Succeeds sc
+\defineMMLsynonym SucceedsEqual sce
+\defineMMLsynonym SucceedsSlantEqual sccue
+\defineMMLsynonym SucceedsTilde scsim
+\defineMMLsynonym succeq sce
+\defineMMLsynonym succsim scsim
+\defineMMLsynonym Supset Sup
+\defineMMLsynonym supseteqq supE
+\defineMMLsynonym thickapprox thkap
+\defineMMLsynonym thicksim thksim
+\defineMMLsynonym trianglelefteq ltrie
+\defineMMLsynonym triangleq trie
+\defineMMLsynonym trianglerighteq rtrie
+\defineMMLsynonym varpropto vprop
+\defineMMLsynonym vartriangleleft vltri
+\defineMMLsynonym vartriangleright vrtri
+\defineMMLsynonym VerticalBar mid
diff --git a/tex/context/base/xtag-pml.tex b/tex/context/base/xtag-pml.tex
new file mode 100644
index 000000000..53d22c52a
--- /dev/null
+++ b/tex/context/base/xtag-pml.tex
@@ -0,0 +1,85 @@
+%D \module
+%D [ file=xtag-pml,
+%D version=2001.09.04,
+%D title=\CONTEXT\ XML Support,
+%D subtitle=Physics ML,
+%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 XML Macros / PhysML}
+
+%D This is a reimplmentation of the old filter. This module
+%D runs on top of the mathml and units modules.
+
+\useXMLfilter[map]
+\useXMLfilter[mml,mmp,mmc]
+
+\defineXMLargument [phys] \doXMLphys
+\defineXMLargument [iphys] \doXMLiphys
+\defineXMLargument [dphys] \doXMLdphys
+
+\unprotect
+
+\unexpanded\def\doXMLphys {\ifhmode\@EA\doXMLiphys\else\@EA\doXMLdphys\fi}
+\unexpanded\def\doXMLiphys{\XMLremapdata[mml]{$\ignorespaces}{\unskip$}}
+\unexpanded\def\doXMLdphys{\XMLremapdata[mml]{\dostartformula{}}{\dostopformula}}
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\usemodule[units]
+
+\starttext
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 10 </cn>
+ <ci><unit><Milli/><Sec/><Per/><Square/><Kilo/><Meter/></unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <divide/>
+ <cn> 10 </cn>
+ <ci> <unit><Unit/><Milli/><Sec/><Per/><Square/><Kilo/><Meter/></unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 10 </cn>
+ <ci> <unit> <Milli/> <Sec/> <Per/> <Square/> <Kilo/> <Meter/> </unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 10 </cn>
+ <ci> <unit><Milli/><Sec/><Per/><Square/><Kilo/><Meter/></unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\startXMLdata
+<phys>
+ <apply> <times/>
+ <cn> 10 </cn>
+ <ci> <unit> <Milli/> <Sec/> <Per/> <Square/> <Kilo/> <Meter/> </unit> </ci>
+ </apply>
+</phys>
+\stopXMLdata
+
+\stoptext
diff --git a/tex/context/base/xtag-pmu.tex b/tex/context/base/xtag-pmu.tex
new file mode 100644
index 000000000..b913475f5
--- /dev/null
+++ b/tex/context/base/xtag-pmu.tex
@@ -0,0 +1,188 @@
+%D \module
+%D [ file=xtag-pmu,
+%D version=2001.06.10,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Units,
+%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 XML Macros / Units}
+
+%D Quick and dirty in||line units:
+%D
+%D \startbuffer
+%D <phys>
+%D <cn> 10 </cn>
+%D <cu> <Newton/> <Square/> <Meter/> <Per/> <Sec/> </cu>
+%D </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D A more \MATHML||like unit application:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <cn> 10 </cn>
+%D <csymbol> <Square/> <Meter/> <Per/> <Sec/> </csymbol>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D A bit more compact:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <cn> 10 </cn>
+%D <cu> <Square/> <Meter/> <Per/> <Sec/> </cu>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D A bit more complicated:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <apply> <divide/> <ci> a </ci> <cn> 10 </cn> </apply>
+%D <cu> <Square/> <Meter/> <Per/> <Sec/> </cu>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+%D
+%D An alternative (equivalent) for \type {</cu>}:
+%D
+%D \startbuffer
+%D <phys> <apply> <unit/>
+%D <cn> 10 </cn> <cunseq> <Square/> <Meter/> <Per/> <Sec/> </cunseq>
+%D </apply> </phys>
+%D \stopbuffer
+%D
+%D \typebuffer \processXMLbuffer
+
+\defineXMLsingular [unitmeaning] [label=] \doPMLunitmeaning
+
+\def\doPMLunitmeaning
+ {\expanded{\unitmeaning{\XMLop{label}}}}
+
+\startXMLmapping [mml]
+
+\remapXMLsequence [unit] [CPA] \doPMLuseq
+\remapXMLsingular [unit] [CPA] \doPMLunit % #2\empty
+\remapXMLsequence [cunseq] [CPA] \doPMLuseq % #2
+\remapXMLsequence [cu] [CPA] \doPMLuseq % #2
+
+\newif\ifPMLunit \PMLunittrue
+
+\def\doPMLuseq#1#2{\PMLunittrue\ignorespaces#2\unskip\PMLunitfalse}
+\def\doPMLunit#1#2\empty{\ignorespaces#2\unskip}
+
+\def\handlePMLunit#1{\ifPMLunit\ignorespaces#1\fi\ignorespaces}
+
+%D All unit commands are remapped in a similar way.
+
+\remapXMLsingular [Atto] [C] {\handlePMLunit\Atto}
+\remapXMLsingular [Femto] [C] {\handlePMLunit\Femto}
+\remapXMLsingular [Pico] [C] {\handlePMLunit\Pico}
+\remapXMLsingular [Nano] [C] {\handlePMLunit\Nano}
+\remapXMLsingular [Micro] [C] {\handlePMLunit\Micro}
+\remapXMLsingular [Milli] [C] {\handlePMLunit\Milli}
+\remapXMLsingular [Centi] [C] {\handlePMLunit\Centi}
+\remapXMLsingular [Deci] [C] {\handlePMLunit\Deci}
+\remapXMLsingular [Hecto] [C] {\handlePMLunit\Hecto}
+\remapXMLsingular [Kilo] [C] {\handlePMLunit\Kilo}
+\remapXMLsingular [Mega] [C] {\handlePMLunit\Mega}
+\remapXMLsingular [Giga] [C] {\handlePMLunit\Giga}
+\remapXMLsingular [Terra] [C] {\handlePMLunit\Terra}
+\remapXMLsingular [Peta] [C] {\handlePMLunit\Peta}
+\remapXMLsingular [Exa] [C] {\handlePMLunit\Exa}
+
+\remapXMLsingular [Times] [C] {\handlePMLunit\Times}
+\remapXMLsingular [Solidus] [C] {\handlePMLunit\Solidus}
+\remapXMLsingular [Per] [C] {\handlePMLunit\Per}
+\remapXMLsingular [OutOf] [C] {\handlePMLunit\OutOf}
+
+\remapXMLsingular [Linear] [C] {\handlePMLunit\Linear}
+\remapXMLsingular [Square] [C] {\handlePMLunit\Square}
+\remapXMLsingular [Cubic] [C] {\handlePMLunit\Cubic}
+
+\remapXMLsingular [Inverse] [C] {\handlePMLunit\Inverse}
+
+\remapXMLsingular [Degrees] [C] {\handlePMLunit\Degrees}
+\remapXMLsingular [Meter] [C] {\handlePMLunit\Meter}
+\remapXMLsingular [Liter] [C] {\handlePMLunit\Liter}
+\remapXMLsingular [Sec] [C] {\handlePMLunit\Sec}
+\remapXMLsingular [Year] [C] {\handlePMLunit\Year}
+\remapXMLsingular [Month] [C] {\handlePMLunit\Month}
+\remapXMLsingular [Week] [C] {\handlePMLunit\Week}
+\remapXMLsingular [Day] [C] {\handlePMLunit\Day}
+\remapXMLsingular [Hour] [C] {\handlePMLunit\Hour}
+\remapXMLsingular [Min] [C] {\handlePMLunit\Min}
+\remapXMLsingular [Second] [C] {\handlePMLunit\Sec}
+\remapXMLsingular [Rad] [C] {\handlePMLunit\Rad}
+\remapXMLsingular [Deg] [C] {\handlePMLunit\Deg}
+\remapXMLsingular [Hertz] [C] {\handlePMLunit\Hertz}
+\remapXMLsingular [RevPerSec] [C] {\handlePMLunit\RevPerSec}
+\remapXMLsingular [RevPerMin] [C] {\handlePMLunit\RevPerMin}
+\remapXMLsingular [Gram] [C] {\handlePMLunit\Gram}
+\remapXMLsingular [Atom] [C] {\handlePMLunit\Atom}
+\remapXMLsingular [Newton] [C] {\handlePMLunit\Newton}
+\remapXMLsingular [Pascal] [C] {\handlePMLunit\Pascal}
+\remapXMLsingular [Joule] [C] {\handlePMLunit\Joule}
+\remapXMLsingular [Watt] [C] {\handlePMLunit\Watt}
+\remapXMLsingular [Celsius] [C] {\handlePMLunit\Celsius}
+\remapXMLsingular [Kelvin] [C] {\handlePMLunit\Kelvin}
+\remapXMLsingular [Fahrenheit] [C] {\handlePMLunit\Fahrenheit}
+\remapXMLsingular [Mol] [C] {\handlePMLunit\Mol}
+\remapXMLsingular [Molair] [C] {\handlePMLunit\Molair}
+\remapXMLsingular [Equivalent] [C] {\handlePMLunit\Equivalent}
+\remapXMLsingular [Farad] [C] {\handlePMLunit\Farad}
+\remapXMLsingular [Ohm] [C] {\handlePMLunit\Ohm}
+\remapXMLsingular [Siemens] [C] {\handlePMLunit\Siemens}
+\remapXMLsingular [Ampere] [C] {\handlePMLunit\Ampere}
+\remapXMLsingular [Coulomb] [C] {\handlePMLunit\Coulomb}
+\remapXMLsingular [Volt] [C] {\handlePMLunit\Volt}
+\remapXMLsingular [eVolt] [C] {\handlePMLunit\eVolt}
+\remapXMLsingular [Tesla] [C] {\handlePMLunit\Tesla}
+\remapXMLsingular [VoltAC] [C] {\handlePMLunit\VoltAC}
+\remapXMLsingular [VoltDC] [C] {\handlePMLunit\VoltDC}
+\remapXMLsingular [Baud] [C] {\handlePMLunit\Baud}
+\remapXMLsingular [Bit] [C] {\handlePMLunit\Bit}
+\remapXMLsingular [Byte] [C] {\handlePMLunit\Byte}
+\remapXMLsingular [Bequerel] [C] {\handlePMLunit\Bequerel}
+\remapXMLsingular [Sievert] [C] {\handlePMLunit\Sievert}
+\remapXMLsingular [Candela] [C] {\handlePMLunit\Candela}
+\remapXMLsingular [Bell] [C] {\handlePMLunit\Bell}
+\remapXMLsingular [At] [C] {\handlePMLunit\At}
+\remapXMLsingular [Atm] [C] {\handlePMLunit\Atm}
+\remapXMLsingular [Bar] [C] {\handlePMLunit\Bar}
+\remapXMLsingular [EVolt] [C] {\handlePMLunit\EVolt}
+\remapXMLsingular [Foot] [C] {\handlePMLunit\Foot}
+\remapXMLsingular [Inch] [C] {\handlePMLunit\Inch}
+\remapXMLsingular [Cal] [C] {\handlePMLunit\Cal}
+\remapXMLsingular [Force] [C] {\handlePMLunit\Force}
+\remapXMLsingular [Lux] [C] {\handlePMLunit\Lux}
+\remapXMLsingular [Gray] [C] {\handlePMLunit\Gray}
+\remapXMLsingular [Weber] [C] {\handlePMLunit\Weber}
+\remapXMLsingular [Henry] [C] {\handlePMLunit\Henry}
+\remapXMLsingular [Sterant] [C] {\handlePMLunit\Sterant}
+\remapXMLsingular [Angstrom] [C] {\handlePMLunit\Angstrom}
+\remapXMLsingular [Gauss] [C] {\handlePMLunit\Gauss}
+
+\remapXMLsingular [Percent] [C] {\handlePMLunit\Percent}
+\remapXMLsingular [Promille] [C] {\handlePMLunit\Promille}
+\remapXMLsingular [Permille] [C] {\handlePMLunit\Permille}
+
+\remapXMLsingular [Unit] [C] {\handlePMLunit\Unit}
+\remapXMLsingular [NoUnit] [C] {\handlePMLunit\NoUnit}
+
+\stopXMLmapping
+
+\endinput
diff --git a/tex/context/base/xtag-pre.tex b/tex/context/base/xtag-pre.tex
new file mode 100644
index 000000000..94a213d94
--- /dev/null
+++ b/tex/context/base/xtag-pre.tex
@@ -0,0 +1,435 @@
+%D \module
+%D [ file=xtag-pre,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Predefined Things,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt XML Macros / Predefined}
+
+%D Here we predefine some escapes, processing instructions,
+%D entities and other handy things.
+
+\unprotect
+
+%D Let's get rid of ligatures:
+
+% \definefonthandling [default] [noligs]
+
+%D First we define the default error handler. When tracing is
+%D activated, the unknown element is showed verbatim.
+
+\defineXMLenvironment [\s!default] \defaultXMLelement \defaultXMLelement
+\defineXMLsingular [\s!default] \defaultXMLelement
+
+% \def\defaultXMLelement
+% {\iftraceXMLelements[\currentXMLfullidentifier]\fi}
+
+\def\defaultXMLelement
+ {\iftraceXMLelements{\infofont<\currentXMLfullidentifier>}\fi}
+
+%D We can use the default handler to implement automatic
+%D element hiding. Beware: this overloads the tracer.
+
+% \def\startXMLignore{\dododefineXMLignore \s!default}
+% \def\stopXMLignore {\dododefineXMLprocess\s!default}
+
+\newcount\xmlignoredepth
+
+\def\startXMLignore{\ifcase\xmlignoredepth\dododefineXMLignore\s!default\fi\advance\xmlignoredepth\plusone}
+\def\stopXMLignore {\advance\xmlignoredepth\minusone\ifcase\xmlignoredepth\dododefineXMLprocess\s!default\fi}
+
+%D The following entities need to be defined anyway. They
+%D may be overloaded later.
+
+% rest also \letter
+
+\defineXMLentities [amp] {\letterampersand} {\&}
+\defineXMLentities [gt] {\string>} {\mathematics{>}}
+\defineXMLentities [lt] {\string<} {\mathematics{<}}
+\defineXMLentities [quot] {\string"} {\mathematics{"}}
+\defineXMLentities [apos] {\string`} {\mathematics{'}}
+
+%D Of course we define:
+
+\defineXMLentities [tex] {tex} {\TeX}
+\defineXMLentities [context] {context} {\ConTeXt}
+\defineXMLentities [xml] {xml} {XML}
+\defineXMLentities [xsd] {xsd} {XSD}
+\defineXMLentities [html] {html} {HTML}
+
+%D The following entities are used for internal purposes and
+%D concern characters that are kind of problematic in \TEX\
+%D input.
+
+\defineXMLentities [tex-hash] {\letterhash} {\#}
+\defineXMLentities [tex-dollar] {\letterdollar} {\$}
+\defineXMLentities [tex-percent] {\letterpercent} {\%}
+\defineXMLentities [tex-backslash] {\letterbackslash} {\texescape}
+\defineXMLentities [tex-hat] {\letterhat} {\^{}}
+\defineXMLentities [tex-underscore] {\letterunderscore} {\_}
+\defineXMLentities [tex-leftbrace] {\letterleftbrace} {\leftargument}
+\defineXMLentities [tex-rightbrace] {\letterrightbrace} {\rightargument}
+\defineXMLentities [tex-bar] {\letterbar} {\vl}
+\defineXMLentities [tex-tilde] {\lettertilde} {\~{}}
+
+%D Some pretty printing macros will use color, for which we
+%D define a dedicated palet here.
+
+\definepalet
+ [xtag]
+ [0=darkgray, 1=darkred, 2=darkgreen,
+ 3=darkblue, 4=darkcyan, 5=darkmagenta,
+ 6=darkyellow, 7=black, 8=black]
+
+%D An example of its usage can be found in the pretty
+%D printing macros in the run time module.
+
+\newif\ifautoXMLshow \autoXMLshowtrue
+\newif\ifshowXMLarguments \showXMLargumentstrue
+
+\def\setupXMLfile{\dodoubleargument\getparameters[\??xf]}
+
+\setupXMLfile
+ [\c!inbetween=\blank,
+ \c!level=1]
+
+\fetchruntimecommand\showXMLfile {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLbuffer{\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLtext {\f!xtagprefix\s!run}
+
+\fetchruntimecommand\showXMLign {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLnop {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLtxt {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLpar {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLlin {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLwrd {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLemp {\f!xtagprefix\s!run}
+
+\fetchruntimecommand\showXMLbreak {\f!xtagprefix\s!run}
+
+%D By default, we will ignore escape commands, preceded by
+%D \type {<!} and ending in (presumably) a \type {>}.
+
+\defineXMLescape [\s!default] {\gobbleuntil{>}}
+
+%D The comment escape has the form:
+%D
+%D \starttyping
+%D <!-- a couple of remarks -->
+%D \stoptyping
+
+\defineXMLescape [--] {\gobbleuntil{-->}}
+
+%D The \type {CDATA} escape is kind of unique in its
+%D strange syntax.
+%D
+%D \starttyping
+%D <!CDATA[it starts here
+%D whatever you like to be shown verbatim
+%D and ends here]]>
+%D \stoptyping
+%D
+%D Watch this rather obscure definition (we need to pass an
+%D \type {[} to the macro.
+
+\chardef\XMLcdatamethod=1
+
+\newtoks \everyXMLcdata % \appendtoks \tt \to \everyXMLcdata
+
+\setvalue{XMLcdatamethod1}%
+ {\skipfirstverbatimlinefalse
+ \processtaggeddisplayverbatim{]]>}}
+
+\setvalue{XMLcdatamethod2}%
+ {\begingroup
+ \obeylines
+ \obeyspaces
+ \the\everyXMLcdata
+ \processXMLcdata}
+
+\long\def\processXMLcdata#1]]>%
+ {#1\endgroup}
+
+\defineXMLescape [CDATA]
+ {\executeifdefined{XMLcdatamethod\number\XMLcdatamethod}{\begingroup\processXMLcdata}}
+
+%D \starttyping
+%D <!ELEMENT ...">
+%D <!ATTLIST ...">
+%D \stoptyping
+
+\defineXMLescape [ATTLIST]{\gobbleuntil>}
+\defineXMLescape [ELEMENT]{\gobbleuntil>}
+
+%D \starttyping
+%D <!ENTITY crap "very new [&#x7B;] crap">
+%D <!ENTITY crap SYSTEM "crapfile.xml">
+%D <!ENTITY crap SYSTEM "crapfile.pdf" NDATA ignoredanyway>
+%D \stoptyping
+
+\defineXMLescape [ENTITY] \handleXMLentityescape
+
+\def\handleXMLentityescape#1>%
+ {\dohandleXMLentityescape#1 @ @ @ @ @ @>}
+
+\def\dohandleXMLentityescape#1 #2 #3 #4>
+ {\doifnot{#1}\letterpercent
+ {\doifelse{#2}{SYSTEM}
+ {\dohandleXMLentitySYSTEM#1 #2 #3 #4>}
+ {\dohandleXMLentityDEFINE#1 #2 #3 #4>}}}
+
+\def\dohandleXMLentitySYSTEM#1 #2 #3 #4 #5 #6>% name SYSTEM ....
+ {\doifelse{#4}{@}
+ {\expanded{\defineXMLentity[#1]{\noexpand\readXMLsystem{\unstringed#3}}}}
+ {\doif{#4}{NDATA} % maybe we should also store the NDATA
+ {\expanded{\defineXMLentity[#1]{\noexpand\readXMLndata{\unstringed#3}}}}}}
+
+\def\readXMLsystem#1%
+ {\readfile{#1}
+ {\writestatus{xml-system}{reading #1}}
+ {\writestatus{xml-system}{unable to locate #1}}}
+
+\def\readXMLndata#1%
+ {#1} % {\externalfigure[#1]}
+
+\def\dohandleXMLentityDEFINE#1 %#2 #3 #4 #5 #6>% name replacement
+ {\def\docommand##1>{\expanded{\defineXMLentity[#1]{\the\scratchtoks}}}%
+ \afterassignment\docommand\grabstring}
+
+%D Such entities can be encapsulated in a \type {DOCTYPE}
+%D element. Therefore we remove the outer level of document
+%D type definitions.
+%D
+%D \starttyping
+%D <!DOCTYPE Something>
+%D <!DOCTYPE Something >
+%D <!DOCTYPE Something [ ... ]>
+%D <!DOCTYPE Something SYSTEM "... ...">
+%D <!DOCTYPE Something SYSTEM "... ..." >
+%D <!DOCTYPE Something SYSTEM "... ..." [ ... ]>
+%D <!DOCTYPE Something PUBLIC "... ..." "...">
+%D <!DOCTYPE Something PUBLIC "... ..." "..." >
+%D <!DOCTYPE Something PUBLIC "... ..." "..." [ ... ]>
+%D \stoptyping
+
+\defineXMLescape [DOCTYPE] \handleXMLdoctype
+
+\def\handleXMLdoctype
+ {\let\XMLdoctype\empty
+ \dohandleXMLdoctype}
+
+\def\dohandleXMLdoctype
+ {\futurelet\nexttoken\dohandleXMLdoctok}
+
+\def\dohandleXMLdoctok
+ {\ifx\nexttoken>%
+ % [doctype: \XMLdoctype]
+ \@EA\gobbleuntil\@EA>%
+ \else\ifx\nexttoken\blankspace
+ % [doctype: \XMLdoctype]
+ \@EAEAEA\dodohandleXMLdoctype
+ \else
+ \@EAEAEA\redoXMLdoctype
+ \fi\fi}
+
+\def\redoXMLdoctype#1%
+ {\edef\XMLdoctype{\XMLdoctype#1}\dohandleXMLdoctype}
+
+\def\dodohandleXMLdoctype#1%
+ {\executeifdefined{XMLdoctype#1}{\gobbleuntil>}}
+
+\setvalue{XMLdoctype>}{}
+\setvalue{XMLdoctype[}{\processuntil{]>}} % or \gobbleuntil{]>}}
+
+\def\XMLdoctypeS YSTEM %
+ {\dowithgrabbedstring\dodohandleXMLdoctype}
+
+\def\XMLdoctypeP UBLIC %
+ {\dowithgrabbedstring{\dowithgrabbedstring\dodohandleXMLdoctype}}
+
+% wrong
+%
+% \def\XMLdoctypeS YSTEM {\XMLgrabstring}
+% \def\XMLdoctypeP UBLIC {\XMLgrabstring}
+%
+% \def\XMLgrabstring
+% {\doifnextcharelse>{\gobbleuntil>}{\dowithgrabbedstring\XMLgrabstring}}
+
+%D Some day we may need to support entities within a
+%D document type namespace.
+
+%D As an example of processing instructions, we implement a
+%D \CONTEXT\ code handler:
+
+\defineXMLprocessor [context] \contextXMLcommand
+\defineXMLprocessor [context-command] \contextXMLcommand
+
+% we need to get rid of the endlinechar inserted by \scantokens
+%
+% \def\saveendlinechar%
+% {\ifx\restoreendlinechar\undefined
+% \edef\restoreendlinechar{\endlinechar\the\endlinechar\space}%
+% \fi
+% \endlinechar=-1 }
+%
+% \def\scanXMLtokens#1%
+% {\saveendlinechar\scantokens{#1}\restoreendlinechar}
+
+%D For security reasons, we provide a switch to turn this
+%D mechanism on and off. When turned off, there is no way to
+%D turn it on from within an \XML\ encoded document, simply
+%D because the possibility to process \CONTEXT\ commands is
+%D gone.
+
+\setupXMLprocessing[\c!command=\v!yes]
+
+%\def\contextXMLcommand#1%
+% {\doif\@@xpcommando\v!ja
+% {\pushmacro\disableXML
+% \def\disableXML{\global\let\afterXMLprocessor\empty}%
+% \global\let\afterXMLprocessor\enableXML
+% \setnormalcatcodes\scantokens{#1}\afterXMLprocessor
+% \popmacro\disableXML}}
+
+\def\contextXMLcommand#1% we don't use #1 here
+ {\doif\@@xpcommand\v!yes
+ {\disableXML\scantokens\@EA{\currentXMLprocess}\enableXML}}
+
+%D The indirect method (using the macro \type
+%D {\currentXMLprocess} instead of \type {#}) is needed
+%D because of the \type {\scantokens}. Given the previous
+%D definition, and given that \ETEX\ is used, we can now
+%D say:
+%D
+%D \starttyping
+%D <?context-command {\bf Start Of Some \TeX\ Text} ?>
+%D \stoptyping
+%D
+%D A non||\ETEX\ solution is also possible, using buffers,
+%D but for the moment we assume that \ETEX\ is used.
+
+%D Next we implement a general purpose directive. This one
+%D can be used to set variables that can be accessed with
+%D \type {\XMLvar}.
+
+\defineXMLprocessor [context-directive] \contextXMLdirective
+
+\def\contextXMLdirective#1%
+ {\docontextXMLdirective#1 @ @ @\end}
+
+\def\docontextXMLdirective#1 #2 #3 #4\end % class variable value
+ {\expandafter\def\csname\@@XMLvariable:#1:#2\endcsname{#3}}
+
+%D A simple processing instruction is the following. It just
+%D writes a message to the screen.
+
+\defineXMLprocessor [context-message] {\writestatus{xml-message}}
+
+%D The following processing instruction permits you to tag
+%D parts of the file in such a way that you can filter data.
+%D We use this method when documenting schemas.
+
+\defineXMLprocessor [context-block] \handleXMLcontextblock
+
+\def\handleXMLcontextblock#1%
+ {\dohandleXMLcontextblock#1 \relax}
+
+\def\dohandleXMLcontextblock#1 #2 #3\relax
+ {\dodohandleXMLcontextblock{#1}{#2}}
+
+\let\dodohandleXMLcontextblock\gobbletwoarguments
+
+\def\hideXMLcontextblock[#1]%
+ {\def\dodohandleXMLcontextblock
+ {\dododohandleXMLcontextblock\doifinset{#1}}}
+
+\def\videXMLcontextblock[#1]%
+ {\def\dodohandleXMLcontextblock
+ {\dododohandleXMLcontextblock\doifnotinset{#1}}}
+
+\protect
+
+\def\dododohandleXMLcontextblock#1#2#3#4%
+ {\let\next\relax
+ \doifelse{#3}{begin}
+ {#1{#4}{#2}
+ {%\writestatus{xml-block}{skipping begin #4}%
+ \long\def\next##1?context-block end #4 ##2?>{}}}
+ {\doif{#3}{name}
+ {#1{#4}{#2}
+ {%\writestatus{xml-block}{skipping name #4}%
+ \long\def\next##1?context-block ##2?>{}}}}%
+ \next}
+
+\unprotect
+
+%D Say that a file contains blocks like the following:
+%D
+%D \starttyping
+%D <?context-block begin whatevername ?>
+%D
+%D <to/> <be> <or/> maybe <not/> so much <to/> </be>
+%D
+%D <?context-block end whatevername ?>
+%D \stoptyping
+%D
+%D The following commands will show only this block:
+%D
+%D \starttyping
+%D \videXMLcontextblock[whatevername] \showXMLfile{yourfile}
+%D \stoptyping
+%D
+%D You can also mark blocks in the following way, thereby
+%D saving yourself some work:
+%D
+%D \starttyping
+%D <?context-block what ?>
+%D
+%D <what>What do you want?</what>
+%D
+%D <?context-block how ?>
+%D
+%D <how>How do you want?</how>
+%D
+%D <?context-block done ?>
+%D \stoptyping
+
+% yet undocumented and experimental
+
+% \defineXMLprocessor [context-eof] {\endinput}
+
+% already defined in xtag-ini
+
+% \defineXMLsingular [begingroup] {\begingroup}
+% \defineXMLsingular [endgroup] {\endgroup}
+%
+% \defineXMLsingular [gobblespacetokens] {\gobblespacetokens}
+
+%D We automatically switch regimes (beware of nested files!):
+%D
+%D \starttyping
+%D \startXMLdata
+%D <?xml version='1.0' encoding='utf-8'?>
+%D ÀÁÂÃÄÅàáâãäåÆÇæç
+%D ÈÉÊËèéêëÌÍÎÏÞìíîïþ
+%D ÐðÑñÒÓÔÕÖòóôõöØø
+%D ÙÚÛÜùúûÝýÿß
+%D \stopXMLdata
+%D \stoptyping
+
+\defineXMLprocessor [xml] {\handleXMLbanner}
+
+\def\handleXMLbanner#1%
+ {\getXMLarguments{xml}{\s!encoding='' #1}%
+ \doifsomething{\XMLpar{xml}\s!encoding\empty}
+ {\doif\currentregime\s!default % style regimes will take precedence
+ {\enableregime[\XMLpar{xml}\s!encoding\empty]}\donothing}}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-prs.tex b/tex/context/base/xtag-prs.tex
new file mode 100644
index 000000000..02bdcf21c
--- /dev/null
+++ b/tex/context/base/xtag-prs.tex
@@ -0,0 +1,42 @@
+%D \module
+%D [ file=xtag-prs,
+%D version=2004.08.18,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Parsing,
+%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\analyzefunction#1%
+ {\expanded{\doanalyzefunction#1\relax\relax(#1)}\empty\relax\end}
+
+\def\doanalyzefunction#1#2(#3)#4\relax#5\end
+ {\ifx#4\empty
+ \let\functionname\empty
+ \else
+ \def\functionname{#1#2}%
+ \fi
+ \getfunctionargs#3,\empty,\empty,\empty,\empty,\empty,\empty,\empty,\empty\relax}
+
+\def\getfunctionargs#1,#2,#3,#4,#5,#6,#7,#8,#9\relax
+ {\edef\functionA{#1}\edef\functionB{#2}%
+ \edef\functionC{#3}\edef\functionD{#4}%
+ \edef\functionE{#5}\edef\functionF{#6}%
+ \edef\functionG{#7}\edef\functionH{#8}}
+
+% \analyzefunction{x} [\functionname][a:\functionA/b:\functionB/c:\functionC/d:\functionD] \endgraf
+% \analyzefunction{sin(x)} [\functionname][a:\functionA/b:\functionB/c:\functionC/d:\functionD] \endgraf
+% \analyzefunction{1pt,2pt,3pt,4pt} [\functionname][a:\functionA/b:\functionB/c:\functionC/d:\functionD] \endgraf
+% \analyzefunction{rect(1pt,2pt,3pt,4pt)} [\functionname][a:\functionA/b:\functionB/c:\functionC/d:\functionD] \endgraf
+% \analyzefunction{1pt,2pt,3pt,4pt,5pt,6pt,7pt,8pt} [\functionname][e:\functionE/f:\functionF/g:\functionG/h:\functionH] \endgraf
+% \analyzefunction{rect(1pt,2pt,3pt,4pt,5pt,6pt,7pt,8pt)} [\functionname][e:\functionE/f:\functionF/g:\functionG/h:\functionH] \endgraf
+
+% todo [#1][settings][maxwidth,maxheight,method=] with method=x y xy [1]
+
+\protect \endinput
diff --git a/tex/context/base/xtag-raw.tex b/tex/context/base/xtag-raw.tex
new file mode 100644
index 000000000..e6dfdea41
--- /dev/null
+++ b/tex/context/base/xtag-raw.tex
@@ -0,0 +1,37 @@
+%D \module
+%D [ file=xtag-raw,
+%D version=2002.03.21,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Raw Specials,
+%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 XML Macros / Raw Specials}
+
+%D Some day this module will be obsolete.
+
+\defineXMLentity [tex-hash] {\letterhash}
+\defineXMLentity [tex-dollar] {\letterdollar}
+\defineXMLentity [tex-percent] {\letterpercent}
+\defineXMLentity [tex-backslash] {\letterbackslash}
+\defineXMLentity [tex-hat] {\letterhat}
+\defineXMLentity [tex-underscore] {\letterunderscore}
+\defineXMLentity [tex-leftbrace] {\letterbgroup}
+\defineXMLentity [tex-rightbrace] {\letteregroup}
+\defineXMLentity [tex-bar] {\letterbar}
+\defineXMLentity [tex-tilde] {\lettertilde}
+
+\endinput
+
+\defineXMLsingular[test][oeps=,whow=,hm=]
+% {\tttf \input \XMLop{oeps} [\XMLop{whow}] [\XMLop{hm}]}
+ {\tttf \XMLop{oeps} [\XMLop{whow}] [\XMLop{hm}]}
+
+\startXMLdata
+<test oeps="oeps_tst.tmp" whow="#FFEEGG" hm="^{}~"/>
+\stopXMLdata
diff --git a/tex/context/base/xtag-rng.tex b/tex/context/base/xtag-rng.tex
new file mode 100644
index 000000000..254282424
--- /dev/null
+++ b/tex/context/base/xtag-rng.tex
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=xtag-rng,
+%D version=2002.10.29,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Relax NG,
+%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
+
+%D The following commands picks up a named block from the
+%D given file and pretty prints it.
+%D
+%D \starttyping
+%D \showRNGcomponent [eximple.rng] [request]
+%D \stoptyping
+%D
+%D If needed, you adapt the colors used by redefining the
+%D \type {xtag} color palet.
+
+\fetchruntimecommand\showRNGcomponent {\f!xtagprefix\s!run}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-run.tex b/tex/context/base/xtag-run.tex
new file mode 100644
index 000000000..9a4603731
--- /dev/null
+++ b/tex/context/base/xtag-run.tex
@@ -0,0 +1,319 @@
+%D \module
+%D [ file=xtag-run,
+%D version=2001.01.10,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Visualization,
+%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.
+
+% TODO: make this mkiv compliant, catcode tables etc
+
+\writestatus{loading}{ConTeXt XML Macros / Visualization}
+
+\unprotect
+
+\bgroup
+
+\catcode`\.=\@@escape
+.catcode`.B=.@@begingroup
+.catcode`.E=.@@endgroup
+.catcode`.#=.@@active
+.catcode`.$=.@@active
+.catcode`.%=.@@active
+.catcode`.\=.@@active
+.catcode`.^=.@@active
+.catcode`._=.@@active
+.catcode`.{=.@@active
+.catcode`.}=.@@active
+.catcode`.|=.@@active
+.catcode`.~=.@@active
+
+.gdef.verbatimXML
+ B.catcode`.#=.@@active .let#.letterhash
+ .catcode`.$=.@@active .let$.dollar
+ .catcode`.%=.@@active .let%.percent
+ .catcode`.\=.@@active .let\.letterbackslash
+ .catcode`.^=.@@active .let^.letterhat
+ .catcode`._=.@@active .let_.letterunderscore
+ .catcode`.{=.@@active .let{.leftargument
+ .catcode`.}=.@@active .let}.rightargument
+ .catcode`.|=.@@active .let|.letterbar
+ .catcode`.~=.@@active .let~.lettertilde
+ E
+
+.egroup
+
+\gdef\@@XMLshow{\@@XML shw}
+
+\gdef\@XMLindent#1%
+ {\ifnum\XMLlevel>\plusone\advance\leftskip#11em\relax\fi}
+
+\gdef\@XMLlevel#1%
+ {\advance\XMLlevel#11\relax}
+
+\unexpanded\gdef\@XMLentity#1%
+ {\noindent\hbox{\localcolortrue\color[xtag:0]{\string&#1;}}}
+
+\bgroup
+
+\@EA\catcode\string`=\@@active
+\@EA\catcode\string`"\@@active
+\@EA\catcode\string``\@@active
+\@EA\catcode\string`&\@@active
+
+\gdef\doshowXMLargument#1#2#3#4%
+ {\hskip\zeropoint % or maybe \allowbreak
+ \string#1\color[xtag:#3]{#4}\string#2}%
+
+\gdef\showXMLarguments
+ {\hskip\zeropoint % or maybe \allowbreak
+ \ifshowXMLarguments
+ \bgroup
+ \@EA\catcode\string`=\@@active
+ \@EA\catcode\string`"\@@active
+ \@EA\catcode\string``\@@active
+ \@EA\catcode\string`&\@@active
+ \def={\color[xtag:7]{\string=}}%
+ \def"##1"{\doshowXMLargument""8{##1}}%
+ \def`##1`{\doshowXMLargument``8{##1}}%
+ \def&##1;{\doshowXMLargument&;7{##1}}%
+ \scantokens\@EA{\currentXMLarguments}%
+ \egroup
+ \else
+ \currentXMLarguments
+ \fi}
+
+\egroup
+
+\ifx\XMLprettycycle\undefined \gdef\XMLprettycycle{3} \fi
+
+\doglobal\newcounter\@XMLnofelements
+\doglobal\newif\ifXMLunspacepretty
+
+\gdef\@XMLelement#1%
+ {\ifnum\XMLlevel<\@@xflevel\relax
+ \ifnum\kindofXMLelement=2\else
+ \doglobal\increment\@XMLnofelements\relax
+ \ifcase\@XMLnofelements\else\@@xfinbetween\fi
+ \fi
+ \fi
+ % no, too fragile:
+% \ifnum\XMLlevel>1\hangindent2em\fi
+ \ifcase\kindofXMLelement\or\or
+ \getvalue{\@@XMLshow::\currentXMLelement}\relax
+ \fi
+ \dontleavehmode % \indent
+ \bgroup
+ % \localcolortrue
+ \advance\XMLlevel \minusone
+ \DoMod\XMLlevel by\XMLprettycycle to\scratchcounter
+ \advance\scratchcounter \plusone
+ \startcolor[xtag:\ifnum\scratchcounter<0 0\else\number\scratchcounter\fi]%
+ \ifXMLunspacepretty\unskip\fi
+ \string<%
+ \ifnum\kindofXMLelement=2\string/\fi
+ \currentXMLelement
+ \stopcolor
+ \ifcase#1\or
+ \cleanupXMLarguments % get rid of spurious end space and end /
+ \ifx\currentXMLarguments\empty\else
+ \setbox\scratchbox\hbox{\space}\hskip\wd\scratchbox % hm, slow
+ \startcolor[xtag:0]\showXMLarguments\unskip\stopcolor\unskip
+ \fi
+ \fi
+ \startcolor[xtag:\ifnum\scratchcounter<0 0\else\number\scratchcounter\fi]%
+ \ifnum\kindofXMLelement=3\string/\fi
+ \string>%
+ \stopcolor
+ \egroup
+ \ifcase\kindofXMLelement\or
+ \getvalue{\@@XMLshow::\currentXMLelement}\relax
+ \fi
+ \ifnum\XMLlevel<\@@xflevel\relax
+ \ifnum\kindofXMLelement=1\else
+ \doglobal\increment\@XMLnofelements\relax
+ \ifcase\@XMLnofelements\else\@@xfinbetween\fi
+ \fi
+ \fi
+ \ifXMLunspacepretty\ignorespaces\fi}
+
+\gdef\nextXMLtext{\blank\@XMLlevel+\@XMLelement1\par}
+\gdef\prevXMLtext{\par\@XMLelement0\par\@XMLlevel-\blank}
+\gdef\nextXMLpara{\nextXMLline\par}
+\gdef\prevXMLpara{\par\prevXMLline}
+\gdef\nextXMLline{\par\@XMLlevel+\@XMLindent+\@XMLelement1}
+\gdef\prevXMLline{\@XMLelement0\par\@XMLindent-\@XMLlevel-}
+\gdef\nextXMLword{\@XMLlevel+\@XMLelement1}
+\gdef\prevXMLword{\@XMLelement0\@XMLlevel-}
+
+\gdef\someXMLtext{\blank\@XMLlevel+\@XMLelement1\@XMLlevel-\blank}
+\gdef\someXMLpara{\someXMLline}
+\gdef\someXMLline{\par\@XMLlevel+\@XMLindent+\@XMLelement1\par\@XMLindent-\@XMLlevel-}
+\gdef\someXMLword{\@XMLlevel+\@XMLelement1\@XMLlevel-}
+
+\gdef\@XMLindent#1%
+ {\ifnum\XMLlevel>\zerocount
+ \advance\leftskip#11em\relax
+ \fi}
+
+\gdef\nextXMLtext{\blank\@XMLlevel+\@XMLelement1\par\@XMLindent+}
+\gdef\prevXMLtext{\par\@XMLindent-\@XMLelement0\par\@XMLlevel-\blank}
+\gdef\nextXMLpara{\nextXMLline\par\@XMLindent+}
+\gdef\prevXMLpara{\par\@XMLindent-\prevXMLline}
+\gdef\nextXMLline{\par\@XMLlevel+\@XMLelement1}
+\gdef\prevXMLline{\@XMLelement0\par\@XMLlevel-}
+
+\gdef\someXMLline{\par\@XMLlevel+\@XMLelement1\par\@XMLlevel-}
+
+\gdef\setXMLshow#1#2#3[#4]%
+ {\def\docommand##1{#1[##1]#2#3\letvalue{\@@XMLshow:##1}\empty}%
+ \processcommalist[#4]\docommand}
+
+\gdef\showXMLign[#1]%
+ {\setXMLshow\defineXMLignore \relax\relax[#1]%
+ \setXMLshow\defineXMLsingular \relax\relax[#1]}
+
+\gdef\showXMLnop[#1]%
+ {\setXMLshow\defineXMLenvironment\relax\relax[#1]%
+ \setXMLshow\defineXMLsingular \relax\relax[#1]}
+
+\gdef\showXMLtxt[#1]%
+ {\setXMLshow\defineXMLenvironment\nextXMLtext\prevXMLtext[#1]%
+ \setXMLshow\defineXMLsingular \someXMLtext\relax [#1]}
+
+\gdef\showXMLpar[#1]%
+ {\setXMLshow\defineXMLenvironment\nextXMLpara\prevXMLpara[#1]%
+ \setXMLshow\defineXMLsingular \someXMLline\relax [#1]}
+
+\gdef\showXMLlin[#1]%
+ {\setXMLshow\defineXMLenvironment\nextXMLline\prevXMLline[#1]%
+ \setXMLshow\defineXMLsingular \someXMLword\relax [#1]}
+
+\gdef\showXMLwrd[#1]%
+ {\setXMLshow\defineXMLenvironment\nextXMLword\prevXMLword[#1]%
+ \setXMLshow\defineXMLsingular \someXMLword\relax [#1]}
+
+\gdef\showXMLemp[#1]%
+ {\setXMLshow\defineXMLsingular\someXMLword\relax[#1]}
+
+\gdef\showXMLbreak[#1]%
+ {\def\docommand##1{\setvalue{\@@XMLshow::##1}{\hskip\zeropoint}}%
+ \processcommalist[#1]\docommand}
+
+\gdef\doautoshowXMLelement
+ {\ifcase\kindofXMLelement
+ \or \nextXMLpara \or \prevXMLpara \or \someXMLline
+ \fi}
+
+\gdef\autoshowXMLelement
+ {\ifcsname\@@XMLshow:\currentXMLelement\endcsname
+ \expandafter\normalexecuteXMLelement
+ \else
+ \expandafter\doautoshowXMLelement
+ \fi}
+
+\global\let\normalexecuteXMLelement\executeXMLelement
+
+\gdef\showXMLfile#1%
+ {\bgroup
+ % temp hack, will be the normal definition
+ \long\def\docleanupXMLarguments##1/ ##2\relax{\def\currentXMLarguments{##1}}%
+ % so far for hack
+ \nohyphens
+ \dontcomplain
+ \XMLlevel\zerocount
+ \increment\@@xflevel % hack
+ \tttf
+ \startpacked[\v!blank]
+ \ifautoXMLshow \let\executeXMLelement\autoshowXMLelement \fi
+ \let\executeXMLentity\@XMLentity
+ \enableXML\verbatimXML
+ \enableregime[utf]%
+ \chardef\utfunicodetracer8
+ \veryraggedright
+ \readfile{\truefilename{#1}}\donothing\donothing\endgraf
+ \removelastskip % really needed
+ \stoppacked
+ \egroup}
+
+\gdef\showXMLtext#1%
+ {\bgroup
+ % temp hack, will be the normal definition
+ \long\def\docleanupXMLarguments##1/ ##2\relax{\def\currentXMLarguments{##1}}%
+ % so far for hack
+ \dontcomplain
+ \XMLlevel\maxcard
+ \increment\@@xflevel % hack
+ \tttf
+ \ifautoXMLshow \let\executeXMLelement\autoshowXMLelement \fi
+ \let\executeXMLentity\@XMLentity
+ \let\par\allowbreak\let\endgraf\par
+ \setbox\scratchbox\hbox
+ {\enableXML\verbatimXML\scantokens{#1}\removelastskip}%
+ \unhbox\scratchbox
+ \egroup}
+
+\gdef\showXMLbuffer
+ {\dosingleempty\doshowXMLbuffer}
+
+\gdef\doshowXMLbuffer[#1]%
+ {\doifelsenothing{#1}
+ {\doshowXMLbuffer[\jobname]}
+ {\bgroup
+ \def\dodoprocessXMLbuffer##1{\showXMLfile{\TEXbufferfile{##1}}}%
+ \processcommalist[#1]\dodoprocessXMLbuffer
+ \egroup}}
+
+%D
+
+\gdef\showXSDcomponent
+ {\dodoubleargument\doshowXSDcomponent}
+
+\gdef\doshowXSDcomponent[#1][#2]%
+ {\bgroup
+ \showXMLnop[xsd:schema]
+ \showXMLign[xsd:appInfo]
+ \showXMLign[xsd:annotation]
+ \videXMLcontextblock[#2]
+ \showXMLfile{#1}
+ \egroup}
+
+\gdef\showRNGcomponent
+ {\dodoubleargument\doshowRNGcomponent}
+
+\gdef\doshowRNGcomponent[#1][#2]%
+ {\bgroup
+ \videXMLcontextblock[#2]
+ \showXMLfile{#1}
+ \egroup}
+
+%D
+
+\gdef\tracebackXMLattribute#1%
+ {\bgroup
+ \doloop
+ {\ifcsname\@@XMLdepth:\recurselevel\endcsname
+ \edef\!!stringa{\csname\@@XMLdepth:\recurselevel\endcsname}%
+ \writestatus
+ {XML TRACE}
+ {[#1] [\recurselevel] [\!!stringa] [\XMLinh{#1}]}%
+ \else
+ \exitloop
+ \fi}%
+ \egroup}
+
+\gdef\showXMLinh[#1]%
+ {\doifsomething{#1}
+ {\bgroup\infofont[%
+ \dorecurse\XMLdepth
+% {\csname\@@XMLvariable:\csname\@@XMLdepth:\recurselevel\endcsname:#1\endcsname
+ {\csname\@@XMLvariable:\recurselevel:#1\endcsname
+ \ifnum\recurselevel<\XMLdepth->\fi}%
+ ]\egroup}}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-stk.tex b/tex/context/base/xtag-stk.tex
new file mode 100644
index 000000000..e126ae5c7
--- /dev/null
+++ b/tex/context/base/xtag-stk.tex
@@ -0,0 +1,230 @@
+%D \module
+%D [ file=xtag-exp,
+%D version=2006.01.19,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=Stacking Data,
+%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 XML Macros / Stacks}
+
+%D This module is experimental. Don't use it (yet). It needs a
+%D clean-up. The stack handler is used in the third MathML renderer.
+
+\unprotect
+
+\ifx\XMLRtoks \undefined \newtoks \XMLRtoks \fi
+\ifx\XMLstacklevel\undefined \newcount\XMLstacklevel \fi
+
+\def\@@xmlstack{xmlstack}
+
+\let\XMLstackid\empty
+
+\def\resetXMLelements
+ {\XMLstacklevel\zerocount}
+
+\def\startsavingXMLelements % maybe something with \ignorespaces \\removeunwantedspaces
+ {\XMLstacklevel\zerocount
+ \let\normalexecuteXMLelement\executeXMLelement
+ \def\executeXMLelement{\csname\@@XMLelement:\@@xmlstack\ifcase\kindofXMLelement\or\or\or/\fi\endcsname}}
+
+\def\stopsavingXMLelements
+ {\let\executeXMLelement\normalexecuteXMLelement}
+
+\defineXMLnestedenvironmentsave
+ [\@@xmlstack]
+ {}
+ {\pushXMLdataonstack}
+
+\startXMLmapping[xmlstack:test]
+
+ \defineXMLnestedenvironmentsave
+ [\@@xmlstack]
+ {}
+ {\pushXMLnameonstack}
+
+ % in mathml handler:
+ %
+ % \defineXMLnested
+ % [apply]
+ % {\startsavingXMLelements}
+ % {\stopsavingXMLelements}
+
+\stopXMLmapping
+
+\def\pushXMLdataonstack
+ {\advance\XMLstacklevel\plusone
+ \letvalue {\@@xmlstack:n:\XMLstackid:\number\XMLstacklevel}\currentXMLelement
+ \saveXMLdata {\@@xmlstack:t:\XMLstackid:\number\XMLstacklevel} \@@xmlstack
+ \saveXMLdatainelement{\@@xmlstack:d:\XMLstackid:\number\XMLstacklevel}\currentXMLelement\@@xmlstack}
+
+\def\pushXMLnameonstack
+ {\advance\XMLstacklevel\plusone
+ \letvalue {\@@xmlstack:n:\XMLstackid:\number\XMLstacklevel}\currentXMLelement}
+
+\def\eraseXMLdataonstack#1%
+ {\letvalue{\@@xmlstack:n:\XMLstackid:\number#1}\empty
+ \XMLerase{\@@xmlstack:t:\XMLstackid:\number#1}%
+ \XMLerase{\@@xmlstack:d:\XMLstackid:\number#1}}
+
+\def\getXMLstackdata{\getXMLstackiddata\XMLstackid}
+\def\getXMLstackname{\getXMLstackidname\XMLstackid}
+\def\getXMLstacktext{\getXMLstackidtext\XMLstackid}
+
+\def\getXMLstackiddata#1#2{\flushXMLelement{\@@xmlstack:d:#1:\ifnum#2>\XMLstacklevel\else\number#2\fi}}
+\def\getXMLstackidname#1#2{\getvalue {\@@xmlstack:n:#1:\ifnum#2>\XMLstacklevel\else\number#2\fi}}
+\def\getXMLstackidtext#1#2{\flushXMLelement{\@@xmlstack:t:#1:\ifnum#2>\XMLstacklevel\else\number#2\fi}}
+
+\def\rawXMLstackdata{\rawXMLstackiddata\XMLstackid}
+\def\rawXMLstackname{\rawXMLstackidname\XMLstackid}
+\def\rawXMLstacktext{\rawXMLstackidtext\XMLstackid}
+
+\def\rawXMLstackiddata#1#2{\flushXMLelement{\@@xmlstack:d:#1:\number#2}}
+\def\rawXMLstackidname#1#2{\getvalue {\@@xmlstack:n:#1:\number#2}}
+\def\rawXMLstackidtext#1#2{\flushXMLelement{\@@xmlstack:t:#1:\number#2}}
+
+\def\defXMLstackiddata#1#2#3%
+ {\defXMLelement#1{\@@xmlstack:d:#2:\ifnum#3>\XMLstacklevel\else\number#3\fi}}
+
+\def\defXMLstackdata#1% #2
+ {\defXMLstackiddata#1\XMLstackid}
+
+\def\showXMLstacknames
+ {\hbox{[\space\dorecurse\XMLstacklevel{\recurselevel:\getXMLstackname\recurselevel\space}]}}
+
+\def\flushXMLstackfrom#1%
+ {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {\getXMLstackdata\recurselevel}}
+
+\def\flushXMLstackwith#1#2%
+ {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {\relax\ifnum\recurselevel>#1\relax#2\fi
+ \getXMLstackdata\recurselevel}}
+
+\def\flushXMLnamedstackwith#1#2#3%
+ {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#2}}
+ {\ifnum\recurselevel>#1\relax#3\fi
+ \getXMLstackdata\recurselevel}}}
+
+\def\countXMLnamedstack#1% todo: \nofXMLchildren ! ! ! ! !
+ {\scratchcounter\zerocount
+ \dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#1}}
+ {\advance\scratchcounter\plusone}}}
+
+\def\collectXMLstack#1%
+ {\XMLRtoks\emptytoks
+ \dorecurse\XMLstacklevel
+ {\ifnum\recurselevel>\plusone\appendtoks#1\to\XMLRtoks\fi
+ \expandafter\appendtoks\expandafter\getXMLstackdata\expandafter{\recurselevel}\to\XMLRtoks}}
+
+\def\collectXMLstackrows#1#2%
+ {\XMLRtoks\emptytoks
+ \dostepwiserecurse{#1}\XMLstacklevel\plusone
+ {\ifnum\recurselevel>#1\appendtoks#2\to\XMLRtoks\fi
+ \expandafter\appendtoks\expandafter\getXMLstackdata\expandafter{\recurselevel}\to\XMLRtoks}}
+
+\def\collectXMLnamedstack#1#2%
+ {\XMLRtoks\emptytoks
+ \dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#1}}
+ {\ifnum\recurselevel>\plusone\appendtoks#2\to\XMLRtoks\fi
+ \expandafter\appendtoks\expandafter\getXMLstackdata\expandafter{\recurselevel}\to\XMLRtoks}}}
+
+\def\collectXMLnamedstacknamed#1#2#3% names, inbetween, nestednames (maddness, this macro)
+ {\XMLRtoks\emptytoks
+ \!!doneafalse
+ \let\globalascii\empty
+ \dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#1}}
+ {\begingroup
+ \startsavingXMLelements
+ \rawXMLstacktext\recurselevel % still on stack, raw does not test
+ \stopsavingXMLelements
+ \let\globalascii\empty
+ \dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#2}}
+ {\xdef\globalascii{\getXMLstackdata\recurselevel}}}%
+ \endgroup
+ \ifx\globalascii\empty\else
+ \if!!donea\appendtoks#3\to\XMLRtoks\fi
+ \expandafter\appendtoks\globalascii\to\XMLRtoks
+ \!!doneatrue
+ \fi}}}
+
+\def\XMLcopydata#1#2% to from
+ {\@EA\let\csname\@@XMLdata:#1\@EA\endcsname\csname\@@XMLdata:#2\endcsname}
+\def\XMLcopysave#1#2% to from
+ {\@EA\let\csname\@@XMLsave:#1\@EA\endcsname\csname\@@XMLsave:#2\endcsname}
+
+\def\removeXMLdatafromstack#1%
+ {\dorecurse\XMLstacklevel
+ {\doif{\getXMLstackname\recurselevel}{#1}
+ {\dostepwiserecurse\recurselevel{\numexpr\XMLstacklevel+\minusone}\plusone
+ {\scratchcounter\numexpr\recurselevel+\plusone\relax
+ \@EA\let\csname\@@xmlstack:n:\XMLstackid:\recurselevel\@EA\endcsname\csname\@@xmlstack:n:\XMLstackid:\number\scratchcounter\endcsname
+ \XMLcopysave{\@@xmlstack:t:\XMLstackid:\recurselevel}{\@@xmlstack:t:\XMLstackid:\number\scratchcounter}%
+ \XMLcopysave{\@@xmlstack:d:\XMLstackid:\recurselevel}{\@@xmlstack:d:\XMLstackid:\number\scratchcounter}}%
+ \advance\XMLstacklevel\minusone
+ \exitloop}}}
+
+%D BEWARE: these names may change (get stack in the name)
+
+\def\XMLallnamed#1%
+ {\dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#1}}
+ {\getXMLstackdata\recurselevel}}}
+
+\def\defXMLfirstnamed#1#2% \cs list
+ {\dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#2}}
+ {\defXMLstackdata#1\recurselevel\exitloop}}}
+
+\def\defXMLfirstnamedtext#1#2% \cs list
+ {\dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#2}}
+ {\edef#1{\getXMLstacktext\recurselevel}\exitloop}}}
+
+\def\XMLfirstnamed#1%
+ {\dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#1}}
+ {\getXMLstackdata\recurselevel\exitloop}}}
+
+\def\XMLnotnamed#1%
+ {\dorecurse\XMLstacklevel
+ {\expanded{\doifnotinset{\getXMLstackname\recurselevel}{#1}}
+ {\getXMLstackdata\recurselevel\exitloop}}}
+
+\let\XMLstackposition\!!zerocount
+
+\def\XMLdoifonstackelse#1% was \XMLdoifelsefound
+ {\!!doneafalse
+ \let\XMLstackposition\!!zerocount
+ \dorecurse\XMLstacklevel
+ {\expanded{\doifinset{\getXMLstackname\recurselevel}{#1}}
+ {\let\XMLstackposition\recurselevel\!!doneatrue\exitloop}}%
+ \if!!donea
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+%D Handy:
+
+\def\pushXMLmeaning#1% or [#1]
+ {\@EA\pushmacro\csname\@@XMLelement:#1/\endcsname
+ \@EA\pushmacro\csname\@@XMLelement:#1\endcsname
+ \@EA\pushmacro\csname\@@XMLelement:/#1\endcsname}
+
+\def\popXMLmeaning#1% or [#1]
+ {\@EA\popmacro\csname\@@XMLelement:#1/\endcsname
+ \@EA\popmacro\csname\@@XMLelement:#1\endcsname
+ \@EA\popmacro\csname\@@XMLelement:/#1\endcsname}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-utf.tex b/tex/context/base/xtag-utf.tex
new file mode 100644
index 000000000..fec84d279
--- /dev/null
+++ b/tex/context/base/xtag-utf.tex
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=xtag-utf,
+%D version=2002.06.24,
+%D title=\CONTEXT\ XML Macros,
+%D subtitle=UTF,
+%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 XML Macros / UTF}
+
+%D This filter is kind of obsolete, since \UTF\ is not
+%D limited to \XML. So, here we only enable \UTF\ support.
+
+\chardef\XMLtokensreduction\plustwo \enableregime[utf]
+
+\endinput
diff --git a/tex/context/base/xtag-xsd.tex b/tex/context/base/xtag-xsd.tex
new file mode 100644
index 000000000..96169afa2
--- /dev/null
+++ b/tex/context/base/xtag-xsd.tex
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=xtag-xsd,
+%D version=2001.10.04,
+%D title=\CONTEXT\ XML Support,
+%D subtitle=Schemas,
+%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
+
+%D The following commands picks up a named block from the
+%D given file and pretty prints it.
+%D
+%D \starttyping
+%D \showXSDcomponent [x-exa-tx.xsd] [sequence]
+%D \stoptyping
+%D
+%D If needed, you adapt the colors used by redefining the
+%D \type {xtag} color palet.
+
+\fetchruntimecommand\showXSDcomponent {\f!xtagprefix\s!run}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-xsl.tex b/tex/context/base/xtag-xsl.tex
new file mode 100644
index 000000000..3ad096c28
--- /dev/null
+++ b/tex/context/base/xtag-xsl.tex
@@ -0,0 +1,224 @@
+%D \module
+%D [ file=xtag-xsl,
+%D version=2002.03.07,
+%D title=\CONTEXT\ XML Support,
+%D subtitle=XSLT processing,
+%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.
+
+% FOR THIS TO WORK YOU NEED A PROPER cp8bit VECTOR
+%
+% 8 bit support has been messed up in a couple of distributions
+%
+% 0x00 0x00
+% 0x01 0x01
+% 0x02 0x02
+% etc
+
+%D This module is rather experimental so users may expect
+%D changes in the interface.
+
+\unprotect
+
+\definesystemvariable {xl}
+
+\newif\iftraceXSLTprocessing % \traceXSLTprocessingtrue
+
+\def\XSLTscriptfile{\bufferprefix xlscript}
+
+% to be sped up:
+
+\def\presetXSLTcharacters
+ {\let\par\empty
+ \def\{{\rawcharacter{`\{}}% \string^^..
+ \def\}{\rawcharacter{`\}}}% \string^^..
+ \def\\{\rawcharacter{`\\}}}% \string^^..
+
+\def\obeyXSLTcharacters
+ {\setnaturalcatcodes
+ \catcode`\\=\@@escape}
+
+\long\def\startXSLTscript #1 #2 %
+ {\bgroup
+ \obeyXSLTcharacters
+ \doifelse{#2}{capsule}\dostartXSLTscript\nostartXSLTscript#1 #2 }
+
+\long\def\dostartXSLTscript#1 #2 #3 %
+ {\obeylines
+ \dodostartXSLTscript#1 #2 #3 }
+
+\long\def\dodostartXSLTscript#1 #2 #3 #4\stopXSLTscript
+ {\egroup
+ \long\setvalue{\??xl#1}{\doXSLTscript{#3}{#4}}}
+
+\long\def\nostartXSLTscript
+ {\obeylines
+ \nonostartXSLTscript}
+
+\long\def\nonostartXSLTscript#1 #2\stopXSLTscript
+ {\egroup
+ \long\setvalue{\??xl#1}{\doXSLTscript\empty{#2}}}
+
+\long\def\donormalXSLTscript#1#2%
+ {\includeXSLTscript{b-capsule-#1}%
+ #2%
+ \includeXSLTscript{e-capsule-#1}}
+
+\def\includeXSLTscript#1%
+ {\csname\ifcsname\??xl#1\endcsname\??xl#1\else\s!empty\fi\endcsname}
+
+\startXSLTscript b-capsule-1.0
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+\stopXSLTscript
+
+\startXSLTscript e-capsule-1.0
+</xsl:stylesheet>
+\stopXSLTscript
+
+\def\applyXSLTscript
+ {\dotripleempty\doapplyXSLTscript}
+
+\long\def\doapplyXSLTscript[#1][#2][#3]%
+ {\ifthirdargument
+ \bgroup
+ \let\doXSLTscript\donormalXSLTscript
+ \presetXSLTcharacters
+ \donefalse
+ \def\docommand##1{\dodoapplyXSLTscript{##1}{\ifdone#3\else#2\fi}{#3}\donetrue}%
+ \processcommalist[#1]\docommand
+ \egroup
+ \else
+ \applyXSLTscript[#1][#2][#2]%
+ \fi}
+
+% Since a \XML\ file is loaded into memory as a tree, we
+% can safely use the same input and output filename, thereby
+% avoiding temporary files.
+
+\def\dodoapplyXSLTscript#1#2#3%
+ {\bgroup
+ \doifundefined{\??xl#1}%
+ {\writestatus{XSLT}{unknown script #1}}
+ {\writestatus{XSLT}{convert #2 into #3 using #1}%
+ \edef\par{\outputnewlinechar}%
+ \edef\!!stringc{\getvalue{\??xl#1}}%
+ \immediate\openout\scratchwrite=\XSLTscriptfile.xsl
+ \immediate\write\scratchwrite{\!!stringc}%
+ \immediate\closeout\scratchwrite
+ \iftraceXSLTprocessing\wait\fi
+ \executeXSLT{\XSLTscriptfile.xsl}{#2}{#3}%
+ \iftraceXSLTprocessing\wait\fi}%
+ \egroup}
+
+\def\executeXSLT#1#2#3% script input output
+ {\executesystemcommand{xsltproc -o #3 #1 #2}}
+
+\long\def\applyXSLTtobuffer
+ {\dodoubleempty\doapplyXSLTtobuffer}
+
+\long\def\doapplyXSLTtobuffer[#1][#2]%
+ {\expanded{\applyXSLTscript[#1][\TEXbufferfile{\ifsecondargument#2\else\jobname\fi}]}}
+
+\def\resetXSLTscripting#1%
+ {\setgvalue{\??xl\s!dummy}{\doXSLTscript{#1}{}}}
+
+\resetXSLTscripting{1.0}
+
+\def\startXSLTscripting
+ {\bgroup
+ \obeyXSLTcharacters
+ \obeylines
+ \dostartXSLTscripting}
+
+\long\def\dostartXSLTscripting#1\stopXSLTscripting
+ {\egroup
+ \let\doXSLTscript\doextendXSLTscript
+ \getvalue{\??xl\s!dummy}{#1}}
+
+\long\def\doextendXSLTscript#1#2#3%
+ {\setgvalue{\??xl\s!dummy}{\doXSLTscript{#1}{#2#3}}}
+
+\def\applyXSLTscripting
+ {\applyXSLTscript[\s!dummy]}
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+% \def\Whow{Whow It Works}
+%
+% \startXSLTscript test capsule 1.0
+% <xsl:output method="text"/>
+%
+% <xsl:template match="/figurelibrary/figure">
+% \Whow \\ #<xsl:apply-templates/>
+% </xsl:template>
+%
+% <xsl:template match="/">
+% <xsl:apply-templates/>
+% </xsl:template>
+% \stopXSLTscript
+%
+% \applyXSLTscript [test] [figtest.xml] [crap.tmp] \typefile{crap.tmp}
+%
+% \startbuffer
+% <hello>world</hello>
+% \stopbuffer
+%
+% \applyXSLTtobuffer[test] \typebuffer
+%
+% \startXSLTscripting
+% <xsl:output method="text"/>
+% \stopXSLTscripting
+%
+% \startXSLTscripting
+% <xsl:template match="/figurelibrary/figure">
+% <xsl:apply-templates/>
+% </xsl:template>
+% \stopXSLTscripting
+%
+% \startXSLTscripting
+% <xsl:template match="/">
+% <xsl:apply-templates/>
+% </xsl:template>
+% \stopXSLTscripting
+%
+% \applyXSLTscripting [figtest.xml] [crap.tmp] \typefile{crap.tmp}
+
+\starttext
+
+\startXSLTscript another
+<?xml version="1.0"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:cd="http://www.pragma-ade.com/commands"
+ version="1.0">
+
+<xsl:output method="text"/>
+
+<xsl:template match="/">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="cd:interface">
+ <xsl:apply-templates><xsl:sort order="descending" select="@name"/></xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="cd:command">
+ name: <xsl:value-of select="@name"/>\\par
+</xsl:template>
+
+</xsl:stylesheet>
+\stopXSLTscript
+
+\applyXSLTscript [another] [cont-en.xml] [whatever.tmp]
+
+\readfile{whatever.tmp}{}{}
+
+\stoptext
diff --git a/tex/context/bib/bibl-ams.tex b/tex/context/bib/bibl-ams.tex
new file mode 100644
index 000000000..37bcf253f
--- /dev/null
+++ b/tex/context/bib/bibl-ams.tex
@@ -0,0 +1,437 @@
+%D \module
+%D [ file=bibl-ams,
+%D version=2009.07.22
+%D title=AMS bibliography style,
+%D subtitle=Publications,
+%D author={Taco Hoekwater, Giuseppe Bilotta},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\setupcite
+ [author,year]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\gdef\bibalignednumber#1{\hfill[#1]~~}
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=num,
+ \c!numbercommand=\bibalignednumber,
+ \c!numbering=\v!yes,
+ \c!autohang=\v!yes]
+
+\setuppublicationlist
+ [\c!width=30pt,
+ \c!artauthor=\normalshortauthor,
+ \c!editor=\normalshortauthor,
+ \c!author=\normalshortauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ and },
+ \c!finalnamesep={, and },
+ \c!firstnamesep={ },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={},
+ \c!authoretallimit=4,
+ \c!editoretallimit=4,
+ \c!artauthoretallimit=4,
+ \c!authoretaldisplay=1,
+ \c!editoretaldisplay=1,
+ \c!artauthoretaldisplay=1,
+ \c!authoretaltext={ {\it et al.\/}},
+ \c!editoretaltext={ {\it et al.\/}},
+ \c!artauthoretaltext={ {\it et al.\/}}]
+
+\def\maybeyear#1{}
+
+\def\etalchar#1{#1}
+
+\def\insertNote#1#2#3{%
+ \begingroup
+ \sfcode`\.=1020
+ \insertnote{#1}{\ifnum\spacefactor=1020 \else .\fi}{#3}%
+ \endgroup
+}
+
+\def\insertEdition#1#2#3{%
+ \begingroup
+ \insertedition{#1}{\doifnumberelse{\csname @@pb@edition\endcsname}{%
+ \ifcase \csname @@pb@edition\endcsname \or st\or nd\or rd\else th\fi
+ }{}#2}{#3}%
+ \endgroup
+}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{chapter\ }}{#2}%
+ {#3}}
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {#1}{\insertcity
+ {, }
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{, }{}{#2}}}%
+ {\insertcity
+ {}{\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+% some tricks with page ranges:
+
+\def\insertfirstpage#1#2#3{%
+ \@EA\bibdoifelse
+ \@EA{\csname @@pb@pages\endcsname}%
+ {#1\fixedfirstpage #2}%
+ {#3}%
+}
+
+\def\fixedfirstpage{\expanded{\doifinstringelse{-}{\csname @@pb@pages\endcsname}%
+ {\gobblelastdash\csname @@pb@pages\endcsname-\relax}{\csname @@pb@pages\endcsname}}}
+
+\protected\def\gobblelastdash#1-#2\relax{#1}
+
+\def\fixpp.{\expanded{\doifinstringelse{-}{\csname @@pb@pages\endcsname}{pp.}{p.}}}
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{ }{\insertthekey{}{ }{}}%
+ \insertarttitle{\unskip, \bgroup\it }{\/\egroup}{}%
+ \insertjournal{\unskip, \bgroup }{\egroup}{}%
+ \insertvolume{ \bgroup\bf }{\egroup}{}%
+ \insertpubyear{ (}{)}{\unskip}%
+ \insertissue{\unskip, no.~}{}{}%
+ \insertpages{\unskip, }{}{}%
+ \insertNote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \insertauthors{}{ }{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \inserttitle
+ {\unskip, \bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, \fixpp. }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, p. }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpubyear{(%
+ \insertpublisher
+ {}%
+ {, }%
+ {}%
+ }{)\insertEdition{, }{ ed. }{. }}{\unskip.}%
+% \insertpages{}{p. }{}%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{}{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \inserttitle
+ {, \bgroup\it }%
+ {\/\egroup
+ \insertpubyear
+ { (%
+ \insertpubname{}{\insertcity{, }{, }{}}{}%
+ }
+ {)\insertEdition{, }{ ed.}{}}{}%
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { vol.~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, p. }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, vol.~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, \fixpp. }{. }{. }%
+ }%
+ \fi }%
+ { }%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpubyear{(%
+ \insertpublisher{}{, }{}%
+ }{)\insertEdition{, }{ ed. }{. }}{}%
+ \insertpages{}{p. }{}%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpubyear{(%
+ \insertorganization
+ {}%
+ {\insertcity{, }{, }{}}%
+ {\insertcity{}{, }{}}%
+ }{)\insertEdition{, }{ ed. }{. }}{}%
+ \insertpages{}{p. }{}%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{}{\insertthekey{}{, }{}}%
+ \insertarttitle{, \bgroup }{\egroup}{}%
+ \inserttitle
+ {, in %
+ \bgroup\it}%
+ {\egroup
+ \inserteditors{, edited by }%
+ {}%
+ {}
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpubyear{(%
+ \insertpublisher{}%{, }%{}%
+ }{)\insertEdition{, }{ ed. }{}}{}%
+ \insertpages{\unskip, p.~}{. }{\unskip. }%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, p.~}{. }{\unskip. }%
+ }%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{ }{}%
+ \insertarttitle{\bgroup\it }{\/\egroup }{}%%
+ \inserttitle
+ {\unskip, in \bgroup\it}%
+ {\egroup
+ \inserteditors{, edited by }%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpubyear
+ { (%
+ \insertorganization
+ {}%
+ {\insertpubname{, }
+ {\insertcity{, }{}{}, }
+ {\insertcity{, }{}{}, }}%
+ {\insertpubname{}
+ {\insertcity{, }{}{}, }
+ {\insertcity{}{, }{}}}%
+ }
+ {)}{}%
+ \insertseries
+ {, \insertvolume{vol. }{~of }{}\bgroup\it}%
+ {\egroup}%
+ {}%
+ \insertpages
+ {\unskip, \fixpp.~}
+ {\unskip.}
+ {\unskip.}%
+ }%
+ { In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, \fixpp.~}{. }{\unskip. }%
+ }%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{, ed%
+ \ifnum\getvalue{editor@num}> 1 s\fi.,
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpubyear{(%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{, }{}}%
+ {\insertpubname{}{, }{}}%
+ }
+ {)}
+ {}%
+ \insertpages
+ {\unskip, p.~}
+ {\insertcity{, }{}{}}
+ {\unskip\insertcity{, }{}{}}%
+ }%
+ {}%
+ \insertNote{\unskip. }{.}{.}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{, }{}%
+ \insertbibtype{}{, }{Master's thesis, }%
+ \insertpublisher{}{, }{}%
+ \insertpubyear{(}{)}{}%
+ \insertpages{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{, }{}%
+ \insertbibtype{}{, }{Ph.D. thesis, }%
+ \insertpublisher{}{, }{}%
+ \insertpubyear{(}{)}{}%
+ \insertpages{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{%
+ \inserttitle{, \bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ }{%
+ \insertthekey{}{%
+ \inserttitle{, \bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ }{%
+ \inserttitle{, \bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ }}%
+ \insertpubyear{(%
+ \insertpublisher{}{, }{}%
+ }%
+ {)}%
+ {%
+ \inserthowpublished{\unskip, }{}{}%
+ }%
+ \insertpages{\unskip, }{}{}%
+ \inserteprint{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{, }{}%
+ \inserttitle{\bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ \insertbibtype{}{}{Tech. Rep.}%
+ \insertvolume{ }{, }{, }%
+ \insertpublisher{}{ }{}%
+ \insertpubyear{(}{)}{}%
+ \insertpages{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{, }{}%
+ \inserttitle{\bgroup \it }{\egroup \insertseries{ (}{)}{}}{}%
+ \insertbibtype{ (}{)}{}%
+ \insertpubyear{ (unpublished, }{)}{ (unpublished)}%
+ \insertpages{\unskip, }{ }{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+\protect
diff --git a/tex/context/bib/bibl-apa-de.tex b/tex/context/bib/bibl-apa-de.tex
new file mode 100644
index 000000000..afeebd260
--- /dev/null
+++ b/tex/context/bib/bibl-apa-de.tex
@@ -0,0 +1,386 @@
+%D \module
+%D [ file=bibl-apa-de,
+%D version=2006.9.12,
+%D title=APA bibliography style,
+%D subtitle=Publications,
+%D author={Taco Hoekwater},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\setupcite
+ [author,year]
+ [\c!andtext={ und },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ und },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ und },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ und },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ und },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ und },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ und },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ und },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ und },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ und },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=authoryears,
+ \c!numbering=\v!no,
+ \c!autohang=\v!no]
+
+\setuppublicationlist
+ [\c!width=24pt,
+ \c!artauthor=\invertedshortauthor,
+ \c!editor=\invertedshortauthor,
+ \c!author=\invertedshortauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ und },
+ \c!finalnamesep={ und },
+ \c!firstnamesep={, },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={, },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.},
+]
+
+\def\maybeyear#1{#1}
+
+\def\etalchar#1{#1}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{Kapitel\ }}{#2}%
+ {#3}}
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {#1}{\insertcity
+ {, }
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{, }{}{#2}}}%
+ {\insertcity
+ {}{\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \insertjournal{\bgroup \it}{\egroup}
+ {\insertcrossref{In }{}{}}%
+ \insertvolume
+ {, }
+ {\insertissue{(}{)}{}\insertpages{:}{.}{.}}
+ {\insertpages{, Seiten }{.}{.}}%
+ \insertnote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \insertauthors{}{ }{\inserteditors{}{, Herausgeber%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Nummer~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, Seiten }{. }{. }%
+ \insertvolume{Band~}{ von~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, Band~}%
+ {\insertseries
+ { von~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, Seiten }{.}{.}%
+ }%
+ \fi}%
+ {}%
+ \insertpublisher
+ { }%
+ {\insertedition{, }{ Auflage.}{.}}%
+ {\insertedition{, }{ Auflage.}{}}%
+ \insertpages{ }{S. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{ }{\inserteditors{}{, Herausgeber%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Nummer~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, Seiten }{. }{. }%
+ \insertvolume{Band~}{ Von~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, Band~}%
+ {\insertseries
+ { von~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, Seiten }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ Auflage. }{. }}%
+ {\insertedition{, }{ Auflage. }{}}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ Auflage. }{. }}%
+ {\insertedition{, }{ Auflage. }{}}%
+ \insertpages{}{S. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
+ \insertorganization
+ {}%
+ {\insertcity{, }%
+ {\insertedition{, }{ Auflage. }{. }}%
+ {\insertedition{, }{ Auflage. }{. }}}%
+ {\insertedition{, }{ Auflage. }{}}%
+ \insertpages{}{S. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {In \inserteditors{}%
+ {, Herausgeber, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, Nummer }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, Seiten~}{. }{\unskip. }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ Auflage. }{. }}%
+ {\insertedition{, }{ Auflage. }{}}%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, Seiten~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {In \inserteditors{}%
+ {, Herausgeber, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, Nummer }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages
+ {\unskip, Seiten~}
+ {\insertcity{, }{. }{. }}
+ {\unskip. }%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{}{. }{}}% was {, }{. }{}
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, Seiten~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{, Herausgeber%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, Nummer }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, Seiten~}{\insertcity{, }{. }{. }}
+ {\unskip\insertcity{, }{. }{. }}%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{, }{. }{}}%
+ }%
+ {}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Masterarbeit, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{S. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Dissertation, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{S. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{S. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Technischer Bericht, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{S. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{S. }{}%
+ \insertbibtype{(}{)}{}%
+ \insertnote{ }{.}{}%
+}
+
+\protect
diff --git a/tex/context/bib/bibl-apa-fr.tex b/tex/context/bib/bibl-apa-fr.tex
new file mode 100644
index 000000000..654a36441
--- /dev/null
+++ b/tex/context/bib/bibl-apa-fr.tex
@@ -0,0 +1,389 @@
+%D \module
+%D [ file=bibl-apa-fr,
+%D version=2005.12.15,
+%D title=APA fr bibliography style,
+%D subtitle=Publications,
+%D author={Renaud Aubin},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\setupcite
+ [author,year]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=authoryears,
+ \c!numbering=\v!no,
+ \c!autohang=\v!no]
+
+\setuppublicationlist
+ [\c!width=24pt,
+ \c!artauthor=\invertedshortauthor,
+ \c!editor=\invertedshortauthor,
+ \c!author=\invertedshortauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ et },
+ \c!finalnamesep={ et },
+ \c!firstnamesep={, },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={, },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.},
+]
+
+\def\maybeyear#1{#1}
+
+\def\etalchar#1{#1}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{chapitre\ }}{#2}%
+ {#3}}
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {#1}{\insertcity
+ {, }
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{, }{}{#2}}}%
+ {\insertcity
+ {}{\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \insertjournal{\bgroup \it}{\egroup}
+ {\insertcrossref{Dans }{}{}}%
+ \insertvolume
+ {, }
+ {\insertissue{(}{)}{}\insertpages{:}{.}{.}}
+ {\insertpages{, pages }{.}{.}}%
+ \insertnote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \insertauthors{}{ }{\inserteditors{}{, \'editeur%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Num\'ero~}%
+ {\insertseries
+ { dans~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ dans~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ de~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { de~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{.}{.}%
+ }%
+ \fi}%
+ {}%
+ \insertpublisher
+ { }%
+ {\insertedition{, }{ \'edition.}{.}}%
+ {\insertedition{, }{ \'edition.}{}}%
+ \insertpages{ }{p. }{}%
+ \insertnote{}{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{ }{\inserteditors{}{, \'editeur%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { number~}%
+ {\insertseries
+ { dans~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ dans~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ de~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ \'edition. }{. }}%
+ {\insertedition{, }{ \'edition. }{}}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ \'edition. }{. }}%
+ {\insertedition{, }{ \'edition. }{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
+ \insertorganization
+ {}%
+ {\insertcity{, }%
+ {\insertedition{, }{ \'edition. }{. }}%
+ {\insertedition{, }{ \'edition. }{. }}}%
+ {\insertedition{, }{ \'edition. }{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {Dans \inserteditors{}%
+ {, \'editeur\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, num\'ero }{~dans }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ \'edition. }{. }}%
+ {\insertedition{, }{ \'edition. }{}}%
+ }%
+ {Dans \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {Dans \inserteditors{}%
+ {, \'editeur\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, num\'ero }{~dans }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages
+ {\unskip, pages~}
+ {\insertcity{, }{. }{. }}
+ {\unskip. }%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{}{. }{}}% was {, }{. }{}
+ }%
+ {Dans \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{, \'editeur%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, num\'ero }{~dans }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{\insertcity{, }{. }{. }}
+ {\unskip\insertcity{, }{. }{. }}%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{, }{. }{}}%
+ }%
+ {}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Th\`ese de master (DEA, DESS, master), }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Th\`ese de doctorat, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Rapport technique, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertbibtype{(}{)}{}%
+ \insertnote{ }{.}{}%
+}
+
+\protect
diff --git a/tex/context/bib/bibl-apa.tex b/tex/context/bib/bibl-apa.tex
new file mode 100644
index 000000000..20bbccb95
--- /dev/null
+++ b/tex/context/bib/bibl-apa.tex
@@ -0,0 +1,390 @@
+%D \module
+%D [ file=bibl-apa,
+%D version=2008.06.09,
+%D title=APA bibliography style,
+%D subtitle=Publications,
+%D author={Taco Hoekwater},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\setupcite
+ [author,year]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=authoryears,
+ \c!numbering=\v!no,
+ \c!autohang=\v!no]
+
+\setuppublicationlist
+ [\c!width=24pt,
+ \c!artauthor=\invertedshortauthor,
+ \c!editor=\invertedshortauthor,
+ \c!author=\invertedshortauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ and },
+ \c!finalnamesep={ and },
+ \c!firstnamesep={, },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={, },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.},
+]
+
+\def\maybeyear#1{#1}
+
+\def\etalchar#1{#1}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{chapter\ }}{#2}%
+ {#3}}
+
+% #1city, country: pubname#2
+% #1country: pubname#2
+% #1pubname#2
+% #1city, country#2
+% #3
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{}: }%
+ {#1\insertcountry{}{: }{}}}%
+ {#2}%
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+\def\insertorg#1#2#3%
+ {\insertorganization
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{#2}: }%
+ {\insertcountry{}{: }{#2}}}%
+ {}%
+ {\insertcity
+ {#1}
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{}{#2}{#3}}}%
+ }
+
+
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \insertjournal{\bgroup \it}{\egroup}
+ {\insertcrossref{In }{}{}}%
+ \insertvolume
+ {\bgroup \it, }
+ {\egroup\insertissue{\/(}{)}{}\insertpages{, }{.}{.}}
+ {\insertpages{, pp. }{.}{.}}%
+ \insertnote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \insertauthors{}{ }{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{.}}%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{.}{.}%
+ }%
+ \fi}%
+ {}%
+ \insertedition{ }{ edition}{}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{ }%
+ \insertnote{}{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{ }{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \insertpubyear{(}{). }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{.}}}%
+ {\insertseries{ }{.}{}}%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{.}{}%
+ }%
+ \fi}%
+ { }%
+ \insertedition{ }{ edition.}{}%
+ \insertpublisher{ }{.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertedition{ }{ edition.}{}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
+ \insertedition{ }{ edition.}{}%
+ \insertorg{ }{.}{.}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {In \inserteditors{}%
+ {, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertedition{ }{ edition}{}%
+ \insertpublisher{ }{.}{.}%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {In \inserteditors{}%
+ {, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{, pages~}{}{}%
+ \insertorg{. }{.}{.}%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{, pages~}{}{}%
+ \insertorg{. }{.}{.}%
+ }%
+ {}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Master's thesis, }%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{PhD thesis,}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{ p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Technical Report}%
+ \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{ }{}%
+ \insertpubyear{(}{). }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+% \insertpublisher{ }{.}{.}%
+ \insertpages{ }{p. }{}%
+ \insertbibtype{(}{)}{}%
+ \insertnote{ }{.}{}%
+}
+
+\protect
diff --git a/tex/context/bib/bibl-aps.tex b/tex/context/bib/bibl-aps.tex
new file mode 100644
index 000000000..39d3bd7d4
--- /dev/null
+++ b/tex/context/bib/bibl-aps.tex
@@ -0,0 +1,441 @@
+%D \module
+%D [ file=bibl-aps,
+%D version=2004.7.16,
+%D title=APS bibliography style,
+%D subtitle=Publications,
+%D author={Taco Hoekwater},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\setupcite
+ [author,year]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=num,
+ \c!numbercommand=\bibalignednumber,
+ \c!numbering=\v!yes,
+ \c!autohang=\v!yes]
+
+\def\bibalignednumber#1{\hfill[#1]~~}
+
+\setuppublicationlist
+ [\c!width=24pt,
+ \c!artauthor=\normalshortauthor,
+ \c!editor=\normalshortauthor,
+ \c!author=\normalshortauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ and },
+ \c!finalnamesep={, and },
+ \c!firstnamesep={ },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={},
+ \c!authoretallimit=4,
+ \c!editoretallimit=4,
+ \c!artauthoretallimit=4,
+ \c!authoretaldisplay=1,
+ \c!editoretaldisplay=1,
+ \c!artauthoretaldisplay=1,
+ \c!authoretaltext={ {\it et al.\/}},
+ \c!editoretaltext={ {\it et al.\/}},
+ \c!artauthoretaltext={ {\it et al.\/}}]
+
+\def\maybeyear#1{}
+
+\def\etalchar#1{#1}
+
+\def\insertNote#1#2#3{%
+ \begingroup
+ \sfcode`\.=1020
+ \insertnote{#1}{\ifnum\spacefactor=1020 \else .\fi}{#3}%
+ \endgroup
+}
+
+\def\insertEdition#1#2#3{%
+ \begingroup
+ \insertedition{#1}{\doifnumberelse{\csname @@pb@edition\endcsname}{%
+ \ifcase \csname @@pb@edition\endcsname \or st\or nd\or rd\else th\fi
+ }{}#2}{#3}%
+ \endgroup
+}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{chapter\ }}{#2}%
+ {#3}}
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {#1}{\insertcity
+ {, }
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{, }{}{#2}}}%
+ {\insertcity
+ {}{\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+% some tricks with page ranges:
+
+\def\insertfirstpage#1#2#3{%
+ \@EA\bibdoifelse
+ \@EA{\csname @@pb@pages\endcsname}%
+ {#1\fixedfirstpage #2}%
+ {#3}%
+}
+
+\def\fixedfirstpage{\expanded{\doifinstringelse{-}{\csname @@pb@pages\endcsname}%
+ {\gobblelastdash\csname @@pb@pages\endcsname-\relax}{\csname @@pb@pages\endcsname}}}
+
+\protected\def\gobblelastdash#1-#2\relax{#1}
+
+\def\fixpp.{\expanded{\doifinstringelse{-}{\csname @@pb@pages\endcsname}{pp.}{p.}}}
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{ }{\insertthekey{}{ }{}}%
+ \insertjournal{\unskip, \bgroup }{\egroup}
+ {}% \insertcrossref{In }{}{}}%
+ \insertvolume
+ { \bgroup \bf }
+ {\egroup %\insertissue{(}{)}{}%
+ \insertfirstpage{, }{}{}}
+ {\insertfirstpage{ }{}{}}%
+ \insertpubyear{ (}{). }{\unskip.}%
+ \insertNote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \insertauthors{}{ }{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \inserttitle
+ {\unskip, \bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, \fixpp. }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, p. }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpubyear{(%
+ \insertpublisher
+ {}%
+ {, }%
+ {}%
+ }{)\insertEdition{, }{ ed. }{. }}{\unskip.}%
+% \insertpages{}{p. }{}%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{}{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}%
+ \inserttitle
+ {, \bgroup\it }%
+ {\/\egroup
+ \insertpubyear
+ { (%
+ \insertpubname{}{\insertcity{, }{, }{}}{}%
+ }
+ {)\insertEdition{, }{ ed.}{}}{}%
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { vol.~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, p. }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, vol.~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, \fixpp. }{. }{. }%
+ }%
+ \fi }%
+ { }%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpubyear{(%
+ \insertpublisher{}{, }{}%
+ }{)\insertEdition{, }{ ed. }{. }}{}%
+ \insertpages{}{p. }{}%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpubyear{(%
+ \insertorganization
+ {}%
+ {\insertcity{, }{, }{}}%
+ {\insertcity{}{, }{}}%
+ }{)\insertEdition{, }{ ed. }{. }}{}%
+ \insertpages{}{p. }{}%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{}{\insertthekey{}{, }{}}%
+% \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {, in %
+ \bgroup\it}%
+ {\egroup
+ \inserteditors{, edited by }%
+ {}%
+ {}
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpubyear{(%
+ \insertpublisher{}%{, }%{}%
+ }{)\insertEdition{, }{ ed. }{}}{}%
+ \insertpages{\unskip, p.~}{. }{\unskip. }%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, p.~}{. }{\unskip. }%
+ }%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{ }{}%
+%
+% \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {\unskip, in \bgroup\it}%
+ {\egroup
+ \inserteditors{, edited by }%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpubyear
+ { (%
+ \insertorganization
+ {}%
+ {\insertpubname{, }
+ {\insertcity{, }{}{}, }
+ {\insertcity{, }{}{}, }}%
+ {\insertpubname{}
+ {\insertcity{, }{}{}, }
+ {\insertcity{}{, }{}}}%
+ }
+ {)}{}%
+ \insertseries
+ {, \insertvolume{vol. }{~of }{}\bgroup\it}%
+ {\egroup}%
+ {}%
+ \insertpages
+ {\unskip, \fixpp.~}
+ {\unskip.}
+ {\unskip.}%
+ }%
+ { In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, \fixpp.~}{. }{\unskip. }%
+ }%
+ \insertNote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{, ed%
+ \ifnum\getvalue{editor@num}> 1 s\fi.,
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpubyear{(%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{, }{}}%
+ {\insertpubname{}{, }{}}%
+ }
+ {)}
+ {}%
+ \insertpages
+ {\unskip, p.~}
+ {\insertcity{, }{}{}}
+ {\unskip\insertcity{, }{}{}}%
+ }%
+ {}%
+ \insertNote{\unskip. }{.}{.}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{, }{}%
+ \insertbibtype{}{, }{Master's thesis, }%
+ \insertpublisher{}{, }{}%
+ \insertpubyear{(}{)}{}%
+ \insertpages{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{, }{}%
+ \insertbibtype{}{, }{Ph.D. thesis, }%
+ \insertpublisher{}{, }{}%
+ \insertpubyear{(}{)}{}%
+ \insertpages{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{%
+ \inserttitle{, \bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ }{%
+ \insertthekey{}{%
+ \inserttitle{, \bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ }{%
+ \inserttitle{, \bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ }}%
+ \insertpubyear{(%
+ \insertpublisher{}{, }{}%
+ }%
+ {)}%
+ {%
+ \inserthowpublished{\unskip, }{}{}%
+ }%
+ \insertpages{\unskip, }{}{}%
+ \inserteprint{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{, }{}%
+ \inserttitle{\bgroup \it }{\egroup \insertseries{ (}{)}{} }{}%
+ \insertbibtype{}{}{Tech. Rep.}%
+ \insertvolume{ }{, }{, }%
+ \insertpublisher{}{ }{}%
+ \insertpubyear{(}{)}{}%
+ \insertpages{\unskip, }{}{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{}{}%
+ \inserttitle{\bgroup \it }{\egroup \insertseries{ (}{)}{}}{}%
+ \insertbibtype{ (}{)}{}%
+ \insertpubyear{ (unpublished,}{)}{ (unpublished)}%
+ \insertpages{\unskip, }{ }{}%
+ \insertNote{\unskip. }{.}{\unskip.}%
+}
+
+\protect \ No newline at end of file
diff --git a/tex/context/bib/bibl-num-fr.tex b/tex/context/bib/bibl-num-fr.tex
new file mode 100644
index 000000000..c4271fb7f
--- /dev/null
+++ b/tex/context/bib/bibl-num-fr.tex
@@ -0,0 +1,427 @@
+%D \module
+%D [ file=bibl-num-fr,
+%D version=2005.12.16,
+%D title=NUM-FR bibliography style,
+%D subtitle=Publications,
+%D author={Renaud Aubin},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\def\setuppublicationlayout[#1]#2%
+ {\setvalue{@@pvdata#1}{#2\unskip\vadjust{\kern 6pt}}}
+
+
+\setupcite
+ [author,year]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!no,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ et },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ et },
+ \c!compress=\v!no,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\def\withbrackets#1{[#1]~~}
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=num,
+ \c!numbering=\v!yes,
+ \c!numbercommand=\withbrackets,
+ \c!autohang=\v!yes]
+
+\setuppublicationlist
+ [\c!artauthor=\normalauthor,
+ \c!editor=\normalauthor,
+ \c!author=\normalauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ et },
+ \c!finalnamesep={ et },
+ \c!firstnamesep={ },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={ },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.},
+]
+
+\def\maybeyear#1{}
+
+\def\etalchar#1{#1}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{chapitre\ }}{#2}%
+ {#3}}
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {#1}{\insertcity
+ {, }
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{, }{}{#2}}}%
+ {\insertcity
+ {}{\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{\unskip. }{\insertthekey{}{. }{}}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \insertjournal{\bgroup \it}{\egroup}
+ {\insertcrossref{Dans }{}{}}%
+ \insertvolume
+ {, }
+ {\insertissue{(}{)}{}%
+ \insertpages{:}{}{}%
+ \insertpubyear{, }{}{}.}
+ {\insertpages{, pages }{}{}%
+ \insertpubyear{, }{}{}.}%
+ \insertnote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \insertauthors{}{\unskip. }{\inserteditors{}{\unskip, \'editeur%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{\unskip. }{}}}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Num\'ero~}%
+ {\insertseries
+ { dans~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ dans~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ de~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { de~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{.}{.}%
+ }%
+ \fi}%
+ {}%
+ \insertpublisher
+ { }%
+ {\insertedition{, }{ \'edition}{}
+ \insertpubyear{, }{.}{.}}%
+ {\insertedition{, }{ \'edition}{}%
+ \insertpubyear{, }{.}{.}}%
+ \insertpages{ }{p.}{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{\unskip. }{\inserteditors{}{\unskip, \'editeur%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{\unskip. }{}}}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { num\'ero~}%
+ {\insertseries
+ { dans~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ dans~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ de~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { de~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ \'edition}{}%
+ \insertpubyear{, }{. }{\unskip.}}%
+ {\insertedition{, }{ \'edition}{}%
+ \insertpubyear{, }{. }{\unskip.}}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{\unskip. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ \'edition}{}%
+ \insertpubyear{, }{. }{}}%
+ {\insertedition{, }{ \'edition. }{}%
+ \insertpubyear{, }{. }{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \inserttitle
+ {\bgroup \it }
+ {\/\egroup \insertseries{ (}{)}{}. }
+ {}%
+ \insertorganization
+ {}%
+ {\insertcity
+ {, }%
+ {\insertedition
+ {, }
+ { \'edition\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}%
+ {\insertedition
+ {, }
+ { \'edition\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}}%
+ {\insertedition{, }{ \'edition\insertpubyear{, }{. }{. }}{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{\unskip. }{\insertthekey{}{\unskip. }{}}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {Dans \inserteditors{}%
+ {\unskip, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ \'edition}{}%
+ \insertpubyear{, }{. }{. }}%
+ {\insertedition{, }{ \'edition}{}%
+ \insertpubyear{, }{. }{}}%
+ }%
+ {Dans \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{\unskip. }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {Dans \inserteditors{}%
+ {\unskip, \'editeur\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, num\'ero }{~dans }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages
+ {\unskip, pages~}
+ {\insertcity{, }{}{}
+ \insertpubyear{\unskip, }{. }{. }}%
+ {\unskip
+ \insertpubyear{\unskip, }{. }{. }}%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{}{. }{}}% was {, }{. }{}
+ }%
+ {Dans \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{\unskip, \'editeur%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, num\'ero }{~dans }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages
+ {\unskip, pages~}
+ {\insertcity
+ {, }
+ {\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}
+ {\unskip
+ \insertcity
+ {, }
+ {\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{, }{. }{}}%
+ }%
+ {}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{ }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{M\'emoire de master (DEA, DESS), }%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertpages{, }{p.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{ }{}%
+ \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Th\`ese de doctorat, }%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertpages{, }{p.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{ }{\insertthekey{}{. }{}}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{ }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Rapport technique, }%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertpages{, }{p.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{ }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{.}{}}
+ {\insertpubyear{}{.}{}}%
+ \insertbibtype{ (}{)}{}%
+ \insertnote{ }{.}{}%
+}
+
+\protect
diff --git a/tex/context/bib/bibl-num.tex b/tex/context/bib/bibl-num.tex
new file mode 100644
index 000000000..3c72d975a
--- /dev/null
+++ b/tex/context/bib/bibl-num.tex
@@ -0,0 +1,427 @@
+%D \module
+%D [ file=bibl-num,
+%D version=2006.07.01,
+%D title=Numeric bibliography style,
+%D subtitle=Publications,
+%D author={Taco Hoekwater},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\def\setuppublicationlayout[#1]#2%
+ {\setvalue{@@pvdata#1}{#2\unskip\vadjust{\kern 6pt}}}
+
+
+\setupcite
+ [author,year]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\def\withbrackets#1{[#1]~~}
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=num,
+ \c!numbering=\v!yes,
+ \c!numbercommand=\withbrackets,
+ \c!autohang=\v!yes]
+
+\setuppublicationlist
+ [\c!artauthor=\normalauthor,
+ \c!editor=\normalauthor,
+ \c!author=\normalauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ and },
+ \c!finalnamesep={ and },
+ \c!firstnamesep={ },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={ },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.},
+]
+
+\def\maybeyear#1{}
+
+\def\etalchar#1{#1}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{chapter\ }}{#2}%
+ {#3}}
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {#1}{\insertcity
+ {, }
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{, }{}{#2}}}%
+ {\insertcity
+ {}{\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+
+\setuppublicationlayout[article]{%
+ \insertartauthors{}{\unskip. }{\insertthekey{}{. }{}}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \insertjournal{\bgroup \it}{\egroup}
+ {\insertcrossref{In }{}{}}%
+ \insertvolume
+ {, }
+ {\insertissue{(}{)}{}%
+ \insertpages{:}{}{}%
+ \insertpubyear{, }{}{}.}
+ {\insertpages{, pages }{}{}%
+ \insertpubyear{, }{}{}.}%
+ \insertnote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \insertauthors{}{\unskip. }{\inserteditors{}{\unskip, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi.%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{\unskip. }{}}}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook.%
+ \global\editedbookfalse
+ \insertvolume
+ { Number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{.}{.}%
+ }%
+ \fi}%
+ {}%
+ \insertpublisher
+ { }%
+ {\insertedition{, }{ edition}{}%
+ \insertpubyear{, }{.}{.}}%
+ {\insertedition{, }{ edition}{}%
+ \insertpubyear{, }{.}{.}}%
+ \insertpages{ }{p.}{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \insertauthors{}{\unskip. }{\inserteditors{}{\unskip, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{\unskip. }{}}}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ edition}{}%
+ \insertpubyear{, }{. }{\unskip.}}%
+ {\insertedition{, }{ edition}{}%
+ \insertpubyear{, }{. }{\unskip.}}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \insertauthors{}{\unskip. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ edition}{}%
+ \insertpubyear{, }{. }{}}%
+ {\insertedition{, }{ edition. }{}%
+ \insertpubyear{, }{. }{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \insertauthors{}{\unskip. }{\insertthekey{}{. }{}}%
+ \inserttitle
+ {\bgroup \it }
+ {\/\egroup \insertseries{ (}{)}{}. }
+ {}%
+ \insertorganization
+ {}%
+ {\insertcity
+ {, }%
+ {\insertedition
+ {, }
+ { edition\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}%
+ {\insertedition
+ {, }
+ { edition\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}}%
+ {\insertedition{, }{ edition\insertpubyear{, }{. }{. }}{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \insertartauthors{}{\unskip. }{\insertthekey{}{\unskip. }{}}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {In \inserteditors{}%
+ {\unskip, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ edition}{}%
+ \insertpubyear{, }{. }{. }}%
+ {\insertedition{, }{ edition}{}%
+ \insertpubyear{, }{. }{}}%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \insertauthors{}{\unskip. }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {In \inserteditors{}%
+ {\unskip, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages
+ {\unskip, pages~}
+ {\insertcity{, }{}{}%
+ \insertpubyear{\unskip, }{. }{. }}%
+ {\unskip
+ \insertpubyear{\unskip, }{. }{. }}%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{}{. }{}}% was {, }{. }{}
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \inserteditors{}{\unskip, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi.%
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages
+ {\unskip, pages~}
+ {\insertcity
+ {, }
+ {\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}
+ {\unskip
+ \insertcity
+ {, }
+ {\insertpubyear{, }{. }{. }}
+ {\insertpubyear{, }{. }{. }}}%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{, }{. }{}}%
+ }%
+ {}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \insertauthors{}{\unskip. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Master's thesis, }%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertpages{, }{p.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \insertauthors{}{\unskip. }{}%
+ \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{PhD thesis, }%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertpages{, }{p.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[misc]{%
+ \insertauthors{}{\unskip. }{\insertthekey{}{. }{}}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \insertauthors{}{\unskip. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Technical Report, }%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{}{}}
+ {\insertpubyear{}{}{}}%
+ \insertpages{, }{p.}{.}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \insertauthors{}{\unskip. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher
+ {}
+ {, \insertpubyear{}{.}{}}
+ {\insertpubyear{}{.}{}}%
+ \insertbibtype{ (}{)}{}%
+ \insertnote{ }{.}{}%
+}
+
+\protect \ No newline at end of file
diff --git a/tex/context/bib/bibl-ssa.tex b/tex/context/bib/bibl-ssa.tex
new file mode 100644
index 000000000..b93bd1b68
--- /dev/null
+++ b/tex/context/bib/bibl-ssa.tex
@@ -0,0 +1,486 @@
+%D \module
+%D [ file=bibl-apa,
+%D version=2004.7.16,
+%D title=APA bibliography style,
+%D subtitle=Publications,
+%D author={Taco Hoekwater},
+%D date=\currentdate,
+%D copyright={Public Domain}]
+%C
+%C (Slightly modified to SSA-like 2005.3.24, David Wooten)
+%C Donated to the public domain. Use at your own risk
+
+\unprotect
+
+\setupcite
+ [author,year]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryear]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={ },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [authoryears]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={, },
+ \c!left={(},
+ \c!right={)}]
+
+\setupcite
+ [key,serial,authornum,page,short,type,doi,url]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!no,
+ \c!inbetween={ },
+ \c!left={[},
+ \c!right={]}]
+
+\setupcite
+ [num]
+ [\c!andtext={ and },
+ \c!otherstext={ et al.},
+ \c!pubsep={, },
+ \c!lastpubsep={ and },
+ \c!compress=\v!yes,
+ \c!inbetween={--},
+ \c!left={[},
+ \c!right={]}]
+
+\setuppublications[%
+ \c!sorttype=,
+ \c!criterium=,
+ \c!refcommand=authoryears,
+ \c!numbering=\v!no,
+ \c!autohang=\v!no]
+
+\setuppublicationlist
+ [\c!width=24pt,
+ \c!artauthor=\toggledauthor, %TH
+ \c!editor=\toggledauthor,
+ \c!author=\toggledauthor,
+ \c!namesep={, },
+ \c!lastnamesep={ and },
+ \c!finalnamesep={ and },
+ \c!firstnamesep={, },
+ \c!juniorsep={ },
+ \c!vonsep={ },
+ \c!surnamesep={, },
+ \c!authoretallimit=5,
+ \c!editoretallimit=5,
+ \c!artauthoretallimit=5,
+ \c!authoretaldisplay=5,
+ \c!editoretaldisplay=5,
+ \c!artauthoretaldisplay=5,
+ \c!authoretaltext={ et al.},
+ \c!editoretaltext={ et al.},
+ \c!artauthoretaltext={ et al.},
+]
+
+\def\maybeyear#1{#1}
+
+\def\etalchar#1{#1}
+
+%D \macros {invertedauthor,normalauthor,toggledauthor}
+%D
+%D These are redefinitions of the core versions.
+
+\def\invertedauthor#1#2#3#4#5%
+ {\bibdoif{#2}{#2\bibalternative\c!vonsep}%
+ \uppercased{#3}\bibalternative\c!surnamesep
+ \bibdoif{#5}{#5\bibalternative\c!juniorsep}%
+ \bibdoif{#1}{#1\unskip}}
+
+\def\normalauthor#1#2#3#4#5%
+ {\bibdoif{#1}{#1}\bibdoif{#2}{#2 } \uppercased{#3}%
+ \bibdoif{#5}{#5\unskip}}
+
+%TH
+%D The \type{\scratchcounter} is incremented by \specialbibinsert
+%D before each author/editor is typeset, so the only thing that needs
+%D doing is testing its value to decide which of the two `standard'
+%D author formatting macros to call.
+%D
+%D The \type{\normalauthor} definition above is a bit altered/stripped
+%D down, because the 'glue items' like \type{firstnamesep} got in the
+%D way.
+
+\def\toggledauthor#1#2#3#4#5%
+ {\relax
+ \ifnum \scratchcounter > 1
+ \normalauthor{#1}{#2}{#3}{#4}{#5}%
+ \else
+ \invertedauthor{#1}{#2}{#3}{#4}{#5}%
+ \fi }
+
+%TH
+%D Below, each \type{\setuppublicationlayout} macro's body will
+%D start by setting a global toggle to true, that controls whether
+%D or not the next \type{\insertartauthors},\type{\insertauthors}
+%D or \type{\inserteditors} has to store it's contents for comparison.
+%D All three are instances of the generic macro \type{\specialbibinsert}.
+%D The net result of this trick is that the first typeset block of
+%D names will be saved, regardless of whether they are book authors,
+%D article authors, or editors.
+
+\newif\ifsetstoredauthor
+
+%D save the normal meaning, because it will be redefined
+\let\normalspecialbibinsert\specialbibinsert
+
+%D This is a typical call (use) of \type{\specialbibinsert}, for
+%D reference:
+%D \starttyping
+%D \specialbibinsert{author}{\author@num}{<before>}{<after>}{<not>}
+%D \stoptyping
+
+\def\specialbibinsert#1#2#3#4#5%
+ {\relax
+ \ifsetstoredauthor
+ \global\setstoredauthorfalse % RESET
+ \putcurrentinallstuff{#1}{#2}%
+ \ifx\allstuff\oldstuff
+ % do nothing
+ \else
+ \normalspecialbibinsert{#1}{#2}{#3}{#4}{#5}%
+ \fi
+ \global\let\oldstuff\allstuff
+ \else
+ \normalspecialbibinsert{#1}{#2}{#3}{#4}{#5}%
+ \fi}
+
+%D initialize \type{\oldstuff}
+
+\def\oldstuff{}
+
+%D \#1 = authors
+%D \#2 = \type{\author@num}
+\def\putcurrentinallstuff#1#2%
+ {{\gdef\allstuff{}%
+ \def\tempx##1##2##3##4##5%
+ {\xdef\allstuff{\allstuff !!##1!##2!##3!##4!##5}}%
+ \@EA\dorecurse\@EA{#2}%
+ {\@EA\@EA\@EA\tempx \csname @@pb@#1\recurselevel\endcsname}%
+ }}
+
+%D \macros{insertchapter,insertpublisher}
+
+%D Some shortcuts.
+
+% ((#1(type\ |)chapter#2)|#3)
+
+
+\def\insertchap#1#2#3%
+ {\insertchapter
+ {#1\insertbibtype{}{\ }{chapter\ }}{#2}%
+ {#3}}
+
+\def\insertpublisher#1#2#3%
+ {\insertpubname
+ {#1}{\insertcity
+ {, }
+ {\insertcountry{, }{}{#2}}%
+ {\insertcountry{, }{}{#2}}}%
+ {\insertcity
+ {}{\insertcountry{, }{}{#2}}%
+ {\insertcountry{#1}{#2}{#3}}}%
+ }
+
+\setuppublicationlayout[article]{%
+ %TH all items below do this as well ...
+ \global\setstoredauthortrue
+ \insertartauthors{}{.}{\insertthekey{}{ }{}}\hfill\break%
+ \insertpubyear{}{. }{\unskip.}%
+ \insertarttitle{\bgroup ``}{\egroup'', }{ }%
+ \insertjournal{\bgroup in \it}{\egroup}
+ {\insertcrossref{in }{}{}}%
+ \insertvolume
+ {, }
+ {\insertissue{(}{)}{}\insertpages{:}{.}{.}}
+ {\insertpages{, pages }{.}{.}}%
+ \insertnote{ }{.}{}%
+ \insertcomment{}{.}{}%
+}
+
+\newif\ifeditedbook
+\setuppublicationlayout[book]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{.}{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}\hfill\break%
+ \insertpubyear{}{. }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { Number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ edition. }{}}%
+ {\insertedition{, }{ edition. }{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inbook]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{\inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{. }{}}}\hfill\break%
+ \insertpubyear{}{. }{\unskip.}%
+ \inserttitle
+ {\bgroup\it }%
+ {\/\egroup
+ \ifeditedbook
+ \global\editedbookfalse
+ \insertvolume
+ { number~}%
+ {\insertseries
+ { in~\bgroup}%
+ {\egroup. }%
+ {\insertcrossref{ in~}{}{. }}}%
+ {\insertseries{ }{.}{} }%
+ \else
+ \insertcrossref
+ {\insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ \insertvolume{Volume~}{ of~}{}%
+ }%
+ {}%
+ {\insertvolume
+ {, volume~}%
+ {\insertseries
+ { of~\bgroup\it}%
+ {\egroup}
+ {}}
+ {}%
+ \insertchap{, }{}{}%
+ \insertpages{, pages }{. }{. }%
+ }%
+ \fi}%
+ { }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ edition. }{. }}%
+ {\insertedition{, }{ edition. }{}}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[booklet]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{\insertthekey{}{. }{}}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ edition. }{. }}%
+ {\insertedition{, }{ edition. }{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[manual]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{\insertthekey{}{. }{}}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle{\bgroup \it }{\/\egroup \insertseries{ (}{)}{}. }{}%
+ \insertorganization
+ {}%
+ {\insertcity{, }%
+ {\insertedition{, }{ edition. }{. }}%
+ {\insertedition{, }{ edition. }{. }}}%
+ {\insertedition{, }{ edition. }{}}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[incollection]{%
+ \global\setstoredauthortrue
+ \insertartauthors{}{ }{\insertthekey{}{. }{}}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%
+ \inserttitle
+ {In \inserteditors{}%
+ {, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertpublisher
+ {}%
+ {\insertedition{, }{ edition. }{. }}%
+ {\insertedition{, }{ edition. }{}}%
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[inproceedings]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \insertarttitle{\bgroup }{\egroup. }{}%%
+ \inserttitle
+ {In \inserteditors{}%
+ {, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
+ {}%
+ \bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages
+ {\unskip, pages~}
+ {\insertcity{, }{. }{. }}
+ {\unskip. }%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{}{. }{}}% was {, }{. }{}
+ }%
+ {In \insertcrossref{}{}{}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
+ }%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[proceedings]{%
+ \global\setstoredauthortrue
+ \inserteditors{}{, editor%
+ \ifnum\getvalue{editor@num}> 1 s\fi
+ \ \global\editedbooktrue
+ }{\insertthekey{}{ }{}}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle
+ {\bgroup\it}%
+ {\egroup
+ \insertseries
+ {\insertvolume{, number }{~in }{ }}%
+ {}%
+ {}%
+ \insertchap{\unskip, }{ }{ }%
+ \insertpages{\unskip, pages~}{\insertcity{, }{. }{. }}
+ {\unskip\insertcity{, }{. }{. }}%
+ \insertorganization
+ {}%
+ {\insertpubname{, }{. }{. }}%
+ {\insertpubname{, }{. }{}}%
+ }%
+ {}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[mastersthesis]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{Master's thesis, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[phdthesis]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle{\bgroup\it }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{, }{PhD thesis, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[misc]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{\insertthekey{}{. }{}}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}. }{}%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[techreport]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertbibtype{}{\insertvolume{ }{, }{, }}{Technical Report, }%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertnote{ }{.}{}%
+}
+
+\setuppublicationlayout[unpublished]{%
+ \global\setstoredauthortrue
+ \insertauthors{}{ }{}\hfill\break%
+ \insertpubyear{}{. }{}%
+ \inserttitle{\bgroup }{\egroup \insertseries{ (}{)}{}. }{}%
+ \insertpublisher{}{. }{}%
+ \insertpages{}{p. }{}%
+ \insertbibtype{(}{)}{}%
+ \insertnote{ }{.}{}%
+}
+
+\protect \ No newline at end of file
diff --git a/tex/context/config/cont-usr.tex b/tex/context/config/cont-usr.tex
new file mode 100644
index 000000000..5a3070362
--- /dev/null
+++ b/tex/context/config/cont-usr.tex
@@ -0,0 +1,109 @@
+%D \module
+%D [ file=cont-usr,
+%D version=1997.10.05,
+%D title=\CONTEXT\ User Format Specifications,
+%D subtitle=System Specific Setups,
+%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 User Settings}
+
+\unprotect
+
+%D Additional languages can be defined here. Beware of
+%D encoding incompatibilities. Please take a look at the
+%D \type {cont-en.tex}, \type {cont-nl.tex}, enz.\ files
+%D first. Normally you don't have to change a byte. If you
+%D want to play safe, use \typ {texexec --make --alone
+%D --all}.
+
+% \preloadallpatterns % will load them all
+
+% \installlanguage [\s!af] [\c!state=\v!start] % afrikaans
+% \installlanguage [\s!ca] [\c!state=\v!start] % catalan
+% \installlanguage [\s!cs] [\c!state=\v!start] % czech
+% \installlanguage [\s!da] [\c!state=\v!start] % danish
+% \installlanguage [\s!de] [\c!state=\v!start] % german
+% \installlanguage [\s!en] [\c!state=\v!start] % english us
+% \installlanguage [\s!es] [\c!state=\v!start] % spanish
+% \installlanguage [\s!fi] [\c!state=\v!start] % finnish
+% \installlanguage [\s!fr] [\c!state=\v!start] % french
+% \installlanguage [\s!hr] [\c!state=\v!start] % croatian
+% \installlanguage [\s!hu] [\c!state=\v!start] % hungarian
+% \installlanguage [\s!it] [\c!state=\v!start] % italian
+% \installlanguage [\s!la] [\c!state=\v!start] % latin
+% \installlanguage [\s!nl] [\c!state=\v!start] % dutch
+% \installlanguage [\s!nb] [\c!state=\v!start] % bokmal
+% \installlanguage [\s!nn] [\c!state=\v!start] % nynorsk
+% \installlanguage [\s!pl] [\c!state=\v!start] % polish
+% \installlanguage [\s!pt] [\c!state=\v!start] % portuguese
+% \installlanguage [\s!ro] [\c!state=\v!start] % romanian
+% \installlanguage [\s!ru] [\c!state=\v!start] % russian
+% \installlanguage [\s!sk] [\c!state=\v!start] % slovak
+% \installlanguage [\s!sl] [\c!state=\v!start] % slovenian
+% \installlanguage [\s!sv] [\c!state=\v!start] % swedish
+% \installlanguage [\s!tr] [\c!state=\v!start] % turkish
+% \installlanguage [\s!ua] [\c!state=\v!start] % ukrainian
+% \installlanguage [\s!gb] [\c!state=\v!start] % english uk
+% \installlanguage [\s!vn] [\c!state=\v!start] % vietnamese
+
+% \installlanguage [deo] [\c!state=\v!start] % old german
+
+%D The next lines can be used for setting the language to be
+%D used at startup time.
+
+% \setupcurrentlanguage[\s!af]
+% \setupcurrentlanguage[\s!ca]
+% \setupcurrentlanguage[\s!cs]
+% \setupcurrentlanguage[\s!da]
+% \setupcurrentlanguage[\s!de]
+% \setupcurrentlanguage[\s!en]
+% \setupcurrentlanguage[\s!es]
+% \setupcurrentlanguage[\s!fi]
+% \setupcurrentlanguage[\s!fr]
+% \setupcurrentlanguage[\s!hr]
+% \setupcurrentlanguage[\s!hu]
+% \setupcurrentlanguage[\s!it]
+% \setupcurrentlanguage[\s!la]
+% \setupcurrentlanguage[\s!nl]
+% \setupcurrentlanguage[\s!nb]
+% \setupcurrentlanguage[\s!nn]
+% \setupcurrentlanguage[\s!pl]
+% \setupcurrentlanguage[\s!pt]
+% \setupcurrentlanguage[\s!ro]
+% \setupcurrentlanguage[\s!ru]
+% \setupcurrentlanguage[\s!sk]
+% \setupcurrentlanguage[\s!sl]
+% \setupcurrentlanguage[\s!sv]
+% \setupcurrentlanguage[\s!tr]
+% \setupcurrentlanguage[\s!ua]
+
+%D Local font settings can go here. Normally suitable
+%D defaults are already preloaded, almost certainly the
+%D Computer Modern Roman typefaces or some derivate. So, the
+%D next line is only meant as sample, take a look at the
+%D format related files first.
+
+% This is obsolete due to latin modern:
+%
+% \definefilesynonym [font-cmr] [font-csr] % czech & slovak
+% \definefilesynonym [font-cmr] [font-plr] % polish
+
+%D In some languages, compound characters, like \type {"e}
+%D are used to get accented and non latin characters.
+
+% Per 21/9/2006 one needs to explicitly enable this.
+
+% \useencoding[fde] % german
+% \useencoding[ffr] % french
+% \useencoding[fro] % romanian
+% \useencoding[fpl] % polish
+
+%D Don't remove the next few lines.
+
+\protect \endinput
diff --git a/tex/context/extra/mag-0000.tex b/tex/context/extra/mag-0000.tex
new file mode 100644
index 000000000..baad957b8
--- /dev/null
+++ b/tex/context/extra/mag-0000.tex
@@ -0,0 +1,44 @@
+% content=tex
+%
+% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+
+\usemodule[mag-01]
+
+\setvariables
+ [magazine]
+ [title={Introduction},
+ author=Hans Hagen,
+ affiliation=PRAGMA ADE,
+ date=Januari 2003,
+ number=0]
+
+\startbuffer[abstract]
+ This is the zero issue of a semi periodical. The
+ associated style can be used by \CONTEXT\ users to
+ typeset and publish their own issues.
+\stopbuffer
+
+\starttext \setups [titlepage] \setups [title]
+
+\setupheadertexts[welcome]
+
+This is the zero issue of a range of \CONTEXT\ related
+publications, in most cases short introductions to new
+functionality. The style may be used by users for providing
+similar documents, but preferably not for other purposes,
+since it may confuse readers in their expectations.
+
+We've chosen a layout which is more functional than
+beautiful. This layout provides several text areas: headers
+and footers, margins and edges as well as a main text area.
+The surrounding (gray) makes the main page (which is
+slightly smaller than A4) stand out and is suitable for
+viewing in spread mode.
+
+The documents produced at \PRAGMA\ are called {\bf This
+Way}, user documents gets the title {\bf My Way}. The
+\PRAGMA\ issues are numbered. We strongly advise you not to
+use the \type {mag-} prefix for your issues, since this may
+lead to clashes with files distributed by \PRAGMA.
+
+\setups [listing] \setups [lastpage] \stoptext
diff --git a/tex/context/extra/setup-qr.tex b/tex/context/extra/setup-qr.tex
new file mode 100644
index 000000000..466f5e68a
--- /dev/null
+++ b/tex/context/extra/setup-qr.tex
@@ -0,0 +1,77 @@
+% output=pdftex interface=en
+
+%D \module
+%D [ file=setup-qr,
+%D version=1997.07.22,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Quick Reference Document / Efficient,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This is a stripped down version of the good old quick
+%D reference document. This version is more compact and
+%D therefore better suited for local processing and printing.
+%D The slightly more fancy version can be fetched from the
+%D \CONTEXT\ web site.
+
+\dontcomplain \silentmode
+
+\unprotect
+
+\setupbodyfont
+ [9pt]
+
+\setuplayout
+ [\c!rugwit=1cm,
+ \c!kopwit=1cm,
+ \c!hoofd=0cm,
+ \c!voet=0cm,
+ \c!breedte=\v!midden,
+ \c!hoogte=\v!midden]
+
+\readfile{setupa} {} {}
+
+\stelsetupin
+ [\c!criterium=\v!alles,
+ \c!verwijzing=0]
+
+\setupframedtexts
+ [setuptext]
+ [\c!kader=\v!aan]
+
+\readfile{setupb} {} {}
+
+\starttekst
+
+\startmakeup[\v!standaard]
+ \setupalign[\v!midden]
+ \definedfont[RegularBold at 60pt]\setstrut
+ \strut Con\TeX t \par
+ \vskip24pt
+ \definedfont[RegularBold at 45pt]\setstrut
+ \startinterface dutch \strut commando's \par \stopinterface
+ \startinterface english \strut commands \par \stopinterface
+ \startinterface german \strut befehle \par \stopinterface
+ \startinterface czech \strut prikaz\'y \par \stopinterface
+ \startinterface italian \strut comandi \par \stopinterface
+ \startinterface romanian \strut comenzile \par \stopinterface
+ \vfill
+ \strut \currentdate \par
+ \startinterface dutch \strut nederlands \par \stopinterface
+ \startinterface english \strut english \par \stopinterface
+ \startinterface german \strut deutsch \par \stopinterface
+ \startinterface czech \strut \^cesk\'y \par \stopinterface
+ \startinterface italian \strut italiano \par \stopinterface
+ \startinterface romanian \strut rom\^{a}n\u{a} \par \stopinterface
+\stopmakeup
+
+\protect
+
+\placesetup
+
+\stoptekst \ No newline at end of file
diff --git a/tex/context/extra/showunic.tex b/tex/context/extra/showunic.tex
new file mode 100644
index 000000000..efdbf4d3a
--- /dev/null
+++ b/tex/context/extra/showunic.tex
@@ -0,0 +1,130 @@
+% author : Hans Hagen / PRAGMA-ADE
+% version : 2005-06-22
+
+% todo: take antiqua (has everything)
+
+% \tracetypescriptstrue
+
+\usetypescriptfile[type-cbg]
+
+% \preloadtypescriptstrue (default at pragma)
+
+% this font does not work ... why
+%
+% \starttypescript [serif] [hebrew] [default]
+% \definefontsynonym [Serif] [hclassic]
+% \loadmapline[=][hclassic < hclassic.pfb]
+% \stoptypescript
+
+\setuppapersize
+ [S6][S6]
+
+\setupbodyfont
+ [10pt]
+
+\setuplayout
+ [backspace=12pt,
+ topspace=12pt,
+ width=middle,
+ height=middle,
+ header=0pt,
+ footer=0pt]
+
+\setupcolors
+ [state=start]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=darkgray]
+
+\definetypeface [main-latin] [rm] [serif] [latin-modern] [default][encoding=texnansi]
+\definetypeface [main-latin] [tt] [mono] [latin-modern] [default][encoding=texnansi]
+
+\definetypeface [main-math] [rm] [serif] [latin-modern] [default][encoding=texnansi]
+\definetypeface [main-math] [tt] [mono] [latin-modern] [default][encoding=texnansi]
+\definetypeface [main-math] [mm] [math] [latin-modern] [default][encoding=default]
+
+\definetypeface [main-eastern] [rm] [serif] [latin-modern] [default][encoding=qx]
+\definetypeface [main-eastern] [tt] [mono] [latin-modern] [default][encoding=texnansi]
+
+\definetypeface [main-greek] [rm] [serif] [cbgreek] [default][encoding=default]
+\definetypeface [main-greek] [tt] [mono] [latin-modern] [default][encoding=texnansi]
+
+\definetypeface [main-cyrillic] [rm] [serif] [computer-modern] [default][encoding=t2a]
+\definetypeface [main-cyrillic] [tt] [mono] [latin-modern] [default][encoding=texnansi]
+
+% \definetypeface [main-hebrew] [rm] [serif] [hebrew] [default][encoding=default]
+% \definetypeface [main-hebrew] [tt] [mono] [latin-modern] [default][encoding=texnansi]
+
+% The \showunicodetable macro is defined in unic-run.tex.
+
+\starttext
+
+% latin: western / eastern
+
+\startstandardmakeup
+ \setupbodyfont[main-latin]
+ \centerbox{\scale[factor=max]{\showunicodetable{000}}}
+\stopstandardmakeup
+\startstandardmakeup
+ \setupbodyfont[main-eastern]
+ \centerbox{\scale[factor=max]{\showunicodetable{001}}}
+\stopstandardmakeup
+\startstandardmakeup
+ \setupbodyfont[main-latin]
+ \centerbox{\scale[factor=max]{\showunicodetable{002}}}
+\stopstandardmakeup
+
+% greek
+
+\startstandardmakeup
+ \setupbodyfont[main-greek]
+ \centerbox{\scale[factor=max]{\showunicodetable{003}}}
+\stopstandardmakeup
+
+% cyrillic
+
+\startstandardmakeup
+ \setupbodyfont[main-cyrillic]
+ \centerbox{\scale[factor=max]{\showunicodetable{004}}}
+\stopstandardmakeup
+
+% hebrew
+
+% \startstandardmakeup
+% \setupbodyfont[mainhebrew]
+% \centerbox{\scale[factor=max]{\showunicodetable{005}}}
+% \stopstandardmakeup
+
+% misc
+
+\startstandardmakeup
+ \setupbodyfont[main-latin]
+ \centerbox{\scale[factor=max]{\showunicodetable{030}}}
+\stopstandardmakeup
+\startstandardmakeup
+ \setupbodyfont[main-latin]
+ \centerbox{\scale[factor=max]{\showunicodetable{031}}}
+\stopstandardmakeup
+\startstandardmakeup
+ \setupbodyfont[main-latin]
+ \centerbox{\scale[factor=max]{\showunicodetable{032}}}
+\stopstandardmakeup
+
+% math
+
+\startstandardmakeup
+ \setupbodyfont[main-math]
+ \centerbox{\scale[factor=max]{\showunicodetable{033}}}
+\stopstandardmakeup
+\startstandardmakeup
+ \setupbodyfont[main-math]
+ \centerbox{\scale[factor=max]{\showunicodetable{034}}}
+\stopstandardmakeup
+\startstandardmakeup
+ \setupbodyfont[main-math]
+ \centerbox{\scale[factor=max]{\showunicodetable{039}}}
+\stopstandardmakeup
+
+\stoptext
diff --git a/tex/context/fonts/antykwa-math.lfg b/tex/context/fonts/antykwa-math.lfg
new file mode 100644
index 000000000..112a3f9a7
--- /dev/null
+++ b/tex/context/fonts/antykwa-math.lfg
@@ -0,0 +1,57 @@
+local msam = { name = "msam10.tfm", vector = "tex-ma" }
+local msbm = { name = "msbm10.tfm", vector = "tex-mb" }
+
+return {
+ name = "antykwa-math",
+ version = "1.00",
+ comment = "Goodies that complement antykwa math.",
+ author = "Hans, Mojca, Aditya",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "antt-rm.map",
+ "antt-mi.map",
+ "antt-sy.map",
+ "antt-ex.map",
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["antykwa-math"] = {
+ { name = "file:AntykwaTorunska-Regular", features = "virtualmath", main = true },
+ { name = "mi-anttri.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-anttri.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-anttrz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-anttr.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ },
+ ["antykwa-light-math"] = {
+ { name = "file:AntykwaTorunskaLight-Regular", features = "virtualmath", main = true },
+ { name = "mi-anttli.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-anttli.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-anttlz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-anttl.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ },
+ ["antykwa-cond-math"] = {
+ { name = "file:AntykwaTorunskaCond-Regular", features = "virtualmath", main = true },
+ { name = "mi-anttcri.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-anttcri.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-anttcrz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-anttcr.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ },
+ ["antykwa-lightcond-math"] = {
+ { name = "file:AntykwaTorunskaCondLight-Regular", features = "virtualmath", main = true },
+ { name = "mi-anttcli.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-anttcli.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-anttclz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-anttcl.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/charter-math.lfg b/tex/context/fonts/charter-math.lfg
new file mode 100644
index 000000000..9d061d1e0
--- /dev/null
+++ b/tex/context/fonts/charter-math.lfg
@@ -0,0 +1,28 @@
+return {
+ name = "charter-math",
+ version = "1.00",
+ comment = "Goodies that complement charter math.",
+ author = "Hans, Mojca, Aditya",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "mdbch.map",
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["charter-math"] = {
+ -- { name = "file:bchr8a", features = "virtualmath", main = true },
+ { name = "file:bchri8a", features = "virtualmath", main = true },
+ -- { name = "md-chr7m.tfm", vector = "tex-mr" },
+ { name = "md-chri7m.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "md-chri7m.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "md-chr7y.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
+ { name = "md-chr7v.tfm", vector = "tex-ex", extension = true },
+ -- { name = "md-chbma.tfm", vector = "tex-ma" },
+ -- { name = "md-chbmb.tfm", vector = "tex-mb" },
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/garamond-math.lfg b/tex/context/fonts/garamond-math.lfg
new file mode 100644
index 000000000..a082f8a9d
--- /dev/null
+++ b/tex/context/fonts/garamond-math.lfg
@@ -0,0 +1,28 @@
+return {
+ name = "garamond-math",
+ version = "1.00",
+ comment = "Goodies that complement garamond math.",
+ author = "Hans, Mojca, Aditya",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "mdugm.map",
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["garamond-math"] = {
+ -- { name = "file:ugmr8a", features = "virtualmath", main = true },
+ { name = "file:ugmri8a", features = "virtualmath", main = true },
+ -- { name = "md-gmr7m.tfm", vector = "tex-mr" },
+ { name = "md-gmri7m.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "md-gmri7m.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "md-gmr7y.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
+ { name = "md-gmr7v.tfm", vector = "tex-ex", extension = true },
+ -- { name = "md-gmmma.tfm", vector = "tex-ma" },
+ -- { name = "md-gmmmb.tfm", vector = "tex-mb" },
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/husayni.lfg b/tex/context/fonts/husayni.lfg
new file mode 100644
index 000000000..2cc4d6111
--- /dev/null
+++ b/tex/context/fonts/husayni.lfg
@@ -0,0 +1,178 @@
+local yes = "yes", "node"
+
+local basics = {
+ analyze = yes,
+ mode = "node",
+ language = "dflt",
+ script = "arab",
+}
+
+local analysis = {
+ ccmp = yes,
+ init = yes, medi = yes, fina = yes,
+}
+
+local regular = {
+ rlig = yes, calt = yes, salt = yes, anum = yes,
+ ss01 = yes, ss03 = yes, ss07 = yes, ss10 = yes, ss12 = yes, ss15 = yes, ss16 = yes,
+ ss19 = yes, ss24 = yes, ss25 = yes, ss26 = yes, ss27 = yes, ss31 = yes, ss34 = yes,
+ ss35 = yes, ss36 = yes, ss37 = yes, ss38 = yes, ss41 = yes, ss42 = yes, ss43 = yes,
+ js16 = yes,
+}
+
+local positioning = {
+ kern = yes, curs = yes, mark = yes, mkmk = yes,
+}
+
+local minimal_stretching = {
+ js11 = yes, js03 = yes,
+}
+
+local medium_stretching = {
+ js12=yes, js05=yes,
+}
+local maximal_stretching= {
+ js13 = yes, js05 = yes, js09 = yes,
+}
+
+local wide_all = {
+ js11 = yes, js12 = yes, js13 = yes, js05 = yes, js09 = yes,
+}
+
+local shrink = {
+ flts = yes, js17 = yes, ss05 = yes, ss11 = yes, ss06 = yes, ss09 = yes,
+}
+
+local default = {
+ basics, analysis, regular, positioning, -- xxxx = yes, yyyy = 2,
+}
+
+return {
+ name = "husayni",
+ version = "1.00",
+ comment = "Goodies that complement the Husayni font by Idris Samawi Hamid.",
+ author = "Idris Samawi Hamid and Hans Hagen",
+ featuresets = { -- here we don't have references to featuresets
+ default = {
+ default,
+ },
+ minimal_stretching = {
+ default, js11 = yes, js03 = yes,
+ },
+ medium_stretching = {
+ default, js12=yes, js05=yes,
+ },
+ maximal_stretching= {
+ default, js13 = yes, js05 = yes, js09 = yes,
+ },
+ wide_all = {
+ default, js11 = yes, js12 = yes, js13 = yes, js05 = yes, js09 = yes,
+ },
+ shrink = {
+ default, flts = yes, js17 = yes, ss05 = yes, ss11 = yes, ss06 = yes, ss09 = yes,
+ },
+ },
+ solutions = { -- here we have references to featuresets, so we use strings!
+ experimental = {
+ less = { "shrink" },
+ more = { "minimal_stretching", "medium_stretching", "maximal_stretching", "wide_all" },
+ },
+ },
+ stylistics = {
+ ss01 = "Allah, Muhammad",
+ ss02 = "ss01 + Allah_final",
+ ss03 = "level-1 stack over Jiim, initial entry only",
+ ss04 = "level-1 stack over Jiim, initial/medial entry",
+ ss05 = "multi-level Jiim stacking, initial/medial entry",
+ ss06 = "aesthetic Faa/Qaaf for FJ_mm, FJ_mf connection",
+ ss07 = "initial-entry stacking over Haa",
+ ss08 = "initial/medial stacking over Haa, minus HM_mf strings",
+ ss09 = "initial/medial Haa stacking plus HM_mf strings",
+ ss10 = "basic dipped Miim, initial-entry B_S-stack over Miim",
+ ss11 = "full dipped Miim, initial-entry B_S-stack over Miim",
+ ss12 = "XBM_im initial-medial entry B_S-stack over Miim",
+ ss13 = "full initial-medial entry B_S-stacked Miim",
+ ss14 = "initial entry, stacked Laam on Miim",
+ ss15 = "full stacked Laam-on-Miim",
+ ss16 = "initial entry, stacked Ayn-on-Miim",
+ ss17 = "full stacked Ayn-on-Miim",
+ ss18 = "LMJ_im already contained in ss03--05, may remove",
+ ss19 = "LM_im",
+ ss20 = "KLM_m, sloped Miim",
+ ss21 = "KLM_i_mm/LM_mm, sloped Miim",
+ ss22 = "filled sloped Miim",
+ ss23 = "LM_mm, non-sloped Miim",
+ ss24 = "BR_i_mf, BN_i_mf",
+ ss25 = "basic LH_im might merge with ss24",
+ ss26 = "full Yaa.final special strings: BY_if, BY_mf, LY_mf",
+ ss27 = "basic thin Miim.final",
+ ss28 = "full thin Miim.final to be moved to jsnn",
+ ss29 = "basic short Miim.final",
+ ss30 = "full short Miim.final to be moved to jsnn",
+ ss31 = "basic Raa.final strings: JR and SR",
+ ss32 = "basic Raa.final strings: JR, SR, and BR",
+ ss33 = "TtR to be moved to jsnn",
+ ss34 = "AyR style also available in jsnn",
+ ss35 = "full Kaaf contexts",
+ ss36 = "full Laam contexts",
+ ss37 = "Miim-Miim contexts",
+ ss38 = "basic dipped Haa, B_SH_mm",
+ ss39 = "full dipped Haa, B_S_LH_i_mm_Mf",
+ ss40 = "aesthetic dipped medial Haa",
+ ss41 = "high and low Baa strings",
+ ss42 = "diagonal entry",
+ ss43 = "initial alternates",
+ ss44 = "hooked final alif",
+ ss45 = "BMA_f",
+ ss46 = "BM_mm_alt, for JBM combinations",
+ ss47 = "Shaddah-<kasrah> combo",
+ ss48 = "Auto-sukuun",
+ ss49 = "No vowels",
+ ss50 = "Shaddah/MaaddahHamzah only",
+ ss51 = "No Skuun",
+ ss52 = "No Waslah",
+ ss53 = "No Waslah",
+ ss54 = "chopped finals",
+ ss55 = "idgham-tanwin",
+ js01 = "Raawide",
+ js02 = "Yaawide",
+ js03 = "Kaafwide",
+ js04 = "Nuunwide",
+ js05 = "Kaafwide Nuunwide Siinwide Baawide",
+ js06 = "final Haa wide",
+ js07 = "thin Miim",
+ js08 = "short Miim",
+ js09 = "wide Siin",
+ js10 = "thuluth-style initial Haa, final Miim, MRw_mf",
+ js11 = "level-1 stretching",
+ js12 = "level-2 stretching",
+ js13 = "level-3 stretching",
+ js14 = "final Alif",
+ js15 = "hooked final Alif",
+ js16 = "aesthetic medial Faa/Qaaf",
+ js17 = "fancy isol Haa after Daal, Raa, and Waaw",
+ js18 = "Laamwide, alternate substitution",
+ js19 = "level-4 stretching, only siin and Hhaa for basmalah",
+ js20 = "level-5 stretching, only siin and Hhaa for basmalah",
+ js21 = "Haa.final_alt2",
+ },
+ colorschemes = {
+ default = {
+ [1] = {
+ "Onedotabove", "Onedotbelow", "Twodotsabove", "Twodotsbelow", "Threedotsabove", "Twodotsabove.vrt", "Twodotsbelow.vrt", "Twodotsabove.KBA", "Threedotsabove.KBA", "Threedotsbelowinv", "Hamzahabove", "Hamzahbelow", "MaaddahHamzah.identity", "Waslah","Hamzah.initial_medial",
+ },
+ [2] = {
+ "Fathah", "Dammah", "Kasrah", "FathahVertical", "DammahInverted", "KasrahVertical", "FathahVertical.alt1", "KasrahVertical.alt1", "FathahTanwiin", "DammahTanwiin", "KasrahTanwiin", "Shaddah", "Sukuun", "MaaddahHamzah", "Jazm", "Maaddah", "DammahTanwiin_alt2", "DammahTanwiin_alt1", "FathahTanwiin_alt1", "KasrahTanwiin_alt1", "Fathah.mkmk", "Dammah.mkmk", "Kasrah.mkmk", "FathahVertical.mkmk", "DammahInverted.mkmk", "KasrahVertical.mkmk", "FathahTanwiin.mkmk", "DammahTanwiin.mkmk", "KasrahTanwiin.mkmk", "DammahTanwiin_alt1.mkmk", "Waawsmall", "Yaasmall", "FathahVertical.alt2", "Waawsmall.isol", "Yaasmall.isol", "FathahVertical.isol", "Hamzah","Shaddah.lillaah","FathahVertical.alt1_mkmk","Sifr.empty","Maaddah.small","FathahVertical.alt2","Waawsmall.isol","Yaasmall.isol","FathahTanwiin.alt1_mkmk","KasrahTanwiin.alt1_mkmk",
+ },
+ [3] = {
+ "Ttaa.waqf", "SsLY.waqf", "QLY.waqf", "Miim.waqf", "LA.waqf", "Jiim.waqf", "Threedotsabove.waqf", "Siin.waqf", "Ssaad.waqf", "Qaaf.waqf", "SsL.waqf", "QF.waqf", "SKTH.waqf", "WQFH.waqf", "Kaaf.waqf", "Ayn.ruku", "Miim.nuun_high", "Siin.Ssaad", "Nuunsmall", "emptydot_low", "emptydot_high", "Sifr.fill", "Miim.nuun_low", "Nuun.tanwiin",
+ },
+ [4] = {
+ "ZeroArabic.ayah", "OneArabic.ayah", "TwoArabic.ayah", "ThreeArabic.ayah", "FourArabic.ayah", "FiveArabic.ayah", "SixArabic.ayah", "SevenArabic.ayah", "EightArabic.ayah", "NineArabic.ayah", "FourFarsi.ayah", "FiveFarsi.ayah", "SixFarsi.ayah", "FourFarsi.urdu_ayah", "SevenFarsi.urdu_ayah","ZeroArabic.ayah_small","OneArabic.ayah_small","TwoArabic.ayah_small","ThreeArabic.ayah_small","FourArabic.ayah.001","FiveArabic.ayah_small","SixArabic.ayah_small","SevenArabic.ayah_small","EightArabic.ayah_small","NineArabic.ayah_small",
+ },
+ [5] = {
+ "Ayah", "Ayah.alt1", "Ayah.alt2", "Ayah.alt3", "Ayah2",
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/hvmath-math.lfg b/tex/context/fonts/hvmath-math.lfg
new file mode 100644
index 000000000..a7ec1ce89
--- /dev/null
+++ b/tex/context/fonts/hvmath-math.lfg
@@ -0,0 +1,24 @@
+return {
+ name = "hvmath-math",
+ version = "1.00",
+ comment = "Goodies that complement hvmath math.",
+ author = "Hans, Mojca, Aditya",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ -- todo
+ },
+ virtuals = {
+ ["hvmath-math"] = {
+ { name = "file:texgyreheros-regular.otf", features = "virtualmath", main = true },
+ { name = "hvrm108r.tfm", vector="tex-mr" },
+ { name = "hvmi10.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "hvmi10.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "hvsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
+ { name = "hvex10.tfm", vector = "tex-ex", extension = true },
+ { name = "hvam10.tfm", vector = "tex-ma" },
+ { name = "hvbm10.tfm", vector = "tex-mb" },
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/informal-math.lfg b/tex/context/fonts/informal-math.lfg
new file mode 100644
index 000000000..67fb73b39
--- /dev/null
+++ b/tex/context/fonts/informal-math.lfg
@@ -0,0 +1,22 @@
+return {
+ name = "informal-math",
+ version = "1.00",
+ comment = "Goodies that complement informal math.",
+ author = "Hans, Mojca, Aditya",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "original-micropress-informal.map",
+ },
+ virtuals = {
+ ["hvmath-math"] = {
+ { name = "file:ifrg.afm", features = "virtualmath", main = true },
+ { name = "ifrm10cm.tfm", vector="tex-mr" },
+ { name = "ifmi10", vector = "tex-mi", skewchar=0x7F },
+ { name = "ifmi10.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "ifsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
+ { name = "ifex10.tfm", vector = "tex-ex", extension = true },
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/iwona-math.lfg b/tex/context/fonts/iwona-math.lfg
new file mode 100644
index 000000000..f2fb69341
--- /dev/null
+++ b/tex/context/fonts/iwona-math.lfg
@@ -0,0 +1,57 @@
+local msam = { name = "msam10.tfm", vector = "tex-ma" }
+local msbm = { name = "msbm10.tfm", vector = "tex-mb" }
+
+return {
+ name = "iwona-math",
+ version = "1.00",
+ comment = "Goodies that complement iwona math.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "iwona-rm.map",
+ "iwona-mi.map",
+ "iwona-sy.map",
+ "iwona-ex.map",
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["iwona-math"] = {
+ { name = "file:Iwona-Regular", features = "virtualmath", main = true },
+ { name = "mi-iwonari.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-iwonari.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-iwonarz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-iwonar.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ },
+ ["iwona-light-math"] = {
+ { name = "file:IwonaLight-Regular", features = "virtualmath", main = true },
+ { name = "mi-iwonali.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-iwonali.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-iwonalz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-iwonal.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ },
+ ["iwona-medium-math"] = {
+ { name = "file:IwonaMedium-Regular", features = "virtualmath", main = true },
+ { name = "mi-iwonami.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-iwonami.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-iwonamz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-iwonam.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ },
+ ["iwona-heavy-math"] = {
+ { name = "file:IwonaHeavy-Regular", features = "virtualmath", main = true },
+ { name = "mi-iwonahi.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mi-iwonahi.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "sy-iwonahz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "ex-iwonah.tfm", vector = "tex-ex", extension = true } ,
+ msam,
+ msbm,
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/lm-math.lfg b/tex/context/fonts/lm-math.lfg
new file mode 100644
index 000000000..361b5bb86
--- /dev/null
+++ b/tex/context/fonts/lm-math.lfg
@@ -0,0 +1,230 @@
+-- rm-lmr5 : LMMathRoman5-Regular
+-- rm-lmbx5 : LMMathRoman5-Bold ]
+-- lmbsy5 : LMMathSymbols5-BoldItalic
+-- lmsy5 : LMMathSymbols5-Italic
+-- lmmi5 : LMMathItalic5-Italic
+-- lmmib5 : LMMathItalic5-BoldItalic
+
+local five = {
+ { name = "lmroman5-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr5.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi5.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi5.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy5.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam5.tfm", vector = "tex-ma" },
+ { name = "msbm5.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx5.tfm", vector = "tex-bf" } ,
+ { name = "lmroman5-bold", vector = "tex-bf" } ,
+ { name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm5.tfm", vector = "tex-fraktur", optional=true },
+}
+
+-- rm-lmr6 : LMMathRoman6-Regular
+-- rm-lmbx6 : LMMathRoman6-Bold
+-- lmsy6 : LMMathSymbols6-Italic
+-- lmmi6 : LMMathItalic6-Italic
+
+local six = {
+ { name = "lmroman6-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr6.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi6.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi6.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy6.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam5.tfm", vector = "tex-ma" },
+ { name = "msbm5.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx6.tfm", vector = "tex-bf" } ,
+ { name = "lmroman6-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm5.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb5.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+-- rm-lmr7 : LMMathRoman7-Regular
+-- rm-lmbx7 : LMMathRoman7-Bold
+-- lmbsy7 : LMMathSymbols7-BoldItalic
+-- lmsy7 : LMMathSymbols7-Italic
+-- lmmi7 : LMMathItalic7-Italic
+-- lmmib7 : LMMathItalic7-BoldItalic
+
+local seven = {
+ { name = "lmroman7-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr7.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi7.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi7.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy7.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam7.tfm", vector = "tex-ma" },
+ { name = "msbm7.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx7.tfm", vector = "tex-bf" } ,
+ { name = "lmroman7-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm7.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb7.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+-- rm-lmr8 : LMMathRoman8-Regular
+-- rm-lmbx8 : LMMathRoman8-Bold
+-- lmsy8 : LMMathSymbols8-Italic
+-- lmmi8 : LMMathItalic8-Italic
+
+local eight = {
+ { name = "lmroman8-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr8.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi8.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi8.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy8.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam7.tfm", vector = "tex-ma" },
+ { name = "msbm7.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx8.tfm", vector = "tex-bf" } ,
+ { name = "lmroman8-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm7.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb7.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+-- rm-lmr9 : LMMathRoman9-Regular
+-- rm-lmbx9 : LMMathRoman9-Bold
+-- lmsy9 : LMMathSymbols9-Italic
+-- lmmi9 : LMMathItalic9-Italic
+
+local nine = {
+ { name = "lmroman9-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr9.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi9.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi9.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy9.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx9.tfm", vector = "tex-bf" } ,
+ { name = "lmroman9-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans9-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono9-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm10.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+-- rm-lmr10 : LMMathRoman10-Regular
+-- rm-lmbx10 : LMMathRoman10-Bold
+-- lmbsy10 : LMMathSymbols10-BoldItalic
+-- lmsy10 : LMMathSymbols10-Italic
+-- lmex10 : LMMathExtension10-Regular
+-- lmmi10 : LMMathItalic10-Italic
+-- lmmib10 : LMMathItalic10-BoldItalic
+
+local ten = {
+ { name = "lmroman10-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr10.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi10.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi10.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx10.tfm", vector = "tex-bf" } ,
+ { name = "lmroman10-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm10.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+local ten_bold = {
+ { name = "lmroman10-bold.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr10.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmib10.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmib10.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmbsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+-- copied from roman:
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx10.tfm", vector = "tex-bf" } ,
+ { name = "lmroman10-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm10.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+-- rm-lmr12 : LMMathRoman12-Regular
+-- rm-lmbx12 : LMMathRoman12-Bold
+-- lmmi12 : LMMathItalic12-Italic
+
+local twelve = {
+ { name = "lmroman12-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr12.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi12.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi12.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx12.tfm", vector = "tex-bf" } ,
+ { name = "lmroman12-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans12-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono12-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm10.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+-- rm-lmr17 : LMMathRoman17-Regular
+
+local seventeen = {
+ { name = "lmroman17-regular.otf", features = "virtualmath", main = true },
+ { name = "rm-lmr12.tfm", vector = "tex-mr-missing" } ,
+ { name = "lmmi12.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "lmmi12.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "lmsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ -- { name = "rm-lmbx12.tfm", vector = "tex-bf" } ,
+ { name = "lmroman12-bold.otf", vector = "tex-bf" } ,
+ { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
+ { name = "lmsans17-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono17-regular.otf", vector = "tex-tt", optional=true },
+ { name = "eufm10.tfm", vector = "tex-fraktur", optional=true },
+ { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true },
+}
+
+return {
+ name = "lm-math",
+ version = "1.00",
+ comment = "Goodies that complement latin modern math.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "lm-math.map",
+ "lm-rm.map",
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["lmroman5-math"] = five,
+ ["lmroman6-math"] = six,
+ ["lmroman7-math"] = seven,
+ ["lmroman8-math"] = eight,
+ ["lmroman9-math"] = nine,
+ ["lmroman10-math"] = ten,
+ ["lmroman10-boldmath"] = ten_bold,
+ ["lmroman12-math"] = twelve,
+ ["lmroman17-math"] = seventeen,
+ }
+ }
+}
diff --git a/tex/context/fonts/lucida-math.lfg b/tex/context/fonts/lucida-math.lfg
new file mode 100644
index 000000000..83c3c272d
--- /dev/null
+++ b/tex/context/fonts/lucida-math.lfg
@@ -0,0 +1,320 @@
+fonts.enc.math["lbr-ma"] = {
+ [0x025CB] = 0x00, -- circle
+ [0x025CF] = 0x01, -- blackcircle
+ [0x025A1] = 0x02, -- square
+ [0x025A0] = 0x03, -- blacksquare
+ [0x025B3] = 0x04, -- triangleup
+ [0x025B2] = 0x05, -- blacktriangleup
+ [0x025BD] = 0x06, -- triangledown
+ [0x025BC] = 0x07, -- blacktriangledown
+ [0x02B28] = 0x08, -- lozenge
+ [0x02B27] = 0x09, -- blacklozenge
+ [0x02B29] = 0x0A, -- blackdiamond
+ [0x02571] = 0x0B, -- upright
+ [0x02572] = 0x0C, -- downright
+ [0x022E4] = 0x0D, -- squareimageofnoteq
+ [0x022E5] = 0x0E, -- squareoriginalofnoteq
+ [0x02A4F] = 0x0F, -- dblsquareunion
+ [0x02A4E] = 0x10, -- dblsquareintersection
+ [0x02A64] = 0x11, -- zdomainantirestriction
+ [0x02A65] = 0x12, -- zrangeantirestriction
+ [0x022EE] = 0x13, -- verticalellipsis
+ [0x022EF] = 0x14, -- ellipsis
+ [0x022F0] = 0x15, -- uprightellipsis
+ [0x022F1] = 0x16, -- downrightellipsis
+ [0x022D5] = 0x17, -- equalparallel
+
+ [0x0225B] = 0x1A, -- stareq
+ [0x00127] = 0x1B, -- hbar
+ [0x022F6] = 0x1C, -- barelementof
+ [0x02209] = 0x1D, -- notelementof
+ [0x022FD] = 0x1E, -- barcontains
+ [0x0220C] = 0x1F, -- notcontain
+ [0x02204] = 0x20, -- nexists
+ [0x02194] = 0x21, -- leftrightarrow
+ [0x02195] = 0x22, -- updownarrow
+ [0x0219E] = 0x23, -- leftleftarrow
+ [0x0219F] = 0x24, -- upuparrow
+ [0x021A0] = 0x25, -- rightrightarrow
+-- [0x00026] = 0x26, -- amperand
+ [0x021A1] = 0x27, -- downdownarrow
+ [0x021A2] = 0x28, -- leftarrowtail
+ [0x021A3] = 0x29, -- rightarrowtail
+ [0x021A4] = 0x2A, -- leftarrowbar
+ [0x021A6] = 0x2B, -- rightarrowbar
+ [0x021A5] = 0x2C, -- uparrowbar
+-- [0x02212] = 0x2D, -- minus
+-- [0x0002D] = 0x2D, -- minus
+ [0x021A7] = 0x2E, -- downarrowbar
+ [0x021E4] = 0x2F, -- barleftarrow
+ [0x021E5] = 0x30, -- barrightarrow
+
+ [0x021E0] = 0x38, -- dashleftarrow
+ [0x021E1] = 0x39, -- dashuparrow
+ [0x021E2] = 0x3A, -- dashrightarrow
+ [0x021E3] = 0x3B, -- dashdownarrow
+ [0x021A9] = 0x3C, -- hookleftarrow
+-- [0x0003D] = 0x3D, -- equalto
+ [0x021AA] = 0x3E, -- hookrightarrow
+ [0x021AB] = 0x3F, -- looparrowleft
+ [0x021AC] = 0x40, -- looparrowright
+ [0x1D538] = 0x41, -- A (blackboard A)
+ [0x1D539] = 0x42, -- B
+ [0x02102] = 0x43, -- C
+ [0x1D53B] = 0x44, -- D
+ [0x1D53C] = 0x45, -- E
+ [0x1D53D] = 0x46, -- F
+ [0x1D53E] = 0x47, -- G
+ [0x0210D] = 0x48, -- H
+ [0x1D540] = 0x49, -- I
+ [0x1D541] = 0x4A, -- J
+ [0x1D542] = 0x4B, -- K
+ [0x1D543] = 0x4C, -- L
+ [0x1D544] = 0x4D, -- M
+ [0x02115] = 0x4E, -- N
+ [0x1D546] = 0x4F, -- O
+ [0x02119] = 0x50, -- P
+ [0x0211A] = 0x51, -- Q
+ [0x0211D] = 0x52, -- R
+ [0x1D54A] = 0x53, -- S
+ [0x1D54B] = 0x54, -- T
+ [0x1D54C] = 0x55, -- U
+ [0x1D54D] = 0x56, -- V
+ [0x1D54E] = 0x57, -- W
+ [0x1D54F] = 0x58, -- X
+ [0x1D550] = 0x59, -- Y
+ [0x02124] = 0x5A, -- Z (blackboard Z)
+ [0x0231C] = 0x5B, -- ulcorner
+ [0x0231D] = 0x5C, -- urcorner
+ [0x0231E] = 0x5D, -- llcorner
+ [0x0231F] = 0x5E, -- lrcorner
+ [0x02225] = 0x5F, -- parallel, Vert, lVert, rVert, arrowvert
+ [0x021D5] = 0x60, -- Updownarrow
+ [0x021D4] = 0x61, -- Leftrightarrow
+ [0x021D6] = 0x62, -- Upleftarrow
+ [0x021D7] = 0x63, -- Uprightarrow
+ [0x021D9] = 0x64, -- Downleftarrow
+ [0x021D8] = 0x65, -- Downrightarrow
+ [0x021CD] = 0x66, -- nLeftarrow
+ [0x021CE] = 0x67, -- nLeftrightarrow
+ [0x021CF] = 0x68, -- nRightarrow
+-- [0x021CE] = 0x69, -- nLeftrightarrow -- what's the difference between this and 0x0067[0x021CE]
+ [0x021DA] = 0x6A, -- Lleftarrow
+ [0x1D55C] = 0x6B, -- k \Bbbk (blackboard k)
+ [0x021DB] = 0x6C, -- Rrightarrow
+ [0x021C4] = 0x6D, -- rlarrow
+ [0x021C6] = 0x6E, -- lrarrow
+ [0x021C5] = 0x6F, -- udarrow
+-- [0x021C5] = 0x70, -- duarrow
+ [0x021C7] = 0x71, -- llarrow
+ [0x021C8] = 0x72, -- uuarrow
+ [0x021C9] = 0x73, -- rrarrow
+ [0x021CA] = 0x74, -- ddarrow
+ [0x021BE] = 0x75, -- rupharpoon
+ [0x021BF] = 0x76, -- lupharpoon
+ [0x021C2] = 0x77, -- rdownharpoon
+ [0x021C3] = 0x78, -- ldownharpoon
+ [0x021CB] = 0x79, -- lrharpoon
+ [0x021CC] = 0x7A, -- rlharpoon
+ [0x021B0] = 0x7B, -- upthenleftarrow
+-- [0x00000] = 0x7C, -- part
+ [0x021B1] = 0x7D, -- upthenrightarrow
+-- [0x00000] = 0x7E, -- part
+ [0x02276] = 0x7F, -- ltgt
+ [0x021B2] = 0x81, -- downthenleftarrow
+ [0x021B3] = 0x82, -- downthenrightarrow
+ [0x02B0E] = 0x83, -- rightthendownarrow
+ [0x02B10] = 0x84, -- leftthendownarrow
+ [0x02B0F] = 0x85, -- rightthenuparrow
+ [0x02B11] = 0x86, -- leftthenuparrow
+ [0x021B6] = 0x87, -- leftarcarrow
+ [0x021B7] = 0x88, -- rightarcarrow
+ [0x0293D] = 0x89, -- leftarcarrowplus
+ [0x0293C] = 0x8A, -- rightarcarrowminus
+ [0x021BA] = 0x8B, -- anticlockwise
+ [0x021BB] = 0x8C, -- clockwise
+
+ [0x02260] = 0x94, -- noteq
+ [0x02262] = 0x95, -- notidentical
+ [0x02241] = 0x96, -- nottilde
+ [0x02244] = 0x97, -- notasymptoticallyequal
+ [0x02249] = 0x98, -- notalmostequal
+ [0x02247] = 0x99, -- notapproximatelyeq
+ [0x0226E] = 0x9A, -- nless
+ [0x0226F] = 0x9B, -- ngtr
+ [0x02270] = 0x9C, -- nleq
+ [0x02271] = 0x9D, -- ngeq
+ [0x022E6] = 0x9E, -- lnsim
+ [0x022E7] = 0x9F, -- gnsim
+ [0x02605] = 0xAB, -- black star
+ [0x02713] = 0xAC, -- check
+ [0x02277] = 0xC5, -- gtlt
+ [0x02284] = 0xC6, -- nsubsetof
+ [0x02285] = 0xC7, -- nsupsetof
+ [0x02288] = 0xC8, -- nsubseteq
+ [0x02289] = 0xC9, -- nsupseteq
+
+ [0x0228A] = 0xCC, -- subsetneq
+ [0x0228B] = 0xCD, -- supsetneq
+
+-- [0x0228A] = 0xD0, -- subsetneq
+-- [0x0228B] = 0xD1, -- supsetneq
+
+ [0x02270] = 0xD6, -- nleq
+ [0x02271] = 0xD7, -- ngeq
+
+ [0x02268] = 0xDC, -- lneqq
+ [0x02269] = 0xDD, -- gneqq
+
+ [0x022E6] = 0xE0, -- lnsim
+ [0x02219] = 0xE1, -- bullet
+ [0x022E7] = 0xE2, -- gnsim
+
+ [0x02280] = 0xE5, -- nprec
+ [0x02281] = 0xE6, -- nsucc
+
+ [0x022E8] = 0xEB, -- precnsim
+ [0x022E9] = 0xEC, -- succnsim
+
+ [0x022EA] = 0xEF, -- nnormalsub
+ [0x022EB] = 0xF0, -- ncontainnormalsub
+ [0x022EC] = 0xF1, -- nnormalsubeq
+ [0x022ED] = 0xF2, -- ncontainnormalsubeq
+
+ [0x02226] = 0xF7, -- nparallel
+ [0x022AC] = 0xF8, -- nvdash
+ [0x022AE] = 0xF9, -- nVdash
+ [0x022AD] = 0xFA, -- nvDash
+ [0x022AF] = 0xFB, -- nVDash
+}
+
+fonts.enc.math["lbr-mb"] = {
+ [0x00393] = 0x00, -- Gamma
+ [0x00394] = 0x01, -- Delta
+ [0x00398] = 0x02, -- Theta
+ [0x0039B] = 0x03, -- Lambda
+ [0x0039E] = 0x04, -- Xi
+ [0x003A0] = 0x05, -- Pi
+ [0x003A3] = 0x06, -- Sigma
+ [0x003A5] = 0x07, -- Upsilon
+ [0x003A6] = 0x08, -- Phi
+ [0x003A8] = 0x09, -- Psi
+ [0x003A9] = 0x0A, -- Omega
+ [0x0210F] = 0x9D, -- hslash
+ [0x02127] = 0x92, -- mho
+ [0x02132] = 0x90, -- Finv
+ [0x02136] = 0x95, -- beth
+ [0x02137] = 0x96, -- gimel
+ [0x02138] = 0x97, -- daleth
+ [0x02141] = 0x91, -- Game
+ [0x02201] = 0x94, -- complement
+ [0x0226C] = 0xF2, -- between
+ [0x0227C] = 0xE4, -- preccurlyeq
+ [0x0227D] = 0xE5, -- succcurlyeq
+ [0x0229D] = 0xCC, -- circleddash
+ [0x022A8] = 0xD6, -- vDash
+ [0x022AA] = 0xD3, -- Vvdash
+ [0x022B8] = 0xC7, -- multimap
+ [0x022BB] = 0xD2, -- veebar
+ [0x022C7] = 0xF7, -- divideontimes
+ [0x022C9] = 0xCF, -- ltimes
+ [0x022CA] = 0xCE, -- rtimes
+ [0x022CB] = 0xD0, -- leftthreetimes
+ [0x022CC] = 0xD1, -- rightthreetimes
+ [0x022D6] = 0xDC, -- lessdot
+ [0x022D7] = 0xDD, -- gtrdot
+ [0x022DA] = 0xE8, -- lesseqgtr
+ [0x022DB] = 0xE9, -- gtreqless
+ [0x022DE] = 0xE6, -- curlyeqprec
+ [0x022DF] = 0xE7, -- curlyeqsucc
+ [0x024C7] = 0xC9, -- circledR
+ [0x024C8] = 0xCA, -- circledS
+ [0x025B6] = 0xF1, -- blacktriangleright
+ [0x025B8] = 0xF0, -- blacktriangleleft
+ [0x02720] = 0xCB, -- maltese
+ [0x02A7D] = 0xE0, -- leqslant
+ [0x02A7E] = 0xE1, -- geqslant
+ [0x02A85] = 0xDA, -- lessapprox
+ [0x02A86] = 0xDB, -- gtrapprox
+ [0x02A8B] = 0xEA, -- lesseqqgtr
+ [0x02A8C] = 0xEB, -- gtreqqless
+ [0x02A95] = 0xE2, -- eqslantless
+ [0x02A96] = 0xE3, -- eqslantgtr
+ [0x02AB7] = 0xEC, -- precapprox
+ [0x02AB8] = 0xED, -- succapprox
+ [0x02AC5] = 0xEE, -- subseteqq
+ [0x02AC6] = 0xEF, -- supseteqq
+ [0x12035] = 0xC8, -- backprime
+ [0x1D718] = 0x9B, -- varkappa
+}
+
+fonts.enc.math["lbr-sy"] = {
+ [0x021CB] = 0x8D, -- leftrightharpoons
+ [0x021CC] = 0x8E, -- rightleftharpoons
+ [0x02214] = 0x89, -- dotplus
+ [0x02220] = 0x8B, -- angle
+ [0x02221] = 0x8C, -- measuredangle
+ [0x02222] = 0x8D, -- sphericalangle
+ [0x02234] = 0x90, -- therefore
+ [0x02235] = 0x91, -- because
+ [0x0223D] = 0x24, -- backsim
+ [0x02242] = 0x99, -- eqsim
+ [0x0224A] = 0x9D, -- approxeq
+ [0x0224E] = 0xC7, -- Bumpeq
+ [0x02252] = 0xCB, -- fallingdotseq
+ [0x02253] = 0xCC, -- risingdotseq
+ [0x02256] = 0xCF, -- eqcirc
+ [0x02257] = 0xD0, -- circeq
+ [0x0225C] = 0xD5, -- triangleq
+ [0x02266] = 0xDA, -- leqq
+ [0x02267] = 0xDB, -- geqq
+ [0x02272] = 0xDC, -- lesssim
+ [0x02273] = 0xDD, -- gtrsim
+ [0x02276] = 0xDE, -- lessgtr
+ [0x02277] = 0xDF, -- gtrless
+ [0x0227E] = 0xE0, -- precsim
+ [0x0227F] = 0xE1, -- succsim
+ [0x0228F] = 0xE4, -- sqsubset
+ [0x02290] = 0xE5, -- sqsupset
+ [0x0229A] = 0xE6, -- circledcirc
+ [0x0229B] = 0xE7, -- circledast
+ [0x0229E] = 0xEA, -- boxplus
+ [0x0229F] = 0xEB, -- boxminus
+ [0x022A0] = 0xEC, -- boxtimes
+ [0x022A1] = 0xED, -- boxdot
+ [0x022A7] = 0xEE, -- models
+ [0x022A9] = 0xF0, -- Vdash
+ [0x022BC] = 0xF6, -- barwedge
+ [0x022CE] = 0x85, -- curlyvee
+ [0x022CF] = 0x84, -- curlywedge
+ [0x022D0] = 0xF8, -- Subset
+ [0x022D1] = 0xF9, -- Supset
+ [0x02300] = 0x53, -- varnothing
+ [0x025CA] = 0x05, -- lozenge
+}
+
+fonts.enc.math["lbr-sy"] = table.merged(fonts.enc.math["tex-sy"],fonts.enc.math["lbr-sy"])
+
+return {
+ name = "lucida-math",
+ version = "1.00",
+ comment = "Goodies that complement lucida math.",
+ author = "Aditya, Hans, Mojca",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "lucida.map",
+ },
+ virtuals = {
+ ["lucida-math"] = {
+ { name = "file:lbr.afm", features = "virtualmath", main = true },
+ { name = "hlcrim.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "hlcrim.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "hlcry.tfm", vector = "lbr-sy", skewchar=0x30, parameters = true },
+ { name = "hlcrv.tfm", vector = "tex-ex", extension = true },
+ { name = "hlcra.tfm", vector = "lbr-ma" },
+ { name = "hlcrm.tfm", vector = "lbr-mb" },
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/mathtimes-math.lfg b/tex/context/fonts/mathtimes-math.lfg
new file mode 100644
index 000000000..951cb6838
--- /dev/null
+++ b/tex/context/fonts/mathtimes-math.lfg
@@ -0,0 +1,24 @@
+return {
+ name = "mathtimes-math",
+ version = "1.00",
+ comment = "Goodies that complement mathtimes math.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "mathtime.map",
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["mathtimes-math"] = {
+ { name = "file:texgyretermes-regular.otf", features = "virtualmath", main = true },
+ { name = "mtmiz.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "mtmiz.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "mtsyn.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
+ { name = "mtex.tfm", vector = "tex-ex", extension = true },
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/px-math.lfg b/tex/context/fonts/px-math.lfg
new file mode 100644
index 000000000..b261f0701
--- /dev/null
+++ b/tex/context/fonts/px-math.lfg
@@ -0,0 +1,24 @@
+return {
+ name = "px-math",
+ version = "1.00",
+ comment = "Goodies that complement px math.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "mkiv-px.map",
+ },
+ virtuals = {
+ ["px-math"] = {
+ { name = "texgyrepagella-regular.otf", features = "virtualmath", main = true },
+ { name = "rpxr.tfm", vector = "tex-mr" } ,
+ { name = "rpxmi.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "rpxpplri.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "pxsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "pxex.tfm", vector = "tex-ex", extension = true } ,
+ { name = "pxsya.tfm", vector = "tex-ma" },
+ { name = "pxsyb.tfm", vector = "tex-mb" },
+ },
+ }
+ }
+}
diff --git a/tex/context/fonts/symbol-math.lfg b/tex/context/fonts/symbol-math.lfg
new file mode 100644
index 000000000..d37a3b1ee
--- /dev/null
+++ b/tex/context/fonts/symbol-math.lfg
@@ -0,0 +1,17 @@
+return {
+ name = "symbol-math",
+ version = "1.00",
+ comment = "Goodies that complement symbol math.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["symbol-math"] = {
+ { name = "rsfs10", features = "virtualmath", main = true }, -- tfm name needed
+ },
+ }
+ }
+}
diff --git a/tex/context/fonts/tx-math.lfg b/tex/context/fonts/tx-math.lfg
new file mode 100644
index 000000000..f1d532773
--- /dev/null
+++ b/tex/context/fonts/tx-math.lfg
@@ -0,0 +1,24 @@
+return {
+ name = "tx-math",
+ version = "1.00",
+ comment = "Goodies that complement tx math.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "mkiv-tx.map",
+ },
+ virtuals = {
+ ["tx-math"] = {
+ { name = "texgyretermes-regular.otf", features = "virtualmath", main = true },
+ { name = "rtxr.tfm", vector = "tex-mr" } ,
+ { name = "rtxptmri.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "rtxmi.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "txsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } ,
+ { name = "txex.tfm", vector = "tex-ex", extension = true } ,
+ { name = "txsya.tfm", vector = "tex-ma" },
+ { name = "txsyb.tfm", vector = "tex-mb" },
+ }
+ }
+ }
+}
diff --git a/tex/context/fonts/utopia-math.lfg b/tex/context/fonts/utopia-math.lfg
new file mode 100644
index 000000000..4074aa886
--- /dev/null
+++ b/tex/context/fonts/utopia-math.lfg
@@ -0,0 +1,28 @@
+return {
+ name = "utopia-math",
+ version = "1.00",
+ comment = "Goodies that complement utopia math.",
+ author = "Hans, Mojca, Aditya",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ mapfiles = {
+ "mdput.map",
+ "mkiv-base.map",
+ },
+ virtuals = {
+ ["utopia-math"] = {
+ -- { name = "file:putr8a", features = "virtualmath", main = true },
+ { name = "file:putri8a", features = "virtualmath", main = true },
+ -- { name = "md-utr7m.tfm", vector = "tex-mr" },
+ { name = "md-utri7m.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "md-utri7m.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "md-utr7y.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
+ { name = "md-utr7v.tfm", vector = "tex-ex", extension = true },
+ -- { name = "md-utbma.tfm", vector = "tex-ma" },
+ -- { name = "md-utbmb.tfm", vector = "tex-mb" },
+ { name = "msam10.tfm", vector = "tex-ma" },
+ { name = "msbm10.tfm", vector = "tex-mb" },
+ }
+ }
+ }
+}
diff --git a/tex/context/foxet/fe-bryson.xml b/tex/context/foxet/fe-bryson.xml
new file mode 100644
index 000000000..28646b65f
--- /dev/null
+++ b/tex/context/foxet/fe-bryson.xml
@@ -0,0 +1,12 @@
+<?xml version='1.0'?>
+<fe:sample xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng' origin='Bill Bryson'>
+Imagine trying to live in a world dominated by dihydrogen oxide, a
+compound that has no taste or smell and is so viable in its properties
+that it is generally benign but at other times swiftly lethal.
+Depending on its state, it can scald you or freeze you. In the
+presence of certain organic molecules it can form carbonic acids so
+nasty that they can strip the leaves from trees and eat the faces off
+statuary. In bulk, when agitated, it can strike with a fury that no
+human edifice could withstand. Even for those who have learned to live
+with it, it is often murderous substance. We call it water.
+</fe:sample>
diff --git a/tex/context/foxet/fe-ward.xml b/tex/context/foxet/fe-ward.xml
new file mode 100644
index 000000000..05f774265
--- /dev/null
+++ b/tex/context/foxet/fe-ward.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0'?>
+<fe:sample xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng' origin='Peter Ward'>
+The Earth, as a habitat for animal life, is in old age and
+has a fatal illness. Several, in fact. It would be happening
+whether humans had ever evolved or not. But our presence is
+like the effect of an old-age patient who smokes many packs
+of cigarettes per day - and we humans are the cigarettes.
+</fe:sample>
diff --git a/tex/context/foxet/fe-zapf.xml b/tex/context/foxet/fe-zapf.xml
new file mode 100644
index 000000000..faf9a0831
--- /dev/null
+++ b/tex/context/foxet/fe-zapf.xml
@@ -0,0 +1,14 @@
+<?xml version='1.0'?>
+<fe:sample xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng' origin='Hermann Zapf'>
+Coming back to the use of typefaces in electronic
+publishing: many of the new typographers receive their
+knowledge and information about the rules of typography
+from books, from computer magazines or the instruction
+manuals which they get with the purchase of a PC or
+software. There is not so much basic instruction, as of
+now, as there was in the old days, showing the differences
+between good and bad typographic design. Many people are
+just fascinated by their PC's tricks, and think that a
+widely<fe:compound/>praised program, called up on the
+screen, will make everything automatic from now on.
+</fe:sample>
diff --git a/tex/context/foxet/fo-0101.fo b/tex/context/foxet/fo-0101.fo
new file mode 100644
index 000000000..197c5834c
--- /dev/null
+++ b/tex/context/foxet/fo-0101.fo
@@ -0,0 +1,17 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='default'>
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='default'>
+ <fo:flow flow-name='xsl-region-body'/>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0102.fo b/tex/context/foxet/fo-0102.fo
new file mode 100644
index 000000000..9adcf917e
--- /dev/null
+++ b/tex/context/foxet/fo-0102.fo
@@ -0,0 +1,25 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='default'>
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:declarations>
+ <fe:definecolor name='red' r='.6'/>
+ <fe:definecolor name='green' g='.6'/>
+ <fe:definecolor name='blue' b='.6'/>
+ <fe:definefontsynonym name='mono' file='lmtt10' encoding='texnansi'/>
+ </fo:declarations>
+
+ <fo:page-sequence master-reference='default'>
+ <fo:flow flow-name='xsl-region-body'/>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0103.fo b/tex/context/foxet/fo-0103.fo
new file mode 100644
index 000000000..95d0d4769
--- /dev/null
+++ b/tex/context/foxet/fo-0103.fo
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='default'>
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:declarations>
+ <fo:color-profile src="url('myprofile.xml')" color-profile-name="myprofile"/>
+ </fo:declarations>
+
+ <fo:page-sequence master-reference='default'>
+ <fo:flow flow-name='xsl-region-body'/>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0201.fo b/tex/context/foxet/fo-0201.fo
new file mode 100644
index 000000000..f524cfd09
--- /dev/null
+++ b/tex/context/foxet/fo-0201.fo
@@ -0,0 +1,22 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='1cm'>
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' line-height='18pt'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0301.fo b/tex/context/foxet/fo-0301.fo
new file mode 100644
index 000000000..e0b8a6fc4
--- /dev/null
+++ b/tex/context/foxet/fo-0301.fo
@@ -0,0 +1,56 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='1cm' fe:option='fit'>
+ <fo:region-body background-color='lightgray'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block-container space-after.optimum='12pt' fe:tracing='true'>
+ <fo:block>
+ before<fo:character character='@'/>after
+ </fo:block>
+ <fo:block>
+ before<fo:character character='@' vertical-align='super'/>after
+ before<fo:character character='@' vertical-align='sub' />after
+ before<fo:character character='@' vertical-align='-3pt' />after
+ before<fo:character character='@' vertical-align='+3pt' />after
+ </fo:block>
+ <fo:block>
+ before<fo:character character='@' glyph-orientation-horizontal='0deg' />after
+ before<fo:character character='@' glyph-orientation-horizontal='90deg' />after
+ before<fo:character character='@' glyph-orientation-horizontal='180deg'/>after
+ before<fo:character character='@' glyph-orientation-horizontal='270deg'/>after
+ </fo:block>
+ <fo:block>
+ before<fo:character character='@' glyph-orientation-horizontal='0deg' vertical-align='super'/>after
+ before<fo:character character='@' glyph-orientation-horizontal='90deg' vertical-align='super'/>after
+ before<fo:character character='@' glyph-orientation-horizontal='180deg' vertical-align='super'/>after
+ before<fo:character character='@' glyph-orientation-horizontal='270deg' vertical-align='super'/>after
+ </fo:block>
+ <fo:block>
+ before<fo:character character='@' glyph-orientation-horizontal='0deg' vertical-align='3pt'/>after
+ before<fo:character character='@' glyph-orientation-horizontal='90deg' vertical-align='3pt'/>after
+ before<fo:character character='@' glyph-orientation-horizontal='180deg' vertical-align='3pt'/>after
+ before<fo:character character='@' glyph-orientation-horizontal='270deg' vertical-align='3pt'/>after
+ </fo:block>
+ <fo:block>
+ before<fo:character character='@' vertical-align='super' text-altitude='10pt'/>after
+ before<fo:character character='@' vertical-align='super' text-altitude='20pt'/>after
+ before<fo:character character='@' vertical-align='100%' text-altitude='20pt'/>after
+ before<fo:character character='@' vertical-align='sub' text-depth='10pt' />after
+ before<fo:character character='@' vertical-align='sub' text-depth='20pt' />after
+ before<fo:character character='@' vertical-align='-100%' text-depth='20pt' />after
+ </fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0601.fo b/tex/context/foxet/fo-0601.fo
new file mode 100644
index 000000000..1e291f278
--- /dev/null
+++ b/tex/context/foxet/fo-0601.fo
@@ -0,0 +1,29 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test'
+ margin-top='1cm'
+ margin-bottom='2cm'
+ margin-left='3cm'
+ margin-right='4cm'>
+ <fo:region-before extent='1cm' background-color='red' />
+ <fo:region-after extent='1cm' background-color='green' />
+ <fo:region-start extent='1cm' background-color='blue' />
+ <fo:region-end extent='1cm' background-color='yellow'/>
+ <fo:region-body margin='2cm' background-color='gray' />
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0602.fo b/tex/context/foxet/fo-0602.fo
new file mode 100644
index 000000000..36e864767
--- /dev/null
+++ b/tex/context/foxet/fo-0602.fo
@@ -0,0 +1,27 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test'
+ margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
+ <fo:region-body margin='2cm' background-color='gray' />
+ <fo:region-before extent='1cm' background-color='red' precedence='true'/>
+ <fo:region-after extent='1cm' background-color='green' />
+ <fo:region-start extent='1cm' background-color='blue' />
+ <fo:region-end extent='1cm' background-color='yellow'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0603.fo b/tex/context/foxet/fo-0603.fo
new file mode 100644
index 000000000..268249d3e
--- /dev/null
+++ b/tex/context/foxet/fo-0603.fo
@@ -0,0 +1,26 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test'
+ margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
+ <fo:region-body margin='2cm' background-color='gray' />
+ <fo:region-before extent='1cm' background-color='red' />
+ <fo:region-after extent='1cm' background-color='green' precedence='true'/>
+ <fo:region-start extent='1cm' background-color='blue' />
+ <fo:region-end extent='1cm' background-color='yellow'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0604.fo b/tex/context/foxet/fo-0604.fo
new file mode 100644
index 000000000..891198ee0
--- /dev/null
+++ b/tex/context/foxet/fo-0604.fo
@@ -0,0 +1,26 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test'
+ margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
+ <fo:region-body margin='2cm' background-color='gray' />
+ <fo:region-before extent='1cm' background-color='red' precedence='true'/>
+ <fo:region-after extent='1cm' background-color='green' precedence='true'/>
+ <fo:region-start extent='1cm' background-color='blue' />
+ <fo:region-end extent='1cm' background-color='yellow'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0611.fo b/tex/context/foxet/fo-0611.fo
new file mode 100644
index 000000000..70f495fb6
--- /dev/null
+++ b/tex/context/foxet/fo-0611.fo
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml' n='15'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0612.fo b/tex/context/foxet/fo-0612.fo
new file mode 100644
index 000000000..4b3de6940
--- /dev/null
+++ b/tex/context/foxet/fo-0612.fo
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm' column-count='2' column-gap='24pt'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml' n='25'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0613.fo b/tex/context/foxet/fo-0613.fo
new file mode 100644
index 000000000..f478a571d
--- /dev/null
+++ b/tex/context/foxet/fo-0613.fo
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='1.25cm'>
+ <fo:region-body margin='0cm' column-count='3' column-gap='12pt'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml' n='15'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0621.fo b/tex/context/foxet/fo-0621.fo
new file mode 100644
index 000000000..554fcc4a0
--- /dev/null
+++ b/tex/context/foxet/fo-0621.fo
@@ -0,0 +1,106 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root
+ xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='any' margin='2cm'>
+ <fe:message>setting up simple page master 'any'</fe:message>
+ <fo:region-body background-color='darkgray' margin-top='2cm' margin-bottom='2cm' padding='.5cm'/>
+ <fo:region-before background-color='darkgray' extent='1cm'/>
+ <fo:region-after background-color='darkgray' extent='1cm'/>
+ </fo:simple-page-master>
+ <fo:simple-page-master master-name='first-page' margin='2cm'>
+ <fe:message>setting up simple page master 'first-page'</fe:message>
+ <fo:region-body background-color='red' margin='2cm' padding='.5cm'/>
+ <fo:region-before background-color='red' extent='1cm'/>
+ <fo:region-after background-color='red' extent='1cm'/>
+ </fo:simple-page-master>
+ <fo:simple-page-master master-name='left-page' margin='2cm'>
+ <fe:message>setting up simple page master 'left-page'</fe:message>
+ <fo:region-body background-color='green' margin='2cm' padding='.5cm'/>
+ <fo:region-before background-color='green' extent='1cm'/>
+ <fo:region-after background-color='green' extent='1cm'/>
+ </fo:simple-page-master>
+ <fo:simple-page-master master-name='right-page' margin='2cm'>
+ <fe:message>setting up simple page master 'right-page'</fe:message>
+ <fo:region-body background-color='blue' margin='2cm' padding='.5cm'/>
+ <fo:region-before background-color='blue' extent='1cm'/>
+ <fo:region-after background-color='blue' extent='1cm'/>
+ </fo:simple-page-master>
+ <fo:simple-page-master master-name='blank-page' margin='2cm'>
+ <fe:message>setting up simple page master 'blank-page'</fe:message>
+ <fo:region-body background-color='black' margin='2cm' padding='.5cm'/>
+ <fo:region-before background-color='black' extent='1cm'/>
+ <fo:region-after background-color='black' extent='1cm'/>
+ </fo:simple-page-master>
+ <fo:simple-page-master master-name='odd' margin='2cm'>
+ <fe:message>setting up simple page master 'odd'</fe:message>
+ <fo:region-body background-color='cyan' margin='2cm' padding='.5cm' margin-right='2cm'/>
+ <fo:region-before background-color='cyan' extent='1cm'/>
+ <fo:region-after background-color='cyan' extent='1cm'/>
+ </fo:simple-page-master>
+ <fo:simple-page-master master-name='even' margin='2cm'>
+ <fe:message>setting up simple page master 'even'</fe:message>
+ <fo:region-body background-color='magenta' margin='2cm' padding='.5cm' margin-left='2cm'/>
+ <fo:region-before background-color='magenta' extent='1cm'/>
+ <fo:region-after background-color='magenta' extent='1cm'/>
+ </fo:simple-page-master>
+ <fo:simple-page-master master-name='rest' margin='2cm'>
+ <fe:message>setting up simple page master 'rest'</fe:message>
+ <fo:region-body background-color='yellow' margin='2cm' padding='.5cm'/>
+ <fo:region-before background-color='yellow' extent='1cm'/>
+ <fo:region-after background-color='yellow' extent='1cm'/>
+ </fo:simple-page-master>
+
+ <fo:page-sequence-master master-name='demo'>
+ <fe:message>setting up page sequence master 'demo'</fe:message>
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference page-position='first' master-reference='first-page'/>
+ <fo:conditional-page-master-reference page-position='last' master-reference='blank-page'/>
+ <fo:conditional-page-master-reference page-position='any' master-reference='odd' odd-or-even='odd'/>
+ <fo:conditional-page-master-reference page-position='any' master-reference='even' odd-or-even='even'/>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+ <fo:page-sequence-master master-name='omed'>
+ <fe:message>setting up page sequence master 'omed'</fe:message>
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference page-position='first' master-reference='first-page'/>
+ <fo:conditional-page-master-reference page-position='last' master-reference='blank-page'/>
+ <fo:conditional-page-master-reference page-position='any' master-reference='odd' odd-or-even='even'/>
+ <fo:conditional-page-master-reference page-position='any' master-reference='even' odd-or-even='odd'/>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='any'>
+ <fe:message>starting page sequence 'any'</fe:message>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml' n='15'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+ <fo:page-sequence master-reference='demo' force-page-count='end-on-odd'>
+ <fe:message>starting page sequence 'demo'</fe:message>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-bryson.xml' n='30'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+ <fo:page-sequence master-reference='omed' force-page-count='end-on-odd'>
+ <fe:message>starting page sequence 'omed'</fe:message>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-ward.xml' n='30'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0641.fo b/tex/context/foxet/fo-0641.fo
new file mode 100644
index 000000000..9dbb90870
--- /dev/null
+++ b/tex/context/foxet/fo-0641.fo
@@ -0,0 +1,25 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm' background-color='gray' fe:background-height='1cm' background-image="url('hacker.jpg')" clip='rect(1cm,1cm,1cm,1cm)' />
+ <fo:region-before extent='2cm' background-color='red' fe:background-height='1cm' background-image="url('hacker.jpg')" background-repeat='repeat-x' />
+ <fo:region-after extent='2cm' background-color='green' fe:background-height='2cm' background-image="url('hacker.jpg')" background-repeat='repeat-y' />
+ <fo:region-start extent='2cm' background-color='blue' fe:background-height='1cm' background-image="url('hacker.jpg')" background-repeat='no-repeat'/>
+ <fo:region-end extent='2cm' background-color='yellow' fe:background-height='2cm' background-image="url('hacker.jpg')" background-repeat='repeat' />
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0642.fo b/tex/context/foxet/fo-0642.fo
new file mode 100644
index 000000000..8f646509c
--- /dev/null
+++ b/tex/context/foxet/fo-0642.fo
@@ -0,0 +1,27 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'
+ background-color='gray'
+ background-image="url('hacker.jpg')"
+ background-position-horizontal='10%'
+ background-position-vertical='20%'
+ background-repeat='no-repeat'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0643.fo b/tex/context/foxet/fo-0643.fo
new file mode 100644
index 000000000..9595d4438
--- /dev/null
+++ b/tex/context/foxet/fo-0643.fo
@@ -0,0 +1,27 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'
+ background-color='gray'
+ background-image="url('hacker.jpg')"
+ background-position-horizontal='center'
+ background-position-vertical='center'
+ background-repeat='no-repeat'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0644.fo b/tex/context/foxet/fo-0644.fo
new file mode 100644
index 000000000..a408661e0
--- /dev/null
+++ b/tex/context/foxet/fo-0644.fo
@@ -0,0 +1,27 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'
+ xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'
+ background-color='gray'
+ background-image="url('hacker.jpg')"
+ background-position-horizontal='3cm'
+ background-position-vertical='5cm'
+ background-repeat='no-repeat'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0650.fo b/tex/context/foxet/fo-0650.fo
new file mode 100644
index 000000000..54fd7c128
--- /dev/null
+++ b/tex/context/foxet/fo-0650.fo
@@ -0,0 +1,26 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test'
+ margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
+ <fo:region-body margin='.5cm' background-color='gray' fe:z-order='above' />
+ <fo:region-before extent='1cm' background-color='red' />
+ <fo:region-after extent='1cm' background-color='green' />
+ <fo:region-start extent='1cm' background-color='blue' />
+ <fo:region-end extent='1cm' background-color='yellow'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0651.fo b/tex/context/foxet/fo-0651.fo
new file mode 100644
index 000000000..319592ba8
--- /dev/null
+++ b/tex/context/foxet/fo-0651.fo
@@ -0,0 +1,26 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test'
+ margin-top='1cm' margin-bottom='2cm' margin-left='3cm' margin-right='4cm'>
+ <fo:region-body margin='.5cm' background-color='gray' fe:z-order='below' />
+ <fo:region-before extent='1cm' background-color='red' />
+ <fo:region-after extent='1cm' background-color='green' />
+ <fo:region-start extent='1cm' background-color='blue' />
+ <fo:region-end extent='1cm' background-color='yellow'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0701.fo b/tex/context/foxet/fo-0701.fo
new file mode 100644
index 000000000..fabbe0722
--- /dev/null
+++ b/tex/context/foxet/fo-0701.fo
@@ -0,0 +1,39 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master margin='2cm' master-name='default'>
+ <fo:region-body background-color='darkgray'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='default' fe:tracing='true'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block-container absolute-position='absolute' height='2cm' width='3cm' left='1cm' top='1cm'>
+ <fo:block>Test 1</fo:block>
+ </fo:block-container>
+ <fo:block-container absolute-position='absolute' height='2cm' left='1cm' top='6cm'>
+ <fo:block>Test 2</fo:block>
+ </fo:block-container>
+ <fo:block-container absolute-position='absolute' height='2cm' left='1cm' top='11cm' right='4cm'>
+ <fo:block>Test 3</fo:block>
+ </fo:block-container>
+ <fo:block-container absolute-position='absolute' height='2cm' width='3cm' right='1cm' bottom='1cm'>
+ <fo:block>Test 4</fo:block>
+ </fo:block-container>
+ <fo:block-container absolute-position='absolute' width='3cm' right='1cm' bottom='6cm'>
+ <fo:block>Test 5</fo:block>
+ </fo:block-container>
+ <fo:block-container absolute-position='absolute' width='3cm' right='1cm' bottom='11cm' top='7cm'>
+ <fo:block>Test 6</fo:block>
+ </fo:block-container>
+ <fo:block-container absolute-position='absolute' left='20%' right='20%' top='20%' bottom='20%'>
+ <fo:block>Test 7</fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0801.fo b/tex/context/foxet/fo-0801.fo
new file mode 100644
index 000000000..b18c4282f
--- /dev/null
+++ b/tex/context/foxet/fo-0801.fo
@@ -0,0 +1,55 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123' format='n'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block id='format n'>digits: <fo:page-number/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123' format='a'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block id='format a'>characters: <fo:page-number/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123' format='i'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block id='format i'>romannumerals: <fo:page-number/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123' format='-[(n)]-'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block id='complex format'>complex format: <fo:page-number/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block id='no format'>no format: <fo:page-number/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block-container space-after='12pt' id='y'>
+ <fo:block>digits: <fo:page-number-citation ref-id='format n'/> </fo:block>
+ <fo:block>characters: <fo:page-number-citation ref-id='format a'/> </fo:block>
+ <fo:block>romannumerals: <fo:page-number-citation ref-id='format i'/> </fo:block>
+ <fo:block>complex format: <fo:page-number-citation ref-id='complex format'/> </fo:block>
+ <fo:block>no format: <fo:page-number-citation ref-id='no format'/> </fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0901.fo b/tex/context/foxet/fo-0901.fo
new file mode 100644
index 000000000..05011269b
--- /dev/null
+++ b/tex/context/foxet/fo-0901.fo
@@ -0,0 +1,58 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='.5cm'>
+ <fo:region-body margin='.5cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block-container font-style='italic'>
+ <fo:block font-family='Times'>times</fo:block>
+ <fo:block font-family='Helvetica'>helvetica</fo:block>
+ <fo:block font-family='Courier'>courier</fo:block>
+ </fo:block-container>
+ <fo:block-container font-style='italic'>
+ <fo:block font-family='Times'>times</fo:block>
+ <fo:block font-family='Helvetica'>helvetica</fo:block>
+ <fo:block font-family='Courier'>courier</fo:block>
+ </fo:block-container>
+ <fo:block-container font-weight='bold'>
+ <fo:block font-family='Times'>times</fo:block>
+ <fo:block font-family='Helvetica'>helvetica</fo:block>
+ <fo:block font-family='Courier'>courier</fo:block>
+ </fo:block-container>
+ <fo:block-container font-style='italic'>
+ <fo:block font-family='Times'>times</fo:block>
+ <fo:block font-family='Helvetica'>helvetica</fo:block>
+ <fo:block font-family='Courier'>courier</fo:block>
+ </fo:block-container>
+ <fo:block-container font-style='italic' font-weight='bold' font-size='large'>
+ <fo:block font-family='Times'>large</fo:block>
+ <fo:block font-family='Helvetica'>large</fo:block>
+ <fo:block font-family='Courier'>large</fo:block>
+ </fo:block-container>
+ <fo:block-container font-style='italic' font-weight='bold' font-size='x-large'>
+ <fo:block font-family='Times'>x-large</fo:block>
+ <fo:block font-family='Helvetica'>x-large</fo:block>
+ <fo:block font-family='Courier'>x-large</fo:block>
+ </fo:block-container>
+ <fo:block-container font-style='italic' font-weight='bold' font-size='xx-large'>
+ <fo:block font-family='Times'>xx-large</fo:block>
+ <fo:block font-family='Helvetica'>xx-large</fo:block>
+ <fo:block font-family='Courier'>xx-large</fo:block>
+ </fo:block-container>
+ <fo:block-container font-style='italic' font-weight='bold' font-size='350%'>
+ <fo:block font-family='Times'>times</fo:block>
+ <fo:block font-family='Helvetica'>helvetica</fo:block>
+ <fo:block font-family='Courier'>courier</fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-0902.fo b/tex/context/foxet/fo-0902.fo
new file mode 100644
index 000000000..ebaa06651
--- /dev/null
+++ b/tex/context/foxet/fo-0902.fo
@@ -0,0 +1,33 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='.5cm'>
+ <fo:region-body margin='.5cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block-container>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:block-container>
+ <fo:block-container line-height='40pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:block-container>
+ <fo:block-container line-height='180%'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:block-container>
+ <fo:block-container line-height='1.2'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:block-container>
+ <fo:block-container line-height='normal'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1001.fo b/tex/context/foxet/fo-1001.fo
new file mode 100644
index 000000000..3733265fd
--- /dev/null
+++ b/tex/context/foxet/fo-1001.fo
@@ -0,0 +1,63 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block-container fe:tracing='true'>
+ <fo:block>a test line d 10pt</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
+ <fo:block>a test line d 5pt</fo:block>
+ <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
+ <fo:block>a test line d 4pt</fo:block>
+ <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
+ <fo:block>a test line d d d</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
+ <fo:block>a test line r d d</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
+ <fo:block>a test line d r d</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
+ <fo:block>a test line r r d</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='5pt' space-before.conditionality='discard'/>
+ <fo:block>a test line d d r</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
+ <fo:block>a test line r d r</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='4pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
+ <fo:block>a test line d r r</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='discard'/>
+ <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
+ <fo:block>a test line r r r</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='4pt' space-before.conditionality='retain' />
+ <fo:block space-before.optimum='5pt' space-before.conditionality='retain' />
+ <fo:block>a test line d r r force</fo:block>
+ <fo:block space-before.optimum='10pt' space-before.conditionality='discard' space-before.precedence='force'/>
+ <fo:block space-before.optimum='4pt' space-before.conditionality='retain' space-before.precedence='force'/>
+ <fo:block space-before.optimum='5pt' space-before.conditionality='retain' space-before.precedence='force'/>
+ <fo:block>a test line</fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1002.fo b/tex/context/foxet/fo-1002.fo
new file mode 100644
index 000000000..cc0ea8100
--- /dev/null
+++ b/tex/context/foxet/fo-1002.fo
@@ -0,0 +1,31 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block start-indent='1cm'>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ <fo:block start-indent='1cm' end-indent='1cm'>
+ <fe:include url='fe-zapf.xml'/>
+ <fo:block start-indent='1cm' end-indent='1cm'>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ <fo:block end-indent='1cm'>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1003.fo b/tex/context/foxet/fo-1003.fo
new file mode 100644
index 000000000..4c416e02d
--- /dev/null
+++ b/tex/context/foxet/fo-1003.fo
@@ -0,0 +1,31 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block start-indent='1cm' text-indent='3cm'>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ <fo:block start-indent='1cm' end-indent='1cm' text-indent='1cm'>
+ <fe:include url='fe-zapf.xml'/>
+ <fo:block start-indent='1cm' end-indent='1cm' text-indent='1cm'>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ <fo:block end-indent='1cm' text-indent='3cm'>
+ <fe:include url='fe-zapf.xml'/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1004.fo b/tex/context/foxet/fo-1004.fo
new file mode 100644
index 000000000..1c057edd7
--- /dev/null
+++ b/tex/context/foxet/fo-1004.fo
@@ -0,0 +1,35 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='2cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' initial-page-number='123'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block-container space-before.optimum='12pt'>
+ <fo:block>
+ before<fo:inline space-start='10pt' >inbetween</fo:inline>after
+ </fo:block>
+ <fo:block>
+ before<fo:inline space-end='10pt'>inbetween</fo:inline>after
+ </fo:block>
+ <fo:block>
+ before<fo:inline space-start='10pt' space-end='10pt'>inbetween</fo:inline>after
+ </fo:block>
+ <fo:block>
+ before<fo:inline space-start='-10pt' space-end='-10pt'>inbetween</fo:inline>after
+ </fo:block>
+ <fo:block>
+ before<fo:inline space-start='250%' space-end='250%'>inbetween</fo:inline>after
+ </fo:block>
+ </fo:block-container>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1101.fo b/tex/context/foxet/fo-1101.fo
new file mode 100644
index 000000000..f6953d522
--- /dev/null
+++ b/tex/context/foxet/fo-1101.fo
@@ -0,0 +1,63 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='1cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' fe:tracing='true'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ <fo:list-block
+ space-before.optimum='12pt'
+ space-after.optimum='12pt'>
+ <fo:list-item>
+ <fo:list-item-label start-indent='10pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='10pt'>
+ <fo:block>[b]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body end-indent='0pt'>
+ <fo:list-block>
+ <fo:list-item>
+ <fo:list-item-label start-indent='40pt'>
+ <fo:block>[bb]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ <fo:list-block
+ start-indent='1cm'
+ end-indent='1cm'
+ space-before.optimum='12pt'
+ space-after.optimum='12pt'>
+ <fo:list-item>
+ <fo:list-item-label start-indent='10pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1102.fo b/tex/context/foxet/fo-1102.fo
new file mode 100644
index 000000000..f8d5a9df3
--- /dev/null
+++ b/tex/context/foxet/fo-1102.fo
@@ -0,0 +1,128 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='1cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' fe:tracing='true' fe:testgrid='true'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:list-block
+ space-before.optimum='12pt'
+ space-after.optimum='12pt'
+ provisional-distance-between-starts='2cm'
+ provisional-label-separation='.5cm'>
+ <!-- fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='50pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='50pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='50pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='50pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='50pt' end-indent='50pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='50pt' end-indent='50pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='50pt' end-indent='50pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='50pt' end-indent='50pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='10%' end-indent='75%'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='35%' end-indent='10%'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item -->
+ <fo:list-item>
+ <fo:list-item-label start-indent='1cm' end-indent='10cm'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='4cm' end-indent='1cm'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='1cm' end-indent='label-end()'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='5cm' end-indent='1cm'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='1cm' end-indent='10cm'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='body-start()' end-indent='2cm'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='1cm' end-indent='label-end()'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='body-start()' end-indent='3cm'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1103.fo b/tex/context/foxet/fo-1103.fo
new file mode 100644
index 000000000..245f3ff0e
--- /dev/null
+++ b/tex/context/foxet/fo-1103.fo
@@ -0,0 +1,85 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='1cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' fe:tracing='true'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:list-block space-before.optimum='12pt' space-after.optimum='12pt'
+ start-indent='10pt' end-indent='10pt'>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='10pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='10pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='10pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='10pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='10pt' end-indent='10pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='0pt' end-indent='0pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='0pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='10pt' end-indent='10pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ <fo:list-item>
+ <fo:list-item-label start-indent='10pt' end-indent='0pt'>
+ <fo:block>[a]</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent='10pt' end-indent='10pt'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1104.fo b/tex/context/foxet/fo-1104.fo
new file mode 100644
index 000000000..6867e772f
--- /dev/null
+++ b/tex/context/foxet/fo-1104.fo
@@ -0,0 +1,28 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='1cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:list-block>
+ <fo:list-item>
+ <fo:list-item-label>
+ <fo:block text-align="center">X</fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/foxet/fo-1201.fo b/tex/context/foxet/fo-1201.fo
new file mode 100644
index 000000000..364dcb214
--- /dev/null
+++ b/tex/context/foxet/fo-1201.fo
@@ -0,0 +1,40 @@
+<?xml version='1.0'?>
+
+<!-- foxet test file - Hans Hagen - PRAGMA ADE - www.pragma-ade.com -->
+
+<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fe='http://www.pragma-ade.com/schemas/foxet.rng'>
+
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name='test' margin='2cm'>
+ <fo:region-body margin='1cm'/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+
+ <fo:page-sequence master-reference='test' fe:tracing='true'>
+ <fo:flow flow-name='xsl-region-body'>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ <fo:block>
+ test
+ <fo:inline position='static' font-size='600%'>S</fo:inline>
+ <fo:inline position='static' font-size='400%'>S</fo:inline>
+ <fo:inline position='static' font-size='500%'>S</fo:inline>
+ <fo:inline position='fixed' right='2cm' bottom='2cm' font-size='600%'>F</fo:inline>
+ <fo:inline position='fixed' right='2cm' top='2cm' font-size='400%'>F</fo:inline>
+ <fo:inline position='fixed' left='2cm' bottom='2cm' font-size='500%'>F</fo:inline>
+ <fo:inline position='absolute' right='1cm' bottom='1cm' font-size='600%'>A</fo:inline>
+ <fo:inline position='absolute' right='1cm' top='1cm' font-size='400%'>A</fo:inline>
+ <fo:inline position='absolute' left='1cm' bottom='1cm' font-size='500%'>A</fo:inline>
+ <fo:inline position='relative' right='2mm' bottom='2mm' font-size='600%'>R</fo:inline>
+ <fo:inline position='relative' right='2mm' top='2mm' font-size='400%'>R</fo:inline>
+ <fo:inline position='relative' left='2mm' bottom='2mm' font-size='500%'>R</fo:inline>
+ test
+ <fo:inline position='static' font-size='600%'>Q</fo:inline>
+ <fo:inline position='relative' right='2mm' bottom='2mm' font-size='600%'>Q</fo:inline>
+ <fo:inline position='relative' right='2mm' top='2mm' font-size='400%'>Q</fo:inline>
+ <fo:inline position='relative' left='2mm' bottom='2mm' font-size='500%'>Q</fo:inline>
+ </fo:block>
+ <fo:block><fe:include url='fe-zapf.xml'/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+
+</fo:root>
diff --git a/tex/context/interface/cont-cs.xml b/tex/context/interface/cont-cs.xml
new file mode 100644
index 000000000..d67833041
--- /dev/null
+++ b/tex/context/interface/cont-cs.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="cs" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="uvnitr"/>
+ <cd:constant type="vnejsi"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="center"/>
+ <cd:constant type="normalni"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="ano"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="center"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="nikdy"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="vzdy"/>
+ <cd:constant type="prvni"/>
+ <cd:constant type="dalsi"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="normalni"/>
+ <cd:constant type="liche"/>
+ <cd:constant type="sude"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="normalni"/>
+ <cd:constant type="tucne"/>
+ <cd:constant type="sklonene"/>
+ <cd:constant type="tucnesklonene"/>
+ <cd:constant type="opis"/>
+ <cd:constant type="kap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="datum"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="cislostranky"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="hrana"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="vrsek"/>
+ <cd:constant type="zahlavi"/>
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="upati"/>
+ <cd:constant type="spodek"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="male"/>
+ <cd:constant type="velke"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="instalacejazyka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="mezerovani">
+ <cd:constant type="zhustene" default="yes"/>
+ <cd:constant type="siroky"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="vetavlevo">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="vetavpravo">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="podvetavlevo">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="podvetavpravo">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="citovatvlevo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citovatvpravo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citacevlevo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citacevpravo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middlespeech">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="rightspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="limittext">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="datum">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="compoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="leftcompoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rightcompoundhyphen">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="implicitni">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="nastavjazyk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="instalacejazyka" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="jazyk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="hlavnijazyk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="prelozit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="uzijkodovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="uzijspeciality"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="definujvystup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="nastavvystup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definujprostredizakladnihofontu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="implicitni"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="male">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="velky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="meziradkovamezera">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="nastavprostredizakladnihofontu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="definujprostredizakladnihofontu" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="definujprostredizakladnihofontu" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="definujprostredizakladnihofontu" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="ukazpostredizakladnihofontu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavzakladnifont" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definujzakladnifont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="implicitni"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definujzakladnifont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="nastavzakladnifont" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="nastavzakladnifont" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definujzakladnifont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="nastavzakladnifont" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="nastavzakladnifont" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="ukazzakladnifont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavzakladnifont" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="nastavzakladnifont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="pravidelne"/>
+ <cd:constant type="antikva"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="podpora"/>
+ <cd:constant type="bezserifu"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="opis"/>
+ <cd:constant type="strojopis"/>
+ <cd:constant type="rukopisne"/>
+ <cd:constant type="kaligraficke"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="prepninazakladnifont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="pravidelne"/>
+ <cd:constant type="antikva"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="podpora"/>
+ <cd:constant type="bezserifu"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="opis"/>
+ <cd:constant type="strojopis"/>
+ <cd:constant type="rukopisne"/>
+ <cd:constant type="kaligraficke"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="male"/>
+ <cd:constant type="velke"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definujfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="nastavbarvu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="nastavbarvy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="globalne"/>
+ <cd:constant type="lokalne"/>
+ </cd:parameter>
+ <cd:parameter name="konverze">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="vzdy"/>
+ <cd:constant type="nikdy"/>
+ </cd:parameter>
+ <cd:parameter name="redukce">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="barvatextu">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="vse"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="zadny"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definujbarvu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="barva"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="barva"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="sedabarva"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="ukazbarvu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definujpaletu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="nastavpaletu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definujskupinubarev"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="seda"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="ukazpaletu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontalne"/>
+ <cd:constant type="vertikalne"/>
+ <cd:constant type="jmeno"/>
+ <cd:constant type="hodnota"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="ukazskupinubarev"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontalne"/>
+ <cd:constant type="vertikalne"/>
+ <cd:constant type="jmeno"/>
+ <cd:constant type="hodnota"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="porovnejpaletu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="porovnejskupinubarev"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="ukazupravu"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definetype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavtype" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="nastavtype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="mezera">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="sklonene"/>
+ <cd:constant type="normalni"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="opis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="pis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tex"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="arg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definujopis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="nastavopis" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavopis" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="nastavopis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="soubor"/>
+ <cd:constant type="typing"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="mezera">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="sklonene"/>
+ <cd:constant type="normalni"/>
+ <cd:constant type="prikazy" version="mkiv"/>
+ <cd:constant type="barevne"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="iprikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vprikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="cprikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standardni"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="sudamarginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="lichyokraj">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prazdny">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="standardni"/>
+ <cd:constant type="pulradku"/>
+ <cd:constant type="radek"/>
+ </cd:parameter>
+ <cd:parameter name="escape">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="mezera">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="tab">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="odsadpristi">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="paleta">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="range">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="radky">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="hyphenated"/>
+ </cd:parameter>
+ <cd:parameter name="prazdne">
+ <cd:constant type="ano"/>
+ <cd:constant type="vse"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="cislovani">
+ <cd:constant type="radek"/>
+ <cd:constant type="soubor"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="ne"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="typing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="opissoubor"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="nastavpoznamkypodcarou"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="konverze">
+ <cd:constant type="cisla"/>
+ <cd:constant type="pismena"/>
+ <cd:constant type="Pismena"/>
+ <cd:constant type="rimskecislice"/>
+ <cd:constant type="Rimskecislice"/>
+ </cd:parameter>
+ <cd:parameter name="zpusob">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="stranka"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="sloupce"/>
+ <cd:constant type="firstcolumn"/>
+ <cd:constant type="lastcolumn"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="linka">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostsloupcu">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostokraje">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ciselnyprikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textovyprikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="tolerantni"/>
+ <cd:constant type="striktni"/>
+ <cd:constant type="velmistriktni"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="styltextu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barvatextu">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="interakce">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="nastavdefinicipoznamekpodcarou"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="nastavpopisy" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="poznamkapodcarou"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="footnotetext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="poznamka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="umistilokalnipoznamkypodcarou"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavpoznamkypodcarou" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="umistipoznamkypodcarou"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavpoznamkypodcarou" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="nastavpodtrzeni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="tloustkalinky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetspodku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetvrsku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="barvalinky">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="rimskecislice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Rimskecislice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="cisla"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="znak"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Znak"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="znaky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Znaky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mesic"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="MESIC"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="vsedniden"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="VSEDNIDEN"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nastavkapitalky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="titul">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="SLOVO"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="SLOVA"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Slovo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Slova"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="roztazene"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definujsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definujobrazeksymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="nastavexterniobrazy" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="symbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="nastavsadusymbolu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="uzijsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="ukazsadusymbolu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="definujkonverzi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="konvertujcislo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="nastavtexthlavicky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="nastavtextpopisku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="texthlavicky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="textpopisku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavmarginalnilinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="uroven">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="tloustkalinky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="marginalnilinka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="marginalnilinka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavsirkucary"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavoramovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vyska">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="fixne"/>
+ <cd:constant type="lokalne"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="autosirka">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="sila"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="zadny"/>
+ <cd:constant type="prekryv"/>
+ <cd:constant type="implicitni"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="podlehloubky"/>
+ <cd:constant type="visici"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="nivy"/>
+ <cd:constant type="nizko"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="drzet"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="zadny"/>
+ <cd:constant type="prazdne"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="globalne"/>
+ <cd:constant type="lokalne"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="spodek">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vrsek">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ramecek">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="prekryv"/>
+ </cd:parameter>
+ <cd:parameter name="rameceknahore">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="ramecekdole">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="ramecekvlevo">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="ramecekvpravo">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="offsetramecku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hloubkaramecku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rohramecku">
+ <cd:constant type="zaobleny"/>
+ <cd:constant type="pravouhly"/>
+ </cd:parameter>
+ <cd:parameter name="polomerramecku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="barvaramecku">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pozadi">
+ <cd:constant type="rastr"/>
+ <cd:constant type="barevne"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="popredi"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rastrpozadi">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="barvapozadi">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="offsetpozadi">
+ <cd:constant type="ramecek"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hloubkapozadi">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rohpozadi">
+ <cd:constant type="zaobleny"/>
+ <cd:constant type="pravouhly"/>
+ </cd:parameter>
+ <cd:parameter name="polomerpozadi">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="roh">
+ <cd:constant type="zaobleny"/>
+ <cd:constant type="pravouhly"/>
+ </cd:parameter>
+ <cd:parameter name="polomer">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prazdne">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="tloustkalinky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="oramovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="zaramovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="tenkelinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="nastavtenkelinky" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavtenkelinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="meziradkovamezera">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="barvapozadi">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="tloustkalinky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pozadi">
+ <cd:constant type="barevne"/>
+ </cd:parameter>
+ <cd:parameter name="barvapozadi">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vlasovalinka"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="tenkalinka"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definujoramovanytext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavoramovanetexty" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definujoramovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavoramovanetexty" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavoramovanetexty"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vnitrni">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="korekceradku">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="korekcehloubky">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="standardni"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="odsazovani">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="oramovanytext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="zadny"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavoramovanetexty" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="oramovanytext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavoramovanetexty" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="pozadi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="pozadi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavpozadi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="levyoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pravyoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetvrsku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetspodku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vyplnovelinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavvyplnovelinky" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vyplnenytext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavvyplnovelinky" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavvyplnovelinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sirka">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="meziradkovamezera">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vyplnovyradek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavvyplnoveradky" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavvyplnoveradky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavtextovelinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="naokraji"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barvalinky">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="textovalinka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="textovalinka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="cernalinka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavcernelinky" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="cernelinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="nastavcernelinky" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavcernelinky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definujprekryv"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="uzijmodul"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="reset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="zadnytest"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="nastavsystem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rozliseni">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="soubor">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="adresar">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="nahodne">
+ <cd:constant type="normalni"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="reset"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="nizky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="vysoky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="nivy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="ukazramecek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="hrana"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zarovnanovlevo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zarovnanovpravo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zarovnanonastred"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="slovovpravo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="naokraj"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="nadruhyokraj"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="vlevo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="vpravo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="ininner"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inouter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="sloupec"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="ukazpodpery"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="ukaznastaveni"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="ukazvzhled"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="marginalnitext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="nizko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="nastavmarginalniblok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="naokraji"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="vrsek">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="spodek">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="tref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="pref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="oref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="nekde"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="nastrane"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="odkaznatext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="odkaznastranu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="odkaz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="uzijodkazy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definujodkaz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definujformatodkazu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="popisek">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="jdidolu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="bilemisto"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zadnebilemisto"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="mezera"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="tvrdemezery"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="emptylines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zadnamezera"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zhustene"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="nastavpopisy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="vzor">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="titleleft">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="titleright">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenosttitulek">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="styltitulek">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="barvatitulek">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="standardni"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="ne" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo" default="yes"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="semknuto"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="visici"/>
+ </cd:parameter>
+ <cd:parameter name="stylhlavicky">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="barvahlavicky">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="headcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zaveseni">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="odsadpristi">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="odsazovani">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="nastavvycty"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavpopisy" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definujvycet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="nastavvycty" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="vycet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="vycet"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definujpopis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavpopisy" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="popis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="popis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="nastavodsazeni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylhlavicky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vzor">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definujodsazovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavodsazeni" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definujpopisek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="naokraji"/>
+ <cd:constant type="dotextu"/>
+ </cd:parameter>
+ <cd:parameter name="zpusob">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="dobloku">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="stylhlavicky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barvahlavicky">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="nastavsloupce"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nvrsek">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="linka">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="velmistriktni"/>
+ <cd:constant type="striktni"/>
+ <cd:constant type="tolerantni"/>
+ <cd:constant type="velmitolerantni"/>
+ <cd:constant type="natahnout"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rovnovaha">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:constant type="text"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="prazdny">
+ <cd:constant type="fixne"/>
+ <cd:constant type="pulradku"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="male"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="pozadi"/>
+ </cd:parameter>
+ <cd:parameter name="smer">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavsloupce" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="definujtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="zahlavi"/>
+ <cd:constant type="upati"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavzahlavi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="hrana"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="normalni"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="zadneznaceni"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylvlevo">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylvpravo">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="sirkavlevo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sirkavpravo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavupati"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="nastavzahlavi" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavzahlavi" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="nastavzahlavi" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavzahlavi" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavhorejsek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="nastavzahlavi" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavzahlavi" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavspodek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="nastavzahlavi" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavzahlavi" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="zadnezahlaviaupati"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="zadnehorniadolniradky"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavtextyzahlavi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavtextyupati"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavtexttexty"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavhornitexty"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nastavdolnitexty"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="settextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="definujznaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="propojeneznaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="rozpojeneznaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="resetznaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="nastavznaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="expanzen">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="znaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="ziskejznaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="prvni"/>
+ <cd:constant type="posledni"/>
+ <cd:constant type="predchozi"/>
+ <cd:constant type="obe"/>
+ <cd:constant type="vse"/>
+ <cd:constant type="aktualni"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="zadneznaceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="nastavvzhled"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="nastred"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="nastred"/>
+ </cd:parameter>
+ <cd:parameter name="zpetnamezera">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="svrchnimezera">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="levyokraj">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pravyokraj">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zahlavi">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="upati">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vrsek">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spodek">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="levahrana">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pravahrana">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostzahlavi">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostupati">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostvrsku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostspodku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostlevehookraje">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostpravehookraje">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostlevehrany">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostpravehrany">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsethlavicky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="znaceni">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ <cd:constant type="barevne"/>
+ <cd:constant type="rastr"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="stranka"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="jednostranne"/>
+ <cd:constant type="dvoustranny"/>
+ </cd:parameter>
+ <cd:parameter name="meritko">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="radky">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sloupce">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostsloupcu">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="mrizka">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="bottomspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cutspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sirkatextu">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="textmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="papir">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="prizpusobvzhled"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="radky">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="ukazmrizku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="vse"/>
+ <cd:constant type="radky"/>
+ <cd:constant type="ramecek"/>
+ <cd:constant type="nonumber"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vnejsi"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="umistinamrizku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="premistinamrizku" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="premistinamrizku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="standardni" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="vrsek"/>
+ <cd:constant type="obe"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="nizko"/>
+ <cd:constant type="stranka"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="podlehloubky"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="projekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="prostredi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="produkt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="komponenta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="zadnedalsisoubory"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nastavmeziradkovoumezeru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="male" default="yes"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="nastavmeziradkovoumezeru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="radek">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vrsek">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="spodek">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="nastavcislovanistran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="jednostranne"/>
+ <cd:constant type="dvoustranny"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="zahlavi"/>
+ <cd:constant type="upati"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="textovahrana"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="konverze">
+ <cd:constant type="cisla"/>
+ <cd:constant type="pismena"/>
+ <cd:constant type="Pismena"/>
+ <cd:constant type="rimskecislice"/>
+ <cd:constant type="Rimskecislice"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="zpusob">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovaccisla">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovactextu">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="posledni"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nastavzuzeni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stredni">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="definuj"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="uzijprikazy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="definujstartstop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prikazy">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="nastavnadpisy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cislooddilu">
+ <cd:constant type="ano"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="normalni"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="odstavec"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="predel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnejtitul">
+ <cd:constant type="ano"/>
+ <cd:constant type="plvouciobjekt"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="velmistriktni"/>
+ <cd:constant type="striktni"/>
+ <cd:constant type="tolerantni"/>
+ <cd:constant type="velmitolerantni"/>
+ <cd:constant type="natahnout"/>
+ </cd:parameter>
+ <cd:parameter name="odsadpristi">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="nastavpopisky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="nizko"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="lefthanging"/>
+ <cd:constant type="righthanging"/>
+ <cd:constant type="levyokraj"/>
+ <cd:constant type="pravyokraj"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="max"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minsirka">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stylhlavicky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="cislo">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="konverze">
+ <cd:constant type="cisla"/>
+ <cd:constant type="pismena"/>
+ <cd:constant type="Pismena"/>
+ <cd:constant type="rimskecislice"/>
+ <cd:constant type="Rimskecislice"/>
+ </cd:parameter>
+ <cd:parameter name="zpusob">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="predel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="nastavpopisek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavpopisky" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="nastavplvouciobjekty"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="nastred"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="mezerapred">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="mezeraza">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="bocnimezerapred">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="bocnimezeraza">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="odsadpristi">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="nvrsek">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nspodek">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nradky">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="implicitni">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostlevehookraje">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostpravehookraje">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sidealign">
+ <cd:constant type="normalni"/>
+ <cd:constant type="radek"/>
+ </cd:parameter>
+ <cd:parameter name="cislovani">
+ <cd:constant type="ano"/>
+ <cd:constant type="nocheck"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="nastavdeleniplvoucichobjektu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="konverze">
+ <cd:constant type="cisla"/>
+ <cd:constant type="pismena"/>
+ <cd:constant type="Pismena"/>
+ <cd:constant type="rimskecislice"/>
+ <cd:constant type="Rimskecislice"/>
+ </cd:parameter>
+ <cd:parameter name="radky">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="rozdelplvouciobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavdeleniplvoucichobjektu" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="nastavumisteniprotejsku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavdelitko"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="znak">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="nastavumistovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="prekryv"/>
+ </cd:parameter>
+ <cd:parameter name="jednotka">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="meritko">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="xkrok">
+ <cd:constant type="absolutni"/>
+ <cd:constant type="relativni"/>
+ </cd:parameter>
+ <cd:parameter name="ykrok">
+ <cd:constant type="absolutni"/>
+ <cd:constant type="relativni"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="mrizka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xkrok">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ykrok">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="meritko">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="jednotka">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="strana"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="ano" default="yes"/>
+ <cd:constant type="zlom"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="nastaveni"/>
+ <cd:constant type="vysokapriorita"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="zablokovat"/>
+ <cd:constant type="posledni"/>
+ <cd:constant type="ctyrnasobny"/>
+ <cd:constant type="sude"/>
+ <cd:constant type="liche"/>
+ <cd:constant type="prazdny"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="nastavodkazovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="interakce">
+ <cd:constant type="popisek"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="vse"/>
+ <cd:constant type="symbol"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="konverzesouboru">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="male"/>
+ <cd:constant type="velke"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autofile">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="stranka"/>
+ </cd:parameter>
+ <cd:parameter name="globalne">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="export">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="nastavurl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="urlalternativa">
+ <cd:constant type="zadny"/>
+ <cd:constant type="obe"/>
+ <cd:constant type="pred"/>
+ <cd:constant type="po"/>
+ </cd:parameter>
+ <cd:parameter name="prostorurl">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="zapisdoseznamuodkazu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placereferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definujseznamodkazu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavseznamodkazu" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="nastavseznamodkazu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokalne"/>
+ <cd:constant type="predchozi"/>
+ <cd:constant type="vse"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="zapisdoseznamu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="zapismeziseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="zadnyseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="listsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="umistiseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="stanovcharakteristickuseznamu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="umistikombinovanyseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavkombinovanyseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definujseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="nastavseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="nastavseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="prikaz"/>
+ </cd:parameter>
+ <cd:parameter name="propojeni">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokalne"/>
+ <cd:constant type="predchozi"/>
+ <cd:constant type="aktualni"/>
+ <cd:constant type="zde"/>
+ <cd:constant type="uvod"/>
+ <cd:constant type="vse"/>
+ </cd:parameter>
+ <cd:parameter name="hranicestranky">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylcisla">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styltextu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylstranky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="ciselnyprikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textovyprikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="strankovyprikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="interakce">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cislostranky"/>
+ <cd:constant type="vse"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="popisek">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="cislostranky">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="cislonadpisu">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnejtitul">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="predel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="zadny"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="expanzen">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="prikaz"/>
+ </cd:parameter>
+ <cd:parameter name="maxsirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="natahnout">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definujkombinovanyseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="nastavkombinovanyseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="nastavkombinovanyseznam"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="uroven">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="aktualni"/>
+ </cd:parameter>
+ <cd:inherit name="nastavseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="umisti"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavkombinovanyseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="uplny"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavkombinovanyseznam" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="nastavcislovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="zpusob">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="nastavrovnice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="nastred"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standardni"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="center"/>
+ </cd:parameter>
+ <cd:parameter name="levyokraj">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pravyokraj">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="odsadpristi">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mezerapred">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="konverze">
+ <cd:constant type="cisla"/>
+ <cd:constant type="pismena"/>
+ <cd:constant type="Pismena"/>
+ <cd:constant type="rimskecislice"/>
+ <cd:constant type="Rimskecislice"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="publikace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavpublikace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="apa"/>
+ <cd:constant type="normalni"/>
+ </cd:parameter>
+ <cd:inherit name="nastavvycty" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="nastavradky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="odsazovani">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="mezera">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="zhustene"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="nastavcislovaniodstavcu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="radek"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="nastavcislovaniradku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="konverze">
+ <cd:constant type="cisla"/>
+ <cd:constant type="pismena"/>
+ <cd:constant type="Pismena"/>
+ <cd:constant type="rimskecislice"/>
+ <cd:constant type="Rimskecislice"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="krok">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="nastred"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="uvnitr"/>
+ <cd:constant type="vnejsi"/>
+ <cd:constant type="text"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="end"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="odkazujici">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="pokracovat"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="nejakyradek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="vradku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="nastavmarginalie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="obe"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="radek">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="oddelovac">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stack">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="nastavcislostrany"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cislo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="drzet"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="nastavpodcislostrany"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="zpusob">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nastavpreskok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="normalni" default="yes"/>
+ <cd:constant type="implicitni"/>
+ <cd:constant type="standardni"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="pulradku"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="male"/>
+ <cd:constant type="fixne"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="globalne"/>
+ <cd:constant type="neznamy"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="definujpreskok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="nastavpreskok" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="definujvelikostpapiru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="meritko">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="setuppaper"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="papir">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="svrchnimezera">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zpetnamezera">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="max"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="metoda">
+ <cd:constant type="normalni"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="nastavvelikostpapiru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="nasirku"/>
+ <cd:constant type="zrcadleno"/>
+ <cd:constant type="otoceno"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="negativ"/>
+ <cd:inherit name="nastavvelikostpapiru" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="nastavusporadani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="zablokovat"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="zrcadleno"/>
+ <cd:constant type="otoceno"/>
+ <cd:constant type="dvoustranny"/>
+ <cd:constant type="negativ"/>
+ <cd:constant type="pozadi"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="ukazvytisk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="nastavvelikostpapiru" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="nastavvelikostpapiru" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="nastavvzhled" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="definujlogo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="vrsek"/>
+ <cd:constant type="zahlavi"/>
+ <cd:constant type="upati"/>
+ <cd:constant type="spodek"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="zadny"/>
+ <cd:constant type="stranka"/>
+ <cd:constant type="levahrana"/>
+ <cd:constant type="levyokraj"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="pravyokraj"/>
+ <cd:constant type="pravahrana"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="umistiloga"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="nastavbilamista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="zadny" default="yes"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="fixne"/>
+ <cd:constant type="fixuj"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="nastavodsazovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definujbloksekce"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="nastavbloksekce" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavbloksekce" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="nastavbloksekce"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cislo">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="ano"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definujsekci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="nastavsekci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="konverze">
+ <cd:constant type="cisla"/>
+ <cd:constant type="pismena"/>
+ <cd:constant type="Pismena"/>
+ <cd:constant type="rimskecislice"/>
+ <cd:constant type="Rimskecislice"/>
+ </cd:parameter>
+ <cd:parameter name="predchozicislo">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="nastavnadpis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styltextu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylcisla">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="barvatextu">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="barvacisla">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="cislo">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="vlastnicislo">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="ano"/>
+ </cd:parameter>
+ <cd:parameter name="pokracovat">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="zahlavi">
+ <cd:constant type="zadny"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="zadneznaceni"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="zadny"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="zadneznaceni"/>
+ </cd:parameter>
+ <cd:parameter name="upati">
+ <cd:constant type="zadny"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="zadneznaceni"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="normalni"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="zaveseni">
+ <cd:constant type="zadny"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="ciselnyprikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textovyprikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deepnumbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="umistihlavicku">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="prazdne"/>
+ </cd:parameter>
+ <cd:parameter name="zvysujicicislo">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="resetnumber">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="soubor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="expanzen">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="prikaz"/>
+ </cd:parameter>
+ <cd:parameter name="textmarginalie">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:inherit name="nastavnadpisy" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="nastavcislonadpisu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="cislonadpisu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stanovcislonadpisu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="aktualnicislonadpisu"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="dalsi"/>
+ <cd:variable value="sekce"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definujnadpis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="setupitemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="kazdy"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="standardni" default="yes"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="semknuto"/>
+ <cd:constant type="zhustene"/>
+ <cd:constant type="rozbalene"/>
+ <cd:constant type="zadnabila"/>
+ <cd:constant type="pred"/>
+ <cd:constant type="po"/>
+ <cd:constant type="predel"/>
+ <cd:constant type="spojeno"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="autouvod"/>
+ <cd:constant type="uvolnene"/>
+ <cd:constant type="opakovat"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="odstavec"/>
+ <cd:constant type="dotextu"/>
+ <cd:constant type="nahodny"/>
+ <cd:constant type="reverse"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="marginalie">
+ <cd:constant type="ne"/>
+ <cd:constant type="standardni"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="levyokraj">
+ <cd:constant type="ne"/>
+ <cd:constant type="standardni"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pravyokraj">
+ <cd:constant type="ne"/>
+ <cd:constant type="standardni"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="krok">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="polozky">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="predhlavickou">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pohlavicce">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stylhlavicky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylsnacky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylsymboly">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="predel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="symzarovnani">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="odsadpristi">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <!-- maybe resolve here too -->
+ <cd:constant type="zadny"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="male"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="pokracovat"/>
+ <cd:constant type="standardni" default="yes"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="semknuto"/>
+ <cd:constant type="zhustene"/>
+ <cd:constant type="predel"/>
+ <cd:constant type="spojeno"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="uvod"/>
+ <cd:constant type="sloupce"/>
+ <cd:constant type="text"/>
+ <cd:constant type="odstavec"/>
+ <cd:constant type="opakovat"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupitemgroup" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="polozka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="spodek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="pol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="nadpis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="okr"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="sym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="nop"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="definujrejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="nastavrejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rovnovaha">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylstranky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styltextu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="indikator">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="propojeni">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokalne"/>
+ <cd:constant type="vse"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="interakce">
+ <cd:constant type="cislostranky"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="expanzen">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="prikaz"/>
+ </cd:parameter>
+ <cd:parameter name="odkazujici">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="maxsirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="neznamyodkaz">
+ <cd:constant type="prazdne"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="obe"/>
+ <cd:constant type="prvni"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="ne"/>
+ <cd:constant type="ano"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="rejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="start"/>
+ <cd:variable value="rejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="zapisdorejstriku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="propojene"/>
+ <cd:variable value="rejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="propojenyrejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="umistirejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavrejstrik" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="viz"/>
+ <cd:variable value="rejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="uplny"/>
+ <cd:variable value="rejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="nastavrejstrik" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="umisti"/>
+ <cd:variable value="rejstrik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="nastavrejstrik" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definujsynonyma"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="nastavsynonyma"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="styltextu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylsynonyma">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="semknuto"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="vse"/>
+ <cd:constant type="uzito"/>
+ </cd:parameter>
+ <cd:parameter name="konverze">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="expanzen">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="prikaz"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="nacist"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definujtrideni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="nastavtrideni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="vse"/>
+ <cd:constant type="uzito"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="expanzen">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="prikaz"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="nacist"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="definujupravu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="nastavupravu" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="zlom"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavupravu" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="nastavupravu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="prikazy">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="oboustranne">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="prazdne"/>
+ </cd:parameter>
+ <cd:parameter name="statuszahlavi">
+ <cd:constant type="normalni"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="zadneznaceni"/>
+ </cd:parameter>
+ <cd:parameter name="statusupati">
+ <cd:constant type="normalni"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="zadneznaceni"/>
+ </cd:parameter>
+ <cd:parameter name="statustextu">
+ <cd:constant type="normalni"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="zadneznaceni"/>
+ </cd:parameter>
+ <cd:parameter name="statusvrsku">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="statusspodku">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="pagestate">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="jmeno"/>
+ <cd:string value="zlom"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="verze"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="finalni" default="yes"/>
+ <cd:constant type="koncept"/>
+ <cd:constant type="docasne"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="aktualnidatum"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="datum" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="datum"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="den"/>
+ <cd:constant type="mesic"/>
+ <cd:constant type="rok"/>
+ <cd:constant type="vsedniden"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="mezera"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="znacka"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="odkaznadatum"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="odsazovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zadneodsazovani"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="preskoc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke" default="yes"/>
+ <cd:constant type="zadnabila"/>
+ <cd:constant type="zpet"/>
+ <cd:constant type="bily"/>
+ <cd:constant type="zablokovat"/>
+ <cd:constant type="sila"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="pulradku"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="fixne"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="vzdy"/>
+ <cd:constant type="vnejsi"/>
+ <cd:constant type="spojeno"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zhustene"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="prazdny"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="korekcebilehomista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="lokalne"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred" default="yes"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nastavzarovnani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="sirka"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="uvnitr"/>
+ <cd:constant type="vnejsi"/>
+ <cd:constant type="siroce"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="vyska"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="visici"/>
+ <cd:constant type="nothanging"/>
+ <cd:constant type="hyphenated"/>
+ <cd:constant type="nothyphenated"/>
+ <cd:constant type="lesshyphenation"/>
+ <cd:constant type="morehyphenation"/>
+ <cd:constant type="novy"/>
+ <cd:constant type="old"/>
+ <cd:constant type="normalni"/>
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="flushouter"/>
+ <cd:constant type="flushinner"/>
+ <cd:constant type="center"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="nohz"/>
+ <cd:constant type="mezerovani"/>
+ <cd:constant type="nospacing"/>
+ <cd:constant type="tolerantni"/>
+ <cd:constant type="velmitolerantni"/>
+ <cd:constant type="natahnout"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavzarovnani" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="nastavradkovani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="siroky"/>
+ <cd:constant type="zhustene"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nastavtoleranci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="horizontalne"/>
+ <cd:constant type="vertikalne"/>
+ <cd:constant type="natahnout"/>
+ <cd:constant type="mezera"/>
+ <cd:constant type="velmistriktni" default="yes"/>
+ <cd:constant type="striktni"/>
+ <cd:constant type="tolerantni"/>
+ <cd:constant type="velmitolerantni"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="typstrany"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="zpracujstranu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="ano" default="yes"/>
+ <cd:constant type="ne"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="parovastrana"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="volba">
+ <cd:constant type="dvoustranny"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="pozice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="nastavrastr"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="metoda">
+ <cd:constant type="tecka"/>
+ <cd:constant type="linka"/>
+ <cd:constant type="externi"/>
+ </cd:parameter>
+ <cd:parameter name="rozliseni">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rastr">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="nastavpozadi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vrsek"/>
+ <cd:constant type="zahlavi"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="upati"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="stranka"/>
+ <cd:constant type="papir"/>
+ <cd:constant type="levastranka"/>
+ <cd:constant type="pravastranka"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="levahrana"/>
+ <cd:constant type="levyokraj"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="pravyokraj"/>
+ <cd:constant type="pravahrana"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="ziskejbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="typebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definujbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="nastavbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="odstavec">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definujblok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="zadnedalsibloky"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="schovejbloky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="zachovejbloky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="vse"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="uzijbloky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="zpracujbloky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="bypassblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="forceblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="vyberbloky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="kriterium">
+ <cd:constant type="vse"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="nastavblok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vnitrni">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="soubor">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="rovnice"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="matematika"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="umistirovnici"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="umistipodrovnici"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="umisti"/>
+ <cd:variable value="plvouciobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="zde" default="yes"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="levyokraj"/>
+ <cd:constant type="pravyokraj"/>
+ <cd:constant type="levahrana"/>
+ <cd:constant type="pravahrana"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ <cd:constant type="inneredge"/>
+ <cd:constant type="outeredge"/>
+ <cd:constant type="uvnitr"/>
+ <cd:constant type="vnejsi"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="nizko"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="stranka"/>
+ <cd:constant type="levastranka"/>
+ <cd:constant type="pravastranka"/>
+ <cd:constant type="naproti"/>
+ <cd:constant type="vzdy"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="sila"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="radek"/>
+ <cd:constant type="vyska"/>
+ <cd:constant type="podlehloubky"/>
+ <cd:constant type="split"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="rezervovat"/>
+ <cd:variable value="plvouciobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ramecek">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="definujplvouciobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="nastavplvouciobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxvyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxsirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minsirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="implicitni">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hranicestranky">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostlevehookraje">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenostpravehookraje">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="plvouciobjekt"/>
+ <cd:string value="text"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="nizko"/>
+ <cd:constant type="offset"/>
+ <cd:constant type="vysoko"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="odkaz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ref">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="vyberpapir"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rodina">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="dvoustrannypapir"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="zlomek"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="tecky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="polozky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavpolozky" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavpolozky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="naokraji"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="neznamy"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="nastred" default="yes"/>
+ <cd:constant type="vpravo"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citovat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavcitaci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marginalie"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="definujodstavce"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="linka">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vnitrni">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="velmistriktni"/>
+ <cd:constant type="striktni"/>
+ <cd:constant type="tolerantni"/>
+ <cd:constant type="velmitolerantni"/>
+ <cd:constant type="natahnout"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="odstavec"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="odstavec"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavodstavce"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="kazdy"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="velmistriktni"/>
+ <cd:constant type="striktni"/>
+ <cd:constant type="tolerantni"/>
+ <cd:constant type="velmitolerantni"/>
+ <cd:constant type="natahnout"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vnitrni">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="linka">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavtab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="vzor">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stylhlavicky">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="tab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="popisky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="definujtabelaci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="tabelator"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavexterniobrazy" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="nastavtabelaci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="jednotka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="odsazovani">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vnitrni">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="barvalinky">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="tloustkalinky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="prazdny"/>
+ <cd:constant type="mrizka"/>
+ <cd:constant type="podlehloubky"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="linka">
+ <cd:constant type="normalni"/>
+ <cd:constant type="radek"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="nastavtabulky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ </cd:parameter>
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="tloustkalinky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="barvalinky">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="prikazy">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="pozadi">
+ <cd:constant type="rastr"/>
+ <cd:constant type="barevne"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="rastrpozadi">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="barvapozadi">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="definujsablonutabulky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="uzijexternisoubory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="soubor">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="uzijexternisoubor"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="uzijexterniobraz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="nastavexterniobrazy" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="externiobraz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavexterniobrazy" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="nastavexterniobrazy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="meritko">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ymeritko">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ymeritko">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="max"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ </cd:parameter>
+ <cd:parameter name="sfaktor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="vfaktor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ramecek">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="prednastaveni">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="obrazovka">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="nahled">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="opakovat">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="objekt">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="typ">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="metoda">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="ramecek"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="test"/>
+ </cd:parameter>
+ <cd:parameter name="ramecky">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="adresar">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="lokalne"/>
+ <cd:constant type="globalne"/>
+ <cd:constant type="implicitni"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="maxsirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxvyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="konverze">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="ukazexterniobrazy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="uzijexternizvuk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="dve"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="fakt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="otocit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavotoceni" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavotoceni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rotace">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="normalni"/>
+ <cd:constant type="vysoko"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="siroky"/>
+ <cd:constant type="podlehloubky"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="zrcadlit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="meritko"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="nastavspojeni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vrsek"/>
+ <cd:constant type="nastred"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="umistivedlesebe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="umistinadsebe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavinterakcniobrazovku"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="zpetnamezera">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="svrchnimezera">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsethlavicky">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="max"/>
+ <cd:constant type="prizpusobive"/>
+ <cd:constant type="dvoustranny"/>
+ <cd:constant type="jednostranne"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="zalozka"/>
+ </cd:parameter>
+ <cd:parameter name="prodleva">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="obrazovka"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavprechodstrany"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="nastavinterakci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="menu">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ <cd:parameter name="stranka">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="klik">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="obrazovka">
+ <cd:constant type="novy"/>
+ </cd:parameter>
+ <cd:parameter name="otevriakci">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="zavriakci">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="akceotevrenistranky">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="akcezavrenistranky">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="pocitat">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="kontrastnibarva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="sadasymbolu">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titul">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="podtitulek">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autor">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="datum">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="keyword">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="fieldlayer">
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavinterakcnimenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stredni">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="zadny"/>
+ <cd:constant type="lokalne"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="kontrastnibarva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="prekryv"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stejnastranka">
+ <cd:constant type="ano"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="neznamyodkaz">
+ <cd:constant type="ano"/>
+ <cd:constant type="prazdne"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ <cd:parameter name="levyoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pravyoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetvrsku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetspodku">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="position">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definujinterakcnimenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavinterakcnimenu" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definujinterakcnimenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="nastavinterakcnimenu" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="interaktivnimenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="zablokujinterakcnimenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="vrsek"/>
+ <cd:constant type="spodek"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="uzijexternidokument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="soubor"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="uzijURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="soubor"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="propojenydokument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="soubor"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="zref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="interakcnilista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="nastavinterakcnilistu" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="interakcnitlacitka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="nastavinterakcnilistu" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavinterakcnilistu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="vyska"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="vyska"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="hloubka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="krok">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="male"/>
+ <cd:constant type="stredni"/>
+ <cd:constant type="velke"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronizovat"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavsynchronizacnilistu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="stranka"/>
+ <cd:constant type="lokalne"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="vyska"/>
+ <cd:constant type="prizpusobive"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronizacnilista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="stranka"/>
+ <cd:constant type="lokalne"/>
+ </cd:parameter>
+ <cd:inherit name="nastavsynchronizacnilistu" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavsynchronizaci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definujprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavprofily"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="volba">
+ <cd:constant type="test"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="dodrzujprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="umistizalozky"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="vse"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="zalozka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="verze"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavverze"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cislo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="oznacverzi"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="vyberverzi"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definujverzi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="dodrzujverzi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="dodrzujverziprofilu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="definujprogram"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="nastavprogramy"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="adresar">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="program"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ramecek">
+ <cd:constant type="zap"/>
+ <cd:constant type="vyp"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="jdina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="jdinabox"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="tlacitko"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="nastavtlacitka" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="nastavtlacitka"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="nastavkomentar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titul">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="mezera">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="normalni"/>
+ <cd:constant type="Novy"/>
+ <cd:constant type="Bublinka"/>
+ <cd:constant type="Pridavek"/>
+ <cd:constant type="Napoveda"/>
+ <cd:constant type="Odstavec"/>
+ <cd:constant type="Klavesa"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="max"/>
+ <cd:constant type="buffer"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="komentar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavkomentar" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="komentar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="nastavkomentar" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definujpole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="text"/>
+ <cd:constant type="radek"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definujpodpole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="kopirujpole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="klonujpole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="pole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="prizpusobivepole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="vyplnovepole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="bublinkovanapoveda"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vlevo"/>
+ <cd:constant type="vpravo"/>
+ <cd:constant type="nastred"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="ukazpole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="zaznamovepole"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="nastavpole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="popisek"/>
+ <cd:constant type="horizontalne"/>
+ <cd:constant type="vertikalne"/>
+ <cd:constant type="ramecek"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="nastavvsechnapole" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="nastavvsechnapole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="reset"/>
+ <cd:constant type="popisek"/>
+ <cd:constant type="horizontalne"/>
+ <cd:constant type="vertikalne"/>
+ <cd:constant type="ramecek"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pred">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="po">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="barva">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pismeno">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="zarovnani">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="volba">
+ <cd:constant type="pouzeprocteni"/>
+ <cd:constant type="pozadovane"/>
+ <cd:constant type="chranene"/>
+ <cd:constant type="tridene"/>
+ <cd:constant type="nedostupne"/>
+ <cd:constant type="skryte"/>
+ <cd:constant type="tisknutelne"/>
+ </cd:parameter>
+ <cd:parameter name="klikuvnitr">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="klikvne">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="oblastuvnitr">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="oblastvne">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="klavesapo">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="formatovat">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="validovat">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="pocitat">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="offsetpole">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="barvarameckupole">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="barvapozadipole">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="nastavoramovani" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="nastavvsechnapole" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="nastavvsechnapole" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="setupforms"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="metoda">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definujzasobnikpoli"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="nastavvsechnapole" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="zasobnikpoli"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="nastavvsechnapole" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="orez"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="nastavorez" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="nastavorez"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="levyoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="pravyoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetvrsku">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetspodku">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="umistilegendu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="nastavlegendu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vzdalenost">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="mezi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sirka">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vyska">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="misto">
+ <cd:constant type="vpravo"/>
+ <cd:constant type="spodek"/>
+ </cd:parameter>
+ <cd:parameter name="zakladnifont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setupstrut"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="ano" default="yes"/>
+ <cd:constant type="ne"/>
+ <cd:constant type="kap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescriptfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescript"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="ne" default="yes"/>
+ <cd:constant type="ano"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="ne" default="yes"/>
+ <cd:constant type="ano"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="ne" default="yes"/>
+ <cd:constant type="ano"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="ne" default="yes"/>
+ <cd:constant type="ano"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="typ">
+ <cd:constant type="visici" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="mezerovani"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="min">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="max">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="krok">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definujsynonumumfontu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definujsynonumumfontu" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="definujfont" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/cont-de.xml b/tex/context/interface/cont-de.xml
new file mode 100644
index 000000000..6ba3e691e
--- /dev/null
+++ b/tex/context/interface/cont-de.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="de" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="innen"/>
+ <cd:constant type="aussen"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="center"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="ja"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="center"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="nie"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="nicht"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="immer"/>
+ <cd:constant type="erste"/>
+ <cd:constant type="folgende"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="ungerade"/>
+ <cd:constant type="gerade"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="normal"/>
+ <cd:constant type="fett"/>
+ <cd:constant type="geneigt"/>
+ <cd:constant type="fettgeneigt"/>
+ <cd:constant type="tippen"/>
+ <cd:constant type="kap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="datum"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="seitennummer"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="kante"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="oben"/>
+ <cd:constant type="kopfzeile"/>
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="fusszeile"/>
+ <cd:constant type="unten"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="gross"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="installieresprache"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spatiumausgleich">
+ <cd:constant type="gepackt" default="yes"/>
+ <cd:constant type="breit"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="linkersatz">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="rechtersatz">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="linkersubsatz">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="rechtersubsatz">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="linkerzitieren">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechterzitieren">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="linkerzitat">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechterzitat">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middlespeech">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="rightspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="limittext">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="datum">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="compoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="leftcompoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rightcompoundhyphen">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="stellespracheein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="installieresprache" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="sprache"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="hauptsprache"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="uebersetzten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="benutzekodierung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="benutzespezielles"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="defineoutput"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="stelleausgabeein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definierefliesstextumgebung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="default"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="klein">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="gross">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zeilenabstande">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="stellefliesstextumgebungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="definierefliesstextumgebung" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="definierefliesstextumgebung" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="definierefliesstextumgebung" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="zeigefliesstextumgebung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="stellefliesstextein" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definierefliesstext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="default"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definierefliesstext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="stellefliesstextein" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="stellefliesstextein" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definierefliesstext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="stellefliesstextein" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="stellefliesstextein" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="zeigefliesstext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="stellefliesstextein" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="stellefliesstextein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="antiqua"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="grotesk"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="tippen"/>
+ <cd:constant type="fernschreiber"/>
+ <cd:constant type="handschrift"/>
+ <cd:constant type="kalligraphie"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="wechselezumfliesstext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="antiqua"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="grotesk"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="tippen"/>
+ <cd:constant type="fernschreiber"/>
+ <cd:constant type="handschrift"/>
+ <cd:constant type="kalligraphie"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="gross"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definiereschrift"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="stellefarbeein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="stellefarbenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="global"/>
+ <cd:constant type="lokal"/>
+ </cd:parameter>
+ <cd:parameter name="konversion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="immer"/>
+ <cd:constant type="nie"/>
+ </cd:parameter>
+ <cd:parameter name="reduktion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="textfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="kein"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definierefarbe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="farbe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="farbe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="graufarbe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="zeigefarbe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definierepalette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="stellepaletteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definierefarbengruppe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="grau"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="zeigepalette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertikal"/>
+ <cd:constant type="name"/>
+ <cd:constant type="wert"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="zeigefarbengruppe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertikal"/>
+ <cd:constant type="name"/>
+ <cd:constant type="wert"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="vergleichepalette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="vergleichefarbengruppe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="zeigeumbruch"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definetype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelletipein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="stelletipein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="spatium">
+ <cd:constant type="an"/>
+ <cd:constant type="aus" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="geneigt"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tippen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tex"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="arg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definieretippen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="stelletippenein" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelletippenein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="stelletippenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="datei"/>
+ <cd:constant type="tippen"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spatium">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="geneigt"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="befehle" version="mkiv"/>
+ <cd:constant type="farbe"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="ibefehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vbefehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="cbefehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="geraderand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ungeraderand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="blanko">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="halbezeile"/>
+ <cd:constant type="zeile"/>
+ </cd:parameter>
+ <cd:parameter name="escape">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spatium">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="tab">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="ziehefolgendeein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="palette">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="range">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="zeilen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="hyphenate"/>
+ </cd:parameter>
+ <cd:parameter name="leer">
+ <cd:constant type="ja"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="nummerierung">
+ <cd:constant type="zeile"/>
+ <cd:constant type="datei"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="nein"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="tippen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tippedatei"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="stellefussnotenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="konversion">
+ <cd:constant type="ziffern"/>
+ <cd:constant type="buchstaben"/>
+ <cd:constant type="Buchstaben"/>
+ <cd:constant type="roemischezahlen"/>
+ <cd:constant type="Roemischezahlen"/>
+ </cd:parameter>
+ <cd:parameter name="art">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="seite"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="spalten"/>
+ <cd:constant type="firstcolumn"/>
+ <cd:constant type="lastcolumn"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="linie">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spaltenabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginalabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nummerbefehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textbefehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="tolerant"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="sehrstreng"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="textstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="interaktion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="stellefussnotendefinitionein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="definierebeschreibungen" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="fussnote"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="footnotetext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="notiz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="platzierelokalefussnoten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellefussnotenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="platzierefussnoten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellefussnotenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="stelleunterstreichenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="liniendicke">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="untenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="obenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linienfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="roemischezahlen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Roemischezahlen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="ziffern"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="buchstabe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Buchstabe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="buchstaben"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Buchstaben"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="monat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="MONAT"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="wochentag"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="WOCHENTAG"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="stelleversalienein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="titel">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WORT"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WOERTER"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Wort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Woerter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="gestreckt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definieresymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definiereabbsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stelleexterneabbildungenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="symbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="stellesymbolsetein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="verwendesymbole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="showsymbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="definierekonversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="konvertierezahl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="stelleueberschrifttextein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="stellelabeltextein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="ueberschrifttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="labeltext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellemarginallinieein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="niveau">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="liniendicke">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="marginallinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="marginallinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellelinienbreiteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelleumrahmtein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hoehe">
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="fest"/>
+ <cd:constant type="lokal"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="autobreite">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="zwinge"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="kein"/>
+ <cd:constant type="overlay"/>
+ <cd:constant type="default"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="tiefe"/>
+ <cd:constant type="haengend"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="hoti"/>
+ <cd:constant type="tief"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="behalte"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="kein"/>
+ <cd:constant type="leer"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="global"/>
+ <cd:constant type="lokal"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="unten">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="oben">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="obenrahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="untenrahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="rahmenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rahmentiefe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rahmenwinkel">
+ <cd:constant type="rund"/>
+ <cd:constant type="rechteckig"/>
+ </cd:parameter>
+ <cd:parameter name="rahmenradius">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rahmenfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrund">
+ <cd:constant type="raster"/>
+ <cd:constant type="farbe"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="vordergrund"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundraster">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundoffset">
+ <cd:constant type="rahmen"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundtiefe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundwinkel">
+ <cd:constant type="rund"/>
+ <cd:constant type="rechteckig"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundradius">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="winkel">
+ <cd:constant type="rund"/>
+ <cd:constant type="rechteckig"/>
+ </cd:parameter>
+ <cd:parameter name="radius">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="liniendicke">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="umrahmt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="imumriss"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="duennerumriss"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="stelleduennerumrissein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelleduennerumrissein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="zeilenabstande">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="liniendicke">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrund">
+ <cd:constant type="farbe"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="haarlinie"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="duennelinie"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definiereumrahmtertext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleumrahmtetexteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definiereumrahmt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleumrahmtetexteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelleumrahmtetexteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="innen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zeilekorrektur">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="tiefekorrektur">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="standard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="einziehen">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="umrahmtertext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="kein"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleumrahmtetexteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="umrahmtertext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelleumrahmtetexteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hintergrund"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hintergrund"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellehintergrundein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="linkeroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="obenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="untenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="gefuelltesrechteck"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellegefuelltesrechteckein" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="ausfuelltext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellegefuelltesrechteckein" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellegefuelltesrechteckein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breite">
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="zeilenabstande">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="gefuelltezeile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellegefuelltezeileein" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellegefuelltezeileein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelletextumrissein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="imrand"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="linienfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="textlinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="textlinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="rechteck"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellerechteckein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="rechtecke"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="stellerechteckein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellerechteckein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definiereoverlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="verwendemodul"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="ruecksetzten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="keintest"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="stellesystemein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="aufloesung">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="datei">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="verzeichnis">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="zufaellig">
+ <cd:constant type="normal"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="zuruecksetzten"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="tief"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="hoch"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="tiho"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="zeigerahmen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="kante"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="linksbuendig"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="rechtsbuendig"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zentriert"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="wortrechts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="inmarginalie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inanderermarginale"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="imlinken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="imrechten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="ininner"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inouter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="spalte"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zeigestruts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="zeigeeinstellungen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="zeigelayout"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="marginaltext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="tief"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stellemarginalblockein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="imrand"/>
+ <cd:constant type="links"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="oben">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="unten">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="in"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="bei"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ueber"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="irgendwo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="aufseite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="textreferenz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="seitenreferenz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="referenz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="verwendereferenzen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definierereferenz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definierereferenzformat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="label">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nachunten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="zwischenraum"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="keinzwischenraum"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="spatium"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="festesspatium"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="emptylines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="keinspatium"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="kleinerdurchschuss"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definierebeschreibungen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="muster">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="titleleft">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="titleright">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="titelabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="titelstil">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="titelfarbe">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="standard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nein" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links" default="yes"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="kleinerabstand"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="imlinken"/>
+ <cd:constant type="imrechten"/>
+ <cd:constant type="haengend"/>
+ </cd:parameter>
+ <cd:parameter name="kopfstil">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="kopffarbe">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="headcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="haengend">
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="ziehefolgendeein">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="einziehen">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="stellebeschreibungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="definierebeschreibungen" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definierenummerierung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stellebeschreibungein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="nummerierung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="nummerierung"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definierebeschreibung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="definierebeschreibungen" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="beschreibung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="beschreibung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="stelleeinzuegein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kopfstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="muster">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definiereeinzug"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelleeinzuegein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definierelabel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="imrand"/>
+ <cd:constant type="imtext"/>
+ </cd:parameter>
+ <cd:parameter name="art">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="blockauf">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="kopfstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kopffarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="stellespaltenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="noben">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="linie">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="toleranz">
+ <cd:constant type="sehrstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="sehrtolerant"/>
+ <cd:constant type="strecken"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ausgleichen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:constant type="text"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="blanko">
+ <cd:constant type="fest"/>
+ <cd:constant type="halbezeile"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="flexibel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="klein"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="hintergrund"/>
+ </cd:parameter>
+ <cd:parameter name="richtung">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellespaltenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="definieretext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="kopfzeile"/>
+ <cd:constant type="fusszeile"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stellekopfzeileein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="kante"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="keinebeschriftung"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="linkerstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="rechterstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="linkerbreite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterbreite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stellefusszeileein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stellekopfzeileein" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stellekopfzeileein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelletextein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stellekopfzeileein" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stellekopfzeileein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stellenobenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stellekopfzeileein" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stellekopfzeileein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelleuntenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stellekopfzeileein" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stellekopfzeileein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="keinekopfundfusszeilen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="keinzeilenobenundunten"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stellekopfzeilentextein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stellefusszeilentextein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelletexttexteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelletextobenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelletextuntenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="settext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="definierebeschriftung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="verknuepfebeschriftung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="entknuepfebeschriftung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="ruecksetztenbeschriftung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="stellebeschriftungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="beschriftung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="holebeschriftung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="erste"/>
+ <cd:constant type="letzte"/>
+ <cd:constant type="vorig"/>
+ <cd:constant type="beide"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="aktuell"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="keinebeschriftung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="stellelayoutein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="mittig"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="mittig"/>
+ </cd:parameter>
+ <cd:parameter name="rumpfspatium">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfspatium">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfzeile">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fusszeile">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="oben">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="unten">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkekante">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechtekante">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfzeilenabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fusszeilenabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="obenabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstandunten">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrandabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrandabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkerkantenabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterkantenabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rumpfabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="beschriftung">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ <cd:constant type="farbe"/>
+ <cd:constant type="raster"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="seite"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="einzelseitig"/>
+ <cd:constant type="doppelseitig"/>
+ </cd:parameter>
+ <cd:parameter name="format">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zeilen">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="spalten">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="spaltenabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="gritter">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="bottomspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cutspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="textbreite">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="textmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="papier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="passelayoutan"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="zeilen">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="zeigegitter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="zeilen"/>
+ <cd:constant type="rahmen"/>
+ <cd:constant type="nonumber"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="links"/>
+ <cd:constant type="aussen"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="amgitterausrichten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="amgitterneuausrichten" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="amgitterneuausrichten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="oben"/>
+ <cd:constant type="beide"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="tief"/>
+ <cd:constant type="seite"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="tiefe"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="projekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="umgebung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="produkt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="komponente"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="keinedateienmehr"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stellezeilenabstandein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="klein" default="yes"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="stellezeilenabstandein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="zeile">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="oben">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="unten">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="stelleseitennummeriernungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="einzelseitig"/>
+ <cd:constant type="doppelseitig"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="kopfzeile"/>
+ <cd:constant type="fusszeile"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="marginalkante"/>
+ <cd:constant type="imlinken"/>
+ <cd:constant type="imrechten"/>
+ </cd:parameter>
+ <cd:parameter name="konversion">
+ <cd:constant type="ziffern"/>
+ <cd:constant type="buchstaben"/>
+ <cd:constant type="Buchstaben"/>
+ <cd:constant type="roemischezahlen"/>
+ <cd:constant type="Roemischezahlen"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="art">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="nummernseperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="textseparator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="letzte"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelleengerein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="links">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="mittig">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="definieren"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="verwendebefehl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="definierestartstop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="befehle">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelleueberschriftenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="abschnittsnummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="normal"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="absatz"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="abschnitttrenner">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="titelausrichten">
+ <cd:constant type="ja"/>
+ <cd:constant type="gleitobjekt"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="toleranz">
+ <cd:constant type="sehrstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="sehrtolerant"/>
+ <cd:constant type="strecken"/>
+ </cd:parameter>
+ <cd:parameter name="ziehefolgendeein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stellebilderunterschriftein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="tief"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="links"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="lefthanging"/>
+ <cd:constant type="righthanging"/>
+ <cd:constant type="linkerrand"/>
+ <cd:constant type="rechterrand"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="max"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minbreite">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="nummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="konversion">
+ <cd:constant type="ziffern"/>
+ <cd:constant type="buchstaben"/>
+ <cd:constant type="Buchstaben"/>
+ <cd:constant type="roemischezahlen"/>
+ <cd:constant type="Roemischezahlen"/>
+ </cd:parameter>
+ <cd:parameter name="art">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="abschnitttrenner">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stellebildunterschriftein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stellebilderunterschriftein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stellegleitobjekteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="mittig"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vorspatium">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="nachspatium">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="nebenvorspatium">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="nebennachspatium">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="ziehefolgendeein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="noben">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nunten">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="zzeile">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="toleranz">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrandabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrandabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sidealign">
+ <cd:constant type="normal"/>
+ <cd:constant type="zeile"/>
+ </cd:parameter>
+ <cd:parameter name="nummerierung">
+ <cd:constant type="ja"/>
+ <cd:constant type="nocheck"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="stelleplatziegeteiltegleitobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="konversion">
+ <cd:constant type="ziffern"/>
+ <cd:constant type="buchstaben"/>
+ <cd:constant type="Buchstaben"/>
+ <cd:constant type="roemischezahlen"/>
+ <cd:constant type="Roemischezahlen"/>
+ </cd:parameter>
+ <cd:parameter name="zeilen">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="teilegleitobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelleplatziegeteiltegleitobjekt" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="stellegegenueberplatzierenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stellebindestrichein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="zeichen">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="stellepositionierenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="einheit">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="format">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="xschritt">
+ <cd:constant type="absolut"/>
+ <cd:constant type="relativ"/>
+ </cd:parameter>
+ <cd:parameter name="yschritt">
+ <cd:constant type="absolut"/>
+ <cd:constant type="relativ"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="gitter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xschritt">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yschritt">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="format">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="einheit">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="mittig"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="seite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="umbruch"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="einstellung"/>
+ <cd:constant type="grosszuegig"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="sperren"/>
+ <cd:constant type="letzte"/>
+ <cd:constant type="viertel"/>
+ <cd:constant type="gerade"/>
+ <cd:constant type="ungerade"/>
+ <cd:constant type="blanko"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="stellereferenzierenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="interaktion">
+ <cd:constant type="label"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="symbol"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="konvertieredatei">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="gross"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autofile">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="seite"/>
+ </cd:parameter>
+ <cd:parameter name="global">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="export">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="stelleurlein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="urlalternative">
+ <cd:constant type="kein"/>
+ <cd:constant type="beide"/>
+ <cd:constant type="vor"/>
+ <cd:constant type="nach"/>
+ </cd:parameter>
+ <cd:parameter name="urlspatium">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="schreibezurreferenzliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placereferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definierereferenzliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellereferenzlisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="stellereferenzlisteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokal"/>
+ <cd:constant type="vorig"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="schreibezurliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="schreibezwischenliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="keineliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="listsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="platziereliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="bestimmelistencharakeristika"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="platzierezusammengestellteliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellezusammengestelltelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definiereliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stellelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="stellelisteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="kein"/>
+ <cd:constant type="befehl"/>
+ </cd:parameter>
+ <cd:parameter name="verknuepfung">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokal"/>
+ <cd:constant type="vorig"/>
+ <cd:constant type="aktuell"/>
+ <cd:constant type="hier"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="seitenbegrenzung">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="nummernstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="seitenstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="nummerbefehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textbefehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="seitenbefehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="interaktion">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="seitennummer"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="label">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="seitennummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="kopfnummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="titelausrichten">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="abschnitttrenner">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="kein"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="befehl"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="strecken">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definierezusammengestellteliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stellezusammengestelltelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="stellezusammengestelltelisteein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="niveau">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="aktuell"/>
+ </cd:parameter>
+ <cd:inherit name="stellelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="platziere"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellezusammengestelltelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="vollende"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellezusammengestelltelisteein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="stellenummerierungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="art">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="stelleformelnein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="mittig"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="center"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ziehefolgendeein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="vorspatium">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="konversion">
+ <cd:constant type="ziffern"/>
+ <cd:constant type="buchstaben"/>
+ <cd:constant type="Buchstaben"/>
+ <cd:constant type="roemischezahlen"/>
+ <cd:constant type="Roemischezahlen"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="publikation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stellepublikationein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="apa"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
+ <cd:inherit name="stellebeschreibungein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="stellezeilenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="einziehen">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="spatium">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="gepackt"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="stelleabsatznummerierungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="zeile"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="stellezeilennumerierungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="konversion">
+ <cd:constant type="ziffern"/>
+ <cd:constant type="buchstaben"/>
+ <cd:constant type="Buchstaben"/>
+ <cd:constant type="roemischezahlen"/>
+ <cd:constant type="Roemischezahlen"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="schritt">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="mittig"/>
+ <cd:constant type="links"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="imlinken"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="imrechten"/>
+ <cd:constant type="innen"/>
+ <cd:constant type="aussen"/>
+ <cd:constant type="text"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="end"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="referieren">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="fortsetzten"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="einezeile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="inzeile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="stelleinmarginalieein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="beide"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="zeile">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="seperator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stack">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="stelleseitennummerein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="nummer">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="behalte"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="stelleunterseitennummerein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="art">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelleblankoein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="normal" default="yes"/>
+ <cd:constant type="default"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="halbezeile"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="fest"/>
+ <cd:constant type="flexibel"/>
+ <cd:constant type="global"/>
+ <cd:constant type="unbekannt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="definiereblanko"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="stelleblankoein" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="definierepapierformat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="format">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="setuppaper"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="papier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfspatium">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rumpfspatium">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="methode">
+ <cd:constant type="normal"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="stellepapierformatein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="querformat"/>
+ <cd:constant type="gespiegelt"/>
+ <cd:constant type="gedreht"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="negativ"/>
+ <cd:inherit name="stellepapierformatein" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="stelleanordnenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="sperren"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="gespiegelt"/>
+ <cd:constant type="gedreht"/>
+ <cd:constant type="doppelseitig"/>
+ <cd:constant type="negativ"/>
+ <cd:constant type="hintergrund"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="zeigedruck"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="stellepapierformatein" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="stellepapierformatein" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stellelayoutein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="definierelogo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="oben"/>
+ <cd:constant type="kopfzeile"/>
+ <cd:constant type="fusszeile"/>
+ <cd:constant type="unten"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="kein"/>
+ <cd:constant type="seite"/>
+ <cd:constant type="linkekante"/>
+ <cd:constant type="linkerrand"/>
+ <cd:constant type="links"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="rechterrand"/>
+ <cd:constant type="rechterkante"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="platzierelogo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="stellezwischenraumein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="kein" default="yes"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="fest"/>
+ <cd:constant type="stellewiederher"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="stelleeinziehenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definiereabschnittsblock"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="stelleabschnittsblockein" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleabschnittsblockein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelleabschnittsblockein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="nummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="ja"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definiereabschnitt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelleabschnittein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="konversion">
+ <cd:constant type="ziffern"/>
+ <cd:constant type="buchstaben"/>
+ <cd:constant type="Buchstaben"/>
+ <cd:constant type="roemischezahlen"/>
+ <cd:constant type="Roemischezahlen"/>
+ </cd:parameter>
+ <cd:parameter name="vorigenummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelleueberschriftein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="nummernstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="textfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nummernfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="eigenenummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="fortsetzen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="kopfzeile">
+ <cd:constant type="kein"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="keinebeschriftung"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="kein"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="keinebeschriftung"/>
+ </cd:parameter>
+ <cd:parameter name="fusszeile">
+ <cd:constant type="kein"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="keinebeschriftung"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="normal"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="haengend">
+ <cd:constant type="kein"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="nummerbefehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textbefehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deepnumbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="setzekopf">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="leer"/>
+ </cd:parameter>
+ <cd:parameter name="nummererhoehen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="resetnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="datei">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="befehl"/>
+ </cd:parameter>
+ <cd:parameter name="marginaltext">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:inherit name="stelleueberschriftenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stellekopfzahlein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="kopfnummer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="bestimmekopfnummer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="heutigeskopfnummer"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="folgende"/>
+ <cd:variable value="absatz"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definiereueberschrift"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="setupitemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="jede"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="kleinerabstand"/>
+ <cd:constant type="gepackt"/>
+ <cd:constant type="ungepackt"/>
+ <cd:constant type="keinweiss"/>
+ <cd:constant type="vor"/>
+ <cd:constant type="nach"/>
+ <cd:constant type="trenner"/>
+ <cd:constant type="keinabstand"/>
+ <cd:constant type="amrand"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="lose"/>
+ <cd:constant type="wiederholen"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="absatz"/>
+ <cd:constant type="imtext"/>
+ <cd:constant type="zufaellig"/>
+ <cd:constant type="reverse"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="marginalie">
+ <cd:constant type="nein"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrand">
+ <cd:constant type="nein"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrand">
+ <cd:constant type="nein"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="schritt">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="posten">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="vorkopf">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nachkopf">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="kopfstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="beschrstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="symstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="abschnitttrenner">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="symausrichtung">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="ziehefolgendeein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <!-- maybe resolve here too -->
+ <cd:constant type="kein"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="klein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="fortsetzten"/>
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="kleinerabstand"/>
+ <cd:constant type="gepackt"/>
+ <cd:constant type="trenner"/>
+ <cd:constant type="keinabstand"/>
+ <cd:constant type="amrand"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="spalten"/>
+ <cd:constant type="text"/>
+ <cd:constant type="absatz"/>
+ <cd:constant type="wiederholen"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupitemgroup" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="pos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="but"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="its"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="kopf"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="mar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="sym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="nop"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="definiereregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="stelleregisterein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ausgleichen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="seitenstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="indikator">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="verknuepfung">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokal"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="interaktion">
+ <cd:constant type="seitennummer"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="befehl"/>
+ </cd:parameter>
+ <cd:parameter name="referieren">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="unbekantereferenz">
+ <cd:constant type="leer"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="beide"/>
+ <cd:constant type="erste"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="nein"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="start"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="schreibezumregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="verknuepft"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="verknuepfregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="platziereregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleregisterein" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="sieh"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="vollende"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="stelleregisterein" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="platziere"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="stelleregisterein" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definieresynonyme"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="stellesynonymein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="textstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="synonymstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="kleinerabstand"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="imlinken"/>
+ <cd:constant type="imrechten"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="verwende"/>
+ </cd:parameter>
+ <cd:parameter name="konversion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="befehl"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="laden"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definieresortieren"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="stellesortierenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="kriterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="verwende"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="befehl"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="laden"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="definiereumbruch"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelleumbruchein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="umbruch"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleumbruchein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="stelleumbruchein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="links"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="befehle">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="doppelseitig">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="leer"/>
+ </cd:parameter>
+ <cd:parameter name="kopfzeilenstatus">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="keinebeschriftung"/>
+ </cd:parameter>
+ <cd:parameter name="fusszeilenstatus">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="keinebeschriftung"/>
+ </cd:parameter>
+ <cd:parameter name="textstatus">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="keinebeschriftung"/>
+ </cd:parameter>
+ <cd:parameter name="statusoben">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="untenstatus">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="pagestate">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="name"/>
+ <cd:string value="umbruch"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="version"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="endfassung" default="yes"/>
+ <cd:constant type="konzept"/>
+ <cd:constant type="temporaer"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="heutigesdatum"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="datum" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="datum"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="tag"/>
+ <cd:constant type="monat"/>
+ <cd:constant type="jahr"/>
+ <cd:constant type="wochentag"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="spatium"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="merkmal"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="verweisdatum"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="einziehen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nichteinziehen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="blanko"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross" default="yes"/>
+ <cd:constant type="keinweiss"/>
+ <cd:constant type="zurueck"/>
+ <cd:constant type="weiss"/>
+ <cd:constant type="sperren"/>
+ <cd:constant type="zwinge"/>
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="halbezeile"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="fest"/>
+ <cd:constant type="flexibel"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="immer"/>
+ <cd:constant type="aussen"/>
+ <cd:constant type="keinabstand"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="kleinerdurchschuss"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="blanko"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="korrigierezwischenraum"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="lokal"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="mittig" default="yes"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelleausrichtungein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="breite"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="innen"/>
+ <cd:constant type="aussen"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="hoehe"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="haengend"/>
+ <cd:constant type="nothanging"/>
+ <cd:constant type="hyphenate"/>
+ <cd:constant type="nothyphenated"/>
+ <cd:constant type="lesshyphenation"/>
+ <cd:constant type="morehyphenation"/>
+ <cd:constant type="neu"/>
+ <cd:constant type="old"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="flushouter"/>
+ <cd:constant type="flushinner"/>
+ <cd:constant type="center"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="nohz"/>
+ <cd:constant type="spatiumausgleich"/>
+ <cd:constant type="nospacing"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="sehrtolerant"/>
+ <cd:constant type="strecken"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="stelleausrichtungein" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="stellespatiumein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="breit"/>
+ <cd:constant type="gepackt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelletoleranzein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertikal"/>
+ <cd:constant type="strecken"/>
+ <cd:constant type="spatium"/>
+ <cd:constant type="sehrstreng" default="yes"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="sehrtolerant"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="seitentyp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="bearbeiteseite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="nein"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="doppelseite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="option">
+ <cd:constant type="doppelseitig"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="position"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellerasterein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="methode">
+ <cd:constant type="punkt"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="extern"/>
+ </cd:parameter>
+ <cd:parameter name="aufloesung">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="raster">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="stellehintergruendeein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="oben"/>
+ <cd:constant type="kopfzeile"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="fusszeile"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="seite"/>
+ <cd:constant type="papier"/>
+ <cd:constant type="linkerseite"/>
+ <cd:constant type="rechterseite"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="linkekante"/>
+ <cd:constant type="linkerrand"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="rechterrand"/>
+ <cd:constant type="rechterkante"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="puffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="holepuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="tippepuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definierepuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="stellepufferein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="absatz">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definiereblock"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="keinebloeckemehr"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="verbergebloecke"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="behaltebloecke"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="alles"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="verwendebloecke"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="bearbeitebloecke"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="bypassblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="forceblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="waehlebloeckeaus"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="kriterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="stelleblockein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="innen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="datei">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="formel"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="mathematik"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="platziereformel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="platziereunterformel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="platziere"/>
+ <cd:variable value="gleitobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="hier" default="yes"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="imlinken"/>
+ <cd:constant type="imrechten"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="marginalie"/>
+ <cd:constant type="linkerrand"/>
+ <cd:constant type="rechterrand"/>
+ <cd:constant type="linkekante"/>
+ <cd:constant type="rechterkante"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ <cd:constant type="inneredge"/>
+ <cd:constant type="outeredge"/>
+ <cd:constant type="innen"/>
+ <cd:constant type="aussen"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="tief"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="seite"/>
+ <cd:constant type="linkerseite"/>
+ <cd:constant type="rechterseite"/>
+ <cd:constant type="gegenueber"/>
+ <cd:constant type="immer"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="zwinge"/>
+ <cd:constant type="lang"/>
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="zeile"/>
+ <cd:constant type="hoehe"/>
+ <cd:constant type="tiefe"/>
+ <cd:constant type="split"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="reservieren"/>
+ <cd:variable value="gleitobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="definieregleitobjekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stellegleitobjektein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxhoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minbreite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="seitenbegrenzung">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrandabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrandabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="gleitobjekt"/>
+ <cd:string value="text"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="tief"/>
+ <cd:constant type="offset"/>
+ <cd:constant type="lang"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="verweis"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ref">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="waehlepapieraus"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="familie">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="doppelseitigespapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="bruch"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="punkt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="posten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stellepostenein" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stellepostenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="imrand"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="unbekannt"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="zitat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="mittig" default="yes"/>
+ <cd:constant type="rechts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="zitat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="zitieren"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stellezitierenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marginalie"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="definiereabsaetze"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="linie">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="innen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="toleranz">
+ <cd:constant type="sehrstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="sehrtolerant"/>
+ <cd:constant type="strecken"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="absatz"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="absatz"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelleabsaetzeein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="jede"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="toleranz">
+ <cd:constant type="sehrstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="sehrtolerant"/>
+ <cd:constant type="strecken"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="innen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="linie">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelletabein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="muster">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfstil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="tab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="labels"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="definieretabulator"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="tabulator"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleexterneabbildungenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="stelletabulatorein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="einheit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="einziehen">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="innen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="linienfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="liniendicke">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="blanko"/>
+ <cd:constant type="gritter"/>
+ <cd:constant type="tiefe"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="linie">
+ <cd:constant type="normal"/>
+ <cd:constant type="zeile"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="stelletabellenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="abstand">
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ </cd:parameter>
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="liniendicke">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linienfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="befehle">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrund">
+ <cd:constant type="raster"/>
+ <cd:constant type="farbe"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundraster">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="hintergrundfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="definieretabellenvorlage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="verwendeexternedateien"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="datei">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="verwendeexternedatei"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="verwendeexterneabbildung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="stelleexterneabbildungenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="externeabbildung"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleexterneabbildungenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="stelleexterneabbildungenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="format">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yformat">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yformat">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="max"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ </cd:parameter>
+ <cd:parameter name="bfaktor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hfaktor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="voreinstellung">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="bildschirm">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="vorschau">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="wiederholen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="objekt">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="typ">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="methode">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="rahmen"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="test"/>
+ </cd:parameter>
+ <cd:parameter name="umrahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="verzeichnis">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="lokal"/>
+ <cd:constant type="global"/>
+ <cd:constant type="default"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxhoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="konversion">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="zeigeexterneabbildungen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="verwendeexternestonstueck"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="zwei"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="geg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="drehen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelledrehenein" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelledrehenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rotation">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="normal"/>
+ <cd:constant type="hoch"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="breit"/>
+ <cd:constant type="tiefe"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="spiegeln"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="format"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stellekombinationein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="oben"/>
+ <cd:constant type="mittig"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="platzierenebeneinander"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="platziereuntereinander"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelleinteraktionsbildschirmein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="rumpfspatium">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfspatium">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rumpfabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopfoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="doppelseitig"/>
+ <cd:constant type="einzelseitig"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="bookmark"/>
+ </cd:parameter>
+ <cd:parameter name="wartezeit">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="bildschirm"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelleseitenuebergangein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="stelleinteraktionein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="menue">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ <cd:parameter name="seite">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="klick">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="bildschirm">
+ <cd:constant type="neu"/>
+ </cd:parameter>
+ <cd:parameter name="oeffenaktion">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="schliessenaktion">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="openpageaction">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="closepageaction">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="berechnen">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="kontrastfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="symbolset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="untertitel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autor">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="datum">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="keyword">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="fieldlayer">
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelleinteraktionsmenueein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mittig">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="kein"/>
+ <cd:constant type="lokal"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="kontrastfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="overlay"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="selbeseite">
+ <cd:constant type="ja"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="unbekantereferenz">
+ <cd:constant type="ja"/>
+ <cd:constant type="leer"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ <cd:parameter name="linkeroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterabstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="obenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="untenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="position">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definiereinteraktionsmenue"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelleinteraktionsmenueein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definiereinteraktionsmenue"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stelleinteraktionsmenueein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="interaktionsmenue"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="inaktiviereinteraktionsmenue"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="oben"/>
+ <cd:constant type="unten"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="verwendeexteresdokument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="datei"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="verwendeURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="datei"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="verknuepfedokument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="datei"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="von"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="interaktionsbalken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="stelleinteraktionsbalkenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="interaktionsknopfe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="stelleinteraktionsbalkenein" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelleinteraktionsbalkenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hoehe"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hoehe"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="tiefe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="schritt">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="mittel"/>
+ <cd:constant type="gross"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronisieren"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stellesynchronisationsbalkenein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="seite"/>
+ <cd:constant type="lokal"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hoehe"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronisationsbalken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="seite"/>
+ <cd:constant type="lokal"/>
+ </cd:parameter>
+ <cd:inherit name="stellesynchronisationsbalkenein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stellesynchronisationein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definiereprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelleprofilein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="option">
+ <cd:constant type="test"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="folgeprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="platzierebookmarks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="alles"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="bookmark"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="version"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelleversionein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="nummer">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="beschrifteversion"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="waehleversionaus"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definiereversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="folgeversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="folgeprofilversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="definiereprogramme"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="stelleprogrammein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="verzeichnis">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="programm"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rahmen">
+ <cd:constant type="an"/>
+ <cd:constant type="aus"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="zu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="zurbox"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="knopf"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="stelleknopfein" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="stelleknopfein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stellekommentarein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spatium">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="normal"/>
+ <cd:constant type="Neu"/>
+ <cd:constant type="Ballon"/>
+ <cd:constant type="Zusatz"/>
+ <cd:constant type="Hilfe"/>
+ <cd:constant type="Absatz"/>
+ <cd:constant type="Schluessel"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="puffer"/>
+ </cd:parameter>
+ <cd:parameter name="marginalie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="kommentar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellekommentarein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="kommentar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellekommentarein" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definierefeld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="text"/>
+ <cd:constant type="zeile"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definieresubfeld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="kopierefeld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="klonierefeld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="feld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="passendfeld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="ausfuellfeld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="tooltip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="mittig"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="zeigefelder"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="registrierefelder"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="stellefeldein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="label"/>
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertikal"/>
+ <cd:constant type="rahmen"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stellefelderin" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="stellefelderin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="zuruecksetzten"/>
+ <cd:constant type="label"/>
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertikal"/>
+ <cd:constant type="rahmen"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="nach">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="farbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="ausrichtung">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="nurlesbar"/>
+ <cd:constant type="obligatorisch"/>
+ <cd:constant type="geschuetzt"/>
+ <cd:constant type="sortiert"/>
+ <cd:constant type="nichtverfuegbar"/>
+ <cd:constant type="versteckt"/>
+ <cd:constant type="druckbar"/>
+ </cd:parameter>
+ <cd:parameter name="klickin">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="klickaus">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="regionin">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="regionaus">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="nachtaste">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="formatieren">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="validieren">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="berechnen">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="feldoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="feldrahmenfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="feldhintergrundfarbe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="stelleumrahmtein" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stellefelderin" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="stellefelderin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="setupforms"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="methode">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definierefeldstapel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stellefelderin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="feldstapel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stellefelderin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="ausschnitt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelleausschnittein" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="stelleausschnittein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="linkeroffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="rechterabstand">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="obenoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="untenoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="platzierelegende"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="stellelegendeein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="abstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zwischen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoehe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="platz">
+ <cd:constant type="rechts"/>
+ <cd:constant type="unten"/>
+ </cd:parameter>
+ <cd:parameter name="fliesstext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setupstrut"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="nein"/>
+ <cd:constant type="kap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescriptfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescript"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="nein" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="nein" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="nein" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="nein" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="typ">
+ <cd:constant type="haengend" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="spatiumausgleich"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="faktor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="min">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="max">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="schritt">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="defineschriftsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="defineschriftsynonym" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="definiereschrift" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/cont-en.xml b/tex/context/interface/cont-en.xml
new file mode 100644
index 000000000..5421df6e3
--- /dev/null
+++ b/tex/context/interface/cont-en.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="en" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="inner"/>
+ <cd:constant type="outer"/>
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="center"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="no"/>
+ <cd:constant type="yes"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="center"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="never"/>
+ <cd:constant type="none"/>
+ <cd:constant type="not"/>
+ <cd:constant type="no"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="always"/>
+ <cd:constant type="first"/>
+ <cd:constant type="next"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="odd"/>
+ <cd:constant type="even"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="normal"/>
+ <cd:constant type="bold"/>
+ <cd:constant type="slanted"/>
+ <cd:constant type="boldslanted"/>
+ <cd:constant type="type"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="date"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="pagenumber"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="edge"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="top"/>
+ <cd:constant type="header"/>
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="footer"/>
+ <cd:constant type="bottom"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="small"/>
+ <cd:constant type="big"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="installlanguage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spacing">
+ <cd:constant type="packed" default="yes"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="leftsentence">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="rightsentence">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="leftsubsentence">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="rightsubsentence">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="leftquote">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rightquote">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftquotation">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rightquotation">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middlespeech">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="rightspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="limittext">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="date">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="compoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="leftcompoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rightcompoundhyphen">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="setuplanguage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="installlanguage" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="language"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="mainlanguage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="translate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="useencoding"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="usespecials"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="defineoutput"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupoutput"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definebodyfontenvironment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="default"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="small">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="big">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="interlinespace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="setupbodyfontenvironment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="definebodyfontenvironment" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="definebodyfontenvironment" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="definebodyfontenvironment" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="showbodyfontenvironment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="setupbodyfont" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definebodyfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="default"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definebodyfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="setupbodyfont" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="setupbodyfont" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definebodyfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="setupbodyfont" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="setupbodyfont" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="showbodyfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="setupbodyfont" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="setupbodyfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="handwritten"/>
+ <cd:constant type="calligraphic"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="switchtobodyfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="handwritten"/>
+ <cd:constant type="calligraphic"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="small"/>
+ <cd:constant type="big"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definefont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="setupcolor"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="setupcolors"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="global"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="always"/>
+ <cd:constant type="never"/>
+ </cd:parameter>
+ <cd:parameter name="reduction">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="textcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="no"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="all"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="none"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definecolor"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="color"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="color"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="graycolor"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="showcolor"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definepalet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="setuppalet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definecolorgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="gray"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="showpalet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="name"/>
+ <cd:constant type="value"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="showcolorgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="name"/>
+ <cd:constant type="value"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="comparepalet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="comparecolorgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="showmakeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definetype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setuptype" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="setuptype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="space">
+ <cd:constant type="on"/>
+ <cd:constant type="off" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="slanted"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="type"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tex"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="arg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definetyping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="setuptyping" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setuptyping" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="setuptyping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="file"/>
+ <cd:constant type="typing"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="space">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="slanted"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="commands" version="mkiv"/>
+ <cd:constant type="color"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="icommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ccommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="evenmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="oddmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="blank">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="halfline"/>
+ <cd:constant type="line"/>
+ </cd:parameter>
+ <cd:parameter name="escape">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="space">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="tab">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="palet">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="range">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="lines">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="hyphenated"/>
+ </cd:parameter>
+ <cd:parameter name="empty">
+ <cd:constant type="yes"/>
+ <cd:constant type="all"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="numbering">
+ <cd:constant type="line"/>
+ <cd:constant type="file"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="no"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="typing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typefile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="setupfootnotes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numbers"/>
+ <cd:constant type="characters"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="romannumerals"/>
+ <cd:constant type="Romannumerals"/>
+ </cd:parameter>
+ <cd:parameter name="way">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="page"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="columns"/>
+ <cd:constant type="firstcolumn"/>
+ <cd:constant type="lastcolumn"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="rule">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="columndistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margindistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="numbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="tolerant"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="verystrict"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="setupfootnotedefinition"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="setupdescriptions" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="footnote"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="footnotetext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="note"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="placelocalfootnotes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupfootnotes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="placefootnotes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupfootnotes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="setupunderbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="rulethickness">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bottomoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="topoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rulecolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="romannumerals"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Romannumerals"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="numbers"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="character"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Character"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="characters"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Characters"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="month"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="MONTH"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="weekday"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="WEEKDAY"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="setupcapitals"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="title">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WORD"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WORDS"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Word"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Words"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="stretched"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definesymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefiguresymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupexternalfigures" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="symbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="setupsymbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="usesymbols"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="showsymbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="defineconversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="convertnumber"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="setupheadtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="setuplabeltext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="headtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="labeltext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupmarginrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="level">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rulethickness">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="marginrule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="marginrule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setuplinewidth"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupframed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="height">
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="fixed"/>
+ <cd:constant type="local"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="autowidth">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="force"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="none"/>
+ <cd:constant type="overlay"/>
+ <cd:constant type="default"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="depth"/>
+ <cd:constant type="hanging"/>
+ <cd:constant type="high"/>
+ <cd:constant type="lohi"/>
+ <cd:constant type="low"/>
+ <cd:constant type="top"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="keep"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="none"/>
+ <cd:constant type="empty"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="global"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="bottom">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="top">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ <cd:constant type="none"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="topframe">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="bottomframe">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="leftframe">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="rightframe">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="frameoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="framedepth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="framecorner">
+ <cd:constant type="round"/>
+ <cd:constant type="rectangular"/>
+ </cd:parameter>
+ <cd:parameter name="frameradius">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="framecolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="background">
+ <cd:constant type="screen"/>
+ <cd:constant type="color"/>
+ <cd:constant type="none"/>
+ <cd:constant type="foreground"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundscreen">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundoffset">
+ <cd:constant type="frame"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="backgrounddepth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundcorner">
+ <cd:constant type="round"/>
+ <cd:constant type="rectangular"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundradius">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="corner">
+ <cd:constant type="round"/>
+ <cd:constant type="rectangular"/>
+ </cd:parameter>
+ <cd:parameter name="radius">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="empty">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="rulethickness">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="framed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="inframed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="thinrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="setupthinrules" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupthinrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="interlinespace">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="rulethickness">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="background">
+ <cd:constant type="color"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hairline"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="thinrule"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="defineframedtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="defineframed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupframedtexts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="linecorrection">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="depthcorrection">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="standard"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="framedtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="none"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="framedtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="background"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="background"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupbackground"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="leftoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="topoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bottomoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="fillinrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupfillinrules" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="fillintext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupfillinrules" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupfillinrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="width">
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="interlinespace">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="fillinline"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupfillinlines" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupfillinlines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setuptextrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="inmargin"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="rulecolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="textrule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="textrule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="blackrule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupblackrules" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="blackrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="setupblackrules" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupblackrules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="defineoverlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="usemodule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="reset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="donttest"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="setupsystem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="resolution">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="directory">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="random">
+ <cd:constant type="normal"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="reset"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="low"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="high"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="lohi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="showframe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="edge"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="leftaligned"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="rightaligned"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="midaligned"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="wordright"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="inmargin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inothermargin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inleft"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inright"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="ininner"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inouter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="column"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="showstruts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="showsetups"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="showlayout"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="margintext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="low"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="setupmarginblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="inmargin"/>
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="top">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="bottom">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="in"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="at"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="about"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="somewhere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="atpage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="textreference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="pagereference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="reference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="usereferences"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definereference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definereferenceformat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="left">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="label">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="godown"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="whitespace"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nowhitespace"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="space"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="fixedspaces"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="emptylines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nospace"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="packed"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="setupdescriptions"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="sample">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="titleleft">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="titleright">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="titledistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="titlestyle">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="titlecolor">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="standard"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left" default="yes"/>
+ <cd:constant type="right"/>
+ <cd:constant type="top"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="inleft"/>
+ <cd:constant type="inright"/>
+ <cd:constant type="hanging"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="headcolor">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="headcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="hang">
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="setupenumerations"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupdescriptions" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="defineenumeration"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupenumerations" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumeration"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumeration"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definedescription"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupdescriptions" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="description"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="description"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="setupindentations"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="fit"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="sample">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="defineindenting"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupindentations" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definelabel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="inmargin"/>
+ <cd:constant type="intext"/>
+ </cd:parameter>
+ <cd:parameter name="way">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="blockway">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="headcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="setupcolumns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ntop">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rule">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="verystrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="verytolerant"/>
+ <cd:constant type="stretch"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="balance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:constant type="text"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="blank">
+ <cd:constant type="fixed"/>
+ <cd:constant type="halfline"/>
+ <cd:constant type="line"/>
+ <cd:constant type="flexible"/>
+ <cd:constant type="big"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="small"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="background"/>
+ </cd:parameter>
+ <cd:parameter name="direction">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupcolumns" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="definetext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="header"/>
+ <cd:constant type="footer"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setupheader"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="edge"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="none"/>
+ <cd:constant type="nomarking"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="rightstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="leftwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setupfooter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="setupheader" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupheader" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setuptext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="setupheader" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupheader" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setuptop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="setupheader" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupheader" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setupbottom"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="setupheader" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupheader" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="noheaderandfooterlines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="notopandbottomlines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setupheadertexts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setupfootertexts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setuptexttexts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setuptoptexts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="setupbottomtexts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="settextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="definemarking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="couplemarking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="decouplemarking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="resetmarking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="setupmarking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="marking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="getmarking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="first"/>
+ <cd:constant type="last"/>
+ <cd:constant type="previous"/>
+ <cd:constant type="both"/>
+ <cd:constant type="all"/>
+ <cd:constant type="current"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="nomarking"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="setuplayout"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="middle"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="middle"/>
+ </cd:parameter>
+ <cd:parameter name="backspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="topspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="header">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="footer">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="top">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bottom">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftedge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightedge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="headerdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="footerdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="topdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bottomdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftedgedistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightedgedistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="marking">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ <cd:constant type="color"/>
+ <cd:constant type="screen"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="page"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="top"/>
+ <cd:constant type="singlesided"/>
+ <cd:constant type="doublesided"/>
+ </cd:parameter>
+ <cd:parameter name="scale">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="lines">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="columns">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="columndistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="grid">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="bottomspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cutspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="textwidth">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="textmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="paper">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="adaptlayout"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="lines">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="showgrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="none"/>
+ <cd:constant type="all"/>
+ <cd:constant type="lines"/>
+ <cd:constant type="frame"/>
+ <cd:constant type="nonumber"/>
+ <cd:constant type="right"/>
+ <cd:constant type="left"/>
+ <cd:constant type="outer"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="placeongrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="moveongrid" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="moveongrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="top"/>
+ <cd:constant type="both"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="high"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="low"/>
+ <cd:constant type="page"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="depth"/>
+ <cd:constant type="line"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="none"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="project"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="environment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="product"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="component"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="nomorefiles"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setupinterlinespace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="small" default="yes"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="big"/>
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="setupinterlinespace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="height">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="line">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="top">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="bottom">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="setuppagenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="singlesided"/>
+ <cd:constant type="doublesided"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="header"/>
+ <cd:constant type="footer"/>
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="marginedge"/>
+ <cd:constant type="inleft"/>
+ <cd:constant type="inright"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="numbers"/>
+ <cd:constant type="characters"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="romannumerals"/>
+ <cd:constant type="Romannumerals"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="way">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="numberseparator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="textseparator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="last"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setupnarrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="left">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="middle">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="define"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="usecommands"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="definestartstop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="commands">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="setupheads"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sectionnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="normal"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="paragraph"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="aligntitle">
+ <cd:constant type="yes"/>
+ <cd:constant type="float"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="verystrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="verytolerant"/>
+ <cd:constant type="stretch"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="setupcaptions"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="none"/>
+ <cd:constant type="high"/>
+ <cd:constant type="low"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ <cd:constant type="lefthanging"/>
+ <cd:constant type="righthanging"/>
+ <cd:constant type="leftmargin"/>
+ <cd:constant type="rightmargin"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="max"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minwidth">
+ <cd:constant type="fit"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="number">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="numbers"/>
+ <cd:constant type="characters"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="romannumerals"/>
+ <cd:constant type="Romannumerals"/>
+ </cd:parameter>
+ <cd:parameter name="way">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="setupcaption"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupcaptions" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="setupfloats"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="fit"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spacebefore">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="spaceafter">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="sidespacebefore">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="sidespaceafter">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="ntop">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nbottom">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nlines">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sidealign">
+ <cd:constant type="normal"/>
+ <cd:constant type="line"/>
+ </cd:parameter>
+ <cd:parameter name="numbering">
+ <cd:constant type="yes"/>
+ <cd:constant type="nocheck"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="setupfloatsplitting"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numbers"/>
+ <cd:constant type="characters"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="romannumerals"/>
+ <cd:constant type="Romannumerals"/>
+ </cd:parameter>
+ <cd:parameter name="lines">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="splitfloat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupfloatsplitting" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupoppositeplacing"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setuphyphenmark"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="sign">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="setuppositioning"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="unit">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="scale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="absolute"/>
+ <cd:constant type="relative"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="absolute"/>
+ <cd:constant type="relative"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="grid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="scale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="unit">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="page"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="makeup"/>
+ <cd:constant type="no"/>
+ <cd:constant type="preference"/>
+ <cd:constant type="bigpreference"/>
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="disable"/>
+ <cd:constant type="last"/>
+ <cd:constant type="quadruple"/>
+ <cd:constant type="even"/>
+ <cd:constant type="odd"/>
+ <cd:constant type="blank"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="setupreferencing"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="label"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="all"/>
+ <cd:constant type="symbol"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="convertfile">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="small"/>
+ <cd:constant type="big"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autofile">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="page"/>
+ </cd:parameter>
+ <cd:parameter name="global">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="export">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="setupurl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="urlalternative">
+ <cd:constant type="none"/>
+ <cd:constant type="both"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ </cd:parameter>
+ <cd:parameter name="urlspace">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="writetoreferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placereferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definereferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupreferencelist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setupreferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="previous"/>
+ <cd:constant type="all"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="writetolist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="writebetweenlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="nolist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="listsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setuplist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="determinelistcharacteristics"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setuplist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placecombinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupcombinedlist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setuplist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="none"/>
+ <cd:constant type="command"/>
+ </cd:parameter>
+ <cd:parameter name="coupling">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="previous"/>
+ <cd:constant type="current"/>
+ <cd:constant type="here"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="all"/>
+ </cd:parameter>
+ <cd:parameter name="pageboundaries">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="numberstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="pagestyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="numbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="pagenumber"/>
+ <cd:constant type="all"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="label">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="pagenumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="headnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="aligntitle">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="none"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="command"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="command">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stretch">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definecombinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupcombinedlist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setupcombinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="level">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="current"/>
+ </cd:parameter>
+ <cd:inherit name="setuplist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="place"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupcombinedlist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="complete"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupcombinedlist" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="setupnumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="way">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="setupformulas"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="middle"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="center"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="spacebefore">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="numbers"/>
+ <cd:constant type="characters"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="romannumerals"/>
+ <cd:constant type="Romannumerals"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="publication"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setuppublications"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="apa"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
+ <cd:inherit name="setupenumerations" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="setuplines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="space">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="packed"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="setupparagraphnumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="line"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="setuplinenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numbers"/>
+ <cd:constant type="characters"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="romannumerals"/>
+ <cd:constant type="Romannumerals"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="middle"/>
+ <cd:constant type="left"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="inleft"/>
+ <cd:constant type="right"/>
+ <cd:constant type="inright"/>
+ <cd:constant type="inner"/>
+ <cd:constant type="outer"/>
+ <cd:constant type="text"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="end"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="referencing">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="continue"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="someline"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="inline"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="setupinmargin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="both"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="line">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stack">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="setuppagenumber"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="number">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="keep"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="setupsubpagenumber"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="way">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setupblank"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="normal" default="yes"/>
+ <cd:constant type="default"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="line"/>
+ <cd:constant type="halfline"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="big"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="small"/>
+ <cd:constant type="fixed"/>
+ <cd:constant type="flexible"/>
+ <cd:constant type="global"/>
+ <cd:constant type="unknown"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="defineblank"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="setupblank" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="definepapersize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="setuppaper"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="paper">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="topspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="backspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:constant type="normal"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="setuppapersize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="landscape"/>
+ <cd:constant type="mirrored"/>
+ <cd:constant type="rotated"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="negative"/>
+ <cd:inherit name="setuppapersize" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="setuparranging"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="disable"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="mirrored"/>
+ <cd:constant type="rotated"/>
+ <cd:constant type="doublesided"/>
+ <cd:constant type="negative"/>
+ <cd:constant type="background"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="showprint"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="setuppapersize" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="setuppapersize" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="setuplayout" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="definelogo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="top"/>
+ <cd:constant type="header"/>
+ <cd:constant type="footer"/>
+ <cd:constant type="bottom"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="none"/>
+ <cd:constant type="page"/>
+ <cd:constant type="leftedge"/>
+ <cd:constant type="leftmargin"/>
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ <cd:constant type="rightmargin"/>
+ <cd:constant type="rightedge"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="command">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="placelogos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="setupwhitespace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="none" default="yes"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="line"/>
+ <cd:constant type="fixed"/>
+ <cd:constant type="fix"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="setupindenting"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definesectionblock"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="setupsectionblock" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupsectionblock" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="setupsectionblock"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="number">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="yes"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definesection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="setupsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numbers"/>
+ <cd:constant type="characters"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="romannumerals"/>
+ <cd:constant type="Romannumerals"/>
+ </cd:parameter>
+ <cd:parameter name="previousnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="setuphead"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="numberstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="textcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="numbercolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="number">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="ownnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="yes"/>
+ </cd:parameter>
+ <cd:parameter name="continue">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="header">
+ <cd:constant type="none"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="nomarking"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="none"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="nomarking"/>
+ </cd:parameter>
+ <cd:parameter name="footer">
+ <cd:constant type="none"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="high"/>
+ <cd:constant type="nomarking"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="normal"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="hang">
+ <cd:constant type="none"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="line"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="numbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="textcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deepnumbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="placehead">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="empty"/>
+ </cd:parameter>
+ <cd:parameter name="incrementnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="resetnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="command"/>
+ </cd:parameter>
+ <cd:parameter name="margintext">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:inherit name="setupheads" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="setupheadnumber"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="headnumber"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="determineheadnumber"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="currentheadnumber"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="next"/>
+ <cd:variable value="section"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definehead"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="setupitemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="each"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="unpacked"/>
+ <cd:constant type="nowhite"/>
+ <cd:constant type="before"/>
+ <cd:constant type="after"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="joinedup"/>
+ <cd:constant type="atmargin"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="loose"/>
+ <cd:constant type="repeat"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="paragraph"/>
+ <cd:constant type="intext"/>
+ <cd:constant type="random"/>
+ <cd:constant type="reverse"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="margin">
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargin">
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargin">
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="items">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="beforehead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afterhead">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="marstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="symstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="symalign">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="indentnext">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <!-- maybe resolve here too -->
+ <cd:constant type="none"/>
+ <cd:constant type="big"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="small"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="continue"/>
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="packed"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="joinedup"/>
+ <cd:constant type="atmargin"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="columns"/>
+ <cd:constant type="text"/>
+ <cd:constant type="paragraph"/>
+ <cd:constant type="repeat"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupitemgroup" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="item"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="but"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="its"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="head"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="mar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="sym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="nop"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="defineregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="setupregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="balance">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="pagestyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="textstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="indicator">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="coupling">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="all"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="pagenumber"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="command"/>
+ </cd:parameter>
+ <cd:parameter name="referencing">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="unknownreference">
+ <cd:constant type="empty"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="both"/>
+ <cd:constant type="first"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="no"/>
+ <cd:constant type="yes"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="start"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="writetoregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="coupled"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="coupleregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="placeregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupregister" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="see"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="complete"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="setupregister" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="place"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="setupregister" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definesynonyms"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="setupsynonyms"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="textstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="synonymstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="top"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="inleft"/>
+ <cd:constant type="inright"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="all"/>
+ <cd:constant type="used"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="load"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definesorting"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="setupsorting"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="all"/>
+ <cd:constant type="used"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="load"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="definemakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="setupmakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupmakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="setupmakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="left"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:parameter name="commands">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="doublesided">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="empty"/>
+ </cd:parameter>
+ <cd:parameter name="headerstate">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="none"/>
+ <cd:constant type="nomarking"/>
+ </cd:parameter>
+ <cd:parameter name="footerstate">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="none"/>
+ <cd:constant type="nomarking"/>
+ </cd:parameter>
+ <cd:parameter name="textstate">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="none"/>
+ <cd:constant type="nomarking"/>
+ </cd:parameter>
+ <cd:parameter name="topstate">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="bottomstate">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="pagestate">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="name"/>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="version"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="final" default="yes"/>
+ <cd:constant type="concept"/>
+ <cd:constant type="temporary"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="currentdate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="date" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="date"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="day"/>
+ <cd:constant type="month"/>
+ <cd:constant type="year"/>
+ <cd:constant type="weekday"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="space"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="referral"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="referraldate"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="indenting"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="noindenting"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="blank"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big" default="yes"/>
+ <cd:constant type="nowhite"/>
+ <cd:constant type="back"/>
+ <cd:constant type="white"/>
+ <cd:constant type="disable"/>
+ <cd:constant type="force"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="line"/>
+ <cd:constant type="halfline"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="fixed"/>
+ <cd:constant type="flexible"/>
+ <cd:constant type="none"/>
+ <cd:constant type="always"/>
+ <cd:constant type="outer"/>
+ <cd:constant type="joinedup"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="packed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="blank"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="correctwhitespace"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="local"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="middle" default="yes"/>
+ <cd:constant type="right"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setupalign"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="width"/>
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="inner"/>
+ <cd:constant type="outer"/>
+ <cd:constant type="wide"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="height"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="line"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="hanging"/>
+ <cd:constant type="nothanging"/>
+ <cd:constant type="hyphenated"/>
+ <cd:constant type="nothyphenated"/>
+ <cd:constant type="lesshyphenation"/>
+ <cd:constant type="morehyphenation"/>
+ <cd:constant type="new"/>
+ <cd:constant type="old"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="flushouter"/>
+ <cd:constant type="flushinner"/>
+ <cd:constant type="center"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="nohz"/>
+ <cd:constant type="spacing"/>
+ <cd:constant type="nospacing"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="verytolerant"/>
+ <cd:constant type="stretch"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="setupalign" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="setupspacing"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="broad"/>
+ <cd:constant type="packed"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setuptolerance"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="stretch"/>
+ <cd:constant type="space"/>
+ <cd:constant type="verystrict" default="yes"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="verytolerant"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="pagetype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="processpage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="couplepage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="option">
+ <cd:constant type="doublesided"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="position"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupscreens"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="method">
+ <cd:constant type="dot"/>
+ <cd:constant type="rule"/>
+ <cd:constant type="external"/>
+ </cd:parameter>
+ <cd:parameter name="resolution">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="screen">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="setupbackgrounds"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="top"/>
+ <cd:constant type="header"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="footer"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="page"/>
+ <cd:constant type="paper"/>
+ <cd:constant type="leftpage"/>
+ <cd:constant type="rightpage"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="leftedge"/>
+ <cd:constant type="leftmargin"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="rightmargin"/>
+ <cd:constant type="rightedge"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="getbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="typebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="setupbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="paragraph">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="defineblock"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="nomoreblocks"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="hideblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="keepblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="all"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="useblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="processblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="bypassblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="forceblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="selectblocks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="criterium">
+ <cd:constant type="all"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="setupblock"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="formula"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="mathematics"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="placeformula"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="placesubformula"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="place"/>
+ <cd:variable value="float"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="here" default="yes"/>
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="inleft"/>
+ <cd:constant type="inright"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="margin"/>
+ <cd:constant type="leftmargin"/>
+ <cd:constant type="rightmargin"/>
+ <cd:constant type="leftedge"/>
+ <cd:constant type="rightedge"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ <cd:constant type="inneredge"/>
+ <cd:constant type="outeredge"/>
+ <cd:constant type="inner"/>
+ <cd:constant type="outer"/>
+ <cd:constant type="line"/>
+ <cd:constant type="high"/>
+ <cd:constant type="low"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="page"/>
+ <cd:constant type="leftpage"/>
+ <cd:constant type="rightpage"/>
+ <cd:constant type="opposite"/>
+ <cd:constant type="always"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="force"/>
+ <cd:constant type="tall"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="line"/>
+ <cd:constant type="height"/>
+ <cd:constant type="depth"/>
+ <cd:constant type="split"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="reserve"/>
+ <cd:variable value="float"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="definefloat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="setupfloat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxheight">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pageboundaries">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="leftmargindistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightmargindistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="float"/>
+ <cd:string value="text"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="high"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="low"/>
+ <cd:constant type="offset"/>
+ <cd:constant type="tall"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="referral"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ref">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="selectpaper"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="family">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="couplepaper"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="fraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="periods"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="items"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupitems" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setupitems"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="inmargin"/>
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="unknown"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="quotation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="middle" default="yes"/>
+ <cd:constant type="right"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="quotation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="quote"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setupquote"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="margin"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="defineparagraphs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rule">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="fit"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="verystrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="verytolerant"/>
+ <cd:constant type="stretch"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="paragraph"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="paragraph"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setupparagraphs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="each"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="verystrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="verytolerant"/>
+ <cd:constant type="stretch"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rule">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setuptab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sample">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="headstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="tab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="labels"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="definetabulate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="tabulate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupexternalfigures" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="setuptabulate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="unit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="indenting">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inner">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rulecolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="rulethickness">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="blank"/>
+ <cd:constant type="grid"/>
+ <cd:constant type="depth"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="rule">
+ <cd:constant type="normal"/>
+ <cd:constant type="line"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="setuptables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="distance">
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ </cd:parameter>
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="rulethickness">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rulecolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="commands">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="background">
+ <cd:constant type="screen"/>
+ <cd:constant type="color"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundscreen">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="backgroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="definetabletemplate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="useexternalfiles"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="useexternalfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="useexternalfigure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="setupexternalfigures" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="externalfigure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupexternalfigures" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="setupexternalfigures"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="scale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="max"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="wfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="hfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="preset">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="preview">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="repeat">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="object">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="type">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="method">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="frame"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="test"/>
+ </cd:parameter>
+ <cd:parameter name="frames">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="directory">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="local"/>
+ <cd:constant type="global"/>
+ <cd:constant type="default"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="maxwidth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxheight">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="showexternalfigures"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="useexternalsoundtrack"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="two"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="fact"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="rotate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setuprotate" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setuprotate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rotation">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="normal"/>
+ <cd:constant type="high"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="depth"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="mirror"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="scale"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="setupcombinations"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="top"/>
+ <cd:constant type="middle"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="placesidebyside"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="placeontopofeachother"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupinteractionscreen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="backspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="topspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="fit"/>
+ <cd:constant type="doublesided"/>
+ <cd:constant type="singlesided"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="none"/>
+ <cd:constant type="bookmark"/>
+ </cd:parameter>
+ <cd:parameter name="delay">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="screen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setuppagetransitions"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="setupinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="menu">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="click">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="new"/>
+ </cd:parameter>
+ <cd:parameter name="openaction">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="closeaction">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="openpageaction">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="closepageaction">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calculate">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="contrastcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="symbolset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="title">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="subtitle">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="author">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="date">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="keyword">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="fieldlayer">
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupinteractionmenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middle">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="none"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="contrastcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="overlay"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="samepage">
+ <cd:constant type="yes"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="no"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="unknownreference">
+ <cd:constant type="yes"/>
+ <cd:constant type="empty"/>
+ <cd:constant type="no"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ <cd:parameter name="leftoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="topoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bottomoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="position">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="defineinteractionmenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupinteractionmenu" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="defineinteractionmenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupinteractionmenu" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="interactionmenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="disableinteractionmenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="top"/>
+ <cd:constant type="bottom"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="useexternaldocument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="useURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="coupledocument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="from"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="interactionbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="setupinteractionbar" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="interactionbuttons"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="setupinteractionbar" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupinteractionbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="height"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="height"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="depth">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="small"/>
+ <cd:constant type="medium"/>
+ <cd:constant type="big"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronize"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupsynchronizationbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="page"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="height"/>
+ <cd:constant type="fit"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronizationbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="page"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:inherit name="setupsynchronizationbar" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupsynchronization"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="defineprofile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupprofiles"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="option">
+ <cd:constant type="test"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="followprofile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="placebookmarks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="all"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="bookmark"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="version"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupversions"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="number">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="markversion"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="selectversion"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="defineversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="followversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="followprofileversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="defineprogram"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="setupprograms"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="directory">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="program"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="off"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="goto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="gotobox"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="button"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="setupbuttons" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="setupbuttons"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setupcomment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="title">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="space">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="symbol">
+ <cd:constant type="normal"/>
+ <cd:constant type="New"/>
+ <cd:constant type="Balloon"/>
+ <cd:constant type="Addition"/>
+ <cd:constant type="Help"/>
+ <cd:constant type="Paragraph"/>
+ <cd:constant type="Key"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="buffer"/>
+ </cd:parameter>
+ <cd:parameter name="margin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="comment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupcomment" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="comment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupcomment" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definefield"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="text"/>
+ <cd:constant type="line"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definesubfield"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="copyfield"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="clonefield"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="field"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="fitfield"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="fillinfield"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="tooltip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="left"/>
+ <cd:constant type="right"/>
+ <cd:constant type="middle"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="showfields"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="logfields"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="setupfield"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="label"/>
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="frame"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="setupfields" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="setupfields"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="reset"/>
+ <cd:constant type="label"/>
+ <cd:constant type="horizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="frame"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="before">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="after">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="color">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="align">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="readonly"/>
+ <cd:constant type="required"/>
+ <cd:constant type="protected"/>
+ <cd:constant type="sorted"/>
+ <cd:constant type="unavailable"/>
+ <cd:constant type="hidden"/>
+ <cd:constant type="printable"/>
+ </cd:parameter>
+ <cd:parameter name="clickin">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="clickout">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="regionin">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="regionout">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="afterkey">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="format">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="validate">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calculate">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="fieldoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fieldframecolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="fieldbackgroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="setupframed" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="setupfields" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="setupfields" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="setupforms"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="method">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definefieldstack"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="setupfields" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="fieldstack"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupfields" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="clip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupclipping" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="setupclipping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="state">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="leftoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="rightoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="topoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="bottomoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="placelegend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="setuplegend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inbetween">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="width">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="height">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="location">
+ <cd:constant type="right"/>
+ <cd:constant type="bottom"/>
+ </cd:parameter>
+ <cd:parameter name="bodyfont">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="setupstrut"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescriptfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescript"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="yes"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="yes"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="yes"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="yes"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="type">
+ <cd:constant type="hanging" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="spacing"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="min">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="max">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="step">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefontsynonym" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="definefont" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/cont-fr.xml b/tex/context/interface/cont-fr.xml
new file mode 100644
index 000000000..043a2b91f
--- /dev/null
+++ b/tex/context/interface/cont-fr.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="fr" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="interieur"/>
+ <cd:constant type="exterieur"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="center"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="non"/>
+ <cd:constant type="oui"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="center"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="jamais"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="pas"/>
+ <cd:constant type="non"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="toujours"/>
+ <cd:constant type="premier"/>
+ <cd:constant type="prochain"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="impair"/>
+ <cd:constant type="paire"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="normal"/>
+ <cd:constant type="gras"/>
+ <cd:constant type="incline"/>
+ <cd:constant type="inclinegras"/>
+ <cd:constant type="type"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="date"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="numeropage"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="texte" default="yes"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="bord"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="sup"/>
+ <cd:constant type="entete"/>
+ <cd:constant type="texte" default="yes"/>
+ <cd:constant type="pdp"/>
+ <cd:constant type="inf"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="grand"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="installelangue"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="espacement">
+ <cd:constant type="groupe" default="yes"/>
+ <cd:constant type="large"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="phrasegauche">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="phrasedroite">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="sousphrasegauche">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="sousphrasedroite">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="citergauche">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citerdroite">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citationgauche">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citationdroite">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middlespeech">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="rightspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="limittext">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="date">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="compoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="leftcompoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rightcompoundhyphen">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="defaut">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="reglelangue"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="installelangue" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="langue"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="langueprincipale"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="traduire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="utiliseencodage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="utilisespecialites"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="raz"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="definitsortie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="reglesortie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definitenvironnementpolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="defaut"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="texte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="petit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="grand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="espaceinterligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="regleenvironnementpolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="definitenvironnementpolicecorps" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="definitenvironnementpolicecorps" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="definitenvironnementpolicecorps" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="montreenvironnementpolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="reglepolicecorps" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definitpolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="defaut"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definitpolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="reglepolicecorps" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="reglepolicecorps" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definitpolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="reglepolicecorps" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="reglepolicecorps" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="montrepolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="reglepolicecorps" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="reglepolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regulier"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="manuscript"/>
+ <cd:constant type="calligraphique"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="changepolicecorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regulier"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="manuscript"/>
+ <cd:constant type="calligraphique"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="grand"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definitpolice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="reglecouleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="reglecouleurs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="global"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="toujours"/>
+ <cd:constant type="jamais"/>
+ </cd:parameter>
+ <cd:parameter name="reduction">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="couleurtexte">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="non"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="critere">
+ <cd:constant type="tout"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="rien"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definitcouleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="couleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="couleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="couleurgrise"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="montrecouleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definitpalette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="reglepalette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definitgroupecouleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="gris"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="montrepalette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="nom"/>
+ <cd:constant type="valeur"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="montregroupecouleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="nom"/>
+ <cd:constant type="valeur"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="comparepalette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="comparegroupecouleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="montremakeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definittype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regletype" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="regletype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="espace">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="incline"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="dactylographier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tex"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="arg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definitdactylo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="regledactylo" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regledactylo" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="regledactylo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="fichier"/>
+ <cd:constant type="typing"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="espace">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="incline"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="commandes" version="mkiv"/>
+ <cd:constant type="couleur"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="texte">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="icommande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vcommande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ccommande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="margepaire">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margepaire">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vide">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="demiligne"/>
+ <cd:constant type="ligne"/>
+ </cd:parameter>
+ <cd:parameter name="escape">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="espace">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="tab">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="indentesuivant">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="palette">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="range">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="lignes">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="hyphenated"/>
+ </cd:parameter>
+ <cd:parameter name="vide">
+ <cd:constant type="oui"/>
+ <cd:constant type="tout"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="numerotation">
+ <cd:constant type="ligne"/>
+ <cd:constant type="fichier"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="non"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="typing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="fichierdactylo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="reglenotepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numeros"/>
+ <cd:constant type="caracteres"/>
+ <cd:constant type="Caracteres"/>
+ <cd:constant type="chiffresromains"/>
+ <cd:constant type="Chiffresromains"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="page"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="colonnes"/>
+ <cd:constant type="premierecolonne"/>
+ <cd:constant type="dernierecolonne"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="ligne">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancecolonne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancemarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="commandenumero">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="commandetexte">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="tolerant"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tresstrict"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="styletexte">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleurtexte">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="definitnotepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="regledescriptions" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="notepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="textenotepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="note"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="placenotespdplocales"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="reglenotepdp" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="placenotespdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="reglenotepdp" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="reglesouslignage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="epaisseurligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="decalageinf">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="decalagesup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="couleurligne">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="chiffresromains"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Chiffresromains"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="numeros"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="caractere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Caractere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="caracteres"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Caracteres"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mois"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="MOIS"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="joursemaine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="JOURSEMAINE"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="reglecapitales"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="titre">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="MOT"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="MOTS"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Mot"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Mots"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="etire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definitsymbole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definitsymbolefigure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="reglefiguresexternes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="symbole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="reglejeusymboles"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="utilisesymboles"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="montrejeusymboles"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="definitconversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="convertitnumero"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="regletextetete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="reglelabeltexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="textetete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="labeltexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="reglemargereglee"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="niveau">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="epaisseurligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="margereglee"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="margereglee"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="regleepaisseurligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="regleencadre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hauteur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ <cd:constant type="fixe"/>
+ <cd:constant type="local"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="autolargeur">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="force"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="rien"/>
+ <cd:constant type="revetement"/>
+ <cd:constant type="defaut"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="profondeur"/>
+ <cd:constant type="suspend"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="baha"/>
+ <cd:constant type="bas"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="maintient"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="rien"/>
+ <cd:constant type="vide"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="global"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="inf">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sup">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="cadre">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="revetement"/>
+ </cd:parameter>
+ <cd:parameter name="cadresup">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="cadreinf">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="cadregauche">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="cadredroit">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="decalagecadre">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profondeurcadre">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="coincadre">
+ <cd:constant type="rond"/>
+ <cd:constant type="rectangulaire"/>
+ </cd:parameter>
+ <cd:parameter name="rayoncadre">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="couleurcadre">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="arriereplan">
+ <cd:constant type="ecran"/>
+ <cd:constant type="couleur"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="premierplan"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="ecranarriereplan">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="couleurarriereplan">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="decalagearriereplan">
+ <cd:constant type="cadre"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profondeurarriereplan">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="coinarriereplan">
+ <cd:constant type="rond"/>
+ <cd:constant type="rectangulaire"/>
+ </cd:parameter>
+ <cd:parameter name="rayonarriereplan">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="coin">
+ <cd:constant type="rond"/>
+ <cd:constant type="rectangulaire"/>
+ </cd:parameter>
+ <cd:parameter name="rayon">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vide">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="couleurpremierplan">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stylepremierplan">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="epaisseurligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="framed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="inframed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="traitsfins"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="regletraitsfins" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="regletraitsfins"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="espaceinterligne">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="couleurarriereplan">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="epaisseurligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="arriereplan">
+ <cd:constant type="couleur"/>
+ </cd:parameter>
+ <cd:parameter name="couleurarriereplan">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="ligneh"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="traitfin"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="defineframedtext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="defineframed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="setupframedtexts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interieur">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="correctionligne">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="correctionprofondeur">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="standard"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="composeenalinea">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="texteencadre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="rien"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="texteencadre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="setupframedtexts" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="arriereplan"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="arriereplan"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="reglearriereplan"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="decalagegauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="decalagesup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="decalageinf">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="remplitlignesreglees"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleremplitlignesreglees" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="remplittexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleremplitlignesreglees" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="regleremplitlignesreglees"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="largeur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="espaceinterligne">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="remplitligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleremplitligne" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="regleremplitligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="reglelignesreglestexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="dansmarge"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleurligne">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="ligneregleetexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="ligneregleetexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lignenoire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="reglelignesnoires" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lignesnoires"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="reglelignesnoires" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="reglelignesnoires"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definitrevetement"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="utilisemodule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="raz"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="sanstest"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="reglesysteme"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="resolution">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="fichier">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="repertoire">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aleatoire">
+ <cd:constant type="normal"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="raz"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="bas"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="haut"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="baha"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="montrecadre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="bord"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="aligneagauche"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="aligneadroite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="aligneaumilieu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="motdroit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="dansmarge"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="dansautremarge"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="dansgauche"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="dansdroite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="ininner"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inouter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="colonne"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="montrestruts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="montrereglages"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="montredisposition"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="textemarge"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="bas"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="regleblocmarge"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="sup">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inf">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="dans"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="a"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="concernant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="qqpart"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="alapage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="referencetexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="referencepage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="reference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="utilisereferences"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definitreference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definitformatreference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="texte">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="etiquette">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="vaenbas"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="espaceblanc"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="sansespaceblanc"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="espace"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="espacesfixes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="emptylines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="sansespace"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="groupe"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="regledescriptions"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="echantillon">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="texte">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="titleleft">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="titleright">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="distancetitre">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="styletitre">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="couleurtitre">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="standard"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="non" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche" default="yes"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="dansgauche"/>
+ <cd:constant type="dansdroit"/>
+ <cd:constant type="suspend"/>
+ </cd:parameter>
+ <cd:parameter name="styletete">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="couleurtete">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="commandetete">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="suspend">
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="indentesuivant">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="composeenalinea">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="regleenumerations"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regledescriptions" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definitenumeration"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="regleenumerations" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumeration"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumeration"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definitdescription"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="regledescriptions" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="description"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="description"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="reglealineas"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styletete">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="texte">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="echantillon">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definitcompoalinea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="reglealineas" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definitetiquette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="texte">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="danstexte"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="blockway">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="styletete">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleurtete">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="reglecolonnes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nsup">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ligne">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="tresstrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="trestolerant"/>
+ <cd:constant type="etire"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="equilibre">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:constant type="texte"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="vide">
+ <cd:constant type="fixe"/>
+ <cd:constant type="demiligne"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="flexible"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="petit"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="arriereplan"/>
+ </cd:parameter>
+ <cd:parameter name="direction">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="reglecolonnes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="definittexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="entete"/>
+ <cd:constant type="pdp"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regleentete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="bord"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="normal"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="demarre"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="sansmarquage"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="leftstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styledroit">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="largeurgauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeurdroite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="reglepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="regleentete" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regleentete" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regletexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="regleentete" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regleentete" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="reglesup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="regleentete" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regleentete" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regleinf"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="regleentete" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regleentete" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="sanslignesenteteetpdp"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="sanslignessupetinf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regletextesentete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regletextespdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regletextestexte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regletextessup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="regletextesinf"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="settext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="definitmarquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="couplemarquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="decouplemarquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="razmarquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="reglemarquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="marquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="obtientmarquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="premier"/>
+ <cd:constant type="dernier"/>
+ <cd:constant type="precedent"/>
+ <cd:constant type="lesdeux"/>
+ <cd:constant type="tout"/>
+ <cd:constant type="courant"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="sansmarquage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="regledisposition"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="milieu"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="milieu"/>
+ </cd:parameter>
+ <cd:parameter name="retour">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="espacesup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margegauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margedroite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="entete">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pdp">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inf">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bordgauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="borddroit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanceentete">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dsitancepdp">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancesup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanceinf">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancemargegauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancemargedroite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancebordgauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanceborddroit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="marquage">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ <cd:constant type="couleur"/>
+ <cd:constant type="ecran"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="page"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="recto"/>
+ <cd:constant type="rectoverso"/>
+ </cd:parameter>
+ <cd:parameter name="echelle">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="lignes">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="colonnes">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distancecolonne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="grille">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="espaceinf">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cutspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancetexte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeurtexte">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="margetexte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="papier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="adaptedisposition"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="lignes">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="montregrille"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="raz"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="tout"/>
+ <cd:constant type="lignes"/>
+ <cd:constant type="cadre"/>
+ <cd:constant type="sansnumero"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="exterieur"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="placesurgrille"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="deplacesurgrille" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="deplacesurgrille"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="sup"/>
+ <cd:constant type="lesdeux"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="bas"/>
+ <cd:constant type="page"/>
+ <cd:constant type="large"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="profondeur"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="raz"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="projet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="environement"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="produit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="composant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="pasplusdefichiers"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="regleespacementinterligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="raz"/>
+ <cd:constant type="petit" default="yes"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="regleespacementinterligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sup">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="inf">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="reglenumerotationpage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="recto"/>
+ <cd:constant type="rectoverso"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="entete"/>
+ <cd:constant type="pdp"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="bordmarge"/>
+ <cd:constant type="dansgauche"/>
+ <cd:constant type="dansdroit"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="numeros"/>
+ <cd:constant type="caracteres"/>
+ <cd:constant type="Caracteres"/>
+ <cd:constant type="chiffresromains"/>
+ <cd:constant type="Chiffresromains"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="texte">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="separateurnumbero">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="separateurtexte">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="dernier"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="reglecompoetroite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="milieu">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="definit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="utilisecommandes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="definitdemarrestoppe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="commandes">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="regletetes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numerosection">
+ <cd:constant type="oui"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="normal"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="paragraphe"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="taquet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="alignementtitre">
+ <cd:constant type="oui"/>
+ <cd:constant type="flottant"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="tresstrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="trestolerant"/>
+ <cd:constant type="etire"/>
+ </cd:parameter>
+ <cd:parameter name="indentesuivant">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="regleintitules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="bas"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="lefthanging"/>
+ <cd:constant type="righthanging"/>
+ <cd:constant type="margegauche"/>
+ <cd:constant type="margedroite"/>
+ <cd:constant type="margeinterieure"/>
+ <cd:constant type="margeexterieure"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ <cd:constant type="max"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeurmin">
+ <cd:constant type="adapte"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="styletete">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="numero">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="numeros"/>
+ <cd:constant type="caracteres"/>
+ <cd:constant type="Caracteres"/>
+ <cd:constant type="chiffresromains"/>
+ <cd:constant type="Chiffresromains"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="taquet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="regleintitule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="regleintitules" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="regleflottants"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="milieu"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="espaceavant">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="espaceapres">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="espacelateralavant">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="espacelateralapres">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="indentesuivant">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="nsup">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ninf">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nlignes">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="defaut">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="distancemargegauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancemargedroite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sidealign">
+ <cd:constant type="normal"/>
+ <cd:constant type="ligne"/>
+ </cd:parameter>
+ <cd:parameter name="numerotation">
+ <cd:constant type="oui"/>
+ <cd:constant type="nonverifie"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="regleseparationflottant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numeros"/>
+ <cd:constant type="caracteres"/>
+ <cd:constant type="Caracteres"/>
+ <cd:constant type="chiffresromains"/>
+ <cd:constant type="Chiffresromains"/>
+ </cd:parameter>
+ <cd:parameter name="lignes">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="separeflottant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleseparationflottant" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="regleplacementopposition"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="reglemarquagehyphenation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="signe">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="reglepositionnement"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="revetement"/>
+ </cd:parameter>
+ <cd:parameter name="unite">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="echelle">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="absolute"/>
+ <cd:constant type="relatif"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="absolute"/>
+ <cd:constant type="relatif"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="grille"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="echelle">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="unite">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="page"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="oui" default="yes"/>
+ <cd:constant type="makeup"/>
+ <cd:constant type="non"/>
+ <cd:constant type="preference"/>
+ <cd:constant type="grandepreference"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="desactiver"/>
+ <cd:constant type="dernier"/>
+ <cd:constant type="quadruple"/>
+ <cd:constant type="paire"/>
+ <cd:constant type="impair"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="raz"/>
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="reglereferencage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="prefixe">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="etiquette"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="tout"/>
+ <cd:constant type="symbole"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="conversionfichier">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="grand"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autofile">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="page"/>
+ </cd:parameter>
+ <cd:parameter name="global">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="export">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="regleurl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="alternativeurl">
+ <cd:constant type="rien"/>
+ <cd:constant type="lesdeux"/>
+ <cd:constant type="avant"/>
+ <cd:constant type="apres"/>
+ </cd:parameter>
+ <cd:parameter name="espaceurl">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="ecritdanslistereference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placelistereference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definitlistereference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglelistereference" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="reglelistereference"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="critere">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="precedent"/>
+ <cd:constant type="tout"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="ecritdansliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="ecritentreliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="sansliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="listesymbole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placeliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="regleliste" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="determinecaracteristiqueliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="regleliste" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placelisteinmbriquee"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglelisteimbriquee" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definitliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="regleliste" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="regleliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="rien"/>
+ <cd:constant type="commande"/>
+ </cd:parameter>
+ <cd:parameter name="couplage">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="critere">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="precedent"/>
+ <cd:constant type="courant"/>
+ <cd:constant type="ici"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="tout"/>
+ </cd:parameter>
+ <cd:parameter name="limitespage">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylenumero">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styletexte">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylepage">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="commandenumero">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="commandetexte">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="commandepage">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="numeropage"/>
+ <cd:constant type="tout"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="etiquette">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="prefixe">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="numeropage">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="numerotete">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="alignementtitre">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="taquet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="symbole">
+ <cd:constant type="rien"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="commande"/>
+ </cd:parameter>
+ <cd:parameter name="largeurmax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="commande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="etire">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definitlisteimbriquee"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="reglelisteimbriquee" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="reglelisteimbriquee"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="niveau">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="courant"/>
+ </cd:parameter>
+ <cd:inherit name="regleliste" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="place"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglelisteimbriquee" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="complete"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglelisteimbriquee" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="reglenumerotation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="mode">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="regleformules"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="milieu"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="center"/>
+ </cd:parameter>
+ <cd:parameter name="margegauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margedroite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="indentesuivant">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="espaceavant">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="numeros"/>
+ <cd:constant type="caracteres"/>
+ <cd:constant type="Caracteres"/>
+ <cd:constant type="chiffresromains"/>
+ <cd:constant type="Chiffresromains"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="publication"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="reglepublications"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="apa"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
+ <cd:inherit name="regleenumerations" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="reglelignes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="composeenalinea">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="espace">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="groupe"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="reglenumerotationparagraphe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="raz"/>
+ <cd:constant type="ligne"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="reglenumerotationligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numeros"/>
+ <cd:constant type="caracteres"/>
+ <cd:constant type="Caracteres"/>
+ <cd:constant type="chiffresromains"/>
+ <cd:constant type="Chiffresromains"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="demarre">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="milieu"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="dansgauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="dansdroit"/>
+ <cd:constant type="interieur"/>
+ <cd:constant type="exterieur"/>
+ <cd:constant type="texte"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="end"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prefixe">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="referencing">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="continue"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="uneligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="alaligne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="regledansmarge"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="lesdeux"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="ligne">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separateur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stack">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="reglenumeropage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numero">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="maintient"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="reglesousnumeropage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="mode">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="definitvide"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="normal" default="yes"/>
+ <cd:constant type="defaut"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="demiligne"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="fixe"/>
+ <cd:constant type="flexible"/>
+ <cd:constant type="global"/>
+ <cd:constant type="inconnu"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="definitvide"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="definitvide" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="definittaillepapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="echelle">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="reglepapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="papier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="espacesup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="retour">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="methode">
+ <cd:constant type="normal"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="regletaillepapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="paysage"/>
+ <cd:constant type="reflete"/>
+ <cd:constant type="tourne"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="negatif"/>
+ <cd:inherit name="regletaillepapier" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="reglearrangement"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="desactiver"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="reflete"/>
+ <cd:constant type="tourne"/>
+ <cd:constant type="rectoverso"/>
+ <cd:constant type="negatif"/>
+ <cd:constant type="arriereplan"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="montreedition"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="regletaillepapier" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="regletaillepapier" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="regledisposition" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="definitlogo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="sup"/>
+ <cd:constant type="entete"/>
+ <cd:constant type="pdp"/>
+ <cd:constant type="inf"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="rien"/>
+ <cd:constant type="page"/>
+ <cd:constant type="bordgauche"/>
+ <cd:constant type="margegauche"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="margedroite"/>
+ <cd:constant type="borddroit"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="commande">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="placelogos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="regleespaceblanc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="rien" default="yes"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="fixe"/>
+ <cd:constant type="fixe"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="reglecomposeenalinea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definitblocsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="regleblocsection" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="regleblocsection" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="regleblocsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="numero">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="oui"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definitsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="reglesection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="conversion">
+ <cd:constant type="numeros"/>
+ <cd:constant type="caracteres"/>
+ <cd:constant type="Caracteres"/>
+ <cd:constant type="chiffresromains"/>
+ <cd:constant type="Chiffresromains"/>
+ </cd:parameter>
+ <cd:parameter name="numeroprecedent">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="regletete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styletexte">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylenumero">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="couleurtexte">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="couleurnumero">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="numero">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="numeroproprio">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="oui"/>
+ </cd:parameter>
+ <cd:parameter name="continue">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="entete">
+ <cd:constant type="rien"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="sansmarquage"/>
+ </cd:parameter>
+ <cd:parameter name="texte">
+ <cd:constant type="rien"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="sansmarquage"/>
+ </cd:parameter>
+ <cd:parameter name="pdp">
+ <cd:constant type="rien"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="sansmarquage"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="normal"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="suspend">
+ <cd:constant type="rien"/>
+ <cd:constant type="large"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="commandenumero">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="commandetexte">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deepnumbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="prefixe">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="placetete">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="vide"/>
+ </cd:parameter>
+ <cd:parameter name="incrementenumero">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="raznumero">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="fichier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="commande"/>
+ </cd:parameter>
+ <cd:parameter name="textemarge">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:inherit name="regletetes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="reglenumerotete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="numerotete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="determinenumerotete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="numerotetecourant"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="suivant"/>
+ <cd:variable value="section"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definittete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="setupitemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="chaque"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="large"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="groupe"/>
+ <cd:constant type="degroupe"/>
+ <cd:constant type="sansblanc"/>
+ <cd:constant type="avant"/>
+ <cd:constant type="apres"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="joinedup"/>
+ <cd:constant type="alamarge"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="perte"/>
+ <cd:constant type="repete"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="paragraphe"/>
+ <cd:constant type="danstexte"/>
+ <cd:constant type="aleatoire"/>
+ <cd:constant type="inverse"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="marge">
+ <cd:constant type="non"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margegauche">
+ <cd:constant type="non"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margedroite">
+ <cd:constant type="non"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="elements">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="demarre">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="avanttete">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="aprestete">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="styletete">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylemarquage">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylesym">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="taquet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symbole">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="symalignement">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="indentesuivant">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="distancetexte">
+ <!-- maybe resolve here too -->
+ <cd:constant type="rien"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="petit"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="continue"/>
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="large"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="groupe"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="joinedup"/>
+ <cd:constant type="alamarge"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="colonnes"/>
+ <cd:constant type="texte"/>
+ <cd:constant type="paragraphe"/>
+ <cd:constant type="repete"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupitemgroup" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="element"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="but"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="el"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="tete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="mar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="sym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="nop"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="definitregistre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="regleregistre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="equilibre">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylepage">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="styletexte">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="indicateur">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="couplage">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="critere">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="tout"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="symbole">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="numeropage"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="commande"/>
+ </cd:parameter>
+ <cd:parameter name="referencing">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:parameter name="largeurmax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="referenceinconnue">
+ <cd:constant type="vide"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="prefixe">
+ <cd:constant type="lesdeux"/>
+ <cd:constant type="premier"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="non"/>
+ <cd:constant type="oui"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="registre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="demarre"/>
+ <cd:variable value="registre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="ecritregistre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="couple"/>
+ <cd:variable value="registre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="coupleregistre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="placeregistre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="regleregistre" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="voit"/>
+ <cd:variable value="registre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="complete"/>
+ <cd:variable value="registre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="regleregistre" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="place"/>
+ <cd:variable value="registre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="regleregistre" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definitsynonymes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="reglesynonymes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="styletexte">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stylesynonyme">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="dansgauche"/>
+ <cd:constant type="dansdroit"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="critere">
+ <cd:constant type="tout"/>
+ <cd:constant type="used"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="commande"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="charge"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definittri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="regletri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="critere">
+ <cd:constant type="tout"/>
+ <cd:constant type="used"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="expansion">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="commande"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="charge"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="definitmakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="reglemakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglemakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="reglemakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="decalagehauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="gauche"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:parameter name="commandes">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rectoverso">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="vide"/>
+ </cd:parameter>
+ <cd:parameter name="etatentete">
+ <cd:constant type="normal"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="demarre"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="sansmarquage"/>
+ </cd:parameter>
+ <cd:parameter name="etatpdp">
+ <cd:constant type="normal"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="demarre"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="sansmarquage"/>
+ </cd:parameter>
+ <cd:parameter name="etattexte">
+ <cd:constant type="normal"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="demarre"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="sansmarquage"/>
+ </cd:parameter>
+ <cd:parameter name="etatsup">
+ <cd:constant type="stoppe"/>
+ <cd:constant type="demarre"/>
+ </cd:parameter>
+ <cd:parameter name="etatinf">
+ <cd:constant type="stoppe"/>
+ <cd:constant type="demarre"/>
+ </cd:parameter>
+ <cd:parameter name="etatpage">
+ <cd:constant type="stoppe"/>
+ <cd:constant type="demarre"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="nom"/>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="version"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="final" default="yes"/>
+ <cd:constant type="concept"/>
+ <cd:constant type="temporaire"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="datecourante"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="date" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="date"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="jour"/>
+ <cd:constant type="mois"/>
+ <cd:constant type="annee"/>
+ <cd:constant type="joursemaine"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="espace"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="referral"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="daterecommandation"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="composeenalinea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="sansalinea"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="vide"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand" default="yes"/>
+ <cd:constant type="sansblanc"/>
+ <cd:constant type="retour"/>
+ <cd:constant type="blanc"/>
+ <cd:constant type="desactiver"/>
+ <cd:constant type="force"/>
+ <cd:constant type="raz"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="demiligne"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="fixe"/>
+ <cd:constant type="flexible"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="toujours"/>
+ <cd:constant type="exterieur"/>
+ <cd:constant type="joinedup"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="groupe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="vide"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="corrigeespaceblanc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="local"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu" default="yes"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="reglealignement"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="largeur"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="interieur"/>
+ <cd:constant type="exterieur"/>
+ <cd:constant type="ample"/>
+ <cd:constant type="large"/>
+ <cd:constant type="hauteur"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="raz"/>
+ <cd:constant type="suspend"/>
+ <cd:constant type="nonsuspendu"/>
+ <cd:constant type="hyphenated"/>
+ <cd:constant type="nothyphenated"/>
+ <cd:constant type="lesshyphenation"/>
+ <cd:constant type="morehyphenation"/>
+ <cd:constant type="nouveau"/>
+ <cd:constant type="old"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="flushouter"/>
+ <cd:constant type="flushinner"/>
+ <cd:constant type="center"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="nohz"/>
+ <cd:constant type="espacement"/>
+ <cd:constant type="sansespacement"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="trestolerant"/>
+ <cd:constant type="etire"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="reglealignement" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="regleespacement"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="large"/>
+ <cd:constant type="groupe"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="regletolerance"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="horizontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="etire"/>
+ <cd:constant type="espace"/>
+ <cd:constant type="tresstrict" default="yes"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="trestolerant"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="tapepage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="traitepage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="oui" default="yes"/>
+ <cd:constant type="non"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="pagedouble"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="option">
+ <cd:constant type="rectoverso"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="position"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="regleecrans"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="methode">
+ <cd:constant type="point"/>
+ <cd:constant type="regle"/>
+ <cd:constant type="external"/>
+ </cd:parameter>
+ <cd:parameter name="resolution">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ecran">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="reglearriereplans"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sup"/>
+ <cd:constant type="entete"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="pdp"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="page"/>
+ <cd:constant type="papier"/>
+ <cd:constant type="pagegauche"/>
+ <cd:constant type="pagedroite"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="bordgauche"/>
+ <cd:constant type="margegauche"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="margedroite"/>
+ <cd:constant type="borddroit"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="prendbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="tapebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definitbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="reglebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="paragraphe">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definitbloc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="pasplusdeblocs"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="cacheblocs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="gardeblocs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="tout"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="utiliseblocs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="traiteblocs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="sauteblocs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="forceblocs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="selectionneblocs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="critere">
+ <cd:constant type="tout"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="reglebloc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interieur">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="fichier">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="formule"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="mathematique"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="placeformule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="placesousformule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="place"/>
+ <cd:variable value="flottant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="ici" default="yes"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="dansgauche"/>
+ <cd:constant type="dansdroit"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="margegauche"/>
+ <cd:constant type="margedroite"/>
+ <cd:constant type="bordgauche"/>
+ <cd:constant type="borddroit"/>
+ <cd:constant type="margeinterieure"/>
+ <cd:constant type="margeexterieure"/>
+ <cd:constant type="bordinterieur"/>
+ <cd:constant type="bordexterieur"/>
+ <cd:constant type="interieur"/>
+ <cd:constant type="exterieur"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="bas"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="page"/>
+ <cd:constant type="pagegauche"/>
+ <cd:constant type="pagedroite"/>
+ <cd:constant type="opposition"/>
+ <cd:constant type="toujours"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="force"/>
+ <cd:constant type="long"/>
+ <cd:constant type="raz"/>
+ <cd:constant type="ligne"/>
+ <cd:constant type="hauteur"/>
+ <cd:constant type="profondeur"/>
+ <cd:constant type="split"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="reserver"/>
+ <cd:variable value="flottant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cadre">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="definitflottant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="regleflottant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteurmax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeurmax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="largeurmin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="defaut">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="limitespage">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="distancemargegauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distancemargedroite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="flottant"/>
+ <cd:string value="texte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="bas"/>
+ <cd:constant type="offset"/>
+ <cd:constant type="long"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="recommandation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ref">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="selectionnepapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="famille">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="couplepapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="fraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="periodes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="elements"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleelements" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="regleelements"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="dansmarge"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ </cd:parameter>
+ <cd:parameter name="symbole">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="inconnu"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="milieu" default="yes"/>
+ <cd:constant type="droite"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="demarreciter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marge"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="definitparagraphes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ligne">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="adapte"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interieur">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="tresstrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="trestolerant"/>
+ <cd:constant type="etire"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="paragraphe"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="paragraphe"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="regleparagraphes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="chaque"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="tolerance">
+ <cd:constant type="tresstrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="trestolerant"/>
+ <cd:constant type="etire"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interieur">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ligne">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="regletab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="echantillon">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="styletete">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="tab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="etiquettes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="definittabulation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="tabule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglefiguresexternes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="regletabulation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="unite">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="composeenalinea">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interieur">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="couleurligne">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="epaisseurligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="vide"/>
+ <cd:constant type="grille"/>
+ <cd:constant type="profondeur"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="ligne">
+ <cd:constant type="normal"/>
+ <cd:constant type="ligne"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="regletableaux"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="distance">
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ </cd:parameter>
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="epaisseurligne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="couleurligne">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="commandes">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="arriereplan">
+ <cd:constant type="ecran"/>
+ <cd:constant type="couleur"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="ecranarriereplan">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="couleurarriereplan">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="definittrametableau"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="utilisefichiersexternes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="fichier">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="utilisefichierexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="utilisefigureexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="reglefiguresexternes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="figureexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglefiguresexternes" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="reglefiguresexternes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="echelle">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="max"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ </cd:parameter>
+ <cd:parameter name="facteurlargeur">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="large"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="facteurhauteur">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="large"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cadre">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="prereglage">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="affichage">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="previsualisation">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="repete">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="objet">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="type">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="methode">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="cadre"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="test"/>
+ </cd:parameter>
+ <cd:parameter name="cadres">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="repertoire">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="local"/>
+ <cd:constant type="global"/>
+ <cd:constant type="defaut"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="largeurmax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteurmax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="conversion">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prefixe">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="montrefiguresexternes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="utilisepsiteaudioexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="deux"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="fait"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="oriente"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleoriente" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="regleoriente"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rotation">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="normal"/>
+ <cd:constant type="haut"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="large"/>
+ <cd:constant type="profondeur"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="reflete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="echelle"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="reglecombinaisons"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="sup"/>
+ <cd:constant type="milieu"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="placecoteacote"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="placelesunsaudessusdesautres"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="regleecraninteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="retour">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="espacesup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="adapte"/>
+ <cd:constant type="rectoverso"/>
+ <cd:constant type="recto"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="marquepage"/>
+ </cd:parameter>
+ <cd:parameter name="delai">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="ecran"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="regletransitionspage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="raz"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="regleinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="menu">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ <cd:parameter name="page">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="clic">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="affichage">
+ <cd:constant type="nouveau"/>
+ </cd:parameter>
+ <cd:parameter name="actionouverture">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="actionfermeture">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="actionouverturepage">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="actionfermeturepage">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calculer">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="coleurcontraste">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="jeusymbole">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titre">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="soustitre">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="auteur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="date">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="motcle">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="calquechamp">
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="reglemenuinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="milieu">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ <cd:constant type="rien"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="coleurcontraste">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="revetement"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="memepage">
+ <cd:constant type="oui"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="non"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="referenceinconnue">
+ <cd:constant type="oui"/>
+ <cd:constant type="vide"/>
+ <cd:constant type="non"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ <cd:parameter name="decalagegauche">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rightoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="decalagesup">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="decalageinf">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="position">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definitmenuinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglemenuinteraction" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definitmenuinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="reglemenuinteraction" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="menuinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="inhibemenuinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="sup"/>
+ <cd:constant type="inf"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="utilisedocumentexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="fichier"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="utiliseURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="fichier"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="coupledocument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="fichier"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="de"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="barreinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="reglebarreinteraction" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="boutonsinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="reglebarreinteraction" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="reglebarreinteraction"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="alternative">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="symbole">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hauteur"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hauteur"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="profondeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="petit"/>
+ <cd:constant type="moyen"/>
+ <cd:constant type="grand"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronise"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="reglebarresynchronisation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="page"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hauteur"/>
+ <cd:constant type="adapte"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="barresynchronisation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="alternative">
+ <cd:constant type="page"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:inherit name="reglebarresynchronisation" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="reglesynchronisation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definitprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="regleprofils"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="option">
+ <cd:constant type="test"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="suivantprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="placemarquespages"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="tout"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="marquepage"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="version"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="regleversions"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numero">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="marquageversion"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="selectionneversion"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definitversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="suivantversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="suivantversionprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="definitprogramme"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="regleprogrammes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="repertoire">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="programme"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="facteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="cadre">
+ <cd:constant type="actif"/>
+ <cd:constant type="desactive"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="va"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="vaalaboite"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="bouton"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="regleboutons" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="regleboutons"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="reglecommentaire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titre">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="espace">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ <cd:parameter name="symbole">
+ <cd:constant type="normal"/>
+ <cd:constant type="Nouveau"/>
+ <cd:constant type="Ballon"/>
+ <cd:constant type="Ajout"/>
+ <cd:constant type="Aide"/>
+ <cd:constant type="Paragraphe"/>
+ <cd:constant type="Cle"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="max"/>
+ <cd:constant type="buffer"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="commentaire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglecommentaire" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="commentaire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="reglecommentaire" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definitchamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="texte"/>
+ <cd:constant type="ligne"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definitsouschamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="copitchamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="clonechamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="champ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="ajustechamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="remplitchamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="suggestion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="gauche"/>
+ <cd:constant type="droite"/>
+ <cd:constant type="milieu"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="montrechamps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="logchamp"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="reglechamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="etiquette"/>
+ <cd:constant type="horizontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="cadre"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="reglechamps" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="reglechamps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="raz"/>
+ <cd:constant type="etiquette"/>
+ <cd:constant type="horizontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="cadre"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="avant">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="apres">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="couleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="style">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="alignement">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="option">
+ <cd:constant type="lectureseule"/>
+ <cd:constant type="recquis"/>
+ <cd:constant type="protege"/>
+ <cd:constant type="trie"/>
+ <cd:constant type="indisponible"/>
+ <cd:constant type="cache"/>
+ <cd:constant type="editable"/>
+ </cd:parameter>
+ <cd:parameter name="clicinterieur">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="clicexterieur">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="entreregion">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="regionexterieure">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="aprescle">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="formatter">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="valider">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calculer">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="offsetchamp">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="couleurcadrechamp">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="couleurarrierreplanchamp">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="regleencadre" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="reglechamps" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="reglechamps" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="regleformulaires"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="methode">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definitpilechamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="reglechamps" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="pilechamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="reglechamps" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="clip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="regleclipping" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="regleclipping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="etat">
+ <cd:constant type="demarre"/>
+ <cd:constant type="stoppe"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="decalagehauteur">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="decalagegauche">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="rightoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="decalagesup">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="decalageinf">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="placelegende"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="reglelegende"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="entre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="largeur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hauteur">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="emplacement">
+ <cd:constant type="droite"/>
+ <cd:constant type="inf"/>
+ </cd:parameter>
+ <cd:parameter name="policecorps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="reglestrut"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="oui" default="yes"/>
+ <cd:constant type="non"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescriptfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescript"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="texte">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="non" default="yes"/>
+ <cd:constant type="oui"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="non" default="yes"/>
+ <cd:constant type="oui"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="non" default="yes"/>
+ <cd:constant type="oui"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="non" default="yes"/>
+ <cd:constant type="oui"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="type">
+ <cd:constant type="suspend" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="espacement"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="facteur">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="min">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="max">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definitsynonymepolice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definitsynonymepolice" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="definitpolice" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/cont-it.xml b/tex/context/interface/cont-it.xml
new file mode 100644
index 000000000..9e470fe68
--- /dev/null
+++ b/tex/context/interface/cont-it.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="it" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="interno"/>
+ <cd:constant type="esterno"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="center"/>
+ <cd:constant type="normale"/>
+ <cd:constant type="no"/>
+ <cd:constant type="si"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="center"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="mai"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="non"/>
+ <cd:constant type="no"/>
+ <cd:constant type="si"/>
+ <cd:constant type="sempre"/>
+ <cd:constant type="primo"/>
+ <cd:constant type="successivo"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="normale"/>
+ <cd:constant type="dispari"/>
+ <cd:constant type="pari"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="normale"/>
+ <cd:constant type="grassetto"/>
+ <cd:constant type="inclinato"/>
+ <cd:constant type="grassettoinclinato"/>
+ <cd:constant type="type"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="data"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="numeropagina"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="testo" default="yes"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="bordo"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="cima"/>
+ <cd:constant type="intestazione"/>
+ <cd:constant type="testo" default="yes"/>
+ <cd:constant type="piedipagina"/>
+ <cd:constant type="fondo"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="grande"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="installalingua"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spaziatura">
+ <cd:constant type="impaccato" default="yes"/>
+ <cd:constant type="ampio"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="frasesinistra">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="frasedestra">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="sottofrasesinistra">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="sottofrasedestra">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="menzionesinistra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="menzionedestra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citazionesinistra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citazionedestra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middlespeech">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="rightspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="limittext">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="data">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="compoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="leftcompoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rightcompoundhyphen">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="implicito">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="impostalingua"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="installalingua" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="lingua"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="linguaprincipale"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="traduci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="usacodifica"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="usaspecialita"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="reimposta"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="definiscioutput"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="impostaoutput"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definisciambientefontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="implicito"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="testo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="piccolo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="grande">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="interlinea">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="impostaambientefontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="definisciambientefontdeltesto" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="definisciambientefontdeltesto" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="definisciambientefontdeltesto" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="mostraambientefontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="impostafontdeltesto" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definiscifontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="implicito"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definiscifontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="impostafontdeltesto" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="impostafontdeltesto" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definiscifontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="impostafontdeltesto" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="impostafontdeltesto" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="mostrafontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="impostafontdeltesto" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="impostafontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regolare"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="supporto"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="grafiamanuale"/>
+ <cd:constant type="calligrafico"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="cambiaafontdeltesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regolare"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="supporto"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="grafiamanuale"/>
+ <cd:constant type="calligrafico"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="grande"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definiscifont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="impostacolore"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="impostacolori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="globale"/>
+ <cd:constant type="locale"/>
+ </cd:parameter>
+ <cd:parameter name="conversione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="sempre"/>
+ <cd:constant type="mai"/>
+ </cd:parameter>
+ <cd:parameter name="riduzione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="coloretesto">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="separa">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="no"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="criterio">
+ <cd:constant type="tutti"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definiscicolore"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="colore"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="colore"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="coloregrigio"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="mostracolore"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definiscitavolozza"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="impostatavolozza"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definiscigruppocolori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="grigio"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="mostratavolozza"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="orizzontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="nome"/>
+ <cd:constant type="valore"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="mostragruppocolori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="orizzontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="nome"/>
+ <cd:constant type="valore"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="confrontatavolozza"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="confrontagruppocolori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="mostramakeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definiscitype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostatype" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="impostatype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="spazio">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="inclinato"/>
+ <cd:constant type="normale"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="type"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tex"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="arg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definiscityping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="impostatyping" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostatyping" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="impostatyping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="file"/>
+ <cd:constant type="typing"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spazio">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="inclinato"/>
+ <cd:constant type="normale"/>
+ <cd:constant type="comandi" version="mkiv"/>
+ <cd:constant type="colore"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="testo">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="icomando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vcomando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ccomando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="marginepari">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedispari">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rigovuoto">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="mezzariga"/>
+ <cd:constant type="riga"/>
+ </cd:parameter>
+ <cd:parameter name="escape">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spazio">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="tab">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="rientrasuccessivo">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tavolozza">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="range">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="righe">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="sillabato"/>
+ </cd:parameter>
+ <cd:parameter name="vuoto">
+ <cd:constant type="si"/>
+ <cd:constant type="tutti"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="numerazione">
+ <cd:constant type="riga"/>
+ <cd:constant type="file"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="no"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="typing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typefile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="impostanotepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversione">
+ <cd:constant type="numeri"/>
+ <cd:constant type="lettere"/>
+ <cd:constant type="Lettere"/>
+ <cd:constant type="numeriromani"/>
+ <cd:constant type="Numeriromani"/>
+ </cd:parameter>
+ <cd:parameter name="modo">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="pagina"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="colonne"/>
+ <cd:constant type="firstcolumn"/>
+ <cd:constant type="lastcolumn"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="linea">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzacolonne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzamargine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="comandonumero">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandotesto">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="separa">
+ <cd:constant type="tollerante"/>
+ <cd:constant type="rigido"/>
+ <cd:constant type="moltorigido"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesto">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="coloretesto">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="interazione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="impostadefinizionenotepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="impostadescrizioni" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="notapdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="testonotapdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="nota"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="mettinotepdplocali"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostanotepdp" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="mettinotepdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostanotepdp" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="impostasottolinea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="spessorelinea">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetfondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetcima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colorelinea">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="numeriromani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Numeriromani"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="numeri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="lettera"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Lettera"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="lettere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Lettere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mese"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="MESE"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="giornosettimana"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="GIORNOSETTIMANA"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="impostamaiuscole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="titolo">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="PAROLA"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="PAROLE"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Parola"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Parole"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="stirato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definiscisimbolo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definiscifigurasimbolo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="impostafigureesterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="simbolo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="impostasetsimboli"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="usasimboli"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="mostrasetsimboli"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="definisciconversione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="convertinumero"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="impostatestointestazioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="impostatestoetichette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="testoinstestazioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="testoetichetta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostalineemargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="livello">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="spessorelinea">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineamargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineamargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostaampiezzariga"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostaincorniciato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="altezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="fisso"/>
+ <cd:constant type="locale"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="autoampiezza">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="forza"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="sovrapponi"/>
+ <cd:constant type="implicito"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="profondita"/>
+ <cd:constant type="sospeso"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="pedap"/>
+ <cd:constant type="basso"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="mantieni"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="vuoto"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="globale"/>
+ <cd:constant type="locale"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="fondo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="cima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="cornice">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="sovrapponi"/>
+ </cd:parameter>
+ <cd:parameter name="cornicecima">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="cornicefondo">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="cornicesinistra">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="cornicedestra">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="offsetcornice">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profonditacornice">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="angolocornice">
+ <cd:constant type="rotondo"/>
+ <cd:constant type="rettangolare"/>
+ </cd:parameter>
+ <cd:parameter name="raggiocornice">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colorecornice">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="sfondo">
+ <cd:constant type="schermo"/>
+ <cd:constant type="colore"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="foreground"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="schermosfondo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="coloresfondo">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="offsetsfondo">
+ <cd:constant type="cornice"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profonditasfondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="angolosfondo">
+ <cd:constant type="rotondo"/>
+ <cd:constant type="rettangolare"/>
+ </cd:parameter>
+ <cd:parameter name="raggiosfondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="angolo">
+ <cd:constant type="rotondo"/>
+ <cd:constant type="rettangolare"/>
+ </cd:parameter>
+ <cd:parameter name="raggio">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="vuoto">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="coloreprimopiano">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="spessorelinea">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="incorniciato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="circondato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineesottili"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="impostalineesottili" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostalineesottili"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="interlinea">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="coloresfondo">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="spessorelinea">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="sfondo">
+ <cd:constant type="colore"/>
+ </cd:parameter>
+ <cd:parameter name="coloresfondo">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="capello"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineasottile"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definiscitestoincorniciato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostatestiincorniciati" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definisciincorniciato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostatestiincorniciati" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostatestiincorniciati"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interno">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="correzioneriga">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="correzioneprofondita">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="standard"/>
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="rientro">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="testoincorniciato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="nessuno"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostatestiincorniciati" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="testoincorniciato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostatestiincorniciati" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="sfondo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="sfondo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostasfondo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="offsetsinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetdestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetcima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetfondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineeriempimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostalineeriempimento" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="testoriempimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostalineeriempimento" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostalineeriempimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="ampiezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="interlinea">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="rigariempimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostarigheriempimento" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostarigheriempimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostalineetesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="inmargine"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colorelinea">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineatesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineatesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineanera"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostalineenere" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="lineenere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="impostalineenere" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostalineenere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definiscisovrapposizione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="usamodulo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="reimposta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="notest"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="impostasistema"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="risoluzione">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="directory">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="casuale">
+ <cd:constant type="normale"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="reimposta"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="ped"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="ap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="pedap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="mostracornice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="bordo"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="allineasinistra"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="allineadestra"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="allineacentro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="paroladestra"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="inmargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inaltromargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="insinistra"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="indestra"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="ininner"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inouter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="colonna"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="mostrastruts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="mostraimpostazioni"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="mostralyout"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="testoinmargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="basso"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="impostablocchimargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="inmargine"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="cima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="fondo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="in"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="al"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="intorno"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="daqualcheparte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="apagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="rif"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="riferimentotesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="riferimentopagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="riferimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="usariferimenti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definisciriferimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definisciformatoriferimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="testo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="etichetta">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="vaigiu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="spaziobianco"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nientespaziobianco"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="spazio"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="spazifissi"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="emptylines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nientespazio"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impaccato"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="impostadescrizioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="campione">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="testo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="titleleft">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="titleright">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="distanzatitolo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stiletitolo">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="coloretitolo">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="standard"/>
+ <cd:constant type="si"/>
+ <cd:constant type="no" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra" default="yes"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="vicino"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="insinistra"/>
+ <cd:constant type="indestra"/>
+ <cd:constant type="sospeso"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesta">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="coloretesta">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="headcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sospendi">
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="rientrasuccessivo">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="rientro">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="impostaenumerazioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostadescrizioni" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definiscienumerazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="impostaenumerazioni" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumerazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumerazione"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definiscidescrizione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostadescrizioni" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="descrizione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="descrizione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="impostarientri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesta">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="testo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="campione">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definiscirientro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostarientri" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definiscietichetta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="testo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="inmargine"/>
+ <cd:constant type="intesto"/>
+ </cd:parameter>
+ <cd:parameter name="modo">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="blockway">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesta">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="coloretesta">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="impostacolonne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ncima">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="linea">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolleranza">
+ <cd:constant type="moltorigido"/>
+ <cd:constant type="rigido"/>
+ <cd:constant type="tollerante"/>
+ <cd:constant type="moltotollerante"/>
+ <cd:constant type="dilata"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bilanciamento">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:constant type="testo"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="rigovuoto">
+ <cd:constant type="fisso"/>
+ <cd:constant type="mezzariga"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="flessibile"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="piccolo"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="sfondo"/>
+ </cd:parameter>
+ <cd:parameter name="direzione">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostacolonne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="definiscitesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="intestazione"/>
+ <cd:constant type="piedipagina"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostainstestazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="bordo"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="normale"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="inizia"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="nomarcature"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilesinistra">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiledestra">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzasinistra">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzadestra">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostapdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="impostainstestazione" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostainstestazione" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostatesto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="impostainstestazione" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostainstestazione" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostacima"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="impostainstestazione" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostainstestazione" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostafondo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="impostainstestazione" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostainstestazione" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nientelineintestazionepdp"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="nientelineecimafondo"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostatestiintestazioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostatestipdp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostatestotesti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostatesticima"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="impostatestifondo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="settext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="definiscimarcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="accoppiamarcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="separamarcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="reimpostamarcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="impostamarcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="espansione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="marcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="prendimarcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="primo"/>
+ <cd:constant type="ultimo"/>
+ <cd:constant type="precedente"/>
+ <cd:constant type="entrambi"/>
+ <cd:constant type="tutti"/>
+ <cd:constant type="corrente"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="nientemarcatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="impostalayout"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="centro"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="centro"/>
+ </cd:parameter>
+ <cd:parameter name="backspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spaziocima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginesinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="intestazione">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="piedipagina">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bordosinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bordodestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzaintestazione">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzapdp">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzacima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzafondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzamarginesinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzamarginedestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzabordosinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzabordodestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="marcatura">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ <cd:constant type="colore"/>
+ <cd:constant type="schermo"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="pagina"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="facciasingola"/>
+ <cd:constant type="doppiafaccia"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="righe">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="colonne">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distanzacolonne">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="griglia">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="spaziofondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cutspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzatesto">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzatesto">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="textmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="carta">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="adattalayout"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="righe">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="mostragriglia"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reimposta"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="tutti"/>
+ <cd:constant type="righe"/>
+ <cd:constant type="cornice"/>
+ <cd:constant type="nonumber"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="esterno"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="mettiingriglia"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="spostaagriglia" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="spostaagriglia"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="cima"/>
+ <cd:constant type="entrambi"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="basso"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="profondita"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="reimposta"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="progetto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="ambiente"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="prodotto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="componenet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="bastafile"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impostainterlinea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="reimposta"/>
+ <cd:constant type="piccolo" default="yes"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="impostainterlinea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="riga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cima">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="fondo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="impostanumerazionepagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="facciasingola"/>
+ <cd:constant type="doppiafaccia"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="intestazione"/>
+ <cd:constant type="piedipagina"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="bordomargine"/>
+ <cd:constant type="insinistra"/>
+ <cd:constant type="indestra"/>
+ </cd:parameter>
+ <cd:parameter name="conversione">
+ <cd:constant type="numeri"/>
+ <cd:constant type="lettere"/>
+ <cd:constant type="Lettere"/>
+ <cd:constant type="numeriromani"/>
+ <cd:constant type="Numeriromani"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="modo">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="testo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="separatorenumero">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="separatoretesto">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="ultimo"/>
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impostapiustretto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="centro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="definisci"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="usacomandi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="definisciiniziatermina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="comandi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="impostateste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numerosezione">
+ <cd:constant type="si"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="normale"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="capoverso"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="allineatitolo">
+ <cd:constant type="si"/>
+ <cd:constant type="oggettomobile"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="tolleranza">
+ <cd:constant type="moltorigido"/>
+ <cd:constant type="rigido"/>
+ <cd:constant type="tollerante"/>
+ <cd:constant type="moltotollerante"/>
+ <cd:constant type="dilata"/>
+ </cd:parameter>
+ <cd:parameter name="rientrasuccessivo">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="impostacaptions"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="basso"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="lefthanging"/>
+ <cd:constant type="righthanging"/>
+ <cd:constant type="marginesinistro"/>
+ <cd:constant type="marginedestro"/>
+ <cd:constant type="margineinterno"/>
+ <cd:constant type="margineesterno"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="max"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzamin">
+ <cd:constant type="adatta"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesta">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="numero">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="conversione">
+ <cd:constant type="numeri"/>
+ <cd:constant type="lettere"/>
+ <cd:constant type="Lettere"/>
+ <cd:constant type="numeriromani"/>
+ <cd:constant type="Numeriromani"/>
+ </cd:parameter>
+ <cd:parameter name="modo">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="impostacaption"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostacaptions" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="impostaoggettimobili"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="centro"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spazioprima">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="spaziodopo">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="spaziolateraleprima">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="spaziolateraledopo">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="rientrasuccessivo">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="ncima">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nfondo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nrighe">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="implicito">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tolleranza">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="distanzamarginesinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzamarginedestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sidealign">
+ <cd:constant type="normale"/>
+ <cd:constant type="riga"/>
+ </cd:parameter>
+ <cd:parameter name="numerazione">
+ <cd:constant type="si"/>
+ <cd:constant type="nocheck"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="impostaspezzamentooggettomobile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversione">
+ <cd:constant type="numeri"/>
+ <cd:constant type="lettere"/>
+ <cd:constant type="Lettere"/>
+ <cd:constant type="numeriromani"/>
+ <cd:constant type="Numeriromani"/>
+ </cd:parameter>
+ <cd:parameter name="righe">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="spezzaoggettomobile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostaspezzamentooggettomobile" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="impostaposizionamentoopposti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostasegnosillabazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="segno">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="impostaposizionamento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="sovrapponi"/>
+ </cd:parameter>
+ <cd:parameter name="unita">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="assoluto"/>
+ <cd:constant type="relativo"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="assoluto"/>
+ <cd:constant type="relativo"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="griglia"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="unita">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="pagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="si" default="yes"/>
+ <cd:constant type="makeup"/>
+ <cd:constant type="no"/>
+ <cd:constant type="preferenza"/>
+ <cd:constant type="grandepreferenza"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="disattiva"/>
+ <cd:constant type="ultimo"/>
+ <cd:constant type="quadruplo"/>
+ <cd:constant type="pari"/>
+ <cd:constant type="dispari"/>
+ <cd:constant type="rigovuoto"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="reimposta"/>
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="impostariferimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="prefisso">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="interazione">
+ <cd:constant type="etichetta"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="tutti"/>
+ <cd:constant type="simbolo"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="convertifile">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="grande"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autofile">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="pagina"/>
+ </cd:parameter>
+ <cd:parameter name="globale">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="export">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="impostaurl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="alternativaurl">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="entrambi"/>
+ <cd:constant type="prima"/>
+ <cd:constant type="dopo"/>
+ </cd:parameter>
+ <cd:parameter name="spaziourl">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="scriviinlistariferimenti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placereferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definiscilistariferimenti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostalistariferimenti" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="impostalistariferimenti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="criterio">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="locale"/>
+ <cd:constant type="precedente"/>
+ <cd:constant type="tutti"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="scriviinelenco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="scrividentroelenco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="nienteelenco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="listsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="mettielenco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostaelenco" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="determinacarattersticheelenco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostaelenco" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="mettielencocombinato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostaelencocombinato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definiscielenco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="impostaelenco" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="impostaelenco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="comando"/>
+ </cd:parameter>
+ <cd:parameter name="accoppiamento">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="criterio">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="locale"/>
+ <cd:constant type="precedente"/>
+ <cd:constant type="corrente"/>
+ <cd:constant type="qui"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="tutti"/>
+ </cd:parameter>
+ <cd:parameter name="limitipagina">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilenumero">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesto">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilepagina">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="comandonumero">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandotesto">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandopagina">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="interazione">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="numeropagina"/>
+ <cd:constant type="tutti"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="etichetta">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="prefisso">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="numeropagina">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="numerotesta">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="allineatitolo">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="simbolo">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="espansione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="comando"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzamax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="comando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dilata">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definiscielencocombinato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="impostaelencocombinato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="impostaelencocombinato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="livello">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="corrente"/>
+ </cd:parameter>
+ <cd:inherit name="impostaelenco" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="metti"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostaelencocombinato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="completo"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostaelencocombinato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="impostanumerazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="modo">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="impostaformule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="centro"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="center"/>
+ </cd:parameter>
+ <cd:parameter name="marginesinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rientrasuccessivo">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="spazioprima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="conversione">
+ <cd:constant type="numeri"/>
+ <cd:constant type="lettere"/>
+ <cd:constant type="Lettere"/>
+ <cd:constant type="numeriromani"/>
+ <cd:constant type="Numeriromani"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="pubblicazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostapubblicazioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="apa"/>
+ <cd:constant type="normale"/>
+ </cd:parameter>
+ <cd:inherit name="impostaenumerazioni" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="impostarighe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rientro">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="spazio">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="impaccato"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="impostanumerazionecapoversi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="reimposta"/>
+ <cd:constant type="riga"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="impostanumerazionerighe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversione">
+ <cd:constant type="numeri"/>
+ <cd:constant type="lettere"/>
+ <cd:constant type="Lettere"/>
+ <cd:constant type="numeriromani"/>
+ <cd:constant type="Numeriromani"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="inizia">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="passo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="centro"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="insinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="indestra"/>
+ <cd:constant type="interno"/>
+ <cd:constant type="esterno"/>
+ <cd:constant type="testo"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="end"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prefisso">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="referencing">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="continua"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="qualcheriga"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="inriga"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="impostainmargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="entrambi"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="riga">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separatore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stack">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="impostanumeropagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numero">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="mantieni"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="impostanumerosottopagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="modo">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impostarigovuoto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="normale" default="yes"/>
+ <cd:constant type="implicito"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="mezzariga"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="fisso"/>
+ <cd:constant type="flessibile"/>
+ <cd:constant type="globale"/>
+ <cd:constant type="ignoto"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="definiscirigovuoto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="impostarigovuoto" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="definiscidimensionicarta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="setuppaper"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="carta">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spaziocima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="backspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="max"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="metodo">
+ <cd:constant type="normale"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="impostadimensionicarta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="orizzontale"/>
+ <cd:constant type="riflesso"/>
+ <cd:constant type="ruotato"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="negativo"/>
+ <cd:inherit name="impostadimensionicarta" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="impostaparranging"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="disattiva"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="riflesso"/>
+ <cd:constant type="ruotato"/>
+ <cd:constant type="doppiafaccia"/>
+ <cd:constant type="negativo"/>
+ <cd:constant type="sfondo"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="mostrastampa"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="impostadimensionicarta" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="impostadimensionicarta" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="impostalayout" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="definiscilogo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cima"/>
+ <cd:constant type="intestazione"/>
+ <cd:constant type="piedipagina"/>
+ <cd:constant type="fondo"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="bordosinistro"/>
+ <cd:constant type="marginesinistro"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="marginedestro"/>
+ <cd:constant type="bordodestro"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="comando">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="mettiloghi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="impostaspaziobianco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="nessuno" default="yes"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="fisso"/>
+ <cd:constant type="fisso"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="impostarientro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definiscibloccosezione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="impostabloccosezione" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostabloccosezione" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="impostabloccosezione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="numero">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="si"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definiscisezione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="impostasezione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="conversione">
+ <cd:constant type="numeri"/>
+ <cd:constant type="lettere"/>
+ <cd:constant type="Lettere"/>
+ <cd:constant type="numeriromani"/>
+ <cd:constant type="Numeriromani"/>
+ </cd:parameter>
+ <cd:parameter name="numeroprecedente">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="impostatesta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesto">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilenumero">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="coloretesto">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="colorenumero">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="numero">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="numeroproprio">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="si"/>
+ </cd:parameter>
+ <cd:parameter name="continua">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="intestazione">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="nomarcature"/>
+ </cd:parameter>
+ <cd:parameter name="testo">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="nomarcature"/>
+ </cd:parameter>
+ <cd:parameter name="piedipagina">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="nomarcature"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="normale"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="sospendi">
+ <cd:constant type="nessuno"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="comandonumero">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandotesto">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deepnumbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="prefisso">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="mettitesta">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="vuoto"/>
+ </cd:parameter>
+ <cd:parameter name="incrementanumero">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="resetnumber">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="espansione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="comando"/>
+ </cd:parameter>
+ <cd:parameter name="testomargine">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:inherit name="impostateste" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="impostanumerotesta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="numerotesta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="determinanumerotesta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="numerotestacorrente"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="successivo"/>
+ <cd:variable value="capoverso"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definiscitesta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="setupitemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ogni"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="vicino"/>
+ <cd:constant type="impaccato"/>
+ <cd:constant type="unpacked"/>
+ <cd:constant type="nobianco"/>
+ <cd:constant type="prima"/>
+ <cd:constant type="dopo"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="unito"/>
+ <cd:constant type="almargine"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="lento"/>
+ <cd:constant type="ripeti"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="capoverso"/>
+ <cd:constant type="intesto"/>
+ <cd:constant type="casuale"/>
+ <cd:constant type="invertito"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="margine">
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginesinistro">
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedestro">
+ <cd:constant type="no"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="passo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="elementi">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="inizia">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="primaditesta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopotesta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesta">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilemarcatura">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilesimbolo">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="simbolo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="symallinea">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="rientrasuccessivo">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="distanzatesto">
+ <!-- maybe resolve here too -->
+ <cd:constant type="nessuno"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="piccolo"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="continua"/>
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="vicino"/>
+ <cd:constant type="impaccato"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="unito"/>
+ <cd:constant type="almargine"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="colonne"/>
+ <cd:constant type="testo"/>
+ <cd:constant type="capoverso"/>
+ <cd:constant type="ripeti"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupitemgroup" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="elemento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="fondo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="el"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="testa"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="mar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="sim"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="nop"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="definisciregistro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="impostaregistro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="bilanciamento">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilepagina">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesto">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="indicatore">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="accoppiamento">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="criterio">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="locale"/>
+ <cd:constant type="tutti"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="simbolo">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="interazione">
+ <cd:constant type="numeropagina"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="espansione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="comando"/>
+ </cd:parameter>
+ <cd:parameter name="referencing">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzamax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="riferimentoingoto">
+ <cd:constant type="vuoto"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="prefisso">
+ <cd:constant type="entrambi"/>
+ <cd:constant type="primo"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="no"/>
+ <cd:constant type="si"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="registro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="inizia"/>
+ <cd:variable value="registro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="scriviinregistro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="accoppiato"/>
+ <cd:variable value="registro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="accoppiaregistro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="mettiregistro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostaregistro" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="vedi"/>
+ <cd:variable value="registro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="completo"/>
+ <cd:variable value="registro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="impostaregistro" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="metti"/>
+ <cd:variable value="registro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="impostaregistro" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definiscisinonimi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="impostasinonimi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stiletesto">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilesinonimi">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="vicino"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="insinistra"/>
+ <cd:constant type="indestra"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="criterio">
+ <cd:constant type="tutti"/>
+ <cd:constant type="usato"/>
+ </cd:parameter>
+ <cd:parameter name="conversione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="espansione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="comando"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="carica"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definisciordinamento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="impostaordinamento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="criterio">
+ <cd:constant type="tutti"/>
+ <cd:constant type="usato"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="espansione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="comando"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="carica"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="definiscimakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="impostamakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostamakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="impostamakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="si"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:parameter name="comandi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="doppiafaccia">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="vuoto"/>
+ </cd:parameter>
+ <cd:parameter name="statointestazione">
+ <cd:constant type="normale"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="inizia"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="nomarcature"/>
+ </cd:parameter>
+ <cd:parameter name="statopdp">
+ <cd:constant type="normale"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="inizia"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="nomarcature"/>
+ </cd:parameter>
+ <cd:parameter name="statotesto">
+ <cd:constant type="normale"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="inizia"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="nomarcature"/>
+ </cd:parameter>
+ <cd:parameter name="statocima">
+ <cd:constant type="termina"/>
+ <cd:constant type="inizia"/>
+ </cd:parameter>
+ <cd:parameter name="statofondo">
+ <cd:constant type="termina"/>
+ <cd:constant type="inizia"/>
+ </cd:parameter>
+ <cd:parameter name="statopagina">
+ <cd:constant type="termina"/>
+ <cd:constant type="inizia"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="nome"/>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="versione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="finale" default="yes"/>
+ <cd:constant type="concetto"/>
+ <cd:constant type="temporaneo"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="datadioggi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="data" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="data"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="giorno"/>
+ <cd:constant type="mese"/>
+ <cd:constant type="anno"/>
+ <cd:constant type="giornosettimana"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="spazio"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="referral"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="datareferral"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="rientro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nienterientro"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="rigovuoto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande" default="yes"/>
+ <cd:constant type="nobianco"/>
+ <cd:constant type="dietro"/>
+ <cd:constant type="bianco"/>
+ <cd:constant type="disattiva"/>
+ <cd:constant type="forza"/>
+ <cd:constant type="reimposta"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="mezzariga"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="fisso"/>
+ <cd:constant type="flessibile"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="sempre"/>
+ <cd:constant type="esterno"/>
+ <cd:constant type="unito"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impaccato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="rigovuoto"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="correggispaziobianco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="locale"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro" default="yes"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impostaallineamento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="ampiezza"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="interno"/>
+ <cd:constant type="esterno"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="altezza"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="reimposta"/>
+ <cd:constant type="sospeso"/>
+ <cd:constant type="nonsospeso"/>
+ <cd:constant type="sillabato"/>
+ <cd:constant type="nonsillabato"/>
+ <cd:constant type="lesshyphenation"/>
+ <cd:constant type="morehyphenation"/>
+ <cd:constant type="nuovo"/>
+ <cd:constant type="old"/>
+ <cd:constant type="normale"/>
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="flushouter"/>
+ <cd:constant type="flushinner"/>
+ <cd:constant type="center"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="nohz"/>
+ <cd:constant type="spaziatura"/>
+ <cd:constant type="nospacing"/>
+ <cd:constant type="tollerante"/>
+ <cd:constant type="moltotollerante"/>
+ <cd:constant type="dilata"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="impostaallineamento" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="impostaspaziatura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="ampio"/>
+ <cd:constant type="impaccato"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impostatolleranza"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="orizzontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="dilata"/>
+ <cd:constant type="spazio"/>
+ <cd:constant type="moltorigido" default="yes"/>
+ <cd:constant type="rigido"/>
+ <cd:constant type="tollerante"/>
+ <cd:constant type="moltotollerante"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="tipopagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="elaborapagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="si" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="accoppiapagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="opzione">
+ <cd:constant type="doppiafaccia"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="posizione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="impostaschermi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="metodo">
+ <cd:constant type="punto"/>
+ <cd:constant type="linea"/>
+ <cd:constant type="esterno"/>
+ </cd:parameter>
+ <cd:parameter name="risoluzione">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="schermo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="impostasfondi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cima"/>
+ <cd:constant type="intestazione"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="piedipagina"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="carta"/>
+ <cd:constant type="paginasinistra"/>
+ <cd:constant type="paginadestra"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="bordosinistro"/>
+ <cd:constant type="marginesinistro"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marginedestro"/>
+ <cd:constant type="bordodestro"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="prendibuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="typebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definiscibuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="impostabuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="capoverso">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definisciblocco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="bastablocchi"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="nascondiblocchi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="tieniblocchi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="tutti"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="usablocco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="elaborablocchi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="saltablocchi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="forzablocchi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="selezionablocchi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="criterio">
+ <cd:constant type="tutti"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="impostablocco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interno">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="formula"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="matematica"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="mettiformula"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="mettisottoformula"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="metti"/>
+ <cd:variable value="oggettomobile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="qui" default="yes"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="insinistra"/>
+ <cd:constant type="indestra"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="marginesinistro"/>
+ <cd:constant type="marginedestro"/>
+ <cd:constant type="bordosinistro"/>
+ <cd:constant type="bordodestro"/>
+ <cd:constant type="margineinterno"/>
+ <cd:constant type="margineesterno"/>
+ <cd:constant type="bordointerno"/>
+ <cd:constant type="bordoesterno"/>
+ <cd:constant type="interno"/>
+ <cd:constant type="esterno"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="basso"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="paginasinistra"/>
+ <cd:constant type="paginadestra"/>
+ <cd:constant type="opposto"/>
+ <cd:constant type="sempre"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="forza"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="reimposta"/>
+ <cd:constant type="riga"/>
+ <cd:constant type="altezza"/>
+ <cd:constant type="profondita"/>
+ <cd:constant type="separa"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="riserva"/>
+ <cd:variable value="oggettomobile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cornice">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="definiscioggettomobile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="impostaoggettomobile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezzamax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzamax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzamin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="implicito">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="limitipagina">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="distanzamarginesinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanzamarginedestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="oggettomobile"/>
+ <cd:string value="testo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="basso"/>
+ <cd:constant type="offset"/>
+ <cd:constant type="alto"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="referral"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ref">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="selezionacarta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="famiglia">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="accoppiacarta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chim"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="frazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="punti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="elementi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostaelementi" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostaelementi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ </cd:parameter>
+ <cd:parameter name="simbolo">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ignoto"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="centro" default="yes"/>
+ <cd:constant type="destra"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="menzione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostamenzione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="margine"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="definiscicapoversi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="linea">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="adatta"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interno">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolleranza">
+ <cd:constant type="moltorigido"/>
+ <cd:constant type="rigido"/>
+ <cd:constant type="tollerante"/>
+ <cd:constant type="moltotollerante"/>
+ <cd:constant type="dilata"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="capoverso"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="capoverso"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostacapoversi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ogni"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="tolleranza">
+ <cd:constant type="moltorigido"/>
+ <cd:constant type="rigido"/>
+ <cd:constant type="tollerante"/>
+ <cd:constant type="moltotollerante"/>
+ <cd:constant type="dilata"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interno">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="linea">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostatab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="campione">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stiletesta">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="tab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="etichette"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="definiscitabulato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="tabulato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostafigureesterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="impostatabulato"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="unita">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rientro">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="interno">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="colorelinea">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="spessorelinea">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="rigovuoto"/>
+ <cd:constant type="griglia"/>
+ <cd:constant type="profondita"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="linea">
+ <cd:constant type="normale"/>
+ <cd:constant type="riga"/>
+ </cd:parameter>
+ <cd:parameter name="separa">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="impostatabelle"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="distanza">
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ </cd:parameter>
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="spessorelinea">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colorelinea">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="comandi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="sfondo">
+ <cd:constant type="schermo"/>
+ <cd:constant type="colore"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="schermosfondo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="coloresfondo">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="definiscimodellotabella"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="usafileesterni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="usafileesterno"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="usafiguraesterna"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="impostafigureesterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="figuraesterna"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostafigureesterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="impostafigureesterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="max"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ </cd:parameter>
+ <cd:parameter name="wfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="hfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cornice">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="preimpostato">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="anteprima">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="ripeti">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="oggetto">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="type">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="metodo">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="cornice"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="test"/>
+ </cd:parameter>
+ <cd:parameter name="cornici">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="directory">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="locale"/>
+ <cd:constant type="globale"/>
+ <cd:constant type="implicito"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezzamax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezzamax">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="conversione">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prefisso">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="mostrafiguresterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="usacolonnasonoraesterna"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="due"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="fatto"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="ruota"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostarotazione" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostarotazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rotazione">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="normale"/>
+ <cd:constant type="alto"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="ampio"/>
+ <cd:constant type="profondita"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="riflessione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="scala"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="impostacombinazioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="cima"/>
+ <cd:constant type="centro"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="mettifiancoafianco"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="mettiunosullaltro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostaschermointerazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="backspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spaziocima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="horoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="max"/>
+ <cd:constant type="adatta"/>
+ <cd:constant type="doppiafaccia"/>
+ <cd:constant type="facciasingola"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="segnalibro"/>
+ </cd:parameter>
+ <cd:parameter name="attesa">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="schermo"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostatransizionepagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reimposta"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="impostainterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="menu">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="click">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="separa">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="nuovo"/>
+ </cd:parameter>
+ <cd:parameter name="azioneapri">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="azionechiudi">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="azioneapripagina">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="azionechiudipagina">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calcola">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="colorecontrasto">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="setsimboli">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titolo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="sottotitolo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autore">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="data">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="parolachiave">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="fieldlayer">
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostamenuinterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="centro">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ <cd:constant type="nessuno"/>
+ <cd:constant type="locale"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="colorecontrasto">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="sovrapponi"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stessapagina">
+ <cd:constant type="si"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="no"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="riferimentoingoto">
+ <cd:constant type="si"/>
+ <cd:constant type="vuoto"/>
+ <cd:constant type="no"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ <cd:parameter name="offsetsinistro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetdestro">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetcima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetfondo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="posizione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definiscimenuinterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostamenuinterazione" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definiscimenuinterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="impostamenuinterazione" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="menuinterattivo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="disabilitamenuinterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="cima"/>
+ <cd:constant type="fondo"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="usadocumentoesterno"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="usaURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="accoppiadocumento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="da"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="barrainterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="impostabarrainterazione" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="pulsantinterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="impostabarrainterazione" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostabarrainterazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="alternativa">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="simbolo">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="altezza"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="altezza"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="profondita">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="passo">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="piccolo"/>
+ <cd:constant type="medio"/>
+ <cd:constant type="grande"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="sincronizza"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostabarrasincronizzazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="pagina"/>
+ <cd:constant type="locale"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="altezza"/>
+ <cd:constant type="adatta"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="barrasincronizzazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="alternativa">
+ <cd:constant type="pagina"/>
+ <cd:constant type="locale"/>
+ </cd:parameter>
+ <cd:inherit name="impostabarrasincronizzazione" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostasincronizzazione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definisciprofilo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostaprofili"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="opzione">
+ <cd:constant type="test"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seguiprofilo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="mettisegnalibro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="tutti"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="segnalibro"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="versione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostaversioni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numero">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="marcaversione"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="selezionaversione"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definisciversion"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seguiversione"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seguiversioneprofilo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="definisciprogramma"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="impostaprogrammi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="directory">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="programma"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="fattore">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="cornice">
+ <cd:constant type="attivo"/>
+ <cd:constant type="disattivo"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="vaia"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="vaiabox"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="pulsante"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="impostapulsanti" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="impostapulsanti"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="impostacommento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titolo">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spazio">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ <cd:parameter name="simbolo">
+ <cd:constant type="normale"/>
+ <cd:constant type="Nuovo"/>
+ <cd:constant type="Pallone"/>
+ <cd:constant type="Aggiunta"/>
+ <cd:constant type="Aiuto"/>
+ <cd:constant type="Capoverso"/>
+ <cd:constant type="Tasto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="max"/>
+ <cd:constant type="buffer"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="commento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostacommento" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="commento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="impostacommento" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definiscicampo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="testo"/>
+ <cd:constant type="riga"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definiscisottocampo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="copiacampo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="clonacampo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="campi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="adattacampo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="camporiempimento"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="tooltip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sinistra"/>
+ <cd:constant type="destra"/>
+ <cd:constant type="centro"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="mostracampi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="logcampi"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="impostacampo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="etichetta"/>
+ <cd:constant type="orizzontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="cornice"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="impostacampi" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="impostacampi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="reimposta"/>
+ <cd:constant type="etichetta"/>
+ <cd:constant type="orizzontale"/>
+ <cd:constant type="verticale"/>
+ <cd:constant type="cornice"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="prima">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dopo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="colore">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stile">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="allinea">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="opzione">
+ <cd:constant type="solalettura"/>
+ <cd:constant type="richiestp"/>
+ <cd:constant type="protetto"/>
+ <cd:constant type="ordinato"/>
+ <cd:constant type="nondisponibile"/>
+ <cd:constant type="nascosto"/>
+ <cd:constant type="stampabile"/>
+ </cd:parameter>
+ <cd:parameter name="clickdentro">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="clickfuori">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="entraregione">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="esciregione">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="dopotasto">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="format">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="verifica">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calcola">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="offsetcampo">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colorecornicecampo">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="coloresfondocampo">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="impostaincorniciato" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="impostacampi" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="impostacampi" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="impostaforms"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="metodo">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definiscistackcampi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="impostacampi" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="stackcampi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="impostacampi" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="clip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="impostaclippling" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="impostaclippling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stato">
+ <cd:constant type="inizia"/>
+ <cd:constant type="termina"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetsinistro">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetdestro">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetcima">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetfondo">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="mettilegenda"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="impostalegenda"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distanza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ampiezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="altezza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="luogo">
+ <cd:constant type="destra"/>
+ <cd:constant type="fondo"/>
+ </cd:parameter>
+ <cd:parameter name="fonttesto">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impostastrut"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="si" default="yes"/>
+ <cd:constant type="no"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescriptfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescript"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="testo">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="si"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="si"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="si"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="no" default="yes"/>
+ <cd:constant type="si"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="type">
+ <cd:constant type="sospeso" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="spaziatura"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="fattore">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="min">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="max">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="passo">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definiscisinonimofont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definiscisinonimofont" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="definiscifont" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/cont-nl.xml b/tex/context/interface/cont-nl.xml
new file mode 100644
index 000000000..990b915c9
--- /dev/null
+++ b/tex/context/interface/cont-nl.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="nl" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="binnen"/>
+ <cd:constant type="buiten"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="lijnlinks"/>
+ <cd:constant type="lijnrechts"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="centreer"/>
+ <cd:constant type="normaal"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="ja"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="lijnlinks"/>
+ <cd:constant type="lijnrechts"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="centreer"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="nooit"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="niet"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="altijd"/>
+ <cd:constant type="eerste"/>
+ <cd:constant type="volgende"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="normaal"/>
+ <cd:constant type="oneven"/>
+ <cd:constant type="even"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="normaal"/>
+ <cd:constant type="vet"/>
+ <cd:constant type="schuin"/>
+ <cd:constant type="vetschuin"/>
+ <cd:constant type="type"/>
+ <cd:constant type="kap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="datum"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="paginanummer"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="tekst" default="yes"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="rand"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="boven"/>
+ <cd:constant type="hoofd"/>
+ <cd:constant type="tekst" default="yes"/>
+ <cd:constant type="voet"/>
+ <cd:constant type="onder"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="groot"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="installeertaal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spatiering">
+ <cd:constant type="opelkaar" default="yes"/>
+ <cd:constant type="ruim"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="linkerzin">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="rechterzin">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="linkersubzin">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="rechtersubzin">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="linkerciteer">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechterciteer">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="linkercitaat">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechtercitaat">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="linkeruitspraak">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middenuitspraak">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="rechteruitspraak">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="limiettekst">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="datum">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="koppelteken">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="linkerkoppelteken">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rechterkoppelteken">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="steltaalin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="installeertaal" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="taal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="hoofdtaal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="vertaal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="usecodering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="gebruikspecials"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="definieeruitvoer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="steluitvoerin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definieerkorpsomgeving"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="default"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="tekst">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="klein">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="groot">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="interlinie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="stelkorpsomgevingin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="definieerkorpsomgeving" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="definieerkorpsomgeving" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="definieerkorpsomgeving" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="toonkorpsomgeving"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="stelkorpsin" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definieerkorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="default"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definieerkorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="stelkorpsin" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="stelkorpsin" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definieerkorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="stelkorpsin" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="stelkorpsin" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="toonkorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="stelkorpsin" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="stelkorpsin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="romaan"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="schreefloos"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="handschrift"/>
+ <cd:constant type="calligrafie"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="switchnaarkorps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="romaan"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="support"/>
+ <cd:constant type="schreefloos"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="handschrift"/>
+ <cd:constant type="calligrafie"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="groot"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definieerfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="stelkleurin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="stelkleurenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="globaal"/>
+ <cd:constant type="lokaal"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="altijd"/>
+ <cd:constant type="nooit"/>
+ </cd:parameter>
+ <cd:parameter name="reductie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="tekstkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="splitsen">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="geen"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definieerkleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="kleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="kleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="grijskleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="toonkleur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definieerpalet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="stelpaletin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definieerkleurgroep"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="grijs"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="toonpalet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontaal"/>
+ <cd:constant type="vertikaal"/>
+ <cd:constant type="naam"/>
+ <cd:constant type="waarde"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="toonkleurgroep"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="horizontaal"/>
+ <cd:constant type="vertikaal"/>
+ <cd:constant type="naam"/>
+ <cd:constant type="waarde"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="vergelijkpalet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="vergelijkkleurgroep"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="toonopmaak"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definieertype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="steltypein" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="steltypein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="spatie">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="schuin"/>
+ <cd:constant type="normaal"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="type"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tex"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="arg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definieertypen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="steltypenin" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="steltypenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="steltypenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="file"/>
+ <cd:constant type="typen"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spatie">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="schuin"/>
+ <cd:constant type="normaal"/>
+ <cd:constant type="commandos" version="mkiv"/>
+ <cd:constant type="kleur"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="tekst">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="icommando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vcommando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="ccommando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standaard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="evenmarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="onevenmarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="blanko">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="standaard"/>
+ <cd:constant type="halveregel"/>
+ <cd:constant type="regel"/>
+ </cd:parameter>
+ <cd:parameter name="escape">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spatie">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="tab">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="springvolgendein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="palet">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="bereik">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="regels">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="afgebroken"/>
+ </cd:parameter>
+ <cd:parameter name="leeg">
+ <cd:constant type="ja"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="nummeren">
+ <cd:constant type="regel"/>
+ <cd:constant type="file"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="nee"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="typen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typefile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="stelvoetnotenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="cijfers"/>
+ <cd:constant type="letters"/>
+ <cd:constant type="Letters"/>
+ <cd:constant type="romeins"/>
+ <cd:constant type="Romeins"/>
+ </cd:parameter>
+ <cd:parameter name="wijze">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="pagina"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="kolommen"/>
+ <cd:constant type="eerstekolom"/>
+ <cd:constant type="laatstekolom"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="lijn">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kolomafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margeafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nummercommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="tekstcommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="splitsen">
+ <cd:constant type="soepel"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="zeerstreng"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="tekstletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="tekstkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="interactie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="stelvoetnootdefinitiein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="steldoordefinierenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="voetnoot"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="voetnoottekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="noot"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="plaatslokalevoetnoten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelvoetnotenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="plaatsvoetnoten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelvoetnotenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="stelonderstrepenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="variant">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="lijndikte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="onderoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bovenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="lijnkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="romeins"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Romeins"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="cijfers"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="letter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Letter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="letters"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Letters"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="maand"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="MAAND"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="weekdag"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="WEEKDAG"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="stelkapitalenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="titel">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WOORD"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WOORDEN"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Woord"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Woorden"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="uitgerekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definieersymbool"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definieerfiguursymbool"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stelexternefigurenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="symbool"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="stelsymboolsetin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="gebruiksymbolen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="toonsymboolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="definieerconversie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="converteernummer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="stelkoptekstin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="stellabeltekstin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="koptekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="labeltekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelkantlijnin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="niveau">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="lijndikte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="kantlijn"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="kantlijn"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stellijndiktein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelomlijndin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hoogte">
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="vast"/>
+ <cd:constant type="lokaal"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="autobreedte">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="forceer"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="geen"/>
+ <cd:constant type="overlay"/>
+ <cd:constant type="default"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="diepte"/>
+ <cd:constant type="hangend"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="laho"/>
+ <cd:constant type="laag"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="handhaaf"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="geen"/>
+ <cd:constant type="leeg"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="globaal"/>
+ <cd:constant type="lokaal"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="onder">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="boven">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="kader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="bovenkader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="onderkader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="linkerkader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="rechterkader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="kaderoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kaderdiepte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kaderhoek">
+ <cd:constant type="rond"/>
+ <cd:constant type="recht"/>
+ </cd:parameter>
+ <cd:parameter name="kaderstraal">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kaderkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrond">
+ <cd:constant type="raster"/>
+ <cd:constant type="kleur"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="voorgrond"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondraster">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondoffset">
+ <cd:constant type="kader"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="achtergronddiepte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondhoek">
+ <cd:constant type="rond"/>
+ <cd:constant type="recht"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondstraal">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoek">
+ <cd:constant type="rond"/>
+ <cd:constant type="recht"/>
+ </cd:parameter>
+ <cd:parameter name="straal">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="leeg">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="voorgrondkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="voorgrondletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="lijndikte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="omlijnd"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="inlijnd"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="dunnelijnen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="steldunnelijnenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="steldunnelijnenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="interlinie">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="lijndikte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrond">
+ <cd:constant type="kleur"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="haarlijn"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="dunnelijn"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definieerkadertekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelkadertekstenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definieeromlijnd"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelkadertekstenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelkadertekstenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="binnen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="regelcorrectie">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="dieptecorrectie">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="standaard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="inspringen">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="kadertekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="geen"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelkadertekstenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="kadertekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelkadertekstenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="achtergrond"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="achtergrond"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelachtergrondin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="linkeroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechteroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bovenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="onderoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="invullijnen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelinvullijnenin" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="invultekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelinvullijnenin" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelinvullijnenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breedte">
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="interlinie">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="invulregel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelinvulregelsin" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelinvulregelsin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="steltekstlijnenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="inmarge"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="lijnkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="tekstlijn"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="tekstlijn"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="blokje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelblokjesin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="blokjes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="stelblokjesin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelblokjesin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definieeroverlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="gebruikmodule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="reset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="geentest"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="stelsysteemin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="resolutie">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="gebied">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="willekeur">
+ <cd:constant type="normaal"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="reset"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="laag"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="hoog"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="laho"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="toonkader"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="rand"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="regellinks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="regelrechts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="regelmidden"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="woordrechts"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="inmarge"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inanderemarge"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inlinker"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inrechter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inbinnen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inbuiten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="kolom"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="toonstruts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="tooninstellingen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="toonlayout"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="margetekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="laag"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stelmargeblokkenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="inmarge"/>
+ <cd:constant type="links"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="boven">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="onder">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="in"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="op"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="about"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ergens"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="oppagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="tekstreferentie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="paginareferentie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="referentie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="gebruikreferenties"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definieerreferentie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definieerreferentieformaat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="tekst">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="label">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="omlaag"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="witruimte"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="geenwitruimte"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="spatie"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="vastespaties"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="legeregels"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="geenspatie"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="opelkaar"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="steldoordefinierenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="monster">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="tekst">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="sluitsymbool">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="sluitcommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="sluitsymbool">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="titellinks">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="titelrechts">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="titelafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="titelletter">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="titelkleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="standaard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nee" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links" default="yes"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="aanelkaar"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="inlinker"/>
+ <cd:constant type="inrechter"/>
+ <cd:constant type="hangend"/>
+ </cd:parameter>
+ <cd:parameter name="kopletter">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="kopkleur">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="kopcommando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="hang">
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="springvolgendein">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="inspringen">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="steldoornummerenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="steldoordefinierenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="doornummeren"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="steldoornummerenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="doornummering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="doornummering"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="doordefinieren"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="steldoordefinierenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="doordefinitie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="doordefinitie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="steldoorspringenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kopletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tekst">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="monster">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="doorspringen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="steldoorspringenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="doorlabelen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="tekst">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="inmarge"/>
+ <cd:constant type="intekst"/>
+ </cd:parameter>
+ <cd:parameter name="wijze">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="blokwijze">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="kopletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kopkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="stelkolommenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nboven">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="lijn">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerantie">
+ <cd:constant type="zeerstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="soepel"/>
+ <cd:constant type="zeersoepel"/>
+ <cd:constant type="rek"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="balanceren">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:constant type="tekst"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="blanko">
+ <cd:constant type="vast"/>
+ <cd:constant type="halveregel"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="flexibel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="klein"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="achtergrond"/>
+ </cd:parameter>
+ <cd:parameter name="richting">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelkolommenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="definieertekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="hoofd"/>
+ <cd:constant type="voet"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelhoofdin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="rand"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="normaal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="geenmarkering"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="linkerletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="rechterletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="linkerbreedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterbreedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelvoetin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stelhoofdin" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelhoofdin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="steltekstin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stelhoofdin" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelhoofdin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelbovenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stelhoofdin" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelhoofdin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelonderin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="stelhoofdin" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelhoofdin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="geenhoofdenvoetregels"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="geenbovenenonderregels"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelhoofdtekstenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelvoettekstenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelteksttekstenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelboventekstenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="stelondertekstenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="steltekstinhoudin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="definieermarkering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="koppelmarkering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="ontkoppelmarkering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="resetmarkering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="stelmarkeringin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="expansie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="markeer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="haalmarkering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="eerste"/>
+ <cd:constant type="laatste"/>
+ <cd:constant type="vorige"/>
+ <cd:constant type="beide"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="huidige"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="geenmarkering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="stellayoutin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="midden"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="midden"/>
+ </cd:parameter>
+ <cd:parameter name="rugwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkermarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechtermarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoofd">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voet">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="boven">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="onder">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoofdafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voetafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bovenafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="onderafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkermargeafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechtermargeafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkerrandafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechterrandafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rugoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="markering">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ <cd:constant type="kleur"/>
+ <cd:constant type="raster"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="pagina"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="enkelzijdig"/>
+ <cd:constant type="dubbelzijdig"/>
+ </cd:parameter>
+ <cd:parameter name="schaal">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="regels">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="kolommen">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="kolomafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="grid">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="bodemwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="snijwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tekstafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tekstbreedte">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="tekstmarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="papier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="paslayoutaan"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="regels">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="toongrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="regels"/>
+ <cd:constant type="kader"/>
+ <cd:constant type="geennummer"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="links"/>
+ <cd:constant type="buiten"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="plaatsopgrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="verplaatsopgrid" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="verplaatsopgrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="standaard" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="boven"/>
+ <cd:constant type="beide"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="laag"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="diepte"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="projekt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="omgeving"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="produkt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="onderdeel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="geenfilesmeer"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelinterliniein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="klein" default="yes"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="stelinterliniein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="regel">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="boven">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="onder">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="stelpaginanummeringin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="variant">
+ <cd:constant type="enkelzijdig"/>
+ <cd:constant type="dubbelzijdig"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="hoofd"/>
+ <cd:constant type="voet"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="kantlijn"/>
+ <cd:constant type="inlinker"/>
+ <cd:constant type="inrechter"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="cijfers"/>
+ <cd:constant type="letters"/>
+ <cd:constant type="Letters"/>
+ <cd:constant type="romeins"/>
+ <cd:constant type="Romeins"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="wijze">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="tekst">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="nummerscheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="tekstscheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="laatste"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelsmallerin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="links">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="midden">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="definieer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="gebruikcommandos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="definieerstartstop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="commandos">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelkoppenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="sectienummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="normaal"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="alinea"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="afsluiter">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="titeluitlijnen">
+ <cd:constant type="ja"/>
+ <cd:constant type="blok"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="tolerantie">
+ <cd:constant type="zeerstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="soepel"/>
+ <cd:constant type="zeersoepel"/>
+ <cd:constant type="rek"/>
+ </cd:parameter>
+ <cd:parameter name="springvolgendein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stelblokkopjesin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="laag"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="links"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="linkshangend"/>
+ <cd:constant type="rechtshangend"/>
+ <cd:constant type="linkermarge"/>
+ <cd:constant type="rechtermarge"/>
+ <cd:constant type="binnenmarge"/>
+ <cd:constant type="buitenmarge"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="max"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minbreedte">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="nummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="cijfers"/>
+ <cd:constant type="letters"/>
+ <cd:constant type="Letters"/>
+ <cd:constant type="romeins"/>
+ <cd:constant type="Romeins"/>
+ </cd:parameter>
+ <cd:parameter name="wijze">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="afsluiter">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stelblokkopjein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelblokkopjesin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stelplaatsblokkenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="midden"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voorwit">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="nawit">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="zijvoorwit">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="zijnawit">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="springvolgendein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="nboven">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nonder">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nregels">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tolerantie">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="linkermargeafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechtermargeafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zijuitlijnen">
+ <cd:constant type="normaal"/>
+ <cd:constant type="regel"/>
+ </cd:parameter>
+ <cd:parameter name="nummeren">
+ <cd:constant type="ja"/>
+ <cd:constant type="geencontrole"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="stelplaatsbloksplitsenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="cijfers"/>
+ <cd:constant type="letters"/>
+ <cd:constant type="Letters"/>
+ <cd:constant type="romeins"/>
+ <cd:constant type="Romeins"/>
+ </cd:parameter>
+ <cd:parameter name="regels">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="splitsplaatsblok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelplaatsbloksplitsenin" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="stelnaastplaatsenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelkoppeltekenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="teken">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="stelpositionerenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="eenheid">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="schaal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="xstap">
+ <cd:constant type="absoluut"/>
+ <cd:constant type="relatief"/>
+ </cd:parameter>
+ <cd:parameter name="ystap">
+ <cd:constant type="absoluut"/>
+ <cd:constant type="relatief"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="rooster"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xstap">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ystap">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="schaal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="eenheid">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="midden"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="pagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="opmaak"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="voorkeur"/>
+ <cd:constant type="grotevoorkeur"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="blokkeer"/>
+ <cd:constant type="laatste"/>
+ <cd:constant type="viertal"/>
+ <cd:constant type="even"/>
+ <cd:constant type="oneven"/>
+ <cd:constant type="blanko"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="stelrefererenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="interactie">
+ <cd:constant type="label"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="symbool"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="converteerfile">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="groot"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autofile">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="pagina"/>
+ </cd:parameter>
+ <cd:parameter name="globaal">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="exporteer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="stelurlin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="urlvariant">
+ <cd:constant type="geen"/>
+ <cd:constant type="beide"/>
+ <cd:constant type="voor"/>
+ <cd:constant type="na"/>
+ </cd:parameter>
+ <cd:parameter name="urlspatie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="schrijfnaarreferentielijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="plaatsreferentielijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definieerreferentielijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelreferentielijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="stelreferentielijstin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokaal"/>
+ <cd:constant type="vorige"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="schrijfnaarlijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="schrijftussenlijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="geenlijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="lijstsymbool"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="plaatslijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="bepaallijstkenmerken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stellijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="plaatssamengesteldelijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelsamengesteldelijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definieerlijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stellijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="stellijstin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="geen"/>
+ <cd:constant type="commando"/>
+ </cd:parameter>
+ <cd:parameter name="koppeling">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokaal"/>
+ <cd:constant type="vorige"/>
+ <cd:constant type="huidige"/>
+ <cd:constant type="hier"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="paginaovergangen">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="nummerletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="tekstletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="paginaletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="nummercommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="tekstcommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="paginacommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="interactie">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="paginanummer"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="label">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="paginanummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="kopnummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="titeluitlijnen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="afsluiter">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="symbool">
+ <cd:constant type="geen"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="expansie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="commando"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="commando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rek">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definieersamengesteldelijst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stelsamengesteldelijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="stelsamengesteldelijstin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="niveau">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="huidige"/>
+ </cd:parameter>
+ <cd:inherit name="stellijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="plaats"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelsamengesteldelijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="volledige"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelsamengesteldelijstin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="stelnummerenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="wijze">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="stelformulesin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="midden"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standaard"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:constant type="lijnlinks"/>
+ <cd:constant type="lijnrechts"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="centreer"/>
+ </cd:parameter>
+ <cd:parameter name="linkermarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechtermarge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="springvolgendein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="voorwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="cijfers"/>
+ <cd:constant type="letters"/>
+ <cd:constant type="Letters"/>
+ <cd:constant type="romeins"/>
+ <cd:constant type="Romeins"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="publicatie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelpublicatiesin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="variant">
+ <cd:constant type="apa"/>
+ <cd:constant type="normaal"/>
+ </cd:parameter>
+ <cd:inherit name="steldoornummerenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="stelregelsin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inspringen">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="spatie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="opelkaar"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="stelparagraafnummerenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="regel"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="stelregelnummerenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="cijfers"/>
+ <cd:constant type="letters"/>
+ <cd:constant type="Letters"/>
+ <cd:constant type="romeins"/>
+ <cd:constant type="Romeins"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stap">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="midden"/>
+ <cd:constant type="links"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="inlinker"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="inrechter"/>
+ <cd:constant type="binnen"/>
+ <cd:constant type="buiten"/>
+ <cd:constant type="tekst"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="eind"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="refereren">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="verder"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="eenregel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="inregel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="stelinmargein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="beide"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="regel">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scheider">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stapel">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="stelpaginanummerin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="nummer">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="handhaaf"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="stelsubpaginanummerin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="wijze">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelblankoin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="normaal" default="yes"/>
+ <cd:constant type="default"/>
+ <cd:constant type="standaard"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="halveregel"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="vast"/>
+ <cd:constant type="flexibel"/>
+ <cd:constant type="globaal"/>
+ <cd:constant type="onbekend"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="definieerblanko"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="stelblankoin" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="definieerpapierformaat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="schaal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="stelpapierin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="papier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rugwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="max"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="methode">
+ <cd:constant type="normaal"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="stelpapierformaatin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="liggend"/>
+ <cd:constant type="gespiegeld"/>
+ <cd:constant type="geroteerd"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="negatief"/>
+ <cd:inherit name="stelpapierformaatin" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="stelarrangerenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="blokkeer"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="gespiegeld"/>
+ <cd:constant type="geroteerd"/>
+ <cd:constant type="dubbelzijdig"/>
+ <cd:constant type="negatief"/>
+ <cd:constant type="achtergrond"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="toonprint"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="stelpapierformaatin" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="stelpapierformaatin" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stellayoutin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="definieerbeeldmerk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="boven"/>
+ <cd:constant type="hoofd"/>
+ <cd:constant type="voet"/>
+ <cd:constant type="onder"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="geen"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="linkerrand"/>
+ <cd:constant type="linkermarge"/>
+ <cd:constant type="links"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="rechtermarge"/>
+ <cd:constant type="rechterrand"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="commando">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="plaatsbeeldmerken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="stelwitruimtein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="geen" default="yes"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="vast"/>
+ <cd:constant type="herstel"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="stelinspringenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definieersectieblok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="stelsectieblokin" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelsectieblokin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelsectieblokin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="nummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="ja"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definieersectie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelsectiein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="cijfers"/>
+ <cd:constant type="letters"/>
+ <cd:constant type="Letters"/>
+ <cd:constant type="romeins"/>
+ <cd:constant type="Romeins"/>
+ </cd:parameter>
+ <cd:parameter name="vorigenummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelkopin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="tekstletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="nummerletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tekstkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nummerkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="eigennummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="doorgaan">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="hoofd">
+ <cd:constant type="geen"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="geenmarkering"/>
+ </cd:parameter>
+ <cd:parameter name="tekst">
+ <cd:constant type="geen"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="geenmarkering"/>
+ </cd:parameter>
+ <cd:parameter name="voet">
+ <cd:constant type="geen"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="geenmarkering"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="normaal"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="hang">
+ <cd:constant type="geen"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="nummercommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="tekstcommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="diepnummercommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="dieptekstcommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="plaatskop">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="leeg"/>
+ </cd:parameter>
+ <cd:parameter name="verhoognummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="resetnummer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="expansie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="commando"/>
+ </cd:parameter>
+ <cd:parameter name="margetekst">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:inherit name="stelkoppenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="stelkopnummerin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="kopnummer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="bepaalkopnummer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="huidigekopnummer"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="volgende"/>
+ <cd:variable value="paragraaf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definieerkop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="stelitemgroepin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="elk"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="standaard" default="yes"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="aanelkaar"/>
+ <cd:constant type="opelkaar"/>
+ <cd:constant type="vanelkaar"/>
+ <cd:constant type="geenwit"/>
+ <cd:constant type="voor"/>
+ <cd:constant type="na"/>
+ <cd:constant type="afsluiter"/>
+ <cd:constant type="aansluitend"/>
+ <cd:constant type="opmarge"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="los"/>
+ <cd:constant type="herhaal"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="alinea"/>
+ <cd:constant type="intekst"/>
+ <cd:constant type="willekeurig"/>
+ <cd:constant type="omgekeerd"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="marge">
+ <cd:constant type="nee"/>
+ <cd:constant type="standaard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linkermarge">
+ <cd:constant type="nee"/>
+ <cd:constant type="standaard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechtermarge">
+ <cd:constant type="nee"/>
+ <cd:constant type="standaard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stap">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="items">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="kopvoor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="kopna">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="kopletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="marletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="symletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="afsluiter">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="symbool">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="symuitlijnen">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="springvolgendein">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="tekstafstand">
+ <!-- maybe resolve here too -->
+ <cd:constant type="geen"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="klein"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="verder"/>
+ <cd:constant type="standaard" default="yes"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="aanelkaar"/>
+ <cd:constant type="opelkaar"/>
+ <cd:constant type="afsluiter"/>
+ <cd:constant type="aansluitend"/>
+ <cd:constant type="opmarge"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="kolommen"/>
+ <cd:constant type="tekst"/>
+ <cd:constant type="alinea"/>
+ <cd:constant type="herhaal"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stelitemgroepin" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="som"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="but"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="its"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="kop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="mar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="sym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="nop"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="definieerregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="stelregisterin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="balanceren">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="paginaletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="tekstletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="aanduiding">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="koppeling">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="lokaal"/>
+ <cd:constant type="alles"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="symbool">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="interactie">
+ <cd:constant type="paginanummer"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="expansie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="commando"/>
+ </cd:parameter>
+ <cd:parameter name="refereren">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="onbekendeverwijzing">
+ <cd:constant type="leeg"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="beide"/>
+ <cd:constant type="eerste"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="comprimeren">
+ <cd:constant type="nee"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="dieptekstcommando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="start"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="schrijfnaarregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="gekoppelde"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="koppelregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="plaatsregister"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelregisterin" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="zie"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="volledige"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="stelregisterin" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="plaats"/>
+ <cd:variable value="register"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="stelregisterin" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definieersynoniemen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="stelsynoniemenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="tekstletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="synoniemletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="aanelkaar"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="inlinker"/>
+ <cd:constant type="inrechter"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="gebruikt"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="expansie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="commando"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="laad"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definieersorteren"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="stelsorterenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="gebruikt"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="expansie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="commando"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="laad"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="definieeropmaak"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="stelopmaakin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="opmaak"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelopmaakin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="stelopmaakin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="links"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="commandos">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dubbelzijdig">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="leeg"/>
+ </cd:parameter>
+ <cd:parameter name="hoofdstatus">
+ <cd:constant type="normaal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="geenmarkering"/>
+ </cd:parameter>
+ <cd:parameter name="voetstatus">
+ <cd:constant type="normaal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="geenmarkering"/>
+ </cd:parameter>
+ <cd:parameter name="tekststatus">
+ <cd:constant type="normaal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="geenmarkering"/>
+ </cd:parameter>
+ <cd:parameter name="bovenstatus">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="onderstatus">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="paginastatus">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="naam"/>
+ <cd:string value="opmaak"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="versie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="definitief" default="yes"/>
+ <cd:constant type="concept"/>
+ <cd:constant type="voorlopig"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="huidigedatum"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="datum" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="datum"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="dag"/>
+ <cd:constant type="maand"/>
+ <cd:constant type="jaar"/>
+ <cd:constant type="weekdag"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="spatie"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="kenmerk"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="kenmerkdatum"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="inspringen"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="nietinspringen"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="blanko"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot" default="yes"/>
+ <cd:constant type="geenwit"/>
+ <cd:constant type="terug"/>
+ <cd:constant type="wit"/>
+ <cd:constant type="blokkeer"/>
+ <cd:constant type="forceer"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="halveregel"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="vast"/>
+ <cd:constant type="flexibel"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="altijd"/>
+ <cd:constant type="buiten"/>
+ <cd:constant type="aansluitend"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="opelkaar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="blanko"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="corrigeerwitruimte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="lokale"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="midden" default="yes"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="steluitlijnenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="breedte"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="binnen"/>
+ <cd:constant type="buiten"/>
+ <cd:constant type="breed"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="hoogte"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="hangend"/>
+ <cd:constant type="niethangend"/>
+ <cd:constant type="afgebroken"/>
+ <cd:constant type="nietafgebroken"/>
+ <cd:constant type="lesshyphenation"/>
+ <cd:constant type="morehyphenation"/>
+ <cd:constant type="nieuw"/>
+ <cd:constant type="oud"/>
+ <cd:constant type="normaal"/>
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="lijnlinks"/>
+ <cd:constant type="lijnrechts"/>
+ <cd:constant type="lijnbuiten"/>
+ <cd:constant type="lijnbinnen"/>
+ <cd:constant type="centreer"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="geenhz"/>
+ <cd:constant type="spatiering"/>
+ <cd:constant type="geenspatiering"/>
+ <cd:constant type="soepel"/>
+ <cd:constant type="zeersoepel"/>
+ <cd:constant type="rek"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="steluitlijnenin" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="stelspatieringin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="ruim"/>
+ <cd:constant type="opelkaar"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="steltolerantiein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="horizontaal"/>
+ <cd:constant type="vertikaal"/>
+ <cd:constant type="rek"/>
+ <cd:constant type="spatie"/>
+ <cd:constant type="zeerstreng" default="yes"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="soepel"/>
+ <cd:constant type="zeersoepel"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="soortpagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="verwerkpagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="nee"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="koppelpagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="optie">
+ <cd:constant type="dubbelzijdig"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioneer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="stelrastersin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="methode">
+ <cd:constant type="punt"/>
+ <cd:constant type="lijn"/>
+ <cd:constant type="extern"/>
+ </cd:parameter>
+ <cd:parameter name="resolutie">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="raster">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="stelachtergrondenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="boven"/>
+ <cd:constant type="hoofd"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="voet"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="papier"/>
+ <cd:constant type="linkerpagina"/>
+ <cd:constant type="rechterpagina"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="linkerrand"/>
+ <cd:constant type="linkermarge"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="rechtermarge"/>
+ <cd:constant type="rechterrand"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="haalbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="typebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definieerbuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="stelbufferin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="alinea">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definieerblok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="geenblokkenmeer"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="verbergblokken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="handhaafblokken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="alles"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="gebruikblokken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="verwerkblokken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="passeerblokken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="forceerblokken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="selecteerblokken"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="criterium">
+ <cd:constant type="alles"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="stelblokin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="binnen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="formule"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="wiskunde"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="plaatsformule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="plaatssubformule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="plaats"/>
+ <cd:variable value="blok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="hier" default="yes"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="inlinker"/>
+ <cd:constant type="inrechter"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="marge"/>
+ <cd:constant type="linkermarge"/>
+ <cd:constant type="rechtermarge"/>
+ <cd:constant type="linkerrand"/>
+ <cd:constant type="rechterrand"/>
+ <cd:constant type="binnenmarge"/>
+ <cd:constant type="buitenmarge"/>
+ <cd:constant type="binnenrand"/>
+ <cd:constant type="buitenrand"/>
+ <cd:constant type="binnen"/>
+ <cd:constant type="buiten"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="laag"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="linkerpagina"/>
+ <cd:constant type="rechterpagina"/>
+ <cd:constant type="naast"/>
+ <cd:constant type="altijd"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="forceer"/>
+ <cd:constant type="lang"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="regel"/>
+ <cd:constant type="hoogte"/>
+ <cd:constant type="diepte"/>
+ <cd:constant type="splitsen"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="reserveer"/>
+ <cd:variable value="blok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="definieerplaatsblok"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="stelplaatsblokin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxhoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="minbreedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="default">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="paginaovergangen">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="linkermargeafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechtermargeafstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="blok"/>
+ <cd:string value="tekst"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="laag"/>
+ <cd:constant type="offset"/>
+ <cd:constant type="lang"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="kenmerk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ref">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="selecteerpapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="soort">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="koppelpapier"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="breuk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="punten"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="items"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelitemsin" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelitemsin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="inmarge"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ </cd:parameter>
+ <cd:parameter name="symbool">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="onbekend"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citaat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="midden" default="yes"/>
+ <cd:constant type="rechts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citaat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citeer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelciterenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marge"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="definieeralineas"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="lijn">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="passend"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="binnen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tolerantie">
+ <cd:constant type="zeerstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="soepel"/>
+ <cd:constant type="zeersoepel"/>
+ <cd:constant type="rek"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="alinea"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="alinea"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelalineasin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="elk"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="tolerantie">
+ <cd:constant type="zeerstreng"/>
+ <cd:constant type="streng"/>
+ <cd:constant type="soepel"/>
+ <cd:constant type="zeersoepel"/>
+ <cd:constant type="rek"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="binnen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="lijn">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="steltabin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="monster">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopletter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="tab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="labels"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="definieertabulatie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="tabulatie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelexternefigurenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="steltabulatiein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="eenheid">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inspringen">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="binnen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="lijnkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="lijndikte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="blanko"/>
+ <cd:constant type="grid"/>
+ <cd:constant type="diepte"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="lijn">
+ <cd:constant type="normaal"/>
+ <cd:constant type="regel"/>
+ </cd:parameter>
+ <cd:parameter name="splitsen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="steltabellenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="afstand">
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ </cd:parameter>
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="lijndikte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="lijnkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="commandos">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrond">
+ <cd:constant type="raster"/>
+ <cd:constant type="kleur"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondraster">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="achtergrondkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="definieertabelvorm"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="gebruikexternefiles"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="file">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="gebruikexternefile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="gebruikexternfiguur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="stelexternefigurenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="externfiguur"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelexternefigurenin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="stelexternefigurenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="schaal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yschaal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yschaal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="max"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ </cd:parameter>
+ <cd:parameter name="bfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="preset">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="scherm">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="preview">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="herhaal">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="object">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="type">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="methode">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="kader"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="test"/>
+ </cd:parameter>
+ <cd:parameter name="hokjes">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="gebied">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="lokaal"/>
+ <cd:constant type="globaal"/>
+ <cd:constant type="default"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="maxbreedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="maxhoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="toonexternefiguren"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="variant">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="gebruikexterngeluidsfragment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="twee"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="geg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="roteer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelroterenin" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelroterenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rotatie">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="normaal"/>
+ <cd:constant type="hoog"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="ruim"/>
+ <cd:constant type="diepte"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="spiegel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="schaal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="stelcombinatiesin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="boven"/>
+ <cd:constant type="midden"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="plaatsnaastelkaar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="plaatsonderelkaar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelinteractieschermin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="rugwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopwit">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rugoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kopoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="max"/>
+ <cd:constant type="passend"/>
+ <cd:constant type="dubbelzijdig"/>
+ <cd:constant type="enkelzijdig"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="bookmark"/>
+ </cd:parameter>
+ <cd:parameter name="wachttijd">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="scherm"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelpaginaovergangenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="stelinteractiein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="menu">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="klik">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="splitsen">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="scherm">
+ <cd:constant type="nieuw"/>
+ </cd:parameter>
+ <cd:parameter name="openactie">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="sluitactie">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="openpaginaactie">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="sluitpaginaactie">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="bereken">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="contrastkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="symboolset">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="subtitel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="auteur">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="datum">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="trefwoord">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="veldlaag">
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelinteractiemenuin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="midden">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="geen"/>
+ <cd:constant type="lokaal"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="contrastkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="overlay"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="zelfdepagina">
+ <cd:constant type="ja"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="onbekendeverwijzing">
+ <cd:constant type="ja"/>
+ <cd:constant type="leeg"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ <cd:parameter name="linkeroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="rechteroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bovenoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="onderoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="positie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definieerinteractiemenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelinteractiemenuin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definieerinteractiemenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stelinteractiemenuin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="interactiemenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="blokkeerinteractiemenu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="boven"/>
+ <cd:constant type="onder"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="gebruikexterndocument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="gebruikURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="koppeldocument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="file"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="uit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="interactiebalk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="stelinteractiebalkin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="interactiebuttons"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="stelinteractiebalkin" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelinteractiebalkin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="variant">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="symbool">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hoogte"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hoogte"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="diepte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stap">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="klein"/>
+ <cd:constant type="middel"/>
+ <cd:constant type="groot"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchroniseer"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelsynchronisatiebalkin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="variant">
+ <cd:constant type="pagina"/>
+ <cd:constant type="lokaal"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="hoogte"/>
+ <cd:constant type="passend"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="synchronisatiebalk"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="variant">
+ <cd:constant type="pagina"/>
+ <cd:constant type="lokaal"/>
+ </cd:parameter>
+ <cd:inherit name="stelsynchronisatiebalkin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelsynchronisatiein"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definieerprofiel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelprofielenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="optie">
+ <cd:constant type="test"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="volgprofiel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="plaatsbookmarks"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="alles"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="bookmark"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="versie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelversiesin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="nummer">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="markeerversie"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="selecteerversie"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definieerversie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="volgversie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="volgprofielversie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="definieerprogramma"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="stelprogrammasin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="gebied">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="programma"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="kader">
+ <cd:constant type="aan"/>
+ <cd:constant type="uit"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="naar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="naarbox"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="button"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="stelbuttonsin" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="stelbuttonsin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="stelcommentaarin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titel">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spatie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ <cd:parameter name="symbool">
+ <cd:constant type="normaal"/>
+ <cd:constant type="Nieuw"/>
+ <cd:constant type="Ballon"/>
+ <cd:constant type="Toevoeging"/>
+ <cd:constant type="Help"/>
+ <cd:constant type="Paragraaf"/>
+ <cd:constant type="Sleutel"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="max"/>
+ <cd:constant type="buffer"/>
+ </cd:parameter>
+ <cd:parameter name="marge">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="commentaar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelcommentaarin" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="commentaar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="stelcommentaarin" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definieerveld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="tekst"/>
+ <cd:constant type="regel"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definieersubveld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="copieerveld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="kloonveld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="veld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="passendveld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="invulveld"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="suggestie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="links"/>
+ <cd:constant type="rechts"/>
+ <cd:constant type="midden"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="toonvelden"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="registreervelden"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="stelveldin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="label"/>
+ <cd:constant type="horizontaal"/>
+ <cd:constant type="vertikaal"/>
+ <cd:constant type="kader"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stelveldenin" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="stelveldenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="reset"/>
+ <cd:constant type="label"/>
+ <cd:constant type="horizontaal"/>
+ <cd:constant type="vertikaal"/>
+ <cd:constant type="kader"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voor">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="na">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="kleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="letter">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="uitlijnen">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="optie">
+ <cd:constant type="alleenleesbaar"/>
+ <cd:constant type="verplicht"/>
+ <cd:constant type="beschermd"/>
+ <cd:constant type="gesorteerd"/>
+ <cd:constant type="nietbeschikbaar"/>
+ <cd:constant type="verborgen"/>
+ <cd:constant type="printbaar"/>
+ </cd:parameter>
+ <cd:parameter name="klikin">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="klikuit">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="gebiedin">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="gebieduit">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="natoets">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="formatteer">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="valideer">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="bereken">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="veldoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veldkaderkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="veldachtergrondkleur">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="stelomlijndin" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stelveldenin" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="stelveldenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="stelformulierenin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="methode">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definieerveldstapel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="stelveldenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="veldstapel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="stelveldenin" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="clip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="stelclipin" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="stelclipin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="status">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="linkeroffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="rechteroffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="bovenoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="onderoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="plaatslegenda"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="stellegendain"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="afstand">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="tussen">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="breedte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoogte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="plaats">
+ <cd:constant type="rechts"/>
+ <cd:constant type="onder"/>
+ </cd:parameter>
+ <cd:parameter name="korps">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="stelstrutin"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="nee"/>
+ <cd:constant type="kap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="gebruiktypescriptfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="gebruiktypescript"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="tekst">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="nee" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="nee" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="nee" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="nee" default="yes"/>
+ <cd:constant type="ja"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="type">
+ <cd:constant type="hangend" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="spatiering"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="min">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="max">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stap">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definieerfontsynoniem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definieerfontsynoniem" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="definieerfont" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/cont-pe.xml b/tex/context/interface/cont-pe.xml
new file mode 100644
index 000000000..c4e82e1d5
--- /dev/null
+++ b/tex/context/interface/cont-pe.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="pe" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="داخلی"/>
+ <cd:constant type="خارجی"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="پمپ‌چپ"/>
+ <cd:constant type="پمپ‌راست"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="مرکز"/>
+ <cd:constant type="نرمال"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="بله"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="پمپ‌چپ"/>
+ <cd:constant type="پمپ‌راست"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="مرکز"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="هیچگاه"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="بدون"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="همواره"/>
+ <cd:constant type="اولی"/>
+ <cd:constant type="بعدی"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="نرمال"/>
+ <cd:constant type="فرد"/>
+ <cd:constant type="زوج"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="مشکی"/>
+ <cd:constant type="خوابیده"/>
+ <cd:constant type="خوابیده‌مشکی"/>
+ <cd:constant type="تایپ"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="تاریخ"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="شماره‌صفحه"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="متن" default="yes"/>
+ <cd:constant type="حاشیه"/>
+ <cd:constant type="لبه"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="بالا"/>
+ <cd:constant type="سربرگ"/>
+ <cd:constant type="متن" default="yes"/>
+ <cd:constant type="ته‌برگ"/>
+ <cd:constant type="پایین"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="بزرگ"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="نصب‌زبان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="فضاگذاری">
+ <cd:constant type="فشرده" default="yes"/>
+ <cd:constant type="گسترده"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="جمله‌چپ">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="جمله‌راست">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="زیرجمله‌چپ">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="زیرجمله‌راست">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="نقل‌چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="نقل‌راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="نقل‌قول‌چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="نقل‌قول‌راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="سخنرانی‌چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="سخنرانی‌میانی">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="سخنرانی‌راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="مرزمتن">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="تاریخ">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="compoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="leftcompoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rightcompoundhyphen">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="پیش‌فرض">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌زبان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="نصب‌زبان" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="زبان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="زبان‌اصلی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="ترجمه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="استفاده‌رمزینه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌ویژگیها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌خروجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌خروجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="تعریف‌محیط‌قلم‌بدنه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="پیش‌فرض"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="متن">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="کوچک">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بزرگ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌بین‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌محیط‌قلم‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="تعریف‌محیط‌قلم‌بدنه" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="تعریف‌محیط‌قلم‌بدنه" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="تعریف‌محیط‌قلم‌بدنه" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="نمایش‌محیط‌قلم‌بدنه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌قلم‌متن" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="تعریف‌قلم‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="پیش‌فرض"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="تعریف‌قلم‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="بارگذاری‌قلم‌متن" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="بارگذاری‌قلم‌متن" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="تعریف‌قلم‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="بارگذاری‌قلم‌متن" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="بارگذاری‌قلم‌متن" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="نمایش‌قلم‌بدنه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌قلم‌متن" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌قلم‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="سریف"/>
+ <cd:constant type="منظم"/>
+ <cd:constant type="رومن"/>
+ <cd:constant type="سانز"/>
+ <cd:constant type="حمایت"/>
+ <cd:constant type="سانزسریف"/>
+ <cd:constant type="مونو"/>
+ <cd:constant type="تایپ"/>
+ <cd:constant type="دورنگاره"/>
+ <cd:constant type="دست‌نوشته"/>
+ <cd:constant type="خوشنویسی"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="تغییربه‌قلم‌بدنه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="سریف"/>
+ <cd:constant type="منظم"/>
+ <cd:constant type="رومن"/>
+ <cd:constant type="سانز"/>
+ <cd:constant type="حمایت"/>
+ <cd:constant type="سانزسریف"/>
+ <cd:constant type="مونو"/>
+ <cd:constant type="تایپ"/>
+ <cd:constant type="دورنگاره"/>
+ <cd:constant type="دست‌نوشته"/>
+ <cd:constant type="خوشنویسی"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="بزرگ"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="تعریف‌قلم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌رنگها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="سراسری"/>
+ <cd:constant type="موضعی"/>
+ </cd:parameter>
+ <cd:parameter name="تبدیل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="همواره"/>
+ <cd:constant type="هیچگاه"/>
+ </cd:parameter>
+ <cd:parameter name="کاهش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌متن">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="شکافتن">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="همه"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="تعریف‌رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="رنگ‌خاکستری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="نمایش‌رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="تعریف‌لوح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌لوح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="تعریف‌گروه‌رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="خاکستری"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="نمایش‌لوح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="افقی"/>
+ <cd:constant type="عمودی"/>
+ <cd:constant type="نام"/>
+ <cd:constant type="مقدار"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="نمایش‌گروه‌رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="افقی"/>
+ <cd:constant type="عمودی"/>
+ <cd:constant type="نام"/>
+ <cd:constant type="مقدار"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="لوح‌مقایسه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="مقایسه‌گروه‌رنگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="نمایش‌آرایش"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="تعریف‌تایپ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌تایپ" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تایپ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="فضا">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="خوابیده"/>
+ <cd:constant type="نرمال"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="تایپ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="تک"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="افزودن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="تعریف‌تایپ‌کردن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="بارگذاری‌تایپ‌کردن" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌تایپ‌کردن" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تایپ‌کردن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="پرونده"/>
+ <cd:constant type="تایپ‌کردن"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="فضا">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="خوابیده"/>
+ <cd:constant type="نرمال"/>
+ <cd:constant type="فرمانها" version="mkiv"/>
+ <cd:constant type="رنگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="متن">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="icommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌زوج">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌فرد">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="خالی">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="نیم‌خط"/>
+ <cd:constant type="خط"/>
+ </cd:parameter>
+ <cd:parameter name="فرار">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="فضا">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="تب">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="متن‌تورفته">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="لوح">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="range">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="خطها">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="شکسته"/>
+ </cd:parameter>
+ <cd:parameter name="تهی">
+ <cd:constant type="بله"/>
+ <cd:constant type="همه"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="شماره‌گذاری">
+ <cd:constant type="خط"/>
+ <cd:constant type="پرونده"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="نه"/>
+ <cd:constant type="خودکار"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="تایپ‌کردن"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="تایپ‌پرونده"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پانوشتها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="تبدیل">
+ <cd:constant type="شماره‌ها"/>
+ <cd:constant type="حرفها"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="شماره‌لاتین"/>
+ <cd:constant type="اعداد‌بزرگ‌لاتین"/>
+ </cd:parameter>
+ <cd:parameter name="راه">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="صفحه"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="ستونها"/>
+ <cd:constant type="ستون‌اول"/>
+ <cd:constant type="آخرین‌ستون"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="خط">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌ستون">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌حاشیه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌شماره">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌متن">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="شکافتن">
+ <cd:constant type="بردبار"/>
+ <cd:constant type="اکید"/>
+ <cd:constant type="خیلی‌سختگیر"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌متن">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌متن">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="پانل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تعریف‌پانوشت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="بارگذاری‌شرح" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="پانوشت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="متن‌پانوشت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="یادداشت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="درج‌پانوشتهای‌موضعی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌پانوشتها" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="درج‌پانوشتها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌پانوشتها" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌میله‌زیر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="جایگزین">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="ضخامت‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌پایین">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌خط">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="اعدادلاتین"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Romannumerals"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="شماره‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="حرف"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Character"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="حرفها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Characters"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="ماه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="MONTH"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="روزهفته"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="WEEKDAY"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="setupcapitals"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="عنوان">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WORD"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="WORDS"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Word"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Words"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="کشیده"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌نماد"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌نمادشکل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌شکلهای‌خارجی" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="نماد"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌مجموعه‌نماد"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="استفاده‌نمادها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="نمایش‌مجموعه‌علامت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌تبدیل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="شماره‌مبدل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متن‌سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="باگذاری‌متن‌برچسب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="متن‌سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="متن‌برچسب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌خطهای‌حاشیه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="مرحله">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ضخامت‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خط‌حاشیه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خط‌حاشیه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌عرض‌خط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌قالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="ثابت"/>
+ <cd:constant type="موضعی"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض‌خودکار">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="اجبار"/>
+ </cd:parameter>
+ <cd:parameter name="آفست">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="پوشش"/>
+ <cd:constant type="پیش‌فرض"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="عمق"/>
+ <cd:constant type="آویزان"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="پابا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="نگهدار"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="تهی"/>
+ </cd:parameter>
+ <cd:parameter name="بست">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="سراسری"/>
+ <cd:constant type="موضعی"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="پایین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بالا">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="قالب">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="پوشش"/>
+ </cd:parameter>
+ <cd:parameter name="قالب‌راست">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="قالب‌پایین">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="قالب‌چپ">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="قالب‌راست">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌قالب">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عمق‌قالب">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="گوشه‌قالب">
+ <cd:constant type="گرد"/>
+ <cd:constant type="چهارگوشه"/>
+ </cd:parameter>
+ <cd:parameter name="شعاع‌قالب">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌قالب">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="پس‌زمینه">
+ <cd:constant type="پرده"/>
+ <cd:constant type="رنگ"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="پیش‌زمینه"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="پرده‌پس‌زمینه">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌پس‌زمینه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌پس‌زمینه">
+ <cd:constant type="قالب"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عمق‌پس‌زمینه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="گوشه‌پس‌زمینه">
+ <cd:constant type="گرد"/>
+ <cd:constant type="چهارگوشه"/>
+ </cd:parameter>
+ <cd:parameter name="شعاع‌پس‌زمینه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="گوشه">
+ <cd:constant type="گرد"/>
+ <cd:constant type="چهارگوشه"/>
+ </cd:parameter>
+ <cd:parameter name="شعاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="تهی">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌پیش‌زمینه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌پیش‌زمینه">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="ضخامت‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="قالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="درقالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خطهای‌نازک"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="بارگذاری‌خطها‌ی‌نازک" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌خطها‌ی‌نازک"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="فضای‌بین‌خط">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌پس‌زمینه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="ضخامت‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="پس‌زمینه">
+ <cd:constant type="رنگ"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌پس‌زمینه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خط‌مو"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خط‌نازک"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌متن‌قالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌متن‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌قالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌متن‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متن‌قالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="داخلی">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="تصحیح‌خط">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="تصحیح‌عمق">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="تورفتگی">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="متن‌قالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌متن‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="متن‌قالبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌متن‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="پس‌زمینه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="پس‌زمینه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پس‌زمینه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="آفست‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌پایین">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="درج‌درخطها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌درج‌درخطها" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="درج‌درمتن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌درج‌درخطها" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌درج‌درخطها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="عرض">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌بین‌خط">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="درج‌درخط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌پرکردن‌خطها" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پرکردن‌خطها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌خطهای‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="درون‌حاشیه"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌خط">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خط‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خط‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خط‌سیاه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌خطهای‌سیاه" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خطهای‌سیاه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="بارگذاری‌خطهای‌سیاه" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌خطهای‌سیاه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌پوشش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="استفاده‌مدول"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="بازنشانی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="امتحان‌نکن"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌سیستم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="کیفیت">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="پرونده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="پوشه">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="تصادفی">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="بازنشانی"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="پایین"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="بلند"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="پابا"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="نمایش‌قالب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="حاشیه"/>
+ <cd:constant type="لبه"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="چپ‌چین"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="تنظیم‌راست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="تنظیم‌وسط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="کلمه‌راست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="درحاشیه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="درحاشیه‌دیگر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="درچپ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="درراست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="درداخلی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="درخارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="ستون"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="نمایش‌بستها"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="نمایش‌بارگذاریها"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="نمایش‌طرح‌بندی"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="متن‌حاشیه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بلوکهای‌حاشیه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="بالا">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="پایین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="درون"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="در"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="درمورد"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="یک‌جا"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="درصفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="رج"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="مرجع‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="مرجع‌صفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="مرجع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="استفاده‌مرجعها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="تعریف‌مرجع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="تعریف‌شمایل‌مرجع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="متن">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="برچسب">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خ‌ا"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="خ‌ع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بروپایین"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="فضای‌سفید"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌فضای‌سفید"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="فضا"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="فضاهای‌ثابت"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="خطها‌خالی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌فضا"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="فشرده"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شرح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="نمونه">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="متن">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="بستن‌نماد">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="بستن‌فرمان">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="بستن‌نماد">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="عنوان‌چپ">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="عنوان‌راست">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌عنوان">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌عنوان">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="رنگ‌عنوان">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="نه" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ" default="yes"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="تنگ‌هم"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="درون‌چپ"/>
+ <cd:constant type="درون‌راست"/>
+ <cd:constant type="آویزان"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌سر">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="رنگ‌سر">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌سر">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بیاویز">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="متن‌تورفته">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="تورفتگی">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌گذاریها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌شرح" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌شماره‌بندی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌شماره‌گذاریها" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="شماره‌بندی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="شماره‌بندی"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌شرح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌شرح" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="شرح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="شرح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تورفتگیها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌سر">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="متن">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="نمونه">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌تورفتگی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌تورفتگیها" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌برچسب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="متن">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="درون‌متن"/>
+ </cd:parameter>
+ <cd:parameter name="راه">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="راه‌بلوک">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌سر">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌سر">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌ستونها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ntop">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="خط">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بردباری">
+ <cd:constant type="خیلی‌سختگیر"/>
+ <cd:constant type="اکید"/>
+ <cd:constant type="بردبار"/>
+ <cd:constant type="خیلی‌بردبار"/>
+ <cd:constant type="بکش"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="تعادل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:constant type="متن"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="خالی">
+ <cd:constant type="ثابت"/>
+ <cd:constant type="نیم‌خط"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="انعطافپذیر"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="کوچک"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="پس‌زمینه"/>
+ </cd:parameter>
+ <cd:parameter name="جهت">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌ستونها" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="سربرگ"/>
+ <cd:constant type="ته‌برگ"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌سربرگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="حاشیه"/>
+ <cd:constant type="لبه"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="شروع"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="بدون‌نشانه‌گذاری"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="بست">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌چپ">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌راست">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="عرض‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌ته‌برگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بالا"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پایین"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌سربرگ" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌خط‌سروته‌برگ"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌خط‌بالاوپایین"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متن‌سربرگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متن‌پانوشت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متن‌متنها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متنهای‌بالا"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌متن‌پایین"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="تعیین‌محتوای‌متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌نشانه‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="نشانه‌گذاری‌زوج"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="جداسازی‌نشانه‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="بازنشانی‌نشانه‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌نشانه‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="گسترش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="نشانه‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="دریافت‌نشانه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="اولی"/>
+ <cd:constant type="آخرین"/>
+ <cd:constant type="قبلی"/>
+ <cd:constant type="هردو"/>
+ <cd:constant type="همه"/>
+ <cd:constant type="جاری"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌نشانه‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌طرح‌بندی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="میان"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="میان"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌پس">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="سربرگ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ته‌برگ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="پایین">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="لبه‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="لبه‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌سربرگ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌ته‌برگ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌پایین">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌حاشیه‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌حاشیه‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌لبه‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌لبه‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌افق">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌عم">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="نشانه‌گذاری">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ <cd:constant type="رنگ"/>
+ <cd:constant type="پرده"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="صفحه"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="یک‌رو"/>
+ <cd:constant type="دورو"/>
+ </cd:parameter>
+ <cd:parameter name="مقیاس">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="خطها">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ستونها">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌ستون">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="توری">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌پایین">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌برش">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌متن">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض‌متن">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌متن">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌کلیپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="برگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="تنظیم‌طرح‌بندی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="خطها">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="نمایش‌توری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="همه"/>
+ <cd:constant type="خطها"/>
+ <cd:constant type="قالب"/>
+ <cd:constant type="بدون‌شماره"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="خارجی"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="درج‌در‌توری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="انتقال‌به‌توری" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="انتقال‌به‌توری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="استاندارد" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="بالا"/>
+ <cd:constant type="هردو"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="صفحه"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="عمق"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="پروژه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="محیط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="تولید"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="مولفه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌فایلهای‌بیشتر"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌فاصله‌بین‌خط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="کوچک" default="yes"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="خودکار"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="بارگذاری‌فاصله‌بین‌خط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بالا">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="پایین">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌گذاری‌صفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="جایگزین">
+ <cd:constant type="یک‌رو"/>
+ <cd:constant type="دورو"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="سربرگ"/>
+ <cd:constant type="ته‌برگ"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="حاشیه"/>
+ <cd:constant type="لبه‌حاشیه"/>
+ <cd:constant type="درون‌چپ"/>
+ <cd:constant type="درون‌راست"/>
+ </cd:parameter>
+ <cd:parameter name="تبدیل">
+ <cd:constant type="شماره‌ها"/>
+ <cd:constant type="حرفها"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="شماره‌لاتین"/>
+ <cd:constant type="اعداد‌بزرگ‌لاتین"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="راه">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="متن">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده‌شماره">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده‌متن">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="بست">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="آخرین"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌باریکتر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="میان">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="تعریف"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌فرمانها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌شروع‌پایان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="فرمانها">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌سرها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="شماره‌بخش">
+ <cd:constant type="بله"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="حاشیه"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="پاراگراف"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ایست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="عنوان‌تنظیم">
+ <cd:constant type="بله"/>
+ <cd:constant type="شناور"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="بردباری">
+ <cd:constant type="خیلی‌سختگیر"/>
+ <cd:constant type="اکید"/>
+ <cd:constant type="بردبار"/>
+ <cd:constant type="خیلی‌بردبار"/>
+ <cd:constant type="بکش"/>
+ </cd:parameter>
+ <cd:parameter name="متن‌تورفته">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شرحها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="آویزان‌چپ"/>
+ <cd:constant type="آویزان‌کردن‌راست"/>
+ <cd:constant type="حاشیه‌چپ"/>
+ <cd:constant type="حاشیه‌راست"/>
+ <cd:constant type="حاشیه‌داخلی"/>
+ <cd:constant type="حاشیه‌خارجی"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="بیشترین"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="کمترین‌عرض">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌سر">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="شماره">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="تبدیل">
+ <cd:constant type="شماره‌ها"/>
+ <cd:constant type="حرفها"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="شماره‌لاتین"/>
+ <cd:constant type="اعداد‌بزرگ‌لاتین"/>
+ </cd:parameter>
+ <cd:parameter name="راه">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ایست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شرح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌شرحها" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شناورها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="میان"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فضا‌قبل‌از">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="فضا‌بعداز">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌کناری‌قبل">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌کناری‌بعد">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="متن‌تورفته">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="ntop">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nbottom">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nlines">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="پیش‌فرض">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="بردباری">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌حاشیه‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌حاشیه‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم‌کنار">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="خط"/>
+ </cd:parameter>
+ <cd:parameter name="شماره‌گذاری">
+ <cd:constant type="بله"/>
+ <cd:constant type="بدون‌بررسی"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شکافتن‌شناورها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="تبدیل">
+ <cd:constant type="شماره‌ها"/>
+ <cd:constant type="حرفها"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="شماره‌لاتین"/>
+ <cd:constant type="اعداد‌بزرگ‌لاتین"/>
+ </cd:parameter>
+ <cd:parameter name="خطها">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="شکافتن‌شناور"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌شکافتن‌شناورها" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌درج‌مخالف"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌نشانه‌شکستن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="علامت">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌مکان‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پوشش"/>
+ </cd:parameter>
+ <cd:parameter name="واحد">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="مقیاس">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="آفست">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="گام‌ایکس">
+ <cd:constant type="قطعی"/>
+ <cd:constant type="نسبی"/>
+ </cd:parameter>
+ <cd:parameter name="گام‌وای">
+ <cd:constant type="قطعی"/>
+ <cd:constant type="نسبی"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="توری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="گام‌ایکس">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="گام‌وای">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="آفست">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="مقیاس">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="واحد">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="صفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="بله" default="yes"/>
+ <cd:constant type="آرایش"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="ترجیح"/>
+ <cd:constant type="اولویت‌بزرگ"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="ناتوان"/>
+ <cd:constant type="آخرین"/>
+ <cd:constant type="quadruple"/>
+ <cd:constant type="زوج"/>
+ <cd:constant type="فرد"/>
+ <cd:constant type="خالی"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌ارجاع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="پیشوند">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="پانل">
+ <cd:constant type="برچسب"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="همه"/>
+ <cd:constant type="نماد"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="پرونده‌تبدیل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="بزرگ"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="پرونده‌خودکار">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="صفحه"/>
+ </cd:parameter>
+ <cd:parameter name="سراسری">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="export">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="setupurl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="urlalternative">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="هردو"/>
+ <cd:constant type="قبل‌از"/>
+ <cd:constant type="بعداز"/>
+ </cd:parameter>
+ <cd:parameter name="urlspace">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="بنویس‌درلیست‌مرجع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="درج‌لیست‌مرجع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌لیست‌مرجع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست‌مرجع" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌لیست‌مرجع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="موضعی"/>
+ <cd:constant type="قبلی"/>
+ <cd:constant type="همه"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="بنویس‌در‌لیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="بنویس‌بین‌لیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌لیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="نمادلیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="درج‌لیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="تعیین‌مشخصات‌لیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="درج‌لیست‌مختلط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست‌ترکیبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌لیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌لیست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="فرمان"/>
+ </cd:parameter>
+ <cd:parameter name="تزویج">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="موضعی"/>
+ <cd:constant type="قبلی"/>
+ <cd:constant type="جاری"/>
+ <cd:constant type="اینجا"/>
+ <cd:constant type="پیشگفتار"/>
+ <cd:constant type="همه"/>
+ </cd:parameter>
+ <cd:parameter name="مرزهای‌صفحه">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌شماره">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌متن">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌صفحه">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌شماره">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌متن">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌صفحه">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="پانل">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="شماره‌صفحه"/>
+ <cd:constant type="همه"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="برچسب">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="پیشوند">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="شماره‌صفحه">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="شماره‌سر">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="عنوان‌تنظیم">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ایست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="نماد">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="گسترش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="فرمان"/>
+ </cd:parameter>
+ <cd:parameter name="بیشترین‌عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="کشیدن">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌لیست‌ترکیبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست‌ترکیبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌لیست‌ترکیبی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="مرحله">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="جاری"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌لیست" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="مکان"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست‌ترکیبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="کامل"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌لیست‌ترکیبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="راه">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌فرمولها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="میان"/>
+ </cd:parameter>
+ <cd:parameter name="بست">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:constant type="پمپ‌چپ"/>
+ <cd:constant type="پمپ‌راست"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="مرکز"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="متن‌تورفته">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="فضا‌قبل‌از">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="تبدیل">
+ <cd:constant type="شماره‌ها"/>
+ <cd:constant type="حرفها"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="شماره‌لاتین"/>
+ <cd:constant type="اعداد‌بزرگ‌لاتین"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="نشر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌نشرها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="جایگزین">
+ <cd:constant type="apa"/>
+ <cd:constant type="نرمال"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌شماره‌گذاریها" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌خطها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="تورفتگی">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="فضا">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="فشرده"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌گذاری‌پاراگراف"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="خط"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌‌گذاری‌خط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="تبدیل">
+ <cd:constant type="شماره‌ها"/>
+ <cd:constant type="حرفها"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="شماره‌لاتین"/>
+ <cd:constant type="اعداد‌بزرگ‌لاتین"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="شروع">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="گام">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="میان"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="حاشیه"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="درون‌چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="درون‌راست"/>
+ <cd:constant type="داخلی"/>
+ <cd:constant type="خارجی"/>
+ <cd:constant type="متن"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="end"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="پیشوند">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="مراجعه">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="ادامه"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="یک‌خط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="درخط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌درون‌حاشیه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="هردو"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="خط">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="جداکننده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="توده">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌صفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="شماره">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="نگهدار"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌زیرصفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="راه">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌خالی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="نرمال" default="yes"/>
+ <cd:constant type="پیش‌فرض"/>
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="نیم‌خط"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="ثابت"/>
+ <cd:constant type="انعطافپذیر"/>
+ <cd:constant type="سراسری"/>
+ <cd:constant type="ناشناس"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌خالی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="بارگذاری‌خالی" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌اندازه‌برگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="مقیاس">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌برگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="برگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌پس">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="بیشترین"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="روش">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌اندازه‌برگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="صفحه‌گسترده"/>
+ <cd:constant type="منعکس"/>
+ <cd:constant type="دوران‌یافته"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="منفی"/>
+ <cd:inherit name="بارگذاری‌اندازه‌برگ" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌ترتیب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="ناتوان"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="منعکس"/>
+ <cd:constant type="دوران‌یافته"/>
+ <cd:constant type="دورو"/>
+ <cd:constant type="منفی"/>
+ <cd:constant type="پس‌زمینه"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="نمایش‌چاپ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="بارگذاری‌اندازه‌برگ" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="بارگذاری‌اندازه‌برگ" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="بارگذاری‌طرح‌بندی" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌آرم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="بالا"/>
+ <cd:constant type="سربرگ"/>
+ <cd:constant type="ته‌برگ"/>
+ <cd:constant type="پایین"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="صفحه"/>
+ <cd:constant type="لبه‌چپ"/>
+ <cd:constant type="حاشیه‌چپ"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="حاشیه‌راست"/>
+ <cd:constant type="لبه‌راست"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="درج‌آرمها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌فضای‌سفید"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="هیچکدام" default="yes"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="ثابت"/>
+ <cd:constant type="ثابت‌کن"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تورفتگی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌بلوک‌بخش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="بارگذاری‌بلوک‌بخش" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌بلوک‌بخش" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بلوک‌بخش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="شماره">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="بله"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌بخش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بخش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="تبدیل">
+ <cd:constant type="شماره‌ها"/>
+ <cd:constant type="حرفها"/>
+ <cd:constant type="Characters"/>
+ <cd:constant type="شماره‌لاتین"/>
+ <cd:constant type="اعداد‌بزرگ‌لاتین"/>
+ </cd:parameter>
+ <cd:parameter name="شماره‌قبلی">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌متن">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌شماره">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌متن">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌شماره">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="شماره">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="شماره‌خود">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بله"/>
+ </cd:parameter>
+ <cd:parameter name="ادامه">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="سربرگ">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="بدون‌نشانه‌گذاری"/>
+ </cd:parameter>
+ <cd:parameter name="متن">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="بدون‌نشانه‌گذاری"/>
+ </cd:parameter>
+ <cd:parameter name="ته‌برگ">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="بدون‌نشانه‌گذاری"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="بیاویز">
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌شماره">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌متن">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌شماره‌عمیق">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌متن‌عمیق">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="پیشوند">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="بگذارسر">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="تهی"/>
+ </cd:parameter>
+ <cd:parameter name="شماره‌افزایش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="بازنشانی‌شماره">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="پرونده">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="گسترش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="فرمان"/>
+ </cd:parameter>
+ <cd:parameter name="متن‌حاشیه">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌سرها" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شماره‌سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="شماره‌سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="تعیین‌شماره‌سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="شماره‌سرجاری"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="بعدی"/>
+ <cd:variable value="بخش"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="بارگذاری‌گروه‌آیتم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="هر"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="استاندارد" default="yes"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="تنگ‌هم"/>
+ <cd:constant type="فشرده"/>
+ <cd:constant type="غیرفشرده"/>
+ <cd:constant type="سفید‌نه"/>
+ <cd:constant type="قبل‌از"/>
+ <cd:constant type="بعداز"/>
+ <cd:constant type="ایست"/>
+ <cd:constant type="متصل‌بالا"/>
+ <cd:constant type="درحاشیه"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="پیشگفتارخودکار"/>
+ <cd:constant type="شل"/>
+ <cd:constant type="تکرار"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="پاراگراف"/>
+ <cd:constant type="درون‌متن"/>
+ <cd:constant type="تصادفی"/>
+ <cd:constant type="برعکس"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="حاشیه">
+ <cd:constant type="نه"/>
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌چپ">
+ <cd:constant type="نه"/>
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه‌راست">
+ <cd:constant type="نه"/>
+ <cd:constant type="استاندارد"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="گام">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="آیتمها">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="شروع">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌ازسر">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعدازسر">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌سر">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌حاش">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌نماد">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="ایست">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="نماد">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم‌نماد">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="متن‌تورفته">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌متن">
+ <!-- maybe resolve here too -->
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="کوچک"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ادامه"/>
+ <cd:constant type="استاندارد" default="yes"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="تنگ‌هم"/>
+ <cd:constant type="فشرده"/>
+ <cd:constant type="ایست"/>
+ <cd:constant type="متصل‌بالا"/>
+ <cd:constant type="درحاشیه"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="پیشگفتار"/>
+ <cd:constant type="ستونها"/>
+ <cd:constant type="متن"/>
+ <cd:constant type="پاراگراف"/>
+ <cd:constant type="تکرار"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌گروه‌آیتم" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="آیتم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="اما"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="its"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="سر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="حاش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="نم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="منفی"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="تعادل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌صفحه">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌متن">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="اندیکاتور">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="تزویج">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="موضعی"/>
+ <cd:constant type="همه"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="نماد">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="پانل">
+ <cd:constant type="شماره‌صفحه"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="گسترش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="فرمان"/>
+ </cd:parameter>
+ <cd:parameter name="مراجعه">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:parameter name="بیشترین‌عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="مرجع‌ناشناس">
+ <cd:constant type="تهی"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="پیشوند">
+ <cd:constant type="هردو"/>
+ <cd:constant type="اولی"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="فشردن">
+ <cd:constant type="نه"/>
+ <cd:constant type="بله"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان‌متن‌عمیق">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="شروع"/>
+ <cd:variable value="ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="بنویس‌درثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="مزدوج"/>
+ <cd:variable value="ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="ثبت‌زوج"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="درج‌ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌ثبت" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="ببینید"/>
+ <cd:variable value="ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="کامل"/>
+ <cd:variable value="ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌ثبت" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="مکان"/>
+ <cd:variable value="ثبت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌ثبت" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌مترادفها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌مترادفها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="سبک‌متن">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌مترادف">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="تنگ‌هم"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="درون‌چپ"/>
+ <cd:constant type="درون‌راست"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="همه"/>
+ <cd:constant type="استفاده‌شده"/>
+ </cd:parameter>
+ <cd:parameter name="تبدیل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="گسترش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="فرمان"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="بارگذاشتن"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌ترتیب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌ترتیب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="criterium">
+ <cd:constant type="همه"/>
+ <cd:constant type="استفاده‌شده"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="گسترش">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="فرمان"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="بارگذاشتن"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌آرایش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="بارگذاری‌آرایش" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="آرایش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌آرایش" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌آرایش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌ع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌ا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="چپ"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:parameter name="فرمانها">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دورو">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="تهی"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت‌سربرگ">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="شروع"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="بدون‌نشانه‌گذاری"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت‌ته‌برگ">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="شروع"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="بدون‌نشانه‌گذاری"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت‌متن">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="شروع"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="بدون‌نشانه‌گذاری"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت‌بالا">
+ <cd:constant type="پایان"/>
+ <cd:constant type="شروع"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت‌پایین">
+ <cd:constant type="پایان"/>
+ <cd:constant type="شروع"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت‌صفحه">
+ <cd:constant type="پایان"/>
+ <cd:constant type="شروع"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="نام"/>
+ <cd:string value="آرایش"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="نسخه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="نهایی" default="yes"/>
+ <cd:constant type="مفهوم"/>
+ <cd:constant type="موقتی"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="تاریخ‌جاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="تاریخ" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="تاریخ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="روز"/>
+ <cd:constant type="ماه"/>
+ <cd:constant type="سال"/>
+ <cd:constant type="روزهفته"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="فضا"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="مراجعه"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="تاریخ‌رجوع"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="تورفتگی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌تورفتگی"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="خالی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ" default="yes"/>
+ <cd:constant type="سفید‌نه"/>
+ <cd:constant type="پشت"/>
+ <cd:constant type="سفید"/>
+ <cd:constant type="ناتوان"/>
+ <cd:constant type="اجبار"/>
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="نیم‌خط"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="ثابت"/>
+ <cd:constant type="انعطافپذیر"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="همواره"/>
+ <cd:constant type="خارجی"/>
+ <cd:constant type="متصل‌بالا"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="فشرده"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="خالی"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="فضای‌سفیدصحیح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="موضعی"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان" default="yes"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تنظیم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="عرض"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="داخلی"/>
+ <cd:constant type="خارجی"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="ارتفاع"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="آویزان"/>
+ <cd:constant type="بدون‌آویزان‌کردن"/>
+ <cd:constant type="شکسته"/>
+ <cd:constant type="بدون‌شکست"/>
+ <cd:constant type="شکست‌کلمات‌کمتر"/>
+ <cd:constant type="شکست‌کلمات‌بیشتر"/>
+ <cd:constant type="جدید"/>
+ <cd:constant type="قدیمی"/>
+ <cd:constant type="نرمال"/>
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="پمپ‌چپ"/>
+ <cd:constant type="پمپ‌راست"/>
+ <cd:constant type="پمپ‌خارجی"/>
+ <cd:constant type="پمپ‌داخلی"/>
+ <cd:constant type="مرکز"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="nohz"/>
+ <cd:constant type="فضاگذاری"/>
+ <cd:constant type="بدون‌فضاگذاری"/>
+ <cd:constant type="بردبار"/>
+ <cd:constant type="خیلی‌بردبار"/>
+ <cd:constant type="بکش"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌تنظیم" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌فضا‌گذاری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="گسترده"/>
+ <cd:constant type="فشرده"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بردباری"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="افقی"/>
+ <cd:constant type="عمودی"/>
+ <cd:constant type="بکش"/>
+ <cd:constant type="فضا"/>
+ <cd:constant type="خیلی‌سختگیر" default="yes"/>
+ <cd:constant type="اکید"/>
+ <cd:constant type="بردبار"/>
+ <cd:constant type="خیلی‌بردبار"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="نوع‌صفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="صفحه‌پردازش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="بله" default="yes"/>
+ <cd:constant type="نه"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="صفحه‌زوج"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="گزینه">
+ <cd:constant type="دورو"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="مکان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پرده‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="روش">
+ <cd:constant type="نقطه"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="خارجی"/>
+ </cd:parameter>
+ <cd:parameter name="کیفیت">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="پرده">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پس‌زمینه‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="بالا"/>
+ <cd:constant type="سربرگ"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="ته‌برگ"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="صفحه"/>
+ <cd:constant type="برگ"/>
+ <cd:constant type="صفحه‌چپ"/>
+ <cd:constant type="صفحه‌راست"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="لبه‌چپ"/>
+ <cd:constant type="حاشیه‌چپ"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="حاشیه‌راست"/>
+ <cd:constant type="لبه‌راست"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="بافر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="دریافت‌بافر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="تایپ‌بافر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌بافر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بافر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="پاراگراف">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌بلوک"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="بدون‌بلوکهای‌بیشتر"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="بلوکها‌پنهان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="حفظ‌بلوکها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="همه"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌بلوکها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="بلوکهای‌پردازش"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="عبوربلوکها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="اجباربلوکها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="انتخاب‌بلوکها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="criterium">
+ <cd:constant type="همه"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بلوک"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="داخلی">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="پرونده">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="فرمول"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="ریاضی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="درج‌فرمول"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="درج‌زیرفرمول"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="مکان"/>
+ <cd:variable value="شناور"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="اینجا" default="yes"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="درون‌چپ"/>
+ <cd:constant type="درون‌راست"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="حاشیه"/>
+ <cd:constant type="حاشیه‌چپ"/>
+ <cd:constant type="حاشیه‌راست"/>
+ <cd:constant type="لبه‌چپ"/>
+ <cd:constant type="لبه‌راست"/>
+ <cd:constant type="حاشیه‌داخلی"/>
+ <cd:constant type="حاشیه‌خارجی"/>
+ <cd:constant type="لبه‌داخلی"/>
+ <cd:constant type="لبه‌خارجی"/>
+ <cd:constant type="داخلی"/>
+ <cd:constant type="خارجی"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="صفحه"/>
+ <cd:constant type="صفحه‌چپ"/>
+ <cd:constant type="صفحه‌راست"/>
+ <cd:constant type="مخالف"/>
+ <cd:constant type="همواره"/>
+ <cd:constant type="خودکار"/>
+ <cd:constant type="اجبار"/>
+ <cd:constant type="دراز"/>
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="خط"/>
+ <cd:constant type="ارتفاع"/>
+ <cd:constant type="عمق"/>
+ <cd:constant type="شکافتن"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="رزرو"/>
+ <cd:variable value="شناور"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قالب">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌شناور"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شناور"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بیشترین‌ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بیشترین‌عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="کمترین‌عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="پیش‌فرض">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="مرزهای‌صفحه">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌حاشیه‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله‌حاشیه‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="شناور"/>
+ <cd:string value="متن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="آفست"/>
+ <cd:constant type="دراز"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="رجوع"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="رج">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="انتخاب‌برگ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="خانواده">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="کاغذزوج"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="کسر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="نقطه‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="آیتمها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌آیتمها" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌آیتمها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="درون‌حاشیه"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ </cd:parameter>
+ <cd:parameter name="نماد">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="ناشناس"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="نقل‌قول"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="میان" default="yes"/>
+ <cd:constant type="راست"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="نقل‌قول"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="نقل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌نقل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="حاشیه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌پاراگرافها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="خط">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="داخلی">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بردباری">
+ <cd:constant type="خیلی‌سختگیر"/>
+ <cd:constant type="اکید"/>
+ <cd:constant type="بردبار"/>
+ <cd:constant type="خیلی‌بردبار"/>
+ <cd:constant type="بکش"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="پاراگراف"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="پاراگراف"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پاراگرافها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="هر"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="بردباری">
+ <cd:constant type="خیلی‌سختگیر"/>
+ <cd:constant type="اکید"/>
+ <cd:constant type="بردبار"/>
+ <cd:constant type="خیلی‌بردبار"/>
+ <cd:constant type="بکش"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="داخلی">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="خط">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="نمونه">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="سبک‌سر">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="تب"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="برچسبها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌جدول‌بندی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="جدول‌بندی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌شکلهای‌خارجی" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌جدول‌بندی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="واحد">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="تورفتگی">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="داخلی">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌خط">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="ضخامت‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="خالی"/>
+ <cd:constant type="توری"/>
+ <cd:constant type="عمق"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="خط">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="خط"/>
+ </cd:parameter>
+ <cd:parameter name="شکافتن">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌جدولها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="فاصله">
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ </cd:parameter>
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="بست"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="بست"/>
+ </cd:parameter>
+ <cd:parameter name="ضخامت‌خط">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌خط">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="فرمانها">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="پس‌زمینه">
+ <cd:constant type="پرده"/>
+ <cd:constant type="رنگ"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="پرده‌پس‌زمینه">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌پس‌زمینه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌الگوی‌جدول"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌پرونده‌های‌خارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="پرونده">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌پرونده‌خارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌شکل‌خارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌شکلهای‌خارجی" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="شکل‌خارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌شکلهای‌خارجی" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌شکلهای‌خارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="مقیاس">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="مقیاس‌وای">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="مقیاس‌وای">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="بیشترین"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ </cd:parameter>
+ <cd:parameter name="wfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="بیشترین"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="عامل‌ارتفاع">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="بیشترین"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قالب">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="preset">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="نمایش">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="پیش‌دید">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="تکرار">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="شیئ">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="تایپ">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="روش">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="قالب"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="تست"/>
+ </cd:parameter>
+ <cd:parameter name="قالبها">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="پوشه">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="موضعی"/>
+ <cd:constant type="سراسری"/>
+ <cd:constant type="پیش‌فرض"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="بیشترین‌عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="بیشترین‌ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="تبدیل">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="پیشوند">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="نمایش‌شکلهای‌خارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="جایگزین">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌قطعه‌موزیک‌خارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="دو"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="حقیقت"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="دوران"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌دوران" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌دوران"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="دوران">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="بلند"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="گسترده"/>
+ <cd:constant type="عمق"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="آینه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="مقیاس"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌ترکیب‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="بالا"/>
+ <cd:constant type="میان"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="درج‌کنار‌به‌کنار"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="درج‌در‌بالای‌یکدیگر"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پرده‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="بیشترین"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌پس">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فضای‌بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌افق">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌عم">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="بیشترین"/>
+ <cd:constant type="پرکردن"/>
+ <cd:constant type="دورو"/>
+ <cd:constant type="یک‌رو"/>
+ <cd:constant type="خودکار"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="چوبخط"/>
+ </cd:parameter>
+ <cd:parameter name="تاخیر">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="پرده"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌گذارصفحه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="منو">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ <cd:parameter name="صفحه">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="فشردن">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="شکافتن">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="نمایش">
+ <cd:constant type="جدید"/>
+ </cd:parameter>
+ <cd:parameter name="عمل‌باز">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="بستن‌کنش">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="عمل‌صفحه‌باز">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="بستن‌عمل‌صفحه">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="محاسبه">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="بست">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="contrastcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="مجموعه‌نماد">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="عنوان">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="زیرعنوان">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="نویسنده">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="تاریخ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="کلید‌واژه">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="لایه‌میدان">
+ <cd:constant type="خودکار"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌منوی‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="میان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ <cd:constant type="هیچکدام"/>
+ <cd:constant type="موضعی"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="contrastcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="پوشش"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="همان‌صفحه">
+ <cd:constant type="بله"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="مرجع‌ناشناس">
+ <cd:constant type="بله"/>
+ <cd:constant type="تهی"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌چپ">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌راست">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌بالا">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌پایین">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="موقعیت">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌منوی‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌منوی‌پانل" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌منوی‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌منوی‌پانل" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="منوی‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="ازکارانداختن‌منوی‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="بالا"/>
+ <cd:constant type="پایین"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌نوشتارخارجی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="پرونده"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="useURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="پرونده"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="نوشتارزوج"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="پرونده"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="از"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="میله‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="بارگذاری‌میله‌پانل" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="دکمه‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌میله‌پانل" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌میله‌پانل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="جایگزین">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="نماد">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ارتفاع"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ارتفاع"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="عمق">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="گام">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="کوچک"/>
+ <cd:constant type="متوسط"/>
+ <cd:constant type="بزرگ"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="تطابق"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌میله‌تطابق"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="جایگزین">
+ <cd:constant type="صفحه"/>
+ <cd:constant type="موضعی"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ارتفاع"/>
+ <cd:constant type="پرکردن"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="میله‌تطابق"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="جایگزین">
+ <cd:constant type="صفحه"/>
+ <cd:constant type="موضعی"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌میله‌تطابق" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌تطابق"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌پروفایل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌پروفایلها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="گزینه">
+ <cd:constant type="تست"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="پیروی‌پروفایل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="درج‌چوب‌خط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="همه"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="چوبخط"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="نسخه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌نسخه‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="شماره">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="نسخه‌نشانه"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="انتخاب‌نسخه"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌نسخه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="پیروی‌نسخه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="پیروی‌نسخه‌پروفایل"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌برنامه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌برنامه‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="پوشه">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="برنامه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="عامل">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="قالب">
+ <cd:constant type="روی"/>
+ <cd:constant type="خاموش"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="بروبه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="بروبه‌جعبه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="دکمه"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌دکمه‌ها" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌دکمه‌ها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌توضیح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="عنوان">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="فضا">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ <cd:parameter name="نماد">
+ <cd:constant type="نرمال"/>
+ <cd:constant type="جدید"/>
+ <cd:constant type="بادکنک"/>
+ <cd:constant type="جمع"/>
+ <cd:constant type="کمک"/>
+ <cd:constant type="پاراگراف"/>
+ <cd:constant type="کلید"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="بیشترین"/>
+ <cd:constant type="بافر"/>
+ </cd:parameter>
+ <cd:parameter name="حاشیه">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="توضیح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌توضیح" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="توضیح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌توضیح" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌میدان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="متن"/>
+ <cd:constant type="خط"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌زیرمیدان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="میدان‌کپی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="میدان‌شبیه‌سازی"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="میدان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="پرکردن‌میدان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="درج‌درمیدان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="tooltip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="چپ"/>
+ <cd:constant type="راست"/>
+ <cd:constant type="میان"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="نمایش‌میدانها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="میدانهای‌گزارش"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌میدان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="برچسب"/>
+ <cd:constant type="افقی"/>
+ <cd:constant type="عمودی"/>
+ <cd:constant type="قالب"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="بارگذاری‌میدانها" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌میدانها"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="بازنشانی"/>
+ <cd:constant type="برچسب"/>
+ <cd:constant type="افقی"/>
+ <cd:constant type="عمودی"/>
+ <cd:constant type="قالب"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="قبل‌از">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="بعداز">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="سبک">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="تنظیم">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="گزینه">
+ <cd:constant type="تنهاخواندنی"/>
+ <cd:constant type="موردنیاز"/>
+ <cd:constant type="حفاظت‌شده"/>
+ <cd:constant type="مرتب"/>
+ <cd:constant type="غیرموجود"/>
+ <cd:constant type="پنهانی"/>
+ <cd:constant type="قابل‌چاپ"/>
+ </cd:parameter>
+ <cd:parameter name="فشردن‌داخل">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="فشردن‌خارج">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="ناحیه‌درون">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="ناحیه‌بیرون">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="بعدازکلید">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="شمایل">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="تاییداعتبار">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="محاسبه">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌میدان">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌قالب‌میدان">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="رنگ‌پس‌زمینه‌میدان">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="بارگذاری‌قالبی" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="بارگذاری‌میدانها" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="بارگذاری‌میدانها" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌طرح"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="روش">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌توده‌میدان"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="بارگذاری‌میدانها" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="میدان‌پشته"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌میدانها" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="گیره"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="بارگذاری‌چیدن" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌چیدن"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="وضعیت">
+ <cd:constant type="شروع"/>
+ <cd:constant type="پایان"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌ا">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌ع">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="آفست">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌چپ">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌راست">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌بالا">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="آفست‌پایین">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="درج‌راهنما"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌راهنما"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="فاصله">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="دربین">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="عرض">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="ارتفاع">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="مکان">
+ <cd:constant type="راست"/>
+ <cd:constant type="پایین"/>
+ </cd:parameter>
+ <cd:parameter name="قلم‌بدنه">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="بارگذاری‌بست"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="بله" default="yes"/>
+ <cd:constant type="نه"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌پرونده‌دستخط‌تایپ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="استفاده‌دستخط‌تایپ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="متن">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="نه" default="yes"/>
+ <cd:constant type="بله"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="نه" default="yes"/>
+ <cd:constant type="بله"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="نه" default="yes"/>
+ <cd:constant type="بله"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="نه" default="yes"/>
+ <cd:constant type="بله"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="تایپ">
+ <cd:constant type="آویزان" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="فضاگذاری"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="عامل">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="کمترین">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="بیشترین">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="گام">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌مترادف‌قلم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="تعریف‌مترادف‌قلم" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="تعریف‌قلم" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/cont-ro.xml b/tex/context/interface/cont-ro.xml
new file mode 100644
index 000000000..dcaa288da
--- /dev/null
+++ b/tex/context/interface/cont-ro.xml
@@ -0,0 +1,10290 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+
+ comment : user interface definitions of ConTeXt
+
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+
+ versions : 2004.11.17 : initial version
+ 2006.08.02 : define + resolve
+
+-->
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="ro" version="2006.08.02">
+
+ <cd:define name="align">
+ <cd:constant type="intern"/>
+ <cd:constant type="extern"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="center"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="da"/>
+ </cd:define>
+
+ <cd:define name="symalign">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="center"/>
+ </cd:define>
+
+ <cd:define name="indenting">
+ <cd:constant type="niciodata"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="da"/>
+ <cd:constant type="totdeauna"/>
+ <cd:constant type="primul"/>
+ <cd:constant type="urmatorul"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="impar"/>
+ <cd:constant type="par"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:define>
+
+ <cd:define name="indentnext">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:define>
+
+ <cd:define name="style">
+ <cd:constant type="normal"/>
+ <cd:constant type="aldin"/>
+ <cd:constant type="inclinat"/>
+ <cd:constant type="aldininclinat"/>
+ <cd:constant type="type"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="small..."/>
+ <cd:constant type="cd:command"/>
+ </cd:define>
+
+ <cd:define name="language">
+ <cd:constant type="nl"/>
+ <cd:constant type="fr"/>
+ <cd:constant type="en"/>
+ <cd:constant type="uk"/>
+ <cd:constant type="de"/>
+ <cd:constant type="es"/>
+ <cd:constant type="cz"/>
+ <cd:constant type=".."/>
+ </cd:define>
+
+ <cd:define name="texts">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="data"/>
+ <cd:constant type="cd:mark"/>
+ <cd:constant type="numarpagina"/>
+ </cd:define>
+
+ <cd:define name="layout-h">
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="bordura"/>
+ </cd:define>
+
+ <cd:define name="layout-v">
+ <cd:constant type="sus"/>
+ <cd:constant type="antet"/>
+ <cd:constant type="text" default="yes"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="subsol"/>
+ </cd:define>
+
+ <cd:define name="bodyfont">
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mare"/>
+ </cd:define>
+
+ <cd:command name="installlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="instalarelimba"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spatiere">
+ <cd:constant type="impachetat" default="yes"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="lefthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="righthyphenmin">
+ <cd:constant type="cd:number" default="2"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="propozitiestanga">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="propozitiedreapta">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="subpropozitiestanga">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="subpropozitiedreapta">
+ <cd:constant type="cd:command" default="---"/>
+ </cd:parameter>
+ <cd:parameter name="minicitatstanga">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="minicitatdreapta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citatstanga">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="citatdreapta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="leftspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="middlespeech">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="rightspeech">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="limittext">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="data">
+ <cd:constant type="cd:text"/> <!-- TODO -->
+ </cd:parameter>
+ <cd:parameter name="compoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="leftcompoundhyphen">
+ <cd:constant type="cd:command" default="\compoundhyphen"/>
+ </cd:parameter>
+ <cd:parameter name="rightcompoundhyphen">
+ <cd:constant type="cd:command" default=""/>
+ </cd:parameter>
+ <cd:parameter name="implicit">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="setarelimba"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="instalarelimba" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="language" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="limba"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mainlanguage" file="lang-ini.tex" category="language">
+ <cd:sequence>
+ <cd:string value="limbaprincipala"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="translate" file="lang-lab.tex" category="language">
+ <cd:sequence>
+ <cd:string value="traduce"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useencoding" file="enco-ini.tex" category="encoding"> <!-- engine="pdftex" -->
+ <cd:sequence>
+ <cd:string value="folosestecodificarea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usespecials" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="folosestespeciale"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="definesteoutput"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoutput" file="spec-ini.tex">
+ <cd:sequence>
+ <cd:string value="setareoutput"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definestemediulfonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- it's possible to use 1+2+3, 2+3, what about 1+2? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no"> <!-- have to force no, otherwise \showsetup is wrong ! -->
+ <cd:constant type="5pt"/> <!-- TODO: maybe <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="implicit"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scriptscript">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="xx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="d">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="mic">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="mare">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spatiereinterliniara">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="em">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfontenvironment" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="seteazamediulfonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes"> <!-- same as definebodyfontenvironment; you can define the whole commant to inherit, not only parameters-->
+ <cd:inherit name="definestemediulfonttext" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="no">
+ <cd:inherit name="definestemediulfonttext" n="2" optional="no"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="definestemediulfonttext" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showbodyfontenvironment" file="font-run.tex" category="fonts"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="afiseazamediufonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazafonttext" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definestefonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- <cd:constant type="implicit"/> -->
+ <cd:resolve name="bodyfont"/> <!-- TODO: check this -->
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rm" default="yes"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ <cd:constant type="mm"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="tf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bf">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sl">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="it">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bs">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="bi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mr">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ex">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mi">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="ma">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mb">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="mc">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="md">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontDEF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definestefonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="seteazafonttext" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="1">
+ <cd:inherit name="seteazafonttext" n="3"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebodyfontREF" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definestefonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="seteazafonttext" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="seteazafonttext" n="2"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="showbodyfont" file="font-run.tex" category="fonts"> <!-- visual debugging -->
+ <cd:sequence>
+ <cd:string value="afiseazafonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazafonttext" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbodyfont" file="font-run.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="seteazafonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: many missing, maybe also <cd:resolve name="bodyfont"/> -->
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="suport"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="scrismanual"/>
+ <cd:constant type="caligrafic"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="switchtobodyfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="trecilafonttext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="serif"/>
+ <cd:constant type="regular"/>
+ <cd:constant type="roman"/>
+ <cd:constant type="sans"/>
+ <cd:constant type="suport"/>
+ <cd:constant type="sansserif"/>
+ <cd:constant type="mono"/>
+ <cd:constant type="type"/>
+ <cd:constant type="teletype"/>
+ <cd:constant type="scrismanual"/>
+ <cd:constant type="caligrafic"/>
+ <cd:constant type="5pt"/>
+ <cd:constant type="..."/>
+ <cd:constant type="12pt"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mare"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definestefont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="seteazaculoare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolors" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="seteazaculori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="global"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="totdeauna"/>
+ <cd:constant type="niciodata"/>
+ </cd:parameter>
+ <cd:parameter name="reducere">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="rgb">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="cmyk">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="mpcmyk">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="mpspot">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="culoaretext">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="c"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/>
+ <cd:constant type="k"/>
+ <cd:constant type="p"/>
+ <cd:constant type="s"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="criteriu">
+ <cd:constant type="tot"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="intent">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="overprint"/>
+ <cd:constant type="knockout"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definesteculoare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="r">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="g">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="b">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="c">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="k">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="s">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="h">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="t">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="a">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="p">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="e">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" type="environment" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="culoare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="color" file="colo-ini.tex">
+ <cd:sequence>
+ <cd:string value="culoare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="graycolor" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="culoaregri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolor" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="afiseazaculoare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definestepaleta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppalet" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="seteazapaleta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecolorgroup" file="colo-ini.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="definestegrupculori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="rgb" default="yes"/>
+ <cd:constant type="cmyk"/>
+ <cd:constant type="gri"/>
+ <cd:constant type="s"/>
+ </cd:keywords>
+ <cd:triplet n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showpalet" file="colo-run.tex" category="colors"> <!-- and debug -->
+ <cd:sequence>
+ <cd:string value="afiseazapaleta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="orizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="nume"/>
+ <cd:constant type="valoare"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showcolorgroup" file="colo-run.tex" category="colors"> <!-- and debug-->
+ <cd:sequence>
+ <cd:string value="afiseazagrupculoare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="orizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="nume"/>
+ <cd:constant type="valoare"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparepalet" file="colo-run.tex" category="colors"> <!-- and debug? -->
+ <cd:sequence>
+ <cd:string value="comparapaleta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comparecolorgroup" file="colo-run.tex" category="colors">
+ <cd:sequence>
+ <cd:string value="comparagrupculoare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showmakeup" file="supp-vis.tex" category="debug">
+ <cd:sequence>
+ <cd:string value="afiseazamakeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definetype" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definetype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazatype" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptype" file="core-ver.tex" category="verbatim"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="seteazatype"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="spatiu">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="inclinat"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="type" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="type"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typ" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typ"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tex" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="tex"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- cd:command name="arg" file="core-ver.tex"> command broken
+ <cd:sequence>
+ <cd:string value="arg"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content/>
+ </cd:arguments>
+</cd:command -->
+
+ <cd:command name="definetyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="definestetyping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="seteazatyping" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazatyping" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptyping" file="core-ver.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="seteazatyping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="fisier"/>
+ <cd:constant type="typing"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="spatiu">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="inclinat"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="comenzi" version="mkiv"/>
+ <cd:constant type="culoare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="comandai">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comandav">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comandac">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="marginepara">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margineimpara">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="blanc">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="jumatatelinie"/>
+ <cd:constant type="linie"/>
+ </cd:parameter>
+ <cd:parameter name="escape">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spatiu">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="tab">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="aliniaturmator">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="paleta">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="range">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="linii">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="despsilabe"/>
+ </cd:parameter>
+ <cd:parameter name="gol">
+ <cd:constant type="da"/>
+ <cd:constant type="tot"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="numerotare">
+ <cd:constant type="linie"/>
+ <cd:constant type="fisier"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="strip">
+ <cd:constant type="nu"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typing" type="environment" generated="yes" file="verb-ini.tex"
+ category="verbatim">
+ <cd:sequence>
+ <cd:variable value="typing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="typefile" file="verb-ini.tex" category="verbatim">
+ <cd:sequence>
+ <cd:string value="typefile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="seteazanotasubsol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="numere"/>
+ <cd:constant type="caractere"/>
+ <cd:constant type="Caractere"/>
+ <cd:constant type="numereromane"/>
+ <cd:constant type="Numereromane"/>
+ </cd:parameter>
+ <cd:parameter name="mod">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="pagina"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="coloane"/>
+ <cd:constant type="firstcolumn"/>
+ <cd:constant type="lastcolumn"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="rigla">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantacoloane">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantamargine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="comandanumar">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandatext">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="tolerant"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="foartestrict"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stiltext">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoaretext">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="interactiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootnotedefinition" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="seteazadefinireanotasubsol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="seteazadescriere" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnote" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="notasubsol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="footnotetext" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="footnotetext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="note" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="nota"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="localfootnotes" type="environment" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="localfootnotes"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelocalfootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="punenotesubsollocale"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazanotasubsol" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefootnotes" file="core-not.tex" category="footnotes">
+ <cd:sequence>
+ <cd:string value="punenotesubsol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazanotasubsol" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupunderbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="seteazasublinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativ">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ <cd:parameter name="grosimerigla">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetjos">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetsus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="culoarerigla">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="underbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="underbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbar" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overbars" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overbars"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrike" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrike"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overstrikes" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="overstrikes"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="numereromane"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Romannumerals" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Numereromane"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="numbers" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="numere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="litera"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Character" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Litera"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="litere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Characters" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="Litere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mediaeval" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="mediaeval"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="month" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="luna"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="MONTH" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="LUNA"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="weekday" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="zidinsaptamana"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WEEKDAY" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="ZIDINSAPTAMANA"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcapitals" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="seteazamajuscule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="titlu">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="sc">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nocap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="nocap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="CAP" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CAP"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Cap" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cap"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Caps" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Caps"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORD" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CUVANT"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="WORDS" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="CUVINTE"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Word" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cuvant"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="Words" file="core-fnt.tex" category="Fonts">
+ <cd:sequence>
+ <cd:string value="Cuvinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="stretched" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="intins"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:word n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definestesimbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefiguresymbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="definestesimbolfigura"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="seteazafiguriexterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbol" file="symb-ini.tex">
+ <cd:sequence>
+ <cd:string value="simbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="symbolset" type="environment" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="symbolset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsymbolset" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="seteazasimbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usesymbols" file="symb-ini.tex" category="symbols">
+ <cd:sequence>
+ <cd:string value="folosestesimboluri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showsymbolset" file="symb-run.tex" category="symbols"> <!-- and symbols -->
+ <cd:sequence>
+ <cd:string value="afiseazasetsimboluri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineconversion" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="definesteconversie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="convertnumber" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="convertestenumar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="seteazatexttitlu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplabeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="seteazatexteticheta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="language"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="cd:name">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headtext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="texttitlu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeltext" file="lang-lab.tex">
+ <cd:sequence>
+ <cd:string value="texteticheta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazaliniimargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="nivel">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="grosimerigla">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="liniemargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="liniemargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinewidth" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazagrosimelinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazainconjurat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/> <!-- defines a command with that name -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="inaltime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="fixat"/>
+ <cd:constant type="local"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="autolatime">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="fortat"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="overlay"/>
+ <cd:constant type="implicit"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="adancime"/>
+ <cd:constant type="suspendat"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="lohi"/>
+ <cd:constant type="jos"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="mentine"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="gol"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="global"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="jos">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="sus">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="framesus">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="framejos">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="framestanga">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="framedreapta">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="offsetframe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="adancimeframe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="coltframe">
+ <cd:constant type="rotund"/>
+ <cd:constant type="rectangular"/>
+ </cd:parameter>
+ <cd:parameter name="razaframe">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="culoareframe">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="fundal">
+ <cd:constant type="ecran"/>
+ <cd:constant type="culoare"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="primplan"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="ecranfundal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="culoarefundal">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="offsetfundal">
+ <cd:constant type="incadrat"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="adancimefundal">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="coltfundal">
+ <cd:constant type="rotund"/>
+ <cd:constant type="rectangular"/>
+ </cd:parameter>
+ <cd:parameter name="razafundal">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="colt">
+ <cd:constant type="rotund"/>
+ <cd:constant type="rectangular"/>
+ </cd:parameter>
+ <cd:parameter name="raza">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="gol">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundcolor">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="foregroundstyle">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="grosimerigla">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="framed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="inframed"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="thinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="liniisubtiri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes">
+ <cd:inherit name="seteazaliniesubtire" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupthinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazaliniesubtire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="spatiereinterliniara">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="culoarefundal">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ </cd:parameter>
+ <cd:parameter name="grosimerigla">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="fundal">
+ <cd:constant type="culoare"/>
+ </cd:parameter>
+ <cd:parameter name="culoarefundal">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hairline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="firdepar"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="thinrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="liniesubtire"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineframedtext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definestetextinconjurat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="definestetexteinconjurate" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineframed" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definesteinconjurare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="definestetexteinconjurate" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupframedtexts" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definestetexteinconjurate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intern">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="corectielinie">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="corectieadancime">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="standard"/>
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="aliniat">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" type="environment" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="textinconjurat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="niciunul"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="definestetexteinconjurate" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="framedtext" generated="yes" file="core-rul.tex">
+ <cd:sequence>
+ <cd:variable value="textinconjurat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="definestetexteinconjurate" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="fundal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="background" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="fundal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackground" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazafundal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="offsetstanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetdreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetsus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetjos">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="rigleumplere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazarigleumplere" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillintext" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="textumplere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazarigleumplere" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazarigleumplere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="latime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="spatiereinterliniara">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinline" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="linieumplere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazaliniiumplere" n="1"/>
+ </cd:assignments>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfillinlines" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazaliniiumplere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptextrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazarigletext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="inmargine"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoarerigla">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="riglatext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textrule" type="environment" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="riglatext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ </cd:keywords>
+ <cd:content n="2" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrule" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="linieneagra"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazaliniinegre" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="blackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="liniinegre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:inherit name="seteazaliniinegre" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblackrules" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazaliniinegre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension" default="1em"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension" default="1ex"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="a" default="yes"/>
+ <cd:constant type="b"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension" default=".25ex"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="3"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineoverlay" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="definesteoverlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usemodule" file="core-fil.tex"> <!-- TODO -->
+ <cd:sequence>
+ <cd:string value="folosestemodul"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reset" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="reset"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- <cd:command name="donttest">
+ <cd:sequence>
+ <cd:string value="nutesta"/>
+ </cd:sequence>
+</cd:command> -->
+
+ <cd:command name="localenvironment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="localenvironment"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsystem" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="seteazasistem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rezolutie">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="fisier">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="director">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aleator">
+ <cd:constant type="normal"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usedirectory" file="core-job.mkii"> <!-- usepath, todo: more than one file -->
+ <cd:sequence>
+ <cd:string value="usedirectory"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="reset"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="low" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="jos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="high" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="inalt"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lohi" file="core-fnt.tex">
+ <cd:sequence>
+ <cd:string value="jossus"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showframe" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="afiseazarama"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="bordura"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="leftaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="aliniatstanga"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rightaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="aliniatdreapta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="midaligned" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="aliniatcentru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="wordright" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="cuvantdreapta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inmargin" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="marginal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inothermargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inaltamargine"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inleft" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="instanga"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inright" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="indreapta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ininner" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="ininner"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inouter" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="inouter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="column" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="coloana"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showstruts" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="afiseazastruts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showsetups" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="afiseazasetari"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="showlayout" file="page-run.tex">
+ <cd:sequence>
+ <cd:string value="afiseazaaspect"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="margintext" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="textmarginal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="jos"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarginblocks" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="seteazablocurimarginale"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="inmargine"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="sus">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="jos">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marginblock" type="environment" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="marginblock"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="part" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="part"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="title" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="title"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chapter" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="chapter"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="section" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="section"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsection"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="subsubsubject" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="subsubsubject"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="appendix" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="appendix"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="in" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="in"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="at" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="la"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:content n="2" interactive="yes"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="about" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="despre"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="yes"/>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="somewhere" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="undeva"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:reference n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="atpage" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="lapagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ref" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="ref"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="t"/>
+ <cd:constant type="p"/>
+ <cd:constant type="r"/>
+ <cd:constant type="s"/>
+ <cd:constant type="e"/>
+ </cd:keywords>
+ <cd:reference n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="textreference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="referintatext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="referintapagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="referinta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usereferences" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="folosestereferinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereference" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definestereferinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferenceformat" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="definesteformatreferinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="eticheta">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="hl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="vl" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="vl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="godown" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="injos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="whitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="spatiualb"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nowhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="faraspatiualb"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="crlf" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="crlf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="space" file="syst-pln.tex">
+ <cd:sequence>
+ <cd:string value="spatiu"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="fixedspaces" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="spatiifixate"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="emptylines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="emptylines"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nospace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="faraspatiu"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="packed" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impachetat"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupdescriptions" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="seteazadescriere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/> <!-- TODO: style=normal -->
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:dimension" default="8em"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="exemplu">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="closecommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="closesymbol">
+ <cd:constant type="cd:text" default=""/>
+ </cd:parameter>
+ <cd:parameter name="titleleft">
+ <cd:constant type="cd:text" default="("/>
+ </cd:parameter>
+ <cd:parameter name="titleright">
+ <cd:constant type="cd:text" default=")"/>
+ </cd:parameter>
+ <cd:parameter name="distantatitlu">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stiltitlu">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="culoaretitlu">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="standard"/>
+ <cd:constant type="da"/>
+ <cd:constant type="nu" default="yes"/> <!-- TODO: this is default; conflicting syntax? -->
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga" default="yes"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="instanga"/>
+ <cd:constant type="indreapta"/>
+ <cd:constant type="suspendat"/>
+ </cd:parameter>
+ <cd:parameter name="stiltitlu">
+ <cd:resolve name="style"/> <!-- TODO: default=bold -->
+ </cd:parameter>
+ <cd:parameter name="culoaretitlu">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ <cd:parameter name="headcommand">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="suspenda">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command" default="\blank"/>
+ </cd:parameter>
+ <cd:parameter name="aliniaturmator">
+ <cd:resolve name="indentnext"/> <!-- default=yes -->
+ </cd:parameter>
+ <cd:parameter name="aliniat">
+ <cd:resolve name="indenting"/> <!-- default=never -->
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupenumerations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="seteazaenumerare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazadescriere" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineenumeration" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definesteenumerare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="seteazaenumerare" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumerare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1" interactive="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="enumeration" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="enumerare"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definedescription" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definestedescriere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazadescriere" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="descriere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="description" type="environment" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="descriere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindentations" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="seteazaaliniate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiltitlu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="exemplu">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineindenting" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definestealiat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazaaliniate" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="indentation" generated="yes" file="core-spa.tex">
+ <cd:sequence>
+ <cd:variable value="indentation"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:nothing n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelabel" file="core-des.tex">
+ <cd:sequence>
+ <cd:string value="definesteeticheta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="inmargine"/>
+ <cd:constant type="intext"/>
+ </cd:parameter>
+ <cd:parameter name="mod">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="blockway">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="stiltitlu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoaretitlu">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labeling" generated="yes" file="core-des.tex">
+ <cd:sequence>
+ <cd:variable value="labeling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcolumns" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="seteazacoloane"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- no idea why it is optional -->
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nsus">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rigla">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/> <!-- default and unknown missing -->
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="toleranta">
+ <cd:constant type="foartestrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="foartetolerant"/>
+ <cd:constant type="dilatat"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="balanta">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:constant type="text"/>
+ <!-- cd:constant type="yes"/ -->
+ <!-- cd:constant type="no"/ -->
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="blanc">
+ <cd:constant type="fixat"/>
+ <cd:constant type="jumatatelinie"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="flexibil"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mic"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="fundal"/>
+ </cd:parameter>
+ <cd:parameter name="directie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="columns" type="environment" file="page-mul.tex">
+ <cd:sequence>
+ <cd:string value="columns"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazacoloane" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="definestetext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="antet"/>
+ <cd:constant type="subsol"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheader" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazaantet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text" default="yes"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="bordura"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="faramarcare"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilstanga">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stildreapta">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="latimestanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfooter" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazasubsol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="seteazaantet" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazaantet" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptext" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazatext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="seteazaantet" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazaantet" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptop" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazasus"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="seteazaantet" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazaantet" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottom" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazajos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="seteazaantet" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazaantet" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noheaderandfooterlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="faraliniiantetsisubsol"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="notopandbottomlines" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="faraliniisussijos"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupheadertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazatexteantet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfootertexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazatextesubsol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptexttexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazatextetext"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptoptexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazatextesus"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbottomtexts" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="seteazatextejos"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="settextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="settextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:resolve name="texts"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resettextcontent" file="page-txt.tex">
+ <cd:sequence>
+ <cd:string value="resettextcontent"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:resolve name="layout-v"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:resolve name="layout-h"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="lefttext"/>
+ <cd:constant type="middletext"/>
+ <cd:constant type="righttext"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="definestemarcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplemarking" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="cupleazamarcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="decouplemarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="decupleazamarcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="resetmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="reseteazamarcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="seteazamarcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="expansiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="marking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="marcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getmarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="adumarcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="primul"/>
+ <cd:constant type="ultim"/>
+ <cd:constant type="precedent"/>
+ <cd:constant type="ambele"/>
+ <cd:constant type="tot"/>
+ <cd:constant type="curent"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomarking" file="core-mar.tex">
+ <cd:sequence>
+ <cd:string value="faramarcaje"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplayout" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="seteazaaspect"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="centru"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="centru"/>
+ </cd:parameter>
+ <cd:parameter name="spatiuspate">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spatiusus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginestanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="antet">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="subsol">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="jos">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="bordurastanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="borduradreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantaantet">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantasubsol">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantasus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantajos">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantamarginestanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantamarginedreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantabordurastanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantacoltdreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetoriz">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="marcaje">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ <cd:constant type="culoare"/>
+ <cd:constant type="ecran"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="pagina"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="ofata"/>
+ <cd:constant type="douafete"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="linii">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="coloane">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distantacoloane">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="grid">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="spatiujos">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="cutspace">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latimetext">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="textmargin">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="clipoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="hartie">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="adaptlayout" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="adapteazaaspect"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="linii">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showgrid" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="afiseazagrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="tot"/>
+ <cd:constant type="linii"/>
+ <cd:constant type="incadrat"/>
+ <cd:constant type="nonumber"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="extern"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="plaseazapegrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:inherit name="mutapegrid" n="1"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="moveongrid" file="core-grd.tex">
+ <cd:sequence>
+ <cd:string value="mutapegrid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/> <!-- also 'normal', 'yes' and 'force' -->
+ <cd:constant type="sus"/>
+ <cd:constant type="ambele"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="-top"/>
+ <cd:constant type="-both"/>
+ <cd:constant type="-bottom"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="jos"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="adancime"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="project" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="proiect"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="environment" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="mediu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="product" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="produs"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="component" type="environment" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="componenta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:file n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomorefiles" file="core-job.tex">
+ <cd:sequence>
+ <cd:string value="farafisiere"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace" variant="1" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="seteazaspatiuinterliniar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="mic" default="yes"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinterlinespace2" variant="2" file="core-spa.tex">
+ <!-- attached a 2 to make this definition usable with \showsetup -->
+ <cd:sequence>
+ <cd:string value="seteazaspatiuinterliniar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="linie">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sus">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="jos">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumbering" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="seteazanumerotarepagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativ">
+ <cd:constant type="ofata"/>
+ <cd:constant type="douafete"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="antet"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="marginebordura"/>
+ <cd:constant type="instanga"/>
+ <cd:constant type="indreapta"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="numere"/>
+ <cd:constant type="caractere"/>
+ <cd:constant type="Caractere"/>
+ <cd:constant type="numereromane"/>
+ <cd:constant type="Numereromane"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="mod">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="separatornumar">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="separatortext">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="ultim"/>
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnarrower" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="seteazaingust"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="mijloc">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="define" file="syst-ext.tex">
+ <cd:sequence>
+ <cd:string value="defineste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:csname n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usecommands" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="folosestecomenzi"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definestartstop" file="core-sys.tex">
+ <cd:sequence>
+ <cd:string value="definestestartstop"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="comenzi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheads" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="seteazatitluri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numarsectiune">
+ <cd:constant type="da"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="normal"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="paragraf"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="alinieretitlu">
+ <cd:constant type="da"/>
+ <cd:constant type="obiectmobil"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="toleranta">
+ <cd:constant type="foartestrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="foartetolerant"/>
+ <cd:constant type="dilatat"/>
+ </cd:parameter>
+ <cd:parameter name="aliniaturmator">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaptions" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="seteazalegendele"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="jos"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="lefthanging"/>
+ <cd:constant type="righthanging"/>
+ <cd:constant type="marginestanga"/>
+ <cd:constant type="marginedreapta"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="max"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latimeminima">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stiltitlu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="numar">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="numere"/>
+ <cd:constant type="caractere"/>
+ <cd:constant type="Caractere"/>
+ <cd:constant type="numereromane"/>
+ <cd:constant type="Numereromane"/>
+ </cd:parameter>
+ <cd:parameter name="mod">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcaption" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="seteazalegenda"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazalegendele" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloats" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="seteazafloats"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="centru"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spatiuinainte">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="spatiudupa">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="spatiulateralinainte">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="spatiulateraldupa">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="aliniaturmator">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="nsus">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="njos">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nlinii">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="implicit">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="toleranta">
+ <cd:constant type="0"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ <cd:parameter name="distantamarginestanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantamarginedreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="sidealign">
+ <cd:constant type="normal"/>
+ <cd:constant type="linie"/>
+ </cd:parameter>
+ <cd:parameter name="numerotare">
+ <cd:constant type="da"/>
+ <cd:constant type="nocheck"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloatsplitting" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="seteazaimpartireafloat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="numere"/>
+ <cd:constant type="caractere"/>
+ <cd:constant type="Caractere"/>
+ <cd:constant type="numereromane"/>
+ <cd:constant type="Numereromane"/>
+ </cd:parameter>
+ <cd:parameter name="linii">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="splitfloat" file="core-tsp.tex">
+ <cd:sequence>
+ <cd:string value="impartefloat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazaimpartireafloat" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupoppositeplacing" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="seteazaplasareaopozita"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="opposite" type="environment" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="opposite"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuphyphenmark" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazaliniesilabe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="semn">
+ <cd:constant type="--"/>
+ <cd:constant type="---"/>
+ <cd:constant type="-"/>
+ <cd:constant type="~"/>
+ <cd:constant type="("/>
+ <cd:constant type=")"/>
+ <cd:constant type="="/>
+ <cd:constant type="/"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppositioning" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="setarepozitie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="overlay"/>
+ </cd:parameter>
+ <cd:parameter name="unitate">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="absolut"/>
+ <cd:constant type="relativ"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="absolut"/>
+ <cd:constant type="relativ"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="positioning" type="environment" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="positioning"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="grid" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="grid"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="x">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="dy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xstep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ystep">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="unitate">
+ <cd:constant type="cm"/>
+ <cd:constant type="pt"/>
+ <cd:constant type="em"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="ex"/>
+ <cd:constant type="es"/>
+ <cd:constant type="in"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="page" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="pagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="da" default="yes"/>
+ <cd:constant type="marcaj"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="preferinta"/>
+ <cd:constant type="preferintamare"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="dezactivat"/>
+ <cd:constant type="ultim"/>
+ <cd:constant type="cvadrupul"/>
+ <cd:constant type="par"/>
+ <cd:constant type="impar"/>
+ <cd:constant type="blank"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencing" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="seteazareferinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="interactiune">
+ <cd:constant type="eticheta"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="tot"/>
+ <cd:constant type="simbol"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="convertestefisier">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mare"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autofile">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="pagina"/>
+ </cd:parameter>
+ <cd:parameter name="global">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="export">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupurl" file="core-ref.tex" category="references">
+ <cd:sequence>
+ <cd:string value="seteazaurl"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="urlalternativ">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="ambele"/>
+ <cd:constant type="inainte"/>
+ <cd:constant type="dupa"/>
+ </cd:parameter>
+ <cd:parameter name="spatiuurl">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="scrieinlistareferinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="placereferencelist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definereferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definestelistareferinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazalistareferinte" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupreferencelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="seteazalistareferinte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criteriu">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="precedent"/>
+ <cd:constant type="tot"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="scrieinlista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writebetweenlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="scrieintreliste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nolist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="faralista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="listsymbol" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="listsymbol"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="punelista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazalista" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determinelistcharacteristics" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="determinacaracteristicilelistei"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazalista" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="1" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="punelistacombinata"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazalistacombinata" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definestelista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes"> <!-- inherits from -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="seteazalista" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="seteazalista"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="..."/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="comanda"/>
+ </cd:parameter>
+ <cd:parameter name="cuplare">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="criteriu">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="precedent"/>
+ <cd:constant type="curent"/>
+ <cd:constant type="aici"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="tot"/>
+ </cd:parameter>
+ <cd:parameter name="marginipagina">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilnumar">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiltext">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilpagina">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ <cd:parameter name="comandanumar">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandatext">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandapagina">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="interactiune">
+ <cd:constant type="cd:sectionnumber"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="numarpagina"/>
+ <cd:constant type="tot"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="eticheta">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="numarpagina">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="numartitlu">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="alinieretitlu">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="simbol">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="..."/>
+ </cd:parameter>
+ <cd:parameter name="expansiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="comanda"/>
+ </cd:parameter>
+ <cd:parameter name="latimemaxima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplistalternative" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="setuplistalternative"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="no">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <!-- cd:constant type="cd:name"/ -->
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dilatat">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definecombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="definestelistacombinata"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:list"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="seteazalistacombinata" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinedlist" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="seteazalistacombinata"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="nivel">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="3"/>
+ <cd:constant type="4"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="curent"/>
+ </cd:parameter>
+ <cd:inherit name="seteazalista" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placecombinedlist" variant="2" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="pune"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazalistacombinata" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completecombinedlist" generated="yes" file="core-lst.tex">
+ <cd:sequence>
+ <cd:string value="complet"/>
+ <cd:variable value="combinedlist"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazalistacombinata" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupnumbering" file="core-num.tex">
+ <cd:sequence>
+ <cd:string value="seteazanumerotare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="mod">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupformulas" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="seteazaformule"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="centru"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="center"/>
+ </cd:parameter>
+ <cd:parameter name="marginestanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="aliniaturmator">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="spatiuinainte">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="numere"/>
+ <cd:constant type="caractere"/>
+ <cd:constant type="Caractere"/>
+ <cd:constant type="numereromane"/>
+ <cd:constant type="Numereromane"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="publication" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="publicatie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppublications" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazapublicatii"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="alternativ">
+ <cd:constant type="apa"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
+ <cd:inherit name="seteazaenumerare" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplines" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="seteazalinii"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="aliniat">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="spatiu">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="impachetat"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="lines" type="environment">
+ <cd:sequence>
+ <cd:string value="lines"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphnumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="seteazanumerotareparagrafe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="linie"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplinenumbering" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="seteazanumerotarelinii"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="numere"/>
+ <cd:constant type="caractere"/>
+ <cd:constant type="Caractere"/>
+ <cd:constant type="numereromane"/>
+ <cd:constant type="Numereromane"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="centru"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="instanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="indreapta"/>
+ <cd:constant type="intern"/>
+ <cd:constant type="extern"/>
+ <cd:constant type="text"/>
+ <cd:constant type="begin"/>
+ <cd:constant type="end"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="referinta">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="linenumbering" type="environment" file="page-lin.tex"> <!-- mkii/mkiv -->
+ <cd:sequence>
+ <cd:string value="linenumbering"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="continuu"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="line" type="environment">
+ <cd:sequence>
+ <cd:string value="line"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="someline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="olinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="inline" file="page-lin.tex">
+ <cd:sequence>
+ <cd:string value="inlinie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinmargin" file="page-mar.tex">
+ <cd:sequence>
+ <cd:string value="seteazamarginal"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="ambele"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="linie">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="separator">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stack">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="seteazanumarpagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numar">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="mentine"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsubpagenumber" file="page-num.tex">
+ <cd:sequence>
+ <cd:string value="seteazanumarsubpagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="mod">
+ <cd:constant type="bytext"/>
+ <cd:constant type="bycd:section"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="seteazablanc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="normal" default="yes"/>
+ <cd:constant type="implicit"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="jumatatelinie"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="fixat"/>
+ <cd:constant type="flexibil"/>
+ <cd:constant type="global"/>
+ <cd:constant type="necunoscut"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="definesteblanc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:inherit name="seteazablanc" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definepapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="definestedimensiunehartie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppaper" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="setuppaper"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="hartie">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spatiusus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spatiuspate">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="max"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="metoda">
+ <cd:constant type="normal"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuppapersize" file="page-lay.tex">
+ <cd:sequence>
+ <cd:string value="seteazadimensiunihartie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="A3"/>
+ <cd:constant type="A4" default="yes"/>
+ <cd:constant type="A5"/>
+ <cd:constant type="A6"/>
+ <cd:constant type="letter"/>
+ <cd:constant type="..."/>
+ <cd:constant type="CD"/>
+ <cd:constant type="cd:name"/>
+ <cd:constant type="vedere"/>
+ <cd:constant type="oglindit"/>
+ <cd:constant type="rotat"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="negativ"/>
+ <cd:inherit name="seteazadimensiunihartie" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuparranging" file="page-imp.tex">
+ <cd:sequence>
+ <cd:string value="seteazaaranjareapag"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="dezactivat"/>
+ <cd:constant type="2*16"/>
+ <cd:constant type="2*8"/>
+ <cd:constant type="2*4"/>
+ <cd:constant type="2*2"/>
+ <cd:constant type="2**2"/>
+ <cd:constant type="2*2*4"/>
+ <cd:constant type="2*4*2"/>
+ <cd:constant type="2UP"/>
+ <cd:constant type="2DOWN"/>
+ <cd:constant type="2SIDE"/>
+ <cd:constant type="2TOP"/>
+ <cd:constant type="oglindit"/>
+ <cd:constant type="rotat"/>
+ <cd:constant type="douafete"/>
+ <cd:constant type="negativ"/>
+ <cd:constant type="fundal"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showprint" file="page-run.tex"> <!-- page-lay.tex -->
+ <cd:sequence>
+ <cd:string value="afiseazatiparire"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="seteazadimensiunihartie" n="1"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:inherit name="seteazadimensiunihartie" n="2"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="seteazaaspect" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definelogo" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="definestelogo"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="sus"/>
+ <cd:constant type="antet"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="subsol"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="bordurastanga"/>
+ <cd:constant type="marginestanga"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="marginedreapta"/>
+ <cd:constant type="borduradreapta"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:command"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelogos" file="page-log.tex">
+ <cd:sequence>
+ <cd:string value="punelogouri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupwhitespace">
+ <cd:sequence>
+ <cd:string value="seteazaspatiualb"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="niciunul" default="yes"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="fixat"/>
+ <cd:constant type="fix"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupindenting">
+ <cd:sequence>
+ <cd:string value="seteazaaliniat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definesteblocsectiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="seteazablocsectiune" n="1"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazablocsectiune" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsectionblock" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="seteazablocsectiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="numar">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="da"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definestesectiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsection" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="seteazasectiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="conversie">
+ <cd:constant type="numere"/>
+ <cd:constant type="caractere"/>
+ <cd:constant type="Caractere"/>
+ <cd:constant type="numereromane"/>
+ <cd:constant type="Numereromane"/>
+ </cd:parameter>
+ <cd:parameter name="numarprecedent">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuphead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="seteazatitlu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiltext">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilnumar">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="culoaretext">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="culoarenumar">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="numar">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="numarpropriu">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="da"/>
+ </cd:parameter>
+ <cd:parameter name="continua">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="antet">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="faramarcare"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="faramarcare"/>
+ </cd:parameter>
+ <cd:parameter name="subsol">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="faramarcare"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="normal"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="suspenda">
+ <cd:constant type="niciunul"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:twoarguments"/>
+ </cd:parameter>
+ <cd:parameter name="comandanumar">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="comandatext">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deepnumbercommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="+"/>
+ <cd:constant type="-"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="punetitlu">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="gol"/>
+ </cd:parameter>
+ <cd:parameter name="numarincrement">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="cd:list"/>
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="resetnumber">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="fisier">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="expansiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="comanda"/>
+ </cd:parameter>
+ <cd:parameter name="textmargine">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:inherit name="seteazatitluri" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="seteazanumartitlu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="+cd:number"/>
+ <cd:constant type="-cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="headnumber">
+ <cd:sequence>
+ <cd:string value="numartitlu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="determineheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="determinanumartitlu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentheadnumber" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="numartitlucurent"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="nextsection" generated="yes" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="urmatorul"/>
+ <cd:variable value="sectiune"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definehead" file="core-sec.tex">
+ <cd:sequence>
+ <cd:string value="definesteantet"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:section"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitemgroup" file="core-itm.tex">
+ <!-- we mis a few experimental keys here, like alignsymbol and indentation -->
+ <cd:sequence>
+ <cd:string value="setupitemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="fiecare"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="impachetat"/>
+ <cd:constant type="despachetat"/>
+ <cd:constant type="faraalb"/>
+ <cd:constant type="inainte"/>
+ <cd:constant type="dupa"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="unit"/>
+ <cd:constant type="lamargine"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="autointro"/>
+ <cd:constant type="larg"/>
+ <cd:constant type="repetat"/>
+ <cd:constant type="cd:section"/>
+ <cd:constant type="paragraf"/>
+ <cd:constant type="intext"/>
+ <cd:constant type="aleator"/>
+ <cd:constant type="reverse"/>
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:parameter name="margine">
+ <cd:constant type="nu"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginestanga">
+ <cd:constant type="nu"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="marginedreapta">
+ <cd:constant type="nu"/>
+ <cd:constant type="standard"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="elemente">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="start">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="inaintetitlu">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupatitlu">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stiltitlu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilmarcaj">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilsimbol">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stopper">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="simbol">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="symaliniere">
+ <cd:resolve name="symalign"/>
+ </cd:parameter>
+ <cd:parameter name="aliniaturmator">
+ <cd:resolve name="indentnext"/>
+ </cd:parameter>
+ <cd:parameter name="textdistance">
+ <!-- maybe resolve here too -->
+ <cd:constant type="niciunul"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mic"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="itemgroup" type="environment" generated="yes" file="core-itm.tex">
+ <cd:sequence>
+ <cd:variable value="itemgroup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="a"/>
+ <cd:constant type="A"/>
+ <cd:constant type="KA"/>
+ <cd:constant type="n"/>
+ <cd:constant type="N"/>
+ <cd:constant type="m"/>
+ <cd:constant type="r"/>
+ <cd:constant type="R"/>
+ <cd:constant type="KR"/>
+ <cd:constant type="cd:number"/>
+ <cd:constant type="continuu"/>
+ <cd:constant type="standard" default="yes"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="impachetat"/>
+ <cd:constant type="stopper"/>
+ <cd:constant type="unit"/>
+ <cd:constant type="lamargine"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="intro"/>
+ <cd:constant type="coloane"/>
+ <cd:constant type="text"/>
+ <cd:constant type="paragraf"/>
+ <cd:constant type="repetat"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="setupitemgroup" n="4"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="item" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="element"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="but">
+ <cd:sequence>
+ <cd:string value="but"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="its">
+ <cd:sequence>
+ <cd:string value="el"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="ran">
+ <cd:sequence>
+ <cd:string value="ran"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="head">
+ <cd:sequence>
+ <cd:string value="titlu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mar">
+ <cd:sequence>
+ <cd:string value="mar"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sub">
+ <cd:sequence>
+ <cd:string value="sub"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sym" file="core-itm.tex">
+ <cd:sequence>
+ <cd:string value="sim"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nop">
+ <cd:sequence>
+ <cd:string value="nop"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="definesteregistru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="seteazaregistru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="balanta">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilpagina">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stiltext">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="indicator">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="cuplare">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="cd:sectionnumber">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="criteriu">
+ <cd:constant type="cd:section"/>
+ <cd:constant type="local"/>
+ <cd:constant type="tot"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="simbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="interactiune">
+ <cd:constant type="numarpagina"/>
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="expansiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="comanda"/>
+ </cd:parameter>
+ <cd:parameter name="referinta">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:parameter name="latimemaxima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="referintanecunoscuta">
+ <cd:constant type="gol"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="A"/>
+ <cd:constant type="B"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="ambele"/>
+ <cd:constant type="primul"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="compress">
+ <cd:constant type="nu"/>
+ <cd:constant type="da"/>
+ </cd:parameter>
+ <cd:parameter name="deeptextcommand">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="register" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:variable value="registru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="startregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="start"/>
+ <cd:variable value="registru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="writetoregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="scrieinregistru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="cuplat"/>
+ <cd:variable value="registru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:index n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupleregister" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="cupleazaregistru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="1" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="puneregistru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazaregistru" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="seeregister" generated="yes">
+ <cd:sequence>
+ <cd:string value="vezi"/>
+ <cd:variable value="registru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:index n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completeregister" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="complet"/>
+ <cd:variable value="registru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="seteazaregistru" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeregister" variant="2" generated="yes" file="core-reg.tex">
+ <cd:sequence>
+ <cd:string value="pune"/>
+ <cd:variable value="registru"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="yes" optional="yes" list="yes">
+ <cd:inherit name="seteazaregistru" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definestesinonim"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynonyms" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="seteazasinonime"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="stiltext">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="stilsinonim">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="serried"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="instanga"/>
+ <cd:constant type="indreapta"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criteriu">
+ <cd:constant type="tot"/>
+ <cd:constant type="folosit"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="expansiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="comanda"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:threearguments"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synonym" generated="yes">
+ <cd:sequence>
+ <cd:variable value="synonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsynonyms" generated="yes">
+ <cd:sequence>
+ <cd:string value="incarca"/>
+ <cd:variable value="synonyms"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definesorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="definestesortare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:command"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsorting" file="core-syn.tex">
+ <cd:sequence>
+ <cd:string value="seteazasortare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:oneargument"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="criteriu">
+ <cd:constant type="tot"/>
+ <cd:constant type="folosit"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="expansiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="comanda"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="sort" generated="yes">
+ <cd:sequence>
+ <cd:variable value="sort"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="completelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="placelistofsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="loadsorts" generated="yes">
+ <cd:sequence>
+ <cd:string value="incarca"/>
+ <cd:variable value="sorts"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="definemakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="definestemakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:inherit name="seteazamakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="makeup" type="environment">
+ <cd:sequence>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazamakeup" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupmakeup" file="page-mak.tex">
+ <cd:sequence>
+ <cd:string value="seteazamakeup"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="stanga"/>
+ <cd:constant type="da"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:parameter name="comenzi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="douafete">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="gol"/>
+ </cd:parameter>
+ <cd:parameter name="stareantet">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="faramarcare"/>
+ </cd:parameter>
+ <cd:parameter name="staresubsol">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="faramarcare"/>
+ </cd:parameter>
+ <cd:parameter name="staretext">
+ <cd:constant type="normal"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="faramarcare"/>
+ </cd:parameter>
+ <cd:parameter name="staresus">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="starejos">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="pagestate">
+ <cd:constant type="stop"/>
+ <cd:constant type="start"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="namemakeup" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="nume"/>
+ <cd:string value="makeup"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="version">
+ <cd:sequence>
+ <cd:string value="versiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="final" default="yes"/>
+ <cd:constant type="concept"/>
+ <cd:constant type="temporar"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="currentdate">
+ <cd:sequence>
+ <cd:string value="datacurenta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:inherit name="data" n="2"/> <!-- or vice versa :) -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="date" file="core-con.tex">
+ <cd:sequence>
+ <cd:string value="data"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes"> <!-- if not given, current date is used -->
+ <cd:parameter name="d">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="m">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="zi"/>
+ <cd:constant type="luna"/>
+ <cd:constant type="an"/>
+ <cd:constant type="zisaptamana"/>
+ <cd:constant type="d"/>
+ <cd:constant type="m"/>
+ <cd:constant type="y"/> <!-- also j -->
+ <cd:constant type="w"/>
+ <cd:constant type="dd"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="yy"/> <!-- also jj -->
+ <cd:constant type="spatiu"/>
+ <cd:constant type="--"/>
+ <cd:constant type="day+"/>
+ <cd:constant type="d+"/>
+ <cd:constant type="dd+"/>
+ <cd:constant type="referinta"/>
+ <cd:constant type="cd:text"/> <!-- any other text -->
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="referraldate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="datareferit"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="indenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="aliniat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:resolve name="indenting"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="noindenting" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="faraaliniat"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="blank" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="blanc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare" default="yes"/>
+ <cd:constant type="faraalb"/>
+ <cd:constant type="inapot"/>
+ <cd:constant type="alb"/>
+ <cd:constant type="dezactivat"/>
+ <cd:constant type="fortat"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="jumatatelinie"/>
+ <cd:constant type="cd:formula"/>
+ <cd:constant type="fixat"/>
+ <cd:constant type="flexibil"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="totdeauna"/>
+ <cd:constant type="extern"/>
+ <cd:constant type="unit"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="packed" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="impachetat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="blank"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="unpacked" type="environment">
+ <cd:sequence>
+ <cd:string value="unpacked"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="linecorrection" type="environment">
+ <cd:sequence>
+ <cd:string value="linecorrection"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="correctwhitespace" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="corecteazaspatiualb"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="postponing" type="environment">
+ <cd:sequence>
+ <cd:string value="postponing"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="local" type="environment">
+ <cd:sequence>
+ <cd:string value="local"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="narrower" type="environment">
+ <cd:sequence>
+ <cd:string value="narrower"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru" default="yes"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="-left"/>
+ <cd:constant type="-middle"/>
+ <cd:constant type="-right"/>
+ <cd:constant type="-none"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="hiding" type="environment">
+ <cd:sequence>
+ <cd:string value="hiding"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupalign" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="seteazaalinierea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="latime"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="intern"/>
+ <cd:constant type="extern"/>
+ <cd:constant type="larg"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="inaltime"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="suspendat"/>
+ <cd:constant type="nothanging"/>
+ <cd:constant type="despsilabe"/>
+ <cd:constant type="nedespsilabe"/>
+ <cd:constant type="lesshyphenation"/>
+ <cd:constant type="morehyphenation"/>
+ <cd:constant type="nou"/>
+ <cd:constant type="old"/>
+ <cd:constant type="normal"/>
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="flushleft"/>
+ <cd:constant type="flushright"/>
+ <cd:constant type="flushouter"/>
+ <cd:constant type="flushinner"/>
+ <cd:constant type="center"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="nohz"/>
+ <cd:constant type="spatiere"/>
+ <cd:constant type="nospacing"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="foartetolerant"/>
+ <cd:constant type="dilatat"/>
+ <cd:constant type="lefttoright"/>
+ <cd:constant type="righttoleft"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+
+ <cd:command name="alignment" type="environment" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="alignment"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazaalinierea" n="1"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupspacing">
+ <cd:sequence>
+ <cd:string value="seteazaspatiu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="broad"/>
+ <cd:constant type="impachetat"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptolerance" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="seteazatoleranta"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="orizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="dilatat"/>
+ <cd:constant type="spatiu"/>
+ <cd:constant type="foartestrict" default="yes"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="foartetolerant"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="pagetype" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="tippagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processpage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="proceseazapagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="da" default="yes"/>
+ <cd:constant type="nu"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepage" file="page-ini.tex">
+ <cd:sequence>
+ <cd:string value="paginadubla"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="optiune">
+ <cd:constant type="douafete"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="position" file="page-lyr.tex">
+ <cd:sequence>
+ <cd:string value="pozitie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:position n="1" list="yes"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupscreens" file="core-rul.tex">
+ <cd:sequence>
+ <cd:string value="seteazaecrane"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="metoda">
+ <cd:constant type="punct"/>
+ <cd:constant type="rigla"/>
+ <cd:constant type="extern"/>
+ </cd:parameter>
+ <cd:parameter name="rezolutie">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ecran">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbackgrounds" file="page-bck.tex">
+ <cd:sequence>
+ <cd:string value="seteazafundaluri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="sus"/>
+ <cd:constant type="antet"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="foaie"/>
+ <cd:constant type="paginastanga"/>
+ <cd:constant type="paginadreapta"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="bordurastanga"/>
+ <cd:constant type="marginestanga"/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="marginedreapta"/>
+ <cd:constant type="borduradreapta"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="cd:repeat"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" generated="yes" file="core-buf.tex">
+ <cd:sequence>
+ <cd:variable value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="buffer" type="environment" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="buffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="getbuffer">
+ <cd:sequence>
+ <cd:string value="adubuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="typebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="scriebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definebuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definestebuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuffer" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="seteazabuffer"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="paragraf">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="definestebloc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="nomoreblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="gatablocuri"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="hideblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="ascundeblocuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="keepblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="pastreazablocuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="tot"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="folosestebloc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="processblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="proceseazabloc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bypassblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="saripesteblocuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="forceblocks">
+ <cd:sequence>
+ <cd:string value="forteazablocuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectblocks" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="selecteazablocuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="criteriu">
+ <cd:constant type="tot"/>
+ <cd:constant type="cd:section"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupblock" file="core-buf.tex">
+ <cd:sequence>
+ <cd:string value="seteazabloc"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intern">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="fisier">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="formula" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="formula"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="mathematics" file="supp-mat.tex">
+ <cd:sequence>
+ <cd:string value="matematica"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="puneformula"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesubformula" file="core-mat.tex">
+ <cd:sequence>
+ <cd:string value="punesubformula"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" optional="yes" list="yes"/>
+ <cd:content n="2" optional="yes"/>
+ <cd:displaymath n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placefloat" generated="yes" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="pune"/>
+ <cd:variable value="obiectmobil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="aici" default="yes"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="instanga"/>
+ <cd:constant type="indreapta"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="margine"/>
+ <cd:constant type="marginestanga"/>
+ <cd:constant type="marginedreapta"/>
+ <cd:constant type="bordurastanga"/>
+ <cd:constant type="borduradreapta"/>
+ <cd:constant type="innermargin"/>
+ <cd:constant type="outermargin"/>
+ <cd:constant type="inneredge"/>
+ <cd:constant type="outeredge"/>
+ <cd:constant type="intern"/>
+ <cd:constant type="extern"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="jos"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="pagina"/>
+ <cd:constant type="paginastanga"/>
+ <cd:constant type="paginadreapta"/>
+ <cd:constant type="opus"/>
+ <cd:constant type="totdeauna"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="fortat"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="reset"/>
+ <cd:constant type="linie"/>
+ <cd:constant type="inaltime"/>
+ <cd:constant type="adancime"/>
+ <cd:constant type="split"/>
+ <cd:constant type="90"/>
+ <cd:constant type="180"/>
+ <cd:constant type="270"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes" list="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="reservefloat" generated="yes">
+ <cd:sequence>
+ <cd:string value="rezervat"/>
+ <cd:variable value="obiectmobil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:reference n="3" optional="yes" list="yes"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="definestefloat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:singular"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:plural"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfloat" file="page-flt.tex">
+ <cd:sequence>
+ <cd:string value="seteazafloat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltimemaxima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latimemaxima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="latimeminima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="implicit">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="marginipagina">
+ <cd:constant type="cd:list"/>
+ </cd:parameter>
+ <cd:parameter name="distantamarginestanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distantamarginedreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="floattext" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="obiectmobil"/>
+ <cd:string value="text"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="jos"/>
+ <cd:constant type="offset"/>
+ <cd:constant type="inalt"/>
+ </cd:keywords>
+ <cd:reference n="2" optional="yes"/>
+ <cd:content n="3"/>
+ <cd:content n="4"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="placelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="completelistoffloats" generated="yes">
+ <cd:sequence>
+ <cd:string value="completelistof"/>
+ <cd:variable value="floats"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="referral" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="referit"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="bet">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ken">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="dat">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="van">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="aan">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="ref">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="selectpaper">
+ <cd:sequence>
+ <cd:string value="selecteazahartie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="familie">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="couplepaper">
+ <cd:sequence>
+ <cd:string value="hartiedubla"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="chem" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="chem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fraction" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="fractie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="periods" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="puncte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="items">
+ <cd:sequence>
+ <cd:string value="element"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazaelemente" n="1"/>
+ </cd:assignments>
+ <cd:content n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupitems" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazaelemente"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="inmargine"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ </cd:parameter>
+ <cd:parameter name="simbol">
+ <cd:constant type="1"/>
+ <cd:constant type="2"/>
+ <cd:constant type="..."/>
+ <cd:constant type="n"/>
+ <cd:constant type="a"/>
+ <cd:constant type="..."/>
+ <cd:constant type="cd:text"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="necunoscut"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" type="environment" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="centru" default="yes"/>
+ <cd:constant type="dreapta"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quotation" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="citat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="quote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="minicitat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupquote" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazaminicitat"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="margine"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="definesteparagraf"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="rigla">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="ajustat"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intern">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="toleranta">
+ <cd:constant type="foartestrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="foartetolerant"/>
+ <cd:constant type="dilatat"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="paragraph" generated="yes">
+ <cd:sequence>
+ <cd:variable value="paragraf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="paragraph" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="paragraf"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupparagraphs" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazaparagrafe"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="fiecare"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="toleranta">
+ <cd:constant type="foartestrict"/>
+ <cd:constant type="strict"/>
+ <cd:constant type="tolerant"/>
+ <cd:constant type="foartetolerant"/>
+ <cd:constant type="dilatat"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intern">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rigla">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptab" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazatab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="exemplu">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stiltitlu">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tab">
+ <cd:sequence>
+ <cd:string value="tab"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:nothing n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="document" type="environment">
+ <cd:sequence>
+ <cd:string value="document"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="labels">
+ <cd:sequence>
+ <cd:string value="etichete"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="definestetabulatori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tabulate" type="environment" generated="yes">
+ <cd:sequence>
+ <cd:variable value="tabulate"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazafiguriexterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptabulate" file="core-tbl.tex">
+ <cd:sequence>
+ <cd:string value="seteazatabulatori"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="unitate">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="aliniat">
+ <cd:resolve name="indenting"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intern">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="EQ">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="culoarerigla">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="grosimerigla">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="blank"/>
+ <cd:constant type="grila"/>
+ <cd:constant type="adancime"/>
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="rigla">
+ <cd:constant type="normal"/>
+ <cd:constant type="linie"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuptables" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="seteazatabele"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="distanta">
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ </cd:parameter>
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="HL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="VL">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="strut"/>
+ </cd:parameter>
+ <cd:parameter name="grosimerigla">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="culoarerigla">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="comenzi">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="fundal">
+ <cd:constant type="ecran"/>
+ <cd:constant type="culoare"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="ecranfundal">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="culoarefundal">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="table" type="environment">
+ <cd:sequence>
+ <cd:string value="table"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tables" type="environment">
+ <cd:sequence>
+ <cd:string value="tables"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetabletemplate" file="core-tab.tex">
+ <cd:sequence>
+ <cd:string value="definestesablontabel"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfiles" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="folosestefisiereexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ <cd:parameter name="fisier">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfile" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="folosestefisierextern"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="4" list="yes">
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="folosestefiguraexterna"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes">
+ <cd:constant type="cd:name"/> <!-- parent -->
+ </cd:keywords>
+ <cd:assignments n="4" optional="yes" list="yes">
+ <cd:inherit name="seteazafiguriexterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="externalfigure" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="figuraexterna"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazafiguriexterne" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="seteazafiguriexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1">
+ <cd:parameter name="scala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="yscala">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="max"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ </cd:parameter>
+ <cd:parameter name="factorw">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="hfactor">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="max"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="preset">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="cd:file"/>
+ </cd:parameter>
+ <cd:parameter name="previzualizare">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="repeta">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="obiect">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="type">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="metoda">
+ <cd:constant type="eps"/>
+ <cd:constant type="mps"/>
+ <cd:constant type="pdf"/>
+ <cd:constant type="tif"/>
+ <cd:constant type="png"/>
+ <cd:constant type="jpg"/>
+ <cd:constant type="mov"/>
+ <cd:constant type="cd:tex"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="incadrat"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="test"/>
+ </cd:parameter>
+ <cd:parameter name="frames">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="ymax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="xmax">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="director">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="local"/>
+ <cd:constant type="global"/>
+ <cd:constant type="implicit"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="latimemaxima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltimemaxima">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="conversie">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="prefix">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showexternalfigures" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="afiseazafiguriexterne"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="alternativ">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternalsoundtrack" file="core-fig.tex">
+ <cd:sequence>
+ <cd:string value="folosestemuzicaexterna"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="name" file="syst-gen.tex">
+ <cd:sequence>
+ <cd:string value="name"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="legend" type="environment">
+ <cd:sequence>
+ <cd:string value="legend"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="doi"/>
+ </cd:keywords>
+ <cd:tex n="2" command="leg"/>
+ <cd:nothing n="3"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:nothing n="5" separator="backslash"/>
+ <cd:tex n="6" separator="backslash" command="leg"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fact" type="environment">
+ <cd:sequence>
+ <cd:string value="fact"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:tex n="1" command="fact"/>
+ <cd:nothing n="2"/>
+ <cd:nothing n="3" separator="backslash"/>
+ <cd:nothing n="4" separator="backslash"/>
+ <cd:tex n="5" separator="backslash" command="fact"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="rotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="roteste"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazarotare" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuprotate" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazarotare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="rotatie">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="normal"/>
+ <cd:constant type="inalt"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="broad"/>
+ <cd:constant type="adancime"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mirror" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="reflexie"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="scale" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="scala"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupcombinations" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="seteazacombinari"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="sus"/>
+ <cd:constant type="centru"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="combination" type="environment">
+ <cd:sequence>
+ <cd:string value="combination"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:matrix"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placesidebyside" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="punefatainfata"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placeontopofeachother" file="core-mis.tex">
+ <cd:sequence>
+ <cd:string value="punedeasuprafiecareia"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overlay" type="environment">
+ <cd:sequence>
+ <cd:string value="overlay"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="overview" type="environment">
+ <cd:sequence>
+ <cd:string value="overview"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionscreen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seteazaecraninteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="max"/>
+ </cd:parameter>
+ <cd:parameter name="spatiuspate">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="spatiusus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetoriz">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="veroffset">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="max"/>
+ <cd:constant type="ajustat"/>
+ <cd:constant type="douafete"/>
+ <cd:constant type="ofata"/>
+ <cd:constant type="auto"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="semncarte"/>
+ </cd:parameter>
+ <cd:parameter name="intarziere">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="screen" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="ecran"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setuppagetransitions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seteazatranzitiepagina"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="reset"/>
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteraction" file="core-nav.tex">
+ <cd:sequence>
+ <cd:string value="seteazainteractiunea"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="meniu">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ <cd:parameter name="pagina">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="click">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="split">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="nou"/>
+ </cd:parameter>
+ <cd:parameter name="actiunedeschidere">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="actiuneinchidere">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="actiunedeschiderepagina">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="actiuneinchiderepagina">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calculeaza">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="strut">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="culoarecontrast">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="setsimbol">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titlu">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="subtitlu">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="autor">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="data">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="keyword">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <!-- maybe this will move elsewhere -->
+ <cd:parameter name="fieldlayer">
+ <cd:constant type="auto"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seteazameniuinteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="mijloc">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ <cd:constant type="niciunul"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="culoarecontrast">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="overlay"/>
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="aceeasipagina">
+ <cd:constant type="da"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="referintanecunoscuta">
+ <cd:constant type="da"/>
+ <cd:constant type="gol"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ <cd:parameter name="offsetstanga">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetdreapta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetsus">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="offsetjos">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="pozitie">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/> <!-- maybe not all parameters from framed -->
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="1" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definestemeniuinteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazameniuinteractiune" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineinteractionmenu" variant="2" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definestemeniuinteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="seteazameniuinteractiune" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionmenu" type="environment">
+ <cd:sequence>
+ <cd:string value="meniuinteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="disableinteractionmenu" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="dezactiveazameniuinteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="sus"/>
+ <cd:constant type="subsol"/>
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useexternaldocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="folosestedocumentextern"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="fisier"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="useURL" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="folosesteURL"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="fisier"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="coupledocument" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="cupleazadocument"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="fisier"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="from" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="din"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:reference n="1" interactive="exclusive"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbar">
+ <cd:sequence>
+ <cd:string value="barainteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:inherit name="seteazabarainteractiune" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="interactionbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="butoaneinteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="seteazabarainteractiune" n="1"/>
+ </cd:assignments>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupinteractionbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seteazabarainteractiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="alternativ">
+ <cd:constant type="a"/>
+ <cd:constant type="b"/>
+ <cd:constant type="c"/>
+ <cd:constant type="d"/>
+ <cd:constant type="e"/>
+ <cd:constant type="f"/>
+ <cd:constant type="g"/>
+ </cd:parameter>
+ <cd:parameter name="simbol">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="inaltime"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="inaltime"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:number"/>
+ <cd:constant type="mic"/>
+ <cd:constant type="mediu"/>
+ <cd:constant type="mare"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronize" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="sincronizeaza"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="synchronization" type="environment">
+ <cd:sequence>
+ <cd:string value="synchronization"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupsynchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setarebarasincronizare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="alternativ">
+ <cd:constant type="pagina"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ <cd:constant type="inaltime"/>
+ <cd:constant type="ajustat"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="synchronizationbar" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="barasincronizare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="alternativ">
+ <cd:constant type="pagina"/>
+ <cd:constant type="local"/>
+ </cd:parameter>
+ <cd:inherit name="setarebarasincronizare" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupsynchronization" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="setaresincronizare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definesteprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprofiles" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seteazaprofile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="optiune">
+ <cd:constant type="test"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="profile" type="environment">
+ <cd:sequence>
+ <cd:string value="profile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofile" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="urmeazaprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placebookmarks" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="plaseazasemnecarte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ <cd:constant type="tot"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="bookmark" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="semncarte"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="version" type="environment">
+ <cd:sequence>
+ <cd:string value="versiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupversions" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seteazaversiuni"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="numar">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="markversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="marcheazaversiune"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="selectversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="selecteazaversiune"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="defineversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="definesteversiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:number"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="urmeazaversiune"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="followprofileversion" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="urmeazaversiuneprofil"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="defineprogram" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="definesteprogram"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupprograms" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="seteazaprograme"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" list="yes">
+ <cd:parameter name="director">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="program" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="program"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="figure" type="environment">
+ <cd:sequence>
+ <cd:string value="figure"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" interactive="exclusive">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="frame">
+ <cd:constant type="on"/>
+ <cd:constant type="dezactivat"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- referring*figure skipped -->
+
+ <!-- marking*figure skipped -->
+
+ <!-- remark skipped -->
+
+ <cd:command name="goto" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="dute"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:content n="2" interactive="exclusive"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="gotobox" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="dutebox"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1" interactive="exclusive"/>
+ <cd:reference n="2" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="button" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="buton"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" interactive="exclusive" optional="yes" list="yes">
+ <cd:inherit name="seteazabutoane" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ <cd:reference n="3" list="yes"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupbuttons" file="core-ref.tex">
+ <cd:sequence>
+ <cd:string value="seteazabutoane"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <!-- menubutton skipped -->
+
+ <cd:command name="setupcomment" file="core-int.tex">
+ <cd:sequence>
+ <cd:string value="seteazacomentariu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="titlu">
+ <cd:constant type="cd:text"/>
+ </cd:parameter>
+ <cd:parameter name="spatiu">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ <cd:parameter name="simbol">
+ <cd:constant type="normal"/>
+ <cd:constant type="Nou"/>
+ <cd:constant type="Balon"/>
+ <cd:constant type="Adaugare"/>
+ <cd:constant type="Ajutor"/>
+ <cd:constant type="Paragraf"/>
+ <cd:constant type="Cheie"/>
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="max"/>
+ <cd:constant type="buffer"/>
+ </cd:parameter>
+ <cd:parameter name="margine">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment" type="environment">
+ <cd:sequence>
+ <cd:string value="comentariu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazacomentariu" n="1"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="comment">
+ <cd:sequence>
+ <cd:string value="comentariu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2" optional="yes" list="yes">
+ <cd:inherit name="seteazacomentariu" n="1"/>
+ </cd:assignments>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definestecamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1"> <!-- name -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2"> <!-- type -->
+ <cd:constant type="text"/>
+ <cd:constant type="linie"/> <!-- equal to text -->
+ <cd:constant type="push"/>
+ <cd:constant type="check"/>
+ <cd:constant type="radio"/>
+ <cd:constant type="combo"/>
+ <cd:constant type="choice"/> <!-- equal to combo -->
+ <cd:constant type="popup"/> <!-- equal to combo -->
+ </cd:keywords>
+ <cd:keywords n="3"> <!-- group -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" list="yes"> <!-- optional for text? -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes"> <!-- default -->
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definesubfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definestesubcamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="copyfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="copiazacamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clonefield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="cloneazacamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="field" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="camp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fitfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="potrivestecamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fillinfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="campumplere"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="tooltip" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="tooltip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes">
+ <cd:constant type="stanga"/>
+ <cd:constant type="dreapta"/>
+ <cd:constant type="centru"/>
+ </cd:keywords>
+ <cd:content n="2"/>
+ <cd:content n="3"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="showfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="afiseazacampuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="logfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="logcampuri"/>
+ </cd:sequence>
+ </cd:command>
+
+ <cd:command name="setupfield" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="seteazacamp"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="eticheta"/>
+ <cd:constant type="orizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="incadrat"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="seteazacampuri" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes"> </cd:assignments>
+ <cd:assignments n="5" list="yes"> </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfields" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="seteazacampuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes"> <!-- TODO: if it's reset, only a single argument, no list -->
+ <cd:constant type="reset"/>
+ <cd:constant type="eticheta"/>
+ <cd:constant type="orizontal"/>
+ <cd:constant type="vertical"/>
+ <cd:constant type="incadrat"/>
+ </cd:keywords>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inainte">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dupa">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="culoare">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="stil">
+ <cd:resolve name="style"/>
+ </cd:parameter>
+ <cd:parameter name="aliniere">
+ <cd:resolve name="align"/>
+ </cd:parameter>
+ <cd:parameter name="optiune">
+ <cd:constant type="readonly"/>
+ <cd:constant type="obligatoriu"/>
+ <cd:constant type="protejat"/>
+ <cd:constant type="sortat"/>
+ <cd:constant type="nedisponibil"/>
+ <cd:constant type="ascuns"/>
+ <cd:constant type="tiparibil"/>
+ </cd:parameter>
+ <cd:parameter name="clickintru">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="clickies">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="regiuneintrare">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="regiuneiesire">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="dupatasta">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="format">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="verifica">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="calculeaza">
+ <cd:constant type="cd:reference"/>
+ </cd:parameter>
+ <cd:parameter name="offsetcamp">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="culoareframecamp">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="culoarefundalcamp">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:inherit name="seteazainconjurat" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="seteazacampuri" n="2"/>
+ </cd:assignments>
+ <cd:assignments n="4" list="yes">
+ <cd:inherit name="seteazacampuri" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupforms" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="seteazaformulare"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="metoda">
+ <cd:constant type="HTML"/>
+ <cd:constant type="FDF"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="definestestivacampuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" list="yes">
+ <cd:inherit name="seteazacampuri" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="fieldstack" file="core-fld.tex">
+ <cd:sequence>
+ <cd:string value="stivacampuri"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:inherit name="seteazacampuri" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="clip" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="clip"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" optional="yes" list="yes">
+ <cd:inherit name="seteazaclipping" n="1"/>
+ </cd:assignments>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupclipping" file="core-trf.tex">
+ <cd:sequence>
+ <cd:string value="seteazaclipping"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="stare">
+ <cd:constant type="start"/>
+ <cd:constant type="stop"/>
+ </cd:parameter>
+ <cd:parameter name="n">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="nx">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="ny">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="x">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="y">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sx">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="sy">
+ <cd:constant type="cd:number" default="1"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="hoffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="voffset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offset">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetstanga">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetdreapta">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetsus">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="offsetjos">
+ <cd:constant type="cd:dimension" default="0pt"/>
+ </cd:parameter>
+ <cd:parameter name="mp">
+ <cd:constant type="cd:name" default=""/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="placelegend">
+ <cd:sequence>
+ <cd:string value="punelegenda"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:content n="1"/>
+ <cd:content n="2"/>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setuplegend">
+ <cd:sequence>
+ <cd:string value="seteazalegenda"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:assignments n="1" list="yes">
+ <cd:parameter name="n">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="distanta">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="intre">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="latime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="inaltime">
+ <cd:constant type="cd:dimension"/>
+ </cd:parameter>
+ <cd:parameter name="locatie">
+ <cd:constant type="dreapta"/>
+ <cd:constant type="subsol"/>
+ </cd:parameter>
+ <cd:parameter name="fonttext">
+ <cd:resolve name="bodyfont"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupstrut" file="core-spa.tex">
+ <cd:sequence>
+ <cd:string value="seteazastrut"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="da" default="yes"/>
+ <cd:constant type="nu"/>
+ <cd:constant type="cap"/>
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescriptfile" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescriptfile"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:file"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="usetypescript" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="usetypescript"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="3" optional="yes" list="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definetypeface" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definetypeface"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="rm"/>
+ <cd:constant type="ss"/>
+ <cd:constant type="tt"/>
+ <cd:constant type="mm"/>
+ <cd:constant type="hw"/>
+ <cd:constant type="cg"/>
+ </cd:keywords>
+ <cd:keywords n="3">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="4">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="5" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="6" optional="yes">
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="rscale">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="text">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontfeature" file="type-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontfeature"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2" optional="yes">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="no">
+ <cd:parameter name="compose">
+ <cd:constant type="nu" default="yes"/>
+ <cd:constant type="da"/>
+ </cd:parameter>
+ <cd:parameter name="mode">
+ <cd:constant type="node"/>
+ <cd:constant type="base" default="yes"/>
+ </cd:parameter>
+ <cd:parameter name="tlig">
+ <cd:constant type="nu" default="yes"/>
+ <cd:constant type="da"/>
+ </cd:parameter>
+ <cd:parameter name="trep">
+ <cd:constant type="nu" default="yes"/>
+ <cd:constant type="da"/>
+ </cd:parameter>
+ <cd:parameter name="script">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="language">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="..tag.."> <!-- can't use &gt; here, \showsetup gives an error -->
+ <cd:constant type="nu" default="yes"/>
+ <cd:constant type="da"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="definefonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name" list="yes"/>
+ </cd:keywords>
+ <cd:assignments n="3">
+ <cd:parameter name="type">
+ <cd:constant type="suspendat" default="yes"/>
+ <cd:constant type="hz"/>
+ <cd:constant type="spatiere"/>
+ <cd:constant type="tag"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="factor">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="min">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="max">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ <cd:parameter name="pas">
+ <cd:constant type="cd:number"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfonthandling" file="hand-ini.mkii">
+ <cd:sequence>
+ <cd:string value="setupfonthandling"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definefonthandling" n="2"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definestesinonimfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="encoding">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="handling">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="mapping">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="setupfontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="setupfontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="2">
+ <cd:inherit name="definestesinonimfont" n="3"/>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="mapfontsize" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="mapfontsize"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:dimension"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+ <cd:command name="definedfont" file="font-ini.tex" category="fonts">
+ <cd:sequence>
+ <cd:string value="definedfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:inherit name="definestefont" n="2"/>
+ </cd:keywords>
+ </cd:arguments>
+ </cd:command>
+
+</cd:interface>
diff --git a/tex/context/interface/keys-cs.xml b/tex/context/interface/keys-cs.xml
new file mode 100644
index 000000000..93d81caa6
--- /dev/null
+++ b/tex/context/interface/keys-cs.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='cs' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language cs -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Pridavek'/>
+ <cd:variable name='Balloon' value='Bublinka'/>
+ <cd:variable name='Character' value='Pismeno'/>
+ <cd:variable name='Characters' value='Pismena'/>
+ <cd:variable name='CloseDocument' value='ZavritDokument'/>
+ <cd:variable name='ExitViewer' value='UkoncitProhlizec'/>
+ <cd:variable name='FirstPage' value='PrvniStrana'/>
+ <cd:variable name='FitHeight' value='FitHeight'/>
+ <cd:variable name='FitWidth' value='FitWidth'/>
+ <cd:variable name='GotoPage' value='JdiNaStranku'/>
+ <cd:variable name='Greek' value='Recky'/>
+ <cd:variable name='Help' value='Napoveda'/>
+ <cd:variable name='HideField' value='SkryjPole'/>
+ <cd:variable name='HideLayer' value='HideLayer'/>
+ <cd:variable name='Key' value='Klavesa'/>
+ <cd:variable name='LastPage' value='PosledniStrana'/>
+ <cd:variable name='LoadForm' value='NacistFormular'/>
+ <cd:variable name='MONTH' value='MESIC'/>
+ <cd:variable name='New' value='Novy'/>
+ <cd:variable name='NextJump' value='NasledujiciSkok'/>
+ <cd:variable name='NextPage' value='DalsiStrana'/>
+ <cd:variable name='Numbers' value='Cisla'/>
+ <cd:variable name='OpenNamedDocument' value='OpenNamedDocument'/>
+ <cd:variable name='Paragraph' value='Odstavec'/>
+ <cd:variable name='PauseMovie' value='PozastavitFilm'/>
+ <cd:variable name='PauseRendering' value='PauseRendering'/>
+ <cd:variable name='PauseSound' value='PozastavitZvuk'/>
+ <cd:variable name='PreviousJump' value='PredchoziSkok'/>
+ <cd:variable name='PreviousPage' value='PredchoziStrana'/>
+ <cd:variable name='PrintDocument' value='VytisknoutDokument'/>
+ <cd:variable name='Query' value='Query'/>
+ <cd:variable name='QueryAgain' value='QueryAgain'/>
+ <cd:variable name='ResetForm' value='ResetFormulare'/>
+ <cd:variable name='ResumeMovie' value='PokracovatFilm'/>
+ <cd:variable name='ResumeRendering' value='ResumeRendering'/>
+ <cd:variable name='ResumeSound' value='PokracovatZvuk'/>
+ <cd:variable name='Romannumerals' value='Rimskecislice'/>
+ <cd:variable name='SaveDocument' value='UlozitDokument'/>
+ <cd:variable name='SaveForm' value='UlozitFormular'/>
+ <cd:variable name='SaveNamedDocument' value='SaveNamedDocument'/>
+ <cd:variable name='SearchAgain' value='HledatZnovu'/>
+ <cd:variable name='SearchDocument' value='ProhledatDokument'/>
+ <cd:variable name='ShowBookmarks' value='UkazZalozky'/>
+ <cd:variable name='ShowField' value='UkazPole'/>
+ <cd:variable name='ShowThumbs' value='UkazNahledy'/>
+ <cd:variable name='StartMovie' value='SpustitFilm'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='StartZvuk'/>
+ <cd:variable name='StopMovie' value='ZastavitFilm'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='StopZvuk'/>
+ <cd:variable name='SubmitForm' value='PoslatFormular'/>
+ <cd:variable name='ToggleLayer' value='ToggleLayer'/>
+ <cd:variable name='ToggleViewer' value='ZmenitProhlizec'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='NapovedaProhlizece'/>
+ <cd:variable name='WEEKDAY' value='VSEDNIDEN'/>
+ <cd:variable name='WORD' value='SLOVO'/>
+ <cd:variable name='abbreviation' value='zkratka'/>
+ <cd:variable name='abbreviations' value='zkratky'/>
+ <cd:variable name='absolute' value='absolutni'/>
+ <cd:variable name='action' value='akce'/>
+ <cd:variable name='after' value='po'/>
+ <cd:variable name='all' value='vse'/>
+ <cd:variable name='always' value='vzdy'/>
+ <cd:variable name='answerarea' value='answerarea'/>
+ <cd:variable name='appendices' value='dodatky'/>
+ <cd:variable name='appendix' value='dodatek'/>
+ <cd:variable name='april' value='duben'/>
+ <cd:variable name='atmargin' value='naokraji'/>
+ <cd:variable name='atpage' value='nastrance'/>
+ <cd:variable name='august' value='srpen'/>
+ <cd:variable name='author' value='autor'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autouvod'/>
+ <cd:variable name='back' value='zpet'/>
+ <cd:variable name='background' value='pozadi'/>
+ <cd:variable name='backmatter' value='epilogy'/>
+ <cd:variable name='backpart' value='epilog'/>
+ <cd:variable name='backspace' value='zpetnamezera'/>
+ <cd:variable name='backward' value='zpet'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='pred'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='velke'/>
+ <cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigpreference' value='vysokapriorita'/>
+ <cd:variable name='blank' value='prazdny'/>
+ <cd:variable name='blockquote' value='blockquote'/>
+ <cd:variable name='bodymatter' value='hlavnicasti'/>
+ <cd:variable name='bodypart' value='hlavnicast'/>
+ <cd:variable name='bold' value='tucne'/>
+ <cd:variable name='bolditalic' value='tucnekurzivni'/>
+ <cd:variable name='boldslanted' value='tucnesklonene'/>
+ <cd:variable name='bookmark' value='zalozka'/>
+ <cd:variable name='both' value='obe'/>
+ <cd:variable name='bottom' value='spodek'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='siroky'/>
+ <cd:variable name='buffer' value='buffer'/>
+ <cd:variable name='by' value='skrz'/>
+ <cd:variable name='calligraphic' value='kaligraficke'/>
+ <cd:variable name='cap' value='kap'/>
+ <cd:variable name='capital' value='kapitalky'/>
+ <cd:variable name='center' value='center'/>
+ <cd:variable name='chapter' value='kapitola'/>
+ <cd:variable name='character' value='pismeno'/>
+ <cd:variable name='characters' value='pismena'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='barevne'/>
+ <cd:variable name='column' value='column'/>
+ <cd:variable name='columns' value='sloupce'/>
+ <cd:variable name='command' value='prikaz'/>
+ <cd:variable name='commands' value='prikazy'/>
+ <cd:variable name='comment' value='komentar'/>
+ <cd:variable name='component' value='komponenta'/>
+ <cd:variable name='concept' value='koncept'/>
+ <cd:variable name='content' value='obsah'/>
+ <cd:variable name='contents' value='obsah'/>
+ <cd:variable name='continue' value='pokracovat'/>
+ <cd:variable name='controls' value='controls'/>
+ <cd:variable name='conversion' value='konverze'/>
+ <cd:variable name='current' value='aktualni'/>
+ <cd:variable name='cutspace' value='cutspace'/>
+ <cd:variable name='date' value='datum'/>
+ <cd:variable name='day' value='den'/>
+ <cd:variable name='december' value='prosinec'/>
+ <cd:variable name='default' value='implicitni'/>
+ <cd:variable name='depth' value='podlehloubky'/>
+ <cd:variable name='description' value='popis'/>
+ <cd:variable name='disable' value='zablokovat'/>
+ <cd:variable name='display' value='obrazovka'/>
+ <cd:variable name='dot' value='tecka'/>
+ <cd:variable name='doublesided' value='dvoustranny'/>
+ <cd:variable name='down' value='down'/>
+ <cd:variable name='each' value='kazdy'/>
+ <cd:variable name='edge' value='hrana'/>
+ <cd:variable name='empty' value='prazdne'/>
+ <cd:variable name='end' value='end'/>
+ <cd:variable name='endnote' value='endnote'/>
+ <cd:variable name='enumeration' value='vycet'/>
+ <cd:variable name='environment' value='prostredi'/>
+ <cd:variable name='even' value='sude'/>
+ <cd:variable name='external' value='externi'/>
+ <cd:variable name='fact' value='fakt'/>
+ <cd:variable name='february' value='unor'/>
+ <cd:variable name='figure' value='obrazek'/>
+ <cd:variable name='figures' value='obrazky'/>
+ <cd:variable name='file' value='soubor'/>
+ <cd:variable name='final' value='finalni'/>
+ <cd:variable name='first' value='prvni'/>
+ <cd:variable name='firstcolumn' value='firstcolumn'/>
+ <cd:variable name='firstpage' value='prvnistranka'/>
+ <cd:variable name='firstsubpage' value='prvnipodstranka'/>
+ <cd:variable name='fit' value='prizpusobive'/>
+ <cd:variable name='five' value='pet'/>
+ <cd:variable name='fix' value='fixuj'/>
+ <cd:variable name='fixed' value='fixne'/>
+ <cd:variable name='flexible' value='prizpusobive'/>
+ <cd:variable name='float' value='plvouciobjekt'/>
+ <cd:variable name='flushinner' value='flushinner'/>
+ <cd:variable name='flushleft' value='flushleft'/>
+ <cd:variable name='flushouter' value='flushouter'/>
+ <cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='footer' value='upati'/>
+ <cd:variable name='footnote' value='poznamkapodcarou'/>
+ <cd:variable name='force' value='sila'/>
+ <cd:variable name='foreground' value='popredi'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='rovnice'/>
+ <cd:variable name='formulae' value='rovnice'/>
+ <cd:variable name='forward' value='vpred'/>
+ <cd:variable name='four' value='ctyri'/>
+ <cd:variable name='frame' value='ramecek'/>
+ <cd:variable name='framedtext' value='oramovanytext'/>
+ <cd:variable name='friday' value='patek'/>
+ <cd:variable name='frontmatter' value='prednicasti'/>
+ <cd:variable name='frontpart' value='prednicast'/>
+ <cd:variable name='global' value='globalne'/>
+ <cd:variable name='graphic' value='graf'/>
+ <cd:variable name='graphics' value='grafy'/>
+ <cd:variable name='gray' value='seda'/>
+ <cd:variable name='greek' value='recky'/>
+ <cd:variable name='grid' value='mrizka'/>
+ <cd:variable name='halfline' value='pulradku'/>
+ <cd:variable name='handwritten' value='rukopisne'/>
+ <cd:variable name='hang' value='zaveseni'/>
+ <cd:variable name='hanging' value='visici'/>
+ <cd:variable name='head' value='hlavicka'/>
+ <cd:variable name='header' value='zahlavi'/>
+ <cd:variable name='height' value='vyska'/>
+ <cd:variable name='helptext' value='textnapovedy'/>
+ <cd:variable name='hencefore' value='vyse'/>
+ <cd:variable name='here' value='zde'/>
+ <cd:variable name='hereafter' value='nize'/>
+ <cd:variable name='hidden' value='skryte'/>
+ <cd:variable name='hiding' value='skryt'/>
+ <cd:variable name='high' value='vysoko'/>
+ <cd:variable name='horizontal' value='horizontalne'/>
+ <cd:variable name='hyphenated' value='hyphenated'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='mezi'/>
+ <cd:variable name='index' value='rejstrik'/>
+ <cd:variable name='indices' value='rejstriky'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='inherit'/>
+ <cd:variable name='inleft' value='vlevo'/>
+ <cd:variable name='inmargin' value='naokraji'/>
+ <cd:variable name='inner' value='uvnitr'/>
+ <cd:variable name='inneredge' value='inneredge'/>
+ <cd:variable name='innermargin' value='innermargin'/>
+ <cd:variable name='inright' value='vpravo'/>
+ <cd:variable name='interaction' value='interakce'/>
+ <cd:variable name='interactionmenu' value='interaktivnimenu'/>
+ <cd:variable name='intermezzi' value='intermezzi'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='dotextu'/>
+ <cd:variable name='intro' value='uvod'/>
+ <cd:variable name='italic' value='kurziva'/>
+ <cd:variable name='italicbold' value='kurzivnitucne'/>
+ <cd:variable name='item' value='polozka'/>
+ <cd:variable name='itemize' value='vycet'/>
+ <cd:variable name='its' value='pol'/>
+ <cd:variable name='january' value='leden'/>
+ <cd:variable name='joinedup' value='spojeno'/>
+ <cd:variable name='july' value='cervenec'/>
+ <cd:variable name='june' value='cerven'/>
+ <cd:variable name='keep' value='drzet'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='popisek'/>
+ <cd:variable name='landscape' value='nasirku'/>
+ <cd:variable name='last' value='posledni'/>
+ <cd:variable name='lastcolumn' value='lastcolumn'/>
+ <cd:variable name='lastpage' value='poslednistrana'/>
+ <cd:variable name='lastpagenumber' value='lastpagenumber'/>
+ <cd:variable name='lastsubpage' value='poslaednipodstranka'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='vlevo'/>
+ <cd:variable name='leftedge' value='levahrana'/>
+ <cd:variable name='lefthanging' value='lefthanging'/>
+ <cd:variable name='leftmargin' value='levyokraj'/>
+ <cd:variable name='leftpage' value='levastranka'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='legenda'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='radek'/>
+ <cd:variable name='linenote' value='linenote'/>
+ <cd:variable name='lines' value='radky'/>
+ <cd:variable name='list' value='seznam'/>
+ <cd:variable name='local' value='lokalne'/>
+ <cd:variable name='localenvironment' value='lokalnihoprostredi'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='loga'/>
+ <cd:variable name='lohi' value='nivy'/>
+ <cd:variable name='loose' value='uvolnene'/>
+ <cd:variable name='low' value='nizko'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='zlom'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='brezen'/>
+ <cd:variable name='margin' value='marginalie'/>
+ <cd:variable name='marginedge' value='textovahrana'/>
+ <cd:variable name='margintitle' value='titulmarginalie'/>
+ <cd:variable name='marking' value='znaceni'/>
+ <cd:variable name='mathalignment' value='mathalignment'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='mathmatrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='kveten'/>
+ <cd:variable name='mediaeval' value='stredoveky'/>
+ <cd:variable name='medium' value='stredni'/>
+ <cd:variable name='middle' value='nastred'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='minvyska'/>
+ <cd:variable name='minwidth' value='minsirka'/>
+ <cd:variable name='mirrored' value='zrcadleno'/>
+ <cd:variable name='monday' value='pondeli'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='mesic'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='jmeno'/>
+ <cd:variable name='narrow' value='uzky'/>
+ <cd:variable name='negative' value='negativ'/>
+ <cd:variable name='never' value='nikdy'/>
+ <cd:variable name='new' value='novy'/>
+ <cd:variable name='next' value='dalsi'/>
+ <cd:variable name='nextevenpage' value='dalsisudastranka'/>
+ <cd:variable name='nextoddpage' value='dalsilichastranka'/>
+ <cd:variable name='nextpage' value='dalsistranka'/>
+ <cd:variable name='nextsubpage' value='dalsipodstranka'/>
+ <cd:variable name='no' value='ne'/>
+ <cd:variable name='nocheck' value='nocheck'/>
+ <cd:variable name='nofit' value='nofit'/>
+ <cd:variable name='nogrid' value='nogrid'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='zadneznaceni'/>
+ <cd:variable name='none' value='zadny'/>
+ <cd:variable name='nonumber' value='nonumber'/>
+ <cd:variable name='normal' value='normalni'/>
+ <cd:variable name='nospacing' value='nospacing'/>
+ <cd:variable name='not' value='ne'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='nothanging'/>
+ <cd:variable name='nothyphenated' value='nothyphenated'/>
+ <cd:variable name='november' value='listopad'/>
+ <cd:variable name='nowhere' value='nikde'/>
+ <cd:variable name='nowhite' value='zadnabila'/>
+ <cd:variable name='number' value='cislo'/>
+ <cd:variable name='numbers' value='cisla'/>
+ <cd:variable name='october' value='rijen'/>
+ <cd:variable name='odd' value='liche'/>
+ <cd:variable name='off' value='vyp'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='old'/>
+ <cd:variable name='on' value='zap'/>
+ <cd:variable name='one' value='jedna'/>
+ <cd:variable name='opposite' value='naproti'/>
+ <cd:variable name='outer' value='vnejsi'/>
+ <cd:variable name='outeredge' value='outeredge'/>
+ <cd:variable name='outermargin' value='outermargin'/>
+ <cd:variable name='overbar' value='nadtrzeno'/>
+ <cd:variable name='overbars' value='nadtrzeni'/>
+ <cd:variable name='overlay' value='prekryv'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='preskrtnuto'/>
+ <cd:variable name='overstrikes' value='preskrtnuti'/>
+ <cd:variable name='packed' value='zhustene'/>
+ <cd:variable name='page' value='stranka'/>
+ <cd:variable name='pagecomment' value='komentarstranky'/>
+ <cd:variable name='pagenumber' value='cislostranky'/>
+ <cd:variable name='paper' value='papir'/>
+ <cd:variable name='paragraph' value='odstavec'/>
+ <cd:variable name='part' value='cast'/>
+ <cd:variable name='positive' value='positiv'/>
+ <cd:variable name='postponing' value='odlozit'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='nastaveni'/>
+ <cd:variable name='preview' value='nahled'/>
+ <cd:variable name='previous' value='predchozi'/>
+ <cd:variable name='previousevenpage' value='predchozisudastranka'/>
+ <cd:variable name='previousoddpage' value='predchozilichastranka'/>
+ <cd:variable name='previouspage' value='predchozistranka'/>
+ <cd:variable name='previoussubpage' value='predchozipodstranka'/>
+ <cd:variable name='printable' value='tisknutelne'/>
+ <cd:variable name='process' value='process'/>
+ <cd:variable name='product' value='produkt'/>
+ <cd:variable name='program' value='program'/>
+ <cd:variable name='project' value='projekt'/>
+ <cd:variable name='protected' value='chranene'/>
+ <cd:variable name='quadruple' value='ctyrnasobny'/>
+ <cd:variable name='quotation' value='citace'/>
+ <cd:variable name='quote' value='citovat'/>
+ <cd:variable name='ran' value='rozsah'/>
+ <cd:variable name='random' value='nahodny'/>
+ <cd:variable name='readonly' value='pouzeprocteni'/>
+ <cd:variable name='rectangular' value='pravouhly'/>
+ <cd:variable name='referral' value='znacka'/>
+ <cd:variable name='register' value='rejstrik'/>
+ <cd:variable name='regular' value='pravidelne'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relativni'/>
+ <cd:variable name='repeat' value='opakovat'/>
+ <cd:variable name='required' value='pozadovane'/>
+ <cd:variable name='reset' value='reset'/>
+ <cd:variable name='reverse' value='reverse'/>
+ <cd:variable name='right' value='vpravo'/>
+ <cd:variable name='rightedge' value='pravahrana'/>
+ <cd:variable name='righthanging' value='righthanging'/>
+ <cd:variable name='rightmargin' value='pravyokraj'/>
+ <cd:variable name='rightpage' value='pravastranka'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='antikva'/>
+ <cd:variable name='romannumerals' value='rimskecislice'/>
+ <cd:variable name='rotate' value='otoc'/>
+ <cd:variable name='rotated' value='otoceno'/>
+ <cd:variable name='round' value='zaobleny'/>
+ <cd:variable name='row' value='row'/>
+ <cd:variable name='rule' value='linka'/>
+ <cd:variable name='samepage' value='stejnastranka'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sanstucne'/>
+ <cd:variable name='sansserif' value='bezserifu'/>
+ <cd:variable name='saturday' value='sobota'/>
+ <cd:variable name='screen' value='rastr'/>
+ <cd:variable name='section' value='sekce'/>
+ <cd:variable name='sectionblockenvironment' value='sectionblockenvironment'/>
+ <cd:variable name='sectionnumber' value='cislooddilu'/>
+ <cd:variable name='see' value='viz'/>
+ <cd:variable name='september' value='zari'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='semknuto'/>
+ <cd:variable name='setups' value='einstellungen'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='short' value='short'/>
+ <cd:variable name='singlesided' value='jednostranne'/>
+ <cd:variable name='slanted' value='sklonene'/>
+ <cd:variable name='slantedbold' value='sklonenetucne'/>
+ <cd:variable name='small' value='male'/>
+ <cd:variable name='smallbodyfont' value='smallbodyfont'/>
+ <cd:variable name='smallbold' value='maletucne'/>
+ <cd:variable name='smallbolditalic' value='maletucnekurzivni'/>
+ <cd:variable name='smallboldslanted' value='maletucnesklonene'/>
+ <cd:variable name='smallcaps' value='kapitalky'/>
+ <cd:variable name='smallitalic' value='malekurzivni'/>
+ <cd:variable name='smallitalicbold' value='malekurzivnitucne'/>
+ <cd:variable name='smallnormal' value='malenormalni'/>
+ <cd:variable name='smallslanted' value='malesklonene'/>
+ <cd:variable name='smallslantedbold' value='malesklonenetucne'/>
+ <cd:variable name='smalltype' value='maletype'/>
+ <cd:variable name='somewhere' value='nekde'/>
+ <cd:variable name='sorted' value='tridene'/>
+ <cd:variable name='space' value='mezera'/>
+ <cd:variable name='spacing' value='mezerovani'/>
+ <cd:variable name='speech' value='speech'/>
+ <cd:variable name='split' value='split'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standardni'/>
+ <cd:variable name='start' value='start'/>
+ <cd:variable name='starter' value='starter'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='stop'/>
+ <cd:variable name='stopper' value='predel'/>
+ <cd:variable name='stretch' value='natahnout'/>
+ <cd:variable name='strict' value='striktni'/>
+ <cd:variable name='strong' value='strong'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='pod'/>
+ <cd:variable name='subbackward' value='podzpet'/>
+ <cd:variable name='subformula' value='subrovnice'/>
+ <cd:variable name='subforward' value='podvpred'/>
+ <cd:variable name='subject' value='tema'/>
+ <cd:variable name='subpage' value='podstranka'/>
+ <cd:variable name='subsection' value='podsekce'/>
+ <cd:variable name='subsubject' value='podtema'/>
+ <cd:variable name='subsubsection' value='podpodsekce'/>
+ <cd:variable name='subsubsubject' value='podpodtema'/>
+ <cd:variable name='subsubsubsection' value='podpodpodsekce'/>
+ <cd:variable name='subsubsubsubject' value='podpodpodtema'/>
+ <cd:variable name='subsubsubsubsection' value='podpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubject' value='podpodpodpodtema'/>
+ <cd:variable name='subsubsubsubsubsection' value='podpodpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubsubject' value='podpodpodpodpodtema'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='podpodpodpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='podpodpodpodpodpodtema'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='podpodpodpodpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='podpodpodpodpodpodpodtema'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='podpodpodpodpodpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='podpodpodpodpodpodpodpodtema'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='podpodpodpodpodpodpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='podpodpodpodpodpodpodpodpodtema'/>
+ <cd:variable name='sunday' value='nedele'/>
+ <cd:variable name='support' value='podpora'/>
+ <cd:variable name='sym' value='sym'/>
+ <cd:variable name='symbol' value='symbol'/>
+ <cd:variable name='synchronize' value='synchronize'/>
+ <cd:variable name='system' value='system'/>
+ <cd:variable name='table' value='tabulka'/>
+ <cd:variable name='tablehead' value='zahlavitabulky'/>
+ <cd:variable name='tables' value='tabulky'/>
+ <cd:variable name='tabletail' value='konectabulky'/>
+ <cd:variable name='tabulate' value='tabelator'/>
+ <cd:variable name='tabulatehead' value='tabulatehead'/>
+ <cd:variable name='tabulatetail' value='tabulatetail'/>
+ <cd:variable name='tall' value='vysoko'/>
+ <cd:variable name='teletype' value='strojopis'/>
+ <cd:variable name='temporary' value='docasne'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='text'/>
+ <cd:variable name='three' value='tri'/>
+ <cd:variable name='thursday' value='ctvrtek'/>
+ <cd:variable name='title' value='titul'/>
+ <cd:variable name='toggle' value='toggle'/>
+ <cd:variable name='tolerant' value='tolerantni'/>
+ <cd:variable name='top' value='vrsek'/>
+ <cd:variable name='tuesday' value='utery'/>
+ <cd:variable name='two' value='dve'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='opis'/>
+ <cd:variable name='typing' value='typing'/>
+ <cd:variable name='unavailable' value='nedostupne'/>
+ <cd:variable name='underbar' value='podtrzeno'/>
+ <cd:variable name='underbars' value='podtrzeni'/>
+ <cd:variable name='unit' value='jednotka'/>
+ <cd:variable name='units' value='jednotky'/>
+ <cd:variable name='unknown' value='neznamy'/>
+ <cd:variable name='unpacked' value='rozbalene'/>
+ <cd:variable name='up' value='up'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='uzito'/>
+ <cd:variable name='value' value='hodnota'/>
+ <cd:variable name='vertical' value='vertikalne'/>
+ <cd:variable name='very' value='velmi'/>
+ <cd:variable name='verystrict' value='velmistriktni'/>
+ <cd:variable name='verytolerant' value='velmitolerantni'/>
+ <cd:variable name='weak' value='weak'/>
+ <cd:variable name='wednesday' value='streda'/>
+ <cd:variable name='week' value='tyden'/>
+ <cd:variable name='weekday' value='vsedniden'/>
+ <cd:variable name='white' value='bily'/>
+ <cd:variable name='wide' value='siroce'/>
+ <cd:variable name='width' value='sirka'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='rok'/>
+ <cd:variable name='yes' value='ano'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language cs -->
+
+ <cd:constants>
+ <cd:constant name='action' value='akce'/>
+ <cd:constant name='address' value='adresa'/>
+ <cd:constant name='after' value='po'/>
+ <cd:constant name='afterhead' value='pohlavicce'/>
+ <cd:constant name='afterkey' value='klavesapo'/>
+ <cd:constant name='align' value='zarovnani'/>
+ <cd:constant name='aligncharacter' value='aligncharacter'/>
+ <cd:constant name='alignmentcharacter' value='alignmentcharacter'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='zarovnejtitul'/>
+ <cd:constant name='alternative' value='alternativa'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='sipka'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='u'/>
+ <cd:constant name='author' value='autor'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autoostreni'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autosirka'/>
+ <cd:constant name='axis' value='osa'/>
+ <cd:constant name='background' value='pozadi'/>
+ <cd:constant name='backgroundcolor' value='barvapozadi'/>
+ <cd:constant name='backgroundcorner' value='rohpozadi'/>
+ <cd:constant name='backgrounddepth' value='hloubkapozadi'/>
+ <cd:constant name='backgroundoffset' value='offsetpozadi'/>
+ <cd:constant name='backgroundradius' value='polomerpozadi'/>
+ <cd:constant name='backgroundscreen' value='rastrpozadi'/>
+ <cd:constant name='backspace' value='zpetnamezera'/>
+ <cd:constant name='balance' value='rovnovaha'/>
+ <cd:constant name='before' value='pred'/>
+ <cd:constant name='beforehead' value='predhlavickou'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='velky'/>
+ <cd:constant name='blank' value='prazdny'/>
+ <cd:constant name='blockway' value='dobloku'/>
+ <cd:constant name='bodyfont' value='zakladnifont'/>
+ <cd:constant name='bookmark' value='zalozka'/>
+ <cd:constant name='bottom' value='spodek'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='vzdalenostspodku'/>
+ <cd:constant name='bottomframe' value='ramecekdole'/>
+ <cd:constant name='bottomoffset' value='offsetspodku'/>
+ <cd:constant name='bottomspace' value='bottomspace'/>
+ <cd:constant name='bottomstate' value='statusspodku'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='pocitat'/>
+ <cd:constant name='ccommand' value='cprikaz'/>
+ <cd:constant name='click' value='klik'/>
+ <cd:constant name='clickin' value='klikuvnitr'/>
+ <cd:constant name='clickout' value='klikvne'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='zavriakci'/>
+ <cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepageaction' value='akcezavrenistranky'/>
+ <cd:constant name='closesymbol' value='closesymbol'/>
+ <cd:constant name='color' value='barva'/>
+ <cd:constant name='column' value='sloupec'/>
+ <cd:constant name='columndistance' value='vzdalenostsloupcu'/>
+ <cd:constant name='columns' value='sloupce'/>
+ <cd:constant name='command' value='prikaz'/>
+ <cd:constant name='commandafter' value='prikazpo'/>
+ <cd:constant name='commandbefore' value='predchoziprikaz'/>
+ <cd:constant name='commands' value='prikazy'/>
+ <cd:constant name='component' value='component'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='compress'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='pokracovat'/>
+ <cd:constant name='contrastcolor' value='kontrastnibarva'/>
+ <cd:constant name='controls' value='controls'/>
+ <cd:constant name='conversion' value='konverze'/>
+ <cd:constant name='convertfile' value='konverzesouboru'/>
+ <cd:constant name='corner' value='roh'/>
+ <cd:constant name='coupling' value='propojeni'/>
+ <cd:constant name='couplingway' value='zpusobpropojeni'/>
+ <cd:constant name='criterium' value='kriterium'/>
+ <cd:constant name='current' value='aktualni'/>
+ <cd:constant name='cutspace' value='cutspace'/>
+ <cd:constant name='dash' value='pomlcka'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='datum'/>
+ <cd:constant name='deepnumbercommand' value='deepnumbercommand'/>
+ <cd:constant name='deeptextcommand' value='deeptextcommand'/>
+ <cd:constant name='default' value='implicitni'/>
+ <cd:constant name='delay' value='prodleva'/>
+ <cd:constant name='depth' value='hloubka'/>
+ <cd:constant name='depthcorrection' value='korekcehloubky'/>
+ <cd:constant name='direction' value='smer'/>
+ <cd:constant name='directory' value='adresar'/>
+ <cd:constant name='display' value='obrazovka'/>
+ <cd:constant name='distance' value='vzdalenost'/>
+ <cd:constant name='dot' value='tecka'/>
+ <cd:constant name='doublesided' value='oboustranne'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='hrana'/>
+ <cd:constant name='edgedistance' value='vzdalenosthrany'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='prazdne'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='sudamarginalie'/>
+ <cd:constant name='expansion' value='expanzen'/>
+ <cd:constant name='export' value='export'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='faktor'/>
+ <cd:constant name='fallback' value='fallback'/>
+ <cd:constant name='family' value='rodina'/>
+ <cd:constant name='fieldbackgroundcolor' value='barvapozadipole'/>
+ <cd:constant name='fieldframecolor' value='barvarameckupole'/>
+ <cd:constant name='fieldlayer' value='fieldlayer'/>
+ <cd:constant name='fieldoffset' value='offsetpole'/>
+ <cd:constant name='file' value='soubor'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='zaostreni'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusout'/>
+ <cd:constant name='footer' value='upati'/>
+ <cd:constant name='footerdistance' value='vzdalenostupati'/>
+ <cd:constant name='footerstate' value='statusupati'/>
+ <cd:constant name='foregroundcolor' value='foregroundcolor'/>
+ <cd:constant name='foregroundstyle' value='foregroundstyle'/>
+ <cd:constant name='format' value='formatovat'/>
+ <cd:constant name='frame' value='ramecek'/>
+ <cd:constant name='framecolor' value='barvaramecku'/>
+ <cd:constant name='framecorner' value='rohramecku'/>
+ <cd:constant name='framedepth' value='hloubkaramecku'/>
+ <cd:constant name='frameoffset' value='offsetramecku'/>
+ <cd:constant name='frameradius' value='polomerramecku'/>
+ <cd:constant name='frames' value='ramecky'/>
+ <cd:constant name='from' value='z'/>
+ <cd:constant name='get' value='ziskat'/>
+ <cd:constant name='global' value='globalne'/>
+ <cd:constant name='grid' value='mrizka'/>
+ <cd:constant name='hang' value='zaveseni'/>
+ <cd:constant name='headalign' value='headalign'/>
+ <cd:constant name='headcolor' value='barvahlavicky'/>
+ <cd:constant name='headcommand' value='headcommand'/>
+ <cd:constant name='headconversion' value='konverzehlavicky'/>
+ <cd:constant name='header' value='zahlavi'/>
+ <cd:constant name='headerdistance' value='vzdalenostzahlavi'/>
+ <cd:constant name='headerstate' value='statuszahlavi'/>
+ <cd:constant name='headlabel' value='popisekhlavicky'/>
+ <cd:constant name='headnumber' value='cislonadpisu'/>
+ <cd:constant name='headstyle' value='stylhlavicky'/>
+ <cd:constant name='height' value='vyska'/>
+ <cd:constant name='hfactor' value='vfaktor'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horoffset' value='horoffset'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='iprikaz'/>
+ <cd:constant name='in' value='v'/>
+ <cd:constant name='inbetween' value='mezi'/>
+ <cd:constant name='increment' value='zvysit'/>
+ <cd:constant name='incrementnumber' value='zvysujicicislo'/>
+ <cd:constant name='indenting' value='odsazovani'/>
+ <cd:constant name='indentnext' value='odsadpristi'/>
+ <cd:constant name='indicator' value='indikator'/>
+ <cd:constant name='inner' value='vnitrni'/>
+ <cd:constant name='innermargin' value='innermargin'/>
+ <cd:constant name='inputfile' value='inputfile'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='interakce'/>
+ <cd:constant name='interlinespace' value='meziradkovamezera'/>
+ <cd:constant name='itemalign' value='itemalign'/>
+ <cd:constant name='items' value='polozky'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keyword' value='keyword'/>
+ <cd:constant name='label' value='popisek'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='vlevo'/>
+ <cd:constant name='leftcolor' value='barvavlevo'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='levahrana'/>
+ <cd:constant name='leftedgedistance' value='vzdalenostlevehrany'/>
+ <cd:constant name='leftframe' value='ramecekvlevo'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='levyokraj'/>
+ <cd:constant name='leftmargindistance' value='vzdalenostlevehookraje'/>
+ <cd:constant name='leftoffset' value='levyoffset'/>
+ <cd:constant name='leftquotation' value='citacevlevo'/>
+ <cd:constant name='leftquote' value='citovatvlevo'/>
+ <cd:constant name='leftsentence' value='vetavlevo'/>
+ <cd:constant name='leftspeech' value='leftspeech'/>
+ <cd:constant name='leftstyle' value='stylvlevo'/>
+ <cd:constant name='leftsubsentence' value='podvetavlevo'/>
+ <cd:constant name='lefttext' value='textvlevo'/>
+ <cd:constant name='leftwidth' value='sirkavlevo'/>
+ <cd:constant name='level' value='uroven'/>
+ <cd:constant name='levels' value='urovne'/>
+ <cd:constant name='limittext' value='limittext'/>
+ <cd:constant name='line' value='radek'/>
+ <cd:constant name='linecorrection' value='korekceradku'/>
+ <cd:constant name='lines' value='radky'/>
+ <cd:constant name='list' value='seznam'/>
+ <cd:constant name='listtext' value='listtext'/>
+ <cd:constant name='local' value='lokalne'/>
+ <cd:constant name='location' value='misto'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='loga'/>
+ <cd:constant name='marcolor' value='barvaznacky'/>
+ <cd:constant name='margin' value='marginalie'/>
+ <cd:constant name='margindistance' value='vzdalenostokraje'/>
+ <cd:constant name='marginedge' value='textovahrana'/>
+ <cd:constant name='marginedgetext' value='textmarginalnihookraje'/>
+ <cd:constant name='margintext' value='textmarginalie'/>
+ <cd:constant name='marking' value='znaceni'/>
+ <cd:constant name='marstyle' value='stylsnacky'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='maxvyska'/>
+ <cd:constant name='maxwidth' value='maxsirka'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='menu'/>
+ <cd:constant name='method' value='metoda'/>
+ <cd:constant name='middle' value='stredni'/>
+ <cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middletext' value='strednitext'/>
+ <cd:constant name='midsentence' value='midsentence'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='mindepth'/>
+ <cd:constant name='minheight' value='minvyska'/>
+ <cd:constant name='minwidth' value='minsirka'/>
+ <cd:constant name='monthconversion' value='monthconversion'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='jmeno'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='nspodek'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='dalsi'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nvlevo'/>
+ <cd:constant name='nlines' value='nradky'/>
+ <cd:constant name='norm' value='norm'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='nvpravo'/>
+ <cd:constant name='ntop' value='nvrsek'/>
+ <cd:constant name='number' value='cislo'/>
+ <cd:constant name='numbercolor' value='barvacisla'/>
+ <cd:constant name='numbercommand' value='ciselnyprikaz'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='numberdistance'/>
+ <cd:constant name='numbering' value='cislovani'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='oddelovaccisla'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='stylcisla'/>
+ <cd:constant name='numberwidth' value='numberwidth'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='objekt'/>
+ <cd:constant name='obstruction' value='prekazka'/>
+ <cd:constant name='oddmargin' value='lichyokraj'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='otevriakci'/>
+ <cd:constant name='openpageaction' value='akceotevrenistranky'/>
+ <cd:constant name='option' value='volba'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='orientation'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='outermargin'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='vlastnicislo'/>
+ <cd:constant name='page' value='stranka'/>
+ <cd:constant name='pageboundaries' value='hranicestranky'/>
+ <cd:constant name='pagecolor' value='barvastranky'/>
+ <cd:constant name='pagecommand' value='strankovyprikaz'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='cislostranky'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='pagestate'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='stylstranky'/>
+ <cd:constant name='palet' value='paleta'/>
+ <cd:constant name='paper' value='papir'/>
+ <cd:constant name='paragraph' value='odstavec'/>
+ <cd:constant name='place' value='umistit'/>
+ <cd:constant name='placehead' value='umistihlavicku'/>
+ <cd:constant name='placestopper' value='predelmista'/>
+ <cd:constant name='position' value='position'/>
+ <cd:constant name='prefix' value='prefix'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='prednastaveni'/>
+ <cd:constant name='preview' value='nahled'/>
+ <cd:constant name='previous' value='predchozi'/>
+ <cd:constant name='previousnumber' value='predchozicislo'/>
+ <cd:constant name='process' value='process'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='polomer'/>
+ <cd:constant name='random' value='nahodne'/>
+ <cd:constant name='range' value='range'/>
+ <cd:constant name='reduction' value='redukce'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='odkaz'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='odkazujici'/>
+ <cd:constant name='regionin' value='oblastuvnitr'/>
+ <cd:constant name='regionout' value='oblastvne'/>
+ <cd:constant name='repeat' value='opakovat'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='resetnumber'/>
+ <cd:constant name='resolution' value='rozliseni'/>
+ <cd:constant name='right' value='vpravo'/>
+ <cd:constant name='rightcolor' value='barvavpravo'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='pravahrana'/>
+ <cd:constant name='rightedgedistance' value='vzdalenostpravehrany'/>
+ <cd:constant name='rightframe' value='ramecekvpravo'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='pravyokraj'/>
+ <cd:constant name='rightmargindistance' value='vzdalenostpravehookraje'/>
+ <cd:constant name='rightoffset' value='pravyoffset'/>
+ <cd:constant name='rightquotation' value='citacevpravo'/>
+ <cd:constant name='rightquote' value='citovatvpravo'/>
+ <cd:constant name='rightsentence' value='vetavpravo'/>
+ <cd:constant name='rightspeech' value='rightspeech'/>
+ <cd:constant name='rightstyle' value='stylvpravo'/>
+ <cd:constant name='rightsubsentence' value='podvetavpravo'/>
+ <cd:constant name='righttext' value='textvpravo'/>
+ <cd:constant name='rightwidth' value='sirkavpravo'/>
+ <cd:constant name='rotation' value='rotace'/>
+ <cd:constant name='rule' value='linka'/>
+ <cd:constant name='rulecolor' value='barvalinky'/>
+ <cd:constant name='rulethickness' value='tloustkalinky'/>
+ <cd:constant name='samepage' value='stejnastranka'/>
+ <cd:constant name='sample' value='vzor'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='meritko'/>
+ <cd:constant name='scope' value='rozsah'/>
+ <cd:constant name='screen' value='rastr'/>
+ <cd:constant name='section' value='oddil'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='cislooddilu'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='oddelovac'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='setups'/>
+ <cd:constant name='side' value='pocitat'/>
+ <cd:constant name='sidealign' value='sidealign'/>
+ <cd:constant name='sidemethod' value='sidemethod'/>
+ <cd:constant name='sidespaceafter' value='bocnimezeraza'/>
+ <cd:constant name='sidespacebefore' value='bocnimezerapred'/>
+ <cd:constant name='sign' value='znak'/>
+ <cd:constant name='size' value='velikost'/>
+ <cd:constant name='small' value='male'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='sorttype'/>
+ <cd:constant name='source' value='zdroj'/>
+ <cd:constant name='space' value='mezera'/>
+ <cd:constant name='spaceafter' value='mezeraza'/>
+ <cd:constant name='spacebefore' value='mezerapred'/>
+ <cd:constant name='spaceinbetween' value='spaceinbetween'/>
+ <cd:constant name='spacing' value='mezerovani'/>
+ <cd:constant name='split' value='split'/>
+ <cd:constant name='splitcolor' value='splitcolor'/>
+ <cd:constant name='splitmethod' value='splitmethod'/>
+ <cd:constant name='splitoffset' value='splitoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stack'/>
+ <cd:constant name='start' value='start'/>
+ <cd:constant name='starter' value='starter'/>
+ <cd:constant name='state' value='status'/>
+ <cd:constant name='step' value='krok'/>
+ <cd:constant name='stop' value='stop'/>
+ <cd:constant name='stopper' value='predel'/>
+ <cd:constant name='stretch' value='natahnout'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='pismeno'/>
+ <cd:constant name='sub' value='pod'/>
+ <cd:constant name='subtitle' value='podtitulek'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symzarovnani'/>
+ <cd:constant name='symbol' value='symbol'/>
+ <cd:constant name='symbolset' value='sadasymbolu'/>
+ <cd:constant name='symcolor' value='barvasymbolu'/>
+ <cd:constant name='symstyle' value='stylsymboly'/>
+ <cd:constant name='synonym' value='synonymum'/>
+ <cd:constant name='synonymcolor' value='barvasynonyma'/>
+ <cd:constant name='synonymcommand' value='synonymcommand'/>
+ <cd:constant name='synonymstyle' value='stylsynonyma'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='text'/>
+ <cd:constant name='textcolor' value='barvatextu'/>
+ <cd:constant name='textcommand' value='textovyprikaz'/>
+ <cd:constant name='textdistance' value='textdistance'/>
+ <cd:constant name='textlayer' value='textlayer'/>
+ <cd:constant name='textmargin' value='textmargin'/>
+ <cd:constant name='textmethod' value='textmethod'/>
+ <cd:constant name='textseparator' value='oddelovactextu'/>
+ <cd:constant name='textsize' value='velikosttextu'/>
+ <cd:constant name='textstate' value='statustextu'/>
+ <cd:constant name='textstyle' value='styltextu'/>
+ <cd:constant name='textwidth' value='sirkatextu'/>
+ <cd:constant name='title' value='titul'/>
+ <cd:constant name='titlecolor' value='barvatitulek'/>
+ <cd:constant name='titlecommand' value='titlecommand'/>
+ <cd:constant name='titledistance' value='vzdalenosttitulek'/>
+ <cd:constant name='titleleft' value='titleleft'/>
+ <cd:constant name='titleright' value='titleright'/>
+ <cd:constant name='titlestyle' value='styltitulek'/>
+ <cd:constant name='to' value='na'/>
+ <cd:constant name='tolerance' value='tolerance'/>
+ <cd:constant name='top' value='vrsek'/>
+ <cd:constant name='topdistance' value='vzdalenostvrsku'/>
+ <cd:constant name='topframe' value='rameceknahore'/>
+ <cd:constant name='topoffset' value='offsetvrsku'/>
+ <cd:constant name='topspace' value='svrchnimezera'/>
+ <cd:constant name='topstate' value='statusvrsku'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='typ'/>
+ <cd:constant name='unit' value='jednotka'/>
+ <cd:constant name='unknownreference' value='neznamyodkaz'/>
+ <cd:constant name='urlalternative' value='urlalternativa'/>
+ <cd:constant name='urlspace' value='prostorurl'/>
+ <cd:constant name='validate' value='validovat'/>
+ <cd:constant name='vcommand' value='vprikaz'/>
+ <cd:constant name='veroffset' value='offsethlavicky'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='zpusob'/>
+ <cd:constant name='wfactor' value='sfaktor'/>
+ <cd:constant name='white' value='bily'/>
+ <cd:constant name='width' value='sirka'/>
+ <cd:constant name='xfactor' value='xfaktor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xmeritko'/>
+ <cd:constant name='xstep' value='xkrok'/>
+ <cd:constant name='yfactor' value='yfaktor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='ymeritko'/>
+ <cd:constant name='ystep' value='ykrok'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language cs -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='answerlines'/>
+ <cd:element name='answerspace' value='answerspace'/>
+ <cd:element name='begin' value='zacatek'/>
+ <cd:element name='complete' value='uplny'/>
+ <cd:element name='coupled' value='propojene'/>
+ <cd:element name='currentlocal' value='aktualnelokalni'/>
+ <cd:element name='emptyone' value='leer'/>
+ <cd:element name='emptytwo' value='prazdne'/>
+ <cd:element name='end' value='konec'/>
+ <cd:element name='endsetup' value=''/>
+ <cd:element name='get' value='ziskat'/>
+ <cd:element name='increment' value='zvysit'/>
+ <cd:element name='list' value='seznam'/>
+ <cd:element name='listof' value='seznam'/>
+ <cd:element name='load' value='nacist'/>
+ <cd:element name='local' value='lokalne'/>
+ <cd:element name='makeup' value='zlom'/>
+ <cd:element name='next' value='dalsi'/>
+ <cd:element name='place' value='umisti'/>
+ <cd:element name='previous' value='predchozi'/>
+ <cd:element name='previouslocal' value='predchozilokalni'/>
+ <cd:element name='reserve' value='rezervovat'/>
+ <cd:element name='see' value='viz'/>
+ <cd:element name='setup' value='nastaveni'/>
+ <cd:element name='start' value='start'/>
+ <cd:element name='stop' value='stop'/>
+ <cd:element name='text' value='text'/>
+ <cd:element name='type' value='opis'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language cs -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='KAP'/>
+ <cd:command name='Character' value='Znak'/>
+ <cd:command name='Characters' value='Znaky'/>
+ <cd:command name='LABELTEXT' value='TEXTPOPISKU'/>
+ <cd:command name='MONTH' value='MESIC'/>
+ <cd:command name='Numbers' value='Cisla'/>
+ <cd:command name='Romannumerals' value='Rimskecislice'/>
+ <cd:command name='SmallCapped' value='Kap'/>
+ <cd:command name='SmallCaps' value='Kaps'/>
+ <cd:command name='WEEKDAY' value='VSEDNIDEN'/>
+ <cd:command name='WORD' value='SLOVO'/>
+ <cd:command name='WORDS' value='SLOVA'/>
+ <cd:command name='Word' value='Slovo'/>
+ <cd:command name='Words' value='Slova'/>
+ <cd:command name='about' value='oref'/>
+ <cd:command name='adaptlayout' value='prizpusobvzhled'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='pref'/>
+ <cd:command name='atleftmargin' value='atleftmargin'/>
+ <cd:command name='atpage' value='nastrane'/>
+ <cd:command name='atrightmargin' value='atrightmargin'/>
+ <cd:command name='background' value='pozadi'/>
+ <cd:command name='backspace' value='odsazenizleva'/>
+ <cd:command name='blackrule' value='cernalinka'/>
+ <cd:command name='blackrules' value='cernelinky'/>
+ <cd:command name='blank' value='preskoc'/>
+ <cd:command name='bookmark' value='zalozka'/>
+ <cd:command name='bottomdistance' value='vzdalenostspodku'/>
+ <cd:command name='bottomheight' value='vyskaspodku'/>
+ <cd:command name='bottomspace' value='bottomspace'/>
+ <cd:command name='but' value='spodek'/>
+ <cd:command name='button' value='tlacitko'/>
+ <cd:command name='bypassblocks' value='bypassblocks'/>
+ <cd:command name='character' value='znak'/>
+ <cd:command name='characters' value='znaky'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='orez'/>
+ <cd:command name='clonefield' value='klonujpole'/>
+ <cd:command name='color' value='barva'/>
+ <cd:command name='colorbar' value='barevnalista'/>
+ <cd:command name='colorvalue' value='hodnotabarvy'/>
+ <cd:command name='column' value='sloupec'/>
+ <cd:command name='comment' value='komentar'/>
+ <cd:command name='comparecolorgroup' value='porovnejskupinubarev'/>
+ <cd:command name='comparepalet' value='porovnejpaletu'/>
+ <cd:command name='completepagenumber' value='completepagenumber'/>
+ <cd:command name='completeregister' value='completeregister'/>
+ <cd:command name='component' value='komponenta'/>
+ <cd:command name='convertnumber' value='konvertujcislo'/>
+ <cd:command name='copyfield' value='kopirujpole'/>
+ <cd:command name='correctwhitespace' value='korekcebilehomista'/>
+ <cd:command name='coupledocument' value='propojenydokument'/>
+ <cd:command name='couplemarking' value='propojeneznaceni'/>
+ <cd:command name='couplepage' value='parovastrana'/>
+ <cd:command name='couplepaper' value='dvoustrannypapir'/>
+ <cd:command name='coupleregister' value='propojenyrejstrik'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='aktualnidatum'/>
+ <cd:command name='currentheadnumber' value='aktualnicislonadpisu'/>
+ <cd:command name='cutspace' value='cutspace'/>
+ <cd:command name='date' value='datum'/>
+ <cd:command name='decouplemarking' value='rozpojeneznaceni'/>
+ <cd:command name='decrementnumber' value='decrementnumber'/>
+ <cd:command name='define' value='definuj'/>
+ <cd:command name='defineaccent' value='definujakcent'/>
+ <cd:command name='defineblank' value='definujpreskok'/>
+ <cd:command name='defineblock' value='definujblok'/>
+ <cd:command name='definebodyfont' value='definujzakladnifont'/>
+ <cd:command name='definebodyfontenvironment' value='definujprostredizakladnihofontu'/>
+ <cd:command name='definebuffer' value='definujbuffer'/>
+ <cd:command name='definecharacter' value='definujznak'/>
+ <cd:command name='definecolor' value='definujbarvu'/>
+ <cd:command name='definecolorgroup' value='definujskupinubarev'/>
+ <cd:command name='definecolumnbreak' value='definecolumnbreak'/>
+ <cd:command name='definecolumnset' value='definecolumnset'/>
+ <cd:command name='definecombination' value='definecombination'/>
+ <cd:command name='definecombinedlist' value='definujkombinovanyseznam'/>
+ <cd:command name='definecommand' value='definujprikaz'/>
+ <cd:command name='defineconversion' value='definujkonverzi'/>
+ <cd:command name='definedescription' value='definujpopis'/>
+ <cd:command name='defineenumeration' value='definujvycet'/>
+ <cd:command name='definefield' value='definujpole'/>
+ <cd:command name='definefieldstack' value='definujzasobnikpoli'/>
+ <cd:command name='definefiguresymbol' value='definujobrazeksymbol'/>
+ <cd:command name='definefloat' value='definujplvouciobjekt'/>
+ <cd:command name='definefont' value='definujfont'/>
+ <cd:command name='definefontstyle' value='definujstylfontu'/>
+ <cd:command name='definefontsynonym' value='definujsynonumumfontu'/>
+ <cd:command name='defineframed' value='definujoramovani'/>
+ <cd:command name='defineframedtext' value='definujoramovanytext'/>
+ <cd:command name='definehbox' value='definujhbox'/>
+ <cd:command name='definehead' value='definujnadpis'/>
+ <cd:command name='defineindenting' value='definujodsazovani'/>
+ <cd:command name='defineinmargin' value='defineinmargin'/>
+ <cd:command name='defineinteractionmenu' value='definujinterakcnimenu'/>
+ <cd:command name='defineitemgroup' value='defineitemgroup'/>
+ <cd:command name='definelabel' value='definujpopisek'/>
+ <cd:command name='definelayer' value='definelayer'/>
+ <cd:command name='definelayout' value='definelayout'/>
+ <cd:command name='definelist' value='definujseznam'/>
+ <cd:command name='definelogo' value='definujlogo'/>
+ <cd:command name='definemainfield' value='definujhlavnipole'/>
+ <cd:command name='definemakeup' value='definujupravu'/>
+ <cd:command name='definemarking' value='definujznaceni'/>
+ <cd:command name='definemathalignment' value='definemathalignment'/>
+ <cd:command name='defineoutput' value='definujvystup'/>
+ <cd:command name='defineoverlay' value='definujprekryv'/>
+ <cd:command name='definepagebreak' value='definepagebreak'/>
+ <cd:command name='definepalet' value='definujpaletu'/>
+ <cd:command name='definepapersize' value='definujvelikostpapiru'/>
+ <cd:command name='defineparagraphs' value='definujodstavce'/>
+ <cd:command name='defineplacement' value='defineplacement'/>
+ <cd:command name='defineprofile' value='definujprofil'/>
+ <cd:command name='defineprogram' value='definujprogram'/>
+ <cd:command name='definerawfont' value='definerawfont'/>
+ <cd:command name='definereference' value='definujodkaz'/>
+ <cd:command name='definereferenceformat' value='definujformatodkazu'/>
+ <cd:command name='definereferencelist' value='definujseznamodkazu'/>
+ <cd:command name='defineregister' value='definujrejstrik'/>
+ <cd:command name='definerule' value='definerule'/>
+ <cd:command name='definesection' value='definujsekci'/>
+ <cd:command name='definesectionblock' value='definujbloksekce'/>
+ <cd:command name='definesorting' value='definujtrideni'/>
+ <cd:command name='definestartstop' value='definujstartstop'/>
+ <cd:command name='definestyle' value='definujstyl'/>
+ <cd:command name='definesubfield' value='definujpodpole'/>
+ <cd:command name='definesymbol' value='definujsymbol'/>
+ <cd:command name='definesynonyms' value='definujsynonyma'/>
+ <cd:command name='definetabletemplate' value='definujsablonutabulky'/>
+ <cd:command name='definetabulate' value='definujtabelaci'/>
+ <cd:command name='definetext' value='definujtext'/>
+ <cd:command name='definetextposition' value='definetextposition'/>
+ <cd:command name='definetextvariable' value='definetextvariable'/>
+ <cd:command name='definetype' value='definetype'/>
+ <cd:command name='definetyping' value='definujopis'/>
+ <cd:command name='defineversion' value='definujverzi'/>
+ <cd:command name='determineheadnumber' value='stanovcislonadpisu'/>
+ <cd:command name='determinelistcharacteristics' value='stanovcharakteristickuseznamu'/>
+ <cd:command name='determineregistercharacteristics' value='urcicharakteristikurejstriku'/>
+ <cd:command name='dimension' value='rozmer'/>
+ <cd:command name='disableinteractionmenu' value='zablokujinterakcnimenu'/>
+ <cd:command name='domicile' value='bydliste'/>
+ <cd:command name='donttest' value='zadnytest'/>
+ <cd:command name='edgedistance' value='vzdalenostokraje'/>
+ <cd:command name='edgewidth' value='sirkaokraje'/>
+ <cd:command name='emptylines' value='emptylines'/>
+ <cd:command name='environment' value='prostredi'/>
+ <cd:command name='externalfigure' value='externiobraz'/>
+ <cd:command name='fact' value='fakt'/>
+ <cd:command name='field' value='pole'/>
+ <cd:command name='fieldstack' value='zasobnikpoli'/>
+ <cd:command name='fillinfield' value='vyplnovepole'/>
+ <cd:command name='fillinline' value='vyplnovyradek'/>
+ <cd:command name='fillinrules' value='vyplnovelinky'/>
+ <cd:command name='fillintext' value='vyplnenytext'/>
+ <cd:command name='fitfield' value='prizpusobivepole'/>
+ <cd:command name='fixedspace' value='tvrdamezera'/>
+ <cd:command name='fixedspaces' value='tvrdemezery'/>
+ <cd:command name='followprofile' value='dodrzujprofil'/>
+ <cd:command name='followprofileversion' value='dodrzujverziprofilu'/>
+ <cd:command name='followversion' value='dodrzujverzi'/>
+ <cd:command name='footerdistance' value='vzdalenostupati'/>
+ <cd:command name='footerheight' value='vyskaupati'/>
+ <cd:command name='footnote' value='poznamkapodcarou'/>
+ <cd:command name='footnotetext' value='footnotetext'/>
+ <cd:command name='forceblocks' value='forceblocks'/>
+ <cd:command name='formulanumber' value='cislorovnice'/>
+ <cd:command name='fraction' value='zlomek'/>
+ <cd:command name='framed' value='oramovani'/>
+ <cd:command name='from' value='zref'/>
+ <cd:command name='getbuffer' value='ziskejbuffer'/>
+ <cd:command name='getmarking' value='ziskejznaceni'/>
+ <cd:command name='getnumber' value='getnumber'/>
+ <cd:command name='godown' value='jdidolu'/>
+ <cd:command name='goto' value='jdina'/>
+ <cd:command name='gotobox' value='jdinabox'/>
+ <cd:command name='gotopage' value='jdinastranu'/>
+ <cd:command name='graycolor' value='sedabarva'/>
+ <cd:command name='greyvalue' value='hodnotasedi'/>
+ <cd:command name='grid' value='mrizka'/>
+ <cd:command name='hairline' value='vlasovalinka'/>
+ <cd:command name='head' value='nadpis'/>
+ <cd:command name='headerdistance' value='vzdalenostzahlavi'/>
+ <cd:command name='headerheight' value='vyskazahlavi'/>
+ <cd:command name='headlevel' value='hlavniuroven'/>
+ <cd:command name='headnumber' value='cislonadpisu'/>
+ <cd:command name='headsym' value='headsym'/>
+ <cd:command name='headtext' value='texthlavicky'/>
+ <cd:command name='hideblocks' value='schovejbloky'/>
+ <cd:command name='high' value='vysoky'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='immediatebetweenlist'/>
+ <cd:command name='immediatetolist' value='immediatetolist'/>
+ <cd:command name='in' value='tref'/>
+ <cd:command name='incrementnumber' value='zvysujicicislo'/>
+ <cd:command name='indenting' value='odsazovani'/>
+ <cd:command name='inframed' value='zaramovani'/>
+ <cd:command name='infull' value='plnezneni'/>
+ <cd:command name='ininner' value='ininner'/>
+ <cd:command name='inleft' value='vlevo'/>
+ <cd:command name='inleftedge' value='nalevo'/>
+ <cd:command name='inleftmargin' value='nalevyokraj'/>
+ <cd:command name='inline' value='vradku'/>
+ <cd:command name='inmargin' value='naokraj'/>
+ <cd:command name='inmframed' value='mazaramovani'/>
+ <cd:command name='inneredgedistance' value='inneredgedistance'/>
+ <cd:command name='inneredgewidth' value='inneredgewidth'/>
+ <cd:command name='innermargindistance' value='innermargindistance'/>
+ <cd:command name='innermarginwidth' value='innermarginwidth'/>
+ <cd:command name='inothermargin' value='nadruhyokraj'/>
+ <cd:command name='inouter' value='inouter'/>
+ <cd:command name='inright' value='vpravo'/>
+ <cd:command name='inrightedge' value='napravo'/>
+ <cd:command name='inrightmargin' value='napravyokraj'/>
+ <cd:command name='installlanguage' value='instalacejazyka'/>
+ <cd:command name='interactionbar' value='interakcnilista'/>
+ <cd:command name='interactionbuttons' value='interakcnitlacitka'/>
+ <cd:command name='interactionmenu' value='interaktivnimenu'/>
+ <cd:command name='item' value='polozka'/>
+ <cd:command name='items' value='polozky'/>
+ <cd:command name='its' value='pol'/>
+ <cd:command name='keepblocks' value='zachovejbloky'/>
+ <cd:command name='label' value='poppisek'/>
+ <cd:command name='labels' value='popisky'/>
+ <cd:command name='labeltext' value='textpopisku'/>
+ <cd:command name='language' value='jazyk'/>
+ <cd:command name='leftaligned' value='zarovnanovlevo'/>
+ <cd:command name='leftedgedistance' value='vzdalenostlevehookraje'/>
+ <cd:command name='leftedgewidth' value='sirkalevehookraje'/>
+ <cd:command name='leftmargindistance' value='vzdalenostlevemarginalie'/>
+ <cd:command name='leftmarginwidth' value='sirkalevemarginalie'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='tloustkacary'/>
+ <cd:command name='listheight' value='vyskaseznamu'/>
+ <cd:command name='listlength' value='delkaseznamu'/>
+ <cd:command name='listsymbol' value='listsymbol'/>
+ <cd:command name='listwidth' value='sirkaseznamu'/>
+ <cd:command name='logfields' value='zaznamovepole'/>
+ <cd:command name='lohi' value='nivy'/>
+ <cd:command name='low' value='nizky'/>
+ <cd:command name='macroname' value='jmeno'/>
+ <cd:command name='mainlanguage' value='hlavnijazyk'/>
+ <cd:command name='makeupheight' value='vyskasazby'/>
+ <cd:command name='makeupwidth' value='sirkasazby'/>
+ <cd:command name='mar' value='okr'/>
+ <cd:command name='margindistance' value='vzdalenostmarginalie'/>
+ <cd:command name='marginrule' value='marginalnilinka'/>
+ <cd:command name='margintext' value='marginalnitext'/>
+ <cd:command name='margintitle' value='marginalninadpis'/>
+ <cd:command name='marginwidth' value='sirkamarginalie'/>
+ <cd:command name='marginword' value='marginalnislovo'/>
+ <cd:command name='marking' value='znaceni'/>
+ <cd:command name='markversion' value='oznacverzi'/>
+ <cd:command name='mathematics' value='matematika'/>
+ <cd:command name='menubutton' value='tlacitkomenu'/>
+ <cd:command name='mframed' value='maoramovani'/>
+ <cd:command name='midaligned' value='zarovnanonastred'/>
+ <cd:command name='mirror' value='zrcadlit'/>
+ <cd:command name='month' value='mesic'/>
+ <cd:command name='moveformula' value='moveformula'/>
+ <cd:command name='moveongrid' value='premistinamrizku'/>
+ <cd:command name='movesidefloat' value='movesidefloat'/>
+ <cd:command name='navigating' value='navigating'/>
+ <cd:command name='nodimension' value='zadnyrozmer'/>
+ <cd:command name='noheaderandfooterlines' value='zadnezahlaviaupati'/>
+ <cd:command name='noindenting' value='zadneodsazovani'/>
+ <cd:command name='nolist' value='zadnyseznam'/>
+ <cd:command name='nomarking' value='zadneznaceni'/>
+ <cd:command name='nomoreblocks' value='zadnedalsibloky'/>
+ <cd:command name='nomorefiles' value='zadnedalsisoubory'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='zadnamezera'/>
+ <cd:command name='note' value='poznamka'/>
+ <cd:command name='notopandbottomlines' value='zadnehorniadolniradky'/>
+ <cd:command name='notsmallcapped' value='nokap'/>
+ <cd:command name='nowhitespace' value='zadnebilemisto'/>
+ <cd:command name='numberofsubpages' value='numberofsubpages'/>
+ <cd:command name='numbers' value='cisla'/>
+ <cd:command name='outeredgedistance' value='outeredgedistance'/>
+ <cd:command name='outeredgewidth' value='outeredgewidth'/>
+ <cd:command name='outermargindistance' value='outermargindistance'/>
+ <cd:command name='outermarginwidth' value='outermarginwidth'/>
+ <cd:command name='packed' value='zhustene'/>
+ <cd:command name='page' value='strana'/>
+ <cd:command name='pagedepth' value='pagedepth'/>
+ <cd:command name='pagenumber' value='cislostrany'/>
+ <cd:command name='pageoffset' value='pageoffset'/>
+ <cd:command name='pagereference' value='odkaznastranu'/>
+ <cd:command name='pagetype' value='typstrany'/>
+ <cd:command name='paperheight' value='vyskapapiru'/>
+ <cd:command name='paperwidth' value='sirkapapiru'/>
+ <cd:command name='periods' value='tecky'/>
+ <cd:command name='plaatsruwelijst' value='placerawlist'/>
+ <cd:command name='placebookmarks' value='umistizalozky'/>
+ <cd:command name='placecombinedlist' value='umistikombinovanyseznam'/>
+ <cd:command name='placefloat' value='placefloat'/>
+ <cd:command name='placefootnotes' value='umistipoznamkypodcarou'/>
+ <cd:command name='placeformula' value='umistirovnici'/>
+ <cd:command name='placeheadnumber' value='placeheadnumber'/>
+ <cd:command name='placeheadtext' value='placeheadtext'/>
+ <cd:command name='placelegend' value='umistilegendu'/>
+ <cd:command name='placelist' value='umistiseznam'/>
+ <cd:command name='placelocalfootnotes' value='umistilokalnipoznamkypodcarou'/>
+ <cd:command name='placelogos' value='umistiloga'/>
+ <cd:command name='placeongrid' value='umistinamrizku'/>
+ <cd:command name='placeontopofeachother' value='umistinadsebe'/>
+ <cd:command name='placepagenumber' value='placepagenumber'/>
+ <cd:command name='placereferencelist' value='placereferencelist'/>
+ <cd:command name='placeregister' value='umistirejstrik'/>
+ <cd:command name='placerule' value='placerule'/>
+ <cd:command name='placesidebyside' value='umistivedlesebe'/>
+ <cd:command name='placesubformula' value='umistipodrovnici'/>
+ <cd:command name='placetextvariable' value='placetextvariable'/>
+ <cd:command name='position' value='pozice'/>
+ <cd:command name='positiontext' value='positiontext'/>
+ <cd:command name='printpaperheight' value='vyskatiskpapiru'/>
+ <cd:command name='printpaperwidth' value='sirkatiskpapiru'/>
+ <cd:command name='processblocks' value='zpracujbloky'/>
+ <cd:command name='processpage' value='zpracujstranu'/>
+ <cd:command name='product' value='produkt'/>
+ <cd:command name='program' value='program'/>
+ <cd:command name='project' value='projekt'/>
+ <cd:command name='publication' value='publikace'/>
+ <cd:command name='quotation' value='citace'/>
+ <cd:command name='quote' value='citovat'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='opakovat'/>
+ <cd:command name='ref' value='ref'/>
+ <cd:command name='reference' value='odkaz'/>
+ <cd:command name='referral' value='odkaz'/>
+ <cd:command name='referraldate' value='odkaznadatum'/>
+ <cd:command name='referring' value='odkazujici'/>
+ <cd:command name='remark' value='oznaceni'/>
+ <cd:command name='reset' value='reset'/>
+ <cd:command name='resetmarking' value='resetznaceni'/>
+ <cd:command name='resetnumber' value='resetnumber'/>
+ <cd:command name='resettext' value='resettextcontent'/>
+ <cd:command name='rightaligned' value='zarovnanovpravo'/>
+ <cd:command name='rightedgedistance' value='vzdalenostpravehookraje'/>
+ <cd:command name='rightedgewidth' value='sirkapravehookraje'/>
+ <cd:command name='rightmargindistance' value='vzdalenostpravemarginalie'/>
+ <cd:command name='rightmarginwidth' value='sirkapravemarginalie'/>
+ <cd:command name='romannumerals' value='rimskecislice'/>
+ <cd:command name='rotate' value='otocit'/>
+ <cd:command name='scale' value='meritko'/>
+ <cd:command name='screen' value='obrazovka'/>
+ <cd:command name='selectblocks' value='vyberbloky'/>
+ <cd:command name='selectpaper' value='vyberpapir'/>
+ <cd:command name='selectversion' value='vyberverzi'/>
+ <cd:command name='setnumber' value='setnumber'/>
+ <cd:command name='settextcontent' value='settextcontent'/>
+ <cd:command name='settextvariable' value='settextvariable'/>
+ <cd:command name='setupalign' value='nastavzarovnani'/>
+ <cd:command name='setupanswerarea' value='setupanswerarea'/>
+ <cd:command name='setuparranging' value='nastavusporadani'/>
+ <cd:command name='setupbackground' value='nastavpozadi'/>
+ <cd:command name='setupbackgrounds' value='nastavpozadi'/>
+ <cd:command name='setupblackrules' value='nastavcernelinky'/>
+ <cd:command name='setupblank' value='nastavpreskok'/>
+ <cd:command name='setupblock' value='nastavblok'/>
+ <cd:command name='setupbodyfont' value='nastavzakladnifont'/>
+ <cd:command name='setupbodyfontenvironment' value='nastavprostredizakladnihofontu'/>
+ <cd:command name='setupbottom' value='nastavspodek'/>
+ <cd:command name='setupbottomtexts' value='nastavdolnitexty'/>
+ <cd:command name='setupbuffer' value='nastavbuffer'/>
+ <cd:command name='setupbuttons' value='nastavtlacitka'/>
+ <cd:command name='setupcapitals' value='nastavkapitalky'/>
+ <cd:command name='setupcaption' value='nastavpopisek'/>
+ <cd:command name='setupcaptions' value='nastavpopisky'/>
+ <cd:command name='setupclipping' value='nastavorez'/>
+ <cd:command name='setupcolor' value='nastavbarvu'/>
+ <cd:command name='setupcolors' value='nastavbarvy'/>
+ <cd:command name='setupcolumns' value='nastavsloupce'/>
+ <cd:command name='setupcolumnset' value='setupcolumnset'/>
+ <cd:command name='setupcolumnsetlines' value='setupcolumnsetlines'/>
+ <cd:command name='setupcolumnsetstart' value='setupcolumnsetstart'/>
+ <cd:command name='setupcombinations' value='nastavspojeni'/>
+ <cd:command name='setupcombinedlist' value='nastavkombinovanyseznam'/>
+ <cd:command name='setupcomment' value='nastavkomentar'/>
+ <cd:command name='setupdescriptions' value='nastavpopisy'/>
+ <cd:command name='setupenumerations' value='nastavvycty'/>
+ <cd:command name='setupexternalfigures' value='nastavexterniobrazy'/>
+ <cd:command name='setupfield' value='nastavpole'/>
+ <cd:command name='setupfields' value='nastavvsechnapole'/>
+ <cd:command name='setupfillinlines' value='nastavvyplnoveradky'/>
+ <cd:command name='setupfillinrules' value='nastavvyplnovelinky'/>
+ <cd:command name='setupfloat' value='nastavplvouciobjekt'/>
+ <cd:command name='setupfloats' value='nastavplvouciobjekty'/>
+ <cd:command name='setupfloatsplitting' value='nastavdeleniplvoucichobjektu'/>
+ <cd:command name='setupfooter' value='nastavupati'/>
+ <cd:command name='setupfootertexts' value='nastavtextyupati'/>
+ <cd:command name='setupfootnotedefinition' value='nastavdefinicipoznamekpodcarou'/>
+ <cd:command name='setupfootnotes' value='nastavpoznamkypodcarou'/>
+ <cd:command name='setupforms' value='setupforms'/>
+ <cd:command name='setupformulas' value='nastavrovnice'/>
+ <cd:command name='setupframed' value='nastavoramovani'/>
+ <cd:command name='setupframedtexts' value='nastavoramovanetexty'/>
+ <cd:command name='setuphead' value='nastavnadpis'/>
+ <cd:command name='setupheader' value='nastavzahlavi'/>
+ <cd:command name='setupheadertexts' value='nastavtextyzahlavi'/>
+ <cd:command name='setupheadnumber' value='nastavcislonadpisu'/>
+ <cd:command name='setupheads' value='nastavnadpisy'/>
+ <cd:command name='setupheadtext' value='nastavtexthlavicky'/>
+ <cd:command name='setuphyphenmark' value='nastavdelitko'/>
+ <cd:command name='setupindentations' value='nastavodsazeni'/>
+ <cd:command name='setupindenting' value='nastavodsazovani'/>
+ <cd:command name='setupinmargin' value='nastavmarginalie'/>
+ <cd:command name='setupinteraction' value='nastavinterakci'/>
+ <cd:command name='setupinteractionbar' value='nastavinterakcnilistu'/>
+ <cd:command name='setupinteractionmenu' value='nastavinterakcnimenu'/>
+ <cd:command name='setupinteractionscreen' value='nastavinterakcniobrazovku'/>
+ <cd:command name='setupinterlinespace' value='nastavmeziradkovoumezeru'/>
+ <cd:command name='setupitemgroup' value='setupitemgroup'/>
+ <cd:command name='setupitemgroups' value='nastavvycty'/>
+ <cd:command name='setupitems' value='nastavpolozky'/>
+ <cd:command name='setuplabeltext' value='nastavtextpopisku'/>
+ <cd:command name='setuplanguage' value='nastavjazyk'/>
+ <cd:command name='setuplayout' value='nastavvzhled'/>
+ <cd:command name='setuplegend' value='nastavlegendu'/>
+ <cd:command name='setuplinenumbering' value='nastavcislovaniradku'/>
+ <cd:command name='setuplines' value='nastavradky'/>
+ <cd:command name='setuplinewidth' value='nastavsirkucary'/>
+ <cd:command name='setuplist' value='nastavseznam'/>
+ <cd:command name='setupmakeup' value='nastavupravu'/>
+ <cd:command name='setupmarginblocks' value='nastavmarginalniblok'/>
+ <cd:command name='setupmarginrules' value='nastavmarginalnilinky'/>
+ <cd:command name='setupmarking' value='nastavznaceni'/>
+ <cd:command name='setupmathalignment' value='setupmathalignment'/>
+ <cd:command name='setupnarrower' value='nastavzuzeni'/>
+ <cd:command name='setupnumber' value='setupnumber'/>
+ <cd:command name='setupnumbering' value='nastavcislovani'/>
+ <cd:command name='setupoppositeplacing' value='nastavumisteniprotejsku'/>
+ <cd:command name='setupoutput' value='nastavvystup'/>
+ <cd:command name='setuppagecomment' value='nastavkomentarstrany'/>
+ <cd:command name='setuppagenumber' value='nastavcislostrany'/>
+ <cd:command name='setuppagenumbering' value='nastavcislovanistran'/>
+ <cd:command name='setuppagetransitions' value='nastavprechodstrany'/>
+ <cd:command name='setuppalet' value='nastavpaletu'/>
+ <cd:command name='setuppaper' value='setuppaper'/>
+ <cd:command name='setuppapersize' value='nastavvelikostpapiru'/>
+ <cd:command name='setupparagraphnumbering' value='nastavcislovaniodstavcu'/>
+ <cd:command name='setupparagraphs' value='nastavodstavce'/>
+ <cd:command name='setupplacement' value='setupplacement'/>
+ <cd:command name='setuppositioning' value='nastavumistovani'/>
+ <cd:command name='setupprofiles' value='nastavprofily'/>
+ <cd:command name='setupprograms' value='nastavprogramy'/>
+ <cd:command name='setuppublications' value='nastavpublikace'/>
+ <cd:command name='setupquote' value='nastavcitaci'/>
+ <cd:command name='setupreferencelist' value='nastavseznamodkazu'/>
+ <cd:command name='setupreferencing' value='nastavodkazovani'/>
+ <cd:command name='setupregister' value='nastavrejstrik'/>
+ <cd:command name='setuprotate' value='nastavotoceni'/>
+ <cd:command name='setuprule' value='setuprule'/>
+ <cd:command name='setups' value='nastaveni'/>
+ <cd:command name='setupscreens' value='nastavrastr'/>
+ <cd:command name='setupsection' value='nastavsekci'/>
+ <cd:command name='setupsectionblock' value='nastavbloksekce'/>
+ <cd:command name='setupsorting' value='nastavtrideni'/>
+ <cd:command name='setupspacing' value='nastavradkovani'/>
+ <cd:command name='setupstartstop' value='setupstartstop'/>
+ <cd:command name='setupstrut' value='setupstrut'/>
+ <cd:command name='setupsubpagenumber' value='nastavpodcislostrany'/>
+ <cd:command name='setupsymbolset' value='nastavsadusymbolu'/>
+ <cd:command name='setupsynchronization' value='nastavsynchronizaci'/>
+ <cd:command name='setupsynchronizationbar' value='nastavsynchronizacnilistu'/>
+ <cd:command name='setupsynonyms' value='nastavsynonyma'/>
+ <cd:command name='setupsystem' value='nastavsystem'/>
+ <cd:command name='setuptab' value='nastavtab'/>
+ <cd:command name='setuptables' value='nastavtabulky'/>
+ <cd:command name='setuptabulate' value='nastavtabelaci'/>
+ <cd:command name='setuptext' value='nastavtext'/>
+ <cd:command name='setuptextposition' value='setuptextposition'/>
+ <cd:command name='setuptextrules' value='nastavtextovelinky'/>
+ <cd:command name='setuptexttexts' value='nastavtexttexty'/>
+ <cd:command name='setuptextvariable' value='setuptextvariable'/>
+ <cd:command name='setupthinrules' value='nastavtenkelinky'/>
+ <cd:command name='setuptolerance' value='nastavtoleranci'/>
+ <cd:command name='setuptop' value='nastavhorejsek'/>
+ <cd:command name='setuptoptexts' value='nastavhornitexty'/>
+ <cd:command name='setuptype' value='nastavtype'/>
+ <cd:command name='setuptyping' value='nastavopis'/>
+ <cd:command name='setupunderbar' value='nastavpodtrzeni'/>
+ <cd:command name='setupurl' value='nastavurl'/>
+ <cd:command name='setupversions' value='nastavverze'/>
+ <cd:command name='setupwhitespace' value='nastavbilamista'/>
+ <cd:command name='showbodyfont' value='ukazzakladnifont'/>
+ <cd:command name='showbodyfontenvironment' value='ukazpostredizakladnihofontu'/>
+ <cd:command name='showcolor' value='ukazbarvu'/>
+ <cd:command name='showcolorgroup' value='ukazskupinubarev'/>
+ <cd:command name='showexternalfigures' value='ukazexterniobrazy'/>
+ <cd:command name='showfields' value='ukazpole'/>
+ <cd:command name='showframe' value='ukazramecek'/>
+ <cd:command name='showgrid' value='ukazmrizku'/>
+ <cd:command name='showlayout' value='ukazvzhled'/>
+ <cd:command name='showmakeup' value='ukazupravu'/>
+ <cd:command name='showpalet' value='ukazpaletu'/>
+ <cd:command name='showprint' value='ukazvytisk'/>
+ <cd:command name='showsetups' value='ukaznastaveni'/>
+ <cd:command name='showstruts' value='ukazpodpery'/>
+ <cd:command name='showsymbolset' value='ukazsadusymbolu'/>
+ <cd:command name='smallcapped' value='kap'/>
+ <cd:command name='someline' value='nejakyradek'/>
+ <cd:command name='somewhere' value='nekde'/>
+ <cd:command name='space' value='mezera'/>
+ <cd:command name='splitfloat' value='rozdelplvouciobjekt'/>
+ <cd:command name='startalignment' value='startzarovnavani'/>
+ <cd:command name='startbackground' value='startpozadi'/>
+ <cd:command name='startcoding' value='startkodovani'/>
+ <cd:command name='startcolor' value='startbarva'/>
+ <cd:command name='startcolumnmakeup' value='startcolumnmakeup'/>
+ <cd:command name='startcolumns' value='startsloupce'/>
+ <cd:command name='startcolumnset' value='startcolumnset'/>
+ <cd:command name='startcombination' value='startspojeni'/>
+ <cd:command name='startcomponent' value='startkomponenta'/>
+ <cd:command name='startdocument' value='startdokument'/>
+ <cd:command name='startenvironment' value='startprostredi'/>
+ <cd:command name='startfigure' value='startobraz'/>
+ <cd:command name='startglobal' value='startglobalni'/>
+ <cd:command name='startline' value='startradek'/>
+ <cd:command name='startlinecorrection' value='startkorekceradku'/>
+ <cd:command name='startlinenumbering' value='startcislovaniradku'/>
+ <cd:command name='startlines' value='startradky'/>
+ <cd:command name='startlocal' value='startlokalni'/>
+ <cd:command name='startlocalfootnotes' value='startlokalnipoznamkypodcarou'/>
+ <cd:command name='startmakeup' value='startuprava'/>
+ <cd:command name='startmarginblock' value='startmarginalniblok'/>
+ <cd:command name='startmarginrule' value='startmarginalnilinka'/>
+ <cd:command name='startnarrower' value='startzuzeni'/>
+ <cd:command name='startopposite' value='startprotejsek'/>
+ <cd:command name='startoverlay' value='startprekryv'/>
+ <cd:command name='startoverzicht' value='startprehled'/>
+ <cd:command name='startpacked' value='startzhustene'/>
+ <cd:command name='startpositioning' value='startumistovani'/>
+ <cd:command name='startproduct' value='startprodukt'/>
+ <cd:command name='startprofile' value='startprofil'/>
+ <cd:command name='startproject' value='startprojekt'/>
+ <cd:command name='startquotation' value='startcitace'/>
+ <cd:command name='startraster' value='startrastr'/>
+ <cd:command name='startsymbolset' value='startsadasymbolu'/>
+ <cd:command name='startsynchronization' value='startsynchronizace'/>
+ <cd:command name='starttable' value='starttabulka'/>
+ <cd:command name='starttables' value='starttabulky'/>
+ <cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextrule' value='starttextovalinka'/>
+ <cd:command name='startunpacked' value='startnezhustene'/>
+ <cd:command name='startversion' value='startverze'/>
+ <cd:command name='stopalignment' value='stopzarovnavani'/>
+ <cd:command name='stopbackground' value='stoppozadi'/>
+ <cd:command name='stopcoding' value='stopkodovani'/>
+ <cd:command name='stopcolor' value='stopbarva'/>
+ <cd:command name='stopcolumnmakeup' value='stopcolumnmakeup'/>
+ <cd:command name='stopcolumns' value='stopsloupce'/>
+ <cd:command name='stopcolumnset' value='stopcolumnset'/>
+ <cd:command name='stopcombination' value='stopspojeni'/>
+ <cd:command name='stopcomponent' value='stopkomponenta'/>
+ <cd:command name='stopdocument' value='stopdokument'/>
+ <cd:command name='stopenvironment' value='stopprostredi'/>
+ <cd:command name='stopglobal' value='stopglobalni'/>
+ <cd:command name='stopline' value='stopradek'/>
+ <cd:command name='stoplinecorrection' value='stopkorekceradku'/>
+ <cd:command name='stoplinenumbering' value='stopcislovaniradku'/>
+ <cd:command name='stoplines' value='stopradky'/>
+ <cd:command name='stoplocal' value='stoplokalni'/>
+ <cd:command name='stoplocalfootnotes' value='stoplokalnipoznamkypodcarou'/>
+ <cd:command name='stopmakeup' value='stopuprava'/>
+ <cd:command name='stopmarginblock' value='stopmarginalniblok'/>
+ <cd:command name='stopmarginrule' value='stopmarginalnilinka'/>
+ <cd:command name='stopnarrower' value='stopzuzeni'/>
+ <cd:command name='stopopposite' value='stopprotejsek'/>
+ <cd:command name='stopoverlay' value='stopprekryv'/>
+ <cd:command name='stopoverzicht' value='stopprehled'/>
+ <cd:command name='stoppacked' value='stopzhustene'/>
+ <cd:command name='stoppositioning' value='stopumistovani'/>
+ <cd:command name='stopproduct' value='stopprodukt'/>
+ <cd:command name='stopprofile' value='stopprofil'/>
+ <cd:command name='stopproject' value='stopprojekt'/>
+ <cd:command name='stopquotation' value='stopcitace'/>
+ <cd:command name='stopraster' value='stoprastr'/>
+ <cd:command name='stopsynchronization' value='stopsynchronizace'/>
+ <cd:command name='stoptable' value='stoptabulka'/>
+ <cd:command name='stoptables' value='stoptabulky'/>
+ <cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextrule' value='stoptextovalinka'/>
+ <cd:command name='stopunpacked' value='stopnezhustene'/>
+ <cd:command name='stopversion' value='stopverze'/>
+ <cd:command name='stretched' value='roztazene'/>
+ <cd:command name='subformulanumber' value='cislopodrovnice'/>
+ <cd:command name='subpagenumber' value='subpagenumber'/>
+ <cd:command name='switchtobodyfont' value='prepninazakladnifont'/>
+ <cd:command name='switchtorawfont' value='switchtorawfont'/>
+ <cd:command name='sym' value='sym'/>
+ <cd:command name='symbol' value='symbol'/>
+ <cd:command name='synchronizationbar' value='synchronizacnilista'/>
+ <cd:command name='synchronize' value='synchronizovat'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testcolumn'/>
+ <cd:command name='testpage' value='testpage'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='vyskatextu'/>
+ <cd:command name='textreference' value='odkaznatext'/>
+ <cd:command name='textrule' value='textovalinka'/>
+ <cd:command name='textvariable' value='textvariable'/>
+ <cd:command name='textwidth' value='sirkatextu'/>
+ <cd:command name='thinrule' value='tenkalinka'/>
+ <cd:command name='thinrules' value='tenkelinky'/>
+ <cd:command name='tooltip' value='bublinkovanapoveda'/>
+ <cd:command name='topdistance' value='vzdalenosthorejsku'/>
+ <cd:command name='topheight' value='vyskahorejsku'/>
+ <cd:command name='topspace' value='odsazenishora'/>
+ <cd:command name='totalnumberofpages' value='celkovypocetstran'/>
+ <cd:command name='translate' value='prelozit'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='pis'/>
+ <cd:command name='type' value='opis'/>
+ <cd:command name='typebuffer' value='typebuffer'/>
+ <cd:command name='typefile' value='opissoubor'/>
+ <cd:command name='unitmeaning' value='vyznam'/>
+ <cd:command name='unknown' value='neznamo'/>
+ <cd:command name='useJSscripts' value='uzijJSscripts'/>
+ <cd:command name='useURL' value='uzijURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='uzijbloky'/>
+ <cd:command name='usecommands' value='uzijprikazy'/>
+ <cd:command name='useencoding' value='uzijkodovani'/>
+ <cd:command name='useexternaldocument' value='uzijexternidokument'/>
+ <cd:command name='useexternalfigure' value='uzijexterniobraz'/>
+ <cd:command name='useexternalfile' value='uzijexternisoubor'/>
+ <cd:command name='useexternalfiles' value='uzijexternisoubory'/>
+ <cd:command name='useexternalsoundtrack' value='uzijexternizvuk'/>
+ <cd:command name='usemodule' value='uzijmodul'/>
+ <cd:command name='usemodules' value='uzijmoduly'/>
+ <cd:command name='usepath' value='uzijadresar'/>
+ <cd:command name='usereferences' value='uzijodkazy'/>
+ <cd:command name='usespecials' value='uzijspeciality'/>
+ <cd:command name='usesymbols' value='uzijsymbol'/>
+ <cd:command name='usetypescript' value='usetypescript'/>
+ <cd:command name='usetypescriptfile' value='usetypescriptfile'/>
+ <cd:command name='useurl' value='uzijurl'/>
+ <cd:command name='version' value='verze'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='vsedniden'/>
+ <cd:command name='whitespace' value='bilemisto'/>
+ <cd:command name='wordright' value='slovovpravo'/>
+ <cd:command name='writebetweenlist' value='zapismeziseznam'/>
+ <cd:command name='writetolist' value='zapisdoseznamu'/>
+ <cd:command name='writetoreferencelist' value='zapisdoseznamuodkazu'/>
+ <cd:command name='writetoregister' value='zapisdorejstriku'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/interface/keys-cz.xml b/tex/context/interface/keys-cz.xml
new file mode 100644
index 000000000..ef47e5f3f
--- /dev/null
+++ b/tex/context/interface/keys-cz.xml
@@ -0,0 +1,1590 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='cz' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language cz -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Pridavek'/>
+ <cd:variable name='Balloon' value='Bublinka'/>
+ <cd:variable name='Character' value='Pismeno'/>
+ <cd:variable name='Characters' value='Pismena'/>
+ <cd:variable name='CloseDocument' value='ZavritDokument'/>
+ <cd:variable name='ExitViewer' value='UkoncitProhlizec'/>
+ <cd:variable name='FirstPage' value='PrvniStrana'/>
+ <cd:variable name='FitHeight' value='FitHeight'/>
+ <cd:variable name='FitWidth' value='FitWidth'/>
+ <cd:variable name='GotoPage' value='JdiNaStranku'/>
+ <cd:variable name='Greek' value='Recky'/>
+ <cd:variable name='Help' value='Napoveda'/>
+ <cd:variable name='HideField' value='SkryjPole'/>
+ <cd:variable name='HideLayer' value='HideLayer'/>
+ <cd:variable name='Key' value='Klavesa'/>
+ <cd:variable name='LastPage' value='PosledniStrana'/>
+ <cd:variable name='LoadForm' value='NacistFormular'/>
+ <cd:variable name='MONTH' value='MESIC'/>
+ <cd:variable name='New' value='Novy'/>
+ <cd:variable name='NextJump' value='NasledujiciSkok'/>
+ <cd:variable name='NextPage' value='DalsiStrana'/>
+ <cd:variable name='Numbers' value='Cisla'/>
+ <cd:variable name='OpenNamedDocument' value='OpenNamedDocument'/>
+ <cd:variable name='Paragraph' value='Odstavec'/>
+ <cd:variable name='PauseMovie' value='PozastavitFilm'/>
+ <cd:variable name='PauseRendering' value='PauseRendering'/>
+ <cd:variable name='PauseSound' value='PozastavitZvuk'/>
+ <cd:variable name='PreviousJump' value='PredchoziSkok'/>
+ <cd:variable name='PreviousPage' value='PredchoziStrana'/>
+ <cd:variable name='PrintDocument' value='VytisknoutDokument'/>
+ <cd:variable name='Query' value='Query'/>
+ <cd:variable name='QueryAgain' value='QueryAgain'/>
+ <cd:variable name='ResetForm' value='ResetFormulare'/>
+ <cd:variable name='ResumeMovie' value='PokracovatFilm'/>
+ <cd:variable name='ResumeRendering' value='ResumeRendering'/>
+ <cd:variable name='ResumeSound' value='PokracovatZvuk'/>
+ <cd:variable name='Romannumerals' value='Rimskecislice'/>
+ <cd:variable name='SaveDocument' value='UlozitDokument'/>
+ <cd:variable name='SaveForm' value='UlozitFormular'/>
+ <cd:variable name='SaveNamedDocument' value='SaveNamedDocument'/>
+ <cd:variable name='SearchAgain' value='HledatZnovu'/>
+ <cd:variable name='SearchDocument' value='ProhledatDokument'/>
+ <cd:variable name='ShowBookmarks' value='UkazZalozky'/>
+ <cd:variable name='ShowField' value='UkazPole'/>
+ <cd:variable name='ShowThumbs' value='UkazNahledy'/>
+ <cd:variable name='StartMovie' value='SpustitFilm'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='StartZvuk'/>
+ <cd:variable name='StopMovie' value='ZastavitFilm'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='StopZvuk'/>
+ <cd:variable name='SubmitForm' value='PoslatFormular'/>
+ <cd:variable name='ToggleLayer' value='ToggleLayer'/>
+ <cd:variable name='ToggleViewer' value='ZmenitProhlizec'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='NapovedaProhlizece'/>
+ <cd:variable name='WEEKDAY' value='VSEDNIDEN'/>
+ <cd:variable name='WORD' value='SLOVO'/>
+ <cd:variable name='abbreviation' value='zkratka'/>
+ <cd:variable name='abbreviations' value='zkratky'/>
+ <cd:variable name='absolute' value='absolutni'/>
+ <cd:variable name='action' value='akce'/>
+ <cd:variable name='after' value='po'/>
+ <cd:variable name='all' value='vse'/>
+ <cd:variable name='always' value='vzdy'/>
+ <cd:variable name='appendices' value='dodatky'/>
+ <cd:variable name='appendix' value='dodatek'/>
+ <cd:variable name='april' value='duben'/>
+ <cd:variable name='atmargin' value='naokraji'/>
+ <cd:variable name='atpage' value='nastrance'/>
+ <cd:variable name='august' value='srpen'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autouvod'/>
+ <cd:variable name='back' value='zpet'/>
+ <cd:variable name='background' value='pozadi'/>
+ <cd:variable name='backmatter' value='epilogy'/>
+ <cd:variable name='backpart' value='epilog'/>
+ <cd:variable name='backspace' value='zpetnamezera'/>
+ <cd:variable name='backward' value='zpet'/>
+ <cd:variable name='before' value='pred'/>
+ <cd:variable name='big' value='velke'/>
+ <cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigpreference' value='vysokapriorita'/>
+ <cd:variable name='blank' value='prazdny'/>
+ <cd:variable name='blockquote' value='blockquote'/>
+ <cd:variable name='bodymatter' value='hlavnicasti'/>
+ <cd:variable name='bodypart' value='hlavnicast'/>
+ <cd:variable name='bold' value='tucne'/>
+ <cd:variable name='bolditalic' value='tucnekurzivni'/>
+ <cd:variable name='boldslanted' value='tucnesklonene'/>
+ <cd:variable name='bookmark' value='zalozka'/>
+ <cd:variable name='both' value='obe'/>
+ <cd:variable name='bottom' value='spodek'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='siroky'/>
+ <cd:variable name='buffer' value='buffer'/>
+ <cd:variable name='by' value='skrz'/>
+ <cd:variable name='calligraphic' value='kaligraficke'/>
+ <cd:variable name='cap' value='kap'/>
+ <cd:variable name='capital' value='kapitalky'/>
+ <cd:variable name='center' value='center'/>
+ <cd:variable name='chapter' value='kapitola'/>
+ <cd:variable name='character' value='pismeno'/>
+ <cd:variable name='characters' value='pismena'/>
+ <cd:variable name='color' value='barevne'/>
+ <cd:variable name='column' value='column'/>
+ <cd:variable name='columns' value='sloupce'/>
+ <cd:variable name='command' value='prikaz'/>
+ <cd:variable name='commands' value='prikazy'/>
+ <cd:variable name='comment' value='komentar'/>
+ <cd:variable name='component' value='komponenta'/>
+ <cd:variable name='concept' value='koncept'/>
+ <cd:variable name='content' value='obsah'/>
+ <cd:variable name='contents' value='obsah'/>
+ <cd:variable name='continue' value='pokracovat'/>
+ <cd:variable name='controls' value='controls'/>
+ <cd:variable name='conversion' value='konverze'/>
+ <cd:variable name='current' value='aktualni'/>
+ <cd:variable name='cutspace' value='cutspace'/>
+ <cd:variable name='date' value='datum'/>
+ <cd:variable name='day' value='den'/>
+ <cd:variable name='december' value='prosinec'/>
+ <cd:variable name='default' value='implicitni'/>
+ <cd:variable name='depth' value='podlehloubky'/>
+ <cd:variable name='description' value='popis'/>
+ <cd:variable name='disable' value='zablokovat'/>
+ <cd:variable name='display' value='obrazovka'/>
+ <cd:variable name='dot' value='tecka'/>
+ <cd:variable name='doublesided' value='dvoustranny'/>
+ <cd:variable name='each' value='kazdy'/>
+ <cd:variable name='edge' value='hrana'/>
+ <cd:variable name='empty' value='prazdne'/>
+ <cd:variable name='endnote' value='endnote'/>
+ <cd:variable name='enumeration' value='vycet'/>
+ <cd:variable name='environment' value='prostredi'/>
+ <cd:variable name='even' value='sude'/>
+ <cd:variable name='external' value='externi'/>
+ <cd:variable name='fact' value='fakt'/>
+ <cd:variable name='february' value='unor'/>
+ <cd:variable name='figure' value='obrazek'/>
+ <cd:variable name='figures' value='obrazky'/>
+ <cd:variable name='file' value='soubor'/>
+ <cd:variable name='final' value='finalni'/>
+ <cd:variable name='first' value='prvni'/>
+ <cd:variable name='firstcolumn' value='firstcolumn'/>
+ <cd:variable name='firstpage' value='prvnistranka'/>
+ <cd:variable name='firstsubpage' value='prvnipodstranka'/>
+ <cd:variable name='fit' value='prizpusobive'/>
+ <cd:variable name='five' value='pet'/>
+ <cd:variable name='fix' value='fixuj'/>
+ <cd:variable name='fixed' value='fixne'/>
+ <cd:variable name='flexible' value='prizpusobive'/>
+ <cd:variable name='float' value='plvouciobjekt'/>
+ <cd:variable name='flushinner' value='flushinner'/>
+ <cd:variable name='flushleft' value='flushleft'/>
+ <cd:variable name='flushouter' value='flushouter'/>
+ <cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='footer' value='upati'/>
+ <cd:variable name='footnote' value='poznamkapodcarou'/>
+ <cd:variable name='force' value='sila'/>
+ <cd:variable name='foreground' value='popredi'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='rovnice'/>
+ <cd:variable name='formulae' value='rovnice'/>
+ <cd:variable name='forward' value='vpred'/>
+ <cd:variable name='four' value='ctyri'/>
+ <cd:variable name='frame' value='ramecek'/>
+ <cd:variable name='framedtext' value='oramovanytext'/>
+ <cd:variable name='friday' value='patek'/>
+ <cd:variable name='frontmatter' value='prednicasti'/>
+ <cd:variable name='frontpart' value='prednicast'/>
+ <cd:variable name='global' value='globalne'/>
+ <cd:variable name='graphic' value='graf'/>
+ <cd:variable name='graphics' value='grafy'/>
+ <cd:variable name='gray' value='seda'/>
+ <cd:variable name='greek' value='recky'/>
+ <cd:variable name='grid' value='mrizka'/>
+ <cd:variable name='halfline' value='pulradku'/>
+ <cd:variable name='handwritten' value='rukopisne'/>
+ <cd:variable name='hang' value='zaveseni'/>
+ <cd:variable name='hanging' value='visici'/>
+ <cd:variable name='head' value='hlavicka'/>
+ <cd:variable name='header' value='zahlavi'/>
+ <cd:variable name='height' value='vyska'/>
+ <cd:variable name='helptext' value='textnapovedy'/>
+ <cd:variable name='hencefore' value='vyse'/>
+ <cd:variable name='here' value='zde'/>
+ <cd:variable name='hereafter' value='nize'/>
+ <cd:variable name='hidden' value='skryte'/>
+ <cd:variable name='hiding' value='skryt'/>
+ <cd:variable name='high' value='vysoko'/>
+ <cd:variable name='horizontal' value='horizontalne'/>
+ <cd:variable name='hyphenated' value='hyphenated'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='mezi'/>
+ <cd:variable name='index' value='rejstrik'/>
+ <cd:variable name='indices' value='rejstriky'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='inherit'/>
+ <cd:variable name='inleft' value='vlevo'/>
+ <cd:variable name='inmargin' value='naokraji'/>
+ <cd:variable name='inner' value='uvnitr'/>
+ <cd:variable name='inneredge' value='inneredge'/>
+ <cd:variable name='innermargin' value='innermargin'/>
+ <cd:variable name='inright' value='vpravo'/>
+ <cd:variable name='interaction' value='interakce'/>
+ <cd:variable name='interactionmenu' value='interaktivnimenu'/>
+ <cd:variable name='intermezzi' value='intermezzi'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='dotextu'/>
+ <cd:variable name='intro' value='uvod'/>
+ <cd:variable name='italic' value='kurziva'/>
+ <cd:variable name='italicbold' value='kurzivnitucne'/>
+ <cd:variable name='item' value='polozka'/>
+ <cd:variable name='itemize' value='vycet'/>
+ <cd:variable name='its' value='pol'/>
+ <cd:variable name='january' value='leden'/>
+ <cd:variable name='joinedup' value='spojeno'/>
+ <cd:variable name='july' value='cervenec'/>
+ <cd:variable name='june' value='cerven'/>
+ <cd:variable name='keep' value='drzet'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='popisek'/>
+ <cd:variable name='landscape' value='nasirku'/>
+ <cd:variable name='last' value='posledni'/>
+ <cd:variable name='lastcolumn' value='lastcolumn'/>
+ <cd:variable name='lastpage' value='poslednistrana'/>
+ <cd:variable name='lastpagenumber' value='lastpagenumber'/>
+ <cd:variable name='lastsubpage' value='poslaednipodstranka'/>
+ <cd:variable name='left' value='vlevo'/>
+ <cd:variable name='leftedge' value='levahrana'/>
+ <cd:variable name='lefthanging' value='lefthanging'/>
+ <cd:variable name='leftmargin' value='levyokraj'/>
+ <cd:variable name='leftpage' value='levastranka'/>
+ <cd:variable name='legend' value='legenda'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='radek'/>
+ <cd:variable name='linenote' value='linenote'/>
+ <cd:variable name='lines' value='radky'/>
+ <cd:variable name='list' value='seznam'/>
+ <cd:variable name='local' value='lokalne'/>
+ <cd:variable name='localenvironment' value='lokalnihoprostredi'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='loga'/>
+ <cd:variable name='lohi' value='nivy'/>
+ <cd:variable name='loose' value='uvolnene'/>
+ <cd:variable name='low' value='nizko'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='zlom'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='brezen'/>
+ <cd:variable name='margin' value='marginalie'/>
+ <cd:variable name='marginedge' value='textovahrana'/>
+ <cd:variable name='margintitle' value='titulmarginalie'/>
+ <cd:variable name='marking' value='znaceni'/>
+ <cd:variable name='mathalignment' value='mathalignment'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='mathmatrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='may' value='kveten'/>
+ <cd:variable name='mediaeval' value='stredoveky'/>
+ <cd:variable name='medium' value='stredni'/>
+ <cd:variable name='middle' value='nastred'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='minheight' value='minvyska'/>
+ <cd:variable name='minwidth' value='minsirka'/>
+ <cd:variable name='mirrored' value='zrcadleno'/>
+ <cd:variable name='monday' value='pondeli'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='mesic'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='jmeno'/>
+ <cd:variable name='narrow' value='uzky'/>
+ <cd:variable name='negative' value='negativ'/>
+ <cd:variable name='never' value='nikdy'/>
+ <cd:variable name='new' value='novy'/>
+ <cd:variable name='next' value='dalsi'/>
+ <cd:variable name='nextevenpage' value='dalsisudastranka'/>
+ <cd:variable name='nextoddpage' value='dalsilichastranka'/>
+ <cd:variable name='nextpage' value='dalsistranka'/>
+ <cd:variable name='nextsubpage' value='dalsipodstranka'/>
+ <cd:variable name='no' value='ne'/>
+ <cd:variable name='nocheck' value='nocheck'/>
+ <cd:variable name='nofit' value='nofit'/>
+ <cd:variable name='nogrid' value='nogrid'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='zadneznaceni'/>
+ <cd:variable name='none' value='zadny'/>
+ <cd:variable name='nonumber' value='nonumber'/>
+ <cd:variable name='normal' value='normalni'/>
+ <cd:variable name='nospacing' value='nospacing'/>
+ <cd:variable name='not' value='ne'/>
+ <cd:variable name='nothanging' value='nothanging'/>
+ <cd:variable name='nothyphenated' value='nothyphenated'/>
+ <cd:variable name='november' value='listopad'/>
+ <cd:variable name='nowhere' value='nikde'/>
+ <cd:variable name='nowhite' value='zadnabila'/>
+ <cd:variable name='number' value='cislo'/>
+ <cd:variable name='numbers' value='cisla'/>
+ <cd:variable name='october' value='rijen'/>
+ <cd:variable name='odd' value='liche'/>
+ <cd:variable name='off' value='vyp'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='old'/>
+ <cd:variable name='on' value='zap'/>
+ <cd:variable name='one' value='jedna'/>
+ <cd:variable name='opposite' value='naproti'/>
+ <cd:variable name='outer' value='vnejsi'/>
+ <cd:variable name='outeredge' value='outeredge'/>
+ <cd:variable name='outermargin' value='outermargin'/>
+ <cd:variable name='overlay' value='prekryv'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='packed' value='zhustene'/>
+ <cd:variable name='page' value='stranka'/>
+ <cd:variable name='pagecomment' value='komentarstranky'/>
+ <cd:variable name='pagenumber' value='cislostranky'/>
+ <cd:variable name='paper' value='papir'/>
+ <cd:variable name='paragraph' value='odstavec'/>
+ <cd:variable name='part' value='cast'/>
+ <cd:variable name='positive' value='positiv'/>
+ <cd:variable name='postponing' value='odlozit'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='nastaveni'/>
+ <cd:variable name='preview' value='nahled'/>
+ <cd:variable name='previous' value='predchozi'/>
+ <cd:variable name='previousevenpage' value='predchozisudastranka'/>
+ <cd:variable name='previousoddpage' value='predchozilichastranka'/>
+ <cd:variable name='previouspage' value='predchozistranka'/>
+ <cd:variable name='previoussubpage' value='predchozipodstranka'/>
+ <cd:variable name='printable' value='tisknutelne'/>
+ <cd:variable name='process' value='process'/>
+ <cd:variable name='product' value='produkt'/>
+ <cd:variable name='program' value='program'/>
+ <cd:variable name='project' value='projekt'/>
+ <cd:variable name='protected' value='chranene'/>
+ <cd:variable name='quadruple' value='ctyrnasobny'/>
+ <cd:variable name='quotation' value='citace'/>
+ <cd:variable name='quote' value='citovat'/>
+ <cd:variable name='ran' value='rozsah'/>
+ <cd:variable name='random' value='nahodny'/>
+ <cd:variable name='readonly' value='pouzeprocteni'/>
+ <cd:variable name='rectangular' value='pravouhly'/>
+ <cd:variable name='referral' value='znacka'/>
+ <cd:variable name='register' value='rejstrik'/>
+ <cd:variable name='regular' value='pravidelne'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relativni'/>
+ <cd:variable name='repeat' value='opakovat'/>
+ <cd:variable name='required' value='pozadovane'/>
+ <cd:variable name='reset' value='reset'/>
+ <cd:variable name='reverse' value='reverse'/>
+ <cd:variable name='right' value='vpravo'/>
+ <cd:variable name='rightedge' value='pravahrana'/>
+ <cd:variable name='righthanging' value='righthanging'/>
+ <cd:variable name='rightmargin' value='pravyokraj'/>
+ <cd:variable name='rightpage' value='pravastranka'/>
+ <cd:variable name='roman' value='antikva'/>
+ <cd:variable name='romannumerals' value='rimskecislice'/>
+ <cd:variable name='rotate' value='otoc'/>
+ <cd:variable name='rotated' value='otoceno'/>
+ <cd:variable name='round' value='zaobleny'/>
+ <cd:variable name='row' value='row'/>
+ <cd:variable name='rule' value='linka'/>
+ <cd:variable name='samepage' value='samepage'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sanstucne'/>
+ <cd:variable name='sansserif' value='bezserifu'/>
+ <cd:variable name='saturday' value='sobota'/>
+ <cd:variable name='screen' value='rastr'/>
+ <cd:variable name='section' value='sekce'/>
+ <cd:variable name='sectionblockenvironment' value='sectionblockenvironment'/>
+ <cd:variable name='sectionnumber' value='cislooddilu'/>
+ <cd:variable name='see' value='viz'/>
+ <cd:variable name='september' value='zari'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='semknuto'/>
+ <cd:variable name='setups' value='einstellungen'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='singlesided' value='jednostranne'/>
+ <cd:variable name='slanted' value='sklonene'/>
+ <cd:variable name='slantedbold' value='sklonenetucne'/>
+ <cd:variable name='small' value='male'/>
+ <cd:variable name='smallbodyfont' value='smallbodyfont'/>
+ <cd:variable name='smallbold' value='maletucne'/>
+ <cd:variable name='smallbolditalic' value='maletucnekurzivni'/>
+ <cd:variable name='smallboldslanted' value='maletucnesklonene'/>
+ <cd:variable name='smallcaps' value='kapitalky'/>
+ <cd:variable name='smallitalic' value='malekurzivni'/>
+ <cd:variable name='smallitalicbold' value='malekurzivnitucne'/>
+ <cd:variable name='smallnormal' value='malenormalni'/>
+ <cd:variable name='smallslanted' value='malesklonene'/>
+ <cd:variable name='smallslantedbold' value='malesklonenetucne'/>
+ <cd:variable name='smalltype' value='maletype'/>
+ <cd:variable name='somewhere' value='nekde'/>
+ <cd:variable name='sorted' value='tridene'/>
+ <cd:variable name='space' value='mezera'/>
+ <cd:variable name='spacing' value='mezerovani'/>
+ <cd:variable name='speech' value='speech'/>
+ <cd:variable name='split' value='split'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standardni'/>
+ <cd:variable name='start' value='start'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='stop'/>
+ <cd:variable name='stopper' value='predel'/>
+ <cd:variable name='stretch' value='natahnout'/>
+ <cd:variable name='strict' value='striktni'/>
+ <cd:variable name='strong' value='sterk'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='pod'/>
+ <cd:variable name='subbackward' value='podzpet'/>
+ <cd:variable name='subformula' value='subrovnice'/>
+ <cd:variable name='subforward' value='podvpred'/>
+ <cd:variable name='subject' value='tema'/>
+ <cd:variable name='subpage' value='podstranka'/>
+ <cd:variable name='subsection' value='podsekce'/>
+ <cd:variable name='subsubject' value='podtema'/>
+ <cd:variable name='subsubsection' value='podpodsekce'/>
+ <cd:variable name='subsubsubject' value='podpodtema'/>
+ <cd:variable name='subsubsubsection' value='podpodpodsekce'/>
+ <cd:variable name='subsubsubsubject' value='podpodpodtema'/>
+ <cd:variable name='subsubsubsubsection' value='podpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubject' value='podpodpodpodtema'/>
+ <cd:variable name='subsubsubsubsubsection' value='podpodpodpodpodsekce'/>
+ <cd:variable name='subsubsubsubsubsubject' value='podpodpodpodpodtema'/>
+ <cd:variable name='sunday' value='nedele'/>
+ <cd:variable name='support' value='podpora'/>
+ <cd:variable name='sym' value='sym'/>
+ <cd:variable name='symbol' value='symbol'/>
+ <cd:variable name='synchronize' value='synchronize'/>
+ <cd:variable name='system' value='system'/>
+ <cd:variable name='table' value='tabulka'/>
+ <cd:variable name='tablehead' value='zahlavitabulky'/>
+ <cd:variable name='tables' value='tabulky'/>
+ <cd:variable name='tabletail' value='konectabulky'/>
+ <cd:variable name='tabulate' value='tabelator'/>
+ <cd:variable name='tabulatehead' value='tabulatehead'/>
+ <cd:variable name='tabulatetail' value='tabulatetail'/>
+ <cd:variable name='tall' value='vysoko'/>
+ <cd:variable name='teletype' value='strojopis'/>
+ <cd:variable name='temporary' value='docasne'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='text'/>
+ <cd:variable name='three' value='tri'/>
+ <cd:variable name='thursday' value='ctvrtek'/>
+ <cd:variable name='title' value='titul'/>
+ <cd:variable name='toggle' value='toggle'/>
+ <cd:variable name='tolerant' value='tolerantni'/>
+ <cd:variable name='top' value='vrsek'/>
+ <cd:variable name='tuesday' value='utery'/>
+ <cd:variable name='two' value='dve'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='opis'/>
+ <cd:variable name='typing' value='typing'/>
+ <cd:variable name='unavailable' value='nedostupne'/>
+ <cd:variable name='unit' value='jednotka'/>
+ <cd:variable name='units' value='jednotky'/>
+ <cd:variable name='unknown' value='neznamy'/>
+ <cd:variable name='unpacked' value='rozbalene'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='uzito'/>
+ <cd:variable name='value' value='hodnota'/>
+ <cd:variable name='vertical' value='vertikalne'/>
+ <cd:variable name='very' value='velmi'/>
+ <cd:variable name='verystrict' value='velmistriktni'/>
+ <cd:variable name='verytolerant' value='velmitolerantni'/>
+ <cd:variable name='weak' value='zwak'/>
+ <cd:variable name='wednesday' value='streda'/>
+ <cd:variable name='week' value='tyden'/>
+ <cd:variable name='weekday' value='vsedniden'/>
+ <cd:variable name='white' value='bily'/>
+ <cd:variable name='wide' value='siroce'/>
+ <cd:variable name='width' value='sirka'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='rok'/>
+ <cd:variable name='yes' value='ano'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language cz -->
+
+ <cd:constants>
+ <cd:constant name='action' value='akce'/>
+ <cd:constant name='address' value='adresa'/>
+ <cd:constant name='after' value='po'/>
+ <cd:constant name='afterhead' value='pohlavicce'/>
+ <cd:constant name='afterkey' value='klavesapo'/>
+ <cd:constant name='align' value='zarovnani'/>
+ <cd:constant name='aligncharacter' value='aligncharacter'/>
+ <cd:constant name='alignmentcharacter' value='alignmentcharacter'/>
+ <cd:constant name='aligntitle' value='zarovnejtitul'/>
+ <cd:constant name='alternative' value='alternativa'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='sipka'/>
+ <cd:constant name='at' value='u'/>
+ <cd:constant name='author' value='autor'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autoostreni'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autosirka'/>
+ <cd:constant name='axis' value='osa'/>
+ <cd:constant name='background' value='pozadi'/>
+ <cd:constant name='backgroundcolor' value='barvapozadi'/>
+ <cd:constant name='backgroundcorner' value='rohpozadi'/>
+ <cd:constant name='backgrounddepth' value='hloubkapozadi'/>
+ <cd:constant name='backgroundoffset' value='offsetpozadi'/>
+ <cd:constant name='backgroundradius' value='polomerpozadi'/>
+ <cd:constant name='backgroundscreen' value='rastrpozadi'/>
+ <cd:constant name='backspace' value='zpetnamezera'/>
+ <cd:constant name='balance' value='rovnovaha'/>
+ <cd:constant name='before' value='pred'/>
+ <cd:constant name='beforehead' value='predhlavickou'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='velky'/>
+ <cd:constant name='blank' value='prazdny'/>
+ <cd:constant name='blockway' value='dobloku'/>
+ <cd:constant name='bodyfont' value='zakladnifont'/>
+ <cd:constant name='bookmark' value='zalozka'/>
+ <cd:constant name='bottom' value='spodek'/>
+ <cd:constant name='bottomdistance' value='vzdalenostspodku'/>
+ <cd:constant name='bottomframe' value='ramecekdole'/>
+ <cd:constant name='bottomoffset' value='offsetspodku'/>
+ <cd:constant name='bottomspace' value='bottomspace'/>
+ <cd:constant name='bottomstate' value='statusspodku'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='pocitat'/>
+ <cd:constant name='ccommand' value='cprikaz'/>
+ <cd:constant name='click' value='klik'/>
+ <cd:constant name='clickin' value='klikuvnitr'/>
+ <cd:constant name='clickout' value='klikvne'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='zavriakci'/>
+ <cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepageaction' value='akcezavrenistranky'/>
+ <cd:constant name='closesymbol' value='closesymbol'/>
+ <cd:constant name='color' value='barva'/>
+ <cd:constant name='column' value='sloupec'/>
+ <cd:constant name='columndistance' value='vzdalenostsloupcu'/>
+ <cd:constant name='columns' value='sloupce'/>
+ <cd:constant name='command' value='prikaz'/>
+ <cd:constant name='commandafter' value='prikazpo'/>
+ <cd:constant name='commandbefore' value='predchoziprikaz'/>
+ <cd:constant name='commands' value='prikazy'/>
+ <cd:constant name='component' value='component'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='compress'/>
+ <cd:constant name='continue' value='pokracovat'/>
+ <cd:constant name='contrastcolor' value='kontrastnibarva'/>
+ <cd:constant name='controls' value='controls'/>
+ <cd:constant name='conversion' value='konverze'/>
+ <cd:constant name='convertfile' value='konverzesouboru'/>
+ <cd:constant name='corner' value='roh'/>
+ <cd:constant name='coupling' value='propojeni'/>
+ <cd:constant name='couplingway' value='zpusobpropojeni'/>
+ <cd:constant name='criterium' value='kriterium'/>
+ <cd:constant name='current' value='aktualni'/>
+ <cd:constant name='cutspace' value='cutspace'/>
+ <cd:constant name='dash' value='pomlcka'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='date' value='datum'/>
+ <cd:constant name='deepnumbercommand' value='deepnumbercommand'/>
+ <cd:constant name='deeptextcommand' value='deeptextcommand'/>
+ <cd:constant name='default' value='implicitni'/>
+ <cd:constant name='delay' value='prodleva'/>
+ <cd:constant name='depth' value='hloubka'/>
+ <cd:constant name='depthcorrection' value='korekcehloubky'/>
+ <cd:constant name='direction' value='smer'/>
+ <cd:constant name='directory' value='adresar'/>
+ <cd:constant name='display' value='obrazovka'/>
+ <cd:constant name='distance' value='vzdalenost'/>
+ <cd:constant name='dot' value='tecka'/>
+ <cd:constant name='doublesided' value='oboustranne'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='hrana'/>
+ <cd:constant name='edgedistance' value='vzdalenosthrany'/>
+ <cd:constant name='empty' value='prazdne'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='sudamarginalie'/>
+ <cd:constant name='expansion' value='expanzen'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='faktor'/>
+ <cd:constant name='fallback' value='fallback'/>
+ <cd:constant name='family' value='rodina'/>
+ <cd:constant name='fieldbackgroundcolor' value='barvapozadipole'/>
+ <cd:constant name='fieldframecolor' value='barvarameckupole'/>
+ <cd:constant name='fieldlayer' value='fieldlayer'/>
+ <cd:constant name='fieldoffset' value='offsetpole'/>
+ <cd:constant name='file' value='soubor'/>
+ <cd:constant name='focus' value='zaostreni'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusout'/>
+ <cd:constant name='footer' value='upati'/>
+ <cd:constant name='footerdistance' value='vzdalenostupati'/>
+ <cd:constant name='footerstate' value='statusupati'/>
+ <cd:constant name='foregroundcolor' value='foregroundcolor'/>
+ <cd:constant name='foregroundstyle' value='foregroundstyle'/>
+ <cd:constant name='format' value='formatovat'/>
+ <cd:constant name='frame' value='ramecek'/>
+ <cd:constant name='framecolor' value='barvaramecku'/>
+ <cd:constant name='framecorner' value='rohramecku'/>
+ <cd:constant name='framedepth' value='hloubkaramecku'/>
+ <cd:constant name='frameoffset' value='offsetramecku'/>
+ <cd:constant name='frameradius' value='polomerramecku'/>
+ <cd:constant name='frames' value='ramecky'/>
+ <cd:constant name='from' value='z'/>
+ <cd:constant name='get' value='ziskat'/>
+ <cd:constant name='global' value='globalne'/>
+ <cd:constant name='grid' value='mrizka'/>
+ <cd:constant name='hang' value='zaveseni'/>
+ <cd:constant name='headcolor' value='barvahlavicky'/>
+ <cd:constant name='headcommand' value='headcommand'/>
+ <cd:constant name='headconversion' value='konverzehlavicky'/>
+ <cd:constant name='header' value='zahlavi'/>
+ <cd:constant name='headerdistance' value='vzdalenostzahlavi'/>
+ <cd:constant name='headerstate' value='statuszahlavi'/>
+ <cd:constant name='headlabel' value='popisekhlavicky'/>
+ <cd:constant name='headnumber' value='cislonadpisu'/>
+ <cd:constant name='headstyle' value='stylhlavicky'/>
+ <cd:constant name='height' value='vyska'/>
+ <cd:constant name='hfactor' value='vfaktor'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horoffset' value='horoffset'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='iprikaz'/>
+ <cd:constant name='in' value='v'/>
+ <cd:constant name='inbetween' value='mezi'/>
+ <cd:constant name='increment' value='zvysit'/>
+ <cd:constant name='incrementnumber' value='zvysujicicislo'/>
+ <cd:constant name='indenting' value='odsazovani'/>
+ <cd:constant name='indentnext' value='odsadpristi'/>
+ <cd:constant name='indicator' value='indikator'/>
+ <cd:constant name='inner' value='vnitrni'/>
+ <cd:constant name='innermargin' value='innermargin'/>
+ <cd:constant name='inputfile' value='inputfile'/>
+ <cd:constant name='interaction' value='interakce'/>
+ <cd:constant name='interlinespace' value='meziradkovamezera'/>
+ <cd:constant name='itemalign' value='itemalign'/>
+ <cd:constant name='items' value='polozky'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keyword' value='keyword'/>
+ <cd:constant name='label' value='popisek'/>
+ <cd:constant name='left' value='vlevo'/>
+ <cd:constant name='leftcolor' value='barvavlevo'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='levahrana'/>
+ <cd:constant name='leftedgedistance' value='vzdalenostlevehrany'/>
+ <cd:constant name='leftframe' value='ramecekvlevo'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='levyokraj'/>
+ <cd:constant name='leftmargindistance' value='vzdalenostlevehookraje'/>
+ <cd:constant name='leftoffset' value='levyoffset'/>
+ <cd:constant name='leftquotation' value='citacevlevo'/>
+ <cd:constant name='leftquote' value='citovatvlevo'/>
+ <cd:constant name='leftsentence' value='vetavlevo'/>
+ <cd:constant name='leftspeech' value='leftspeech'/>
+ <cd:constant name='leftstyle' value='stylvlevo'/>
+ <cd:constant name='leftsubsentence' value='podvetavlevo'/>
+ <cd:constant name='lefttext' value='textvlevo'/>
+ <cd:constant name='leftwidth' value='sirkavlevo'/>
+ <cd:constant name='level' value='uroven'/>
+ <cd:constant name='levels' value='urovne'/>
+ <cd:constant name='limittext' value='limittext'/>
+ <cd:constant name='line' value='radek'/>
+ <cd:constant name='linecorrection' value='korekceradku'/>
+ <cd:constant name='lines' value='radky'/>
+ <cd:constant name='list' value='seznam'/>
+ <cd:constant name='listtext' value='listtext'/>
+ <cd:constant name='local' value='lokalne'/>
+ <cd:constant name='location' value='misto'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='loga'/>
+ <cd:constant name='marcolor' value='barvaznacky'/>
+ <cd:constant name='margin' value='marginalie'/>
+ <cd:constant name='margindistance' value='vzdalenostokraje'/>
+ <cd:constant name='marginedge' value='textovahrana'/>
+ <cd:constant name='marginedgetext' value='textmarginalnihookraje'/>
+ <cd:constant name='margintext' value='textmarginalie'/>
+ <cd:constant name='marking' value='znaceni'/>
+ <cd:constant name='marstyle' value='stylsnacky'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxheight' value='maxvyska'/>
+ <cd:constant name='maxwidth' value='maxsirka'/>
+ <cd:constant name='menu' value='menu'/>
+ <cd:constant name='method' value='metoda'/>
+ <cd:constant name='middle' value='stredni'/>
+ <cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middletext' value='strednitext'/>
+ <cd:constant name='midsentence' value='midsentence'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='mindepth'/>
+ <cd:constant name='minheight' value='minvyska'/>
+ <cd:constant name='minwidth' value='minsirka'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='jmeno'/>
+ <cd:constant name='nbottom' value='nspodek'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='dalsi'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nvlevo'/>
+ <cd:constant name='nlines' value='nradky'/>
+ <cd:constant name='norm' value='norm'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='nvpravo'/>
+ <cd:constant name='ntop' value='nvrsek'/>
+ <cd:constant name='number' value='cislo'/>
+ <cd:constant name='numbercolor' value='barvacisla'/>
+ <cd:constant name='numbercommand' value='ciselnyprikaz'/>
+ <cd:constant name='numberdistance' value='numberdistance'/>
+ <cd:constant name='numbering' value='cislovani'/>
+ <cd:constant name='numberseparator' value='oddelovaccisla'/>
+ <cd:constant name='numberstyle' value='stylcisla'/>
+ <cd:constant name='numberwidth' value='numberwidth'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='objekt'/>
+ <cd:constant name='obstruction' value='prekazka'/>
+ <cd:constant name='oddmargin' value='lichyokraj'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='otevriakci'/>
+ <cd:constant name='openpageaction' value='akceotevrenistranky'/>
+ <cd:constant name='option' value='volba'/>
+ <cd:constant name='orientation' value='orientation'/>
+ <cd:constant name='outermargin' value='outermargin'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='vlastnicislo'/>
+ <cd:constant name='page' value='stranka'/>
+ <cd:constant name='pageboundaries' value='hranicestranky'/>
+ <cd:constant name='pagecolor' value='barvastranky'/>
+ <cd:constant name='pagecommand' value='strankovyprikaz'/>
+ <cd:constant name='pagenumber' value='cislostranky'/>
+ <cd:constant name='pagestate' value='pagestate'/>
+ <cd:constant name='pagestyle' value='stylstranky'/>
+ <cd:constant name='palet' value='paleta'/>
+ <cd:constant name='paper' value='papir'/>
+ <cd:constant name='paragraph' value='odstavec'/>
+ <cd:constant name='place' value='umistit'/>
+ <cd:constant name='placehead' value='umistihlavicku'/>
+ <cd:constant name='placestopper' value='predelmista'/>
+ <cd:constant name='position' value='position'/>
+ <cd:constant name='prefix' value='prefix'/>
+ <cd:constant name='preset' value='prednastaveni'/>
+ <cd:constant name='preview' value='nahled'/>
+ <cd:constant name='previous' value='predchozi'/>
+ <cd:constant name='previousnumber' value='predchozicislo'/>
+ <cd:constant name='process' value='process'/>
+ <cd:constant name='radius' value='polomer'/>
+ <cd:constant name='random' value='nahodne'/>
+ <cd:constant name='reduction' value='redukce'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='reference' value='odkaz'/>
+ <cd:constant name='referencing' value='odkazujici'/>
+ <cd:constant name='regionin' value='oblastuvnitr'/>
+ <cd:constant name='regionout' value='oblastvne'/>
+ <cd:constant name='repeat' value='opakovat'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='resetnumber'/>
+ <cd:constant name='resolution' value='rozliseni'/>
+ <cd:constant name='right' value='vpravo'/>
+ <cd:constant name='rightcolor' value='barvavpravo'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='pravahrana'/>
+ <cd:constant name='rightedgedistance' value='vzdalenostpravehrany'/>
+ <cd:constant name='rightframe' value='ramecekvpravo'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='pravyokraj'/>
+ <cd:constant name='rightmargindistance' value='vzdalenostpravehookraje'/>
+ <cd:constant name='rightoffset' value='pravyoffset'/>
+ <cd:constant name='rightquotation' value='citacevpravo'/>
+ <cd:constant name='rightquote' value='citovatvpravo'/>
+ <cd:constant name='rightsentence' value='vetavpravo'/>
+ <cd:constant name='rightspeech' value='rightspeech'/>
+ <cd:constant name='rightstyle' value='stylvpravo'/>
+ <cd:constant name='rightsubsentence' value='podvetavpravo'/>
+ <cd:constant name='righttext' value='textvpravo'/>
+ <cd:constant name='rightwidth' value='sirkavpravo'/>
+ <cd:constant name='rotation' value='rotace'/>
+ <cd:constant name='rule' value='linka'/>
+ <cd:constant name='rulecolor' value='barvalinky'/>
+ <cd:constant name='rulethickness' value='tloustkalinky'/>
+ <cd:constant name='samepage' value='stejnastranka'/>
+ <cd:constant name='sample' value='vzor'/>
+ <cd:constant name='scale' value='meritko'/>
+ <cd:constant name='scope' value='rozsah'/>
+ <cd:constant name='screen' value='rastr'/>
+ <cd:constant name='section' value='oddil'/>
+ <cd:constant name='sectionnumber' value='cislooddilu'/>
+ <cd:constant name='separator' value='oddelovac'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='setups'/>
+ <cd:constant name='side' value='pocitat'/>
+ <cd:constant name='sidealign' value='sidealign'/>
+ <cd:constant name='sidemethod' value='sidemethod'/>
+ <cd:constant name='sidespaceafter' value='bocnimezeraza'/>
+ <cd:constant name='sidespacebefore' value='bocnimezerapred'/>
+ <cd:constant name='sign' value='znak'/>
+ <cd:constant name='size' value='velikost'/>
+ <cd:constant name='small' value='male'/>
+ <cd:constant name='sorttype' value='sorttype'/>
+ <cd:constant name='source' value='zdroj'/>
+ <cd:constant name='space' value='mezera'/>
+ <cd:constant name='spaceafter' value='mezeraza'/>
+ <cd:constant name='spacebefore' value='mezerapred'/>
+ <cd:constant name='spaceinbetween' value='spaceinbetween'/>
+ <cd:constant name='spacing' value='mezerovani'/>
+ <cd:constant name='split' value='split'/>
+ <cd:constant name='splitcolor' value='splitcolor'/>
+ <cd:constant name='splitmethod' value='splitmethod'/>
+ <cd:constant name='splitoffset' value='splitoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stack'/>
+ <cd:constant name='start' value='start'/>
+ <cd:constant name='state' value='status'/>
+ <cd:constant name='step' value='krok'/>
+ <cd:constant name='stop' value='stop'/>
+ <cd:constant name='stopper' value='predel'/>
+ <cd:constant name='stretch' value='natahnout'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='pismeno'/>
+ <cd:constant name='sub' value='pod'/>
+ <cd:constant name='subtitle' value='podtitulek'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symzarovnani'/>
+ <cd:constant name='symbol' value='symbol'/>
+ <cd:constant name='symbolset' value='sadasymbolu'/>
+ <cd:constant name='symcolor' value='barvasymbolu'/>
+ <cd:constant name='symstyle' value='stylsymboly'/>
+ <cd:constant name='synonym' value='synonymum'/>
+ <cd:constant name='synonymcolor' value='barvasynonyma'/>
+ <cd:constant name='synonymstyle' value='stylsynonyma'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='text'/>
+ <cd:constant name='textcolor' value='barvatextu'/>
+ <cd:constant name='textcommand' value='textovyprikaz'/>
+ <cd:constant name='textdistance' value='textdistance'/>
+ <cd:constant name='textlayer' value='textlayer'/>
+ <cd:constant name='textmargin' value='textmargin'/>
+ <cd:constant name='textmethod' value='textmethod'/>
+ <cd:constant name='textseparator' value='oddelovactextu'/>
+ <cd:constant name='textsize' value='velikosttextu'/>
+ <cd:constant name='textstate' value='statustextu'/>
+ <cd:constant name='textstyle' value='styltextu'/>
+ <cd:constant name='textwidth' value='sirkatextu'/>
+ <cd:constant name='title' value='titul'/>
+ <cd:constant name='titlecolor' value='barvatitulek'/>
+ <cd:constant name='titlecommand' value='titlecommand'/>
+ <cd:constant name='titledistance' value='vzdalenosttitulek'/>
+ <cd:constant name='titleleft' value='titleleft'/>
+ <cd:constant name='titleright' value='titleright'/>
+ <cd:constant name='titlestyle' value='styltitulek'/>
+ <cd:constant name='to' value='na'/>
+ <cd:constant name='tolerance' value='tolerance'/>
+ <cd:constant name='top' value='vrsek'/>
+ <cd:constant name='topdistance' value='vzdalenostvrsku'/>
+ <cd:constant name='topframe' value='rameceknahore'/>
+ <cd:constant name='topoffset' value='offsetvrsku'/>
+ <cd:constant name='topspace' value='svrchnimezera'/>
+ <cd:constant name='topstate' value='statusvrsku'/>
+ <cd:constant name='type' value='typ'/>
+ <cd:constant name='unit' value='jednotka'/>
+ <cd:constant name='unknownreference' value='neznamyodkaz'/>
+ <cd:constant name='urlalternative' value='urlalternativa'/>
+ <cd:constant name='urlspace' value='prostorurl'/>
+ <cd:constant name='validate' value='validovat'/>
+ <cd:constant name='vcommand' value='vprikaz'/>
+ <cd:constant name='veroffset' value='offsethlavicky'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='way' value='zpusob'/>
+ <cd:constant name='wfactor' value='sfaktor'/>
+ <cd:constant name='white' value='bily'/>
+ <cd:constant name='width' value='sirka'/>
+ <cd:constant name='xfactor' value='xfaktor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xmeritko'/>
+ <cd:constant name='xstep' value='xkrok'/>
+ <cd:constant name='yfactor' value='yfaktor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='ymeritko'/>
+ <cd:constant name='ystep' value='ykrok'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language cz -->
+
+ <cd:elements>
+ <cd:element name='begin' value='zacatek'/>
+ <cd:element name='complete' value='uplny'/>
+ <cd:element name='coupled' value='propojene'/>
+ <cd:element name='currentlocal' value='aktualnelokalni'/>
+ <cd:element name='emptyone' value='leer'/>
+ <cd:element name='emptytwo' value='prazdne'/>
+ <cd:element name='end' value='konec'/>
+ <cd:element name='endsetup' value=''/>
+ <cd:element name='get' value='ziskat'/>
+ <cd:element name='increment' value='zvysit'/>
+ <cd:element name='list' value='seznam'/>
+ <cd:element name='listof' value='seznam'/>
+ <cd:element name='load' value='nacist'/>
+ <cd:element name='local' value='lokalne'/>
+ <cd:element name='makeup' value='zlom'/>
+ <cd:element name='next' value='dalsi'/>
+ <cd:element name='place' value='umisti'/>
+ <cd:element name='previous' value='predchozi'/>
+ <cd:element name='previouslocal' value='predchozilokalni'/>
+ <cd:element name='reserve' value='rezervovat'/>
+ <cd:element name='see' value='viz'/>
+ <cd:element name='setup' value='nastaveni'/>
+ <cd:element name='start' value='start'/>
+ <cd:element name='stop' value='stop'/>
+ <cd:element name='text' value='text'/>
+ <cd:element name='type' value='opis'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language cz -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='KAP'/>
+ <cd:command name='Character' value='Znak'/>
+ <cd:command name='Characters' value='Znaky'/>
+ <cd:command name='LABELTEXT' value='TEXTPOPISKU'/>
+ <cd:command name='MONTH' value='MESIC'/>
+ <cd:command name='Numbers' value='Cisla'/>
+ <cd:command name='Romannumerals' value='Rimskecislice'/>
+ <cd:command name='SmallCapped' value='Kap'/>
+ <cd:command name='SmallCaps' value='Kaps'/>
+ <cd:command name='WEEKDAY' value='VSEDNIDEN'/>
+ <cd:command name='WORD' value='SLOVO'/>
+ <cd:command name='WORDS' value='SLOVA'/>
+ <cd:command name='Word' value='Slovo'/>
+ <cd:command name='Words' value='Slova'/>
+ <cd:command name='about' value='oref'/>
+ <cd:command name='adaptlayout' value='prizpusobvzhled'/>
+ <cd:command name='adding' value='scitani'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='pref'/>
+ <cd:command name='atleftmargin' value='atleftmargin'/>
+ <cd:command name='atpage' value='nastrane'/>
+ <cd:command name='atrightmargin' value='atrightmargin'/>
+ <cd:command name='background' value='pozadi'/>
+ <cd:command name='backspace' value='odsazenizleva'/>
+ <cd:command name='blackrule' value='cernalinka'/>
+ <cd:command name='blackrules' value='cernelinky'/>
+ <cd:command name='blank' value='preskoc'/>
+ <cd:command name='bookmark' value='zalozka'/>
+ <cd:command name='bottomdistance' value='vzdalenostspodku'/>
+ <cd:command name='bottomheight' value='vyskaspodku'/>
+ <cd:command name='bottomspace' value='bottomspace'/>
+ <cd:command name='but' value='spodek'/>
+ <cd:command name='button' value='tlacitko'/>
+ <cd:command name='bypassblocks' value='bypassblocks'/>
+ <cd:command name='character' value='znak'/>
+ <cd:command name='characters' value='znaky'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='orez'/>
+ <cd:command name='clonefield' value='klonujpole'/>
+ <cd:command name='color' value='barva'/>
+ <cd:command name='colorbar' value='barevnalista'/>
+ <cd:command name='colorvalue' value='hodnotabarvy'/>
+ <cd:command name='column' value='sloupec'/>
+ <cd:command name='comment' value='komentar'/>
+ <cd:command name='comparecolorgroup' value='porovnejskupinubarev'/>
+ <cd:command name='comparepalet' value='porovnejpaletu'/>
+ <cd:command name='completepagenumber' value='completepagenumber'/>
+ <cd:command name='completeregister' value='completeregister'/>
+ <cd:command name='component' value='komponenta'/>
+ <cd:command name='convertnumber' value='konvertujcislo'/>
+ <cd:command name='copyfield' value='kopirujpole'/>
+ <cd:command name='correctwhitespace' value='korekcebilehomista'/>
+ <cd:command name='coupledocument' value='propojenydokument'/>
+ <cd:command name='couplemarking' value='propojeneznaceni'/>
+ <cd:command name='couplepage' value='parovastrana'/>
+ <cd:command name='couplepaper' value='dvoustrannypapir'/>
+ <cd:command name='coupleregister' value='propojenyrejstrik'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='aktualnidatum'/>
+ <cd:command name='currentheadnumber' value='aktualnicislonadpisu'/>
+ <cd:command name='cutspace' value='cutspace'/>
+ <cd:command name='date' value='datum'/>
+ <cd:command name='decouplemarking' value='rozpojeneznaceni'/>
+ <cd:command name='decrementnumber' value='decrementnumber'/>
+ <cd:command name='define' value='definuj'/>
+ <cd:command name='defineaccent' value='definujakcent'/>
+ <cd:command name='defineblank' value='definujpreskok'/>
+ <cd:command name='defineblock' value='definujblok'/>
+ <cd:command name='definebodyfont' value='definujzakladnifont'/>
+ <cd:command name='definebodyfontenvironment' value='definujprostredizakladnihofontu'/>
+ <cd:command name='definebuffer' value='definujbuffer'/>
+ <cd:command name='definecharacter' value='definujznak'/>
+ <cd:command name='definecolor' value='definujbarvu'/>
+ <cd:command name='definecolorgroup' value='definujskupinubarev'/>
+ <cd:command name='definecolumnbreak' value='definecolumnbreak'/>
+ <cd:command name='definecolumnset' value='definecolumnset'/>
+ <cd:command name='definecombination' value='definecombination'/>
+ <cd:command name='definecombinedlist' value='definujkombinovanyseznam'/>
+ <cd:command name='definecommand' value='definujprikaz'/>
+ <cd:command name='defineconversion' value='definujkonverzi'/>
+ <cd:command name='definedescription' value='definujpopis'/>
+ <cd:command name='defineenumeration' value='definujvycet'/>
+ <cd:command name='definefield' value='definujpole'/>
+ <cd:command name='definefieldstack' value='definujzasobnikpoli'/>
+ <cd:command name='definefiguresymbol' value='definujobrazeksymbol'/>
+ <cd:command name='definefloat' value='definujplvouciobjekt'/>
+ <cd:command name='definefont' value='definujfont'/>
+ <cd:command name='definefontstyle' value='definujstylfontu'/>
+ <cd:command name='definefontsynonym' value='definujsynonumumfontu'/>
+ <cd:command name='defineframed' value='definujoramovani'/>
+ <cd:command name='defineframedtext' value='definujoramovanytext'/>
+ <cd:command name='definehbox' value='definujhbox'/>
+ <cd:command name='definehead' value='definujnadpis'/>
+ <cd:command name='defineindenting' value='definujodsazovani'/>
+ <cd:command name='defineinmargin' value='defineinmargin'/>
+ <cd:command name='defineinteractionmenu' value='definujinterakcnimenu'/>
+ <cd:command name='defineitemgroup' value='defineitemgroup'/>
+ <cd:command name='definelabel' value='definujpopisek'/>
+ <cd:command name='definelayer' value='definelayer'/>
+ <cd:command name='definelayout' value='definelayout'/>
+ <cd:command name='definelist' value='definujseznam'/>
+ <cd:command name='definelogo' value='definujlogo'/>
+ <cd:command name='definemainfield' value='definujhlavnipole'/>
+ <cd:command name='definemakeup' value='definujupravu'/>
+ <cd:command name='definemarking' value='definujznaceni'/>
+ <cd:command name='definemathalignment' value='definemathalignment'/>
+ <cd:command name='defineoutput' value='definujvystup'/>
+ <cd:command name='defineoverlay' value='definujprekryv'/>
+ <cd:command name='definepagebreak' value='definepagebreak'/>
+ <cd:command name='definepalet' value='definujpaletu'/>
+ <cd:command name='definepapersize' value='definujvelikostpapiru'/>
+ <cd:command name='defineparagraphs' value='definujodstavce'/>
+ <cd:command name='defineplacement' value='defineplacement'/>
+ <cd:command name='defineprofile' value='definujprofil'/>
+ <cd:command name='defineprogram' value='definujprogram'/>
+ <cd:command name='definerawfont' value='definerawfont'/>
+ <cd:command name='definereference' value='definujodkaz'/>
+ <cd:command name='definereferenceformat' value='definujformatodkazu'/>
+ <cd:command name='definereferencelist' value='definujseznamodkazu'/>
+ <cd:command name='defineregister' value='definujrejstrik'/>
+ <cd:command name='definerule' value='definerule'/>
+ <cd:command name='definesection' value='definujsekci'/>
+ <cd:command name='definesectionblock' value='definujbloksekce'/>
+ <cd:command name='definesorting' value='definujtrideni'/>
+ <cd:command name='definestartstop' value='definujstartstop'/>
+ <cd:command name='definestyle' value='definujstyl'/>
+ <cd:command name='definesubfield' value='definujpodpole'/>
+ <cd:command name='definesymbol' value='definujsymbol'/>
+ <cd:command name='definesynonyms' value='definujsynonyma'/>
+ <cd:command name='definetabletemplate' value='definujsablonutabulky'/>
+ <cd:command name='definetabulate' value='definujtabelaci'/>
+ <cd:command name='definetext' value='definujtext'/>
+ <cd:command name='definetextposition' value='definetextposition'/>
+ <cd:command name='definetextvariable' value='definetextvariable'/>
+ <cd:command name='definetype' value='definetype'/>
+ <cd:command name='definetyping' value='definujopis'/>
+ <cd:command name='defineversion' value='definujverzi'/>
+ <cd:command name='determineheadnumber' value='stanovcislonadpisu'/>
+ <cd:command name='determinelistcharacteristics' value='stanovcharakteristickuseznamu'/>
+ <cd:command name='determineregistercharacteristics' value='urcicharakteristikurejstriku'/>
+ <cd:command name='dimension' value='rozmer'/>
+ <cd:command name='disableinteractionmenu' value='zablokujinterakcnimenu'/>
+ <cd:command name='domicile' value='bydliste'/>
+ <cd:command name='donttest' value='zadnytest'/>
+ <cd:command name='edgedistance' value='vzdalenostokraje'/>
+ <cd:command name='edgewidth' value='sirkaokraje'/>
+ <cd:command name='emptylines' value='emptylines'/>
+ <cd:command name='environment' value='prostredi'/>
+ <cd:command name='externalfigure' value='externiobraz'/>
+ <cd:command name='fact' value='fakt'/>
+ <cd:command name='field' value='pole'/>
+ <cd:command name='fieldstack' value='zasobnikpoli'/>
+ <cd:command name='fillinfield' value='vyplnovepole'/>
+ <cd:command name='fillinline' value='vyplnovyradek'/>
+ <cd:command name='fillinrules' value='vyplnovelinky'/>
+ <cd:command name='fillintext' value='vyplnenytext'/>
+ <cd:command name='fitfield' value='prizpusobivepole'/>
+ <cd:command name='fixedspace' value='tvrdamezera'/>
+ <cd:command name='fixedspaces' value='tvrdemezery'/>
+ <cd:command name='followprofile' value='dodrzujprofil'/>
+ <cd:command name='followprofileversion' value='dodrzujverziprofilu'/>
+ <cd:command name='followversion' value='dodrzujverzi'/>
+ <cd:command name='footerdistance' value='vzdalenostupati'/>
+ <cd:command name='footerheight' value='vyskaupati'/>
+ <cd:command name='footnote' value='poznamkapodcarou'/>
+ <cd:command name='footnotetext' value='footnotetext'/>
+ <cd:command name='forceblocks' value='forceblocks'/>
+ <cd:command name='formulanumber' value='cislorovnice'/>
+ <cd:command name='fraction' value='zlomek'/>
+ <cd:command name='framed' value='oramovani'/>
+ <cd:command name='from' value='zref'/>
+ <cd:command name='getbuffer' value='ziskejbuffer'/>
+ <cd:command name='getmarking' value='ziskejznaceni'/>
+ <cd:command name='getnumber' value='getnumber'/>
+ <cd:command name='godown' value='jdidolu'/>
+ <cd:command name='goto' value='jdina'/>
+ <cd:command name='gotobox' value='jdinabox'/>
+ <cd:command name='gotopage' value='jdinastranu'/>
+ <cd:command name='graycolor' value='sedabarva'/>
+ <cd:command name='greyvalue' value='hodnotasedi'/>
+ <cd:command name='grid' value='mrizka'/>
+ <cd:command name='hairline' value='vlasovalinka'/>
+ <cd:command name='head' value='nadpis'/>
+ <cd:command name='headerdistance' value='vzdalenostzahlavi'/>
+ <cd:command name='headerheight' value='vyskazahlavi'/>
+ <cd:command name='headlevel' value='hlavniuroven'/>
+ <cd:command name='headnumber' value='cislonadpisu'/>
+ <cd:command name='headsym' value='headsym'/>
+ <cd:command name='headtext' value='texthlavicky'/>
+ <cd:command name='hideblocks' value='schovejbloky'/>
+ <cd:command name='high' value='vysoky'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='immediatebetweenlist'/>
+ <cd:command name='immediatetolist' value='immediatetolist'/>
+ <cd:command name='in' value='tref'/>
+ <cd:command name='incrementnumber' value='zvysujicicislo'/>
+ <cd:command name='indenting' value='odsazovani'/>
+ <cd:command name='inframed' value='zaramovani'/>
+ <cd:command name='infull' value='plnezneni'/>
+ <cd:command name='ininner' value='ininner'/>
+ <cd:command name='inleft' value='vlevo'/>
+ <cd:command name='inleftedge' value='nalevo'/>
+ <cd:command name='inleftmargin' value='nalevyokraj'/>
+ <cd:command name='inline' value='vradku'/>
+ <cd:command name='inmargin' value='naokraj'/>
+ <cd:command name='inmframed' value='mazaramovani'/>
+ <cd:command name='inneredgedistance' value='inneredgedistance'/>
+ <cd:command name='inneredgewidth' value='inneredgewidth'/>
+ <cd:command name='innermargindistance' value='innermargindistance'/>
+ <cd:command name='innermarginwidth' value='innermarginwidth'/>
+ <cd:command name='inothermargin' value='nadruhyokraj'/>
+ <cd:command name='inouter' value='inouter'/>
+ <cd:command name='inright' value='vpravo'/>
+ <cd:command name='inrightedge' value='napravo'/>
+ <cd:command name='inrightmargin' value='napravyokraj'/>
+ <cd:command name='installlanguage' value='instalacejazyka'/>
+ <cd:command name='interactionbar' value='interakcnilista'/>
+ <cd:command name='interactionbuttons' value='interakcnitlacitka'/>
+ <cd:command name='interactionmenu' value='interaktivnimenu'/>
+ <cd:command name='item' value='polozka'/>
+ <cd:command name='items' value='polozky'/>
+ <cd:command name='its' value='pol'/>
+ <cd:command name='keepblocks' value='zachovejbloky'/>
+ <cd:command name='label' value='poppisek'/>
+ <cd:command name='labels' value='popisky'/>
+ <cd:command name='labeltext' value='textpopisku'/>
+ <cd:command name='language' value='jazyk'/>
+ <cd:command name='leftaligned' value='zarovnanovlevo'/>
+ <cd:command name='leftedgedistance' value='vzdalenostlevehookraje'/>
+ <cd:command name='leftedgewidth' value='sirkalevehookraje'/>
+ <cd:command name='leftmargindistance' value='vzdalenostlevemarginalie'/>
+ <cd:command name='leftmarginwidth' value='sirkalevemarginalie'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='tloustkacary'/>
+ <cd:command name='listheight' value='vyskaseznamu'/>
+ <cd:command name='listlength' value='delkaseznamu'/>
+ <cd:command name='listsymbol' value='listsymbol'/>
+ <cd:command name='listwidth' value='sirkaseznamu'/>
+ <cd:command name='logfields' value='zaznamovepole'/>
+ <cd:command name='lohi' value='nivy'/>
+ <cd:command name='low' value='nizky'/>
+ <cd:command name='macroname' value='jmeno'/>
+ <cd:command name='mainlanguage' value='hlavnijazyk'/>
+ <cd:command name='makeupheight' value='vyskasazby'/>
+ <cd:command name='makeupwidth' value='sirkasazby'/>
+ <cd:command name='mar' value='okr'/>
+ <cd:command name='margindistance' value='vzdalenostmarginalie'/>
+ <cd:command name='marginrule' value='marginalnilinka'/>
+ <cd:command name='margintext' value='marginalnitext'/>
+ <cd:command name='margintitle' value='marginalninadpis'/>
+ <cd:command name='marginwidth' value='sirkamarginalie'/>
+ <cd:command name='marginword' value='marginalnislovo'/>
+ <cd:command name='marking' value='znaceni'/>
+ <cd:command name='markversion' value='oznacverzi'/>
+ <cd:command name='mathematics' value='matematika'/>
+ <cd:command name='menubutton' value='tlacitkomenu'/>
+ <cd:command name='mframed' value='maoramovani'/>
+ <cd:command name='midaligned' value='zarovnanonastred'/>
+ <cd:command name='mirror' value='zrcadlit'/>
+ <cd:command name='month' value='mesic'/>
+ <cd:command name='moveformula' value='moveformula'/>
+ <cd:command name='moveongrid' value='premistinamrizku'/>
+ <cd:command name='movesidefloat' value='movesidefloat'/>
+ <cd:command name='navigating' value='navigating'/>
+ <cd:command name='nodimension' value='zadnyrozmer'/>
+ <cd:command name='noheaderandfooterlines' value='zadnezahlaviaupati'/>
+ <cd:command name='noindenting' value='zadneodsazovani'/>
+ <cd:command name='nolist' value='zadnyseznam'/>
+ <cd:command name='nomarking' value='zadneznaceni'/>
+ <cd:command name='nomoreblocks' value='zadnedalsibloky'/>
+ <cd:command name='nomorefiles' value='zadnedalsisoubory'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='zadnamezera'/>
+ <cd:command name='note' value='poznamka'/>
+ <cd:command name='notopandbottomlines' value='zadnehorniadolniradky'/>
+ <cd:command name='notsmallcapped' value='nokap'/>
+ <cd:command name='nowhitespace' value='zadnebilemisto'/>
+ <cd:command name='numberofsubpages' value='numberofsubpages'/>
+ <cd:command name='numbers' value='cisla'/>
+ <cd:command name='outeredgedistance' value='outeredgedistance'/>
+ <cd:command name='outeredgewidth' value='outeredgewidth'/>
+ <cd:command name='outermargindistance' value='outermargindistance'/>
+ <cd:command name='outermarginwidth' value='outermarginwidth'/>
+ <cd:command name='overbar' value='nadtrzeno'/>
+ <cd:command name='overbars' value='nadtrzeni'/>
+ <cd:command name='overstrike' value='preskrtnuto'/>
+ <cd:command name='overstrikes' value='preskrtnuti'/>
+ <cd:command name='packed' value='zhustene'/>
+ <cd:command name='page' value='strana'/>
+ <cd:command name='pagedepth' value='pagedepth'/>
+ <cd:command name='pagenumber' value='cislostrany'/>
+ <cd:command name='pageoffset' value='pageoffset'/>
+ <cd:command name='pagereference' value='odkaznastranu'/>
+ <cd:command name='pagetype' value='typstrany'/>
+ <cd:command name='paperheight' value='vyskapapiru'/>
+ <cd:command name='paperwidth' value='sirkapapiru'/>
+ <cd:command name='periods' value='tecky'/>
+ <cd:command name='plaatsruwelijst' value='placerawlist'/>
+ <cd:command name='placebookmarks' value='umistizalozky'/>
+ <cd:command name='placecombinedlist' value='umistikombinovanyseznam'/>
+ <cd:command name='placefloat' value='placefloat'/>
+ <cd:command name='placefootnotes' value='umistipoznamkypodcarou'/>
+ <cd:command name='placeformula' value='umistirovnici'/>
+ <cd:command name='placeheadnumber' value='placeheadnumber'/>
+ <cd:command name='placeheadtext' value='placeheadtext'/>
+ <cd:command name='placelegend' value='umistilegendu'/>
+ <cd:command name='placelist' value='umistiseznam'/>
+ <cd:command name='placelocalfootnotes' value='umistilokalnipoznamkypodcarou'/>
+ <cd:command name='placelogos' value='umistiloga'/>
+ <cd:command name='placeongrid' value='umistinamrizku'/>
+ <cd:command name='placeontopofeachother' value='umistinadsebe'/>
+ <cd:command name='placepagenumber' value='placepagenumber'/>
+ <cd:command name='placereferencelist' value='placereferencelist'/>
+ <cd:command name='placeregister' value='umistirejstrik'/>
+ <cd:command name='placerule' value='placerule'/>
+ <cd:command name='placesidebyside' value='umistivedlesebe'/>
+ <cd:command name='placesubformula' value='umistipodrovnici'/>
+ <cd:command name='placetextvariable' value='placetextvariable'/>
+ <cd:command name='position' value='pozice'/>
+ <cd:command name='positiontext' value='positiontext'/>
+ <cd:command name='printpaperheight' value='vyskatiskpapiru'/>
+ <cd:command name='printpaperwidth' value='sirkatiskpapiru'/>
+ <cd:command name='processblocks' value='zpracujbloky'/>
+ <cd:command name='processpage' value='zpracujstranu'/>
+ <cd:command name='product' value='produkt'/>
+ <cd:command name='program' value='program'/>
+ <cd:command name='project' value='projekt'/>
+ <cd:command name='publication' value='publikace'/>
+ <cd:command name='quotation' value='citace'/>
+ <cd:command name='quote' value='citovat'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='opakovat'/>
+ <cd:command name='ref' value='ref'/>
+ <cd:command name='reference' value='odkaz'/>
+ <cd:command name='referral' value='odkaz'/>
+ <cd:command name='referraldate' value='odkaznadatum'/>
+ <cd:command name='referring' value='odkazujici'/>
+ <cd:command name='remark' value='oznaceni'/>
+ <cd:command name='reset' value='reset'/>
+ <cd:command name='resetmarking' value='resetznaceni'/>
+ <cd:command name='resetnumber' value='resetnumber'/>
+ <cd:command name='resettext' value='resettextcontent'/>
+ <cd:command name='rightaligned' value='zarovnanovpravo'/>
+ <cd:command name='rightedgedistance' value='vzdalenostpravehookraje'/>
+ <cd:command name='rightedgewidth' value='sirkapravehookraje'/>
+ <cd:command name='rightmargindistance' value='vzdalenostpravemarginalie'/>
+ <cd:command name='rightmarginwidth' value='sirkapravemarginalie'/>
+ <cd:command name='romannumerals' value='rimskecislice'/>
+ <cd:command name='rotate' value='otocit'/>
+ <cd:command name='scale' value='meritko'/>
+ <cd:command name='screen' value='obrazovka'/>
+ <cd:command name='selectblocks' value='vyberbloky'/>
+ <cd:command name='selectpaper' value='vyberpapir'/>
+ <cd:command name='selectversion' value='vyberverzi'/>
+ <cd:command name='setnumber' value='setnumber'/>
+ <cd:command name='settextcontent' value='settextcontent'/>
+ <cd:command name='settextvariable' value='settextvariable'/>
+ <cd:command name='setupalign' value='nastavzarovnani'/>
+ <cd:command name='setuparranging' value='nastavusporadani'/>
+ <cd:command name='setupbackground' value='nastavpozadi'/>
+ <cd:command name='setupbackgrounds' value='nastavpozadi'/>
+ <cd:command name='setupblackrules' value='nastavcernelinky'/>
+ <cd:command name='setupblank' value='nastavpreskok'/>
+ <cd:command name='setupblock' value='nastavblok'/>
+ <cd:command name='setupbodyfont' value='nastavzakladnifont'/>
+ <cd:command name='setupbodyfontenvironment' value='nastavprostredizakladnihofontu'/>
+ <cd:command name='setupbottom' value='nastavspodek'/>
+ <cd:command name='setupbottomtexts' value='nastavdolnitexty'/>
+ <cd:command name='setupbuffer' value='nastavbuffer'/>
+ <cd:command name='setupbuttons' value='nastavtlacitka'/>
+ <cd:command name='setupcapitals' value='nastavkapitalky'/>
+ <cd:command name='setupcaption' value='nastavpopisek'/>
+ <cd:command name='setupcaptions' value='nastavpopisky'/>
+ <cd:command name='setupclipping' value='nastavorez'/>
+ <cd:command name='setupcolor' value='nastavbarvu'/>
+ <cd:command name='setupcolors' value='nastavbarvy'/>
+ <cd:command name='setupcolumns' value='nastavsloupce'/>
+ <cd:command name='setupcolumnset' value='setupcolumnset'/>
+ <cd:command name='setupcolumnsetlines' value='setupcolumnsetlines'/>
+ <cd:command name='setupcolumnsetstart' value='setupcolumnsetstart'/>
+ <cd:command name='setupcombinations' value='nastavspojeni'/>
+ <cd:command name='setupcombinedlist' value='nastavkombinovanyseznam'/>
+ <cd:command name='setupcomment' value='nastavkomentar'/>
+ <cd:command name='setupdescriptions' value='nastavpopisy'/>
+ <cd:command name='setupenumerations' value='nastavvycty'/>
+ <cd:command name='setupexternalfigures' value='nastavexterniobrazy'/>
+ <cd:command name='setupfield' value='nastavpole'/>
+ <cd:command name='setupfields' value='nastavvsechnapole'/>
+ <cd:command name='setupfillinlines' value='nastavvyplnoveradky'/>
+ <cd:command name='setupfillinrules' value='nastavvyplnovelinky'/>
+ <cd:command name='setupfloat' value='nastavplvouciobjekt'/>
+ <cd:command name='setupfloats' value='nastavplvouciobjekty'/>
+ <cd:command name='setupfloatsplitting' value='nastavdeleniplvoucichobjektu'/>
+ <cd:command name='setupfooter' value='nastavupati'/>
+ <cd:command name='setupfootertexts' value='nastavtextyupati'/>
+ <cd:command name='setupfootnotedefinition' value='nastavdefinicipoznamekpodcarou'/>
+ <cd:command name='setupfootnotes' value='nastavpoznamkypodcarou'/>
+ <cd:command name='setupforms' value='setupforms'/>
+ <cd:command name='setupformulas' value='nastavrovnice'/>
+ <cd:command name='setupframed' value='nastavoramovani'/>
+ <cd:command name='setupframedtexts' value='nastavoramovanetexty'/>
+ <cd:command name='setuphead' value='nastavnadpis'/>
+ <cd:command name='setupheader' value='nastavzahlavi'/>
+ <cd:command name='setupheadertexts' value='nastavtextyzahlavi'/>
+ <cd:command name='setupheadnumber' value='nastavcislonadpisu'/>
+ <cd:command name='setupheads' value='nastavnadpisy'/>
+ <cd:command name='setupheadtext' value='nastavtexthlavicky'/>
+ <cd:command name='setuphyphenmark' value='nastavdelitko'/>
+ <cd:command name='setupindentations' value='nastavodsazeni'/>
+ <cd:command name='setupindenting' value='nastavodsazovani'/>
+ <cd:command name='setupinmargin' value='nastavmarginalie'/>
+ <cd:command name='setupinteraction' value='nastavinterakci'/>
+ <cd:command name='setupinteractionbar' value='nastavinterakcnilistu'/>
+ <cd:command name='setupinteractionmenu' value='nastavinterakcnimenu'/>
+ <cd:command name='setupinteractionscreen' value='nastavinterakcniobrazovku'/>
+ <cd:command name='setupinterlinespace' value='nastavmeziradkovoumezeru'/>
+ <cd:command name='setupitemgroup' value='setupitemgroup'/>
+ <cd:command name='setupitemgroups' value='nastavvycty'/>
+ <cd:command name='setupitems' value='nastavpolozky'/>
+ <cd:command name='setuplabeltext' value='nastavtextpopisku'/>
+ <cd:command name='setuplanguage' value='nastavjazyk'/>
+ <cd:command name='setuplayout' value='nastavvzhled'/>
+ <cd:command name='setuplegend' value='nastavlegendu'/>
+ <cd:command name='setuplinenumbering' value='nastavcislovaniradku'/>
+ <cd:command name='setuplines' value='nastavradky'/>
+ <cd:command name='setuplinewidth' value='nastavsirkucary'/>
+ <cd:command name='setuplist' value='nastavseznam'/>
+ <cd:command name='setupmakeup' value='nastavupravu'/>
+ <cd:command name='setupmarginblocks' value='nastavmarginalniblok'/>
+ <cd:command name='setupmarginrules' value='nastavmarginalnilinky'/>
+ <cd:command name='setupmarking' value='nastavznaceni'/>
+ <cd:command name='setupmathalignment' value='setupmathalignment'/>
+ <cd:command name='setupnarrower' value='nastavzuzeni'/>
+ <cd:command name='setupnumber' value='setupnumber'/>
+ <cd:command name='setupnumbering' value='nastavcislovani'/>
+ <cd:command name='setupoppositeplacing' value='nastavumisteniprotejsku'/>
+ <cd:command name='setupoutput' value='nastavvystup'/>
+ <cd:command name='setuppagecomment' value='nastavkomentarstrany'/>
+ <cd:command name='setuppagenumber' value='nastavcislostrany'/>
+ <cd:command name='setuppagenumbering' value='nastavcislovanistran'/>
+ <cd:command name='setuppagetransitions' value='nastavprechodstrany'/>
+ <cd:command name='setuppalet' value='nastavpaletu'/>
+ <cd:command name='setuppaper' value='setuppaper'/>
+ <cd:command name='setuppapersize' value='nastavvelikostpapiru'/>
+ <cd:command name='setupparagraphnumbering' value='nastavcislovaniodstavcu'/>
+ <cd:command name='setupparagraphs' value='nastavodstavce'/>
+ <cd:command name='setupplacement' value='setupplacement'/>
+ <cd:command name='setuppositioning' value='nastavumistovani'/>
+ <cd:command name='setupprofiles' value='nastavprofily'/>
+ <cd:command name='setupprograms' value='nastavprogramy'/>
+ <cd:command name='setuppublications' value='nastavpublikace'/>
+ <cd:command name='setupquote' value='nastavcitaci'/>
+ <cd:command name='setupreferencelist' value='nastavseznamodkazu'/>
+ <cd:command name='setupreferencing' value='nastavodkazovani'/>
+ <cd:command name='setupregister' value='nastavrejstrik'/>
+ <cd:command name='setuprotate' value='nastavotoceni'/>
+ <cd:command name='setuprule' value='setuprule'/>
+ <cd:command name='setups' value='nastaveni'/>
+ <cd:command name='setupscreens' value='nastavrastr'/>
+ <cd:command name='setupsection' value='nastavsekci'/>
+ <cd:command name='setupsectionblock' value='nastavbloksekce'/>
+ <cd:command name='setupsorting' value='nastavtrideni'/>
+ <cd:command name='setupspacing' value='nastavradkovani'/>
+ <cd:command name='setupstartstop' value='setupstartstop'/>
+ <cd:command name='setupstrut' value='setupstrut'/>
+ <cd:command name='setupsubpagenumber' value='nastavpodcislostrany'/>
+ <cd:command name='setupsymbolset' value='nastavsadusymbolu'/>
+ <cd:command name='setupsynchronization' value='nastavsynchronizaci'/>
+ <cd:command name='setupsynchronizationbar' value='nastavsynchronizacnilistu'/>
+ <cd:command name='setupsynonyms' value='nastavsynonyma'/>
+ <cd:command name='setupsystem' value='nastavsystem'/>
+ <cd:command name='setuptab' value='nastavtab'/>
+ <cd:command name='setuptables' value='nastavtabulky'/>
+ <cd:command name='setuptabulate' value='nastavtabelaci'/>
+ <cd:command name='setuptext' value='nastavtext'/>
+ <cd:command name='setuptextposition' value='setuptextposition'/>
+ <cd:command name='setuptextrules' value='nastavtextovelinky'/>
+ <cd:command name='setuptexttexts' value='nastavtexttexty'/>
+ <cd:command name='setuptextvariable' value='setuptextvariable'/>
+ <cd:command name='setupthinrules' value='nastavtenkelinky'/>
+ <cd:command name='setuptolerance' value='nastavtoleranci'/>
+ <cd:command name='setuptop' value='nastavhorejsek'/>
+ <cd:command name='setuptoptexts' value='nastavhornitexty'/>
+ <cd:command name='setuptype' value='nastavtype'/>
+ <cd:command name='setuptyping' value='nastavopis'/>
+ <cd:command name='setupunderbar' value='nastavpodtrzeni'/>
+ <cd:command name='setupurl' value='nastavurl'/>
+ <cd:command name='setupversions' value='nastavverze'/>
+ <cd:command name='setupwhitespace' value='nastavbilamista'/>
+ <cd:command name='showbodyfont' value='ukazzakladnifont'/>
+ <cd:command name='showbodyfontenvironment' value='ukazpostredizakladnihofontu'/>
+ <cd:command name='showcolor' value='ukazbarvu'/>
+ <cd:command name='showcolorgroup' value='ukazskupinubarev'/>
+ <cd:command name='showexternalfigures' value='ukazexterniobrazy'/>
+ <cd:command name='showfields' value='ukazpole'/>
+ <cd:command name='showframe' value='ukazramecek'/>
+ <cd:command name='showgrid' value='ukazmrizku'/>
+ <cd:command name='showlayout' value='ukazvzhled'/>
+ <cd:command name='showmakeup' value='ukazupravu'/>
+ <cd:command name='showpalet' value='ukazpaletu'/>
+ <cd:command name='showprint' value='ukazvytisk'/>
+ <cd:command name='showsetups' value='ukaznastaveni'/>
+ <cd:command name='showstruts' value='ukazpodpery'/>
+ <cd:command name='showsymbolset' value='ukazsadusymbolu'/>
+ <cd:command name='smallcapped' value='kap'/>
+ <cd:command name='someline' value='nejakyradek'/>
+ <cd:command name='somewhere' value='nekde'/>
+ <cd:command name='space' value='mezera'/>
+ <cd:command name='splitfloat' value='rozdelplvouciobjekt'/>
+ <cd:command name='startalignment' value='startzarovnavani'/>
+ <cd:command name='startbackground' value='startpozadi'/>
+ <cd:command name='startcoding' value='startkodovani'/>
+ <cd:command name='startcolor' value='startbarva'/>
+ <cd:command name='startcolumnmakeup' value='startcolumnmakeup'/>
+ <cd:command name='startcolumns' value='startsloupce'/>
+ <cd:command name='startcolumnset' value='startcolumnset'/>
+ <cd:command name='startcombination' value='startspojeni'/>
+ <cd:command name='startcomponent' value='startkomponenta'/>
+ <cd:command name='startdocument' value='startdokument'/>
+ <cd:command name='startenvironment' value='startprostredi'/>
+ <cd:command name='startfigure' value='startobraz'/>
+ <cd:command name='startglobal' value='startglobalni'/>
+ <cd:command name='startline' value='startradek'/>
+ <cd:command name='startlinecorrection' value='startkorekceradku'/>
+ <cd:command name='startlinenumbering' value='startcislovaniradku'/>
+ <cd:command name='startlines' value='startradky'/>
+ <cd:command name='startlocal' value='startlokalni'/>
+ <cd:command name='startlocalfootnotes' value='startlokalnipoznamkypodcarou'/>
+ <cd:command name='startmakeup' value='startuprava'/>
+ <cd:command name='startmarginblock' value='startmarginalniblok'/>
+ <cd:command name='startmarginrule' value='startmarginalnilinka'/>
+ <cd:command name='startnarrower' value='startzuzeni'/>
+ <cd:command name='startopposite' value='startprotejsek'/>
+ <cd:command name='startoverlay' value='startprekryv'/>
+ <cd:command name='startoverzicht' value='startprehled'/>
+ <cd:command name='startpacked' value='startzhustene'/>
+ <cd:command name='startpositioning' value='startumistovani'/>
+ <cd:command name='startproduct' value='startprodukt'/>
+ <cd:command name='startprofile' value='startprofil'/>
+ <cd:command name='startproject' value='startprojekt'/>
+ <cd:command name='startquotation' value='startcitace'/>
+ <cd:command name='startraster' value='startrastr'/>
+ <cd:command name='startsymbolset' value='startsadasymbolu'/>
+ <cd:command name='startsynchronization' value='startsynchronizace'/>
+ <cd:command name='starttable' value='starttabulka'/>
+ <cd:command name='starttables' value='starttabulky'/>
+ <cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextrule' value='starttextovalinka'/>
+ <cd:command name='startunpacked' value='startnezhustene'/>
+ <cd:command name='startversion' value='startverze'/>
+ <cd:command name='stopalignment' value='stopzarovnavani'/>
+ <cd:command name='stopbackground' value='stoppozadi'/>
+ <cd:command name='stopcoding' value='stopkodovani'/>
+ <cd:command name='stopcolor' value='stopbarva'/>
+ <cd:command name='stopcolumnmakeup' value='stopcolumnmakeup'/>
+ <cd:command name='stopcolumns' value='stopsloupce'/>
+ <cd:command name='stopcolumnset' value='stopcolumnset'/>
+ <cd:command name='stopcombination' value='stopspojeni'/>
+ <cd:command name='stopcomponent' value='stopkomponenta'/>
+ <cd:command name='stopdocument' value='stopdokument'/>
+ <cd:command name='stopenvironment' value='stopprostredi'/>
+ <cd:command name='stopglobal' value='stopglobalni'/>
+ <cd:command name='stopline' value='stopradek'/>
+ <cd:command name='stoplinecorrection' value='stopkorekceradku'/>
+ <cd:command name='stoplinenumbering' value='stopcislovaniradku'/>
+ <cd:command name='stoplines' value='stopradky'/>
+ <cd:command name='stoplocal' value='stoplokalni'/>
+ <cd:command name='stoplocalfootnotes' value='stoplokalnipoznamkypodcarou'/>
+ <cd:command name='stopmakeup' value='stopuprava'/>
+ <cd:command name='stopmarginblock' value='stopmarginalniblok'/>
+ <cd:command name='stopmarginrule' value='stopmarginalnilinka'/>
+ <cd:command name='stopnarrower' value='stopzuzeni'/>
+ <cd:command name='stopopposite' value='stopprotejsek'/>
+ <cd:command name='stopoverlay' value='stopprekryv'/>
+ <cd:command name='stopoverzicht' value='stopprehled'/>
+ <cd:command name='stoppacked' value='stopzhustene'/>
+ <cd:command name='stoppositioning' value='stopumistovani'/>
+ <cd:command name='stopproduct' value='stopprodukt'/>
+ <cd:command name='stopprofile' value='stopprofil'/>
+ <cd:command name='stopproject' value='stopprojekt'/>
+ <cd:command name='stopquotation' value='stopcitace'/>
+ <cd:command name='stopraster' value='stoprastr'/>
+ <cd:command name='stopsynchronization' value='stopsynchronizace'/>
+ <cd:command name='stoptable' value='stoptabulka'/>
+ <cd:command name='stoptables' value='stoptabulky'/>
+ <cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextrule' value='stoptextovalinka'/>
+ <cd:command name='stopunpacked' value='stopnezhustene'/>
+ <cd:command name='stopversion' value='stopverze'/>
+ <cd:command name='stretched' value='roztazene'/>
+ <cd:command name='subformulanumber' value='cislopodrovnice'/>
+ <cd:command name='subpagenumber' value='subpagenumber'/>
+ <cd:command name='switchtobodyfont' value='prepninazakladnifont'/>
+ <cd:command name='switchtorawfont' value='switchtorawfont'/>
+ <cd:command name='sym' value='sym'/>
+ <cd:command name='symbol' value='symbol'/>
+ <cd:command name='synchronizationbar' value='synchronizacnilista'/>
+ <cd:command name='synchronize' value='synchronizovat'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testcolumn'/>
+ <cd:command name='testpage' value='testpage'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='vyskatextu'/>
+ <cd:command name='textreference' value='odkaznatext'/>
+ <cd:command name='textrule' value='textovalinka'/>
+ <cd:command name='textvariable' value='textvariable'/>
+ <cd:command name='textwidth' value='sirkatextu'/>
+ <cd:command name='thinrule' value='tenkalinka'/>
+ <cd:command name='thinrules' value='tenkelinky'/>
+ <cd:command name='tooltip' value='bublinkovanapoveda'/>
+ <cd:command name='topdistance' value='vzdalenosthorejsku'/>
+ <cd:command name='topheight' value='vyskahorejsku'/>
+ <cd:command name='topspace' value='odsazenishora'/>
+ <cd:command name='totalnumberofpages' value='celkovypocetstran'/>
+ <cd:command name='translate' value='prelozit'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='pis'/>
+ <cd:command name='type' value='opis'/>
+ <cd:command name='typebuffer' value='typebuffer'/>
+ <cd:command name='typefile' value='opissoubor'/>
+ <cd:command name='underbar' value='podtrzeno'/>
+ <cd:command name='underbars' value='podtrzeni'/>
+ <cd:command name='unitmeaning' value='vyznam'/>
+ <cd:command name='unknown' value='neznamo'/>
+ <cd:command name='useJSscripts' value='uzijJSscripts'/>
+ <cd:command name='useURL' value='uzijURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='uzijbloky'/>
+ <cd:command name='usecommands' value='uzijprikazy'/>
+ <cd:command name='useencoding' value='uzijkodovani'/>
+ <cd:command name='useexternaldocument' value='uzijexternidokument'/>
+ <cd:command name='useexternalfigure' value='uzijexterniobraz'/>
+ <cd:command name='useexternalfile' value='uzijexternisoubor'/>
+ <cd:command name='useexternalfiles' value='uzijexternisoubory'/>
+ <cd:command name='useexternalsoundtrack' value='uzijexternizvuk'/>
+ <cd:command name='usemodule' value='uzijmodul'/>
+ <cd:command name='usemodules' value='uzijmoduly'/>
+ <cd:command name='usepath' value='uzijadresar'/>
+ <cd:command name='usereferences' value='uzijodkazy'/>
+ <cd:command name='usespecials' value='uzijspeciality'/>
+ <cd:command name='usesymbols' value='uzijsymbol'/>
+ <cd:command name='usetypescript' value='usetypescript'/>
+ <cd:command name='usetypescriptfile' value='usetypescriptfile'/>
+ <cd:command name='useurl' value='uzijurl'/>
+ <cd:command name='version' value='verze'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='vsedniden'/>
+ <cd:command name='whitespace' value='bilemisto'/>
+ <cd:command name='wordright' value='slovovpravo'/>
+ <cd:command name='writebetweenlist' value='zapismeziseznam'/>
+ <cd:command name='writetolist' value='zapisdoseznamu'/>
+ <cd:command name='writetoreferencelist' value='zapisdoseznamuodkazu'/>
+ <cd:command name='writetoregister' value='zapisdorejstriku'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml
new file mode 100644
index 000000000..4c60d2be4
--- /dev/null
+++ b/tex/context/interface/keys-de.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='de' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language de -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Zusatz'/>
+ <cd:variable name='Balloon' value='Ballon'/>
+ <cd:variable name='Character' value='Buchstabe'/>
+ <cd:variable name='Characters' value='Buchstaben'/>
+ <cd:variable name='CloseDocument' value='SchliesseDokument'/>
+ <cd:variable name='ExitViewer' value='BeendeViewer'/>
+ <cd:variable name='FirstPage' value='ErsteSeite'/>
+ <cd:variable name='FitHeight' value='HoehePassend'/>
+ <cd:variable name='FitWidth' value='BreitePassend'/>
+ <cd:variable name='GotoPage' value='GotoPage'/>
+ <cd:variable name='Greek' value='Griechisch'/>
+ <cd:variable name='Help' value='Hilfe'/>
+ <cd:variable name='HideField' value='VerbergeFeld'/>
+ <cd:variable name='HideLayer' value='HideLayer'/>
+ <cd:variable name='Key' value='Schluessel'/>
+ <cd:variable name='LastPage' value='LetzteSeite'/>
+ <cd:variable name='LoadForm' value='LadeFormular'/>
+ <cd:variable name='MONTH' value='MONAT'/>
+ <cd:variable name='New' value='Neu'/>
+ <cd:variable name='NextJump' value='NaechsterSprung'/>
+ <cd:variable name='NextPage' value='FolgendeSeite'/>
+ <cd:variable name='Numbers' value='Ziffern'/>
+ <cd:variable name='OpenNamedDocument' value='OpenNamedDocument'/>
+ <cd:variable name='Paragraph' value='Absatz'/>
+ <cd:variable name='PauseMovie' value='PauseFilm'/>
+ <cd:variable name='PauseRendering' value='PauseRendering'/>
+ <cd:variable name='PauseSound' value='PauseSound'/>
+ <cd:variable name='PreviousJump' value='VorigerSprung'/>
+ <cd:variable name='PreviousPage' value='VorigeSeite'/>
+ <cd:variable name='PrintDocument' value='DruckeDokument'/>
+ <cd:variable name='Query' value='Query'/>
+ <cd:variable name='QueryAgain' value='QueryAgain'/>
+ <cd:variable name='ResetForm' value='ZuruecksetzenFormular'/>
+ <cd:variable name='ResumeMovie' value='FortsetzenFilm'/>
+ <cd:variable name='ResumeRendering' value='ResumeRendering'/>
+ <cd:variable name='ResumeSound' value='ResumeSound'/>
+ <cd:variable name='Romannumerals' value='Roemischezahlen'/>
+ <cd:variable name='SaveDocument' value='SpeichereDokument'/>
+ <cd:variable name='SaveForm' value='SpeicheFormular'/>
+ <cd:variable name='SaveNamedDocument' value='SaveNamedDocument'/>
+ <cd:variable name='SearchAgain' value='WeiterSuchen'/>
+ <cd:variable name='SearchDocument' value='DokumentDurchsuchen'/>
+ <cd:variable name='ShowBookmarks' value='ShowBookmarks'/>
+ <cd:variable name='ShowField' value='ZeigeFeld'/>
+ <cd:variable name='ShowThumbs' value='ShowThumbs'/>
+ <cd:variable name='StartMovie' value='StartFilm'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='StartSound'/>
+ <cd:variable name='StopMovie' value='StopFilm'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='StopSound'/>
+ <cd:variable name='SubmitForm' value='VersendeFormular'/>
+ <cd:variable name='ToggleLayer' value='ToggleLayer'/>
+ <cd:variable name='ToggleViewer' value='WechseleViewer'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='ViewerHilfe'/>
+ <cd:variable name='WEEKDAY' value='WOCHENTAG'/>
+ <cd:variable name='WORD' value='WORT'/>
+ <cd:variable name='abbreviation' value='abkuerzung'/>
+ <cd:variable name='abbreviations' value='abkuerzungen'/>
+ <cd:variable name='absolute' value='absolut'/>
+ <cd:variable name='action' value='aktion'/>
+ <cd:variable name='after' value='nach'/>
+ <cd:variable name='all' value='alles'/>
+ <cd:variable name='always' value='immer'/>
+ <cd:variable name='answerarea' value='answerarea'/>
+ <cd:variable name='appendices' value='anhaenge'/>
+ <cd:variable name='appendix' value='anhang'/>
+ <cd:variable name='april' value='April'/>
+ <cd:variable name='atmargin' value='amrand'/>
+ <cd:variable name='atpage' value='aufseite'/>
+ <cd:variable name='august' value='August'/>
+ <cd:variable name='author' value='autor'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autointro'/>
+ <cd:variable name='back' value='zurueck'/>
+ <cd:variable name='background' value='hintergrund'/>
+ <cd:variable name='backmatter' value='epiloge'/>
+ <cd:variable name='backpart' value='epilog'/>
+ <cd:variable name='backspace' value='rumpfspatium'/>
+ <cd:variable name='backward' value='rueckwaerts'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='vor'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='gross'/>
+ <cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigpreference' value='grosszuegig'/>
+ <cd:variable name='blank' value='blanko'/>
+ <cd:variable name='blockquote' value='blockquote'/>
+ <cd:variable name='bodymatter' value='haupttexte'/>
+ <cd:variable name='bodypart' value='haupttext'/>
+ <cd:variable name='bold' value='fett'/>
+ <cd:variable name='bolditalic' value='fettitalic'/>
+ <cd:variable name='boldslanted' value='fettgeneigt'/>
+ <cd:variable name='bookmark' value='bookmark'/>
+ <cd:variable name='both' value='beide'/>
+ <cd:variable name='bottom' value='unten'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='breit'/>
+ <cd:variable name='buffer' value='puffer'/>
+ <cd:variable name='by' value='pro'/>
+ <cd:variable name='calligraphic' value='kalligraphie'/>
+ <cd:variable name='cap' value='kap'/>
+ <cd:variable name='capital' value='versalien'/>
+ <cd:variable name='center' value='center'/>
+ <cd:variable name='chapter' value='kapitel'/>
+ <cd:variable name='character' value='buchstabe'/>
+ <cd:variable name='characters' value='buchstaben'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='farbe'/>
+ <cd:variable name='column' value='column'/>
+ <cd:variable name='columns' value='spalten'/>
+ <cd:variable name='command' value='befehl'/>
+ <cd:variable name='commands' value='befehle'/>
+ <cd:variable name='comment' value='kommentar'/>
+ <cd:variable name='component' value='komponente'/>
+ <cd:variable name='concept' value='konzept'/>
+ <cd:variable name='content' value='inhalt'/>
+ <cd:variable name='contents' value='inhalte'/>
+ <cd:variable name='continue' value='fortsetzten'/>
+ <cd:variable name='controls' value='controls'/>
+ <cd:variable name='conversion' value='konversion'/>
+ <cd:variable name='current' value='aktuell'/>
+ <cd:variable name='cutspace' value='cutspace'/>
+ <cd:variable name='date' value='datum'/>
+ <cd:variable name='day' value='tag'/>
+ <cd:variable name='december' value='Dezember'/>
+ <cd:variable name='default' value='default'/>
+ <cd:variable name='depth' value='tiefe'/>
+ <cd:variable name='description' value='beschreibung'/>
+ <cd:variable name='disable' value='sperren'/>
+ <cd:variable name='display' value='bildschirm'/>
+ <cd:variable name='dot' value='punkt'/>
+ <cd:variable name='doublesided' value='doppelseitig'/>
+ <cd:variable name='down' value='down'/>
+ <cd:variable name='each' value='jede'/>
+ <cd:variable name='edge' value='kante'/>
+ <cd:variable name='empty' value='leer'/>
+ <cd:variable name='end' value='end'/>
+ <cd:variable name='endnote' value='endnote'/>
+ <cd:variable name='enumeration' value='nummerierung'/>
+ <cd:variable name='environment' value='umgebung'/>
+ <cd:variable name='even' value='gerade'/>
+ <cd:variable name='external' value='extern'/>
+ <cd:variable name='fact' value='gegeben'/>
+ <cd:variable name='february' value='Februar'/>
+ <cd:variable name='figure' value='abbildung'/>
+ <cd:variable name='figures' value='abbildungen'/>
+ <cd:variable name='file' value='datei'/>
+ <cd:variable name='final' value='endfassung'/>
+ <cd:variable name='first' value='erste'/>
+ <cd:variable name='firstcolumn' value='firstcolumn'/>
+ <cd:variable name='firstpage' value='ersteseite'/>
+ <cd:variable name='firstsubpage' value='ersteunterseite'/>
+ <cd:variable name='fit' value='passend'/>
+ <cd:variable name='five' value='fuenf'/>
+ <cd:variable name='fix' value='stellewiederher'/>
+ <cd:variable name='fixed' value='fest'/>
+ <cd:variable name='flexible' value='flexibel'/>
+ <cd:variable name='float' value='gleitobjekt'/>
+ <cd:variable name='flushinner' value='flushinner'/>
+ <cd:variable name='flushleft' value='flushleft'/>
+ <cd:variable name='flushouter' value='flushouter'/>
+ <cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='footer' value='fusszeile'/>
+ <cd:variable name='footnote' value='fussnote'/>
+ <cd:variable name='force' value='zwinge'/>
+ <cd:variable name='foreground' value='vordergrund'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='formel'/>
+ <cd:variable name='formulae' value='formeln'/>
+ <cd:variable name='forward' value='vorwaerts'/>
+ <cd:variable name='four' value='vier'/>
+ <cd:variable name='frame' value='rahmen'/>
+ <cd:variable name='framedtext' value='umrahmtertext'/>
+ <cd:variable name='friday' value='freitag'/>
+ <cd:variable name='frontmatter' value='einleitungen'/>
+ <cd:variable name='frontpart' value='einleitung'/>
+ <cd:variable name='global' value='global'/>
+ <cd:variable name='graphic' value='grafik'/>
+ <cd:variable name='graphics' value='grafiken'/>
+ <cd:variable name='gray' value='grau'/>
+ <cd:variable name='greek' value='griechisch'/>
+ <cd:variable name='grid' value='gritter'/>
+ <cd:variable name='halfline' value='halbezeile'/>
+ <cd:variable name='handwritten' value='handschrift'/>
+ <cd:variable name='hang' value='haengend'/>
+ <cd:variable name='hanging' value='haengend'/>
+ <cd:variable name='head' value='kopf'/>
+ <cd:variable name='header' value='kopfzeile'/>
+ <cd:variable name='height' value='hoehe'/>
+ <cd:variable name='helptext' value='hilfetext'/>
+ <cd:variable name='hencefore' value='vorher'/>
+ <cd:variable name='here' value='hier'/>
+ <cd:variable name='hereafter' value='nachher'/>
+ <cd:variable name='hidden' value='versteckt'/>
+ <cd:variable name='hiding' value='verbergen'/>
+ <cd:variable name='high' value='hoch'/>
+ <cd:variable name='horizontal' value='horizontal'/>
+ <cd:variable name='hyphenated' value='hyphenate'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='zwischen'/>
+ <cd:variable name='index' value='index'/>
+ <cd:variable name='indices' value='indizies'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='inherit'/>
+ <cd:variable name='inleft' value='imlinken'/>
+ <cd:variable name='inmargin' value='imrand'/>
+ <cd:variable name='inner' value='innen'/>
+ <cd:variable name='inneredge' value='inneredge'/>
+ <cd:variable name='innermargin' value='innermargin'/>
+ <cd:variable name='inright' value='imrechten'/>
+ <cd:variable name='interaction' value='interaktion'/>
+ <cd:variable name='interactionmenu' value='interaktionsmenue'/>
+ <cd:variable name='intermezzi' value='intermezzi'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='imtext'/>
+ <cd:variable name='intro' value='intro'/>
+ <cd:variable name='italic' value='italic'/>
+ <cd:variable name='italicbold' value='italicfett'/>
+ <cd:variable name='item' value='pos'/>
+ <cd:variable name='itemize' value='aufzaehlung'/>
+ <cd:variable name='its' value='its'/>
+ <cd:variable name='january' value='Januar'/>
+ <cd:variable name='joinedup' value='keinabstand'/>
+ <cd:variable name='july' value='Juli'/>
+ <cd:variable name='june' value='Juni'/>
+ <cd:variable name='keep' value='behalte'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='label'/>
+ <cd:variable name='landscape' value='querformat'/>
+ <cd:variable name='last' value='letzte'/>
+ <cd:variable name='lastcolumn' value='lastcolumn'/>
+ <cd:variable name='lastpage' value='letzteseite'/>
+ <cd:variable name='lastpagenumber' value='lastpagenumber'/>
+ <cd:variable name='lastsubpage' value='letzteunterseite'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='links'/>
+ <cd:variable name='leftedge' value='linkekante'/>
+ <cd:variable name='lefthanging' value='lefthanging'/>
+ <cd:variable name='leftmargin' value='linkerrand'/>
+ <cd:variable name='leftpage' value='linkerseite'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='legende'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='zeile'/>
+ <cd:variable name='linenote' value='linenote'/>
+ <cd:variable name='lines' value='zeilen'/>
+ <cd:variable name='list' value='liste'/>
+ <cd:variable name='local' value='lokal'/>
+ <cd:variable name='localenvironment' value='lokaleumgebung'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='logos'/>
+ <cd:variable name='lohi' value='hoti'/>
+ <cd:variable name='loose' value='lose'/>
+ <cd:variable name='low' value='tief'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='umbruch'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='Maerz'/>
+ <cd:variable name='margin' value='marginalie'/>
+ <cd:variable name='marginedge' value='marginalkante'/>
+ <cd:variable name='margintitle' value='marginaltitel'/>
+ <cd:variable name='marking' value='beschriftung'/>
+ <cd:variable name='mathalignment' value='mathalignment'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='mathmatrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='Mai'/>
+ <cd:variable name='mediaeval' value='mittelalterlich'/>
+ <cd:variable name='medium' value='mittel'/>
+ <cd:variable name='middle' value='mittig'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='minhoehe'/>
+ <cd:variable name='minwidth' value='minbreite'/>
+ <cd:variable name='mirrored' value='gespiegelt'/>
+ <cd:variable name='monday' value='montag'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='monat'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='name'/>
+ <cd:variable name='narrow' value='schmall'/>
+ <cd:variable name='negative' value='negativ'/>
+ <cd:variable name='never' value='nie'/>
+ <cd:variable name='new' value='neu'/>
+ <cd:variable name='next' value='folgende'/>
+ <cd:variable name='nextevenpage' value='naechstegeradeseite'/>
+ <cd:variable name='nextoddpage' value='naechsteungeradeseite'/>
+ <cd:variable name='nextpage' value='folgendeseite'/>
+ <cd:variable name='nextsubpage' value='folgendeunterseite'/>
+ <cd:variable name='no' value='nein'/>
+ <cd:variable name='nocheck' value='nocheck'/>
+ <cd:variable name='nofit' value='nofit'/>
+ <cd:variable name='nogrid' value='nogrid'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='keinebeschriftung'/>
+ <cd:variable name='none' value='kein'/>
+ <cd:variable name='nonumber' value='nonumber'/>
+ <cd:variable name='normal' value='normal'/>
+ <cd:variable name='nospacing' value='nospacing'/>
+ <cd:variable name='not' value='nicht'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='nothanging'/>
+ <cd:variable name='nothyphenated' value='nothyphenated'/>
+ <cd:variable name='november' value='November'/>
+ <cd:variable name='nowhere' value='nirgens'/>
+ <cd:variable name='nowhite' value='keinweiss'/>
+ <cd:variable name='number' value='nummer'/>
+ <cd:variable name='numbers' value='ziffern'/>
+ <cd:variable name='october' value='Oktober'/>
+ <cd:variable name='odd' value='ungerade'/>
+ <cd:variable name='off' value='aus'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='old'/>
+ <cd:variable name='on' value='an'/>
+ <cd:variable name='one' value='eins'/>
+ <cd:variable name='opposite' value='gegenueber'/>
+ <cd:variable name='outer' value='aussen'/>
+ <cd:variable name='outeredge' value='outeredge'/>
+ <cd:variable name='outermargin' value='outermargin'/>
+ <cd:variable name='overbar' value='ueberstrichen'/>
+ <cd:variable name='overbars' value='ueberstreichen'/>
+ <cd:variable name='overlay' value='overlay'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='durchgestrichen'/>
+ <cd:variable name='overstrikes' value='durchstreichen'/>
+ <cd:variable name='packed' value='gepackt'/>
+ <cd:variable name='page' value='seite'/>
+ <cd:variable name='pagecomment' value='pagecomment'/>
+ <cd:variable name='pagenumber' value='seitennummer'/>
+ <cd:variable name='paper' value='papier'/>
+ <cd:variable name='paragraph' value='absatz'/>
+ <cd:variable name='part' value='teil'/>
+ <cd:variable name='positive' value='positiv'/>
+ <cd:variable name='postponing' value='verschieben'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='einstellung'/>
+ <cd:variable name='preview' value='vorschau'/>
+ <cd:variable name='previous' value='vorig'/>
+ <cd:variable name='previousevenpage' value='vorigegeradeseite'/>
+ <cd:variable name='previousoddpage' value='vorigeungeradeseite'/>
+ <cd:variable name='previouspage' value='vorigeseite'/>
+ <cd:variable name='previoussubpage' value='vorigeunterseite'/>
+ <cd:variable name='printable' value='druckbar'/>
+ <cd:variable name='process' value='process'/>
+ <cd:variable name='product' value='produkt'/>
+ <cd:variable name='program' value='programm'/>
+ <cd:variable name='project' value='projekt'/>
+ <cd:variable name='protected' value='geschuetzt'/>
+ <cd:variable name='quadruple' value='viertel'/>
+ <cd:variable name='quotation' value='zitat'/>
+ <cd:variable name='quote' value='zitieren'/>
+ <cd:variable name='ran' value='ran'/>
+ <cd:variable name='random' value='zufaellig'/>
+ <cd:variable name='readonly' value='nurlesbar'/>
+ <cd:variable name='rectangular' value='rechteckig'/>
+ <cd:variable name='referral' value='merkmal'/>
+ <cd:variable name='register' value='register'/>
+ <cd:variable name='regular' value='regular'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relativ'/>
+ <cd:variable name='repeat' value='wiederholen'/>
+ <cd:variable name='required' value='obligatorisch'/>
+ <cd:variable name='reset' value='zuruecksetzten'/>
+ <cd:variable name='reverse' value='reverse'/>
+ <cd:variable name='right' value='rechts'/>
+ <cd:variable name='rightedge' value='rechterkante'/>
+ <cd:variable name='righthanging' value='righthanging'/>
+ <cd:variable name='rightmargin' value='rechterrand'/>
+ <cd:variable name='rightpage' value='rechterseite'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='antiqua'/>
+ <cd:variable name='romannumerals' value='roemischezahlen'/>
+ <cd:variable name='rotate' value='drehe'/>
+ <cd:variable name='rotated' value='gedreht'/>
+ <cd:variable name='round' value='rund'/>
+ <cd:variable name='row' value='row'/>
+ <cd:variable name='rule' value='linie'/>
+ <cd:variable name='samepage' value='selbeseite'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sansfett'/>
+ <cd:variable name='sansserif' value='grotesk'/>
+ <cd:variable name='saturday' value='samstag'/>
+ <cd:variable name='screen' value='raster'/>
+ <cd:variable name='section' value='absatz'/>
+ <cd:variable name='sectionblockenvironment' value='sectionblockenvironment'/>
+ <cd:variable name='sectionnumber' value='abschnittsnummer'/>
+ <cd:variable name='see' value='sieh'/>
+ <cd:variable name='september' value='September'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='kleinerabstand'/>
+ <cd:variable name='setups' value='impostazioni'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='short' value='kurz'/>
+ <cd:variable name='singlesided' value='einzelseitig'/>
+ <cd:variable name='slanted' value='geneigt'/>
+ <cd:variable name='slantedbold' value='geneigtfett'/>
+ <cd:variable name='small' value='klein'/>
+ <cd:variable name='smallbodyfont' value='smallbodyfont'/>
+ <cd:variable name='smallbold' value='kleinfett'/>
+ <cd:variable name='smallbolditalic' value='kleinfettitalic'/>
+ <cd:variable name='smallboldslanted' value='kleinfettgeneigt'/>
+ <cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smallitalic' value='kleinitalic'/>
+ <cd:variable name='smallitalicbold' value='kleinitalicfett'/>
+ <cd:variable name='smallnormal' value='kleinnormal'/>
+ <cd:variable name='smallslanted' value='kleingeneigt'/>
+ <cd:variable name='smallslantedbold' value='kleingeneigtfett'/>
+ <cd:variable name='smalltype' value='kleintippen'/>
+ <cd:variable name='somewhere' value='irgendwo'/>
+ <cd:variable name='sorted' value='sortiert'/>
+ <cd:variable name='space' value='spatium'/>
+ <cd:variable name='spacing' value='spatiumausgleich'/>
+ <cd:variable name='speech' value='speech'/>
+ <cd:variable name='split' value='split'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standard'/>
+ <cd:variable name='start' value='start'/>
+ <cd:variable name='starter' value='starter'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='stop'/>
+ <cd:variable name='stopper' value='trenner'/>
+ <cd:variable name='stretch' value='strecken'/>
+ <cd:variable name='strict' value='streng'/>
+ <cd:variable name='strong' value='strong'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='unter'/>
+ <cd:variable name='subbackward' value='unterrueckwaerts'/>
+ <cd:variable name='subformula' value='subformel'/>
+ <cd:variable name='subforward' value='untervorwaerts'/>
+ <cd:variable name='subject' value='thema'/>
+ <cd:variable name='subpage' value='unterseite'/>
+ <cd:variable name='subsection' value='unterabsatz'/>
+ <cd:variable name='subsubject' value='unterthema'/>
+ <cd:variable name='subsubsection' value='unterunterabsatz'/>
+ <cd:variable name='subsubsubject' value='unterunterthema'/>
+ <cd:variable name='subsubsubsection' value='unterunterunterabsatz'/>
+ <cd:variable name='subsubsubsubject' value='unterunterunterthema'/>
+ <cd:variable name='subsubsubsubsection' value='unterunterunterunterabsatz'/>
+ <cd:variable name='subsubsubsubsubject' value='unterunterunterunterthema'/>
+ <cd:variable name='subsubsubsubsubsection' value='unterunterunterunterunterabsatz'/>
+ <cd:variable name='subsubsubsubsubsubject' value='unterunterunterunterunterthema'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='unterunterunterunterunterunterabsatz'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='unterunterunterunterunterunterthema'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='unterunterunterunterunterunterunterabsatz'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='unterunterunterunterunterunterunterthema'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='unterunterunterunterunterunterunterunterabsatz'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='unterunterunterunterunterunterunterunterthema'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='unterunterunterunterunterunterunterunterunterabsatz'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='unterunterunterunterunterunterunterunterunterthema'/>
+ <cd:variable name='sunday' value='sonntag'/>
+ <cd:variable name='support' value='support'/>
+ <cd:variable name='sym' value='sym'/>
+ <cd:variable name='symbol' value='symbol'/>
+ <cd:variable name='synchronize' value='synchronize'/>
+ <cd:variable name='system' value='systeme'/>
+ <cd:variable name='table' value='tabelle'/>
+ <cd:variable name='tablehead' value='tabellenueberschrift'/>
+ <cd:variable name='tables' value='tabellen'/>
+ <cd:variable name='tabletail' value='tabellenende'/>
+ <cd:variable name='tabulate' value='tabulator'/>
+ <cd:variable name='tabulatehead' value='tabulatehead'/>
+ <cd:variable name='tabulatetail' value='tabulatetail'/>
+ <cd:variable name='tall' value='lang'/>
+ <cd:variable name='teletype' value='fernschreiber'/>
+ <cd:variable name='temporary' value='temporaer'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='text'/>
+ <cd:variable name='three' value='drei'/>
+ <cd:variable name='thursday' value='donnerstag'/>
+ <cd:variable name='title' value='titel'/>
+ <cd:variable name='toggle' value='toggle'/>
+ <cd:variable name='tolerant' value='tolerant'/>
+ <cd:variable name='top' value='oben'/>
+ <cd:variable name='tuesday' value='dienstag'/>
+ <cd:variable name='two' value='zwei'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='tippen'/>
+ <cd:variable name='typing' value='tippen'/>
+ <cd:variable name='unavailable' value='nichtverfuegbar'/>
+ <cd:variable name='underbar' value='unterstrichen'/>
+ <cd:variable name='underbars' value='unterstreichen'/>
+ <cd:variable name='unit' value='einheit'/>
+ <cd:variable name='units' value='einheiten'/>
+ <cd:variable name='unknown' value='unbekannt'/>
+ <cd:variable name='unpacked' value='ungepackt'/>
+ <cd:variable name='up' value='up'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='verwende'/>
+ <cd:variable name='value' value='wert'/>
+ <cd:variable name='vertical' value='vertikal'/>
+ <cd:variable name='very' value='sehr'/>
+ <cd:variable name='verystrict' value='sehrstreng'/>
+ <cd:variable name='verytolerant' value='sehrtolerant'/>
+ <cd:variable name='weak' value='weak'/>
+ <cd:variable name='wednesday' value='mittwoch'/>
+ <cd:variable name='week' value='woche'/>
+ <cd:variable name='weekday' value='wochentag'/>
+ <cd:variable name='white' value='weiss'/>
+ <cd:variable name='wide' value='breit'/>
+ <cd:variable name='width' value='breite'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='jahr'/>
+ <cd:variable name='yes' value='ja'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language de -->
+
+ <cd:constants>
+ <cd:constant name='action' value='aktion'/>
+ <cd:constant name='address' value='adresse'/>
+ <cd:constant name='after' value='nach'/>
+ <cd:constant name='afterhead' value='nachkopf'/>
+ <cd:constant name='afterkey' value='nachtaste'/>
+ <cd:constant name='align' value='ausrichtung'/>
+ <cd:constant name='aligncharacter' value='aligncharacter'/>
+ <cd:constant name='alignmentcharacter' value='alignmentcharacter'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='titelausrichten'/>
+ <cd:constant name='alternative' value='alternative'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='pfeil'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='bei'/>
+ <cd:constant name='author' value='autor'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autofocus'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autobreite'/>
+ <cd:constant name='axis' value='achsen'/>
+ <cd:constant name='background' value='hintergrund'/>
+ <cd:constant name='backgroundcolor' value='hintergrundfarbe'/>
+ <cd:constant name='backgroundcorner' value='hintergrundwinkel'/>
+ <cd:constant name='backgrounddepth' value='hintergrundtiefe'/>
+ <cd:constant name='backgroundoffset' value='hintergrundoffset'/>
+ <cd:constant name='backgroundradius' value='hintergrundradius'/>
+ <cd:constant name='backgroundscreen' value='hintergrundraster'/>
+ <cd:constant name='backspace' value='rumpfspatium'/>
+ <cd:constant name='balance' value='ausgleichen'/>
+ <cd:constant name='before' value='vor'/>
+ <cd:constant name='beforehead' value='vorkopf'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='gross'/>
+ <cd:constant name='blank' value='blanko'/>
+ <cd:constant name='blockway' value='blockauf'/>
+ <cd:constant name='bodyfont' value='fliesstext'/>
+ <cd:constant name='bookmark' value='bookmark'/>
+ <cd:constant name='bottom' value='unten'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='abstandunten'/>
+ <cd:constant name='bottomframe' value='untenrahmen'/>
+ <cd:constant name='bottomoffset' value='untenoffset'/>
+ <cd:constant name='bottomspace' value='bottomspace'/>
+ <cd:constant name='bottomstate' value='untenstatus'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='berechnen'/>
+ <cd:constant name='ccommand' value='cbefehl'/>
+ <cd:constant name='click' value='klick'/>
+ <cd:constant name='clickin' value='klickin'/>
+ <cd:constant name='clickout' value='klickaus'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='schliessenaktion'/>
+ <cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepageaction' value='closepageaction'/>
+ <cd:constant name='closesymbol' value='closesymbol'/>
+ <cd:constant name='color' value='farbe'/>
+ <cd:constant name='column' value='spalte'/>
+ <cd:constant name='columndistance' value='spaltenabstand'/>
+ <cd:constant name='columns' value='spalten'/>
+ <cd:constant name='command' value='befehl'/>
+ <cd:constant name='commandafter' value='zumbefehl'/>
+ <cd:constant name='commandbefore' value='vorbefehl'/>
+ <cd:constant name='commands' value='befehle'/>
+ <cd:constant name='component' value='component'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='compress'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='fortsetzen'/>
+ <cd:constant name='contrastcolor' value='kontrastfarbe'/>
+ <cd:constant name='controls' value='controls'/>
+ <cd:constant name='conversion' value='konversion'/>
+ <cd:constant name='convertfile' value='konvertieredatei'/>
+ <cd:constant name='corner' value='winkel'/>
+ <cd:constant name='coupling' value='verknuepfung'/>
+ <cd:constant name='couplingway' value='verkopplungsart'/>
+ <cd:constant name='criterium' value='kriterium'/>
+ <cd:constant name='current' value='aktuell'/>
+ <cd:constant name='cutspace' value='cutspace'/>
+ <cd:constant name='dash' value='strich'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='datum'/>
+ <cd:constant name='deepnumbercommand' value='deepnumbercommand'/>
+ <cd:constant name='deeptextcommand' value='deeptextcommand'/>
+ <cd:constant name='default' value='default'/>
+ <cd:constant name='delay' value='wartezeit'/>
+ <cd:constant name='depth' value='tiefe'/>
+ <cd:constant name='depthcorrection' value='tiefekorrektur'/>
+ <cd:constant name='direction' value='richtung'/>
+ <cd:constant name='directory' value='verzeichnis'/>
+ <cd:constant name='display' value='bildschirm'/>
+ <cd:constant name='distance' value='abstand'/>
+ <cd:constant name='dot' value='punkt'/>
+ <cd:constant name='doublesided' value='doppelseitig'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='kante'/>
+ <cd:constant name='edgedistance' value='kantenabstand'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='leer'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='geraderand'/>
+ <cd:constant name='expansion' value='expansion'/>
+ <cd:constant name='export' value='export'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='faktor'/>
+ <cd:constant name='fallback' value='fallback'/>
+ <cd:constant name='family' value='familie'/>
+ <cd:constant name='fieldbackgroundcolor' value='feldhintergrundfarbe'/>
+ <cd:constant name='fieldframecolor' value='feldrahmenfarbe'/>
+ <cd:constant name='fieldlayer' value='fieldlayer'/>
+ <cd:constant name='fieldoffset' value='feldoffset'/>
+ <cd:constant name='file' value='datei'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='focus'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusout'/>
+ <cd:constant name='footer' value='fusszeile'/>
+ <cd:constant name='footerdistance' value='fusszeilenabstand'/>
+ <cd:constant name='footerstate' value='fusszeilenstatus'/>
+ <cd:constant name='foregroundcolor' value='foregroundcolor'/>
+ <cd:constant name='foregroundstyle' value='foregroundstyle'/>
+ <cd:constant name='format' value='formatieren'/>
+ <cd:constant name='frame' value='rahmen'/>
+ <cd:constant name='framecolor' value='rahmenfarbe'/>
+ <cd:constant name='framecorner' value='rahmenwinkel'/>
+ <cd:constant name='framedepth' value='rahmentiefe'/>
+ <cd:constant name='frameoffset' value='rahmenoffset'/>
+ <cd:constant name='frameradius' value='rahmenradius'/>
+ <cd:constant name='frames' value='umrahmen'/>
+ <cd:constant name='from' value='von'/>
+ <cd:constant name='get' value='hole'/>
+ <cd:constant name='global' value='global'/>
+ <cd:constant name='grid' value='gritter'/>
+ <cd:constant name='hang' value='haengend'/>
+ <cd:constant name='headalign' value='headalign'/>
+ <cd:constant name='headcolor' value='kopffarbe'/>
+ <cd:constant name='headcommand' value='headcommand'/>
+ <cd:constant name='headconversion' value='headconversion'/>
+ <cd:constant name='header' value='kopfzeile'/>
+ <cd:constant name='headerdistance' value='kopfzeilenabstand'/>
+ <cd:constant name='headerstate' value='kopfzeilenstatus'/>
+ <cd:constant name='headlabel' value='headlabel'/>
+ <cd:constant name='headnumber' value='kopfnummer'/>
+ <cd:constant name='headstyle' value='kopfstil'/>
+ <cd:constant name='height' value='hoehe'/>
+ <cd:constant name='hfactor' value='hfaktor'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horoffset' value='rumpfabstand'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='ibefehl'/>
+ <cd:constant name='in' value='in'/>
+ <cd:constant name='inbetween' value='zwischen'/>
+ <cd:constant name='increment' value='erhoehen'/>
+ <cd:constant name='incrementnumber' value='nummererhoehen'/>
+ <cd:constant name='indenting' value='einziehen'/>
+ <cd:constant name='indentnext' value='ziehefolgendeein'/>
+ <cd:constant name='indicator' value='indikator'/>
+ <cd:constant name='inner' value='innen'/>
+ <cd:constant name='innermargin' value='innermargin'/>
+ <cd:constant name='inputfile' value='inputfile'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='interaktion'/>
+ <cd:constant name='interlinespace' value='zeilenabstande'/>
+ <cd:constant name='itemalign' value='itemalign'/>
+ <cd:constant name='items' value='posten'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keyword' value='keyword'/>
+ <cd:constant name='label' value='label'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='links'/>
+ <cd:constant name='leftcolor' value='linkerfarbe'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='linkekante'/>
+ <cd:constant name='leftedgedistance' value='linkerkantenabstand'/>
+ <cd:constant name='leftframe' value='linkerrahmen'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='linkerrand'/>
+ <cd:constant name='leftmargindistance' value='linkerrandabstand'/>
+ <cd:constant name='leftoffset' value='linkeroffset'/>
+ <cd:constant name='leftquotation' value='linkerzitat'/>
+ <cd:constant name='leftquote' value='linkerzitieren'/>
+ <cd:constant name='leftsentence' value='linkersatz'/>
+ <cd:constant name='leftspeech' value='leftspeech'/>
+ <cd:constant name='leftstyle' value='linkerstil'/>
+ <cd:constant name='leftsubsentence' value='linkersubsatz'/>
+ <cd:constant name='lefttext' value='linkertext'/>
+ <cd:constant name='leftwidth' value='linkerbreite'/>
+ <cd:constant name='level' value='niveau'/>
+ <cd:constant name='levels' value='niveaus'/>
+ <cd:constant name='limittext' value='limittext'/>
+ <cd:constant name='line' value='zeile'/>
+ <cd:constant name='linecorrection' value='zeilekorrektur'/>
+ <cd:constant name='lines' value='zeilen'/>
+ <cd:constant name='list' value='liste'/>
+ <cd:constant name='listtext' value='listtext'/>
+ <cd:constant name='local' value='lokal'/>
+ <cd:constant name='location' value='platz'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='logos'/>
+ <cd:constant name='marcolor' value='beschrfarbe'/>
+ <cd:constant name='margin' value='marginalie'/>
+ <cd:constant name='margindistance' value='marginalabstand'/>
+ <cd:constant name='marginedge' value='marginalkante'/>
+ <cd:constant name='marginedgetext' value='marginalkantetext'/>
+ <cd:constant name='margintext' value='marginaltext'/>
+ <cd:constant name='marking' value='beschriftung'/>
+ <cd:constant name='marstyle' value='beschrstil'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='maxhoehe'/>
+ <cd:constant name='maxwidth' value='maxbreite'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='menue'/>
+ <cd:constant name='method' value='methode'/>
+ <cd:constant name='middle' value='mittig'/>
+ <cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middletext' value='mittigertext'/>
+ <cd:constant name='midsentence' value='midsentence'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='mindepth'/>
+ <cd:constant name='minheight' value='minhoehe'/>
+ <cd:constant name='minwidth' value='minbreite'/>
+ <cd:constant name='monthconversion' value='monthconversion'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='name'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='nunten'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='folgende'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nlinks'/>
+ <cd:constant name='nlines' value='zzeile'/>
+ <cd:constant name='norm' value='norm'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='nrechts'/>
+ <cd:constant name='ntop' value='noben'/>
+ <cd:constant name='number' value='nummer'/>
+ <cd:constant name='numbercolor' value='nummernfarbe'/>
+ <cd:constant name='numbercommand' value='nummerbefehl'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='numberdistance'/>
+ <cd:constant name='numbering' value='nummerierung'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='nummernseperator'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='nummernstil'/>
+ <cd:constant name='numberwidth' value='numberwidth'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='objekt'/>
+ <cd:constant name='obstruction' value='gesperrt'/>
+ <cd:constant name='oddmargin' value='ungeraderand'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='oeffenaktion'/>
+ <cd:constant name='openpageaction' value='openpageaction'/>
+ <cd:constant name='option' value='option'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='orientation'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='outermargin'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='eigenenummer'/>
+ <cd:constant name='page' value='seite'/>
+ <cd:constant name='pageboundaries' value='seitenbegrenzung'/>
+ <cd:constant name='pagecolor' value='seitenfarbe'/>
+ <cd:constant name='pagecommand' value='seitenbefehl'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='seitennummer'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='pagestate'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='seitenstil'/>
+ <cd:constant name='palet' value='palette'/>
+ <cd:constant name='paper' value='papier'/>
+ <cd:constant name='paragraph' value='absatz'/>
+ <cd:constant name='place' value='platziere'/>
+ <cd:constant name='placehead' value='setzekopf'/>
+ <cd:constant name='placestopper' value='setzetrenner'/>
+ <cd:constant name='position' value='position'/>
+ <cd:constant name='prefix' value='prefix'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='voreinstellung'/>
+ <cd:constant name='preview' value='vorschau'/>
+ <cd:constant name='previous' value='vorige'/>
+ <cd:constant name='previousnumber' value='vorigenummer'/>
+ <cd:constant name='process' value='process'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='radius'/>
+ <cd:constant name='random' value='zufaellig'/>
+ <cd:constant name='range' value='range'/>
+ <cd:constant name='reduction' value='reduktion'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='referenz'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='referieren'/>
+ <cd:constant name='regionin' value='regionin'/>
+ <cd:constant name='regionout' value='regionaus'/>
+ <cd:constant name='repeat' value='wiederholen'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='resetnumber'/>
+ <cd:constant name='resolution' value='aufloesung'/>
+ <cd:constant name='right' value='rechts'/>
+ <cd:constant name='rightcolor' value='rechterfarbe'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='rechtekante'/>
+ <cd:constant name='rightedgedistance' value='rechterkantenabstand'/>
+ <cd:constant name='rightframe' value='rechterrahmen'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='rechterrand'/>
+ <cd:constant name='rightmargindistance' value='rechterrandabstand'/>
+ <cd:constant name='rightoffset' value='rechterabstand'/>
+ <cd:constant name='rightquotation' value='rechterzitat'/>
+ <cd:constant name='rightquote' value='rechterzitieren'/>
+ <cd:constant name='rightsentence' value='rechtersatz'/>
+ <cd:constant name='rightspeech' value='rightspeech'/>
+ <cd:constant name='rightstyle' value='rechterstil'/>
+ <cd:constant name='rightsubsentence' value='rechtersubsatz'/>
+ <cd:constant name='righttext' value='rechtertext'/>
+ <cd:constant name='rightwidth' value='rechterbreite'/>
+ <cd:constant name='rotation' value='rotation'/>
+ <cd:constant name='rule' value='linie'/>
+ <cd:constant name='rulecolor' value='linienfarbe'/>
+ <cd:constant name='rulethickness' value='liniendicke'/>
+ <cd:constant name='samepage' value='selbeseite'/>
+ <cd:constant name='sample' value='muster'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='format'/>
+ <cd:constant name='scope' value='bereich'/>
+ <cd:constant name='screen' value='raster'/>
+ <cd:constant name='section' value='abschnitt'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='abschnittsnummer'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='seperator'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='setups'/>
+ <cd:constant name='side' value='objektabstand'/>
+ <cd:constant name='sidealign' value='sidealign'/>
+ <cd:constant name='sidemethod' value='sidemethod'/>
+ <cd:constant name='sidespaceafter' value='nebennachspatium'/>
+ <cd:constant name='sidespacebefore' value='nebenvorspatium'/>
+ <cd:constant name='sign' value='zeichen'/>
+ <cd:constant name='size' value='groesse'/>
+ <cd:constant name='small' value='klein'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='sorttype'/>
+ <cd:constant name='source' value='quelle'/>
+ <cd:constant name='space' value='spatium'/>
+ <cd:constant name='spaceafter' value='nachspatium'/>
+ <cd:constant name='spacebefore' value='vorspatium'/>
+ <cd:constant name='spaceinbetween' value='spaceinbetween'/>
+ <cd:constant name='spacing' value='spatiumausgleich'/>
+ <cd:constant name='split' value='split'/>
+ <cd:constant name='splitcolor' value='splitcolor'/>
+ <cd:constant name='splitmethod' value='splitmethod'/>
+ <cd:constant name='splitoffset' value='splitoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stack'/>
+ <cd:constant name='start' value='start'/>
+ <cd:constant name='starter' value='starter'/>
+ <cd:constant name='state' value='status'/>
+ <cd:constant name='step' value='schritt'/>
+ <cd:constant name='stop' value='stop'/>
+ <cd:constant name='stopper' value='abschnitttrenner'/>
+ <cd:constant name='stretch' value='strecken'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='stil'/>
+ <cd:constant name='sub' value='unter'/>
+ <cd:constant name='subtitle' value='untertitel'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symausrichtung'/>
+ <cd:constant name='symbol' value='symbol'/>
+ <cd:constant name='symbolset' value='symbolset'/>
+ <cd:constant name='symcolor' value='symfarbe'/>
+ <cd:constant name='symstyle' value='symstil'/>
+ <cd:constant name='synonym' value='synonym'/>
+ <cd:constant name='synonymcolor' value='synonymfarbe'/>
+ <cd:constant name='synonymcommand' value='synonymbefehl'/>
+ <cd:constant name='synonymstyle' value='synonymstil'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='text'/>
+ <cd:constant name='textcolor' value='textfarbe'/>
+ <cd:constant name='textcommand' value='textbefehl'/>
+ <cd:constant name='textdistance' value='textdistance'/>
+ <cd:constant name='textlayer' value='textlayer'/>
+ <cd:constant name='textmargin' value='textmargin'/>
+ <cd:constant name='textmethod' value='textmethod'/>
+ <cd:constant name='textseparator' value='textseparator'/>
+ <cd:constant name='textsize' value='textgroesse'/>
+ <cd:constant name='textstate' value='textstatus'/>
+ <cd:constant name='textstyle' value='textstil'/>
+ <cd:constant name='textwidth' value='textbreite'/>
+ <cd:constant name='title' value='titel'/>
+ <cd:constant name='titlecolor' value='titelfarbe'/>
+ <cd:constant name='titlecommand' value='titlecommand'/>
+ <cd:constant name='titledistance' value='titelabstand'/>
+ <cd:constant name='titleleft' value='titleleft'/>
+ <cd:constant name='titleright' value='titleright'/>
+ <cd:constant name='titlestyle' value='titelstil'/>
+ <cd:constant name='to' value='zu'/>
+ <cd:constant name='tolerance' value='toleranz'/>
+ <cd:constant name='top' value='oben'/>
+ <cd:constant name='topdistance' value='obenabstand'/>
+ <cd:constant name='topframe' value='obenrahmen'/>
+ <cd:constant name='topoffset' value='obenoffset'/>
+ <cd:constant name='topspace' value='kopfspatium'/>
+ <cd:constant name='topstate' value='statusoben'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='typ'/>
+ <cd:constant name='unit' value='einheit'/>
+ <cd:constant name='unknownreference' value='unbekantereferenz'/>
+ <cd:constant name='urlalternative' value='urlalternative'/>
+ <cd:constant name='urlspace' value='urlspatium'/>
+ <cd:constant name='validate' value='validieren'/>
+ <cd:constant name='vcommand' value='vbefehl'/>
+ <cd:constant name='veroffset' value='kopfoffset'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='art'/>
+ <cd:constant name='wfactor' value='bfaktor'/>
+ <cd:constant name='white' value='weiss'/>
+ <cd:constant name='width' value='breite'/>
+ <cd:constant name='xfactor' value='xfaktor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xformat'/>
+ <cd:constant name='xstep' value='xschritt'/>
+ <cd:constant name='yfactor' value='yfaktor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='yformat'/>
+ <cd:constant name='ystep' value='yschritt'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language de -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='answerlines'/>
+ <cd:element name='answerspace' value='answerspace'/>
+ <cd:element name='begin' value='anfang'/>
+ <cd:element name='complete' value='vollende'/>
+ <cd:element name='coupled' value='verknuepft'/>
+ <cd:element name='currentlocal' value='aktuelllokal'/>
+ <cd:element name='emptyone' value='vuoto'/>
+ <cd:element name='emptytwo' value='leer'/>
+ <cd:element name='end' value='ende'/>
+ <cd:element name='endsetup' value='ein'/>
+ <cd:element name='get' value='get'/>
+ <cd:element name='increment' value='erhoehen'/>
+ <cd:element name='list' value='auflisten'/>
+ <cd:element name='listof' value='auflistenvon'/>
+ <cd:element name='load' value='laden'/>
+ <cd:element name='local' value='lokal'/>
+ <cd:element name='makeup' value='umbruch'/>
+ <cd:element name='next' value='folgende'/>
+ <cd:element name='place' value='platziere'/>
+ <cd:element name='previous' value='vorige'/>
+ <cd:element name='previouslocal' value='voriglokal'/>
+ <cd:element name='reserve' value='reservieren'/>
+ <cd:element name='see' value='sieh'/>
+ <cd:element name='setup' value='stelle'/>
+ <cd:element name='start' value='start'/>
+ <cd:element name='stop' value='stop'/>
+ <cd:element name='text' value='text'/>
+ <cd:element name='type' value='type'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language de -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='KAP'/>
+ <cd:command name='Character' value='Buchstabe'/>
+ <cd:command name='Characters' value='Buchstaben'/>
+ <cd:command name='LABELTEXT' value='LABELTEXT'/>
+ <cd:command name='MONTH' value='MONAT'/>
+ <cd:command name='Numbers' value='Ziffern'/>
+ <cd:command name='Romannumerals' value='Roemischezahlen'/>
+ <cd:command name='SmallCapped' value='Kap'/>
+ <cd:command name='SmallCaps' value='Kaps'/>
+ <cd:command name='WEEKDAY' value='WOCHENTAG'/>
+ <cd:command name='WORD' value='WORT'/>
+ <cd:command name='WORDS' value='WOERTER'/>
+ <cd:command name='Word' value='Wort'/>
+ <cd:command name='Words' value='Woerter'/>
+ <cd:command name='about' value='ueber'/>
+ <cd:command name='adaptlayout' value='passelayoutan'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='bei'/>
+ <cd:command name='atleftmargin' value='atleftmargin'/>
+ <cd:command name='atpage' value='aufseite'/>
+ <cd:command name='atrightmargin' value='atrightmargin'/>
+ <cd:command name='background' value='hintergrund'/>
+ <cd:command name='backspace' value='rumpfweite'/>
+ <cd:command name='blackrule' value='rechteck'/>
+ <cd:command name='blackrules' value='rechtecke'/>
+ <cd:command name='blank' value='blanko'/>
+ <cd:command name='bookmark' value='bookmark'/>
+ <cd:command name='bottomdistance' value='abstandunten'/>
+ <cd:command name='bottomheight' value='hoeheunten'/>
+ <cd:command name='bottomspace' value='bottomspace'/>
+ <cd:command name='but' value='but'/>
+ <cd:command name='button' value='knopf'/>
+ <cd:command name='bypassblocks' value='bypassblocks'/>
+ <cd:command name='character' value='buchstabe'/>
+ <cd:command name='characters' value='buchstaben'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='ausschnitt'/>
+ <cd:command name='clonefield' value='klonierefeld'/>
+ <cd:command name='color' value='farbe'/>
+ <cd:command name='colorbar' value='farbbalken'/>
+ <cd:command name='colorvalue' value='farbewert'/>
+ <cd:command name='column' value='spalte'/>
+ <cd:command name='comment' value='kommentar'/>
+ <cd:command name='comparecolorgroup' value='vergleichefarbengruppe'/>
+ <cd:command name='comparepalet' value='vergleichepalette'/>
+ <cd:command name='completepagenumber' value='completepagenumber'/>
+ <cd:command name='completeregister' value='completeregister'/>
+ <cd:command name='component' value='komponente'/>
+ <cd:command name='convertnumber' value='konvertierezahl'/>
+ <cd:command name='copyfield' value='kopierefeld'/>
+ <cd:command name='correctwhitespace' value='korrigierezwischenraum'/>
+ <cd:command name='coupledocument' value='verknuepfedokument'/>
+ <cd:command name='couplemarking' value='verknuepfebeschriftung'/>
+ <cd:command name='couplepage' value='doppelseite'/>
+ <cd:command name='couplepaper' value='doppelseitigespapier'/>
+ <cd:command name='coupleregister' value='verknuepfregister'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='heutigesdatum'/>
+ <cd:command name='currentheadnumber' value='heutigeskopfnummer'/>
+ <cd:command name='cutspace' value='cutspace'/>
+ <cd:command name='date' value='datum'/>
+ <cd:command name='decouplemarking' value='entknuepfebeschriftung'/>
+ <cd:command name='decrementnumber' value='decrementnumber'/>
+ <cd:command name='define' value='definieren'/>
+ <cd:command name='defineaccent' value='definiereakzent'/>
+ <cd:command name='defineblank' value='definiereblanko'/>
+ <cd:command name='defineblock' value='definiereblock'/>
+ <cd:command name='definebodyfont' value='definierefliesstext'/>
+ <cd:command name='definebodyfontenvironment' value='definierefliesstextumgebung'/>
+ <cd:command name='definebuffer' value='definierepuffer'/>
+ <cd:command name='definecharacter' value='definierezeichen'/>
+ <cd:command name='definecolor' value='definierefarbe'/>
+ <cd:command name='definecolorgroup' value='definierefarbengruppe'/>
+ <cd:command name='definecolumnbreak' value='definecolumnbreak'/>
+ <cd:command name='definecolumnset' value='definecolumnset'/>
+ <cd:command name='definecombination' value='definecombination'/>
+ <cd:command name='definecombinedlist' value='definierezusammengestellteliste'/>
+ <cd:command name='definecommand' value='definierebefehl'/>
+ <cd:command name='defineconversion' value='definierekonversion'/>
+ <cd:command name='definedescription' value='definierebeschreibung'/>
+ <cd:command name='defineenumeration' value='definierenummerierung'/>
+ <cd:command name='definefield' value='definierefeld'/>
+ <cd:command name='definefieldstack' value='definierefeldstapel'/>
+ <cd:command name='definefiguresymbol' value='definiereabbsymbol'/>
+ <cd:command name='definefloat' value='definieregleitobjekt'/>
+ <cd:command name='definefont' value='definiereschrift'/>
+ <cd:command name='definefontstyle' value='definiereschriftstil'/>
+ <cd:command name='definefontsynonym' value='defineschriftsynonym'/>
+ <cd:command name='defineframed' value='definiereumrahmt'/>
+ <cd:command name='defineframedtext' value='definiereumrahmtertext'/>
+ <cd:command name='definehbox' value='definierehbox'/>
+ <cd:command name='definehead' value='definiereueberschrift'/>
+ <cd:command name='defineindenting' value='definiereeinzug'/>
+ <cd:command name='defineinmargin' value='defineinmargin'/>
+ <cd:command name='defineinteractionmenu' value='definiereinteraktionsmenue'/>
+ <cd:command name='defineitemgroup' value='defineitemgroup'/>
+ <cd:command name='definelabel' value='definierelabel'/>
+ <cd:command name='definelayer' value='definelayer'/>
+ <cd:command name='definelayout' value='definelayout'/>
+ <cd:command name='definelist' value='definiereliste'/>
+ <cd:command name='definelogo' value='definierelogo'/>
+ <cd:command name='definemainfield' value='definierehauptfeld'/>
+ <cd:command name='definemakeup' value='definiereumbruch'/>
+ <cd:command name='definemarking' value='definierebeschriftung'/>
+ <cd:command name='definemathalignment' value='definemathalignment'/>
+ <cd:command name='defineoutput' value='defineoutput'/>
+ <cd:command name='defineoverlay' value='definiereoverlay'/>
+ <cd:command name='definepagebreak' value='definepagebreak'/>
+ <cd:command name='definepalet' value='definierepalette'/>
+ <cd:command name='definepapersize' value='definierepapierformat'/>
+ <cd:command name='defineparagraphs' value='definiereabsaetze'/>
+ <cd:command name='defineplacement' value='defineplacement'/>
+ <cd:command name='defineprofile' value='definiereprofil'/>
+ <cd:command name='defineprogram' value='definiereprogramme'/>
+ <cd:command name='definerawfont' value='definerawfont'/>
+ <cd:command name='definereference' value='definierereferenz'/>
+ <cd:command name='definereferenceformat' value='definierereferenzformat'/>
+ <cd:command name='definereferencelist' value='definierereferenzliste'/>
+ <cd:command name='defineregister' value='definiereregister'/>
+ <cd:command name='definerule' value='definerule'/>
+ <cd:command name='definesection' value='definiereabschnitt'/>
+ <cd:command name='definesectionblock' value='definiereabschnittsblock'/>
+ <cd:command name='definesorting' value='definieresortieren'/>
+ <cd:command name='definestartstop' value='definierestartstop'/>
+ <cd:command name='definestyle' value='definierestil'/>
+ <cd:command name='definesubfield' value='definieresubfeld'/>
+ <cd:command name='definesymbol' value='definieresymbol'/>
+ <cd:command name='definesynonyms' value='definieresynonyme'/>
+ <cd:command name='definetabletemplate' value='definieretabellenvorlage'/>
+ <cd:command name='definetabulate' value='definieretabulator'/>
+ <cd:command name='definetext' value='definieretext'/>
+ <cd:command name='definetextposition' value='definetextposition'/>
+ <cd:command name='definetextvariable' value='definetextvariable'/>
+ <cd:command name='definetype' value='definetype'/>
+ <cd:command name='definetyping' value='definieretippen'/>
+ <cd:command name='defineversion' value='definiereversion'/>
+ <cd:command name='determineheadnumber' value='bestimmekopfnummer'/>
+ <cd:command name='determinelistcharacteristics' value='bestimmelistencharakeristika'/>
+ <cd:command name='determineregistercharacteristics' value='bestimmeregistercharakteristika'/>
+ <cd:command name='dimension' value='dimension'/>
+ <cd:command name='disableinteractionmenu' value='inaktiviereinteraktionsmenue'/>
+ <cd:command name='domicile' value='wohnort'/>
+ <cd:command name='donttest' value='keintest'/>
+ <cd:command name='edgedistance' value='randabstand'/>
+ <cd:command name='edgewidth' value='randbreite'/>
+ <cd:command name='emptylines' value='emptylines'/>
+ <cd:command name='environment' value='umgebung'/>
+ <cd:command name='externalfigure' value='externeabbildung'/>
+ <cd:command name='fact' value='geg'/>
+ <cd:command name='field' value='feld'/>
+ <cd:command name='fieldstack' value='feldstapel'/>
+ <cd:command name='fillinfield' value='ausfuellfeld'/>
+ <cd:command name='fillinline' value='gefuelltezeile'/>
+ <cd:command name='fillinrules' value='gefuelltesrechteck'/>
+ <cd:command name='fillintext' value='ausfuelltext'/>
+ <cd:command name='fitfield' value='passendfeld'/>
+ <cd:command name='fixedspace' value='festesspatium'/>
+ <cd:command name='fixedspaces' value='festesspatium'/>
+ <cd:command name='followprofile' value='folgeprofil'/>
+ <cd:command name='followprofileversion' value='folgeprofilversion'/>
+ <cd:command name='followversion' value='folgeversion'/>
+ <cd:command name='footerdistance' value='fusszeileabstand'/>
+ <cd:command name='footerheight' value='fusszeilenhoehe'/>
+ <cd:command name='footnote' value='fussnote'/>
+ <cd:command name='footnotetext' value='footnotetext'/>
+ <cd:command name='forceblocks' value='forceblocks'/>
+ <cd:command name='formulanumber' value='formelnummer'/>
+ <cd:command name='fraction' value='bruch'/>
+ <cd:command name='framed' value='umrahmt'/>
+ <cd:command name='from' value='von'/>
+ <cd:command name='getbuffer' value='holepuffer'/>
+ <cd:command name='getmarking' value='holebeschriftung'/>
+ <cd:command name='getnumber' value='getnumber'/>
+ <cd:command name='godown' value='nachunten'/>
+ <cd:command name='goto' value='zu'/>
+ <cd:command name='gotobox' value='zurbox'/>
+ <cd:command name='gotopage' value='zurseite'/>
+ <cd:command name='graycolor' value='graufarbe'/>
+ <cd:command name='greyvalue' value='grauwert'/>
+ <cd:command name='grid' value='gitter'/>
+ <cd:command name='hairline' value='haarlinie'/>
+ <cd:command name='head' value='kopf'/>
+ <cd:command name='headerdistance' value='kopfzeilenabstand'/>
+ <cd:command name='headerheight' value='kopfzeilenhoehe'/>
+ <cd:command name='headlevel' value='kopfniveau'/>
+ <cd:command name='headnumber' value='kopfnummer'/>
+ <cd:command name='headsym' value='headsym'/>
+ <cd:command name='headtext' value='ueberschrifttext'/>
+ <cd:command name='hideblocks' value='verbergebloecke'/>
+ <cd:command name='high' value='hoch'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='immediatebetweenlist'/>
+ <cd:command name='immediatetolist' value='immediatetolist'/>
+ <cd:command name='in' value='in'/>
+ <cd:command name='incrementnumber' value='nummererhoehen'/>
+ <cd:command name='indenting' value='einziehen'/>
+ <cd:command name='inframed' value='imumriss'/>
+ <cd:command name='infull' value='volleswort'/>
+ <cd:command name='ininner' value='ininner'/>
+ <cd:command name='inleft' value='imlinken'/>
+ <cd:command name='inleftedge' value='imlinkenrand'/>
+ <cd:command name='inleftmargin' value='inlinkermarginale'/>
+ <cd:command name='inline' value='inzeile'/>
+ <cd:command name='inmargin' value='inmarginalie'/>
+ <cd:command name='inmframed' value='immaumrise'/>
+ <cd:command name='inneredgedistance' value='inneredgedistance'/>
+ <cd:command name='inneredgewidth' value='inneredgewidth'/>
+ <cd:command name='innermargindistance' value='innermargindistance'/>
+ <cd:command name='innermarginwidth' value='innermarginwidth'/>
+ <cd:command name='inothermargin' value='inanderermarginale'/>
+ <cd:command name='inouter' value='inouter'/>
+ <cd:command name='inright' value='imrechten'/>
+ <cd:command name='inrightedge' value='imrechtenrand'/>
+ <cd:command name='inrightmargin' value='inrechtermarginale'/>
+ <cd:command name='installlanguage' value='installieresprache'/>
+ <cd:command name='interactionbar' value='interaktionsbalken'/>
+ <cd:command name='interactionbuttons' value='interaktionsknopfe'/>
+ <cd:command name='interactionmenu' value='interaktionsmenue'/>
+ <cd:command name='item' value='pos'/>
+ <cd:command name='items' value='posten'/>
+ <cd:command name='its' value='its'/>
+ <cd:command name='keepblocks' value='behaltebloecke'/>
+ <cd:command name='label' value='label'/>
+ <cd:command name='labels' value='labels'/>
+ <cd:command name='labeltext' value='labeltext'/>
+ <cd:command name='language' value='sprache'/>
+ <cd:command name='leftaligned' value='linksbuendig'/>
+ <cd:command name='leftedgedistance' value='abstandlinkerrand'/>
+ <cd:command name='leftedgewidth' value='breitelinkerrand'/>
+ <cd:command name='leftmargindistance' value='linkemarginalafstand'/>
+ <cd:command name='leftmarginwidth' value='linkemarginalbreite'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='liniendicke'/>
+ <cd:command name='listheight' value='listenhoehe'/>
+ <cd:command name='listlength' value='listenlaenge'/>
+ <cd:command name='listsymbol' value='listsymbol'/>
+ <cd:command name='listwidth' value='listenbreite'/>
+ <cd:command name='logfields' value='registrierefelder'/>
+ <cd:command name='lohi' value='tiho'/>
+ <cd:command name='low' value='tief'/>
+ <cd:command name='macroname' value='name'/>
+ <cd:command name='mainlanguage' value='hauptsprache'/>
+ <cd:command name='makeupheight' value='satzhoehe'/>
+ <cd:command name='makeupwidth' value='satzbreite'/>
+ <cd:command name='mar' value='mar'/>
+ <cd:command name='margindistance' value='marginalafstand'/>
+ <cd:command name='marginrule' value='marginallinie'/>
+ <cd:command name='margintext' value='marginaltext'/>
+ <cd:command name='margintitle' value='marginaltitel'/>
+ <cd:command name='marginwidth' value='marginalbreite'/>
+ <cd:command name='marginword' value='marginalwort'/>
+ <cd:command name='marking' value='beschriftung'/>
+ <cd:command name='markversion' value='beschrifteversion'/>
+ <cd:command name='mathematics' value='mathematik'/>
+ <cd:command name='menubutton' value='menueknopf'/>
+ <cd:command name='mframed' value='maumrise'/>
+ <cd:command name='midaligned' value='zentriert'/>
+ <cd:command name='mirror' value='spiegeln'/>
+ <cd:command name='month' value='monat'/>
+ <cd:command name='moveformula' value='moveformula'/>
+ <cd:command name='moveongrid' value='amgitterneuausrichten'/>
+ <cd:command name='movesidefloat' value='movesidefloat'/>
+ <cd:command name='navigating' value='navigating'/>
+ <cd:command name='nodimension' value='keindimension'/>
+ <cd:command name='noheaderandfooterlines' value='keinekopfundfusszeilen'/>
+ <cd:command name='noindenting' value='nichteinziehen'/>
+ <cd:command name='nolist' value='keineliste'/>
+ <cd:command name='nomarking' value='keinebeschriftung'/>
+ <cd:command name='nomoreblocks' value='keinebloeckemehr'/>
+ <cd:command name='nomorefiles' value='keinedateienmehr'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='keinspatium'/>
+ <cd:command name='note' value='notiz'/>
+ <cd:command name='notopandbottomlines' value='keinzeilenobenundunten'/>
+ <cd:command name='notsmallcapped' value='nokap'/>
+ <cd:command name='nowhitespace' value='keinzwischenraum'/>
+ <cd:command name='numberofsubpages' value='numberofsubpages'/>
+ <cd:command name='numbers' value='ziffern'/>
+ <cd:command name='outeredgedistance' value='outeredgedistance'/>
+ <cd:command name='outeredgewidth' value='outeredgewidth'/>
+ <cd:command name='outermargindistance' value='outermargindistance'/>
+ <cd:command name='outermarginwidth' value='outermarginwidth'/>
+ <cd:command name='packed' value='kleinerdurchschuss'/>
+ <cd:command name='page' value='seite'/>
+ <cd:command name='pagedepth' value='pagedepth'/>
+ <cd:command name='pagenumber' value='seitenummer'/>
+ <cd:command name='pageoffset' value='pageoffset'/>
+ <cd:command name='pagereference' value='seitenreferenz'/>
+ <cd:command name='pagetype' value='seitentyp'/>
+ <cd:command name='paperheight' value='papierhoehe'/>
+ <cd:command name='paperwidth' value='papierbreite'/>
+ <cd:command name='periods' value='punkt'/>
+ <cd:command name='plaatsruwelijst' value='placerawlist'/>
+ <cd:command name='placebookmarks' value='platzierebookmarks'/>
+ <cd:command name='placecombinedlist' value='platzierezusammengestellteliste'/>
+ <cd:command name='placefloat' value='placefloat'/>
+ <cd:command name='placefootnotes' value='platzierefussnoten'/>
+ <cd:command name='placeformula' value='platziereformel'/>
+ <cd:command name='placeheadnumber' value='placeheadnumber'/>
+ <cd:command name='placeheadtext' value='placeheadtext'/>
+ <cd:command name='placelegend' value='platzierelegende'/>
+ <cd:command name='placelist' value='platziereliste'/>
+ <cd:command name='placelocalfootnotes' value='platzierelokalefussnoten'/>
+ <cd:command name='placelogos' value='platzierelogo'/>
+ <cd:command name='placeongrid' value='amgitterausrichten'/>
+ <cd:command name='placeontopofeachother' value='platziereuntereinander'/>
+ <cd:command name='placepagenumber' value='placepagenumber'/>
+ <cd:command name='placereferencelist' value='placereferencelist'/>
+ <cd:command name='placeregister' value='platziereregister'/>
+ <cd:command name='placerule' value='placerule'/>
+ <cd:command name='placesidebyside' value='platzierenebeneinander'/>
+ <cd:command name='placesubformula' value='platziereunterformel'/>
+ <cd:command name='placetextvariable' value='placetextvariable'/>
+ <cd:command name='position' value='position'/>
+ <cd:command name='positiontext' value='positiontext'/>
+ <cd:command name='printpaperheight' value='printpapierhoehe'/>
+ <cd:command name='printpaperwidth' value='printpapierbreite'/>
+ <cd:command name='processblocks' value='bearbeitebloecke'/>
+ <cd:command name='processpage' value='bearbeiteseite'/>
+ <cd:command name='product' value='produkt'/>
+ <cd:command name='program' value='programm'/>
+ <cd:command name='project' value='projekt'/>
+ <cd:command name='publication' value='publikation'/>
+ <cd:command name='quotation' value='zitat'/>
+ <cd:command name='quote' value='zitieren'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='wiederholen'/>
+ <cd:command name='ref' value='ref'/>
+ <cd:command name='reference' value='referenz'/>
+ <cd:command name='referral' value='verweis'/>
+ <cd:command name='referraldate' value='verweisdatum'/>
+ <cd:command name='referring' value='referieren'/>
+ <cd:command name='remark' value='bemerkung'/>
+ <cd:command name='reset' value='ruecksetzten'/>
+ <cd:command name='resetmarking' value='ruecksetztenbeschriftung'/>
+ <cd:command name='resetnumber' value='resetnumber'/>
+ <cd:command name='resettext' value='resettextcontent'/>
+ <cd:command name='rightaligned' value='rechtsbuendig'/>
+ <cd:command name='rightedgedistance' value='abstandrechterrand'/>
+ <cd:command name='rightedgewidth' value='breiterechterrand'/>
+ <cd:command name='rightmargindistance' value='rechtemarginalafstand'/>
+ <cd:command name='rightmarginwidth' value='rechtemarginalbreite'/>
+ <cd:command name='romannumerals' value='roemischezahlen'/>
+ <cd:command name='rotate' value='drehen'/>
+ <cd:command name='scale' value='format'/>
+ <cd:command name='screen' value='bildschirm'/>
+ <cd:command name='selectblocks' value='waehlebloeckeaus'/>
+ <cd:command name='selectpaper' value='waehlepapieraus'/>
+ <cd:command name='selectversion' value='waehleversionaus'/>
+ <cd:command name='setnumber' value='setnumber'/>
+ <cd:command name='settextcontent' value='settext'/>
+ <cd:command name='settextvariable' value='settextvariable'/>
+ <cd:command name='setupalign' value='stelleausrichtungein'/>
+ <cd:command name='setupanswerarea' value='setupanswerarea'/>
+ <cd:command name='setuparranging' value='stelleanordnenein'/>
+ <cd:command name='setupbackground' value='stellehintergrundein'/>
+ <cd:command name='setupbackgrounds' value='stellehintergruendeein'/>
+ <cd:command name='setupblackrules' value='stellerechteckein'/>
+ <cd:command name='setupblank' value='stelleblankoein'/>
+ <cd:command name='setupblock' value='stelleblockein'/>
+ <cd:command name='setupbodyfont' value='stellefliesstextein'/>
+ <cd:command name='setupbodyfontenvironment' value='stellefliesstextumgebungein'/>
+ <cd:command name='setupbottom' value='stelleuntenein'/>
+ <cd:command name='setupbottomtexts' value='stelletextuntenein'/>
+ <cd:command name='setupbuffer' value='stellepufferein'/>
+ <cd:command name='setupbuttons' value='stelleknopfein'/>
+ <cd:command name='setupcapitals' value='stelleversalienein'/>
+ <cd:command name='setupcaption' value='stellebildunterschriftein'/>
+ <cd:command name='setupcaptions' value='stellebilderunterschriftein'/>
+ <cd:command name='setupclipping' value='stelleausschnittein'/>
+ <cd:command name='setupcolor' value='stellefarbeein'/>
+ <cd:command name='setupcolors' value='stellefarbenein'/>
+ <cd:command name='setupcolumns' value='stellespaltenein'/>
+ <cd:command name='setupcolumnset' value='setupcolumnset'/>
+ <cd:command name='setupcolumnsetlines' value='setupcolumnsetlines'/>
+ <cd:command name='setupcolumnsetstart' value='setupcolumnsetstart'/>
+ <cd:command name='setupcombinations' value='stellekombinationein'/>
+ <cd:command name='setupcombinedlist' value='stellezusammengestelltelisteein'/>
+ <cd:command name='setupcomment' value='stellekommentarein'/>
+ <cd:command name='setupdescriptions' value='definierebeschreibungen'/>
+ <cd:command name='setupenumerations' value='stellebeschreibungein'/>
+ <cd:command name='setupexternalfigures' value='stelleexterneabbildungenein'/>
+ <cd:command name='setupfield' value='stellefeldein'/>
+ <cd:command name='setupfields' value='stellefelderin'/>
+ <cd:command name='setupfillinlines' value='stellegefuelltezeileein'/>
+ <cd:command name='setupfillinrules' value='stellegefuelltesrechteckein'/>
+ <cd:command name='setupfloat' value='stellegleitobjektein'/>
+ <cd:command name='setupfloats' value='stellegleitobjekteein'/>
+ <cd:command name='setupfloatsplitting' value='stelleplatziegeteiltegleitobjekt'/>
+ <cd:command name='setupfooter' value='stellefusszeileein'/>
+ <cd:command name='setupfootertexts' value='stellefusszeilentextein'/>
+ <cd:command name='setupfootnotedefinition' value='stellefussnotendefinitionein'/>
+ <cd:command name='setupfootnotes' value='stellefussnotenein'/>
+ <cd:command name='setupforms' value='setupforms'/>
+ <cd:command name='setupformulas' value='stelleformelnein'/>
+ <cd:command name='setupframed' value='stelleumrahmtein'/>
+ <cd:command name='setupframedtexts' value='stelleumrahmtetexteein'/>
+ <cd:command name='setuphead' value='stelleueberschriftein'/>
+ <cd:command name='setupheader' value='stellekopfzeileein'/>
+ <cd:command name='setupheadertexts' value='stellekopfzeilentextein'/>
+ <cd:command name='setupheadnumber' value='stellekopfzahlein'/>
+ <cd:command name='setupheads' value='stelleueberschriftenein'/>
+ <cd:command name='setupheadtext' value='stelleueberschrifttextein'/>
+ <cd:command name='setuphyphenmark' value='stellebindestrichein'/>
+ <cd:command name='setupindentations' value='stelleeinzuegein'/>
+ <cd:command name='setupindenting' value='stelleeinziehenein'/>
+ <cd:command name='setupinmargin' value='stelleinmarginalieein'/>
+ <cd:command name='setupinteraction' value='stelleinteraktionein'/>
+ <cd:command name='setupinteractionbar' value='stelleinteraktionsbalkenein'/>
+ <cd:command name='setupinteractionmenu' value='stelleinteraktionsmenueein'/>
+ <cd:command name='setupinteractionscreen' value='stelleinteraktionsbildschirmein'/>
+ <cd:command name='setupinterlinespace' value='stellezeilenabstandein'/>
+ <cd:command name='setupitemgroup' value='setupitemgroup'/>
+ <cd:command name='setupitemgroups' value='stelleaufzaehlungenein'/>
+ <cd:command name='setupitems' value='stellepostenein'/>
+ <cd:command name='setuplabeltext' value='stellelabeltextein'/>
+ <cd:command name='setuplanguage' value='stellespracheein'/>
+ <cd:command name='setuplayout' value='stellelayoutein'/>
+ <cd:command name='setuplegend' value='stellelegendeein'/>
+ <cd:command name='setuplinenumbering' value='stellezeilennumerierungein'/>
+ <cd:command name='setuplines' value='stellezeilenein'/>
+ <cd:command name='setuplinewidth' value='stellelinienbreiteein'/>
+ <cd:command name='setuplist' value='stellelisteein'/>
+ <cd:command name='setupmakeup' value='stelleumbruchein'/>
+ <cd:command name='setupmarginblocks' value='stellemarginalblockein'/>
+ <cd:command name='setupmarginrules' value='stellemarginallinieein'/>
+ <cd:command name='setupmarking' value='stellebeschriftungein'/>
+ <cd:command name='setupmathalignment' value='setupmathalignment'/>
+ <cd:command name='setupnarrower' value='stelleengerein'/>
+ <cd:command name='setupnumber' value='setupnumber'/>
+ <cd:command name='setupnumbering' value='stellenummerierungein'/>
+ <cd:command name='setupoppositeplacing' value='stellegegenueberplatzierenein'/>
+ <cd:command name='setupoutput' value='stelleausgabeein'/>
+ <cd:command name='setuppagecomment' value='stelleseitenkommentarein'/>
+ <cd:command name='setuppagenumber' value='stelleseitennummerein'/>
+ <cd:command name='setuppagenumbering' value='stelleseitennummeriernungein'/>
+ <cd:command name='setuppagetransitions' value='stelleseitenuebergangein'/>
+ <cd:command name='setuppalet' value='stellepaletteein'/>
+ <cd:command name='setuppaper' value='setuppaper'/>
+ <cd:command name='setuppapersize' value='stellepapierformatein'/>
+ <cd:command name='setupparagraphnumbering' value='stelleabsatznummerierungein'/>
+ <cd:command name='setupparagraphs' value='stelleabsaetzeein'/>
+ <cd:command name='setupplacement' value='setupplacement'/>
+ <cd:command name='setuppositioning' value='stellepositionierenein'/>
+ <cd:command name='setupprofiles' value='stelleprofilein'/>
+ <cd:command name='setupprograms' value='stelleprogrammein'/>
+ <cd:command name='setuppublications' value='stellepublikationein'/>
+ <cd:command name='setupquote' value='stellezitierenein'/>
+ <cd:command name='setupreferencelist' value='stellereferenzlisteein'/>
+ <cd:command name='setupreferencing' value='stellereferenzierenein'/>
+ <cd:command name='setupregister' value='stelleregisterein'/>
+ <cd:command name='setuprotate' value='stelledrehenein'/>
+ <cd:command name='setuprule' value='setuprule'/>
+ <cd:command name='setups' value='einstellungen'/>
+ <cd:command name='setupscreens' value='stellerasterein'/>
+ <cd:command name='setupsection' value='stelleabschnittein'/>
+ <cd:command name='setupsectionblock' value='stelleabschnittsblockein'/>
+ <cd:command name='setupsorting' value='stellesortierenein'/>
+ <cd:command name='setupspacing' value='stellespatiumein'/>
+ <cd:command name='setupstartstop' value='setupstartstop'/>
+ <cd:command name='setupstrut' value='setupstrut'/>
+ <cd:command name='setupsubpagenumber' value='stelleunterseitennummerein'/>
+ <cd:command name='setupsymbolset' value='stellesymbolsetein'/>
+ <cd:command name='setupsynchronization' value='stellesynchronisationein'/>
+ <cd:command name='setupsynchronizationbar' value='stellesynchronisationsbalkenein'/>
+ <cd:command name='setupsynonyms' value='stellesynonymein'/>
+ <cd:command name='setupsystem' value='stellesystemein'/>
+ <cd:command name='setuptab' value='stelletabein'/>
+ <cd:command name='setuptables' value='stelletabellenein'/>
+ <cd:command name='setuptabulate' value='stelletabulatorein'/>
+ <cd:command name='setuptext' value='stelletextein'/>
+ <cd:command name='setuptextposition' value='setuptextposition'/>
+ <cd:command name='setuptextrules' value='stelletextumrissein'/>
+ <cd:command name='setuptexttexts' value='stelletexttexteein'/>
+ <cd:command name='setuptextvariable' value='setuptextvariable'/>
+ <cd:command name='setupthinrules' value='stelleduennerumrissein'/>
+ <cd:command name='setuptolerance' value='stelletoleranzein'/>
+ <cd:command name='setuptop' value='stellenobenein'/>
+ <cd:command name='setuptoptexts' value='stelletextobenein'/>
+ <cd:command name='setuptype' value='stelletipein'/>
+ <cd:command name='setuptyping' value='stelletippenein'/>
+ <cd:command name='setupunderbar' value='stelleunterstreichenein'/>
+ <cd:command name='setupurl' value='stelleurlein'/>
+ <cd:command name='setupversions' value='stelleversionein'/>
+ <cd:command name='setupwhitespace' value='stellezwischenraumein'/>
+ <cd:command name='showbodyfont' value='zeigefliesstext'/>
+ <cd:command name='showbodyfontenvironment' value='zeigefliesstextumgebung'/>
+ <cd:command name='showcolor' value='zeigefarbe'/>
+ <cd:command name='showcolorgroup' value='zeigefarbengruppe'/>
+ <cd:command name='showexternalfigures' value='zeigeexterneabbildungen'/>
+ <cd:command name='showfields' value='zeigefelder'/>
+ <cd:command name='showframe' value='zeigerahmen'/>
+ <cd:command name='showgrid' value='zeigegitter'/>
+ <cd:command name='showlayout' value='zeigelayout'/>
+ <cd:command name='showmakeup' value='zeigeumbruch'/>
+ <cd:command name='showpalet' value='zeigepalette'/>
+ <cd:command name='showprint' value='zeigedruck'/>
+ <cd:command name='showsetups' value='zeigeeinstellungen'/>
+ <cd:command name='showstruts' value='zeigestruts'/>
+ <cd:command name='showsymbolset' value='showsymbolset'/>
+ <cd:command name='smallcapped' value='kap'/>
+ <cd:command name='someline' value='einezeile'/>
+ <cd:command name='somewhere' value='irgendwo'/>
+ <cd:command name='space' value='spatium'/>
+ <cd:command name='splitfloat' value='teilegleitobjekt'/>
+ <cd:command name='startalignment' value='startausrichtung'/>
+ <cd:command name='startbackground' value='starthintergrund'/>
+ <cd:command name='startcoding' value='startkodierung'/>
+ <cd:command name='startcolor' value='startfarbe'/>
+ <cd:command name='startcolumnmakeup' value='startcolumnmakeup'/>
+ <cd:command name='startcolumns' value='startspalten'/>
+ <cd:command name='startcolumnset' value='startcolumnset'/>
+ <cd:command name='startcombination' value='startkombination'/>
+ <cd:command name='startcomponent' value='startkomponente'/>
+ <cd:command name='startdocument' value='startdokument'/>
+ <cd:command name='startenvironment' value='startumgebung'/>
+ <cd:command name='startfigure' value='startabbildung'/>
+ <cd:command name='startglobal' value='startglobal'/>
+ <cd:command name='startline' value='startzeile'/>
+ <cd:command name='startlinecorrection' value='startzeilenkorrektur'/>
+ <cd:command name='startlinenumbering' value='startzeilennumerierung'/>
+ <cd:command name='startlines' value='startzeilen'/>
+ <cd:command name='startlocal' value='startlokal'/>
+ <cd:command name='startlocalfootnotes' value='startlokalefussnoten'/>
+ <cd:command name='startmakeup' value='startumbruch'/>
+ <cd:command name='startmarginblock' value='startmarginalblock'/>
+ <cd:command name='startmarginrule' value='startmarginallinie'/>
+ <cd:command name='startnarrower' value='startenger'/>
+ <cd:command name='startopposite' value='startgegenueber'/>
+ <cd:command name='startoverlay' value='startoverlay'/>
+ <cd:command name='startoverzicht' value='startueberblick'/>
+ <cd:command name='startpacked' value='startkleinerdurchschuss'/>
+ <cd:command name='startpositioning' value='startpositionieren'/>
+ <cd:command name='startproduct' value='startprodukt'/>
+ <cd:command name='startprofile' value='startprofil'/>
+ <cd:command name='startproject' value='startprojekt'/>
+ <cd:command name='startquotation' value='startzitat'/>
+ <cd:command name='startraster' value='startraster'/>
+ <cd:command name='startsymbolset' value='startsymbolset'/>
+ <cd:command name='startsynchronization' value='startsynchronisation'/>
+ <cd:command name='starttable' value='starttabelle'/>
+ <cd:command name='starttables' value='starttabellen'/>
+ <cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextrule' value='starttextlinie'/>
+ <cd:command name='startunpacked' value='startgrosserdurchschuss'/>
+ <cd:command name='startversion' value='startversion'/>
+ <cd:command name='stopalignment' value='stopausrichtung'/>
+ <cd:command name='stopbackground' value='stophintergrund'/>
+ <cd:command name='stopcoding' value='stopkodierung'/>
+ <cd:command name='stopcolor' value='stopfarbe'/>
+ <cd:command name='stopcolumnmakeup' value='stopcolumnmakeup'/>
+ <cd:command name='stopcolumns' value='stopspalten'/>
+ <cd:command name='stopcolumnset' value='stopcolumnset'/>
+ <cd:command name='stopcombination' value='stopkombination'/>
+ <cd:command name='stopcomponent' value='stopkomponente'/>
+ <cd:command name='stopdocument' value='stopdokument'/>
+ <cd:command name='stopenvironment' value='stopumgebung'/>
+ <cd:command name='stopglobal' value='stopglobal'/>
+ <cd:command name='stopline' value='stopzeile'/>
+ <cd:command name='stoplinecorrection' value='stopzeilenkorrektur'/>
+ <cd:command name='stoplinenumbering' value='stopzeilennumerierung'/>
+ <cd:command name='stoplines' value='stopzeilen'/>
+ <cd:command name='stoplocal' value='stoplokal'/>
+ <cd:command name='stoplocalfootnotes' value='stoplokalefussnoten'/>
+ <cd:command name='stopmakeup' value='stopumbruch'/>
+ <cd:command name='stopmarginblock' value='stopmarginalblock'/>
+ <cd:command name='stopmarginrule' value='stopmarginallinie'/>
+ <cd:command name='stopnarrower' value='stopenger'/>
+ <cd:command name='stopopposite' value='stopgegenueber'/>
+ <cd:command name='stopoverlay' value='stopoverlay'/>
+ <cd:command name='stopoverzicht' value='stopueberblick'/>
+ <cd:command name='stoppacked' value='stopkleinerdurchschuss'/>
+ <cd:command name='stoppositioning' value='stoppositionieren'/>
+ <cd:command name='stopproduct' value='stopprodukt'/>
+ <cd:command name='stopprofile' value='stopprofil'/>
+ <cd:command name='stopproject' value='stopprojekt'/>
+ <cd:command name='stopquotation' value='stopzitat'/>
+ <cd:command name='stopraster' value='stopraster'/>
+ <cd:command name='stopsynchronization' value='stopsynchronisation'/>
+ <cd:command name='stoptable' value='stoptabelle'/>
+ <cd:command name='stoptables' value='stoptabellen'/>
+ <cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextrule' value='stoptextlinie'/>
+ <cd:command name='stopunpacked' value='stopgrosserdurchschuss'/>
+ <cd:command name='stopversion' value='stopversion'/>
+ <cd:command name='stretched' value='gestreckt'/>
+ <cd:command name='subformulanumber' value='unterformelnummer'/>
+ <cd:command name='subpagenumber' value='subpagenumber'/>
+ <cd:command name='switchtobodyfont' value='wechselezumfliesstext'/>
+ <cd:command name='switchtorawfont' value='switchtorawfont'/>
+ <cd:command name='sym' value='sym'/>
+ <cd:command name='symbol' value='symbol'/>
+ <cd:command name='synchronizationbar' value='synchronisationsbalken'/>
+ <cd:command name='synchronize' value='synchronisieren'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testcolumn'/>
+ <cd:command name='testpage' value='testpage'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='texthoehe'/>
+ <cd:command name='textreference' value='textreferenz'/>
+ <cd:command name='textrule' value='textlinie'/>
+ <cd:command name='textvariable' value='textvariable'/>
+ <cd:command name='textwidth' value='textbreite'/>
+ <cd:command name='thinrule' value='duennelinie'/>
+ <cd:command name='thinrules' value='duennerumriss'/>
+ <cd:command name='tooltip' value='tooltip'/>
+ <cd:command name='topdistance' value='abstandoben'/>
+ <cd:command name='topheight' value='hoeheoben'/>
+ <cd:command name='topspace' value='kopfweite'/>
+ <cd:command name='totalnumberofpages' value='gesamtseitenanzahl'/>
+ <cd:command name='translate' value='uebersetzten'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='tip'/>
+ <cd:command name='type' value='tippen'/>
+ <cd:command name='typebuffer' value='tippepuffer'/>
+ <cd:command name='typefile' value='tippedatei'/>
+ <cd:command name='unitmeaning' value='bedeutung'/>
+ <cd:command name='unknown' value='unbekant'/>
+ <cd:command name='useJSscripts' value='verwendeJSscript'/>
+ <cd:command name='useURL' value='verwendeURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='verwendebloecke'/>
+ <cd:command name='usecommands' value='verwendebefehl'/>
+ <cd:command name='useencoding' value='benutzekodierung'/>
+ <cd:command name='useexternaldocument' value='verwendeexteresdokument'/>
+ <cd:command name='useexternalfigure' value='verwendeexterneabbildung'/>
+ <cd:command name='useexternalfile' value='verwendeexternedatei'/>
+ <cd:command name='useexternalfiles' value='verwendeexternedateien'/>
+ <cd:command name='useexternalsoundtrack' value='verwendeexternestonstueck'/>
+ <cd:command name='usemodule' value='verwendemodul'/>
+ <cd:command name='usemodules' value='verwendemodule'/>
+ <cd:command name='usepath' value='benutzeverzeichnis'/>
+ <cd:command name='usereferences' value='verwendereferenzen'/>
+ <cd:command name='usespecials' value='benutzespezielles'/>
+ <cd:command name='usesymbols' value='verwendesymbole'/>
+ <cd:command name='usetypescript' value='usetypescript'/>
+ <cd:command name='usetypescriptfile' value='usetypescriptfile'/>
+ <cd:command name='useurl' value='verwendeurl'/>
+ <cd:command name='version' value='version'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='wochentag'/>
+ <cd:command name='whitespace' value='zwischenraum'/>
+ <cd:command name='wordright' value='wortrechts'/>
+ <cd:command name='writebetweenlist' value='schreibezwischenliste'/>
+ <cd:command name='writetolist' value='schreibezurliste'/>
+ <cd:command name='writetoreferencelist' value='schreibezurreferenzliste'/>
+ <cd:command name='writetoregister' value='schreibezumregister'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml
new file mode 100644
index 000000000..26ee20ad3
--- /dev/null
+++ b/tex/context/interface/keys-en.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='en' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language en -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Addition'/>
+ <cd:variable name='Balloon' value='Balloon'/>
+ <cd:variable name='Character' value='Character'/>
+ <cd:variable name='Characters' value='Characters'/>
+ <cd:variable name='CloseDocument' value='CloseDocument'/>
+ <cd:variable name='ExitViewer' value='ExitViewer'/>
+ <cd:variable name='FirstPage' value='FirstPage'/>
+ <cd:variable name='FitHeight' value='FitHeight'/>
+ <cd:variable name='FitWidth' value='FitWidth'/>
+ <cd:variable name='GotoPage' value='GotoPage'/>
+ <cd:variable name='Greek' value='Greek'/>
+ <cd:variable name='Help' value='Help'/>
+ <cd:variable name='HideField' value='HideField'/>
+ <cd:variable name='HideLayer' value='HideLayer'/>
+ <cd:variable name='Key' value='Key'/>
+ <cd:variable name='LastPage' value='LastPage'/>
+ <cd:variable name='LoadForm' value='LoadForm'/>
+ <cd:variable name='MONTH' value='MONTH'/>
+ <cd:variable name='New' value='New'/>
+ <cd:variable name='NextJump' value='NextJump'/>
+ <cd:variable name='NextPage' value='NextPage'/>
+ <cd:variable name='Numbers' value='Numbers'/>
+ <cd:variable name='OpenNamedDocument' value='OpenNamedDocument'/>
+ <cd:variable name='Paragraph' value='Paragraph'/>
+ <cd:variable name='PauseMovie' value='PauseMovie'/>
+ <cd:variable name='PauseRendering' value='PauseRendering'/>
+ <cd:variable name='PauseSound' value='PauseSound'/>
+ <cd:variable name='PreviousJump' value='PreviousJump'/>
+ <cd:variable name='PreviousPage' value='PreviousPage'/>
+ <cd:variable name='PrintDocument' value='PrintDocument'/>
+ <cd:variable name='Query' value='Query'/>
+ <cd:variable name='QueryAgain' value='QueryAgain'/>
+ <cd:variable name='ResetForm' value='ResetForm'/>
+ <cd:variable name='ResumeMovie' value='ResumeMovie'/>
+ <cd:variable name='ResumeRendering' value='ResumeRendering'/>
+ <cd:variable name='ResumeSound' value='ResumeSound'/>
+ <cd:variable name='Romannumerals' value='Romannumerals'/>
+ <cd:variable name='SaveDocument' value='SaveDocument'/>
+ <cd:variable name='SaveForm' value='SaveForm'/>
+ <cd:variable name='SaveNamedDocument' value='SaveNamedDocument'/>
+ <cd:variable name='SearchAgain' value='SearchAgain'/>
+ <cd:variable name='SearchDocument' value='SearchDocument'/>
+ <cd:variable name='ShowBookmarks' value='ShowBookmarks'/>
+ <cd:variable name='ShowField' value='ShowField'/>
+ <cd:variable name='ShowThumbs' value='ShowThumbs'/>
+ <cd:variable name='StartMovie' value='StartMovie'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='StartSound'/>
+ <cd:variable name='StopMovie' value='StopMovie'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='StopSound'/>
+ <cd:variable name='SubmitForm' value='SubmitForm'/>
+ <cd:variable name='ToggleLayer' value='ToggleLayer'/>
+ <cd:variable name='ToggleViewer' value='ToggleViewer'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='ViewerHelp'/>
+ <cd:variable name='WEEKDAY' value='WEEKDAY'/>
+ <cd:variable name='WORD' value='WORD'/>
+ <cd:variable name='abbreviation' value='abbreviation'/>
+ <cd:variable name='abbreviations' value='abbreviations'/>
+ <cd:variable name='absolute' value='absolute'/>
+ <cd:variable name='action' value='action'/>
+ <cd:variable name='after' value='after'/>
+ <cd:variable name='all' value='all'/>
+ <cd:variable name='always' value='always'/>
+ <cd:variable name='answerarea' value='answerarea'/>
+ <cd:variable name='appendices' value='appendices'/>
+ <cd:variable name='appendix' value='appendix'/>
+ <cd:variable name='april' value='April'/>
+ <cd:variable name='atmargin' value='atmargin'/>
+ <cd:variable name='atpage' value='atpage'/>
+ <cd:variable name='august' value='August'/>
+ <cd:variable name='author' value='author'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autointro'/>
+ <cd:variable name='back' value='back'/>
+ <cd:variable name='background' value='background'/>
+ <cd:variable name='backmatter' value='backmatter'/>
+ <cd:variable name='backpart' value='backpart'/>
+ <cd:variable name='backspace' value='backspace'/>
+ <cd:variable name='backward' value='backward'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='before'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='big'/>
+ <cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigpreference' value='bigpreference'/>
+ <cd:variable name='blank' value='blank'/>
+ <cd:variable name='blockquote' value='blockquote'/>
+ <cd:variable name='bodymatter' value='bodymatter'/>
+ <cd:variable name='bodypart' value='bodypart'/>
+ <cd:variable name='bold' value='bold'/>
+ <cd:variable name='bolditalic' value='bolditalic'/>
+ <cd:variable name='boldslanted' value='boldslanted'/>
+ <cd:variable name='bookmark' value='bookmark'/>
+ <cd:variable name='both' value='both'/>
+ <cd:variable name='bottom' value='bottom'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='broad'/>
+ <cd:variable name='buffer' value='buffer'/>
+ <cd:variable name='by' value='by'/>
+ <cd:variable name='calligraphic' value='calligraphic'/>
+ <cd:variable name='cap' value='cap'/>
+ <cd:variable name='capital' value='capital'/>
+ <cd:variable name='center' value='center'/>
+ <cd:variable name='chapter' value='chapter'/>
+ <cd:variable name='character' value='character'/>
+ <cd:variable name='characters' value='characters'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='color'/>
+ <cd:variable name='column' value='column'/>
+ <cd:variable name='columns' value='columns'/>
+ <cd:variable name='command' value='command'/>
+ <cd:variable name='commands' value='commands'/>
+ <cd:variable name='comment' value='comment'/>
+ <cd:variable name='component' value='component'/>
+ <cd:variable name='concept' value='concept'/>
+ <cd:variable name='content' value='content'/>
+ <cd:variable name='contents' value='contents'/>
+ <cd:variable name='continue' value='continue'/>
+ <cd:variable name='controls' value='controls'/>
+ <cd:variable name='conversion' value='conversion'/>
+ <cd:variable name='current' value='current'/>
+ <cd:variable name='cutspace' value='cutspace'/>
+ <cd:variable name='date' value='date'/>
+ <cd:variable name='day' value='day'/>
+ <cd:variable name='december' value='December'/>
+ <cd:variable name='default' value='default'/>
+ <cd:variable name='depth' value='depth'/>
+ <cd:variable name='description' value='description'/>
+ <cd:variable name='disable' value='disable'/>
+ <cd:variable name='display' value='display'/>
+ <cd:variable name='dot' value='dot'/>
+ <cd:variable name='doublesided' value='doublesided'/>
+ <cd:variable name='down' value='down'/>
+ <cd:variable name='each' value='each'/>
+ <cd:variable name='edge' value='edge'/>
+ <cd:variable name='empty' value='empty'/>
+ <cd:variable name='end' value='end'/>
+ <cd:variable name='endnote' value='endnote'/>
+ <cd:variable name='enumeration' value='enumeration'/>
+ <cd:variable name='environment' value='environment'/>
+ <cd:variable name='even' value='even'/>
+ <cd:variable name='external' value='external'/>
+ <cd:variable name='fact' value='fact'/>
+ <cd:variable name='february' value='February'/>
+ <cd:variable name='figure' value='figure'/>
+ <cd:variable name='figures' value='figures'/>
+ <cd:variable name='file' value='file'/>
+ <cd:variable name='final' value='final'/>
+ <cd:variable name='first' value='first'/>
+ <cd:variable name='firstcolumn' value='firstcolumn'/>
+ <cd:variable name='firstpage' value='firstpage'/>
+ <cd:variable name='firstsubpage' value='firstsubpage'/>
+ <cd:variable name='fit' value='fit'/>
+ <cd:variable name='five' value='five'/>
+ <cd:variable name='fix' value='fix'/>
+ <cd:variable name='fixed' value='fixed'/>
+ <cd:variable name='flexible' value='flexible'/>
+ <cd:variable name='float' value='float'/>
+ <cd:variable name='flushinner' value='flushinner'/>
+ <cd:variable name='flushleft' value='flushleft'/>
+ <cd:variable name='flushouter' value='flushouter'/>
+ <cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='footer' value='footer'/>
+ <cd:variable name='footnote' value='footnote'/>
+ <cd:variable name='force' value='force'/>
+ <cd:variable name='foreground' value='foreground'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='formula'/>
+ <cd:variable name='formulae' value='formulae'/>
+ <cd:variable name='forward' value='forward'/>
+ <cd:variable name='four' value='four'/>
+ <cd:variable name='frame' value='frame'/>
+ <cd:variable name='framedtext' value='framedtext'/>
+ <cd:variable name='friday' value='friday'/>
+ <cd:variable name='frontmatter' value='frontmatter'/>
+ <cd:variable name='frontpart' value='frontpart'/>
+ <cd:variable name='global' value='global'/>
+ <cd:variable name='graphic' value='graphic'/>
+ <cd:variable name='graphics' value='graphics'/>
+ <cd:variable name='gray' value='gray'/>
+ <cd:variable name='greek' value='greek'/>
+ <cd:variable name='grid' value='grid'/>
+ <cd:variable name='halfline' value='halfline'/>
+ <cd:variable name='handwritten' value='handwritten'/>
+ <cd:variable name='hang' value='hang'/>
+ <cd:variable name='hanging' value='hanging'/>
+ <cd:variable name='head' value='head'/>
+ <cd:variable name='header' value='header'/>
+ <cd:variable name='height' value='height'/>
+ <cd:variable name='helptext' value='helptext'/>
+ <cd:variable name='hencefore' value='hencefore'/>
+ <cd:variable name='here' value='here'/>
+ <cd:variable name='hereafter' value='hereafter'/>
+ <cd:variable name='hidden' value='hidden'/>
+ <cd:variable name='hiding' value='hiding'/>
+ <cd:variable name='high' value='high'/>
+ <cd:variable name='horizontal' value='horizontal'/>
+ <cd:variable name='hyphenated' value='hyphenated'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='inbetween'/>
+ <cd:variable name='index' value='index'/>
+ <cd:variable name='indices' value='indices'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='inherit'/>
+ <cd:variable name='inleft' value='inleft'/>
+ <cd:variable name='inmargin' value='inmargin'/>
+ <cd:variable name='inner' value='inner'/>
+ <cd:variable name='inneredge' value='inneredge'/>
+ <cd:variable name='innermargin' value='innermargin'/>
+ <cd:variable name='inright' value='inright'/>
+ <cd:variable name='interaction' value='interaction'/>
+ <cd:variable name='interactionmenu' value='interactionmenu'/>
+ <cd:variable name='intermezzi' value='intermezzi'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='intext'/>
+ <cd:variable name='intro' value='intro'/>
+ <cd:variable name='italic' value='italic'/>
+ <cd:variable name='italicbold' value='italicbold'/>
+ <cd:variable name='item' value='item'/>
+ <cd:variable name='itemize' value='itemize'/>
+ <cd:variable name='its' value='its'/>
+ <cd:variable name='january' value='January'/>
+ <cd:variable name='joinedup' value='joinedup'/>
+ <cd:variable name='july' value='July'/>
+ <cd:variable name='june' value='June'/>
+ <cd:variable name='keep' value='keep'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='label'/>
+ <cd:variable name='landscape' value='landscape'/>
+ <cd:variable name='last' value='last'/>
+ <cd:variable name='lastcolumn' value='lastcolumn'/>
+ <cd:variable name='lastpage' value='lastpage'/>
+ <cd:variable name='lastpagenumber' value='lastpagenumber'/>
+ <cd:variable name='lastsubpage' value='lastsubpage'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='left'/>
+ <cd:variable name='leftedge' value='leftedge'/>
+ <cd:variable name='lefthanging' value='lefthanging'/>
+ <cd:variable name='leftmargin' value='leftmargin'/>
+ <cd:variable name='leftpage' value='leftpage'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='legend'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='line'/>
+ <cd:variable name='linenote' value='linenote'/>
+ <cd:variable name='lines' value='lines'/>
+ <cd:variable name='list' value='list'/>
+ <cd:variable name='local' value='local'/>
+ <cd:variable name='localenvironment' value='localenvironment'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='logos'/>
+ <cd:variable name='lohi' value='lohi'/>
+ <cd:variable name='loose' value='loose'/>
+ <cd:variable name='low' value='low'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='makeup'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='March'/>
+ <cd:variable name='margin' value='margin'/>
+ <cd:variable name='marginedge' value='marginedge'/>
+ <cd:variable name='margintitle' value='margintitle'/>
+ <cd:variable name='marking' value='marking'/>
+ <cd:variable name='mathalignment' value='mathalignment'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='mathmatrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='May'/>
+ <cd:variable name='mediaeval' value='mediaeval'/>
+ <cd:variable name='medium' value='medium'/>
+ <cd:variable name='middle' value='middle'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='minheight'/>
+ <cd:variable name='minwidth' value='minwidth'/>
+ <cd:variable name='mirrored' value='mirrored'/>
+ <cd:variable name='monday' value='monday'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='month'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='name'/>
+ <cd:variable name='narrow' value='narrow'/>
+ <cd:variable name='negative' value='negative'/>
+ <cd:variable name='never' value='never'/>
+ <cd:variable name='new' value='new'/>
+ <cd:variable name='next' value='next'/>
+ <cd:variable name='nextevenpage' value='nextevenpage'/>
+ <cd:variable name='nextoddpage' value='nextoddpage'/>
+ <cd:variable name='nextpage' value='nextpage'/>
+ <cd:variable name='nextsubpage' value='nextsubpage'/>
+ <cd:variable name='no' value='no'/>
+ <cd:variable name='nocheck' value='nocheck'/>
+ <cd:variable name='nofit' value='nofit'/>
+ <cd:variable name='nogrid' value='nogrid'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='nomarking'/>
+ <cd:variable name='none' value='none'/>
+ <cd:variable name='nonumber' value='nonumber'/>
+ <cd:variable name='normal' value='normal'/>
+ <cd:variable name='nospacing' value='nospacing'/>
+ <cd:variable name='not' value='not'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='nothanging'/>
+ <cd:variable name='nothyphenated' value='nothyphenated'/>
+ <cd:variable name='november' value='November'/>
+ <cd:variable name='nowhere' value='nowhere'/>
+ <cd:variable name='nowhite' value='nowhite'/>
+ <cd:variable name='number' value='number'/>
+ <cd:variable name='numbers' value='numbers'/>
+ <cd:variable name='october' value='October'/>
+ <cd:variable name='odd' value='odd'/>
+ <cd:variable name='off' value='off'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='old'/>
+ <cd:variable name='on' value='on'/>
+ <cd:variable name='one' value='one'/>
+ <cd:variable name='opposite' value='opposite'/>
+ <cd:variable name='outer' value='outer'/>
+ <cd:variable name='outeredge' value='outeredge'/>
+ <cd:variable name='outermargin' value='outermargin'/>
+ <cd:variable name='overbar' value='overbar'/>
+ <cd:variable name='overbars' value='overbars'/>
+ <cd:variable name='overlay' value='overlay'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='overstrike'/>
+ <cd:variable name='overstrikes' value='overstrikes'/>
+ <cd:variable name='packed' value='packed'/>
+ <cd:variable name='page' value='page'/>
+ <cd:variable name='pagecomment' value='pagecomment'/>
+ <cd:variable name='pagenumber' value='pagenumber'/>
+ <cd:variable name='paper' value='paper'/>
+ <cd:variable name='paragraph' value='paragraph'/>
+ <cd:variable name='part' value='part'/>
+ <cd:variable name='positive' value='positive'/>
+ <cd:variable name='postponing' value='postponing'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='preference'/>
+ <cd:variable name='preview' value='preview'/>
+ <cd:variable name='previous' value='previous'/>
+ <cd:variable name='previousevenpage' value='previousevenpage'/>
+ <cd:variable name='previousoddpage' value='previousoddpage'/>
+ <cd:variable name='previouspage' value='previouspage'/>
+ <cd:variable name='previoussubpage' value='previoussubpage'/>
+ <cd:variable name='printable' value='printable'/>
+ <cd:variable name='process' value='process'/>
+ <cd:variable name='product' value='product'/>
+ <cd:variable name='program' value='program'/>
+ <cd:variable name='project' value='project'/>
+ <cd:variable name='protected' value='protected'/>
+ <cd:variable name='quadruple' value='quadruple'/>
+ <cd:variable name='quotation' value='quotation'/>
+ <cd:variable name='quote' value='quote'/>
+ <cd:variable name='ran' value='ran'/>
+ <cd:variable name='random' value='random'/>
+ <cd:variable name='readonly' value='readonly'/>
+ <cd:variable name='rectangular' value='rectangular'/>
+ <cd:variable name='referral' value='referral'/>
+ <cd:variable name='register' value='register'/>
+ <cd:variable name='regular' value='regular'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relative'/>
+ <cd:variable name='repeat' value='repeat'/>
+ <cd:variable name='required' value='required'/>
+ <cd:variable name='reset' value='reset'/>
+ <cd:variable name='reverse' value='reverse'/>
+ <cd:variable name='right' value='right'/>
+ <cd:variable name='rightedge' value='rightedge'/>
+ <cd:variable name='righthanging' value='righthanging'/>
+ <cd:variable name='rightmargin' value='rightmargin'/>
+ <cd:variable name='rightpage' value='rightpage'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='roman'/>
+ <cd:variable name='romannumerals' value='romannumerals'/>
+ <cd:variable name='rotate' value='rotate'/>
+ <cd:variable name='rotated' value='rotated'/>
+ <cd:variable name='round' value='round'/>
+ <cd:variable name='row' value='row'/>
+ <cd:variable name='rule' value='rule'/>
+ <cd:variable name='samepage' value='samepage'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sansbold'/>
+ <cd:variable name='sansserif' value='sansserif'/>
+ <cd:variable name='saturday' value='saturday'/>
+ <cd:variable name='screen' value='screen'/>
+ <cd:variable name='section' value='section'/>
+ <cd:variable name='sectionblockenvironment' value='sectionblockenvironment'/>
+ <cd:variable name='sectionnumber' value='sectionnumber'/>
+ <cd:variable name='see' value='see'/>
+ <cd:variable name='september' value='September'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='serried'/>
+ <cd:variable name='setups' value='setups'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='short' value='short'/>
+ <cd:variable name='singlesided' value='singlesided'/>
+ <cd:variable name='slanted' value='slanted'/>
+ <cd:variable name='slantedbold' value='slantedbold'/>
+ <cd:variable name='small' value='small'/>
+ <cd:variable name='smallbodyfont' value='smallbodyfont'/>
+ <cd:variable name='smallbold' value='smallbold'/>
+ <cd:variable name='smallbolditalic' value='smallbolditalic'/>
+ <cd:variable name='smallboldslanted' value='smallboldslanted'/>
+ <cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smallitalic' value='smallitalic'/>
+ <cd:variable name='smallitalicbold' value='smallitalicbold'/>
+ <cd:variable name='smallnormal' value='smallnormal'/>
+ <cd:variable name='smallslanted' value='smallslanted'/>
+ <cd:variable name='smallslantedbold' value='smallslantedbold'/>
+ <cd:variable name='smalltype' value='smalltype'/>
+ <cd:variable name='somewhere' value='somewhere'/>
+ <cd:variable name='sorted' value='sorted'/>
+ <cd:variable name='space' value='space'/>
+ <cd:variable name='spacing' value='spacing'/>
+ <cd:variable name='speech' value='speech'/>
+ <cd:variable name='split' value='split'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standard'/>
+ <cd:variable name='start' value='start'/>
+ <cd:variable name='starter' value='starter'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='stop'/>
+ <cd:variable name='stopper' value='stopper'/>
+ <cd:variable name='stretch' value='stretch'/>
+ <cd:variable name='strict' value='strict'/>
+ <cd:variable name='strong' value='strong'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='sub'/>
+ <cd:variable name='subbackward' value='subbackward'/>
+ <cd:variable name='subformula' value='subformula'/>
+ <cd:variable name='subforward' value='subforward'/>
+ <cd:variable name='subject' value='subject'/>
+ <cd:variable name='subpage' value='subpage'/>
+ <cd:variable name='subsection' value='subsection'/>
+ <cd:variable name='subsubject' value='subsubject'/>
+ <cd:variable name='subsubsection' value='subsubsection'/>
+ <cd:variable name='subsubsubject' value='subsubsubject'/>
+ <cd:variable name='subsubsubsection' value='subsubsubsection'/>
+ <cd:variable name='subsubsubsubject' value='subsubsubsubject'/>
+ <cd:variable name='subsubsubsubsection' value='subsubsubsubsection'/>
+ <cd:variable name='subsubsubsubsubject' value='subsubsubsubsubject'/>
+ <cd:variable name='subsubsubsubsubsection' value='subsubsubsubsubsection'/>
+ <cd:variable name='subsubsubsubsubsubject' value='subsubsubsubsubsubject'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='subsubsubsubsubsubsection'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='subsubsubsubsubsubsubject'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsection'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubject'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsubsection'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubsubject'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsubsubsection'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubsubsubject'/>
+ <cd:variable name='sunday' value='sunday'/>
+ <cd:variable name='support' value='support'/>
+ <cd:variable name='sym' value='sym'/>
+ <cd:variable name='symbol' value='symbol'/>
+ <cd:variable name='synchronize' value='synchronize'/>
+ <cd:variable name='system' value='system'/>
+ <cd:variable name='table' value='table'/>
+ <cd:variable name='tablehead' value='tablehead'/>
+ <cd:variable name='tables' value='tables'/>
+ <cd:variable name='tabletail' value='tabletail'/>
+ <cd:variable name='tabulate' value='tabulate'/>
+ <cd:variable name='tabulatehead' value='tabulatehead'/>
+ <cd:variable name='tabulatetail' value='tabulatetail'/>
+ <cd:variable name='tall' value='tall'/>
+ <cd:variable name='teletype' value='teletype'/>
+ <cd:variable name='temporary' value='temporary'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='text'/>
+ <cd:variable name='three' value='three'/>
+ <cd:variable name='thursday' value='thursday'/>
+ <cd:variable name='title' value='title'/>
+ <cd:variable name='toggle' value='wissel'/>
+ <cd:variable name='tolerant' value='tolerant'/>
+ <cd:variable name='top' value='top'/>
+ <cd:variable name='tuesday' value='tuesday'/>
+ <cd:variable name='two' value='two'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='type'/>
+ <cd:variable name='typing' value='typing'/>
+ <cd:variable name='unavailable' value='unavailable'/>
+ <cd:variable name='underbar' value='underbar'/>
+ <cd:variable name='underbars' value='underbars'/>
+ <cd:variable name='unit' value='unit'/>
+ <cd:variable name='units' value='units'/>
+ <cd:variable name='unknown' value='unknown'/>
+ <cd:variable name='unpacked' value='unpacked'/>
+ <cd:variable name='up' value='up'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='used'/>
+ <cd:variable name='value' value='value'/>
+ <cd:variable name='vertical' value='vertical'/>
+ <cd:variable name='very' value='very'/>
+ <cd:variable name='verystrict' value='verystrict'/>
+ <cd:variable name='verytolerant' value='verytolerant'/>
+ <cd:variable name='weak' value='weak'/>
+ <cd:variable name='wednesday' value='wednesday'/>
+ <cd:variable name='week' value='week'/>
+ <cd:variable name='weekday' value='weekday'/>
+ <cd:variable name='white' value='white'/>
+ <cd:variable name='wide' value='wide'/>
+ <cd:variable name='width' value='width'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='year'/>
+ <cd:variable name='yes' value='yes'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language en -->
+
+ <cd:constants>
+ <cd:constant name='action' value='action'/>
+ <cd:constant name='address' value='address'/>
+ <cd:constant name='after' value='after'/>
+ <cd:constant name='afterhead' value='afterhead'/>
+ <cd:constant name='afterkey' value='afterkey'/>
+ <cd:constant name='align' value='align'/>
+ <cd:constant name='aligncharacter' value='aligncharacter'/>
+ <cd:constant name='alignmentcharacter' value='alignmentcharacter'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='aligntitle'/>
+ <cd:constant name='alternative' value='alternative'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='arrow'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='at'/>
+ <cd:constant name='author' value='author'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autofocus'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autowidth'/>
+ <cd:constant name='axis' value='axis'/>
+ <cd:constant name='background' value='background'/>
+ <cd:constant name='backgroundcolor' value='backgroundcolor'/>
+ <cd:constant name='backgroundcorner' value='backgroundcorner'/>
+ <cd:constant name='backgrounddepth' value='backgrounddepth'/>
+ <cd:constant name='backgroundoffset' value='backgroundoffset'/>
+ <cd:constant name='backgroundradius' value='backgroundradius'/>
+ <cd:constant name='backgroundscreen' value='backgroundscreen'/>
+ <cd:constant name='backspace' value='backspace'/>
+ <cd:constant name='balance' value='balance'/>
+ <cd:constant name='before' value='before'/>
+ <cd:constant name='beforehead' value='beforehead'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='big'/>
+ <cd:constant name='blank' value='blank'/>
+ <cd:constant name='blockway' value='blockway'/>
+ <cd:constant name='bodyfont' value='bodyfont'/>
+ <cd:constant name='bookmark' value='bookmark'/>
+ <cd:constant name='bottom' value='bottom'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='bottomdistance'/>
+ <cd:constant name='bottomframe' value='bottomframe'/>
+ <cd:constant name='bottomoffset' value='bottomoffset'/>
+ <cd:constant name='bottomspace' value='bottomspace'/>
+ <cd:constant name='bottomstate' value='bottomstate'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='calculate'/>
+ <cd:constant name='ccommand' value='ccommand'/>
+ <cd:constant name='click' value='click'/>
+ <cd:constant name='clickin' value='clickin'/>
+ <cd:constant name='clickout' value='clickout'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='closeaction'/>
+ <cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepageaction' value='closepageaction'/>
+ <cd:constant name='closesymbol' value='closesymbol'/>
+ <cd:constant name='color' value='color'/>
+ <cd:constant name='column' value='column'/>
+ <cd:constant name='columndistance' value='columndistance'/>
+ <cd:constant name='columns' value='columns'/>
+ <cd:constant name='command' value='command'/>
+ <cd:constant name='commandafter' value='commandafter'/>
+ <cd:constant name='commandbefore' value='commandbefore'/>
+ <cd:constant name='commands' value='commands'/>
+ <cd:constant name='component' value='component'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='compress'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='continue'/>
+ <cd:constant name='contrastcolor' value='contrastcolor'/>
+ <cd:constant name='controls' value='controls'/>
+ <cd:constant name='conversion' value='conversion'/>
+ <cd:constant name='convertfile' value='convertfile'/>
+ <cd:constant name='corner' value='corner'/>
+ <cd:constant name='coupling' value='coupling'/>
+ <cd:constant name='couplingway' value='couplingway'/>
+ <cd:constant name='criterium' value='criterium'/>
+ <cd:constant name='current' value='current'/>
+ <cd:constant name='cutspace' value='cutspace'/>
+ <cd:constant name='dash' value='dash'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='date'/>
+ <cd:constant name='deepnumbercommand' value='deepnumbercommand'/>
+ <cd:constant name='deeptextcommand' value='deeptextcommand'/>
+ <cd:constant name='default' value='default'/>
+ <cd:constant name='delay' value='delay'/>
+ <cd:constant name='depth' value='depth'/>
+ <cd:constant name='depthcorrection' value='depthcorrection'/>
+ <cd:constant name='direction' value='direction'/>
+ <cd:constant name='directory' value='directory'/>
+ <cd:constant name='display' value='display'/>
+ <cd:constant name='distance' value='distance'/>
+ <cd:constant name='dot' value='dot'/>
+ <cd:constant name='doublesided' value='doublesided'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='edge'/>
+ <cd:constant name='edgedistance' value='edgedistance'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='empty'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='evenmargin'/>
+ <cd:constant name='expansion' value='expansion'/>
+ <cd:constant name='export' value='export'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='factor'/>
+ <cd:constant name='fallback' value='fallback'/>
+ <cd:constant name='family' value='family'/>
+ <cd:constant name='fieldbackgroundcolor' value='fieldbackgroundcolor'/>
+ <cd:constant name='fieldframecolor' value='fieldframecolor'/>
+ <cd:constant name='fieldlayer' value='fieldlayer'/>
+ <cd:constant name='fieldoffset' value='fieldoffset'/>
+ <cd:constant name='file' value='file'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='focus'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusout'/>
+ <cd:constant name='footer' value='footer'/>
+ <cd:constant name='footerdistance' value='footerdistance'/>
+ <cd:constant name='footerstate' value='footerstate'/>
+ <cd:constant name='foregroundcolor' value='foregroundcolor'/>
+ <cd:constant name='foregroundstyle' value='foregroundstyle'/>
+ <cd:constant name='format' value='format'/>
+ <cd:constant name='frame' value='frame'/>
+ <cd:constant name='framecolor' value='framecolor'/>
+ <cd:constant name='framecorner' value='framecorner'/>
+ <cd:constant name='framedepth' value='framedepth'/>
+ <cd:constant name='frameoffset' value='frameoffset'/>
+ <cd:constant name='frameradius' value='frameradius'/>
+ <cd:constant name='frames' value='frames'/>
+ <cd:constant name='from' value='from'/>
+ <cd:constant name='get' value='get'/>
+ <cd:constant name='global' value='global'/>
+ <cd:constant name='grid' value='grid'/>
+ <cd:constant name='hang' value='hang'/>
+ <cd:constant name='headalign' value='headalign'/>
+ <cd:constant name='headcolor' value='headcolor'/>
+ <cd:constant name='headcommand' value='headcommand'/>
+ <cd:constant name='headconversion' value='headconversion'/>
+ <cd:constant name='header' value='header'/>
+ <cd:constant name='headerdistance' value='headerdistance'/>
+ <cd:constant name='headerstate' value='headerstate'/>
+ <cd:constant name='headlabel' value='headlabel'/>
+ <cd:constant name='headnumber' value='headnumber'/>
+ <cd:constant name='headstyle' value='headstyle'/>
+ <cd:constant name='height' value='height'/>
+ <cd:constant name='hfactor' value='hfactor'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horoffset' value='horoffset'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='icommand'/>
+ <cd:constant name='in' value='in'/>
+ <cd:constant name='inbetween' value='inbetween'/>
+ <cd:constant name='increment' value='increment'/>
+ <cd:constant name='incrementnumber' value='incrementnumber'/>
+ <cd:constant name='indenting' value='indenting'/>
+ <cd:constant name='indentnext' value='indentnext'/>
+ <cd:constant name='indicator' value='indicator'/>
+ <cd:constant name='inner' value='inner'/>
+ <cd:constant name='innermargin' value='innermargin'/>
+ <cd:constant name='inputfile' value='inputfile'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='interaction'/>
+ <cd:constant name='interlinespace' value='interlinespace'/>
+ <cd:constant name='itemalign' value='itemalign'/>
+ <cd:constant name='items' value='items'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keyword' value='keyword'/>
+ <cd:constant name='label' value='label'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='left'/>
+ <cd:constant name='leftcolor' value='leftcolor'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='leftedge'/>
+ <cd:constant name='leftedgedistance' value='leftedgedistance'/>
+ <cd:constant name='leftframe' value='leftframe'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='leftmargin'/>
+ <cd:constant name='leftmargindistance' value='leftmargindistance'/>
+ <cd:constant name='leftoffset' value='leftoffset'/>
+ <cd:constant name='leftquotation' value='leftquotation'/>
+ <cd:constant name='leftquote' value='leftquote'/>
+ <cd:constant name='leftsentence' value='leftsentence'/>
+ <cd:constant name='leftspeech' value='leftspeech'/>
+ <cd:constant name='leftstyle' value='leftstyle'/>
+ <cd:constant name='leftsubsentence' value='leftsubsentence'/>
+ <cd:constant name='lefttext' value='lefttext'/>
+ <cd:constant name='leftwidth' value='leftwidth'/>
+ <cd:constant name='level' value='level'/>
+ <cd:constant name='levels' value='levels'/>
+ <cd:constant name='limittext' value='limittext'/>
+ <cd:constant name='line' value='line'/>
+ <cd:constant name='linecorrection' value='linecorrection'/>
+ <cd:constant name='lines' value='lines'/>
+ <cd:constant name='list' value='list'/>
+ <cd:constant name='listtext' value='listtext'/>
+ <cd:constant name='local' value='local'/>
+ <cd:constant name='location' value='location'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='logos'/>
+ <cd:constant name='marcolor' value='marcolor'/>
+ <cd:constant name='margin' value='margin'/>
+ <cd:constant name='margindistance' value='margindistance'/>
+ <cd:constant name='marginedge' value='marginedge'/>
+ <cd:constant name='marginedgetext' value='marginedgetext'/>
+ <cd:constant name='margintext' value='margintext'/>
+ <cd:constant name='marking' value='marking'/>
+ <cd:constant name='marstyle' value='marstyle'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='maxheight'/>
+ <cd:constant name='maxwidth' value='maxwidth'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='menu'/>
+ <cd:constant name='method' value='method'/>
+ <cd:constant name='middle' value='middle'/>
+ <cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middletext' value='middletext'/>
+ <cd:constant name='midsentence' value='midsentence'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='mindepth'/>
+ <cd:constant name='minheight' value='minheight'/>
+ <cd:constant name='minwidth' value='minwidth'/>
+ <cd:constant name='monthconversion' value='monthconversion'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='name'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='nbottom'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='next'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nleft'/>
+ <cd:constant name='nlines' value='nlines'/>
+ <cd:constant name='norm' value='norm'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='nright'/>
+ <cd:constant name='ntop' value='ntop'/>
+ <cd:constant name='number' value='number'/>
+ <cd:constant name='numbercolor' value='numbercolor'/>
+ <cd:constant name='numbercommand' value='numbercommand'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='numberdistance'/>
+ <cd:constant name='numbering' value='numbering'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='numberseparator'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='numberstyle'/>
+ <cd:constant name='numberwidth' value='numberwidth'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='object'/>
+ <cd:constant name='obstruction' value='obstruction'/>
+ <cd:constant name='oddmargin' value='oddmargin'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='openaction'/>
+ <cd:constant name='openpageaction' value='openpageaction'/>
+ <cd:constant name='option' value='option'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='orientation'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='outermargin'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='ownnumber'/>
+ <cd:constant name='page' value='page'/>
+ <cd:constant name='pageboundaries' value='pageboundaries'/>
+ <cd:constant name='pagecolor' value='pagecolor'/>
+ <cd:constant name='pagecommand' value='pagecommand'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='pagenumber'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='pagestate'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='pagestyle'/>
+ <cd:constant name='palet' value='palet'/>
+ <cd:constant name='paper' value='paper'/>
+ <cd:constant name='paragraph' value='paragraph'/>
+ <cd:constant name='place' value='place'/>
+ <cd:constant name='placehead' value='placehead'/>
+ <cd:constant name='placestopper' value='placestopper'/>
+ <cd:constant name='position' value='position'/>
+ <cd:constant name='prefix' value='prefix'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='preset'/>
+ <cd:constant name='preview' value='preview'/>
+ <cd:constant name='previous' value='previous'/>
+ <cd:constant name='previousnumber' value='previousnumber'/>
+ <cd:constant name='process' value='process'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='radius'/>
+ <cd:constant name='random' value='random'/>
+ <cd:constant name='range' value='range'/>
+ <cd:constant name='reduction' value='reduction'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='reference'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='referencing'/>
+ <cd:constant name='regionin' value='regionin'/>
+ <cd:constant name='regionout' value='regionout'/>
+ <cd:constant name='repeat' value='repeat'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='resetnumber'/>
+ <cd:constant name='resolution' value='resolution'/>
+ <cd:constant name='right' value='right'/>
+ <cd:constant name='rightcolor' value='rightcolor'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='rightedge'/>
+ <cd:constant name='rightedgedistance' value='rightedgedistance'/>
+ <cd:constant name='rightframe' value='rightframe'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='rightmargin'/>
+ <cd:constant name='rightmargindistance' value='rightmargindistance'/>
+ <cd:constant name='rightoffset' value='rightoffset'/>
+ <cd:constant name='rightquotation' value='rightquotation'/>
+ <cd:constant name='rightquote' value='rightquote'/>
+ <cd:constant name='rightsentence' value='rightsentence'/>
+ <cd:constant name='rightspeech' value='rightspeech'/>
+ <cd:constant name='rightstyle' value='rightstyle'/>
+ <cd:constant name='rightsubsentence' value='rightsubsentence'/>
+ <cd:constant name='righttext' value='righttext'/>
+ <cd:constant name='rightwidth' value='rightwidth'/>
+ <cd:constant name='rotation' value='rotation'/>
+ <cd:constant name='rule' value='rule'/>
+ <cd:constant name='rulecolor' value='rulecolor'/>
+ <cd:constant name='rulethickness' value='rulethickness'/>
+ <cd:constant name='samepage' value='samepage'/>
+ <cd:constant name='sample' value='sample'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='scale'/>
+ <cd:constant name='scope' value='scope'/>
+ <cd:constant name='screen' value='screen'/>
+ <cd:constant name='section' value='section'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='sectionnumber'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='separator'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='setups'/>
+ <cd:constant name='side' value='side'/>
+ <cd:constant name='sidealign' value='sidealign'/>
+ <cd:constant name='sidemethod' value='sidemethod'/>
+ <cd:constant name='sidespaceafter' value='sidespaceafter'/>
+ <cd:constant name='sidespacebefore' value='sidespacebefore'/>
+ <cd:constant name='sign' value='sign'/>
+ <cd:constant name='size' value='size'/>
+ <cd:constant name='small' value='small'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='sorttype'/>
+ <cd:constant name='source' value='source'/>
+ <cd:constant name='space' value='space'/>
+ <cd:constant name='spaceafter' value='spaceafter'/>
+ <cd:constant name='spacebefore' value='spacebefore'/>
+ <cd:constant name='spaceinbetween' value='spaceinbetween'/>
+ <cd:constant name='spacing' value='spacing'/>
+ <cd:constant name='split' value='split'/>
+ <cd:constant name='splitcolor' value='splitcolor'/>
+ <cd:constant name='splitmethod' value='splitmethod'/>
+ <cd:constant name='splitoffset' value='splitoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stack'/>
+ <cd:constant name='start' value='start'/>
+ <cd:constant name='starter' value='starter'/>
+ <cd:constant name='state' value='state'/>
+ <cd:constant name='step' value='step'/>
+ <cd:constant name='stop' value='stop'/>
+ <cd:constant name='stopper' value='stopper'/>
+ <cd:constant name='stretch' value='stretch'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='style'/>
+ <cd:constant name='sub' value='sub'/>
+ <cd:constant name='subtitle' value='subtitle'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symalign'/>
+ <cd:constant name='symbol' value='symbol'/>
+ <cd:constant name='symbolset' value='symbolset'/>
+ <cd:constant name='symcolor' value='symcolor'/>
+ <cd:constant name='symstyle' value='symstyle'/>
+ <cd:constant name='synonym' value='synonym'/>
+ <cd:constant name='synonymcolor' value='synonymcolor'/>
+ <cd:constant name='synonymcommand' value='synonymcommand'/>
+ <cd:constant name='synonymstyle' value='synonymstyle'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='text'/>
+ <cd:constant name='textcolor' value='textcolor'/>
+ <cd:constant name='textcommand' value='textcommand'/>
+ <cd:constant name='textdistance' value='textdistance'/>
+ <cd:constant name='textlayer' value='textlayer'/>
+ <cd:constant name='textmargin' value='textmargin'/>
+ <cd:constant name='textmethod' value='textmethod'/>
+ <cd:constant name='textseparator' value='textseparator'/>
+ <cd:constant name='textsize' value='textsize'/>
+ <cd:constant name='textstate' value='textstate'/>
+ <cd:constant name='textstyle' value='textstyle'/>
+ <cd:constant name='textwidth' value='textwidth'/>
+ <cd:constant name='title' value='title'/>
+ <cd:constant name='titlecolor' value='titlecolor'/>
+ <cd:constant name='titlecommand' value='titlecommand'/>
+ <cd:constant name='titledistance' value='titledistance'/>
+ <cd:constant name='titleleft' value='titleleft'/>
+ <cd:constant name='titleright' value='titleright'/>
+ <cd:constant name='titlestyle' value='titlestyle'/>
+ <cd:constant name='to' value='to'/>
+ <cd:constant name='tolerance' value='tolerance'/>
+ <cd:constant name='top' value='top'/>
+ <cd:constant name='topdistance' value='topdistance'/>
+ <cd:constant name='topframe' value='topframe'/>
+ <cd:constant name='topoffset' value='topoffset'/>
+ <cd:constant name='topspace' value='topspace'/>
+ <cd:constant name='topstate' value='topstate'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='type'/>
+ <cd:constant name='unit' value='unit'/>
+ <cd:constant name='unknownreference' value='unknownreference'/>
+ <cd:constant name='urlalternative' value='urlalternative'/>
+ <cd:constant name='urlspace' value='urlspace'/>
+ <cd:constant name='validate' value='validate'/>
+ <cd:constant name='vcommand' value='vcommand'/>
+ <cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='way'/>
+ <cd:constant name='wfactor' value='wfactor'/>
+ <cd:constant name='white' value='white'/>
+ <cd:constant name='width' value='width'/>
+ <cd:constant name='xfactor' value='xfactor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xscale'/>
+ <cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yfactor' value='yfactor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='yscale'/>
+ <cd:constant name='ystep' value='ystep'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language en -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='answerlines'/>
+ <cd:element name='answerspace' value='answerspace'/>
+ <cd:element name='begin' value='begin'/>
+ <cd:element name='complete' value='complete'/>
+ <cd:element name='coupled' value='coupled'/>
+ <cd:element name='currentlocal' value='currentlocal'/>
+ <cd:element name='emptyone' value='empty'/>
+ <cd:element name='emptytwo' value='empty'/>
+ <cd:element name='end' value='end'/>
+ <cd:element name='endsetup' value=''/>
+ <cd:element name='get' value='get'/>
+ <cd:element name='increment' value='increment'/>
+ <cd:element name='list' value='list'/>
+ <cd:element name='listof' value='listof'/>
+ <cd:element name='load' value='load'/>
+ <cd:element name='local' value='local'/>
+ <cd:element name='makeup' value='makeup'/>
+ <cd:element name='next' value='next'/>
+ <cd:element name='place' value='place'/>
+ <cd:element name='previous' value='previous'/>
+ <cd:element name='previouslocal' value='previouslocal'/>
+ <cd:element name='reserve' value='reserve'/>
+ <cd:element name='see' value='see'/>
+ <cd:element name='setup' value='setup'/>
+ <cd:element name='start' value='start'/>
+ <cd:element name='stop' value='stop'/>
+ <cd:element name='text' value='text'/>
+ <cd:element name='type' value='type'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language en -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='CAP'/>
+ <cd:command name='Character' value='Character'/>
+ <cd:command name='Characters' value='Characters'/>
+ <cd:command name='LABELTEXT' value='LABELTEXT'/>
+ <cd:command name='MONTH' value='MONTH'/>
+ <cd:command name='Numbers' value='Numbers'/>
+ <cd:command name='Romannumerals' value='Romannumerals'/>
+ <cd:command name='SmallCapped' value='Cap'/>
+ <cd:command name='SmallCaps' value='Caps'/>
+ <cd:command name='WEEKDAY' value='WEEKDAY'/>
+ <cd:command name='WORD' value='WORD'/>
+ <cd:command name='WORDS' value='WORDS'/>
+ <cd:command name='Word' value='Word'/>
+ <cd:command name='Words' value='Words'/>
+ <cd:command name='about' value='about'/>
+ <cd:command name='adaptlayout' value='adaptlayout'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='at'/>
+ <cd:command name='atleftmargin' value='atleftmargin'/>
+ <cd:command name='atpage' value='atpage'/>
+ <cd:command name='atrightmargin' value='atrightmargin'/>
+ <cd:command name='background' value='background'/>
+ <cd:command name='backspace' value='backspace'/>
+ <cd:command name='blackrule' value='blackrule'/>
+ <cd:command name='blackrules' value='blackrules'/>
+ <cd:command name='blank' value='blank'/>
+ <cd:command name='bookmark' value='bookmark'/>
+ <cd:command name='bottomdistance' value='bottomdistance'/>
+ <cd:command name='bottomheight' value='bottomheight'/>
+ <cd:command name='bottomspace' value='bottomspace'/>
+ <cd:command name='but' value='but'/>
+ <cd:command name='button' value='button'/>
+ <cd:command name='bypassblocks' value='bypassblocks'/>
+ <cd:command name='character' value='character'/>
+ <cd:command name='characters' value='characters'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='clip'/>
+ <cd:command name='clonefield' value='clonefield'/>
+ <cd:command name='color' value='color'/>
+ <cd:command name='colorbar' value='colorbar'/>
+ <cd:command name='colorvalue' value='colorvalue'/>
+ <cd:command name='column' value='column'/>
+ <cd:command name='comment' value='comment'/>
+ <cd:command name='comparecolorgroup' value='comparecolorgroup'/>
+ <cd:command name='comparepalet' value='comparepalet'/>
+ <cd:command name='completepagenumber' value='completepagenumber'/>
+ <cd:command name='completeregister' value='completeregister'/>
+ <cd:command name='component' value='component'/>
+ <cd:command name='convertnumber' value='convertnumber'/>
+ <cd:command name='copyfield' value='copyfield'/>
+ <cd:command name='correctwhitespace' value='correctwhitespace'/>
+ <cd:command name='coupledocument' value='coupledocument'/>
+ <cd:command name='couplemarking' value='couplemarking'/>
+ <cd:command name='couplepage' value='couplepage'/>
+ <cd:command name='couplepaper' value='couplepaper'/>
+ <cd:command name='coupleregister' value='coupleregister'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='currentdate'/>
+ <cd:command name='currentheadnumber' value='currentheadnumber'/>
+ <cd:command name='cutspace' value='cutspace'/>
+ <cd:command name='date' value='date'/>
+ <cd:command name='decouplemarking' value='decouplemarking'/>
+ <cd:command name='decrementnumber' value='decrementnumber'/>
+ <cd:command name='define' value='define'/>
+ <cd:command name='defineaccent' value='defineaccent'/>
+ <cd:command name='defineblank' value='defineblank'/>
+ <cd:command name='defineblock' value='defineblock'/>
+ <cd:command name='definebodyfont' value='definebodyfont'/>
+ <cd:command name='definebodyfontenvironment' value='definebodyfontenvironment'/>
+ <cd:command name='definebuffer' value='definebuffer'/>
+ <cd:command name='definecharacter' value='definecharacter'/>
+ <cd:command name='definecolor' value='definecolor'/>
+ <cd:command name='definecolorgroup' value='definecolorgroup'/>
+ <cd:command name='definecolumnbreak' value='definecolumnbreak'/>
+ <cd:command name='definecolumnset' value='definecolumnset'/>
+ <cd:command name='definecombination' value='definecombination'/>
+ <cd:command name='definecombinedlist' value='definecombinedlist'/>
+ <cd:command name='definecommand' value='definecommand'/>
+ <cd:command name='defineconversion' value='defineconversion'/>
+ <cd:command name='definedescription' value='definedescription'/>
+ <cd:command name='defineenumeration' value='defineenumeration'/>
+ <cd:command name='definefield' value='definefield'/>
+ <cd:command name='definefieldstack' value='definefieldstack'/>
+ <cd:command name='definefiguresymbol' value='definefiguresymbol'/>
+ <cd:command name='definefloat' value='definefloat'/>
+ <cd:command name='definefont' value='definefont'/>
+ <cd:command name='definefontstyle' value='definefontstyle'/>
+ <cd:command name='definefontsynonym' value='definefontsynonym'/>
+ <cd:command name='defineframed' value='defineframed'/>
+ <cd:command name='defineframedtext' value='defineframedtext'/>
+ <cd:command name='definehbox' value='definehbox'/>
+ <cd:command name='definehead' value='definehead'/>
+ <cd:command name='defineindenting' value='defineindenting'/>
+ <cd:command name='defineinmargin' value='defineinmargin'/>
+ <cd:command name='defineinteractionmenu' value='defineinteractionmenu'/>
+ <cd:command name='defineitemgroup' value='defineitemgroup'/>
+ <cd:command name='definelabel' value='definelabel'/>
+ <cd:command name='definelayer' value='definelayer'/>
+ <cd:command name='definelayout' value='definelayout'/>
+ <cd:command name='definelist' value='definelist'/>
+ <cd:command name='definelogo' value='definelogo'/>
+ <cd:command name='definemainfield' value='definemainfield'/>
+ <cd:command name='definemakeup' value='definemakeup'/>
+ <cd:command name='definemarking' value='definemarking'/>
+ <cd:command name='definemathalignment' value='definemathalignment'/>
+ <cd:command name='defineoutput' value='defineoutput'/>
+ <cd:command name='defineoverlay' value='defineoverlay'/>
+ <cd:command name='definepagebreak' value='definepagebreak'/>
+ <cd:command name='definepalet' value='definepalet'/>
+ <cd:command name='definepapersize' value='definepapersize'/>
+ <cd:command name='defineparagraphs' value='defineparagraphs'/>
+ <cd:command name='defineplacement' value='defineplacement'/>
+ <cd:command name='defineprofile' value='defineprofile'/>
+ <cd:command name='defineprogram' value='defineprogram'/>
+ <cd:command name='definerawfont' value='definerawfont'/>
+ <cd:command name='definereference' value='definereference'/>
+ <cd:command name='definereferenceformat' value='definereferenceformat'/>
+ <cd:command name='definereferencelist' value='definereferencelist'/>
+ <cd:command name='defineregister' value='defineregister'/>
+ <cd:command name='definerule' value='definerule'/>
+ <cd:command name='definesection' value='definesection'/>
+ <cd:command name='definesectionblock' value='definesectionblock'/>
+ <cd:command name='definesorting' value='definesorting'/>
+ <cd:command name='definestartstop' value='definestartstop'/>
+ <cd:command name='definestyle' value='definestyle'/>
+ <cd:command name='definesubfield' value='definesubfield'/>
+ <cd:command name='definesymbol' value='definesymbol'/>
+ <cd:command name='definesynonyms' value='definesynonyms'/>
+ <cd:command name='definetabletemplate' value='definetabletemplate'/>
+ <cd:command name='definetabulate' value='definetabulate'/>
+ <cd:command name='definetext' value='definetext'/>
+ <cd:command name='definetextposition' value='definetextposition'/>
+ <cd:command name='definetextvariable' value='definetextvariable'/>
+ <cd:command name='definetype' value='definetype'/>
+ <cd:command name='definetyping' value='definetyping'/>
+ <cd:command name='defineversion' value='defineversion'/>
+ <cd:command name='determineheadnumber' value='determineheadnumber'/>
+ <cd:command name='determinelistcharacteristics' value='determinelistcharacteristics'/>
+ <cd:command name='determineregistercharacteristics' value='determineregistercharacteristics'/>
+ <cd:command name='dimension' value='dimension'/>
+ <cd:command name='disableinteractionmenu' value='disableinteractionmenu'/>
+ <cd:command name='domicile' value='domicile'/>
+ <cd:command name='donttest' value='donttest'/>
+ <cd:command name='edgedistance' value='edgedistance'/>
+ <cd:command name='edgewidth' value='edgewidth'/>
+ <cd:command name='emptylines' value='emptylines'/>
+ <cd:command name='environment' value='environment'/>
+ <cd:command name='externalfigure' value='externalfigure'/>
+ <cd:command name='fact' value='fact'/>
+ <cd:command name='field' value='field'/>
+ <cd:command name='fieldstack' value='fieldstack'/>
+ <cd:command name='fillinfield' value='fillinfield'/>
+ <cd:command name='fillinline' value='fillinline'/>
+ <cd:command name='fillinrules' value='fillinrules'/>
+ <cd:command name='fillintext' value='fillintext'/>
+ <cd:command name='fitfield' value='fitfield'/>
+ <cd:command name='fixedspace' value='fixedspace'/>
+ <cd:command name='fixedspaces' value='fixedspaces'/>
+ <cd:command name='followprofile' value='followprofile'/>
+ <cd:command name='followprofileversion' value='followprofileversion'/>
+ <cd:command name='followversion' value='followversion'/>
+ <cd:command name='footerdistance' value='footerdistance'/>
+ <cd:command name='footerheight' value='footerheight'/>
+ <cd:command name='footnote' value='footnote'/>
+ <cd:command name='footnotetext' value='footnotetext'/>
+ <cd:command name='forceblocks' value='forceblocks'/>
+ <cd:command name='formulanumber' value='formulanumber'/>
+ <cd:command name='fraction' value='fraction'/>
+ <cd:command name='framed' value='framed'/>
+ <cd:command name='from' value='from'/>
+ <cd:command name='getbuffer' value='getbuffer'/>
+ <cd:command name='getmarking' value='getmarking'/>
+ <cd:command name='getnumber' value='getnumber'/>
+ <cd:command name='godown' value='godown'/>
+ <cd:command name='goto' value='goto'/>
+ <cd:command name='gotobox' value='gotobox'/>
+ <cd:command name='gotopage' value='gotopage'/>
+ <cd:command name='graycolor' value='graycolor'/>
+ <cd:command name='greyvalue' value='greyvalue'/>
+ <cd:command name='grid' value='grid'/>
+ <cd:command name='hairline' value='hairline'/>
+ <cd:command name='head' value='head'/>
+ <cd:command name='headerdistance' value='headerdistance'/>
+ <cd:command name='headerheight' value='headerheight'/>
+ <cd:command name='headlevel' value='headlevel'/>
+ <cd:command name='headnumber' value='headnumber'/>
+ <cd:command name='headsym' value='headsym'/>
+ <cd:command name='headtext' value='headtext'/>
+ <cd:command name='hideblocks' value='hideblocks'/>
+ <cd:command name='high' value='high'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='immediatebetweenlist'/>
+ <cd:command name='immediatetolist' value='immediatetolist'/>
+ <cd:command name='in' value='in'/>
+ <cd:command name='incrementnumber' value='incrementnumber'/>
+ <cd:command name='indenting' value='indenting'/>
+ <cd:command name='inframed' value='inframed'/>
+ <cd:command name='infull' value='infull'/>
+ <cd:command name='ininner' value='ininner'/>
+ <cd:command name='inleft' value='inleft'/>
+ <cd:command name='inleftedge' value='inleftedge'/>
+ <cd:command name='inleftmargin' value='inleftmargin'/>
+ <cd:command name='inline' value='inline'/>
+ <cd:command name='inmargin' value='inmargin'/>
+ <cd:command name='inmframed' value='inmaframed'/>
+ <cd:command name='inneredgedistance' value='inneredgedistance'/>
+ <cd:command name='inneredgewidth' value='inneredgewidth'/>
+ <cd:command name='innermargindistance' value='innermargindistance'/>
+ <cd:command name='innermarginwidth' value='innermarginwidth'/>
+ <cd:command name='inothermargin' value='inothermargin'/>
+ <cd:command name='inouter' value='inouter'/>
+ <cd:command name='inright' value='inright'/>
+ <cd:command name='inrightedge' value='inrightedge'/>
+ <cd:command name='inrightmargin' value='inrightmargin'/>
+ <cd:command name='installlanguage' value='installlanguage'/>
+ <cd:command name='interactionbar' value='interactionbar'/>
+ <cd:command name='interactionbuttons' value='interactionbuttons'/>
+ <cd:command name='interactionmenu' value='interactionmenu'/>
+ <cd:command name='item' value='item'/>
+ <cd:command name='items' value='items'/>
+ <cd:command name='its' value='its'/>
+ <cd:command name='keepblocks' value='keepblocks'/>
+ <cd:command name='label' value='label'/>
+ <cd:command name='labels' value='labels'/>
+ <cd:command name='labeltext' value='labeltext'/>
+ <cd:command name='language' value='language'/>
+ <cd:command name='leftaligned' value='leftaligned'/>
+ <cd:command name='leftedgedistance' value='leftedgedistance'/>
+ <cd:command name='leftedgewidth' value='leftedgewidth'/>
+ <cd:command name='leftmargindistance' value='leftmargindistance'/>
+ <cd:command name='leftmarginwidth' value='leftmarginwidth'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='linethickness'/>
+ <cd:command name='listheight' value='listheight'/>
+ <cd:command name='listlength' value='listlength'/>
+ <cd:command name='listsymbol' value='listsymbol'/>
+ <cd:command name='listwidth' value='listwidth'/>
+ <cd:command name='logfields' value='logfields'/>
+ <cd:command name='lohi' value='lohi'/>
+ <cd:command name='low' value='low'/>
+ <cd:command name='macroname' value='name'/>
+ <cd:command name='mainlanguage' value='mainlanguage'/>
+ <cd:command name='makeupheight' value='makeupheight'/>
+ <cd:command name='makeupwidth' value='makeupwidth'/>
+ <cd:command name='mar' value='mar'/>
+ <cd:command name='margindistance' value='margindistance'/>
+ <cd:command name='marginrule' value='marginrule'/>
+ <cd:command name='margintext' value='margintext'/>
+ <cd:command name='margintitle' value='margintitle'/>
+ <cd:command name='marginwidth' value='marginwidth'/>
+ <cd:command name='marginword' value='marginword'/>
+ <cd:command name='marking' value='marking'/>
+ <cd:command name='markversion' value='markversion'/>
+ <cd:command name='mathematics' value='mathematics'/>
+ <cd:command name='menubutton' value='menubutton'/>
+ <cd:command name='mframed' value='maframed'/>
+ <cd:command name='midaligned' value='midaligned'/>
+ <cd:command name='mirror' value='mirror'/>
+ <cd:command name='month' value='month'/>
+ <cd:command name='moveformula' value='moveformula'/>
+ <cd:command name='moveongrid' value='moveongrid'/>
+ <cd:command name='movesidefloat' value='movesidefloat'/>
+ <cd:command name='navigating' value='navigating'/>
+ <cd:command name='nodimension' value='nodimension'/>
+ <cd:command name='noheaderandfooterlines' value='noheaderandfooterlines'/>
+ <cd:command name='noindenting' value='noindenting'/>
+ <cd:command name='nolist' value='nolist'/>
+ <cd:command name='nomarking' value='nomarking'/>
+ <cd:command name='nomoreblocks' value='nomoreblocks'/>
+ <cd:command name='nomorefiles' value='nomorefiles'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='nospace'/>
+ <cd:command name='note' value='note'/>
+ <cd:command name='notopandbottomlines' value='notopandbottomlines'/>
+ <cd:command name='notsmallcapped' value='nocap'/>
+ <cd:command name='nowhitespace' value='nowhitespace'/>
+ <cd:command name='numberofsubpages' value='numberofsubpages'/>
+ <cd:command name='numbers' value='numbers'/>
+ <cd:command name='outeredgedistance' value='outeredgedistance'/>
+ <cd:command name='outeredgewidth' value='outeredgewidth'/>
+ <cd:command name='outermargindistance' value='outermargindistance'/>
+ <cd:command name='outermarginwidth' value='outermarginwidth'/>
+ <cd:command name='packed' value='packed'/>
+ <cd:command name='page' value='page'/>
+ <cd:command name='pagedepth' value='pagedepth'/>
+ <cd:command name='pagenumber' value='pagenumber'/>
+ <cd:command name='pageoffset' value='pageoffset'/>
+ <cd:command name='pagereference' value='pagereference'/>
+ <cd:command name='pagetype' value='pagetype'/>
+ <cd:command name='paperheight' value='paperheight'/>
+ <cd:command name='paperwidth' value='paperwidth'/>
+ <cd:command name='periods' value='periods'/>
+ <cd:command name='plaatsruwelijst' value='placerawlist'/>
+ <cd:command name='placebookmarks' value='placebookmarks'/>
+ <cd:command name='placecombinedlist' value='placecombinedlist'/>
+ <cd:command name='placefloat' value='placefloat'/>
+ <cd:command name='placefootnotes' value='placefootnotes'/>
+ <cd:command name='placeformula' value='placeformula'/>
+ <cd:command name='placeheadnumber' value='placeheadnumber'/>
+ <cd:command name='placeheadtext' value='placeheadtext'/>
+ <cd:command name='placelegend' value='placelegend'/>
+ <cd:command name='placelist' value='placelist'/>
+ <cd:command name='placelocalfootnotes' value='placelocalfootnotes'/>
+ <cd:command name='placelogos' value='placelogos'/>
+ <cd:command name='placeongrid' value='placeongrid'/>
+ <cd:command name='placeontopofeachother' value='placeontopofeachother'/>
+ <cd:command name='placepagenumber' value='placepagenumber'/>
+ <cd:command name='placereferencelist' value='placereferencelist'/>
+ <cd:command name='placeregister' value='placeregister'/>
+ <cd:command name='placerule' value='placerule'/>
+ <cd:command name='placesidebyside' value='placesidebyside'/>
+ <cd:command name='placesubformula' value='placesubformula'/>
+ <cd:command name='placetextvariable' value='placetextvariable'/>
+ <cd:command name='position' value='position'/>
+ <cd:command name='positiontext' value='positiontext'/>
+ <cd:command name='printpaperheight' value='printpaperheight'/>
+ <cd:command name='printpaperwidth' value='printpaperwidth'/>
+ <cd:command name='processblocks' value='processblocks'/>
+ <cd:command name='processpage' value='processpage'/>
+ <cd:command name='product' value='product'/>
+ <cd:command name='program' value='program'/>
+ <cd:command name='project' value='project'/>
+ <cd:command name='publication' value='publication'/>
+ <cd:command name='quotation' value='quotation'/>
+ <cd:command name='quote' value='quote'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='redo'/>
+ <cd:command name='ref' value='ref'/>
+ <cd:command name='reference' value='reference'/>
+ <cd:command name='referral' value='referral'/>
+ <cd:command name='referraldate' value='referraldate'/>
+ <cd:command name='referring' value='referring'/>
+ <cd:command name='remark' value='remark'/>
+ <cd:command name='reset' value='reset'/>
+ <cd:command name='resetmarking' value='resetmarking'/>
+ <cd:command name='resetnumber' value='resetnumber'/>
+ <cd:command name='resettext' value='resettextcontent'/>
+ <cd:command name='rightaligned' value='rightaligned'/>
+ <cd:command name='rightedgedistance' value='rightedgedistance'/>
+ <cd:command name='rightedgewidth' value='rightedgewidth'/>
+ <cd:command name='rightmargindistance' value='rightmargindistance'/>
+ <cd:command name='rightmarginwidth' value='rightmarginwidth'/>
+ <cd:command name='romannumerals' value='romannumerals'/>
+ <cd:command name='rotate' value='rotate'/>
+ <cd:command name='scale' value='scale'/>
+ <cd:command name='screen' value='screen'/>
+ <cd:command name='selectblocks' value='selectblocks'/>
+ <cd:command name='selectpaper' value='selectpaper'/>
+ <cd:command name='selectversion' value='selectversion'/>
+ <cd:command name='setnumber' value='setnumber'/>
+ <cd:command name='settextcontent' value='settextcontent'/>
+ <cd:command name='settextvariable' value='settextvariable'/>
+ <cd:command name='setupalign' value='setupalign'/>
+ <cd:command name='setupanswerarea' value='setupanswerarea'/>
+ <cd:command name='setuparranging' value='setuparranging'/>
+ <cd:command name='setupbackground' value='setupbackground'/>
+ <cd:command name='setupbackgrounds' value='setupbackgrounds'/>
+ <cd:command name='setupblackrules' value='setupblackrules'/>
+ <cd:command name='setupblank' value='setupblank'/>
+ <cd:command name='setupblock' value='setupblock'/>
+ <cd:command name='setupbodyfont' value='setupbodyfont'/>
+ <cd:command name='setupbodyfontenvironment' value='setupbodyfontenvironment'/>
+ <cd:command name='setupbottom' value='setupbottom'/>
+ <cd:command name='setupbottomtexts' value='setupbottomtexts'/>
+ <cd:command name='setupbuffer' value='setupbuffer'/>
+ <cd:command name='setupbuttons' value='setupbuttons'/>
+ <cd:command name='setupcapitals' value='setupcapitals'/>
+ <cd:command name='setupcaption' value='setupcaption'/>
+ <cd:command name='setupcaptions' value='setupcaptions'/>
+ <cd:command name='setupclipping' value='setupclipping'/>
+ <cd:command name='setupcolor' value='setupcolor'/>
+ <cd:command name='setupcolors' value='setupcolors'/>
+ <cd:command name='setupcolumns' value='setupcolumns'/>
+ <cd:command name='setupcolumnset' value='setupcolumnset'/>
+ <cd:command name='setupcolumnsetlines' value='setupcolumnsetlines'/>
+ <cd:command name='setupcolumnsetstart' value='setupcolumnsetstart'/>
+ <cd:command name='setupcombinations' value='setupcombinations'/>
+ <cd:command name='setupcombinedlist' value='setupcombinedlist'/>
+ <cd:command name='setupcomment' value='setupcomment'/>
+ <cd:command name='setupdescriptions' value='setupdescriptions'/>
+ <cd:command name='setupenumerations' value='setupenumerations'/>
+ <cd:command name='setupexternalfigures' value='setupexternalfigures'/>
+ <cd:command name='setupfield' value='setupfield'/>
+ <cd:command name='setupfields' value='setupfields'/>
+ <cd:command name='setupfillinlines' value='setupfillinlines'/>
+ <cd:command name='setupfillinrules' value='setupfillinrules'/>
+ <cd:command name='setupfloat' value='setupfloat'/>
+ <cd:command name='setupfloats' value='setupfloats'/>
+ <cd:command name='setupfloatsplitting' value='setupfloatsplitting'/>
+ <cd:command name='setupfooter' value='setupfooter'/>
+ <cd:command name='setupfootertexts' value='setupfootertexts'/>
+ <cd:command name='setupfootnotedefinition' value='setupfootnotedefinition'/>
+ <cd:command name='setupfootnotes' value='setupfootnotes'/>
+ <cd:command name='setupforms' value='setupforms'/>
+ <cd:command name='setupformulas' value='setupformulae'/>
+ <cd:command name='setupframed' value='setupframed'/>
+ <cd:command name='setupframedtexts' value='setupframedtexts'/>
+ <cd:command name='setuphead' value='setuphead'/>
+ <cd:command name='setupheader' value='setupheader'/>
+ <cd:command name='setupheadertexts' value='setupheadertexts'/>
+ <cd:command name='setupheadnumber' value='setupheadnumber'/>
+ <cd:command name='setupheads' value='setupheads'/>
+ <cd:command name='setupheadtext' value='setupheadtext'/>
+ <cd:command name='setuphyphenmark' value='setuphyphenmark'/>
+ <cd:command name='setupindentations' value='setupindentations'/>
+ <cd:command name='setupindenting' value='setupindenting'/>
+ <cd:command name='setupinmargin' value='setupinmargin'/>
+ <cd:command name='setupinteraction' value='setupinteraction'/>
+ <cd:command name='setupinteractionbar' value='setupinteractionbar'/>
+ <cd:command name='setupinteractionmenu' value='setupinteractionmenu'/>
+ <cd:command name='setupinteractionscreen' value='setupinteractionscreen'/>
+ <cd:command name='setupinterlinespace' value='setupinterlinespace'/>
+ <cd:command name='setupitemgroup' value='setupitemgroup'/>
+ <cd:command name='setupitemgroups' value='setupitemizations'/>
+ <cd:command name='setupitems' value='setupitems'/>
+ <cd:command name='setuplabeltext' value='setuplabeltext'/>
+ <cd:command name='setuplanguage' value='setuplanguage'/>
+ <cd:command name='setuplayout' value='setuplayout'/>
+ <cd:command name='setuplegend' value='setuplegend'/>
+ <cd:command name='setuplinenumbering' value='setuplinenumbering'/>
+ <cd:command name='setuplines' value='setuplines'/>
+ <cd:command name='setuplinewidth' value='setuplinewidth'/>
+ <cd:command name='setuplist' value='setuplist'/>
+ <cd:command name='setupmakeup' value='setupmakeup'/>
+ <cd:command name='setupmarginblocks' value='setupmarginblocks'/>
+ <cd:command name='setupmarginrules' value='setupmarginrules'/>
+ <cd:command name='setupmarking' value='setupmarking'/>
+ <cd:command name='setupmathalignment' value='setupmathalignment'/>
+ <cd:command name='setupnarrower' value='setupnarrower'/>
+ <cd:command name='setupnumber' value='setupnumber'/>
+ <cd:command name='setupnumbering' value='setupnumbering'/>
+ <cd:command name='setupoppositeplacing' value='setupoppositeplacing'/>
+ <cd:command name='setupoutput' value='setupoutput'/>
+ <cd:command name='setuppagecomment' value='setuppagecomment'/>
+ <cd:command name='setuppagenumber' value='setuppagenumber'/>
+ <cd:command name='setuppagenumbering' value='setuppagenumbering'/>
+ <cd:command name='setuppagetransitions' value='setuppagetransitions'/>
+ <cd:command name='setuppalet' value='setuppalet'/>
+ <cd:command name='setuppaper' value='setuppaper'/>
+ <cd:command name='setuppapersize' value='setuppapersize'/>
+ <cd:command name='setupparagraphnumbering' value='setupparagraphnumbering'/>
+ <cd:command name='setupparagraphs' value='setupparagraphs'/>
+ <cd:command name='setupplacement' value='setupplacement'/>
+ <cd:command name='setuppositioning' value='setuppositioning'/>
+ <cd:command name='setupprofiles' value='setupprofiles'/>
+ <cd:command name='setupprograms' value='setupprograms'/>
+ <cd:command name='setuppublications' value='setuppublications'/>
+ <cd:command name='setupquote' value='setupquote'/>
+ <cd:command name='setupreferencelist' value='setupreferencelist'/>
+ <cd:command name='setupreferencing' value='setupreferencing'/>
+ <cd:command name='setupregister' value='setupregister'/>
+ <cd:command name='setuprotate' value='setuprotate'/>
+ <cd:command name='setuprule' value='setuprule'/>
+ <cd:command name='setups' value='setups'/>
+ <cd:command name='setupscreens' value='setupscreens'/>
+ <cd:command name='setupsection' value='setupsection'/>
+ <cd:command name='setupsectionblock' value='setupsectionblock'/>
+ <cd:command name='setupsorting' value='setupsorting'/>
+ <cd:command name='setupspacing' value='setupspacing'/>
+ <cd:command name='setupstartstop' value='setupstartstop'/>
+ <cd:command name='setupstrut' value='setupstrut'/>
+ <cd:command name='setupsubpagenumber' value='setupsubpagenumber'/>
+ <cd:command name='setupsymbolset' value='setupsymbolset'/>
+ <cd:command name='setupsynchronization' value='setupsynchronization'/>
+ <cd:command name='setupsynchronizationbar' value='setupsynchronizationbar'/>
+ <cd:command name='setupsynonyms' value='setupsynonyms'/>
+ <cd:command name='setupsystem' value='setupsystem'/>
+ <cd:command name='setuptab' value='setuptab'/>
+ <cd:command name='setuptables' value='setuptables'/>
+ <cd:command name='setuptabulate' value='setuptabulate'/>
+ <cd:command name='setuptext' value='setuptext'/>
+ <cd:command name='setuptextposition' value='setuptextposition'/>
+ <cd:command name='setuptextrules' value='setuptextrules'/>
+ <cd:command name='setuptexttexts' value='setuptexttexts'/>
+ <cd:command name='setuptextvariable' value='setuptextvariable'/>
+ <cd:command name='setupthinrules' value='setupthinrules'/>
+ <cd:command name='setuptolerance' value='setuptolerance'/>
+ <cd:command name='setuptop' value='setuptop'/>
+ <cd:command name='setuptoptexts' value='setuptoptexts'/>
+ <cd:command name='setuptype' value='setuptype'/>
+ <cd:command name='setuptyping' value='setuptyping'/>
+ <cd:command name='setupunderbar' value='setupunderbar'/>
+ <cd:command name='setupurl' value='setupurl'/>
+ <cd:command name='setupversions' value='setupversions'/>
+ <cd:command name='setupwhitespace' value='setupwhitespace'/>
+ <cd:command name='showbodyfont' value='showbodyfont'/>
+ <cd:command name='showbodyfontenvironment' value='showbodyfontenvironment'/>
+ <cd:command name='showcolor' value='showcolor'/>
+ <cd:command name='showcolorgroup' value='showcolorgroup'/>
+ <cd:command name='showexternalfigures' value='showexternalfigures'/>
+ <cd:command name='showfields' value='showfields'/>
+ <cd:command name='showframe' value='showframe'/>
+ <cd:command name='showgrid' value='showgrid'/>
+ <cd:command name='showlayout' value='showlayout'/>
+ <cd:command name='showmakeup' value='showmakeup'/>
+ <cd:command name='showpalet' value='showpalet'/>
+ <cd:command name='showprint' value='showprint'/>
+ <cd:command name='showsetups' value='showsetups'/>
+ <cd:command name='showstruts' value='showstruts'/>
+ <cd:command name='showsymbolset' value='showsymbolset'/>
+ <cd:command name='smallcapped' value='cap'/>
+ <cd:command name='someline' value='someline'/>
+ <cd:command name='somewhere' value='somewhere'/>
+ <cd:command name='space' value='space'/>
+ <cd:command name='splitfloat' value='splitfloat'/>
+ <cd:command name='startalignment' value='startalignment'/>
+ <cd:command name='startbackground' value='startbackground'/>
+ <cd:command name='startcoding' value='startcoding'/>
+ <cd:command name='startcolor' value='startcolor'/>
+ <cd:command name='startcolumnmakeup' value='startcolumnmakeup'/>
+ <cd:command name='startcolumns' value='startcolumns'/>
+ <cd:command name='startcolumnset' value='startcolumnset'/>
+ <cd:command name='startcombination' value='startcombination'/>
+ <cd:command name='startcomponent' value='startcomponent'/>
+ <cd:command name='startdocument' value='startdocument'/>
+ <cd:command name='startenvironment' value='startenvironment'/>
+ <cd:command name='startfigure' value='startfigure'/>
+ <cd:command name='startglobal' value='startglobal'/>
+ <cd:command name='startline' value='startline'/>
+ <cd:command name='startlinecorrection' value='startlinecorrection'/>
+ <cd:command name='startlinenumbering' value='startlinenumbering'/>
+ <cd:command name='startlines' value='startlines'/>
+ <cd:command name='startlocal' value='startlocal'/>
+ <cd:command name='startlocalfootnotes' value='startlocalfootnotes'/>
+ <cd:command name='startmakeup' value='startmakeup'/>
+ <cd:command name='startmarginblock' value='startmarginblock'/>
+ <cd:command name='startmarginrule' value='startmarginrule'/>
+ <cd:command name='startnarrower' value='startnarrower'/>
+ <cd:command name='startopposite' value='startopposite'/>
+ <cd:command name='startoverlay' value='startoverlay'/>
+ <cd:command name='startoverzicht' value='startoverview'/>
+ <cd:command name='startpacked' value='startpacked'/>
+ <cd:command name='startpositioning' value='startpositioning'/>
+ <cd:command name='startproduct' value='startproduct'/>
+ <cd:command name='startprofile' value='startprofile'/>
+ <cd:command name='startproject' value='startproject'/>
+ <cd:command name='startquotation' value='startquotation'/>
+ <cd:command name='startraster' value='startraster'/>
+ <cd:command name='startsymbolset' value='startsymbolset'/>
+ <cd:command name='startsynchronization' value='startsynchronization'/>
+ <cd:command name='starttable' value='starttable'/>
+ <cd:command name='starttables' value='starttables'/>
+ <cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextrule' value='starttextrule'/>
+ <cd:command name='startunpacked' value='startunpacked'/>
+ <cd:command name='startversion' value='startversion'/>
+ <cd:command name='stopalignment' value='stopalignment'/>
+ <cd:command name='stopbackground' value='stopbackground'/>
+ <cd:command name='stopcoding' value='stopcoding'/>
+ <cd:command name='stopcolor' value='stopcolor'/>
+ <cd:command name='stopcolumnmakeup' value='stopcolumnmakeup'/>
+ <cd:command name='stopcolumns' value='stopcolumns'/>
+ <cd:command name='stopcolumnset' value='stopcolumnset'/>
+ <cd:command name='stopcombination' value='stopcombination'/>
+ <cd:command name='stopcomponent' value='stopcomponent'/>
+ <cd:command name='stopdocument' value='stopdocument'/>
+ <cd:command name='stopenvironment' value='stopenvironment'/>
+ <cd:command name='stopglobal' value='stopglobal'/>
+ <cd:command name='stopline' value='stopline'/>
+ <cd:command name='stoplinecorrection' value='stoplinecorrection'/>
+ <cd:command name='stoplinenumbering' value='stoplinenumbering'/>
+ <cd:command name='stoplines' value='stoplines'/>
+ <cd:command name='stoplocal' value='stoplocal'/>
+ <cd:command name='stoplocalfootnotes' value='stoplocalfootnotes'/>
+ <cd:command name='stopmakeup' value='stopmakeup'/>
+ <cd:command name='stopmarginblock' value='stopmarginblock'/>
+ <cd:command name='stopmarginrule' value='stopmarginrule'/>
+ <cd:command name='stopnarrower' value='stopnarrower'/>
+ <cd:command name='stopopposite' value='stopopposite'/>
+ <cd:command name='stopoverlay' value='stopoverlay'/>
+ <cd:command name='stopoverzicht' value='stopoverview'/>
+ <cd:command name='stoppacked' value='stoppacked'/>
+ <cd:command name='stoppositioning' value='stoppositioning'/>
+ <cd:command name='stopproduct' value='stopproduct'/>
+ <cd:command name='stopprofile' value='stopprofile'/>
+ <cd:command name='stopproject' value='stopproject'/>
+ <cd:command name='stopquotation' value='stopquotation'/>
+ <cd:command name='stopraster' value='stopraster'/>
+ <cd:command name='stopsynchronization' value='stopsynchronization'/>
+ <cd:command name='stoptable' value='stoptable'/>
+ <cd:command name='stoptables' value='stoptables'/>
+ <cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextrule' value='stoptextrule'/>
+ <cd:command name='stopunpacked' value='stopunpacked'/>
+ <cd:command name='stopversion' value='stopversion'/>
+ <cd:command name='stretched' value='stretched'/>
+ <cd:command name='subformulanumber' value='subformulanumber'/>
+ <cd:command name='subpagenumber' value='subpagenumber'/>
+ <cd:command name='switchtobodyfont' value='switchtobodyfont'/>
+ <cd:command name='switchtorawfont' value='switchtorawfont'/>
+ <cd:command name='sym' value='sym'/>
+ <cd:command name='symbol' value='symbol'/>
+ <cd:command name='synchronizationbar' value='synchronizationbar'/>
+ <cd:command name='synchronize' value='synchronize'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testcolumn'/>
+ <cd:command name='testpage' value='testpage'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='textheight'/>
+ <cd:command name='textreference' value='textreference'/>
+ <cd:command name='textrule' value='textrule'/>
+ <cd:command name='textvariable' value='textvariable'/>
+ <cd:command name='textwidth' value='textwidth'/>
+ <cd:command name='thinrule' value='thinrule'/>
+ <cd:command name='thinrules' value='thinrules'/>
+ <cd:command name='tooltip' value='tooltip'/>
+ <cd:command name='topdistance' value='topdistance'/>
+ <cd:command name='topheight' value='topheight'/>
+ <cd:command name='topspace' value='topspace'/>
+ <cd:command name='totalnumberofpages' value='totalnumberofpages'/>
+ <cd:command name='translate' value='translate'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='typ'/>
+ <cd:command name='type' value='type'/>
+ <cd:command name='typebuffer' value='typebuffer'/>
+ <cd:command name='typefile' value='typefile'/>
+ <cd:command name='unitmeaning' value='unitmeaning'/>
+ <cd:command name='unknown' value='unknown'/>
+ <cd:command name='useJSscripts' value='useJSscripts'/>
+ <cd:command name='useURL' value='useURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='useblocks'/>
+ <cd:command name='usecommands' value='usecommands'/>
+ <cd:command name='useencoding' value='useencoding'/>
+ <cd:command name='useexternaldocument' value='useexternaldocument'/>
+ <cd:command name='useexternalfigure' value='useexternalfigure'/>
+ <cd:command name='useexternalfile' value='useexternalfile'/>
+ <cd:command name='useexternalfiles' value='useexternalfiles'/>
+ <cd:command name='useexternalsoundtrack' value='useexternalsoundtrack'/>
+ <cd:command name='usemodule' value='usemodule'/>
+ <cd:command name='usemodules' value='usemodules'/>
+ <cd:command name='usepath' value='usedirectory'/>
+ <cd:command name='usereferences' value='usereferences'/>
+ <cd:command name='usespecials' value='usespecials'/>
+ <cd:command name='usesymbols' value='usesymbols'/>
+ <cd:command name='usetypescript' value='usetypescript'/>
+ <cd:command name='usetypescriptfile' value='usetypescriptfile'/>
+ <cd:command name='useurl' value='useurl'/>
+ <cd:command name='version' value='version'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='weekday'/>
+ <cd:command name='whitespace' value='whitespace'/>
+ <cd:command name='wordright' value='wordright'/>
+ <cd:command name='writebetweenlist' value='writebetweenlist'/>
+ <cd:command name='writetolist' value='writetolist'/>
+ <cd:command name='writetoreferencelist' value='writetoreferencelist'/>
+ <cd:command name='writetoregister' value='writetoregister'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml
new file mode 100644
index 000000000..ba6483365
--- /dev/null
+++ b/tex/context/interface/keys-fr.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='fr' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language fr -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Ajout'/>
+ <cd:variable name='Balloon' value='Ballon'/>
+ <cd:variable name='Character' value='Caratere'/>
+ <cd:variable name='Characters' value='Caracteres'/>
+ <cd:variable name='CloseDocument' value='FermeDocument'/>
+ <cd:variable name='ExitViewer' value='SortVisualisateur'/>
+ <cd:variable name='FirstPage' value='PremierePage'/>
+ <cd:variable name='FitHeight' value='AjusteHauteur'/>
+ <cd:variable name='FitWidth' value='AjusteLargeur'/>
+ <cd:variable name='GotoPage' value='VaalaPage'/>
+ <cd:variable name='Greek' value='Grec'/>
+ <cd:variable name='Help' value='Aide'/>
+ <cd:variable name='HideField' value='CacheChamp'/>
+ <cd:variable name='HideLayer' value='CacheCalque'/>
+ <cd:variable name='Key' value='Cle'/>
+ <cd:variable name='LastPage' value='DernierePage'/>
+ <cd:variable name='LoadForm' value='ChargeForm'/>
+ <cd:variable name='MONTH' value='MOIS'/>
+ <cd:variable name='New' value='Nouveau'/>
+ <cd:variable name='NextJump' value='SautSuivant'/>
+ <cd:variable name='NextPage' value='PageSuivante'/>
+ <cd:variable name='Numbers' value='Numeros'/>
+ <cd:variable name='OpenNamedDocument' value='OuvreDocumentNomme'/>
+ <cd:variable name='Paragraph' value='Paragraphe'/>
+ <cd:variable name='PauseMovie' value='PauseFilm'/>
+ <cd:variable name='PauseRendering' value='PauseRendering'/>
+ <cd:variable name='PauseSound' value='PauseSon'/>
+ <cd:variable name='PreviousJump' value='SautPrecedent'/>
+ <cd:variable name='PreviousPage' value='PagePrecedente'/>
+ <cd:variable name='PrintDocument' value='ImprimeDocument'/>
+ <cd:variable name='Query' value='Query'/>
+ <cd:variable name='QueryAgain' value='QueryAgain'/>
+ <cd:variable name='ResetForm' value='RazForm'/>
+ <cd:variable name='ResumeMovie' value='ReprendFilm'/>
+ <cd:variable name='ResumeRendering' value='ResumeRendering'/>
+ <cd:variable name='ResumeSound' value='ReprendSon'/>
+ <cd:variable name='Romannumerals' value='Chiffresromains'/>
+ <cd:variable name='SaveDocument' value='SauvegardeDocument'/>
+ <cd:variable name='SaveForm' value='SauvegardeForm'/>
+ <cd:variable name='SaveNamedDocument' value='SauvegardeDocumentNomme'/>
+ <cd:variable name='SearchAgain' value='RechercheSuivant'/>
+ <cd:variable name='SearchDocument' value='RechercheDocument'/>
+ <cd:variable name='ShowBookmarks' value='ShowBookmarks'/>
+ <cd:variable name='ShowField' value='MontreChamp'/>
+ <cd:variable name='ShowThumbs' value='ShowThumbs'/>
+ <cd:variable name='StartMovie' value='DemarreFilm'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='DemarreSon'/>
+ <cd:variable name='StopMovie' value='StoppeFilm'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='StoppeSon'/>
+ <cd:variable name='SubmitForm' value='SoumettreForm'/>
+ <cd:variable name='ToggleLayer' value='ToggleLayer'/>
+ <cd:variable name='ToggleViewer' value='ChangeVisualisateur'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='AideVisualisateur'/>
+ <cd:variable name='WEEKDAY' value='JOURSEMAINE'/>
+ <cd:variable name='WORD' value='MOT'/>
+ <cd:variable name='abbreviation' value='abreviation'/>
+ <cd:variable name='abbreviations' value='abreviations'/>
+ <cd:variable name='absolute' value='absolute'/>
+ <cd:variable name='action' value='action'/>
+ <cd:variable name='after' value='apres'/>
+ <cd:variable name='all' value='tout'/>
+ <cd:variable name='always' value='toujours'/>
+ <cd:variable name='answerarea' value='answerarea'/>
+ <cd:variable name='appendices' value='annexes'/>
+ <cd:variable name='appendix' value='annexe'/>
+ <cd:variable name='april' value='avril'/>
+ <cd:variable name='atmargin' value='alamarge'/>
+ <cd:variable name='atpage' value='alapage'/>
+ <cd:variable name='august' value='aout'/>
+ <cd:variable name='author' value='auteur'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autointro'/>
+ <cd:variable name='back' value='retour'/>
+ <cd:variable name='background' value='arriereplan'/>
+ <cd:variable name='backmatter' value='epilogue'/>
+ <cd:variable name='backpart' value='postface'/>
+ <cd:variable name='backspace' value='retourarriere'/>
+ <cd:variable name='backward' value='retourarriere'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='avant'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='grand'/>
+ <cd:variable name='bigbodyfont' value='grandepolicecorp'/>
+ <cd:variable name='bigpreference' value='grandepreference'/>
+ <cd:variable name='blank' value='vide'/>
+ <cd:variable name='blockquote' value='blockquote'/>
+ <cd:variable name='bodymatter' value='texteprincipal'/>
+ <cd:variable name='bodypart' value='corpsdetexte'/>
+ <cd:variable name='bold' value='gras'/>
+ <cd:variable name='bolditalic' value='italiquegras'/>
+ <cd:variable name='boldslanted' value='inclinegras'/>
+ <cd:variable name='bookmark' value='marquepage'/>
+ <cd:variable name='both' value='lesdeux'/>
+ <cd:variable name='bottom' value='inf'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='large'/>
+ <cd:variable name='buffer' value='buffer'/>
+ <cd:variable name='by' value='par'/>
+ <cd:variable name='calligraphic' value='calligraphique'/>
+ <cd:variable name='cap' value='cap'/>
+ <cd:variable name='capital' value='capitale'/>
+ <cd:variable name='center' value='center'/>
+ <cd:variable name='chapter' value='chapitre'/>
+ <cd:variable name='character' value='caractere'/>
+ <cd:variable name='characters' value='caracteres'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='couleur'/>
+ <cd:variable name='column' value='colonne'/>
+ <cd:variable name='columns' value='colonnes'/>
+ <cd:variable name='command' value='commande'/>
+ <cd:variable name='commands' value='commandes'/>
+ <cd:variable name='comment' value='commentaire'/>
+ <cd:variable name='component' value='composant'/>
+ <cd:variable name='concept' value='concept'/>
+ <cd:variable name='content' value='contenu'/>
+ <cd:variable name='contents' value='contenus'/>
+ <cd:variable name='continue' value='continue'/>
+ <cd:variable name='controls' value='controles'/>
+ <cd:variable name='conversion' value='conversion'/>
+ <cd:variable name='current' value='courant'/>
+ <cd:variable name='cutspace' value='cutspace'/>
+ <cd:variable name='date' value='date'/>
+ <cd:variable name='day' value='jour'/>
+ <cd:variable name='december' value='decembre'/>
+ <cd:variable name='default' value='defaut'/>
+ <cd:variable name='depth' value='profondeur'/>
+ <cd:variable name='description' value='description'/>
+ <cd:variable name='disable' value='desactiver'/>
+ <cd:variable name='display' value='affichage'/>
+ <cd:variable name='dot' value='point'/>
+ <cd:variable name='doublesided' value='rectoverso'/>
+ <cd:variable name='down' value='down'/>
+ <cd:variable name='each' value='chaque'/>
+ <cd:variable name='edge' value='bord'/>
+ <cd:variable name='empty' value='vide'/>
+ <cd:variable name='end' value='end'/>
+ <cd:variable name='endnote' value='notefin'/>
+ <cd:variable name='enumeration' value='enumeration'/>
+ <cd:variable name='environment' value='environement'/>
+ <cd:variable name='even' value='paire'/>
+ <cd:variable name='external' value='external'/>
+ <cd:variable name='fact' value='fait'/>
+ <cd:variable name='february' value='fevrier'/>
+ <cd:variable name='figure' value='figure'/>
+ <cd:variable name='figures' value='figures'/>
+ <cd:variable name='file' value='fichier'/>
+ <cd:variable name='final' value='final'/>
+ <cd:variable name='first' value='premier'/>
+ <cd:variable name='firstcolumn' value='premierecolonne'/>
+ <cd:variable name='firstpage' value='premierepage'/>
+ <cd:variable name='firstsubpage' value='premieresouspage'/>
+ <cd:variable name='fit' value='adapte'/>
+ <cd:variable name='five' value='cinq'/>
+ <cd:variable name='fix' value='fixe'/>
+ <cd:variable name='fixed' value='fixe'/>
+ <cd:variable name='flexible' value='flexible'/>
+ <cd:variable name='float' value='flottant'/>
+ <cd:variable name='flushinner' value='flushinner'/>
+ <cd:variable name='flushleft' value='flushleft'/>
+ <cd:variable name='flushouter' value='flushouter'/>
+ <cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='footer' value='pdp'/>
+ <cd:variable name='footnote' value='notepdp'/>
+ <cd:variable name='force' value='force'/>
+ <cd:variable name='foreground' value='premierplan'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='formule'/>
+ <cd:variable name='formulae' value='formules'/>
+ <cd:variable name='forward' value='avance'/>
+ <cd:variable name='four' value='quatre'/>
+ <cd:variable name='frame' value='cadre'/>
+ <cd:variable name='framedtext' value='texteencadre'/>
+ <cd:variable name='friday' value='vendredi'/>
+ <cd:variable name='frontmatter' value='preambule'/>
+ <cd:variable name='frontpart' value='preface'/>
+ <cd:variable name='global' value='global'/>
+ <cd:variable name='graphic' value='graphique'/>
+ <cd:variable name='graphics' value='graphiques'/>
+ <cd:variable name='gray' value='gris'/>
+ <cd:variable name='greek' value='grec'/>
+ <cd:variable name='grid' value='grille'/>
+ <cd:variable name='halfline' value='demiligne'/>
+ <cd:variable name='handwritten' value='manuscript'/>
+ <cd:variable name='hang' value='suspend'/>
+ <cd:variable name='hanging' value='suspend'/>
+ <cd:variable name='head' value='tete'/>
+ <cd:variable name='header' value='entete'/>
+ <cd:variable name='height' value='hauteur'/>
+ <cd:variable name='helptext' value='texteaide'/>
+ <cd:variable name='hencefore' value='precedent'/>
+ <cd:variable name='here' value='ici'/>
+ <cd:variable name='hereafter' value='suivant'/>
+ <cd:variable name='hidden' value='cache'/>
+ <cd:variable name='hiding' value='cache'/>
+ <cd:variable name='high' value='haut'/>
+ <cd:variable name='horizontal' value='horizontale'/>
+ <cd:variable name='hyphenated' value='hyphenated'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='entre'/>
+ <cd:variable name='index' value='index'/>
+ <cd:variable name='indices' value='indices'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='herite'/>
+ <cd:variable name='inleft' value='dansgauche'/>
+ <cd:variable name='inmargin' value='dansmarge'/>
+ <cd:variable name='inner' value='interieur'/>
+ <cd:variable name='inneredge' value='bordinterieur'/>
+ <cd:variable name='innermargin' value='margeinterieure'/>
+ <cd:variable name='inright' value='dansdroit'/>
+ <cd:variable name='interaction' value='interaction'/>
+ <cd:variable name='interactionmenu' value='menuinteraction'/>
+ <cd:variable name='intermezzi' value='intermezzi'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='danstexte'/>
+ <cd:variable name='intro' value='intro'/>
+ <cd:variable name='italic' value='italique'/>
+ <cd:variable name='italicbold' value='grasitalique'/>
+ <cd:variable name='item' value='element'/>
+ <cd:variable name='itemize' value='lister'/>
+ <cd:variable name='its' value='its'/>
+ <cd:variable name='january' value='janvier'/>
+ <cd:variable name='joinedup' value='joinedup'/>
+ <cd:variable name='july' value='juillet'/>
+ <cd:variable name='june' value='juin'/>
+ <cd:variable name='keep' value='maintient'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='etiquette'/>
+ <cd:variable name='landscape' value='paysage'/>
+ <cd:variable name='last' value='dernier'/>
+ <cd:variable name='lastcolumn' value='dernierecolonne'/>
+ <cd:variable name='lastpage' value='dernierepage'/>
+ <cd:variable name='lastpagenumber' value='derniernumeropage'/>
+ <cd:variable name='lastsubpage' value='dernieresouspage'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='gauche'/>
+ <cd:variable name='leftedge' value='bordgauche'/>
+ <cd:variable name='lefthanging' value='lefthanging'/>
+ <cd:variable name='leftmargin' value='margegauche'/>
+ <cd:variable name='leftpage' value='pagegauche'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='legende'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='ligne'/>
+ <cd:variable name='linenote' value='noteligne'/>
+ <cd:variable name='lines' value='lignes'/>
+ <cd:variable name='list' value='liste'/>
+ <cd:variable name='local' value='local'/>
+ <cd:variable name='localenvironment' value='environementlocal'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='logos'/>
+ <cd:variable name='lohi' value='baha'/>
+ <cd:variable name='loose' value='perte'/>
+ <cd:variable name='low' value='bas'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='makeup'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='mars'/>
+ <cd:variable name='margin' value='marge'/>
+ <cd:variable name='marginedge' value='bordmarge'/>
+ <cd:variable name='margintitle' value='titremarge'/>
+ <cd:variable name='marking' value='marquage'/>
+ <cd:variable name='mathalignment' value='mathalignment'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='mathmatrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='mai'/>
+ <cd:variable name='mediaeval' value='medieval'/>
+ <cd:variable name='medium' value='moyen'/>
+ <cd:variable name='middle' value='milieu'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='hauteurmin'/>
+ <cd:variable name='minwidth' value='largeurmin'/>
+ <cd:variable name='mirrored' value='reflete'/>
+ <cd:variable name='monday' value='lundi'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='mois'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='nom'/>
+ <cd:variable name='narrow' value='etroit'/>
+ <cd:variable name='negative' value='negatif'/>
+ <cd:variable name='never' value='jamais'/>
+ <cd:variable name='new' value='nouveau'/>
+ <cd:variable name='next' value='prochain'/>
+ <cd:variable name='nextevenpage' value='pagepairesuivante'/>
+ <cd:variable name='nextoddpage' value='pageimpairesuivante'/>
+ <cd:variable name='nextpage' value='pagesuivante'/>
+ <cd:variable name='nextsubpage' value='souspagesuivante'/>
+ <cd:variable name='no' value='non'/>
+ <cd:variable name='nocheck' value='nonverifie'/>
+ <cd:variable name='nofit' value='nofit'/>
+ <cd:variable name='nogrid' value='nogrid'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='sansmarquage'/>
+ <cd:variable name='none' value='rien'/>
+ <cd:variable name='nonumber' value='sansnumero'/>
+ <cd:variable name='normal' value='normal'/>
+ <cd:variable name='nospacing' value='sansespacement'/>
+ <cd:variable name='not' value='pas'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='nonsuspendu'/>
+ <cd:variable name='nothyphenated' value='nothyphenated'/>
+ <cd:variable name='november' value='novembre'/>
+ <cd:variable name='nowhere' value='nulpart'/>
+ <cd:variable name='nowhite' value='sansblanc'/>
+ <cd:variable name='number' value='numero'/>
+ <cd:variable name='numbers' value='numeros'/>
+ <cd:variable name='october' value='octobre'/>
+ <cd:variable name='odd' value='impair'/>
+ <cd:variable name='off' value='desactive'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='old'/>
+ <cd:variable name='on' value='actif'/>
+ <cd:variable name='one' value='un'/>
+ <cd:variable name='opposite' value='opposition'/>
+ <cd:variable name='outer' value='exterieur'/>
+ <cd:variable name='outeredge' value='bordexterieur'/>
+ <cd:variable name='outermargin' value='margeexterieure'/>
+ <cd:variable name='overbar' value='overbar'/>
+ <cd:variable name='overbars' value='overbars'/>
+ <cd:variable name='overlay' value='revetement'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='surlignetout'/>
+ <cd:variable name='overstrikes' value='surligne'/>
+ <cd:variable name='packed' value='groupe'/>
+ <cd:variable name='page' value='page'/>
+ <cd:variable name='pagecomment' value='commentairepage'/>
+ <cd:variable name='pagenumber' value='numeropage'/>
+ <cd:variable name='paper' value='papier'/>
+ <cd:variable name='paragraph' value='paragraphe'/>
+ <cd:variable name='part' value='partie'/>
+ <cd:variable name='positive' value='positif'/>
+ <cd:variable name='postponing' value='postponing'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='preference'/>
+ <cd:variable name='preview' value='previsualisation'/>
+ <cd:variable name='previous' value='precedent'/>
+ <cd:variable name='previousevenpage' value='pagepaireprecedente'/>
+ <cd:variable name='previousoddpage' value='pageimpaireprecedente'/>
+ <cd:variable name='previouspage' value='pageprecedente'/>
+ <cd:variable name='previoussubpage' value='souspageprecedente'/>
+ <cd:variable name='printable' value='editable'/>
+ <cd:variable name='process' value='process'/>
+ <cd:variable name='product' value='produit'/>
+ <cd:variable name='program' value='programme'/>
+ <cd:variable name='project' value='projet'/>
+ <cd:variable name='protected' value='protege'/>
+ <cd:variable name='quadruple' value='quadruple'/>
+ <cd:variable name='quotation' value='citation'/>
+ <cd:variable name='quote' value='citer'/>
+ <cd:variable name='ran' value='cours'/>
+ <cd:variable name='random' value='aleatoire'/>
+ <cd:variable name='readonly' value='lectureseule'/>
+ <cd:variable name='rectangular' value='rectangulaire'/>
+ <cd:variable name='referral' value='referral'/>
+ <cd:variable name='register' value='registre'/>
+ <cd:variable name='regular' value='regulier'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relatif'/>
+ <cd:variable name='repeat' value='repete'/>
+ <cd:variable name='required' value='recquis'/>
+ <cd:variable name='reset' value='raz'/>
+ <cd:variable name='reverse' value='inverse'/>
+ <cd:variable name='right' value='droite'/>
+ <cd:variable name='rightedge' value='borddroit'/>
+ <cd:variable name='righthanging' value='righthanging'/>
+ <cd:variable name='rightmargin' value='margedroite'/>
+ <cd:variable name='rightpage' value='pagedroite'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='roman'/>
+ <cd:variable name='romannumerals' value='chiffresromains'/>
+ <cd:variable name='rotate' value='oriente'/>
+ <cd:variable name='rotated' value='tourne'/>
+ <cd:variable name='round' value='rond'/>
+ <cd:variable name='row' value='rang'/>
+ <cd:variable name='rule' value='regle'/>
+ <cd:variable name='samepage' value='memepage'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sansgras'/>
+ <cd:variable name='sansserif' value='sansserif'/>
+ <cd:variable name='saturday' value='samedi'/>
+ <cd:variable name='screen' value='ecran'/>
+ <cd:variable name='section' value='section'/>
+ <cd:variable name='sectionblockenvironment' value='environementblocsection'/>
+ <cd:variable name='sectionnumber' value='numerosection'/>
+ <cd:variable name='see' value='voit'/>
+ <cd:variable name='september' value='septembre'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='serried'/>
+ <cd:variable name='setups' value='reglages'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='short' value='short'/>
+ <cd:variable name='singlesided' value='recto'/>
+ <cd:variable name='slanted' value='incline'/>
+ <cd:variable name='slantedbold' value='grasincline'/>
+ <cd:variable name='small' value='petit'/>
+ <cd:variable name='smallbodyfont' value='petitepolicecorps'/>
+ <cd:variable name='smallbold' value='graspetit'/>
+ <cd:variable name='smallbolditalic' value='italiquegraspetit'/>
+ <cd:variable name='smallboldslanted' value='inclinegraspetit'/>
+ <cd:variable name='smallcaps' value='petitescapitales'/>
+ <cd:variable name='smallitalic' value='italiquepetit'/>
+ <cd:variable name='smallitalicbold' value='grasitaliquepetit'/>
+ <cd:variable name='smallnormal' value='normalpetit'/>
+ <cd:variable name='smallslanted' value='inclinepetit'/>
+ <cd:variable name='smallslantedbold' value='grasinclinepetit'/>
+ <cd:variable name='smalltype' value='petittype'/>
+ <cd:variable name='somewhere' value='qqpart'/>
+ <cd:variable name='sorted' value='trie'/>
+ <cd:variable name='space' value='espace'/>
+ <cd:variable name='spacing' value='espacement'/>
+ <cd:variable name='speech' value='discours'/>
+ <cd:variable name='split' value='split'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standard'/>
+ <cd:variable name='start' value='demarre'/>
+ <cd:variable name='starter' value='starter'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='stoppe'/>
+ <cd:variable name='stopper' value='stopper'/>
+ <cd:variable name='stretch' value='etire'/>
+ <cd:variable name='strict' value='strict'/>
+ <cd:variable name='strong' value='strong'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='sous'/>
+ <cd:variable name='subbackward' value='sousretourarriere'/>
+ <cd:variable name='subformula' value='subformule'/>
+ <cd:variable name='subforward' value='sousavance'/>
+ <cd:variable name='subject' value='sujet'/>
+ <cd:variable name='subpage' value='souspage'/>
+ <cd:variable name='subsection' value='soussection'/>
+ <cd:variable name='subsubject' value='soussujet'/>
+ <cd:variable name='subsubsection' value='soussoussection'/>
+ <cd:variable name='subsubsubject' value='soussoussujet'/>
+ <cd:variable name='subsubsubsection' value='soussoussoussection'/>
+ <cd:variable name='subsubsubsubject' value='soussoussoussujet'/>
+ <cd:variable name='subsubsubsubsection' value='soussoussoussoussection'/>
+ <cd:variable name='subsubsubsubsubject' value='soussoussoussoussujet'/>
+ <cd:variable name='subsubsubsubsubsection' value='soussoussoussoussoussection'/>
+ <cd:variable name='subsubsubsubsubsubject' value='soussoussoussoussoussujet'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='soussoussoussoussoussoussection'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='soussoussoussoussoussoussujet'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='soussoussoussoussoussoussoussection'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='soussoussoussoussoussoussoussujet'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='soussoussoussoussoussoussoussoussection'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='soussoussoussoussoussoussoussoussujet'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='soussoussoussoussoussoussoussoussoussection'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='soussoussoussoussoussoussoussoussoussujet'/>
+ <cd:variable name='sunday' value='dimanche'/>
+ <cd:variable name='support' value='support'/>
+ <cd:variable name='sym' value='sym'/>
+ <cd:variable name='symbol' value='symbole'/>
+ <cd:variable name='synchronize' value='synchronize'/>
+ <cd:variable name='system' value='systeme'/>
+ <cd:variable name='table' value='tableau'/>
+ <cd:variable name='tablehead' value='tetetableau'/>
+ <cd:variable name='tables' value='tables'/>
+ <cd:variable name='tabletail' value='queuetableau'/>
+ <cd:variable name='tabulate' value='tabule'/>
+ <cd:variable name='tabulatehead' value='tetetabule'/>
+ <cd:variable name='tabulatetail' value='queuetabule'/>
+ <cd:variable name='tall' value='long'/>
+ <cd:variable name='teletype' value='teletype'/>
+ <cd:variable name='temporary' value='temporaire'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='texte'/>
+ <cd:variable name='three' value='trois'/>
+ <cd:variable name='thursday' value='jeudi'/>
+ <cd:variable name='title' value='titre'/>
+ <cd:variable name='toggle' value='toggle'/>
+ <cd:variable name='tolerant' value='tolerant'/>
+ <cd:variable name='top' value='sup'/>
+ <cd:variable name='tuesday' value='mardi'/>
+ <cd:variable name='two' value='deux'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='type'/>
+ <cd:variable name='typing' value='typing'/>
+ <cd:variable name='unavailable' value='indisponible'/>
+ <cd:variable name='underbar' value='souslignetout'/>
+ <cd:variable name='underbars' value='sousligne'/>
+ <cd:variable name='unit' value='unite'/>
+ <cd:variable name='units' value='unites'/>
+ <cd:variable name='unknown' value='inconnu'/>
+ <cd:variable name='unpacked' value='degroupe'/>
+ <cd:variable name='up' value='up'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='used'/>
+ <cd:variable name='value' value='valeur'/>
+ <cd:variable name='vertical' value='verticale'/>
+ <cd:variable name='very' value='tres'/>
+ <cd:variable name='verystrict' value='tresstrict'/>
+ <cd:variable name='verytolerant' value='trestolerant'/>
+ <cd:variable name='weak' value='weak'/>
+ <cd:variable name='wednesday' value='mercredi'/>
+ <cd:variable name='week' value='semaine'/>
+ <cd:variable name='weekday' value='joursemaine'/>
+ <cd:variable name='white' value='blanc'/>
+ <cd:variable name='wide' value='ample'/>
+ <cd:variable name='width' value='largeur'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='annee'/>
+ <cd:variable name='yes' value='oui'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language fr -->
+
+ <cd:constants>
+ <cd:constant name='action' value='action'/>
+ <cd:constant name='address' value='adresse'/>
+ <cd:constant name='after' value='apres'/>
+ <cd:constant name='afterhead' value='aprestete'/>
+ <cd:constant name='afterkey' value='aprescle'/>
+ <cd:constant name='align' value='alignement'/>
+ <cd:constant name='aligncharacter' value='caracterealigne'/>
+ <cd:constant name='alignmentcharacter' value='alignementcaractere'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='alignementtitre'/>
+ <cd:constant name='alternative' value='alternative'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='fleche'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='a'/>
+ <cd:constant name='author' value='auteur'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autofocus'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autolargeur'/>
+ <cd:constant name='axis' value='axe'/>
+ <cd:constant name='background' value='arriereplan'/>
+ <cd:constant name='backgroundcolor' value='couleurarriereplan'/>
+ <cd:constant name='backgroundcorner' value='coinarriereplan'/>
+ <cd:constant name='backgrounddepth' value='profondeurarriereplan'/>
+ <cd:constant name='backgroundoffset' value='decalagearriereplan'/>
+ <cd:constant name='backgroundradius' value='rayonarriereplan'/>
+ <cd:constant name='backgroundscreen' value='ecranarriereplan'/>
+ <cd:constant name='backspace' value='retour'/>
+ <cd:constant name='balance' value='equilibre'/>
+ <cd:constant name='before' value='avant'/>
+ <cd:constant name='beforehead' value='avanttete'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='grand'/>
+ <cd:constant name='blank' value='vide'/>
+ <cd:constant name='blockway' value='blockway'/>
+ <cd:constant name='bodyfont' value='policecorps'/>
+ <cd:constant name='bookmark' value='marquepage'/>
+ <cd:constant name='bottom' value='inf'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='distanceinf'/>
+ <cd:constant name='bottomframe' value='cadreinf'/>
+ <cd:constant name='bottomoffset' value='decalageinf'/>
+ <cd:constant name='bottomspace' value='espaceinf'/>
+ <cd:constant name='bottomstate' value='etatinf'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='calculer'/>
+ <cd:constant name='ccommand' value='ccommande'/>
+ <cd:constant name='click' value='clic'/>
+ <cd:constant name='clickin' value='clicinterieur'/>
+ <cd:constant name='clickout' value='clicexterieur'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='actionfermeture'/>
+ <cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepageaction' value='actionfermeturepage'/>
+ <cd:constant name='closesymbol' value='closesymbol'/>
+ <cd:constant name='color' value='couleur'/>
+ <cd:constant name='column' value='colonne'/>
+ <cd:constant name='columndistance' value='distancecolonne'/>
+ <cd:constant name='columns' value='colonnes'/>
+ <cd:constant name='command' value='commande'/>
+ <cd:constant name='commandafter' value='commandeapres'/>
+ <cd:constant name='commandbefore' value='commandeavant'/>
+ <cd:constant name='commands' value='commandes'/>
+ <cd:constant name='component' value='composant'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='compress'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='continue'/>
+ <cd:constant name='contrastcolor' value='coleurcontraste'/>
+ <cd:constant name='controls' value='controles'/>
+ <cd:constant name='conversion' value='conversion'/>
+ <cd:constant name='convertfile' value='conversionfichier'/>
+ <cd:constant name='corner' value='coin'/>
+ <cd:constant name='coupling' value='couplage'/>
+ <cd:constant name='couplingway' value='modecouplage'/>
+ <cd:constant name='criterium' value='critere'/>
+ <cd:constant name='current' value='courant'/>
+ <cd:constant name='cutspace' value='cutspace'/>
+ <cd:constant name='dash' value='pointille'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='date'/>
+ <cd:constant name='deepnumbercommand' value='deepnumbercommand'/>
+ <cd:constant name='deeptextcommand' value='deeptextcommand'/>
+ <cd:constant name='default' value='defaut'/>
+ <cd:constant name='delay' value='delai'/>
+ <cd:constant name='depth' value='profondeur'/>
+ <cd:constant name='depthcorrection' value='correctionprofondeur'/>
+ <cd:constant name='direction' value='direction'/>
+ <cd:constant name='directory' value='repertoire'/>
+ <cd:constant name='display' value='affichage'/>
+ <cd:constant name='distance' value='distance'/>
+ <cd:constant name='dot' value='point'/>
+ <cd:constant name='doublesided' value='rectoverso'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='bord'/>
+ <cd:constant name='edgedistance' value='distancebord'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='vide'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='margepaire'/>
+ <cd:constant name='expansion' value='expansion'/>
+ <cd:constant name='export' value='export'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='facteur'/>
+ <cd:constant name='fallback' value='fallback'/>
+ <cd:constant name='family' value='famille'/>
+ <cd:constant name='fieldbackgroundcolor' value='couleurarrierreplanchamp'/>
+ <cd:constant name='fieldframecolor' value='couleurcadrechamp'/>
+ <cd:constant name='fieldlayer' value='calquechamp'/>
+ <cd:constant name='fieldoffset' value='offsetchamp'/>
+ <cd:constant name='file' value='fichier'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='focus'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusout'/>
+ <cd:constant name='footer' value='pdp'/>
+ <cd:constant name='footerdistance' value='dsitancepdp'/>
+ <cd:constant name='footerstate' value='etatpdp'/>
+ <cd:constant name='foregroundcolor' value='couleurpremierplan'/>
+ <cd:constant name='foregroundstyle' value='stylepremierplan'/>
+ <cd:constant name='format' value='formatter'/>
+ <cd:constant name='frame' value='cadre'/>
+ <cd:constant name='framecolor' value='couleurcadre'/>
+ <cd:constant name='framecorner' value='coincadre'/>
+ <cd:constant name='framedepth' value='profondeurcadre'/>
+ <cd:constant name='frameoffset' value='decalagecadre'/>
+ <cd:constant name='frameradius' value='rayoncadre'/>
+ <cd:constant name='frames' value='cadres'/>
+ <cd:constant name='from' value='de'/>
+ <cd:constant name='get' value='obtient'/>
+ <cd:constant name='global' value='global'/>
+ <cd:constant name='grid' value='grille'/>
+ <cd:constant name='hang' value='suspend'/>
+ <cd:constant name='headalign' value='headalign'/>
+ <cd:constant name='headcolor' value='couleurtete'/>
+ <cd:constant name='headcommand' value='commandetete'/>
+ <cd:constant name='headconversion' value='conversiontete'/>
+ <cd:constant name='header' value='entete'/>
+ <cd:constant name='headerdistance' value='distanceentete'/>
+ <cd:constant name='headerstate' value='etatentete'/>
+ <cd:constant name='headlabel' value='etiquettetete'/>
+ <cd:constant name='headnumber' value='numerotete'/>
+ <cd:constant name='headstyle' value='styletete'/>
+ <cd:constant name='height' value='hauteur'/>
+ <cd:constant name='hfactor' value='facteurhauteur'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='decalagehauteur'/>
+ <cd:constant name='horoffset' value='horoffset'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='icommande'/>
+ <cd:constant name='in' value='in'/>
+ <cd:constant name='inbetween' value='entre'/>
+ <cd:constant name='increment' value='incremente'/>
+ <cd:constant name='incrementnumber' value='incrementenumero'/>
+ <cd:constant name='indenting' value='composeenalinea'/>
+ <cd:constant name='indentnext' value='indentesuivant'/>
+ <cd:constant name='indicator' value='indicateur'/>
+ <cd:constant name='inner' value='interieur'/>
+ <cd:constant name='innermargin' value='margeinterieure'/>
+ <cd:constant name='inputfile' value='fichierentree'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='interaction'/>
+ <cd:constant name='interlinespace' value='espaceinterligne'/>
+ <cd:constant name='itemalign' value='itemalign'/>
+ <cd:constant name='items' value='elements'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keyword' value='motcle'/>
+ <cd:constant name='label' value='etiquette'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='gauche'/>
+ <cd:constant name='leftcolor' value='couleurgauche'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='bordgauche'/>
+ <cd:constant name='leftedgedistance' value='distancebordgauche'/>
+ <cd:constant name='leftframe' value='cadregauche'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='margegauche'/>
+ <cd:constant name='leftmargindistance' value='distancemargegauche'/>
+ <cd:constant name='leftoffset' value='decalagegauche'/>
+ <cd:constant name='leftquotation' value='citationgauche'/>
+ <cd:constant name='leftquote' value='citergauche'/>
+ <cd:constant name='leftsentence' value='phrasegauche'/>
+ <cd:constant name='leftspeech' value='leftspeech'/>
+ <cd:constant name='leftstyle' value='leftstyle'/>
+ <cd:constant name='leftsubsentence' value='sousphrasegauche'/>
+ <cd:constant name='lefttext' value='textegauche'/>
+ <cd:constant name='leftwidth' value='largeurgauche'/>
+ <cd:constant name='level' value='niveau'/>
+ <cd:constant name='levels' value='niveaux'/>
+ <cd:constant name='limittext' value='limittext'/>
+ <cd:constant name='line' value='ligne'/>
+ <cd:constant name='linecorrection' value='correctionligne'/>
+ <cd:constant name='lines' value='lignes'/>
+ <cd:constant name='list' value='liste'/>
+ <cd:constant name='listtext' value='texteliste'/>
+ <cd:constant name='local' value='local'/>
+ <cd:constant name='location' value='emplacement'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='logos'/>
+ <cd:constant name='marcolor' value='couleurmarquage'/>
+ <cd:constant name='margin' value='marge'/>
+ <cd:constant name='margindistance' value='distancemarge'/>
+ <cd:constant name='marginedge' value='bordmarge'/>
+ <cd:constant name='marginedgetext' value='textebordmarge'/>
+ <cd:constant name='margintext' value='textemarge'/>
+ <cd:constant name='marking' value='marquage'/>
+ <cd:constant name='marstyle' value='stylemarquage'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='hauteurmax'/>
+ <cd:constant name='maxwidth' value='largeurmax'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='menu'/>
+ <cd:constant name='method' value='methode'/>
+ <cd:constant name='middle' value='milieu'/>
+ <cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middletext' value='textecentre'/>
+ <cd:constant name='midsentence' value='midsentence'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='profondeurmin'/>
+ <cd:constant name='minheight' value='hauteurmin'/>
+ <cd:constant name='minwidth' value='largeurmin'/>
+ <cd:constant name='monthconversion' value='monthconversion'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='nom'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='ninf'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='suivant'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='ngauche'/>
+ <cd:constant name='nlines' value='nlignes'/>
+ <cd:constant name='norm' value='norme'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='ndroite'/>
+ <cd:constant name='ntop' value='nsup'/>
+ <cd:constant name='number' value='numero'/>
+ <cd:constant name='numbercolor' value='couleurnumero'/>
+ <cd:constant name='numbercommand' value='commandenumero'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='numberdistance'/>
+ <cd:constant name='numbering' value='numerotation'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='separateurnumbero'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='stylenumero'/>
+ <cd:constant name='numberwidth' value='numberwidth'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='objet'/>
+ <cd:constant name='obstruction' value='obstruction'/>
+ <cd:constant name='oddmargin' value='margepaire'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='actionouverture'/>
+ <cd:constant name='openpageaction' value='actionouverturepage'/>
+ <cd:constant name='option' value='option'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='orientation'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='margeexterieure'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='numeroproprio'/>
+ <cd:constant name='page' value='page'/>
+ <cd:constant name='pageboundaries' value='limitespage'/>
+ <cd:constant name='pagecolor' value='couleurpage'/>
+ <cd:constant name='pagecommand' value='commandepage'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='numeropage'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='etatpage'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='stylepage'/>
+ <cd:constant name='palet' value='palette'/>
+ <cd:constant name='paper' value='papier'/>
+ <cd:constant name='paragraph' value='paragraphe'/>
+ <cd:constant name='place' value='place'/>
+ <cd:constant name='placehead' value='placetete'/>
+ <cd:constant name='placestopper' value='emplacementstopper'/>
+ <cd:constant name='position' value='position'/>
+ <cd:constant name='prefix' value='prefixe'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='prereglage'/>
+ <cd:constant name='preview' value='previsualisation'/>
+ <cd:constant name='previous' value='precedent'/>
+ <cd:constant name='previousnumber' value='numeroprecedent'/>
+ <cd:constant name='process' value='process'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='rayon'/>
+ <cd:constant name='random' value='aleatoire'/>
+ <cd:constant name='range' value='range'/>
+ <cd:constant name='reduction' value='reduction'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='reference'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='referencing'/>
+ <cd:constant name='regionin' value='entreregion'/>
+ <cd:constant name='regionout' value='regionexterieure'/>
+ <cd:constant name='repeat' value='repete'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='raznumero'/>
+ <cd:constant name='resolution' value='resolution'/>
+ <cd:constant name='right' value='droite'/>
+ <cd:constant name='rightcolor' value='couleurdroite'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='borddroit'/>
+ <cd:constant name='rightedgedistance' value='distanceborddroit'/>
+ <cd:constant name='rightframe' value='cadredroit'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='margedroite'/>
+ <cd:constant name='rightmargindistance' value='distancemargedroite'/>
+ <cd:constant name='rightoffset' value='rightoffset'/>
+ <cd:constant name='rightquotation' value='citationdroite'/>
+ <cd:constant name='rightquote' value='citerdroite'/>
+ <cd:constant name='rightsentence' value='phrasedroite'/>
+ <cd:constant name='rightspeech' value='rightspeech'/>
+ <cd:constant name='rightstyle' value='styledroit'/>
+ <cd:constant name='rightsubsentence' value='sousphrasedroite'/>
+ <cd:constant name='righttext' value='textedroit'/>
+ <cd:constant name='rightwidth' value='largeurdroite'/>
+ <cd:constant name='rotation' value='rotation'/>
+ <cd:constant name='rule' value='ligne'/>
+ <cd:constant name='rulecolor' value='couleurligne'/>
+ <cd:constant name='rulethickness' value='epaisseurligne'/>
+ <cd:constant name='samepage' value='memepage'/>
+ <cd:constant name='sample' value='echantillon'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='echelle'/>
+ <cd:constant name='scope' value='scope'/>
+ <cd:constant name='screen' value='ecran'/>
+ <cd:constant name='section' value='section'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='numerosection'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='separateur'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='reglages'/>
+ <cd:constant name='side' value='cote'/>
+ <cd:constant name='sidealign' value='sidealign'/>
+ <cd:constant name='sidemethod' value='sidemethod'/>
+ <cd:constant name='sidespaceafter' value='espacelateralapres'/>
+ <cd:constant name='sidespacebefore' value='espacelateralavant'/>
+ <cd:constant name='sign' value='signe'/>
+ <cd:constant name='size' value='dimension'/>
+ <cd:constant name='small' value='petit'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='sorttype'/>
+ <cd:constant name='source' value='origine'/>
+ <cd:constant name='space' value='espace'/>
+ <cd:constant name='spaceafter' value='espaceapres'/>
+ <cd:constant name='spacebefore' value='espaceavant'/>
+ <cd:constant name='spaceinbetween' value='spaceinbetween'/>
+ <cd:constant name='spacing' value='espacement'/>
+ <cd:constant name='split' value='split'/>
+ <cd:constant name='splitcolor' value='splitcolor'/>
+ <cd:constant name='splitmethod' value='splitmethod'/>
+ <cd:constant name='splitoffset' value='splitoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stack'/>
+ <cd:constant name='start' value='demarre'/>
+ <cd:constant name='starter' value='starter'/>
+ <cd:constant name='state' value='etat'/>
+ <cd:constant name='step' value='pas'/>
+ <cd:constant name='stop' value='stoppe'/>
+ <cd:constant name='stopper' value='taquet'/>
+ <cd:constant name='stretch' value='etire'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='style'/>
+ <cd:constant name='sub' value='sous'/>
+ <cd:constant name='subtitle' value='soustitre'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symalignement'/>
+ <cd:constant name='symbol' value='symbole'/>
+ <cd:constant name='symbolset' value='jeusymbole'/>
+ <cd:constant name='symcolor' value='couleursym'/>
+ <cd:constant name='symstyle' value='stylesym'/>
+ <cd:constant name='synonym' value='synonyme'/>
+ <cd:constant name='synonymcolor' value='couleursynonyme'/>
+ <cd:constant name='synonymcommand' value='synonymcommand'/>
+ <cd:constant name='synonymstyle' value='stylesynonyme'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='texte'/>
+ <cd:constant name='textcolor' value='couleurtexte'/>
+ <cd:constant name='textcommand' value='commandetexte'/>
+ <cd:constant name='textdistance' value='distancetexte'/>
+ <cd:constant name='textlayer' value='calquetexte'/>
+ <cd:constant name='textmargin' value='margetexte'/>
+ <cd:constant name='textmethod' value='textmethod'/>
+ <cd:constant name='textseparator' value='separateurtexte'/>
+ <cd:constant name='textsize' value='tailletexte'/>
+ <cd:constant name='textstate' value='etattexte'/>
+ <cd:constant name='textstyle' value='styletexte'/>
+ <cd:constant name='textwidth' value='largeurtexte'/>
+ <cd:constant name='title' value='titre'/>
+ <cd:constant name='titlecolor' value='couleurtitre'/>
+ <cd:constant name='titlecommand' value='titlecommand'/>
+ <cd:constant name='titledistance' value='distancetitre'/>
+ <cd:constant name='titleleft' value='titleleft'/>
+ <cd:constant name='titleright' value='titleright'/>
+ <cd:constant name='titlestyle' value='styletitre'/>
+ <cd:constant name='to' value='vers'/>
+ <cd:constant name='tolerance' value='tolerance'/>
+ <cd:constant name='top' value='sup'/>
+ <cd:constant name='topdistance' value='distancesup'/>
+ <cd:constant name='topframe' value='cadresup'/>
+ <cd:constant name='topoffset' value='decalagesup'/>
+ <cd:constant name='topspace' value='espacesup'/>
+ <cd:constant name='topstate' value='etatsup'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='type'/>
+ <cd:constant name='unit' value='unite'/>
+ <cd:constant name='unknownreference' value='referenceinconnue'/>
+ <cd:constant name='urlalternative' value='alternativeurl'/>
+ <cd:constant name='urlspace' value='espaceurl'/>
+ <cd:constant name='validate' value='valider'/>
+ <cd:constant name='vcommand' value='vcommande'/>
+ <cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='mode'/>
+ <cd:constant name='wfactor' value='facteurlargeur'/>
+ <cd:constant name='white' value='blanc'/>
+ <cd:constant name='width' value='largeur'/>
+ <cd:constant name='xfactor' value='xfactor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xscale'/>
+ <cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yfactor' value='yfactor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='yscale'/>
+ <cd:constant name='ystep' value='ystep'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language fr -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='answerlines'/>
+ <cd:element name='answerspace' value='answerspace'/>
+ <cd:element name='begin' value='debut'/>
+ <cd:element name='complete' value='complete'/>
+ <cd:element name='coupled' value='couple'/>
+ <cd:element name='currentlocal' value='localcourant'/>
+ <cd:element name='emptyone' value='vide'/>
+ <cd:element name='emptytwo' value='vide'/>
+ <cd:element name='end' value='fin'/>
+ <cd:element name='endsetup' value=''/>
+ <cd:element name='get' value='obtient'/>
+ <cd:element name='increment' value='incremente'/>
+ <cd:element name='list' value='liste'/>
+ <cd:element name='listof' value='listede'/>
+ <cd:element name='load' value='charge'/>
+ <cd:element name='local' value='local'/>
+ <cd:element name='makeup' value='makeup'/>
+ <cd:element name='next' value='suivant'/>
+ <cd:element name='place' value='place'/>
+ <cd:element name='previous' value='precedent'/>
+ <cd:element name='previouslocal' value='localprecedent'/>
+ <cd:element name='reserve' value='reserver'/>
+ <cd:element name='see' value='voit'/>
+ <cd:element name='setup' value='regle'/>
+ <cd:element name='start' value='demarre'/>
+ <cd:element name='stop' value='stoppe'/>
+ <cd:element name='text' value='texte'/>
+ <cd:element name='type' value='type'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language fr -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='CAP'/>
+ <cd:command name='Character' value='Caractere'/>
+ <cd:command name='Characters' value='Caracteres'/>
+ <cd:command name='LABELTEXT' value='LABELTEXTE'/>
+ <cd:command name='MONTH' value='MOIS'/>
+ <cd:command name='Numbers' value='Numeros'/>
+ <cd:command name='Romannumerals' value='Chiffresromains'/>
+ <cd:command name='SmallCapped' value='Cap'/>
+ <cd:command name='SmallCaps' value='Caps'/>
+ <cd:command name='WEEKDAY' value='JOURSEMAINE'/>
+ <cd:command name='WORD' value='MOT'/>
+ <cd:command name='WORDS' value='MOTS'/>
+ <cd:command name='Word' value='Mot'/>
+ <cd:command name='Words' value='Mots'/>
+ <cd:command name='about' value='concernant'/>
+ <cd:command name='adaptlayout' value='adaptedisposition'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='a'/>
+ <cd:command name='atleftmargin' value='atleftmargin'/>
+ <cd:command name='atpage' value='alapage'/>
+ <cd:command name='atrightmargin' value='atrightmargin'/>
+ <cd:command name='background' value='arriereplan'/>
+ <cd:command name='backspace' value='retourarriere'/>
+ <cd:command name='blackrule' value='lignenoire'/>
+ <cd:command name='blackrules' value='lignesnoires'/>
+ <cd:command name='blank' value='vide'/>
+ <cd:command name='bookmark' value='marquepage'/>
+ <cd:command name='bottomdistance' value='distanceinf'/>
+ <cd:command name='bottomheight' value='hauteurinf'/>
+ <cd:command name='bottomspace' value='espaceinf'/>
+ <cd:command name='but' value='but'/>
+ <cd:command name='button' value='bouton'/>
+ <cd:command name='bypassblocks' value='sauteblocs'/>
+ <cd:command name='character' value='caractere'/>
+ <cd:command name='characters' value='caracteres'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='clip'/>
+ <cd:command name='clonefield' value='clonechamp'/>
+ <cd:command name='color' value='couleur'/>
+ <cd:command name='colorbar' value='barrecouleur'/>
+ <cd:command name='colorvalue' value='valeurcouleur'/>
+ <cd:command name='column' value='colonne'/>
+ <cd:command name='comment' value='commentaire'/>
+ <cd:command name='comparecolorgroup' value='comparegroupecouleur'/>
+ <cd:command name='comparepalet' value='comparepalette'/>
+ <cd:command name='completepagenumber' value='completenumeropage'/>
+ <cd:command name='completeregister' value='completeregistre'/>
+ <cd:command name='component' value='composant'/>
+ <cd:command name='convertnumber' value='convertitnumero'/>
+ <cd:command name='copyfield' value='copitchamp'/>
+ <cd:command name='correctwhitespace' value='corrigeespaceblanc'/>
+ <cd:command name='coupledocument' value='coupledocument'/>
+ <cd:command name='couplemarking' value='couplemarquage'/>
+ <cd:command name='couplepage' value='pagedouble'/>
+ <cd:command name='couplepaper' value='couplepapier'/>
+ <cd:command name='coupleregister' value='coupleregistre'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='datecourante'/>
+ <cd:command name='currentheadnumber' value='numerotetecourant'/>
+ <cd:command name='cutspace' value='cutspace'/>
+ <cd:command name='date' value='date'/>
+ <cd:command name='decouplemarking' value='decouplemarquage'/>
+ <cd:command name='decrementnumber' value='decrementenumero'/>
+ <cd:command name='define' value='definit'/>
+ <cd:command name='defineaccent' value='definitaccent'/>
+ <cd:command name='defineblank' value='definitvide'/>
+ <cd:command name='defineblock' value='definitbloc'/>
+ <cd:command name='definebodyfont' value='definitpolicecorps'/>
+ <cd:command name='definebodyfontenvironment' value='definitenvironnementpolicecorps'/>
+ <cd:command name='definebuffer' value='definitbuffer'/>
+ <cd:command name='definecharacter' value='definicaractere'/>
+ <cd:command name='definecolor' value='definitcouleur'/>
+ <cd:command name='definecolorgroup' value='definitgroupecouleur'/>
+ <cd:command name='definecolumnbreak' value='definitsautdecolonne'/>
+ <cd:command name='definecolumnset' value='definitjeucolonne'/>
+ <cd:command name='definecombination' value='definecombination'/>
+ <cd:command name='definecombinedlist' value='definitlisteimbriquee'/>
+ <cd:command name='definecommand' value='definitcommande'/>
+ <cd:command name='defineconversion' value='definitconversion'/>
+ <cd:command name='definedescription' value='definitdescription'/>
+ <cd:command name='defineenumeration' value='definitenumeration'/>
+ <cd:command name='definefield' value='definitchamp'/>
+ <cd:command name='definefieldstack' value='definitpilechamp'/>
+ <cd:command name='definefiguresymbol' value='definitsymbolefigure'/>
+ <cd:command name='definefloat' value='definitflottant'/>
+ <cd:command name='definefont' value='definitpolice'/>
+ <cd:command name='definefontstyle' value='definitstylepolice'/>
+ <cd:command name='definefontsynonym' value='definitsynonymepolice'/>
+ <cd:command name='defineframed' value='defineframed'/>
+ <cd:command name='defineframedtext' value='defineframedtext'/>
+ <cd:command name='definehbox' value='definithbox'/>
+ <cd:command name='definehead' value='definittete'/>
+ <cd:command name='defineindenting' value='definitcompoalinea'/>
+ <cd:command name='defineinmargin' value='definitdansmarge'/>
+ <cd:command name='defineinteractionmenu' value='definitmenuinteraction'/>
+ <cd:command name='defineitemgroup' value='defineitemgroup'/>
+ <cd:command name='definelabel' value='definitetiquette'/>
+ <cd:command name='definelayer' value='definitcalque'/>
+ <cd:command name='definelayout' value='definitdisposition'/>
+ <cd:command name='definelist' value='definitliste'/>
+ <cd:command name='definelogo' value='definitlogo'/>
+ <cd:command name='definemainfield' value='definitchampprincipal'/>
+ <cd:command name='definemakeup' value='definitmakeup'/>
+ <cd:command name='definemarking' value='definitmarquage'/>
+ <cd:command name='definemathalignment' value='definemathalignment'/>
+ <cd:command name='defineoutput' value='definitsortie'/>
+ <cd:command name='defineoverlay' value='definitrevetement'/>
+ <cd:command name='definepagebreak' value='definitsautdepage'/>
+ <cd:command name='definepalet' value='definitpalette'/>
+ <cd:command name='definepapersize' value='definittaillepapier'/>
+ <cd:command name='defineparagraphs' value='definitparagraphes'/>
+ <cd:command name='defineplacement' value='defineplacement'/>
+ <cd:command name='defineprofile' value='definitprofil'/>
+ <cd:command name='defineprogram' value='definitprogramme'/>
+ <cd:command name='definerawfont' value='definitpolicebrute'/>
+ <cd:command name='definereference' value='definitreference'/>
+ <cd:command name='definereferenceformat' value='definitformatreference'/>
+ <cd:command name='definereferencelist' value='definitlistereference'/>
+ <cd:command name='defineregister' value='definitregistre'/>
+ <cd:command name='definerule' value='definitregle'/>
+ <cd:command name='definesection' value='definitsection'/>
+ <cd:command name='definesectionblock' value='definitblocsection'/>
+ <cd:command name='definesorting' value='definittri'/>
+ <cd:command name='definestartstop' value='definitdemarrestoppe'/>
+ <cd:command name='definestyle' value='definitstyle'/>
+ <cd:command name='definesubfield' value='definitsouschamp'/>
+ <cd:command name='definesymbol' value='definitsymbole'/>
+ <cd:command name='definesynonyms' value='definitsynonymes'/>
+ <cd:command name='definetabletemplate' value='definittrametableau'/>
+ <cd:command name='definetabulate' value='definittabulation'/>
+ <cd:command name='definetext' value='definittexte'/>
+ <cd:command name='definetextposition' value='definitpositiontexte'/>
+ <cd:command name='definetextvariable' value='definitvariabletexte'/>
+ <cd:command name='definetype' value='definittype'/>
+ <cd:command name='definetyping' value='definitdactylo'/>
+ <cd:command name='defineversion' value='definitversion'/>
+ <cd:command name='determineheadnumber' value='determinenumerotete'/>
+ <cd:command name='determinelistcharacteristics' value='determinecaracteristiqueliste'/>
+ <cd:command name='determineregistercharacteristics' value='determinecaracteristiquesregistre'/>
+ <cd:command name='dimension' value='dimension'/>
+ <cd:command name='disableinteractionmenu' value='inhibemenuinteraction'/>
+ <cd:command name='domicile' value='domicile'/>
+ <cd:command name='donttest' value='sanstest'/>
+ <cd:command name='edgedistance' value='distancebord'/>
+ <cd:command name='edgewidth' value='largeurbord'/>
+ <cd:command name='emptylines' value='emptylines'/>
+ <cd:command name='environment' value='environement'/>
+ <cd:command name='externalfigure' value='figureexterne'/>
+ <cd:command name='fact' value='fait'/>
+ <cd:command name='field' value='champ'/>
+ <cd:command name='fieldstack' value='pilechamp'/>
+ <cd:command name='fillinfield' value='remplitchamp'/>
+ <cd:command name='fillinline' value='remplitligne'/>
+ <cd:command name='fillinrules' value='remplitlignesreglees'/>
+ <cd:command name='fillintext' value='remplittexte'/>
+ <cd:command name='fitfield' value='ajustechamp'/>
+ <cd:command name='fixedspace' value='espacefixe'/>
+ <cd:command name='fixedspaces' value='espacesfixes'/>
+ <cd:command name='followprofile' value='suivantprofil'/>
+ <cd:command name='followprofileversion' value='suivantversionprofil'/>
+ <cd:command name='followversion' value='suivantversion'/>
+ <cd:command name='footerdistance' value='distancepdp'/>
+ <cd:command name='footerheight' value='hauteurpdp'/>
+ <cd:command name='footnote' value='notepdp'/>
+ <cd:command name='footnotetext' value='textenotepdp'/>
+ <cd:command name='forceblocks' value='forceblocs'/>
+ <cd:command name='formulanumber' value='numeroformule'/>
+ <cd:command name='fraction' value='fraction'/>
+ <cd:command name='framed' value='framed'/>
+ <cd:command name='from' value='de'/>
+ <cd:command name='getbuffer' value='prendbuffer'/>
+ <cd:command name='getmarking' value='obtientmarquage'/>
+ <cd:command name='getnumber' value='getnumber'/>
+ <cd:command name='godown' value='vaenbas'/>
+ <cd:command name='goto' value='va'/>
+ <cd:command name='gotobox' value='vaalaboite'/>
+ <cd:command name='gotopage' value='vaalapage'/>
+ <cd:command name='graycolor' value='couleurgrise'/>
+ <cd:command name='greyvalue' value='valeurgris'/>
+ <cd:command name='grid' value='grille'/>
+ <cd:command name='hairline' value='ligneh'/>
+ <cd:command name='head' value='tete'/>
+ <cd:command name='headerdistance' value='distanceentete'/>
+ <cd:command name='headerheight' value='hauteurentete'/>
+ <cd:command name='headlevel' value='niveautete'/>
+ <cd:command name='headnumber' value='numerotete'/>
+ <cd:command name='headsym' value='headsym'/>
+ <cd:command name='headtext' value='textetete'/>
+ <cd:command name='hideblocks' value='cacheblocs'/>
+ <cd:command name='high' value='haut'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='immediatebetweenlist'/>
+ <cd:command name='immediatetolist' value='immediatetolist'/>
+ <cd:command name='in' value='dans'/>
+ <cd:command name='incrementnumber' value='incrementenumero'/>
+ <cd:command name='indenting' value='composeenalinea'/>
+ <cd:command name='inframed' value='inframed'/>
+ <cd:command name='infull' value='infull'/>
+ <cd:command name='ininner' value='ininner'/>
+ <cd:command name='inleft' value='dansgauche'/>
+ <cd:command name='inleftedge' value='dansbordgauche'/>
+ <cd:command name='inleftmargin' value='dansmargegauche'/>
+ <cd:command name='inline' value='alaligne'/>
+ <cd:command name='inmargin' value='dansmarge'/>
+ <cd:command name='inmframed' value='inmframed'/>
+ <cd:command name='inneredgedistance' value='inneredgedistance'/>
+ <cd:command name='inneredgewidth' value='inneredgewidth'/>
+ <cd:command name='innermargindistance' value='innermargindistance'/>
+ <cd:command name='innermarginwidth' value='innermarginwidth'/>
+ <cd:command name='inothermargin' value='dansautremarge'/>
+ <cd:command name='inouter' value='inouter'/>
+ <cd:command name='inright' value='dansdroite'/>
+ <cd:command name='inrightedge' value='dansborddroit'/>
+ <cd:command name='inrightmargin' value='dansmargedroite'/>
+ <cd:command name='installlanguage' value='installelangue'/>
+ <cd:command name='interactionbar' value='barreinteraction'/>
+ <cd:command name='interactionbuttons' value='boutonsinteraction'/>
+ <cd:command name='interactionmenu' value='menuinteraction'/>
+ <cd:command name='item' value='element'/>
+ <cd:command name='items' value='elements'/>
+ <cd:command name='its' value='el'/>
+ <cd:command name='keepblocks' value='gardeblocs'/>
+ <cd:command name='label' value='etiquette'/>
+ <cd:command name='labels' value='etiquettes'/>
+ <cd:command name='labeltext' value='labeltexte'/>
+ <cd:command name='language' value='langue'/>
+ <cd:command name='leftaligned' value='aligneagauche'/>
+ <cd:command name='leftedgedistance' value='distancebordgauche'/>
+ <cd:command name='leftedgewidth' value='largeurbordgauche'/>
+ <cd:command name='leftmargindistance' value='distancemargegauche'/>
+ <cd:command name='leftmarginwidth' value='largeurmargegauche'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='largeurligne'/>
+ <cd:command name='listheight' value='hauteurliste'/>
+ <cd:command name='listlength' value='llongueurliste'/>
+ <cd:command name='listsymbol' value='listesymbole'/>
+ <cd:command name='listwidth' value='largeurliste'/>
+ <cd:command name='logfields' value='logchamp'/>
+ <cd:command name='lohi' value='baha'/>
+ <cd:command name='low' value='bas'/>
+ <cd:command name='macroname' value='nommacro'/>
+ <cd:command name='mainlanguage' value='langueprincipale'/>
+ <cd:command name='makeupheight' value='hauteurmakeup'/>
+ <cd:command name='makeupwidth' value='largeurmakeup'/>
+ <cd:command name='mar' value='mar'/>
+ <cd:command name='margindistance' value='distancemarge'/>
+ <cd:command name='marginrule' value='margereglee'/>
+ <cd:command name='margintext' value='textemarge'/>
+ <cd:command name='margintitle' value='titremarge'/>
+ <cd:command name='marginwidth' value='largeurmarge'/>
+ <cd:command name='marginword' value='motmarge'/>
+ <cd:command name='marking' value='marquage'/>
+ <cd:command name='markversion' value='marquageversion'/>
+ <cd:command name='mathematics' value='mathematique'/>
+ <cd:command name='menubutton' value='boutonmenu'/>
+ <cd:command name='mframed' value='mframed'/>
+ <cd:command name='midaligned' value='aligneaumilieu'/>
+ <cd:command name='mirror' value='reflete'/>
+ <cd:command name='month' value='mois'/>
+ <cd:command name='moveformula' value='deplaceformule'/>
+ <cd:command name='moveongrid' value='deplacesurgrille'/>
+ <cd:command name='movesidefloat' value='movesidefloat'/>
+ <cd:command name='navigating' value='navigating'/>
+ <cd:command name='nodimension' value='sansdimension'/>
+ <cd:command name='noheaderandfooterlines' value='sanslignesenteteetpdp'/>
+ <cd:command name='noindenting' value='sansalinea'/>
+ <cd:command name='nolist' value='sansliste'/>
+ <cd:command name='nomarking' value='sansmarquage'/>
+ <cd:command name='nomoreblocks' value='pasplusdeblocs'/>
+ <cd:command name='nomorefiles' value='pasplusdefichiers'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='sansespace'/>
+ <cd:command name='note' value='note'/>
+ <cd:command name='notopandbottomlines' value='sanslignessupetinf'/>
+ <cd:command name='notsmallcapped' value='nocap'/>
+ <cd:command name='nowhitespace' value='sansespaceblanc'/>
+ <cd:command name='numberofsubpages' value='nombredesouspages'/>
+ <cd:command name='numbers' value='numeros'/>
+ <cd:command name='outeredgedistance' value='outeredgedistance'/>
+ <cd:command name='outeredgewidth' value='outeredgewidth'/>
+ <cd:command name='outermargindistance' value='outermargindistance'/>
+ <cd:command name='outermarginwidth' value='outermarginwidth'/>
+ <cd:command name='packed' value='groupe'/>
+ <cd:command name='page' value='page'/>
+ <cd:command name='pagedepth' value='pagedepth'/>
+ <cd:command name='pagenumber' value='numeropage'/>
+ <cd:command name='pageoffset' value='pageoffset'/>
+ <cd:command name='pagereference' value='referencepage'/>
+ <cd:command name='pagetype' value='tapepage'/>
+ <cd:command name='paperheight' value='hauteurpapier'/>
+ <cd:command name='paperwidth' value='largeurpapier'/>
+ <cd:command name='periods' value='periodes'/>
+ <cd:command name='plaatsruwelijst' value='placerawlist'/>
+ <cd:command name='placebookmarks' value='placemarquespages'/>
+ <cd:command name='placecombinedlist' value='placelisteinmbriquee'/>
+ <cd:command name='placefloat' value='placeflottant'/>
+ <cd:command name='placefootnotes' value='placenotespdp'/>
+ <cd:command name='placeformula' value='placeformule'/>
+ <cd:command name='placeheadnumber' value='placenumerotete'/>
+ <cd:command name='placeheadtext' value='placetextetete'/>
+ <cd:command name='placelegend' value='placelegende'/>
+ <cd:command name='placelist' value='placeliste'/>
+ <cd:command name='placelocalfootnotes' value='placenotespdplocales'/>
+ <cd:command name='placelogos' value='placelogos'/>
+ <cd:command name='placeongrid' value='placesurgrille'/>
+ <cd:command name='placeontopofeachother' value='placelesunsaudessusdesautres'/>
+ <cd:command name='placepagenumber' value='placenumeropage'/>
+ <cd:command name='placereferencelist' value='placelistereference'/>
+ <cd:command name='placeregister' value='placeregistre'/>
+ <cd:command name='placerule' value='placeregle'/>
+ <cd:command name='placesidebyside' value='placecoteacote'/>
+ <cd:command name='placesubformula' value='placesousformule'/>
+ <cd:command name='placetextvariable' value='placevariabletexte'/>
+ <cd:command name='position' value='position'/>
+ <cd:command name='positiontext' value='positionnetexte'/>
+ <cd:command name='printpaperheight' value='hauteureditionpapier'/>
+ <cd:command name='printpaperwidth' value='largeureditionpapier'/>
+ <cd:command name='processblocks' value='traiteblocs'/>
+ <cd:command name='processpage' value='traitepage'/>
+ <cd:command name='product' value='produit'/>
+ <cd:command name='program' value='programme'/>
+ <cd:command name='project' value='projet'/>
+ <cd:command name='publication' value='publication'/>
+ <cd:command name='quotation' value='citation'/>
+ <cd:command name='quote' value='citer'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='refait'/>
+ <cd:command name='ref' value='ref'/>
+ <cd:command name='reference' value='reference'/>
+ <cd:command name='referral' value='recommandation'/>
+ <cd:command name='referraldate' value='daterecommandation'/>
+ <cd:command name='referring' value='faitreference'/>
+ <cd:command name='remark' value='commentaire'/>
+ <cd:command name='reset' value='raz'/>
+ <cd:command name='resetmarking' value='razmarquage'/>
+ <cd:command name='resetnumber' value='raznumero'/>
+ <cd:command name='resettext' value='resettextcontent'/>
+ <cd:command name='rightaligned' value='aligneadroite'/>
+ <cd:command name='rightedgedistance' value='distanceborddroit'/>
+ <cd:command name='rightedgewidth' value='largeurborddroit'/>
+ <cd:command name='rightmargindistance' value='distancemargedroite'/>
+ <cd:command name='rightmarginwidth' value='largeurmargedroite'/>
+ <cd:command name='romannumerals' value='chiffresromains'/>
+ <cd:command name='rotate' value='oriente'/>
+ <cd:command name='scale' value='echelle'/>
+ <cd:command name='screen' value='ecran'/>
+ <cd:command name='selectblocks' value='selectionneblocs'/>
+ <cd:command name='selectpaper' value='selectionnepapier'/>
+ <cd:command name='selectversion' value='selectionneversion'/>
+ <cd:command name='setnumber' value='affectenumero'/>
+ <cd:command name='settextcontent' value='settext'/>
+ <cd:command name='settextvariable' value='affectevariabletexte'/>
+ <cd:command name='setupalign' value='reglealignement'/>
+ <cd:command name='setupanswerarea' value='setupanswerarea'/>
+ <cd:command name='setuparranging' value='reglearrangement'/>
+ <cd:command name='setupbackground' value='reglearriereplan'/>
+ <cd:command name='setupbackgrounds' value='reglearriereplans'/>
+ <cd:command name='setupblackrules' value='reglelignesnoires'/>
+ <cd:command name='setupblank' value='definitvide'/>
+ <cd:command name='setupblock' value='reglebloc'/>
+ <cd:command name='setupbodyfont' value='reglepolicecorps'/>
+ <cd:command name='setupbodyfontenvironment' value='regleenvironnementpolicecorps'/>
+ <cd:command name='setupbottom' value='regleinf'/>
+ <cd:command name='setupbottomtexts' value='regletextesinf'/>
+ <cd:command name='setupbuffer' value='reglebuffer'/>
+ <cd:command name='setupbuttons' value='regleboutons'/>
+ <cd:command name='setupcapitals' value='reglecapitales'/>
+ <cd:command name='setupcaption' value='regleintitule'/>
+ <cd:command name='setupcaptions' value='regleintitules'/>
+ <cd:command name='setupclipping' value='regleclipping'/>
+ <cd:command name='setupcolor' value='reglecouleur'/>
+ <cd:command name='setupcolors' value='reglecouleurs'/>
+ <cd:command name='setupcolumns' value='reglecolonnes'/>
+ <cd:command name='setupcolumnset' value='reglejeucolonne'/>
+ <cd:command name='setupcolumnsetlines' value='setupcolumnsetlines'/>
+ <cd:command name='setupcolumnsetstart' value='setupcolumnsetstart'/>
+ <cd:command name='setupcombinations' value='reglecombinaisons'/>
+ <cd:command name='setupcombinedlist' value='reglelisteimbriquee'/>
+ <cd:command name='setupcomment' value='reglecommentaire'/>
+ <cd:command name='setupdescriptions' value='regledescriptions'/>
+ <cd:command name='setupenumerations' value='regleenumerations'/>
+ <cd:command name='setupexternalfigures' value='reglefiguresexternes'/>
+ <cd:command name='setupfield' value='reglechamp'/>
+ <cd:command name='setupfields' value='reglechamps'/>
+ <cd:command name='setupfillinlines' value='regleremplitligne'/>
+ <cd:command name='setupfillinrules' value='regleremplitlignesreglees'/>
+ <cd:command name='setupfloat' value='regleflottant'/>
+ <cd:command name='setupfloats' value='regleflottants'/>
+ <cd:command name='setupfloatsplitting' value='regleseparationflottant'/>
+ <cd:command name='setupfooter' value='reglepdp'/>
+ <cd:command name='setupfootertexts' value='regletextespdp'/>
+ <cd:command name='setupfootnotedefinition' value='definitnotepdp'/>
+ <cd:command name='setupfootnotes' value='reglenotepdp'/>
+ <cd:command name='setupforms' value='regleformulaires'/>
+ <cd:command name='setupformulas' value='regleformules'/>
+ <cd:command name='setupframed' value='regleencadre'/>
+ <cd:command name='setupframedtexts' value='setupframedtexts'/>
+ <cd:command name='setuphead' value='regletete'/>
+ <cd:command name='setupheader' value='regleentete'/>
+ <cd:command name='setupheadertexts' value='regletextesentete'/>
+ <cd:command name='setupheadnumber' value='reglenumerotete'/>
+ <cd:command name='setupheads' value='regletetes'/>
+ <cd:command name='setupheadtext' value='regletextetete'/>
+ <cd:command name='setuphyphenmark' value='reglemarquagehyphenation'/>
+ <cd:command name='setupindentations' value='reglealineas'/>
+ <cd:command name='setupindenting' value='reglecomposeenalinea'/>
+ <cd:command name='setupinmargin' value='regledansmarge'/>
+ <cd:command name='setupinteraction' value='regleinteraction'/>
+ <cd:command name='setupinteractionbar' value='reglebarreinteraction'/>
+ <cd:command name='setupinteractionmenu' value='reglemenuinteraction'/>
+ <cd:command name='setupinteractionscreen' value='regleecraninteraction'/>
+ <cd:command name='setupinterlinespace' value='regleespacementinterligne'/>
+ <cd:command name='setupitemgroup' value='setupitemgroup'/>
+ <cd:command name='setupitemgroups' value='reglegroupeselements'/>
+ <cd:command name='setupitems' value='regleelements'/>
+ <cd:command name='setuplabeltext' value='reglelabeltexte'/>
+ <cd:command name='setuplanguage' value='reglelangue'/>
+ <cd:command name='setuplayout' value='regledisposition'/>
+ <cd:command name='setuplegend' value='reglelegende'/>
+ <cd:command name='setuplinenumbering' value='reglenumerotationligne'/>
+ <cd:command name='setuplines' value='reglelignes'/>
+ <cd:command name='setuplinewidth' value='regleepaisseurligne'/>
+ <cd:command name='setuplist' value='regleliste'/>
+ <cd:command name='setupmakeup' value='reglemakeup'/>
+ <cd:command name='setupmarginblocks' value='regleblocmarge'/>
+ <cd:command name='setupmarginrules' value='reglemargereglee'/>
+ <cd:command name='setupmarking' value='reglemarquage'/>
+ <cd:command name='setupmathalignment' value='setupmathalignment'/>
+ <cd:command name='setupnarrower' value='reglecompoetroite'/>
+ <cd:command name='setupnumber' value='reglenumero'/>
+ <cd:command name='setupnumbering' value='reglenumerotation'/>
+ <cd:command name='setupoppositeplacing' value='regleplacementopposition'/>
+ <cd:command name='setupoutput' value='reglesortie'/>
+ <cd:command name='setuppagecomment' value='reglecommentairepage'/>
+ <cd:command name='setuppagenumber' value='reglenumeropage'/>
+ <cd:command name='setuppagenumbering' value='reglenumerotationpage'/>
+ <cd:command name='setuppagetransitions' value='regletransitionspage'/>
+ <cd:command name='setuppalet' value='reglepalette'/>
+ <cd:command name='setuppaper' value='reglepapier'/>
+ <cd:command name='setuppapersize' value='regletaillepapier'/>
+ <cd:command name='setupparagraphnumbering' value='reglenumerotationparagraphe'/>
+ <cd:command name='setupparagraphs' value='regleparagraphes'/>
+ <cd:command name='setupplacement' value='setupplacement'/>
+ <cd:command name='setuppositioning' value='reglepositionnement'/>
+ <cd:command name='setupprofiles' value='regleprofils'/>
+ <cd:command name='setupprograms' value='regleprogrammes'/>
+ <cd:command name='setuppublications' value='reglepublications'/>
+ <cd:command name='setupquote' value='demarreciter'/>
+ <cd:command name='setupreferencelist' value='reglelistereference'/>
+ <cd:command name='setupreferencing' value='reglereferencage'/>
+ <cd:command name='setupregister' value='regleregistre'/>
+ <cd:command name='setuprotate' value='regleoriente'/>
+ <cd:command name='setuprule' value='regleregle'/>
+ <cd:command name='setups' value='reglages'/>
+ <cd:command name='setupscreens' value='regleecrans'/>
+ <cd:command name='setupsection' value='reglesection'/>
+ <cd:command name='setupsectionblock' value='regleblocsection'/>
+ <cd:command name='setupsorting' value='regletri'/>
+ <cd:command name='setupspacing' value='regleespacement'/>
+ <cd:command name='setupstartstop' value='regledemarrestoppe'/>
+ <cd:command name='setupstrut' value='reglestrut'/>
+ <cd:command name='setupsubpagenumber' value='reglesousnumeropage'/>
+ <cd:command name='setupsymbolset' value='reglejeusymboles'/>
+ <cd:command name='setupsynchronization' value='reglesynchronisation'/>
+ <cd:command name='setupsynchronizationbar' value='reglebarresynchronisation'/>
+ <cd:command name='setupsynonyms' value='reglesynonymes'/>
+ <cd:command name='setupsystem' value='reglesysteme'/>
+ <cd:command name='setuptab' value='regletab'/>
+ <cd:command name='setuptables' value='regletableaux'/>
+ <cd:command name='setuptabulate' value='regletabulation'/>
+ <cd:command name='setuptext' value='regletexte'/>
+ <cd:command name='setuptextposition' value='reglepositiontexte'/>
+ <cd:command name='setuptextrules' value='reglelignesreglestexte'/>
+ <cd:command name='setuptexttexts' value='regletextestexte'/>
+ <cd:command name='setuptextvariable' value='reglevariabletexte'/>
+ <cd:command name='setupthinrules' value='regletraitsfins'/>
+ <cd:command name='setuptolerance' value='regletolerance'/>
+ <cd:command name='setuptop' value='reglesup'/>
+ <cd:command name='setuptoptexts' value='regletextessup'/>
+ <cd:command name='setuptype' value='regletype'/>
+ <cd:command name='setuptyping' value='regledactylo'/>
+ <cd:command name='setupunderbar' value='reglesouslignage'/>
+ <cd:command name='setupurl' value='regleurl'/>
+ <cd:command name='setupversions' value='regleversions'/>
+ <cd:command name='setupwhitespace' value='regleespaceblanc'/>
+ <cd:command name='showbodyfont' value='montrepolicecorps'/>
+ <cd:command name='showbodyfontenvironment' value='montreenvironnementpolicecorps'/>
+ <cd:command name='showcolor' value='montrecouleur'/>
+ <cd:command name='showcolorgroup' value='montregroupecouleur'/>
+ <cd:command name='showexternalfigures' value='montrefiguresexternes'/>
+ <cd:command name='showfields' value='montrechamps'/>
+ <cd:command name='showframe' value='montrecadre'/>
+ <cd:command name='showgrid' value='montregrille'/>
+ <cd:command name='showlayout' value='montredisposition'/>
+ <cd:command name='showmakeup' value='montremakeup'/>
+ <cd:command name='showpalet' value='montrepalette'/>
+ <cd:command name='showprint' value='montreedition'/>
+ <cd:command name='showsetups' value='montrereglages'/>
+ <cd:command name='showstruts' value='montrestruts'/>
+ <cd:command name='showsymbolset' value='montrejeusymboles'/>
+ <cd:command name='smallcapped' value='cap'/>
+ <cd:command name='someline' value='uneligne'/>
+ <cd:command name='somewhere' value='qqpart'/>
+ <cd:command name='space' value='espace'/>
+ <cd:command name='splitfloat' value='separeflottant'/>
+ <cd:command name='startalignment' value='demarrealignement'/>
+ <cd:command name='startbackground' value='demarrearriereplan'/>
+ <cd:command name='startcoding' value='demarrecodage'/>
+ <cd:command name='startcolor' value='demarrecouleur'/>
+ <cd:command name='startcolumnmakeup' value='startcolumnmakeup'/>
+ <cd:command name='startcolumns' value='demarrecolonnes'/>
+ <cd:command name='startcolumnset' value='demarrejeucolonne'/>
+ <cd:command name='startcombination' value='demarrecombinaison'/>
+ <cd:command name='startcomponent' value='demarrecomposant'/>
+ <cd:command name='startdocument' value='demarredocument'/>
+ <cd:command name='startenvironment' value='demarreenvironement'/>
+ <cd:command name='startfigure' value='demarrefigure'/>
+ <cd:command name='startglobal' value='demarreglobal'/>
+ <cd:command name='startline' value='demarreligne'/>
+ <cd:command name='startlinecorrection' value='demarrecorrectionligne'/>
+ <cd:command name='startlinenumbering' value='demarrenumerotationligne'/>
+ <cd:command name='startlines' value='demarrelignes'/>
+ <cd:command name='startlocal' value='demarrelocal'/>
+ <cd:command name='startlocalfootnotes' value='demarrenotespdplocales'/>
+ <cd:command name='startmakeup' value='demarremakeup'/>
+ <cd:command name='startmarginblock' value='demarreblocmarge'/>
+ <cd:command name='startmarginrule' value='demarremargereglee'/>
+ <cd:command name='startnarrower' value='demarrecompoetroite'/>
+ <cd:command name='startopposite' value='demarreopposition'/>
+ <cd:command name='startoverlay' value='demarrerevetement'/>
+ <cd:command name='startoverzicht' value='demarrevuedensemble'/>
+ <cd:command name='startpacked' value='demarregroupe'/>
+ <cd:command name='startpositioning' value='demarrepositionnement'/>
+ <cd:command name='startproduct' value='demarreproduit'/>
+ <cd:command name='startprofile' value='demarreprofil'/>
+ <cd:command name='startproject' value='demarreprojet'/>
+ <cd:command name='startquotation' value='demarrecitation'/>
+ <cd:command name='startraster' value='demarreraster'/>
+ <cd:command name='startsymbolset' value='demarrejeusymboles'/>
+ <cd:command name='startsynchronization' value='demarresynchronisation'/>
+ <cd:command name='starttable' value='demarretableau'/>
+ <cd:command name='starttables' value='demarretableaux'/>
+ <cd:command name='starttext' value='demarretexte'/>
+ <cd:command name='starttextrule' value='demarreligneregleetexte'/>
+ <cd:command name='startunpacked' value='demarredegroupe'/>
+ <cd:command name='startversion' value='demarreversion'/>
+ <cd:command name='stopalignment' value='stoppealignement'/>
+ <cd:command name='stopbackground' value='stoppearriereplan'/>
+ <cd:command name='stopcoding' value='stoppecodage'/>
+ <cd:command name='stopcolor' value='stoppecouleur'/>
+ <cd:command name='stopcolumnmakeup' value='stopcolumnmakeup'/>
+ <cd:command name='stopcolumns' value='stoppecolonnes'/>
+ <cd:command name='stopcolumnset' value='stoppejeucolonne'/>
+ <cd:command name='stopcombination' value='stoppecombinaison'/>
+ <cd:command name='stopcomponent' value='stoppecomposant'/>
+ <cd:command name='stopdocument' value='stoppedocument'/>
+ <cd:command name='stopenvironment' value='stoppeenvironement'/>
+ <cd:command name='stopglobal' value='stoppeglobal'/>
+ <cd:command name='stopline' value='stoppeligne'/>
+ <cd:command name='stoplinecorrection' value='stoppecorrectionligne'/>
+ <cd:command name='stoplinenumbering' value='stoppenumerotationligne'/>
+ <cd:command name='stoplines' value='stoppelignes'/>
+ <cd:command name='stoplocal' value='stoppelocal'/>
+ <cd:command name='stoplocalfootnotes' value='stoppenotespdplocales'/>
+ <cd:command name='stopmakeup' value='stoppemakeup'/>
+ <cd:command name='stopmarginblock' value='stoppeblocmarge'/>
+ <cd:command name='stopmarginrule' value='stoppemargereglee'/>
+ <cd:command name='stopnarrower' value='stopcompoetroite'/>
+ <cd:command name='stopopposite' value='stoppeopposition'/>
+ <cd:command name='stopoverlay' value='stopperevetement'/>
+ <cd:command name='stopoverzicht' value='stoppevuedensemble'/>
+ <cd:command name='stoppacked' value='stoppegroupe'/>
+ <cd:command name='stoppositioning' value='stoppepositionnement'/>
+ <cd:command name='stopproduct' value='stoppeproduit'/>
+ <cd:command name='stopprofile' value='stoppeprofil'/>
+ <cd:command name='stopproject' value='stoppeprojet'/>
+ <cd:command name='stopquotation' value='stoppecitation'/>
+ <cd:command name='stopraster' value='stopperaster'/>
+ <cd:command name='stopsynchronization' value='stoppesynchronisation'/>
+ <cd:command name='stoptable' value='stoppetableau'/>
+ <cd:command name='stoptables' value='stoppetableaux'/>
+ <cd:command name='stoptext' value='stoppetexte'/>
+ <cd:command name='stoptextrule' value='stoppeligneregleetexte'/>
+ <cd:command name='stopunpacked' value='stoppedegroupe'/>
+ <cd:command name='stopversion' value='stoppeversion'/>
+ <cd:command name='stretched' value='etire'/>
+ <cd:command name='subformulanumber' value='numerosousformule'/>
+ <cd:command name='subpagenumber' value='sousnumeropage'/>
+ <cd:command name='switchtobodyfont' value='changepolicecorps'/>
+ <cd:command name='switchtorawfont' value='changepolicebrute'/>
+ <cd:command name='sym' value='sym'/>
+ <cd:command name='symbol' value='symbole'/>
+ <cd:command name='synchronizationbar' value='barresynchronisation'/>
+ <cd:command name='synchronize' value='synchronise'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testcolumn'/>
+ <cd:command name='testpage' value='testpage'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='hauteurtexte'/>
+ <cd:command name='textreference' value='referencetexte'/>
+ <cd:command name='textrule' value='ligneregleetexte'/>
+ <cd:command name='textvariable' value='variabletexte'/>
+ <cd:command name='textwidth' value='largeurtexte'/>
+ <cd:command name='thinrule' value='traitfin'/>
+ <cd:command name='thinrules' value='traitsfins'/>
+ <cd:command name='tooltip' value='suggestion'/>
+ <cd:command name='topdistance' value='distancesup'/>
+ <cd:command name='topheight' value='hauteursup'/>
+ <cd:command name='topspace' value='espacesup'/>
+ <cd:command name='totalnumberofpages' value='nombretotaldepages'/>
+ <cd:command name='translate' value='traduire'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='typ'/>
+ <cd:command name='type' value='dactylographier'/>
+ <cd:command name='typebuffer' value='tapebuffer'/>
+ <cd:command name='typefile' value='fichierdactylo'/>
+ <cd:command name='unitmeaning' value='sensunite'/>
+ <cd:command name='unknown' value='inconnu'/>
+ <cd:command name='useJSscripts' value='utiliseJSscripts'/>
+ <cd:command name='useURL' value='utiliseURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='utiliseblocs'/>
+ <cd:command name='usecommands' value='utilisecommandes'/>
+ <cd:command name='useencoding' value='utiliseencodage'/>
+ <cd:command name='useexternaldocument' value='utilisedocumentexterne'/>
+ <cd:command name='useexternalfigure' value='utilisefigureexterne'/>
+ <cd:command name='useexternalfile' value='utilisefichierexterne'/>
+ <cd:command name='useexternalfiles' value='utilisefichiersexternes'/>
+ <cd:command name='useexternalsoundtrack' value='utilisepsiteaudioexterne'/>
+ <cd:command name='usemodule' value='utilisemodule'/>
+ <cd:command name='usemodules' value='utilisemodules'/>
+ <cd:command name='usepath' value='utilisechemin'/>
+ <cd:command name='usereferences' value='utilisereferences'/>
+ <cd:command name='usespecials' value='utilisespecialites'/>
+ <cd:command name='usesymbols' value='utilisesymboles'/>
+ <cd:command name='usetypescript' value='usetypescript'/>
+ <cd:command name='usetypescriptfile' value='usetypescriptfile'/>
+ <cd:command name='useurl' value='utiliseurl'/>
+ <cd:command name='version' value='version'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='joursemaine'/>
+ <cd:command name='whitespace' value='espaceblanc'/>
+ <cd:command name='wordright' value='motdroit'/>
+ <cd:command name='writebetweenlist' value='ecritentreliste'/>
+ <cd:command name='writetolist' value='ecritdansliste'/>
+ <cd:command name='writetoreferencelist' value='ecritdanslistereference'/>
+ <cd:command name='writetoregister' value='ecritregistre'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml
new file mode 100644
index 000000000..098aba899
--- /dev/null
+++ b/tex/context/interface/keys-it.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='it' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language it -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Aggiunta'/>
+ <cd:variable name='Balloon' value='Pallone'/>
+ <cd:variable name='Character' value='Lettera'/>
+ <cd:variable name='Characters' value='Lettere'/>
+ <cd:variable name='CloseDocument' value='ChiudiDocumento'/>
+ <cd:variable name='ExitViewer' value='EsciVisualizzatore'/>
+ <cd:variable name='FirstPage' value='PrimaPagina'/>
+ <cd:variable name='FitHeight' value='FitHeight'/>
+ <cd:variable name='FitWidth' value='FitWidth'/>
+ <cd:variable name='GotoPage' value='VaiAPagina'/>
+ <cd:variable name='Greek' value='Greco'/>
+ <cd:variable name='Help' value='Aiuto'/>
+ <cd:variable name='HideField' value='NascondiCampo'/>
+ <cd:variable name='HideLayer' value='HideLayer'/>
+ <cd:variable name='Key' value='Tasto'/>
+ <cd:variable name='LastPage' value='UltimaPagina'/>
+ <cd:variable name='LoadForm' value='CaricaForm'/>
+ <cd:variable name='MONTH' value='MESE'/>
+ <cd:variable name='New' value='Nuovo'/>
+ <cd:variable name='NextJump' value='SaltoSuccessivo'/>
+ <cd:variable name='NextPage' value='PaginaSuccessiva'/>
+ <cd:variable name='Numbers' value='Numeri'/>
+ <cd:variable name='OpenNamedDocument' value='OpenNamedDocument'/>
+ <cd:variable name='Paragraph' value='Capoverso'/>
+ <cd:variable name='PauseMovie' value='PausaFilm'/>
+ <cd:variable name='PauseRendering' value='PauseRendering'/>
+ <cd:variable name='PauseSound' value='PausaSuono'/>
+ <cd:variable name='PreviousJump' value='SaltoPrecedente'/>
+ <cd:variable name='PreviousPage' value='PaginaPrecedente'/>
+ <cd:variable name='PrintDocument' value='StampaDocumento'/>
+ <cd:variable name='Query' value='Richiesta'/>
+ <cd:variable name='QueryAgain' value='RinnovaRichiesta'/>
+ <cd:variable name='ResetForm' value='ReimpostaForm'/>
+ <cd:variable name='ResumeMovie' value='RiprendiFilm'/>
+ <cd:variable name='ResumeRendering' value='ResumeRendering'/>
+ <cd:variable name='ResumeSound' value='RiprendiSuono'/>
+ <cd:variable name='Romannumerals' value='Numeriromani'/>
+ <cd:variable name='SaveDocument' value='SalvaDocumento'/>
+ <cd:variable name='SaveForm' value='SalvaForm'/>
+ <cd:variable name='SaveNamedDocument' value='SaveNamedDocument'/>
+ <cd:variable name='SearchAgain' value='CercaAncora'/>
+ <cd:variable name='SearchDocument' value='CercaDocumento'/>
+ <cd:variable name='ShowBookmarks' value='MostraSegnalibro'/>
+ <cd:variable name='ShowField' value='MostraCampo'/>
+ <cd:variable name='ShowThumbs' value='MostraThumbs'/>
+ <cd:variable name='StartMovie' value='IniziaFilm'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='IniziaSuono'/>
+ <cd:variable name='StopMovie' value='FermaFilm'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='FermaSuono'/>
+ <cd:variable name='SubmitForm' value='MandaForm'/>
+ <cd:variable name='ToggleLayer' value='ToggleLayer'/>
+ <cd:variable name='ToggleViewer' value='ScambiaVisualizzatore'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='AiutoVisualizzatore'/>
+ <cd:variable name='WEEKDAY' value='GIORNOSETTIMANA'/>
+ <cd:variable name='WORD' value='PAROLA'/>
+ <cd:variable name='abbreviation' value='abbreviazione'/>
+ <cd:variable name='abbreviations' value='abbreviazioni'/>
+ <cd:variable name='absolute' value='assoluto'/>
+ <cd:variable name='action' value='azione'/>
+ <cd:variable name='after' value='dopo'/>
+ <cd:variable name='all' value='tutti'/>
+ <cd:variable name='always' value='sempre'/>
+ <cd:variable name='answerarea' value='answerarea'/>
+ <cd:variable name='appendices' value='appendici'/>
+ <cd:variable name='appendix' value='appendice'/>
+ <cd:variable name='april' value='aprile'/>
+ <cd:variable name='atmargin' value='almargine'/>
+ <cd:variable name='atpage' value='apagina'/>
+ <cd:variable name='august' value='agosto'/>
+ <cd:variable name='author' value='autore'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autointro'/>
+ <cd:variable name='back' value='dietro'/>
+ <cd:variable name='background' value='sfondo'/>
+ <cd:variable name='backmatter' value='postambolo'/>
+ <cd:variable name='backpart' value='postfazione'/>
+ <cd:variable name='backspace' value='backspace'/>
+ <cd:variable name='backward' value='indietro'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='prima'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='grande'/>
+ <cd:variable name='bigbodyfont' value='grossofontdeltesto'/>
+ <cd:variable name='bigpreference' value='grandepreferenza'/>
+ <cd:variable name='blank' value='rigovuoto'/>
+ <cd:variable name='blockquote' value='blockquote'/>
+ <cd:variable name='bodymatter' value='testiprincipali'/>
+ <cd:variable name='bodypart' value='testoprincipale'/>
+ <cd:variable name='bold' value='grassetto'/>
+ <cd:variable name='bolditalic' value='grassettocorsivo'/>
+ <cd:variable name='boldslanted' value='grassettoinclinato'/>
+ <cd:variable name='bookmark' value='segnalibro'/>
+ <cd:variable name='both' value='entrambi'/>
+ <cd:variable name='bottom' value='fondo'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='ampio'/>
+ <cd:variable name='buffer' value='buffer'/>
+ <cd:variable name='by' value='da'/>
+ <cd:variable name='calligraphic' value='calligrafico'/>
+ <cd:variable name='cap' value='cap'/>
+ <cd:variable name='capital' value='maiuscolo'/>
+ <cd:variable name='center' value='center'/>
+ <cd:variable name='chapter' value='capitolo'/>
+ <cd:variable name='character' value='lettera'/>
+ <cd:variable name='characters' value='lettere'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='colore'/>
+ <cd:variable name='column' value='colonna'/>
+ <cd:variable name='columns' value='colonne'/>
+ <cd:variable name='command' value='comando'/>
+ <cd:variable name='commands' value='comandi'/>
+ <cd:variable name='comment' value='commento'/>
+ <cd:variable name='component' value='componente'/>
+ <cd:variable name='concept' value='concetto'/>
+ <cd:variable name='content' value='indice'/>
+ <cd:variable name='contents' value='indici'/>
+ <cd:variable name='continue' value='continua'/>
+ <cd:variable name='controls' value='controlli'/>
+ <cd:variable name='conversion' value='coversione'/>
+ <cd:variable name='current' value='corrente'/>
+ <cd:variable name='cutspace' value='cutspace'/>
+ <cd:variable name='date' value='data'/>
+ <cd:variable name='day' value='giorno'/>
+ <cd:variable name='december' value='dicembre'/>
+ <cd:variable name='default' value='implicito'/>
+ <cd:variable name='depth' value='profondita'/>
+ <cd:variable name='description' value='descrizione'/>
+ <cd:variable name='disable' value='disattiva'/>
+ <cd:variable name='display' value='schermo'/>
+ <cd:variable name='dot' value='punto'/>
+ <cd:variable name='doublesided' value='doppiafaccia'/>
+ <cd:variable name='down' value='down'/>
+ <cd:variable name='each' value='ogni'/>
+ <cd:variable name='edge' value='bordo'/>
+ <cd:variable name='empty' value='vuoto'/>
+ <cd:variable name='end' value='end'/>
+ <cd:variable name='endnote' value='endnote'/>
+ <cd:variable name='enumeration' value='enumerazione'/>
+ <cd:variable name='environment' value='ambiente'/>
+ <cd:variable name='even' value='pari'/>
+ <cd:variable name='external' value='esterno'/>
+ <cd:variable name='fact' value='fatto'/>
+ <cd:variable name='february' value='febbraio'/>
+ <cd:variable name='figure' value='figura'/>
+ <cd:variable name='figures' value='figure'/>
+ <cd:variable name='file' value='file'/>
+ <cd:variable name='final' value='finale'/>
+ <cd:variable name='first' value='primo'/>
+ <cd:variable name='firstcolumn' value='firstcolumn'/>
+ <cd:variable name='firstpage' value='primapagina'/>
+ <cd:variable name='firstsubpage' value='primasottopagina'/>
+ <cd:variable name='fit' value='adatta'/>
+ <cd:variable name='five' value='cinque'/>
+ <cd:variable name='fix' value='fisso'/>
+ <cd:variable name='fixed' value='fisso'/>
+ <cd:variable name='flexible' value='flessibile'/>
+ <cd:variable name='float' value='oggettomobile'/>
+ <cd:variable name='flushinner' value='flushinner'/>
+ <cd:variable name='flushleft' value='flushleft'/>
+ <cd:variable name='flushouter' value='flushouter'/>
+ <cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='footer' value='piedipagina'/>
+ <cd:variable name='footnote' value='notapdp'/>
+ <cd:variable name='force' value='forza'/>
+ <cd:variable name='foreground' value='foreground'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='formula'/>
+ <cd:variable name='formulae' value='formule'/>
+ <cd:variable name='forward' value='avanti'/>
+ <cd:variable name='four' value='quattro'/>
+ <cd:variable name='frame' value='cornice'/>
+ <cd:variable name='framedtext' value='testoincorniciato'/>
+ <cd:variable name='friday' value='venerdi'/>
+ <cd:variable name='frontmatter' value='preambolo'/>
+ <cd:variable name='frontpart' value='prefazione'/>
+ <cd:variable name='global' value='globale'/>
+ <cd:variable name='graphic' value='grafico'/>
+ <cd:variable name='graphics' value='grafici'/>
+ <cd:variable name='gray' value='grigio'/>
+ <cd:variable name='greek' value='greco'/>
+ <cd:variable name='grid' value='griglia'/>
+ <cd:variable name='halfline' value='mezzariga'/>
+ <cd:variable name='handwritten' value='grafiamanuale'/>
+ <cd:variable name='hang' value='sospendi'/>
+ <cd:variable name='hanging' value='sospeso'/>
+ <cd:variable name='head' value='testa'/>
+ <cd:variable name='header' value='intestazione'/>
+ <cd:variable name='height' value='altezza'/>
+ <cd:variable name='helptext' value='testoaiuto'/>
+ <cd:variable name='hencefore' value='precedente'/>
+ <cd:variable name='here' value='qui'/>
+ <cd:variable name='hereafter' value='seguente'/>
+ <cd:variable name='hidden' value='nascosto'/>
+ <cd:variable name='hiding' value='nascondere'/>
+ <cd:variable name='high' value='alto'/>
+ <cd:variable name='horizontal' value='orizzontale'/>
+ <cd:variable name='hyphenated' value='sillabato'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='tra'/>
+ <cd:variable name='index' value='indiceanalitico'/>
+ <cd:variable name='indices' value='indicianalitici'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='inherit'/>
+ <cd:variable name='inleft' value='insinistra'/>
+ <cd:variable name='inmargin' value='inmargine'/>
+ <cd:variable name='inner' value='interno'/>
+ <cd:variable name='inneredge' value='bordointerno'/>
+ <cd:variable name='innermargin' value='margineinterno'/>
+ <cd:variable name='inright' value='indestra'/>
+ <cd:variable name='interaction' value='interazione'/>
+ <cd:variable name='interactionmenu' value='menuinterattivo'/>
+ <cd:variable name='intermezzi' value='intermezzi'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='intesto'/>
+ <cd:variable name='intro' value='intro'/>
+ <cd:variable name='italic' value='corsivo'/>
+ <cd:variable name='italicbold' value='corsivograssetto'/>
+ <cd:variable name='item' value='elemento'/>
+ <cd:variable name='itemize' value='elenco'/>
+ <cd:variable name='its' value='its'/>
+ <cd:variable name='january' value='gennaio'/>
+ <cd:variable name='joinedup' value='unito'/>
+ <cd:variable name='july' value='luglio'/>
+ <cd:variable name='june' value='giugno'/>
+ <cd:variable name='keep' value='mantieni'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='etichetta'/>
+ <cd:variable name='landscape' value='orizzontale'/>
+ <cd:variable name='last' value='ultimo'/>
+ <cd:variable name='lastcolumn' value='lastcolumn'/>
+ <cd:variable name='lastpage' value='ultimapagina'/>
+ <cd:variable name='lastpagenumber' value='lastpagenumber'/>
+ <cd:variable name='lastsubpage' value='ultimasottopagina'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='sinistra'/>
+ <cd:variable name='leftedge' value='bordosinistro'/>
+ <cd:variable name='lefthanging' value='lefthanging'/>
+ <cd:variable name='leftmargin' value='marginesinistro'/>
+ <cd:variable name='leftpage' value='paginasinistra'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='legenda'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='riga'/>
+ <cd:variable name='linenote' value='linenote'/>
+ <cd:variable name='lines' value='righe'/>
+ <cd:variable name='list' value='elenco'/>
+ <cd:variable name='local' value='locale'/>
+ <cd:variable name='localenvironment' value='ambientelocale'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='loghi'/>
+ <cd:variable name='lohi' value='pedap'/>
+ <cd:variable name='loose' value='lento'/>
+ <cd:variable name='low' value='basso'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='makeup'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='marzo'/>
+ <cd:variable name='margin' value='margine'/>
+ <cd:variable name='marginedge' value='bordomargine'/>
+ <cd:variable name='margintitle' value='titoloinmargine'/>
+ <cd:variable name='marking' value='marcatura'/>
+ <cd:variable name='mathalignment' value='mathalignment'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='mathmatrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='maggio'/>
+ <cd:variable name='mediaeval' value='medievale'/>
+ <cd:variable name='medium' value='medio'/>
+ <cd:variable name='middle' value='centro'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='altezzamin'/>
+ <cd:variable name='minwidth' value='ampiezzamin'/>
+ <cd:variable name='mirrored' value='riflesso'/>
+ <cd:variable name='monday' value='lunedi'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='mese'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='nome'/>
+ <cd:variable name='narrow' value='stretto'/>
+ <cd:variable name='negative' value='negativo'/>
+ <cd:variable name='never' value='mai'/>
+ <cd:variable name='new' value='nuovo'/>
+ <cd:variable name='next' value='successivo'/>
+ <cd:variable name='nextevenpage' value='paginaparisuccessiva'/>
+ <cd:variable name='nextoddpage' value='paginadisparisuccessiva'/>
+ <cd:variable name='nextpage' value='paginasuccessiva'/>
+ <cd:variable name='nextsubpage' value='sottopaginasuccessiva'/>
+ <cd:variable name='no' value='no'/>
+ <cd:variable name='nocheck' value='nocheck'/>
+ <cd:variable name='nofit' value='nofit'/>
+ <cd:variable name='nogrid' value='nogrid'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='nomarcature'/>
+ <cd:variable name='none' value='nessuno'/>
+ <cd:variable name='nonumber' value='nonumber'/>
+ <cd:variable name='normal' value='normale'/>
+ <cd:variable name='nospacing' value='nospacing'/>
+ <cd:variable name='not' value='non'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='nonsospeso'/>
+ <cd:variable name='nothyphenated' value='nonsillabato'/>
+ <cd:variable name='november' value='novembre'/>
+ <cd:variable name='nowhere' value='danessunaparte'/>
+ <cd:variable name='nowhite' value='nobianco'/>
+ <cd:variable name='number' value='numero'/>
+ <cd:variable name='numbers' value='numeri'/>
+ <cd:variable name='october' value='ottobre'/>
+ <cd:variable name='odd' value='dispari'/>
+ <cd:variable name='off' value='disattivo'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='old'/>
+ <cd:variable name='on' value='attivo'/>
+ <cd:variable name='one' value='uno'/>
+ <cd:variable name='opposite' value='opposto'/>
+ <cd:variable name='outer' value='esterno'/>
+ <cd:variable name='outeredge' value='bordoesterno'/>
+ <cd:variable name='outermargin' value='margineesterno'/>
+ <cd:variable name='overbar' value='sopralinea'/>
+ <cd:variable name='overbars' value='sopralinee'/>
+ <cd:variable name='overlay' value='sovrapponi'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='sbarrato'/>
+ <cd:variable name='overstrikes' value='sbarrati'/>
+ <cd:variable name='packed' value='impaccato'/>
+ <cd:variable name='page' value='pagina'/>
+ <cd:variable name='pagecomment' value='commentopagina'/>
+ <cd:variable name='pagenumber' value='numeropagina'/>
+ <cd:variable name='paper' value='carta'/>
+ <cd:variable name='paragraph' value='capoverso'/>
+ <cd:variable name='part' value='parte'/>
+ <cd:variable name='positive' value='positivo'/>
+ <cd:variable name='postponing' value='posporre'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='preferenza'/>
+ <cd:variable name='preview' value='anteprima'/>
+ <cd:variable name='previous' value='precedente'/>
+ <cd:variable name='previousevenpage' value='paginapariprecedente'/>
+ <cd:variable name='previousoddpage' value='paginadispariprecedente'/>
+ <cd:variable name='previouspage' value='paginaprecedente'/>
+ <cd:variable name='previoussubpage' value='sottopaginaprecedente'/>
+ <cd:variable name='printable' value='stampabile'/>
+ <cd:variable name='process' value='process'/>
+ <cd:variable name='product' value='prodotto'/>
+ <cd:variable name='program' value='programma'/>
+ <cd:variable name='project' value='progetto'/>
+ <cd:variable name='protected' value='protetto'/>
+ <cd:variable name='quadruple' value='quadruplo'/>
+ <cd:variable name='quotation' value='citazione'/>
+ <cd:variable name='quote' value='menzione'/>
+ <cd:variable name='ran' value='corse'/>
+ <cd:variable name='random' value='casuale'/>
+ <cd:variable name='readonly' value='solalettura'/>
+ <cd:variable name='rectangular' value='rettangolare'/>
+ <cd:variable name='referral' value='referral'/>
+ <cd:variable name='register' value='registro'/>
+ <cd:variable name='regular' value='regolare'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relativo'/>
+ <cd:variable name='repeat' value='ripeti'/>
+ <cd:variable name='required' value='richiestp'/>
+ <cd:variable name='reset' value='reimposta'/>
+ <cd:variable name='reverse' value='invertito'/>
+ <cd:variable name='right' value='destra'/>
+ <cd:variable name='rightedge' value='bordodestro'/>
+ <cd:variable name='righthanging' value='righthanging'/>
+ <cd:variable name='rightmargin' value='marginedestro'/>
+ <cd:variable name='rightpage' value='paginadestra'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='roman'/>
+ <cd:variable name='romannumerals' value='numeriromani'/>
+ <cd:variable name='rotate' value='ruota'/>
+ <cd:variable name='rotated' value='ruotato'/>
+ <cd:variable name='round' value='rotondo'/>
+ <cd:variable name='row' value='row'/>
+ <cd:variable name='rule' value='linea'/>
+ <cd:variable name='samepage' value='stessapagina'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sansgrassetto'/>
+ <cd:variable name='sansserif' value='sansserif'/>
+ <cd:variable name='saturday' value='sabato'/>
+ <cd:variable name='screen' value='schermo'/>
+ <cd:variable name='section' value='capoverso'/>
+ <cd:variable name='sectionblockenvironment' value='ambientebloccosezione'/>
+ <cd:variable name='sectionnumber' value='numerosezione'/>
+ <cd:variable name='see' value='vedi'/>
+ <cd:variable name='september' value='settembre'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='vicino'/>
+ <cd:variable name='setups' value='nastaveni'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='short' value='short'/>
+ <cd:variable name='singlesided' value='facciasingola'/>
+ <cd:variable name='slanted' value='inclinato'/>
+ <cd:variable name='slantedbold' value='inclinatograssetto'/>
+ <cd:variable name='small' value='piccolo'/>
+ <cd:variable name='smallbodyfont' value='piccolofontdelcorpo'/>
+ <cd:variable name='smallbold' value='piccolograssetto'/>
+ <cd:variable name='smallbolditalic' value='piccolograssettocorsivo'/>
+ <cd:variable name='smallboldslanted' value='piccolograssettoinclinato'/>
+ <cd:variable name='smallcaps' value='maiuscoletto'/>
+ <cd:variable name='smallitalic' value='piccolocorsivo'/>
+ <cd:variable name='smallitalicbold' value='piccolocorsivograssetto'/>
+ <cd:variable name='smallnormal' value='piccolonormale'/>
+ <cd:variable name='smallslanted' value='piccoloinclinato'/>
+ <cd:variable name='smallslantedbold' value='piccoloinclinatograssetto'/>
+ <cd:variable name='smalltype' value='piccolotype'/>
+ <cd:variable name='somewhere' value='daqualcheparte'/>
+ <cd:variable name='sorted' value='ordinato'/>
+ <cd:variable name='space' value='spazio'/>
+ <cd:variable name='spacing' value='spaziatura'/>
+ <cd:variable name='speech' value='speech'/>
+ <cd:variable name='split' value='separa'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standard'/>
+ <cd:variable name='start' value='inizia'/>
+ <cd:variable name='starter' value='starter'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='termina'/>
+ <cd:variable name='stopper' value='stopper'/>
+ <cd:variable name='stretch' value='dilata'/>
+ <cd:variable name='strict' value='rigido'/>
+ <cd:variable name='strong' value='strong'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='sotto'/>
+ <cd:variable name='subbackward' value='sottoindietro'/>
+ <cd:variable name='subformula' value='subformula'/>
+ <cd:variable name='subforward' value='sottoavanti'/>
+ <cd:variable name='subject' value='argomento'/>
+ <cd:variable name='subpage' value='sottopagina'/>
+ <cd:variable name='subsection' value='sottocapoverso'/>
+ <cd:variable name='subsubject' value='sottoargomento'/>
+ <cd:variable name='subsubsection' value='sottosottocapoverso'/>
+ <cd:variable name='subsubsubject' value='sottosottoargomento'/>
+ <cd:variable name='subsubsubsection' value='sottosottosottocapoverso'/>
+ <cd:variable name='subsubsubsubject' value='sottosottosottoargomento'/>
+ <cd:variable name='subsubsubsubsection' value='sottosottosottosottocapoverso'/>
+ <cd:variable name='subsubsubsubsubject' value='sottosottosottosottoargomento'/>
+ <cd:variable name='subsubsubsubsubsection' value='sottosottosottosottosottocapoverso'/>
+ <cd:variable name='subsubsubsubsubsubject' value='sottosottosottosottosottoargomento'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='sottosottosottosottosottosottocapoverso'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='sottosottosottosottosottosottoargomento'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='sottosottosottosottosottosottosottocapoverso'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='sottosottosottosottosottosottosottoargomento'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='sottosottosottosottosottosottosottosottocapoverso'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='sottosottosottosottosottosottosottosottoargomento'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='sottosottosottosottosottosottosottosottosottocapoverso'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='sottosottosottosottosottosottosottosottosottoargomento'/>
+ <cd:variable name='sunday' value='domenica'/>
+ <cd:variable name='support' value='supporto'/>
+ <cd:variable name='sym' value='sim'/>
+ <cd:variable name='symbol' value='simbolo'/>
+ <cd:variable name='synchronize' value='synchronize'/>
+ <cd:variable name='system' value='sistema'/>
+ <cd:variable name='table' value='tabella'/>
+ <cd:variable name='tablehead' value='testatabella'/>
+ <cd:variable name='tables' value='tabelle'/>
+ <cd:variable name='tabletail' value='codatabella'/>
+ <cd:variable name='tabulate' value='tabulato'/>
+ <cd:variable name='tabulatehead' value='testatabulato'/>
+ <cd:variable name='tabulatetail' value='codatabulato'/>
+ <cd:variable name='tall' value='alto'/>
+ <cd:variable name='teletype' value='teletype'/>
+ <cd:variable name='temporary' value='temporaneo'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='testo'/>
+ <cd:variable name='three' value='tre'/>
+ <cd:variable name='thursday' value='giovedi'/>
+ <cd:variable name='title' value='titolo'/>
+ <cd:variable name='toggle' value='toggle'/>
+ <cd:variable name='tolerant' value='tollerante'/>
+ <cd:variable name='top' value='cima'/>
+ <cd:variable name='tuesday' value='martedi'/>
+ <cd:variable name='two' value='due'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='type'/>
+ <cd:variable name='typing' value='typing'/>
+ <cd:variable name='unavailable' value='nondisponibile'/>
+ <cd:variable name='underbar' value='sottolinea'/>
+ <cd:variable name='underbars' value='sottolinee'/>
+ <cd:variable name='unit' value='unita'/>
+ <cd:variable name='units' value='unita'/>
+ <cd:variable name='unknown' value='ignoto'/>
+ <cd:variable name='unpacked' value='unpacked'/>
+ <cd:variable name='up' value='up'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='usato'/>
+ <cd:variable name='value' value='valore'/>
+ <cd:variable name='vertical' value='verticale'/>
+ <cd:variable name='very' value='molto'/>
+ <cd:variable name='verystrict' value='moltorigido'/>
+ <cd:variable name='verytolerant' value='moltotollerante'/>
+ <cd:variable name='weak' value='weak'/>
+ <cd:variable name='wednesday' value='mercoledi'/>
+ <cd:variable name='week' value='settimana'/>
+ <cd:variable name='weekday' value='giornosettimana'/>
+ <cd:variable name='white' value='bianco'/>
+ <cd:variable name='wide' value='ampio'/>
+ <cd:variable name='width' value='ampiezza'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='anno'/>
+ <cd:variable name='yes' value='si'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language it -->
+
+ <cd:constants>
+ <cd:constant name='action' value='azione'/>
+ <cd:constant name='address' value='indirizzo'/>
+ <cd:constant name='after' value='dopo'/>
+ <cd:constant name='afterhead' value='dopotesta'/>
+ <cd:constant name='afterkey' value='dopotasto'/>
+ <cd:constant name='align' value='allinea'/>
+ <cd:constant name='aligncharacter' value='allineacarattere'/>
+ <cd:constant name='alignmentcharacter' value='carattereallineamento'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='allineatitolo'/>
+ <cd:constant name='alternative' value='alternativa'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='freccia'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='ad'/>
+ <cd:constant name='author' value='autore'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autofocus'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autoampiezza'/>
+ <cd:constant name='axis' value='asse'/>
+ <cd:constant name='background' value='sfondo'/>
+ <cd:constant name='backgroundcolor' value='coloresfondo'/>
+ <cd:constant name='backgroundcorner' value='angolosfondo'/>
+ <cd:constant name='backgrounddepth' value='profonditasfondo'/>
+ <cd:constant name='backgroundoffset' value='offsetsfondo'/>
+ <cd:constant name='backgroundradius' value='raggiosfondo'/>
+ <cd:constant name='backgroundscreen' value='schermosfondo'/>
+ <cd:constant name='backspace' value='backspace'/>
+ <cd:constant name='balance' value='bilanciamento'/>
+ <cd:constant name='before' value='prima'/>
+ <cd:constant name='beforehead' value='primaditesta'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='grande'/>
+ <cd:constant name='blank' value='rigovuoto'/>
+ <cd:constant name='blockway' value='blockway'/>
+ <cd:constant name='bodyfont' value='fonttesto'/>
+ <cd:constant name='bookmark' value='segnalibro'/>
+ <cd:constant name='bottom' value='fondo'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='distanzafondo'/>
+ <cd:constant name='bottomframe' value='cornicefondo'/>
+ <cd:constant name='bottomoffset' value='offsetfondo'/>
+ <cd:constant name='bottomspace' value='spaziofondo'/>
+ <cd:constant name='bottomstate' value='statofondo'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='calcola'/>
+ <cd:constant name='ccommand' value='ccomando'/>
+ <cd:constant name='click' value='click'/>
+ <cd:constant name='clickin' value='clickdentro'/>
+ <cd:constant name='clickout' value='clickfuori'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='azionechiudi'/>
+ <cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepageaction' value='azionechiudipagina'/>
+ <cd:constant name='closesymbol' value='closesymbol'/>
+ <cd:constant name='color' value='colore'/>
+ <cd:constant name='column' value='colonna'/>
+ <cd:constant name='columndistance' value='distanzacolonne'/>
+ <cd:constant name='columns' value='colonne'/>
+ <cd:constant name='command' value='comando'/>
+ <cd:constant name='commandafter' value='comdandodopo'/>
+ <cd:constant name='commandbefore' value='comandoprima'/>
+ <cd:constant name='commands' value='comandi'/>
+ <cd:constant name='component' value='component'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='compress'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='continua'/>
+ <cd:constant name='contrastcolor' value='colorecontrasto'/>
+ <cd:constant name='controls' value='controlli'/>
+ <cd:constant name='conversion' value='conversione'/>
+ <cd:constant name='convertfile' value='convertifile'/>
+ <cd:constant name='corner' value='angolo'/>
+ <cd:constant name='coupling' value='accoppiamento'/>
+ <cd:constant name='couplingway' value='modoaccoppiamento'/>
+ <cd:constant name='criterium' value='criterio'/>
+ <cd:constant name='current' value='corrente'/>
+ <cd:constant name='cutspace' value='cutspace'/>
+ <cd:constant name='dash' value='dash'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='data'/>
+ <cd:constant name='deepnumbercommand' value='deepnumbercommand'/>
+ <cd:constant name='deeptextcommand' value='deeptextcommand'/>
+ <cd:constant name='default' value='implicito'/>
+ <cd:constant name='delay' value='attesa'/>
+ <cd:constant name='depth' value='profondita'/>
+ <cd:constant name='depthcorrection' value='correzioneprofondita'/>
+ <cd:constant name='direction' value='direzione'/>
+ <cd:constant name='directory' value='directory'/>
+ <cd:constant name='display' value='display'/>
+ <cd:constant name='distance' value='distanza'/>
+ <cd:constant name='dot' value='punto'/>
+ <cd:constant name='doublesided' value='doppiafaccia'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='bordo'/>
+ <cd:constant name='edgedistance' value='distanzabordo'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='vuoto'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='marginepari'/>
+ <cd:constant name='expansion' value='espansione'/>
+ <cd:constant name='export' value='export'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='fattore'/>
+ <cd:constant name='fallback' value='fallback'/>
+ <cd:constant name='family' value='famiglia'/>
+ <cd:constant name='fieldbackgroundcolor' value='coloresfondocampo'/>
+ <cd:constant name='fieldframecolor' value='colorecornicecampo'/>
+ <cd:constant name='fieldlayer' value='fieldlayer'/>
+ <cd:constant name='fieldoffset' value='offsetcampo'/>
+ <cd:constant name='file' value='file'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='focus'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusout'/>
+ <cd:constant name='footer' value='piedipagina'/>
+ <cd:constant name='footerdistance' value='distanzapdp'/>
+ <cd:constant name='footerstate' value='statopdp'/>
+ <cd:constant name='foregroundcolor' value='coloreprimopiano'/>
+ <cd:constant name='foregroundstyle' value='foregroundstyle'/>
+ <cd:constant name='format' value='format'/>
+ <cd:constant name='frame' value='cornice'/>
+ <cd:constant name='framecolor' value='colorecornice'/>
+ <cd:constant name='framecorner' value='angolocornice'/>
+ <cd:constant name='framedepth' value='profonditacornice'/>
+ <cd:constant name='frameoffset' value='offsetcornice'/>
+ <cd:constant name='frameradius' value='raggiocornice'/>
+ <cd:constant name='frames' value='cornici'/>
+ <cd:constant name='from' value='da'/>
+ <cd:constant name='get' value='prendi'/>
+ <cd:constant name='global' value='globale'/>
+ <cd:constant name='grid' value='griglia'/>
+ <cd:constant name='hang' value='sospendi'/>
+ <cd:constant name='headalign' value='headalign'/>
+ <cd:constant name='headcolor' value='coloretesta'/>
+ <cd:constant name='headcommand' value='headcommand'/>
+ <cd:constant name='headconversion' value='conversionetesta'/>
+ <cd:constant name='header' value='intestazione'/>
+ <cd:constant name='headerdistance' value='distanzaintestazione'/>
+ <cd:constant name='headerstate' value='statointestazione'/>
+ <cd:constant name='headlabel' value='etichettatesta'/>
+ <cd:constant name='headnumber' value='numerotesta'/>
+ <cd:constant name='headstyle' value='stiletesta'/>
+ <cd:constant name='height' value='altezza'/>
+ <cd:constant name='hfactor' value='hfactor'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horoffset' value='horoffset'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='icomando'/>
+ <cd:constant name='in' value='in'/>
+ <cd:constant name='inbetween' value='tra'/>
+ <cd:constant name='increment' value='incremento'/>
+ <cd:constant name='incrementnumber' value='incrementanumero'/>
+ <cd:constant name='indenting' value='rientro'/>
+ <cd:constant name='indentnext' value='rientrasuccessivo'/>
+ <cd:constant name='indicator' value='indicatore'/>
+ <cd:constant name='inner' value='interno'/>
+ <cd:constant name='innermargin' value='margineinterno'/>
+ <cd:constant name='inputfile' value='inputfile'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='interazione'/>
+ <cd:constant name='interlinespace' value='interlinea'/>
+ <cd:constant name='itemalign' value='itemalign'/>
+ <cd:constant name='items' value='elementi'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keyword' value='parolachiave'/>
+ <cd:constant name='label' value='etichetta'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='sinistra'/>
+ <cd:constant name='leftcolor' value='coloresinistra'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='bordosinistro'/>
+ <cd:constant name='leftedgedistance' value='distanzabordosinistro'/>
+ <cd:constant name='leftframe' value='cornicesinistra'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='marginesinistro'/>
+ <cd:constant name='leftmargindistance' value='distanzamarginesinistro'/>
+ <cd:constant name='leftoffset' value='offsetsinistro'/>
+ <cd:constant name='leftquotation' value='citazionesinistra'/>
+ <cd:constant name='leftquote' value='menzionesinistra'/>
+ <cd:constant name='leftsentence' value='frasesinistra'/>
+ <cd:constant name='leftspeech' value='leftspeech'/>
+ <cd:constant name='leftstyle' value='stilesinistra'/>
+ <cd:constant name='leftsubsentence' value='sottofrasesinistra'/>
+ <cd:constant name='lefttext' value='testosinistro'/>
+ <cd:constant name='leftwidth' value='ampiezzasinistra'/>
+ <cd:constant name='level' value='livello'/>
+ <cd:constant name='levels' value='livelli'/>
+ <cd:constant name='limittext' value='limittext'/>
+ <cd:constant name='line' value='riga'/>
+ <cd:constant name='linecorrection' value='correzioneriga'/>
+ <cd:constant name='lines' value='righe'/>
+ <cd:constant name='list' value='elenco'/>
+ <cd:constant name='listtext' value='listtext'/>
+ <cd:constant name='local' value='locale'/>
+ <cd:constant name='location' value='luogo'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='loghi'/>
+ <cd:constant name='marcolor' value='coloremarcatura'/>
+ <cd:constant name='margin' value='margine'/>
+ <cd:constant name='margindistance' value='distanzamargine'/>
+ <cd:constant name='marginedge' value='bordomargine'/>
+ <cd:constant name='marginedgetext' value='testobordomargine'/>
+ <cd:constant name='margintext' value='testomargine'/>
+ <cd:constant name='marking' value='marcatura'/>
+ <cd:constant name='marstyle' value='stilemarcatura'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='altezzamax'/>
+ <cd:constant name='maxwidth' value='ampiezzamax'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='menu'/>
+ <cd:constant name='method' value='metodo'/>
+ <cd:constant name='middle' value='centro'/>
+ <cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middletext' value='testocentro'/>
+ <cd:constant name='midsentence' value='midsentence'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='mindeoth'/>
+ <cd:constant name='minheight' value='altezzamin'/>
+ <cd:constant name='minwidth' value='ampiezzamin'/>
+ <cd:constant name='monthconversion' value='monthconversion'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='nome'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='nfondo'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='successivo'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nsinistra'/>
+ <cd:constant name='nlines' value='nrighe'/>
+ <cd:constant name='norm' value='norma'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='ndestra'/>
+ <cd:constant name='ntop' value='ncima'/>
+ <cd:constant name='number' value='numero'/>
+ <cd:constant name='numbercolor' value='colorenumero'/>
+ <cd:constant name='numbercommand' value='comandonumero'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='numberdistance'/>
+ <cd:constant name='numbering' value='numerazione'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='separatorenumero'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='stilenumero'/>
+ <cd:constant name='numberwidth' value='numberwidth'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='oggetto'/>
+ <cd:constant name='obstruction' value='ostruzione'/>
+ <cd:constant name='oddmargin' value='marginedispari'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='azioneapri'/>
+ <cd:constant name='openpageaction' value='azioneapripagina'/>
+ <cd:constant name='option' value='opzione'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='orientation'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='margineesterno'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='numeroproprio'/>
+ <cd:constant name='page' value='pagina'/>
+ <cd:constant name='pageboundaries' value='limitipagina'/>
+ <cd:constant name='pagecolor' value='colorepagina'/>
+ <cd:constant name='pagecommand' value='comandopagina'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='numeropagina'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='statopagina'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='stilepagina'/>
+ <cd:constant name='palet' value='tavolozza'/>
+ <cd:constant name='paper' value='carta'/>
+ <cd:constant name='paragraph' value='capoverso'/>
+ <cd:constant name='place' value='metti'/>
+ <cd:constant name='placehead' value='mettitesta'/>
+ <cd:constant name='placestopper' value='mettistopper'/>
+ <cd:constant name='position' value='posizione'/>
+ <cd:constant name='prefix' value='prefisso'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='preimpostato'/>
+ <cd:constant name='preview' value='anteprima'/>
+ <cd:constant name='previous' value='precedente'/>
+ <cd:constant name='previousnumber' value='numeroprecedente'/>
+ <cd:constant name='process' value='process'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='raggio'/>
+ <cd:constant name='random' value='casuale'/>
+ <cd:constant name='range' value='range'/>
+ <cd:constant name='reduction' value='riduzione'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='riferimento'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='referencing'/>
+ <cd:constant name='regionin' value='entraregione'/>
+ <cd:constant name='regionout' value='esciregione'/>
+ <cd:constant name='repeat' value='ripeti'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='resetnumber'/>
+ <cd:constant name='resolution' value='risoluzione'/>
+ <cd:constant name='right' value='destra'/>
+ <cd:constant name='rightcolor' value='coloredestra'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='bordodestro'/>
+ <cd:constant name='rightedgedistance' value='distanzabordodestro'/>
+ <cd:constant name='rightframe' value='cornicedestra'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='marginedestro'/>
+ <cd:constant name='rightmargindistance' value='distanzamarginedestro'/>
+ <cd:constant name='rightoffset' value='offsetdestro'/>
+ <cd:constant name='rightquotation' value='citazionedestra'/>
+ <cd:constant name='rightquote' value='menzionedestra'/>
+ <cd:constant name='rightsentence' value='frasedestra'/>
+ <cd:constant name='rightspeech' value='rightspeech'/>
+ <cd:constant name='rightstyle' value='stiledestra'/>
+ <cd:constant name='rightsubsentence' value='sottofrasedestra'/>
+ <cd:constant name='righttext' value='testodestro'/>
+ <cd:constant name='rightwidth' value='ampiezzadestra'/>
+ <cd:constant name='rotation' value='rotazione'/>
+ <cd:constant name='rule' value='linea'/>
+ <cd:constant name='rulecolor' value='colorelinea'/>
+ <cd:constant name='rulethickness' value='spessorelinea'/>
+ <cd:constant name='samepage' value='stessapagina'/>
+ <cd:constant name='sample' value='campione'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='scala'/>
+ <cd:constant name='scope' value='scope'/>
+ <cd:constant name='screen' value='schermo'/>
+ <cd:constant name='section' value='sezione'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='numerosezione'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='separatore'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='setups'/>
+ <cd:constant name='side' value='lato'/>
+ <cd:constant name='sidealign' value='sidealign'/>
+ <cd:constant name='sidemethod' value='sidemethod'/>
+ <cd:constant name='sidespaceafter' value='spaziolateraledopo'/>
+ <cd:constant name='sidespacebefore' value='spaziolateraleprima'/>
+ <cd:constant name='sign' value='segno'/>
+ <cd:constant name='size' value='dimensione'/>
+ <cd:constant name='small' value='piccolo'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='sorttype'/>
+ <cd:constant name='source' value='origine'/>
+ <cd:constant name='space' value='spazio'/>
+ <cd:constant name='spaceafter' value='spaziodopo'/>
+ <cd:constant name='spacebefore' value='spazioprima'/>
+ <cd:constant name='spaceinbetween' value='spaceinbetween'/>
+ <cd:constant name='spacing' value='spaziatura'/>
+ <cd:constant name='split' value='separa'/>
+ <cd:constant name='splitcolor' value='splitcolor'/>
+ <cd:constant name='splitmethod' value='splitmethod'/>
+ <cd:constant name='splitoffset' value='splitoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stack'/>
+ <cd:constant name='start' value='inizia'/>
+ <cd:constant name='starter' value='starter'/>
+ <cd:constant name='state' value='stato'/>
+ <cd:constant name='step' value='passo'/>
+ <cd:constant name='stop' value='termina'/>
+ <cd:constant name='stopper' value='stopper'/>
+ <cd:constant name='stretch' value='dilata'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='stile'/>
+ <cd:constant name='sub' value='sotto'/>
+ <cd:constant name='subtitle' value='sottotitolo'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symallinea'/>
+ <cd:constant name='symbol' value='simbolo'/>
+ <cd:constant name='symbolset' value='setsimboli'/>
+ <cd:constant name='symcolor' value='coloresimbolo'/>
+ <cd:constant name='symstyle' value='stilesimbolo'/>
+ <cd:constant name='synonym' value='sinonimo'/>
+ <cd:constant name='synonymcolor' value='coloresinonimi'/>
+ <cd:constant name='synonymcommand' value='synonymcommand'/>
+ <cd:constant name='synonymstyle' value='stilesinonimi'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='testo'/>
+ <cd:constant name='textcolor' value='coloretesto'/>
+ <cd:constant name='textcommand' value='comandotesto'/>
+ <cd:constant name='textdistance' value='distanzatesto'/>
+ <cd:constant name='textlayer' value='textlayer'/>
+ <cd:constant name='textmargin' value='textmargin'/>
+ <cd:constant name='textmethod' value='textmethod'/>
+ <cd:constant name='textseparator' value='separatoretesto'/>
+ <cd:constant name='textsize' value='dimensionetesto'/>
+ <cd:constant name='textstate' value='statotesto'/>
+ <cd:constant name='textstyle' value='stiletesto'/>
+ <cd:constant name='textwidth' value='ampiezzatesto'/>
+ <cd:constant name='title' value='titolo'/>
+ <cd:constant name='titlecolor' value='coloretitolo'/>
+ <cd:constant name='titlecommand' value='titlecommand'/>
+ <cd:constant name='titledistance' value='distanzatitolo'/>
+ <cd:constant name='titleleft' value='titleleft'/>
+ <cd:constant name='titleright' value='titleright'/>
+ <cd:constant name='titlestyle' value='stiletitolo'/>
+ <cd:constant name='to' value='verso'/>
+ <cd:constant name='tolerance' value='tolleranza'/>
+ <cd:constant name='top' value='cima'/>
+ <cd:constant name='topdistance' value='distanzacima'/>
+ <cd:constant name='topframe' value='cornicecima'/>
+ <cd:constant name='topoffset' value='offsetcima'/>
+ <cd:constant name='topspace' value='spaziocima'/>
+ <cd:constant name='topstate' value='statocima'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='type'/>
+ <cd:constant name='unit' value='unita'/>
+ <cd:constant name='unknownreference' value='riferimentoingoto'/>
+ <cd:constant name='urlalternative' value='alternativaurl'/>
+ <cd:constant name='urlspace' value='spaziourl'/>
+ <cd:constant name='validate' value='verifica'/>
+ <cd:constant name='vcommand' value='vcomando'/>
+ <cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='modo'/>
+ <cd:constant name='wfactor' value='wfactor'/>
+ <cd:constant name='white' value='bianco'/>
+ <cd:constant name='width' value='ampiezza'/>
+ <cd:constant name='xfactor' value='xfactor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xscale'/>
+ <cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yfactor' value='yfactor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='yscale'/>
+ <cd:constant name='ystep' value='ystep'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language it -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='answerlines'/>
+ <cd:element name='answerspace' value='answerspace'/>
+ <cd:element name='begin' value='inizio'/>
+ <cd:element name='complete' value='completo'/>
+ <cd:element name='coupled' value='accoppiato'/>
+ <cd:element name='currentlocal' value='correntelocale'/>
+ <cd:element name='emptyone' value='prazdne'/>
+ <cd:element name='emptytwo' value='vuoti'/>
+ <cd:element name='end' value='fine'/>
+ <cd:element name='endsetup' value=''/>
+ <cd:element name='get' value='prendi'/>
+ <cd:element name='increment' value='incrementa'/>
+ <cd:element name='list' value='elenco'/>
+ <cd:element name='listof' value='elencodi'/>
+ <cd:element name='load' value='carica'/>
+ <cd:element name='local' value='locale'/>
+ <cd:element name='makeup' value='makeup'/>
+ <cd:element name='next' value='successivo'/>
+ <cd:element name='place' value='metti'/>
+ <cd:element name='previous' value='precedente'/>
+ <cd:element name='previouslocal' value='precedentelocale'/>
+ <cd:element name='reserve' value='riserva'/>
+ <cd:element name='see' value='vedi'/>
+ <cd:element name='setup' value='imposta'/>
+ <cd:element name='start' value='inizia'/>
+ <cd:element name='stop' value='termina'/>
+ <cd:element name='text' value='testo'/>
+ <cd:element name='type' value='type'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language it -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='CAP'/>
+ <cd:command name='Character' value='Lettera'/>
+ <cd:command name='Characters' value='Lettere'/>
+ <cd:command name='LABELTEXT' value='TESTOETICHETTA'/>
+ <cd:command name='MONTH' value='MESE'/>
+ <cd:command name='Numbers' value='Numeri'/>
+ <cd:command name='Romannumerals' value='Numeriromani'/>
+ <cd:command name='SmallCapped' value='Cap'/>
+ <cd:command name='SmallCaps' value='Caps'/>
+ <cd:command name='WEEKDAY' value='GIORNOSETTIMANA'/>
+ <cd:command name='WORD' value='PAROLA'/>
+ <cd:command name='WORDS' value='PAROLE'/>
+ <cd:command name='Word' value='Parola'/>
+ <cd:command name='Words' value='Parole'/>
+ <cd:command name='about' value='intorno'/>
+ <cd:command name='adaptlayout' value='adattalayout'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='al'/>
+ <cd:command name='atleftmargin' value='atleftmargin'/>
+ <cd:command name='atpage' value='apagina'/>
+ <cd:command name='atrightmargin' value='atrightmargin'/>
+ <cd:command name='background' value='sfondo'/>
+ <cd:command name='backspace' value='spaziodietro'/>
+ <cd:command name='blackrule' value='lineanera'/>
+ <cd:command name='blackrules' value='lineenere'/>
+ <cd:command name='blank' value='rigovuoto'/>
+ <cd:command name='bookmark' value='segnalibro'/>
+ <cd:command name='bottomdistance' value='distanzafondo'/>
+ <cd:command name='bottomheight' value='altezzafondo'/>
+ <cd:command name='bottomspace' value='spaziofondo'/>
+ <cd:command name='but' value='fondo'/>
+ <cd:command name='button' value='pulsante'/>
+ <cd:command name='bypassblocks' value='saltablocchi'/>
+ <cd:command name='character' value='lettera'/>
+ <cd:command name='characters' value='lettere'/>
+ <cd:command name='chem' value='chim'/>
+ <cd:command name='clip' value='clip'/>
+ <cd:command name='clonefield' value='clonacampo'/>
+ <cd:command name='color' value='colore'/>
+ <cd:command name='colorbar' value='barracolori'/>
+ <cd:command name='colorvalue' value='valorecolore'/>
+ <cd:command name='column' value='colonna'/>
+ <cd:command name='comment' value='commento'/>
+ <cd:command name='comparecolorgroup' value='confrontagruppocolori'/>
+ <cd:command name='comparepalet' value='confrontatavolozza'/>
+ <cd:command name='completepagenumber' value='numeropaginacompleto'/>
+ <cd:command name='completeregister' value='completeregister'/>
+ <cd:command name='component' value='componenet'/>
+ <cd:command name='convertnumber' value='convertinumero'/>
+ <cd:command name='copyfield' value='copiacampo'/>
+ <cd:command name='correctwhitespace' value='correggispaziobianco'/>
+ <cd:command name='coupledocument' value='accoppiadocumento'/>
+ <cd:command name='couplemarking' value='accoppiamarcatura'/>
+ <cd:command name='couplepage' value='accoppiapagina'/>
+ <cd:command name='couplepaper' value='accoppiacarta'/>
+ <cd:command name='coupleregister' value='accoppiaregistro'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='datadioggi'/>
+ <cd:command name='currentheadnumber' value='numerotestacorrente'/>
+ <cd:command name='cutspace' value='cutspace'/>
+ <cd:command name='date' value='data'/>
+ <cd:command name='decouplemarking' value='separamarcatura'/>
+ <cd:command name='decrementnumber' value='decrementnumber'/>
+ <cd:command name='define' value='definisci'/>
+ <cd:command name='defineaccent' value='definisciaccento'/>
+ <cd:command name='defineblank' value='definiscirigovuoto'/>
+ <cd:command name='defineblock' value='definisciblocco'/>
+ <cd:command name='definebodyfont' value='definiscifontdeltesto'/>
+ <cd:command name='definebodyfontenvironment' value='definisciambientefontdeltesto'/>
+ <cd:command name='definebuffer' value='definiscibuffer'/>
+ <cd:command name='definecharacter' value='definiscicarattere'/>
+ <cd:command name='definecolor' value='definiscicolore'/>
+ <cd:command name='definecolorgroup' value='definiscigruppocolori'/>
+ <cd:command name='definecolumnbreak' value='definecolumnbreak'/>
+ <cd:command name='definecolumnset' value='definiscigruppocolonne'/>
+ <cd:command name='definecombination' value='definecombination'/>
+ <cd:command name='definecombinedlist' value='definiscielencocombinato'/>
+ <cd:command name='definecommand' value='definiscicomando'/>
+ <cd:command name='defineconversion' value='definisciconversione'/>
+ <cd:command name='definedescription' value='definiscidescrizione'/>
+ <cd:command name='defineenumeration' value='definiscienumerazione'/>
+ <cd:command name='definefield' value='definiscicampo'/>
+ <cd:command name='definefieldstack' value='definiscistackcampi'/>
+ <cd:command name='definefiguresymbol' value='definiscifigurasimbolo'/>
+ <cd:command name='definefloat' value='definiscioggettomobile'/>
+ <cd:command name='definefont' value='definiscifont'/>
+ <cd:command name='definefontstyle' value='definiscistilefont'/>
+ <cd:command name='definefontsynonym' value='definiscisinonimofont'/>
+ <cd:command name='defineframed' value='definisciincorniciato'/>
+ <cd:command name='defineframedtext' value='definiscitestoincorniciato'/>
+ <cd:command name='definehbox' value='definiscihbox'/>
+ <cd:command name='definehead' value='definiscitesta'/>
+ <cd:command name='defineindenting' value='definiscirientro'/>
+ <cd:command name='defineinmargin' value='defineinmargin'/>
+ <cd:command name='defineinteractionmenu' value='definiscimenuinterazione'/>
+ <cd:command name='defineitemgroup' value='defineitemgroup'/>
+ <cd:command name='definelabel' value='definiscietichetta'/>
+ <cd:command name='definelayer' value='definelayer'/>
+ <cd:command name='definelayout' value='definiscilayout'/>
+ <cd:command name='definelist' value='definiscielenco'/>
+ <cd:command name='definelogo' value='definiscilogo'/>
+ <cd:command name='definemainfield' value='definiscicampoprincipale'/>
+ <cd:command name='definemakeup' value='definiscimakeup'/>
+ <cd:command name='definemarking' value='definiscimarcatura'/>
+ <cd:command name='definemathalignment' value='definemathalignment'/>
+ <cd:command name='defineoutput' value='definiscioutput'/>
+ <cd:command name='defineoverlay' value='definiscisovrapposizione'/>
+ <cd:command name='definepagebreak' value='definepagebreak'/>
+ <cd:command name='definepalet' value='definiscitavolozza'/>
+ <cd:command name='definepapersize' value='definiscidimensionicarta'/>
+ <cd:command name='defineparagraphs' value='definiscicapoversi'/>
+ <cd:command name='defineplacement' value='defineplacement'/>
+ <cd:command name='defineprofile' value='definisciprofilo'/>
+ <cd:command name='defineprogram' value='definisciprogramma'/>
+ <cd:command name='definerawfont' value='definiscifontgrezzo'/>
+ <cd:command name='definereference' value='definisciriferimento'/>
+ <cd:command name='definereferenceformat' value='definisciformatoriferimento'/>
+ <cd:command name='definereferencelist' value='definiscilistariferimenti'/>
+ <cd:command name='defineregister' value='definisciregistro'/>
+ <cd:command name='definerule' value='definiscilinea'/>
+ <cd:command name='definesection' value='definiscisezione'/>
+ <cd:command name='definesectionblock' value='definiscibloccosezione'/>
+ <cd:command name='definesorting' value='definisciordinamento'/>
+ <cd:command name='definestartstop' value='definisciiniziatermina'/>
+ <cd:command name='definestyle' value='definiscistile'/>
+ <cd:command name='definesubfield' value='definiscisottocampo'/>
+ <cd:command name='definesymbol' value='definiscisimbolo'/>
+ <cd:command name='definesynonyms' value='definiscisinonimi'/>
+ <cd:command name='definetabletemplate' value='definiscimodellotabella'/>
+ <cd:command name='definetabulate' value='definiscitabulato'/>
+ <cd:command name='definetext' value='definiscitesto'/>
+ <cd:command name='definetextposition' value='definisciposizionetesto'/>
+ <cd:command name='definetextvariable' value='definiscivariabiletesto'/>
+ <cd:command name='definetype' value='definiscitype'/>
+ <cd:command name='definetyping' value='definiscityping'/>
+ <cd:command name='defineversion' value='definisciversion'/>
+ <cd:command name='determineheadnumber' value='determinanumerotesta'/>
+ <cd:command name='determinelistcharacteristics' value='determinacarattersticheelenco'/>
+ <cd:command name='determineregistercharacteristics' value='determinacaratteristicheregistro'/>
+ <cd:command name='dimension' value='dimensione'/>
+ <cd:command name='disableinteractionmenu' value='disabilitamenuinterazione'/>
+ <cd:command name='domicile' value='domicilio'/>
+ <cd:command name='donttest' value='notest'/>
+ <cd:command name='edgedistance' value='distanzabordo'/>
+ <cd:command name='edgewidth' value='ampiezzabordo'/>
+ <cd:command name='emptylines' value='emptylines'/>
+ <cd:command name='environment' value='ambiente'/>
+ <cd:command name='externalfigure' value='figuraesterna'/>
+ <cd:command name='fact' value='fatto'/>
+ <cd:command name='field' value='campi'/>
+ <cd:command name='fieldstack' value='stackcampi'/>
+ <cd:command name='fillinfield' value='camporiempimento'/>
+ <cd:command name='fillinline' value='rigariempimento'/>
+ <cd:command name='fillinrules' value='lineeriempimento'/>
+ <cd:command name='fillintext' value='testoriempimento'/>
+ <cd:command name='fitfield' value='adattacampo'/>
+ <cd:command name='fixedspace' value='spaziofisso'/>
+ <cd:command name='fixedspaces' value='spazifissi'/>
+ <cd:command name='followprofile' value='seguiprofilo'/>
+ <cd:command name='followprofileversion' value='seguiversioneprofilo'/>
+ <cd:command name='followversion' value='seguiversione'/>
+ <cd:command name='footerdistance' value='distanzapdp'/>
+ <cd:command name='footerheight' value='altezzapdp'/>
+ <cd:command name='footnote' value='notapdp'/>
+ <cd:command name='footnotetext' value='testonotapdp'/>
+ <cd:command name='forceblocks' value='forzablocchi'/>
+ <cd:command name='formulanumber' value='numeroformula'/>
+ <cd:command name='fraction' value='frazione'/>
+ <cd:command name='framed' value='incorniciato'/>
+ <cd:command name='from' value='da'/>
+ <cd:command name='getbuffer' value='prendibuffer'/>
+ <cd:command name='getmarking' value='prendimarcatura'/>
+ <cd:command name='getnumber' value='getnumber'/>
+ <cd:command name='godown' value='vaigiu'/>
+ <cd:command name='goto' value='vaia'/>
+ <cd:command name='gotobox' value='vaiabox'/>
+ <cd:command name='gotopage' value='vaiapagina'/>
+ <cd:command name='graycolor' value='coloregrigio'/>
+ <cd:command name='greyvalue' value='valoregrigio'/>
+ <cd:command name='grid' value='griglia'/>
+ <cd:command name='hairline' value='capello'/>
+ <cd:command name='head' value='testa'/>
+ <cd:command name='headerdistance' value='distanzaintestazione'/>
+ <cd:command name='headerheight' value='altezzaintestazione'/>
+ <cd:command name='headlevel' value='livellotesta'/>
+ <cd:command name='headnumber' value='numerotesta'/>
+ <cd:command name='headsym' value='headsym'/>
+ <cd:command name='headtext' value='testoinstestazioni'/>
+ <cd:command name='hideblocks' value='nascondiblocchi'/>
+ <cd:command name='high' value='ap'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='immediatebetweenlist'/>
+ <cd:command name='immediatetolist' value='immediatetolist'/>
+ <cd:command name='in' value='in'/>
+ <cd:command name='incrementnumber' value='incrementanumero'/>
+ <cd:command name='indenting' value='rientro'/>
+ <cd:command name='inframed' value='circondato'/>
+ <cd:command name='infull' value='perlungo'/>
+ <cd:command name='ininner' value='ininner'/>
+ <cd:command name='inleft' value='insinistra'/>
+ <cd:command name='inleftedge' value='inlatosinistro'/>
+ <cd:command name='inleftmargin' value='inmarginesinistro'/>
+ <cd:command name='inline' value='inriga'/>
+ <cd:command name='inmargin' value='inmargine'/>
+ <cd:command name='inmframed' value='inmaframed'/>
+ <cd:command name='inneredgedistance' value='inneredgedistance'/>
+ <cd:command name='inneredgewidth' value='inneredgewidth'/>
+ <cd:command name='innermargindistance' value='innermargindistance'/>
+ <cd:command name='innermarginwidth' value='innermarginwidth'/>
+ <cd:command name='inothermargin' value='inaltromargine'/>
+ <cd:command name='inouter' value='inouter'/>
+ <cd:command name='inright' value='indestra'/>
+ <cd:command name='inrightedge' value='inlatodestro'/>
+ <cd:command name='inrightmargin' value='inmarginedestro'/>
+ <cd:command name='installlanguage' value='installalingua'/>
+ <cd:command name='interactionbar' value='barrainterazione'/>
+ <cd:command name='interactionbuttons' value='pulsantinterazione'/>
+ <cd:command name='interactionmenu' value='menuinterattivo'/>
+ <cd:command name='item' value='elemento'/>
+ <cd:command name='items' value='elementi'/>
+ <cd:command name='its' value='el'/>
+ <cd:command name='keepblocks' value='tieniblocchi'/>
+ <cd:command name='label' value='etichetta'/>
+ <cd:command name='labels' value='etichette'/>
+ <cd:command name='labeltext' value='testoetichetta'/>
+ <cd:command name='language' value='lingua'/>
+ <cd:command name='leftaligned' value='allineasinistra'/>
+ <cd:command name='leftedgedistance' value='distanzabordosinistro'/>
+ <cd:command name='leftedgewidth' value='ampiezzabordosinistro'/>
+ <cd:command name='leftmargindistance' value='distanzamarginesinistro'/>
+ <cd:command name='leftmarginwidth' value='ampiezzamarginesinistro'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='spessoreriga'/>
+ <cd:command name='listheight' value='altezzaelenco'/>
+ <cd:command name='listlength' value='lunghezzaelenco'/>
+ <cd:command name='listsymbol' value='listsymbol'/>
+ <cd:command name='listwidth' value='ampiezzaelenco'/>
+ <cd:command name='logfields' value='logcampi'/>
+ <cd:command name='lohi' value='pedap'/>
+ <cd:command name='low' value='ped'/>
+ <cd:command name='macroname' value='nome'/>
+ <cd:command name='mainlanguage' value='linguaprincipale'/>
+ <cd:command name='makeupheight' value='altezzamakeup'/>
+ <cd:command name='makeupwidth' value='ampiezzamakeup'/>
+ <cd:command name='mar' value='mar'/>
+ <cd:command name='margindistance' value='distanzamargine'/>
+ <cd:command name='marginrule' value='lineamargine'/>
+ <cd:command name='margintext' value='testoinmargine'/>
+ <cd:command name='margintitle' value='titoloinmargine'/>
+ <cd:command name='marginwidth' value='ampiezzamargine'/>
+ <cd:command name='marginword' value='parolainmargine'/>
+ <cd:command name='marking' value='marcatura'/>
+ <cd:command name='markversion' value='marcaversione'/>
+ <cd:command name='mathematics' value='matematica'/>
+ <cd:command name='menubutton' value='pulsantemenu'/>
+ <cd:command name='mframed' value='maframed'/>
+ <cd:command name='midaligned' value='allineacentro'/>
+ <cd:command name='mirror' value='riflessione'/>
+ <cd:command name='month' value='mese'/>
+ <cd:command name='moveformula' value='spostaformula'/>
+ <cd:command name='moveongrid' value='spostaagriglia'/>
+ <cd:command name='movesidefloat' value='movesidefloat'/>
+ <cd:command name='navigating' value='navigating'/>
+ <cd:command name='nodimension' value='nientedimensioni'/>
+ <cd:command name='noheaderandfooterlines' value='nientelineintestazionepdp'/>
+ <cd:command name='noindenting' value='nienterientro'/>
+ <cd:command name='nolist' value='nienteelenco'/>
+ <cd:command name='nomarking' value='nientemarcatura'/>
+ <cd:command name='nomoreblocks' value='bastablocchi'/>
+ <cd:command name='nomorefiles' value='bastafile'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='nientespazio'/>
+ <cd:command name='note' value='nota'/>
+ <cd:command name='notopandbottomlines' value='nientelineecimafondo'/>
+ <cd:command name='notsmallcapped' value='nocap'/>
+ <cd:command name='nowhitespace' value='nientespaziobianco'/>
+ <cd:command name='numberofsubpages' value='numberofsubpages'/>
+ <cd:command name='numbers' value='numeri'/>
+ <cd:command name='outeredgedistance' value='outeredgedistance'/>
+ <cd:command name='outeredgewidth' value='outeredgewidth'/>
+ <cd:command name='outermargindistance' value='outermargindistance'/>
+ <cd:command name='outermarginwidth' value='outermarginwidth'/>
+ <cd:command name='packed' value='impaccato'/>
+ <cd:command name='page' value='pagina'/>
+ <cd:command name='pagedepth' value='pagedepth'/>
+ <cd:command name='pagenumber' value='numeropagina'/>
+ <cd:command name='pageoffset' value='pageoffset'/>
+ <cd:command name='pagereference' value='riferimentopagina'/>
+ <cd:command name='pagetype' value='tipopagina'/>
+ <cd:command name='paperheight' value='altezzacarta'/>
+ <cd:command name='paperwidth' value='ampiezzacarta'/>
+ <cd:command name='periods' value='punti'/>
+ <cd:command name='plaatsruwelijst' value='placerawlist'/>
+ <cd:command name='placebookmarks' value='mettisegnalibro'/>
+ <cd:command name='placecombinedlist' value='mettielencocombinato'/>
+ <cd:command name='placefloat' value='placefloat'/>
+ <cd:command name='placefootnotes' value='mettinotepdp'/>
+ <cd:command name='placeformula' value='mettiformula'/>
+ <cd:command name='placeheadnumber' value='posizionanumerotesta'/>
+ <cd:command name='placeheadtext' value='posizionatestotesta'/>
+ <cd:command name='placelegend' value='mettilegenda'/>
+ <cd:command name='placelist' value='mettielenco'/>
+ <cd:command name='placelocalfootnotes' value='mettinotepdplocali'/>
+ <cd:command name='placelogos' value='mettiloghi'/>
+ <cd:command name='placeongrid' value='mettiingriglia'/>
+ <cd:command name='placeontopofeachother' value='mettiunosullaltro'/>
+ <cd:command name='placepagenumber' value='mettinumeropagina'/>
+ <cd:command name='placereferencelist' value='placereferencelist'/>
+ <cd:command name='placeregister' value='mettiregistro'/>
+ <cd:command name='placerule' value='mettilinea'/>
+ <cd:command name='placesidebyside' value='mettifiancoafianco'/>
+ <cd:command name='placesubformula' value='mettisottoformula'/>
+ <cd:command name='placetextvariable' value='mettivariabiletesto'/>
+ <cd:command name='position' value='posizione'/>
+ <cd:command name='positiontext' value='posizionatesto'/>
+ <cd:command name='printpaperheight' value='altezzacartastampa'/>
+ <cd:command name='printpaperwidth' value='ampiezzacartastampa'/>
+ <cd:command name='processblocks' value='elaborablocchi'/>
+ <cd:command name='processpage' value='elaborapagina'/>
+ <cd:command name='product' value='prodotto'/>
+ <cd:command name='program' value='programma'/>
+ <cd:command name='project' value='progetto'/>
+ <cd:command name='publication' value='pubblicazione'/>
+ <cd:command name='quotation' value='citazione'/>
+ <cd:command name='quote' value='menzione'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='rifai'/>
+ <cd:command name='ref' value='rif'/>
+ <cd:command name='reference' value='riferimento'/>
+ <cd:command name='referral' value='referral'/>
+ <cd:command name='referraldate' value='datareferral'/>
+ <cd:command name='referring' value='referring'/>
+ <cd:command name='remark' value='commento'/>
+ <cd:command name='reset' value='reimposta'/>
+ <cd:command name='resetmarking' value='reimpostamarcatura'/>
+ <cd:command name='resetnumber' value='resetnumber'/>
+ <cd:command name='resettext' value='resettextcontent'/>
+ <cd:command name='rightaligned' value='allineadestra'/>
+ <cd:command name='rightedgedistance' value='distanzabordodestro'/>
+ <cd:command name='rightedgewidth' value='ampiezzabordodestro'/>
+ <cd:command name='rightmargindistance' value='distanzamarginedestro'/>
+ <cd:command name='rightmarginwidth' value='ampiezzamarginedestro'/>
+ <cd:command name='romannumerals' value='numeriromani'/>
+ <cd:command name='rotate' value='ruota'/>
+ <cd:command name='scale' value='scala'/>
+ <cd:command name='screen' value='schermo'/>
+ <cd:command name='selectblocks' value='selezionablocchi'/>
+ <cd:command name='selectpaper' value='selezionacarta'/>
+ <cd:command name='selectversion' value='selezionaversione'/>
+ <cd:command name='setnumber' value='setnumber'/>
+ <cd:command name='settextcontent' value='settext'/>
+ <cd:command name='settextvariable' value='setvariabiletesto'/>
+ <cd:command name='setupalign' value='impostaallineamento'/>
+ <cd:command name='setupanswerarea' value='setupanswerarea'/>
+ <cd:command name='setuparranging' value='impostaparranging'/>
+ <cd:command name='setupbackground' value='impostasfondo'/>
+ <cd:command name='setupbackgrounds' value='impostasfondi'/>
+ <cd:command name='setupblackrules' value='impostalineenere'/>
+ <cd:command name='setupblank' value='impostarigovuoto'/>
+ <cd:command name='setupblock' value='impostablocco'/>
+ <cd:command name='setupbodyfont' value='impostafontdeltesto'/>
+ <cd:command name='setupbodyfontenvironment' value='impostaambientefontdeltesto'/>
+ <cd:command name='setupbottom' value='impostafondo'/>
+ <cd:command name='setupbottomtexts' value='impostatestifondo'/>
+ <cd:command name='setupbuffer' value='impostabuffer'/>
+ <cd:command name='setupbuttons' value='impostapulsanti'/>
+ <cd:command name='setupcapitals' value='impostamaiuscole'/>
+ <cd:command name='setupcaption' value='impostacaption'/>
+ <cd:command name='setupcaptions' value='impostacaptions'/>
+ <cd:command name='setupclipping' value='impostaclippling'/>
+ <cd:command name='setupcolor' value='impostacolore'/>
+ <cd:command name='setupcolors' value='impostacolori'/>
+ <cd:command name='setupcolumns' value='impostacolonne'/>
+ <cd:command name='setupcolumnset' value='impostagruppocolonne'/>
+ <cd:command name='setupcolumnsetlines' value='setupcolumnsetlines'/>
+ <cd:command name='setupcolumnsetstart' value='setupcolumnsetstart'/>
+ <cd:command name='setupcombinations' value='impostacombinazioni'/>
+ <cd:command name='setupcombinedlist' value='impostaelencocombinato'/>
+ <cd:command name='setupcomment' value='impostacommento'/>
+ <cd:command name='setupdescriptions' value='impostadescrizioni'/>
+ <cd:command name='setupenumerations' value='impostaenumerazioni'/>
+ <cd:command name='setupexternalfigures' value='impostafigureesterne'/>
+ <cd:command name='setupfield' value='impostacampo'/>
+ <cd:command name='setupfields' value='impostacampi'/>
+ <cd:command name='setupfillinlines' value='impostarigheriempimento'/>
+ <cd:command name='setupfillinrules' value='impostalineeriempimento'/>
+ <cd:command name='setupfloat' value='impostaoggettomobile'/>
+ <cd:command name='setupfloats' value='impostaoggettimobili'/>
+ <cd:command name='setupfloatsplitting' value='impostaspezzamentooggettomobile'/>
+ <cd:command name='setupfooter' value='impostapdp'/>
+ <cd:command name='setupfootertexts' value='impostatestipdp'/>
+ <cd:command name='setupfootnotedefinition' value='impostadefinizionenotepdp'/>
+ <cd:command name='setupfootnotes' value='impostanotepdp'/>
+ <cd:command name='setupforms' value='impostaforms'/>
+ <cd:command name='setupformulas' value='impostaformule'/>
+ <cd:command name='setupframed' value='impostaincorniciato'/>
+ <cd:command name='setupframedtexts' value='impostatestiincorniciati'/>
+ <cd:command name='setuphead' value='impostatesta'/>
+ <cd:command name='setupheader' value='impostainstestazione'/>
+ <cd:command name='setupheadertexts' value='impostatestiintestazioni'/>
+ <cd:command name='setupheadnumber' value='impostanumerotesta'/>
+ <cd:command name='setupheads' value='impostateste'/>
+ <cd:command name='setupheadtext' value='impostatestointestazioni'/>
+ <cd:command name='setuphyphenmark' value='impostasegnosillabazione'/>
+ <cd:command name='setupindentations' value='impostarientri'/>
+ <cd:command name='setupindenting' value='impostarientro'/>
+ <cd:command name='setupinmargin' value='impostainmargine'/>
+ <cd:command name='setupinteraction' value='impostainterazione'/>
+ <cd:command name='setupinteractionbar' value='impostabarrainterazione'/>
+ <cd:command name='setupinteractionmenu' value='impostamenuinterazione'/>
+ <cd:command name='setupinteractionscreen' value='impostaschermointerazione'/>
+ <cd:command name='setupinterlinespace' value='impostainterlinea'/>
+ <cd:command name='setupitemgroup' value='setupitemgroup'/>
+ <cd:command name='setupitemgroups' value='impostaelencazioni'/>
+ <cd:command name='setupitems' value='impostaelementi'/>
+ <cd:command name='setuplabeltext' value='impostatestoetichette'/>
+ <cd:command name='setuplanguage' value='impostalingua'/>
+ <cd:command name='setuplayout' value='impostalayout'/>
+ <cd:command name='setuplegend' value='impostalegenda'/>
+ <cd:command name='setuplinenumbering' value='impostanumerazionerighe'/>
+ <cd:command name='setuplines' value='impostarighe'/>
+ <cd:command name='setuplinewidth' value='impostaampiezzariga'/>
+ <cd:command name='setuplist' value='impostaelenco'/>
+ <cd:command name='setupmakeup' value='impostamakeup'/>
+ <cd:command name='setupmarginblocks' value='impostablocchimargine'/>
+ <cd:command name='setupmarginrules' value='impostalineemargine'/>
+ <cd:command name='setupmarking' value='impostamarcatura'/>
+ <cd:command name='setupmathalignment' value='setupmathalignment'/>
+ <cd:command name='setupnarrower' value='impostapiustretto'/>
+ <cd:command name='setupnumber' value='impostanumerazione'/>
+ <cd:command name='setupnumbering' value='impostanumerazione'/>
+ <cd:command name='setupoppositeplacing' value='impostaposizionamentoopposti'/>
+ <cd:command name='setupoutput' value='impostaoutput'/>
+ <cd:command name='setuppagecomment' value='impostacommentopagina'/>
+ <cd:command name='setuppagenumber' value='impostanumeropagina'/>
+ <cd:command name='setuppagenumbering' value='impostanumerazionepagina'/>
+ <cd:command name='setuppagetransitions' value='impostatransizionepagina'/>
+ <cd:command name='setuppalet' value='impostatavolozza'/>
+ <cd:command name='setuppaper' value='setuppaper'/>
+ <cd:command name='setuppapersize' value='impostadimensionicarta'/>
+ <cd:command name='setupparagraphnumbering' value='impostanumerazionecapoversi'/>
+ <cd:command name='setupparagraphs' value='impostacapoversi'/>
+ <cd:command name='setupplacement' value='setupplacement'/>
+ <cd:command name='setuppositioning' value='impostaposizionamento'/>
+ <cd:command name='setupprofiles' value='impostaprofili'/>
+ <cd:command name='setupprograms' value='impostaprogrammi'/>
+ <cd:command name='setuppublications' value='impostapubblicazioni'/>
+ <cd:command name='setupquote' value='impostamenzione'/>
+ <cd:command name='setupreferencelist' value='impostalistariferimenti'/>
+ <cd:command name='setupreferencing' value='impostariferimento'/>
+ <cd:command name='setupregister' value='impostaregistro'/>
+ <cd:command name='setuprotate' value='impostarotazione'/>
+ <cd:command name='setuprule' value='impostalinea'/>
+ <cd:command name='setups' value='impostazioni'/>
+ <cd:command name='setupscreens' value='impostaschermi'/>
+ <cd:command name='setupsection' value='impostasezione'/>
+ <cd:command name='setupsectionblock' value='impostabloccosezione'/>
+ <cd:command name='setupsorting' value='impostaordinamento'/>
+ <cd:command name='setupspacing' value='impostaspaziatura'/>
+ <cd:command name='setupstartstop' value='impostainiziatermina'/>
+ <cd:command name='setupstrut' value='impostastrut'/>
+ <cd:command name='setupsubpagenumber' value='impostanumerosottopagina'/>
+ <cd:command name='setupsymbolset' value='impostasetsimboli'/>
+ <cd:command name='setupsynchronization' value='impostasincronizzazione'/>
+ <cd:command name='setupsynchronizationbar' value='impostabarrasincronizzazione'/>
+ <cd:command name='setupsynonyms' value='impostasinonimi'/>
+ <cd:command name='setupsystem' value='impostasistema'/>
+ <cd:command name='setuptab' value='impostatab'/>
+ <cd:command name='setuptables' value='impostatabelle'/>
+ <cd:command name='setuptabulate' value='impostatabulato'/>
+ <cd:command name='setuptext' value='impostatesto'/>
+ <cd:command name='setuptextposition' value='impostaposizionetesto'/>
+ <cd:command name='setuptextrules' value='impostalineetesto'/>
+ <cd:command name='setuptexttexts' value='impostatestotesti'/>
+ <cd:command name='setuptextvariable' value='impostavariabiletesto'/>
+ <cd:command name='setupthinrules' value='impostalineesottili'/>
+ <cd:command name='setuptolerance' value='impostatolleranza'/>
+ <cd:command name='setuptop' value='impostacima'/>
+ <cd:command name='setuptoptexts' value='impostatesticima'/>
+ <cd:command name='setuptype' value='impostatype'/>
+ <cd:command name='setuptyping' value='impostatyping'/>
+ <cd:command name='setupunderbar' value='impostasottolinea'/>
+ <cd:command name='setupurl' value='impostaurl'/>
+ <cd:command name='setupversions' value='impostaversioni'/>
+ <cd:command name='setupwhitespace' value='impostaspaziobianco'/>
+ <cd:command name='showbodyfont' value='mostrafontdeltesto'/>
+ <cd:command name='showbodyfontenvironment' value='mostraambientefontdeltesto'/>
+ <cd:command name='showcolor' value='mostracolore'/>
+ <cd:command name='showcolorgroup' value='mostragruppocolori'/>
+ <cd:command name='showexternalfigures' value='mostrafiguresterne'/>
+ <cd:command name='showfields' value='mostracampi'/>
+ <cd:command name='showframe' value='mostracornice'/>
+ <cd:command name='showgrid' value='mostragriglia'/>
+ <cd:command name='showlayout' value='mostralyout'/>
+ <cd:command name='showmakeup' value='mostramakeup'/>
+ <cd:command name='showpalet' value='mostratavolozza'/>
+ <cd:command name='showprint' value='mostrastampa'/>
+ <cd:command name='showsetups' value='mostraimpostazioni'/>
+ <cd:command name='showstruts' value='mostrastruts'/>
+ <cd:command name='showsymbolset' value='mostrasetsimboli'/>
+ <cd:command name='smallcapped' value='cap'/>
+ <cd:command name='someline' value='qualcheriga'/>
+ <cd:command name='somewhere' value='daqualcheparte'/>
+ <cd:command name='space' value='spazio'/>
+ <cd:command name='splitfloat' value='spezzaoggettomobile'/>
+ <cd:command name='startalignment' value='iniziaallineamento'/>
+ <cd:command name='startbackground' value='iniziasfondo'/>
+ <cd:command name='startcoding' value='iniziacodifica'/>
+ <cd:command name='startcolor' value='iniziacolore'/>
+ <cd:command name='startcolumnmakeup' value='startcolumnmakeup'/>
+ <cd:command name='startcolumns' value='iniziacolonne'/>
+ <cd:command name='startcolumnset' value='iniziagruppocolonne'/>
+ <cd:command name='startcombination' value='iniziacombinazione'/>
+ <cd:command name='startcomponent' value='iniziacomponente'/>
+ <cd:command name='startdocument' value='iniziadocumento'/>
+ <cd:command name='startenvironment' value='iniziaambiente'/>
+ <cd:command name='startfigure' value='iniziafigura'/>
+ <cd:command name='startglobal' value='iniziaglobale'/>
+ <cd:command name='startline' value='iniziariga'/>
+ <cd:command name='startlinecorrection' value='iniziacorrezioneriga'/>
+ <cd:command name='startlinenumbering' value='inizianumerazionerighe'/>
+ <cd:command name='startlines' value='iniziarighe'/>
+ <cd:command name='startlocal' value='inizialocale'/>
+ <cd:command name='startlocalfootnotes' value='inizianotepdplocali'/>
+ <cd:command name='startmakeup' value='iniziamakeup'/>
+ <cd:command name='startmarginblock' value='iniziabloccomargine'/>
+ <cd:command name='startmarginrule' value='inizialineamargine'/>
+ <cd:command name='startnarrower' value='iniziapiustretto'/>
+ <cd:command name='startopposite' value='iniziaopposto'/>
+ <cd:command name='startoverlay' value='iniziasovrapposizione'/>
+ <cd:command name='startoverzicht' value='iniziaoverview'/>
+ <cd:command name='startpacked' value='iniziaimpaccato'/>
+ <cd:command name='startpositioning' value='iniziaposizionamento'/>
+ <cd:command name='startproduct' value='iniziaprodotto'/>
+ <cd:command name='startprofile' value='iniziaprofilo'/>
+ <cd:command name='startproject' value='iniziaprogetto'/>
+ <cd:command name='startquotation' value='iniziacitazione'/>
+ <cd:command name='startraster' value='iniziaraster'/>
+ <cd:command name='startsymbolset' value='iniziasetsimboli'/>
+ <cd:command name='startsynchronization' value='iniziasincronizzazione'/>
+ <cd:command name='starttable' value='iniziatabella'/>
+ <cd:command name='starttables' value='iniziatabelle'/>
+ <cd:command name='starttext' value='iniziatesto'/>
+ <cd:command name='starttextrule' value='inizialineatesto'/>
+ <cd:command name='startunpacked' value='iniziaunpacked'/>
+ <cd:command name='startversion' value='iniziaversione'/>
+ <cd:command name='stopalignment' value='terminaallineamento'/>
+ <cd:command name='stopbackground' value='terminasfondo'/>
+ <cd:command name='stopcoding' value='terminacodifica'/>
+ <cd:command name='stopcolor' value='terminacolore'/>
+ <cd:command name='stopcolumnmakeup' value='stopcolumnmakeup'/>
+ <cd:command name='stopcolumns' value='terminacolonne'/>
+ <cd:command name='stopcolumnset' value='terminagruppocolonne'/>
+ <cd:command name='stopcombination' value='terminacombinazione'/>
+ <cd:command name='stopcomponent' value='terminacomponente'/>
+ <cd:command name='stopdocument' value='terminadocumento'/>
+ <cd:command name='stopenvironment' value='terminaambiente'/>
+ <cd:command name='stopglobal' value='terminaglobale'/>
+ <cd:command name='stopline' value='terminariga'/>
+ <cd:command name='stoplinecorrection' value='terminacorrezioneriga'/>
+ <cd:command name='stoplinenumbering' value='terminanumerazionerighe'/>
+ <cd:command name='stoplines' value='terminarighe'/>
+ <cd:command name='stoplocal' value='terminalocale'/>
+ <cd:command name='stoplocalfootnotes' value='terminanotepdplocali'/>
+ <cd:command name='stopmakeup' value='terminamakeup'/>
+ <cd:command name='stopmarginblock' value='terminabloccomargine'/>
+ <cd:command name='stopmarginrule' value='terminalineamargine'/>
+ <cd:command name='stopnarrower' value='terminapiustretto'/>
+ <cd:command name='stopopposite' value='terminaopposto'/>
+ <cd:command name='stopoverlay' value='terminasovrapposizione'/>
+ <cd:command name='stopoverzicht' value='terminaoverview'/>
+ <cd:command name='stoppacked' value='terminaimpaccato'/>
+ <cd:command name='stoppositioning' value='terminaposizionamento'/>
+ <cd:command name='stopproduct' value='terminaprodotto'/>
+ <cd:command name='stopprofile' value='terminaprofili'/>
+ <cd:command name='stopproject' value='terminaprogetto'/>
+ <cd:command name='stopquotation' value='terminacitazione'/>
+ <cd:command name='stopraster' value='terminaraster'/>
+ <cd:command name='stopsynchronization' value='terminasincronizzazione'/>
+ <cd:command name='stoptable' value='terminatabella'/>
+ <cd:command name='stoptables' value='terminatabelle'/>
+ <cd:command name='stoptext' value='terminatesto'/>
+ <cd:command name='stoptextrule' value='terminalineatesto'/>
+ <cd:command name='stopunpacked' value='terminaunpacked'/>
+ <cd:command name='stopversion' value='terminaversioni'/>
+ <cd:command name='stretched' value='stirato'/>
+ <cd:command name='subformulanumber' value='numerosottoformula'/>
+ <cd:command name='subpagenumber' value='subpagenumber'/>
+ <cd:command name='switchtobodyfont' value='cambiaafontdeltesto'/>
+ <cd:command name='switchtorawfont' value='passaafontgrezzo'/>
+ <cd:command name='sym' value='sim'/>
+ <cd:command name='symbol' value='simbolo'/>
+ <cd:command name='synchronizationbar' value='barrasincronizzazione'/>
+ <cd:command name='synchronize' value='sincronizza'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testcolumn'/>
+ <cd:command name='testpage' value='testpage'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='altezzatesto'/>
+ <cd:command name='textreference' value='riferimentotesto'/>
+ <cd:command name='textrule' value='lineatesto'/>
+ <cd:command name='textvariable' value='variabiletesto'/>
+ <cd:command name='textwidth' value='ampiezzatesto'/>
+ <cd:command name='thinrule' value='lineasottile'/>
+ <cd:command name='thinrules' value='lineesottili'/>
+ <cd:command name='tooltip' value='tooltip'/>
+ <cd:command name='topdistance' value='distanzacima'/>
+ <cd:command name='topheight' value='altezzacima'/>
+ <cd:command name='topspace' value='spaziocima'/>
+ <cd:command name='totalnumberofpages' value='numerototaledipagine'/>
+ <cd:command name='translate' value='traduci'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='typ'/>
+ <cd:command name='type' value='type'/>
+ <cd:command name='typebuffer' value='typebuffer'/>
+ <cd:command name='typefile' value='typefile'/>
+ <cd:command name='unitmeaning' value='nomeunita'/>
+ <cd:command name='unknown' value='ignoto'/>
+ <cd:command name='useJSscripts' value='usaJSscripts'/>
+ <cd:command name='useURL' value='usaURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='usablocco'/>
+ <cd:command name='usecommands' value='usacomandi'/>
+ <cd:command name='useencoding' value='usacodifica'/>
+ <cd:command name='useexternaldocument' value='usadocumentoesterno'/>
+ <cd:command name='useexternalfigure' value='usafiguraesterna'/>
+ <cd:command name='useexternalfile' value='usafileesterno'/>
+ <cd:command name='useexternalfiles' value='usafileesterni'/>
+ <cd:command name='useexternalsoundtrack' value='usacolonnasonoraesterna'/>
+ <cd:command name='usemodule' value='usamodulo'/>
+ <cd:command name='usemodules' value='usamoduli'/>
+ <cd:command name='usepath' value='usacartella'/>
+ <cd:command name='usereferences' value='usariferimenti'/>
+ <cd:command name='usespecials' value='usaspecialita'/>
+ <cd:command name='usesymbols' value='usasimboli'/>
+ <cd:command name='usetypescript' value='usetypescript'/>
+ <cd:command name='usetypescriptfile' value='usetypescriptfile'/>
+ <cd:command name='useurl' value='usaurl'/>
+ <cd:command name='version' value='versione'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='giornosettimana'/>
+ <cd:command name='whitespace' value='spaziobianco'/>
+ <cd:command name='wordright' value='paroladestra'/>
+ <cd:command name='writebetweenlist' value='scrividentroelenco'/>
+ <cd:command name='writetolist' value='scriviinelenco'/>
+ <cd:command name='writetoreferencelist' value='scriviinlistariferimenti'/>
+ <cd:command name='writetoregister' value='scriviinregistro'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml
new file mode 100644
index 000000000..d9eb33410
--- /dev/null
+++ b/tex/context/interface/keys-nl.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='nl' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language nl -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Toevoeging'/>
+ <cd:variable name='Balloon' value='Ballon'/>
+ <cd:variable name='Character' value='Letter'/>
+ <cd:variable name='Characters' value='Letters'/>
+ <cd:variable name='CloseDocument' value='SluitDocument'/>
+ <cd:variable name='ExitViewer' value='VerlaatViewer'/>
+ <cd:variable name='FirstPage' value='EerstePagina'/>
+ <cd:variable name='FitHeight' value='HoogtePassend'/>
+ <cd:variable name='FitWidth' value='BreedtePassend'/>
+ <cd:variable name='GotoPage' value='GaNaarPagina'/>
+ <cd:variable name='Greek' value='Grieks'/>
+ <cd:variable name='Help' value='Help'/>
+ <cd:variable name='HideField' value='VerbergVeld'/>
+ <cd:variable name='HideLayer' value='VerbergLaag'/>
+ <cd:variable name='Key' value='Sleutel'/>
+ <cd:variable name='LastPage' value='LaatstePagina'/>
+ <cd:variable name='LoadForm' value='LaadFormulier'/>
+ <cd:variable name='MONTH' value='MAAND'/>
+ <cd:variable name='New' value='Nieuw'/>
+ <cd:variable name='NextJump' value='VolgendeSprong'/>
+ <cd:variable name='NextPage' value='VolgendePagina'/>
+ <cd:variable name='Numbers' value='Cijfers'/>
+ <cd:variable name='OpenNamedDocument' value='OpenDocumentOpNaam'/>
+ <cd:variable name='Paragraph' value='Paragraaf'/>
+ <cd:variable name='PauseMovie' value='PauzeerFilm'/>
+ <cd:variable name='PauseRendering' value='PauzeerRendering'/>
+ <cd:variable name='PauseSound' value='PauzeerGeluid'/>
+ <cd:variable name='PreviousJump' value='VorigeSprong'/>
+ <cd:variable name='PreviousPage' value='VorigePagina'/>
+ <cd:variable name='PrintDocument' value='PrintDocument'/>
+ <cd:variable name='Query' value='RaadpleegDocument'/>
+ <cd:variable name='QueryAgain' value='HerhaalRaadplegen'/>
+ <cd:variable name='ResetForm' value='ResetFormulier'/>
+ <cd:variable name='ResumeMovie' value='HervatFilm'/>
+ <cd:variable name='ResumeRendering' value='HervatRendering'/>
+ <cd:variable name='ResumeSound' value='HervatGeluid'/>
+ <cd:variable name='Romannumerals' value='Romeins'/>
+ <cd:variable name='SaveDocument' value='BewaarDocument'/>
+ <cd:variable name='SaveForm' value='BewaarFormulier'/>
+ <cd:variable name='SaveNamedDocument' value='BewaarDocumentOpNaam'/>
+ <cd:variable name='SearchAgain' value='HerhaalZoeken'/>
+ <cd:variable name='SearchDocument' value='DoorzoekDocument'/>
+ <cd:variable name='ShowBookmarks' value='ShowBookmarks'/>
+ <cd:variable name='ShowField' value='ToonVeld'/>
+ <cd:variable name='ShowThumbs' value='ShowThumbs'/>
+ <cd:variable name='StartMovie' value='StartFilm'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='StartGeluid'/>
+ <cd:variable name='StopMovie' value='StopFilm'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='StopGeluid'/>
+ <cd:variable name='SubmitForm' value='VerzendFormulier'/>
+ <cd:variable name='ToggleLayer' value='WisselLaag'/>
+ <cd:variable name='ToggleViewer' value='WisselViewer'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='ToonLaag'/>
+ <cd:variable name='ViewerHelp' value='ViewerHelp'/>
+ <cd:variable name='WEEKDAY' value='WEEKDAG'/>
+ <cd:variable name='WORD' value='WOORD'/>
+ <cd:variable name='abbreviation' value='afkorting'/>
+ <cd:variable name='abbreviations' value='afkortingen'/>
+ <cd:variable name='absolute' value='absoluut'/>
+ <cd:variable name='action' value='actie'/>
+ <cd:variable name='after' value='na'/>
+ <cd:variable name='all' value='alles'/>
+ <cd:variable name='always' value='altijd'/>
+ <cd:variable name='answerarea' value='antwoordgebied'/>
+ <cd:variable name='appendices' value='bijlagen'/>
+ <cd:variable name='appendix' value='bijlage'/>
+ <cd:variable name='april' value='april'/>
+ <cd:variable name='atmargin' value='opmarge'/>
+ <cd:variable name='atpage' value='oppagina'/>
+ <cd:variable name='august' value='augustus'/>
+ <cd:variable name='author' value='auteur'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autointro'/>
+ <cd:variable name='back' value='terug'/>
+ <cd:variable name='background' value='achtergrond'/>
+ <cd:variable name='backmatter' value='uitleidingen'/>
+ <cd:variable name='backpart' value='uitleiding'/>
+ <cd:variable name='backspace' value='rugwit'/>
+ <cd:variable name='backward' value='achteruit'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='voor'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='groot'/>
+ <cd:variable name='bigbodyfont' value='grootkorps'/>
+ <cd:variable name='bigpreference' value='grotevoorkeur'/>
+ <cd:variable name='blank' value='blanko'/>
+ <cd:variable name='blockquote' value='blokcitaat'/>
+ <cd:variable name='bodymatter' value='hoofdteksten'/>
+ <cd:variable name='bodypart' value='hoofdtekst'/>
+ <cd:variable name='bold' value='vet'/>
+ <cd:variable name='bolditalic' value='vetitalic'/>
+ <cd:variable name='boldslanted' value='vetschuin'/>
+ <cd:variable name='bookmark' value='bookmark'/>
+ <cd:variable name='both' value='beide'/>
+ <cd:variable name='bottom' value='onder'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='ruim'/>
+ <cd:variable name='buffer' value='buffer'/>
+ <cd:variable name='by' value='per'/>
+ <cd:variable name='calligraphic' value='calligrafie'/>
+ <cd:variable name='cap' value='kap'/>
+ <cd:variable name='capital' value='kapitaal'/>
+ <cd:variable name='center' value='centreer'/>
+ <cd:variable name='chapter' value='hoofdstuk'/>
+ <cd:variable name='character' value='letter'/>
+ <cd:variable name='characters' value='letters'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='kleur'/>
+ <cd:variable name='column' value='kolom'/>
+ <cd:variable name='columns' value='kolommen'/>
+ <cd:variable name='command' value='commando'/>
+ <cd:variable name='commands' value='commandos'/>
+ <cd:variable name='comment' value='commentaar'/>
+ <cd:variable name='component' value='onderdeel'/>
+ <cd:variable name='concept' value='concept'/>
+ <cd:variable name='content' value='inhoud'/>
+ <cd:variable name='contents' value='inhouden'/>
+ <cd:variable name='continue' value='verder'/>
+ <cd:variable name='controls' value='sturing'/>
+ <cd:variable name='conversion' value='conversie'/>
+ <cd:variable name='current' value='huidige'/>
+ <cd:variable name='cutspace' value='snijwit'/>
+ <cd:variable name='date' value='datum'/>
+ <cd:variable name='day' value='dag'/>
+ <cd:variable name='december' value='december'/>
+ <cd:variable name='default' value='default'/>
+ <cd:variable name='depth' value='diepte'/>
+ <cd:variable name='description' value='doordefinitie'/>
+ <cd:variable name='disable' value='blokkeer'/>
+ <cd:variable name='display' value='scherm'/>
+ <cd:variable name='dot' value='punt'/>
+ <cd:variable name='doublesided' value='dubbelzijdig'/>
+ <cd:variable name='down' value='omlaag'/>
+ <cd:variable name='each' value='elk'/>
+ <cd:variable name='edge' value='rand'/>
+ <cd:variable name='empty' value='leeg'/>
+ <cd:variable name='end' value='eind'/>
+ <cd:variable name='endnote' value='eindnoot'/>
+ <cd:variable name='enumeration' value='doornummering'/>
+ <cd:variable name='environment' value='omgeving'/>
+ <cd:variable name='even' value='even'/>
+ <cd:variable name='external' value='extern'/>
+ <cd:variable name='fact' value='gegeven'/>
+ <cd:variable name='february' value='februari'/>
+ <cd:variable name='figure' value='figuur'/>
+ <cd:variable name='figures' value='figuren'/>
+ <cd:variable name='file' value='file'/>
+ <cd:variable name='final' value='definitief'/>
+ <cd:variable name='first' value='eerste'/>
+ <cd:variable name='firstcolumn' value='eerstekolom'/>
+ <cd:variable name='firstpage' value='eerstepagina'/>
+ <cd:variable name='firstsubpage' value='eerstesubpagina'/>
+ <cd:variable name='fit' value='passend'/>
+ <cd:variable name='five' value='vijf'/>
+ <cd:variable name='fix' value='herstel'/>
+ <cd:variable name='fixed' value='vast'/>
+ <cd:variable name='flexible' value='flexibel'/>
+ <cd:variable name='float' value='blok'/>
+ <cd:variable name='flushinner' value='lijnbinnen'/>
+ <cd:variable name='flushleft' value='lijnlinks'/>
+ <cd:variable name='flushouter' value='lijnbuiten'/>
+ <cd:variable name='flushright' value='lijnrechts'/>
+ <cd:variable name='footer' value='voet'/>
+ <cd:variable name='footnote' value='voetnoot'/>
+ <cd:variable name='force' value='forceer'/>
+ <cd:variable name='foreground' value='voorgrond'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='formule'/>
+ <cd:variable name='formulae' value='formules'/>
+ <cd:variable name='forward' value='vooruit'/>
+ <cd:variable name='four' value='vier'/>
+ <cd:variable name='frame' value='kader'/>
+ <cd:variable name='framedtext' value='kadertekst'/>
+ <cd:variable name='friday' value='vrijdag'/>
+ <cd:variable name='frontmatter' value='inleidingen'/>
+ <cd:variable name='frontpart' value='inleiding'/>
+ <cd:variable name='global' value='globaal'/>
+ <cd:variable name='graphic' value='grafiek'/>
+ <cd:variable name='graphics' value='grafieken'/>
+ <cd:variable name='gray' value='grijs'/>
+ <cd:variable name='greek' value='grieks'/>
+ <cd:variable name='grid' value='grid'/>
+ <cd:variable name='halfline' value='halveregel'/>
+ <cd:variable name='handwritten' value='handschrift'/>
+ <cd:variable name='hang' value='hang'/>
+ <cd:variable name='hanging' value='hangend'/>
+ <cd:variable name='head' value='kop'/>
+ <cd:variable name='header' value='hoofd'/>
+ <cd:variable name='height' value='hoogte'/>
+ <cd:variable name='helptext' value='helptekst'/>
+ <cd:variable name='hencefore' value='hierboven'/>
+ <cd:variable name='here' value='hier'/>
+ <cd:variable name='hereafter' value='hieronder'/>
+ <cd:variable name='hidden' value='verborgen'/>
+ <cd:variable name='hiding' value='verbergen'/>
+ <cd:variable name='high' value='hoog'/>
+ <cd:variable name='horizontal' value='horizontaal'/>
+ <cd:variable name='hyphenated' value='afgebroken'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='tussen'/>
+ <cd:variable name='index' value='index'/>
+ <cd:variable name='indices' value='indices'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='erf'/>
+ <cd:variable name='inleft' value='inlinker'/>
+ <cd:variable name='inmargin' value='inmarge'/>
+ <cd:variable name='inner' value='binnen'/>
+ <cd:variable name='inneredge' value='binnenrand'/>
+ <cd:variable name='innermargin' value='binnenmarge'/>
+ <cd:variable name='inright' value='inrechter'/>
+ <cd:variable name='interaction' value='interactie'/>
+ <cd:variable name='interactionmenu' value='interactiemenu'/>
+ <cd:variable name='intermezzi' value='intermezzos'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='intekst'/>
+ <cd:variable name='intro' value='intro'/>
+ <cd:variable name='italic' value='italic'/>
+ <cd:variable name='italicbold' value='italicvet'/>
+ <cd:variable name='item' value='som'/>
+ <cd:variable name='itemize' value='opsomming'/>
+ <cd:variable name='its' value='its'/>
+ <cd:variable name='january' value='januari'/>
+ <cd:variable name='joinedup' value='aansluitend'/>
+ <cd:variable name='july' value='juli'/>
+ <cd:variable name='june' value='juni'/>
+ <cd:variable name='keep' value='handhaaf'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='label'/>
+ <cd:variable name='landscape' value='liggend'/>
+ <cd:variable name='last' value='laatste'/>
+ <cd:variable name='lastcolumn' value='laatstekolom'/>
+ <cd:variable name='lastpage' value='laatstepagina'/>
+ <cd:variable name='lastpagenumber' value='laatstepaginanummer'/>
+ <cd:variable name='lastsubpage' value='laatstesubpagina'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='links'/>
+ <cd:variable name='leftedge' value='linkerrand'/>
+ <cd:variable name='lefthanging' value='linkshangend'/>
+ <cd:variable name='leftmargin' value='linkermarge'/>
+ <cd:variable name='leftpage' value='linkerpagina'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='legenda'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='regel'/>
+ <cd:variable name='linenote' value='regelnoot'/>
+ <cd:variable name='lines' value='regels'/>
+ <cd:variable name='list' value='lijst'/>
+ <cd:variable name='local' value='lokaal'/>
+ <cd:variable name='localenvironment' value='deelomgeving'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='logos'/>
+ <cd:variable name='lohi' value='laho'/>
+ <cd:variable name='loose' value='los'/>
+ <cd:variable name='low' value='laag'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='opmaak'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='maart'/>
+ <cd:variable name='margin' value='marge'/>
+ <cd:variable name='marginedge' value='kantlijn'/>
+ <cd:variable name='margintitle' value='margetitel'/>
+ <cd:variable name='marking' value='markering'/>
+ <cd:variable name='mathalignment' value='wiskundeuitlijnen'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='wiskundematrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='mei'/>
+ <cd:variable name='mediaeval' value='mediaeval'/>
+ <cd:variable name='medium' value='middel'/>
+ <cd:variable name='middle' value='midden'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='minhoogte'/>
+ <cd:variable name='minwidth' value='minbreedte'/>
+ <cd:variable name='mirrored' value='gespiegeld'/>
+ <cd:variable name='monday' value='maandag'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='maand'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='naam'/>
+ <cd:variable name='narrow' value='smal'/>
+ <cd:variable name='negative' value='negatief'/>
+ <cd:variable name='never' value='nooit'/>
+ <cd:variable name='new' value='nieuw'/>
+ <cd:variable name='next' value='volgende'/>
+ <cd:variable name='nextevenpage' value='volgendeevenpagina'/>
+ <cd:variable name='nextoddpage' value='volgendeonevenpagina'/>
+ <cd:variable name='nextpage' value='volgendepagina'/>
+ <cd:variable name='nextsubpage' value='volgendesubpagina'/>
+ <cd:variable name='no' value='nee'/>
+ <cd:variable name='nocheck' value='geencontrole'/>
+ <cd:variable name='nofit' value='nietpassend'/>
+ <cd:variable name='nogrid' value='geengrid'/>
+ <cd:variable name='nohz' value='geenhz'/>
+ <cd:variable name='nomarking' value='geenmarkering'/>
+ <cd:variable name='none' value='geen'/>
+ <cd:variable name='nonumber' value='geennummer'/>
+ <cd:variable name='normal' value='normaal'/>
+ <cd:variable name='nospacing' value='geenspatiering'/>
+ <cd:variable name='not' value='niet'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='niethangend'/>
+ <cd:variable name='nothyphenated' value='nietafgebroken'/>
+ <cd:variable name='november' value='november'/>
+ <cd:variable name='nowhere' value='nergens'/>
+ <cd:variable name='nowhite' value='geenwit'/>
+ <cd:variable name='number' value='nummer'/>
+ <cd:variable name='numbers' value='cijfers'/>
+ <cd:variable name='october' value='oktober'/>
+ <cd:variable name='odd' value='oneven'/>
+ <cd:variable name='off' value='uit'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='oud'/>
+ <cd:variable name='on' value='aan'/>
+ <cd:variable name='one' value='een'/>
+ <cd:variable name='opposite' value='naast'/>
+ <cd:variable name='outer' value='buiten'/>
+ <cd:variable name='outeredge' value='buitenrand'/>
+ <cd:variable name='outermargin' value='buitenmarge'/>
+ <cd:variable name='overbar' value='overstreep'/>
+ <cd:variable name='overbars' value='overstrepen'/>
+ <cd:variable name='overlay' value='overlay'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='doorstreep'/>
+ <cd:variable name='overstrikes' value='doorstrepen'/>
+ <cd:variable name='packed' value='opelkaar'/>
+ <cd:variable name='page' value='pagina'/>
+ <cd:variable name='pagecomment' value='paginacommentaar'/>
+ <cd:variable name='pagenumber' value='paginanummer'/>
+ <cd:variable name='paper' value='papier'/>
+ <cd:variable name='paragraph' value='alinea'/>
+ <cd:variable name='part' value='deel'/>
+ <cd:variable name='positive' value='positief'/>
+ <cd:variable name='postponing' value='uitstellen'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='voorkeur'/>
+ <cd:variable name='preview' value='preview'/>
+ <cd:variable name='previous' value='vorige'/>
+ <cd:variable name='previousevenpage' value='vorigeevenpagina'/>
+ <cd:variable name='previousoddpage' value='vorigeonevenpagina'/>
+ <cd:variable name='previouspage' value='vorigepagina'/>
+ <cd:variable name='previoussubpage' value='vorigesubpagina'/>
+ <cd:variable name='printable' value='printbaar'/>
+ <cd:variable name='process' value='proces'/>
+ <cd:variable name='product' value='produkt'/>
+ <cd:variable name='program' value='programma'/>
+ <cd:variable name='project' value='project'/>
+ <cd:variable name='protected' value='beschermd'/>
+ <cd:variable name='quadruple' value='viertal'/>
+ <cd:variable name='quotation' value='citaat'/>
+ <cd:variable name='quote' value='citeer'/>
+ <cd:variable name='ran' value='ran'/>
+ <cd:variable name='random' value='willekeurig'/>
+ <cd:variable name='readonly' value='alleenleesbaar'/>
+ <cd:variable name='rectangular' value='recht'/>
+ <cd:variable name='referral' value='kenmerk'/>
+ <cd:variable name='register' value='register'/>
+ <cd:variable name='regular' value='regular'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relatief'/>
+ <cd:variable name='repeat' value='herhaal'/>
+ <cd:variable name='required' value='verplicht'/>
+ <cd:variable name='reset' value='reset'/>
+ <cd:variable name='reverse' value='omgekeerd'/>
+ <cd:variable name='right' value='rechts'/>
+ <cd:variable name='rightedge' value='rechterrand'/>
+ <cd:variable name='righthanging' value='rechtshangend'/>
+ <cd:variable name='rightmargin' value='rechtermarge'/>
+ <cd:variable name='rightpage' value='rechterpagina'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='romaan'/>
+ <cd:variable name='romannumerals' value='romeins'/>
+ <cd:variable name='rotate' value='roteer'/>
+ <cd:variable name='rotated' value='geroteerd'/>
+ <cd:variable name='round' value='rond'/>
+ <cd:variable name='row' value='rij'/>
+ <cd:variable name='rule' value='lijn'/>
+ <cd:variable name='samepage' value='zelfdepagina'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sansvet'/>
+ <cd:variable name='sansserif' value='schreefloos'/>
+ <cd:variable name='saturday' value='zaterdag'/>
+ <cd:variable name='screen' value='raster'/>
+ <cd:variable name='section' value='paragraaf'/>
+ <cd:variable name='sectionblockenvironment' value='sectieblokomgeving'/>
+ <cd:variable name='sectionnumber' value='sectienummer'/>
+ <cd:variable name='see' value='zie'/>
+ <cd:variable name='september' value='september'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='aanelkaar'/>
+ <cd:variable name='setups' value='instellingen'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='short' value='kort'/>
+ <cd:variable name='singlesided' value='enkelzijdig'/>
+ <cd:variable name='slanted' value='schuin'/>
+ <cd:variable name='slantedbold' value='schuinvet'/>
+ <cd:variable name='small' value='klein'/>
+ <cd:variable name='smallbodyfont' value='kleinkorps'/>
+ <cd:variable name='smallbold' value='kleinvet'/>
+ <cd:variable name='smallbolditalic' value='kleinvetitalic'/>
+ <cd:variable name='smallboldslanted' value='kleinvetschuin'/>
+ <cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smallitalic' value='kleinitalic'/>
+ <cd:variable name='smallitalicbold' value='kleinitalicvet'/>
+ <cd:variable name='smallnormal' value='kleinnormaal'/>
+ <cd:variable name='smallslanted' value='kleinschuin'/>
+ <cd:variable name='smallslantedbold' value='kleinschuinvet'/>
+ <cd:variable name='smalltype' value='kleintype'/>
+ <cd:variable name='somewhere' value='ergens'/>
+ <cd:variable name='sorted' value='gesorteerd'/>
+ <cd:variable name='space' value='spatie'/>
+ <cd:variable name='spacing' value='spatiering'/>
+ <cd:variable name='speech' value='spraak'/>
+ <cd:variable name='split' value='splitsen'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standaard'/>
+ <cd:variable name='start' value='start'/>
+ <cd:variable name='starter' value='opener'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='stop'/>
+ <cd:variable name='stopper' value='afsluiter'/>
+ <cd:variable name='stretch' value='rek'/>
+ <cd:variable name='strict' value='streng'/>
+ <cd:variable name='strong' value='sterk'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='sub'/>
+ <cd:variable name='subbackward' value='subachteruit'/>
+ <cd:variable name='subformula' value='subformule'/>
+ <cd:variable name='subforward' value='subvooruit'/>
+ <cd:variable name='subject' value='onderwerp'/>
+ <cd:variable name='subpage' value='subpagina'/>
+ <cd:variable name='subsection' value='subparagraaf'/>
+ <cd:variable name='subsubject' value='subonderwerp'/>
+ <cd:variable name='subsubsection' value='subsubparagraaf'/>
+ <cd:variable name='subsubsubject' value='subsubonderwerp'/>
+ <cd:variable name='subsubsubsection' value='subsubsubparagraaf'/>
+ <cd:variable name='subsubsubsubject' value='subsubsubonderwerp'/>
+ <cd:variable name='subsubsubsubsection' value='subsubsubsubparagraaf'/>
+ <cd:variable name='subsubsubsubsubject' value='subsubsubsubonderwerp'/>
+ <cd:variable name='subsubsubsubsubsection' value='subsubsubsubsubparagraaf'/>
+ <cd:variable name='subsubsubsubsubsubject' value='subsubsubsubsubonderwerp'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='subsubsubsubsubsubparagraaf'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='subsubsubsubsubsubonderwerp'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubparagraaf'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubonderwerp'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsubparagraaf'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubonderwerp'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsubsubparagraaf'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubsubonderwerp'/>
+ <cd:variable name='sunday' value='zondag'/>
+ <cd:variable name='support' value='support'/>
+ <cd:variable name='sym' value='sym'/>
+ <cd:variable name='symbol' value='symbool'/>
+ <cd:variable name='synchronize' value='synchroniseer'/>
+ <cd:variable name='system' value='systeem'/>
+ <cd:variable name='table' value='tabel'/>
+ <cd:variable name='tablehead' value='tabelkop'/>
+ <cd:variable name='tables' value='tabellen'/>
+ <cd:variable name='tabletail' value='tabelstaart'/>
+ <cd:variable name='tabulate' value='tabulatie'/>
+ <cd:variable name='tabulatehead' value='tabulatiekop'/>
+ <cd:variable name='tabulatetail' value='tabulatiestaart'/>
+ <cd:variable name='tall' value='lang'/>
+ <cd:variable name='teletype' value='teletype'/>
+ <cd:variable name='temporary' value='voorlopig'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='tekst'/>
+ <cd:variable name='three' value='drie'/>
+ <cd:variable name='thursday' value='donderdag'/>
+ <cd:variable name='title' value='titel'/>
+ <cd:variable name='toggle' value='toggle'/>
+ <cd:variable name='tolerant' value='soepel'/>
+ <cd:variable name='top' value='boven'/>
+ <cd:variable name='tuesday' value='dinsdag'/>
+ <cd:variable name='two' value='twee'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='type'/>
+ <cd:variable name='typing' value='typen'/>
+ <cd:variable name='unavailable' value='nietbeschikbaar'/>
+ <cd:variable name='underbar' value='onderstreep'/>
+ <cd:variable name='underbars' value='onderstrepen'/>
+ <cd:variable name='unit' value='eenheid'/>
+ <cd:variable name='units' value='eenheden'/>
+ <cd:variable name='unknown' value='onbekend'/>
+ <cd:variable name='unpacked' value='vanelkaar'/>
+ <cd:variable name='up' value='omhoog'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='gebruikt'/>
+ <cd:variable name='value' value='waarde'/>
+ <cd:variable name='vertical' value='vertikaal'/>
+ <cd:variable name='very' value='zeer'/>
+ <cd:variable name='verystrict' value='zeerstreng'/>
+ <cd:variable name='verytolerant' value='zeersoepel'/>
+ <cd:variable name='weak' value='zwak'/>
+ <cd:variable name='wednesday' value='woensdag'/>
+ <cd:variable name='week' value='week'/>
+ <cd:variable name='weekday' value='weekdag'/>
+ <cd:variable name='white' value='wit'/>
+ <cd:variable name='wide' value='breed'/>
+ <cd:variable name='width' value='breedte'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='jaar'/>
+ <cd:variable name='yes' value='ja'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language nl -->
+
+ <cd:constants>
+ <cd:constant name='action' value='actie'/>
+ <cd:constant name='address' value='adres'/>
+ <cd:constant name='after' value='na'/>
+ <cd:constant name='afterhead' value='kopna'/>
+ <cd:constant name='afterkey' value='natoets'/>
+ <cd:constant name='align' value='uitlijnen'/>
+ <cd:constant name='aligncharacter' value='karakteruitlijnen'/>
+ <cd:constant name='alignmentcharacter' value='uitlijnkarakter'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='titeluitlijnen'/>
+ <cd:constant name='alternative' value='variant'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='pijl'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='op'/>
+ <cd:constant name='author' value='auteur'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autofocus'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autobreedte'/>
+ <cd:constant name='axis' value='assenstelsel'/>
+ <cd:constant name='background' value='achtergrond'/>
+ <cd:constant name='backgroundcolor' value='achtergrondkleur'/>
+ <cd:constant name='backgroundcorner' value='achtergrondhoek'/>
+ <cd:constant name='backgrounddepth' value='achtergronddiepte'/>
+ <cd:constant name='backgroundoffset' value='achtergrondoffset'/>
+ <cd:constant name='backgroundradius' value='achtergrondstraal'/>
+ <cd:constant name='backgroundscreen' value='achtergrondraster'/>
+ <cd:constant name='backspace' value='rugwit'/>
+ <cd:constant name='balance' value='balanceren'/>
+ <cd:constant name='before' value='voor'/>
+ <cd:constant name='beforehead' value='kopvoor'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='groot'/>
+ <cd:constant name='blank' value='blanko'/>
+ <cd:constant name='blockway' value='blokwijze'/>
+ <cd:constant name='bodyfont' value='korps'/>
+ <cd:constant name='bookmark' value='bookmark'/>
+ <cd:constant name='bottom' value='onder'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='onderafstand'/>
+ <cd:constant name='bottomframe' value='onderkader'/>
+ <cd:constant name='bottomoffset' value='onderoffset'/>
+ <cd:constant name='bottomspace' value='bodemwit'/>
+ <cd:constant name='bottomstate' value='onderstatus'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='bereken'/>
+ <cd:constant name='ccommand' value='ccommando'/>
+ <cd:constant name='click' value='klik'/>
+ <cd:constant name='clickin' value='klikin'/>
+ <cd:constant name='clickout' value='klikuit'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='sluitactie'/>
+ <cd:constant name='closecommand' value='sluitcommando'/>
+ <cd:constant name='closepageaction' value='sluitpaginaactie'/>
+ <cd:constant name='closesymbol' value='sluitsymbool'/>
+ <cd:constant name='color' value='kleur'/>
+ <cd:constant name='column' value='kolom'/>
+ <cd:constant name='columndistance' value='kolomafstand'/>
+ <cd:constant name='columns' value='kolommen'/>
+ <cd:constant name='command' value='commando'/>
+ <cd:constant name='commandafter' value='nacommando'/>
+ <cd:constant name='commandbefore' value='voorcommando'/>
+ <cd:constant name='commands' value='commandos'/>
+ <cd:constant name='component' value='component'/>
+ <cd:constant name='compoundhyphen' value='koppelteken'/>
+ <cd:constant name='compress' value='comprimeren'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='doorgaan'/>
+ <cd:constant name='contrastcolor' value='contrastkleur'/>
+ <cd:constant name='controls' value='sturing'/>
+ <cd:constant name='conversion' value='conversie'/>
+ <cd:constant name='convertfile' value='converteerfile'/>
+ <cd:constant name='corner' value='hoek'/>
+ <cd:constant name='coupling' value='koppeling'/>
+ <cd:constant name='couplingway' value='koppelwijze'/>
+ <cd:constant name='criterium' value='criterium'/>
+ <cd:constant name='current' value='huidige'/>
+ <cd:constant name='cutspace' value='snijwit'/>
+ <cd:constant name='dash' value='streep'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='datum'/>
+ <cd:constant name='deepnumbercommand' value='diepnummercommando'/>
+ <cd:constant name='deeptextcommand' value='dieptekstcommando'/>
+ <cd:constant name='default' value='default'/>
+ <cd:constant name='delay' value='wachttijd'/>
+ <cd:constant name='depth' value='diepte'/>
+ <cd:constant name='depthcorrection' value='dieptecorrectie'/>
+ <cd:constant name='direction' value='richting'/>
+ <cd:constant name='directory' value='gebied'/>
+ <cd:constant name='display' value='scherm'/>
+ <cd:constant name='distance' value='afstand'/>
+ <cd:constant name='dot' value='punt'/>
+ <cd:constant name='doublesided' value='dubbelzijdig'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='rand'/>
+ <cd:constant name='edgedistance' value='randafstand'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='leeg'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='evenmarge'/>
+ <cd:constant name='expansion' value='expansie'/>
+ <cd:constant name='export' value='exporteer'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='factor'/>
+ <cd:constant name='fallback' value='terugval'/>
+ <cd:constant name='family' value='soort'/>
+ <cd:constant name='fieldbackgroundcolor' value='veldachtergrondkleur'/>
+ <cd:constant name='fieldframecolor' value='veldkaderkleur'/>
+ <cd:constant name='fieldlayer' value='veldlaag'/>
+ <cd:constant name='fieldoffset' value='veldoffset'/>
+ <cd:constant name='file' value='file'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='focus'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusuit'/>
+ <cd:constant name='footer' value='voet'/>
+ <cd:constant name='footerdistance' value='voetafstand'/>
+ <cd:constant name='footerstate' value='voetstatus'/>
+ <cd:constant name='foregroundcolor' value='voorgrondkleur'/>
+ <cd:constant name='foregroundstyle' value='voorgrondletter'/>
+ <cd:constant name='format' value='formatteer'/>
+ <cd:constant name='frame' value='kader'/>
+ <cd:constant name='framecolor' value='kaderkleur'/>
+ <cd:constant name='framecorner' value='kaderhoek'/>
+ <cd:constant name='framedepth' value='kaderdiepte'/>
+ <cd:constant name='frameoffset' value='kaderoffset'/>
+ <cd:constant name='frameradius' value='kaderstraal'/>
+ <cd:constant name='frames' value='hokjes'/>
+ <cd:constant name='from' value='van'/>
+ <cd:constant name='get' value='haal'/>
+ <cd:constant name='global' value='globaal'/>
+ <cd:constant name='grid' value='grid'/>
+ <cd:constant name='hang' value='hang'/>
+ <cd:constant name='headalign' value='kopuitlijnen'/>
+ <cd:constant name='headcolor' value='kopkleur'/>
+ <cd:constant name='headcommand' value='kopcommando'/>
+ <cd:constant name='headconversion' value='kopconversie'/>
+ <cd:constant name='header' value='hoofd'/>
+ <cd:constant name='headerdistance' value='hoofdafstand'/>
+ <cd:constant name='headerstate' value='hoofdstatus'/>
+ <cd:constant name='headlabel' value='koplabel'/>
+ <cd:constant name='headnumber' value='kopnummer'/>
+ <cd:constant name='headstyle' value='kopletter'/>
+ <cd:constant name='height' value='hoogte'/>
+ <cd:constant name='hfactor' value='hfactor'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horoffset' value='rugoffset'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='icommando'/>
+ <cd:constant name='in' value='in'/>
+ <cd:constant name='inbetween' value='tussen'/>
+ <cd:constant name='increment' value='verhoog'/>
+ <cd:constant name='incrementnumber' value='verhoognummer'/>
+ <cd:constant name='indenting' value='inspringen'/>
+ <cd:constant name='indentnext' value='springvolgendein'/>
+ <cd:constant name='indicator' value='aanduiding'/>
+ <cd:constant name='inner' value='binnen'/>
+ <cd:constant name='innermargin' value='binnenmarge'/>
+ <cd:constant name='inputfile' value='inputfile'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='interactie'/>
+ <cd:constant name='interlinespace' value='interlinie'/>
+ <cd:constant name='itemalign' value='itemuitlijnen'/>
+ <cd:constant name='items' value='items'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='sleutelexpansie'/>
+ <cd:constant name='keyword' value='trefwoord'/>
+ <cd:constant name='label' value='label'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='links'/>
+ <cd:constant name='leftcolor' value='linkerkleur'/>
+ <cd:constant name='leftcompoundhyphen' value='linkerkoppelteken'/>
+ <cd:constant name='leftedge' value='linkerrand'/>
+ <cd:constant name='leftedgedistance' value='linkerrandafstand'/>
+ <cd:constant name='leftframe' value='linkerkader'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='linkermarge'/>
+ <cd:constant name='leftmargindistance' value='linkermargeafstand'/>
+ <cd:constant name='leftoffset' value='linkeroffset'/>
+ <cd:constant name='leftquotation' value='linkercitaat'/>
+ <cd:constant name='leftquote' value='linkerciteer'/>
+ <cd:constant name='leftsentence' value='linkerzin'/>
+ <cd:constant name='leftspeech' value='linkeruitspraak'/>
+ <cd:constant name='leftstyle' value='linkerletter'/>
+ <cd:constant name='leftsubsentence' value='linkersubzin'/>
+ <cd:constant name='lefttext' value='linkertekst'/>
+ <cd:constant name='leftwidth' value='linkerbreedte'/>
+ <cd:constant name='level' value='niveau'/>
+ <cd:constant name='levels' value='niveaus'/>
+ <cd:constant name='limittext' value='limiettekst'/>
+ <cd:constant name='line' value='regel'/>
+ <cd:constant name='linecorrection' value='regelcorrectie'/>
+ <cd:constant name='lines' value='regels'/>
+ <cd:constant name='list' value='lijst'/>
+ <cd:constant name='listtext' value='lijsttekst'/>
+ <cd:constant name='local' value='lokaal'/>
+ <cd:constant name='location' value='plaats'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='logos'/>
+ <cd:constant name='marcolor' value='markleur'/>
+ <cd:constant name='margin' value='marge'/>
+ <cd:constant name='margindistance' value='margeafstand'/>
+ <cd:constant name='marginedge' value='kantlijn'/>
+ <cd:constant name='marginedgetext' value='kantlijntekst'/>
+ <cd:constant name='margintext' value='margetekst'/>
+ <cd:constant name='marking' value='markering'/>
+ <cd:constant name='marstyle' value='marletter'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='maxhoogte'/>
+ <cd:constant name='maxwidth' value='maxbreedte'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='menu'/>
+ <cd:constant name='method' value='methode'/>
+ <cd:constant name='middle' value='midden'/>
+ <cd:constant name='middlespeech' value='middenuitspraak'/>
+ <cd:constant name='middletext' value='middentekst'/>
+ <cd:constant name='midsentence' value='middenzin'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='mindiepte'/>
+ <cd:constant name='minheight' value='minhoogte'/>
+ <cd:constant name='minwidth' value='minbreedte'/>
+ <cd:constant name='monthconversion' value='maandconversie'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='naam'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='nonder'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='volgende'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nlinks'/>
+ <cd:constant name='nlines' value='nregels'/>
+ <cd:constant name='norm' value='norm'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='nrechts'/>
+ <cd:constant name='ntop' value='nboven'/>
+ <cd:constant name='number' value='nummer'/>
+ <cd:constant name='numbercolor' value='nummerkleur'/>
+ <cd:constant name='numbercommand' value='nummercommando'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='nummerafstand'/>
+ <cd:constant name='numbering' value='nummeren'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='nummerscheider'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='nummerletter'/>
+ <cd:constant name='numberwidth' value='nummerbreedte'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='object'/>
+ <cd:constant name='obstruction' value='blokkade'/>
+ <cd:constant name='oddmargin' value='onevenmarge'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='openactie'/>
+ <cd:constant name='openpageaction' value='openpaginaactie'/>
+ <cd:constant name='option' value='optie'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='orientatie'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='buitenmarge'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='eigennummer'/>
+ <cd:constant name='page' value='pagina'/>
+ <cd:constant name='pageboundaries' value='paginaovergangen'/>
+ <cd:constant name='pagecolor' value='paginakleur'/>
+ <cd:constant name='pagecommand' value='paginacommando'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='paginanummer'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='paginastatus'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='paginaletter'/>
+ <cd:constant name='palet' value='palet'/>
+ <cd:constant name='paper' value='papier'/>
+ <cd:constant name='paragraph' value='alinea'/>
+ <cd:constant name='place' value='plaatsen'/>
+ <cd:constant name='placehead' value='plaatskop'/>
+ <cd:constant name='placestopper' value='plaatsafsluiter'/>
+ <cd:constant name='position' value='positie'/>
+ <cd:constant name='prefix' value='prefix'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='preset'/>
+ <cd:constant name='preview' value='preview'/>
+ <cd:constant name='previous' value='vorige'/>
+ <cd:constant name='previousnumber' value='vorigenummer'/>
+ <cd:constant name='process' value='proces'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='straal'/>
+ <cd:constant name='random' value='willekeur'/>
+ <cd:constant name='range' value='bereik'/>
+ <cd:constant name='reduction' value='reductie'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='verwijzing'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='refereren'/>
+ <cd:constant name='regionin' value='gebiedin'/>
+ <cd:constant name='regionout' value='gebieduit'/>
+ <cd:constant name='repeat' value='herhaal'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='resetnummer'/>
+ <cd:constant name='resolution' value='resolutie'/>
+ <cd:constant name='right' value='rechts'/>
+ <cd:constant name='rightcolor' value='rechterkleur'/>
+ <cd:constant name='rightcompoundhyphen' value='rechterkoppelteken'/>
+ <cd:constant name='rightedge' value='rechterrand'/>
+ <cd:constant name='rightedgedistance' value='rechterrandafstand'/>
+ <cd:constant name='rightframe' value='rechterkader'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='rechtermarge'/>
+ <cd:constant name='rightmargindistance' value='rechtermargeafstand'/>
+ <cd:constant name='rightoffset' value='rechteroffset'/>
+ <cd:constant name='rightquotation' value='rechtercitaat'/>
+ <cd:constant name='rightquote' value='rechterciteer'/>
+ <cd:constant name='rightsentence' value='rechterzin'/>
+ <cd:constant name='rightspeech' value='rechteruitspraak'/>
+ <cd:constant name='rightstyle' value='rechterletter'/>
+ <cd:constant name='rightsubsentence' value='rechtersubzin'/>
+ <cd:constant name='righttext' value='rechtertekst'/>
+ <cd:constant name='rightwidth' value='rechterbreedte'/>
+ <cd:constant name='rotation' value='rotatie'/>
+ <cd:constant name='rule' value='lijn'/>
+ <cd:constant name='rulecolor' value='lijnkleur'/>
+ <cd:constant name='rulethickness' value='lijndikte'/>
+ <cd:constant name='samepage' value='zelfdepagina'/>
+ <cd:constant name='sample' value='monster'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='schaal'/>
+ <cd:constant name='scope' value='scope'/>
+ <cd:constant name='screen' value='raster'/>
+ <cd:constant name='section' value='sectie'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='sectienummer'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='scheider'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='setups'/>
+ <cd:constant name='side' value='zij'/>
+ <cd:constant name='sidealign' value='zijuitlijnen'/>
+ <cd:constant name='sidemethod' value='zijmethode'/>
+ <cd:constant name='sidespaceafter' value='zijnawit'/>
+ <cd:constant name='sidespacebefore' value='zijvoorwit'/>
+ <cd:constant name='sign' value='teken'/>
+ <cd:constant name='size' value='formaat'/>
+ <cd:constant name='small' value='klein'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='sortering'/>
+ <cd:constant name='source' value='bron'/>
+ <cd:constant name='space' value='spatie'/>
+ <cd:constant name='spaceafter' value='nawit'/>
+ <cd:constant name='spacebefore' value='voorwit'/>
+ <cd:constant name='spaceinbetween' value='tussenwit'/>
+ <cd:constant name='spacing' value='spatiering'/>
+ <cd:constant name='split' value='splitsen'/>
+ <cd:constant name='splitcolor' value='splitskleur'/>
+ <cd:constant name='splitmethod' value='splitsmethode'/>
+ <cd:constant name='splitoffset' value='splitsoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stapel'/>
+ <cd:constant name='start' value='start'/>
+ <cd:constant name='starter' value='opener'/>
+ <cd:constant name='state' value='status'/>
+ <cd:constant name='step' value='stap'/>
+ <cd:constant name='stop' value='stop'/>
+ <cd:constant name='stopper' value='afsluiter'/>
+ <cd:constant name='stretch' value='rek'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='letter'/>
+ <cd:constant name='sub' value='sub'/>
+ <cd:constant name='subtitle' value='subtitel'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symuitlijnen'/>
+ <cd:constant name='symbol' value='symbool'/>
+ <cd:constant name='symbolset' value='symboolset'/>
+ <cd:constant name='symcolor' value='symkleur'/>
+ <cd:constant name='symstyle' value='symletter'/>
+ <cd:constant name='synonym' value='synoniem'/>
+ <cd:constant name='synonymcolor' value='synoniemkleur'/>
+ <cd:constant name='synonymcommand' value='synoniemcommando'/>
+ <cd:constant name='synonymstyle' value='synoniemletter'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='tekst'/>
+ <cd:constant name='textcolor' value='tekstkleur'/>
+ <cd:constant name='textcommand' value='tekstcommando'/>
+ <cd:constant name='textdistance' value='tekstafstand'/>
+ <cd:constant name='textlayer' value='tekstlaag'/>
+ <cd:constant name='textmargin' value='tekstmarge'/>
+ <cd:constant name='textmethod' value='tekstmethode'/>
+ <cd:constant name='textseparator' value='tekstscheider'/>
+ <cd:constant name='textsize' value='tekstformaat'/>
+ <cd:constant name='textstate' value='tekststatus'/>
+ <cd:constant name='textstyle' value='tekstletter'/>
+ <cd:constant name='textwidth' value='tekstbreedte'/>
+ <cd:constant name='title' value='titel'/>
+ <cd:constant name='titlecolor' value='titelkleur'/>
+ <cd:constant name='titlecommand' value='titelcommando'/>
+ <cd:constant name='titledistance' value='titelafstand'/>
+ <cd:constant name='titleleft' value='titellinks'/>
+ <cd:constant name='titleright' value='titelrechts'/>
+ <cd:constant name='titlestyle' value='titelletter'/>
+ <cd:constant name='to' value='aan'/>
+ <cd:constant name='tolerance' value='tolerantie'/>
+ <cd:constant name='top' value='boven'/>
+ <cd:constant name='topdistance' value='bovenafstand'/>
+ <cd:constant name='topframe' value='bovenkader'/>
+ <cd:constant name='topoffset' value='bovenoffset'/>
+ <cd:constant name='topspace' value='kopwit'/>
+ <cd:constant name='topstate' value='bovenstatus'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='type'/>
+ <cd:constant name='unit' value='eenheid'/>
+ <cd:constant name='unknownreference' value='onbekendeverwijzing'/>
+ <cd:constant name='urlalternative' value='urlvariant'/>
+ <cd:constant name='urlspace' value='urlspatie'/>
+ <cd:constant name='validate' value='valideer'/>
+ <cd:constant name='vcommand' value='vcommando'/>
+ <cd:constant name='veroffset' value='kopoffset'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='wijze'/>
+ <cd:constant name='wfactor' value='bfactor'/>
+ <cd:constant name='white' value='wit'/>
+ <cd:constant name='width' value='breedte'/>
+ <cd:constant name='xfactor' value='xfactor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xschaal'/>
+ <cd:constant name='xstep' value='xstap'/>
+ <cd:constant name='yfactor' value='yfactor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='yschaal'/>
+ <cd:constant name='ystep' value='ystap'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language nl -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='antwoordregels'/>
+ <cd:element name='answerspace' value='antwoordruimte'/>
+ <cd:element name='begin' value='beginvan'/>
+ <cd:element name='complete' value='volledige'/>
+ <cd:element name='coupled' value='gekoppelde'/>
+ <cd:element name='currentlocal' value='huidigelokale'/>
+ <cd:element name='emptyone' value='leeg'/>
+ <cd:element name='emptytwo' value='lege'/>
+ <cd:element name='end' value='eindvan'/>
+ <cd:element name='endsetup' value='in'/>
+ <cd:element name='get' value='haal'/>
+ <cd:element name='increment' value='verhoog'/>
+ <cd:element name='list' value='lijst'/>
+ <cd:element name='listof' value='lijstmet'/>
+ <cd:element name='load' value='laad'/>
+ <cd:element name='local' value='lokale'/>
+ <cd:element name='makeup' value='opmaak'/>
+ <cd:element name='next' value='volgende'/>
+ <cd:element name='place' value='plaats'/>
+ <cd:element name='previous' value='vorige'/>
+ <cd:element name='previouslocal' value='vorigelokale'/>
+ <cd:element name='reserve' value='reserveer'/>
+ <cd:element name='see' value='zie'/>
+ <cd:element name='setup' value='stel'/>
+ <cd:element name='start' value='start'/>
+ <cd:element name='stop' value='stop'/>
+ <cd:element name='text' value='tekst'/>
+ <cd:element name='type' value='type'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language nl -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='KAP'/>
+ <cd:command name='Character' value='Letter'/>
+ <cd:command name='Characters' value='Letters'/>
+ <cd:command name='LABELTEXT' value='LABELTEKST'/>
+ <cd:command name='MONTH' value='MAAND'/>
+ <cd:command name='Numbers' value='Cijfers'/>
+ <cd:command name='Romannumerals' value='Romeins'/>
+ <cd:command name='SmallCapped' value='Kap'/>
+ <cd:command name='SmallCaps' value='Kaps'/>
+ <cd:command name='WEEKDAY' value='WEEKDAG'/>
+ <cd:command name='WORD' value='WOORD'/>
+ <cd:command name='WORDS' value='WOORDEN'/>
+ <cd:command name='Word' value='Woord'/>
+ <cd:command name='Words' value='Woorden'/>
+ <cd:command name='about' value='about'/>
+ <cd:command name='adaptlayout' value='paslayoutaan'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='op'/>
+ <cd:command name='atleftmargin' value='oplinkermarge'/>
+ <cd:command name='atpage' value='oppagina'/>
+ <cd:command name='atrightmargin' value='oprechtermarge'/>
+ <cd:command name='background' value='achtergrond'/>
+ <cd:command name='backspace' value='rugwit'/>
+ <cd:command name='blackrule' value='blokje'/>
+ <cd:command name='blackrules' value='blokjes'/>
+ <cd:command name='blank' value='blanko'/>
+ <cd:command name='bookmark' value='bookmark'/>
+ <cd:command name='bottomdistance' value='onderafstand'/>
+ <cd:command name='bottomheight' value='onderhoogte'/>
+ <cd:command name='bottomspace' value='bodemwit'/>
+ <cd:command name='but' value='but'/>
+ <cd:command name='button' value='button'/>
+ <cd:command name='bypassblocks' value='passeerblokken'/>
+ <cd:command name='character' value='letter'/>
+ <cd:command name='characters' value='letters'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='clip'/>
+ <cd:command name='clonefield' value='kloonveld'/>
+ <cd:command name='color' value='kleur'/>
+ <cd:command name='colorbar' value='kleurenbalk'/>
+ <cd:command name='colorvalue' value='kleurwaarde'/>
+ <cd:command name='column' value='kolom'/>
+ <cd:command name='comment' value='commentaar'/>
+ <cd:command name='comparecolorgroup' value='vergelijkkleurgroep'/>
+ <cd:command name='comparepalet' value='vergelijkpalet'/>
+ <cd:command name='completepagenumber' value='volledigepaginanummer'/>
+ <cd:command name='completeregister' value='volledigregister'/>
+ <cd:command name='component' value='onderdeel'/>
+ <cd:command name='convertnumber' value='converteernummer'/>
+ <cd:command name='copyfield' value='copieerveld'/>
+ <cd:command name='correctwhitespace' value='corrigeerwitruimte'/>
+ <cd:command name='coupledocument' value='koppeldocument'/>
+ <cd:command name='couplemarking' value='koppelmarkering'/>
+ <cd:command name='couplepage' value='koppelpagina'/>
+ <cd:command name='couplepaper' value='koppelpapier'/>
+ <cd:command name='coupleregister' value='koppelregister'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='huidigedatum'/>
+ <cd:command name='currentheadnumber' value='huidigekopnummer'/>
+ <cd:command name='cutspace' value='snijwit'/>
+ <cd:command name='date' value='datum'/>
+ <cd:command name='decouplemarking' value='ontkoppelmarkering'/>
+ <cd:command name='decrementnumber' value='verlaagnummer'/>
+ <cd:command name='define' value='definieer'/>
+ <cd:command name='defineaccent' value='definieeraccent'/>
+ <cd:command name='defineblank' value='definieerblanko'/>
+ <cd:command name='defineblock' value='definieerblok'/>
+ <cd:command name='definebodyfont' value='definieerkorps'/>
+ <cd:command name='definebodyfontenvironment' value='definieerkorpsomgeving'/>
+ <cd:command name='definebuffer' value='definieerbuffer'/>
+ <cd:command name='definecharacter' value='definieerkarakter'/>
+ <cd:command name='definecolor' value='definieerkleur'/>
+ <cd:command name='definecolorgroup' value='definieerkleurgroep'/>
+ <cd:command name='definecolumnbreak' value='definieerkolomovergang'/>
+ <cd:command name='definecolumnset' value='definieerkolomgroep'/>
+ <cd:command name='definecombination' value='definieercombinatie'/>
+ <cd:command name='definecombinedlist' value='definieersamengesteldelijst'/>
+ <cd:command name='definecommand' value='definieercommando'/>
+ <cd:command name='defineconversion' value='definieerconversie'/>
+ <cd:command name='definedescription' value='doordefinieren'/>
+ <cd:command name='defineenumeration' value='doornummeren'/>
+ <cd:command name='definefield' value='definieerveld'/>
+ <cd:command name='definefieldstack' value='definieerveldstapel'/>
+ <cd:command name='definefiguresymbol' value='definieerfiguursymbool'/>
+ <cd:command name='definefloat' value='definieerplaatsblok'/>
+ <cd:command name='definefont' value='definieerfont'/>
+ <cd:command name='definefontstyle' value='definieerfontstijl'/>
+ <cd:command name='definefontsynonym' value='definieerfontsynoniem'/>
+ <cd:command name='defineframed' value='definieeromlijnd'/>
+ <cd:command name='defineframedtext' value='definieerkadertekst'/>
+ <cd:command name='definehbox' value='definieerhbox'/>
+ <cd:command name='definehead' value='definieerkop'/>
+ <cd:command name='defineindenting' value='doorspringen'/>
+ <cd:command name='defineinmargin' value='definieerinmarge'/>
+ <cd:command name='defineinteractionmenu' value='definieerinteractiemenu'/>
+ <cd:command name='defineitemgroup' value='definieeritemgroep'/>
+ <cd:command name='definelabel' value='doorlabelen'/>
+ <cd:command name='definelayer' value='definieerlayer'/>
+ <cd:command name='definelayout' value='definieerlayout'/>
+ <cd:command name='definelist' value='definieerlijst'/>
+ <cd:command name='definelogo' value='definieerbeeldmerk'/>
+ <cd:command name='definemainfield' value='definieerhoofdveld'/>
+ <cd:command name='definemakeup' value='definieeropmaak'/>
+ <cd:command name='definemarking' value='definieermarkering'/>
+ <cd:command name='definemathalignment' value='definieerwiskundeuitlijnen'/>
+ <cd:command name='defineoutput' value='definieeruitvoer'/>
+ <cd:command name='defineoverlay' value='definieeroverlay'/>
+ <cd:command name='definepagebreak' value='definieerpaginaovergang'/>
+ <cd:command name='definepalet' value='definieerpalet'/>
+ <cd:command name='definepapersize' value='definieerpapierformaat'/>
+ <cd:command name='defineparagraphs' value='definieeralineas'/>
+ <cd:command name='defineplacement' value='definieerplaats'/>
+ <cd:command name='defineprofile' value='definieerprofiel'/>
+ <cd:command name='defineprogram' value='definieerprogramma'/>
+ <cd:command name='definerawfont' value='definerawfont'/>
+ <cd:command name='definereference' value='definieerreferentie'/>
+ <cd:command name='definereferenceformat' value='definieerreferentieformaat'/>
+ <cd:command name='definereferencelist' value='definieerreferentielijst'/>
+ <cd:command name='defineregister' value='definieerregister'/>
+ <cd:command name='definerule' value='definieerlijn'/>
+ <cd:command name='definesection' value='definieersectie'/>
+ <cd:command name='definesectionblock' value='definieersectieblok'/>
+ <cd:command name='definesorting' value='definieersorteren'/>
+ <cd:command name='definestartstop' value='definieerstartstop'/>
+ <cd:command name='definestyle' value='definieerletter'/>
+ <cd:command name='definesubfield' value='definieersubveld'/>
+ <cd:command name='definesymbol' value='definieersymbool'/>
+ <cd:command name='definesynonyms' value='definieersynoniemen'/>
+ <cd:command name='definetabletemplate' value='definieertabelvorm'/>
+ <cd:command name='definetabulate' value='definieertabulatie'/>
+ <cd:command name='definetext' value='definieertekst'/>
+ <cd:command name='definetextposition' value='definieertekstpositie'/>
+ <cd:command name='definetextvariable' value='definieertekstvariabele'/>
+ <cd:command name='definetype' value='definieertype'/>
+ <cd:command name='definetyping' value='definieertypen'/>
+ <cd:command name='defineversion' value='definieerversie'/>
+ <cd:command name='determineheadnumber' value='bepaalkopnummer'/>
+ <cd:command name='determinelistcharacteristics' value='bepaallijstkenmerken'/>
+ <cd:command name='determineregistercharacteristics' value='bepaalregisterkenmerken'/>
+ <cd:command name='dimension' value='dimensie'/>
+ <cd:command name='disableinteractionmenu' value='blokkeerinteractiemenu'/>
+ <cd:command name='domicile' value='woonplaats'/>
+ <cd:command name='donttest' value='geentest'/>
+ <cd:command name='edgedistance' value='randafstand'/>
+ <cd:command name='edgewidth' value='randbreedte'/>
+ <cd:command name='emptylines' value='legeregels'/>
+ <cd:command name='environment' value='omgeving'/>
+ <cd:command name='externalfigure' value='externfiguur'/>
+ <cd:command name='fact' value='geg'/>
+ <cd:command name='field' value='veld'/>
+ <cd:command name='fieldstack' value='veldstapel'/>
+ <cd:command name='fillinfield' value='invulveld'/>
+ <cd:command name='fillinline' value='invulregel'/>
+ <cd:command name='fillinrules' value='invullijnen'/>
+ <cd:command name='fillintext' value='invultekst'/>
+ <cd:command name='fitfield' value='passendveld'/>
+ <cd:command name='fixedspace' value='vastespatie'/>
+ <cd:command name='fixedspaces' value='vastespaties'/>
+ <cd:command name='followprofile' value='volgprofiel'/>
+ <cd:command name='followprofileversion' value='volgprofielversie'/>
+ <cd:command name='followversion' value='volgversie'/>
+ <cd:command name='footerdistance' value='voetafstand'/>
+ <cd:command name='footerheight' value='voethoogte'/>
+ <cd:command name='footnote' value='voetnoot'/>
+ <cd:command name='footnotetext' value='voetnoottekst'/>
+ <cd:command name='forceblocks' value='forceerblokken'/>
+ <cd:command name='formulanumber' value='formulenummer'/>
+ <cd:command name='fraction' value='breuk'/>
+ <cd:command name='framed' value='omlijnd'/>
+ <cd:command name='from' value='uit'/>
+ <cd:command name='getbuffer' value='haalbuffer'/>
+ <cd:command name='getmarking' value='haalmarkering'/>
+ <cd:command name='getnumber' value='haalnummer'/>
+ <cd:command name='godown' value='omlaag'/>
+ <cd:command name='goto' value='naar'/>
+ <cd:command name='gotobox' value='naarbox'/>
+ <cd:command name='gotopage' value='naarpagina'/>
+ <cd:command name='graycolor' value='grijskleur'/>
+ <cd:command name='greyvalue' value='grijswaarde'/>
+ <cd:command name='grid' value='rooster'/>
+ <cd:command name='hairline' value='haarlijn'/>
+ <cd:command name='head' value='kop'/>
+ <cd:command name='headerdistance' value='hoofdafstand'/>
+ <cd:command name='headerheight' value='hoofdhoogte'/>
+ <cd:command name='headlevel' value='kopniveau'/>
+ <cd:command name='headnumber' value='kopnummer'/>
+ <cd:command name='headsym' value='kopsym'/>
+ <cd:command name='headtext' value='koptekst'/>
+ <cd:command name='hideblocks' value='verbergblokken'/>
+ <cd:command name='high' value='hoog'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='directtussenlijst'/>
+ <cd:command name='immediatetolist' value='directnaarlijst'/>
+ <cd:command name='in' value='in'/>
+ <cd:command name='incrementnumber' value='verhoognummer'/>
+ <cd:command name='indenting' value='inspringen'/>
+ <cd:command name='inframed' value='inlijnd'/>
+ <cd:command name='infull' value='voluit'/>
+ <cd:command name='ininner' value='inbinnen'/>
+ <cd:command name='inleft' value='inlinker'/>
+ <cd:command name='inleftedge' value='inlinkerrand'/>
+ <cd:command name='inleftmargin' value='inlinkermarge'/>
+ <cd:command name='inline' value='inregel'/>
+ <cd:command name='inmargin' value='inmarge'/>
+ <cd:command name='inmframed' value='inwilijnd'/>
+ <cd:command name='inneredgedistance' value='binnenrandafstand'/>
+ <cd:command name='inneredgewidth' value='binnenrandbreedte'/>
+ <cd:command name='innermargindistance' value='binnenmargeafstand'/>
+ <cd:command name='innermarginwidth' value='binnenmargebreedte'/>
+ <cd:command name='inothermargin' value='inanderemarge'/>
+ <cd:command name='inouter' value='inbuiten'/>
+ <cd:command name='inright' value='inrechter'/>
+ <cd:command name='inrightedge' value='inrechterrand'/>
+ <cd:command name='inrightmargin' value='inrechtermarge'/>
+ <cd:command name='installlanguage' value='installeertaal'/>
+ <cd:command name='interactionbar' value='interactiebalk'/>
+ <cd:command name='interactionbuttons' value='interactiebuttons'/>
+ <cd:command name='interactionmenu' value='interactiemenu'/>
+ <cd:command name='item' value='som'/>
+ <cd:command name='items' value='items'/>
+ <cd:command name='its' value='its'/>
+ <cd:command name='keepblocks' value='handhaafblokken'/>
+ <cd:command name='label' value='label'/>
+ <cd:command name='labels' value='labels'/>
+ <cd:command name='labeltext' value='labeltekst'/>
+ <cd:command name='language' value='taal'/>
+ <cd:command name='leftaligned' value='regellinks'/>
+ <cd:command name='leftedgedistance' value='linkerrandafstand'/>
+ <cd:command name='leftedgewidth' value='linkerrandbreedte'/>
+ <cd:command name='leftmargindistance' value='linkermargeafstand'/>
+ <cd:command name='leftmarginwidth' value='linkermargebreedte'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='lijndikte'/>
+ <cd:command name='listheight' value='lijsthoogte'/>
+ <cd:command name='listlength' value='lijstlengte'/>
+ <cd:command name='listsymbol' value='lijstsymbool'/>
+ <cd:command name='listwidth' value='lijstbreedte'/>
+ <cd:command name='logfields' value='registreervelden'/>
+ <cd:command name='lohi' value='laho'/>
+ <cd:command name='low' value='laag'/>
+ <cd:command name='macroname' value='naam'/>
+ <cd:command name='mainlanguage' value='hoofdtaal'/>
+ <cd:command name='makeupheight' value='zethoogte'/>
+ <cd:command name='makeupwidth' value='zetbreedte'/>
+ <cd:command name='mar' value='mar'/>
+ <cd:command name='margindistance' value='margeafstand'/>
+ <cd:command name='marginrule' value='kantlijn'/>
+ <cd:command name='margintext' value='margetekst'/>
+ <cd:command name='margintitle' value='margetitel'/>
+ <cd:command name='marginwidth' value='margebreedte'/>
+ <cd:command name='marginword' value='margewoord'/>
+ <cd:command name='marking' value='markeer'/>
+ <cd:command name='markversion' value='markeerversie'/>
+ <cd:command name='mathematics' value='wiskunde'/>
+ <cd:command name='menubutton' value='menubutton'/>
+ <cd:command name='mframed' value='wilijnd'/>
+ <cd:command name='midaligned' value='regelmidden'/>
+ <cd:command name='mirror' value='spiegel'/>
+ <cd:command name='month' value='maand'/>
+ <cd:command name='moveformula' value='verplaatsformule'/>
+ <cd:command name='moveongrid' value='verplaatsopgrid'/>
+ <cd:command name='movesidefloat' value='verplaatszijblok'/>
+ <cd:command name='navigating' value='navigerend'/>
+ <cd:command name='nodimension' value='geendimensie'/>
+ <cd:command name='noheaderandfooterlines' value='geenhoofdenvoetregels'/>
+ <cd:command name='noindenting' value='nietinspringen'/>
+ <cd:command name='nolist' value='geenlijst'/>
+ <cd:command name='nomarking' value='geenmarkering'/>
+ <cd:command name='nomoreblocks' value='geenblokkenmeer'/>
+ <cd:command name='nomorefiles' value='geenfilesmeer'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='geenspatie'/>
+ <cd:command name='note' value='noot'/>
+ <cd:command name='notopandbottomlines' value='geenbovenenonderregels'/>
+ <cd:command name='notsmallcapped' value='nokap'/>
+ <cd:command name='nowhitespace' value='geenwitruimte'/>
+ <cd:command name='numberofsubpages' value='aantalsubpaginas'/>
+ <cd:command name='numbers' value='cijfers'/>
+ <cd:command name='outeredgedistance' value='buitenrandafstand'/>
+ <cd:command name='outeredgewidth' value='buitenrandbreedte'/>
+ <cd:command name='outermargindistance' value='buitenmargeafstand'/>
+ <cd:command name='outermarginwidth' value='buitenmargebreedte'/>
+ <cd:command name='packed' value='opelkaar'/>
+ <cd:command name='page' value='pagina'/>
+ <cd:command name='pagedepth' value='paginadiepte'/>
+ <cd:command name='pagenumber' value='paginanummer'/>
+ <cd:command name='pageoffset' value='paginaoffset'/>
+ <cd:command name='pagereference' value='paginareferentie'/>
+ <cd:command name='pagetype' value='soortpagina'/>
+ <cd:command name='paperheight' value='papierhoogte'/>
+ <cd:command name='paperwidth' value='papierbreedte'/>
+ <cd:command name='periods' value='punten'/>
+ <cd:command name='plaatsruwelijst' value='plaatsruwelijst'/>
+ <cd:command name='placebookmarks' value='plaatsbookmarks'/>
+ <cd:command name='placecombinedlist' value='plaatssamengesteldelijst'/>
+ <cd:command name='placefloat' value='plaatsplaatsblok'/>
+ <cd:command name='placefootnotes' value='plaatsvoetnoten'/>
+ <cd:command name='placeformula' value='plaatsformule'/>
+ <cd:command name='placeheadnumber' value='plaatskopnummer'/>
+ <cd:command name='placeheadtext' value='plaatskoptekst'/>
+ <cd:command name='placelegend' value='plaatslegenda'/>
+ <cd:command name='placelist' value='plaatslijst'/>
+ <cd:command name='placelocalfootnotes' value='plaatslokalevoetnoten'/>
+ <cd:command name='placelogos' value='plaatsbeeldmerken'/>
+ <cd:command name='placeongrid' value='plaatsopgrid'/>
+ <cd:command name='placeontopofeachother' value='plaatsonderelkaar'/>
+ <cd:command name='placepagenumber' value='plaatspaginanummer'/>
+ <cd:command name='placereferencelist' value='plaatsreferentielijst'/>
+ <cd:command name='placeregister' value='plaatsregister'/>
+ <cd:command name='placerule' value='plaatslijn'/>
+ <cd:command name='placesidebyside' value='plaatsnaastelkaar'/>
+ <cd:command name='placesubformula' value='plaatssubformule'/>
+ <cd:command name='placetextvariable' value='plaatstekstvariabele'/>
+ <cd:command name='position' value='positioneer'/>
+ <cd:command name='positiontext' value='positioneertekst'/>
+ <cd:command name='printpaperheight' value='printpapierhoogte'/>
+ <cd:command name='printpaperwidth' value='printpapierbreedte'/>
+ <cd:command name='processblocks' value='verwerkblokken'/>
+ <cd:command name='processpage' value='verwerkpagina'/>
+ <cd:command name='product' value='produkt'/>
+ <cd:command name='program' value='programma'/>
+ <cd:command name='project' value='projekt'/>
+ <cd:command name='publication' value='publicatie'/>
+ <cd:command name='quotation' value='citaat'/>
+ <cd:command name='quote' value='citeer'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='herhaal'/>
+ <cd:command name='ref' value='ref'/>
+ <cd:command name='reference' value='referentie'/>
+ <cd:command name='referral' value='kenmerk'/>
+ <cd:command name='referraldate' value='kenmerkdatum'/>
+ <cd:command name='referring' value='refereer'/>
+ <cd:command name='remark' value='toelichting'/>
+ <cd:command name='reset' value='reset'/>
+ <cd:command name='resetmarking' value='resetmarkering'/>
+ <cd:command name='resetnumber' value='resetnummer'/>
+ <cd:command name='resettext' value='resettekstinhoud'/>
+ <cd:command name='rightaligned' value='regelrechts'/>
+ <cd:command name='rightedgedistance' value='rechterrandafstand'/>
+ <cd:command name='rightedgewidth' value='rechterrandbreedte'/>
+ <cd:command name='rightmargindistance' value='rechtermargeafstand'/>
+ <cd:command name='rightmarginwidth' value='rechtermargebreedte'/>
+ <cd:command name='romannumerals' value='romeins'/>
+ <cd:command name='rotate' value='roteer'/>
+ <cd:command name='scale' value='schaal'/>
+ <cd:command name='screen' value='scherm'/>
+ <cd:command name='selectblocks' value='selecteerblokken'/>
+ <cd:command name='selectpaper' value='selecteerpapier'/>
+ <cd:command name='selectversion' value='selecteerversie'/>
+ <cd:command name='setnumber' value='setnummer'/>
+ <cd:command name='settextcontent' value='steltekstinhoudin'/>
+ <cd:command name='settextvariable' value='kentekstvariabeletoe'/>
+ <cd:command name='setupalign' value='steluitlijnenin'/>
+ <cd:command name='setupanswerarea' value='stelantwoordgebiedin'/>
+ <cd:command name='setuparranging' value='stelarrangerenin'/>
+ <cd:command name='setupbackground' value='stelachtergrondin'/>
+ <cd:command name='setupbackgrounds' value='stelachtergrondenin'/>
+ <cd:command name='setupblackrules' value='stelblokjesin'/>
+ <cd:command name='setupblank' value='stelblankoin'/>
+ <cd:command name='setupblock' value='stelblokin'/>
+ <cd:command name='setupbodyfont' value='stelkorpsin'/>
+ <cd:command name='setupbodyfontenvironment' value='stelkorpsomgevingin'/>
+ <cd:command name='setupbottom' value='stelonderin'/>
+ <cd:command name='setupbottomtexts' value='stelondertekstenin'/>
+ <cd:command name='setupbuffer' value='stelbufferin'/>
+ <cd:command name='setupbuttons' value='stelbuttonsin'/>
+ <cd:command name='setupcapitals' value='stelkapitalenin'/>
+ <cd:command name='setupcaption' value='stelblokkopjein'/>
+ <cd:command name='setupcaptions' value='stelblokkopjesin'/>
+ <cd:command name='setupclipping' value='stelclipin'/>
+ <cd:command name='setupcolor' value='stelkleurin'/>
+ <cd:command name='setupcolors' value='stelkleurenin'/>
+ <cd:command name='setupcolumns' value='stelkolommenin'/>
+ <cd:command name='setupcolumnset' value='stelkolomgroepin'/>
+ <cd:command name='setupcolumnsetlines' value='stelkolomgroepregelsin'/>
+ <cd:command name='setupcolumnsetstart' value='stelkolomgroepstartin'/>
+ <cd:command name='setupcombinations' value='stelcombinatiesin'/>
+ <cd:command name='setupcombinedlist' value='stelsamengesteldelijstin'/>
+ <cd:command name='setupcomment' value='stelcommentaarin'/>
+ <cd:command name='setupdescriptions' value='steldoordefinierenin'/>
+ <cd:command name='setupenumerations' value='steldoornummerenin'/>
+ <cd:command name='setupexternalfigures' value='stelexternefigurenin'/>
+ <cd:command name='setupfield' value='stelveldin'/>
+ <cd:command name='setupfields' value='stelveldenin'/>
+ <cd:command name='setupfillinlines' value='stelinvulregelsin'/>
+ <cd:command name='setupfillinrules' value='stelinvullijnenin'/>
+ <cd:command name='setupfloat' value='stelplaatsblokin'/>
+ <cd:command name='setupfloats' value='stelplaatsblokkenin'/>
+ <cd:command name='setupfloatsplitting' value='stelplaatsbloksplitsenin'/>
+ <cd:command name='setupfooter' value='stelvoetin'/>
+ <cd:command name='setupfootertexts' value='stelvoettekstenin'/>
+ <cd:command name='setupfootnotedefinition' value='stelvoetnootdefinitiein'/>
+ <cd:command name='setupfootnotes' value='stelvoetnotenin'/>
+ <cd:command name='setupforms' value='stelformulierenin'/>
+ <cd:command name='setupformulas' value='stelformulesin'/>
+ <cd:command name='setupframed' value='stelomlijndin'/>
+ <cd:command name='setupframedtexts' value='stelkadertekstenin'/>
+ <cd:command name='setuphead' value='stelkopin'/>
+ <cd:command name='setupheader' value='stelhoofdin'/>
+ <cd:command name='setupheadertexts' value='stelhoofdtekstenin'/>
+ <cd:command name='setupheadnumber' value='stelkopnummerin'/>
+ <cd:command name='setupheads' value='stelkoppenin'/>
+ <cd:command name='setupheadtext' value='stelkoptekstin'/>
+ <cd:command name='setuphyphenmark' value='stelkoppeltekenin'/>
+ <cd:command name='setupindentations' value='steldoorspringenin'/>
+ <cd:command name='setupindenting' value='stelinspringenin'/>
+ <cd:command name='setupinmargin' value='stelinmargein'/>
+ <cd:command name='setupinteraction' value='stelinteractiein'/>
+ <cd:command name='setupinteractionbar' value='stelinteractiebalkin'/>
+ <cd:command name='setupinteractionmenu' value='stelinteractiemenuin'/>
+ <cd:command name='setupinteractionscreen' value='stelinteractieschermin'/>
+ <cd:command name='setupinterlinespace' value='stelinterliniein'/>
+ <cd:command name='setupitemgroup' value='stelitemgroepin'/>
+ <cd:command name='setupitemgroups' value='stelopsommingenin'/>
+ <cd:command name='setupitems' value='stelitemsin'/>
+ <cd:command name='setuplabeltext' value='stellabeltekstin'/>
+ <cd:command name='setuplanguage' value='steltaalin'/>
+ <cd:command name='setuplayout' value='stellayoutin'/>
+ <cd:command name='setuplegend' value='stellegendain'/>
+ <cd:command name='setuplinenumbering' value='stelregelnummerenin'/>
+ <cd:command name='setuplines' value='stelregelsin'/>
+ <cd:command name='setuplinewidth' value='stellijndiktein'/>
+ <cd:command name='setuplist' value='stellijstin'/>
+ <cd:command name='setupmakeup' value='stelopmaakin'/>
+ <cd:command name='setupmarginblocks' value='stelmargeblokkenin'/>
+ <cd:command name='setupmarginrules' value='stelkantlijnin'/>
+ <cd:command name='setupmarking' value='stelmarkeringin'/>
+ <cd:command name='setupmathalignment' value='stelwiskundeuitlijnenin'/>
+ <cd:command name='setupnarrower' value='stelsmallerin'/>
+ <cd:command name='setupnumber' value='stelnummerin'/>
+ <cd:command name='setupnumbering' value='stelnummerenin'/>
+ <cd:command name='setupoppositeplacing' value='stelnaastplaatsenin'/>
+ <cd:command name='setupoutput' value='steluitvoerin'/>
+ <cd:command name='setuppagecomment' value='stelpaginacommentaarin'/>
+ <cd:command name='setuppagenumber' value='stelpaginanummerin'/>
+ <cd:command name='setuppagenumbering' value='stelpaginanummeringin'/>
+ <cd:command name='setuppagetransitions' value='stelpaginaovergangenin'/>
+ <cd:command name='setuppalet' value='stelpaletin'/>
+ <cd:command name='setuppaper' value='stelpapierin'/>
+ <cd:command name='setuppapersize' value='stelpapierformaatin'/>
+ <cd:command name='setupparagraphnumbering' value='stelparagraafnummerenin'/>
+ <cd:command name='setupparagraphs' value='stelalineasin'/>
+ <cd:command name='setupplacement' value='stelplaatsin'/>
+ <cd:command name='setuppositioning' value='stelpositionerenin'/>
+ <cd:command name='setupprofiles' value='stelprofielenin'/>
+ <cd:command name='setupprograms' value='stelprogrammasin'/>
+ <cd:command name='setuppublications' value='stelpublicatiesin'/>
+ <cd:command name='setupquote' value='stelciterenin'/>
+ <cd:command name='setupreferencelist' value='stelreferentielijstin'/>
+ <cd:command name='setupreferencing' value='stelrefererenin'/>
+ <cd:command name='setupregister' value='stelregisterin'/>
+ <cd:command name='setuprotate' value='stelroterenin'/>
+ <cd:command name='setuprule' value='stellijnin'/>
+ <cd:command name='setups' value='instellingen'/>
+ <cd:command name='setupscreens' value='stelrastersin'/>
+ <cd:command name='setupsection' value='stelsectiein'/>
+ <cd:command name='setupsectionblock' value='stelsectieblokin'/>
+ <cd:command name='setupsorting' value='stelsorterenin'/>
+ <cd:command name='setupspacing' value='stelspatieringin'/>
+ <cd:command name='setupstartstop' value='stelstartstopin'/>
+ <cd:command name='setupstrut' value='stelstrutin'/>
+ <cd:command name='setupsubpagenumber' value='stelsubpaginanummerin'/>
+ <cd:command name='setupsymbolset' value='stelsymboolsetin'/>
+ <cd:command name='setupsynchronization' value='stelsynchronisatiein'/>
+ <cd:command name='setupsynchronizationbar' value='stelsynchronisatiebalkin'/>
+ <cd:command name='setupsynonyms' value='stelsynoniemenin'/>
+ <cd:command name='setupsystem' value='stelsysteemin'/>
+ <cd:command name='setuptab' value='steltabin'/>
+ <cd:command name='setuptables' value='steltabellenin'/>
+ <cd:command name='setuptabulate' value='steltabulatiein'/>
+ <cd:command name='setuptext' value='steltekstin'/>
+ <cd:command name='setuptextposition' value='steltekstpositiein'/>
+ <cd:command name='setuptextrules' value='steltekstlijnenin'/>
+ <cd:command name='setuptexttexts' value='stelteksttekstenin'/>
+ <cd:command name='setuptextvariable' value='steltekstvariabelein'/>
+ <cd:command name='setupthinrules' value='steldunnelijnenin'/>
+ <cd:command name='setuptolerance' value='steltolerantiein'/>
+ <cd:command name='setuptop' value='stelbovenin'/>
+ <cd:command name='setuptoptexts' value='stelboventekstenin'/>
+ <cd:command name='setuptype' value='steltypein'/>
+ <cd:command name='setuptyping' value='steltypenin'/>
+ <cd:command name='setupunderbar' value='stelonderstrepenin'/>
+ <cd:command name='setupurl' value='stelurlin'/>
+ <cd:command name='setupversions' value='stelversiesin'/>
+ <cd:command name='setupwhitespace' value='stelwitruimtein'/>
+ <cd:command name='showbodyfont' value='toonkorps'/>
+ <cd:command name='showbodyfontenvironment' value='toonkorpsomgeving'/>
+ <cd:command name='showcolor' value='toonkleur'/>
+ <cd:command name='showcolorgroup' value='toonkleurgroep'/>
+ <cd:command name='showexternalfigures' value='toonexternefiguren'/>
+ <cd:command name='showfields' value='toonvelden'/>
+ <cd:command name='showframe' value='toonkader'/>
+ <cd:command name='showgrid' value='toongrid'/>
+ <cd:command name='showlayout' value='toonlayout'/>
+ <cd:command name='showmakeup' value='toonopmaak'/>
+ <cd:command name='showpalet' value='toonpalet'/>
+ <cd:command name='showprint' value='toonprint'/>
+ <cd:command name='showsetups' value='tooninstellingen'/>
+ <cd:command name='showstruts' value='toonstruts'/>
+ <cd:command name='showsymbolset' value='toonsymboolset'/>
+ <cd:command name='smallcapped' value='kap'/>
+ <cd:command name='someline' value='eenregel'/>
+ <cd:command name='somewhere' value='ergens'/>
+ <cd:command name='space' value='spatie'/>
+ <cd:command name='splitfloat' value='splitsplaatsblok'/>
+ <cd:command name='startalignment' value='startuitlijnen'/>
+ <cd:command name='startbackground' value='startachtergrond'/>
+ <cd:command name='startcoding' value='startcodering'/>
+ <cd:command name='startcolor' value='startkleur'/>
+ <cd:command name='startcolumnmakeup' value='startkolomopmaak'/>
+ <cd:command name='startcolumns' value='startkolommen'/>
+ <cd:command name='startcolumnset' value='startkolomgroep'/>
+ <cd:command name='startcombination' value='startcombinatie'/>
+ <cd:command name='startcomponent' value='startonderdeel'/>
+ <cd:command name='startdocument' value='startdocument'/>
+ <cd:command name='startenvironment' value='startomgeving'/>
+ <cd:command name='startfigure' value='startfiguur'/>
+ <cd:command name='startglobal' value='startglobaal'/>
+ <cd:command name='startline' value='startregel'/>
+ <cd:command name='startlinecorrection' value='startregelcorrectie'/>
+ <cd:command name='startlinenumbering' value='startregelnummeren'/>
+ <cd:command name='startlines' value='startregels'/>
+ <cd:command name='startlocal' value='startlokaal'/>
+ <cd:command name='startlocalfootnotes' value='startlokalevoetnoten'/>
+ <cd:command name='startmakeup' value='startopmaak'/>
+ <cd:command name='startmarginblock' value='startmargeblok'/>
+ <cd:command name='startmarginrule' value='startkantlijn'/>
+ <cd:command name='startnarrower' value='startsmaller'/>
+ <cd:command name='startopposite' value='startnaast'/>
+ <cd:command name='startoverlay' value='startoverlay'/>
+ <cd:command name='startoverzicht' value='startoverzicht'/>
+ <cd:command name='startpacked' value='startopelkaar'/>
+ <cd:command name='startpositioning' value='startpositioneren'/>
+ <cd:command name='startproduct' value='startprodukt'/>
+ <cd:command name='startprofile' value='startprofiel'/>
+ <cd:command name='startproject' value='startprojekt'/>
+ <cd:command name='startquotation' value='startcitaat'/>
+ <cd:command name='startraster' value='startraster'/>
+ <cd:command name='startsymbolset' value='startsymboolset'/>
+ <cd:command name='startsynchronization' value='startsynchronisatie'/>
+ <cd:command name='starttable' value='starttabel'/>
+ <cd:command name='starttables' value='starttabellen'/>
+ <cd:command name='starttext' value='starttekst'/>
+ <cd:command name='starttextrule' value='starttekstlijn'/>
+ <cd:command name='startunpacked' value='startvanelkaar'/>
+ <cd:command name='startversion' value='startversie'/>
+ <cd:command name='stopalignment' value='stopuitlijnen'/>
+ <cd:command name='stopbackground' value='stopachtergrond'/>
+ <cd:command name='stopcoding' value='stopcodering'/>
+ <cd:command name='stopcolor' value='stopkleur'/>
+ <cd:command name='stopcolumnmakeup' value='stopkolomopmaak'/>
+ <cd:command name='stopcolumns' value='stopkolommen'/>
+ <cd:command name='stopcolumnset' value='stopkolomgroep'/>
+ <cd:command name='stopcombination' value='stopcombinatie'/>
+ <cd:command name='stopcomponent' value='stoponderdeel'/>
+ <cd:command name='stopdocument' value='stopdocument'/>
+ <cd:command name='stopenvironment' value='stopomgeving'/>
+ <cd:command name='stopglobal' value='stopglobaal'/>
+ <cd:command name='stopline' value='stopregel'/>
+ <cd:command name='stoplinecorrection' value='stopregelcorrectie'/>
+ <cd:command name='stoplinenumbering' value='stopregelnummeren'/>
+ <cd:command name='stoplines' value='stopregels'/>
+ <cd:command name='stoplocal' value='stoplokaal'/>
+ <cd:command name='stoplocalfootnotes' value='stoplokalevoetnoten'/>
+ <cd:command name='stopmakeup' value='stopopmaak'/>
+ <cd:command name='stopmarginblock' value='stopmargeblok'/>
+ <cd:command name='stopmarginrule' value='stopkantlijn'/>
+ <cd:command name='stopnarrower' value='stopsmaller'/>
+ <cd:command name='stopopposite' value='stopnaast'/>
+ <cd:command name='stopoverlay' value='stopoverlay'/>
+ <cd:command name='stopoverzicht' value='stopoverzicht'/>
+ <cd:command name='stoppacked' value='stopopelkaar'/>
+ <cd:command name='stoppositioning' value='stoppositioneren'/>
+ <cd:command name='stopproduct' value='stopprodukt'/>
+ <cd:command name='stopprofile' value='stopprofiel'/>
+ <cd:command name='stopproject' value='stopprojekt'/>
+ <cd:command name='stopquotation' value='stopcitaat'/>
+ <cd:command name='stopraster' value='stopraster'/>
+ <cd:command name='stopsynchronization' value='stopsynchronisatie'/>
+ <cd:command name='stoptable' value='stoptabel'/>
+ <cd:command name='stoptables' value='stoptabellen'/>
+ <cd:command name='stoptext' value='stoptekst'/>
+ <cd:command name='stoptextrule' value='stoptekstlijn'/>
+ <cd:command name='stopunpacked' value='stopvanelkaar'/>
+ <cd:command name='stopversion' value='stopversie'/>
+ <cd:command name='stretched' value='uitgerekt'/>
+ <cd:command name='subformulanumber' value='subformulenummer'/>
+ <cd:command name='subpagenumber' value='subpaginanummer'/>
+ <cd:command name='switchtobodyfont' value='switchnaarkorps'/>
+ <cd:command name='switchtorawfont' value='switchtorawfont'/>
+ <cd:command name='sym' value='sym'/>
+ <cd:command name='symbol' value='symbool'/>
+ <cd:command name='synchronizationbar' value='synchronisatiebalk'/>
+ <cd:command name='synchronize' value='synchroniseer'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testkolom'/>
+ <cd:command name='testpage' value='testpagina'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='teksthoogte'/>
+ <cd:command name='textreference' value='tekstreferentie'/>
+ <cd:command name='textrule' value='tekstlijn'/>
+ <cd:command name='textvariable' value='tekstvariabele'/>
+ <cd:command name='textwidth' value='tekstbreedte'/>
+ <cd:command name='thinrule' value='dunnelijn'/>
+ <cd:command name='thinrules' value='dunnelijnen'/>
+ <cd:command name='tooltip' value='suggestie'/>
+ <cd:command name='topdistance' value='bovenafstand'/>
+ <cd:command name='topheight' value='bovenhoogte'/>
+ <cd:command name='topspace' value='kopwit'/>
+ <cd:command name='totalnumberofpages' value='totaalaantalpaginas'/>
+ <cd:command name='translate' value='vertaal'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='typ'/>
+ <cd:command name='type' value='type'/>
+ <cd:command name='typebuffer' value='typebuffer'/>
+ <cd:command name='typefile' value='typefile'/>
+ <cd:command name='unitmeaning' value='betekenis'/>
+ <cd:command name='unknown' value='onbekend'/>
+ <cd:command name='useJSscripts' value='gebruikJSscripts'/>
+ <cd:command name='useURL' value='gebruikURL'/>
+ <cd:command name='useXMLfilter' value='gebruikXMLfilter'/>
+ <cd:command name='useblocks' value='gebruikblokken'/>
+ <cd:command name='usecommands' value='gebruikcommandos'/>
+ <cd:command name='useencoding' value='usecodering'/>
+ <cd:command name='useexternaldocument' value='gebruikexterndocument'/>
+ <cd:command name='useexternalfigure' value='gebruikexternfiguur'/>
+ <cd:command name='useexternalfile' value='gebruikexternefile'/>
+ <cd:command name='useexternalfiles' value='gebruikexternefiles'/>
+ <cd:command name='useexternalsoundtrack' value='gebruikexterngeluidsfragment'/>
+ <cd:command name='usemodule' value='gebruikmodule'/>
+ <cd:command name='usemodules' value='gebruikmodules'/>
+ <cd:command name='usepath' value='gebruikgebied'/>
+ <cd:command name='usereferences' value='gebruikreferenties'/>
+ <cd:command name='usespecials' value='gebruikspecials'/>
+ <cd:command name='usesymbols' value='gebruiksymbolen'/>
+ <cd:command name='usetypescript' value='gebruiktypescript'/>
+ <cd:command name='usetypescriptfile' value='gebruiktypescriptfile'/>
+ <cd:command name='useurl' value='gebruikurl'/>
+ <cd:command name='version' value='versie'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='weekdag'/>
+ <cd:command name='whitespace' value='witruimte'/>
+ <cd:command name='wordright' value='woordrechts'/>
+ <cd:command name='writebetweenlist' value='schrijftussenlijst'/>
+ <cd:command name='writetolist' value='schrijfnaarlijst'/>
+ <cd:command name='writetoreferencelist' value='schrijfnaarreferentielijst'/>
+ <cd:command name='writetoregister' value='schrijfnaarregister'/>
+ </cd:command>
+
+</cd:interface> \ 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..2b0a3f25b
--- /dev/null
+++ b/tex/context/interface/keys-pe.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='pe' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language pe -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='جمع'/>
+ <cd:variable name='Balloon' value='بادکنک'/>
+ <cd:variable name='Character' value='Character'/>
+ <cd:variable name='Characters' value='Characters'/>
+ <cd:variable name='CloseDocument' value='بستن‌نوشتار'/>
+ <cd:variable name='ExitViewer' value='خروج‌نمایشگر'/>
+ <cd:variable name='FirstPage' value='صفحه‌اول'/>
+ <cd:variable name='FitHeight' value='پرکردن‌ارتفاع'/>
+ <cd:variable name='FitWidth' value='پرکردن‌عرض'/>
+ <cd:variable name='GotoPage' value='برو‌به‌صفحه'/>
+ <cd:variable name='Greek' value='یونانی'/>
+ <cd:variable name='Help' value='کمک'/>
+ <cd:variable name='HideField' value='پنهان‌میدان'/>
+ <cd:variable name='HideLayer' value='پنهان‌لایه'/>
+ <cd:variable name='Key' value='کلید'/>
+ <cd:variable name='LastPage' value='صفحه‌آخر'/>
+ <cd:variable name='LoadForm' value='بارگذاشتن‌فرم'/>
+ <cd:variable name='MONTH' value='ماه'/>
+ <cd:variable name='New' value='جدید'/>
+ <cd:variable name='NextJump' value='پرش‌بعدی'/>
+ <cd:variable name='NextPage' value='صفحه‌بعدی'/>
+ <cd:variable name='Numbers' value='شماره‌ها'/>
+ <cd:variable name='OpenNamedDocument' value='بازکردن‌نوشتار‌ذخیره‌شده'/>
+ <cd:variable name='Paragraph' value='پاراگراف'/>
+ <cd:variable name='PauseMovie' value='ایست‌فیلم'/>
+ <cd:variable name='PauseRendering' value='توقف‌تعبیر'/>
+ <cd:variable name='PauseSound' value='ایست‌صدا'/>
+ <cd:variable name='PreviousJump' value='پرش‌قبلی'/>
+ <cd:variable name='PreviousPage' value='صفحه‌قبلی'/>
+ <cd:variable name='PrintDocument' value='چاپ‌نوشتار'/>
+ <cd:variable name='Query' value='پرسش'/>
+ <cd:variable name='QueryAgain' value='پرسش‌دوباره'/>
+ <cd:variable name='ResetForm' value='دوباره‌نشانی‌فرم'/>
+ <cd:variable name='ResumeMovie' value='ادامه‌فیلم'/>
+ <cd:variable name='ResumeRendering' value='ادامه‌تعبیر'/>
+ <cd:variable name='ResumeSound' value='ادامه‌صدا'/>
+ <cd:variable name='Romannumerals' value='اعداد‌بزرگ‌لاتین'/>
+ <cd:variable name='SaveDocument' value='ذخیره‌نوشتار'/>
+ <cd:variable name='SaveForm' value='ذخیره‌فرم'/>
+ <cd:variable name='SaveNamedDocument' value='ذخیره‌نوشتار‌بانام'/>
+ <cd:variable name='SearchAgain' value='جستجوی‌دوباره'/>
+ <cd:variable name='SearchDocument' value='جستجوی‌نوشتار'/>
+ <cd:variable name='ShowBookmarks' value='نمایش‌چوبخط'/>
+ <cd:variable name='ShowField' value='نمایش‌میدان'/>
+ <cd:variable name='ShowThumbs' value='نمایش‌شصت'/>
+ <cd:variable name='StartMovie' value='شروع‌فیلم'/>
+ <cd:variable name='StartRendering' value='شروع‌تعبیر'/>
+ <cd:variable name='StartSound' value='شروع‌صدا'/>
+ <cd:variable name='StopMovie' value='پایان‌فیلم'/>
+ <cd:variable name='StopRendering' value='پایان‌تعبیر'/>
+ <cd:variable name='StopSound' value='پایان‌صدا'/>
+ <cd:variable name='SubmitForm' value='تسلیم‌فرم'/>
+ <cd:variable name='ToggleLayer' value='تغییرلایه'/>
+ <cd:variable name='ToggleViewer' value='تغییرنمایشگر'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='کمک‌نمایشگر'/>
+ <cd:variable name='WEEKDAY' value='روزهفته'/>
+ <cd:variable name='WORD' value='کلمه'/>
+ <cd:variable name='abbreviation' value='اختصار'/>
+ <cd:variable name='abbreviations' value='اختصارات'/>
+ <cd:variable name='absolute' value='قطعی'/>
+ <cd:variable name='action' value='کنش'/>
+ <cd:variable name='after' value='بعداز'/>
+ <cd:variable name='all' value='همه'/>
+ <cd:variable name='always' value='همواره'/>
+ <cd:variable name='answerarea' value='answerarea'/>
+ <cd:variable name='appendices' value='پیوستها'/>
+ <cd:variable name='appendix' value='پیوست'/>
+ <cd:variable name='april' value='آوریل'/>
+ <cd:variable name='atmargin' value='درحاشیه'/>
+ <cd:variable name='atpage' value='درصفحه'/>
+ <cd:variable name='august' value='آگوست'/>
+ <cd:variable name='author' value='author'/>
+ <cd:variable name='auto' value='خودکار'/>
+ <cd:variable name='autointro' value='پیشگفتارخودکار'/>
+ <cd:variable name='back' value='پشت'/>
+ <cd:variable name='background' value='پس‌زمینه'/>
+ <cd:variable name='backmatter' value='پس‌مطلب'/>
+ <cd:variable name='backpart' value='پس‌قسمت'/>
+ <cd:variable name='backspace' value='فضای‌پشت'/>
+ <cd:variable name='backward' value='عقب‌گرد'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='قبل‌از'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='بزرگ'/>
+ <cd:variable name='bigbodyfont' value='قلم‌بدنه‌بزرگ'/>
+ <cd:variable name='bigpreference' value='اولویت‌بزرگ'/>
+ <cd:variable name='blank' value='خالی'/>
+ <cd:variable name='blockquote' value='نقل‌بلوک'/>
+ <cd:variable name='bodymatter' value='مطلب‌بدنه'/>
+ <cd:variable name='bodypart' value='قسمت‌بدنه'/>
+ <cd:variable name='bold' value='مشکی'/>
+ <cd:variable name='bolditalic' value='ایتالیک‌مشکی'/>
+ <cd:variable name='boldslanted' value='خوابیده‌مشکی'/>
+ <cd:variable name='bookmark' value='چوبخط'/>
+ <cd:variable name='both' value='هردو'/>
+ <cd:variable name='bottom' value='پایین'/>
+ <cd:variable name='brief' value='مختصر'/>
+ <cd:variable name='broad' value='گسترده'/>
+ <cd:variable name='buffer' value='بافر'/>
+ <cd:variable name='by' value='بوسیله'/>
+ <cd:variable name='calligraphic' value='خوشنویسی'/>
+ <cd:variable name='cap' value='cap'/>
+ <cd:variable name='capital' value='capital'/>
+ <cd:variable name='center' value='مرکز'/>
+ <cd:variable name='chapter' value='فصل'/>
+ <cd:variable name='character' value='حرف'/>
+ <cd:variable name='characters' value='حرفها'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='رنگ'/>
+ <cd:variable name='column' value='ستون'/>
+ <cd:variable name='columns' value='ستونها'/>
+ <cd:variable name='command' value='فرمان'/>
+ <cd:variable name='commands' value='فرمانها'/>
+ <cd:variable name='comment' value='توضیح'/>
+ <cd:variable name='component' value='مولفه'/>
+ <cd:variable name='concept' value='مفهوم'/>
+ <cd:variable name='content' value='محتوا'/>
+ <cd:variable name='contents' value='محتویات'/>
+ <cd:variable name='continue' value='ادامه'/>
+ <cd:variable name='controls' value='کنترلها'/>
+ <cd:variable name='conversion' value='تبدیل'/>
+ <cd:variable name='current' value='جاری'/>
+ <cd:variable name='cutspace' value='فضای‌برش'/>
+ <cd:variable name='date' value='تاریخ'/>
+ <cd:variable name='day' value='روز'/>
+ <cd:variable name='december' value='دسامبر'/>
+ <cd:variable name='default' value='پیش‌فرض'/>
+ <cd:variable name='depth' value='عمق'/>
+ <cd:variable name='description' value='شرح'/>
+ <cd:variable name='disable' value='ناتوان'/>
+ <cd:variable name='display' value='نمایش'/>
+ <cd:variable name='dot' value='نقطه'/>
+ <cd:variable name='doublesided' value='دورو'/>
+ <cd:variable name='down' value='down'/>
+ <cd:variable name='each' value='هر'/>
+ <cd:variable name='edge' value='لبه'/>
+ <cd:variable name='empty' value='تهی'/>
+ <cd:variable name='end' value='end'/>
+ <cd:variable name='endnote' value='ته‌نوشت'/>
+ <cd:variable name='enumeration' value='شماره‌بندی'/>
+ <cd:variable name='environment' value='محیط'/>
+ <cd:variable name='even' value='زوج'/>
+ <cd:variable name='external' value='خارجی'/>
+ <cd:variable name='fact' value='fact'/>
+ <cd:variable name='february' value='فوریه'/>
+ <cd:variable name='figure' value='شکل'/>
+ <cd:variable name='figures' value='شکلها'/>
+ <cd:variable name='file' value='پرونده'/>
+ <cd:variable name='final' value='نهایی'/>
+ <cd:variable name='first' value='اولی'/>
+ <cd:variable name='firstcolumn' value='ستون‌اول'/>
+ <cd:variable name='firstpage' value='صفحه‌اول'/>
+ <cd:variable name='firstsubpage' value='زیرصفحه‌اول'/>
+ <cd:variable name='fit' value='پرکردن'/>
+ <cd:variable name='five' value='پنج'/>
+ <cd:variable name='fix' value='ثابت‌کن'/>
+ <cd:variable name='fixed' value='ثابت'/>
+ <cd:variable name='flexible' value='انعطافپذیر'/>
+ <cd:variable name='float' value='شناور'/>
+ <cd:variable name='flushinner' value='پمپ‌داخلی'/>
+ <cd:variable name='flushleft' value='پمپ‌چپ'/>
+ <cd:variable name='flushouter' value='پمپ‌خارجی'/>
+ <cd:variable name='flushright' value='پمپ‌راست'/>
+ <cd:variable name='footer' value='ته‌برگ'/>
+ <cd:variable name='footnote' value='پانوشت'/>
+ <cd:variable name='force' value='اجبار'/>
+ <cd:variable name='foreground' value='پیش‌زمینه'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='فرمول'/>
+ <cd:variable name='formulae' value='فرمولها'/>
+ <cd:variable name='forward' value='به‌جلو'/>
+ <cd:variable name='four' value='چهار'/>
+ <cd:variable name='frame' value='قالب'/>
+ <cd:variable name='framedtext' value='متن‌قالبی'/>
+ <cd:variable name='friday' value='جمعه'/>
+ <cd:variable name='frontmatter' value='پیش‌مطلب'/>
+ <cd:variable name='frontpart' value='پیش‌قسمت'/>
+ <cd:variable name='global' value='سراسری'/>
+ <cd:variable name='graphic' value='گرافیک'/>
+ <cd:variable name='graphics' value='گرافیکها'/>
+ <cd:variable name='gray' value='خاکستری'/>
+ <cd:variable name='greek' value='یونانی'/>
+ <cd:variable name='grid' value='توری'/>
+ <cd:variable name='halfline' value='نیم‌خط'/>
+ <cd:variable name='handwritten' value='دست‌نوشته'/>
+ <cd:variable name='hang' value='بیاویز'/>
+ <cd:variable name='hanging' value='آویزان'/>
+ <cd:variable name='head' value='سر'/>
+ <cd:variable name='header' value='سربرگ'/>
+ <cd:variable name='height' value='ارتفاع'/>
+ <cd:variable name='helptext' value='متن‌کمکی'/>
+ <cd:variable name='hencefore' value='hencefore'/>
+ <cd:variable name='here' value='اینجا'/>
+ <cd:variable name='hereafter' value='ازاین‌به‌بعد'/>
+ <cd:variable name='hidden' value='پنهانی'/>
+ <cd:variable name='hiding' value='پنهان‌کردن'/>
+ <cd:variable name='high' value='بلند'/>
+ <cd:variable name='horizontal' value='افقی'/>
+ <cd:variable name='hyphenated' value='شکسته'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='دربین'/>
+ <cd:variable name='index' value='نمایه'/>
+ <cd:variable name='indices' value='نمایه‌ها'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='ارث‌بردن'/>
+ <cd:variable name='inleft' value='درون‌چپ'/>
+ <cd:variable name='inmargin' value='درون‌حاشیه'/>
+ <cd:variable name='inner' value='داخلی'/>
+ <cd:variable name='inneredge' value='لبه‌داخلی'/>
+ <cd:variable name='innermargin' value='حاشیه‌داخلی'/>
+ <cd:variable name='inright' value='درون‌راست'/>
+ <cd:variable name='interaction' value='پانل'/>
+ <cd:variable name='interactionmenu' value='منوی‌پانل'/>
+ <cd:variable name='intermezzi' value='میان‌پرده‌ها'/>
+ <cd:variable name='intermezzo' value='میان‌پرده'/>
+ <cd:variable name='intext' value='درون‌متن'/>
+ <cd:variable name='intro' value='پیشگفتار'/>
+ <cd:variable name='italic' value='ایتالیک'/>
+ <cd:variable name='italicbold' value='مشکی‌ایتالیک'/>
+ <cd:variable name='item' value='آیتم'/>
+ <cd:variable name='itemize' value='آیتم‌بندی'/>
+ <cd:variable name='its' value='آیم'/>
+ <cd:variable name='january' value='ژانویه'/>
+ <cd:variable name='joinedup' value='متصل‌بالا'/>
+ <cd:variable name='july' value='ژولای'/>
+ <cd:variable name='june' value='ژوئن'/>
+ <cd:variable name='keep' value='نگهدار'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='برچسب'/>
+ <cd:variable name='landscape' value='صفحه‌گسترده'/>
+ <cd:variable name='last' value='آخرین'/>
+ <cd:variable name='lastcolumn' value='آخرین‌ستون'/>
+ <cd:variable name='lastpage' value='صفحه‌آخر'/>
+ <cd:variable name='lastpagenumber' value='شماه‌صفحه‌آخر'/>
+ <cd:variable name='lastsubpage' value='زیرصفحه‌آخر'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='چپ'/>
+ <cd:variable name='leftedge' value='لبه‌چپ'/>
+ <cd:variable name='lefthanging' value='آویزان‌چپ'/>
+ <cd:variable name='leftmargin' value='حاشیه‌چپ'/>
+ <cd:variable name='leftpage' value='صفحه‌چپ'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='راهنما'/>
+ <cd:variable name='lesshyphenation' value='شکست‌کلمات‌کمتر'/>
+ <cd:variable name='line' value='خط'/>
+ <cd:variable name='linenote' value='خط‌نوشت'/>
+ <cd:variable name='lines' value='خطها'/>
+ <cd:variable name='list' value='لیست'/>
+ <cd:variable name='local' value='موضعی'/>
+ <cd:variable name='localenvironment' value='محیط‌موضعی'/>
+ <cd:variable name='logo' value='آرم'/>
+ <cd:variable name='logos' value='آرمها'/>
+ <cd:variable name='lohi' value='پابا'/>
+ <cd:variable name='loose' value='شل'/>
+ <cd:variable name='low' value='پایین'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='آرایش'/>
+ <cd:variable name='mar' value='حاش'/>
+ <cd:variable name='march' value='مارس'/>
+ <cd:variable name='margin' value='حاشیه'/>
+ <cd:variable name='marginedge' value='لبه‌حاشیه'/>
+ <cd:variable name='margintitle' value='عنوان‌حاشیه'/>
+ <cd:variable name='marking' value='نشانه‌گذاری'/>
+ <cd:variable name='mathalignment' value='تنظیم‌ریاضی'/>
+ <cd:variable name='mathcases' value='حالتهای‌ریاضی'/>
+ <cd:variable name='mathmatrix' value='ماتریش‌ریاضی'/>
+ <cd:variable name='max' value='بیشترین'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='مه'/>
+ <cd:variable name='mediaeval' value='mediaeval'/>
+ <cd:variable name='medium' value='متوسط'/>
+ <cd:variable name='middle' value='میان'/>
+ <cd:variable name='min' value='کمترین'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='کمترین‌ارتفاع'/>
+ <cd:variable name='minwidth' value='کمترین‌عرض'/>
+ <cd:variable name='mirrored' value='منعکس'/>
+ <cd:variable name='monday' value='دوشنبه'/>
+ <cd:variable name='mono' value='مونو'/>
+ <cd:variable name='month' value='ماه'/>
+ <cd:variable name='morehyphenation' value='شکست‌کلمات‌بیشتر'/>
+ <cd:variable name='name' value='نام'/>
+ <cd:variable name='narrow' value='نازک'/>
+ <cd:variable name='negative' value='منفی'/>
+ <cd:variable name='never' value='هیچگاه'/>
+ <cd:variable name='new' value='جدید'/>
+ <cd:variable name='next' value='بعدی'/>
+ <cd:variable name='nextevenpage' value='صفحه‌زوج‌بعدی'/>
+ <cd:variable name='nextoddpage' value='صفحه‌فردبعدی'/>
+ <cd:variable name='nextpage' value='صفحه‌بعدی'/>
+ <cd:variable name='nextsubpage' value='زیرصفحه‌بعدی'/>
+ <cd:variable name='no' value='نه'/>
+ <cd:variable name='nocheck' value='بدون‌بررسی'/>
+ <cd:variable name='nofit' value='بدون‌پرکردن'/>
+ <cd:variable name='nogrid' value='بدون‌توری'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='بدون‌نشانه‌گذاری'/>
+ <cd:variable name='none' value='هیچکدام'/>
+ <cd:variable name='nonumber' value='بدون‌شماره'/>
+ <cd:variable name='normal' value='نرمال'/>
+ <cd:variable name='nospacing' value='بدون‌فضاگذاری'/>
+ <cd:variable name='not' value='بدون'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='بدون‌آویزان‌کردن'/>
+ <cd:variable name='nothyphenated' value='بدون‌شکست'/>
+ <cd:variable name='november' value='نوامبر'/>
+ <cd:variable name='nowhere' value='هیچ‌حا'/>
+ <cd:variable name='nowhite' value='سفید‌نه'/>
+ <cd:variable name='number' value='شماره'/>
+ <cd:variable name='numbers' value='شماره‌ها'/>
+ <cd:variable name='october' value='اکتبر'/>
+ <cd:variable name='odd' value='فرد'/>
+ <cd:variable name='off' value='خاموش'/>
+ <cd:variable name='offset' value='آفست'/>
+ <cd:variable name='old' value='قدیمی'/>
+ <cd:variable name='on' value='روی'/>
+ <cd:variable name='one' value='یک'/>
+ <cd:variable name='opposite' value='مخالف'/>
+ <cd:variable name='outer' value='خارجی'/>
+ <cd:variable name='outeredge' value='لبه‌خارجی'/>
+ <cd:variable name='outermargin' value='حاشیه‌خارجی'/>
+ <cd:variable name='overbar' value='میله‌رو'/>
+ <cd:variable name='overbars' value='میله‌ها‌رو'/>
+ <cd:variable name='overlay' value='پوشش'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='خط‌زدن'/>
+ <cd:variable name='overstrikes' value='خط‌زدنها'/>
+ <cd:variable name='packed' value='فشرده'/>
+ <cd:variable name='page' value='صفحه'/>
+ <cd:variable name='pagecomment' value='توضیح‌صفحه'/>
+ <cd:variable name='pagenumber' value='شماره‌صفحه'/>
+ <cd:variable name='paper' value='برگ'/>
+ <cd:variable name='paragraph' value='پاراگراف'/>
+ <cd:variable name='part' value='قسمت'/>
+ <cd:variable name='positive' value='مثبت'/>
+ <cd:variable name='postponing' value='تاخیر'/>
+ <cd:variable name='postscript' value='پست‌اسکریپت'/>
+ <cd:variable name='preference' value='ترجیح'/>
+ <cd:variable name='preview' value='پیش‌دید'/>
+ <cd:variable name='previous' value='قبلی'/>
+ <cd:variable name='previousevenpage' value='صفحه‌زوج‌قبلی'/>
+ <cd:variable name='previousoddpage' value='صفحه‌فردقبلی'/>
+ <cd:variable name='previouspage' value='صفحه‌قبلی'/>
+ <cd:variable name='previoussubpage' value='زیرصفحه‌قبلی'/>
+ <cd:variable name='printable' value='قابل‌چاپ'/>
+ <cd:variable name='process' value='پردازش'/>
+ <cd:variable name='product' value='محصول'/>
+ <cd:variable name='program' value='برنامه'/>
+ <cd:variable name='project' value='پروژه'/>
+ <cd:variable name='protected' value='حفاظت‌شده'/>
+ <cd:variable name='quadruple' value='quadruple'/>
+ <cd:variable name='quotation' value='نقل‌قول'/>
+ <cd:variable name='quote' value='نقل'/>
+ <cd:variable name='ran' value='برد'/>
+ <cd:variable name='random' value='تصادفی'/>
+ <cd:variable name='readonly' value='تنهاخواندنی'/>
+ <cd:variable name='rectangular' value='چهارگوشه'/>
+ <cd:variable name='referral' value='مراجعه'/>
+ <cd:variable name='register' value='ثبت'/>
+ <cd:variable name='regular' value='منظم'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='نسبی'/>
+ <cd:variable name='repeat' value='تکرار'/>
+ <cd:variable name='required' value='موردنیاز'/>
+ <cd:variable name='reset' value='بازنشانی'/>
+ <cd:variable name='reverse' value='برعکس'/>
+ <cd:variable name='right' value='راست'/>
+ <cd:variable name='rightedge' value='لبه‌راست'/>
+ <cd:variable name='righthanging' value='آویزان‌کردن‌راست'/>
+ <cd:variable name='rightmargin' value='حاشیه‌راست'/>
+ <cd:variable name='rightpage' value='صفحه‌راست'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='رومن'/>
+ <cd:variable name='romannumerals' value='شماره‌لاتین'/>
+ <cd:variable name='rotate' value='دوران'/>
+ <cd:variable name='rotated' value='دوران‌یافته'/>
+ <cd:variable name='round' value='گرد'/>
+ <cd:variable name='row' value='سطر'/>
+ <cd:variable name='rule' value='خط'/>
+ <cd:variable name='samepage' value='همان‌صفحه'/>
+ <cd:variable name='sans' value='سانز'/>
+ <cd:variable name='sansbold' value='مشکی‌سانز'/>
+ <cd:variable name='sansserif' value='سانزسریف'/>
+ <cd:variable name='saturday' value='شنبه'/>
+ <cd:variable name='screen' value='پرده'/>
+ <cd:variable name='section' value='بخش'/>
+ <cd:variable name='sectionblockenvironment' value='محیط‌بلوک‌بخش'/>
+ <cd:variable name='sectionnumber' value='شماره‌بخش'/>
+ <cd:variable name='see' value='ببینید'/>
+ <cd:variable name='september' value='سپتامبر'/>
+ <cd:variable name='serif' value='سریف'/>
+ <cd:variable name='serried' value='تنگ‌هم'/>
+ <cd:variable name='setups' value='بارگذاریها'/>
+ <cd:variable name='sheet' value='ورقه'/>
+ <cd:variable name='short' value='short'/>
+ <cd:variable name='singlesided' value='یک‌رو'/>
+ <cd:variable name='slanted' value='خوابیده'/>
+ <cd:variable name='slantedbold' value='مشکی‌خوابیده'/>
+ <cd:variable name='small' value='کوچک'/>
+ <cd:variable name='smallbodyfont' value='قلم‌بدنه‌کوچک'/>
+ <cd:variable name='smallbold' value='مشکی‌کوچک'/>
+ <cd:variable name='smallbolditalic' value='ایتالیک‌مشکی‌کوچک'/>
+ <cd:variable name='smallboldslanted' value='خوابیده‌مشکی‌کوچک'/>
+ <cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smallitalic' value='ایتالیک‌کوچک'/>
+ <cd:variable name='smallitalicbold' value='مشکی‌ایتالیک‌کوچک'/>
+ <cd:variable name='smallnormal' value='نرمال‌کوچک'/>
+ <cd:variable name='smallslanted' value='خوابیده‌کوچک'/>
+ <cd:variable name='smallslantedbold' value='مشکی‌خوابیده‌کوچک'/>
+ <cd:variable name='smalltype' value='تایپ‌کوچک'/>
+ <cd:variable name='somewhere' value='جایی'/>
+ <cd:variable name='sorted' value='مرتب'/>
+ <cd:variable name='space' value='فضا'/>
+ <cd:variable name='spacing' value='فضاگذاری'/>
+ <cd:variable name='speech' value='سخنرانی'/>
+ <cd:variable name='split' value='شکافتن'/>
+ <cd:variable name='spot' value='لکه'/>
+ <cd:variable name='standard' value='استاندارد'/>
+ <cd:variable name='start' value='شروع'/>
+ <cd:variable name='starter' value='starter'/>
+ <cd:variable name='sticker' value='دشنه'/>
+ <cd:variable name='stop' value='پایان'/>
+ <cd:variable name='stopper' value='ایست'/>
+ <cd:variable name='stretch' value='بکش'/>
+ <cd:variable name='strict' value='اکید'/>
+ <cd:variable name='strong' value='محکم'/>
+ <cd:variable name='strut' value='بست'/>
+ <cd:variable name='sub' value='زیر'/>
+ <cd:variable name='subbackward' value='زیرعقب‌گرد'/>
+ <cd:variable name='subformula' value='زیرفرمول'/>
+ <cd:variable name='subforward' value='زیرجلوگرد'/>
+ <cd:variable name='subject' value='موضوع'/>
+ <cd:variable name='subpage' value='زیرصفحه'/>
+ <cd:variable name='subsection' value='زیربخش'/>
+ <cd:variable name='subsubject' value='زیرموضوع'/>
+ <cd:variable name='subsubsection' value='زیرزیربخش'/>
+ <cd:variable name='subsubsubject' value='زیرزیرموضوع'/>
+ <cd:variable name='subsubsubsection' value='زیرزیرزیربخش'/>
+ <cd:variable name='subsubsubsubject' value='زیرزیرزیرموضوع'/>
+ <cd:variable name='subsubsubsubsection' value='زیرزیرزیرزیربخش'/>
+ <cd:variable name='subsubsubsubsubject' value='زیرزیرزیرزیرموضوع'/>
+ <cd:variable name='subsubsubsubsubsection' value='زیرزیرزیرزیرزیربخش'/>
+ <cd:variable name='subsubsubsubsubsubject' value='زیرزیرزیرزیرزیرموضوع'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='زیرزیرزیرزیرزیرزیربخش'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='زیرزیرزیرزیرزیرزیرموضوع'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='زیرزیرزیرزیرزیرزیرزیربخش'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='زیرزیرزیرزیرزیرزیرزیرموضوع'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='زیرزیرزیرزیرزیرزیرزیرزیربخش'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='زیرزیرزیرزیرزیرزیرزیرزیرموضوع'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='زیرزیرزیرزیرزیرزیرزیرزیرزیربخش'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='زیرزیرزیرزیرزیرزیرزیرزیرزیرموضوع'/>
+ <cd:variable name='sunday' value='یک‌شنبه'/>
+ <cd:variable name='support' value='حمایت'/>
+ <cd:variable name='sym' value='نم'/>
+ <cd:variable name='symbol' value='نماد'/>
+ <cd:variable name='synchronize' value='تطابق'/>
+ <cd:variable name='system' value='سیستم'/>
+ <cd:variable name='table' value='جدول'/>
+ <cd:variable name='tablehead' value='سرجدول'/>
+ <cd:variable name='tables' value='جدولها'/>
+ <cd:variable name='tabletail' value='دنباله‌جدول'/>
+ <cd:variable name='tabulate' value='جدول‌بندی'/>
+ <cd:variable name='tabulatehead' value='سرجدول‌بندی'/>
+ <cd:variable name='tabulatetail' value='دنباله‌جدول‌بندی'/>
+ <cd:variable name='tall' value='دراز'/>
+ <cd:variable name='teletype' value='دورنگاره'/>
+ <cd:variable name='temporary' value='موقتی'/>
+ <cd:variable name='test' value='تست'/>
+ <cd:variable name='text' value='متن'/>
+ <cd:variable name='three' value='سه'/>
+ <cd:variable name='thursday' value='پنج‌شنبه'/>
+ <cd:variable name='title' value='عنوان'/>
+ <cd:variable name='toggle' value='تغییر'/>
+ <cd:variable name='tolerant' value='بردبار'/>
+ <cd:variable name='top' value='بالا'/>
+ <cd:variable name='tuesday' value='سه‌شنبه'/>
+ <cd:variable name='two' value='دو'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='تایپ'/>
+ <cd:variable name='typing' value='تایپ‌کردن'/>
+ <cd:variable name='unavailable' value='غیرموجود'/>
+ <cd:variable name='underbar' value='میله‌زیر'/>
+ <cd:variable name='underbars' value='میله‌‌های‌زیر'/>
+ <cd:variable name='unit' value='واحد'/>
+ <cd:variable name='units' value='واحدها'/>
+ <cd:variable name='unknown' value='ناشناس'/>
+ <cd:variable name='unpacked' value='غیرفشرده'/>
+ <cd:variable name='up' value='up'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='استفاده‌شده'/>
+ <cd:variable name='value' value='مقدار'/>
+ <cd:variable name='vertical' value='عمودی'/>
+ <cd:variable name='very' value='خیلی'/>
+ <cd:variable name='verystrict' value='خیلی‌سختگیر'/>
+ <cd:variable name='verytolerant' value='خیلی‌بردبار'/>
+ <cd:variable name='weak' value='هفته'/>
+ <cd:variable name='wednesday' value='چهارشنبه'/>
+ <cd:variable name='week' value='هفته'/>
+ <cd:variable name='weekday' value='روزهفته'/>
+ <cd:variable name='white' value='سفید'/>
+ <cd:variable name='wide' value='گسترده'/>
+ <cd:variable name='width' value='عرض'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='سال'/>
+ <cd:variable name='yes' value='بله'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language pe -->
+
+ <cd:constants>
+ <cd:constant name='action' value='کنش'/>
+ <cd:constant name='address' value='نشانی'/>
+ <cd:constant name='after' value='بعداز'/>
+ <cd:constant name='afterhead' value='بعدازسر'/>
+ <cd:constant name='afterkey' value='بعدازکلید'/>
+ <cd:constant name='align' value='تنظیم'/>
+ <cd:constant name='aligncharacter' value='حرف‌تنظیم'/>
+ <cd:constant name='alignmentcharacter' value='حرف‌تنظیم‌کردن'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='عنوان‌تنظیم'/>
+ <cd:constant name='alternative' value='جایگزین'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='پیکان'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='در'/>
+ <cd:constant name='author' value='نویسنده'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='خودکار'/>
+ <cd:constant name='autofile' value='پرونده‌خودکار'/>
+ <cd:constant name='autofocus' value='تمرکز‌خودکار'/>
+ <cd:constant name='autohang' value='آویزان‌خودکار'/>
+ <cd:constant name='autostrut' value='بست‌خودکار'/>
+ <cd:constant name='autowidth' value='عرض‌خودکار'/>
+ <cd:constant name='axis' value='محورها'/>
+ <cd:constant name='background' value='پس‌زمینه'/>
+ <cd:constant name='backgroundcolor' value='رنگ‌پس‌زمینه'/>
+ <cd:constant name='backgroundcorner' value='گوشه‌پس‌زمینه'/>
+ <cd:constant name='backgrounddepth' value='عمق‌پس‌زمینه'/>
+ <cd:constant name='backgroundoffset' value='آفست‌پس‌زمینه'/>
+ <cd:constant name='backgroundradius' value='شعاع‌پس‌زمینه'/>
+ <cd:constant name='backgroundscreen' value='پرده‌پس‌زمینه'/>
+ <cd:constant name='backspace' value='فضای‌پس'/>
+ <cd:constant name='balance' value='تعادل'/>
+ <cd:constant name='before' value='قبل‌از'/>
+ <cd:constant name='beforehead' value='قبل‌ازسر'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='بزرگ'/>
+ <cd:constant name='blank' value='خالی'/>
+ <cd:constant name='blockway' value='راه‌بلوک'/>
+ <cd:constant name='bodyfont' value='قلم‌بدنه'/>
+ <cd:constant name='bookmark' value='چوبخط'/>
+ <cd:constant name='bottom' value='پایین'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='فاصله‌پایین'/>
+ <cd:constant name='bottomframe' value='قالب‌پایین'/>
+ <cd:constant name='bottomoffset' value='آفست‌پایین'/>
+ <cd:constant name='bottomspace' value='فضای‌پایین'/>
+ <cd:constant name='bottomstate' value='وضعیت‌پایین'/>
+ <cd:constant name='cache' value='میانگیر'/>
+ <cd:constant name='calculate' value='محاسبه'/>
+ <cd:constant name='ccommand' value='فرمان'/>
+ <cd:constant name='click' value='فشردن'/>
+ <cd:constant name='clickin' value='فشردن‌داخل'/>
+ <cd:constant name='clickout' value='فشردن‌خارج'/>
+ <cd:constant name='clipoffset' value='آفست‌کلیپ'/>
+ <cd:constant name='closeaction' value='بستن‌کنش'/>
+ <cd:constant name='closecommand' value='بستن‌فرمان'/>
+ <cd:constant name='closepageaction' value='بستن‌عمل‌صفحه'/>
+ <cd:constant name='closesymbol' value='بستن‌نماد'/>
+ <cd:constant name='color' value='رنگ'/>
+ <cd:constant name='column' value='ستون'/>
+ <cd:constant name='columndistance' value='فاصله‌ستون'/>
+ <cd:constant name='columns' value='ستونها'/>
+ <cd:constant name='command' value='فرمان'/>
+ <cd:constant name='commandafter' value='فرمان‌بعداز'/>
+ <cd:constant name='commandbefore' value='فرمان‌قبل‌از'/>
+ <cd:constant name='commands' value='فرمانها'/>
+ <cd:constant name='component' value='مولفه'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='فشردن'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='ادامه'/>
+ <cd:constant name='contrastcolor' value='contrastcolor'/>
+ <cd:constant name='controls' value='کنترلها'/>
+ <cd:constant name='conversion' value='تبدیل'/>
+ <cd:constant name='convertfile' value='پرونده‌تبدیل'/>
+ <cd:constant name='corner' value='گوشه'/>
+ <cd:constant name='coupling' value='تزویج'/>
+ <cd:constant name='couplingway' value='روش‌تزویج'/>
+ <cd:constant name='criterium' value='criterium'/>
+ <cd:constant name='current' value='جاری'/>
+ <cd:constant name='cutspace' value='فضای‌برش'/>
+ <cd:constant name='dash' value='دش'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='تاریخ'/>
+ <cd:constant name='deepnumbercommand' value='فرمان‌شماره‌عمیق'/>
+ <cd:constant name='deeptextcommand' value='فرمان‌متن‌عمیق'/>
+ <cd:constant name='default' value='پیش‌فرض'/>
+ <cd:constant name='delay' value='تاخیر'/>
+ <cd:constant name='depth' value='عمق'/>
+ <cd:constant name='depthcorrection' value='تصحیح‌عمق'/>
+ <cd:constant name='direction' value='جهت'/>
+ <cd:constant name='directory' value='پوشه'/>
+ <cd:constant name='display' value='نمایش'/>
+ <cd:constant name='distance' value='فاصله'/>
+ <cd:constant name='dot' value='نقطه'/>
+ <cd:constant name='doublesided' value='دورو'/>
+ <cd:constant name='dummy' value='مصنوعی'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='لبه'/>
+ <cd:constant name='edgedistance' value='فاصله‌لبه'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='تهی'/>
+ <cd:constant name='equalheight' value='ارتفاع‌یکسان'/>
+ <cd:constant name='equalwidth' value='عرض‌یکسان'/>
+ <cd:constant name='escape' value='فرار'/>
+ <cd:constant name='evenmargin' value='حاشیه‌زوج'/>
+ <cd:constant name='expansion' value='گسترش'/>
+ <cd:constant name='export' value='export'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='عامل'/>
+ <cd:constant name='fallback' value='عقب‌ریختن'/>
+ <cd:constant name='family' value='خانواده'/>
+ <cd:constant name='fieldbackgroundcolor' value='رنگ‌پس‌زمینه‌میدان'/>
+ <cd:constant name='fieldframecolor' value='رنگ‌قالب‌میدان'/>
+ <cd:constant name='fieldlayer' value='لایه‌میدان'/>
+ <cd:constant name='fieldoffset' value='آفست‌میدان'/>
+ <cd:constant name='file' value='پرونده'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='تمرکز'/>
+ <cd:constant name='focusin' value='تمرکزدرون'/>
+ <cd:constant name='focusout' value='تمرکزبیرون'/>
+ <cd:constant name='footer' value='ته‌برگ'/>
+ <cd:constant name='footerdistance' value='فاصله‌ته‌برگ'/>
+ <cd:constant name='footerstate' value='وضعیت‌ته‌برگ'/>
+ <cd:constant name='foregroundcolor' value='رنگ‌پیش‌زمینه'/>
+ <cd:constant name='foregroundstyle' value='سبک‌پیش‌زمینه'/>
+ <cd:constant name='format' value='شمایل'/>
+ <cd:constant name='frame' value='قالب'/>
+ <cd:constant name='framecolor' value='رنگ‌قالب'/>
+ <cd:constant name='framecorner' value='گوشه‌قالب'/>
+ <cd:constant name='framedepth' value='عمق‌قالب'/>
+ <cd:constant name='frameoffset' value='آفست‌قالب'/>
+ <cd:constant name='frameradius' value='شعاع‌قالب'/>
+ <cd:constant name='frames' value='قالبها'/>
+ <cd:constant name='from' value='از'/>
+ <cd:constant name='get' value='بگیر'/>
+ <cd:constant name='global' value='سراسری'/>
+ <cd:constant name='grid' value='توری'/>
+ <cd:constant name='hang' value='بیاویز'/>
+ <cd:constant name='headalign' value='headalign'/>
+ <cd:constant name='headcolor' value='رنگ‌سر'/>
+ <cd:constant name='headcommand' value='فرمان‌سر'/>
+ <cd:constant name='headconversion' value='تبدیل‌سر'/>
+ <cd:constant name='header' value='سربرگ'/>
+ <cd:constant name='headerdistance' value='فاصله‌سربرگ'/>
+ <cd:constant name='headerstate' value='وضعیت‌سربرگ'/>
+ <cd:constant name='headlabel' value='برچسب‌سر'/>
+ <cd:constant name='headnumber' value='شماره‌سر'/>
+ <cd:constant name='headstyle' value='سبک‌سر'/>
+ <cd:constant name='height' value='ارتفاع'/>
+ <cd:constant name='hfactor' value='عامل‌ارتفاع'/>
+ <cd:constant name='hfil' value='پرکردن‌ارتفاع'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='آفست‌ا'/>
+ <cd:constant name='horoffset' value='آفست‌افق'/>
+ <cd:constant name='hyphen' value='شکستن'/>
+ <cd:constant name='icommand' value='icommand'/>
+ <cd:constant name='in' value='درون'/>
+ <cd:constant name='inbetween' value='دربین'/>
+ <cd:constant name='increment' value='افزایش'/>
+ <cd:constant name='incrementnumber' value='شماره‌افزایش'/>
+ <cd:constant name='indenting' value='تورفتگی'/>
+ <cd:constant name='indentnext' value='متن‌تورفته'/>
+ <cd:constant name='indicator' value='اندیکاتور'/>
+ <cd:constant name='inner' value='داخلی'/>
+ <cd:constant name='innermargin' value='حاشیه‌داخلی'/>
+ <cd:constant name='inputfile' value='پرونده‌ورودی'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='پانل'/>
+ <cd:constant name='interlinespace' value='فضای‌بین‌خط'/>
+ <cd:constant name='itemalign' value='تنظیم‌آیتم'/>
+ <cd:constant name='items' value='آیتمها'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='گسترش‌کلید'/>
+ <cd:constant name='keyword' value='کلید‌واژه'/>
+ <cd:constant name='label' value='برچسب'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='چپ'/>
+ <cd:constant name='leftcolor' value='رنگ‌چپ'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='لبه‌چپ'/>
+ <cd:constant name='leftedgedistance' value='فاصله‌لبه‌چپ'/>
+ <cd:constant name='leftframe' value='قالب‌چپ'/>
+ <cd:constant name='lefthyphen' value='شکست‌چپ'/>
+ <cd:constant name='leftmargin' value='حاشیه‌چپ'/>
+ <cd:constant name='leftmargindistance' value='فاصله‌حاشیه‌چپ'/>
+ <cd:constant name='leftoffset' value='آفست‌چپ'/>
+ <cd:constant name='leftquotation' value='نقل‌قول‌چپ'/>
+ <cd:constant name='leftquote' value='نقل‌چپ'/>
+ <cd:constant name='leftsentence' value='جمله‌چپ'/>
+ <cd:constant name='leftspeech' value='سخنرانی‌چپ'/>
+ <cd:constant name='leftstyle' value='سبک‌چپ'/>
+ <cd:constant name='leftsubsentence' value='زیرجمله‌چپ'/>
+ <cd:constant name='lefttext' value='متن‌چپ'/>
+ <cd:constant name='leftwidth' value='عرض‌خط'/>
+ <cd:constant name='level' value='مرحله'/>
+ <cd:constant name='levels' value='مرحله‌ها'/>
+ <cd:constant name='limittext' value='مرزمتن'/>
+ <cd:constant name='line' value='خط'/>
+ <cd:constant name='linecorrection' value='تصحیح‌خط'/>
+ <cd:constant name='lines' value='خطها'/>
+ <cd:constant name='list' value='لیست'/>
+ <cd:constant name='listtext' value='متن‌لیست'/>
+ <cd:constant name='local' value='موضعی'/>
+ <cd:constant name='location' value='مکان'/>
+ <cd:constant name='logo' value='آرم'/>
+ <cd:constant name='logos' value='آرمها'/>
+ <cd:constant name='marcolor' value='رنگ‌حاش'/>
+ <cd:constant name='margin' value='حاشیه'/>
+ <cd:constant name='margindistance' value='فاصله‌حاشیه'/>
+ <cd:constant name='marginedge' value='لبه‌حاشیه'/>
+ <cd:constant name='marginedgetext' value='متن‌لبه‌حاشیه'/>
+ <cd:constant name='margintext' value='متن‌حاشیه'/>
+ <cd:constant name='marking' value='نشانه‌گذاری'/>
+ <cd:constant name='marstyle' value='سبک‌حاش'/>
+ <cd:constant name='max' value='بیشترین'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='بیشترین‌ارتفاع'/>
+ <cd:constant name='maxwidth' value='بیشترین‌عرض'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='منو'/>
+ <cd:constant name='method' value='روش'/>
+ <cd:constant name='middle' value='میان'/>
+ <cd:constant name='middlespeech' value='سخنرانی‌میانی'/>
+ <cd:constant name='middletext' value='متن‌میانی'/>
+ <cd:constant name='midsentence' value='جمله‌میانی'/>
+ <cd:constant name='min' value='کمترین'/>
+ <cd:constant name='mindepth' value='کمترین‌عمق'/>
+ <cd:constant name='minheight' value='کمترین‌ارتفاع'/>
+ <cd:constant name='minwidth' value='کمترین‌عرض'/>
+ <cd:constant name='monthconversion' value='monthconversion'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='نام'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='nbottom'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='بعدی'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nleft'/>
+ <cd:constant name='nlines' value='nlines'/>
+ <cd:constant name='norm' value='norm'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='nright'/>
+ <cd:constant name='ntop' value='ntop'/>
+ <cd:constant name='number' value='شماره'/>
+ <cd:constant name='numbercolor' value='رنگ‌شماره'/>
+ <cd:constant name='numbercommand' value='فرمان‌شماره'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='فاصله‌شماره'/>
+ <cd:constant name='numbering' value='شماره‌گذاری'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='جداکننده‌شماره'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='سبک‌شماره'/>
+ <cd:constant name='numberwidth' value='عرض‌شماره'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='شیئ'/>
+ <cd:constant name='obstruction' value='انسداد'/>
+ <cd:constant name='oddmargin' value='حاشیه‌فرد'/>
+ <cd:constant name='offset' value='آفست'/>
+ <cd:constant name='openaction' value='عمل‌باز'/>
+ <cd:constant name='openpageaction' value='عمل‌صفحه‌باز'/>
+ <cd:constant name='option' value='گزینه'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='جهت‌دهی'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='حاشیه‌خارجی'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='شماره‌خود'/>
+ <cd:constant name='page' value='صفحه'/>
+ <cd:constant name='pageboundaries' value='مرزهای‌صفحه'/>
+ <cd:constant name='pagecolor' value='رنگ‌صفحه'/>
+ <cd:constant name='pagecommand' value='فرمان‌صفحه'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='شماره‌صفحه'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='وضعیت‌صفحه'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='سبک‌صفحه'/>
+ <cd:constant name='palet' value='لوح'/>
+ <cd:constant name='paper' value='برگ'/>
+ <cd:constant name='paragraph' value='پاراگراف'/>
+ <cd:constant name='place' value='بگذار'/>
+ <cd:constant name='placehead' value='بگذارسر'/>
+ <cd:constant name='placestopper' value='بگذارایست'/>
+ <cd:constant name='position' value='موقعیت'/>
+ <cd:constant name='prefix' value='پیشوند'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='preset'/>
+ <cd:constant name='preview' value='پیش‌دید'/>
+ <cd:constant name='previous' value='قبلی'/>
+ <cd:constant name='previousnumber' value='شماره‌قبلی'/>
+ <cd:constant name='process' value='پردازش'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='شعاع'/>
+ <cd:constant name='random' value='تصادفی'/>
+ <cd:constant name='range' value='range'/>
+ <cd:constant name='reduction' value='کاهش'/>
+ <cd:constant name='ref' value='رج'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='مرجع'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='مراجعه'/>
+ <cd:constant name='regionin' value='ناحیه‌درون'/>
+ <cd:constant name='regionout' value='ناحیه‌بیرون'/>
+ <cd:constant name='repeat' value='تکرار'/>
+ <cd:constant name='reset' value='بازنشانی'/>
+ <cd:constant name='resetnumber' value='بازنشانی‌شماره'/>
+ <cd:constant name='resolution' value='کیفیت'/>
+ <cd:constant name='right' value='راست'/>
+ <cd:constant name='rightcolor' value='رنگ‌راست'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='لبه‌راست'/>
+ <cd:constant name='rightedgedistance' value='فاصله‌لبه‌راست'/>
+ <cd:constant name='rightframe' value='قالب‌راست'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='حاشیه‌راست'/>
+ <cd:constant name='rightmargindistance' value='فاصله‌حاشیه‌راست'/>
+ <cd:constant name='rightoffset' value='آفست‌راست'/>
+ <cd:constant name='rightquotation' value='نقل‌قول‌راست'/>
+ <cd:constant name='rightquote' value='نقل‌راست'/>
+ <cd:constant name='rightsentence' value='جمله‌راست'/>
+ <cd:constant name='rightspeech' value='سخنرانی‌راست'/>
+ <cd:constant name='rightstyle' value='سبک‌راست'/>
+ <cd:constant name='rightsubsentence' value='زیرجمله‌راست'/>
+ <cd:constant name='righttext' value='متن‌راست'/>
+ <cd:constant name='rightwidth' value='عرض‌راست'/>
+ <cd:constant name='rotation' value='دوران'/>
+ <cd:constant name='rule' value='خط'/>
+ <cd:constant name='rulecolor' value='رنگ‌خط'/>
+ <cd:constant name='rulethickness' value='ضخامت‌خط'/>
+ <cd:constant name='samepage' value='همان‌صفحه'/>
+ <cd:constant name='sample' value='نمونه'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='مقیاس'/>
+ <cd:constant name='scope' value='طرح'/>
+ <cd:constant name='screen' value='پرده'/>
+ <cd:constant name='section' value='بخش'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='شماره‌بخش'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='جداکننده'/>
+ <cd:constant name='set' value='قراربده'/>
+ <cd:constant name='setups' value='بارگذاریها'/>
+ <cd:constant name='side' value='کنار'/>
+ <cd:constant name='sidealign' value='تنظیم‌کنار'/>
+ <cd:constant name='sidemethod' value='روش‌کنار'/>
+ <cd:constant name='sidespaceafter' value='فضای‌کناری‌بعد'/>
+ <cd:constant name='sidespacebefore' value='فضای‌کناری‌قبل'/>
+ <cd:constant name='sign' value='علامت'/>
+ <cd:constant name='size' value='اندازه'/>
+ <cd:constant name='small' value='کوچک'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='ترتیب‌تایپ'/>
+ <cd:constant name='source' value='منبع'/>
+ <cd:constant name='space' value='فضا'/>
+ <cd:constant name='spaceafter' value='فضا‌بعداز'/>
+ <cd:constant name='spacebefore' value='فضا‌قبل‌از'/>
+ <cd:constant name='spaceinbetween' value='فضا‌دربین'/>
+ <cd:constant name='spacing' value='فضاگذاری'/>
+ <cd:constant name='split' value='شکافتن'/>
+ <cd:constant name='splitcolor' value='شکافتن‌رنگ'/>
+ <cd:constant name='splitmethod' value='روش‌شکافتن'/>
+ <cd:constant name='splitoffset' value='شکافتن‌آفست'/>
+ <cd:constant name='spot' value='لکه'/>
+ <cd:constant name='stack' value='توده'/>
+ <cd:constant name='start' value='شروع'/>
+ <cd:constant name='starter' value='starter'/>
+ <cd:constant name='state' value='وضعیت'/>
+ <cd:constant name='step' value='گام'/>
+ <cd:constant name='stop' value='پایان'/>
+ <cd:constant name='stopper' value='ایست'/>
+ <cd:constant name='stretch' value='کشیدن'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='بست'/>
+ <cd:constant name='style' value='سبک'/>
+ <cd:constant name='sub' value='زیر'/>
+ <cd:constant name='subtitle' value='زیرعنوان'/>
+ <cd:constant name='suffix' value='پسوند'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='تنظیم‌نماد'/>
+ <cd:constant name='symbol' value='نماد'/>
+ <cd:constant name='symbolset' value='مجموعه‌نماد'/>
+ <cd:constant name='symcolor' value='رنگ‌نماد'/>
+ <cd:constant name='symstyle' value='سبک‌نماد'/>
+ <cd:constant name='synonym' value='مترادف'/>
+ <cd:constant name='synonymcolor' value='رنگ‌مترادف'/>
+ <cd:constant name='synonymcommand' value='synonymcommand'/>
+ <cd:constant name='synonymstyle' value='سبک‌مترادف'/>
+ <cd:constant name='tab' value='تب'/>
+ <cd:constant name='text' value='متن'/>
+ <cd:constant name='textcolor' value='رنگ‌متن'/>
+ <cd:constant name='textcommand' value='فرمان‌متن'/>
+ <cd:constant name='textdistance' value='فاصله‌متن'/>
+ <cd:constant name='textlayer' value='لایه‌متن'/>
+ <cd:constant name='textmargin' value='حاشیه‌متن'/>
+ <cd:constant name='textmethod' value='روش‌متن'/>
+ <cd:constant name='textseparator' value='جداکننده‌متن'/>
+ <cd:constant name='textsize' value='اندازه‌متن'/>
+ <cd:constant name='textstate' value='وضعیت‌متن'/>
+ <cd:constant name='textstyle' value='سبک‌متن'/>
+ <cd:constant name='textwidth' value='عرض‌متن'/>
+ <cd:constant name='title' value='عنوان'/>
+ <cd:constant name='titlecolor' value='رنگ‌عنوان'/>
+ <cd:constant name='titlecommand' value='فرمان‌عنوان'/>
+ <cd:constant name='titledistance' value='فاصله‌عنوان'/>
+ <cd:constant name='titleleft' value='عنوان‌چپ'/>
+ <cd:constant name='titleright' value='عنوان‌راست'/>
+ <cd:constant name='titlestyle' value='سبک‌عنوان'/>
+ <cd:constant name='to' value='به'/>
+ <cd:constant name='tolerance' value='بردباری'/>
+ <cd:constant name='top' value='بالا'/>
+ <cd:constant name='topdistance' value='فاصله‌بالا'/>
+ <cd:constant name='topframe' value='قالب‌راست'/>
+ <cd:constant name='topoffset' value='آفست‌بالا'/>
+ <cd:constant name='topspace' value='فضای‌بالا'/>
+ <cd:constant name='topstate' value='وضعیت‌بالا'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='تایپ'/>
+ <cd:constant name='unit' value='واحد'/>
+ <cd:constant name='unknownreference' value='مرجع‌ناشناس'/>
+ <cd:constant name='urlalternative' value='urlalternative'/>
+ <cd:constant name='urlspace' value='urlspace'/>
+ <cd:constant name='validate' value='تاییداعتبار'/>
+ <cd:constant name='vcommand' value='vcommand'/>
+ <cd:constant name='veroffset' value='آفست‌عم'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='آفست‌ع'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='راه'/>
+ <cd:constant name='wfactor' value='wfactor'/>
+ <cd:constant name='white' value='سفید'/>
+ <cd:constant name='width' value='عرض'/>
+ <cd:constant name='xfactor' value='فاکتورایکس'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='آفست‌ایکس'/>
+ <cd:constant name='xscale' value='مقیاس‌ایکس'/>
+ <cd:constant name='xstep' value='گام‌ایکس'/>
+ <cd:constant name='yfactor' value='فاکتوروای'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='آفست‌وای'/>
+ <cd:constant name='yscale' value='مقیاس‌وای'/>
+ <cd:constant name='ystep' value='گام‌وای'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language pe -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='answerlines'/>
+ <cd:element name='answerspace' value='answerspace'/>
+ <cd:element name='begin' value='عنصرها'/>
+ <cd:element name='complete' value='کامل'/>
+ <cd:element name='coupled' value='مزدوج'/>
+ <cd:element name='currentlocal' value='موضعی‌جاری'/>
+ <cd:element name='emptyone' value='یک‌خالی'/>
+ <cd:element name='emptytwo' value='دوخالی'/>
+ <cd:element name='end' value='انتها'/>
+ <cd:element name='endsetup' value='انتهای‌بارگذاری'/>
+ <cd:element name='get' value='بگیر'/>
+ <cd:element name='increment' value='افزایش'/>
+ <cd:element name='list' value='لیست'/>
+ <cd:element name='listof' value='لیست‌از'/>
+ <cd:element name='load' value='بارگذاشتن'/>
+ <cd:element name='local' value='موضعی'/>
+ <cd:element name='makeup' value='آرایش'/>
+ <cd:element name='next' value='بعدی'/>
+ <cd:element name='place' value='مکان'/>
+ <cd:element name='previous' value='قبلی'/>
+ <cd:element name='previouslocal' value='موضع‌قبلی'/>
+ <cd:element name='reserve' value='رزرو'/>
+ <cd:element name='see' value='ببینید'/>
+ <cd:element name='setup' value='بارگذاری'/>
+ <cd:element name='start' value='شروع'/>
+ <cd:element name='stop' value='پایان'/>
+ <cd:element name='text' value='متن'/>
+ <cd:element name='type' value='تایپ'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language pe -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='CAP'/>
+ <cd:command name='Character' value='Character'/>
+ <cd:command name='Characters' value='Characters'/>
+ <cd:command name='LABELTEXT' value='LABELTEXT'/>
+ <cd:command name='MONTH' value='MONTH'/>
+ <cd:command name='Numbers' value='Numbers'/>
+ <cd:command name='Romannumerals' value='Romannumerals'/>
+ <cd:command name='SmallCapped' value='Cap'/>
+ <cd:command name='SmallCaps' value='Caps'/>
+ <cd:command name='WEEKDAY' value='WEEKDAY'/>
+ <cd:command name='WORD' value='WORD'/>
+ <cd:command name='WORDS' value='WORDS'/>
+ <cd:command name='Word' value='Word'/>
+ <cd:command name='Words' value='Words'/>
+ <cd:command name='about' value='درمورد'/>
+ <cd:command name='adaptlayout' value='تنظیم‌طرح‌بندی'/>
+ <cd:command name='arg' value='افزودن'/>
+ <cd:command name='at' value='در'/>
+ <cd:command name='atleftmargin' value='درحاشیه‌چپ'/>
+ <cd:command name='atpage' value='درصفحه'/>
+ <cd:command name='atrightmargin' value='درحاشیه‌راست'/>
+ <cd:command name='background' value='پس‌زمینه'/>
+ <cd:command name='backspace' value='فاصله‌پشت'/>
+ <cd:command name='blackrule' value='خط‌سیاه'/>
+ <cd:command name='blackrules' value='خطهای‌سیاه'/>
+ <cd:command name='blank' value='خالی'/>
+ <cd:command name='bookmark' value='چوبخط'/>
+ <cd:command name='bottomdistance' value='فاصله‌پایین'/>
+ <cd:command name='bottomheight' value='ارتفاع‌پایین'/>
+ <cd:command name='bottomspace' value='فضای‌پایین'/>
+ <cd:command name='but' value='اما'/>
+ <cd:command name='button' value='دکمه'/>
+ <cd:command name='bypassblocks' value='عبوربلوکها'/>
+ <cd:command name='character' value='حرف'/>
+ <cd:command name='characters' value='حرفها'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='گیره'/>
+ <cd:command name='clonefield' value='میدان‌شبیه‌سازی'/>
+ <cd:command name='color' value='رنگ'/>
+ <cd:command name='colorbar' value='میله‌رنگ'/>
+ <cd:command name='colorvalue' value='مقداررنگ'/>
+ <cd:command name='column' value='ستون'/>
+ <cd:command name='comment' value='توضیح'/>
+ <cd:command name='comparecolorgroup' value='مقایسه‌گروه‌رنگ'/>
+ <cd:command name='comparepalet' value='لوح‌مقایسه'/>
+ <cd:command name='completepagenumber' value='شماره‌صفحه‌کامل'/>
+ <cd:command name='completeregister' value='ثبت‌کامل'/>
+ <cd:command name='component' value='مولفه'/>
+ <cd:command name='convertnumber' value='شماره‌مبدل'/>
+ <cd:command name='copyfield' value='میدان‌کپی'/>
+ <cd:command name='correctwhitespace' value='فضای‌سفیدصحیح'/>
+ <cd:command name='coupledocument' value='نوشتارزوج'/>
+ <cd:command name='couplemarking' value='نشانه‌گذاری‌زوج'/>
+ <cd:command name='couplepage' value='صفحه‌زوج'/>
+ <cd:command name='couplepaper' value='کاغذزوج'/>
+ <cd:command name='coupleregister' value='ثبت‌زوج'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='تاریخ‌جاری'/>
+ <cd:command name='currentheadnumber' value='شماره‌سرجاری'/>
+ <cd:command name='cutspace' value='فضای‌برش'/>
+ <cd:command name='date' value='تاریخ'/>
+ <cd:command name='decouplemarking' value='جداسازی‌نشانه‌گذاری'/>
+ <cd:command name='decrementnumber' value='شماره‌کاهش'/>
+ <cd:command name='define' value='تعریف'/>
+ <cd:command name='defineaccent' value='تعریف‌لهجه'/>
+ <cd:command name='defineblank' value='تعریف‌خالی'/>
+ <cd:command name='defineblock' value='تعریف‌بلوک'/>
+ <cd:command name='definebodyfont' value='تعریف‌قلم‌متن'/>
+ <cd:command name='definebodyfontenvironment' value='تعریف‌محیط‌قلم‌بدنه'/>
+ <cd:command name='definebuffer' value='تعریف‌بافر'/>
+ <cd:command name='definecharacter' value='تعریف‌حرف'/>
+ <cd:command name='definecolor' value='تعریف‌رنگ'/>
+ <cd:command name='definecolorgroup' value='تعریف‌گروه‌رنگ'/>
+ <cd:command name='definecolumnbreak' value='تعریف‌شکستن‌ستون'/>
+ <cd:command name='definecolumnset' value='تعریف‌مجموعه‌ستون'/>
+ <cd:command name='definecombination' value='تعریف‌ترکیب'/>
+ <cd:command name='definecombinedlist' value='تعریف‌لیست‌ترکیبی'/>
+ <cd:command name='definecommand' value='تعریف‌فرمان'/>
+ <cd:command name='defineconversion' value='تعریف‌تبدیل'/>
+ <cd:command name='definedescription' value='تعریف‌شرح'/>
+ <cd:command name='defineenumeration' value='تعریف‌شماره‌بندی'/>
+ <cd:command name='definefield' value='تعریف‌میدان'/>
+ <cd:command name='definefieldstack' value='تعریف‌توده‌میدان'/>
+ <cd:command name='definefiguresymbol' value='تعریف‌نمادشکل'/>
+ <cd:command name='definefloat' value='تعریف‌شناور'/>
+ <cd:command name='definefont' value='تعریف‌قلم'/>
+ <cd:command name='definefontstyle' value='تعریف‌سبک‌قلم'/>
+ <cd:command name='definefontsynonym' value='تعریف‌مترادف‌قلم'/>
+ <cd:command name='defineframed' value='تعریف‌قالبی'/>
+ <cd:command name='defineframedtext' value='تعریف‌متن‌قالبی'/>
+ <cd:command name='definehbox' value='تعریف‌جعبه‌‌افقی'/>
+ <cd:command name='definehead' value='تعریف‌سر'/>
+ <cd:command name='defineindenting' value='تعریف‌تورفتگی'/>
+ <cd:command name='defineinmargin' value='تعریف‌درون‌حاشیه'/>
+ <cd:command name='defineinteractionmenu' value='تعریف‌منوی‌پانل'/>
+ <cd:command name='defineitemgroup' value='تعریف‌گروه‌آیتم'/>
+ <cd:command name='definelabel' value='تعریف‌برچسب'/>
+ <cd:command name='definelayer' value='تعریف‌لایه'/>
+ <cd:command name='definelayout' value='تعریف‌طرح‌بندی'/>
+ <cd:command name='definelist' value='تعریف‌لیست'/>
+ <cd:command name='definelogo' value='تعریف‌آرم'/>
+ <cd:command name='definemainfield' value='تعریف‌میدان‌اصلی'/>
+ <cd:command name='definemakeup' value='تعریف‌آرایش'/>
+ <cd:command name='definemarking' value='تعریف‌نشانه‌گذاری'/>
+ <cd:command name='definemathalignment' value='تعریف‌تنظیم‌ریاضی'/>
+ <cd:command name='defineoutput' value='تعریف‌خروجی'/>
+ <cd:command name='defineoverlay' value='تعریف‌پوشش'/>
+ <cd:command name='definepagebreak' value='تعریف‌شکست‌صفحه'/>
+ <cd:command name='definepalet' value='تعریف‌لوح'/>
+ <cd:command name='definepapersize' value='تعریف‌اندازه‌برگ'/>
+ <cd:command name='defineparagraphs' value='تعریف‌پاراگرافها'/>
+ <cd:command name='defineplacement' value='تعریف‌جانشانی'/>
+ <cd:command name='defineprofile' value='تعریف‌پروفایل'/>
+ <cd:command name='defineprogram' value='تعریف‌برنامه'/>
+ <cd:command name='definerawfont' value='تعریف‌قلم‌خام'/>
+ <cd:command name='definereference' value='تعریف‌مرجع'/>
+ <cd:command name='definereferenceformat' value='تعریف‌شمایل‌مرجع'/>
+ <cd:command name='definereferencelist' value='تعریف‌لیست‌مرجع'/>
+ <cd:command name='defineregister' value='تعریف‌ثبت'/>
+ <cd:command name='definerule' value='تعریف‌خط‌حائل'/>
+ <cd:command name='definesection' value='تعریف‌بخش'/>
+ <cd:command name='definesectionblock' value='تعریف‌بلوک‌بخش'/>
+ <cd:command name='definesorting' value='تعریف‌ترتیب'/>
+ <cd:command name='definestartstop' value='تعریف‌شروع‌پایان'/>
+ <cd:command name='definestyle' value='تعریف‌سبک'/>
+ <cd:command name='definesubfield' value='تعریف‌زیرمیدان'/>
+ <cd:command name='definesymbol' value='تعریف‌نماد'/>
+ <cd:command name='definesynonyms' value='تعریف‌مترادفها'/>
+ <cd:command name='definetabletemplate' value='تعریف‌الگوی‌جدول'/>
+ <cd:command name='definetabulate' value='تعریف‌جدول‌بندی'/>
+ <cd:command name='definetext' value='تعریف‌متن'/>
+ <cd:command name='definetextposition' value='تعریف‌مکان‌متن'/>
+ <cd:command name='definetextvariable' value='تعریف‌متغیرمتن'/>
+ <cd:command name='definetype' value='تعریف‌تایپ'/>
+ <cd:command name='definetyping' value='تعریف‌تایپ‌کردن'/>
+ <cd:command name='defineversion' value='تعریف‌نسخه'/>
+ <cd:command name='determineheadnumber' value='تعیین‌شماره‌سر'/>
+ <cd:command name='determinelistcharacteristics' value='تعیین‌مشخصات‌لیست'/>
+ <cd:command name='determineregistercharacteristics' value='تعیین‌مشخصات‌ثبت'/>
+ <cd:command name='dimension' value='بعد'/>
+ <cd:command name='disableinteractionmenu' value='ازکارانداختن‌منوی‌پانل'/>
+ <cd:command name='domicile' value='مسکن'/>
+ <cd:command name='donttest' value='امتحان‌نکن'/>
+ <cd:command name='edgedistance' value='فاصله‌لبه'/>
+ <cd:command name='edgewidth' value='عرض‌لبه'/>
+ <cd:command name='emptylines' value='خطها‌خالی'/>
+ <cd:command name='environment' value='محیط'/>
+ <cd:command name='externalfigure' value='شکل‌خارجی'/>
+ <cd:command name='fact' value='حقیقت'/>
+ <cd:command name='field' value='میدان'/>
+ <cd:command name='fieldstack' value='میدان‌پشته'/>
+ <cd:command name='fillinfield' value='درج‌درمیدان'/>
+ <cd:command name='fillinline' value='درج‌درخط'/>
+ <cd:command name='fillinrules' value='درج‌درخطها'/>
+ <cd:command name='fillintext' value='درج‌درمتن'/>
+ <cd:command name='fitfield' value='پرکردن‌میدان'/>
+ <cd:command name='fixedspace' value='فضای‌ثابت'/>
+ <cd:command name='fixedspaces' value='فضاهای‌ثابت'/>
+ <cd:command name='followprofile' value='پیروی‌پروفایل'/>
+ <cd:command name='followprofileversion' value='پیروی‌نسخه‌پروفایل'/>
+ <cd:command name='followversion' value='پیروی‌نسخه'/>
+ <cd:command name='footerdistance' value='فاصله‌ته‌برگ'/>
+ <cd:command name='footerheight' value='ارتفاع‌ته‌برگ'/>
+ <cd:command name='footnote' value='پانوشت'/>
+ <cd:command name='footnotetext' value='متن‌پانوشت'/>
+ <cd:command name='forceblocks' value='اجباربلوکها'/>
+ <cd:command name='formulanumber' value='شماره‌فرمول'/>
+ <cd:command name='fraction' value='کسر'/>
+ <cd:command name='framed' value='قالبی'/>
+ <cd:command name='from' value='از'/>
+ <cd:command name='getbuffer' value='دریافت‌بافر'/>
+ <cd:command name='getmarking' value='دریافت‌نشانه'/>
+ <cd:command name='getnumber' value='دریافت‌شماره'/>
+ <cd:command name='godown' value='بروپایین'/>
+ <cd:command name='goto' value='بروبه'/>
+ <cd:command name='gotobox' value='بروبه‌جعبه'/>
+ <cd:command name='gotopage' value='بروبه‌صفحه'/>
+ <cd:command name='graycolor' value='رنگ‌خاکستری'/>
+ <cd:command name='greyvalue' value='مقدارخاکستری'/>
+ <cd:command name='grid' value='توری'/>
+ <cd:command name='hairline' value='خط‌مو'/>
+ <cd:command name='head' value='سر'/>
+ <cd:command name='headerdistance' value='فاصله‌سربرگ'/>
+ <cd:command name='headerheight' value='ارتفاع‌سربرگ'/>
+ <cd:command name='headlevel' value='مرحله‌سر'/>
+ <cd:command name='headnumber' value='شماره‌سر'/>
+ <cd:command name='headsym' value='نمادسر'/>
+ <cd:command name='headtext' value='متن‌سر'/>
+ <cd:command name='hideblocks' value='بلوکها‌پنهان'/>
+ <cd:command name='high' value='بلند'/>
+ <cd:command name='hl' value='خ‌ا'/>
+ <cd:command name='immediatebetweenlist' value='فوری‌بین‌لیست'/>
+ <cd:command name='immediatetolist' value='فوری‌به‌لیست'/>
+ <cd:command name='in' value='درون'/>
+ <cd:command name='incrementnumber' value='شماره‌افزایش'/>
+ <cd:command name='indenting' value='تورفتگی'/>
+ <cd:command name='inframed' value='درقالبی'/>
+ <cd:command name='infull' value='درپر'/>
+ <cd:command name='ininner' value='درداخلی'/>
+ <cd:command name='inleft' value='درچپ'/>
+ <cd:command name='inleftedge' value='درلبه‌چپ'/>
+ <cd:command name='inleftmargin' value='درحاشیه‌چپ'/>
+ <cd:command name='inline' value='درخط'/>
+ <cd:command name='inmargin' value='درحاشیه'/>
+ <cd:command name='inmframed' value='inmframed'/>
+ <cd:command name='inneredgedistance' value='فاصله‌لبه‌داخلی'/>
+ <cd:command name='inneredgewidth' value='عرض‌لبه‌داخلی'/>
+ <cd:command name='innermargindistance' value='فاصله‌حاشیه‌داخلی'/>
+ <cd:command name='innermarginwidth' value='عرض‌حاشیه‌داخلی'/>
+ <cd:command name='inothermargin' value='درحاشیه‌دیگر'/>
+ <cd:command name='inouter' value='درخارجی'/>
+ <cd:command name='inright' value='درراست'/>
+ <cd:command name='inrightedge' value='درلبه‌راست'/>
+ <cd:command name='inrightmargin' value='درحاشیه‌راست'/>
+ <cd:command name='installlanguage' value='نصب‌زبان'/>
+ <cd:command name='interactionbar' value='میله‌پانل'/>
+ <cd:command name='interactionbuttons' value='دکمه‌پانل'/>
+ <cd:command name='interactionmenu' value='منوی‌پانل'/>
+ <cd:command name='item' value='آیتم'/>
+ <cd:command name='items' value='آیتمها'/>
+ <cd:command name='its' value='its'/>
+ <cd:command name='keepblocks' value='حفظ‌بلوکها'/>
+ <cd:command name='label' value='برچسب'/>
+ <cd:command name='labels' value='برچسبها'/>
+ <cd:command name='labeltext' value='متن‌برچسب'/>
+ <cd:command name='language' value='زبان'/>
+ <cd:command name='leftaligned' value='چپ‌چین'/>
+ <cd:command name='leftedgedistance' value='فاصله‌لبه‌چپ'/>
+ <cd:command name='leftedgewidth' value='عرض‌لبه‌چپ'/>
+ <cd:command name='leftmargindistance' value='فاصله‌حاشیه‌چپ'/>
+ <cd:command name='leftmarginwidth' value='عرض‌حاشیه‌چپ'/>
+ <cd:command name='leg' value='پا'/>
+ <cd:command name='linewidth' value='عرض‌خط'/>
+ <cd:command name='listheight' value='ارتفاع‌خط'/>
+ <cd:command name='listlength' value='طول‌لیست'/>
+ <cd:command name='listsymbol' value='نمادلیست'/>
+ <cd:command name='listwidth' value='عرض‌لیست'/>
+ <cd:command name='logfields' value='میدانهای‌گزارش'/>
+ <cd:command name='lohi' value='پابا'/>
+ <cd:command name='low' value='پایین'/>
+ <cd:command name='macroname' value='نام‌ماکرو'/>
+ <cd:command name='mainlanguage' value='زبان‌اصلی'/>
+ <cd:command name='makeupheight' value='ارتفاع‌آرایش'/>
+ <cd:command name='makeupwidth' value='عرض‌آرایش'/>
+ <cd:command name='mar' value='حاش'/>
+ <cd:command name='margindistance' value='فاصله‌حاشیه'/>
+ <cd:command name='marginrule' value='خط‌حاشیه'/>
+ <cd:command name='margintext' value='متن‌حاشیه'/>
+ <cd:command name='margintitle' value='عنوان‌حاشیه'/>
+ <cd:command name='marginwidth' value='عرض‌حاشیه'/>
+ <cd:command name='marginword' value='کلمه‌حاشیه'/>
+ <cd:command name='marking' value='نشانه‌گذاری'/>
+ <cd:command name='markversion' value='نسخه‌نشانه'/>
+ <cd:command name='mathematics' value='ریاضی'/>
+ <cd:command name='menubutton' value='دکمه‌منو'/>
+ <cd:command name='mframed' value='mframed'/>
+ <cd:command name='midaligned' value='تنظیم‌وسط'/>
+ <cd:command name='mirror' value='آینه'/>
+ <cd:command name='month' value='ماه'/>
+ <cd:command name='moveformula' value='انتقال‌فرمول'/>
+ <cd:command name='moveongrid' value='انتقال‌به‌توری'/>
+ <cd:command name='movesidefloat' value='انتقال‌کنار‌شناور'/>
+ <cd:command name='navigating' value='هدایت'/>
+ <cd:command name='nodimension' value='بدون‌بعد'/>
+ <cd:command name='noheaderandfooterlines' value='بدون‌خط‌سروته‌برگ'/>
+ <cd:command name='noindenting' value='بدون‌تورفتگی'/>
+ <cd:command name='nolist' value='بدون‌لیست'/>
+ <cd:command name='nomarking' value='بدون‌نشانه‌گذاری'/>
+ <cd:command name='nomoreblocks' value='بدون‌بلوکهای‌بیشتر'/>
+ <cd:command name='nomorefiles' value='بدون‌فایلهای‌بیشتر'/>
+ <cd:command name='nop' value='منفی'/>
+ <cd:command name='nospace' value='بدون‌فضا'/>
+ <cd:command name='note' value='یادداشت'/>
+ <cd:command name='notopandbottomlines' value='بدون‌خط‌بالاوپایین'/>
+ <cd:command name='notsmallcapped' value='سرپوش‌کوچک‌نه'/>
+ <cd:command name='nowhitespace' value='بدون‌فضای‌سفید'/>
+ <cd:command name='numberofsubpages' value='شماره‌زیرصفحه'/>
+ <cd:command name='numbers' value='شماره‌ها'/>
+ <cd:command name='outeredgedistance' value='فاصله‌لبه‌خارجی'/>
+ <cd:command name='outeredgewidth' value='عرض‌لبه‌خارجی'/>
+ <cd:command name='outermargindistance' value='فاصله‌حاشیه‌خارجی'/>
+ <cd:command name='outermarginwidth' value='عرض‌حاشیه‌خارجی'/>
+ <cd:command name='packed' value='فشرده'/>
+ <cd:command name='page' value='صفحه'/>
+ <cd:command name='pagedepth' value='عمق‌صفحه'/>
+ <cd:command name='pagenumber' value='شماره‌صفحه'/>
+ <cd:command name='pageoffset' value='آفست‌صفحه'/>
+ <cd:command name='pagereference' value='مرجع‌صفحه'/>
+ <cd:command name='pagetype' value='نوع‌صفحه'/>
+ <cd:command name='paperheight' value='ارتفاع‌برگ'/>
+ <cd:command name='paperwidth' value='عرض‌برگ'/>
+ <cd:command name='periods' value='نقطه‌ها'/>
+ <cd:command name='plaatsruwelijst' value='درج‌لیست‌خام'/>
+ <cd:command name='placebookmarks' value='درج‌چوب‌خط'/>
+ <cd:command name='placecombinedlist' value='درج‌لیست‌مختلط'/>
+ <cd:command name='placefloat' value='درج‌شناور'/>
+ <cd:command name='placefootnotes' value='درج‌پانوشتها'/>
+ <cd:command name='placeformula' value='درج‌فرمول'/>
+ <cd:command name='placeheadnumber' value='درج‌شماره‌سر'/>
+ <cd:command name='placeheadtext' value='درج‌متن‌سر'/>
+ <cd:command name='placelegend' value='درج‌راهنما'/>
+ <cd:command name='placelist' value='درج‌لیست'/>
+ <cd:command name='placelocalfootnotes' value='درج‌پانوشتهای‌موضعی'/>
+ <cd:command name='placelogos' value='درج‌آرمها'/>
+ <cd:command name='placeongrid' value='درج‌در‌توری'/>
+ <cd:command name='placeontopofeachother' value='درج‌در‌بالای‌یکدیگر'/>
+ <cd:command name='placepagenumber' value='درج‌شماره‌صفحه'/>
+ <cd:command name='placereferencelist' value='درج‌لیست‌مرجع'/>
+ <cd:command name='placeregister' value='درج‌ثبت'/>
+ <cd:command name='placerule' value='درج‌خط'/>
+ <cd:command name='placesidebyside' value='درج‌کنار‌به‌کنار'/>
+ <cd:command name='placesubformula' value='درج‌زیرفرمول'/>
+ <cd:command name='placetextvariable' value='درج‌متغیرمتن'/>
+ <cd:command name='position' value='مکان'/>
+ <cd:command name='positiontext' value='مکان‌متن'/>
+ <cd:command name='printpaperheight' value='چاپ‌ارتفاع‌برگ'/>
+ <cd:command name='printpaperwidth' value='چاپ‌عرض‌برگ'/>
+ <cd:command name='processblocks' value='بلوکهای‌پردازش'/>
+ <cd:command name='processpage' value='صفحه‌پردازش'/>
+ <cd:command name='product' value='تولید'/>
+ <cd:command name='program' value='برنامه'/>
+ <cd:command name='project' value='پروژه'/>
+ <cd:command name='publication' value='نشر'/>
+ <cd:command name='quotation' value='نقل‌قول'/>
+ <cd:command name='quote' value='نقل'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='انجام‌دوباره'/>
+ <cd:command name='ref' value='رج'/>
+ <cd:command name='reference' value='مرجع'/>
+ <cd:command name='referral' value='رجوع'/>
+ <cd:command name='referraldate' value='تاریخ‌رجوع'/>
+ <cd:command name='referring' value='مراجعه'/>
+ <cd:command name='remark' value='توجه'/>
+ <cd:command name='reset' value='بازنشانی'/>
+ <cd:command name='resetmarking' value='بازنشانی‌نشانه‌گذاری'/>
+ <cd:command name='resetnumber' value='بازنشانی‌شماره'/>
+ <cd:command name='resettext' value='بازنشانی‌متن'/>
+ <cd:command name='rightaligned' value='تنظیم‌راست'/>
+ <cd:command name='rightedgedistance' value='فاصله‌لبه‌راست'/>
+ <cd:command name='rightedgewidth' value='عرض‌لبه‌راست'/>
+ <cd:command name='rightmargindistance' value='فاصله‌حاشیه‌راست'/>
+ <cd:command name='rightmarginwidth' value='عرض‌حاشیه‌راست'/>
+ <cd:command name='romannumerals' value='اعدادلاتین'/>
+ <cd:command name='rotate' value='دوران'/>
+ <cd:command name='scale' value='مقیاس'/>
+ <cd:command name='screen' value='پرده'/>
+ <cd:command name='selectblocks' value='انتخاب‌بلوکها'/>
+ <cd:command name='selectpaper' value='انتخاب‌برگ'/>
+ <cd:command name='selectversion' value='انتخاب‌نسخه'/>
+ <cd:command name='setnumber' value='تعیین‌شماره'/>
+ <cd:command name='settextcontent' value='تعیین‌محتوای‌متن'/>
+ <cd:command name='settextvariable' value='تعیین‌متغیر‌متن'/>
+ <cd:command name='setupalign' value='بارگذاری‌تنظیم'/>
+ <cd:command name='setupanswerarea' value='setupanswerarea'/>
+ <cd:command name='setuparranging' value='بارگذاری‌ترتیب'/>
+ <cd:command name='setupbackground' value='بارگذاری‌پس‌زمینه'/>
+ <cd:command name='setupbackgrounds' value='بارگذاری‌پس‌زمینه‌ها'/>
+ <cd:command name='setupblackrules' value='بارگذاری‌خطهای‌سیاه'/>
+ <cd:command name='setupblank' value='بارگذاری‌خالی'/>
+ <cd:command name='setupblock' value='بارگذاری‌بلوک'/>
+ <cd:command name='setupbodyfont' value='بارگذاری‌قلم‌متن'/>
+ <cd:command name='setupbodyfontenvironment' value='بارگذاری‌محیط‌قلم‌متن'/>
+ <cd:command name='setupbottom' value='بارگذاری‌پایین'/>
+ <cd:command name='setupbottomtexts' value='بارگذاری‌متن‌پایین'/>
+ <cd:command name='setupbuffer' value='بارگذاری‌بافر'/>
+ <cd:command name='setupbuttons' value='بارگذاری‌دکمه‌ها'/>
+ <cd:command name='setupcapitals' value='setupcapitals'/>
+ <cd:command name='setupcaption' value='بارگذاری‌شرح'/>
+ <cd:command name='setupcaptions' value='بارگذاری‌شرحها'/>
+ <cd:command name='setupclipping' value='بارگذاری‌چیدن'/>
+ <cd:command name='setupcolor' value='بارگذاری‌رنگ'/>
+ <cd:command name='setupcolors' value='بارگذاری‌رنگها'/>
+ <cd:command name='setupcolumns' value='بارگذاری‌ستونها'/>
+ <cd:command name='setupcolumnset' value='بارگذاری‌مجموعه‌ستون'/>
+ <cd:command name='setupcolumnsetlines' value='بارگذاری‌خطهای‌مجموعه‌ستون'/>
+ <cd:command name='setupcolumnsetstart' value='بارگذاری‌شروع‌مجموعه‌ستون'/>
+ <cd:command name='setupcombinations' value='بارگذاری‌ترکیب‌ها'/>
+ <cd:command name='setupcombinedlist' value='بارگذاری‌لیست‌ترکیبی'/>
+ <cd:command name='setupcomment' value='بارگذاری‌توضیح'/>
+ <cd:command name='setupdescriptions' value='بارگذاری‌شرح'/>
+ <cd:command name='setupenumerations' value='بارگذاری‌شماره‌گذاریها'/>
+ <cd:command name='setupexternalfigures' value='بارگذاری‌شکلهای‌خارجی'/>
+ <cd:command name='setupfield' value='بارگذاری‌میدان'/>
+ <cd:command name='setupfields' value='بارگذاری‌میدانها'/>
+ <cd:command name='setupfillinlines' value='بارگذاری‌پرکردن‌خطها'/>
+ <cd:command name='setupfillinrules' value='بارگذاری‌درج‌درخطها'/>
+ <cd:command name='setupfloat' value='بارگذاری‌شناور'/>
+ <cd:command name='setupfloats' value='بارگذاری‌شناورها'/>
+ <cd:command name='setupfloatsplitting' value='بارگذاری‌شکافتن‌شناورها'/>
+ <cd:command name='setupfooter' value='بارگذاری‌ته‌برگ'/>
+ <cd:command name='setupfootertexts' value='بارگذاری‌متن‌پانوشت'/>
+ <cd:command name='setupfootnotedefinition' value='بارگذاری‌تعریف‌پانوشت'/>
+ <cd:command name='setupfootnotes' value='بارگذاری‌پانوشتها'/>
+ <cd:command name='setupforms' value='بارگذاری‌طرح'/>
+ <cd:command name='setupformulas' value='بارگذاری‌فرمولها'/>
+ <cd:command name='setupframed' value='بارگذاری‌قالبی'/>
+ <cd:command name='setupframedtexts' value='بارگذاری‌متن‌قالبی'/>
+ <cd:command name='setuphead' value='بارگذاری‌سر'/>
+ <cd:command name='setupheader' value='بارگذاری‌سربرگ'/>
+ <cd:command name='setupheadertexts' value='بارگذاری‌متن‌سربرگ'/>
+ <cd:command name='setupheadnumber' value='بارگذاری‌شماره‌سر'/>
+ <cd:command name='setupheads' value='بارگذاری‌سرها'/>
+ <cd:command name='setupheadtext' value='بارگذاری‌متن‌سر'/>
+ <cd:command name='setuphyphenmark' value='بارگذاری‌نشانه‌شکستن'/>
+ <cd:command name='setupindentations' value='بارگذاری‌تورفتگیها'/>
+ <cd:command name='setupindenting' value='بارگذاری‌تورفتگی'/>
+ <cd:command name='setupinmargin' value='بارگذاری‌درون‌حاشیه'/>
+ <cd:command name='setupinteraction' value='بارگذاری‌پانل'/>
+ <cd:command name='setupinteractionbar' value='بارگذاری‌میله‌پانل'/>
+ <cd:command name='setupinteractionmenu' value='بارگذاری‌منوی‌پانل'/>
+ <cd:command name='setupinteractionscreen' value='بارگذاری‌پرده‌پانل'/>
+ <cd:command name='setupinterlinespace' value='بارگذاری‌فاصله‌بین‌خط'/>
+ <cd:command name='setupitemgroup' value='بارگذاری‌گروه‌آیتم'/>
+ <cd:command name='setupitemgroups' value='بارگذاری‌گروههای‌آیتم'/>
+ <cd:command name='setupitems' value='بارگذاری‌آیتمها'/>
+ <cd:command name='setuplabeltext' value='باگذاری‌متن‌برچسب'/>
+ <cd:command name='setuplanguage' value='بارگذاری‌زبان'/>
+ <cd:command name='setuplayout' value='بارگذاری‌طرح‌بندی'/>
+ <cd:command name='setuplegend' value='بارگذاری‌راهنما'/>
+ <cd:command name='setuplinenumbering' value='بارگذاری‌شماره‌‌گذاری‌خط'/>
+ <cd:command name='setuplines' value='بارگذاری‌خطها'/>
+ <cd:command name='setuplinewidth' value='بارگذاری‌عرض‌خط'/>
+ <cd:command name='setuplist' value='بارگذاری‌لیست'/>
+ <cd:command name='setupmakeup' value='بارگذاری‌آرایش'/>
+ <cd:command name='setupmarginblocks' value='بارگذاری‌بلوکهای‌حاشیه'/>
+ <cd:command name='setupmarginrules' value='بارگذاری‌خطهای‌حاشیه'/>
+ <cd:command name='setupmarking' value='بارگذاری‌نشانه‌گذاری'/>
+ <cd:command name='setupmathalignment' value='بارگذاری‌تنظیم‌ریاضی'/>
+ <cd:command name='setupnarrower' value='بارگذاری‌باریکتر'/>
+ <cd:command name='setupnumber' value='بارگذاری‌شماره'/>
+ <cd:command name='setupnumbering' value='بارگذاری‌شماره‌گذاری'/>
+ <cd:command name='setupoppositeplacing' value='بارگذاری‌درج‌مخالف'/>
+ <cd:command name='setupoutput' value='بارگذاری‌خروجی'/>
+ <cd:command name='setuppagecomment' value='بارگذاری‌توضیح‌صفحه'/>
+ <cd:command name='setuppagenumber' value='بارگذاری‌شماره‌صفحه'/>
+ <cd:command name='setuppagenumbering' value='بارگذاری‌شماره‌گذاری‌صفحه'/>
+ <cd:command name='setuppagetransitions' value='بارگذاری‌گذارصفحه'/>
+ <cd:command name='setuppalet' value='بارگذاری‌لوح'/>
+ <cd:command name='setuppaper' value='بارگذاری‌برگ'/>
+ <cd:command name='setuppapersize' value='بارگذاری‌اندازه‌برگ'/>
+ <cd:command name='setupparagraphnumbering' value='بارگذاری‌شماره‌گذاری‌پاراگراف'/>
+ <cd:command name='setupparagraphs' value='بارگذاری‌پاراگرافها'/>
+ <cd:command name='setupplacement' value='بارگذاری‌جانشانی'/>
+ <cd:command name='setuppositioning' value='بارگذاری‌مکان‌گذاری'/>
+ <cd:command name='setupprofiles' value='بارگذاری‌پروفایلها'/>
+ <cd:command name='setupprograms' value='بارگذاری‌برنامه‌ها'/>
+ <cd:command name='setuppublications' value='بارگذاری‌نشرها'/>
+ <cd:command name='setupquote' value='بارگذاری‌نقل'/>
+ <cd:command name='setupreferencelist' value='بارگذاری‌لیست‌مرجع'/>
+ <cd:command name='setupreferencing' value='بارگذاری‌ارجاع'/>
+ <cd:command name='setupregister' value='بارگذاری‌ثبت'/>
+ <cd:command name='setuprotate' value='بارگذاری‌دوران'/>
+ <cd:command name='setuprule' value='بارگذاری‌خط'/>
+ <cd:command name='setups' value='بارگذاریها'/>
+ <cd:command name='setupscreens' value='بارگذاری‌پرده‌ها'/>
+ <cd:command name='setupsection' value='بارگذاری‌بخش'/>
+ <cd:command name='setupsectionblock' value='بارگذاری‌بلوک‌بخش'/>
+ <cd:command name='setupsorting' value='بارگذاری‌ترتیب'/>
+ <cd:command name='setupspacing' value='بارگذاری‌فضا‌گذاری'/>
+ <cd:command name='setupstartstop' value='بارگذاری‌شروع‌پایان'/>
+ <cd:command name='setupstrut' value='بارگذاری‌بست'/>
+ <cd:command name='setupsubpagenumber' value='بارگذاری‌شماره‌زیرصفحه'/>
+ <cd:command name='setupsymbolset' value='بارگذاری‌مجموعه‌نماد'/>
+ <cd:command name='setupsynchronization' value='بارگذاری‌تطابق'/>
+ <cd:command name='setupsynchronizationbar' value='بارگذاری‌میله‌تطابق'/>
+ <cd:command name='setupsynonyms' value='بارگذاری‌مترادفها'/>
+ <cd:command name='setupsystem' value='بارگذاری‌سیستم'/>
+ <cd:command name='setuptab' value='بارگذاری‌تب'/>
+ <cd:command name='setuptables' value='بارگذاری‌جدولها'/>
+ <cd:command name='setuptabulate' value='بارگذاری‌جدول‌بندی'/>
+ <cd:command name='setuptext' value='بارگذاری‌متن'/>
+ <cd:command name='setuptextposition' value='بارگذاری‌مکان‌متن'/>
+ <cd:command name='setuptextrules' value='بارگذاری‌خطهای‌متن'/>
+ <cd:command name='setuptexttexts' value='بارگذاری‌متن‌متنها'/>
+ <cd:command name='setuptextvariable' value='بارگذاری‌متغیر‌متن'/>
+ <cd:command name='setupthinrules' value='بارگذاری‌خطها‌ی‌نازک'/>
+ <cd:command name='setuptolerance' value='بارگذاری‌بردباری'/>
+ <cd:command name='setuptop' value='بارگذاری‌بالا'/>
+ <cd:command name='setuptoptexts' value='بارگذاری‌متنهای‌بالا'/>
+ <cd:command name='setuptype' value='بارگذاری‌تایپ'/>
+ <cd:command name='setuptyping' value='بارگذاری‌تایپ‌کردن'/>
+ <cd:command name='setupunderbar' value='بارگذاری‌میله‌زیر'/>
+ <cd:command name='setupurl' value='setupurl'/>
+ <cd:command name='setupversions' value='بارگذاری‌نسخه‌ها'/>
+ <cd:command name='setupwhitespace' value='بارگذاری‌فضای‌سفید'/>
+ <cd:command name='showbodyfont' value='نمایش‌قلم‌بدنه'/>
+ <cd:command name='showbodyfontenvironment' value='نمایش‌محیط‌قلم‌بدنه'/>
+ <cd:command name='showcolor' value='نمایش‌رنگ'/>
+ <cd:command name='showcolorgroup' value='نمایش‌گروه‌رنگ'/>
+ <cd:command name='showexternalfigures' value='نمایش‌شکلهای‌خارجی'/>
+ <cd:command name='showfields' value='نمایش‌میدانها'/>
+ <cd:command name='showframe' value='نمایش‌قالب'/>
+ <cd:command name='showgrid' value='نمایش‌توری'/>
+ <cd:command name='showlayout' value='نمایش‌طرح‌بندی'/>
+ <cd:command name='showmakeup' value='نمایش‌آرایش'/>
+ <cd:command name='showpalet' value='نمایش‌لوح'/>
+ <cd:command name='showprint' value='نمایش‌چاپ'/>
+ <cd:command name='showsetups' value='نمایش‌بارگذاریها'/>
+ <cd:command name='showstruts' value='نمایش‌بستها'/>
+ <cd:command name='showsymbolset' value='نمایش‌مجموعه‌علامت'/>
+ <cd:command name='smallcapped' value='cap'/>
+ <cd:command name='someline' value='یک‌خط'/>
+ <cd:command name='somewhere' value='یک‌جا'/>
+ <cd:command name='space' value='فضا'/>
+ <cd:command name='splitfloat' value='شکافتن‌شناور'/>
+ <cd:command name='startalignment' value='شروع‌تنظیم'/>
+ <cd:command name='startbackground' value='شروع‌پس‌زمینه'/>
+ <cd:command name='startcoding' value='شروع‌کد'/>
+ <cd:command name='startcolor' value='شروع‌رنگ'/>
+ <cd:command name='startcolumnmakeup' value='شروع‌آرایش‌ستون'/>
+ <cd:command name='startcolumns' value='شروع‌ستونها'/>
+ <cd:command name='startcolumnset' value='شروع‌مجموعه‌ستون'/>
+ <cd:command name='startcombination' value='شروع‌ترکیب'/>
+ <cd:command name='startcomponent' value='شروع‌مولفه'/>
+ <cd:command name='startdocument' value='شروع‌نوشتار'/>
+ <cd:command name='startenvironment' value='شروع‌محیط'/>
+ <cd:command name='startfigure' value='شروع‌شکل'/>
+ <cd:command name='startglobal' value='شروع‌سراسری'/>
+ <cd:command name='startline' value='شروع‌خط'/>
+ <cd:command name='startlinecorrection' value='شروع‌تصحیح‌خط'/>
+ <cd:command name='startlinenumbering' value='شروع‌شماره‌گذاری‌خط'/>
+ <cd:command name='startlines' value='شروع‌خطها'/>
+ <cd:command name='startlocal' value='شروع‌موضعی'/>
+ <cd:command name='startlocalfootnotes' value='شروع‌پانوشتهای‌موضعی'/>
+ <cd:command name='startmakeup' value='شروع‌آرایش'/>
+ <cd:command name='startmarginblock' value='شروع‌بلوک‌حاشیه'/>
+ <cd:command name='startmarginrule' value='شروع‌خط‌حاشیه'/>
+ <cd:command name='startnarrower' value='شروع‌باریکتر'/>
+ <cd:command name='startopposite' value='شروع‌مخالف'/>
+ <cd:command name='startoverlay' value='شروع‌پوشش'/>
+ <cd:command name='startoverzicht' value='شروع‌بازبینی'/>
+ <cd:command name='startpacked' value='شروع‌فشرده'/>
+ <cd:command name='startpositioning' value='شروع‌مکان‌گذاری'/>
+ <cd:command name='startproduct' value='شروع‌تولید'/>
+ <cd:command name='startprofile' value='شروع‌پروفایل'/>
+ <cd:command name='startproject' value='شروع‌پروژه'/>
+ <cd:command name='startquotation' value='شروع‌نقل‌قول'/>
+ <cd:command name='startraster' value='startraster'/>
+ <cd:command name='startsymbolset' value='شروع‌مجموعه‌نماد'/>
+ <cd:command name='startsynchronization' value='شروع‌تطابق'/>
+ <cd:command name='starttable' value='شروع‌جدول'/>
+ <cd:command name='starttables' value='شروع‌جدولها'/>
+ <cd:command name='starttext' value='شروع‌متن'/>
+ <cd:command name='starttextrule' value='شروع‌خط‌متن'/>
+ <cd:command name='startunpacked' value='شروع‌غیر‌فشرده'/>
+ <cd:command name='startversion' value='شروع‌نسخه'/>
+ <cd:command name='stopalignment' value='پایان‌تنظیم'/>
+ <cd:command name='stopbackground' value='پایان‌پس‌زمینه'/>
+ <cd:command name='stopcoding' value='پایان‌کد'/>
+ <cd:command name='stopcolor' value='پایان‌رنگ'/>
+ <cd:command name='stopcolumnmakeup' value='پایان‌آرایش‌ستون'/>
+ <cd:command name='stopcolumns' value='پایان‌ستونها'/>
+ <cd:command name='stopcolumnset' value='پایان‌مجموعه‌ستون'/>
+ <cd:command name='stopcombination' value='پایان‌ترکیب'/>
+ <cd:command name='stopcomponent' value='پایان‌مولفه'/>
+ <cd:command name='stopdocument' value='پایان‌نوشتار'/>
+ <cd:command name='stopenvironment' value='پایان‌محیط'/>
+ <cd:command name='stopglobal' value='پایان‌سراسری'/>
+ <cd:command name='stopline' value='پایان‌خط'/>
+ <cd:command name='stoplinecorrection' value='پایان‌تصحیح‌خط'/>
+ <cd:command name='stoplinenumbering' value='پایان‌شماره‌گذاری‌خط'/>
+ <cd:command name='stoplines' value='پایان‌خطها'/>
+ <cd:command name='stoplocal' value='پایان‌موضعی'/>
+ <cd:command name='stoplocalfootnotes' value='پایان‌پانوشتهای‌موضعی'/>
+ <cd:command name='stopmakeup' value='پایان‌آرایش'/>
+ <cd:command name='stopmarginblock' value='پایان‌بلوک‌حاشیه'/>
+ <cd:command name='stopmarginrule' value='پایان‌خط‌حاشیه'/>
+ <cd:command name='stopnarrower' value='پایان‌نازکتر'/>
+ <cd:command name='stopopposite' value='پایان‌مخالف'/>
+ <cd:command name='stopoverlay' value='پایان‌پوشش'/>
+ <cd:command name='stopoverzicht' value='پایان‌بازبینی'/>
+ <cd:command name='stoppacked' value='پایان‌فشرده'/>
+ <cd:command name='stoppositioning' value='پایان‌مکان‌گذاری'/>
+ <cd:command name='stopproduct' value='پایان‌تولید'/>
+ <cd:command name='stopprofile' value='پایان‌پروفایل'/>
+ <cd:command name='stopproject' value='پایان‌پروژه'/>
+ <cd:command name='stopquotation' value='پایان‌نقل‌قول'/>
+ <cd:command name='stopraster' value='stopraster'/>
+ <cd:command name='stopsynchronization' value='پایان‌تطابق'/>
+ <cd:command name='stoptable' value='پایان‌جدول'/>
+ <cd:command name='stoptables' value='پایان‌جدولها'/>
+ <cd:command name='stoptext' value='پایان‌متن'/>
+ <cd:command name='stoptextrule' value='پایان‌خط‌متن'/>
+ <cd:command name='stopunpacked' value='پایان‌غیرفشرده'/>
+ <cd:command name='stopversion' value='پایان‌نسخه'/>
+ <cd:command name='stretched' value='کشیده'/>
+ <cd:command name='subformulanumber' value='شماره‌زیرفرمول'/>
+ <cd:command name='subpagenumber' value='شماره‌زیرصفحه'/>
+ <cd:command name='switchtobodyfont' value='تغییربه‌قلم‌بدنه'/>
+ <cd:command name='switchtorawfont' value='تغییربه‌قلم‌خام'/>
+ <cd:command name='sym' value='نم'/>
+ <cd:command name='symbol' value='نماد'/>
+ <cd:command name='synchronizationbar' value='میله‌تطابق'/>
+ <cd:command name='synchronize' value='تطابق'/>
+ <cd:command name='tab' value='تب'/>
+ <cd:command name='testcolumn' value='ستون‌امتحان'/>
+ <cd:command name='testpage' value='صفحه‌تست'/>
+ <cd:command name='tex' value='تک'/>
+ <cd:command name='textheight' value='ارتفاع‌متن'/>
+ <cd:command name='textreference' value='مرجع‌متن'/>
+ <cd:command name='textrule' value='خط‌متن'/>
+ <cd:command name='textvariable' value='متغیر متن'/>
+ <cd:command name='textwidth' value='عرض‌متن'/>
+ <cd:command name='thinrule' value='خط‌نازک'/>
+ <cd:command name='thinrules' value='خطهای‌نازک'/>
+ <cd:command name='tooltip' value='tooltip'/>
+ <cd:command name='topdistance' value='فاصله‌بالا'/>
+ <cd:command name='topheight' value='ارتفاع‌بالا'/>
+ <cd:command name='topspace' value='فضای‌بالا'/>
+ <cd:command name='totalnumberofpages' value='شماره‌کل‌صفحه‌ها'/>
+ <cd:command name='translate' value='ترجمه'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='typ'/>
+ <cd:command name='type' value='تایپ'/>
+ <cd:command name='typebuffer' value='تایپ‌بافر'/>
+ <cd:command name='typefile' value='تایپ‌پرونده'/>
+ <cd:command name='unitmeaning' value='معنی‌واحد'/>
+ <cd:command name='unknown' value='ناشناس'/>
+ <cd:command name='useJSscripts' value='useJSscripts'/>
+ <cd:command name='useURL' value='useURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='استفاده‌بلوکها'/>
+ <cd:command name='usecommands' value='استفاده‌فرمانها'/>
+ <cd:command name='useencoding' value='استفاده‌رمزینه'/>
+ <cd:command name='useexternaldocument' value='استفاده‌نوشتارخارجی'/>
+ <cd:command name='useexternalfigure' value='استفاده‌شکل‌خارجی'/>
+ <cd:command name='useexternalfile' value='استفاده‌پرونده‌خارجی'/>
+ <cd:command name='useexternalfiles' value='استفاده‌پرونده‌های‌خارجی'/>
+ <cd:command name='useexternalsoundtrack' value='استفاده‌قطعه‌موزیک‌خارجی'/>
+ <cd:command name='usemodule' value='استفاده‌مدول'/>
+ <cd:command name='usemodules' value='استفاده‌مدولها'/>
+ <cd:command name='usepath' value='استفاده‌مسیر'/>
+ <cd:command name='usereferences' value='استفاده‌مرجعها'/>
+ <cd:command name='usespecials' value='استفاده‌ویژگیها'/>
+ <cd:command name='usesymbols' value='استفاده‌نمادها'/>
+ <cd:command name='usetypescript' value='استفاده‌دستخط‌تایپ'/>
+ <cd:command name='usetypescriptfile' value='استفاده‌پرونده‌دستخط‌تایپ'/>
+ <cd:command name='useurl' value='useurl'/>
+ <cd:command name='version' value='نسخه'/>
+ <cd:command name='vl' value='خ‌ع'/>
+ <cd:command name='weekday' value='روزهفته'/>
+ <cd:command name='whitespace' value='فضای‌سفید'/>
+ <cd:command name='wordright' value='کلمه‌راست'/>
+ <cd:command name='writebetweenlist' value='بنویس‌بین‌لیست'/>
+ <cd:command name='writetolist' value='بنویس‌در‌لیست'/>
+ <cd:command name='writetoreferencelist' value='بنویس‌درلیست‌مرجع'/>
+ <cd:command name='writetoregister' value='بنویس‌درثبت'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml
new file mode 100644
index 000000000..46f2ecd1e
--- /dev/null
+++ b/tex/context/interface/keys-ro.xml
@@ -0,0 +1,1706 @@
+<?xml version='1.0'?>
+
+<cd:interface xmlns:cd='http://www.pragma-ade.com/commands' name='context' language='ro' version='2008.10.21 19:42'>
+
+ <!-- definitions for interface variables for language ro -->
+
+ <cd:variables>
+ <cd:variable name='Addition' value='Adaugare'/>
+ <cd:variable name='Balloon' value='Balon'/>
+ <cd:variable name='Character' value='Caracter'/>
+ <cd:variable name='Characters' value='Caractere'/>
+ <cd:variable name='CloseDocument' value='InchideDocument'/>
+ <cd:variable name='ExitViewer' value='IesireVizualizator'/>
+ <cd:variable name='FirstPage' value='PrimaPagina'/>
+ <cd:variable name='FitHeight' value='AjustatInaltime'/>
+ <cd:variable name='FitWidth' value='AjustatLatime'/>
+ <cd:variable name='GotoPage' value='LaPagina'/>
+ <cd:variable name='Greek' value='Grec'/>
+ <cd:variable name='Help' value='Ajutor'/>
+ <cd:variable name='HideField' value='AscundeCamp'/>
+ <cd:variable name='HideLayer' value='HideLayer'/>
+ <cd:variable name='Key' value='Cheie'/>
+ <cd:variable name='LastPage' value='UltimaPagina'/>
+ <cd:variable name='LoadForm' value='IncarcaFormular'/>
+ <cd:variable name='MONTH' value='LUNA'/>
+ <cd:variable name='New' value='Nou'/>
+ <cd:variable name='NextJump' value='SaltUrmator'/>
+ <cd:variable name='NextPage' value='PaginaUrmatoare'/>
+ <cd:variable name='Numbers' value='Numere'/>
+ <cd:variable name='OpenNamedDocument' value='OpenNamedDocument'/>
+ <cd:variable name='Paragraph' value='Paragraf'/>
+ <cd:variable name='PauseMovie' value='PauzaFilm'/>
+ <cd:variable name='PauseRendering' value='PauseRendering'/>
+ <cd:variable name='PauseSound' value='PauzaSunet'/>
+ <cd:variable name='PreviousJump' value='SaltPrecedent'/>
+ <cd:variable name='PreviousPage' value='PaginaPrecedenta'/>
+ <cd:variable name='PrintDocument' value='TiparesteDocument'/>
+ <cd:variable name='Query' value='Query'/>
+ <cd:variable name='QueryAgain' value='QueryAgain'/>
+ <cd:variable name='ResetForm' value='ResetareFormular'/>
+ <cd:variable name='ResumeMovie' value='RepornesteFilm'/>
+ <cd:variable name='ResumeRendering' value='ResumeRendering'/>
+ <cd:variable name='ResumeSound' value='RepornesteSunet'/>
+ <cd:variable name='Romannumerals' value='Numereromane'/>
+ <cd:variable name='SaveDocument' value='SalvareDocument'/>
+ <cd:variable name='SaveForm' value='SalveazaFormular'/>
+ <cd:variable name='SaveNamedDocument' value='SaveNamedDocument'/>
+ <cd:variable name='SearchAgain' value='CautaDinNou'/>
+ <cd:variable name='SearchDocument' value='CautaDocument'/>
+ <cd:variable name='ShowBookmarks' value='ShowBookmarks'/>
+ <cd:variable name='ShowField' value='AfiseazaCamp'/>
+ <cd:variable name='ShowThumbs' value='ShowThumbs'/>
+ <cd:variable name='StartMovie' value='StartFilm'/>
+ <cd:variable name='StartRendering' value='StartRendering'/>
+ <cd:variable name='StartSound' value='StartSunet'/>
+ <cd:variable name='StopMovie' value='StopFilm'/>
+ <cd:variable name='StopRendering' value='StopRendering'/>
+ <cd:variable name='StopSound' value='StopSunet'/>
+ <cd:variable name='SubmitForm' value='TrimiteFormular'/>
+ <cd:variable name='ToggleLayer' value='ToggleLayer'/>
+ <cd:variable name='ToggleViewer' value='SchimbaVizualizator'/>
+ <cd:variable name='URL' value='URL'/>
+ <cd:variable name='VideLayer' value='VideLayer'/>
+ <cd:variable name='ViewerHelp' value='AjutorVizualizator'/>
+ <cd:variable name='WEEKDAY' value='ZISAPTAMANA'/>
+ <cd:variable name='WORD' value='CUVANT'/>
+ <cd:variable name='abbreviation' value='abreviere'/>
+ <cd:variable name='abbreviations' value='abrevieri'/>
+ <cd:variable name='absolute' value='absolut'/>
+ <cd:variable name='action' value='actiune'/>
+ <cd:variable name='after' value='dupa'/>
+ <cd:variable name='all' value='tot'/>
+ <cd:variable name='always' value='totdeauna'/>
+ <cd:variable name='answerarea' value='answerarea'/>
+ <cd:variable name='appendices' value='apendixuri'/>
+ <cd:variable name='appendix' value='apendix'/>
+ <cd:variable name='april' value='aprilie'/>
+ <cd:variable name='atmargin' value='lamargine'/>
+ <cd:variable name='atpage' value='lapagina'/>
+ <cd:variable name='august' value='august'/>
+ <cd:variable name='author' value='autor'/>
+ <cd:variable name='auto' value='auto'/>
+ <cd:variable name='autointro' value='autointro'/>
+ <cd:variable name='back' value='inapot'/>
+ <cd:variable name='background' value='fundal'/>
+ <cd:variable name='backmatter' value='epilogul'/>
+ <cd:variable name='backpart' value='epilog'/>
+ <cd:variable name='backspace' value='spatiuspate'/>
+ <cd:variable name='backward' value='inapoi'/>
+ <cd:variable name='bbl' value='bbl'/>
+ <cd:variable name='before' value='inainte'/>
+ <cd:variable name='begin' value='begin'/>
+ <cd:variable name='bib' value='bib'/>
+ <cd:variable name='big' value='mare'/>
+ <cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigpreference' value='preferintamare'/>
+ <cd:variable name='blank' value='blank'/>
+ <cd:variable name='blockquote' value='blockquote'/>
+ <cd:variable name='bodymatter' value='principalul'/>
+ <cd:variable name='bodypart' value='principal'/>
+ <cd:variable name='bold' value='aldin'/>
+ <cd:variable name='bolditalic' value='aldinitalic'/>
+ <cd:variable name='boldslanted' value='aldininclinat'/>
+ <cd:variable name='bookmark' value='semncarte'/>
+ <cd:variable name='both' value='ambele'/>
+ <cd:variable name='bottom' value='subsol'/>
+ <cd:variable name='brief' value='brief'/>
+ <cd:variable name='broad' value='broad'/>
+ <cd:variable name='buffer' value='buffer'/>
+ <cd:variable name='by' value='de'/>
+ <cd:variable name='calligraphic' value='caligrafic'/>
+ <cd:variable name='cap' value='cap'/>
+ <cd:variable name='capital' value='majuscula'/>
+ <cd:variable name='center' value='center'/>
+ <cd:variable name='chapter' value='capitol'/>
+ <cd:variable name='character' value='caracter'/>
+ <cd:variable name='characters' value='caractere'/>
+ <cd:variable name='cite' value='cite'/>
+ <cd:variable name='color' value='culoare'/>
+ <cd:variable name='column' value='coloana'/>
+ <cd:variable name='columns' value='coloane'/>
+ <cd:variable name='command' value='comanda'/>
+ <cd:variable name='commands' value='comenzi'/>
+ <cd:variable name='comment' value='comentariu'/>
+ <cd:variable name='component' value='componenta'/>
+ <cd:variable name='concept' value='concept'/>
+ <cd:variable name='content' value='cuprins'/>
+ <cd:variable name='contents' value='cuprinsuri'/>
+ <cd:variable name='continue' value='continuu'/>
+ <cd:variable name='controls' value='controale'/>
+ <cd:variable name='conversion' value='conversie'/>
+ <cd:variable name='current' value='curent'/>
+ <cd:variable name='cutspace' value='cutspace'/>
+ <cd:variable name='date' value='data'/>
+ <cd:variable name='day' value='zi'/>
+ <cd:variable name='december' value='decembrie'/>
+ <cd:variable name='default' value='implicit'/>
+ <cd:variable name='depth' value='adancime'/>
+ <cd:variable name='description' value='descriere'/>
+ <cd:variable name='disable' value='dezactivat'/>
+ <cd:variable name='display' value='display'/>
+ <cd:variable name='dot' value='punct'/>
+ <cd:variable name='doublesided' value='douafete'/>
+ <cd:variable name='down' value='down'/>
+ <cd:variable name='each' value='fiecare'/>
+ <cd:variable name='edge' value='bordura'/>
+ <cd:variable name='empty' value='gol'/>
+ <cd:variable name='end' value='end'/>
+ <cd:variable name='endnote' value='endnote'/>
+ <cd:variable name='enumeration' value='enumerare'/>
+ <cd:variable name='environment' value='mediu'/>
+ <cd:variable name='even' value='par'/>
+ <cd:variable name='external' value='extern'/>
+ <cd:variable name='fact' value='fapt'/>
+ <cd:variable name='february' value='februarie'/>
+ <cd:variable name='figure' value='figura'/>
+ <cd:variable name='figures' value='figure'/>
+ <cd:variable name='file' value='fisier'/>
+ <cd:variable name='final' value='final'/>
+ <cd:variable name='first' value='primul'/>
+ <cd:variable name='firstcolumn' value='firstcolumn'/>
+ <cd:variable name='firstpage' value='primapagina'/>
+ <cd:variable name='firstsubpage' value='primasubpagina'/>
+ <cd:variable name='fit' value='ajustat'/>
+ <cd:variable name='five' value='cinci'/>
+ <cd:variable name='fix' value='fix'/>
+ <cd:variable name='fixed' value='fixat'/>
+ <cd:variable name='flexible' value='flexibil'/>
+ <cd:variable name='float' value='obiectmobil'/>
+ <cd:variable name='flushinner' value='flushinner'/>
+ <cd:variable name='flushleft' value='flushleft'/>
+ <cd:variable name='flushouter' value='flushouter'/>
+ <cd:variable name='flushright' value='flushright'/>
+ <cd:variable name='footer' value='subsol'/>
+ <cd:variable name='footnote' value='notasubsol'/>
+ <cd:variable name='force' value='fortat'/>
+ <cd:variable name='foreground' value='primplan'/>
+ <cd:variable name='formeel' value='formeel'/>
+ <cd:variable name='formula' value='formula'/>
+ <cd:variable name='formulae' value='formule'/>
+ <cd:variable name='forward' value='avans'/>
+ <cd:variable name='four' value='patru'/>
+ <cd:variable name='frame' value='incadrat'/>
+ <cd:variable name='framedtext' value='textinconjurat'/>
+ <cd:variable name='friday' value='vineri'/>
+ <cd:variable name='frontmatter' value='prologul'/>
+ <cd:variable name='frontpart' value='prolog'/>
+ <cd:variable name='global' value='global'/>
+ <cd:variable name='graphic' value='graficul'/>
+ <cd:variable name='graphics' value='graficele'/>
+ <cd:variable name='gray' value='gri'/>
+ <cd:variable name='greek' value='grec'/>
+ <cd:variable name='grid' value='grila'/>
+ <cd:variable name='halfline' value='jumatatelinie'/>
+ <cd:variable name='handwritten' value='scrismanual'/>
+ <cd:variable name='hang' value='suspenda'/>
+ <cd:variable name='hanging' value='suspendat'/>
+ <cd:variable name='head' value='antet'/>
+ <cd:variable name='header' value='antet'/>
+ <cd:variable name='height' value='inaltime'/>
+ <cd:variable name='helptext' value='textajutator'/>
+ <cd:variable name='hencefore' value='precedent'/>
+ <cd:variable name='here' value='aici'/>
+ <cd:variable name='hereafter' value='urmator'/>
+ <cd:variable name='hidden' value='ascuns'/>
+ <cd:variable name='hiding' value='ascundere'/>
+ <cd:variable name='high' value='inalt'/>
+ <cd:variable name='horizontal' value='orizontal'/>
+ <cd:variable name='hyphenated' value='despsilabe'/>
+ <cd:variable name='hz' value='hz'/>
+ <cd:variable name='inbetween' value='intre'/>
+ <cd:variable name='index' value='index'/>
+ <cd:variable name='indices' value='indexuri'/>
+ <cd:variable name='informeel' value='informeel'/>
+ <cd:variable name='inherit' value='inherit'/>
+ <cd:variable name='inleft' value='instanga'/>
+ <cd:variable name='inmargin' value='inmargine'/>
+ <cd:variable name='inner' value='intern'/>
+ <cd:variable name='inneredge' value='inneredge'/>
+ <cd:variable name='innermargin' value='innermargin'/>
+ <cd:variable name='inright' value='indreapta'/>
+ <cd:variable name='interaction' value='interactiune'/>
+ <cd:variable name='interactionmenu' value='meniuinteractiune'/>
+ <cd:variable name='intermezzi' value='intermezzi'/>
+ <cd:variable name='intermezzo' value='intermezzo'/>
+ <cd:variable name='intext' value='intext'/>
+ <cd:variable name='intro' value='intro'/>
+ <cd:variable name='italic' value='italic'/>
+ <cd:variable name='italicbold' value='italicaldin'/>
+ <cd:variable name='item' value='element'/>
+ <cd:variable name='itemize' value='enumerare'/>
+ <cd:variable name='its' value='propriu'/>
+ <cd:variable name='january' value='ianuarie'/>
+ <cd:variable name='joinedup' value='unit'/>
+ <cd:variable name='july' value='iulie'/>
+ <cd:variable name='june' value='iunie'/>
+ <cd:variable name='keep' value='mentine'/>
+ <cd:variable name='knockout' value='knockout'/>
+ <cd:variable name='label' value='eticheta'/>
+ <cd:variable name='landscape' value='vedere'/>
+ <cd:variable name='last' value='ultim'/>
+ <cd:variable name='lastcolumn' value='lastcolumn'/>
+ <cd:variable name='lastpage' value='ultimapagina'/>
+ <cd:variable name='lastpagenumber' value='lastpagenumber'/>
+ <cd:variable name='lastsubpage' value='ultimasubpagina'/>
+ <cd:variable name='layer' value='layer'/>
+ <cd:variable name='left' value='stanga'/>
+ <cd:variable name='leftedge' value='bordurastanga'/>
+ <cd:variable name='lefthanging' value='lefthanging'/>
+ <cd:variable name='leftmargin' value='marginestanga'/>
+ <cd:variable name='leftpage' value='paginastanga'/>
+ <cd:variable name='lefttoright' value='lefttoright'/>
+ <cd:variable name='legend' value='legenda'/>
+ <cd:variable name='lesshyphenation' value='lesshyphenation'/>
+ <cd:variable name='line' value='linie'/>
+ <cd:variable name='linenote' value='linenote'/>
+ <cd:variable name='lines' value='linii'/>
+ <cd:variable name='list' value='lista'/>
+ <cd:variable name='local' value='local'/>
+ <cd:variable name='localenvironment' value='mediulocal'/>
+ <cd:variable name='logo' value='logo'/>
+ <cd:variable name='logos' value='logos'/>
+ <cd:variable name='lohi' value='lohi'/>
+ <cd:variable name='loose' value='larg'/>
+ <cd:variable name='low' value='jos'/>
+ <cd:variable name='ls' value='ls'/>
+ <cd:variable name='makeup' value='marcaj'/>
+ <cd:variable name='mar' value='mar'/>
+ <cd:variable name='march' value='martie'/>
+ <cd:variable name='margin' value='margine'/>
+ <cd:variable name='marginedge' value='marginebordura'/>
+ <cd:variable name='margintitle' value='titlumarginal'/>
+ <cd:variable name='marking' value='marcaje'/>
+ <cd:variable name='mathalignment' value='mathalignment'/>
+ <cd:variable name='mathcases' value='mathcases'/>
+ <cd:variable name='mathmatrix' value='mathmatrix'/>
+ <cd:variable name='max' value='max'/>
+ <cd:variable name='maxdepth' value='maxdepth'/>
+ <cd:variable name='maxheight' value='maxheight'/>
+ <cd:variable name='maxwidth' value='maxwidth'/>
+ <cd:variable name='may' value='mai'/>
+ <cd:variable name='mediaeval' value='medieval'/>
+ <cd:variable name='medium' value='mediu'/>
+ <cd:variable name='middle' value='centru'/>
+ <cd:variable name='min' value='min'/>
+ <cd:variable name='mindepth' value='mindepth'/>
+ <cd:variable name='minheight' value='inaltimeminima'/>
+ <cd:variable name='minwidth' value='latimeminima'/>
+ <cd:variable name='mirrored' value='oglindit'/>
+ <cd:variable name='monday' value='luni'/>
+ <cd:variable name='mono' value='mono'/>
+ <cd:variable name='month' value='luna'/>
+ <cd:variable name='morehyphenation' value='morehyphenation'/>
+ <cd:variable name='name' value='nume'/>
+ <cd:variable name='narrow' value='ingust'/>
+ <cd:variable name='negative' value='negativ'/>
+ <cd:variable name='never' value='niciodata'/>
+ <cd:variable name='new' value='nou'/>
+ <cd:variable name='next' value='urmatorul'/>
+ <cd:variable name='nextevenpage' value='paginaparaurmatoarea'/>
+ <cd:variable name='nextoddpage' value='paginaimparaurmatoarea'/>
+ <cd:variable name='nextpage' value='paginaurmatoare'/>
+ <cd:variable name='nextsubpage' value='urmatoareasubpagina'/>
+ <cd:variable name='no' value='nu'/>
+ <cd:variable name='nocheck' value='nocheck'/>
+ <cd:variable name='nofit' value='nofit'/>
+ <cd:variable name='nogrid' value='nogrid'/>
+ <cd:variable name='nohz' value='nohz'/>
+ <cd:variable name='nomarking' value='faramarcare'/>
+ <cd:variable name='none' value='niciunul'/>
+ <cd:variable name='nonumber' value='nonumber'/>
+ <cd:variable name='normal' value='normal'/>
+ <cd:variable name='nospacing' value='nospacing'/>
+ <cd:variable name='not' value='nu'/>
+ <cd:variable name='note' value='note'/>
+ <cd:variable name='nothanging' value='nothanging'/>
+ <cd:variable name='nothyphenated' value='nedespsilabe'/>
+ <cd:variable name='november' value='noiembrie'/>
+ <cd:variable name='nowhere' value='niciunde'/>
+ <cd:variable name='nowhite' value='faraalb'/>
+ <cd:variable name='number' value='numar'/>
+ <cd:variable name='numbers' value='numere'/>
+ <cd:variable name='october' value='octombrie'/>
+ <cd:variable name='odd' value='impar'/>
+ <cd:variable name='off' value='dezactivat'/>
+ <cd:variable name='offset' value='offset'/>
+ <cd:variable name='old' value='old'/>
+ <cd:variable name='on' value='on'/>
+ <cd:variable name='one' value='unu'/>
+ <cd:variable name='opposite' value='opus'/>
+ <cd:variable name='outer' value='extern'/>
+ <cd:variable name='outeredge' value='outeredge'/>
+ <cd:variable name='outermargin' value='outermargin'/>
+ <cd:variable name='overbar' value='barasus'/>
+ <cd:variable name='overbars' value='supralinie'/>
+ <cd:variable name='overlay' value='overlay'/>
+ <cd:variable name='overprint' value='overprint'/>
+ <cd:variable name='overstrike' value='liniepeste'/>
+ <cd:variable name='overstrikes' value='liniipeste'/>
+ <cd:variable name='packed' value='impachetat'/>
+ <cd:variable name='page' value='pagina'/>
+ <cd:variable name='pagecomment' value='comentariupagina'/>
+ <cd:variable name='pagenumber' value='numarpagina'/>
+ <cd:variable name='paper' value='foaie'/>
+ <cd:variable name='paragraph' value='paragraf'/>
+ <cd:variable name='part' value='parte'/>
+ <cd:variable name='positive' value='positiv'/>
+ <cd:variable name='postponing' value='postponing'/>
+ <cd:variable name='postscript' value='postscript'/>
+ <cd:variable name='preference' value='preferinta'/>
+ <cd:variable name='preview' value='previzualizare'/>
+ <cd:variable name='previous' value='precedent'/>
+ <cd:variable name='previousevenpage' value='paginaparaprecedenta'/>
+ <cd:variable name='previousoddpage' value='paginaimparaprecedenta'/>
+ <cd:variable name='previouspage' value='paginaanterioara'/>
+ <cd:variable name='previoussubpage' value='subpaginaanterioara'/>
+ <cd:variable name='printable' value='tiparibil'/>
+ <cd:variable name='process' value='process'/>
+ <cd:variable name='product' value='produs'/>
+ <cd:variable name='program' value='program'/>
+ <cd:variable name='project' value='proiect'/>
+ <cd:variable name='protected' value='protejat'/>
+ <cd:variable name='quadruple' value='cvadrupul'/>
+ <cd:variable name='quotation' value='citat'/>
+ <cd:variable name='quote' value='minicitat'/>
+ <cd:variable name='ran' value='rulat'/>
+ <cd:variable name='random' value='aleator'/>
+ <cd:variable name='readonly' value='readonly'/>
+ <cd:variable name='rectangular' value='rectangular'/>
+ <cd:variable name='referral' value='referinta'/>
+ <cd:variable name='register' value='registru'/>
+ <cd:variable name='regular' value='regular'/>
+ <cd:variable name='rekening' value='rekening'/>
+ <cd:variable name='relative' value='relativ'/>
+ <cd:variable name='repeat' value='repetat'/>
+ <cd:variable name='required' value='obligatoriu'/>
+ <cd:variable name='reset' value='reset'/>
+ <cd:variable name='reverse' value='reverse'/>
+ <cd:variable name='right' value='dreapta'/>
+ <cd:variable name='rightedge' value='borduradreapta'/>
+ <cd:variable name='righthanging' value='righthanging'/>
+ <cd:variable name='rightmargin' value='marginedreapta'/>
+ <cd:variable name='rightpage' value='paginadreapta'/>
+ <cd:variable name='righttoleft' value='righttoleft'/>
+ <cd:variable name='roman' value='roman'/>
+ <cd:variable name='romannumerals' value='numereromane'/>
+ <cd:variable name='rotate' value='rotit'/>
+ <cd:variable name='rotated' value='rotat'/>
+ <cd:variable name='round' value='rotund'/>
+ <cd:variable name='row' value='rand'/>
+ <cd:variable name='rule' value='rigla'/>
+ <cd:variable name='samepage' value='aceeasipagina'/>
+ <cd:variable name='sans' value='sans'/>
+ <cd:variable name='sansbold' value='sansaldin'/>
+ <cd:variable name='sansserif' value='sansserif'/>
+ <cd:variable name='saturday' value='sambata'/>
+ <cd:variable name='screen' value='ecran'/>
+ <cd:variable name='section' value='sectiune'/>
+ <cd:variable name='sectionblockenvironment' value='blocsectiuneambient'/>
+ <cd:variable name='sectionnumber' value='numarsetiune'/>
+ <cd:variable name='see' value='vezi'/>
+ <cd:variable name='september' value='septembrie'/>
+ <cd:variable name='serif' value='serif'/>
+ <cd:variable name='serried' value='serried'/>
+ <cd:variable name='setups' value='setari'/>
+ <cd:variable name='sheet' value='sheet'/>
+ <cd:variable name='short' value='short'/>
+ <cd:variable name='singlesided' value='ofata'/>
+ <cd:variable name='slanted' value='inclinat'/>
+ <cd:variable name='slantedbold' value='inclinataldin'/>
+ <cd:variable name='small' value='mic'/>
+ <cd:variable name='smallbodyfont' value='smallbodyfont'/>
+ <cd:variable name='smallbold' value='micaldin'/>
+ <cd:variable name='smallbolditalic' value='micaldininclinat'/>
+ <cd:variable name='smallboldslanted' value='micaldininclinat'/>
+ <cd:variable name='smallcaps' value='majusculemici'/>
+ <cd:variable name='smallitalic' value='micitalic'/>
+ <cd:variable name='smallitalicbold' value='micitalicaldin'/>
+ <cd:variable name='smallnormal' value='micnormal'/>
+ <cd:variable name='smallslanted' value='micinclinat'/>
+ <cd:variable name='smallslantedbold' value='micinclinataldin'/>
+ <cd:variable name='smalltype' value='mictype'/>
+ <cd:variable name='somewhere' value='undeva'/>
+ <cd:variable name='sorted' value='sortat'/>
+ <cd:variable name='space' value='spatiu'/>
+ <cd:variable name='spacing' value='spatiere'/>
+ <cd:variable name='speech' value='speech'/>
+ <cd:variable name='split' value='split'/>
+ <cd:variable name='spot' value='spot'/>
+ <cd:variable name='standard' value='standard'/>
+ <cd:variable name='start' value='start'/>
+ <cd:variable name='starter' value='starter'/>
+ <cd:variable name='sticker' value='sticker'/>
+ <cd:variable name='stop' value='stop'/>
+ <cd:variable name='stopper' value='stopper'/>
+ <cd:variable name='stretch' value='dilatat'/>
+ <cd:variable name='strict' value='strict'/>
+ <cd:variable name='strong' value='strong'/>
+ <cd:variable name='strut' value='strut'/>
+ <cd:variable name='sub' value='sub'/>
+ <cd:variable name='subbackward' value='subinapoi'/>
+ <cd:variable name='subformula' value='subformula'/>
+ <cd:variable name='subforward' value='subavans'/>
+ <cd:variable name='subject' value='subiect'/>
+ <cd:variable name='subpage' value='subpagina'/>
+ <cd:variable name='subsection' value='subsectiune'/>
+ <cd:variable name='subsubject' value='subsubiect'/>
+ <cd:variable name='subsubsection' value='subsubsectiune'/>
+ <cd:variable name='subsubsubject' value='subsubsubiect'/>
+ <cd:variable name='subsubsubsection' value='subsubsubsectiune'/>
+ <cd:variable name='subsubsubsubject' value='subsubsubsubiect'/>
+ <cd:variable name='subsubsubsubsection' value='subsubsubsubsectiune'/>
+ <cd:variable name='subsubsubsubsubject' value='subsubsubsubsubiect'/>
+ <cd:variable name='subsubsubsubsubsection' value='subsubsubsubsubsectiune'/>
+ <cd:variable name='subsubsubsubsubsubject' value='subsubsubsubsubsubiect'/>
+ <cd:variable name='subsubsubsubsubsubsection' value='subsubsubsubsubsubsectiune'/>
+ <cd:variable name='subsubsubsubsubsubsubject' value='subsubsubsubsubsubsubiect'/>
+ <cd:variable name='subsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsectiune'/>
+ <cd:variable name='subsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubiect'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsubsectiune'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubsubiect'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsection' value='subsubsubsubsubsubsubsubsubsectiune'/>
+ <cd:variable name='subsubsubsubsubsubsubsubsubsubject' value='subsubsubsubsubsubsubsubsubsubiect'/>
+ <cd:variable name='sunday' value='duminica'/>
+ <cd:variable name='support' value='suport'/>
+ <cd:variable name='sym' value='sym'/>
+ <cd:variable name='symbol' value='simbol'/>
+ <cd:variable name='synchronize' value='synchronize'/>
+ <cd:variable name='system' value='sistem'/>
+ <cd:variable name='table' value='tabelul'/>
+ <cd:variable name='tablehead' value='antettabel'/>
+ <cd:variable name='tables' value='tabelele'/>
+ <cd:variable name='tabletail' value='subsoltabel'/>
+ <cd:variable name='tabulate' value='tabulate'/>
+ <cd:variable name='tabulatehead' value='tabulatehead'/>
+ <cd:variable name='tabulatetail' value='tabulatetail'/>
+ <cd:variable name='tall' value='inalt'/>
+ <cd:variable name='teletype' value='teletype'/>
+ <cd:variable name='temporary' value='temporar'/>
+ <cd:variable name='test' value='test'/>
+ <cd:variable name='text' value='text'/>
+ <cd:variable name='three' value='trei'/>
+ <cd:variable name='thursday' value='joi'/>
+ <cd:variable name='title' value='titlu'/>
+ <cd:variable name='toggle' value='toggle'/>
+ <cd:variable name='tolerant' value='tolerant'/>
+ <cd:variable name='top' value='sus'/>
+ <cd:variable name='tuesday' value='marti'/>
+ <cd:variable name='two' value='doi'/>
+ <cd:variable name='txt' value='txt'/>
+ <cd:variable name='type' value='type'/>
+ <cd:variable name='typing' value='typing'/>
+ <cd:variable name='unavailable' value='nedisponibil'/>
+ <cd:variable name='underbar' value='sublinie'/>
+ <cd:variable name='underbars' value='sublinii'/>
+ <cd:variable name='unit' value='unitate'/>
+ <cd:variable name='units' value='unitati'/>
+ <cd:variable name='unknown' value='necunoscut'/>
+ <cd:variable name='unpacked' value='despachetat'/>
+ <cd:variable name='up' value='up'/>
+ <cd:variable name='url' value='url'/>
+ <cd:variable name='used' value='folosit'/>
+ <cd:variable name='value' value='valoare'/>
+ <cd:variable name='vertical' value='vertical'/>
+ <cd:variable name='very' value='foarte'/>
+ <cd:variable name='verystrict' value='foartestrict'/>
+ <cd:variable name='verytolerant' value='foartetolerant'/>
+ <cd:variable name='weak' value='weak'/>
+ <cd:variable name='wednesday' value='miercuri'/>
+ <cd:variable name='week' value='saptamana'/>
+ <cd:variable name='weekday' value='zisaptamana'/>
+ <cd:variable name='white' value='alb'/>
+ <cd:variable name='wide' value='larg'/>
+ <cd:variable name='width' value='latime'/>
+ <cd:variable name='xml' value='xml'/>
+ <cd:variable name='year' value='an'/>
+ <cd:variable name='yes' value='da'/>
+ </cd:variable>
+
+ <!-- definitions for interface constants for language ro -->
+
+ <cd:constants>
+ <cd:constant name='action' value='actiune'/>
+ <cd:constant name='address' value='adresa'/>
+ <cd:constant name='after' value='dupa'/>
+ <cd:constant name='afterhead' value='dupatitlu'/>
+ <cd:constant name='afterkey' value='dupatasta'/>
+ <cd:constant name='align' value='aliniere'/>
+ <cd:constant name='aligncharacter' value='aliniazacaracter'/>
+ <cd:constant name='alignmentcharacter' value='alierecaracter'/>
+ <cd:constant name='alignsymbol' value='alignsymbol'/>
+ <cd:constant name='aligntitle' value='alinieretitlu'/>
+ <cd:constant name='alternative' value='alternativ'/>
+ <cd:constant name='andtext' value='andtext'/>
+ <cd:constant name='apa' value='apa'/>
+ <cd:constant name='arrow' value='sageata'/>
+ <cd:constant name='artauthor' value='artauthor'/>
+ <cd:constant name='artauthoretaldisplay' value='artauthoretaldisplay'/>
+ <cd:constant name='artauthoretallimit' value='artauthoretallimit'/>
+ <cd:constant name='artauthoretaltext' value='artauthoretaltext'/>
+ <cd:constant name='at' value='la'/>
+ <cd:constant name='author' value='autor'/>
+ <cd:constant name='authoretaldisplay' value='authoretaldisplay'/>
+ <cd:constant name='authoretallimit' value='authoretallimit'/>
+ <cd:constant name='authoretaltext' value='authoretaltext'/>
+ <cd:constant name='auto' value='auto'/>
+ <cd:constant name='autofile' value='autofile'/>
+ <cd:constant name='autofocus' value='autofocus'/>
+ <cd:constant name='autohang' value='autohang'/>
+ <cd:constant name='autostrut' value='autostrut'/>
+ <cd:constant name='autowidth' value='autolatime'/>
+ <cd:constant name='axis' value='axa'/>
+ <cd:constant name='background' value='fundal'/>
+ <cd:constant name='backgroundcolor' value='culoarefundal'/>
+ <cd:constant name='backgroundcorner' value='coltfundal'/>
+ <cd:constant name='backgrounddepth' value='adancimefundal'/>
+ <cd:constant name='backgroundoffset' value='offsetfundal'/>
+ <cd:constant name='backgroundradius' value='razafundal'/>
+ <cd:constant name='backgroundscreen' value='ecranfundal'/>
+ <cd:constant name='backspace' value='spatiuspate'/>
+ <cd:constant name='balance' value='balanta'/>
+ <cd:constant name='before' value='inainte'/>
+ <cd:constant name='beforehead' value='inaintetitlu'/>
+ <cd:constant name='bet' value='bet'/>
+ <cd:constant name='big' value='mare'/>
+ <cd:constant name='blank' value='blanc'/>
+ <cd:constant name='blockway' value='blockway'/>
+ <cd:constant name='bodyfont' value='fonttext'/>
+ <cd:constant name='bookmark' value='semncarte'/>
+ <cd:constant name='bottom' value='jos'/>
+ <cd:constant name='bottomafter' value='bottomafter'/>
+ <cd:constant name='bottombefore' value='bottombefore'/>
+ <cd:constant name='bottomdistance' value='distantajos'/>
+ <cd:constant name='bottomframe' value='framejos'/>
+ <cd:constant name='bottomoffset' value='offsetjos'/>
+ <cd:constant name='bottomspace' value='spatiujos'/>
+ <cd:constant name='bottomstate' value='starejos'/>
+ <cd:constant name='cache' value='cache'/>
+ <cd:constant name='calculate' value='calculeaza'/>
+ <cd:constant name='ccommand' value='comandac'/>
+ <cd:constant name='click' value='click'/>
+ <cd:constant name='clickin' value='clickintru'/>
+ <cd:constant name='clickout' value='clickies'/>
+ <cd:constant name='clipoffset' value='clipoffset'/>
+ <cd:constant name='closeaction' value='actiuneinchidere'/>
+ <cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepageaction' value='actiuneinchiderepagina'/>
+ <cd:constant name='closesymbol' value='closesymbol'/>
+ <cd:constant name='color' value='culoare'/>
+ <cd:constant name='column' value='coloana'/>
+ <cd:constant name='columndistance' value='distantacoloane'/>
+ <cd:constant name='columns' value='coloane'/>
+ <cd:constant name='command' value='comanda'/>
+ <cd:constant name='commandafter' value='comandadupa'/>
+ <cd:constant name='commandbefore' value='comandainainte'/>
+ <cd:constant name='commands' value='comenzi'/>
+ <cd:constant name='component' value='component'/>
+ <cd:constant name='compoundhyphen' value='compoundhyphen'/>
+ <cd:constant name='compress' value='compress'/>
+ <cd:constant name='connector' value='connector'/>
+ <cd:constant name='continue' value='continua'/>
+ <cd:constant name='contrastcolor' value='culoarecontrast'/>
+ <cd:constant name='controls' value='controale'/>
+ <cd:constant name='conversion' value='conversie'/>
+ <cd:constant name='convertfile' value='convertestefisier'/>
+ <cd:constant name='corner' value='colt'/>
+ <cd:constant name='coupling' value='cuplare'/>
+ <cd:constant name='couplingway' value='modcuplare'/>
+ <cd:constant name='criterium' value='criteriu'/>
+ <cd:constant name='current' value='curent'/>
+ <cd:constant name='cutspace' value='cutspace'/>
+ <cd:constant name='dash' value='dash'/>
+ <cd:constant name='dat' value='dat'/>
+ <cd:constant name='database' value='database'/>
+ <cd:constant name='date' value='data'/>
+ <cd:constant name='deepnumbercommand' value='deepnumbercommand'/>
+ <cd:constant name='deeptextcommand' value='deeptextcommand'/>
+ <cd:constant name='default' value='implicit'/>
+ <cd:constant name='delay' value='intarziere'/>
+ <cd:constant name='depth' value='inaltime'/>
+ <cd:constant name='depthcorrection' value='corectieadancime'/>
+ <cd:constant name='direction' value='directie'/>
+ <cd:constant name='directory' value='director'/>
+ <cd:constant name='display' value='display'/>
+ <cd:constant name='distance' value='distanta'/>
+ <cd:constant name='dot' value='punct'/>
+ <cd:constant name='doublesided' value='douafete'/>
+ <cd:constant name='dummy' value='dummy'/>
+ <cd:constant name='dx' value='dx'/>
+ <cd:constant name='dy' value='dy'/>
+ <cd:constant name='edge' value='bordura'/>
+ <cd:constant name='edgedistance' value='distantabordura'/>
+ <cd:constant name='editor' value='editor'/>
+ <cd:constant name='editoretaldisplay' value='editoretaldisplay'/>
+ <cd:constant name='editoretallimit' value='editoretallimit'/>
+ <cd:constant name='editoretaltext' value='editoretaltext'/>
+ <cd:constant name='empty' value='gol'/>
+ <cd:constant name='equalheight' value='equalheight'/>
+ <cd:constant name='equalwidth' value='equalwidth'/>
+ <cd:constant name='escape' value='escape'/>
+ <cd:constant name='evenmargin' value='marginepara'/>
+ <cd:constant name='expansion' value='expansiune'/>
+ <cd:constant name='export' value='export'/>
+ <cd:constant name='extras' value='extras'/>
+ <cd:constant name='factor' value='factor'/>
+ <cd:constant name='fallback' value='fallback'/>
+ <cd:constant name='family' value='familie'/>
+ <cd:constant name='fieldbackgroundcolor' value='culoarefundalcamp'/>
+ <cd:constant name='fieldframecolor' value='culoareframecamp'/>
+ <cd:constant name='fieldlayer' value='fieldlayer'/>
+ <cd:constant name='fieldoffset' value='offsetcamp'/>
+ <cd:constant name='file' value='fisier'/>
+ <cd:constant name='filtercommand' value='filtercommand'/>
+ <cd:constant name='finalnamesep' value='finalnamesep'/>
+ <cd:constant name='firstnamesep' value='firstnamesep'/>
+ <cd:constant name='focus' value='focus'/>
+ <cd:constant name='focusin' value='focusin'/>
+ <cd:constant name='focusout' value='focusout'/>
+ <cd:constant name='footer' value='subsol'/>
+ <cd:constant name='footerdistance' value='distantasubsol'/>
+ <cd:constant name='footerstate' value='staresubsol'/>
+ <cd:constant name='foregroundcolor' value='foregroundcolor'/>
+ <cd:constant name='foregroundstyle' value='foregroundstyle'/>
+ <cd:constant name='format' value='format'/>
+ <cd:constant name='frame' value='frame'/>
+ <cd:constant name='framecolor' value='culoareframe'/>
+ <cd:constant name='framecorner' value='coltframe'/>
+ <cd:constant name='framedepth' value='adancimeframe'/>
+ <cd:constant name='frameoffset' value='offsetframe'/>
+ <cd:constant name='frameradius' value='razaframe'/>
+ <cd:constant name='frames' value='frames'/>
+ <cd:constant name='from' value='dela'/>
+ <cd:constant name='get' value='adu'/>
+ <cd:constant name='global' value='global'/>
+ <cd:constant name='grid' value='grid'/>
+ <cd:constant name='hang' value='suspenda'/>
+ <cd:constant name='headalign' value='headalign'/>
+ <cd:constant name='headcolor' value='culoaretitlu'/>
+ <cd:constant name='headcommand' value='headcommand'/>
+ <cd:constant name='headconversion' value='conversietitlu'/>
+ <cd:constant name='header' value='antet'/>
+ <cd:constant name='headerdistance' value='distantaantet'/>
+ <cd:constant name='headerstate' value='stareantet'/>
+ <cd:constant name='headlabel' value='etichetatitlu'/>
+ <cd:constant name='headnumber' value='numartitlu'/>
+ <cd:constant name='headstyle' value='stiltitlu'/>
+ <cd:constant name='height' value='inaltime'/>
+ <cd:constant name='hfactor' value='hfactor'/>
+ <cd:constant name='hfil' value='hfil'/>
+ <cd:constant name='hidenumber' value='hidenumber'/>
+ <cd:constant name='hoffset' value='hoffset'/>
+ <cd:constant name='horoffset' value='offsetoriz'/>
+ <cd:constant name='hyphen' value='hyphen'/>
+ <cd:constant name='icommand' value='comandai'/>
+ <cd:constant name='in' value='in'/>
+ <cd:constant name='inbetween' value='intre'/>
+ <cd:constant name='increment' value='increment'/>
+ <cd:constant name='incrementnumber' value='numarincrement'/>
+ <cd:constant name='indenting' value='aliniat'/>
+ <cd:constant name='indentnext' value='aliniaturmator'/>
+ <cd:constant name='indicator' value='indicator'/>
+ <cd:constant name='inner' value='intern'/>
+ <cd:constant name='innermargin' value='innermargin'/>
+ <cd:constant name='inputfile' value='inputfile'/>
+ <cd:constant name='intent' value='intent'/>
+ <cd:constant name='interaction' value='interactiune'/>
+ <cd:constant name='interlinespace' value='spatiereinterliniara'/>
+ <cd:constant name='itemalign' value='itemalign'/>
+ <cd:constant name='items' value='elemente'/>
+ <cd:constant name='juniorsep' value='juniorsep'/>
+ <cd:constant name='ken' value='ken'/>
+ <cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keyword' value='keyword'/>
+ <cd:constant name='label' value='eticheta'/>
+ <cd:constant name='lastnamesep' value='lastnamesep'/>
+ <cd:constant name='lastpubsep' value='lastpubsep'/>
+ <cd:constant name='left' value='stanga'/>
+ <cd:constant name='leftcolor' value='culoarestanga'/>
+ <cd:constant name='leftcompoundhyphen' value='leftcompoundhyphen'/>
+ <cd:constant name='leftedge' value='bordurastanga'/>
+ <cd:constant name='leftedgedistance' value='distantabordurastanga'/>
+ <cd:constant name='leftframe' value='framestanga'/>
+ <cd:constant name='lefthyphen' value='lefthyphen'/>
+ <cd:constant name='leftmargin' value='marginestanga'/>
+ <cd:constant name='leftmargindistance' value='distantamarginestanga'/>
+ <cd:constant name='leftoffset' value='offsetstanga'/>
+ <cd:constant name='leftquotation' value='citatstanga'/>
+ <cd:constant name='leftquote' value='minicitatstanga'/>
+ <cd:constant name='leftsentence' value='propozitiestanga'/>
+ <cd:constant name='leftspeech' value='leftspeech'/>
+ <cd:constant name='leftstyle' value='stilstanga'/>
+ <cd:constant name='leftsubsentence' value='subpropozitiestanga'/>
+ <cd:constant name='lefttext' value='textstanga'/>
+ <cd:constant name='leftwidth' value='latimestanga'/>
+ <cd:constant name='level' value='nivel'/>
+ <cd:constant name='levels' value='nivele'/>
+ <cd:constant name='limittext' value='limittext'/>
+ <cd:constant name='line' value='linie'/>
+ <cd:constant name='linecorrection' value='corectielinie'/>
+ <cd:constant name='lines' value='linii'/>
+ <cd:constant name='list' value='lista'/>
+ <cd:constant name='listtext' value='listtext'/>
+ <cd:constant name='local' value='local'/>
+ <cd:constant name='location' value='locatie'/>
+ <cd:constant name='logo' value='logo'/>
+ <cd:constant name='logos' value='logos'/>
+ <cd:constant name='marcolor' value='culoaremarcaj'/>
+ <cd:constant name='margin' value='margine'/>
+ <cd:constant name='margindistance' value='distantamargine'/>
+ <cd:constant name='marginedge' value='coltbordura'/>
+ <cd:constant name='marginedgetext' value='textcoltbordura'/>
+ <cd:constant name='margintext' value='textmargine'/>
+ <cd:constant name='marking' value='marcaje'/>
+ <cd:constant name='marstyle' value='stilmarcaj'/>
+ <cd:constant name='max' value='max'/>
+ <cd:constant name='maxdepth' value='maxdepth'/>
+ <cd:constant name='maxheight' value='inaltimemaxima'/>
+ <cd:constant name='maxwidth' value='latimemaxima'/>
+ <cd:constant name='maybeyear' value='maybeyear'/>
+ <cd:constant name='menu' value='meniu'/>
+ <cd:constant name='method' value='metoda'/>
+ <cd:constant name='middle' value='mijloc'/>
+ <cd:constant name='middlespeech' value='middlespeech'/>
+ <cd:constant name='middletext' value='textmijloc'/>
+ <cd:constant name='midsentence' value='midsentence'/>
+ <cd:constant name='min' value='min'/>
+ <cd:constant name='mindepth' value='mindepth'/>
+ <cd:constant name='minheight' value='inaltimeminima'/>
+ <cd:constant name='minwidth' value='latimeminima'/>
+ <cd:constant name='monthconversion' value='monthconversion'/>
+ <cd:constant name='n' value='n'/>
+ <cd:constant name='name' value='nume'/>
+ <cd:constant name='namesep' value='namesep'/>
+ <cd:constant name='nbottom' value='njos'/>
+ <cd:constant name='nc' value='nc'/>
+ <cd:constant name='next' value='urmatorul'/>
+ <cd:constant name='nl' value='nl'/>
+ <cd:constant name='nleft' value='nstanga'/>
+ <cd:constant name='nlines' value='nlinii'/>
+ <cd:constant name='norm' value='norm'/>
+ <cd:constant name='nr' value='nr'/>
+ <cd:constant name='nright' value='ndreapta'/>
+ <cd:constant name='ntop' value='nsus'/>
+ <cd:constant name='number' value='numar'/>
+ <cd:constant name='numbercolor' value='culoarenumar'/>
+ <cd:constant name='numbercommand' value='comandanumar'/>
+ <cd:constant name='numberconversion' value='numberconversion'/>
+ <cd:constant name='numberconversionset' value='numberconversionset'/>
+ <cd:constant name='numberdistance' value='numberdistance'/>
+ <cd:constant name='numbering' value='numerotare'/>
+ <cd:constant name='numberorder' value='numberorder'/>
+ <cd:constant name='numberprefix' value='numberprefix'/>
+ <cd:constant name='numbersegments' value='numbersegments'/>
+ <cd:constant name='numberseparator' value='separatornumar'/>
+ <cd:constant name='numberseparatorset' value='numberseparatorset'/>
+ <cd:constant name='numberset' value='numberset'/>
+ <cd:constant name='numberstarter' value='numberstarter'/>
+ <cd:constant name='numberstopper' value='numberstopper'/>
+ <cd:constant name='numberstyle' value='stilnumar'/>
+ <cd:constant name='numberwidth' value='numberwidth'/>
+ <cd:constant name='nx' value='nx'/>
+ <cd:constant name='ny' value='ny'/>
+ <cd:constant name='object' value='obiect'/>
+ <cd:constant name='obstruction' value='obstructie'/>
+ <cd:constant name='oddmargin' value='margineimpara'/>
+ <cd:constant name='offset' value='offset'/>
+ <cd:constant name='openaction' value='actiunedeschidere'/>
+ <cd:constant name='openpageaction' value='actiunedeschiderepagina'/>
+ <cd:constant name='option' value='optiune'/>
+ <cd:constant name='order' value='order'/>
+ <cd:constant name='orientation' value='orientation'/>
+ <cd:constant name='otherstext' value='otherstext'/>
+ <cd:constant name='outermargin' value='outermargin'/>
+ <cd:constant name='overprint' value='overprint'/>
+ <cd:constant name='ownnumber' value='numarpropriu'/>
+ <cd:constant name='page' value='pagina'/>
+ <cd:constant name='pageboundaries' value='marginipagina'/>
+ <cd:constant name='pagecolor' value='culoarepagina'/>
+ <cd:constant name='pagecommand' value='comandapagina'/>
+ <cd:constant name='pageconversion' value='pageconversion'/>
+ <cd:constant name='pageconversionset' value='pageconversionset'/>
+ <cd:constant name='pagenumber' value='numarpagina'/>
+ <cd:constant name='pageprefix' value='pageprefix'/>
+ <cd:constant name='pageprefixconnector' value='pageprefixconnector'/>
+ <cd:constant name='pageprefixconversion' value='pageprefixconversion'/>
+ <cd:constant name='pageprefixconversionset' value='pageprefixconversionset'/>
+ <cd:constant name='pageprefixsegments' value='pageprefixsegments'/>
+ <cd:constant name='pageprefixseparatorset' value='pageprefixseparatorset'/>
+ <cd:constant name='pageprefixset' value='pageprefixset'/>
+ <cd:constant name='pageprefixstarter' value='pageprefixstarter'/>
+ <cd:constant name='pageprefixstopper' value='pageprefixstopper'/>
+ <cd:constant name='pagesegments' value='pagesegments'/>
+ <cd:constant name='pageseparatorset' value='pageseparatorset'/>
+ <cd:constant name='pageset' value='pageset'/>
+ <cd:constant name='pagestarter' value='pagestarter'/>
+ <cd:constant name='pagestate' value='pagestate'/>
+ <cd:constant name='pagestopper' value='pagestopper'/>
+ <cd:constant name='pagestyle' value='stilpagina'/>
+ <cd:constant name='palet' value='paleta'/>
+ <cd:constant name='paper' value='hartie'/>
+ <cd:constant name='paragraph' value='paragraf'/>
+ <cd:constant name='place' value='pune'/>
+ <cd:constant name='placehead' value='punetitlu'/>
+ <cd:constant name='placestopper' value='punestopper'/>
+ <cd:constant name='position' value='pozitie'/>
+ <cd:constant name='prefix' value='prefix'/>
+ <cd:constant name='prefixconnector' value='prefixconnector'/>
+ <cd:constant name='prefixconversion' value='prefixconversion'/>
+ <cd:constant name='prefixconversionset' value='prefixconversionset'/>
+ <cd:constant name='prefixsegments' value='prefixsegments'/>
+ <cd:constant name='prefixseparatorset' value='prefixseparatorset'/>
+ <cd:constant name='prefixset' value='prefixset'/>
+ <cd:constant name='prefixstarter' value='prefixstarter'/>
+ <cd:constant name='prefixstopper' value='prefixstopper'/>
+ <cd:constant name='preset' value='preset'/>
+ <cd:constant name='preview' value='previzualizare'/>
+ <cd:constant name='previous' value='precendent'/>
+ <cd:constant name='previousnumber' value='numarprecedent'/>
+ <cd:constant name='process' value='process'/>
+ <cd:constant name='pubsep' value='pubsep'/>
+ <cd:constant name='radius' value='raza'/>
+ <cd:constant name='random' value='aleator'/>
+ <cd:constant name='range' value='range'/>
+ <cd:constant name='reduction' value='reducere'/>
+ <cd:constant name='ref' value='ref'/>
+ <cd:constant name='refcommand' value='refcommand'/>
+ <cd:constant name='reference' value='referinta'/>
+ <cd:constant name='referenceprefix' value='referenceprefix'/>
+ <cd:constant name='referencing' value='referinta'/>
+ <cd:constant name='regionin' value='regiuneintrare'/>
+ <cd:constant name='regionout' value='regiuneiesire'/>
+ <cd:constant name='repeat' value='repeta'/>
+ <cd:constant name='reset' value='reset'/>
+ <cd:constant name='resetnumber' value='resetnumber'/>
+ <cd:constant name='resolution' value='rezolutie'/>
+ <cd:constant name='right' value='dreapta'/>
+ <cd:constant name='rightcolor' value='culoaredreapta'/>
+ <cd:constant name='rightcompoundhyphen' value='rightcompoundhyphen'/>
+ <cd:constant name='rightedge' value='borduradreapta'/>
+ <cd:constant name='rightedgedistance' value='distantacoltdreapta'/>
+ <cd:constant name='rightframe' value='framedreapta'/>
+ <cd:constant name='righthyphen' value='righthyphen'/>
+ <cd:constant name='rightmargin' value='marginedreapta'/>
+ <cd:constant name='rightmargindistance' value='distantamarginedreapta'/>
+ <cd:constant name='rightoffset' value='offsetdreapta'/>
+ <cd:constant name='rightquotation' value='citatdreapta'/>
+ <cd:constant name='rightquote' value='minicitatdreapta'/>
+ <cd:constant name='rightsentence' value='propozitiedreapta'/>
+ <cd:constant name='rightspeech' value='rightspeech'/>
+ <cd:constant name='rightstyle' value='stildreapta'/>
+ <cd:constant name='rightsubsentence' value='subpropozitiedreapta'/>
+ <cd:constant name='righttext' value='textdreapta'/>
+ <cd:constant name='rightwidth' value='marginedreapta'/>
+ <cd:constant name='rotation' value='rotatie'/>
+ <cd:constant name='rule' value='rigla'/>
+ <cd:constant name='rulecolor' value='culoarerigla'/>
+ <cd:constant name='rulethickness' value='grosimerigla'/>
+ <cd:constant name='samepage' value='aceeasipagina'/>
+ <cd:constant name='sample' value='exemplu'/>
+ <cd:constant name='samplesize' value='samplesize'/>
+ <cd:constant name='saveinlist' value='saveinlist'/>
+ <cd:constant name='scale' value='scala'/>
+ <cd:constant name='scope' value='scop'/>
+ <cd:constant name='screen' value='ecran'/>
+ <cd:constant name='section' value='sectiune'/>
+ <cd:constant name='sectionconversion' value='sectionconversion'/>
+ <cd:constant name='sectionconversionset' value='sectionconversionset'/>
+ <cd:constant name='sectionnumber' value='numarsectiune'/>
+ <cd:constant name='sectionresetset' value='sectionresetset'/>
+ <cd:constant name='sectionsegments' value='sectionsegments'/>
+ <cd:constant name='sectionseparatorset' value='sectionseparatorset'/>
+ <cd:constant name='sectionset' value='sectionset'/>
+ <cd:constant name='sectionstarter' value='sectionstarter'/>
+ <cd:constant name='sectionstopper' value='sectionstopper'/>
+ <cd:constant name='separator' value='separator'/>
+ <cd:constant name='set' value='set'/>
+ <cd:constant name='setups' value='setups'/>
+ <cd:constant name='side' value='parte'/>
+ <cd:constant name='sidealign' value='sidealign'/>
+ <cd:constant name='sidemethod' value='sidemethod'/>
+ <cd:constant name='sidespaceafter' value='spatiulateraldupa'/>
+ <cd:constant name='sidespacebefore' value='spatiulateralinainte'/>
+ <cd:constant name='sign' value='semn'/>
+ <cd:constant name='size' value='dimensiune'/>
+ <cd:constant name='small' value='mic'/>
+ <cd:constant name='sort' value='sort'/>
+ <cd:constant name='sorttype' value='sorttype'/>
+ <cd:constant name='source' value='sursa'/>
+ <cd:constant name='space' value='spatiu'/>
+ <cd:constant name='spaceafter' value='spatiudupa'/>
+ <cd:constant name='spacebefore' value='spatiuinainte'/>
+ <cd:constant name='spaceinbetween' value='spaceinbetween'/>
+ <cd:constant name='spacing' value='spatiere'/>
+ <cd:constant name='split' value='split'/>
+ <cd:constant name='splitcolor' value='splitcolor'/>
+ <cd:constant name='splitmethod' value='splitmethod'/>
+ <cd:constant name='splitoffset' value='splitoffset'/>
+ <cd:constant name='spot' value='spot'/>
+ <cd:constant name='stack' value='stack'/>
+ <cd:constant name='start' value='start'/>
+ <cd:constant name='starter' value='starter'/>
+ <cd:constant name='state' value='stare'/>
+ <cd:constant name='step' value='pas'/>
+ <cd:constant name='stop' value='stop'/>
+ <cd:constant name='stopper' value='stopper'/>
+ <cd:constant name='stretch' value='dilatat'/>
+ <cd:constant name='strip' value='strip'/>
+ <cd:constant name='strut' value='strut'/>
+ <cd:constant name='style' value='stil'/>
+ <cd:constant name='sub' value='sub'/>
+ <cd:constant name='subtitle' value='subtitlu'/>
+ <cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='surnamesep' value='surnamesep'/>
+ <cd:constant name='sx' value='sx'/>
+ <cd:constant name='sy' value='sy'/>
+ <cd:constant name='symalign' value='symaliniere'/>
+ <cd:constant name='symbol' value='simbol'/>
+ <cd:constant name='symbolset' value='setsimbol'/>
+ <cd:constant name='symcolor' value='culoaresimbol'/>
+ <cd:constant name='symstyle' value='stilsimbol'/>
+ <cd:constant name='synonym' value='sinonim'/>
+ <cd:constant name='synonymcolor' value='culoaresinonim'/>
+ <cd:constant name='synonymcommand' value='synonymcommand'/>
+ <cd:constant name='synonymstyle' value='stilsinonim'/>
+ <cd:constant name='tab' value='tab'/>
+ <cd:constant name='text' value='text'/>
+ <cd:constant name='textcolor' value='culoaretext'/>
+ <cd:constant name='textcommand' value='comandatext'/>
+ <cd:constant name='textdistance' value='textdistance'/>
+ <cd:constant name='textlayer' value='textlayer'/>
+ <cd:constant name='textmargin' value='textmargin'/>
+ <cd:constant name='textmethod' value='textmethod'/>
+ <cd:constant name='textseparator' value='separatortext'/>
+ <cd:constant name='textsize' value='dimensiunetext'/>
+ <cd:constant name='textstate' value='staretext'/>
+ <cd:constant name='textstyle' value='stiltext'/>
+ <cd:constant name='textwidth' value='latimetext'/>
+ <cd:constant name='title' value='titlu'/>
+ <cd:constant name='titlecolor' value='culoaretitlu'/>
+ <cd:constant name='titlecommand' value='titlecommand'/>
+ <cd:constant name='titledistance' value='distantatitlu'/>
+ <cd:constant name='titleleft' value='titleleft'/>
+ <cd:constant name='titleright' value='titleright'/>
+ <cd:constant name='titlestyle' value='stiltitlu'/>
+ <cd:constant name='to' value='catre'/>
+ <cd:constant name='tolerance' value='toleranta'/>
+ <cd:constant name='top' value='sus'/>
+ <cd:constant name='topdistance' value='distantasus'/>
+ <cd:constant name='topframe' value='framesus'/>
+ <cd:constant name='topoffset' value='offsetsus'/>
+ <cd:constant name='topspace' value='spatiusus'/>
+ <cd:constant name='topstate' value='staresus'/>
+ <cd:constant name='totalnumber' value='totalnumber'/>
+ <cd:constant name='type' value='type'/>
+ <cd:constant name='unit' value='unitate'/>
+ <cd:constant name='unknownreference' value='referintanecunoscuta'/>
+ <cd:constant name='urlalternative' value='urlalternativ'/>
+ <cd:constant name='urlspace' value='spatiuurl'/>
+ <cd:constant name='validate' value='verifica'/>
+ <cd:constant name='vcommand' value='comandav'/>
+ <cd:constant name='veroffset' value='veroffset'/>
+ <cd:constant name='vfil' value='vfil'/>
+ <cd:constant name='voffset' value='voffset'/>
+ <cd:constant name='vonsep' value='vonsep'/>
+ <cd:constant name='way' value='mod'/>
+ <cd:constant name='wfactor' value='factorw'/>
+ <cd:constant name='white' value='alb'/>
+ <cd:constant name='width' value='latime'/>
+ <cd:constant name='xfactor' value='xfactor'/>
+ <cd:constant name='xmax' value='xmax'/>
+ <cd:constant name='xoffset' value='xoffset'/>
+ <cd:constant name='xscale' value='xscala'/>
+ <cd:constant name='xstep' value='xstep'/>
+ <cd:constant name='yfactor' value='yfactor'/>
+ <cd:constant name='ymax' value='ymax'/>
+ <cd:constant name='yoffset' value='yoffset'/>
+ <cd:constant name='yscale' value='yscala'/>
+ <cd:constant name='ystep' value='ystep'/>
+ </cd:constant>
+
+ <!-- definitions for interface elements for language ro -->
+
+ <cd:elements>
+ <cd:element name='answerlines' value='answerlines'/>
+ <cd:element name='answerspace' value='answerspace'/>
+ <cd:element name='begin' value='inceput'/>
+ <cd:element name='complete' value='complet'/>
+ <cd:element name='coupled' value='cuplat'/>
+ <cd:element name='currentlocal' value='localcurent'/>
+ <cd:element name='emptyone' value='gol'/>
+ <cd:element name='emptytwo' value='gol'/>
+ <cd:element name='end' value='sfarsit'/>
+ <cd:element name='endsetup' value=''/>
+ <cd:element name='get' value='get'/>
+ <cd:element name='increment' value='increment'/>
+ <cd:element name='list' value='lista'/>
+ <cd:element name='listof' value='listade'/>
+ <cd:element name='load' value='incarca'/>
+ <cd:element name='local' value='local'/>
+ <cd:element name='makeup' value='makeup'/>
+ <cd:element name='next' value='urmatorul'/>
+ <cd:element name='place' value='pune'/>
+ <cd:element name='previous' value='precedent'/>
+ <cd:element name='previouslocal' value='precedentlocal'/>
+ <cd:element name='reserve' value='rezervat'/>
+ <cd:element name='see' value='vezi'/>
+ <cd:element name='setup' value='setare'/>
+ <cd:element name='start' value='start'/>
+ <cd:element name='stop' value='stop'/>
+ <cd:element name='text' value='text'/>
+ <cd:element name='type' value='type'/>
+ </cd:element>
+
+ <!-- definitions for interface commands for language ro -->
+
+ <cd:commands>
+ <cd:command name='CAPPED' value='KAP'/>
+ <cd:command name='Character' value='Litera'/>
+ <cd:command name='Characters' value='Litere'/>
+ <cd:command name='LABELTEXT' value='TEXTETICHETA'/>
+ <cd:command name='MONTH' value='LUNA'/>
+ <cd:command name='Numbers' value='Numere'/>
+ <cd:command name='Romannumerals' value='Numereromane'/>
+ <cd:command name='SmallCapped' value='Kap'/>
+ <cd:command name='SmallCaps' value='Kaps'/>
+ <cd:command name='WEEKDAY' value='ZIDINSAPTAMANA'/>
+ <cd:command name='WORD' value='CUVANT'/>
+ <cd:command name='WORDS' value='CUVINTE'/>
+ <cd:command name='Word' value='Cuvant'/>
+ <cd:command name='Words' value='Cuvinte'/>
+ <cd:command name='about' value='despre'/>
+ <cd:command name='adaptlayout' value='adapteazaaspect'/>
+ <cd:command name='arg' value='arg'/>
+ <cd:command name='at' value='la'/>
+ <cd:command name='atleftmargin' value='atleftmargin'/>
+ <cd:command name='atpage' value='lapagina'/>
+ <cd:command name='atrightmargin' value='atrightmargin'/>
+ <cd:command name='background' value='fundal'/>
+ <cd:command name='backspace' value='spatiuspate'/>
+ <cd:command name='blackrule' value='linieneagra'/>
+ <cd:command name='blackrules' value='liniinegre'/>
+ <cd:command name='blank' value='blanc'/>
+ <cd:command name='bookmark' value='semncarte'/>
+ <cd:command name='bottomdistance' value='distantajos'/>
+ <cd:command name='bottomheight' value='inaltimejos'/>
+ <cd:command name='bottomspace' value='spatiujos'/>
+ <cd:command name='but' value='but'/>
+ <cd:command name='button' value='buton'/>
+ <cd:command name='bypassblocks' value='saripesteblocuri'/>
+ <cd:command name='character' value='litera'/>
+ <cd:command name='characters' value='litere'/>
+ <cd:command name='chem' value='chem'/>
+ <cd:command name='clip' value='clip'/>
+ <cd:command name='clonefield' value='cloneazacamp'/>
+ <cd:command name='color' value='culoare'/>
+ <cd:command name='colorbar' value='baraculoare'/>
+ <cd:command name='colorvalue' value='valoareculoare'/>
+ <cd:command name='column' value='coloana'/>
+ <cd:command name='comment' value='comentariu'/>
+ <cd:command name='comparecolorgroup' value='comparagrupculoare'/>
+ <cd:command name='comparepalet' value='comparapaleta'/>
+ <cd:command name='completepagenumber' value='completeazanumarpagina'/>
+ <cd:command name='completeregister' value='completeregister'/>
+ <cd:command name='component' value='componenta'/>
+ <cd:command name='convertnumber' value='convertestenumar'/>
+ <cd:command name='copyfield' value='copiazacamp'/>
+ <cd:command name='correctwhitespace' value='corecteazaspatiualb'/>
+ <cd:command name='coupledocument' value='cupleazadocument'/>
+ <cd:command name='couplemarking' value='cupleazamarcaje'/>
+ <cd:command name='couplepage' value='paginadubla'/>
+ <cd:command name='couplepaper' value='hartiedubla'/>
+ <cd:command name='coupleregister' value='cupleazaregistru'/>
+ <cd:command name='crlf' value='crlf'/>
+ <cd:command name='currentdate' value='datacurenta'/>
+ <cd:command name='currentheadnumber' value='numartitlucurent'/>
+ <cd:command name='cutspace' value='cutspace'/>
+ <cd:command name='date' value='data'/>
+ <cd:command name='decouplemarking' value='decupleazamarcaje'/>
+ <cd:command name='decrementnumber' value='decrementnumber'/>
+ <cd:command name='define' value='defineste'/>
+ <cd:command name='defineaccent' value='definesteaccent'/>
+ <cd:command name='defineblank' value='definesteblanc'/>
+ <cd:command name='defineblock' value='definestebloc'/>
+ <cd:command name='definebodyfont' value='definestefonttext'/>
+ <cd:command name='definebodyfontenvironment' value='definestemediulfonttext'/>
+ <cd:command name='definebuffer' value='definestebuffer'/>
+ <cd:command name='definecharacter' value='definestecaracter'/>
+ <cd:command name='definecolor' value='definesteculoare'/>
+ <cd:command name='definecolorgroup' value='definestegrupculori'/>
+ <cd:command name='definecolumnbreak' value='definecolumnbreak'/>
+ <cd:command name='definecolumnset' value='definecolumnset'/>
+ <cd:command name='definecombination' value='definecombination'/>
+ <cd:command name='definecombinedlist' value='definestelistacombinata'/>
+ <cd:command name='definecommand' value='definestecomanda'/>
+ <cd:command name='defineconversion' value='definesteconversie'/>
+ <cd:command name='definedescription' value='definestedescriere'/>
+ <cd:command name='defineenumeration' value='definesteenumerare'/>
+ <cd:command name='definefield' value='definestecamp'/>
+ <cd:command name='definefieldstack' value='definestestivacampuri'/>
+ <cd:command name='definefiguresymbol' value='definestesimbolfigura'/>
+ <cd:command name='definefloat' value='definestefloat'/>
+ <cd:command name='definefont' value='definestefont'/>
+ <cd:command name='definefontstyle' value='definestestilfont'/>
+ <cd:command name='definefontsynonym' value='definestesinonimfont'/>
+ <cd:command name='defineframed' value='definesteinconjurare'/>
+ <cd:command name='defineframedtext' value='definestetextinconjurat'/>
+ <cd:command name='definehbox' value='definestehbox'/>
+ <cd:command name='definehead' value='definesteantet'/>
+ <cd:command name='defineindenting' value='definestealiat'/>
+ <cd:command name='defineinmargin' value='defineinmargin'/>
+ <cd:command name='defineinteractionmenu' value='definestemeniuinteractiune'/>
+ <cd:command name='defineitemgroup' value='defineitemgroup'/>
+ <cd:command name='definelabel' value='definesteeticheta'/>
+ <cd:command name='definelayer' value='definelayer'/>
+ <cd:command name='definelayout' value='definelayout'/>
+ <cd:command name='definelist' value='definestelista'/>
+ <cd:command name='definelogo' value='definestelogo'/>
+ <cd:command name='definemainfield' value='definestecampprincipal'/>
+ <cd:command name='definemakeup' value='definestemakeup'/>
+ <cd:command name='definemarking' value='definestemarcaje'/>
+ <cd:command name='definemathalignment' value='definemathalignment'/>
+ <cd:command name='defineoutput' value='definesteoutput'/>
+ <cd:command name='defineoverlay' value='definesteoverlay'/>
+ <cd:command name='definepagebreak' value='definepagebreak'/>
+ <cd:command name='definepalet' value='definestepaleta'/>
+ <cd:command name='definepapersize' value='definestedimensiunehartie'/>
+ <cd:command name='defineparagraphs' value='definesteparagraf'/>
+ <cd:command name='defineplacement' value='defineplacement'/>
+ <cd:command name='defineprofile' value='definesteprofil'/>
+ <cd:command name='defineprogram' value='definesteprogram'/>
+ <cd:command name='definerawfont' value='definestefontraw'/>
+ <cd:command name='definereference' value='definestereferinte'/>
+ <cd:command name='definereferenceformat' value='definesteformatreferinte'/>
+ <cd:command name='definereferencelist' value='definestelistareferinte'/>
+ <cd:command name='defineregister' value='definesteregistru'/>
+ <cd:command name='definerule' value='definesterigla'/>
+ <cd:command name='definesection' value='definestesectiune'/>
+ <cd:command name='definesectionblock' value='definesteblocsectiune'/>
+ <cd:command name='definesorting' value='definestesortare'/>
+ <cd:command name='definestartstop' value='definestestartstop'/>
+ <cd:command name='definestyle' value='definestestil'/>
+ <cd:command name='definesubfield' value='definestesubcamp'/>
+ <cd:command name='definesymbol' value='definestesimbol'/>
+ <cd:command name='definesynonyms' value='definestesinonim'/>
+ <cd:command name='definetabletemplate' value='definestesablontabel'/>
+ <cd:command name='definetabulate' value='definestetabulatori'/>
+ <cd:command name='definetext' value='definestetext'/>
+ <cd:command name='definetextposition' value='definestepozitietext'/>
+ <cd:command name='definetextvariable' value='definestevariabilatext'/>
+ <cd:command name='definetype' value='definetype'/>
+ <cd:command name='definetyping' value='definestetyping'/>
+ <cd:command name='defineversion' value='definesteversiune'/>
+ <cd:command name='determineheadnumber' value='determinanumartitlu'/>
+ <cd:command name='determinelistcharacteristics' value='determinacaracteristicilelistei'/>
+ <cd:command name='determineregistercharacteristics' value='determinacaracteristiciregistru'/>
+ <cd:command name='dimension' value='dimensiune'/>
+ <cd:command name='disableinteractionmenu' value='dezactiveazameniuinteractiune'/>
+ <cd:command name='domicile' value='domiciliu'/>
+ <cd:command name='donttest' value='nutesta'/>
+ <cd:command name='edgedistance' value='distantacolt'/>
+ <cd:command name='edgewidth' value='latimecolturi'/>
+ <cd:command name='emptylines' value='emptylines'/>
+ <cd:command name='environment' value='mediu'/>
+ <cd:command name='externalfigure' value='figuraexterna'/>
+ <cd:command name='fact' value='fact'/>
+ <cd:command name='field' value='camp'/>
+ <cd:command name='fieldstack' value='stivacampuri'/>
+ <cd:command name='fillinfield' value='campumplere'/>
+ <cd:command name='fillinline' value='linieumplere'/>
+ <cd:command name='fillinrules' value='rigleumplere'/>
+ <cd:command name='fillintext' value='textumplere'/>
+ <cd:command name='fitfield' value='potrivestecamp'/>
+ <cd:command name='fixedspace' value='spatiufixat'/>
+ <cd:command name='fixedspaces' value='spatiifixate'/>
+ <cd:command name='followprofile' value='urmeazaprofil'/>
+ <cd:command name='followprofileversion' value='urmeazaversiuneprofil'/>
+ <cd:command name='followversion' value='urmeazaversiune'/>
+ <cd:command name='footerdistance' value='distantasubsol'/>
+ <cd:command name='footerheight' value='inaltimesubsol'/>
+ <cd:command name='footnote' value='notasubsol'/>
+ <cd:command name='footnotetext' value='footnotetext'/>
+ <cd:command name='forceblocks' value='forteazablocuri'/>
+ <cd:command name='formulanumber' value='numarformula'/>
+ <cd:command name='fraction' value='fractie'/>
+ <cd:command name='framed' value='framed'/>
+ <cd:command name='from' value='din'/>
+ <cd:command name='getbuffer' value='adubuffer'/>
+ <cd:command name='getmarking' value='adumarcaje'/>
+ <cd:command name='getnumber' value='getnumber'/>
+ <cd:command name='godown' value='injos'/>
+ <cd:command name='goto' value='dute'/>
+ <cd:command name='gotobox' value='dutebox'/>
+ <cd:command name='gotopage' value='dutepagina'/>
+ <cd:command name='graycolor' value='culoaregri'/>
+ <cd:command name='greyvalue' value='valoaregri'/>
+ <cd:command name='grid' value='grid'/>
+ <cd:command name='hairline' value='firdepar'/>
+ <cd:command name='head' value='titlu'/>
+ <cd:command name='headerdistance' value='distantaantet'/>
+ <cd:command name='headerheight' value='inaltimeantet'/>
+ <cd:command name='headlevel' value='niveltitlu'/>
+ <cd:command name='headnumber' value='numartitlu'/>
+ <cd:command name='headsym' value='headsym'/>
+ <cd:command name='headtext' value='texttitlu'/>
+ <cd:command name='hideblocks' value='ascundeblocuri'/>
+ <cd:command name='high' value='inalt'/>
+ <cd:command name='hl' value='hl'/>
+ <cd:command name='immediatebetweenlist' value='immediatebetweenlist'/>
+ <cd:command name='immediatetolist' value='immediatetolist'/>
+ <cd:command name='in' value='in'/>
+ <cd:command name='incrementnumber' value='numarincrement'/>
+ <cd:command name='indenting' value='aliniat'/>
+ <cd:command name='inframed' value='inframed'/>
+ <cd:command name='infull' value='pelung'/>
+ <cd:command name='ininner' value='ininner'/>
+ <cd:command name='inleft' value='instanga'/>
+ <cd:command name='inleftedge' value='inparteastanga'/>
+ <cd:command name='inleftmargin' value='inmargineastanga'/>
+ <cd:command name='inline' value='inlinie'/>
+ <cd:command name='inmargin' value='marginal'/>
+ <cd:command name='inmframed' value='inmaframed'/>
+ <cd:command name='inneredgedistance' value='inneredgedistance'/>
+ <cd:command name='inneredgewidth' value='inneredgewidth'/>
+ <cd:command name='innermargindistance' value='innermargindistance'/>
+ <cd:command name='innermarginwidth' value='innermarginwidth'/>
+ <cd:command name='inothermargin' value='inaltamargine'/>
+ <cd:command name='inouter' value='inouter'/>
+ <cd:command name='inright' value='indreapta'/>
+ <cd:command name='inrightedge' value='inparteadreapta'/>
+ <cd:command name='inrightmargin' value='inmargineadreapta'/>
+ <cd:command name='installlanguage' value='instalarelimba'/>
+ <cd:command name='interactionbar' value='barainteractiune'/>
+ <cd:command name='interactionbuttons' value='butoaneinteractiune'/>
+ <cd:command name='interactionmenu' value='meniuinteractiune'/>
+ <cd:command name='item' value='element'/>
+ <cd:command name='items' value='element'/>
+ <cd:command name='its' value='el'/>
+ <cd:command name='keepblocks' value='pastreazablocuri'/>
+ <cd:command name='label' value='eticheta'/>
+ <cd:command name='labels' value='etichete'/>
+ <cd:command name='labeltext' value='texteticheta'/>
+ <cd:command name='language' value='limba'/>
+ <cd:command name='leftaligned' value='aliniatstanga'/>
+ <cd:command name='leftedgedistance' value='distantacoltstanga'/>
+ <cd:command name='leftedgewidth' value='latimecoltstanga'/>
+ <cd:command name='leftmargindistance' value='distantamarginestanga'/>
+ <cd:command name='leftmarginwidth' value='latimemarginestanga'/>
+ <cd:command name='leg' value='leg'/>
+ <cd:command name='linewidth' value='grosimelinie'/>
+ <cd:command name='listheight' value='inaltimelista'/>
+ <cd:command name='listlength' value='lungimelista'/>
+ <cd:command name='listsymbol' value='listsymbol'/>
+ <cd:command name='listwidth' value='latimelista'/>
+ <cd:command name='logfields' value='logcampuri'/>
+ <cd:command name='lohi' value='jossus'/>
+ <cd:command name='low' value='jos'/>
+ <cd:command name='macroname' value='nume'/>
+ <cd:command name='mainlanguage' value='limbaprincipala'/>
+ <cd:command name='makeupheight' value='inaltimemakeup'/>
+ <cd:command name='makeupwidth' value='latimemakeup'/>
+ <cd:command name='mar' value='mar'/>
+ <cd:command name='margindistance' value='distantamargine'/>
+ <cd:command name='marginrule' value='liniemargine'/>
+ <cd:command name='margintext' value='textmarginal'/>
+ <cd:command name='margintitle' value='titlumarginal'/>
+ <cd:command name='marginwidth' value='latimemargine'/>
+ <cd:command name='marginword' value='cuvantmarginal'/>
+ <cd:command name='marking' value='marcaje'/>
+ <cd:command name='markversion' value='marcheazaversiune'/>
+ <cd:command name='mathematics' value='matematica'/>
+ <cd:command name='menubutton' value='butonmeniu'/>
+ <cd:command name='mframed' value='maframed'/>
+ <cd:command name='midaligned' value='aliniatcentru'/>
+ <cd:command name='mirror' value='reflexie'/>
+ <cd:command name='month' value='luna'/>
+ <cd:command name='moveformula' value='moveformula'/>
+ <cd:command name='moveongrid' value='mutapegrid'/>
+ <cd:command name='movesidefloat' value='movesidefloat'/>
+ <cd:command name='navigating' value='navigating'/>
+ <cd:command name='nodimension' value='faradimensiune'/>
+ <cd:command name='noheaderandfooterlines' value='faraliniiantetsisubsol'/>
+ <cd:command name='noindenting' value='faraaliniat'/>
+ <cd:command name='nolist' value='faralista'/>
+ <cd:command name='nomarking' value='faramarcaje'/>
+ <cd:command name='nomoreblocks' value='gatablocuri'/>
+ <cd:command name='nomorefiles' value='farafisiere'/>
+ <cd:command name='nop' value='nop'/>
+ <cd:command name='nospace' value='faraspatiu'/>
+ <cd:command name='note' value='nota'/>
+ <cd:command name='notopandbottomlines' value='faraliniisussijos'/>
+ <cd:command name='notsmallcapped' value='nokap'/>
+ <cd:command name='nowhitespace' value='faraspatiualb'/>
+ <cd:command name='numberofsubpages' value='numberofsubpages'/>
+ <cd:command name='numbers' value='numere'/>
+ <cd:command name='outeredgedistance' value='outeredgedistance'/>
+ <cd:command name='outeredgewidth' value='outeredgewidth'/>
+ <cd:command name='outermargindistance' value='outermargindistance'/>
+ <cd:command name='outermarginwidth' value='outermarginwidth'/>
+ <cd:command name='packed' value='impachetat'/>
+ <cd:command name='page' value='pagina'/>
+ <cd:command name='pagedepth' value='pagedepth'/>
+ <cd:command name='pagenumber' value='numarpagina'/>
+ <cd:command name='pageoffset' value='pageoffset'/>
+ <cd:command name='pagereference' value='referintapagina'/>
+ <cd:command name='pagetype' value='tippagina'/>
+ <cd:command name='paperheight' value='inaltimehartie'/>
+ <cd:command name='paperwidth' value='latimehartie'/>
+ <cd:command name='periods' value='puncte'/>
+ <cd:command name='plaatsruwelijst' value='placerawlist'/>
+ <cd:command name='placebookmarks' value='plaseazasemnecarte'/>
+ <cd:command name='placecombinedlist' value='punelistacombinata'/>
+ <cd:command name='placefloat' value='placefloat'/>
+ <cd:command name='placefootnotes' value='punenotesubsol'/>
+ <cd:command name='placeformula' value='puneformula'/>
+ <cd:command name='placeheadnumber' value='placeheadnumber'/>
+ <cd:command name='placeheadtext' value='placeheadtext'/>
+ <cd:command name='placelegend' value='punelegenda'/>
+ <cd:command name='placelist' value='punelista'/>
+ <cd:command name='placelocalfootnotes' value='punenotesubsollocale'/>
+ <cd:command name='placelogos' value='punelogouri'/>
+ <cd:command name='placeongrid' value='plaseazapegrid'/>
+ <cd:command name='placeontopofeachother' value='punedeasuprafiecareia'/>
+ <cd:command name='placepagenumber' value='punenumarpagina'/>
+ <cd:command name='placereferencelist' value='placereferencelist'/>
+ <cd:command name='placeregister' value='puneregistru'/>
+ <cd:command name='placerule' value='punerigla'/>
+ <cd:command name='placesidebyside' value='punefatainfata'/>
+ <cd:command name='placesubformula' value='punesubformula'/>
+ <cd:command name='placetextvariable' value='punevariabilatext'/>
+ <cd:command name='position' value='pozitie'/>
+ <cd:command name='positiontext' value='pozitietext'/>
+ <cd:command name='printpaperheight' value='inaltimehartieimprimanta'/>
+ <cd:command name='printpaperwidth' value='latimehartieimprimanta'/>
+ <cd:command name='processblocks' value='proceseazabloc'/>
+ <cd:command name='processpage' value='proceseazapagina'/>
+ <cd:command name='product' value='produs'/>
+ <cd:command name='program' value='program'/>
+ <cd:command name='project' value='proiect'/>
+ <cd:command name='publication' value='publicatie'/>
+ <cd:command name='quotation' value='citat'/>
+ <cd:command name='quote' value='minicitat'/>
+ <cd:command name='ran' value='ran'/>
+ <cd:command name='redo' value='refa'/>
+ <cd:command name='ref' value='ref'/>
+ <cd:command name='reference' value='referinta'/>
+ <cd:command name='referral' value='referit'/>
+ <cd:command name='referraldate' value='datareferit'/>
+ <cd:command name='referring' value='referring'/>
+ <cd:command name='remark' value='remarca'/>
+ <cd:command name='reset' value='reset'/>
+ <cd:command name='resetmarking' value='reseteazamarcaje'/>
+ <cd:command name='resetnumber' value='resetnumber'/>
+ <cd:command name='resettext' value='resettextcontent'/>
+ <cd:command name='rightaligned' value='aliniatdreapta'/>
+ <cd:command name='rightedgedistance' value='distantacoltdreapta'/>
+ <cd:command name='rightedgewidth' value='latimecoltdreapta'/>
+ <cd:command name='rightmargindistance' value='distantamarginedreapta'/>
+ <cd:command name='rightmarginwidth' value='latimemarginedreapta'/>
+ <cd:command name='romannumerals' value='numereromane'/>
+ <cd:command name='rotate' value='roteste'/>
+ <cd:command name='scale' value='scala'/>
+ <cd:command name='screen' value='ecran'/>
+ <cd:command name='selectblocks' value='selecteazablocuri'/>
+ <cd:command name='selectpaper' value='selecteazahartie'/>
+ <cd:command name='selectversion' value='selecteazaversiune'/>
+ <cd:command name='setnumber' value='setnumber'/>
+ <cd:command name='settextcontent' value='settextcontent'/>
+ <cd:command name='settextvariable' value='setvariabilatext'/>
+ <cd:command name='setupalign' value='seteazaalinierea'/>
+ <cd:command name='setupanswerarea' value='setupanswerarea'/>
+ <cd:command name='setuparranging' value='seteazaaranjareapag'/>
+ <cd:command name='setupbackground' value='seteazafundal'/>
+ <cd:command name='setupbackgrounds' value='seteazafundaluri'/>
+ <cd:command name='setupblackrules' value='seteazaliniinegre'/>
+ <cd:command name='setupblank' value='seteazablanc'/>
+ <cd:command name='setupblock' value='seteazabloc'/>
+ <cd:command name='setupbodyfont' value='seteazafonttext'/>
+ <cd:command name='setupbodyfontenvironment' value='seteazamediulfonttext'/>
+ <cd:command name='setupbottom' value='seteazajos'/>
+ <cd:command name='setupbottomtexts' value='seteazatextejos'/>
+ <cd:command name='setupbuffer' value='seteazabuffer'/>
+ <cd:command name='setupbuttons' value='seteazabutoane'/>
+ <cd:command name='setupcapitals' value='seteazamajuscule'/>
+ <cd:command name='setupcaption' value='seteazalegenda'/>
+ <cd:command name='setupcaptions' value='seteazalegendele'/>
+ <cd:command name='setupclipping' value='seteazaclipping'/>
+ <cd:command name='setupcolor' value='seteazaculoare'/>
+ <cd:command name='setupcolors' value='seteazaculori'/>
+ <cd:command name='setupcolumns' value='seteazacoloane'/>
+ <cd:command name='setupcolumnset' value='setupcolumnset'/>
+ <cd:command name='setupcolumnsetlines' value='setupcolumnsetlines'/>
+ <cd:command name='setupcolumnsetstart' value='setupcolumnsetstart'/>
+ <cd:command name='setupcombinations' value='seteazacombinari'/>
+ <cd:command name='setupcombinedlist' value='seteazalistacombinata'/>
+ <cd:command name='setupcomment' value='seteazacomentariu'/>
+ <cd:command name='setupdescriptions' value='seteazadescriere'/>
+ <cd:command name='setupenumerations' value='seteazaenumerare'/>
+ <cd:command name='setupexternalfigures' value='seteazafiguriexterne'/>
+ <cd:command name='setupfield' value='seteazacamp'/>
+ <cd:command name='setupfields' value='seteazacampuri'/>
+ <cd:command name='setupfillinlines' value='seteazaliniiumplere'/>
+ <cd:command name='setupfillinrules' value='seteazarigleumplere'/>
+ <cd:command name='setupfloat' value='seteazafloat'/>
+ <cd:command name='setupfloats' value='seteazafloats'/>
+ <cd:command name='setupfloatsplitting' value='seteazaimpartireafloat'/>
+ <cd:command name='setupfooter' value='seteazasubsol'/>
+ <cd:command name='setupfootertexts' value='seteazatextesubsol'/>
+ <cd:command name='setupfootnotedefinition' value='seteazadefinireanotasubsol'/>
+ <cd:command name='setupfootnotes' value='seteazanotasubsol'/>
+ <cd:command name='setupforms' value='seteazaformulare'/>
+ <cd:command name='setupformulas' value='seteazaformule'/>
+ <cd:command name='setupframed' value='seteazainconjurat'/>
+ <cd:command name='setupframedtexts' value='definestetexteinconjurate'/>
+ <cd:command name='setuphead' value='seteazatitlu'/>
+ <cd:command name='setupheader' value='seteazaantet'/>
+ <cd:command name='setupheadertexts' value='seteazatexteantet'/>
+ <cd:command name='setupheadnumber' value='seteazanumartitlu'/>
+ <cd:command name='setupheads' value='seteazatitluri'/>
+ <cd:command name='setupheadtext' value='seteazatexttitlu'/>
+ <cd:command name='setuphyphenmark' value='seteazaliniesilabe'/>
+ <cd:command name='setupindentations' value='seteazaaliniate'/>
+ <cd:command name='setupindenting' value='seteazaaliniat'/>
+ <cd:command name='setupinmargin' value='seteazamarginal'/>
+ <cd:command name='setupinteraction' value='seteazainteractiunea'/>
+ <cd:command name='setupinteractionbar' value='seteazabarainteractiune'/>
+ <cd:command name='setupinteractionmenu' value='seteazameniuinteractiune'/>
+ <cd:command name='setupinteractionscreen' value='seteazaecraninteractiune'/>
+ <cd:command name='setupinterlinespace' value='seteazaspatiuinterliniar'/>
+ <cd:command name='setupitemgroup' value='setupitemgroup'/>
+ <cd:command name='setupitemgroups' value='setareitemization'/>
+ <cd:command name='setupitems' value='seteazaelemente'/>
+ <cd:command name='setuplabeltext' value='seteazatexteticheta'/>
+ <cd:command name='setuplanguage' value='setarelimba'/>
+ <cd:command name='setuplayout' value='seteazaaspect'/>
+ <cd:command name='setuplegend' value='seteazalegenda'/>
+ <cd:command name='setuplinenumbering' value='seteazanumerotarelinii'/>
+ <cd:command name='setuplines' value='seteazalinii'/>
+ <cd:command name='setuplinewidth' value='seteazagrosimelinie'/>
+ <cd:command name='setuplist' value='seteazalista'/>
+ <cd:command name='setupmakeup' value='seteazamakeup'/>
+ <cd:command name='setupmarginblocks' value='seteazablocurimarginale'/>
+ <cd:command name='setupmarginrules' value='seteazaliniimargine'/>
+ <cd:command name='setupmarking' value='seteazamarcaje'/>
+ <cd:command name='setupmathalignment' value='setupmathalignment'/>
+ <cd:command name='setupnarrower' value='seteazaingust'/>
+ <cd:command name='setupnumber' value='setupnumber'/>
+ <cd:command name='setupnumbering' value='seteazanumerotare'/>
+ <cd:command name='setupoppositeplacing' value='seteazaplasareaopozita'/>
+ <cd:command name='setupoutput' value='setareoutput'/>
+ <cd:command name='setuppagecomment' value='seteazacomentariupagina'/>
+ <cd:command name='setuppagenumber' value='seteazanumarpagina'/>
+ <cd:command name='setuppagenumbering' value='seteazanumerotarepagina'/>
+ <cd:command name='setuppagetransitions' value='seteazatranzitiepagina'/>
+ <cd:command name='setuppalet' value='seteazapaleta'/>
+ <cd:command name='setuppaper' value='setuppaper'/>
+ <cd:command name='setuppapersize' value='seteazadimensiunihartie'/>
+ <cd:command name='setupparagraphnumbering' value='seteazanumerotareparagrafe'/>
+ <cd:command name='setupparagraphs' value='seteazaparagrafe'/>
+ <cd:command name='setupplacement' value='setupplacement'/>
+ <cd:command name='setuppositioning' value='setarepozitie'/>
+ <cd:command name='setupprofiles' value='seteazaprofile'/>
+ <cd:command name='setupprograms' value='seteazaprograme'/>
+ <cd:command name='setuppublications' value='seteazapublicatii'/>
+ <cd:command name='setupquote' value='seteazaminicitat'/>
+ <cd:command name='setupreferencelist' value='seteazalistareferinte'/>
+ <cd:command name='setupreferencing' value='seteazareferinte'/>
+ <cd:command name='setupregister' value='seteazaregistru'/>
+ <cd:command name='setuprotate' value='seteazarotare'/>
+ <cd:command name='setuprule' value='seteazarigla'/>
+ <cd:command name='setups' value='setari'/>
+ <cd:command name='setupscreens' value='seteazaecrane'/>
+ <cd:command name='setupsection' value='seteazasectiune'/>
+ <cd:command name='setupsectionblock' value='seteazablocsectiune'/>
+ <cd:command name='setupsorting' value='seteazasortare'/>
+ <cd:command name='setupspacing' value='seteazaspatiu'/>
+ <cd:command name='setupstartstop' value='setupstartstop'/>
+ <cd:command name='setupstrut' value='seteazastrut'/>
+ <cd:command name='setupsubpagenumber' value='seteazanumarsubpagina'/>
+ <cd:command name='setupsymbolset' value='seteazasimbol'/>
+ <cd:command name='setupsynchronization' value='setaresincronizare'/>
+ <cd:command name='setupsynchronizationbar' value='setarebarasincronizare'/>
+ <cd:command name='setupsynonyms' value='seteazasinonime'/>
+ <cd:command name='setupsystem' value='seteazasistem'/>
+ <cd:command name='setuptab' value='seteazatab'/>
+ <cd:command name='setuptables' value='seteazatabele'/>
+ <cd:command name='setuptabulate' value='seteazatabulatori'/>
+ <cd:command name='setuptext' value='seteazatext'/>
+ <cd:command name='setuptextposition' value='seteazapozitietext'/>
+ <cd:command name='setuptextrules' value='seteazarigletext'/>
+ <cd:command name='setuptexttexts' value='seteazatextetext'/>
+ <cd:command name='setuptextvariable' value='seteazavariabilatext'/>
+ <cd:command name='setupthinrules' value='seteazaliniesubtire'/>
+ <cd:command name='setuptolerance' value='seteazatoleranta'/>
+ <cd:command name='setuptop' value='seteazasus'/>
+ <cd:command name='setuptoptexts' value='seteazatextesus'/>
+ <cd:command name='setuptype' value='seteazatype'/>
+ <cd:command name='setuptyping' value='seteazatyping'/>
+ <cd:command name='setupunderbar' value='seteazasublinie'/>
+ <cd:command name='setupurl' value='seteazaurl'/>
+ <cd:command name='setupversions' value='seteazaversiuni'/>
+ <cd:command name='setupwhitespace' value='seteazaspatiualb'/>
+ <cd:command name='showbodyfont' value='afiseazafonttext'/>
+ <cd:command name='showbodyfontenvironment' value='afiseazamediufonttext'/>
+ <cd:command name='showcolor' value='afiseazaculoare'/>
+ <cd:command name='showcolorgroup' value='afiseazagrupculoare'/>
+ <cd:command name='showexternalfigures' value='afiseazafiguriexterne'/>
+ <cd:command name='showfields' value='afiseazacampuri'/>
+ <cd:command name='showframe' value='afiseazarama'/>
+ <cd:command name='showgrid' value='afiseazagrid'/>
+ <cd:command name='showlayout' value='afiseazaaspect'/>
+ <cd:command name='showmakeup' value='afiseazamakeup'/>
+ <cd:command name='showpalet' value='afiseazapaleta'/>
+ <cd:command name='showprint' value='afiseazatiparire'/>
+ <cd:command name='showsetups' value='afiseazasetari'/>
+ <cd:command name='showstruts' value='afiseazastruts'/>
+ <cd:command name='showsymbolset' value='afiseazasetsimboluri'/>
+ <cd:command name='smallcapped' value='kap'/>
+ <cd:command name='someline' value='olinie'/>
+ <cd:command name='somewhere' value='undeva'/>
+ <cd:command name='space' value='spatiu'/>
+ <cd:command name='splitfloat' value='impartefloat'/>
+ <cd:command name='startalignment' value='startaliniere'/>
+ <cd:command name='startbackground' value='startfundal'/>
+ <cd:command name='startcoding' value='startcodificare'/>
+ <cd:command name='startcolor' value='startculoare'/>
+ <cd:command name='startcolumnmakeup' value='startcolumnmakeup'/>
+ <cd:command name='startcolumns' value='startcoloane'/>
+ <cd:command name='startcolumnset' value='startcolumnset'/>
+ <cd:command name='startcombination' value='startcombinare'/>
+ <cd:command name='startcomponent' value='startcomponenta'/>
+ <cd:command name='startdocument' value='startdocument'/>
+ <cd:command name='startenvironment' value='startmediu'/>
+ <cd:command name='startfigure' value='startfigura'/>
+ <cd:command name='startglobal' value='startglobal'/>
+ <cd:command name='startline' value='startlinie'/>
+ <cd:command name='startlinecorrection' value='startcorectielinie'/>
+ <cd:command name='startlinenumbering' value='startnumerotarelinii'/>
+ <cd:command name='startlines' value='startlinii'/>
+ <cd:command name='startlocal' value='startlocal'/>
+ <cd:command name='startlocalfootnotes' value='startnotesubsollocale'/>
+ <cd:command name='startmakeup' value='startmakeup'/>
+ <cd:command name='startmarginblock' value='startblocmarginal'/>
+ <cd:command name='startmarginrule' value='startliniemargine'/>
+ <cd:command name='startnarrower' value='startingust'/>
+ <cd:command name='startopposite' value='startopozit'/>
+ <cd:command name='startoverlay' value='startoverlay'/>
+ <cd:command name='startoverzicht' value='startoverview'/>
+ <cd:command name='startpacked' value='startimpachetat'/>
+ <cd:command name='startpositioning' value='startpozitionare'/>
+ <cd:command name='startproduct' value='startprodus'/>
+ <cd:command name='startprofile' value='startprofil'/>
+ <cd:command name='startproject' value='startproiect'/>
+ <cd:command name='startquotation' value='startcitat'/>
+ <cd:command name='startraster' value='startraster'/>
+ <cd:command name='startsymbolset' value='startsetsimboluri'/>
+ <cd:command name='startsynchronization' value='startsincronizare'/>
+ <cd:command name='starttable' value='starttabel'/>
+ <cd:command name='starttables' value='starttabele'/>
+ <cd:command name='starttext' value='starttext'/>
+ <cd:command name='starttextrule' value='startriglatext'/>
+ <cd:command name='startunpacked' value='startneimpachetat'/>
+ <cd:command name='startversion' value='startversiune'/>
+ <cd:command name='stopalignment' value='stopaliniere'/>
+ <cd:command name='stopbackground' value='stopfundal'/>
+ <cd:command name='stopcoding' value='stopcodificare'/>
+ <cd:command name='stopcolor' value='stopculoare'/>
+ <cd:command name='stopcolumnmakeup' value='stopcolumnmakeup'/>
+ <cd:command name='stopcolumns' value='stopcoloane'/>
+ <cd:command name='stopcolumnset' value='stopcolumnset'/>
+ <cd:command name='stopcombination' value='stopcombinare'/>
+ <cd:command name='stopcomponent' value='stopcomponenta'/>
+ <cd:command name='stopdocument' value='stopdocument'/>
+ <cd:command name='stopenvironment' value='stopmediu'/>
+ <cd:command name='stopglobal' value='stopblobal'/>
+ <cd:command name='stopline' value='stoplinie'/>
+ <cd:command name='stoplinecorrection' value='stopcorectielinie'/>
+ <cd:command name='stoplinenumbering' value='stopnumerotarelinii'/>
+ <cd:command name='stoplines' value='stoplinii'/>
+ <cd:command name='stoplocal' value='stoplocal'/>
+ <cd:command name='stoplocalfootnotes' value='stopnotesubsollocale'/>
+ <cd:command name='stopmakeup' value='stopmakeup'/>
+ <cd:command name='stopmarginblock' value='stopblocmarginal'/>
+ <cd:command name='stopmarginrule' value='stopliniemargine'/>
+ <cd:command name='stopnarrower' value='stopingust'/>
+ <cd:command name='stopopposite' value='stopopozit'/>
+ <cd:command name='stopoverlay' value='stopoverlay'/>
+ <cd:command name='stopoverzicht' value='stopoverview'/>
+ <cd:command name='stoppacked' value='stopimpachetat'/>
+ <cd:command name='stoppositioning' value='stoppozitionare'/>
+ <cd:command name='stopproduct' value='stopprodus'/>
+ <cd:command name='stopprofile' value='stopprofil'/>
+ <cd:command name='stopproject' value='stopproiect'/>
+ <cd:command name='stopquotation' value='stopcitat'/>
+ <cd:command name='stopraster' value='stopraster'/>
+ <cd:command name='stopsynchronization' value='stopsincronizare'/>
+ <cd:command name='stoptable' value='stoptabel'/>
+ <cd:command name='stoptables' value='stoptabele'/>
+ <cd:command name='stoptext' value='stoptext'/>
+ <cd:command name='stoptextrule' value='stopriglatext'/>
+ <cd:command name='stopunpacked' value='stopneimpachetat'/>
+ <cd:command name='stopversion' value='stopversiune'/>
+ <cd:command name='stretched' value='intins'/>
+ <cd:command name='subformulanumber' value='numarsubformula'/>
+ <cd:command name='subpagenumber' value='subpagenumber'/>
+ <cd:command name='switchtobodyfont' value='trecilafonttext'/>
+ <cd:command name='switchtorawfont' value='trecilafontraw'/>
+ <cd:command name='sym' value='sim'/>
+ <cd:command name='symbol' value='simbol'/>
+ <cd:command name='synchronizationbar' value='barasincronizare'/>
+ <cd:command name='synchronize' value='sincronizeaza'/>
+ <cd:command name='tab' value='tab'/>
+ <cd:command name='testcolumn' value='testcolumn'/>
+ <cd:command name='testpage' value='testpage'/>
+ <cd:command name='tex' value='tex'/>
+ <cd:command name='textheight' value='inaltimetext'/>
+ <cd:command name='textreference' value='referintatext'/>
+ <cd:command name='textrule' value='riglatext'/>
+ <cd:command name='textvariable' value='variabilatext'/>
+ <cd:command name='textwidth' value='latimetext'/>
+ <cd:command name='thinrule' value='liniesubtire'/>
+ <cd:command name='thinrules' value='liniisubtiri'/>
+ <cd:command name='tooltip' value='tooltip'/>
+ <cd:command name='topdistance' value='distantasus'/>
+ <cd:command name='topheight' value='inaltimesus'/>
+ <cd:command name='topspace' value='spatiusus'/>
+ <cd:command name='totalnumberofpages' value='numartotalpagini'/>
+ <cd:command name='translate' value='traduce'/>
+ <cd:command name='txt' value='txt'/>
+ <cd:command name='typ' value='typ'/>
+ <cd:command name='type' value='type'/>
+ <cd:command name='typebuffer' value='scriebuffer'/>
+ <cd:command name='typefile' value='typefile'/>
+ <cd:command name='unitmeaning' value='numeunitate'/>
+ <cd:command name='unknown' value='necunoscut'/>
+ <cd:command name='useJSscripts' value='folosestescriptJS'/>
+ <cd:command name='useURL' value='folosesteURL'/>
+ <cd:command name='useXMLfilter' value='useXMLfilter'/>
+ <cd:command name='useblocks' value='folosestebloc'/>
+ <cd:command name='usecommands' value='folosestecomenzi'/>
+ <cd:command name='useencoding' value='folosestecodificarea'/>
+ <cd:command name='useexternaldocument' value='folosestedocumentextern'/>
+ <cd:command name='useexternalfigure' value='folosestefiguraexterna'/>
+ <cd:command name='useexternalfile' value='folosestefisierextern'/>
+ <cd:command name='useexternalfiles' value='folosestefisiereexterne'/>
+ <cd:command name='useexternalsoundtrack' value='folosestemuzicaexterna'/>
+ <cd:command name='usemodule' value='folosestemodul'/>
+ <cd:command name='usemodules' value='folosestemodule'/>
+ <cd:command name='usepath' value='folosestedirector'/>
+ <cd:command name='usereferences' value='folosestereferinte'/>
+ <cd:command name='usespecials' value='folosestespeciale'/>
+ <cd:command name='usesymbols' value='folosestesimboluri'/>
+ <cd:command name='usetypescript' value='usetypescript'/>
+ <cd:command name='usetypescriptfile' value='usetypescriptfile'/>
+ <cd:command name='useurl' value='folosesteurl'/>
+ <cd:command name='version' value='versiune'/>
+ <cd:command name='vl' value='vl'/>
+ <cd:command name='weekday' value='zidinsaptamana'/>
+ <cd:command name='whitespace' value='spatiualb'/>
+ <cd:command name='wordright' value='cuvantdreapta'/>
+ <cd:command name='writebetweenlist' value='scrieintreliste'/>
+ <cd:command name='writetolist' value='scrieinlista'/>
+ <cd:command name='writetoreferencelist' value='scrieinlistareferinte'/>
+ <cd:command name='writetoregister' value='scrieinregistru'/>
+ </cd:command>
+
+</cd:interface> \ No newline at end of file
diff --git a/tex/context/patterns/lang-agr.hyp b/tex/context/patterns/lang-agr.hyp
new file mode 100644
index 000000000..9e36be3de
--- /dev/null
+++ b/tex/context/patterns/lang-agr.hyp
@@ -0,0 +1,32 @@
+% context hyphenation file, see lang-all.xml for original comment
+
+% source of data: grahyph4.tex oldgrhyph.tex
+
+% begin description data
+
+% <!-- copied from lang-all.xml
+%
+% <?xml version='1.0' standalone='yes'?>
+%
+% <description language='agr'>
+% <sourcefile>grahyph4.tex</sourcefile>
+% <title>TeX hyphenation patterns for the ancient Greek language</title>
+% <copyright>
+% <year>2004</year>
+% <owner>Dimitrios Filippou</owner>
+% <comment>These hyphenation patterns are explained in "ancient.pdf".
+% Hyphenation examples are given in the file "anc-test.pdf".
+% Some doubtful patterns are marked by three question marks "???".</comment>
+% </copyright>
+% </description>
+%
+% end of copy -->
+
+% end description data
+
+% begin hyphenation data
+
+\hyphenation {}
+
+% end hyphenation data
+
diff --git a/tex/context/patterns/lang-agr.pat b/tex/context/patterns/lang-agr.pat
new file mode 100644
index 000000000..122bcda21
--- /dev/null
+++ b/tex/context/patterns/lang-agr.pat
@@ -0,0 +1,2880 @@
+% context pattern file, see lang-all.xml for original comment
+
+% source of data: grahyph4.tex oldgrhyph.tex
+
+% begin description data
+
+% <!-- copied from lang-all.xml
+%
+% <?xml version='1.0' standalone='yes'?>
+%
+% <description language='agr'>
+% <sourcefile>grahyph4.tex</sourcefile>
+% <title>TeX hyphenation patterns for the ancient Greek language</title>
+% <copyright>
+% <year>2004</year>
+% <owner>Dimitrios Filippou</owner>
+% <comment>These hyphenation patterns are explained in "ancient.pdf".
+% Hyphenation examples are given in the file "anc-test.pdf".
+% Some doubtful patterns are marked by three question marks "???".</comment>
+% </copyright>
+% </description>
+%
+% end of copy -->
+
+% end description data
+
+% begin pattern data
+
+\patterns {
+α1
+ε1
+η1
+ι1
+ο1
+υ1
+ω1
+ᾳ1
+ῃ1
+ῳ1
+α2ι
+α2ί
+α2ί
+α2ὶ
+α2ῖ
+α2ἰ
+α2ἴ
+α2ἲ
+α2ἶ
+α2ἱ
+α2ἵ
+α2ἳ
+α2ἷ
+ά3ι
+ά3ι
+ᾶ3ι
+ἀ3ι
+ἁ3ι
+α2υ
+α2ύ
+α2ύ
+α2ὺ
+α2ῦ
+α2ὐ
+α2ὔ
+α2ὒ
+α2ὖ
+α2ὑ
+α2ὕ
+α2ὓ
+α2ὗ
+ά3υ
+ά3υ
+ᾶ3υ
+ἀ3υ
+ἁ3υ
+ε2ι
+ε2ί
+ε2ί
+ε2ὶ
+ε2ῖ
+ε2ἰ
+ε2ἴ
+ε2ἲ
+ε2ἶ
+ε2ἱ
+ε2ἵ
+ε2ἳ
+ε2ἷ
+έ3ι
+έ3ι
+ἐ3ι
+ἑ3ι
+ε2υ
+ε2ύ
+ε2ύ
+ε2ὺ
+ε2ῦ
+ε2ὐ
+ε2ὔ
+ε2ὒ
+ε2ὖ
+ε2ὑ
+ε2ὕ
+ε2ὓ
+ε2ὗ
+έ3υ
+έ3υ
+ἑ3υ
+ἐ3υ
+η2υ
+η2ύ
+η2ύ
+η2ὺ
+η2ῦ
+η2ὐ
+η2ὔ
+η2ὒ
+η2ὖ
+η2ὑ
+η2ὕ
+η2ὓ
+η2ὗ
+ή3υ
+ή3υ
+ῆ3υ
+ἠ3υ
+ἡ3υ
+ο2ι
+ο2ί
+ο2ί
+ο2ὶ
+ο2ῖ
+ο2ἰ
+ο2ἴ
+ο2ἲ
+ο2ἶ
+ο2ἱ
+ο2ἵ
+ο2ἳ
+ο2ἷ
+ό3ι
+ό3ι
+ὀ3ι
+ὁ3ι
+ο2υ
+ο2ύ
+ο2ύ
+ο2ὺ
+ο2ῦ
+ο2ὐ
+ο2ὔ
+ο2ὒ
+ο2ὖ
+ο2ὑ
+ο2ὕ
+ο2ὓ
+ο2ὗ
+ό3υ
+ό3υ
+ὀ3υ
+ὁ3υ
+υ2ι
+υ2ί
+υ2ί
+υ2ὶ
+υ2ῖ
+υ2ἰ
+υ2ἴ
+υ2ἲ
+υ2ἶ
+υ2ἱ
+υ2ἵ
+υ2ἳ
+υ2ἷ
+ύ3ι
+ύ3ι
+ῦ3ι
+ὐ3ι
+ὑ3ι
+ου3ι
+όυ4ι
+όυ4ι
+ὀυ4ι
+ὁυ4ι
+ο3υί
+ο3υί
+ο3υῖ
+4β.
+4γ.
+4δ.
+4ζ.
+4θ.
+4κ.
+4λ.
+4μ.
+4ν.
+4ξ.
+4π.
+4ρ.
+4σ.
+4ς.
+4τ.
+4φ.
+4χ.
+4ψ.
+.β4
+.γ4
+.δ4
+.ζ4
+.θ4
+.κ4
+.λ4
+.μ4
+.ν4
+.ξ4
+.π4
+.ρ4
+.σ4
+.τ4
+.φ4
+.χ4
+.ψ4
+2β1β
+2γ1γ
+2δ1δ
+2ζ1ζ
+2θ1θ
+2κ1κ
+2λ1λ
+2μ1μ
+2ν1ν
+2π1π
+2ρ1ρ
+2ῤ1ῥ
+2σ1σ
+2τ1τ
+2φ1φ
+2χ1χ
+2ψ1ψ
+2β1γ
+2β1ζ
+2β1θ
+2β1κ
+2β1ξ
+2β1π
+2β1σ
+2β1τ
+2β1φ
+2β1χ
+2β1ψ
+2γ1β
+2γ1ζ
+2γ1θ
+2γ1κ
+2γ1ξ
+2γ1π
+2γ1σ
+2γ1τ
+2γ1φ
+2γ1χ
+2γ1ψ
+2δ1β
+2δ1γ
+2δ1ζ
+2δ1θ
+2δ1κ
+2δ1λ
+2δ1ξ
+2δ1π
+2δ1σ
+2δ1τ
+2δ1φ
+2δ1χ
+2δ1ψ
+2ζ1β
+2ζ1γ
+2ζ1δ
+2ζ1θ
+2ζ1κ
+2ζ1λ
+2ζ1μ
+2ζ1ν
+2ζ1ξ
+2ζ1π
+2ζ1ρ
+2ζ1σ
+2ζ1τ
+2ζ1φ
+2ζ1χ
+2ζ1ψ
+2θ1β
+2θ1γ
+2θ1δ
+2θ1ζ
+2θ1κ
+2θ1ξ
+2θ1π
+2θ1σ
+2θ1τ
+2θ1φ
+2θ1χ
+2θ1ψ
+2κ1β
+2κ1γ
+2κ1δ
+2κ1ζ
+2κ1θ
+2κ1ξ
+2κ1π
+2κ1σ
+2κ1φ
+2κ1χ
+2κ1ψ
+2λ1β
+2λ1γ
+2λ1δ
+2λ1ζ
+2λ1θ
+2λ1κ
+2λ1μ
+2λ1ν
+2λ1ξ
+2λ1π
+2λ1ρ
+2λ1σ
+2λ1τ
+2λ1φ
+2λ1χ
+2λ1ψ
+2μ1β
+2μ1γ
+2μ1δ
+2μ1ζ
+2μ1θ
+2μ1κ
+2μ1λ
+2μ1ξ
+2μ1π
+2μ1ρ
+2μ1σ
+2μ1τ
+2μ1φ
+2μ1χ
+2μ1ψ
+2ν1β
+2ν1γ
+2ν1δ
+2ν1ζ
+2ν1θ
+2ν1κ
+2ν1λ
+2ν1μ
+2ν1ξ
+2ν1π
+2ν1ρ
+2ν1σ
+2νς.
+2ν1τ
+2ν1φ
+2ν1χ
+2ν1ψ
+2ξ1β
+2ξ1γ
+2ξ1δ
+2ξ1ζ
+2ξ1θ
+2ξ1κ
+2ξ1λ
+2ξ1μ
+2ξ1ν
+2ξ1π
+2ξ1ρ
+2ξ1σ
+2ξ1τ
+2ξ1φ
+2ξ1χ
+2ξ1ψ
+2π1β
+2π1γ
+2π1δ
+2π1ζ
+2π1θ
+2π1κ
+2π1ξ
+2π1σ
+2π1φ
+2π1χ
+2π1ψ
+2ρ1β
+2ρ1γ
+2ρ1δ
+2ρ1ζ
+2ρ1θ
+2ρ1κ
+2ρ1λ
+2ρ1μ
+2ρ1ν
+2ρ1ξ
+2ρ1π
+2ρ1σ
+2ρ1τ
+2ρ1φ
+2ρ1χ
+2ρ1ψ
+2σ1δ
+2σ1ζ
+2σ1λ
+2σ1ν
+2σ1ξ
+2σ1ρ
+2σ1ψ
+2τ1β
+2τ1γ
+2τ1δ
+2τ1ζ
+2τ1θ
+2τ1κ
+2τ1ξ
+2τ1π
+2τ1σ
+2τ1φ
+2τ1χ
+2τ1ψ
+2φ1β
+2φ1γ
+2φ1δ
+2φ1ζ
+2φ1κ
+2φ1ξ
+2φ1π
+2φ1σ
+2φ1τ
+2φ1χ
+2φ1ψ
+2χ1β
+2χ1γ
+2χ1δ
+2χ1ζ
+2χ1κ
+2χ1ξ
+2χ1π
+2χ1σ
+2χ1τ
+2χ1φ
+2χ1ψ
+2ψ1β
+2ψ1γ
+2ψ1δ
+2ψ1ζ
+2ψ1θ
+2ψ1κ
+2ψ1λ
+2ψ1μ
+2ψ1ν
+2ψ1ξ
+2ψ1π
+2ψ1ρ
+2ψ1σ
+2ψ1τ
+2ψ1φ
+2ψ1χ
+ἀγω2ν1άρ
+ἀγω2ν1άρ
+ἀγω2ν1αρ
+ἀδιέ2ξ1
+ἀδιέ2ξ1
+ἀδιε2ξ1
+ἀδυ2σ1ώ
+ἀδυ2σ1ώ
+ἀδυ2σ1ω
+ἁλό2σ1
+ἁλό2σ1
+ἁλο2σ1
+ἀμπαλί2ν1
+ἀμπαλί2ν1
+ἀμπαλι2ν1
+ἀμφί2σ1β
+ἀμφί2σ1β
+ἀμφι2σ1β
+ἀμφί2σ1ω
+ἀμφί2σ1ω
+ἀμφι2σ1ώ
+ἀμφι2σ1ώ
+ἀ2ν1αγής.
+ἀ2ν1αγής.
+ἀ2ν1αγὴς.
+ἀ2ν1αγήσ.
+ἀ2ν1αγήσ.
+ἀ2ν1αγὴσ.
+ἀ2ν1αγο
+ἀ2ν1αγεῖ.
+ἀ2ν1αγῆ.
+ἀ2ν1αγές.
+ἀ2ν1αγές.
+ἀ2ν1αγὲς.
+ἀ2ν1αγέσ.
+ἀ2ν1αγέσ.
+ἀ2ν1αγὲσ.
+ἀ2ν1αγεῖς.
+ἀ2ν1αγεῖσ.
+ἀ2ν1αγῶν.
+ἀ2ν1αγέσι
+ἀ2ν1αγέσι
+ἀ2ν1αγῆ
+ἀ2ν1άγκυ
+ἀ2ν1άγκυ
+ἀ2ν1αγκύ
+ἀ2ν1αγκύ
+ἄ2ν1αγν
+ἀ2ν1άγν
+ἀ2ν1άγν
+ἀ2ν1αγν
+ἀ3ν2αγνά
+ἀ3ν2αγνά
+ἀ3ν2αγνω
+ἀ3ν2άγνω
+ἀ3ν2άγνω
+ἀ3ν2αγνώ
+ἀ3ν2αγνώ
+ἀ2ν1αγρί
+ἀ2ν1αγρί
+ἀ2ν1αγρῖ
+ἀ2ν1αγρι
+ἀ2ν1άγωγ
+ἀ2ν1άγωγ
+ἀ2ν1αγώγ
+ἀ2ν1αγώγ
+ἀ3ν2αγώγι
+ἀ3ν2αγώγι
+ἀ3ν2αγωγί
+ἀ3ν2αγωγί
+ἀ4ν3αγωγία
+ἀ4ν3αγωγία
+ἀ2ν1άδελ
+ἀ2ν1άδελ
+ἀ2ν1αδέλ
+ἀ2ν1αδέλ
+ἀ2ν1άελπ
+ἀ2ν1άελπ
+ἀ2ν1αέλπ
+ἀ2ν1αέλπ
+ἄ2ν1αθλ
+ἀ2ν1άθλ
+ἀ2ν1άθλ
+ἀ2ν1αίδ
+ἀ2ν1αίδ
+ἀ2ν1αιδ
+ἄ2ν1αιμ
+ἀ2ν1αίμ
+ἀ2ν1αίμ
+ἀ2ν1αιμ
+ἀ2ν1αίσθ
+ἀ2ν1αίσθ
+ἀ2ν1αισθ
+ἀ2ν1αισι
+ἀ2ν1αισί
+ἀ2ν1αισί
+ἀ2ν1αίσχ
+ἀ2ν1αίσχ
+ἀ2ν1αισχ
+ἀ2ν1αίτ
+ἀ2ν1αίτ
+ἀ2ν1αιτ
+ἀ2ν1άκαν
+ἀ2ν1άκαν
+ἀ2ν1ακάν
+ἀ2ν1ακάν
+ἀ2ν1ακόλο
+ἀ2ν1ακόλο
+ἀ2ν1ακολο
+ἀ2ν1αλγ
+ἀ2ν1αλδ
+ἀ3ν2αλδα
+ἀ3ν2αλδήσκ
+ἀ3ν2αλδήσκ
+ἀ2ν1άλειπ
+ἀ2ν1άλειπ
+ἀ2ν1αλείπ
+ἀ2ν1αλείπ
+ἀ2ν1αλειφ
+ἀ2ν1άλειφ
+ἀ2ν1άλειφ
+ἀ2ν1αλείφ
+ἀ2ν1αλείφ
+ἀ2ν1αλήθ
+ἀ2ν1αλήθ
+ἀ2ν1αληθ
+ἀ2ν1άλθ
+ἀ2ν1άλθ
+ἀ2ν1αλθ
+ἀ2ν1άλιπ
+ἀ2ν1άλιπ
+ἀ2ν1αλίπ
+ἀ2ν1αλίπ
+ἀ2ν1άλιστ
+ἀ2ν1άλιστ
+ἀ2ν1αλίστ
+ἀ2ν1αλίστ
+ἀ2ν1αλκ
+ἄ2ν1αλκ
+ἀ2ν1άλκ
+ἀ2ν1άλκ
+ἀ2ν1άλλ
+ἀ2ν1άλλ
+ἀ2ν1αλλ
+ἀ3ν2άλλο
+ἀ3ν2άλλο
+ἀ3ν2άλλε
+ἀ3ν2άλλε
+ἄ2ν1αλμ
+ἀ2ν1άλμ
+ἀ2ν1άλμ
+ἀ2ν1αλμ
+ἄ2ν1αλο
+ἀ2ν1άλου
+ἀ2ν1άλου
+ἀ2ν1άλῳ.
+ἀ2ν1άλῳ.
+ἄ2ν1αλε.
+ἀ2ν1άλοι
+ἀ2ν1άλοι
+ἀ2ν1άλων.
+ἀ2ν1άλων.
+ἄ2ν1αλτ
+ἀ2ν1άλτ
+ἀ2ν1άλτ
+ἀ2ν1αμάξ
+ἀ2ν1αμάξ
+ἀ2ν1αμαξ
+ἀ2ν1αμάρτ
+ἀ2ν1αμάρτ
+ἀ2ν1αμαρτ
+ἀ2ν1αμέλγ
+ἀ2ν1αμέλγ
+ἀ2ν1αμελγ
+ἀ2ν1αμπ
+ἀ2ν1άμπ
+ἀ2ν1άμπ
+ἀ2ν1αμφ
+ἀναμφι2σ1
+ἀ2ν1ανάγκ
+ἀ2ν1ανάγκ
+ἀ2ν1αναγκ
+ἄ2ν1ανδ
+ἀ2ν1άνδ
+ἀ2ν1άνδ
+ἀ2ν1ανθ
+ἀ3ν2ανθέ
+ἀ3ν2ανθέ
+ἀ4ν3ανθές.
+ἀ4ν3ανθές.
+ἀ4ν3ανθὲς.
+ἀ4ν3ανθέσ.
+ἀ4ν3ανθέσ.
+ἀ4ν3ανθὲσ.
+ἀ4ν3ανθέσι
+ἀ4ν3ανθέσι
+ἀ2ν1άνιο
+ἀ2ν1άνιο
+ἀ2ν1ανίο
+ἀ2ν1ανίο
+ἀ2ν1ανίω
+ἀ2ν1ανίω
+ἀ2ν1ανταγ
+ἀ2ν1ανταπ
+ἀ2ν1αντί
+ἀ2ν1αντί
+ἀ2ν1αντι
+ἀνα2ξ1αγ
+ἀνά2ξ1αν
+ἀνά2ξ1αν
+ἀνα2ξ1άν
+ἀνα2ξ1άν
+ἀνα2ξ1αν
+ἀνά2ξ1αρ
+ἀνά2ξ1αρ
+ἀνα2ξ1άρ
+ἀνα2ξ1άρ
+ἀνά2ξ1ιπ
+ἀνά2ξ1ιπ
+ἀνα2ξ1ίπ
+ἀνα2ξ1ίπ
+ἀ2ν1αξιόλ
+ἀ2ν1αξιόλ
+ἀ2ν1αξιολ
+ἀ2ν1αξιόπ
+ἀ2ν1αξιόπ
+ἀ2ν1αξιοπ
+ἀ2ν1άξιο
+ἀ2ν1άξιο
+ἀ2ν1αξίο
+ἀ2ν1αξίο
+ἀ2ν1αξίω
+ἀ2ν1αξίω
+ἀ2ν1αξία
+ἀ2ν1αξία
+ἀ2ν1αξῖα
+ἀ2ν1απάλλα
+ἀ2ν1απάλλα
+ἀ2ν1απαλλά
+ἀ2ν1απαλλά
+ἀ2ν1απάρτ
+ἀ2ν1απάρτ
+ἀ2ν1απαρτ
+ἀ2ν1απαύδ
+ἀ2ν1απαύδ
+ἀ2ν1απαυδ
+ἀ2ν1απόβ
+ἀ2ν1απόβ
+ἀ2ν1αποβ
+ἀ2ν1απόγ
+ἀ2ν1απόγ
+ἀ2ν1απογ
+ἀ2ν1αποδή
+ἀ2ν1αποδή
+ἀ2ν1αποδη
+ἀ2ν1απόδο
+ἀ2ν1απόδο
+ἀ2ν1αποδό
+ἀ2ν1αποδό
+ἀ2ν1απόδρ
+ἀ2ν1απόδρ
+ἀ2ν1αποδρ
+ἀ2ν1απόλαυ
+ἀ2ν1απόλαυ
+ἀ2ν1απολαύ
+ἀ2ν1απολαύ
+ἀ2ν1απολό
+ἀ2ν1απολό
+ἀ2ν1απολο
+ἀ2ν1απόλυ
+ἀ2ν1απόλυ
+ἀ2ν1απολύ
+ἀ2ν1απολύ
+ἀ2ν1απόν
+ἀ2ν1απόν
+ἀ2ν1απον
+ἀ2ν1απόπ
+ἀ2ν1απόπ
+ἀ2ν1αποπ
+ἀ2ν1απόσ
+ἀ2ν1απόσ
+ἀ2ν1αποσ
+ἀ2ν1απότε
+ἀ2ν1απότε
+ἀ2ν1αποτε
+ἀ2ν1απότμ
+ἀ2ν1απότμ
+ἀ2ν1αποτμ
+ἀ2ν1απότρ
+ἀ2ν1απότρ
+ἀ2ν1αποτρ
+ἀ2ν1αρά
+ἀ2ν1αρά
+ἀ2ν1αρα
+ἀ2ν1άρ
+ἀ2ν1άρ
+ἀ2ν1αρ
+ἄ2ν1αρ
+ἀ3ν2αρίτ
+ἀ3ν2αρίτ
+ἀ3ν2αρῖτ
+ἀ3ν2αριτ
+ἀ3ν2αρπ
+ἀ3ν2άρρ
+ἀ3ν2άρρ
+ἀ3ν2αρρ
+ἀ4ν3αρραγ
+ἀ3ν2αρτ
+ἀ3ν2αρύτ
+ἀ3ν2αρύτ
+ἀ2ν1άσκη
+ἀ2ν1άσκη
+ἀ2ν1ασκή
+ἀ2ν1ασκή
+ἄ2ν1ασπι
+ἀ2ν1ασπί
+ἀ2ν1ασπί
+ἀ2ν1άσσατ
+ἀ2ν1άσσατ
+ἀ2ν1ασσάτ
+ἀ2ν1ασσάτ
+ἀ2ν1άστει
+ἀ2ν1άστει
+ἀ2ν1αστεί
+ἀ2ν1αστεί
+ἀ3ν2αστείβ
+ἀ3ν2αστείβ
+ἀ3ν2άστειρ
+ἀ3ν2άστειρ
+ἀ3ν2αστείρ
+ἀ3ν2αστείρ
+ἀ3ν2άστειχ
+ἀ3ν2άστειχ
+ἀ3ν2αστείχ
+ἀ3ν2αστείχ
+ἀ2ν1ατεὶ.
+ἀ2ν1ατεί.
+ἀ2ν1ατεί.
+ἀ2ν1ατὶ.
+ἀ2ν1ατί.
+ἀ2ν1ατί.
+ἄ2ν1ατος.
+ἄ2ν1ατοσ.
+ἀ2ν1άτου.
+ἀ2ν1άτου.
+ἀ2ν1άτω
+ἀ2ν1άτω
+ἄ2ν1ατον.
+ἄ2ν1ατε
+ἄ2ν1ατοι.
+ἀ2ν1άτοις.
+ἀ2ν1άτοις.
+ἀ2ν1άτοισ.
+ἀ2ν1άτοισ.
+ἀ2ν1άττ
+ἀ2ν1άττ
+ἀ2ν1αττ
+ἀ2ν1αύγ
+ἀ2ν1αύγ
+ἀ2ν1αυγ
+ἀ2ν1αύδ
+ἀ2ν1αύδ
+ἀ2ν1αυδ
+ἀ3ν2αυδί
+ἀ3ν2αυδί
+ἀ3ν2αυδι
+ἄ2ν1αυδ
+ἄ2ν1αυλ
+ἀ2ν1αύλ
+ἀ2ν1αύλ
+ἀ2ν1αύξ
+ἀ2ν1αύξ
+ἀ2ν1αυξ
+ἀ2ν1αύχ
+ἀ2ν1αύχ
+ἀ2ν1αυχ
+ἀ2ν1αφαίρ
+ἀ2ν1αφαίρ
+ἀ2ν1αφαιρ
+ἀ2ν1αφή
+ἀ2ν1αφή
+ἀ2ν1αφὴ
+ἀ2ν1αφοῦ
+ἀ2ν1αφῆ
+ἀ2ν1αφεῖ
+ἀ2ν1αφοῖ
+ἀ2ν1εφῶν.
+ἀ2ν1αφέ
+ἀ2ν1αφέ
+ἀ2ν1αφὲ
+ἀ3ν2αφῆν
+ἀ2ν1αφρόδ
+ἀ2ν1αφρόδ
+ἀ2ν1αφροδ
+ἄ2ν1αφρ
+ἀ2ν1άφρ
+ἀ2ν1άφρ
+ἀ2ν1αχύρ
+ἀ2ν1αχύρ
+ἀ2ν1αχυρ
+ἀνδρό2σ1α
+ἀνδρό2σ1α
+ἀνδρο2σ1α
+ἀ2ν1έγγ
+ἀ2ν1έγγ
+ἀ2ν1εγγ
+ἀ2ν1έγερτ
+ἀ2ν1έγερτ
+ἀ2ν1εγέρτ
+ἀ2ν1εγέρτ
+ἀ2ν1εγκ
+ἀ2ν1έγκ
+ἀ2ν1έγκ
+ἀ2ν1εγχ
+ἀ2ν1εδά
+ἀ2ν1εδά
+ἀ2ν1εδα
+ἀ2ν1έδεσ
+ἀ2ν1έδεσ
+ἀ2ν1εδέσ
+ἀ2ν1εδέσ
+ἀ2ν1έδρασ
+ἀ2ν1έδρασ
+ἀ2ν1εδράσ
+ἀ2ν1εδράσ
+ἀ2ν1εέρ
+ἀ2ν1εέρ
+ἀ2ν1εερ
+ἀ2ν1εθέλ
+ἀ2ν1εθέλ
+ἀ2ν1εθελ
+ἀ2ν1έθι
+ἀ2ν1έθι
+ἀ2ν1εθί
+ἀ2ν1εθί
+ἀ2ν1είδε
+ἀ2ν1είδε
+ἀ2ν1ειδέ
+ἀ2ν1ειδέ
+ἀ2ν1είδω
+ἀ2ν1είδω
+ἀ2ν1ειδώ
+ἀ2ν1ειδώ
+ἀ2ν1είκα
+ἀ2ν1είκα
+ἀ2ν1εικά
+ἀ2ν1εικά
+ἀ2ν1εικό
+ἀ2ν1εικό
+ἀ2ν1εικο
+ἀ2ν1ειλεί
+ἀ2ν1ειλεί
+ἀ2ν1ειλει
+ἀ2ν1είμα
+ἀ2ν1είμα
+ἀ2ν1εί2σ1ακ
+ἀ2ν1εί2σ1ακ
+ἀ2ν1ει2σ1άκ
+ἀ2ν1ει2σ1άκ
+ἀ2ν1εί2σ1ο
+ἀ2ν1εί2σ1ο
+ἀ2ν1ει2σ1ό
+ἀ2ν1ει2σ1ό
+ἀ2ν1ει2σ1φορ
+ἀ2ν1εί2σ1φορ
+ἀ2ν1εί2σ1φορ
+ἀ2ν1ει2σ1φόρ
+ἀ2ν1ει2σ1φόρ
+ἀ2ν1έκ
+ἀ2ν1έκ
+ἀ2ν1εκ
+ἀ3ν2έκα
+ἀ3ν2έκα
+ἀ3ν2εκάς.
+ἀ3ν2εκάς.
+ἀ3ν2εκὰς.
+ἀ3ν2εκάσ.
+ἀ3ν2εκάσ.
+ἀ3ν2εκὰσ.
+ἀ3ν2εκτ
+ἀ4ν3έ2κ1τιτ
+ἀ4ν3έ2κ1τιτ
+ἀ4ν3ε2κ1τίτ
+ἀ4ν3ε2κ1τίτ
+ἀνε2κ1λιπ
+ἀνε2κ1λό
+ἀνε2κ1λό
+ἀνε2κ1λο
+ἀ2ν1έλαι
+ἀ2ν1έλαι
+ἀ2ν1ελαι
+ἀ2ν1ελάτ
+ἀ2ν1ελάτ
+ἀ2ν1ελατ
+ἀ2ν1έλεγκ
+ἀ2ν1έλεγκ
+ἀ2ν1ελέγκ
+ἀ2ν1ελέγκ
+ἀ2ν1ελεγξ
+ἀ2ν1ελέη
+ἀ2ν1ελέη
+ἀ2ν1ελεή
+ἀ2ν1ελεή
+ἀ2ν1έλεο
+ἀ2ν1έλεο
+ἀ2ν1ελέο
+ἀ2ν1ελέο
+ἀ2ν1ελέω
+ἀ2ν1ελέω
+ἀ2ν1έλεε
+ἀ2ν1έλεε
+ἀ2ν1ελκή
+ἀ2ν1ελκή
+ἀ2ν1ελκὴ
+ἀ2ν1ελκο
+ἀ2ν1ελκῆ
+ἀ2ν1ελκές.
+ἀ2ν1ελκές.
+ἀ2ν1ελκὲς.
+ἀ2ν1ελκέσ.
+ἀ2ν1ελκέσ.
+ἀ2ν1ελκὲσ.
+ἀ2ν1ελκε
+ἀ2ν1ελκῶ
+ἀ2ν1ελκέσ
+ἀ2ν1ελκέσ
+ἄ2ν1ελκτ
+ἀ2ν1έλκτ
+ἀ2ν1έλκτ
+ἀ2ν1έλκω
+ἀ2ν1έλκω
+ἀ2ν1ελκώ
+ἀ2ν1ελκώ
+ἀ2ν1έλλ
+ἀ2ν1έλλ
+ἀ2ν1έλπι
+ἀ2ν1έλπι
+ἀ2ν1ελπί
+ἀ2ν1ελπί
+ἀ2ν1έλυτρ
+ἀ2ν1έλυτρ
+ἀ2ν1ελύτρ
+ἀ2ν1ελύτρ
+ἀ2ν1έμβ
+ἀ2ν1έμβ
+ἀ2ν1εμβ
+ἀ2ν1έμετ
+ἀ2ν1έμετ
+ἀ2ν1εμέτ
+ἀ2ν1εμέτ
+ἀ2ν1έμπ
+ἀ2ν1έμπ
+ἀ2ν1εμπ
+ἀ2ν1έμφ
+ἀ2ν1έμφ
+ἀ2ν1εμφ
+ἀ2ν1έν
+ἀ2ν1έν
+ἀ2ν1εν
+ἀ3ν2ένει
+ἀ3ν2ένει
+ἀ3ν2ενή
+ἀ3ν2ενή
+ἀ3ν2έντες.
+ἀ3ν2έντες.
+ἀ3ν2έντεσ.
+ἀ3ν2έντεσ.
+ἀ2ν1ε2ξ1
+ἀ3ν2ε3ξ2ίκα
+ἀ3ν2ε3ξ2ίκα
+ἀ3ν2ε3ξ2ικά
+ἀ3ν2ε3ξ2ικά
+ἀ2ν1έορ
+ἀ2ν1έορ
+ἀ2ν1εόρ
+ἀ2ν1εόρ
+ἀ2ν1επ
+ἀ3ν2επν
+ἀ3ν2επτ
+ἀ2ν1εραστ
+ἀ2ν1έραστ
+ἀ2ν1έραστ
+ἀ2ν1εράστ
+ἀ2ν1εράστ
+ἀ2ν1εργ
+ἄ2ν1εργ
+ἀ2ν1έργ
+ἀ2ν1έργ
+ἀ2ν1έρεικ
+ἀ2ν1έρεικ
+ἀ2ν1ερείκ
+ἀ2ν1ερείκ
+ἀ2ν1έρεισ
+ἀ2ν1έρεισ
+ἀ2ν1ερείσ
+ἀ2ν1ερείσ
+ἀ2ν1ερεύνητ
+ἀ2ν1ερεύνητ
+ἀ2ν1ερευνήτ
+ἀ2ν1ερευνήτ
+ἀ2ν1ερί
+ἀ2ν1ερί
+ἀ2ν1ερι
+ἀ2ν1ερυθρίαστ
+ἀ2ν1ερυθρίαστ
+ἀ2ν1ερυθριάστ
+ἀ2ν1ερυθριάστ
+ἀ2ν1έστι
+ἀ2ν1έστι
+ἀ2ν1εστί
+ἀ2ν1εστί
+ἀ2ν1έται
+ἀ2ν1έται
+ἀ2ν1εταί
+ἀ2ν1εταί
+ἀ2ν1έτοι
+ἀ2ν1έτοι
+ἀ2ν1ετοί
+ἀ2ν1ετοί
+ἀ2ν1ετυ
+ἀ2ν1έτυ
+ἀ2ν1έτυ
+ἀ2ν1ετύ
+ἀ2ν1ετύ
+ἀ2ν1εύθ
+ἀ2ν1εύθ
+ἀ2ν1ευθ
+ἄ2ν1ευκ
+ἀ2ν1εύκ
+ἀ2ν1εύκ
+ἀ2ν1ευλ
+ἀ2ν1εύρετ
+ἀ2ν1εύρετ
+ἀ2ν1ευρέτ
+ἀ2ν1ευρέτ
+ἀ2ν1ευφήμητ
+ἀ2ν1ευφήμητ
+ἀ2ν1ευφημήτ
+ἀ2ν1ευφημήτ
+ἀ2ν1εύχ
+ἀ2ν1εύχ
+ἀ2ν1ευχ
+ἀ2ν1εύξ
+ἀ2ν1εύξ
+ἀ2ν1ευξ
+ἀ2ν1ηυξ
+ἀ2ν1ηῦγ
+ἀ2ν1ηυγ
+ἀ2ν1ευκτ
+ἀ2ν1έφ
+ἀ2ν1έφ
+ἀ2ν1εφ
+ἀ3ν2εφάλ
+ἀ3ν2εφάλ
+ἀ3ν2έφελ
+ἀ3ν2έφελ
+ἀ3ν2εφέλ
+ἀ3ν2εφέλ
+ἀ2ν1εχέ
+ἀ2ν1εχέ
+ἀ2ν1εχε
+ἀ2ν1έψα
+ἀ2ν1έψα
+ἀ2ν1εψά
+ἀ2ν1εψά
+ἀ2ν1ηγεμ
+ἀ2ν1ήδ
+ἀ2ν1ήδ
+ἀ2ν1ηδ
+ἀ2ν1ήκεσ
+ἀ2ν1ήκεσ
+ἀ2ν1ηκέσ
+ἀ2ν1ηκέσ
+ἀ2ν1ήκο
+ἀ2ν1ήκο
+ἀ2ν1ηκό
+ἀ2ν1ηκό
+ἀ2ν1ηκο
+ἀ2ν1ηλάκ
+ἀ2ν1ηλάκ
+ἀ2ν1ηλακ
+ἀ2ν1ήλατος.
+ἀ2ν1ήλατος.
+ἀ2ν1ήλατοσ.
+ἀ2ν1ήλατοσ.
+ἀ2ν1ηλάτου
+ἀ2ν1ηλάτου
+ἀ2ν1ηλάτω
+ἀ2ν1ηλάτω
+ἀ2ν1ήλατον.
+ἀ2ν1ήλατον.
+ἀ2ν1ήλατε.
+ἀ2ν1ήλατε.
+ἀ2ν1ηλάτοι
+ἀ2ν1ηλάτοι
+ἀ2ν1ήλατοι
+ἀ2ν1ήλατοι
+ἀ2ν1ήλατα
+ἀ2ν1ήλατα
+ἀ2ν1ηλεγ
+ἀ2ν1ηλεή
+ἀ2ν1ηλεή
+ἀ2ν1ηλεὴ
+ἀ2ν1ηλεο
+ἀ2ν1ηλεε
+ἀ2ν1ηλεῶ
+ἀ2ν1ηλεέ
+ἀ2ν1ηλεέ
+ἀ2ν1ηλεὲ
+ἀ2ν1ηλεῆ
+ἀ2ν1ηλέη
+ἀ2ν1ηλέη
+ἀ2ν1ήλειπ
+ἀ2ν1ήλειπ
+ἀ2ν1ηλείπ
+ἀ2ν1ηλείπ
+ἀ2ν1ηλή
+ἀ2ν1ηλή
+ἀ2ν1ηλὴ
+ἀ2ν1ηλοῦ
+ἀ2ν1ηλεῖ
+ἀ2ν1ηλῆ
+ἀ2ν1ηλέ
+ἀ2ν1ηλέ
+ἀ2ν1ηλὲ
+ἀ2ν1ηλοῖ
+ἀ2ν1ηλῶ
+ἀ2ν1ήλικ
+ἀ2ν1ήλικ
+ἀ2ν1ηλίκ
+ἀ2ν1ηλίκ
+ἀ2ν1ήλιο
+ἀ2ν1ήλιο
+ἀ2ν1ηλίο
+ἀ2ν1ηλίο
+ἀ2ν1ηλίω
+ἀ2ν1ηλίω
+ἀ2ν1ήλια
+ἀ2ν1ήλια
+ἀ2ν1ήλιπ
+ἀ2ν1ήλιπ
+ἀ2ν1ηλίπ
+ἀ2ν1ηλίπ
+ἀ2ν1ηλιφ
+ἀ2ν1ήμ
+ἀ2ν1ήμ
+ἀ2ν1ημ
+ἀ2ν1ήνυ
+ἀ2ν1ήνυ
+ἀ2ν1ηνύ
+ἀ2ν1ηνύ
+ἀ2ν1ήρει
+ἀ2ν1ήρει
+ἀ2ν1ηρεί
+ἀ2ν1ηρεί
+ἀ2ν1ηρέμ
+ἀ2ν1ηρέμ
+ἀ2ν1ηρεμ
+ἀ2ν1ηρεφ
+ἀ2ν1ήρι
+ἀ2ν1ήρι
+ἀ2ν1ηρί
+ἀ2ν1ηρί
+ἀ2ν1ήροτ
+ἀ2ν1ήροτ
+ἀ2ν1ηρότ
+ἀ2ν1ηρότ
+ἀ2ν1ήσσ
+ἀ2ν1ήσσ
+ἀ2ν1ησσ
+ἀ2ν1ήττ
+ἀ2ν1ήττ
+ἀ2ν1ηττ
+ἀ2ν1ήφα
+ἀ2ν1ήφα
+ἀ2ν1ηφα
+ἀ2ν1ίατ
+ἀ2ν1ίατ
+ἀ2ν1ιάτ
+ἀ2ν1ιάτ
+ἀ2ν1ίδιο
+ἀ2ν1ίδιο
+ἀ2ν1ιδίο
+ἀ2ν1ιδίο
+ἀ2ν1ιδίω
+ἀ2ν1ιδίω
+ἀ2ν1ίδια
+ἀ2ν1ίδια
+ἀ2ν1ιδιτ
+ἄ2ν1ιδρος
+ἄ2ν1ιδροσ
+ἀ2ν1ίδρου
+ἀ2ν1ίδρου
+ἀ2ν1ίδρω
+ἀ2ν1ίδρω
+ἄ2ν1ιδρον
+ἄ2ν1ιδρε
+ἀ2ν1ίδροι
+ἀ2ν1ίδροι
+ἄ2ν1ιδροι
+ἀ2ν1ίδρυτ
+ἀ2ν1ίδρυτ
+ἀ2ν1ιδρύτ
+ἀ2ν1ιδρύτ
+ἀ2ν1ιδρωτ
+ἀ2ν1ιδρώτ
+ἀ2ν1ιδρώτ
+ἀ2ν1ίερ
+ἀ2ν1ίερ
+ἀ2ν1ιέρ
+ἀ2ν1ιέρ
+ἀ2ν1ιεράτ
+ἀ2ν1ιεράτ
+ἀ3ν2ιέρω
+ἀ3ν2ιέρω
+ἀ2ν1ίκ
+ἀ2ν1ίκ
+ἀ2ν1ικ
+ἄ2ν1ικ
+ἀ3ν2ίκη
+ἀ3ν2ίκη
+ἀ3ν2ική
+ἀ3ν2ική
+ἀ2ν1ίλ
+ἀ2ν1ίλ
+ἀ2ν1ιλ
+ἀ2ν1ίμαστ
+ἀ2ν1ίμαστ
+ἀ2ν1ιμάστ
+ἀ2ν1ιμάστ
+ἀ2ν1ίου
+ἀ2ν1ίου
+ἀ2ν1ιού
+ἀ2ν1ιού
+ἄ2ν1ιππ
+ἀ2ν1ίππ
+ἀ2ν1ίππ
+ἀ2ν1ισ
+ἄ2ν1ισ
+ἀ2ν1ίσ
+ἀ2ν1ίσ
+ἀ3ν2ισᾶτ
+ἀ3ν2ισάτ
+ἀ3ν2ισάτ
+ἀ3ν2ίστ
+ἀ3ν2ίστ
+ἀ3ν2ιστ
+ἀ4ν3ιστορη
+ἀ4ν3ιστόρη
+ἀ4ν3ιστόρη
+ἀ4ν3ιστορή
+ἀ4ν3ιστορή
+ἀ3ν2ίσχ
+ἀ3ν2ίσχ
+ἀ4ν3ίσχυ
+ἀ4ν3ίσχυ
+ἄ2ν1ιχ
+ἀ2ν1ίχ
+ἀ2ν1ίχ
+ἀ2ν1ιχνεύτ
+ἀ2ν1ιχνεύτ
+ἀ2ν1ίψ
+ἀ2ν1ίψ
+ἀ2ν1ιψ
+ἀ2ν1όδε
+ἀ2ν1όδε
+ἀ2ν1οδέ
+ἀ2ν1οδέ
+ἄ2ν1οζ
+ἀ2ν1όζ
+ἀ2ν1όζ
+ἀ2ν1οικε
+ἀ2ν1οικον
+ἄ2ν1οικ
+ἀ2ν1οίκ
+ἀ2ν1οίκ
+ἀ2ν1οικτί
+ἀ2ν1οικτί
+ἄ2ν1οικτ
+ἀ2ν1οίκτ
+ἀ2ν1οίκτ
+ἀ2ν1οίμωκ
+ἀ2ν1οίμωκ
+ἀ2ν1οιμώκ
+ἀ2ν1οιμώκ
+ἀ2ν1οιμωκ
+ἀ2ν1οιν
+ἄ2ν1οιν
+ἀ2ν1οίν
+ἀ2ν1οίν
+ἄ2ν1οιστρ
+ἀ2ν1οίστρ
+ἀ2ν1οίστρ
+ἀ2ν1όλ
+ἀ2ν1όλ
+ἀ2ν1ολ
+ἄ2ν1ολ
+ἀ3ν2ολκ
+ἀ3ν2ολο
+ἀ2ν1ομβρί
+ἀ2ν1ομβρί
+ἀ2ν1ομβρῖ
+ἄ2ν1ομβρο
+ἀ2ν1όμβρο
+ἀ2ν1όμβρο
+ἀ2ν1όμβρω
+ἀ2ν1όμβρω
+ἄ2ν1ομβρα
+ἀ2ν1ομήλ
+ἀ2ν1ομήλ
+ἀ2ν1ομηλ
+ἀ2ν1ομίλ
+ἀ2ν1ομίλ
+ἀ2ν1ομιλ
+ἀ2ν1όμιχ
+ἀ2ν1όμιχ
+ἀ2ν1ομιχ
+ἀ2ν1όμο
+ἀ2ν1όμο
+ἀ2ν1ομό
+ἀ2ν1ομό
+ἀ2ν1ομο
+ἀ3ν2ομοθ
+ἀ3ν2όμου.
+ἀ3ν2όμου.
+ἀ3ν2όμῳ.
+ἀ3ν2όμῳ.
+ἀ3ν2όμω.
+ἀ3ν2όμω.
+ἀ2ν2όμοιν.
+ἀ2ν2όμοιν.
+ἀ3ν2όμων.
+ἀ3ν2όμων.
+ἀ3ν2όμοις.
+ἀ3ν2όμοις.
+ἀ3ν2όμοισ.
+ἀ3ν2όμοισ.
+ἀ3ν2όμους.
+ἀ3ν2όμους.
+ἀ3ν2όμουσ.
+ἀ3ν2όμουσ.
+ἀ2ν1όν
+ἀ2ν1όν
+ἀ2ν1ον
+ἄ2ν1οπ
+ἀ2ν1όπ
+ἀ2ν1όπ
+ἀ2ν1όρ
+ἀ2ν1όρ
+ἀ2ν1ορ
+ἄ2ν1ορ
+ἀ3ν2οργάζ
+ἀ3ν2οργάζ
+ἄ3ν2ορθ
+ἀ3ν2όρθ
+ἀ3ν2όρθ
+ἀ3ν2ορμά
+ἀ3ν2ορμά
+ἀ3ν2ορτ
+ἀ3ν2ορύ
+ἀ3ν2ορύ
+ἀ2ν1όσι
+ἀ2ν1όσι
+ἀ2ν1οσί
+ἀ2ν1οσί
+ἀ2ν1οσι
+ἄ2ν1οσμ
+ἀ2ν1όσμ
+ἀ2ν1όσμ
+ἀ2ν1όσφρ
+ἀ2ν1όσφρ
+ἀ2ν1οσφρ
+ἀ2ν1ούα
+ἀ2ν1ούα
+ἀ2ν1ουά
+ἀ2ν1ουά
+ἀ2ν1ούσι
+ἀ2ν1ούσι
+ἀ2ν1ουσί
+ἀ2ν1ουσί
+ἀ2ν1ούτ
+ἀ2ν1ούτ
+ἀ2ν1ουτ
+ἀ2ν1οφθ
+ἀ2ν1όχευτ
+ἀ2ν1όχευτ
+ἀ2ν1οχεύτ
+ἀ2ν1οχεύτ
+ἄ2ν1οχλ
+ἀ2ν1όχλ
+ἀ2ν1όχλ
+ἀ2ν1οψ
+ἄ2ν1οψ
+ἀ2ν1όψ
+ἀ2ν1όψ
+ἀντα2ν1ισ
+ἀντα2ν1ίσ
+ἀντα2ν1ίσ
+ἀντει2σ1
+ἀντε2κ1
+ἀντε2ν1
+ἀντε2ξ1
+ἀντιδυ2σ1
+ἀντιπαρε2κ1
+ἀντιπαρε2ξ1
+ἀντιπρο2σ1
+ἀντιπροσ3κ2υ
+ἀντισύ2ν1
+ἀντισύ2ν1
+ἀντισυ2ν1
+ἀ2ν1ύ
+ἀ2ν1ύ
+ἀ2ν1υ
+ἀ3ν2υμ
+ἀ3ν2ύσ
+ἀ3ν2ύσ
+ἀ3ν2υσ
+ἀ2ν1υπέ2ρ1
+ἀ2ν1υπέ2ρ1
+ἀ2ν1υπε2ρ1
+ἄ2ν1ῳδ
+ἀ2ν1ῴδ
+ἀ2ν1ώδυ
+ἀ2ν1ώδυ
+ἀ2ν1ωδύ
+ἀ2ν1ώι
+ἀ2ν1ώι
+ἀ2ν1ωί
+ἀ2ν1ωί
+ἀ2ν1ώλ
+ἀ2ν1ώλ
+ἀ2ν1ωλ
+ἀ2ν1ώμ
+ἀ2ν1ώμ
+ἀ2ν1ωμ
+ἀ2ν1ών
+ἀ2ν1ών
+ἀ2ν1ων
+ἀ2ν1ωρ
+ἄ2ν1ωρ
+ἀ2ν1ώρ
+ἀ2ν1ώρ
+ἄ2ν1ωτο
+ἀ2ν1ώτο
+ἀ2ν1ώτο
+ἀ2ν1ωφέλ
+ἀ2ν1ωφέλ
+ἀ2ν1ωφελ
+ἀ2ν1ώχυ
+ἀ2ν1ώχυ
+ἀ2ν1ωχύ
+ἀ2ν1ωχύ
+ἀπα2ν1αι
+ἀπά2ν1ου
+ἀπά2ν1ου
+ἀπα2ν1ούρ
+ἀπα2ν1ούρ
+ἁπα2ξ1
+ἀπε2κ1λ
+ἁπε2ρ1
+ἀποσυ2ν1
+ἀπρό2σ1
+ἀπρό2σ1
+ἀπρο2σ1
+ἀπρό3σ2κε
+ἀπρό3σ2κε
+ἀπρο3σ2κέ
+ἀπρο3σ2κέ
+ἀπρό3σ2κο
+ἀπρό3σ2κο
+ἀπρο3σ2κό
+ἀπρο3σ2κό
+ἀπρο3σ2τ
+ἁρπα2ξ1
+ἀρρε2ν1ω
+ἀρχισυ2ν1
+ἀστε2ρ1ω
+ἀσύ2ν1
+ἀσύ2ν1
+ἀσυ2ν1
+ἀξύ2ν1
+ἀξύ2ν1
+ἀξυ2ν1
+αὐτέ2κ1μ
+αὐτέ2κ1μ
+αὐτε2κ1μ
+αὐτε2ξ1
+ἀω2σ1φ
+.γερα2σ1φ
+.δα2σ1π
+.διαμφι2σ1β
+.διέ2κ1ρο
+.διέ2κ1ρο
+.διε2κ1ρό
+.διε2κ1ρό
+.διέ2ξ1
+.διέ2ξ1
+.διε2ξ1
+.δικα2σ1π
+.διό2σ1κ
+.διό2σ1κ
+.διο2σ1κ
+.διό2σ1π
+.διό2σ1π
+.διο2σ1π
+.δί2σ1α
+.δί2σ1α
+.δι2σ1ά
+.δι2σ1ά
+.δί2σ1η
+.δί2σ1η
+.δι2σ1ή
+.δι2σ1ή
+.δί2σ1ε
+.δί2σ1ε
+.δι2σ1ε
+.δι2σ1θ
+.δύ2σ1
+.δύ2σ1
+.δυ2σ1
+δύ3σ2ω.
+δύ3σ2ω.
+δύ3σ2εις.
+δύ3σ2εις.
+δύ3σ2εισ.
+δύ3σ2εισ.
+δύ3σ2ει.
+δύ3σ2ει.
+.δύ3σ2ετ
+.δύ3σ2ετ
+δύ3σ2ομεν.
+δύ3σ2ομεν.
+δύ3σ2ουσιν.
+δύ3σ2ουσιν.
+δύ3σ2οιμι.
+δύ3σ2οιμι.
+δύ3σ2οις.
+δύ3σ2οις.
+δύ3σ2οισ.
+δύ3σ2οισ.
+δύ3σ2οι.
+δύ3σ2οι.
+δύ3σ2οιτον.
+δύ3σ2οιτον.
+δυ3σ2οίτην.
+δυ3σ2οίτην.
+δύ3σ2οιμεν.
+δύ3σ2οιμεν.
+δύ3σ2οιτε.
+δύ3σ2οιτε.
+δύ3σ2οιεν.
+δύ3σ2οιεν.
+δύ3σ2ειν.
+δύ3σ2ειν.
+δύ3σ2ων.
+δύ3σ2ων.
+δύ3σ2ον
+δύ3σ2ον
+δυ3σ2όν
+δυ3σ2όν
+δύ3σ2ουσ
+δύ3σ2ουσ
+δυ3σ2ούσ
+δυ3σ2ούσ
+δύ3σ2ῃ
+δύ3σ2ῃ
+δύ3σ2ητον.
+δύ3σ2ητον.
+δύ3σ2ωμεν.
+δύ3σ2ωμεν.
+δύ3σ2ωσι.
+δύ3σ2ωσι.
+δύ3σ2αιμι.
+δύ3σ2αιμι.
+δύ3σ2αις.
+δύ3σ2αις.
+δύ3σ2ειας.
+δύ3σ2ειας.
+δύ3σ2αισ.
+δύ3σ2αισ.
+δύ3σ2ειασ.
+δύ3σ2ειασ.
+δύ3σ2αι.
+δύ3σ2αι.
+δύ3σ2ειε.
+δύ3σ2ειε.
+δύ3σ2αιτον.
+δύ3σ2αιτον.
+δυ3σ2αίτην.
+δυ3σ2αίτην.
+δύ3σ2αιμεν.
+δύ3σ2αιμεν.
+δύ3σ2αιτε.
+δύ3σ2αιτε.
+δύ3σ2αιεν
+δύ3σ2αιεν
+δύ3σ2ειαν.
+δύ3σ2ειαν.
+δύ3σ2ον.
+δύ3σ2ον.
+δυ3σ2άτω.
+δυ3σ2άτω.
+δύ3σ2ατον.
+δύ3σ2ατον.
+δυ3σ2άτων.
+δυ3σ2άτων.
+δύ3σ2ατε.
+δύ3σ2ατε.
+δυ3σ2άντων.
+δυ3σ2άντων.
+δύ3σ2ας.
+δύ3σ2ας.
+δύ3σ2αν.
+δύ3σ2αν.
+δύ3σ2αντ
+δύ3σ2αντ
+δυ3σ2άντ
+δυ3σ2άντ
+δύ3σ2ασ
+δύ3σ2ασ
+δυ3σ2άσ
+δυ3σ2άσ
+δύ3σ2ομαι.
+δύ3σ2ομαι.
+.δύ3σ2εσ
+.δύ3σ2εσ
+δυ3σ2όμεθα.
+δυ3σ2όμεθα.
+δύ3σ2ονται.
+δύ3σ2ονται.
+δυ3σ2οίμην.
+δυ3σ2οίμην.
+δύ3σ2οιο.
+δύ3σ2οιο.
+δύ3σ2οιτο.
+δύ3σ2οιτο.
+δύ3σ2οισθον.
+δύ3σ2οισθον.
+δυ3σ2οίσθην.
+δυ3σ2οίσθην.
+δυ3σ2οίμεθα.
+δυ3σ2οίμεθα.
+δύ3σ2οισθε.
+δύ3σ2οισθε.
+δύ3σ2οιντο.
+δύ3σ2οιντο.
+δύ3σ2εσθαι.
+δύ3σ2εσθαι.
+.δυ3σ2όμεν
+.δυ3σ2όμεν
+.δυ3σ2ομέν
+.δυ3σ2ομέν
+δύ3σ2ωμαι.
+δύ3σ2ωμαι.
+δύ3σ2ηται.
+δύ3σ2ηται.
+δυ3σ2ώμεθα
+δυ3σ2ώμεθα
+δύ3σ2ησθε.
+δύ3σ2ησθε.
+δυ3σ2αίμην.
+δυ3σ2αίμην.
+δύ3σ2αιο.
+δύ3σ2αιο.
+δύ3σ2αιτο.
+δύ3σ2αιτο.
+δύ3σ2αισθον.
+δύ3σ2αισθον.
+δυ3σ2αίσθην.
+δυ3σ2αίσθην.
+δυ3σ2αίμεθα.
+δυ3σ2αίμεθα.
+δύ3σ2αισθαι.
+δύ3σ2αισθαι.
+δύ3σ2αιντο.
+δύ3σ2αιντο.
+δυ3σ2άσθω.
+δυ3σ2άσθω.
+δύ3σ2ασθον.
+δύ3σ2ασθον.
+δυ3σ2άσθων.
+δυ3σ2άσθων.
+δύ3σ2ασθε.
+δύ3σ2ασθε.
+δύ3σ2ασθαι.
+δύ3σ2ασθαι.
+δυ3σ2άμεν
+δυ3σ2άμεν
+δυσ3σ2αμέν
+δυσ3σ2αμέν
+δύ3σ2ατο.
+δύ3σ2ατο.
+δύ3σ2ετο.
+δύ3σ2ετο.
+δύ3σ2αντο.
+δύ3σ2αντο.
+δύ3σ2εο.
+δύ3σ2εο.
+.δυσεί2σ1β
+.δυσεί2σ1β
+.δυσει2σ1β
+.δυσέ2κ1
+.δυσέ2κ1
+.δυσε2κ1
+.δυσέ2ξ1
+.δυσέ2ξ1
+.δυσε2ξ1
+.δυ3σ2ιθ
+δύ3σ2ις.
+δύ3σ2ις.
+δύ3σ2ισ.
+δύ3σ2ισ.
+δύ3σ2εω
+δύ3σ2εω
+δύ3σ2ιν.
+δύ3σ2ιν.
+δύ3σ2ι.
+δύ3σ2ι.
+δυ3σ2έοιν.
+δυ3σ2έοιν.
+δύ3σ2εσι.
+δύ3σ2εσι.
+δύ3σ2εσιν.
+δύ3σ2εσιν.
+.δύ3σ2κε
+.δύ3σ2κε
+.δυ3σ2μή.
+.δυ3σ2μή.
+.δυ3σ2μὴ.
+.δυ3σ2μῆς.
+.δυ3σ2μῆσ.
+.δυ3σ2μῇ
+.δυ3σ2μῆ.
+.δυ3σ2μᾶ
+.δυ3σ2μα
+.δυ3σ2μῶ
+.δυσξύ2ν1
+.δυσξύ2ν1
+.δυσξυ2ν1
+.δύ3σ2ταν
+.δύ3σ2ταν
+.δυ3σ2τάν
+.δυ3σ2τάν
+.δυ3σ2την
+.δυ3σ2τήν
+.δυ3σ2τήν
+ἐδυ2σ1τ
+εἰ2ν1όδ
+εἰ2ν1όδ
+εἰ2ν1οδ
+εἰ2σ1
+εἴ2σ1
+εἰ3σ2ί.
+εἰ3σ2ί.
+εἰ3σ2ὶ.
+εἰ3σ2ι.
+εἰ3σ2ίν.
+εἰ3σ2ίν.
+εἰ3σ2ὶν.
+εἰ3σ2ιν.
+εἴ3σ2ομ
+εἴ3σ2ῃ.
+εἴσει.
+εἴ3σ2εται.
+εἴ3σ2εσθον.
+εἰ3σ2όμ
+εἰ3σ2όμ
+εἴ3σ2εσθε.
+εἴ3σ2ονται
+εἰ3σ2οίμην
+εἰ3σ2οίμην
+εἴ3σ2οιο
+εἴ3σ2οιτο
+εἴ3σ2οισθον
+εἰ3σ2οίσθην
+εἰ3σ2οίσθην
+εἰ3σ2οίμεθα
+εἰ3σ2οίμεθα
+εἴ3σ2οισθε
+εἴ3σ2οιντο
+εἴ3σ2εσθαι
+εἰ3σ2όμεν
+εἰ3σ2όμεν
+εἰ3σ2ομέν
+εἰ3σ2ομέν
+εἴ3σ2άμην.
+εἴ3σ2άμην.
+εἴ3σ2ω
+εἴ3σ2ατο
+εἴ3σ2ασθον
+εἰ3σ2άσθην
+εἰ3σ2άσθην
+εἰ3σ2άμεθα
+εἰ3σ2άμεθα
+εἴ3σ2ασθε
+εἴ3σ2αντο
+εἴ3σ2ωμαι
+εἴ3σ2ησθον
+εἰ3σ2ώμεθα
+εἰ3σ2ώμεθα
+εἴ3σ2ησθε
+εἴ3σ2ωνται
+εἰ3σ2αίμην
+εἰ3σ2αίμην
+εἴ3σ2αιο
+εἴ3σ2αιτο
+εἴ3σ2αισθον
+εἴ3σ2αίσθην
+εἴ3σ2αίσθην
+εἰ3σ2αίμεθα
+εἰ3σ2αίμεθα
+εἴ3σ2αισθε
+εἴ3σ2αιντο
+εἰ3σ2άσθω
+εἰ3σ2άσθω
+εἰ3σ2άσθων
+εἰ3σ2άσθων
+εἴ3σ2ασθαι
+εἰ3σ2άμεν
+εἰ3σ2άμεν
+εἰ3σ2αμέν
+εἰ3σ2αμέν
+ἐ2κ1λ
+ἐ3κ2λήθη
+ἐ3κ2λήθη
+ἐ3κ2λάζ
+ἐ3κ2λάζ
+ἐ3κ2λάγ
+ἐ3κ2λάγ
+ἐ3κ2λάο
+ἐ3κ2λάο
+ἐ3κ2λάσ
+ἐ3κ2λάσ
+ἐ3κ2λαί
+ἐ3κ2λαί
+ἐ3κ2λαύ
+ἐ3κ2λαύ
+ἐ3κ2λεί
+ἐ3κ2λεί
+ἐ4κ3λείπ
+ἐ4κ3λείπ
+ἐ4κ3λείψ
+ἐ4κ3λείψ
+ἐ3κ2λῄ
+ἐ3κ2κλέπ
+ἐ3κ2κλέπ
+ἐ3κ2κλέψ
+ἐ3κ2κλέψ
+ἐ3κ2λάπ
+ἐ3κ2λάπ
+ἐ3κ2λαπ
+ἐ4κ3λάπτ
+ἐ4κ3λάπτ
+ἐ4κ3λαπτ
+ἐ3κ2λέφ
+ἐ3κ2λέφ
+ἐ3κ2λεφ
+ἐ3κ2λήρ
+ἐ3κ2λήρ
+ἐ3κ2ληρ
+ἐ3κ2λίν
+ἐ3κ2λίν
+ἐ3κ2λιν
+ἐ3κ2λύ
+ἐ3κ2λύ
+ἐ4κ3λύσεω
+ἐ4κ3λύσεω
+ἐ4κ3λύσει
+ἐ4κ3λύσει
+ἐ4κ3λύσεοι
+ἐ4κ3λύσεοι
+ἐ4κ3λύσεσι
+ἐ4κ3λύσεσι
+ἐ3κ2λόμ
+ἐ3κ2λόμ
+ἐ3κ2κλώσ
+ἐ3κ2κλώσ
+ἔ2κ1λει
+ἔ3κ2λεισ
+ἔ2κ1λυσ
+ἐ2κ1μ
+ἔ2κ1μ
+ἐ2κ1ν
+ἔ2κ1ν
+ἔ3κ2ναι
+ἐ3κ2ναί
+ἐ3κ2ναί
+ἔ3κ2νησ
+ἐ3κ2νήσ
+ἐ3κ2νήσ
+ἐ3κ2νυ
+ἐ2κ1ρ
+ἔ2κ1ρ
+ἐ3κ2ράδ
+ἐ3κ2ράδ
+ἐ3κ2ραδ
+ἔ3κ2ραζ
+ἐ3κ2ράζ
+ἐ3κ2ράζ
+ἔ3κ2ραγ
+ἐ3κ2ράγ
+ἐ3κ2ράγ
+ἐ3κ2ράτ
+ἐ3κ2ράτ
+ἐ3κ2ρατ
+ἐ3κ2ραύγ
+ἐ3κ2ραύγ
+ἐ3κ2ραυγ
+ἔ3κ2ραι
+ἐ3κ2ραί
+ἐ3κ2ραί
+ἔ3κ2ραν
+ἐ3κ2ράν
+ἐ3κ2ράν
+ἐ3κ2ρήη
+ἐ3κ2ρήη
+ἐ3κ2ράα
+ἐ3κ2ράα
+ἐ3κ2ραά
+ἐ3κ2ραά
+ἐ3κ2ράθ
+ἐ3κ2ράθ
+ἐ3κ2ραθ
+ἔ3κ2ρεκ
+ἐ3κ2ρέκ
+ἐ3κ2ρέκ
+ἔ3κ2ρεξ
+ἐ3κ2ρέξ
+ἐ3κ2ρέξ
+ἐ3κ2ρέμ
+ἐ3κ2ρέμ
+ἐ3κ2ρεμ
+ἐ3κ2ρήμ
+ἐ3κ2ρήμ
+ἐ3κ2ρημ
+ἔ3κ2ριν
+ἐ3κ2ρίν
+ἐ3κ2ρίν
+ἐ3κ2ρίθ
+ἐ3κ2ρίθ
+ἐ3κ2ρότ
+ἐ3κ2ρότ
+ἐ3κ2ροτ
+ἔ3κ2ρου
+ἐ3κ2ρού
+ἐ3κ2ρού
+ἔ3κ2ρυπ
+ἐ3κ2ρύπ
+ἐ3κ2ρύπ
+ἔ3κ2ρυψ
+ἐ3κ2ρύψ
+ἐ3κ2ρύψ
+ἐ3κ2ρύβ
+ἐ3κ2ρύβ
+ἐ3κ2ρύφ
+ἐ3κ2ρύφ
+ἐ3κ2ρυσ
+ἔ3κ2ρωζ
+ἐ3κ2ρώζ
+ἐ3κ2ρώζ
+ἔ3κ2ρωξ
+ἐ3κ2ρώξ
+ἐ3κ2ρώξ
+ἐ2κ1ταθ
+ἔ2κ1ταμε.
+ἐ2κ1τάμν
+ἐ2κ1τάμν
+ἐ2κ1ταν
+ἐ2κ1ταρ
+ἐ2κ1τάσ
+ἐ2κ1τάσ
+ἐ2κ1τε
+ἐ2κ1τέ
+ἐ2κ1τέ
+ἐ3κ2τείν
+ἐ3κ2τείν
+ἐ2κ1τήκ
+ἐ2κ1τήκ
+ἐ2κ1τι
+ἔ2κ1τι
+ἐ2κ1τί
+ἐ2κ1τί
+ἔ3κ2τιζ
+ἐ3κ2τίζ
+ἐ3κ2τίζ
+ἔ3κ2τισα
+ἐ3κ2τίσα
+ἐ3κ2τίσα
+ἐ2κ1τό
+ἐ2κ1τό
+ἐ2κ1το
+ἔ2κ1το
+ἐ3κ2τός.
+ἐ3κ2τός.
+ἐ3κ2τὸς.
+ἐ3κ2τόσ.
+ἐ3κ2τόσ.
+ἐ3κ2τὸσ.
+ἐ2κ1τρ
+ἔ2κ1τυπο
+ἐ2κ1τύπου.
+ἐ2κ1τύπου.
+ἐ2κ1τύπῳ.
+ἐ2κ1τύπῳ.
+ἔ2κ1τυπε.
+ἐ2κ1τύπω.
+ἐ2κ1τύπω.
+ἐ2κτύποι.
+ἐ2κτύποι.
+ἐ2κ1τύπων.
+ἐ2κ1τύπων.
+ἐ2κ1τύποις.
+ἐ2κ1τύποις.
+ἐ2κ1τύποισ.
+ἐ2κ1τύποισ.
+ἐ2κ1τύπους.
+ἐ2κ1τύπους.
+ἐ2κ1τύπουσ.
+ἐ2κ1τύπουσ.
+ἔ2κ1τυπα.
+ἐ2κ1τυ
+ἑλλή2σ1π
+ἑλλή2σ1π
+ἑλλη2σ1π
+ἐ2ν1
+ἔ2ν1
+ἐ3ν2άκις
+ἐ3ν2άκις
+ἐ3ν2ακισ
+ἐ3ν2ακόσ
+ἐ3ν2ακόσ
+ἐ3ν2ακοσ
+ἔ3ν2αρα.
+ἐ3ν2άρων.
+ἐ3ν2άρων.
+ἐ3ν2άροις.
+ἐ3ν2άροις.
+ἐ3ν2άροισ.
+ἐ3ν2άροισ.
+ἐ3ν2αρηφ
+ἐ4ν3αραρ
+ἐ3ν2άρεε
+ἐ3ν2άρεε
+ἐ3ν2αρέω
+ἐ3ν2αρέω
+ἐ3ν2αρέα
+ἐ3ν2αρέα
+ἐ3ν2αρεά
+ἐ3ν2αρεά
+ἐ3ν2άριε
+ἐ3ν2άριε
+ἐ3ν2αρίω
+ἐ3ν2αρίω
+ἐ3ν2αρία
+ἐ3ν2αρία
+ἐ3ν2αριά
+ἐ3ν2αριά
+ἔ3ν2ασσ
+ἐ3ν2άσσ
+ἐ3ν2άσσ
+ἐ3ν2άσθ
+ἐ3ν2άσθ
+ἐ3ν2ασθ
+ἔ3ν2ατ
+ἐ3ν2άτ
+ἐ3ν2άτ
+ἐνδυ2σ1τ
+ἐ3ν2έγκ
+ἐ3ν2έγκ
+ἐ3ν2εγκ
+ἔ3ν2εικ
+ἐ3ν2εῖκ
+ἐ3ν2εικ
+ἐ3ν2είκ
+ἐ3ν2είκ
+ἔ3ν2ειμ
+ἐ3ν2είμ
+ἐ3ν2είμ
+ἐ3ν2εμέσσ
+ἐ3ν2εμέσσ
+ἐ3ν2εμήθ
+ἐ3ν2εμήθ
+ἐ3ν2ενή
+ἐ3ν2ενή
+ἐ3ν2εό
+ἐ3ν2εό
+ἐ3ν2εὸ
+ἐ3ν2εο
+ἐ3ν2εῶ
+ἐ3ν2εά
+ἐ3ν2εά
+ἐ3ν2εὰ
+ἐ3ν2εᾶ
+ἐ3ν2έπει
+ἐ3ν2έπει
+ἔ3ν2ερθε
+ἔ3ν2ευσ
+ἐ3ν2εύσ
+ἐ3ν2εύσ
+ἐ3ν2έχθ
+ἐ3ν2έχθ
+ἐ3ν2εχθ
+ἔ3ν2ησ
+ἐ3ν2ήσ
+ἐ3ν2ήσ
+ἐ3ν2ηή
+ἐ3ν2ηή
+ἐ3ν2ηὴ
+ἔ3ν2ην.
+ἐ3ν2ηεί
+ἐ3ν2ηεί
+ἐ3ν2ηο
+ἐ3ν2ηῶ
+ἐ3νηέ
+ἐ3νηέ
+ἐ3ν2ήνο
+ἐ3ν2ήνο
+ἐ3ν2ί
+ἐ3ν2ί
+ἐ3ν2ι
+ἔ3ν2ι
+ἐ4ν3ιαύ
+ἐ4ν3ιαύ
+ἐ5ν4ιαύσ
+ἐ5ν4ιαύσ
+ἐ5ν4ιαυσ
+ἐ4ν3ιδρ
+ἐ4ν3ίδρ
+ἐ4ν3ίδρ
+ἐ4ν3ίζ
+ἐ4ν3ίζ
+ἐ4ν3ίη
+ἐ4ν3ίη
+ἐ4ν3ιέτον.
+ἐ4ν3ιέτον.
+ἐ4ν3ίεμεν.
+ἐ4ν3ίεμεν.
+ἐ4ν3ίω.
+ἐ4ν3ίω.
+ἐ4ν3ιππ
+ἐ4ν3ίππ
+ἐ4ν3ίππ
+ἐ4ν3ίπτ
+ἐ4ν3ίπτ
+ἐ4ν3ίψ
+ἐ4ν3ίψ
+ἐ4ν3ίσσ
+ἐ4ν3ίσσ
+ἐ4ν3ίστ
+ἐ4ν3ίστ
+ἐ4ν3ιστ
+ἐ4ν3ισχ
+ἐ4ν3ίσχ
+ἐ4ν3ίσχ
+ἔ3ν2ος.
+ἔ3ν2οσ.
+ἔ3ν2ου.
+ἔ3ν2ον.
+ἔ3ν2ω
+ἔ3ν2οι.
+ἔ3ν2οις.
+ἔ3ν2οισ.
+ἔ3ν2ης.
+ἔ3ν2ησ.
+ἔ3ν2ῃ.
+ἔ3ν2η.
+ἔ3ν2οσι
+ἐ3ν2όσε
+ἐ3ν2όσε
+ἐ3ν2υάλ
+ἐ3ν2υάλ
+ἐ3ν2υαλ
+ἔ3ν2υξ
+ἐ3ν2υξ
+ἐ3ν2ύξ
+ἐ3ν2ύξ
+ἐ3ν2ύσ
+ἐ3ν2ύσ
+ἐ3ν2υσ
+ἐ3ν2υώ
+ἐ3ν2υώ
+ἐ3ν2υὼ
+ἐ3ν2υόο
+ἐ3ν2υόο
+ἐ3ν2υοῦς
+ἐ2ξ1
+ἔ2ξ1
+ἐ3ξ2ήρ
+ἐ3ξ2ήρ
+ἐ3ξ2ηρ
+ἐ3ξ2υ2ν1
+ἐ3ξ2υρ
+ἐ3ξ2ύρ
+ἐ3ξ2ύρ
+ἔ3ξ2υσ
+ἔ3ξ2ω.
+ἑ2ξ1ήρετμ
+ἑ2ξ1ήρετμ
+ἑ2ξ1ηρέτμ
+ἑ2ξ1ηρέτμ
+ἐπεί2σ1
+ἐπεί2σ1
+ἐπει2σ1
+ἐπεί3σ2ατον.
+ἐπεί3σ2ατον.
+ἐπει3σ2άτην.
+ἐπει3σ2άτην.
+ἐπεί3σ2αμεν.
+ἐπεί3σ2αμεν.
+ἐπεί3σ2ατε
+ἐπεί3σ2ατε
+ἐπει3σ2άμην.
+ἐπει3σ2άμην.
+ἐπεί3σ2ω.
+ἐπεί3σ2ω.
+ἐπεί3σ2ατο
+ἐπεί3σ2ατο
+ἐπεί3σ2ασθον.
+ἐπεί3σ2ασθον.
+ἐπει3σ2άμεθα.
+ἐπει3σ2άμεθα.
+ἐπεί3σ2ασθε.
+ἐπεί3σ2ασθε.
+ἐπεί3σ2αντο.
+ἐπεί3σ2αντο.
+ἐπεί3σ2θ
+ἐπεί3σ2θ
+ἐπει3σ2θ
+ἐπε2κ1τεί
+ἐπε2κ1τεί
+ἐπέ2κ1τει
+ἐπέ2κ1τει
+ἐπε2κ1τρ
+ἐπέ2κ1τρ
+ἐπέ2κ1τρ
+ἐπε2ξ1
+ἐπε2σ1β
+ἐπιπρό2σ1θ
+ἐπιπρό2σ1θ
+ἐπιπρο2σ1θ
+ἐπισυ2ν1
+ἐ2σ1
+ἐ3σ2άω
+ἐ3σ2άω
+ἐ3σ2ημ
+ἐ3σ2θ
+ἐ4σ3θέσ
+ἐ4σ3θέσ
+ἐ3σ2ιγ
+ἐ3σ2κ
+ἐ4σ3κά
+ἐ4σ3κά
+ἐ4σ3κα
+ἐ3σ2μὲν.
+ἐ3σ2μέν.
+ἐ3σ2μέν.
+ἐ3σ2τ
+ἐ3σ2όμεθα
+ἐ3σ2όμεθα
+ἐ3σ2οίμην
+ἐ3σ2οίμην
+ἐ3σ2όμ
+ἐ3σ2όμ
+ἐ3σ2ομ
+ἐ3σ2οῦ
+ἐ3σ2ού
+ἐ3σ2υ
+ἐ3σ2ύ
+ἐ3σ2ύ
+ἐσύ2ν1
+ἐσύ2ν1
+ἐσυ2ν1
+ἐ3σ2χ
+ἐ4σ3χέ
+ἐ4σ3χέ
+ἐ3σ2ώ
+ἐ3σ2ώ
+ἐ3σ2ω
+ἔ2σ1οπ
+εὐε2ξ1
+εὐε3ξ2ί
+εὐε3ξ2ί
+εὐε3ξ2ι
+εὐπρό2σ1
+εὐπρό2σ1
+εὐπρο2σ1
+εὐσύ2ν1
+εὐσύ2ν1
+εὐσυ2ν1
+εὐξύ2ν1
+εὐξύ2ν1
+εὐξυ2ν1
+ἐω2σ1φ
+ἤ2ν1οψ.
+ἤ2ν1οπ
+ἠ2ν1όπ
+ἠ2ν1όπ
+.θεμι2σ1κρ
+.θεό2σ1δ
+.θεό2σ1δ
+.θεο2σ1δ
+.θεοι2σ1εχθρ
+.θη2ρ1αγρ
+.θυο2σ1κ
+.καθυπε2ρ1
+.καλω2σ1ορ
+.καλω2σ1όρ
+.καλω2σ1όρ
+.κα2ν1είς.
+.κα2ν1είς.
+.κα2ν1εὶς.
+.κα2ν1είσ.
+.κα2ν1είσ.
+.κα2ν1εὶσ.
+.κα2ν1εν
+.κα2ν1έν
+.κα2ν1έν
+.καταδυ2σ1ωπ
+.κατεδυ2σ1ώπ
+.κατεδυ2σ1ώπ
+.κατει2σ1
+.κατε2ν1αί
+.κατε2ν1αί
+.κατε2ν1ή
+.κατε2ν1ή
+.κατε2ξ1α2ν1ί
+.κατε2ξ1α2ν1ί
+.κατε2ξ1α2ν1έσ
+.κατε2ξ1α2ν1έσ
+.κερα2σ1φ
+.κρά2σ1π
+.κρά2σ1π
+.κρα2σ1π
+.κυνό2σ1α
+.κυνό2σ1α
+.κυνό2σ1β
+.κυνό2σ1β
+.κυνο2σ1β
+.κυνό2σ1ο
+.κυνό2σ1ο
+.κυνο2σ1ο
+.κυνο2σ1φ
+.μελα2ν1άγ
+.μελα2ν1άγ
+.μελα2ν1αγ
+.μελα2ν1άε
+.μελα2ν1άε
+.μελα2ν1αέ
+.μελα2ν1αέ
+.μελα2ν1αθ
+.μελα2ν1αιγ
+.μελα2ν1αυγ
+.μελα2ν1είμ
+.μελα2ν1είμ
+.μελα2ν1εῖμ
+.μελά2ν1ιππ
+.μελά2ν1ιππ
+.μελα2ν1ίππ
+.μελα2ν1ίππ
+.μελα2ν1όμμ
+.μελα2ν1όμμ
+.μελα2ν1ομμ
+.μελά2ν1οσσ
+.μελά2ν1οσσ
+.μελα2ν1όσσ
+.μελα2ν1όσσ
+.μελά2ν1οστ
+.μελά2ν1οστ
+.μελα2ν1όστ
+.μελα2ν1όστ
+.μελά2ν1ουρ
+.μελά2ν1ουρ
+.μελα2ν1ούρ
+.μελα2ν1ούρ
+.μελα2ν1ουρ
+.μελά2ν1υ
+.μελά2ν1υ
+.μελα2ν1ύ
+.μελα2ν1ύ
+.μετε2ξ1α
+.μετε2ξ1έ
+.μετε2ξ1έ
+.μετε2ξ1ε
+.μογι2σ1
+.μογο2σ1τ
+.μυ2σ1π
+.μυ2σ1επ
+.νεώ2σ1οικ
+.νεώ2σ1οικ
+.νεω2σ1οίκ
+.νεω2σ1οίκ
+.νου2ν1ε
+.ξυ2ν1αγ
+.ξυ2ν1ε
+.ξυ2ν1έ
+.ξυ2ν1έ
+.ξύ2ν1ε
+.ξύ2ν1ε
+.ξυ3ν2εώ
+.ξυ3ν2εώ
+.ξυ3ν2εῶ
+.ξυ2ν1ῆκ
+.ξύ2ν1ι
+.ξύ2ν1ι
+.ξυ2ν1ί
+.ξυ2ν1ί
+οἱο2ν1εί.
+οἱο2ν1εί.
+οἱο2ν1εὶ.
+οἱό2σ1
+οἱό2σ1
+οἰ2σ1πώτ
+οἰ2σ1πώτ
+οἰ2σ1πωτ
+ὁλο2ν1έν.
+ὁλο2ν1έν.
+ὁλο2ν1ὲν.
+ὁπω2σ1
+ὅ2σ1γε.
+ὁσο2ν1ῶν.
+ὅ2σ1περ.
+ὅ2σ1τις
+οἷ2σ1τισι
+οὕ2σ1τινας
+ἧ2σ1τινος
+αἷ2σ1τισι
+ἅ2σ1τινας
+ὁ2σ1τι2σ1οῦν.
+ἡτι2σ1οῦν.
+ὁποιου2σ1τινα2σ1οῦν.
+οὐδενό2σ1ω
+οὐδενό2σ1ω
+οὐδενο2σ1ώ
+οὐδενο2σ1ώ
+.παλι2ν1
+.παλί2ν1
+.παλί2ν1
+.πα2ν1
+.πά2ν1
+.πά2ν1
+.πα3ν2ός.
+.πα3ν2ός.
+.πα3ν2ὸς.
+.πα3ν2όσ.
+.πα3ν2όσ.
+.πα3ν2ὸσ.
+.πα3ν2ί.
+.πα3ν2ί.
+.πα3ν2ὶ.
+.πάνα.
+.πάνα.
+.πα3ν2ῶν.
+.πα3ν2ικ
+.πα3ν2ίσδ
+.πα3ν2ίσδ
+.πα3ν2ισδ
+.πα3ν2οῦ.
+.πα3ν2ῷ.
+.πα3ν2ό.
+.πα3ν2ό.
+.πα3ν2ὸ.
+.πα3ν2όν.
+.πα3ν2όν.
+.πα3ν2ὸν.
+.πα3ν2έ.
+.πα3ν2έ.
+.πα3ν2ὲ.
+.πα3ν2οί.
+.πα3ν2οί.
+.πα3ν2οὶ.
+.πα3ν2οῖς.
+.πα3ν2οῖσ.
+.πα3ν2ούς.
+.πα3ν2ούς.
+.πα3ν2οὺς.
+.πα3ν2ούσ.
+.πα3ν2ούσ.
+.πα3ν2οὺσ.
+.παρα2ν1ίσχ
+.παρα2ν1ίσχ
+.παρεί2σ1
+.παρεί2σ1
+.παρει2σ1
+.παρε2κ1λ
+.παρε2κ1τρ
+.παρε2ν1εῖ
+.παρε2ν1ο
+.παρε2ξ1
+.παρέ2ξ1
+.παρέ2ξ1
+παρέ3ξ2ω.
+παρέ3ξ2ω.
+παρέ3ξ2εις.
+παρέ3ξ2εις.
+παρέ3ξ2εισ.
+παρέ3ξ2εισ.
+παρέ3ξ2ει.
+παρέ3ξ2ει.
+παρέ3ξ2ετον.
+παρέ3ξ2ετον.
+παρε3ξ2έτην.
+παρε3ξ2έτην.
+παρέ3ξ2ομεν.
+παρέ3ξ2ομεν.
+παρέ3ξ2ετε.
+παρέ3ξ2ετε.
+παρέ3ξ2ουσι.
+παρέ3ξ2ουσι.
+παρέ3ξ2ομαι
+παρέ3ξ2ομαι
+παρέ3ξ2ῃ
+παρέ3ξ2ῃ
+παρέ3ξ2εται.
+παρέ3ξ2εται.
+παρέ3ξ2εσθον.
+παρέ3ξ2εσθον.
+παρε3ξ2όμεθα.
+παρε3ξ2όμεθα.
+παρέ3ξ2εσθε.
+παρέ3ξ2εσθε.
+παρέ3ξ2ονται.
+παρέ3ξ2ονται.
+.πλεο2ν1έ
+.πλεο2ν1έ
+.πλεο2ν1ε
+.προει2σ1
+.προε2κ1
+.προε2ν1
+.προε2ξ1
+.προέ2ξ1
+.προέ2ξ1
+.προ2σ1
+.προ3σ2άβ
+.προ3σ2άβ
+.προ3σ2αβ
+.προσει2σ1
+.προ3σ2εί
+.προ3σ2εί
+.προ3σ2έσει
+.προ3σ2έσει
+.προ3σ2εσεί
+.προ3σ2εσεί
+.προσε2ν1
+.προσε2ξ1
+.πρό3σ2θι
+.πρό3σ2θι
+.προ3σ2θί
+.προ3σ2θί
+.προ4σ3θιγ
+.πρό3σ2κοπ
+.πρό3σ2κοπ
+.προ3σ2κόπ
+.προ3σ2κόπ
+.προ3σ2τασ
+.προ3σ2τάτ
+.προ3σ2τάτ
+.προ3σ2τατ
+.προ3σ2ταυ
+.προ3σ2τεί
+.προ3σ2τεί
+.προ3σ2τεν
+.προ3σ2τέν
+.προ3σ2τέν
+.προ3σ2τερν
+.πρό3σ2τερν
+.πρό3σ2τερν
+.προ3σ2τέρν
+.προ3σ2τέρν
+.προ3σ2τήσ
+.προ3σ2τήσ
+.προ3σ2τόμ
+.προ3σ2τόμ
+.προ3σ2τομ
+.πρό3σ2τῳ
+.πρό3σ2τῳ
+.προ3σ2τῴ
+.προ3σ2υγ
+.προ3σ2υμ
+.προ3σ2υ2ν1
+.πρό3σ2φαγμ
+.πρό3σ2φαγμ
+.προ3σ2φάγμ
+.προ3σ2φάγμ
+.προ3σ2φάζ
+.προ3σ2φάζ
+.προ3σ2φάττ
+.προ3σ2φάττ
+.πρό3σ2χημ
+.πρό3σ2χημ
+.προ3σ2χήμ
+.προ3σ2χήμ
+.πρό3σ2ω.
+.πρό3σ2ω.
+.πρό3σ2ωθεν.
+.πρό3σ2ωθεν.
+.προ3σ2ώτ
+.προ3σ2ώτ
+.προ3σ2ωτ
+.προϋπε2ξ1
+.πυ2ρ1άγ
+.πυ2ρ1άγ
+.πυ2ρ1αγ
+.πυ2ρ1αίθ
+.πυ2ρ1αίθ
+.πυ2ρ1αιθ
+.πυ2ρ1ῆθ
+.πυ2ρ1ηθ
+.πυ2ρ1ήθ
+.πυ2ρ1ήθ
+.πυ2ρ1ακ
+.πύ2ρ1αυ
+.πύ2ρ1αυ
+.πυ2ρ1αύ
+.πυ2ρ1αύ
+.πυ2ρ1αυ
+.πυ2ρ1ήνεμ
+.πυ2ρ1ήνεμ
+.πυ2ρ1ηνέμ
+.πυ2ρ1ηνέμ
+.πυ2ρ1ωπ
+.σελα2σ1φό
+.σελα2σ1φό
+.σελα2σ1φο
+.συμπαρει2σ1
+.συ2ν1
+.σύ2ν1
+.σύ2ν1
+.συνδιέ2ξ1
+.συνδιέ2ξ1
+.συνδιε2ξ1
+.συνδυ2σ1
+.συνε2ξ1
+.τεσσαρε2σ1κ
+.τρει2σ1κ
+.τρι2σ1
+.τρι3σ2μό
+.τρι3σ2μό
+.τρι3σ2μο
+.τρι3σ2μῶ
+.τρι3σ2π
+.τρί3σ2τ
+.τρί3σ2τ
+.τρι3σ2τ
+.τρι3σ2ώ
+.τρι3σ2ώ
+.τρι3σ2ω
+ὑο2σ1κ
+ὑπεί2σ1
+ὑπεί2σ1
+ὑπει2σ1
+ὑπεί3σ2ας
+ὑπεί3σ2ας
+ὑπεί3σ2ασ
+ὑπεί3σ2ασ
+ὑπεί3σ2αν
+ὑπεί3σ2αν
+ὑπει3σ2άν
+ὑπει3σ2άν
+ὑπει3σ2άσ
+ὑπει3σ2άσ
+ὑπε2κ1λαμ
+ὑπε2κ1λήψ
+ὑπε2κ1λήψ
+ὑπε2κ1τ
+ὑπε2ν1
+ὑπε2ξ1
+ὑπε2ρ1
+ὑπέ2ρ1
+ὑπέ2ρ1
+ὑπέ3ρ2α.
+ὑπέ3ρ2α.
+ὑπέ3ρ2ης.
+ὑπέ3ρ2ης.
+ὑπέ3ρ2ησ.
+ὑπέ3ρ2ησ.
+ὑπέ3ρ2ᾳ.
+ὑπέ3ρ2ᾳ.
+ὑπέ3ρ2αν.
+ὑπέ3ρ2αν.
+ὑπέ3ρ2αι.
+ὑπέ3ρ2αι.
+ὑπε3ρ2ῶν.
+ὑπέ3ρ2αις.
+ὑπέ3ρ2αις.
+ὑπέ3ρ2αισ.
+ὑπέ3ρ2αισ.
+ὑπέ3ρ2ας.
+ὑπέ3ρ2ας.
+ὑπέ3ρ2ασ.
+ὑπέ3ρ2ασ.
+ὑπε3ρ2εθ
+ὑπε3ρ2έθ
+ὑπε3ρ2έθ
+ὑπε3ρ2εί
+ὑπε3ρ2εί
+ὑπέ3ρ2υθ
+ὑπέ3ρ2υθ
+ὑπε3ρ2ύθ
+ὑπε3ρ2ύθ
+ὑπε3ρ2υθ
+ὑπερε2κ1τε
+ὑπερε2κ1τί
+ὑπερε2κ1τί
+ὑπε3ρ2έπτ
+ὑπε3ρ2έπτ
+ὑπε3ρ2επτ
+ὑπε3ρ2έψ
+ὑπε3ρ2έψ
+ὑπε3ρ2εψ
+ὑπε3ρ2έω
+ὑπε3ρ2έω
+ὑπε3ρ2ῶ
+ὑπε3ρ2έε
+ὑπε3ρ2έε
+ὑπε3ρ2εῖς.
+ὑπε3ρ2εῖσ.
+ὑπε3ρ2εῖ.
+ὑπε3ρ2έο
+ὑπε3ρ2έο
+ὑπε3ρ2οῦ
+ὑπε3ρ2εῖτ
+ὑπε3ρ2ώ
+ὑπε3ρ2ώ
+ὑπε3ρ2ω
+ὕ2σ1τρ
+ὑ2σ1τρ
+.φαε2σ1φ
+.φω2σ1φ
+.χαρι2σ1ανδρ
+.χαρι2σ1άνδρ
+.χαρι2σ1άνδρ
+.χει2ρ1άγ
+.χει2ρ1άγ
+.χει2ρ1αγ
+.χει2ρ1απ
+.χει2ρ1αψ
+.χει2ρ1ου
+.χει2ρ1ῶν
+.χει2ρ1άν
+.χει2ρ1άν
+.χει2ρ1αν
+.χη2ν1ναλ
+ὡ2σ1α2ν1εί.
+ὡ2σ1α2ν1εί.
+ὡ2σ1α2ν1εὶ.
+ὡ2σ1αύτως.
+ὡ2σ1αύτως.
+ὡ2σ1αύτωσ.
+ὡ2σ1αύτωσ.
+ὡ2σ1εί.
+ὡ2σ1εί.
+ὡ2σ1εὶ.
+ὥ2σ1περ.
+ὡ2σ1πε2ρ1εί.
+ὡ2σ1πε2ρ1εί.
+ὡ2σ1πε2ρ1εὶ.
+ὥ2σ1τε
+ι2σ1χίλιοι.
+ι2σ1χίλιοι.
+ι2σ1χιλίων.
+ι2σ1χιλίων.
+ι2σ1χιλίοις.
+ι2σ1χιλίοις.
+ι2σ1χιλίοισ.
+ι2σ1χιλίοισ.
+ι2σ1χιλίους.
+ι2σ1χιλίους.
+ι2σ1χιλίουσ.
+ι2σ1χιλίουσ.
+ι2σ1χίλιαι.
+ι2σ1χίλιαι.
+ι2σ1χιλίαις.
+ι2σ1χιλίαις.
+ι2σ1χιλίαισ.
+ι2σ1χιλίαισ.
+ι2σ1χιλίας.
+ι2σ1χιλίας.
+ι2σ1χιλίασ.
+ι2σ1χιλίασ.
+ι2σ1χίλια.
+ι2σ1χίλια.
+ι2σ1μύριοι.
+ι2σ1μύριοι.
+ι2σ1μυρίων.
+ι2σ1μυρίων.
+ι2σ1μυρίοις.
+ι2σ1μυρίοις.
+ι2σ1μυρίοισ.
+ι2σ1μυρίοισ.
+ι2σ1μυρίους.
+ι2σ1μυρίους.
+ι2σ1μυρίουσ.
+ι2σ1μυρίουσ.
+ι2σ1μύριαι.
+ι2σ1μύριαι.
+ι2σ1μυρίαις.
+ι2σ1μυρίαις.
+ι2σ1μυρίαισ.
+ι2σ1μυρίαισ.
+ι2σ1μυρίας.
+ι2σ1μυρίας.
+ι2σ1μυρίασ.
+ι2σ1μυρίασ.
+ι2σ1μύρια.
+ι2σ1μύρια.
+ι2σ1χιλιοστ
+ι2σ1μυριοστ
+ι2σ1χιλιάκις.
+ι2σ1χιλιάκις.
+ι2σ1χιλιάκισ.
+ι2σ1χιλιάκισ.
+ι2σ1μυριάκις.
+ι2σ1μυριάκις.
+ι2σ1μυριάκισ.
+ι2σ1μυριάκισ.
+}
+
+% end pattern data
+
diff --git a/tex/context/patterns/lang-bg.hyp b/tex/context/patterns/lang-bg.hyp
new file mode 100644
index 000000000..87a04049a
--- /dev/null
+++ b/tex/context/patterns/lang-bg.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-bg.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-bg.pat b/tex/context/patterns/lang-bg.pat
new file mode 100644
index 000000000..3f3f5952f
--- /dev/null
+++ b/tex/context/patterns/lang-bg.pat
@@ -0,0 +1,1667 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-bg.rme
+
+% used: а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ь ю я
+
+\patterns{
+1а1
+1б1
+1в1
+1г1
+1д1
+1е1
+1ж1
+1з1
+1и1
+1й1
+1к1
+1л1
+1м1
+1н1
+1о1
+1п1
+1р1
+1с1
+1т1
+1у1
+1ф1
+1х1
+1ц1
+1ч1
+1ш1
+1щ1
+1ъ1
+0ь0
+1ю1
+1я1
+б4а
+б4е
+б4и
+б4о
+б4у
+б4ъ
+б4ю
+б4я
+в4а
+в4е
+в4и
+в4о
+в4у
+в4ъ
+в4ю
+в4я
+г4а
+г4е
+г4и
+г4о
+г4у
+г4ъ
+г4ю
+г4я
+д4а
+д4е
+д4и
+д4о
+д4у
+д4ъ
+д4ю
+д4я
+ж4а
+ж4е
+ж4и
+ж4о
+ж4у
+ж4ъ
+ж4ю
+ж4я
+з4а
+з4е
+з4и
+з4о
+з4у
+з4ъ
+з4ю
+з4я
+й4а
+й4е
+й4и
+й4о
+й4у
+й4ъ
+й4ю
+й4я
+к4а
+к4е
+к4и
+к4о
+к4у
+к4ъ
+к4ю
+к4я
+л4а
+л4е
+л4и
+л4о
+л4у
+л4ъ
+л4ю
+л4я
+м4а
+м4е
+м4и
+м4о
+м4у
+м4ъ
+м4ю
+м4я
+н4а
+н4е
+н4и
+н4о
+н4у
+н4ъ
+н4ю
+н4я
+п4а
+п4е
+п4и
+п4о
+п4у
+п4ъ
+п4ю
+п4я
+р4а
+р4е
+р4и
+р4о
+р4у
+р4ъ
+р4ю
+р4я
+с4а
+с4е
+с4и
+с4о
+с4у
+с4ъ
+с4ю
+с4я
+т4а
+т4е
+т4и
+т4о
+т4у
+т4ъ
+т4ю
+т4я
+ф4а
+ф4е
+ф4и
+ф4о
+ф4у
+ф4ъ
+ф4ю
+ф4я
+х4а
+х4е
+х4и
+х4о
+х4у
+х4ъ
+х4ю
+х4я
+ц4а
+ц4е
+ц4и
+ц4о
+ц4у
+ц4ъ
+ц4ю
+ц4я
+ч4а
+ч4е
+ч4и
+ч4о
+ч4у
+ч4ъ
+ч4ю
+ч4я
+ш4а
+ш4е
+ш4и
+ш4о
+ш4у
+ш4ъ
+ш4ю
+ш4я
+щ4а
+щ4е
+щ4и
+щ4о
+щ4у
+щ4ъ
+щ4ю
+щ4я
+ь4а
+ь4е
+ь4и
+ь4о
+ь4у
+ь4ъ
+ь4ю
+ь4я
+4б3б4
+2б3в2
+2б3г2
+2б3д2
+2б3ж2
+2б3з2
+2б3й2
+2б3к2
+2б3л2
+2б3м2
+2б3н2
+2б3п2
+2б3р2
+2б3с2
+2б3т2
+2б3ф2
+2б3х2
+2б3ц2
+2б3ч2
+2б3ш2
+2б3щ2
+2в3б2
+4в3в4
+2в3г2
+2в3д2
+2в3ж2
+2в3з2
+2в3й2
+2в3к2
+2в3л2
+2в3м2
+2в3н2
+2в3п2
+2в3р2
+2в3с2
+2в3т2
+2в3ф2
+2в3х2
+2в3ц2
+2в3ч2
+2в3ш2
+2в3щ2
+2г3б2
+2г3в2
+4г3г4
+2г3д2
+2г3ж2
+2г3з2
+2г3й2
+2г3к2
+2г3л2
+2г3м2
+2г3н2
+2г3п2
+2г3р2
+2г3с2
+2г3т2
+2г3ф2
+2г3х2
+2г3ц2
+2г3ч2
+2г3ш2
+2г3щ2
+2д3б2
+2д3в2
+2д3г2
+4д3д4
+3д4ж
+2д3з2
+2д3й2
+2д3к2
+2д3л2
+2д3м2
+2д3н2
+2д3п2
+2д3р2
+2д3с2
+2д3т2
+2д3ф2
+2д3х2
+2д3ц2
+2д3ч2
+2д3ш2
+2д3щ2
+2ж3б2
+2ж3в2
+2ж3г2
+2ж3д2
+4ж3ж4
+2ж3з2
+2ж3й2
+2ж3к2
+2ж3л2
+2ж3м2
+2ж3н2
+2ж3п2
+2ж3р2
+2ж3с2
+2ж3т2
+2ж3ф2
+2ж3х2
+2ж3ц2
+2ж3ч2
+2ж3ш2
+2ж3щ2
+2з3б2
+2з3в2
+2з3г2
+2з3д2
+2з3ж2
+4з3з4
+2з3й2
+2з3к2
+2з3л2
+2з3м2
+2з3н2
+2з3п2
+2з3р2
+2з3с2
+2з3т2
+2з3ф2
+2з3х2
+2з3ц2
+2з3ч2
+2з3ш2
+2з3щ2
+2й3б2
+2й3в2
+2й3г2
+2й3д2
+2й3ж2
+2й3з2
+4й3й4
+2й3к2
+2й3л2
+2й3м2
+2й3н2
+2й3п2
+2й3р2
+2й3с2
+2й3т2
+2й3ф2
+2й3х2
+2й3ц2
+2й3ч2
+2й3ш2
+2й3щ2
+2к3б2
+2к3в2
+2к3г2
+2к3д2
+2к3ж2
+2к3з2
+2к3й2
+4к3к4
+2к3л2
+2к3м2
+2к3н2
+2к3п2
+2к3р2
+2к3с2
+2к3т2
+2к3ф2
+2к3х2
+2к3ц2
+2к3ч2
+2к3ш2
+2к3щ2
+2л3б2
+2л3в2
+2л3г2
+2л3д2
+2л3ж2
+2л3з2
+2л3й2
+2л3к2
+4л3л4
+2л3м2
+2л3н2
+2л3п2
+2л3р2
+2л3с2
+2л3т2
+2л3ф2
+2л3х2
+2л3ц2
+2л3ч2
+2л3ш2
+2л3щ2
+2м3б2
+2м3в2
+2м3г2
+2м3д2
+2м3ж2
+2м3з2
+2м3й2
+2м3к2
+2м3л2
+4м3м4
+2м3н2
+2м3п2
+2м3р2
+2м3с2
+2м3т2
+2м3ф2
+2м3х2
+2м3ц2
+2м3ч2
+2м3ш2
+2м3щ2
+2н3б2
+2н3в2
+2н3г2
+2н3д2
+2н3ж2
+2н3з2
+2н3й2
+2н3к2
+2н3л2
+2н3м2
+4н3н4
+2н3п2
+2н3р2
+2н3с2
+2н3т2
+2н3ф2
+2н3х2
+2н3ц2
+2н3ч2
+2н3ш2
+2н3щ2
+2п3б2
+2п3в2
+2п3г2
+2п3д2
+2п3ж2
+2п3з2
+2п3й2
+2п3к2
+2п3л2
+2п3м2
+2п3н2
+4п3п4
+2п3р2
+2п3с2
+2п3т2
+2п3ф2
+2п3х2
+2п3ц2
+2п3ч2
+2п3ш2
+2п3щ2
+2р3б2
+2р3в2
+2р3г2
+2р3д2
+2р3ж2
+2р3з2
+2р3й2
+2р3к2
+2р3л2
+2р3м2
+2р3н2
+2р3п2
+4р3р4
+2р3с2
+2р3т2
+2р3ф2
+2р3х2
+2р3ц2
+2р3ч2
+2р3ш2
+2р3щ2
+2с3б2
+2с3в2
+2с3г2
+2с3д2
+2с3ж2
+2с3з2
+2с3й2
+2с3к2
+2с3л2
+2с3м2
+2с3н2
+2с3п2
+2с3р2
+4с3с4
+2с3т2
+2с3ф2
+2с3х2
+2с3ц2
+2с3ч2
+2с3ш2
+2с3щ2
+2т3б2
+2т3в2
+2т3г2
+2т3д2
+2т3ж2
+2т3з2
+2т3й2
+2т3к2
+2т3л2
+2т3м2
+2т3н2
+2т3п2
+2т3р2
+2т3с2
+4т3т4
+2т3ф2
+2т3х2
+2т3ц2
+2т3ч2
+2т3ш2
+2т3щ2
+2ф3б2
+2ф3в2
+2ф3г2
+2ф3д2
+2ф3ж2
+2ф3з2
+2ф3й2
+2ф3к2
+2ф3л2
+2ф3м2
+2ф3н2
+2ф3п2
+2ф3р2
+2ф3с2
+2ф3т2
+4ф3ф4
+2ф3х2
+2ф3ц2
+2ф3ч2
+2ф3ш2
+2ф3щ2
+2х3б2
+2х3в2
+2х3г2
+2х3д2
+2х3ж2
+2х3з2
+2х3й2
+2х3к2
+2х3л2
+2х3м2
+2х3н2
+2х3п2
+2х3р2
+2х3с2
+2х3т2
+2х3ф2
+4х3х4
+2х3ц2
+2х3ч2
+2х3ш2
+2х3щ2
+2ц3б2
+2ц3в2
+2ц3г2
+2ц3д2
+2ц3ж2
+2ц3з2
+2ц3й2
+2ц3к2
+2ц3л2
+2ц3м2
+2ц3н2
+2ц3п2
+2ц3р2
+2ц3с2
+2ц3т2
+2ц3ф2
+2ц3х2
+4ц3ц4
+2ц3ч2
+2ц3ш2
+2ц3щ2
+2ч3б2
+2ч3в2
+2ч3г2
+2ч3д2
+2ч3ж2
+2ч3з2
+2ч3й2
+2ч3к2
+2ч3л2
+2ч3м2
+2ч3н2
+2ч3п2
+2ч3р2
+2ч3с2
+2ч3т2
+2ч3ф2
+2ч3х2
+2ч3ц2
+4ч3ч4
+2ч3ш2
+2ч3щ2
+2ш3б2
+2ш3в2
+2ш3г2
+2ш3д2
+2ш3ж2
+2ш3з2
+2ш3й2
+2ш3к2
+2ш3л2
+2ш3м2
+2ш3н2
+2ш3п2
+2ш3р2
+2ш3с2
+2ш3т2
+2ш3ф2
+2ш3х2
+2ш3ц2
+2ш3ч2
+4ш3ш4
+2ш3щ2
+2щ3б2
+2щ3в2
+2щ3г2
+2щ3д2
+2щ3ж2
+2щ3з2
+2щ3й2
+2щ3к2
+2щ3л2
+2щ3м2
+2щ3н2
+2щ3п2
+2щ3р2
+2щ3с2
+2щ3т2
+2щ3ф2
+2щ3х2
+2щ3ц2
+2щ3ч2
+2щ3ш2
+4щ3щ4
+ааа4
+аае4
+ааи4
+аао4
+аау4
+ааъ4
+ааю4
+аая4
+аеа4
+аее4
+аеи4
+аео4
+аеу4
+аеъ4
+аею4
+аея4
+аиа4
+аие4
+аии4
+аио4
+аиу4
+аиъ4
+аию4
+аия4
+аоа4
+аое4
+аои4
+аоо4
+аоу4
+аоъ4
+аою4
+аоя4
+ауа4
+ауе4
+ауи4
+ауо4
+ауу4
+ауъ4
+аую4
+ауя4
+аъа4
+аъе4
+аъи4
+аъо4
+аъу4
+аъъ4
+аъю4
+аъя4
+аюа4
+аюе4
+аюи4
+аюо4
+аюу4
+аюъ4
+аюю4
+аюя4
+аяа4
+аяе4
+аяи4
+аяо4
+аяу4
+аяъ4
+аяю4
+аяя4
+еаа4
+еае4
+еаи4
+еао4
+еау4
+еаъ4
+еаю4
+еая4
+ееа4
+еее4
+ееи4
+еео4
+ееу4
+ееъ4
+еею4
+еея4
+еиа4
+еие4
+еии4
+еио4
+еиу4
+еиъ4
+еию4
+еия4
+еоа4
+еое4
+еои4
+еоо4
+еоу4
+еоъ4
+еою4
+еоя4
+еуа4
+еуе4
+еуи4
+еуо4
+еуу4
+еуъ4
+еую4
+еуя4
+еъа4
+еъе4
+еъи4
+еъо4
+еъу4
+еъъ4
+еъю4
+еъя4
+еюа4
+еюе4
+еюи4
+еюо4
+еюу4
+еюъ4
+еюю4
+еюя4
+еяа4
+еяе4
+еяи4
+еяо4
+еяу4
+еяъ4
+еяю4
+еяя4
+иаа4
+иае4
+иаи4
+иао4
+иау4
+иаъ4
+иаю4
+иая4
+иеа4
+иее4
+иеи4
+иео4
+иеу4
+иеъ4
+иею4
+иея4
+ииа4
+иие4
+иии4
+иио4
+ииу4
+ииъ4
+иию4
+иия4
+иоа4
+иое4
+иои4
+иоо4
+иоу4
+иоъ4
+иою4
+иоя4
+иуа4
+иуе4
+иуи4
+иуо4
+иуу4
+иуъ4
+иую4
+иуя4
+иъа4
+иъе4
+иъи4
+иъо4
+иъу4
+иъъ4
+иъю4
+иъя4
+июа4
+июе4
+июи4
+июо4
+июу4
+июъ4
+июю4
+июя4
+ияа4
+ияе4
+ияи4
+ияо4
+ияу4
+ияъ4
+ияю4
+ияя4
+оаа4
+оае4
+оаи4
+оао4
+оау4
+оаъ4
+оаю4
+оая4
+оеа4
+оее4
+оеи4
+оео4
+оеу4
+оеъ4
+оею4
+оея4
+оиа4
+оие4
+оии4
+оио4
+оиу4
+оиъ4
+оию4
+оия4
+ооа4
+оое4
+оои4
+ооо4
+ооу4
+ооъ4
+оою4
+ооя4
+оуа4
+оуе4
+оуи4
+оуо4
+оуу4
+оуъ4
+оую4
+оуя4
+оъа4
+оъе4
+оъи4
+оъо4
+оъу4
+оъъ4
+оъю4
+оъя4
+оюа4
+оюе4
+оюи4
+оюо4
+оюу4
+оюъ4
+оюю4
+оюя4
+ояа4
+ояе4
+ояи4
+ояо4
+ояу4
+ояъ4
+ояю4
+ояя4
+уаа4
+уае4
+уаи4
+уао4
+уау4
+уаъ4
+уаю4
+уая4
+уеа4
+уее4
+уеи4
+уео4
+уеу4
+уеъ4
+уею4
+уея4
+уиа4
+уие4
+уии4
+уио4
+уиу4
+уиъ4
+уию4
+уия4
+уоа4
+уое4
+уои4
+уоо4
+уоу4
+уоъ4
+уою4
+уоя4
+ууа4
+ууе4
+ууи4
+ууо4
+ууу4
+ууъ4
+уую4
+ууя4
+уъа4
+уъе4
+уъи4
+уъо4
+уъу4
+уъъ4
+уъю4
+уъя4
+уюа4
+уюе4
+уюи4
+уюо4
+уюу4
+уюъ4
+уюю4
+уюя4
+уяа4
+уяе4
+уяи4
+уяо4
+уяу4
+уяъ4
+уяю4
+уяя4
+ъаа4
+ъае4
+ъаи4
+ъао4
+ъау4
+ъаъ4
+ъаю4
+ъая4
+ъеа4
+ъее4
+ъеи4
+ъео4
+ъеу4
+ъеъ4
+ъею4
+ъея4
+ъиа4
+ъие4
+ъии4
+ъио4
+ъиу4
+ъиъ4
+ъию4
+ъия4
+ъоа4
+ъое4
+ъои4
+ъоо4
+ъоу4
+ъоъ4
+ъою4
+ъоя4
+ъуа4
+ъуе4
+ъуи4
+ъуо4
+ъуу4
+ъуъ4
+ъую4
+ъуя4
+ъъа4
+ъъе4
+ъъи4
+ъъо4
+ъъу4
+ъъъ4
+ъъю4
+ъъя4
+ъюа4
+ъюе4
+ъюи4
+ъюо4
+ъюу4
+ъюъ4
+ъюю4
+ъюя4
+ъяа4
+ъяе4
+ъяи4
+ъяо4
+ъяу4
+ъяъ4
+ъяю4
+ъяя4
+юаа4
+юае4
+юаи4
+юао4
+юау4
+юаъ4
+юаю4
+юая4
+юеа4
+юее4
+юеи4
+юео4
+юеу4
+юеъ4
+юею4
+юея4
+юиа4
+юие4
+юии4
+юио4
+юиу4
+юиъ4
+юию4
+юия4
+юоа4
+юое4
+юои4
+юоо4
+юоу4
+юоъ4
+юою4
+юоя4
+юуа4
+юуе4
+юуи4
+юуо4
+юуу4
+юуъ4
+юую4
+юуя4
+юъа4
+юъе4
+юъи4
+юъо4
+юъу4
+юъъ4
+юъю4
+юъя4
+ююа4
+ююе4
+ююи4
+ююо4
+ююу4
+ююъ4
+ююю4
+ююя4
+юяа4
+юяе4
+юяи4
+юяо4
+юяу4
+юяъ4
+юяю4
+юяя4
+яаа4
+яае4
+яаи4
+яао4
+яау4
+яаъ4
+яаю4
+яая4
+яеа4
+яее4
+яеи4
+яео4
+яеу4
+яеъ4
+яею4
+яея4
+яиа4
+яие4
+яии4
+яио4
+яиу4
+яиъ4
+яию4
+яия4
+яоа4
+яое4
+яои4
+яоо4
+яоу4
+яоъ4
+яою4
+яоя4
+яуа4
+яуе4
+яуи4
+яуо4
+яуу4
+яуъ4
+яую4
+яуя4
+яъа4
+яъе4
+яъи4
+яъо4
+яъу4
+яъъ4
+яъю4
+яъя4
+яюа4
+яюе4
+яюи4
+яюо4
+яюу4
+яюъ4
+яюю4
+яюя4
+яяа4
+яяе4
+яяи4
+яяо4
+яяу4
+яяъ4
+яяю4
+яяя4
+й4бб
+й4бв
+й4бг
+й4бд
+й4бж
+й4бз
+й4бй
+й4бк
+й4бл
+й4бм
+й4бн
+й4бп
+й4бр
+й4бс
+й4бт
+й4бф
+й4бх
+й4бц
+й4бч
+й4бш
+й4бщ
+й4вб
+й4вв
+й4вг
+й4вд
+й4вж
+й4вз
+й4вй
+й4вк
+й4вл
+й4вм
+й4вн
+й4вп
+й4вр
+й4вс
+й4вт
+й4вф
+й4вх
+й4вц
+й4вч
+й4вш
+й4вщ
+й4гб
+й4гв
+й4гг
+й4гд
+й4гж
+й4гз
+й4гй
+й4гк
+й4гл
+й4гм
+й4гн
+й4гп
+й4гр
+й4гс
+й4гт
+й4гф
+й4гх
+й4гц
+й4гч
+й4гш
+й4гщ
+й4дб
+й4дв
+й4дг
+й4дд
+й4дж
+й4дз
+й4дй
+й4дк
+й4дл
+й4дм
+й4дн
+й4дп
+й4др
+й4дс
+й4дт
+й4дф
+й4дх
+й4дц
+й4дч
+й4дш
+й4дщ
+й4жб
+й4жв
+й4жг
+й4жд
+й4жж
+й4жз
+й4жй
+й4жк
+й4жл
+й4жм
+й4жн
+й4жп
+й4жр
+й4жс
+й4жт
+й4жф
+й4жх
+й4жц
+й4жч
+й4жш
+й4жщ
+й4зб
+й4зв
+й4зг
+й4зд
+й4зж
+й4зз
+й4зй
+й4зк
+й4зл
+й4зм
+й4зн
+й4зп
+й4зр
+й4зс
+й4зт
+й4зф
+й4зх
+й4зц
+й4зч
+й4зш
+й4зщ
+й4йб
+й4йв
+й4йг
+й4йд
+й4йж
+й4йз
+й4йй
+й4йк
+й4йл
+й4йм
+й4йн
+й4йп
+й4йр
+й4йс
+й4йт
+й4йф
+й4йх
+й4йц
+й4йч
+й4йш
+й4йщ
+й4кб
+й4кв
+й4кг
+й4кд
+й4кж
+й4кз
+й4кй
+й4кк
+й4кл
+й4км
+й4кн
+й4кп
+й4кр
+й4кс
+й4кт
+й4кф
+й4кх
+й4кц
+й4кч
+й4кш
+й4кщ
+й4лб
+й4лв
+й4лг
+й4лд
+й4лж
+й4лз
+й4лй
+й4лк
+й4лл
+й4лм
+й4лн
+й4лп
+й4лр
+й4лс
+й4лт
+й4лф
+й4лх
+й4лц
+й4лч
+й4лш
+й4лщ
+й4мб
+й4мв
+й4мг
+й4мд
+й4мж
+й4мз
+й4мй
+й4мк
+й4мл
+й4мм
+й4мн
+й4мп
+й4мр
+й4мс
+й4мт
+й4мф
+й4мх
+й4мц
+й4мч
+й4мш
+й4мщ
+й4нб
+й4нв
+й4нг
+й4нд
+й4нж
+й4нз
+й4нй
+й4нк
+й4нл
+й4нм
+й4нн
+й4нп
+й4нр
+й4нс
+й4нт
+й4нф
+й4нх
+й4нц
+й4нч
+й4нш
+й4нщ
+й4пб
+й4пв
+й4пг
+й4пд
+й4пж
+й4пз
+й4пй
+й4пк
+й4пл
+й4пм
+й4пн
+й4пп
+й4пр
+й4пс
+й4пт
+й4пф
+й4пх
+й4пц
+й4пч
+й4пш
+й4пщ
+й4рб
+й4рв
+й4рг
+й4рд
+й4рж
+й4рз
+й4рй
+й4рк
+й4рл
+й4рм
+й4рн
+й4рп
+й4рр
+й4рс
+й4рт
+й4рф
+й4рх
+й4рц
+й4рч
+й4рш
+й4рщ
+й4сб
+й4св
+й4сг
+й4сд
+й4сж
+й4сз
+й4сй
+й4ск
+й4сл
+й4см
+й4сн
+й4сп
+й4ср
+й4сс
+й4ст
+й4сф
+й4сх
+й4сц
+й4сч
+й4сш
+й4сщ
+й4тб
+й4тв
+й4тг
+й4тд
+й4тж
+й4тз
+й4тй
+й4тк
+й4тл
+й4тм
+й4тн
+й4тп
+й4тр
+й4тс
+й4тт
+й4тф
+й4тх
+й4тц
+й4тч
+й4тш
+й4тщ
+й4фб
+й4фв
+й4фг
+й4фд
+й4фж
+й4фз
+й4фй
+й4фк
+й4фл
+й4фм
+й4фн
+й4фп
+й4фр
+й4фс
+й4фт
+й4фф
+й4фх
+й4фц
+й4фч
+й4фш
+й4фщ
+й4хб
+й4хв
+й4хг
+й4хд
+й4хж
+й4хз
+й4хй
+й4хк
+й4хл
+й4хм
+й4хн
+й4хп
+й4хр
+й4хс
+й4хт
+й4хф
+й4хх
+й4хц
+й4хч
+й4хш
+й4хщ
+й4цб
+й4цв
+й4цг
+й4цд
+й4цж
+й4цз
+й4цй
+й4цк
+й4цл
+й4цм
+й4цн
+й4цп
+й4цр
+й4цс
+й4цт
+й4цф
+й4цх
+й4цц
+й4цч
+й4цш
+й4цщ
+й4чб
+й4чв
+й4чг
+й4чд
+й4чж
+й4чз
+й4чй
+й4чк
+й4чл
+й4чм
+й4чн
+й4чп
+й4чр
+й4чс
+й4чт
+й4чф
+й4чх
+й4чц
+й4чч
+й4чш
+й4чщ
+й4шб
+й4шв
+й4шг
+й4шд
+й4шж
+й4шз
+й4шй
+й4шк
+й4шл
+й4шм
+й4шн
+й4шп
+й4шр
+й4шс
+й4шт
+й4шф
+й4шх
+й4шц
+й4шч
+й4шш
+й4шщ
+й4щб
+й4щв
+й4щг
+й4щд
+й4щж
+й4щз
+й4щй
+й4щк
+й4щл
+й4щм
+й4щн
+й4щп
+й4щр
+й4щс
+й4щт
+й4щф
+й4щх
+й4щц
+й4щч
+й4щш
+й4щщ
+б4ь
+в4ь
+г4ь
+д4ь
+ж4ь
+з4ь
+й4ь
+к4ь
+л4ь
+м4ь
+н4ь
+п4ь
+р4ь
+с4ь
+т4ь
+ф4ь
+х4ь
+ц4ь
+ч4ь
+ш4ь
+щ4ь
+ь4ь
+.дз4в
+.дж4р
+.дж4л
+.вг4л
+.вд4л
+.вг4р
+.вг4н
+.вп4л
+.вк4л
+.вк4р
+.вт4р
+.сг4л
+.зд4р
+.сг4р
+.сб4р
+.сд4р
+.жд4р
+.ск4л
+.сп4л
+.сп4р
+.ст4р
+.ск4р
+.шп4р
+.ск4в
+.вз4р
+.вс4л
+.вс4м
+.вс4р
+.св4р
+.сх4л
+.сх4р
+.хв4р
+.вс4т
+.сх4в
+.см4р
+н4кт.
+н4кс.
+к4ст.} \ No newline at end of file
diff --git a/tex/context/patterns/lang-bg.rme b/tex/context/patterns/lang-bg.rme
new file mode 100644
index 000000000..890f04fba
--- /dev/null
+++ b/tex/context/patterns/lang-bg.rme
@@ -0,0 +1,43 @@
+% generated by mtxrun --script pattern --convert
+
+% Bulgarian hyphenation patterns, version 1.7, July 2008
+% Copyright 1994-2008 Georgi Boshnakov
+% Georgi dot Boshnakov at manchester dot ac dot uk
+%
+% This file can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+%
+%
+% First version: 1994
+% Modified: June 2000 (minor changes)
+% Modified: May 2006 (added copyright notice)
+% Modified: June 2008 (changed encoding to utf-8)
+%
+% Please send wrongly hyphenated words and suggestions for
+% corrections to the address given towards the beginning of this
+% file.
+%
+%
+% Note: The original name of this file was 'bghyphsi.tex' which is
+% part of the package 'bghyphen'. The package 'bghyphen' is now
+% obsolete but it is still available on CTAN and currently (June 2008)
+% gives the same hyphenation results.
+%
+%
+%
+% To make TeX use these patterns:
+%
+% (1) Make sure that the hyph-utf8 package is present in your TeX
+% system.
+%
+% (2) generate the necessary formats (TeX, LaTeX, pdfLaTeX, etc),
+% instructing TeX to load 'loadhyph-bg.tex' for Bulgarian
+% hyphenation.
+%
+% The LaTeX babel package sets \lefthyphenmin and \righthyphenmin to 2
+% when the language is switched to Bulgarian. Developers who write
+% support for Bulgarian outside LaTeX and/or babel need to take care
+% of this.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-ca.hyp b/tex/context/patterns/lang-ca.hyp
new file mode 100644
index 000000000..90ccd20b7
--- /dev/null
+++ b/tex/context/patterns/lang-ca.hyp
@@ -0,0 +1,33 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-ca.rme
+
+% used: a b c d e g h i j k l n o p r s t u v w x y
+
+\hyphenation{
+cu-rie
+cu-ries
+gei-sha
+gei-shes
+goua-che
+goua-ches
+hip-py
+hip-pies
+hob-by
+hob-bies
+jeep
+jeeps
+joule
+joules
+klee-nex
+klee-nexs
+lar-ghet-ti
+lar-ghet-to
+lied
+lieder
+nos-al-tres
+ro-yal-ties
+ro-yal-ty
+vos-al-tres
+whis-ky
+whis-kies} \ No newline at end of file
diff --git a/tex/context/patterns/lang-ca.pat b/tex/context/patterns/lang-ca.pat
new file mode 100644
index 000000000..34e2e96ea
--- /dev/null
+++ b/tex/context/patterns/lang-ca.pat
@@ -0,0 +1,876 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-ca.rme
+
+% used: a b c d e f g h i j l m n o p q r s t u v x y z à ç è é í ï ò ó ú ü
+
+\patterns{
+1ba
+1be
+1bi
+1bo
+1bu
+1ca
+1ce
+1ci
+1co
+1cu
+1da
+1de
+1di
+1do
+3du
+1fa
+1fe
+1fi
+1fo
+1fu
+1ga
+1ge
+1gi
+1go
+1gu
+1ha
+1he
+1hi
+1ho
+1hu
+1ja
+1je
+1ji
+1jo
+1ju
+1la
+1le
+1li
+1lo
+1lu
+1ma
+1me
+1mi
+1mo
+1mu
+1na
+1ne
+3ni
+1no
+1nu
+1pa
+3pe
+3pi
+3po
+1pu
+1qu
+1ra
+1re
+1ri
+1ro
+1ru
+1sa
+1se
+1si
+1so
+1su
+1ta
+1te
+1ti
+1to
+1tu
+1va
+1ve
+1vi
+1vo
+1vu
+1xa
+1xe
+1xi
+1xo
+1xu
+1za
+1ze
+1zi
+1zo
+1zu
+1bé
+1bí
+1bó
+1bú
+1bà
+1bè
+1bò
+1cé
+1cí
+1có
+1cú
+1cà
+1cè
+1cò
+1ço
+1ça
+1çu
+1çó
+1çú
+1çà
+1çò
+1dé
+1dí
+1dó
+1dú
+1dà
+1dè
+1dò
+1fé
+1fí
+1fó
+1fú
+1fà
+1fè
+1fò
+1gé
+1gí
+1gó
+1gú
+1gà
+1gè
+1gò
+1gü
+1hé
+1hí
+1hó
+1hú
+1hà
+1hè
+1hò
+1jé
+1jí
+1jó
+1jú
+1jà
+1jè
+1jò
+1lé
+1lí
+1ló
+1lú
+1là
+1lè
+1lò
+1mé
+1mí
+1mó
+1mú
+1mà
+1mè
+1mò
+1né
+1ní
+1nó
+1nú
+1nà
+1nè
+1nò
+1pé
+1pí
+1pó
+1pú
+1pà
+1pè
+1pò
+1qü
+1ré
+1rí
+1ró
+1rú
+1rà
+1rè
+1rò
+1sé
+1sí
+1só
+1sú
+1sà
+1sè
+1sò
+1té
+1tí
+1tó
+1tú
+1tà
+1tè
+1tò
+1vé
+1ví
+1vó
+1vú
+1và
+1vè
+1vò
+1xé
+1xí
+1xó
+1xú
+1xà
+1xè
+1xò
+1zé
+1zí
+1zó
+1zú
+1zà
+1zè
+1zò
+3l2la
+1l2le
+1l2li
+3l2lo
+1l2lu
+1b2la
+1b2le
+1b2li
+1b2lo
+1b2lu
+1b2ra
+1b2re
+1b2ri
+1b2ro
+1b2ru
+1c2la
+1c2le
+1c2li
+1c2lo
+1c2lu
+1c2ra
+1c2re
+1c2ri
+1c2ro
+1c2ru
+1d2ra
+1d2re
+1d2ri
+1d2ro
+1d2ru
+1f2la
+1f2le
+1f2li
+1f2lo
+1f2lu
+1f2ra
+1f2re
+1f2ri
+1f2ro
+1f2ru
+1g2la
+1g2le
+1g2li
+1g2lo
+1g2lu
+1g2ra
+1g2re
+1g2ri
+1g2ro
+1g2ru
+1p2la
+1p2le
+1p2li
+1p2lo
+1p2lu
+1p2ra
+1p2re
+1p2ri
+1p2ro
+1p2ru
+1t2ra
+1t2re
+1t2ri
+1t2ro
+1t2ru
+1n2ya
+1n2ye
+1n2yi
+1n2yo
+1n2yu
+1l2lé
+1l2lí
+1l2ló
+1l2lú
+1l2là
+1l2lè
+1l2lò
+1b2lé
+1b2lí
+1b2ló
+1b2lú
+1b2là
+1b2lè
+1b2lò
+1b2ré
+1b2rí
+1b2ró
+1b2rú
+1b2rà
+1b2rè
+1b2rò
+1c2lé
+1c2lí
+1c2ló
+1c2lú
+1c2là
+1c2lè
+1c2lò
+1c2ré
+1c2rí
+1c2ró
+1c2rú
+1c2rà
+1c2rè
+1c2rò
+1d2ré
+1d2rí
+1d2ró
+1d2rú
+1d2rà
+1d2rè
+1d2rò
+1f2lé
+1f2lí
+1f2ló
+1f2lú
+1f2là
+1f2lè
+1f2lò
+1f2ré
+1f2rí
+1f2ró
+1f2rú
+1f2rà
+1f2rè
+1f2rò
+1g2lé
+1g2lí
+1g2ló
+1g2lú
+1g2là
+1g2lè
+1g2lò
+1g2ré
+1g2rí
+1g2ró
+1g2rú
+1g2rà
+1g2rè
+1g2rò
+1p2lé
+1p2lí
+1p2ló
+1p2lú
+1p2là
+1p2lè
+1p2lò
+1p2ré
+1p2rí
+1p2ró
+1p2rú
+1p2rà
+1p2rè
+1p2rò
+1t2ré
+1t2rí
+1t2ró
+1t2rú
+1t2rà
+1t2rè
+1t2rò
+1n2yé
+1n2yí
+1n2yó
+1n2yú
+1n2yà
+1n2yè
+1n2yò
+a1a
+a1e
+a1o
+e1a
+e1e
+e1o
+i1a
+i1e
+i1o
+o1a
+o1e
+o1o
+u1a
+u1e
+u1o
+a1é
+a1í
+a1ó
+a1ú
+a1à
+a1è
+a1ò
+a1ï
+a1ü
+e1é
+e1í
+e1ó
+e1ú
+e1à
+e1è
+e1ò
+e1ï
+e1ü
+i1é
+i1í
+i1ó
+i1ú
+i1à
+i1è
+i1ò
+i1ï
+i1ü
+o1é
+o1í
+o1ó
+o1ú
+o1à
+o1è
+o1ò
+o1ï
+o1ü
+u1é
+u1í
+u1ó
+u1ú
+u1à
+u1è
+u1ò
+u1ï
+u1ü
+é1a
+é1e
+é1o
+é1ï
+é1ü
+í1a
+í1e
+í1o
+í1ï
+í1ü
+ó1a
+ó1e
+ó1o
+ó1ï
+ó1ü
+ú1a
+ú1e
+ú1o
+ú1ï
+ú1ü
+à1a
+à1e
+à1o
+à1ï
+à1ü
+è1a
+è1e
+è1o
+è1ï
+è1ü
+ò1a
+ò1e
+ò1o
+ò1ï
+ò1ü
+ï1a
+ï1e
+ï1o
+ï1é
+ï1í
+ï1ó
+ï1ú
+ï1à
+ï1è
+ï1ò
+ï1i
+ü1a
+ü1e
+ü1o
+ü1é
+ü1í
+ü1ó
+ü1ú
+ü1à
+ü1è
+ü1ò
+a1i2a
+a1i2e
+a1i2o
+a1i2u
+a1u2a
+a1u2e
+a1u2i
+a1u2o
+a1u2u
+e1i2a
+e1i2e
+e1i2o
+e1i2u
+e1u2a
+e1u2e
+e1u2i
+e1u2o
+e1u2u
+i1i2a
+i1i2e
+i1i2o
+i1i2u
+i1u2a
+i1u2e
+i1u2i
+i1u2o
+i1u2u
+o1i2a
+o1i2e
+o1i2o
+o1i2u
+o1u2a
+o1u2e
+o1u2o
+o1u2i
+o1u2u
+u1i2a
+u1i2e
+u1i2o
+u1i2u
+u1u2a
+u1u2e
+u1u2i
+u1u2o
+u1u2u
+a1i2é
+a1i2í
+a1i2ó
+a1i2ú
+a1i2à
+a1i2è
+a1i2ò
+a1u2é
+a1u2í
+a1u2ó
+a1u2ú
+a1u2à
+a1u2è
+a1u2ò
+e1i2é
+e1i2í
+e1i2ó
+e1i2ú
+e1i2à
+e1i2è
+e1i2ò
+e1u2é
+e1u2í
+e1u2ó
+e1u2ú
+e1u2à
+e1u2è
+e1u2ò
+i1i2é
+i1i2í
+i1i2ó
+i1i2ú
+i1i2à
+i1i2è
+i1i2ò
+i1u2é
+i1u2í
+i1u2ó
+i1u2ú
+i1u2à
+i1u2è
+i1u2ò
+o1i2é
+o1i2í
+o1i2ó
+o1i2ú
+o1i2à
+o1i2è
+o1i2ò
+o1u2é
+o1u2í
+o1u2ó
+o1u2ú
+o1u2à
+o1u2è
+o1u2ò
+u1i2é
+u1i2í
+u1i2ó
+u1i2ú
+u1i2à
+u1i2è
+u1i2ò
+u1u2é
+u1u2í
+u1u2ó
+u1u2ú
+u1u2à
+u1u2è
+u1u2ò
+é1i2a
+é1i2e
+é1i2o
+é1i2u
+é1u2a
+é1u2e
+é1u2o
+é1u2i
+é1u2u
+í1i2a
+í1i2e
+í1i2o
+í1i2u
+í1u2a
+í1u2e
+í1u2o
+í1u2i
+í1u2u
+ó1i2a
+ó1i2e
+ó1i2o
+ó1i2u
+ó1u2a
+ó1u2e
+ó1u2o
+ó1u2i
+ó1u2u
+ú1i2a
+ú1i2e
+ú1i2o
+ú1i2u
+ú1u2a
+ú1u2e
+ú1u2o
+ú1u2i
+ú1u2u
+à1i2a
+à1i2e
+à1i2o
+à1i2u
+à1u2a
+à1u2e
+à1u2o
+à1u2i
+à1u2u
+è1i2a
+è1i2e
+è1i2o
+è1i2u
+è1u2a
+è1u2e
+è1u2o
+è1u2i
+è1u2u
+ò1i2a
+ò1i2e
+ò1i2o
+ò1i2u
+ò1u2a
+ò1u2e
+ò1u2o
+ò1u2i
+ò1u2u
+ï1i2a
+ï1i2e
+ï1i2o
+ï1i2é
+ï1i2í
+ï1i2ó
+ï1i2ú
+ï1i2à
+ï1i2è
+ï1i2ò
+ï1i2u
+ï1u2a
+ï1u2e
+ï1u2o
+ï1u2é
+ï1u2í
+ï1u2ó
+ï1u2ú
+ï1u2à
+ï1u2è
+ï1u2ò
+ï1u2i
+ï1u2u
+ü1i2a
+ü1i2e
+ü1i2o
+ü1i2é
+ü1i2í
+ü1i2ó
+ü1i2ú
+ü1i2à
+ü1i2è
+ü1i2ò
+ü1i2u
+ü1u2a
+ü1u2e
+ü1u2o
+ü1u2é
+ü1u2í
+ü1u2ó
+ü1u2ú
+ü1u2à
+ü1u2è
+ü1u2ò
+ü1u2i
+ü1u2u
+.hi2a
+.hi2e
+.hi2o
+.hi2u
+.hu2a
+.hu2e
+.hu2i
+.hu2o
+.i2è
+.i2ò
+.u2è
+.u2ò
+.hi2é
+.hi2ó
+.hi2ú
+.hi2à
+.hi2è
+.hi2ò
+.hu2é
+.hu2í
+.hu2ó
+.hu2à
+.hu2è
+.hu2ò
+gu2a
+gu2e
+gu2i
+gu2o
+qu2a
+qu2e
+qu2i
+qu2o
+gu2é
+gu2í
+gu2ó
+gu2à
+gu2è
+gu2ò
+qu2é
+qu2í
+qu2ó
+qu2à
+qu2è
+qu2ò
+gü2e
+gü2é
+gü2í
+gü2è
+gü2i
+qü2e
+qü2é
+qü2í
+qü2è
+qü2i
+a1isme.
+e1isme.
+i1isme.
+o1isme.
+u1isme.
+a1ista.
+e1ista.
+i1ista.
+o1ista.
+u1ista.
+a1um.
+e1um.
+i1um.
+o1um.
+u1um.
+.antihi2
+.be2n
+.be2s
+.bi2s
+.ca2p
+.ce2l
+.cla2r
+.co2ll
+.co2n
+.co2r
+.de2s
+.di2s
+.en3a
+.hipe2r
+.hiperm2n
+.in3ac
+.in3ad
+.in3ap
+.in3es
+.in3o
+.inte2r
+.ma2l
+.mal1t2hus
+.pa2n
+.pe2r
+.pe3ri
+.pos2t
+.psa2l
+.rebe2s
+.re2d
+.su2b
+.sub3o
+.subde2s
+.supe2r
+.tran2s
+g2no
+p2si
+p2se
+p2neu
+g2nò
+p2sí
+.ch2
+.th2
+ein1s2tein
+ru1t2herford
+ni2etz1sc2he
+3exp
+3nef
+3nei
+3pr
+3ser
+a3ne
+a3ri
+bi3se
+des3ag
+des3ar
+des3av
+des3enc
+e3ism
+e3le
+e3rio
+e3ris
+es3aco
+es3af
+es3ap
+es3arr
+es3as
+es3int
+ig3n
+in3ex
+n3si
+o3ro
+qui3e
+s3emp
+s3esp
+sub3a
+ui3et
+o3gnò} \ No newline at end of file
diff --git a/tex/context/patterns/lang-ca.rme b/tex/context/patterns/lang-ca.rme
new file mode 100644
index 000000000..656141fbf
--- /dev/null
+++ b/tex/context/patterns/lang-ca.rme
@@ -0,0 +1,125 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: cahyph.tex (2003-09-08)
+% Author: Gonçal Badenes <g.badenes at ieee.org>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Hyphenation patterns for Catalan.
+% This is version 1.11
+% Compiled by Gonçal Badenes and Francina Turon,
+% December 1991-January 1995.
+%
+% Copyright (C) 1991-2003 Gonçal Badenes
+%
+% -----------------------------------------------------------------
+% IMPORTANT NOTICE:
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+% -----------------------------------------------------------------
+%
+%%% ====================================================================
+%%% @TeX-hyphen-file{
+%%% author = "Gonçal Badenes",
+%%% version = "1.11",
+%%% date = "15 July 2003",
+%%% time = "15:08:12 CET",
+%%% filename = "cahyph.tex",
+%%% email = "g.badenes@ieee.org",
+%%% codetable = "UTF-8",
+%%% keywords = "TeX, hyphen, catalan",
+%%% supported = "yes",
+%%% abstract = "Catalan hyphenation patterns",
+%%% docstring = "This file contains the hyphenation patterns
+%%% for the catalan language",
+%%% }
+%%% ====================================================================
+%
+% NOTICE: Version 1.11 is identical to version 1.10 (issued on January 17,
+% 1995) except for the updated copyright notice above.
+%
+% The macros used were created for ghyph31.tex by Bernd Raichle (see the
+% German hyphenation pattern files for further details)
+%
+% This patterns have been created using standard, conservative
+% hyphenation rules for catalan. The results have refined running them
+% through patgen. In that way, the number of hits has been increased.
+%
+% These rules produce no wrong patterns (Results checked against the
+% ``Diccionari Ortogr\`afic i de Pron\'uncia'', Enciclop\`edia
+% Catalana. The percentage of valid hyphen misses is lower than 1%
+%
+% Some of the patterns below represent combinations that never
+% happen in Catalan. We have tried to keep them to a minimum.
+%
+% *** IMPORTANT ***
+% \lefthyphenmin and \righthyphenmin should be set to 2 and 2
+% respectively. If you set them below these values incorrect breaks
+% will happen (specially at the beginning of foreign words and words
+% which begin with some prefixes).
+% *** IMPORTANT ***
+%
+% Please report any problem you might have to the authors!!!
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \message{Catalan Hyphenation Patterns `cahyphen' Version 1.11 <2003/07/15>}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-cs.hyp b/tex/context/patterns/lang-cs.hyp
new file mode 100644
index 000000000..25095ee6f
--- /dev/null
+++ b/tex/context/patterns/lang-cs.hyp
@@ -0,0 +1,12 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-cs.rme
+
+% used: a c e f h i j k l n o p r t y í ú č ř
+
+\hyphenation{
+koe-fi-ci-ent
+koe-fi-ci-en-ty
+pro-jek-ční
+úhlo-příč-ka
+úhlo-příč-ky} \ No newline at end of file
diff --git a/tex/context/patterns/lang-cs.pat b/tex/context/patterns/lang-cs.pat
new file mode 100644
index 000000000..6e9f08bde
--- /dev/null
+++ b/tex/context/patterns/lang-cs.pat
@@ -0,0 +1,3643 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-cs.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z á é í ó ú ý č ď ě ň ř š ť ů ž
+
+\patterns{
+.a2
+.a4da
+.a4de
+.a4di
+.a4do
+.a4dé
+.a4kl
+.a4ko
+.a4kr
+.a4ku
+.ale3x
+.a4ra
+.a4re
+.a4ri
+.a4ro
+.a4ry
+.a4rá
+.a4sa
+.a4se
+.a4so
+.as3t3
+.a4sy
+.a4ta
+.a4te
+.at3l
+.a4to
+.a4tr
+.a4ty
+.a4ve
+.b2
+.c2
+.ch2
+.cyk3
+.d2
+.dez3
+.d4na
+.dne4
+.dneš4k
+.d4ny
+.dos4
+.d4ve
+.d4vě
+.d4ví
+.e2
+.e4ch
+.e4ko
+.es3k
+.es3t
+.e4ve
+.f4ri
+.g2
+.h2
+.h4le
+.h4ne
+.i2
+.i4na
+.i4ni
+.i4no
+.is3l
+.j2
+.j4ak
+.je4dl
+.j4se
+.j4zd
+.jád4
+.k2
+.k4li
+.k4ly
+.kří3d
+.l2
+.le4gr
+.li3kv
+.m2
+.mi3st4
+.moud3
+.na3č4
+.ne3c
+.neč4
+.ne3š
+.ni2t
+.no4s3t
+.n4vp
+.ná1
+.nář4k
+.o2
+.o4bé
+.ode3
+.od3l
+.od3rá
+.o4ka
+.o4ko
+.o4na
+.o4ne
+.o4ni
+.o4no
+.o4nu
+.o4ny
+.o4ně
+.o4ní
+.o4pe
+.o4po
+.o4se
+.o4sl
+.os4to
+.os3t3r
+.os4tě
+.ot3rá
+.ot3v
+.o4tí
+.o4tř
+.ově4t
+.o4za
+.oz3do
+.o4zi
+.o4zo
+.o4zu
+.o4šk
+.o4šl
+.o4ži
+.p2
+.pa4re
+.pa3tř
+.polk4l
+.po3č4
+.p4ro
+.p4rý
+.p4se
+.pu3b
+.r2
+.rej4
+.re3s
+.ro4k
+.roze3
+.roz3r
+.ru4dl
+.s2
+.s4ch
+.s4ci
+.sem4
+.se3pn
+.s4ke
+.sk4l
+.s4ká
+.s4le
+.s4na
+.s4ny
+.s4pe
+.s4po
+.st2
+.s4tá
+.s4ži
+.t2
+.u2
+.u4ba
+.u4be
+.u4bi
+.u4bo
+.u4de
+.u4di
+.u4do
+.u4du
+.u4dí
+.uh4n
+.uj4m
+.u4ko
+.u4ku
+.ul4h
+.u4ma
+.u4me
+.u4mi
+.u4mu
+.u4ne
+.u4ni
+.u4pa
+.u4pe
+.u4pi
+.up4n
+.u4po
+.u4pu
+.u4pá
+.u4pě
+.u4pí
+.u4ra
+.u4ro
+.u4rá
+.us2
+.u4so
+.u4st
+.u4sy
+.u4sí
+.ut2
+.u4vi
+.u4ze
+.u4če
+.u4či
+.u4čí
+.u4še
+.u4ši
+.u4šk
+.uš4t
+.u4ší
+.u4ži
+.už4n
+.u4žo
+.u4ží
+.v2
+.va4dl
+.v4po
+.vy3
+.v4zá
+.vý1
+.v4ži
+.y4or
+.y4ve
+.z2
+.za3
+.zao3s
+.zar2
+.zač2
+.zd2
+.z4di
+.z4dr
+.z4ky
+.z4mn
+.z4no
+.z4nu
+.z4ně
+.z4ní
+.z4pe
+.z4po
+.z4tř
+.z4ve
+.z4vi
+.č2
+.č4te
+.é2
+.í2
+.ó2
+.š2
+.še3t
+.š4ka
+.š4ke
+.š4ky
+.š4ťo
+.š4ťá
+.ú2
+.ú4dů
+.ž2
+a1
+2a.
+aa3t2
+ab3lon
+ab4lý
+ab3ri
+ab4sb
+ab2st
+ac4ci
+a2d
+a3da
+a3de
+a3di
+ad2la
+a4dli
+a4dlá
+a4dlé
+ad4me
+ad4mu
+a3do
+ado4s
+a3d3ra
+ad3ri
+a3drž
+a3du
+a4duž
+3a3dva
+ad3vo
+a3dy
+a3dá
+a3dé
+a3dě
+a3dí
+ad4úz
+ad4úř
+a3dů
+a3dý
+ae4vi
+afi2a
+a2g
+a3ga
+ag4fa
+a3go
+ag3ro
+a3gu
+a3gá
+ah4li
+ah3v
+a2i
+a3in
+ai4re
+a3iv
+a2jd
+a2jm
+aj4me
+aj2o
+a2k
+a3ke
+a3ki
+a3kl
+ak4ni
+a3ko
+a3kr
+a3ku
+a3ky
+a3ká
+a3ké
+a3kó
+a3ků
+a3ký
+al4fb
+al4kl
+al4tz
+al3ží
+am4bd
+am4kl
+am4nu
+amo3s
+am4ži
+a4nae
+a4name
+an4dt
+ane4sk
+aneu4
+an4sc
+an4sg
+an4sl
+an4sm
+an2sp
+an4sv
+an4tč
+an4žh
+ao4ed
+ao4hm
+ao4stř
+ao4tč
+ap4r.
+a4pso
+ap3t
+a4př.
+a2r
+a3ra
+ar4dw
+a3re
+a4rer
+ar4gl
+a3ri
+ar4kh
+a3ro
+a4rox
+ar3st
+a3ru
+ar2va
+a3ry
+a3rá
+a3ró
+ar3š2
+ar4šr
+a3rů
+arůs3
+a3rý
+a2s
+a3sa
+a3se
+a3sh
+a3sin
+as3ná
+a3so
+as3pi
+as4tat
+a4stk
+as4tm
+a4stru.
+as3tv
+a3su
+a3sv
+a3sy
+a3sá
+a3sé
+a3sí
+a3sů
+a2t
+a3ta
+at4ch
+a3te
+a3ti
+a4tio
+at4kl
+at3lo
+a3to
+a3tr
+at3re
+at3ron
+at3rov
+a4tru
+at4rá
+at4th
+a3tu
+a3tv
+a3ty
+a3tá
+a3té
+a3tě
+a3tí
+a3tó
+at1ř
+a4tří.
+a3tů
+a3tý
+a2u
+au4gs
+a3uj
+auj4m
+aus3t
+a3uč
+2av
+av3d
+av4d.
+av3lo
+a4vlu
+a4vlí
+av3t
+av4ti
+2ay
+ay4on
+az3k
+az3la
+az4lé
+az3ni
+a3zp
+a2č
+a3ča
+a3če
+a3či
+a3čl
+ač4má
+a3čo
+a3ču
+a3čá
+a3čí
+a3čů
+a2ň
+a3ňo
+a3ňu
+aře4k
+a3ří
+a4špl
+a4špy
+a2ť
+aú3t
+2b.
+3ba.
+ba4br
+ba4chr
+ba3ka
+ba4se
+2b1c
+b1d
+be4ef
+be4et
+bej4m
+be3p
+beu4r
+be2z3
+beze3
+b1h
+1bi
+bi2b3
+bis3
+bist4
+bi4tr
+b1j
+2bk
+3bl.
+bl4bl
+b2lem
+b2les
+3blk
+b4lán
+b2lém
+b1m
+2bn
+1bo
+bo4et
+bo4jm
+bo4ok
+bo4tr
+bou3s
+bo4šk
+b2ral
+b2ran
+2bri
+b4rodit
+b4rou
+broz4
+b2ru
+b3ru.
+b3rub
+b2rán
+2b1s2
+bs3tr
+2b1t
+btáh4
+bu2c
+bu4en
+3by.
+bys3
+by4sm
+by4tč
+by4zn
+b2z
+1bá
+2b1č
+bé4rc
+1bě.
+bě3ta
+1bí
+3bín
+bí4rc
+2bň
+b3řa
+b3ře.
+bře4s
+b1ří
+2bš2
+2c.
+1ca
+cad4l
+ca4es
+2cc
+1ce
+cech4
+ced4l
+celo3
+ce4ns
+ce4ov
+ce4ps
+cer4v
+ce2u
+2ch.
+1cha
+4chalg
+3che
+4che.
+2chl
+ch4ly
+ch4mb
+2ch3n
+2cht
+4chte
+1chu
+ch4u.
+1chy
+1chá
+2chř
+1ci
+cien4c
+cik4l
+2ck2
+c4ket
+ckte4rý
+2cl
+c3la
+c3lé
+2cn
+1co
+co4at
+co4mm
+co4žp
+c2p
+2ct
+c2ti
+ctis4
+ct4la
+ct2n
+c3tv
+c2tě
+cuk1
+1c2v
+cy2
+1cá
+1cí
+cí4pl
+2cň
+1ců
+2d.
+1da
+da3d
+da4jš
+da4kl
+da4tr
+d1b
+d2ba
+4dbat.
+d2bá
+2d1c
+dch4l
+3dch4n
+d1d
+dd4ha
+1de
+de4bre
+de3hn
+de3jd
+dej4mo
+de3kl
+de3kv
+de2na
+de2oz
+de3sl
+de4sm
+de4so
+de2sp
+des4t
+de3str
+de1x
+de4xt
+de2z
+de3zn
+dez3o
+de3čt
+de4žp
+2d1h
+1di
+di4gg
+4dind
+dis3k
+di4so
+d1j
+dj4us
+2dk
+d3kv
+3dl.
+d1la
+d4lab
+d4lak
+d3li
+1dln
+d2lou
+d3lou.
+d2lu
+d3luč
+d4láž
+d1lé
+2d1lí
+d2lů
+d1m
+1dmd
+dmýš4
+2dn
+1do
+4dobl
+4doboj
+dob4rat
+do3by
+do3bě
+do3bý
+do1d
+4do4dd
+4do4dj
+dod4n
+do3h
+doj4m
+4dokn
+4doly
+do3mn
+domoh4
+do3p
+do4pc
+dop4n
+dor2v
+do1s
+dos4p
+dos4tiv
+do3t
+do3uk
+do3uč
+do3z2
+doz4n
+do3č
+4do4čn
+doč4t
+do4žp
+4dran
+d4rap
+d1re
+d4ren
+3drobn
+d3ros
+d3rou
+d3roš
+dr4sc
+d3ruš
+d3ré
+d3rý
+d4rýv
+2d1s2
+ds4ků
+ds4po
+d1t
+d3tl
+d3tř
+1du
+dum3ř
+du3na
+du3p
+du4pn
+2dur
+du3si
+du4í.
+d2v
+d4vac
+d3ve
+d3vl
+d3vr
+d3vy
+d3vá
+d3vě
+d3ví
+1dy
+dy4su
+d3zb
+d3zd
+d3zn
+1dá
+2d1č
+1dé
+1dě
+3děj
+1dí
+2dň
+d1řa
+dře4k
+d4řep
+dře4pn
+d4řev
+d1ří
+d2řít
+2dš2
+d3šk
+d3št
+1dů
+3dů.
+dů3s
+1dý
+d2ž2
+2e.
+e1a
+ea3dr
+e2ar
+e1b
+eb4er
+ebez2
+eb4li
+e2bř
+e4ch.
+e3chl.
+e4chm
+e3cho
+e2chr
+e3chv
+e4chť
+ed4be
+ed4kv
+ed1l
+ed2ma
+e3dmn
+ed3v
+ed4ří
+e1e
+ee4th
+ee3xi
+eg4gi
+e1ha
+e1he
+ehno4
+eh4ně
+e1ho
+e1hr
+e1hu
+e1hy
+e1há
+e1hý
+e1i
+eilus3
+ej3ag
+e3jas
+e1je
+e3jed
+ej3ele
+e3jez
+ej3in
+e3jis
+ej1m
+ej3mo
+e3jmu
+ej1o
+ej1u
+eju3st
+ej3v
+e2k
+e3ka
+e3ke
+e4kly
+e3ko
+e3kr
+e3ku
+e3ky
+e3ká
+e3ké
+e3kó
+e3kř
+e3ků
+e1la
+e4lau
+el4dv
+e1le
+e1lo
+e1lu
+e1ly
+el4ze
+e1lá
+e1lé
+e1lí
+e1ml
+e4mlí
+emo3k
+e1mr
+e1my
+e3má
+e1mě
+e1mí
+e3mř
+e3mů
+e1mý
+em3že
+en4dv
+enitos4
+en4sc
+en4si
+ent3r
+e1o
+eo3by
+eoch3r
+eod3l
+eo4du
+e4ole
+eo1s
+eo2st
+eo4tř
+eo3z
+eo4zb
+eo4zd
+eoše3
+epa3t
+e2pl
+e4pni
+ep2no
+e4pný
+epoč3t
+epro4zř
+ep4tl
+ep4tm
+ep4tn
+e4ptu
+epy3
+2er
+e1ra
+er4a.
+e1re
+e1ri
+e1ro
+er3s
+er4s.
+er4sn
+e1ru
+e1ry
+e1rá
+e1ré
+e1rů
+e1rý
+e1s
+e4sag
+e2sce
+e4sin
+esi4s
+e2sk
+es4k.
+e4s4kn
+es3ku.
+es3ky
+es3ké
+e2sl
+e4s3li
+e4sly
+es2m
+e4sp.
+es4pe
+e2st
+e4st.
+e4ste
+es3tiž
+es4tol
+e4strou
+es3tán
+e1t
+e4tki
+e4tkr
+e4tli
+e4tly
+et3ri
+et3ro
+et3rů
+et1ř
+et4ún
+e1u
+eu3b
+eu3ct
+eu3d
+eu3k
+eu3m
+eu4m.
+eu3n
+eu3p
+eu3r
+eu4r.
+e4ura
+eu4ras
+eu4rg
+eu3s2
+eu3t
+e4u4t.
+eu4tra
+eu4ts
+eu3v
+eu3z
+eu3ž
+e3vd
+eve4š
+e3v2k
+e4vsk
+evy3
+evyjad4
+evypá4t
+evy4čk
+evě4tr
+ex4ta
+e3xu
+ey4or
+ey4ov
+ezaos3
+ez4ap
+ez4bo
+ez3de
+ez3dov
+ez3du
+ez4dě
+e3ze
+ez4ed2
+ez4ej
+ez4el
+ez4er
+ez4es
+ez4ez
+ez4eš
+ezis4
+ez4it
+ez4le
+ez4ná
+ez4ně
+ez4py
+ez2t
+ez4ác
+ez4áh
+ez4če
+e3zí
+e3zř
+ez4ře
+e1á
+eč4kat
+e1čt
+eč4te
+e4čti
+e4čtí
+e2ň
+e3ňo
+e3ňu
+e3ňá
+e3ón
+e1ř
+eře4k
+eř4ku
+e3ří
+e2š
+e3še
+e3ši
+e4ška
+e3šl
+eš4lá
+e3šo
+eš4to
+eštíh4
+e3ší
+eú1
+eúmy4
+eú3n
+eú3p
+eú3t
+eú3č
+ežíš4
+1f
+2f.
+fe4in
+fene4
+fe4ue
+fi4em
+fi4fl
+f2l
+f3lí
+fló4r
+fm4no
+2fn
+2fr
+f4ran
+f4ras
+3frek
+f1ri
+2fs
+fs4te
+2ft
+fu4ch
+2fé
+f2ú
+1g
+2g.
+ga4uč
+ge2s
+ghou4
+3gic
+3gin
+gi4ím
+g4lom
+2g1m
+2gn
+g4noi
+g4nos
+go1
+go4hm
+3graf
+gu4el
+gu4it
+gu3m
+gu4m.
+gus4t
+gu3v
+2h.
+ha4ag
+ha4ar
+ha4bl
+ha4br
+ha3dl
+ha4dla
+ha4ke
+has3t
+hatos4
+ha4yd
+h2b
+h2c
+2hd
+he4br
+he4id
+hej4s
+he2s
+he2u
+he3x
+hi4an
+hi3er
+hi4gh
+hi4re
+2hk
+4hla.
+h4led
+h3len
+2hli
+4h3lo.
+h3lob
+h3lop
+h3lov
+h3luj
+2h1ly
+4hlá.
+h4lás
+h3lí.
+4hlík
+2hlý
+h2m
+2h2n
+h3ne
+h4ned
+h3niv
+h4noj
+3hněd
+3hodin
+ho3str
+hos4tě
+4hove
+4hovna
+4hovny
+4hovná
+4hovně
+h2r
+hra4p
+2h1t
+h4tin
+h2tě
+h4tít
+hu4ch
+hu3mo
+hu4tň
+2h2v
+hyd1
+hy4do
+hy4ps
+hys3
+hy2t3r
+hy4zd
+h1č
+2hň
+hř2
+hř4by
+hý4bl
+h2ž
+2i.
+i1a
+ia3d
+ia3g2
+i4al.
+ias4t
+ia4tr
+i1b
+ib2l
+i2b1r
+i1ch
+i4chž
+i1d
+id4ge
+id2l
+id4lo.
+i4dlý
+i1em
+i1en
+i1et
+if1r
+ig4ne
+i1h
+i2hl
+i3hl.
+i4hli
+ih3n
+ih4na
+i3im
+i1j
+ijed4
+ij4me
+ij4mi
+i2kl
+ik3le
+ik3lo.
+ik3m
+ik4ry
+i4kve
+ik4úř
+i1l
+il4ba
+ilič4n
+i4lnu
+ilu3
+i1m
+i4mla
+i4mly
+i4mun
+i2n
+i3na
+ina3d
+in4cm
+in4dl
+i3ne
+3infe
+in4gh
+in4gp
+in4gs
+in4gt
+i3ni
+i3no
+i3nu
+i3ny
+i3ná
+i3né
+i3ně
+i3ní
+in4šp
+i3nů
+i3ný
+i1o
+io4sk
+i2ps
+i1r
+iro4s
+i1sa
+is3c
+is4ch
+is4k.
+is3ka
+is3ke
+is3ko.
+is3kr
+is3ku
+is3kv
+is3ky
+i3slav
+is3lo
+is3lé
+is3pl
+is3po
+is1t
+is4tal
+is4tat
+is4th
+ist3v
+is3tí
+i1sy
+i3sá
+i1t
+it1r
+it4rh
+it4rp
+it4se
+it4su
+i2tv
+i1um
+iv3d
+i1x
+ix4td
+i3zp
+iz1r
+i1á
+i1čl
+ič3t
+ič4tl
+ič4to
+i2ď
+i1é
+ié4re.
+i1íc
+i1ím
+i1ó
+i1ř
+iř4kl
+iř4če
+i2š
+i3še
+i3ši
+iš3k
+iš4kr
+iš4kv
+i3šo
+iš4to
+i3šu
+i3šá
+i3ší
+i2ž
+i3ža
+i3že
+i3ži
+i3žo
+i3žu
+i3žá
+2j.
+ja2b2
+jac4k
+ja4cq
+ja3d
+ja3g
+j3akt
+j1b2
+jbyst3
+2j1c
+j2d
+j3dob
+j3dok
+j3dos
+j3dr
+j3dá
+jd4ří
+j3dů
+jech4
+j3ef
+j3ex
+jez3dí
+jg4ra
+2j1h
+1ji
+ji4ch
+jih3l
+ji4mž
+j4ina
+jis3k
+jit4ro
+ji2zv
+j1j
+2jk
+j3kv
+2j1l
+j2m
+j3ma
+j3mi
+jmou3d
+2jmí
+2jn
+jne3
+j1ob
+j1od
+jod2ř
+j1oh
+j1op
+j4ora
+j1os
+jo3sv
+j2ov
+j3ovl
+j1o3z2
+2jp
+jpor4
+jpo4zv
+jpříz4
+2j1r
+2j1s2
+j4sem
+j4si.
+j4sk.
+js4ko
+js4ká
+j4s4ků
+j4s4me
+j3sn
+j4sou.
+j4souc
+js4po
+j4s4te
+2j1t
+j3tl
+ju4an
+ju3na
+ju3p
+j1us
+ju3sp
+ju3t
+ju4t.
+ju3v
+ju4xt
+ju3z
+j1už
+ju3ži
+2jv2
+j3vd
+j3vn
+2jz
+j3zb
+j3zd
+j3zk
+j3zn
+j3zp
+jád2r
+2j1č
+2jď
+1jí
+j3št
+jš4ti
+j3šť
+2jú1
+jú3n
+jú3č
+jú3ž
+2jž
+1k
+2k.
+ka4bl
+ka4ch
+ka3dl
+3kaj
+ka3ka
+3kami
+3kaně
+ka2p3l
+ka2p3r
+ka2ps
+ka4pv
+ka2př
+kas3t
+kast3r
+3kat
+ka4uč
+3kav
+3kač
+3kař
+kaš3l
+ka4šp
+2k1c
+k2d
+k2e
+ke4bl
+ke3jo
+ke4pr
+ke4ps
+3ket
+2kf
+2kk
+k2l
+3kl.
+4k3la.
+k3lej
+4k3li.
+k4lib
+k3lic
+4klička
+4klo.
+k3los
+2k3ly
+k3lá.
+k3lé
+k3ló
+k3lý
+2k2m
+k3mě
+2kn
+kna4s
+ko3by
+3kof
+ko4jm
+ko2př
+ko4sk
+ko2t3v
+kous3k
+3kov
+ko3zá
+4kroa
+k3rob
+k3rof
+kr2s
+kr4ú.
+2ks
+2k1t
+kt2r
+kuch4
+ku4fř
+ku4hr
+3kuj
+ku3se
+ku3si
+ku3su
+ku4th
+ku3v
+2k2v
+k4vrň
+3kyn
+ky2pr
+kyp3ř
+ky4zn
+3kác
+ká4pl
+3kár
+3kář
+2kč
+k2ň
+k2ř2
+k3řej
+kš4ti
+3ků.
+2l.
+1la.
+la4br
+lab4s
+la3ka
+la4nq
+la4ps
+4la3si
+la4vš
+la4y.
+la2zm
+2l1b
+2l1c
+2l1d
+ld4ne
+le4ad
+le4au
+lech3t
+leh3n
+le2i
+1lej
+le3jo
+4lejšk
+1lel
+4lench
+lepa3d
+lepo4s
+le4pr
+le4ps
+le4sc
+le4sm
+le4sv
+let4li
+let3m
+le2tr
+le4tč
+le4uk
+le4vh
+le4vk
+le3xi
+lez3n
+2lf
+2lg
+2lh
+3lhan
+1li
+li4az
+li4bl
+li4bv
+li4dm
+lind4
+3lio
+li4tň
+li4vr
+2liž
+2lj
+2lk
+l4kat
+l2kl
+lk4nu
+2ll
+2l1m
+2ln
+l4nul
+lo3br
+lo4id
+lo4is
+1los
+lo3sp
+lo3stř
+lo3sv
+lo2tr
+lo4tř
+lo4u.
+lo3z
+loz4d
+lo4šk
+2lp
+l2pě
+2l1s2
+l4sla
+ls3n
+lst4n
+l4stí
+2l1t
+lt4ra
+lt4ru
+lt4ry
+lu4id
+lu4j.
+lu4k.
+lu4lk
+lu4m.
+lu4mn
+lu3pr
+lu3va
+lu3vl
+lu3vy
+lu3ví
+2lv
+2lz
+1lá.
+lá4jš
+lá4vš
+2l1č
+1lé.
+1lík
+lí4pl
+lí4zn
+1líř
+2lň
+2lš2
+l3št
+l4štý
+1lů
+1lý
+lý2t
+2l2ž
+2m.
+1ma
+maj4s
+ma4kl
+ma4kr
+4mald
+mas3k
+mat3r
+ma4tra
+ma4vš
+maz3l
+2m1b
+2m1c
+2m1d2
+m2dl
+1me
+3me.
+me4go
+me4is
+met3re
+me3x
+mezi3s
+2mf
+mh4le
+1mi
+mid3l
+mik3r
+mi4xt
+2mk2
+3m2kl
+mk4la
+mk4li
+m2l
+4mla.
+2mle
+ml3h
+ml4h.
+2mli
+ml4sc
+ml4sk
+4mlu.
+2mn
+m3na
+mna4s
+m4noh
+m3nos
+m4noz
+3množ
+m3ná
+m3né
+m4néz
+m3něj
+m3ný
+1mo
+mod3r
+mo2hl
+mo2k
+mo2s
+mo4s.
+mot3ř
+4mout
+moza4
+mo3zř
+moú3
+2mp
+m4plo
+mpo4s
+m2ps
+mp4se
+mp2t
+mr2s
+2m1s2
+m4stl
+2m1t
+1mu
+mu4fl
+mu3n
+mu4n.
+mu4nd
+mu4nn
+mu4ns
+mu4nš
+2muš
+2mv
+mys3lo
+my4šk
+2mz
+3má.
+málo3
+má2s
+2mč
+m2če
+mí1c
+mí4rň
+2m2š
+mš4či
+mš3ť
+mš4ťan.
+3mů.
+3mý.
+m2ž
+1n
+2n.
+3na.
+na3ch
+na4do
+na4em
+na3h
+na4h.
+na3jd
+na3ka
+nam4ne
+na3p2
+na3s2
+na4s.
+nat2
+na3tl
+na3tř
+na3z
+naz4k
+na4zš
+na4č.
+na3š
+naž4n
+2nb
+2n1c
+n4chc
+2n1d
+nd4hi
+ndo4t
+nd2re
+nd4ri
+nd4ří
+ne1d
+ne4gl
+ne1h
+ne3h4n
+ne2j
+nej3t
+nej3u
+ne3kl
+ne4kro
+ne3kv
+ne4m.
+ne3p
+ne3s2
+ne4s.
+nes4le
+ne4ss
+4nesti
+ne3tl
+net4r
+ne3ud
+ne3v2
+ne4v.
+ne3z
+nez4n
+ne3šk
+ne3šť
+2nf
+n3fr
+2ng
+ng1l
+ng4la
+ng4le
+ng4lí
+n4gro
+ng4vi
+nik4t
+ni4mr
+ni4mž
+3nio
+3nisk
+2nitř
+n1j
+2nk
+2n1l
+2nn
+no3b2
+no4bs
+no3hn
+no4hs
+no4ir
+no4mž
+no4sky
+no3sm
+no3str
+not4r
+no3z
+no4zd
+no4šk
+2nož
+2n1s2
+n2sa
+ns3ak
+ns4ko
+n4soc
+ns3po
+nst4ra
+2n1t
+nte4r3a
+nt4lem
+nt4r.
+nt3ru
+nt3rá
+2nub
+nu4gg
+3ny.
+2nz
+3nák
+ná3s2
+ná4s.
+2n1č
+2nď
+2nív
+2níž
+2nó
+2nš2
+n3št
+nš4ťo
+nů2
+2nž
+2o.
+o1a
+oang4
+o1ba
+o1be
+obe3j
+obe3s
+obe3z
+ob1l
+ob1r
+ob4rň
+o1bu
+obys4
+ob3z
+o3bé
+ob3řez
+o1c
+o4chl
+o2chr
+oc4ke
+oc4ko
+o4ct.
+oct3n
+ocy3
+oc4ún
+od3b
+odej4m
+ode3p
+ode3s
+od1l
+o4doc
+odos4
+odo4tk
+od3ra
+od4ran
+od3rů
+o3drž
+od3v
+od1ř
+o1e2
+oe3g
+oe3ti
+o2fl
+ofrek4
+og2
+o3gn
+o1h
+oh4ne
+o1i
+oi4ce
+o4int
+o1j
+o4jar
+oje4dl
+o4jmi
+o4jmov
+o4jmu
+o4jmů
+oj2o
+o4juz
+2oka
+ok2te
+o1l
+ol4gl
+ol4to
+o1m
+om4kl
+om2n
+o2n
+o3na
+ona4s
+o3ne
+o3ni
+o3no
+ont4ra
+o3nu
+o3ny
+o3ná
+onář4ka
+o3ně
+o3ní
+o3nů
+o3ný
+o1o
+oo4hř
+oote2
+opoč3t
+opro4s
+o2ps
+o4ptu
+opá4t
+o4př.
+opřej4
+opře4jm
+o1ra
+o4rae
+or4dm
+o1re
+o1ri
+o1ro
+or3st
+o1ru
+or4vá
+o1ry
+o1rá
+o3ré
+o1rů
+orůs3
+o3rý
+o1sa
+o4sai
+ose4s
+osi4d
+o1sk
+o4s3ke
+o4sku
+osk3v
+o4ská
+o4ský
+o1sl
+os4la
+os4li
+os4lý
+os3mo
+os4mu
+o4st.
+o4stg
+o4stm
+os4tor
+os3trů
+o4sté
+o4stš
+o4stý
+o1sy
+o1t
+ot4kl
+o4tlý
+oto3s
+ot3ro
+ot3ví
+o3tí
+o3tř
+ot3ři
+o2u
+ou3bě
+ou3dě
+ou4fl
+ou4il
+ou4is
+ou4k.
+ou3ka
+o4ukl
+ou3kr
+ou3ká
+ou3m
+oup3n
+oupo4
+ou4s.
+ou3sa
+ou3se
+ou4sk
+ou3sm
+ou4tv
+ou3v
+ou4vl
+ou4vn
+ouz3d
+o4učk
+ou3ži
+ovi4dla
+o4vsk
+ovy2p
+o2všt
+o1x
+o2z
+o3za
+oz1b
+oz4d.
+oz3dá
+oz3dě
+oz3dí
+o3ze
+oze3d2
+ozer4
+oz1h
+o3zi
+oz3j
+oz3k
+oz4ko
+oz1l
+oz3m
+o4zn.
+o3zo
+oz3p
+oz4py
+oz4pě
+oz4pí
+oz3ro
+oz3ru
+oz3rů
+oz3t
+o3zu
+o4zut
+oz3vr
+oz3vá
+o3zí
+o3zů
+ozů4s
+o1č
+oč2k
+oč4ka
+o2ň
+o3ňa
+o3ňo
+o1ř
+oři2s
+o3šk
+o4šku
+o4šky
+o3šl
+oš4lá
+oš4mo
+oš4ti
+oš4ťu
+o3žl
+ož4mo
+1p
+2p.
+pa4ed
+pa4es
+pa4kl
+pa3si
+pa4t.
+pat4ri
+2p1c
+pe4al
+pede4
+pe4ig
+pe4np
+peri3
+pes3t3
+pe4tra
+3peč
+pi4kr
+pi4pl
+2pk
+p2kl
+p2l
+3pl.
+4p3la.
+pl3h
+pl4h.
+4p3li.
+4plo.
+2pn
+p2nu
+po1b2
+po3c2
+3pod
+podbě4h
+pod4nes
+po3dru
+po3drá
+po3h
+poly3
+po3m2
+po4mp
+po4ol
+po3p
+po4p.
+po4pm
+po1s2
+pos4p
+post4r
+po3t2
+po4t.
+po4tn
+po3uk
+po3uč
+po3už
+3po3v
+po3z2
+po4zd
+poč2
+po3čk
+poč3te
+po3ří
+po4šv
+2pp
+4pra.
+pra3st
+pr2c
+pro1
+prob2
+pro3p
+pro3t4
+pro3z
+pr2s
+4prán
+prů3
+pse4s
+2p1sk
+p4sut
+2pt
+p4tej
+p4ter
+p4tev
+pt4ri
+p3tu
+p4tá.
+pu4dl
+pu4tr
+pyt3l
+pá1
+pá2c
+pád3l
+pá4nv
+pá4sl
+2pč
+pé4rh
+2př.
+pře3h
+pře3j
+pře3t4
+pře3z
+pře3č2
+při3
+přih4
+2pš
+pš4ti
+2pť
+qu2
+2r.
+1ra.
+ra4br
+ra4em
+ra4es
+ra4ff
+ra4hl
+ra4hm
+ra4jg
+ra4jš
+2rak
+ra4nh
+ra3si
+rast4r
+ra4vv
+ra4wl
+ra4y.
+ra4yo
+ra4ďm
+4raži
+r1b
+r2bl
+r1c
+rca3
+r3cha
+r3cho
+rc4ki
+r1d
+r4dla
+rdo2s
+re4ad
+re4au
+red4r
+re4et
+re3kl
+re3kvi
+re4mr
+re2sb
+res3l
+retis4
+ret4r
+re4um
+r1ha
+r3hl.
+rh3n
+r1ho
+r3hu
+r1há
+ri4bb
+1ric
+ric4ku
+ri4dg
+ri4dr
+ri4fl
+ri4gh
+ri4zm
+2rk
+r2kl
+r1l
+2r1m
+r4mio
+2rn
+rna4vš
+rn4dr
+ro4ad
+ro3by
+rod2l
+ro3d4r
+3rofy
+ro3h
+ro4h.
+ro4jb
+ro4kš
+rom3n
+romy4s
+ropát4
+ro2sb
+ro4skv
+ro4sky
+ro3sv
+ro3ti
+ro3tl
+ro4tč
+ro3vd
+rově4t
+3rový
+roz3d
+roz3n
+ro4zo
+roz3v
+ro3zá
+ro4čp
+rpa3d
+2rr
+rr4ha
+rr4ho
+2r1s
+r2st
+r4stu
+rs3tvě
+rs3tvý
+2r1t
+r2th
+r4trá
+rt4sm
+rtu3
+r2t3v
+rt4zu
+1ru.
+ru3se
+ru3si
+rus3k
+ru3ži
+3rvaní
+r1x
+1ry.
+rych3
+ryd2
+rys3ky
+rys3t
+ry4zk
+ry4zn
+ry4í.
+ry4šk
+2rz
+rz3d
+rz3l
+rád4l
+rá4dž
+1rák
+rá3ri
+1rář
+r1č
+4rčitý.
+rč3t
+3ré.
+2ró
+2rš
+rš4ní
+rů4m.
+růs3ta
+rů4v.
+3rý.
+rý4zn
+2s.
+sa4pf
+sa4pr
+sas3k
+s2b2
+s2c
+s3ca
+s3ce.
+sch2
+sch4l
+sch4n
+3schop
+s3ci
+sci4e
+s3cí
+s2d
+1se
+se4au
+se3h
+se4ig
+se4il
+sej4m
+se4ku
+3sel
+se3lh
+3sem
+ser4va
+se3s2
+ses4k
+se4ss
+se4stra
+se4stru
+se4stř
+set2
+se3tk
+se3tř
+se4ur
+se3z
+se3čt
+2sf
+s3fo
+3sfé
+s3fú
+1si
+3sic
+3sif
+si4fl
+sig4no
+3sik
+si3ste
+3sit
+s2j
+s3ju
+s2k
+4skac
+s4kak
+4skam
+s4kok
+2skon
+skos4
+4skot
+sk4ra
+sk4ru
+sk4ry
+4skve
+sk4vo
+s3kán
+s3ků
+3sl.
+4s3la.
+s4lav
+s3le.
+s4led
+s3lem
+s3len
+s3let
+s4lib
+s4liči
+3sln
+4s3lo.
+s2ly
+s3ly.
+s1lí
+s2ma
+s4mek
+s2mo
+2sn
+s2na
+s3nat
+s2ne
+s3ne.
+sn4tl
+s2ná
+s3ná.
+s4níd
+1so
+sob4l
+so3br
+so4sk
+so4tv
+sou3h
+sou3s
+souz4
+so4šk
+s2p
+s4pol
+spro4s
+1sr
+2ss
+ss4sr
+2st.
+4sta.
+s3taj
+s2tan
+st4at
+4stec
+s4tep
+st4er
+s4tero
+s4tich
+2stil
+s4tink
+4stit.
+4stič
+st3lo
+2stn
+4sto.
+s4tona
+4stou.
+4str.
+4stram
+s4trik
+4strn
+4strác
+4stupni
+s2tv
+st4ve
+3ství
+4sty.
+s4tyl
+3styš
+s2tá
+4stá.
+s3tář
+4stě.
+s4těd
+3stěh
+s2těr
+s2těž
+s1tí
+2stí.
+s3třej
+1su
+su4ba
+su4bo
+suma4
+su3ve
+s2v
+sy3c
+sych3r
+sy4nes
+sá2d
+3sáh
+sá2kl
+2s2č
+s3či
+1sé
+1sí
+2sň
+2sť
+s3ťo
+1sů
+s2ž
+2t.
+1ta.
+ta2bl
+tac4tvo
+t2a3d
+1taj
+ta4jf
+ta4jg
+4talt
+4tand
+3taně
+t1ao
+2tark
+tast4
+ta3str
+ta4čk
+2t1b
+2t1c
+1te
+3te.
+te4ak
+te4fl
+te4in
+4teném
+teob4
+tep3l
+ters4
+tes3ta
+te4tr
+te4uc
+te4ur
+te4ut
+2tf
+2tg
+1ti
+ti4gr
+2tih
+ti3kl
+tin4g
+ti4pl
+ti3sl
+tis4tr
+ti4tr
+2titu
+tiz4r
+4tizí
+tiú3
+2tiž
+2tk2
+t4kal
+4t2kan
+t4kat
+t2kl
+tk4la
+tk4li
+4tkně
+t2ká
+2tl
+3tl.
+4tla.
+t1le
+tles3
+3tlm
+t3lo.
+t4lou
+tlu3
+tlu4s
+t1ly
+t1lé
+2tm
+t2ma
+2tn
+t3ní
+1to
+to4as
+to3b
+tob4l
+to3dr
+to4hm
+to4ir
+2toj
+tol4s
+to4ol
+4top.
+4topt
+4topu
+2torn
+2toup
+2tp
+t3rant
+t4rea
+t4ref
+tre4t
+4tric.
+trip4
+t4rit
+t4rog
+t3rol
+tro4sk
+t4rou
+4trouh
+4troň.
+4trun
+t4rus
+4t4ruž
+t3ráln
+4tráš
+2trč
+t3rům
+t3rův
+2trý
+2t1s
+ts4ko
+ts2t
+2t1t
+tt4ch
+tt4ri
+1tu.
+tu4ff
+1tuj
+tu4lk
+2tup
+tu4r.
+tu3ry
+tu4s.
+tu4ť.
+tu3ži
+t2v
+2tve
+2t3vi
+t4vinn
+t4viš
+t4výc
+1ty.
+ty4gř
+ty2la
+ty4ře
+ty4řh
+ty4řj
+ty4řo
+ty4řr
+ty4řú
+3tá.
+tá4fl
+t2č
+t3či
+2tčí
+1té
+té2bl
+3tém
+1tě
+tě3d4l
+2těh
+2těnn
+2těp
+1tíc
+4tíc.
+4tíce
+1tím
+2tín
+2tír
+2tř
+t4řeb
+třeh3n
+t2řel
+t2řic
+t3řil
+tř4ti
+t1řu
+t2řá
+3třáb
+tří4s
+2tš
+t3št
+tš4ti
+1tů
+1tý.
+1tým
+1týř
+3týš
+u1
+2u.
+u2at
+u2b
+u3ba
+u3be
+u3bi
+u3bo
+ubs4t
+u3bu
+u3bá
+u3bí.
+u3bů
+uc4tí
+2u2d
+u3de
+u3di
+u3do
+u3dru
+u3du
+u3dy
+u3dí
+ue4fa
+2uf
+u2hl
+uh3lá
+uh3no
+u2in
+u2jm
+u2k
+u3ka.
+uk4aj
+uk4al
+uk4at
+u3ke
+uk3la
+uk3le
+u3ko
+u3ku
+u3ky
+uk4á.
+u3ků
+ul4fa
+ul1h
+ul4pí
+u2m
+u3ma
+u3me
+u3mi
+um4pl
+um4ru
+u3mu
+u3má
+3umř
+u2n
+un4dl
+u3ne
+u3no
+u3nu
+u3ně
+u3ní
+u3nů
+un4žr
+u2p
+u3pa
+u3pe
+upe2r3
+u3pi
+u3pln
+u3pu
+u3py
+u3pá
+u3pě
+u3pí
+u3pů
+u2r
+u3ra
+u3re
+u3ri
+2u3ro
+u3ru
+u3ry.
+u3rá
+1urč
+u3rů
+u2s
+us3ky
+us3ká
+us3ké
+us3ký
+us1l
+us2lo
+u3so
+u4ste
+u4sty
+u4sté
+u4stě
+u3stř
+u4stš
+u4stý
+u3su.
+u3sy
+u3sá
+u3sí
+u3sů
+u4tro
+u4trá
+u2v
+u3vi
+u3vu
+u2z
+u3ze
+u3zi
+uz1l
+u3zo
+u3zu
+u3zí
+u2č
+u3ča
+u3če
+u3či
+u3čo
+uč3t
+u3ču
+u3čá
+u3čí
+u2ď
+u2ň
+u2š
+u3še
+u3ši
+uš4kl
+u3šo
+uš3tí
+u3šu
+u3šá
+u3ší
+u2ž
+u3že
+u3žo
+u3žu
+u3žá
+u3ží
+1v
+2v.
+va3dl
+va4jť
+va4kl
+2v1b
+2v1c
+v2ch
+2v2d
+v4dal
+v3di
+v4děk
+v4děč
+ve3dle
+ve3jd
+3ven
+ve2p
+ve3ps
+vep3ř
+ves3l
+ve4sm
+ves4p
+ve3sta
+ve3t4ř
+ve2z3m
+vi4ch
+vide2
+vi4dr
+vi4et
+vi4kr
+vi2tr
+2vk
+v2kr
+v2l
+2v3la.
+4vle.
+4vlem
+2vlo
+2vm
+2vn
+v4nad
+vo3b
+vo4ic
+vo4ja
+vo4jb
+vo4jd
+vo4jj
+vo4jm
+vo4jř
+vo2s
+vo4tř
+vou3
+vous2
+v2p
+vr2c
+vr2dl
+4vrny
+v1ro
+vr4st
+vrst3v
+vrs4tvě
+2vs2
+v1sk
+v3stv
+2v2t
+vy3c
+vy3d2
+vy4dra
+vyp2
+vy3s2
+vy4sn
+vys4t
+vy3t
+vy3č
+vyč4k
+vyš2
+vy4š.
+vy4šm
+vy4šš
+vy4žl
+v2z2
+vz4no
+vz4né
+vz4ně
+vz4ní
+vá3ri
+2v2č
+v3čá
+v3čí
+v4čír
+vě4cm
+vě3t4a
+více3
+ví4hat
+3vín
+2vň
+2vří
+v3řín
+v2š2
+vše3s
+v3ští.
+3výs
+vý3t
+3vý3z
+v2ž2
+wa4fd
+3war
+wa4re
+we2
+2x.
+xand4
+2xf
+xisk4
+2xn
+3xov
+x1t
+xt4ra
+xy4sm
+y1
+y2a
+y2bl
+yb3ri
+y2ch
+y4chr
+y2d1l
+yd4lá
+y2dr
+yd4y.
+y2e
+y2gr
+y3hn
+yh4ne
+yj4ma
+yj4me
+y2kl
+yk3la
+y3klop
+yk4ly
+ymané4
+ym4kl
+yna4s
+y3ni
+ype4r
+yp4si
+yp4tá
+y2př
+yr2v
+y2s
+y3sa
+y3se
+y3si
+ys3lu
+y3sm
+y3so
+y3sp
+ys2t
+ys3te
+yst4r
+y3su
+y3sv
+y3sy
+y3sá
+y3sé
+y3sí
+yt4me
+yu3ž
+y3vs
+yvě4t
+y3zb
+y3zd
+y3zk
+y3zn
+yz4ně
+yz4ní
+y3zp
+yz4po
+yč2k
+y2ň
+yř3b
+yřk4n
+yř4če
+y3ří
+y2š
+y3še
+y3ši
+y3šk
+yš1l
+y3šo
+y3šp
+y3šu
+y3ší
+yž2
+y3žd
+1z
+2z.
+zab2l
+za4bs
+za4dk
+za3dl
+za4dn
+za3h
+za3i
+za3j
+za4jk
+za3k
+za4kt
+zal4k
+zam4n
+za3p2
+za3s2
+zat2
+za3tl
+zat4r
+za4ut
+za3z
+zaz4n
+za4zš
+za4č.
+za3š
+zaš4k
+za4šs
+2zb
+zban4
+z2by
+zbys4
+2z1c
+2z2d
+z3di
+zdně4ní
+z4doba
+z4dobný
+zd4re
+zd4ví
+z2e
+ze3h
+ze3p2
+4zerot
+ze3s2
+zes4p
+zet2
+zev2
+ze3vn
+ze3z
+ze4z.
+2z2f
+z1há
+z4ine
+z2j
+z3jí
+2z2k
+z3ka.
+z3ky
+z3ké
+z3ků
+z3ký
+2zl
+3zl.
+zlhos4
+zlik3
+z3ly.
+z2m2
+2zme
+z3mn
+z3my
+z4měn
+2z2n
+3znak
+z4nal
+z3ne.
+z3nic
+z3no
+z3nu
+z3ny
+z3né
+z3ně
+z4něl
+z3ní
+z4nít
+z4nív
+z3ný
+zo4tr
+zo4šk
+2z2p
+z3pt
+z4pát
+3zrak
+2z1s2
+2zt
+ztros3
+z4trá
+z3tř
+3zu.
+zu3mo
+zu3mě
+zu3mí
+zu3š
+z2v
+zva4d
+z3vař
+z3vi
+zvik4
+zv4ně
+z3vod
+z3voj
+z4von
+zv4ro
+z4ván
+z4věs
+z3víj
+3zy.
+2zz
+zá1
+záh2
+zá4kl.
+3záp
+zá3s2
+zá3z
+záš2
+2zč
+z3čl
+2zň
+z2ř
+zřej3
+z3řez
+z3řeš
+2zš2
+z3šk
+zš4ka
+z3št
+2z2ú1
+zú3č
+zú3ž
+zů3s
+á1b
+á2bl
+áb4ry
+á4bř.
+á3cho
+ác3ti3
+á1d
+á2dl
+ádo4s
+ádos4ti
+ád1ř
+á1ha
+á3he
+áh1l
+á3hl.
+áh3n
+á1ho
+á1hr
+á1há
+á1j
+á4jmu
+áj4mů
+á4kli
+ák4ni
+á1la
+á1le
+á1lo
+á1lu
+á1ly
+á3lé
+á1lí
+á3my
+á3mé
+á1mě
+á3mí
+á3mý
+áne4v
+á1ra
+á1re
+ár2m
+á1ro
+á1ru
+á3rů
+á1s
+á2sc
+á2s3k
+ás4k.
+ás4kl
+ás4kn
+á2sla
+ás4ly
+á2sm
+ás4po
+á2st
+át3k
+át1r
+á1tu
+á1ty
+á1tí
+á3tý
+áv4si
+áv4sí
+áz3k
+áz3ni
+ázni4c
+áz4vi
+á2ň
+á1ř
+ář4ke
+ář4ků
+á2š
+á3še
+á3ší
+2č.
+1ča
+ča4br
+2čb
+2č1c
+1če
+3če.
+če1c
+čes3k
+1či
+2čk
+č3ka.
+č3ko
+č3ku
+č3ky
+2č1m
+2čn
+č2ne
+1čo
+č2p
+2čs
+č1sk
+čs4la
+čs4sr
+2č2t
+č4tené.
+č4tený
+čt4la
+č4tový.
+3čtv
+4čtěn
+č3tí
+1ču
+1čá
+1čí
+čís3l
+1čů
+2ď.
+1ďa
+1ďo
+ďs4te
+2ď1t
+3ďuj
+é1
+é2d
+é3di
+é3do
+é2f
+é3fo
+éf1r
+é2kl
+é2l
+é2m
+é3ma
+é3me
+é3mi
+é3mo
+é3mu
+é3mů
+4ére.
+é2s
+é2t
+é3ta
+é3to
+é3tá
+é2š
+é2ž
+ě1c
+ěd3r
+ě3ha
+ě3he
+ě3hl.
+ěh3lo
+ěh3n
+ě1ho
+ě3hu
+ě3hů
+ě3ja
+ě1je
+ě1jo
+ě3jů
+ě4klé
+ě3k2t
+ě1l
+ě1ra
+ěra3d
+ě1re
+ě1ro
+ěr3s
+ěrs4t
+ě1ru
+ě1ry
+ě1rů
+ěs3k
+ěs3n
+ět1a3
+ět4ac
+ět1l
+ě1tr
+ět3ra
+ě4traj
+ět3v
+ě1tí
+ět3ří
+ě2v
+ě3va
+ě3ve
+ě3vl
+ě3vo
+ě3vu
+ě3vá
+ěv3č
+ě2z
+ě3ze
+ě3zi
+ěz3n
+ě3zo
+ě3zí
+ě1ř
+ě2š
+ě3še
+ě3ši
+ě3šo
+ě3šu
+ě3šá
+ě3ší
+ěš3ť
+ěš4ťs
+ě2ť
+ě3ťo
+ě2ž
+ě3že
+ě3ži
+ě3žo
+ě3žu
+ě3ží
+í1b
+íb3ř
+í3cho
+ích4t
+íd1l
+í1h
+í2hl
+íh3n
+í1j
+íjed4
+íj4mů
+í2kr
+í1l
+í1má
+í3mé
+í1mě
+í1r
+í1sa
+í2s3k
+ís4kl
+ís4kn
+ís4l.
+ís3le
+ís4ln
+ísáh2
+í1t
+ít3k
+í3t3ře
+íz3da
+íz3de
+íz3k
+í3zna
+í3z3ni
+í3zněn
+í2ň
+í1ř
+í2š
+í3še
+í3ši
+í3šo
+í3ší
+1ň
+2ň.
+2ňa
+ňa3d
+2ňk
+2ňm
+3ňov
+ň1s
+2ň1t
+ó1
+ó2z
+ó3za
+ó3zi
+ó3zo
+ó3zy
+2ř.
+řa4pl
+řa4ďm
+2ř2b
+2řc
+2řd
+ře3ch
+ře4dob
+ře1h
+ře3jd
+ře3kl
+ře3kv
+ře4kří
+řeo4r
+ře3p2
+ře4p.
+ře4pk
+ře4pč
+řer4v
+2řes
+ře3ska
+ře3sko
+ře2sp
+řes3po
+ře4sr
+ře3sta
+ře3stu
+ře3stá
+ře3stř
+ře3tl
+řet4ř
+ře3zd
+ře3zk
+4řezl
+ře3čt
+ři1
+řia3
+ři3h
+ři4h.
+ři4hn
+ři4jď
+ři4l.
+ři4lb
+řil2n
+4řine
+řis2
+3ři4t.
+ři4v.
+ři4vk
+ři4vn
+ři3z
+řič4t
+ři3ř
+ři4š.
+2řk
+ř2kl
+řk4la
+řk4li
+řk4ly
+řk4no
+2ř1l
+2ř1m
+2řn
+1řo
+2řou
+2ř2p
+2ř1s
+řs4to
+2ř1t
+ř2v
+2řz
+řá4pl
+řá2sl
+2ř1č
+2říd
+ří4kř
+ří1s
+2řš
+ř3št
+řš4ti
+1š
+2š.
+šab3
+ša4vl
+2š1c
+šej4d
+šep3t
+ši4mr
+2š2k
+š3ka
+š3ke
+š3k3li
+4š3kou
+4škov
+3škr
+šk4ro
+š3ku.
+š3ky
+2šl
+š2la
+š2li
+š3liv
+š2lo
+šlá2
+š2lé
+š2lý
+2š1m
+šmi4d
+2šn
+š2p
+2š1s
+2št
+š4tip
+št4ka
+št4kl
+š4těk
+š2těs
+š4těv
+š4típ
+š2v
+ší3d
+š2ň
+š3ší
+2š2ť
+š3ťo
+š3ťu
+š3ťá
+1ť
+2ť.
+3ťal
+2ťk
+2ťm
+2ťt
+ťáč4k
+1ú
+ú2c2
+ú2d
+új4ma
+ú2k
+ú2l
+ú2n
+ú2p
+ú2t
+út4ko
+ú2v
+ú2z
+úz3k
+ú2č
+3úče
+úře4z
+úš4ti
+ú2ž
+ů1b
+ů1c
+ů1hl
+ů3jd
+ů4jmový
+ů1le
+ů1my
+ů1mě
+ů1ra
+ůr4va
+ůr4vy
+ů1s2
+ů2st
+ůs3te
+ůs3tán
+ůt2
+ů3tkl
+ů2v
+ů3va
+ů3vo
+ů3vě
+ů2z
+ů3zo
+ů2ž
+ů3že
+ů3ži
+ů3žo
+ý1b
+ý3cho
+ý1d
+ýd4la
+ý1h
+ý1j
+ý1l
+ý1ml
+ý1mě
+ý2n
+ý3no
+ýpo3č4
+ý1r
+ý1s2
+ý2sk
+ý1t
+ýt4ku
+ýt4ky
+ý1u
+ý4vli
+ý3zk
+ý3zn
+ý4zvu
+ýč4ně
+ý1ř
+ýš3l
+1ž
+2ž.
+ža3d
+ža4tv
+3žač
+2ž1b
+2ž1c
+2ž1d
+že2b3
+žeh3n
+že4ml
+že4zg
+ži4dl
+ži4jm
+3žil
+ži2vl
+2žk
+žk4ni
+2žl
+ž4lic
+3žlo
+2ž1m
+2žn
+žon2
+2ž1s2
+2ž1t
+ž2v
+žá4br
+žá4nr
+2žď
+ží4zn
+2žň
+2žš
+žš4ti
+žš4tě} \ No newline at end of file
diff --git a/tex/context/patterns/lang-cs.rme b/tex/context/patterns/lang-cs.rme
new file mode 100644
index 000000000..672dac5a9
--- /dev/null
+++ b/tex/context/patterns/lang-cs.rme
@@ -0,0 +1,85 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: czhyphen.tex (), czhyphen.ex ()
+% Author: Pavel Ševeček <pavel at lingea.cz>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+%%% ====================================================================
+% This is CZHYPHEN.TEX, containing czech hyphenation patterns.
+% Prepared by:
+% Pavel Ševeček
+% Lingea s.r.o., Brno, Czech Republic
+% E-mail: pavel@lingea.cz
+%
+% This is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This file is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+%%% --------------------------------------------------------------------
+% \message {Czech Hyphenation Patterns (Pavel Sevecek, v3, 1995)}
+%\lefthyphenmin=2\righthyphenmin=2 \ No newline at end of file
diff --git a/tex/context/patterns/lang-cy.hyp b/tex/context/patterns/lang-cy.hyp
new file mode 100644
index 000000000..ba7bd489a
--- /dev/null
+++ b/tex/context/patterns/lang-cy.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-cy.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-cy.pat b/tex/context/patterns/lang-cy.pat
new file mode 100644
index 000000000..b0c9ed793
--- /dev/null
+++ b/tex/context/patterns/lang-cy.pat
@@ -0,0 +1,6735 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-cy.rme
+
+% used: a b c d e f g h i l m n o p r s t u w y á â ê ë ï ô ö
+
+\patterns{
+.ac4t
+.ad3ae
+.add5as
+.add3o
+.ad4eg
+.ad4eny
+.ad4fer
+.adl4
+.ad3r
+.ae3a
+.af3a
+.af4an
+.aff3
+.afl4u
+.af5lw
+.ag3w
+.am4le
+.am3s
+.an5ad
+.an4g3
+.anghen5a
+.anghen4r
+.an2o
+.anrhyd4
+.ansodd4e
+.an5te
+.an3w4
+.an5we
+.ar4bo
+.ar4cha
+.ar5ddel
+.ared4
+.ar4en
+.arff4
+.ar4ge
+.ar2i
+.ar3we
+.ar4wed
+.as3g
+.as3t
+.aw4e
+.ban4as
+.ban4ed
+.bara5t
+.bel3y
+.be3t4a
+.bl2
+.bl4e
+.br2
+.br4e
+.call5
+.ce4n
+.ch2
+.ch4e
+.ch4l
+.ch4o
+.chollad4
+.chr2
+.chwyn5
+.cl2
+.cr2
+.cy5we
+.dad3r
+.dd2
+.ddefn5
+.dd4i
+.ddi5an
+.ddi5dd
+.ddi3e
+.ddill5adas
+.ddill5ade
+.ddill5ado
+.ddill5adw
+.ddin4
+.ddiw5eddas
+.ddiw5edde
+.ddiw5eddo
+.ddiw5eddw
+.ddwl3
+.ddy5fala
+.ddy5fale
+.ddy5falo
+.ddy5falw
+.ddylad4
+.deallad4
+.defn3
+.der4w
+.deth5
+.di5an
+.di5dd
+.di3e
+.di3gy
+.dill5adas
+.dill5ade
+.dill5ado
+.dill5adw
+.din4
+.diw5eddas
+.diw5edde
+.diw5eddo
+.diw5eddw
+.dr4e
+.dwl3
+.dy5fala
+.dy5fale
+.dy5falo
+.dy5falw
+.dy5fo
+.dylad4
+.dyrchafad4
+.eb2
+.eb3r
+.eb4rw
+.ec2
+.ed2
+.edl4
+.edr4
+.eg2
+.egn3
+.el4or
+.els4
+.en3as
+.eny5na
+.er2
+.erfy5na
+.ern4
+.ewy5na
+.fadd3
+.falch5
+.fan3a
+.farn4ais.
+.fasg4
+.fas5ge
+.ff2
+.ff4a
+.ffer4a
+.ffe5ras
+.ffer4e
+.ff4o
+.ffor5t
+.ff4y
+.ffydd5
+.ffynad4
+.ffy5nas
+.fign5
+.fis5g
+.fon4edi
+.fordd4
+.for4o
+.for4w
+.for4y
+.fr4i
+.fryn4d
+.fydd5
+.fyn5as
+.fyw3
+.gal3e
+.gal5o
+.gan3l
+.gan5olas
+.gan5ole
+.gen5as
+.ger5b
+.geu5d
+.ghwy5na
+.gl2
+.glaf5y
+.gl4e
+.gleid4
+.gl4y
+.glyn3
+.glywad4
+.god3y
+.gof3a
+.goffad4wy
+.gollad4
+.gr2
+.grynho4em
+.grynho4wn
+.gwedd4er
+.gyd3
+.gyf5al
+.gyf5arc
+.gyfer5byna
+.gyfer5byni
+.gyfer5bynn
+.gyffel5
+.gym3o
+.gyn3a
+.gyn5e
+.gynef5
+.gyth5ru
+.gy5we
+.hac4
+.hadl4
+.haf4a
+.haf3l4
+.hagr3
+.ham4le
+.han5as
+.han4g5
+.hanghen5a
+.han5t
+.han5w4
+.har5ddel
+.hared4
+.har4en
+.har3n
+.harn4a
+.har3w
+.has3g
+.haw4
+.heb2
+.hec2
+.hed2
+.hedl4
+.he4o
+.herfy5na
+.her4w
+.heur5
+.hof4r3
+.hol4y
+.holyn5
+.hw2
+.hwn4
+.hwyl5u
+.hwyn5a
+.hwyr5
+.hwyth4au
+.hyd4
+.hydr4
+.hy3ff
+.hyf4od
+.hy5fry
+.hy3g
+.hyl4
+.hym3e
+.hym4u
+.hym4y
+.hymy5na
+.hymysg4
+.hyn2
+.hy3no
+.hy3rw
+.iach4
+.iac5has
+.iac5he
+.iac5hw
+.ir3
+.ladr3
+.ledr4e
+.le3na
+.le3o
+.lest4
+.lin3
+.ll2
+.llaw4e
+.lle5na
+.llo5nas
+.llon4e
+.llythr5
+.lo3na
+.lon4e
+.ludd3
+.lygr3
+.lyn3a
+.lythr5
+.man4ed
+.mant4a
+.mar4f
+.mign5
+.mis5g
+.mol3
+.mon4edi
+.mwyth5a
+.mwyth5w
+.myn5as
+.neilltu4ad
+.neis4i
+.nen3a
+.ner4w
+.ng2
+.ngen5as
+.nghyt5u
+.nghy5wa
+.ngl4
+.ng4w
+.ngy4
+.ni5an
+.ni3e
+.ni5fei
+.nig2
+.ni5ga
+.ni3ge
+.ni3gw
+.ni3gy
+.ni5re
+.ni3wa
+.niwl5
+.no4e
+.no4w
+.nwl3
+.nwyn3
+.oddefad4
+.od4l
+.of3a
+.of4o
+.of4u
+.og2
+.og4l4
+.ol2
+.oll3
+.ol5yga
+.ol5yge
+.olyn3
+.or1
+.orddad4
+.pl4a
+.pl4e
+.rad3r
+.rag3l
+.ra3na
+.ran5d4
+.rew3
+.rhi5a
+.ria4
+.rin4t
+.rug4l5
+.ry3n4a
+.ryn4e
+.sas4
+.ses4
+.st2
+.sych3
+.sych5e
+.talad4
+.tan4e
+.th2
+.thag5
+.th4i
+.tho5e
+.th4r4
+.thrad4
+.th4u
+.torad4
+.tr2
+.tr4a
+.trad4
+.tr4o
+.tro4en
+.uch2
+.wa5r4as
+.war4es
+.wedd4er
+.weithiad4
+.welad4
+.wen3a
+.west4
+.wn4io
+.wobr3
+.wybr4
+.wy3by
+.wy4r
+.wyw3
+.ydd4
+.yd4l
+.yf4ar
+.ym4adw
+.ym3e
+.ym4yl
+.ymysg4
+.yn4d
+.ys4b
+.ysg4
+.ys4i
+.ys4n
+.ys4t
+a1a
+a3ar2
+2ab
+ab3a
+ab4ad
+ab3ed
+ab3el
+ab5ine
+abl1
+a2b1o
+ab4or
+abr3
+a1bu
+a4bu.
+a4bum
+2ac
+ac1a
+ac5ade
+acan3
+ac4aol
+ac3ei
+ace3ne
+ac5enni.
+ach1
+a4ch.
+ach5ac
+ach5aw
+a5chef
+ach3o
+ach3r
+ach5us
+a3chwa
+achwyn5
+achy4
+aci5mw
+acl3
+ac3o
+ac3ta
+ac3te
+4ad3ac
+ad3ad
+ad5afa
+ad3arf
+adar4g
+a4dd.
+add3ad
+ad3dal
+ad3dd
+add3eu
+add5ew
+add3f
+add3i
+add2o
+ad4du
+addun4
+add3yc
+add3ys
+2ad1e
+ad3eg
+ad3el
+ad4el.
+ad4ena
+ad4ene
+ad4eni
+ad4eno
+ad4enw
+ad3i
+2adl
+ad3len
+ad5lys
+ad2na
+adnabydd4e
+adnabydded4
+ad2no
+2ado
+ad3oc
+ad3od
+ad3of
+ad3on
+4adr.
+ad4red
+ad3ri
+adr4od
+adr3on
+ad4ru
+4adunia
+ad5uniad
+ad5uro
+adwel4ed.
+ad3wi
+ad5wr.
+3ad3wys
+ad5wyt
+ad1y
+ady4n
+ad4yrn
+2aea
+ae4ada
+ae5an.
+aedd3
+ae3i
+ael1
+ael4edda
+aen3
+ae3oc
+ae3og
+aer1
+aerw4
+aer5we
+aer5wy
+aes3
+aest4
+aeth5a
+aethr4
+ae1w
+ae5wyd
+af3adw
+4af5aid
+af4al
+af3an
+afan5e
+af4ann
+4afar3
+af5arn
+af4at
+4af3au
+2af3e
+2aff
+aff3a
+aff3ed
+aff3ei
+aff3i
+affl3
+aff3w
+aff3y
+aff4yr
+af3i
+afl3a
+afl5edi
+af4l3u
+2afn1
+af3odd
+4afol
+af3ont
+2afr
+af3ra
+af3res
+af5rif
+af4ru
+af5rwy
+af1u
+2af1w
+af1y
+2a2g
+ag1a
+ag3ad
+ag3al
+age3na
+age5ne
+ag3law
+agl3o
+ag3lu
+agl3w
+ag3n
+ag3od
+ag3of
+ag4ori
+ag1r
+ag3ri
+ag3ry
+ag1u
+ag2w
+ag3wa
+ag3wel
+ag3wn
+ag3wr
+ag5yma
+agy4w
+a1h2
+ahan3
+ahanad4
+ahedr4
+a2i
+2aig
+2ail1
+ailen3
+2ain
+4ainc
+2ait
+2al
+al5abr
+al3ad
+4al3ae
+alaf3
+4alaid
+al3an
+al5arc
+al5aso
+al3ce
+alch3w
+al5cwl
+al4di
+al1e
+al5edau
+al3ei
+al3en
+al4ena
+al4es.
+al2fo
+al3fy
+al3i
+al4is
+all3a
+all3e
+all3i
+all3oc
+all3w
+all3y
+3aln
+al3oc
+al3od
+al4ogia
+alo3na
+alo3n4e
+al3ono
+al3or
+alp4e
+al1u
+4alwc
+alw3e
+4alwr
+al5wst
+al3wy
+4alwy.
+al1y
+2am
+ambl3
+am3d
+amdan5
+amel5o
+am3er
+amgym5r
+amhen4
+amhobl4
+amhryd4
+am5las
+am4led
+am4lf
+am4lg
+am5nif
+am4of
+am2or
+amor5w
+am4pa
+a4mwa
+am5wed
+am5wri
+am5wyd
+am3wyt
+amyn3
+a2n
+2an.
+an1a
+a4nab
+anadl3
+a4nae
+a4naf
+an4afi
+a4nai
+an2as
+an3at4
+a4nau
+a4naw
+4anco
+an2da
+an5dda
+an4ddy
+an2de
+an2do
+an1e
+an2ed
+an3ed.
+an5eda
+an5edd.
+an5edo
+a4n3eg
+a4nel
+an3eli
+an5er.
+an5ewi
+2anf
+an3fy
+2ang1
+ang3ad
+an4gd
+ang3e
+an4gf
+anghaff4
+anghelf4
+anghredad4
+anghrist4
+anghy4
+anghyd4
+anghydna4
+anghyf4
+anghyfar4
+anghyff4
+anghyfiawn4
+anghym4
+anghyn4e
+angl4
+ang5or
+an3if
+an3igi
+4annau
+an3oc
+an3od.
+an3odd
+an5og.
+an5og4ae
+4anol
+an3ol.
+an3om
+an3ont
+an3or
+1anr
+an5sic
+ans4ie
+ans4iw
+an5siwn
+an4ta
+ant5ac
+an5the
+ant3rw
+an1w
+an3wes
+4anwl
+anwy4
+an3wyd
+anwyn3
+an1y
+any4l3
+a1oe
+ap3a
+ap4cy
+ap5elw
+ap3l
+apl4a
+ap5ost
+ap5rwn
+ap5ryn
+ap5wll
+2ar
+ar3ab
+aradr3
+arae3
+ar3af.
+ara5ff
+ar3an
+ar4an.
+aran3a
+aran3e
+arat4
+ar3aw
+ar4ber
+arc3as
+arch5en
+ar5clo
+ar2da
+ar2de
+ard5es
+ar4dr
+ardyn3
+ar1e
+ar2eb
+ar2ei
+ar5eid
+ar3eit
+ar3fa
+arfan5
+arf5ed
+ar5fel
+ar4ff
+ar3fod
+ar1i
+ar4ian
+ar2m
+4arn.
+arn5adwy.
+ar4nd
+3arnh
+ar4no
+ar4nw
+ar4ny
+ar1o
+ar4od.
+ar4odi
+arogl3
+3aror
+ar3os
+5aros.
+ar4p3as
+arp3w
+ar3sy
+ar3te
+ar4th3
+ar3ug
+ar3ut
+aru5wc
+3arwai
+ar5wch
+arwd2
+arw5der
+ar3wed
+3ar3wi
+arw3n
+ar3wn.
+ar3wni
+ar3wy
+4arwyn
+ar3y
+2as.
+2asas
+as5awr
+1asb
+as5boe
+2asd
+2ased
+as4enn
+2asf
+2asg
+as5gal
+asgl3
+asg4oda
+as3gwr
+asg3wy
+2asia
+4asie
+2asl
+2asn
+as4ny
+as4od.
+2asoe
+2asr
+2ast
+as4tal
+as3tan
+astat5
+as3te
+as4tl
+as4tr
+as5trus
+ast2w
+as5ty.
+as3tyl
+astyn3
+2asu
+as3ur
+as5wir
+2aswr
+2asy
+as5ynn
+2a2t
+at3ad
+at5alf
+ateb3
+at3em
+ath3a
+athl3
+ath3o
+ath4r3e
+athr3w
+athr5yc
+ath3w
+ath3y
+ato2i
+at3ol
+a3tô
+at3ran
+atr5oc
+at3rod
+atro5e
+atr5yc
+at3wy
+aty3na
+aty5ne
+a2u
+2aul
+2aw
+aw1a
+aw5art
+aw5chw
+aw5ddr
+aw5dry
+aw3ed
+aw3ei
+aw3el
+aw3es
+aw3f
+aw3ga
+aw1i
+awl5ed
+awn3a
+awr1
+awr3d
+awy4r3
+3áu.
+1â
+bab4i
+bab5yd
+b3ac
+bach3
+badd3
+b3adw
+1bae
+2baet
+b1af
+b1ai
+b1an
+ban3a
+ban3e
+b4ann
+ban3o
+5barch
+bar4f
+bar4lys.
+barn3
+bar4wy
+b1as
+bas3g2
+bast4
+bat4a
+b4ath
+b1au
+bawd4a
+bawe5na
+b1d
+b1ec
+2bed
+beir4a
+be4iw
+b1em
+ben4ae
+be3nas
+be5ned
+bengl4
+bens4
+bent4
+b3ent.
+ben3w
+benwy5na
+b3ert
+b3esi
+bgal4
+2b1i
+b3ia
+bi5aidd
+3bib1
+b3id3
+b3ie
+3b2ig1
+b4inc
+bin2e
+b3io
+b3ir
+bisg4
+b3it
+bl3af
+bl5air
+bla3na
+bla5nedi
+bla5nes
+2blau
+bl5awd
+bl3ec
+bl4enni.
+blew3
+4blwr
+b4lyc
+4blyn
+bl5yn.
+bo4b4l
+b1oc
+4b3odd
+bol3
+b1om
+b2on
+bon4d
+b2r
+bra3na
+br3ed
+breg3y
+br3em
+br4enn
+br2i
+br4il
+br3ir
+brod4iae
+brog4
+br4wd
+bryf3
+bryn4d
+b1s2
+bse3na
+bse5ne
+2bu.
+1bua
+budd4l
+bu4lo
+3buo
+bw3a
+b1wc
+3bwll
+b1wn
+b4wns
+bwr1
+4bwyd
+b3wyd.
+4b3wyf
+bwyllt4
+3bwyn
+bwy4r3
+2by
+b3ych.
+bydd5i
+b2yl
+3bylla
+by3na
+by3ned
+by3nes
+byrf4
+b4yrw
+3byst.
+byw3
+cabl4en
+c1ad
+cad3a
+cad3l
+cae4a
+caethiw4ed
+c1af
+c3ai
+cal3e
+cal3o
+cam4enn
+camn4
+can3a
+ca4ne
+canghe5na
+can3l
+c4ann
+can5olas
+can5ole
+c3ant
+can4yd
+car4en
+car4ped.
+c1as
+casg4e
+3cat
+ca4t3r
+c3au
+c3áu
+c1b
+cd2
+c1e
+c3ed
+c5edig
+ceg3
+c3el
+c2en
+ce3na
+c3ent
+cer5by
+cer4f
+cer3y
+ceu4l
+c3ff
+3chae
+ch3af.
+ch4afb
+ch4afi
+chan3a
+changhe5na
+char4enn
+chasg4e
+chdr5y
+ch3eba
+ch3ebe
+ch3ebi
+ch3ebo
+ch3ebw
+ch3ech
+ch3ed.
+ch3edi
+5chein
+chelad4
+ch3ent
+chen3y
+ch3er.
+cher4f
+ch3esg
+3chest
+4chestio
+4chestol
+4chestwa
+4chestwe
+ch3eta
+ch5ig.
+chleid4
+chl5ent
+4chmyni
+4chmynnol
+chn5eg
+chob3
+chobl4
+ch3odd
+chon5ad4
+ch3ont
+chon4y
+chra4
+ch4ro
+4chu.
+ch4ub
+4chus
+5chwant
+ch3wch
+chw4f
+ch4wi
+ch3wn.
+ch3wyf
+chyd3
+chym4an
+ch4ynn
+chysg3
+chys5o
+chyt3u
+chy5wa
+c1i
+cib3
+cig1
+c3in
+ci3od.
+cl2e
+cleid4
+cl2i
+c1ll
+cllon3
+cloe4
+cl2w
+cl4wm
+cly4w
+clywad4
+cn2
+cno4en
+cn4yw
+cob1
+co4bl4
+c1oc
+c1od
+cod4l
+coffad4wy
+collad4
+c1om
+c1on
+con4y
+corn4an
+cosb3
+cr3ae
+cra4m
+3crat
+credad4
+cr4el
+cr3ie
+cring4
+crof4
+crog3
+cron4a
+cro5nas
+cron4e
+cryg3
+crygl4
+cr4yl
+cr4ym
+crynho4em
+crynho4i
+cs3a
+c3s4aw
+cs3yn
+ct2a
+c4teg
+ct4id
+c1to
+ctor3
+c3tr
+1cu
+2cus
+c1w
+c3wa
+cwast3
+cw4fa
+cwm3
+cwn4ed
+c3wy
+c4wyn3
+cwy4r
+cyb3y
+2c1yc
+cych3
+cyd3
+cydl4
+cydr4
+cy4f3a
+cyfer3
+cyffel5
+c1yl
+cyll5a
+cym3
+cym4an
+cym4ero
+c1yn
+cyn3a
+c5ynau
+cyn3e
+cynef3
+c2yny
+cy4se
+cysg3
+cys5on
+cys3t
+cys3w
+cyth5rud
+cy1w
+cy3wa
+cy3wi
+cy3wy
+d1a2
+dach3
+d3ach.
+d5achwr
+d2ad
+dad3u
+dad3w
+d5adwy
+dae5ara
+dae5ared
+dae5ari
+dae5arw
+d2ael
+d4afe
+d4afo
+dag1
+dag3w
+4dail
+da5ion
+d4ait
+d4al.
+d4ald
+d4aln
+d4alr
+d2an3a
+d2an3e
+dan3f
+d2ano
+d2anu
+d2anw
+d2any
+dar3a
+dar4ana
+dar4d
+darf2
+d5arne
+dar3w
+d5aryd
+2das
+2dau
+2daw
+dawd3
+d5awd.
+d1b
+ddad3r
+4ddaf
+3ddang
+dd4ani
+dd3ara
+dd3ari
+dd3arw
+2ddas
+dd4aw
+ddd2
+d4dda
+ddd4e
+dd4d4i4
+dd3dr
+dd4du
+dd4dy
+dd5dy.
+dd3er.
+ddeth5
+ddeuad4
+dd4eug
+dd4ew
+dd2f
+dd4fg
+2ddi.
+dd4ic
+dd4if
+ddif3a
+dd4ig.
+ddi3gy
+dd4il
+dd4im
+dd4ini
+4ddit
+dd1l2
+dd5len
+2ddo.
+4ddoc
+dd3odd
+4ddom
+4ddon3
+dd2or3
+ddr2
+ddr4a
+ddr4e
+ddr4i
+ddr4o
+ddr4w
+dd4ry
+d2du
+4dd3un
+dd5us.
+dd5waw
+4ddwc
+dd2we
+4ddwn
+5ddwrn
+dd4wyn
+3ddwyr
+dd2y
+4ddyc
+dd4ydd
+dd5yf.
+ddym4d
+dd4yn
+ddy5nad
+5ddyni
+4ddynt
+3ddyr
+3deb.
+debr3
+d1ec
+dech4a
+d1ed
+d5edd.
+deddf3
+def3a
+d1eg
+d5egol.
+de1h
+deheu5
+d2eil
+d4eim
+delff5
+d3ella
+d3elle
+d3elli
+d3ello
+dellt5
+d3ellw
+del3o
+d1em
+d3em.
+2d1en1
+d4eng
+d3ent
+de2o
+der3f
+derfyn5
+2d1es
+d3esi
+5destu
+d1et
+det5an
+deth4o
+d1eu1
+deul4
+deu4ny
+d4eut
+d1f2
+d3f4ae
+df4ann
+df4ao
+d4fa5ol
+df4at
+df4aw
+dfed5r
+d3fei
+dfe5ne
+d5ferf
+d4fery
+dff4y
+d2fi
+df4id
+df4od
+d4f3ol
+df4ry
+d2fu
+dfwr2
+d4fyd
+dfyn3a
+dfyn4ed.
+d1g2
+dgam2
+dgan5e
+dg4ei
+dgl2
+dgrynho5
+dgyf5ar
+d1h2
+dha5ol
+dhegl5
+2d1i
+di5ach
+di1b2
+dibryd4
+di1d
+did2e
+di5den
+d4ido
+di5dos
+di4et
+di3eu
+dif4an
+di5fat
+di3fe
+di3ffr
+di5fli
+di5flo
+di5fra
+di3fw
+di5gab
+dig2e
+di5gel
+di3gen
+dige5na
+dige5ne
+digl4
+di5gof
+di3gry
+di3gw
+dig2y
+di3gym4
+di3gys
+dil4a
+dil4e
+di5lec
+di5les
+dill4a
+di3lu
+dil2w
+di3lys
+d3in.
+di5niw
+di3nod
+d4inoe
+di3or
+d2ir
+d3ir.
+di3ra
+d4i3r2e
+di5rif
+3d4iro
+di4rw
+di3rym
+dis3g
+di3so
+dis3t
+di3sw
+di3sy
+4d3it.
+d2iw2
+d4iw.
+di3w4a
+d4iwe
+di5wen
+d3iwyf
+d1ï
+d3ladd
+dladr3
+dl3af
+d3lam
+d4lau
+dl3ed
+d3l4ei
+d4len.
+dle3na
+dle5ne
+d4lent
+dl3er
+d3lew
+d2lo
+dl3oc
+dl3od
+d3lon3
+dlon5e
+d1lu
+dludd3
+d2lw
+dl3yc
+d3lyd.
+d3lyn
+dl4yr
+d3lyw
+d1m2
+dm4ar
+dm4er
+dm4od
+d3my
+d1n
+d3nap
+dn3as
+d3naw
+dneb4
+d2n3ed
+dn3es
+d2ni
+d3ni.
+dno2i
+d3nos
+d2n1w
+d2ny
+d1o
+d3och
+d2od.
+d2odi
+d4odia
+dod3r
+2doe
+do4en
+d2of
+dof5yddio
+d3ol.
+d4oll
+dol4wg
+d3om
+don2a
+don2e
+d3ont
+dor2a
+dor4da
+dor5we
+dos3
+do2w
+2dr.
+3dra.
+dr3ad.
+dr3ada
+dradd3
+dr3adw
+dr3a4f
+dr5aid
+dr5ain
+dram4g
+dr4an.
+dra3na
+dra3ne
+dr4ann
+dr3ant
+dr5au.
+dr3c
+dr3ed
+dr4edo
+dr3en
+d4reu
+drew3
+dr3f
+drff4
+dr4iau
+d4r3id
+d4rir
+d4roe
+dro3es
+4drog
+drog4e
+dr3ol
+dr5ol.
+dr3on.
+dron3a
+dr3ont
+d4rwg
+dr3wn
+dr3wyf
+dr3yd
+dr3yn.
+d3ryw
+d1s2
+d1ug1
+d4un.
+dun3a
+d4unia
+d1ur
+d1us
+1dut
+du5wch
+d1w
+dw2a
+dw3adw
+d3wae
+dw3af
+d3wait
+d3wal
+dw3an
+dw3as
+dwb3
+dwbl4
+d3wc
+dwd2
+dw3edi
+d2wen
+dwer5y
+d4w3id
+d4w3ir
+d4wit
+dw5mig
+dw3o
+dwr3e
+d2wrn
+dwy3b
+d4wyc
+dwyn3
+dwy4on.
+d2wyr
+3dy.
+d1yc
+d5ych.
+d1yd
+d3yd.
+4dydd
+dyd2w
+dydw5y
+dyf5an
+dyff4
+dyf4n3
+dyf4od
+dyf5odd
+dy5fodi
+dyf2r3
+dyfrad4
+d3yg.
+d3ygl
+dy3gy
+d2yl
+dyl5ad
+dy3lan
+dyll3
+dy3lu
+d1ym
+dymag5
+dym5od
+3dyna
+dy3nas
+dy3nes
+dy3n4od
+dy3r2a
+dyr2e
+dy3ri
+dy5ryd
+2dys.
+4dysa
+dys4g
+dysg5a
+4dyso
+2ea
+e1ad
+e4adf
+e4adl
+eaf1
+e3af.
+ea4fa
+e4afg
+e1ai
+e1an3
+e4ang
+ear1
+earf2
+ear5fo
+earn4i
+e1as
+e1au
+e3aw
+eb3ad
+eb5ar.
+eb1e
+ebl2
+eb1o
+eb3ont
+ebra5ne
+ebr3e
+eb4r3i
+ebr3o
+eb1w
+eb3wy
+eb5yll
+2ec1a
+2ec3e
+ech1
+ech5od
+echr4
+ech3ry
+ech5we
+ech5wyd
+echwy5na
+echwy5ne
+2eco
+econ2
+eco5no
+ec5ord
+ecr1
+2ect
+ec4to
+2ecw
+ec3y
+2ed3a
+ed4al
+edd3ad
+edd3al
+edd3ar
+edd3e
+2eddf
+eddf3a
+eddf5i
+eddf3o
+eddf3w
+eddf3y
+4eddg
+edd3o
+edd3yc
+edd3yg
+edd5yla
+edd5yled
+edd5ylo
+edd5ylw
+edd5yn
+ed1e
+ed3eg
+ed2ei
+eden5a
+ed3fa
+ed3fe
+ed3fi
+edf4w
+4edia
+edi4f
+ed3ig
+ed3i4n
+ed3ir
+ed3iw
+3edï
+2edl1
+ed4lo
+4edr.
+edr3e
+edr3o
+edr4yd
+2edw
+ed2we
+edw3en
+edw5lw
+ed3wy4
+ed3y
+edym4
+2e1e
+ef5adwy.
+ef3an
+ef5an.
+ef3ar3
+ef3au
+ef1e
+efer2
+eff4e
+eff3r4
+eff5re
+effro4er
+eff3y
+ef3id
+ef3ig
+ef2l3
+ef4lo
+efn1
+ef5nos
+ef1o
+ef4odo
+ef2r
+efr3e
+ef4ri
+ef4ry
+ef4us
+ef1w
+efyddad5
+efy3na
+efy5ne
+e2g1
+4eg5an.
+eg4ana
+egar3
+egeir4
+eg5ell
+4egen.
+2egf
+eg5ig.
+egl3a
+egl3e
+egl3o
+2ego
+eg4on.
+4egos
+eg5os.
+egr3a
+egr3e
+egr3i
+egr3o
+egr3w
+eg3ry
+egr3yc
+eg2u
+eg3yr
+e1ho
+e1hy
+e2i
+2ei1a
+eiaf3
+ei5afr
+ei3bre
+eich3
+eidal5
+eidd3
+eidd5y
+ei5der
+eidl2
+eid5la
+2eidr
+eidr5o
+ei1e
+2eig
+eigl5ad
+eig5lenn
+eigl3w
+ei4gr
+3eilad
+4eiladwy.
+eil5ec
+eil5eg
+eil3es
+ei4ll
+ein2a
+eind5i
+ein4drw
+4einf
+eing4a
+ein5io
+4einl
+4einy
+2ei1o
+ei3ont
+eir3y
+2eit
+eith5e
+ei1w
+ei3y
+2e2l
+el1a
+el5ain
+elan5e
+el4co
+el1e
+el3ed
+el4eno
+el4era
+el4ere
+el5far
+el5fed
+elgri5
+3elh
+el5iff
+4elig
+ell1
+ell5ac
+ellt4ir
+ell5wy
+ell3y
+el2m3
+el5myn
+el1o
+el2od
+el3odd
+4elog
+el4oga
+el2ri
+el4wi
+el3wy
+el5ybia
+el5ybr
+el3yc
+4elyd
+el5yd.
+el3ydd
+elyn3
+el3yna
+el5yned
+elyng4
+el3ynn
+el3yr
+el3ys
+el4ysg
+el4yst
+em5ain
+em4at
+2em3e
+2emo
+em4os
+2emp
+empr3
+em5ryn
+2emt
+em5tas
+2emy
+en5ada
+e4n3adu
+e4nae
+en3af
+e4nag
+en5ago
+en3ai
+en3an
+e4nar3
+enar4g
+e4n3aw
+en5byl
+en3c
+en4ct
+en4cy
+2end
+endig3
+endr4
+en3ec
+en3ed.
+en5edd
+en3el
+en3em
+en3en
+en3er
+en3est
+en3eu
+e4new
+enew5y
+en5fyd
+eng3h
+en4gi
+engl3
+en5gl4og
+en5ise
+en3it
+en3o
+en4oli
+4enti
+ent4ir
+en3tr
+ent4wr
+4enty
+en5tya
+en5uch
+enw3ad
+en3wc
+en3wn
+en3wr
+en3wyd
+en3wyf
+en3yc
+en5ych.
+en5ychase
+en5ychia
+en4yg
+2eo
+e5och.
+e1od
+e1oe
+e4olae
+e4olaid
+e4olau
+e1om
+e1on
+eor3
+ep5ach
+ep3l
+er1a
+er5ain
+er2c
+erc3a
+er4ch
+4erco
+2er2d
+er3de
+erd3y
+er1e
+2erf
+er5fan
+erf5au
+er3fed
+er3ff
+er4fl
+er4fu
+er3fyd
+er3gl
+er2gy
+er3i
+er4ic
+er4il
+erin3
+er5ir.
+er5it.
+er2l
+er5lys
+er4md
+er4mw
+er4my
+er3na
+ern4i
+er5ni5as
+er5nyw
+er1o
+4erob
+erog4
+4erol
+er5oli
+er4ony
+er2se
+er5sei
+2ert
+erw3a
+er4w3e
+er4wl
+er3wn
+er4wre
+er3wy
+er4wyc
+er4wydd
+er3yc
+er3ydd
+er3yg
+er3yl
+eryl3e
+er4yll
+er3yn
+eryn4a
+eryn4e
+es3a
+es3ba
+es3e
+es5gar
+es4ge
+es4gn
+es4g3w
+es4gyn
+es3n
+es4ne
+es4t3a
+es5tam
+est3er
+2estf
+2estl
+est5ol
+4estu
+es5tyll.
+esty5na
+esty5ne
+2esu
+esurad4
+es4yd.
+es3yn3
+e2t
+et3ac
+et3ad
+e3tae
+et5eg.
+eter4
+et3er.
+eth1
+eth3e
+eth3i
+eth4le
+eth3os
+eth4r3
+eth3w
+et5iro
+et1o
+et5re.
+et5swy
+et1w
+4etwr
+ety5wy
+e2u
+eu3a
+4euau
+2eu1b2
+2eud2
+eu3da
+eu3d4e
+eud4i
+2eu1f
+eu1g
+eull4
+eu5lys
+2eun2
+eu5nan
+eu5nos
+eu5nyddi
+eu5sil
+eus3t
+eu4th
+eu4tu
+eu3w
+2ew
+ew1a
+ew3d
+ew1e
+ew3g
+ewgl4
+ewg4w
+ew3ir
+ewis3
+ewl1
+ew3o
+ew5par
+e3wyd.
+e3wyf
+2ey
+e1yc
+ey4en
+1ë
+3fa.
+fab3
+fab4i
+fach3
+fac4w
+fadd2
+fad4ei
+fad4r3
+fael3
+f1af
+3fag
+fag4d
+fagl3
+f1ai
+falch4
+f4al5on
+f4alu
+f3am
+f4an.
+fan3d
+fan5edd
+fan4es
+f3anf
+fan3o
+fant2
+3faoe
+far3a
+far4ch3
+4far2e
+f3arf
+far4fa
+far4l
+3farn
+farn3a
+f3arp
+f3art
+f4arwe
+f3arwy
+f1as
+fas4iw
+f3at
+fat4o
+fawd4a
+3fawr
+f1b2
+f1d2
+fdd2
+f2dw
+fd5wr.
+f4eb.
+febr3
+f1ec
+fed4n
+f2edr
+3feia
+3feie
+fe4io
+feiriad4u
+feith3
+fe4iw
+f4el.
+f3ell
+fel5yno
+f1em
+fe3na
+feng3
+fent4
+fentr5
+fenw3
+fen3y
+2fera
+ferch4er
+ferdd4
+2f2ere
+2f2eri
+fer4in
+2f2ero
+f2erw
+ferw5yc
+f4er3y
+f1es
+feth3
+f4eth.
+f4etha
+feu1
+3fey
+f2f
+ff3ad
+ff3ant
+ff4at
+ff3au
+ff3ed.
+ff5edig
+ff5eio
+ff5el.
+ffen5ed
+ff3ent
+ff3er.
+3ffert
+ff3esu
+ffet4
+2ffi
+ffidl5
+ff2l
+ff4la
+ffl4ac
+ff4lo
+ff5log
+ff5los
+ff3n
+ff3od
+ffod5e
+ff4odi
+3ffon.
+ffo3n4a
+ffo3n4e
+ff3ont
+ff2or
+5ffor.
+ff4os
+ff2ra
+ff2ri
+ff4rod
+ff2rw
+4ffry
+ffr3yn
+ff2t
+5ffurf3
+ff5wyf
+ff5yl.
+f1g
+fg4wr
+f1h2
+fha5ol
+f1i
+f4iadae
+2fic
+fic4e
+f2id
+f3id.
+fig4en.
+fil3y
+fin3
+f4in.
+f3ind
+fin4t
+fisg4
+f2ï
+fl2
+fl3ad
+flaf4
+fl3ai
+flamad4
+fla3na
+flan5ed
+f2las
+flaw4
+fl3ec
+fl5eis
+fl3em
+fle3na
+fle5ne
+fl4eo
+fl3id
+fl4ig
+flin3e
+fl3ir
+fl4iw
+fl3om
+f3lon
+fl5rwy
+f4l3wr
+f1ly
+f5lychw
+f4l4yd
+fl4yf
+flyn3a
+flyn3e
+f2n
+fn3a
+fn3d
+f4n3ec
+f4n3ed
+f4n3em
+f4nen
+f3nif
+fn3ig
+f3nith
+fn5lu.
+f4n3oc
+f4n3om
+f4n3on
+fn3w
+fn2y
+f4n3yc
+fn3yn
+f1oc
+fodd3
+fod4enn
+f4odf
+fodr4
+fod3rw
+f4odu
+f3oedd
+f1og
+fol3
+fol4enn
+f1om
+fon4d
+5fonog
+f4ony
+f4or.
+for4c
+f4ord
+for3f
+f3os2
+fos4i
+fos3o
+f3ot
+f4otr
+fr2a
+f2raf
+f2rai
+fra3na
+fra5ned
+fras4au
+f4r3au
+fr3d
+frdd2
+fre2
+f2rec
+f4red.
+f4reg
+freg3y
+f2rem
+f4ren
+f3reo
+f2rer
+fr3f
+f2rh
+f2rid
+fr3id.
+f2rir
+f4rit
+fr2o
+f3roa
+f5roadw
+f2roc
+frod4iae
+fro2e
+fro4en
+fro5esi
+f3ro2i
+f2rom
+f2ron
+f3roo
+fr4ot
+f3row
+fro4wc
+fro4wn
+f1ru
+fr2w
+f2rwc
+f2ry
+f3ryn
+f1ta
+f3ter
+fudd4l
+fud3w
+fu2l
+f1un3
+f4urf
+f3wa
+f1wc
+fwd3
+f1we
+4fwl.
+f1wn2
+f3wr.
+fwr5ne
+f4wy.
+f3wyd
+fwyllt4
+fwyn3
+f4wyn.
+f4wys
+f1yc
+fyd2
+fyddad4
+fydd4l
+fydd5y
+fyd4l3
+f4ydr
+fyd3y
+3fyf
+fyf4y
+f1yl
+f4yl.
+f2yn
+4fyn.
+f3yng
+fyn3o
+fyn5od
+f2yr
+fy3r2a
+f3yrd
+fyr2e
+fyrf4y
+fyr4y
+fys4t
+fystyr4o
+fys4w
+gabl4en
+g5ach.
+gad1
+gad3a
+5gadar
+g4ad2u
+5gaduri
+g4adwr
+g1ae
+gae3a
+g3af.
+gaf3a
+gaf4r3
+g1ai
+1gal2
+gal5ara
+gal5are
+gal5ari
+gal5aro
+gal5arwy
+galed5
+4gall
+gam4enn
+gamn4
+gan3a
+gan4d
+ga4ne
+ganghe5na
+g3ant
+4ganwr
+g3ao
+gar3eg
+gar4enn
+g3arf
+gar4ge
+3gart
+4garthia
+gar4we
+g1as
+5gased
+gasg4e
+ga4t3r
+2g1au
+4gawe
+2g1b
+gb4er
+g1c
+2g1d2
+gdd2
+gddig5
+gdo3ra
+gdo5r4e
+g2dw
+gd5wr.
+g1ec
+g1ed
+gedd3
+g2ede
+g4edi.
+g4edid
+g4edir
+g4edit
+g2edo
+g4edu
+g4edyc
+geg3
+g2egy
+g2ei.
+g3eid
+g4el.
+gell5a
+gel3o
+g1em
+gen4d
+g5enni.
+gen2r
+g3ent
+g4enu
+g3er.
+3g4erd
+ger4f
+ger3y
+g1es
+geu4l
+g1f2
+gfa3na
+gfa5ne
+gfe5ne
+gfyn3
+g3ga
+gh2
+ghae4
+ghan3a
+ghanghe5na
+ghar4en
+ghasg4e
+ghen5i
+gher4f
+gh4le
+ghleid4
+gh4ne
+ghob3
+ghobl4
+ghof5r
+gh4og
+ghon4y
+ghr2
+ghra4
+ghred4adu
+ghred4inia
+ghw4f
+ghyd3
+ghym4an
+ghysg3
+g1i
+gib3
+g4ida
+gi5en.
+g2ig1
+3gil
+1gip
+g3iw
+g2l
+gl3ac
+gl3adw
+glaf2
+glan5e
+gl3ant
+glas3
+g5las.
+g3lat
+gl5au.
+gl2e
+g3le.
+gl3ech
+gl3edi
+g5leisiaso
+g3leo
+gl3es
+gl3eu
+gl3f
+gl3ia
+gl3id
+g3liw
+gl4odi
+gl4ody
+glo4e
+gl4of
+5gl4oga
+glo2i
+g4lu.
+g4lwc
+g4l4wm
+g4l3wn
+g4lwyf
+gl3yc
+g3lyd.
+gl4ym
+gl4ys
+gl4yw
+g2n
+gn2i
+gn3io
+g4niw
+g3nï1
+gno3e
+gn2of
+gn2u
+gn1w
+gn4yw
+gobl4
+g1oc
+goddefad4
+go5ddr
+g2od2y
+god5yn
+g2oe
+go5fau
+go3fer
+goff4au
+gof4un
+gog2
+go3gan
+gog3e
+gog4l4
+go5gyn
+g3ol.
+goleu5
+3g4oll3
+go4lw
+gol5yga
+gol5yge
+gol5ygwy
+g3om.
+go3me
+gon5ad
+g4one
+g3ont
+gon4yn
+g2or
+gor5chy
+gorddad4
+gord5i
+g4orf
+gorn4an
+g4orol
+gor3t
+1gos
+gosb3a
+g3ota
+g3ote
+g3oti
+g3oto
+g3otw
+g2r
+gra4m
+gran3a
+gr4el
+gr3f
+gr2i
+g4rid4
+gr3ie
+gring4
+g4r3ir
+g4rit.
+gr2o
+gr3od
+gr4oe
+gr5oed
+grof4
+grog3
+gron4a
+gro5nas
+gron4ed
+gron4es
+gr4ono
+grwn5a
+gr3wo
+gr4wt
+gr2wy
+g5rwydd
+g4ryc
+gryg3
+grygl4
+gr4ym
+gr4yn
+g1s2
+gsym4
+gub3
+gudr4
+gu5edd
+gu4to
+gw2
+gwa5r4as
+gwar4es
+gw4as
+g3wc
+gweithiad4
+gwelad4
+gwel5e
+gwen3a
+gwerthad4
+gwm3
+gwn4a
+gw4n4e
+gwobr3
+g3wr.
+g4wrd
+g5wth.
+gwy3by
+g3wyd.
+gwydr5
+g3wyf
+gwy4r
+gwyw3
+3gyb
+gyb3y
+g1yc
+gych3
+g4ycho
+gydd4f5
+g2ydi
+gydl4
+gyd3r4
+g4ydu
+g4ydy
+3gyf
+gyf5an
+gy4fe
+gy4fl
+gy4fr
+g3yl3a
+3gylc
+g3yle
+g4ylio
+g3ylo
+g3ylw
+g2ym
+gym4an
+gym3u
+gyng3
+g2yno
+g2yr
+g4yro
+g2ys
+gy4se
+gysg3
+gys5on
+gys3t
+gys5to
+3gyw
+gy3wa
+gy3wed
+gy3wi
+gy3wy
+hab3yd
+hadd5as
+hadd3o
+had4eg
+had4eny
+h4adf
+had4fer
+hadl4a
+had3n
+had3r4
+h5aeol
+ha4f3a
+h4afl
+haf5ol
+h4afs
+hag3w
+h1ai
+h4aif
+hal3e
+hall3o
+hal3o
+ham4enn
+hamn4
+ham3s
+han3ad
+h4anau
+hanc4
+han3d
+ha4ne
+han5edd
+han4er
+h4ange
+hanghen4r
+han3ig
+han3l
+han2o
+han4oda
+han5olai
+han5olas
+han5ole
+han5olwy
+hanrhyd4
+hansodd4ei
+har5adwy.
+hara3t
+harato4en
+har4bwr
+har4cha
+har4fo
+h1as
+h3asf
+hast4a
+ha4tr
+hatr3e
+h1au
+hawe5nas
+hawe5ne
+hawl3
+h2â
+h1b2
+hbl4a
+h1d2
+hddad3
+h3di
+hd4ir
+hdo3na
+hdo3ne
+hd4ra
+hdr3e
+hdr5oc
+hdr5od
+hdro5ed
+hdr5wyd
+h4dwr
+h2eb
+h3eb.
+heb3ra
+hedd3
+hedd4fo
+h2ede
+hed5fo
+hed5fw
+h4edid
+h4edir
+h4edit
+h2edo
+hedr5wy
+h4edu
+h4edy
+h2ef
+h2eg
+hegn3
+h4egy
+he4ho
+h2ei2
+h4e3ia
+h4eil
+heimlad4w
+h4el.
+4helad
+4helaf
+4helai
+4helan
+4helas
+h3eld
+2hele
+4heli
+2hel3o
+hels4
+2helw
+4hely
+hel3yd
+h1em
+hen5cy
+hen4id
+hens4
+hen3wy
+henwy5na
+henwy5ne
+heny5na
+he3ol
+her3b
+h2ero
+h3esi
+h2et
+h3ete
+h3eto
+5heuae
+heu4aetha
+heu3d
+heu2l
+he4wi
+hewy5nas
+h1f2
+hfil4
+hfonhedd5
+hf4os
+hf4wy
+h1g2
+hgan3
+hgap2
+hgi5ai
+h1i2
+hiach4
+hiac5has
+hiac5he
+hiac5hw
+hi4a4n
+hib3
+hidl3
+h2ig1
+hig3y
+hin4t
+hir3
+hi4wa
+h2ï1
+hï4en
+hl2
+hl4ad
+hl5adw
+hl4am
+hla3na
+h5las.
+hl3asi
+hl3aso
+hl4aw
+hl5ech.
+hl5edig
+hledr5
+h3lef
+4hleit
+hl4en
+hl4et
+hl3id
+hlon3a
+hlon5e
+h4lus
+h4lwm
+h5lyd.
+hl3ydd
+hlym4u
+h4lyn
+hl3yn.
+hlywad4
+h1m2
+h3myg
+hmygad4
+h3myn.
+hmy3na
+hmy5ne
+h5myni
+hn2
+h3nad
+h2neg
+h4new
+hn4ie
+h1nï1
+hnod3
+h2nol
+hn5ole
+hn4yw
+ho4ad.
+ho4bl
+hod4l
+ho4dy
+ho4en
+hoffad4wy
+h3og.
+h3o4ga
+hog5lu
+ho2h
+h2ol
+h3ol.
+hol5ud
+h1om
+h2or
+h3or.
+hor4c
+horn4an
+h4os.
+hosb3
+hos3o
+h2ow
+hp2
+h2r
+hra3dd
+hr3adw
+hr3af.
+hra3g
+hr4aid.
+hr3ant
+h5raul
+hr5edig
+hr3em.
+hr3f
+hr2i
+hr3ia
+hr3id.
+hrid4a
+hr3ie
+hring4
+hr3ir
+hrisiad4
+hr3it
+hr3iwy
+hr2o
+hro4ad4
+hr5och.
+hr3odd
+hrog3
+hr3om.
+hron4a
+hro5nas
+hron4e
+hrong5
+hr3ont
+hr4ud
+hr3wn.
+hr5wyd.
+h5rwydd.
+hr3wyf
+h4ryc
+hryg3
+hrygl4
+hry3l
+hr4ym
+hrynho4e
+hrynho4i
+hrynho4wn
+h4rys
+h1s2
+hsef4
+h2t
+h2u
+hub5on
+hudd3
+hudd5y
+hudr4
+hud3w
+hud5yl
+h4uge
+hug4l
+hun3ad
+h4unn
+h3ur.
+h3us.
+h4use
+h4ust
+h4usw
+hw2a
+hw4as
+hwbl5e
+hwd3
+hw2e
+hwedl5
+h3wei
+h4wel.
+hwen3
+hwen4y
+hwe5nychaso
+hwe5nyched
+hwerw5
+hwe5ug
+hw2i
+hwiw5g
+hwm3
+hwn4e
+h3wr.
+h2wy
+h4wy.
+h4wya
+hwybr4
+hw4yc
+hwyll5t
+hw4ym
+h4wyo
+h5wyol
+hwy4r
+hyb4l
+hyb4wyl
+hyb3y
+hydd4id
+hyd4fo
+h2ydi
+hydl4
+hyd4naw
+hy4f3a
+hyfad4
+hyf4ae
+hyfar5f
+hyfer3
+hyffel5
+hyffred4in.
+hyf4iai
+hy4ga
+hygl4o
+hygl4w
+hygr4
+hyll3a
+hym4adw
+hym4ant
+hym5el
+hym4en.
+hymerad4
+hym3o
+hymp4
+hym3u
+hym5yr
+hym5ys
+hyn3a
+hyn3e
+hynef3
+hyn3yc
+hyr3a
+hyrdd5
+hyrf3
+hyr5n4o
+hyr2w
+hys4b
+hy4se
+hysg5od
+hys4ig
+hys4n
+hys5oni
+hyt4bw
+hyth5ru
+hyt2u
+hytun4deba
+hy3was
+hy3we
+hy5wed
+hy3wi
+hy3wyd
+1ia
+iab4a
+iach2
+iad3
+i4ada
+5iadaeth.
+iad4lo
+5iaduro
+i3ael
+3iaet
+4iafo
+iag3w
+2ial1
+ial4ae
+2i3am2
+iam3h
+ia3na
+4iand
+ian5da
+ia3n2e
+4i3ang
+iang4e
+ianghen5
+ian3o
+ian3w
+2iar
+i3ard
+i3arf
+iar4l
+iarll5
+iar4s
+i3asg
+iat5er
+i2au
+iawnad4
+2ib
+ib3ed
+ib3el
+iben5y
+ib3es
+ibetr4
+ib3i
+ib4il
+ibl3e
+ibl3o
+ibl3w
+ib5og.
+ib3on
+ibr3a
+ibr3w
+iby4nad4
+2ic
+ic3en
+ichl4
+ic5ied
+icon2
+ic5oni
+ic5rwy
+ics4i
+ic5siw
+ic3t2
+2ida
+idal4
+2idd
+i4ddai
+idd4au
+i2dde
+idd3f4
+idd3i
+i4ddir
+i4ddod
+idd3r
+2ide
+idel4
+ider4
+2idf
+idf4w
+2id3i
+idi4a
+id4lo
+idl3w
+2idm
+2i2d2o
+id3og
+i3dola
+i3dole
+i3dolo
+i5dolwy
+ido3na
+ido5ne
+i3dor
+2idr
+idr4a
+idr4o
+id3rwy
+2idu
+2idw
+idw3a
+idwad4w
+id4wr
+2idy
+id3yl
+id2ym
+1ie
+4iedd
+4iedi.
+iedif5
+ied4yl
+2i3ef
+i3eg
+iegwydd4
+2iei
+i3eid
+ieis4
+4ien.
+ien4a
+ien4c
+4iend
+i3ene
+2ienn
+ienw4
+i3eny
+i3esg
+2if
+if4add
+if4ae
+if4al
+ifan3a
+ifan5e
+if4ao
+if4ar
+if5ard
+ifar3e
+if4at
+if5ath
+if4aw
+if5bin
+i4fec
+i4fed.
+i4fedi
+i5feio
+i5feiw
+i4fem
+ife4n
+i4fent
+i4fer.
+i3fery
+i4fesi
+i3fet
+iffl3
+iff5or
+i3ffu2
+iffy5na
+iffy5ne
+if3i
+i3flas
+if4on.
+i3fre
+i3fry
+i1fu
+i4fwc
+i4fwn
+i4fwyd
+i4fwyf
+i1fy
+i4fyc
+i4f4yl
+ify5re
+ig3ad
+ig3af
+ig4ain
+2igan
+4i3gar
+ig1e
+ig3ed
+ig3es
+ig5hal4
+2ig3i
+ig5lan.
+ig5lann
+ig5law
+ig5let
+ig4l3o
+ig4ly
+ig5lyd
+igl3yn
+ign1
+2igo
+ig3odd
+ig4ode
+ig3oe
+ig3om
+2igr
+i3gre
+igref4
+i3gro
+ig3rw
+igryb4
+2igw
+ig5wai
+i4gwc
+i4g3wn
+ig4wrn
+2ig1y
+igyff4
+ig5yn.
+ig4yna
+ig4yr
+igys4
+ig5yso
+igysyllt4
+igyt4
+igy4w
+2i1h2
+i2han
+ihat4
+ihe4w
+2i1i
+i3iw
+2i2l
+il3a
+5ilau.
+ilc2
+ild5ir
+il3ed
+il5en.
+ilew4
+il1f
+ilf4y
+il3i
+il4ip
+ill3
+ill5iw
+illt4
+il3oc
+il3od
+il5ofy
+il3on
+il2s3
+il4sy
+il4ti
+iludd4
+il3un
+il1w
+il5wai
+ilwen3
+il4ws
+il3yd
+il3yg4
+il3yn.
+ily3na
+ily5ne
+i4lysia
+il5ywa
+2im2
+im4bi
+im3i
+iml3
+im4le
+2in
+in1a
+in3ac
+in3ad
+in3af
+in3ai
+in3an
+in2be
+inc4e
+in4ci
+inc2o
+in4cy
+in4dai
+in1e
+3in4eb
+in3f
+ing5en
+in4g3o
+ing3w
+ing5yl
+in5gyn
+in3ia
+in3id
+in5iew
+in3ig
+iniw4
+in4iwe
+in1o
+in4ode
+in4odi
+in4ody
+in3oed
+in3on
+in3os
+int4a
+in4te
+in2t3r
+in4ty
+in3w2
+in5wyc
+in1y
+1io
+3io.
+2iod.
+i3odde
+iod5le
+iod5wy
+2ioe
+2i1of
+iog3
+4iolc
+iom3
+i2on
+ion3a
+ior4c
+ior4f
+i4orw
+2ios
+2iot
+2ip
+ip5ell
+ip4og
+ir1
+ir2a
+ir5agl
+ir3an
+ir4áf
+ir3b
+irch3
+irdy5na
+irdy5ne
+2ir3f
+2iri
+i4ria
+ir3io
+i3ris
+ir4li
+ir4ll
+ir3na
+irnad4wy.
+ir3no
+irn4y
+2ir3o
+ir3w
+irw2i
+ir4wo
+ir2y
+ir3yn
+i3ryw
+2is
+isaf4
+is3b
+is5eld
+is2er
+is5er.
+is4gam
+is4ge
+isg3o
+is3gr
+isg5wyd
+is3gy
+is4la
+is5myn
+is2o
+is5odd
+is3ol
+is3on
+ist2
+is4ti
+is5tol
+is2w
+is3wn
+is5wyd.
+is4yc
+is4yr
+1it.
+3it2a
+2ith1
+ith3a
+ith4au
+ith3eg
+ith3i
+ith5or
+ith3w
+ith3y
+2iw.
+iw3adw
+iw3af
+i4wair
+i3wal
+iw3an
+iw3as
+3iwc
+iw4ch
+2iw1d2
+iwd4i
+iw5edd.
+iw3edi
+iw3eid
+iwg4w
+2iw1i
+iw1l2
+iwl4e
+iwl4i
+iwl4o
+iwl4w
+iwm4e
+iwmp4
+3iwn
+iwn4i
+4iwnl
+iw3o
+i3wre
+i3wrt
+iw5ter
+1iwy
+iw4yd
+iw4yf
+iwyn3
+4iwyr
+1iy
+2iyd
+2i1ym
+iyn3
+2i1ys
+ï3ae
+ï2i
+l1ac
+lach3
+2lad.
+l4ad4d3
+lad2m
+lad2o
+lad3r4w
+4laen
+l3af.
+5lafar
+l1ai
+l4ain
+l4air
+l4ait
+lam3
+l4an.
+lan5ced
+lan5de
+landr3
+l2ane
+lan4es
+l4ann
+lan3o
+4lant3
+lar3a
+lar4ia
+lar3n
+l1as
+l4as.
+lasg4
+last2
+las5ta
+4lat.
+lathr3
+lats5i
+2l3au
+law5dde
+lawen3
+law3l
+law3no
+lawr2
+law5ro
+law3y
+2l1b
+lb4an
+l2c
+lch1
+lch5io
+lch5iw
+lch3r
+lch5wyd.
+l3co
+lc3yn.
+2l1d2
+ldd2
+ld3i
+ld4ir
+ldro3
+ldy5na
+ldy5ne
+1le.
+le3a
+le4ad.
+le4ada
+lebr3
+lech3
+l3ed.
+leddf5
+l4eddog
+led5fy
+led3l4
+l4edr
+lef1
+lef3e
+lef3y
+l2ega
+leg5ar.
+l2egw
+leg5yr
+le5iau
+le3id.
+lei3l4
+le3ir.
+le3it.
+le4iw
+l3el
+2l1em
+l3em.
+l2ema
+len2d
+len5di
+len5ig
+l3ent
+len3y
+1leo
+le3oc
+le4on.
+l3er.
+l4erau
+ler5ig
+lesg5e
+l4esn
+let4em
+le4tr
+l4euad
+l4euh
+4leuon
+l5euon.
+le3wch
+le3wn
+lew3yn
+lf2
+lf5air
+l3fan
+lfe3ne
+lf4fa
+lff4y
+l1fi
+lf5icy
+l1fo
+lf5oda
+l1fr
+lf4wy
+lf3yd
+lfy5re
+l1g2
+lg4an
+lgo4f3
+2l1h2
+l3ha
+l3he
+l3hi
+l3ho
+l3hw
+l1i2
+liach3
+4lian
+libr3
+2lid
+li3de
+1lif1
+li4fr
+4lio.
+li5oed
+li5pal
+2lir
+l3ir.
+lis4g3
+l3it.
+lith4r3
+l4iw.
+l2l
+2ll.
+ll4ada
+lladr3
+ll5adwy.
+ll3ant
+ll5arn
+lledr4e
+ll4edy
+lle3o
+llest4
+lleu4a
+ll1f
+llf4y
+llin3e
+ll3odd
+llosgad4
+ll5tyr
+lludd3
+llw2
+ll3wa
+llw4e
+5llyd.
+llygr3
+ll4ynn
+ll4yr2
+ll5yro
+lm2
+l1ma
+l4mad
+l4maf
+lm3ai
+l2m3as
+l4mau
+lm3o
+lm3w
+lm4yn
+l1n
+2lo.
+lob5yn
+2loc
+loch3
+2lod
+lodd3
+lo3ed.
+l1og3
+logl2
+l1ol
+lol2w
+lolyg4
+2l1om
+l3om.
+lon2a
+lon3d
+lon4es
+4l3ont
+l3or.
+l4orau
+l4org
+l4ory
+2lot
+lo5ynn
+lp3a
+l3pu
+l1r2
+l3rh
+ls4ig
+l4syn
+l2t
+lt3ad
+lt5eg.
+lt3em
+l5tera
+l5tero
+l4tia
+lt4ig
+l4tio
+lt1o
+l3tra
+ltr4e
+l3tu
+l4tu.
+lt1w
+2lu.
+l2ud
+ludd5y
+lud3w
+lu4edd
+l2un3
+l4un.
+lur5ig
+lust5l
+lw1a
+lwadd4
+lw4ae
+l1wc
+l3wch
+lw3ed
+lw3er
+lw3es
+lw4fa
+lwfr5e
+l4wgr
+lw1i
+lw4ig
+l1wn
+l3wn.
+lw3o
+l1wr1
+4lwre
+l4wyc
+l4wydi
+lwyd4io
+l4wyn3
+l4wyr
+3l4wyt
+lyb3
+2lyc
+l3ych.
+lyd2
+l4yd.
+2lydd
+lydn3
+lydr3
+lyf3a
+lyf5an5
+lyf4n3
+lyf4r3
+5lyfr.
+l2yg
+4lygedd
+4lygia
+lym3
+l4ynau
+lyng3a
+l4yn3y
+lyr3a
+4lysau
+4lysen.
+lys3ga
+lys3ge
+l4ysl
+4lysn
+4lysr
+4lysyn
+lyw1
+m1
+mab3
+mab4i
+m3ac
+mac4w
+m4adad
+m4adaf
+m4adai
+m4adan
+m4adas
+m2adi
+mad4r3
+m4adwc
+m4adwn
+m4ady
+mael3
+maf4l3
+m3ag
+2mai
+m3am
+man3a
+man3e
+m4anf
+man2o
+m3ar
+m4ar.
+mar4ch3
+m4are
+m4ari
+mar4l
+marn3
+m4aru
+mar4wy
+masg2
+mas3ge
+m3at
+mat5eg
+mat4o
+m3aw
+mawd4a
+mbarato5
+m3bi
+m3by
+mcan3
+md2
+m4dai
+mdan4a
+mda5nas
+mda5n4e
+mdd2
+mddadl4
+mddef3
+mddi4d
+m5der.
+m4dera
+mdog4aetho
+mdo3na
+mdo5ne
+mdro3e
+mdwy4
+mdyng5
+mdy5re
+4meda
+4meddia
+4meddwr
+4medi
+4medï
+medr3
+meg3n4
+megni3
+meith3
+me4iw
+mel5yno
+mens4
+ment4e
+mentr5
+5menty
+men5yd
+m2er
+m3er.
+m3erad
+m4eradwy.
+m4eraf
+m4erai
+m4eran
+m4eras
+merch4er
+merdd4
+m4ere
+m5eriada
+m4eroc
+m4erom
+m4eron
+m4erw
+m4ery
+4mesia
+4mesol
+mest4
+4meswr
+4mesy
+meu1
+mfalchi5a
+mfalchi5e
+mffl4
+mfydd4
+mg2
+mgyff4
+mgyffr5o
+mgym4
+mgym5eria
+mgys2
+mh2
+mhar5ad
+mheir4a
+mhe3na
+mhe5ned
+mhe5nes
+mhen3t4
+mhen5w
+mhet2
+mhe3ta
+m2heu
+mhob4l
+mhr4a
+mhryf5
+mhyd4
+mhy3f
+2mi
+m3ias
+m3id3
+m3ie
+mi5gei
+min1
+min4t
+m3io
+m3ir
+mis2
+misg4
+mis4i
+m3it
+m3iw
+m3iy
+ml2
+m2las
+ml5blw
+m3led
+mlew3
+m3lin
+m5liwiais
+m5liwiase
+m5liwiwy
+mlo3na
+mlon4ed
+mlyn3
+m2n
+m3na
+mn4as
+m3ne
+m4ned
+mn5edi
+m5niau
+m3nï3
+m2od
+m3odd
+mod4ig
+mod3r
+mof5yd
+m3og
+m4on.
+mon3a
+mon4d
+m4onï
+mor2
+mor3c
+mordd4
+morddiw5
+mor4o
+m3os2
+mos4i
+mo5siy
+m2p
+mpr3a
+mpr3o
+mpr3w
+mp5wai
+mr2
+m2r3ai
+mra3na
+m2r4ed
+mreg3y
+m4ria
+m4rie
+m4rig
+mro4ad
+mrod4iae
+mrod4ir
+m2roe
+m2roi
+m2roo
+m2row
+m4roy
+m4ryn
+mryn4d
+mrys4o
+ms2
+m3sa
+m2se
+mse3na
+mse5ne
+m2so
+mstr4
+m2t
+mt2a
+mtas4
+m3th
+m2u
+mu4an
+mudd4l
+mud3w
+mu2l3
+mun3
+m3us
+m3w2a
+mw3as
+m3wch
+m3wi
+mwr2
+mwr3i
+m3wt
+mwy3b
+mwyllt4
+mwyn3
+m5wyse
+mwyth4adw
+mwyth4af
+mwyth4asan
+mwyth4aso
+mwyth4asw
+mwyth4ec
+mwyth4em
+mwyth4er
+mwyth4i
+mwyth4oc
+mwyth4w
+mwyth4y
+2m2y
+m3yc
+mych3
+m3yd
+mydd5i
+mydr3
+myd3y
+myf4y
+m4yl.
+myl3a
+m4yln
+m3ym
+myn4ai.
+m3yr
+myr4as
+myr5asa
+myr4edi
+myrf4
+m3ys
+m4ysg.
+mys4w
+myw3y
+3na3b2
+na4bl
+na4bo
+na4ch3
+n2ad
+n3adl
+nad4n
+nadna4
+n4ado
+nad3r
+nad3u
+nad3w
+n3adwr
+n1ae
+nae5ara
+nae5arw
+nael4
+n2afa
+n5afau
+n2af3o
+n4afy
+n4aic
+n4aig
+n4ain
+n4air
+n3al
+nan3a
+nan3e
+nan3f
+nap4om
+n3ar
+narllenad4
+n3asg
+n4asol
+n3as4t
+1nat
+nau3
+n1b2
+nbyd5r
+n2c
+nc3an
+nc5des
+nc4ed
+nc2ei
+nc5en.
+n3ch
+nchwiliad4
+n4cia
+n4cid
+n4cie
+n4cio
+n5ciod.
+n4cir
+n4cit
+n4ciw
+n4ciy
+n3cl
+ncr1
+nct1
+n5cyd.
+n5cyny
+n1d2
+nd3as
+nd3aw
+ndd2
+nd4da
+nden2
+n4d3ia
+nd3ie
+n3di3f
+n3di4g
+n3dil
+nd3io
+nd4ir
+n3dis
+n3dit
+nd3iw
+nd3iy
+n3dod
+nd3oe
+ndo3ra
+ndo5r4e
+n2dwr
+ndy5na
+ndy5ne
+n4dys
+neallad4
+n2eb1
+neb3o
+n5ebry
+neddf5
+n2ede
+n4edid
+n5ediga
+n4edir
+n4edit
+n2edo
+n4edu
+n3edy
+n1ef
+nefn3
+n4efy
+n1eg
+neg5in
+ne3h
+n3eidd
+n2eis
+n1el
+3nel.
+nel5yn
+3nenty
+ner3a
+nerch5
+n4erg
+n4erl
+3nert
+3nese
+4nesia
+n4esio
+nes4m
+3neso
+n2est
+3nesw
+n2esy
+neth5o
+n2eu
+neu3d
+n4euf
+neul4
+3new
+new5yll.
+newyn3
+n1f2
+nfadd4
+nf4am
+nfan3
+nfan5e
+nfan4t
+nfa5ol
+nf4at
+nfel2
+nff2
+nf4fa
+nff4o
+nffyn4
+nffynad4
+nf4id
+n4fil
+nfod4l
+n2fon
+nfon5a
+n5fonedi
+nf4ri
+nf4wy
+n2fy
+n5fyd.
+nfyd3a
+ng2ad
+ng5adwy.
+n4gai
+ngal4
+n3gam
+n3gar
+n4gau
+ng4ddy
+ngel4
+nghwyn5
+n2gi
+n2gl2
+n3glwm
+n4gly
+n5glym
+nglyn3
+ngn2
+ng3oe
+ngof3a
+ngol4ed
+ng3on
+ngop2
+n1gr
+ngr4a
+n2gw
+ng4wi
+ngwy5nas
+ngy3f
+n4gyn
+2n1h2
+nha3o
+nhar4
+nhaws4
+nheb5r
+nhe3na
+nhe3ne
+nhep2
+nh4es
+nho3ed
+nho5esi
+nho3n4a
+nhon4e
+nhudd4ed.
+nhu4e
+nhyc4
+nhyd2
+nhyl4
+nhym4
+n1i
+4ni4ad
+n5iald
+ni1b
+nib4a
+nib4e
+nibryd4
+ni1d
+nidd4
+ni5dde
+nid4e
+n3ie
+ni4et
+ni3eu
+n4iew
+ni3fed
+ni3fen
+ni4feryc
+ni3ffr
+ni3fw
+n2ig
+n5igam
+nige5na
+4nigiad
+n5igiad.
+n5igiada
+5nigiadw
+4nigion
+n5igion.
+5nigiont
+4n5igiwr
+nigl4
+4nigy
+ni3gym4
+nilead4
+nill5adas
+n5illio
+ni3lu
+ni3lys
+nin2
+ni3no
+nin4w
+ni3or
+ni3ra
+nir4e
+ni3ri
+ni4rw
+ni3rym
+nis3g
+ni3so
+nis3ty
+ni3sw
+ni3sy
+nith4e
+niw2
+niw4a
+ni4wc
+niw5eddas
+niw5edde
+niw5eddo
+niw5eddw
+niwl3
+niwl5e
+niwl5o
+niwl5w
+ni5ydd
+n2ïi
+nï4yc
+n1l2
+nladr3
+nlin3
+nll2
+nllon4
+nl4lw
+n4llyn
+n2ly
+nly3na
+nly3ne
+n1m2
+nmolad4
+n1n2
+nn4al
+nn4ar
+nned4
+nneth4
+n3nh
+nni2
+nnif4
+nni4l
+nnill4
+nni4o
+nnis4
+nni4w
+n5nos4b
+nn4wy
+nny3na
+nny5ne
+nn4yw
+no4ada
+n3ob
+n2od.
+n2odo
+nod3r
+n2oe
+noe4o
+no3er
+3no4et
+n1of1
+nof4el
+n2ofy
+n1og
+nol5eg
+nom3
+n4omi
+n5ones
+n1or
+norch4
+nor4f
+2nos3
+nö5es.
+np4et
+n1r2
+nre4o
+n1s2
+n2se
+n3sei
+ns3en
+ns3i
+ns4ic
+ns4ig
+n3s4il
+ns4iy
+ns5iyc
+n3siyn
+nsy3na
+nsy3ne
+nt3ad
+nt5af.
+nt5aid
+nt4ana
+nt3aw
+n2te
+n3tei
+nt3el
+nt3em
+nt3er.
+ntew3
+nth2
+n4tia
+nt5il.
+nt4in
+n3tis
+nt3oc
+nt3od
+nt5od.
+nt3oe
+n4t3or
+n1tr
+nt1w
+nt3yn
+nty3ra
+nty3r4e
+n1u
+nud2o
+nun4i
+nut1
+nw3af
+n3wait
+nw3an
+n3war
+nwar4ed.
+nw3as
+nwbl4
+nwb5le
+nwd3e
+n5wedd
+nw3edi
+n3wei
+nweithi5au
+nwelad4
+nwen5d
+nw4ia
+nw3id
+nwir4
+nw3ir.
+n3wis
+nw3o
+nwr5ei
+n4wy.
+nwybod4a
+n4wyc
+n3wyl
+n2wyn
+n4wyn.
+n3wyt
+nych3
+nyf2
+ny5fala
+ny5fale
+ny5falo
+nyff4
+nyf4n
+nyf4o
+ny5fod
+nyfr3
+n2yg
+ny3gy
+n1yl
+ny3lan
+ny3lu
+nym4a
+nym4y
+n5ynnau
+ny3n4od
+ny3ra
+nyrchafad4
+ny3ri
+n1ys
+n4ys.
+nys4g
+n3yw
+2o1a
+2o2b
+ob3ae
+ob4an
+ob5ant
+ob3ed
+ob3el
+ob5en.
+oben5y
+ob5er.
+obl3a
+obl5ed
+ob3ler
+obl5es
+obl3o
+obl3w
+o3b4ly
+ob3o
+obr1
+ob3yd
+oc1a
+oc5byn
+oc3e
+och3a
+och5an
+och5en
+ochl3a
+ochl5es
+ochl3o
+ochl3w
+och3n
+och4ni
+och3o
+ochr3
+och3w
+och3y
+2oci
+2ocr
+2oct
+2od3a
+od4ao
+odar4
+odd3a
+oddf5y
+odd5il
+oddiw3
+odd3r
+odd5ri
+4oddu
+odd3y
+odd5yd
+odd5yn
+odeb3
+o5debau
+o5debu
+od5edi
+od5eid
+od3el
+od3er
+od3i
+odl3a
+odl3ec
+odl5esi
+odl3w
+od5off
+2odog
+od4oga
+2odr
+odr3a
+odr5ec
+odr5em
+odr3o
+odr5wyd.
+od4ry
+odr5yc
+2odw
+od3wa
+od5wed
+od5wen
+od3yc
+od3yn
+od4ynn
+o1ec
+o4edd3
+oed3i
+o3edig
+oedl4a
+oed5lan
+oed5ra
+oeg3
+oel3c
+o1em
+oen3
+o3ent
+oer3
+oes3
+oesg4o
+oet5an
+oetr3
+2of.
+of3ad
+of3ai
+ofan3
+ofan5e
+of3ant
+ofa5ol
+of5ebi
+of3ed
+of3el
+of3en
+of4enn
+of3er.
+o4ferl
+o4fery
+of4f3a
+off3ed
+off5id
+off3w
+ofiad4w
+ofl3
+of3n
+of4na
+of4nd
+of4ne
+of4nf
+of1o
+of4odo
+ofr3a
+of3re
+of4rec
+of4red
+of4rem
+of4rer
+of5wyf
+of4yn
+ofy3na
+ofy3ne
+og1
+og3ai
+og2an3
+o4ganau
+o4ganu
+og3as
+og4edy
+og5elyn
+og3er
+og5erd
+og3es
+2ogf
+og3i
+2ogl
+ogl3w
+ogl3y
+2ogn3
+3og2o4f
+og5oru
+og3rwy
+o3gry
+og3yd
+ogyf4
+og4yl
+og5yrn
+o1h2
+oheb3
+oher4
+o1id
+oig1
+o1ir
+o1it
+ol1
+2olau
+ol4ce
+ol3d
+ol4da
+4oleu
+ol3eua
+ol4eued
+ol5euo
+ol4euwr
+olew3
+ol3i
+oll1
+oll3e
+oll5ed
+ol4lt
+oll5wy
+olo2
+o3los
+ol3s
+ol4sb
+2olu
+2olwr
+olw4y
+ol3wyd
+ol5wyno
+ol4yne
+ol4yni
+ol4yno
+ol4ynw
+2oma
+om4at
+2omb
+om2e
+om5eda
+om5edi
+om5eg.
+om3ei
+om3en
+om5isi
+2oml
+om4og4
+2omp
+om5pre
+on1
+on5ach.
+on5adu
+on3af
+o4n3ai
+4onair
+on3an
+o4n3au
+on5au.
+2onb
+on5cyf
+2ond
+on5did
+on2do
+2one
+on5edd.
+on3el
+onest3
+2onf
+ongl3
+ong2o
+ong3w
+on4gyr
+2oni
+2onn
+4onnu
+on5of.
+2onog
+on2t
+4onto
+on3w
+2o1o
+2op
+op3a
+op4ao
+op5aon
+opl3
+opr5ai
+op5ren
+or1a
+4orac
+or3ach
+or5aeth.
+or5aetha
+or3af
+or3ai
+or3an
+o4r3au
+or3aw4
+or3b
+or2c
+or3chw
+or4dd
+or5ddyn
+ord3en
+or5din
+or4d5yn
+or1e
+or2eb
+or4edd
+ore5ddy
+4oreg
+or4egw
+or4et
+or3fa
+orfa5na
+orfa5ne
+orff4e
+or3fo
+or3f4y
+2or3g
+or3i
+or3l
+or4mu
+or4my
+orn3a
+or3nel
+or1o
+or3of
+or4oh
+oron5a
+or3one
+or5oni.
+or5onid
+or5onir
+or5onit
+or5pws
+4orth.
+ort4i
+or4ty
+or5uwc
+or1w
+or5wah
+orw4e
+or4wel
+or5wgl
+or1y
+or3ydd
+2os
+os3a
+os4ana
+osb3as
+osb5ed
+osb3o
+osb3w
+osb3y
+os5eai
+osg3a
+os3gl
+osgo5e
+os3gor
+osg3wy
+os5iae
+os5ibi
+os2o
+os3odd
+os3ol
+os3on
+os3te
+os3tr4
+os4tu
+os3w
+os3y
+2ot1
+3ot.
+ot3e
+ot5esa
+oth3
+ots4i
+ot5sia
+o2u
+o1wc
+owg3
+owl5as
+owl3e
+o1wn
+owt5er
+o1wy
+o1yc
+oyw3
+oy4we
+ôr3f
+p1
+p2a
+pab5yd
+2p3ad
+2p3af
+2p3ai
+2p3an
+pa3od
+para3t
+par4c
+par3w
+past4
+p3au
+pawe5na
+2pec
+4p5edig
+p2ei
+peir4a
+p5eli.
+pel3y
+2pem
+pengl4
+pens4
+pen3t2
+pen3w
+penwy5na
+2per
+2pes
+pet2
+pe3ta
+p2h2
+pheir4a
+phen3t4
+phen5w
+phet2
+phe3ta
+phob4l
+phr4a
+phryf5
+p3ia
+pib1
+p3ie
+p3io
+p3iw
+p2l
+pla3na
+p4lau
+pl5eda
+p4lyc
+3plyg
+po4b4l
+pog4y
+pol3
+p2r2
+pr3as
+pryf3
+pr5ynn
+p2s
+ps4iw
+pt2
+p2ud
+p4usr
+pw2
+pwd3
+pwr1
+p4wy.
+pydr3
+p2yr
+r4abe
+r4abi
+rab5lyd
+rab3y
+rach5wy
+r4a4ci
+racs4
+r4a4ct
+r2ada
+r4add
+radd5ol
+rad4ri
+radwr4i
+r2ae
+raed4
+raeddad4
+r4aen
+ra5fann
+ra5fán
+r4aff
+rag1
+ra4ge
+rag3o
+ra3gra
+ra4ha
+ra5hau
+r1ai
+4raidd
+ram3od
+ra5mor
+ra3m2w
+ran4d3
+ran2e
+r4anf
+ran3o
+r4anod.
+ra5phe
+r3ar3
+rar4c
+2r1as
+ras4ie
+ras3t2
+r3atao
+rat3e
+2r1au
+raw3e
+5rawes
+3rawi
+rawn3
+2r1b
+r2ba
+r3bar
+r4bec
+r4bem
+r4bent
+rb4er
+r4bes
+r2bl
+r4boc
+r4bom
+r4bont
+r4bwc
+r4bwd
+r4bwn
+rbyd3
+rc2a
+rc5adw
+rc5af.
+r3car
+rc3e
+rc4er
+r2ch
+rch3ad
+rch3an
+rch3ar5
+rch5eb
+r5chei
+rch3et
+rch3l
+r3chm
+rch3oc
+rch3oe
+rch3og
+r3chu
+r3chwa
+r3chwi
+rch5wyd
+r5chwyn
+rch3yc
+rchyf4
+rchym4
+r1cy
+2rd2
+r1da
+r3dai
+rdan3
+rd5au.
+r2dd
+rdd3ad
+rdd5as
+rdd5ell
+rdd5in
+rdd5iwy
+rdd3o
+rdd4od.
+r5ddodi
+r3dd4u
+r4ddu.
+rddw4
+rdd3yc
+r5ddychw
+rddyrch5
+r5ddyw
+r1de
+rd3i
+rd4in
+rd4ir
+r1do
+r5dod.
+r1dr
+rdro3
+rdro4ada
+r3dw
+r1dy
+rdy4n
+rd3yn.
+re3a
+r3ebai
+r3ebas
+r3ebe
+r3ebi
+rebl3
+r3ebo
+rech3
+rec3i
+4redd
+r5edd.
+r4edio
+r4edol
+r4edwr
+red4yn.
+re4fa
+refn5y
+ref3y
+r4egl
+r5egl.
+r4egog
+re5iau
+r4eic
+re5id.
+reidd5
+r4eig
+r4eil
+r4eine
+re5ir.
+re5it.
+re4iw
+r3ell
+r4emi
+ren4d
+r4eng3
+r4eni
+ren3in
+r4ennyd
+re1o
+r1er
+r4er4id
+rer5in
+restr3
+r4esw
+r4eua
+r4euo
+r2euy
+re4wi
+rew5id
+re5wn.
+rew5ynn
+2r2f
+r1fa
+r4f3ad
+r4faeth.
+r4faf
+r4fai
+rf4ao
+r4fas
+rf4at
+r4fau
+r3fedw
+rfel3
+rf3en
+rf4eny
+rf4ey
+r4ff.
+rff3i
+rff3l
+rff3o
+r3ffw
+rff3y
+rf3id
+r5fil.
+r3fl
+rf3lu
+rfodad4
+rf5ol.
+rf3on
+rfor2
+rf5ord
+r3fr
+r3fu
+rf1w
+rf5wis
+rfyn5yc
+rf4yr
+r3fys
+2r1g2
+rgal4
+rgan3
+r3ge
+rgel4y
+rge3na
+rge5ne
+rgo4f
+r1h2
+rhag5e
+rhag3l
+rhag3o
+rha3n4a
+rhan4e
+r4haw
+rh4es
+rhew5y
+rhif3
+rho4ec
+rhon5a
+rhost4ir
+rhugl5
+rhyf2
+rhy3n4a
+rhyn4e
+ri2
+2ria
+r4iaethu
+riaf3
+r4iag
+ri5agl
+r3iai
+r4i5aidd
+ri5all
+ri4an
+r5iant
+r3ias
+r4iaw
+ri5awd
+rib3e
+ribl3
+rib3w
+rib3y
+ri5can
+r4ida
+ridd3
+ridd5y
+r4idi
+rid4yllau
+2rie
+ri3ei
+rif1
+rig3
+r4igo
+ri3i
+rin5dir
+rin3e
+ringl5
+r4ini
+r4inl
+2rio
+r3ioc
+ri5odad
+ri5odaf
+ri5odai
+ri5odan
+ri5odasai
+ri5odasan
+ri5odase
+ri5odasi
+ri5odasoc
+ri5odasom
+ri5odasw
+r3iodd
+ri3ode
+ri3odi
+ri5odoc
+ri5odod
+ri5odom
+ri5odon
+ri5odwc
+ri5odwn
+ri5odwy
+ri5ody
+r4ioe
+r3iom
+ri3ong
+r3iont
+r1ir
+ris4g
+risgl3
+rist3
+3r4ith
+2riw
+ri4wa
+riw3l4
+r5iwr.
+2r3iy
+r1l2
+rla3na
+rla3ne
+r3lew
+rl3ia
+rl3ie
+rl3io
+r3ll
+r4ll.
+rll4e
+rllen3
+rl4l4w
+rl5og.
+r3lon
+rludd4
+r3lw
+r2lym
+rlyn3
+rl5yn.
+r1m2
+r2ma
+rm4ac
+rm3i
+rm4il
+r2mo
+rm4od
+r3my
+2r2n1
+r4nai.
+r4nau
+rn4es.
+rn4esa
+r5nest
+rng4e
+rn3i
+rn5iae
+rn4ii
+rn5iol
+r3n2ï1
+rn4os
+rn3y
+rn4yw
+2roa
+4road
+4roau
+rob3l4
+roch3
+rochl4
+ro3cr
+rodd3
+r4odr
+rod5rw
+ro4ea
+roed3
+ro4eo
+ro3er
+r2of
+rof3l4
+rofun4ed.
+rof3w
+r3og.
+r4ogae
+ro4ge
+rol3
+r1om3
+r4onau
+rongl4
+rong5lwy
+ron3i
+r4os.
+r4osf
+rosg4
+ros3o
+2rot
+rö5edi
+rp2
+r1pa
+rpar3
+r1pe
+rp5ech
+rp5em.
+r2pen
+rp5ent
+rp5er.
+rp5esi
+rp3i
+rp3o
+rp3wy
+rp3y
+r1r2
+r3ra
+rr4og
+r1s2
+rs4ai
+r4sau
+r2s3en
+rs3i
+rs4in
+rs5li.
+r2s3t2
+r2sy
+r1t2a
+r4tau
+r4ted
+r3teis
+r4ten
+r4tes
+rth3a
+rth4eg
+r3thin
+rth3la
+rth3o
+rth5ol
+rth5ru
+r5thryc
+r4thw
+rth5wyon.
+rth5ydd
+rt4iy
+r1tr
+rtr4a
+rt5rwy
+rt2u
+rt3y
+rub4a
+r3uc
+rudd3
+3rudd.
+run4i
+r1us
+rw2a
+rw3ad
+rw3af
+r3w4ag
+r3wait
+rwb5an
+rwbl3
+r1wc
+r5wdenn
+rwedd3
+r4weddog
+r4weddol
+r4w3eid
+r3wel
+r3wer
+r2wg
+rw5hel
+rw1i
+rw3in
+r3wl
+r4wnc
+rw4ni
+rw4n3o
+rwobr4
+rw3od
+rw5old
+r1wr
+rwr5es
+rwr4iaetho
+rw2y
+r4wyb
+r5wydden.
+rwydd4iad4u
+r4wyde
+r4wydo
+rwydr3
+r4wydy
+3rwym
+rwyn3
+r4wys
+3ry.
+3rybl
+ry3bo
+rych5wai
+r2yd
+r4yd.
+ry5dano
+rydd4on.
+rydl4
+ry3f4a
+ryf2e
+ry3fer
+ryf4od
+ryl3a
+ryl2e
+ryl5it
+rym2r3
+ryn3a
+rync4
+4rynd
+ryn3e
+ryn3f
+ryng5a
+4rynn
+rynod4
+ryno5ded
+ryno5der
+ryn3yc
+rys3b
+rys5ba
+rysg5w
+rysg3y
+ry3wa
+ryw3i
+s1
+sach3
+saf3a
+saf3o
+san3a
+san3e
+san3o
+sarf5a
+sat4a
+sath4
+sathraw4
+s3au
+sá4it
+s2b2
+sbad4w
+s4bai
+s3bet
+sb3iw
+sb5iyc
+s3bl
+sbr5io
+sd4or
+se2
+sec4an
+sedd3
+3sef
+se5ion
+sen5ol
+senw3
+s4erc
+serch5
+s4eri
+s2et
+sf4am
+sfedd4
+sff4y
+sf4wy
+sf4yr
+s2g
+s5g4adr
+sg3adw
+s3gam
+sg3an
+sgar5a
+s3gaw
+s3geda
+s3gede
+s4gedig
+s5gedo
+s5gedw
+sgel4
+sg5en.
+s3ge3na
+sge5ne
+s4gia
+s4gl.
+sgl3a
+sgl3o
+s3gn
+sg3ni
+sg3od
+sg4od.
+sgo4g3
+sg4ol
+sg3om
+sg3on
+sg5oty
+sg5rwy
+sg5ryw
+s4gwc
+sg3wn
+s4gyc
+sgy4f3
+sgy3na
+sgy5nes
+2si
+s5ial.
+s5ialu
+si4am
+5siand
+s4iar
+s3id3
+sid4a
+s3ie
+s4iet
+s2ig
+s3ig.
+si4ga
+s3ige
+sigl3
+5sigl.
+s3igr
+s5igyn
+sil4f
+sins4
+s3io
+s3ir
+s3it
+si4wr
+s2iyn
+2s2ï1
+2sl2
+sl4au
+slo3na
+slo3n4e
+s3ly
+slyw4
+sm2
+sm4ar
+sm4er
+smwyt5haso
+s4nau
+sn2e
+sneg2
+s2n3i
+sn4ob
+s3oc
+sodd3
+sod4l3
+s3oe
+sof4l
+2s3og3
+s3om3
+son3
+s4on.
+s4onau
+son4deba
+son4der
+s3one
+s4ong
+sra3na
+sra5ne
+s2t
+st3ac
+s4tade
+s4taf
+st4am
+st2an
+st3as
+s4tau
+st5awc
+s4tec
+s4ted
+s4tei
+s4t3em
+s4ten
+s4tes
+st3f
+s5tiro
+stl3o
+st5lyt
+st2o
+s3tod.
+sto3ra
+sto3r4e
+st4ra
+s3tra.
+str3ec
+str3es
+str3oc
+str3ol
+s4tr3w
+str3yc
+st2u
+st3ur
+st5us.
+s5twyi
+styr3
+s2u
+sur3
+s3us
+sw2a
+s3wc
+swcr3
+s3we
+s4wed
+sw5edd
+swen3
+2swi
+swmp3
+s3wyf
+swyn3
+swy4r
+s2y
+s3yc
+s5ych.
+s3yd
+syf4l3
+2syg
+syll3a
+syllt3
+sym4l3
+symudad4
+2s3yn.
+syn4fe
+s3yr
+syr2a
+syr2e
+s3ys
+3syt
+s4ywa
+1tac
+tach3
+3tad4l3
+tad3r
+t1af
+ta4fa
+taf4l
+tag3
+t1ai
+t3aid
+t5aliae
+tal2m3
+t1an
+4tanc
+tan3e
+tang5n
+tan3o
+tan3w
+t3ao
+3tar4d
+tar4f
+t1as
+tat1
+t1au
+tawl3
+t1b
+t3ch
+t1ec
+t1ed
+tedd3
+4teg.
+4tegio
+t3eidi
+teimlad4w
+tel4y
+t3em.
+t4emi
+t1en
+ten4d
+te4ne
+terf4
+terfyn5
+t1es
+t4esa
+tes4io
+tet4a
+3tew
+4tew.
+4tewc
+tew5id
+t1f
+tff2
+tff4e
+tfod4
+tfydd4
+t1g2
+tg4af
+tg4an
+tg4en
+tg4er
+tgl4a
+tgn2
+t2gor
+t5gor.
+t5goria
+t5gorn
+tg4wc
+tg4wy
+tgy3w
+t2h
+thalad4
+thal4m3
+thang5n
+th4ar
+thar4f
+th4at
+that5y
+th1e
+th4ef
+th5ell
+therfyn5
+thet4
+thl3a
+thl5ent
+th5let
+th3n
+th5nod
+th1o
+th5old
+thollt4
+thon4e
+thorad4
+thr3ac
+th3red
+thr5ent
+thrid4
+thro3f
+th5rwf
+thryd4
+thry5da
+th3ug
+th3um
+th3un
+th3us
+th1w
+th3wa
+th4wl
+th3wyd
+th3wyf
+thwysg4
+th3ych
+thydd5
+th5yma
+thyrf4au
+thyr3w
+thy4w
+2t1i
+t3ia
+tid3
+t3ie
+t3in
+ting3
+t4ino
+tion4
+t4iono
+tï5ol.
+tl3a
+tl4ae
+tl1e
+tl4en.
+tl3on
+tl3wy
+t3lyd
+t1n2
+t3och
+t4od.
+t3odd
+to4ec
+to3edi
+to4em
+to3esi
+tof3
+t3og3
+3tois
+t2ol
+tollt4
+tol3y
+t1om
+t3om.
+t1on
+ton4e
+t3ont
+3tor
+tor2a
+tor4c
+t3os
+to4wc
+to4wn
+tra3c
+tra3dd
+tr3adw
+tr3af.
+tra3g
+tra3na
+tra5ne
+tr3ant
+3traw
+tr3ed
+3tr4ef
+tref5a
+tref3l
+4treg
+tr3em.
+tr3ent
+3trew
+tr3id4
+tr5ig.
+tro4ada
+tr3odd
+tro5fa
+tr3ola
+tr3olo
+tr3olw
+tron4o
+tr3ont
+2trw
+tr4wm
+tr3wn
+tr5wyd.
+t5r4wydd
+tr3wyf
+try3da
+tryd4y
+try3f
+try3l
+tr5yn.
+3tryw
+ts2
+ts5ach
+t1se
+ts3i
+3tud
+tudr4
+1tum
+t1un3
+1tur
+t4urm
+tw2
+t3wai
+t1wc
+t1wn
+t1wr1
+twr4n
+3twya
+t3wyd
+3twye
+t3wyf
+tw4ym
+3twyo
+twysg4
+3twyw
+t1yc
+t1yd
+tydd5y
+ty5gar
+ty3li
+tymp4
+4t3yn.
+tyng5ad
+1tyr
+tyr2a
+tyr4es
+ty3wr
+2u1a
+ual3
+u2and
+u4ane
+u3ar
+u3aw
+ub1
+2uc
+uch1
+uch3e
+uch5ed
+ud3ad
+u5dale
+udd1
+udd3a
+udd4eg
+udd3el
+udd3f
+udd3i
+ud5eir
+ud3er
+ud3i
+ud1l
+udr3
+ud5rwydd
+ud2w
+ud3wn
+ud3wr
+ud3yn
+u1e
+uedd3
+u4estai.
+u4estau
+u4estwr
+u4esty
+uf5au.
+uff4y
+uf3y
+ug3ad
+ug3af
+ug3en
+ug3i
+ugl3a
+ugl3e
+ug3lw
+ugn3
+ug1o
+ug1u
+ug1w
+ug3y
+u1h2
+u1i
+ul3ad
+ul3af
+u5lan.
+u5lann
+ul3ant
+u5lath
+ul3d
+u2l1e
+ul1f
+ul5igr
+ull1
+u1lo
+ul3oc
+ul3od
+ulon3
+ulon5e
+ul1u
+ul1w
+ul3yc
+u3lyd
+un1
+un4edy
+un5ell
+un5es.
+un3i
+unig3
+un5od.
+un2ol
+un5ol.
+2u1o
+uog3
+u3os3
+up2
+ur1
+urb4w
+ur5ddu
+ur3e
+ur5fau
+ur4fl
+ur2gy
+4urn.
+urof4
+ur2s3
+ur4ty
+ur4ud
+u5rwydd
+ur3y
+ur4yw
+1us.
+us4edda
+us5end
+usg1
+4usi.
+us3o
+3usr
+us3ter
+us3tod
+us3tr
+ut3a
+ut1e
+uth4r3
+uth3u
+uth4un
+ut3o
+utr3
+2u1w
+u2wc
+uwch3
+u1y
+2wa
+wac5ew
+wadd3
+wad2n3
+w5adwy.
+waen4i
+waer2
+wag1
+w1ai
+w3ai.
+w3aid
+w2air
+w3ais
+w4ait
+wallt5
+w4an.
+wan3a
+wan3e
+wan3o
+war5ddr
+war3e
+war4edd
+war5ia
+warth4
+wart5hai
+wart5has
+wart5hi
+wart5hw
+war3w
+3w4as.
+w3ase
+was4g
+w3asi
+w3aso
+w4as4t
+w3asw
+wat5er
+w1au
+2wb
+wbl5es
+w2c
+2wca
+wc4ed
+wch1
+4wchu
+2wci
+wc5wll
+wc4yn
+2wd
+wdd3eg
+w5ddew
+wd2e
+wd3ed
+wde3n4a
+wde5n4e
+wd3i
+wd4ih
+wd3ly
+w3dod.
+wdr1
+wd4ra
+wdry4
+wd2u
+w1eb3
+2w1ec
+2w3ed.
+w4eda
+4weddf
+4weddi
+4wedi
+w3edig
+we4gi
+wegr4
+wein3
+well5ti
+wel3o
+welw5l
+2w1em
+wen3au
+wen4d
+2w3ent
+wenwyn5
+wen3y
+2w3er.
+wer4i
+wer5id
+w4ers
+wer4yd
+2wes
+4w3esi
+w4esir
+w4esit
+5west.
+west4ai
+w1et
+w4eth
+2weu
+weu2g
+weun3
+2wf2
+w1fa
+w1fe
+wff3a
+w1fi
+wf4id
+w1fo
+wfor2
+w1fw
+wf4wy
+w3fy
+wg1
+2wg.
+w5gig.
+2wgl
+wg3n
+2w1h2
+w3he
+w3hw
+2wi
+wi4an
+wib5an
+wibl5a
+wib5ol
+widl3
+wi4fr
+3wig1
+wigl5e
+wil3
+win5gada
+win5gade
+win5gadi
+win5gado
+w4ione
+wir3
+wisg3
+w1it
+3wiw.
+wiw4e
+2wl
+3wlad.
+wlan3
+wl4co
+wl3in
+w4lip
+wll5yn
+wl5ws.
+wl4yc
+2wm
+wm3a
+wman3
+wm4br
+wm2i
+wm5iai
+wm5ian
+wm4wl
+wn1
+wn5adwy.
+wn2ae
+2wnd
+wn3de
+wn3di
+wndr3
+wn4ei
+wn4êl
+2wn3g
+wngl4
+wn3in
+wn3l
+wn2o
+w4n3oc
+wn3odd
+wn3og
+wn3ol
+w4n3om
+w4n3on
+2wnw
+2w1o
+w2od
+w3od.
+w3odd
+w2ol
+w3ol.
+w3olae
+w2or
+2wp
+wp3e
+wpl1
+wp5wrd
+wr5aet
+wrb5yn
+wrc2
+wr3ca
+wr4ce
+wr4ch3
+wr4ci
+wr5cwd
+2wrd
+wr5dei
+wr3ed
+wreig3
+wr5esi
+wr3f
+wr5fau
+wr4fi
+4wri.
+wrid3
+wr3id.
+wr3ie
+wr3l
+wr4ll
+wr3n2a
+wrn4es
+wr3no
+wr1o
+wr2t
+wrth3
+wr1w
+wr4ws
+w5rwydd
+wry4w
+ws5bre
+ws3e
+ws3g
+ws4gl
+ws4ig
+ws4og
+ws4ta
+wst5an
+ws5ter.
+wstr3
+ws4us
+ws3wa
+2wt
+wt3a
+wtan3
+wt3em
+wt5ery
+wth1
+4wth.
+wth3w
+wt3od
+wt3wy
+wt3y
+2w1w
+2wya
+wy5alc
+4wybr
+wybr5y
+wy3bu
+w1yc
+wych3
+wyd3a
+2wydd
+wydd4ly
+wydd4yd
+wydr3o
+2wydy
+2wye
+wy3fr
+wy3h
+2wyi
+2wyl
+wyl4deb
+wyll3a
+wyn5ad.
+4wynd
+wyn3eg
+wyn3f
+wyn3g4
+wy4ni
+wyn3o
+wyn3y
+2wyo
+wyr3ad
+wy3ran
+5wyrdd.
+wyrl3i
+2wys
+2wyt
+2wyw
+wy3wr
+wy3wy
+2wyy
+2y1a
+y3ar3
+y4ar.
+y4arn
+2yb
+yb4ac
+yb5edd
+yber4
+ybl1
+yb3ly
+ybr1
+ybr3i
+yb3w
+ych1
+ychan5
+ych4anwr
+ych5ei
+ych3r
+4ychwe
+ych3wy
+ychwy5na
+ychwy5ne
+ycl3
+2yd.
+2yda
+yd3ad
+yd4al
+yd2an3
+y3dana
+y3dane
+yd3ant
+y5danw
+y3dar
+yd3as
+yd3au
+ydd3
+ydd5an
+yd4de
+yd4df4
+yd4di4
+ydd4in.
+ydd4of
+ydd5yn.
+yddy5ne
+ydd4ysg
+2yde
+y3deb
+yd3ed
+yd4eddau
+yd3ei
+yd3er
+yd4eu
+yd5ffu
+ydfwr3
+ydfyn3
+yd3i
+yd1l
+yd4ma
+yd2ne
+ydne5b
+2yd3o
+yd4od.
+ydol3
+yd4os
+4ydrau
+ydr3ec
+ydr3em
+ydr5esid
+yd3rew
+yd4ri
+4ydria
+ydr3oc
+4ydrol
+ydr5wyd.
+yd5rwydd
+4ydry
+ydr3yc
+2ydw
+yd3wa
+yd5wed
+ydweithi5ol
+ydwel5e
+yd3wr
+yd1y
+ydy4l
+y1e
+y3el
+y4era
+y4ern
+2yf1
+y4f3ag
+yf3ai
+yfan3t
+yf3are
+yf3arh
+yfar5wa
+yf3eda
+yf3ede
+yf3edi
+yf3edo
+yf3edw
+yf3ei
+yfel3
+yf5erf
+yfer3n
+yf5esi
+yf5ewi
+yff1
+yf4fa
+yf5fait
+yf5fei
+y4ff3i
+yff5in
+y4ffl
+yffr3a
+yffro5ed
+yffro5em
+yffro5en
+yffro5wc
+yffr3w
+yff3ry
+yf3i
+yfl4ed
+yflo3e
+yf3ne
+yf3no
+yf3ny
+yf3o
+yf5od.
+yfogl4
+yf5rait
+yfra5ne
+yf5ryw
+yf3u
+yf5wng
+yf3yg
+yf5yn.
+yfy3na
+yfy5ne
+yfyng5
+yf4yt
+yg1
+yg3a
+yg5adu
+yg4ar
+ygeg4
+yg4eid
+yg3i
+yg4il
+3ygin
+ygl3a
+ygl3o
+ygl3w
+ygl3y
+ygn3
+yg3o
+yg4oe
+yg4of
+ygr1
+ygrad4
+yg5wyd
+y4gyc
+4ygyd
+y1h2
+y2he
+yhe3i
+yhe3w
+y1i
+y3ie
+yl3ad.
+yl5adwy.
+yl3af
+ylan3
+yl3ant
+y5law.
+2ylc
+ylch3w
+yl4dera
+yl1e
+yl1f
+y3lin
+y4lit
+yll5ad.
+yll3e
+4yllf
+yll5ida
+yll3o
+yll3w
+yll3y
+yl5nos
+yl3oc
+yl3od
+yl3on
+yl5ore
+y4lu.
+4ylwe
+yl3wy
+yl1y
+ym5ait
+ym4al
+ym5an.
+yman5t
+ymar5w
+ymbl2
+ym5edr
+ym4eri
+ym5es3u
+3ymg
+ym3heu
+ym2le
+ym2li
+ymlo5ne
+ym4oli
+ym3on
+ymp3a
+ym4pi
+ymp5od
+ym3pr
+ymra5ne
+ymr5ig
+ymro5e
+ym4ru
+ym3se
+ym4um
+5ymwyb
+ym3y
+ymyn5y
+ym5yra
+ym5yre
+ym5yri
+ym5yro
+ym5yrw
+yn4ada
+yn3ae
+yn3af
+yn3ai
+yn3an3
+ynas3
+2yn3au
+yn4aw
+yn5byn
+ync5ed
+yn3dir
+yn4eb
+yn3ec
+yn3ed.
+yn3edd
+yn2eg
+yn3ei
+yn3em
+yn3en
+yn3er
+y3nesa
+y4nesau
+2ynf
+ynfyd3
+2yng1
+yn4ge
+yng5er
+yn3gl
+yniaw4
+yni4d
+yn3i4f
+y3nig
+yn5igy
+yn3il3
+yn3n
+yn1o
+yn5o5ad
+yn5odd
+yn4odi
+yn4ody
+yn3oe
+yn3os4
+2ynr
+ynt1
+ynt4a
+yn4te
+yn4ti
+yn4to
+yn4tu
+yn4ud
+yn1w
+yn3wa
+yn2w4e
+yn3wy
+yn4wyr
+yn1y
+yn2yc
+ynydd5
+y1o
+ypl3a
+ypl3e
+ypl3o
+ypl3w
+yp3ly
+yr3ae
+yr3af
+yra3na
+yra3ne
+yr3ant
+y4r3au
+yr4ch
+yrch3e
+yrch3o
+yrch3w
+yrch3y
+yr4dd3
+yr5ddyd
+yr1e
+yr2ei
+yr5el.
+yren5d
+yrf3e
+yr3ff4
+yr4fu
+yrf5yd
+y4ria
+yr3id
+yr2l
+yr3ly
+yrn3
+yr1o
+yr5ol.
+yr2s
+yr1w
+yr5way
+yr1y
+2ysa
+ys3aw
+2ysb
+ysb5ïw
+ys4bl
+ysb3yd
+2yse
+ys5etl
+2ysf
+4ysgar.
+ys5garai
+ys5garasa
+ys5garia
+ys5garwy
+ysge4
+ysgl4e
+ysg5lw
+ys4gn
+3ysgr
+ys4gy
+2ysi
+ys5ni.
+2yso
+ys3od
+4ysol
+ys5ol.
+ys3ta
+4yste
+yst5eb
+ys5ted
+ys3ter
+ys4try
+yst4w
+ys3u
+2ysw
+ys4we
+ys4wi
+2ys3y
+ys4yg
+yt3ad
+yt1e
+yth3a
+yth3e
+ythi3e
+yth3l
+yth3o
+yth4re
+ythr5ec
+ythr5ed
+ythr5es
+yth5reu
+ythr3o
+yth5rwb
+ythr5yc
+yth5ur
+yth3w
+yth3yn
+yt5iro
+yt3o
+ytr2
+yt3ras
+yt3s
+ytw5ad
+yt3wy
+yt5ysa
+2yw
+yw4ae
+y3wait
+y1wc
+y3wedd
+y5weddia
+yw5eg.
+y4wel
+yw5en.
+yw3es
+yw1g2
+y4wia
+yw3id
+y4wio
+y4wir.
+y1wn
+yw3ol
+y2wr1
+ywr4a
+ywr5ain
+y4wyc
+y3wyf
+ywy3na
+ywy5ne
+y1y} \ No newline at end of file
diff --git a/tex/context/patterns/lang-cy.rme b/tex/context/patterns/lang-cy.rme
new file mode 100644
index 000000000..7a7ed6640
--- /dev/null
+++ b/tex/context/patterns/lang-cy.rme
@@ -0,0 +1,64 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: cyhyph.tex ()
+% Author: Yannis Haralambous
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Welsh patterns
+% Yannis Haralambous 1996 \ No newline at end of file
diff --git a/tex/context/patterns/lang-da.hyp b/tex/context/patterns/lang-da.hyp
new file mode 100644
index 000000000..f9d33a5a2
--- /dev/null
+++ b/tex/context/patterns/lang-da.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-da.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-da.pat b/tex/context/patterns/lang-da.pat
new file mode 100644
index 000000000..fdccc42f9
--- /dev/null
+++ b/tex/context/patterns/lang-da.pat
@@ -0,0 +1,1151 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-da.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z å æ ø
+
+\patterns{
+.ae3
+.an3k
+.an1s
+.be5la
+.be1t
+.bi4tr
+.der3i
+.diagno5
+.her3
+.hoved3
+.ne4t5
+.om1
+.ove4
+.po1
+.til3
+.yd5r
+ab5le
+3abst
+a3c
+ade5la
+5adg
+a1e
+5afg
+5a4f1l
+af3r
+af4ri
+5afs
+a4gef
+a4gi
+ag5in
+ag5si
+3agti
+a4gy
+a3h
+ais5t
+a3j
+a5ka
+a3ke
+a5kr
+aku5
+a3la
+a1le
+a1li
+al3k
+4alkv
+a1lo
+al5si
+a3lu
+a1ly
+am4pa
+3analy
+an4k5r
+a3nu
+3anv
+a5o
+a5pe
+a3pi
+a5po
+a1ra
+ar5af
+1arb
+a1re
+5arg
+a1ri
+a3ro
+a3sa
+a3sc
+a1si
+a3sk
+a3so
+3a3sp
+a3ste
+a3sti
+a1ta1
+a1te
+a1ti
+a4t5in
+a1to
+ato5v
+a5tr
+a1tu
+a5va
+a1ve
+a5z
+1ba
+ba4ti
+4bd
+1be
+be1k
+be3ro
+be5ru
+be1s4
+be1tr
+1bi
+bi5sk
+b1j
+4b1n
+1bo
+bo4gr
+bo3ra
+bo5re
+1br4
+4bs
+bs5k
+b3so
+b1st
+b5t
+3bu
+bu4s5tr
+b5w
+1by
+by5s
+4c1c
+1ce
+ce5ro
+3ch
+4ch.
+ci4o
+ck3
+5cy
+3da
+4d3af
+d5anta
+da4s
+d1b
+d1d4
+1de
+de5d
+4de4lem
+der5eri
+de4rig
+de5sk
+d1f
+d1g
+d3h
+1di
+di1e
+di5l
+d3j
+d1k
+d1l
+d1m
+4d1n
+3do
+4dop
+d5ov
+d1p
+4drett
+5d4reve
+3drif
+3driv
+d5ros
+d5ru
+ds5an
+ds5in
+d1ski
+d4sm
+d4su
+dsu5l
+ds5vi
+d3ta
+d1te
+dt5o
+d5tr
+dt5u
+1du
+dub5
+d1v
+3dy
+e5ad
+e3af
+e5ag
+e3ak
+e1al
+ea4la
+e3an
+e5ap
+e3at
+e3bl
+ebs3
+e1ci
+ed5ar
+edde4
+eddel5
+e4do
+ed5ra
+ed3re
+ed3rin
+ed4str
+e3e
+3eff
+e3fr
+3eft
+e3gu
+e1h
+e3in
+ei5s
+e3je
+e4j5el
+e1ka
+e3ke
+e3kl
+4e1ko
+e5kr
+ek5sa
+3eksem
+3eksp
+e3ku
+e1kv
+e5ky
+e3lad
+el3ak
+el3ar
+e1las
+e3le
+e4lek
+3elem
+e1li
+5elim
+e3lo
+el5sa
+e5lu
+e3ly
+e4mad
+em4p5le
+em1s
+en5ak
+e4nan
+4enn
+e4no
+en3so
+e5nu
+e5ol
+e3op
+e1or
+e3ov
+epi3
+e1pr
+e3ra
+er3af
+e4rag
+e4rak
+e1re
+e4ref
+er5ege
+5erhv
+e1ri
+e4rib
+er1k
+ero5d
+er5ov
+er3s
+er5tr
+e3rum
+er5un
+e5ry
+e1ta
+e1te
+etek4s
+e1ti
+e3tj
+e1to
+e3tr
+e3tu
+e1ty
+e3um
+e3un
+3eur
+e1va
+e3ve
+e4v3erf
+e1vi
+e5x
+1fa
+fa4ce
+fags3
+f1b
+f1d
+1fe
+fej4
+fejl1
+f1f
+f1g
+f1h
+1fi
+f1k
+3fl
+1fo
+for1en
+fo4ri
+f1p
+f1s4
+4ft
+f3ta
+f1te
+f1ti
+f5to
+f5tvi
+1fu
+f1v
+3fy
+1ga
+g3art
+g1b
+g1d
+1ge
+4g5enden
+ger3in
+ge3s
+g3f
+g1g
+g1h
+1gi
+gi4b
+gi3st
+5gj
+g3k
+g1l
+g1m
+3go
+4g5om
+g5ov
+g3p
+1gr
+gs1a
+gsde4len
+g4se
+gsha4
+g5sla
+gs3or
+gs1p
+g5s4tide
+g4str
+gs1v
+g3ta
+g1te
+g1ti
+g5to
+g3tr
+gt4s
+g3ud
+gun5
+g3v
+1gy
+g5yd
+4ha.
+heds3
+he5s
+4het
+hi4e
+hi4n5
+hi3s
+ho5ko
+ho5ve
+4h3t
+hun4
+hund3
+hvo4
+i1a
+i3b
+i4ble
+i1c
+i3dr
+ids5k
+i1el
+i1en
+i3er
+i3et.
+if3r
+i3gu
+i3h
+i5i
+i5j
+i1ka
+i1ke
+ik1l
+i5ko
+ik3re
+ik5ri
+iks5t
+ik4tu
+i3ku
+ik3v
+i3lag
+il3eg
+il5ej
+il5el
+i3li
+i4l5id
+il3k
+i1lo
+il5u
+i3mu
+ind3t
+5inf
+ings1
+in3s
+in4sv
+inter1
+i3nu
+i3od
+i3og
+i5ok
+i3ol
+ion4
+ions1
+i5o5r
+i3ot
+i5pi
+i3pli
+i5pr
+i3re
+i3ri
+ir5t
+i3sc
+i3si
+i4sm
+is3p
+i1ster
+i3sti
+i5sua
+i1ta
+i1te
+i1ti
+i3to
+i3tr
+it5re.
+i1tu
+i3ty
+i1u
+i1va
+i1ve
+i1vi
+j3ag
+jde4rer
+jds1
+jek4to
+4j5en.
+j5k
+j3le
+j3li
+jlmeld5
+jlmel4di
+j3r
+jre5
+ju3s
+5kap
+k5au
+5kav
+k5b
+kel5s
+ke3sk
+ke5st
+ke4t5a
+k3h
+ki3e
+ki3st
+k1k
+k5lak
+k1le
+3klu
+k4ny
+5kod
+1kon
+ko3ra
+3kort
+ko3v
+1kra
+5kry
+ks3an
+k1si
+ks3k
+ks1p
+k3ste
+k5stu
+ks5v
+k1t
+k4tar
+k4terh
+kti4e
+kt5re
+kt5s
+3kur
+1kus
+3kut
+k4vo
+k4vu
+5lab
+lad3r
+5lagd
+la4g3r
+5lam
+1lat
+l1b
+ldiagnos5
+l3dr
+ld3st
+1le.
+5led
+4lele
+le4mo
+3len
+1ler
+1les
+4leu
+l1f
+lfin4
+lfind5
+l1go1
+l3h
+li4ga
+4l5ins
+4l3int
+li5o
+l3j
+l1ke
+l1ko
+l3ky
+l1l
+l5mu
+lo4du
+l3op
+4l5or
+3lov
+4l3p
+l4ps
+l3r
+4ls
+lses1
+ls5in
+l5sj
+l1ta
+l4taf
+l1te
+l4t5erf
+l3ti
+lt3o
+l3tr
+l3tu
+lu5l
+l3ve
+l3vi
+1ma
+m1b
+m3d
+1me
+4m5ej
+m3f
+m1g
+m3h
+1mi
+mi3k
+m5ing
+mi4o
+mi5sty
+m3k
+m1l
+m1m
+mmen5
+m1n
+3mo
+mo4da
+4mop
+4m5ov
+m1pe
+m3pi
+m3pl
+m1po
+m3pr
+m1r
+mse5s
+ms5in
+m5sk
+ms3p
+m3ste
+ms5v
+m3ta
+m3te
+m3ti
+m3tr
+m1ud
+1mul
+mu1li
+3my
+3na
+4nak
+1nal
+n1b
+n1c
+4nd
+n3dr
+nd5si
+nd5sk
+nd5sp
+1ne
+ne5a
+ne4da
+nemen4
+nement5e
+neo4
+n3erk
+n5erl
+ne5sl
+ne5st
+n1f
+n4go
+4n1h
+1ni
+4nim
+ni5o
+ni3st
+n1ke
+n1ko
+n3kr
+n3ku
+n5kv
+4n1l
+n1m
+n1n
+1no
+n3ord
+n5p
+n3r
+4ns
+n3si
+n1sku
+ns3po
+n1sta
+n5sti
+n1ta
+nta4le
+n1te
+n1ti
+ntiali4
+n3to
+n1tr
+nt4s5t
+nt4su
+n3tu
+n3ty
+4n1v
+3ny
+n3z
+o3a
+o4as
+ob3li
+o1c
+o4din
+od5ri
+od5s
+od5un
+o1e
+of5r
+o4gek
+o4gel
+o4g5o
+og5re
+og5sk
+o5h
+o5in
+oi6s5e
+o1j
+o3ka
+o1ke
+o3ku
+o3la
+o3le
+o1li
+o1lo
+o3lu
+o5ly
+1omr
+on3k
+ook5
+o3or
+o5ov
+o3pi
+op3l
+op3r
+op3s
+3opta
+4or.
+or1an
+3ordn
+ord5s
+o3re.
+o3reg
+o3rek
+o3rer
+o3re3s
+o3ret
+o3ri
+3orient
+or5im
+o4r5in
+or3k
+or5o
+or3sl
+or3st
+o3si
+o3so
+o3t
+o1te
+o5un
+ov4s
+3pa
+pa5gh
+p5anl
+p3d
+4pec
+3pen
+1per
+pe1ra
+pe5s
+pe3u
+p3f
+4p5h
+1pla
+p4lan
+4ple.
+4pler
+4ples
+p3m
+p3n
+5pok
+4po3re
+3pot
+4p5p4
+p4ro
+1proc
+p3sk
+p5so
+ps4p
+p3st
+p1t
+1pu
+pu5b
+p5ule
+p5v
+5py3
+qu4
+4raf
+ra5is
+4rarb
+r1b
+r4d5ar
+r3dr
+rd4s3
+4reks
+1rel
+re5la
+r5enss
+5rese
+re5spo
+4ress
+re3st
+re5s4u
+5rett
+r1f
+r1gu
+r1h
+ri1e
+ri5la
+4rimo
+r4ing
+ringse4
+ringso4r
+4rinp
+4rint
+r3ka
+r1ke
+r1ki
+rk3so
+r3ku
+r1l
+rmo4
+r5mu
+r1n
+ro1b
+ro3p
+r3or
+r3p
+r1r
+rre5s
+rro4n5
+r1sa
+r1si
+r5skr
+r4sk5v
+rs4n
+r3sp
+r5stu
+r5su
+r3sv
+r5tal
+r1te
+r4teli
+r1ti
+r3to
+r4t5or
+rt5rat
+rt3re
+r5tri
+r5tro
+rt3s
+r5ty
+r3ud
+run4da
+5rut
+r3va
+r1ve
+r3vi
+ry4s
+s3af
+1sam
+sa4ma
+s3ap
+s1ar
+1sat
+4s1b
+s1d
+sdy4
+1se
+s4ed
+5s4er
+se4se
+s1f
+4s1g4
+4s3h
+si4bl
+1sig
+s5int
+5sis
+5sit
+5siu
+s5ju
+4sk.
+1skab
+1ske
+s3kl
+sk5s4
+5sky
+s1le
+s1li
+slo3
+5slu
+s5ly
+s1m
+s4my
+4snin
+s4nit
+so5k
+5sol
+5som.
+3somm
+s5oms
+5somt
+3son
+4s1op
+sp4
+3spec
+4sper
+3s4pi
+s1pl
+3sprog.
+s5r4
+s1s4
+4st.
+5s4tam
+1stan
+st5as
+3stat
+1stav
+1ste.
+1sted
+3stel
+5stemo
+1sten
+5step
+3ster.
+3stes
+5stet
+5stj
+3sto
+st5om
+1str
+s1ud
+3sul
+s3un
+3sur
+s3ve
+3s4y
+1sy1s
+5ta.
+1tag
+tands3
+4tanv
+4tb
+tede4l
+teds5
+3teg
+5tekn
+teo1
+5term
+te5ro
+4t1f
+6t3g
+t1h
+tialis5t
+3tid
+ti4en
+ti3st
+4t3k
+4t1l
+tli4s5
+t1m
+t1n
+to5ra
+to1re
+to1ri
+tor4m
+4t3p
+t4ra
+4tres
+tro5v
+1try
+4ts
+t3si
+ts4pa
+ts5pr
+t3st
+ts5ul
+4t1t
+t5uds
+5tur
+t5ve
+1typ
+u1a
+5udl
+ud5r
+ud3s
+3udv
+u1e
+ue4t5
+uge4ri
+ugs3
+u5gu
+u3i
+u5kl
+uk4ta
+uk4tr
+u1la
+u1le
+u5ly
+u5pe
+up5l
+u5q
+u3ra
+u3re
+u4r3eg
+u1rer
+u3ro
+us5a
+u3si
+u5ska
+u5so
+us5v
+u1te
+u1ti
+u1to
+ut5r
+ut5s4
+5u5v
+va5d
+3varm
+1ved
+ve4l5e
+ve4reg
+ve3s
+5vet
+v5h
+vi4l3in
+1vis
+v5j
+v5k
+vl4
+v3le
+v5li
+vls1
+1vo
+4v5om
+v5p
+v5re
+v3st
+v5su
+v5t
+3vu
+y3a
+y5dr
+y3e
+y3ke
+y5ki
+yk3li
+y3ko
+yk4s5
+y3kv
+y5li
+y5lo
+y5mu
+yns5
+y5o
+y1pe
+y3pi
+y3re
+yr3ek
+y3ri
+y3si
+y3ti
+y5t3r
+y5ve
+zi5o
+.så3
+.ær5i
+.øv3r
+a3tø
+a5væ
+brød3
+5bæ
+5drøv
+dstå4
+3dæ
+3dø
+e3læ
+e3lø
+e3rø
+er5øn
+e5tæ
+e5tø
+e1væ
+e3æ
+e5å
+3fæ
+3fø
+fø4r5en
+giø4
+g4sø
+g5så
+3gæ
+3gø1
+3gå
+i5tæ
+i3ø
+3kø
+3kå
+lingeniø4
+l3væ
+5løs
+m5tå
+1mæ
+3mø
+3må
+n3kæ
+n5tæ
+3næ
+4n5æb
+5nø
+o5læ
+or3ø
+o5å
+5præ
+5pæd
+på3
+r5kæ
+r5tæ
+r5tø
+r3væ
+r5æl
+4røn
+5rør
+3råd
+r5år
+s4kå
+3slå
+s4næ
+5stø
+1stå
+1sæ
+4s5æn
+1sø
+s5øk
+så4r5
+ti4ø
+3træk.
+t4sø
+t5så
+t3væ
+u3læ
+3værd
+1værk
+5vå
+y5væ
+æb3l
+æ3c
+æ3e
+æg5a
+æ4gek
+æ4g5r
+ægs5
+æ5i
+æ5kv
+ælle4
+æn1dr
+æ5o
+æ1re
+ær4g5r
+æ3ri
+ær4ma
+ær4mo
+ær5s
+æ5si
+æ3so
+æ3ste
+æ3ve
+øde5
+ø3e
+ø1je
+ø3ke
+ø3le
+øms5
+øn3st
+øn4t3
+ø1re
+ø3ri
+ørne3
+ør5o
+ø1ve
+å1d
+å1e
+å5h
+å3l
+å3re
+års5t
+å5sk
+å3t} \ No newline at end of file
diff --git a/tex/context/patterns/lang-da.rme b/tex/context/patterns/lang-da.rme
new file mode 100644
index 000000000..2b9c01b54
--- /dev/null
+++ b/tex/context/patterns/lang-da.rme
@@ -0,0 +1,74 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: dkcommon.tex (yyyy-mm-dd), dkspecial.tex (yyyy-mm-dd)
+% Author: Frank Jensen <frank.jensen at hugin.com>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% This file contains the hyphenation patterns for Danish.
+%
+%% Copyright 1994 Frank Jensen (Frank.Jensen@hugin.com)
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-de.hyp b/tex/context/patterns/lang-de.hyp
new file mode 100644
index 000000000..21cafe841
--- /dev/null
+++ b/tex/context/patterns/lang-de.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-de.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-de.pat b/tex/context/patterns/lang-de.pat
new file mode 100644
index 000000000..2b0c8a107
--- /dev/null
+++ b/tex/context/patterns/lang-de.pat
@@ -0,0 +1,14218 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-de.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z ß à á â ä ç è é ê ë í ñ ó ô ö ü
+
+\patterns{
+.ab1a
+.abi4
+.ab3l
+.abo2
+.ab3ol
+.ab1or
+.ack2
+.ag4n
+.ag4r
+.ag2u
+.ai2s
+.akt2a
+.al3br
+.al2e
+.al5l4en
+.al4tei
+.alt3s
+.ampe4
+.amt4s3
+.an3d2
+.anden6k
+.and4ri
+.ang2
+.an3gli
+.angs4
+.angst3
+.an3s
+.an4si.
+.ans2p
+.ans2t
+.an4tag
+.an3th
+.apo1
+.aps2
+.ari1e
+.ark2a
+.ar4m3ac
+.ar2sc
+.ar4t3ei
+.as3t
+.as4ta
+.at4h
+.au3d
+.au2f3
+.au4s3
+.ausch3
+.ax4
+.äm3
+.ät2s
+.be3erb
+.bei6ge.
+.be3ra
+.be3r2e
+.berg3a
+.ber6gab
+.ber4g3r
+.boge2
+.bo4s3k
+.bu4ser
+.by4t
+.ch2
+.dab4
+.da2r1
+.da4rin
+.darm1
+.da4te.
+.da4tes
+.de2al
+.de1i
+.de4in.
+.de1o2
+.de3r4en
+.de1s
+.des2e
+.de3sk
+.des2t
+.dien4e
+.do2mo
+.do1pe
+.dorf1
+.dü1b
+.dys1
+.ebe2r1
+.ehe1i
+.ei3e2
+.ei4na
+.einen6g
+.ei2sp
+.ei4st
+.ei4tr
+.eke2
+.el2bi
+.elb3s
+.em3m2
+.en1
+.en4d3er
+.en5der.
+.en2d3r
+.end3s
+.enn2
+.enns3
+.en2t3
+.en4tei
+.en4tr
+.er8brecht
+.er2da
+.er4dan
+.er4dar
+.er4dei
+.er4der
+.er1e
+.ere3c
+.erf4
+.er1i
+.er8stein
+.er8stritt.
+.er8stritten.
+.er4zen4
+.es1p
+.es3ta
+.es5t4e
+.est2h
+.es3to
+.es5tr
+.et2s
+.eu1
+.eu3g4
+.eu3t
+.eve4r
+.ext4
+.fe2i
+.fer4no
+.fi3est
+.fi4le.
+.fi4len
+.fi2s
+.flug1
+.for2t
+.fs4
+.fu2sc
+.ga4t
+.gd2
+.ge5nar
+.ge3ne
+.ge3r2a
+.ge3r2e
+.ge3u
+.gs4
+.guss1
+.hau2t1
+.he2
+.he3fe
+.her3an
+.he3ri
+.he6r5inn
+.ho4met
+.ia4
+.im2a
+.ima4ge
+.im5m
+.in1
+.in3e
+.ink4
+.inn2e
+.int6
+.inu1
+.ire3
+.is2a
+.jor3
+.ka2b5l
+.ka2i
+.kamp2
+.ka4t3io
+.ki4e
+.kle2i
+.kopf1
+.ks2
+.kus2
+.le4ar
+.li2f
+.li4tu
+.lo4g3in
+.lo3ver
+.lus4tr
+.ma3d
+.ma2i
+.ma3la
+.ma2st
+.md2
+.me2e
+.mel2a
+.men8schl
+.men8schw
+.men3t4
+.mi4t1
+.mm2
+.näs1c
+.ne4s
+.ni4e
+.nob4
+.no4th
+.nus2
+.oa3
+.ob1a
+.obe2
+.oper4
+.or2a
+.ort2
+.orts3e
+.oste2
+.ost5end
+.os8ten8de
+.oste6re
+.ost3r
+.ozo4
+.öd2
+.pa4r1e
+.par3t4h
+.pf4
+.ph4
+.poka2
+.pro1
+.ps2
+.ram3s
+.reb3s2
+.re3cha
+.rein4t
+.reli1
+.reli3e
+.res6tr
+.ri2as
+.richt6e
+.ro4a
+.ro3m2a
+.rö2s1
+.rü1b
+.rü6cker6
+.sali3e
+.sch4
+.se3ck
+.sen3s
+.ser2u
+.se2t1
+.sha2
+.sim3p4
+.si4te
+.ski1e
+.spiege8lei
+.st4
+.sto4re
+.sucher6
+.tage4s
+.tal2e
+.tan4k3l
+.ta2to
+.te2e
+.te2f
+.te3no
+.te2s
+.te4st
+.th4
+.ti2a
+.tid1
+.ti2s
+.ti5ta
+.tite4
+.to4nin
+.to4pl
+.to2w
+.tri3es
+.tro2s
+.ts2
+.tu3ri
+.uf2e2
+.ufer1
+.ul4mei
+.um3
+.umo2
+.un3a2
+.un3d
+.un3e
+.un3g
+.uni4t
+.un3s
+.uns4t
+.ur1
+.ur2i
+.urin4s
+.ur3o2m
+.uro2p
+.ur3s2
+.ut2a
+.ut3r
+.übe4
+.ve5n2e
+.vo4r
+.wah4l
+.wa2s
+.wei4ta
+.wi4e
+.wor2
+.wort5en6
+.wor8tend
+.wor4tu
+.xe3
+.ya4l
+.za2s
+.zi2e
+.zin4st
+.zwe2
+2aa
+a1ab
+aa2be
+aa1c
+aa2gr
+4a1a2n
+4a2ar
+aa2r1a
+aar3f4
+aart4
+aas5t
+aat4s3
+a3au
+a1ä
+a1b
+2aba
+ab1auf
+ab1ä
+ab2äu
+1abd
+ab1eb
+abe1e
+abei1
+ab1eil
+2abel
+abe2la
+a3ber
+ab1erk
+ab1err
+ab1erz
+ab3esse
+2abet
+2abew
+1abf
+3abfi
+1abg
+1abh
+2abi
+ab1ins
+ab1ir
+ab1it
+1abk
+ab1l
+1a2bla
+ab5lag
+1a2blä
+2able
+ab4le.
+ab3li
+ab4lo
+3a2blö
+a2blu
+1abn
+a2bo.
+ab2of
+a2bon
+2abor
+ab3r
+a3bra
+a4brä
+2abrü
+1abs
+2abs.
+abs2a
+2absar
+ab3s2i
+ab3sp
+abst4
+2abst.
+ab3ste
+ab3sz
+1abtei
+2abu
+ab1ur
+2abü
+1abw
+2aby
+aby4t
+1abz
+2ac.
+2aca
+2ac1c
+a1cem
+2ach.
+ach1a
+a1chal
+ach3au
+2achb
+a1che
+a2ch1e2c
+ach1ei
+a4cherf
+a4cherk
+a4cherö
+a4ch3erw
+4achf
+a1chi
+ach3l
+ach3m
+ach3n
+a1cho
+a3cho.
+ach1o2b
+ach1or
+ach3ö
+ach3r
+ach3su
+a4cht
+acht5erg
+ach2t1o
+ach8traum
+ach8träume.
+ach8träumen.
+ach6trit
+a1chu
+ach1u2f
+ach3ü
+2achv
+4ach1w
+a1ci
+ac1in
+a1ckar
+ack2en
+a2ckin
+ack2se
+ack3sl
+ack3sta4
+a1cl
+acon4n
+2acu
+a1ç
+a1d
+2ada.
+a3d2ab
+ad2ag
+ad3ama
+a2d1an
+3a4dap
+a3d2ar3
+4adav
+1a2dä
+ad1c
+1add
+2ade.
+ade2al
+adefi4
+a2dein
+2aden
+ade1r2a
+a2deri
+4ade1s
+ade3s2p
+ades4s
+ade5str
+2adf
+2adh
+4a3di
+adi3en
+5adj
+2ado
+ad2ob
+2adp
+2adq
+2ad3rec
+ad4res
+ad3ru
+2ads2
+ad3st
+ad3sz
+2ad2t1
+ad4te
+ad4tr
+2adu
+2a1e
+ae2b
+ae2c
+ae2d
+a2ek
+a2ela
+a2ele
+ae2o3
+ae2p
+3a2er2o1
+aes5t
+a2et
+a2ew
+ae2x
+af1a
+a2fak
+a2fan
+a3far
+af4at
+a2fau
+2afe
+a2f1ec
+a2fent
+af1erl
+a2fex
+af2fl
+af4flu
+2afi
+2af3l
+afo1s
+a2fö
+af3ra
+af3rä
+af3re
+af3rö
+af3s2a
+af2sp
+af2t1a
+af2tei
+af4t3erl
+af2t3r
+af4t5re
+af2tur
+a2f3ur
+a1g
+2aga
+ag1ab
+ag1a2d
+ag1ar
+ag1au
+ag2di
+ag2dr
+ag2du
+age1i
+age4na
+age4neb
+a2gent
+a4gentu
+age4ral
+2ages
+age2sa
+age4sel
+age4si
+age2s3p
+ag3esse
+age4s3ti
+ag3gl
+1aggr
+3a2git
+2a2gl
+ag4la
+a4glö
+ag2n
+ag4ne.
+ag4nu
+a2g3re
+a2g3ri
+ag4ro
+agsa2
+ag4sam
+ag4set
+ags3p
+ag4spo
+ag3sta
+ag3ste
+ags4toc
+2agt
+ag2th
+a2gund
+2ah.
+2a1ha
+ah4at
+2a1he
+a2h1erh
+ahe1s
+a1h2i
+ahin3
+ahl3a2
+ah4l1ei
+ah4l3erh
+ah2lö
+ahl3sz
+ah4n1a
+ahner4e
+ahnt2
+1ahor
+ah1os
+a2h3ö
+ahr1a
+ah3r2e
+ahre4s3
+ah3ri
+ahrta4
+ahr6tri
+2ahs
+aht3s
+a1hu
+ah1w
+a1hy
+2ai
+aian3
+aid2s
+ai1e2
+aien3
+aif2
+ai3g4
+a3ik.
+ai3ke
+ai3ku
+a2il
+ai2lo
+a1ind
+ain4e
+a1ing
+ain3sp
+ai2sa
+a3isch.
+ai3s2e
+aiso2
+a3iv.
+aive3
+a3ivl
+a3ivs
+a1j
+aje2
+2ak.
+1a2k4ad
+2akal
+2a3kam
+2akar
+ak4at
+1a2kaz
+2akb
+2akc
+2akd
+4a1ke
+a2kef
+aken2n
+a2keu
+2a1ki
+2ak3l
+ak4li
+4ako
+2a1kr
+4akra
+ak3rau
+3akro
+2aks
+ak3sh
+2akta
+ak5tan
+2aktb
+2aktik
+ak2t3r
+ak5t4ri
+2aktst
+2a1ku
+a2kun
+4a3kü
+1akz
+a1la
+2ala.
+al1ab
+ala5ch2
+al1af
+ala2g
+al1age
+a3lal
+al1am
+al3ame
+alami5
+al3amp
+al1ana
+a2l1ang
+al1ans
+al1anz
+a2lar
+a3lar.
+a3lare
+al2arm
+al3arr
+ala4s
+al1asi
+al1ass
+2alat
+al1au
+al3aug
+a1lä
+al1äm
+alb3ein
+alb3eis
+al4berh
+al4b3erw
+al2b1l
+alb3li
+al2boh
+al2br
+alb3ru
+alb3s
+al2dä
+al2dr
+alds2t
+al3du
+2ale
+3a2l1e2b
+3a2l1ef
+a4l1eh
+a2l1ei
+a4l3ein
+a2l1el
+alen1
+al3ends
+a2leng
+ale2p
+al1epo
+a2l1erf
+a2l1erh
+al1erl
+3alerm
+a2l1ert
+3a2lerz
+a2l1esk
+ale4t
+al1eta
+al1eth
+a2l1eu
+a4leur
+3a2lex
+alf4r
+3algi
+al2gli
+2ali
+ali4ene
+ali4nal
+al1ins
+a2linv
+alk1ar
+1alkoh
+alk3s2
+alks4t
+al2lab
+al2l3a4r
+al2lau
+al3lend
+all5erfa
+al3les
+alli5er.
+alli7ers.
+al2lob
+3almb
+2alo
+a2l1o2b
+alo2ga
+al1ope
+al1orc
+a2l1ö
+al2ös
+3alpe.
+1alph
+al3skl
+al4spal
+al5s6terb
+al3sun
+al2tak
+al3tam
+alt3eig
+al4t3erf
+al2tre
+al2tri
+alt3ric
+al2tro
+alt2se
+alt4stü
+a1lu
+al2uf
+a2lum
+al1umb
+al1ur
+4aly
+alzer4z
+al2zw
+2am.
+2am2a
+amab4
+amad2
+ama3g
+2amä
+2ambiq
+2am4e
+4ame.
+a2meb
+ame2n1
+amer2a
+a2meri
+ame3ru
+a4mesh
+a3met
+a2mew
+2amf
+a3mi.
+a3mie
+2a3mir
+a3mis
+ami3ta
+ami3ti
+2amk
+2aml
+2ammal
+am2mei
+am2min
+2amml
+ammu2
+a2mö
+amp2fa2
+am3pr
+2am2s
+am3sa
+am4schl
+am3str
+1amt.
+am2t1a
+am2t1ä
+am4tel
+2amtem
+am4t3ern
+am4tö
+am2t3r
+am4tre
+am2tu
+2amu
+2ana.
+2anab
+ana3c
+anadi3
+a3nak
+an1alg
+ana4lin
+2anam
+2anan
+2ana1s4
+an1äs
+1anb
+2anbu
+an3ch
+2and.
+an3dac
+and4art
+andel4s
+ande2s
+an2dex
+an2d3rü
+and4sas
+and6spas
+and3ste
+and2su
+2andu
+and1ur
+2ane
+an3e2c
+a3nee
+an2ei.
+an3eif
+an1e4k
+3a4n1erb
+an1eth
+1anf
+2anfi
+anft5s
+an3f2u
+4ang.
+3angeb
+an2g1ei
+an4g3erf
+an4g3erl
+an4g3erz
+2angf
+2angh
+2angie
+ang1l
+an2gla
+2ango
+ang1r
+an2g3ra
+4angs.
+ang4s3po
+1anh
+2a3ni
+an2id
+ani5ers.
+3a4nim
+a4nins
+2anj
+2ank.
+an2k1an
+an2kei
+an3kl
+an4klö
+an2k3no
+ank1r
+an2k3ra
+an2k3rä
+ankt4
+an2ky
+1anl
+2anmu
+2ann
+3an3na
+ann2ab
+3annä
+an3n2e
+an1od
+a3nol
+a2n1or
+a3nos
+a1nö
+2anpr
+1anr
+1ansä
+1ansc
+ans2en
+an2seu
+2ansk
+an3skr
+ans1pa
+1anspr
+an3s2z
+2ant.
+an2t3a4r
+1antá
+1antei
+3antenn
+an3t4he
+1anthr
+2anto
+1antr
+ant3rin
+an2tro
+1antw
+2a1nu
+anu3s
+a1nü
+1anw
+2anwet
+2anzb
+1anzei
+2anzg
+an2z1i4n
+2anzs
+1anzü
+2anzw
+an2zwi
+2ao
+ao1i
+a1op
+a1or
+a1os3
+ao3t2
+a3ot.
+a1ö
+a1p
+2ap.
+2apa
+2ape
+a2pef
+a3pel
+a2pé
+a2pf
+ap2fa
+a3pfl
+a3phä
+a2pht
+2ap3l
+ap2n
+a2pot
+3appl
+ap3pu
+2apr
+2a3pu
+2aq
+2ar.
+a1ra
+a3ra.
+ar2ab
+ar3abt
+ara3d2
+a2r3al
+a3ra3li
+a2r1ang
+a2r1ans
+a2r1anz
+a2r3app
+2a2rar
+a2r1au
+a1rä
+1arb
+2arb.
+4arba
+ar2bau
+ar2bec
+2arben
+2arbi
+ar2bl
+2arbr
+ar2bre
+2arbs2
+2arbt
+2arbu
+ar2b3un
+1ar1c
+ar2dro
+2are
+a2rea
+ar1eff
+a4reg
+a2reh
+ar1ehr
+a2rein
+a4rek
+a3ren
+aren4se
+are3r2a
+ar2erf
+a2r1erh
+a2reri
+a2rerl
+are3u
+ar2ew
+2arf
+arf1r
+ar2f3ra
+ar2gl
+ar2gn
+2arh
+2ari
+ar2ia
+ari3e4n
+ari3erd
+ari3erg
+ar1im
+arin3it
+ar1int
+a3riu
+ar2kal
+ark3amt
+ar2k1ar
+ark3aue
+ark3lag
+ar2kor
+ar4kri
+ark1s4
+ark3sa
+ark3sh
+ark4tre
+ar2les
+arm2ä
+ar4merk
+ar3m2or
+ar2nan
+arn2e
+2a1ro
+ar1ob
+a2r1o2d
+a2r1op
+a2ror
+2arr
+ar2r3ad
+arre4n3
+ar2rh
+arr3he
+2arsa
+ar4schl
+arse3
+ar3s2h
+2arsi
+ar2st
+ar3sta
+ar3t2e
+ar2the
+ar3t2i
+artin2
+2arto
+art3r
+ar4tram
+ar6tri
+2arts
+2aru
+ar1uh
+ar1um
+a2rü
+2arv
+arwa2
+2ary
+ar2zä
+2arze
+1arzt
+ar2z1w
+as1ala
+as3au
+a2s1ä
+a2sca
+a3sche
+a4schec
+a3schi
+asch3la
+a2schm
+a3schu
+4as2e
+a2seb
+a2s3e2m
+a3ses
+4ash
+a3s2hi
+asin2g
+2asis
+aska3s
+a3skop
+a2s1o2f
+as1or
+a2sö
+a2s1p
+as3pan
+as2ph
+as2pi
+as2po
+a3spu
+as3s2a
+as3s2e
+as4s3ei
+as3s2i
+as2s1p
+as2st
+ass3ti
+as3str
+as3stu
+2as3ta
+a1s4tas
+as4tau
+as3te
+as2th
+as3ti
+as3to
+as4tof
+2astr
+ast3rä
+as6t3re
+a2sü
+aswa2s
+3a2syl
+a1ß
+aße2
+aßen3
+2a1t
+ata1
+at1ab
+at2af
+at4ag
+a2t1akt
+ata3l
+a3tam
+at1apf
+at1au
+a2taus
+a2t1ä
+at2c
+at2e
+4ate.
+a2teb
+at3eig
+a2teli
+4aten
+a2tep
+ater3s2
+ate2ru
+4ates
+at2h
+at3ha
+4athe1
+3athl
+4a3ti
+atil4s
+ati2st
+3atm
+4atmus
+ato4man
+4ator
+a2t1ort
+at1ö
+4atr
+atra4t
+at3rä
+at3re
+at3rom
+at2sa
+at4schn
+at2se
+at4set
+at2si
+at2so
+at2s1p
+at3ta
+at4tak
+att3ang
+at4tau
+at2tei
+at3t4hä
+at2t3rä
+att3s
+a3tub
+atu2n
+a3tü
+atz1er
+at4zerk
+at4zerw
+at2z1in
+at2zo
+atz3t2
+at2z1w
+a2u
+2au.
+2au1a2
+2aub
+au2bli
+au2blo
+4auc
+auch3ta
+au2dr
+2aue
+aue2b
+au5erein
+aue2s
+au2fa
+auf1an
+2aufe.
+2aufeh
+auf1er
+au4ferk
+auff4
+3aufn
+2aufs.
+2aug
+4augeh
+4au1i
+au2is
+2auj
+aule2s
+au3lü
+4aum
+au2mal
+au2m1o
+aum3p2
+aum3s6
+4aun
+au3n4a
+aun2e
+au2nio
+au1nu
+a4unz
+au1o
+2aup2
+aup4ter
+2au3r2
+au2s1ah
+ausan8ne.
+au2sau
+2ausc
+au4schm
+au4scho
+1ausd
+aus3erp
+au4s3erw
+3ausf
+1ausg
+1ausl
+au2so
+au2spr
+1ausr
+aus3s2
+3aussag
+aus4se.
+auster6m
+aus5tri
+1ausü
+1ausz
+2aut.
+au2t1äu
+2aute
+au4ten4g
+au4t3erh
+1auto
+2auts4
+2auu
+2auw
+2aux
+2auz
+auz2w
+2a1ü
+2a1v
+a3v4a
+ava3t4
+4avi
+a2vr
+2a1w
+awi3e
+a1x
+ax4am
+ax2e
+2a1ya
+a1yeu
+ays4
+aysi1
+ay3t
+2a1z
+az2a
+az2o
+az2u
+ä1a
+ä1b
+ä2b3l
+äb2s
+ä1che
+äche1e
+ä1chi
+äch3l
+ä2chr
+äch2sp
+äch4st
+ä1chu
+ä1ck
+äck2e
+ä1d
+ä2da
+ä2d1ia
+ä2dr
+äd2s
+2ä1e
+äf2fl
+äf3l
+äf3r
+äf2s
+äft4s3
+ä1g
+äge1i
+äge3s
+ä2g3l
+äg2n
+ä2g3r
+äg4ra
+äg3str
+1ä2gy
+äh1a
+2ä3he
+ä3hi
+ähl1a
+ähl2e
+äh4l3e4be
+2ähm
+äh3ne
+äh3ri
+2ähs
+2äh3t4
+ä1hu
+äh1w
+ä1im
+ä1is.
+ä3isch.
+ä1isk
+ä1j
+ä1k
+ä2k3l
+ä2k3r
+ä1la
+älbe2
+äl2bl
+2äle
+äl2l1a
+äl2p3
+äl4schl
+ä1lu
+ämi3en
+2äml
+äm2s
+ämt2e
+2än.
+än5de
+än2dr
+2äne
+äne2n1
+äne1s
+än2f5
+2änge
+än2gl
+än2gr
+äng3se
+2ä3ni
+änk2e
+än2k3l
+än2kr
+änk2s
+än3n4e2
+2äns
+än2s1c
+änse3h
+ä1on
+ä1pa
+äp2pl
+äp2pr
+äp2s1c
+äp4st
+1äq
+ä2r3a2
+är4af
+är1ä
+är1c
+4äre
+ä2r1ei
+äre2n
+ä2r1ene
+är2gr
+är1int
+är2k3l
+ärk2s
+är4ment
+ärm2s
+är1o2
+ä1rö
+ärse2
+är4si
+är2st
+ärt4e
+är2th
+ärt2s3
+ä2rü
+1ärz
+är2zw
+ä5s4e
+äse3g2
+äser4ei
+äse4ren
+äser2i
+äse3t
+äskop2
+äskopf3
+ä3s2kr
+ä2s1p
+äs6s1c
+äss2e
+äs4s3erk
+äs2st
+ä4s3t2
+äs4tr
+ä3su
+ä1ß
+äß1erk
+ä4t1a2
+ä3te
+ät2e1i
+ätein2
+äte2n
+ät2h
+ät1ob
+ä2t3r
+ät2sa
+ät2sä
+ät4schl
+ät4schr
+ät2s1i
+äts3l
+ät2s1p
+ät2s3t
+ät4tr
+ät2zw
+äu2br
+äu1c
+äude3
+äu3el
+ä2uf
+äuf2e
+1äug
+äug3l
+4äul
+2äum
+äu2ma
+äum4s5
+ä2un
+äun2e
+äu1nu
+2äur
+2ä3us.
+äu4schm
+äu3se
+ä3usg
+ä3usk
+ä3usn
+äu2sp
+äus2s1c
+1äuß
+äu2tr
+4ä1v
+1äx
+ä1z
+â1t
+á1n
+ba2bl
+2babs
+bach7t4e
+backs4
+b1a2dr
+2b1af
+3bah
+bah2nu
+bais2
+ba2ka
+ba2k1er
+ba2k1i
+bak1l
+bak1r
+ba2kra
+3bal
+bal2a
+bal4l3eh
+bal6lerg
+bal3th
+2b1am
+ban2a
+3b2and
+ban2dr
+ba3n2e
+b1ang
+ban2k1a
+ban4kl
+ban2kr
+2banl
+2b1ans
+ban3t
+b1anz
+bar3b
+bar3de
+ba2rei
+bar2en
+bar3n
+bar3zw
+3bas
+ba3s2a
+ba2sc
+ba2st
+bau3g
+bau1s
+bau3s2k
+bau3sp
+ba1yo
+3b2ä1c
+b2är
+b2äs
+4b1b
+b3be
+bben3
+bbens2
+bbe4p
+bb3ler
+bb2lö
+bbru2c
+bb2s
+bbu1
+2b1c
+2b3d4
+bde1s
+3be.
+3bea
+be3an
+be3ar
+be3as
+3beb
+b2ebe
+1be1c
+be2del
+bedi4
+be1eh
+be2erk
+be1erl
+be1eta
+3bef4
+be3g2
+2b1eier
+bei1f4
+beik4
+beil2
+bei3la
+2b1eime
+b2ein
+be1ind
+be1in2h
+bei3sc
+beis2e
+bei1st
+beit2s
+3bek
+3bel
+be3las
+be3lec
+be3lei
+be2l1en
+be2let
+be3li
+bel3la
+bel3sz
+bel3t4
+1bem
+1ben.
+ben3ar
+ben3dor
+be3nei
+3ben3g
+be3n2i
+ben3n
+ben2se
+ben4spa
+ben4spr
+benst4
+ben2su
+2bentb
+b2enti
+ben5t4r
+b1ents
+2bentw
+ben3un
+ben3z2
+be1o
+be1ra
+ber3am
+be2ran
+ber4ei.
+be4r3eiw
+be4rerk
+bere4s
+ber6gan.
+ber4in.
+ber3iss
+ber3na
+b1ernt
+be2rob
+be3rop
+ber3st4a
+be3rum
+3be1s
+bes2a
+be2s1er
+be3slo
+bes2po
+bess4e
+b3esst.
+bes3sz
+be6stein
+be4s3tol
+be3s4ze
+3bet
+be2tap
+be3tha
+be1ur
+3b2ew
+2b1ex
+1bez
+2b5f4
+bfal2
+2b1g2
+bge3
+bges4
+2b5h2
+bhut2
+1bi
+bi3ak
+bib2
+bibe2
+bien3s
+bie2s
+bik2a
+bi2ke.
+bi2kes
+3bil
+bil2a
+bi2lau
+4b1illu
+bi2lu
+2b1inb
+bin2e
+2b1inf
+bin3gl
+2b1int
+bi2o1
+bio3d
+bi3on
+biri1
+bi3se
+b1iso
+bi2sol
+bi2sp
+bis2s1c
+bi2s5t
+b2it.
+b2it2a
+b2ite
+bi2tu
+b2i3tus
+biz2
+4b1j
+bjek4to
+2b1k4
+bl2
+2bl.
+bla3b4
+b3lad
+b2lanc
+3blat
+b2latt
+2b3law
+b2le
+3ble2a
+b3leb
+2b3leg
+2b3leid
+b3lein
+3blem
+3blen
+b3lese
+ble3sz
+b4let
+b3leu
+2blich
+3blick
+b2lie
+2blig
+bling4
+b3lis
+b2lit
+3blitz
+b2lo
+b4loc
+b3los
+2blun
+3blut
+3blü
+2b1m
+4b3n2
+bni2
+bnis1
+bo4a
+bo5as
+b1ob3
+bo2bl
+bo2br
+bo2c
+bo3ch2
+bo3d2
+boe1
+bo2e3i
+2b1of
+bo3fe
+bo1is
+bo2l1an
+3bon.
+bond1
+bon2de
+bo2ne
+3bons
+b1op
+bo1r2a
+bo4rä
+bor2d1i
+bor2d3r
+bo2rei
+bo4rig
+bor2s
+b1ort
+bor2t3r
+bo2sc
+bo4s3p
+bote3n4e
+bo3th
+bot2st
+bo2xi
+bö2b3
+2böf
+2b1p2
+bpa2g
+2b1q
+b2r4
+2br.
+b4ra.
+2b3rad
+b4rah
+b4ra3k
+bra1st4
+3brä
+brä4u
+2bre.
+3brea
+6b5rechte
+2b3ref
+2breg
+b3reif
+3brem
+2b3rep
+b4rer
+2b3riem
+bri2er
+2brig
+b4rio
+b3roh
+2b3rol
+b4ron
+b4ruc
+bru4s
+brust3
+bru2th
+3brü
+4b1s
+b2s1ad
+b3sand
+bs3ar
+bsat2
+b3sä
+b4sär
+bs2äu
+b5sc
+bs2ca
+b6schan
+b6schef
+bs4cu
+b3se.
+bse2b
+b3sel.
+bse2n1
+b4s1erf
+bs3e4r3in
+b4s1ers
+b3s2es
+bsi4t
+bs2ku
+b4sl
+b2s1of
+bso2r
+b2sö
+bs2pl
+b3s2pu
+bss2
+bs2t
+bst1a2b
+bst3ac
+bst1ak
+bs3tät
+bst3er
+b2stip
+b3sto
+b4stod
+b3stö
+b2s3trä
+bs3treu
+bs4tri
+b3stü
+b4stüb
+b2s1un
+4b3t
+btal3
+btast3r
+b5te
+b4th
+btil4
+bt4r
+b4ts2
+btü1
+bu2chi
+bu2e3
+bu2f
+bu3li
+bul2la
+2b3umk
+bung4
+b2urg
+bu3r4i
+bu2sa
+bu4s3cha
+bu4schl
+bu4schm
+bu4schw
+bus1er
+bu2sin
+bu2s1p
+bu2s1u
+bü1c
+bügel3e
+2b1v
+2b1w
+3by1
+by3p
+bys2
+2b3z2
+bzeit1
+1ca
+2c1ab
+ca1ch
+ca2e3
+ca3g4
+ca1h
+cal3t
+3cam
+c4an
+ca2pe
+3car
+car3n
+carri1
+ca3s2a3
+cas3t
+ca3t4h
+ca1y2
+cä3
+cäs2
+2cc
+c1ce
+c1ch2
+c2d2
+c3do
+2cec
+ce2dr
+2cef
+ce1i
+2cek
+1cen
+cen3g
+1cer
+cere3
+ce3sh
+1cet
+2ceta
+ce1u
+1cé
+2c1f
+c4h
+4ch.
+2chab
+ch3a2bi
+cha2ck
+2chaf
+2ch1ak
+ch2anb
+3chanc
+ch1ang
+ch3anst
+4chanz
+1chao
+4char.
+1chara
+3charta
+cha2sc
+3chato
+4chatu
+ch1ärm
+ch1äs
+1châ
+2chb
+2chc
+2chd
+ch3e4ben
+1chef
+3chef.
+che4fer
+3chefi
+3chefs
+4chei
+ch1eim
+4chelem
+che4ler
+4chents
+4chentw
+cher3a
+che3rei
+6chergeb
+cher6zie
+ch1ess
+2cheta
+2ch1e4x
+1ché
+2chf
+2chg
+2chh
+1ch1ia
+2chic
+chi3na
+4chind
+3chines
+2chinf
+2chinh
+ch1ins
+ch1int
+2ch1inv
+1chiru
+2chj
+2chk
+2chl2
+ch2le
+ch3lein
+ch2lu
+4ch2m
+2chn4
+chner8ei.
+2chob
+cho2f
+ch1off
+ch1oh
+ch1orc
+2chp
+ch2r4
+4chre
+chre3s
+ch3rh
+1chron
+4chs
+2cht
+2chuf
+2chuh
+2chum
+2ch1unf
+2chunt
+4chü
+2chv
+4chw
+2chz
+ci1c
+ci2s
+c1j
+c4k
+4ck.
+ck1a
+1cka.
+2ckac
+1ckag
+2ckal
+2ck3an
+cka4r1
+2ckau
+ck1ä
+2ckb
+2ckc
+2ckd
+1cke
+4ckeff
+2ckeh
+ck1ehe
+4ck1ei
+4ckense
+ck1ent
+4ckentw
+cke2ra
+ck2ere
+6ckergeb
+ck1erh
+4ckerhö
+4ckerke
+ck2ern
+2ckero
+2ck1err
+4ckerze
+2ck1ese
+2ckex
+2ckf
+2ckg
+2ckh
+1cki
+2ck1id
+ck1im
+ck1in
+3ckis
+2ckk
+2ck3l
+2ckm
+2ck3n
+ck1o2
+2ckp
+2ck3r
+4cks
+ck4stro
+2ckt
+ckt2e
+1cku
+2ck1um3
+2ckunt
+2ck1up
+2ckv
+2ckw
+1cky
+2ckz
+c4l2
+clet4
+clo1
+1clu
+c2m2
+3co
+co2c
+co3ch
+co2d2
+co4der.
+co3di
+coff4
+coi2
+co1it
+co2ke
+co2le
+col2o
+com4te.
+comtes4
+con2ne
+co2pe
+co1ra
+cor3d
+co3re
+cos4
+co4te
+cô4
+2cp
+2c1q
+1c4r2
+cre2
+cre4mes
+cry2
+2cs
+cs2a
+c2si
+c1s4tr
+4c1t
+cte3e
+cti2
+cti4o
+ctur6
+3cu
+cu2p3
+cussi4
+1cy
+2c1z
+3da.
+da1a
+2d1ab
+3d2abä
+da2ben
+3d2abl
+da2bre
+dab4rü
+2d1ac
+dach3a
+da2cho
+dach1s
+4d3achse
+d1af
+d1ag
+dagi2
+dah3l
+da1ho
+3d4ai
+da1in
+da1is
+dal2a
+2d1alar
+dal3b2
+da3lö
+d1alt
+d1amma
+2d1ammä
+damo3
+d4amp
+dampf8erf
+2d1amt
+d2an.
+2d1ana
+dan4ce.
+2d1an3d2
+d1ang
+2dange
+dan4kl
+dan5kla
+dan2k1o
+dan2kr
+2d1ans
+2dantw
+2danw
+d2anz.
+4danzi
+2d1ap
+d2aph
+4dapp
+da2r3a
+2darb2
+3d2arl
+dar2ma
+dar2m1i
+da2ro
+d3arr
+d2ar3s
+d1art
+da2ru
+d2arw
+da1s
+da3s2h
+das4t
+dat2a
+dat4e2
+da3tei
+date4n
+4d3atl
+4datm
+dau3e
+2d1au2f
+2dauk
+2d1aus3
+4daush
+2d1äh
+2d1ämt
+2d1änd
+2d1äng
+2d1äp
+2därz
+dä2u
+dä3us
+2d1b4
+dbu2c
+2dc
+d1ch
+dco4r
+2d1d2
+ddar2
+d3dh
+d5do
+1de
+de2ad
+de3as
+de3a2t
+de3b4
+2d1e4ben
+3de1c
+de4ca.
+de2cka
+deco3
+de1e4
+2d1eff
+deg2
+de3gl
+dehe2
+de3ho
+2d1ehr
+d1ei
+d2eic
+3d2e1im
+dein2d
+dein2s
+de2l1a4g
+de4l3aug
+del1än
+del1ec
+delei4g
+de3lein
+2delek
+2delem
+2delfm
+delle2
+del4leb
+del4lei
+de2l1ob
+de2lop
+de3lor
+de2lö
+del4san
+del5sc
+del2s5e
+del2so
+del2s1p
+del5ster
+del3t4
+dem2ar
+2d1emp
+d2en.
+dend2
+de4n3end
+4denerg
+den3g
+d2enh
+de2ni
+den4k3li
+4den4sem
+den4sen
+den6s5tau
+den3th
+2dentw
+de1nu
+de1on
+depi2
+d4er.
+dera2b
+de1rad
+de2rap
+der2bl
+2derdb
+de2re2b
+de4reck
+der3edi
+derer3
+de3r4erb
+de3r4erf
+de4r3ero
+derer4t
+4d3erhöh
+3derie
+derin4f
+4derklä
+der3m2
+4derneu
+4d3ersat
+der3tau
+der6t5en6d
+de3ru
+de4ruh
+de4rum
+des1
+de2sa
+de3sac
+desa4g
+de4sam
+des2äc
+de2seb
+de4seh
+de2sei
+des3elt
+de2sen1
+de4set
+de2sin
+de2sor
+de2sp
+des3s2
+dest5alt
+de2sto
+dest5rat
+de4stre
+des4tum
+de2su
+det2
+deten4t
+2d1etw
+de1un
+de1url
+de3us
+de2xis
+2dexp
+2d1f4
+2d1g2
+dga2
+d2ge.
+dge4t1e
+d3gl
+2d1h2
+dha1s4
+d2his
+1di
+di4ab
+di2ad
+di4am
+3dic
+di1ce
+di2e
+di3e2d
+die4neb
+di3eni
+di3ens.
+die2s3c
+diet3
+die2th
+dige4s
+dik2a
+dil2s5
+2d1imb
+din2a
+2d1ind
+2d1inf
+2d1inh
+2d1in1it
+4d3inner
+2d1ins
+2d1int
+di2ob
+dion3s
+di1p
+di4re.
+di2ren
+di2ris
+2d1irl
+di2sp
+2d1isr
+dist2
+di2s5te
+di2ta
+di4teng
+di4t3erl
+di4t3erm
+di4t3ers
+di2th
+di4t3r
+dit3s
+di2tu
+di5v
+di3z2
+2d1j
+2d1k4
+4d1l2
+d3la
+d3le
+dle2ra
+dli2f
+dl3m
+dl3s
+2d3m2
+4d5n2
+dni2
+dnis1
+d1ob
+d2oba
+2dobe
+dob4l
+d2obr
+2d1o2f
+dole4
+doll2
+do2mar
+do5n4a
+doni1e
+do2o
+2dope
+2d1opf
+d2opp
+d2o3r4a
+2dorc
+2dord
+dor2f1a
+dor2fä
+dor2fl
+dor2fr
+2d1org
+do2rie
+d2orp
+2dort
+dor2ta
+d2os.
+dos3s
+dost1r
+dot6h
+do3un
+d1ö
+dö2l1
+3d2ör
+dö2s1c
+2d3p2
+2d1q
+d2r4
+3d4ra.
+2d3rad
+drag4
+2drahm
+d3rai
+3d4ram
+d3rand
+2d3rast
+2d3rauc
+2dräd
+d4räh
+2d3rät
+2d3räu
+4dre.
+d4rea.
+d4reas
+3d4reck
+2dreg
+3d4reh
+2d3reic
+d4reiv
+4drem
+4d3ren
+2d3rep
+4d3rer
+4dres.
+d4resc
+2d3rh
+d3ri
+d4ri.
+3d4ria
+2d5ric
+d4rid
+d4rie
+d5rieg
+d4rif
+d4rik
+d4ril
+d4rin.
+3d4risc
+3d4rit
+4dritu
+d3rob
+d3roc
+2d3rod
+d4roi
+2d3rot
+d3rou
+2d3rov
+d3rö
+drö2s1
+d5rub
+3d4ruc
+2d3ruh
+drunge3
+2d5rut
+drü1b
+drü5cke
+2d1s
+d4s1amt
+d2san
+ds3assi
+d2sau2
+ds1än
+4dsb
+d4schin
+d2s1e2b
+d2s1ef
+d3sei
+ds2eig
+d4seins
+d2s1eng
+d2s1ent
+d2s1erf
+d2serh
+d2s1erk
+ds1err
+d2s1erz
+dse4t
+d4s1eta
+d3s2ha
+d3sho
+d2s1im
+ds2inf
+d3s2kan
+d3skul
+4dsl
+d2s1op
+dso2r
+ds1ori
+d2sö
+d2s1par
+ds1pas
+d2spä
+ds2po
+d2spro
+ds2pu
+dss4
+dst4
+ds3tab
+d4stag
+d4s3täti
+d2ste
+d4stea
+d3stei
+d3stell
+d4stem
+d3s4tern
+ds2ti
+ds4til
+ds4tip
+ds2tu
+ds1ums
+d2sun
+ds2zen
+2d1t
+dta2d
+d5tea
+d2th
+d4thei
+dt3ho
+dto2
+d3tö
+dt3r
+dtran2
+dt5s2
+d3tü
+1du
+du1alv
+du1ar
+dub3l
+du2bli
+du2f
+2d1ufe
+2d1uh
+du1i
+2d1umb
+2dumd
+2d1u2m1e
+2dumf
+2dumg
+2d3umk
+2duml
+d2ump
+2dumr
+d1ums
+d2ums.
+2d1umv
+2d1un3d
+dund2a
+2d1unf
+dung4
+dun3ke
+dun2kl
+2dunr
+dun2s
+2dunt
+du1o
+dur2
+2d1url
+2dursa
+du4schn
+du4schr
+du4schw
+dus3t
+2düb
+3düf
+3dün
+2d1v2
+2d1w
+dwa2
+dwest3
+dy2s
+2d1z
+2e1a
+e3a2b
+eab3l
+ea2c
+ea3der
+eadli4
+ea2dr
+ea2g4
+ea3ga
+ea4ge
+ea3gl
+eak1
+eakt2
+ea2la
+e3alei
+e4aler.
+eam3
+eam1o
+ea2na
+e2ano
+e3ar.
+ea2ra
+e3a4rene
+e3arr
+e3arv
+e2as
+eas3s
+eat4e2
+eater1
+e3ath
+ea5tr
+eat3s2
+e3at5t4
+e3au2f
+e3aug
+eau1st
+e1ä2
+e1b
+2eba
+e3b2ak
+2ebed
+ebe2i
+2ebel
+eb2en
+ebens3e
+2ebet
+2ebl
+eb3ler
+eb4leu
+e3blie
+eb3lo
+eb2lö
+2eb2o
+ebot2
+ebö2s
+2ebr
+eb3rei
+eb4ru
+eb2s1
+eb6sche
+ebse2
+ebs3pa
+eb3sta
+eb4stät
+ebs3tem
+ebs3t2h
+eb3str
+e3bu
+ebu2t1
+2e3ca
+e1ce
+ech1ä
+2e3che
+ech1ei
+e6ch5erzi
+e1chi
+ech3l
+ech3m
+ech3n
+e2cho.
+ech1o2b
+e2ch3r
+ech3ta
+ech3t4ei
+e1chu
+ech1uh
+ech1w
+e1ci
+eci6a
+eck3se
+2eckt
+2e1cl
+2eco
+e3cr
+ec1s4
+2ect
+e1d
+e3d2a
+ed2dr
+ed2e
+ede2al
+e3dei
+ede3n2e
+edens1
+eden4se
+eden4sp
+ede2r
+eder3t2
+edi4al
+e3d2o
+ed2ö
+eds2ä
+ed2s1es
+ed2s1o
+ed2s1p
+ed2s3tr
+ed2su
+edu2s
+e3dy3
+4ee
+ee3a2
+eeb2l
+ee2ce
+ee1ch
+ee2cho
+ee2ck
+eede3
+eed3s2
+ee1e
+e1eff
+eef4l
+eef3s
+eeg2
+e1ei
+ee1im
+eein4se
+eel2e
+ee2lek
+ee3len
+e1emp
+e1en
+eena2
+ee4nag
+e2enä
+e2enc
+ee3ni
+e2eno
+een3s
+e1e2pi
+ee1ra
+e1erbt
+e1erd
+ee3r2e
+ee4r3en4g
+eere2s
+ee4ret
+e1erk
+ee1rö
+eer2ös
+eert2
+e1ertr
+ee3r2u
+e1erz
+ee3s2
+ees3k
+ee3ta
+ee4tat
+ee2th
+ee1u2
+eewa4r
+e1e2x
+e1f
+2ef.
+2efa
+e2f1ad
+ef1ana
+ef1ar
+e2fat
+e2fäu
+2efe
+e3fe.
+e2f1e2b
+ef1em
+e2fent
+ef2er
+2eff.
+1effi
+ef2fl
+2efi
+e2f1i2d
+e2f1ins
+efi2s
+1efku
+2efl
+e3f4lu
+2e3f2o
+e3fra
+ef3rea
+ef3rol
+ef3rom
+ef4rü
+efs2
+ef3so
+ef3sp
+ef2tan
+2efu
+e2fum
+2efü
+e1g
+egas3
+egd4
+e3ge
+ege4n3a4
+ege2ra
+ege4str
+ege1u
+e2glo
+e2gn
+eg3ni
+eg4sal
+eg4se4r1
+eg4sto
+eg2th
+2egu
+egung4
+egus3
+2e1ha
+eh1ach
+e3h2al
+eh2aus
+2e1hä
+e1he
+eh2ec
+eh1eff
+eh2el
+ehen6t3
+1e2hep
+e3her
+ehe1ra
+ehe3str
+e1hi
+eh1int
+eh1lam
+eh1lä
+ehle2
+ehl3ein
+eh4lent
+eh5l2er
+eh2lin
+eh3lo
+ehl2se
+2ehm
+eh3mu
+e1ho
+e3hol
+ehr1a2
+ehr1ä
+ehr1e2c
+eh2rei
+ehr3erl
+ehr6erle
+ehre3s
+eh3ri
+eh1ro2
+ehr1ob
+ehr1of
+ehs2
+eh3sh
+eh1ste
+2eht
+e1hu
+e2hunt
+e1hü
+eh3üb
+eh1w
+e1hy
+2ei3a2
+4eib
+ei2bar
+ei2bl
+eibu4t
+ei4b3ute
+ei2cho
+e2id
+ei2d1a
+ei3dan
+ei3de
+ei4d3err
+2eidn
+ei3dra
+ei1e
+4eien3
+eienge4
+1eifr
+ei3g2a
+4eigeno
+eig2er
+2eigew
+ei3gl
+1ei2g3n
+2eigru
+2eigt
+2eigu
+eik2ar
+ei3kau
+eik4la
+e4il
+2eil.
+ei2lar
+ei2lau
+2eilb
+eil3d
+ei4lein
+eilen1
+eil3f4
+eil3ins
+2eiln
+1eilzu
+ei2m1a4g
+eim3all
+ei2mor
+e1imp
+eim2pl
+ei2n1a
+ei4nas
+ei4nä
+ein3dr
+2eindu
+ei4neng
+ei2neu
+2einfo
+ein4fo.
+ein4fos
+ein3g2
+ein4hab
+e1init
+ein3k
+ein6karn
+3einkom
+ei2n1o2
+3einsat
+ein6stal
+ein4sz
+e4inver
+ei3o2
+ei1p
+eip2f
+2eir
+ei3re
+e1irr
+e2is.
+ei2sa4
+ei6schwu
+ei4s3erw
+eis2pe
+eis4th
+ei1sto
+ei2sum
+e2it
+ei2tab
+ei2tan
+ei2tar
+2eitä
+ei3te
+ei2th
+ei2tro
+eitt4
+eit3um
+2eiu
+2e1j
+e1k
+ek2a
+1ekd
+e3ke.
+e3ken
+e3kes
+e3key
+e3k2l
+ek4n
+ek2o
+ek4r
+ek1s4t
+2ekt
+ekt4ant
+ekt3erf
+ekt3erg
+ek4t3erz
+ekt2o
+ek5tri
+ek2u
+e3k2w
+e1la
+ela4ben
+el2abt
+ela2c
+el1af
+ela2h
+e2l1ak
+e2l3a2m
+el4ami
+el4amp
+el1ans
+el1anz
+2elao
+e2l1ap
+e2l1a2r
+el3ari
+ela4s
+el1asi
+el1asp
+el2ast
+2e1lä
+3elbis
+el2da
+eld5erst
+el4d3erw
+eld3s2
+2ele.
+elea2
+ele2c
+2eleh
+2elei
+e6l5eier.
+e2l1ein
+e3leine
+e4leing
+1elek
+e2l1el
+1e2lem
+e3lem.
+el1emp
+2e3len.
+e4lense
+e2l1ent
+e3lep
+el1erd
+el1erf
+e4ler4fa
+e2l1erg
+el1erk
+el1erl
+e4ler4la
+e4l3ernä
+e2l1err
+2eles2
+el1ess
+e4l1e4ta
+e3leu
+2elev
+ele2x
+1elf.
+el3fe
+elf4l
+1elfm
+1elft
+elgi5er.
+elgi5ers
+2eli
+e2l1id
+e3lie
+eli2ne
+el1ita
+el3kl
+el3lan
+el3le
+el5le.
+ell3ebe
+el4l3ein
+ell3eis
+el3lin
+ell3sp
+elm2a
+2eln
+el5na
+2elo
+e2lof
+e2lol
+elon2
+el1ope
+e2l1or
+elo2ri
+el2öf
+elö2s
+el2sum
+elte2k
+elt3eng
+3eltern
+elto2
+el2t3r
+elt3s2k
+elt3s2p
+2e1lu
+e2l1um
+el1ur
+el3use
+e1lü
+e2lya
+2elz
+elz2e
+el2zwa
+e1m
+2ema
+e2m1ad
+ema2k
+e2m3anf
+e2m1ans
+3emanz
+em2d3a2
+e3m2en
+emen4t3h
+e6mentsp
+e2m1erw
+eme2s
+1e2meti
+e2m1im
+em1int
+emi3ti
+2emm
+emma3u
+em2mei
+e2mop
+3empf
+em3pfl
+em2p3le
+em2sa
+em2spr
+em2st
+em3t2
+1emul
+2emü
+e2n1a
+4ena.
+2enac
+e3nad
+e4naf
+4enah
+e4nak
+ena3l2i
+4enam
+en4ame
+e4nand
+en3ang
+en3are
+en2asc
+4enat
+en3att
+e3naue
+e2n1är
+en1äu
+en4ce.
+en3d2ac
+en2dal
+en4d3ess
+end4ort
+end3rom
+end3si
+end3s2p
+end3sz
+end2um
+2ene.
+ene4ben
+en1e2c
+e2neff
+e4nein
+e2n1el
+ene4le
+2enem
+2enen
+e4n1ent
+en4entr
+4e3ner.
+e2n1erd
+e2nerf
+1e2nerg
+e4nerh
+e4nerk
+e2n1erl
+e4n3ermo
+4enern
+e2n1err
+e2n1ers
+e2n1ert
+e2n3eru
+e2n1erw
+e4nerz
+2enes
+e4n3ess
+en3f
+enf2a
+enf2u
+1engad
+3engag
+en3ge
+en3g2i
+en2gl
+en3glo
+1engp
+eng3se
+e3ni.
+e3nic
+e4nid
+e3nie
+eni3er.
+eni5ers.
+e2n1i4m
+e2n1in
+e3nio
+2enis
+eni3se
+e3nit
+2eniv
+en3k2ü
+e2n1o2b
+enob4le
+e2nof
+en1oh
+e3nol
+eno2ma
+en1on
+e2n1op
+e2n1o2r
+enost3
+e3not
+eno2w
+2e1nö
+en1ö2d
+e4nr
+en3sac
+en2sau
+en5sch4e
+en2seb
+ens2el
+1ensem
+ensen1
+en3ska
+en3s2po
+enst5alt
+en4s3tät
+2ensto
+e4nt
+ent4ag
+1entd
+en2teb
+en4terb
+1entfa
+3entga
+en2thi
+3entla
+1entn
+en4t3rol
+3entspr
+2entü
+1entw
+4entwet
+1entz
+en1u
+2enut
+e1nü
+enü1st
+4enwü
+e1ny
+en4z3erf
+en4z3erg
+en4z3erk
+enz3ert
+e1ñ
+2eo
+e1o2b1
+e1of
+eo2fe
+e1oh
+e4ol
+e1on.
+e1ond
+e1onf
+e1onl
+e1onr
+e1ons
+e1ope
+e1opf
+eop4t
+e1or
+e3or.
+e3orb
+e3ors
+e3orw
+eo1s2
+e3os.
+eo3ul
+e1ov
+e1ö2
+e1p
+e3pa
+epa2g
+e3p2f4
+1episo
+ep3le
+1e2poc
+ep2pa
+ep4pl
+ep2pr
+ept2a
+ep2tal
+e3pu
+epu2s
+e1q
+er1a
+e3ra.
+e3rad.
+er3adm
+eraf4a
+era1fr
+era2g
+e1rai
+er3aic
+e2rak
+e1ral
+er3all
+eran3d
+e3rane
+er3anf
+e2ranh
+er3anm
+e1rap
+er3apf
+e2rar
+e3rari
+e1ras
+e2r3a4si
+era2ß
+e2rath
+e3rati
+e2ratm
+e1raub
+er3aue
+erau2f
+er3aug
+e1raw
+e1raz
+e1rä
+er1äh
+er1äm
+erb2e
+er3br
+erb4sp
+er1c
+er3chl
+er3da
+1erdb
+er3de
+2erdec
+erd3erw
+4ere.
+er1eb
+e3rech
+er3echs
+er1e2ck
+ere4dit
+er1eff
+e2r1e2h
+4e3rei.
+er1eig
+e2rein
+e4r3eis.
+ere2l
+er1ele
+2e3rem
+2eren
+4e3ren.
+e3rena
+e4rense
+e4r3entf
+e4rentn
+e3renz
+eren8z7end
+2erer
+4erer.
+e2r3erf
+e2r1erh
+e4rerl
+4erern
+e3rero
+er1err
+er1ers
+e2rert
+er1erw
+2eres
+er1ess
+er3e4ti
+er1eul
+ere4vid
+erf2e
+erf4r
+4erfür
+3ergebn
+4ergehä
+erg3el4s3
+1ergol
+erg3s
+ergs4t
+er3h
+1erhab
+2erhü
+2eri
+e2riat
+e3rib
+4e3ric
+4e3rie
+eri3e4n3
+e3ri3k4
+4e3rin.
+er1inb
+e2r1ini
+er1ink
+er1int
+e3rio
+er1ita
+2erk.
+1erklä
+2erkre
+erk3t
+3erlebn
+ermen4s
+erm3ers
+ern1os
+e1ro
+e3ro.
+er3oa
+er1o2b
+er1of
+er1oh
+e3ron
+e2r1o2p
+e4ro2r
+e3ros
+e3row
+er1ö
+erö2d
+2erök
+er3p4
+er3rä
+2errü
+ers2a
+er3se
+ers2i
+er3sk
+er3smo
+er3sn
+er3sp
+er3sz
+ert2ak
+er6terei
+er4ters
+er2tho
+4erti
+ert3ins
+ert4ra
+erts2e
+2eru
+eruf4s
+er1u4m
+er1und
+erung4
+er1uns
+er3uz
+erü4b
+3erweck
+6erweis
+es3ab
+es2ach
+es3ak
+es3anz
+e3s2as
+e4s3ato
+2esb
+es2c
+es3cap
+e3sce
+esch2
+e3scha
+e2s3ein
+es2el
+ese4ler
+es3eva
+2esf
+4esh
+es2har
+es2hu
+es2id
+e2sil
+es3int
+es2ir
+es2kat
+e4ske
+es3kl
+es3ku
+e4sky
+es3l
+es4log
+2esm
+es2ort
+e3sot
+es2ö
+2esp
+e3s2pek
+e3spi
+e3s2por
+e3s4pra
+2esr
+es2sau
+es3sc
+es3se
+4essem
+ess4e3re
+ess3erg
+2esso
+es2sof
+es2s1pa
+es2spu
+es3str
+es3stu
+estab4b
+est1ak
+e1star
+e4starb
+1e2stas
+e1stat
+e1s2tec
+e3stel
+es4t3eng
+es4t3erh
+es4t3ess
+e1stil
+e2stip
+estmo6de
+est3ori
+e1str
+es4tri
+es3trop
+e1stu
+es4tü
+e2s1um
+es3ums
+es3w
+e3sy
+es3z
+e1ß
+eße3r2e
+e1t
+etab4
+et1am
+3etap
+et4at
+et1äh
+e3te
+e4tein
+et2en
+eten3d2
+ete2o
+eter4hö
+eter4tr
+et2h
+et3hal
+et3hü
+e3ti
+eti2m
+eti2ta
+2e3to
+eto2b
+e4t1of
+etons4
+e3tö
+2etr
+e4traum
+e6t3rec
+e2tres
+et4rig
+etsch3w
+ets2p
+et3su
+ett1a
+et2tab
+et2t3au
+et2tei
+ette4n1
+et2th
+et2t3r
+et4tro
+ett3sz
+et4t1um
+e3tü
+etwa4r
+2etz
+et2zä
+et4z3ent
+etze4s
+et2zw
+eu1a2
+eu3erei
+eue6reif
+eu2esc
+eu2ga
+eu4gent
+eu3g2er
+eu4gla
+eugs4
+euil4
+eu1in
+1euk
+eu2kä
+e1um
+e3um.
+e3umb
+e3uml
+e3um2s
+eum4sc
+eums1p
+eum3st
+2eun
+eun2e
+eu4nei
+e3un2g
+eu2nio
+eun3ka
+eu1o2
+eu1p
+eur2e
+3eu3ro
+eu3sp
+eust4
+eu1sta
+eu1sto
+eu1str
+2eut
+eut2h
+eut6schn
+2eux
+eu2zw
+e3ü
+2e1v
+e2vela
+e2vent
+4ever
+eve5r2i
+e3vo
+e1w
+2ewa
+e3wä
+ewä2s
+2ewe
+e2we.
+ewinde3
+e3wir
+ewi2s
+e3wit
+ew2s
+2ex.
+ex3at
+1e2xem
+ex1er
+e1xi
+e2x1in
+1exis
+ex3l
+3exp
+2ext.
+ex2tin
+ex2tu
+2exu
+2e3xy
+ey1
+ey4n
+eys4
+e1z
+e3z2a
+e2z1enn
+e3zi
+ezi2s
+ez2w
+é1b
+é1c
+é1g
+égi2
+é1h
+é1l
+élu2
+é1o
+é1p
+é1r
+é1s
+é1t2
+é1u2
+é1v
+é1z2
+è1c
+è1m
+è1n
+è1r
+ê1p
+ê4t
+1fa
+fab4
+f1abe
+fa2ben
+fab5s
+3fac
+fa4cheb
+facher5f
+fa2ch1i
+fa2cho
+f1ader
+fa2dr
+f4ah
+faib4
+fa2ke
+f2al
+fa3l2a
+fal2kl
+fal6l5erk
+fal6scha
+fal6schm
+fal3te
+falt2s
+2fanb
+2fanf
+fan2gr
+2f1ank
+2fanl
+f1anp
+2fanr
+fan3s
+2fanw
+f1an3z
+2f1ap
+f2ar
+far2br
+2f3arc
+3fari
+farr3s
+3f4art
+2f3arz
+fa3s4a
+fa3sh
+f3at
+fa2to3
+2f1auf
+f3aug
+f1ausb
+3f4av
+fa2xa
+1fä
+fä1c
+fäh2r1u
+2f1ärm
+fä2ßer
+f1äu
+2f1b2
+2f1c
+2f3d4
+fdie2
+1fe
+featu4
+fe2c
+f2ech
+2f1eck
+fe2dr
+fe2ei
+fe1em
+fef4l
+feh4lei
+f4eie
+2f1eing
+4f1einh
+fe1ini
+2f1einw
+f1eis
+fek2ta
+fe2l1a
+fel2dr
+2fe2lek
+fe2l1er
+fe2les
+fe2l1o
+fel4soh
+fel3t
+f2em.
+fem4m
+2femp
+fe2nä
+fen3g
+fe2no
+fen3sa
+f1ent
+f2er.
+fe1ra
+fer2an
+fe4rang
+fe4r3anz
+fe2rau
+ferde3
+f2ere
+fer2er
+fer3erz
+f1erfa
+f2erl.
+4ferneu
+f4erpa
+f2ers.
+f2ert
+f1erw
+fe2st
+fest1a
+fest3ei
+2f1e4ta
+3fete
+fet2t3a
+feuer3e
+feu4ru
+3few
+f1ex
+2fexp
+3fez
+1fé
+2f1f
+ff3ar
+ff1au
+ff2e
+ffe2e
+f2f3ef
+ff3ei
+ffe1in
+ffe2m
+f2f3emi
+ff4en
+f2fex
+fff4
+ff3l
+ff4la
+ff4lä
+ff4lo
+f3flu
+f3flü
+f3f4rä
+ff3ro
+ff3rö
+ff2s
+ff3sho
+ffs3t
+ffs4tr
+4f3g2
+fge3s
+2f1h2
+1fi
+3fi.
+fi3at
+fid2
+fi4ds
+fid3sc
+fien3
+fi1er2f
+fi2kin
+fi3kl
+fik1o2
+fi2kob
+fi2kr
+fi2l1an
+fil4auf
+fil3d
+fi2les
+filg4
+fi3li
+fi4lin
+fil2ip
+f2ina
+fi3ni
+fin2s
+fin3sp
+2f1int
+fi2o
+fi3ol
+fi2r
+fi3ra
+3fis
+fis2a
+fisch3o
+fis2p
+fi2s5t
+fit1o2
+fi2tor
+fi3tu
+3fiz
+2f1j
+4f1k4
+f2l2
+2fl.
+f3lad
+f3lap
+1flä
+3f4läc
+2f5läd
+f3län
+2f3läu
+2f3leb
+f4lee
+2f3lein
+f3ler
+f4lé
+f3li.
+3f6lim
+fli4ne
+2f5lon
+1f4lop
+1f4lot
+flo2w
+f3lö
+f4luc
+1f4lug
+flu4ger
+f4lü
+2f3m2
+2f3n2
+fni2s
+1fo
+fob2l
+2f1of
+foli3
+fo2na
+fo2nu
+2f1op
+fo1ra
+4f3org
+fo3rin
+3form
+for4m3a4g
+forni7er.
+for4st
+for4tei
+for2th
+for2t3r
+for3tu
+2f1o2x
+1fö
+2föf
+2f1ök
+2f1öl
+för2s
+4f1p2
+2f1q
+f2r2
+f4rac
+frach6tr
+f5rad
+fra4m
+f3rand
+f5rap
+1f4rän
+2fre.
+f3rec
+f3red
+2freg
+freik2
+frein4
+f3rep
+f4reu
+2f3ric
+fri3d
+fri2e
+2frig
+1fris
+f4risc
+f3roc
+1f4ron
+fro2na
+fro2s
+f3rot
+f3ru
+f3rü
+4f1s
+fs1all
+fs4amm
+f2san
+fs3ar
+f2s1as
+f2sauf
+f2saus
+f2saut
+f3sc
+f4sce
+f4schan
+f4schef
+fs4co
+fs1e2b
+f4s1ehr
+f2s1em
+f2s1ent
+f2s1er
+fse4t
+f4s1eta
+f3si
+f2si2d
+f3s2kie
+f2s1o2
+f3span
+f2s1pas
+fs1pen
+f2sph
+f3s2pl
+f3s2por
+fs1pr
+f2spre
+fs2pri
+f2spro
+fs2pru
+fs3s4
+fs2t
+f2stas
+f4s3täti
+f4stech
+f3stei
+f3s4tel
+f3stern
+fs3th
+f2stip
+f3st4r
+f4s3tres
+f4s3tüte
+f2s1un
+f2sü
+f3sy
+4f1t
+f4ta.
+f2tab
+ft1a2be
+ft1af
+f2t1al
+ft1an
+ft1ar
+f3tat
+ft1e2h
+ft1eig
+ft1eis
+f4t1ent
+f4t1e4ti
+f2th
+f4thei
+ft3ho
+ft1op
+f3tö
+f2t3ro
+f2t3rö
+f3t4ru
+ft2s1
+ftsa4
+ft4sam
+ft3s2c
+ft4sche
+ftse4
+ft4seh
+fts3el
+ft3st
+ft4s3tan
+ft4s3tä
+fts2ti
+ft4stri
+f2tum
+ft1url
+f3tü
+ftwa4
+ft3z2
+1fu
+3fug
+3f2uh
+f1um
+2f1unf
+fung4
+2f1u2ni
+fun2kl
+fun2ko
+fun2k3r
+2f1unm
+2funt
+f2ur
+fu4re.
+fus2sa
+fus2s1p
+fus2st
+fu2ß1er
+3fut
+1fü
+2füb
+fü2r
+2f1v
+2f1w
+1fy
+2f1z
+fz2a
+fzeiten6
+fzei8tend
+fz2ö
+fzu3
+fzu4ga
+3ga.
+2gabf
+ga2b5l
+gab4r
+2gabz
+ga1c
+2gadl
+2ga2dr
+ga1fl
+ga3ge
+5gai
+ga1k
+ga2ka
+gal2a
+g4amo
+2g1amt
+2ganb
+gan3d
+gan2g1a
+4gangeb
+gan2gr
+2ganh
+2g3anku
+2ganl
+g3anla
+3g2ano
+2ganw
+ga1ny
+2garb
+2garc
+3gard
+2g1arm
+ga3r2o
+g1arti
+ga3ru
+2g1arz
+ga2sa
+gas3ei
+ga2si
+ga2sor
+ga3sp
+ga4spe
+ga4spr
+gas3s
+gas4ta
+gas5tan
+ga4ste
+gas4t3el
+gat2a
+2gatm
+gat4r
+gau1c
+2g1auf
+g2auk
+g1aus
+2g1aut
+2g1äp
+2gärz
+gäs5
+gä4u
+2g1b2
+gber2
+gbi2
+gby4t
+2g1c
+2gd
+g1da
+g2d1au
+g2d1er
+gd1in
+g1do
+g1dö
+g1d3r
+gd3s2
+gdt4
+gd1u
+1ge
+ge3a2
+geb2a
+gebe4am
+geb4r
+ge1c
+ged4
+ge1e2
+ge3ec
+ge2es
+gef4
+ge3g2l
+ge1im
+ge2in.
+gein2s
+ge2int
+gein2v
+ge1ir
+ge2is
+2g1eise2
+gei3sh
+g2el
+ge4lanz
+gelb1r
+gel4b3ra
+gel6ders
+ge3le
+ge5leh
+ge4l3ers
+ge4less
+gell2a
+ge3lor
+gels2t
+gel3ste
+gel3sz
+gel3t2a
+ge3lum
+ge3lü
+gelz2
+ge3mi
+gem2u
+3gen
+ge3na
+ge4nam
+ge4nar
+gen4aug
+gen2d1r
+gen1eb
+ge3nec
+gen3eid
+gen3ern
+gen3g
+gen3n
+gen4sam
+gen3sz
+2g1entf
+gen3th
+4gentw
+geo2r
+ge1ou
+ge3p4
+ge1ra
+ge2rab
+4g3ereig
+ge4reng
+ge4ren4s
+ge4r3ent
+ger2er
+gerin4f
+ger4inn
+gerin4t
+germ4
+ger3no
+ge1r2ö
+ger4sto
+ge3r2u
+g2e1s2
+ges3auf
+ge3sc
+ges3elt
+ge2s3er
+ge3si
+ges4pi
+ges3s2t
+gest2
+ge3ste
+ge4s3ter
+ges3th
+ge3t2a
+2getap
+ge5tr
+ge3t4u
+ge1ul
+ge1ur
+2g1ex
+2g1f4
+4g1g
+gga4t
+g3ge
+gge2ne
+g2g3l
+gg4lo
+g2g3n
+gg4r
+2g1h
+4gh.
+gh2e
+3g2het
+3g2hie
+gh1l
+3gh2r
+g2hu
+gh1w
+gi3alo
+gie3g
+gi2e1i
+gi2el
+gien2e1
+gie1st
+gi2gu
+gi2me.
+gi4mes
+gi2met
+2g1ind
+gi3ne
+gin2ga
+2g1ins
+2g3isel
+gi3t2a
+gi3tu
+gi4us
+2g1j
+4g3k2
+4gl.
+g1lab
+g1lac
+3glad
+g2lade
+2g1lag
+3glanz
+3g2laub
+2g1lauf
+3glät
+2gläuf
+g2l4e
+2gle.
+3glea
+2g3leb
+g3lec
+g3leg
+2gleh
+4g3lein
+glei4t5r
+g3len
+4g5ler
+2gles
+g3lese
+g4lia
+2glib
+3g2lid
+3g2lie
+2glif
+g2lik
+4glin
+g2lio
+2glis
+4g3lisc
+3g2lit
+g2liz
+3g2loa
+3g2lob
+g3loch
+glo3g
+3g4lok
+g2lom
+3g2lop
+3g2lot
+2gls
+2g1lu
+glu2t
+3glü
+g2ly
+2g1m2
+g1n
+2gn.
+g2n2a
+g4na.
+2gnac
+g4nat
+3g2nä
+gn2e
+g3neh
+gne2tr
+2gneu
+2gng
+g2nie
+g2nif
+g4nin
+2gni2s1
+3g2no
+gno1r
+4g3not
+2gnp
+2gns
+2gnt
+2gnu
+3g2num.
+g2nü
+g2ny
+2gnz
+go4a
+goa3li
+2g1of
+2gog
+2g1oh
+go1i
+gol2a
+2gonis
+2g1ope
+2g1opf
+g2o1ra
+2gord
+2gorg
+go2s1
+go3st
+go3th
+got6t5erg
+go1y
+2g1p2
+2g1q
+g2r4
+gra2bi
+gra2bl
+2gradl
+2g3rah
+2g3rak
+grammen6
+gram8m7end
+2g3räu
+2g5re.
+g4reb
+2g3rec
+2g3rede
+g4re2e
+2g3reic
+2g3rein
+g3reit
+g4rem
+2g3renn
+gren6z5ei
+g4rer
+g3ret
+g3rev
+2g3ric
+gri2e
+g3riese
+3grif
+2grig
+2g3ring
+2groc
+2groh
+gron4
+g4ros
+gros6sel
+gro4u
+2g3röh
+g4ruf
+2g3rui
+2g3rum
+3g4runs
+3g4rup
+2grut
+2g3rüc
+3g4rün
+4g2s1
+gsa4g
+g3s2ah
+g4s3a2k
+g3sal
+g4salt
+gs3ama
+gs3an
+gs3ar
+gs3aug
+g3s2c
+g4sca
+g4s3ce
+gsch4
+g4schef
+gs4chi
+g4sco
+g4s3cr
+gse2
+gs2eh
+g3s2eil
+g3sel.
+gs3eli
+g3seln
+gsen1
+gs3er
+gs5erk
+gse4t
+g4seta
+gsi2d
+g3sil
+g4sl
+gso2
+gsp4
+g3s2pek
+g3spi
+gs4pie
+g4spin
+gs2pit
+gs3pl
+g3s2por
+gsrat4
+gsrü2
+gs5s4
+gs3ta
+g3stan
+g3star
+g3s4tati
+g4s3tä
+g5stäm
+g3stel
+gst3ent
+gst3err
+g1steu
+gst2he
+g3stir
+g3sto
+gs3toc
+g4stol
+gs3top
+g4s3tor
+g3stö
+gs3tr
+gst4ra
+gs4trat
+gst4ri
+gs4t3ros
+g3stu
+g4stur
+gs3tü
+gs4tüc
+g4sw
+g3sy
+2g1t
+g3te
+gti2m
+gt4r
+gt2s
+g3tü
+1gu
+gu3am
+gu1an.
+gu1ant
+gu1c
+gu2e
+2gued
+guet4
+2g1u2f
+2g1uh
+gu1ins
+gu1is
+3gumm
+2g1unf
+g2ung.
+gunge2
+4gungew
+2g1ungl
+g2un4s
+2gunt2
+2g1url
+gurt3s
+gu2s3a
+guschi5
+gus4ser
+gus2sp
+gus2st
+gu4st
+gu2t
+gut1a
+gu4t3erh
+gut3h
+2güb
+gür1
+güs3
+2g1v
+2g1w
+2g3z2
+3haa
+hab2a
+hab2e
+h2abs
+ha2cho
+ha2del
+ha4din
+h1adle
+haf3f4l
+haft4s3p
+h1ah
+ha1kl
+2h2al.
+halan4c
+ha2lau
+hal2ba
+hal4bei
+halb3r
+2hale
+hal2la
+hal6lerf
+h1alp
+hal2st
+hal4t3r
+h1amt
+h2an.
+h2and
+hand3s
+h4ann
+2hanr
+2hant
+h1ap
+ha2pl
+ha2pr
+h4a3ra
+2harb
+h2ard
+h1arm.
+har4me.
+har4mes
+har2th
+h1arti
+h2as
+2ha3sa
+hasi1
+hat5t2
+hau3f4li
+2h1aufm
+h1aukt
+hau2sa
+hau2sc
+hau4spa
+hau5stei
+hau6terk
+2hauto
+hau2tr
+h1äff
+hä6s5chen
+häu2s1c
+hä3usp
+2h3b2
+hba2r3a
+2h1c
+2h3d4
+hdan2
+2hea
+he2ad
+he3be
+he4b1ei
+he2bl
+he3br
+he5ch2e
+he1cho
+h1echt
+he3cke
+hed2g
+he3di
+he2e3l
+hee4s
+he2fan
+he2fä
+he2f1ei
+hef3erm
+2heff
+he4f3ing
+he2f3l
+he2fr
+he3fri
+he2fu
+he3gu
+h1eie
+h1eif
+h1eig
+he2im
+heim3p
+hei4mu
+heine2
+hei4neh
+h1eink
+4heio
+he1ism
+he1ist
+heit4s3
+h1eiw
+he2l3au
+hel1ec
+h3e2lek
+he3len
+hel3ers
+he3li
+hel4l3au
+hel4mei
+he3lo
+he4lof
+he2lö
+3hemd
+he3mi
+3hemm
+4h1emp
+h2en.
+he4n3a4
+he2nä
+hend2s
+he2n1e2b
+hen3end
+hen3erg
+he2net
+heng2
+2heni
+he2no
+henst2
+hen5tr
+h1ents
+2h3entw
+hen3z
+4he2o
+he3on
+he3op
+he3ph
+her3a2b
+he2ral
+2herap
+he3ras
+herb4s
+he4reck
+4hereig
+he4r3eis
+he2rel
+he4rerw
+h1er2fo
+h1erfü
+herg2
+herin4f
+he6rin6nu
+herin4s
+herin8ter
+h1erke
+h3erlau
+2herm
+he3ro
+he4r3o4b
+h1erö
+hert2
+her3th
+her2zw
+he1sta
+he2s5tr
+he2tap
+heter2
+he3th
+het2i
+he3t4s
+h2e2u
+heu3g
+he3x
+he1x4a
+he1y2
+1hè
+2h3f4
+hfell1
+hfel6ler
+hfi2s
+2h3g2
+hget4
+2h1h2
+2hi.
+2hia
+hi2ac
+hi2ang
+hi1ce
+hich6ter
+2hi3d
+h2ide
+h1i4di
+hi2e
+hi3ens
+hier1i
+hie4rin
+hiers2
+hif3f4r
+hi2kr
+hi2l3a4
+hil2fr
+hi2n
+h1indu
+hi3nel
+hin2en
+h1inf
+h1inh
+hi3n2i
+hin3n2
+hi3no
+hin3s2
+hin4t1a
+2hio
+hi4on
+hi3or
+2hip1
+hi2ph
+hi2pi
+h2i2r
+hi3ra
+2hi3re
+hi3ri
+hirn1
+hir4ner
+hi3ro
+hir2s
+his2a
+hi2se
+his2p
+hi2st
+hi1th
+hi3ti
+2hiu
+h1j
+2h1k4
+2hl
+h4lac
+hla2n
+hl1anz
+h1las
+h1lat
+h1laut
+h3läd
+h1läs
+h1läu
+hlb4
+hld4
+h3leb
+hle3e
+h5len.
+hlen3g
+hl2enn
+h3ler
+hle2ra
+hl1erg
+h6l3ernä
+hle3run
+hl1erw
+h4lerz
+h3les
+h4lesi
+h3lex
+hlg4
+h2lie
+h2lif
+hl1ind
+h2lip
+h2lis
+h3list
+h2lit
+hll2
+hlm2
+h2lo
+h3loc
+hl1of
+hl1op
+h4lor
+hlo2re
+h3losi
+hl2ö
+h3löc
+h2lös
+hl2san
+hl2ser
+hl3sku
+hl3slo
+hl3t2
+h3luf
+h3luk
+h1lüf
+2h1m
+h2mab
+h3mag
+h3man
+h3mar
+h4mäc
+h4mäh
+h4mäl
+h4mäu
+h3me.
+hme1e
+hme1in
+h3men
+hmen2s
+hme2ra
+h2mo
+h4mon
+h3mö
+hm3p4
+hm2s
+hm3sa
+hms1p
+h2mu
+2hn
+h2na
+hn1ad
+h3nam
+hn1an
+h2nä
+hn3d4
+hn2e
+hn3eig
+hn3ein
+h2nel
+hne4n1
+hne4pf
+hner3ei
+h3nerl
+h3nerz
+hn3ex
+h2nic
+h2nid
+h2nie
+hn1im
+hn1in
+h2nip
+hn3k4
+h2nor
+hn3s2k
+hnts2
+h1nu
+h2nuc
+h2nul
+hn1unf
+h3nunge
+ho2bl
+ho2ch3
+ho2cka
+ho6ckerl
+hock3t
+2hod
+hoe4
+ho2ef
+ho4fa
+ho2f3r
+2hoi
+hol1au
+4holdy
+3hole
+ho2l1ei
+hol3g4
+4holo
+ho4lor
+3hol3s
+h1o2ly
+3holz
+hol6zene
+hom2e
+ho2mec
+ho2med
+h2on
+hono3
+2hoo
+2hop
+ho1ra
+hor3d
+h1org
+ho4sei
+ho3sl
+ho2sp
+ho4st
+2hot.
+ho3th
+hotli4
+2hot3s2
+3hov
+2ho2w1
+h1o2x
+ho1y2
+1h2ö
+hö2c
+hö3ck
+h4ör
+hö2s1
+h3öst
+2h3p2
+h1q
+2hr
+hr1ac
+hr3ad
+h1rai
+h1rane
+h3räu
+hr1c
+hr3d
+h2rec
+h3rech
+h3red
+h3ref
+h4rei.
+hrei4ba
+h3reic
+h4r3eig
+h3rel
+h3r2en
+h3rep
+hr2erg
+hr2erk
+h6rerleb
+hr2erm
+hr2erz
+h3re2s1
+hre2t
+h2r1eta
+h3rev
+hrf2
+hrg2
+h2ri
+h3ric
+h4rick
+hri4e
+h3riesl
+h3rin
+h4rine
+h4rinh
+h4rist
+h2rob
+h3roh
+h3rol
+h4rome
+h4romi
+h4ron
+h2ror
+h3rou
+hrr4
+hr2s1ac
+hr2s3an
+hr2sau
+hr3schl
+hr2s1en
+hr2ser
+hr4set
+hr4s1in
+hrs3k
+hr4s1of
+hr2su
+hr4sw
+hr2tab
+hr2tan
+hr2th
+hr2tor
+hrt3ri
+hr2tro
+hrt2sa
+hrt2se
+h3ruh
+hr1ums
+h3rü
+h4rüb
+h2ry
+hrz2
+4hs
+h2s1ach
+h2san
+h2sau
+h4schan
+h2s1ec
+hse4ler
+h2s1erl
+h3s2ex
+h2s1ing
+h2s1of
+h2s1par
+h2sph
+hs2por
+h2sprä
+h2spro
+hss2
+h1sta
+hst3alt
+hst2an
+h2s3tau
+h1stec
+h3stein
+h5stell
+h3s4terb
+hst2he
+h1s2ti
+h1sto
+h2stor
+h1s4tr
+hst3ran
+hst3ri
+h1stun
+h2s1u
+hs2ung
+4h1t
+h2t1a
+h3t4akt.
+h3takts
+h3t2al
+h4t3alt
+h4t3a2m
+hta4n
+ht3ane
+h3tank
+ht2as
+h4t3ass
+h4tasy
+ht3a2t
+h2tär
+ht1e2c
+h2t1ef
+ht1eh
+hte2he
+h2teif
+h4teilz
+h2t1eim
+h2t1eis
+h4t3elit
+h2temp
+h4tentf
+h4t3ents
+ht3erfo
+ht3erfü
+h2t1erh
+ht5erken
+h4terkl
+h6terneu
+h4t3erre
+ht3ersc
+h6t5erspa
+ht3erst
+h6tersta
+ht6erste
+h2t1erz
+hte2s
+h4t1ese
+h4t1ess
+hte3sta
+h2t1eu
+h2t1ex
+h2th
+h4thei
+hthe3u
+h4tho
+h2t1in
+hto2
+h2toly
+h2torg
+h3töp
+h4t3rak
+ht3rand
+h2t3rat
+ht6raume
+h4tref
+ht4ri
+h4t5rin
+h2t3rol
+h2t3ros
+ht3rö
+h4t1rös
+h2t3ru
+h2t3rü
+h4ts
+ht2so
+ht2sp
+ht3spri
+ht4stab
+hts2ti
+hts4tie
+ht4s3tur
+ht4s3tür
+htt4
+htti2
+h2t1urs
+h3tü
+ht3z2
+hu2b1a
+hu2b3ei
+hu2b1en
+hu2b3l
+hu4b3r
+hu2bu
+hu1c
+hu2h1a
+hu2h1i
+huko3
+huk3t4
+hu2l3a
+hu2lä
+hu2l3ei
+hu4l3eng
+hu4lent
+hu2ler
+hu2let
+hu2l1in
+hu2lo
+hu3m2a
+h1ums
+hu2n
+h1una
+hung4s
+hu3ni1
+h1up.
+h1ups
+2hur
+hurg2
+hu3sa
+hu2so
+hus4sa
+hus2sp
+hu2tab
+hu3t2h
+hu2ti
+hut2t
+hut4zen
+hut4z3er
+hutz1i
+h2ü
+h4übs
+h3übu
+hühne4
+hüs3
+2h1v
+hvi2
+hvil4
+2hw
+h2wall
+hwe1c
+h1weib
+3hyg
+3hyp
+hy2pe.
+2hy2t
+h1z
+hz2o
+hzug4
+i1a
+2ia.
+i4aa
+i2ab
+iab4l
+2iac
+i2af
+iaf4l
+i4a3g2
+i2ah
+i2aj
+i2ak
+i3ak.
+i3akt
+2ial
+i5al.
+ia2l1a4
+ia2lä
+ial3b
+ial3d
+i3alei
+i3alent
+i3alerf
+i3alerh
+ia4l3erm
+i3a2let
+i3a4lia
+ialk2
+i3all
+ial3la
+ia2lor
+ial3t4
+ia2lu
+ial3z2
+i2am
+i4amo
+2ian
+ia2nal
+i3and2
+ian2e
+i3ann
+i2ano
+i3ant
+i3anz
+i2ap
+ia3p2f
+ia1q
+i3ar.
+ia2ra
+2ias
+i2asc
+ia3sh
+i2asi
+i2a3sp
+ias3s
+iast4
+i3at.
+i3a4ta
+i4ate
+i3at4h
+1iatr
+i3ats
+i3au
+ia3un
+2iav
+2iä
+i1äm
+iär2
+i1är.
+i1ärs
+i1ät.
+i1äta
+i1ät3s4
+2i1b
+i2b1auf
+ib2bli
+ib1ei
+i2beig
+i2beis
+ibela2
+ibe4n
+iben3a
+ibi2k
+i3bla
+i3ble
+i2blis
+ib2o
+i2b1ö
+i4brä
+ib3ren
+ib4ste
+i2bunk
+i2bunt
+ibu2s1
+2ic
+ic1c
+ice1
+ich1a
+ich1ä
+i1che
+ich1ei
+i1chi
+i2chin
+ich3l
+i3chlo
+ich3m
+i1cho
+i2ch3r
+ich2t3r
+i1chu
+ich1w
+i1ci
+i3ck2e
+i1cl
+i1d
+id2ab4
+i3dam
+id2an
+i2d1au
+1i2dee
+i2dei
+idel2ä
+ide3so
+ide3sp
+1i2dio
+idni3
+i2dol
+1idol.
+2i2dr
+i3d2sc
+id2s1p
+idt4
+i2dy
+ie3a4
+ie2bä
+ie2bl
+ie2bre
+ieb4sto
+ieb4str
+ie1c
+ie2cho
+ie2ck
+ie2dr
+ie1e2
+ie2f1ak
+ie2f1an
+ie2fau
+ief3f4
+ie2f3l
+ie2fro
+ie4g5l
+ie3g4n
+ie2g3r
+ie3g4ra
+iegs3c
+i1ei
+i2e2l1a
+ie3las
+iel3au
+iel3d
+iel1ec
+ieler8geb
+i1ell
+ielo4b
+iel3sz
+iel3ta
+2i1en
+i3en.
+i3ena
+iena2b
+ie4n3a4g
+i3e2nä
+i3end
+i2ene
+ien1eb
+ie3ner
+ien4erf
+ie4n3erg
+i3enf
+i3en3g
+ienge4f
+i3enh
+i3enj
+i3enk
+i3enm
+i3enn
+i3e2no
+i3enö
+i3enp
+i3enr
+ien2s
+ien3sc
+ien3s2e
+ien3si
+iens2k
+ien3sp
+ienst5rä
+ien3sz
+ie1nu
+i3env
+i3enw
+i3enz
+ie1o2
+ier3a2
+ie2rap
+i2ere
+ie3r2er
+ie4rerf
+ie4r3erz
+ie3res
+i3ereu
+i4eri
+ierin3
+ier3k2
+i1ern
+i3ern.
+i2er5ni
+ie2rö
+ier4seh
+iers2t
+ier3sta
+ier3ste
+ier3te
+iesen3s4
+ies2sp
+ies2s3t
+ie1sta
+ie3su
+ie2t1a
+ie4t3erh
+ie4t3ert
+ie2t3ho
+ie4t1o
+ie4t1ö4
+ie2tri
+iet2se
+i1ett
+ieu2e
+ie1un
+i1ex
+2if
+if1ar
+i2f3arm
+if4at
+if1au
+i2fec
+ife2i
+if2en
+ifens2
+if1erg
+if1erh
+if2fl
+if3l
+i1f4la
+if4lä
+i1flü
+if3r
+if4ra
+i1frau
+i1fre
+if4rei
+if4rü
+if2s
+if3se
+if3sp
+if2ta
+ift3erk
+if2top
+if4t3ri
+ift3s2p
+ift3sz
+2i1g
+iga3i
+i2g1ang
+ig1art
+iga1s4
+i4gefar
+ige4na
+ig1erz
+i2g1im
+i2gl
+ig1lä
+ig4na
+i4gnä
+i3g4neu
+ig4no
+i3go
+ig4ra
+ig3rei
+ig4sal
+ig3sä
+ig4se
+ig3so
+ig3spr
+ig3stei
+ig4sto
+ig4stö
+ig3str
+ig4stre
+ig3stü
+igung4
+2i1h
+i2h1am
+i2har
+i3he
+ihe1e
+ihe4n
+ih3m
+ih3n
+ih3r
+ihs2
+i2h1um
+ih1w
+ii2
+ii3a4
+i1ie
+i3i4g
+i1im
+i1in
+i1i4s
+i2is.
+ii3t
+i1j
+2i1k
+i2k1a4k
+ik1amt
+i2k1ano
+ik1anz
+i4kanze
+ik1art
+ik3att
+i2k1au
+i2kär
+4ike
+i2k1ei
+ike2l1
+i2k1e2r2e
+ik1erf
+iker6fah
+i2ker2l
+i2k1eta
+i3ki.
+ik1in
+i2kind
+i2k3l
+i3kla
+i3k4lä
+i2kn
+ik3no
+ik2o3p4
+iko3s
+i2köl
+i2k3ra
+ik3rä
+ik3re
+ik1s2
+ik3so
+ik3sz
+ikt2e
+ikt3erk
+ikt3r
+ik2tre
+i2kun
+i3kus
+i1la
+i2l3ab
+il1a2d
+i2l1ak
+i2l3a2m
+il1ans
+il1asp
+il1au
+il4aufb
+il3aus
+i2laut
+i1lä1
+6ilb
+il2c
+il2da
+il4d3en4t
+ild2er
+ild1o
+il2dor
+il2dr
+il1e2c
+ile2h
+il1ehe
+il1ein
+il1el
+i4lents
+i2l1erf
+i2l1erg
+i2l1err
+ilf2
+il2f3l
+il2f3re
+ilf4s3
+ilie4n
+ilig1a2
+ili4gab
+i2l1ind
+i2l1ip
+i3lip.
+i3lips
+2ill.
+il3l2a
+il3l2er
+il3l2i
+2ills
+il2mak
+il4mang
+il2m3at
+il2mau
+il2min
+2ilo
+i2l1or
+il3t2h
+i1lu2
+i2lum
+ilung4
+i3lus
+ilv4
+il2z1ar
+ilz3erk
+2im.
+i2manw
+i2m1arm
+im4at
+ima2tr
+imat5sc
+ima4tur
+i2meg
+i2mej
+i2mek
+i2mele
+i2melf
+i2m1erf
+i2m1erz
+i4mesh
+i2meti
+i2mew
+i2m1inf
+i2m1ins
+im2mei
+im4m3ent
+1immo
+2imo
+im1org
+1impo
+imp4s
+im3pse
+1impu
+im2st
+im3sta
+2imt
+imt3s2
+2imu
+in3a2c
+i4nack
+i2n1ad
+in2af
+in3am
+i3nap
+in2ara
+in2ars
+ina4s
+i2n3au
+in1äs
+in2dal
+in2dan
+1index
+in3do
+2indr
+ind4ri
+in3drü
+1indus
+2ine
+i2n1e2be
+in1ehe
+in3ei
+i2n1eng
+in3erbe
+i4nerbi
+in2erh
+iner4lö
+i4ner4tr
+i4nesk
+in1eu
+ine3un
+ine2x
+in3f
+1info.
+1infos
+2inga
+ing1af
+in2g1a4g
+in2gl
+ing4sam
+1inhab
+2inhar
+2inhau
+4inhe
+in2i3d
+i3nie
+2inig
+ini3kr
+in2ir
+2inis
+ini3se
+i3nitz
+3inkarn
+inma4le
+2inn.
+in4n3erm
+2innl
+in2nor
+inn4sta
+1innta
+2ino
+in1od
+in3ols
+in1or
+ino1s2
+ino3t
+i1nö
+in1ö2d
+2inp
+2inr
+ins2am
+insch2
+in2seb
+2insen
+ins3ert
+in3skan
+in3skr
+1insta
+in4s3tät
+in3stel
+in3su
+1insuf
+in4s3um
+in3s2z
+1integ
+int2h
+in3t4r
+in5tri
+in1u
+i3n2um
+in3unz
+invil4
+i1ny
+in3zw
+i1ñ
+2i1o
+io1c
+io2d
+i2oda
+io3e4
+iof4l
+i2o3h
+io2i3d
+io3k4
+i3ol.
+i3om.
+i3oms
+ion2
+i3on.
+ional3a
+io2nau
+ion3d
+i3ons3
+ion4spi
+ion4st
+i2ony
+i2o1p
+io4pf
+i3ops
+i3opt
+i2or
+i3or.
+i3orc
+iore4n
+i3orp
+i3ors
+i3ort
+io3s2
+i2ost
+i3ot.
+i3ots
+i2ou
+i2ov
+io2x
+i3oz.
+i1ö2k
+i3ön
+i1ös.
+2ip.
+i1pa
+i1pe
+ipen3
+i3per
+ip3fa
+iph2
+2i1pi
+ipi3el
+ipi3en
+ipi2s
+ip4l
+ip2pl
+ip3pu
+i1pr
+2ips
+2ipu
+2i1q
+i1r2a
+i3rad
+1i2rak
+irat2
+i1rä
+ir2bl
+ir1c
+ir2e
+i3ree
+2irek
+2i3ré
+ir2gl
+irg4s
+ir2he
+ir2i
+2irig
+2irk
+ir2k3l
+irli4n
+ir2mak
+ir2mau
+ir4mä
+ir2m1ei
+ir2mum
+ir4m3unt
+ir2nar
+ir2no
+i1ro
+1iron
+iro2s
+i1rö
+irpla4
+irr2h
+ir4sch3w
+ir3se
+ir3sh
+ir2st
+irt2st
+iru2s1
+i3sac
+i4s1amt
+is2ap
+is3are
+i2sau
+i2s1än
+2isb
+i2sca
+isch3ar
+i3s2che
+i4schef
+i4sch3e4h
+i4sch3ei
+i4schin
+i5sching
+i2sch1l
+isch3le
+i2schm
+isch3ob
+isch3re
+isch3ru
+i4schwa
+i6schwir
+i4schwo
+isch3wu
+is1chy
+i2s3cr
+2ise
+ise3e
+ise3ha
+ise3hi
+ise3inf
+i4seint
+ise2n1
+is2end
+isen3s
+i2serh
+i2s1erm
+iser2u
+i2s1ess
+i4s3etat
+is2has
+isi2a
+i2s1id
+i2s1of
+iso6nend
+is1op
+3i2sot
+is1pa
+i2spar
+is1pe
+is1pic
+is2pit
+i2spro
+is3sa
+is4s1ac
+is4sau
+is4s3che
+is2st
+is3sta
+is3sto
+iss3tr
+is3stu
+is2sum
+is3t
+is4tab
+is4tam
+ist2an
+i1s4tat
+is4tel
+iste4n
+istes3
+i1s4teu
+i1s4til
+is4toc
+is4tö
+is5tör
+ist4ra
+ist3re
+is4tü
+isum3p
+i2sü
+i1ß
+iß1ers
+it1ab.
+ital1a
+it1alt
+it1am
+it1an
+it2an.
+it3a4re
+it1art
+i3tat
+it1au
+i3tauc
+i4t1ax
+4itä
+it2är
+i2t1äs
+ität2
+i2t1ei
+i4teig
+it2eil
+i4tein
+2itel
+ite2la
+ite4n
+iten3s2
+i4tepo
+i2tex
+i5thr
+i2t1id
+1itii
+iti4kan
+i2t1in1
+it2inn
+itmen2
+i5toc
+i2t1of
+i3tö
+it3raf
+i2t3ran
+it3ras
+it3rau
+it3räu
+it3re
+it3ric
+it3rom
+it4ron
+i3tru
+it3run
+it2sa
+its1a4g
+it2s1e4
+its3er1
+it2so
+it2s1pe
+it4staf
+it2sto
+it2teb
+it4tri
+itt2sp
+it1uh
+i2t1um
+i2tuns
+it1urg
+itut4
+i3tü
+2itz
+it2zä
+it4z3erg
+it2z1w
+2i3u2
+ium1
+i1ü
+2i1v
+i2v1ak
+iv1ang
+i2veb
+i2v1ei
+iv1elt
+ive4n
+i2v1ene
+i2v1ent
+i2v1ur
+2i1w
+iwur2
+2i1x
+i2xa
+ix2em
+i3xi
+2i1z
+iz1ap
+iz1au
+izei3c
+ize2n
+i2z1ene
+iz4er
+i2z1ir
+izo2b
+i2zö
+i2z1w
+í1l
+ja1c
+jah4r3ei
+jahr4s
+ja3l2a
+ja3ne
+jani1
+ja1st
+2jat
+je2a
+jean2s
+je1c
+je2g
+jek4ter
+jekto2
+jektor4
+jek2tr
+je3na
+je2p
+je4s3t
+je2t1a
+je2t3h
+je2t3r
+jet3s2
+jet3t
+je2t1u2
+je3w
+ji2a
+jit3
+ji2v
+joa3
+jo2b1
+job3r
+jo2i
+joni1
+jo1ra
+jord2
+jo2sc
+jou4l
+j2u
+ju2bl
+jugen2
+jugend3
+ju2k
+jung3s4
+ju3ni
+jur2o
+jus3
+jut2e1
+2j1v
+1ka
+3ka.
+k3a2a
+ka3ar
+kab2bl
+ka2ben
+2kabh
+2kabla
+2kablä
+2k1a2bo
+ka3b4r
+2kabs
+2k1abt
+ka1c
+k2ad
+2k3ada
+2k3a2dr
+ka1f4l
+ka1fr
+kaf3t2
+k2ag
+ka1in
+ka3ka
+kaken4
+2kala.
+ka2lan
+ka3lei
+ka3len.
+ka4lens
+kal3eri
+kal2ka
+kal2kr
+k1all
+kalo5
+kal4tr
+k3ama
+kamp8ferf
+kan2al
+ka4n1a4s
+ka2nau
+kand4
+2kanda
+kan2e
+2k1ang
+kan3k4
+2kanl
+2k1anna
+k1ans
+k2ans.
+6kantenn
+ka3nu
+2kanw
+k2anz.
+ka2o
+2k1apf
+3kara
+2karb
+k2ard
+k2arg
+ka3r2i
+kari3es
+k2ark
+2k1arm
+k2arp3
+kar2pf
+k2ars
+kar3t
+k2arta
+2k1arti
+karu2
+k2arw
+3kas
+ka3se
+kasi1
+kas3s
+ka2s3t
+ka3tan
+ka3t4h
+ka4t3r
+2katt
+kau2f1o
+4kaufr
+kauf4sp
+k1aus
+kau3t2
+2kauto
+1kä
+k1äh
+k1ä2mi
+k1än
+kär2
+kä2s1c
+käse3
+2k3b4
+kbo4n
+kbu2s
+kby4
+2k3c
+2k3d2
+kdamp2
+2k1e1c
+k1eff
+kefi4
+kege2
+ke2gl
+ke2he.
+kehr2s
+kehr4s3o
+2k1eic
+2k1eig
+k1ein
+ke1in2d
+2keinh
+kei1s
+2k1eise
+keit2
+ke2la
+kel1ac
+ke3lag
+kel1au
+ke2lä
+kel3b4
+2ke2lek
+ke2len
+2ke3let
+kell4e
+kel3s2k
+k4elt
+2k1emp
+k2en.
+ken3au
+4ken4gag
+2kenlä
+ke2no
+kens2k
+ken5stei
+ken3sz
+k2ente
+k3enten
+ken3th
+k2entr
+2k1ents
+k2entu
+2kentw
+2keo2
+ke2pl
+k2er.
+ke1rad
+k2erc
+4kerfah
+k4erfam
+k3ergeb
+ker6gebn
+k3er4hö
+ke6rin6nu
+kerin6st
+kerin4t
+ker4ken
+k2erko
+k2erl
+k3er4lau
+k3er4leb
+k6erlebe
+ker4neu
+k1e2ro
+k2ers.
+kerz2
+ker4zeu
+2k1er2zi
+k6es.
+ke2sel
+ke4t1a
+ke2t3h
+ket3s
+ke1up
+keu6schl
+2k1e2x
+2k3f4
+2k1g2
+2k1h4
+kho3m
+ki3a4
+ki1c
+2k1i2de
+ki3dr
+ki2el
+kie2l3o
+ki1f4l
+ki1f4r
+ki3k4
+2kil2a
+ki3li
+ki3lo
+k2imi
+k2in.
+k2ing
+2kinh
+k2ini
+k2inn
+ki3n4o3
+kin3s
+2k1inse
+2k1int
+ki3or
+kio4s
+3kir
+kis2p
+kist2
+kis4to
+2kiz
+ki3zi
+2k3j
+2k1k4
+kl2
+4kl.
+4kla.
+k4lar
+4k1last
+k2le
+4kle.
+kle3ari
+4kleh
+k4leid
+4k3leit
+k3lem.
+2k3ler
+kle2ra
+2k3leu
+kle3us
+2klic
+2klig
+k2lin
+k3lip
+k2lir
+k2lisc
+2klist
+klit2s
+4kliz
+2k3loc
+klo2i3
+k4lop
+klost4
+klö2s
+k2löt
+k1lu
+kluf2
+klung4
+2k1lüc
+2kly
+2k1m
+k2n2
+3knab
+k3ne
+k4nei
+2k5ner
+kno4bl
+2k5nor
+k3nu
+3knü
+1ko
+ko2al
+2kobj
+2k1o2fe
+koff4
+koh3lu
+ko1i2
+kol4a
+ko3le
+kol2k5
+3kom
+ko4mu
+k2on
+ko3n2e
+kon3s4
+ko3nu
+2kop.
+ko1pe
+kop4fen
+2kops
+2kopz
+ko1r2a
+2k1orc
+kor6derg
+ko3ri
+k2os
+ko2sp
+ko2st
+ko3ta
+kot3s2
+kot4tak
+2k1ou
+3kow
+ko2we
+k1o2x
+1kö
+kö2f
+k1öl
+2k1p2
+k1q
+k2r4
+2k3rad
+k3rats
+2kraum
+k4raz
+2k3rät
+2k3räum
+2kre.
+2k3rec
+2k3rede
+2k3ref
+2kreg
+k3reic
+kre1i2e4
+kreier4
+k3reih
+2k3rh
+2krib
+2k3ric
+k3ries
+2krip
+3kris
+3k4ron
+2kruf
+krü1b
+2ks
+k4s1amt
+k2san
+ks3ar
+k2sau
+ks2än
+ksch4
+ks1e2b
+k2s1em
+k2sent
+ks1erl
+k2s1ers
+k2s1erw
+ks3ha
+k2s1id
+k2s1in
+k2s1o2
+k3sof
+ks1pa
+k3spe
+ks2por
+ks2pu
+ks3s2
+kst4
+k1sta
+k4s3tanz
+k3stat4
+k1ste
+k1s2ti
+k1sto
+k2stor
+k1str
+k2strä
+k1stu
+k2stum
+k2s1u
+ks2zen
+4k1t
+k2t1ad
+kt1akt
+k3tal
+kt1am
+kt1an
+k2t3a2r
+kta4re
+k2t1au
+ktä3s
+kte3e
+kt1ei
+k2temp
+k2tent
+k4t3erfo
+k2t1erh
+kte3ru
+k2tex
+k2th
+kt3ho
+k2t1id
+kt1im
+k2t1ing
+kt1ins
+kti4ter
+k2t1of
+k3top
+kt1ope
+k4torga
+kt3orie
+kt4ran
+kt3ras
+k4tref
+kt4ro
+ktro1s
+kt3run
+kt3s4
+ktt2
+k2tuns
+k3tü
+kt3z
+ku1c
+kuh1
+2k1uhr
+kul2a
+ku3l2e
+ku3l2i
+4kulp
+2k3uml
+kum2s1
+k2u3n2a
+kung4
+kun4s4
+kunst3
+2kunt
+2k1up.
+kur2bl
+ku2rei
+kuri2e
+kuri4er
+ku2ro
+kur2sp
+kur2st
+ku4schl
+ku2sp
+kus3t
+ku2su
+1kü
+2küb
+kü1c
+kür4s
+2k1v
+2k1w
+2k3z2
+kze3l
+3la.
+la3ba
+2labb
+4l3aben
+2labf
+2labg
+2labh
+4l1a2bl
+lab2o
+l2abr
+lab4ra
+lab4ri
+2l3abs
+l1abt
+3labu
+2labw
+la1ce
+la2ce.
+1lad
+lad2i
+l1adl
+2ladm
+2l1a2dr
+3ladu
+l1adv
+2laf
+la2fa
+laf3s
+laf3t
+la2ga
+la2gio
+la2gn
+lago2
+la2g1ob
+2la1ho
+1lai
+la2k1i
+l2akk
+la1k4l
+2l1al
+4lall
+4lalp
+l2ami
+la3min
+1lammf
+l2amp
+2l1amt
+lamt4s
+la4mun
+l1anal
+la2nau
+2lanb
+3l2and
+lan2d3a2
+lan6d5erw
+lan6d5erz
+lan2d3r
+2lanf
+lan2gl
+lang3s4
+2lanhä
+l2anhe
+2lanl
+4lanli
+2l3ann
+l1anp
+2lans
+4lansä
+2lantr
+lan2zw
+3lao
+l1a2po2
+lap4pl
+la2r1an
+la2r1ei
+la4rene
+3l4ar3g
+lar3ini
+lar3s
+2l1ar3t
+l3arti
+la2ru
+la2sau
+4lasd
+la3se
+2lash
+2lasi
+la2so
+2lasp
+3lasser
+la2st
+last1o
+lat2a
+la3te
+la4tel
+2l3ath
+la2t3ra
+lat2s
+2lat2t1a
+lat4tan
+lat4t3in
+lat2t3r
+laub4se
+l2auf.
+lau2fo
+l2aufz
+1laug
+2lausl
+2lausr
+2l1auss
+2lauto
+1law
+lawa4
+lay1
+lä1c
+1läd
+2läf
+2l1ähn
+1länd
+lär2m1a
+lä2s1c
+4lät
+2läub
+2läuc
+2läue
+1läuf
+1là
+2l1b
+l3bac
+l2b1ede
+l4beta
+l2b1id
+l2b1ins
+lb2lat
+l3blä
+lb3le
+l2bli
+l3blo
+l4bre.
+lb3rit
+lb2s
+lb3sa
+lb3se
+lb4sk
+lb3sp
+lbs6t
+lbst3e
+lb4sto
+lb2u
+l2b3uf
+lbzei2
+2l1c
+l3che
+l3chi
+lch3l
+lch3r
+lch3ü
+lch1w
+l3cl
+4l1d
+ld3a2b1
+l3d2ac
+ld3a2ck
+l2d1a2d
+lda4g
+l2d1ak
+ld1al
+l3dam
+ld1amm
+l2d3a2n
+l2d1a2r
+ld3ari
+l3das
+l3dat
+ld1au
+ld1är
+l2dei
+l2dele
+l3der.
+ld1erp
+l2d1e2se
+l2dex
+l2d1id
+l2d1im
+ldo2r
+ld2os
+ld2ö2
+ld3r
+l2dran
+l2dre
+l3d4ru
+ld4rü
+ld3sa
+ld3st
+ldt4
+ld3th
+l2d1um
+1le
+3le.
+le2ad
+leben4s3
+le2bl
+2lec
+le2chi
+lecht4e
+3led
+4ledd
+le3de
+le2e
+le3ei
+lef2a
+le2g1as
+le2gau
+le2gä
+le2gl
+leg4r
+3leh
+leh3r2e
+4lehs
+4leht
+3lei.
+lei2br
+l2eic
+l2eid
+4l1eig
+l2ein.
+l2eind
+lein4du
+l2eine
+lei6nerb
+2leink
+l2eint
+leis6s5er
+l4eist
+lei4ßer
+l2eit
+lei2ta
+lei8t7er8sc
+leit3s2
+lekt2a
+2lektr
+3l2ela
+2le2lek
+lel3s
+3lemes
+le2m1o2
+4lemp
+lem3s
+l2en.
+le4nad
+le2nä
+4lendet
+2lendu
+le4n3end
+4lenerg
+l2enf
+le3ni
+l2enk
+2l1enni
+l2e2no
+len4sem
+len3sz
+l1ents
+2l3entw
+lent4wä
+5lentwet
+4lentz
+len2zi
+le1os
+2lep
+3lepa
+3lepf
+lepositi8
+3lepr
+l2er.
+l2e1ra
+le2ra4g
+le2rau
+lerb4
+4l3ereig
+le4r3eim
+le4rers
+l1erfo
+l2erfr
+l2erfü
+3lergeh
+l3ergen
+3l4ergew
+2l1ergi
+lerin4s
+lerk2
+l2erka
+l2erko
+l2erle
+2l1er2ö
+3l2erra
+l4ers.
+lers2k
+lers2t
+ler3t
+6lerwerb
+l1erz
+l2erza
+les2am
+les2e
+2l1esel
+le3ser
+le3sh
+lesi1
+le3sk
+les2t
+leste3
+le1sto
+4lesw
+2lesy
+le2tat
+2le3th
+2leto
+let4tu
+le2u
+4leud
+2leuro
+3leut
+3lev
+2lexe
+le2xis
+2lexz
+2l1f
+l3fah
+lfang3
+l2f1ec
+lfe1e
+l4feis
+l3f4lä
+lf3lo
+l3f4lu
+lf3ram
+lf2tr
+lf4u
+lfur1
+l3fü
+2l1g
+lga3t
+lgd4
+lgen2a
+lge3ra
+lgeräu3
+l2geti
+l3go
+lg3re
+l3gro
+2l1h2
+3lhi.
+1li
+3lia
+li3ac
+li3ak
+li3ar
+lia1s
+libi3
+li1c
+3lichem
+3licher
+li3chi
+4lick
+li2cka
+li3d2a
+li2deo
+2l1ido
+li4ds
+lid3sc
+l2ie
+3lie.
+liebe4s
+li3ene
+lien3s
+lie2s3c
+lie2st
+3lig
+lig4n
+li2gre
+li3ke
+li2kr
+lik2sp
+lik4ter
+li3l
+lil2a
+2lim
+li3m2a
+3limo
+li3n2a
+lin3al
+2l1indu
+li2nef
+li2neh
+li2nep
+li2nes
+2l1inf
+lings5
+2l1inh
+2l1in1it
+2l1inj
+lin2k1a
+link2s
+li2nol
+l2ins.
+l2insa
+l2insc
+2linsp
+2linst
+2l1int
+l1inv
+2linz
+li2o
+li4om
+li3os.
+li2p3a
+3lis.
+li3s2a
+li4schu
+4lish
+2l1isl
+2l1i4so
+li2sp
+liss2
+lit2a
+li2tal
+li3te
+lit2h
+lit1s2
+lit3sz
+li3tu
+3liu
+2lixi
+li2za
+lizei3
+4l1j
+2l1k
+lk1alp
+l3k2an
+l3kar.
+lken3t
+lk2l
+lk3lo
+l3k4lu
+lk4ne
+lkor2b1
+lk4ra
+l2k3ro
+l2k3ru
+lk2s1
+lk3sä
+lks3t
+lk4stä
+l3k2ü
+4l1l
+ll1abb
+ll1a2be
+l2labt
+ll1aff
+ll1akt
+l3l2al
+l2l1a2m
+ll3ama
+lla2n
+ll2anw
+ll1anz
+l3lap
+ll1arm
+ll1au
+ll3aug
+l2laus
+l2l1äm
+llb4
+llch4
+ll3d4
+ll1ech
+lle3en
+l2l1ef
+ll1eim
+ll2em
+l3len.
+lle4n3a
+ll3endu
+llen3g
+l4lents
+l3ler.
+lle2ra
+l4lerfo
+l6lergen
+l4lergo
+ll3ernt
+ll3ertr
+l2lerz
+ll2es
+l2lex
+llg4
+ll1imb
+ll1imp
+l2l1ind
+ll1ins
+llk4
+ll3l2
+ll5m
+lln2
+ll1ob
+l2lobe
+l2l1of
+ll1opf
+l2l1o2r
+l3lor.
+l3lore
+l2l1ou
+l3low
+l2löf
+ll1ö4se
+ll3sh
+ll3s2k
+ll2spr
+ll5t4
+llti2m
+llt5s2
+llu2f
+ll1ur
+llus5t6
+ll3z2
+2l1m
+l2m3a2b
+l2marc
+lm1aus
+lm1c
+lme2e
+lm3eins
+l2m1e2p
+l2m1erz
+lm1ind
+lm1ins
+l2möl
+lm3p
+lmpf4
+lms2t
+lm3ste
+lm3s2z
+lm3t
+4ln
+lna4r
+ln3are
+lnd2
+l3n4e
+l3ni
+l1nu
+l1nü
+1lo
+3l2ob.
+lo2ber
+2lobj
+2l1o2bl
+l2obr
+lob4ri
+l1o2fe
+lo1fl
+lof4r
+lo2gau
+lo3h2e
+2l1ohr
+loi4r
+3lok
+lo2k3r
+lol2a
+l1o2ly
+lo2min
+lo2n1o
+lo2o
+2lopf
+2lopt
+lo1ra
+lo4rä
+2lorc
+l1ord
+lo3ren
+2l1or3g2
+lo3ro
+3lorq
+3los.
+lo4sa
+3lose
+lo4ske
+lo2spe
+loss2e
+lo4ste
+los3t4r
+lo2ta
+lo3tha
+loti4o
+2l1ov
+lo2ve
+2lox
+1lö
+lö2b3
+2löd
+lö2f
+2l3öfe
+4lög
+l1öhr
+2l1ö4l3
+4löß
+2l1p
+l3pa
+lpe2n3
+lp2f
+l2p1ho
+lp3t4
+l3pu
+2l1q
+2l3r2
+lrat4s
+lre1s
+lrut4
+lrü1b
+4l1s
+l3sac
+l2s1a2d
+l3s2al
+l4s1amb
+l2sann
+l3sare
+l2sau
+l4schin
+l4schmü
+l2s1e2b
+l2s1ec
+l2s1em
+ls1ere
+ls1erg
+l2serh
+ls1erl
+l2s1ers
+l2s1erw
+l3sex
+l4sha
+lsho2
+l2s1imp
+ls2log
+ls3ohne
+l4s3ort.
+l3s2pi
+ls2po
+l2spro
+l3s2pu
+ls3s2
+lst2a
+lstab6
+ls4taf
+l4s3täti
+l2ste
+l3stec
+l3stei
+l3stel
+l4stem
+ls6terne
+ls6terns
+ls2tie
+l2stit
+ls4tr
+ls2tu
+ls1um
+l2sun
+lsu3s
+ls2zen
+4l1t
+l2tab
+ltag4
+lt1ak
+lt1a2m
+l4t3ame
+lt3and
+lt1ang
+l3tarb
+lt1art
+l2t3ato
+l2t1au
+lt1eh
+l2t1eis
+l4te4lem
+lt3eli
+lt2en
+l5ten.
+lter3a
+lt2erg
+lt4erö
+l4t1e4sk
+lte2th
+l2t1eu
+l2th
+l4thei
+lt3ho
+l3thu
+ltimo4
+l2tob
+l2t1of
+lt1op
+l2t1o2ri
+lto2w
+lt1öl
+l3tör
+lt1ös
+l4t3öt
+ltra3l
+l3trä
+lt3räu
+lt3re
+lt4rie
+lt3roc
+lt3ros
+l2t3rö
+l6ts
+lt3sc
+lt2so
+lt4stab
+lt4stoc
+ltt2
+lt1uh
+l2t1um
+ltu4ran
+ltu2ri
+l3tü
+lu1an
+4lu4b3
+luba2
+lubs2
+lu2dr
+lu2es
+1luf
+2l1ufe
+2luff
+luf2t1a
+luf2t1e
+luf2t5r
+lu2g1a
+lu2g1e2b
+lu4g3l
+lu2go
+lu2g3r
+lug3sa
+lug3sp
+lu2gu
+2l1uh
+lu1id.
+lu1is.
+lume2
+2lumf
+2luml
+l2ump
+l1ums
+l1umw
+1lu2n
+2l1una
+2l1unf
+lung4sc
+2l1uni
+2lunt
+2lunw
+4luo
+2lur
+l1urn
+l1urt
+2luse
+lu2sp
+lus4s3a
+lus2s1c
+luss3er
+lus6serf
+lus6serk
+lus6sers
+lus2s1o
+lus2s3p
+lus2s3t
+lus4stä
+lu4st
+lus4t1a
+lust3re
+lu2s1u
+lu2t1a
+lu2tä
+lu4teg
+lu4t3erg
+lut1o2f
+lu2top
+lu4t3r
+3lux
+2lüb
+5lüd
+lüh1l
+2l1v
+2l3w
+2lx
+1ly
+ly1ar
+ly3c
+2lymp
+3lyn
+ly3no
+ly1o
+ly3u
+2l1z
+l2z3ac
+l3z2an
+lz2erk
+lz1ind
+lzo2f
+l2zö
+lz3t2
+l2z1u4fe
+lz1w
+lz2wec
+1ma
+m1ab
+m2abe
+2mabk
+m2ab4r
+2mabs
+2mabt
+mach4tr
+ma2ci
+ma3da
+ma2d4r
+ma4d2s
+mae2
+ma1f
+ma2ge.
+ma2geb
+ma2gef
+ma2geg
+ma2gek
+ma2gep
+ma4ges.
+ma2get
+ma2gev
+ma2gew
+2m1agg
+magi5er.
+magi5ers
+ma3g4n
+2m1ago
+mai4se
+2m1akt
+mal1ak
+ma4lakt
+ma2lan
+ma4l3at
+ma2lau
+mal3d
+ma3ler
+mali1e
+mal3lo
+2mallt
+malu4
+ma2l3ut
+mam3m
+2m1anal
+ma2nau
+2manb
+man4ce.
+man3d2
+man3ers
+ma2net
+m2anf
+2m1angr
+m2anh
+2manl
+m4ann
+2mansa
+2mansä
+2mansc
+2mantw
+2manz
+ma2or
+m2app
+2marb
+mar3g2
+4ma3r2o
+maro3d
+4marr
+mar6schm
+mar6schr
+ma3r2u
+m1arz
+3mas
+ma3s2pa
+4m1aspe
+massen3
+mas4tel
+ma1s4tr
+3maß
+ma2ta2b
+ma2tan
+mat4c
+ma2tel
+ma4t3erd
+ma5tri
+mat3se
+mat3sp
+2m1au2f
+ma3un
+2mausg
+m4ay
+ma1yo
+3mä
+m1ähn
+mä1i2
+4m1änd
+m1ärg
+mä3t4r
+mäu2s1c
+2m1b2
+mbe2e
+mb4l
+m3b4r
+mby4
+2mc
+m3ch
+2m1d
+md1a
+m2d1ä
+m2dei
+mds2e
+m2d1um
+1me
+meb4
+m2e1c
+medi3
+medie4
+medien3
+2medy
+me1ef
+mee2n1
+mega1
+3meh
+2m1eif
+2m1eig
+m2eil
+mein4da
+me1i4so
+3meist
+me3lam
+3meld
+me2lek
+me2ler
+melet4
+2melf.
+mell2
+mel2se
+mel5t4
+6mel6tern
+2m1e2mi
+m2en.
+mena2b
+me3nal
+men3ar
+men3au
+men3gl
+me3nor
+m2ens
+men4sk
+men2so
+men3ta
+men6tanz
+2mentn
+4m3entwi
+me1o
+2meou
+2meö
+3mer.
+me1ra
+me2r3ap
+me4rens
+mer2er
+4m3ergän
+3merin
+merin4d
+merin4t
+me2ro
+3mers
+merz4en
+3mes
+mes1a
+me2sal
+me4sä
+4meser
+2me3sh
+4m1essa
+mes6serg
+mes2s1o
+mes2s1p
+mes2st
+meste2
+me1sto
+4mesu
+me3t2a
+me3th
+meu1
+2m1ex
+1mé
+2m1f4
+mfi4l
+4m1g2
+2m1h4
+1mi
+mi2ad
+mi3ak
+mibi1
+mi1c
+mi3da
+mie3dr
+mi2e1i
+mie3l
+mien3s
+mi2er
+mierer4
+mie2ro
+mi4et
+mie4ti
+3mig
+mi2kar
+mi2ki
+mi2ku
+3mil
+mi3l2a
+milch1
+mil4che
+mild4s
+4milz
+2m1imp
+minde4s
+min2en
+min2eu
+min2ga
+ming3s4
+mi3ni
+3min2o
+mi1nu
+3mir.
+mi3ra
+3miri
+3mirs
+3mirw
+mi2sa
+mi4scha
+mi4schn
+mi4schw
+mise1
+mis2s1c
+mi2s5te
+3mit
+mi2ta
+mi2th
+mi2t1r
+mit3s2
+mit5sa
+mi5tsu
+mi2t1u
+4mitz
+2m1j
+4m1k4
+m3ka
+mk5re.
+4m1l2
+ml3c
+ml3l
+ml3s
+2m1m
+m2mab
+m2m1ak
+m2m1al
+mm1ang
+m2m1ans
+mm1anz
+m2m1au
+mmd2
+mm1ei
+mme4lin
+mme4na
+m4mentw
+mme2ra2
+mme4rec
+mme2sa
+mm1inb
+mm1inf
+mm1inh
+mm1ins
+mm1int
+mmi3sc
+mmi1s4t
+mmm2
+mm3p
+mm2s
+mm3si
+mm3sp
+mm3sta
+mm3str
+m2mum
+mm2un
+mmül2
+mmüll1
+2m3n2
+m4nesi
+1mo
+moa3
+2mobj
+3m2od
+mode3s
+mo2dr
+4mog.
+mo2gal
+3moh
+mo2i3
+mo2k1l
+2mol.
+3mom
+mom2e
+3m2on
+mo3ne
+mo4n1er
+mon2s3
+mon3su
+3mo2o
+2m1ope
+2mopt
+mo1ra
+mo2rar
+2m1orc
+mor2d3a
+mor2dr
+mo2rer
+morgen5s6
+mork4
+3mos
+mos4ta
+moster4
+3mot
+m1o2x
+mo1y
+1mö
+mö2c
+4mök
+m1öl
+2m1p
+m2pf
+mp4f3erg
+mpf3erp
+mpf3err
+mp4f3erz
+mp2fl
+mpf3li
+mpf1or
+m3pon
+mp3ta
+m3pu
+2m1q
+2m3r2
+2m1s
+m2san
+ms3and
+m4sap
+ms1as
+m2sau
+m3sä
+m3sc
+msch2
+m4sco
+m3se
+m4s1ef
+ms1erw
+m4sex
+ms1ini
+mso2r
+ms1ori
+m2spä
+m2sped
+ms2po
+m2spot
+m2spro
+ms2pu
+ms3s2
+m4stag
+m3stel
+m3s2ti
+m3sto
+ms4tr
+ms5trä
+ms5tren
+m3s2tu
+ms4tü
+ms1um
+m2sü
+m3sy
+4m1t
+mt1ab
+mt1ak
+m3tam
+mt1ar
+mt3are
+mt1elt
+m2t1erf
+m4t1erg
+m2t1erl
+m2t1ers
+m2t1ert
+m4t1eta
+m2t1eu
+m2th
+mt3ho
+m2t1im
+m2t1ins
+mti2s
+mtmen2
+m3tö
+mt1ös
+m4ts1
+mt2sa
+mt2se
+mt3s2ka
+mt2spr
+mtt2
+mt1um
+mt1urt
+m3tü
+mt3z
+1mu
+mu1a
+mu3cke
+2m3uh
+mu3la
+2muls
+3mun
+mun2d1a
+4m3unf
+4m3ungeb
+mu3ni
+m4unk
+munt2
+4munz
+mu3ra
+mu4r1u2f
+m4us
+mu4s1a
+3musi
+mu2s1o
+mu2sp
+mus3t
+mu2su
+mut1au
+muts3
+mut2st
+1mü
+2müb
+mül4len
+3mün
+3müt
+mütter3
+2m1v
+mvoll1
+2m1w2
+mwa2
+mwa4r
+mwel4
+1my
+my4s
+2m1z
+1na
+3na.
+2n1ab
+na2bä
+4nabg
+4nabh
+na2bl
+n2abo
+na2br
+4n3abs
+4nabt
+3n2ac
+na2ch1
+na3chen
+nach3s
+nacht6ra
+4nadd
+n2ade
+4na2dr
+n1af
+na1f4r
+3n2ag
+na2gem
+3n2ah
+na2h1a
+n3ahn
+3nai
+nai2e
+n3aig
+n3air
+2n1ak
+na2ka
+3nako
+n2al.
+na2l1a2
+na2lä
+3n2ald
+n4ale
+na4lent
+na2let
+nal3la
+nalmo2
+na2lop
+nal2ph
+n2als.
+nal3t4
+na2lu
+2naly
+n4am.
+3name
+n4amen
+4n3a2mer
+na3m4n
+3namo
+2n1amt
+namt4s
+n1an.
+4n1a2na
+4nanb
+n1and2
+4n1ang
+2nanh
+2nani
+4nank
+2nanl
+3nann
+na3no
+n1anp
+2nanr
+2n1ans
+2nantr
+2nanw
+nap2si
+n1ar
+5nar.
+na2r1a
+2narc
+n2ard
+4narg
+3nari
+n2ark
+n2arle
+2narm
+n2arp
+4n3art
+na3r2u
+3nas
+n2as.
+na4schw
+4nasp
+4n1a2sy
+nasyl2
+3nat
+n4ata
+na3t4h
+4natm
+nats1
+nat4sa
+nat4sc
+4natt
+n1au
+4nauf
+nauf4fr
+n3aug
+5naui
+3n2aul
+4nausb
+4nausg
+n2auso
+4nauss
+n4auste
+4nausw
+navi5er.
+navi5ers
+1nä
+3n2äc
+3näe
+n1ähn
+2n1ä2m
+2n1än
+när4s5
+3näs
+nä2sc
+n2äss
+2näu
+3nä1um
+2n3b4
+nbe2in
+nbe3n
+nbe3r2e
+nbes4
+nbu2s
+nby4
+2n1c
+n3ce2n3
+nch3m
+n2ck
+2n1d
+nd2ag
+n2d1ak
+n2danl
+nd1ann
+n2d1anz
+ndat2
+nd1au
+nd1c
+nde4al.
+n2dei
+nde4län
+n4d3ents
+nde4rob
+nder5ste
+nde2se
+ndi2a3
+n2dob
+ndo2be
+ndo1c
+nd1op
+nd1or
+n2dö
+n2d3rat
+n2d3re
+n2drob
+nd3rol
+nd3ros
+n2drö
+n2drui
+n4d3run
+nd2sor
+nd2spr
+nd4stab
+nds3tau
+nd3th
+ndt4r
+n2dü4
+ndy3
+1ne
+3ne.
+ne2ap
+ne3as
+ne3at
+ne2bl
+2n1ebn
+2nec
+3neca
+ne1ck
+3ned
+ne2de
+2nee3
+ne2e2i4
+ne3ein
+n1ef
+neg4
+2ne2he.
+3nehm
+4n1ehr
+2n1ei
+n2eid
+4neif
+3neigt
+4n3eing
+4n3eink
+ne2ke
+nek3t4
+ne2l
+3nela
+nel3b
+2n1ele
+4nelek
+4nelem
+ne3len
+ne3li
+nel4la
+3ne3l2o
+3ne3lu
+n2em.
+2n1emb
+n1e2mi
+2n3emp
+2n1ems
+3nen
+n4en.
+nen3a2
+n2enb
+n2enc
+4n1endb
+4n1endd
+4n1endf
+n1endg
+4n1endh
+4n1endk
+4n1endp
+4n1endt
+4n1endw
+ne2n1e2b
+nen3ei
+nenen1
+ne4nene
+4nengb
+nen4ge.
+nen4gen
+4nengs
+4nengt
+n2enh
+ne2ni
+n2enj
+nen3k
+ne2no
+n2ens
+nens4e
+nen3sk
+5n2en3t2a
+n1entb
+4n1entl
+4nentn
+5nentr
+n1ents
+4n3entw
+4nentz
+ne2n3u
+n2env
+n2enw
+ne2ob
+ne1os
+2nepf
+2n1epo
+ne2pos
+n2er.
+ne1ra
+ne2ra2b
+ne3r4al
+ne2r3am
+ne2ran
+ne2rap
+ne2rau
+4nerbe.
+4nerben
+n1erbi
+nere2
+ne2reb
+n1erf
+4n5erfo
+nerfor4
+2nerfü
+3nergr
+n1erh
+2n3erhö
+3neri
+n1erk
+n2erli
+2n1erlö
+n1ermä
+ner4mit
+n2ern.
+4n1ernt
+ne2ro
+ne1rös
+n2erp
+3n2ers.
+2n3ersa
+ner8schle
+n2ert.
+n1ertr
+ne2rup
+n2erv
+2n1erz
+3n2es
+n4es.
+ne3san
+nes4c
+nesi1e
+ne3ska
+nes1o
+ne2s1p
+4n3essi
+ne1sta
+nes3ti
+ne2tad
+ne2t1ak
+ne2t1an
+ne2tap
+n1etat
+ne2tau
+ne2th
+net3ha
+nett4sc
+n1e2tu
+net2zi
+ne2u
+neu1c
+neu3g
+2n1eup
+n2ew
+2n1ex
+3nez
+1né
+2n1f
+nf1ak
+nfalt4
+nf2ä
+nff4
+n3fi
+nfi4le.
+nf4l
+nf5lin
+nf2o
+nfo1s
+nf4r
+nf3s
+nft2o
+nft4s3
+n2f1u
+4n1g
+ng2abs
+n2g1ac
+ng1ad
+n2g1ak
+n2g3a2m
+n2g1and
+ng2anf
+ng1anz
+n2g1äl
+ng3d4
+n3gef
+n2g1ein
+ng2en
+ngen2a
+n3ger
+nge4ram
+n4g3erse
+nge4zän
+ng3g4
+ng3hu
+n2g1i2d
+n3gläs
+n2glic
+n2glo
+n3g2loc
+n2glö
+ng3m
+n2gn
+ng3ne
+ng1or
+ng3rat
+ng3roc
+ngs3c
+ng4s3e4h
+ngs3pa
+ngs5tri
+ng3ts
+n2gum
+2n1h4
+n3han
+n3har
+n3hau
+n3hä
+n3he
+nhe2r
+n3hu
+1ni
+3nia
+nib4l
+nich1s
+nich8ters
+n1id
+ni2de
+ni3de.
+ni3dr
+n4ie
+nie3b
+ni1el
+nie3l2a
+nie4n3
+ni3ene
+ni1ero
+nifes3
+nig2a
+2n3i2gel
+nig3r
+ni2gre
+nig4sp
+3nik
+ni2kal
+ni2kar
+ni3ker
+ni4k3ing
+ni3kl
+ni2kr
+3n2il
+nim2o
+4n1imp
+nin1
+3n2in.
+n2in4a
+4n3ind
+2ninf
+3n2ing4
+4n1inh
+ni2nor
+2n1ins
+n2ins.
+4ninse
+4n1int
+2n1inv
+ni2ob
+ni3ok
+ni3ol
+n2ip
+ni3ra
+3n2is
+ni4schw
+ni2s1e
+ni2s1p
+ni3spi
+nis3s4
+ni2s1u
+2nit
+ni2ti
+ni3t4r
+nit4s
+ni3tsc
+nitts1
+nitt4sa
+ni3tu
+ni3v
+3nix
+n1j
+2n1k
+n2k3ad
+n2k1ak
+n3k2al
+n4k3alg
+nk2am
+n2kans
+n2kaus
+n2käh
+n2k1är
+nke2c
+n4k3erfa
+nk4erg
+nk1inh
+n2k1ins
+nk3len
+nk3les
+n2klie
+nk2lo
+nk2lu
+nk3lun
+nk4na
+n2kne
+n2k1ort
+nk2öf
+n2köl
+n2k3ro
+nk2s1al
+nks2ei
+nk3s2z
+nk2tak
+nk2tan
+nkt1it
+nk4top
+nk2tru
+2n3l2
+2n1m4
+nmen2s
+4n1n
+nna2be
+n2nada
+n4n1all
+n2n1an
+n2nau
+nnen3g
+n4nents
+nn2erh
+nn2erk
+nne2rö
+n4n3er4wa
+nner2z
+nne2s
+nnes1e
+nne4st
+nn2ex
+nn3f
+nng4
+n3ni
+n2nof
+nn1o2r
+nn3sc
+nn3se
+nn3s2p
+nn2th
+n2n1uf
+n2n1unf
+nn1ur
+1no
+3no.
+3nobl
+no2bla
+n2o3ble
+2n1ob2s
+no1c
+2no2d
+no3dr
+n1of
+2n3o2fe
+n3ole
+no2leu
+n2on.
+3n2opa
+3nor.
+nor2a
+no2rad
+no1rak
+no3ral
+2norc
+nor2d5r
+3norh
+3norm
+3nors
+n1ort
+3n2os.
+no3sh
+no2sp
+n2oste
+nost1r
+2nostv
+no3tab
+no2tä
+no4t3ei
+no2tel
+no3t3h
+no4tha
+no2t3in
+no2t1op
+no2tr
+3nov
+3now
+2n1o2x
+3noz
+2nöd
+2nö2f
+4n1ö4l
+2n3p4
+npa2g
+npro1
+npsy3
+2n1q
+2n3r2
+nräu3s
+nre3sz
+nrö2s1
+6n1s
+n2s1a2d
+n2s1all
+n2sang
+n2sant
+n2saus
+n3sav
+n2s1än
+n2s1äus
+ns2ca
+n6schef
+n4schro
+nsch7werd
+ns1eb
+ns1e2d
+nseh5ere
+nsen4sp
+ns1ent
+n2s1ep
+ns1erf
+ns1erg
+n2serh
+n2s1erk
+n2s1erö
+ns1ers
+n2s1erw
+n2s1erz
+nse2t
+n4s1eta
+n3sex
+nsfi4l
+nsho2f
+n3sil
+n2simp
+n2s1ini
+nsi4te
+nsi2tr
+ns2kal
+n2s1op
+n4s3ort.
+nsp4
+n2spat
+n2sph
+n3s2pi
+ns4pie
+n2spo
+ns3pon
+n2sprä
+n4s3prie
+n4spro
+nsrü2
+ns3s2
+nst1ak
+n3star
+n3stat
+n4stat.
+n4s3tate
+nst3eif
+n3stemm
+ns4tent
+ns6terbe
+n5s6terne
+n5s6terns
+nst4erö
+ns2ti
+nst5opfe
+ns4tor
+n4strac
+n4strie
+ns2tu
+nst2ü
+nstü1b
+n2sty
+ns2um
+n2s1un
+ns2ung
+ns4unr
+ns4uns
+n3sy
+n4s3zi
+2n1t
+nt3abs
+n3t2a3c
+n3t2al
+nta3m
+nt1ang
+n4tanza
+nt2arb
+nt1ark
+nt2arm
+nt4at
+nt1äm
+n2t1äu
+nte3au
+nte2b
+nt1ebe
+nte1e
+nte3g6
+nt1eh
+n2teig
+nt2en
+nt4ene
+nten6te.
+n3ter
+nt4ern
+nt4ers
+nt4ert
+n4t1ess
+nteu3
+nte3v
+nt2her
+n2t3ho
+n3thr
+n3t4hu
+nti3c
+nti3k4l
+n2tinf
+n2t1inh
+ntini1
+nt2ins
+n3ti1t
+ntmen2
+ntmo2
+n3to
+nto3me
+nton2s1
+n3tö
+nt3rec
+nt3reif
+n5trep
+nt4rig
+n5trop
+n2t3rü
+n4ts
+nt3sa
+nt4sau
+nts2o
+nts2p
+nt4s3par
+nts2t
+nt2sto
+n3tu
+3n4tu.
+ntum4
+ntu2ra
+ntu4re.
+ntu4res
+n3tü
+nt3z2
+1nu.
+1nu1a
+nu3ar
+nubi1
+1nu1c
+1nud
+3nue
+nu2es
+nuf2
+nu2fe
+1nug
+2n1uh
+1nui
+nu3k4
+n2um.
+2n3umb
+2numf
+2numg
+3numm
+2numr
+2n1ums
+2n3umz
+nu2n
+2nuna
+1n2ung4
+3nung.
+n3ungl
+2n1uni
+2nunt
+1nuo
+2nup
+2nur
+3nu2s
+nu3sc
+nu3se
+nu3sl
+1nut
+nu2ta
+nu4t3r
+1nuu
+1nux
+1nuz
+3nü.
+2nü4b
+nür1c
+3nüs
+1nüt
+2n1v2
+n3ver
+4n1w
+1ny.
+1nyh
+2nymu
+n1yo
+1nyr
+1nys
+1nyw
+2n1z
+n2zad
+n2z1a4g
+n2zan
+n2z1au
+n2z1än
+n2zär
+nzdi1s
+nz1ec
+n4zense
+n4zentw
+n4zentz
+nz3erwe
+nzi2ga
+nzig4s
+nz1ini
+n2zor
+nz2öl
+nz3s
+n2zurk
+n2z1wa
+n2z1wä
+n2zwö
+n2z1wu
+ño1
+2o3a2
+o4abi
+o4ac
+oa3che
+oa3chi
+o4ad
+oa3de
+oa4g
+o4ah
+o4a3i
+oa3ke
+oa4k1l
+o4a3la
+o4a3mi
+oanne4
+o2ar
+o2as
+3oa3se
+o4at
+o5au
+o1b
+ob2al
+2oban
+o3bar
+2o3b2ä
+2obb
+ob2e
+2obe.
+2obea
+ob3ein
+2o3b4en
+oben3d4
+oben3se
+ober3in4
+obe4ris
+2obew
+2o3b2i
+obi4t
+ob3ite
+1obj
+ob1l
+o2b3li
+2o3blo
+2o3bo
+o2b3re
+o3bri
+ob3s2h
+ob3sk
+obs2p
+ob2sta
+2o3bu
+obu2s
+2o3bü
+2oby4
+2oc
+o3ca
+oc1c
+o1ce
+och1a
+ocha2b
+o1che
+oche4b
+o2ch1ec
+och1ei
+ocher4k
+och3l
+och3m
+och1o
+och3ö2
+och3r
+och1s
+ocht2
+och3te
+o1chu
+ochu2f
+och1w
+o1ci
+o1ck
+o2ckar
+o3cke
+ock2er
+o3cki
+o2cko
+ock3sz
+o1cl
+o1ç
+o1d
+o3d2a
+od2dr
+o3deb
+o3d2e1i
+odein3
+ode2n1
+odene4
+ode3sp
+o3dex
+2o3dia
+o3dir
+o3div
+o2don
+odo4s
+2odr
+o2dre
+odt4
+2o3du
+2o1e2
+o2ec
+oen1
+o4e3s
+o2e3t
+o3et.
+o3ets
+o1ë
+2ofa
+of1a2c
+of1am
+of1au
+o2f1ei
+of2en
+o3fer
+of2f1a
+of2f1in
+1offiz
+of2f5l
+of2f3r
+offs2
+of2fu
+2ofi
+of3l
+of1la
+of4lä
+of4lö
+2ofo
+2o1f1r
+of3ra
+of3rä
+of4rü
+ofs1a
+of4sam
+of2spe
+of2spr
+of2s1u
+2oft
+of2tei
+of3th
+2o1g
+o2g1ab
+oga3d
+og1ala
+og1ang
+o2g1ei
+oge2l1i
+o3gh
+ogi2er
+og2lo
+o3g4n
+ogs2
+og3sp
+og1ste
+o1ha
+o1hä
+o1he
+o2h1eis
+ohen3s
+o2h1ert
+o2h1erz
+o1hi
+ohl1a
+ohl3au
+oh3lec
+ohl1ei
+oh3lem
+oh3len
+oh3lep
+oh4lerg
+oh4l3erh
+oh4lerw
+oh3lo
+ohls2e
+oh2lu
+3ohng
+oh2ni
+1ohnm
+oh2n1o
+o1ho
+oho2la
+oh1o2p
+o2h3ö
+ohr1a
+oh4rin
+oh1ro
+oh1s
+oh3t
+o1hu
+oh1w
+2o1hy
+2oi
+o1i2d
+o3ie
+o1im
+oimmu4
+o1in
+oi2r
+o2isc
+o3isch.
+o1ism
+oiss2
+oi1th
+2o1j
+2o1k
+oka2la
+okale4
+3o2kel
+oki2o
+ok1lä
+ok4n
+4okr
+ok2s1p
+okt4
+2ol
+o1la
+o2lab
+o2l1ak
+ol2ar
+olars2
+ol1auf
+o1lä
+ol4dam
+ol4dr
+ole3e
+ol1eie
+ol1eis
+oler2
+ole3s
+ol1ex
+o1lé
+ol2fa
+ol2fl
+olf1r
+ol2fra
+ol2gl
+ol2gr
+ol2i
+oli3k4
+ol2kl
+olk3r
+ol2kre
+ol2lak
+ol2l3au
+oll1e2c
+ol2l1ei
+ol2lel
+oll5ends
+ol4lerk
+oll5erwe
+o3lo
+ol2of
+olo3p2
+ol1ort
+ol2str
+o1lu
+3oly
+1olym
+ol2z1a
+ol4z3ern
+ol2zin
+ol2zw
+2om
+o2mab
+oma4ner
+om2anw
+om1art
+o2m1au
+o2meb
+ome3c
+o2m1ei
+o3m2eis
+o2mel
+o3men.
+o2mep
+o2meru
+om1erz
+om2es
+omiet1
+o2m1ind
+om1ing
+o2m1int
+om3ma
+om1org
+om3pf
+oms2
+omtu3
+o4munt
+omy1
+2ona
+ona2b
+o2nae
+o3nal
+on1ap
+o2narb
+on2au
+on3aus
+2onä
+onbe3
+2onc
+onderer5
+2one
+one2i
+one2n3
+onens2
+o2n1erb
+o2n1erd
+on1erg
+on1erö
+o3nett
+on3f2
+on3g2l
+ong4r
+ong3s
+4o3ni
+on2i3d
+o4nikr
+o4n1im
+on3ing
+on3k2
+onli4
+onlo2c
+on3n2an
+on3n2e
+ono1
+o3nod
+o2noke
+on1orc
+ono3s
+ons1a
+onsa4g
+on4sam
+on2seb
+onse2l
+onsi2
+ons3l
+ons1p
+onst2h
+on3t2a
+ont3ant
+on4t3end
+ont3erw
+ont2h
+on4t3ri
+ont3s
+o1nu
+2onuk
+on3v
+1ony
+on3z
+o1ñ
+oof2
+oo2k3l
+o1op
+o1or
+oor3f
+oo4sk
+oo2tr
+2o1ö2
+o1pa
+opab4
+o2p3ad
+op3akt
+opa5s
+o1pec
+o1pei
+o1pe4n
+2opf.
+op2f3a
+op3fah
+o2pfe
+op4ferd
+opf5erde
+opf1l
+opf3la
+op1flü
+4oph2
+o3phe
+o1pi
+opi5a4
+opi3er.
+opi5ers.
+opin2
+op5lag
+o2p3le
+op3li
+2o3po
+op4pl
+op2pr
+2o1pr
+1opsi
+op3sz
+1op3t4
+o1q
+2or.
+or1a
+or3a2b
+o1rad
+2orak
+2oral
+o2r3alm
+or4alt
+3oram
+or2and
+o2ranh
+or3arb
+o1ras
+or3att
+o3rä
+or1änd
+or1ät
+or2bar
+orb2l
+or1c
+2orca
+or2ce
+4orda
+or2d3am
+or2dau
+or4d3eng
+or2deu
+or2d1ir
+or2dit
+1ordn
+or2do
+2ordr
+2ords
+ord3s2t
+or2dum
+2ordw
+4ore
+ore4as
+o2r1e2ck
+o2r1ef
+ore2h
+or1eig
+o2rein
+or1er
+o2rerf
+or1eth
+2orf
+or2fle
+orf3s4
+or3ga
+2orget
+or3g2h
+2orgia
+orgi1e
+or2gl
+or3gle
+or2gn
+2orh
+2o3ric
+o4rient
+o3rier
+4oril
+4orin1
+2orit
+ork2a
+or2k3ar
+ork2s
+2orm
+or4mans
+or4ment
+or5ne.
+or3n2o1
+2o1ro
+oro3n2a
+2o1rö
+2orq
+2orr
+orr4a
+or3rh
+2ors2
+or3s4a
+orsch5li
+or3sh
+or3sz
+or2t1ak
+or4t1an
+or2t1au
+or2tär
+or2tef
+ort3eig
+or4t3ent
+or4t3ere
+ort3erf
+or2t3ev
+or2the
+ort3ins
+or4t3off
+or2tor
+or4tö
+or4trau
+or4t3räu
+ort3re
+ort3ric
+or2t1um
+o3ru
+or2uf
+o4r3un
+o2r3ü
+o2rya
+2o3s2a
+os3ad
+os4an
+osa1s
+o3sche
+os4co
+2o3se
+ose3e
+o2s1ei
+ose2n
+o4sents
+2osh
+o3s2hi
+o3sho
+2osi
+o3sk
+o4ska
+os3ke
+o4ski
+2os2kl
+2os2ko
+os2lo
+2oso
+2os1p
+o2s3per
+o3s2po
+os2sa
+oss3and
+os4sä
+os2sei
+os4s3en4k
+os4s3enz
+os2s3o
+os4son
+os2s3p
+os2s3t
+ost1a
+osta2b
+os4t3am
+os3tarr
+ost4art
+os4ta4s
+os4tei
+oster3e
+os6t5er6we
+os2t3h
+os3til
+os3to
+os4t1ob
+ost3ran
+ost3rä
+ost3re
+ost3rot
+ost3uf
+2osu4
+2o3sy
+o3s2ze
+o2ß1el
+o2ß1en2k
+o2ß1enz
+o2ß1ere
+o2ß1erf
+2o1t
+ota2go
+o5tark
+o2t1au
+ot3aug
+o2teb
+o3t2e1i
+otei4n
+ote2l1a
+ote4lei
+ot4em3
+otemp2
+o2t1erw
+ote2s
+4ot2h
+ot4he
+ot5hel
+o4t3hi
+ot3hos
+o2thr
+o2t1i2m
+ot2in
+otli2
+ot4ol
+ot1opf
+ot2or
+oto2ra
+oto1s
+o3tra
+o2t3re
+ot3rin
+ot2sa
+ot3sc
+ots1p
+ot4spa
+ots2pe
+ot2spr
+ot4terk
+ot2th
+ot2t3r
+ot4tri
+o3tü
+o2u
+oub4
+ou2ce
+ou1f4l
+oug2
+ou2ge
+ou3gl
+o3uh
+ou4le.
+o3um
+o3unds
+oun4ge.
+2our
+ouri4
+our4ne.
+ou3s2i
+outu4
+2ouv
+2o1ü
+o1v
+ove3s
+2ovi
+oviso3
+2ovo
+2o1w
+o3wec
+owe2r1
+o3wi
+o1x
+ox2a
+ox2e
+1o2xid
+ox3l
+o2xu
+1oxy
+o1y2en
+o1yo
+oy1s4
+2o1z
+oz2e
+ozen4ta
+o3zi
+ozon1
+órd2
+ö1b
+öbe2la
+öbe4li
+öb2l
+ö2ble
+ö2b3r
+öb2s3
+2ö1c
+öch1l
+ö2chr
+öch2s
+öchs4tu
+öcht4
+ö1d
+ödi3
+öd2st
+ö1e
+1öf
+öf2fl
+öf3l
+ögen2s1
+ög3l
+ög3r
+ö1he
+öh3l2e
+öh3ri
+ö1hu
+ö3ig.
+ö1ke
+ö2ko3
+ök3r
+3öl.
+öl1a2
+öl1ei
+öl1em
+öl4en
+öl2f1ei
+öl1im
+öl1in
+öl2k3l
+öl3la
+öl2nar
+öl1o2
+öls2
+öl3sa
+öl3sz
+ö2l1u
+öl2ung
+ölz2w
+öm2s
+2ön
+ön2e
+ö3ni
+önn2e
+ön2s
+ön3sc
+ön3sp
+ö1nu
+öo1
+ö1pe
+öpf3l
+öp4s3t
+ör3a2
+ör1c
+ör2dr
+ö2r3ec
+ö2r1ei
+ö2r1e2l
+ör2erg
+ö2rerl
+ö3r2erz
+ör2f3l
+ör2gl
+ö2r1im
+ör2kl
+örner2
+ör1o2
+örs2e
+ör3s2k
+ört2e
+ör2tr
+öru4
+ö2r1une
+ö2sa
+ö2scha
+ö4sch3ei
+ö2schl
+ö2sch3m
+ö2schw
+ö2s1ei
+ö2sp
+ös2s1c
+ös2st
+ö2st
+ös3te
+ös2th
+ös3tr
+ö3su
+ö1ß
+2ö1t
+ö2t3a
+öte4n3
+öt2h
+öts2
+öt2sc
+öt2tr
+ö1v
+ö1w
+ö1z
+öze3
+özes4
+p2a
+1pa.
+1paa
+1pac
+pa3da
+pa2dr
+pa2el
+pa1f4r
+pag4
+pa3gh
+pa1ho
+1pak
+pa1k4l
+pak2to
+1pala
+pala3t
+1palä
+pa3li
+2palt
+pa2nar
+pa3nei
+pa2neu
+pan3k4
+2panl
+3pa2no
+pan3sl
+pant2
+3panz4
+1pap
+papi2
+papieren8
+papie8r7end
+3para
+pa2r3af
+par3akt
+1parc
+pa5reg
+pa5rek
+2par2er
+2parg
+pargel6d
+1park.
+par4kam
+par4kau
+par2kl
+par2kr
+1paro
+2parp
+1partn
+1party
+par3z2
+pa3s2p
+pa4st
+2paß
+1pat
+pat4c
+pat4e2
+pa5t4r
+1pau
+p3auf
+pa3uni
+1pä
+3pä2c
+pä3cke
+3päd
+3pär
+3päs
+pä4t1e2h
+pä4t3ent
+pä2t3h
+pä2to
+pät3s4
+2p1b
+2p3c
+2p1d2
+pda4
+p2e
+1pe.
+pe2a
+pea4r
+pech1
+1ped
+pe2en
+pef4
+pei1
+2peic
+pe1im
+pekt4s
+2peku
+1pel
+pe2l3a4
+pel3d
+pe2let
+pe2lex
+pe3li4n
+pe4l3ink
+pell2a
+pell4e
+1pem
+pena4
+pe3n2al
+pen3da
+pe4nen
+1penn
+pe2n1o
+3pensi
+1pensu
+pen3z2
+1pep
+pe1ra
+per2an
+pere2
+1perl
+per4na
+3pero
+pe2rob
+per2r1a
+5pers
+perwa4
+pe3sa
+pes3s2
+pe2st
+3pet
+1pé
+4pf.
+p2fab
+p2fad
+p2faf
+pf3ai
+p2f1ak
+pf1ans
+p2fa4r
+pf3are
+p2f1au
+4p3fe.
+p2fei
+pf1eim
+pf1ein
+p3fen.
+p2fent
+p3fer.
+pf2erw
+p3f2es
+pff4
+p2f1in3s
+p2f3lä
+pf3lei
+pf3lie
+pf3lo
+pf3lu
+p2for
+pf3r
+pf1ra
+2pfs2
+pf3sl
+pf3sz
+2pf3t
+2p1g
+pgra2
+1ph
+4ph.
+ph2a
+2phä
+2phb
+4phd
+2p1hei
+phen3d
+phen3s
+2ph1ers
+2phf
+4phg
+phi2ka
+4phk
+ph2l
+2phm
+2phn
+p3hop
+2phö
+ph4r
+2phs
+ph3t2
+2phthe
+phu4s
+2p1hü
+2phz
+pi2a3
+pias4
+pi3as.
+pi3chl
+p4id2
+piegelei8en
+pi2el
+piela2
+3pier
+3pik
+1pil
+pi3le
+pil4zer
+pin2e
+pingen4
+ping3s
+3pinse
+pi2o
+pi3oi
+pi3onu
+3pip
+pi2pe
+pi3ri
+3pirin
+3pis
+4piso
+pi3t2a
+pi1th
+pit2s
+pi2z1in
+p1j
+2p1k2
+pku2
+pkur1
+1p2l4
+2pl.
+3p4la
+p5la.
+p5lad
+plan3g
+3plä
+2ple.
+ple1c
+p4leg
+p4lem
+3ple5n4
+2plig
+p4lik
+p4liz
+p4lo
+2p3lu
+2p1m2
+2p1n
+1p2o
+po3b4
+po1c
+3pod
+2p3oh
+po2i
+po3id
+3poin
+3pok
+3p4ol
+po2lau
+po3li
+po4lor
+2pond
+po1o2b
+po2p3ak
+po2p3ar
+po1pe
+po2pl
+po3pt
+po1ral
+po1rau
+2porn
+por3s
+por4tin
+por4tre
+por6tri
+pos2e
+po4sta
+pos4t3ag
+po4stä
+po2s3te
+post3ei
+po2sto
+pos6tr
+post3ra
+po3ta
+3pote
+po2t1u
+po2w
+po3x
+pö2bl
+pö2c
+2p1p
+p2p3a2b
+pp3anl
+ppe4ler
+ppe2n1
+p2p1f4
+p2p1h
+p3p2ho
+pp3l
+pp5lan
+pp1lä
+p2ple
+p2p3ra
+p2p3re
+p2pri
+pp3sa
+ppt2
+p2r2
+1prak
+1prax
+p4rä
+1präd
+1präg
+3präm
+3präs
+2pre.
+2prec
+1pred
+pre2e1
+1prei
+3preis
+2p3rer
+3p4res
+pri4e
+2prig
+1prinz
+1p4ro
+3prob
+2proc
+3prod
+3prog
+3proj
+2pross
+pro1st
+3prot
+1prüf
+2prün
+2p1s
+4ps.
+ps4an
+p3se
+p3s2h
+ps1id
+p2sö
+ps2po
+p2st
+p3sta
+p3stea
+p3stel
+p3s2ti
+pst3r
+ps2tu
+p3stü
+3p2sy
+ps2ze
+2p1t
+pt1a
+pt2ab
+pt3alb
+pt3at
+p3te
+p4t3ec
+p4t1ei
+pte4l
+p4tele
+p4t1ent
+pt3erei
+p4t1erw
+p4t1erz
+p2th
+pt1in1
+pto3me
+p4tos
+pto2w
+p2t3r
+pt3s2
+ptt2
+pt1um
+pt1urs
+ptü4
+3p2ty
+pt3z
+1pu
+pu1a
+pub4
+2puc
+pu2dr
+2p1uh
+pul2sp
+2pund
+pun2s
+2punt
+2pur
+pu2s3t
+3put
+put2s
+1püf
+2pül
+pün2
+2p1v
+2p1w
+pwa4r
+3py1
+pys4
+py3t
+2p1z
+qu4
+1queu
+1ra.
+ra2ab
+2r3aac
+r3aal
+ra3ar
+r1ab
+ra2bar
+rab2bl
+2rabd
+r2aber
+2rabf
+2rabg
+1r4abi
+ra2br
+2rabs
+2rabt
+2r3abw
+1raby
+ra1ce
+2r1acet
+ra4cheb
+ra4chin
+racht3r
+rach6trä
+ra2chu
+r2ack
+r2ad
+r4ad.
+rada2
+ra2dam
+2radap
+3radf
+3radl
+r3a2d3r
+rad5t
+1rae
+r2af
+raf3ar
+ra2fer
+ra3ge
+ra3gle
+ra2gn
+3r2ahm
+4raht
+2raic
+rail4l
+2r3air
+1rake
+3ra1k4l
+ra2kre
+ra2kro
+2rakti
+3rakü
+r2al
+r4al.
+ra2la2
+ral3ab
+rala4g
+r3alar
+ral3b
+3r4ald
+ra3le
+2ralg
+r4ali
+rali5er.
+rali5ers
+ralk2
+ral3la
+rall2e
+2rallg
+2r3alm.
+r3alp.
+2ralpe
+r4als
+r3al3t
+r4alt2h
+ra2lu
+3raly
+rama3s
+ra2mer
+1r2ami
+r2amm
+ram4man
+ram6m5ers
+ram4m3u
+ram2p3l
+2r1amt
+ramt4s
+r2an.
+4ranc
+r4anda
+r4ande
+ran4dep
+ran4d3er
+rand3s
+4r3anei
+r4aner
+2ranf
+1rangi
+rani1e
+ran2kr
+2ranl
+2r1anm
+2r1anp
+2ranr
+r2ans.
+r2ansp
+ran4spa
+2rantr
+2r3anw
+r2ap
+2rapf
+r1ar
+r2ara
+2rarb
+3rarei
+rar3f4
+ra2r1in
+r2ark
+r2arp
+2r3arz
+r2as
+r4as.
+ras2a
+ra4schl
+2r3asph
+2raß
+1rat
+r4at.
+ra2t1a
+r3atl
+rat4r
+rat2st
+2r3atta
+4rau.
+3raub.
+4raud
+rau3e2n
+2rauf
+2raug
+3raum
+rau4m3ag
+rau4man
+rau2mi
+3rausc
+2rausg
+rau2sp
+2raus5s
+raut5s
+1raü
+r2ax
+3r2äd
+4räf
+4räg
+2räh
+2räm
+3rän.
+3räni
+3räns
+2r1är
+r2är.
+rä3ra
+rä2s1c
+3rätse
+rä2u
+räu2s
+räu5sche
+4räut
+2r1b
+r2b1ab
+r2b1a2de
+r2bak
+rbal3a
+rba3re
+rb1art
+rb1auf
+rbb2
+rb1ech
+r4belä
+rb1ent
+rbe3r2e
+r3b2la
+rbla2d
+r8blasser
+r4b3last
+r3blä
+r2ble.
+rb3ler
+rb2lin
+rb2lö
+rb2o
+rb4ri
+rb2s
+rb3se
+rb4sei
+rb3ska
+rbs1o
+rb3sp
+rb4stä
+rb3str
+rb2u
+rby4t
+2rc
+r1ce
+r1che.
+r1chen
+r1chi
+rch3l
+rch3m
+rch3r
+rch1s2
+rch3sp
+rchst4r
+rch3ta
+rch6terw
+rch1w
+r1ci
+r2ck1
+r1cl
+r1ç
+2r1d
+r3d2ac
+r2daf
+r2d1ak
+r2d1al
+rd2am
+rdani1
+rd1ant
+rd1anz
+r4dap
+r2dei
+rd2ei.
+r2d1elb
+r3den
+rden3d
+rden4gl
+rde3re
+rder4er
+rderin6s
+r4d3ernt
+rde3sp
+rdi3a2
+rdia4l
+r2d1inn
+rd1it
+rdo2be
+r3don
+rd1os
+r2dö
+rd3rat
+rd4ri
+rdt4
+rd3ta
+rd3th
+rdwa4
+1re
+3re.
+re3aler
+re2alt
+re2am
+re3as
+re3at.
+re3ats
+2reä
+re2b1a
+re2b1l
+reb1r
+reb3ra
+re2bü
+r2ech
+rech3ar
+4rechs
+2reck.
+2recki
+4redd
+2redit
+re1el
+re1er
+3refe
+4reff
+3refl
+3refo
+3reg
+5reg.
+rege4l3ä
+re2hac
+re4h3ent
+re2h1i
+rehl4
+re2h1o
+r2ei.
+rei4bl
+r2eie
+2reig
+3reigew
+rei3l2a
+rei3l2i
+reim2p
+r1ein
+rei3nec
+4reing
+r3eink
+4reinr
+rein8s7tre
+re1in2v
+reister6
+3rek
+4re2ke
+re3la
+2r1elb
+rel2e
+re3lei
+2re2lek
+2r1elf
+re3lo
+2r1elt
+relu2
+r4em.
+r2emi
+4rempf
+4remu
+r4en.
+r2ena
+rena2b
+re3nal
+re2nä
+3rendi
+ren3dr
+re4n3end
+ren4gl
+2rengp
+re2ni
+r1ense
+2r1entl
+2r1ents
+2rentw
+4r3entz
+r2enz
+re3or
+3repe
+3repo
+4repp
+3r4er.
+2r1erb
+r2erbr
+2r1erd
+r1erf
+r1erg
+r4ergen
+r1erk
+4r3erken
+r2erki
+r1erl
+4r3erlau
+2rerlö
+2r1erm
+rer2n
+2r1ernä
+4r3erns
+4r3ernt
+r2ero
+re2rob
+r1erö
+3r2ers.
+2r1ersa
+r2erse
+2rersp
+r1ert
+r2erte
+2rertr
+2r1erz
+rer5ze
+r2erzy
+3r4es.
+re2sa
+3rese
+3reso
+2ress
+ress2e
+res6s5erw
+3rest
+re1sta
+re2s2tu
+3resu
+re2thy
+re2u
+reu3g2
+2reul
+re3uni
+2r1eur
+2reü
+2r3evid
+r1ew
+rewa4r
+re2wi
+2r3e2x1
+3rez
+4rezi
+1ré
+2r1f
+rf1ält
+rf2äu
+r2fent
+rf2es
+rfi4le.
+rf3lic
+rf3lin
+rf4lö
+r3flü
+rfolg4s
+r3for
+rf4ru
+rf4rü
+rf2sa
+rf2s1ä
+rf4s1id
+rf2s3pr
+rf2s3t
+rf2ta
+rf3t4r
+rf2u
+4r1g
+rg2ab
+r2g1a2d
+r2g1ah
+r2g1ak
+rg2an
+rge4an
+rge2bl
+rge4l3er
+rgen4z3w
+rge4ral
+rge4tap
+r2geto
+rgi4sel
+r2glan
+r2gleu
+r2glig
+r2gno
+r2g1ob
+r2g3ral
+r2greg
+r2gres
+r2gret
+rg3rin
+rg3s2p
+rgs4tr
+rg5s2tu
+r1h4
+2rh.
+2rha
+r2ha.
+2rhä
+3r4he.
+3r4hen
+r3her
+r2hoe
+rho2i3
+2rhol
+2rhö
+2rhs
+rhu2s
+1ri
+ri3am
+ria1s
+ri3at
+rib2bl
+ri1ce
+ri1cha
+rid2
+ri2d3an
+2ridol
+r2ie
+rie2fr
+ri1el
+riene4
+rien3s
+rie2nu
+ri1er.
+ri4ere
+ri3ers.
+ri3esti
+ri1eu
+ri2f1a
+ri2f1ei
+ri2fer
+ri2f1o
+ri2fr
+rif3s
+rif4ter
+3rig
+5rig.
+5rige
+ri4gene
+5rigj
+rig1l
+4rigr
+rik1l
+ri4kla
+r2imb
+2rimp
+rim2s
+rim4sc
+r2i3na
+2r1ind
+rin4dex
+rin4diz
+ri3n4e
+rine1i
+2r1inf
+rin2fo
+ring3l
+rin2gr
+2r1inh
+2rinit
+2rink
+3rinn
+6r5innenm
+4r3inner
+4rinnta
+r1innu
+2r1ins
+3r4ins.
+rin4so
+rin2sp
+r4inspi
+2rint
+rin4teg
+rin4t5r
+r1inv
+r2inva
+2rinve
+4r1ir
+r2is
+ris2a
+ri4scho
+ri4schw
+3risik
+ri3so
+ri4s1p
+3riss
+ri2st
+ris6t5ers
+r2it
+r3i2tal
+ri3t2i
+rit4r
+rit2tr
+5ritu
+rix1
+1rí
+2r1j
+2r1k
+rk2am
+r2käh
+r3klau
+r2klis
+rk4lo
+rk2lu
+rk4n
+r2k5nu
+rk3räu
+r2k3rea
+r3kri
+rk3rin
+rk2s1e
+rk3shi
+rk2sp
+rk1st
+rkstati6
+rk4stec
+rk2ta
+rk4t3eng
+rk4t3erf
+rkt3ers
+rk6tersc
+rk4t3erw
+rk2tin
+rk2t1o2
+rk2t3r
+rk3tra
+rk4tri
+rk1uh
+rk2um
+rku2n
+rk1uni
+4r1l
+r3l2a
+rl2e
+rle2a
+r3lec
+rle2i
+r3let
+r3l2i
+rli2s
+r3l2o
+rl2ö
+rlös3s
+rl2s1p
+rl3ste
+rl2s3to
+rl3t
+4r1m
+r3m2ag
+rma2la
+r2m1ald
+rm1ans
+rm1anz
+rm1a2p
+r2maph
+rm2är
+rm3d2
+r3me.
+r2m1ef
+r2meo
+rm2es
+r2mide
+r2m1im
+r2m1o2ri
+rmo1s
+rm3sa
+rm3sta
+rmt2a
+rm2u
+rm3ums
+4rn
+rna2b
+rna4n
+rn2and
+rn3ani
+r2n1anz
+rn2a2r
+rn3are
+rn3ari
+r2nau
+rnd4
+rn3dr
+r3ne
+rn3e4ben
+r4nef
+rn2ei
+rn3eif
+r4n3eis
+rne2n
+r4n1ene
+rn3ense
+r4nerf
+r4n1erg
+rn4erhi
+r4nerk
+r4n1ert
+r5nes
+rn2et
+r4nex
+rn3f
+rng2
+r3ni
+r4n1in
+r3nod
+r2n1op
+r2n1or
+rn1ö
+r1nöt
+rn3s2ä
+rn3s2p
+rn3s2z
+rn3t2e
+r1nu
+rn1ur
+r1nü
+r1ny
+ro2bei
+2robj
+3robo
+2robs
+ro1c
+3rock.
+r2o3de
+ro3e4
+2rof
+roh1l
+roh3na
+3r2ohr
+3roi
+ro1ir
+ro3le
+rol4lan
+rol3l4en
+rol3s
+2roly
+4rom.
+ro2mad
+ro2mer
+4romm
+4romt
+r2on
+3ronn
+rons2
+ron4tan
+ro1ny
+ro1pe
+ro3ph
+r1or
+r2ora
+ror3al
+ro2rat
+ro2rei
+ro2r1o
+ror3th
+ro3sh
+ro3s2i
+ro3smo
+ros2p
+ros2s1c
+ro3st2a
+rost1r
+4roß
+ro2ßu
+ro4tag
+rote3i
+ro2tho
+ro4tri
+rots2o
+rot2ta
+ro3t2u
+ro3unt
+3rout
+2rox
+rö2b3l
+rö2du
+2röf
+4rög
+1r2öh
+r1ök
+1r2öl
+3römi
+4röp
+r1ör
+r2ös.
+r2öse
+2r1p2
+rp4a
+rp4e
+rpe2re
+rpe4r3in
+rpf4
+r2pli
+r3po
+rpro1
+rps3t
+rp3t
+r3pu
+r1q
+2r1r
+rr2ab
+rr2ar
+rr1äm
+rrb2
+rr1c
+r3r2e
+rre4ale
+rrer4s
+rre2st
+r4rew
+rr2he
+rrik2
+rr2n3a
+rr2o
+r2r3ob
+rro3m
+rr2st
+rr3stu
+rr2th
+r3ru
+r3r2ü
+rrü1b
+4r1s
+rs3ab
+r2s1a2d
+r4samp
+r4s1amt
+rs2an
+r2s3ang
+rs3anp
+rs3ant
+rs3ar
+r3sch2e
+r6scherl
+rsch2l
+r3schu
+r3schw
+r2sein
+rse2n1
+rs2end
+rse4ne
+rs1ere
+rs1erö
+rs1ers
+rs1erz
+rs1eta
+r3sho
+r3si
+rs2kal
+rs2kan
+rs2kie
+rs2kis
+rs2kl
+r4sko
+r4skr
+r4sku
+rs3l
+rs4no
+r3so
+r4sob
+r4s1op
+r4sord
+r4s3ort.
+rs2p4
+r2s3ph
+rs3s2
+r4stant
+rs2tec
+r6st5eing
+rs4temp
+rs4terb
+rs4t3er4w
+rs2th
+rs2ti
+r3stie
+r2stin
+rst3ing
+r2stip
+r3sto
+rs4tob
+r4stot
+r3stö
+r3s4tr
+rst3ran
+r6strang
+rs2tu
+r3s4tü
+r3swi
+r3sy
+4r1t
+rtal2
+r2t1alm
+rtals1
+rt1am
+rt1ang
+rt1ann
+rt1ant
+rt1anz
+r2t1ar
+rt3a4re
+r2t3att
+rt1är
+rte1e2
+rt4eif
+rtei3la
+rtei1s4
+r2telf
+r2temo
+rte2n1
+rten3s2
+rt3erei
+r4terfo
+r4t3erh
+r2t1erk
+r4t3er4la
+r4t3erle
+r4t3ernä
+rter4re
+rt1ers
+rte3s2k
+r2thi
+rt3hol
+rt2hum
+r2t1id
+r2t1ima
+r2tinf
+rto1p
+rt1or
+rto2ri
+r3tö
+r4trak
+rt3rec
+r4treis
+r5tri
+rt1ros
+rtrü2c
+r4ts
+rt4s1eh
+rt2so
+rt2spa
+rt2spr
+rtt4
+r2t1urt
+r3tü
+rt3z
+1ru
+ru1a
+ru3a2r3
+rube2
+ruch3st
+ru6ckerl
+ru2cku
+rude2a
+ru2dr
+3ruf
+ru2fa
+ruf2s3
+4rug
+2r1uhr
+3ruin
+ru1ins
+ru1is
+2rum
+4rumf
+ru2mi
+4ruml
+r2ums.
+4rumz
+2r1una
+2rund
+run2d1a
+r2unde
+rund3er
+run6derl
+run6ders
+run6derw
+2r1unf
+2rungl
+2r1u2ni
+4r3unio
+run2kr
+2r1unl
+2r1unm
+4runn
+4r3unt
+2runw
+ru3pr
+4r3ur
+ru2ra
+ru2r1e
+5ruro
+ru2si
+rus2s1p
+rus4st
+ru2st
+ru3sta
+3rut
+rut3h
+ru2t1o2
+ru2t3r
+4ruz
+ru2zw
+1rü
+2rüb
+rü1ben
+rü1ch
+4rümm
+2r1v
+rve4n1e
+2r1w
+rwun3s
+4r1x
+1ry
+ry2c
+2r1z
+rz1a2c
+rz2an
+r2zar
+r2zas
+r5zene
+rz1eng
+r4z3ents
+r2z1erf
+r2z1erg
+r2z1erk
+r2z1erw
+rz1id
+r3z2of
+rz1op
+rz2ö
+rz3te
+rz2th
+rz2t3ro
+rzug2u
+r3zwä
+r3z2wec
+1sa
+3sa.
+3saa
+2s1ab
+sa2be
+3sabet
+sa2bl
+sa3ble
+sa2br
+4sabs
+sa2cho2
+sach3t
+2s1ada
+s1adm
+2s1a2dr
+3safa
+sa2fe
+2s3aff
+3safi
+sa1f4r
+3saga
+sa4gent
+sag4n
+sa2gr
+3sai
+sa3i2k1
+sail4
+2s1ak
+sa2ka
+3saki
+3sakr
+4sakt
+3s2al.
+sa4l3erb
+sa2l1id
+3salo
+sal2se
+2s1alt
+3s2alz
+3sam
+s3ameri
+5samm
+6s1amma
+4s1amn
+s1amp
+sam2to
+s1an
+s2an.
+2s3a2na
+s3anb
+s2an2c
+s2and
+s4and.
+san4dri
+3sang.
+2s3anh
+3sani
+2s3anl
+2s3ans
+san4sk
+4s3antr
+2s3anw
+2s1ap
+sa2po
+3sapr
+2s1ar
+3s4ar.
+3s2ara
+4s3arb
+3s2ard
+3sari
+s3arr
+3s2ars
+4sarti
+s1asp
+4s3a2sy
+3sat
+sat2a
+4s3ath
+4s3atl
+4satm
+sa2tr
+sa3ts
+sat4z3en
+s1a4u
+3sau.
+3sauc
+3saue
+2s3aufb
+sau2gr
+3saum
+3saur
+sauri1
+2s3ausb
+3s2ause
+s3ausw
+2s3av
+sa2vo
+1sä
+s3ähn
+3säl
+s1ält
+2s1äm
+2s1änd
+3sänge
+2s1är
+3s2ät
+3säul
+2säuß
+4s3b4
+sba4n
+sbe3r2e
+1sc
+2sc.
+2scam
+s2can
+s2cap
+2scar
+2s1ce
+6sch.
+2schak
+s4ch2al
+4schanc
+4schang
+2schao
+s4chä
+4schb
+4schc
+2schd
+3sche.
+2schef
+sch3ei.
+4schemp
+sch2en
+3sches
+4schess
+4schex
+2schf
+2schg
+2schh
+schi4e
+s4chim
+4schiru
+3schis
+2schk
+s4chl
+4schle.
+6schlein
+sch6lit
+2schmö
+2schn.
+2schox
+s4chö
+2schp
+2schq
+4schre.
+4schrin
+sch3rom
+4schrou
+6schs
+schs2e
+sch3s2k
+4sch3t
+scht2a
+scht4r
+s4chu
+4schunt
+sch2up
+3schü
+2schv
+4schwet
+sch4wil
+2schz
+2scj
+4s3cl
+2sco
+3s4cop
+3sco4r
+s2cr
+2scs
+2scu
+4s3d2
+sda3me
+sde1s
+sdien4e
+sd4r
+1se
+se3at.
+2s1e2ben
+seb4r
+2s1echo
+s1echt
+2s1e2ck
+3see
+se1ec
+se2e1i4
+see3ig
+seein2
+se1er.
+se1erö
+2s1eff
+se2gal
+se2gl
+seg4r
+3seh
+se2h1a4
+se3he
+se4h1ei
+se4hel
+se4herk
+se2hin
+seh1l
+seh3re
+seh1s
+seh3t
+se2hüb
+2s1ei.
+2s1eig
+s1ein
+5s4ein.
+2seinb
+sein4du
+sei3n2e
+sein4fo
+4seing
+2seinh
+4seink
+2seinl
+2seinn
+4seinr
+s4eins.
+4seinsp
+4seinst
+2seinw
+4s1eis
+3s2eit
+3s2ek
+s2el.
+se2l1a
+se3lad
+sela4g
+se3lam
+sel1ec
+4selem
+se4l3erl
+sel3ers
+2self.
+s3elix
+se2l3ö
+s2els
+sel3sz
+sel3tr
+s4e3ma
+2s1emp
+3s2en.
+se4nag
+se2nä
+2s1endl
+sen3gl
+3s2eni
+3senk
+se2no
+se4nob
+3s2ens
+s2ent.
+4s1entf
+2s3entg
+s2enti
+2s1ents
+2sentw
+2sentz
+se2n3u
+seo2r
+4s1e2pos
+3seq
+s4er.
+3sera
+ser3a2d
+se2r3al
+se5ref
+s3ereig
+6sereign
+se4r3eim
+se4r3enk
+ser2er
+2s1erfo
+s2erfr
+s3erfü
+4serfül
+ser3g
+s2ergr
+s1erh
+2serhö
+3seri
+4serken
+2s3ernt
+se2rob
+4s3eröf
+s2ers.
+2sersa
+4serseh
+s4ert.
+s2erta
+seru2
+se4r1uf
+se3rum
+se3rund
+3s4erv
+5ses.
+se2sel
+se1sta
+se3su
+3set
+4se4tap
+se2tat
+4s1e2th
+se1u2n
+2s1ex
+se2xe
+4sexp
+sex3t
+1sé
+4s3f4
+sfal6l5er
+sflo4
+4s3g2
+2s1h
+sh2a
+3s2ha.
+sha2k
+4s3han
+1shas
+s3hä
+s3h2e
+3shi.
+3shid
+shi4r
+sh3n
+s3hoc
+4shof
+3shop
+sho4re
+3show
+s3hö
+sh4r
+1si
+si2ach
+si3ach.
+si2ad
+si3am.
+2siat
+sib4
+5si1c
+2s1i2deo
+s2ido
+3s4ie
+siege4s
+sien3
+si3ene
+si1err
+sie2s
+si1f4
+3s4ig
+si2g1a2
+sig4n
+si3gnu
+si2g3r
+sig4st
+si2k1ab
+si2k1ä
+sik3erl
+si2ki
+si4k1l
+si2kr
+sik3s
+sik3t4
+si2ku
+3silo
+2s1imm
+si3n4a
+2s1ind
+2s1inf
+sing1a
+sin3gh
+sin3g4l
+sin2gr
+sing3sa
+4s1inh
+sin1i
+sini1e
+2s1inq
+2s1ins
+2s1int
+4s1inv
+3sio
+sion4
+3s2is
+si2sa
+si4schu
+si2s1e
+si2s1o
+si2s1p
+sis3s
+3s2it
+si2tau
+sit3r
+si2tra
+si3tu
+siv1a
+sive3
+si2vr
+1sí
+2s1j
+2s1k2
+4sk.
+3skala
+4skam
+4skanz
+s3kar
+4skas
+ska4te.
+4skateg
+ska4tes
+4skb
+s4kep
+3s2ki.
+s2kif
+s2kig
+3s2kik
+4skir
+ski1s
+3skiz
+sk4l
+4s3klas
+sk4n
+4skom
+4skor
+4skow
+4skö
+4sks
+4sk3t
+3skulp
+2s1l2
+3slal
+4slan
+s2law
+s3lä
+sl3b
+s3le
+sler3s
+s3li
+3s4lip
+sli4tu
+s3lo.
+slo3be
+s3loe
+2s3m2
+2s3n4
+4sna
+snab4
+sni3er.
+sni3ers
+4s5not
+4snö
+1so
+3so.
+so4a
+2s1o2b
+so1c
+so3et
+3soft
+3sog
+s1o2he
+4sohng
+2s1ohr
+3sol
+so3la
+so4l1ei
+sol4ler
+4so2ly
+3som
+3s2on
+son3au
+sone2
+son5ende
+son3sä
+so2ny
+so3o
+2sopf
+3sor.
+so1ral
+s1orc
+2s3ord
+so2rei
+2s1orga
+5s2orge
+2s1o2rie
+so2r1o2
+3sors
+so4ru
+3sos
+s4os.
+4s1ost
+so3unt
+3sov
+4s1o2ve
+3sow
+2s1ox
+3soz
+1sö
+sö2c
+sö2f
+2s1ök
+2s1ö2l
+s1ös
+1sp2
+2sp.
+2spaa
+2spak
+s2pan
+spani7er.
+2spap
+2spara
+2sparo
+3sparu
+3spaß
+2spau
+s2paz
+s2pä
+3späh
+2spär
+s2pee
+2spel
+4spensi
+spe3p4
+2s1peri
+2sperl
+s2perr
+2spers
+2spet
+3s2pez
+4s3pf
+2spha
+s3phe
+2sphi
+3s2pi4e
+4spier4
+spi2k
+4spil
+3spio
+4spip
+4spis
+2spl
+4spla
+4splä
+3s2pli
+s3p4lu
+s3pn
+2spod
+2spog
+s2poi
+2spok
+4spol
+4s3pos
+s2pott
+4spr.
+s2prac
+s2pran
+2sprax
+2spräm
+4spräs
+3s4prec
+2spred
+2spres
+2sprob
+3spross
+3spru
+2sprüf
+2s3ps
+2spt
+2spun
+2spup
+3spur
+4sput
+4spy
+2s1q
+4s3r4
+srat2s
+srat4sc
+sret3
+srö2s1
+srücker6
+srü2d
+6s1s
+ssa3bo
+ss1a2ck
+s5saf
+s3sag
+ss1aj
+s3sal
+s4s1ala
+s4s1alb
+s4s3amt
+s4s3ang
+s2sano
+s4sans
+ss2ant
+s4s3anz
+s3sa1s2
+ss3att
+s3s2ä
+s4sce
+s4sco
+ss1ec
+s2s1ega
+sse3ha
+sse3inf
+sse3in4t
+sse6r5att
+ss1erö
+ss3erse
+s3s2es
+sse3ta
+ss3l
+ss1off
+ssoi4
+s2s1op
+ss1ori
+ss2po
+s2spro
+ssquet4
+ss3s4
+sst2a
+s3stel
+ss2th
+ss2ti
+ss4tip
+ss2tur
+s3stü
+ss1ums
+s1t
+6st.
+s2ta
+4sta.
+3staa
+2stabb
+st2ac
+3s4tad
+3staff
+2stag
+3stah
+2stak
+2stale
+s3ta3li
+2stalk
+st1alp
+st1ami
+4stan.
+sta4na
+3stand
+2stani
+4s3tann
+2stans
+2stanw
+s4tar.
+4stari
+s4t2ars
+s3tat.
+s4tau.
+2stauf
+2staum
+3staur
+2staus
+3staus.
+2stax
+3s2tä
+4stäg
+4stält
+s4tänd
+5stätt
+s3täus
+2stb
+2st3c
+2std
+st2e
+4s5te.
+2stea
+4stechn
+s2ted
+4stee
+3s2teg
+ste2gr
+3s4teh
+s2te2i
+3steig
+4steil
+3steilh
+stei4na
+1s2tel
+2stel.
+stel4l3ä
+2steln
+2stels
+2stem
+4stem.
+ste4mar
+4sten
+s5ten.
+s4t3ends
+s4t3engl
+st4ens
+s4t3entf
+s2tep
+2ster
+6s5ter.
+ste6rers
+4sterm
+3sternc
+4stes
+s4t3ese
+stes6se.
+ste4st
+2stet
+s4teti
+3s4tett
+3s2teu
+1steue
+4steuf
+st3ev
+4stex
+2stf
+2stg
+4sth
+s4thä
+s4thi
+s2t3ho
+s2thu
+2stia
+2stib
+s2tic
+sti2e
+2stie.
+s2tieg
+s2tiel
+2stien
+3s2tif
+2stig
+2stik
+s2til
+3s4tim
+s4tinf
+s3tinn
+st1ins
+2stio
+1s2ti2r
+2stis
+st1i4so
+1stitu
+2stiv
+2stj
+2stk
+4stl
+4stm
+2stn
+s2to
+2sto.
+s3tob
+2sto3d
+4stod.
+1stof
+s4toff
+s4t3om
+4ston
+4stoo
+2stopo
+2stor.
+2store
+2storg
+2stori
+s3tort
+2stose
+sto3s2t
+1stoß
+4stote
+4stou
+2stow
+2stoz
+1stö
+2stöch
+2stöt
+2stp
+2stq
+s2tr
+2strad
+2strag
+1s4trah
+4strai
+4strak
+2stral
+4strans
+3s4tras
+5straß
+4straum
+4s5träg
+4sträne
+4s5tref
+4streib
+5st4reif
+st3renn
+2s4trig
+1s4tri2k
+2s5tris
+st3roll
+stro4ma
+1stru
+2strua
+2strug
+3struk
+4st3run
+2strup
+2s4t3s4
+2st3t4
+st2u
+1stub
+4stuc
+3s4tud
+2stue
+3stuf
+3stuh
+2stum2s
+stum4sc
+2stumt
+stu2n
+2stun.
+3s4tund
+s2t3uni
+4stunn
+2s3tuns
+2stunt
+stu3re
+st3url
+2sturn
+2st3urt
+2s3tus
+1stü
+2stüch
+2stür.
+2stüre
+2stürg
+2stürs
+3stüt
+2stv
+2stw
+3s2tyl
+4st3z
+1su
+su1an
+3su2b3
+su4ba2
+4subi
+3su1c
+su2cha
+such4st
+2s1u2f
+2s1uh
+su1is
+su1it.
+sul2a
+sul2i
+sult2
+su2mar
+su2mau
+3s2ume
+su2mel
+su6m5ents
+s3umfe
+3summ
+sum1o2
+su2mor
+s3umsa
+s3umst
+su2n
+3sun.
+sun6derh
+su4ne
+s1unf
+2s1uni
+4sunt
+3s2up
+sup3p
+su2ra
+2s1url
+s1urt
+s4u2s1
+su3sa
+su3sh
+su3si
+sus3s
+3suv
+1sü
+2sü4b
+3süc
+sü2d1
+süden2
+3sün
+4s3v
+2s1w
+s3wa
+s3we
+sweh2
+4swie
+4swil
+1s4y
+syl1
+sy4n3
+2s1z
+4s3za
+4s3zei
+s2zena
+3s4zene
+4szent
+s2zes
+4s3zet
+s2zis
+sz2o
+4s3zu
+s3zü
+4s3zw
+2ß1a2
+2ß1b2
+2ß1c
+2ß1d
+1ße
+2ß1ec
+2ß1e2g
+2ß1ei
+ße2l1a
+ßen3g
+ße2ni
+ße2no
+ße2ro
+ß2ers.
+2ßerse
+ßer3t
+2ß1f
+2ß3g2
+ßge2bl
+2ß1h
+1ßi
+ßi2g1a2
+ßig4s
+2ß1in
+ß1j
+2ß1k4
+2ß1l
+ßler3
+2ß1m
+2ß1n2
+ß1o2
+ßos2
+2ß1p2
+2ß3r2
+2ß1s2
+ßst2
+2ß1t
+1ßu
+2ß1um
+2ß1ü
+2ß1v
+2ß1w
+2ß1z
+1ta
+3ta.
+4taa
+5taan
+4tab.
+ta2b1an
+2t1abb
+3tabel
+2taben
+ta4bend
+2tabf
+2tabg
+2tabh
+2tabk
+3table
+2t3abn
+ta2br
+4tabs
+2t3abt
+ta2bü
+2tabw
+2tabz
+2t1ac
+3tacu
+t1ada
+tadi3
+2t1a2dr
+ta3d2s
+3taf.
+3taf2e
+4taff
+t1afg
+t1af4r
+3t2ag
+ta2ga2
+ta2g1ei
+4t3a4gent
+4ta3gl
+t3ago
+tag4st
+tah2
+tah3le
+tahl3sk
+ta3i2k
+tai2l
+ta1ins
+tai4r
+ta1ir.
+t1a2ka
+ta2kro
+tak6ta
+3taktb
+3t2aktu
+2takz
+3t2al.
+ta2la
+ta3lag
+ta3lak
+tal3d
+3t4ale
+ta4lens
+tal2lö
+3talo
+ta2l1op
+2talt
+2tam
+3tame
+ta2mer
+ta2mi
+t1ampl
+t1amt
+3tan.
+t1a2na
+2tanb
+4t2and
+ta3ne
+4tanf
+2tang
+3tani
+t2ank
+t3ankl
+4tanl
+2t1anme
+4t1anna
+t2ano
+t1ans
+3t2ans.
+4t3ansi
+4t3ansp
+ta2nu
+2tanwa
+2tanwä
+t2anz.
+t1anza
+tan6zerh
+t1anzu
+ta3or
+ta2pe.
+ta2pes
+2tapf
+ta2pl
+2tarb
+ta4rens
+ta4r3ere
+3t4a3ri
+4tark
+2t1arm
+2tart
+t1arti
+tar2to
+ta2ru
+2t1arz
+3tas
+ta3sa
+4t1asp
+ta2ta2b
+ta2tan
+ta2tau
+tat3ei
+ta2tem
+ta2t3er
+ta2th
+tat3he
+t3atl
+t4atm
+ta2tom
+4tatue
+ta2t1um
+2t1auf
+4taufg
+tau3f4li
+4taufn
+t1auk
+3taum
+t1ausb
+3tausc
+tau6schr
+tau6schw
+t2ause
+4t3ausg
+t1ausk
+4tausl
+4t3auss
+4t1ausw
+3tav
+3tax
+taxi1s
+1tä
+4täb
+tä1c
+4täd
+3täe
+3täg
+4tägy
+2täh
+2t1ält
+4täm
+t1ämt
+t1ängs
+3tänz
+t1äp
+t2är.
+tä2ru
+tä2s
+t2ät
+4tätt
+2täuß
+2täx
+1tà
+4t3b2
+tbe3r2e
+tblock5e
+tblocken8
+4t1c
+t3cha
+t3che
+tch2i
+tch3l
+t2chu
+tch1w
+t4ck
+t3cl
+t3cr
+4t3d4
+tdun2
+1te
+3te.
+te2a2
+2teak
+te3al
+te3an
+3teba
+3t4ebb
+4t1e2ben
+t2ech
+te3cha
+3techn
+2teck
+teck2e
+te2cki
+te1em
+te2en3
+te1erw
+te2es
+2teff
+teg3re
+2teh
+3teha
+3tehä
+3t2ei.
+t2eie
+t3eifr
+teik4
+3teil
+4teilhe
+2t1ein
+tein3e4c
+t3einge
+t3einla
+4teinn
+t3eis.
+t3eisb
+5tel.
+3tela
+te2l3ab
+te2l1ac
+te2l1au
+telb4
+3te3le
+tel1eb
+tele4be
+te4l1ec
+te4l1eh
+te4lein
+2telem
+tel1en
+te4lerd
+te4leu
+4t3elf.
+3telg
+te2l1in
+te2lit
+3telk
+tell2e
+5teln
+te4lost
+te2l1ö
+3telp
+5tels
+tel3s2k
+3telt4
+tel3ta
+tel3th
+3tem.
+te2m1ei
+te2min
+2temme
+te2m1o2r
+3temper
+2tempf
+tem3s
+te4m1u
+3ten
+t6en.
+ten3a
+tena2b
+te4na2d
+te4na4g
+te4nas
+te4nau
+te2nä
+t4enb
+ten3da
+4t3endf
+t6endi
+4t1endl
+t6endo
+4t3endp
+ten3d4r
+te2n1e2b
+te2nef
+te3n4ei.
+ten3eid
+ten3ens
+4tenerg
+te2net
+ten3g
+4t1eng.
+ten4gla
+t4enh
+te2ni
+te4n3in
+t4enj
+t4enm
+ten3n
+tens2e
+4tensem
+t4enta
+t3entb
+4tentd
+t4ente
+4tentn
+tent3ri
+4t3entw
+4t3entz
+ten6zerh
+ten3zw
+t3e2pi
+3t4er.
+tera2b
+te1raf
+ter3am
+te3ran.
+4terbs
+4terbt
+3terc
+4t3erde.
+te2re2b
+te4r3eif
+te2rel
+ter3end
+te4reng
+te4rerk
+terer4z
+4terfol
+t4erfr
+4terfül
+3ter3g2
+6tergrei
+t6ergru
+t4eri
+te3ria
+4terklä
+2t1erlö
+ter4mer
+3termi
+ter4n3ar
+2ternc
+t3erneu
+t4ero
+t3erö
+ter4re.
+t4ers.
+t6erscha
+ter4ser
+terst4
+t4erst.
+t4ersti
+t4erstu
+tert2
+teru2
+te4r1uf
+ter4wäh
+6terwerb
+ter3za
+2t3erzb
+3tes
+tesa2c
+te2san
+tesä2c
+te2sel
+te2spr
+tes3s2
+t2est
+tes3tan
+test3ei
+tes6ter6g
+tes6terk
+testes4
+te2su
+3tet2
+t2et.
+te2tat
+4teth
+4tetl
+teu3ere
+teu3eri
+3teuf
+3teum
+te1un
+3teur.
+teu2r3a
+te2vi
+te1xa
+2t3e2xe
+2t1e2xi
+4texp
+3text
+2t1exz
+4t1f4
+tfi2l
+4t1g2
+tger2
+t1h
+4th.
+2th4a
+3t4ha.
+t2hag
+t3hai
+t2hak
+3thal.
+4t3hau
+2t3hä
+th2e
+1t2he.
+3thea
+2theb
+t2hec
+2t3hei
+t4hein
+t2hek
+t2hem
+1then
+t4hene
+t4heni
+3theo
+2therr
+t2hes
+3these
+t2heu
+1thi
+t2hik
+2t3hil
+2t3him
+2thk
+4th3l
+4th3m
+2th3n
+1t2ho
+2t3hoc
+t3hof
+2t3hoh
+t4hol.
+t3hor
+2t3hot
+thou2
+4t3hö
+2thp
+1th2r2
+4thrin.
+4thrins
+2ths
+2thub
+4thun
+2thü
+2thv
+t2hy
+1ti
+ti2ad
+ti3a2m
+3tib4
+ti1ce
+tiden2
+ti4dend
+ti2deo
+3tief.
+tieg4
+2tieh
+ti1el
+ti3e4n3
+3ti2er
+tie4rec
+ti1et
+ti1eu
+3tif.
+ti1fr
+4tift
+3tig
+ti4gerz
+3tik
+ti2kam
+ti2kar
+ti3k2er
+ti2kin
+ti2krä
+ti2lar
+ti2lau
+ti2lei
+ti2lel
+3tilg
+ti2lö
+til3s
+tilt4
+ti2lu
+ti2ma2g
+t2imi
+tim2m1a
+4t1imp
+3t2in.
+ti3na
+t1inb
+4t1ind
+ti3n2e
+t1inf
+tin2g1a
+ting3l
+ting3s
+t1in1it
+2t1inj
+tin2k1l
+3t2ins.
+4t1inse
+2t1int
+ti1nu
+4t1inv
+3tio
+ti3or
+3tip
+ti3pl
+ti4que.
+ti1rh
+3tis
+ti4scha
+tisch3w
+ti2sei
+ti2sp
+ti1sta
+3ti3t2e
+2ti3tu
+tium2
+3tiv
+ti2van
+tive3
+ti2vel
+ti4v3erl
+ti2v1o
+ti2v3r
+ti2za
+2t1j
+4t3k4
+4t3l
+tl4e
+tle2r3a
+6t5li
+tlung4
+4t3m2
+tmal2
+tmen6t3
+tmo4des
+4t5n4
+tnes2
+tnes4s
+1to
+3to.
+to4as
+to5at
+4tobj
+tob2l
+to1c
+3tocht
+to6ckent
+3tod
+tode2
+4to2d1er
+to4d1u
+toi4r
+3tok
+to3la
+3tole
+4tolz
+tom1e2
+to2men
+2tomg
+3ton
+to2nau
+3too
+to2pak
+to2pat
+3topo
+2topt
+3tor.
+to1ra
+to2rau
+to4rän
+4torc
+t1ord
+3tore
+to2rel
+to3ren
+t1org
+t3orga
+3torin
+tor3int
+to2rö
+3tors
+t1ort.
+to2ru
+t2orw
+to3sc
+3tose
+to4sk
+tos2p
+4toss
+3tost4
+to1sta
+4toß
+3to3te
+to2tho
+3totr
+tots2
+3t4ou
+touil4
+to3un
+3tow
+2tö
+3töch
+4töf
+4t1ök
+tö4l
+3tön
+t1öst
+4töß
+3töt
+4t3p2
+tpf4
+2t1q
+1t2r4
+2tr.
+5tra.
+3trac
+tra3cha
+4tract
+t3rad.
+tra4dem
+tra4far
+3trag
+6trahm
+5t4rai
+3trak
+3tral
+3t4ran.
+2trand
+3trank
+t3rann
+3trans
+t3rase
+t3rasi
+4traß
+5träc
+3träg
+3träne
+4träs
+4träß
+4t5re.
+tre4ale
+4treb
+tre2br
+4trec
+t3rech
+t4reck
+6t3red
+5t4ree
+3tref
+4trefe
+4trefo
+4treg
+t4rei.
+3t4reib
+4treic
+2treif
+t3reig
+2t3reih
+t3rein
+t3reis
+6treit
+t3reiz
+2trek
+6t3rel
+t4rem
+t4ren.
+3trend
+4trendi
+t3rent
+2trepe
+2trepo
+t4repr
+t4rer
+t4res.
+t4ret
+tre2t3r
+t4reu
+3treuh
+t3rev
+2trez
+5t4ré
+2t3rh
+3tri
+4tric
+2trid
+5trieb
+tri4er
+5trigg
+t3rind
+4tring
+tri3ni
+4trinn
+t4rip
+4tript
+tri2x
+trizi1
+3tro.
+3troe
+3t4roi
+tro2ke
+4trom.
+tro2mi
+4troml
+3tron
+2t3roo
+t4rop
+3tropf
+3troy
+t3röc
+2tröh
+3trös
+2t3röt
+3trua
+4truk
+trum2
+trums1
+2trund
+3t4runk
+5t4rup
+tru2th
+t4rüb
+trü1be
+trü1bu
+2t3rüc
+trücker6
+t4rüg
+try1
+2ts
+4ts.
+t4sa4b
+t3s2ac
+ts1ad
+t2s1ah
+ts1al
+t4s1amt4
+t2san
+t4s3ar
+ts1as
+t2sau
+t2s1än
+t3s2cha
+t4schar
+t3sch2e
+t4schef
+ts4chem
+tsch4li
+t4schro
+ts4cor
+t2s1e2b
+t3seil
+t4seind
+ts1em
+tse2n1
+t2s1eng
+t2s1ent
+t2s1er
+t4s3esse
+t2s1i2d
+ts1ini
+t2s1ir
+ts3kr
+t1slal
+ts1o
+tso2r
+t3sou
+t2sö
+t3spal
+ts1par
+ts4pare
+t2spä
+ts2ped
+t3spek
+t2sph
+t3s2pi
+t2spo
+t3s2pon
+t3s2por
+t4sprei
+ts3s4
+t1st4
+t4stag
+ts3tak
+ts4tal
+ts3täti
+t2s3tep
+t3s4tero
+t2stip
+t4stit
+ts3toc
+ts3tor
+ts3trad
+t4stran
+ts3trau
+t2s3trä
+t4streu
+t2stri
+t4strop
+t2s3trü
+ts2tu
+t2s1u
+1tsub
+t3sy
+4t1t
+tt1ab
+tta2be
+tt2ac
+t2t1ad
+tta6gess
+tt1ak
+tt2al
+tt2ant
+tt1art
+tta1s
+tt1ebe
+tt1eif
+tt1eis
+t3tel
+tte2la
+tte4leb
+tte4len
+ttel1o
+ttes1
+tte2sa
+tte2sä
+t4teti
+tt2häu
+t2t3ho
+t3ti
+t3to
+tto1s
+t3tö
+t3tro
+tt3ru
+tt3rü
+tt2sen
+tt2sor
+tts1p
+tt2spe
+tt2spr
+tt2sti
+ttt4
+t3tu
+tt2un
+t3tü
+1tu
+tu1alm
+tu3an
+2tub
+3tuc
+tu2chi
+2tud
+3tue
+4tuf
+tuf2e
+tu3fen
+t3u2fer
+tuff3
+2tuh
+2tuk
+t3u2kr
+tul2a
+t2um.
+3t2ume
+2t3umf
+2t3umg
+2t3umk
+2t3umr
+tum2si
+tum2so
+tums5tr
+2t3umt
+2t3umz
+3tun.
+2t1una
+2t1und
+3tune
+2t3unf
+3tung
+t3unga
+tung4s5
+2tunif
+2t1u2nio
+2t3unt
+t1up.
+tu2r1a4g
+tu2rä
+tur1c
+tu2re.
+tu2rei
+tu2r1er
+tu2res
+tu2r1e4t
+turin1
+3turn
+tu2ro
+tu4ru
+tu2sa
+tu4schl
+tu2so
+tu3ta
+2tü
+4tüb
+3tüch
+tück2s
+3tüf
+3tüm
+3tür.
+tür1c
+3türe
+3türg
+3tür3s
+3tüten
+4tütz
+4t3v
+4t3w
+twa2
+twi4e
+1ty1
+3typ
+ty2pa
+tys4
+4t1z
+t2za4
+tz1ag
+tz1al
+tz1ar
+tz1au
+tz1ä
+t3ze.
+t2z1e2c
+t2z1eie
+t2z1eis
+tze4n1
+tz2ene
+tz3ents
+tz1erl
+tz2ers
+t3ze2s
+tzgel2
+tz1ind
+tz1int
+t2zor
+tz2ö
+tz2th
+tz2tin
+tz1wä
+tz1wi
+tz1wu
+2ua
+u1a2b
+u1a2c
+uad4r
+u1al.
+ua2lau
+u1alb
+u3alet
+u1alf
+u3a2lo
+u1alr
+u1als
+u1alt
+ua2lu
+u1am
+u1ans
+u3ar.
+uara2b
+u1ars
+ua3sa
+ua2th
+uat2i
+u3au
+u1ay
+u1äm
+u1äu
+2u1b
+u2be2c
+u3b4i
+ubi3os.
+ub2l
+ub3lic
+u2b3lu
+u2bop
+ub1r
+ub3rä
+u2b3rit
+ub2san
+ub2s1o
+ub2spa
+u2büb
+2uc
+uc1c
+u1ce
+uch1a
+u1cha.
+uch1ä
+u1che
+u2ch1e4c
+uch1ei
+u3ches
+u1chi
+uch1il
+uch1in
+uch3l
+uch3m
+uch3n
+u2ch3r
+uch2so
+uch4spr
+uchst4
+uch4tor
+uch2t3r
+u1chu
+uch3ü
+uch1w
+u1ci
+u2ckem
+u4ckent
+u3ck2er
+u2cki
+u1cl
+2u1d
+u3d2a
+uden3s2
+uder2e
+udi3en
+uditi4
+u2don
+ud3ra
+u3dru
+2u1e
+ue2ck
+u2ed
+ue2en
+u2eg
+u2ela
+ue2le
+ueli4
+ue2mi
+uen1
+ue2nä
+ue2ner
+uenge4
+ue2ni
+ue2no
+uen2zu
+u2ep
+ue2r3a
+ue2r1ä
+u2ere
+u3ereh
+ue3reig
+u3erer
+ue4rerg
+ue4rerk
+u3erex
+uer3g2
+u4erinn
+u3erin4t
+uer2ne
+uer4ner
+uern3s4t
+ue2r3o
+u3err
+uer3sc
+uer3t2
+u3erum
+u3erunf
+u3erunt
+ue2ta
+ue4tek
+u3fah
+uf1ak
+uf3ar
+u3fas
+uf1au
+u2f1äs
+u2f1ä2ß
+u2f1ei
+u2f1em
+u3fen.
+u2fent
+u2f1erh
+u4ferle
+uf2ern
+2uff
+uff4l
+uf2fro
+uffs4
+uf3l
+u2fob
+ufo2r
+uf1ori
+uf3r
+uf3sä
+uf4sin
+uf4so
+uf2spo
+ufs3tem
+uf2t1eb
+uft3s2
+u2fum
+2u1g
+u4gabte
+ug1af
+ug1ak
+u2g1ap
+uga4s
+ug1au
+ug3d2
+u2g1ei
+u2g1erf
+u2g1erl
+ugge4st
+ug3hu
+u2g1l
+ug3lad
+ug3lo
+u3g2lö
+u4glu
+u2g3n
+ugo3
+ug1or
+u2gö
+u4g3reis
+ug3ro
+ug3rüs
+ug3se
+ug4ser
+ug3si
+ug3spa
+ug4spr
+ug4spu
+ug5stä
+ug3str
+ug3stü
+u2gü
+u1h
+2uh.
+uhe3s6
+uh1la
+uh1lä
+uh2li
+uhme4
+uhr1a
+uh2rer
+uh3ri
+uh4rin
+uhrt4
+uh2ru
+uh4rü
+uh1w
+2ui
+ui2ch
+u1ie
+ui1em
+u3ig
+u4ige
+u1in.
+u3isch.
+u3ischs
+uisi4n
+ui4s5t
+u1j
+uk2a
+u3käu
+u1ke
+u1ki
+u1k2l
+ukle1i
+uk4n
+uk2ö
+u1k4r
+uk2ta
+uk2t1in
+uk2t3r
+u1ku
+uku2s
+u1l
+ul1ab
+ul1am
+ula2s
+ul1äm
+ulb4
+ul2dr
+uld2se
+u2l1el
+ule4n
+ul1erf
+ul1erh
+ul1erw
+ule2sa
+ule2t
+ul1eta
+u2lex
+ul3f4
+ulg4
+uli2k
+ul1ins
+ul3ka
+ul2kn
+ull2a
+ul2les
+ull3s
+ulm3ein
+ulo2i
+ul1or
+ul2p1h
+ul2sa
+ul4sam
+uls2th
+uls3z
+2ulta
+ul3th
+ul4tri
+ult3s
+u2lü
+ul2vr
+ulz2w
+u2m3a2k
+um1all
+um1anz
+u2m1art
+u2m1aus
+u2maut
+1um3d2
+um2en
+ument4s
+umer2a
+u2m1erg
+u2m1erl
+u2m1erw
+1umf
+1umg
+um1ins
+um1ir
+1umk
+1um3l
+4umm
+umm2a
+umpf4li
+um2p3le
+1umr
+3umsat
+um4ser
+um2sim
+um2s1pe
+um2su
+um3t2
+um2un
+u2m1ur
+1umz
+un1
+4un.
+2una.
+1unab
+un3ac
+un4al
+u3n2am
+u2n3an
+2un2as
+un3at
+1unda
+un4dab
+1undd
+un4dei
+un4d3erf
+und5erha
+1undf
+2undg
+un2did
+1undn
+un2dor
+un2d3r
+4unds.
+und3sp
+und3st
+un2d1um
+1undv
+1undz
+u3ne
+une2b
+une2h
+un2ei.
+un3ein
+unen2t
+un4es4
+1unget
+1ungew
+ung5h
+1unglü
+un2g1r
+ung3ra
+ung3ri
+ung4sa
+un2id
+un3ide
+1u2nif
+unik4
+un2im
+uni2r
+2unis
+un3isl
+u3n2it
+3u2niv
+2unk
+un2k1a2
+un2kei
+unks2
+unk4tit
+unk2t3r
+3unku
+unna2
+un2n3ad
+un3n2e
+uno4r
+un2os
+1unr
+uns2
+2uns.
+un3se
+1unsi
+un3sk
+un3sp
+uns4t1r
+1unt
+un3ta
+unte4ri
+un3tr
+unt3s
+2untu
+unvol2
+unvoll3
+1unw
+2unz
+2uo
+u1o2b
+u3of
+u3or.
+u1or3c
+u3ors
+uos2
+u1os.
+uote2
+u1pa
+u1pe2
+uper1
+up2fa
+u2pf2e
+u2pf1i
+u3pi
+up2pl
+up2pr
+u1pr
+up4t3a2
+upt3erg
+upt1o
+up4tr
+u1q
+2ur.
+u1ra
+u2rab
+u3raba
+ura2be
+u2r3a2m
+u2r1ana
+ur2anb
+u2r1ang
+ur2anh
+u2r1an5s
+u2rar
+ur3a4ren
+u2r3att
+u2r1au
+2u1rä
+ur1än
+ur3b2a
+urch1
+urd2
+ur3di
+2ure
+ur1eff
+u2rele
+ure4n
+u4r1ep
+ur1erh
+ur1erw
+2urf
+urf3t
+ur2gri
+urgros4
+urg3s4
+uri2c
+ur1im
+ur1ini
+ur3ins
+ur1int
+u2rinv
+urk2s
+1urlau
+4u1ro
+u3rol
+uro1s
+u1rö
+ur3p
+ur3sac
+ur2san
+ur2sau
+ur2ser
+ur4sin
+urst4r
+ur4sw
+ur3s2ze
+urt2
+u3ru
+urü2
+ur2za
+ur2zä
+ur2zi
+ur2zo
+ur2z1w
+2us
+u4saf
+us4ann
+u6schent
+usch5wer
+u2s1ec
+u2s1ei
+u3seid
+u3sep
+use1ra
+u2serp
+u2s1ese
+usi3er.
+usi5ers.
+us3kl
+u4sko
+us3oc
+u3soh
+u2s1op
+us1ou
+us3part
+u2s1pas
+u2spat
+us1pe
+u3s2pek
+us1pic
+u5s4piz
+u2spo
+us2por
+u2spu
+us4sez
+us2sof
+ust3abe
+u1stal
+us3tau
+us2th
+ust2in
+us3tr
+u5stras
+us6tris
+u1stu
+u2stun
+u2stur
+us2ur
+u2sü
+2u1ß
+2u1t
+ut1alt
+ut3a2m
+u2t1ap
+u2t1ar
+u2tär
+u3te
+ut1eg
+ute4ge
+ute2n1
+u2tent
+uter4er
+u4t3ersa
+ut2es
+ut2et
+u4tev
+u4t1ex
+utfi4
+ut2he
+u2thi
+u2t3ho
+u2thu
+uto1
+uto4ber
+uto3c
+ut1opf
+u2tops
+ut4or
+utos4
+u3tö
+ut3rea
+ut3rü
+ut3s2a
+ut2s1ä
+ut4schl
+ut4schm
+ut4schö
+ut2spa
+ut3te
+ut5t4l
+utts2
+utu4re
+utu5ru
+u3tü
+utz3eng
+ut2zin
+ut2zo
+ut2z1w
+2u1u2
+uufe2
+u1ü2
+2u1v4
+u2ve.
+uve3rä
+u1w
+2u1x
+ux2e
+ux2o
+ux3t
+u1ya
+2u1z
+uz1we
+uz3z4
+1üb
+2übc
+2übd
+übe2
+übe3c
+über3
+üb3l
+üb3r
+üb2s3t
+2üc
+ü1che
+üch3l
+üch2s1c
+ücht4e
+ü3cken
+ück1er
+ück3eri
+ü4ckers
+ück4spe
+2üd
+üd3a4
+ü3den.
+üden4g
+ü3d2ens
+üd1o4
+üd3r
+üd3s2
+üdsa1
+üd3t4
+üdwes2
+ü2f1a
+ü2f1ei
+üfer2
+ü2f1erg
+üf2fl
+ü2f1i
+üf3l
+üf2to
+ü1g
+üge6leis
+ü2g3l
+ü2gn
+üg3s
+üg4st
+üh1a
+ü1he
+ü2h1ei
+ü2h1eng
+ü2h1erk
+ü2h1erz
+üh1i
+ühla2
+ühl1ac
+ühl2e
+üh3mo
+üh3ne
+ühn2s
+üh3r2e
+ühr3ei.
+üh1ro
+ühr3ta
+üh1s
+ühs2p
+üh3t
+üh4th
+ü1hu
+üh1w
+ü1k
+ül1a
+ül2c
+ül4e
+ül2la
+ül2l1ei
+ül2lo
+ül2lö
+ü1lu
+ü2ment
+2ün
+ü2n1a
+ün2da
+ün2dr
+ünd3s
+ünen3
+ün2fa
+ün2f1ei
+ün2fli
+ün2fr
+ün2g3l
+ünn2s
+ün2s
+ün3sc
+ün3se
+ün3sp
+ün3str
+ünt2
+ü1nu
+ün2za
+ü1pe
+ü1pi
+üp2pl
+ür1a
+ü2r1ei
+ür2fl
+ür2fr
+ür4g3en4g
+ü3r2o1
+ürr2
+ür2s
+ür3sc
+ür3se
+ür3sp
+ürt2h
+üs2a
+ü2schl
+üse3h
+üse3l
+üse1s
+üs2s1c
+üss2e
+üs2st
+ü2st
+üste3ne
+ü1ß
+2üt
+ü2t1al
+ü2t3r
+üt2s1
+üt2tr
+ü1v
+ü1z
+2v1ab
+va1c
+val2s
+2vang
+2varb
+va1s
+v4at
+va2t3a4
+va2tei
+va2t3h
+vatik2
+va4t1in
+vati8ons.
+va2t3r
+vat3s4
+va2t1u
+2v1au
+2v1b
+2v1d
+1ve2
+ve3ar
+ve3b
+ve3c
+ve3d
+ve3g
+ve3h
+ve4i
+veit4
+veits3
+ve3la
+ve4l1au
+ve3le
+ve3li
+ve3lo
+ve3ma
+ve3mu
+ve3nal
+ven2c
+ve3ne
+venen4d
+ve3ni
+ve3nö
+ve3o
+ver1
+ver3a
+ve3rad
+ve3rand
+ve3ras
+ver3b2
+verd2
+vere2
+ve4rek
+verf4
+verg4
+ve3ri
+ve4rin
+ver3k
+ver3st
+vert2
+ver5te
+ver3u
+ves1
+2ve3sc
+2ve3s2e
+ves3ti
+ve3ta
+vete1
+ve3tr
+2veü
+ve3v
+ve3x2
+2v1f4
+2v1g
+2v1h
+vi3ar
+vi4a3t
+vi2c
+vid3s2t
+vie2h3a
+vi2el
+vi2er
+vie4rec
+vie2w1
+vig2
+2vii
+vi2l1a
+vi4leh
+vi2l1in
+2v1i2m
+vima2
+vi4na
+vin2s
+2v1int
+vi3sa
+vise4
+vi3s2o
+vi2sp
+vis2u
+2v1k
+2v1l2
+2v1m
+2v1n
+2v1ob
+vo3ga
+vo2gu
+3vol
+voll1a
+vollen4
+vol6l5end
+vol2li
+2v1op
+vo2r1
+vor3a
+vor3d
+vor3e
+vor3g
+vo3ri
+vormen4
+3voy
+vö2c
+2v1p
+v2r
+2v3ra
+v3re
+v4ree
+2v3ro
+2vs
+vs2e
+v1sta
+v1steu
+v3s2z
+2v3t
+vu2et
+2vumf
+2v1v
+2v1w
+2v1z
+w2a
+1waa
+wab2bl
+wa3che
+wach6stu
+wach4t4r
+waffe2
+waffel3
+1wag
+wa5ge
+wa2g3n
+wa3go
+1wah
+wahl5ent
+wah4ler
+wah2li
+wai2b
+1wal
+2walb
+wal4da
+2walm
+wal2ta
+wal2to
+walt4st
+wa3na
+wandels6
+wang4s
+wa2p
+1war2e
+ware1i
+war3ste
+wart4e
+1was
+wa3sa
+wa4scha
+wa3se
+wa3sh
+wass4e
+w2ä
+1wäh
+1wäl
+2wäng
+1wäs
+wäs2c
+wä3sche
+2w1b2
+wbu2
+2w1c
+2w1d
+we2a
+we2ba
+4webeb
+we2bl
+web3s
+we3cke.
+we5cken.
+we3ckes
+we2e4
+weed3
+we2fl
+1weg
+we2g1a
+we2g3l
+we2g3r
+weg3s4
+1weh
+we2i
+wei4bl
+2weie
+weik4
+weis4s3p
+wei3str
+wei4tr
+wel6schl
+wel6schr
+wel2t1
+wel4t3a4
+wel6t5en6d
+wel4tr
+wen3a4
+we3ni
+wen4k3ri
+we2r3a
+wer2bl
+1werbu
+werd2
+5werdens
+1werdu
+werer2
+wer2fl
+wer4gel
+we4r3io
+1werk.
+wer2ka
+1werke
+wer2kl
+wer2ku
+we2rö
+wer2s
+wer2ta
+wer6t5erm
+wer2to
+1werts
+1wese
+we2s1p
+we4st
+west1a
+west3ei
+wes2th
+west1o2
+west3r
+wes4tu
+1wet
+wet2s
+wett3s
+2w1ey
+2w1g
+2w3h
+wi3cka
+1wid
+wi2e
+wie3l
+wien2e
+wie2st
+wik2
+1wil
+wim2ma
+wim4m3u
+win4d3e4c
+win2dr
+win2e
+2wing
+win8n7ersc
+1wi4r
+wi3s2e
+wi2sp
+1wiss
+wi3th
+1witzl
+2w1k
+2w1l
+2w1m
+2wn
+wn3s
+1wo1c
+wo2cha
+woche4
+1woh
+woh2le
+1wolf
+wolf4s3
+wol4ler
+wor3a
+wo2r3i
+wor2t3r
+wo4r3u
+wot2
+1wöc
+wört2h
+2w1p
+w2r
+w3ro
+2w1s
+w3s2k
+ws2t
+2w1t
+wti2
+w2u
+1wuc
+wul2
+wul3se
+wun2s
+4wur.
+wur2fa
+wur2s
+1wurst
+wus2
+wus3te
+1wu4t1
+1wüh
+wül2
+wün3
+2w1w
+x1a
+1xa.
+2xa2b
+1x2ad
+1xae
+xa1fl
+1x2ag
+x3a2m
+x2anz
+1x2as
+2x1b
+2xc
+x1ce
+x1ch
+x1cl
+4x1d
+1xe
+x1e4g
+2xek
+xe2l
+xe3lei
+x1em
+3x2em.
+x2en
+xen3s2
+x2er.
+x2ere
+xers2
+3xes
+2x3eu
+2x1f
+2x1g
+2x1h
+xib4
+xi1c
+xich2
+xide2
+xi2d1em
+x1i2do
+xie3l
+xi3g
+xil1
+xil2a
+xi2lo
+xi2lu
+xin3s2
+x2is1
+xis2c
+xi2se
+xi2so2
+xis3s
+xis4tä
+xi2su
+x1i2tu
+x1j
+2x1k2
+2x2l2
+x3lä
+x3le
+2x1m
+2x1n
+x1or
+4x1p
+xpor6ter
+x1q
+2x1r
+2x3s2
+4x1t
+x2t1a
+xt2as
+xt1ä
+x2tän
+xtblo4
+x2t1e2d
+x2t1ei
+x4tent
+x2t1er2f
+x2t3ev
+xtfi4
+x2t1il2l
+xtra3b4
+x2t3ran
+xt3s2
+xt1u
+x3tur
+1xu
+xu1a
+x1u2n
+xu2s
+2xv
+2x1w
+2xy
+3xy.
+3xys
+x1z
+2y1ab
+1yac
+y1al.
+y1a2m
+yan2g
+y1ank
+y1ät
+y1b
+y1c2
+y2chi
+y3chis
+ych3n
+y1d4
+y1e
+y2ef
+yen4n
+y2ere
+y2es.
+yes2p
+ye2th
+y1f2
+y1g
+ygi2
+ygie5
+yg2l
+y1h
+yhr2
+y1i4
+y1j
+y1k2
+yke3n
+yk3s2
+y1l
+y2l3a2m
+yl4ante
+yl3c
+y4le.
+yli4n
+yloni1
+yl3s2
+y2l1u
+yma4t
+ym3p4
+ympi1
+y2n1o
+yno4d
+ynt2
+y1nu
+y1of
+yom2
+yon4i
+y1ont
+y1ou
+y1p
+ypa2
+yp3an
+ype2
+y2pf
+y3ph
+y2p1in
+ypo3
+y4p3s
+y1r
+y3r2e
+y3ri
+yri2a
+yri1e
+y3r4o
+yrr2
+ys2an
+y3s2c
+yse1
+y3s2h
+y4s3l
+ysme3
+ys2po
+ys1pr
+ys3t4
+y1s4ty
+y2s1u2
+y3s2z
+y1t2
+y2te.
+y2tes
+y3to1
+yu2r
+yure3
+y1v
+y1w
+y1y
+y1z2
+2z3a2b
+zab3l
+za1c
+z1a2d
+za3de
+2z1af
+za3gr
+3zah
+2z3a2k
+zale3
+2z1all
+2z1am
+3zambiq
+z1an
+za2na
+2z3anf
+3zani
+2z3anl
+2zarb
+2zarc
+z1arm
+z1arti
+zar2tr
+2z1arz
+z1as
+za1st4
+2z3at3
+3zaub
+z1au2f
+z3aug
+3zaun
+zä2
+2z1äc
+3z2äh
+2z1äm
+z1ärg
+z1ärm
+4z3b4
+zbü1b
+zbübe3
+2z3c
+2z3d2
+zdan2
+zdä1
+2z1e2ben
+2zecho
+2z1eck
+ze1e
+2z1eff
+zeik4
+zei3la
+zeile4
+2z1ein
+zei3s4
+zeist4
+zei2t1a
+zeit5end
+zei4t3er
+zei2tr
+ze2l1a2
+ze2len
+ze2l1er
+ze2l1in
+zell2a
+zel3sz
+zel3t2h
+zelu2
+2z1emp
+5zen.
+ze4n3ac
+zen3n
+ze2no
+zens2e
+zen4sem
+3zent
+zent3s
+zen4zer
+z2er.
+ze2r3a
+ze2re2b
+2z1ergä
+4z3ergeb
+z3erhal
+2zerhö
+zerin4t
+zerk2
+z2erl.
+2zerlö
+z2ern
+zer4neb
+zer4n3ei
+ze2ro
+2z1erq
+zers2
+2z1ersa
+4z3erste
+zert1a4
+zer4t3ag
+zert4an
+zer6tere
+zer4tin
+zer6t5rau
+4zerwei
+2z1erz
+3z2erza
+ze2sä
+ze3sc
+zes1e
+zes1i
+ze3sku
+ze2sp
+zessen4
+zes6s5end
+zes2sp
+zes2st
+ze2s3t
+ze3sta
+ze2tr
+2zetts
+2z1ex
+2z1f4
+2z1g2
+zger2a
+2z1h
+z2hen
+zhir3
+zi3alo
+zi3ar
+zid3r
+zi1erh
+ziers1
+zi1es.
+zil2e
+2z1imp
+zin2e
+zin4er
+2z1inf
+2z1inh
+zin1it
+zin2sa
+zin4ser
+4zinsuf
+2z1inv
+zi2o3
+zi3op
+zirk2
+zirk6s
+zi3s2z
+zi1t2h
+2z1j
+2z3k4
+2z1l2
+2z1m2
+zme2e
+2z3n4
+2z1ob
+2z1of
+zo2gl
+2z1oh
+3zol
+zon4ter
+zo2o
+2zope
+z1or
+zo2ri
+zor4ne
+2z1osz
+2z3ot
+2zö2f
+z1öl
+2z3p4
+2z1q
+2z3r2
+4z1s2
+z3sa
+z3sh
+z3sk
+z3sz
+2z1t
+z2t1au
+z4tehe
+z3t2her
+zt3ho
+zt1ins
+z3tö
+zt3rec
+zt3s2
+z3tü
+zu1
+zu3a
+zub4
+zu4ch
+zu3cke
+zud4
+zudi4
+zu2el
+zu3f4
+zu2g1ar
+zu4gent
+zu3gl
+zug1un
+2z1uhr
+zu3k
+2z1um.
+zumen2
+2zumf
+2zumg
+2zuml
+2z1ums
+zun2e
+zung4
+2zunt
+zup2fi
+zu3r2a
+z1urk
+2z1url
+2z1urs
+2z1urt
+zu3s4
+zu5t2
+zuz2
+2züb
+zür1c
+2z1v
+zw2
+z1wac
+4zwah
+zwan2d1
+z2wang
+z1war
+2zwas
+4zwäl
+2zweg
+z2weig
+z1weis
+2z1wel
+2z1wen
+2z1wer
+z2werg
+2z1wes
+2zwet
+4zwir
+z2wit
+2z1wo
+z1wör
+z1wur
+2z1wü
+4z1z
+z3z4a
+zzi1s4
+z3z2o
+zz2ö} \ No newline at end of file
diff --git a/tex/context/patterns/lang-de.rme b/tex/context/patterns/lang-de.rme
new file mode 100644
index 000000000..ac6e14344
--- /dev/null
+++ b/tex/context/patterns/lang-de.rme
@@ -0,0 +1,31 @@
+% generated by mtxrun --script pattern --convert
+
+% dehyphn-x-2009-06-19.pat
+
+\message{German Hyphenation Patterns (Reformed Orthography, 2006) `dehyphn-x' 2009-06-19 (WL)}
+
+% TeX-Trennmuster für die reformierte (2006) deutsche Rechtschreibung
+%
+%
+% Copyright (C) 2007, 2008 Werner Lemberg <wl@gnu.org>
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+%
+%
+% The word list is available from
+%
+% http://repo.or.cz/w/wortliste.git?a=commit;h=e4826ce7db99bceb6043be48983ff2b67d56669f
+%
+% The used patgen parameters are
+%
+% 1 1 | 2 5 | 1 1 1
+% 2 2 | 2 5 | 1 2 1
+% 3 3 | 2 6 | 1 1 1
+% 4 4 | 2 6 | 1 4 1
+% 5 5 | 2 7 | 1 1 1
+% 6 6 | 2 7 | 1 6 1
+% 7 7 | 2 13 | 1 4 1
+% 8 8 | 2 13 | 1 8 1
diff --git a/tex/context/patterns/lang-deo.hyp b/tex/context/patterns/lang-deo.hyp
new file mode 100644
index 000000000..a69a186cf
--- /dev/null
+++ b/tex/context/patterns/lang-deo.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-deo.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-deo.pat b/tex/context/patterns/lang-deo.pat
new file mode 100644
index 000000000..7ea7b0188
--- /dev/null
+++ b/tex/context/patterns/lang-deo.pat
@@ -0,0 +1,14386 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-deo.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z ß à á â ä ç è é ê ë í ñ ó ô ö ü
+
+\patterns{
+.ab1a
+.ab3l
+.abo2
+.ab3ol
+.ab1or
+.ack2
+.ag4n
+.ag4r
+.ag2u
+.ai2s
+.akt2a
+.al3br
+.al2e
+.al5l4en
+.al4tei
+.alt3s
+.ampe4
+.amt4s1
+.an3d2
+.anden6k
+.and4ri
+.ang2
+.an3gli
+.ang4s2
+.angst3
+.an3s
+.an4si.
+.ans2p
+.an4tag
+.an3th
+.aps2
+.ari1e
+.ark2a
+.ar4m3ac
+.ar2sc
+.ar4t3ei
+.as6sest
+.as2t
+.ata1
+.at4h
+.au3d
+.au2f3
+.aufs2
+.au2s1
+.ausch3
+.au6stes
+.ax2
+.äm3
+.ät2s
+.äu3
+.be3erb
+.bei6ge.
+.be3ra
+.be3r2e
+.berg3a
+.ber6gab
+.ber4g3r
+.boge2
+.bo4s3k
+.bu4ser
+.bus5sen
+.bu7sser.
+.ch2
+.dab4
+.da2r1
+.da4rin
+.darm1
+.da4te.
+.da4tes
+.de2al
+.de1i
+.de4in.
+.de1o2
+.de3r4en
+.derma3
+.dermas6
+.de3sk
+.dien2
+.do2mo
+.do1pe
+.dorf1
+.dü1b
+.ebe2r1
+.ehe1i
+.ei3e2
+.ei4na
+.einbus6
+.einen6g
+.ei2sp
+.ei2s1t
+.ei2tr
+.eke2
+.el2bi
+.em3m2
+.en1
+.en4d3er
+.en5der.
+.en2d3r
+.enn2
+.en2t3
+.epi1
+.er8brecht
+.er2da
+.er4dan
+.er4dar
+.er4dei
+.er4der
+.er1e
+.ere3c
+.erf4
+.er1i
+.ers2
+.er8stein
+.er8sterb
+.er8stritt.
+.er8stritten.
+.er4zen4
+.es1p
+.es2st
+.es2t
+.est4e
+.est2h
+.et2s
+.eu1
+.eu3g4
+.eu3t
+.eve4r
+.ext4
+.fä4s
+.fe2i
+.fer4no
+.fe4sta
+.fi4le.
+.fi4len
+.fi2s
+.flö8s7se.
+.flö8s7sen.
+.flö8sses
+.fs4
+.fu2sc
+.ga2t
+.gd2
+.ge5nar
+.ge3ne
+.ge3r2a
+.ge3r2e
+.ge3s4
+.get4
+.ge3u
+.grif8fes
+.guss1
+.haft3s
+.hal2s
+.hau2t1
+.he2
+.he3fe
+.her3an
+.he3ri
+.he6r5inn
+.ho4met
+.ia2
+.im2a
+.ima4ge
+.im5m
+.in1
+.in3e
+.ink4
+.inn2e
+.int6
+.inu1
+.ire3
+.is2a
+.jor3
+.ka2b5l
+.ka2i
+.kamp2
+.ka4t3io
+.ken6num
+.ker3s
+.ki4e
+.kle2i
+.kopf1
+.ks2
+.kus2
+.le4ar
+.li2f
+.lo4g3in
+.lo3ver
+.lö4s3s
+.lu4str
+.ma3d
+.ma2i
+.ma3la
+.ma4str
+.md2
+.me2e
+.mel2a
+.men8schl
+.men8schw
+.men3t4
+.mi2t
+.mm2
+.näs5c
+.ni4e
+.nob4
+.no2c
+.no2s
+.no4th
+.nul2
+.nus2
+.ob1a
+.obe2
+.ohr5s
+.om2a
+.oper4
+.or2a
+.ort2
+.orts3e
+.ort4st
+.oste2
+.ost5end
+.osten8de
+.oste6re
+.ost3r
+.ozo4
+.pa4r1e
+.par3t4h
+.pf4
+.ph4
+.poka2
+.po4str
+.ps2
+.ra4s3s
+.reb3s2
+.re3cha
+.rein4t
+.reli1
+.reli3e
+.ri2as
+.richt6e
+.ro4a
+.ro3m4a
+.rö2s1c
+.ru5s6ses
+.rü1b
+.rücker6
+.rü4ss
+.sali1
+.sas2
+.sa5sse
+.säs4
+.sä5ss
+.sch4
+.sen3s
+.ser2u
+.se2t1
+.sha2
+.sim3p4
+.si2te
+.ski1e
+.spas4
+.spä5s4
+.spiege8lei
+.st4
+.sto4re
+.sucher6
+.tal2e
+.tan4k3l
+.ta2to
+.te2e
+.te2f
+.te3no
+.th4
+.ti2a
+.tid1
+.ti2s
+.tite4
+.to4nin
+.to4pl
+.to2w
+.tras3
+.tra4ss
+.tri3e4s
+.ts2
+.tu3ri
+.uf2e2
+.ufer1
+.ul4mei
+.um3
+.umo2
+.un3a2
+.un3d
+.un3e
+.un3g
+.uni2t
+.ur1
+.ur2i
+.urin4s
+.ur3o2m
+.uro2p
+.ur3s2
+.ut2a
+.ut3r
+.übe4
+.ve5n2e
+.vo4r
+.wah4l
+.wa2s
+.weg5s
+.wei4ta
+.wi4e
+.wor2
+.wort5en6
+.xe3
+.ya4l
+.zeit3s
+.zi2e
+.zin4st
+2aa
+a1ab
+aa2be
+aa1c
+aa2gr
+4a1a2n
+4a2ar
+aa2r1a
+aar3f4
+aart4
+aas1t
+aat4s1
+a3au
+a1ä
+a1b
+2aba
+ab1auf
+ab1ä
+ab2äu
+1abd
+ab1eb
+abe1e
+ab1eil
+2abel
+abe2la
+2a3ber
+ab1erk
+ab1err
+ab1erz
+ab3esse
+abes2t
+ab1eß
+2abet
+2abew
+1abf
+3abfi
+1abg
+1abh
+2abi
+ab1ins
+ab1ir
+ab1it
+1abk
+ab1l
+1a2bla
+ab5lag
+1a2blä
+2able
+ab4le.
+ab3li
+ab4lo
+3a2blö
+a2blu
+abma3s
+1abn
+2abo
+a2bo.
+ab2of
+3a2bon
+ab3r
+a3bra
+a4brä
+2abrü
+abs2a
+1absc
+ab3s2i
+1ab3sp
+abs4t4
+1absta
+ab3sz
+1abtei
+2abu
+ab1ur
+2abü
+1abw
+2aby
+1abz
+2ac.
+2aca
+2ac1c
+a1cem
+2ach.
+ach1a
+a1chal
+ach3au
+2achb
+a1che
+a2ch1e2c
+ach1ei
+a4cherf
+a4cherk
+a4cherö
+a4ch3erw
+4achf
+a1chi
+ach3l
+ach3m
+ach3n
+a1cho
+a3cho.
+ach1o2b
+ach1or
+ach3ö
+ach3r
+ach3su
+a4cht
+acht5erg
+ach2t1o
+ach8traum
+ach8träume.
+ach8träumen.
+ach6trit
+a1chu
+ach1u2f
+ach3ü
+2achv
+4ach1w
+a1ci
+ac1in
+2ack.
+ack2en
+ackmu4
+ackmus3
+ack2se
+ack3sl
+ack3sta4
+a1cl
+a3co
+acon4n
+2acu
+a1ç
+a1d
+2ada.
+a3d2ab
+ad2ag
+adai4
+ad3ama
+a2d1an
+3a4dap
+a3d2ar3
+4adav
+1a2dä
+ad1c
+1add
+2ade.
+ade2al
+adefi4
+a2dein
+2aden
+ade1r2a
+a2deri
+4ades2
+ade3sp
+ades6s
+2adf
+2adh
+4a3di
+adi3en
+5adj
+2ado
+ad2ob
+2adp
+2adq
+2ad3rec
+ad4res
+ad3ru
+2ads2
+ad3sz
+2ad2t1
+2adu
+2a1e1
+ae2b
+ae2d
+ae2i
+a2ek
+a2ela
+a2ele
+ae2o3
+ae2p
+3a2er2o
+a2et
+a2ew
+ae2x
+af1a
+a2fak
+a2fan
+a3far
+af4at
+a2fau
+2afe
+a2f1ec
+a2fent
+af1erl
+a2fex
+af2fl
+af4flu
+2afi
+2af3l
+a2fö
+af3ra
+af3rä
+af3re
+af3rö
+af3s2a
+af2sp
+af2t1a
+af2tei
+af4t3erl
+af2t3r
+aft5re
+af2tur
+a2f3ur
+a1g
+2aga
+ag1ab
+ag1a2d
+ag1ar
+ag1au
+ag2di
+ag2dr
+ag2du
+age1i
+age4na
+age4neb
+a2gent
+a4gentu
+age4ral
+2ages
+age2sa
+age4sel
+age4si
+age2s3p
+ages5s
+ag3esse
+age6stem
+ag3gl
+1aggr
+3a2git
+2a2gl
+ag4la
+a4glö
+ag2n
+ag4ne.
+ag4nu
+a2g3re
+a2g3ri
+ag4ro
+agsa2
+ag4sam
+ag3sc
+ags3p
+ag6spo
+ag4sti
+ag2str
+2agt
+ag2th
+a2gund
+2ah.
+2a1ha
+ah4at
+2a1he
+a2h1erh
+a1h2i
+ahin3
+ahl3a2
+ah4l1ei
+ah4l3erh
+ah2lö
+ahl3sz
+ah4n1a
+ah2nä
+ahner4e
+ahnt2
+1ahor
+ah1o2s
+a2h3ö
+ahr1a
+ah3r2e
+ahre4s3
+ah3ri
+ahrta4
+ahr4tri
+2ah2s
+aht1s
+a1hu
+ah1w
+a1hy
+2ai
+aian3
+aid4s
+aids1t
+ai1e2
+aif2
+ai3g4
+a3ik.
+ai3ke
+ai3ku
+ai2lo
+a1ind
+ain4e
+a1ing
+ain3sp
+ai2sa
+a3isch.
+ai3s2e
+aiso2
+aiss2
+ais3sen
+ais5st
+a3iv.
+aive3
+a3ivl
+a3ivs
+a1j
+2ak.
+1a2k4ad
+2akal
+2a3kam
+2akar
+ak4at
+1a2kaz
+2akb
+2akc
+2akd
+4a1ke
+a2kef
+aken2n
+a2keu
+2a1ki
+2ak3l
+ak4li
+4ako
+2a1kr
+ak3rau
+3akro3
+2aks
+ak3sh
+2akta
+2aktb
+ak3te
+ak4tei
+2aktik
+ak2t3r
+ak3t4ri
+2aktst
+2a1ku
+a2kun
+4a3kü
+1akz
+a1la
+2ala.
+ala5ch2
+al1af
+ala2g
+al1age
+a3lal
+al1am
+alami5
+al3amp
+al1ana
+a2l1ang
+al1ans
+al1anz
+a2lar
+a3lar.
+a3lare
+al2arm
+al3arr
+ala2s
+al1asi
+al1ass
+2alat
+al1au
+al3aug
+a1lä
+al1äm
+alb3ein
+alb3eis
+al4berh
+al4b3erw
+al2b1l
+alb3li
+al2boh
+al2br
+alb3ru
+alb3s
+al2dä
+al2dr
+al3du
+2ale
+3a2l1e2b
+3a2l1ef
+a4l1eh
+a2l1ei
+a4l3ein
+a2l1el
+alen1
+al3ends
+a2leng
+ale2p
+al1epo
+a2l1erf
+a2l1erh
+al1erl
+3alerm
+a2l1ert
+3a2lerz
+a2l1esk
+ale4t
+al1eta
+al1eth
+a2l1eu
+a4leur
+3a2lex
+alf4r
+3algi
+al2gli
+1algo
+2ali
+ali4ene
+al2imb
+ali4nal
+al1ins
+a2linv
+alk1ar
+1alkoh
+alk3s2
+al2lab
+al2l3a4r
+al2lau
+al4lec
+al3lend
+all5erfa
+al3les
+alli5er.
+alli7ers.
+al2lob
+3almb
+2alo
+a2l1o2b
+alo2ga
+al1ope
+al1orc
+a2l1ö
+al2ös
+3alpe.
+1alph
+al3skl
+al4spal
+al2sum
+al3sun
+al2tak
+alt3eig
+al3ter
+al4t3erf
+al2tö
+al2tre
+al2tri
+alt3ric
+al2tro
+alt2se
+alt4stü
+a1lu
+al2uf
+a2lum
+al1umb
+al1ur
+4aly
+alzer4z
+al2zw
+2am.
+2am2a
+amab4
+amad2
+ama3g
+2amä
+2ambiq
+am4e
+2ame.
+a2meb
+ame2n1
+amer2a
+a2meri
+ame3ru
+a4mesh
+a3met
+a2mew
+a3mi.
+a3mie
+2a3mir
+a3mis
+ami3t2a
+ami3ti
+2aml
+am2mac
+2ammal
+am2mei
+am2min
+2amml
+am4mod
+am2mus
+ammu2t
+a2mö
+amp2fa2
+am3pr
+2ams
+am4schl
+1amt.
+am2t1a
+am2t1ä
+am2tel
+am4t3ern
+am2tö
+am2t3r
+am2tu
+2amu
+2ana.
+2anab
+ana3c
+anadi3
+a3nak
+an1alg
+ana4lin
+2anam
+2anan
+2anas
+an1äs
+1anb
+2anbu
+an3ch
+2and.
+an3dac
+and4art
+ande4sc
+an2dex
+an2d3rü
+and4sas
+and6spas
+and6s5paß
+and2su
+2andu
+and1ur
+2ane
+an3ec
+a3nee
+an2ei.
+an3eif
+an1e4k
+3a4n1erb
+an1eth
+1anf
+2anfi
+anft3s
+an3f2u
+4ang.
+1anga
+3angeb
+an2g1ei
+an4g3erf
+an4g3erl
+an4g3erz
+2angf
+2angh
+2angie
+ang1l
+an2gla
+2ango
+ang1r
+an2g3ra
+4angs.
+ang3sc
+ang6s3po
+1anh
+2a3ni
+an2id
+ani5ers.
+3a4nim
+a4nins
+2anj
+2ank.
+an2k1an
+an2kei
+an3kl
+an4klö
+an2k3no
+ank1r
+an2k3ra
+an2k3rä
+ankt4
+an2ky
+1anl
+anma3s2
+2anmu
+2ann
+3an3na
+3annä
+an3n2e
+an1od
+a3nol
+a2n1or
+a3nos
+a1nö
+1anr
+1ansä
+1ansc
+ans2en
+an2seu
+2ansh
+2ansk
+an3skr
+ans1pa
+1anspr
+ans2te
+an3s2z
+2ant.
+an2t3a4r
+1antá
+1antei
+3antenn
+an3t4he
+1anthr
+2anto
+anton4
+3antr
+ant3rin
+an2tro
+1antw
+2a1nu
+anu3s
+a1nü
+1anw
+2anwet
+2anzb
+1anzei
+2anzes
+2anzg
+an2z1i4n
+2anzs
+1anzü
+2anzw
+an2zwi
+2ao
+ao1i4
+a1op
+a1or
+a1os
+ao3t2
+a3ot.
+a1ö
+a1p
+2ap.
+2a3pa
+2ape
+a2pef
+a3pel
+a2pé
+a2pf
+ap2fa
+a3pfl
+a3phä
+a2pht
+2ap3l
+ap2n
+a2pot
+3appl
+ap3pu
+2apr
+2a3pu
+2aq
+2ar.
+a1ra
+a3ra.
+ar2ab
+ar3abt
+ara3d2
+a2r3al
+a3ra3li
+a2r1ang
+a2r1ans
+a2r1anz
+a2r3app
+2a2rar
+a2r1au
+a1rä
+1arb
+2arb.
+4arba
+ar2bau
+ar2bec
+2arben
+2arbi
+ar2bl
+2arbr
+ar2bre
+2arbs2
+2arbt
+2arbu
+ar2b3un
+1ar1c
+ar2dro
+2are
+a2rea
+ar1eff
+a4reg
+a2reh
+ar1ehr
+a2rein
+a4rek
+a3ren
+aren4se
+are3r2a
+ar2erf
+a2r1erh
+a2reri
+a2rerl
+are3u
+ar2ew
+2arf
+arf1r
+ar2f3ra
+ar2gl
+ar2gn
+2arh
+2ari
+ar2ia
+ari3e4n
+ari3erd
+ari3erg
+ari5ers.
+ar1im
+arin3it
+ar1int
+a3riu
+ar2kal
+ark3amt
+ar2k1ar
+ark3aue
+ark3lag
+ar2kor
+ar4kri
+arks4
+ark3sa
+ark3sh
+ar2les
+arm2ä
+ar4merk
+ar3m2or
+ar2nan
+arn2e
+2a1ro
+ar1ob
+a2r1o2d
+a2r1op
+a2ror
+2arr
+ar2r3ad
+arre4n3
+ar2rh
+arr3he
+2arsa
+ar4schl
+arse3
+ar3s2h
+2arsi
+ar3t2e
+ar2the
+art2i
+artin2
+2arto
+art3r
+ar4tram
+2arts
+2aru
+ar1uh
+ar1um
+a2rü
+2arv
+arwa2
+2ary
+ar2zä
+2arze
+1arzt
+ar2z1w
+as1ala
+asas2
+asa3sse
+as3au
+asau2s1
+as1ä
+a2sca
+a3sche
+a4schec
+a3schi
+asch3la
+a2schm
+a3schu
+4a3s2e
+a4seb
+as3e2m
+a4sex
+4ash
+a4s3ha
+as4hi
+asin2g
+2a5sis
+asi4st
+a3skop
+a4s3l
+a4sn
+a1so1
+as1o2f
+a3sol
+as1or
+as1p
+as3pan
+a4s2ph
+as2pi
+a4spl
+as2po
+a1spu
+as3s2a
+ass2e
+as2s3ei
+as3sel
+as3ser
+asserma6
+as3s2i
+as2s1p
+as4st
+ass1ti
+ass1to
+as5str
+as5stu
+2asta
+a3stä
+a4s3tep
+as2ter
+2astr
+as4trau
+a4s2t3rä
+a2s2t3re
+a4strol
+a2stum
+a3su
+a4sw
+aswa2s
+3a2syl
+aße2
+aßen3
+2a1t
+at1ab
+at2a1f
+at4ag
+a2t1akt
+ata3l
+a3tam
+at1apf
+at1au
+a2taus
+a2t1ä
+at2c
+at2e
+4ate.
+a2teb
+at3eig
+a4teli
+4aten
+a2tep
+ate2ru
+4ates
+atex3
+at2h
+at3ha
+4athe1
+3athl
+4a3ti
+atingma5
+3atm
+4atmus
+ato4man
+4ator
+a2t1ort
+a2t1ö
+4atr
+atra4t
+at3rä
+at3re
+at3rom
+at2sa
+at4schn
+at2se
+at4set
+at2si
+ats1p
+at3ta
+at4tak
+att3ang
+at4tau
+at2tei
+at3t4hä
+at2t3rä
+att3s4
+at3tu
+atu2n
+atz1er
+at4zerk
+at4zerw
+at2z1i
+at2zo
+atz3t2
+at2z1w
+a2u
+2au.
+2au1a2
+2aub
+au2bli
+au2blo
+4auc
+auch3ta
+au2dr
+2aue
+aue2b
+au3en.
+au2ere
+au5erein
+au2fa
+auf1an
+2aufe.
+2aufeh
+auf1er
+au4ferk
+auff4
+3aufn
+2aug
+4augeh
+au3ha
+4au1i
+au2is
+2auj
+aule2s
+au3lü
+4aum
+au2mal
+au2m1o
+aum3p2
+aum3s2
+4aun
+au3n4a
+aun2e
+au2nio
+au1nu
+a4unz
+2aup2
+aup4ter
+2au3r2
+au2s1ah
+ausan8ne.
+au2sau
+2ausc
+au4schm
+au4scho
+1ausd
+aus3erp
+au4s3erw
+1ausf
+1ausg
+1ausl
+au2so
+au2spr
+1ausr
+auss2
+3aussag
+au3sse
+aus4se.
+au8ssende
+au2sta
+au4stec
+auster6m
+aus3tie
+aus3tri
+1ausü
+1ausz
+au3ß
+a4ut
+2aut.
+au2t1äu
+2aute
+au4ten4g
+au4t3erh
+3auto
+2auts
+2auu
+2auw
+2aux
+2auz
+auz2w
+2a1ü
+2a1v
+a3v4a
+ava3t4
+4a3vi
+a2vr
+av2s
+2a1w
+awi3
+awi1e
+a1x
+ax2am
+ax2e
+axi2s
+2a1ya
+a1yeu
+aysi1
+ay3t
+2a1z
+az2a3
+az2o
+az2u
+ä1a
+ä1b
+ä5be
+ä2b3l
+äb2s
+ä1che
+äche1e
+ächenma5
+ächenmas8
+ä1chi
+äch3l
+ä2chr
+äch2sp
+ä1chu
+äck2e
+ä1d
+ä2da
+ä2d1ia
+ä2dr
+äd2s
+2ä1e
+äf2fl
+äf3l
+äf3r
+äf2s
+äft2
+äft4s
+ä1g
+ä5ge
+äge1i
+ä2g3l
+äg2n
+ä2g3r
+äg4ra
+äg2s2
+äg3sc
+äg3str
+1ä2gy
+äh1a
+2ä3he
+ä3hi
+ähl1a
+ähl2e
+äh4l3e4be
+2ähm
+äh3ne
+äh3ri
+2äh2s
+2äh3t4
+ä1hu
+äh1w
+ä1im
+ä1is.
+ä3isch.
+ä1isk
+ä1j
+ä1k
+ä2k3l
+ä2k3r
+ä1la
+älbe2
+äl2bl
+ä5le
+äl2l1a
+äl2p3
+äl4schl
+ä1lu
+ämi3en
+2äml
+äm4ma
+äm2s
+ämt2e
+2än.
+än5de
+än2dr
+2äne
+äne2n1
+än2f5
+2änge
+än2gl
+än2gr
+äng3se
+2ä3ni
+änk2e
+än2k3l
+än2kr
+än3n4e2
+2äns
+än2s1c
+änse3h
+ä1on
+ä1pa
+äp2pl
+äp2pr
+äp2s1c
+1äq
+ä2r3a2
+är4af
+är1ä
+är1c
+4äre
+ä2r1ei
+äre2n
+ä2r1ene
+är2gr
+är1int
+är2k3l
+är4ment
+ärme3s
+är1o2
+ä1rö
+ärse2
+är2seb
+är2si
+ärt4e
+är2th
+ärt4s3
+ä2rü
+1ärz
+är2zw
+ä3s
+äs4c
+äs4e
+äse3g2
+äser4ei
+äse4ren
+äser2i
+äse3t
+ä5si
+ä4sko
+äskop2
+äskopf3
+äs2kr
+ä4sl
+ä4s1p
+äs2s
+äs4s1c
+äss2e
+äss3erk
+äs4s1t
+äst2
+äs2te
+ä4str
+ä4sw
+ä1ß
+äß1erk
+ä2t1a2
+ä3te
+ät2e1i
+ätein2
+äte2n
+ä2t2h
+ä1ti
+ä1to
+ät1ob
+ät3r
+ät2sa
+ät2sä
+ät4schl
+ät4schr
+ät2s1i
+äts3l
+äts1p
+ät2s1t
+ät4s3te
+ät4sti
+ät2tr
+ä1tu
+ät2zw
+äu2br
+äu1c
+äude3
+äu3el
+ä2uf
+äuf2e
+1äug
+äu4g3l
+2äul
+2äum
+äu2ma
+äum2s1
+ä2un
+äun2e
+äu1nu
+2äur
+äu1s
+2ä3us.
+äu4schä
+äu4schm
+äu3se
+ä3usg
+ä3usk
+ä3usn
+äu2sp
+äu3s2s
+äuss1c
+1äuß
+äu2tr
+4ä1v
+1äx
+ä1z
+â1t
+á1n
+ba2bl
+2b1abs
+bach7t4e
+backs4
+b1a2dr
+2b1af
+bah2nu
+bais2
+ba2ka
+ba2k1er
+ba2k1i
+bak1l
+bak1r
+ba2kra
+3bal
+bal2a
+bal2lä
+bal4leb
+bal4leh
+bal6lerg
+bal4lig
+bal3th
+2b1am
+ban2a
+3b2and
+ban2dr
+ba3n2e
+b1ang
+ban2k1a
+ban4kl
+ban2kr
+2banl
+2b1ans
+ban3t
+b1anz
+bar3b
+bar3de
+ba2rei
+bar2en
+bar3n
+bar3zw
+3bas
+ba3s2a
+ba2sc
+ba2str
+bau3g
+bau3s2k
+bau3sp
+ba1yo
+3b2äc
+bä1ch
+b2är
+b2ä4s3
+4b1b
+b3be
+bbe4p
+bb3ler
+bb2lö
+bbru2c
+bb2s
+bbu1
+2b1c
+2b3d4
+3be.
+3bea
+be3an
+be3ar
+be3as
+3beb
+b2ebe
+1bec
+be1ch
+be2del
+bedi4
+be1eh
+be2erk
+be1erl
+be1eta
+3bef4
+be3g2
+2b1eier
+bei1f4
+beik4
+beil2
+bei3la
+2b1eime
+b2ein
+be1ind
+be1in2h
+bei3s2
+beit2s
+3bek
+3bel
+be3las
+be3lec
+be3lei
+be2l1en
+be2let
+be3li
+bel3la
+bel3li
+bel3sz
+bel3t4
+1bem
+bema5sse
+bemas8sen
+1ben.
+ben3ar
+ben3dor
+be3nei
+3ben3g
+be3n2i
+ben3n
+ben2se
+ben4spa
+ben4spr
+benst4
+ben2su
+2bentb
+b2enti
+bent4r
+b1ents
+2bentw
+ben3un
+ben3z2
+be1o
+be1ra
+ber3am
+be2ran
+beras4
+ber4ei.
+be4r3eiw
+be4rerk
+bere4s
+ber6gan.
+bergeschos8
+bergescho7sse
+ber4in.
+ber3iss
+berma7sse
+bermas8se.
+berma8ssen
+ber3na
+b1ernt
+be1rop
+berö4
+ber3st4a
+be3rum
+3bes
+bes2a
+besä5s
+be2s1er
+be5slo
+bes2po
+bess4e
+b3esst.
+bes3sz
+be6stein
+be4s3tol
+be4stor
+be3s2ze
+3bet
+be2tap
+be3tha
+be1ur
+3b2ew
+2b1ex
+1bez
+2b5f4
+bfal2
+bflö4
+bflös3
+2b1g2
+bgas1
+bga4st
+bge3
+bges2
+2b5h2
+bhut2
+1bi
+bi3ak
+bib2
+bibe2
+bie4str
+bik2a
+bi2ke.
+bi2kes
+3bil
+bil2a
+bi2lau
+4b1illu
+bi2lu
+2b1inb
+bin2e
+2b1inf
+bin3gl
+2b1int
+bi2o1
+bio3d
+bi3on
+biri1
+bi3se
+b1iso
+bi2sol
+bi2sp
+bis4s1c
+bis3si
+bi2stu
+bi2stü
+b2it.
+b2ita
+b2ite
+bi2tu
+bi3tum
+b2i3tus
+biz2
+4b1j
+bjek4to
+2b1k4
+bl2
+2bl.
+bla3b6
+b3lad
+b2lanc
+3blat
+b2latt
+2b3law
+b2le
+3ble2a
+b3leb
+2b3leg
+2b3leid
+b3lein
+3blem
+3blen
+b3lese
+ble3sz
+b4let
+b3leu
+2blich
+3blick
+b2lie
+2blig
+bling4
+b3lis
+b2lit
+3blitz
+b2lo
+b4loc
+b3los2
+blo3sse
+blös4s
+2blun
+3blut
+3blü
+2b1m
+bmas2
+4b3n2
+bni2
+bnis1
+bo4a
+bo5as
+b1ob3
+bo2bl
+bo2br
+bo1ch2
+bo3d2
+boe1
+bo2ei
+2b1of
+bo3fe
+bo1is
+bo2l1an
+3bon.
+bond1
+bon2de
+bo2ne
+3bons
+b1op
+bo1r2a
+bo4rä
+bor2d1i
+bor2d3r
+bo2rei
+bo4rig
+b1ort
+bor2t3r
+bo2sc
+bo4s3p
+bote3n4e
+bo3th
+bot2s3t
+bo2xi
+bö2b3
+2böf
+2b1p2
+bpa2g
+2b1q
+b2r4
+2br.
+b4ra.
+2b3rad
+b4rah
+b4ra3k
+bra4ss
+brast4
+3brä
+brä4u
+2bre.
+3brea
+6b5rechte
+2b3ref
+2breg
+b3reif
+3brem
+2b3rep
+b4rer
+2b3riem
+bri2er
+2brig
+b4rio
+bro1
+b3roh
+2b3rol
+b4ron
+b4ruc
+bru4s
+brust3
+bru2th
+3brü
+brü4ss
+4b1s
+b2s1ad
+b3sand
+bs3ar
+bsas2
+bsa3sse
+bsat2z
+b3sä
+b4sär
+b5sc
+bs2ca
+b6schan
+b6schef
+bs4cu
+b3se.
+bs1e2b
+b3sel.
+bs1ele
+bse2n1
+b3sen.
+bs1ent
+bs1er
+b4serf
+bs3e4r3in
+b4sers
+b3ses
+b3set
+bsi2t
+bs2ku
+b4sl
+b2s1of
+bs1op
+bso2r
+b2sö
+bs2pl
+b3s2pu
+b4ss2
+bs2t
+bst1a2b
+bst3ac
+bst1ak
+b3stä
+bs3tät
+bst3er
+b4stern
+b2stip
+b3sto
+b4stod
+b3stö
+b3stra
+b2s3trä
+bs3treu
+b3stü
+b4stüb
+b2s1un
+4b1t
+b3ta
+btal3
+bta4st3r
+b5te
+b2th
+bt4r
+bts2
+btü1
+bu2chi
+bu2e3
+bu2f
+bu3li
+bul2la
+2b3umk
+bunde4s
+b2urg
+bu3r4i
+burt4s
+bu2sa
+bu4s3cha
+bu4schl
+bu4schm
+bu4schw
+bus1er
+bu2sin
+bu2s1p
+bu4sses
+bu6sterm
+bu2s1tr
+bu2s1u
+bü1c
+bügel3e
+bü3s4
+2b1v
+2b1w
+bwel3
+3by1
+by3p
+bys2
+2b3z2
+bzeit1
+bzu1
+1ca
+2c1ab
+ca1ch
+ca2e3
+ca3g4
+ca1h
+cal3t
+c4an
+ca2pe
+3car
+car3n
+carri1
+ca3s2a3
+cas2t
+ca3t4h
+ca1y2
+cä1
+cäs2
+2cc
+c1ce
+c1ch2
+c2d2
+c3do
+2cec
+ce2dr
+2cef
+ce1i
+2cek
+1cen
+cen3g
+ce1nu
+1cer
+cere3
+ce1ro
+ce3sh
+1cet
+2ceta
+ce1u
+1cé
+c1f
+c4h
+4ch.
+2chab
+ch3a2bi
+2ch1ak
+ch2anb
+3chanc
+ch1ang
+ch3anst
+2chanz
+1chao
+2char.
+1chara
+3charta
+cha2sc
+1chato
+2chatu
+ch1ärm
+ch1äs
+1châ
+2chb
+6chc
+2chd
+ch3e4ben
+1chef
+3chef.
+che4fer
+3chefs
+4chei
+ch1eim
+4chelem
+che4ler
+4chents
+4chentw
+cher3a
+che3rei
+6chergeb
+cher6zie
+ch1ess
+2cheta
+2ch1e4x
+1ché
+2chf
+2chg
+2chh
+1ch1ia
+chi3na
+4chind
+3chines
+2chinf
+2chinh
+ch1ins
+ch1int
+2ch1inv
+1chiru
+2chj
+2chk
+2chl2
+ch2le
+ch3lein
+ch2lu
+4ch2m
+2chn4
+chner8ei.
+2chob
+cho2f
+ch1off
+ch1oh
+ch1orc
+2chp
+ch2r4
+2chre
+chre3s
+ch3rh
+1chron
+4chs
+ch4stal
+2cht
+2chuf
+2chuh
+2ch1unf
+2chunt
+2chü
+2chv
+2chw
+2chz
+ci1c
+ci2s
+c1j
+2c4k
+ck1a
+ck3an
+cka4r1
+ck1ä
+ck1ehe
+ck1ei
+ck1ent
+4cker
+cke2ra
+ck2ere
+ck1erh
+ck2ern
+ck1err
+ck1ese
+ck1id
+ck1im
+ck1in
+ck3l
+ck3n
+ck1o2
+ck3r
+ck4stro
+ckt2e
+ck1um3
+ck1up
+c4l2
+clet2
+clo1
+1clu
+c2m2
+1co
+co1ch
+co2d2
+co4der.
+co3di
+coff4
+coi2
+co1it
+co2ke
+co2le
+col2o
+com4te.
+comtes4
+con2ne
+co2pe
+co1ra
+cor3d
+co3re
+cos4
+co2st
+co2te
+2cp
+c1q
+1c4r2
+cre2
+cre4mes
+cry2
+2c1s2
+c2si
+4c1t
+cte3e
+cti2
+cti4o
+ctur6
+3cu
+cu2p3
+cussi4
+1cy
+c1z
+3da.
+da1a
+2d1ab
+d2abä
+da2ben
+3d2abl
+da2bre
+dab4rü
+2d1ac
+dach3a
+dachgeschos8
+dachgescho7sse
+da2cho
+4d3achse
+d1af
+d1ag
+dagi2o
+dah3l
+da1ho
+3d4ai2
+da1in
+da1is
+dal2a
+2d1alar
+dal3b2
+da3lö
+d1alt
+d1amma
+2d1ammä
+damo3
+d2amp
+dampf8erf
+2d1amt
+d2an.
+2d1ana
+dan4ce.
+2d1an3d2
+d1ang
+2dange
+dan4kl
+dan5kla
+dan2k1o
+dan2kr
+2d1ans
+2dantw
+2danw
+d2anz.
+4danzi
+2d1ap
+d2aph
+4dapp
+da2r3a
+2darb2
+3d2arl
+dar2ma
+dar2m1i
+da2ro
+d3arr
+d2ars
+d1art
+da2ru
+d2arw
+da3s2h
+dat4e2
+da3tei
+date4n
+4d3atl
+4datm
+3dau3e
+2d1au2f
+2d1aus
+4daush
+2d1äh
+2d1ämt
+2d1änd
+2d1äng
+2d1äp
+2därz
+dä2u
+dä3us
+2d1b4
+dbu2c
+dbu3s2
+2dc
+d1ch
+dco4r
+2d1d2
+ddar2m
+d3dh
+d5do
+1de
+de2ad
+de3as
+de3a2t
+de3b4
+2d1e4ben
+3dec
+de1ch
+deco3
+de1e2
+2d1eff
+deg2
+de3gl
+dehe2
+de3ho
+2d1ehr
+d1ei
+d2eic
+3d2e1im
+dein2d
+dein2s
+de2l1a4g
+de4l3aug
+del1än
+del1ec
+delei4g
+de3lein
+2d1elek
+2delem
+2delfm
+delle2
+del4lei
+del2lö
+de2l1ob
+de2lop
+de3lor
+de2lö
+del4san
+del2s5e
+del2so
+del2s1p
+del3t4
+dem2ar
+2d1emp
+d2en.
+de4n3end
+4denerg
+den3g
+d2enh
+de2ni
+den4k3li
+4den4sem
+den4sen
+den6s5tau
+den3th
+2dentw
+de1nu
+de1on
+depi4so
+d4er.
+dera2b
+de2rap
+der2bl
+2derdb
+de2re2b
+de4reck
+der3edi
+derer3
+de3r4erb
+de3r4erf
+de4r3ero
+derer4t
+4d3erhöh
+3derie
+derin4f
+4derklä
+der3m2
+4derneu
+de1ro
+de2rop
+derö4
+4d3ersat
+der3tau
+der6t5en6d
+de3ru
+de4ruh
+de4rum
+de2s1a
+de3sac
+de4sa4g
+de4sam
+des3an
+des1än
+de4seh
+des1en1
+des1et
+des1in
+des1o
+de2sor
+de2s1p
+des5s2
+dest5alt
+de4stam
+de6stant
+de4stei
+de4stit
+dest5rat
+de3stri
+de3stro
+de2s1u
+deten4t
+2d1etw
+de1un
+de1url
+de3us
+de2xis
+2dexp
+2d1f4
+2d1g2
+dga4str
+d2ge.
+dgeschos8
+dgescho7sse
+dge2ta
+dge4t1e
+d3gl
+2d1h2
+d2his
+1di
+di4ab
+di2ad
+di4am
+3dic
+di1ce
+di2e
+di3e2d
+die4neb
+di3eni
+di3ens.
+die4s3c
+diet3
+die2th
+dige4s
+dik2a
+dil2s3
+2d1imb
+din2a
+2d1ind
+2d1inf
+2d1inh
+2d1in1it
+4d3inner
+2d1ins
+2d1int
+di2ob
+dion5s
+di1p
+di4re.
+di2ren
+di2ris
+2d1irl
+di2sp
+2d1isr
+dist2
+di2ta
+di4teng
+di4t3erl
+di4t3erm
+di4t3ers
+di2t3r
+dit1s
+di2tu
+di5v
+diz2
+2d1j
+2d1k4
+4d1l2
+d3le
+dle2ra
+dli2f
+dl3m
+dl3s
+2d3m2
+4d5n2
+dni2
+dnis1
+d1ob
+d2oba
+2dobe
+dob4l
+d2obr
+do1chi
+2d1o2f
+doll2
+do2mar
+do5n4a
+doni1
+do2o
+2dope
+2d1opf
+d2opp
+d2o3r4a
+2dorc
+2dord
+dor2f1a
+dor2fä
+dor2fl
+dor2fr
+2d1org
+do2rie
+d2orp
+2dort
+dor2ta
+d2os.
+dos3s
+do4sta
+dost1r
+dot6h
+do3un
+d1ö
+dö2l1
+3d2ör
+dö2s1c
+2d3p2
+2d1q
+d2r4
+3d4ra.
+2d3rad
+2drahm
+d3rai
+3d4ram
+d3rand
+2d3rast
+2d3rauc
+2dräd
+d4räh
+2d3rät
+2d3räu
+4dre.
+d4rea.
+d4reas
+3d4reck
+2dreg
+3d4reh
+2d3reic
+d4reiv
+4drem
+4d3ren
+2d3rep
+4d3rer
+4dres.
+d4resc
+2d3rh
+d3ri
+d4ri.
+3d4ria
+2d5ric
+d4rid
+d4rie
+d5rieg
+d4rif
+d4rik
+d4ril
+d4rin.
+3d4risc
+2driß
+3d4rit
+4dritu
+d3rob
+d3roc
+2d3rod
+d4roi
+drom2
+2d3rot
+d3rou
+2d3rov
+d3rö
+drö2s1
+d5rub
+3d4ruc
+2d3ruh
+drunge3
+2d5rut
+drü1b
+2d1s
+ds3ab
+d4s1amt
+d2san
+ds3assi
+d2sau2
+ds1än
+4dsb
+d4schef
+d4schin
+dsch4r
+d2s1e2b
+d2s1ef
+d3sei
+ds2eig
+d4seins
+d2s1eng
+d2s1ent
+d2s1erf
+d2serh
+d2s1erk
+ds1err
+d2s1erz
+dse4t
+d2s1eta
+d3s2ha
+d3sho
+d2s1im
+ds2inf
+d3s2kan
+d3skul
+4dsl
+d2s1op
+dso2r
+ds1ori
+d2sö
+d2s1par
+ds1pa4s
+d2spä
+ds2po
+d2spro
+ds2pu
+dss2
+ds3si
+dst4
+ds1tab
+d4s3täti
+d4stea
+ds2til
+ds2tip
+d2s1tis
+d2stod
+ds1ums
+d2sun
+ds2zen
+2d1t
+dta2d
+d3tea
+d2th
+d4thei
+dt3ho
+dto2
+dt3r
+dtran2
+dt5s2
+1du
+du1alv
+du1ar
+dub3l
+du2bli
+du2f
+2d1ufe
+2d1uh
+du1i
+2d1umb
+2dumd
+2d1u2m1e
+2dumf
+2dumg
+2d3umk
+2duml
+d2ump
+2dumr
+d1ums
+d2ums.
+2d1umv
+2d1un3d
+dund2a
+2d1unf
+dun3ke
+dun2kl
+2dunr
+2dunt
+du1o
+dur2c
+2d1url
+2dursa
+du4schn
+du4schr
+du4schw
+2düb
+3düf
+3dün
+2d1v2
+2d1w
+dwa2
+dwest3
+dy1
+dy2s1
+2d1z
+2e1a
+e3a2b
+eab3l
+ea3der
+eadli4
+ea2dr
+ea2g4
+ea3ga
+ea4ge
+ea3gl
+eakt2
+ea2la
+e3alei
+e4aler.
+e2ame
+eam1o
+eam3t
+ea2na
+e2ano
+e3ar.
+ea2ra
+e3a4rene
+e3arr
+e3arv
+e2as
+eas5s
+eat4e2
+eater1
+e3ath
+eat3s2
+e3at3t4
+e3au2f
+e3aug
+eaus3s
+eau3st
+e1ä4
+e1b
+2eba
+e3b2ak
+2ebed
+ebe2i
+2ebel
+eb2en
+ebens3e
+2ebet
+2ebl
+eb3ler
+eb4leu
+e3blie
+eb3lo
+eb2lö
+2eb2o
+ebö2s
+2ebr
+eb3rei
+eb4ru
+eb2s
+eb6sche
+ebse2
+ebs1i
+ebs1o
+ebs1p
+ebs3pa
+eb4stät
+ebs3t2h
+eb4s3ti
+eb4s3tot
+eb3str
+ebs1u
+e3bu
+ebus3s
+ebu2t1
+2eca
+e1ce
+ech1ä
+2e3che
+ech1ei
+e6ch5erzi
+e1chi
+ech3l
+ech3m
+ech3n
+e2cho.
+ech1o2b
+e2ch3r
+ech3ta
+ech3t4ei
+e1chu
+ech1uh
+ech1w
+e1ci
+eci6a
+eck3se
+2eckt
+2e1cl
+2eco
+2ect
+e1d
+e3d2a
+ed2dr
+ed2e
+ede2al
+ede4c
+e3dei
+ede3n2e
+eden4se
+eden4s3p
+ede2r
+eder3t2
+edi4al
+edma3s2
+e3d2o
+ed2ö
+eds2ä
+ed2s1es
+ed2s1o
+ed2s1p
+ed2s3tr
+ed2su
+edu2s
+e3dy3
+4ee
+ee3a2
+eeb2l
+ee2ce
+ee1ch
+ee2cho
+eede3
+eed3s2
+ee1e
+e1eff
+eef4l
+eeg2
+e1ei
+ee1im
+eein4se
+eei5se
+eel2e
+e1e2lek
+ee3len
+e1emp
+e1en
+eena2
+ee4nag
+e2enä
+e2enc
+ee3ni
+e2eno
+een3s
+e1e2pi
+ee1ra
+e1erbt
+e1erd
+eerde3
+ee3r2e
+ee4r3en4g
+eere4s1
+ee4ret
+e1erk
+ee1ro
+ee1rö
+eer2ös
+eert2
+e1ertr
+ee3r2u
+e1erz
+ees2
+ee3sh
+ees3k
+ee3ta
+ee4tat
+ee2th
+ee1u2
+eewa4r
+e1e2x
+e1f
+2ef.
+2efa
+e2f1ad
+ef1ana
+ef1ar
+e2fat
+efäs4
+e2fäu
+2efe
+e3fe.
+e2f1e2b
+ef1em
+e2fent
+ef2er
+2eff.
+1effi
+ef2fl
+2efi
+e2f1i2d
+e2f1ins
+efi2s
+1efku
+2efl
+e3f4lu
+2e3f2o
+e3fra
+ef3rea
+ef3rol
+ef3rom
+ef4rü
+efs2
+ef3so
+ef3sp
+ef2tan
+2efu
+e2fum
+2efü
+e1g
+egd4
+e3ge
+ege4n3a4
+ege2ra
+ege4s3to
+ege4str
+ege1u
+eg1la
+e2glo
+e2gn
+eg3ni
+egro5sse
+eg4sal
+eg3se
+eg4sei
+egse4r1
+eg4sto
+eg2th
+2egu
+2e1ha
+eh1ach
+e3h2al
+eh2aus
+2e1hä
+ehäs3
+e1he
+eh2ec
+eh1eff
+eh2el
+ehen2t3
+1e2hep
+e3her
+ehe1ra
+e1hi
+eh1int
+ehis4
+eh1lam
+eh1lä
+ehle2
+ehl3ein
+eh4lent
+eh5l2er
+eh2lin
+eh3lo
+ehl2se
+2ehm
+eh3mu
+e1ho
+e3hol
+eh2r1a2
+ehr1ä
+ehr1ec
+eh2rei
+ehr3erl
+ehr6erle
+ehre3s
+eh3ri
+eh1ro2
+ehr1ob
+ehr1of
+eh2s2
+eh3se
+eh3sh
+eh3si
+eh3so
+eh3sp
+eh3sta
+e1hu
+e2hunt
+e1hü
+eh3üb
+eh1w
+e1hy
+2ei3a2
+4eib
+ei2bar
+ei2bl
+eibu4t
+ei4b3ute
+ei2cho
+e2id
+ei2d1a
+ei3dan
+ei3de
+ei4d3err
+2eidn
+ei3dra
+eid2sc
+ei1e
+4eien
+eienge4
+eie4s
+1eifr
+ei3g2a
+4eigeno
+eig2er
+2eigew
+ei3gl
+1ei2g3n
+2eigru
+2eigt
+2eigu
+eik2ar
+ei3kau
+eik4la
+e4il
+2eil.
+ei2lar
+ei2lau
+2eilb
+eil3d
+ei4lein
+eilen1
+eil3f4
+eil3ins
+2eiln
+1eilzu
+ei2m1a4g
+eim3all
+ei2mor
+e1imp
+eim2pl
+ei2n1a
+ei4nas
+ei2nä
+ein3dr
+2eindu
+ei4neng
+ei2neu
+2einfo
+ein4fo.
+ein4fos
+ein3g2
+ein4hab
+e1init
+ein3k
+ein6karn
+3einkom
+ei2n1o2
+einsas4
+einsa7sse
+3einsat
+ein6stal
+ein4sz
+e4inver
+ei3o2
+ei1p
+eip2f
+2eir
+ei3re
+e1irr
+e2is.
+ei2sa4
+ei6schin
+ei6schwu
+ei4s3erw
+eis2pe
+ei3s2s
+ei2str
+ei2sum
+e2it
+ei2tab
+ei2tan
+ei2tar
+2eitä
+ei3te
+ei2th
+ei2tro
+eitt4
+eit3um
+2eiu
+2e1j
+e1k
+ek2a
+1ekd
+e3ke.
+e3ken
+e3kes
+e3key
+e3k2l
+ek4n
+ek2o
+ek4r
+2ekt
+ekt4ant
+ekt3erf
+ekt3erg
+ek4t3erz
+ekt2o
+ek2u
+e3k2w
+e1la
+ela4ben
+el2abt
+el1af
+ela2h
+e2l1ak
+e2l1a2m
+el1ans
+el1anz
+2elao
+e2l1ap
+e2l1a2r
+el3ari
+el1asi
+el1asp
+el2ast
+2e1lä
+3elbis
+el2da
+eld5erst
+el4d3erw
+eld3s2
+2ele.
+2eleh
+2elei
+e6l5eier.
+e2l1ein
+e3leine
+e4leing
+e2l1el
+1e2lem
+e3lem.
+el1emp
+2e3len.
+e4lense
+e2l1ent
+e3lep
+el1erd
+el1erf
+e4ler4fa
+e2l1erg
+el1erk
+el1erl
+e4ler4la
+e4l3ernä
+e2l1err
+2eles2
+el1ess
+e4l1e4ta
+e3leu
+2elev
+ele2x
+1elf.
+el3fe
+elf4l
+1elfm
+1elft
+elgi5er.
+elgi5ers
+2eli
+e2l1id
+e3lie
+eli2ne
+el1ita
+el3kl
+elks2
+el3lan
+ell2au
+el2leb
+ell3ebe
+el4l3ein
+ell3eis
+el3ler
+el2lic
+el3l2in
+ell3sp
+elm2a
+2eln
+el5na
+2elo
+e2lof
+e2lol
+elon2
+el1ope
+e2l1or
+elo2ri
+el2öf
+el2sum
+elt2ak
+elte2k
+el4t3eng
+el4tent
+3eltern
+el3tes
+elto2
+el2t3r
+el3tri
+elt1s2
+elt3se
+elt3sk
+2e1lu
+e2l1um
+el1ur
+el3use
+e1lü
+e2lya
+2elz
+elz2e
+el2zwa
+e1m
+2ema
+e2m1ad
+ema2k
+e2m3anf
+e2mans
+3emanz
+emas8sens
+em2d3a2
+e3m2en
+emen4t3h
+e6mentsp
+e2m1erw
+1e2meti
+e2m1im
+em1int
+emi3ti
+2emm
+em2map
+emma3u
+em2mei
+e2mop
+3empf
+em3pfl
+em2p3le
+em2sa
+em2spr
+em3t2
+1emul
+2emü
+emü3s
+e2n1a
+4ena.
+2enac
+e3nad
+e4naf
+4enah
+e4nak
+ena3l2i
+4enam
+en4ame
+e4nand
+en3ang
+en3are
+en2asc
+4enat
+en3att
+e3naue
+e2n1är
+en1äu
+enbu4s3
+en2ce.
+en3d2ac
+en2dal
+endermas8
+en4d3ess
+end4ort
+end3rom
+end3si
+end3s2p
+end3sz
+end2um
+2ene.
+ene4ben
+en1ec
+e2neff
+e4nein
+e2n1el
+ene4le
+2enem
+2enen
+e4n1ent
+en4entr
+4e3ner.
+e2n1erd
+e2nerf
+1e2nerg
+e4nerh
+e4nerk
+e2n1erl
+e4n3ermo
+4enern
+e2n1err
+e2n1ers
+e2n1ert
+e2n3eru
+e2n1erw
+e4nerz
+2enes
+e4n3ess
+en3f
+enf2a
+enf2u
+1engad
+3engag
+en3ge
+en3g2i
+en2gl
+en3glo
+1engp
+eng1s
+eng3sc
+eng3se
+e3ni.
+e3nic
+e4nid
+e3nie
+eni3er.
+eni5ers.
+e2n1i4m
+e2n1in
+e3nio
+2enis
+eni3se
+e3nit
+2eniv
+en3k2ü
+e2n1o2b
+enob4le
+e2nof
+en1oh
+e3nol
+eno2ma
+en1on
+e2n1op
+e2n1o2r
+eno2s
+enost3
+e3not
+eno2w
+2e1nö
+en1ö2d
+e4nr
+en3sac
+ensas2
+ensa5sse
+en2sau
+en5sch4e
+en2seb
+1ensem
+ensen1
+ens3eng
+en3ska
+en3s2po
+enst5alt
+en4s3tät
+en6s5test
+2ensto
+en6s5trie
+e4nt
+ent4ag
+1entd
+en2teb
+en4terb
+en3tes
+1entfa
+3entga
+en2thi
+3entla
+1entn
+en4t3rol
+3entspr
+2entü
+1entw
+4entwet
+1entz
+en1u
+2enut
+e1nü
+4enwü
+e1ny
+en4z3erf
+en4z3erg
+en4z3erk
+enz3ert
+e1ñ
+2eo
+e1o2b1
+e1of
+eo2fe
+e1oh
+e4ol
+e1on.
+e1ond
+e1onf
+e1onl
+e1onr
+e1ons
+e1ope
+e1opf
+eop4t
+e1or
+e3or.
+e3orb
+e3ors
+e3orw
+eos2
+e3os.
+eo3ul
+e1ov
+e1ö2
+e1p
+e3pa
+epa2g
+e3p2f4
+1episo
+ep3le
+1e2poc
+ep2pa
+ep4pl
+ep2pr
+ept2a
+ep2tal
+e3pu
+epu2s
+e1q
+er1a
+e3ra.
+e3rad.
+er3adm
+eraf4a
+era1fr
+era2g
+e1rai
+er3aic
+e2rak
+e1ral
+er3all
+eran3d
+e3rane
+er3anf
+e2ranh
+er3anm
+e1rap
+er3apf
+e2rar
+e3rari
+e1ras
+e2r3a6si
+era4s3s
+era2ß
+e2rath
+e3rati
+e2ratm
+e1raub
+er3aue
+erau2f
+er3aug
+e1raw
+e1raz
+e1rä
+er1äh
+er1äm
+erä4s
+erb2e
+er3br
+erb4sp
+er1c
+er3chl
+er3da
+1erdb
+er3de
+2erdec
+erd3erw
+4ere.
+er1eb
+e3rech
+er3echs
+er1eck
+ere4dit
+er1eff
+e2r1e2h
+4e3rei.
+er1eig
+e2rein
+e4r3eis.
+ere2l
+er1ele
+2e3rem
+2eren
+e3ren.
+e3rena
+e4rense
+e4r3entf
+e4rentn
+e3renz
+eren8z7end
+2erer.
+e2r3erf
+e2r1erh
+e4rerl
+2erern
+e3rero
+er1err
+er1ers
+e2rert
+er1erw
+2eres
+er1ess
+er1eß
+er3e4ti
+er1eul
+ere4vid
+erf2e
+erf4r
+4erfür
+3ergebn
+4ergehä
+erg3els
+1ergol
+e2r3h
+1erhab
+2erhü
+2eri
+e2riat
+e3rib
+4e3ric
+4e3rie
+eri3e4n3
+eri5ers.
+e3ri3k4
+4e3rin.
+er1inb
+e2r1ini
+er1ink
+er1int
+e3rio
+er1ita
+2erk.
+1erklä
+2erkli
+2erkre
+erk3t
+3erlebn
+ermen4s
+erm3ers
+ern1os
+e1ro.
+er3oa
+er1o2b
+e2r1of
+e1rog
+e1r1oh
+e1rok
+e1rol
+e1rom
+e3ron
+er1o2p
+e4ro2r
+e1ros
+e1rou
+e1row
+e1roz
+er1ö
+erö2d
+2erök
+er3p4
+er3rä
+erri3er
+2errü
+ers2a
+er3se
+er5sen
+er3s2i
+er3sk
+ersma3s4
+er5smo
+er3sn
+er3sp
+ers2te
+er3sz
+ert2ak
+er6terei
+er4ters
+er2tho
+4erti
+ert3ins
+ert4ra
+ert3s2e
+2eru
+eruf4s
+er1u4m
+er1und
+er1uns
+er3uz
+erü4b
+3erweck
+6erweis
+e1s
+e4s3ab
+es1ad
+es2an
+es3ant
+e3s2as
+esa3sse
+esas6sen
+e4s3ato
+esäs4
+es2äu
+2esb
+e3sc
+es2ca
+es3cap
+es2ce
+esch2
+e4sco
+e4scu
+e3se.
+es1ebe
+es3ehr
+e2sein
+ese4ler
+es3eva
+2esf
+4esh
+es3ha
+es4har
+es2hu
+e3sig
+e2s1il
+es1ini
+e4s3ins
+es3int
+es2kat
+e4s3ke
+e4sky
+e4s3l
+es4log
+2esm
+e4sn
+es2ort
+es2ö
+2esp
+e3s2pek
+e3s2por
+e3s4pra
+es2pu
+2esr
+es2sau
+4essem
+ess4e3re
+ess3erg
+es3si
+2esso
+es2sof
+es2s1pa
+es4ste
+estab4b
+est1ak
+e3stan
+e4starb
+1e2stas
+es2tau
+es2te
+e4st3eng
+e4st3erh
+e4st3ess
+e5stev
+e3sti
+e4stip
+estmo6de
+e2stod
+est3ori
+2estro
+es3trop
+es2tu
+e3s2tü
+es2ty
+e2s1um
+es1ur
+e4sw
+e3sy
+eße3r2e
+e1t
+etab4
+et1am
+1etap
+etari1
+et4at
+et1äh
+e3te
+e4tein
+et2en
+eten3d2
+ete2o
+eter4hö
+eter4tr
+et2h
+et3hal
+et3hü
+e3ti
+eti2m
+eti2ta
+2e3to
+eto2b
+e4t1of
+2etr
+e4traum
+et3rec
+e2tres
+etsch3w
+et1s2p
+et1su
+ett1a
+et2tab
+et4tanz
+et2t3au
+et2tä
+et2tei
+ette4n1
+et2th
+et2t3r
+et4tro
+ett3sz
+et2t1um
+et2tur
+et2tü
+etwa4r
+2etz
+et2zä
+et4z3ent
+etze4s
+et2zw
+eu1a2
+eue6reif
+eu2e5sc
+eu2g1a
+eu4gent
+eu3g2er
+eu4gla
+eug1s2
+euil4
+eu1in
+1euk
+eu2kä
+e1um
+e3um.
+e3umb
+e3uml
+e3um2s
+eums1p
+eum3st
+2eun
+eun2e
+eu4nei
+e3un2g
+eu2nio
+eun3ka
+eu1o2
+eu1p
+e2ur2e
+3eu3ro
+eu1s4
+eu3sp
+eu3ss
+eust4
+2eut
+eut2h
+eut6schn
+2eux
+eu2zw
+e3ü
+2e1v
+e2vela
+e2vent
+4ever
+eve5r2i
+e3vo
+ev2s
+e1w
+2ewa
+e3wä4
+ewä6s
+2ewe
+e2we.
+e3wir
+ewi2s
+e3wit
+ew2s
+2ex.
+ex3at
+1e2xem
+ex1er
+e1xi
+e2x1in
+1exis
+ex3l
+3exp
+2ext.
+ex2tin
+ex2tu
+2exu
+2e3xy
+ey4n
+eys2
+e1z
+e3z2a
+e2z1enn
+e3zi
+ezi2s
+ez2w
+é1b
+é1c
+é1g
+égi2
+é1h
+é1l
+élu2
+é1o
+é1p
+é1r
+é1s
+é1t2
+é1u2
+é1v
+é1z2
+è1c
+è1m
+è1n
+è1r
+ê1p
+1fa
+fab4
+fa2ben
+f3abf
+f2abr
+fab5s
+3fac
+fa4cheb
+facher5f
+fa2ch1i
+fa2cho
+f1ader
+fa2dr
+f4ah
+faib4
+fa2ke
+f2al
+fa3l2a
+fal2kl
+fal6lenk
+fal6l5erk
+fal2li
+fal6scha
+fal6schm
+falt2s
+2fanb
+2fanf
+fan2gr
+2f1ank
+2fanl
+f1anp
+2fanr
+fan3s
+2fanw
+f1an3z
+2f1ap
+f2ar
+far2br
+2f3arc
+3fari
+3f4art
+2f3arz
+fa3s4a
+fa3sh
+f3at
+fa2to3
+2f1auf
+f3aug
+fau2s
+f1ausb
+3f4av
+fa2xa
+1fä
+fä1c
+fäh2r1u
+2f1ärm
+fä4s3ser
+fä2ßer
+f1äu
+2f1b2
+2f1c
+2f3d4
+fdie2
+1fe
+featu4
+f2ech
+2f1eck
+fe2dr
+fe2ei
+fe1em
+fef4l
+feh4lei
+f4eie
+2f1eing
+4f1einh
+fe1ini
+2f1einw
+f1ei3s
+fek2ta
+fe2l1a
+fel2dr
+2f1e2lek
+fe2l1er
+fe2les
+fe2l1o
+fel4soh
+fel3t
+f2em.
+fem4m
+2femp
+fe2nä
+fen3g
+fe2no
+fen3sa
+fens2t
+f1ent
+f2er.
+fe1ra
+fer2an
+fe4rang
+fe4r3anz
+fe2rau
+ferde3
+f2ere
+fer2er
+fer3erz
+f1erfa
+f2erl.
+4ferneu
+fe1ro
+f4erpa
+f2ers.
+f2ert
+f1erw
+fes2t
+fe2st1a
+fe4st3ei
+fe2str
+2f1e4ta
+3fete
+fet2t3a
+feuer3e
+feu4ru
+3few
+f1ex
+2fexp
+3fez
+1fé
+2f1f
+ff2ab
+ff3ar
+ff4arb
+ff1au
+ff2e
+ffe2e
+f2f3ef
+ff3ei
+ffe1in
+ffe2m
+f2f3emi
+f2fetz
+f2fex
+fff4
+ff3l
+ff4la
+ff4lä
+ff4lo
+f3flu
+f3flü
+f3f4rä
+ff3ro
+ff3rö
+ff2sa
+ff3sho
+ff2sp
+4f3g2
+fge3s
+2f1h2
+1fi
+3fi.
+fi3at
+fi4ds
+fi1er2f
+fi2kin
+fi3kl
+fik1o2
+fi2kob
+fi2kr
+fi2l1an
+fil4auf
+fil3d
+fi2les
+filg4
+fi3li
+fi4lin
+fil2ip
+f2ina
+fi3ni
+2f1int
+fi2o
+fi3ol
+fi2r
+fi3ra
+3fis
+fis4a
+fisch3o
+fi3so
+fis2p
+fit1o2
+fi2tor
+fi3tu
+3fiz
+2f1j
+4f1k4
+f2l2
+2fl.
+f3lad
+f3lap
+1flä
+3f4läc
+2f5läd
+f3län
+2f3läu
+2f3leb
+f4lee
+2f3lein
+f3ler
+f4lé
+f3li.
+3f6lim
+fli4ne
+2f5lon
+1f4lop
+flo7s8ses.
+1f4lot
+flo2w
+f3lö
+f4luc
+1f4lug
+flu4ger
+flus3se
+f4lü
+2f3m2
+fmas2s
+fma3sse
+2f3n2
+fni2s
+1fo
+fob2l
+2f1of
+foli3
+fo2na
+fo2nu
+2f1op
+4f3org
+fo3rin
+3form
+for4m3a4g
+forni7er.
+for4sta
+for4sti
+for4tei
+for2th
+for2t3r
+for3tu
+2f1o2x
+1fö
+2föf
+2f1ök
+2f1öl
+4f1p2
+2f1q
+f2r2
+f4rac
+frach6tr
+f5rad
+fra4m
+f3rand
+f5rap
+1f4rän
+2fre.
+f3rec
+f3red
+2freg
+freik2
+frein4
+f3rep
+f4reu
+2f3ric
+fri3d
+fri2e
+2frig
+1fris
+f4risc
+fri6ster
+f3roc
+1f4ron
+fro2na
+fro2sc
+f3rot
+f3ru
+f3rü
+4f1s
+fs2amm
+f2san
+fs3ar
+f2s1as
+f2sauf
+f2saus
+f2saut
+fsä4
+f3sc
+f4sce
+f4schan
+f4schef
+f2s1e2b
+f4s3ehr
+f2s1em
+f2s1ent
+f2s1er
+fse4t
+f2s1eta
+fsi2d
+f3s2kie
+f2s1o2
+f3span
+f2s1pas
+f2sph
+f3s2pl
+f3s2por
+fs1pr
+f2spre
+fs2pri
+f2spro
+fs2pru
+fs3s4
+f2stas
+f4s3täti
+f4stech
+f4stemp
+f2stip
+f2s1tis
+fst4r
+f4s3tres
+f4s3tüte
+f2sty
+f2s1un
+f2sü
+f3sy
+4f1t
+f2ta.
+f2tab
+ft1a2be
+ft1af
+f2t1al
+ft1an
+ft1ar
+f3tat
+ft1e2h
+ft1eig
+ft1eis
+f2t1ent
+f2t1e4ti
+f2th
+f4thei
+ft3ho
+ft1op
+f2t3ro
+f2t3rö
+f3t4ru
+fts1
+ft2sa4
+ft4sag
+ft4sam
+fts2c
+ft4sche
+ft2se4
+ft4seh
+fts3el
+ft2si
+ft2stä
+ft4ster
+ft4stes
+fts2ti
+fttra4
+f2tum
+ft1url
+ftwa4
+ft3z2
+1fu
+3fug
+3f2uh
+f1um
+2f1unf
+2f1u2ni
+fun2kl
+fun2ko
+fun2k3r
+2f1unm
+2funt
+f2ur
+fu4re.
+fus2
+fu3sse
+fus6sen
+fu4sser
+fuss1p
+fus4s1t
+fu2ß1er
+3fut
+1fü
+2füb
+fü2r
+fü3s2
+2f1v
+2f1w
+1fy
+2f1z
+fz2a
+fzeiten6
+fzei8tend
+fz2ö
+fzu3
+fzu4ga
+3ga.
+2gabf
+ga2b5l
+gab4r
+2gabz
+ga1ch
+2gadl
+2ga2dr
+ga1fl
+ga1k
+ga2ka
+gal2a
+g4amo
+2g1amt
+2ganb
+gan3d
+gan2g1a
+4gangeb
+gan2gr
+2ganh
+2g3anku
+2ganl
+g3anla
+3g2ano
+2ganw
+ga1ny
+2garb
+2garc
+3gard
+2g1arm
+ga3r2o
+g1arti
+ga3ru
+2g1arz
+ga2s
+ga3sc
+ga4s3ei
+ga4sem
+ga3sp
+ga4spe
+ga4spr
+gas5s
+ga3s6ses
+gas3tan
+ga4st3el
+ga3str
+ga4stra
+ga4stre
+gas1tu
+gat2a
+2gatm
+gat4r
+gau1c
+2g1auf
+g2auk
+g1aus
+2g1aut
+2g1äp
+2gärz
+gäs2
+gä4u
+2g3b2
+gbau5s
+gber2
+gbi2
+2g1c
+2gd
+g1da
+g2d1au
+g2d1er
+gd1in
+g1do
+g1dö
+g1d3r
+gd3s2
+gdt4
+gd1u
+1ge
+ge3a2
+geb2a
+gebe4am
+geb4r
+ge1c
+ged4
+ge1e2
+ge3ec
+ge2es
+gef4
+ge3g2l
+ge1im
+ge2in.
+gein2s
+ge2int
+gein2v
+ge1ir
+ge2is4
+2g1eise2
+gei3sh
+gei4sta
+g2el
+ge4lanz
+gelb1r
+gel4b3ra
+gel6ders
+ge3le
+ge5leh
+ge4l3ers
+ge4less
+gell2a
+ge3lor
+gels2t
+gel3sz
+gel3t2a
+ge3lum
+ge3lü
+gelz2
+ge3mi
+gem2u
+3gen
+ge3na
+ge4nam
+ge4nar
+gen4aug
+gen2d1r
+gen1eb
+ge3nec
+gen3eid
+gen3ern
+gen3g
+genma7sse.
+gen3n
+gen3sz
+2g1entf
+gen3th
+4gentw
+geo2r
+ge1ou
+ge3p4
+ge1ra
+ge2rab
+4g3ereig
+ge4reng
+ge4ren4s
+ge4r3ent
+ger2er
+gerin4f
+ger4inn
+gerin4t
+germ4
+germas6s
+ger3no
+ge1ro
+ge1r2ö
+ger4sto
+ge3r2u
+ges2c
+ges3elt
+ge2s1er
+ge3s2i
+ges2p
+ges4pi
+gess2t
+gest2
+ge3t2a
+2getap
+ge3t4u
+ge1ul
+2g1ex
+2g1f4
+4g1g
+gga2t
+g3ge
+gge2ne
+g2g3l
+gg4lo
+g2g3n
+gg4r
+2g1h
+4gh.
+gh2e
+3g2het
+3g2hie
+gh1l
+3gh2r
+g2hu
+gh1w
+gi3alo
+gia2s
+gie3g
+gi2e1i
+gi2el
+gien2e1
+gi2gu
+gi2me.
+gi4mes
+gi2met
+2g1ind
+gi3ne
+gin2ga
+2g1ins
+2g3isel
+gi3t2a
+gi4us
+2g1j
+4g3k2
+4gl.
+gl2a
+g1lab
+3glad
+g2lade
+2g1lag
+3glanz
+gla4s3ti
+gla4stu
+3g2laub
+2g1lauf
+g1läß
+3glät
+2gläuf
+g2l4e
+2gle.
+3glea
+2g3leb
+g3lec
+g3leg
+2gleh
+4g3lein
+glei4t5r
+g3len
+4g5ler
+2gles
+g3lese
+g4lia
+2glib
+3g2lid
+3g2lie
+2glif
+g2lik
+4glin
+g2lio
+2glis
+4g3lisc
+3g2lit
+g2liz
+3g2loa
+3g2lob
+g3loch
+glo3g
+3g4lok
+g2lom
+3g2lop
+3g2lot
+2gls
+2g1lu2
+3glü
+g2ly
+2g1m2
+g1n
+2gn.
+g2n2a
+g4na.
+2gnac
+g4nat
+3g2nä
+gn2e
+g3neh
+gne2tr
+2gneu
+2gng
+g2nie
+g2nif
+g4nin
+2gni2s1
+g2no1
+g3not
+2gnp
+2gns
+2gnt
+2gnu
+3g2num.
+g2nü
+g2ny
+2gnz
+go4a
+goa3li
+2g1of
+2gog
+2g1oh
+go1i2
+gol2a
+2gonis
+2g1ope
+2g1opf
+g2o1ra
+2gord
+2gorg
+go2s
+go3th
+got6t5erg
+go1y
+2g1p2
+2g1q
+g2r4
+gra2bi
+gra2bl
+2gradl
+2g3rah
+2g3rak
+grammen6
+gram8m7end
+2g3räu
+2g5re.
+g4reb
+2g3rec
+2g3rede
+g4re2e
+2g3reic
+2g3rein
+g3reit
+g4rem
+2g3renn
+gren6z5ei
+g4rer
+g3ret
+g3rev
+2g3ric
+gri2e
+g3riese
+3grif
+2grig
+2g3ring
+2groc
+2groh
+gron4
+g4ros2
+gro5sse.
+gro7ssen.
+gro7sser.
+gro5sses
+g4roß
+gro4u
+2g3röh
+g4ruf
+2g3rui
+2g3rum
+3g4runs
+3g4rup
+grus2s
+gru3sse
+2grut
+2g3rüc
+3g4rün
+4gs
+g2sa
+gs1ac
+gs1ad
+gs1af
+g4s1a4g
+g3sah
+g4s3a2k
+g3sal
+g4salt
+gs3ama
+g4s1amb
+gs3an
+gs3ar
+gs1as
+gs3aug
+gs1ä
+g4sca
+g4sce
+gsch4
+g4schef
+gs2chi
+gs3cr
+g2s1e2
+g3s2eil
+g3sel.
+gs3eli
+g3seln
+gsen1
+g4s3er
+gse4t
+g4seu
+g2s1i
+gsi2d
+g3sig
+g3sil
+gs1o2
+gs1p4
+g3s2pek
+gs4pie
+gs2pit
+gs3pl
+g5s2por
+gsrat4
+gs3s2
+g3star
+gs1tau
+gs1tä
+g5stel
+g4stemp
+gst3ent
+g4sterm
+gst3err
+g4s3test
+gst2he
+g3sti
+gs1tis
+g3sto
+g4ston
+g4s1tor
+gs1tot
+gs1tr
+gst4ra
+gst4ri
+gst3ros
+g3stun
+gs1tü
+gs2tüc
+gs1u
+g3sy
+4g1t
+g3te
+gti2m
+gt4r
+gt2se
+1gu
+gu3am
+gu1an.
+gu1ant
+gu2e
+2gued
+guet2
+2g1u2f
+2g1uh
+gu1ins
+gu1i4s
+3gumm
+2g1unf
+g2ung.
+gunge2
+4gungew
+2g1ungl
+g2uns
+2gunt2
+3gur
+4g1url
+gurt3s
+gu2s3a
+guschi5
+gus2sp
+gus4st
+gu3sti
+gu2ß1
+gu2t
+gut1a
+gu4t3erh
+gut3h
+2güb
+gür1
+gü3st
+2g1v
+2g1w
+2g3z2
+3haa
+hab2a
+hab2e
+ha2cho
+ha2del
+ha4din
+h1adle
+haf3f4l
+haft2s
+hafts3p
+h1ah
+ha1kl
+2h2al.
+halan4c
+ha2lau
+hal2ba
+hal4bei
+halb3r
+2hale
+hal2la
+hal4leh
+hal6lerf
+h1alp
+halt3r
+h1amt
+h2an.
+h2and
+h4ann
+2hanr
+2hant
+hao2s
+h1ap
+ha2pl
+ha2pr
+h4a3ra
+2harb
+h2ard
+h1arm.
+har4me.
+har4mes
+har2th
+h1arti
+h2as
+2ha3sa
+hasi1
+ha2ß1
+hatt2
+hau3f4li
+2h1aufm
+h1aukt
+hau2sa
+hau2sc
+hau4spa
+hau4ss
+haus5sen
+hau4s3ti
+hau4sto
+hau6terk
+2hauto
+hau2tr
+h1äff
+hä4s
+hä5sc
+hä6s5chen
+häu2s1c
+hä3usp
+2h3b2
+hba2r3a
+2h1c
+2h3d4
+hdan2
+2hea
+he2ad
+hea5t
+he3be
+he4b1ei
+he2bl
+he3br
+he5ch2e
+he1cho
+h1echt
+hed2g
+he3di
+he2e3l
+hee2s
+he2fan
+he2fä
+he2f1ei
+hef3erm
+2heff
+he4f3ing
+he2f3l
+he2fr
+he3fri
+he2fu
+he3gu
+h1eie
+h1eif
+h1eig
+he2im
+heim3p
+hei4mu
+heine2
+hei4neh
+h1eink
+4heio
+he1ism
+he1i4st
+heit4s1
+h1eiw
+he2l3au
+hel1ec
+h3e2lek
+he3len
+hel3ers
+he3li
+hel4l3au
+hel4mei
+he3lo
+he4lof
+he2lö
+3hemd
+he3mi
+3hemm
+4h1emp
+h2en.
+he4n3a4
+he2nä
+he2n1e2b
+hen3end
+hen3erg
+he2net
+heng2
+2heni
+he2no
+hen3st2
+h1ents
+2h3entw
+hen3z
+4he2o
+he3on
+he3op
+he3ph
+her3a2b
+he2ral
+2herap
+he3ras
+herau2
+he4reck
+4hereig
+he4r3eis
+he2rel
+he4rerw
+h1er2fo
+h1erfü
+herg2
+herin4f
+he6rin6nu
+herin4s
+herin8ter
+h1erke
+h3erlau
+2herm
+herma3s
+he3ro
+he4r3o4b
+h1erö
+hert2
+her3th
+her2zw
+he2tap
+heter2
+he3th
+het2i
+he3t4s
+h2e2u
+heu3g
+he3x
+he1x2a
+he1y2
+1hè
+2h3f4
+hfell1
+hfel6ler
+hfi2s
+2h3g2
+hget4
+2h1h2
+2hi.
+2hia
+hi2ac
+hi2ang
+hi1ce
+hich6ter
+2hi3d
+h2ide
+h1i4di
+hi2e
+hi3ens
+hier1i
+hie4rin
+hif3f4r
+hi2kr
+hi2l3a4
+hil2fr
+hi2n
+h1indu
+hi3nel
+hin2en
+h1inf
+h1inh
+hi3n2i
+hin3n2
+hi3no
+hin2t1a
+2hio
+hi4on
+hi3or
+2hip1
+hi2ph
+hi2pi
+h2i2r
+hi3ra
+2hi3re
+hi3ri
+hirn1
+hir4ner
+hi3ro
+hir2s
+his2a
+hi2se
+his2p
+hi3ti
+2hiu
+h1j
+2h1k4
+4hl
+h4lac
+hla2n
+hl1anz
+h1las
+h1laß
+h1lat
+h1laut
+h3läd
+h1läs
+h1läß
+h1läu
+hlb4
+hld4
+h3leb
+hle3e
+h5len.
+hlen3g
+hl2enn
+h3ler
+hle2ra
+hl1erg
+h6l3ernä
+hle3run
+hl1erw
+h4lerz
+h3les
+h4lesi
+h3lex
+hlg4
+h2lie
+h2lif
+hl1ind
+h2lip
+h2lis
+h3list
+h2lit
+hll2
+hlm2
+hlma3s
+h2lo
+h3loc
+hl1of
+hl1op
+h4lor
+hlo2re
+h3losi
+hl2ö
+h3löc
+h2lös3
+hlö4ss
+hl2san
+hl2ser
+hl3sku
+hl3slo
+hl2sto
+hl3t2
+h3luf
+h3luk
+h1lüf
+2h1m
+h2mab
+h3mag
+h3man
+h3mar
+hma3sse
+h4mäc
+h4mäh
+h4mäl
+h4mäu
+h3me.
+hme1e
+hme1in
+h3meist
+h3men
+hmen2s
+hme2ra
+h2mo
+h4mon
+h3mö
+hm3p4
+hm2s1p
+h2mu
+2hn
+h2na
+hn1ad
+h3nam
+hn1an
+hn3d4
+hn2e
+hn3eig
+hn3ein
+h2nel
+hne4n1
+hne4pf
+hner3ei
+h3nerl
+h3nerz
+hn3ex
+h2nic
+h2nid
+h2nie
+hn1im
+hn1in
+h2nip
+hn3k4
+h2nor
+hn3s2k
+hns2t
+hntra4
+hnts2
+h1nu
+h2nuc
+h2nul
+hn1unf
+h3nunge
+ho2bl
+ho2c
+hoch3
+hock3t
+2hod
+hoe4
+ho2ef
+ho4fa
+ho2f3r
+2hoi
+hol1au
+4holdy
+3hole
+ho2l1ei
+hol3g4
+4holo
+ho4lor
+3hols
+h1o2ly
+3holz
+hol6zene
+hom2e
+ho2mec
+ho2med
+h2on
+hono3
+2hoo
+2hop
+ho1ra
+hor3d
+h1org
+ho4sei
+ho3sl
+ho2sp
+ho3s4se.
+ho5s6ses.
+ho3ssi
+ho4sta
+ho2str
+2hot.
+ho3th
+hotli4
+2hot1s2
+3hov
+2ho2w1
+h1o2x
+ho1y2
+hô1
+1h2ö
+hö2c
+h4ör
+hö4s
+hös1c
+hös3se
+h3öst
+2h3p2
+h1q
+2hr
+hr1ac
+hr3ad
+h1rai
+h1rane
+h3rat
+h3räu
+hr1c
+hr3d
+h2rec
+h3rech
+h3red
+h3ref
+h4rei.
+hrei4ba
+h3reic
+h4r3eig
+h3rel
+h3r2en
+h3rep
+hr2erg
+hr2erk
+h6rerleb
+hr2erm
+hr2erz
+h3re2s1
+hre2t
+h2r1eta
+h3rev
+hrf2
+hrg2
+h2ri
+h3ric
+h4rick
+hri4e
+h3riesl
+h3rin
+h4rine
+h4rinh
+h4rist
+h2rob
+h2rof
+h3roh
+h3rol
+h4rome
+h4romi
+h4ron
+h2ror
+h3rou
+hrr4
+hr2s1ac
+hr2s3an
+hr2sau
+hr3sch
+hr2s1en
+hr2ser
+hr2set
+hr2s1in
+hrs3k
+hr2s1of
+hr4stec
+hr2su
+hr4sw
+hr2tab
+hr2tan
+hr2th
+hr2tor
+hrt3ri
+hr2tro
+hrt2sa
+hrt2se
+hrt4ste
+h3ruh
+hr1ums
+h3rü
+h4rüb
+h2ry
+hrz2
+4h1s
+h2s1ach
+h2san
+h2sau
+hsä4s
+h3sc
+h4schan
+h2s1ec
+hse4ler
+h2s1erl
+h3s2ex
+h2s1ing
+h2s1of
+h2s1par
+h2sper
+h2sph
+hs2por
+h2sprä
+h2spro
+hss2
+hst3alt
+hst2an
+h4starb
+h2stau
+h2stäl
+h4stea
+h5stel
+hst2he
+hs1tie
+h2stin
+h2s1tor
+h3stö
+h3str
+hst3ran
+hst3ri
+h2stu
+h3stun
+h3stü
+h2s1u
+hs2ung
+h3sy
+4h1t
+h2t1a
+h3t4akt.
+h3takts
+h3t2al
+h4t3alt
+hta2m
+hta4n
+ht3ane
+h3tank
+h3t2as
+h4t3ass
+h4tasy
+ht3a2t
+h2tär
+h3te.
+ht1ec
+h2t1ef
+ht1eh
+h3teha
+h3tehä
+hte2he
+h2teif
+h4teilz
+h2t1eim
+h2t1eis
+h4t3elit
+htelma4
+htelmas5
+h2temp
+h3ten
+h4tentf
+h4t3ents
+ht3erfo
+ht3erfü
+h2t1erh
+ht5erken
+h4terkl
+h4t3erre
+ht3ersc
+h6t5erspa
+ht3erst
+h6tersta
+ht6erste
+h2t1erz
+h2t1ese
+h2t1ess
+h3tet
+h2t1eu
+h2t1ex
+htgeschos8
+htgescho7sse
+h2th
+h4thei
+hthe3u
+h4tho
+h2t1in
+htni2
+hto2
+h2toly
+h2torg
+ht3rak
+ht3rand
+h2t3rat
+ht6raume
+ht4ri
+h2t5rin
+h2t3rol
+h2t3ros
+ht3rö
+h2t1rös
+h2t3ru
+h2t3rü
+h4ts
+ht3spri
+ht4stab
+hts2ti
+ht4s3tur
+ht4s3tür
+htt4
+htti2
+htu2e
+h2t1urs
+ht3z2
+hu2a
+hu2b1a
+hu2bei
+hu2b1en
+hu2b3l
+hu4b3r
+hu2bu
+hu2h1a
+hu2h1i
+huk3t4
+hu2l3a
+hu2lä
+hu2l3ei
+hu4l3eng
+hu4lent
+hu2ler
+hu2let
+hu2l1in
+hu2lo
+hu3ma
+h1ums
+hu2n
+h1una
+hu3ni1
+h1up.
+h1ups
+2hur
+hurg2
+hu3sa
+hu2so
+hus4sa
+hus3se
+hus2sp
+hus4st
+hu2tab
+hu3t2h
+hu2ti
+hut2t
+hut4zen
+hut4z3er
+hutz1i
+h2ü
+h4übs
+h3übu
+hühne4
+hüs3s
+2h1v
+hvi2
+hvil4
+2hw
+h2wall
+hwe1c
+h1weib
+3hyg
+3hyp
+hy2pe.
+2hy2t
+h1z
+hz2o
+hzug4
+i1a
+2ia.
+i4aa
+i2ab
+iab4l
+2iac
+i2af
+iaf4l
+i4a3g2
+i2ah
+i2aj
+i2ak
+i3ak.
+i3akt
+2ial
+i5al.
+ia2l1a4
+ia2lä
+ial3b
+ial3d
+i3alei
+i3alent
+i3alerf
+i3alerh
+ia4l3erm
+i3a2let
+i3a4lia
+ialk2
+i3all
+ial3la
+ia2lor
+ial3s
+ial3t4
+ia2lu
+ial3z2
+i2am4
+i4amo
+2ian
+ia2nal
+i3and2
+ian2e
+i3ann
+i2ano
+i3ant
+i3anz
+i2ap
+ia3p2f
+ia1q
+i3ar.
+ia2ra
+2ias
+i2asc
+ia3sh
+i2asi
+i2a1sp
+ias5s
+iast4
+i3at.
+i3a4ta
+i4ate
+i3at4h
+1iatr
+i3ats
+i3au
+ia3un
+iau2s1
+2iav
+2iä
+i1äm
+i1är.
+i1ärs
+i1ät.
+i1äta
+i1ät3s4
+2i1b
+i2b1auf
+ib2bli
+ib1ei
+i2beig
+i2beis
+ibe4n
+iben3a
+ibi2k
+i3bla
+i3ble
+i2blis
+ib2o
+i2b1ö
+i4brä
+ib3ren
+ib4ste
+i2bunk
+i2bunt
+ibus1c
+ibus3s
+2ic
+ic1c
+ich1a
+ich1ä
+i1che
+ich1ei
+ichermas8
+ichgro3
+i1chi
+i2chin
+ich3l
+i3chlo
+ich3m
+ichmas4
+i1cho
+i2ch3r
+ich2t3r
+i1chu
+ich1w
+i1ci
+ick2e
+icks2
+i1cl
+i1d
+id2ab4
+i3dam
+id2an
+i2d1au
+1i2dee
+i2dei
+idel2ä
+ide3so
+ide3sp
+1i2dio
+idni3
+i2dol
+1idol.
+2i2dr
+i3dsc
+id2s1p
+idt4
+i2dy
+ie3a4
+ie2bä
+ie2bl
+ie2bre
+ieb4sto
+ieb4str
+ie1c
+ie2cho
+ie2dr
+ie1e2
+ie2f1ak
+ie2f1an
+ie2fau
+ief3f4
+ie2f3l
+ie2fro
+ie4g3l
+ie3g4n
+ie2g3r
+ie3g4ra
+ieg2s
+iegs1c
+ieg4se
+ieg4st
+i1ei
+i2e2l1a
+ie3las
+iel3au
+iel3d
+iel1ec
+ieler8geb
+i1ell
+ielo4b
+iel3sz
+iel3ta
+2i1en
+i3en.
+i3ena
+iena2b
+ie4n3a4g
+i3e2nä
+i3en3d
+i2ene
+ien1eb
+ie3ner
+ien4erf
+ie4n3erg
+i3enf
+i3en3g
+ienge4f
+i3enh
+i3enj
+i3enk
+i3enm
+ienma3s4
+i3enn
+i3e2no
+i3enö
+i3enp
+i3enr
+ien3s2e
+iens2k
+ien6stof
+ien6stop
+iens4tr
+ienst5rä
+ien3sz
+ie1nu
+i3env
+i3enw
+i3enz
+ie1o2
+ier3a2
+ie2rad
+ie2rap
+i2ere
+ie3r2er
+ie4rerf
+ie4r3erz
+ie3res
+i3ereu
+i4eri
+ierin3
+ier3k4
+i1ern
+i3ern.
+i2er5ni
+ie2rö
+iers2e
+ier4s3eh
+ier3sta
+ier3te
+ie3s2
+ie4sh
+ie4sk
+ies4s
+ie5sset
+iess1t
+ie4stas
+ie2t1a
+ie4t3erh
+ie4t3ert
+ie2t3ho
+ie4t1o
+ie2t1ö2
+ie2tri
+iet2se
+i1ett
+ieu2e
+ie1un
+i1ex
+2if
+if1ab
+if1ar
+i2f3arm
+if4at
+if1au
+i2fec
+ife2i
+if2en
+if1erg
+if1erh
+if2fah
+if6feste
+if2fl
+if3l
+i1f4la
+if4lä
+i1flü
+if3r
+if4ra
+i1frau
+i1fre
+if4rei
+if4rü
+if2ta
+ift3erk
+if2top
+if2t3ri
+ift1s2p
+ift3sz
+2i1g
+iga1i
+i2g1ang
+ig1art
+iga3s
+i4gefar
+ige4na
+igerma3
+ig1erz
+i2g1im
+i2gl
+ig1lä
+ig4na
+i4gnä
+i3g4neu
+ig4no
+i3go
+ig4ra
+ig3rei
+igro3
+ig4sal
+ig1so
+ig4sti
+ig4s1to
+ig2stö
+ig4stre
+2i1h
+i2h1am
+i2har
+i3he
+ihe1e
+ihe4n
+ih3m
+ih3n
+ih3r
+ih2s
+ih3sp
+i2h1um
+ih1w
+ii2
+ii3a4
+i1ie
+i3i4g
+i1im
+i1in
+i1i4s
+i2is.
+ii3t
+i1j
+2i1k
+i2k1a4k
+ik1amt
+i2k1ano
+ik1anz
+i4kanze
+ik1art
+ik3att
+i2k1au
+i2kär
+ikbu2
+4ike
+i2k1ei
+ike2l1
+i2k1e2r2e
+ik1erf
+iker6fah
+i2ker2l
+i2k1eta
+i3ki.
+ik1in
+i2kind
+i2k3l
+i3kla
+i3k4lä
+i2kn
+ik3no
+ik2o3p4
+i2köl
+i2k3ra
+ik3rä
+ik3re
+ikro3
+ik3so
+ik3s2z
+ikt2e
+ikt3erk
+ikt3r
+ik2tre
+i2kun
+i3kus
+i1la
+i2l3ab
+il1a2d
+i2l1ak
+i2l3a2m
+il1ans
+il1asp
+il1au
+il4aufb
+il3aus
+i2laut
+i1lä1
+4ilb
+il2c
+il2da
+il4d3en4t
+ild2er
+ild1o
+il2dor
+il2dr
+il1ec
+ile2h
+il1ehe
+ileid4
+il1ein
+il1el
+i4lents
+i2l1erf
+i2l1erg
+i2l1err
+ilf2
+il2f3l
+il2f3re
+ilf4s1
+ilie4n
+ilig1a2
+ili4gab
+i2l1ind
+i2l1ip
+i3lip.
+i3lips
+2ill.
+il3l2a
+il4lad
+ill4an
+il3l2er
+il3l2i
+2ills
+il2mak
+il4mang
+il2m3at
+il2mau
+il2min
+2ilo
+i2l1or
+il3t2h
+i1lu2
+i2lum
+i3lus
+ilv4
+il2z1ar
+ilz3erk
+2im.
+i2manw
+i2m1arm
+im4at
+ima2tr
+imat5sc
+ima4tur
+i2meg
+i2mej
+i2mek
+i2m1ele
+i2melf
+i2m1erf
+i2m1erz
+i4mesh
+i2meti
+i2mew
+i2m1inf
+i2m1ins
+im2mei4
+im4m3ent
+1immo
+imni2
+2imo
+im1org
+1impo
+imp4s
+im3pse
+1impu
+im2str
+2imt
+imtu2
+2imu
+in3ac
+i4nack
+i2n1ad
+in2af
+in1am
+i3nap
+in2ara
+in2ars
+ina4s
+i2n3au2
+inaus1
+in1äs
+in2dal
+in2dan
+in3dau
+indes4t
+1index
+in3do
+2indr
+ind4ri
+in3drü
+1indus
+2ine
+i2n1e2be
+in1ehe
+in3ei
+i2n1eng
+inenma3
+inenmas6
+in3erbe
+i4nerbi
+in2erh
+iner4lö
+i4ner4tr
+i4nesk
+in1eu
+ine3un
+ine2x
+in3f
+1info.
+1infos
+2inga
+ing1af
+in2g1a4g
+in2gl
+ingmas4
+ing4sam
+ing3sc
+1inhab
+2inhar
+2inhau
+4inhe
+in2i3d
+i3nie
+2inig
+ini3kr
+in2ir
+2inis
+ini3se
+i3nitz
+3inkarn
+ink4ste
+inma4le
+2inn.
+in4n3erm
+2innl
+in2nor
+inn4sta
+1innta
+2ino
+in1od
+in3ols
+in1or
+ino3t
+i1nö
+in1ö2d
+2inp
+2inr
+ins2am
+insch2
+in2seb
+2insen
+ins3ert
+in3skan
+in3skr
+1insta
+in4s3tät
+in3su
+1insuf
+in4s3um
+in3s2z
+i4nt
+1integ
+int2h
+in3t4r
+in1u
+i3n2um
+in3unz
+invil4
+i1ny
+in3zw
+i1ñ
+2i1o
+ioa4
+io1c
+io2d
+i2oda
+io3e2
+iof4l
+i2o3h
+io2i3d
+io3k4
+i3ol.
+i3om.
+i3oms
+ion2
+i3on.
+ional3a
+io2nau
+ion3d
+i3on4s3
+i2ony
+i2o1p
+io4pf
+i3ops
+i3opt
+i2or
+i3or.
+i3orc
+iore4n
+i3orp
+i3ors
+i3ort
+io3s
+i2ost
+i3ot.
+i3ots
+i2ou
+i2ov
+io2x
+i3oz.
+i1ö2k
+i3ön
+i1ös.
+2ip.
+i1pa
+i1pe
+ipen3
+i3per
+ipf2
+ip3fa
+iph2
+2i1pi
+ipi3el
+ipi3en
+ip4l
+ip2pl
+ip3pu
+i1pr
+2ips
+2ipu
+2i1q
+i1r2a
+i3rad
+1i2rak
+ira4s
+irat2
+i1rä
+ir2bl
+ir1c
+ir2e
+i3ree
+2irek
+i3ré
+irg2
+ir2gl
+irg4s
+ir2he
+ir2i
+2irig
+2irk
+ir2k3l
+irli4n
+ir2mak
+ir2mau
+ir4mä
+ir2m1ei
+ir2mum
+ir4m3unt
+ir2nar
+ir2no
+i1ro
+1iron
+i1rö
+irpla4
+ir4rei
+irr2h
+ir4sch3w
+ir3se
+ir3sh
+irt4st
+iru2s1
+i1s
+i3sac
+i4s1amt
+is2ap
+is3are
+i2sau
+i2s1än
+2isb
+i2sca
+isch3ar
+i3s2che
+i4schef
+i4sch3e4h
+i4sch3ei
+i2sch1l
+isch3le
+i2schm
+isch3ob
+isch3re
+isch3ru
+i4schwa
+i6schwir
+i4schwo
+isch3wu
+is1chy
+i2s3cr
+2ise
+ise3e
+ise3ha
+ise3hi
+ise3inf
+i4seint
+ise2n1
+is2end
+isen3s
+i2serh
+i2s1erm
+iser2u
+i2s1ess
+i4s3etat
+isi2a
+i2s1id
+i2s1of
+iso6nend
+is1op
+3i2sot
+2isp
+is1pa
+i2spar
+is1pe
+is1pic
+is2pit
+i2spro
+is3sa
+is4s1ac
+is4sau
+is3sc
+is4s3che
+is3senk
+issermas8
+is3so
+is3spa
+is3spi
+is3spo
+is2s1t
+is3sta
+is4ste
+is3sto
+is3stu
+is2su
+i2stab
+i4stam
+ist2an
+i4stea
+iste4n
+is2ter
+ist4ra
+ist3re
+is1trü
+i2stur
+is1tüm
+i2sty
+isum3p
+i2sü
+i1ß
+iß1ers
+i1ta
+it1ab.
+it1abs
+ital1a
+it1alt
+it1am
+it1ang
+it3a4re
+it1art
+i3tat
+it1au
+i3tauc
+i2t1ax
+4i1tä
+it2är
+i2t1äs
+ität2
+i1te
+i2tei
+i4t1eig
+i4tein
+2itel
+ite2la
+ite4n
+it2ens2
+i4tepo
+i2tex
+i3thr
+i1ti
+i2t1id
+1itii
+iti4kan
+i2t1in1
+it2inn
+i3tis
+i3tiv
+itmen2
+i1to
+i3toc
+i2t1of
+i1tö
+i1tr
+i3tra.
+it3raf
+i2t3ran
+it3ras
+it3rau
+it3räu
+it3re
+it3ric
+it3rom
+it4ron
+i3tru
+it3run
+it2sa
+it4s1a4g
+it2s1e4
+its3er1
+it4set
+its1pe
+it4staf
+it4stec
+it4s3tem
+it4s3tes
+it2sti
+it4stie
+it2sto
+it2teb
+it4temp
+it2tri
+i1tu
+it1uh
+i2t1um
+i2tuns
+it1urg
+itut4
+i1tü
+2itz
+it2zä
+it4z3erg
+it2z1w
+2i3u2
+ium1
+ius1t
+i1ü
+2i1v
+i2v1ak
+iv1ang
+i2veb
+i2v1ei
+iv1elt
+ive4n
+i2v1ene
+i2v1ent
+i2v1ur
+2i1w
+iwur2
+2i1x
+i2xa
+ix2em
+i3xi
+ixt2
+2i1z
+iz1ap
+iz1au
+izei3c
+ize2n
+i2z1ene
+iz4er
+i2z1ir
+izo2b
+i2zö
+i2z1w
+í1l
+jah4r3ei
+jahr4s
+ja3l2a
+ja3ne
+jani1
+2jat
+je2a
+jean2s
+je2g
+jek4ter
+jekto2
+jektor4
+jek2tr
+je3na
+je2p
+je2t1a
+je2t3h
+je2t3r
+jet3t
+je2t1u2
+ji2a
+ji2v
+joa3
+jo2b1
+job3r
+jo2i
+joni1
+jo1ra
+jord2
+jo2sc
+jou4l
+j2u
+ju2bl
+jugen2
+jugend3
+ju2k
+jung5s
+ju3ni
+jur2o
+jut2e3
+2j1v
+1ka
+3ka.
+k3a2a
+ka3ar
+kab2bl
+ka2ben
+2kabh
+2kabla
+2kablä
+2k3a2bo
+ka3b4r
+2k1abs
+2k1abt
+ka1c
+k2ad
+2k3ada
+2k3a2dr
+ka1f4l
+ka1fr
+kaf3t2
+k2ag
+ka1in
+ka3ka
+kaken4
+2kala.
+ka2lan
+ka3lei
+ka3len.
+ka4lens
+kal3eri
+kal2ka
+kal2kr
+k1all
+kalo5
+kal4tr
+k3ama
+kamp8ferf
+kan2al
+ka4n1a4s
+ka2nau
+kand4
+2kanda
+kan2e
+2k1ang
+kan3k4
+2kanl
+2k1anna
+k1ans
+k2ans.
+6kantenn
+ka3nu
+2kanw
+k2anz.
+ka2o
+2k1apf
+3kara
+2karb
+k2ard
+k2arg
+ka3r2i
+kari3es
+k2ark
+2k1arm
+k2arp3
+kar2pf
+k2ars
+kar3t
+k2arta
+2k1arti
+karu2
+k2arw
+kasi1
+ka2sp
+kas3s
+ka3t2an
+ka3t4h
+ka2t3r
+kat3se
+2katt
+kau2f1o
+4kaufr
+kauf4sp
+k1aus
+kau3t2
+2kauto
+1kä
+k1äh
+k1ä2mi
+k1än
+kär2
+kä4s5c
+käse3
+kä3th
+2k3b4
+kbe1
+kbo4n
+kby2
+2k3c
+2k3d2
+kdamp2
+2k1ec
+k1eff
+kefi4
+kege2
+ke2gl
+ke2he.
+kehr2s
+kehrs3o
+kehr4st
+2k1eic
+2k1eig
+k1ein
+ke1in2d
+2keinh
+2k1eise
+ke2la
+kel1ac
+ke3lag
+kel1au
+ke2lä
+kel3b4
+2k1e2lek
+ke2len
+2ke3let
+kell4e
+kel3s2k
+k4elt
+2k1emp
+k2en.
+ken3au
+kenbu5s4
+4ken4gag
+2kenlä
+ke2no
+kens2k
+ken5s4te
+ken3sz
+k2ente
+k3enten
+ken3th
+k2entr
+2k1ents
+k2entu
+2kentw
+2keo2
+ke2pl
+k2er.
+k2erc
+4kerfah
+k4erfam
+k3ergeb
+ker6gebn
+k3er4hö
+ke6rin6nu
+kerin6st
+kerin4t
+ker4ken
+k2erko
+k2erl
+k3er4lau
+k3er4leb
+k6erlebe
+ker4neu
+k1ero
+k2ers.
+kerz2
+ker4zeu
+2k1er2zi
+k6es.
+ke2sel
+ke4t1a
+ke2t3h
+ket3s
+ke1up
+keu6schl
+2k1e2x
+2k3f4
+2k1g2
+2k1h4
+kho3m
+ki3a4
+ki1ch
+2k1i2de
+ki3dr
+ki2el
+kie2l3o
+ki1f4l
+ki1f4r
+ki3k4
+2kil2a
+ki3li
+ki3lo
+k2imi
+k2in.
+k2ing
+2kinh
+k2ini
+k2inn
+ki3n4o
+kin3s
+2k1inse
+2k1int
+ki3or
+kio4s
+5kir
+kis2p
+kist2
+2kiz
+ki3zi
+2k3j
+2k1k4
+kl2
+4kl.
+4kla.
+k4lar
+4k1last
+k2le
+4kle.
+kle3ari
+4kleh
+k4leid
+4k3leit
+k3lem.
+2k3ler
+kle2ra
+2k3leu
+kle3us
+2klic
+2klig
+k2lin
+k3lip
+k2lir
+k2lisc
+2klist
+klit2s
+4kliz
+2k3loc
+klo2i3
+k4lop
+klo3s2
+klost4
+k2löt
+k1lu
+kluf2
+2k1lüc
+2kly
+2k1m
+kmas2
+k2n2
+3knab
+k3ne
+k4nei
+2k5ner
+kno4bl
+2k5nor
+k3nu
+3knü
+1ko
+ko2al
+2kobj
+2k1o2fe
+koff4
+koh3lu
+ko1i2
+kol2a
+ko3le
+kol2k5
+3kom
+ko4mu
+k2on
+ko3n2e
+kons4
+ko3nu
+2kop.
+ko1pe
+kop4fen
+2kops
+2kopz
+ko1r2a
+2k1orc
+kor6derg
+ko3ri
+k2os
+ko2sp
+ko3ta
+kot1s2
+kot4tak
+2k1ou
+3kow
+ko2we
+k1o2x
+1kö
+kö2f
+k1öl
+2k1p2
+k1q
+k2r4
+2k3rad
+kra4s3
+k3rats
+2kraum
+k4raz
+2k3rät
+2k3räum
+2kre.
+2k3rec
+2k3rede
+2k3ref
+2kreg
+k3reic
+kre1i2e4
+kreier4
+k3reih
+2k3rh
+2krib
+2k3ric
+k3ries
+2krip
+3kris
+3k4ron
+kro4ss
+2kruf
+krü1b
+2k1s
+k4s1amt
+k2san
+k2sau
+ks2än
+ksch4
+ks1e2b
+k2s1em
+k2sent
+ks1erl
+k2s1ers
+k2s1erw
+k2s1id
+k2s1in
+k2s1o2
+k3sof
+ks1pa
+k3spe
+ks2por
+ks2pu
+kss2
+kst4
+k4s3tanz
+kstat4
+k4stea
+k2s1tis
+k2s1tor
+k2strä
+k2stum
+k2s1u
+ks2zen
+4k1t
+kt1abs
+k2t1ad
+kt1akt
+k3tal
+kt1am
+kt1an
+k2t3a2r
+kta4re
+k2t1au2
+ktä5s
+kte3e
+kt1ei
+k2temp
+k2tent
+k4t3erfo
+k2t1erh
+kte3ru
+k2tex
+k2th
+kt3ho
+k2t1id
+kt1im
+k2t1ing
+kt1ins
+kti4ter
+k2t1of
+k3top
+kt1ope
+k4torga
+kt3orie
+kt4ran
+kt3ras
+kt4ro
+kt3run
+kt3s2
+kts4t
+ktt2
+k2tuns
+kt3z
+ku1c
+kuh3
+2k1uhr
+kul2a
+ku3l2e
+ku3l2i
+2kulp
+2k3uml
+kum2s
+k2u3n2a
+kun4s
+kunst3
+2kunt
+2k1up.
+kur2bl
+ku2rei
+kuri2e
+ku2ro
+kur2sp
+kur4st
+ku4schl
+ku2sp
+kus3ses
+ku2su
+ku2ß
+1kü
+2küb
+kü1c
+kür2s
+2k1v
+2k1w
+2k3z2
+kze3l
+5la.
+l1ab
+la3ba
+2labb
+4l3aben
+2labf
+2labg
+2labh
+4la2bl
+lab2o
+l2abr
+lab4ra
+lab4ri
+2labs
+3labu
+2labw
+la1ce
+la2ce.
+1lad
+lad2i
+l1adl
+2ladm
+2l1a2dr
+3ladu
+l1adv
+2laf
+la2fa
+laf3t
+la2ga
+la2gio
+la2gn
+lago2
+la2g1ob
+lag5se
+2la1ho
+1lai
+lai4s1t
+la2k1i
+l2akk
+la1k4l
+2l1al
+4lall
+4lalp
+l2ami
+la3min
+lam4ma
+1lammf
+l2amp
+2l1amt
+lamt4s
+la4mun
+l1anal
+la2nau
+2lanb
+3l2and
+lan2d3a2
+lan6d5erw
+lan6d5erz
+lan2d3r
+2lanf
+lan2gl
+lang3s2
+2lanhä
+l2anhe
+2lanl
+4lanli
+2l3ann
+l1anp
+2lans
+4lansä
+2lantr
+lan2zw
+3lao
+l1a2po
+lap4pl
+la2r1an
+la2r1ei
+la4rene
+3l4ar3g
+lar3ini
+2l1ar3t
+l3arti
+la2ru
+la2sau
+4lasd
+la5se
+2lash
+2lasi
+la2so
+2la2sp
+3lasser
+la2sta
+last1o
+la2str
+las3tur
+la2stü
+la2ß3
+lat2a
+la3te
+la4tel
+2l3ath
+la2t3ra
+lat2s
+2lat2t1a
+lat4tan
+lat4t3in
+lat2t3r
+laub4se
+lau2fo
+l2aufz
+1laug
+2lausl
+2lausr
+2l1auss
+2lauto
+1law
+lawa4
+lä1c
+2läf
+2l1ähn
+1länd
+lär2m1a
+lä4s5c
+lä4s3s
+4lät
+2läub
+2läuc
+2läue
+1läuf
+1là
+2l1b
+l3bac
+l2b1ede
+l4beta
+l2b1id
+l2b1ins
+lb2lat
+l3blä
+lb3le
+l2bli
+l3blo
+l4bre.
+lb3rit
+lb2s
+lb3sa
+lb3se
+lb4sk
+lb3sp
+lb4st3e
+lb4sto
+lb2u
+l2b3uf
+lbus3s
+lbzei2
+2l1c
+l3che
+lchermas8
+l3chi
+lch3l
+lch3r
+lch3s
+lch3ü
+lch1w
+l3cl
+l3co
+4l1d
+ld3a2b1
+l3d2ac
+ld3ack
+l2d1a2d
+lda4g
+l2d1ak
+ld1al
+l3dam
+ld1amm
+l2d3a2n
+l2d1a2r
+ld3ari
+l3das
+l3dat
+ld1au
+ld1är
+l2dei
+l2dele
+l3der.
+ld1erp
+l2d1e2se
+l2dex
+ldi2c
+l2d1id
+l2d1im
+ldo2r
+ld2os
+ld2ö2
+ld3r
+l2dran
+l2dre
+l3d4ru
+ld4rü
+ld3sa
+lds2t
+ldt4
+ld3th
+l2d1um
+ldy3
+ldys2
+1le
+3le.
+le2ad
+3leba
+leben4s
+le2bl
+2lec
+le2chi
+lecht4e
+3led
+4ledd
+le3de
+le2e
+le3ei
+lef2a
+le2g1as
+le2gau
+le2gä
+le2gl
+leg4r
+3leh
+leh3r2e
+4lehs
+4leht
+3lei.
+lei2br
+l2eic
+l2eid
+4l1eig
+l2ein.
+leinbu4
+leinbus5
+l2eind
+lein4du
+l2eine
+lei6nerb
+2leink
+l2eint
+lei6ss5er
+l4eist
+lei4ßer
+l2eit
+lei2ta
+lei8t7er8sc
+lekt2a
+2lektr
+3l2ela
+2l1e2lek
+lel3s
+3lemes
+le2m1o2
+4lemp
+l2en.
+le4nad
+le2nä
+4lendet
+2lendu
+le4n3end
+4lenerg
+l2enf
+le3ni
+l2enk
+2l1enni
+l2e2no
+len4sem
+len3sz
+l1ents
+2l3entw
+lent4wä
+5lentwet
+4lentz
+len2zi
+le1os
+2lep
+3lepa
+3lepf
+3lepr
+l2er.
+l2e1ra
+le2ra4g
+le2rau
+lerb4
+4l3ereig
+le4r3eim
+le4rers
+l1erfo
+l2erfr
+l2erfü
+3lergeh
+l3ergen
+lergeschos8
+lergescho7sse
+3l4ergew
+2l1ergi
+lergro3
+lerin4s
+lerk2
+l2erka
+l2erko
+l2erle
+le1ro
+2l1er2ö
+3l2erra
+l4ers.
+lers2k
+ler3t
+6lerwerb
+l1erz
+l2erza
+les2am
+les2e
+2l1esel
+le3sh
+lesi1
+le3sk
+les3s
+leste3
+4lesw
+2lesy
+le2tat
+2le3th
+2leto
+le2u
+4leud
+2leuro
+3leut
+3lev
+2lexe
+le2xis
+2lexz
+2l1f
+l3fah
+lfä4s3
+l2f1ec
+lfe1e
+l4feis
+l3f4lä
+lf3lo
+l3f4lu
+lf3ram
+lf2tr
+lf4u
+lfur1
+l3fü
+2l1g
+lga3t
+lgd4
+lgen2a
+lge3ra
+lgeräu3
+l2geti
+l3go
+lg3re
+l3gro
+lgro3s
+lg2s
+lg4s1t
+2l1h2
+3lhi.
+1li
+3lia
+li3ac
+li3ak
+li3ar
+libi3
+li1c
+3lichem
+3licher
+li3chi
+4lick
+li3d2a
+li2deo
+2l1ido
+li4ds
+l2ie
+3lie.
+liebe4s
+li3ene
+lie4s3c
+lie5sse
+lie4sta
+3lig
+lig4n
+li2gre
+lig1s2
+li3ke
+li2kr
+lik2sp
+lik4ter
+li3l
+lil2a
+2lim
+li3m2a
+l1imb
+3limo
+li3n2a
+lin3al
+2l1indu
+li4ned
+li2nef
+li2neh
+li2nep
+li2nes
+2l1inf
+lings3
+2l1inh
+2l1in1it
+2l1inj
+lin2k1a
+link2s
+li2nol
+l2ins.
+l2insa
+l2insc
+2linsp
+2linst
+2l1int
+l1inv
+2linz
+li2o
+li4om
+lion5s
+li3os.
+li2p3a
+3lis.
+li3s2a
+li4schu
+4lish
+2l1isl
+2l1i2so
+li2sp
+liss4
+2liß
+li2tal
+li3te
+li1t2h
+lit1s2
+lit3sz
+li2tur
+3liu
+2lixi
+li2za
+lizei3
+4l3j
+2l1k
+lk1alp
+l3k2an
+l3kar.
+lken3t
+lk2l
+lk3lo
+l3k4lu
+lk4ne
+lkor2b1
+lk4ra
+l2k3ro
+l2k3ru
+lk2s1
+lk3sä
+l3k2ü
+4l1l
+lla2be
+l2labt
+ll1aff
+ll1akt
+l3l2al
+l2l1a2m
+ll3ama
+lla2n
+ll2ang
+ll2anw
+ll1anz
+l3lap
+ll1arm
+ll1au
+ll4aufe
+ll3aug
+l2l3aus
+l2l1äm
+llb4
+llch4
+ll3d4
+l3lec
+ll1ech
+lle3en
+l2l1ef
+l2legt
+l2legu
+ll1eim
+ll2em
+l3len.
+lle4n3a
+ll3endl
+ll3endu
+llen3g
+l4lents
+l3ler.
+lle2ra
+l4lerfo
+l6lergen
+l4lergo
+ll3ernt
+ll3ertr
+l2lerz
+ll2es
+l2lex
+llg4
+l4lieg
+ll1imp
+l2l1ind
+ll1ins
+llk4
+ll5m
+lln2
+ll1ob
+l2lobe
+l2l1of
+ll1opf
+l2l1o2r
+l3lor.
+l3lore
+l2l1ou
+l2löf
+ll1ö2se
+ll3sh
+ll3s2k
+ll2spr
+ll4s3tor
+ll3t4
+llti2m
+llt5s2
+llu2f
+ll1ur
+llust6
+ll3z2
+2l1m
+l2m3a2b
+l2marc
+lmas2
+lma3sse
+lm1aus
+lm1c
+lme2e
+lm3eins
+l2m1e2p
+l2m1erz
+lm1ind
+lm1ins
+l2möl
+lm3p
+lmpf4
+lm3s2z
+lm3t
+4ln
+lna4r
+ln3are
+l3n4e
+l3ni
+l1nu
+l1nü
+1lo
+3l2ob.
+lo2ber
+2lobj
+2l1o2bl
+l2obr
+lob4ri
+l1o2fe
+lo1fl
+lof4r
+lo2gau
+lo3h2e
+2l1ohr
+loi4r
+3lok
+lo2k3r
+lol2a
+l1o2ly
+lo2min
+lo2n1o
+lo2o
+2lopf
+2lopt
+lo1ra
+lo4rä
+2lorc
+l1ord
+lo3ren
+2l1or3g2
+3lorq
+3los.
+lo4sa
+3lose
+lo4ske
+lo2spe
+loss2e
+lo4steu
+lo2s3to
+lo2s3t4r
+lo2ßu
+lo2t1a
+lo3tha
+loti4o
+2l1ov
+lo2ve
+2lox
+1lö
+lö2b3
+2löd
+lö2f
+2l3öfe
+4lög
+l1öhr
+2l1ö4l
+4löß
+2l1p
+l3pa
+lpe2n3
+lp2f
+l2p1ho
+lp3t4
+l3pu
+2l1q
+2l3r2
+lra4ss
+lrat4s
+lrom2
+lrö4
+lrös3
+lrut4
+lrü1b
+4l1s
+l3sac
+l2s1a2d
+l3s2al
+l4s1amb
+l2sanf
+l2sann
+l3sare
+l2sau2
+lsä4s
+l4schin
+l4schmü
+l3se.
+l2s1e2b
+l2s1ec
+l2s1em
+ls1ere
+ls1erg
+ls1erl
+l2s1ers
+l2s1erw
+l3ses
+l3sex
+l4sha
+lsho2
+l2s1imp
+ls2log
+ls3ohne
+l4s3ort.
+l3s2pi
+ls2po
+l2spro
+l3s2pu
+ls3s2
+lst2a
+lstab6
+ls2taf
+l4s3täti
+l2s1tis
+l2stit
+ls2tr
+ls1um
+l2sun
+lsu3s
+ls2zen
+4l1t
+l2tab
+lt1abs
+ltag4
+lt1ak
+lt1a2m
+l3tami
+lt3and
+lt1ang
+l3tarb
+lt1art
+l2t3ato
+l2t1au
+l3te.
+lt1eh
+l2t1eis
+lte4lem
+lt3eli
+l3t2en
+lter3a
+l3t2erg
+lt4erö
+l2t1esk
+lte3str
+l3tet.
+lte2th
+l2t1eu
+l2th
+l4thei
+lt3ho
+l3thu
+ltimo4
+l2tob
+l2t1of
+lt1op
+l2t1o2ri
+lto2w
+lt1öl
+lt1ös
+lt3öt
+lt4rak
+ltra3l
+l3trä
+lt3räu
+lt3re
+lt4rie
+lt3roc
+lt3ros
+l2t3rö
+l4ts
+lt3sc
+lt1spa
+lt4stab
+lt5ste
+lt4stoc
+ltt2
+lt1uh
+l2t1um
+ltu4ran
+ltu2ri
+lu1an
+4lu4b3
+luba2
+lubs2
+lu2dr
+lu2es
+1luf
+2l1ufe
+2luff
+luf2t1a
+luf2t1e
+luf2t5r
+lu2g1a
+lu2g1e2b
+lug3erp
+lu4g3l
+lu2go
+lu2g3r
+lug3sa
+lu2gu
+2l1uh
+lu1id.
+lu1is.
+lume2
+2lumf
+2luml
+l2ump
+l1ums
+l1umw
+1lu2n
+2l1una
+2l1unf
+2l1uni
+2lunt
+2lunw
+4lu2o
+lu2pf
+2lur
+l1urn
+l1urt
+2luse
+lu2sp
+lus4s3a
+lus2s1c
+lus3sen
+lus2s1o
+lus2s3p
+lus4s1t
+lus2t
+lu2st1a
+lu2stä
+lu2sto
+lu3str
+lust3re
+lu2s1u
+4lu2ß1
+lu2t1a
+lu4teg
+lu4t3erg
+lut1o2f
+lu2top
+lu2t3r
+3lux
+2lüb
+5lüd
+lüh1l
+lüs3
+2l1v
+2l3w
+2lx
+1ly
+ly1ar
+ly3c
+2lymp
+3lyn
+ly3no
+ly1o
+lys2
+ly3te
+ly1u
+2l1z
+l2z3ac
+l3z2an
+lz2erk
+lz1ind
+lzo2f
+l2zö
+lz3t2
+l2z1u4fe
+lzug4s
+lz1w
+lz2wec
+1ma
+maa2
+m1ab
+m2abe
+2mabk
+m2ab4r
+2mabs
+2mabt
+mach4tr
+ma2ci
+ma3da
+ma2d4r
+ma4d2s
+ma1f
+ma2ge.
+ma2geb
+ma2gef
+ma2geg
+ma2gek
+ma2gep
+ma4ges.
+ma2get
+ma2gev
+ma2gew
+2m1agg
+magi5er.
+magi5ers
+ma3g4n
+2m1ago
+mai4se
+2m1akt
+mal1ak
+ma4lakt
+ma2lan
+ma4l3at
+ma2lau
+mal3d
+ma3ler
+mali1
+mal3lo
+2mallt
+malu4
+ma2l3ut
+mam3m
+2m1anal
+ma2nau
+2manb
+man4ce.
+man3d2
+man3ers
+ma2net
+m2anf
+2m1angr
+m2anh
+2manl
+m4ann
+m1ans
+m2ans.
+2mansa
+2mansä
+2mansc
+2mantw
+2manz
+ma2or
+m2app
+2m3arb
+mar3g2
+4ma3r2o
+maro3d
+4marr
+mar6schm
+mar6schr
+ma3r2u
+m3arz
+3mas
+ma1s2pa
+4m1aspe
+ma3sses
+mas6ses.
+mas6sest
+ma6sset
+ma3s2su
+mas2t
+3maß
+ma2ta2b
+ma2tan
+mat4c
+ma2tel
+ma4t3erd
+mat3se
+mat1sp
+2m1au2f
+ma3un
+2mausg
+m4ay
+ma1yo
+3mä
+m1ähn
+mä1i2
+4m1änd
+m1ärg
+mä1t4r
+mäu2s1c
+2m1b2
+mbe2e
+mb4l
+m3b4r
+mby2
+2mc
+m3ch
+2m1d
+md1a
+m2d1ä
+m2dei
+mds2e
+m2d1um
+1me
+meb4
+m2e1c
+medi3
+medie4
+medien3
+2medy
+me1ef
+mee2n1
+mega3
+3meh
+2m1eif
+2m1eig
+m2eil
+mein4da
+meis2
+me1i2so
+m2eist
+me3lam
+3meld
+me2lek
+me2ler
+melet2
+2melf.
+mel2se
+mel3t4
+6mel6tern
+2m1e2mi
+m2en.
+mena2b
+me3nal
+men3ar
+men3au
+men3gl
+me3nor
+m2ens
+men4sk
+men2so
+men3ta
+2mentn
+4m3entwi
+me1o
+2meou
+2meö
+3mer.
+me1ra
+me2r3ap
+me4rens
+mer2er
+4m3ergän
+3merin
+merin4d
+merin4t
+3mers
+merz4en
+3mes
+me2sal
+me4sä
+mes2e
+4meser
+2me3sh
+4m1essa
+mes6serg
+mes2s1o
+mes2s1p
+meste2
+me2str
+4mesu
+3me2ß1
+me3t2a
+me3th
+meu1
+2m1ex
+1mé
+2m1f4
+mfi4l
+4m1g2
+2m1h4
+1mi
+mi2ad
+mi3ak
+mibi1
+mi1ch
+mi3da
+mie3dr
+mi2e1i
+mie3l
+mi2er
+mierer4
+mi2et
+mie4ti
+3mig
+migescho7
+migeschos8
+mi2kar
+mi2ki
+mi2ku
+3mil
+mi3l2a
+milch1
+mil4che
+4milz
+2m1imp
+min2en
+min2eu
+min2ga
+mings2
+mi3ni
+3min2o
+mi1nu
+3mir.
+mi3ra
+3miri
+3mirs
+3mirw
+mi2sa
+mi4scha
+mi4schn
+mi4schw
+mise1
+mis4s1c
+mis4ser
+mis3si
+mis4st
+mi2ß1
+3mit1
+mi2ta
+mi2th
+mi2tr
+mit3s2
+mit5sa
+mi3tsu
+mi2tu
+4mitz
+2m1j
+2m1k4
+m3ka
+mk5re.
+2m1l2
+ml3c
+ml3l
+ml3s
+2m1m
+m2mab
+m2m1ak
+m2m1al
+mm1ang
+m2mans
+mm1anz
+m2m1au
+mmd2
+mm1ei
+mmeis3t
+mme4lin
+mme4na
+m4mentw
+mme2ra2
+mme4rec
+mme2s3a
+mm1inb
+mm1inf
+mm1inh
+mm1ins
+mm1int
+mmi3sc
+mm3p
+mms2
+m2mum
+mm2un
+mmül2
+2m3n2
+m4nesi
+1mo
+moa3
+2mobj
+3m2od
+mode3s
+mo2dr
+4mog.
+mo2gal
+3moh
+mo2i3
+mo2k1l
+2mol.
+3mom
+mom2e
+3m2on
+mo3ne
+mo4n1er
+mon3s
+3mo2o
+2m1ope
+2mopt
+mo1ra
+mo2rar
+2m1orc
+mor2d3a
+mor2dr
+mo2rer
+mork4
+3mos
+moster4
+mo2sto
+3mot
+m1o2x
+mo1y
+1mö
+mö2c
+4mök
+m1öl
+2m1p
+m2pf
+mp4f3erg
+mpf3erp
+mpf3err
+mp4f3erz
+mp2fl
+mpf3li
+mpf1or
+m3pon
+mp3ta
+m3pu
+2m1q
+2m3r2
+2m1s
+m2san
+ms3and
+ms1as
+m3sä
+msch2
+m2s1ef
+ms1erf
+ms1erw
+ms1ini
+mso2r
+ms1ori
+m2spä
+m2sped
+ms2por
+m2spot
+m2spro
+ms2pu
+ms3s2
+m4stag
+m2stal
+ms1um
+m2sü
+4m1t
+mt1ab
+mt1ak
+m3tam
+mt1ar
+mt3are
+mt1elt
+m2t1erf
+m2t1erg
+m2t1erl
+m2t1ers
+m2t1ert
+m2t1eta
+m2t1eu
+m2th
+mt3ho
+m2t1im
+m2t1ins
+mti2s
+mtmen2
+mt1ös
+mtra4s3
+m4ts
+mt2sa
+mt2s1e
+mt3s2ka
+mts1p
+mt1spa
+mtt2
+mt1um
+mt1urt
+mt3z
+1mu
+mu1a
+2m3uh
+mu3la
+2muls
+3mun
+mun2d1a
+4m3unf
+4m3ungeb
+mu3ni
+m4unk
+munt2
+4munz
+mu3ra
+mu4r1u2f
+mu4s1a
+3musi
+mu2s1o
+mu2sp
+mu3s4se.
+mu3s4ses
+mus2te
+mu2s1to
+mu2str
+mu2su
+muße3
+mu2t1au
+muts3
+mut2st
+1mü
+2müb
+mül4len
+3mün
+mü3ssi
+3müt
+2m1v
+mvoll1
+2m1w2
+mwa2
+mwa4r
+1my
+2m1z
+mzug4
+1na
+3na.
+2n1ab
+na2bä
+4nabg
+4nabh
+na2bl
+na2br
+4n3abs
+4nabt
+3n2a2c
+nach1
+na3chen
+nach3s
+nacht6ra
+4nadd
+n2ade
+4na2dr
+n1af
+na1f4r
+3n2ag
+na2gem
+3n2ah
+na2h1a
+n3ahn
+3nai
+nai2e
+n3aig
+n3air
+2n1ak
+na2ka
+3nako
+n2al.
+na2l1a2
+na2lä
+3n2ald
+n4ale
+na4lent
+na2let
+nal3l2a
+nalmo2
+na2lop
+nal2ph
+n2als.
+nal3t4
+na2lu
+2naly
+3name
+n2amen
+4n1a2mer
+na3m4n
+3namo
+nam2sp
+2n1amt
+namt4s
+n1an.
+4n1a2na
+4nanb
+n1and2
+4n1ang
+2nanh
+2nani
+4nank
+2nanl
+3nann
+na3no
+n1anp
+2nanr
+2n1ans
+2nantr
+2nanw
+nap2si
+n1ar
+5nar.
+na2r1a
+2narc
+n2ard
+4narg
+3nari
+n2ark
+n2arle
+2narm
+n2arp
+4n3art
+na3r2u
+3nas
+n2as.
+na4schw
+4nasp
+4n1a2sy
+nasyl2
+3naß
+3nat
+n4ata
+na3t4h
+4natm
+nats1
+nat4sa
+nat4sc
+4natt
+n1au
+4nauf
+nauf4fr
+n3aug
+5naui
+3n2aul
+4nausb
+4nausg
+n2auso
+4nauss
+n4auste
+4nausw
+navi5er.
+navi5ers
+1nä
+2näb
+3n2äc
+3näe
+n1ähn
+2n1ä2m
+2n1än
+2näp
+nä4sc
+n2ä4s3s
+2näu
+3nä1um
+2n3b4
+nbe2in
+nbe3n
+nbe3r2e
+nbu3s
+nby2
+2n1c
+n3ce2n3
+nch3m
+2n1d
+nd2ag
+n2d1ak
+n2danl
+nd1ann
+n2d1anz
+ndat2
+n2d1au
+nd1c
+nde4al.
+n2dei
+nde4län
+n4d3ents
+nde4rob
+nde2s
+ndes1e
+ndi2a3
+n2dob
+ndo2be
+nd1op
+nd1or
+n2dö
+n2d3rat
+n2d3re
+n2drob
+nd3rol
+nd3ros
+n2drö
+n2drui
+n4d3run
+nd2sor
+nd2spr
+nd4stab
+nds3tau
+nd3th
+ndt4r
+n2dü4
+ndy3
+1ne
+3ne.
+ne2ap
+ne3a4s
+ne3at
+ne2bl
+2n1ebn
+2nec
+3neca
+3ned
+ne2de
+2nee3
+ne2e2i4
+ne3ein
+n1ef
+neg4
+2ne2he.
+3nehm
+4n1ehr
+2n1ei
+n2eid
+4neif
+3neigt
+4n3eing
+4n3eink
+ne2ke
+nek3t4
+ne2l
+3nela
+nel3b
+2n1ele
+4nelek
+4nelem
+ne3len
+ne3li
+nel4la
+nel2lä
+3ne3l2o
+3ne3lu
+n2em.
+2n1emb
+n1e2mi
+2n3emp
+2n1ems
+3nen
+n2en.
+nen3a2
+n2enb
+n2enc
+4n1endb
+4n1endd
+4n1endf
+n1endg
+4n1endh
+4n1endk
+4n1endp
+4n1endt
+4n1endw
+ne2n1e2b
+nen3ei
+nenen1
+ne4nene
+4nengb
+nen4ge.
+nen4gen
+4nengs
+4nengt
+n2enh
+ne2ni
+n2enj
+nen3k
+ne2no
+n2ens
+nens4e
+nen3sk
+5n2en3t2a
+n1entb
+4n1entl
+4nentn
+5nentr
+n1ents
+4n3entw
+4nentz
+ne2n3u
+n2env
+n2enw
+ne2ob
+ne1os
+2nepf
+2n1epo
+ne2pos
+n2er.
+ne1ra
+ne2ra2b
+ne3r4al
+ne2r3am
+ne2ran
+ne2rap
+ne2rau
+4nerbe.
+4nerben
+n1erbi
+nere2
+ne2reb
+n1erf
+4n5erfo
+nerfor4
+2nerfü
+3nergr
+n1erh
+2n3erhö
+3neri
+n1erk
+n2erli
+2n1erlö
+nerma3
+nermas4
+n1ermä
+ner4mit
+n2ern.
+4n1ernt
+ne1rös
+n2erp
+3n2ers.
+2n3ersa
+ner8schle
+n2ert.
+n1ertr
+ne2rup
+n2erv
+2n1erz
+3n2es
+n4es.
+nes2c
+ne2sei
+ne2sev
+nesi1e
+ne3ska
+nes1o
+ne2sor
+ne2s1p
+4n3essi
+ne2tad
+ne2t1ak
+ne2t1an
+ne2tap
+n1etat
+ne2tau
+ne2th
+net3ha
+nett4sc
+n1e2tu
+net2zi
+ne2u
+neu1c
+neu3g
+2n1eup
+n2ew
+2n1ex
+3nez
+1né
+2n1f
+nf1ak
+nf2ä
+nfä4s
+nff4
+n3fi
+nfi4le.
+nf4l
+nf5lin
+nflös4
+nf2o
+nf4r
+nft2o
+nft2s3
+nft4st
+n2f1u
+4n1g
+n2g1ac
+ng1ad
+n2g1ak
+n2g1a2m
+n2g1and
+ng2anf
+ng1anz
+n2g1äl
+ng3d4
+n3gef
+n2g1ein
+ng2en
+ngen2a
+ngens2
+n3ger
+nge4ram
+n4g3erse
+ng6es
+nges2t
+nge4zän
+ng3g4
+nggeschos8
+nggescho7sse
+ng3hu
+n2g1i2d
+n3gläs
+n2glic
+n2glo
+n3g2loc
+n2glö
+ng3m
+n2gn
+ng3ne
+ng1or
+ng3rat
+ng3roc
+ngro3s
+ng2s
+ngs1c
+ng4s3e4h
+ngs3pa
+ng3ts
+n2gum
+2n1h2
+n3han
+n3har
+n3hau
+n3hä
+n3he
+nhe2r
+n3hu
+1ni
+3nia
+nib4l
+nibu2
+nich8ters
+n1id
+ni2de
+ni3de.
+ni3dr
+n4ie
+nie3b
+ni1el
+nie3l2a
+nie4n
+ni3ene
+ni1ero
+nig2a
+2n3i2gel
+nig3r
+ni2gre
+3nik
+ni2kal
+ni2kar
+ni3ker
+ni4k3ing
+ni3kl
+nikma3
+ni2kr
+3n2il
+nim2o
+4n1imp
+nin1
+3n2in.
+n2in4a
+4n3ind
+2ninf
+3n2ing4
+4n1inh
+ni2nor
+2n1ins
+n2ins.
+4ninse
+4n1int
+2n1inv
+ni2ob
+ni3ok
+ni3ol
+n2ip
+ni3ra
+3n2is
+ni4schw
+ni2s1e
+ni2s1p
+ni3spi
+nis5s2
+ni2stu
+ni3stun
+ni2s1u
+2nit
+ni1th
+ni2ti
+ni3t4r
+nit2s
+ni3tsc
+nit4tec
+nitt4sa
+ni3tu
+ni3v
+3nix
+n1j
+2n1k
+n2k3ad
+n2k1ak
+n3k2al
+n4k3alg
+nk2am
+n2kans
+n2kau4s
+n2käh
+n2k1är
+n4k3erfa
+nk4erg
+nk1inh
+n2k1ins
+nk3len
+nk3les
+n2klie
+nk2lo
+nk2lu
+nk3lun
+nk4na
+n2kne
+n2k1ort
+nk2öf
+n2köl
+n2k3ro
+nk2sal
+nks2ei
+nk3s2z
+nk2tak
+nk2tan
+nkt1it
+nk4top
+nk2tru
+2n3l2
+2n1m4
+nmen2s
+4n1n
+nna2be
+n2nada
+n4n1all
+n2n1an
+n2nau
+n3nä
+nn3d
+nnen3g
+n4nents
+nn2erh
+nn2erk
+nne2rö4
+n4n3er4wa
+nner2z
+nne2s1e
+nn2ex
+nn3f
+nng4
+n3ni
+n2nof
+nn1o2r
+nn3se
+nn3s2p
+nn2th
+n2n1uf
+n2n1unf
+nn1ur
+1no
+3no.
+3nobl
+no2bla
+n2o3ble
+2n1obs
+no1c
+2no2d
+no3dr
+n1of
+2n3o2fe
+n3ole
+no2leu
+n2on.
+3n2opa
+3nor.
+nor2a
+no2rad
+no1rak
+no3ral
+2norc
+nor2d5r
+3norh
+3norm
+3nors
+n1ort
+3n2os.
+no3sh
+no2sp
+no4ss
+n2oste
+nost1r
+2nostv
+no3tab
+no2tä
+no4t3ei
+no2tel
+no3t3h
+no4tha
+no2t3in
+no2t1op
+no2tr
+3nov
+3now
+2n1o2x
+3noz
+2nöd
+2nö2f
+4n1ö4l
+nö4s3s
+2n3p4
+npa2g
+npsy3
+2n1q
+2n3r2
+nra4s3s
+nräu3s
+nre3sz
+nrö2s1
+6n1s
+n2s1a2d
+n2sall
+n2sang
+n2sant
+n2saus
+n3sav
+n2s1än
+nsä4s
+n2s1äus
+ns2ca
+n6schef
+n4schro
+nsch7werd
+ns1eb
+ns1e2d
+nseh5ere
+n3senk
+nsen4sp
+ns1ent
+n2s1ep
+ns1erf
+n4serfo
+ns1erg
+n2serh
+n3seri
+n2s1erk
+n2s1erö
+ns1ers
+n2s1erw
+n2s1erz
+nse2t
+n2s1eta
+n3sex
+nsfi4l
+nsho2f
+n2simp
+n2s1ini
+nsi2te
+nsi2tr
+ns2kal
+n2s1op
+n4s3ort.
+nsp4
+nspas2
+n2spat
+n2sph
+ns2pi
+n2spo
+ns3pon
+n2sprä
+n4s3prie
+n4spro
+ns3s2
+ns2t1ak
+n4stat.
+n4s3tate
+ns2tau
+n5s4te.
+n4st3eif
+n5s4tel
+ns4tem.
+ns4ten.
+n4stent
+ns2ter
+ns4ter.
+nst4erö
+ns4tes.
+n5steu
+nst5opfe
+ns2tor
+n4strac
+ns2tum
+nst2ü
+nstü1b
+n2sty
+ns2um
+n2s1un
+ns2ung
+ns2unr
+n4s3zi
+2n1t
+nt3abs
+n3t2a3c
+n3t2al
+nta3m
+n4tanza
+nt2arb
+nt1ark
+nt2arm
+nt4at
+nt1äm
+n2t1äu
+n3te.
+nte3au
+nte2b
+nt1ebe
+nte1e
+nte3g6
+nt1eh
+n2teig
+n3t2en
+nt4ene
+nten6te.
+n3ter
+nt4ern
+nt4ers
+nt4ert
+n2t1ess
+n3tet
+nteu3
+nte3v
+nt2her
+n2t3ho
+n3thr
+n3t4hu
+nti3k4l
+n2tinf
+n2t1inh
+ntini1
+nt2ins
+n3tit
+ntmen2
+ntmo2
+n3to
+nto3me
+nton2s1
+ntras3s
+nt3rec
+nt3reif
+n3trep
+nt4rig
+n3trop
+n2t3rü
+n4t1s
+nt3sa
+nt4sau
+nts2o
+nts2p
+nt4s3par
+nts2t
+nt4sto
+3n4tu.
+ntum2
+ntu2ra
+ntu4re.
+ntu4res
+nt3z2
+1nu.
+1nu1a
+nu3ar
+nubi1
+1nuc
+1nud
+3nue
+nu2es
+nuf2
+nu2fe
+1nug
+2n1uh
+1nui
+nu3k4
+n2um.
+2n3umb
+2numf
+2numg
+3numm
+2numr
+2n1ums
+2n3umz
+nu2n
+2nuna
+1n2ung
+3nung.
+n3ungl
+2n1uni
+2nunt
+1nuo
+2nup
+2nur
+3nu2s
+nu3sc
+nu3se
+nu3sl
+nu4s1t
+1nu2ß
+1nut
+nu2t1a
+nu2t3r
+1nuu
+1nux
+1nuz
+3nü.
+2nü4b
+nür1c
+3nüs
+1nüt
+2n1v2
+n3ver
+4n1w
+nwei4st
+2nx
+1ny.
+1nyh
+2nymu
+n1yo
+1nyr
+1nys
+1nyw
+2n1z
+n2zad
+n2z1a4g
+n2zan
+n2z1au
+n2z1än
+n2zär
+nz1ec
+n4zense
+n4zentw
+n4zentz
+nz3erwe
+nzi2ga
+n2zinh
+nz1ini
+n2zor
+nz2öl
+nzug2s
+n2zurk
+n2z1wa
+n2z1wä
+n2zwö
+n2z1wu
+ño1
+2o3a2
+o4abi
+o4ac
+oa3che
+oa3chi
+o4ad
+oa3de
+oa4g
+o4ah
+o4a3i
+oa3ke
+oak1l
+o4a3la
+o4a3mi
+oanne4
+o2ar
+o2a3s
+3oase
+oa4si
+o4at
+oa3te
+o5au
+o1b
+ob2al
+2oban
+o3bar
+2o3b2ä
+2obb
+ob2e
+2obe.
+2obea
+ob3ein
+2o3b4en
+oben3d4
+oben3se
+ober3in4
+obe4ris
+2obew
+2o3b2i
+obi2t
+ob3ite
+1obj
+ob1l
+o2b3li
+2o3blo
+2o3bo
+o2b3re
+o3bri
+ob3s2h
+ob3sk
+obs2p
+ob2sta
+2o3bu
+obus3s
+2o3bü
+2oby2
+2oc
+oc1c
+o1ce
+och1a
+ocha2b
+o1che
+oche4b
+o2ch1ec
+och1ei
+ocher4k
+och3l
+och3m
+och1o
+och3ö2
+och3r
+ocht2
+och3te
+o1chu
+ochu2f
+och1w
+o1ci
+ock2er
+ock3sz
+o1cl
+o3co
+o1ç
+o1d
+o3d2a
+od2dr
+o3deb
+ode2c
+o3d2e1i
+odein3
+ode2n1
+odene2
+o3dex
+2o3dia
+o3dir
+o3div
+o2don
+odo4s
+2odr
+o2dre
+odt4
+2o3du
+2o1e
+oe2b
+o2ec
+oe2d
+oe2h
+oe2l
+oe2n1
+o4es
+o2et
+o3et.
+o3ets
+oe2x
+o1ë
+2ofa
+of1ac
+of1am
+of1au
+o2f1ei
+of2en
+o3fer
+of2f1a
+of2f1in
+of2fir
+1offiz
+of2f5l
+of2fo
+of2f3r
+offs2
+of2fu
+2ofi
+of3l
+of1la
+of4lä
+of4lö
+2ofo
+2o1f1r
+of3ra
+of3rä
+of4rü
+ofs1a
+of4sam
+of2spe
+of2spr
+of2s1u
+2oft
+of2tei
+of3th
+2o1g
+o2g1ab
+oga3d
+og1ala
+og1ang
+o2g1ei
+oge2l1i
+ogenmas6
+o3gh
+ogi2er
+og2lo
+o3g4n
+ogoi3
+og2s2
+og3sc
+og3si
+og3sp
+o1ha
+o1hä
+o1he
+o2h1eis
+o2h1ert
+o2h1erz
+o1hi
+ohl1a
+oh3lec
+ohl1ei
+oh3lem
+oh3len
+oh3lep
+oh4lerg
+oh4l3erh
+oh4lerw
+oh3lo
+ohls2e
+oh2lu
+3ohng
+oh2ni
+1ohnm
+oh2n1o
+o1ho
+oho2la
+oh1o2p
+o2h3ö
+ohr1a
+oh4rin
+oh1ro
+oh3t
+o1hu
+oh1w
+2o1hy
+2oi
+o1i2d
+o3ie
+o1im
+oimmu4
+o1in
+oi2r
+o2isc
+o3isch.
+oi3se
+o1ism
+oiss2
+oi4st
+2o1j
+2o1k
+oka2la
+okale4
+3o2kel
+oki2o
+ok1lä
+ok4n
+4okr
+ok2s1p
+okt4
+2ol
+o1la
+o2lab
+o2l1ak
+ol2ar
+ol1auf
+o1lä
+ol4dam
+ol4dr
+ole3e
+ol1eie
+ol1eis
+oler2
+ol1ex
+o1lé
+ol2fa
+ol2fl
+olf1r
+ol2fra
+ol2gl
+ol2gr
+ol2i
+oli3k4
+oli3tu
+ol2kl
+olk3r
+ol2kre
+ol2lad
+ol2lak
+oll3ans
+ol2las
+ol2lau
+ol2läd
+ol4l1ec
+ol2l1ei
+ol2l1el
+oll5ends
+ol4lerk
+oll5erwe
+o3lo
+ol2of
+olo1p2
+ol1ort
+ols2t
+ol2str
+o1lu
+3oly
+1olym
+ol2z1a
+ol4z3ern
+ol2zin
+ol2zw
+2om
+o2mab
+oma4ner
+om2anw
+om1art
+o2m1au
+o2meb
+ome3c
+o2m1ei
+o3m2eis
+o2mel
+o3men.
+o2mep
+o2meru
+om1erz
+om2es
+omiet1
+o2m1ind
+om1ing
+o2m1int
+om3ma
+om1org
+om3pf
+oms2
+omtu3
+o4munt
+omy1
+2ona
+ona2b
+o2nae
+o3nal
+on1ap
+o2narb
+on2au
+on3aus
+2onä
+onbe3
+2onc
+onderer5
+2one
+one2i
+one2n1
+onen3g
+o2n1erb
+o2n1erd
+on1erg
+on1erö
+o3nett
+on3f2
+on3g2l
+ong4r
+ong3s
+4o3ni
+on2i3d
+o4nikr
+o4n1im
+on3ing
+on3k2
+onli4n
+onlo2c
+on3n2an
+on3n2e
+ono1
+o3nod
+o2noke
+on1orc
+ono3s
+ons1a
+onsa4g
+on2seb
+onse2l
+on4sh
+onsi2d
+ons3l
+ons1p
+onst2h
+on3t2a
+on4t3end
+ont3erw
+ont2h
+on2t3ri
+o1nu
+2onuk
+on3v
+1ony
+on3z
+o1ñ
+oo2k3l
+o1op
+o1or
+oor3f
+oo4sk
+oo2tr
+2o1ö2
+o1pa
+opab4
+o2p3ad
+op3akt
+o1pec
+o1pei
+o1pe4n
+2opf.
+op2f3a
+op3fah
+op4ferd
+opf5erde
+opf1l
+opf3la
+op1flü
+4oph2
+o3phe
+o1pi
+opi5a4
+opi3er.
+opi5ers.
+opin2
+op5lag
+o2p3le
+op3li
+2o3po
+op4pl
+op2pr
+2o1pr
+1opsi
+op3sz
+1op3t4
+o1q
+2or.
+or1a
+or3a2b
+2orak
+2oral
+o2r3alm
+or4alt
+3or2am
+or2and
+o2ranh
+or3arb
+o1ras
+or3att
+o3rä
+or1änd
+or1ät
+or2bar
+orb2l
+or1c
+2orca
+or2ce
+2orda
+or2d1am
+or2dau
+or4d3eng
+or2deu
+or2d1ir
+or2dit
+1ordn
+or2do
+2ordr
+2ords
+or2dum
+2ordw
+4ore
+ore4as
+o2r1eck
+o2r1ef
+ore2h
+or1eig
+o2rein
+or1er
+o2rerf
+or1eth
+2orf
+or2fle
+or3g4a
+2orget
+or3g2h
+2orgia
+orgi1e
+or2gl
+or3gle
+or2gn
+2orh
+2o3ric
+o4rient
+o3rier
+4oril
+4orin1
+2orit
+ork2a
+or2k3ar
+ork3s
+2orm
+or4mans
+or4ment
+or5ne.
+or3n2o
+2o1ro
+oro3n2a
+2o1rö
+2orq
+2orr
+orr4a
+or3rh
+2ors2
+or3s4a
+orsch5li
+or3sh
+or3si
+or3sz
+or2t1ak
+or2t1an
+or2t1au
+or2tär
+or2tef
+ort3eig
+or4t3ent
+or4t3ere
+ort3erf
+or2t3ev
+or2the
+ort3ins
+or4t3off
+or2tor
+or2tö
+or4trau
+or4t3räu
+ort3re
+ort3ric
+or2t1um
+o3ru
+or2uf
+o4r3un
+orus3
+o2r3ü
+o2rya
+o1s
+2o3s2a
+os3ad
+os4an
+o3sche
+2o3se
+ose3e
+o2s1ei
+ose2n
+o4sents
+2osh
+o3s2hi
+2osi
+o3sk
+o4s3ka
+o4ski
+2os2kl
+2os2ko
+os2lo
+2oso
+2os1p
+o2s3per
+o3s2po
+os2pr
+os2sa
+oss3and
+os4sä
+o6ssel
+o3ssem
+oss3en4k
+o3ssent
+oss3enz
+os2s3o
+os4son
+os2s3p
+os4s3t
+os2su
+os2t
+ost1a
+o2sta2b
+o3stal.
+o4stam
+ost4art
+osta4s
+o4sterd
+oster3e
+ost5er6we
+ost3h
+o2stin
+ost1ob
+o4s3ton.
+ost3ran
+o2st3rä
+ost3re
+ost3rot
+ost3uf
+2osu4
+2o3sy
+o3s2ze
+o2ß1el
+o2ß1en2k
+o2ß1enz
+o2ß1ere
+o2ß1erf
+oß3t
+2o1t
+ota2go
+o3tark
+o2t1au
+ot3aug
+otau4s
+o3t2ax
+o2teb
+o3t2e1i
+otei4n
+ote2l1a
+ote4lei
+ot4em3
+otemp2
+o2t1erw
+4ot2h
+ot4he
+ot5hel
+o4t3hi
+ot3hos
+o2thr
+o2t1i2m
+ot2in
+o4tl
+otli2
+ot4ol
+ot1opf
+ot2or
+oto2ra
+o3tra
+o2t3re
+ot3rin
+ot2sa
+ots1p
+ot2spa
+ots2t
+ots3tri
+ot4terk
+ot2th
+ot2t3r
+o2u
+oub4
+ou2ce
+ou1f4l
+oug2
+ou2ge
+ou3gl
+o3uh
+ou4le.
+o3um
+o3unds
+oung5
+oun4ge.
+oungs2
+o4up
+2our
+ouri2e
+our4ne.
+ou3s2i
+ous2t
+outu4
+2ouv
+2o1ü
+o1v
+2ovi
+oviso3
+2ovo
+2o1w
+o3wec
+owe2r1
+o3wi
+o1x
+ox2a
+ox2e
+1o2xid
+ox3l
+o2xu
+1oxy
+o1y2en
+o1yo
+2o1z
+oz2e
+ozen4ta
+o3zi
+ozon1
+órd2
+ö1b
+öbe2la
+öbe4li
+öb2l
+ö2ble
+ö2b3r
+2öc
+ö1ch
+öch1l
+ö2chr
+öchs2t
+öch4str
+öcht4
+ö1d
+ödi3
+ö1e
+1öf
+öf2fl
+öf3l
+ögen4s1
+ög3l
+ög3r
+ög2s
+ö1he
+öh3l2e
+öh3ri
+öh2s
+ö1hu
+ö3ig.
+ö1ke
+ö2ko
+ök3r
+ök2s
+3öl.
+öl1a2
+öl1ei
+öl1em
+öl2f1ei
+öl1im
+öl1in
+öl2k3l
+öl3la
+öllma4
+öllmas3
+öl2nar
+öl1o2
+öls2
+öl3sa
+öl3sz
+ö2l1u
+öl2ung
+ölz2w
+öm2s
+2ön
+ön2e
+ö3ni
+önn2e
+ö1nu
+öo1
+ö1pe
+öpf3l
+ör3a2
+ör1c
+ör2dr
+ö2r3ec
+ö2r1ei
+ö2r1e2l
+ör2erg
+ö2rerl
+ö3r2erz
+ör2f3l
+ör2gl
+ö2r1im
+ör2kl
+örner2
+ör1o2
+örs2e
+ör3s2k
+ört2e
+ör2tr
+öru4
+ö2r1une
+ö1s
+ö2sa
+ö2scha
+ö4sch3ei
+ö2schl
+ö2sch3m
+ö2schw
+ö2s1ei
+ös4en
+ös4es
+ö2sp
+ö3s2s
+ös4s1c
+ös3ses
+ös3set
+ös4st
+ös4t
+ö2sta
+ös4u
+ö1ß
+2ö1t
+ö2t3a
+öte4n3
+öt2h
+öt2sc
+öt2tr
+ö1v
+ö1w
+ö1z
+öze3
+özes4
+p2a
+1pa.
+1paa
+1pac
+pa3da
+pa2dr
+pa2el
+pa1f4r
+pag4
+pa3gh
+pa1ho
+1pak
+pa1k4l
+pak2to
+1pala
+pala3t
+1palä
+pa3li
+2palt
+pa2nar
+pan3d
+pan4ds
+pa3nei
+pa2neu
+pan3k4
+2panl
+3pa2no
+pan3sl
+pant2
+3panz4
+1pap
+papi2
+papieren8
+papie8r7end
+3para
+pa2r3af
+par3akt
+1parc
+pa5reg
+pa5rek
+2par2er
+2parg
+pargel6d
+1park.
+par4kam
+par4kau
+par2kl
+par2kr
+1paro
+2parp
+1partn
+1party
+par3z2
+pa1s2p
+pa2ßu
+1pat
+pat4c
+pat4e2
+pat4r
+1pau
+p3auf
+pa3uni
+1pä
+3päc
+3päd
+3pär
+3pä4s3
+pä4t1e2h
+pä4t3ent
+pät3h
+pä2to
+pät3s
+2p1b
+pbe1
+2p3c
+2p1d2
+pda2
+p2e
+1pe.
+pe2a
+pea4r
+1ped
+pe2en
+pef4
+pei1
+2peic
+pe1im
+pekt4s
+2peku
+1pel
+pe2l3a4
+pel3d
+pe2let
+pe2lex
+pe3li4n
+pe4l3ink
+pel3l4e
+pel3li
+1pem
+pena4
+pe3n2al
+pen3da
+pe4nen
+1penn
+pe2n1o
+pens2
+3pensi
+1pensu
+pen3z2
+1pep
+pe1ra
+per2an
+1perl
+per4na
+3pero
+per2ra
+perr3an
+per4rä
+per6rieg
+3pers
+perwa4
+pe3sa
+pes3s2
+3pet
+1pé
+4pf.
+p2f1ab
+p2fad
+p2faf
+pf3ai
+p2f1ak
+pf1ans
+p2fa4r
+pf3are
+p2f1au
+4p3fe.
+p2fei
+pf1eim
+pf1ein
+p3fen.
+p2fent
+p3fer.
+pf2erw
+p3f2es
+pff4
+p2f1ins
+p2f3lä
+pf3lei
+pf3lie
+pf3lo
+pf3lu
+p2for
+pf3r
+pf1ra
+pfs2
+pf3sl
+pf3sz
+pf3t
+2p1g
+pgra2
+1ph
+4ph.
+ph2a
+2phä
+2phb
+4phd
+2p1hei
+phen3d2
+phen3s
+2ph1ers
+2phf
+4phg
+phi2ka
+4phk
+ph2l
+2phm
+2phn
+p3hop
+2phö
+ph4r
+2phs
+ph3t2
+2phthe
+phu4s
+2p1hü
+2phz
+pi2a3
+pi3as.
+pi3chl
+p4id
+piegelei8en
+pi2el
+piela2
+3pier
+pie3t
+3pik
+1pil
+pi3le
+pil4zer
+pin2e
+pingen4
+ping3s
+3pinse
+pi2o
+pi3oi
+pi3onu
+3pip
+pi2pe
+pi3ri
+3pirin
+3pis
+4piso
+pis2t
+pi3t2a
+pit2s
+pi2z1in
+p1j
+2p1k2
+pku2
+pkur1
+1p2l4
+2pl.
+3p4la
+p5lad
+plan3g
+3plä
+2ple.
+ple1c
+p4leg
+p4lem
+3ple5n4
+2plig
+p4lik
+p4liz
+p4lo
+2p3lu
+2p1m2
+pma1
+2p1n
+1p2o
+po3b4
+po1c
+3pod
+2p3oh
+po2i
+po3id
+3poin
+3pok
+3p4ol
+po2lau
+po3li
+po4lor
+2pond
+2ponn
+po1o2b
+po2p3ak
+po2p3ar
+po1pe
+po2pl
+po3pt
+po1ral
+po1rau
+2porn
+por4tin
+por4tre
+por4tri
+pos2e
+pos4t
+po2sta
+post3ag
+po2stä
+po4st3ei
+post3ra
+po3ta
+3pote
+po2t1u
+po2w
+po3x
+pö2bl
+pö2c
+2p1p
+p2p3a2b
+pp3anl
+ppe4ler
+ppe2n1
+p2p1f4
+p2p1h
+p3p2ho
+pp3l
+pp5lan
+pp1lä
+p2ple
+p2p3ra
+p2p3re
+p2pri
+pp3sa
+ppt2
+p2r2
+1prak
+pra4s3
+1prax
+p4rä
+1präd
+1präg
+3präm
+3präs
+2pre.
+2prec
+1pred
+pre2e1
+1prei
+3preis
+prei4ss
+2p3rer
+3p4res
+1preß
+pri4e
+2prig
+1prinz
+1p4ro1
+3prob
+2proc
+3prod
+3prog
+3proj
+2pros3s
+3prot
+1prüf
+2prün
+2p1s
+4ps.
+ps4an
+p3se
+p3s2h
+ps1id
+p2sö
+ps2po
+ps2te
+p2st3r
+p2stu
+3p2sy
+ps2ze
+2p1t
+pt1a
+pt2ab
+pt3alb
+pt3at
+p3te
+p4t3ec
+p4t1ei
+pte4l
+p4tele
+p4t1ent
+pt3erei
+p4t1erw
+p4t1erz
+p2th
+pt1in1
+pto3me
+p4tos
+pto2w
+ptpo4
+p2t3r
+pt1s2
+ptt2
+pt1um
+p3tung
+pt1urs
+p2tü4
+3p2ty
+pt3z
+1pu
+pu1a
+pub4
+2puc
+pu2dr
+2p1uh
+pul2sp
+2pund
+pun2s
+2punt
+2pur
+3put
+put2s
+1püf
+2pül
+pün2
+2p1v
+2p1w
+pwa4r
+3py1
+py3t
+2p1z
+qu4
+1queu
+qui3s
+1ra.
+ra2ab
+2r3aac
+r3aal
+ra3ar
+r1ab
+ra2bar
+rab2bl
+2rabd
+2rabf
+2rabg
+1r4abi
+ra2br
+2rabs
+2rabt
+2r3abw
+1raby
+ra1ce
+2r1acet
+ra4cheb
+ra4chin
+racht3r
+rach6trä
+ra2chu
+r2ack
+1r2ad
+r4ad.
+rada2
+ra2dam
+2radap
+3radf
+3radl
+r3a2d3r
+rad3t
+1rae
+r2af
+raf3ar
+ra2fer
+ra3ge
+ra3gle
+ra2gn
+3r2ahm
+4raht
+2raic
+rail4l
+2r3air
+1rake
+3ra1k4l
+ra2kre
+ra2kro
+2rakti
+3rakü
+r2al
+r4al.
+ra2la4
+ral3ab
+r3alar
+ral3b
+3r4ald
+ra3le
+2ralg
+r4ali
+rali5er.
+rali5ers
+ralk2
+ral3la
+rall2e
+2rallg
+2r3alm.
+r3alp.
+2ralpe
+r4als
+r3al3t
+r4alt2h
+ra2lu
+3raly
+r2ame
+ra2mer
+1r2ami
+r2amm
+ram4man
+ram6m5ers
+ram4m3u
+ram2p3l
+2r1amt
+ramt4s
+r2an.
+4ranc
+r4anda
+r4ande
+ran4dep
+ran4d3er
+4r3anei
+r4aner
+2ranf
+1rangi
+rani1e
+ran2kr
+2ranl
+2r1anm
+2r1anp
+2ranr
+r2ans.
+r2ansp
+ran4spa
+2rantr
+2r3anw
+r2ap
+2rapf
+r1ar
+r2ara
+2rarb
+3rarei
+rar3f4
+ra2r1in
+r2ark
+r2arp
+2r3arz
+r2a3s2
+r4as.
+ras4a
+ra4schl
+ra5se
+ra5si
+ra4sk
+2r3asph
+ra4ssi
+2raß
+1rat
+r4at.
+ra2t1a
+ra3ta.
+ra3te
+r3atl
+rat4r
+rat2st
+2r3atta
+4rau.
+3raub.
+4raud
+rau3e2n
+2rauf
+2raug
+r2auh
+3raum
+rau4m3ag
+rau4man
+rau2mi
+3rausc
+2rausg
+rau2sp
+2rauss
+rau4sti
+raus3tr
+raut5s
+1raü
+r2ax
+raxi4s1
+räch4s
+3r2äd
+4räf
+4räg
+2räh
+2räm
+3rän.
+3räni
+3räns
+2r1är
+r2är.
+rä3ra
+rä4sa
+rä4s5c
+rä5sse
+rä2st
+3rätse
+rä2u
+räu2s
+räu5sche
+4räut
+2r1b
+r2b1ab
+r2b1a2de
+r2bak
+rbal3a
+rba3re
+rb1art
+rb1auf
+rbb2
+rb1ech
+r4belä
+rb1ent
+rbe3r2e
+r3b2la
+rbla2d
+r8blasser
+r4b3last
+r3blä
+r2ble.
+rb3ler
+rb2lin
+rb2lö
+rbmas3
+rb2o
+rb4ri
+rb2s
+rb3se
+rb4sei
+rb3ska
+rbs1o
+rb3sp
+rb4stä
+rb3str
+rb2u
+2rc
+r1ce
+r1che.
+r1chen
+r1chi
+rch3l
+rch3m
+rch3r
+rchs2
+rch3sp
+rchst4r
+rch3ta
+rch6terw
+rch1w
+r1ci
+r1cl
+r1ç
+2r1d
+r3d2ac
+r2daf
+r2d1ak
+r2d1al
+rdani1
+rd1ant
+rd1anz
+r4dap
+r2dei
+rd2ei.
+r2d1elb
+r3den
+rden3d2
+rden4gl
+rde3re
+rder4er
+rderin6s
+r4d3ernt
+rde3sp
+rdi3a2
+rdia4l
+r2d1inn
+rd1it
+rdo2be
+r3don
+rd1os
+rdo4st
+r2dö
+rd3rat
+rd4ri
+rdrü4
+rdt4
+rd3ta
+rd3th
+rdwa4
+1re
+3re.
+re3aler
+re2alt
+re2am
+re3as
+re3at.
+re3ats
+2reä
+re2b1a
+re2b1l
+reb1r
+reb3ra
+re2bü
+r2ech
+rech3ar
+4rechs
+2reck.
+2recki
+4redd
+2redit
+re1el
+re1er
+3refe
+4reff
+3refl
+3refo
+3reg
+5reg.
+rege4l3ä
+re2hac
+re4h3ent
+re2h1i
+rehl4
+re2h1o
+r2ei.
+rei4bl
+r2eie
+2reig
+3reigew
+rei3l2a
+rei3l2i
+reim2p
+r1ein
+rei3nec
+4reing
+r3eink
+4reinr
+rein8s7tre
+re1in2v
+reister6
+reis5tro
+3rek
+4re2ke
+re3la
+2r1elb
+rel2e
+relea4
+re3lei
+2re2lek
+2r1elf
+re3lo
+2r1elt
+relu2
+r4em.
+r2emi
+4rempf
+4remu
+r4en.
+r2ena
+rena2b
+re3nal
+re2nä
+3rendi
+ren3dr
+re4n3end
+ren4gl
+2rengp
+re2ni
+ren4nes
+r1ense
+2r1entl
+2r1ents
+2rentw
+4r3entz
+r2enz
+re3or
+3repe
+3repo
+4repp
+3r4er.
+2r1erb
+r2erbr
+2r1erd
+r2erer
+r1erf
+r1erg
+r4ergen
+r1erk
+4r3erken
+r2erki
+r1erl
+4r3erlau
+2rerlö
+2r1erm
+rer2n
+2r1ernä
+4r3erns
+4r3ernt
+r2e1ro
+re2rob
+r1erö
+3r2ers.
+2r1ersa
+r2erse
+2rersp
+r1ert
+r2erte
+2rertr
+2r1erz
+rer5ze
+r2erzy
+3r4es.
+re2sa
+res3an
+3rese
+3reso
+2ress
+ress2e
+res6s5erw
+3rest
+res3tem
+re2stu
+3resu
+2re2ß1
+re2thy
+re2u
+reu3g2
+2reul
+re3uni
+2r1eur
+2reü
+2r3evid
+r1ew
+rewa4r
+re2wi
+2r3e2x1
+3rez
+4rezi
+1ré
+2r1f
+rfall4s
+rf1ält
+rfä4s3
+rf2äu
+r2fent
+rf2es
+rfgeschos8
+rfgescho7sse
+rfi4le.
+rf3lic
+rf3lin
+rf4lö
+r3flü
+r3for
+rf4ru
+rf4rü
+rf2sa
+rf2s1ä
+rf2s1id
+rf2s3pr
+rf2ta
+rf3t4r
+rf2u
+4r1g
+r2g1a2d
+r2g1ah
+r2g1ak
+rg2an
+rga5ssen
+rgas2t
+rga4str
+rge4an
+rge2bl
+rge4l3er
+rgen4z3w
+rge4ral
+rge4tap
+r2geto
+rgi4sel
+r2glan
+rgleich8s7
+r2gleu
+r2glig
+r2gno
+r2g1ob
+r2g3ral
+r2greg
+r2gres
+r2gret
+rg3rin
+rgro5sse
+rg1s2p
+rgs2tr
+r1h4
+2rh.
+2rha
+r2ha.
+2rhä
+3r4he.
+3r4hen
+r3her
+r2hoe
+rho2i3
+2rhol
+2rhö
+2rhs
+1ri
+ri3am
+ri3at
+rib2bl
+ri1ce
+ri1cha
+rid2
+ri2dan
+2ridol
+r2ie
+rieb4s3t
+rie2fr
+ri1el
+riene4
+rie2nu
+ri1er.
+ri4ere
+ri3e4sti
+ri1eu
+ri2f1a
+ri2f1ei
+ri2fer
+ri2f1o
+ri2fr
+rif4ter
+3rig
+5rig.
+5rige
+ri4gene
+5rigj
+rig1l
+4rigr
+rik1l
+ri4kla
+r2imb
+2rimp
+rim2s
+r2i3na
+2r1ind
+rin4dex
+rin4diz
+ri3n4e
+rine1i
+2r1inf
+rin2fo
+ring3l
+rin2gr
+2r1inh
+2rinit
+2rink
+3rinn
+6r5innenm
+4r3inner
+4rinnta
+r1innu
+2r1ins
+3r4ins.
+rin2so
+rin2sp
+r4inspi
+2rint
+rin4teg
+rin4t5r
+r1inv
+r2inva
+2rinve
+4r1ir
+r2is
+ris4a
+ri4scho
+ri4schw
+3risik
+rismu2
+ri3so
+ri4s1p
+3riss
+ris3si
+rist5ers
+ristes4
+ri6stess
+ri2ß1
+r2it
+r3i2tal
+ri3t2i
+rit4r
+rit2tr
+5ritu
+rix1
+1rí
+2r1j
+2r1k
+rk2am
+r2käh
+r3klau
+r2klis
+rk4lo
+rk2lu
+rk4n
+r2k5nu
+rk3räu
+r2k3rea
+r3kri
+rk3rin
+rk2s1e
+rk3sen
+rk2sp
+rkstati6
+rk4stec
+rk4s1ti
+rk2ta
+rk4t3eng
+rk4t3erf
+rkt3ers
+rk6tersc
+rk4t3erw
+rk2tin
+rk2t1o2
+rk2t3r
+rk3tra
+rk1uh
+rk2um
+rku2n
+rk1uni
+rkus3s
+rku4s1t
+4r1l
+r3l2a
+rl2e
+rle2a
+r3lec
+rle2i
+rle2st
+r3let
+r3l2i
+r3l2o
+rl2ö
+rlös5s
+rl2s1p
+rl2s1to
+rl3t
+rlu4str
+4r1m
+r3m2ag
+rma2la
+r2m1ald
+rm1anz
+rm1a2p
+r2maph
+rma5ssen
+rmas8sens
+rm2är
+rm3d2
+r3me.
+r2m1ef
+r2meo
+rm2es
+r2mide
+r2m1im
+r2m1o2ri
+rm3sa
+rms2t
+rm3sta
+rmt2a
+rm2u
+rm3ums
+4rn
+rna2b
+rna4n
+rn2and
+rn3ani
+r2n1anz
+rn2a2r
+rn3are
+rn3ari
+r2nau
+r3näp
+rn3d4r
+r3ne
+rn3e4ben
+r4nef
+rn2ei
+rn3eif
+r4n3eis
+rne2n
+r4n1ene
+rn3ense
+r4nerf
+r4n1erg
+rn4erhi
+r4nerk
+r4n1ert
+r5nes
+rn2et
+r4nex
+rn3f
+rng2
+r3ni
+r4n1in
+r3nod
+r2n1op
+r2n1or
+rn1ö
+r1nöt
+rn3s2ä
+rn3s2p
+rn3s2z
+rn3t2e
+r1nu
+rn1ur
+r1nü
+r1ny
+ro2bei
+2robj
+1robo
+2robs
+ro1ch
+3rock.
+r2o3de
+ro3e4
+roh1l
+roh3na
+3r2ohr
+3roi
+ro3le
+rol4lan
+rol3l4en
+2roly
+4rom.
+ro2mad
+ro2mer
+4romm
+4romt
+r2on
+3ronn
+rons2
+ron4tan
+ro1ny
+ro1pe
+2ro2pf
+ro3ph
+r1or
+r2ora
+ror3al
+ro2rat
+ro2rei
+ro2r1o
+ror3th
+ro3sh
+ro3s2i
+ro5smo
+ros2p
+ros6san
+ross1c
+ros4t
+ro3st2a
+ro2st1r
+ro2ßu
+ro4tag
+rote3i
+ro2tho
+ro2tri
+rot1s2
+rot2ta
+ro3t2u
+ro3unt
+3rout
+rö2b3l
+rö2du
+2röf
+4rög
+1r2öh
+r1ök
+1r2öl
+3römi
+4röp
+r1ör
+r2ös.
+r2öse
+2r1p2
+rp4a
+rp4e
+rpe2re
+rpe4r3in
+rpf4
+r2pli
+r3po
+rpo4str
+rps1t
+rp3t
+r3pu
+r1q
+2r1r
+rr2ab
+rr2ar
+rra4s3s
+rr1äm
+rrb2
+rr1c
+r3r2e
+rre4ale
+rrer4s
+r4rew
+rr2he
+rrik2
+rr2n3a
+rr2o
+r2r3ob
+rro3m2
+rr2th
+r3ru
+r3r2ü
+rrü1b
+4r1s
+rs3ab
+r2s1a2d
+r4samp
+r4s1amt
+rs2an
+r2s3ang
+rs3anp
+rs3ar
+r3sch2e
+r6scherl
+rsch2l
+rs1ebe
+r2sein
+rse2n1
+rs2end
+rse4ne
+rs1ere
+rs1erö
+rs1ers
+rs1erz
+rs1eta
+r3sho
+rs2kal
+rs2kan
+rs2kie
+rs2kis
+rs2kl
+r4sko
+r4skr
+r4sku
+rs3l
+rs4no
+r2s1op
+r4s3ort.
+rs2p4
+rspa3s2
+r2s3ph
+r4s3s2
+r5stad
+r4stant
+rs2tau
+r6st5eing
+r6sterbt
+r4st3er4w
+rs2th
+rst3ing
+r2stip
+r2s1tot
+rs2tr
+rst3ran
+r6strang
+rs2tu
+rsü3s
+r3swi
+4r1t
+rt1abs
+r2t1alm
+rtals1
+rt1am
+rt1ang
+rt1ann
+rt1ant
+rt1anz
+r2t1ar
+rt3a4re
+r2t3att
+rt1är
+r3te.
+rte1e2
+rt4eif
+rtei3la
+r2telf
+rte2n1
+r3ten.
+rt3erei
+r4terfo
+r4t3erh
+r2t1erk
+r4t3er4la
+r4t3erle
+r4t3ernä
+rter4re
+rt1ers
+r3tes2
+rte3sk
+r2thi
+rt3hol
+rt2hum
+r2t1id
+r2t1ima
+r2tinf
+rto1p
+rt1or
+rto2ri
+r2trak
+rtra4s3
+rt3rec
+r4treis
+rt1ros
+r4ts
+rt4s1eh
+rt1spe
+rtt4
+r2t1urt
+rt3z
+1ru
+ru1a
+ru3a2r3
+rube2
+rude2a
+ru2dr
+3ruf
+ru2fa
+ruf2s1
+4rug
+2r1uhr
+3ruin
+ru1ins
+ru1is
+2rum
+4rumf
+ru2mi
+4ruml
+r2ums.
+4rumz
+2r1una
+2rund
+run2d1a
+r2unde
+rund3er
+run6derl
+run6ders
+run6derw
+2r1unf
+2rungl
+2r1u2ni
+4r3unio
+run2kr
+2r1unl
+2r1unm
+4runn
+4r3unt
+2runw
+ru3pr
+4r3ur
+ru2ra
+ru2r1e
+5ruro
+ru2si
+rus3sen
+rus2s1p
+rus6s3t
+3rut
+rut3h
+ru2t1o2
+ru2t3r
+4ruz
+ru2zw
+1rü
+2rüb
+rü1ben
+rü1ch
+rücks2
+4rümm
+rü3s2s
+rüs3si
+2r1v
+rve4n1e
+rve5s
+rv2s
+2r1w
+rwun3s
+4r1x
+1ry
+ry2c
+2r1z
+rz1ac
+rz2an
+r2zar
+r2zas
+r5zene
+rz1eng
+r4z3ents
+r2z1erf
+r2z1erg
+r2z1erk
+r2z1erw
+rz1id
+r3z2of
+rz1op
+rz2ö
+rz3te
+rz2th
+rz2t3ro
+rzug2u
+r3zwä
+r3z2wec
+1sa
+3sa.
+3saa
+2s1ab
+sa2be
+3sabet
+sa2bl
+sa3ble
+sa2br
+4sabs
+sa2cho2
+sach3t
+2s1ada
+s1adm
+2s1a2dr
+sa2fe
+2s3aff
+3safi
+sa1f4r
+3sag
+sa4gent
+sag4n
+4s1a2gr
+3sai
+sa3i2k1
+sail4
+2s1ak
+sa2ka
+3saki
+3sakr
+4s3akt
+3sal.
+sa4l3erb
+sa2l1id
+s1all
+3salo
+sal2se
+2s1alt
+3s2alz
+3sam
+s3ameri
+5samm
+6s1amma
+4s1amn
+s1amp
+sam2to
+s1an
+s2an.
+2s3a2na
+2s3anb
+s2an2c
+s2and
+s4and.
+san4dri
+3sang.
+sang4s
+2s3anh
+3s4ani
+2s3anl
+2sanp
+2s3ans
+san4sk
+4santr
+2s3anw
+s3anz
+2s1ap
+sa2po
+3sapr
+2s1ar
+3s4ar.
+3s2ara
+4s3arb
+3s2ard
+3sari
+s3arr
+3s2ars
+4sarti
+s1a2sp
+sas6sest
+4s3a2sy
+3sat
+sat2a
+4s3ath
+4s3atl
+4satm
+sa2tr
+sa3ts
+sat4z3en
+s1a4u
+3sau.
+3sauc
+3saue
+2s3aufb
+sau2gr
+3saum
+3saur
+sauri1
+2s3ausb
+3s2ause
+2s3av
+sa2vo
+3säc
+s3ähn
+3säl
+s1ält
+2s1äm
+2s1änd
+2s1är
+sä2s3
+3s2ät
+1säu
+2säuß
+4s3b4
+sba4n
+sbe3r2e
+sbus3
+1sc
+2sc.
+2scam
+s2cap
+4scar
+2s1ce
+6sch.
+3schaf
+2schak
+s2ch2al
+4schanc
+4schang
+5schanz
+4schao
+s2chau
+3s2chä
+2schb
+2schc
+2schd
+3sche.
+sch3ei.
+4schemp
+sch2en
+3sches
+4schess
+4schex
+4schf
+2schg
+2schh
+schi4e
+s4chim
+3sching
+4schiru
+3schis
+2schk
+4schle.
+6schlein
+sch6lit
+2schmö
+2schn.
+2schox
+3s2chö
+4schöl
+4schp
+2schq
+4schre.
+4schrin
+sch3rom
+4schrou
+6schs2
+sch3sk
+6sch3t
+scht2a
+scht4r
+s4chu
+4schunt
+sch2up
+5schü
+2schv
+4schwet
+sch4wil
+2schz
+2scj
+6s1cl
+2sco
+3s2cop
+3sco4r
+s2cr
+2scs
+2scu
+4s3d2
+sda3me
+sdien4e
+sd4r
+1se
+se3at.
+seau4
+2s1e2ben
+seb4r
+2s1echo
+s1echt
+2s1eck
+3see
+se1ec
+se2e1i4
+see3ig
+seein2
+se1er.
+se1erö
+2s1eff
+3seg
+se2gal
+se2gl
+seg4r
+3s2eh
+se2h1a4
+se3he
+se4h1ei
+se4hel
+se4herk
+se2hin
+seh1l
+seh3re
+seh3s
+seh3t
+se2hüb
+2s1ei.
+2s1eig
+s1ein
+5s2ein.
+2seinb
+sein4du
+sei3n2e
+sein4fo
+2seing
+2seinh
+4seink
+2seinl
+2seinn
+2seinr
+s4eins.
+4seinsp
+4seinst
+2seinw
+4s1eis
+5s2eit
+3s2ek
+s2el.
+se2l1a
+se3lad
+sela4g
+se3lam
+3selb
+sel1ec
+2selem
+se4l3erl
+sel3ers
+2self.
+s3elix
+se2l3ö
+s2els
+sel3sz
+sel3tr
+s4e3ma
+2s1emp
+s2en.
+se4nag
+se2nä
+3sendet
+4s1endl
+sen3gl
+5s2eni
+3senku
+se2no
+se4nob
+s2ens
+s2ent.
+2s1entf
+4s3entg
+s2enti
+2s1ents
+2sentw
+2sentz
+se2n3u
+3senva
+seo2r
+4s1e2pos
+3seq
+s4er.
+se2r3a2d
+se2r3al
+se5ref
+s3ereig
+se4r3eim
+se4r3enk
+ser2er
+s1erfo
+s2erfr
+s3erfü
+4serfül
+ser3g
+s1ergä
+s2ergr
+s1erh
+5serie
+s3erken
+s1erkl
+3serl.
+s1ernä
+2s3ernt
+se1rot
+s3eröf
+s2ers.
+2sersa
+s4ert.
+seru2
+se4r1uf
+se3rum
+se3rund
+3s4erv
+se2sel
+2sesh
+se3su
+2se4tap
+se2tat
+s1e2th
+3setz
+se1u2n
+2s1ex
+se2xe
+4sexp
+sex3t
+6s3f4
+sfal6l5er
+sflo4
+4s3g2
+sges2
+sgro3
+2s1h
+4sh.
+sh2a
+3s2ha.
+sha2k
+4s3han
+4shc
+s3h2e
+3shi.
+3shid
+shi4r
+4shk
+sh3n
+4shof
+3shop
+sho4re
+3show
+sh4r
+4shs
+4sht
+4s3hü
+1si
+si2ach
+si3ach.
+si2ad
+si3am.
+sia4s
+2siat
+sib4
+5si1c
+2s1i2deo
+s2ido
+3s4ie
+siege4s
+si3ene
+si1err
+si1f4
+si2g1a
+3sigh
+sig4n
+si3gnu
+si2g3r
+si2k1ab
+si2k1ä
+sik3erl
+si2ki
+si4k1l
+si2kr
+sik3s2
+sik3t4
+si2ku
+3silo
+2s1imm
+si3n4a
+2s1ind
+2s1inf
+sing1a
+sin3gh
+sin3g4l
+sin2gr
+sing3sa
+2s1inh
+sin1i1
+2s1inq
+2s1ins
+2s1int
+2s1inv
+3sio
+3s2is
+si2sa
+si4schu
+si2s1e
+si2s1o
+si2s1p
+sis3s2
+si2stu
+3s2it
+si2tau
+sit3r
+si2tra
+si3tu
+3siv
+siv1a
+sive3
+si2vr
+1sí
+4s3j
+2s1k2
+4sk.
+1skala
+4skam
+4skanz
+4skas
+ska4te.
+4skateg
+ska4tes
+4skb
+skelma4
+skelmas5
+s2kep
+3s2ki.
+s2kif
+s2kig
+3s2kik
+4skir
+3skiz
+sk4l
+4s3klas
+sk4n
+4skom
+4s3kor
+4skow
+4skö
+4sks
+4sk3t
+3skulp
+skus3
+2s1l2
+4sl.
+3slal
+4slan
+s2law
+sl3b
+s5le
+s3li
+3s4lip
+4sln
+s3lo.
+slo3be
+s3loe
+s3lu
+4s3m2
+2s3n4
+4sna
+snab4
+sni3er.
+sni3ers
+4s5not
+4snö
+3so.
+so4a
+2s1o2b
+so3et
+3soft
+3sog
+s1o2he
+6sohng
+2s1ohr
+1sol
+so3la
+so4l1ei
+sol4ler
+2so2ly
+3som
+3s2on
+son3au
+sone2
+son5ende
+son3sä
+so2ny
+so3o
+2s1opf
+3sor.
+so1ral
+s1orc
+2s1ord
+so2rei
+2s1orga
+5s2orge
+2s1o2rie
+so2r1o2
+3sors
+so4ru
+3so3s2
+s4os.
+4s1ost
+1sou
+so3unt
+3sov
+4s1o2ve
+3sow
+2s1ox
+5soz
+sö2f
+2s1ök
+2s1ö2l
+s1ö4s
+sp2
+2sp.
+2spaa
+2spak
+s2pan
+spani7er.
+2spano
+4spap
+2spara
+1spare
+2sparo
+3sparu
+spa3sse
+spa3ssi
+3s2paß
+2spau
+s2paz
+s2pä
+2spär
+s2pee
+4s3pel
+4spensi
+spe3p4
+2s1peri
+4sperl
+s2perr
+2spers
+2spet
+1s2pez
+2s3pf
+2spha
+s3phe
+2sphi
+1spi
+3s2pi4e
+4spier4
+spi2k
+2spil
+3spio
+4spip
+4spis
+2spl
+4spla
+4splä
+3s2pli
+s3p4lu
+s3pn
+2spod
+2spog
+s2poi
+2spok
+4spol
+1spon
+1spor
+4s3pos
+s2pott
+4spr.
+s2prac
+s2pran
+2sprax
+2spräm
+4spräs
+3s4prec
+2spred
+2spres
+2sprob
+5spross
+3spru
+2sprüf
+3sprün
+2s3ps
+2spt
+2spun
+2spup
+3spur
+4sput
+1spü
+4spy
+2s1q
+4s3r4
+srat2s
+srat4sc
+sret3
+srom2
+srö2s
+srös1c
+srücker6
+srü2d
+2s1s
+6ss.
+4ssa
+ssa3bo
+ss1ack
+ss1aj
+s3sal
+s4s1ala
+s4s1alb
+s4s3amt
+s5sand
+s4s3ang
+s2sano
+s4sans
+ss2ant
+s4sanz
+s3sas
+ss3att
+4s3s2ä
+4ssb
+6ssc
+4ssd
+4ss1ec
+4ssee
+4sseg
+s4s1ega
+4sseh
+sse3ha
+4ssei
+sse3inf
+sse3in4t
+4ssek
+6ssendet
+4s3sendu
+ssenmas6
+sse6r5att
+s2s1erö
+4ss3erse
+s3sersu
+ss2es
+4ssesc
+3ssesh
+4sset
+sse3ta
+4ssez
+4ssf
+4ssg
+4ssh
+4ssic
+4ssie
+s2sig
+s4sinf
+s4sinst
+s4sint
+4ssio
+4ssit
+4ssk
+s3skala
+4s4s3l
+4ssm
+4ssn
+4sso
+ss1off
+ssoi4
+s2s1op
+ss1ori
+4ssp
+s3spe
+ss2po
+ssquet4
+4ssr
+4ss3s2
+4sst
+sst2a
+s5stad
+ss2tar
+s3stä
+ss1te
+s4ste.
+s5stel
+s4sten
+s4stes
+s4stet
+s5steu
+ss2th
+ss2tip
+ss1tis
+ss2top
+ss2tur
+s3s2tü
+4ssum
+ss1ums
+4ssü
+4ssv
+4ssw
+4s3sy
+4ssz
+1st
+6st.
+3staa
+2stabb
+2stabh
+s2tabi
+2stabt
+2stabz
+st2ac
+3s2tad
+4stada
+4stadr
+3staff
+2stag
+3stah
+2stak
+2stal.
+2stale
+3sta3li
+2stalk
+st1alp
+3stam
+st1ami
+4stamt
+sta4na
+3stand
+4stanf
+4stanl
+4stann
+2stanw
+4stanza
+s2tar.
+s2t2ars
+3start
+3stat
+3s4tau.
+2stauf
+2staum
+5staur
+2staus
+3staus.
+2stax
+3stäb
+3städ
+2stäg
+2stält
+2stämt
+s2tär
+3stätt
+2stäus
+4stb
+4st3c
+4std
+3st2e
+s2tean
+4stechn
+4stee
+ste2gr
+ste2i
+5s2teig
+4s3teil
+stei4na
+s2tel
+s3telem
+stel4l3ä
+ste4mar
+4stempf
+4st3ends
+st3engl
+st4ens
+4st3entf
+4stentw
+4stepi
+ste6rers
+s2terl
+s2tern
+6sterras
+s2ters
+4st3ese
+4stests
+s2teu
+4steuf
+4st3ev
+4stex
+4stf
+2stg
+4sth
+st3ho
+3sti2e
+4stief.
+stierma5
+3stif
+3stim
+2stinb
+2stinf
+2st1ins
+s4tio
+sti2r
+st3i2so
+2stj
+2stk
+4s4tl
+4stm
+stma3s2
+2stn
+3stoc
+sto3d
+s2tode
+2st3om
+2stopo
+2stord
+2storg
+3stos
+4stou
+2stöch
+5s2tör
+2stöt
+4stp
+2stq
+3s2traf
+2strag
+3strah
+4strai
+3s2tral
+4strans
+3s2tras4
+3straß
+4straum
+s2träf
+2sträg
+s2trän
+4sträne
+2stre.
+4strech
+4stred
+4stref
+4streg
+3st4reif
+4streis
+st3renn
+2strep
+2stret
+2strev
+2stri.
+3s4tria
+2strib
+4strig
+stri2k
+4strisi
+2stroc
+3s2trof
+3s2trok
+st3roll
+stro4ma
+s2tros
+s2trö
+3struk
+s2trum
+4st3run
+2strup
+4st3s4
+stsas2
+2st3t4
+st2u
+3s2tub
+4stuc
+3stud
+2stue
+3stuf
+3stuh
+2stuk
+2stumr
+stum2s
+2stumz
+stu2n
+2stun.
+2stunf
+2st3uni
+2stuns
+2stunt
+3stuö
+stu3re
+st3url
+2s3turn
+2st3urt
+4stüch
+s2tück
+2stür.
+2stüre
+2stürg
+2stürs
+2stv
+2stw
+2sty.
+2stys
+4st3z
+1su.
+su1an
+3su2b3
+su4ba2
+4subi
+5su1c
+su2cha
+such4st
+2s1u2f
+2s1uh
+su1is
+su1it.
+sul2a
+sul2i
+sult2
+su2mar
+su2mau
+3s2ume
+su2m1el
+su6m5ents
+s3umfe
+3summ
+sum1o2
+su2mor
+s3umsa
+s3umst
+su2n
+sun6derh
+su4ne
+s1unf
+2s1uni
+4sunt
+3s2up
+sup3p
+su2ra
+2s1url
+s1urt
+su2s1
+su3sa
+su3sh
+su3si
+sus3s
+2sü4b
+3süc
+sü2d1
+süden2
+3sün
+süs4
+sü3sse
+sü3ssi
+4s3v
+2s1w
+s3we
+sweh2
+4swie
+4swil
+s3wö
+s3wu
+1s2y
+syl1
+sy4n3
+sy5s
+2s1z
+4s3za
+4s3zei
+s2zena
+5s4zene
+4szent
+s2zes
+s2zeß
+s3zet
+s2zis
+sz2o
+4s3zu
+4s3zw
+2ß3a2
+ß1ä
+2ß1b2
+ßbus3
+2ß1c
+2ß1d4
+ßdie3
+1ße
+2ß1ec
+2ß1e2g
+2ß1ei
+ße2l1a
+ße2le
+ßen3g
+ße2ni
+ße2no
+ß2ers.
+2ßerse
+ßer3t
+ße2s
+ße2t
+ß1ex
+2ß1f
+2ß3g2
+ßge2bl
+2ß1h2
+1ßi
+ßi2g1a
+2ß1in
+ß1j
+2ß1k4
+2ß1l2
+2ß1m
+2ß1n2
+ß1o2
+ß1ö
+2ß1p2
+2ß1q
+ßquet2
+4ß3r2
+ßrus3
+2ß3s2
+2ß1t
+ß2th
+ßts2
+1ßu2
+ß1uf
+2ß1um
+ß1uni
+ß1ü
+2ß1v
+2ß1w
+2ß1z
+2tab.
+ta2b1an
+2t1abb
+1tabel
+2taben
+ta4bend
+2tabf
+2tabg
+2tabh
+2tabk
+1table
+2t3abn
+ta2br
+4tabs
+2t3abt
+ta2bü
+2tabw
+2tabz
+2t1ac
+3tacu
+t1ada
+tadi3
+2t1a2dr
+ta3d2s
+1taf2e
+2taff
+t1afg
+t1af4r
+3t2ag
+ta2ga2
+ta2g1ei
+4t3a4gent
+ta3gl
+t3ago
+tag2s
+tag4st
+tah2
+tah3le
+tahl3sk
+ta3i2k
+tai2l
+ta1ins
+tai4r
+ta1ir.
+1tak
+t3a2ka
+ta2kro
+tak2ta
+3taktb
+3t2aktu
+2takz
+3t2al.
+ta2la
+ta3lag
+ta3lak
+1talbu
+tal3d
+1t4ale
+ta4lens
+tal4leg
+tal2lö
+ta2l1op
+tal2se
+2talt
+2tam
+ta2mer
+ta2mi
+t1ampl
+t1amt
+t1a2na
+2tanb
+t2and
+ta3ne
+4tanf
+2tang
+t2ank
+t3ankl
+2tanl
+2t1anme
+4t1anna
+t1ans
+t2ans.
+4t3ansi
+2t3ansp
+ta2nu
+2tanwa
+2tanwä
+t2anz.
+t1anza
+4tanzei
+tan6zerh
+t1anzu
+ta3or
+ta2pe.
+ta2pes
+2tapf
+ta2pl
+2tarb
+ta4rens
+ta4r3ere
+3t4a3ri
+2tark
+2t1arm
+2tart
+t1arti
+tar2to
+ta2ru
+2t1arz
+ta3sa
+1tasc
+t1asp
+1tas2t
+1tat.
+ta2ta2b
+ta2tan
+ta2tau
+tat3ei
+ta2tem
+ta2t3er
+ta2th
+tat3he
+t3atl
+t4atm
+ta2tom
+1tats
+ta2t1um
+2t1auf
+4taufg
+tau3f4li
+4taufn
+1taug
+t1auk
+3taum
+1taus
+t1ausb
+tau6schr
+tau6schw
+t2ause
+4t3ausg
+t1ausk
+2tausl
+4t3auss
+4t1ausw
+1tax
+taxi3s
+tä1c
+2täd
+3täe
+1täg
+2tägy
+2täh
+2t1ält
+2täm
+t1ämt
+t1ängs
+1tänz
+t1äp
+t2är.
+tä2ru
+tä4s
+t2ät
+2tätt
+1täus
+2täuß
+2täx
+1tà
+4t3b2
+tbe3r2e
+tblock5e
+tblocken8
+tbus3
+2t1c
+t3cha
+t3che
+tch2i
+tch3l
+t2chu
+tch1w
+t4ck
+t3cl
+t3cr
+2t3d4
+tdun2
+1te2a4
+te3al
+te3an
+3t4ebb
+4t1e2ben
+1t2ech
+te1cha
+3techn
+2teck
+teck2e
+1tee
+te1em
+te2en3
+te1erw
+te2es
+2teff
+teg2
+teg3re
+2teh
+t2ei.
+t2eie
+t3eifr
+teik4
+1teil
+2t1ein
+teinbus6
+tein3ec
+t3einge
+t3einla
+4teinn
+t3eis.
+t3eisb
+tei3st
+tek3t
+tela4
+te2l3ab
+te2l1ac
+te2l1au
+telb4
+te3le
+tel1eb
+tele4be
+te4l1ec
+3telef
+3teleg
+te4l1eh
+te4lein
+2telem
+tel1en
+te4lerd
+te4leu
+4t3elf.
+te2l1in
+te2lit
+tell2e
+te4lost
+te2l1ö
+tel3s2k
+tel3ta
+tel3th
+tel3t4r
+te2m1ei
+te2min
+2temo
+te2m1o2r
+3temper
+1tempo
+te4m1u
+t6en.
+ten3a
+tena2b
+te4na2d
+te4na4g
+te4nas
+te4nau
+te2nä
+t4enb
+ten3da
+4t3endf
+t6endi
+2t1endl
+t6endo
+4t3endp
+ten3d4r
+te2n1e2b
+te2nef
+te3n4ei.
+ten3eid
+ten3ens
+4tenerg
+te2net
+ten3g
+4t1eng.
+tengeschos8
+tengescho7sse
+ten4gla
+t4enh
+te2ni
+te4n3in
+t4enj
+t2enl
+t4enm
+ten3n
+t2eno
+tens2e
+4tensem
+t4enta
+t3entb
+4tentd
+t4ente
+4tentn
+ten4t3ri
+4t3entw
+4t3entz
+ten6zerh
+ten3zw
+t3e2pi
+t4er.
+tera2b
+te2rad
+te1raf
+ter3am
+te3ran.
+4terbs
+4terbt
+t3erde.
+te2re2b
+te4r3eif
+te2rel
+ter3end
+te4reng
+te4rerk
+terer4z
+4terfol
+t4erfr
+4terfül
+ter3g2
+tergeschos8
+tergescho7sse
+6tergrei
+t6ergru
+2t1ergu
+4tergü
+t4eri
+te3ria
+4terklä
+2t1erlö
+1term
+terma3s4
+ter4mer
+ter4n3ar
+4t3erneu
+t4ero
+t3erö
+3terras
+ter4re.
+1terro
+t4ers.
+t6erscha
+ter4ser
+terst4
+t4erst.
+t4ersti
+t4erstu
+tert4a
+teru2
+te4r1uf
+ter4wäh
+6terwerb
+ter3za
+4t3erzb
+te2s
+tes1ac
+te3ser
+te3si
+te3so
+te3sp
+te4spr
+tess2
+3tesse.
+t2es2t
+tes3tät
+te4st3ei
+te6ster6g
+te6sterk
+testes4
+1tests
+t2et.
+te2tat
+4tetl
+teu3eri
+3teuf
+te1un
+teu2r3a4
+te2vi
+1tex
+te1xa
+t3e2xe
+2t1e2xi
+4texp
+3text
+2t1exz
+2t1f4
+tfä4s3
+tfi2l
+2t1g2
+tger2
+tgro3
+t1h
+4th.
+2th2a
+3t4ha.
+t2hag
+t3hai
+t2hak
+3thal.
+4t3hau
+2t3hä
+4thc
+1th2e
+t2he.
+3thea
+2theb
+t2hec
+2t3hei
+t4hein
+t2hek
+t2hem
+t4hene
+t4heni
+3theo
+2therr
+t2hes
+3these
+t2heu
+1thi.
+t2hik
+2t3hil
+2t3him
+2thk
+4th3l
+4th3m
+2th3n
+t2ho
+2t3hoc
+t3hof
+2t3hoh
+t4hol.
+t3hor
+2t3hot
+thou2
+2t3hö
+2thp
+1th2r2
+4thrin.
+4thrins
+2ths
+2thub
+4thun
+2thü
+2thv
+t2hy
+ti2ad
+ti3a2m
+tib4
+ti1ce
+ti3chr
+tiden2
+ti4dend
+ti2deo
+t2ie
+1tief.
+ti1el
+ti3e4n1
+ti2er
+tie4rec
+tiermas6
+1tierr
+tie5sse
+2tieß
+ti1et
+ti1eu
+1tif.
+ti1fr
+ti4gerz
+tihi4
+ti2kam
+ti2kar
+ti3k2er
+ti2kin
+ti2krä
+tiks2
+ti2lar
+ti2lau
+ti2lei
+ti2lel
+1tilg
+til4leb
+til4leg
+ti2lö
+tilt4
+ti2lu
+ti2ma2g
+t2imi
+tim2m1a
+4t1imp
+t2in.
+ti3na
+t1inb
+4t1ind
+ti3n2e
+t1inf
+tin2g1a
+ting3l
+ting3s2
+t1in1it
+2t1inj
+tin2k1l
+t2ins.
+4t1inse
+2t1int
+ti1nu
+4t1inv
+3tio
+ti3or
+1tip
+3tip.
+ti3pl
+3tipp
+ti4que.
+ti1rh
+t2is
+ti4scha
+tisch3w
+ti2sei
+ti2sp
+3ti3te
+tium2
+ti2van
+tive3
+ti2vel
+ti4v3erl
+ti2v1o
+ti2v3r
+ti2za
+2t1j
+2t3k4
+2t3l2
+tl4e
+tle2r3a
+4t5li
+2t1m2
+tmal2
+tmen4t3
+tmo4des
+t3mu
+2t5n4
+tnes4
+to4as
+to5a4t
+1tob
+2tobj
+tob2l
+to1ch
+3tocht
+2tock
+1tod
+3tod.
+tode2
+to2d1er
+tode4s1
+to4d1u
+toi4r
+to3la
+tom1e2
+to2men
+2tomg
+1ton
+to2nau
+3too
+to2pak
+to2pat
+1topo
+2topt
+to1ra
+to2rau
+to4rän
+2torc
+t1ord
+1tore.
+to2r1el
+to3ren
+t1org
+t3orga
+tor3int
+to2rö
+1tort
+t1ort.
+to2ru
+t2orw
+to3s2
+to4sk
+tost4
+1toten
+to2tho
+3t4ou
+touil4
+to3un
+tö2c
+1töch
+2töf
+2t1ök
+tö4l
+3tön
+t1ö4st
+1töt
+4t3p2
+tpf4
+2t1q
+t2r4
+2tr.
+1trac
+tra3cha
+t3rad.
+tra4dem
+tra4far
+1trag
+2trahm
+3t4rai
+1tram
+3t4ran.
+2trand
+1trank
+t3rann
+1trans
+t3rase
+t3rasi
+tra4str
+2traß
+1traum
+traus2
+1trä
+3träg
+2träh
+3träne
+2träs
+2träß
+2träus
+2träuß
+4t5re.
+tre4ale
+2treb
+tre2br
+2trec
+t3rech
+t4reck
+2t3red
+3t4ree
+1tref
+2trefe
+3treff
+2trefo
+2treg
+t4rei.
+1t4reib
+2treif
+t3reig
+2t3reih
+t3rein
+t3reis
+t3reiz
+2trek
+2t3rel
+t4rem
+t4ren.
+1trend
+t3rent
+1trep
+2trepe
+2trepo
+t4repr
+t4rer
+t4res.
+1t4ret
+tre2t3r
+t4reu
+t3rev
+2trez
+3t4ré
+2t3rh
+1trib
+2trid
+3trieb.
+3triebs
+tri2er
+1trin
+t3rind
+2tring
+tri3ni
+3trio
+t4rip
+t3riß
+1triu
+tri2x
+trizi1
+1troc
+t4roi
+tro2ke
+tro2mi
+2t3roo
+t4rop
+3tropf
+2t3roß
+t3röc
+2tröh
+trö4s3s
+2t3röt
+1trug
+2truk
+trum2
+trums1
+2trund
+1t4runk
+3t4rup
+t3ruß
+tru2th
+t4rüb
+trü1be
+trü1bu
+2t3rüc
+trücker6
+t4rüg
+3trümm
+try1
+2ts
+t4s3a4b
+t3s2ac
+ts1ad
+t2s1ah
+ts1al
+t4s1amt4
+t2san
+t4s3ar
+ts1as
+tsa3sse
+t2sau
+t1sä
+t2s1än
+t4schar
+t3sch2e
+t4schef
+tsch4li
+t4schro
+ts2cor
+t2s1e2b
+ts3eh
+t3seil
+t4seind
+ts1em
+tse2n1
+t2s1eng
+t3sens
+t2s1ent
+t2s1er
+t4s3esse
+t3set
+t4seth
+t2s1i2d
+ts1ini
+t2s1ir
+t3skala
+ts3kr
+ts1o
+tso2r
+t1spal
+t1span
+ts1par
+ts4pare
+t1spas
+ts2ped
+t1spek
+ts2pi
+ts2pon
+ts2por
+ts3s2
+tst4
+ts2tat
+ts3täti
+t4stea
+t4s1tep
+t4sterm
+t4s3terr
+ts1tie
+t2s3tis
+t2stit
+ts2to
+ts3toc
+ts3tor
+t4s3trad
+t2strä
+t2s1tri
+ts2tro
+t4strop
+t2s3trü
+ts1u
+1tsub
+t1sü
+4t1t
+tt1ab
+tta2be
+tt2ac
+t2t1ad
+tta6gess
+tt1ak
+tt2al
+tt2ant
+tt1art
+tta3s
+tt1ebe
+tt1eif
+tt1eis
+tte2la
+tte4leb
+tte4len
+ttel1o
+t3ter
+tt2erg
+tterma8s7s
+tte4s1ä
+t2teti
+tt2häu
+t2t3ho
+ttras3s
+t3tro
+tt3ru
+tt3rü
+tt2sen
+tts1p
+tt4s3tem
+tt4ster
+tt4sti
+ttt4
+t2tuc
+tt2un
+tu1alm
+tu3an
+1tuc
+tu2chi
+1tue
+tu2ere
+2tuf
+tuf2e
+tu3fen
+t3u2fer
+2tuh
+t3u2kr
+tul2a
+1tum
+t2um.
+t2ume
+2t3umf
+t3umg
+2t3umk
+2tump
+t3umr
+tum2si
+tum2so
+2t3umt
+t3umz
+1tun.
+2t1una
+2t1und
+2t3unf
+t3unga
+tung6s
+2tunif
+2t1u2nio
+1tunn
+1tuns
+2t3unt
+t1up.
+tu2r1a4g
+tu2rä
+tur1c
+tu2re.
+tu2rei
+tu2r1er
+tu2res
+tu2r1e4t
+turin1
+1turn
+tu2ro
+tur3s
+tu4ru
+tu2sa
+tu4schl
+tu2so
+tu3ta
+2tüb
+1tüch
+tück2s
+1tüf
+1tür.
+tür1c
+1türe
+1türg
+1türs
+1tüten
+2tütz
+2t3v
+4t3w
+twa2
+twä4
+twi4e
+1ty
+3ty.
+3typ
+ty2pa
+3tys
+4t1z
+t2za4
+tz1ag
+tz1al
+tz1ar
+tz1au
+tz1ä
+t3ze.
+t2z1ec
+t2z1eie
+t2z1eis
+tze4n1
+tz2ene
+tz3ents
+tz1erl
+tz2ers
+t3zes
+tzes3t
+tzgel2
+tz1int
+t2zor
+tz2ö
+tz2th
+tz2tin
+tz1wä
+tz1wi
+tz1wu
+2ua
+u3a2b
+u1a2c
+uad4r
+u1ah
+u1al.
+ua2lau
+u1alb
+u3alet
+u1alf
+u3a2lo
+u1alr
+u1als
+u1al3t
+ua2lu
+u1am
+u1ans
+u3ar.
+uara2b
+u1ars
+ua3sa
+ua2th
+uat2i
+u3au
+uau2s
+u1ay
+u1äm
+u1än
+u1äu
+2u1b
+u2bec
+ub3ein
+u3b4i
+ubi3os.
+ub2l
+ub3lic
+u2b3lu
+u2bop
+ub1r
+ub3rä
+u2b3rit
+ub2san
+ub2s1o
+ub2spa
+ubus3
+u2büb
+2uc
+uc1c
+u1ce4
+uces3
+uch1a
+u1cha.
+uch1ä
+u1che
+u2ch1ec
+uch1ei
+ucherma8s
+u3ches
+u1chi
+uch1il
+uch1in
+uch3l
+uch3m
+uchma6ss
+uch3n
+u2ch3r
+uch2so
+uch4spr
+uchst4
+uch4tor
+uch2t3r
+u1chu
+u2chum
+uch3ü
+uch1w
+u1ci
+uck2er
+u1cl
+2u1d
+u3d2a
+uder2e
+udi3en
+uditi4
+u2don
+ud3ra
+u3dru
+2u1e
+u2ed
+ue2en
+u2eg
+u2ela
+ue2le
+ueli4
+ue2mi
+uen1
+ue2nä
+ue2ner
+uenge4
+ue2ni
+ue2no
+uen2sa
+uen2zu
+u2ep
+ue2r3a
+ue2r1ä
+ue3reig
+u3eremp
+u3erent
+ue4rerg
+ue4rerk
+uer3g2
+u4erinn
+u3erin4t
+uerma6s
+uer2ne
+uer4ner
+uer3o
+u3err
+uer3sc
+uer3t2
+u3erum
+u3erunf
+u3erunt
+ue4s
+ue5se
+ue5sp
+ue2ta
+ue4tek
+uf1ab
+u3fah
+uf1ak
+uf3ar
+uf1au
+u2f1ä4s
+u2f1ä2ß
+u2f1ei
+u2f1em
+u3fen.
+u2fent
+u2f1erh
+u4ferle
+uf2ern
+u2f1eß
+2uff
+uff4l
+uf2fro
+uf3l
+u2fob
+ufo2r
+uf1ori
+uf3r
+uf3sä
+uf2spo
+uf4s3tem
+uf4ster
+uf2t1eb
+uf3ten
+uft3s2
+u2fum
+2u1g
+u4gabte
+ug1af
+ug1ak
+ugang4
+u2g1ap
+uga4s
+ug1au
+ug3d2
+u2g1ei
+ugenma3
+ugenmas6
+u2g1erf
+u2g1erl
+ug3hu
+u2g1l
+ug3lad
+ug3lo
+u3g2lö
+u4glu
+u2g3n
+ugo3
+ug1or
+u2gö
+u4g3reis
+ug3ro
+ugro3s
+ug3rüs
+ug3sc
+ug3se
+ug3si
+ugsma3
+ugsmas4
+ug1spa
+u2gü
+u1h
+2uh.
+uh1la
+uh1lä
+uh2li
+uhme4
+uhr1a
+uh2rer
+uh3ri
+uh4rin
+uhrt4
+uh2ru
+uh4rü
+uh1w
+2ui
+ui2c
+u1ie
+ui1em
+u3ig
+u4ige
+u1im
+u1in.
+u3isch.
+u3ischs
+uisi4n
+ui2st
+u1j
+uk2a
+u3käu
+u1ke
+u1ki
+u1k2l
+ukle1i
+u1k4n
+u3ko
+uk2ö
+u1k4r
+uk2ta
+uk2t1in
+uk2t3r
+u1ku
+uku2s
+u1l
+ul1am
+ul1äm
+ulb4
+ul2dr
+uld2se
+u2l1el
+ule4n
+ul1erf
+ul1erh
+ul1erw
+ule2sa
+ule2t
+ul1eta
+u2lex
+ulf4
+ulg4
+uli2k
+ul1ins
+ul3ka
+ul2kn
+ull2a
+ul3len
+ul2les
+ul2lö
+ulm3ein
+ulo2i
+ul1or
+ul2p1h
+ul2sa
+ul4sam
+uls2t
+uls3z
+2ulta
+ul3th
+ul2tri
+ult3s
+u2lü
+ul2vr
+ulz2w
+u2m3a2k
+um1all
+um2an
+um3anz
+u2m1art
+u2m1aus
+u2maut
+1um3d2
+um2en
+ument4s
+umer2a
+u2m1erg
+u2m1erl
+u2m1erw
+1umf
+1umg
+um1ins
+um1ir
+1umk
+1um3l
+4umm
+umm2a
+umpf4li
+um2p3le
+1umr
+3umsat
+um2sau
+um2ser
+um2sim
+um2s1pe
+um4stem
+um2su
+um3t2
+um2un
+u2m1ur
+1umz
+un1
+2un.
+2una.
+1unab
+un3ac
+un4al
+u3n2am
+u2n3an
+2un2as
+un3at
+1unda
+un4dab
+1undd
+un4dei
+un4d3erf
+und5erha
+1undf
+2undg
+un2did
+1undn
+un2dor
+un2d3r
+4unds.
+und3sp
+un2d1um
+1undv
+1undz
+u3ne
+une2b
+une2h
+un2ei.
+un3ein
+unen2t
+un4es2
+1unget
+1ungew
+1unglü
+un2gr
+ung3ra
+ung3ri
+ung4s1
+un2id
+un3ide
+1u2nif
+unik4
+un2im
+uni2r
+2unis
+un3isl
+u3n2it
+3u2niv
+2unk
+un2k1a2
+un2kei
+unks2
+unk4tit
+unk2t3r
+3unku
+un2n3a2d
+un3n2e
+uno4r
+un2os
+1unr
+uns2
+2uns.
+un3se
+1unsi
+un3sk
+un3sp
+unst1r
+1unt
+un3ta
+unte4ri
+un3tr
+unt3s
+2untu
+u1nü
+unvol2
+unvoll3
+1unw
+2unz
+2uo
+u1o2b
+u3of
+u1op
+u1or
+u3or.
+u3or3c
+u3ors
+u1os.
+uote2
+u1pa
+u1pe2
+uper1
+up2fa
+upf2e
+upf1i
+u1pfl
+u3pi
+up2pl
+up2pr
+u1pr
+upt3a2
+upt3erg
+upt1o
+u1q
+2ur.
+u1ra
+u2rab
+u3raba
+ura2be
+u2r3a2m
+u2r1ana
+ur2anb
+u2r1ang
+ur2anh
+u2r1an5s
+u2rar
+ur3a4ren
+u2r3att
+u2r1au
+2u1rä
+ur1än
+ur3b2a
+urch1
+ur3d2i
+ur1eff
+u2rele
+ure4n
+u4r1ep
+ur1erh
+ur1erw
+2urf
+urf3t
+ur2gri
+urgs2
+uri2c
+ur1im
+ur1ini
+ur3ins
+ur1int
+u2rinv
+1urlau
+4u1ro
+u3rol
+u1rö
+ur3p
+2urr
+ur2san
+ur2sau
+ur2ser
+urst4r
+ur4sw
+urs2ze
+urt2
+u3ru
+ur2za
+ur2zä
+ur2zi
+ur2zo
+ur2z1w
+2us
+u4saf
+us4ann
+us5art
+u1sä
+u6schent
+usch5wer
+u2s1ec
+u2s1ei
+u3seid
+u3sep
+use1ra
+u2serp
+u2s1ese
+usi3er.
+usi5ers.
+us3kl
+u4sko
+usmas2
+usma5sse
+u1so
+us3oc
+u3soh
+u3sol
+u2s1op
+us1ou
+u1sö
+u1sp
+us3part
+u2s1pas
+u2spat
+us1pe
+u3s2pek
+us1pic
+u3s2piz
+u2spo
+us2por
+u2spu
+u4s3sel
+us2sen
+us5sende
+us6seni
+ussenma7s
+us2ser
+us4serf
+uss5erfa
+us2sez
+u3ssig
+us2sof
+u2stab
+ust3abe
+u3stal
+us2tat
+us2ten
+us4ter.
+us2th
+ust2in
+u3stis
+u2s1tor
+u2strä
+u4strit
+u3s4trop
+u2s1tur
+u2sty
+u1su
+us2ur
+2uß
+u2ß1u
+2u1t
+u3ta.
+ut1alt
+ut3a2m
+u2t1ap
+u2t1ar
+u2tär
+u3te
+ut1eg
+ute4ge
+ute2n1
+u2tent
+uter4er
+u4t3ersa
+ut2es
+ut2et
+u4tev
+u4t1ex
+utfi4
+ut2he
+u2thi
+u2t3ho
+u2thu
+utmas2
+utma5sse
+u3to.
+uto4ber
+uto3c
+u3tom
+ut1opf
+u2tops
+ut4or
+ut3rea
+ut3rü
+ut3s2a
+ut2s1ä
+ut4schl
+ut4schm
+ut4schö
+ut1sp
+ut2spa
+ut3te
+ut3t4l
+utt1s2
+utu4re
+utu5ru
+utz3eng
+ut2zin
+ut2zo
+ut2z1w
+2u1u2
+uufe2
+u1ü2
+u1v4
+u2ve.
+uve3rä
+u1w
+2u1x
+ux2e
+ux2o
+ux3t
+u1ya
+2u1z
+uz1we
+uz3z4
+1üb
+2übc
+2übd
+übe2
+über3
+üb3l
+üb3r
+2üc
+ü1che
+üch3l
+üch4s1c
+ücht4e
+ück1er
+ück3eri
+ück4spe
+üd3a4
+ü3den.
+üden4g
+ü3d2ens
+üd1o4
+üdö4
+üd3r
+üd3s2
+üdsa1
+üd3t4
+üdwe2
+ü2f1a
+ü2f1ei
+üfer2
+ü2f1erg
+üf2fl
+ü2f1i
+üf3l
+üf2to
+ü1g
+üge6leis
+ü2g3l
+ü2gn
+üg3s
+üh1a
+ü1he
+ü2h1ei
+ü2h1eng
+ü2h1erk
+ü2h1erz
+üh1i
+ühl1ac
+ühl2e
+üh3mo
+üh3ne
+üh3r2e
+ühr3ei.
+üh1ro
+ühr3ta
+ühs2
+üh3stu
+üh3t
+üh4th
+ü1hu
+üh1w
+ü1k2
+2ül
+ül1a
+ül2c
+ül4e
+ül2la
+ül2l1ei
+ül2lo
+ül2lö
+ü1lu
+ü2ment
+ü2n1a
+ün2da
+ün2dr
+ünen3
+ün2fa
+ün2f1ei
+ün2fli
+ün2fr
+ün2g3l
+ünt2
+ü1nu
+ün2za
+ü1pe
+ü1pi
+üp2pl
+ür1a
+ü2r1ei
+ür2fl
+ür2fr
+ür4g3en4g
+ü1r2o1
+ür4ster
+ürt2h
+üs2a
+üs4c
+ü2schl
+ü5se
+üse3h
+üse3l
+ü1sp
+üs4s1c
+üss2e
+ü4s3sel
+üs4st
+üs2su
+üs4t
+ü2sta
+üste3ne
+ü2str
+ü1su
+ü1ß
+2üt
+ü1ta
+ü2t1al
+ü1te
+ü1ti
+üt3r
+üt2s1
+üt2tr
+ü1tu
+ü1v
+ü1z
+2v1ab
+va1c
+val2s
+2vang
+2varb
+vas2
+v4at
+va2t3a4
+va2tei
+va2t3h
+vatik2
+va4t1in
+vati8ons.
+va2t3r
+vat3s4
+va2t1u
+vat3z
+2v1au
+vä1
+2v1b
+2v1d
+1ve2
+ve3ar
+ve3b
+ve3c
+ve3d
+ve3g
+ve3h
+ve4i
+veit2
+veits1
+ve3la
+ve4l1au
+ve3le
+ve3li
+ve3lo
+ve3ma
+ve3mu
+ve3nal
+ven2c
+ve3ne
+venen4d
+ve3ni
+ve3nö
+ve3o
+ver1
+ver3a
+ve3rad
+ve3rand
+ve3ras
+ver3b2
+verd2
+vere2
+ve4rek
+verf4
+verg4
+vergas6
+ve3ri
+ve4rin
+ver3k
+vermas8sen
+ver3sta
+vert2
+ver5te
+ver3u
+ve3s
+2vesc
+2vese
+ve4sh
+ve4s1p
+ves4t
+ve3ta
+vete1
+ve3tr
+2veü
+ve3v
+ve3x2
+2v1f4
+2v1g
+2v1h
+vi3ar
+vi4a3t
+vi2c
+vie2h3a
+vi2el
+vi2er
+vie4rec
+vie2w1
+vig2
+2vii
+vi2l1a
+vi4leh
+vi2l1in
+2v1i2m
+vima2
+vi4na
+vin2s
+2v1int
+vi3sa
+vise4
+vi3s2o
+vi2sp
+vis2u
+2v1k
+2v1l2
+2v1m
+2v1n
+2v1ob
+vo3ga
+vo2gu
+3vol
+vollen4
+vol6l5end
+vol2li
+2v1op
+vo2r1
+vor3a
+vor3d
+vor3e
+vor3g
+vo3ri
+vormen4
+vorö4
+3voy
+2v1p
+v2r
+2v3ra
+v3re
+v4ree
+2v3ro
+2v1s
+vs2e
+v3s2z
+2v1t
+vu2et
+2vumf
+2v1v
+2v1w
+2v1z
+w2a
+1waa
+wab2bl
+wa3che
+wach6stu
+wach4t4r
+waffe2
+waffel3
+1wag
+wa5ge
+wa2g3n
+wa3go
+1wah
+wahl5ent
+wah4ler
+wah2li
+wai2b
+1wal
+2walb
+wal4da
+2walm
+wal2ta
+wal2to
+walt4st
+wa3na
+wang4s
+wa2p
+1war2e
+ware1i
+wart4e
+1was
+wa3sa
+wa4scha
+wa3sh
+wass4e
+w2ä
+1wäh
+1wäl
+wäm3
+2wäng
+1wäs3
+wä5sc
+wä4ss
+2w1b2
+wbu2
+2w1c
+2w1d
+we2a
+we2ba
+4webeb
+we2bl
+web3s
+we2e4
+weed3
+we2fl
+1weg
+we2g1a
+we2g3l
+we2g3r
+weg1s2
+1weh
+we2i
+wei4bl
+2weie
+weik4
+weis4s3p
+wei4tr
+weit1s
+wel6schl
+wel6schr
+wel2t1
+wel4t3a4
+wel6t5en6d
+wel4tr
+wen3a4
+we3ni
+wen4k3ri
+we2r3a
+wer2bl
+1werbu
+werd2
+5werdens
+1werdu
+werer2
+wer2fl
+wer4gel
+we4r3io
+1werk.
+wer2ka
+1werke
+wer2kl
+wer2ku
+we2rö
+wer4sta
+wer2ta
+wer6t5erm
+wer2to
+1werts
+1wese
+wesen4s3
+we2s1p
+wes2t
+we2st1a
+we4st3ei
+we4steu
+we4sti
+we2st1o2
+we2stö
+we2st3r
+we4stu
+1wet
+wet2s
+wett3s
+2w1ey
+2w1g
+2w3h
+1wid
+wi2e
+wie3l
+wien2e
+wie4st
+wik2
+1wil
+wim2ma
+wim4m3u
+win4d3ec
+win2dr
+win2e
+2wing
+win8n7ersc
+win4num
+1wi4r
+wi3s2e
+wi2sp
+1wiss
+wi3st
+wi3th
+1witzl
+2w1k
+2w1l
+2w1m
+2wn
+wn3s
+1wo1c
+wo2cha
+woche4
+1woh
+woh2le
+1wolf
+wolf2s1
+wol4la
+wol4ler
+wor3a
+wo2r3i
+wor2t3r
+wo4r3u
+wot2
+1wöc
+wört2h
+2w1p
+w2r
+w3ro
+2w1s
+w3s2k
+2w1t
+wti2
+w2u
+1wuc
+wuch4sc
+wuls2
+wun2s
+4wur.
+wur2fa
+1wurst
+wus4
+1wu4t1
+1wüh
+wüs4
+2w1w
+x1a
+1xa.
+2xa2b
+1x2ad
+1xae
+xa1fl
+1x2ag
+xa2m
+x2anz
+1x2as
+xau3
+xaus2
+2x1b
+2xc
+x1ce
+x1ch
+x1cl
+4x1d
+1xe
+x1e4g
+2xek
+xe2l
+xe3lei
+x1em
+3x2em.
+x2en
+xen3s2
+x2er.
+x2ere
+xers2
+3xes
+2x3eu
+2x1f
+2x1g
+2x1h
+xib4
+xi1c
+xich2
+xide2
+xi2d1em
+x1i2do
+xie3l
+xi3g
+xil1
+xil2a
+xi2lo
+xi2lu
+xin3s2
+x2is
+xi2s1e
+xi2s1o2
+xis5s
+xi3stä
+xi2su
+x1i2tu
+x1j
+2x1k2
+2x2l2
+x3lä
+x3le
+2x1m
+2x1n
+x1or
+4x1p
+xpor6ter
+x1q
+2x1r
+2x3s2
+4x1t
+x2t1a
+x3ta.
+x3t2as
+xt1ä
+x2tän
+x2t1e2d
+x2t1ei
+x2tent
+x2t1er2f
+x2t3ev
+xtfi4
+x2t1il2l
+xtra3b4
+x2t3ran
+xt1s2
+xt1u
+x3t2ur
+1xu
+xu1a
+x1u2n
+xu2s
+2xv
+2x1w
+2xy
+3xy.
+3xys
+x1z
+2y1ab
+1yac
+y1al.
+y1a2m
+yan2g
+y1ank
+y1ät
+y1b
+y1c2
+y2chi
+y3chis
+ych3n
+y1d4
+y1e
+y2ef
+yen4n
+y2ere
+yes2
+y2es.
+ye4st
+ye2th
+y1f2
+y1g
+ygi2
+ygie5
+yg2l
+y1h
+yhr2
+y1i4
+y1j
+y1k2
+yke3n
+yk3s2
+y1l
+y2l3a2m
+yl4ante
+yl3c
+y4le.
+yli4n
+yloni1
+y2l1u
+yma2t
+ym3p2
+ympi1
+y2n1o
+yno4d
+ynt2
+y1of
+yom2
+yon4i
+y1ont
+y1ou
+y1p
+ypa2
+yp3an
+ype2
+y2pf
+y3ph
+y2p1in
+ypo3
+y4p3s
+y1r
+y3r2e
+y3ri
+yri2a
+yri1e
+y3r4o
+yrr2
+y1s
+ys2an
+ys2c
+yse1
+y3s2h
+y4s3l
+ysme3
+ys2pa
+yst4
+y2s1u2
+y3s2z
+y1t2
+y2te.
+y2tes
+y3to
+yu2r
+yure3
+y1v
+y1w
+y1y
+y1z2
+za2
+2z3ab
+zab3l
+za3cha
+za3chä
+z1ad
+2z1af
+za3ge
+za3gr
+3zah
+2z3ak
+zale3
+za3li
+2z1all
+2z1am
+3zambiq
+z1an
+za3ne
+2z3anf
+3zani
+2z3anl
+za3no
+za3ra
+2zarb
+2zarc
+za3re
+za3ri
+z1arm
+za3ro
+z1arti
+zar2tr
+2z1arz
+z1as
+zast4
+2z3at3
+3zaub
+z1au2f
+z3aug
+3zaun
+zä2
+2z1äc
+3z2äh
+2z1äm
+z1ärg
+z1ärm
+4z3b4
+zbü1b
+zbübe3
+2z3c
+2z3d2
+zdan2
+zdä1
+zeau3
+zeaus4
+2z1e2ben
+2zecho
+2z1eck
+ze1e
+2z1eff
+zeik4
+zei3la
+zeile4
+2z1ein
+zeinbus6
+zei3s2
+zeist4
+zei2t1a
+zeit5end
+zei4t3er
+zei2tr
+ze2l1a2
+ze2len
+ze2l1er
+ze2l1in
+zell2a
+zel4leh
+zel4lin
+zel3sz
+zel3t2h
+zelu2
+2z1emp
+5zen.
+ze4n3ac
+zen3n
+ze2no
+zens2e
+zen4sem
+3zent
+zent3s
+zen4zer
+z2er.
+ze2r3a
+ze2re2b
+2z1ergä
+4z3ergeb
+z3erhal
+2zerhö
+zerin4t
+zerk2
+z2erl.
+2zerlö
+z2ern
+zer4neb
+zer4n3ei
+2z1erq
+zers2
+2z1ersa
+4z3erste
+zert1a4
+zer4t3ag
+zert4an
+zer6tere
+zer4tin
+zer6t5rau
+4zerwei
+2z1erz
+3z2erza
+ze2s
+zes1e
+zes1i
+ze3sku
+zessen4
+zes6s5end
+zes2sp
+zes1tr
+ze2ß1
+ze2tr
+2zetts
+2z1ex
+2z1f4
+zfä4s3
+2z1g2
+zger2a
+2z1h
+z2hen
+zhir3
+3zi.
+zi3alo
+zi3ar
+zid3r
+zi1erh
+zi1es.
+3zig
+zil2e
+z2imm
+2z1imp
+zin2e
+zin4er
+2z1inf
+z1inh
+zin1it
+zin2sa
+zin4ser
+4zinsuf
+z1inv
+zi2o3
+zi3op
+zirk2
+zirk6s
+zi3s2z
+zit2h
+2z1j
+2z3k4
+2z1l2
+2z1m2
+zme2e
+2z3n4
+2z1ob
+2z1of
+zo2gl
+2z1oh
+3zol
+zon4ter
+zo2o
+2zope
+z1or
+zo2ri
+zor4ne
+2z1osz
+2z3ot
+2zö2f
+z1öl
+2z3p4
+2z1q
+2z3r2
+4z1s2
+z3sa
+z3sh
+z3sk
+z3str
+z3sz
+2z1t
+z2t1au
+z4tehe
+zte3str
+z3t2her
+zt3ho
+zt1ins
+zt3rec
+zt3s2
+zu3a
+zub4
+zu4c
+zud4
+zudi4
+zu2el
+zu3f4
+zu2g1ar
+zu4gent
+zu3gl
+zugs1t
+zug4ste
+zug1un
+2z1uhr
+zu1i
+zu3k
+2z1um.
+zumen2
+2zumf
+2zumg
+2zuml
+2z1ums
+zun2e
+2zunt
+zup2fi
+zu3r2a
+z1urk
+2z1url
+2z1urs
+2z1urt
+zu3s2
+zu3t2
+zuz2
+2züb
+zür1c
+2z1v
+zw2
+z1wac
+4zwah
+zwan2d1
+z2wang
+z1war
+2zwas
+4zwäl
+2zweg
+z2weig
+z1wei3s
+2z1wel
+2z1wen
+2z1wer
+z2werg
+2z1wes
+2zwet
+4zwir
+z2wit
+2z1wo
+z1wör
+z1wur
+2z1wü
+4z1z
+z3z4a
+zze3s
+z3z2o
+zz2ö} \ No newline at end of file
diff --git a/tex/context/patterns/lang-deo.rme b/tex/context/patterns/lang-deo.rme
new file mode 100644
index 000000000..b3a2b69cc
--- /dev/null
+++ b/tex/context/patterns/lang-deo.rme
@@ -0,0 +1,31 @@
+% generated by mtxrun --script pattern --convert
+
+% dehypht-x-2009-06-19.pat
+
+\message{German Hyphenation Patterns (Traditional Orthography) `dehypht-x' 2009-06-19 (WL)}
+
+% TeX-Trennmuster für die traditionelle deutsche Rechtschreibung
+%
+%
+% Copyright (C) 2008 Werner Lemberg <wl@gnu.org>
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+%
+%
+% The word list is available from
+%
+% http://repo.or.cz/w/wortliste.git?a=commit;h=e4826ce7db99bceb6043be48983ff2b67d56669f
+%
+% The used patgen parameters are
+%
+% 1 1 | 2 5 | 1 1 1
+% 2 2 | 2 5 | 1 2 1
+% 3 3 | 2 6 | 1 1 1
+% 4 4 | 2 6 | 1 4 1
+% 5 5 | 2 7 | 1 1 1
+% 6 6 | 2 7 | 1 6 1
+% 7 7 | 2 13 | 1 4 1
+% 8 8 | 2 13 | 1 8 1
diff --git a/tex/context/patterns/lang-es.hyp b/tex/context/patterns/lang-es.hyp
new file mode 100644
index 000000000..1be9ae4e0
--- /dev/null
+++ b/tex/context/patterns/lang-es.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-es.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-es.pat b/tex/context/patterns/lang-es.pat
new file mode 100644
index 000000000..691848d16
--- /dev/null
+++ b/tex/context/patterns/lang-es.pat
@@ -0,0 +1,3378 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-es.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z á é í ñ ó ú
+
+\patterns{
+1b
+4b.
+2bb
+2bc
+2bd
+2bf
+2bg
+2b1h
+2bj
+2bk
+2bm
+2bn
+2bp
+2bq
+2bs
+2bt
+2bv
+2bw
+2bx
+2by
+2bz
+1c
+4c.
+2cb
+2cc
+2cd
+2cf
+2cg
+2cj
+2ck
+2cm
+2cn
+2cp
+2cq
+2cs
+2ct
+2cv
+2cw
+2cx
+2cy
+2cz
+1d
+4d.
+2db
+2dc
+2dd
+2df
+2dg
+2d1h
+2dj
+2dk
+2dl
+2dm
+2dn
+2dp
+2dq
+2ds
+2dt
+2dv
+2dw
+2dx
+2dy
+2dz
+1f
+4f.
+2fb
+2fc
+2fd
+2ff
+2fg
+2f1h
+2fj
+2fk
+2fm
+2fn
+2fp
+2fq
+2fs
+2ft
+2fv
+2fw
+2fx
+2fy
+2fz
+1g
+4g.
+2gb
+2gc
+2gd
+2gf
+2gg
+2g1h
+2gj
+2gk
+2gm
+2gn
+2gp
+2gq
+2gs
+2gt
+2gv
+2gw
+2gx
+2gy
+2gz
+4h.
+2hb
+2hc
+2hd
+2hf
+2hg
+2h1h
+2hj
+2hk
+2hl
+2hm
+2hn
+2hp
+2hq
+2hr
+2hs
+2ht
+2hv
+2hw
+2hx
+2hy
+2hz
+1j
+4j.
+2jb
+2jc
+2jd
+2jf
+2jg
+2j1h
+2jj
+2jk
+2jl
+2jm
+2jn
+2jp
+2jq
+2jr
+2js
+2jt
+2jv
+2jw
+2jx
+2jy
+2jz
+1k
+4k.
+2kb
+2kc
+2kd
+2kf
+2kg
+2k1h
+2kj
+2kk
+2km
+2kn
+2kp
+2kq
+2ks
+2kt
+2kv
+2kw
+2kx
+2ky
+2kz
+1l
+4l.
+2lb
+2lc
+2ld
+2lf
+2lg
+2l1h
+2lj
+2lk
+2lm
+2ln
+2lp
+2lq
+2lr
+2ls
+2lt
+2lv
+2lw
+2lx
+2ly
+2lz
+1m
+4m.
+2mb
+2mc
+2md
+2mf
+2mg
+2m1h
+2mj
+2mk
+2ml
+2mm
+2mn
+2mp
+2mq
+2mr
+2ms
+2mt
+2mv
+2mw
+2mx
+2my
+2mz
+1n
+4n.
+2nb
+2nc
+2nd
+2nf
+2ng
+2n1h
+2nj
+2nk
+2nl
+2nm
+2nn
+2np
+2nq
+2nr
+2ns
+2nt
+2nv
+2nw
+2nx
+2ny
+2nz
+1p
+4p.
+2pb
+2pc
+2pd
+2pf
+2pg
+2p1h
+2pj
+2pk
+2pm
+2pn
+2pp
+2pq
+2ps
+2pt
+2pv
+2pw
+2px
+2py
+2pz
+1q
+4q.
+2qb
+2qc
+2qd
+2qf
+2qg
+2q1h
+2qj
+2qk
+2ql
+2qm
+2qn
+2qp
+2qq
+2qr
+2qs
+2qt
+2qv
+2qw
+2qx
+2qy
+2qz
+1r
+4r.
+2rb
+2rc
+2rd
+2rf
+2rg
+2r1h
+2rj
+2rk
+2rl
+2rm
+2rn
+2rp
+2rq
+2rs
+2rt
+2rv
+2rw
+2rx
+2ry
+2rz
+1s
+4s.
+2sb
+2sc
+2sd
+2sf
+2sg
+2s1h
+2sj
+2sk
+2sl
+2sm
+2sn
+2sp
+2sq
+2sr
+2ss
+2st
+2sv
+2sw
+2sx
+2sy
+2sz
+1t
+4t.
+2tb
+2tc
+2td
+2tf
+2tg
+2t1h
+2tj
+2tk
+2tm
+2tn
+2tp
+2tq
+2ts
+2tt
+2tv
+2tw
+2tx
+2ty
+2tz
+1v
+4v.
+2vb
+2vc
+2vd
+2vf
+2vg
+2v1h
+2vj
+2vk
+2vm
+2vn
+2vp
+2vq
+2vs
+2vt
+2vv
+2vw
+2vx
+2vy
+2vz
+1w
+4w.
+2wb
+2wc
+2wd
+2wf
+2wg
+2w1h
+2wj
+2wk
+2wl
+2wm
+2wn
+2wp
+2wq
+2wr
+2ws
+2wt
+2wv
+2ww
+2wx
+2wy
+2wz
+1x
+4x.
+2xb
+2xc
+2xd
+2xf
+2xg
+2x1h
+2xj
+2xk
+2xl
+2xm
+2xn
+2xp
+2xq
+2xr
+2xs
+2xt
+2xv
+2xw
+2xx
+2xy
+2xz
+1y
+4y.
+2yb
+2yc
+2yd
+2yf
+2yg
+2y1h
+2yj
+2yk
+2yl
+2ym
+2yn
+2yp
+2yq
+2yr
+2ys
+2yt
+2yv
+2yw
+2yx
+2yy
+2yz
+1z
+4z.
+2zb
+2zc
+2zd
+2zf
+2zg
+2z1h
+2zj
+2zk
+2zl
+2zm
+2zn
+2zp
+2zq
+2zr
+2zs
+2zt
+2zv
+2zw
+2zx
+2zy
+2zz
+1ñ
+4ñ.
+c4h
+4ch.
+2chb
+2chc
+2chd
+2chf
+2chg
+2chh
+2chj
+2chk
+ch2l
+2chm
+2chn
+2chp
+2chq
+ch2r
+2chs
+2cht
+2chv
+2chw
+2chx
+2chy
+2chz
+l4l
+4ll.
+2llb
+2llc
+2lld
+2llf
+2llg
+2llh
+2llj
+2llk
+2lll
+2llm
+2lln
+2llp
+2llq
+2llr
+2lls
+2llt
+2llv
+2llw
+2llx
+2lly
+2llz
+b2l
+4bl.
+2bl2b
+2bl2c
+2bl2d
+2bl2f
+2bl2g
+2bl2h
+2bl2j
+2bl2k
+2bl2l
+2bl2m
+2bl2n
+2bl2p
+2bl2q
+2bl2r
+2bl2s
+2bl2t
+2bl2v
+2bl2w
+2bl2x
+2bl2y
+2bl2z
+c2l
+4cl.
+2cl2b
+2cl2c
+2cl2d
+2cl2f
+2cl2g
+2cl2h
+2cl2j
+2cl2k
+2cl2l
+2cl2m
+2cl2n
+2cl2p
+2cl2q
+2cl2r
+2cl2s
+2cl2t
+2cl2v
+2cl2w
+2cl2x
+2cl2y
+2cl2z
+f2l
+4fl.
+2fl2b
+2fl2c
+2fl2d
+2fl2f
+2fl2g
+2fl2h
+2fl2j
+2fl2k
+2fl2l
+2fl2m
+2fl2n
+2fl2p
+2fl2q
+2fl2r
+2fl2s
+2fl2t
+2fl2v
+2fl2w
+2fl2x
+2fl2y
+2fl2z
+g2l
+4gl.
+2gl2b
+2gl2c
+2gl2d
+2gl2f
+2gl2g
+2gl2h
+2gl2j
+2gl2k
+2gl2l
+2gl2m
+2gl2n
+2gl2p
+2gl2q
+2gl2r
+2gl2s
+2gl2t
+2gl2v
+2gl2w
+2gl2x
+2gl2y
+2gl2z
+k2l
+4kl.
+2kl2b
+2kl2c
+2kl2d
+2kl2f
+2kl2g
+2kl2h
+2kl2j
+2kl2k
+2kl2l
+2kl2m
+2kl2n
+2kl2p
+2kl2q
+2kl2r
+2kl2s
+2kl2t
+2kl2v
+2kl2w
+2kl2x
+2kl2y
+2kl2z
+p2l
+4pl.
+2pl2b
+2pl2c
+2pl2d
+2pl2f
+2pl2g
+2pl2h
+2pl2j
+2pl2k
+2pl2l
+2pl2m
+2pl2n
+2pl2p
+2pl2q
+2pl2r
+2pl2s
+2pl2t
+2pl2v
+2pl2w
+2pl2x
+2pl2y
+2pl2z
+v2l
+4vl.
+2vl2b
+2vl2c
+2vl2d
+2vl2f
+2vl2g
+2vl2h
+2vl2j
+2vl2k
+2vl2l
+2vl2m
+2vl2n
+2vl2p
+2vl2q
+2vl2r
+2vl2s
+2vl2t
+2vl2v
+2vl2w
+2vl2x
+2vl2y
+2vl2z
+b2r
+4br.
+2br2b
+2br2c
+2br2d
+2br2f
+2br2g
+2br2h
+2br2j
+2br2k
+2br2l
+2br2m
+2br2n
+2br2p
+2br2q
+2br2r
+2br2s
+2br2t
+2br2v
+2br2w
+2br2x
+2br2y
+2br2z
+c2r
+4cr.
+2cr2b
+2cr2c
+2cr2d
+2cr2f
+2cr2g
+2cr2h
+2cr2j
+2cr2k
+2cr2l
+2cr2m
+2cr2n
+2cr2p
+2cr2q
+2cr2r
+2cr2s
+2cr2t
+2cr2v
+2cr2w
+2cr2x
+2cr2y
+2cr2z
+d2r
+4dr.
+2dr2b
+2dr2c
+2dr2d
+2dr2f
+2dr2g
+2dr2h
+2dr2j
+2dr2k
+2dr2l
+2dr2m
+2dr2n
+2dr2p
+2dr2q
+2dr2r
+2dr2s
+2dr2t
+2dr2v
+2dr2w
+2dr2x
+2dr2y
+2dr2z
+f2r
+4fr.
+2fr2b
+2fr2c
+2fr2d
+2fr2f
+2fr2g
+2fr2h
+2fr2j
+2fr2k
+2fr2l
+2fr2m
+2fr2n
+2fr2p
+2fr2q
+2fr2r
+2fr2s
+2fr2t
+2fr2v
+2fr2w
+2fr2x
+2fr2y
+2fr2z
+g2r
+4gr.
+2gr2b
+2gr2c
+2gr2d
+2gr2f
+2gr2g
+2gr2h
+2gr2j
+2gr2k
+2gr2l
+2gr2m
+2gr2n
+2gr2p
+2gr2q
+2gr2r
+2gr2s
+2gr2t
+2gr2v
+2gr2w
+2gr2x
+2gr2y
+2gr2z
+k2r
+4kr.
+2kr2b
+2kr2c
+2kr2d
+2kr2f
+2kr2g
+2kr2h
+2kr2j
+2kr2k
+2kr2l
+2kr2m
+2kr2n
+2kr2p
+2kr2q
+2kr2r
+2kr2s
+2kr2t
+2kr2v
+2kr2w
+2kr2x
+2kr2y
+2kr2z
+p2r
+4pr.
+2pr2b
+2pr2c
+2pr2d
+2pr2f
+2pr2g
+2pr2h
+2pr2j
+2pr2k
+2pr2l
+2pr2m
+2pr2n
+2pr2p
+2pr2q
+2pr2r
+2pr2s
+2pr2t
+2pr2v
+2pr2w
+2pr2x
+2pr2y
+2pr2z
+r2r
+4rr.
+2rr2b
+2rr2c
+2rr2d
+2rr2f
+2rr2g
+2rr2h
+2rr2j
+2rr2k
+2rr2l
+2rr2m
+2rr2n
+2rr2p
+2rr2q
+2rr2r
+2rr2s
+2rr2t
+2rr2v
+2rr2w
+2rr2x
+2rr2y
+2rr2z
+t2r
+4tr.
+2tr2b
+2tr2c
+2tr2d
+2tr2f
+2tr2g
+2tr2h
+2tr2j
+2tr2k
+2tr2l
+2tr2m
+2tr2n
+2tr2p
+2tr2q
+2tr2r
+2tr2s
+2tr2t
+2tr2v
+2tr2w
+2tr2x
+2tr2y
+2tr2z
+v2r
+4vr.
+2vr2b
+2vr2c
+2vr2d
+2vr2f
+2vr2g
+2vr2h
+2vr2j
+2vr2k
+2vr2l
+2vr2m
+2vr2n
+2vr2p
+2vr2q
+2vr2r
+2vr2s
+2vr2t
+2vr2v
+2vr2w
+2vr2x
+2vr2y
+2vr2z
+2b3p2t
+2c3p2t
+2d3p2t
+2l3p2t
+2m3p2t
+2n3p2t
+2r3p2t
+2s3p2t
+2t3p2t
+2x3p2t
+2y3p2t
+4pt.
+2b3c2t
+2c3c2t
+2d3c2t
+2l3c2t
+2m3c2t
+2n3c2t
+2r3c2t
+2s3c2t
+2t3c2t
+2x3c2t
+2y3c2t
+4ct.
+2b3c2n
+2c3c2n
+2d3c2n
+2l3c2n
+2m3c2n
+2n3c2n
+2r3c2n
+2s3c2n
+2t3c2n
+2x3c2n
+2y3c2n
+4cn.
+2b3p2s
+2c3p2s
+2d3p2s
+2l3p2s
+2m3p2s
+2n3p2s
+2r3p2s
+2s3p2s
+2t3p2s
+2x3p2s
+2y3p2s
+4ps.
+2b3m2n
+2c3m2n
+2d3m2n
+2l3m2n
+2m3m2n
+2n3m2n
+2r3m2n
+2s3m2n
+2t3m2n
+2x3m2n
+2y3m2n
+4mn.
+2b3g2n
+2c3g2n
+2d3g2n
+2l3g2n
+2m3g2n
+2n3g2n
+2r3g2n
+2s3g2n
+2t3g2n
+2x3g2n
+2y3g2n
+4gn.
+2b3f2t
+2c3f2t
+2d3f2t
+2l3f2t
+2m3f2t
+2n3f2t
+2r3f2t
+2s3f2t
+2t3f2t
+2x3f2t
+2y3f2t
+4ft.
+2b3p2n
+2c3p2n
+2d3p2n
+2l3p2n
+2m3p2n
+2n3p2n
+2r3p2n
+2s3p2n
+2t3p2n
+2x3p2n
+2y3p2n
+4pn.
+2b3c2z
+2c3c2z
+2d3c2z
+2l3c2z
+2m3c2z
+2n3c2z
+2r3c2z
+2s3c2z
+2t3c2z
+2x3c2z
+2y3c2z
+4cz.
+2b3t2z
+2c3t2z
+2d3t2z
+2l3t2z
+2m3t2z
+2n3t2z
+2r3t2z
+2s3t2z
+2t3t2z
+2x3t2z
+2y3t2z
+4tz.
+2b3t2s
+2c3t2s
+2d3t2s
+2l3t2s
+2m3t2s
+2n3t2s
+2r3t2s
+2s3t2s
+2t3t2s
+2x3t2s
+2y3t2s
+4ts.
+san4c5t
+plan4c5t
+2no.
+2t2l
+4caca4
+4cago4
+4caga4
+4cagas.
+4teta.
+4tetas.
+4puta4
+4puto4
+.hu4mea
+.hu4meo
+.he4mee
+4meo.
+4meable.
+4meables.
+4pedo4
+4culo4
+3mente.
+4i3go.
+4es.
+4és
+4e.
+4e3mos.
+4éis.
+4en.
+4ía.
+4ías.
+4ía3mos.
+4íais.
+4ían.
+4í.
+4í4s3te.
+4í4s3tes.
+4í3tes.
+4í3mos.
+4ís3teis.
+4e3ré.
+4e3rás.
+4e3rés.
+4e3rís.
+4e3rá.
+4e3re3mos.
+4e3réis.
+4e3rán.
+4i3ga.
+4i3gas.
+4i3gás.
+4i3gamos.
+4i3gáis.
+4a4i3gan.
+4e3ría.
+4e3rías.
+4e3ríamos.
+4e3ríais.
+4e3rían.
+4i3gá3mosme.
+4i3gá3mosmele.
+4i3gá3mosmelo.
+4i3gá3mos3mela.
+4i3gá3mosmeles.
+4i3gá3mosmelos.
+4i3gá3mos3melas.
+4i3gá3moste.
+4i3gá3mostele.
+4i3gá3mostelo.
+4i3gá3mos3tela.
+4i3gá3mosteles.
+4i3gá3mostelos.
+4i3gá3mos3telas.
+4i3gá3mosle.
+4i3gá3mosla.
+4i3gá3moslo.
+4i3gá3mosele.
+4i3gá3moselo.
+4i3gá3mosela.
+4i3gá3moseles.
+4i3gá3moselos.
+4i3gá3moselas.
+4i3gá3monos.
+4i3gá3monosle.
+4i3gá3monoslo.
+4i3gá3monosla.
+4i3gá3monosles.
+4i3gá3monoslos.
+4i3gá3monoslas.
+4i3gá3moos.
+4i3gá3moosle.
+4i3gá3mooslo.
+4i3gá3moosla.
+4i3gá3moosles.
+4i3gá3mooslos.
+4i3gá3mooslas.
+4i3gá3mosles.
+4i3gá3moslas.
+4i3gá3moslos.
+4ed.
+4é.
+4edme.
+4édmele.
+4édmelo.
+4éd3mela.
+4édmeles.
+4édmelos.
+4éd3melas.
+4edte.
+4édtele.
+4édtelo.
+4éd3tela.
+4édteles.
+4édtelos.
+4éd3telas.
+4edle.
+4eedla.
+4edlo.
+4édsele.
+4édselo.
+4édsela.
+4édseles.
+4édselos.
+4édselas.
+4ednos.
+4édnosle.
+4édnoslo.
+4édnosla.
+4édnosles.
+4édnoslos.
+4édnoslas.
+4eos.
+4éosle.
+4éoslo.
+4éosla.
+4éosles.
+4éoslos.
+4éoslas.
+4edles.
+4edlas.
+4edlos.
+4er.
+4erme.
+4érmele.
+4érmelo.
+4ér3mela.
+4érmeles.
+4érmelos.
+4ér3melas.
+4erte.
+4értele.
+4értelo.
+4ér3tela.
+4érteles.
+4értelos.
+4ér3telas.
+4erle.
+4erla.
+4erlo.
+4erse.
+4érsele.
+4érselo.
+4érsela.
+4érseles.
+4érselos.
+4érselas.
+4ernos.
+4érnosle.
+4érnoslo.
+4érnosla.
+4érnosles.
+4érnoslos.
+4érnoslas.
+4e3ros.
+4é3rosle.
+4é3roslo.
+4é3rosla.
+4é3rosles.
+4é3roslos.
+4é3roslas.
+4erles.
+4erlas.
+4erlos.
+4í3do.
+4í3da.
+4í3dos.
+4í3das.
+4o.
+4as.
+4a.
+4ás.
+4a3mos.
+4áis.
+4an.
+4aste.
+4astes.
+4ó.
+4ates.
+4asteis.
+4a3ron.
+4a3ba.
+4a3bas.
+4á3bamos.
+4a3bais.
+4a3ban.
+4a3ría.
+4a3rías.
+4a3ríamos.
+4a3ríais
+4a3rían.
+4a3ré.
+4a3rás.
+4a3rés.
+4a3rís.
+4a3rá.
+4a3remos.
+4a3réis.
+4a3rán.
+4a3ra.
+4a3ras.
+4á3ramos.
+4a3rais.
+4a3ran.
+4a3re.
+4a3res.
+4á3remos.
+4a3reis.
+4a3ren.
+4a3se.
+4a3ses.
+4á3semos.
+4a3seis.
+4a3sen.
+4ad.
+e5r4as.
+e5r4a3mos.
+e5r4áis.
+e5r4an.
+e5r4aste.
+e5r4astes.
+e5r4ates.
+e5r4asteis.
+e5r4a3ron.
+e5r4a3ba.
+e5r4a3bas.
+e5r4á3bamos.
+e5r4a3bais.
+e5r4a3ban.
+e5r4a3ría.
+e5r4a3rías.
+e5r4a3ríamos.
+e5r4a3ríais
+e5r4a3rían.
+e5r4a3ré.
+e5r4a3rás.
+e5r4a3rés.
+e5r4a3rís.
+e5r4a3rá.
+e5r4a3remos.
+e5r4a3réis.
+e5r4a3rán.
+e5r4a3ra.
+e5r4a3ras.
+e5r4á3ramos.
+e5r4a3rais.
+e5r4a3ran.
+e5r4a3re.
+e5r4a3res.
+e5r4á3remos.
+e5r4a3reis.
+e5r4a3ren.
+e5r4a3se.
+e5r4a3ses.
+e5r4á3semos.
+e5r4a3seis.
+e5r4a3sen.
+e5r4ad.
+4adme.
+4ádmele.
+4ádmelo.
+4ád3mela.
+4ádmeles.
+4ádmelos.
+4ád3melas.
+4adte.
+4ádtele.
+4ádtelo.
+4ád3tela.
+4ádteles.
+4ádtelos.
+4ád3telas.
+4adle.
+4eadla.
+4adlo.
+4ádsele.
+4ádselo.
+4ádsela.
+4ádseles.
+4ádselos.
+4ádselas.
+4adnos.
+4ádnosle.
+4ádnoslo.
+4ádnosla.
+4ádnosles.
+4ádnoslos.
+4ádnoslas.
+4aos.
+4áosle.
+4áoslo.
+4áosla.
+4áosles.
+4áoslos.
+4áoslas.
+4adles.
+4adlas.
+4adlos.
+4ar.
+4a4rme.
+4á4rmele.
+4á4rmelo.
+4á4r3mela.
+4á4r3meles.
+4á4r3melos.
+4á4r3melas.
+4a4r3te.
+4á4r3tele.
+4á4r3telo.
+4á4r3tela.
+4á4r3teles.
+4á4r3telos.
+4á4r3telas.
+4a4r3le.
+4a4r3la.
+4a4r3lo.
+4a4r3se.
+4á4r3sele.
+4á4r3selo.
+4á4r3sela.
+4á4r3seles.
+4á4r3selos.
+4á4r3selas.
+4a4r3nos.
+4á4r3nosle.
+4á4r3noslo.
+4á4r3nosla.
+4á4r3nosles.
+4á4r3noslos.
+4á4r3noslas.
+4a3ros.
+4árosle.
+4ároslo.
+4árosla.
+4árosles.
+4ároslos.
+4ároslas.
+4a4r3les.
+4a4r3las.
+4a4r3los.
+4a3do.
+4a3da.
+4a3dos.
+4a3das.
+e5r4a3do.
+e5r4a3da.
+e5r4a3dos.
+e5r4a3das.
+4ando
+4ándole.
+4ándolo.
+4ándola.
+4ándoles.
+4ándolos.
+4ándolas.
+4ándonos.
+4ándoos.
+4ándome.
+4ándomelo.
+4ándomela.
+4ándomele.
+4ándomelos.
+4ándomelas.
+4ándomeles.
+4ándote.
+4ándoteme.
+4ándotelo.
+4ándotela.
+4ándotele.
+4ándotelos.
+4ándotelas.
+4ándoteles.
+4ándotenos.
+4ándose.
+4ándoseme.
+4ándoselo.
+4ándosela.
+4ándosele.
+4ándoselos.
+4ándoselas.
+4ándoseles.
+4ándosenos.
+4a3dor.
+4a3dora.
+4a3dores.
+4a3doras.
+e5r4a3dor.
+e5r4a3dora.
+e5r4a3dores.
+e5r4a3doras.
+acto1h
+acto1a2
+acto1e2
+acto1i2
+acto1o2
+acto1u2
+acto1á2
+acto1é2
+acto1í2
+acto1ó2
+acto1ú2
+afro1h
+afro1a2
+afro1e2
+afro1i2
+afro1o2
+afro1u2
+afro1á2
+afro1é2
+afro1í2
+afro1ó2
+afro1ú2
+.a2
+.an2a2
+.an2e2
+.an2i2
+.an2o2
+.an2u2
+.an2á2
+.an2é2
+.an2í2
+.an2ó2
+.an2ú2.
+ana3lí
+.aná3li
+.ana3li
+.an3aero
+.an3e2pigr
+.ane3xa
+.ane3xá
+.ane3xe
+.ane3xé
+.ane3xio
+.ane3xió
+.an3h
+.ani3mad
+.ani3mád
+.ani3dar
+.ani3ll
+.ani3m
+.aniña
+.ani3q
+.an3i2so
+.an3i2só
+.ani3vel
+.ano5che
+.ano5din
+.ano5mal
+.ano5nad
+.anó3nim
+.anó5mal
+.ano5nim
+.ano5ta
+.ano3tá
+.anua3l
+.anua4lm
+.anu3bl
+.anu3da
+.anu3l
+asu3b2
+aero1h
+aero1a2
+aero1e2
+aero1i2
+aero1o2
+aero1u2
+aero1á2
+aero1é2
+aero1í2
+aero1ó2
+aero1ú2
+anfi1h
+anfi1a2
+anfi1e2
+anfi1i2
+anfi1o2
+anfi1u2
+anfi1á2
+anfi1é2
+anfi1í2
+anfi1ó2
+anfi1ú2
+anglo1h
+anglo1a2
+anglo1e2
+anglo1i2
+anglo1o2
+anglo1u2
+anglo1á2
+anglo1é2
+anglo1í2
+anglo1ó2
+anglo1ú2
+ante1h
+ante1a2
+ante1e2
+ante1i2
+ante1o2
+ante1u2
+ante1á2
+ante1é2
+ante1í2
+ante1ó2
+ante1ú2
+.ante2o3je
+acante2
+4ísmo.
+4ísmos.
+4ísta.
+4ístas.
+4ístico.
+4ísticos.
+4ística.
+4ísticas.
+t4eo3nes.
+mante4a
+e4a3miento
+.anti1h
+.anti1a2
+.anti1e2
+.anti1i2
+.anti1o2
+.anti1u2
+.anti1á2
+.anti1é2
+.anti1í2
+.anti1ó2
+.anti1ú2
+ti2o3qu
+ti2o3co
+archi1h
+archi1a2
+archi1e2
+archi1i2
+archi1o2
+archi1u2
+archi1á2
+archi1é2
+archi1í2
+archi1ó2
+archi1ú2
+auto1h
+auto1a2
+auto1e2
+auto1i2
+auto1o2
+auto1u2
+auto1á2
+auto1é2
+auto1í2
+auto1ó2
+auto1ú2
+biblio1h
+biblio1a2
+biblio1e2
+biblio1i2
+biblio1o2
+biblio1u2
+biblio1á2
+biblio1é2
+biblio1í2
+biblio1ó2
+biblio1ú2
+bio1h
+bio1a2
+bio1e2
+bio1i2
+bio1o2
+bio1u2
+bio1á2
+bio1é2
+bio1í2
+bio1ó2
+bio1ú2
+bi1u2ní
+cardio1h
+cardio1a2
+cardio1e2
+cardio1i2
+cardio1o2
+cardio1u2
+cardio1á2
+cardio1é2
+cardio1í2
+cardio1ó2
+cardio1ú2
+cefalo1h
+cefalo1a2
+cefalo1e2
+cefalo1i2
+cefalo1o2
+cefalo1u2
+cefalo1á2
+cefalo1é2
+cefalo1í2
+cefalo1ó2
+cefalo1ú2
+centi1h
+centi1a2
+centi1e2
+centi1i2
+centi1o2
+centi1u2
+centi1á2
+centi1é2
+centi1í2
+centi1ó2
+centi1ú2
+centi5área
+ciclo1h
+ciclo1a2
+ciclo1e2
+ciclo1i2
+ciclo1o2
+ciclo1u2
+ciclo1á2
+ciclo1é2
+ciclo1í2
+ciclo1ó2
+ciclo1ú2
+o4i3dea.
+o4i3deas.
+o4i3dal.
+o4i3dales.
+4o2i3de.
+4o2i3des.
+4i2dal.
+4i2dales.
+4i3deo.
+4i3deos.
+cito1h
+cito1a2
+cito1e2
+cito1i2
+cito1o2
+cito1u2
+cito1á2
+cito1é2
+cito1í2
+cito1ó2
+cito1ú2
+3c2neor
+cnico1h
+cnico1a2
+cnico1e2
+cnico1i2
+cnico1o2
+cnico1u2
+cnico1á2
+cnico1é2
+cnico1í2
+cnico1ó2
+cnico1ú2
+.co2a2
+.co2e2
+.co2i2
+.co3o4
+.co2u2
+.co2á2
+.co2é2
+.co2í2
+.co2ó2
+.co2ú2
+co4á3gul
+co4acci
+co4acti
+co4adju
+co4a3dun
+co4adyu
+co3agen
+co4a3gul
+co4a3lic
+co4aptac
+co4art
+co4árt
+co4e3fic
+co4erc
+co4erz
+co4e3tá
+co3exis
+co4imbr
+co4inci
+co4i3to
+co3n4imbri
+co4o3per
+co4o3pér
+co4opt
+co4ord
+con1imbr
+con1urb
+cripto1h
+cripto1a2
+cripto1e2
+cripto1i2
+cripto1o2
+cripto1u2
+cripto1á2
+cripto1é2
+cripto1í2
+cripto1ó2
+cripto1ú2
+crono1h
+crono1a2
+crono1e2
+crono1i2
+crono1o2
+crono1u2
+crono1á2
+crono1é2
+crono1í2
+crono1ó2
+crono1ú2
+contra1h
+contra1a2
+contra1e2
+contra1i2
+contra1o2
+contra1u2
+contra1á2
+contra1é2
+contra1í2
+contra1ó2
+contra1ú2
+deca1h
+deca1a2
+deca1e2
+deca1i2
+deca1o2
+deca1u2
+deca1á2
+deca1é2
+deca1í2
+deca1ó2
+deca1ú2
+4e3dro.
+4e3dros.
+4é3drico.
+4é3dricos.
+4é3drica.
+4é3dricas.
+.de2sa2
+.de2se2
+.de2si2
+.de2so2
+.de2su2
+.de2sá2
+.de2sé2
+.de2sí2
+.de2só2
+.de2sú2
+deca2i3mient
+decimo1
+3sa.
+3sas.
+de2s3órde
+de2s3orde
+de2s3abast
+de2s3aboll
+de2s3aboto
+de2s3abr
+desa3brid
+de2s3abroch
+de2s3aceit
+de2s3aceler
+desa3cert
+desa3ciert
+de2s3acobar
+de2s3acomod
+de2s3acomp
+de2s3acons
+de2s3acopl
+de2s3acorr
+de2s3acostum
+de2s3acot
+desa3craliz
+de2s3acredit
+de2s3activ
+de2s3acuart
+de2s3aderez
+de2s3adeud
+de2s3adorar
+de2s3adormec
+de2s3adorn
+de2s3advert
+de2s3aferr
+de2s3afic
+de2s3afil
+de2s3afin
+de2s3afor
+desa3gú
+desa3garr
+de2s3agraci
+de2s3agrad
+de2s3agravi
+de2s3agreg
+de2s3agrup
+de2s3agu
+desa3guisado
+de2s3aherr
+de2s3ahij
+de2s3ajust
+de2s3alagar
+de2s3alent
+de2s3alfom
+de2s3alfor
+de2s3aliñ
+desa3lin
+de2s3alien
+de2s3aline
+desa3liv
+de2s3alm
+de2s3almid
+de2s3aloj
+de2s3alquil
+de2s3alter
+de2s3alumbr
+desa3marr
+desa3mobl
+de2s3amold
+de2s3amort
+de2s3amuebl
+de2s3ampa
+de2s3and
+de2s3angel
+de3sangr
+de2s3anid
+de2s3anim
+de2s3aním
+de2s3anud
+desa3pañ
+desa3pacib
+de2s3apadr
+de2s3apare
+de2s3aparec
+de2s3aparic
+de2s3apeg
+de2s3apercib
+de2s3apes
+de2s3aplic
+de2s3apolill
+de2s3apoy
+de2s3aprend
+de2s3apret
+de2s3apriet
+de2s3aprob
+de2s3apropi
+de2s3aprovech
+de2s3arbol
+de2s3aren
+de2s3arm
+des4arme
+de2s3arraig
+de2s3arregl
+de2s3arrend
+de2s3arrim
+desa3rroll
+de2s3arrop
+de2s3arrug
+de2s3articul
+de2s3asent
+de2s3asist
+de2s3asn
+desa3soseg
+desa3sosieg
+de2s3atenc
+de2s3atend
+de2s3atiend
+de2s3atent
+desa3tin
+de2s3atorn
+de2s3atranc
+de2s3autor
+de2s3avis
+desa3yun
+desa3zón
+desa3zon
+de2s3embal
+de2s3embál
+de2s3embar
+de2s3embár
+de2s3embarg
+de2s3embols
+de2s3emborr
+de2s3embosc
+de2s3embot
+de2s3embrag
+de2s3embrág
+de2s3embrave
+de2s3embráve
+de2s3embroll
+de2s3embróll
+de2s3embruj
+de2s3embrúj
+de3semej
+de2s3empañ
+de2s3empáñ
+de2s3empac
+de2s3empaquet
+de2s3empaquét
+de2s3emparej
+de2s3emparéj
+de2s3emparent
+de2s3empat
+de2s3empé
+de2s3empedr
+de2s3empeg
+de2s3empeor
+de2s3emperez
+de2s3empern
+de2s3emple
+de2s3empolv
+de2s3empotr
+de2s3empoz
+de2s3enam
+de2s3encab
+de2s3encad
+de2s3encaj
+de2s3encáj
+de2s3encall
+de2s3encáll
+de2s3encam
+de3sencant
+de2s3encap
+de2s3encar
+de2s3encár
+de2s3ench
+de2s3encl
+de2s3enco
+de2s3encr
+de2s3encu
+de2s3end
+de3senfad
+de3senfád
+de2s3enfi
+de2s3enfo
+de2s3enfó
+de3senfren
+de2s3enfund
+de2s3enfur
+de3sengañ
+de3sengáñ
+de2s3enganch
+de2s3engar
+de2s3engas
+de2s3engom
+de2s3engoz
+de2s3engra
+de2s3enhebr
+de2s3enj
+de2s3enlad
+de2s3enlaz
+de2s3enlo
+de2s3enm
+de2s3enr
+de2s3ens
+de2s3enta
+de3sentend
+de3sentien
+de3sentién
+de2s3enter
+de2s3entier
+de2s3entiér
+de2s3ento
+de2s3entr
+de2s3entu
+de2s3envain
+de3senvolvim
+de3seo
+de2s3eq
+de3s4erci
+de3s4ert
+de3s4ért
+de2s3espa
+de3sesperac
+de2s3esperanz
+de3sesper
+de2s3estabil
+de2s3estim
+de3sider
+de3sidia
+de3sidio
+de3siert
+de3sign
+de3sigual
+de3silusi
+de2s3imagin
+de2s3iman
+de2s3impon
+de2s3impres
+de2s3incent
+de2s3inclin
+de2s3incorp
+de2s3incrust
+de3sinenc
+de3sinfec
+de3su3dar
+de3su3das
+de3su3dan
+de2s3inflam
+de2s3infl
+de2s3inform
+de2s3inhib
+de2s3insect
+de2s3instal
+ini3ci
+iní3ci
+de3s4integr
+de3s4inter
+de2s3intox
+de2s3inver
+de3sisten
+de3isti
+de2s3obedec
+de2s3oblig
+de2s3obstr
+de3socup
+de2s3odor
+de3solac
+de3solad
+de3soll
+de2s3orej
+de2s3orient
+de3sortij
+de2s3organi
+de3suell
+de3sonce
+de2s3ovi
+de2s3oxi
+de2s3oye
+de2s3oyé
+de3s4ubstan
+de3s4ustan
+de3s4oseg
+de2s3ub4ic
+de2s3unir
+de2s3unier
+de2s3unim
+.dieci1o2
+dodeca1h
+dodeca1a2
+dodeca1e2
+dodeca1i2
+dodeca1o2
+dodeca1u2
+dodeca1á2
+dodeca1é2
+dodeca1í2
+dodeca1ó2
+dodeca1ú2
+ecano1h
+ecano1a2
+ecano1e2
+ecano1i2
+ecano1o2
+ecano1u2
+ecano1á2
+ecano1é2
+ecano1í2
+ecano1ó2
+ecano1ú2
+eco1h
+eco1a2
+eco1e2
+eco1i2
+eco1o2
+eco1u2
+eco1á2
+eco1é2
+eco1í2
+eco1ó2
+eco1ú2
+ectro1h
+ectro1a2
+ectro1e2
+ectro1i2
+ectro1o2
+ectro1u2
+ectro1á2
+ectro1é2
+ectro1í2
+ectro1ó2
+ectro1ú2
+.en2a2
+.en2e2
+.en2i2
+.en2o2
+.en2u2
+.en2á2
+.en2é2
+.en2í2
+.en2ó2
+.en2ú2
+.ene3mist
+.ene3míst
+.eno3jar
+.enu3mera
+.enu3merá
+.enu3mere
+4o3lógico.
+4o3lógica.
+4o3lógicos.
+4o3lógicas.
+4o3lógicamente.
+4o3logía.
+4o3logías.
+4ó3logo.
+4ó3loga.
+4ó3logos.
+4ó3logas.
+endo1h
+endo1a2
+endo1e2
+endo1i2
+endo1o2
+endo1u2
+endo1á2
+endo1é2
+endo1í2
+endo1ó2
+endo1ú2
+ento1h
+ento1a2
+ento1e2
+ento1i2
+ento1o2
+ento1u2
+ento1á2
+ento1é2
+ento1í2
+ento1ó2
+ento1ú2
+4emboca
+entre1h
+entre1a2
+entre1e2
+entre1i2
+entre1o2
+entre1u2
+entre1á2
+entre1é2
+entre1í2
+entre1ó2
+entre1ú2
+euco1h
+euco1a2
+euco1e2
+euco1i2
+euco1o2
+euco1u2
+euco1á2
+euco1é2
+euco1í2
+euco1ó2
+euco1ú2
+euro1h
+euro1a2
+euro1e2
+euro1i2
+euro1o2
+euro1u2
+euro1á2
+euro1é2
+euro1í2
+euro1ó2
+euro1ú2
+extra1h
+extra1a2
+extra1e2
+extra1i2
+extra1o2
+extra1u2
+extra1á2
+extra1é2
+extra1í2
+extra1ó2
+extra1ú2
+u4teri
+.cau5t
+.deu5t
+fono1h
+fono1a2
+fono1e2
+fono1i2
+fono1o2
+fono1u2
+fono1á2
+fono1é2
+fono1í2
+fono1ó2
+fono1ú2
+foto1h
+foto1a2
+foto1e2
+foto1i2
+foto1o2
+foto1u2
+foto1á2
+foto1é2
+foto1í2
+foto1ó2
+foto1ú2
+gastro1h
+gastro1a2
+gastro1e2
+gastro1i2
+gastro1o2
+gastro1u2
+gastro1á2
+gastro1é2
+gastro1í2
+gastro1ó2
+gastro1ú2
+geo1h
+geo1a2
+geo1e2
+geo1i2
+geo1o2
+geo1u2
+geo1á2
+geo1é2
+geo1í2
+geo1ó2
+geo1ú2
+gluco1h
+gluco1a2
+gluco1e2
+gluco1i2
+gluco1o2
+gluco1u2
+gluco1á2
+gluco1é2
+gluco1í2
+gluco1ó2
+gluco1ú2
+hecto1h
+hecto1a2
+hecto1e2
+hecto1i2
+hecto1o2
+hecto1u2
+hecto1á2
+hecto1é2
+hecto1í2
+hecto1ó2
+hecto1ú2
+helio1h
+helio1a2
+helio1e2
+helio1i2
+helio1o2
+helio1u2
+helio1á2
+helio1é2
+helio1í2
+helio1ó2
+helio1ú2
+hemato1h
+hemato1a2
+hemato1e2
+hemato1i2
+hemato1o2
+hemato1u2
+hemato1á2
+hemato1é2
+hemato1í2
+hemato1ó2
+hemato1ú2
+hemi1h
+hemi1a2
+hemi1e2
+hemi1i2
+hemi1o2
+hemi1u2
+hemi1á2
+hemi1é2
+hemi1í2
+hemi1ó2
+hemi1ú2
+hemo1h
+hemo1a2
+hemo1e2
+hemo1i2
+hemo1o2
+hemo1u2
+hemo1á2
+hemo1é2
+hemo1í2
+hemo1ó2
+hemo1ú2
+2al.
+2ales.
+hexa1h
+hexa1a2
+hexa1e2
+hexa1i2
+hexa1o2
+hexa1u2
+hexa1á2
+hexa1é2
+hexa1í2
+hexa1ó2
+hexa1ú2
+hidro1h
+hidro1a2
+hidro1e2
+hidro1i2
+hidro1o2
+hidro1u2
+hidro1á2
+hidro1é2
+hidro1í2
+hidro1ó2
+hidro1ú2
+hipe2r3r
+hipe2r1a2
+hipe2r1e2
+hipe2r1i2
+hipe2r1o2
+hipe2r1u2
+hipe2r1á2
+hipe2r1é2
+hipe2r1í2
+hipe2r1ó2
+hipe2r1ú2
+pe3r4e3mia
+histo1h
+histo1a2
+histo1e2
+histo1i2
+histo1o2
+histo1u2
+histo1á2
+histo1é2
+histo1í2
+histo1ó2
+histo1ú2
+homo1h
+homo1a2
+homo1e2
+homo1i2
+homo1o2
+homo1u2
+homo1á2
+homo1é2
+homo1í2
+homo1ó2
+homo1ú2
+icono1h
+icono1a2
+icono1e2
+icono1i2
+icono1o2
+icono1u2
+icono1á2
+icono1é2
+icono1í2
+icono1ó2
+icono1ú2
+.i2n2a2
+.i2n2e2
+.i2n2i2
+.i2n2o2
+.i2n2u2
+.i2n2á2
+.i2n2é2
+.i2n2í2
+.i2n2ó2
+.i2n2ú2
+.in3abord
+.in3abarc
+.in3acent
+.in3aguant
+.in3adapt
+.ina3movib
+.in3analiz
+.ina3nic
+.in3anim
+.iná3nim
+.in3apel
+.in3aplic
+.in3aprens
+.in3apreci
+.in3arrug
+.in3asist
+.iné3dit
+.in3efic
+.in3efici
+.in3eludi
+.ine3narr
+ini3cia
+iní3cia
+ini3ciá
+ini3cie
+.rei3na
+re3ini3cia
+re3iní3cia
+re3ini3ciá
+re3ini3cie
+.ini3cuo
+.ini3cua
+.ino3cuo
+.ino3cua
+.ino3cula
+.ino3culá
+.ino3cule
+.inú3til
+.inu3tiliz
+infra1h
+infra1a2
+infra1e2
+infra1i2
+infra1o2
+infra1u2
+infra1á2
+infra1é2
+infra1í2
+infra1ó2
+infra1ú2
+.inte2r3r
+.inte2r1a2
+.inte2r1e2
+.inte2r1i2
+.inte2r1o2
+.inte2r1u2
+.inte2r1á2
+.inte2r1é2
+.inte2r1í2
+.inte2r1ó2
+.inte2r1ú2
+.in3ter2e3sa
+.in3ter2e3se
+.in3ter2e3so
+.in3ter2e3sá
+.in3ter2e3sé
+.in3ter2e3só
+.de3s4in3ter2e3sa
+.de3s4in3ter2e3se
+.de3s4in3ter2e3so
+.de3s4in3ter2e3sá
+.de3s4in3ter2e3sé
+.de3s4in3ter2e3só
+3te3ri3n
+4te4r5i4nsu
+.in3te3r4rog
+.in3te3r4rupc
+.in3te3r4rupt
+.in3te3r4rump
+intra1h
+intra1a2
+intra1e2
+intra1i2
+intra1o2
+intra1u2
+intra1á2
+intra1é2
+intra1í2
+intra1ó2
+intra1ú2
+iso1h
+iso1a2
+iso1e2
+iso1i2
+iso1o2
+iso1u2
+iso1á2
+iso1é2
+iso1í2
+iso1ó2
+iso1ú2
+kilo1h
+kilo1a2
+kilo1e2
+kilo1i2
+kilo1o2
+kilo1u2
+kilo1á2
+kilo1é2
+kilo1í2
+kilo1ó2
+kilo1ú2
+macro1h
+macro1a2
+macro1e2
+macro1i2
+macro1o2
+macro1u2
+macro1á2
+macro1é2
+macro1í2
+macro1ó2
+macro1ú2
+mal2
+ma4l3h
+.ma4l3e4du
+mal3b
+mal3c
+mal3d
+mal3f
+mal3g
+mal3m
+mal3p
+mal3q
+mal3s
+mal3t
+mal3v
+bien2
+bien3h
+bien3v
+bien3q
+bien3m
+bien3t
+b4ien3do.
+.su3b4ien
+b4ien3das.
+maxi1h
+maxi1a2
+maxi1e2
+maxi1i2
+maxi1o2
+maxi1u2
+maxi1á2
+maxi1é2
+maxi1í2
+maxi1ó2
+maxi1ú2
+megalo1h
+megalo1a2
+megalo1e2
+megalo1i2
+megalo1o2
+megalo1u2
+megalo1á2
+megalo1é2
+megalo1í2
+megalo1ó2
+megalo1ú2
+mega1h
+mega1a2
+mega1e2
+mega1i2
+mega1o2
+mega1u2
+mega1á2
+mega1é2
+mega1í2
+mega1ó2
+mega1ú2
+melano1h
+melano1a2
+melano1e2
+melano1i2
+melano1o2
+melano1u2
+melano1á2
+melano1é2
+melano1í2
+melano1ó2
+melano1ú2
+micro1h
+micro1a2
+micro1e2
+micro1i2
+micro1o2
+micro1u2
+micro1á2
+micro1é2
+micro1í2
+micro1ó2
+micro1ú2
+mili1h
+mili1a2
+mili1e2
+mili1i2
+mili1o2
+mili1u2
+mili1á2
+mili1é2
+mili1í2
+mili1ó2
+mili1ú2
+familia3ri
+ia5res.
+amili6a
+a3rio
+li5área
+mini1h
+mini1a2
+mini1e2
+mini1i2
+mini1o2
+mini1u2
+mini1á2
+mini1é2
+mini1í2
+mini1ó2
+mini1ú2
+2os.
+2o3so.
+2o3sos.
+2o3sa.
+2o3sas.
+2o3samente.
+mini4a5tur
+multi1h
+multi1a2
+multi1e2
+multi1i2
+multi1o2
+multi1u2
+multi1á2
+multi1é2
+multi1í2
+multi1ó2
+multi1ú2
+miria1h
+miria1a2
+miria1e2
+miria1i2
+miria1o2
+miria1u2
+miria1á2
+miria1é2
+miria1í2
+miria1ó2
+miria1ú2
+mono1h
+mono1a2
+mono1e2
+mono1i2
+mono1o2
+mono1u2
+mono1á2
+mono1é2
+mono1í2
+mono1ó2
+mono1ú2
+2i3co.
+2i3cos.
+2i3ca.
+2i3cas.
+namo1h
+namo1a2
+namo1e2
+namo1i2
+namo1o2
+namo1u2
+namo1á2
+namo1é2
+namo1í2
+namo1ó2
+namo1ú2
+necro1h
+necro1a2
+necro1e2
+necro1i2
+necro1o2
+necro1u2
+necro1á2
+necro1é2
+necro1í2
+necro1ó2
+necro1ú2
+neo1h
+neo1a2
+neo1e2
+neo1i2
+neo1o2
+neo1u2
+neo1á2
+neo1é2
+neo1í2
+neo1ó2
+neo1ú2
+neto1h
+neto1a2
+neto1e2
+neto1i2
+neto1o2
+neto1u2
+neto1á2
+neto1é2
+neto1í2
+neto1ó2
+neto1ú2
+norte1h
+norte1a2
+norte1e2
+norte1i2
+norte1o2
+norte1u2
+norte1á2
+norte1é2
+norte1í2
+norte1ó2
+norte1ú2
+octo1h
+octo1a2
+octo1e2
+octo1i2
+octo1o2
+octo1u2
+octo1á2
+octo1é2
+octo1í2
+octo1ó2
+octo1ú2
+octa1h
+octa1a2
+octa1e2
+octa1i2
+octa1o2
+octa1u2
+octa1á2
+octa1é2
+octa1í2
+octa1ó2
+octa1ú2
+oligo1h
+oligo1a2
+oligo1e2
+oligo1i2
+oligo1o2
+oligo1u2
+oligo1á2
+oligo1é2
+oligo1í2
+oligo1ó2
+oligo1ú2
+omni1h
+omni1a2
+omni1e2
+omni1i2
+omni1o2
+omni1u2
+omni1á2
+omni1é2
+omni1í2
+omni1ó2
+omni1ú2
+i2o.
+i2os.
+paleo1h
+paleo1a2
+paleo1e2
+paleo1i2
+paleo1o2
+paleo1u2
+paleo1á2
+paleo1é2
+paleo1í2
+paleo1ó2
+paleo1ú2
+para1h
+para1a2
+para1e2
+para1i2
+para1o2
+para1u2
+para1á2
+para1é2
+para1í2
+para1ó2
+para1ú2
+para2is.
+aí5so.
+aí5sos.
+penta1h
+penta1a2
+penta1e2
+penta1i2
+penta1o2
+penta1u2
+penta1á2
+penta1é2
+penta1í2
+penta1ó2
+penta1ú2
+piezo1h
+piezo1a2
+piezo1e2
+piezo1i2
+piezo1o2
+piezo1u2
+piezo1á2
+piezo1é2
+piezo1í2
+piezo1ó2
+piezo1ú2
+pluri1h
+pluri1a2
+pluri1e2
+pluri1i2
+pluri1o2
+pluri1u2
+pluri1á2
+pluri1é2
+pluri1í2
+pluri1ó2
+pluri1ú2
+poli1h
+poli1a2
+poli1e2
+poli1i2
+poli1o2
+poli1u2
+poli1á2
+poli1é2
+poli1í2
+poli1ó2
+poli1ú2
+poli4u3r
+poli4o5mie
+poli4arq
+poli4árq
+poli4éste
+poli4andr
+poli4antea
+expoli4
+.pos2t2a2
+.pos2t2e2
+.pos2t2i2
+.pos2t2o2
+.pos2t2u2
+.pos2t2á2
+.pos2t2é2
+.pos2t2í2
+.pos2t2ó2
+.pos2t2ú2
+.pos3tin
+.pos3tín
+pos3ta.
+pos3tas.
+s3te.
+s3tes.
+s3tal.
+s3ta3les.
+s3ti3lla.
+s3ti3llas.
+s3ti3llón.
+s3ti3llones.
+.pos3tó3ni
+.pos3terg
+.pos3te3ri
+.pos3ti3go
+.pos3ti3la
+.pos3ti3ne
+.pos3ti3za
+.pos3ti3zo
+.pos3tu3ra
+s3tor.
+s3tora.
+s3toras.
+s3tores.
+.pos3tu3la
+.pos3tu3lá
+.pos3tu3le
+.pos3tu3lé
+.post3elec
+.post3impr
+.post3ind
+.post3ope
+.post3rev
+.pre2a2
+.pre2e2
+.pre2i2
+.pre2o2
+.pre2u2
+.pre2h2
+.pre2á2
+.pre2é2
+.pre2í2
+.pre2ó2
+.pre2ú2
+pre3elij
+pre3elig
+pre3exis
+pre3emin
+preo3cup
+preo2cúp
+pre3olí
+pre3opin
+.pro2a2
+.pro2e2
+.pro2i2
+.pro2o2
+.pro2u2
+.pro2h2
+.pro2á2
+.pro2é2
+.pro2í2
+.pro2ó2
+.pro2ú2
+proto1h
+proto1a2
+proto1e2
+proto1i2
+proto1o2
+proto1u2
+proto1á2
+proto1é2
+proto1í2
+proto1ó2
+proto1ú2
+radio1h
+radio1a2
+radio1e2
+radio1i2
+radio1o2
+radio1u2
+radio1á2
+radio1é2
+radio1í2
+radio1ó2
+radio1ú2
+ranco1h
+ranco1a2
+ranco1e2
+ranco1i2
+ranco1o2
+ranco1u2
+ranco1á2
+ranco1é2
+ranco1í2
+ranco1ó2
+ranco1ú2
+.re2a2
+.re3e4
+.re2i2
+.re2o2
+.re2u2
+.re2á2
+.re2é2
+.re2í2
+.re2ó2
+.re2ú2
+ea3cio.
+ea3cios.
+ea3cia.
+ea3cias.
+.re3abr
+.re3ábr
+.re3afirm
+.re3afírm
+.re3ajust
+.rea3júst
+.rea3liza
+.rea3lizá
+.rea3líza
+.re3alim
+.rea3lism
+.rea3list
+.re3anim
+.re3aním
+.re3aparec
+.re3ubica
+.re3ubíca
+.reu3mati
+.reu3máti
+.re3unir
+.re3unír
+.re3usar
+.re3usár
+.re3utiliz
+.re3utilíz
+rmano1h
+rmano1a2
+rmano1e2
+rmano1i2
+rmano1o2
+rmano1u2
+rmano1á2
+rmano1é2
+rmano1í2
+rmano1ó2
+rmano1ú2
+retro1h
+retro1a2
+retro1e2
+retro1i2
+retro1o2
+retro1u2
+retro1á2
+retro1é2
+retro1í2
+retro1ó2
+retro1ú2
+romo1h
+romo1a2
+romo1e2
+romo1i2
+romo1o2
+romo1u2
+romo1á2
+romo1é2
+romo1í2
+romo1ó2
+romo1ú2
+sobre1h
+sobre1a2
+sobre1e2
+sobre1i2
+sobre1o2
+sobre1u2
+sobre1á2
+sobre1é2
+sobre1í2
+sobre1ó2
+sobre1ú2
+semi1h
+semi1a2
+semi1e2
+semi1i2
+semi1o2
+semi1u2
+semi1á2
+semi1é2
+semi1í2
+semi1ó2
+semi1ú2
+i2a.
+i2as.
+2ótic
+emi2o2
+seudo1h
+seudo1a2
+seudo1e2
+seudo1i2
+seudo1o2
+seudo1u2
+seudo1á2
+seudo1é2
+seudo1í2
+seudo1ó2
+seudo1ú2
+o2os.
+.so3a4s
+socio1h
+socio1a2
+socio1e2
+socio1i2
+socio1o2
+socio1u2
+socio1á2
+socio1é2
+socio1í2
+socio1ó2
+socio1ú2
+a3rio.
+a3rios.
+3logía
+4ón.
+4ones.
+4i4er.
+4o2ico.
+4o2icos.
+4o2ica.
+4o2icas.
+.su2b2a2
+.su2b2e2
+.su2b2i2
+.su2b2o2
+.su2b2u2
+.su2b2á2
+.su2b2é2
+.su2b2í2
+.su2b2ó2
+.su2b2ú2
+.sub2i3ll
+.sub2i3mien
+.sub3índ
+.sub3ími
+.su4b3ray
+.sub3aflue
+.sub3arr
+.sub3enten
+.sub3estim
+.sub3estím
+.sub3ofici
+.sub3urba
+.sub3alter
+.sub3insp
+.su3bién
+.su3bir
+.su3bam
+.su3bordin
+.su3bordín
+.sub3acuá
+.sub3espe
+.sub3esta
+.su3burbi
+.su4b5rein
+supe2r3r
+supe2r1a2
+supe2r1e2
+supe2r1i2
+supe2r1o2
+supe2r1u2
+supe2r1á2
+supe2r1é2
+supe2r1í2
+supe2r1ó2
+supe2r1ú2
+supe3r4a4r
+supe3r4á4r
+supe3r4á3vit.
+supe3r4á3vits.
+4a3ción.
+4a3ciones.
+4e3rior.
+4e3riores.
+4e3riora.
+4e3rioras.
+4e3riormente.
+4e3rioridad.
+4e3rioridades.
+4e3ra3ble.
+4e3ra3bles.
+4e3ra3blemente.
+pe5r4ante
+perpon5d6r
+supra1h
+supra1a2
+supra1e2
+supra1i2
+supra1o2
+supra1u2
+supra1á2
+supra1é2
+supra1í2
+supra1ó2
+supra1ú2
+sup6ra
+talmo1h
+talmo1a2
+talmo1e2
+talmo1i2
+talmo1o2
+talmo1u2
+talmo1á2
+talmo1é2
+talmo1í2
+talmo1ó2
+talmo1ú2
+tele1h
+tele1a2
+tele1e2
+tele1i2
+tele1o2
+tele1u2
+tele1á2
+tele1é2
+tele1í2
+tele1ó2
+tele1ú2
+4ósteo.
+4ósteos.
+termo1h
+termo1a2
+termo1e2
+termo1i2
+termo1o2
+termo1u2
+termo1á2
+termo1é2
+termo1í2
+termo1ó2
+termo1ú2
+tetra1h
+tetra1a2
+tetra1e2
+tetra1i2
+tetra1o2
+tetra1u2
+tetra1á2
+tetra1é2
+tetra1í2
+tetra1ó2
+tetra1ú2
+topo1h
+topo1a2
+topo1e2
+topo1i2
+topo1o2
+topo1u2
+topo1á2
+topo1é2
+topo1í2
+topo1ó2
+topo1ú2
+tropo1h
+tropo1a2
+tropo1e2
+tropo1i2
+tropo1o2
+tropo1u2
+tropo1á2
+tropo1é2
+tropo1í2
+tropo1ó2
+tropo1ú2
+poi3de.
+poi3des.
+ultra1h
+ultra1a2
+ultra1e2
+ultra1i2
+ultra1o2
+ultra1u2
+ultra1á2
+ultra1é2
+ultra1í2
+ultra1ó2
+ultra1ú2
+xeno1h
+xeno1a2
+xeno1e2
+xeno1i2
+xeno1o2
+xeno1u2
+xeno1á2
+xeno1é2
+xeno1í2
+xeno1ó2
+xeno1ú2
+inter4és
+inter4esar
+inter4in
+inter4ino
+inter4ior
+mili4ar
+mili4ario
+para4íso
+para4ulata
+super4able
+super4ación
+super4ior
+tran4sacc
+trans4ar
+trans4eúnte
+trans4iber
+trans4ición
+trans4ido
+trans4igen
+trans4igir
+trans4istor
+trans4itab
+trans4it
+trans4itorio
+trans4ubsta
+ultra4ísmo
+wa3s4h
+.bi1anual
+.bi1aur
+.bien1and
+.bien1apa
+.bien1ave
+.bien1est
+.bien1int
+.bi1ox
+.bi1ó2x
+.bi1un
+.en1aceit
+.en1aciy
+.en1aguach
+.en1aguaz
+.en1anch
+.en1apa
+.en1arb
+.en1art
+.en2artr
+.en1ej
+.hepta1e
+.intra1o
+.intra1u
+.mal1acon
+.mal1acos
+.mala1e
+.mal1andant
+.mal1andanz
+.mal1est
+.mal1int
+.pa4n1a4meri
+.pa4n1europ
+.pa4n1afri
+.pa4n1ópti
+3p2sic
+3p2siq
+.re3a2eg
+.re3a2q
+.re3a2z
+.re3a2grup
+.re3i2m
+.re3inc
+.re3ing
+.re3ins
+.re3int
+.re3o2b
+.re1oc
+.re1oj
+.re3orga
+.re1unt
+.retro1a
+.su2d1a2fr
+.su2d1a2me
+.su2d1est
+su4d3oes
+.sur1a2me
+.sur1est
+.sur1oes
+.tele1imp
+.tele1obj
+.tra2s1a
+.tra2s1o
+.tra2s2oñ
+.tran2s1alp
+.tran2s1and
+.tran2s1atl
+.tran2s1oce
+.tran2s1ur
+.tri1ó2x} \ No newline at end of file
diff --git a/tex/context/patterns/lang-es.rme b/tex/context/patterns/lang-es.rme
new file mode 100644
index 000000000..eab0c4485
--- /dev/null
+++ b/tex/context/patterns/lang-es.rme
@@ -0,0 +1,25 @@
+% generated by mtxrun --script pattern --convert
+
+% DIVISI'ON DE PALABRAS
+% ~~~~~~~~~~~~~~~~~~~~~
+% hyph-es.tex 4.6
+% This files corresponds to eshyph.tex 4.6.
+%
+% (c) Javier Bezos 1993 1997.
+% (c) Javier Bezos and CervanTeX 2001-2010
+% Some parts, (c) by Francesc Carmona
+% Licence: LPPL
+%
+% For further info, bug reports and comments:
+%
+% http://www.tex-tipografia.com/spanish_hyphen.html
+%
+% I would like to thanks Francesc Carmona for his permission
+% to steal parts of his work without restrictions.
+%
+% 2010-05-18
+%
+% _____________________________________________________________
+% Javier Bezos | http://www.cervantex.es/
+% .............................................................
+% TeX y tipografia | http://www.tex-tipografia.com/
diff --git a/tex/context/patterns/lang-et.hyp b/tex/context/patterns/lang-et.hyp
new file mode 100644
index 000000000..b2f666e16
--- /dev/null
+++ b/tex/context/patterns/lang-et.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-et.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-et.pat b/tex/context/patterns/lang-et.pat
new file mode 100644
index 000000000..e12f9d468
--- /dev/null
+++ b/tex/context/patterns/lang-et.pat
@@ -0,0 +1,3698 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-et.rme
+
+% used: a b d e f g h i j k l m n o p r s t u v z ä õ ö ü š ž
+
+\patterns{
+.aa4
+.aasta5
+.ahe4li
+.al4a
+.al4gas
+.antiik5
+.ap3l
+.ap3r
+.art5r
+.au3a
+.eba3
+.ee4
+.eela4
+.ek3l
+.ek5r
+.gu4a
+.hie5
+.idi4
+.inim5a
+.ise5e
+.is4o
+.ja4e
+.ja4t
+.ka4e
+.ka2o
+.ke5hi
+.kip5r
+.ku4pl
+.ku5sa
+.kusee4
+.la4pl
+.le4e
+.le5hi
+.lemmik5
+.le5se
+.lõpp3
+.ma4a
+.maa5a
+.ma5j
+.mi5sa
+.mo4e
+.nek3
+.ni4p
+.nisu5
+.noa3
+.oa3
+.oo4
+.pap4p
+.pea3a
+.raadio5
+.re4a
+.re2o
+.rep3r
+.re5so
+.rü5hi
+.sak5r
+.sap3r
+.se4a
+.sk4
+.skaa5
+.so5li
+.sp4
+.st4
+.teoo4
+.tet3r
+.tina5
+.toa3
+.ts4
+.tsi4s
+.turba5
+.tus2
+.tu3sa
+.ul4ga
+.ulu4k
+.um2b
+.uu4
+.vaa3l
+.vask3
+.vere3
+.õppe5
+.ää4
+.õõ4
+.öö4
+.ühi4s
+.üle3e
+.ür2
+.üü4
+aaa5l
+a1aas
+4aab
+aa4bi.
+5aadel.
+aadio5a
+a1ae
+a4aer
+aa4fe
+aa4gan
+aa2h
+aa4has
+aa1i
+aai4g
+aa4is
+a5ait
+aa2j
+aa2la
+aa4lae
+aala4r
+aa4las
+aa4leh
+aa4lek
+aa4lel
+aalg4
+aali4ke
+aal3k
+a5allik
+aal3t4
+aa2l3õ
+aa4lü
+aa4mad
+aa4man
+aa4mee
+a5ameer
+aa4mö
+4aan
+aa4nam
+aa4nat
+a5andm
+aan4duu
+aa5ni
+aant4
+aa4pek
+aa4pen
+aa4ra4b
+aa4raf
+aa4raj
+aara4l
+a5arter
+aa2r3õ
+aa4rö
+aa4rü
+aa4sab
+aa4sai
+aa4sar
+aa2se4
+aa4so
+3aas5ta
+a5a4sul
+aa4sut
+aa4sü
+4aat
+aa4taa
+aa4tas
+aa4teh
+5aatom
+aa4tõ
+aa4tüh
+a1au
+aaši5
+a1b
+4a3ba
+a5be
+3abie
+a4bij
+5abs
+a1d
+a4dad
+a4deo
+a2der
+a3di
+adu4r
+adu3se
+a4dö
+a5eali
+ae2d
+3aed.
+2aee
+a3ees
+ae4f
+1aeg.
+ae4ga4j
+ae4gi
+3aegn
+2a1e2h
+4aei
+4aek
+a3eks
+2ael
+a5elani
+ae2le
+ae4lo
+ae4lu.
+4ae2m
+4aen
+ae4pi
+ae2s
+a3esi
+4aett
+a1f
+a4fek
+a1g
+3a4gent
+agia4
+a3go
+5agreg
+agud4
+1a2hi.
+ah4kar
+5ahnu
+4ai.
+ai2a
+5aian
+ai4hu
+ai4ke
+ai4kl
+a3ilm
+ai4lu
+ai4me.
+aimp4
+4ain.
+a5inf
+a5inime
+4ains
+a3inse
+ai4pr
+ai2sa
+5aistin
+aist4r
+ai4va
+a1j
+a3ja.
+a4jale
+5ajalo
+a4jalu
+1a2jam
+4ajo
+ajut4
+a1k
+akaa4s
+a4kaat
+ak4as
+3aken.
+a3ki
+ak4kis
+ak4kr
+a3klas
+ak4lau
+a5klii
+a3krii
+ak3ro
+4aks
+ak4te4l
+a2ku.
+aku4map
+a5kvali
+3alald
+ala4mas
+a4laüh
+ale4le
+al4et
+alet4t
+5algat
+al4ged
+a3li
+ali4san
+a4liste
+5allee.
+al4le4h
+al4luj
+al2lü
+a4lob
+als4
+4alt
+4alu.
+a4lud
+1alun
+alü4h
+a4lüt
+a1m
+4am.
+a5ma.
+a4maad
+3ametn
+amit4
+am4o
+am4pal
+5amper.
+4amü
+2an.
+3analü
+5anatoom
+an4das
+an4deo
+an4dog
+2ane
+a4neh
+a3ni
+a4niso
+4anj
+an4kr
+3anku
+an4nah
+4ano
+anos4
+3ansam
+4anst
+3anten
+5antilo
+ao4d
+ao4he
+a3oht
+ao4j
+ao2le
+ao2lu
+ao2m
+a3oma
+ao4nu
+aoo4p
+ao2pe
+a5opera
+ao2r
+a5oras
+a1osa
+ao4su
+a1ots
+a1p
+a2par
+5aparaa
+a5part
+a3parv
+a3pi
+a3pla
+a3po
+ap4pal
+ap4pin
+ap4pis
+ap3ri
+ap3ron
+a4pru
+a3pä
+4ara
+arak4k
+a4rase
+5areng
+3aretu
+3arhit
+2ari
+ari4al
+ari4ap
+4ark
+ar4kel
+5armast
+5armee.
+a4ro4l
+1arst
+5artikk
+3arua
+3arvam
+5arvestus
+1arvu
+ar4vää
+asa4las
+a4same
+a4sau
+ase4ma
+as5ema.
+1a2sen
+a4seos
+a4sese
+a4sett
+3a4setu
+as4fä
+1a2si.
+asi4ala
+asi3an
+a4sind
+asip4
+5asjan
+askõ4
+as4kõl
+a5slaav
+a4sok
+as3ole
+aso4p
+as4pet
+as3pl
+as2po
+a3spor
+as4san
+ass5t
+4asti
+5astme
+ast4rak
+a4su4b
+a4sud
+asui4
+a4suss
+a5suu
+a1t
+a3ta
+a4taž
+5ateljee
+atii4v
+atmi4k
+5atroo
+at4ros
+at4rus
+at4soo
+ats4p
+at4sü
+att4s
+4atu
+au2a
+aua3l
+au4ba.
+4aud
+au4de.
+a3ui
+4au2j
+au4ke
+aulu3
+aulus4
+au4pü4
+a5urg
+aus4o
+au2su
+a3usul
+1auto
+autoo4
+auto5s
+aut4r
+a1v
+av4a
+a4vans
+a3var
+a4veh
+a1õ2
+a1ö2
+a1ä2
+a1ü2
+až4ni
+4a1š
+5baa
+baa4g
+baa4k
+baa4s
+bab4
+bae4
+bag4
+ba4he
+ba4ju.
+ba3k4r
+bak4s
+bak4v
+bap4l
+bap4r
+ba4rõ
+basa4s
+bas4ko
+bas4pe
+bat4r
+4bb
+2bd
+be3a4
+beb2
+bef4
+beg4
+be4lü4
+be2ra2
+berk4
+bero4
+be4rõ4
+be4si
+be4st
+bes4tis
+bet4r
+4bf
+4bh
+bha4
+bi4ala
+bia4v
+2bi1e
+bi4en
+4binõ
+bi4pla
+bis4a
+bi4si
+bis4k
+2b1j
+2b1k
+2b1l
+bl4e
+blet4
+b2lon
+2bm
+2bn
+4bort
+2bp
+2b1r
+3brig
+bros4
+2bs
+b3so
+2bt4
+4buks
+bu4lõ
+3bum
+buse5
+bu4si4
+bus4kr
+2b3v
+1da
+daa2
+da5ab
+daala4
+da4do
+dae4
+daf4
+d5ain
+da4leh
+da4lum
+da4lus
+5dam
+4dann
+da4num
+dao4
+darat4
+4darb
+dar4de
+4da4re
+4daru
+2darv
+d3arv.
+4dasen
+da4sum
+2d5b2
+2dd
+1de
+dea2
+2deaa
+de5av
+ded4
+2dee.
+dee4le
+4dehe
+dek3l
+dek4s
+5del.
+de4lau
+4de4lek
+4deluv
+de4pr
+dep5ressi
+dere4
+de4rel
+de4rep
+5dero
+deru4
+2df
+2d5g
+2d1h
+1di
+dia4v
+did4
+dig4
+dii4g
+diina4
+dii4sa
+dii4su
+4dilm
+4dini
+di2os
+di4plo
+dis4ai
+di4sar
+di4sas
+dis4pr
+dit4r
+2d1j
+2d3k4
+dkop4
+2d1l
+dle4v
+dlust4
+2d1m
+dmee4
+dmi4k
+2d1n
+1do
+do4h
+doi4r
+2dos
+d3osa
+5dosk
+2d3p4
+2d1r4
+5draama.
+drao4
+3dreen
+d4rel
+d2ren
+3drena
+2d1s4
+dsar4
+2d3t2
+1du
+du4b
+due4
+2d5uks
+d4u2s
+du4s1a
+du4see
+dusk4
+2d1v
+2dõ
+dõ4l
+4dä
+2dül
+dü4li
+4dü4r
+5düü
+4dž
+2d2š
+3dšem
+eaa2
+ea3aj
+e1aas
+ea2b
+e3abi
+e1ae
+ea2hi
+e1ai
+ea2j
+eak4s
+eak4v
+ea2la
+e3ala.
+e1a4lu
+ea2me
+e5amet
+e5ann
+ea4nu
+eao4
+ea2pa
+e1ar
+ea4re
+ea2s
+e4ass
+e5aste
+e5asut
+e3au
+ea2v
+e3ava.
+e1b
+e1d
+ed4a
+e3eali
+e3ees
+ee4fe
+eei4
+eek4r
+ee2la
+3eelar
+e5elekt
+eel5uu
+ee4nai
+ee4nal
+ee4nam
+ee4no
+eent4
+ee4pai
+e5e4pit
+5eepos
+ee4ral
+eer5ap
+ee4ros
+ee4rot
+ee4sin
+e5esine
+ee4s5ist
+5eeskir
+ee4sü
+ee4tõm
+ee4tä
+e1f
+e1g
+egaa4
+egas4t
+e4goi
+4eha
+e2he.
+e2hi
+e3hin
+5ehist
+1e4hit
+5ehiti
+eh4ta4
+4ehä
+ei4dul
+ei4e
+eie5ri
+ei2ga
+e3iga.
+ei4ha
+ei4he
+e3ilm
+ei2lu
+ei4mem
+5eine.
+ei4roo
+e5i4sa.
+ei4sist
+ei4tau
+ei4tõ
+ei4va.
+e3j
+e3ka
+e4kahi
+e3ke
+ek4kap
+ek2l
+ek4lo
+e3k4o
+ek3re
+e3krii
+4eks.
+5eksam.
+3eksem
+eksi3k
+3ekska
+eksp3r
+5ekstr
+ek4tül
+e3kü
+elaa4v
+e4lagr
+e2lam
+3elamu
+el4an
+5elanik
+eleis4
+e4leks
+5elektro
+3eleme
+5elevaato
+e3li
+e4lid
+elii4t
+el4kus
+e4l4ob
+elo4p
+els4t
+elt2r
+el4tü
+e2lu
+1elu.
+e5lub
+elu5i4
+1e4lun
+e3lus.
+e4luss
+el5uss.
+el4üh
+e1m
+5emand.
+e5mat
+emne3
+emos4
+emp4r
+5emuls
+endus3
+5enelas
+e5nem
+3energ
+e4nese
+e4nesl
+enk5l
+enk4r
+en4sal
+en4tos
+en4tü
+eo5a
+eo4ja
+e3o4le
+eo2lu
+eo2ma
+eoo4p
+eo5pl
+e3osa.
+e3osak
+e5osali
+e5osav
+eos4f
+e3ots.
+e1p
+e3pl
+e4pli
+ep4lu
+e1r
+e3raa
+5erakon
+5erald
+e4rao
+erei2
+erek4
+5ergut
+erih4
+eri4uu
+er4nau
+e4ro4r
+erp4
+er2pr
+ers4k
+er4taa
+er4tak
+er4tes
+e4rud
+es1an
+1e2se.
+e5sek
+e5sen
+e5sil
+eska4j
+eska4s
+eske4
+es5kel
+esk3l
+esk3r
+es2k5ö
+es4laa
+es3ole
+es4or
+es2po
+e3spor
+es4sist
+4est
+es4tü
+e3su
+esup4
+e1t
+e3t4a
+e2ten
+5etendus.
+etii4s
+et2ra
+et4sin
+et4soo
+et4sü
+et4taj
+1ette
+et4tru
+et4tä
+et4tü
+4etu
+e4tõ4d
+e4tüm
+eu4de
+e3u2j
+e3u2l
+e5u2n
+eu4p
+eu4s
+e5usk
+e3uu
+e1v
+e3v4a
+e1õ2
+e3ö4
+e1ä2
+e1ü4
+e1š
+5faa
+faa4n
+4fa4d
+2ff
+1fi
+fii4t
+4fj
+4fk
+2f1l
+f2lo
+5floora
+2f1n
+1fo
+folk5
+fo4ro
+2f1r
+f2re
+3frees
+2fs
+2f1t
+ftat4
+3fu
+3gaa
+gaa4r
+4gaast
+4gab
+4gaed
+gag4
+2gah
+ga2hi
+gai4g
+ga5is
+ga3k4
+5gam
+ga3o
+ga3p
+4gart
+4garv
+g4as
+4ga4suk
+5gata
+gat4r
+gau4
+ga4va.
+ga4van
+2g3b
+2gd4
+gea4
+ge4du.
+gek4
+ge5kl
+4gekse
+ge4lah
+gela4s
+ge4leh
+ge3lu
+ge4lä
+ge4nan
+geok4
+ge4or
+4geos
+4gerg
+ge4rus
+4gf
+4gg
+2g1h
+gi2aj
+gii4s
+gi3k
+4ginf
+4gint
+gio4r
+gi3pl
+gi4san
+gi4sil
+gi4sö
+git4r
+gi4vaj
+2g1j
+2g1k
+2g1l
+g4lüt
+2g1m
+2g1n
+gne4ta
+gne4te4
+4goh
+go4le
+go4ma
+go4po
+2g1p4
+2g1r
+g2ran
+5granaa
+3g2rav
+g2ru
+3grup
+4g1s4
+2g1t2
+g3tr
+3gu
+gub4
+gue4
+gu5i
+gu4nel
+gu3o
+gup4
+gu4sen
+gu4sä
+guu4j
+2g1v
+2g3õ4
+4gä
+gü4l
+3ha
+haa4ri
+haa4s
+hal4lai
+5har
+hasa4
+hat4r
+1he
+hee4m
+hee4s
+hei4s
+hek4v
+2hel.
+hels4
+het4r
+4h1h
+hhe4l
+1hi
+hia2
+hii4s
+5hil
+5him
+hio2
+hi4san
+hi4sar
+hise4l
+hi4st4
+hi4sü
+5hits
+h1j
+hjaa4
+4hk
+h4kal
+h4kas
+h4kis
+hk3l
+h4ko4
+hk3r
+hks4
+hkt4
+h4kusk
+h4ku4su
+h4kõ
+h4kä
+h1l
+hle4n
+4h1m
+h4mo4
+h4mü
+h1n
+hnika5
+1ho
+hom4o
+4hp4
+hrs4
+4ht
+h2ta
+hta2j
+h5tak
+hta4l
+ht5ar
+hta4su
+h4teg
+hte4n
+hte4r
+h4tid
+h4to
+h4tr
+ht5s4
+h4tö
+h4tä
+1hu
+hu3a
+hue4
+hui4d
+huk4l
+hup4
+hu3sa
+2h1v
+hvad4
+hvast4
+hve4l
+h4vini
+h4vo
+hvu4s
+1hõ
+3hö
+1hä
+3hü
+4ia
+iaa2
+iaa4l
+ia5alane
+i3aast
+i5a4bi
+ia4bo
+i1ae
+ia2g
+ia2h
+i3aine
+i1a2j
+ia4kr
+i3akt
+i1a2la
+i5alb
+i3alli
+i1a2lu
+ia2me
+i5amet.
+ia2na
+i5andj
+i5andm
+ia4ne
+i5anne
+ia2p4
+i3apar
+ia5pr
+ia2re
+i3arm
+ia4ru
+i1arv
+ia2s
+ias4ke
+i5aste.
+i3asu
+ia4tel
+iat4r
+i1au
+iau4l
+i5a4vaj
+i5avald
+i1b
+i4bad
+i4bau
+i1d
+5ideaa
+idii4
+idlu4
+ie2
+i3eali
+i1eel
+iei4
+i1eks
+i5elani
+i1elu
+i3eos
+ie4ri
+iers4
+i3esi
+ie5so
+i5ess
+ie4st
+i3eten
+ietu4s
+i1f
+i1g
+i4ga4g
+i5gar
+5igatsu
+i4gav
+ig4ram
+ih4le
+ih4te
+ih4tin
+ii4a
+ii4deo
+ii4du.
+iie3
+ii4es
+ii4gaa
+ii4ga4s
+ii4ha
+iika4
+ii4kis
+iik4ro
+iiks4t
+iikt4
+ii4lab
+ii4lad
+ii4lae
+ii4last
+ii4leh
+ii4lel
+ii4les
+ii2lõ4
+ii4lü
+ii4mai
+iimat4
+ii4met
+ii4nai
+ii4nau
+i5inde
+i5inf
+ii3ni
+i5inimen
+iinit4
+iink4
+iino4
+ii4nol
+ii4nos
+ii4nõ
+ii4pr
+ii4ran
+ii4rau
+iirs4
+ii4rü
+ii4san
+iise4l
+ii4sev
+ii4sik.
+ii2ta
+ii4teh
+iito4
+ii4tom
+ii4tos
+iit5re
+ii4tõ
+ii4tü
+ii4ves
+ii4vet
+ii2vo
+i1j
+i1k
+i4kalu
+i4ka4re
+i4kark
+i4kaut
+i4k5elu
+ike4si
+i3klaa
+i3klas
+ik4ler
+i5klub
+ikop4
+ikos4
+i4kov
+i3kre
+ik3ro
+ik4sar
+iks4k
+iks4po
+ik3t2r
+i3ku
+iku3a
+il4a
+ila4s
+i4lasi
+ilia4
+i4lisi
+il4kan
+il4kõ
+ille5s
+illo4
+5ilme.
+il4mot
+3ilmut
+ilo5g2
+ilp3l
+il4ti
+i5lun
+ilu3sa
+5ilustu
+ilü4h
+i1m
+i4melu
+imi4g
+imisu4
+i4mo4l
+5imper
+i1n
+ind3al
+5indeks
+inde4r
+ind4re
+2ine
+inee4s
+i4neh
+i4neks
+ini4kü
+i2nim
+ini4mas
+i4nime
+5inimene
+5iniml
+i4nini
+inna5a
+inni4si
+3insen
+1insp
+1inst
+3inven
+io4de
+io4h
+i3oht
+i5ohv
+io4j
+i5oks.
+io2le
+i3olek
+io2lu
+i5oluk
+io4lü
+io2ma
+i5oman
+ioo4da
+ioo4ne
+iooni3
+io2p
+i3oper
+i5ork
+i1osa
+ios4f
+ios4p
+ios4t
+iost4r
+io4su
+i3ots.
+i3otsi
+io4tü
+i1p
+i3pla
+ip4lu
+ip4ro
+ip4sas
+ipse4
+ip4sep
+ip4sus
+i4ra4b
+i4rase
+ir4dis
+ir4nõ
+i2rui
+iruu4
+isaa4v
+isa4ja
+i4sana
+isa4re
+i4sarh
+i4selo
+i3sem
+iset4s
+isi4g
+i2so
+3isola
+i5soli
+is5oma
+iso4r
+i3sot
+i3s4pek
+is3pl
+i3s4por
+is3sp
+5istand
+i5s4tiil
+5istme
+ist4ru
+ist4se
+i5stsee
+5istutu
+i3su
+i4sõm
+i2sü4l
+isü4r
+2it
+itaa2
+itee4l
+it4rak
+it4ras
+it2ru4
+its3k
+it4so
+itte1
+itt4s
+iu4b
+iu2da
+iu4gi
+iu2j
+i3uju
+iu4la
+iu4mar
+iu4me4
+iu2mo
+iu4ni
+iu4pu
+iu5sa
+i5uss.
+iu2su
+iuti4
+i3uu
+i1v
+i4vad
+i4vakt
+i4va4lus
+i4vant
+i4vau
+i4veh
+ive4l
+iviil5
+i4vü
+i1õ2
+i1ä4
+i1ü2
+i1ž
+j4a
+3jaa
+ja1aj
+jaa4l
+jaa4r
+jaa4s
+jab4
+jad4
+ja5el
+jae4r
+jag4
+ja3i2
+ja5kra
+5jama
+5jame
+jao4h
+ja3p4
+jas4ke
+jas4tii
+jat4r
+jat4su
+jau4b
+jau4l
+je3lu
+3jo
+joo4k
+jue4
+5juma
+ju4sei
+juse4l
+5jõ
+5jä
+1ka
+kaa4da
+kaa3de
+ka5aj
+ka4al
+kaa4ra
+kaa4sis
+kaa4ta
+4kader
+4kaed
+4kaeg
+kae3lu
+kag4
+kahe5i
+4kaia
+2kain
+ka5ist
+kaitse5
+ka4jav
+ka4ju.
+k5a4lus
+ka4pl
+ka2pr
+4karm
+4kaset
+k5asj
+kat4r
+2k3b
+2kd4
+1k2e
+ke4el
+kee3lu
+2kehi
+4keks
+ke4laj
+ke4lak
+ke4lok
+4kemb
+2ken.
+5kene
+keo2
+kes2k
+kesk3a4
+ket5ra
+ket4te4
+2kf4
+4kg
+2k1h4
+1ki
+kie4
+kik4r
+4kinf
+kio4
+ki4pr
+kis4a
+ki4san
+ki4sik
+4kiste
+kit4r
+kiu4d
+kiu3su
+2k1j
+4k1k
+k3kra
+kks4
+kku4ro
+2k1l4
+k2la
+k3la.
+3klaas
+k3lai
+3k4lamb
+k3lan
+3klapp
+5klassi
+k3lat
+5klaver
+kle4a
+k4lee
+k2lei
+3kleit
+k3lem
+k4lib
+5klibu
+klig4
+k2lii
+3kliim
+5kliiste
+k3lik
+k3lin
+k4link
+k2lo
+k3loom
+3klots
+k2lub
+k3lus.
+klu4sa
+klu4sõ
+k4lut
+2k1m
+2k1n
+knaa4
+k4nip
+1ko
+2koks
+k4ol
+ko4len
+koo4sa
+4ko4rie
+4korpi
+k5osa.
+ko4va
+2k3p4
+2k2r
+k4raan
+5kraana
+3kraav
+3krab
+3k4rae
+k3rai
+3kramp
+4kran
+k3rau
+5kredii
+3k4reem
+4kreg
+5k4res
+k5ret
+4krip
+5kristal
+k4roh
+3krohv
+k4rook
+k3rut
+3kruu
+3kruvi
+4k3rü
+4k1s
+k5sae
+k4sai
+ksek4
+ksi2k
+ksika4
+ksit4
+ksk4l
+ks5kõ
+ksp5lo
+ks2pr
+kst3r
+ks4tü
+2kt
+kt2ra
+1ku
+kui4s
+4kujuj
+4kujum
+kuk3la
+4kuks
+kul2d
+2kulp
+kumi4su4
+kummi5
+3kus
+ku4siv
+kut4r
+kuu4ni
+kuuse5
+4kuž
+2k1v
+k4van
+3kvart
+5kviitu
+1kõ
+kõ4de.
+2kõi
+k5õis
+4kõp
+1kö
+4köd
+1kä
+käi5s
+2käk
+4käm
+1kü
+2kühe
+4küle
+4küll.
+2kž4
+4kš
+1la
+5laag
+la4aj
+laa2r
+laar5a
+laa4sa
+2laav
+5laava
+4ladj
+5ladu
+lae4r
+3laev
+4lahv
+lai5ek5
+lai4ga
+la4jap
+la4jav
+la3k4r
+lak4v
+la4la.
+4lald
+la4les
+4lals
+la4lus
+3lama
+3lamp
+4lams
+la4nes
+2lani
+lap4l
+4l1arv
+4larü
+la4sas
+4lasb
+la4sei
+la4sem
+4lasen
+l2asi
+4la4sut
+3lau
+5laud
+lau4n
+lau5su
+4lavh
+2l1b
+l4bau
+lb4lo
+4l1d
+l4dala
+l5dist
+l4don
+l4dü
+1le
+le1a2
+3lee
+leek5l
+lee4le
+leep5r
+le3hi
+4lehit
+5leht
+3lej
+4lekk
+5leks.
+4lektr
+lektri5
+4lele
+le4lek
+5lema.
+le4mor
+lenaa4
+leo2
+le3oh
+le5olu
+le4pl
+le2s
+4lese.
+le3sõ
+3let
+4lette
+4l1f
+lfoo4
+lf4t
+l1g
+l4gae
+l4gai
+l4gall
+l4gann
+l4gase
+lgas4k
+l4ge4le
+l4gi4d
+l2go
+l4gu4j
+2l1h
+1li
+li4ala
+li5am
+lia4v
+3lid
+li4dan
+li4ga.
+4liia
+liie4
+5liig
+lii4na
+5lik.
+likai4
+li3kla
+lik4ro
+4lilm
+4li4lus
+limi4s
+4linf
+4linim
+4lins
+lin4te
+4linv
+lio4k
+li3p4l
+li4sah
+li4sik
+4lisol
+li4suj
+li4sõl
+li4sö
+lit4r
+li5tu
+2liže
+2l1j
+lja1a
+lja5os
+2l1k
+lkk4
+l4kli
+lk4lu
+l3kr
+2l1l
+l5ler
+lli3tr
+l2lor
+l4lots
+llp4
+lls4
+llt4
+l3lu
+l4lää
+2l1m
+lmaa4v
+lmat4
+l4mau
+l4meks
+lmp4
+2l1n
+1lo
+lod4r
+lof4
+lo4gal
+4loha
+4lohv
+5loi
+lok4r
+2lo2l
+l1ole
+l3olij
+3lolo
+lo4man
+5loog
+loo4ram
+4lord
+4lorn
+2losa
+l3osa.
+2l1p
+l3plaa
+lp4le
+l4puk
+2l1r
+lrih4
+2l1s
+ls4ka
+lske4
+ls4o
+lste4
+2lt
+l4tau
+lti4l
+l4tok
+lt4sel
+lt4sis
+l4tuk
+l4tõm
+l4tää
+l4tüt
+1lu
+3lua
+lu3al
+lud4
+lue4
+3lug4
+4luhk
+4luim
+lu4juk
+4luk.
+3lukk
+2lun
+lu4nin
+lu4nio
+luo3r
+lu4rau
+lu4see
+lus4tii
+lu4sum
+lu4sö
+3luta
+lut4r
+3luu
+2l1v
+lvel4
+1lõ
+4lõd
+4lõie
+5lõik
+4lõis
+4lõit
+lõ4l
+lõ3pe
+lõp2p
+1lö
+4löe
+1lä
+4län
+län4gi
+lääne5
+1lü
+lü3h
+lü4ma
+1ma
+3maa
+maa2b4
+ma3abi
+maa3la
+maa3p
+ma4bi
+ma1e2
+mag4l
+5mahl
+4mahv
+4majam
+4ma4ju.
+ma3kl
+mak4v
+3mal
+ma4la.
+mal4ma
+ma4om
+ma3pl
+4mart
+4marv
+ma5se
+ma5sin
+ma4st
+4ma4sul
+ma4sä
+4maut
+2m1b
+mbat4
+mbe2r3
+mblu4
+mbo4j
+mb5usa
+2md4
+1me
+me1a4
+me4an
+3mee
+mee5la
+mee4s
+me3hi
+4mekv
+mers4
+mert4
+me5s4o
+m4et
+4met.
+4metl
+2metn
+met4se
+4mett
+me5u4
+2m1f
+4mg4
+2m1h
+1mi
+mia4m
+mia4r
+4mide
+mi4kaj
+mi4nah
+4minf
+mi3ni
+mip4
+mi2s
+mis1a2
+mi3si
+mi4sig
+mi4sih
+4mi4sik
+mi4sil
+mis3k4
+mis4tii
+mist4r
+mis3ts
+mitte3
+2m1j
+2m3k4
+2m1l
+2m1m
+m4maat
+mma4s
+mm4e
+mme4r
+mmika4
+mmi4kal
+m4mor
+2m1n4
+1mo
+4moh
+mo4ha
+m3oks
+4morg
+4morn
+mo3sa
+2mp
+mpa4l
+m4pap
+mp3l
+mp3r
+2m1r
+mruu4
+2m1s
+ms4o
+ms4p
+2m1t2
+m5ts
+1mu
+mua4
+mu5ah
+mud4
+mue4
+mui4m
+4muls
+mup4
+5mus
+mut4ra
+2m1v
+mõ4d
+4mõig
+4mõp
+3mö
+4mök
+3mä
+4mäk
+mär4gel
+3mü
+4müh
+4mž
+1na
+n4aa
+na5ah
+naa4lu
+naa4r5a
+nad4
+na5ei
+nag4l
+nah4ke
+nai4d
+nai4si
+na4kru
+2nal4ü
+4na4mer
+na4mii
+n5amiid
+nants5a
+na3o4
+nap4l
+na4ret
+4narv
+n4as
+4nasb
+nass4
+nat4ra
+nau4b
+4nb4
+4n1d
+n4daas
+n4dab
+n4dae
+nda4ko
+nda4l
+n4dau
+ndif4
+ndip4
+n4do4r
+n4duj
+ndu4sõ
+n4dü
+1ne
+5ne.
+nea2
+nee3la
+nee4le
+nee3lu
+nei4v
+ne4lah
+4nelas
+ne4lek
+neo4d
+ne4pl
+2nerg
+n4es
+ne4tan
+ne4tõm
+2n1f
+2n1g
+n4gai
+n4gall
+n4gase
+n4gau
+ng4lü
+n4go4r
+ng3r
+ngud4
+ngus4t
+n2gü
+2n1h
+1ni
+ni3ap
+nia4v
+nig4
+nii4g
+nii4tu
+nikkel5
+4nilm
+5nima
+nima4s
+5nimet
+3nimi
+ni4mig
+4niml
+4nint
+ni4sid
+nis4ke
+4nisl
+2n1j
+2nk
+n4ka4n
+nk3r
+nk4se
+nkst4
+2n1l4
+2n1m
+2n1n
+nna3e
+nna5i
+nnak4r
+n4ne4f
+nnio4
+nnk4
+1no
+4nob
+nod4
+4noks
+noo4na
+n4or
+2n3p4
+2n1r
+2ns
+n4salp
+ns4e
+nsk5r
+n3so
+nso4r
+nste4
+ns4tee
+ns4tem
+nstis4
+nst3r
+ns4tu
+nsu4s
+2nt
+ntaa4r
+n4teh
+nte4l
+ntig4
+n4tiso
+n4tots
+n4tr
+nt3ra
+nt3re
+nt4sab
+nt4sal
+nt4san
+nt4sar
+nt5sü
+ntt4
+n4tüh
+n4tük
+1nu
+nu4da
+nui4g
+nur2k
+nus4p
+2n1v
+1nõ
+nõ4l
+4nõli
+1nö
+1nä
+1nü
+4nül
+4nž
+4nš
+oa2
+oa4a
+o1ae
+o5aku
+o3anal
+o5apa
+oau4b
+o1b
+oba4s
+1obj
+4o1d
+odaa4
+odaal3
+o4deh
+odu4sõ
+od4š
+oe5a4
+oe4fe
+oe2l
+o3ele
+oe4mi
+oe4mu
+o4eo
+oe4rah
+oe4rõ
+oe4si
+oet4r
+o1f
+of5r
+o1g
+og4la
+og4li
+3ohaka
+oh5to
+5ohvits
+oi2ta
+oiu5a
+o1j
+oju2s
+okast4
+okku5
+ok3la
+ok5liin
+okoos4
+ok3r
+ok4re
+ok4ri
+o5kris
+ok4ru
+o3la
+o4lae
+olag4
+ola4las
+ola4su
+ol4do
+ole4an
+3olek.
+o4lend
+olig4
+o3lii
+olii4g
+o4li4lu
+o3lis
+4olj
+ol4lae
+ollis4
+ol4lü
+ol4mai
+4o3lo
+ol4tam
+ol4tar
+1olu.
+5olukor
+o4luks
+olõ4
+o4lä
+3omadu
+om4baj
+om4ban
+o4mok
+ona4a
+o4naj
+ona4ko
+o4neh
+o4nele
+on4gos
+onit4r
+oniu4
+onsoo4
+ont4re
+o4nuu
+2o2o
+oo1a
+oo4kal
+ook4r
+oo4kää
+oo4lau
+oo4lee
+oo4lig
+oo4list
+oo4log
+oo4lõ
+oo4lü
+oo4nah
+oo4nar
+oo4nau
+oon4dee
+oonk4
+oono4
+oo4noh
+oons4
+oon5t4
+o5opti
+oo4rat
+oo4ree
+oo3sa
+oo4sel
+oo4tõ
+o3pa
+op5last.
+op4lu
+op3ra
+op3ri
+o2r3ai
+o4ralg
+ora4mii
+o4rana
+5orav
+3order
+1org
+org4r
+oria4
+3orju
+5orkeste
+3orna
+or4nel
+or4tal
+ort3r
+oru4s
+or4võ
+o2sa
+o4sake
+3osako
+4o3sau
+4ose
+o4seks
+4osf
+o2si.
+4osin
+3oskus
+4osl
+4oso
+o4sok
+os1ol
+os4pa
+4oss
+os4saj
+os4sü
+os5taas
+os4tem
+4osto
+ost4ru
+5osuti
+4osõ
+oto5a
+otok4
+ot2ra
+o3tran
+3otsa
+o5tsö
+ot4ta
+ot4teo
+otus4ta
+otü4l
+ou4b
+ou4n
+o1v
+ovaa4l
+ovio4
+ovol4
+o4vu4n
+o3õ4
+oü2
+1pa
+paa4ka
+pa3a2m
+paa4tel
+pa4e
+pa4lus
+pans4
+pa4pr
+5paras
+3park
+4parta
+pa4sp
+4pb
+4pd
+1pe
+pe2a
+pea5j
+peas4
+pe4au
+pea3v
+pe4f
+4pektr
+pela4
+4pe4lev
+pel4t
+pe4lü4
+p4em
+pe4ol
+5perd
+pe4tap
+peti4k
+2pf4
+pg4
+2ph
+1pi
+pii4v
+pik5r
+pin2d
+pin4gis
+pip3r
+pis5ta
+piu4g
+2p1j
+2p1k
+2p2l4
+4pla.
+p4laa
+p5laasi
+3plaat
+p4lak
+p3lam
+p5lane.
+3plasm
+5plastik
+plek2
+3plekk
+4p3lem
+p3li
+5pliia
+pliig4
+3plok
+p3lom
+p3lu
+3pluus
+4plõ
+2p1m
+2p1n
+p4neu
+1p4o
+5po4e
+3pon
+3poo
+poo4la
+poola4v
+pordi5
+4p1p
+ppa4k
+p4pas
+ppe3a
+ppee4
+pp3l
+p2p3r
+pps4
+p4pud
+p4põ
+p4pü
+p2r4
+2pra
+3praa
+3prag
+3prakt
+p5rau
+p4rep
+p4resi
+4prib
+2prii
+p5riit
+p4rog
+p4roo
+4p4ros
+3p4rot
+4prum
+5pruu
+2p1s
+ps4a
+p4sor
+3p2sü
+2p1t
+p4tak
+3pu
+pua4
+pu4da
+puha4
+pui4t
+puk4k
+pul4ti
+4purt
+pus4p
+2p1v
+3põ
+põhi3
+p4õi
+põi4s
+põli4
+5pö
+1pä
+pär4gu
+4päs
+3pü
+pü3he
+4pž
+4pš
+1ra
+raal3a
+4raale
+5raalne
+raa4lu
+raamatu5
+raa4ta4
+4raatt
+raa4tu
+4raav
+5raaš
+raie3
+2rain
+r3aine
+rai4si
+r5a4la.
+ral4t
+ra4lus
+3rame
+ran4dem
+ra3om
+4rapa
+ra4pl
+4rapt
+4rarb
+ra4ren
+4rars
+2rarv
+ra4sal
+4rasen
+ra4sis
+rast4r
+ra4suk
+ra4sul
+ra4sut
+5ratas
+ratiiv5a
+rat4sen
+raua3
+rau2d
+raud5o
+2rauk
+4raum
+4raur
+rau4te
+5ravi
+2r1b
+r4bae
+4r1d
+r4dae
+r2dar
+rde3a
+rd4re
+r4duj
+r4dü
+1re
+5re.
+5rea
+reb2
+ree4le
+ree4ma.
+ree4man
+3reer
+3reet
+5reg
+2rehi
+rei4se
+rek3l
+4reks
+re4lai
+re4liit
+5relv
+re4mää
+4repp
+re2pr
+rep3re
+re4sin
+re3te
+ret4k
+re4tr
+ret5s
+2r1f
+rf4r
+2r1g
+r4gae
+rg3ah
+rga4re
+r4geh
+rgi4me
+r5g2ra
+2r1h
+1ri
+3ria
+ri3am
+ri5ast
+5rid
+2rig
+ri4ga.
+3rige
+rig4r
+2riib
+5riie
+4riinu
+ri4kis
+ri3k4r
+4rilm
+3rim
+ri5oks
+rio4r
+3rip
+rip4li
+4rip2p
+4ri4sa.
+ri4sah
+ri4sar
+ri4ses
+4risol
+ri4tol
+ri3t2r
+5riu
+5riv
+4riö
+2r1j
+2r1k
+r4kad
+rk5ain
+rka4se
+r4kek
+rkt4
+2r1l
+2r1m
+r4mald
+r4me4le
+r4mig
+rmo4ra
+rmo4s
+rmp4
+rms4
+2r1n
+r4nad
+r4neh
+rnk4
+1ro
+roa4
+ro3e2
+rok4k
+rol4la
+rol4le
+4romb
+2romi
+ro4nop
+roo4ga
+4rosa
+ros4po
+ro5staati
+rost4r
+4rož
+2r1p
+rp5ret
+2r1r
+r3ri
+2rs
+rsaa4l
+rs4l
+rs4o
+r5s2po
+rs4tak
+2rt
+r4tah
+r4tos
+rt2r
+rt4ra
+r4tri
+rt5roo
+rt4sai
+1ru
+2rua4
+rud4
+r4uj
+ru3kr
+3ruma
+4rumb
+2rumm
+4rump
+5rus.
+ru4set
+ru4sin
+ru4sul
+rut4r
+ruum5a
+4ruur
+2r1v
+rva4la
+rva4lu
+r4vann
+rvas5k
+rvis4k
+r4voh
+r4vok
+1rõ
+2rõ2l
+r5õli
+rõn4gu
+4rõr
+3rö
+4rök
+röö4pe
+rööp5l
+1rä
+4rä4r
+1rü
+4rük
+4rüm
+4rü4r
+4rž
+4rš
+1sa
+3s2aa
+saa5j
+saa4lu
+sa4an
+4s3aas
+3saba
+sa4bi.
+4sabo
+s4ad
+5sada
+4sade
+s5ader
+2s1ae
+sae4l
+5sa5ga
+s4age
+sa4gu
+4sahv
+3sai.
+4saia
+s1ain
+s4ajan
+sa4ju.
+sak4ro
+5saks
+4saku.
+sa4kää
+4s3a4la.
+4salas
+s4alat
+5salat.
+sa4lev
+4salla
+4sallu
+3salt
+sa4lum
+5salv
+3s4am
+4samp
+4sank
+4s5ann
+s4ant
+4santi
+s4anu
+sa4num
+sa2pr
+sa4ris
+s4arv.
+sar4va
+sase4
+3sasti
+sas4tii
+sa4suk
+sa4sum
+3sat
+4satl
+s5avald
+2s3b2
+2s3d2
+1se
+3sead
+se3ala
+s5eali
+se5aval
+se4du.
+4seela
+see4le
+s5eeln
+see4ma
+4seepi
+3seer
+see4si
+see4ta4
+4se4fe
+5seg
+sega5a
+2seh
+3seha
+3seho
+5sehu
+5sehä
+3sei
+sei4d
+sei4si
+3seka
+se3kl
+4s5eksp
+se4laj
+4selek
+5seli
+4sellu
+3selt
+2selu
+4sens
+se5oh
+seo4k
+se5om
+seo4p
+seo4r
+3sep
+sepat4
+4serem
+4sese.
+se4si.
+4se4sin
+s5esit
+ses4k
+3sest
+4s5eten
+se3t2r
+4sette
+2s1f2
+2s1g2
+2s1h
+1si
+3sia
+sia4h
+sie4
+5sign
+sig4ra
+s5i4ha.
+sii4g
+sii4sa
+sii4se
+4siits
+sii4tu
+si4ket
+siko4d
+siks4p
+sikt4
+sik4vi
+4sinim
+s5inime
+4sins
+sio4le
+si4pro
+4sirr
+5siru
+4si4sa.
+si3se
+s5i4sik
+sis2p
+sisse3
+s5istuj
+5sisu
+2s1j
+sja5ar
+2s1k
+4ska
+5skaa5la
+ska4no
+5skeem.
+s4kela
+5skelet
+s5ken
+ski4g
+sk2l
+s5klas
+5skler
+skuk4
+3skulp
+sku4si
+2s1l
+4s1m
+sma4sa
+2s1n
+sne4p
+1so
+3sobi
+3soe
+s1oht
+3soi
+s5oks.
+2so2l
+s3olek
+s3olij
+5solo
+so3lut
+so2ma
+3son
+3soo
+soo5o
+4so4pe
+so4pr
+5sor.
+s3orj
+3sort
+2s1os
+4sotsu
+2s1p
+s5per
+2s1r
+2s1s
+ssel4l
+ss2fä
+ssin4
+s4sinf
+ssk4
+ss4ke
+ss2p
+s5spor
+ss2t
+s5stat
+ss4ti
+sst5r
+s4suss
+2s1t
+s2taa
+3staad
+5staaš
+s4tain
+4stam
+5standard
+3start
+s4tati
+5statis
+s4teno
+5stepp
+stet4
+s4toh
+s4top
+s4tot
+5streik
+5strek
+5struktu
+st4so
+stt4
+stu2s
+stu4s5a
+3stuud
+stä4
+s4tär
+s4tüh
+1su
+sua2
+su4bar
+sud4r
+su4du
+su5e
+su4jul
+4suks
+s5uks.
+5sulg
+sul4ga
+sun4de4
+su4nis
+supe4
+supe5s
+su4pr
+4surb
+5sus.
+sus4aa
+su4ses
+s5uss.
+sus4ti
+su4sun
+sut4r
+sut4ü
+4suug
+suu4ra
+suusa3
+2s1v
+svus4t
+1sõ
+5sõda
+sõ4de
+4s3õh
+3sõid
+4sõie
+2s1õig
+2s5õis
+3sõit
+sõ2l
+2s3õli
+3sõlm
+3sõn
+2s1õp
+5sõr
+sõsa4
+2s3õu
+1sö
+4söd
+sö2k
+2sön
+1sä
+4säk
+4säm
+1sü
+4süa
+5süd
+5süg
+2süh
+s3ühi
+2sük
+s3üks
+sü4la
+sül5di
+sü3lem
+4sülo
+sü4ra
+3süs
+3süü
+4sž
+1ta
+3ta.
+3taat.
+2tabi
+4t3aed
+t3aine
+4tais
+4ta4ko
+t2al
+4ta4laj
+ta4lev
+tal4las
+ta3lu
+ta4lus
+3tam
+5tama
+4tanda
+ta4ot
+ta4pla
+ta4pr
+4ta4ret
+4tarm
+2tart
+ta4se4r
+ta4ses
+ta4set
+ta4sis
+ta4sü
+2taut
+3tav
+ta4vaj
+2t1b4
+2td2
+1t2e
+te4aa
+tea4g
+tea4h
+te3an
+te5as
+3tee
+tee5lu
+te4et
+te3hi
+tehi4s
+te3kl
+tek4r
+tek4v
+tel4ke
+te4lok
+te3lu.
+4tepiv
+tep4l
+2tepp
+3ter
+5ter.
+te5r4a
+terd4
+4terg
+ters4
+tes4a
+te4sin
+tes4k
+2t1f
+4t1g4
+2t1h
+thõl4
+3ti
+tia2
+ti3e
+tii2k
+tii4ma
+tii4sa
+tii4ve
+tik4o
+ti3k4r
+tik4vi
+4tilm
+5tima
+4tinf
+tin4ga
+ti4sai
+tisa4v
+ti4sik
+titee4
+2t1j
+2t1k2
+t3kl
+t3kr
+2t1l4
+tlu4
+2t1m
+tmika4
+tmis3
+2t1n
+3t2o
+4to4da
+toen4
+tog6
+4toks.
+toksi5k
+to4lek
+to4lu.
+to4lum
+tonis4
+to4o
+too4no
+too4pe
+to4rau
+tos4p
+tost4
+2t3p4
+2t1r
+t4rad
+t2raf
+3trafo
+t4rahh
+5trall
+t2ran
+3trans
+t4rate
+5traum
+t2re
+3treen
+t4rei
+5treim
+3trep
+t3rig
+5triib
+5triip
+5trikoo.
+tri4pl
+t4ross
+3trumm
+5t4rup
+3t2ruu
+3t2rü
+4trüü
+2t1s
+t3s2a
+ts4aa
+tsa5is
+t4saju
+tsa4lan
+3tsehh
+tse3la
+5tsellu
+5tsemen
+4tsena
+5tsensu
+tsig4
+5tsiitsi
+t4sink
+5tsiste
+ts4laa
+t2soo
+t4sor
+tsp4
+t4suss
+2t1t
+t4tad
+ttee2
+ttes2
+t5tsem
+3tu
+4tuim
+tu4raj
+tus1a
+tu4s5ee
+tu2si
+tus3s
+4t5uss.
+tus3t2
+tu5su
+tu4sä4
+tusü4
+4tutop
+4tuud
+tuule5
+2t1v
+1tõ
+5tõb
+2tõi
+tõ4l
+4tõ4n
+4tõp
+2t5õun
+1tö
+4töe
+4tök
+töö5k
+töö3p
+1tä
+täh4t3a
+tä5ke
+4täm
+1tü
+tü5he.
+tü3hi
+2t1ž
+t2že
+5tžek
+3tžem
+uaa4
+u3aast
+ua2b
+u5abi
+u1ae
+ua4he
+uai4k
+u3ain
+ua2ja
+u3akt
+ua2l
+u3all
+u3amet
+u1an
+ua4nu
+u5apar
+ua2re
+ua5ree
+u5art
+ua2s
+u3ast
+u1au
+uau4d
+ua2v
+u5avald
+u1b
+u4dalu
+u4deh
+udeo4
+udo4r
+u5eal
+u3eel
+u3eks
+ue2ma
+ueo4
+ue4r
+u1f
+u1g
+u4gi4d
+ug2ra
+u5graa
+u4gü
+uh4tem
+uh4ter
+uh4tin
+uh4tis
+uidu5
+ui2ga
+ui4h
+u3iha
+u3ilm
+5uim.
+uina2
+uinas5
+ui4si
+3uisut
+uite4h
+ui4to
+ui4vala
+ui4vel
+ui4vo
+u1j
+u5ja
+u4juj
+u4jum
+3ujumi
+u1k
+ukaa4s
+ukii4g
+ukki5
+ukop4
+u3kraa
+u5kro
+uku4sa
+uk4vi
+ul4a
+ul4deh
+uldi4
+ul4kr
+ul4len
+ul4lui
+ultra5
+u3lu
+uluo4
+4u1m
+umaf4
+u4mau
+5umbroh
+umet4
+umf4
+umia4
+umit4
+um5p4r
+unaa4
+unaal5
+un4dak
+un4dan
+un4das
+un4do
+u4ni.
+u1o2
+uo4h
+u2or
+u3org
+u1p
+u3pla
+up3le
+uppe4
+up4pis
+uraa4l
+u4rag
+ura4ju
+u4rala
+u4rap
+ur5auk
+ura4va
+3urb.
+urde3
+urea4
+u4reos
+ures4k
+u4rett
+urgas4
+5urge.
+u4ri4met
+u4rini
+uris4k
+urka4v
+uro4r
+u4rulu
+u2sa2
+u5sa.
+usad4
+u4sae
+u4salu
+us5aste
+u3sea
+useg4
+us5elek
+u4sett
+u3setu
+u5sev
+us4fä
+us5g
+u4si4d
+usi4g
+u4si4h
+us5ind
+usi4va
+us3kr
+u2so
+us5o2h
+us3ole
+uso4r
+us3p4
+u3s4por
+usui4
+3usuli
+u4suss
+u2sõ
+u2sü
+us3üh
+u1t
+ut4kl
+utos2
+utot4
+ut4ru
+ut4so
+utt4r
+utu4s
+utü4h
+uu5al
+4uud
+uu4du.
+uu4kak
+uuk5ri
+uu4mal
+uu4mis
+uu4pü
+uu4ran
+uu4ras
+uu4rau
+uu4rav
+uu3sa
+uusa3k
+uus4ke
+u3uss.
+uu4sul
+4uut
+uu4tas
+uu4tis
+uu4tüh
+u5uuri
+u1v
+u4vau
+u1õ2
+uä2
+u3är
+u1ü2
+už4l
+vaa4re4
+va4as
+4vabi
+vae4r
+vag4
+va5he
+4vaia
+4v3ain
+vak4v
+va4la.
+va4lai
+4valdi
+val4ga4
+va4lü
+vana5i
+vane2
+4vanku
+van4ta
+van4te
+vap4r
+v4ar
+4varm
+var4p
+2vart
+4varuh
+4varve
+va4sas
+vas4k
+vast4r
+vat4r
+4vatud
+vau4d
+vav4
+4vb
+2v1d
+3ve
+vee3a
+vee3k
+vee5la
+vee3sp
+4vehi
+vei4sa
+ve4ol
+veot4
+ve4rah
+ves4p
+2vf
+2vg4
+2v1h
+3vi
+via2
+vid4
+4videa
+vip4
+vi3pl
+vir4k
+vi4sak
+vis4ko4d
+2v1j
+2v1k
+2v1l
+2v1m
+2v1n
+voo5lu
+2v5p
+2v1r
+2v1s
+2v1t2
+v3tr
+vu4sa
+vu4su4
+2v1v
+3võ
+4võig
+4võ4li
+4võm
+võr4k5
+3vä
+vää4re4
+vää4ru
+3zo
+zook4
+zoos4
+õ1b
+õbe3
+õ1d
+õea4
+õe4lan
+õe3lu
+õet2
+õeu4
+õ1g
+õh4vu
+õi4a
+õi4b
+õie5k
+3õiel
+3õigu
+õi4ko
+õise4
+õi4su4
+õ1j
+õk4kõ
+õl2d
+õ4lim
+õ4lit
+õl4mad
+3õmbl
+õnet4s
+õ2p
+õ3pa
+õpi5e
+õp2pa
+4õp3r
+õranda5
+õra4s
+õr4da
+õr4gaa
+õr4gar
+õr4go
+4õs
+õs4a
+õ4tü4
+õude3
+õ1v4
+õõ5p
+õõre4
+õõ4rel
+õõ4ta
+öa2
+ö1b
+ö1d
+5ö2dee
+ödi4k
+3öeld
+öep4
+öet4r
+ö1g4
+ö1h
+öi4a
+öi4g
+öi4s
+ö1j
+ö1k
+ö2kon
+3ökono
+ök4v
+ö1l
+öli2s
+ölis5a
+ö1m
+öo2
+ö2p3au
+öp4lu
+ö4raa
+ö4rau
+ör4da
+ör4dell
+ör4e
+ö4ri4l
+ö4ro4
+ö4rä
+ö4rül
+ös4tii
+ö4to4
+ö4tü4
+ö1v
+ö3õ
+öö3a
+öö3e4
+öö5i
+3öölan
+öö3o
+ööt4r
+öü4
+äa4
+ä1b
+äbus5
+äbut4
+ä1d
+äe3a4
+äe1o
+ä1g
+äga4ri
+ähe5a
+äidi4s
+äike3
+äi4lo
+äi4lu
+äi2s
+äisa4
+äi4sõ
+äi4tar
+ä3j
+ä2ke
+3äke.
+ä5ker
+ä4kõ
+äli2s
+äl4ko
+5ämbl
+ä4nah
+än4deo
+änet4
+än4to4
+äok4
+ä4ra5a
+ära3o4
+ä4rar
+äre4lis
+äret4
+ärge4l
+ärii4
+äri4kl
+äri4sel
+ä4riste
+är4kar
+ä4ro
+5ärrit
+är4ta
+är2va
+ä4rõ
+äs4ko
+äs4nai
+äs4p
+äs4san
+äs4so
+ät4ri
+äu4d
+ä1v
+ävee4
+ää4kin
+ääo4
+ää4rase
+5ääris.
+üaa4
+ü1b
+üdame5
+ü1g
+ü2h
+ühe5i4
+1ühen
+3ühik.
+ü3hit
+ü1j
+ükan4
+ük4kas
+ük3l
+ül2d
+üld5a2
+ü2le
+3ülek
+ü5lel
+üle4mas
+1üles
+ülesä4
+ül4gav
+ül4gee
+ü4lih
+ülii4
+3üliko
+ü4liõ
+ül5kl
+ül5la
+ül4mei
+ülo4r
+ülp4
+ült4
+üma4rak
+üma4ru
+ümi4ko
+ü5ne
+üni4s
+üot4
+üp3l
+üp5p4
+üp3r
+üpsu4
+ürd4
+ürik4
+üs4o
+üs4pr
+üs4tal
+üs4tas
+üta4r
+ütee4l
+5ütlev
+ü4t3r
+üt4ru
+ü1v
+ü4ü
+üü2l3a2
+üü4le
+üü4lo
+üü4pe
+1ža
+4žb
+1že
+5žee
+5žer
+4žf
+1ži
+4žj
+4žk
+4žl
+4žm
+4žn
+3žo
+4žp
+4žt
+5žö
+5žü
+2žž
+3ša
+4šak
+4šau
+1še
+3š4i
+šis4k
+4šk
+5šo
+4št
+3šu4} \ No newline at end of file
diff --git a/tex/context/patterns/lang-et.rme b/tex/context/patterns/lang-et.rme
new file mode 100644
index 000000000..366ddcb90
--- /dev/null
+++ b/tex/context/patterns/lang-et.rme
@@ -0,0 +1,80 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: eehyph.tex (2004-04-13)
+% Author: E. Saar
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Estonian hyphenation patterns
+% Copyright 2003 E. Saar
+%
+% This work may be distributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.3 of this
+% license or (at your option) any later version. The latest version
+% of this license is in http://www.latex-project.org/lppl.txt and
+% version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "author-maintained".
+% This work consists of this file only (eehyph.tex).
+%
+% The patterns were generated long ago by applying patgen to
+% an Estonian dictionary; a few patterns were added later manually
+% to prohibit aa-bits type cases.
+% Declare the special characters
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-eu.hyp b/tex/context/patterns/lang-eu.hyp
new file mode 100644
index 000000000..3f5a18cf5
--- /dev/null
+++ b/tex/context/patterns/lang-eu.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-eu.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-eu.pat b/tex/context/patterns/lang-eu.pat
new file mode 100644
index 000000000..f23f71a34
--- /dev/null
+++ b/tex/context/patterns/lang-eu.pat
@@ -0,0 +1,199 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-eu.rme
+
+% used: a b c d e f g i j k l m n o p q r s t u v w x y z ñ
+
+\patterns{
+1ba
+1be
+1bo
+1bi
+1bu
+1ca
+1ce
+1co
+1ci
+1cu
+1da
+1de
+1do
+1di
+1du
+1fa
+1fe
+1fo
+1fi
+1fu
+1ga
+1ge
+1go
+1gi
+1gu
+1ja
+1je
+1jo
+1ji
+1ju
+1ka
+1ke
+1ko
+1ki
+1ku
+1la
+1le
+1lo
+1li
+1lu
+1ma
+1me
+1mo
+1mi
+1mu
+1na
+1ne
+1no
+1ni
+1nu
+1ña
+1ñe
+1ño
+1ñi
+1ñu
+1pa
+1pe
+1po
+1pi
+1pu
+1qa
+1qe
+1qo
+1qi
+1qu
+1ra
+1re
+1ro
+1ri
+1ru
+1sa
+1se
+1so
+1si
+1su
+1ta
+1te
+1to
+1ti
+1tu
+1va
+1ve
+1vo
+1vi
+1vu
+1wa
+1we
+1wo
+1wi
+1wu
+1xa
+1xe
+1xo
+1xi
+1xu
+1ya
+1ye
+1yo
+1yi
+1yu
+1za
+1ze
+1zo
+1zi
+1zu
+1l2la
+1l2le
+1l2lo
+1l2li
+1l2lu
+1r2ra
+1r2re
+1r2ro
+1r2ri
+1r2ru
+1t2sa
+1t2se
+1t2so
+1t2si
+1t2su
+1t2xa
+1t2xe
+1t2xo
+1t2xi
+1t2xu
+1t2za
+1t2ze
+1t2zo
+1t2zi
+1t2zu
+1b2la
+1b2le
+1b2lo
+1b2li
+1b2lu
+1b2ra
+1b2re
+1b2ro
+1b2ri
+1b2ru
+1d2ra
+1d2re
+1d2ro
+1d2ri
+1d2ru
+1f2la
+1f2le
+1f2lo
+1f2li
+1f2lu
+1f2ra
+1f2re
+1f2ro
+1f2ri
+1f2ru
+1g2la
+1g2le
+1g2lo
+1g2li
+1g2lu
+1g2ra
+1g2re
+1g2ro
+1g2ri
+1g2ru
+1k2la
+1k2le
+1k2lo
+1k2li
+1k2lu
+1k2ra
+1k2re
+1k2ro
+1k2ri
+1k2ru
+1p2la
+1p2le
+1p2lo
+1p2li
+1p2lu
+1p2ra
+1p2re
+1p2ro
+1p2ri
+1p2ru
+1t2ra
+1t2re
+1t2ro
+1t2ri
+1t2ru
+su2b2r
+su2b2l} \ No newline at end of file
diff --git a/tex/context/patterns/lang-eu.rme b/tex/context/patterns/lang-eu.rme
new file mode 100644
index 000000000..9ad59af7d
--- /dev/null
+++ b/tex/context/patterns/lang-eu.rme
@@ -0,0 +1,45 @@
+% generated by mtxrun --script pattern --convert
+
+% Hyphenation patterns for Basque.
+%
+% This file has first been written by Juan M. Aguirregabiria
+% (juanmari.aguirregabiria@ehu.es) on February 1997 based on the
+% shyphen.sh script that generates the Spanish patterns as compiled
+% by Julio Sanchez (jsanchez@gmv.es) on September 1991.
+%
+% In June 2008 the generating script has been rewritten into ruby and
+% adapted for native UTF-8 TeX engines. Patterns became part of hyph-utf8
+% package and were renamed from bahyph.tex into hyph-eu.tex.
+% Functionality should not change apart from adding ñ by default.
+%
+% The original Copyright followed and applied also to precessor of this file
+% whose last version will be always available by anonymous ftp
+% from tp.lc.ehu.es or by poynting your Web browser to
+% http://tp.lc.ehu.es/jma/basque.html
+%
+% For more information about the new UTF-8 hyphenation patterns and
+% links to this file see
+% http://www.tug.org/tex-hyphen/
+%
+% COPYRIGHT NOTICE
+%
+% These patterns and the generating script are Copyright (c) JMA 1997, 2008
+% These patterns are made public in the hope that they will benefit others.
+% You can use this software for any purpose.
+% However, this is given for free and WITHOUT ANY WARRANTY.
+%
+% You are kindly requested to send any changes to the author.
+% If you change the generating script, you must include code
+% in it such that any output is clearly labeled as generated
+% by a modified script.
+%
+% END OF COPYRIGHT NOTICE
+%
+% Open vowels: a e o
+% Closed vowels: i u
+% Consonants: b c d f g j k l m n ñ p q r s t v w x y z
+%
+% Some of the patterns below represent combinations that never
+% happen in Basque. Would they happen, they would be hyphenated
+% according to the rules.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-fi.hyp b/tex/context/patterns/lang-fi.hyp
new file mode 100644
index 000000000..108b1c69b
--- /dev/null
+++ b/tex/context/patterns/lang-fi.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-fi.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-fi.pat b/tex/context/patterns/lang-fi.pat
new file mode 100644
index 000000000..87bd73d72
--- /dev/null
+++ b/tex/context/patterns/lang-fi.pat
@@ -0,0 +1,293 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-fi.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v y ä ö
+
+\patterns{
+1ba
+1be
+1bi
+1bo
+1bu
+1by
+1da
+1de
+1di
+1do
+1du
+1dy
+1dä
+1dö
+1fa
+1fe
+1fi
+1fo
+1fu
+1fy
+1ga
+1ge
+1gi
+1go
+1gu
+1gy
+1gä
+1gö
+1ha
+1he
+1hi
+1ho
+1hu
+1hy
+1hä
+1hö
+1ja
+1je
+1ji
+1jo
+1ju
+1jy
+1jä
+1jö
+1ka
+1ke
+1ki
+1ko
+1ku
+1ky
+1kä
+1kö
+1la
+1le
+1li
+1lo
+1lu
+1ly
+1lä
+1lö
+1ma
+1me
+1mi
+1mo
+1mu
+1my
+1mä
+1mö
+1na
+1ne
+1ni
+1no
+1nu
+1ny
+1nä
+1nö
+1pa
+1pe
+1pi
+1po
+1pu
+1py
+1pä
+1pö
+1ra
+1re
+1ri
+1ro
+1ru
+1ry
+1rä
+1rö
+1sa
+1se
+1si
+1so
+1su
+1sy
+1sä
+1sö
+1ta
+1te
+1ti
+1to
+1tu
+1ty
+1tä
+1tö
+1va
+1ve
+1vi
+1vo
+1vu
+1vy
+1vä
+1vö
+1st2r
+ä2y
+y1a2
+y1o2
+o1y
+ö2y
+u1y2
+y1u2
+ö3a2
+ö3o2
+ä3a2
+ä3o2
+ä1u2
+ö1u2
+a1ä
+a1ö
+o1ä
+o1ö
+u1ä2
+u1ö2
+ä2ä
+ö2ö
+ä2ö
+ö2ä
+aa1i2
+aa1e2
+aa1o2
+aa1u2
+ee1a2
+ee1i2
+ee1u2
+ee1y2
+ii1a2
+ii1e2
+ii1o2
+uu1a2
+uu1e2
+uu1o2
+uu1i2
+e1aa
+i1aa
+o1aa
+u1aa
+u1ee
+a1uu
+i1uu
+e1uu
+o1uu
+ää1i
+ää1e
+ää3y
+i1ää
+e1ää
+y1ää
+i1öö
+a1ei
+a1oi
+e1ai
+i1au
+y1ei
+ai1a
+ai1e
+ai1o
+ai1u
+au1a
+au1e
+eu1a
+ie1a
+ie1o
+ie1y
+io1a2
+io1e2
+iu1a
+iu1e
+iu1o
+oi1a
+oi1e
+oi1o
+oi1u
+o1ui
+ou1e
+ou1o
+ue1a
+ui1e
+uo1a
+uo1u
+e1ö2
+ö1e2
+.ä2
+u2s
+yli1o2p
+ali1a2v
+1sp2li
+alous1
+keus1
+rtaus1
+2s1ohje
+2s1a2sia
+1a2sian
+1a2siat
+1a2sioi
+r2as
+l2as
+2s1o2pisk
+2n1o2pet
+2s1a2loi
+2n1o2pist
+2s1o2pist
+2s1o2sa
+2n1o2sa
+alkei2s1
+perus1
+2s1i2dea.
+2s1i2dean
+2s1e2sity
+2n1e2dus
+2s1ajatu
+2s1ase
+2s1apu
+2s1y2rit
+.ydi2n1
+.suu2r1a2
+2s1y2hti
+2n1otto
+2n1oton
+2n1anto
+2n1anno
+2n1a2jan
+2n1aika
+2n1o2mai
+2n1y2lit
+2s1a2len
+2n1a2len
+1a2siaka2s1
+ulo2s1
+2n1a2jo
+2s1a2jo
+b2l
+1b2lo
+bib3li
+b2r
+1b2ri
+1b2ro
+1b2ru
+d2r
+1d2ra
+f2l
+1f2la
+f2r
+1f2ra
+1f2re
+g2l
+1g2lo
+g2r
+1g2ra
+k2l
+1k2ra
+1k2re
+1k2ri
+1k2v
+1k2va
+p2l
+p2r
+1p2ro
+c2l
+q2v
+1q2vi
+sc2h
+ts2h
+ch2r} \ No newline at end of file
diff --git a/tex/context/patterns/lang-fi.rme b/tex/context/patterns/lang-fi.rme
new file mode 100644
index 000000000..e41b98a9e
--- /dev/null
+++ b/tex/context/patterns/lang-fi.rme
@@ -0,0 +1,78 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: fihyph.tex (yyyy-mm-dd)
+% Author: Kauko Saarinen
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% -----> Finnish hyphenation patterns for MLPCTeX <------
+% First release January -86 by Kauko Saarinen,
+% Computing Centre, University of Jyvaskyla, Finland
+%
+% Completely rewritten January -88. The new patterns make
+% much less mistakes with foreign and compound words.
+% The article "Automatic Hyphenation of Finnish"
+% by Professor Fred Karlsson is also referred
+% ---------------------------------------------------------
+%
+% 8th March -89 (vers. 2.2), some vowel triples by Fred Karlsson added.
+% 9th January - 95: added \uccode and \lccode by Thomas Esser
+%
+% ********* Patterns may be freely distributed **********
+%
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-fr.hyp b/tex/context/patterns/lang-fr.hyp
new file mode 100644
index 000000000..9e87d4f72
--- /dev/null
+++ b/tex/context/patterns/lang-fr.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-fr.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-fr.pat b/tex/context/patterns/lang-fr.pat
new file mode 100644
index 000000000..2523c85cd
--- /dev/null
+++ b/tex/context/patterns/lang-fr.pat
@@ -0,0 +1,1081 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-fr.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z à â ç è é ê î ï ô û œ
+
+\patterns{
+.a4
+.â4
+ab2h
+.ab3réa
+ad2h
+a1è2dre
+.ae3s4ch
+1alcool
+a2l1algi
+.amino1a2c
+.ana3s4tr
+1a2nesthési
+.anti1a2
+.anti1e2
+.anti1é2
+.anti2enne
+.anti1s2
+.apo2s3ta
+apo2s3tr
+archi1é2pis
+.as2ta
+a2s3tro
+1ba
+1bâ
+.bai2se3main
+1be
+1bé
+1bè
+1bê
+4be.
+4bes.
+2bent.
+1bi
+1bî
+.bi1a2c
+.bi1a2t
+.bi1au
+.bio1a2
+.bi2s1a2
+.bi1u2
+1b2l
+4ble.
+4bles.
+2blent.
+1bo
+1bô
+1b2r
+4bre.
+4bres.
+2brent.
+1bu
+1bû
+1by
+1ç
+1ca
+1câ
+ca3ou3t2
+1ce
+1cé
+1cè
+1cê
+4ce.
+4ces.
+2cent.
+ja3cent.
+ac3cent.
+é3cent.
+munifi3cent.
+réti3cent.
+privatdo3cent.
+inno3cent.
+es3cent.
+acquies4cent.
+is3cent.
+immis4cent.
+.ch4
+1c2h
+4ch.
+2chb
+4che.
+4ches.
+2chent.
+.chè2vre3feuille
+2chg
+ch2l
+4chle.
+4chles.
+chlo2r3a2c
+chlo2r3é2t
+2chm
+2chn
+2chp
+ch2r
+4chre.
+4chres.
+2chs
+2cht
+2chw
+1ci
+1cî
+.ci2s1alp
+1c2k
+4ck.
+2ckb
+4cke.
+4ckes.
+2ckent.
+2ckf
+2ckg
+2ck3h
+2ckp
+2cks
+2ckt
+1c2l
+4cle.
+4cles.
+2clent.
+1co
+1cô
+co1acc
+co1acq
+co1a2d
+co1ap
+co1ar
+co1assoc
+co1assur
+co1au
+co1ax
+1cœ
+co1é2
+co1ef
+co1en
+co1ex
+.con4
+.cons4
+.contre1s2c
+.contre3maître
+co2nurb
+.co1o2
+.co2o3lie
+1c2r
+4cre.
+4cres.
+2crent.
+1cu
+1cû
+1cy
+.cul4
+1da
+1dâ
+.dacryo1a2
+d1d2h
+1de
+1dé
+1dè
+1dê
+4de.
+4des.
+2dent.
+déca3dent.
+é3dent.
+cci3dent.
+inci3dent.
+confi3dent.
+tri3dent.
+dissi3dent.
+chien3dent.
+.ar3dent.
+impu3dent.
+pru3dent.
+.dé1a2
+.dé1io
+.dé1o2
+.dé2s
+.dé3s2a3cr
+.dés2a3m
+.dé3s2a3tell
+.dé3s2astr
+.dé3s2c
+.dé2s1é2
+.dé3s2é3gr
+.dé3s2ensib
+.dé3s2ert
+.dé3s2exu
+.dé2s1i2
+.dé3s2i3d
+.dé3s2i3gn
+.dé3s2i3li
+.dé3s2i3nen
+.dé3s2invo
+.dé3s2i3r
+.dé3s2ist
+.dé3s2o3dé
+.dé2s1œ
+.dé3s2o3l
+.dé3s2o3pil
+.dé3s2orm
+.dé3s2orp
+.dé3s2oufr
+.dé3s2p
+.dé3s2t
+.dé2s1u2n
+3d2hal
+3d2houd
+1di
+1dî
+di2s3cop
+.di1a2cé
+.di1a2cid
+.di1ald
+.di1a2mi
+.di1a2tom
+.di1e2n
+.di2s3h
+2dlent.
+1do
+1dô
+1d2r
+4dre.
+4dres.
+2drent.
+d1s2
+1du
+1dû
+1dy
+.dy2s3
+.dy2s1a2
+.dy2s1i2
+.dy2s1o2
+.dy2s1u2
+.e4
+.ê4
+.é4
+.è4
+éd2hi
+1é2drie
+1é2drique
+1é2lectr
+1é2lément
+.en1a2
+1é2nerg
+e2n1i2vr
+.en1o2
+épi2s3cop
+épi3s4cope
+e2s3cop
+.eu2r1a2
+eu1s2tat
+extra1
+extra2c
+extra2i
+1fa
+1fâ
+1fe
+1fé
+1fè
+1fê
+4fe.
+4fes.
+2fent.
+1fi
+1fî
+1f2l
+4fle.
+4fles.
+2flent.
+1fo
+1fô
+1f2r
+4fre.
+4fres.
+2frent.
+f1s2
+1fu
+1fû
+1fy
+1ga
+1gâ
+1ge
+1gé
+1gè
+1gê
+4ge.
+4ges.
+2gent.
+ré3gent.
+entre3gent.
+indi3gent.
+dili3gent.
+intelli3gent.
+indul3gent.
+tan3gent.
+rin3gent.
+contin3gent.
+.ar3gent.
+ser3gent.
+ter3gent.
+résur3gent.
+1g2ha
+1g2he
+1g2hi
+1g2ho
+1g2hy
+1gi
+1gî
+1g2l
+4gle.
+4gles.
+2glent.
+1g2n
+.a2g3nat
+a2g3nos
+co2g3niti
+.i2g3né
+.i2g3ni
+.ma2g3nicide
+.ma2g3nificat
+.ma2g3num
+o2g3nomoni
+o2g3nosi
+.pro2g3nath
+pu2g3nable
+pu2g3nac
+.sta2g3n
+.syn2g3nath
+wa2g3n
+4gne.
+4gnes.
+2gnent.
+1go
+1gô
+1g2r
+4gre.
+4gres.
+2grent.
+1gu
+1gû
+g1s2
+4gue.
+4gues.
+2guent.
+.on3guent.
+1gy
+1ha
+1hâ
+1he
+1hé
+1hè
+1hê
+hémi1é
+hémo1p2t
+4he.
+4hes.
+1hi
+1hî
+1ho
+1hô
+1hu
+1hû
+1hy
+hypera2
+hypere2
+hyperé2
+hyperi2
+hypero2
+hypers2
+hype4r1
+hyperu2
+hypo1a2
+hypo1e2
+hypo1é2
+hypo1i2
+hypo1o2
+hypo1s2
+hypo1u2
+.i4
+.î4
+i1algi
+i1arthr
+i1è2dre
+il2l
+cil3l
+rcil4l
+ucil4l
+vacil4l
+gil3l
+hil3l
+lil3l
+l3lion
+mil3l
+mil4let
+émil4l
+semil4l
+rmil4l
+armil5l
+capil3l
+papil3la
+papil3le
+papil3li
+papil3lom
+pupil3l
+piril3l
+thril3l
+cyril3l
+ibril3l
+pusil3l
+.stil3l
+distil3l
+instil3l
+fritil3l
+boutil3l
+vanil3lin
+vanil3lis
+vil3l
+avil4l
+chevil4l
+uevil4l
+uvil4l
+xil3l
+1informat
+.in1a2
+.in2a3nit
+.in2augur
+.in1e2
+.in1é2
+.in2effab
+.in2é3lucta
+.in2é3narra
+.in2ept
+.in2er
+.in2exora
+.in1i2
+.in2i3miti
+.in2i3q
+.in2i3t
+.in1o2
+.in2o3cul
+.in2ond
+.in1s2tab
+.intera2
+.intere2
+.interé2
+.interi2
+.intero2
+.inte4r3
+.interu2
+.inters2
+.in1u2
+.in2uit
+.in2u3l
+io1a2ct
+i1oxy
+i1s2tat
+1j
+2jk
+4je.
+4jes.
+2jent.
+1ka
+1kâ
+1ke
+1ké
+1kè
+1kê
+4ke.
+4kes.
+2kent.
+1k2h
+4kh.
+.kh4
+1ki
+1kî
+1ko
+1kô
+1k2r
+1ku
+1kû
+1ky
+1la
+1lâ
+1là
+la2w3re
+1le
+1lé
+1lè
+1lê
+4le.
+4les.
+2lent.
+.ta3lent.
+iva3lent.
+équiva4lent.
+monova3lent.
+polyva3lent.
+re3lent.
+.do3lent.
+indo3lent.
+inso3lent.
+turbu3lent.
+succu3lent.
+fécu3lent.
+trucu3lent.
+opu3lent.
+corpu3lent.
+ru3lent.
+sporu4lent.
+1li
+1lî
+1lo
+1lô
+l1s2t
+1lu
+1lû
+1ly
+1ma
+1mâ
+.ma2c3k
+.macro1s2c
+.ma2l1a2dres
+.ma2l1a2dro
+.ma2l1aisé
+.ma2l1ap
+.ma2l1a2v
+.ma2l1en
+.ma2l1int
+.ma2l1oc
+.ma2l1o2d
+.ma2r1x
+1me
+1mé
+1mè
+1mê
+.mé2g1oh
+.mé2sa
+.mé3san
+.mé2s1es
+.mé2s1i
+.mé2s1u2s
+.méta1s2ta
+4me.
+4mes.
+â2ment.
+da2ment.
+fa2ment.
+amalga2ment.
+cla2ment.
+ra2ment.
+tempéra3ment.
+ta2ment.
+testa3ment.
+qua2ment.
+è2ment.
+carê2ment.
+diaphrag2ment.
+ryth2ment.
+ai2ment.
+rai3ment.
+abî2ment.
+éci2ment.
+vidi2ment.
+subli2ment.
+éli2ment.
+reli2ment.
+mi2ment.
+ani2ment.
+veni2ment.
+ri2ment.
+détri3ment.
+nutri3ment.
+inti2ment.
+esti2ment.
+l2ment.
+flam2ment.
+gram2ment.
+.gem2ment.
+om2ment.
+.com3ment.
+ô2ment.
+slalo2ment.
+chro2ment.
+to2ment.
+ar2ment.
+.sar3ment.
+er2ment.
+antifer3ment.
+.ser3ment.
+fir2ment.
+or2ment.
+as2ment.
+au2ment.
+écu2ment.
+fu2ment.
+hu2ment.
+fichu3ment.
+llu2ment.
+plu2ment.
+bou2ment.
+bru2ment.
+su2ment.
+tu2ment.
+1mi
+1mî
+.milli1am
+1m2némo
+1m2nès
+1m2nési
+1mo
+1mô
+1mœ
+.mono1a2
+.mono1e2
+.mono1é2
+.mono1i2
+.mono1ï2dé
+.mono1o2
+.mono1u2
+.mono1s2
+mon2t3réal
+m1s2
+1mu
+1mû
+1my
+moye2n1â2g
+1na
+1nâ
+1ne
+1né
+1nè
+1nê
+4ne.
+4nes.
+2nent.
+réma3nent.
+imma3nent.
+perma3nent.
+.émi3nent.
+préémi3nent.
+proémi3nent.
+surémi3nent.
+immi3nent.
+conti3nent.
+perti3nent.
+absti3nent.
+1ni
+1nî
+1no
+1nô
+1nœ
+.no2n1obs
+1nu
+1nû
+n3s2at.
+n3s2ats.
+n1x
+1ny
+.o4
+.ô4
+o2b3long
+1octet
+o1d2l
+o1è2dre
+o1ioni
+ombud2s3
+omni1s2
+o1s2tas
+o1s2tat
+o1s2téro
+o1s2tim
+o1s2tom
+o1s2trad
+o1s2tratu
+o1s2triction
+.oua1ou
+.ovi1s2c
+oxy1a2
+1pa
+1pâ
+paléo1é2
+.pa2n1a2f
+.pa2n1a2mé
+.pa2n1a2ra
+.pa2n1is
+.pa2n1o2ph
+.pa2n1opt
+.pa2r1a2che
+.pa2r1a2chè
+.para1s2
+.pa2r3hé
+1pe
+1pé
+1pè
+1pê
+4pe.
+4pes.
+2pent.
+re3pent.
+.ar3pent.
+ser3pent.
+.pen2ta
+per3h
+pé2nul
+.pe4r
+.per1a2
+.per1e2
+.per1é2
+.per1i2
+.per1o2
+.per1u2
+pé1r2é2q
+.péri1os
+.péri1s2
+.péri2s3s
+.péri2s3ta
+.péri1u2
+1p2h
+.ph4
+4ph.
+.phalan3s2t
+4phe.
+4phes.
+2phent.
+ph2l
+4phle.
+4phles.
+2phn
+photo1s2
+ph2r
+4phre.
+4phres.
+2phs
+2pht
+3ph2talé
+3ph2tis
+1pi
+1pî
+1p2l
+4ple.
+4ples.
+2plent.
+.pluri1a
+1p2né
+1p2neu
+1po
+1pô
+po1astre
+poly1a2
+poly1e2
+poly1é2
+poly1è2
+poly1i2
+poly1o2
+poly1s2
+poly1u2
+.pon2tet
+.pos2t3h
+.pos2t1in
+.pos2t1o2
+.pos2t3r
+.post1s2
+1p2r
+4pre.
+4pres.
+2prent.
+.pré1a2
+.pré2a3la
+.pré2au
+.pré1é2
+.pré1e2
+.pré1i2
+.pré1o2
+.pré1u2
+.pré1s2
+.pro1é2
+.pro1s2cé
+pro2s3tat
+.prou3d2h
+1p2sych
+.psycho1a2n
+1p2tèr
+1p2tér
+1pu
+.pud1d2l
+1pû
+1py
+1q
+4que.
+4ques.
+2quent.
+é3quent.
+élo3quent.
+grandilo3quent.
+1ra
+1râ
+radio1a2
+1re
+1ré
+1rè
+1rê
+.ré1a2
+.ré2a3le
+.ré2a3lis
+.ré2a3lit
+.ré2aux
+.ré1é2
+.ré1e2
+.ré2el
+.ré2er
+.ré2èr
+.ré1i2
+.ré2i3fi
+.ré1o2
+.re1s2
+.re2s3cap
+.re2s3cisi
+.re2s3ciso
+.re2s3cou
+.re2s3cri
+.re2s3pect
+.re2s3pir
+.re2s3plend
+.re2s3pons
+.re2s3quil
+.re2s3s
+.re2s3t
+.re3s4tab
+.re3s4tag
+.re3s4tand
+.re3s4tat
+.re3s4tén
+.re3s4tér
+.re3s4tim
+.re3s4tip
+.re3s4toc
+.re3s4top
+.re3s4tr
+.re4s5trein
+.re4s5trict
+.re4s5trin
+.re3s4tu
+.re3s4ty
+.réu2
+.ré2uss
+.rétro1a2
+4re.
+4res.
+2rent.
+.pa3rent.
+appa3rent.
+transpa3rent.
+é3rent.
+tor3rent.
+cur3rent.
+1r2h
+4rhe.
+4rhes.
+2r3heur
+2r3hydr
+1ri
+1rî
+1ro
+1rô
+1ru
+1rû
+1ry
+1sa
+1sâ
+.sch4
+1s2caph
+1s2clér
+1s2cop
+1s2ch
+e2s3ch
+i2s3ché
+i2s3chia
+i2s3chio
+4sch.
+4sche.
+4sches.
+2schs
+1se
+1sé
+1sè
+1sê
+sesqui1a2
+4se.
+4ses.
+2sent.
+ab3sent.
+pré3sent.
+.res3sent.
+.seu2le
+.sh4
+1s2h
+4sh.
+4she.
+4shes.
+2shent.
+2shm
+2s3hom
+2shr
+2shs
+1si
+1sî
+1s2lav
+1s2lov
+1so
+1sô
+1sœ
+1s2patia
+1s2perm
+1s2por
+1s2phèr
+1s2phér
+1s2piel
+1s2piros
+1s2tandard
+1s2tein
+stéréo1s2
+1s2tigm
+1s2tock
+1s2tomos
+1s2troph
+1s2tructu
+1s2tyle
+1su
+1sû
+.su2b1a2
+.su3b2alt
+.su2b1é2
+.su3b2é3r
+.su2b1in
+.su2b3limin
+.su2b3lin
+.su2b3lu
+sub1s2
+.su2b1ur
+supero2
+supe4r1
+supers2
+.su2r1a2
+su3r2ah
+.su3r2a3t
+.su2r1e2
+.su3r2eau
+.su3r2ell
+.su3r2et
+.su2r1é2
+.su2r3h
+.su2r1i2m
+.su2r1inf
+.su2r1int
+.su2r1of
+.su2r1ox
+1sy
+1ta
+1tâ
+1tà
+tachy1a2
+tchin3t2
+1te
+1té
+1tè
+1tê
+télé1e2
+télé1i2
+télé1o2b
+télé1o2p
+télé1s2
+4te.
+4tes.
+2tent.
+.la3tent.
+.pa3tent.
+compé3tent.
+éni3tent.
+mécon3tent.
+omnipo3tent.
+ventripo3tent.
+équipo3tent.
+impo3tent.
+mit3tent.
+.th4
+1t2h
+4th.
+4the.
+4thes.
+thermo1s2
+2t3heur
+2thl
+2thm
+2thn
+th2r
+4thre.
+4thres.
+2ths
+1ti
+1tî
+1to
+1tô
+1t2r
+tran2s1a2
+tran3s2act
+tran3s2ats
+tran2s3h
+tran2s1o2
+tran2s3p
+tran2s1u2
+4tre.
+4tres.
+2trent.
+.tri1a2c
+.tri1a2n
+.tri1a2t
+.tri1o2n
+t1t2l
+1tu
+1tû
+tung2s3
+1ty
+.u4
+.û4
+uni1o2v
+uni1a2x
+u2s3tr
+1va
+1vâ
+1ve
+1vé
+1vè
+1vê
+vélo1s2ki
+4ve.
+4ves.
+2vent.
+conni3vent.
+.sou3vent.
+1vi
+1vî
+1vo
+1vô
+vol2t1amp
+1v2r
+4vre.
+4vres.
+2vrent.
+1vu
+1vû
+1vy
+1wa
+1we
+4we.
+4wes.
+2went.
+1wi
+1wo
+1wu
+1w2r
+2xent.
+.y4
+y1asth
+y1s2tom
+y1algi
+1za
+1ze
+1zé
+1zè
+4ze.
+4zes.
+2zent.
+privatdo3zent.
+1zi
+1zo
+1zu
+1zy} \ No newline at end of file
diff --git a/tex/context/patterns/lang-fr.rme b/tex/context/patterns/lang-fr.rme
new file mode 100644
index 000000000..04967549f
--- /dev/null
+++ b/tex/context/patterns/lang-fr.rme
@@ -0,0 +1,106 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: frhyph.tex <2006-10-20>
+% Author: R. Bastian, D. Flipo, B. Gaulle <cesure-l at gutenberg.eu.org>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% French hyphenation patterns
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file is available for free and can used and redistributed
+% asis for free. Modified versions should have another name.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \message{frhyph.tex - French hyphenation patterns (V2.12) <2002/12/11>}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% *BEFORE* using this file *PLEASE* run checksum on it: %
+% checksum -v frhyph.tex %
+% to make sure that it hasn't been damaged. %
+% Then if you notice anything wrong in french hyphenation please report to %
+% R. Bastian, D. Flipo, B. Gaulle at the email address: %
+% cesure-l@gutenberg.eu.org %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% checksum = "37208 1458 3078 34821"
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%% The most famous good guys who worked hard to obtain something usable.
+% Jacques Desarmenien, Universite de Strasbourg :
+% - << how to run TeX in a French environment: hyphenation, fonts,
+% typography. >> in Tugboat, 5 (1984) 91-102. and TeX85 conference
+% - << La division par ordinateur des mots francais :
+% application a TeX >> in TSI vol. 5 No 4, 1986 (C) AFCET-
+% Gauthier-Villars
+% Norman Buckle, UQAH (nb; many additions)
+% Michael Ferguson, INRS-Telecommunications (mjf) June 1988
+% Justin Bur, Universite de Montreal (jbb; checked against original list)
+% all patterns including apostrophe missing from nb list
+% after that, GUTenberg and specially Daniel Flipo and Bernard Gaulle
+% did their best effort to improve the list of patterns.
+%
+% -----------------------------------------------------------------
+%
+% Adaption of these patterns for
+% - TeX Version 3.x and MLTeX 3.x (2.x)
+% and
+% - all fonts in T1/`Cork' and/or CM/OT1 encoding
+% by Bernd Raichle 1996/08/28 (using ideas from `ghyph31.tex'
+% as of 1994-02-13 maintained by Bernd Raichle).
+% (An adaption for the old MLTeX 2.x exists but can not be
+% tested in lack of an executable.)
+%
+% -----------------------------------------------------------------
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-gb.hyp b/tex/context/patterns/lang-gb.hyp
new file mode 100644
index 000000000..29e8682e3
--- /dev/null
+++ b/tex/context/patterns/lang-gb.hyp
@@ -0,0 +1,15 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-gb.rme
+
+% used: a c e g h i m n o p r s t u v w y
+
+\hyphenation{
+uni-ver-sity
+uni-ver-sit-ies
+how-ever
+ma-nu-script
+ma-nu-scripts
+re-ci-pro-city
+through-out
+some-thing} \ No newline at end of file
diff --git a/tex/context/patterns/lang-gb.pat b/tex/context/patterns/lang-gb.pat
new file mode 100644
index 000000000..cbb229630
--- /dev/null
+++ b/tex/context/patterns/lang-gb.pat
@@ -0,0 +1,8534 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-gb.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z
+
+\patterns{
+.ab4i
+.ab3ol
+.ace4
+.acet3
+.ach4
+.ac5tiva
+.ad4din
+.ad3e
+.ad3o
+.ae5d
+.aer3i
+.af3f
+.af3t
+.ag4a
+.ag5n
+.air3
+.al5im
+.al1k
+.al3le
+.am5ar
+.ama5te
+.am2i
+.am3pe
+.am3ph
+.an1
+.ana3b
+.ana3s
+.and2
+.an5da
+.an4el
+.an4en
+.an4gl
+.an4on.
+.an3s
+.ant3a
+.an3ti3
+.ant4ic
+.an4t5o
+.any5
+.aph5or
+.ap4i
+.ar5ab
+.ar5ap
+.ar4ci
+.ar5d
+.ar4e
+.ari4
+.ar4ise
+.ar4isi
+.ar5sen
+.art5icl
+.as1
+.as4q
+.as5sib
+.at5ar
+.ateli4
+.at5omise
+.at5omiz
+.at3r
+.at3t
+.au3b
+.au3g4u
+.aur4e5
+.aus5
+.authen5
+.av4
+.av5era
+.bap5tism
+.barri5c
+.bas4i
+.ba5sic
+.be3di
+.be3lo
+.be5r4a
+.be5sm
+.bi4er
+.blaz5o
+.bo3lo
+.bos5om
+.boun4d
+.bov4
+.bra5ch
+.bre2
+.burn5i
+.ca3de
+.ca4gin
+.cam5i
+.cam3o
+.can1
+.can5ta
+.ca5pitu
+.car4i
+.cas5ual
+.ca4ti
+.cen5so
+.cen5tena
+.cent5ri
+.cer4i
+.ch4
+.cit4a
+.clem5e
+.clima5to
+.co5it
+.co3pa
+.cop5ro
+.co3ru
+.co3si
+.co5ter
+.cotyle5
+.cri5tici
+.custom5
+.dav5
+.dea5co
+.de5lec
+.del5eg
+.de3li
+.deli5r
+.de1m
+.de5nit
+.de3no
+.der2
+.de3ra
+.de5res
+.de3ri
+.de5scrib
+.de5serv
+.de5signe
+.de5sir
+.de5sis
+.de5spoi
+.determ5i
+.de3ve
+.de4w
+.di4al.
+.dia3s
+.di4at
+.din4a
+.dio5c
+.do2
+.do4e
+.domest5
+.du4al.
+.du4c
+.dys3
+.east5
+.echin5
+.eco3
+.ec3t
+.ed5em
+.ed4it.
+.ed4iti
+.eg4
+.ei3d
+.ei5r
+.el3ev3
+.el2i
+.elu5s
+.em3b
+.em5in
+.emp4
+.em5py
+.en1
+.en5c
+.en4ded
+.en3s
+.ent2
+.en5ta
+.eos5
+.epi1
+.epi3d
+.er2a
+.er5em5
+.er4i4
+.er4o2
+.eros4
+.erot3
+.er4ri
+.es1
+.escal5
+.es3p
+.es3t
+.etern5
+.eth3e
+.eu1
+.eur4
+.eval3
+.evol5ut
+.ew4
+.ex1
+.ex3a
+.eye3
+.fal4le
+.far4i
+.fec5unda
+.fen4d
+.feoff5
+.fi2
+.fi5lia
+.fil5tr
+.fin5ess
+.fin3g
+.fi5n4it
+.fis4c5
+.fo3c
+.fran5ch
+.fu5ga
+.ga4m
+.gam5et
+.gen4et
+.ge5neti
+.gen5ia
+.ge3ro
+.glor5io
+.gnost4
+.go3no
+.gos3
+.hab2
+.ha5bili
+.hama5
+.han4de
+.hast5i
+.he4i
+.hem5a
+.hi2
+.hi3b
+.ho2l
+.ho5rol
+.hov3
+.hy3lo
+.ico3s
+.idi2
+.ig3
+.ig1n
+.il4i
+.im5b
+.in1
+.in3d
+.in3e2
+.in2i
+.in3o
+.in3t
+.invest5i
+.ir3r
+.is4c
+.is4li
+.is4o
+.iso5m
+.ka5ro
+.ki4e
+.kin3e
+.lab4o
+.la4me
+.lam5enta
+.lan5i
+.lash4e
+.le4m
+.len5ti
+.le2p
+.lep5r
+.les5son
+.le5van
+.librar5
+.lig3a
+.li3o
+.li4ons
+.li4p
+.loc3a
+.lo4gia
+.lo2p
+.loph3
+.lous5i
+.lov5er
+.lub3
+.lyo3
+.mac5u
+.mal5ad5
+.ma5lin
+.mar5ti
+.math5
+.me5lodio
+.ment4
+.men5ta
+.me5rid
+.me5rin
+.met4er
+.mi4e
+.mi3gr
+.min5ue
+.mirk4
+.mis1
+.mi5to
+.mo3bi
+.mo5lec
+.mon3a
+.mor5ti
+.mu3ni
+.mu3si
+.musi5co
+.myth3
+.na5k
+.nari4
+.nast4
+.nas5ti
+.nec3t
+.ni4c
+.ni5tro
+.no4c
+.nom3o
+.nos3t
+.no5tic
+.nucle5
+.obed5
+.ob3el
+.ob3l
+.od4
+.oed5
+.oe5so
+.of5t
+.oi4
+.ol4d
+.ome2
+.om5el
+.on4ce
+.on4e
+.op2i
+.opt5a
+.or1
+.or4at4
+.ora5tori
+.or5che
+.or3d
+.ore4
+.or3eo
+.or4i
+.orner4
+.or2o
+.os1
+.osi4
+.oth5
+.out1
+.ov4
+.pal5i
+.para5dis
+.par5af
+.para5t
+.pa5ta
+.pa4tio
+.pec3t4
+.pecu3
+.ped3e
+.pend4
+.pen5de
+.pep3t
+.peri5n
+.perse5c
+.pe5titi
+.ph2
+.phe5nom
+.phon4i
+.pi2e
+.pi3la
+.plast4
+.plic4
+.plica4
+.plos4
+.po3la
+.po5lite
+.po2p
+.pop5l
+.po5sitio
+.pos5si
+.pro5bat
+.pur4r
+.put4te
+.ra5cem
+.ran5gi
+.re3ca
+.ref5ere
+.re5gar
+.re1i
+.re5lin
+.re1m
+.re5o
+.res5ci
+.re5sen
+.re5spo
+.re5stat
+.re5store
+.re5str
+.re3ta
+.re5u
+.re3w
+.rib5a
+.rin4
+.rit2
+.rol4la
+.ros3a
+.sa2
+.sac5r
+.sal4i
+.sa5lin
+.salt5er
+.sanc5
+.sap5a
+.sa3vo
+.sci3e
+.sea3s
+.sect4
+.sec5to
+.se3gr
+.sen3t
+.se1q
+.ser4ie
+.ses1
+.sev5era
+.sh2
+.si5gno
+.sis3
+.st4
+.stat4o
+.stra5to
+.string5i
+.su5da
+.sulph5a
+.sul3t
+.tact4i
+.tac5tic
+.ta4m
+.tamar5
+.tar5o
+.tect4
+.tel5a
+.tell5e
+.te4m
+.te5ra5t
+.ter4p
+.th4
+.tho4
+.thol4
+.ti2
+.til4
+.ti5ni
+.tit4is
+.tor1
+.tran4c
+.tri5bal
+.tri3d
+.trin4a
+.tri5sti
+.tro4ph
+.troph5o
+.tro4v
+.tular5
+.turb4
+.turi4
+.tu5te
+.tu3to
+.ul4l
+.ulti5mat
+.un5ce
+.un5ch
+.un3d2
+.under5
+.un3e
+.un3g
+.uni3c
+.uni3o
+.un3k4
+.un5s
+.un3t4
+.un5u
+.up1
+.up3l
+.ura4
+.ur5eth
+.ur4o
+.va5led
+.ve2
+.vec5
+.ve5lo
+.vent5il
+.ver4ie
+.ver3n
+.vic5to
+.vi2s
+.vis3i
+.vi5so
+.vo1c
+.vo5lut
+.wine5s
+.xy3l
+.za5r
+a4a
+1ab
+2ab.
+2aba
+ab5are
+abay4
+2abb
+ab5ber
+2abe4
+ab3erd
+ab3err
+a3bet
+ab1ic
+a3bie
+2abin
+4abio
+abi5on
+ab3ita
+ab4itu
+ab3la
+abli4
+4abolic
+ab3om
+ab3ota
+3about
+ab1r
+2abs.
+ab1ul
+abu4lo
+ab3use
+ab3usi
+2aby
+ac2a
+ac5abl
+ac3al
+5acanth
+ac5ard
+a5cat
+ach5al
+a5chini
+ach5ism
+achro4
+ach5ur
+2aci
+a4cic
+aci4ers
+acif4
+4acit
+ack5a
+ac3li
+4aco.
+aco3d
+ac5onr
+4acos
+4acou
+ac1r
+ac3ry
+act5ate
+act5ile
+ac2to
+act5ory
+ac2t5r
+ac5uat
+a5dai
+ada3v
+4adee
+ad5eni
+ad4ha
+ad3ica
+a5dif
+4adil
+adi4op
+adi4p
+adis4i
+a3diti
+3adju
+5admit
+a2do
+4adoe
+4adoi
+ad3ol
+a3dos
+ad1ow
+ad1r
+adram4
+4a2du
+ad3ula
+ad3um
+4ady
+ae5a
+ae4cit
+aeco3
+4aed
+aed5is
+ae5g
+ae3on
+ae5p
+aerody5
+ae4s
+ae5si
+aes3t
+aet4a
+aeth4
+aet4or.
+aev3a
+4af.
+4afe
+af5ta
+a4fu
+ag4ari
+4ageri
+a5ghe
+a5gia
+agi4as
+4agino
+4agl
+agli4
+4ag1n
+ag3oni
+agor4a
+ag5ot
+a2gr
+ag3ri
+agru5
+2ah
+a1h2a
+ahar2
+aha5ra
+a1he
+ah4n
+a5hoo
+2ai2
+4ai.
+ai3a
+a1ic
+aid4a
+aid5er
+aig2
+ai5gu
+ail3er
+ail3o
+aim5er
+ain5ders
+ai5nea
+a3ing.
+ain3i
+ain5o
+aint5er
+air5a
+air5p
+air3s
+ais1i
+a5ism
+2a1j
+a4ju
+2ak
+akel4
+ak5u
+al5abl
+alact4
+a1lae
+al5ais
+ala3ma
+al5ance
+al3at
+a5lav
+alc3at
+al3ch
+ald5ri
+2ale
+a3lec
+aleg4
+ale5ma
+al5ende
+a1leo
+a2let
+al3ibr
+ali4ci
+al5ics
+al1id
+al3if
+5alig
+al1in
+a5lini
+alin5o
+al5ipe
+al5ipot
+4alis.
+4aliu
+4alk
+alk5ie
+al4lab
+al4lag
+alli5an
+allig4
+al4lish
+a5loe
+al3ogr
+a3lom
+a3loo
+al1or
+al4orim
+alos4
+a4lou
+al3ous
+a5low
+al5pen
+al3ph
+al5tati
+al3tie
+alu3b
+al5ued
+al3ues
+a5lumnia
+al1va
+al5ver
+alv5u
+2a1ly4
+a5lyn
+2a2m
+a5mad
+ama4g
+aman5d
+a5marine
+a3mas.
+am1at
+a5m4atic
+am5atu
+am4bin
+3ambu
+am5elo
+a3men
+amen4d
+am3era
+am5erl
+am1i
+ami2c
+am5ica
+amic5r
+3amid
+a3mili
+am5ily
+amini4f
+am5iniz
+aminos4
+a5mis.
+a4mium.
+a3mon
+amor5a
+amort3
+am5ose
+am2p
+am5peri
+amphi5g
+amp3li
+ampo5l
+am3ul
+amyl5
+a2n
+an2a
+a5nadi
+an3ae
+an3age
+ana5k
+an3ali
+an3arc
+a5nast
+an4con
+an3d4at
+and5au
+and5eer
+an5del
+an5dif
+and5ist
+an5dit
+an4doni
+an4ea
+an5eer
+an3ell
+anel5li
+an3eu
+an3gan
+angov4
+an4gur
+4anh
+an3ic
+ani3f
+an5ifo
+4anig
+an5ion
+anis5te
+4anity
+4aniu
+an5no
+4anny
+an1o
+an2oe
+an3oma
+anor3
+an2os
+an5ot
+an2s
+an3sc
+an4sco
+ans3il
+an4sur
+an2t2a
+ant5abl
+an3tal
+an5tam
+an2te
+1anth
+an4thi
+3anthr
+4antic
+an4tie
+an4ting
+ant4iv
+an4tone
+ant4r
+an4tus
+an5tym
+an3ul
+an3um.
+an5ums
+a3nur
+a5nut
+an2y
+an5ya
+a5nyi
+2ao
+aol3i
+5aow
+2ap
+4ap.
+4apa
+a1pac
+ap3al
+ap5aro
+ape5li
+a5peu
+aph5em
+aph3i
+aph5ol
+aphyl3
+ap1i
+ap5icu
+ap3in
+ap4ine
+a5pir
+a3plan
+ap5li
+apo5str
+apo3th
+a2pr
+ap5ron
+4aps
+apt5at
+apu5lar
+a5pun
+a4q
+a5qui
+a2r
+4arabi
+ara5bo
+aract4i
+ara2g
+ar3age
+ar4aged
+ar5agi
+ar3ago
+a3raj
+ar3all
+ara3m
+aran4g
+aran5te
+ar5apa
+ar1at
+a3rau
+ara3v
+ar3ba
+arb5et
+ar4bid
+ar4bl
+arb3li
+ar4bul
+ar5chet
+arch5o
+ar5dina
+ar4done
+ar3en
+aren5d
+ar5ett
+ar3ev5
+ar5gh
+ar3gu
+ar3h
+ar1i
+ar5iff
+ar4ill
+a5ri5net
+ar5ini
+a5rishi
+arm3er
+ar5mit
+ar3nal
+ar3nis
+ar3od
+ar5oid
+aro4mas
+aro4n
+a5roti
+a5rouc
+ar3ox
+arp5ers
+ar4pu
+2arr
+ar2rh
+ar2s
+ars5al
+ar3so
+art5at
+ar2th
+arth4e
+arth3r
+ar5tiz
+2aru
+ar3um
+ar5un4
+a3ryo
+a5ryt
+ar5z
+as1a
+as4af
+asan2
+2asc
+as5con
+as5cot
+as2cr
+as2e
+as3ect
+4ased
+asep4
+ash5ay
+ash5il
+as5ily
+as3in
+a5sio
+a3sit
+as5iv
+ask5er
+aski4
+as4la
+as4lo
+2aso
+as5och
+a4soned
+as5or
+as3ph
+ass2
+assa5gi
+ass5ibl
+as4sil
+assit5
+2asta
+as4tat
+as4tia
+as3tis
+as4tit
+4asto2
+as3tra
+as4tri
+as1u
+as4un
+as5ur
+2a2ta
+4atabi
+a5talis
+atam4
+ata3p
+atar3a
+ata3s
+ata3t4
+at3eau
+at3ech
+at5eer
+a5tel.
+ate5le
+at5enat
+at3ent
+4ater
+at3era
+at5ernis
+at5erniz
+4atess
+at5et
+4a2th
+ath3a
+a3then
+ath5erin
+ath5ero
+ath5ete
+ath3i
+ath3od
+a5thon
+ath5r
+4a3tia
+ati2c
+at5icis
+ati5cit
+at5iciz
+a2tif
+a4t1i4l
+a4tim
+a2t3in
+4atina
+at5ing
+4at4is.
+at1it
+atit3u
+atitud5i
+4atiu
+at4ivi
+a5tiviz
+a2to
+5at5od
+4atog
+2atol
+4aton
+a3too
+a4tops
+a5torian
+a4tory
+atos4
+a5toz
+2a2tr
+at3ra
+a4tre
+5at5ress
+at1ri
+atric5u
+at3ron
+at5rou
+at4tag
+2a2tu
+at1ul
+atu4m
+at3ura
+at3urg
+4a2ty
+2au2
+4au.
+aub5i
+4auc
+au5cer
+auc3o
+aud5er
+audic4
+aul3i
+aul4t
+aul5ted
+ault5er
+ault5i
+au3ma
+aun2
+aun5chie
+aun3d
+aun4dre
+au5reo
+aur4o
+au5ror
+4aus.
+aus5er
+aus5p
+aus4ted
+aut3ar
+aut3er
+au3th
+2av
+av4ab
+ava4g
+av3age
+ava5la
+av5alr
+av5ant
+av5ar
+avas3
+av3end
+av3ern
+av3ig
+aviol4
+av1is
+aw5er.
+aw5ers
+aw1i
+aw5nie
+aw5y
+a4x
+ax2id
+4ay
+ay5la
+ay3m
+ayn4
+ays2
+ay5si
+ay5sta
+ayth4
+2az2
+az3ar
+aze4
+az5ee
+azyg4
+azz4l
+2ba.
+ba5bir
+3back
+baen4
+bag4a
+5bah
+ba4i
+bal3a
+balm5i
+ba5lon
+bal5u
+bam4a
+ban4a
+ba5nan
+b4ane
+5bang
+b4aniti
+b4ans
+ba4p1
+5barb
+bar4d
+bardi4
+bar4n
+ba5rom
+bar3on
+5bars
+1bas
+bas4te
+ba4th4
+3batic
+ba5tio
+bat5on
+battle5
+2b1b2
+b4bata
+b3bli
+b4bone
+b1c2
+bcord4
+2b1d
+bdeac5
+bde4b
+bdi4v
+b2e
+4be.
+3bea
+4beas
+be3ca
+3becu
+2bed
+be3da
+bed5el
+bed2i
+be4do
+be5dra
+be4du
+5bee
+3bef
+be3go
+be5gr
+be3gu
+1bel
+be3la
+2bele
+be3lit
+bel4t
+be3m
+ben4d
+bend5a
+bend5er
+be1ne
+be5nig
+be5nu
+4beo
+be3q
+2bere
+berga5m
+berl4
+5berr
+ber5s
+b5ertin
+be1s2
+2bes.
+be3sl
+be3tr
+be3w
+2b1f
+bfa4
+4b1h
+b4ha
+2bi.
+1bia
+bi4b1
+bicen5
+3b2id
+bid5i
+b4ie
+bi4ers
+bif4
+bi4fid.
+bi5ga
+bigu3
+b1il
+b2ile
+5biles
+3b2ill
+4bim
+bimet5
+5bina
+5bin4d
+bind3e
+bin5et
+bin5i4
+1bi2o
+bio3l
+bio5m
+bi3ou
+bip4
+bi5q
+bir4
+bi3re4
+bi5rus
+b2is
+5bism
+bis4o
+bisul5
+3bitua
+4bity
+bi5ve
+b1j
+4b5k4
+2bl2
+5blac
+blag4
+b3lan
+5blast
+bla5tu
+blem5at
+3bler
+5blesp
+4blik
+blim3a
+bli3o
+bli2q
+b3lis
+4bly
+2b1m
+bment4
+bmi4
+4b1n
+bo2
+4bo.
+3boa
+bo5am
+5bob
+bod5i
+bo5h
+2boid
+4boke
+bol4e
+4boled
+bol3i
+bol4t
+3bon
+bon4c
+bon4e
+bon4ie
+boni4f
+bon4sp
+1boo
+b3orat
+bor3d
+bor5ee
+bor5et
+3bori
+bor5ic
+bor5io
+bor4n
+bot3an
+5boti
+boun5ti
+3bour
+bous4
+bow2
+bow3s
+4boxy
+5boy
+br4
+3brach
+4bral
+bram4
+b2ran
+bran4d
+4bre.
+b4reas
+4b2res
+brev5et
+b2rid
+5brief
+bring5
+bri4os
+b5rist
+b4roa
+bro4ma
+bros4
+brum4
+4bry.
+4b1s2
+b3sc
+bscon4
+bsen4
+bserv5an
+b5si
+bsin4
+bso2
+bsol3e
+bso3lu
+b4stac
+bstupe5
+2b1t
+b5tlet
+4bu.
+5bub
+buf5fer
+b4uli
+b4ulos
+bun2
+bun4a
+b5u5nat
+bunt4
+bur3e
+bur4ri
+busi4e
+buss2
+bus5si
+3bust
+bu5tar
+b3ute
+b5utin
+3butio
+but4iv
+b5ut5o
+b1v
+4b3w
+2by
+4by.
+3byi
+bys4
+5byt
+2ca.
+cab5in
+c4ace
+caco3
+cad4r
+5caf
+ca3go
+5cai
+5cak
+c1al
+c4ala
+ca5laman
+cal5ar
+3calc
+ca5lef
+call5in
+cal4m
+ca3ly
+ca3ma
+cam4i
+ca5nar
+c2an4e
+c4ano
+ca3noe
+can5tar
+can5ted
+can4tic
+can4tr
+5cao
+1cap
+ca5pil
+capt4
+cap3ti
+cap3u
+1car
+ca3ra5c
+car5ame
+ca3ree
+ca3r4i3c
+car3if
+car5m
+car3ni
+car3ol
+car5on
+car5oo
+ca3rou
+car4v
+case5
+cashi4
+3cas3s
+cas5tig
+3casu3
+c1at
+c4at.
+c2atc
+c4atom
+ca3t2r
+c4ats
+cat4u
+3cau
+caulk4i
+cav3il
+3cay
+c1c4
+ccent5r
+cces4sa
+c3ch
+cci3d4
+ccip4
+ccle3
+4ce.
+4ceab
+cean3
+3ceas
+ce4ci
+2ced
+5ceda
+ce3dar
+3cede
+3cedi
+4cef
+ce5g
+3ceiv
+cel3ai
+cel5ib5
+5cell
+cel5lin
+celo4
+ce5lom
+4cely
+2cem
+ce4met
+3cemi
+ce4mo
+1cen2
+5cenc
+cen5ci
+cen5ded
+cend5en
+cend5er
+cen3i
+2cenn
+3cent
+cent4a
+cen5ted
+cen5ter.
+cen5ters
+cen5tes
+1cep
+cept3a
+cep5tic
+3cera
+cer4bi
+3cerd
+ce3rem
+5cern
+5cess
+cest5o
+ces5tr
+ce2t
+cew4
+2ch
+4ch.
+4chab
+3chae
+3chai
+cham5per
+chan5gi
+cha3pa
+chec4
+4ched
+3chee
+3chem
+che3ol
+ch1er
+ch4eri
+5cherin
+ch4erl
+4ches
+3chete
+ch5eu
+che5va
+3chew
+ch5ex
+5chi.
+3chia
+3chico
+ch3ily
+ch4in.
+ch3inn
+3chio
+5chip
+chizz4
+ch5k
+5chlor
+4chm
+1cho
+cho3a
+5choc
+4choi
+ch5oid
+3chor
+4chored
+chor5ol
+4choso
+3chot
+4choti
+ch5ous
+chow5
+3chr
+chur4
+3chut
+5chyd
+3chyl
+3chym
+1c2i2
+4ci.
+4ciac
+cia4m
+ci3ca
+4cids
+4cie.
+ci3er
+ci3est
+ci5et
+ci3f
+cifi4
+4cig
+ci3ga
+cigar5
+3cil
+cil5lin
+2cim
+cim3a
+ci3me
+5cimen
+4cinab
+4cind
+cine5a
+cine5mat
+ci5ness
+4cint
+ci3ol
+ci5om
+ci4po
+cisi4
+cit3r
+ck1
+ckar5
+cka5t
+c4ke
+ck5if
+ck4sc
+cl2
+cla5rif
+3clas
+c2le2
+2cle.
+c5lec
+clemat4
+clev3
+cli1m
+c3ling
+cli2q
+clo4q
+c4lotr
+clue4
+clyp5
+5clys
+cn2
+c3ni
+1c2o2
+4co.
+3coa
+co5ba
+3coc
+co3ci
+co5cu
+co3dic
+co3dif
+4cody
+3coe
+co5et
+co3gr
+4c3oid
+co3inc
+4col.
+col3a
+co3log
+5colou
+co5ly
+co5mas
+co4me
+co3mo4
+comp4
+con1
+con4ati
+con4ch
+cond5er
+con4ey
+con4ie
+con3s
+con3t
+conta5d
+3coo
+coop4
+co3or
+cop4e
+co3ph
+co5pl
+co3po
+cop4t
+2cora
+cor5ded
+cord5er
+4cored
+co3rel
+3corn
+4coro
+co5rol
+5cort
+3cos.
+cost3a
+cost5er
+co5ta
+3co3tr
+5coty
+cous5t
+cov1
+co3va
+cow5a
+coz4
+co5zi
+c1q
+cr2
+5craf
+craft5i
+c4ran
+5crani
+cra5niu
+cras3t
+cra4te
+c2re
+4crean
+cre3at
+cre4p3
+5creti
+cre4to
+cret5or
+cri3l
+cron4
+crost4
+4crou
+5c4rus
+cry2
+crym3
+cryo3
+4c5s4
+csim5
+2ct
+c2ta
+c3tac
+ctac5u
+c5ta5g
+ct1an
+ct5ant
+c5taria
+c3tato
+c1te
+c4tea
+c2t5ee
+c4tent
+cter4ia
+ct5es
+ct5et
+ct2ic
+c5ticia
+c4tics
+ctifi4e
+c3tim
+ct4in.
+ct4ina
+ct5ing
+c3tini
+c5tin5o
+c5tio
+c3t2is
+c3tit
+c4titu
+c4tity
+ct5ive
+ct4ivit
+ct5olo
+c1tom
+c3ton
+c5toris
+c5toriz
+c1tr
+c2tre
+ctro5t
+c1tu
+c2tum
+c1ty
+cub3at
+c4uf
+cu5ity
+cul5ab
+c2uli
+cull5er
+cull5in
+1c2ult
+cu4mi
+5cuna
+cun4e
+5cuni
+5cuol
+cu5pa
+cu3pi
+c3upl
+1cur
+cur4er
+cur5ial
+4cur4o
+1cus
+cus5a
+c3utiv
+c3utr
+5cuu
+cu5v
+2cy.
+cy4bi
+1cyc
+cyl3
+cy4m
+cy5no
+cys4
+cys5to
+cy4t
+cz2
+4da.
+d4abr
+1d2ac
+dach4
+d5ache
+3dact
+d1ag
+d4a4gi
+d4ale
+d4alg
+dal5ler
+dam5a
+3dame
+d3ami
+da5mu
+3dang
+d1an4t
+d3ap
+d3ard
+5darm
+3d4as2
+dast5a
+d1at
+dativ4
+dat4u
+daugh3
+daun5te
+3dav
+d3b
+d3c4
+d1d4
+d4dere
+d3di
+d3dler
+d3dli
+d3dyi
+2de.
+deac3t
+de5aw
+de4bi
+deb5it
+3dec
+de5cant
+de4cil
+de1cr
+4dect
+ded3i
+defor5e
+de4fy.
+de3g
+de4gu
+de3io
+5de3is
+de3lat
+deli4e
+del5ler
+del5li
+de5lo
+1d4em
+4demie
+4dem4is
+demo4n
+de4mons
+de3mor
+de4mos
+4demy
+de1n2a
+den4d
+4dene
+d3enh
+deni4e
+dens5a
+dens5er
+den5tit
+de3od
+deo3l
+deon2
+deont5
+de1p
+depen4
+deposi4
+de2pu
+d3eq
+derac4
+de3rai
+d4ere
+4dered
+de5reg
+3derer
+1deri
+der3k
+3derm
+der4mi
+der5min
+5derne
+3dero4
+der5os
+der3s
+5deru
+4des.
+de3sa
+5desc
+des4ca
+de5scal
+de3sec
+des4i
+de3sid
+des5igna
+des1p
+des5pon
+de3sq
+d3est.
+des3ti
+1de1t
+de3tes
+de5th
+de2ti
+dev3il
+de3vis
+de3vit
+de4voi
+devol5u
+3dex
+2d5f
+dfol4
+d2g
+dg4a
+dgel4
+d4gen
+d3gr
+4d1h
+dhot4
+d4hu
+4di.
+1dia
+di2ad
+3diar
+diat5om
+4d1ib
+d1ic.
+dic5am
+di4ce
+di3ch
+d5icl
+dic5ol
+1dict
+dic5tat
+dic4te
+5dicul
+d5icur
+1did
+di4ers
+3di3ev
+d4ifo
+dig3al
+di3gam
+dil4
+5dill
+dilo4
+di3lu
+di5mer
+dimet4
+di1mi
+2d1in
+din4e
+din5gi
+di5nos
+3di1o
+dio4c
+di4ola
+dip5t
+3dire
+di3ri
+4d5iro
+di4s1
+d4isc
+disen3
+3disia
+3diss
+d4itas
+d4iter
+dithe4
+d3ito
+ditor3
+2dity
+1diu
+1di1v2
+di4val
+di5vine
+dix4i
+d1j
+2dl4
+d1la
+5dlef
+5dlest
+3dlew
+dlin4
+d1lo
+d5lu
+2d1m
+4d1n2
+1do
+4do.
+d4ob
+do4c3u
+dog4a
+do4j
+d4ol.
+dol3en
+do5line
+dol5it
+do4lon
+d4ols
+5dom.
+doman4
+domin5
+dom5ino
+dom5it
+do5mo
+don4at
+4dony
+3doo
+d2or
+4dor.
+dor4m
+dort4
+d4os
+do5sim
+dossi4
+dot1a
+dot4tin
+2dous
+d4own
+3dox
+d1p
+dr2
+d5rail
+d3ral
+3dram
+dran4
+d4ras
+drast4
+3drel
+dres4
+dress5o
+dri4e
+d4rif
+dri4g3
+d4rom
+dropho4
+drunk3
+4d1s2
+d5sl
+ds3m
+ds4mi
+d4sw
+dt4
+dt5ho
+1du
+2du.
+du1at
+3duc
+duch5
+duci5an
+du4co
+du5eli
+du5ell
+du5en
+du5ett
+du5in
+dul3c
+d3ule
+dul4l
+dum4be
+dun4a
+d5un4c
+du2p
+du3pl
+5duro
+d5use
+dust5er
+du3u
+d1v
+dver2
+dvert3
+dvoc5at
+2d1w
+dwell3
+2d2y
+dy4ad.
+dy5ar
+5dy4e
+5dyk
+dyl2
+dyll3
+5dymi
+3dyn
+dys3p
+d3zo
+ea2
+4eab
+e1act
+eac4te
+ea5cu
+e5add
+ead3er
+ead1i
+ead3li
+ea4g
+eak1
+eal3a
+eal3er
+ea3log
+eam4bl
+eam3er
+ean5i
+eap2
+eap5er
+e3app
+ear3a
+ear3er
+ear4li
+e5ar2r
+ear4te
+earth5i
+eas5er
+ea4soni
+e1as1s
+eassem4
+eas4t
+east5i
+eat5eni
+eat3er
+eat5ie
+e3atif
+eatit4
+eat4itu
+e3atri
+e4atu
+eau3
+eav5i
+eavi4e
+eav5ou
+eaz5i
+e1b
+ebar4
+eb2b
+ebe4
+e4bel.
+e4bels
+e2ben
+eb5et
+eb2i
+e5bil
+e4bin
+e4bis
+e4bl
+e4bos
+ebot3o
+e2br
+eb1ra
+eb2t
+e4buc
+ebus5i
+ec2a
+ec3ade
+ecad5en
+ecal5e
+e5cam
+e4capo
+ec3at
+ec5ath
+e1ce
+ecent5o
+ech3i
+e4cib
+eci4f
+ecip5i
+e1cl
+ec3lip
+econ4sc
+econstit5
+ec3ora
+ec5oro
+ec3rat
+ec5rean
+e4crem
+ec1ro
+ect5ati
+ec4ter
+ecti4c
+ec4tit
+ec4t5us
+ec1ul
+e5culi
+2ed
+e5dans
+e2dat
+ede2
+e4ded
+e5deh
+e4dele
+edes3t
+ede3te
+edeter5
+e3dev
+e5dew
+ed4g
+edi4als
+ed5ical
+ed5ics
+ediges4
+ed5igr
+ed3ime
+ed1it
+edi2v
+ediv5id
+ed3li
+edor4
+e4dox
+ed1ro
+edu5cer
+e2dul
+ed3ulo
+e4d5ur
+ee4ce
+eed3er
+ee4do
+ee2f
+ee5g
+ee1i
+ee2l1i
+ee2m
+eem5er
+eem3i
+eep1
+ee4pa
+eer4ine
+eesi4
+ee3to
+e1f
+efact5o
+efal4
+ef5eree
+ef5inite
+e4fite
+ef4l
+efor5est
+2efu
+e4fug
+efut5a
+egel3
+egi5a
+e4gib
+e3gla
+eg3le
+eg4mi
+eg5nab
+e5g4on
+e2gr
+e5gur
+e1h2
+e5ho
+eh5s
+ehy2
+ehyd5r
+eid4
+5eido
+4eif
+eig2
+e5ignit
+e4in.
+e3inc
+e2ine
+e1ing
+ein5i
+e4ins.
+ei4p4
+eir3o
+4eis
+eis3i
+eit5er
+eith4
+e2iv
+eiv3er
+e2iz
+e1j
+ejudic4
+ek3en
+ek5is
+ek4l
+e4lac
+e5lad
+el5age
+elam4
+el5anc
+elast3
+e4lates
+el5ative
+elch5er
+eld3er
+2ele
+elea5g
+4e4led
+el5eni
+el3eno
+ele3o
+ele5ph
+el1er
+e1les
+e5less
+e4leste
+el3et3o
+elev3a
+ele3vi
+el5ex
+e4l3ica4
+e1lie
+eli4ers
+e3lim
+el3ing
+eli3on
+e4li4s
+elit4t
+e3liv
+el4lab
+ell5iz
+e3loa
+e3loc
+elo5ca
+eloc3u
+elo4di
+e2log
+elom5ate
+el5op.
+el5ops
+elp5in
+el3so
+el5tie
+e1lu
+elu4m
+elus4
+elv4
+e5lyi
+3elyt
+em3ago
+em3ana
+emar4
+emarc5a
+em5atiz
+emat5ol
+em5bi
+e1me4
+e4mee
+e4mel
+e3mem
+e4m3era
+em5ero
+emet4e
+em4icis
+e4mie
+e2mig
+emig5ra
+em3ina
+em5ing
+e3mio
+em3ism
+e4mita
+e4miu
+em4mae
+4emnit
+emo3bi
+emod4u
+e2mog
+e4moi
+em3olo
+em5om
+4emon
+e3moni
+emon5ol
+e2mor
+em5oris
+em3orr
+e4motic
+e5moz
+empa5r
+empara5
+em5pes
+4empli.
+em4pre
+em3um
+e5mut
+en3ac
+e4nal
+en3am3o
+en4ann
+e2n3ar
+en3as.
+ena5ture
+3encep
+en4cile
+enct4
+2end
+en4d5al
+en4dedl
+end5rit
+4ene
+ene5d
+en3ee
+e5nelle
+e5nep
+e2ner
+e5nereo
+ener5v
+en5esi
+e3ness
+en1et
+en4ett
+e2n3eu
+e3new
+en3gi
+en3ic
+en5ier
+en3ig3r
+en5in
+enit5u
+en3k
+en1o
+en3oi
+eno2m
+en3oty
+enov3
+en2s
+ens5al
+en3sp
+en4sum
+en4sus
+ent3ar
+en4ters
+en5tia
+en4tify
+en2to
+en4tri
+ent5rin
+ent5up
+en4tus
+4enu
+en3ua
+en3uf
+en3ur
+en5ut
+5enwa
+eo3b
+e4och
+e4oda
+eof2
+eo2l
+eol5ar.
+eol5at
+eologi4
+e5olu
+eo3m
+eon4a
+e3ont
+eop4t
+e1or1
+eor4de
+eor3e
+eor5o
+eo1s2
+eo4to
+e1pa
+ep4al
+ep5arc
+epa4t
+epend5en
+ep5ert
+e4pete
+epe5titio
+ep5ex
+eph1
+eph4i
+e2pig
+e5pla
+ep3lic
+epol3a
+epol3i
+epolit5
+ep3reh
+epres5e
+ep5rim
+e4p5rob5
+ept3or
+e1p4u
+e3pur5
+e4puta
+equin4
+equi5no
+er1
+era4cie
+era4do
+era4g
+era4l
+er3aph
+er3api
+er3apy
+4erati.
+4eratim
+er5atu
+er3bat
+er3be
+erb5os
+2erc
+er3ch
+er3cl
+2erd
+erd5ar
+erdi4e
+2ere
+er3eal
+4ered
+er3egr
+er5el.
+er5ell
+er5els
+e4reme
+er3en
+5erend
+eren4e
+ere5ol
+e3req
+er3er
+ere4s
+er5ese
+er3esi
+er5este
+er5esti
+eres5tr
+eret4
+er3et.
+er3ets
+er3ett
+ere4v
+er3ex
+ergi3v
+er3gl
+er3ia.
+er4ian
+eri4cid
+5er5ick
+er2id
+er3ie
+er3iff
+er4imet
+er3in
+eri4na
+eri4on
+er3iou
+er4isc
+eri5sta
+4eri2t
+e3riv
+er5iz
+4erj
+erk4
+er3me
+er4moi
+5ernacl
+er5nalis
+ern3er
+ern3is
+ern3it
+4ero.
+er3oid
+ero5is
+ero5st
+erpent5in
+erre5la
+er4rep
+er5sine
+er5ted
+er4ter
+ert5er.
+ert5ers
+er4thi
+ert5iz
+2eru
+eru4b
+eru5d
+erund5
+er4vil
+5erwau
+eryth3
+2erz
+4es.
+es5am
+es5an
+e2sc
+es5can
+es5che
+esci5e
+escut5
+e3sea
+e3sect
+e5see
+e5seg5
+ese4l
+es5enc
+e3sh4a
+e1shi
+e5shu
+esi4an
+es5ic.
+e5sick
+es5iden
+esi5diu
+es5ies
+es3im
+es3in
+e5sion
+e4sit
+es4it.
+es4its
+e3skin
+e3s4mi
+es4od
+es3ola
+es3ol3u
+es3ona
+eso3p
+e1sor
+es3per3
+es5pira
+es5pit
+es4pl
+esplen5
+es5pot
+e5s2pr
+es4s3an
+essar5
+ess5ee
+es4sil
+es2so
+esta4b
+est3an
+e5star
+es5tau
+e2sti
+est5ifi
+est5igati
+e3stoc
+es5too
+est4r
+estud4
+e1su
+e2s3ul
+es4ur5
+et2a
+et3al.
+et5allis
+et3al5o
+eta5me
+eta3p
+et3ari
+et5ary
+et4as
+et3ate
+et3ati
+et5ay
+et3eer
+etell5i
+etend5er
+et5eni
+eter2
+et3er3a
+et5eria
+etex4
+e2th1
+ethyl3
+2etia
+e3ticu
+eti4gi
+e5tim
+et3in
+eti4na
+e3tir
+et5itiv
+eti4u
+et5olo
+e5tomete
+e2ton
+et3ona
+etor3i
+etra5g
+4e4tral
+etra5m
+et4ran
+et5ress
+et1ri
+et4ria
+etrib5a
+e4trim
+et1ro
+et2t
+et3ter
+etud4
+et3ude
+e4tum
+et4we
+et5z
+eudio5
+eue4
+euk5
+4eum
+e3urg
+eur5i
+eus4
+eu5ten
+eu3ter
+eut3i
+ev4abi
+eval5e
+eva2p3
+ev3ast
+ev3at
+ev5eli
+eve4n
+ev5erat
+ev5eren
+ever4er
+e4veri
+e4ves
+e1via
+e4viab
+e2vic
+evictu4
+evid3
+ev5ig
+ev4ile
+ev5ish
+evis5in
+evis5o
+e4viu
+evoc3
+evol5e
+evol5ute
+evu4
+e1wa
+e4wag
+e5way
+ew1er
+e3wh
+ew5ie
+ew1in
+ew5ish
+e3wit
+e1wr
+ex5ic
+ex4on.
+1exp
+4ey.
+ey4as
+eyl4
+ey3s2
+ez5er.
+ez5ers
+ez5ie
+1f2a
+2fa.
+fab4i
+fa3cet
+fact2
+fa2c3u
+2f3ag
+fall5in
+5falo
+fa5lon
+fals5ifie
+4fan3a
+fan5tasiz
+fant3i
+5far
+far3i
+5faw
+4f5b
+2f5d
+2fe.
+3feas
+fea3tu
+feb5r
+3fec
+2fed1
+5fei
+fe1li
+fem3i
+femin5
+fend5er
+f5eni
+4fered
+fer3ee
+3fero
+fe5roc
+fer5om
+3ferr
+fer3v
+2fes.
+fess3o
+fest3a
+fest5i
+fe4t
+fet4al
+fet4in
+fet4o
+3feu
+fe5veri
+2ff
+f1fe
+ffec4te
+f5fet
+f1fi
+f5fia
+f3fic
+f5fie
+ffil3
+f2f3is
+ff4le
+ff3lin
+ffoc3
+ffoni4
+ffor3e
+f3fr
+ffranch5
+4f5h
+fi5ance
+fib5u
+4fic.
+4fical
+3fici
+4fics
+fi5del
+fid3en
+fiel4
+fier4c
+fight5
+1fi2l
+2fin
+fin2a
+fi3nal
+find3
+fin2e
+f1ing
+5finin
+fin4ni
+fir2m1
+f3ita
+f5itee
+fl2
+3fla
+fle2s
+f3lica
+flin4
+3flo
+flo5ric
+3flu
+flum4i
+1fo
+4fo.
+3foc
+fo2e
+foeti4
+fo1l4i
+fo4lie
+foment4
+fo2n
+fon4de
+3foo
+fo5ram
+for5ay
+for5b
+for4di
+fore3t
+5form
+for4m3a
+fortu5na
+fo3v
+1fr2
+frag5a
+frant4
+frar4
+fratch4
+fre4s
+frost5i
+fruc4
+2f3s
+fs4p
+2ft
+f1ted
+f4ter.
+ft5es
+fti4et
+ft4ine
+3fu
+4fu.
+fu4c
+fuel5li
+fug4a
+fu4min
+fun2g
+4fured
+fur3n
+fu3sil
+fus5o
+fu5til
+4ga.
+ga4cie
+gadi4
+ga4dos
+3gag
+3gai
+3gale
+ga5len
+gali4a
+gal5ler
+3galo
+gam4bl
+gan5at
+4ganed
+gang5er
+g5ant.
+gan4tr
+g5ants
+g5arc
+g4are
+gar3ee
+gariz4a
+ga5rot
+gar5p
+5garr
+1ga4s
+gas5i
+gas3o
+gasol5
+gass5in
+gast3r
+g1at
+g4at.
+gat5iv
+g4ato.
+g4atos
+g4att
+gat5u
+gaud5
+ga5za
+g1b
+g5d4
+2ge.
+5geal
+3gean
+2ge4d
+3gedi
+5gedn
+4gef
+1gel
+4gele
+ge4li
+gel4in
+gel5li
+ge4lu
+2gely
+gem3i
+5gemo
+3gen
+gen4du
+gen5it
+gen3o
+gen5ti
+ge4o
+geo3lo
+4gere
+3germ4
+2ges.
+5gess
+gest5at
+3get
+get3a
+2g1f
+2g1g
+gg4a
+g2ge
+g5gedl
+g3ger
+g5gerer
+ggi4a5
+g3gli
+gglu3
+g5gly
+ggrav3
+g4gro
+2gh
+g5hai
+gh5eni
+g3ho
+g4hos
+gh2t
+1g2i
+4gi.
+gi4all
+gi4at
+3gib
+gi5co
+gi4g
+gi5gan
+gin5gi
+3gio
+gi4or
+gi4ot
+5gip
+gi5pa
+g4i4s
+5gis.
+gi2t1
+5gitu
+giv5en.
+2gl2
+g3lar
+5glass.
+glec4
+3gler
+g4leto
+g4letr
+g4ley
+gli5on
+g5lis4
+3glo
+4g5lod
+glom3
+4glop
+3glu
+glu5te
+glu5ti
+3glyp
+2g1m4
+2gn2
+g1na
+g4nab
+g5nate
+5gnath
+g5nati
+gna5tur
+gn5edl
+gn5ee
+gn3er
+g1ni
+g4nia
+g2n3in
+gn4in.
+g4ni2o
+g2no
+5gnori
+gno4s
+2go.
+5goa
+3goc
+5god
+3goe
+go4et
+go4ge
+4gogram
+g5oid
+go3is
+go2me
+5gonn
+go5nom
+3goo
+goph4
+4gor.
+5gorg
+4gors
+g4ory
+3gos
+gos4t
+2gou
+gour4i
+g1ous
+gov1
+g3p
+1gr2
+grab4
+3gram
+4grame
+gra2p
+g4re
+gril4
+grim3a
+g4ro
+gro4g
+g5ron
+grop4
+3gru
+gru3en
+gru5i
+grum4b
+2g1s
+gs4c
+gs4t
+g4sti
+gth5eni
+g5to
+g4u2a
+gu5ab
+5guan
+3guard
+g5uat
+2gue
+5gueu
+5guit4
+gui5ta
+gu2ma
+gu4mi
+3gun
+g4uras
+g4ured
+gur4n
+gur4u
+4gury
+gust5a
+2g1w
+2gy
+gy2b
+5gym
+3gyn
+gyn5o
+g5z2
+ha2
+4ha.
+h4ac
+hadi4e
+had4ine
+hae3o
+haged5
+hagi3o
+hag5u
+ha5ic
+hais4
+hak4ine
+hal5ant
+ha4m
+ham5an
+han4cro
+han2g
+h1ani4
+h5aniz
+han4t
+hant3a
+ha4pe
+hap3l
+har1a
+har5b
+har4d
+har5die
+harge4
+ha5rism
+har3o
+har4ted
+har4ti
+has4te
+hat5o
+haught5
+havel4
+hav5ersi
+hav5o
+h1b
+h1c
+h1d
+hdeac5
+hdu4
+he2
+4he.
+h2ea
+1head
+3hear
+hearch4
+heast5
+heav5en
+hec3t4
+he5del
+he3do
+heek4
+h4ei
+he3is
+he5lat
+h5elin
+he3lio
+he5liu
+hel4li
+h3el3o
+hem1a
+he3men
+hemis4
+he5mop
+hem4p
+hende5
+he3or
+hep1
+h1er.
+her4as
+her2b
+herb3a
+herb3i
+here3a
+here3o
+h5erett
+h5erh
+her5ial
+h5erine
+h1erl
+her5om
+h4eron
+h1ers
+h5erwa
+hes3tr
+het1
+h4et3a
+het3i
+het4ted
+heu2
+heum3
+heumat5
+he4v4
+hev5i
+hex5o
+h1f
+h5h
+2hi.
+hi4ar
+h1ic
+hi3c4an
+hi4cin
+h4icl
+h5ie.
+h1ier
+h4i4ers
+h1ies
+h3ifi4
+h3ify
+hig4o
+hi5ka
+hi4l
+hi5ma4
+hi5mer
+himos4
+h1in
+hin4d
+h2in2e
+hi5nie
+h5iniz
+hi5nop
+h2ins
+hio5lo
+h4ior
+hi2p
+hip3l
+h4ir
+hir4r
+hirr5i
+hit4a
+hiv5a
+4hl
+h3la
+h1le
+h3let
+h1l2i
+hli4a
+2h1m
+h4manic
+h5mica
+2h1n2
+hnocen5
+4ho.
+ho3an
+ho4co
+ho3don
+ho5du
+ho5ep
+hol3ar
+hold1
+hol4is.
+ho5lys
+ho4mag
+hom5in
+h2o4n
+hon5em
+ho5neu
+hon3ey
+hong3i
+ho5nio
+hon1o
+1hood
+hoo5r
+h4ope
+ho2p5r
+h4op4te
+hor5et
+h4orn
+horn5i
+ho5rog
+hort5h
+hosi4
+ho4ton
+h2ou
+3house3
+4h1p
+2hr
+hras5eo
+hre4
+hre5ma
+hr5er
+hres4
+hri4
+hrill5in
+hrim4
+h5rit
+h3rod
+hrom4i
+hry4
+h3rym3
+2h1s
+hsi4
+h4sk
+ht5ag
+ht5ee
+ht3en.
+ht5ener
+ht3eni
+ht3ens
+ht5eo
+ht5es
+ht4foo
+h1th
+ht4ine
+hu4g
+hu4mat
+hu5mer
+hu4min
+hun4c
+hunk4
+hun4t
+hur3i
+hu3sia
+huz4
+h1w
+h4wart
+h2y
+hy2l
+hyl5en
+hy2m
+hyn4
+hy3o
+hyol5i
+hy1pe
+hy3ph
+hyr4
+hys3te
+hy4t
+2i1a2
+ia4bl
+iab5olis
+iab5oliz
+i2ach
+iac3o
+i2ac2r
+ia5cri
+ia5dem
+i5ae
+iaf4
+i2ag4
+ia3gn
+i5a4g5o
+ia3gr
+i3ah
+i5ai
+ialect4
+i3alit
+ial5li
+4ialn
+i2a3lo
+ia5ly
+i5amb
+ia3me
+ianch5
+i3ant
+i5ape
+ia3ph
+i2ard
+4iarit
+i3at
+ia5the
+i5atom
+iat4u
+iatur4a
+i3au
+iav4
+ib3era
+ib1i
+ibio4
+ibios4
+ib5li
+4ibo
+i4bon
+ibor4
+i4bose
+i5bou
+ib1ri
+4ibu
+ib3uta
+ic3ac
+ic5ado
+i4cal
+ic1an
+2icar
+iccu4
+4ice
+i5ceo
+4ich
+ich4i
+ich5ing
+ich5ol
+4icin
+i5cio
+2ick
+ic4lo
+2i2co
+ico3c
+ic5ola
+icon3o
+i5cop
+icotyle5
+2i1cr
+i4cri
+i4cru
+i4cry
+ic4tedl
+ic4ter
+ict5ic
+2icu
+icu4lu
+ic3um
+i5cun4
+i5cut
+2i1cy
+i2d
+id1a
+i5day
+ide4m
+id3enc
+id3era
+iderm5
+i3dicu
+id3if
+i5dig
+i5dil
+i3dim
+id4ines
+idios4
+idir4
+id1is4
+id4ist
+2i4d1it
+idi4v
+id3li
+id3ol
+idol3a
+4idomi
+id3ow
+4idr
+id5ri
+id3ul
+ie2
+4iec
+2ieg2
+ie3ga
+ie5i
+i5ell
+4iem
+2i1en
+ien2d
+i1er
+i3eres
+i2eri
+ieri4n
+4iern
+ier2o
+i4ert
+i3esc
+ies3el
+i1es2t
+i3est.
+2i1et
+i4et.
+iet3ie
+4ieu
+i5euti
+iev3a
+iev3er
+iev3o
+2i1f
+i2fe
+if4fa
+iff5ler
+if3ic.
+i4ficac
+if5ics
+ifi4d
+ifi4n
+4i2fl
+i3fo
+ifoc5
+if5tee
+i3fy
+2ig
+i3gad
+ig3and
+3igar
+i1ge
+i3ger
+ight5er.
+ight5ers
+4igi
+ign5iz
+igno5m
+i3gon
+ig1or
+ig3ot
+i5gret
+i4g5ro
+igu5it
+ig1ur
+2i1h
+ihy4
+2ii
+i5in
+ija4
+4iju
+2ik2
+ik5an
+ike4b
+i2l3a
+ila4g
+ila5tel
+i5later
+il4ax
+il5dr
+il4du
+i3len
+ilesi4
+il3f
+il3ia.
+il3iar
+ili4arl
+i3lici
+i5lien
+ili4er
+ili4fe
+il4ific
+il1in
+il5ine.
+4iliou
+il5ipp
+il5iq
+il4ite
+ilit5u
+il4mo
+i5lon
+il3ou
+ilth4
+il2tr
+4ilu
+il5ul
+i5lum
+il5ure
+il3v
+4ilym
+ima4c
+im2ag
+im3age
+im1al
+im5am
+i5m2as
+i4mated
+i4matin
+imat5u
+im1i
+i3m2ie
+im4ine
+im5ino
+im5mes
+i2mo
+i5mog
+i3mon
+im5oo
+i3mos.
+impar5a
+imparad5
+im5pie
+impot5
+im5pr
+impu4
+im1ul
+im5um
+in3ab
+4inace
+in4ado
+in5agl
+in3air
+ina4l
+4inalit
+in5am
+in3an
+in3ap
+in4ars
+i3nas.
+4inata
+inator5
+in3au
+in4aw
+2inc
+inc4tua
+2ind
+in5dar
+inde5p
+indes5
+inde3t
+indeterm5
+in5dro
+4inea
+4ined
+in5ee
+in5ega
+4in5eo
+ine4s
+in3esi
+ine5te
+4ineu
+inev5
+infilt5
+infol4
+4infu
+4inga
+in5gal
+4inge
+ing5ha
+4ingi
+4ingle
+4ingli
+4ingo
+4ingu
+ing3um
+2ini
+in5ia.
+4inic
+in4ici
+in3ion
+in4itud
+4ink
+ink4ine
+4inl
+2inn
+2ino
+4ino.
+in3oi
+i5nole
+4inos
+i3nos.
+in5ose
+in3osi
+4inq
+ins2
+in4sch5
+inse2
+insect5
+insec5u
+in3si
+5insk
+insolv5
+in4tee
+int5ess
+in3til
+int5res
+intu5m
+2inu
+in5ul
+in5um
+in3un
+in3ur
+invol5u
+2io2
+ioact4
+i1od
+iod3i4
+iod5o
+ioe4
+io3gr
+4i1ol
+io3ma
+i4omani
+io3mo
+i5ope
+io3ph
+i5opo
+iop4s
+i1or
+iora4m
+4iore
+4iorit
+5ioriz
+4iorl
+ior4n
+io3sc
+i3ose
+i3osi
+i4oso
+io5sta
+i3ot
+iot4a
+io5th
+iot5ic
+io5tr
+i4oty
+i4our.
+i4ours
+i5ox
+2ip
+ip3al
+ipap4
+ipar3o
+ipart5ite
+ip1at
+i3pend
+i1ph2e
+iphen3
+i5pheri
+iphi4
+i4phu
+ip3id
+i5pil
+ip3in
+ip4ine
+ipir4
+ip5is
+ip1i4t
+ip4iti
+ip3lin
+ip3lo
+i3po
+i4pog
+i4poli
+i4pom
+ipon3
+i4pow
+ip2pl
+ip3pli
+ip4re
+ip5tori
+ip1ul
+i5put
+ipy4
+2iq
+i3qua
+2ir
+ir1a
+ir4abi
+ira4c
+ir4ae.
+ir4ag
+ir4alin
+ir4alli
+i5raso
+irassi4
+iray4
+ird3i
+ire3a
+ir3ec
+ir5ee
+irel4
+ire5li
+ires4
+ir5ess
+ir1i
+ir2i4d
+ir4im
+ir4is.
+5iriz
+irl5ing
+ir5och
+ir5ol
+ir3om
+ir4q
+ir2s
+ir5ta
+ir5tee
+irwo4me
+i4sa
+is5ad
+is3age
+is1al
+is3am
+is1an
+is3ar
+is5av
+4isb
+i2s3c
+is5chi
+isci5c
+4i1sec
+ise5cr
+is3ell
+4is3en
+is2er
+is5ere
+i2s3et
+4iseu
+is3har
+ish5ee
+4ishio
+ish3op
+is5hor
+2isia
+is5ic
+is3ie
+4isim
+is3inc
+4isis
+is4ke
+is1l
+islun4
+2isma
+is1on
+is5oner
+iso5p
+is1p
+i3s2ph
+5ispr
+2is1s
+iss5ad
+is4sal
+is5san
+iss4iv
+iss4o
+4ista
+is4tal
+ist5enc
+ist5ent
+is5terer
+4isth
+is4t3ic
+4istl
+i4s1to
+4is4tom
+is1tr
+3istry
+4isty
+i5sul
+is3ur
+2isy
+it1a
+it5ab
+ita4c
+4itai
+it3am
+it4ana
+it4as
+it3at
+i3tect
+it3ee
+it3enc
+it3ent
+it3era
+2ith
+itha5l
+ith5i
+i5thol
+ith3r
+ithy5
+2itia
+iti4co
+it5icu
+it1ie
+it3ig
+4itim
+it4in.
+it4ins
+4itio.
+4itione
+i5tiq
+4i5tit
+it3iv
+it4li
+it5lo
+4ito.
+it5ol
+2iton
+it1ou
+2itr
+it5ress
+i4tric
+2itt
+it4tit
+itu4als
+it5uar
+4itue
+it1ul
+it1ur
+it3us
+2i1u2
+i3um
+iur5e
+2iva
+iv5anc
+iv1at
+i4ved
+iv5el.
+iv5eling
+iv5els
+i4ver.
+iv3eri
+i4vers.
+iver5sal
+ives4
+iv3et
+i4vie
+iv3if
+i5vilit
+5ivist.
+5ivists
+iv1it
+i2vo
+ivoc3
+i5vore
+2i1w
+2ix
+ix3o
+i5ye
+1iz
+4izah
+iz3i2
+2izo
+iz5oi
+2izz
+1ja
+2ja.
+3jac
+ja2c5o
+jac3u
+jag5u
+jal4
+ja5lo
+ja5pan
+jel5la
+jeo2
+jeop3
+4jes
+jeu4
+jew3
+2ji
+3jig
+jil4
+jill5
+5jis.
+3jo2
+4jo.
+joc5o
+joc5u
+jol4e
+4jr
+4js
+ju1di
+jui4
+ju5l
+ju3ni
+juscu4
+jut3a
+ju1v
+k4abi
+k2a5bu
+kach4
+k3a4g
+kais5
+ka4l
+ka5lim
+kal4is
+k4an
+ka3o
+kap4
+kar4i
+1kas.
+kaur4
+kav4
+k1b4
+k1c
+kcom4
+k5d2
+kdo4
+kdol5
+4ked
+ke5da
+k5ede
+3kee
+ke4g
+ken4d
+keno4
+kep5t
+ker5a
+k4ere
+k5erel
+ker4j
+ker5o
+kes4i
+ket5a
+key4wo
+k1f
+kfur4
+k3ho
+5kih
+ki2l
+kilo3
+k1in
+k2in.
+3kind
+kinema4
+kin5et
+k3ing
+kin4i
+k2ins
+kir3m
+kir4r
+kis4
+3kis.
+k1ish
+kit5c
+ki4w
+kk4
+k5ker
+k2l2
+k3la
+k5lea
+k3ler
+k3let
+k3li
+k3lo
+k1m
+kn2
+k2no
+1know
+ko5a
+kol4
+ko5mi
+ko5pe
+k1p
+k5ro4
+k3ru
+4k1s
+k3sl
+ks2mi
+ks4t
+k1t
+kur5
+k5v
+k1w
+3kyl
+l2a
+4la.
+5laa
+lab5ar
+label4
+5labr
+l4ac
+la2ca
+la5ceo
+la5cer
+la4ch
+la2co
+5la5col
+lac5on
+la3cu
+la4de
+l5adm
+l4ae
+l4af
+la3ger
+la4gis
+lag3r
+5lah4
+la4ic.
+l4al
+4lale
+5lamandr
+la5melli
+lam4ie
+lam1o
+l5amu
+lan3at
+lan2d
+3land.
+land3i
+3lands
+lan4er
+lan3et
+lan5tine
+lan4tr
+la4p
+lapi4
+lar5an
+lar5de
+4lared
+l4as
+lat5al
+la4te
+5latilis
+5latiliz
+5latini
+lat5us
+l4au
+5laur
+lav5at
+l4aw
+4laz
+l3b
+lbe4
+l4bit
+l4by
+l1c2
+l2cat
+lce4
+lcen4
+l4cere
+lch4e
+l3dar
+l3ded
+l3deh
+l5dera
+ld3est
+l5dew
+ldi2
+l3die
+ld4ine
+l5di5nes
+ld3ish
+ld5li
+l3do
+4le.
+3leagu
+le5atio
+leav5er
+l3eb5ra
+le3ca
+le5cha
+lect5ica
+2led
+le5dr
+leg1a
+l3egan
+3legg
+le4gin
+leg3o
+le3gra
+lek4
+4leled
+lel5o
+lelu5
+lem5enc
+lem3is
+l5emiz
+5lemm
+l3emn
+le2mo
+lem5on
+l5enda
+len5dar
+lend4e
+len4do
+le1ne
+le5nie
+len3o
+4lentio
+len5u
+le3on
+leo4s
+le5q
+2ler
+le5rec
+5l4eria
+l4eric
+le5rig
+ler3om
+leros4
+ler3ot
+4les.
+le3sco
+3les4s
+1let
+le5tra
+le5tre
+5le5tu5
+leur5
+2lev
+l3eva
+5leve
+lev5ita
+le4wi
+l5exa
+1ley
+lf5id
+l2fo
+lf3on
+l1g2
+l4gal
+l4gem
+lgi4a
+l4gid
+l4goi
+l3h
+4li.
+li4ani
+lias4
+lib1r
+l1ic.
+5lich
+li4cie
+5licio
+l3ic3on
+lict4o
+li4cu
+l3ida
+l4idar
+5lidif
+3lieu
+l4ife
+l4ifo
+lift5er
+1lig
+li5ger
+light5i
+5lih
+3lik
+1l4il
+lil4i
+lim2b
+limet4e
+lim4p
+l4ina.
+l4inas
+lin4d
+l4ine
+5lin3ea
+lin4er.
+lin4ers
+lin4ger
+ling3i
+5lingt
+3lingu
+3linq
+lint5i
+3liog
+li4ol
+lio3m
+liot4
+li3ou
+5liph
+lipt5
+li1q
+3lir
+l1is
+l4isk
+5lisse
+l1it
+l2it.
+l3it5a
+5liter
+3lith
+5litia
+3litr
+lit4u
+l4iv
+l5ivat
+liv3er
+liv5id
+lkal5o
+lk5at
+lk3er.
+lk3ers
+ll2
+l1la
+lla4ba
+llact4
+l5las
+l4law
+l5leb
+l1lec
+l1leg
+l3lei
+l1lel
+lle5m
+l1len
+l3lep
+l3leu
+l3lev
+ll3f
+l1li
+lli5am
+lli4an
+llib4e
+llic4
+l4licl
+lli5co
+l5lie
+lligat4
+l2lin
+l5lin.
+l3lina
+l3line
+l5lio
+lli5v
+ll3m
+l1lo
+lloc3a
+lloc5u
+llo2q
+l4lov
+llow5er
+ll3p
+ll3s
+ll5t
+l1lu
+llun4
+l5lya
+l3lyc
+l3lyg
+l3lyh
+l3lyi
+l5lym
+lm2
+l1ma
+l1me
+l4mer
+lm3ing
+l5mip
+l2m3od
+l1n4
+l3ne
+lneo4
+2lo.
+5load
+5lob3a
+1loc
+loc3al
+loc5ul
+lo4cus.
+2locy
+l3odis
+3lo3dr
+1log
+lo5gan
+4loi.
+lo5mi
+lom4m
+lon4al
+lon4e
+l5onel
+lo5ney
+long5in
+3lonia
+loni4e
+l3onis
+l3oniz
+loom5er
+lop4e
+5lo5pen
+l3opm
+1lo1q
+l4ored
+lor5iat
+lor4ife
+lo5rof
+loros4
+l4os.
+lo1so
+loss4
+los5sie
+lot5at
+loth4ie
+lo5tu
+5loup
+lp1at
+lp3er
+lph2
+l5phe
+l3phin
+l2pho
+l3pie
+l3pit
+lr4
+l3ri
+l3ro
+l5ru
+4ls
+l5sam
+ls5an
+lsi4fia
+lsi4m
+ls4is
+l5sk
+ls4p
+l1s2t
+ltan3e
+l4tang
+lt5ant
+l5tar
+l1te
+l4tei
+ltern3
+lth3i
+lti4ci
+ltim4a
+ltin4
+lti3t
+l3t4iv
+lt4or
+l1tr
+ltramont5
+l1tu
+l4tus
+4lu.
+lu1a
+luch4
+lu2c5o
+luc5ra
+lu4cu
+4lue
+lu1en
+lu5er
+lu1i
+lu4it
+lum4bri
+lu4mo
+5lump
+lu2m5u
+lunch5eo
+5lune
+l3unta
+lu3ori
+5lup
+3lur3o
+lusk5
+luss4
+lut5an
+4lut5ar
+5lutioniz
+lu5toc
+lut5r
+lu1v
+lv5ate
+l5vet4
+l4vi
+l4vor
+l3w
+lx4
+2ly
+4ly.
+ly1c
+ly4ca
+lyc4l
+lyc5os
+lym2
+lymph5
+lyp2
+ly4pa
+lypt5o
+3lyr
+lys5er
+3lyw
+3lyz
+lz4
+4ma.
+m4aca
+mac3ad
+ma5chine
+5machy
+ma4cis
+mact4
+4mad.
+4mada
+4mads
+ma4ge
+5magn
+2mago4
+2mah
+ma5ho
+3ma4i
+4mai.
+maid3
+5mak
+mal3ap
+mal5ari
+5male2
+mal5ed
+mal3ef
+m3alg
+m3alis
+mal4is.
+mal3le
+mal4li
+2mam
+mament4
+m5ament.
+1man
+3m4an.
+man3a
+man5dar
+man3dr
+manic4
+man4ica
+ma5nil
+m4ans
+mantel5
+2map
+m3aph
+1mar
+5maran
+mar5ol
+ma5ron
+ma3roo
+mar5ri
+mar4shi
+mar3v
+ma3son
+massi4
+mass5ing
+3mas1t
+mas4ted
+mast4ic
+mas4tin
+m4at.
+m4aten
+ma3ter
+mater5n4
+m4atit
+mat4iti
+m4atiza
+ma3tog
+mat5om
+ma3top
+m4ats
+3m4att
+ma5ture
+mav4
+2m1b
+mbat4t
+mb4d
+m5bec
+m5berer
+m4bery
+m4bes
+mb2i
+m2bic
+m5bil5
+m4b3ing
+m4bis
+mb5ist
+mbival5
+m5bler
+m3bli
+mbru4
+mbu3l
+mbur4
+m1c
+m5d
+m2e
+2me.
+mea5g
+me5and
+me4ba
+me4bi
+2med
+4med.
+3media
+med5icat
+4medie
+m5ed5ies
+3medit
+me4do
+m5edy
+me2g
+5meg2a1
+mega5t
+4mele
+mel5ee
+mel5ler
+mel3on
+mel4t
+melt5er
+me2m
+4m5eme
+1men
+3men.
+2mena
+men4ag
+mend5er
+mend5o
+me1ne
+ment5or
+5ments
+5meog
+me4p
+m5eran
+4mere
+mer4ia
+2me2s
+mes5en
+me5si4a
+mes5q
+3mesti4
+1me2t
+meta3t
+met1e
+4meted
+meth4i
+meti4c
+met5ici
+met3o
+met3ri
+m1f
+4m3h
+4mi.
+m1ic
+mi4cin
+mi3co
+3micro
+m4ict
+mi3cul
+mi4cus
+m4idi
+mid4in
+mid5on
+mi5fi
+mig5a
+migh5ti
+mi2gr
+4mij
+mi5ka
+m2il
+m3ila
+mil4ad
+4m5ilie
+mil5ies
+3mill
+mi5lo
+mil4t
+3m2im
+mim5i
+5min4d
+mind5er
+min4er.
+min4ers
+ming5li
+min5ie
+m4init
+min3ol
+1m4int
+minth5o
+mi3o
+mi3p
+mirab4
+mi5racu
+m2is.
+m4isc
+mi4se
+4misem
+mis3ha
+5missi
+m3ist.
+mis4tin
+m3ists
+mi2t
+m5itan
+4mity
+3miu
+5mix
+4m1l
+mlo5cuti
+mlun4
+2m1m2
+mman4d
+mmand5er
+m3medi
+mmel5li
+mmet4e
+mmig3
+mmin3u
+mmis3
+mmob3
+m5moc
+mmor3
+mmut3a
+4m1n2
+mnif4
+m4nin
+mni5o
+mnis4
+mno5l
+1mo
+4mo.
+2moc
+mod1
+mod5ifie
+mogast4
+mo4go
+mog5ri
+m5oir
+mok4i
+mol3a
+4molog.
+4mologs
+4mologu
+mo3ly
+mo1m
+mo4mis
+m4on
+mona4
+4moned
+mon1g
+mo4no
+monolo4
+monolog5i
+m4op
+mophil5i
+mop4t
+m3orab
+m3orat4
+mor4ato
+m5ord
+mo5rel
+3moria
+m5oriz
+mor5on
+3morp
+3morse
+mor5tal
+mo3sp
+5most
+mo3sta
+2m1ous
+m1p
+m3pa
+m4panc
+m4pant
+mpath3
+mpel5li
+m5perer
+mper3i
+mpet5it
+mphal5o
+m4phe
+m4phl
+m2pi
+mp5id
+m5pig
+mp3ily
+mp1in
+m3pir
+mp3is
+m3po
+mpol5it
+mpo2t
+mpov5
+mp3to
+mp5tr
+m3pu
+m5q
+m3r
+m4ry
+4m1s
+msel5f
+m5si
+msol4
+mtu4
+muck4e
+muff4
+mul1t2
+m5unc
+mu5nio
+mun3is
+mus5co
+mu4se
+mus5ke
+mu3til
+m1v
+m3w
+2my
+5my3c
+my4d
+my3e
+3myi
+5myst4
+3myt
+n1a
+2na.
+na2c
+nach4
+na5cious.
+na5ciousl
+nac4te
+nac5tiva
+na5culari
+na4d4a
+nadi4
+nad4op
+n2ae.
+naffil4
+nag4a
+n4agen
+5na5geri
+na4gi
+n5ago
+5n4a3gr
+5nah
+5nail
+na5iv
+nak2
+4naled
+n5alg
+n4alia
+na3ly
+1nam
+3name
+nam4n
+na5nas
+nannot4
+nan4ta
+nan5ted
+nan4to
+na5o
+4n4ard
+nar5tisti
+n2as
+nas5i
+nas5p
+nas3s
+nas5te
+nat5al
+na5tat
+n4atee
+na3the
+nath4l
+nati4
+n4ati.
+nat5ic
+n4ato.
+na3tom
+na4tos
+nat4r
+na5turi
+naugh5ti
+naus3
+3naut
+naut3i
+na2v
+na5vel
+n3b4
+nbarric5
+nbeau4
+nbe4n
+nbene4
+nbet4
+nbit4
+n1c2a
+n4cal.
+ncarn5at
+ncel4i
+ncent5ri
+n4cept.
+n3cer
+ncer4e
+n4ces.
+n5cet
+n5cey
+n3cha
+nch4ie
+n3cho
+nch5olo
+n3chu
+n4cic
+ncid5en
+n4cif
+ncip5ie
+n1c2l
+n4cles
+ncoc4
+nco5pat
+n1cr
+nc1t
+nc4tin
+nct4ivi
+nct2o
+n1cu
+ncu4lo
+n4cun
+n4curvi
+ncus4t
+4nd
+n2da
+n3da4c
+n3dal
+n4dale
+n3dam
+nd3anc
+nde2
+n3dea
+nde3ci
+n1ded
+nde4l
+ndeleg4
+nd3enc
+ndepre4
+n3derl
+nde4s
+ndes5cr
+n5dez
+nd4hi
+n1dic
+ndic5u
+ndid5a
+n3die
+nd5ily
+nd4ine
+nd3ise
+nd5is4i
+nd5ism.
+nd5ity
+nd3ler
+nd1li
+n5doc
+ndor4
+n2dou
+nd5our
+ndrag5
+ndram4
+n5dron
+ndu4b
+nduct5iv
+n4dun
+nd2we
+n3dyi
+2ne.
+ne3alo
+n3ear
+ne2b3u
+5neck
+ne4cl
+ne2co
+n5ectom
+2ned
+3nedi
+ne4du4
+neg3a
+ne3go
+5negu
+neis4
+2nele
+ne5lia
+neli4g
+n4ely
+ne2mo
+4n1en
+n3end
+neo3l
+neon4
+ne2p
+n1er
+4nered
+5nering
+ner5o
+ner4r5
+ner2v
+nerv5in
+2nes.
+n1esc
+ne3sia
+1ness
+n1est
+nes3tr
+net3a
+net3ic
+ne4tog
+net1r
+neuma5to
+neut5r
+nev5er
+n4ew
+news3
+n4eys.
+n3f
+nfo4
+nform5er
+nfortu5
+nfran3
+4ng
+ng2a
+n4gae
+n5gee
+n3geri
+n5gero
+ngh4
+n2gi
+n5gic
+ngio4g
+n5glem
+n3glie
+n5glio
+ng1n
+n1go
+n4gry
+n1gu
+n2gum
+n1h2
+nhab3
+nho4
+nhy2
+nhyd5
+n1i
+4ni.
+3niac
+ni3ba
+n4icab
+ni4cen
+4nicl
+nict5a
+ni4cul4
+ni4dio
+n2ie
+ni4ers
+nif4f
+nift4
+nif5ti
+ni2g
+night5i
+n3igm
+3nign
+nik5e
+n2il
+nil4a
+n3im1
+n4ime
+5nimet
+n4ines
+nin4j
+5ninn
+n4inu
+5niol
+ni1ou
+3nipu
+5niq
+n4is.
+n4isk
+nis4l
+nis4o
+n5iss
+nis5ter.
+nis5ters
+nitch4
+ni4te
+ni3tho
+n4itos
+ni5tra
+nit5res
+ni3tri
+nit4ur
+n2iv
+niv4a
+ni3vo
+nivoc4
+niz5en
+n1j
+njam2
+njur5i
+4n2k
+nk5ar
+n5kero
+n3key
+nk5if
+nk5il
+4n1l2
+nland5
+n3le
+nlet4
+n3m
+nmater4
+nmor5ti
+n1n4
+nne4
+nnel5li
+nnerv5a
+n3ni
+nni3ki
+nnov3
+n5nyi
+4no.
+n5obi
+no5bil
+nob4l
+no5blem
+nobser4
+n5ocula
+no4di
+n4ody
+noe4c
+no4fa
+nois5i
+n5ol.
+no3la
+nol4i
+nom3al
+1nomi
+no2mo
+4none
+3nonic
+5nood
+nop5i
+nora4t
+nor5di
+nor4ia
+nor4is
+nor3ma
+n4oro
+nor4t
+n4os.
+nos4o
+no3sp
+not1a
+3note
+n1ou
+n4oug
+3noun
+2nous
+nou5v
+nova4l
+nove2
+nov3el
+novel5e
+n4ow
+now5er
+now3l
+n3p4
+npil4
+npla4
+npoin4
+npo5la
+npos4
+npri4
+n1q
+n4quef
+n1r
+nre4i
+nre3m
+nres5tr
+4n1s
+ns2c
+n2sco
+ns3cot
+n4scu
+n5sec
+nsec4te
+n2ses
+n5seu
+n3sh2
+n2si
+ns3ib
+n4sic
+n5sick
+n3sid
+n3sie
+ns5ifi
+ns3ing
+n3sio
+n3s2is
+nsi2t
+ns3iv
+nsolu4
+n5son
+n4sore
+n4sory
+n3spir
+n3s2t
+nsta4
+nstil4
+n3su
+nsur4e
+n3swa
+ntab4u
+nt3age
+nt1al
+n4t3anc
+nt5and
+ntan5eo
+n4t3ant
+nt4ariu
+n5tasis
+nt3ast
+nt1at
+nt5ath
+nt3ati
+nt5ativ
+n5tau
+n1te
+n4tec
+n4tee.
+n4tees
+n3tel
+ntend5en
+n4teo
+n4ter.
+n3teri
+n5tern
+ntern5al
+nter5nat
+nth2
+n1the
+nther5
+nth5ine
+nt2i
+nt4ib
+n4tic.
+n5ticis
+n5ticiz
+n4tics
+ntic4u4
+n3tid4
+n1tie
+n4tify.
+n3tig
+nt5ilati
+n5till
+nt3ing
+nt5ing.
+nti3p
+n4tipar
+n4tis.
+nt3ism
+nt3ist
+n5titio
+nt3iz
+n2tj
+n1t2o
+n3tom
+ntoni4
+n5top
+n1tr
+ntra3d
+nt3ral
+n4trant
+n3trat
+nt5ress
+nt3ril
+ntrol5ler
+n5trym
+n1tu
+n3tua
+ntub5
+ntup5li
+n5tur
+n2ty
+n2u
+nu1a
+5nuc
+3nud
+nud5i
+nu3en
+nug4a
+nu3i
+nu4is
+5nuk
+n4ulo
+n3ult
+nultim5
+nu1me
+5numenta
+5numer
+5numi
+3nunc
+nu3tat
+n5utiv
+nu4to
+nu1tr
+n3v2
+nve2
+nvel3
+nven4e
+nven5o
+nvers5an
+nvi4t
+nvoc5at
+n5w
+nwin4
+nwom4
+n2x4
+2ny2
+5nyc
+nym5it
+nyth4
+n1z2
+nzy4
+2oa2
+o5ace
+o3act
+oad5er
+oad5i
+o3ag
+oak5er
+o3ales
+oal4i
+oal5in
+o5alit
+oan4t
+oap5i
+oar5er
+oar4se
+oast5er
+oat5a
+oat5ee
+oat5er
+4oba
+obe4l
+ob2i
+ob3ing
+2obi3o
+ob3it
+o3bla
+ob1li
+4obo
+ob3oc
+o5bol
+o5bot
+o3bra
+obrom4
+ob5t
+ob3ul
+o3bus
+2oc
+oc2a
+o4cab
+o3cad
+oc5ag
+o5calli
+o4c5ativ
+oc5ato
+4o3ce2
+o4cea
+ocen5o
+ocess4i
+och4e
+och5in
+o3chon
+ochro4n
+o5chu
+oci3ab
+oci4al
+o1cl
+o2cle
+o1cr
+ocre3
+oct2
+oc2te
+oc1to
+ocu4lu
+ocum4
+oc5uo
+ocuss4
+ocus5si
+ocut5r
+o1cy
+o5cyt
+ocyt5o
+od3al.
+ode4c
+o5deg
+ode4ga
+o5dend
+o3dent
+odes4
+od3ica
+o4d1ie
+od3iga
+od4il
+od1is2
+odis5ia
+od5it
+5odiz
+od3li
+o2do
+od5olo
+od5ous
+o3dro
+od5ru
+o2du
+odu5cer
+o4duct.
+o4ducts
+od3ul
+o5dyt
+oe3a
+oe4bi
+oe5cu
+oe4d
+o5ee
+oe5ic
+o3elec
+oelli4
+oelo4
+oe3o4p
+oep5
+o5eq
+o3er
+oes3t
+o1et
+o4et.
+oet3i
+oet4r
+3oeu
+o3ev
+o3ex
+oflu4
+4ofo
+o4ful
+ofun4
+2o1g
+o2ga
+o3gam
+og5ar5
+o3gas
+ogen1
+o5gey
+o3gi
+o4gio
+og2na
+ogoni4
+o4got
+o2gri
+o4gro
+og4sh
+o2gu
+o5gyr
+o1h2
+o3ha
+ohab3
+o3he
+oher4er
+o3ho4
+ohy4
+2oi
+oi4c
+o3ic.
+oi5ch
+o2i4d
+4oide
+oig4
+oi5ki5
+oil3er
+oil5i
+oin3de
+o3ing
+oin4t5er
+oin4tr
+oi4o
+4ois
+o3ism
+oi4t
+oit4al
+oith4
+o1j
+ok4ine
+ok3l
+ok5u
+ola4c
+o4lack
+o5lali
+ol4an
+olan5d
+ol5ast
+olat5er
+ol5ch
+ole2c4
+ol5eci
+ol5efi
+o3leo
+ole4on
+o3lep
+ol1er
+o3lest
+o3leu
+o1lia
+ol3ica
+o3lice
+ol5iciz
+ol5ick
+ol3ics
+ol5id.
+oli2e
+o3lier
+ol5ies.
+o5lif
+oli4f3e
+oli5go
+o5lina
+ol3ing
+oli5os
+ol5ip4
+olis4
+ol2it
+olle2
+ollim3
+ol4lope
+ol4lyi
+ol3mi
+o1lo
+4oloc
+ol3oid
+o4lona
+olon5el
+ol1or
+o3los
+ol1ou
+4ol1ub
+o3lumi
+o5lunte
+ol3us.
+oly3ph
+4olyt
+2om
+o1ma
+o4mab
+o2mac
+o2mal
+o4mane
+omast4
+o3mat
+om4be
+ome4d
+ome4g
+omeg5a
+ome3li
+om3ena
+omen4t
+o3meri
+om1i
+o3mia
+omi2c
+omic5r
+om4ie.
+omil4
+om4iny
+omiss4
+om2it
+omme4
+om2na
+omni3
+o4moi
+omoli3
+o2mo4n
+om5ony
+o4mos.
+omot5iv
+o2mou
+om5pil
+ompt5er
+ona4d
+on3ai
+o5nas.
+onast5i
+on5ativ
+4onau
+on1c
+oncat3
+on4cho
+5ond5ar
+ond5ent
+on3der
+on3dr
+on5dy
+o2ne
+4onea
+onec4r
+4oned
+on1ee
+on5ell
+o3neo
+on3ess
+on1et
+ong3at
+on4gu
+4onh
+4o1nia
+on5iar
+2oni4c
+onic5a
+onical4
+on4id
+on3ies
+on3if
+o5nig
+o1nio
+onk4s
+4onnes
+on5odi
+on5oi
+ono4mi
+4o5nomic
+ono3s
+o5nota
+ons2
+2ont
+ont5ane.
+on4ter
+onti5fi
+onton5
+ont4r
+on4tre
+on5ur
+o5nus
+onvo5lu
+on2z
+2oo
+oof3er
+oo1i
+ook3er
+ook3i
+oo4le
+ool5ie
+oo4m
+oon3i
+oo2p
+oop4ie
+o3opt
+oo4se
+oost5er
+oo2t
+oot3er
+ooz5er
+o1pa
+o4pab
+o5pali
+opa5ra
+opath5
+o5pec
+opens4
+op1er
+3opera
+4operag
+o1pha
+o4phe
+oph4ie
+o5phil
+op5hol
+o1phy
+ophy5la
+op1i
+op3ies
+op5ing
+o3p2it
+4opl
+oplast4
+o4poi
+opol3i
+opon4
+op5ony
+op5ori
+opoun4
+o2p5ov
+op2pl
+op5pli
+oprac4
+op3ran
+opre4
+opro4l
+op5rop
+op5so
+1op1t
+op2ta
+op1u
+o5quial
+or1a
+or5ado
+ora4g
+o5rai
+or5al
+4orals
+oram4
+oran3e
+orator5
+orb3in
+or4ch
+orch3i
+or4du
+2ore
+or5ead
+ore5ar
+ore5ca
+ore3f
+ore3g
+or3ei
+oreo5l
+or3esc
+ore3sh
+or3ess
+orest5at
+or5este
+or5ett
+ore4v
+5orex
+or4fr
+or5gn
+or1i
+4ori.
+or3ia.
+4orian
+ori4ci
+ori5cid
+orien4
+or3if
+5orig
+ori5ga
+ori4no
+4orio.
+or5ion
+4orios
+ork5a
+2orm
+orm1i
+or3n4a
+5ornis
+or3nit
+or3one
+o5roo
+or5ose
+or5oso
+or1ou
+orrel3
+orres3
+or4sc
+or4sey
+or4sti
+2ort
+ort3an
+ort3at
+ort3er
+or5tes.
+or3thi
+or4thr
+or4tit
+ort3iz
+or4tor
+or5tra
+ort3re
+4or1u
+or4un
+ory5p
+osa5i
+os3al
+osar5
+o1sc
+os4ca
+os4ce
+o2sch
+o4sci
+osclero5s
+o3sec
+osec3u
+ose5g
+os5enc
+osens4
+os5eo
+oser4
+o2set
+os5eu
+o3sia
+osi4al
+osi4an
+os5ide
+o3sier
+os5if
+os1in
+o4sis
+o5ske
+o5son
+o3soph
+os3opo
+4osp
+o3spec
+os1pi
+os4sa
+oss5ar
+os4sit
+4osta
+ost5age
+os4tar
+os5tee
+os5ten
+osten5t
+ost5ica
+os3til
+o5stome
+ost3or
+4osu
+os1ur
+2ot
+ot3a4g
+o5talit
+ot3am
+ot4anic
+o3tap
+ot4atio
+o5ta5v
+o3tax
+o4ted
+oter4m
+ot5esta
+4oth
+othalam5
+oth5erin
+o5therm
+otherm5a
+o5thor
+o5tia
+o5till
+5ot5iniz
+ot4iv
+o3tiva
+o5tivi
+o1t2o
+o5tone
+o4torn
+o4tou
+4o1tr
+oturi4
+oty3le
+o4u2
+5ou3a
+oub2
+ou5br
+ou5ca
+ou5co
+oud5i
+4oue
+ou3et
+oug4
+ou5ga
+ought5i
+ou5gi
+oul4t
+oult5i
+ou3m
+2oun
+oun2d
+ound5a
+ound5el
+oun5gin
+oun3tr
+oup5li
+our3er
+ou5san
+2ouse
+5ousia
+ouss4
+out5ish
+ouv5a
+ova3le
+o5var
+4ovati
+ov5eling
+o4ver.
+over3b
+over3s
+ov4ete
+ovid5en
+o1vis
+ovis5o
+o2v5os
+ow3ag
+ow3an
+o5way
+owd4i
+owd3l
+ow1el
+owel5li
+ow5ha
+owhith4
+ow1i
+ow5in
+owi5ne
+ows4
+ow5sh
+ow5sl
+ow5y
+o4x
+ox3i
+oxic5ol
+ox5o
+2oy
+oy5a
+oys4
+2oz
+o1zo
+ozo5i
+o3zyg
+4pa.
+pac4te
+pa5dou
+pad4r
+paes4
+pa3gan
+4pagat
+pag4ati
+pain2
+4pairm
+pa5lan
+pal3in
+pa3lo
+p4als
+pan5ac
+pan1e
+pan3i
+pa4pa
+pa3pe
+pap3u
+pa3py
+1par
+para5s
+par3l
+pa3roc
+pa3rol
+par5on
+1p4as
+pass5ive
+pas1t
+pas4tin
+pa3ter
+pati4n
+p5ato
+pat4ric
+pa5tricia
+5pau
+paul5e
+pau3p
+pa5vil
+5paw
+pawk4
+paw5ki
+2p1b
+p1c4
+p5d2
+2pe.
+pearl5i
+pe4co
+pec4tu
+2ped
+5ped3a
+3pede
+3pedi
+ped3is
+3peds
+pe2du
+p4ee
+pe2f
+4pele
+pe5leo
+pel5v
+pen4at
+5p4enc
+pend5er
+pen5dr
+pen4ic
+3p4enn
+pens5ati
+pen5u
+pe5on
+5perc
+percent5
+4pere
+perem5i
+p4eri
+5p4er3n
+p3eron
+per4os.
+per5tin
+pert5is
+per3v
+p4ery
+2pes
+pes4s3
+pes5til
+3pet
+pet5all
+pet3en
+pe2ti
+pet3r
+pe4wa
+4pex
+p1f
+p5g
+2ph.
+4phae
+pha5ged
+ph5al.
+ph2an
+phant5i
+phe4
+ph5esi
+ph3et
+3phib
+4phic
+1phil
+phi4n
+ph1is
+phi5th
+ph2l
+1pho
+4phobl
+4phoned
+3phor
+ph5oriz
+phos3p
+ph3ou
+3phra
+4phs
+1phu
+phu5i
+2phy.
+3phyl
+4pi.
+3piar
+4pica
+p5ical
+pi3co
+pi4cr
+pict4
+p2ie
+p4iest
+pi5eti
+p5ifie
+pig3n
+p2il
+3pile
+pill5in
+5pilo
+pi3lot
+pim2
+pin4e
+pin5et
+3pinge
+p4inn
+5p4ins
+3pi1o
+pip4a
+pi4pe
+5piq
+pir5ac
+pir4t
+p4is.
+p4isc
+pis2s
+piss5a
+pis5til
+pis4tr
+p2itu
+2p3k2
+p2l2
+1pla
+pla5no
+plant5er
+plas5tici
+pla5t4o
+4ple.
+4pled.
+3pleg
+3plen
+2ples
+4plism
+4plist
+plu2m
+plum4be
+plumb5er
+p4ly
+2p1m
+2pn
+pnos4
+1po
+4po.
+po3ca
+3pod
+4pof
+2p5oid
+pois5i
+po5lemic
+po4ly1
+poly3s
+poman5
+pom4e
+p4o2n
+pon4ac
+pon4ce
+pon4i4e
+3ponif
+pon5ta
+2pony
+po4pa
+po5ple
+4porato
+por3ea
+4pored
+pori4f
+por3p
+3port
+por5tie
+3p4os
+pos1s2
+po1te
+poult5e
+pound5er
+pout5er
+p5oxi
+5poy
+4p1p2
+ppar3
+pparat5
+p4pene
+ppet3
+pph4
+ppi4c
+p4pled
+p5pler
+p5plet
+ppress5o
+pprob5a
+1pr2
+prac1
+pra5d
+prar4
+4pre.
+preb3
+pre1d
+pref5ere
+prel5ate
+3prem
+pre5mat
+pren3
+pres3a
+pre5scin
+p3rese
+5pressi
+5prici
+pri4es
+4pri4m
+pring5er
+pring5i
+4prio
+p5riol
+pri4os
+pris5in
+priv2
+4priva
+4pro.
+pro3bo
+p3roc3a
+pro4ch
+pro1l
+pron4a
+proph5e
+propyl5
+pro3r2
+pros4i
+pros5tr
+pro3th
+4pry
+2ps2
+p3sac
+psal5t
+p3sh
+p1si
+p5sin.
+pso3m
+p1st
+psul3i
+3psyc
+2pt2
+pt3ab
+p4tad
+p4tan
+p2tar
+pt5arc
+p1ted
+p5tena
+pt5enn
+5ptery
+p5tet
+pt4ic
+p5tie
+p3til
+p2t3in
+pt4ine
+p3tise
+p5tisi
+p5tom
+p4tr
+p1tu
+pub1
+pu5be
+puc4
+puch4
+pudi4c
+pu5er
+puff5er
+pu4lar
+pu5lar.
+pu5lis
+p4u4m
+pum4o
+p4un
+pun4a
+3punc
+pun5gi
+pun3i
+pun2t
+pu3pi
+pur5b
+pur3c
+p4us
+push4ie
+pu3tat
+p5u5tis
+pu3tr
+4p1w
+2p4y
+py3e
+3pyg
+3pyl
+pyr3e
+py5t
+4qf
+qu4
+5quak
+4quar
+qua5tio
+2que.
+3quera
+4quere
+4ques.
+1quet
+5quina
+5quir
+3quito
+4quitu
+4ra.
+ra3ba
+5rabe
+3ra3bin
+r2abo
+ra3bol
+rac4a
+r2acu
+rac5ula
+ra5culo
+r2ad
+ra4de
+rad4ine
+rag5ou
+ra3gr
+3raill
+ra5ist
+4ralia
+ra3ly
+r5amn
+ra3mu
+r4andi
+ran5dish
+ran4du
+ra5nee
+ran4gen
+ra3nia
+ra3noi
+ran2t
+ran5ted
+5rantel
+rant5in
+rant5o
+rapol5
+rap5to
+4rarc
+rare2
+rar3ef
+rar5ia.
+ras2
+ras3c
+r2ase
+r4ask
+ra3so
+rass5a
+rass5in
+r4as5te
+ra5tap
+ra5tat
+rat5eu
+rath4e
+rat3if
+rat4in.
+ra5toc
+5ra5tol
+4r4atom
+ra4tos
+ra5tui
+rat5um
+rat3ur
+rav5ai
+rav5eli
+rav3it
+rawn4
+ra3zie
+r1b
+r2ba
+r4bag
+rb3ali
+rb1an
+rbar3
+r2be
+rbe5c
+r3bel
+rbel5o
+rb3ent
+r4bes
+rb2i
+rbic4
+rbic5u
+r2bin
+r5bine
+rbit1
+r2bos
+r4bum
+rbu5t4
+r1c2
+rcant5
+rca4s
+r4cele
+rcen5er
+rcen5tena
+r2ces
+rcha3i
+rch3al
+rch5ard
+rch5ate
+r3cheo
+r4cher
+rch4ier
+r4chin
+rch3is
+r3chit
+rcil4
+rci5nog
+rcis2
+rciz4i
+r2cl
+r4cle
+r5clo
+rcolo4
+rcrit5
+rcriti4
+rct4
+rc5ti
+r5dam
+r4d1an4
+rd4an.
+r2dar
+r5de4l
+r3dens
+r4des
+rd5ess
+rd5ian
+r4die
+r5dig
+rd2in
+rd3ing
+rdi3o
+rd1is2
+rd5ler
+rd3li
+r4dol
+rd5ous
+r2e
+4re.
+rea4
+r4ea.
+react5iv
+re3af
+re3ag
+re5alt
+re5amb
+re3ani
+re5ant
+re5asc
+reas3o
+r5eau
+3reav
+r5ebrate
+reb5uc
+re3cal
+rec4ce
+re3ce
+reced5en
+re3cha
+reci5si
+r4e1c2r
+rec4t3r
+re3cu
+2r4ed
+re1de
+re3dis
+re4dol
+re1dr
+reed5i
+ree3m
+3reer
+re2fe
+re3fin
+re5gali
+re5gra
+re3gre
+reg3ri
+re3gro
+reg3ul
+rei4
+re3if
+re1in
+re3is
+reit3
+reit4i
+re1la
+re1le
+4reled
+re3lia
+rel3ic
+re5lig
+reli4q
+rel3li
+r5em.
+rem5ac
+reman4d
+rem5ato
+r3emp
+rem5ul
+rena4
+ren5at
+r4endi
+rene2
+ren4es
+r4eni
+renic5
+ren4it
+ren4ter
+re5num
+re3oc
+3reog
+re5ola
+re3oli
+3reos
+re1pe
+re4per
+re5ph
+rep5id
+re3pin
+re3ple
+re4pre
+re1q
+rer4a
+rere4
+re5rea
+re3r2u
+2res.
+re3scr
+re3sel
+re3sem
+re3ser
+res5ist
+re5sit
+re3spe
+r3esq
+re5stal
+rest5er
+re5stu
+3retar
+re3ten
+re4t4er3
+re5term
+re1t2o
+re5ton
+re3tra
+re3tre
+re5tri
+re3tu
+re3un
+reur4
+re1v
+rev3el
+revi4t
+r1f
+rf4l
+rfu4m
+r1g2
+r4gag
+rgal4
+r2ge
+r5gee
+r4gene
+r3geo
+r3ger
+rg5li
+rgu5f
+rh2
+r5hel4
+rhe5ol
+rhos4
+3r2hy
+4ri.
+ri3am
+ri5ap
+2r2ib
+ri3bo
+rica5tu
+2rice
+rich5om
+rick4en
+r4icl
+ri5cli
+ri3col
+ri5cor
+ri4cra
+2ricu
+rid4al
+rid4e
+ri5el
+ri3er
+ri2es
+rift5er
+rif5tie
+5rifuga
+ri5gam
+rig5ant
+ri5l4a
+r4ile
+rill5er.
+rill5ings
+4rim.
+ri2ma
+rima4g
+rim5an4
+rim3at
+r4imb
+rimen4
+4rimm
+4rims
+rin4e
+r4inet
+ring5ie
+rink5er
+r4ino
+rin4s
+rins5i
+rin4t5er
+ri3o
+rio4g
+5rione
+ri4op
+ri5or
+ri5p2a
+ri5pie
+rip5lica
+ri5r
+ris4c
+ris4is
+r2isp
+ris4pa
+ris4pe
+ris5ter
+4risti
+ri3ton
+r5it5r
+r2i4v
+riv4al
+ri5vall
+riv5eli
+riv3en
+riv3il
+5ri5zo
+r1j
+r2k
+r5kas
+rk5ati
+r5kell
+rk5eni
+rk1er
+r3ket
+r3key
+r3kier
+r5kiest
+r5kin.
+r5kins
+rks4me
+r1la
+rlat3
+r1le
+r3l4ic
+r3line
+r5lins
+r4lit
+r1lo
+r3mac
+rma5ce
+r5mad
+r2mal
+r4manc
+r4mano
+r4mari
+r4mary
+rm4as
+r4m3ati
+rma5toc
+r5ma5tol
+rme2a
+r2mic
+rm4ica
+r5m2id
+rm4ie
+r5mig
+rmil5
+rmin4e
+rm3ing
+r4ming.
+r4mite.
+r3moc
+rmol4
+r1mu
+rmu3li
+r2n2
+rn3ab
+r3nac
+r5nad
+rn5ar
+rn3ate
+rn5atin
+rn5edl
+r3nel
+r3ness
+rn5est
+r3net
+r3ney
+r5nia
+rn5ib
+r3nic
+rn3in
+rn4ine
+r1nis
+rn3ist
+rni5v
+rn3iz
+rn5n
+r3noc
+r5nog
+rnt4
+rnuc4
+r5nut
+4ro.
+ro4be
+rob3le
+ro5br
+5rocc
+ro3cu
+r2od
+ro3do
+rody4n
+ro1fe
+ro3gn
+4roi
+ro3ic
+roid3
+ro3la
+r4oled
+rol5ite
+ro3ly
+romant4
+ro5mel
+ro3mit
+romolec5
+rom4p
+ro3mu
+ron4ac
+4ronal
+ro5nate
+ron5ch
+ron4do
+rong5i
+r5onme
+ro1no
+ron4ton
+roo4
+1room
+5root
+r2op
+4rop.
+ro3pel
+rop4ine
+r4opr
+r5opte
+ror5d
+4rore
+r4osa
+rosi4a
+ro5sol
+4ross
+ro5stat
+ros4ti
+ros5tit
+ro3tat
+ro1te
+ro4ter
+ro3tu
+5roue
+roul3
+round5er
+rou5sel
+4rouss
+r4out
+r4ow
+row3er
+4rox
+rpass5in
+rp3at
+rpe2
+r3pent
+rp5er.
+r2ph
+rph5e
+r3phol
+rp3ing
+rp5is
+rpol3a
+r2p5ou
+rpre4
+rpret5er
+r3pu
+r1q
+4r1r4
+rra4h
+rran5gi
+rrap4
+rre2l
+r4reo4
+rrhe3
+r3ri
+rric4
+rricu4
+rri4fy.
+rrin5ge
+rri4os
+rrob3
+rrog5
+rro4t
+r5ru
+rry5
+r3ryi
+r3rym
+2r1s2
+r4sag
+r2sal
+r5salis
+r5saliz
+r2san
+r4sar
+r2se
+r3sea
+r3sec
+rsel4
+rsell5
+rs3er.
+rs3ers
+r3set
+r3sha
+r3shi
+r4shie
+r5si2a
+rs3ib
+r5sie
+r4sil
+rs3ing
+r3sio
+r4sit
+rs3iv
+rs5li
+rstor4
+rstrat4
+r3su
+r4sus
+rswear4
+rt2
+rt3ab
+rta4g
+rt3age
+r3tar
+r4tare
+rt3c
+r1ted
+r4tedl
+r3tel4
+r5tend
+rt3eni
+r5terer
+r5tet
+r5teu
+r4thene
+rth2i
+rth5ing.
+rth3ri
+r1t4ic
+r4ticl
+r5tiet
+r5tila
+r5till
+rtil5le
+rt5ily
+r2tin
+r3tina
+rt3ing
+r3titi
+rti5tu
+rt3iv
+r2tiz
+rt5let
+rt3li
+r1t4o
+rto5l
+rt5rid
+rt5si
+r1tu
+r4tus
+rtwis4
+ru3a
+r4ube
+rub3r
+ru4ce
+r2ud
+rue4l
+r4uf
+ru3in
+ruis5i
+ru2l
+r4ume
+r4umi
+ru4more
+run4cl
+runcu4
+runcul5
+run2d4
+run2e
+ru5net
+run4g
+run4t
+ru2p
+rup5lic
+ru3pu
+rur4i
+rus4p
+rust5at
+rust5ee
+rus5tic
+rus4t5u
+ru3tal
+ru3ti
+r1v2
+r4vanc
+r2ve
+rvel4i
+r3ven
+rven4e
+rv5er.
+rv5ers.
+r3vest
+r3vet
+r3vey
+rvi4t
+r1w
+2r2y
+ry5er
+5rygm
+ry4go
+rym4b
+3ryngo
+4ryngol
+ryp5a
+ry2t
+ryth4i
+r2z
+2sa.
+2sab
+s3abl
+5sack
+sac4q
+s3act
+sac4te
+sad5i
+sad5o
+5sae
+sa4g
+3sai
+sain4t
+5sak
+sa2l
+sa5lac
+3sale
+sa3lie
+s4al4t
+sa3lu
+sa4m
+sa5min
+sam5o
+samp4
+san3a
+san4ded
+s4an4e
+san5gar
+san5if
+2sant
+sant5ri
+s3ap
+sap3r
+sar5s
+3sas.
+sas3s
+sassem4
+s2a1t
+sa2te
+s5ativ
+s5atory
+sat1u
+1sau
+sau5ci
+saur5
+savi2
+sa3vou
+4s3b
+s4bei
+sbe4s
+sby3
+sc2
+s1ca
+sca5len
+sca2p
+scar4c
+scav3
+s1ce
+s4ced
+4scei
+4s4ces
+sch2
+scid5
+s2co
+scof4
+s4coi
+3s4cope
+5scopic
+5scripti
+2s1cu
+4scura.
+4scuras
+2s1d2
+2se.
+se2a
+s4eam
+seas4
+sea3w
+sec4a
+sec5an
+se2co
+secon4
+2sed
+se4da
+sed4it
+3seed
+3sei
+sei3g
+5sela
+4sele
+se3lec
+selen5
+5self
+2s4eme
+sem2i
+semi5d
+sem4o
+sen5g
+3sens
+sen5sati
+sen5sori
+sent5ee
+5sentm
+seo5log
+se2p
+sep3a
+sep4si
+3sept
+sep3ti
+ser4an
+se5rene
+ser4to
+4servo
+s2es
+4ses.
+se5sh
+s5esta
+1set
+5seum
+3sev
+sev3en
+sewo4
+3sex
+sexo2
+3sey
+2s1f
+sfact5o
+sfi4
+sfor5e
+sfran5
+2s1g4
+s2h
+4shab
+sh4abi
+sh1er
+sh5et
+shil5li
+sh5iness
+sh3io
+5ship
+s3hon
+4shu4
+shys4
+si4all
+siast5
+4s1ib
+s3icat
+3sicc
+2s5icl
+si4cu
+si5cul
+s4id
+4sid.
+si4de
+side5l
+sid3en
+sid5eri
+4sids
+5sid5u4a
+si4ers
+sif4
+sif5f
+si4g
+1sili
+sim4ply
+2sin
+s2ine
+sin5et
+5sing5er
+sin3i
+5sink
+si5nol
+si3nus
+1sio4
+4sio.
+si5o5s
+3sip
+si4pr
+s1is2
+4sish
+4sism
+sist3a
+sist3o
+s1it
+si4te
+sit5om
+4s1iv
+5siva
+s1j
+s2k2
+4sk.
+s5kar
+ske2
+s3ket
+s5key
+s3kier
+s5kiest
+sk5ily
+sk5ines
+4sks
+sky3l
+2sl4
+slang5i
+s1lat
+3slau
+slav5eri
+s2le
+s5lea
+s3let
+s5ley
+s3lit
+slo3c
+slov5
+s5luc
+2s1m4
+s3man
+smas4
+s3men
+smi3g
+3smith
+smo4d
+smu5tatio
+s1n2
+s2na
+2so.
+2s3od
+sod3o
+sody4
+3soe
+4s3oid
+s2ol
+sol3a
+so5lan
+sol4er
+so3lic
+3solve
+solv5er
+1so2m
+soma5to
+3some.
+so5mete
+so3mo
+s2ona
+son5at
+s4one
+son5or
+s2o2p
+4sor3ie
+5sorio
+sor4it
+s5oriz
+sor3o
+s3ory
+sos4
+4sose
+so5th
+3sou
+sov5e
+so3vi
+spast4
+spens5a
+4speo
+3sperm
+s5pero
+spers5a
+sph2
+s3pha
+3spher
+spic5ul
+s2pid
+sp5id.
+s5pier
+spil4l
+s2pin
+sp3ing
+spi5ni
+spital5
+s1pl
+sple2
+s4ply
+s2po
+5spom
+spon5gi
+3spons
+3spoon
+spru5d
+s4py
+s1r
+sre2
+sreg5
+srep5u
+sre4s
+4ss
+s1sa
+s5sam2
+s1sel
+s5seng
+s3sent
+ssent5er
+ss3er.
+s5seri
+ss3ers
+s5seu
+ssev3
+s3sia
+s1sic
+s1sif
+ss1in
+ss4in.
+s4sine
+ss4is.
+s3s2it
+ss4ivi
+ss5li
+ss3m
+s4sn
+s1so
+ssol3u
+ssolu4b
+s4sore
+ssor5ial
+ss5po
+s1su
+ss3w
+st2
+4st.
+stab2
+sta3bi
+4stak
+s4tale
+stant5iv
+s3tas.
+5static
+st3c
+ste2
+ste5ar
+ste5at
+s4teb
+s4tec
+4s1ted
+s4tedl
+s4tedn
+4stere
+ster4ia
+s4tern.
+s3tero
+st5est
+s1th
+s4tha
+s4thu
+s3ti3a
+3stick
+s3ticu
+stil5ler
+s4tily
+st3ing
+5s4tir
+s5tiz
+4stl
+st3ler
+st3li
+s4toe
+3ston
+stone3
+ston4ie
+s5torat
+stor5ian
+s4tose
+s2tou
+s4tray
+stre4
+strep3
+3struc
+stru5d
+2st3s
+s1tu
+s4tud
+stu4m
+stur4e
+4stw
+s4ty
+1styl
+4su.
+su5an
+su4b1
+subt2
+suct4
+sud4a
+su3et
+suf3f
+sug3
+3sui
+sui5c
+su5ing
+1s2ul
+s4u2m
+sum3i
+sun4a
+su5pe
+su3pin
+supra3
+sur4as
+sur3c
+s4urg
+sur3pl
+su5su
+su5z
+2s3v
+svers5a
+sves4
+svest5i
+sw2
+5swee
+swell5i
+4swered
+2swo
+s2y
+4sy.
+sy4bi
+sy1c
+sy4ce
+sy4chr
+sy4d
+1syl
+3syn
+syn5e
+sy5pho
+syr5i
+2ta.
+2tab
+ta5blem
+3tabli
+t2abo
+ta3bol
+ta4bou
+t4a3ce
+ta5chom
+ta3chy
+ta4cid
+t5ade
+tad4i
+5t2adj
+ta5dor
+tad2r
+tae5n
+taf4
+tage5o
+ta5gog
+3tagr
+3tah
+1tai
+3tail
+2tair
+t4ais
+1tak
+tal2c
+tal5ent
+ta5lep
+t4alia
+t4alin
+tal4l3a
+5tallu
+t2alo4
+ta3ly
+tam5ari
+5ta3met
+tamorph5
+tan5at
+tand5er
+t4ane
+5tanel
+tan5ie
+t5aniz
+tant5an
+ta4pa
+1tard
+tar5ia.
+tark5i
+tar3n
+3tarr
+tas3i
+t3asm
+5tass
+tas4t
+ta3sta
+tast5i4c
+t4ateu
+3tatis
+t4ato.
+tat4ou
+tat4r
+tat3ut
+tau3to
+t5awa
+tawn4
+t4ax
+4t3b
+2tc2
+t1ca
+tcas4
+tch5ett
+tch5u
+4t1d4
+4te.
+te5cha
+5techn
+te3cr
+t4ed
+te5d2a
+4tedd
+4tedo
+4teei
+te2g
+5tegic
+t3ego
+teg1r
+teg3u
+tei4
+te2l
+4teled
+tel5iz
+1tell
+4te3lo
+3tels
+tem3a
+4teme
+te5mon
+ten4ag
+4tenar
+4tene
+t5enm
+5tenna
+4teno
+te5nog
+tent4a
+te2o
+teo5l
+2tep
+te3pe
+tep5i
+tera4c
+t4erag
+t4erato
+3ter3b
+5terd
+2tere4
+ter3eb
+ter5ec
+5terel
+te3reo
+3teres4
+1teri
+ter3ia
+ter5id
+ter5if
+t4erin
+ter5iorit
+ter3it
+ter5k
+5ternit
+ter5no
+3terr
+2t2es
+4tes.
+tesi4
+t3esq
+t3ess.
+t5esses
+tes4t
+test3a
+5teste
+test5er
+test5in
+test5or
+tes5tu
+teti4
+tet1r
+tetr5o
+tew3ar
+3tex
+2t3f
+t3g
+2th.
+tha4
+th5al.
+thal3m
+4the.
+4thea
+th5eas
+4thed
+1thei
+3theo
+theo3l
+t4her
+5therap
+th5erc
+t5herd
+4thered
+th3ern
+th3ery
+4thi.
+t5hill
+3think
+5th4io
+th4is.
+th5lo
+2thm2
+th4mi
+th3oli
+4t5hoo
+4thopt
+4thores
+3thot
+5thoug
+1th2r
+2ths
+5thur
+5thym
+3thyr
+thys4
+4ti.
+1ti2a
+ti3ab
+2t3ib
+5ti5bu
+t1ic
+t3ic.
+tic5as
+t2ici
+tici5ar
+3ti3cin
+t4icity
+ti3col
+tic1u
+4ticule
+t3id.
+t4ida
+3tidi
+ti3die
+t5ids
+3ti2en
+1tif2
+ti3fe
+4tiff
+4tific.
+3tigi
+tigi5o
+4tigm
+5tigu
+ti4ka
+ti4let
+5tilin
+t4ill
+til4l5ag
+t4ilt
+1tim
+tim1a
+5timet4
+t1in
+5ti5nad
+4tined
+tin3et
+ting5ing
+3tinn
+4tins
+t4int
+tin4te
+tin5ted
+tint5er
+tin3ue
+1tio
+ti3oc
+tiol3a
+ti5omo
+4tionem
+1tip
+ti5plex
+ti3pli
+ti4q
+ti5qua
+t3iris
+2t1is
+3tisan
+tis4c
+tish5i
+3tiss
+tis2t
+5t4iste
+t4istr
+ti5t4an
+tith4e
+tit5il
+t3itis
+3titl
+ti3tra
+3tiu
+2t1iv
+tiv5all
+t3ive
+tiv3is
+2tl
+t1la
+tlant4
+5tleb
+5tledr
+3tlef
+3tlem
+5tlen
+5tletr
+5tlew
+t1li
+tlin4
+4t3m
+tmet2
+tmo4t5
+2t3n2
+t4nere
+2to.
+toas4
+to1b
+4tocc
+tode5c
+tod4i
+to5do
+3toe
+1tog
+2t3oid
+5tok
+4toled
+tol4l
+tolu5
+to5ly
+tom3ac
+toma4n
+tomat5ol
+tom4b
+to4mog
+tom5os
+ton4e
+ton5ea
+3tonn
+ton3s
+top4e
+to5pia
+to4pos
+t1or
+to5rad
+4tore
+tor5er
+tori4as
+tor5oi
+tor5p
+tor4q
+3tos.
+to3s4p
+tos4t
+to5str
+to5talis
+to5taliz
+to3tem
+tot5u
+tou4f
+5tour
+t3ous
+4tov
+to3war
+t3p
+tr2
+tra4co
+4tradd
+4traist
+tra5q
+trarch4
+tra5ven
+tra5vers
+trav5est
+3tray
+4tre.
+4tred
+tre4mo
+tren4
+trend5i
+tre5pr
+tres4s
+4trew
+t5ricl
+3tricu
+t2rie
+tri5fli
+trifu5ga
+2tril
+tri3li
+tri3me
+t2rit
+4trix
+t4rod
+tro5f
+5troop
+tro4pha
+tro3sp
+t2rot
+t5roto
+tro1v
+3troy
+t4ruc
+tru3i
+2t4ry
+trys4
+4t1s
+t2sc
+ts4h
+ts2i
+t4sil
+tstay4
+2t1t4
+tta4
+t3tab
+t5tan
+t5tas
+t3ted
+t4tere
+t5terer
+t5test
+t3ti
+tti3tu
+ttitud4
+ttitu5di
+t3tler
+t3tli
+t5toi
+t5tor
+t3tos
+tt5s
+t4tupe
+t2ty
+4tu.
+tu1a
+tu4al5li
+tuari4
+tu4bin
+tu5bu
+tu5den
+tud5ie
+tu5en
+4tuf
+tu1i
+tu4is
+2tum.
+3tumi
+4tums
+3tun
+tun4a
+tu4ne
+tun5it
+tup5let
+tup5lic
+tu5rac
+t4uran
+turb3a
+tur4d
+turf5i
+5turit
+tur4n
+5tur5o
+1tut
+4tut4iv
+t1w
+t3wa4
+t2wi
+twi5li
+t3wit
+t3wo
+twon4
+4ty.
+ty4a
+5tych
+ty4let
+tyl5i
+ty5mi
+1typ
+3type
+1tyr1
+2tz2
+t5zia
+t5zie
+2ua2
+ua3ci
+u2ag
+ua5h
+u1al
+ua5lu
+uan4o
+uant5is
+uant5it
+uar3a
+uar2d
+uar3i
+uari4n
+uar5ters
+uar4t5i
+ua5tern
+uba4
+ub5bly
+u1b2i
+u4bicu
+ub3lin
+ub5lo
+ub3ra
+4uc
+u1c2a
+uccen5
+u4cend
+u4ch
+u5chr
+uc3l
+u4com
+uco5t
+uc2tr
+uc3ub
+uc5ul
+u5cum
+u5dac
+ud1al
+ud4e
+ud5ep
+u4der
+udev4
+ud4g
+udi4cin
+ud3ied
+u5dinis
+udi3o
+u5ditio
+u2do
+u5doi
+ud5on
+u5dor
+ueb4
+u4ed
+uen4o
+uen4ter
+uer3a
+ues4s
+uest5rat
+ues5tri
+ue4t
+uf2
+3ufa
+u3fl
+u4fo
+uft4
+uga4c
+ug5lif
+ug2ni
+u4go
+ug3ul
+ug3ura
+uhem3
+2ui2
+ui3al
+u2ic
+uicent5
+uid5o
+uil4a
+uild5er
+ui3lib
+uil4t
+uinc5u
+uin4s
+uint4
+uin4ta
+ui5pr
+uis3er
+uis4t
+uisti4
+uit5er
+ui5val5
+ui3vo
+u2iz
+4ul.
+u1la
+u4lab
+4ulac
+ul5ard
+u5lat
+ul4bo
+ul3ca
+ul4ch
+5ulche
+5ulchre
+4ulea
+u5lee
+u1len4
+4ulenci
+u5lent
+ulet4
+ul4ev
+ul2fa
+ul2i
+ul4ia
+u3line
+ul3ing
+ul5ish
+u5liti
+u5lity
+4ull
+ul4lat
+ul4l5ib
+ul4lis
+ul4lit
+ul3m
+u1lo
+u5lom
+ulph3i
+ulph3o
+ulp5ing
+ul4po
+2uls
+ul3sif
+u1lu
+ul1v4
+u1ma
+um3am
+umar4
+u5mas
+um4bar.
+um2bi
+umen4t
+u1mi
+u4mic
+u2m5if
+umi4fy
+umi5lia
+umin4ar
+u4mined
+u4m3ing
+u4mora
+u4mos
+um2p
+um4pa
+ump3er
+ump5li
+umpt4
+ump5te
+u1mu
+umu4lo
+un1
+u4n3a4
+un5ab
+unabu4
+un4ae
+un4as.
+un2ce
+un4dal
+un3ded
+unde4t
+undeter5m
+undi4c
+un4die
+un3do
+un4dus
+u3n2er
+unho5li
+un2i
+u1nic
+un4ie
+un3in
+un4ine
+uni5p
+uni3so
+un3ist
+uni1v
+un3iz
+unk5eri
+un5ket
+un3kn
+2unn
+un4nag
+un5o
+un5r
+un3s4
+un5sh
+un2ti
+until4
+unu4
+un3us
+uo3de
+uodent4
+u5oros
+u3os
+uo5tatio
+u1ou
+2up
+u1pat
+u1pe
+u5pee
+uper3
+u1ph
+u5pid
+up3ing
+u4po
+u5pol
+u2pr
+upre4
+u5quet
+u4r
+ur1a
+4ura.
+ura4ci
+4urae
+ura2g
+4uranti
+uras5
+urb5ing
+ur2c
+urc3a
+ur5den.
+ur5deni
+ur5die
+ur4du
+ur3ea
+ur5ee
+ur1er
+ur3ers
+ur1e2t
+ur3ett
+ur2f
+ur3fa
+ur1i
+u5ri5cu
+ur4ie.
+ur5ifie
+uril4
+ur4ili
+ur5ion
+uri4os.
+url5er
+ur5lie
+url5ing
+ur1m4
+urn3al
+urn3er
+urn5s
+ur1o
+uro4d
+ur5o4m
+ur5ot
+uroti4
+urpen5t
+urph4
+ur2s
+urs5al
+urs5er
+ur3sh
+urs3or
+ur5ta
+ur1te
+ur5tes
+urth2
+ur3the
+urti4
+ur1u
+ur4va
+u3sad
+us3ag
+us3al
+us4ap
+us3at
+2usc
+us4can
+ush5a
+us5ian
+usil5
+u4s1in
+usk5er
+us1p
+us4pa
+uss4e
+4ust
+us3tac
+us5tan
+ust4ic
+us5tici
+ust5ig
+ust3il
+us1to4
+us1tr
+us4tre
+usur4e
+us5uri
+u3tane
+utch4e
+ut5eni
+u5teo
+u4tere
+ut2i
+u3tie
+ut3ing
+u5tini
+u3tio
+ut5ism
+ut3ist
+5u5tiz
+ut3le
+utli4
+ut2o
+u4to5s
+u4t1ra
+uts2
+ut5sm
+ut4tone
+u3tu
+u4tul
+uu4
+uv2
+u4va
+uve2
+uven3
+uv5eri
+u5vin
+ux2o
+uy4a
+uy5er
+4va.
+2v3ab
+5vac
+va1ca
+va5ceo
+vacu1
+v4ad
+3vag3a
+va4ge
+4vaged
+vager4
+vag5r
+v1al.
+1vale
+vali2
+va5lie
+val4ise
+5valu
+5val4v
+vam4i
+va5mo
+5vann
+vanta4
+4vantl
+var4is
+4vase
+vas5el5
+v5a4so
+vast3a
+v4at.
+5vatee
+vat4ina
+4vatu
+2ve.
+vect4
+ve3g
+3vei
+2vel
+vel3at
+4vele
+v3eler
+ve5line
+v1ell
+v4ella
+vel5ler
+vel3li
+vel5opi
+ven4al
+ven4do
+ve1ne
+ve5nia
+vent5o
+ven4tr
+4venu
+v5en5ue
+5ve3o
+5verb
+verde5v
+4v4ere4
+ver5ea
+ver3ei
+v5erie
+ver3m4
+ver4ne
+5verse
+4ves.
+4vi.
+5vialit
+vi4atr
+vi1b4
+vic2
+vi4ca
+vi5cari
+vice3r
+5vict2
+5vicu
+5vider
+vign3
+vi4l
+vil3i
+3vili4a
+v5ilise
+v5ilize
+vil5lin
+vim4
+5vime
+2v1in
+vin4ac
+3vinci
+vin2e
+5vinit
+v5iniz
+vint4
+vin5ta
+3vi1o
+viol3
+vi5om
+5vi3p
+vire4
+vi5rid
+vir3u
+5visecti
+5visio
+v3ism
+2v5ist
+vi2t
+vit2a
+vi3tal
+vi5tel
+v5itie
+vit1r
+vi3tu
+v3ity
+viv5al
+viv5or
+vi5zo
+1vo
+2vo.
+vo2l
+vo5litio
+vol4ubi
+volv4
+4von
+vo5rac
+3vorc
+4vore
+3voro
+vo3tar
+2vow
+vr4
+v5ra4
+v5ri
+v5ro
+vrot4
+4vs
+v3ure
+2vv2
+v5ver
+v5vi
+4vy
+4wab
+wag3o
+wais4
+w3al.
+wall5er
+w3als
+wan5gli
+wank5er
+war5ded
+ward5er
+ward5r
+war4f
+war4te
+war5thi
+wass4
+was4t
+wa1te
+wav4ine
+w1b4
+w4bon
+w5c
+w5die
+w3dr
+we4b
+w4ed
+3weed
+5wei
+weight5i
+weir4
+wel3i
+weliz4
+wel4izi
+wel4li
+went4
+wes4
+west3
+w5est.
+w5f
+wh2
+w5hid
+wi2
+wid4e
+wi5er
+will5in
+wim2p
+win2e
+wing5er
+win4tr
+3w4ise
+with5eri
+w3la
+wl1er
+wl1i
+wl4ie
+w1m
+1wo
+wol4
+wol5ver
+3wom
+won2t
+word5i
+wotch4
+woun4
+wp5in
+wra4
+ws5ing
+w5ster
+wt4
+w5te
+w3to
+wy2
+wz4
+x1a
+x4ach
+x4ade
+x2ag
+x3agg
+xa5met
+x3ami
+xan5d
+xano4
+x2as
+xas5p
+x3c4
+xcav3
+xcor5
+xe4
+x1ec
+xec3r
+xe5cutio
+xecut5o
+xe2d
+x5edl
+x5edn
+x5eg
+x1em
+x3en
+xen4op
+x3er
+xer4g
+xer3o
+x1h
+xhort4a
+x1i
+x3ia.
+x4ias
+xi4c
+x5ige
+xim3a
+x4ime
+ximet4
+x3io
+xi4p
+x4it.
+x4its
+x1o
+x4ode
+x5om
+xo4mat
+xo4n
+x4os
+xotrop4
+x3p
+xpel4
+xpo5n2
+xpoun4
+x1s2
+x1t2
+x4ted
+xtens5o
+xter3i
+xter4m3
+xtern3
+x4th
+xti4
+xtra5d
+xtra3v
+xtre4
+xu4o
+x1ur
+xur4b
+x5us
+x5w
+xx4
+xys4
+xy3t
+y1a2
+y5ac
+1y2ar
+3yard
+yas4i
+4y1b
+yb2i
+yca5m
+y5chede
+ych5is
+y3cho
+y4chose
+yc1l
+yclam4
+y4coli
+y4coll
+ycom4
+y2cos
+y1d4
+yda4
+yder4
+ydro5s
+y4drou
+y3ee
+yel5o
+y3en
+y1er
+y3est.
+yes5te
+y5ett
+y5f
+y1g
+ygi2
+ygi5a
+y3gl
+ygo4i
+y1h
+y1i
+y3in
+yle2
+ylin5de
+yllab5i
+yl3os
+yl5ou
+y1me4
+y3men
+y5met
+y5mia
+ym5in
+ymot4
+ym4pha
+yn1
+ynago4
+ynand5
+yn5ap4
+yn5ast
+yn4ci
+ynd4
+yn2e
+yn3er
+yng4
+yn4gol
+yni4c
+yn4y
+y1o2
+yo3d
+yo4gis
+youn4
+young5
+2yp
+yp5al
+yper3
+y5pere
+y4peri
+y4pero
+y4pet
+y2ph
+yph4e
+yph3i
+y4p1i
+yp1n
+ypo1
+y4pox
+y2pr
+yp5ri
+yp4si
+yp5syf
+ypt3a
+y5pu
+y3rag
+yr3at
+yr3ic
+y5rig
+yr3is
+yr3i4t
+yr5olo
+yr4r
+yr4s
+yr5u
+4y2s
+ys5ag
+ys5at
+y3s2c
+y3sh
+ys1ic
+ys3in
+ysi4o
+yso5
+ys4so
+ys1t
+ys4to
+y3u
+yv4
+y3w
+yz5er
+yzy4
+z1a1
+2za.
+za4bi
+za2i
+z4as
+za4te
+zd4
+zeb4
+ze4d
+zen4a
+z5eng
+zer5a
+z3et4
+z1i
+zib5
+5zic4
+z2ie
+zi5m
+zin4c3i
+z3ing
+zing5i
+z4is
+3zlem
+z3ler
+z3li
+4zo.
+5zoa
+zo3an
+3zoo2
+zo3ol
+zo3on
+zo5op
+zo5oti
+zo5p
+zot2
+z5s
+5zum
+4zy.
+zz2
+z3zar
+z5zas
+z3zie
+zzo3
+z5zot} \ No newline at end of file
diff --git a/tex/context/patterns/lang-gb.rme b/tex/context/patterns/lang-gb.rme
new file mode 100644
index 000000000..ce156c824
--- /dev/null
+++ b/tex/context/patterns/lang-gb.rme
@@ -0,0 +1,60 @@
+% generated by mtxrun --script pattern --convert
+
+% This file has been renamed from ukhyphen.tex to hyph-en-gb.tex in June 2008
+% for consistency with other files with hyphenation patterns in hyph-utf8 package.
+% No other changes made. See http://www.tug.org/tex-hyphen for more details.
+
+% File: ukhyphen.tex
+% TeX hyphenation patterns for UK English
+
+% Unlimited copying and redistribution of this file
+% is permitted so long as the file is not modified
+% in any way.
+%
+% Modifications may be made for private purposes (though
+% this is discouraged, as it could result in documents
+% hyphenating differently on different systems) but if
+% such modifications are re-distributed, the modified
+% file must not be capable of being confused with the
+% original. In particular, this means
+%
+%(a) the filename (the portion before the extension, if any)
+% must not match any of :
+%
+% UKHYPH UK-HYPH
+% UKHYPHEN UK-HYPHEN
+% UKHYPHENS UK-HYPHENS
+% UKHYPHENATION UK-HYPHENATION
+% UKHYPHENISATION UK-HYPHENISATION
+% UKHYPHENIZATION UK-HYPHENIZATION
+%
+% regardless of case, and
+%
+%(b) the file must contain conditions identical to these,
+% except that the modifier/distributor may, if he or she
+% wishes, augment the list of proscribed filenames.
+
+% $Log: ukhyph.tex $
+% Revision 2.0 1996/09/10 15:04:04 ucgadkw
+% o added list of hyphenation exceptions at the end of this file.
+%
+%
+% Version 1.0a. Released 18th October 2005/PT.
+%
+% Created by Dominik Wujastyk and Graham Toal using Frank Liang's PATGEN 1.0.
+% Like the US patterns, these UK patterns correctly hyphenate about 90% of
+% the words in the input list, and produce no hyphens not in the list
+% (see TeXbook pp. 451--2).
+%
+% These patterns are based on a file of 114925 British-hyphenated words
+% generously made available to Dominik Wujastyk by Oxford University Press.
+% This list of words is copyright to the OUP and may not be redistributed.
+% The hyphenation break points in the words in the abovementioned file is
+% also copyright to the OUP.
+%
+% We are very grateful to Oxford University Press for allowing us to use
+% their list of hyphenated words to produce the following TeX hyphenation
+% patterns. This file of hyphenation patterns may be freely distributed.
+%
+% These patterns require a value of about 14000 for TeX's pattern memory size.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-hr.hyp b/tex/context/patterns/lang-hr.hyp
new file mode 100644
index 000000000..228bbd3b5
--- /dev/null
+++ b/tex/context/patterns/lang-hr.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-hr.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-hr.pat b/tex/context/patterns/lang-hr.pat
new file mode 100644
index 000000000..d99a0627b
--- /dev/null
+++ b/tex/context/patterns/lang-hr.pat
@@ -0,0 +1,1482 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-hr.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v z ć č đ š ž
+
+\patterns{
+a1a2
+a1e2
+a1i2
+a1o2
+a1u2
+e1a2
+e1e2
+e1i2
+e1o2
+e1u2
+i1a2
+i1e2
+i1i2
+i1o2
+i1u2
+o1a2
+o1e2
+o1i2
+o1o2
+o1u2
+u1a2
+u1e2
+u1i2
+u1o2
+u1u2
+a1ba
+a1be
+a1bi
+a1bo
+a1bu
+a1ca
+a1ce
+a1ci
+a1co
+a1cu
+a1ča
+a1če
+a1či
+a1čo
+a1ču
+a1ća
+a1će
+a1ći
+a1ćo
+a1ću
+a1da
+a1de
+a1di
+a1do
+a1du
+a1dža
+a1dže
+a1dži
+a1džo
+a1džu
+a1đa
+a1đe
+a1đi
+a1đo
+a1đu
+a1fa
+a1fe
+a1fi
+a1fo
+a1fu
+a1ga
+a1ge
+a1gi
+a1go
+a1gu
+a1ha
+a1he
+a1hi
+a1ho
+a1hu
+a1ja
+a1je
+a1ji
+a1jo
+a1ju
+a1ka
+a1ke
+a1ki
+a1ko
+a1ku
+a1la
+a1le
+a1li
+a1lo
+a1lu
+a1lja
+a1lje
+a1lji
+a1ljo
+a1lju
+a1ma
+a1me
+a1mi
+a1mo
+a1mu
+a1na
+a1ne
+a1ni
+a1no
+a1nu
+a1nja
+a1nje
+a1nji
+a1njo
+a1nju
+a1pa
+a1pe
+a1pi
+a1po
+a1pu
+a1ra
+a1re
+a1ri
+a1ro
+a1ru
+a1sa
+a1se
+a1si
+a1so
+a1su
+a1ša
+a1še
+a1ši
+a1šo
+a1šu
+a1ta
+a1te
+a1ti
+a1to
+a1tu
+a1va
+a1ve
+a1vi
+a1vo
+a1vu
+a1za
+a1ze
+a1zi
+a1zo
+a1zu
+a1ža
+a1že
+a1ži
+a1žo
+a1žu
+e1ba
+e1be
+e1bi
+e1bo
+e1bu
+e1ca
+e1ce
+e1ci
+e1co
+e1cu
+e1ča
+e1če
+e1či
+e1čo
+e1ču
+e1ća
+e1će
+e1ći
+e1ćo
+e1ću
+e1da
+e1de
+e1di
+e1do
+e1du
+e1dža
+e1dže
+e1dži
+e1džo
+e1džu
+e1đa
+e1đe
+e1đi
+e1đo
+e1đu
+e1fa
+e1fe
+e1fi
+e1fo
+e1fu
+e1ga
+e1ge
+e1gi
+e1go
+e1gu
+e1ha
+e1he
+e1hi
+e1ho
+e1hu
+e1ja
+e1je
+e1ji
+e1jo
+e1ju
+e1ka
+e1ke
+e1ki
+e1ko
+e1ku
+e1la
+e1le
+e1li
+e1lo
+e1lu
+e1lja
+e1lje
+e1lji
+e1ljo
+e1lju
+e1ma
+e1me
+e1mi
+e1mo
+e1mu
+e1na
+e1ne
+e1ni
+e1no
+e1nu
+e1nja
+e1nje
+e1nji
+e1njo
+e1nju
+e1pa
+e1pe
+e1pi
+e1po
+e1pu
+e1ra
+e1re
+e1ri
+e1ro
+e1ru
+e1sa
+e1se
+e1si
+e1so
+e1su
+e1ša
+e1še
+e1ši
+e1šo
+e1šu
+e1ta
+e1te
+e1ti
+e1to
+e1tu
+e1va
+e1ve
+e1vi
+e1vo
+e1vu
+e1za
+e1ze
+e1zi
+e1zo
+e1zu
+e1ža
+e1že
+e1ži
+e1žo
+e1žu
+i1ba
+i1be
+i1bi
+i1bo
+i1bu
+i1ca
+i1ce
+i1ci
+i1co
+i1cu
+i1ča
+i1če
+i1či
+i1čo
+i1ču
+i1ća
+i1će
+i1ći
+i1ćo
+i1ću
+i1da
+i1de
+i1di
+i1do
+i1du
+i1dža
+i1dže
+i1dži
+i1džo
+i1džu
+i1đa
+i1đe
+i1đi
+i1đo
+i1đu
+i1fa
+i1fe
+i1fi
+i1fo
+i1fu
+i1ga
+i1ge
+i1gi
+i1go
+i1gu
+i1ha
+i1he
+i1hi
+i1ho
+i1hu
+i1ja
+i1je
+i1ji
+i1jo
+i1ju
+i1ka
+i1ke
+i1ki
+i1ko
+i1ku
+i1la
+i1le
+i1li
+i1lo
+i1lu
+i1lja
+i1lje
+i1lji
+i1ljo
+i1lju
+i1ma
+i1me
+i1mi
+i1mo
+i1mu
+i1na
+i1ne
+i1ni
+i1no
+i1nu
+i1nja
+i1nje
+i1nji
+i1njo
+i1nju
+i1pa
+i1pe
+i1pi
+i1po
+i1pu
+i1ra
+i1re
+i1ri
+i1ro
+i1ru
+i1sa
+i1se
+i1si
+i1so
+i1su
+i1ša
+i1še
+i1ši
+i1šo
+i1šu
+i1ta
+i1te
+i1ti
+i1to
+i1tu
+i1va
+i1ve
+i1vi
+i1vo
+i1vu
+i1za
+i1ze
+i1zi
+i1zo
+i1zu
+i1ža
+i1že
+i1ži
+i1žo
+i1žu
+o1ba
+o1be
+o1bi
+o1bo
+o1bu
+o1ca
+o1ce
+o1ci
+o1co
+o1cu
+o1ča
+o1če
+o1či
+o1čo
+o1ču
+o1ća
+o1će
+o1ći
+o1ćo
+o1ću
+o1da
+o1de
+o1di
+o1do
+o1du
+o1dža
+o1dže
+o1dži
+o1džo
+o1džu
+o1đa
+o1đe
+o1đi
+o1đo
+o1đu
+o1fa
+o1fe
+o1fi
+o1fo
+o1fu
+o1ga
+o1ge
+o1gi
+o1go
+o1gu
+o1ha
+o1he
+o1hi
+o1ho
+o1hu
+o1ja
+o1je
+o1ji
+o1jo
+o1ju
+o1ka
+o1ke
+o1ki
+o1ko
+o1ku
+o1la
+o1le
+o1li
+o1lo
+o1lu
+o1lja
+o1lje
+o1lji
+o1ljo
+o1lju
+o1ma
+o1me
+o1mi
+o1mo
+o1mu
+o1na
+o1ne
+o1ni
+o1no
+o1nu
+o1nja
+o1nje
+o1nji
+o1njo
+o1nju
+o1pa
+o1pe
+o1pi
+o1po
+o1pu
+o1ra
+o1re
+o1ri
+o1ro
+o1ru
+o1sa
+o1se
+o1si
+o1so
+o1su
+o1ša
+o1še
+o1ši
+o1šo
+o1šu
+o1ta
+o1te
+o1ti
+o1to
+o1tu
+o1va
+o1ve
+o1vi
+o1vo
+o1vu
+o1za
+o1ze
+o1zi
+o1zo
+o1zu
+o1ža
+o1že
+o1ži
+o1žo
+o1žu
+u1ba
+u1be
+u1bi
+u1bo
+u1bu
+u1ca
+u1ce
+u1ci
+u1co
+u1cu
+u1ča
+u1če
+u1či
+u1čo
+u1ču
+u1ća
+u1će
+u1ći
+u1ćo
+u1ću
+u1da
+u1de
+u1di
+u1do
+u1du
+u1dža
+u1dže
+u1dži
+u1džo
+u1džu
+u1đa
+u1đe
+u1đi
+u1đo
+u1đu
+u1fa
+u1fe
+u1fi
+u1fo
+u1fu
+u1ga
+u1ge
+u1gi
+u1go
+u1gu
+u1ha
+u1he
+u1hi
+u1ho
+u1hu
+u1ja
+u1je
+u1ji
+u1jo
+u1ju
+u1ka
+u1ke
+u1ki
+u1ko
+u1ku
+u1la
+u1le
+u1li
+u1lo
+u1lu
+u1lja
+u1lje
+u1lji
+u1ljo
+u1lju
+u1ma
+u1me
+u1mi
+u1mo
+u1mu
+u1na
+u1ne
+u1ni
+u1no
+u1nu
+u1nja
+u1nje
+u1nji
+u1njo
+u1nju
+u1pa
+u1pe
+u1pi
+u1po
+u1pu
+u1ra
+u1re
+u1ri
+u1ro
+u1ru
+u1sa
+u1se
+u1si
+u1so
+u1su
+u1ša
+u1še
+u1ši
+u1šo
+u1šu
+u1ta
+u1te
+u1ti
+u1to
+u1tu
+u1va
+u1ve
+u1vi
+u1vo
+u1vu
+u1za
+u1ze
+u1zi
+u1zo
+u1zu
+u1ža
+u1že
+u1ži
+u1žo
+u1žu
+b1b
+b1c
+b1č
+b1ć
+b1d
+b1dž
+b1đ
+b1f
+b1g
+b1h
+1bj
+2bj.
+b1k
+1bl
+2bl.
+2b1lj
+b1m
+b1n
+b1nj
+b1p
+1br
+2br.
+b1s
+b1š
+b1t
+1bv
+2bv.
+b1z
+b1ž
+c1b
+c1c
+c1č
+c1ć
+c1d
+c1dž
+c1đ
+c1f
+c1g
+c1h
+1cj
+2cj.
+c1k
+1cl
+2cl.
+2c1lj
+c1m
+c1n
+c1nj
+c1p
+1cr
+2cr.
+c1s
+c1š
+c1t
+1cv
+2cv.
+c1z
+c1ž
+č1b
+č1c
+č1č
+č1ć
+č1d
+č1dž
+č1đ
+č1f
+č1g
+č1h
+1čj
+2čj.
+č1k
+1čl
+2čl.
+2č1lj
+č1m
+č1n
+č1nj
+č1p
+1čr
+2čr.
+č1s
+č1š
+č1t
+1čv
+2čv.
+č1z
+č1ž
+ć1b
+ć1c
+ć1č
+ć1ć
+ć1d
+ć1dž
+ć1đ
+ć1f
+ć1g
+ć1h
+ć1j
+ć1k
+1ćl
+2ćl.
+2ć1lj
+ć1m
+ć1n
+ć1nj
+ć1p
+1ćr
+2ćr.
+ć1s
+ć1š
+ć1t
+1ćv
+2ćv.
+ć1z
+ć1ž
+d1b
+d1c
+d1č
+d1ć
+d1d
+d2ž
+d1đ
+d1f
+2d1g
+d1h
+1dj
+2dj.
+d1k
+2d1l
+2d1lj
+d1m
+d1n
+d1nj
+d1p
+1dr
+2dr.
+d1s
+d1š
+d1t
+1dv
+2dv.
+d1z
+dž1b
+dž1c
+dž1č
+dž1ć
+dž1d
+dž1dž
+dž1đ
+dž1f
+dž1g
+dž1h
+1džj
+2džj.
+dž1k
+1džl
+2džl.
+2dž1lj
+dž1m
+dž1n
+dž1nj
+dž1p
+1džr
+2džr.
+dž1s
+dž1š
+dž1t
+1džv
+2džv.
+dž1z
+dž1ž
+đ1b
+đ1c
+đ1č
+đ1ć
+đ1d
+đ1dž
+đ1đ
+đ1f
+đ1g
+đ1h
+1đj
+2đj.
+đ1k
+1đl
+2đl.
+2đ1lj
+đ1m
+đ1n
+đ1nj
+đ1p
+1đr
+2đr.
+đ1s
+đ1š
+đ1t
+1đv
+2đv.
+đ1z
+đ1ž
+f1b
+f1c
+f1č
+f1ć
+f1d
+f1dž
+f1đ
+f1f
+f1g
+f1h
+1fj
+2fj.
+f1k
+1fl
+2fl.
+2f1lj
+f1m
+f1n
+f1nj
+f1p
+1fr
+2fr.
+f1s
+f1š
+f1t
+1fv
+2fv.
+f1z
+f1ž
+g1b
+g1c
+g1č
+g1ć
+g1d
+g1dž
+g1đ
+g1f
+g1g
+g1h
+1gj
+2gj.
+g1k
+1gl
+2gl.
+2g1lj
+g1m
+g1n
+g1nj
+g1p
+1gr
+2gr.
+g1s
+g1š
+g1t
+1gv
+2gv.
+g1z
+g1ž
+h1b
+h1c
+h1č
+h1ć
+h1d
+h1dž
+h1đ
+h1f
+h1g
+h1h
+1hj
+2hj.
+h1k
+1hl
+2hl.
+2h1lj
+h1m
+h1n
+h1nj
+h1p
+1hr
+2hr.
+h1s
+h1š
+h1t
+1hv
+2hv.
+h1z
+h1ž
+j1b
+j1c
+j1č
+j1ć
+j1d
+j1dž
+j1đ
+j1f
+j1g
+j1h
+j1j
+j1k
+j1l
+2j1lj
+j1m
+j1n
+j1nj
+j1p
+j1r
+j1s
+j1š
+j1t
+j1v
+j1z
+j1ž
+k1b
+k1c
+k1č
+k1ć
+k1d
+k1dž
+k1đ
+k1f
+k1g
+k1h
+1kj
+2kj.
+k1k
+k1l
+1k2lj
+2klj.
+k1m
+k1n
+k1nj
+k1p
+1kr
+2kr.
+k1s
+k1š
+k1t
+k1v
+k1z
+k1ž
+l1b
+l1c
+l1č
+l1ć
+l1d
+l1dž
+l1đ
+l1f
+l1g
+l1h
+l1k
+l1l
+2l1lj
+l1m
+l1n
+l1nj
+l1p
+l1r
+l1s
+l1š
+l1t
+l1v
+l1z
+l1ž
+lj1b
+lj1c
+lj1č
+lj1ć
+lj1d
+lj1dž
+lj1đ
+lj1f
+lj1g
+lj1h
+lj1k
+1ljl
+2ljl.
+lj1lj
+lj1m
+lj1n
+lj1nj
+lj1p
+1ljr
+2ljr.
+lj1s
+lj1š
+lj1t
+1ljv
+2ljv.
+lj1z
+lj1ž
+m1b
+m1c
+m1č
+m1ć
+m1d
+m1dž
+m1đ
+m1f
+m1g
+m1h
+1mj
+2mj.
+m1k
+1ml
+2ml.
+2m1lj
+m1m
+m1n
+m1nj
+m1p
+1mr
+2mr.
+m1s
+m1š
+m1t
+1mv
+2mv.
+m1z
+m1ž
+n1b
+n1c
+n1č
+n1ć
+n1d
+n1dž
+n1đ
+n1f
+n1g
+n1h
+2nj.
+n1k
+1nl
+2nl.
+2n1lj
+n1m
+n1n
+n1nj
+n1p
+n1r
+n1s
+n1š
+n1t
+1nv
+2nv.
+n1z
+n1ž
+nj1b
+nj1c
+nj1č
+nj1ć
+nj1d
+nj1dž
+nj1đ
+nj1f
+nj1g
+nj1h
+1njj
+2njj.
+nj1k
+1njl
+2njl.
+2nj1lj
+nj1m
+nj1n
+nj1nj
+nj1p
+1njr
+2njr.
+nj1s
+nj1š
+nj1t
+1njv
+2njv.
+nj1z
+nj1ž
+p1b
+p1c
+p1č
+p1ć
+p1d
+p1dž
+p1đ
+p1f
+p1g
+2p1h
+1pj
+2pj.
+p1k
+1pl
+2pl.
+2p1lj
+p1m
+p1n
+p1nj
+p1p
+1pr
+2pr.
+p1s
+p1š
+p1t
+1pv
+2pv.
+p1z
+p1ž
+r1b
+r1c
+r1č
+r1ć
+r1d
+r1dž
+r1đ
+r1f
+r1g
+r1h
+r1j
+r1k
+r1l
+2r1lj
+r1m
+r1n
+r1nj
+r1p
+r1r
+r1s
+r1š
+r1t
+r1v
+r1z
+r1ž
+1sb
+2sb.
+s1c
+1sč
+2sč.
+1sć
+2sć.
+1sd
+2sd.
+1sdž
+2sdž.
+1sđ
+2sđ.
+1sf
+2sf.
+1sg
+2sg.
+1sh
+2sh.
+1sj
+2sj.
+1sk
+2sk.
+s1l
+1slj
+2slj.
+1sm
+2sm.
+s1n
+2sn.
+1snj
+2snj.
+s1p
+1sr
+2sr.
+1ss
+2ss.
+1sš
+2sš.
+s1t
+2st.
+1sv
+2sv.
+1sz
+2sz.
+1sž
+2sž.
+1šb
+2šb.
+š1c
+š1č
+š1ć
+1šd
+2šd.
+1šdž
+2šdž.
+1šđ
+2šđ.
+1šf
+2šf.
+1šg
+2šg.
+1šh
+2šh.
+1šj
+2šj.
+1šk
+2šk.
+š1l
+2š1lj
+1šm
+2šm.
+š1n
+2š1nj
+1šp
+2šp.
+1šr
+2šr.
+1šs
+2šs.
+1šš
+2šš.
+1št
+2št.
+1šv
+2šv.
+1šz
+2šz.
+1šž
+2šž.
+t1b
+t1c
+t1č
+t1ć
+t1d
+t1dž
+t1đ
+t1f
+t1g
+t1h
+1tj
+2tj.
+t1k
+1tl
+2tl.
+2t1lj
+t1m
+t1n
+t1nj
+t1p
+1tr
+2tr.
+t1s
+t1š
+t1t
+1tv
+2tv.
+t1z
+t1ž
+v1b
+v1c
+v1č
+v1ć
+v1d
+v1dž
+v1đ
+v1f
+v1g
+v1h
+v1j
+1v2je
+vj.
+v1k
+v1l
+2v1lj
+v1m
+v1n
+v1nj
+v1p
+1vr
+v1s
+v1š
+v1t
+v1v
+v1z
+v1ž
+z1b
+1zc
+2zc.
+1zč
+2zč.
+1zć
+2zć.
+z1d
+1zdž
+2zdž.
+1zđ
+2zđ.
+1zf
+2zf.
+z1g
+1zh
+2zh.
+1zj
+2zj.
+1zk
+2zk.
+z1l
+2z1lj
+z1m
+z1n
+1znj
+2znj.
+1zp
+2zp.
+z1r
+z1s
+1zš
+2zš.
+1zt
+2zt.
+1zv
+2zv.
+1zz
+2zz.
+1zž
+2zž.
+ž1b
+2žb.
+1žc
+2žc.
+1žč
+2žč.
+1žć
+2žć.
+1žd
+2žd.
+1ždž
+2ždž.
+1žđ
+2žđ.
+1žf
+2žf.
+1žg
+2žg.
+1žh
+2žh.
+ž1j
+1žk
+2žk.
+1žl
+2žl.
+ž1lj
+1žm
+2žm.
+ž1n
+2žn.
+2ž1nj
+1žp
+2žp.
+1žr
+2žr.
+1žs
+2žs.
+1žš
+2žš.
+1žt
+2žt.
+1žv
+2žv.
+1žz
+2žz.
+1žž
+2žž.
+2d1vj
+2d1vr
+z1g2nj
+ć1s2t
+d1s2m
+j1z2g
+r2n1t
+r2z1n
+m2p1t
+2d1vl
+r2t1c
+r2n1c
+r2č1k
+2s1hr
+z1v2l
+2z1vr
+r2k1n
+r2c1n
+r2h1nj
+s2p1n
+j1s2l
+r2d1n
+.zg2
+r2dž1b
+2š1tv
+r2t1s
+n2t1s
+2s1kr
+r2n1k
+d1š2k
+d1s2p
+r2t1m
+1r2je
+k2s1p
+t1s2t
+l2m1s
+r2h1k
+j1s2t
+s1v2l
+r2p1c
+t1k2l
+s1k2l
+n2t1n
+2d1ja
+2rt.
+z1r2j
+d1s2t
+n2k1c
+r2t1k
+r2g1n
+r2h1t
+.na2j1
+.be2z1
+.iz1
+.is1
+.ne2o3
+r2t1n
+r2v1n
+r1s2t
+n2s1t
+l2f1t} \ No newline at end of file
diff --git a/tex/context/patterns/lang-hr.rme b/tex/context/patterns/lang-hr.rme
new file mode 100644
index 000000000..31dd3308a
--- /dev/null
+++ b/tex/context/patterns/lang-hr.rme
@@ -0,0 +1,70 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: hrhyph.tex (1996-04-10)
+% Author: Marinović Igor <migor at student.math.hr>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Hyphenation patterns for Croatian language
+%
+% The first version was realised in late 1994.
+% Second, much more improved version was realised in the beginning of 1996.
+% Date of the last change: 19.03.1996.
+%
+% Marinović Igor
+% migor@student.math.hr \ No newline at end of file
diff --git a/tex/context/patterns/lang-hu.hyp b/tex/context/patterns/lang-hu.hyp
new file mode 100644
index 000000000..68f965288
--- /dev/null
+++ b/tex/context/patterns/lang-hu.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-hu.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-hu.pat b/tex/context/patterns/lang-hu.pat
new file mode 100644
index 000000000..38b1ebf11
--- /dev/null
+++ b/tex/context/patterns/lang-hu.pat
@@ -0,0 +1,62819 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-hu.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z á ä é í ó ö ú ü ő ű
+
+\patterns{
+.a2
+.adatát1a2
+.ada2t1e2
+.adás1s
+.adá2s3z
+.ad1yé.
+.ad1yi
+.ag1os
+.ag2ra
+.agyag1g
+.agy1á2ram
+.agy1árt
+.agy1e2
+.agyo2
+.agyon1
+.agy1ó2
+.agy1ű2
+.akác1c
+.aká2cs
+.ak2h
+.ako2
+.ak2t1ér.
+.ak2t1orr
+.ak2t1ő2
+.aku1p2
+.ala2g1
+.alak1a2
+.ala2k1ö2
+.ala2k1ő2
+.ala2pa
+.ala2p1á
+.al1eg
+.al1is
+.al2járn
+.alje2
+.al2j1el
+.aljel1ö2
+.alo2m1
+.al1os
+.al2t1a2k
+.al2t1erj
+.al2tén
+.al2térn
+.al2tért
+.al2tin
+.am1ak
+.ango2l1ó2
+.an1th
+.anti1s
+.apa1p2
+.apá2ly1á2z
+.ara2ny1e2
+.ara2sze
+.ar1á2c
+.ar2cal
+.arc3c
+.ar2c1e2
+.ar2cél
+.ar2c3há
+.ar2c3hoz
+.ar2cin
+.ar2cio
+.ar2col
+.ar2cö
+.ar2c3s
+.ar1kh
+.at2h
+.az1a2
+.az1ám
+.aze2
+.az1ó2
+.á2
+.ács1ék
+.ág1árn
+.ág1árt
+.ág1ó2
+.ágy1ala
+.ágy1asz
+.ágy1árt
+.ágy1á2z
+.ál1a2
+.ál1é
+.ál1i2
+.áligaz1
+.ál2l1alj
+.ál2l1alt
+.ál2lin
+.ál1o2k
+.ál1ú
+.ár1aj
+.ár1aktá
+.ár1a2l
+.ára2m1e
+.ár1a2p
+.ára2sz
+.ár1aszó
+.ár1ác
+.ár1ál
+.ár1á2z
+.ár1d2
+.áre2
+.ár1em
+.áré2
+.ár1ir
+.ár2nyel
+.ár1ol
+.ár1om
+.ár1os
+.árrés1s
+.ár1s2
+.ár1t2r
+.ász1ál
+.ász1árb
+.ász1á2ré
+.ász1á2ri
+.ász1á2ro
+.át1a2d
+.át1a2k
+.át1alt
+.át1a2n
+.át1ar
+.át1a2s
+.át1av
+.át1á2
+.át1e2
+.át1é2
+.át1i2
+.át1ol
+.át1o2r
+.át1o2s
+.átó2
+.át1óh
+.át1óv
+.át1ö2
+.át1u
+.át1ü2
+.át1ű
+.b2
+.ba2b1a2rá
+.ba2bál
+.ba2b1e2
+.ba2bol
+.ba2j1á2rat
+.ba2j1e
+.bak1aszt
+.ba2kál
+.ba2k1á2ro
+.baké2
+.ba2k1ö2
+.ba2kur
+.ba2l1e2g
+.ba1ts
+.ba2u
+.bá2l1ó2
+.bár1a
+.bá1th
+.be2at.
+.be1d2
+.bei2
+.be1kr
+.be1str
+.be1szk
+.beté2t1e2l
+.be1tr
+.bér2c3sí
+.bé2r1o
+.bi2ke
+.bi2os
+.bi2ot
+.bita2
+.bi2tag
+.bi2t1á2
+.bi2tel
+.bi2t1er
+.bi2t1orr
+.bi2tur
+.bo2g1ó2
+.bol2ta
+.bo2ly1ó2
+.bo2nav
+.bo2raj
+.bo2ran
+.bo2ras
+.bo2rat
+.bo2rác
+.bo2rál
+.bo2r1odv
+.bor2sét
+.bort2
+.bo2tá
+.bra2i
+.bu2sz1e
+.c2
+.cen2t1á
+.cen2t1ó2
+.ce2t1e2l
+.ce2t1ű
+.cé2l1e2
+.ci2n1á2
+.cito1
+.cs2
+.csa2k1
+.csa2p1á2g
+.csa2t1é2
+.cse2l1ő2r
+.d2
+.dac1c
+.da2c3s
+.da2i
+.dal1an
+.da2lás
+.da2l1e2
+.da2l1ék
+.da2lén
+.da2l1í2
+.da3lol
+.da2l1ó2
+.dan1n
+.da2u
+.den2g1
+.dé2la
+.dére2
+.dé2res
+.dé2sa
+.di2afo
+.di2aka
+.di2al
+.di2csá
+.di2ómá
+.dó2mor
+.dú2ra
+.e2
+.eb1eg
+.eb1ir
+.eb1í
+.eb1u2
+.eg2é
+.egres1s
+.egy1a2
+.egy1á2
+.egy1e2lőr
+.egy1ev
+.egy1in
+.egy1ö2
+.egy1ü2l
+.el1a2k
+.el1an
+.el1ap
+.ela2s
+.el1ass
+.el1aszn
+.el1aszo
+.el1aszv
+.el1á2
+.el1e2c
+.el1eger
+.ele2gyá
+.el1e2h
+.el1ejt
+.el1e2l
+.ele2ma
+.ele2má
+.ele2meg
+.ele2mel
+.el1emele
+.el1emels
+.el1emelt
+.el1e2més
+.el1e2n
+.el1e2p
+.el1e2r
+.el1e2se
+.el1e2sés
+.el1esh
+.el1e2si
+.el1esn
+.el1e2ső
+.el1ess
+.el1este
+.el1estél
+.el1estü
+.el1e2sü
+.el1esv
+.el1e2sz
+.el1e2t
+.el1e2vet
+.el1e2vez
+.el1evi
+.elé2d
+.el1éde
+.el1é2gek
+.el1éh
+.el1ékez
+.el1é2le
+.elé2n
+.el1éne
+.el1é2p
+.el1é2r
+.el1é2tet.
+.el1é2v
+.el1id
+.el1ig
+.el1i2h
+.el1ik
+.el1i2mit
+.el1in
+.el1ir
+.el1i2s
+.eli2t1o
+.el1itta.
+.el1itták
+.el1izz
+.el1í
+.ellege2
+.elo2
+.el1okk
+.el1oko
+.el1or
+.el1ó2
+.elö2
+.el1ök
+.el1öle
+.el1ölé
+.el1ölh
+.el1öli
+.el1ölj.
+.el1ölje
+.el1öljé
+.el1öljü
+.el1ölne
+.el1ölné.
+.el1ölném
+.el1ölni
+.el1ölő
+.el1ölt.
+.el1ölte
+.el1ölté
+.el1öltn
+.el1öltü
+.el1ölün
+.el1ölv
+.el1öv
+.előé2
+.el1s2
+.el1t2
+.el1u
+.elü2
+.el1ül.
+.el1ülh
+.el1üli
+.el1ülj
+.el1üln
+.el1ülte
+.el1ülv
+.el2v1el
+.el2v1ég.
+.es1er
+.ese2tel
+.es2t1a
+.es2t1á
+.es2t1é2ke.
+.es2t1é2kek
+.et2h
+.etilén1g2
+.evés1s
+.ex1el
+.ez1á
+.ez1e2l
+.é2
+.édes3s
+.ég1a2
+.ég1eg
+.ég1e2rei
+.ége2s
+.ég1esz
+.ég1ér.
+.ég1é2ré
+.ég1érn
+.égés3s
+.égé2sz
+.ég1észb
+.ég1észe
+.ég1észé
+.ég1észn
+.ég1észr
+.ég1ö2
+.ég1u2
+.éh1év
+.éj1a2
+.éj1á2
+.éj1el
+.éj1u
+.ék1a2
+.ék1á
+.ékes1s
+.ék1ir
+.ék1o
+.él1a2
+.él2c1i
+.éli2k
+.él1ike
+.él2v1á2
+.ép1es
+.ép2pa
+.ép2p1el
+.ép2pé
+.ép2po
+.ér1a2n
+.ér2c1e2l
+.ér2c1é2j
+.ér2cék
+.ér2c3sí
+.ér1e2l
+.ér1e2s
+.éré2sz
+.ér1észé
+.ér1é2t
+.érü2
+.ér1ül
+.ér2vad
+.ér2val
+.ér2v1ég.
+.ész1a2l
+.ész1á
+.észe2
+.ész1el
+.ész1em
+.ész1es
+.ész1é2k
+.észigaz1
+.ész1o
+.ész1ő2
+.ész2t1örv
+.észü2
+.ész1ülő
+.év1á2g
+.év1essz
+.év1é2g
+.év1é2k
+.f2
+.fa2it.
+.fa2leg
+.fa2n1év
+.fa2r1ont
+.fas2
+.fa1st
+.fat2
+.fa1tr
+.fe2leme
+.fe2l1essz
+.fe2lev
+.fé2k1e2l
+.fé2m1a2
+.fé2m1á2
+.fil2méré
+.fin2ge
+.fogó2s3zá
+.fol2t1a2
+.fö2lő
+.fö2lül.
+.fölül1e2
+.g2
+.ga2zan
+.gát1al
+.gá2te
+.gá2z1ó2
+.gázs2
+.gá2zsu
+.gáz1z
+.gene2a
+.ge2od
+.ge2os
+.gesz2t1í
+.gé2d1
+.gé2na
+.gé2ná
+.gén3n
+.gé2pe2lem
+.gé2p1i2p
+.giga1s
+.gonor1
+.gonorr2
+.gó2ce
+.gó2la
+.gó2lá
+.gó2lel
+.gó2l1e2s
+.góli2g
+.gó2l1iga
+.gó2lis
+.gő2z1á2
+.gő2zen
+.gő2z1ő
+.gő2zs
+.gu2i
+.h2
+.ha2b1e2
+.ha2b1ol
+.ha2bor
+.ha2b1ő
+.ha2b1u
+.ha2dal
+.ha2d1e2
+.ha2dz
+.ha2ik
+.ha2j1e2
+.ha2jom
+.ha2lác
+.halá2l1ó2
+.ha2lárv
+.ha2leg
+.ha2l1el
+.ha2lep
+.ha2let
+.ha2l1e2v
+.ha2lis
+.han2gad
+.han2g1e
+.ha2sor
+.has3sz
+.ha2tag
+.ha2t1at
+.ha2t1e2
+.ha2told
+.há2m1a
+.há2ny1in
+.háro2m1e
+.há2t1alj
+.há2tus
+.há2zol
+.há2zó
+.he2i
+.hé2t1ez
+.hé2t1o
+.hit1a
+.hi2tis
+.hodás1
+.hol1l
+.hol2t1e
+.ho2ne
+.hő2sá
+.i2
+.ike2r1i
+.ikerü2
+.ike2r1ülé
+.ikon1s
+.ima1s
+.im1p2la
+.in1aktí
+.in2gin
+.inte2r1a
+.io2n1a2
+.io2n1á
+.io2ne
+.ion3n
+.ipa2re
+.izo2m1ért
+.í2
+.íjá2t
+.íj1áto
+.ín1e
+.írá2s1ág
+.írá2s3z
+.ív1a2
+.ív1á2r
+.ív1ell
+.íz1a
+.íz1in
+.j2
+.jaké2
+.ja2kér
+.ja2kov
+.járműká2
+.já2szá
+.já2szó
+.je2gy1a2
+.je2gy1á2
+.je2l1a
+.je2leg
+.je2lev
+.job2b1ol
+.jó2dal
+.jó2s1e2
+.jó2t1á
+.k2
+.kale2i
+.ka2nar
+.ka2n1e
+.kapolc1
+.ka2rala
+.ka2ras
+.ka2r1á2s
+.kar2c3se
+.kare2
+.ka2rem
+.ka2rék
+.ka2ring
+.ka2rí
+.ka2ró2ra
+.ka2r1ó2rák
+.ka2r1ü
+.ka1th
+.ka1tz
+.kár1a2d
+.kás2
+.kása3l
+.ke2csó
+.ke2l1á2
+.ke2l1e2g
+.ke2l1e2ve
+.kel1ö
+.ker2ta
+.ké2nét
+.ké2p1és
+.kéta2
+.ké2tab
+.ké2tad
+.ké2t1ag
+.ké2taka
+.ké2tal
+.ké2tan
+.ké2tap
+.ké2tas
+.ké2tat
+.ké2tau
+.ké2t1á2
+.ké2t1ele
+.ké2t1ez
+.ké2t1o2
+.kéze2
+.ké2z1el
+.ké2zem
+.ké2zs
+.kéz1z
+.kiá2
+.ki1g2
+.ki1krá
+.kió2
+.ki2ság
+.kiű2
+.kla2uz
+.kle2i
+.kló2re
+.ko2rác
+.ko2rí
+.ko2sis
+.kó2d1a2
+.kó2r1e
+.kó2r1é2s
+.kö2b1öl
+.kö2d1ő
+.kö2zis
+.kö2z1ő
+.köz1z
+.kr2
+.kun1a
+.kvar3k.
+.l2
+.lak1a2d
+.la2kal
+.la2k1an
+.la2kép
+.la2kor
+.la2kő
+.lan2t1e
+.lan2t1ó2
+.la2pal
+.la2p1ác
+.la2p1á2r
+.la2p1e2
+.la2p1or
+.la2p1osz
+.la2pó
+.lá2b1e2
+.lá2bil
+.lá2bor
+.lán2c3s
+.lá2nyan
+.lá2ny1e2
+.lá2p1e
+.lá2p1il
+.lá2z1ó2
+.lá2z3s
+.le3dé
+.le2g1
+.le3g2ali
+.le3g2elés
+.le3g2esle2g1
+.le3g2esle3g2esle2g1
+.lege2t
+.le4géne
+.leg3g
+.le3gy
+.lei2d
+.leí2ro
+.leí2ród
+.leí2ru
+.le1kl
+.le1k2r
+.lemez1z
+.le1p2ré
+.le1s2m
+.le1t2r
+.leü2
+.lé2c3s
+.lé2g1a2
+.lé2g1á
+.lége2
+.lé2g1el
+.lé2gér
+.lé2go
+.lé2gy1á2
+.lé2p1a2
+.lépü2
+.lép1ülé
+.lé2t1a2
+.lé2t1á2
+.lé2t1e2l
+.lé2t1érd
+.lé2tör
+.lisz2ta
+.lisz2t1á2
+.lisz2ter
+.lito1s
+.lob1e
+.lobi2
+.lo2bin
+.lo2mag
+.lo2mal
+.lo2m1á
+.lom2b1e2
+.lo2me
+.lo2m1é2t
+.lon2csi
+.lófo2g1a2d
+.lő2cs1ö2v
+.lőrés3s
+.ly1o
+.m2
+.ma2e
+.ma2gal
+.ma2gar
+.ma2gál
+.ma2g1e2
+.mag1g
+.magó2
+.ma2gór
+.ma2in.
+.ma2r1ác
+.ma2r1ing
+.masz2k1or
+.masz2k1ö
+.ma1th
+.ma2uz
+.má2r1is
+.me2g1e2
+.me2g1é2
+.meg1if
+.mego2
+.me2g1ő2
+.me2i
+.mel2lá
+.me2ny1u2
+.me2zá
+.médi2af
+.mé2ná
+.mé2no
+.mé2sza
+.mé2szet
+.mé2szi
+.mé2szo
+.mé2zis
+.mi3rá
+.mo2lyan
+.műi2
+.mű1kr
+.mű1s
+.n2
+.na2gya
+.na2gyá
+.na2gye
+.na2gyú
+.na2pap
+.na2p1ar
+.na2pál
+.na2p1e
+.na2pés
+.na2p1o2r
+.na2pö
+.ne2ma
+.ne2meg
+.ne2m1el
+.ne2min
+.ne2ol
+.ne2szá
+.net2t1a2
+.ne2um
+.né2gyá
+.né2pa
+.né2v1ál
+.né2vel
+.no2r1
+.nya2k1á2ro
+.nya2k1e2
+.nya2k1ö2
+.nyol2c1an
+.o2
+.oda1
+.ok1a2d
+.ok1a2l
+.okka2
+.ola2j1e2
+.ola2sz1ó2
+.olda2l1út
+.or2r1aj
+.or2r1alt
+.or2ran
+.or2r1e2
+.orré2
+.or2r1és
+.or2v1a2
+.or2vá
+.or2v1é
+.orvi2
+.or2vis
+.ot1tr
+.ó2
+.ólo2m1a
+.óme3g2
+.ón1a2
+.ón1á2
+.ón1e2
+.ón1év
+.óvá2s1árt
+.ö2
+.ön1d2
+.ön1e2
+.öni2
+.ön1í
+.ön1k2
+.ön3n
+.ön1o
+.ön1ő
+.ön1s
+.ön1ü
+.össz1a
+.össz1á
+.öte2
+.öt1eg
+.öt1el
+.öt1t2
+.öv1e2g
+.öv1e2l
+.öv1ő2
+.ő2
+.őa3l
+.ői3r
+.őr1ab
+.őr1an
+.őr1e2g
+.őr1é2g
+.őr1é2s
+.őr1ist
+.őr1o
+.őr2s1ág
+.őr1u2
+.őr1üg
+.ős1a2
+.ős1á2
+.ős1eg
+.ős1e2l
+.ős1e2r
+.ős1e2s
+.ős1é2g
+.ős1ért
+.ős1í2
+.ős1o
+.ős1ó2
+.ős1p
+.ős1tr
+.ős1u2
+.ős1ú
+.ősz1a2
+.ősz1á
+.ősz1e2g
+.ősz1el
+.ősz1em
+.ős3zene
+.ős3zené
+.őz1a2
+.őz1eg
+.őz1e2l
+.őze2t
+.őz1ete
+.őz1ék
+.őz1ére
+.őz1ő
+.őz3s
+.őz1u
+.p2
+.pa2da
+.pa2d1á2
+.pa2din
+.pa2d1ó2
+.pa2i
+.pa2par
+.pa2pál
+.pa2pe
+.para1f2r
+.parke2
+.par2ker
+.par2ta
+.par2tel
+.par2ter
+.pá2c3s
+.pán2ta
+.pár2t1ö
+.pen3ny
+.pe2r1a2
+.pe2r1á
+.pe2r1enc
+.pe2rok
+.pe2rül
+.pe2s
+.pia2c3s
+.pina1
+.pin2t1ó
+.ple2i
+.ponta2
+.pon2te
+.po2rad
+.po2ral
+.po2ran
+.po2rác
+.po2rál
+.po2re
+.po2r1us
+.pó2kis
+.pó2k1ö
+.pó2rás
+.pó2t1e
+.pó2t1é
+.pre1k2
+.prés3s
+.proto1p2
+.q2
+.r2
+.ra2b1as
+.ra2b1á
+.ra2be
+.rabic1
+.ra2b1il
+.ra2b1i2z
+.ra2bí
+.ra2bor
+.ra2bö
+.ra2b1ő2
+.ra2bú
+.ra2gal
+.ra2j1ö2
+.rajtó2
+.raj2t1ór
+.rá2cs1á2z
+.rá1dr
+.rá1fr
+.rá1gr
+.rái2
+.rán2c1e
+.rány2
+.rá1spr
+.rá1s2t
+.rát2
+.rá1tk
+.rá1tr
+.re1k2re
+.ren2d1a2
+.ren2d1ő2
+.re1p2ri
+.rep2ro
+.re1prod
+.rete2k1
+.ré2m1emb
+.ré2mu
+.ré3p2a
+.ré2sa
+.rés3szer
+.ré2sza
+.ré2szá2
+.ré2sz1e2le
+.ré2szell
+.ré2szer
+.ré2szí
+.ré2szo
+.ré2sző
+.ré2t1a2
+.ré2t1á2
+.ré2v1á
+.ré2zá
+.ré2zel
+.ré2zet
+.ré2zis
+.ré2z1o
+.réz1z
+.ri2zso
+.rizs3z
+.rí2má
+.ro1c2kos
+.romé2
+.ro2m1ét
+.ro2min
+.ro2mis
+.ros2t1e2
+.rug1g
+.ru2m1a
+.ru2mil
+.rú2de
+.s2
+.sa2h1a
+.saj2te
+.sa2s1or
+.sa2vad
+.sa2v1ara
+.sa2v1ál
+.sa2vári
+.sa2v1e2
+.sa2v1é2
+.sá2r1ó
+.sá2rú
+.sás1s
+.sá2s3z
+.sá2v1a
+.sá2vá
+.sá2vó
+.sc2
+.se2bal
+.se2b1á
+.se2bel
+.se2besz
+.se2b1o
+.sé2fi
+.s3gr
+.si2em
+.si2ók
+.sín3n
+.sí2p1ő2
+.sí2r1a2
+.sí2rát
+.sk2
+.so2kél
+.so2kil
+.so2kis
+.so2kol
+.so2m1ag
+.so2mat
+.so1ny2
+.so2ral
+.so2rál
+.sör1e2g
+.sp2
+.spor2t1á2
+.st2
+.star2t1a2
+.sz2
+.szaba2d1e
+.sza2k1at
+.sza2k1ás
+.sza2k1e
+.sza2kö
+.sza2k1ü
+.szá2l1ó2
+.száz1z
+.szeg1ér.
+.sze2gí
+.sze2i
+.sze2m1á
+.sze2m1ér.
+.sze2m1é2ri
+.sze2r1ág
+.szer2v1a2d
+.szer2v1e2v
+.sze2szá
+.sze2szeg
+.sze2sz1ó2
+.szé2fa
+.szén1n
+.szé2t1
+.széte2
+.szín3n
+.szk2
+.szo2l1ó
+.szókész1
+.szó2szak
+.szószö2
+.szó2sz1öv
+.szt2
+.t2
+.ta2gal
+.ta2g1a2r
+.ta2g1á
+.ta2g1e
+.ta2gép
+.tag1g
+.ta2g1i2n
+.ta2gö
+.ta2nag
+.ta2n1as
+.ta2nál
+.tan1d2
+.ta2n1e2
+.ta2n1év
+.tané2ve
+.ta2nis
+.tan1n
+.ta2n1ó2
+.tant2
+.ta2n1u2s
+.ta3rá
+.ta2t1ál
+.ta2t1árai
+.ta2t1e2
+.ta2t1í
+.ta2tor
+.ta2tur
+.tá2l1ó2
+.tán2cse
+.tá2p1ol
+.tár2sor
+.tár2s1ö2
+.tár2t1es
+.tár2t1ölt
+.tá2v1a
+.távi2
+.tá2v1ir
+.tbc1
+.te2aka
+.te2ar
+.te2j1á2
+.te2j1eg
+.terape2
+.ter2v1a2
+.ter2v1á2
+.tes2ték
+.tes2t1öl
+.tetraé2
+.teza2
+.té3k
+.té2nyem
+.té2nyí
+.té2ra
+.té2rá
+.té2ret
+.tér1int
+.tí2z1ó2
+.tí2zs
+.tízü2
+.to2káro
+.tol2le
+.topa3u2
+.to2r1á2l
+.to2r1odv
+.tor2z3se
+.tó1st
+.tó2t1ér.
+.tön2k1a
+.tőa2
+.tőe2
+.tő2gya
+.tő2r1éss
+.tő2r1é2sz
+.tra2u
+.turnus1s
+.tus3s
+.tu2sz
+.tus3zá
+.tú2r1att
+.tű2z1ért
+.tű2z1ő2r
+.tű2zse
+.tyú2ka
+.u2
+.ugrás1s
+.un1in
+.uni2o
+.utas1s
+.utás4
+.uto2
+.utó2d1ö
+.ú2
+.új1as
+.új1e
+.úr1a2
+.úr1á2
+.úr1e
+.úszós2
+.úszó1sp
+.út1a2
+.út1á2
+.út1e2
+.út1ol
+.út1ő
+.út1ü2
+.ü2
+.ügy1ér.
+.ük1a2
+.üstö2l
+.üs2t1ölő
+.ütőkész1
+.üve2g1e2l
+.ű2
+.űr1a2
+.űr1á2
+.űr1e2
+.űr1é2s
+.űr1éte
+.űri2
+.űr1ita
+.űr1öss
+.űr1s
+.űrt2
+.v2
+.va2d1al
+.va2dár
+.va2dét
+.va2d1o2r
+.va2dóv
+.va2d1ö
+.va2d3z
+.va2gy1i
+.va2j1e
+.va2k1ak
+.va2kal
+.va2k1an
+.va2kap
+.va2k1ár
+.va2k1e2
+.va2k1ö
+.va2rak
+.va2r1á2s
+.va2r1e2
+.va2r1ing
+.va2sab
+.va2sar
+.va2s1a2tom
+.va2s1á2g
+.va2sárk
+.va2sás
+.va2s1e
+.va2sék
+.va2s1i2r
+.va2sol
+.va2s1or
+.va2só
+.vas3s
+.vas1tr
+.va2s1ü
+.va2s3z
+.vács1
+.vá2dá
+.vá2d1e
+.vá2ma
+.vár1a2dá
+.vá2r1i2s
+.vá2r1ol
+.verés1s
+.ver2s1ég
+.ver2s1o
+.ver2sz
+.vé2g1é2k
+.vé2g1o
+.vé2nyel
+.vé2r1a2
+.vé2rá
+.vé2r1eb
+.vé2r1eg
+.vé2rik
+.vé2r1o
+.vé2ró
+.vér2t1ék
+.vé2ru
+.vé2sza
+.vé2szá
+.vé2szer
+.vé2szí
+.vé2szo
+.vé2sz1ó2
+.vi1g2n
+.ví2zed
+.ví2zem
+.vona2t1út
+.von2z1e2
+.w2
+.x2
+.y2
+.z2
+.za2be
+.za2b1i2n
+.zai2
+.za2j1e2
+.za2j1ö
+.za2jut
+.zá2r1a2dá
+.zá2r1e
+.zá2r1ó2ra
+.zárta2n
+.zár2t1any
+.zár2t1é
+.zár2t1ö2v
+.ze2i
+.zé2t1
+.zs2
+.zű2r1ő
+2a.
+a1a
+aa2be
+aa2cé
+aa2ch
+aa2da
+aadás1s
+aa2dássz
+aa2dó
+aa2du
+aa2fo
+aa2ga
+aa2gi
+aa2gó
+aa2gy
+aa2já
+aa2ka
+aa2ká
+aa2ko
+aa2ku
+a2al.
+aa2la
+aala2g1
+aa2lá
+aal1eg
+aa2lé
+aalmana2
+aalmanac3
+aa2lo
+aal1os
+aa2lu
+aa2ma
+aa2na
+aa2ne
+aa2ni
+aa2no
+a2ans
+aa2ny
+aa2pa
+aa2pá
+aa2po
+aa2pu
+aa2ra
+aa2rá
+aa2ré
+aa2ri
+a2arl
+aa2ro
+aa2sz
+aa2to
+aa2ty
+aa2ur
+aa2ut
+aa2va
+a2avo
+aa2zo
+a1á
+aá2bé
+aá2cs
+aá2fá
+aá2ga
+aá2gá
+aá2gé
+aá2gi
+aá2go
+aá2gu
+aá2gy
+aá2hí
+aá2ju
+a2ál.
+aá2la
+aá2lo
+aá2po
+aá2ra
+aá2rá
+aá2r1e2
+aá2ré
+aá2ri
+aá2ro
+aá2ru
+aá2rú
+aá2sa
+aá2sá
+aá2so
+aá2só
+aá2ta
+aá2t1á2
+aá2t1e2
+aá2té
+aá2t1i2
+aá2tí
+aá2to
+aá2t1ö
+aá2tu
+aá2tú
+aá2tü
+aá2zá
+aá2zó
+2abab
+ab1adó
+aba2dz
+1a2bajg
+ab1akk
+2abal
+2aban
+aba2nal
+aba1pr
+2abar
+aba2rat
+a2b1a2ráb
+a2b1au
+2abáb
+abá2b1u2r
+2abád
+2abán
+a2b1áp
+abá2rak
+ab1á2ron
+ab1á2rú
+2abáz
+abb2a
+1abbah
+2abea
+abeá2
+a2b1e2b
+2abec
+ab1edé
+2abeé
+2abef
+2abeh
+2abei
+2abej
+ab1ejt
+ab1ela
+ab1e2lá
+2abele
+abe2lem
+2abels
+ab1elsz
+a2b1elt
+ab1elv
+2abem
+ab1emb
+a2b1erd
+2abetá
+2abete
+2abeté
+2abeto
+2abetö
+2abev
+a2b1ex
+2abék
+2abél
+2abén
+a2b1é2ne
+a2b1ép
+2abér
+a2b1érz
+2abétá
+a2b1éve
+ab1fl
+ab1fr
+2abic
+ab1i2do
+2abie
+ab1i2ke
+ab1iks
+a2b1i2nai
+abi2náb
+a2b1ing
+2abir
+ab1irkái
+ab1ism
+2abit
+a2b1i2ta
+2abiz
+a2b1íj
+ab1írn
+ab1kr
+1ablaká
+1ablakh
+1ablakk
+1ablakos
+1ablakr
+2ablo
+a1b2lú
+2abog
+2aboh
+2abok
+2abolt
+ab1oltó
+2abom
+abo2rak
+abo2r1as
+abo2rin
+2abot
+a2b1öb
+abö2l
+ab1ölő
+ab1ölt
+a2b1ös
+a2b1öt
+a2b1ö2z
+ab1őrl
+ab1pr
+ab2rek
+2abri
+a1b2rike
+ab2rin
+a1b2rit
+2abró
+ab2rók
+ab1st
+a2b1urd
+ab1úr.
+ab1úrt
+abú2s1á
+ab1úsz
+ab1ü2l
+ab1üs
+ab1üv
+a2b1üz
+aca2la
+aca2lá
+aca2l1e2
+aca2lét
+a2c1a2n
+aca2tá
+a2c1ág
+a2c1ál
+acci2ó
+ac2cö
+ac3cse
+ac3csí
+ac3csü
+acc3sz
+a2ce.
+ac1ebé
+a2c1eg
+ace2l
+a2c1ele
+a2c1elé
+a2c1elh
+ac1elle
+a2c1elm
+a2c1elo
+a2c1elv
+ac1emb
+2acen
+ace2ta
+a2c1e2v
+a2c1ex
+a2célá
+acél1e2
+a2célé
+a2c1ép
+a2c1é2re
+a2c1érte
+ac1fr
+a2chá
+ac3héj
+ac3hí
+a2c3hoz
+ac3hó
+a2c3hö
+a2c3hú
+ac1ide
+a2c1i2gá
+a2c1i2gé
+a2c1ike
+2acin.
+a2c1ind
+ac1inf
+a2c1ist
+a2c1ír
+ac1ív
+ack1aro
+ac2kál
+ac2k1e2v
+acké2r
+ac2k1ére
+ack1éte
+ac2kil
+ac2k1osz
+ac2kös
+ac2kű
+ac2lu
+a2c1op
+ac1ös
+ac1őr
+ac1pl
+ac1pr
+2acsal
+acs1alj.
+acsa2p1á2g
+a2cs1atk
+acs1áll
+a2csáru
+acse2c
+acs1egy
+ac3seml
+1a2cséb
+a2cs1ék
+2acsi
+2acsí
+2acson
+acs1orm
+a2cs1öc
+acs1s
+ac3str
+a2csúl
+a2cs1úr
+acsü2l
+a2csüt
+ac3szá
+ac3sze
+ac3szö
+ac1tr
+a2c1ud
+2acula
+a2c1ut
+ac1új
+ac1üg
+ac1ür
+ac1üz
+ac3za
+ac3zá
+ac3ze
+ac3zs
+ac3zu
+a2d1a2da
+a2d1a2dá
+1a2dag.
+ada2gá
+1a2dagb
+a2dagg
+1a2dagh
+1adagi
+1a2dagj
+1a2dagn
+1a2dago
+1a2dagr
+1a2dagt
+1adagu
+1a2dagú
+a2d1aktá
+ada2lap
+ada2l1es
+1adalé
+ada2lén
+ada2l1osz
+ada2l1ó2
+ada2l1út
+a2d1ana
+a2d1ann
+1adapt
+2adar
+ada2ral
+ada2re
+ada2r1és
+ada2r1in
+ada2rut
+ada2tab
+ada2tal
+ada2t1a2n
+ada2t1ár.
+ada2t1á2rak
+ada2t1á2ram
+ada2t1á2rat
+ada2t1á2rá
+ada2t1árb
+ada2t1árr
+ada2t1á2ru
+1a2datáu
+ada2t1e2g
+ada2tel
+ada2t1es
+adaté2r
+ada2t1érd
+ada2t1érő
+1a2datin
+ada2tint
+ada2tis
+ada2tív
+a2datm
+ada2t1old
+ada2t1öl
+ada2t1ő
+a2datv
+ad1azo
+a2d1ág
+adára2
+adá2rak
+adá2ris
+ad2del
+ade2g
+ad1ege
+ad1egé
+ad1egy
+ade2i
+a2d1ej
+adel1ej
+ad1elh
+ad1elm
+ad1eln
+a2d1e2lő
+ad1elr
+ad1elt
+a2d1emb
+ad1e2mé
+a2d1eml
+a2d1emu
+ad1eng
+ad1e2pe
+ad1epr
+a2derd
+ad1erő
+ade2ti
+a2deu
+a2d1e2v
+a2d1ex
+adé2kat
+adé2k1e2
+adé2kés
+adé2kis
+adé2kü
+adé2kű
+ad1éle
+2adémont
+a2d1ép
+a2d1érz
+adé2s
+adé2te
+a2d1é2ve
+ad1fl
+adfo2k1út
+ad1gr
+1adhé
+2adia
+adia2n
+ad1i2bo
+2adid
+adi2kut
+2adin
+ad1i2na.
+ad1i2nai
+ad1ind
+a2d1ing
+adi2o1g2ra
+2adip
+2adis
+2adiv
+a2d1í2z
+ad2ji
+adka2na
+ad1kr
+2adob
+2adoc
+a2d1okke
+2adol
+ad1ola
+1a2domá
+2adomb
+2adomi
+1a2dop
+a2d1orc
+a2d1org
+2adorh
+2adorian
+2adorig
+ad1orv
+a2d1orz
+a2d1osz
+a2dógu
+1a2dóku
+a2dómé
+a2dórá
+1a2dósat
+2adósi.
+ad1ó2vás
+1a2dózó
+a2d1ö2k
+a2d1ö2l
+ad1örd
+a2d1ös
+adőr1a
+adő2rel
+ad1ő2s
+ad1pl
+ad1pr
+a1d2rac
+ad2ram
+ad2raz
+2adrá
+ad2rám
+2adro
+ad2rog
+a1d2rót
+ad2ruk
+ad1sp
+ad1st
+2adug
+2adum
+2adup
+ad1u2rá
+ad1úsz
+adú2t
+a2d1úto
+a2d1üg
+ad1ü2lé
+a2d1üt
+ad1üz
+a2d1űr
+ad1űz
+ad1yéh
+ad1yér
+ad3zab
+ad3zav
+ad3zár
+ad3zel
+ad3zón
+a2d3zö
+ad3zsí
+a1e
+ae2bé
+ae2ce
+ae2cs
+ae2dé
+ae2dz
+ae2ge
+ae2gé
+ae2gy
+ae2he
+ae2ke
+ae2ké
+ae2la
+ae2l1á2
+ae2le
+ael1ej
+ae3len
+ael1érh
+ae2l1í2
+ae2lo
+ae2l1ö2
+ae2lő
+ae2lu
+ae2me
+ae2mé
+ae2mi
+ae2mu
+ae2ne
+ae2pe
+ae2pé
+ae2pi
+ae2po
+ae2red
+ae2ré
+aero1s
+ae2ró
+ae2rő
+ae2se
+aes1er
+ae2sé
+ae2si
+ae2ső
+ae2sü
+ae2sz
+ae2ta
+ae2tá
+ae2te
+ae2ti
+ae2tű
+ae2va
+ae2ve
+ae2vé
+ae2vi
+ae2vo
+ae2vő
+ae2xe
+ae2zü
+a1é
+aé2derv
+aé2ge
+aé2gé
+aé2gő
+aé2he
+aé2je
+aé2ke
+aé2kí
+aé2le
+aé2lé
+aé2li
+aé2lő
+aé2lü
+aé2lű
+aé2ne
+aé2pí
+aé2pü
+aérde2m1
+aé2ri
+aé2te
+aé2va
+aé2ve
+aé2vé
+aé2vi
+aé2vü
+2afa.
+2afaj.
+2afaja
+2afajá
+2afajb
+2afa2j1e2
+2afajj
+2afajn
+2afajo
+2afajt.
+2afaju
+2afajz
+2afak
+2afal
+2afam
+2afao
+2afar
+2afas
+afe2l1e2m
+2afék
+2aféli
+2afélő
+2afélt
+2afén
+2afér
+2afés
+1affé
+afi2ap
+afi2asz
+afi2ke
+afi2t1a2
+afi2t1e2
+af2le
+a1f2lo
+a1f2ló
+a1f2lö
+a1f2lu
+2afoc
+2afog
+2afok
+2afol
+2afon
+2aford
+2aforg
+2aformác
+2aformál
+2aformátu
+2aformáz
+2aformu
+2aforr
+2afos
+2afot
+af2rak
+2a1f2re
+af2riz
+af2rí
+2afro
+af2ron
+2a1f2rö
+af3tá
+afus3s
+a2g1abl
+ag1abr
+ag1a2cé
+ag1aga
+a2g1a2ka
+a2g1akk
+a2g1akt
+2agal
+a2g1a2lak
+a2g1a2lap
+a2g1a2lá
+a2g1alj
+a2g1alm
+aga2lom
+a2g1alt
+ag1ang
+ag1a2no
+ag1ant
+a2gany
+a2gap
+ag1apa
+ag1apá
+a2g1arc
+a2g1aré
+a2g1a2ro
+a2g1art
+aga2tom
+ag1a2tó
+a2g1a2ur
+ag1aut
+a2g1ava
+2agaz
+ag1a2zon
+agá2c
+a2g1ács.
+a2g1ácsi
+ag1á2ga
+1a2gák
+a3gála
+a2g1álm
+agá2lyan
+a2g1áp
+a2gár.
+a2g1árad
+a2g1á2rai
+a2g1á2rak
+a2g1áras
+a2g1árat
+a2gá2rá
+a2gárb
+a2g1árc
+a2gáre
+a2gáré
+agá2rév
+a2gárf
+a2gárh
+a2gá2ri
+a2gárj
+a2gárk
+a2gárm
+a2gárn
+ag1árná
+a2gáro
+a2gárr
+a2gárs
+a2gárt
+a2g1á2ru
+a2g1á2rú
+ag1ásv
+a2g1átá
+a2g1á2t1e2
+ag1átfe
+a2g1áth
+a2g1átk
+a2g1átm
+agá2tol
+a2g1áts
+ag1átü
+a2g1átv
+ag1bl
+ag2del
+agdí2j1a2da
+a2ge.
+ag1e2cs
+a2g1e2d
+a2g1e2g
+age2l
+a2g1ela
+ag1elb
+ag1eld
+ag1ele
+ag1elé
+ag1elf
+ag1elh
+ag1eli
+ag1elm
+ag1eln
+a2g1elo
+a2g1elő
+ag1elr
+ag1els
+ag1elt
+ag1elű
+ag1elv
+ag1elz
+a2g1e2m
+ag1eng
+a2g1eny
+a2g1e2p
+a2g1erd
+age2red
+a2g1erk
+a2g1erő
+age2s
+a2g1e2v
+a2g1ex
+a2g1ez
+a2g1é2j
+a2g1ék.
+a2g1ékn
+a2g1é2l
+agé2né
+agé2p1i2p
+a2g1é2pül
+a2g1ér.
+a2g1é2re
+a2g1é2ré
+a2g1érh
+a2g1é2ri
+a2g1érk
+ag1érl
+ag1érm
+ag1érte
+ag1érté
+ag1érth
+a2g1értő
+ag1ész
+a2g1éte
+a2g1éve
+ag1fl
+ag1fr
+1agg.
+ag2g1a2ty
+ag2g1em
+ag2git
+1aggl
+1aggod
+1aggok
+ag3gyar
+ag3gye
+ag3gyi
+ag3gyo
+ag3gyü
+agi3a
+ag1ide
+a2g1i2ga
+a2g1ige
+a2g1igé
+ag1ike
+a2gill
+ag1inf
+a2g1ing
+a2g1int
+a2g1i2oni
+agi2ó
+a2g1ip
+ag1iro
+a2g1ist
+agi2sz
+a2gita
+ag1izé
+ag1izm
+a2g1íj
+ag1ín
+a2g1ír
+ag1ív
+a2g1íz
+agká2rok
+ag1kl
+ag1kr
+ag2ne.
+a1g2non
+a2g1ob
+ag1oltó
+ago2ly1a2
+2agom
+2agona
+agon3n
+ago2n1osz
+a2g1op
+a2g1org
+ag1orj
+a2g1orn
+a2g1orr
+a2g1ors
+a2g1orv
+a2g1otth
+agó2rái
+a2g1ö2l
+ag1önk
+ag1önt
+a2g1örö
+ag1örv
+a2g1ös
+a2g1öt
+a2g1ö2v
+a2g1ö2z
+a2g1őr
+a2g1ő2s
+ag1pl
+ag1pr
+2agrammj
+a1g2rav
+2agrá
+a1g2róf
+ag1sk
+ag1sp
+ag1sr
+ag1st
+agsz2
+ag1szt
+ag1tr
+a2g1und
+a2guram
+agu2rat
+ag1u2rá
+ag1urn
+ag1u2tá
+a2g1új
+ag1úta
+a2g1úti
+ag1útt
+a2g1ü2l
+a2g1ür
+a2g1üs
+a2g1üt
+a2g1üv
+a2g1üz
+ag1űr
+ag1űz
+a2gy1a2c
+a2gyad
+agy1a2dó
+agy1a2gya
+a2gyaj
+1a2gyak.
+a2gyakb
+agya2la
+agy1alap
+agy1alg
+a2gyalj
+agy1alko
+agy1alm
+1a2gyam
+agy1ana
+a2gy1any
+a2gy1apa
+agy1apja
+agy1apjá
+a2gy1a2pó
+a2gy1apr
+agya2sz
+a2gy1aszó
+a2gyál
+agy1árv
+a2gy1e2c
+agy1e2g
+a2gy1el
+agy1em
+agy1est
+agy1esz
+a2gyev
+a2gy1ez
+agy1ék.
+agy1éke
+agy1ékk
+agy1ér.
+a2gy1é2re
+agy1érn
+agy1érr
+agy1érs
+a2gyima
+agy2nyá
+agyo2r
+a2gy1oro
+a2gyorr
+a2gy1ö2l
+a2gy1ő2r
+agyu2r
+agy1urá
+1a2gyú.
+1a2gyúa
+a2gyún
+agy1úr.
+agy1ú2sz
+a2gyút
+2agyű
+aha2l1e
+aha2sábr
+ahelyü2kü
+ahert2
+aher1tze
+ahé2j1út
+ahitköz1
+ah1o2vi
+ahú2sár
+ahús3s
+a1i
+ai2bo
+2ai2de
+ai2dom
+2ai2dő
+a2iék
+ai2ga
+ai2gá
+ai2ge
+ai2gé
+ai2gy
+ai2ia
+ai2ib
+ai2ih
+ai2ij
+ai2in
+ai2ir
+ai2it
+ai2je
+aika2
+ai2kab
+ai2k1ad
+ai2k1al
+ai2k1ar
+ai2k1as
+ai2k1á
+ai2ke2
+aik1el
+aiki2
+ai2kik
+ai2kis
+ai2k1ol
+ai2k1osz
+ai2kő
+ai2kü
+a2ilb
+a2ile
+2aill
+ail2le.
+ail2lo
+ai2ma.
+2ai2má
+2aimi
+ai2mit
+2aimp
+ai2na.
+ai2na2l
+ain1ala
+2ai2nas
+ainá2
+ai2n1álo
+ai2nár
+2aind
+ai2ne
+ai2nél
+2ainf
+2aing
+ai2n1in
+ai2nol
+2ainp
+2ains
+2aint
+ai2nü
+ai2onb
+ai2onn
+ai2ono
+ai2onr
+ai2ont
+ai2pa
+a2ir.
+ai2ram
+2ai2rat
+2ai2rá
+ai2re.
+ai2ré
+ai2ri
+2airo
+ai2rod
+a2i2se
+ai2si
+2aisk
+2aism
+2aist
+2aisz
+ai2sza
+ai2szo
+2ai2ta
+ai2vad
+ai2var
+ai2vás
+2ai2vó
+ai2zé
+ai2zom
+a1í
+aí2gé
+aí2ja
+aí2já
+aí2ju
+aí2ra
+aí2rá
+aí2ro
+aí2ró
+aí2ru
+aí2té
+aí2vá
+aí2ve
+aí2vé
+aí2vi
+aí2vó
+aí2vü
+aí2vű
+aí2ze
+aí2zé
+aí2zü
+aí2zű
+a2j1a2dó
+a2j1adu
+aj1aga
+aj1agr
+aja2kol
+a2j1akó
+aja2kú
+a2j1ana
+a2j1ant
+a2j1any
+aj1apr
+a2j1áa
+ajá2c
+aj1á2go
+1a2jánd
+1ajánl
+a2j1áp
+2ajár
+a2j1árb
+a2j1árc
+a2j1áre
+a2j1áré
+a2j1árr
+aj1ásá
+aj1ásv
+a2j1á2t1e2
+ajá2z
+aj1ázá
+aj1bl
+aj1br
+aj2d1alm
+aj2d1a2lom.
+aj2d1a2lomm
+aj2d1a2lomn
+aj2d1a2lomr
+aj2d1a2lomt
+a2j1e2c
+a2j1ef
+a2j1egé
+a2j1ela
+aje2leme
+a2j1elf
+aj1ellá
+a2j1elo
+aj1elő
+aj1elvá
+aj1elvo
+a2j1e2m
+aj1ene
+aj1enz
+a2j1e2r
+aj1e2se
+a2j1ex
+a2j1ez
+a2j1ége
+a2j1égé
+aj1égő
+a2j1é2k
+a2j1él
+a2j1ép
+ajé2r
+a2j1ére
+a2j1éte
+aj1fl
+aj1fr
+aj1g2r
+a2j1i2d
+a2j1ij
+a2j1ik
+a2j1im
+a2j1int
+a2j1io
+a2j1ip
+a2j1iz
+aj1ír
+aj1íz
+aj1kl
+1ajkú.
+ajobb1o
+ajo2g1á2sza
+a2j1ola
+aj1old
+a2j1o2v
+a2j1ócskás
+ajó2sár
+aj1öb
+a2j1ök
+a2j1ör
+a2j1öz
+aj1őr
+aj1ő2s
+aj1pl
+aj1pr
+aj1sh
+aj1sk
+aj1sp
+aj2tág
+aj2teg
+aj2t1é2t
+ajt1org
+aju2hi
+a2j1új
+aj1úsz
+a2j1úto
+a2j1útr
+aj1üg
+aj1ül
+aj1üs
+aj1üz
+aj1űz
+ajz1aka
+ajz1atl
+aj2zer
+aj2zí
+aj2zü
+2akab
+aka2cse
+a2kadag
+a2k1a2data
+a2k1a2datb
+a2k1a2datn
+a2k1a2dato
+a2k1a2datr
+a2k1a2datt
+1akadál
+1a2kadém
+a2k1adm
+a2k1aga
+2akal
+ak1a2lag
+a2k1a2lak
+aka2lapú
+a2k1aleg
+ak1alko
+2akam
+2akan
+2akao
+2akap
+aka2pád
+ak1app
+ak1a2rai
+ak1arasz
+a2k1a2ráb
+a2k1a2rák
+2akarc
+a2karch
+2akard
+ak1a2rén
+2akari
+2akarr
+2akasí
+2akast
+aka2szaj
+ak1a2szat
+aka2szel
+aka2szö
+a2k1asztr
+2akata
+aka2tab
+2akate
+aka2tel
+aka2ter
+akati2
+aka2tik
+aka2tim
+aka2tin
+2akau
+a2k1autó
+2akav
+2akaz
+1akác.
+a2k1áf
+a2k1ág
+aká2l1a
+aká2lis
+a2k1álló
+ak1árad
+a2k1árb
+a2k1árj
+a2kárk
+aká2rokn
+a2k1ártó
+a2k1á2ru
+aká2sad
+aká2saj
+aká2sal
+aká2sar
+aká2sav
+aká2sást
+akás3s
+ak1á2szán
+aká2szu
+a2k1ászun
+akát1a
+a2k1átla
+ak1bl
+akció2s1ű2
+a2ke.
+ake2cs
+a2k1e2dz
+ak1e2ge
+ak1e2gé
+a2k1ela
+a2k1elá
+ake2lem
+ak1elh
+a2k1elj
+a2k1elo
+ake2lők
+a2k1elr
+a2k1elv
+a2k1emb
+ak1e2mel
+a2kerd
+ak1e2rei
+a2k1e2ró
+a2k1e2rő
+a2kesp
+a2k1est
+ak1eszk
+ak1eszm
+a2k1e2te
+ak1e2ti
+a2k1e2vez
+ak1é2kem
+ak1é2kes
+a2k1é2ké
+a2k1ékh
+ak1ékrő
+2akém
+2akény
+2akép.
+2aképb
+2aképe
+2aképé
+2aképh
+2aképk
+2aképl
+2aképn
+2aképpel
+2aképpé
+2aképr
+2aképt
+2aképü
+2aképz
+a2k1érc
+2akérd
+a2kérdek
+2akére
+2akéré
+a2k1érm
+2akérő
+a2k1é2rői
+a2k1é2rőj
+a2k1érr
+a2kérteke
+a2k1értel
+a2k1értet
+a2k1értő
+2akérv
+a2k1érz
+2akés
+a2k1észa
+a2k1é2te
+2akéts
+a2k1étt
+2akéz
+ak1fl
+ak1fr
+akgerinc1
+ak1gr
+2akia
+2akib
+2akic
+2akid
+a2k1i2dé
+ak1idi
+2akie2
+2akié
+2akif
+ak1iga
+a2k1igé
+2akigy
+2akih
+2akií
+2akij
+2akil
+a2k1ill
+ak1ily
+2akim
+a2k1i2má
+a2k1imi
+2akin
+ak1ind
+a2k1ing
+a2k1ins
+a2k1ion
+2akir
+aki2rom
+2akis
+a2k1isi
+a2k1isk
+ak1ism
+a2k1ist
+2akit
+2akiv
+2akiz
+a2k1izm
+a2kíté
+a2k1í2z
+ak2k1a2d
+ak2kaj
+ak2k1a2la
+akk1alk
+ak2k1arc
+ak2kál
+ak2k1á2p
+ak2k1ed
+akk1ell
+ak2kelm
+akk1elt
+ak2kem
+ak2k1eró
+akke2s
+akk1ese
+ak2ket
+ak2kola
+1akkord
+akk1ölt
+ak2k1ös
+ak2kőr
+1akku.
+1akkum
+ak2lau
+ak2lav
+ak2lor
+ak2lón
+ak2lór
+1aknai
+1aknáb
+1aknáh
+1aknái
+1aknáka
+1aknáko
+1aknás
+1aknát.
+1aknáv
+1aknáz
+2akoa
+ak1obj
+2akoc
+2akof
+2akokt
+akolás3s
+a2k1olda
+a2k1o2ly
+2akom
+2akonc
+2akond
+2akonf
+2akong
+2akonk
+2akons
+2akont
+2akonv
+2akony
+2akonz
+2akoo
+2akop
+a2k1o2pe
+ak1o2rat
+2akorb
+2akord
+a2k1org
+2akori
+a2k1orj
+2akorl
+2akorm
+2akoro
+2akorp
+2akorr
+2akors
+2akort
+2akoru
+2akorú
+a2k1orv
+2akos
+2akóni
+2akó1p2
+a2k1ó2rá
+ak1ó2ród
+1a2kózá
+ak1össz
+akö2z1é2l
+aközrea3
+ak1őr.
+ak1ős.
+ak1pl
+ak1pr
+ak1ps
+akrádi2
+ak2rát
+2akre
+ak2rea
+2akré
+a1k2réme
+ak2réta
+ak2rétá
+2akri
+a1k2rit
+2akrí
+ak2ríz
+1akrob
+2akrónik
+ak1sp
+ak1sz2t
+ak2t1au
+aktár2s1a2d
+akt1emb
+1akti.
+ak2tim
+1aktívb
+aktí2ve
+ak2t1íve.
+1aktívk
+1aktívo
+1aktívs
+1aktívt
+akto2r1ál
+akt1osz
+ak1trá
+1aktua
+1aktú.
+a2k1udv
+a2k1ujj
+2akun
+1akupu
+a2k1úg
+a2k1új
+a2k1úrr
+a2k1üg
+a2k1ü2le
+a2k1ü2lé
+a2k1üln
+a2k1ü2t
+a2k1ü2v
+ak1ya
+a2l1abl
+alac1c
+alace2
+alaci2
+ala2cit
+ala2cor
+a2lacsé
+ala2c3sö
+ala2csü
+a2ladag
+a2l1a2datá
+ala2gál
+ala2g1e
+ala2gép
+ala2gol
+ala2gya
+ala2j1a2d
+ala2jas
+ala2j1e2
+a2lakad
+ala2k1an
+a2l1a2kas
+ala2kál
+ala2k1áp
+ala2kes
+1a2lakí
+a2l1akna.
+a2laknák
+a2laknát
+ala2kol
+a2l1a2kód
+ala2k1öl
+a2l1aktu
+1alaku
+a2lakul.
+a2lakult
+al1alg
+a2l1alj
+a2l1alk
+al1all
+al1alm
+al1a2lo
+al1alt
+ala2n1e
+1a2lanny
+a2lany
+ala2nyal
+ala2ny1e2
+ala2p1a2d
+ala2pak
+ala2pal
+a2lapan
+ala2p1á2r
+ala2p1e2
+ala2pill
+ala2pin
+ala2pir
+1a2lapítv
+ala2p1ol
+ala2por
+ala2p1osz
+alap1ó2
+alap1p
+al1a2ra
+al1a2rá
+al1arg
+ala1s2p
+a2l1aszp
+alaszta2l
+alat1any
+alatát1a2
+ala2t1e2v
+ala2t1inf
+ala2tív
+ala2t1ol
+alató2
+ala2tór
+a2l1attak
+1a2latti
+ala2t1ü2
+al1ava
+ala2zúr
+1a2láa
+1a2láá
+alába2d
+alá2b1ada
+al1ábrá
+1a2lábúj
+alá2dal
+alá2d1ap
+1a2láf
+a2l1ág.
+a2lága
+al1á2gá
+al1ágb
+a2l1ágg
+al1ágh
+al1á2gi
+al1ágk
+al1ágn
+al1á2go
+a2l1ágr
+al1ágt
+al1á2gú
+al1ágya
+1a2láí
+1a2lámo
+a2l1árad
+a2lárak
+a2lárá
+alá2rár
+a2l1árk
+aláste2
+alás2tel
+alás2t1ér.
+a2l1átd
+a2láte
+a2láté
+al1átép
+a2l1átf
+alá2ti
+a2l1átl
+a2l1átm
+a2látö
+a2látr
+a2látú
+al1bl
+al1br
+1album
+al1d2r
+a2le.
+2alea
+2aleb
+al1ebé
+2alec
+al1ece
+ale2g1e2lé
+al1egés
+alegész1
+al1egys
+a2legyü
+2aleh
+2aleí2
+2alej
+ale2k1a
+a2l1ela
+a2l1elág
+a2l1eld
+al1e2led
+ale2lem.
+ale2lemb
+ale2leme
+ale2lemk
+ale2lemm
+ale2lemt
+a2l1elg
+a2l1elh
+al1elm
+a2l1eln
+ale2lők
+ale2lőt
+a2l1elr
+a2l1els
+al1elté
+a2l1elv
+2alem
+a2l1emb
+a2l1e2mel
+al1e2mé
+a2l1eml
+2alen
+a2l1ene
+2alep
+ale2pe.
+a2lerd
+a2l1e2re
+a2l1erk
+a2l1ern
+2ales
+al1esem
+a2lesi
+ale2sik
+ale2tet
+alet2t1est
+aleü2
+2alev
+ale2vol
+ale2vői
+2alex
+a2l1exp
+2aléc
+2alég
+al1égő
+alé2kal
+alé2k1an
+alé2kat
+alé2k1em
+alé2ker
+alé2kes
+alé2kor
+a2lél.
+al1é2len
+a2l1é2let
+a2l1élé
+a2l1éll
+al1é2lő
+a2l1élü
+2alén
+a2léneke
+a2l1érd
+al1érs
+a2l1érte
+a2l1érté
+a2l1értő
+a2l1érz
+2alét
+alé2tek
+a2l1é2tel
+al1étl
+a2l1évi
+1alfás
+1algásat
+1algor
+al1gr
+2alic
+al1ide
+a2lidé
+al1i2do
+al1ifj
+a2l1igé
+2alik
+al1ill
+2alim
+a2l1i2má
+a2linas
+ali2nin
+alió2ra
+al1i2pa
+a2l1irá
+a2l1iro
+a2l1i2si
+a2lism
+ali1s2po
+al1iste
+2alite
+al1izma
+al1íj
+a2l1í2v
+alja2iké
+1aljaka
+1aljakb
+1aljaké
+1aljakk
+1aljako
+1aljas
+1aljái
+alj1árna
+al2j1á2ro
+1aljb
+1aljc
+1aljd
+1aljer
+1aljf
+1aljg
+1aljh
+1aljia
+al2jí
+1aljj
+1aljk
+1aljl
+1aljm
+1aljn
+1aljr
+1aljs
+1aljt
+1aljú
+1al2jü
+1aljv
+1aljz
+al2k1a2pó
+alkele2
+1alkím
+1alkoh
+1alkotá
+1alkotm
+1alkotó
+al1kre
+al1kro
+1alku.
+1alkud
+1alkun
+al2l1aj
+al2l1akt
+al2l1akv
+alla2l
+al2l1ala
+al2lalk
+al2lau
+all1áll
+all1ázs
+al2led
+all1egy
+all1emb
+1allerg
+all1ese
+all1est
+all1e2vő
+all1é2jé
+al2l1id
+al2lim
+all1int
+al2lip
+al2l1isk
+al2lí
+all1óri
+al2lös
+al2l1ő2
+al2lü
+1allű
+1almád
+2alob
+al1obe
+alogos1s
+alo2g1ó2
+a2l1okta
+al2old.
+aloma2
+alo2mad
+alo2mak
+alo2m1al
+alo2m1an
+alo2map
+alo2mar
+alo2mas
+alo2mác
+alo2már
+alo2m1át
+alo2mer
+alo2min
+alo2mis
+alo2mit
+alom1p2
+alo2m1ú
+alo2n1á
+alon1d2
+alon3n
+2alop
+al1opc
+a2l1ope
+al1o2ra
+al1orc
+al1orn
+al1o2ro
+a2l1orr
+alos3s
+a2l1ostá
+a2l1oszl
+2alov
+aló2c3se
+3alóguses
+alóigaz1
+alói2ko
+al1ó2lo
+al1ónn
+alóó2
+aló2ráj
+aló2rák
+aló2zan
+aló2zis
+a2l1öb
+a2l1ö2l
+a2l1ön
+a2l1ör
+a2l1ös
+a2l1ö2z
+alpe2l
+alp1ele
+al2piz
+al1sh
+al1sk
+al1sl
+al1sm
+al1sp
+alsz2
+al1szt
+al2tada
+al2t1alap
+alt1anya
+alt1elv
+alt1emb
+al2t1e2p
+al2t1e2v
+al2t1é2k
+alté2n
+alt1éne
+alt1érne
+al2t1é2rő
+al2t1érr
+alt1értő
+al2t1i2m
+alti2n
+alt1ina
+alti2p
+alt1ipa
+al2t1ir
+al2t1old
+1altonk
+al2t1osz
+al2tóc
+al2tön
+al1trak
+al1tran
+al1trav
+al2tur
+al2t1út
+al2tür
+1altvé
+al1ty
+alu1p
+1a2luss
+alu1str
+a2l1új
+al1úr.
+al1úrb
+al1úrh
+al1úri
+al1úrk
+al1úrn
+al1úrr
+a2l1úté
+a2l1úth
+a2l1útj
+a2l1útn
+a2l1útt
+al1üg
+al1ül
+al1ün
+al1ür
+al1üs
+al1üt
+al1üv
+a2l1üz
+al1űr
+al1űz
+1alveo
+1alvó
+a2ly1ap
+a2lyar
+a2lyál
+a2ly1e2
+a2lyév
+a2ly1id
+a2lyim
+a2lyis
+a2lyö
+a2lyug
+a2ly1ü2
+am1abb
+am1abl
+2amad
+a2m1a2dat
+am1a2dás
+a2m1adm
+a2m1a2dó
+a2m1a2du
+2amag
+ama2gát
+2amaj
+am1ajt
+ama2kar
+a2m1akt
+a2m1akv
+a2m1a2lak
+am1a2lap
+a2m1a2l1e
+ama2nya
+amaó2
+2amap
+2amas
+ama2sz1a2k
+ama2szeg
+ama2sz1em
+ama2szél
+ama2szö
+ama2tad
+amata2n
+ama2tárá
+ama2tel
+ama2told
+ama2t1osz
+ama2t1ó2
+a2m1a2u
+a2mazo
+a2m1álm
+a2m1á2rai
+a2m1á2rak
+amá2rá
+amát1a2dó.
+a2m1átk
+a2m1átl
+a2m1átt
+am2b1ag
+am2bal
+am2b1at
+am2b1ászá
+am2b1e2g
+am2b1e2le
+am2bep
+am2b1e2te
+am2b1ér.
+1ambula
+am1dr
+a2me.
+am1e2ce
+2ameg
+am1elá
+am1e2lem
+a2m1e2l1i
+am1elj
+am1elk
+a2m1eln
+a2m1elo
+a2m1e2lő
+a2m1els
+a2m1elt
+a2m1elv
+a2m1e2me
+a2m1eng
+2amenn
+amens1s
+amen2t1á2ro
+a2m1erd
+a2m1e2rő
+a2mesk
+2amest
+a2m1e2v
+a2m1ex
+am1ezr
+amé2hes
+amé2k
+am1éké
+amé2let
+a2m1ép
+a2m1érd
+a2m1értek
+a2mértel
+a2m1étk
+a2m1évé
+1amforá
+am1fr
+am1gr
+amid1i2
+ami2g
+a2m1iga
+a2m1igá
+a2m1igé
+a2mimá
+am1imi
+am1imp
+ami2na.
+ami2nan
+ami2nin
+a2m1inté
+amió2
+a2m1irá
+a2m1iro
+amise2
+ami2sel
+ami2sep
+ami2sz
+1amitbo
+1a2mitha
+1a2mitm
+1a2mitö
+1amitro
+1amitrú
+1a2mits
+1a2mittá
+1a2mittö
+a2míg
+am1kl
+am1kr
+amme2g
+am2m1egy
+am2meta
+am2m1é2t
+2amod
+a2m1oke
+a2m1okm
+a2m1o2koz
+am1ola
+a2m1old
+a2m1oltá
+a2m1op
+a2m1ors
+1a2mort
+a2m1orv
+2amos
+amos3s
+2amot
+2amoz
+am1ó2ri
+am1ö2r
+am1ös
+am1öt
+am1ö2z
+am1ő2r
+am1ős
+am1pla
+am1p2r
+1amput
+am1sk
+am1sp
+am1sr
+am1st
+am1t2r
+2amun
+a2muni
+amu2riz
+amu1sl
+a2m1u2tas
+a2m1új
+am1üg
+am1ü2l
+am1üt
+am1üz
+2anad
+a2n1a2dat
+a2n1adu
+a2n1aga
+a2n1agá
+an1a2gya
+a2n1ah
+2anai
+1a2nakr
+ana2lap
+1analí
+an1alk
+an1alm
+1a2naló
+an1a2mo
+a2n1ana
+1a2naná
+an1ann
+an1a2ny
+2anap
+ana2pa2
+an1apa.
+a2n1apá
+a2n1a2pó
+an1appo
+an1a2rab
+an1a2rá
+a2narc
+ana2sz1e2
+ana2szén
+ana2szin
+ana2sz1í2
+ana2szó
+ana2szü
+ana2t1e
+ana2tö
+2anav
+a2n1a2va
+a2n1az
+a2n1ág
+a2n1álmi
+a2n1á2lom
+a2n1á2p
+a2násat
+2anát
+a2n1áta
+a2n1átk
+a2n1átr
+an1br
+anca3u
+an2c1ál
+ance2
+an2ce.
+an2c1ér.
+an2c3hit
+an2cho
+anci2al
+an2c1ó2
+an2csaj
+an2csar
+ancs1ell
+ancs1emb
+an2cs1en
+ancs1e2p
+ancs1et
+an2cséré
+an2cs1ill
+an2csiz
+an2cs1í2z
+an2cs1or
+an2csö
+ancső2
+ancs1t
+an2csut
+an2cs1ü
+an2d1alk
+anda1s
+and1atl
+and1e2le
+and1elk
+an2d1elő
+and1els
+an2derd
+an2d1es
+1andez
+an2dél
+an2dil
+an2d1ö
+an2d1ő2
+an2dús
+an2dün
+an2dű
+an1dy
+an2dzá
+a2n1eb
+an1edd
+an1e2gé
+1a2nekd
+ane2la
+ane2l1á
+ane2l1e2l
+ane2l1emb
+ane2lél
+ane2lő
+2anem
+an1emu
+an1e2re
+an1ern
+an1err
+2aneu
+2anev
+a2n1ex
+ane2z
+an1ez.
+a2n1eze
+an1ezé
+an1ezt
+an1ezz
+a2n1é2ké
+a2n1éle
+an1épí
+a2n1éri
+a2n1érv
+a2n1étk
+a2n1étt
+a2n1évc
+an1évem
+an1éves
+an1évet
+ané2véb
+ané2vén
+ané2vét
+ané2vév
+an1évha
+ané2vig
+an1évke
+an1évkö
+a2n1évü
+a2névz
+anfé2l1é2v
+an1fl
+an1f2r
+anga2d
+an2g1ada
+an2g1ado
+an2g1ala
+an2g1a2ra
+an2g1ass
+ang1azo
+an2g1ác
+an2g1áll
+angár1a2d
+ang1áta
+an2g1átj
+an2g1átt
+an2g1ed
+an2g1eg
+an2g1elf
+an2g1elh
+an2g1elj
+an2g1ell
+an2g1eln
+an2g1elő
+an2g1elt
+an2g1elv
+an2gem
+ang1emb
+ang1eng
+an2g1e2r
+ang1ese
+ang1éle
+ang1élv
+an2g1é2ne
+an2g1ér.
+ang1érő
+an2g1és
+an2gim
+an2giz
+an2gí
+an2g1osz
+an2g1óri
+an2g1öl
+an2g1ös
+an2g1ő2
+ang1sz
+an2gü
+an2gű
+angye2
+angy1el
+an2gyék
+an1ide
+ani2g
+a2n1iga
+a2n1igé
+a2n1i2ko
+an1ind
+a2n1inf
+an1i2on
+2anip
+a2n1i2pa
+an1i2rá
+a2n1iro
+a2n1isi
+a2n1isk
+a2n1ism
+a2nita
+an1itt
+a2n1íg
+a2n1íj
+2anív
+a2n1íz
+ank1abl
+an2kaj
+an2k1a2k
+ank1ale
+an2k1a2n
+ank1arc
+ank1ari
+an2k1atl
+an2k1au
+an2kaz
+an2k1ál
+an2k1e2g
+an2k1ek
+an2k1e2l
+an2k1e2m
+an2k1e2reit
+an2k1erj
+an2k1es
+ank1érde
+ank1érem
+an2kérte
+an2k1érté
+an2k1i2d
+an2k1i2p
+an1klu
+an2k1old
+ank1oszt
+an2k1ö2römb
+an2kös
+an2k1ö2v
+an2kőr
+ank1t2
+an2k1ü
+an2ne.
+an3ny.
+an3nye
+an3nyo
+a2n1oj
+a2n1okta
+a2n1old
+1a2nomá
+2anor
+a2n1o2ro
+a2n1orr
+a2n1ors
+2anos
+a2n1ott
+a2nódd
+a2nódo
+anó1g2
+a2n1óni
+a2n1óno
+a2n1ó2rá
+an1óri
+a2n1öl
+a2n1ön
+a2n1ör
+a2n1ös
+a2n1ö2t
+an1pl
+an1pr
+an2s1e2l
+an1ska
+an2sö
+an1s2p
+ans3sze
+an1sta
+an2szal
+an2sz1á2bó
+an2sz1á2h
+an2szár
+ansz1es
+an2szél
+an2sz1én
+an2sz1é2p
+an2szil
+an2szin
+an2szó
+ansz1t2
+ansz1ü2l
+an2t1abl
+ant1aga
+an2t1eg
+1anten
+an2t1e2se
+ant1esz
+anti1llát
+an2t1ing
+an1t2re
+a2n1ud
+a2n1ug
+a2n1uj
+2anuk
+a2n1u2r
+anu2szi
+a2n1u2t
+a2n1úg
+an1ü2g
+anü2l
+a2n1ülő
+an1ü2z
+an1űr
+an1űz
+any1a2dó
+anyag1ár.
+anyag1árr
+1anyagb
+1a2nyagé
+anyag1g
+1anyagh
+1anyagk
+1anyagm
+1anyagr
+1anyagt
+1anyagú
+a2nyakad
+a2ny1a2kas
+a2ny1alk
+a2ny1all
+a2ny1ass
+any1aszt
+a2ny1a2tom
+a2nyaz
+1anyádt
+1anyáék
+any1álo
+a2ny1árá
+a2ny1árb
+a2ny1árf
+any1árk
+a2ny1árn
+a2ny1á2ro
+a2ny1árr
+any1á2sz
+any1d
+2anye
+a2ny1e2c
+a2ny1ed
+a2nyeg
+any1egé
+any1egy
+a2ny1e2k
+a2nyela
+anye2leme
+any1elev
+a2ny1ell
+a2ny1elo
+a2ny1em
+a2ny1en
+any1e2re.
+any1e2rei
+any1e2ret
+any1e2rén
+any1e2rér
+any1e2rét
+any1e2rév
+any1e2rőm
+any1e2rőr
+any1e2rőt
+a2ny1ég
+a2nyéhe
+a2ny1é2j
+a2ny1ék
+any1élv
+a2ny1ér.
+a2ny1érb
+a2ny1érc
+a2ny1érd
+a2ny1ére
+a2ny1érg
+a2ny1érh
+a2ny1é2ri
+a2ny1érk
+a2ny1érm
+a2ny1érn
+a2nyérő
+a2ny1érp
+a2ny1érr
+a2ny1érs
+a2ny1érte
+a2nyérté
+a2ny1értő
+a2ny1érv
+a2nyéve
+a2nyévé
+anyha2j1ón
+anyha2j1ó2r
+2anyi
+anyigaz1
+any1ing
+a2ny1io
+2anyí
+2anyo
+any1old
+a2ny1o2r
+any1órá
+any1ök
+any1ö2r
+any1öz
+a2ny1ő2
+any1s
+anyt2
+any1tr
+a2nyur
+2anyú
+2anyü
+any1ül
+a1o
+ao2áz
+ao2be
+ao2cs
+ao2da
+ao2dú
+ao2ka
+ao2ká
+ao2la
+aolaja2d
+aola2j1ada
+ao2mo
+ao2pá
+ao2pe
+ao2ra
+ao2ro
+ao2so
+ao2ut
+ao2ve
+ao2vi
+ao2xi
+a1ó
+aóá2r
+a2óbar
+a2óbá
+a2óbi
+a2óbo
+aó2ce
+aó2dá
+a2ódi
+a2ófá
+a2ófe
+a2ófo
+a2ófő
+a2ófü
+a2óhé
+a2óhi
+a2óhü
+a2óil
+a2óis
+a2ói2v
+a2óká
+a2óke
+aó1kré
+a2óku
+aó2la
+a2óle
+a2ólé
+a2óli
+aó2lo
+aó2lu
+a2ómag
+a2ómar
+a2ómas
+a2óme
+a2ómi
+a2ómo
+a2óné
+a2ónö
+a2ónő
+aó2rá
+a2óré
+aó2ri
+a2ósí
+a2ósű
+a2óta
+a2óte
+a2óté
+aó2vo
+aó2vó
+a1ö
+aö2bö
+aö2cs
+aö2dé
+aö2ko
+aö2kö
+aö2le
+aö2lé
+aö2lő
+aö2ná
+aö2rö
+aö2ve
+aö2vi
+aö2vö
+aö2zö
+a1ő
+aő2re
+aő2ré
+aő2ri
+aő2rö
+aő2rü
+aő2se
+aő2sö
+aő2sz
+apa2cs1a2v
+apa2cs1i
+a2p1a2da
+a2p1aga
+a2p1ajá
+a2p1akc
+2apal
+apa2lag
+apa2lak
+a2p1alb
+a2p1alj
+a2p1alt
+apa2mas
+a2p1ant
+2apap
+apa2pán
+ap1a2rán
+1apasá
+a2p1asp
+apa2tad
+apa2t1ala
+apata2n
+apa2t1as
+apa2tál
+apa2t1ö
+ap1aut
+2apav
+a2pava
+ap1a2zo
+a2pájú
+ap1állap
+a2p1állá
+a2p1állo
+apán1n
+a2p1á2rad
+ap1á2rai
+a2p1á2rak
+ap1á2ram
+ap1á2ras
+ap1á2rat
+apá2ráé
+apá2ráh
+apá2rán
+apá2rár
+apá2ráv
+apárba2
+a2p1áre
+a2p1á2ré
+a2p1árf
+ap1árka
+ap1árko
+a2p1árny
+ap1ártó
+a2p1áru
+a2p1á2rú
+apáská2
+apá2túr
+1a2páu
+ap1bl
+ap1dr
+a2pe.
+ap1e2dé
+a2p1e2g
+ap1e2l1a
+ap1elb
+ap1e2lé
+a2p1elf
+ap1elg
+a2p1elh
+ap1elj
+ap1elk
+a2pell
+ap1elm
+ap1eln
+ap1elo
+ap1e2lő
+ap1elr
+a2p1elt
+a2p1elv
+ape2m
+ap1emb
+ap1eme
+ap1ene
+ap1eni
+ap1e2ny
+ap1e2rő
+ape2s
+ap1ese
+ap1esé
+ap1eső
+a2p1e2v
+a2p1ex
+a2p1é2he
+a2p1éje
+a2p1é2le
+a2p1éll
+ap1élm
+a2p1é2ne
+ap1épü
+a2p1ér.
+ap1észl
+a2p1éte
+a2p1éve
+ap1fl
+ap1f2r
+ap1gr
+a2p1ide
+a2pidé
+apigaz1
+ap1i2ko
+ap1ikr
+a2p1i2nár
+ap1ind
+ap1inj
+a2p1ins
+ap1i2rat
+a2p1i2rá
+a2p1irk
+a2p1ism
+a2p1íg
+a2p1ín
+a2píté
+ap1ív
+a2p1íz
+ap1kl
+ap1kr
+ap1kv
+ap2laz
+ap2léd
+apmeg1
+apmű1
+apműt2
+a2p1ob
+ap1o2laj
+ap1oltár
+ap1opc
+ap1ope
+ap1opt
+apo2rad
+ap1orcá
+ap1orsó
+apor2t1ő2
+apo2t1ál
+a2p1ov
+1a2póká
+ap1ólo
+ap1óri
+a2p1öb
+ap1öl
+ap1ön
+ap1örv
+a2p1ös
+ap1öv
+a2p1ö2z
+ap1ő2r
+1appará
+ap2p1árn
+ap1ph
+app1ing
+ap1pla
+ap1pri
+ap1pró
+ap1p2s
+ap1py
+ap2res
+ap2réd
+a1p2rém
+ap2rés.
+a1p2rím
+2apro
+ap2roc
+a1p2rod
+1apród
+1aprózó
+ap2s1i2kon
+ap2síz
+aps1ork
+apsz1ert
+ap1szf
+apsz2t
+aptára2d
+aptá2r1ada
+ap1t2r
+apuá2
+a2p1udv
+apu1p2
+apus3s
+a2p1u2tas
+a2p1után
+a2putc
+a2p1új
+a2p1üd
+a2p1üg
+a2p1ü2l
+a2p1ün
+a2p1üt
+a2p1üv
+a2p1üz
+ap1űr
+ap1wh
+ara2b1ár
+ara2b1í2
+ar1abla
+2arad
+ar1a2data
+ar1a2dato
+ar1a2datr
+2arag
+ara2g1e
+2araj
+ar1ajkáró
+2arak
+a2r1a2kol
+ara2kóh
+ara2kói
+ara2kós
+ara2kót
+a2r1akt.
+ar1alk
+a2r1alm
+a2r1ana
+1a2rann
+arany1a2gá
+ara2nyal
+1aranyb
+1aranyh
+ara2nyí
+1aranyk
+1aranyn
+1aranyr
+1aranys
+ara2pa.
+ar1arc
+1arasz.
+arasz2t1e
+ar1aszú
+ara2tal
+ara2tel
+ara2tin
+ara2t1ő2
+aratű2
+ara2tűr
+ar1aul
+aravasz1
+1a2raw
+ara2zon
+2arác
+a2r1ác.
+a2r1á2csi
+a2rácsom
+a2r1ág.
+a2r1á2ga.
+a2r1á2gai
+a2r1á2gak
+a2rágan
+a2r1á2gat
+ará2gáb
+ará2gáh
+ará2gán
+ará2gár
+ará2gát
+ará2gáv
+a2r1ágb
+a2r1áge
+a2r1á2gé
+a2r1ágf
+a2r1ágg
+a2r1ágh
+a2r1á2gi
+a2r1ágk
+a2r1ágl
+ará2gon
+a2r1ágr
+a2r1ágs
+a2r1ágt
+a2r1á2guk
+a2r1á2gun
+a2r1á2gú
+a2r1á2gy
+ar1álc
+a2r1állá
+a2r1állo
+2arám
+ará2m1e2
+ará2nye
+a2r1á2rak
+a2r1á2rá
+a2r1árk
+a2r1árr
+ar1á2ru
+ar1árú
+ar1árv
+ará2sze
+a2r1á2szoki
+ará2tal
+ará2t1ö
+aráz4s
+ará2zsál
+arázsi2
+arázs3z
+ar2c1a2d
+arc1agy
+arc1ala
+arca2n
+arc1any
+ar2car
+ar2cat
+ar2ceg
+ar2c1es
+ar2cev
+ar2c1é2h
+arc1él.
+arc1élb
+arc1éll
+arc1élt
+ar2c1é2n
+ar2cés
+1archí
+arc1ing
+ar2c1int
+ar2ciz
+arcolás1s
+ar2có
+ar2cő
+arcs1ala
+ar2csál
+arc3sere
+ar2csip
+ar2c3sor
+ar2cü
+ar2cű
+ard1acé
+ar2d1alj
+ar2d1áll
+arde2l
+ard1ele
+ard1elő
+ard1elt
+ar2d1e2m
+ar2d1é2l
+ar2d1ina
+ar2d1ing
+ar2dor
+ar2dö
+ar2d1ur
+ar2dü
+a2r1e2dz
+ar1egés
+a2r1e2gy
+are2i
+areil2
+a2r1e2le
+ar1elh
+ar1elm
+ar1eln
+ar1elr
+ar1elt
+ar1elü
+ar1elű
+ar1elv
+a2r1emb
+ar1emel
+ar1e2més
+a2remu
+a2r1e2r
+ar1e2se
+ar1e2ső
+a2r1eszek
+a2r1eszé
+a2r1eszü
+ar1etű
+ar1e2ve
+ar1e2vé
+a2rew
+aréé2
+ar1ég.
+ar1é2ge
+aré2k1a2l
+aré2kek
+ar1él.
+ar1élt
+2arém
+aré2nek
+aré1p
+a2r1épü
+a2r1é2ri
+a2r1érő
+ar1észj
+aré1sz2tá
+aré1tra
+ar1f2r
+ar1gha
+2ari.
+2aria
+ar1i2de
+a2ridé
+a2r1i2ga
+a2rimád
+ar1i2mi
+a2r1i2na.
+a2r1i2naké
+a2r1i2nas
+a2r1i2nat
+a2r1i2náb
+a2r1i2náh
+a2r1i2nán
+a2r1i2nár
+a2r1i2nát
+a2r1i2náv
+a2r1ingé
+ari2nit
+arink2
+a2r1inté
+ari2nü
+ar1i2ono
+a2r1i2ón
+2arip
+a2r1isp
+a2r1iste
+ari1szf
+2ariz
+ari2zom
+ar1í2té
+ar2j1áz
+ar2j1er
+arkas3s
+arká2p
+arká2s
+ar2k1eg
+ark1elá
+ar2kéj
+ar2képü
+ar2k1érd
+ar2k1in.
+ar2k1i2ont
+ar2kiz
+ar2k1orm
+ar2k1ovi
+ar2kud
+ar2k1u2s
+ar2les
+ar2m1a2gy
+arma2te
+arm1áll
+ar2me.
+ar2meo
+arme2s
+arm1ing
+ar2m1is
+ar2m1osz
+ar2m1ö
+ar2mü
+arnis3s
+aro2k1á2
+aro2k1e
+aro2kin
+a2r1olda
+1a2romát
+aro2mis
+a2r1opt
+ar1org
+ar1o2ro
+ar1ors
+a2r1ovi
+aró1p
+a2r1ó2rak
+a2r1ó2ráj
+a2r1ó2rám
+aró2s3zár
+aró2vár
+ar1ózd
+a2r1ö2b
+a2r1ök
+a2r1ö2l
+ar1öng
+a2r1ör
+a2r1ös
+a2r1ö2z
+ar1őr
+ar1ős
+ar1pl
+ar1pr
+ar1ry
+ar1ska
+ar1srá
+ar1sta
+ar1sto
+ar1str
+2art.
+art1abl
+ar2t1a2lap
+arta2n1á2s
+art1aszt
+ar2t1a2u
+ar2t1álla
+ar2t1e2g
+art1e2lő
+art1emb
+art1e2rei
+ar2tég
+ar2t1é2l
+ar2t1érp
+ar2t1i2na.
+ar2t1i2nát
+ar2t1i2náv
+art1orz
+ar2t1ö2v
+ar2t1ut
+artvis1s
+ar1ty2
+a2r1uml
+a2runi
+aru2tas
+a2r1új
+a2r1úsz
+ar1útj
+ar1útr
+a2r1üt
+ar1üz
+ar1ű2z
+ar2vala
+arvas1s
+arv1ágy
+ar2v1árh
+ar2v1á2ri
+2asabl
+as1abr
+a2sadag
+asag2
+as1aga
+as1agg
+as1a2gy
+2asaj
+a2s1a2kar
+2asal
+as1alab
+a2s1a2lap
+as1alf
+a2s1alján
+a2s1alji
+a2s1alk
+as1alm
+a2s1anó
+a2s1ant
+a2s1a2ny
+2asap
+as1apr
+2asar
+as1aran
+a2s1a2rá
+asa2t1ó2
+as1a2ty
+2asav
+asa2vo
+a2s1á2c
+asá2g1ikr
+as1áll
+2asám
+a2s1árnak
+a2s1á2ro
+a2s1árr
+a2s1árt
+a2s1á2ru
+asás1s
+as1ásvá
+as1áth
+2asáto
+2asáv
+as1bl
+as1d2r
+a2s1e2d
+as1ege
+a2s1e2gy
+ase2k
+as1eke
+as1eké
+as1ell
+a2s1emb
+a2s1e2n
+a2serd
+as1e2ré
+as1erő
+a2s1es
+ase2t
+as1eti
+a2s1ez
+a2s1éhe
+a2s1éke
+a2s1é2l
+2asém
+a2s1ép
+2asér
+a2s1ér.
+as1érb
+as1érc
+a2s1érd
+asé1s2
+as1étv
+as1é2ve
+as1fr
+as1gl
+as1gr
+as1ide
+as1ido
+as1i2ga
+as1i2gá
+as1inj
+a2s1i2o
+2asiv
+as1izé
+as1i2zo
+a2s1íj
+2asík
+2asín
+2asír
+asírta2
+asír2tal
+a2s1í2v
+as1ízü
+2aská
+as1kl
+asko2s1a2rá
+asko2s1á
+as2koz
+as1k2r
+as2luk
+as2már
+2asodr
+a2s1of
+as1okke
+as1okl
+as1okos
+2asoks
+as1okta
+asom1or
+aso2né
+2asor
+a2s1ord
+a2s1orm
+as1osz
+a2s1ox
+asó1p2
+as1ó2rá
+a2s1ö2k
+a2s1ö2l
+as1örd
+as1örv
+a2s1ös
+as1ö2ve
+as1őr
+as1p2l
+as2pot
+asp2r
+a1s2pu
+as1s2p
+as3szabá
+as3szin
+asszí2ve
+assz1íve.
+assz1ívek
+assz1ívne
+1asszoc
+1asszony
+as3szü
+as3szű
+2asta
+a1stand
+2astá
+a1s2tád
+2asti
+astil2
+as2tim
+2astí
+2asto
+as2top
+2astr
+as1trag
+as1trav
+a1st2ru
+2astú
+a2s1ud
+2asug
+a2s1uj
+2asuly
+asu2r
+as1ura
+as1urn
+a2s1u2sz
+as1u2tak
+a2s1u2tas
+a2s1u2tá
+as1u2tu
+a2s1ú2s
+a2s1ú2t
+asút1a2
+a2s1üd
+a2s1ü2lő
+as1üst
+a2s1üz
+as1űz
+2aszab
+a2sz1a2d
+2aszak
+a2sz1akc
+asza2k1e
+a2sz1akt
+asza2k1ü
+a2sz1alk
+1aszaló
+asz1asp
+asz1ass
+asza2t1a2
+asza2t1e
+a2szath
+a2szati
+2aszav
+a2sz1ág.
+asz1á2ga
+asz1á2gá
+asz1ágb
+asz1ágg
+asz1á2gi
+asz1ágk
+asz1á2go
+asz1ágr
+asz1ágt
+a2szálc
+a2szálm
+2aszám
+aszá2rada
+a2száram
+asz1árnyé
+a2szárp
+a2száta
+a2száth
+asz1átl
+a2sz1á2to
+asz1áts
+2aszed
+2aszeg
+aszegész1
+asz1eh
+2aszek
+2aszel
+asz1e2lem
+asz1elj
+2aszemc
+2aszeme
+2aszemé
+2aszemp
+a2szemu
+2aszemü
+2aszemű
+2aszen
+a2sz1eng
+asz1e2pi
+2aszer.
+2aszere
+a2sz1erej
+2aszeré
+2aszerk
+2aszern
+a2sz1ero
+a2szerő
+2aszerr
+2aszers
+2aszert
+2aszerv
+2aszerz
+asze2s
+a2sz1ese
+asz1est
+2aszez
+2aszék
+aszé2k1el
+asz1é2let
+asz1élés
+aszé2n1ég
+aszén1n
+a2sz1é2re
+asz1éré
+2aszét
+asz2fér
+a2sz1ill
+2aszin
+a2sz1inf
+asz1ing
+2aszir
+a2sz1ism
+asz1ist
+2asziv
+a2sz1iz
+2aszí
+a2sz1ír
+asz1í2vi
+asz2karc
+asz2k1áp
+asz2kell
+asz2kes
+2aszob
+2aszoc
+2aszof
+aszon1n
+aszo2n1o
+a2sz1orr
+asz1ors
+a2sz1osz
+1aszóa
+asz1ó2dá
+2aszót
+2aszök
+asz1ölt
+a2sz1ön
+2aször
+asz1öss
+a2szöt
+2aszöv
+2asző
+aszőlőé2
+asz3su
+asz2tab
+asz2t1apo
+asz2tác
+asz2táll
+asz2t1emb
+asz2téne
+asz2t1és
+asz2t1ing
+asz2t1olt
+asz2t1oro
+asz2t1orr
+asz2tors
+asz2t1osz
+asz2töv
+asz2tős
+asz2t1ül
+asztvíz1
+2aszur
+1aszús
+asz1útr
+2aszü
+aszü2g
+asz1ügg
+a2sz1ü2z
+2aszű
+asz2vit
+asz1z
+2atab
+at1abla
+a2t1a2cé
+ata2dat
+at1a2dó
+2atag
+a2t1agya
+a2taján
+2atak
+a2t1akara
+ata2kár
+ata2kel
+ata2k1é2pes
+ata2k1ö2v
+a2t1aktu
+at1a2lag
+ata2lap.
+ata2lapb
+ata2lapj
+ata2lapo
+ata2lapp
+ata2lapr
+ata2lapú
+ata2lat
+a2t1aleg
+ata2lik
+a2t1alle
+a2t1almás
+2atan
+a2t1anal
+ata2nó
+at1a2nyag
+at1a2nyás
+2atap
+at1app
+ata2puk
+ata2pun
+2atar
+a2t1a2rab
+ata2ran
+a2t1a2rén
+ata1st
+atau2r
+a2t1a2ut
+a2t1azo
+2atáb
+at1ábr
+2atág
+at1ág.
+a2t1á2ga
+at1ágr
+2atáj
+2atál
+a2t1állá
+a2t1álló
+a2t1álm
+2atám
+atá2nal
+a2t1á2pol
+2atár
+atá2rada
+atá2rado
+atá2ramh
+a2táramk
+atá2ramn
+atá2r1az
+atá2rét
+atá2ris
+at1árkár
+atársá2g
+atár2s1ágá
+at1ártás
+2atás
+atá2s1á2g
+atá2sz
+atá2tal
+atátá2
+atá2tár
+a2t1átb
+a2t1átf
+a2t1áth
+a2t1áti
+a2t1átj
+a2t1átk
+a2t1átl
+a2t1átr
+a2t1áts
+a2t1átt
+a2t1átu
+a2t1átv
+2atáv
+at1bl
+at1br
+at1cl
+at1dr
+at1e2gé
+ate2jel
+ateké2r
+ate2kére
+ate2kó
+a2t1e2l1a
+a2t1elb
+at1elc
+a2t1eld
+at1e2led
+at1eleg
+at1e2lem
+at1e2l1en
+a2t1elf
+a2t1elh
+at1eljá
+at1elkö
+at1elkü
+a2t1elm
+at1eln
+a2t1e2lo
+at1e2lőn
+ate2lőt
+a2t1elr
+a2t1els
+at1elta
+at1eltá
+at1elté
+at1eltü
+a2t1elu
+a2t1elű
+a2t1elv
+a2t1elz
+a2t1emb
+at1e2mel
+a2t1emé
+a2t1eml
+a2t1emó
+a2t1enc
+a2t1ene
+at1epi
+at1epo
+a2t1erd
+at1e2rec
+ate2r1ék
+a2t1erő
+a2t1e2se
+a2t1esé
+a2tesk
+ates2t1á
+ates2tő
+at1eszm
+at1eszű
+ate2tol
+a2t1e2z
+2atég
+até2get
+a2t1éhe
+até2k1a2l
+até2ke2
+a2t1éke.
+aték1el
+2atél
+a2t1é2le
+a2t1é2lé
+a2t1élm
+a2t1élv
+2atém
+até2ne
+a2t1éps
+2atér
+até2rá
+a2t1érdek
+a2t1érin
+a2t1érl
+a2t1érm
+a2t1értel
+at1érvek
+a2t1érz
+at1észa
+at1észl
+2atét
+até2tét
+a2t1étv
+at1fj
+at1fl
+at1fr
+at1gl
+at1gr
+a1t2hus
+2ati.
+a2t1iat
+a2t1i2de
+a2t1ido
+ati2g
+a2t1ige
+a2t1igé
+a2t1igy
+a2till
+at1ille
+at1i2má
+at2i3mádá
+at1i2mi
+a2t1imp
+2atin
+a2t1ing.
+a2t1inga
+a2t1ingb
+a2t1inge
+atinó2
+ati2n1ór
+at1inté
+at1into
+2atip
+a2t1i2pa
+2atir
+a2t1irá
+a2t1iro
+2atis
+a2t1isk
+a2t1ism
+ati2sz
+a2t1iszo
+2atit
+a2t1i2ta
+a2t1izé
+a2t1izg
+a2tizmo
+a2t1i2zo
+a2t1íg
+a2t1íj
+2atíp
+2atír
+a2t1í2t
+at1í2vek
+atív1e2l
+at1í2vet
+atí2vét
+a2t1íz
+2atki
+2at1kl
+2atko
+2atkö
+2atku
+at1kv
+at1ojt
+atoka2
+a2t1o2k1al
+ato2koss
+a2t1o2koz
+a2t1okta
+a2t1o2ku
+at1oldá
+a2t1oldó
+ato2m1á
+1atombe
+ato2mer
+1a2tomj
+a2toml
+1a2tomok
+1a2tomos
+1a2toms
+1atomú
+at1opc
+at1ope
+a2t1opt
+2ator
+ato2rál
+a2t1ord
+a2t1org
+ato2rú
+a2t1orv
+a2t1orzá
+atos3s
+ato1sz2f
+a2t1oszl
+ató1p2
+a2t1ó2rák
+ató2rán
+ató2riá
+ató1stá
+ató1sz
+ató2s3zár
+ató2s3zené
+ató1tr
+at1öko
+atö2l
+a2t1öle
+a2t1ölé
+a2t1ölő
+at1öná
+atön2k1a
+at1ö2röm
+a2t1ös
+a2t1öt
+atö2vi.
+a2t1ö2z
+atő2ra
+at1őrl
+a2t1ő2s
+atpen1
+at1pl
+at1pr
+at1ps
+atrac1c
+a1t2rad
+2atraj
+2atrak
+at2ramb
+a1trap
+a1trau
+a1t2rav
+2atré
+a1t2réf
+at2rén
+atré2szel
+a1t2ril
+at2roj
+a1t2róg
+2atrón
+a1t2rü
+at2sán
+at1sh
+at1sk
+at1sl
+at1sp
+at1st
+at1s2v
+atszá2m1é
+atszáraz1
+att1adó
+1attakok
+1attasé
+at2t1e2g
+at2tez
+att1ing
+attó2
+at2t1ór
+at1t2re
+2atud
+a2t1udv
+a2t1ug
+2atul
+a2t1und
+a2tuni
+2atur
+at1utá
+at1utó
+a2t1új
+2atúl
+at1ú2sz
+a2t1üg
+2atük
+at1ü2lé
+at1ült
+2atün
+at1üst
+a2t1ü2v
+2atüz
+at1üzem
+at1űri.
+at1űrl
+2atűz
+a1u
+au2b1in
+au2bor
+a2udá
+au2de
+au2ga
+a2ug2h
+au2go
+1a2ukc
+aul2l
+aul2t1a
+aul2ti
+a2umae
+a2umaf
+a2umak
+a2umam
+a2umar
+a2umav
+a2umáb
+a2umád
+a2umáé
+a2umáh
+a2umái
+a2umám
+a2umán
+a2umár
+a2umáv
+au1ph
+au2rad
+au2r1ikr
+au2rö
+au2sz1e
+a2ut.
+au2tad
+au2tal
+au2tam
+au2tas
+au2tat
+2autá
+au2tál
+a2uti
+1a2uton
+a2utó
+1autób
+1autóé
+1autóh
+1autói
+1autóm
+1autón
+1autór
+1autós
+1autót
+1autóv
+a2utr
+a2utt
+au2tu
+au2zí
+au2zs
+a2uzú
+au2z1ü
+a1ú
+aú2jí
+aú2jo
+aú2ré
+aú2r1i
+aú2sz
+aú2ti
+aú2to
+a1ü
+aü2dí
+aü2dü
+aü2ge
+aü2gy
+aü2le
+aü2lé
+aü2li
+aü2lö
+aü2lő
+aü2lü
+aü2nő
+aü2re
+aü2rí
+aü2rö
+aü2rü
+aü2sz
+aü2te
+aü2té
+aü2ti
+aü2ve
+aü2vö
+aü2zem.
+aü2zemb
+aü2zemen
+aü2zemet
+aü2zemé
+aü2zemh
+aü2zemm
+aü2zemn
+aü2zemr
+aü2zen
+aü2zé
+a1ű
+aű2ri
+aű2rö
+aű2ze
+aű2zé
+aű2zi
+aű2zö
+aű2ző
+2avad
+2avak
+av1akti
+a2v1anh
+1a2vant
+a2v1a2nya
+a2vanz
+ava2rac
+ava2r1ag
+ava2r1e2
+ava2rék
+ava2sze
+ava2szü
+1a2vatá
+1a2vató
+2avád
+avá2nan
+2avár
+avá2r1al
+avá2ria.
+avá2riai
+a2v1á2riá
+a2v1áta
+a2v1átt
+avá2zal
+av1bl
+av1e2le
+av1elv
+2aves
+av1est
+2avet
+2avez
+avi2cse
+av1ing
+av1kr
+a2v1old
+av1oltó
+avo1s
+a2v1ox
+a2v1öm
+a2v1ös
+av1ős
+av1őz
+av1pr
+av1sp
+av1st
+a2v1ut
+av1ü2l
+av1ür
+av1ü2z
+a2wag
+aw2hi
+awhisky2
+awhiskyk2
+a2x1ab
+a2x1ad
+a2x1ak
+a2x1al
+a2x1an
+a2x1av
+ax1bl
+ax1eg
+ax1el
+ax1inf
+ax1ing
+ax1int
+axió2r
+axi2se
+ax1ír
+ax1ös
+ax1öz
+ax1pr
+a2x1ut
+ax1új
+ax1üz
+ax1űr
+a1ye.
+a1yed
+a1yei
+a1yek
+ay1e2l
+a1yen
+a1yes
+ayet2
+ay1fl
+a1yi.
+ay1il
+ay1ing
+a1yit
+ayma2
+ay1s2t
+aza2ch
+aza2cik
+azai2ko
+azal2t1a
+aza1p2
+aza1s2
+az1áll
+az1ált
+azá2nö
+azá2r1ó2ra
+azá2s1e
+azási2k
+azá2siko
+azás3s
+az2du
+a2z1e2g
+az1e2le
+az1elj
+az1elm
+az1elő
+a2z1em
+a2z1ex
+a2z1ég
+azé2k1e2
+azé2kol
+a2z1érté
+a2z1ing
+a2z1i2o
+az1irá
+az1irt
+azma1g
+a2z1ob
+2azol
+azo2nal
+azo2n1á
+azont2
+a2z1op
+a2z1or
+a2z1osz
+azót2
+azó1tr
+a1z2rí
+az4sé
+a2z3sike
+az3sor
+az3sp
+a2z3sü
+az3sz
+az1ut
+a2z1új
+azú2r1é
+az1üz
+2á.
+á1a
+áa2da
+áa2dá
+áadás1s
+áa2do
+áa2dó
+áa2du
+áa2já
+áa2ka
+áa2la
+áa2lu
+áa2ra
+áa2sz
+áa2ut
+áa2va
+á1á
+áá2cs
+áá2ga
+áá2gy
+áá2ju
+áá2mu
+áá2ra
+áá2ru
+áá2sá
+áá2sí
+áá2so
+áá2só
+áá2su
+áá2zo
+áá2zu
+á2b1adu
+áb1akc
+á2b1a2la
+á2b1alk
+á2b1ambu
+á2b1a2ny
+ába1p
+áb1art
+ába3se
+á2b1á2g
+áb1áll
+áb1álm
+á2b1áp
+á2b1árá
+á2b1árn
+á2b1á2ru
+á2b1átj
+á2b1átl
+á2b1átm
+á2b1átv
+á2b1áz
+áb2b1a2d
+ábba2l
+áb2b1ala
+áb2b1and
+áb2b1ár
+áb2ben
+áb2b1e2r
+áb2b1é2l
+áb2bid
+áb2bim
+áb2b1i2s
+áb2b1ita
+ább1o2so
+ább1oss
+áb2bör
+áb2b1ül
+áb2bű
+áb1dr
+á2b1ed
+á2b1e2g
+ábe2l1a
+ábe2l1á
+ábe2l1eg
+ábe2l1el
+ábe2l1e2r
+ábe2lég
+ábe2l1in
+á2belnö
+á2b1e2m
+á2b1e2n
+áb1e2ro
+áb1erő
+1á2béc
+á2b1é2g
+áb1é2ke
+á2b1éks
+á2b1é2les
+á2b1élt
+á2b1ép
+á2b1ér.
+á2b1é2ri
+á2b1érs
+á2b1érte
+á2b1érté
+áb1fr
+á2b1i2d
+ábi2g
+áb1iga
+áb1igé
+á2b1ikr
+áb1illa
+á2b1im
+ábi2nai
+á2binas
+á2b1ind
+á2b1ing
+á2b1int
+á2b1is
+áb1izm
+áb1izz
+á2b1ív
+áb1kl
+áb1kr
+ábla1kr
+ábla1p
+á2b1olda
+á2b1op
+ábo2raj
+ábo2ran
+ábo2rál
+ábo2ris
+á2b1osz
+á2b1o2v
+áb1öb
+áb1ö2d
+áb1öl
+áb1ön
+áb1ö2r
+áb1ös
+áb1öv
+áb1őr
+áb1pr
+1ábrái
+áb2rek
+áb1sp
+áb1st
+áb1sz2
+áb1tr
+á2b1ujjal
+ábu1sz2
+áb1úr.
+áb1üg
+áb1ü2l
+áb1üs
+áb1üt
+áb1üv
+á2c1a2g
+ác1ajt
+áca1k2l
+ác1akn
+á2c1a2la
+ác1alm
+á2c1a2ny
+á2c1ág
+á2c1ál
+ác3cse
+ác3cso
+ác1e2l1
+ácele2
+ác1en
+ác1er
+á2c1ép
+á2c1ére
+á2c3ha
+á2c3há
+ác3he
+á2c3hé
+ác3hon
+á2c3hu
+áci2as
+á2c1il
+ác1inc
+ác1ing
+ácin2til
+áci2ósű
+á2c1i2s
+ác1ív
+á2c1or
+á2c1osz
+ác1ór
+ác1ö2l
+ács1abl
+á2cs1a2g
+á2cs1ajt
+á2csaka
+á2cs1akn
+ács1alap
+ács1alj
+ács1alom
+ács1app
+ács1atk
+á2csatom
+á2cs1á2c
+á2cs1ál
+ác3sárg
+á2cs1árk
+á2cs1árn
+á2csáru
+á2cs1á2ta
+ácsboz1
+á2csef
+á2cs1e2g
+á2cs1e2l
+á2csene
+á2csent
+á2cser
+ácse2t
+á2cs1ev
+ács1é2g
+ácsé2k
+ács1éki
+ács1ékk
+ács1ékn
+á2csél
+á2csép
+ács1é2te
+ácsi2g
+á2cs1iga
+á2cs1ille
+á2csimi
+ács1int
+ácsi2p
+á2cs1ipa
+ács1isk
+ácsí2
+ács1ír
+á2csokta
+1á2csolat
+1á2csomk
+ács1orr
+á2csosz
+á2cs1ov
+ác3só.
+ács1ó2r
+ác3sót
+ác3sóv
+ács1ö2k
+á2cs1ö2l
+á2cs1ös
+á2csöt
+ács1ő2s
+ács1s
+á2csuj
+á2csut
+á2cs1úr
+ács1ü2l
+á2cs1ü2t
+á1csy
+ács3zen
+á2c1ut
+ác1úr
+ác1ül
+ác1ür
+ád1abl
+á2d1a2do
+á2d1akc
+ád1a2lap
+á2d1alb
+á2d1alj
+á2d1alk
+ád1a2nya
+ád1a2nyá
+áda1p
+á2d1a2pá
+ád1arc
+á2d1aty
+á2d1ág
+á2d1ál
+ád1á2sz
+ád1átl
+ád1dr
+ád3dz
+ád1e2c
+á2d1e2g
+á2d1ej
+á2d1e2l
+ádele2
+ádel1ej
+ádel1eme
+á2d1e2m
+á2d1ep
+áde2r1á
+ád1erő
+ád1e2ti
+ádéd2
+ádé1dr
+ádé1g2
+á2d1é2ge
+ádé1kré
+ád1éne
+á2d1érte
+á2d1érz
+ádé1st
+ádi2cse
+á2d1i2d
+á2d1i2ga
+ád1i2ko
+ád1ill
+ád1imi
+ád1ind
+á2d1int
+ádi2ódar
+ádióé2r
+ádi2óéra
+ádi2ói2v
+ádi2óko
+ádi2ó1k2ra
+á2d1i2p
+ád1ist
+ád1ív
+ád1kl
+ád1kr
+ádo2ga
+ádo2gá
+ádo2ge
+ádo2rak
+á2d1osz
+ádós2
+ádö2b
+á2d1ös
+ád1öv
+ád1ö2z
+ád1ő2r
+ád1pr
+ád1ps
+á1d2rót
+ád1st
+ád1tr
+ád1udv
+á2d1ú2s
+á2d1üg
+ád1ü2lé
+á2d1üz
+ád3za
+á2d3zá
+á2d3ze
+ád3zú
+á1e
+áe2cs
+áe2dz
+áe2ge
+áe2gé
+áe2gy
+áe2le
+áe2lő
+áe2me
+áe2re
+áe2rő
+áe2se
+áe2sé
+áe2si
+áe2ső
+áe2sü
+áe2te
+áe2ve
+áe2vé
+áe2vő
+á1é
+áé2de
+áé2ge
+áé2gé
+áé2gő
+áé2he
+áé2ke
+áé2le
+áé2ne
+áé2pí
+áé2pü
+áé2re
+áé2ré
+áé2ri
+áé2rő
+áé2rü
+áé2te
+á2f1a2gya
+á2f1alg
+á2fáb
+á2f1ág
+1á2fák
+á2f1áp
+1á2fás
+á2fát
+áf1dr
+áf1elm
+á2f1e2m
+á2f1e2t
+áf1é2ne
+áfi2ad
+áfi2am
+á2f1i2d
+á2f1im
+á2f1ing.
+á2f1ordá
+á2f1osz
+áf2rec
+á1f2rö
+áfus3s
+á2f1ün
+á2g1abl
+ág1abr
+ága2c
+ág1acé
+1ágacska
+á2gad
+ág1a2dá
+1ágadd
+ág1a2dó
+á2g1a2j
+á2gaka
+ág1a2kar
+ág1a2kas
+1á2gakb
+1á2gakh
+1á2gaki
+1á2gakk
+1á2gakn
+1á2gakr
+á2gakt
+á2g1a2la
+á2g1alj
+á2g1all
+ág1alt
+1á2gam
+ága2n
+ág1ana
+á2g1ang
+1á2gank
+ág1ant
+á2g1any
+á2g1a2p
+á2g1a2r
+ág1asp
+á2g1asz
+ága2tol
+á2g1au
+1á2gaza
+ága2zon
+á2g1á2g
+á2g1áld
+ág1álm
+ág1á2mu
+ágá2nyal
+á2g1áp
+á2g1árad
+á2g1árb
+á2g1á2ré
+á2g1árh
+á2g1á2ria
+ágá2rokb
+á2g1árv
+á2g1ásó
+ágás3s
+ágá2sz
+á2g1át1a2
+á2g1átá
+á2g1áté
+á2g1átf
+á2g1áth
+á2g1áti
+á2g1átl
+á2g1átm
+á2g1átn
+ágá2tokk
+á2g1átr
+á2g1áts
+á2g1átt
+ág1átü
+á2g1átv
+ág1bl
+ág1br
+ág1d2r
+á2g1e2c
+á2g1e2d
+ág1ef
+á2g1e2g
+á2g1e2l
+á2g1e2m
+á2ge2n
+ág1enc
+ág1ene
+á2g1e2p
+áge2ra
+áge2rá
+áge2r1el
+á2g1e2s
+á2g1e2t
+á2g1e2v
+á2g1ex
+á2g1é2g
+á2g1é2he
+á2g1éj
+á2g1é2k
+á2g1é2l
+á2g1é2ne
+á2g1épí
+ág1é2pü
+á2g1ér.
+á2g1érá
+á2g1é2ré
+á2g1éri
+ág1érm
+á2g1é2rő
+ág1érte
+ág1érté
+á2g1érv
+á2g1és
+á2g1éte
+á2g1éve
+á2g1évé
+ág1fl
+ág1fr
+ág1g2l
+ág1gr
+ág3gyar
+ág3gye
+ág3gyú
+ághá2nyi
+ági2al
+ági2asz
+ági2d
+á2g1ide
+á2g1if
+ági2g
+á2g1iga
+á2g1igén
+á2gill
+ág1ima
+á2g1i2mi
+á2g1i2na.
+ág1inf
+á2g1ing
+ág1ins
+á2g1int
+á2g1iri
+ág1iro
+á2g1ist
+á2g1isz
+á2g1i2ta
+á2g1iz
+á2g1íg
+á2g1ín
+á2g1ír
+á2gíté
+á2g1íz
+ágká2rok
+ág1kl
+ág1kr
+ág1kv
+á2g1oá
+á2g1okl
+á2g1o2li
+ág1oltó
+á2g1op
+á2g1or
+á2g1osko
+ágos3s
+á2g1oszl
+ágó1dr
+á2g1ó2rá
+á2g1ö2k
+á2g1ö2l
+ág1önt
+ágö2r
+ág1örö
+ág1örv
+á2g1ös
+á2g1öt
+á2g1öv
+á2g1ö2z
+ág1ő2r
+ág1ő2s
+ág1pl
+ágport2
+ágpor1tr
+ág1pr
+ág1ps
+ág1sh
+ág1sk
+ág1sl
+ág1sp
+ág1st
+ágsz2
+ág1tr
+á2g1ud
+á2g1uj
+águ2n
+á2g1una
+á2g1und
+á2g1u2ra
+á2g1u2rá
+á2g1u2t
+á2g1új
+á2g1ús
+ág1útt
+ág1üd
+ág1ü2g
+ág1ü2l
+ág1ün
+ág1üv
+ág1üz
+ág1ű2r
+ág1űz
+ágya1g
+ágy1alj
+ágy1alk
+ágy1alm
+1á2gyasn
+á2gyassa
+á2gy1á2l
+á2gy1á2ram
+ágyás1s
+á2gy1e2
+á2gyél
+ágy1ér.
+1ágygyű
+á2gyid
+á2gyil
+á2gyivad
+á2gyob
+á2gyosz
+ágy1otth
+á2gy1ó2s
+ágy1ö2l
+ágy1ös
+á2gyur
+á2gyúh
+á2gyút
+á2gy1ü2
+áh1ajk
+áh1ass
+1á2hít
+á2h1ors
+á1i
+ái2dom
+ái2dő
+ái2ga
+ái2gé
+ái2gy
+ái2ha
+ái2je
+ái2má
+ái2ram
+ái2rá
+ái2sz
+ái2ta
+ái2vá
+ái2vo
+ái2zé
+á1í
+áí2gé
+áí2rá
+áí2ve
+áí2vo
+á2j1adó
+á2j1akc
+á2j1akv
+á2j1a2la
+áj1ambu
+á2j1ana
+áj1ant
+á2j1any
+á2j1ar
+á2j1atl
+á2j1ax
+áj1azo
+á2j1ág
+á2j1ál
+á2j1áp
+ájás3s
+á2j1át1a
+á2j1átá
+á2j1átt
+áj1bl
+áj1br
+áj2ch
+á2j1e2c
+áj1egé
+áj1elm
+áj1eln
+áj1elő
+áj1elv
+á2j1em
+á2j1e2n
+á2j1es
+áj1e2t
+á2j1e2v
+áj1ex
+á2j1é2g
+á2j1él
+á2j1ép
+ájé2r
+á2j1ére
+á2j1éte
+áj1fl
+áj1fr
+á2j1i2d
+á2j1il
+á2j1im
+á2j1iz
+áj1íj
+áj1ír
+áj1ív
+áj1íz
+ájk1ell
+áj2k1ő2
+áj2kü
+áj2lad
+ájl1akt
+áj2l1an
+áj2l1as
+áj2l1at
+áj2lik
+áj2lob
+áj2nár
+áj2nin
+áj2nü
+á2j1ob
+á2j1op
+á2j1or
+á2j1öb
+áj1ök
+áj1öl
+á2j1ör
+áj1őr
+áj1ős
+áj1pl
+áj1pr
+áj1sn
+áj1sp
+áj1st2
+áj1t2r
+á2j1ud
+áj1úsz
+áj1üg
+áj1ül
+áj1ür
+áj1ü2t
+áj1üv
+áj1üz
+áj1űr
+áj2zab
+áj2zaj
+áj2z3sa
+ák1abr
+á2k1a2d
+á2k1aj
+ák1aka
+á2k1a2lapí
+ák1ale
+ák1alj
+ák1ant
+ák1ara
+á2k1a2rá
+ák1arm
+ák1arz
+á2k1ass
+á2k1atl
+á2k1a2u
+á2k1á2c
+á2k1á2l
+ák1áta
+ák1átk
+ák1bl
+ák1ebé
+á2k1e2g
+ák1e2le
+á2k1elk
+á2kellene
+á2k1elm
+á2k1e2lő
+ák1emb
+ák1e2rő
+á2k1e2vé
+á2k1e2vo
+á2k1é2l
+á2k1é2ne
+á2k1érm
+á2k1érte
+á2k1értő
+á2k1érv
+á2k1érz
+ák1éss
+á2k1é2te
+á2k1étk
+á2k1étt
+á2k1é2ve
+ák1fl
+ák1fr
+á2k1i2d
+á2k1if
+áki2g
+ák1iga
+á2k1igé
+ák1ill
+á2k1i2m
+ák1ing
+á2k1int
+ák1iro
+á2k1i2s
+áki2t
+ák1ita
+á2k1i2v
+ák1ír
+ák1k2l
+ák1k2r
+ák2lar
+á2k1oks
+á2k1o2la
+á2k1old
+á2k1o2li
+á2k1oll
+á2k1o2pe
+á2k1orv
+ákos3s
+á2k1ott
+ák1óni
+ákö2l
+á2k1ölő
+ák1ö2r
+ák1ő2r
+ák1pr
+ák2rák
+á1k2reá
+á1k2ris
+ák1sp
+ák1sr
+ák1st
+ák1sz2
+ák1t2r
+á2k1uj
+á2kuni
+áku2r
+ák1ura
+ák1utó
+ák1új
+ákú2t
+á2k1úto
+ák1üd
+á2k1üg
+ákü2l
+ák1ün
+ák1ür
+ák1ü2t
+ák1űr
+á1k2vat
+2ála.
+ál1abl
+ál1acé
+á2l1adag
+á2l1a2dó
+ál1a2já
+ál1ajt
+ála2kar
+á2l1akna.
+2álal
+ál1alak
+á2l1alát
+ál1alg
+á2l1alk
+á2l1alm
+á2l1ane
+á2l1ang
+á2l1ant
+á2l1a2nya
+ál1a2nyái
+ál1a2nyán
+á2l1a2nyát
+ál1a2nyáv
+á2l1a2pos
+ál1apó
+ál1a2ra
+ála2szek
+ála2szel
+ála2sz1ék
+ála2szö
+ála2szű
+ála2tat
+ála2tet
+ála2t1ér.
+ála2tikr
+ála2tint
+ál1atlé
+ála2told
+ála2t1ó2
+á2l1atti
+á2l1a2ty
+ál1aut
+á2l1ábr
+ál1ág.
+ál1á2gi
+á2l1á2gú
+ál1áll
+á2l1á2rak
+ál1árf
+ál1árk
+á2l1árn
+á2l1á2ro
+álá2s3z
+á2l1átc
+á2l1átk
+á2l1átm
+á2l1átú
+á2l1átvá
+ál1bl
+ál1br
+álcai2
+1áldás
+1áldoz
+ál1d2r
+ál1dy
+á2l1e2c
+á2l1e2d
+á2l1ef
+ál1elk
+ál1elm
+ál1elo
+ál1e2lő
+ál1elr
+ál1emu
+á2l1e2r
+ál1esem
+á2l1e2ső
+á2l1esz
+á2l1e2t
+ál1ez
+á2l1ég
+á2l1é2he
+álé2kal
+álé2k1an
+álé2k1e2l
+álé2kü
+ál1é2le
+ál1é2lő
+á2l1é2ne
+á2l1ér.
+á2l1érb
+á2l1érd
+á2l1érf
+á2l1érg
+á2l1érh
+á2l1é2ri
+á2l1érm
+á2l1érr
+á2l1érs
+á2l1értá
+á2l1érte
+á2l1érté
+á2l1érz
+á2l1év.
+á2l1é2vé
+ál1fl
+ál1fr
+ál1gr
+1álhaja
+áli2as
+ál1i2bo
+áli2d
+ál1ide
+ál1idé
+áli2g
+á2l1iga
+á2l1ige
+á2l1igé
+ál1ill
+ál1imp
+á2l1ind
+ál1inf
+á2l1i2onb
+á2l1i2ont
+á2l1i2p
+ál1irá
+á2l1iro
+áli2s1e
+áli2s1ék
+áli2sis
+ális3s
+ál1iste
+á2l1iz
+ál1ín
+ál1í2r
+ál1ít
+ál1í2v
+álká2rok
+ál1k2l
+ál1k2r
+ál2l1a2dó
+1állag
+ál2laj
+ál2l1a2lak
+1államá
+álla2m1e
+1államot
+1államti
+ál2l1a2pá
+ál2l1a2r
+1állata
+álla2tas
+álla2t1e2
+álla2t1or
+álla2t1ö2
+1állatu
+ál2l1á2g
+ál2l1á2l
+ál2l1árr
+állás1s
+ál2l1áth
+ál2l1átm
+ál2led
+ál2l1e2h
+ál2l1ej
+áll1éké
+ál2l1iz
+1állomá
+ál2lü
+1álmaim
+1álmok.
+1álmom
+1álmot.
+1álmuk
+1álmunkb
+ál1obj
+á2l1o2ka.
+á2l1o2kai
+1álokaih
+1álokain
+1álokair
+á2l1o2ká
+1álokán
+1álokát
+1álokáu
+álo2kok
+1álokonk
+álo2kos
+á2l1okta
+1á2l1o2ku
+á2l1ol
+áloma2
+álo2mad
+álo2m1al
+álo2m1an
+álo2mar
+álo2mas
+álo2m1á
+álo2m1e
+álo2m1it
+álo2mot
+á2loms
+álo2m1ú
+á2l1ont
+ál1opc
+á2l1ope
+á2l1or
+á2l1osz
+á2l1ox
+álóa2
+álóá2
+álóó2
+áló2ráj
+áló2s1ű2
+álót2
+ál1öb
+á2l1öd
+á2l1ö2l
+á2l1ös
+ál1öz
+á2l1őr
+ál1p2l
+ál1p2r
+ál1p2s
+ál1sk
+ál1sl
+ál1st
+ál1trad
+ál1t2rak
+ál1t2ran
+ál1t2re
+ál1tré
+á2l1ug
+álu2n
+á2l1una
+á2l1u2r
+á2l1u2t
+á2l1uz
+á2l1új
+á2l1úr
+álú2t
+ál1útj
+ál1útk
+ál1útn
+á2l1úto
+á2l1útr
+á2l1útt
+ál1üg
+ál1ün
+ál1ür
+ál1üt
+ál1üv
+ál1üz
+ál1űr
+ál1űz
+ály1ada
+álya1g2
+ály1ant
+ály1anya
+álya1p
+ály1ass
+á2lyál
+á2ly1e2
+á2lyéj
+á2lyél
+á2ly1é2ne
+á2lyére
+á2lyéve
+á2lyide
+á2lyí
+ály1k2
+ály1odv
+á2lyol
+á2ly1ó2
+á2ly1ö
+á2lyő
+ály1s
+á2lyug
+á2ly1ü2
+á2ly1ű2
+á2m1abl
+á2m1abr
+ám1a2cé
+ám1adm
+ám1agg
+á2m1ajt
+á2m1akt
+ám1a2lap
+ám1all
+ám1alt
+ámaó2
+á2m1app
+á2m1arc
+áma2sz1ál
+áma2szel
+áma2szív
+áma2sz1odv
+áma2sz1ü2
+ám1atl
+á2m1att
+á2m1aty
+ám1aud
+ám1a2zo
+ámá2c
+ám1áf
+á2m1ág
+ám1álla
+ám1állo
+ámán1n
+ámán1tr
+á2m1á2rak
+ám1á2ram
+á2m1áras
+á2m1á2rá
+á2m1árb
+á2m1á2ri
+á2m1árn
+á2m1á2ro
+á2m1árr
+á2m1á2ru
+ám1ásv
+á2m1átb
+ám1á2t1e
+á2m1áti
+á2m1átm
+ám1á2zó
+ám1bl
+ám1dr
+á2m1e2b
+á2m1ej
+á2m1ela
+ám1elá
+ám1e2lem
+ám1elé
+á2m1elh
+ám1elí
+á2m1elj
+ám1elk
+á2m1elm
+ám1elo
+á2m1e2lő
+ám1els
+ám1elt
+ám1elü
+ám1elv
+á2m1e2m
+á2m1erd
+ám1e2rek
+á2m1erk
+á2m1e2ro
+áme2rők
+áme2rőt
+áme2rőv
+ám1e2se
+ám1ess
+ám1esz
+áme2t
+á2m1eti
+á2m1etű
+á2m1ev
+á2m1ex
+á2m1ez
+ám1éke
+á2m1é2le
+á2m1ép
+á2m1érc
+á2m1érd
+á2m1értel
+á2m1étk
+ám1fr
+ám1gr
+ámi2ab
+ámi2al
+ámi2am
+á2mide
+á2m1idé
+ám1i2dő
+á2m1iga
+á2m1igá
+á2m1igé
+á2m1ill
+á2mimá
+á2mimm
+á2m1imp
+á2m1ind
+á2m1inf
+á2m1ing
+á2m1inte
+á2m1inté
+á2m1inv
+á2m1i2pa
+á2m1irá
+á2m1iro
+á2m1irt
+á2m1isk
+á2m1ism
+ám1i2szá
+á2m1i2z
+ám1íg
+á2m1íj
+á2m1ír
+á2m1í2v
+ám1íz
+ám1kl
+ám1kr
+ám1kv
+ámla3t2
+á2m1ob
+á2m1of
+á2m1oká
+á2m1okl
+á2m1okm
+á2m1okta
+ámo2lyas
+á2m1op
+ámo2r1á2l
+ámo2ris
+ámo2r1odv
+ámo2sas
+ámos3s
+ám1osto
+á2m1osz
+á2m1ov
+á2m1ox
+ám1ó2r
+ám1ö2k
+ám1öl
+ám1ön
+ám1ör
+ám1ös
+ám1öt
+ám1öv
+ám1ö2z
+ám1ő2r
+ám1ő2s
+ám1őz
+ámpa1p2
+ám1p2l
+ám1p2r
+ám1p2s
+ám1sk
+ám1sm
+ám1sn
+ám1sp
+ám1st
+ám1sz2
+ám1t2r
+á2m1ud
+á2m1ug
+á2m1uj
+á2m1und
+á2muni
+á2m1u2r
+á2m1utá
+á2m1új
+ám1üd
+ám1üg
+ám1ü2l
+ám1ür
+ám1üt
+ám1üv
+ám1üz
+á3műt
+ám1ű2z
+ámva2s1u2
+á2n1abl
+á2n1a2cé
+án1ach
+án1ada
+ánae2
+án1afr
+án1agya
+án1ajt
+á2n1aká
+á2n1akc
+á2n1akr
+á2n1a2la
+án1alk
+á2n1all
+á2n1anó
+án1anya
+á2n1a2o
+ána2p
+án1apa
+ánap1i
+án1ara
+á2n1arc
+án1assz
+ána2t1ér.
+ána2tol
+ána2tor
+ána2t1ű
+á2n1a2u
+án1ava
+án1ábr
+á2n1ág
+á2n1áll
+án1ár.
+án1árad
+án1á2ri
+án1árm
+án1árn
+án1áro
+án1áru
+án1ásv
+áná2t1a
+áná2t1á
+á2n1á2z
+án1bl
+án1br
+án2cac
+án2c1ad
+án2caj
+án2cal
+án2c1a2n
+án2car
+án2c1as
+án2cat
+án2c1au
+án2c1ál
+án2c1á2ro
+án2cás
+án2c1ed
+án2c1e2g
+ánce2l
+ánc1ele
+án2c1elt
+án2c1er
+án2c1e2s
+án2c1et
+án2cez
+ánc1éhe
+ánc1é2ne
+án2c1ér.
+án2c3h
+án2c1ill
+án2cim
+ánci2p
+ánc1ipa
+án2c1ir
+án2c1i2s
+án2c1ó2
+án2c1ö2
+án2cő
+áncs1an
+ánc3sás
+án2c3seb
+áncs1es
+ánc3spo
+ánc3sza
+án2cü
+án2cz
+áne2d
+án1edé
+á2n1ef
+á2n1e2g
+á2n1e2l
+án1emb
+án1e2mi
+án1eml
+án1e2mu
+á2n1en
+á2n1e2p
+án1es
+á2n1e2t
+án1e2u
+á2n1ex
+án1ez
+á2n1é2d
+á2n1é2g
+á2n1ék.
+á2n1ékn
+án1éks
+á2n1é2l
+á2n1é2ne
+án1épí
+án1épü
+á2n1ér.
+á2n1érc
+á2nérd
+á2n1éré
+á2n1érl
+án1éte
+á2névad
+á2n1éve
+á2n1é2vé
+án1f2r
+án2gab
+án2g1a2r
+án2g1ára
+ángás1s
+án2g1át
+án2ged
+án2g1el
+ánge2s
+án2g1ér.
+án2g1é2s
+áng3g
+án2g1it
+án2g1iv
+án2gí
+án2g1osz
+án2gőr
+án2g1us
+án2gü
+1ángy.
+án2gyas
+á2n1i2d
+á2n1if
+á2n1i2ga
+án1igé
+áni2k1a
+áni2k1á
+áni2ke
+án1ill
+á2n1im
+án1ind
+án1inn
+á2n1i2p
+á2nirr
+án1irt
+án1isk
+án1ism
+á2n1i2sz
+áni2tá
+áni2t1e2
+áni2t1í
+áni2tol
+áni2t1or
+án1izo
+án1íg
+án1ív
+án1íz
+án2kaj
+ánk1aro
+án2kern
+án1k2li
+án1k2lo
+án1klu
+án1k2rá
+án3nye
+án3nyí
+án3nyo
+án3nyu
+á2n1o2b
+á2n1okir
+á2n1okta
+á2n1o2ku
+án1old
+án1oli
+á3nom
+áno2n1i2m
+á2n1o2r
+án1oszl
+án1ott
+á2n1ox
+án1óri
+án1ök
+á2n1öl
+án1öm
+á2n1ön
+á2n1ör
+á2n1ös
+á2n1öt
+án1övö
+á2n1őr
+án1ő2s
+á2n1ő2z
+án1pl
+án1pr
+án2ses
+án2s1ér
+án2sis
+án2siz
+án1s2pe
+án1s2pi
+ánst2
+án1str
+áns1üld
+án1szl
+ánt1acé
+ánt1a2ny
+án2taz
+án2t1á2g
+ántá2p
+án2t1árb
+án2t1ári
+án2t1ed
+ánt1eké
+ánt1elh
+án2tez
+ánt1éke
+án2térte
+án2tid
+án2t1ipa
+ánt1ist
+án2t1iz
+án2t1ív
+án2tök
+án2t1ös
+án1t2rak
+án1tran
+án2t1ü2l
+á2n1ud
+á2n1ug
+á2n1uj
+á2n1u2r
+á2n1u2t
+án1úr
+ánú2t
+án1útj
+á2n1úto
+án1útt
+án1ü2g
+án1ü2l
+án1ü2t
+án1ü2v
+án1ü2z
+án1űz
+ány1adás
+ány1a2dó
+ány1agg
+ány1akc
+ány1alap
+ány1alk
+ány1all
+ány1anya
+ány1anyá
+ány1apá
+ány1ara
+ány1ará
+ány1art
+ány1assz
+ány1aszt
+á2ny1á2l
+ány1á2ras
+á2ny1á2rá
+á2ny1árb
+ány1árc
+á2ny1árf
+ány1árh
+ány1árk
+á2ny1árn
+á2ny1á2ro
+á2ny1árr
+á2ny1árs
+á2ny1árt
+ány1áru
+ány1árú
+á2ny1átl
+á2ny1á2z
+ány1ed
+á2ny1e2g
+ányegyez1
+ány1el
+ánye2le
+á2ny1e2m
+ány1en
+á2ny1ep
+ány1eső
+ány1et
+ány1e2v
+á2ny1éd
+á2ny1ég
+á2nyéhe
+á2ny1é2j
+á2ny1é2k
+á2ny1él
+á2ny1é2ne
+ány1érc.
+ány1érre
+á2ny1érte
+á2ny1érté
+ányé2r1ü
+ány1érvé
+á2ny1és
+á2nyéte
+á2nyétk
+á2ny1étt
+á2nyéve
+ányfé2l1é2v
+á2ny1id
+á2nyigé
+á2nyike
+á2ny1ikr
+á2nyirat
+á2nyiro
+á2nyisk
+á2ny1isz
+á2nyita
+ány1í2ró
+á2ny1oml
+á2ny1ont
+á2ny1o2r
+á2nyosz
+ány1ök
+ány1ö2r
+á2ny1ös
+ány1öz
+á2ny1ő2
+ány1tr
+á2nyug
+á2ny1ur
+ány1ut
+á2nyúto
+á2ny1ü2
+á2ny1ű2
+án2zál
+á1o
+áo2cs
+áo2ká
+áo2ko
+áo2mo
+áo2pe
+áo2so
+áo2szan
+áo2sz1e
+áo2szis
+áo2sziv
+áo2szú
+á1ó
+áó2ha
+áó2va
+á1ö
+áö2le
+áö2mö
+áö2re
+áö2rö
+á1ő
+áő2sz
+á2p1a2dot
+ápa1tr
+ápa3u2
+á2p1ág
+áp1áll
+áp1áta
+áp1dr
+áp1eg
+áp1e2l
+áp1e2m
+ápe2n
+á2p1e2s
+áp1e2t
+á2p1ég
+áp1é2te
+ápi2ac
+ápi2av
+á2p1im
+áp1inj
+áp1int
+ápi2t
+á2p1ita
+á2p1ín
+á2poll
+ápo2r1e
+áp1őr
+áp2ro
+áp1t2r
+á2p1ug
+á2p1u2t
+á2p1úr
+áp1üg
+áp1üz
+á2r1abl
+á2r1abr
+á2r1abs
+ár1adag
+á2radata
+á2radatá
+á2radatb
+1áradaté
+á2radatn
+á2radato
+1á2radatr
+á2radatt
+ár1a2gá
+á2r1ajk
+á2r1a2kad
+á2r1a2kas
+á2r1akc
+á2r1akna.
+á2raknát
+á2r1akt.
+ár1akti
+ár1aktí
+ár1alá
+á2r1alj.
+á2r1alja.
+á2raljak
+á2r1aljá
+ár1alk
+ár1all
+á2r1alm
+ár1alt
+á2r1alv
+1á2rama.
+1áramai
+1á2ramá
+ára2mál
+ára2m1el
+ára2m1érté
+1á2rami
+ára2m1in
+1á2ramkö
+1á2ramok
+1á2ramol
+1á2ramot
+1á2rams
+1á2ramu
+1á2ramú
+ár1ana
+ár1ang
+ár1a2no
+á2r1ant
+ár1a2pá
+ár1a2pó
+ár1aps
+á2r1a2rá
+á2r1arc
+ár1a2ri
+á2r1asp
+ára2taj
+ára2tal
+ára2tav
+ára2tál
+ára2t1inf
+ár1atlé
+ára2t1ü2
+ár1aty
+á2r1ábr
+árá2c
+árá2g
+ár1ága
+ár1ágr
+ár1ágy
+ár1á2lo
+á2r1á2p
+ár1ár.
+á2r1á2rak
+á2r1á2rá
+á2r1árb
+á2r1árf
+á2r1á2ri
+á2r1árk
+á2r1á2ro
+á2r1árr
+á2r1árt
+ár1á2ru
+ár1árú
+ár1árv
+á2r1ásás
+árá2szó
+á2r1á2ta
+árát1a2d
+á2r1átá
+ár1átb
+á2r1átc
+á2r1átd
+ár1á2t1e2
+á2r1áté
+á2r1átf
+á2r1áth
+á2r1á2ti
+á2r1átj
+á2r1átk
+á2r1átm
+á2r1á2tö
+á2r1átr
+á2r1áts
+á2r1átt
+á2r1átú
+á2r1átv
+ár1bl
+1árboc
+ár1br
+ár2d1ál
+árd1ell
+árd1eme
+ár2d1é2n
+ár2d1őr
+ár1drá
+ár2dud
+áre2á
+ár1e2d
+á2r1e2g
+ár1ej
+á2r1e2l
+árelői3r
+áre2ma
+áre2mél
+áre2n
+ár1ene
+ár1eng
+á2r1e2r
+ár1e2sé
+ár1e2ső
+ár1evé
+á2r1ex
+ár1ébr
+ár1éde
+á2r1é2g
+ár1éj.
+ár1é2je
+ár1éjs
+á2r1é2ke
+á2r1é2ké
+á2r1éks
+á2r1é2l
+á2r1é2ne
+á2r1ép
+á2r1éré
+á2r1é2ri
+ár1éss
+ár1ész
+á2rétk
+á2r1étr
+á2r1étt
+á2r1étv
+á2r1év.
+áré2vek
+á2r1évk
+á2r1évr
+ár1fl
+ár1f2r
+árgás1s
+ár1gl
+ár1g2r
+ár2gyárv
+ár2gyir
+ár2gyol
+ár2gyó
+á2r1i2de
+á2r1i2dé
+á3r2i3dőtl
+ár1ifj
+ári2g
+á2r1iga
+á2r1igá
+á2r1ige
+á2r1ill
+á2r1i2má
+ár1imb
+á2r1i2mi
+á2rinas
+á2r1inc
+á2r1ind
+á2r1inf
+á2r1ing
+ár1inn
+á2r1int
+á2r1inv
+á2rio
+á2r1i2paro
+ári2s1e
+ár1isko
+ár1iste
+ár1i2sza
+á2r1i2ta
+ár1i2zo
+á2r1ír
+ár1ív
+á2r1í2z
+árka1k2
+1árkádo
+ár1k2l
+1árkok
+ár1kré
+ár1k2v
+árnás3s
+árnya2n
+ár2ny1any
+árnye2l
+ár2ny1ele
+ár2nyelő
+ár2nyem
+ár2nyes
+ár2nyok
+ár2ny1ol
+ár2nyos
+ár2nyö
+ár2nyü
+ár1odv
+á2ro2ká
+áro2k1e
+á2rokha
+á2rokm
+áro2kol
+á2r1o2koz
+á2rokre
+1á2roks
+á2rokta
+á2r1olda
+ároma2
+áro2maj
+áro2mak
+áro2m1al
+áro2m1as
+áro2már
+áro2m1ok
+áro2m1os
+ár1opt
+á2r1o2r
+áro2sas
+áro2sál
+áros3s
+á2r1ostr
+á2r1osty
+ár1otth
+á2r1o2v
+áróé2r
+ár1ó2nét
+ár1ó2név
+áró1p2
+á2r1ó2rak
+áró2rák
+á2r1óri
+áró1ská
+áró1s2p
+ár1ö2b
+ár1öc
+ár1ök
+á2r1ö2l
+á2r1ön
+ár1ör
+á2r1ös
+ár1öv
+á2r1ö2z
+ár1ő2r
+ár1ő2s
+1árpa.
+ár1pl
+ár1p2r
+ár1p2s
+ár2s1ala
+árs1asz
+ár2s1ál
+ár2sed
+ár2s1e2l
+ár2sem
+ár2s1en
+ár2ses
+ár2s1é2g
+ár2sip
+ár2sirá
+árs1okt
+ár2s1ol
+ár2sóv
+ár2s1ön
+árs3s
+ár1s2tab
+ár2sut
+ársza2ké
+ár2s3zene
+ár2tado
+ár2t1aj
+1ártalo
+árta2n1á2s
+árt1ará
+árt1a2ris
+árta3u2
+árt1áll
+ár2t1árn
+ár2t1á2ru
+ár2t1e2g
+árt1elh
+árt1eli
+árt1ell
+árt1eln
+ár2t1elő
+árt1emb
+ár2t1erk
+árte2s
+árt1ese
+árt1esth
+árt1eti
+árt1éle
+ár2t1érd
+ár2t1érte
+ár2tid
+ár2tif
+ár2t1ins
+ár2t1int
+árt1izg
+ár2tít
+ár2t1okta
+ár2top
+árt1otth
+ár2t1ön
+ár2t1ös
+ár2t1ura
+árt1u2sz
+ár2t1ut
+1á2ru.
+1á2rua
+áruá2
+1á2ru1b2
+1á2ruc
+á2rud
+1áruda
+1árudá
+1á2rue
+1á2rué
+1á2ruf
+1árugy
+1á2rui
+á2ruj
+1árujá
+1á2rum
+1á2run.
+1á2runa
+1á2runá
+á2r1und
+á2runi
+1á2ruo
+1á2ru1p2
+á2rur
+1árura.
+ár1urá
+1á2rus
+árus3s
+á2rut
+1árut.
+áru2tal
+áru2tas
+1árute
+áru1tr
+áru2tun
+1á2ruü
+1á2ruv
+ár1u2z
+1á2rúé
+1á2rúk
+ár1úré
+ár1úrf
+ár1úsz
+á2r1úta
+á2r1útb
+á2r1úté
+á2r1úth
+á2r1ú2ti
+á2r1útj
+ár1útl
+á2r1útn
+á2r1ú2to
+á2r1útr
+ár1úts
+á2r1útt
+ár1ü2g
+ár1ü2l
+ár1ün
+ár1ür
+ár1ü2s
+ár1üt
+ár1ü2v
+ár1üz
+ár1űr
+ár1ű2z
+1árvác
+ása2b
+á2s1abl
+ás1abo
+ás1a2dat
+á2s1a2dá
+ás1a2do
+á2s1a2dó
+á2s1a2já
+ás1ajtó
+á2s1a2kar
+á2s1akc
+á2s1akv
+ás1a2la
+ás1alg
+ás1a2li
+ás1alj
+ás1alk
+ás1all
+ás1alm
+á2s1alt
+á2s1amb
+ása2n
+á2s1ana
+á2s1anó
+á2s1ant
+á2s1any
+ás1a2pá
+ás1app
+ás1apu
+ás1a2ra
+ás1a2rán
+á2s1arc
+á2s1aré
+á2s1a2ri
+ás1art
+ás1arz
+ás1asp
+á2sass
+1á2satá
+á2s1atl
+á2sato
+ás1aty
+á2s1a2u
+á2s1azo
+á2sábé
+á2s1ábr
+ásá2gai
+á2s1ágb
+á2s1á2gig
+á2s1ágk
+ás1ágn
+á2s1á2gú
+á2s1ál
+á2s1á2p
+ás1áras
+ásá2rét
+ásáró2
+ásá2rón
+1á2sásb
+1á2sási
+1ásásk
+ás1ásv
+ás1á2ta
+á2s1átá
+ás1áté
+ás1áth
+ás1áti
+ás1átj
+ás1átk
+á2s1átl
+á2s1átr
+ás1áts
+ás1átt
+ás1átv
+á2s1á2z
+ás1bl
+ás1br
+áscsa2p1á2
+ás1d2r
+ás1e2b
+á2s1e2d
+á2s1ef
+ás1e2gy
+á2s1e2l
+á2s1e2m
+á2s1e2n
+ás1epi
+ás1erk
+ás1erő
+á2s1e2s
+á2s1e2t
+ás1e2v
+ás1ex
+ás1ez
+á2s1é2g
+á2s1éhe
+á2s1éj
+á2s1é2k
+á2s1é2l
+á2s1é2ne
+á2s1ép
+á2s1ér.
+á2s1érd
+á2s1é2re
+á2s1é2ré
+á2s1é2ri
+á2s1érl
+á2s1érs
+á2s1érte
+á2s1érté
+á2s1értő
+á2s1érv
+á2s1é2s
+á2s1é2te
+ás1étk
+ás1étt
+á2s1é2ve
+ás1fl
+ás1fr
+ás1gl
+ás1gr
+á2s1i2d
+á2s1if
+ási2g
+ás1iga
+ás1ige
+ási2k1e
+á2s1ill
+á2s1imá
+ás1imp
+ás1ind
+ás1inf
+á2s1ing
+á2s1ini
+á2s1int
+ás1inv
+á2s1i2p
+á2s1i2rat
+á2s1i2rá
+ás1iro
+ás1irt
+á2s1isk
+á2s1ism
+ás1ist
+ás1i2sz
+ás1ita
+á2s1iz
+ás1íg
+á2s1íj
+ás1íns
+ásí2r
+ás1írá
+ás1író
+á2s1í2v
+á2s1í2z
+ás1kl
+ás1k2r
+ás1kv
+1ásnu
+á2s1ob
+ásoda2
+áso2d1al
+áso2d1an
+áso2d1as
+áso2dau
+áso2d1ál
+ás1okl
+ás1okm
+ás1okta
+ás1oldó
+ás1oli
+á2s1ont
+á2s1op
+ás1o2rá
+á2s1org
+á2sori
+á2s1ork
+ás1orr
+á2s1ors
+á2s1orv
+ás1osz
+á2s1o2v
+1á2sób
+1á2sóé
+1á2sóg
+1á2sói
+1á2sój
+1á2sók
+1á2són
+ásó1p2
+á2sór
+ás1ó2rá
+ás1óri
+1ásóró
+á2sós
+ás1ó2sá
+1á2sót
+á2sóv
+á2s1ö2k
+ás1ö2l
+ás1ön
+á2s1ö2r
+á2s1ös
+ás1ö2v
+á2s1ö2z
+ás1ő2r
+ás1ő2s
+á1spic
+ás1p2l
+á1s2pór
+ásp2r
+ás1ps
+ás1s2k
+ás1s2p
+ás1sr
+ás1s2t
+ássz2
+ás3szab
+ás3szag
+ás3szaka
+ás3szaké
+ás3száj
+ás3szám
+ás3száz
+ás3sze
+ás3szél
+ás3szf
+ás3szi
+ás3szí
+ás3szk
+ás3szoc
+ás3szok
+ás3szol
+ás3szor
+ás3szó
+ás3szö
+ás3szt
+ás3szú
+ás3szű
+ás2teg
+ást1elem
+ás2tir
+ás2t1ös
+ás1t2re
+ás1tri
+ás1tróf
+á2s1ud
+á2s1uj
+á2s1u2r
+á2s1u2s
+ásu2t
+ás1uta
+á2s1utá
+ás1utó
+á2s1u2z
+ás1úr.
+ás1úrn
+ás1ú2sz
+ás1úti
+ás1úto
+ás1üd
+á2s1üg
+ás1üld
+ás1üle
+á2s1ün
+á2s1ür
+ás1ü2ve
+á2s1üz
+ás1űr
+ás1ű2z
+á2s3zac
+á2sz1a2d
+ász1aga
+ász1agá
+á2sz1agy
+á2szaj
+á2sz1akc
+ász1a2kol
+á2sz1akt
+ász1ale
+á2sz1alk
+ásza2n
+á2szana
+á2sz1ant
+á2sz1any
+á2sz1ap
+ásza2s
+ász1asz
+ásza2t1e
+á2sz1au
+ás3zavar
+ász1ágg
+ász1ágy
+ász1á2lo
+ás3záp
+ászá2r1as
+ász1á2rih
+á2sz1á2rú
+ászás1s
+á2száta
+á2sz1áz
+ász1e2b
+ászebé2
+ászeb1éde
+ász1e2gé
+ász1e2gy
+ász1eln
+ász1elv
+ász1emb
+ás3zene
+ás3zené
+ász1eng
+ász1e2p
+á2sz1erd
+á2sz1e2ré
+á2sz1e2s
+ász1e2t
+ász1e2v
+ász1ex
+á2sz1éj
+á2sz1ékb
+á2sz1é2l
+á2sz1é2ne
+á2sz1ép
+ász1éré
+á2sz1éte
+á2sz1étt
+á2sz1éve
+á2szid
+á2szif
+á2sz1ill
+á2szind
+ász1ing
+ászi2p
+á2sz1ipa
+á2sziro
+á2sz1isk
+á2sz1ism
+ász1ist
+ász1ita
+á2sziz
+á2szír
+ász1k2
+1ászkái
+á2szokl
+á2sz1okm
+ász1ors
+á2sz1osz
+ászó1s2p
+á2sz1ö2b
+ászö2l
+ász1ölt
+á2sz1ö2r
+á2sz1ös
+ász1övé
+ász1őr
+ász1ő2s
+ász3sa
+ás3zsu
+ászt2
+ász1tr
+á2szuni
+á2szur
+á2szut
+ász1ú2s
+á2sz1ü2g
+á2sz1ün
+á2sz1ü2z
+ász1z
+át1abr
+át1a2já
+át1ajk
+át1ajt
+áta1kré
+á2t1akt.
+á2t1akto
+át1alh
+á2t1alja
+á2t1alm
+át1als
+át1a2lu
+át1alvá
+á2t1a2ra
+á2t1ará
+á2t1arc
+át1arz
+áta2sá
+át1aut
+át1azo
+átá2c
+át1ág.
+át1ál
+átá2p
+át1ápo
+á2t1á2rad
+á2t1á2rai
+át1áram
+á2t1á2rá
+á2t1árb
+á2t1árn
+á2t1á2ro
+á2t1árt
+á2t1á2ru
+1á2t1ásás
+átá2s3z
+á2t1átf
+á2t1átu
+át1átv
+át1bl
+át1br
+1átbu
+át1dr
+át1e2c
+át1ej
+át1ell
+át1eln
+át1elv
+á2t1emb
+át1eml
+át1eng
+áte2rá
+áteri2
+áte2rik
+át1erő
+át1ex
+át1é2d
+átée2
+áté2g
+át1ége
+át1égé
+áté2kaj
+áté2k1a2l
+áté2kas
+áté2ke
+áték1em
+áték1es
+áté2kol
+áté2k1ü
+át1é2l
+áté2p
+á2t1érb
+á2t1é2ri
+á2t1érr
+á2t1érz
+áté2t1á2
+1átfés
+át1fr
+át1gr
+át2hi.
+át2hia
+1áthid
+áti2ag
+áti2al
+áti2d
+áti2g
+á2t1igé
+át1ill
+á2t1ing
+át1i2pa
+á2t1irá
+át1isk
+át1ist
+á2t1i2ta
+á2t1izé
+á2t1izm
+á2t1i2zo
+át1íg
+á2t1í2r
+át1í2v
+1átkel
+át1kl
+át1k2r
+átle2g1
+átlege2
+átműt2r
+át1oj
+áto2kol
+át1okol.
+át1o2koz
+át1okta
+2átolj
+2átolt
+át1oml
+át1ont
+át1op
+áto2ran
+áto2ras
+áto2rác
+áto2rál
+áto2re
+áto2ris
+áto2r1ol
+át1orzá
+á2t1o2x
+átói2ko
+átó1p2
+át1óri
+át1öb
+átö2l
+át1ölé
+át1öml
+át1ön
+át1öt
+á2t1ö2v
+át1ö2z
+át1ő2r
+át1pl
+át1pr
+át1ps
+át2ril
+át1sk
+át1sl
+át1sm
+át1sp
+át1sr
+át1st
+1átszű
+1átteki
+át3t2é
+át1t2r
+á2t1udv
+á2t1ug
+á2t1uh
+á2t1uj
+átu2min
+átu2n
+á2t1u2r
+átu2sze
+á2t1u2t
+át1új
+á2t1úr.
+á2t1úrb
+á2t1úrh
+át1úri
+á2t1úrn
+á2t1ú2ro
+á2t1úrr
+á2t1ú2s
+á2t1üg
+át1ül
+á2t1üt
+á2t1ü2v
+át1űr
+1átvár
+1átvev
+á1u
+áu2ga
+áu2go
+áu2ná
+áu2no
+áu2nó
+áu2nu
+áu2sz
+áu2ta
+áu2tá
+á1ú
+áú2sz
+á1ü
+áü2ge
+áü2gy
+áü2le
+áü2lé
+áü2lö
+áü2lő
+áü2lü
+áü2rí
+áü2té
+áü2ti
+áü2tö
+áü2tő
+áü2tü
+áü2vö
+á1ű
+áv1adm
+á2v1ajk
+áv1akt
+áv1alk
+áv1alt
+áv1asp
+áva1st
+áva1sz2
+áva1t2
+á2v1au
+áv1azo
+áv1áls
+áv1áte
+áv1átf
+á2v1áth
+á2v1átj
+á2v1átk
+á2v1átu
+ávegész1
+á2v1e2l
+ável1é
+áv1é2de
+ávé1dr
+á2v1é2ri
+á2v1érte
+á2v1érté
+áv1fr
+á2v1iga
+á2v1igé
+áv1ind
+á2v1inf
+á2v1ing
+á2v1int
+á2v1i2rá
+á2v1iro
+á2v1i2si
+áv1isk
+áv1ism
+áv1izm
+áv1izo
+áv1ír
+á2v1ob
+á2v1olv
+á2v1op
+á2v1osz
+áv1órá
+áv1ör
+áv1ös
+áv1öv
+áv1őr
+áv1pr
+áv1sk
+áv1sp
+áv1st
+áv1tr
+á2v1ug
+á2v1ur
+á2v1ú2sz
+ávú2t
+á2v1úti
+á2v1úto
+áv1üg
+áv1ü2z
+á2z1abl
+áz1abs
+áza2dal
+áza2d1e2
+áza2dott
+áza2dü
+áz1ajt
+áz1akc
+á2z1a2kó
+á2z1akt.
+á2z1akta
+áz1aktá
+á2z1aktu
+áz1a2lap
+á2z1a2le
+á2z1alk
+áza2n
+á2z1ana
+á2z1ano
+á2z1any
+á2z1a2p
+áz1a2rá
+áz1arc
+áz1arm
+á2z1assz
+á2z1aszt
+áza2t1a2l
+áza2tan
+ázate2
+áza2t1el
+áza2t1ér.
+áza2t1érv
+áza2tés
+áza2tik
+áza2tí
+áz1aty
+á2z1a2u
+á2z1á2g
+á2z1á2l
+á2z1á2rai
+á2z1á2rak
+á2z1á2ram
+á2z1á2ras
+á2z1á2rat
+ázá2rár
+ázá2rát
+á2z1árb
+á2z1árc
+á2z1árd
+á2z1á2ré
+áz1árf
+á2z1á2ri
+á2z1árjáb
+á2z1árjáv
+á2z1árka
+á2z1á2rokk
+á2z1á2rokr
+á2z1árp
+á2z1árrá
+áz1á2runkn
+áz1á2runkr
+ázá3rus.
+ázás3s
+á2z1á2ta
+á2z1á2t1á
+áz1átb
+á2z1á2t1e2
+á2z1áté
+áz1áth
+á2z1átr
+áz1áts
+á2z1átü
+á2z1áz
+áz1bl
+áz1d2r
+áz1ef
+áz1e2g
+áz1e2m
+áz1ep
+áz1e2r
+áz1e2s
+áz1e2t
+áz1ex
+áz1e2z
+á2z1ég
+á2z1é2l
+á2z1é2p
+á2z1ér.
+á2z1érő
+á2z1érte
+á2z1érté
+á2z1értő
+á2z1érz
+á2z1é2te
+á2z1éve
+áz1évi
+áz1fl
+áz1fr
+áz1g2r
+á2z1i2d
+á2z1igé
+á2z1i2kon
+á2z1ill
+á2z1imá
+á2z1imi
+áz1imp
+á2z1inf
+á2z1ing
+á2z1inj
+á2z1int
+á2z1i2par
+áz1irá
+áz1iro
+ázi2s1e
+ázi2sir
+ázi2s1í2
+ázis3s
+ázi2s1ü
+ázi2szó
+ázi2z
+áz1izm
+áz1izo
+áz1íj
+áz1í2v
+áz1k2l
+áz1k2r
+á2z1olda
+á2zoltal
+á2z1oltó
+áz1oml
+á2z1ont
+á2z1o2r
+á2z1osz
+ázói2ko
+áz1ól.
+áz1ó2rá
+á2z1óri
+ázó1s2p
+ázó1sz
+áz1öb
+áz1öd
+áz1ö2l
+áz1öm
+áz1ön
+áz1ös
+áz1ö2t
+áz1ö2v
+áz1öz
+áz1ő2r
+áz1pl
+áz1p2r
+á2zsab
+á2zs1a2d
+á2zs1a2g
+ázs1ajt
+á2zs1akn
+ázs1ala
+ázs1alk
+ázs1all
+á2zs1amu
+ázs1any
+á2zsar
+ázs1ará
+á2zsat
+á2zs1au
+á2zs1áll
+á2z3sár.
+á2zse
+áz3seb
+ázs1e2c
+ázs1ef
+ázs1eg
+ázs1e2l
+ázs1e2m
+ázs1es
+á2zséj
+á2zs1é2k
+ázs1éne
+á2zs1ére
+á2zs1éri
+ázsé2t
+ázs1éte
+á2zsia
+á2zsiá
+á2zside
+ázsi2g
+á2zs1iga
+ázs1igá
+á2zsige
+á2zsimm
+á2zs1ing
+á2zs1int
+á2zsinv
+á2zsió
+á2zsip
+ázs1isk
+á2zs1ita
+á2zsiz
+á2zs1í2
+áz3sor
+áz3sóh
+ázs1ó2r
+á2zsö
+á2zs1ő2
+ázs1s
+á2zs1uj
+á2zs1ut
+á2zsúto
+á2zsü
+ázs1ü2v
+á2z3sű
+áz3szá
+ázs3zon
+áz1t2r
+á2z1ud
+á2z1ug
+á2z1uj
+á2z1u2r
+á2z1ut
+á2z1új
+á2z1úr
+á2z1ü2g
+ázü2l
+áz1ür
+áz1ü2z
+ázy1i
+áz3zse
+2b.
+1ba
+baa2d
+ba2b1a2dat
+ba2b1ajk
+baba1k2
+ba2b1ara
+ba2b1arc
+ba2b1aszt
+ba2b1ábr
+babá2c
+ba2b1ácsi
+ba2b1ág
+bab1áll
+ba2b1á2ro
+ba2bátv
+ba2b1érc
+babé2t
+bab1éte
+ba2bév
+ba2bik
+ba2b1i2na.
+ba2bola
+bab1old
+ba2b1ó2r
+ba2b1ult
+ba2bü
+ba2c3hu
+ba2csor
+2b1a2dag
+ba2das
+2b1a2dato
+ba2d1ár
+ba2deg
+ba2d1e2s
+ba2dog
+2badomá
+ba2dód
+ba2dói
+ba2dój
+ba2dók
+ba2dót
+ba2duj
+ba2dús
+baegész1
+bae2r
+baé2r
+ba1fl
+ba1f2r
+ba2gai
+ba1g2n
+ba1g2r
+2b1agy.
+bai2z
+ba2jag
+ba2j1á2ru
+ba2j1á2to
+2bajkú
+ba2j1ó2r
+ba2jü
+ba2jű
+ba2k1a2pó
+2bakas
+ba2kaszt
+2ba2kác
+bak1á2cs
+bak1áll
+2bakc
+ba2keg
+ba2k1ér.
+ba2k1éri
+bak1k
+ba1k2li
+ba1klu
+ba2k1o2v
+ba1k2ri
+bak1t2
+2b1aktu
+baku2r
+bak1ura
+bak1urá
+ba2ky
+2b1alany
+2b1a2lál
+ba2l1e2s
+ba2l1í
+bal2lak
+bal2lan
+bal2lál
+bal2l1ás
+bal2láz
+balle2
+bal2leg
+bal2l1el
+bal2lem
+bal2les
+bal2l1é2l
+bal2lin
+bal2lór
+bal2té
+bal2tiz
+ba2lud
+2b1amp
+2banal
+2b1a2nat
+banás3s
+ban2c1e
+banc3s
+2b1angy
+ban2kab
+ban2k1a2d
+ban2k1a2l
+ban2kar
+banke2
+ban2ker
+ban2kép
+ban2kérd
+ban2kir
+ban2kol
+banku2
+ban2kut
+ba2nyó
+bao2k
+bao2l
+baó2r
+ba1p2l
+ba1pro
+2b1arc.
+2b1arcé
+2b1arcn
+2b1arco
+2b1arcr
+bar2csad
+bar2csal
+bar2csan
+bar2csö
+2b1arcú
+2b1argu
+baro2ma
+2b1arté
+baság1g
+ba2seb
+ba1slá
+ba1s2m
+ba1sni
+2b1aspe
+ba1s2pó
+bas3sze
+ba1s2ta
+ba1s2tá
+ba2t1esti
+ba1t2rá
+ba1tre
+ba1tré
+ba2ud
+2b1a2ul
+bau2r
+2b1a2vat
+ba1yi
+1bá
+bá2bal
+bá2b1ass
+bá2bál
+bá2b1es
+bá2bik
+bá2bö
+bá2b1ü
+bá2csor
+bá2csü
+2b1á2ga
+b1á2gú
+bá2gyal
+bá2gyar
+bá2gyott
+bá2gyö
+bá2gyú
+bá2j1e2
+báj2n1á
+bá2j1ó2
+bá2j1ö2
+báj2t1a2k
+bá2jü
+bákos1
+bá2laj
+bá2l1ap
+bá2l1e2
+bálé2
+bá2l1éj
+bá2lid
+bá2l1ing
+bá2l1i2o
+bál2is
+2b1állí
+2b1állo
+2b1állv
+2bálm
+bá2lö
+bá2lü
+bá2lyad
+bá2ly1al
+bá2ly1a2n
+bá2ly1á2z
+báni2as
+bán2ré
+bánya2ié
+bá2po
+2b1á2rad
+2b1á2rai
+bá2r1aj
+2b1á2ram
+bá2rap
+bá2ras
+2bá2ra2t
+2b1á2ráb
+bá2rág
+bá2rár
+bá2r1ás
+2b1á2rát
+bár2das
+bár2d1á
+bár2de
+bá2r1e
+bá2rén
+2b1á2riá
+bár1i2o
+bá2r1i2p
+bá2rí
+2b1árny
+bá2r1ó2né.
+2báru.
+2báruf
+2b1á2rug
+2b1á2ruh
+2b1áruj
+2b1á2ruk
+2b1árur
+bár1u2ra.
+2bárus
+2b1árut
+2báruv
+2bárú
+bá2rúr
+bá2rü
+bá2s1á2ré
+bá2se
+bá2sis
+bá2sz1ak
+bá2szan
+bá2szas
+bá2sz1ál
+bá2sz1á2ru
+bá2sze
+bá2szil
+bá2szip
+bá2szí
+bá2szö
+bá2szü
+bá2t1a2k
+bá2t1al
+bá2t1á2
+2b1á2t1e2
+bá2tö
+bá2tü
+bb1a2da
+bb1add
+bb1a2kas
+b2b1alk
+b2b1als
+b2b1alu
+b2b1alv
+b2b1a2ny
+b2b1ap
+b2b1a2ra
+bba2t
+b2b1au
+bbá2gyas
+b2b1áll
+bb1álm
+b2b1áp
+bb1árn
+bb1á2ru
+b2b1á2s
+b2b1át
+bb1dr
+bbe2g
+b2b1e2kén
+b2b1elv
+b2b1emb
+bb1eng
+bb1erj
+bb1ern
+bb1erő
+bb1e2rű
+bb1esté
+b2b1etn
+b2b1ex
+b2b1ég
+bb1él.
+bb1éle
+bb1élh
+bb1élj
+bb1éln
+bb1élt
+bb1é2lű
+bb1élv
+b2b1ép
+bb1érl
+b2b1érm
+b2b1érte
+b2b1érté
+bb1érv
+b2b1évi
+bb1fr
+bb1i2de
+b2b1iga
+bbigaz1
+bb1illa
+b2b1ind
+b2b1int
+b2b1inv
+bbi2tat
+b2b1itt
+b2b1í2r
+b2b1ív
+bb1kl
+bb1kr
+b2b1okt
+bb1oltá
+b2b1olv
+b2b1op
+bb1ott
+b2b1ób
+bb1ó2r
+b2b1ö2m
+bbö2r
+bb1örö
+b2b1ös
+bb1őri
+bb1őrz
+b2b1ő2s
+bb1pl
+bb1pr
+bb1sk
+bb1sp
+bb1st2
+bb1t2r
+b2b1ud
+b2b1u2g
+b2b1uj
+bbu2r
+bb1ura
+b2b1u2t
+bbúgás1
+b2b1új
+b2b1ú2s
+b2b1üg
+b2b1ür
+b2b1üz
+bb1ű2z
+bb2ví
+bc3sz
+bda2cs1a2pá
+bda1d2
+bda1p2
+bda1s2
+bdasz2
+bda1t2
+bdé2n
+bd2rá
+bd2ro
+bd2ró
+1be
+be2ac
+bea2d
+bea2j
+bea2k
+bea2l
+bea2n
+bea2r
+bea2s
+bea2t1e
+be2ati
+bea2tin
+be2atk
+be2atl
+bea2v
+beá2j
+beá2s
+beá2z
+be1bl
+be1b2r
+be2csar
+be2csár
+be2csért
+be2cs1é2te
+be2dén
+be2dz
+bee2l
+bee2s
+beé2r
+be1fl
+be1fr
+begés3s
+begész1
+be1g2r
+be2gyel
+b1egyl
+bei2g
+bei2s
+beí2r
+be2j1elt
+2bejt
+2b1e2ke.
+beke2csa
+2b1e2kétő
+be1k2ré
+be1kri
+be1kró
+be1k2v
+be2lál
+beleí2
+bel1els
+be2lemz
+bele1p2r
+belet2
+bele1tr
+be2l1é2k
+be2l1ér.
+be2l1é2ren
+be2l1érr
+be2lí
+be2lof
+be2löl
+2b1e2lőa
+be2lőr
+bel1p2
+2bemel
+2b1eml
+b1e2mus
+be2n1ál
+be2n1ék
+ben2n1a2
+ben2ná
+ben2n1e2r
+ben2nég
+be2ny1e2g
+beo2k
+beo2l
+beo2m
+beó2v
+beö2r
+be2pe.
+be2ped
+2b1e2pé
+be1p2l
+be1p2r
+be2r1ad
+ber1alá
+ber1all
+bera2n
+ber1any
+be2r1a2p
+be2r1a2r
+ber1ass
+be2r1a2t
+be2r1av
+be2raz
+be3rág
+ber1áll
+b1erdei
+2berdő
+ber1egé
+ber1egy
+be2r1e2ke.
+bere2k1eg
+be2r1ekék
+be2r1ell
+be2r1elm
+be2relődö
+be2r1előn
+be2r1e2mé
+be2r1eml
+be2r1e2pé
+be2r1e2r
+ber1e2szü
+be2r1e2tet
+be2rég
+be2r1ékk
+ber1éss
+ber1ingü
+be2rism
+be2r1ist
+ber1iszo
+ber1old
+be2ror
+ber1osz
+be2ról
+be2r1ó2r
+be2rő
+2b1erőd
+ber1ős.
+ber1ő2se
+ber1ő2si
+ber1ő2sü
+ber3s2
+berta2n1á2s
+be2r1ub
+be2r1un
+be2rur
+be2r1ut
+be2r1ü2g
+berü2l
+be2r1üld
+be2r1ülé
+be2r1ült
+be2sem
+2b1esél
+2b1e2sés
+be1ska
+be1ská
+be1s2l
+be1s2m
+2b1e2ső
+be1s2p2
+bessz1a
+bessz1á
+be1s2ta
+2beste
+2besté
+be1s2til
+be1sto
+2b1e2szet
+2b1e2szét
+b1eszm
+besz2t1a2
+besz2t1á
+beteg1ér.
+beté2t1elb
+beté2telk
+be1t2hi
+be1t2ra
+be1trá
+be1t2ré
+be1t2ro
+beu2g
+beu2t
+beü2t
+be2vező
+2b1e2vol
+2b1e2vő
+2b1ezr
+1bé
+2b1ébr
+bé2csú
+bé2d1as
+bé2d1á
+2bédé
+2bédh
+2bédj
+2bédl
+bé2d1o
+bé2dö
+2bédr
+2bédü
+2bédv
+bé2gő
+bék1alk
+2b1éksz
+bé2l1akt
+bé2l1a2n
+bé2l1a2p
+bé2l1a2r
+bé2lál
+bé2l1áto
+bé2l1á2z
+bé2l1ed
+bé2l1e2g
+bé2lek
+bé2l1e2r
+2b1é2let
+bé2l1é2j
+bé2liz
+bé2lí
+2bélj
+bé2l1o
+bé2ló
+bé2lö
+2b1é2lő
+bélt2
+bél1tr
+bé2lul
+bé2lú
+bé2ly1ec
+bé2l3yen
+bé2lyin
+bé2lyö
+bé2pí
+bé2pü
+2b1é2rai
+bé2r1aj
+bé2ral
+bé2r1a2n
+bé2rap
+bé2rar
+bé2rá
+2b1éráb
+2b1éráh
+2b1éráv
+2b1érde
+bé2reb
+bé2r1eleme
+bé2r1e2lemé
+bé2r1e2lemh
+bé2r1e2lemk
+bé2r1e2lemn
+bé2r1e2lemr
+bé2r1ell
+bé2relm
+bé2r1elői
+bé2r1eng
+bér1essz
+bé2r1esz
+bé2r1id
+bé2rir
+bé2rí
+b1érni
+bé2rö
+bér1s
+bért2
+2bértel
+2b1értés
+bér1tr
+bé2rut
+bé2rú
+bé2sz1a2
+bé2szá
+bé2sz1o
+béta1s
+2bétel
+bé1t2h
+2b1étk
+2b1étt
+2b1év.
+bé2vek
+2b1é2ven
+2b1é2ves
+bé2vet
+bé2vi.
+2b1évn
+bé2zsú
+bfej1els
+bfe2len
+bfé2n
+bf2la
+bf2rá
+bf2re
+bf2ri
+bf2ro
+bg2ra
+bg2rá
+bgyökö2
+bgyö2k1öl
+1bi
+bia2d
+bi2ae
+bi2ag
+bia2la
+bia2v
+bi1br
+bi1by
+bic3sz
+bida2
+bi2d1ad
+bi2d1al
+bi2deg
+bi2del
+2b1i2dő
+bi2ed
+bie2l
+bi1fr
+bi2gaz
+2b1i2gáj
+2bigén
+2b1i2hat
+bik1ala
+bi2k1ál
+bi2k1em
+bi2kik
+bi1klu
+bi2k1ő2
+bi1k2ro
+bik1s
+bil1ima
+bil1int
+bilis3s
+2billé
+2b1illő
+2billu
+bi2lü
+bi2ma.
+2b1i2mi
+2b1imp
+bi2nab
+2b1i2nad
+bi2naj
+2b1i2nat.
+bi2n1árb
+2b1indá
+bi2n1éte
+2b1inká
+bin3n
+bi2nü
+bi1ny
+bi2oa
+bi2oá
+bi2ob
+bi2oc
+bi2od
+bi2oe
+bi2oé
+bi2of
+bi2oge
+bi2ok
+bi2ol
+bi2om
+2b1i2on
+bi2or
+bió2r
+bi2par
+bi1p2l
+bi1pr
+2b1i2ram
+2b1i2rat
+2b1i2rán
+2birkái
+2birodá
+2b1irr
+2b1irtá
+2b1irtó
+bis2hi
+2b1i2si
+2bism
+bi2sö
+bi1s2p
+bis3s
+bi1s2to
+bit1ará
+bi2t1e2g
+bit1elh
+bit1elr
+bit1elt
+bite2r1a
+bi2t1ing
+bi2t1int
+bi2t1i2o
+bi2t1on
+bit1t2
+bit1ura
+bi2t1ut
+biú2s
+bi2var
+2b1i2vás
+1bí
+bí2ja
+bíróé2r
+bí2ve
+bí2vé
+bí2vű
+2b1í2zü
+bkés3s
+bk2li
+bk2lu
+bk2ra
+bk2rá
+bk2re
+bk2ré
+bk2ri
+bk2rí
+bk2ro
+bk2ró
+1b2labl
+blai2k
+blak1a2d
+bla2kal
+bla2k1an
+bla2k1átm
+bla2k1átt
+bla2kem
+bla2kik
+bla2k1ol
+bla2kü
+blap1e
+bla1p2l
+bla1s2t
+blás1s
+bl2be
+ble2r1i
+bles2
+ble2t1ak
+ble2t1a2n
+ble2t1á2
+ble2t1e2l
+ble2ter
+ble2tesz
+ble2tél
+ble2t1érd
+ble2t1étk
+bletigaz1
+ble2t1o
+ble2tó
+ble2t1ö2
+ble2tu
+ble2tüz
+bleü2
+bleves1s
+bl2he
+bli2af
+bli2as
+bli2of
+b1ljana
+bl2ne
+1b2lok
+blok2k1ö2
+blo2n1á
+blon3n
+b2l1őzé
+bl2re
+bl2rő
+bl2tő
+blu2esz
+1bo
+bo2aá
+bo2ab
+bo2ad
+bo2ae
+bo2af
+bo2ah
+bo2aj
+bo2am
+bo2ar
+bo2at
+bo2av
+bo2c1ak
+bo2ce
+bo2cé
+bo2c3h
+bo2csé
+bo1dy
+bo2ei
+bo1fl
+bo2g1a2k
+bo2g1a2t
+bo2g1á2c
+bogás1s
+bo2g1e
+bo2g1osz
+bogó2szá
+bo2gyo
+boka1p
+2b1o2kí
+b1o2koz
+bok2szak
+bok2szal
+bok2sz1ál
+bok2szel
+bokszé2
+bok2szél
+bok2sz1in
+bok2szó
+bok2sz1ő
+2b1okta
+2bolaj.
+bolás1s
+2b1oldó
+2b1o2lim
+bolo1g2
+bol2t1e
+bol2t1ö2
+bol2t1ü2
+2bolvas
+bona1
+bon1ava
+bon2can
+bon2c1e
+bon2ch
+2bond
+bo2n1e2
+bo2n1ér.
+bo2n1or
+bon2t1i
+bo2nü
+bo2og
+bo2ok
+bo2om
+bo2ot
+bo2pe
+bo2r1a2d
+bo2r1aka
+bor1akk
+bo2r1akv
+bo2r1a2l
+bora2n
+bor1any
+bo2rar
+bor1asz
+bor1atr
+bo2r1au
+bo2r1av
+bo2raz
+bor1ács
+bo2r1áll
+bo2r1áz
+bor1d2
+bo2re
+bor1e2c
+bor1el
+bor1e2r
+bor1es
+bor1f2
+borfi2úké
+bo2r1i2ko
+bo2r1il
+bo2r1ing
+bo2r1int
+bo2r1isk
+bo2r1iss
+bo2r1ist
+bo2r1itt
+bo2r1iz
+bor1k2
+2b1ornam
+bo2r1ond
+bo2r1ó2r
+bo2rö
+bo2rő
+2b1orr.
+2b1orrú
+bor2s1eprű
+bor2sors
+bor1str
+bor2sül
+bor2süt
+bor1tre
+bor1tré
+bo2rü
+borvíz1
+bor2z1á2rak
+bor2zsa
+bor2z3se
+2b1oszt
+bo2t1a2g
+bo2t1al
+bo2tar
+bo2tas
+bo2t1a2u
+bo2t1ác
+bo2tár
+bo2t1e2
+bo2t1il
+bot1inf
+bot1int
+bo2t1i2p
+bo2tí
+bo2t1ó2
+bo2tö
+bo2tur
+botú2
+bo2túr
+bo2tü
+bo2tű
+bo2ui
+bo2ul
+bo2ur
+bo1ya
+bo1yá
+bo1yé
+bo1yi
+bo1yo
+bo1yu
+bo2zar
+bo2zál
+bo2z1e2
+bo2zid
+bo2z1i2p
+bo2z1ir
+bo2zí
+bo2z1old
+bo2z3s
+bo2zü
+bo2zű
+1bó
+bóa2d
+bóá2g
+bóá2r
+bó2bé
+bó2cal
+bó2ch
+bó2cü
+bó1fl
+bó1kré
+bóli2a
+b1ólm
+bó1p2l
+bó1p2r
+bó2r1ad
+bó2r1an
+bó2rat
+2bórá
+bó2rás
+bór1ásv
+bó2reg
+bó2rel
+bó2r1in
+bó2riz
+bó2r1ol
+bóró2
+bó2rós
+bó2rö
+bórt2
+bó2rü
+bó1s2p
+bó1sz
+1bö
+bö2ch
+bö2lá
+2bölb
+böl2csü
+2b1ö2lér
+2bölhö
+2bölig
+2bölk
+b1ölkú
+2bölr
+2b1öltö
+2böltő
+bö2lú
+bö2lyökö
+b1öml
+bö2ná
+2b1önt
+bö2ra
+bö2r1e
+bö2ro
+2b1össz
+2b1ötl
+2b1öts
+bö2ve
+1bő
+bő2r1a2
+bő2r1á2
+bő2r1e2g
+bő2r1e2l
+bő2r1em
+bő2r1en
+bő2r1e2r
+bő2r1é2g
+bő2rék
+bő2r1és
+bő2ril
+bő2r1ing
+bő2rip
+bő2r1i2s
+bő2riz
+bőr1izg
+2bőrl
+bő2r1o2
+bőr1öl
+bő2rő
+bőrren2
+bőr1s2
+bő2r1u
+bő2rú
+bő2r1ü2g
+bő2r1ü2l
+2bősi
+bp2la
+bp2lá
+bp2le
+bp2re
+bp2ré
+bp2rí
+bp2ro
+b1proj
+bp2ró
+bra2k1á2
+bra2kös
+bra1p2
+1braty
+brá2nag
+brá2nas
+brá2n1át
+bránt2
+brá2sz1ál
+brá2sze
+b2ric
+bri2da
+bri2dá
+bri2der
+1b2rig
+bri2no
+bri2ód
+bri2óf
+bri2óm
+bri2tel
+b2rosú
+bró2m1a
+bró2me
+1b2rum
+bsé2g1el
+b1s2ká
+bs2lá
+bs2pe
+bs2pi
+bs2po
+bs2ta
+bs2tá
+bs2ti
+bs2tí
+bs2tú
+bszá2r1a2da
+bsz2f
+b1sz2k
+bsz2tá
+btermo1
+btermosz2
+bt2rá
+b1t2re
+bt2ré
+b1t2ri
+b1t2ro
+b1t2ró
+1bu
+bu2ch
+2b1udv
+bué2r
+bu2g1i2
+bu2il
+2b1ujj.
+2bujja.
+2bujjad
+buj2j1a2da
+2bujjai
+2bujjak
+2bujjam
+2bujjas
+2bujjat
+2b1ujjá
+2bujjb
+2bujjc
+2bujjd
+2bujje
+2bujjé
+2bujjf
+2bujjg
+2bujjh
+2bujji
+2bujjk
+2bujjl
+2bujjm
+2bujjn
+2b1ujjo
+2bujjp
+2bujjr
+2bujjs
+2bujjt
+2bujju
+2bujjú
+2bujjv
+buk2j1e
+bu2maj
+bu2mel
+bu2m1i2k
+bu2m1ina
+bu2mis
+bu2mol
+2b1ural
+b1urb
+2burn
+2b1u2rú
+bu2se
+bu2sin
+bu2sol
+bu1s2p
+bus3sze
+bu2szab
+busz1aj
+bu2szal
+bu2szas
+bu2sz1ál
+bu2sz1á2rak
+bu2sz1árn
+busz1en
+bu2sz1él
+bu2sz1é2p
+bu2szid
+bu2sz1il
+bu2szim
+bu2szin
+bu2szip
+bu2sziz
+buszí2
+busz1íj
+busz3s
+bu2szü
+1bú
+bú2jí
+2búr.
+2b1ú2ri
+2búrt
+2búsz
+bú2szá
+b1ú2ti
+b1útm
+1bü
+bü2dü
+bü2ge
+bü2gy
+bü2ku
+2b1üld
+bü2l1é2n
+bü2ne
+2bürü
+2b1ü2te
+2b1ü2té
+b1ü2tő
+2b1ü2ve
+bü2ze
+1bű
+bű2na
+bű2ná
+bű2nel
+bű2nem
+bű2nes
+bű2n1e2t
+bűn1n
+bű2no
+bű2nó
+bű2n1ő2
+bű2nu
+bű2nű
+bű2ri
+bű2v1e2
+bű2z1a2
+bű2z1á
+bű2zo
+bű2z1ő
+bű2z3s
+bvá2nyad
+bvá2nyí
+by2te
+2c.
+1ca
+2c1abl
+ca1b2r
+ca2cél
+ca2ch
+ca2dás
+2c1a2dó
+ca2es
+caéne2
+ca1fro
+2c1agg
+ca2gya
+cagy1a2d
+ca2gyu
+2c1ajk
+2c1a2kad
+ca2kác
+ca2k1áz
+2c1akc
+cak2kol
+cak2k1ö
+ca1kri
+cala2g1
+ca2lan
+ca2l1a2s
+2c1albu
+ca2l1este
+ca2l1é2l
+calé2t
+cal1éte
+ca2lim
+ca2l1ip
+cal1osz
+cal1p
+cal1s
+ca2lü
+ca1ly
+ca2nal
+ca2nar
+2c1a2ni
+can2ne
+caó2r
+ca2pó
+ca1p2ró
+ca1p2s
+ca2ran
+ca2rán
+2c1arc
+ca2ris
+ca1s2p
+2c1assz
+cast2
+ca1sto
+ca1str
+2c1aszt
+ca2tau
+ca2tem
+2c1atl
+c1a2uk
+cau2n
+ca2vat
+2c1a2zo
+1cá
+2c1ábr
+cá2ga
+cá2gú
+cá2gy
+cá2la
+c1állá
+2c1álm
+cá2ne
+cá2nét
+cá2nir
+cá3p2a3
+2c1á2po
+2c1á2rad
+2c1á2rak
+cá2r1as
+cá2ria
+cá2riá
+cá2r1i2n
+2cárk
+2c1árp
+2cáru.
+2c1á2ruh
+2cárus
+cá2sás
+2c1á2só
+2c1ásv
+2c1á2szai
+2c1á2szo
+2c1á2t1a2
+c1áth
+2c1á2t1i2
+2c1átm
+2c1átr
+2c1átt
+2c1á2tü
+2c1átv
+cb2lo
+cb2ra
+c2c1a2j
+c2c1ak
+cc1alb
+cc1a2ny
+c2c1a2r
+c2c1au
+c2c1ág
+c2c1ál
+cc1bl
+cc1ef
+c2c1elm
+c2c1ember
+c2c1ép
+c2c1ér.
+c2c1érte
+cc3he
+cc3hí
+c2c3ho
+cc3hő
+cc3hú
+c2c1i2m
+cci2na.
+cc1ing
+cci2óv
+cc1i2pa
+cc1iro
+c2c1i2z
+cc1ír
+cc1kl
+cc1k2r
+cc1oá
+c2c1ov
+cc1ön
+cc1ös
+cc1öz
+cc1pl
+cc1pr
+c2cs
+c3csap
+c3csar
+ccs1as
+c3csat
+ccs1ál
+c3csáp
+ccs1ás
+ccs1átl
+ccs1eg
+ccs1elem
+ccs1ell
+ccs1elv
+ccs1embe
+ccs1eml
+c3csep
+ccs1él
+ccs1érté
+ccs1iv
+c3csop
+ccs1ork
+cc3soro
+ccs1ö2l
+ccs1önt
+ccs1s
+ccs1ut
+c3csú
+c3csű
+cc3sza
+cc3szá
+ccs3zen
+cc3szó
+cc1új
+c2c1üg
+cc1ür
+cc3zá
+cc3ze
+cc3zs
+cda2l1é2
+cda2l1i
+cde2m1e2ké
+cde2m1el
+cd2ra
+cd2rá
+1ce
+cea2l
+ce2at
+ce2au
+ceá2r
+ce2béd
+ce1bl
+ce2ch
+cec3he
+2c1e2dz
+ce2gas
+ce2g1é2k
+cegés3s
+ce2gina
+ce2gor
+ce1g2rá
+ce2gu
+ce2gú
+c1egy.
+c1egyb
+ce2gyen
+c1e2gyi
+c1egym
+c1egyr
+2c1egys
+2c1e2ke.
+ce1kl
+2c1elad
+2c1e2lág
+cel1ér
+2c1elf
+2c1elha
+2c1eljá
+2c1e2los
+c1e2lőa
+2celődöt.
+2c1e2lőf
+2c1e2lőí
+c1e2lőő
+2c1első
+2c1eltá
+c1elto
+2c1elvá
+2c1e2melő
+2c1eml
+cenc1c
+cen2c1eg
+cen2c3s
+2c1eng
+cen2s1ég
+cen2tau
+ceo2l
+ceo2r
+2c1e2pe.
+2c1e2pi
+ce1p2r
+cep2sz1a2
+cep2sz1é2p
+cep2szi
+cep2t1a2
+cep2t1ér.
+cep2tim
+cep2t1ol
+2c1e2rej
+ce2róz
+2c1e2rő
+cer2t1a2
+certá2
+cer2tár
+cer2teg
+cer2t1e2l
+cer2t1emb
+cer2t1est
+cer2tél
+cer2t1én
+cer2t1ol
+cer2t1ö
+cer2tu
+certü2
+cer2t1üz
+ce2sem
+2c1e2sés
+2c1e2ső
+ces2t1é2j
+ces2t1ék
+ce1stra
+ce2t1e2g
+ce2t1essz
+ce2t1esz
+ce2t1é2t
+2ceth
+cet1ill
+ce2t1i2n
+ce2tiz
+2cetn
+2ceton
+ce1t2ra
+ce2t1us
+ce2tűd
+cetű2z
+ceü2t
+ce2vés
+ce2vő
+2c1e2zer
+2cezrede
+1cé
+2c1ébr
+cé2dél
+cé2g1a2
+cé2g1á2
+cé2g1eg
+cé2g1e2l
+cé2ge2r
+cég1ere
+cég1eré
+cé2g1esem
+cé2geté
+cé2gető
+cé2g1ék
+cé2gép
+2c1é2gés
+cég1g
+cé2g1i2d
+cég1iga
+cé2gigé
+cé2gim
+cé2gir
+cé2g1iz
+cégo2
+cé2g1ok
+cé2gol
+cé2gó
+cé2gö
+cé2g1u2
+cé2gú
+céha2
+cé2hal
+cé2han
+cé2har
+cé2hed
+cé2h1e2g
+cé2hir
+cé2hu
+cé2hú
+2c1éks
+cé2la
+cél1a2n
+cé3lap
+cél1a2r
+cé2láb
+cé2lál
+cé2l1á2r
+cé2l1á2t
+cé2le.
+cé2led
+cé2leg
+cé2lei
+cé2lek
+cé2l1e2l
+cé2lem
+cél1emb
+cé2len
+cé2l1er
+cé2l1e2s
+2c1é2let
+2c1é2lez
+cé2léb
+cé2l1é2k
+cé2lénk
+cé2lép
+cé2lére
+cé2lés
+cé2lim
+cé2lin
+cé2lir
+cé2l1is
+cé2liz
+cé2lí
+cé2ló
+cé2l1ö2
+cé2l1ő2
+célt2
+cél1tr
+célu2
+cé2l1ut
+cé2lü
+2c1é2lű
+cé2pí
+cé2pü
+cé2rag
+2c1érd
+2c1é2rés
+cé2rin
+2c1érint
+cé2ris
+cér1s
+2c1érté
+2c1értő.
+cé2rú
+2c1érz
+cés3s
+2c1észh
+2c1étk
+2c1étt
+2c1év.
+2c1évad
+2c1é2ve.
+2cévei
+2c1é2vek
+2c1é2ven
+2c1é2ves
+2c1é2vet
+2c1é2vét
+cé2vi.
+2c1évn
+2c1é2vü
+cf2ló
+cf2ra
+cf2ri
+cf2ro
+cg2ra
+cg2ri
+c2h
+1cha
+c3had
+2c3haj
+2cham
+2chang
+2c3harc
+2charm
+2chatá
+2c3hav
+1chá
+2c3hám
+c3hány
+c3ház
+ch1bl
+1che
+2c3heg
+2chev
+2c3hez
+1ché
+1chi
+2c3hib
+2c3hió
+2chitel
+2chitet
+c3hiú
+1chí
+1cho
+cho1d2
+2c3hor
+2c3hoss
+1chó
+1chö
+1chő
+ch1pr
+ch1sc
+ch1sp
+1chu
+chu2r
+2c3huz
+1chú
+1chü
+1chű
+1ci
+ci2aa
+ci2aá
+cia1b2
+ci2aba
+ci2abo
+ci2abr
+ci2ac
+ci2a1d2
+ci2ae
+ci2aé
+cia1f
+cia2fag
+ci2afr
+ci2a1g2
+ci2ah
+ci2aik
+ci2aí
+ci2aj
+ci2akar
+ci2akas
+ci2akén.
+ci2akó
+ci2ala
+ci2alá
+ci2ale
+ci2alé
+ci2alo
+ci2am
+ci2any
+ci2ao
+ci2aó
+ci2aö
+ci2aő
+ci2a1p2
+ci2ar
+ci2asza
+ci2aszá
+ci2aszé
+ci2aszo
+ci2aszó
+cia1t2
+ci2ata
+ci2atá
+ci2até
+ci2ato
+ci2atű
+ci2au2
+ci2aú
+ci2aü
+ci2aű
+ci2av
+ci2az
+ciá2lan
+ciá2nár
+ci2áó
+2c1i2deg
+ci2deo
+2c1i2dé
+2c1i2dom
+2c1i2dő
+cie2r
+2c1ifj
+2c1i2ga.
+2c1i2gaz
+ci2ge.
+ci1g2r
+ci2ker
+cikka2
+cik2kaj
+cik2kan
+cik2k1o
+ci1k2la
+2c1ikrá
+ci2l1á2t
+2cillu
+ci2mit
+2cimpu
+ci2n1al
+ci2n1árt
+cin1d2
+ci2n1e2re
+2cinf
+2c1inge
+2c1ingr
+ci2nim
+cin2kac
+cin2k1a2l
+cin2kért
+cin2kol
+cin2kors
+cin2kö
+ci2nö
+cin2tar
+cin2t1es
+cinus1s
+ci2nü
+2c1inv
+ci2od
+ci2of
+ci2og
+cio1gra
+ci2oi
+ci2ol
+ci3olo
+2c1i2onn
+ci2op
+cio2v
+ci2óa
+ci2óá
+ci2óc
+ci2ódar
+ci2óe
+ci2óg
+ci2óí
+ci2ókal
+ci2ókam
+ci2óká
+ci2óke
+ci2ó1kl
+ci2ókom
+ci2ókos
+ci2óku
+ci2ól
+ci2ómag
+ci2ómá
+ci2óné
+ci2óo
+ci2óó
+ci2óö
+ci2óő
+ci2ó1p
+ci2ósá
+ci2óse
+ció2s1ér
+ci2ó1s2ká
+ci2ószo
+ci2ótá
+ci2óú
+ci2óü
+ci2ózón
+ciő2r
+ci2rat
+2c1i2rán
+2c1i2rod
+2c1irt
+ci2si.
+2c1isko
+2c1ism
+2c1isp
+ci1stad
+ci2sz1i
+ci2t1aj
+citá2r
+cit1ár.
+cit1ára
+cit1áré
+cit1áro
+cit1érr
+ci2tik
+ci2t1ol
+ci1ty
+ciumi2
+ciu2min
+ciu2m1io
+ciumköz1
+ciu2t
+2c1i2vad
+2c1i2vás
+1cí
+cí2ja
+cí2jé
+cí2m1a2
+cí2m1á
+cí2m1e2l
+cí2m1é2l
+cí2mí
+cí2mo
+cí2mö
+cí2mő
+cí2mu
+cí2rá
+cí2ró
+cí2vá
+cí2ve
+cí2vé
+cí2zs
+cí2zü
+ckaka2
+c2k1alj
+c2k1arc
+cka2rom
+c2k1ág
+ck1áll
+c2k1árn
+c2k1e2g
+cke1p
+1cker.
+1ckerk
+1ckern
+cké2p1e2l
+c2k1é2ré
+c2k1érl
+c2k1érté
+ck1fl
+ck1fr
+ck1ill
+c2k1íz
+ck1kl
+ck1k2r
+ck2lu
+c2k1o2la
+ck1o2pe
+c2k1orro
+c2korru
+c2korrú
+1c2kosak
+c2k1ou
+c2k1öb
+ck1öss
+ck2reá
+c1k2ri
+c1k2rí
+ck1sp
+c2k1üg
+ck1ült
+c2k1üt
+c2k1ü2v
+ck1űr
+ck2va
+cli2s
+clu2b1a
+cmelo1
+cnya2k
+cnyol2c1an
+1co
+co2at
+co2áz
+co2be
+co2eu
+co2kar
+co2ká
+co2ke
+co2kél
+co2kép
+2c1o2kí
+2c1o2laj
+co2l1áro
+2c1olda
+2c1oldá
+2c1oldó
+co2le
+co2l1ibr
+co2li2m
+col1ima
+co2l1i2na.
+co2l1ind
+co2l1ing
+co2l1inu
+co2l1o2r
+2colvad
+2colvas
+comba2
+com2bal
+com2b1e2
+com2biz
+com2bol
+com2bór
+com2bö
+2c1oml
+co2ol
+2c1o2pe
+cop2f1ő
+co1py
+2c1orc
+2c1o2ri
+2c1orm
+c1o2rom
+2c1orro
+2c1orrú
+2corv
+2c1oskol
+co2s1o2ku
+cos3s
+cos3zs
+2c1oszt
+co2ul
+co2un
+co2uv
+co2vi
+1có
+c1ó2ni
+2c1ó2rá
+c1ó2ri
+có2vó
+1cö
+c1öltö
+c1ösv
+c1ösz
+c1ötb
+c1ö2t1e
+c1ö2té
+c1ötf
+c1öth
+c1ö2ti
+c1ötk
+c1ötm
+c1ötn
+c1ötr
+c1öts
+c1ött
+c1ö2tü
+c1öv.
+cö2zö
+1cő
+cő2rü
+cp2la
+cp2ra
+cp2re
+cp2ré
+cp2ri
+cp2ro
+cp2ró
+c2s
+1csa
+2csabl
+2cs1a2dat
+2cs1a2dá
+2cs1a2dó
+2cs1akc
+csa2lakj
+csa2lapú
+2csaláí
+2csalát
+2csalb
+2cs1alg
+2cs1alk
+cs1alle
+2cs1alm
+csa2lomb
+cs1amb
+2csant
+csa2pál
+2csapka
+2csapká
+csa2por
+2csapóká
+2csapókr
+2csapósab
+2cs1arc
+2csarg
+2csark
+2cs1arz
+2cs1ass
+csa2t1ó2r
+csavar1a2
+cs1azo
+1csá
+csá2be
+2csáf
+2cság
+cs1á2gak
+cs1á2gu
+2cs1árad
+2cs1á2rak
+2csáram
+2csárat
+csá2rát
+2cs1árny
+cs1á2ruk
+2cs1ásá
+2c3sási
+2cs1ásó
+2csátásás
+2csátf
+2csátm
+2csátr
+2csáv.
+2c3sávo
+cs1bl
+cs1br
+cs1d2r
+1cse
+2csebé
+cs1e2ce
+cse2csa
+2cs1e2dé
+2cs1edz
+cs1eff
+cs1e2ges
+2csegí
+2cs1e2ke.
+2cself
+2csellá
+2cselőí
+2cselta
+2cseltá
+2cselv.
+2c3sely
+2cs1ember
+2cs1e2mel
+2cseml
+2csemu
+csen2d1ő2
+cse2nis
+cse2n3yen
+2csenz
+cse1p2ré
+cse2rál
+cse2r1e2ped
+2cseró
+2cserő
+2cseső
+2cseszm
+cse2tüz
+2csevő
+2cs1ex
+1csé
+2cség
+c3ség.
+c3ségb
+c3ségg
+c3ségh
+c3ségi
+c3ségn
+c3ségr
+2cséhes
+2cséhs
+2cs1é2ka
+2cséks
+2cs1éle
+csé2m1a
+2csénekb
+2cséneke
+2cséneké
+2csénekk
+2csénekr
+2cséneks
+2csénekt
+2csénekü
+2csépí
+2csépü
+2csérde
+csé2résk
+2c3sérv.
+2csérvb
+2csérvh
+2csérvr
+2csérvv
+2csérz
+csé2sza
+csé2tab
+2csév.
+2csévek
+2csévn
+2csévr
+2csévv
+cs1fr
+cs1gl
+cs1gr
+1csi
+csiá2
+2csidő
+2csigé
+2csimí
+2csimog
+2csimpo
+2cs1i2na.
+2csinas
+2cs1ind
+2cs1inp
+2cs1inv
+2csiono
+2csipí
+2csiví
+2csivó
+1csí
+2csíki
+2c3sírb
+2c3sírj
+cs1í2ró
+2cs1í2v
+2csíze
+2csízl
+cs1ízn
+2csízt
+cs1ízü
+cska1s
+cskasz2
+cs1kl
+cs1kv
+c3slág
+1cso
+2cs1o2á
+2csobj
+cso2k1á
+2csokk.
+2csokoz
+2csolaj
+2csolda
+2csoldá
+2csoldó.
+2csoldók
+2csoldóm
+2csoldón
+2csoldór
+2csoldót
+2csoldóv
+2cs1oli
+2csolló
+2csolvas
+cso2mor
+cson2t1a2
+2csopc
+2cs1orc
+2csori
+2csork
+2c3sorv
+2csoszl
+2csoszt
+1csó
+cs1ódá
+csó2kes
+csó2k1ö2
+2cs1óné
+1csö
+2csökrü
+cs1öml
+csön3n
+2csör.
+c3söre
+2csössz
+2csöv.
+2csözön
+1cső
+3cső.
+3csőb
+csőé2h
+2csőrz
+cső2sz1á2ra
+cső2szék
+cső2sző
+3csőv
+c3s2pek
+cs1p2l
+csp2r
+cs1ps
+cs1sl
+cs1s2p
+cs1s2t
+cs3sz2
+cssza2kü
+c3s2tab
+cs2top
+cst2r
+c3stru
+1csu
+2csudv
+2csug
+2c3suho
+cs1ujj
+2cs1una
+2csuni
+2cs1ura
+2cs1u2rá
+cs1u2tas
+2cs1utá
+cs1utó
+1csú
+csú1p2
+2csútn
+1csü
+2csüd
+2csügé
+2csügy
+2cs1ünn
+cs1ü2te
+2c3süv
+2cs1üz
+1csű
+c4s3zac
+cs3zaj
+csza2ké
+cs3zam
+c3szál
+c3szám
+cs3záp
+cs3zát
+c3száz
+c3sz2c
+c3szer
+c3szé
+c3sz2f
+c3szi
+c3szí
+c3sz2l
+c3szob
+cs3zokn
+c3szol
+cs3zon
+c3szor
+cs3zón
+c3sző
+cs3zs
+csz2t
+cs3zug
+cs3zú
+c3szü
+c3szű
+c3sz2v
+ct2ra
+ct2re
+ct2ré
+ct2ri
+ct2ro
+ct2rü
+1cu
+cucci2
+cuc2cin
+cuko2r1a
+cula2te
+cu2lü
+2c1und
+2c1u2no
+2c1u2ra
+2c1u2tá
+1cú
+cú2jí
+c1úr.
+c1úrr
+c1ú2ti
+cú2to
+1cü
+cü2ge
+cü2gy
+2c1ü2lé
+cü2lő
+c1ünn
+cü2re
+cü2rí
+cü2rü
+cü2te
+cü2té
+cü2tő
+cü2ve
+cü2ze
+1cű
+cű2ző
+cva2nem
+cva2név
+cve2név
+cven3n
+c2z
+1cza
+cza2ib
+cza2ié
+cza2ih
+cza2ik
+cza2in
+cza2ir
+cza2it
+cza2iv
+1czá
+1cze
+2c3zen
+1czé
+c3zéh
+1czi
+1czí
+1czo
+1czó
+1czö
+1cző
+1czu
+1czú
+1czü
+1czű
+1czy
+2d.
+1da
+daa2d
+daát1
+2d1abla
+da2c1ir
+da2cz
+da2dag
+dad1ala
+2dadato
+2d1a2dó
+da1drá
+da1dro
+dae2r
+daé2d
+daé2r
+da1f2l
+da1f2r
+da2g1el
+dag3g
+2d1ahh
+da2ire
+2d1a2ján
+2d1ajt
+2d1a2kad
+daká2r
+2d1akkora
+d1akku
+da1kl
+da1k2ré
+da1k2ri
+2d1aktu
+dal1a2ga
+dal1ajt
+da2lakj
+da2l1akta
+da2l1aktá
+da2laku
+da2lakú
+2d1alakz
+da2l1a2l
+da2lapc
+da2lapk
+da2lapn
+da2lapr
+da2l1aps
+da2lapt
+2d1a2lapú
+da2lar
+da2l1asz
+da2latt
+da2l1á2g
+da2l1ál
+dal1á2rak
+dal1árá
+da2l1árb
+da2l1árn
+da2l1árr
+dal1á2sz
+da2l1áti
+dale2l
+dal1elá
+dal1ele
+dal1ell
+dal1e2sé
+dalé2ke2
+dal1él.
+da2l1é2ne
+da2l1ér.
+dal1f2
+da2lid
+da2l1i2ko
+da2l1ikr
+da2l1i2m
+da2l1i2nát
+da2lind
+da2l1inf
+da2l1ing
+da2l1inj
+da2l1int
+da2l1i2nu
+da2l1itt
+dali2z
+dal1izo
+2d1alji
+dal3l
+2d1allo
+dalo2m1e
+dalomo2
+da2l1or
+da2lőr
+dal1p2
+dal1ud
+da2l1ur
+da2l1u2s
+da2l1u2t
+dalú2t
+da2l1úto
+dal1útr
+da2lü
+2d1amc
+2d1amf
+2d1a2nal
+2d1ang
+d1a2nyag
+2d1a2nyó
+dao2k
+daó2r
+daó2v
+2d1a2pa.
+2d1a2pai
+da2paké
+da2páb
+da2pád
+da2páé
+da2páh
+da2pái
+da2pák
+da2pám
+da2pát
+da2páv
+2d1apj
+da1p2l
+da2pó.
+2d1app
+da1pro
+da1p2s
+2dapt
+dara2be
+da2r1a2dó
+dar1ala
+da2rant
+da2r1azo
+da2r1áta
+da2r1átf
+dar2c1e2
+dar2c3h
+dar2cso
+2d1arcú
+dar2d1a2l
+dar2d1á
+dar2del
+dar2d1es
+dar2d1ó2
+da2r1el
+da2r1il
+darus3s
+dar1uta
+da2r1ü
+da2sál
+da1s2l
+da1spe
+2d1assz
+da1s2ta
+da1szl
+daszt2
+dasz2tá
+2daszú
+da2t1akt
+da2t1akv
+da2t1a2la
+da2t1alk
+dat1apu
+dat1ará
+dat1ass
+da2t1att
+da2taz
+da2t1áll
+da2t1árad
+datá2ramm
+datá2ramr
+da2t1áta
+da2t1átá
+da2telem
+dat1e2l1é
+dat1elí
+da2t1elk
+dat1ell
+da2t1elő
+dat1elt
+da2t1é2g
+da2térte
+da2t1érté
+da2t1érth
+da2t1érv
+da2tid
+dati2k
+da2t1iko
+da2tim
+da2t1inf
+dat1inte
+dat1ist
+da2tiz
+da2t1ír
+dat1íve
+dat1k2
+2d1atlas
+da2t1osz
+da2tóc
+2datóm
+da2t1ó2r
+dató2s
+dat1ósá
+dat1t2
+da2t1u2t
+da2tút
+da2tűr
+da2tya
+da2tyá
+2d1a2uk
+da2up
+2d1a2ur
+dau2s
+dau2ta
+da3u2tóp
+daü2t
+daü2z
+2d1a2vat
+2d1avv
+da1ye
+da1yé
+2d1az.
+da2zál
+2d1a2zé
+da2zok
+da2zon
+1dá
+2d1á2bé
+2d1ábr
+dá2c3ho
+dá2fá
+dá2ga
+dá2gá
+dá2gú
+2d1á2gy
+dá2lál
+dá2lár
+dá2l1e
+2d1állí
+dá2lü
+dá2ly1a2n
+dályú2
+dá2ly1ús
+dámu2
+dá2m1ut
+dá2m1ú
+dá2ny1a2d
+dá2ny1al
+dá2ny1a2n
+dá2nyaz
+dá2nyó
+dá2po
+2d1á2rad
+dá2r1ag
+2d1á2rai
+dá2r1a2j
+dá2ral
+2d1á2ram
+dá2r1a2n
+dá2r1a2p
+dá2rar
+dá2ras
+dár1ass
+dá2rat
+dár1atk
+dá2rá
+dár1ál
+dá2r1e2
+dá2réb
+2d1á2ria.
+dá2rij
+dá2ril
+dá2r1i2p
+dár1isk
+dár1ism
+dá2rí
+dá2rod
+dá2r1ond
+dá2r1ot
+dá2rö
+dá2rő
+dár1s2
+dárt2
+dár1tr
+2dáru.
+dá2ruk
+dáru2s1ág.
+dáru2s1á2ga
+dá2rú2
+2d1árú.
+dá2rü
+dá2rű
+dá2s1a2d
+dá2sal
+dá2sar
+dá2s1á2g
+dá2s1árad
+dá2s1árh
+dá2s1á2ru
+d1á2sás
+dását1a2
+dá2s1e2
+dásfé2l1é2v
+dá2sim
+dá2sis
+dá2sol
+dá2sor
+dá2só2
+dás1ór
+dá2sö
+dá2ső
+dást2
+dás1tr
+dá2sut
+dá2s1ü2
+dá2szag
+dá2szaka
+dá2szal
+dá2szar
+dá2szav
+dá2sz1ál
+dá2szárk
+dá2sz1á2ro
+dá2sze
+dász1el
+dász1em
+dász1er
+dá2széb
+dá2szip
+dá2szir
+dá2szis
+dá2sz1í2
+2dászkái
+dá2sz1ö
+dá2sző
+dász3s
+dá2sz1us
+dá2sz1ú
+dá2sz1ü2
+dá2sz1ű
+2d1á2ta
+dát1al
+2d1á2tá
+2d1átd
+dá2t1e2
+2d1á2té
+2d1átf
+2d1á2tí
+2d1átj
+2d1átk
+2d1átm
+2d1átr
+3dátu
+2d1á2tú
+2d1átv
+dba2l1
+db2lo
+db2lú
+db2ro
+db2ró
+dc2lu
+dcsa2p1á2g
+dd1elh
+d2d1i2d
+ddí2s
+d2d1o2d
+dd2rá
+dd2ró
+d2dz
+d3dzs
+1de
+de2aa
+de2aá
+de2ac
+dea2d
+de2ae
+de2aé
+de2agy
+de2ah
+de2aí
+de2ala
+de2alá
+de2alo
+de2am
+dea2n
+de2ao
+de2ap
+dea1sz2
+de2aszf
+de2at
+2d1e2bé
+ded1ell
+2d1e2dén
+de2d1ó2v
+de1dra
+de2d1ú2
+2d1e2dz
+de2ep
+dee2s
+deé2r
+2d1eff
+de1fr
+de2g1a2l
+de2g1a2n
+de2g1ál
+de2g1e2l
+degen3n
+de2ger
+de2g1ék
+deg1éri
+de2gés
+deg1éss
+degész1
+deg3g
+de2giz
+2dego
+de2gor
+degö2
+de2g1öl
+de2gör
+de2g1ös
+2de2gő
+2d1e2gye
+degyez1
+2degz
+2d1ehh
+deho2g
+de2if
+dei2g
+deí2r
+de2k1a2k
+de2kaz
+de2k1e2g
+de2kellen
+de2kep
+dek1e2rő
+de2k1esz
+dek1ékb
+dek1é2ke
+de2k1él
+de2k1éri
+de2kérte
+de2k1érté
+de2k1érv
+de2k1érz
+de1klu
+dek1old
+dek1s
+deksz2
+2d1elad
+de2lef
+2d1e2legy
+dele2m1a
+dele2má
+dele2meg
+de2lemek
+dele2mel
+delem1ele
+dele2mu
+2d1e2lemű
+2d1e2lemz
+dele2t1a2
+2d1eleteté
+2d1e2l1é2k
+2d1e2lél
+delés3s
+2d1elha
+2d1elho
+2delkezdé
+2delkezdő
+del2lal
+del2l1an
+del2l1e2g
+delle2l
+del2l1ele
+del2lelk
+2dellená
+2d1ellene
+del2l1ent
+del2ler
+del2l1é2j
+del2l1é2k
+del2l1in
+del2l1is
+del2los
+del2lór
+del2lőr
+2d1elma
+2d1elnö
+de2los
+2delö
+de2löl
+de2lőad
+2d1e2lőka
+2delőrej
+2d1elsa
+2d1eltett.
+2d1eltér
+2d1elv.
+2d1elvá
+2d1elves
+2d1elvo
+2d1elvű.
+2d1elvűe
+2d1elvűk
+2d1elvűn
+2d1elvűr
+2d1elvűs
+2d1elvűt
+2d1elvűv
+de2mad
+de2m1a2l
+de2maz
+de2m1ál
+de2mez
+de2m1é2rem
+de2m1érm
+de2mim
+dem1ing
+2demoi
+dem1p
+de2mus
+demü2l
+de2nal
+2d1e2ner
+denkié2ne
+de2nol
+de2n1ó2
+dens1s
+de2od
+de2of
+de2o1g2
+de2oj
+de2olo
+de2om
+de2ot
+de2pe.
+2d1e2pé
+de1p2re
+de1pro
+de1p2s
+de2rad
+der1aka
+de2rala
+de2r1a2n
+de2r1ar
+de2r1á2g
+de2r1á2r
+de2rás
+der1ázt
+2derdő
+dere2c
+2deredm
+2d1e2reje
+2derején
+2derejér
+2d1e2rejét
+de2r1e2kei
+der1e2le
+der1ell
+der1e2lő
+der1elt
+de2rer
+de2r1e2ső
+de2r1él
+de2rid
+de2r1il
+de2r1i2m
+de2r1in
+de2r1i2p
+de2r1i2s
+der2nék
+de2r1osz
+de2r1ó2r
+de2rő
+d1erő.
+der1ős.
+d1erőt
+d1erőv
+der1sp
+deru2
+de2rut
+de2r1ü2g
+de2r1üld
+der1üle
+der1ültet
+dervis1s
+2de2s1a2
+2desg
+de2sip
+2deskü
+2destes
+de1sto
+de2sur
+desú2
+de2s1úr
+2d1eszm
+de1sz2ta
+de2szű.
+de2t1ék
+de2tika
+de2tiká
+2d1e2vő
+2d1evv
+de2xa
+dexi2
+de2xin
+de2xiz
+de2xí
+de2x1o
+de2xö
+2deza
+de2zak
+de2zér
+de2zil
+de2zin
+de2z1or
+dezőe2
+dezőkész1
+2d1ezr
+1dé
+2d1ébr
+dé2dap
+dé2d1ő
+dé2du
+dé1fl
+dé2g1a2
+dé2g1á2
+dé2g1e2b
+dé2g1eg
+dé2gép
+dé2g1érk
+dé2gés
+dég1ész
+dég3g
+dég1iga
+dé2gigé
+dé2gin
+dé2gí
+dé2g1ok
+dé2got
+dé2gó
+dég1s
+dé2g1u2
+dé2gú
+dé2gű
+2d1é2hes
+2d1éhs
+2d1éj.
+2d1éjb
+dé2k1ab
+dé2kac
+dé2k1a2d
+dé2k1a2l
+dé2k1a2n
+dé2k1ap
+dé2k1as
+dé2k1au
+dé2kaz
+dé2k1ág
+dé2k1árt
+dé2kás
+dékát1a2
+dé2k1e2g
+déke2l
+dé2k1ele
+dék1ell
+dék1elő
+dé2k1elt
+dé2k1er
+dé2k1esz
+dé2k1eti
+dé2kez
+dé2k1é2j
+dé2k1é2k
+dé2k1é2l
+dé2k1ér.
+dé2k1éte
+dék1isz
+dé2kivá
+dé2kí
+dékkulcs1
+dé2k1old
+dé2kop
+dé2k1or
+dé2k1osz
+dékó2
+dé2kór
+dé2k1ö2v
+dé2köz
+dé2kő
+dék2rém
+dé2k1ut
+dé2lad
+dé2lam
+dé2l1á2
+dé2leg
+dé2le2l
+dél1elő
+dé2les
+dél1est
+2d1é2let
+dé2lim
+dé2lio
+délkö2z1ön
+dé2lo
+dé2l1ö2
+2d1é2lő
+dé2l1u2
+dé2lük
+dé2lyö
+dé2m1e2l
+dé2m1e2m
+déna2
+dén1ac
+dénár1a2
+2d1é2neke
+dé2ny1el
+dé2nyid
+dé2nyo
+dé2nyö
+dép2i
+2d1é2pí
+2d1é2pü
+dé2rag
+dé2ral
+dé2r1an
+dé2rar
+dé2ras
+dé2rá
+dér1d2
+dé2reg
+dér1eml
+dér1esé
+dé2r1est
+dé2rez
+dé2rés
+dé2rif
+dé2r1ik
+dé2rí
+dé2rot
+déró2
+dé2rór
+dé2rö
+2d1érté
+2d1érth
+dé2r1út
+dé1ry
+2d1érzé
+désa2
+dé2s1aj
+dé2sal
+dé2sap
+dé2sar
+dé2s1az
+désá2
+dé2s1ár
+dé2seg
+dé2s1e2l
+dé2s1eti
+dé2s1ég
+dé2sí
+dé2sú
+dé2s1ü2t
+dész1ak
+dé2s3zá
+dé2sz1ék
+dé2szév
+dé2sz1o
+dé2szú
+dé2t1as
+dé2t1e2g
+dé2t1is
+2d1étke
+dé2tőr
+2d1év.
+2d1évb
+2d1é2ve.
+2dévei
+2d1é2vek
+2d1é2vem
+2d1é2ven
+2d1é2ves.
+2dévesb
+2d1é2vesek
+2d1é2vesen
+2d1é2vesh
+2dévesi
+2dévesk
+2d1é2vesn
+2dévesr
+2d1é2vess
+2d1é2vet
+2d1évez
+2d1é2véb
+2d1é2véi
+2dévén
+2dévér
+2d1é2vét
+2d1é2vév
+2d1évf
+2d1évh
+2d1é2vi
+2d1évk
+2d1évn
+2d1évr
+2d1évs
+2d1évt
+2d1é2vu
+2d1é2vü
+2d1évv
+2d1évz
+dfé2nyem
+df2lo
+df2ló
+df2rá
+df2re
+df2ri
+df2ro
+df2rö
+dgá2zár
+dgázát1
+dgá2zi
+dgá2zó
+d2ge.
+dg2le
+dg2li
+dg2ló
+dg2ra
+dg2rá
+dg2ró
+d2gyu
+d2hali
+dhan2g1e
+dhé2t1
+d2hi.
+d2hié
+d2hih
+d2hii
+d2hij
+d2hik
+d2hir
+dhú2s1á2
+1di
+di2aa
+di2aá
+dia1b
+di2abá
+di2abi
+di2abr
+di2ac
+dia1d2
+dia3da
+di2adi
+di2ado
+di2ae
+di2aé
+di2afa
+di2agy
+di2ah
+di2ai2k
+di2aí
+di2aj
+di2akép
+di2akol
+di2ala
+di2alá
+di2ali
+di2am
+di2ana
+di2aná
+di2ani
+di2anó
+di2ao
+di2aó
+di2aö
+di2aő
+di2a1p2
+di2ara
+di2asza
+di2aszk
+di2aszó
+di2a1t2
+di2au2
+di2aú
+di2aü
+di2aű
+di2av
+di2az
+diá2k1e
+diá2kol
+dián3n
+di1c2k
+di2cs1aj
+di2cs1e2r
+2d1i2deg
+2didej
+di2deo
+2d1i2dén
+di2d1i2o
+2d1i2dő
+di2eu
+di1fl
+di2ga.
+2d1i2gáná
+di2ge.
+di2g1e2l
+2d1i2gén
+di2gét
+2dijes
+di2kép
+di1k2l
+2d1i2konh
+di1k2ro
+dik1u2ta
+di1k2v
+di2lan
+dile2m
+dilig2
+di2lö
+di2l1ő
+di2lü
+di1ly
+di2ma.
+2d1i2má
+di2mit
+2d1imp
+2d1i2naka
+2dind
+2d1inf
+dinga2
+din2gal
+2d1ingá
+2d1inger
+2d1i2nic
+di2n1ing
+2d1inj
+di2nód
+di2n1óm
+di2n1ó2n
+di2n1ó2r
+2d1inp
+2d1inté
+2d1inv
+di2oa
+di2oi
+di2ok
+di2ol
+di2ome
+di2ov
+di2óa
+di2óá
+di2óe
+di2óg
+di2óí
+di2ókam
+di2óká
+di2ó1kl
+di2ókok
+di2óku
+di2ómé
+di2óo
+di2óó
+di2óö
+di2óő
+di2ó1p2
+di2órá
+di2óri
+dió2si2
+diós1ik
+di3ósor.
+di2óspe
+di2ószű
+di2óu
+di2óú
+di2óü
+2dipar.
+2d1i2pará
+2diparb
+2d1i2pari
+2d1i2paro
+2d1i2rat
+2d1i2rá
+2d1i2rod
+2d1irt
+di2saj
+2d1i2si.
+2d1isko
+2d1ism
+2d1iste
+di2tal
+dit1a2la
+dit1ará
+di2t1e2g
+dit1t2
+di2tü
+diumé2
+diu2m1én
+diu2mil
+diú2t
+di2vad
+2d1i2var
+diva2t1a
+2d1i2zé
+1dí
+dí2gé
+dí2j1áto
+dí2je
+dí2jí
+dí2jö
+dí2jü
+2d1í2rá
+díri2
+dí2rik
+2d1í2ró
+dí2sz1a
+dí2szer
+dí2szö
+dítés3s
+2d1ív.
+2d1í2ve
+2dívn
+2d1í2vü
+2d1í2vű
+dí2zi
+dí2zs
+dí2zü
+dí2zű
+dj2eg
+dje2gya
+dj1is
+djo2n1
+dka2n1á2
+dkia2
+dkie2
+dk2la
+dk2li
+dk2lo
+dk2lu
+dk2rá
+dk2ré
+dk2ri
+dk2ro
+dk2ró
+dk2va
+dk2vi
+dlás3s
+dlá2s3z
+dleí2
+dló1g2
+dlót2
+dlő1kr
+dme2g1ér
+dna2pe
+dné2v1á
+dnö2k1ö2l
+1do
+do2áz
+do2b1ag
+do2b1a2l
+doba2n
+do2b1any
+do2b1ár
+do2bát
+dobe2
+do2b1el
+do2b1ill
+do2bí
+2dobje
+do2boá
+do2b1old
+do2b1or
+do2bö
+do2bü
+do2bű
+2d1o2dú
+do2gar
+dogasz1
+do2gár
+dogás1s
+do2g1ol
+do2gor
+dogos3s
+do1g2rá
+do2gü
+do2kal
+do2kas
+do2káj
+do2k1ál
+do2k1e
+do2k1é2l
+do2kép
+dokkö2
+dok2k1öb
+dok2kő
+do2k1ott
+2d1o2koz
+do2kö
+dokú2t
+dok1úto
+do2kü
+2d1o2laj
+dola2tar
+dola2t1e
+dola2t1ör
+2d1olda
+2d1oldá
+2d1oldo
+2d1oldó
+2d1oltár
+2d1oltás
+2dolvas
+dom1a2cé
+do2m1árb
+do2m1áré
+do2m1árh
+do2m1árj
+do2m1árk
+do2m1árl
+do2m1árn
+do2m1á2ron
+do2m1árr
+do2m1ártó
+dom2ba2l
+dom2bel
+dom2bol
+dom2bón
+do2mel
+2domí
+2doml
+do2m1ond
+do2mő
+2domú
+do2mü
+do2n1ad
+dona2l
+don1ala
+do2n1a2r
+do2n1as
+do2n1ál
+do2n1áta
+do2n1átj
+do2n1áts
+do2n1átv
+don1d2
+do2n1e
+donos1s
+do2n1osz
+do2nö
+don1s
+dont2
+don1tr
+do2nü
+do2nyal
+do2nyar
+do2nye
+do2nyó
+2d1o2pe
+do1p2l
+dor1akn
+do2r1a2l1
+do2r1a2p
+do2r1as
+do2rat
+dor1áll
+do2r1á2lo
+dord2
+dor1dr
+do2r1e2
+do2rid
+do2r1il
+do2r1is
+do2r1ita
+dor1k2
+do2r1okl
+dor1oszt
+do2rö
+do2rő
+2d1orrú
+dors2
+dor1sp
+dor1tró
+dorú2t
+do2rü
+2dorvos
+do2ug
+do2ut
+do2vi
+do1ye
+1dó
+dóa2d
+dóá2g
+dóá2r
+dó1bl
+2dóez
+dó1fl
+dó1f2r
+2dógá
+dó1g2r
+dói2g
+dóí2v
+dó1k2l
+dó1kré
+dó1k2v
+dó2mab
+dó2mak
+dóm1org
+dó2mő
+dóó2r
+dó1p2l
+dó1p2r
+dó2rád
+d1ó2rák
+dó2riá
+dó2sam
+dó2sas
+dó2sel
+3dósi.
+dó2sip
+dó2sis
+dó2sír
+dó1s2ká
+dó1spe
+dó1spi
+dó1s2rá
+dós3s
+dó1stáb
+dó1str
+dó2s1ű2
+dósz2
+dó1szf
+dó1szp
+dó1t2r
+2d1ó2vó
+1dö
+d1öbl
+dö2ga
+dö2gá
+dö2g1el
+dö2gev
+dög3g
+dögna2
+dö2go
+dö2gó
+dög1ö2lő
+dö2g1ő
+dö2gu
+dö2ka
+dö2ká
+dö2k1el
+dö2k1e2r
+dö2kék
+dö2k1ér.
+dö2kí
+2döntöz
+dö2ra
+dö2rá
+dö2ro
+2d1ö2röks
+2d1ösz
+d1ötl
+döt2tért
+dö2ve
+dö2vi
+1dő
+dőa2n
+dőá2g
+dő1bl
+dő1cl
+dő1dra
+dőe2l
+dőe2r
+dőé2l
+dőé2te
+dő1fl
+dő1f2r
+dőgé2p1e2ké
+dő1gr
+dőirá2
+dői2ta
+dő1kl
+dő1kv
+dő2ny1a
+dő2nyele
+dő1pl
+dő1pr
+2dőráb
+2d1őrál
+2d1ő2reb
+dőr1egy
+dőr1ele
+dőr1elő
+2d1ő2rem
+2d1ő2ré.
+2d1ő2réh
+2dőrék
+2d1őrél
+2dőrén
+2d1őrh
+2d1őrif
+2d1ő2ril
+2d1ő2r1in
+2d1ő2rip
+dő2r1is
+2dőrok
+2d1őror
+2dőros
+dő2röd
+dő2r1öz
+2dőrőr
+2dőrun
+2dőrur
+2d1ő2rut
+2d1ő2rü2
+dőr1üg
+dőr1ül
+2d1őrz
+dő2s1érv
+dő1ská
+dő1s2m
+dő1sni
+dőso2d
+dős1odo
+dő1spe
+dő1s2pi
+dő1spó
+dő1s2ta
+dő1sté
+dő1str
+dő1sv
+dő1sz2
+dőt1áll
+dő1t2r
+dp2la
+dp2le
+dp2lé
+dp2ra
+dp2re
+dp2ré
+dp2ri
+dp2rí
+dp2ro
+dp2ró
+dp2sz
+dra1ps
+dravasz1
+drág1g
+drá2sz1ál
+drá2sze
+dráta2
+drá2tal
+drá2t1e2
+drá2t1ér
+dren2d1ő2
+1d2ressz.
+1d2resszb
+1d2ressze
+1d2resszh
+1d2resszk
+1d2resszr
+1d2resszü
+dré2szá
+dro2g1a
+dro2gá
+dro2gen
+drogé2n1i2
+drog3g
+dro2g1ó2
+dro2n1a2
+dro2nyi
+drosz2
+dro1szf
+dro1t2r
+dró2baj
+dró2t1a2
+dró2t1á2
+dró2tis
+dró2t1ü2
+d2rui
+dru2se
+dru2si
+dság1g
+dsé2g1el
+dsé2gül
+ds2ká
+ds2li
+ds2pe
+ds2pi
+ds2po
+ds2rá
+ds2ta
+ds2tá
+ds2tí
+dst2r
+dsza2ké
+dszá2las
+dszáraz1
+dsz2e
+dsze2ra
+dsze2r1á
+dsze2r1elv
+dsze2r1o
+dszert2
+d1sz2l
+d1szn
+d1sz2p
+d1sz2t2
+d1sz2v
+dta2g1a2
+dtalpa2d
+dtal2p1ada
+dtal2p1al
+dta2n1á2s
+d2t1ékn
+d1t2rá
+d1t2ré
+d1t2ri
+d1t2ro
+d1t2róf
+d2t1ül
+1du
+du2cem
+du2c3h
+du2cö
+du2cü
+due2l
+du2gal
+du2g1ár
+2d1ugr
+2duit
+2d1ujj
+dula1k2
+dula2t1í
+du2l1e
+du2lép
+duli2
+du2l1im
+du2l1in
+du2lis
+du2lí
+du2lö
+du2lű
+2d1u2ni
+2d1u2no
+2d1unt
+du2óa
+du2óá
+du2ód
+du2óf
+du2ól
+du2óp
+du2rai
+du2rak
+du2ral
+2d1u2rat
+du2ráb
+du2ráh
+du2rát
+du2ruk
+du2sal
+du2san
+du2sar
+du2s1as
+du2sál
+du2seg
+du2s1érté
+du2sin
+du2s1iv
+du2sol
+du2ső
+du2s1ű
+2duszo
+dus3zs
+du2t1i
+2d1u2to
+du2tó.
+du2tór
+du2tu
+1dú
+dú2ce
+dú2ch
+dú2cse
+dú2c3so
+dúc3sz
+dú1dr
+dú2j1é2
+dú2jí
+dú2r1a2c
+dú2ral
+dú2r1e2
+dú2rén
+2d1ú2ron
+dú2rö
+dú2szá
+dú2szó
+dú2t1a2
+dú2té
+2d1útj
+d1útl
+2d1útn
+dú2ton
+2d1útr
+1dü
+dü2dü
+dü2gy
+dügy1érn
+dü2ha
+dü2há
+dü2hel
+dü2ho
+dü2hő
+dü2két
+dü2lá
+2d1üld
+dü2lep
+dülős2
+2d1ünne
+dü2rí
+dü2te
+dü2té
+dü2tő
+dü2ve
+dü2ze
+dü2zé
+1dű
+dű1pr
+d1űrl
+dű1sz
+dű1tr
+dű2zé
+dű2ző
+dva2raj
+dva2r1e
+dva2r1ó2
+dvá2nyan
+dvá2nyí
+dv1áta
+dv1áte
+dv1ece
+dv1e2leg
+dv1elk
+dven2t1í
+dve2ral
+dve2rár
+dve2rip
+dver1s
+d2v1e2sés
+d2v1e2teté
+dv1élm
+d2v1ép
+d2v1érd
+d2v1é2ri
+d2v1érté
+d2v1érz
+dv1fr
+dvi2csa
+dvi2csá
+d2v1iga
+dvigaz1
+dvitéz1
+dv1or
+dvö2l
+dv1ölő
+dv1ős
+dv1őz
+dv1pr
+dv1un
+dv1ú2t
+d2v1üg
+d2v1ü2z
+d2v1űz
+dwa1yi
+dy1as
+d1yéb
+d1yén
+dy1étő
+d1yév
+dy2jé
+dy2ke
+dyk2k
+dyk2n
+dyk2t
+dy2vé
+d2z
+1dza
+dzaé2
+2d3zaj
+dzak2
+dza1kr
+1dzá
+dzá2r1ó2ra
+dzás1s
+d3zász
+1dze
+1dzé
+dzé2sa
+1dzi
+2d3zil
+1dzí
+1dzo
+1dzó
+1dzö
+1dző
+dzőa2
+2dzőbő
+2dződ
+2dzőj
+2dzőné
+2dzőr
+1dzsa
+1dzsá
+1dzse
+2dzs1e2g
+2dzs1esz
+1dzsé
+1dzsi
+2dzsir
+2dzs1is
+d3zsiv
+1dzsí
+2dzso2
+dzs1ok
+1dzsó
+1dzsö
+1dzső
+dzs1s
+1dzsu
+1dzsú
+2dzsúj
+1dzsü
+1dzsű
+1dzu
+1dzú
+1dzü
+1dzű
+2e.
+e1a
+ea2bál
+e2abo
+e2abő
+ea2da
+ea2dá
+eadás1s
+ea2dó
+ea1d2r
+ea2du
+eaé2d
+e2afá
+e2afe
+e2afi
+e2afo
+e2afö
+e2afő
+e2afü
+e2afű
+ea2gi
+e2agó
+e2aid
+e2ail
+e2aim
+e2aip
+e2ais
+ea2ja
+e2ak.
+ea2kas
+e2akat
+e2aká
+e2akb
+e2ake
+e2akép
+e2akh
+e2aki
+e2akí
+e2a1kl
+e2ako
+e2akó
+e2akö
+e2a1k2r
+e2akú
+e2akü
+e2alán
+eal1eg
+ea2lu
+e2am.
+e2ama
+e2amá
+e2amel
+e2amer
+e2amé
+e2amin
+ea2mo
+e2amu
+e2amú
+e2amű
+e2ane
+e2ané
+e2anö
+e2ans
+ea2nya
+e2api
+e2apo
+e2apó
+ea1p2ro
+e2ar.
+ea2ran
+ea2ras
+ea2rat
+ea2rá
+e2arb
+e2are
+e2arh
+e2arj
+e2arn
+e2aró
+e2arr
+e2aru
+e2arü
+e2aso
+e2a1st2
+e2asü
+e2asű
+e2aszem
+e2aszé
+e2ata
+e2atá
+e2atc
+e2ate
+ea2t1eg
+e2até2
+ea2tél
+ea2t1éne
+e2atf
+e2atg
+e2ath
+ea2tid
+eat1ing
+ea2tip
+ea2tir
+e2atm
+eatmo1s
+eatmosz2
+e2atn
+e2ato
+ea2t1or
+e2ató
+e2atö
+ea1t2rak
+eat2rón
+e2ats
+e2atu
+e2a2tü
+e2atű
+e2atz
+e2au.
+ea2ut
+e2a2ux
+e2avi
+ea1vy
+ea2zo
+e1á
+eá2bé
+eá2cs
+eá2ga
+eá2gá
+eá2gi
+eá2go
+eá2gu
+eá2gy
+eá2hí
+eá2k1e
+eá2k1osk
+eála2
+eá2lad
+eá2l1ak
+eá2lál
+eá2l1á2r
+eá2l1e2
+eálé2
+eá2lél
+eálfe2
+eá2lid
+eá2l1in
+eá2lir
+eá2lism
+eá2lop
+eá2l1ór
+eá2lö
+eá2mu
+eá2nac
+eá2nal
+eá2n1at
+eáná2
+eá2nár
+eá2n1át
+eá2n1e2
+eá2ny1a2l
+eá2ny1a2n
+eá2nyap
+eá2nyar
+eá2ny1as
+eá2nyav
+eá2ny1e2
+eá2nyén
+eá2ny1ér.
+eá2nyif
+eá2ny1ing
+eá2nyis
+eá2ny1o2ku
+eá2nyö
+eá2po
+eá2rad
+eá2ram
+eá2ras
+eá2raz
+eá2ru
+eá2rú
+eá2sa
+eá2sá
+eá2sí
+eá2só
+eá2su
+eá2sz
+eáta2
+eá2t1e2
+eá2té
+eá2tí
+eá2tu
+eá2tü
+e2ba2d
+eb1adó
+eb1adta
+eb1aga
+e2b1ajk
+e2b1a2la
+e2b1alk
+eb1ant
+eb1a2ny
+eb1atl
+e2b1au
+eb1a2zo
+eb1ágg
+e2b1áp
+eb1ára
+ebeá2
+e2b1e2he
+eb1ejt
+ebe2l1á
+e2b1e2lef
+ebe2l1eme
+e2b1elhel
+e2b1enc
+eb1este
+eb1esté
+ebe2szek
+e2b1ex
+e2b1ég
+eb1ép
+e2b1érd
+e2b1érté
+e2b1érz
+eb1gr
+e2b1id
+e2b1i2na
+e2b1inf
+e2b1ing
+e2b1irá
+e2b1i2s
+e2b1izz
+eb1kl
+eb1kr
+eb2lat
+e1b2lú
+eb1okt
+eb1o2la
+eb1orv
+eb1öb
+eb1ös
+eb2rus
+eb1st2
+eb1tr
+e2b1üg
+ebü2l
+eb1ülé
+e2b1ür
+eb1üz
+ec1ajt
+ec1alk
+e2c1a2n
+e2c1az
+ec1ág
+e2c1ál
+ec1ár
+ec1bl
+ec2c1a2
+ec2c1ér
+ec2c3h
+ec2c1i
+eccs1át
+ec3cso
+ec2cú
+e2c1eg
+e2c1elo
+e2c1elv
+2ecento
+e2cetb
+ece2t1o
+1e2cets
+1e2cett
+e2cetü
+ece2tüz
+e2c1evé
+ec3har
+ec3hen
+ec3hi.
+ech1in
+1e2chó
+ech1u
+ec2le
+ec2lu
+e2csad
+e2cs1a2la
+e2cs1a2n
+ecsa2p1á2g
+e2cs1a2pák
+ecs1ará
+ecsá2r
+ecs1árá
+ecs1árb
+ecs1áro
+e2cs1á2t
+e2cs1é2l
+e2cs1ér.
+ecs1érté
+e2cs1ol
+e2cs1öl
+ecs1s
+ecsúszós1
+e2c3sükb
+e2c3süt
+ec3sze
+e2c1ud
+ec3zá
+ec3ze
+e2d1ab
+e2d1a2dá
+ed1a2ny
+e2d1a2z
+e2d1á2c
+e2d1ág
+e2d1áp
+ed1egy
+edeleme2
+e2d1elo
+e2d1eml
+ede2rak
+ede2r1ál
+ede2rel
+ede2r1ék
+ede2r1o
+ede2r1ü2l
+ede2s1o
+ede2tá
+ede2tel
+ede2t1ér.
+e2d1é2j
+edé2ká
+edé2kis
+edé2k1o
+edé2lyá
+edé2lyo
+1e2dénn
+1e2dény
+e2d1ép
+e2d1érd
+edé2sa
+edé2so
+edés3s
+edé2s3z
+ed1é2vén
+ed1é2vér
+ed1gr
+2edic
+e2dide
+e2d1i2ga
+edigaz1
+ed1ill
+e2d1int
+e2d1ira
+ed1iro
+e2d1ír
+ed1ívn
+e2d1íz
+ed1old
+ed1orv
+e2d1os
+e2d1ös
+e2d1őrs
+edő2s1ü
+ed1pl
+ed1pr
+ed2ram
+e1d2rog
+e1d2ró
+e2d1üg
+e2d1üt
+e2d1űz
+ed2v1a2
+edvá2
+ed2v1ár
+ed2vát
+edv1ér.
+ed2v1öz
+edy1i
+e2d3zá
+1e2dzői
+1edzőj
+1edzőr
+1e2dzőv
+1edzv
+e1e
+ee2bé
+ee2cs
+ee2dz
+ee2ge
+ee2gé
+eegész1
+ee2gy
+ee2he
+ee2ke
+e2el.
+ee2la
+ee2le
+e2eléb
+ee2léd
+e2elg
+ee2lo
+ee2lő
+ee2me
+ee3men
+ee2mé
+ee2mu
+e2en.
+e2enb
+e2enj
+e2ent
+e2enw
+ee2ny
+ee2pe
+ee2pé
+ee2po
+ee2re
+ee2ro
+ee2ró
+ee2rő
+ee2sé
+ee2sü
+ee2sz
+ee2te
+e2e1t2h
+ee2to
+ee2ve
+ee2vé
+ee2vi
+ee2vo
+ee2vő
+ee2zü
+e1é
+eé2de
+eé2ge
+eé2gé
+eé2gő
+eé2gü
+eé2he
+eé2je
+eé2jé
+eé2ke
+eé2kí
+eé2le
+eé2lé
+eé2li
+eé2lő
+eélőkész1
+eé2lü
+eé2lű
+eé2me
+eé2ne
+eé2pí
+eépítés1s
+eé2pü
+eé2ré
+eé2ri
+eé2rő
+eé2rü
+eé2sz
+eé2te
+eé2ve
+eé2vé
+eé2vi
+eé2vü
+efa2x1i
+efek2tá
+efek2t1í2
+efenyőé2
+ef2f1in
+ef2f1o
+e1f2la
+efle2x1i2k
+ef2lu
+efo2n1alk
+efo2nik
+eforma2
+efor2m1al
+ef1pl
+e1f2rá
+ef2rö
+e2g1a2bá
+ega2be
+eg1abl
+eg1abr
+e2g1a2cé
+ega2cs
+e2g1a2d
+e2g1a2g
+ega2i
+e2g1a2j
+e2g1a2k
+e3gaké
+ega2lac
+ega2lak
+ega2lan
+eg1a2lap
+e2g1a2lá
+e2g1alh
+e2g1alj
+e2g1alm
+e2g1als
+e2g1alt
+e2g1a2m
+eg1ang
+eg1ann
+eg1ant
+eg1a2ny
+e2g1a2pa
+eg1apá
+ega2po
+eg1a2pó
+e2g1apr
+eg1arc
+ega2ri
+eg1a2ro
+eg1art
+e2g1ass
+e2g1a2sza
+e2g1a2szo
+e2gaszú
+eg1atk
+ega1t2r
+e3g2aty
+e2g1a2u
+eg1a2va
+e3gazol
+ega2zon
+e3gába
+e3gábó
+eg1á2cs
+e2g1áf
+e2g1á2g
+eg1áh
+e3g2ái
+e3gája
+e3gájá
+egá2ju
+egá2m
+e3g2án
+e2g1áp
+e2g1á2rá
+e2g1árb
+e3g2árg
+e2g1árn
+egá2ro
+eg1árt
+egá2ru
+egá2rú
+egá2sa
+e3gát.
+e3g2átu
+e3gáva
+egá2zá
+egá2zi
+egá2zu
+eg1bl
+eg1br
+eg1d2r
+e2g1e2bé
+ege2cs1ö2
+eg1edz
+eg1e2ge
+eg1ehe
+e2g1e2kés
+e2gela
+e3geled
+ege2leg
+ege2lej
+e2gelekt
+eg1e2lemb
+e2g1e2leme
+e2g1e2lemn
+e2g1e2lemr
+e2g1e2lemt
+ege2l1e2s
+eg1elég
+eg1e2lér
+e2g1elf
+e3g2elg
+e2g1elha
+e3g2elit
+e2g1eljá
+e2g1elm
+e3g2elne
+e2g1elo
+e3g2előá
+ege2lőbbe
+e3g2előd
+e3g2előf
+e3g2elői
+e3g2előm
+e3gelőnye
+e2g1eltá
+e3g2eltet
+e3g2eltü
+e2g1elvá
+e2g1elz
+e2gemel
+e3gend
+e3genye
+eg1epe
+eg1epr
+e3gerá
+e2gerd
+1egere.
+e2gered
+1e2gerek
+e2geré
+ege2rény
+eg1erk
+e3gerl
+e2g1eró
+e2g1erő
+eg2esek
+e2g1esete
+e2g1eszk
+e2getal
+eg1e2ve
+e2g1ex
+e2g1é2g
+e3gémb
+e2g1é2neke
+e2g1é2nekk
+egé2ny1e2l
+e2g1épí
+eg1éps
+e2gér.
+e2gérb
+egé2r1es
+egé2re2t
+egér1ete
+egé2rez
+e2géré
+egé2rés
+e2gérg
+e2géri
+egé2ri.
+e2gérk
+e2gérn
+eg1é2rő.
+e2gérr
+e2gérs
+eg1érté
+eg1érth
+e2gértő
+e2gérv
+e2gész
+eg1észl
+1egészs
+eg1éte
+eg1fl
+eg2gim
+eg3gyal
+eg3gyan
+eg3gyás
+eg3gyú
+e3gi.
+eg1ibr
+eg1idd
+eg1i2de
+e3gie
+egi2g
+e3gig.
+e2g1iga
+e2g1igé
+eg1ij
+e2g1i2ko
+eg1ikr
+e2gill
+eg1imb
+e2gimm
+eg1inf
+e2g1ing
+eg1ino
+eg1ins
+e3g2io
+eg1ira
+eg1i2ro
+eg1iss
+eg1ist
+egi2sz
+e2g1i2ta
+e3gitá
+e2g1iva
+e2g1ivá
+e3give
+eg1izé
+eg1izg
+eg1izm
+eg1izz
+e2g1íg
+e2g1ín
+e2g1í2r
+e2g1ív
+e2g1íz
+eg1kl
+eg1kr
+eg1kv
+e2g1ob
+e2goc
+e2g1o2d
+e2goi
+e2g1o2k
+eg1o2la
+e2g1old
+eg1olv
+e3goly
+2egom
+ego2mi
+e2gont
+e2g1op
+eg1org
+e3g2orom
+ego2ros
+e2g1orr
+e2g1orv
+e2g1o2s
+e2g1ot
+e3gó.
+e3g2ób
+egó2do
+e3g2ój
+eg1ó2ra
+eg1órá
+eg1óv
+e2g1öb
+eg1ök
+eg1önt
+eg1örö
+e3görög
+egö2röm
+eg1öt
+eg1öv
+e2g1ö2z
+egőkész1
+e3gőre
+eg1őri
+eg1őrö
+egő2szi
+e3g2őz
+eg1pl
+eg1pr
+eg1ps
+e1g2rat
+e1g2róf
+eg1sk
+eg1sl
+eg1sm
+eg1sp
+eg1s2t
+egsz2
+eg1szt
+eg1tr
+e3g2ub
+eg1ud
+e3g2um
+eg1u2n
+e2g1u2ra.
+e2g1u2rai
+e2g1u2rak
+e2g1u2ras
+e2g1u2rat
+e2g1u2rá
+e3guru
+e2g1u2s
+e2g1u2t
+eg1u2z
+eg1új
+e3g2ún
+eg1úr
+eg1ús
+eg1út
+e2g1üd
+egü2gye
+e2g1ü2le
+eg1ü2li
+e2g1üs
+e2g1üt
+e2g1üv
+e2g1üz
+e2g1űz
+egvárosi2
+e2gy1a2d
+egy1a2g
+e2gy1aj
+egy1akt
+egy1a2la
+e2gy1ará
+e2gy1as
+egy1a2t
+e2gy1au
+egy1az
+e2gy1ál
+egy1á2rá
+egy1árf
+e2gyát
+egy1eleg
+egy1elf
+egy1ell
+egy1elo
+egy1e2lőj
+egy1e2lőv
+egy1elz
+e2gyeni
+1e2gyenl
+1e2gyens
+egy1eszt
+1egyezm
+egy1éks
+1egyéni
+egy1ér.
+e2gyip
+e2gyis
+e2gy1iz
+egy1ok
+e2gy1ol
+egyo2r
+e2gy1os
+egy1ot
+e2gy1ó2r
+egy1ö2l
+e2gy1ös
+e2gy1öz
+egy1ő2r
+egyu2
+egy1ur
+egy1ut
+1együt
+1egzis
+eha2de
+ehá2zal
+eh1ellá
+ehe2lyes
+ehe2rál
+ehe2rát
+ehere2
+ehe2r1el
+ehe2r1em
+ehe2ren
+ehe2res
+ehe2rin
+ehe2rol
+e2h1é2je
+ehé2ná
+ehé2név
+ehé2zá
+ehé2zo
+e2h1ors
+eh1sz
+e1i
+ei2áb
+ei2áh
+ei2áj
+ei2án
+ei2ár
+ei2át
+ei2áv
+e2ibn
+ei2deá
+ei2dei
+ei2deo
+ei2dén
+ei2dom
+ei2dő
+e2idp
+e2ier
+ei2gá
+ei2gé
+e2i1g2n
+ei2gy
+ei2ha
+eil2le.
+ei2ma.
+ei2man
+ei2má
+ei2mit
+e2imk
+e2ims
+e2imz
+ei2na2
+ein1ad
+ei2n1á2
+ei2neg
+e2inér
+e2inét
+ei2n1ita
+ei2nol
+ei2nő
+ein1t2r
+ei2nü
+ei2on
+ei2pa
+ei2ram
+ei2rat
+ei2ri
+ei2rod
+e2iró
+ei2ta
+e2itb
+e2itj
+e2itn
+e2itr
+ei2va
+ei2vá
+ei2vo
+ei2vó
+ei2zé
+e2izmi
+ei2zo
+e1í
+eí2gé
+eí2já
+eí2jú
+eí2ra
+eí2rá
+eí3rásbe
+eí3rásil
+eí3rásoc
+eí3rásonk
+eí2ró.
+eí2róa
+eí2róá
+eí2rób
+eí2ródn
+eí2róf
+eí2róg
+eí2róh
+eí2rói.
+eí2róik
+eí2róin
+eí2róit
+eíróí2
+eí2rója
+eí2rójá
+eí2róje
+eí2róju
+eí2rók
+eí2róm
+eí2rón.
+eí2róna
+eí2róná
+eí2róny
+eí2rór
+eí2rót
+eí2róv
+eí2té
+eí2vá
+eí2ve
+eí2vé
+eí2vi
+eí2vo
+eí2vó
+eí2ze
+eí2zü
+eí2zű
+ej1ab
+e2j1a2d
+ej1a2g
+e2jak
+ej1akk
+ej1a2l
+ej1a2n
+ej1ar
+ej1au
+ej1a2z
+ej1áb
+e2j1á2g
+ej1ál
+e2j1ártó
+ej1á2t1e2
+ej1átv
+ej1bl
+ej1br
+ejcsa2p1
+ej1dr
+eje2c
+e2j1ecse
+e2j1ef
+ej1e2ged
+e2j1e2gé
+e2jekc
+e2j1ela
+e2j1elc
+e2jelede
+e2j1e2lemb
+e2j1e2leme
+ej1e2lemé
+e2j1e2lemn
+e2j1elf
+e2j1elha
+e2j1elhel
+e2j1elo
+ej1elszá
+ej1eltér
+e2j1elu
+e2j1eng
+e2j1enz
+e2j1essz
+eje2sz
+e2j1ex
+e2j1é2j
+e2j1é2k
+e2j1él
+e2j1ép
+e2j1éte
+ej1fr
+ej1g2r
+e2j1i2d
+e2j1im
+ej1ina
+e2j1int
+e2j1ip
+e2j1iz
+ej1íg
+ej1ív
+ej1kl
+ej1kv
+ej2mok
+ej1ol
+ej1op
+ej1óc
+ej1ón
+ejó2sá
+ej1ót
+ej1óv
+e2j1öb
+e2j1öl
+ej1ö2ve.
+e2j1őz
+ej1pl
+ej1pr
+ej1sp
+ej1st2
+ej2tad
+ej2tau
+ej2tál
+ej2tát
+ej2t1elk
+ej2t1este
+ej2tev
+ejté2r
+ejt1éré
+ej2tin
+ej2tiz
+ej2tos
+ej2t1ó2r
+ej2töd
+ej2t1ö2l
+ej2tön
+ej2tös
+ej1tra
+ej1tró
+ej2tür
+ej1új
+ej1úr
+ej1ú2t
+e2j1üg
+e2j1ür
+e2j1ü2t
+e2j1üv
+e2j1üz
+e2k1abl
+ek1a2cé
+ek1a2dá
+e2k1a2dó
+eka2gy
+ek1a2ja
+e2k1ajtó.
+e2k1ajtói
+e2k1ajtók
+e2k1ajtón
+e2k1ajtór
+e2k1ajtót
+ek1a2kar
+e2k1alj
+e2k1a2lo
+ek1alt
+ek1ang
+e2k1ani
+ek1a2nyá
+ek1arc.
+ek1arca
+ek1arcr
+ek1arcú
+eka2sip
+e2k1au
+ek1azo
+e2k1ág
+ek1állo
+ek1álm
+ek1árad
+eká2rai
+ek1á2rak
+ek1áras
+e2k1á2rá
+e2k1árd
+e2k1árf
+e2k1árh
+e2k1árk
+e2k1árm
+e2k1árn
+e2k1á2ron
+e2k1árr
+e2k1á2ru
+e2k1á2rú
+e2k1árv
+ek1ásó
+ek1áta
+ek1átd
+e2k1áth
+ek1átj
+e2k1átm
+ek1á2to
+e2k1átt
+ek1bl
+ek1br
+1ekcém
+ekci2óf
+ek1cl
+ek1dr
+e2k1ebé
+e2k1e2dz
+e2k1egg
+e2k1e2gye
+e2k1e2kébő
+e2k1e2kés
+e2kela
+e2k1e2leg
+eke2leme
+ek1elha
+e2k1elk
+e2kellá
+e2k1elm
+e2k1elo
+e2k1előn
+e2k1elr
+ek1elta
+ekel2t1é2r
+e2k1e2ma
+e2k1e2mel
+ek1e2més
+ek1e2pi
+e2k1estr
+eke2szele
+eke2szo
+e2k1e2vé
+e2k1evi
+1e2kééh
+e2k1ég
+1e2kéik
+ek1ékek
+e2k1ékt
+ek1é2le
+ek1éln
+ek1élő
+e2k1épí
+e2k1érin
+ek1értékb
+eké2rül
+e2k1ész.
+e2k1észh
+e2k1észn
+eké2tel
+e2k1étk
+e2k1étl
+e2k1étt
+e2k1é2ve.
+e2k1é2vek
+ek1é2vet
+e2k1évi
+ek1fr
+ek1gn
+ek1gr
+ekiá2
+ek1i2ga
+ekigaz1
+ek1i2ge
+e2k1igé
+ekii2
+ek1ill
+e2k1ima
+eki2már
+e2k1iná
+ek1ind
+e2k1isk
+ek1ism
+e2k1isp
+ek1i2zo
+e2k1íj
+ek1írá
+ek1íz
+ekka2ró2
+ek2k1ele
+ek2k1elf
+ekk1osz
+ek1kri
+ek2kű
+eklés3s
+ek2lim
+ek3nő
+e2k1oá
+ek1obj
+e2k1odv
+e2k1o2la
+ek1olló
+e2k1olv
+e2k1o2pe
+ekor2da
+ekor2d1á2
+ek1o2rom
+ek1orra
+e2k1orv
+ek1otth
+e2k1ó2h
+ek1ó2ra
+ek1ó2rá
+ekö2k
+e2k1ökö
+e2k1ö2lé
+ek1ö2lő
+e2k1öm
+e2k1önk
+e2k1önt
+ekö2ri
+e2k1örv
+ek1pl
+ek1pr
+ek1ps
+e1k2ram
+e1krétá
+ek2ris
+e1k2rí
+ek2róm
+ek1sl
+ek1sm
+ek1sp
+ek1st
+eksz1al
+ek2szip
+ek2tau
+ek2taz
+ekt1elk
+ek2t1esz
+ek2t1érd
+ek2til
+ek2tim
+ek2t1i2o
+ek2t1ok
+ektus1s
+e2k1ud
+e2k1u2ra
+ek1uro
+e2k1utá
+e2k1utó
+e2k1uz
+e2k1új
+e2k1úr.
+ekú2t
+ek1úto
+ek1útv
+e2k1ünn
+ekü2t
+ek1ütő
+ek1üzl
+e1k2vó
+el1a2ba
+el1abl
+el1a2bort
+e2l1a2c
+e2l1a2d
+el1agg
+el1a2gy
+el1a2j
+e2l1akad
+e2l1a2kas
+el1akc
+e2l1a2l
+el1a2m
+el1ana
+elan2di
+el1a2ne
+el1a2ni
+el1ann
+ela2ny
+el1a2pa
+ela2r
+el1ara
+el1ará
+el1aré
+el1asza
+el1aszi
+el1aszó
+el1aszu
+e2l1a2u
+el1a2va
+el1a2ve
+el1azo
+elá2bé
+el1ág.
+e2l1á2ga
+el1ágg
+el1á2gi
+el1ágn
+el1á2go
+el1á2j
+el1áld
+el1áll
+el1á2lo
+elá2m
+el1ámí
+el2án
+elá2ná
+elá2ne
+elá2nó
+el1á2p
+el1ár.
+el1á2rá
+el1árb
+el1árc
+el1á2re
+el1á2ré
+el1árf
+el1árh
+el1árk
+el1árn
+el1á2ro
+el1árö
+el1árr
+el1árt
+el1á2ru
+el1á2rú
+elá2s
+eláta2
+el1át1e2
+el1átf
+el1átk
+el1átl
+el1átm
+el1átr
+el1ázi
+el1ázo
+el1ázt
+el1bl
+el1br
+2eld.
+el1d2r
+ele1bre
+2eled.
+1e2ledel
+el1eff
+ele2g1e2lé
+el1e2gyene
+e2legyü
+el1egz
+eleí3ran
+ele1k2l
+ele2k1os
+ele1krá
+1elektr
+e2l1elb
+e2l1e2lemb
+e2l1elm
+e2lelőz
+el1elr
+ele2mad
+e2l1ember
+1eleme.
+1e2lemei
+1elemek
+ele2mell
+1e2lemem.
+1e2lememm
+1e2lemes.
+1e2lemesn
+ele2mesz
+ele2mélt
+ele2mérd
+1e2lemük
+1e2lemünk
+1e2lemzé
+1e2lemző
+2elend
+e2lener
+ele2nél
+eleó2
+ele2pal
+ele2pap
+ele2pele
+ele2pell
+ele2p1ő2r
+e2lerd
+el1e2red
+el1e2rei
+el1erj
+e2l1ern
+ele2róz
+ele2sege
+ele2sésb
+ele2sése
+ele2sésé
+ele2sésh
+ele2sési
+ele2sésk
+ele2sésn
+ele2sésr
+ele2séss
+ele2sést
+ele2sésü
+ele2sik.
+e2l1esnén
+ele2sőb
+ele2sős
+e2l1essél
+ele1sta
+ele2szek
+ele2t1e2két
+ele2teti
+ele2tetn
+ele2tető
+ele2t1ék
+ele2tél
+e2l1ették
+eleü2
+1e2l1e2vők
+el1e2xi
+e2lébb
+elé2du
+el1é2ges
+el1é2get
+el1égj
+el1égtek
+el1égv
+el1é2het
+eléka2
+elé2kak
+elé2k1an
+elé2k1á
+elé2k1e2le
+elé2kev
+elé2keze
+elé2kezi
+elé2kezt
+el1ékí
+elé2kö
+elé2ku
+el1él.
+el1éld
+elé2led
+el1é2let
+el1é2lé
+el1élh
+el1é2li
+el1élj
+el1éln
+el1éls
+e2l1élt
+el1é2lü
+e2l1élv
+e2l1é2neke
+e2l1é2nekh
+e2l1é2red
+e2l1é2rem
+elé2rend
+e2l1é2rez
+elé2rét.
+elé2ri.
+e2l1érp
+e2l1érrő
+e2lértel
+e2l1érté
+el1érth
+e2l1értő
+e2l1é2rü
+e2l1érz
+2elésétő
+elé2so
+2elész.
+2elészel
+2elészem
+2elészne
+2elészné
+2elésző
+2elészü
+2elészv
+elé2tel
+e2l1é2tes
+elé2tete
+e2l1étk
+e2l1étt
+e2l1év.
+el1fl
+el1f2r
+el1gl
+1elhap
+el2ib
+el1ideg
+el1idé
+el1i2do
+el1iga
+e2l1igé
+el1ill
+e2l1i2ma
+e2limá
+e2l1imp
+e2l1i2na
+e2l1into
+el1i2on
+eliő2
+e2l1i2p
+e2l1ira
+e2l1i2ro
+e2l1i2si
+e2lism
+el1iss
+el1iste
+eli2tin
+eli2tol
+elitu2
+el1i2vá
+e2l2ix
+el1i2zo
+e2l1íg
+el1í2rá
+el1í2v
+elka2r1á
+1elkezdé
+1elkezdő
+el3ki
+el1k2l
+el1k2r
+el1kv
+el2l1a2dá
+el2l1a2dó
+ell1alk
+el2l1amb
+el2lamp
+ella1t
+el2lau
+el2l1ábr
+el2l1áll
+1ellátáso
+1ellátásü
+1ellátm
+el2lef
+elle2g1ó2
+ell1elké
+el2lelm
+1ellená
+1ellenes
+1ellenf
+1ellenő
+1ellens
+1ellenz
+el2lid
+ell1inf
+ell1ing.
+ell1int
+el2l1or
+ell1osz
+ell1órá
+el2lön
+el2lös
+el2l1űr
+1elmééh
+1elmél
+1elméte
+1elnép
+1elnök
+el1obj
+el1off
+el1oj
+e2l1o2ká
+el1okm
+e2l1o2l
+el1oml
+el1omo
+el1ont
+el1opc
+e2l1ope
+el1oro
+el1orr
+el1os
+e2losz
+e2l1ox
+eló2ig
+eló2in
+e2l1ó2ri
+el1öb
+el1ö2m
+e2l1ön
+e2l1ör
+e2l1ös
+e2l1ö2z
+2előáp
+2előár
+2előbé
+2előbi
+2előbo
+1elődei
+elő2d1í2
+1elődje.
+2elődo
+1elődöt.
+előe2r
+1e2lőfú
+2előfü
+2előfű
+1e2lőhív
+1előhű
+2előib
+2előik
+2előim
+2előiv
+2előja
+2előké.
+2előkért
+1előkése
+1e2lőkést
+2előkl
+2előkő
+2előkt
+2előku
+2előkü
+2előmö
+2előmű
+2előna
+1előnn
+2előnö
+1előny.
+1előnyb
+2előnyer
+1előnyh
+2előnyi
+1előnyk
+1előnyn
+1előnyö
+1előnyr
+1előnyt
+1előnyü
+2előö
+el1őr.
+1e2lőreg
+1előreh
+1előrej
+el1őriz
+el1őrl
+2előro
+e2l1őrü
+2elősá
+2előso
+2elősö
+elő1s2p
+2elősze
+2előszé
+2előszi
+2előszó
+2előtü
+2előü
+2elővis
+2előviz
+1e2lőz.
+e2lőze
+2e3lőzene
+1előzm
+el1p2l
+el1pró
+el1sk
+el1sl
+el1sm
+el1sz2t
+el2t1aj
+eltára2d
+eltár1ada
+2elte.
+el2t1e2rei
+2eltes
+2eltet.
+2eltete
+2elteté
+2elteth
+2elteti
+2eltetj
+2eltetn
+2eltets
+1eltettk
+2eltetü
+2eltetv
+2eltéb
+2eltél
+2eltét
+el1t2ra
+el1trá
+el1tré
+2eltük
+e2l1ud
+el1u2g
+elu2n
+el1und
+el1u2r
+e2l1u2t
+e2l1uz
+el1új
+el1ús
+el1ú2t
+el1üc
+e2l1üd
+e2l1üg
+elügy1ér.
+elügy1érn
+elü2kén
+e2l1ültet
+e2l1ür
+e2l1üs
+e2l1üt
+e2l1üv
+e2l1üz
+el1űrt
+e2l1űz
+elv1ada
+elv1a2dó
+el2v1at
+el2v1árai
+el2v1áras
+el2v1árár
+elv1ász
+el2vát
+el2v1enc
+el2v1égü
+elv1éle
+el2v1ér.
+el2v1éri
+el2vik
+elv1olt
+el2v1ó2
+el2vöd
+el2vő
+el2vú
+e2ly1a2
+e2ly1á2
+e2ly1e2kén.
+e2ly1el
+e2lyer
+ely1eszt
+ely1é2jé
+ely1é2ké
+e2ly1él
+e2lyés
+e2ly1i2ko
+e2ly1ira
+ely2kéj
+e2ly1o
+e2ly1ó
+e2lyöm
+e2lyön
+e2lyös
+e2lyő
+ely1ul
+elyü2l
+e2ly1ülé
+e2m1ab
+em1a2dat
+em1a2dás
+e2m1a2do
+e2m1a2dó
+e2m1adt
+e2m1a2gi
+em1a2ja
+e2m1ajá
+em1ajk
+e2m1ajt
+em1a2ka
+em1aká
+e2m1aku
+em1a2lap
+e2m1all
+em1almá
+em1alv
+e2m1ana
+1emaná
+e2m1a2ny
+ema2p
+em1apá
+em1apr
+em1a2rán
+em1asszo
+e2m1atl
+e2m1a2u
+e2m1a2v
+e2m1a2zo
+e2m1áb
+emá2l
+em1ála
+em1áld
+em1áli
+e2m1áp
+emá2r
+e2m1ára
+e2m1árn
+e2m1áro
+e2m1áru
+em1árv
+e2m1ásá
+emát1a2
+e2m1áte
+e2m1átl
+em1átm
+e2m1átt
+e2m1átu
+1embarg
+1embered
+1emberf
+ember1ő2
+1embers
+emb2len
+1emblé
+em1bre
+1embri
+em1bro
+em1dr
+e2m1ef
+eme3ger
+eme3gi
+em1egyet
+em1egyé
+e2m1egz
+e2m1e2kés
+e2m1ela
+em1elb
+1emelet
+1emelke
+e2m1ellá
+e2m1elm
+2e2m1elo
+1emelőb
+1emelőe
+em1előny
+1emelős
+1emelőv
+1emelty
+e2m1ember
+e2m1e2mel
+e2m1emu
+e2mener
+emenes1s
+e2m1e2p
+e2m1e2rény
+e2m1e2rő
+eme2sa
+em1e2seté
+e2m1e2sés
+em1e2szem
+e2m1e2szet
+e2m1eszk
+e2m1eszm
+e2m1eu
+e2m1e2v
+eme2z1a
+eme2z1á2
+eme2z1o
+eme2z3s
+e2m1ég
+e2m1é2he.
+e2m1é2hen
+e2m1é2hes
+e2méhs
+e2m1é2j
+emé2k
+e2m1éke
+em1ékr
+em1é2let
+e2méneke
+e2m1ép
+e2mértel
+e2m1értéke
+e2m1értéké
+e2m1értékn
+em1észl
+emé2t1a2
+emé2tár
+e2m1é2tek
+emé2tel
+e2m1étel.
+emét1elh
+emét1els
+em1fl
+emfoga2d
+emfo2gada
+em1f2r
+em1gr
+e2midé
+em1i2dő
+emi2g
+e2m1iga
+e2m1ige
+e2m1igé
+em1iks
+emi2m
+em1ima
+e2mimá
+e2m1inf
+e2m1ins
+e2m1inte
+e2m1i2p
+e2m1ira
+e2mirá
+e2m1iro
+e2m1irt
+e2m1isk
+e2m1ism
+e2m1iste
+emi2sza
+emi2szá
+emi2szo
+em1izé
+em1izg
+e2m1i2zo
+e2míg
+e2m1íj
+e2mír
+e2m1í2v
+em1kl
+em1kr
+1emlékm
+1emlékv
+emo2k
+e2m1okl
+em1oko
+e2m1okt
+em1ola
+e2m1old
+em1oll
+e2m1olt
+e2m1o2p
+e2m1ork
+e2m1ors
+e2m1orv
+emo1t2
+emó2ra
+em1ó2rá
+e2m1öb
+emö2k
+e2m1ökö
+emö2l
+e2m1öld
+em1ölé
+e2m1ön
+e2m1ö2r
+e2m1ös
+em1öv
+e2m1ö2z
+em1őr.
+em1őrk
+em1őrn
+em1ő2rö
+em1őrr
+em1őrt
+1empát
+em1pc
+em1p2re
+em1pré
+em1pro
+em1pró
+em1p2s
+em1sk
+em1sm
+em1sp
+em1s2t
+em1t2r
+1e2mu.
+e2mud
+e2mug
+e2muj
+1e2muk
+1emulz
+1e2mum
+em1uno
+e2mur
+e2musz
+em1utal
+e2m1u2tá
+e2mutc
+e2m1utó
+e2m1új
+em1úr
+e2m1út
+e2m1üd
+e2m1üg
+e2m1ü2lő
+e2m1ünn
+e2m1ür
+e2m1üt
+e2m1üv
+e2m1üz
+e2m1űz
+em1zr
+e2n1ab
+en1a2do
+en1agi
+e2n1a2j
+e2n1a2k
+en1a2la
+en1alk
+en1all
+en1alm
+e2n1a2n
+en1a2pá
+ena2p1e
+en1a2rá
+en1arc
+en1asz
+en1atk
+en1aut
+en1ábr
+en1ág
+en1áld
+en1álm
+e2n1ára
+en1árn
+en1á2ro
+e2n1áru
+en1átk
+en1átm
+en1átv
+e2n1áz
+en1bl
+en2c1a2
+en2c1ár
+en2c3h
+en2c1ip
+en2cí
+en2c1ol
+en2c1os
+en2c1ö2
+enc3ség
+en2c3sor
+enc3s2p
+enc3sz
+en2cu
+en2d1adá
+en2d1alk
+en2dano
+en2d1áll
+en2d1árn
+en2d1átl
+end1é2jé
+en2d1ér.
+en2d1érr
+en2d1értő
+en2d1érz
+en2d1or
+en2d1ón
+en2d1ó2r
+en2dös
+en1d2rá
+en2dú
+en2dza
+eneá2
+e2n1egér
+e2n1egg
+en1e2lek
+en1eljá
+en1elk
+e2n1ell
+en1elm
+en1elny
+en1elü
+en1elvá
+e2n1eml
+eneó2
+ene1p2
+2enerá
+1e2nerg
+e2n1ern
+e2nerv
+2enes
+ene1sztá
+ene2tal
+ene2tos
+e2n1ex
+ené2k1a
+ené2kel
+enéki2
+ené2kis
+en1épí
+en1épü
+e2n1ér.
+e2nérd
+e2n1éré
+e2n1éri
+e2n1érte
+e2n1érv
+ené2sza
+ené2szer
+ené2sz1in
+e2n1étk
+e2n1éves
+ené2vig
+en1f2l
+enfluo2
+enga2
+en2gan
+1engedé
+enger1ő2
+engés3s
+eng1g
+e2nidé
+enidi2o
+e2n1i2ga
+e2n1ige
+e2n1igé
+en1ill
+e2nimá
+e2n1ina
+en1ind
+e2n1inf
+e2n1inte
+e2n1inv
+e2n1ira
+en1i2rá
+en1isk
+e2n1ism
+eni2sza
+eni2szer
+eni2szo
+eni2sz1ó2
+e2n1ív
+en1k2j
+en2n1eme
+en2nes
+enn1ége
+enné2k
+en2n1éke
+en2nér
+en2nir
+en2n1ol
+en2nú
+en2n1ül
+enny1a2d
+enny1as
+enny1á
+en3nyer
+enny1í2
+en3nyu
+e2n1ob
+e2n1of
+e2n1oi
+en1old
+e2n1olv
+eno2ni
+en1opt
+eno2r1á2
+e2n1ost
+en1oszt
+e2n1ox
+enóta2
+enó2tal
+enó2t1e2
+e2n1öb
+e2n1öl
+en1ön
+e2n1ös
+e2n1ö2t
+e3növ
+enő2rü
+en1pr
+en1ry
+en2s1ab
+en2s1a2l
+en2s1a2n
+en2sas
+en2s1el
+en2s1érté
+ens3szá
+en2s3zon
+en2t1a2c
+en2tada
+ent1agy
+enta1k2
+en2t1a2la
+ent1alj
+en2t1alk
+ent1a2lo
+ent1and
+en2t1a2ny
+ent1ass
+en2t1á2rak
+en2t1á2rat
+en2t1árá
+en2t1á2rú
+en2t1elmé
+ente2r1a
+en2t1este
+en2t1esté
+en2t1esti
+ente1t2r
+en2t1é2g
+en2tép
+en2térm
+en2t1é2ve.
+en2tigé
+en2t1i2o
+enti2p
+ent1ipa
+enti2sz
+en2t1okt
+en2tön
+en1trad
+ent2ran
+en2tun
+en2t1u2r
+en2t1ü2z
+en1uta
+en1úr
+en1út
+e2n1űz
+e2nyab
+e2ny1a2d
+e2ny1ae
+enya2g
+eny1aga
+eny1agá
+e2ny1aj
+eny1alk
+e2ny1a2n
+eny1aré
+e2ny1as
+e2ny1at
+e2ny1au
+eny1d2
+eny1e2dzé
+e2nyelm
+eny1előn
+eny1elvo
+eny1elvű
+e2ny1e2rő
+eny1eve
+e2nyéva
+1enyhi.
+eny2h1ős
+e2ny1id
+e2nying
+e2ny1ira
+e2nyiz
+eny1í2ró
+e2nyok
+e2ny1o2l
+e2ny1or
+e2ny1os
+e2ny1ó2
+enyö2k
+e2ny1ökö
+e2nyöt
+eny1s
+enyt2
+eny1tr
+eny1út
+enyva2
+eny2van
+1enyve.
+eny2v1e2l
+enyves1s
+en2zal
+1enzim
+e1o
+eo2áz
+e2obo
+e2ode
+eo2dú
+eog2rafi
+e2oka
+eo2kád
+e2okár
+e2oké
+e2o1k2l
+e2okon
+eo2kos
+eo2kö
+eo2laj
+e2oló
+eo2ly
+e2ome
+e2omé
+e2omi
+eo2n1al
+eo2nan
+eon1any
+eo2natom
+eo2n1au
+eo2n1ál
+eo2nár
+eon1d2
+eo2ner
+eon1f2
+eo2niz
+eo2nö
+eon1t2r
+eo2n1ú
+eo2nü
+e2opa
+eo2pe
+e2o1p2l
+eo1pro
+eo2r1a2
+eo2r1á2
+eo2res
+eo2r1és
+eorgi2a
+e2orgi2áb
+eori2tá
+eor1k2
+eo2rö
+eor1s2
+eo2so
+e2ost
+e2osza
+eo1sz2f
+e2otí
+e2oto
+eo1t2r
+eo2vi
+e1ó
+eóa2d
+e2óbö
+eó2ce
+eó2dá
+e2ófa
+e2óhe
+e2óje
+e2ókap
+e2ókép
+e2ókor
+e2ómi
+e2ómű
+e2óné
+eó2no
+eó1pr
+eó2rá
+e2óre
+e2ósu
+e2ószo
+e2óta
+e2ótá
+e2óte
+e2óté
+e2óti
+e2ótí
+eó1tré
+eó2vak
+e2óve
+e2óvé
+e2óví
+eó2vo
+eó2vó
+e1ö
+eö2bö
+eö2dé
+eö2kö
+eö2le
+eö2lé
+eö2li
+eö2lö
+eö2lő
+eö2lü
+eö2mö
+eö2nö
+eö2rö
+eö2rü
+e2ös.
+eö2ve
+eö2vi
+eö2vü
+eö2zö
+e1ő
+eő2re
+eő2rö
+eő2rü
+eő2sz
+e2p1ab
+e2p1a2da
+e2p1a2dá
+e2p1a2dó
+ep1a2gy
+e2p1aka
+e2p1akk
+e2p1akn
+ep1a2lak
+ep1a2lap
+e2p1alj
+e2p1alk
+epa2lom
+e2p1a2ny
+epa2rán
+ep1atró
+ep1aut
+ep1a2zo
+e2p1áb
+e2p1á2g
+ep1állá
+e2p1á2ra
+epá2s
+e2p1ása
+ep1áta
+ep1átc
+e2p1á2t1é
+ep1átf
+e2p1átm
+ep1á2t1o
+ep1átt
+ep1átü
+e2p1átv
+ep1bl
+ep1br
+ep1dr
+e2p1e2dz
+ep1e2lemr
+e2p1e2let
+e2p1ellá
+e2p1elo
+e2p1ene
+epe2ral
+epe2r1e2c
+epe2rev
+epe2rin
+epe2rül
+e2p1esti
+epe2szá
+e2peszmé
+e2p1ex
+1e2péd
+1epééb
+1epééi
+1epéén
+e2p1ég
+1e2péit
+e2péj
+ep1ékh
+ep1éle
+ep1élm
+1e2pénk
+e2p1ér.
+ep1fl
+ep1ido
+e2p1i2ko
+ep1ind
+e2p1inga
+e2p1i2rá
+e2p1irt
+e2p1ism
+e2piz
+e2p1íg
+e2p1íj
+e2p1ín
+e2p1ív
+ep1kl
+ep1kr
+ep2lag
+e1p2laká
+e1p2lan
+e1p2lán
+e2p1ob
+e2poch
+ep1okt
+e2p1olv
+ep1ope
+e2p1orn
+ep1orsó
+1eposz.
+1eposza
+1eposzá
+1eposzt.
+ep1osztá
+e2p1ö2l
+ep1önt
+e2p1ös
+e2p1öv
+e2p1őri
+ep2pan
+ep2pát
+ep2p1e2le
+ep2p1elh
+epp1eró
+eppó2
+ep2pór
+ep2pö
+ep1pro
+ep1pró
+ep3ret
+e1p2réd
+e1p2rin
+e1proj
+e1p2rot
+ep1s2k
+ep1sp
+ep1st
+ep2tad
+ep2t1aj
+ep2t1í2v
+ep2t1op
+e2p1ug
+e2p1u2ta
+e2p1utó
+ep1új
+ep1út
+e2p1üg
+e2p1üt
+e2p1üz
+e2p1űz
+er1abla
+er1a2bor
+e2r1abr
+er1abs
+era2dat
+e2r1a2dá
+er1adm
+er1a2do
+e2r1a2dó
+era1dr
+er1a2ge
+er1agr
+e2r1a2ja
+e2r1ajk
+er1ajtó
+e2r1a2kad
+e2r1a2kas
+e2r1akc
+e2r1akti
+er1a2la
+e2r1alg
+e2r1alj
+er1alk
+e2r1a2lo
+er1als
+e2r1alt
+er1alv
+er1amb
+er1amp
+er1angy
+er1ann
+er1a2nya
+er1a2pa.
+er1app
+er1aps
+e2r1a2ro
+e2r1asp
+era2sz1a2l
+era2szav
+era2szárn
+era2szel
+era2sz1é2p
+e2r1atk
+e2r1atl
+era1t2r
+er1att
+er1aut
+e2r1a2zo
+e2r1ábr
+erá2fé
+er1áge
+er1á2gú
+e2r1á2gy
+er1állá
+er1állé
+er1állo
+er1álló
+er1állv
+er1ápo
+e2r1ár.
+er1á2rak
+er1á2rá
+e2r1árb
+er1áre
+er1áré
+er1árf
+er1árk
+e2r1á2ro
+e2r1árr
+er1árs
+er1á2ru
+er1árú
+er1árv
+er1ásá
+e2r1á2sz
+er1á2t1e2
+e2r1áth
+er1á2ti
+e2r1átí
+e2r1átj
+e2r1átk
+er1átl
+e2r1átm
+e2r1átn
+e2r1átr
+e2r1átt
+e2r1átv
+erb1i2na
+er2c1a2l
+er2car
+er2c1ár
+er2c1át
+erc1ell
+er2c3ho
+er2cid
+er2c1ina
+er2c1iná
+er2c1i2pá
+er2cis
+erc1k2
+erco2
+er2cö
+er2csad
+er2cs1an
+ercs1ál
+er2cú
+er2cz
+1erdej
+1erdő
+ereá2
+1eredetű
+e2redén
+1e2redm
+eree2
+er1eff
+ere2gál
+ere2gel
+e2r1e2ger
+erei2g
+1e2rején
+1e2rejér
+ere2k1el
+erek1e2szű
+erek1é2j
+ere2kot
+erek1t
+ere2k1ú2s
+e2r1e2leg
+er1elér
+e2r1ellen
+er1elli
+e2r1elö
+e2r1elr
+erem1egy
+ere2m1emb
+erem1érté
+ere2m1ut
+e2r1enz
+ereo1gra
+ere2pan
+ere2pas
+erepá2
+ere2p1ál
+ere2p1e2sé
+ere2pin
+ere2pos
+er1erk
+er1ern
+er1eró
+e2r1esti
+e2r1estj
+e2r1estr
+e2resze.
+ere2szí
+e2reszü
+ere2tál
+ere2tát
+ere2t1eg
+ere2t1erj
+ere2t1é2rő.
+ere2t1é2ve.
+eretö2
+er1e2vés
+e2r1ex
+1e2rezet.
+1e2rezete
+1erezőkh
+erébe2
+eré2bes
+er1ég.
+er1é2ge
+er1égé
+e2r1éj.
+e2r1éjb
+er1éjf
+e2r1éjn
+e2r1éjs
+eré2k1a2
+eré2ká
+eré2kol
+eré2k1ö
+e2réneke
+e2r1é2neké
+eré2p1a
+eré2pá
+e2r1é2ren
+e2r1é2ré
+e2r1é2ri
+eré2sa
+eré2s1elv
+eré2sza
+eré2szá
+eré2szo
+eré2szö
+er1é2ter
+e2r1étk
+e2r1év.
+er1é2ve.
+e2r1é2vek
+e2réven
+e2r1é2ves
+e2r1é2vet
+e2r1é2vén
+er1é2vét
+er1évf
+er1évh
+e2r1é2vi
+e2r1évn
+e2r1évr
+er1évt
+er1évv
+erfé2l1é2v
+er1fl
+er1f2r
+er1gl
+e2r1i2deg
+e2ridé
+e2r1ido
+er1idu
+eri2ga
+e2r1i2gá
+e2r1i2kon
+e2r1i2mi
+eri2no
+erint2
+e2rinteg
+erin1tr
+e2r1i2on
+eri2os
+e2r1i2par
+e2r1ira
+er1iró
+e2r1isk
+er1ism
+eri2szo
+e2r1ita
+e2r1i2zé
+e2r1izg
+er1íg
+er1íj.
+er1íjá
+e2r1ír
+e2r1í2z
+er1k2r
+er1k2v
+erme2k1a2
+erme2ká
+erme2kesz
+erme2ko
+erme2köl
+erme2sz1á
+er2mind
+erm1isi
+ern1ala
+ern1ékn
+ern3n
+er2n1ó2d
+1ernyő
+er1okl
+e2r1okm
+er1olda
+e2r1o2li
+ero2nal
+er1ope
+e2r1opt
+er1orc
+er1ord
+er1orm
+er1orn
+er1o2ro
+er1ors
+e2r1orv
+erosz2f
+e2r1o2ve
+e2r1ovi
+e2r1óc
+er1ó2dá
+er1ólo
+er1ó2rá
+er1óri
+e2r1ö2c
+erö2k
+er1ökl
+er1öko
+e2r1ökö
+e2r1ö2l
+e2r1ör
+e2r1ös
+e2r1öt
+e2r1ö2z
+e2rődd
+erőé2n
+1erőlt
+1e2rőmé
+1erőmh
+1e2rőnö
+1e2rőö
+e2r1őri
+er1őrö
+er1p2l
+er1p2s
+er2rév
+er1ry
+er2s1a2d
+ers1alk
+er2s1an
+er2sat
+er2s1á2gi
+ers1ára
+ers1eml
+er2sérte
+er2s1érté
+er2s1értő
+er2sid
+er2s1im
+er2s1i2n
+er1ská
+er2s1od
+er2s1ol
+er2s1ón
+er1spor
+er1srá
+er1stra
+er2sut
+ersz2to
+er2t1ai
+ertá2p
+ert1ápo
+ertára2d
+ertár1ada
+er2t1elké
+ert1estj
+ert1esze
+er2t1é2j
+er2t1ékn
+er2t1évén
+er2t1é2vév
+er2tid
+er2t1i2m
+er2t1íz
+er2tos
+ert1órá
+er2t1ös
+er2t1öz
+er1t2ran
+er1trén
+ert1s
+er2t1út
+erubi2
+1e2rup
+e2r1u2ra
+er1urá
+er1uru
+er1u2sz
+er1u2tá
+e2r1új
+e2r1úr
+e2r1ú2s
+er1útj
+er1útl
+er1ú2to
+er1útr
+e2r1üd
+e2r1ügg
+er1ügyb
+er1ügyn
+er1ügyr
+e2r1üled
+e2r1ür
+e2r1üs
+e2r1üt
+e2r1ü2v
+e2r1üz
+e2r1ű2z
+er2v1ala
+er2v1alt
+erva2n
+erv1any
+er2v1á2ru
+er2vása
+er2v1átk
+erv1e2lőké
+er2vereze
+er2v1e2sze
+er2vék
+er2vérte
+er2v1érz
+er2vos
+er2vös
+er2vú
+er1ya
+2esa.
+e2s1a2b
+e2s1a2d
+2esait
+e2s1alja
+es1alm
+esa2n
+es1any
+esa2p
+es1apá
+es1arc
+es1ass
+es1asz
+es1a2ty
+e2s1au
+2esábó
+e2s1á2g
+2esán
+es1ára
+es1á2ru
+2esát
+es1bl
+es1br
+es2ch
+1esdő
+es1dró
+1esedez
+ese1fr
+ese2gye
+e2s1elm
+e2seng
+es1epri
+e2s1erd
+eseren2
+1e2settü
+2esé.
+esé2g1el
+1eséll
+1esély
+e2s1ép
+es1érc
+esés3s
+e2s1i2d
+esike2t1
+e2s1ina
+es1i2pa
+e2s1isk
+1esítőst
+es1í2zű
+e1s2kat
+e1s2kál
+es2kic
+1eskü
+es2lat
+eslege2l
+esle2t1o
+es2lin
+e1s2lu
+e1s2mac
+esná2
+2esok.
+2esoka
+2esokbó
+2esokk
+2esokr
+2eson
+e2s1op
+2esos.
+2esosa
+es1osz
+es1ott
+e2s1ó2r
+esőká2
+e2sőz
+es2pan
+es2pec
+es1p2l
+e1s2pó
+e1s2rá
+es1stá
+es3szab
+essz1aga
+essz1a2r
+1esszenc
+es3szerű
+essz1élet
+essz1élt
+essz1int
+essz1ok
+es3szö
+e1s2tab
+es2taf
+es2t1a2l
+es2tana
+es2t1a2ny
+estapolc1
+es2t1a2ra
+est1ará
+e1s2tat
+es2taz
+es2t1á2p
+est1áram
+es2t1ári
+es2t1árn
+es2t1át
+1esteko
+es2tenz
+este2r1a
+es2t1este
+es2t1esti
+1estéih
+1estéj
+1estém
+1esténk
+es2t1ér.
+es2t1éri
+es2t1érr
+es2térte
+es2t1é2rü
+es2t1ill
+es2t1ina
+es2t1int
+es2tip
+es2t1isz
+es2tiz
+es2t1ol
+e1s2top
+esto2r
+es2t1os
+es2t1ó2r
+estö2
+es2t1ös
+es2t1őr.
+es2t1őrk
+es2t1őrö
+es2t1őrr
+es2t1őrt
+es2tun
+es2tú
+es2tür
+es2t1ü2z
+e2s1ud
+esu2r
+es1ura
+es1urá
+e2s1utá
+es1úr.
+es1úrb
+es1úré
+es1úrh
+es1úri
+es1úrk
+es1úrn
+es1úrp
+es1úrr
+es1úrt
+e2s1ú2t
+e2s1üz
+e2sza2c
+esz1acé
+e2szad
+e2sz1a2e
+esz1ajt
+esza2k1é
+esz1akn
+esz1alj
+esz1any
+e2sz1ara
+e2sz1au
+e2száru
+e2sz1ás
+eszá2t
+esz1áts
+e2szece
+eszeg1ér
+e2sz1egy
+esz1ekés
+e2sz1ela
+e2sz1e2mel
+1eszenc
+e2sz1erd
+e2szev
+e2sz1ex
+eszé2do
+esz1é2pí
+e2sz1é2ri
+esz1g2
+esz1i2pa
+esz1isk
+esz1ist
+e2sz1ita
+e2sz1iz
+eszke2l
+1eszme.
+1eszméb
+1eszméi
+1eszméj
+1eszmék
+1eszmén
+1eszmét
+1eszmév
+e2sz1old
+eszö2l
+esz1ölő
+e2sz1ön
+es3zsá
+esz3se
+esz2tab
+esz2tad
+esz2t1a2gá
+esz2taj
+esz2t1ala
+esz2t1alj
+esz2t1ap
+eszt1árf
+esz2t1árn
+esz2t1e2v
+esz2t1ér.
+esztés3s
+1esztéti
+esz2tid
+esz2t1ol
+esz2t1ó2r
+esztö2
+esz2t1öl
+esz2t1őr.
+esz2tut
+esz2t1út
+esz2tüz
+e2sz1ü2g
+e2sz1ü2z
+1e2szűs
+1e2szűt
+esz1z
+et1abr
+eta2c
+et1acé
+e2t1a2d
+e2t1a2gá
+e2t1a2gy
+e2t1a2j
+et1a2kas
+e2t1akc
+et1akó
+e2t1aku
+eta2lag
+eta2lak
+et1a2lás
+e2t1alb
+et1ald
+et1alf
+e2t1alg
+et1alj
+e2t1alk
+1e2talo
+eta2n1é
+eta2nyag
+e2tapr
+et1a2ra
+e2t1ará
+e2t1arc
+e2t1arz
+et1asp
+e2t1ass
+et1a2szá
+e2t1atk
+e2t1a2to
+e2t1aty
+e2t1a2u
+e2t1a2z
+et1ábr
+e2t1á2cs
+e2t1áf
+et1ág.
+e2t1á2ga
+et1ágb
+et1ágg
+et1ágn
+et1ágr
+e2t1áh
+et1áju
+et1áll
+e2t1álm
+e2t1á2rad
+et1áre
+et1árny
+etá2ron
+et1á2rú
+e2t1á2ta
+etát1a2d
+e2t1áth
+et1átl
+et1áts
+et1átu
+e2t1átv
+et1bl
+et1br
+et2ch
+et1dr
+etea2
+eteg1á
+ete2g1e2l
+ete2gó
+e2t1e2ke.
+e2t1e2kei
+e2t1e2kek
+ete2k1ék
+e2t1e2kénk
+e2t1e2kés
+e2t1elc
+et1eldo
+ete2lege
+ete2legy
+et1e2lej
+e2telemz
+e2t1e2lesé
+e2t1eléré
+etelés1s
+e2t1elha
+e2t1elhá
+et1elhel
+e2t1eliga
+e2t1eljá
+e2t1ellá
+e2tellen
+e2t1elme
+e2t1elmén.
+e2t1elméne
+e2t1elmét
+e2t1elnev
+e2telnö
+e2t1elny
+e2t1e2lo
+ete2lőad
+et1elszá
+e2t1eltá
+e2t1elter
+et1eltérí
+e2t1elvá
+e2t1elvez
+e2t1elvo
+e2t1elz
+ete2mal
+e2t1ember
+ete2mel
+e2t1enz
+ete1p2
+e2t1erd
+ete2rén
+etero1
+e2t1erő
+ete2s1a
+e2t1este.
+e2t1eszté
+ete2teté
+ete2t1ér.
+1e2tetésen
+1e2tetésn
+ete2tos
+ete2t1ö
+ete1tra
+e2t1ezr
+etéé2
+et1ég.
+et1égb
+et1é2gé
+et1égg
+e2t1é2gi
+et1égn
+eté2k1a2
+eté2k1á2
+eté2k1e2l
+et1ékí
+eté2kos
+e2t1élm
+e2t1érc
+e2t1é2ré.
+e2t1é2rén
+e2t1é2rér
+e2t1é2rét
+eté2rie
+e2t1érke
+e2t1érm
+e2t1é2rős
+e2t1értel
+e2t1érz
+eté2sa
+eté2s1ég
+eté2so
+etés3s
+eté2sza
+et1észl
+et1észr
+eté2t1a2
+eté2ter.
+eté2tere
+eté1tra
+e2t1é2ven
+eté2ves.
+e2t1é2vet
+e2t1é2véh
+eté2véig
+e2t1é2véne
+eté2vétő
+et1évh
+et1évt
+et1fr
+et1gl
+et1gr
+et2hei
+eti2d
+et1ide
+et1ido
+eti2g
+e2t1ige
+e2t1igé
+e2t1igy
+e2till
+et1i2ma
+e2t1imá
+e2t1i2mi
+1e2timo
+e2t1imp
+etina1
+e2t1ind
+e2t1inf
+e2t1ins
+e2t1inte
+e2t1inv
+e2tinz
+e2t1i2pa
+e2t1i2ra
+e2t1iri
+e2t1iro
+e2t1iró
+e2t1ism
+e2t1iste
+e2t1i2sza
+e2t1i2szon
+e2t1i2ta
+et1izé
+e2t1izg
+e2t1izo
+e2t1izz
+e2t1íg
+e2t1íj
+e2t1ín
+e2t1í2r
+e2t1í2v
+e2t1íz
+et1kl
+et1k2r
+et1kv
+1etnol
+et1oda
+e2t1okm
+e2t1okt
+e2t1oml
+eto2n1a2
+eto2nál
+eto2n1is
+eton1n
+et1opc
+et1ope
+e2t1opt
+2etor
+et1ord
+e2t1org
+e2t1orm
+et1orom
+e2t1ors
+e2t1orv
+et1ost
+etosz2f
+et1oszl
+et1oszt
+e2t1ou
+e2t1ó2c
+et1ó2ra
+et1ó2rá
+e2t1ó2v
+et1öko
+etö2l
+e2t1öl.
+et1ölé
+e2t1ölő
+e2t1ön
+e2t1ös
+e2t1öt
+et1ö2vü
+e2t1ö2z
+etőa2
+etőe2l
+etőé2b
+etőfé2l1é2v
+e2t1őr.
+e2t1őrb
+et1őrc
+et1ő2réh
+ető2ri.
+et1őrk
+et1őrl
+e2t1őrn
+ető2rök
+et1őrp
+e2t1őrr
+e2t1őrs
+et1ő2rü
+ető1s2p
+et1pl
+et1pr
+et1ps
+e1trap
+e1trau
+e1t2rág
+e1tréf
+e1t2ril
+et1sk
+et1sn
+et1sp
+et1st
+et3tad
+ettai2
+etta2n1ó2
+et2telem
+et2t1ing
+et2tír
+et1t2rá
+et1tri
+etty1á2
+e2t1ug
+et1una
+et1und
+et1u2ra
+etu2sz
+et1utá
+et1utó
+et1utu
+e2t1új
+e2t1ú2ri
+e2t1út
+e2t1üd
+e2t1üg
+e2t1üld
+e2t1üt
+e2t1ü2v
+et1ü2zem
+et3ya
+e1u
+eu2bo
+eu2ga
+eu1k2h
+eu2mal
+eu2m1e
+eu2mim
+eu2m1i2p
+eu2mis
+eu2m1iz
+eu2mí
+eu2mór
+eu2mő
+eum1p2
+eu2mü
+eu2na
+eu2ná
+eu2ni
+eu2no
+eu2nó
+e2ur.
+eu2rá
+eur1áz
+eu2ri.
+eu2rig
+e2urt
+eu2szí
+e2utai
+eu2tal
+e2utan
+eu2taz
+e2utái
+e2utájá
+e2utáka
+e2utákk
+e2utákná
+e2utákr
+e2utánk
+e2utár
+eu2tó
+e2uts
+eu2zs
+e1ú
+eú2jí
+eú2sz
+eú2ti
+eú2to
+e1ü
+eü2dü
+eü2ge
+eü2gy
+eü2le
+eü2lé
+eü2li
+eü2lö
+eü2lő
+eü2lü
+eü2re
+eü2rí
+eü2rü
+eü2sz
+eü2te
+eü2tő
+eü2tü
+eü2ve
+eü2vö
+eü2ze
+e1ű
+eű2ri
+eű2ze
+eű2zé
+eű2zi
+eű2zö
+eű2ző
+evá2r1al
+eve2szö
+evé2lá
+evé2l1e2l
+evé2nyel
+evé2r1emb
+evé2rö
+evé2so
+evé2sza
+evé2szö
+evízi2óét
+ex1ab
+ex1al
+ex1ap
+ex1áb
+ex1á2r
+e2x1át
+ex1bl
+ex1br
+ex1dr
+e2xeg
+e2x1elm
+e2x1elvá
+e2x1er
+e2x1ék
+e2x1él
+e2x1ép
+ex1idő
+e2x1igé
+ex1inf
+e2x1ing
+e2x1int
+ex1izz
+e2x1íj
+e2x1ír
+e2x1ob
+ex1op
+ex1ön
+ex1ör
+ex1ös
+1expan
+ex1sk
+ex1sp
+ex1st
+ex1új
+e2x1üg
+e2x1üv
+e2x1üz
+eza2c
+ez1acé
+e2z1a2d
+e2z1af
+ez1ajt
+e2z1a2l
+e2z1a2n
+ez1arz
+e2z1as
+ez1aut
+ez1áll
+ezá2ma
+ez1árb
+ez1árr
+ez1á2rú
+e2z1át
+ez1bl
+ez2dál
+ez1e2gy
+ez1e2kék
+e2z1ela
+e2z1e2leme
+e2z1elér
+e2z1elm
+e2z1el1ö
+e2z1e2mel
+ezen2t1e2
+eze2r1a
+eze2rá
+eze2red
+eze2r1el
+eze2r1em
+eze2r1es
+eze2r1o
+ez1erő
+ez1este
+e2z1e2sz
+eze2t1a2
+eze2t1á
+eze2t1eg
+eze2t1e2l
+eze2t1esz
+eze2t1ér.
+eze2t1é2rő.
+eze2t1é2ve.
+eze2t1o
+eze2tu
+e2z1ég
+e2z1é2j
+ezé2ká
+ezé2k1o
+e2z1él
+ezér1emb
+ezé2rett
+ezé2ru
+ezé2sa
+ezéskész1
+e2z1é2te
+ez1fr
+ez1gr
+ez1i2do
+ezi2g
+e2z1igé
+e2z1i2ko
+e2z1ill
+ez1imp
+ez1iná
+ez1ind
+ez1inf
+ez1int
+ezi2o
+ez1ion
+e2z1i2p
+ez1i2r
+ezisé2g
+ezi2s1égé
+e2z1ism
+ezi2ta
+e2z1í2v
+ez1k2r
+ezkupac1
+ez1kv
+e2z1ob
+ez1old
+ezo2nár
+ezon3n
+ez1opt
+e2z1ox
+e2z1ó2l
+e2z1ó2r
+ez1ó2t
+ez1ö2b
+ez1ös
+ez1ö2v
+ezőe2l
+e2z1ő2ri
+ez1őrl
+e2z1őrs
+ez1ő2rü
+ez1őrz
+ezős1orra
+ez1pl
+ez1p2r
+1ezrede
+1ezreds
+1ezrel
+1ezrem
+1ezresn
+1ezrű
+ez3saj
+ez3sap
+ez3sát
+ez3sáv
+e2z3sé
+ezsió2
+ez3sl
+ez3sor
+ez3s2p
+ez3s2ta
+ez3str
+e2z3sü
+ez3sz
+ez1t2r
+ez1u2r
+ez1ut
+ez1új
+ez1ú2t
+e2z1üg
+1e2züs
+e2z1üt
+e2z1ü2z
+2é.
+é1a
+éa2da
+éa2dá
+éa2do
+éa2dó
+éa2ga
+éa2gi
+éa2já
+éa2ka
+éa2la
+éa2l1e
+éa2na
+éa2ny
+éa2ré
+éa2ri
+éa2ro
+éa2uk
+é1á
+éá2fá
+éá2gy
+éá2ju
+éá2ra
+éá2ro
+éá2ru
+éá2rú
+é2b1ag
+é2b1a2j
+é2b1a2k
+é2b1a2l
+éba2n
+é2b1any
+é2b1a2v
+éb1ál
+ébá2r
+éb2b1á
+éb1eszű
+é2b1é2k
+é2b1él
+é2b1ép
+ébié2
+éb1isk
+éb1i2va
+éb1íz
+éb1kr
+éb1pl
+éb1pr
+1ébres
+é2b1ug
+éb1üg
+éc1a2d
+éc1aj
+éc1a2k
+éc1a2l
+éc1a2n
+éc1ál
+éc1ár
+é2c1e2lem
+é2c1elv
+é2c1ember
+é2c1e2mel
+éc1gr
+éc3ha
+éc3há
+éc3hí
+éc3ho
+é2c1i2d
+é2c1il
+éc1ima
+éc1ob
+éc1os
+éc1őr
+éc1pr
+éc3sab
+écs1ol
+éc3sz
+é2c1u2t
+é2c1ül
+éc3zs
+é2d1ab
+é2d1a2c
+é2d1a2d
+é2d1a2g
+é2d1a2j
+éd1akc
+éd1akt
+éd1a2ku
+éd1alk
+é2d1a2n
+éd1apa
+éd1a2pá
+é2d1arc
+éd1asp
+éd1ass
+éd1a2ti
+éd1att
+é2d1ág
+éd1áp
+éd1dr
+é2d1e2g
+é2d1ej
+é2d1e2ke.
+éde2kétő
+é2d1e2l1a
+é2d1elk
+é2d1ell
+é2d1elo
+éd1ember
+é2d1eml
+é2d1enz
+é2d1ep
+éd1erd
+é2derei
+é2derem
+é2derg
+é2derl
+é2derné
+é2d1erő
+é2derrá
+é2derrő
+é2ders
+é2dertő
+1édesa
+é2desem
+1édesg
+1é2desí
+é2d1ég
+é2d1é2j
+é2d1ékb
+é2d1é2ké
+é2d1ékk
+édé2l
+é2d1éle
+é2d1élm
+é2d1ép
+é2d1ér.
+é2d1é2ri
+é2d1érs
+é2d1érte
+é2d1értő
+é2d1érv
+é2d1érz
+éd1fr
+édi2ad
+édi2aka
+édi2al
+édi2ar
+édi2a1s
+édiasz2
+é2d1i2d
+édi2g
+é2d1iga
+é2d1ige
+é2d1igé
+éd1i2ko
+éd1ill
+é2d1i2m
+éd1i2na
+éd1ind
+é2d1ini
+éd1ins
+é2d1int
+é2d1i2p
+é2d1iro
+é2d1i2z
+é2d1ín
+é2d1ír
+éd1ív
+éd1kl
+éd1okta
+é2d1op
+é2d1or
+é2d1osz
+éd1ott
+éd1ó2r
+éd1öl
+éd1ön
+é2d1ö2r
+éd1öt
+éd1öv
+éd1öz
+é2d1őrm
+é2d1őrn
+édős2
+édő1sp
+éd1pl
+éd1pr
+é1d2ram
+éd2raz
+é1d2rám
+éd1sk
+éd1sp
+éd1sr
+éd1st
+éd1t2r
+é2d1ud
+éd1uj
+éd1ura
+é2d1u2t
+é2d1új
+éd1úr
+éd1ú2t
+é2d1üd
+é2d1üg
+é2d1üt
+é2d1üz
+éd3za
+éd3zá
+éd3ze
+éd3zó
+éd3zü
+é1e
+ée2bé
+ée2la
+ée2le
+ée2lő
+ée2me
+ée2pi
+ée2rő
+ée2se
+ée2sé
+ée2si
+ée2ső
+ée2sz1a2
+ée2sz1á
+ée2szel
+ée2szép
+ée2szir
+ée2szis
+éeszt2
+éesz1tr
+ée2uf
+ée2vé
+ée2vő
+é1é
+éé2ge
+éé2le
+éé2pí
+éé2ra
+éé2te
+éf1ai
+éf1ajtó
+éf1ing
+é2f1is
+éf1kl
+é2f1os
+ég1abl
+ég1abr
+ég1a2d
+ég1aka
+ég1akk
+ég1akn
+ég1alj
+ég1am
+ég1a2ny
+ég1a2p
+é2g1a2r
+ég1aut
+ég1a2v
+éga2z
+é2g1á2g
+é2g1ál
+ég1áp
+ég1árt
+égát1a2d
+ég1átá
+ég1á2t1e2
+ég1átf
+ég1átj
+ég1átm
+ég1áts
+ég1átt
+ég1átv
+ég1bl
+ég1br
+ég1d2r
+ég1ece
+é2gedén
+é2g1edz
+ég1e2ge
+é2g1ej
+é2g1e2kés
+é2g1ela
+é2g1elb
+ége2leg
+ég2elek
+ége2lemb
+é2ge2leme
+ége2lemn
+ége2lemt
+é2g1elér
+é2g1elf
+é2g1elha
+ég1elhá
+ége2lin
+é2g1elis
+é2g1eljá
+é2g1elk
+é2g1ellá
+é2g1ellen
+é2g1elm
+é2gelnö
+ég1elny
+é2g1elö
+é2g1e2lőa
+ége2lőm
+é2g1e2lőn
+ég1e2lőt
+é2g1elp
+é2g1elr
+é2g1elsa
+é2g1elszí
+ég1elta
+é2g1eltá
+é2g1elvá
+é2g1elz
+é2g1enc
+é2g1e2ne
+é2g1eng
+ége1p
+ég1epi
+ége2rál
+é2g1erede
+ége2r1el
+égeri2
+ége2rim
+ége2rin
+é2g1eró
+ég1erő
+ége2rül
+1é2gesd
+é2g1essz
+ége2sze
+é2g1eszk
+é2g1eszt
+1é2getj
+1é2getőh
+1é2getőn
+1é2getőt
+ég1eva
+ég1e2ve
+ég1e2vé
+ég1evo
+é2g1ex
+é2g1é2g
+é2g1é2l
+é2g1é2neke
+é2g1é2neké
+é2génekk
+é2g1é2nekn
+ég1épí
+é2g1épü
+ég1é2ret
+é2g1é2rez
+égé2ré.
+é2g1érh
+é2g1é2ri
+ég1érl
+ég1érm
+ég1é2rő.
+ég1é2rők
+égért2
+ég1érte
+ég1érté
+1é2gésé
+1é2gésn
+é2gést
+é2g1éva
+ég1fl
+ég1fr
+ég1g2l
+ég1g2r
+ég3gyo
+1éghes
+1éghü
+égi2as
+ég1i2den
+égi2g
+é2g1iga.
+égig1ap
+égig1as
+ég1igaz
+égig1á
+é2gill
+é2g1imá
+ég1ina
+ég1inf
+é2g1ing
+é2g1inj
+ég1ins
+é2g1int
+é2g1ira
+ég1iro
+é2g1i2ta
+é2g1iva
+é2g1i2zésn
+é2g1izg
+ég1íg
+ég1íj
+ég1ín
+ég1ír
+ég1ív
+ég1íz
+1égj.
+égkia2
+ég1kl
+ég1kr
+ég1kv
+1égne.
+1égnék
+1égnén
+1égnét
+1égni
+é2g1ob
+ég1oki
+ég1ola
+ég1old
+ég1oli
+ég1oll
+ég1olt
+é2g1op
+é2g1o2r
+é2g1os
+ég1ott
+é2g1o2v
+é2g1ox
+é2g1óc
+ég1ó2r
+ég1öb
+é2g1ö2d
+é2g1ö2l
+ég1ön
+égö2r
+ég1örö
+é2g1ös
+é2g1öt
+é2göv
+é2g1ö2z
+1égő.
+1égők
+é2gőr
+ég1őri
+ég1őrö
+ég1ősi
+1égőt
+1égőv
+ég1pl
+ég1pr
+ég1ps
+ég1sk
+ég1sp
+ég1s2t
+égsz2
+1égsz.
+égszáraz1
+ég1tr
+é2g1ud
+ég1un
+é2g1u2t
+ég1úg
+ég1új
+ég1úr
+ég1ús
+ég1ú2t
+é2g1üd
+é2g1ü2g
+é2g1ür
+é2g1üs
+é2g1üt
+é2g1üv
+é2g1üz
+é2g1űz
+égvezé2
+é2gy1a2
+é2gyál
+é2gyedé
+é2gy1eg
+é2gyelek
+é2gyeleme
+égye2m
+é2gy1emb
+é2gy1eme
+égye2seké
+é2gy1esz
+é2gy1e2v
+é2gyeze
+é2gy1ék
+é2gyél
+égy1é2ne
+égyi2
+é2gyin
+é2gyir
+é2gy1is
+é2gy1iv
+é2gyí
+égyo2
+égy1ok
+égy1os
+égy1ot
+é2gy1ó2
+égy1ö2l
+é2gy1u2
+é2gy1ú
+é2gy1ü2l
+é2gyür
+éha2l
+éh1ala
+éh1any
+é2h1arc
+éh1art
+é2h1au
+é2h1a2v
+éh1edé
+2éheg
+éh1e2gé
+éh1e2le
+éh1elé
+éh1elf
+éh1elh
+éh1ell
+éh1e2lő
+éh1elt
+éh1elv
+é2h1enz
+é2h1e2r
+é2h1esem
+é2h1e2to
+éh1evé
+é2h1ex
+é2heze
+1é2hezé
+1éhező
+1é2hezt
+é2hezü
+é2hezv
+éh1ég
+éh1é2k
+é2h1é2l
+é2h1ép
+éh1érb
+éh1fl
+é2h1ic
+é2h1if
+é2h1i2n
+é2h1ip
+éhi2r
+éh1ira
+éh1irt
+é2hit
+éh1ita
+é2h1iz
+éh1ín
+éh1kr
+é2h1od
+éh1old
+éh1öb
+éh1ö2d
+éh1ös
+éh1pl
+éh1pr
+1éhsé
+éh1sk
+éh1sp
+éh1ud
+éh1új
+é2h1üg
+é2h1ür
+é2h1üt
+é2h1űr
+é1i
+éi2dő
+éi2ga
+éi2gé
+éi2má
+éi2pa
+éi2rá
+éi2ro
+éi2ta
+éi2vás
+éi2vó
+é1í
+éí2rá
+éí2ro
+éí2ró
+éí2vá
+éí2ze
+é2j1ab
+é2j1a2da
+é2j1a2l
+é2j1any
+é2j1a2r
+é2j1á2l
+é2j1áp
+é2j1árn
+éj1eb
+é2j1e2lem
+é2j1elh
+éj1elm
+é2j1elv
+éj1emb
+é2j1esz
+é2j1e2v
+é2j1é2g
+éjé2j
+é2j1é2k
+é2j1él
+é2j1ép
+é2j1é2te
+1é2ji.
+é2j1il
+é2j1im
+éj1i2n
+é2j1ip
+é2j1iz
+é2j1o2l
+éj1ó2r
+éj1öd
+éj1ön
+éj1ör
+éj1pl
+éj1pr
+éj1sp
+éj1sz
+éj1ud
+éj1u2r
+éju2t
+éj1uta
+é2j1úr
+é2jül
+é2j1űz
+ék1abl
+ék1a2cé
+éka2dat
+ék1a2dá
+ék1a2dó
+ék1ajt
+éka2kad
+é2k1aká
+é2k1akk
+é2k1akn
+éka2lag
+ék1a2lak
+é2k1alg
+é2k1alj
+ék1alko
+é2k1all
+é2k1alt
+ék1alu
+ék1amb
+ék1ang
+ék1app
+é2k1a2rá
+ék1arc
+ék1a2ré
+ék1arz
+é2k1asp
+é2k1ass
+ék1aszt
+ék1a2tom
+ék1a2ve
+ék1azo
+é2k1ál
+é2k1á2p
+ék1árad
+é2k1á2rak
+é2k1á2rá
+ék1árb
+é2k1á2ré
+ék1árh
+é2k1árk
+é2k1árn
+é2k1á2ro
+ék1árr
+é2k1á2ru
+ék1á2rú
+ék1ásó
+ék1ásv
+é2k1áta
+é2k1átá
+é2k1átc
+é2k1átd
+é2k1áte
+ék1áté
+é2k1átf
+é2k1áth
+é2k1áti
+é2k1átí
+é2k1átk
+é2k1átl
+é2k1átm
+é2k1átö
+é2k1átr
+é2k1áts
+ék1átt
+é2k1átu
+é2k1átv
+é2k1áz
+ék1bl
+ék1br
+ék1dr
+ék1egé
+é2k1e2kés
+é2k1elb
+é2k1e2leg
+ék1e2leme
+ék1e2lemé
+éke2lemm
+ék1e2lér
+é2k1elf
+é2k1elk
+é2kellá
+é2k1ellen
+é2k1elm
+é2k1elo
+ék1elp
+é2k1elta
+ék1eltá
+é2k1eltér
+ék1elül
+ék1elvi
+é2k1e2mel
+ék1eng
+éke1p2
+é2k1erd
+é2k1e2rec
+é2kered
+é2k1e2rei
+é2k1e2rez
+é2k1erg
+é2k1e2ró
+é2k1e2rő
+é2k1e2sete
+ék1eszk
+éke1szl
+é2k1e2tet
+éke2tik
+éke2vés
+é2k1e2vo
+é2k1ex
+é2k1ég
+ék1éjs
+é2k1épí
+é2k1épü
+é2k1érc
+é2k1é2rem
+é2k1é2ren
+é2k1é2ré
+é2k1é2ri
+é2k1érk
+é2k1érl
+é2k1érm
+é2k1é2rő.
+é2k1é2rői
+é2k1é2rők
+é2k1érp
+é2k1érr
+é2k1érte
+é2k1érté
+é2k1értő
+é2k1é2rü
+é2k1érv
+é2k1érz
+2ékés
+ékés3s
+ék1észl
+é2k1étk
+ék1étv
+é2k1é2ve.
+é2k1é2vek
+ék1é2vet
+é2k1é2véb
+é2k1é2vén
+é2k1é2vét
+é2k1é2vév
+é2k1évi
+ék1fj
+ék1fl
+ék1fr
+ék1g2r
+ékia2
+éki2d
+é2k1ide
+ék1idé
+ék1ido
+é2k1idő
+éki2g
+ék1iga
+ék1ige
+é2k1igé
+ék1i2ko
+ék1ikr
+é2k1ill
+é2k1ima
+é2k1imá
+ék1imi
+ék1ind
+é2k1ing
+é2k1inh
+é2k1inn
+é2k1int
+é2k1inv
+é2k1i2o
+é2k1i2p
+é2kirán
+é2k1iro
+é2k1isk
+ék1ism
+é2k1ist
+éki2sza
+é2k1i2ta
+é2k1i2z
+ék1íj
+é2k1ír
+é2k1í2v
+é2k1í2z
+ék2kál
+ék1k2l
+ék1k2r
+ék1kv
+é1k2lu
+é2k1ob
+ék1of
+é2k1oká
+é2k1o2laj
+é2k1olda
+ék1oltás
+é2k1oml
+ék1opc
+ék1o2pe
+é2k1org
+é2k1orm
+é2k1orr
+é2k1orz
+é2k1osto
+é2k1ott
+é2k1ou
+é2k1ox
+é2k1óc
+ék1ó2l
+é2k1ón
+ék1ó2ra
+ék1ó2rá
+é2k1ó2v
+é2k1ó2z
+é2k1ö2b
+ékö2l
+é2k1öm
+ék1önt
+ék1ö2rö
+é2k1ös
+é2k1ötl
+ék1ö2vö
+ék1ö2zö
+ék1ő2r
+ék1ős
+ék1pl
+ék1pr
+ék1ps
+é1k2reá
+ék2rim
+ék1sh
+ék1sk
+ék1sl
+ék1sp
+ék1s2r
+ék1st
+ék1sz2
+ék1t2r
+é2k1ud
+é2k1ug
+é2k1uj
+é2k1und
+é2kuni
+é2k1u2tac
+é2k1u2tak
+ék1u2tal
+é2k1u2tas
+é2k1utá
+é2k1új
+ék1úr.
+ék1úrn
+ékú2t
+é2k1úth
+é2k1úti
+é2k1útj
+é2k1útn
+é2k1úto
+é2k1útr
+é2k1útt
+é2kútv
+é2k1üd
+é2k1üg
+ék1ü2le
+é2k1ünn
+é2k1ür
+é2k1ü2s
+é2k1ü2t
+é2k1ü2v
+é2k1üz
+ék1űr.
+ék1űrb
+ék1ű2rö
+é2k1űz
+él1abl
+él1abr
+él1a2cé
+él1a2da
+él1a2do
+él1a2dó
+él1a2g
+é2l1a2j
+él1a2ka
+él1akc
+él1akn
+él1ako
+é2l1a2l
+él1amc
+él1a2me
+él1and
+él1apó
+él1arm
+él1asp
+él1ass
+él1asz
+él1a2to
+él1a2u
+é2l1a2va
+él1azo
+él1ábr
+é2l1á2g
+élá2l
+é2l1áll
+é2l1álmá
+é2lálmot
+é2l1álo
+é2l1á2p
+él1ár.
+él1á2rá
+él1árb
+él1árf
+él1á2ri
+él1árk
+é2l1árn
+él1á2ro
+él1árr
+él1á2ru
+él1á2rú
+él1árv
+él1át1a2
+él1átc
+élát1e2
+é2l1átf
+él1áth
+él1á2ti
+él1átj
+é2l1átm
+élá2tok
+él1átr
+él1áts
+él1átt
+él1átü
+él1átv
+él1bl
+él1br
+élc3sz
+él1d2r
+éle2b
+é2l1ebé
+é2l1e2dz
+él1eff
+él1e2gé
+élegész1
+él1e2gy
+éle2k1a2
+éle2k1á
+éle2k1e2l
+éle2kem
+éle2ker
+éle2k1es
+é2l1e2kés
+éle2kis
+éle2kol
+éle2k1on
+éle2kot
+éle2kó
+éle2k1ö2
+éle2ku
+éle2k1ú
+él1e2l1a
+é2l1e2leg
+él1elf
+é2l1elo
+é2l1előe
+éle2lőj
+é2l1e2lők
+éle2lőt
+é2lemb
+é2l1e2mi
+é2l1emp
+éle2n
+é2l1ene
+é2l1eng
+é2lenj
+é2l1enn
+é2l1eny
+é2l1enz
+él1e2ró
+é2l1e2sés
+éle2szü
+éle2szű
+éle2t1a2
+éle2t1á2
+éle2t1eg
+éle2t1e2l
+éle2t1e2r
+éle2tesz
+éle2t1ék
+éle2tél
+éle2t1ér.
+éle2t1érd
+éle2t1é2rő.
+éle2térü
+éle2tés
+éle2téte
+éle2tété
+éle2t1étn
+éle2t1é2ve.
+éle2t1é2ved
+éle2t1é2vén
+éle2tik
+éle2tisz
+éle2t1o
+éle2tó
+életö2
+éle2t1öl
+éle2t1ör
+éle2t1u2
+éle2tüz
+éle2t1ű2z
+é2l1e2vő
+é2l1ex
+élé2d
+é2l1éde
+é2l1é2g
+él1é2hes
+él1ékek
+él1ékí
+é2l1é2l
+él1épü
+é2l1ér.
+é2l1érb
+é2l1érd
+él1é2rem
+é2l1é2ret
+é2l1é2ré
+é2l1érm
+é2l1érn
+é2l1érte
+é2l1érté
+é2l1é2rü
+é2l1érz
+élé2sa
+élés3s
+é2l1é2te
+é2l1étk
+é2l1év.
+é2l1é2v1á
+é2l1é2ves
+é2l1é2vet
+é2l1évez
+él1é2vén
+é2l1é2vér
+é2l1é2vi
+él1évü
+él1f2l
+él1f2r
+él1g2r
+é2l1i2d
+é2l1iga
+éli2gá
+é2l1i2ge
+é2l1igé
+é2l1i2ko
+él1ill
+éli2m
+él1ima
+él1imi
+él1imp
+é2l1ind
+é2l1inf
+é2l1ing
+él1int
+él1inv
+él1inz
+él1i2on
+é2l1i2p
+é2l1irá
+él1iro
+é2lism
+éli1s2p
+é2l1i2szá
+él1i2va
+é2l1i2vá
+él1izg
+é2l1izm
+é2l1i2zo
+él1íj
+él1í2r
+él1í2v
+él1íz
+él1k2l
+él1k2r
+él3lyu
+él2mat
+1élmén
+é2l1ob
+é2l1okm
+é2l1oks
+é2l1ol
+é2l1o2r
+élos3s
+é2l1osz
+é2l1óc
+él1ó2n
+é2l1ó2r
+él1öb
+él1öc1
+élö2k
+él1ö2l
+él1ön
+él1ör
+él1ös
+é2l1ö2z
+élőe2
+él1őrü
+1é2lősk
+él1p2l
+él1p2r
+élrádi2
+élre1pr
+él1sk
+él1sp
+él1st
+él2sz1árnn
+él1szt
+éltal2p1al
+él1trá
+él1tré
+él1tri
+él1tró
+é2l1ud
+é2l1ug
+é2l1uj
+él1ult
+él1u2r
+é2l1u2tas
+él1utó
+é2l1új
+él1úr
+é2l1üg
+él1üll
+él1ült
+é2l1ür
+é2l1üs
+é2l1üt
+é2l1üv
+é2l1üz
+él1űz
+1élvező
+é2ly1ab
+é2ly1a2d
+é2lyaj
+é2ly1a2l
+ély1a2n
+é2ly1ap
+ély1a2r
+é2ly1as
+ély1au
+é2ly1av
+ély1az
+é2ly1á2l
+élye2c
+é2lyef
+ély1egy
+é2lyekés
+é2ly1el
+é2lyeml
+é2lyene
+é2ly1ent
+é2lyer
+é2lyeti
+é2ly1é2j
+é2ly1ék
+é2lyél
+é2lyés
+ély1f2
+é2ly1ira
+ély1k2
+é2lyol
+é2ly1ó
+é2lyös
+é2ly1öz
+é2lyő
+ély1s
+élyú2
+é2lyültet
+é2lyüt
+ém1abr
+éma1d2
+ém1a2da
+ém1a2dó
+émae2
+émai2k
+ém1ajt
+ém1akk
+ém1all
+ém1alm
+ém1app
+ém1arc
+ém1arm
+émas2
+éma1sp
+émat2
+éma1tr
+ém1aut
+ém1a2zo
+émá2c
+émá2l
+ém1álm
+ém1álo
+é2m1áp
+ém1árn
+é2m1áru
+émát1a
+é2m1átt
+ém1b2l
+ém1b2r
+ém1dr
+éme2c
+éme2g
+é2m1e2ke.
+é2m1e2kés
+ém1ela
+éme2led
+é2m1elh
+é2m1ell
+ém1e2lő
+ém1els
+é2m1elv
+ém1e2re
+ém1ern
+ém1e2rő
+éme2s1á
+é2m1esemé
+é2m1esz
+éme2ta
+éme2tel
+éme2t1ék
+éme2to
+é2m1e2v
+é2m1ex
+ém1éks
+é2m1é2l
+é2m1ép
+é2m1érc
+ém1érd
+é2m1éri
+é2m1érm
+é2m1érté
+é2m1és
+é2m1é2te
+ém1fl
+ém1fr
+ém1gr
+émi2al
+é2m1i2d
+émi2g
+é2m1igé
+ém1iks
+ém1ill
+ém1ind
+ém1inf
+é2m1inv
+é2m1i2o
+é2m1i2p
+ém1irá
+ém1irh
+é2m1iro
+ém1isk
+ém1ism
+émi2sz
+ém1i2ta
+ém1izo
+é2m1ír
+ém1í2v
+ém1íz
+ém1kl
+ém1kr
+émo2nac
+émo2ne
+émon1n
+émont2
+ém1o2p
+ém1ost
+ém1ox
+ém1ó2l
+ém1ó2r
+ém1öb
+ém1ö2l
+ém1ön
+ém1ös
+ém1öt
+ém1öv
+ém1ő2r
+ém1p2l
+ém1p2r
+ém1sk
+ém1sl
+ém1sp
+ém1s2r
+ém1s2t
+ém1sz2
+ém1t2r
+ém1uj
+ému2n
+ém1una
+é2m1u2r
+é2m1úr
+é2m1üg
+é2m1ür
+é2m1üt
+é2m1üv
+é2m1üz
+ém1wh
+én1abb
+é2n1abl
+é2na2dal
+én1adá
+én1a2do
+én1agá
+én1agr
+én1akc
+é2n1akn
+én1akt
+én1alk
+én1ana
+én1ano
+én1ant
+éna1pré
+én1arc
+énas2
+éna1sp
+é2n1ass
+én1atm
+é2n1a2tom
+éna1t2r
+é2n1au
+é2n1ág
+éná2l
+én1ála
+én1álc
+én1áld
+é2n1áll
+é2n1á2p
+é2n1á2rak
+énás1s
+én1ásv
+én1áta
+én1átb
+én1áte
+én1átk
+én1átö
+é2n1átr
+én1átt
+én1átü
+é2n1átv
+énba2
+én1bl
+én1br
+én1d2r
+é2n1ef
+én1e2gy
+1é2ne2k1a2
+1é2nekd
+é2neke.
+1é2nekei
+1é2nekek
+1é2nekem
+éne2ker
+1é2nekes
+éne2k1é2j
+1é2nekf
+1é2nekg
+éne2kiz
+1é2nekí
+1énekj
+1énekka
+1é2nekl
+éne2kó
+éne2k1ö
+1é2neks
+én1ela
+én1elg
+én1elh
+én1elj
+én1ell
+én1eln
+én1e2lő
+én1elp
+én1els
+én1elt
+én1elv
+én1eml
+éne2n
+é2n1ene
+éne2r1a
+éne2r1á2
+éne2reme
+én1eró
+é2n1e2sz
+éne2t1a2
+éne2t1á2
+éne2t1e2l
+éne2test
+éne2to
+é2n1e2v
+é2n1ex
+én1éjb
+én1ékb
+én1é2ké
+én1é2ki
+én1é2kű
+éné2l
+é2n1éle
+é2n1élő
+éné2m1a
+én1éneke
+é2n1ér.
+é2n1érc
+é2n1éré
+éné2ter
+2énéz
+én1f2r
+énfüstö2
+énfüs2t1öl
+én1g2r
+én1ido
+éni2g
+é2n1igé
+én1iko
+én1ill
+én1imi
+én1ina
+én1ind
+én1inf
+én1inh
+én1int
+é2n1i2p
+én1ism
+é2n1ita
+é2n1iva
+é2n1i2z
+én1íj
+én1ín
+é2n1ív
+én1k2l
+én1k2rá
+én1k2ré
+én1kri
+énmű1
+én3nyo
+é2n1ol
+én1oml
+én1ond
+é2n1or
+é2n1osz
+én1ot
+é2n1ox
+én1óc
+é2n1ó2r
+én1ök
+én1öl
+én1ön
+én1ör
+én1öt
+2énöv
+é2n1ö2z
+én1ő2s
+énpe2
+én1pl
+én1pr
+én2sas
+én1s2p
+én1s2t2
+én2sú
+én1tra
+én1trá
+én1t2ri
+én1tró
+é2n1u2t
+én1út
+é2n1ü2g
+é2n1üle
+é2n1ür
+é2n1üs
+é2n1ü2v
+é2n1ü2z
+é2ny1a2
+é2ny1á2
+énye2c
+é2ny1ece
+é2nyecse
+é2ny1e2dz
+é2nyef
+é2ny1egy
+é2nyekés
+é2nyela
+é2nyelá
+é2ny1ell
+é2ny1elo
+é2ny1elvá
+ény1elvű
+ény1elvv
+é2nyema
+ény1enc
+é2ny1ep
+é2nyerd
+ény1ered
+é2ny1e2rő
+é2ny1e2sett
+é2ny1e2sés
+é2ny1e2ső
+é2ny1essz
+é2ny1esté
+é2ny1e2sz
+é2nyeta
+é2nyeti
+é2nyetű
+é2ny1ev
+é2ny1ég
+é2ny1é2j
+ényé2k
+ény1éke
+ény1ékh
+ény1ékn
+ény1ékt
+é2ny1é2l
+é2ny1ér.
+é2ny1érd
+é2nyéré
+é2ny1é2ri
+é2ny1érn
+é2nyérte
+é2ny1érté
+é2ny1é2rü
+é2ny1érv
+é2ny1érz
+é2ny1és
+é2ny1é2te
+é2ny1étt
+é2nyéva
+é2ny1if
+ényi2g
+é2ny1igé
+é2ny1i2ko
+é2ny1ing
+é2ny1ira
+é2nyiro
+é2nyisk
+é2nyita
+é2nyiz
+ényí2r
+ény1írá
+ény1író
+é2ny1ok
+é2ny1o2l
+é2ny1o2r
+é2ny1os
+é2ny1ó2
+ényö2
+é2nyön
+ény1ör
+é2ny1ös
+ény1öz
+é2ny1ő2
+ény1s
+ényt2
+ény1tr
+é2nyu
+ény1u2r
+ény1us
+é2nyúj
+ény1út
+é2ny1ü2lő
+é2ny1üs
+é2ny1üv
+é2nyüz
+énza2
+én2z1ad
+én2zag
+én2zak
+én2z1al
+én2zar
+én2zau
+én2z1ál
+én2z1ás
+én2z1át
+én2z1e2r
+én2z1im
+én2z1in
+én2zis
+én2zí
+énzo2
+én2z1ol
+én2zor
+én2zos
+én2zör
+én2z1ő
+én2zsa
+én2zse
+én2zur
+én2zú
+énz1z
+é1o
+éo2la
+éo2pe
+éo2sz
+é1ó
+éó2ra
+éó2ri
+é1ö
+é1ő
+ép1ado
+é2p1a2j
+ép1alk
+épa2ny
+ép1apo
+épa1pr
+ép1arc
+ép1aré
+ép1ass
+ép1atl
+épau2s
+ép1aut
+ép1a2va
+é2p1á2g
+é2p1álla
+é2p1állo
+ép1áp
+ép1ár.
+ép1árb
+ép1árf
+ép1ári
+ép1á2ro
+ép1á2ru
+ép1á2rú
+ép1átb
+ép1átj
+ép1átl
+ép1átm
+ép1áts
+ép1átü
+ép1átv
+ép1bl
+ép1br
+ép1dr
+é2peb
+ép1e2gé
+ép1e2gy
+é2p1e2kés
+2épel
+é2p1ela
+é2p1elá
+é2p1elb
+é2p1elc
+ép1e2lemb
+é2p1e2leme
+ép1e2lemr
+é2p1elér
+é2p1elf
+é2p1e2lin
+ép1eljá
+é2p1elk
+ép1ellá
+é2p1ellen
+é2p1elm
+é2p1elo
+é2p1e2lőke
+é2p1elr
+é2p1eltér
+ép1elu
+épe2n
+é2p1ene
+é2p1e2p
+é2p1er
+épe2rő
+é2p1esem
+é2p1e2ser
+é2p1e2sett
+é2p1e2sés
+é2p1e2ső
+é2p1este
+é2p1esté
+é2p1esti
+é2p1estj
+épe2sz
+é2p1esze
+é2p1eszk
+é2p1eta
+ép1e2tete
+épe2teté
+é2p1etű
+ép1eva
+é2p1ex
+é2p1ég
+é2p1é2k
+é2p1é2l
+é2p1é2neke
+é2p1ér.
+é2p1éri
+épé2sa
+é2p1éte
+ép1fl
+ép1gr
+é2p1i2d
+é2p1i2ko
+é2p1imp
+ép1ind
+ép1ing
+é2p1ins
+é2p1int
+ép1i2pai
+é2p1i2ra
+é2p1i2rá
+é2p1i2ro
+é2p1irt
+ép1isk
+é2p1ism
+é2p1ist
+é2p1i2ta
+é2p1iz
+ép1ín
+é2p1í2r
+1építm
+é2p1ív
+épká2r
+ép1kl
+ép1kr
+ép1kv
+éple2t1ö
+ép1ob
+é2p1ok
+ép1old
+ép1olv
+ép1on
+ép1op
+ép1orm
+ép1ors
+ép1osz
+é2p1óc
+é2p1ó2h
+ép1ó2r
+ép1öl
+ép1öm
+ép1ön
+épö2r
+ép1ös
+ép1ö2z
+ép2p1ek
+ép2pí
+ép1p2l
+ép2p1od
+ép1p2r
+é1prog
+ép2rózá
+ép1sh
+ép1sk
+ép1s2n
+ép1sp
+ép1s2t
+épsz2
+ép1t2r
+ép1udv
+ép1ug
+é2p1uj
+épu2n
+ép1uno
+é2p1u2r
+épu2s
+é2p1u2t
+ép1új
+ép1ús
+ép1út
+é2p1üd
+é2p1üg
+é2p1üld
+1épüle
+é2p1ür
+ép1üs
+é2p1üv
+é2p1üz
+ér1abl
+ér1abs
+é2r1a2d
+ér1a2gá
+ér1agg
+ér1agy
+ér1a2ja
+ér1ajt
+é2r1a2ka
+é2r1akc
+é2r1a2la
+ér1alá
+ér1alg
+ér1alk
+ér1alm
+ér1alv
+ér1amb
+ér1amp
+ér1ane
+ér1ani
+ér1a2no
+ér1ant
+ér1a2pá
+ér1a2pó
+ér1app
+ér1apr
+ér1a2ra
+ér1a2rá
+ér1arc
+ér1asp
+ér1ass
+ér1a2ti
+ér1atk
+ér1atl
+ér1a2to
+éra1t2r
+ér1att
+ér1aty
+é2r1a2u
+ér1a2va
+é2r1a2x
+ér1a2zo
+é2r1ábr
+ér1ág.
+é2r1á2ga
+ér1ágb
+ér1ágg
+ér1ágy
+é2r1á2l
+ér1á2p
+ér1árá
+ér1árk
+ér1á2ro
+ér1árp
+ér1árr
+ér1á2ru
+ér1á2t1a2
+ér1á2t1á2
+ér1átc
+ér1á2t1e2
+ér1áté
+ér1átf
+ér1áth
+ér1átj
+ér1átl
+ér1átm
+ér1á2tö
+ér1átr
+ér1átú
+ér1átü
+ér1átv
+é2r1áz
+1érbán
+ér1bl
+ér1br
+ér2caj
+ér2c1a2l
+ér2c1a2n
+ér2c1as
+érc3c
+1ércd
+ér2cedé
+ér2c1emb
+ér2c1esz
+ér2c3h
+ér2cil
+ér2c1im
+ér2ciz
+ér2c1o
+ér2có
+ér2c1ö
+ér2cő
+ér2c3seb
+ér2c3sis
+ér2cú
+ér2cz
+ér2d1am
+ér2d1á2
+1érdekbő
+1érdeke.
+1érdekei
+1érdekel
+1érdekl
+1érdekt
+1érdekü
+1érdekű
+1érdemé
+ér2d1erő
+érd1este
+érdés3s
+ér2d1i2ná
+ér2d1iz
+ér1dra
+érdü2l
+ér2d1ülé
+ér2d1ülő
+ér2d3z
+ére2b
+ér1eba
+é2r1ebe
+é2r1ebé
+é2r1ebr
+ér1eff
+ére2g1a2
+ére2g1á
+ére2ged
+ére2gel
+ére2g1em
+ére2gen
+ére2g1e2r
+ére2gev
+ére2g1él
+éreg1g
+ére2gin
+ére2go
+ére2g1ö2
+é2r1e2gy
+éregyez1
+é2r1ej
+é2r1e2kén.
+é2r1elá
+é2r1e2leg
+é2relemz
+ér1e2lég
+é2r1elis
+é2r1elk
+é2r1elo
+é2r1e2lőa
+ére2lőir
+é2r1e2lől
+é2r1e2lőme
+é2r1e2lőn
+ér1elr
+ér1eltá
+ére2m1a
+ére2má
+é2rember
+ére2m1eg
+é2r1emel
+ére2mes
+é2r1e2més
+ér1e2mis
+é2reml
+ére2m1o
+ére2m1ó
+é2re2mu
+ére2n
+é2r1ene
+é2r1e2r
+ére2ső
+é2r1eső.
+é2r1esőb
+é2r1esőj
+é2r1esőn
+éres1ő2r
+é2r1esőt
+é2r1esté
+ére2t1a
+ére2tá
+ére2t1eg
+ére2t1el
+ére2t1ér.
+ére2t1é2ve.
+ér1e2ve
+é2r1e2vé
+é2r1é2d
+é2r1é2g
+é2r1éj.
+é2r1é2jét
+é2r1é2k
+é2r1é2l
+é2r1é2neke
+é2r1ép
+é2r1é2ri
+éré2s1el
+éré2sza
+éré2szá
+éré2ter
+é2r1étk
+ér1é2ve.
+é2r1évn
+ér1évv
+érfiá2
+ér1fl
+érfo2g1ón.
+érfo2g1ós
+érfoto1
+ér1f2r
+ér1g2r
+éri2al
+éri2csi
+é2r1ido
+érié2n
+ér1ifj
+éri2g
+é2r1iga
+é2r1ige
+é2r1i2ko
+é2r1ill
+é2r1i2ma
+é2r1i2má
+é2r1i2mi
+é2r1i2na
+é2r1ind
+é2r1inf
+é2r1ing
+é2r1inj
+é2r1ins
+é2rint
+ér1inv
+é2rinz
+é2r1i2o
+é2r1i2pa
+ér1ira
+é2r1isk
+ér1ism
+é2r1ist
+é2r1i2sz
+é2r1i2ta
+é2r1iva
+é2r1ivá
+é2r1i2z
+ér1íg
+ér1íj
+é2r1ín
+é2r1ír
+é2r1í2v
+é2r1í2z
+ér2jan
+ér1k2l
+érkö2z1e2pé
+ér1k2r
+ér1k2v
+érle2t1öl
+1érméé
+1érméj
+1érmék
+1érmi.
+é2r1o2l
+ér1ont
+éro2p
+ér1ope
+é2r1o2r
+ér1ott
+ér1ovi
+é2r1o2x
+éró2l
+ér1ólo
+ér1óri
+é2r1ö2b
+é2r1ö2c
+ér1öko
+é2r1ö2l
+é2r1öm
+é2r1ön
+é2r1ör
+é2r1ös
+ér1öt
+ér1öv
+é2r1ö2z
+érő1f2
+ér1pl
+ér1p2r
+1érsek
+ér1s2k
+ér1sl
+ér1s2p
+ér1s2r
+ér1s2t
+érsz2
+ér1szk
+ér2tat
+1értekez
+ér2t1ela
+1értelm
+1értesí
+1értékil
+1értékm
+értés3s
+ért1ö2ve
+1értőc
+1értőg
+1értőü
+ér1t2ran
+ér1trá
+ér1t2ren
+ér1t2ré
+1ér1t2ro
+ér1tró
+ér1uga
+é2r1uj
+éru2m1e
+éru2n
+ér1una
+é2r1u2r
+éru2s1ér
+ér1u2sz
+ér1uta
+ér1utá
+ér1u2to
+é2r1u2z
+é2r1új
+ér1ú2r
+ér1ú2s
+érú2t
+é2r1ü2g
+érü2ké.
+é2r1ür
+é2r1üs
+é2r1üt
+é2r1ü2v
+é2r1üz
+é2r1ű2z
+érv1a2dó
+érv1ala
+ér2v1a2n
+ér2v1á2gy
+1érvel
+ér2v1elem
+ér2v1égb
+ér2v1égh
+ér2vék
+ér2vél
+ér2vu
+2érzá
+1érzék.
+1érzékb
+1érzéké
+1érzékh
+1érzékk
+1érzékn
+1érzékr
+1érzékt
+1érzékü
+1érzékű
+1érzésil
+és1abl
+é2s1a2d
+és1agy
+és1ajt
+és1a2ka
+és1akl
+és1akn
+és1ako
+és1akt
+és1a2la
+és1alg
+és1alk
+és1all
+és1alt
+és1alv
+é2s1am
+és1ana
+és1ant
+és1a2ny
+és1apa
+és1apr
+és1ara
+és1a2rá
+és1arc
+és1aré
+és1arm
+és1arz
+és1asp
+és1ass
+é2s1a2u
+ésá2c
+é2s1ál
+és1árt
+ésá2s
+és1áta
+és1áth
+és1átl
+és1bl
+és1d2r
+ése2b
+é2s1ebé
+é2s1ef
+és1e2ge
+és1e2gy
+é2s1e2ke.
+é2s1e2kei
+é2s1e2kés
+é2s1eks
+é2s1ekv
+és1ela
+és1elá
+és1elb
+és1elk
+é2s1elm
+és1elo
+és1elr
+é2s1elvé
+és1elz
+és1ember
+é2s1e2mel
+é2s1eml
+ése2n
+é2s1ene
+é2s1eng
+é2s1eny
+é2s1e2p
+és1erő
+é2s1esz
+é2s1eto
+é2s1ev
+é2s1ex
+és1égb
+é2s1é2géb
+é2s1é2géé
+és1é2géh
+és1é2gén
+é2s1é2gév
+é2s1égh
+é2s1é2gi
+é2s1égn
+é2s1égv
+é2s1é2hen
+é2s1é2j
+é2s1é2k
+é2s1é2l
+é2s1ép
+é2s1ér.
+és1érb
+és1érc
+é2s1érd
+é2s1é2rem
+é2s1é2ren
+é2s1é2ré
+é2s1érh
+é2s1érl
+é2s1érn
+é2s1é2rő.
+é2s1é2rők
+é2s1é2rőv
+és1érr
+é2s1érte
+é2s1érté
+é2s1értő
+é2s1é2rü
+é2s1érv
+és1ész
+é2s1é2te
+és1é2ve.
+és1é2vet
+és1é2véb
+és1é2vét
+és1é2vév
+és1fl
+és1fr
+és1gr
+é2s1ic
+é2s1id
+é3sidet
+ésié2
+ési2g
+és1iga
+és1ige
+é2s1ikt
+é2s1ill
+é2s1imi
+és1imp
+és1ind
+és1inf
+é2s1ing
+é2s1int
+és1inv
+é2s1i2p
+é2s1ira
+é2s1i2rá
+és1iro
+é2s1i2s
+é2s1i2ta
+é2s1i2vá
+é2s1í2r
+é2s1ív
+és2katu
+és1kl
+és1k2r
+és1kv
+é1slág
+é2s1ob
+és1oko
+és1okt
+é2s1o2l
+é2s1om
+é2s1op
+2ésor
+és1org
+és1orn
+és1orv
+é2s1os
+é2s1ot
+és1o2v
+és1óc
+és1ó2l
+és1ón
+és1ó2r
+é2s1ö2l
+é2s1ön
+é2s1ös
+é2s1öt
+é2s1ö2v
+é2s1ö2z
+és1p2l
+és1p2r
+és2pri
+és1ps
+és1s2k
+és1s2p
+és1s2t
+éssz2
+és3szab
+és3szag
+és3szak
+és3szap
+és3szá
+és4szel.
+és3szere
+és3széle
+és3szf
+és3szi
+és3szí
+és3szo
+és3szó
+és3szö
+és3sző
+és3szt
+és3szú
+és3szül
+és3szű
+ést2r
+és1tra
+és1trá
+és1tré
+é1stru
+és1ud
+és1u2r
+é2s1u2t
+é2s1ú2t
+é2s1üg
+é2s1ünn
+é2s1ür
+és1ü2té
+é2s1üz
+ész1abl
+é2sz1a2d
+ész1agy
+é2szaj
+északá2
+észa2k1áz
+é2szakc
+észa2k1ü
+ész1ale
+ész1alg
+ész1all
+észa2n
+ész1ant
+ész1any
+észa2p
+ész1apo
+é2sz1a2r
+é2sz1as
+ész1a2to
+é2sz1au
+é2szaz
+2észá
+é2száb
+é2sz1á2g
+észá2l
+ész1állá
+és3záp
+ész1áram
+é2szárá
+ész1árán
+ész1árf
+ész1árk
+é2sz1árn
+ész1á2ru
+é2szás
+é2sz1á2t
+ész1á2z
+é2sz1e2ge.
+é2sz1e2gei
+é2sz1e2gy
+é2sz1ej
+észe2k1a2
+észe2ká
+ész1ekés
+észekö2
+észe2köv
+é2sz1ela
+é2sz1e2leg
+ész1e2lemb
+ész1e2leme
+ész1e2lemé
+ész1e2lemm
+ész1e2lemn
+é2sz1elk
+ész1előd
+é2sz1előr
+é2szelőz
+ész1ember
+é2sz1emi
+é2s3zené
+é2sz1eng
+é2sz1ep
+ész1e2rez
+ész1e2rén
+ész1erkö
+é2szerő
+ész1e2sete
+ész1eszt
+észeta2
+észe2t1ak
+észe2t1e2l
+észe2t1ér.
+észe2t1o
+észe2t1ör
+ész1e2ve
+é2sz1ex
+é2szég
+é2sz1ékt
+é2sz1é2l
+é2sz1é2p
+ész1éré
+é2széró
+é2szész
+é2sz1é2te
+é2sz1étk
+é2sz1i2d
+é2szif
+ész1i2ko
+é2sz1ikt
+é2sz1ill
+é2sz1im
+é2szina
+é2sz1ind
+é2sz1inf
+ész1ing
+é2sz1inté
+ész1io
+é2sz1i2p
+é2szira
+é2sziro
+é2szirt
+é2sz1i2s
+é2sz1ita
+é2sz1iz
+ész1í2j
+é2szír
+ész1í2vá
+ész1í2vé
+ész1í2vó
+ész1k2
+ész1okt
+észo2l
+ész1old
+ész1olt
+é2szop
+ész1ors
+é2sz1os
+é2sz1ot
+é2s3zón
+2észö
+és3zöld
+ész1ölt
+é2sz1ön
+é2sz1ös
+é2szöt
+ész1őrs
+ész1p2
+ész3su
+ész3sű
+észtés1s
+ész2tors
+észtorz1
+ész1tra
+ész1tri
+és3zul
+ész1ut
+ész1úrn
+é2sz1út
+é2sz1ü2g
+é2szünn
+é2szüt
+é2sz1ü2z
+é2szűz
+ész1z
+ét1abla
+ét1a2do
+ét1a2dó
+ét1adt
+ét1agg
+éta1gr
+étai2k
+é2t1ajk
+é2t1ajt
+ét1akc
+éta1kr
+ét1akt
+é2t1alj
+é2t1alk
+ét1als
+é2t1alt
+é2t1ani
+é2t1ann
+é2t1ant
+ét1anya
+ét1anyá
+é2t1aps
+é2t1arc
+é2t1arg
+ét1aszt
+état2
+ét1atom
+étaü2
+ét1azo
+ét1ábr
+é2t1á2g
+é2t1áll
+ét1á2rad
+ét1á2ram
+ét1á2rá
+é2t1á2ri
+é2t1á2rú
+ét1árv
+ét1áti
+é2t1átr
+é2t1átv
+ét1bl
+ét1dr
+étea2
+é2tedén
+éte2g1a2
+éte2gele
+éte2g1elv
+éte2ger
+éte2go
+é2t1e2ke.
+é2t1e2kei
+éte2la
+éte2l1á
+éte2l1e2l
+éte2l1er
+éte2l1ék
+éte2l1ér.
+éte2l1é2ren
+éte2léré
+é2telfog
+é2tellen
+éte2lo
+é2t1e2lől
+éte2l1ő2r
+é2t1e2mel
+étera2
+éte2rad
+éte2r1ag
+éte2r1á2
+éte2reg
+éte2rel
+étermo1
+é2t1erő
+éte2sik
+é2t1estün
+é2t1esv
+é2t1eszm
+ét1e2vi
+été2g
+ét1ég.
+ét1ége
+ét1égé
+ét1égn
+ét1égt
+é2t1é2j
+é2t1é2l
+é2t1é2ren
+é2t1é2ré
+é2t1é2ri
+é2t1é2rőt
+é2t1érte
+é2t1érté
+é2t1é2rü
+é2t1érv
+é2t1érz
+ét1észl
+é2t1étb
+é2t1é2té
+é2t1étn
+é2t1étr
+é2t1é2ves
+ét1fl
+ét1fr
+ét1gr
+é2t1i2d
+éti2g
+é2t1ige
+é2t1igé
+é2t1i2ko
+é2t1i2m
+é2t1ind
+é2t1inf
+é2t1int
+éti2p
+é2t1ipa
+é2t1irá
+ét1iro
+étis3s
+éti2sz
+é2t1i2vá
+ét1izé
+é2t1í2r
+é2t1í2v
+ét1kl
+ét1kr
+1étkű
+ét1kv
+étmeg1g
+ét1o2ká
+ét1o2ki
+ét1okm
+ét1o2l
+é2tola
+é2tolv
+ét1oml
+é2t1op
+ét1ord
+ét1org
+éto2ris
+ét1orm
+ét1ors
+é2t1óc
+ét1ó2ha
+ét1ón.
+ét1órá
+étö2k
+étö2l
+é2t1ömö
+é2t1ön
+étö2rül
+é2t1ös
+ét1ö2t
+ét1ö2v
+é2t1ö2z
+ét1őr.
+ét1őrb
+ét1őri
+ét1őrm
+ét1őrö
+ét1őrü
+é2t1ő2s
+é2t1ő2z
+étpen1
+ét1pf
+ét1pl
+ét1pr
+é1t2rafá
+ét2réf
+étro2m1é2
+ét1sl
+ét1sm
+ét1sp
+ét1st
+ét1t2r
+ét1udv
+é2t1ug
+é2t1uj
+étu2n
+ét1una
+ét1und
+é2t1u2r
+é2t1u2t
+ét1ú2s
+é2t1üg
+é2t1ür
+ét1üs
+é2t1üt
+é2t1ü2v
+é2t1ü2z
+étű2z
+é2t3ye
+é1u
+éu2ni
+éu2ta
+éu2tá
+éu2zs
+é1ú
+é1ü
+éü2gy
+éü2le
+éü2lé
+éü2lö
+éü2lő
+éü2rü
+éü2té
+éü2tö
+éü2tü
+éü2ze
+é1ű
+é2vad
+1évad.
+év1adó
+1évadr
+év1agy
+év1ajá
+é2v1a2la
+é2valá
+é2v1alk
+é2v1am
+é2v1a2n
+év1arc
+év1au
+év1ava
+é2v1a2z
+é2v1állo
+é2v1áta
+év1áth
+év1átk
+é2v1átr
+évá2z
+év1ázá
+1évbeo
+é2v1e2g
+1é2vei
+1é2vekt
+év1ela
+1évelf
+1é2v1eli
+é2v1ell
+év1eln
+é2v1elo
+é2velő
+é2v1els
+é2v1elt
+é2v1elv
+é2v1eng
+1é2venk
+1é2vent
+év1e2ri
+é2v1e2rő
+1é2vesb
+1évesé
+év1e2sés
+1évesf
+1é2vesi
+1é2vesk
+1é2vesr
+év1esté
+év1eve
+év1é2ge
+év1é2gé
+év1égr
+év1égt
+év1ér.
+év1é2ré
+évé2ri.
+év1érr
+é2v1érte
+é2v1érté
+évé1ska
+évé1s2p
+évé1stá
+év1gr
+évi2g
+év1iga
+é2v1igé
+1é2vih
+1é2vik
+1é2vim
+é2vin
+év1ind
+1évine
+1éviné
+év1ing
+év1int
+év1ism
+1é2vitő
+1é2viv
+é2v1ír
+1évkös
+év1kr
+1évny
+év1ok
+év1os
+év1ó2r
+év1ö2r
+év1ös
+év1öt
+1é2vőd
+év1pr
+év1sk
+év1st
+év1sz
+évsza2k1as
+évtá2r1a2d
+1évtő.
+év1ur
+év1új
+év1ú2t
+é2v1üg
+é2vük.
+é2vükb
+é2vüke
+é2vükh
+é2vüki
+é2vükn
+é2vükt
+é2vülj
+é2v1üt
+é2v1üz
+1évzá
+éz1a2d
+éza2gal
+éza2ge
+éz1a2j
+éz1akr
+é2z1a2l
+éza2n
+éz1any
+éz1a2r
+éz1as
+é2z1a2t
+éz1az
+é2z1á2g
+é2z1á2l
+éz1ásv
+éz1áz
+éz1bl
+éz1d2r
+éze2c
+éz1ece
+é2z1e2dé
+éz1e2gé
+éz1e2gy
+é2z1ela
+é2z1eld
+é2z1e2le
+ézel1en
+é2z1elf
+é2z1elh
+é2z1ell
+éz1előb
+éz1előé
+éz1előg
+éz1elői
+éz1előj
+é2z1e2lőké
+éz1előn
+éz1előp
+éz1elős
+éz1előt
+éz1előv
+é2z1els
+é2z1elv
+é2z1emb
+éz2en.
+éze2n1á
+éz1enz
+é2z1e2p
+éze2r1a
+éze2r1á
+éze2r1in
+éze2rip
+éze2ro
+éz1erő
+éz1e2rű
+éz1esz
+éze2ta
+éze2t1á
+éze2t1eg
+éze2t1e2kéh
+éze2t1el
+é2z1e2v
+é2z1ex
+é2z1é2d
+é2z1ég
+é2z1ék
+é2z1é2l
+é2z1ér.
+é2z1érc
+é2z1é2ri
+é2z1érm
+é2z1érp
+é2z1érté
+é2z1érz
+éz1fr
+ézgé2
+éz1g2r
+ézi2d
+éz1ido
+é2z1igé
+é2z1ill
+éz1imp
+éz1ind
+éz1ing
+é2z1int
+ézi2o
+éz1ion
+é2z1i2pa
+é2z1ipá
+é2z1i2r
+é3zire
+é3zirő
+ézis3s
+ézi2s1ú
+ézi2sza
+ézi2s3zá
+éz1i2ta
+é2z1i2vá
+éz1izm
+éz1izo
+é2z1izz
+éz1í2j
+éz1ír
+éz1í2v
+éz1íz
+ézkar2c3h
+éz1k2l
+éz1k2r
+éz1ola
+éz1old
+éz1op
+é2z1or
+éz1osz
+é2z1ox
+éz1öb
+éz1ö2k
+éz1ön
+éz1ör
+éz1ös
+éz1öt
+éz1ö2v
+ézőa2
+éz1őr.
+éz1pl
+éz1p2r
+éz3saj
+éz3sar
+éz3seb
+éz3ser
+éz3sik
+éz3sín
+éz3sod
+ézsó2
+é2z3sók
+ézs1ór
+éz3sö
+éz3spi
+ézs1s
+éz3sug
+ézs1ú2r
+é2z3sü
+éz3sz
+éz1t2r
+éz1ug
+éz1uj
+é2z1u2r
+éz1ut
+é2z1ü2g
+é2z1ür
+é2z1üs
+é2z1üt
+é2z1ü2z
+éz1űr
+éz3zsa
+2f.
+1fa
+faát1
+fa1b2ro
+fa2chi
+fac3hi.
+fa2c3ho
+fa1d2r
+faegyez1
+fae3lek
+fae2r
+faé2d
+fa1f2r
+fa1g2r
+fagyé2
+fa2gyék
+fa2gyol
+fa2győ
+fa2gyúr
+fai2d
+fai2s
+fa2j1a2l
+fa2j1az
+fa2j1ág
+fa2j1á2ru
+fa2j1egys
+fa2jelem
+fa2j1elk
+fa2jelm
+fa2j1eln
+fa2j1elv
+fa2j1es
+fa2j1ö
+fa2jő
+fajt2
+faj1tr
+faju2r
+faj1ura
+fa2jü
+fa1k2l
+fa1k2r
+fa1k2v
+fa2l1a2dá
+fa2l1a2dó
+fa2lajá
+fa2l1a2kó
+fa2l1a2l
+fala2n
+fal1any
+fa2lav
+fa2l1azú
+fa2l1ábr
+fa2l1ál
+fa2l1á2ro
+fa2l1áth
+fa2l1átv
+fal1e2gy
+fa2l1elem
+fa2l1elő
+fal1ese
+fa2l1éri
+fal1f2
+fa2lid
+fa2l1inj
+fa2l1iz
+fa2l1í2
+fa2l1ol
+fa2l1oml
+fa2lor
+fa2l1os
+fal1órá
+falö2
+fa2lök
+fa2l1öv
+fa2l1őr
+fal1p2
+fal2s1ín.
+falta2n
+fal2tem
+fal2tip
+fal2tüz
+fa2lü
+fa2n1e2vet
+fan1évb
+fan1évr
+2f1a2nya.
+faó2r
+fa1p2l
+fa1p2r
+fa2r1a2dá
+fa2ragy
+fa2r1a2kó
+fa2r1a2l
+fa2r1at
+fa2r1a2v
+fa2r1ácc
+fa2r1ál
+fa2r1á2z
+fa2r1em
+fa2r1e2pe
+fa2r1id
+fa2r1iná
+fa2r1ing
+fa2r1izm
+fa2r1izo
+far2k1al
+far2kol
+far2mál
+far2min
+far2m1unká
+fa2r1okke
+fa2r1osz
+fa2r1ut
+fa1s2k
+fa1s2p
+fa1sta
+fa1sté
+fa2sz1ív.
+fa1tri
+fau2r
+fau2s
+fau2tá
+faü2t
+faü2z
+fa2xe
+faxi2
+fa2x1ik
+fa2xin
+fa2xí
+fa2xö
+fa2xú
+fa2xü
+fa2xű
+fa1ya
+fa1ye
+1fá
+f1ábr
+fá2c3h
+fá2gép
+fáj2lak
+fáj2lá
+fáj2l1e2
+fáj2l1í2
+fá2ní
+fánka2
+fán2kar
+fán2ká
+fán2tad
+fán2t1a2g
+fán2tan
+fán2t1á2
+fán2t1e2
+fán2tis
+fán2tor
+fán2tö
+fá2po
+fá2ram
+f1á2rá
+fás3s
+fá2t1a2
+fá2t1á
+fá2te
+fá2t1érd
+fá2t1i2s
+fátmű1
+fá2t1ol
+fá2t1ü2
+fázi2s1ág
+fázi2s3z
+fba2l1
+fc2lu
+fd2ró
+1fe
+fe2aa
+fe2aá
+fe2ab
+fe2ac
+fe2ad
+fe2ae
+fe2aé
+fe2af
+fe2ag
+fe2ah
+fe2ai
+fe2aj
+fe2am
+fe2an
+fe2a1p2
+fe2ar
+fe2as
+fe2at
+fe2aú
+fe2av
+2f1e2dz
+fe2ed
+fe2el
+fe1f2r
+fe2gy1i
+fe2győ
+fei2n1i
+fe2ja
+fe2j1á2
+fe2j1egy
+fe2j1elm
+fe2j1e2r
+fe2j1esz
+fe2j1e2v
+fe2j1o
+fe2j1ös
+fej1tr
+fe2j1u
+fe2jú
+fek2t1emb
+fe2l1a2
+fe2l1á2
+fele2c
+fe2l1e2dz
+fe2l1e2g
+fe2l1e2h
+fe2l1elev
+fe2l1e2mel
+fe3lemen
+fe3lemet
+fe2l1e2més
+fe2l1eml
+fe2l1eng
+fe2l1enn
+fe2l1e2re
+fe2l1esd
+fe2lesed
+fel1eseg
+fe2l1e2sett
+fe2l1esés
+fe2l1esik
+fe2l1esk
+fe2l1esni
+fe2l1e2ső
+fe2l1essen
+fe2l1este
+fe2l1estü
+fe2l1e2sz
+fe2l1e2tes
+fe2l1e2tet
+fe2l1ettek
+fe2l1ettél
+fel1e2ve
+fel1e2vé
+fel1evi
+felé2d
+fe2l1éde
+fe2l1é2g
+fe2l1é2k
+fe2l1é2l
+fe2l1é2p
+fe2l1ér.
+fe2l1é2rek
+fe2l1éren
+fe2l1érh
+fe2l1éri
+fe2l1érj
+fe2l1érk
+fe2l1érn
+fe2l1érs
+fe2l1ért
+fe2l1érv
+fe2l1étet
+fe2l1i2
+fe3lib
+fe2l1í2
+fel3l
+fe2l1o2
+fe2l1ó2
+fe2l1ö2
+fe2l1őg
+fe2l1őr
+fel1p2
+felt2
+fe2l1u2
+fe2lú
+2f1e2ner
+fen2n1a2
+fen2ná
+fenne2
+fen2nev
+fen1sc
+fer1abl
+fe2rak
+fe2r1áll
+fe2r1á2r
+fere2g
+fer1egy
+fe2r1old
+fe2r1olj
+fe2r1oln
+fe2r1olt
+fe2sem
+fe2s1er
+2f1e2sé
+feu2m1é2
+fe2vő
+fe2z1ér.
+fe2zó
+fe2zs
+1fé
+féka2
+fé2k1ad
+fé2k1ag
+fé2k1al
+fé2kas
+fé2k1au
+fé2k1á2
+fé2k1e2g
+fék1ell
+fé2k1er
+fé2k1ék
+fé2k1é2l
+fé2k1ér.
+fé2k1o2l
+fé2k1or
+fé2kön
+fé2k1u2
+fé2k1ú
+fé2l1a2
+fé2l1á2j
+fé2l1á2r
+fé2leg
+fé2l1ekk
+fél1elé
+fé2l1ell
+fé2l1elő
+féle2m
+fél1emb
+fé2l1eme
+fé2l1e2r
+fé2l1ese
+fé2l1esz
+2f1é2let
+fé2l1ez
+fé2l1éva
+féligaz1
+fé2lin
+fé2lir
+fé2l1is
+fé2liv
+fé2lí
+fé2l1ok
+fé2los
+fé2ló
+fé2l1ö
+fé2lőr
+félpen1
+fél1t2r
+fé2l1ú2
+fé2mab
+fé2mad
+fé2m1a2g
+fé2m1a2j
+fé2m1a2n
+fé2m1ap
+fé2mau
+fé2maz
+fé2m1ác
+fé2m1ál
+fé2m1ec
+fé2medé
+fé2me2két.
+fé2m1e2l
+fé2m1emb
+fé2mer
+fé2mez
+fé2m1é2k
+fémé2r
+fé2m1éré
+fé2m1i2n
+fé2m1ir
+fé2m1is
+fé2mit
+fé2m1iz
+fé2mí
+fé2m1o
+fé2mó
+fé2mö
+fé2m1u
+fémü2
+fé2m1ül
+fé2ny1e2g
+fé2ny1e2l
+fé2ny1e2r
+fé2ny1is
+fé2ny1í
+fé2nyo
+fé2nyö
+fé2nyú
+fé2pí
+fé2pü
+2féraá
+2féraf
+2férai
+2féral
+2férar
+2férád
+2féráé
+2férám
+fér2cem
+fére2g1e2
+fé2s1orr
+fész1al
+fészá2
+fész1ár
+fé2szeg
+fé2sz1el
+féta3u2
+2f1évk
+fé2zs
+fézs1e2
+fézs1o
+ffe3li
+ffi2ac
+ffi2ag
+ffi2aka
+ffi2am
+ffi2at
+ffli2
+ff1sh
+1f2fy
+fg2ló
+1fi
+fi2aa
+fi2aá
+fi2ae
+fi2aé
+fi2af
+fi2ah
+fi2aí
+fia2la
+fi2ao
+fi2aó
+fi2aö
+fia1p
+fi2apa
+fia2ra
+fia2rá
+fi2aré
+fi2aszá
+fi2aszo
+fi2au
+fi2aü
+fi2avá
+fi2ave
+fiá2l
+fi2c3h
+fici2t1á
+fi2dan
+fi2d1á
+fi1drá
+fie2l
+fie2n
+fie2r
+fie2s
+fies1e
+fie2t
+fi1fl
+fi1fr
+2f1i2gaz
+fi1k2l
+fi1krá
+fi1kré
+fi1kri
+fi1k2v
+fi2lac
+fil1ada
+fil1akn
+fil1akt
+fi2lal
+fi2lam
+fi2l1ál
+fi2lár
+fil1elt
+fi2l1en
+fi2les
+fil1esz
+fil1ért
+fi2l1i2d
+fi2l1i2m
+fi2l1in
+fil2mad
+fil2mak
+fil2man
+fil2m1as
+fil2mat
+fil2m1á2
+fil2mos
+fil2mu
+fi2lö
+fi2lü
+2f1i2má
+fimeg1
+2f1i2nas
+2find
+fin1osz
+fi2n1ó
+fint2
+fin1tr
+fi2n1u2
+fi2nú
+2finx
+fio2v
+fi3ók
+fió2k1a2l
+fió2kar
+fió2k1e2
+fió2kép
+fió2kol
+fió2kö
+fió2r
+fiő2r
+fi1p2l
+fi1p2r
+fi2rod
+fis1arc
+fi1s2p
+fist2
+fi1str
+fi2t1ad
+fit1a2la
+fit1alj
+fi2tág
+fit1árak
+fitá2t
+fi2t1áta
+fi2t1éh
+fi2t1érd
+fi2tik
+fi2t1in
+fi2tir
+fi2t1i2z
+fito1p2
+fi2t1osz
+fi2tön
+fi2t1őr
+fi2t1ur
+fiu2min
+fiu2t
+fi2úa
+fi2úá
+fi2úe
+fi2úf
+fi2úg
+fi2úí
+fi2úl
+fi2úo
+fi2úö
+fi2úő
+fi2úp
+fi2úsz
+fi2úti
+fi2úu
+fi2úú
+fi2úü
+fi2x1ár
+fi2x1el
+fi2xö
+1fí
+fí2rá
+fírcsa2
+fí2r1in
+f1í2ró
+fír1tr
+fí2rü
+fjú1sz
+fki2s1
+fk2li
+fk2lu
+fk2ró
+f2lak
+f2lan
+f2lep
+f2lip
+fli2s1é
+flo2n1á
+flo2né
+f2lot
+f2luk
+1fo
+fo2am
+fo2g1á2c
+fo2gál
+fo2g1árk
+fo2g1áro
+fo2g1e
+fog3g
+fo2gí
+fo2g1or
+fo2g1os
+fo2gö
+fo2gur
+fo2gü
+fohá2szat
+fo2kal
+fok1áll
+fo2k1árr
+fo2k1e2
+fok1ing
+fo2kí
+fok1k2
+fo2kola
+fo2k1or
+folta2n
+fol2t1e
+fol2t1ö
+fo2n1ada
+fo2nado
+fo2nak
+fon1alap
+fona2l1e2
+fon1alja
+fon1aljo
+fona2n
+fon1any
+fo2n1asz
+fo2n1au
+fo2n1á2r
+fonás1s
+fo2n1át
+fond2
+fon1dr
+fo2neg
+fo2n1el1
+fo2ner
+fo2n1es
+fo2nék
+fon1f2
+fon1i2ko
+fo2n1i2m
+fo2nin
+fo2n1is
+fo2niz
+fo2ní
+fon1k
+fo2n1or
+fo2n1osz
+fo2nö
+fo2nő2
+fons2
+fon1st
+fon2t1i2n
+fontó2
+fon2tón
+fo2nü
+fonya1
+fo2r1ad
+forakész1
+fo2r1ala
+fo2r1a2n
+for1ato
+fo2reg
+fo2r1el
+fo2r1er
+forgás1s
+fo2r1il
+fo2r1i2o
+for2m1e2l
+for2m1em
+for2merő
+for2mes
+for2m1érté
+for2mil
+for2m1in
+fo2r1ol
+fo2rö
+2f1orrú
+fors2
+for1sp
+for2t1ál
+for2t1e2l
+for2t1érd
+for2tü
+fo2rü
+foto1s
+fo2vi
+1fó
+fó2rá
+fósza2
+1fö
+fö2la
+fö2lá
+föl2dök
+fö2l1e2
+fö3le.
+2f1ö2lésbel
+fö2liv
+fö2lí
+föl1k2
+fö2lo
+fö2ló
+fö2lön
+fölt2
+föl1tr
+fö2lu
+fö2lú
+fön2n1
+fönne2
+fö2sá
+1fő
+főa2n
+főá2g
+fő1bl
+fő1br
+fő1dra
+főe2l
+főe2r
+főe2s
+főé2h
+főé2te
+fő1fl
+fő1f2r
+fő1gl
+fő1gn
+fő1gr
+fői2d
+főigaz1
+fői2ta
+főí2t
+fő1kl
+fő1kv
+fő2n1ag
+fő2n1apj
+fő1pl
+fő1pr
+fő2r1aj
+fő2rem
+főre2s
+fő2r1ék
+főri2
+fő2r1is
+fő2rül
+főr1ülé
+fő1sl
+2fősö
+fő1sta
+fő1str
+fősz2
+fő1szl
+fő1szp
+fő1szt
+fő1t2r
+főü2l
+főzőé2
+fp2la
+fp2ro
+fra1s
+frá2ma
+frá2má
+frá2m1e2
+frá2nye
+f2rás
+f2resk
+fré2ná
+fré2nén
+1f2ric
+f3rich
+f2rig
+f3rip
+1f2ris
+fron2t1a2
+fron2t1e2
+f2röc
+f2rus
+fs2ho
+fs2po
+fs2tí
+fst2r
+ft1aj
+fta1kr
+ft1alj
+ft1bl
+f2t1ef
+fte2m
+f2t1eme
+f2t1ér.
+fti2g
+f2t1ige
+f2t1ing
+ft1ös
+ft1út
+f2t1üg
+ft1üt
+f2t1ü2z
+1fu
+fuga1
+fura2t1e
+fu2s1as
+fu2seg
+fu2sis
+fu2sz1á2
+fu2sz1ol
+fu2szü
+futókész1
+futó1s2p
+1fú
+fúj2tal
+2f1ú2ré
+2f1úrr
+fú2zs
+1fü
+2f1ü2gy
+fü2la
+fü2lá
+füle2c
+fü2l1eml
+fü2l1e2p
+fü2l1e2v
+fü2l1é2j
+fü2l1é2k
+fü2lí
+fül3l
+fü2lo
+2fülő
+fü2lőt
+fül3t2
+fü2ma
+fü2má
+fü2m1e
+fü2mo
+fü2mő
+fü2mú
+2f1ünn
+für2t1ő
+füstü2
+füs2t1ülé
+2f1ü2té
+2f1ü2tő
+2f1üzl
+1fű
+fű1dr
+fű1fr
+fű1pr
+fű1sr
+fűsze2r1el
+fű1t2r
+fű2zá
+fű2zis
+fű2zo
+fű2z1ölt
+fvárosé2
+1fy
+2g.
+1ga
+2g1abc
+2gabr
+2g1abs
+ga1by
+2g1a2dag
+g1adap
+2g1a2data
+2g1a2datb
+gadás1s
+2g1adm
+ga2dog
+2gadomá
+gadói2ko
+2gadósat
+2g1a2du.
+2g1a2duk
+gae2r
+2g1aff
+ga1fl
+ga2ga.
+2g1agg
+ga1g2rá
+g1agy.
+ga2gyu
+g1a2gyú
+2g1aján
+2g1ajk
+2g1ajt
+2g1a2kad
+ga2kác
+2g1akc
+g2a3ké
+2gakév
+ga1kl
+2gaknai
+g1aktu
+g1akv
+gala2g1ú
+ga2lat
+2galáf
+2galáí
+ga2láv
+2g1alb
+2g1alc
+gale2g1e2
+2g1alk
+galo2m1e
+3galop
+g1a2los
+2g1a2lud
+ga2lul
+ga2lusz
+2galvó
+ga2m1a2gá
+2g1amc
+2g1amp
+ga2nab
+2g1a2nal
+2gancs
+gan2csal
+gancs1ág
+gan2cse
+gan1d2
+3g2ané
+gan2ga
+g1a2nim
+ga2nyag
+ga2ny1at
+ganye2l
+ga2nyér
+g1a2nyó
+ga2nyö
+gaó2r
+ga2pa.
+ga2paá
+ga2pac
+ga2pas
+ga2pán
+ga2pát
+ga1p2l
+ga2pok
+ga2pó.
+ga2pób
+ga2pók
+ga2pón
+ga2póv
+2g1app
+ga1p2ré
+ga1pro
+gara2t1í
+2g1a2rák
+2g1a2rány
+ga2rén
+gar1k2
+ga2rő
+ga2seg
+ga2s1is
+ga2s1ín
+ga1s2pi
+ga1spr
+gas3sze
+gas3szí
+gast2
+ga1s2ta
+ga1sto
+ga1str
+gasz1agg
+ga2sz1an
+ga2szág
+ga2szás
+ga2sz1es
+gasz2tár
+ga2t1a2d
+gat1ará
+ga2tav
+ga2t1ál
+ga2t1á2ram
+ga2t1eg
+ga2tep
+gaté2s
+ga1thi
+ga2tim
+gat1old
+ga2tomi
+g1a2uk
+ga2ul
+ga2us
+ga2van
+ga2var
+ga2vat
+2g1a2vu
+gaza2n
+gaz1any
+gaza2te
+ga2zál
+3g2azd
+3g2aze
+ga2zer
+2gazg
+2gazítá
+gazmus1s
+2gazod
+2gazon
+ga2zü
+1gá
+g2ába
+2g1á2bé
+g2ábó
+2g1ábr
+3g2áci
+gács1a2va
+gá2cse
+gá2cs1il
+gá2csü
+gáda2
+gá2d1al
+gá2dá
+gá2d1él
+gá2d1ia
+gá2dis
+gá2dő
+gá2d1ü
+gá2fo
+2g1ág.
+gá2gak
+gá2gat
+gá2gaz
+2g1ágg
+2g1á2gi
+2g1á2gú
+2g1á2gy
+gágy1asz
+2g1á2hí
+g2ája
+g2ájá
+gá2j1e2
+gá2jü
+gála1p
+2g1álc
+2g1áldo
+gá2l1es
+g2áli
+3gális
+2g1áll.
+2g1állí
+2g1állu
+2g1álmo
+3g2ály
+g2ám.
+gá2mal
+gá2m1e2
+2g1á2mí
+gá2mü
+gána2
+gá2nac
+gá2nal
+gá2nap
+gá2n1at
+gá2nás
+gán2cse
+gán2csi
+gán2cs1ö2
+gán1d2
+gá2n1e
+2gángy.
+gá2nig
+gá2n1io
+gá2nis
+2g1á2niz
+gá2nol
+gá2n1ó2
+gán1sz2
+gánt2
+gán1tr
+gá2n1ú
+gá2nü
+gá2ny1a2n
+gá2nyar
+gá2ny1as
+gá2ny1e2
+gá2nyérd
+gá2nyérz
+gá2nyij
+gányká2
+gá2nyö
+gá2po
+gá2rad
+gá2r1ag
+gá2r1aj
+2g1á2ram
+gá2r1a2n
+gá2rar
+gá2ras
+gá2ra2t
+gár1ato
+gár1att
+gá2r1av
+2g1á2raz
+gá2rág
+gá2r1ál
+gá2r1á2z
+gá2re2
+gár1em
+gár1es
+gár1et
+gár1éte
+gá2rif
+gá2r1i2p
+gá2r1isk
+gá2r1ism
+gá2r1iz
+gá2rí
+2g1árnyé
+gá2r1ol
+gá2rop
+gár1ost
+gá2r1osz
+gáró2
+gá2r1ór
+gá2rö
+gá2rő
+gár1s2
+gár1tr
+2gáru.
+2g1árud
+gá2rug
+2g1á2ruh
+2g1á2rulá
+2g1á2ruló
+2g1árur
+2gárus
+gár1uta
+gár1utu
+gá2rúr
+gá2rút
+gá2rü
+gá2rű
+g2ás.
+gá2s1a2d
+gá2sal
+2gásatá
+gá2s1á2g
+gá2s1árad
+gá2s1árn
+2g1á2sás
+gá2s1á2to
+gá2s1e2
+gá2s1im
+gá2sis
+gá2sí
+gá2sor
+gá2só
+gás1ó2r
+gá2sö
+gá2ső
+gás3szé
+gás3szü
+gást2
+gás1tr
+gá2sut
+gá2s1ü2
+gá2sű
+gá2szal
+gá2szas
+gá2szatl
+gá2s3zav
+gá2sz1ál
+gá2sz1e2
+gá2szis
+gá2szit
+gá2szí
+2g1ászká
+gászkész1
+gá2sz1okta
+gá2sz1ól
+gá2s3zón
+gá2szöv
+gá2szü
+g2át.
+2gátad
+gá2taj
+2gá2tal
+gát1a2la
+gát1alj
+gátá2
+gá2tál
+gá2t1ár
+gá2tát
+2g1átbo
+gá2t1eg
+gá2t1e2l
+gá2t1e2m
+gá2ten
+gá2tél
+gáté2r
+gá2t1ér.
+gá2t1ére
+2gátfe
+2g1átg
+2g1átha
+gá2til
+gá2tis
+gá2tiz
+2g1á2tí
+g1átmé
+gá2t1olda
+gátó2
+gá2tór
+2g1á2t1ö
+gá2tő
+2g1áttű
+2gá2tü2
+g1átvi
+g2áva
+g1á2vó
+gá2z1a2d
+gáz1akn
+gáz1akt
+gá2z1a2l
+gá2zar
+gá2z1a2t
+gá2z1av
+gá2z1ár.
+gá2z1árá
+gáz1áre
+gá2z1árh
+gá2z1árk
+gá2z1árn
+gá2z1á2ro
+gá2z1árr
+gá2z1árt
+gá2záru
+2g1á2zásos
+gá2z1e2
+gázi2g
+gá2z1iga
+gá2zim
+gá2z1i2p
+gá2z1i2s
+gá2z1iz
+gá2zí
+gá2zö
+gá2ző
+gáz3sp
+gáz3sta
+gáz3ste
+gáz3sug
+gá2zsú
+gáz3sü
+gáz3sz
+gá2zü
+gbeá2
+gbé2lá
+gbé2rem
+gb2la
+gb2le
+gb2lo
+gb2lú
+gb2ra
+gb2ri
+gb2ro
+gb2ru
+gcsapá2
+gcsa2p1ág
+gda2u
+gd1ell
+gde1p2
+g2d1é2k
+g2d1ér.
+gd1ina.
+gd1ináb
+gd1ináh
+gd1inár
+gd1inát
+gd1ináv
+g1d2rá
+gd2re
+gd2ro
+gd1t2r
+g2d3zö
+1ge
+gea2c
+gea2g
+gea2l
+geá2r
+g2ebe
+g1e2cet
+3g2eci
+g1eddz
+2gedénn
+2gedény
+ge2dze
+ge2dzé
+ge2dzi
+ge2dző
+2g1eff
+2gege
+2g1e2gé
+3gegom
+ge2gye
+ge2gyé
+ge2gyo
+2g1e2gyü
+ge2hes
+ge2het
+2g1e2hü
+2g1ejt
+2g1e2ke.
+2g1e2kei
+2g1e2kek
+2g1e2kéé
+ge2kéj
+ge2kék
+2g1e2kés.
+ge1k2li
+2g1eks
+3g2el.
+g1elad
+ge2lag
+3g2elap
+ge2las
+ge2lál
+ge2l1ár
+2g1elcs
+3geld.
+2g1eldo
+2g1eldö
+ge2lef
+ge2legi
+g1elegy
+3g2elek.
+2ge2lemé
+ge2lemi
+2ge2lemk
+2g1e2lemm
+2g1e2lemz
+gele2n
+3gelend
+ge2l1eng
+ge2l1eny
+gel1este
+ge2lev
+ge2lég
+3g2elésb
+3g2elések
+3g2elésen
+3g2elésén
+3g2elésér
+3g2elésh
+3g2elési.
+3g2elésk
+3g2elésrő
+3g2eléss
+3g2eléstő
+3g2elésü
+2g1elész
+3gelész.
+3gelésző
+3gelészü
+3gelészv
+2g1elhel
+3g2elhes
+3g2elhet
+3g2eli.
+3g2elik
+gel1int
+3g2elj.
+3g2elje
+3g2eljé
+3g2eljü
+2g1elkü
+2gellenő
+2g1elmé
+2g1elnev
+3g2elnén
+3g2elni
+2g1e2los
+ge2lö
+3g2elő.
+ge2lőbbr
+3g2előbe
+3gelőbé
+3gelőbi
+3gelőbo
+3g2előbő
+3g2előc
+3g2előe
+3g2előé
+3g2előg
+3g2előh
+3gelőja
+3g2előjé
+3g2előjo
+3g2előjü
+3g2előjű
+3g2elők.
+3g2előka
+3g2előkb
+ge2lőkel
+3g2előker
+3g2előket
+3g2előkez
+3gelőké.
+3g2előkén
+2g1előkés
+3g2előkh
+3g2előki
+3g2előkk
+3gelőkl
+3g2előkn
+3g2előkö
+3gelőkő
+3g2előkr
+3gelőkt
+3gelőku
+3gelőkü
+2g1e2lől
+2g1előm
+3g2előn.
+3gelőna
+3g2előne
+3g2előné
+3g2előnk
+3gelőnö
+3gelőnyi
+3g2előo
+3gelőö
+3g2előő
+3g2előp
+g2előre.
+3g2előrés
+3gelőro
+3g2előrő
+3g2elős.
+3gelősá
+3gelőso
+3gelősö
+3g2elősza
+3gelősze
+3gelőszé
+3gelőszi
+3gelőszó
+ge2lőszö
+3g2előt.
+3g2előtá
+2g1előté
+3g2előtő
+3gelőtü
+3gelőü
+3g2elővá
+3g2előve
+3g2elővé
+3gelővis
+3gelőviz
+2g1e2lőz
+g1első
+3g2elsz.
+2g1elszá
+2g1elszo
+3g2elt.
+3gelte.
+3g2eltek
+3g2eltem
+3geltes
+2g1eltett.
+2g1eltettn
+3geltéb
+3g2elték
+3geltél
+2g1eltér
+3geltét
+2g1elto
+2g1eltű
+ge2lül
+3g2elün
+2g1elv.
+2g1elvb
+2g1elven
+2g1elvét
+2g1elvh
+2g1elvn
+2g1elvo
+2g1elvr
+2g1elvű
+2g1elvv
+ge2ly1e2g
+ge2lyid
+ge2man
+2g1ember
+2g1embl
+g1e2mel
+2gemelé
+2gemelk
+ge3mell
+2gemelő
+2g1e2més
+2g1eml
+ge2moc
+2g1emp
+gena2
+ge2n1ad
+ge2nar
+ge2n1as
+ge2nau
+ge2n1ál
+ge2nár
+ge2nát
+g2end
+ge2n1eg
+3generá
+ge2nere
+2generg
+ge2n1esz
+ge2n1e2vet
+ge2n1e2vez
+gené2k
+ge2n1éké
+ge2n1ékn
+ge2n1ékt
+geni2d1
+ge2n1in
+ge2n1is
+gen1k2
+g1enni
+g1ennü
+gen3nya
+ge2nop
+ge2n1or
+ge2n1os
+gen2sért
+gens3s
+gent2
+gen1tr
+ge2n1ur
+g2enye
+2g1enyh
+g1enyv
+2g1enz
+ge2ob
+ge2oc
+ge2of
+ge2ok
+ge2om
+ge2orgia
+ge2ot
+geó2r
+ge2ped
+ge2per
+ge2pés
+2gepi
+ge2pos
+ge2rab
+ge2r1ad
+ge2r1aj
+ge2ral
+ge2r1a2n
+ge2r1a2p
+ge2r1as
+ge2rau
+ge2ráb
+ge2r1á2g
+ger1áll
+gerá2r
+ge2r1ára
+ge2rát
+g1erde
+3g2ereb
+2geredm
+ge2reg
+g1erege
+ger1egy
+2g1e2rej
+ge2r1e2lők
+ge2r1eml
+ge2r1eny
+ge2r1er
+ge2resz
+ge2r1e2v
+ge2réj
+ge2r1ék
+ge2rél
+ger1éle
+ger1é2lé
+ge2r1ép
+ge2r1étt
+ge2r1i2na
+ge2r1ing
+ge2r1i2p
+ger2is
+ge2r1iz
+ge2rog
+ge2ror
+ger1osz
+ge2rot
+ge2ró
+ge2rök
+ge2r1ön
+ge2rő
+g1erő.
+g1erők
+g1erőv
+ger1őz
+geru2
+ge2rur
+ge2r1ü2g
+ger1üld
+ge2r1ü2lé
+g2es.
+ge2s1á
+ge1sc
+gesd2
+g2eseb
+3g2esei
+ge2s1e2l
+ge2s1emb
+g2esen.
+ge2send
+2g1e2s1er
+2g1e2setb
+2g1e2setet
+2g1e2seté
+ge2setl
+2g1e2setr
+2g1e2sett
+2g1esél
+2g1e2sés
+g1e2sik
+2geskü
+gesleg1
+g1esni
+2g1e2ső
+g2esr
+gess2
+3g2essé.
+3g2esség
+g2est.
+2g1este
+2g1esté
+2g1esti
+2g1estj
+g1esvé
+2g1e2szek
+ge2szes
+ge2szet
+g1eszl
+2g1eszm
+ge2t1ak
+ge2tal
+ge2t1a2ny
+get1ap
+ge2t1as
+get1e2gy
+2g1e2tetőn
+ge2t1é2k
+geté2l
+get1éle
+ge2t1ér.
+ge2t1é2rü
+ge2t1é2ve.
+getó2
+ge2t1ór
+getőkész1
+get1őrt
+ge1t2ró
+get2t1ebbé
+ge2tut
+ge2t1ü2z
+ge2ur
+geu2s
+ge2vic
+2gevo
+ge2vol
+2g1e2vő
+ge1yé
+ge2zo
+gezőa2
+2g1ezr
+1gé
+gé2ber
+2g1ébr
+géc3c
+gé2d1a2
+gé2d1á2
+gé2d1e2l
+gé2d1e2r
+gé2d1esz
+gé2dik
+gé2din
+gé2dir
+gé2dí
+gé2d1o
+gé2dö
+gé2d1ő2
+gé2d1u2
+gé2d1ú2
+gédü2
+gé2d1ülé
+gé2dű
+gé2d3z
+gé2gi
+gé2gő
+gé2gü
+2g1é2he.
+2g1é2hek
+2g1é2hen
+2g1é2hes
+2g1é2het
+2g1éhh
+2g1éhs
+2g1éj.
+gé2jért
+2g1éjh
+2g1éjj
+2g1éjs
+gé2kei
+g1é2kel
+g1é2kes
+gékes1s
+g1é2kez
+2g1éks
+gé2lál
+gé2lel
+2géles
+2g1é2let
+2g1é2lez
+gé2lén
+2g1élm
+gélvvá2
+gé2lya
+gé2lyá
+gé2lyeg
+gé2lyo
+gé2lyú
+gé2m1a2
+gé2m1á
+g2émb
+gé2m1eg
+gé2mel
+gé2mer
+gé2mér
+gé2m1o
+géna2
+gé2nab
+gé2n1ad
+gé2nag
+gé2n1al
+gé2n1an
+gé2n1ar
+gé2n1at
+géná2
+gé2n1ár
+gé2nát
+3g2énd
+gé2neg
+2génekes
+2génekl
+gé2n1e2l
+gé2n1e2r
+gé2n1e2t
+gé2n1é2g
+gé2n1in
+gé2ní
+g2énn
+gé2nó
+gé2n1ö
+gént2
+gé2nú
+génü2
+g2ény
+gé2ny1e2g
+gé2nyid
+gé2nyis
+gé2nyír
+gé2nyo
+gé2nyö
+gé2nyú
+3gép.
+gé2p1a2
+gé2p1á2
+gé2p1e2g
+3gépel
+gé2p1ell
+gé2p1esé
+gé2p1esz
+gé2pik
+gé2pí
+2g1épít
+gé2p1o2
+gé2pó
+gé2pö
+gé2pő
+3g2épp
+géptá2v
+gé2p1u
+gé2pú
+gé2pülé
+géra2
+gé2rag
+gé2rak
+gé2ral
+gé2r1an
+gé2rap
+gé2rar
+gé2ras
+gé2rá
+2g1érc.
+2g1érd
+gé2r1el
+gér1eml
+2géret
+2géré.
+gé2rie
+2g1é2rin
+gé2ris
+gérká2
+2gérl
+2gérm
+gé2ro
+gé2rö
+2gérő.
+2gérők
+2gérte
+2gérté
+2gérth
+g1érti
+g1értj
+g1értl
+g1értő.
+g1értőe
+g1értők
+g1értőv
+g1érts
+g1értv
+gé2r1u2
+gé2r1ú
+2g1érv.
+2gérvé
+2g1érz
+3gérzá
+gé2sar
+gé2seg
+gé2s1e2l
+gé2s1é2g
+gé2sim
+gé2s1o
+gé2só
+gés3sza
+gé2sza
+gés3zav
+gé2szá
+3gészítőü
+gé2sz1o
+gé2szó
+2g1é2tel
+gé2ter
+gé2tet
+2g1étk
+2g1é2to
+2g1étr
+2g1étt
+2g1év.
+2g1évb
+2g1é2ve.
+2g1é2ved
+2gévei
+2g1é2vek
+2g1é2ven
+2g1é2vet
+gé2véb
+2g1é2vén
+2g1é2vét
+2g1é2vév
+2g1évf
+2g1é2vi
+2g1évj
+2g1évk
+2g1évn
+2g1évr
+2g1évs
+2g1évt
+2g1évv
+gé2zan
+gé2zőr
+géz3s2
+gfala2d
+gfa2l1ada
+gfa2le
+gfi2úké
+gf2la
+gf2lo
+gf2ló
+gf2lu
+gfö2l1üle
+g1f2ra
+gf2rá
+g1f2re
+gf2rí
+g1f2ro
+g1f2rö
+gf2ru
+g2g1a2p
+gg1arc
+gga2s
+g2g1aszá
+g2g1aszó
+gge2lest
+ggés3s
+gg1i2ta
+g2g1iz
+gg1orv
+ggó2n
+g2g1óni
+ggős2
+g1g2raf
+g1g2ran
+g2gre
+gg2ro
+gg1sp
+g2g1ü2g
+g2gy
+g3gyak
+g3gyalá
+g3gyap
+g3gyara
+ggy1aro
+g3gyat
+g3gyár
+g3gyáv
+ggy1á2z
+ggy1e2lő
+g3gyeng
+g3gyep
+g3gyer
+g3gyérü
+g3gyil
+ggy1ol
+g3gyom
+g3gyor
+g3gyó
+g3gyö
+g3győ
+g3gyu
+g4gyút
+ggy1ült
+g3gyür
+g3gyű
+gha2d1e2
+ghajói2ko
+g2ham.
+g2hamb
+g2hame
+g2hamh
+g2hamm
+g2hamn
+g2hamr
+g2hamt
+gha2sábr
+g2hia
+1ghy
+1gi
+gi2aa
+gi2aá
+gia1b2
+gi2aba
+gi2abá
+gi2abi
+gi2abo
+gi2ac
+gi2a1d2
+gi2ae
+gi2aé
+gia1f
+gi2afr
+gi2a1g2
+gi2ah
+gi2aim
+gi2aí
+gi2aj
+gi2akar
+gi2akas
+gi2ala
+gi2alá
+gi2alé
+gi2am
+gi2anó
+gi2any
+gi2ao
+gi2aó
+gi2aö
+gi2aő
+gi2a1p2
+gi2ar
+gia1sz2
+gi2asza
+gi2aszá
+gi2aszem
+gi2aszé
+gi2aszf
+gi2aszi
+gi2aszo
+gi2aszó
+gi2at
+gia1t2r
+gi2au2
+gi2aú
+gi2aü
+gi2aű
+gi2av
+gi2az
+2gibr
+2g1i2dea
+2g1i2deá
+2g1i2deg
+gi2dei
+2gidej
+2g1i2deo
+2g1i2dé
+gi2dió
+2g1i2do
+2g1i2dő
+gi1fl
+gig1ad
+gig1ara
+gig1ass
+gig1au
+2gigaz
+gig1ál
+2g1i2ge.
+gig1e2c
+gig1eg
+gig1eh
+gig1eng
+gig1enn
+gige2r
+gig1ere
+gig1e2s
+gig1et
+gig1e2v
+gi2gé
+gig1éh
+gig1é2l
+gig1ém
+gig1é2ne
+gig1é2r
+2g1igéz
+gig3g
+gi2g1i2
+gi2gí
+gi2g1o2
+gi2g1ó2
+gi2g1ö
+gi2g1u
+gi2gú
+gi2g1ü
+gi2gű
+g1i2gy
+2g1i2ha
+2g1ihl
+2gijes
+gi2ker
+gi2kes
+3gile
+g1ill
+gi2ma.
+gi2man
+gi2máb
+2gimád
+gi2már
+2g1i2máz
+gi2me.
+2g1imp
+gina1p2
+gi2nas
+gi2n1á2z
+2g1ind
+3giné
+2ginf
+2g1inkv
+g1inná
+g1inni
+g1inno
+g1innu
+2g1inp
+2gins
+2g1inta
+3gintc
+2g1inte
+2g1inté
+g1inth
+g1inti
+g1intj
+g1intő.
+g1ints
+g1intu
+g1intv
+2g1inv
+2g1inz
+gi2one
+2g1ioné
+gi2ono
+gi2ot
+gi2óa
+gi2óá
+gi2óc
+gi2óe
+gi2óf
+gi2óg
+gi2óká
+gi2ókom
+gi2ól
+gi2ó1p
+gi2órá
+gi2ó1sp
+gi2óta
+gi2ótá
+gi2óú
+gi2óü
+gi2óz
+2g1i2pa
+3g2ips
+gip2sza
+gip2szá
+gip2szo
+gi2ram
+2g1i2rat
+2g1i2rá
+gi2rig
+2giro
+gi2rod
+2g1i2rón
+2g1irt
+g1isc
+2g1i2si
+2g1isk
+2g1isl
+2g1ism
+2g1isp
+2g1istál
+2g1iste
+2g1i2szá
+2g1i2szo
+gi2szu
+gi2tas
+g2itá
+2gitác
+3g2iti
+3gitte
+g1ittu
+2g1i2vad
+2g1i2vás
+g1i2vo
+2g1i2vó
+2g1i2zé.
+gi2zév
+2g1i2zo
+1gí
+gí2gé
+gí2ja
+gí2já
+gí2m1a2
+gí2má
+gí2né
+gí2ny
+gí2ra
+gí2rá
+gí2re
+gí2ri
+gí2ro
+gí2ró
+g1í2tész
+gí2vá
+gí2ve
+gí2vé
+gí2vo
+gí2vó
+gí2vü
+gí2ze
+gí2zü
+gí2zű
+gka2ró2r
+gké2p1e2l
+gkia3dóná
+gkiá2
+gkis1s
+gk2la
+gk2li
+gk2lí
+gk2lo
+gk2ló
+gk2lu
+gkö2zén
+gkö2z1ér
+gkővá2
+gk2ra
+gk2rá
+gk2re
+gk2ré
+gk2ri
+gk2rí
+gk2ro
+gk2ró
+gk2va
+gk2vó
+gla1p2l
+gla1s2t
+gla3t
+glá2sza
+gle2g1a2
+glege2l
+gle2g1elé
+gleí2
+gle2t1a2
+gle2tá
+gle2t1el
+gle2t1é2rőt
+gle2t1étn
+gle2tos
+gleü2
+glé2nyel
+g2lor
+1g2los
+glóó2
+glós2
+glőre2
+glő2reg
+glő2rel
+glő2ro
+gme2g1a2
+gme2g1e
+gme2g1é
+gmens1s
+gmen2sz
+gmus3s
+gna2d
+gn1ada
+g2n1a2j
+g2n1alk
+gna2pe
+g2n1a2r
+1g2náb
+1g2náh
+1g2nái
+g2nán.
+g2náná
+g2nára
+gná2s3z
+g2nát.
+g2nátó
+1g2náv
+gn1br
+gne2i
+g2n1e2l
+gne2m1e2l
+gne2sir
+gnes3s
+gne2szá
+gneto1
+gné2l
+g2n1éle
+gnév1a
+gné2v1á
+gni2g
+g2n1iga
+g2n1ing
+g2n1i2p
+g2n1i2r
+g2n1is
+gnit1a2
+gni2tel
+g2n1okt
+g2nol
+gn1olt
+1g2nora
+1g2nore
+1g2noré
+gn1ök
+gn1ös
+gn1pr
+gn1s2k
+gn1st
+gn1t2r
+g2núj
+gn1üg
+gn1üz
+1go
+go2áz
+go2be
+2g1obj
+2g1o2dú
+go2et
+g1o2ka.
+gok1a2d
+g1o2kai
+2g1o2k1a2l
+2g1o2ká
+goki2
+gok1ir
+goklá2
+2g1okm
+g1o2kok
+2g1o2kos
+g1o2kot
+2g1o2koz
+2g1okta
+2g1o2laj
+go2l1a2l
+2g1olda
+2g1oldá
+2g1oldó
+gol2f1a
+gol2f1e
+gol2fin
+go2lim
+go2l1ó2rá
+2goltalo
+2g1oltár
+2g1oltás
+2g1oltó.
+2g1oltv
+2golvad
+2golvas
+go2m1as
+3g2omb
+gom2b1árn
+gom2b1árt
+gom2b1e2
+3g2ome
+2g1oml
+go2n1a2to
+go2n1áll
+gonc3c
+gon2d1á2
+gon2d1ér.
+gondi2
+gon2dik
+gon2doks
+gon2d1or
+gon2dó
+go2n1e2
+gon2g1a
+gon2gál
+g2ono
+go2nol
+2g1onto
+go2nü
+go2nye
+go2od
+go2pá
+2g1o2pe
+gor1ass
+gorasz2
+gora1t2
+gor1áll
+2g1orc
+go2r1el
+2gorie
+2g1orm
+go2roz
+go2rö
+2gorz
+go2se
+go2sö
+2gosto
+2g1ostr
+g1osty
+go2sü
+go2s3za
+go2s3zá
+go2szó
+go2ua
+go2ub
+go2ud
+go2ur
+go2ut
+go2vác
+2g1o2ve
+go2xi
+go1ya
+go1yá
+1gó
+góa2d
+góá2g
+góá2r
+gó1bl
+gó2c3h
+gó2c1ol
+gócsapá2
+gócsa2p1ág
+gó2cü
+2g1ó2dán
+gó2div
+gó1dru
+gó1f2r
+góí2v
+gó1kl
+gó1kré
+gó2lar
+góle2l
+gól1elő
+gó2l1é2h
+gó2lí
+gó2lü
+2g1ó2nu
+góó2r
+gó1p2l
+gó1p2r
+g1ó2rad
+g1ó2ras
+gó2ráka
+gó2rár
+3g2óro
+3g2ósa
+gó2s1aj
+gó1s2ká
+gó1s2p
+gó1s2rá
+gós3s
+gó1s2ta
+gó1stá
+gó1str
+gó1sz2
+gó2s3zám
+gó2s3záras
+gó2s3zárá
+gós3zárú
+gó2tau
+gó2t1is
+gó1tré
+gó1tri
+3g2óval
+2góvod
+2g1ó2vó
+gó2vu
+3g2ózá
+3g2ózi
+3g2ózo
+3g2ózu
+1gö
+2g1öbl
+2g1ö2ko
+gö2ku
+2g1ö2lá
+2g1ölb
+g1ö2le
+2g1ölr
+3g2ömb
+göm2b1a
+gömbe2
+göm2bel
+göm2b1er
+2g1öml
+2g1ö2na
+g1ö2ná
+gö2ne
+gö2nö
+2gönt
+gö2ra
+3g2örb
+3g2örc
+gör2csa
+gör2csá
+gör2csel
+gör2cső
+3gördí
+3gördü
+2g1ö2re
+3g2örg
+3g2örn
+gö2rök
+g1ö2rü
+2görv
+gösé2
+gö2s1én
+2g1össz
+2g1ösz
+2g1ötl
+g1öv.
+g1övb
+g1ö2ve
+g1ö2vé
+g1övh
+g1övn
+g1ö2vö
+g1övr
+g1övt
+g1ö2vü
+g1ö2vű
+g1övv
+1gő
+gőa2n
+gőá2g
+gő1br
+gőe2l
+gőe2r
+gőé2b
+gő1fr
+gő1gl
+gő2g1ő2
+gői2ta
+gő1kl
+gő1kv
+gőnyá2
+gő1pl
+gő1pr
+2g1őr.
+g1őrb
+g1őrh
+g2őrit
+gő2riz
+2g1őrj
+g1őrk
+2g1őrl
+g1őrn
+gő2rök
+2g1őrr
+g1őrs
+g1őrt
+2g1ő2rü
+2g1őrz
+3gőrzősö
+gő2s1ep
+gő2sib
+gő1spi
+gő1sta
+gő2s1ü2v
+gő1tr
+gőu2t
+gőü2l
+gő2zát
+gő2zeg
+gő2z1e2k
+gő2z1e2l
+gő2z1o
+gőző2s
+gő2zsö
+gő2z3su
+gő2z3sű
+gő2zú
+gpe2c3h
+gp1e2lu
+gpia2c1i2o
+gp2la
+gp2lá
+gp2le
+gp2lu
+gpon2ga
+gpo2re
+gp2ra
+gp2rá
+gp2re
+gp2ré
+gp2ri
+gp2rí
+gp2ro
+gp2ró
+gp2rű
+gp2sz
+1graff
+grafo1
+gra2mad
+gra2maj
+gra2mal
+gra2m1a2r
+gra2m1as
+gram1a2z
+gra2m1á2
+gra2m1e2
+gra2m1érté
+gra2mik
+gra2m1in
+gra2m1is
+1grammj
+gramu2
+gra2mut
+1g2ra1p
+1g2raví
+grá2cs1i
+gráfa2
+1g2rá2f1an
+1g2ráfb
+grá2f1e2
+1g2ráffe
+1gráfid
+1g2ráfl
+1g2ráft
+grá2lát
+grá2l1e2
+g2ráná
+grán1d
+g2ráni
+grá2rá
+grá2r1i2p
+grá2s3za
+gre2e
+gren2d1ő2
+g2ril
+gril2l1a
+gri2s1á
+gris3s
+grisü2
+gri2süt
+g2ríz
+gróa2
+gróá2
+gró2f1a
+gró2fú
+gró1p
+1g2rup
+gság1g
+gsé2gel
+gs2ho
+gs2ka
+gs2ká
+gs2ko
+gsk2r
+gs2la
+gs2lá
+gs2li
+gs2má
+gs2mi
+gs2mu
+gs2ná
+gso2k1o
+gsors3s
+gs2pa
+gs2pá
+gs2pe
+gs2pé
+gs2pi
+gs2po
+gs2pó
+gsp2r
+gs2rá
+g1s2ta
+gs2tá
+gs2te
+gs2té
+g1s2ti
+g1s2tí
+gsto2
+gst2r
+g1stra
+g1stru
+gs2tu
+g1s2tú
+gsugá2
+gs2vé
+gsza2ké
+gsza2k1ü
+gszála2d
+gszá2l1ada
+gszá2li
+gszá2r1a2da
+g1sz2c
+gszé2t
+g1sz2f
+g1sz2k
+g1sz2l
+gsz2m
+g1sz2p
+gszt2
+g1sz2tá
+gta2g1ar
+gtag1g
+gta2n1ó2
+gtára2d
+gtá2r1ada
+gtermo1
+gtermosz2
+gté2rá
+gti2m
+gt2ra
+gt2rá
+gt2re
+gt2ré
+gt2ri
+gt2ro
+gt2ró
+gt2rö
+gt2ru
+gt2rü
+gtű2z1ő2r
+1gu
+gu2at
+gu2ay
+2g1u2bo
+gu2el
+gu2er2
+g1u2ga
+3g2ugg
+g1u2go
+2g1ugr
+gu2id
+gu2in
+gu2ir
+2g1ujj
+gula2te
+gula2t1í
+gu2ná
+2g1u2ni
+gu2nó
+gu2nu
+3g2urí
+gus1abl
+gu2sad
+gu2s1a2n
+gu2sas
+gu2sat
+gu2s1av
+gu2sál
+gu2s1e2
+gu2s1érté
+gu2sil
+gu2sis
+gu2s1í
+gu2sol
+gu2sor
+gu2s1ó2
+gu2sö
+gu2ső
+gus3s2
+gussz2
+gust2
+gu2sü
+gu2szá
+gus3zs
+gu2tac
+gu2tak
+gu2tal
+gu2tam
+gu2tan
+gu2tas
+gu2tat
+gu2taz
+2g1utc
+2g1u2tó
+gutó2d1o2ku
+2g1u2tu
+gu1ya
+1gú
+gú2ja
+gú2jí
+gú2ju
+gú2ny1e
+gú2ny1í2
+2g1úr.
+gú2ré
+gú2ri
+2g1úrn
+gú2ro
+2g1ú2sz
+2gú2t1a2
+2g1ú2t1á2
+2g1útb
+2g1útc
+2g1útd
+2g1ú2t1e2
+2g1ú2té
+2g1útf
+2g1útg
+2g1úth
+2g1ú2ti.
+2g1ú2tia
+2g1ú2tig
+2g1ú2tih
+2gútij
+2gútiko
+2g1ú2tina
+2gútiná
+2gútir
+gú2tis
+2g1ú2tit
+2g1ú2tiv
+2gútiz
+2g1útj
+2g1útk
+2g1útl
+2g1útm
+2g1útn
+2g1ú2to
+2g1útp
+2g1útr
+2g1úts
+2gútt
+2g1útv
+2g1útz
+gú2zi
+1gü
+gü2cs
+gü2dé
+gü2dí
+gü2dü
+gü2ge
+gügy1ér.
+2g1ü2gyi
+2g1ügyl
+2g1ügyv
+2g1üld
+gü2len
+gü2lep
+gü2lik
+gü2löm
+2g1ünn
+3g2ürc
+2g1ü2re
+3g2üri
+2g1ü2rí
+2g1ü2rü
+gü2te
+gü2té
+gü2ti
+gü2tö
+gü2tő
+gü2tü
+gü2ve
+gü2vö
+gü2ze
+gü2zé
+1gű
+2g1űr.
+2g1űrb
+gűre2
+g1űrh
+gű2ri
+2g1űrj
+2g1űrl
+2g1űrm
+2g1űrn
+2g1ű2rö
+2g1űrt
+gű2ru
+gű2rü
+gű2ze
+gű2zé
+gű2zi
+gű2zö
+gű2ző
+gva2s1u2
+gvá2gy1a2da
+gvá2nyan
+gvás1s
+gverés3s
+gvezé2rel
+gvé2nyel
+gvi2na
+gvó1s2
+g2y
+1gya
+gy1abl
+2gy1a2cé
+2gyadag
+gya2dal
+2gyadatb
+gy1a2dót
+2gyag.
+2gyagb
+gya2ge
+gya2gép
+2gyagg
+2gyagh
+gya2gis
+2gyagk
+2gyagn
+gya2g1ol
+2gyagt
+2gyagya
+gy1a2gyu
+2gy1aja
+2gy1akc
+2gyaknák
+2gyakt.
+2gyaktu
+gya2laj
+gyal1akt
+gya2lapo
+gya2lapp
+gy1alat
+2gyaláí
+gya2lel
+gya2lik
+gyan1ab
+gya2n1e
+2gy1a2nya
+gy1a2nyá
+gya2pak
+gy1a2páh
+2gyapái
+2gyapák
+2gyapám
+2gy1a2pán
+gy1a2pás
+2gyapátó
+2gyapjá
+gya2pón
+gya2pór
+2gyapp
+gy1aps
+gy1aran
+2gyaraw
+gyard2
+2gyardom
+gya2rel
+gy1argó
+3gyari
+gya2r1ón
+gya2r1ó2r
+gya2róv
+2gyarú
+2gyasak
+2gyasat
+2gyasra
+2gyaty
+2gyazá
+1gyá
+2gyábr
+2gy1ág
+gy1álc
+gy1áll
+gy1álm
+3gyám
+2gy1áp
+2gyáre
+2gyárf
+2gy1á2rok
+2gyárus
+2gy1árú
+gyá2szó
+2gyáta
+2gyátk
+gy1átl
+2gyátv
+gy1bl
+gy1br
+gy1dr
+1gye
+gye2d1ős
+2gy1e2dz
+gy1e2ge
+gy1e2gé
+gy1e2gye
+2gyeke.
+2gy1e2kés
+2gyeleg
+gye2legy
+2gyelemű
+2gyelnö
+2gyeltér
+2gy1elvá
+gy1elvű
+2gyembl
+2gy1e2mel
+gy1eml
+2gyenget
+2gy1e2ny
+2gyenz
+gye2pal
+2gy1erd
+gy1e2red
+2gyerej
+gy1e2res
+gye2rén
+2gy1ern
+2gyero
+2gy1e2rő
+2gy1ers
+gye2seg
+2gyesél
+2gyesg
+gy1e2ső
+2gy1este
+2gyestés
+2gy1esti
+2gyestű
+gye2szü
+2gyetem
+2gyetet
+2gyezm
+2gyezrede
+2gyezrel
+2gyezs
+1gyé
+2gyébr
+2gy1ég
+2gyéhes
+2gyéhs
+2gyéji
+gy1é2ke.
+gy1é2kes
+2gy1é2le
+2gy1élt
+gy1élv
+3gyém
+2gyéneke
+2gyéni
+2gy1ép
+2gyér.
+2gy1érd
+2gy1érem
+2gyérez
+gyé2rét
+gy1érg
+2gy1érh
+2gy1é2ri
+3gyérí
+gy1érke
+2gy1érm
+2gyérn
+2gyérr
+2gy1érte
+2gy1érté
+gy1értő
+2gy1érv
+2gy1érz
+2gy1été
+2gyétk
+2gyév.
+2gyévad
+2gyévb
+2gyéve.
+2gyévei
+2gyévek
+2gyéven
+2gyéves
+2gyévet
+2gyévh
+2gyévi
+2gyévn
+2gyévr
+2gyévt
+2gyévü
+2gyévv
+gy1fl
+gy1f2r
+gy1gl
+gy1gr
+1gyi
+2gy1ide
+2gyidé
+2gyidő
+2gyiga
+2gyigá
+2gy1ige
+2gy1i2gé
+2gyigm
+gy1iha
+2gyiker
+2gy1ill
+2gyimá
+2gyind
+2gyinf
+2gy1ing
+2gy1ipa
+2gy1i2rat
+2gyirá
+2gy1iro
+2gyirt
+2gyish
+gy1isk
+2gyism
+2gy1isn
+2gy1ita
+2gyivó
+2gyizg
+2gy1i2zo
+1gyí
+2gy1íg
+2gy1í2r
+2gy1ív
+gy1íz
+gy1kl
+gy1k2r
+gy1kv
+gymás1s
+1gyo
+2gyokos
+2gy1old
+2gyolvas
+gyo2m1as
+gyo2mi
+2gyope
+2gy1orc
+gy1orm
+2gyorsó
+2gy1orv
+gy1ou
+1gyó
+2gyódár
+2gyódásak
+gy1ó2rá
+2gyóri
+1gyö
+2gy1öb
+gy1ödé
+2gy1ökl
+2gyötöd.
+2gyötödd
+2gyötöde
+2gyötödé
+2gyötödne
+2gyötödöt
+2gyötödr
+2gyötödü
+2gyött
+2gyötv
+2gyöv
+2gyözön
+1győ
+gy1őre
+gy1őrü
+2gy1ő2s
+3győz
+gypárba2
+gypen1
+gy1pl
+gy1pr
+gy1ps
+gyrövid1
+gy1sc
+gy1sk
+gy1sl
+gy1sm
+gy1sn
+gy1sp
+gy1sr
+gy1s2t
+gy2sur
+gy1t2r
+1gyu
+2gy1ud
+2gy1ug
+2gy1uj
+2gyund
+2gyuni
+2gy1u2ra
+2gyurá
+2gyuru
+1gyú
+2gyúd
+2gyúé
+2gyúi
+2gyújí
+2gyújr
+2gyújs
+2gyúm
+2gyúrb
+2gyúré
+2gyúri
+2gyúrk
+2gyúrr
+gy1úti
+2gyúü
+1gyü
+2gy1üd
+2gyüg
+3gyüle
+3gyüm
+2gyünn
+2gyüre
+2gyürü
+2gyüs
+gy1üst
+2gyüt
+2gyüv
+gy1üve
+2gy1üz
+1gyű
+3gyűl
+2gyűré.
+2gy1ű2z
+gy1zr
+gza2táp
+gza2t1e
+gza2tö
+gza2t1ű2
+gzá2r1ó2r
+gzá2se
+gzás3s
+gze2t1a2
+gze2t1á2
+gze2t1el
+gze2tin
+gze2t1o
+gze2t1ő2
+gzőa2
+2h.
+1ha
+haa2d
+3hab.
+ha2bak
+ha2b1a2l
+ha2b1a2n
+ha2b1ág
+ha2b1árb
+ha2bed
+ha2b1ér.
+ha2bid
+hab1ill
+ha2b1im
+ha2b1i2na.
+ha2b1int
+3habo
+hab1old
+hab1o2ra
+hab1orr
+ha2b1ost
+hab1sz
+habu2r
+ha2bü
+ha2d1ag
+had1alk
+ha2d1ap
+hada2s
+ha2d1asz
+ha2d1á2c
+ha2d1ál
+hadás1s
+ha2d1ásv
+ha2d1á2szo
+ha2deg
+ha2d1el
+ha2dem
+ha2dél
+hadia2
+hadié2
+hadi2n
+ha2d1ina
+ha2dor
+ha2dos
+ha2d1u2r
+ha2d1úr.
+ha2d1ú2ré
+ha2d1úrh
+ha2d1ú2ri
+ha2d1úrk
+ha2d1úrn
+ha2d1úrr
+ha2d1úrt
+ha2dús
+ha2dü
+ha2dza
+ha2d3zá
+hae2r
+ha1fl
+ha1f2r
+2hagore
+ha2if
+ha2j1á2s
+ha2j1á2to
+ha2jáz
+ha2j1in
+haj1k2
+haj1oml
+ha2jö
+ha2jő
+haj1s
+haj1t2r
+ha2jü
+ha2k1ál
+ha1k2li
+ha1k2r
+h1akt
+ha1k2v
+ha2l1ach
+ha2l1a2g
+ha2l1aj
+ha2l1a2l
+hala2n
+hal1any
+ha2l1a2r
+hala2sz
+ha2l1asza
+ha2l1aszá
+ha2l1aszó
+ha2l1atk
+ha2l1a2tom
+ha2l1att
+3halá
+hal1á2cs
+ha2l1á2g
+halá2l1e2
+hal1á2rak
+hal1á2rá
+ha2l1árb
+ha2l1á2ro
+ha2l1árr
+hal1árve
+hal1áte
+ha2leb
+ha2lec
+hal1e2gy
+hale2l
+hal1ele
+hal1elő
+ha2lem
+ha2l1en
+hal1epe
+ha2l1ese
+ha2l1e2ső
+hal1ete
+hal1e2to
+hal1evo
+hal1e2vő
+ha2lez
+ha2l1é2l
+ha2l1ér.
+ha2l1éte
+ha2l1étk
+ha2l1étt
+ha2lid
+ha2l1ik
+ha2l1i2m
+ha2l1ing
+ha2l1inv
+ha2l1i2ono
+ha2l1i2ont
+ha2lip
+hali2s
+hal1isz
+ha2l1iv
+ha2l1i2z
+ha2lí
+hal2k1a2pu
+halke2l1
+hal2k1ele
+hal2l1aszt
+hallás1s
+hal2l1á2t
+hal2léj
+hal3ly
+3halm
+halma2z1ó2
+ha2l1ol
+ha2l1ó2ri
+ha2l1ö
+ha2l1ő2
+hal1p2
+ha2l1ug
+ha2l1u2s
+ha2l1u2t
+ha2lü
+ha2lű
+ha2l3ya
+ha2m1ál
+ha2m1árb
+hamb2
+hame2l
+ham1ele
+ham1esz
+ha2mez
+ham1ism
+hamkész1
+ha2m1osz
+3hamu
+ha2mü
+hanás1s
+han2ch
+2hanész
+3hang
+han2gal
+hange2
+han2gen
+han2g1es
+han2gél
+hang3g
+han2g1ó2
+han2gö
+han2gut
+han2t1ó2
+ha2nyél
+haó2r
+ha1p2r
+hara2g1ó2
+harang1g
+ha2r1ál
+har2c1al
+har2can
+harc3c
+har2c1e2
+har2c3h
+ha2rel
+ha2ret
+3harmó
+ha2r1ol
+ha2r1osz
+ha2r1ór
+ha2rű
+3hasa
+haság1g
+ha2s1iz
+ha2s1ol
+has1ors
+ha1s2pe
+ha1s2po
+ha3s2út
+ha2sür
+ha2s1ű2
+ha1szp
+ha2t1ab
+hat1agy
+ha2t1aj
+3hatá
+határa2d
+határ1ada
+ha2t1e2v
+ha2t1én
+ha2t1é2v
+ha2t1í2v
+hat1olda
+ha2t1osz
+ha2t1órá
+ha2t1ö2v
+ha1t2rá
+hatt2
+hat1tr
+ha2tül
+ha2ue
+hau2n
+hau2s
+ha2ut
+haü2z
+1há
+3hábo
+há2gy
+há2jús
+háma2
+há2m1al
+há2m1á
+há2m1e2
+hámi2
+há2m1is
+há2m1ol
+há2mö
+hán2cs1e
+hán2csi
+há2ny1a2l
+hánya2n
+há2ny1ar
+hányás1s
+há2ny1e2
+há2nyö
+hára2
+há2r1ad
+há2r1al
+há2r1au
+hári2
+há2r1iv
+3hárí
+hár1k2
+hármas1s
+háro2m1a
+háro2mo
+hár2s1al
+hár2se
+3hárt
+há2rü
+há1ry
+há2sí
+hász1a2tom
+há2sz1e
+há2sziv
+2h1ászka.
+há2sző
+hát1a2dó
+há2t1a2la
+há2t1a2n
+há2tar
+há2táp
+há2t1e2
+háté2
+há2tél
+há2t1ér.
+há2t1ére
+há2t1érn
+há2t1i2s
+há2tí
+há2t1ol
+há2t1o2r
+hátó2
+há2t1ós
+há2tö
+há2tő
+hát1u2sz
+há2t1ü
+há2tű
+hátvé2d1el
+há2z1a2dó
+há2zaj
+há2z1ala
+há2z1asz
+há2z1av
+há2z1á2p
+há2z1árn
+há2z1á2ru
+há2z1e2
+há2z1isk
+há2z1ism
+há2z1ist
+há2z1í
+ház1okt
+ház1old
+há2zos
+ház1otth
+há2zö
+há2ző
+házs2
+há2z3sa
+ház3se
+há2z3sé
+há2z3si
+ház3sp
+ház3st
+ház3sü
+ház3sz
+há2z1ü
+há1zy
+hb2le
+1he
+he2ad
+he2av
+hec2c1emb
+hecc3s
+2hecu
+he2dén
+he2e2s
+he2f1i
+he2f1u2
+he2g1a2
+hegész1
+he2gy1a
+he2gyá
+he2gyeg
+hegyes1s
+he2gy1o
+he2gyó
+he2győ
+he2gyú
+2heidp
+2h1e2kék
+3hekt
+he2lég
+helés1s
+2helf
+hel2fr
+2hellá
+2hellen
+he2lyeg
+he2lyeml
+he2lyesz
+he2ly1é2j
+2hema
+2h1embl
+2h1eml
+henés1s
+3heng
+he2ny1e2ge.
+he2nyo
+he2ol
+he2rab
+he2r1a2d
+he2r1aj
+he2r1a2r
+he2rau
+her1áll
+her1át1a2
+her1áté
+her1eng
+here1p
+her1ese
+herevíz1
+her1int
+he2rö
+her1s2
+he2rut
+he2rű
+he2s1a
+he2s1á
+h1e2sés
+hes2t1o
+3hety
+2heusz
+2hevé
+he2vés
+3heví
+he2z1á
+2hezh
+2hezi
+2hezn
+2hező
+2hezz
+1hé
+hé2hé
+3héi.
+3héit
+héje2
+hé2j1eg
+hé2j1el
+hé2jö
+3hékn
+hé2nal
+hé2nan
+hé2nar
+hé2nát
+héne2
+hé2n1el
+hé2nem
+hé2n1et
+hén1év.
+hé2nid
+hé2nil
+hé2n1is
+hén3n
+hé2nö
+hént2
+hé2nu
+hé2nü
+hé1ph
+hé2pü
+héra2
+hé2rar
+hé2r1as
+hé2rat
+hé2rin
+2h1érz
+hé2szá
+hé2szeg
+hé2szesz
+hé2sz1ö
+héta2
+hé2t1ab
+hé2t1aj
+hé2tal
+hé2tar
+hé2tál
+hé2t1e2l
+hé2t1e2m
+hé2t1es
+hé2t1ezres
+hé2t1é2v
+hé2tí
+hé2tol
+hé2tor
+hé2t1os
+hétó2
+hé2t1ór
+hé2t1ö
+hé2tu
+hé2t1ü2
+hé2v1á
+hé2ve.
+hé2vég
+hé2v1érz
+héze2
+hé2z1ek
+hé2zio
+hé2zip
+hézo2
+hé2z3s
+hf2ló
+1hi
+2hia.
+hi2aa
+hi2aá
+hi2abelie
+hi2ac
+hi2ad
+hi2ae
+hi2aé
+hi2ag
+hi2ah
+hi2aj
+hi2al
+hi2am
+hi2ant
+hi2ap
+hi2ar
+hi2at
+3hida
+hidro1s
+2hiév
+higa2nye
+3higi
+2hila
+2him.
+2hime
+2himé
+2h1i2nán
+3hinás
+2hing
+h1ing.
+2hink
+h1insp
+hi2om
+hi2pa
+2h1ips
+2hise
+hi2se.
+2hisn
+2hiso
+hi2ta
+hit1ak
+hita2l
+hit1a2n
+hi2t1á2
+hi2t1e2gy
+3hitel
+hite2l1e2l
+hi2t1elesé
+hi2t1elő
+hi2t1elve.
+hi2t1eng
+hi2t1er
+hi2t1esz
+3hitet
+hi2tél
+hi2t1ér.
+hi2t1érte
+hi2t1érv
+hi2t1é2te
+hi2t1é2ve.
+hi2t1im
+hi2t1int
+hitkész1
+hi2t1o
+hitó2
+hi2t1ón
+hi2t1ór
+hitö2
+hi2t1ör
+hi2t1őr
+hi2t1u2
+hi2tú
+hi2tül
+hi2zo
+1hí
+hí2da
+hí2dá
+hí2de
+hí2dí
+hí2dö
+hí2dő
+hí2dú
+hí2dü
+hí2dz
+hí2g1e
+hí2jé
+hí2m1a2
+hí2má
+hí2m1el
+hí2m1emb
+hí2mer
+hí2mo
+hí2mö
+hí2mu
+hí2r1a2
+hí2r1á2
+hí2r1ing
+hí2rí
+hí2r1o
+hí2r1ó2
+hí2rő
+hír1s
+hí2r1u
+hí2rú
+hkas3s
+hká2r
+hk2ri
+hle2g1e2lé
+hle2t1el
+hle2tö
+1ho
+ho2dú
+2ho2eá
+ho2ef
+ho2ii
+ho2it
+2hokl
+hola2
+ho2l1ad
+ho2l1al
+ho2lam
+ho2l1at
+ho2l1au
+ho2l1ál
+ho2l1á2r
+hol2dá
+hol2dem
+hol2d1ó2r
+ho2l1e2
+ho2lig
+ho2l1in
+ho2lip
+ho2l1i2v
+hol1k2
+hol2mes
+hol2nik
+ho2lor
+ho2l1osz
+ho2lot
+ho2l1ó2r
+ho2lö
+holta2n
+holt1any
+holte2
+hol2t1el
+ho2lü
+ho2ly1al
+3homb
+3homo
+homo1s
+ho2n1a2g
+ho2n1a2l
+ho2n1a2n
+ho2n1a2p
+ho2n1au
+ho2n1a2v
+ho2n1ál
+ho2n1át1a2
+ho2n1á2to
+hone2
+ho2neg
+ho2n1el
+ho2n1ik
+ho2n1i2m
+ho2ní
+ho2n1orj
+ho2n1o2ro
+ho2n1orr
+ho2n1ó2
+ho2nö
+ho2nő
+ho2nü
+hor2d1e2
+ho2re
+2ho1ry
+hossz1e2
+hosszé2
+hossz1ék
+hossz1ü2
+2hosz
+ho1th
+ho2us
+ho2we
+ho2zál
+ho2z1e
+hozi2
+ho2zü
+1hó
+hóa2k
+hóá2g
+hó1bl
+hó2cal
+hó2cat
+hóc3c
+hó2cel
+hó2c1é2g
+hó2c3h
+hó2cim
+hó2có
+hó2c1ö
+hó2csü
+hó2cz
+hó2d1a2ra.
+hó2d1a2rá
+hó2d1á2
+hó2dem
+hó2d1é
+hó2d1ó2
+hó2dö
+hó2dü
+hó2d3z
+hó2l1ej
+hó2l1e2ped
+hó2l1e2vet
+hó2nal
+hón1apa
+2hórá
+hó2rár
+hó1sh
+hóví2
+hóza2t1e
+1hö
+hökö1
+höl2gya
+höl2gy1á
+höl2gyel
+1hő
+hőa2n
+hő1br
+hőe2l
+hőe2m
+hőe2r
+hőé2n
+hő1fl
+hő1gl
+hő1gr
+hő1kv
+hő1pr
+hősa2
+hő2s1al
+hő2sas
+hő2s1av
+hő2s1el
+hő2sep
+hő2ses
+hő2sim
+hő2sis
+hő1s2pi
+hős3s
+hő1s2tab
+hős1tr
+hő2sut
+hő2s1ú
+hő2s1ült
+hő2s1ü2v
+hősű2
+hő2s1űr
+hő1tr
+hőü2l
+hp2la
+hp2ra
+hp2ré
+hp2ri
+hp2ro
+hp2ró
+hru1s2
+hs2ch
+hsé2gel
+hs2ka
+hs2pi
+hs2po
+hs1s2t
+hsza2ké
+hszá2j1a2da
+hsz2l
+ht1cl
+ht1kl
+h2t1ol
+ht2rá
+h1tref
+h2t1u2t
+1hu
+hu1hy
+2hurá
+hur2t1e
+hur2tit
+2hus.
+2husi
+huszon1
+1hú
+hú2gy1a2
+hú2gye
+hú2gyi
+hú2gyú
+hú2r1a2
+hú2r1á
+hú2re
+húrt2
+húr1tr
+hú2s1ak
+hú2sal
+hú2san
+hú2sap
+hú2sar
+hú2s1á2g
+hú2s1ál
+hú2s1e2
+hú2sim
+hú2sí
+hú2sor
+hú2sö
+hú2ső
+hús3szak
+hús3szá
+hús3szé
+hú2sü
+hú2s3zab
+hú2sz1ál
+hú2sz1e2
+hú2sz1í2
+hú2szol
+hú2szos
+hú2sz1ó2
+hú2sz1ü2
+1hü
+hü2gy
+2h1ünn
+hü2re
+hü2rü
+hü2tő
+h1ü2vö
+1hű
+hű2ré
+hű2ri
+hű2rö
+hy1ér
+hy1év
+hy1ig
+2i.
+i1a
+iaa2d
+iaát1
+iaáta2
+i2abaj
+i2aber
+i2abes
+i2abí
+i2abon
+i2abor
+i2abö
+i2abő
+i2abu
+i2abú
+i2abü
+i2abű
+ia2c1al
+iac3c
+i2acet
+iac1élé
+ia2c1ér.
+ia2c3h
+ia2cid
+iac1i2ko
+ia2c1im
+ia2c1int
+i2ací
+ia2c1or
+ia2có
+ia2cö
+ia2cő
+ia2c3sé
+iac3sp
+iac3st
+iac3sz
+ia2cü
+ia2cz
+iadás1s
+i2ade
+i2adí
+ia2dot
+ia2dóe
+iadó1st
+i2adö
+i2adő
+i2adú
+iae2l
+iae2r
+iae2t
+iaé2r
+i2afá
+i2afe
+i2afi
+i2a1fl
+i2afó
+i2afö
+i2afő
+i2afri
+ia1fro
+i2afu
+i2afú
+i2afü
+i2afű
+i2agá
+i2age
+i2agé
+i2agi
+i2agö
+i2agő
+i2agu
+ia2gyu
+i2aig
+i2aip
+i2ai2z
+ia2ján
+i2aje
+i2ajo
+ia2kad
+i2aká
+i2ake
+i2akí
+i2a1k2l
+i2akód
+i2akór
+i2akö
+i2akő
+ia1k2re
+ia1k2ré
+ia1k2ri
+ia1krí
+i2aku
+i2akú
+i2akü
+i2a1kv
+ia3lan
+ia2lat
+i2aleg
+i2alib
+i2alí
+ia2lom
+i2alö
+ia2lud
+ia2lus
+i2aly
+i2amá
+i2ame
+i2amó
+ia2m1ur
+i2amú
+i2amű
+ia2nek
+i2ané
+i2anö
+i2anő
+iao2k
+iaó2r
+ia2pát
+i2ape
+i2apé
+ia1p2l
+i2apo
+ia1p2s
+iarádi2
+i2are
+ia2rén
+i2aro
+i2aró
+i2arö
+i2aru
+i2arú
+i2ase
+i2a1sh
+i2asi
+ia1s2ká
+i2a1s2l
+i2a1s2m
+i2asó
+i2asö
+i2a1s2p
+iast2
+ia1s2ta
+ia1s2tá
+ia1sti
+ia1sto
+ia1str
+i2asú
+i2asü
+i2asű
+ia2sz1an
+i3aszerű
+ia2szes
+ia2szép
+iasz2k1e2r
+ia2szop
+i2aszú
+i2ate
+i2ató
+i2atö
+i2atő
+ia1tré
+ia2ty
+i2aud
+i2au2r
+iau2s
+iaü2z
+ia2vat
+i2avé
+i2avi
+i2aví
+i2avo
+i2azá
+i2aze
+ia2zo
+i2azs
+i2azú
+i1á
+iá2cs
+iá2ga
+iá2gá
+iá2ge
+iá2gi
+iá2go
+iá2gy
+iá2hí
+iáka2
+iá2kab
+iá2kak
+iá2k1al
+iá2k1an
+iá2k1ap
+iá2k1ar
+iá2k1as
+iá2k1á2
+iá2keb
+iá2k1el
+iá2kem
+iá2k1en
+iá2k1e2s
+iá2k1ér.
+iá2k1érd
+iá2kés
+iáki2
+iá2kin
+iá2kir
+iá2kit
+iá2kí
+iá2kop
+iá2k1or
+iá2k1osz
+iá2k1ó2
+iá2k1ö
+iá2kő
+iá2kur
+iá2k1ut
+iá2k1ú2
+iá2k1ü
+iá2kű
+iála2
+iál1ana
+iá2lál
+iá2l1ár
+iá2l1e2
+iá2lim
+iá2l1in
+iá2lop
+iá2nar
+iá2n1as
+iá2nem
+iá2nir
+iá2nis
+iá2nö
+iánt2
+ián1tr
+iá2nü
+iá2ny1ad
+iá2ny1a2l
+iá2nyan
+iá2nyar
+iá2ny1e2
+iá2nyérz
+iá2nyö
+iá2ói
+iá2po
+iá2rad
+iá2rak
+iá2ram
+iár2das
+iár2d1e
+iár2d3z
+iá2re
+iá2rim
+iár1s2
+iá2ru
+iá3run
+iá2rú
+iá2sal
+iá2sar
+iá2s1as
+iá2s1á2g
+iá2s1ám
+iá2sás
+iá2s1e2
+iá2sikr
+iá2sí
+iá2sor
+iá2só
+iá2sö
+iá2ső
+iás3szo
+iást2
+iás1tr
+iá2s1ü2
+iá2sű
+iásví2
+iá2szás
+iá2s3ze
+iás3zs
+iá2ta
+iá2t1e2l
+iáti2
+iá2t1ir
+iba1d2
+ibas2
+ibat2
+ibau2
+ibaü2
+ibá2l1a
+ibe2lér
+ibe2r1in
+ibe1s
+ibi2o
+ib2lo
+ib2ró
+ib2ru
+ica1f2
+ica1g2
+ica1kl
+ica1k2r
+ica2los
+ica1pr
+ica1t2
+icca2l
+ic2can
+ic2c1á2
+ic2c3h
+ic2cin
+ic2cir
+ic2cí
+ic2c1o
+ic2c1ö
+iccse2l
+iccs1ol
+iccs1ő2
+ic2cú
+ic2cz
+ic3ha.
+ic3hek
+i2chiná
+ic3hoz
+i2c3hű
+ici2t1a2
+ici2tár
+ici2tel
+ici2ter
+i1c2lu
+i2c1ol
+i2cs1a2d
+ics1a2la
+icsa2p1á2g
+i2cs1au
+ics1ág
+ics1áll
+i2cs1eb
+i2cs1e2g
+icse2t
+i2cs1ete
+i2cs1ev
+ics1é2g
+i2cs1é2ré.
+ics1ipa
+ics1s
+ics1út
+i2cs1ül
+i2cs1ü2t
+ic3sze
+ic1üz
+i2d1a2j
+id1ana
+id1a2ny
+i2d1au
+id1áll
+id1áru
+i2d1ásv
+id1br
+1iddo
+id3dz
+ide2av
+ide2g1á
+ide2g1él
+ideg1ér.
+1i2dej
+ide1k2v
+2idel
+id1elj
+id1elm
+id1elo
+id1elt
+i2d1emb
+ide1p2
+ide2red
+i2dero
+ide3sa
+ideu2
+i2d1é2g
+idé2kel
+i2dény
+idér2c3s
+2idész
+1i2déz
+id2ge
+idi2as
+1i2dil
+id1ionj
+id1ionn
+i2d1i2ono
+i2d1i2ont
+idi2os
+idi2ód
+i2d1ita
+idíja2d
+idí2j1ada
+id1kr
+id1old
+i2d1olv
+ido2mac
+ido2m1an
+1i2domá
+1i2domo
+1idomú
+id1ös
+1i2dő.
+1i2dőb
+1i2dőd
+1i2dőé
+1i2dőh
+1i2dői
+1i2dők
+1i2dőm
+i2dőne
+i2dőné
+i2dőnk
+1i2dőp
+1i2dőr
+1i2dős
+idő2sod
+idő1s2p
+1i2dőt
+idő2tál
+1i2dőv
+i2dőz
+id1pr
+id2rót
+i1d2ru
+id1st
+id1t2r
+id1u2t
+id1üg
+i2d1üz
+i2d3zá
+i2d3ze
+i2d3zó
+i2dzs1a
+i2dzs1á
+i2dzsen
+i2dzsél
+i2dzs1í2
+i1e
+ie2be
+ie2cs
+ie2dz
+ie2f1a2
+ie2fá
+ie2f1i
+ie2f1ü2
+ie2gé
+ie2gy
+ie2he
+i2eld
+ie2lo
+ie2lőa
+ie2ma
+ien2sá
+ien2s1o
+iens3s
+ie2ny
+ie2pe
+ie2r1a2d
+ie2rag
+ie2r1aj
+ie2r1a2k
+ie2ral
+ie2ram
+ie2r1an
+ie2ras
+ie2r1á
+ier1d2
+ie2reg
+ier1egy
+ie2r1el
+ie2r1ember
+ie2r1est
+ie2r1iga
+ie2r1in
+ie2r1iste
+ie2rí
+ie2r1ol
+ie2ror
+ie2rö
+ie2rő
+iersz2
+iert2
+ier1tr
+ie2r1u2
+ie2r1ú
+ie2r1ü2g
+ie2sel
+ie2sem
+ie2sett
+ie2sés
+ie2sik
+ie2ső
+ie2sz
+ieté1sz2
+ietz1
+ie2ur
+ie2ve
+ie2vé
+ie2vi
+ie2vő
+i1é
+i2édo
+i2éfe
+ié2ge
+ié2gé
+ié2gő
+ié2gü
+i2éha
+ié2hes
+i2éhi
+i2éil
+ié2le
+ié2lé
+ié2li
+ié2lő
+i2éme
+i2émé
+i2émo
+ié2neke
+ié2nekh
+ié2nekk
+ié2nekü
+ié2pí
+ié2pü
+ié2rek
+i2éren
+ié2rez
+ié2ré
+ié2ri
+ié2rő.
+ié2rők
+ié2rőt
+ié2rü
+i2észi
+iéta1s
+ié2tel
+i2étö
+ié2ve.
+ié2vek
+ifa1st
+ifa1t2
+i2fe.
+ifenyőé2h
+ifio2
+if1ír
+1ifjí
+1ifju
+1ifjú.
+1ifjúb
+1ifjúé
+1ifjúi
+1ifjúké
+1ifjún
+1ifjúr
+1ifjús
+1ifjút
+1ifjúv
+i1f2la
+if2le
+if2lo
+if2lö
+if2lu
+ifogo2
+ifon1n
+i1f2ri
+i1f2ro
+i1f2rö
+if2ru
+if2t1a
+if2t1á2
+if2t1e2l
+if2tin
+if2tö
+if2tú
+ig1a2git
+ig1a2ka
+ig1als
+ig1alv
+ig1and
+iga2nyal
+iganye2
+iga2ny1es
+iga2ras
+1i2garz
+iga1sl
+iga2szag
+igasz1al
+igau2r
+1i2gaz.
+1igazí
+ig1á2cs
+ig1álm
+ig1ásh
+i3gász
+ig1á2t1e2
+ig1br
+ig1d2r
+ig1edz
+i2geg
+igek2
+ige1kl
+ig1e2le
+ig1ell
+ig1elm
+1i2genl
+ige2rá
+ig1erő
+ig1e2se
+ig1esi
+ige2tál
+ige2teg
+ige2tél
+ige2t1o
+ige2tőr
+ig1evi
+i2g1ex
+1i2géd
+ig1é2g
+ig1é2li
+ig1é2lő
+ig1é2lü
+ig1élv
+i2gém
+igé2na
+igé2ná
+1i2gény
+i3gépe
+ig1épí
+ig1ér.
+ig1érj
+ig1érl
+ig1érn
+ig1é2rü
+ig1érv
+ig1ész
+1i2géü
+ig1fl
+ig1g2r
+ig1ív
+ig1íz
+ig1kl
+ig1kr
+ig2lac
+ig2nad
+ig2n1e2g
+igne2r
+ig2n1osz
+ig2nö
+ig2nü
+igo2rál
+ig1o2s
+igóé2
+ig1öb
+ig1ö2k
+ig1öl
+ig1ö2z
+ig1pr
+i1g2raf
+ig1sk
+ig1sl
+ig1sm
+ig1sp
+ig1st
+ig1sz
+ig1tr
+ig1ug
+igu2n
+igu2t
+ig1ús
+ig1üc
+ig1üd
+ig1ü2g
+igü2l
+ig1üt
+ig1üv
+ig1űz
+i2gya.
+i2gyam
+i2gyák
+i2gyál
+i2gy1eg
+i2gy1e2kéh
+i2gy1ékt
+igy1ér.
+i2gy1ért
+iha2re
+i1i
+ii2de
+ii2dé
+ii2dő
+ii2ga
+ii2gá
+ii2gé
+ii2gy
+ii2ha
+ii2je
+ii2má
+ii2mi
+ii2pa
+ii2ram
+ii2rat
+ii2rá
+ii2ro
+ii2sz
+ii2ta
+ii2vá
+ii2vo
+ii2vó
+ii2zé
+ii2zo
+i1í
+ií2gé
+ií2ra
+ií2rá
+ií2ro
+ií2ró
+ií2ru
+ií2té
+ií2ve
+ií2ze
+1i2jed
+ije2gy1á2
+1i2jes
+ikabe2j1
+ikabejá2
+i2k1abl
+ik1ajt
+ika2lak
+ik1ang
+ikaó2
+ika1p2l
+ika1p2r
+ika2ró2r
+ikas2
+ika1sp
+ika1t2r
+i2k1árk
+i2k1áru
+ikás1s
+iká2tol
+ik1dr
+ik1ebé
+i2k1eg
+ik1elo
+ik1eng
+ike2r1a2
+ike2r1á2
+ike2r1e2dz
+ike2r1e2l
+ike2r1ev
+ike2ris
+ike2r1o
+ik1e2rő
+iker1s
+ike2ru
+ike2t1ült
+ik1evo
+iké2kekk
+i2k1épí
+i2k1épü
+i2k1érz
+ik1fl
+ik1fr
+i2k1id
+ik1i2ko
+ik1ikr
+ik1ind
+ik1ins
+i2k1int
+i2k1i2o
+ik1isk
+ikka2l
+ik2k1ala
+ikk1any
+ik2k1a2r
+ikk1ára
+ik2káz
+ik2kev
+ikk1érde
+ik2kin
+ik2k1i2p
+ik2k1ol
+ik2k1ó
+ik2k1ös
+ik2köt
+ik2k1ö2z
+ik2k1u2
+ik2küz
+ikla1tr
+ik2ler
+ik2lor
+i1klub
+ik2lum
+i1knéd
+ikoma2
+iko2m1ar
+1ikonbá
+1ikonén
+1i2konl
+1i2konta
+1ikontö
+1i2kontü
+1ikonzs
+ikó1p
+ik1ó2rá
+ikó2s3zá
+ikő2res
+ik1pl
+ik1pr
+1ikrei
+1ikrek
+ik2rém
+i1k2róm
+i1k2ru
+ik1st
+ikszind2
+iksz2t
+iktus1s
+iktu2sz
+2iku.
+2ikub
+ik1udv
+2ikuf
+2ikuh
+2ikui
+2ikuí
+2ikuj
+2ikuk
+2ikur
+iku2sav
+2ikut
+2ikuv
+ik1ü2v
+il1abr
+il1a2ce
+il1a2cé
+il1a2dó
+il1a2la
+il1ald
+i2l1alk
+il1amb
+ila2n
+i2l1ana
+i2l1any
+ila2pin
+ila2pol
+i2l1a2r
+ilá2g1e2
+ilág3g
+ilá2gö
+il1á2gyo
+ilányfé2
+i2l1á2p
+i2l1árn
+il1á2ro
+il1áru
+il1á2rú
+ilá2sz
+i2l1ászo
+il1átf
+il1átm
+il1átr
+il1bl
+il2c1a2
+ilc3c
+il2ch
+il2c3sap
+il2c3sik
+ilc3sz
+il2cz
+il1e2lem
+i2l1emb
+i2l1eml
+il1exp
+ilé2n1á
+i2l1é2nekh
+i2l1é2nekn
+ilé1sp
+il1f2l
+il1fr
+il1g2r
+i2l1icc
+il1ide
+i2l1igáh
+i2l1igáj
+i2l1igás
+i2l1igát
+ili1gra
+i2l1i2kon.
+i2l1i2konb
+i2likoné
+i2l1i2konh
+i2l1i2konj
+i2l1i2konn
+i2l1i2kono
+i2l1i2konr
+i2l1i2kont
+i2likonz
+il1ill
+ili2ma.
+il1i2mi
+il1imp
+ilin1n
+ili2p1á
+il1iró
+il1k2l
+il1k2r
+illa2g1ó2
+1illatb
+1illatr
+1illatt
+il2l1este
+il2l1esté
+1illésé
+illé2t
+ill1éte
+ill1étt
+il2l1id
+illig2
+illi1gr
+il2l1ö
+1illu
+1illú
+ilm1ada
+il2m1agy
+il2m1aj
+ilm1aka
+il2m1a2l
+ilm1ank
+ilm1any
+il2m1ap
+il2m1arc
+ilm1atl
+il2m1a2z
+il2m1ál
+ilme2g
+il2m1egé
+il2m1egy
+il2m1e2l
+il2m1ep
+il2m1e2r
+il2m1esz
+il2m1é2j
+il2m1ék
+ilmé2l
+il2m1éle
+il2m1ér.
+il2m1érd
+ilm1é2rést
+il2mérte
+il2m1érté
+il2m1és
+il2mid
+il2m1i2k
+il2mim
+il2mir
+il2m1is
+il2miz
+il2m1í2
+il2m1ok
+il2mol
+il2m1or
+ilm1osz
+il2m1ó2r
+il2mö
+il2mő
+ilmu2
+il2m1ut
+ilo1g2
+i2l1or
+ilót2
+iló1tr
+il1öb
+il1ös
+il1p2l
+il1p2r
+il1sh
+il1sp
+il1s2t
+2ilte
+ilumi2
+ilumin1
+ilus3s
+i2l1üg
+il1ür
+il1üv
+i2l1üz
+ilva1k2
+ima1gl
+im1akk
+imaó2
+ima1p
+2imar.
+i2marit
+1i2mád
+i2mákt
+im1dr
+imeg1g
+im1elem
+ime2m
+i2m1eme
+ime2ra
+ime2rin
+i2m1érd
+im1inh
+im1inté
+imi2t1a2
+imi2t1á2r
+imi2tin
+1immu
+i2m1old
+i2m1om
+im1ó2rá
+imót2
+im1ös
+1impé
+1impu
+1imrei
+i2m1ür
+iműt2r
+i2n1abl
+i2n1a2cé
+i2n1adá
+in1ade
+i2nado
+in1a2já
+in1ajt
+inaka2r
+1i2nakat.
+i2n1akc
+i2nakk
+i2nakn
+i2nakt
+i2n1akv
+in1ald
+i2n1alk
+in1all
+1i2nam.
+i2n1a2mit.
+in1ana
+ina1pla
+ina2rán
+1i2nas.
+ina2sis
+1i2nasn
+ina2tell
+i2n1ág
+iná2lad
+in1á2rak
+in1árh
+i2náru
+i2n1ásv
+in1bl
+in1br
+in2c1a2g
+in2cal
+inca2n
+inc1elt
+in2c1él
+in2chi
+in2c3ho
+in2c1is
+in2c1os
+in2có
+in2c1ö
+in2cő
+incs1an
+in2cs1e2r
+in2cs1é2j
+in2cs1ér.
+inc3sérv
+in2csor
+inc3sor.
+in2csú
+inc3süt
+inc3sza
+in2cú
+in2d1ab
+1indai
+in2d1az
+in2deb
+in2d1ed
+in2d1e2g
+ind1ekö
+in2d1e2m
+in2d1ett
+1index
+in2d1e2z
+in2d1ég
+in2d1én
+in2dés
+ind1ink
+1indiv
+1indít
+indö2
+in2d1ör
+in2dös
+in1dra
+1indul
+2ine.
+i2n1e2dé
+i2n1ef
+ineg1g
+in1e2gy
+ine2ku
+i2n1e2l
+in1emu
+i2n1eny
+2iner
+i2n1erd
+i2n1erj
+ine2t1a
+ine2t1ér
+ine2tül
+i2n1ex
+2inéb
+in1é2ge
+iné1kré
+iné2l
+i2n1éle
+i2n1élt
+i2n1élv
+in1épí
+i2n1ér.
+i2nérd
+i2n1éré
+in1érte
+iné2tá
+iné2te
+2inév
+1infek
+1infl
+in2gadó
+in2g1ala
+ing1áll
+ing1árá
+ing1áré
+ing1á2ro
+ing1árt
+ing1áru
+ingás3s
+1ingec
+in2g1eg
+1ingei
+ing1eljá
+ing1elk
+in2g1ell
+ing1els
+in2g1enc
+1ingerb
+1ingerc
+1ingeré
+inge2r1és
+1ingerg
+1ingerh
+1ingeri
+1ingerk
+1ingerm
+1ingern
+1ingerp
+1ingerr
+1ingers
+1ingert
+1ingerü
+in2g1e2v
+in2g1é2j
+in2g1ék
+in2g1él
+ingés3s
+ing3g
+ing1i2na
+in2gí
+in1glo
+in2gor
+in2g1öl
+in2g1ös
+ing2rád.
+ing2rádb
+ing2rádd
+ing2rádn
+ing2rádo
+ing2rádt
+1inguj
+in2g1u2t
+in2gú
+ing1ült
+2inie
+2inié
+i2nigar
+i2n1ige
+in1ikra
+ini1kro
+i2n1ill
+i2n1i2ma.
+in1i2mi
+in1ind
+2ining
+i2n1inh
+i2n1i2o
+2inir
+ini2s1ég
+i2n1isk
+i2n1ism
+i2n1ital
+2iniu
+i2n1íz
+1injekc
+ink1acé
+in2k1a2d
+in2k1ato
+in2k1árn
+in2k1esz
+ink1érté
+in2kio
+ink1old
+ink1orsó
+in2kös
+1inkub
+1inna.
+in2nor
+i2n1ob
+i2n1okl
+i2n1old
+i2n1olt
+i2n1olv
+in1org
+i2n1ox
+in1óda
+in1ó2dá
+inó2rá
+i2n1öl
+in1ön
+in1őz
+in1pl
+in1pr
+in1s2k
+in1s2m
+1inspi
+in1spr
+1insta
+in1s2to
+in2t1aktu
+int1ann
+int1árai
+int1árak
+int1árat
+in2t1á2rá
+in2t1árf
+in2t1ári
+int1áron
+in2t1árr
+int1ársz
+in2t1áru
+int1á2ta
+1intege
+1integr
+in2t1e2gy
+int1előt
+int1elté
+in2t1enn
+in2t1e2ny
+1intenz
+in2t1e2rez
+1interfé
+int1essz
+inte2t1ős
+in2t1é2j
+in2t1ész
+1intézé
+1intézk
+1intézm
+1intéző
+2intézőc
+in1t2hos
+in1thu
+in2tid
+in2tigé
+int1illa
+in2t1ing
+in2t1ip
+in2t1ivá
+in2t1i2z
+int1oml
+in2t1osz
+in2t1ös
+intőkész1
+int1őr.
+int1ura
+intus1s
+in2t1ut
+in2tús
+in2t1út
+i2n1ug
+i2n1uj
+in1új
+in1ú2s
+i2n1ú2t
+i2n1ü2g
+in1ült
+in1ünn
+in1ür
+in1üs
+i2n1ü2t
+i2n1ü2v
+i2n1ü2z
+in1űr
+1inven
+in2xa
+1inzu
+i1o
+ioá2r
+io1b2r
+io2cs
+io1d2r
+io2dú
+i2ogá
+iog2raf
+io1g2ráf.
+io1g2ráff
+i2ogy
+io2ik
+io2ká
+io2kí
+io2ko
+io2ku
+i3old
+io2l1i2v
+iol1k2
+iol1okk
+i2oló
+i3olv
+io2mar
+io2m1árt
+io2mil
+io2mö
+io2nad
+io2n1a2g
+io2nak
+io2n1a2n
+io2n1a2r
+io2n1as
+io2n1a2t
+io2n1av
+io2n1át
+io2neg
+io2n1el
+io2nen
+ionim1
+io2nin
+ion1k2
+io2nop
+io2n1oszt
+io2nö
+ions2
+ion1st
+ion1t2r
+io2pe
+io1p2r
+io2r1a
+io2r1i2ko
+io2so
+io1sz2f
+i2ote
+io2xidj
+io2xidt
+i1ó
+ióa2d
+ió2ap
+ióá2g
+ióá2r
+ióát1a2
+i2óbá
+i2óbes
+i2óbé
+i2óbí
+i2ó1bl
+i2óbo
+i2óbö
+i2óbő
+i2ó1b2r
+i2óbu
+i2óbú
+i2óbü
+i2óbű
+i2óce
+i2ócé
+i2óci
+i3ócsk
+i2ócu
+i2óde
+i2ódé
+i2ódi
+i2ódí
+i2ódó
+i2ódö
+ió1drá
+i2ódú
+i2ódü
+i2ódz
+i2óég
+i2óék
+i2óél
+i2óép
+i2óés
+i2óév.
+i2ófá
+i2ófe
+i2ófi
+i2ó1fl
+i2ófó
+i2ófö
+i2ófő
+i2ó1f2r
+i2ófu
+i2ófü
+i2ófű
+ió1g2r
+i2óha
+i2óhá
+i2óhe
+i2óhé
+i2óhi
+i2óhí
+i2óhó
+i2óhö
+i2óhő
+i2óhu
+i2óhü
+i2óhű
+iói2g
+i2óip
+i2óis
+i2óiz
+ióí2v
+i2óje
+i2ójo
+i2ójó
+ió2kad
+ió2kaj
+iók1arc
+ió2k1aszt
+ió2kál
+ió2k1e2g
+ió2k1i2d
+i2ókí
+iókköz1
+iók1old
+i2ókort
+i2ókö
+i2ókő
+ió2küz
+i2óla
+i2ólá
+i2óle
+i2ólé
+i2óli
+i2ólo
+i2óme
+i2ómó
+i2ómu
+i2ómú
+i2ómű
+i2óne
+i2ónó
+i2ónö
+ióo2k
+ióó2r
+ió1p2s
+ió2rab
+i2órag
+i2órak
+i2óran
+i2órap
+ió2ras
+i2órád
+i2óre
+i2óré
+i2ória
+i2óro
+i2órö
+i2óru
+ió2s1aj
+ió2sel
+ió2si.
+ió1slá
+ió2só
+iós3s
+ió1s2tá
+ió1str
+i2ósú
+ió1sz2
+i2óte
+i2óté
+i2óti
+i2ótí
+i2ótö
+i2ótő
+i2ó1t2r
+i2ótu
+i2ótú
+i2ótü
+i2ótű
+i2óug
+i2óun
+i2óur
+i2óut
+i2óvár
+i2óvás
+i2óve
+i2óvé
+i2óvi
+i2óví
+i2óvö
+i2ózár
+i2óze
+i2ózs
+i1ö
+iö2kö
+iö2le
+iö2lé
+iö2li
+iö2lö
+iö2lő
+iö2mö
+iö2re
+iö2rö
+iö2rü
+iö2tö
+iö2ve
+iö2zö
+i1ő
+iő1dr
+i2őha
+i2őké
+i2őku
+i2őra
+iő2ri2
+i2ő1s2p
+i2ő1st
+i2őte
+i2őté
+i2őva
+i2ővá
+ipa2cse
+1i2par.
+1ipara.
+ipa2ral
+ipa2rál
+1i2parán
+1i2parát
+1iparb
+ipa2r1en
+ipa2r1es
+1i2paré
+1i2parh
+1iparil
+1i2parin
+ipa2ris
+1i2parm
+1i2parn
+i2parok
+i2paron
+1iparr
+1i2pars
+i2parta
+1i2partá
+1i2parte
+1i2partó
+1i2paru
+ipau2
+ipánk2
+ipán1n
+ip1átm
+i2p1ef
+ip1e2gy
+ip1e2lu
+i2p1esé
+i2p1ev
+ip1fl
+ip2fu
+ip1kl
+ip1kr
+ipo1kl
+ipor2tel
+ipor2t1ő
+ip1ö2l
+ip1ös
+ip2p1a2d
+ip2paj
+ip2par
+ip2pár
+ipp1ing
+ip2pö
+i1prof
+i1prog
+i1proj
+ip2rop
+i1p2rot
+ipsz1a2l
+ipsz1ál
+ip2sz1emb
+ip2szip
+ip2sz1í2
+ipsz1or
+i2p1ug
+iralo2
+1i2rama
+1i2ramá
+iramis1s
+ira2tal
+irata2n
+ira2t1any
+ira2t1as
+ira2t1at
+ira2tál
+1i2ratb
+1i2ratc
+1i2ratd
+ira2tel
+1i2raté
+1i2ratf
+1i2rati
+2i3ratill
+1i2ratm
+ira2t1ol
+1iratoz.
+ira2t1ö2
+1i2ratp
+1i2ratr
+1i2ratü
+irádi2ók
+irádi2ót
+irá2f1a2
+irá2g1al
+irá2g1ál
+irá2g1á2rak
+irá2g1á2ro
+irá2g1áto
+irá2gáz
+irá2g1e
+irág1g
+irá2g1ol
+irá2g1ó2r
+irá2gö
+irá2l1a
+irá2l1e2
+1i2ránn
+1i2rány
+irá2nyal
+irá2nye2
+ir2ch
+i2rei
+1irga
+irin2c
+iri2zo
+irka1s
+irkasz2
+irke1
+2iro.
+2irob
+1i2roda.
+1i2rodá
+iro1g2r
+iro2ka
+iro2ká
+iro2k1e
+iro2kér
+iro2l1a
+iro2m1a
+iros3s
+iró2ke
+i2róno
+1irri
+ir2s1a2
+ir2s1á2
+ir2sil
+irs3s
+ir2s1ü
+ir2sz
+irté2
+ir2t1él
+ir2tiz
+ir2t1o2r
+ir2t1ö2
+ir2tür
+iru2sze
+i2s1abl
+is1a2da
+is1a2dá
+is1a2do
+i2s1a2g
+is1aja
+is1ajk
+isa2k1e
+isa2kol
+is1a2la
+is1alf
+i2s1alj
+is1alk
+is1alm
+is1amb
+isa2n
+i2s1ana
+i2s1ano
+i2s1ant
+i2s1any
+isa2p
+is1apá
+is1apo
+is1a2rá
+is1ass
+is1aut
+i2s1a2z
+i2s1ábr
+is1ággy
+iságy1út
+is1áll
+is1á2po
+i2s1á2rak
+i2s1á2rá
+i2s1árb
+i2s1árf
+i2s1árh
+i2s1árké
+i2s1árn
+isá2ron
+i2s1árr
+i2s1árt
+i2s1á2ru
+isárus1
+is1á2t1a2
+is1átk
+i2s1átl
+is1átv
+is1bl
+is1br
+is1dr
+is1edz
+is1eff
+i2s1ege
+is1e2gér
+i2s1e2ke.
+is1elf
+is1elm
+i2s1elo
+i2s1eml
+i2s1enc
+i2s1ene
+is1eng
+i2s1e2pi
+is1epri
+is1erő
+is1e2set
+is1esé
+isé2ge2l
+isé2gés
+isé2gid
+iségkész1
+is1élv
+i2s1ér.
+i2s1é2ri
+i2s1érté
+is1é2ve.
+is1é2vet
+is1é2vén
+is1é2vét
+is1évh
+isé2vi.
+isföl2
+is1fr
+is2hin
+is2his
+is1ido
+isi2g
+is1iga
+is1ind
+is1inf
+is1int
+is1inv
+isió2
+i2sipa
+isi2par
+is1iro
+i2s1isten
+is1ita
+is1i2zo
+i1s2katu
+is1kl
+is1k2r
+is1kv
+is2lag
+i1s2lat
+1isme.
+1ismek
+1ismere
+1ismérv
+2ismo
+2ismű
+i2s1ob
+i2s1o2l
+i2s1orc
+i2s1ord
+iso2rosz
+i2s1orra
+i2s1orró
+is1orv
+i2s1osko
+is1osz
+i2s1ott
+is1ó2rá
+i2s1öb
+i2s1ö2c
+is1öl
+is1ön
+isö2r
+is1örd
+is1öre
+is1ös
+is1ö2v
+is1ő2r
+i1s2pan
+i1s2pek
+isp2r
+i1s2pur
+is1s2p
+is1sta
+is1stá
+issz1e2rei
+issz1e2rek
+issz1erem
+issz1e2res
+is3szig
+is3szil
+is3szí
+is3szó
+is3szö
+is3sző
+is3szú
+is3szű
+ista1s
+istasz2
+1istáp
+1istenh
+iste2n1o
+i1s2til
+is1trez
+is1tré
+is1tri
+is1tro
+1istv
+i2s1ud
+is1ujj
+isu2t
+is1uta
+is1utá
+i2s1új
+i2s1üg
+is1üst
+i2s1ü2tőt
+i2s1üz
+isva2d1áss
+i1svin
+isvíz1
+isza2k1o
+isza2p1á2
+isza2p1e
+is3zárá
+isz1árk
+is3zárl
+is3zárú
+isz1e2gy
+i2sz1elv
+is3zene
+isz1esem
+i2széj
+isz2fér
+i2szimi
+isz1ing
+isz1isk
+isz1ist
+isz1kl
+isz2k1ö2v
+isz2k1ú
+isz1öl
+isz1ös
+isz3s
+isz2tati
+iszt1áras
+isz2t1árb
+isz2tárt
+isz2t1ékn
+isz2t1ér.
+isz2t1ill
+iszt1i2nai
+isz2t1öl
+isz2t1őr.
+isz2tüz
+i2sz1ü2g
+i2szüt
+is3zűrödn
+it1a2cé
+ita1d2
+it1a2dó
+ita1g2r
+it1agya
+i2t1akk
+i2t1akn
+1i2tal.
+ita2lad
+ita2l1á2rú
+i2talb
+ita2l1el
+italé2
+i2talh
+itali2n
+ita2lina
+i2talj
+i2talk
+it1allo
+1i2talm
+1i2taln
+i2talo
+ita2l1ó2
+1i2talr
+i2talt2
+i2talu
+it1anó
+it1ant
+i2t1ara
+i2t1au
+it1ács.
+it1ág.
+it1á2ga
+itána2
+itá2n1at
+itá2rak
+i2t1á2ram
+it1á2ras
+it1á2rat
+itá2rár
+itá2rát
+i2t1á2ria
+itá2rig
+itá2ris
+itáró2
+itá2r1ór
+itá2ruk
+itá2rú
+itáskész1
+itá2s3z
+itá2tal
+it1átf
+it1bl
+it1br
+it1dr
+ite2l1a
+ite2l1á
+ite2leg
+i2telemz
+ite2leng
+ite2lesé
+ite2lex
+ite2lél
+ite2l1ér.
+ite2linj
+it1eljá
+i2t1ellen
+it2elmély
+ite2lo
+ite2lőz
+i2t1e2mel
+i2t1eml
+i2t1e2p
+2iter
+i2t1e2rez
+i2t1erő
+i2t1e2sete
+it1ezr
+ité2g
+i2t1ége
+it1é2le
+it1élm
+i2t1é2ret
+i2t1érz
+ité2tek
+i2t1étt
+it1fl
+it1fr
+it1gl
+it1gn
+it1gr
+i2t1id
+iti2g
+itigaz1
+i2t1igé
+it1i2ko
+it1ikr
+itikus1s
+it1ill
+it1imp
+i2t1ind
+i2t1inf
+it1i2pa
+i2t1irá
+i2t1iro
+it1iró
+it1isk
+i2t1ism
+it1isza
+it1i2szo
+i2t1íg
+i2t1íz
+it1kl
+itkos1s
+it1kr
+ito2b
+it1obe
+ito2k1aj
+ito2kak
+ito2k1ol
+ito2n1á2
+itop2la
+ito2r1as
+ito2rál
+ito2ril
+2itosz
+ito1sz2f
+i2t1ov
+itóa2
+itó1f2
+1i2tókán
+i2t1ó2né
+i2t1ónn
+i2t1ónt
+itó1p2
+it1órá
+itós2
+itó1sp
+itó1st
+it1önt
+i2t1ös
+it1őrl
+it1pl
+it1pr
+it1sp
+1ittad
+1ittam
+itta2n1á2s
+itta2n1é
+itta2n1ó2
+2itte
+it2t1eg
+it2t1i2na
+it2t1ing
+it1tra
+it1tró
+1ittuk
+1ittun
+itty1i
+i2t1ug
+i2t1und
+itu2n1i
+itu2ral
+it1u2rán
+it1új
+i2t1üg
+it1üld
+it1üst
+i2t1üt
+i1t2zé
+i1t2zi
+i1u
+iu2ga
+iu2go
+iu2mab
+iu2mac
+iu2m1ad
+iu2maf
+iu2m1ag
+iu2mal
+iu2m1am
+iu2m1a2n
+iu2m1a2r
+iu2m1as
+iu2m1a2t
+iu2m1av
+iu2maz
+iu2m1á2l
+iu2meg
+iu2m1el
+iu2m1en
+iu2mer
+iu2m1es
+iu2mez
+iu2mél
+iu2m1éré
+iu2m1i2d
+ium1ill
+iu2m1im
+ium1inj
+iu2m1i2p
+iu2m1is
+iu2m1iz
+iu2mí
+iu2mol
+iu2m1or
+iu2m1ó2
+iu2mö
+iu2mő
+ium1p2
+iu2mü
+iu2na
+iu2no
+iu2ra
+iu2rá
+iu2ru
+ius3sze
+iu2ta
+iu2tó
+iu2tu
+iu2zs
+i1ú
+i2úbá
+i2úbe
+i2úbé
+i2úbi
+i2úbo
+i2úbö
+i2ú1br
+i2úci
+i2úcí
+i2údá
+i2úde
+i2údo
+i2údz
+i2úél
+iú1fr
+i2úha
+i2úhá
+i2úhe
+i2úhi
+i2úhö
+i2úhő
+i2úhu
+i2úhú
+i2úif
+i2úje
+iú2jí
+i2újó
+i2úke
+i2úkí
+i2ú1kl
+i2úkó
+i2úkö
+i2úku
+i2úme
+i2úmó
+i2úmu
+i2úmű
+i2úne
+i2úné
+i2únö
+i2úre
+iú2ri
+iú2ro
+i2úru
+i2úse
+i2úso
+i2ú1sp
+i2úta
+i2útá
+i2úte
+iú2té
+i2útí
+i2útö
+i2útú
+i2úve
+i2úvé
+i2úvi
+i2úvo
+i2úze
+i1ü
+iü2cs
+iü2ge
+iü2gy
+iü2le
+iü2lé
+iü2li
+iü2lö
+iü2lő
+iü2lü
+iü2re
+iü2rí
+iü2rü
+iü2te
+iü2té
+iü2ti
+iü2tö
+iü2tő
+iü2tü
+iü2ve
+iü2vö
+iü2ze
+i1ű
+iű2ze
+iű2zé
+iű2ző
+iva2csal
+iva2cs1e
+1i2vadé
+iva2r1ai
+iva2raj
+iva2re
+iva2rin
+iva2rol
+iva2ró
+ivar1s
+iva2t1a2n
+iva2t1e2
+iva2tin
+iva2tol
+iva2t1ó2
+iva2t1ö
+1i2vás.
+1i2vásb
+1i2vásé
+1i2vásn
+1i2vásr
+1i2váss
+i2ve.
+1ivot
+ivókész1
+ivós2
+ivőé2
+iv2ré
+i2x1ab
+i2x1ad
+i2x1an
+i2x1ar
+ix1as
+i2x1ág
+ix1bl
+i2x1ef
+i2x1eg
+i2x1ex
+i2x1ép
+ix1fr
+i2x1im
+i2x1in
+i2x1io
+i2x1ir
+i2x1is
+ixi2t
+i2x1ob
+i2x1op
+ix1öd
+ix1ös
+ix1őr
+ix1ős
+ix1pl
+ix1pr
+i2x1új
+i2x1ül
+iz1akn
+izala2g1
+iz1alk
+izas2
+iza1sp
+iz1árny
+iz1bl
+ize2d1á2
+ize2d1ék
+iz1egy
+i2z1e2lem
+izele2tel
+i2z1e2lér
+i2z1e2lőí
+iz1ember
+izene2g
+izen3n
+ize2s1á2
+i2z1esemé
+i2z1ev
+i2zéd
+i2z1ég
+1i2zéj
+1i2zék
+i2zél
+i2z1é2p
+1i2zésí
+iz1fl
+1izgal
+1izgatot
+i2z1iga
+i2z1igé
+iz1inf
+iz1int
+iz1iro
+i2z1isk
+i2z1ism
+izi1s2p
+1izmok
+1izmuk
+izmus1s
+1izmú
+iz1okt
+1i2zolá
+izo2m1a
+izo2mál
+1i2zomb
+1izomé
+1izomf
+1i2zomm
+1i2zomn
+1i2zomr
+1izoms
+1i2zomt
+1izomz
+izo1p2
+i2zos
+izo1szta
+1izotó
+izó2d1a2
+iz1órá
+iz1pl
+iz1pr
+i2zs1ad
+izsa2ik
+i2zsakn
+i2zs1all
+izs1ara
+izsa3u2tók
+iz4s1ág
+i2zs1ál
+i2zsec
+i2zs1embe
+i2zsev
+izsé2t
+izs1éte
+i2zsil
+i2zs1imp
+izs1ist
+i2zsita
+i2zsiz
+iz3sor
+i2zs1ő
+izs1s
+iz3str
+i2zs1ül
+iz3sze
+iztos1s
+iz1udv
+izura1
+iz1ú2t
+i2z1ü2g
+i2z1üt
+i2z1ü2z
+1izzi
+1izzí
+1izzot
+2í.
+í1a
+í1á
+íba2l1
+í2bis
+íbo2r1as
+ícius1s
+íd1a2c
+íd1a2d
+íd1a2l
+ídala2g1
+íd1a2n
+íd1a2v
+íd1a2z
+íd1ág
+íd1ál
+íd1á2r
+íd1át
+íd1bl
+íd1e2g
+íd1e2l
+íd1e2m
+í2d1é2g
+í2d1él
+í2d1ép
+í2d1ér.
+í2d1érz
+ídi2g
+í2d1iga
+í2d1igé
+í2d1in
+í2d1i2r
+íd1ív
+í2d1ol
+í2d1om
+í2d1os
+íd1ös
+íd1ő2r
+íd1pr
+íd1st
+í2d1ud
+í2d1ug
+íd1új
+íd1üg
+íd1ün
+íd1üz
+íd3zá
+íd3zs
+í1e
+í1é
+íé2le
+í2g1a2g
+íg1e2p
+íge2s
+í2g2ér
+í2g1op
+íg1tr
+ígyá2
+í1i
+íi2ro
+í1í
+í2j1a2dá
+í2j1a2dó
+í2j1a2j
+í2j1akc
+í2j1a2l
+íj1any
+í2j1a2r
+í2j1a2u
+í2j1á2c
+í2j1á2g
+í2j1árá
+í2j1áre
+í2j1árt
+í2j1áru
+1í2jás
+íjá2sze
+íj1ászka
+í2j1áta
+í2j1á2te
+í2j1áth
+í2j1átl
+íjá2tos
+í2j1átt
+í2j1átu
+í2j1átv
+í2j1á2z
+íj1e2g
+íj1e2l
+íjel2i
+íj1e2m
+íj1en
+íj1e2r
+íj1e2s
+íj1ép
+íjé2r
+í2j1ére
+íj1fr
+í2j1i2d
+í2j1im
+í2j1int
+í2j1ir
+íjirá2
+íj1íg
+íj1ín
+íj1kr
+í2j1o2d
+í2j1ok
+í2j1ol
+í2j1os
+í2j1ot
+íj1ön
+íj1ös
+íj1ö2v
+íj1öz
+íj1pl
+íj1pr
+íj1sk
+íj1sp
+íj1st2
+í2j1ug
+í2j1u2t
+í2j1út
+íj1üg
+íj1ü2t
+í2k1abl
+í2k1a2c
+í2k1a2g
+í2k1a2l
+í2k1an
+ík1ar
+íka2s
+ík1asz
+ík1a2v
+í2k1áb
+í2k1ág
+ík1ál
+í2k1á2r
+í2k1eg
+í2k1e2l
+ík1em
+í2k1es
+ík1ev
+í2k1é2k
+í2k1ér.
+í2k1érb
+í2k1é2rő
+ík1fr
+í2k1i2d
+í2k1ing
+í2k1i2r
+ík1ín
+ík1ír
+ík1k2r
+í1k2lu
+ík1oll
+í2k1op
+í2k1orn
+í2k1orr
+í2k1ors
+íkö2l
+í2k1ö2v
+ík1pl
+ík1pr
+ík1sp
+ík1sz2
+í2k1ug
+í2kuni
+í2k1u2r
+í2k1u2t
+í2k1ú2t
+ík1ü2v
+íl1aj
+íl1a2k
+íl1a2l
+í2l1á2g
+ílási2
+ílá2s1ik
+ílás3s
+ílá2s3z
+í2l1át
+íl1bl
+íl1br
+íl1e2g
+í2l1érz
+íli2as
+í2l1i2m
+í2l1i2r
+í2l1is
+íl1í2r
+íl1í2v
+íl1kr
+íl1ös
+íl1ö2z
+íl1st
+íltá2
+íl2t1árk
+íl2t1áro
+íl2t1árt
+íl2t1e
+íl2t1é2
+í2l1u2r
+ílu2sab
+ílu2se
+ílus3s
+ílu2s3z
+íma2n
+íma1p
+í2m1á2l
+ímá2ris
+ímás1s
+ím1bl
+ím1b2r
+ím1dr
+í2m1e2g
+ím1elí
+í2m1elm
+íme2r1a2
+íme2r1á
+íme2reg
+ím1e2rő
+í2m1esem
+í2m1e2v
+í2m1é2het
+í2m1é2k
+í2m1ép
+í2m1ér.
+í2m1é2ré
+í2m1é2rő.
+í2m1é2rői
+í2m1érr
+í2m1érte
+í2m1érté
+í2m1i2d
+ími2g
+í2m1iga
+í2m1igé
+í2m1ill
+í2m1ind
+í2m1inf
+í2m1ira
+í2m1is
+í2m1i2v
+ím1ír
+ím1kr
+ím1o2k1
+ím1ol
+ím1on
+ím1o2p
+ím1os
+ím1ök
+ím1ö2l
+ím1ös
+ím1öt
+ím1ő2r
+ím1p2r
+ím1sp
+ím1st
+ím1u2r
+ím1u2t
+í2m1üg
+í2m1ünn
+í2m1üt
+í2n1ab
+ín1a2cé
+ína2d
+ín1ada
+ín1adá
+ín1ado
+í2n1a2g
+í2n1a2j
+í2n1aka
+í2n1akk
+ín1a2la
+ín1alj
+ín1alk
+ín1ana
+ín1a2ny
+í2n1a2p
+í2n1a2rá
+í2n1arc
+ín1ass
+ín1atl
+ín1att
+í2n1au
+í2n1az
+ín1ábr
+í2n1á2c
+í2n1ág
+í2nálhaj
+í2n1álm
+í2n1á2p
+ín1á2t1a2
+ín1átc
+ín1áte
+ín1átf
+ín1áth
+ín1átl
+ín1átm
+ín1átt
+ín1átv
+í2n1á2z
+ín1bl
+ín1br
+ín1d2r
+í2n1ef
+í2n1e2g
+í2n1e2ke.
+í2n1elc
+í2n1e2le
+í2n1elh
+í2n1elj
+í2n1elk
+í2n1ell
+í2n1elm
+í2n1elny
+í2n1e2lo
+í2n1elö
+í2n1e2lőh
+í2n1elr
+í2n1eltá
+í2n1elto
+í2n1elvá
+í2n1e2mel
+í2n1eml
+í2n1e2mu
+íne2n
+í2n1ene
+í2nesd
+í2n1e2sz
+í2n1e2vé
+ín1ég
+íné2l
+í2n1éle
+ín1élé
+ín1élő
+ín1élt
+í2n1é2p
+í2n1ér.
+í2nérd
+í2n1éri
+í2n1érl
+í2n1érm
+í2n1érü
+íné2sza
+íné2szer
+íné2szint
+íné2szo
+í2n1éte
+í2n1é2ven
+ín1f2r
+ín1g2r
+íni2g
+í2n1iga
+í2n1igé
+í2n1i2ko
+í2n1ill
+ín1ind
+í2n1inf
+í2n1ing
+í2n1int
+1í2nio
+ín1i2rá
+í2n1iro
+í2n1ism
+í2n1i2z
+ín1íz
+ín1k2l
+ín1k2r
+ín1k2v
+ín3nyú
+í2n1ob
+í2n1ol
+í2n1op
+í2n1or
+í2n1osz
+ín1ó2l
+ín1ön
+ín1ör
+ín1ös
+ín1öt
+ín1ö2v
+ín1ö2z
+ín1pl
+ín1pr
+ín1ps
+ín1s2k
+ínso2k1
+ín1s2p
+ín1s2t2
+ín1sz2
+ín1t2r
+ín1ug
+ín1új
+í2n1üd
+í2n1ü2g
+í2n1ült
+í2n1ü2t
+í2n1ü2v
+íny1e2c
+íny1e2g
+íny1el
+íny1e2r
+íny1ing
+í1o
+í1ó
+íó2vo
+í1ö
+í1ő
+í2p1a2g
+í2p1a2n
+í2p1álc
+í2p1él
+ípés3s
+í2p1i2z
+íp3ro
+í2p1uj
+ípu2san
+ípus3s
+ípus3z
+ír1a2dó
+ír1akc
+ír1akn
+ír1akt
+ír1a2la
+ír1alj
+ír1alk
+íra1pl
+íra1pr
+ír1arc
+í2r1a2u
+í2r1ábr
+í2r1á2g
+í2r1á2p
+ír1ár.
+ír1árak
+í2r1á2ro
+ír1á2ru
+í2r1ásás
+írá2se
+íráskész1
+írás3s
+í2rász
+ír1á2t1a
+ír1á2t1e2
+í2r1áth
+ír1áts
+ír1átv
+ír1áza
+ír1bl
+ír1br
+ír1d2r
+ír1e2dé
+í2r1e2g
+í2r1e2kés
+í2r1e2l
+írel1a
+í2r1ember
+ír1eml
+ír1emu
+íre2n
+ír1ene
+í2r1e2r
+í2r1esem
+í2r1e2ső
+í2r1eszk
+í2r1ev
+í2r1é2g
+í2r1éj
+í2r1é2k
+í2r1é2l
+í2r1ép
+í2r1é2ri
+í2r1és
+í2r1é2te
+ír1évh
+ír1f2r
+ír1gl
+ír1g2r
+íri2g
+í2r1iga
+ír1iko
+í2r1ill
+í2r1im
+ír1ind
+í2r1inf
+í2r1inj
+ír1ins
+í2r1int
+í2r1i2p
+ír1ira
+í2ris
+íri2sz1á
+í2r1i2z
+ír1ín
+ír1ír
+ír1ív
+ír1í2z
+ír1k2l
+ír1k2r
+ír1kv
+1írnok
+í2r1o2b
+1írog
+í2r1okl
+í2r1okm
+íro2l
+í2r1ola
+í2r1old
+í2r1olv
+í2r1o2r
+í2r1osz
+í2r1o2v
+í2r1o2x
+íróá2
+í2ródj
+í2ródo
+í2ródó
+í2ródt
+í2róí
+író1p2
+író1s2p
+író1sz
+írót2
+író1tr
+ír1ön
+ír1ör
+í2r1ös
+í2r1ö2z
+í2r1ő2r
+ír1ő2s
+ír1p2l
+ír1p2r
+ír1sh
+ír1s2k
+ír1s2p
+ír1s2r
+ír1s2t
+írsz2
+írszt2
+ír2t1ag
+írt1alap
+írt1é2te
+írtha2
+ír1tran
+ír1tro
+ír2t1u2r
+íru2n
+í2r1und
+í2r1uni
+í2r1u2r
+íru2s1e2
+írus3s
+í2r1u2t
+í2r1új
+í2r1úr
+í2r1ú2s
+í2r1útj
+í2r1útn
+í2r1ú2to
+í2r1útr
+í2r1útt
+í2r1ü2g
+írü2l
+ír1ür
+ír1ü2v
+í2r1üz
+ír1ű2z
+ís2po
+ís2tí
+ísz1aj
+ísza2k
+íszak1o
+ísz1a2l
+ísz1as
+ísz1at
+ísz1au
+í2sz1á2
+í2sz1eb
+í2szedé
+í2sz1e2g
+í2sz1e2lem
+í2sz1ell
+í2szeln
+í2sz1e2lő
+í2sz1elv
+í2sz1emb
+í2sz1e2mel
+í2sz1eml
+í2sz1erk
+í2szég
+í2sz1é2l
+í2sz1é2p
+ísz1érem
+í2sz1ért
+í2sz1étk
+ísz1g2
+íszi2
+í2sz1id
+í2sz1in
+í2szír
+í2sz1ív
+ísz1k2
+í2sz1o2
+í2sz1ó2
+ísz1öl
+ísz1ön
+í2sz1ő2
+ísz1p2
+ísz3s
+ísz1tr
+í2sz1u
+í2sz1ú
+íszü2l
+í2sz1ülé
+í2szünn
+í2szüt
+ísz1z
+íta3u2
+ítá2s1á2g
+íté2k1a2l
+íté2k1e2l
+1í2tél
+íté2sa
+íté2s1ég.
+íté2s1é2gé
+íté2s1égr
+íté2sza
+íté2szá
+íté2szo
+ítész3s
+ítóa2
+ító1f
+ítógé2p1é2s
+ító1p2
+ító1sp
+ító1sta
+ítót2
+ító1tr
+ít2ré
+ítus3s
+í1u
+í1ú
+í1ü
+íü2dü
+í1ű
+í2v1a2d
+ív1a2já
+ív1ajk
+ív1ajt
+í2v1a2la
+í2v1alj
+í2v1a2na
+ív1ang
+í2v1anó
+í2v1a2ny
+ív1arc
+ív1a2ri
+í2v1aszt
+ív1ábr
+í2v1á2g
+í2v1ál
+ív1á2rad
+í2v1á2ram
+í2v1árk
+í2v1árn
+í2v1árt
+í2váru
+ívás3s
+ívá2s3z
+ív1áta
+ív1bl
+ív1dr
+íve2c
+í2v1e2dz
+í2v1e2g
+í2v1ej
+í2velek
+ív1e2lemb
+ív1e2leme
+ív1e2lemé
+ív1e2lemr
+í2velg
+ív1e2lől
+í2v1ember
+íve2n
+í2v1end
+í2v1ene
+íve2r
+ív1ere
+ív1eré
+ív1erő
+í2v1esemé
+í2v1esz
+í2v1e2tet
+í2v1é2g
+í2v1é2k
+í2v1é2le
+í2v1élm
+í2v1é2lő
+ív1élt
+í2v1ép
+í2v1ér.
+í2v1érd
+í2v1é2ri
+í2v1érr
+ív1érté
+í2v1érv
+í2v1érz
+í2v1é2te
+ív1fr
+í2v1i2d
+ívi2g
+í2v1iga
+ívi2k
+ív1ike
+í2v1ill
+í2v1im
+í2v1in
+í2v1i2p
+ív1iro
+ívi2s1el
+ívi2ses
+ívis1s
+ív1iva
+í2v1i2z
+ív1kl
+ív1kr
+í2v1ol
+í2v1op
+í2v1or
+í2v1osz
+í2v1ox
+ívó1s2p
+í2v1öb
+í2v1ö2r
+í2v1ös
+ív1öv
+í2v1ö2z
+ív1pl
+ív1pr
+ívren2de
+ív1sk
+ív1sp
+ív1st
+ívsz2
+ív1szk
+ív1tr
+í2v1ug
+ív1ult
+í2v1ur
+í2v1u2t
+ív1új
+ív1út
+í2v1üg
+í2v1ür
+í2v1üt
+í2v1ü2v
+í2v1üz
+íz1ab
+íz1a2d
+íz1a2g
+íz1aj
+íz1a2k
+íz1a2l
+íza2n
+íz1ar
+íz1a2u
+íz1á2g
+íz1ál
+íz1á2p
+íz1á2r
+ízár1ó2
+ízás1s
+íz1á2t
+ízát1a2d
+ízát1á
+ízát1e2
+íz1bl
+íz1d2r
+í2z1ef
+í2z1e2g
+í2z1ej
+í3zelá
+íze2l1el
+íze2lö
+íze2lő
+í2z1emel
+í2zemé
+íze2n
+í2z1ene
+í2z1e2r
+1í2zesí
+í2z1e2sz
+í2z1e2ti
+í2z1eu
+í2z1e2v
+í2z1ex
+í2z1e2z
+í2z1ég
+íz1ékk
+í2z1é2l
+í2z1é2p
+í2z1ér.
+í2z1érb
+í2z1érd
+í2z1érel
+í2z1é2ren
+í2z1érh
+í2z1é2r1i
+í2z1érk
+í2z1érm
+í2z1érn
+í2z1érr
+í2z1érs
+í2z1érte
+í2z1érté
+í2z1értő
+í2z1érv
+í2z1érz
+ízé2sa
+íz1ész
+íz1évi
+íz1fr
+íz1gl
+íz1icc
+ízi2g
+í2z1igé
+íz1iko
+í2z1ill
+í2zimá
+í2z1imi
+í2z1imp
+í2z1ind
+í2z1inf
+í2z1int
+ízióé2r
+ízi2óéra
+ízi2óto
+í2z1i2pa
+í2z1ira
+íz1irá
+ízi2so
+ízi2sza
+ízi2szo
+ízi2szó
+í2z1i2ta
+í2z1i2vá
+íz1í2v
+íz1íz
+íz1kl
+íz1k2r
+ízo2k
+íz1on
+íz1or
+íz1os
+íz1ó2rá
+íz1öb
+íz1öd
+íz1ök
+íz1ö2l
+íz1öm
+íz1ön
+íz1ör
+íz1ös
+íz1ö2v
+íz1öz
+ízpen1
+íz1pf
+íz1pl
+íz1p2r
+í2zsa2
+ízs1al
+ízs1as
+ízs1au
+íz4s1ág
+ízsá2r
+ízs1áro
+íz3sáv
+íz3seb
+í2zs1e2l
+ízse2s
+ízs1ese
+í2zs1in
+í2zs1it
+íz3sí
+í2zso
+ízs1ok
+íz3sor
+í2zs1ó2
+í2zsö
+ízs1s
+íz3str
+í2z3su
+í2zsú
+íz3sz
+íz1t2r
+í2z1ug
+í2z1uj
+ízu2me
+ízu2m1i
+íz1und
+í2z1u2r
+í2z1ut
+íz1úr
+íz1ú2t
+í2z1ü2g
+í2züle
+í2z1ür
+í2z1üs
+í2z1üt
+í2z1üv
+í2z1ü2z
+í2zűe
+í2zűn
+1í2zűr
+í2zűv
+2j.
+1ja
+j1a2cé
+2j1a2dag
+2j1a2dal
+ja2datá
+2j1a2dato
+2j1adm
+2j1a2dom
+2j1a2dot
+ja2dóh
+ja2dós
+ja2dót
+ja2dóv
+ja2dóz
+ja2dus
+ja1f2r
+ja2ga.
+2j1agg
+2j1a2gi
+2jakad
+ja2kadé
+ja2k1ál
+ja2k1á2p
+ja2k1árn
+2j1akci
+ja2k1ec
+ja2k1el
+ja2k1e2m
+ja2kes
+jak1ére
+ja2k1éri
+2jakf
+ja2k1im.
+ja2k1iz
+ja2k1í2r
+jak1k2
+2j1akku
+jako2v
+jak1ovi
+ja2kók
+ja2k1ölts
+ja2k1ös
+2j1akro
+jakt2
+2j1akt.
+2j1akti
+2j1aktu
+2j1alg
+2j1alk
+2j1all
+2j1alm
+jam2be
+2jambu
+ja2mes
+2jana.
+2jana2i
+ja2nal
+ja2nat
+2j1a2no
+jan2sze
+jan2szü
+ja2nya
+ja2ran
+2j1a2rá
+2j1arc
+ja2rom
+2j1a2szás
+2j1atk
+2j1atró
+ja2ur
+ja2uto
+2javat
+ja2xi
+ja2zon
+1já
+já2ar
+2j1á2bé
+2j1ábr
+2j1ág.
+2j1á2ga.
+2j1ág1a2d
+2j1á2gai
+2j1á2gak
+2j1á2gas
+2j1á2gat
+2j1á2gaz
+2j1á2gá
+2j1ágb
+2j1ágf
+2j1ágg
+2j1á2gi
+2j1ágk
+2j1ágr
+2j1á2gy
+jáí2r
+2j1áll
+já2n1e
+já2nék
+2jánl
+já2po
+2j1á2rada
+2j1á2rai
+2j1á2rak
+2j1á2ram
+já2rar
+já2r1av
+2j1á2rán
+járás3s
+járá2s3z
+2j1á2rát
+2j1á2ráv
+járe2
+já2r1em
+já2res
+já2rér
+2j1á2rig
+já2r1is
+2j1árki
+2j1árko
+2j1árny
+2j1á2ron
+já2r1ot
+já3ró
+já2rő
+2j1ártal
+2j1ártás
+2j1á2ruk
+2járus
+j1árut
+2j1árvál
+2j1árz
+já2s1ad
+já2sal
+já2san
+já2s1ág
+já2s1á2rai
+já2s1árak
+já2sás
+já2s1e2
+já2sit
+já2s1í
+já2s1ol
+2j1á2só
+já2sö
+jást2
+já2s1ü2
+já2sz1al
+jásze2
+já2szis
+já2sz1okta
+jász1ói
+jász1ón
+jász1ó2r
+ját1a2dó.
+ját1a2dók.
+ját1a2dón.
+ját1a2dót
+2j1á2tal
+já2t1á2
+2j1átáz
+játék1e2
+2j1átfe
+2j1áthá
+2j1á2ti
+2j1átír
+2j1átlé
+2j1átm
+ját1osz
+2j1á2t1ö
+2játszű
+2j1á2tü
+2j1átvé
+2j1átvi
+já3zs
+jba2l1
+jb2lo
+jb2ri
+jb2ró
+jbű2n1ü2
+jc3ho
+jcsapá2
+jcs1s
+jdo2nal
+j1d2rá
+j1d2ro
+j1d2ru
+jdúköz1
+1je
+jea2l
+jea2n
+je2bé
+2j1e2dén
+2j1e2dz
+jee2n
+je1f2r
+2jeged
+je2gés
+jegész1
+je2gyeg
+je2gyel
+jegy1els
+jegy1elv
+2j1e2gyesí
+je2gy1é2k
+je2gy1in
+je2gy1o
+je2győ
+je2gyu
+je2gy1ú
+je2gy1ű2rű
+j1ekcé
+je1kri
+jek2t1a2
+jek2t1á2r
+jek2t1e2l
+jek2ter
+je2laj
+je2l1an
+je2l1ap
+je2lar
+je2lav
+je2laz
+jelá2
+je2l1áb
+je2lág
+je2lál
+je2l1ár
+je2l1át1
+je2láz
+jel1e2gy
+je2l1e2l1e2v
+je2l1elk
+je2l1ell
+je2l1e2lőá
+je2l1e2lőb
+je2l1els
+je2l1emel
+2jelemé
+je2l1eml
+2j1e2lemz
+je2l1eng
+je2l1e2r
+jel1esés
+jel1esik
+je2l1esni
+je2l1e2ső
+jel1este
+je2l1esz
+je2l1etet
+jel1evo
+je2lég
+je2l1éj
+je2lél
+je2l1ép
+je2lérte
+je2l1ige
+je2lim
+je2l1inf
+je2l1ing
+je2l1int
+je2l1í2
+2j1ellen
+je2l1o2
+je2l1öv
+je2lőa
+2j1e2lőfe
+je2lőí
+2j1e2lőtu
+jel1p2
+2jelszá
+2jelszo
+2j1eltett.
+2jeltér
+je2lu
+je2lú
+2j1emba
+2j1ember
+2j1e2mel
+je2mu
+je2n1á
+jen1d2
+je2n1e2ke.
+je2n1el
+je2ner
+jene2s
+je2n1esz
+je2n1in
+je2n1o
+je2n1ő2re
+je2n1ős
+je2n1ü
+je1p2r
+2j1erd
+je2red
+je2ró
+2j1e2rő
+je2s1a
+je2s1emb
+2j1e2setb
+2j1e2sett
+je2s1ér
+je2ső
+jest2
+je1sta
+je1str
+je2su
+je2s1ü2v
+jes3zac
+je2t1am
+je2tál
+jet1ell
+je2t1em
+je2t1ék
+je2t1o
+je1tra
+je2tun
+je2tut
+jeu2r
+2j1e2vő
+jezőkész1
+1jé
+2j1ébr
+jé2g1a2
+jé2g1á2
+jégár1a2d
+jé2gec
+jé2ged
+jé2g1e2k
+jé2g1el
+jé2g1em
+jé2g1erk
+jé2g1es
+jé2get
+jé2gép
+jé2g1ér.
+jé2gés
+jég3g
+jégi2
+jé2g1id
+jé2gigé
+jé2gim
+jé2g1is
+jé2g1o
+jé2gó
+jé2gö
+2jé2gő
+jé2g1u2
+jé2gú
+2j1é2hen
+2j1é2hes
+2j1éhs
+jé2k1os
+jé2kü
+2j1é2le
+jé2lő
+2j1élt
+jé2nad
+jé2n1ess
+jé2n1é2g
+jé2nil
+jé2no
+jé2nú
+jé2pí
+jé2pü
+2j1ér.
+2j1érb
+2j1érd
+jé2reg
+2j1é2ren
+2j1é2ré
+2j1érh
+2j1é2ri
+2j1érk
+2j1érl
+2j1érm
+2j1érn
+2j1érr
+2j1érte
+2j1érté
+2j1értő
+2j1é2rü
+2j1érv
+2j1érz
+jé2tel
+2j1étk
+2j1étt
+2j1év.
+2j1évb
+jé2ve.
+2j1é2vek
+2j1é2vet
+jé2vén
+jé2vér
+jé2vét
+j1évh
+j1é2vi
+j1évk
+2j1évn
+2j1évr
+j1évt
+2j1é2vü
+j1évv
+jfeles1s
+jf2le
+jf2lo
+jf2ló
+jfölös1s
+jf2ra
+jf2re
+jf2ri
+jf2rí
+jf2ro
+jf2rö
+jfu2na
+j1g2le
+j1g2ló
+jg2ru
+jhá2r1e
+1ji
+ji2do
+j1i2dő
+2j1i2ga
+2j1i2gé
+ji2je
+2j1ikr
+2j1ill
+ji2ma
+ji2má
+ji2mi
+2j1i2na.
+ji2náb
+2j1ind
+2j1inf
+2j1ing
+2j1inj
+2j1ins
+2j1inte
+2j1inté
+ji2on
+ji2pa
+2j1i2rat
+2j1i2rá
+2j1i2ro
+2j1irr
+2j1irt
+2j1isk
+2j1ism
+2j1ist
+2j1i2ta
+2j1i2vá
+2j1i2vó
+ji2zé
+ji2zo
+1jí
+jí2gé
+jí2rá
+jí2ró
+jítókész1
+jí2ve
+jí2vé
+jí2vó
+jí2ze
+jí2zé
+jí2zü
+jí2zű
+j2j1alj
+j2j1a2z
+jjá1s
+jje2lesé
+jje2lesi
+jje2lest
+jje2l1ül
+jj1e2r
+j2j1im
+j2j1iz
+jj1ív
+jj1íz
+j2j1ol
+j2j1os
+jj1pr
+jj1üg
+jka1pr
+jk1ard
+jkau2
+j2k1e2g
+j2k1e2lő
+j2k1e2s
+jké2p1e2ké
+jkia2
+jkiá2
+j2k1id
+jkie2
+jk2la
+jk2lá
+j1k2li
+j1k2lo
+jkme2
+j2k1old
+jko2r1á2s
+jko2r1in
+jk1órá
+jk1pl
+jk1pr
+j1k2ré
+j1k2ri
+j1k2rí
+jk1st
+j2k1u2s
+jk1üg
+jk2va
+j1k2vó
+j2l1abl
+jl1a2da
+j2l1a2lap
+j2l1all
+j2l1ar
+jla2t1e2
+j2l1azo
+jlás3s
+jl1á2t1a
+jl1átn
+jl1bl
+jl1e2gy
+jleí2
+jl1elé
+jl1ell
+jl1eln
+jle2t1é2te
+jlé2cel
+jlé2c3s
+j2l1év.
+jli2k
+jl1iko
+j2l1ind
+j2l1inf
+j2l1int
+jl1obj
+j2l1ol
+jlo2n1á
+jlo2ni
+j2l1ös
+jl1pr
+jl1sp
+jl1st
+jl1t2r
+jme2g
+jm1oká
+j2m1old
+jna2l1e
+jna2lég
+jna2lis
+jn1á2rá
+jn1á2ru
+jnév1a
+jn1ing
+jn1st
+jn1ü2g
+1jo
+jo2g1a2d
+jo2g1aka
+jo2gal
+jo2g1an
+jo2g1a2z
+jo2g1á2c
+jo2g1á2l
+jo2g1e2
+jog3g
+jo2g1í
+jo2g1ol
+jo2g1or
+jo2g1osz
+jogó2
+jo2g1óv
+jo2gö
+jo2gő
+jo2gur
+jo2gü
+2j1o2koz
+2j1oks
+2j1okta
+jo2laj
+jo2lim
+joma2
+jo2m1ag
+jo2m1an
+jo2mar
+jo2m1as
+jo2m1á
+jo2m1e2
+jo2m1é2t
+jo2mév
+jom1f2
+jo2mij
+jo2m1ik
+jo2m1is
+jo2m1iv
+jo2m1ol
+jo2m1or
+jo2mö
+jo2mő
+jom1p2
+jo2mü
+jo2mű
+jonc1c
+jon2ch
+jon2cil
+jon2c3s
+2j1ond
+jo2ób
+jo2pá
+jo2pe
+jo2r1ing
+2j1orr.
+jo2rü
+2j1osto
+2j1osz
+jo2ui
+jo2uk
+jo2ul
+jo2ur
+jo2ut
+jo2va
+1jó
+jóa2k
+jóá2g
+jóá2r
+jó1bl
+jó1b2r
+jó2ce
+jó2dad
+jó2dak
+jód1all
+jó2d1a2n
+jóda2t
+jó2d1ato
+jóde2
+jó2del
+jó2dig
+jó2diz
+jó2d1ol
+jódó2
+jó2dór
+jó2dü
+jó2d3z
+jó1fl
+jó1kl
+jó1kro
+jó2l1e2s
+2j1ónn
+jó1p2r
+jó2rák
+2j1ó2ri
+jó2sal
+jó2sas
+jó2sál
+jós1árk
+jó2seg
+jó2sem
+jó2sén
+jó2sip
+jó2sis
+jó2s1o2do
+jó2sö
+jós3s
+jós1üld
+jó2s1ün
+jó2s3zár
+jó1t2r
+1jö
+jö2dé
+jö2ko
+jö2lé
+2j1önt
+jö2re
+jö2rö
+j1ösv
+j1ötv
+2j1öv.
+2jöve.
+j1ö2vez
+2j1ö2vén
+jö2zö
+1jő
+j1őrl
+jő2rö
+2j1őrt
+jő2rü
+jő2ze
+jpárba2
+jp2la
+jp2le
+jp2re
+jp2ré
+jp2ri
+jp2ro
+jp2ró
+jra3d2
+jra1f
+jrai2
+jra1p2
+jra1s2
+jrau2
+jré2sz1e2l
+jré2szí
+jsa2v1e
+jsa2v1é
+jsa2vo
+jsa2v1ón.
+jsa2v1ó2r
+jság1g
+js2ho
+js2ká
+js2ki
+js2ni
+js2pe
+js2pi
+js2po
+js2pó
+jsp2r
+j1s2ta
+js2ti
+j1s2tí
+j1s2to
+j1st2ra
+j1st2ru
+j1s2tú
+jszabás1s
+jszá2l1a2da
+jszáraz1
+jszín3n
+jsz2k
+jszt2
+j2t1a2da
+jt1a2do
+jt1a2dó
+jt1akn
+jt1a2lap
+jt1alk
+j2t1all
+j2t1alv
+jt1a2nyag
+jta1p2
+j2t1a2pá
+jt1a2rom
+j2t1arz
+jta1sp
+j2t1atk
+j2t1a2ut
+j2t1ác
+jt1ága
+j2t1áll
+jtá2rai
+j2t1á2rak
+j2t1árka
+jtá2s3z
+jt1á2t1a
+j2t1e2gy
+j2t1e2ke.
+j2t1e2leg
+j2t1e2leme
+j2telemz
+j2t1elf
+j2t1elh
+jt1eljá
+j2t1ell
+j2telmél
+j2t1e2lo
+j2t1e2lő
+j2t1elp
+j2t1elr
+j2t1els
+j2t1elv
+j2t1eml
+j2tener
+j2t1enz
+jt1e2red
+jt1e2rez
+j2t1erő
+j2t1e2tetőe
+jt1e2vés
+jt1evo
+j2t1e2vő
+j2t1é2le
+jt1élm
+j2t1érl
+j2t1érm
+jtés3s
+jt1fl
+jt1fr
+j2t1i2d
+jti2m
+j2timá
+j2t1imi
+j2t1imp
+jt1inf
+j2t1ing
+jt1int
+j2t1i2pa
+j2t1ir
+jti2s
+jt1isi
+j2t1izg
+jt1i2zo
+j2t1í2v
+j2t1í2z
+jt1kl
+jt1kr
+j2t1olda
+j2t1orjáb
+j2t1ors
+jt1osz
+j2t1o2x
+jtóa2
+jtóé2ra
+jtó1p2
+jtó1s2po
+jtó1sta
+jtó1str
+jtó1sz
+jtó1tr
+jt1ödé
+jt1öng
+jt1öss
+jtőa2
+jtőe2
+jtőé2
+jtő1s2p
+jt1pl
+jt1pr
+j1t2ran
+jtrádi2
+j1t2rág
+jt2ri
+j1t2roj
+jt2róf
+jt1sp
+jt1st
+jt1t2r
+j2t1udv
+j2t1und
+jt1utá
+j2t1új
+j2t1üg
+j2t1ü2l
+j2t1üt
+1ju
+ju2ga
+jugo1
+ju2had
+ju2h1a2k
+ju2hal
+ju2h1a2n
+juha2ra
+ju2hat
+ju2hál
+ju2h1e2
+ju2h1éj
+ju2h1is
+ju2hor
+ju2hő
+ju2hü
+2jula
+2juls
+2jural
+ju2ru
+ju2sz1a2v
+ju2szim
+ju2sz1í2
+ju2tak
+2j1u2tál
+1jú
+jú1fr
+jú2jí
+jújjáé3
+jú1pl
+jú1p2r
+jú1s2p
+jú1s2t
+jú2szó
+jú1szv
+2j1útb
+jú2ton
+2j1útv
+1jü
+jü2ge
+jü2gy
+jü2le
+jü2lé
+j1ü2lő
+j1ült
+jü2re
+jü2rí
+jü2rü
+jü2ta
+j1ü2tő
+jü2ve
+jü2ze
+1jű
+jű2ri
+jű2ző
+j2z1abl
+j2z1a2d
+jza2j
+j2z1ajá
+jz1ajt
+jza2kad
+jz1akc
+j2z1a2l
+j2z1a2ny
+j2z1ar
+j2z1as
+jza2tan
+j2z1ál
+j2z1á2rad
+j2z1á2rán
+j2z1e2l
+j2z1em
+jze2r
+jz1eré
+j2z1es
+j2z1él
+j2z1érté
+jz1fr
+jzi2g
+j2z1igé
+j2zill
+j2z1int
+j2z1i2r
+j2z1isk
+j2z1ism
+jz1k2l
+jz1k2r
+j2z1ob
+jz1okta
+j2z1olda
+j2zolvas
+j2z1osz
+j2z1ó2d
+j2z1ó2r
+jzó1s2
+j2z1ös
+j2z1öt
+jz1pl
+jz1p2r
+jz3sab
+j2zs1a2l
+j2zs1ál
+jzscsa2p1
+j2zs1eg
+j2zsen
+j2zs1er
+j2zs1in
+jz3sín
+jz3sor
+j2zs1ö2
+j2zs1ő
+jzs1s
+j2zs1u2t
+jz3sza
+jz3szá
+jz3sze
+j2z1ut
+jz1ü2g
+2k.
+1ka
+kaa2d
+kaát1
+kaáta2
+kab2a
+2kabbah
+2k1abhá
+kabi2ná
+2k1ablak.
+2k1ablaka
+2kablaká
+2k1ablakb
+2kablakh
+2kablakk
+2k1ablakok
+2k1ablakon
+2kablakos
+2k1ablakot
+2kablakr
+ka1b2le
+ka1bre
+2k1abs
+ka2cél.
+ka2c3h
+kacs1á2g
+ka2cs1ús
+ka2cü
+ka2cz
+k1adap
+2kadál
+kadás1s
+2k1a2dot
+ka2dói
+ka2dój
+2k1a2dóso
+ka2dóu
+ka2dóz
+ka1d2rá
+kaegész1
+kae2l
+kae2r
+kaé2r
+ka1f2r
+ka2gan
+2k1agg
+ka1g2r
+2k1agy.
+ka2gyu
+kai2z
+2kajánl
+2k1ajk
+2k1ajtóh
+ka2kadé
+ka2kadó
+kakas3s
+ka2kác
+2k1akc
+ka1k2l
+ka2kó.
+ka1k2ré
+ka1kri
+2k1akt.
+2k1akti
+ka1k2va
+ka2lapa
+2kalapítv
+2k1alb
+kal1egy
+2k1alf
+2k1alj.
+2k1alji
+2k1alka
+2kalko
+2k1alle
+2k1alti
+kama2te
+2k1ambu
+kana2g
+ka2nalí
+2k1a2nam
+k1a2nat
+ka2n1e2g
+ka2n1el
+2kang
+ka2nim
+ka2nio
+ka2n1iv
+ka2nol
+ka2nód
+2kante
+ka2nű
+2k1a2nya.
+2k1a2nyag
+2k1a2nyai
+ka2nyáb
+ka2nyó
+ka2óa
+ka2óá
+ka2óc
+ka2óe
+ka2óg
+ka2óha
+ka2óí
+ka2óko
+ka2ókr
+ka2óp
+ka2óü
+ka2óz
+2kapád
+ka2páto
+2kapp
+ka1p2re
+ka1p2ré
+2k1aprí
+ka1prof
+ka2r1a2d
+ka2rakk
+ka2r1a2kó
+kar1a2lap
+2k1arank
+ka2r1a2r
+kara2s
+2ka2rasz
+2karat.
+2karatn
+2karato
+ka2rau
+ka2r1ácsh
+ka2r1ácsn
+ka2r1ácst
+ka2r1ál
+2k1a2rány
+kar2c1el
+kar2dac
+kar2dál
+kar2dz
+ka2rel
+ka2rev
+kar1éke
+karé2kor
+ka2rél
+ka2r1éne
+karfe2l1
+ka2rid
+ka2r1i2ko
+ka2r1ikr
+ka2rind
+ka2r1ing.
+kar1ingb
+kar1inge
+kar1ingg
+kar1ingr
+ka2r1isk
+ka2r1ism
+kari2z
+ka2r1izo
+2k1a2roma.
+2karomá
+ka2ror
+kars2
+2k1arti
+ka2sag
+kaság1g
+ka2sál
+ka2sid
+kasi2p
+kas1ipa
+ka2siz
+ka2s1ol
+ka2s1ó2r
+ka1s2po
+kas3sze
+kas3szé
+2k1asszi
+2kasszony
+kas3sző
+kast2
+ka1str
+ka2sür
+kasz1ajt
+2kaszat
+ka2szág
+kat1ará
+ka2tél
+kat1iko
+kat1int
+ka2t1i2o
+2k1atká
+ka2tolda
+katrádi2
+ka1t2ri
+ka2tyá
+ka2ud
+2k1a2ul
+kau2n
+kau2r
+kau2s
+kau2ta
+2k1a2uto
+2k1autó.
+2kautób
+ka3utóc
+2kautóé
+2kautóh
+2kautói
+2k1autój
+2k1autók
+2kautóm
+2kautón
+2kautós
+2kautót
+2kautóv
+kaü2t
+kaü2z
+2k1a2vat
+2k1a2zon
+1ká
+2kábé
+2k1ábr
+ká2cak
+ká2ce
+2ká2c3h
+ká2có
+ká2c3sar
+ká2csat
+ká2cse
+ká2cs1ék
+ká2csip
+ká2csis
+ká2c3sor
+ká2csö
+ká2cső
+ká2cü
+ká2dab
+ká2dar
+ká2d1ác
+ká2dát
+ká2dil
+ká2dí
+ká2d1ö
+ká2d1ü2
+ká2d3z
+ká2fá
+2k1ág.
+ká2ga
+2k1ága.
+2kágacska
+ká3gacská
+2k1ágai
+2k1ágak
+2k1ágat
+2k1ágaz
+2k1á2gá
+2k1ágb
+2k1á2ge
+k1á2gé
+2k1ágg
+2k1ágh
+2k1á2gi
+2k1ágk
+2k1ágn
+2k1á2go
+2k1ágr
+2k1ágs
+2k1ágt
+2k1á2gu
+2k1á2gú
+2k1á2gy
+2k1á2hí
+ká2jö
+ká2jü
+ká2lág
+2kálái
+2kálák
+2kálán
+2káláv
+2káláz
+2k1álc
+k1áldo
+ká2l1e2
+ká2lén
+2kállamti
+2k1állap
+2k1állás
+kál2l1e2
+kállé2
+kál2lék
+2k1állí
+2k1állom
+ká2lü
+ká2lyod
+2k1á2mí
+2k1á2mu
+ká2n1ag
+ká2n1a2n
+ká2n1as
+ká2nem
+ká2n1is
+ká2n1ó2
+ká2ny1ag
+ká2ny1a2l
+ká2ny1a2n
+ká2nyap
+ká2nyar
+ká2ny1á2to
+ká2ny1e2
+ká2nyis
+ká2nyiv
+ká2nyö
+2k1á2polá
+ká2poló
+2ká2rad
+ká2r1a2g
+2k1á2rakr
+ká2rakt
+kár1akta
+kár1aktá
+ká2r1a2l
+2k1á2ram
+ká2r1a2p
+ká2rar
+ká2ras
+kár1ass
+2k1á2rat
+ká2raz
+kár1azo
+kár1áll
+ká2r1á2z
+kár1d2
+ká2r1e2
+kár1éte
+2k1á2riá
+k1árká
+kárkié2h
+ká2r1old
+ká2r1osz
+ká2rö
+ká2rő
+kárpszi2
+kárpszic3
+kár1s2
+kárt2
+kár1tr
+ká2ruh
+ká2rü
+kás1ajt
+kás1ass
+ká2s1á2go
+ká2s1á2rai
+ká2s1árak
+ká2s1á2rá
+ká2s1árb
+ká2s1á2ro
+ká2s1árr
+ká2s1árv
+ká2s1árz
+2k1á2sásá
+2kásást
+ká2s1e2
+ká2s1i2k
+ká2sim
+ká2sis
+ká2sír
+káská2r
+ká2s1ol
+ká2s1ott
+ká2só
+ká2sö
+ká2ső
+kás1p
+kást2
+kás1tr
+ká2sut
+ká2s1ü2
+2k1á2száb
+ká2szár
+kás3zár.
+2k1á2szát
+ká2sze
+ká2szé
+ká2szis
+ká2sziv
+2k1á2szom
+ká2s3zü
+ká2tab
+2k1átad
+ká2taj
+ká2tal
+kát1a2la
+ká2t1a2n
+ká2tar
+ká2tau
+ká2t1á2
+2k1átbe
+ká2t1e2
+ká2tég
+k1átfo
+ká2tip
+ká2t1ir
+ká2tis
+ká2tí
+k1átló
+2k1átme
+ká2t1osz
+kátó2
+ká2tór
+ká2t1ö
+ká2tü
+k1átvá
+kba2l1
+kbé2rel
+kb2la
+kb2le
+kb2lo
+kb2rá
+kb2ri
+kb2ro
+kb2ró
+kci2ófa
+kci2ósi
+kci2óspe
+kc2lu
+kcsa2p1á2g
+kdi2al
+kd2ra
+kd2rá
+kd2re
+kd2ro
+kd2ró
+kd2ru
+1ke
+kea2j
+kea2k
+kea2l
+kea2n
+kea2r
+kea2s
+keá2l
+keá2r
+keá2t1
+2k1eb.
+ke2bei
+ke2bek
+ke2béd
+kecs1alj
+kecs1ón
+kecs1ó2r
+ke1d2ra
+keegyez1
+kee2n
+ke2ep
+kee2s
+2k1eff
+ke1fl
+ke1f2r
+2k1e2gér
+kegész1
+2kegyb
+ke2gyék
+ke2gy1in
+2k1egyl
+2kegyn
+ke2gyö
+2kegyr
+2kegys
+ke2gyu
+ke2gy1ú
+2kegyü
+2k1e2ke.
+2k1e2kei
+2k1e2kek
+2k1e2kéé
+2k1e2kék
+ke1k2l
+ke1k2ré
+kek2sza
+2k1ekv
+2k1elad
+ke2l1an
+ke2l1a2t
+2k1elav
+ke2l1á2g
+2k1e2lef
+ke2lekc
+2k1e2lekt
+ke2l1e2l
+k1e2lemb
+2keleme
+2kelemé
+k1e2lemh
+2kelemm
+2k1e2lemn
+k1e2lemr
+2k1e2lemz
+ke2l1e2pe.
+ke2l1e2pei
+kele2p1ü2
+ke2l1e2sé
+ke2l1esze
+kele2t1el
+kele2t1o
+2keley
+ke2l1é2k
+2k1e2lél
+kel1érh
+kelés3s
+kelé2s3z
+2k1elhel
+2k1elho
+kel1id
+kel2ig
+2k1e2lim
+ke2lio
+2k1elism
+2k1e2l1í2
+2k1eljá
+k1ellá
+2kellát
+2kellená
+2kellenő
+2k1ellent
+2k1elnev
+2k1elny
+2k1e2los
+2ke2lö2l
+2k1e2lőa
+kelőé2
+2kelőfú
+ke2lőhí
+2k1e2lőí
+2k1e2lőképz
+2k1e2lőkés
+2k1e2lől
+ke2lőny
+2k1e2lőo
+ke2lőté
+2k1e2lőtt
+k1e2lőz
+k1elra
+2k1elsa
+2k1első
+2k1elszá
+kel2t1é2rő.
+2k1elto
+2keltű
+2kelül
+ke2lűr
+2k1elv.
+2k1elvá
+2k1elvei
+2k1elvek
+2k1elven
+2kelvi
+k1elvk
+2k1elvo
+2k1elvt
+2k1elvű
+ke2lyemb
+ke2ly1ékn
+kelyköz1
+2k1elz
+2k1ember
+2k1embl
+2k1embr
+2k1eml
+2k1emul
+ke2nal
+2k1enci
+kende2rül
+ken2d1ék
+2k1endo
+2k1e2ner
+2k1enge
+ke2n1ip
+ke2nis
+ke2n1o
+kens3s
+kensz2
+2k1enyv
+keo2l
+keo2r
+keó2d
+keó2h
+keó2l
+keó2r
+ke2pik
+ke2ral
+ke2rap
+ke2r1a2r
+ke2r1as
+ke2rau
+ke2r1ál
+ke2r1ár
+ke2rás
+ker2csá
+ker2csell
+kercsí2
+ker2csír
+2kerde
+2kerdő
+2k1e2rege
+2k1e2rej
+kere2k1eg
+kerekes3s
+ker1ell
+ker1elv
+ke2r1ember
+ke2r1er
+kere2ta
+kere2t1e2l
+kere2t1ö
+ke2rég
+ke2r1é2l
+ke2r1ép
+ker1éte
+ke2r1id
+ker1iga
+ke2r1ill
+ke2rim
+ke2r1ind
+ke2r1int
+ke2r1inv
+ke2rio
+ker1ist
+ke2r1iz
+ker1k2
+2kernel.
+ke2r1ol
+ke2ror
+ke2ród
+ke2r1ó2r
+ke2rőde
+ke2rőe
+ke2rőké
+ke2rőo
+ke2rősí
+ke2rőte
+kers2
+ker1sp
+ker1st
+kersz2
+ker2taj
+ker2táp
+ker2tás
+ker2t1ebbé
+ker2teg
+ker2t1este
+ker2t1esz
+ker2télv
+ker2t1é2vét
+ker2tön
+ker2töv
+ker2t1őr
+ker2t1ős
+ker1tró
+ke2rút
+kerü2g
+2k1esemé
+ke2seté
+2k1e2sett
+2k1esél
+2k1e2sés
+ke2sis
+2kesítőst
+2keskü
+2k1e2ső
+ke1s2po
+kes3széke
+kes3szó
+ke1sta
+2k1este
+2k1esté
+2k1esti
+2k1estj
+2k1estk
+2k1estn
+ke1stra
+2k1estre
+2k1estt
+2k1estün
+ke2szaj
+ke2szép
+2keszmén
+ke2tál
+ke1tc
+ke2t1e2kéh
+2k1e2teté
+ke2tid
+ke1t2ra
+ke1t2ré
+ke1t2ri
+kettes1s
+ke2tűd
+keu2r
+keu2s
+kevés3s
+ke2vid
+2k1e2vő
+keze2tés
+kezőa2
+kezőe2
+kezőkész1
+2k1ezr
+1ké
+2k1é2ber
+2k1ébr
+ké2ge
+ké2gé
+ké2gő
+2k1é2hem
+2k1é2hen
+2k1é2hes
+2kéhezé
+2kéhezt
+2k1éhs
+ké2j1ak
+ké2j1elé
+ké2jö
+ké2jut
+2k1é2ke.
+2k1é2kei
+2kékekk
+2kékem
+ké2k1e2r
+kékes3s
+kéke2s3z
+ké2kén
+ké2k1o2
+2k1é2kük
+2k1é2kű
+ké2lel
+2kéles
+2k1é2letek
+2k1é2letet
+2k1élm
+ké2lőd
+2k1é2lől
+2k1élr
+2k1é2lű
+ké2lya
+ké2ly1esz
+ké2lyid
+ké2ly1ü2l
+kéma2
+ké2mad
+ké2m1al
+ké2m1an
+ké2map
+ké2m1as
+ké2m1á
+kémi2as
+ké2min
+ké2mis
+ké2mí
+ké2mo
+ké2mö
+ké2mő
+ké2m1u2
+kéna2
+ké2n1al
+ké2nan
+ké2n1ar
+ké2n1at
+kéndio2
+2k1é2neke
+2k1é2nekh
+2k1é2neki
+2k1é2nekk
+2kénekl
+ké2n1e2l
+ké2n1em
+ké2n1er
+kén1éte
+ké2nig
+ké2nil
+ké2n1ing
+ké2no
+ké2ny1e2g
+ké2ny1elv
+ké2nyú
+ké2p1a2
+ké2p1á
+képá2r
+ké2peg
+ké2p1e2lő
+ké2p1elté
+ké2p1elv
+képe2r
+ké2p1ill
+ké2pim
+ké2p1i2p
+ké2pí
+2k1épít
+ké2p1o
+ké2pó
+ké2p1ö
+ké2pő
+kép1s
+ké2pu
+ké2pú
+ké2p1ü2lé
+ké2p1ü2lő
+kéra2
+ké2rab
+ké2ral
+ké2ram
+ké2r1an
+ké2rar
+ké2r1as
+ké2rat
+ké2r1á2
+2k1érdeke
+kér1dr
+2k1é2retts
+ké2ro
+ké2rö
+2kértelm
+2kértékb
+2k1értéke
+2k1értékh
+2k1értékn
+2k1értékr
+2k1értés
+kértő2iké
+ké2r1u2
+ké2r1ú
+kérü2
+kér1ülé
+2k1érvek
+2k1érzé
+késa2
+ké2san
+ké2s1á2
+ké2s1é2g
+ké2s1o
+ké2só
+kés3sza
+kés3szer
+kés3szél
+ké2su
+ké2süt
+ké2sza2
+kész1al
+ké2sz1á2
+ké2szeg
+késze2l
+ké2szeml
+ké2szesz
+ké2széd
+ké2sz1ékné
+ké2szin
+ké2szir
+ké2szo
+ké2sz1ó2
+ké2szö
+ké2szőr
+készt2
+ké2szu
+ké2sz1ú
+két1akar
+ké2takn
+ké2t1akó
+két1ala
+két1asp
+ké2tál
+ké2t1ed
+ké2t1eg
+ké2tel.
+ké2teln
+ké2t1e2m
+ké2t1ep
+2ké2te2r
+két1ere
+két1erk
+két1erű
+ké2tesé
+ké2t1esté
+ké2t1esz
+ké2t1e2v
+ké2t1é2
+ké2t1i2
+ké2tí
+ké2tol
+ké2t1or
+kétó2
+ké2t1ór
+ké2t1ö
+ké2tud
+ké2t1ü2
+2kétv
+2k1év.
+2k1évad
+2k1évb
+2kévei
+2k1é2vem
+2k1é2ven
+2kévet
+2k1évf
+2k1évh
+2k1é2vi.
+ké2vig
+2k1évin
+2k1évk
+2k1évn
+2k1évr
+2k1évs
+2k1évt
+2k1é2vü
+2k1évv
+ké2z1a
+ké2z1á2
+ké2zeg
+kéz1elt
+kéze2m
+kéz1eme
+ké2z1e2r
+ké2z1ism
+ké2zí
+ké2z1o
+ké2zö
+kézs2
+ké2z3sé
+kéz3st
+ké2zsu
+ké2z1u2
+kfe2l1em
+kfil2mér
+kfi2sar
+kf2jo
+kf2la
+kf2le
+kf2li
+kf2lo
+kf2ló
+kfolyói2k
+kfo2n1ó2
+kf2ra
+kf2rá
+kf2re
+kf2ri
+kf2rí
+kf2ro
+kf2rö
+kf2ru
+kg2la
+kg2nó
+kg2ra
+k1g2ráf.
+kg2ri
+kg2rí
+kg2ru
+khá2t1al
+khelyköz1
+1k2hia
+khiá2b
+k2hil
+kh2me
+1ki
+kia2d
+ki2aé
+ki2af
+kia2g
+kia2j
+kia2kar
+kia2kas
+kia2lap
+kia2lá
+kia2n
+kia2p
+kia2ra
+kia2sz
+ki2aú
+kia2v
+kiá2z
+ki1b2l
+ki1b2r
+2k1i2deá
+2k1i2deg
+2kidej
+2k1i2dét
+2kidéz
+2kidi
+ki2dio
+2kidőb
+2kidők
+2kidőm
+2k1i2dőn
+2kidőt
+ki1dró
+kie2l
+kie2m
+kie2r
+ki2eset.
+kie2t
+ki2ew
+kié2d
+kié2k
+2k1ifj
+ki1f2r
+2kiga
+ki2ga.
+2kigá
+ki2gát
+2kige
+ki2gén
+ki2géz
+ki1g2r
+ki1k2l
+ki2konn
+ki2kono
+ki1k2ré
+ki1k2ri
+ki1k2v
+2k1ille
+2kily
+ki2lye
+2k1i2ma.
+2k1i2mai
+ki2mak
+ki2máb
+2kimád
+ki2mái
+ki2máj
+ki2mák
+2k1i2mám
+ki2mán
+2kimár
+ki2mát
+ki2máv
+ki2mit
+2k1imp
+2k1i2na.
+2k1i2nai
+2k1i2náb
+2k1i2nár
+kin2csa
+kin2csá
+kin2csel
+kin2cso
+2kind
+2k1inf
+kin2gas
+2k1inj
+2k1integ
+kio2l
+kio2m
+2k1i2onn
+2k1i2ono
+2kiont.
+ki3óh
+2k1i2ón.
+2kipar
+ki1pf
+ki1p2la
+ki1ple
+ki1p2r
+2k1ips
+2k1i2rat
+2kiránn
+2kirány
+2kirg
+2k1irh
+2k1irk
+2k1i2rod
+2kirom
+2k1irr
+2k1irt
+ki2sad
+ki2s1ajtó
+ki2s1akn
+ki2sal
+ki2sap
+ki2sas
+ki2sál
+ki2s1e2c
+ki2s1elő
+ki2s1emb
+ki2s1es
+ki2s1é2k
+ki2si.
+ki2s1in
+kis1ipa
+ki2s1i2ra
+ki2s1isk
+ki1skál
+2kism
+ki1smár
+ki1s2min
+kis2nyá
+kis1oko
+ki2s1oros
+ki2sör
+ki2ső
+kisp2
+kis1pl
+ki1s2por
+ki1s2pó
+kis3sz
+kist2
+ki1s2tar
+ki1steri
+ki1stí
+ki1stop
+ki1str
+ki1stu
+ki1t2r
+kit2t1er
+kit2t1ö
+kiu2s
+kiu2t
+kiú2s
+kiú2t
+kivíz1
+2k1i2vó
+1kí
+2k1í2gé
+k1így.
+kí2ja
+kí2nal
+kí2n1árb
+kí2n1e
+kí2nél
+kí2n1ó2
+kí2rá
+2k1í2re
+2k1í2ró
+2kítm
+kítőa2
+kítőe2
+2k1ív.
+2k1ívb
+2k1í2ve
+2k1í2vé
+2k1í2vű
+kí2zé
+kí2zü
+kí2zű
+kk1abl
+k2k1a2da
+kk1ajt
+k2k1a2kad
+k2k1akk
+k2kalá
+k2k1alj
+k2k1alm
+kka2ró2ra
+k2k1a2u
+k2k1azo
+k2k1áll
+kk1árf
+kká2rok
+k2k1á2ru
+kká2s
+k2k1ásá
+k2k1áth
+k2k1átl
+kk1átu
+k2k1átv
+kk1á2zó
+kk1br
+kke2c
+kk1ecse
+kk1e2dz
+kk1e2gé
+kke2l1e2g
+k2k1e2lem
+k2k1ellő
+kke2lőá
+kk1emu
+kke2ra
+kk1erd
+kke2ró
+k2k1e2rő
+kk1e2ti
+kk1e2vé
+k2k1ég
+k2k1é2l
+k2k1épí
+k2k1érté
+k2k1érz
+kk1fr
+kk1gr
+kkiá2
+kk1i2do
+kkie2
+kk1i2ga
+k2k1igé
+k2kill
+kk1ind
+k2k1ing
+k2k1ink
+k2k1int
+kk1i2par
+k2k1i2ro
+kk1isko
+kk1ism
+k2k1í2r
+k2k1íz
+k1k2lí
+kk2ló.
+k1k2lu
+kko2laj
+kk1olló
+k2k1o2pe
+kkor2dá
+k2k1org
+kko2r1os
+kko2r1út
+k2k1orz
+k2k1oszl
+kkó1p2
+kk1ó2rá
+kkö2l
+kk1ölő
+k2k1önt
+kk1ötl
+kk1ő2ri
+kk1ő2rö
+kk1őrs
+kk1őrü
+kk1pr
+kk2ris
+kk2rit
+kk2rí
+kk1sm
+kk1sp
+kk1st
+kk1t2r
+kk1udv
+kk1urt
+k2k1utá
+k2k1új
+k2k1üg
+kk1ü2lő
+k2k1ü2t
+k2k1ü2v
+kk1üzl
+kk1űr
+kk2vó
+kla1g
+kla3ko
+kla1kri
+kla2p1áta
+kla1pla
+kla1s2k
+kla2uzá
+kláma2
+klá2mal
+klá2m1an
+klá2mas
+klá2m1á2
+klámár1a2d
+klá2m1e2g
+klá2m1eh
+klá2mel
+klá2mer
+klá2m1ér.
+klá2m1érté
+klá2m1i2k
+klá2min
+klá2mis
+klá2mol
+kleí2
+kle2t1a2n
+kle2tál
+kle2t1elv
+kle2t1e2r
+kle2t1e2v
+kle2t1ér.
+kle2t1étbe
+kle2t1é2té
+kle2t1é2ve.
+kle2tin
+k2lini
+klió2
+kli2pel
+k2lisé
+kli2só
+1k2lím
+k2loá
+k2lopf
+k2loty
+kló2rad
+kló2raj
+kló2ran
+kló2rat
+kló2ris
+kló2rol
+k2lub
+klu2b1a
+klu2bá
+klu2b1e
+klu2bir
+klu2bol
+klu2se
+klus3s
+klu2s3z
+kma1b
+kmai2ko
+kmas2
+kmá2nyan
+knag2
+knak2
+kna1kr
+kni2a2
+knika2
+kni2k1al
+kni2k1as
+kni1sz2
+knőc1c
+kn2ő3r
+1ko
+ko2áz
+ko2be
+2k1obs
+ko2cho
+2k1o2dav
+2k1o2dú
+kogás1s
+ko1g2ra
+ko2kád
+2koke2
+ko2k1er
+2k1o2k1ir
+2k1o2kí
+2k1okl
+2k1okm
+2k1o2kol
+ko2k1o2v
+2k1o2koz
+kok2sze
+2k1okta
+kol1ajt
+kol1áro
+2k1oldal
+2k1oldá
+2k1oldó
+ko2lid
+ko2l1igá
+ko2limp
+ko2l1i2na.
+ko2lita
+kol2l1ad
+kol2lál
+kol2lel
+kol2les
+kol2l1ét
+ko2lö
+2k1oltár
+2kolvas
+2k1ombu
+ko2mil
+kom2p1ér.
+kom2p1ol
+ko2n1a2d
+ko2naj
+ko2n1a2l
+ko2n1a2n
+ko2n1ar
+ko2n1as
+ko2n1au
+ko2n1ál
+2konbá
+2konbet
+konc1c
+koncé2
+kon2ch
+kon2csá
+kon2c3sor.
+kon2c3soro
+ko2n1e
+2konén
+ko2n1ér.
+2kongu
+2konhab
+ko2nir
+2konog
+ko2n1ol
+2konola
+ko2nor
+2konosn
+2konosr
+2konost
+2konpa
+2konpr
+2konrét
+2kontö
+ko2nü
+ko2nyag
+ko2nyal
+ko2nye
+ko2nyó
+konz2
+2konzs
+ko2ón
+kopá2sé
+2kopc
+ko1pro
+2kopti
+ko2r1a2d
+ko2rag
+ko2r1aj
+ko2r1a2n
+kor1ass
+ko2r1aszt
+ko2r1átl
+2k1orch
+kor2csal
+kor2dad
+kor2d1ag
+kor2d1a2s
+kor2dác
+kord1d
+kor2d1e2l
+kor2dem
+kor2des
+k1ordít
+kor2d1ö
+kor2d3z
+ko2r1e2c
+ko2reg
+ko2r1el
+ko2r1er
+ko2r1es
+kor1f2
+korgás1s
+2korie
+kor1ill
+ko2r1ing
+ko2r1inte
+kor1isk
+ko2r1i2zom
+ko2rosz
+ko2r1o2v
+ko2r1ói
+ko2rón
+ko2rö
+ko2rő
+2k1orr.
+2korrk
+2k1orrt
+kor1s2
+kor1t2r
+ko2r1úto
+ko2rü
+ko2s1as
+ko2sál
+ko2se
+kos3sze
+kos3szo
+kos3szü
+2k1ostr
+ko2sü
+ko2szal
+ko2szer
+ko2szir
+ko2szí
+k2oszo
+ko2szó
+2kosztá
+kotókész1
+kotó1st
+ko2ut
+2kovaria
+ko2vié
+ko2xi
+koza2tal
+kozókész1
+kozóköz1
+2kozóö
+1kó
+kóa2d
+kó1bl
+kóc3c
+kó2cem
+kó2ch
+kó2d1ab
+kó2dak
+kó2d1a2l
+kó2d1a2n
+kó2daz
+kód1d
+kó2d1e2l
+kó2dem
+kó2d1e2r
+kó2d1es
+kó2d1és
+kó2din
+kó2dö
+kó2dü
+kó2dzá
+kóé2r
+kó1f2r
+kói2g
+kóí2v
+kó1kré
+kó1kv
+2k1ó2né.
+kó2nét
+2k1ó2ni.
+2k1ó2no
+kó2pan
+kó2p1as
+kó2p1e2l
+kó2pir
+kópó2
+kó2p1ór
+kó2pü
+2k1ó2raa
+kó2r1a2c
+2k1ó2rai
+kó2r1a2n
+kó2ras
+kó2ráb
+kó2rád
+kó2rág
+kó2rái
+k1ó2ráj
+kó2rám
+kó2rán
+kó2rár
+kó2rát
+kó2ráv
+kó2rel
+kóre2s
+kó2réj
+kó2r1éve
+kó2r1ir
+kó2r1ok
+kóro2ka
+kóro2ko
+kór1osto
+2kóród
+kó2r1ódá
+kó2rő
+2k1ó2ságú
+kó1slá
+kó2s1os
+kó1s2pe
+kó1spi
+kó1s2po
+kó1str
+kó2s1ü2
+kó2s3zára
+2k1ó2vó
+kó2z1a2m
+1kö
+kö2ba
+köb1öll
+köb1öln
+köb1ölr
+köb1ölt
+kö2da
+kö2dá
+kö2del
+kö2der
+kö2dev
+kö2do
+kö2dó
+kö2du
+kö2dú
+kö2dz
+2k1ö2ko
+2k1ökrö
+köl2csal
+köl2csá
+köl2csel
+köl2cs1ő2
+2k1ölel
+köles3s
+2k1ö2léssz
+kö2lí
+kö2lőe
+költa2
+köl2tal
+köl2t1e2v
+2k1öng
+k1önté
+k1öntő
+k1öntv
+köny2v1a
+köny2vá
+kö2ra
+kö2rá
+k1ördö
+kö2red
+kö2r1e2g
+kö2rék
+kö2r1étt
+kör1f2
+kö2rik
+kö2r1iz
+kö2ro
+kö2ró
+kö2r1ö2l
+kö2r1ő2
+kör1p2
+kör1s2
+kört2
+kör1tr
+kö2ru
+kö2rú
+körü2l1et
+körü2lé
+kö2r1ülés
+körü2lő
+kö2r1ülő.
+2körv.
+2körvb
+2körvh
+2körvn
+2k1örvö
+2körvr
+2körvt
+2körvü
+2körvű
+2körvv
+k1öszt
+2kötlé
+k1ötvö
+2k1öv.
+2k1övb
+2k1övh
+2k1ö2vig
+2k1övr
+2k1övv
+kö2za
+kö2zá
+kö2zen
+kö2z1é2k
+kö2z1í
+kö2zo
+kö2zó
+közőe2
+kö2z3s
+kö2zu
+kö2zú
+kö2z1ü2lé
+kö2z1ü2lő
+1kő
+kőa2n
+kő1bl
+kő2ch
+kő1dra
+kőe2k
+kőe2l
+kőe2r
+kőé2l
+kőé2ne
+kő1f2r
+kő1gn
+kő1gr
+kői2t
+kő1kr
+kő1pl
+kő1pr
+kőr1an
+k1ő2rei
+kőre2s
+kőr1esz
+k1ő2ri.
+kő2ril
+kő2rip
+kő2riv
+k1őrl
+kőr1s2
+kő2rül
+2k1őrz
+kő1s2k
+kő2sö
+kő1s2t
+kő1tr
+kőu2t
+kpára2
+kpá2rad
+kpá2r1at
+kpá2r1ál
+kpá2r1út
+kp2la
+kp2le
+kp2lé
+kp2lu
+kpó2t
+kp2ra
+kp2re
+kp2ré
+kp2ri
+kp2rí
+kp2ro
+kp2ró
+kp2sz
+k2rach
+kra2chi
+1k2rajc
+k2rakk
+kra1p
+krá2sz1e
+kren2d1ő2
+k2reo
+k2repá
+1k2rémh
+1k2réml
+1k2rémr
+kré3p2
+1k2rist
+1k2riti
+kro1g2
+1krokett.
+1krokod
+kro2n1a2
+kro2ná
+kron1d2
+kro2n1e
+kro1p2
+kro1str
+kro1sz2f
+kró2mar
+kró2m1e
+kró2mis
+k2rómo
+1k2rónik
+k2rup
+k2s1a2rá
+ks1elo
+ksé2gele
+ksé2gis
+kségü2l
+ksé2g1ülé
+k1s2ká
+ks2ko
+k1s2la
+ks2lá
+ks2lu
+ks2mi
+k1s2ni
+ks2pa
+ks2pe
+ks2pi
+ks2po
+ks2pó
+ksp2r
+ks2rá
+k1s2ta
+k1s2tá
+ks2ti
+k1s2tí
+ks2to
+k1st2r
+k1s2tu
+k1s2tú
+k2sz1a2d
+kszae2
+k2szagy
+k2sz1aj
+ksza2ke
+ksza2ké
+ksza2k1ü
+k2sz1am
+ksz1any
+ksz1aré
+k2sz1ág
+kszáraz1
+k2sz1e2gy
+k2sz1ela
+k2szemu
+k2sz1eng
+k2szev
+ksz1élet
+kszé2t1
+k2sz1id
+kszilá2
+kszi2p
+ksz1ipa
+ksz1isk
+k2szír
+k2sz1old
+k2szoltó
+k2sz1osz
+kszö2g1ell
+kszö2g1elv
+kszt2
+k2szuni
+k2szut
+k2sz1üg
+k2szüt
+k2sz1ü2z
+ksz1z
+kt1a2da
+kt1ajá
+kt1a2lap
+k2t1alb
+k2t1all
+kta2n1á2s
+kta2n1ó2
+kta1p2
+k2t1arm
+kt1a2ud
+kt1azo
+kt1ábr
+ktá2lal
+kt1álló
+k2t1álm
+ktára2d
+ktá2r1ada
+ktár1adó
+ktá2raj
+ktá2r1az
+k2t1átf
+k2t1átv
+k2t1e2g
+k2t1elg
+k2t1elh
+kt1eljá
+k2t1ell
+k2t1els
+k2t1elv
+k2t1enz
+kte2rad
+kte2ral
+kte2rár
+kte2rát
+kte2reg
+kte2r1e2l
+kte2r1in
+kte2rosz
+k2t1esem
+kté2lő
+k2t1érl
+k2térmi
+k2t1érte
+k2t1éss
+k2t1é2vet
+kt1fr
+kt1gr
+k2t1id
+kti2g
+k2t1igé
+kt1ill
+kti2m
+kt1ima
+k2t1ind
+k2t1inf
+k2t1i2r
+k2t1isk
+k2t1ism
+k2t1i2vás
+k2t1íg
+k2t1í2r
+ktív1e2l
+kto1g2ra
+kto2n1á
+kt1ope
+kto2ras
+kto2r1e
+kto2rol
+k2t1ös
+k2t1öt
+kt1pr
+k1t2ran
+k1trau
+k1tréf
+k1t2rén
+k1t2rió
+ktro2ná
+k1t2rón
+kt1sp
+kt1st
+kt1sz
+kt1t2r
+ktu2m1e
+ktu2min
+ktu2sab
+ktu2s1an
+ktu2szár
+ktu2sze
+ktu2szé
+ktü2l
+k2t1ülé
+k2t1üt
+k2t1ü2v
+1ku
+kuá2r
+2k1ucc
+kue2l
+kue2r
+kue2s
+ku1f2r
+2k1u2go
+2k1ugr
+ku2gya
+2k1ujj.
+2kujja.
+2kujjad
+kuj2j1a2da
+2kujjai
+2kujjak
+2k1ujjal
+2kujjam
+2kujjas
+2kujjat
+2k1ujjá
+2kujjb
+2kujjg
+2kujjh
+2kujji
+2kujjk
+2kujjn
+2k1ujjo
+2kujjp
+2kujjr
+2kujjs
+2kujjt
+2kujju
+2kujjú
+kuk2k1ó2
+kula1k
+kul2csal
+kul2cse
+kulus1s
+ku2m1a2d
+ku2mal
+ku2mü
+ku2nad
+ku2nal
+ku2n1ás
+ku2ne
+ku2n1in
+kun3n
+ku2nor
+ku2n1ó2
+ku2nü
+2k1up.
+2kupr
+2kupu
+ku2rad
+2k1u2rai
+ku2rak
+2kural
+ku2ram
+ku2ráu
+2k1urn
+ku2rol
+kuru2c3s
+ku2sal
+ku2sas
+ku2sál
+ku2s1e2
+ku2sis
+ku2s1i2z
+ku2s1ó2
+ku2sö
+kus3sze
+ku2s1ú
+ku2sü
+ku2szal
+ku2szar
+kusz1es
+ku2sz1é2l
+ku2sz1é2p
+ku2szét
+ku2sz1il
+ku2szis
+ku2szü
+2kutaló
+2k1u2tasí
+2k1u2taz
+ku2tál
+2k1u2tán
+2k1utc
+2k1u2tol
+2k1u2tód
+ku2tóp
+ku2zs
+1kú
+kú2jí
+2k1újs
+kú2p1a2
+kú2p1á
+kú2p1e
+kú2t1a2
+kú2t1á2
+kú2t1e
+kútfé2
+kútfél1
+kú2tos
+kú2t1ő
+2kú2tu
+kú2t1ü2
+1kü
+kü2ge
+kü2gy
+2k1ü2lep
+kü2lo
+kül2t1á
+2küreg
+2k1ü2rí
+kü2rü
+2k1üst
+kü2szá
+kü2szí
+2k1ütk
+küvés3s
+2k1ü2vö
+2k1ü2ze
+1kű
+2k1űrh
+2k1űrm
+kű2ro
+kű2r1ős
+kű2zé
+kű2ző
+1k2van
+k2varc
+1k2vark
+kvá2nyol
+kvárosi2
+kvé2sel
+kvé2so
+kvés3s
+1k2vin
+1k2vitt
+k2vóc
+k2vóta
+k2vótá
+kvőcsa2
+1ky
+kyd2n
+ky2fajtán
+ky2fajtár
+ky2fajtát
+ky1i2s
+ky1i2v
+kyk2k
+kyk2ne
+ky2se
+ky2s1ü2
+ky1üz
+kza2tal
+kza2t1e2
+kza2t1ó2
+2l.
+1la
+laa2d
+laát1
+laáta2
+2labár
+3labd
+2labr
+2l1abs
+la2c1ag
+la2c1aj
+la2c1al
+la2cem
+la2c1ete
+la2c3ha
+la2ché
+lac1ita
+lac2k1orr
+lac1orr
+la2c1ö2
+la2cő
+la2csalj
+lac3ság
+la2c3sor
+lac3sül
+lac3süt
+lac3sz
+la2cú
+la2cü
+2l1a2data
+2l1a2datb
+2l1a2datk
+2l1a2datn
+2l1a2dato
+2l1a2datr
+2l1a2datt
+2l1a2datu
+ladás1s
+2l1adl
+2l1a2dog
+2ladomá
+3l2a3don
+ladói2ko
+2l1a2duk
+la1dy2
+lae2d
+lae2l
+lae2r
+laé2d
+laé2r
+2laff
+la1fl
+la2gac
+lag1a2dó
+la2g1a2n
+lag1ass
+la2g1a2t
+la2gau
+la2gav
+la2gág
+lag1áll
+lag1ár.
+lag1árá
+lag1árb
+lag1áre
+lag1á2ré
+lag1árf
+lag1árh
+lag1árk
+lag1árm
+lag1árn
+lag1á2ro
+lag1árr
+lag1árs
+lag1árt
+la2g1ere
+la2gés
+la2gid
+la2g1i2k
+la2gim
+la2gis
+la2gí
+la2g1ont
+la2g1osz
+la2góc
+la2g1ó2rá
+la2góvá
+la2gön
+la2g1ud
+la2g1ur
+la2g1ut
+la2g1ü
+la2gű
+la2gyú
+la2ire
+la2jag
+la2j1a2l
+la2jap
+la2j1ar
+laj1ass
+laj1a2sz
+la2j1az
+la2j1ál
+2lajánl
+la2j1ár.
+la2j1árh
+la2j1árn
+la2j1árs
+la2j1árt
+la2jás
+la2j1áth
+la2j1áts
+la2j1elt
+la2jen
+la2j1es
+laji2
+la2jin
+la2j1is
+la2jí
+la2j1ol
+la2j1oml
+la2j1or
+2lajoz
+la2j1ór
+la2j1ös
+la2jő
+l2ajs
+laj1sz
+la2j1u2t
+la2j1ü2
+la2kad
+lak1alj
+la2k1alm
+la2k1a2lo
+laka2t1a2n
+la2k1ác
+la2k1álk
+lak1áll
+la2k1árn
+lak1ásás
+2lakci
+la2k1eg
+la2k1e2l
+la2k1ér.
+la2kérte
+la2k1iko
+la2k1ír
+lak2k1as
+lak2kec
+lak2kel
+lak2kol
+2l1akkor
+lak2köl
+la1klu
+2laknáb
+2laknáh
+2laknás
+la2kob
+la2k1op
+la2k1orm
+la2k1osz
+la2k1ov
+2lakóz
+la2k1ös
+la1k2rém
+lak2rip
+la1k2ru
+lakt2
+2l1akt.
+2l1aktiv
+la2kuj
+2lakulá
+2lakulg
+2lakulh
+2lakulj
+2lakuln
+2lakulo
+2lakuló
+2lakuls
+2lakulu
+2lakulv
+2lakús
+la2k1ú2to
+2lakúv
+2lakza
+la2la2g1
+la2laku
+2laláí
+lalás1s
+2l1alb
+2l1alc
+2l1alf
+2laljn
+2l1alka
+2l1alkot
+2l1alku
+2l1alle
+lal2tár
+lal2te
+2l1alti.
+2laltonk
+lal2t1ó2
+lal2t1ü2
+2laltvé
+2l1alvi
+lam1ada
+la2m1aka
+la2m1any
+la2m1a2p
+la2m1ará
+la2m1a2z
+lame2g
+la2m1egy
+la2m1ele
+lam1emb
+la2m1esz
+la2mék
+lam1éle
+la2méne
+la2m1érv
+la2minv
+la2m1ism
+la2m1ist
+la2m1í2
+2l1ammó
+la2m1ol
+lam1org
+la2m1osz
+la2m1ó2r
+la2mö
+la2m1ur
+la2m1ü
+la2n1a2d
+lana2g
+la2n1aj
+la2nal
+lan1ala
+la2nam
+la2nar
+la2n1áll
+la2n1ár.
+la2n1á2rai
+la2n1á2rak
+la2n1á2rá
+la2n1árr
+la2n1árv
+lanás1s
+lan2csel
+lan2csem
+lan2csi
+lan2csol
+lan2d1ál
+lan2d1el
+lan2d1ér.
+lan2diz
+la2ner
+la2nes
+la2n1ép
+lan2g1as
+lan2gen
+lang3g
+2l1angin
+la2nil
+la2nip
+la2nis
+2l1ankét
+lan1kr
+la2n1osz
+lans2
+lan2tag
+2lantác
+la2nü
+la2nyag
+lany1a2la
+la2nyau
+2lanyái
+la2ny1ál
+2lanyán
+la2nyás
+2lanyáv
+la2ny1e2lem
+lany1e2rő
+la2ny1í2r
+la2ny1ol
+la2nyó
+la2nyü
+laó2r
+2l1a2pa.
+lap1akk
+lap1akt
+lap1a2la
+lap1alk
+la2p1atm
+la2p1att
+la2p1a2u
+la2paz
+la2páb
+la2p1á2g
+la2pák
+la2pán
+lap1á2rá
+lap1árh
+la2p1árr
+la2pe2l
+lap1ele
+la2pem
+la2p1en
+la2p1es
+la2pik
+lap1illa
+lap1ille
+la2p1im
+la2p1i2na.
+la2p1ing
+la2p1int
+la2p1i2p
+la2p1i2s
+la2p1ita
+la2p1iz
+lap2lat
+la2p1o2ku
+lap1org
+lap1orn
+lap1orz
+lapos1s
+la2pó.
+la2pób
+la2pón
+la2pór
+la2pö
+la2pő
+2lappar
+2laprí
+lap1s2
+2lapún
+2lapúv
+la2pű
+la2ra.
+la2ran
+2l1arc
+larc3c
+2l1a2rén
+lar2m1e
+lar2min
+2l1art
+2l1arz
+la1s2pa
+la1s2pi
+la1stra
+la2sz1abl
+lasz1alt.
+la2szas
+2l1a2szat
+la2szás
+la2sz1én
+la2szód
+lasz3s
+lasz2t1alj
+l1asztam
+la2sz1út
+la2t1a2d
+la2t1aj
+lat1alak
+la2t1alk
+la2t1alt
+lat1ará
+la2t1a2ro
+lat1arti
+lat1aszt
+lat1att
+la2tau
+la2taz
+la2t1áj
+lat1áll
+la2t1árad
+la2t1á2rai
+la2t1á2rak
+la2t1á2ram
+la2t1á2rat
+la2t1á2ráb
+la2t1á2ráh
+la2t1á2rán
+la2t1á2ré
+la2t1árh
+la2t1árn
+la2t1á2rok
+la2t1árr
+lat1ártá
+la2t1ártó
+la2t1á2rú
+la2t1árv
+lat1ász
+la2t1áta
+latdi2al
+la2t1e2g
+la2telem
+la2t1ell
+la2tep
+la2t1erk
+late2s
+la2t1ess
+la2tesze
+la2t1eti
+la2t1eto
+la2t1e2vő
+la2t1éke
+lat1é2ké
+lat1ékk
+la2t1é2ré
+la2t1é2rő
+la2térte
+la2t1érv
+lat1éss
+la2t1i2ko
+lat1ikra
+lat1inte
+la2t1inv
+la2t1ist
+la2t1iz
+la2t1ír
+lat1ívé
+lat1k2
+la2toj
+la2t1okm
+lat1olda
+la2toll
+lat1oml
+la2t1osz
+la2t1otth
+la2t1órá
+la2t1óri
+la2t1övi
+la2t1ö2vö
+la2t1őr
+2l1attako
+latta2n1ó2
+2lattv
+la2tut
+la2tül
+lat1üze
+latű2z
+la2t1űző
+la2tyá
+la2ub
+la2uk
+la2us
+la2uto
+laü2z
+la2vat
+2l1a2vu
+la1yé
+la1yig
+2layrő
+lazac1c
+laza2c3s
+lazma1
+2lazmá
+2l1a2zon
+1lá
+lá2bar
+lábas1s
+lá2bál
+lá2b1e2l
+lá2b1ina
+lá2b1i2z
+láb1org
+láb1orr
+lá2bö
+lá2bő
+2lábrá
+lá2b1u2s
+lá2bü
+lácsé2
+lá2csét
+lá2cs1il
+lá2csip
+lá2csí
+láda1s
+lá2d1az
+lá2d1e2r
+lá2det
+lá2dim
+lá2d1or
+lá2d1ott
+lá2d1ó
+lá2dül
+lá2dz
+lá2gab
+lá2gac
+lág1a2da
+lá2g1a2g
+lá2g1al
+lá2gan
+lá2gas
+lág1ass
+lága2t
+lá2g1atl
+lá2g1ato
+lá2g1att
+lá2gál
+lág1áll
+lá2gám
+lá2g1á2rak
+lá2g1á2ro
+lá2g1á2to
+lá2gép
+lá2gid
+lá2gigé
+lá2gim
+lá2g1ott
+lá2g1ó2
+lá2gő
+lág1s
+lá2gü
+lá2gű
+2lágyá
+2lágyo
+lá2has
+2láhe
+láí2r
+lá2lad
+lá2l1aka
+lá2l1al
+lála2n
+lá2l1any
+lá2l1ar
+lá2lau
+lá2l1ág
+lá2l1á2l
+lálás1s
+lá2l1átj
+2láldás
+2láldoz
+lá2lel
+lá2l1est
+lá2l1e2v
+lá2lél
+lá2lim
+lá2l1is
+lá2lí
+2l1állam
+2l1állat
+2l1állás
+2l1állk
+2l1állom
+2l1állv
+2lálmaim
+2lálmok.
+2lálmom
+2l1álmos
+2lálmuk
+2lálmunkb
+2lálokaih
+2lálokain
+2lálokair
+2lálokán
+2lálokát
+2lálokáu
+lá2l1o2ko
+2lálokonk
+2láloku
+lál1órá
+lálö2
+lá2l1öv
+2l1álut
+lá2l1út
+lá2lü
+lá2lű
+lá2m1a2d
+lá2m1aj
+lám1ass
+lá2m1au
+lá2m1ál
+lá2m1á2z
+lám1b2
+lám1ell
+lám1erő
+lá2mes
+lá2mék
+lá2m1érv
+lá2m1int
+lám1ist
+lá2mí
+lá2m1or
+lá2mó
+lá2mö
+lá2mő
+lá2m1út.
+lá2mü
+lá2mű
+lána2
+lá2n1ag
+lá2nal
+lá2n1an
+lá2nar
+lá2n1as
+láná2
+lá2nár
+lánc3c
+lán2cel
+lán2c1ég
+lán2csá
+lá2nem
+lá2n1er
+lá2nép
+lán2g1at
+lán2gál
+lán2g1e
+lá2nil
+lá2n1is
+lán2k1e2l
+lán2k1ó2ra
+lán2k1ö2v
+lá3nok
+lá2nol
+lán1sp
+lán1sz
+lánt2
+lán1tr
+lá2nü
+lá2nyaj
+lá2nyala
+lá2nyam
+lánya2n
+lá2nyar
+lá2ny1as
+lá2nyav
+lá2nyel
+lá2ny1ér.
+lá2nyó
+lá2nyö
+lá2pét
+lápi2
+2l1á2pol
+lá2rad
+2l1á2rai
+lá2raka
+l1á2rakb
+l1á2rakk
+l1á2rakr
+lá2r1a2l
+2l1á2ram
+2l1á2rat
+lá2r1av
+l1á2raz
+2láren
+lá2res
+l1árkot
+2l1árnya
+lár1s2
+lárt2
+lár1tr
+2láru.
+lá2rug
+2l1á2ruh
+2l1á2ruk
+2l1á2rul
+2lárus
+2l1árut
+2láruv
+lá2rúa
+lá2rü
+lá2s1a2d
+lá2s1aj
+lá2sal
+lá2s1a2r
+lá2saz
+lá2s1á2g
+lá2s1á2rai
+lá2s1árak
+lá2s1á2rá
+lá2s1árb
+lá2s1á2ré
+lá2s1árh
+lá2s1árr
+lá2s1árt
+2l1á2sás
+lá2s1á2to
+lá2se
+lásegyez1
+lá2sír
+lá2sott
+lás1otth
+lásó2
+2l1á2só.
+lás1ór
+lá2ső
+lás3szé
+lá2sut
+lá2sű
+lá2szas
+lás3zav
+2lászed
+lá2szeg
+lá2sz1e2m
+lá2szen
+lá2szip
+lászkész1
+lászö2
+lá2szöl
+lá2szöv
+lász3s
+lá2szü
+lá2taj
+lá2t1e2re
+láté2tel
+2l1áthe
+lá2t1i2o
+2l1á2tí
+2látkö
+lá2t1osz
+lá1t2rá
+lá1tri
+2l1átte
+2l1áttö
+2l1áttű
+l1átús
+2l1átvé
+l1átvi
+2lávi
+lá2viz
+2l1á2vó
+2lávu
+lá2z1adot
+lá2z1al
+lá2z1árh
+láz2árus
+3lázb
+lá2z1el
+lá2z1i2s
+lázo2
+lá2z1olt
+lá2zsal
+lá2zsan
+lá2zsó
+láz3sz
+l2b1is
+lb2li
+lb2lo
+lb2lú
+lb2ra
+lb2re
+lb2ri
+lb2ro
+lb2ró
+lb2ru
+lc1ajt
+lc1alk
+l2c1a2to
+l2c1ág
+l2c1ál
+lc3csi
+lc3cso
+lc3csö
+l2c1e2le
+lc1elr
+l2c1emb
+lc1emel
+lc1esz
+l2c1e2v
+lce2z
+l2c1eze
+l2c1ép
+lc1évi
+lc1fr
+lc3ha
+lc3há
+lc3ho
+lc3hu
+lc3hú
+lc3hü
+l2c1i2d
+lci2tér
+lc1ív
+lc1k2r
+l1c2lu
+l2c1ost
+l2c1osz
+lc1ó2r
+lc1ök
+lc1ös
+lc1pr
+l2cs1a2d
+l2csakt
+lcs1alap
+l2cs1a2n
+lcsa2p1á2g
+lcs1apr
+lcsa2r
+lcs1ara
+lcs1aro
+l2cs1a2s
+l2csaz
+lcs1ág
+l2cs1ál
+l2cs1á2t1a2
+l2csátá
+l2cs1áth
+l2cs1átj
+l2csátv
+l2csec
+l2cs1e2g
+l2c3sej
+lcs1elf
+l2cs1elt
+l2cs1elv
+lcs1emb
+lcs1eml
+l2cserd
+lcse2r1e2l
+lcs1erő
+lcs1ese
+lcse2t
+l2cs1ete
+l2csél
+l2cs1é2rés
+l2csérle
+l2csérte
+l2cs1érté
+lcs1érve
+l2cs1érvé
+lcsé2sz1ék
+l2cs1é2te
+l2cs1étk
+l2cs1é2vét
+l2csidé
+l2csimi
+l2cs1inf
+l2cs1ing
+l2cs1int
+l2cs1i2pa
+l2cs1irt
+l2cs1isk
+l2cs1ism
+l2csita
+l2cs1í2z
+lcs1k2
+l2cs1okm
+lcs1ors
+l2cs1ö2l
+lcs1ő2sé
+lcs1s
+lc3str
+lc3sug
+lcs1ült
+lc3szo
+lc3szó
+lc1tr
+l2c1uj
+lc1ül
+lc1üt
+lc3zá
+lc3zo
+ld1abl
+ld1abr
+l2d1a2cé
+ld1a2dato
+l2d1a2dá
+ldai2
+lda2lag
+lda2laj
+lda2l1e2g
+lda2lel
+lda2les
+lda2l1é2l
+lda2liz
+lda2l1í2
+lda2los
+ldalt2
+l2d1ant
+lda2nya
+lda2nyá
+ld1apó
+l2d1aran
+l2d1arc
+l2d1ark
+lda2t1as
+lda2t1eg
+lda2t1in
+lda2tós
+ld1ág
+ld1áll
+ld1álm
+ld1árn
+ldás3s
+ld1br
+ld1egy
+l2d1e2kék
+l2d1e2kén
+l2d1e2kétő
+l2d1e2l1a
+l2d1e2leme
+l2d1e2lemi
+l2d1e2lemn
+l2d1elér
+l2d1elk
+l2d1ellá
+l2d1elo
+l2d1e2lőh
+l2d1e2lővez
+l2d1els
+l2d1eltá
+l2d1elvé
+l2d1ember
+l2d1e2mel
+l2d1eml
+lde1p2
+ld1epe
+l2d1erő
+ld1e2vé
+l2d1ex
+l2d1é2g
+l2d1é2jér
+ld1élm
+l2d1ép
+l2d1érc
+l2d1éré
+l2d1é2ri
+l2d1érte
+l2d1érz
+l2d1ész
+ldé2ves
+ld1fl
+ld1fr
+ld1gl
+ld1gr
+l2d1i2ga
+l2d1igé
+l2d1ill
+l2d1imi
+ld1ind
+l2d1int
+ldi2p
+ld1ipa
+l2d1isza
+l2d1ín
+l2d1ír
+l2d1íz
+ld1kr
+ld1kv
+ldo2g1as
+l2d1ola
+l2d1old
+l2d1olt
+ld1oml
+ld1orc
+ld1org
+l2d1osz
+l2d1ó2rá
+l2d1óri
+l2d1öb
+ld1ökle
+l2d1örök
+l2d1öv
+ld1őri
+ld1ősk
+ld1pl
+ld1pr
+ld2rót
+ld1sp
+ld1st
+ld1udv
+ldu2r
+ld1ura
+ldus3s
+l2d1u2t
+l2d1új
+l2d1úr
+l2d1ú2t
+l2d1üg
+l2d1üle
+l2d1ür
+l2d1üz
+l2d1űr
+ld3zá
+ld3zó
+ld3zu
+1le
+lea2bá
+lea2d
+lea2g
+lea2k
+lea2l
+lea2n
+lea2p
+le2aré
+lea2sz
+lea2v
+leá2j
+leá2s
+leá2z
+2l1e2béd
+le2bin
+le1bla
+le1bra
+leb2rek
+leb2s
+2lecc
+2l1e2cet
+2l1ecset
+l1eddi
+le1d2res
+le1dro
+lee2s
+leé2r
+lefona2
+lefo2nal
+le1fr
+2l1eft
+le2gala
+lega2r
+le2g1a2s
+le2g1áll
+le3g2áto
+le3g2áz
+le3geb
+le2g1e2g
+le3g2elem.
+leg1ell
+le3g2előa
+le3g2előj
+le3g2előké
+le3g2előt
+le3gelőze
+le3g2elve.
+le3g2elvé
+le2gene
+le3g2erj
+le3ges.
+le3geseb
+le3gesek
+le3gesen.
+le3g2esn
+le3gesr
+le3gest
+le2g1e2sz
+legé2d
+legé2l
+le3gén
+legg2
+le2gid
+le2g1is
+legmeg1
+le3g2on
+le2góv
+le3göng
+le2g1ös
+legpec1
+legvíz1
+legyá2
+2legyb
+2legyed
+l1e2gyel
+legy1e2lőr
+l1e2gyenge
+l1e2gyék
+le3gyi
+2legyí
+2l1egyl
+le3gyo
+2legys
+l1egysé
+le3gyú
+le3gyű
+2l1egyv
+le2ic
+lei2g
+lei2rá
+lei2s
+lej2ta
+lej2t1á
+le2kad
+le2k1a2pu.
+le2k1ál
+leká2p
+le2k1ár.
+le2k1ára
+le2k1árb
+2l1e2ke.
+le2k1eg
+lek1els
+lek1emb
+lek1eme
+lek1erj
+lek1e2rő
+le2k1értő
+2l1e2kés.
+le2k1id
+le2kij
+le2k1ik
+lek1ist
+le2kiz
+lekkész1
+le1kli
+lek1olt
+le2k1orz
+le2k1ó2r
+le2k1ő2
+2lektro
+2lektró
+le2k1út
+le2küd
+2l1elad
+l1eldo
+2l1e2lekt
+lele2ma
+2lelemei
+2le2lemek
+2l1e2lemes
+2lelemz
+lele2t1a2
+lele2tel
+lele2to
+2lelég
+2l1e2l1ér
+lelés1s
+lelé2s3z
+2l1elgo
+2l1elha
+2l1elhá
+2l1elhel
+l1elho
+le2lim
+lel1ing
+le2l1iz
+2l1eljá
+2l1ellá
+2l1ellé
+2l1ellő
+2l1elméj
+2l1elmés
+2l1elnev
+2l1elnö
+2l1elny
+2l1e2los
+2l1e2l1ö2l
+2l1e2lőél
+2l1e2lőfo
+le2lőí
+le2lőszű
+l1elso
+l1elsö
+2l1elszá
+2l1elta
+l1eltáv
+2l1eltér
+2l1elto
+l1eltö
+2l1elv.
+2l1elvá
+2l1elvét
+2l1elvh
+l1elvn
+2l1elvs
+2l1elz
+2l1e2mel.
+2l1e2meld
+l1emeled
+l1emelek
+2le2melé
+l1emelés
+2l1e2melg
+le2melh
+l1emelhe
+2l1e2meli
+2l1e2melj
+l1emellek
+2l1e2meln
+le2melő
+2l1emelő.
+2lemelős
+le2mels
+le2melt
+l1emelt.
+l1emelté
+l1emeltü
+2l1e2melü
+le2melv
+l1emelve
+lem1erk
+le2m1essz
+lem1eszt
+le2m1e2ti
+le2m1ék
+le2m1éle
+lem1élte
+le2m1élv
+lem1érde
+2l1e2méss
+le2m1ill
+le2mind
+le2m1ing
+le2m1isz
+le2mita
+le2m1itt
+l1emlege
+le2mok
+le2mol
+le2m1org
+le2m1osz
+le2m1ó2r
+le2möl
+le2m1ő2
+lem1p2
+lem1u2r
+le2n1a2d
+le2nal
+le2n1ál
+le2nát
+lenc1c
+len2cel
+len2ceme
+l2end
+le2n1e2g
+le2n1e2l
+le2ner
+lene2tel
+lené2k
+le2n1éke
+le2n1ékk
+le2n1ékt
+lené2l
+len1élé
+lenés3s
+le2n1ész
+le2n1év.
+len2g1e2l
+le2nid
+le2n1ip
+le2n1o2k
+le2nol
+le2n1or
+le2n1óv
+len1őré
+len1s2p
+len1sta
+len1tra
+len1t2ren
+lenu2
+le2n1ur
+le2n1ut
+le2n1üg
+le2n1üt
+2l1enyv
+le2oa
+le2oc
+leo2k
+le2oli
+leo2m
+le2oz
+leó2c
+leö2r
+le2p1aj
+lepa2p
+lep1apa
+lep1álla
+le2p1eg
+lepe2le
+le2pék
+le2pél
+lep1illé
+lep1iz
+le1p2lo
+le2p1osz
+le2p1ó2d
+lep2p1elv
+le1p2rése
+le1p2ri
+le1pro
+le1pró
+le2p1ü2lőh
+2lerdő
+2leredm
+le2rejé
+le2r1ék
+ler1éte
+le2r1il
+le2rir
+2leróz
+2l1e2rő
+le2s1al
+le2s1ál
+l1esdé
+2lesege
+le2s1e2kéh
+2l1esemé
+l1e2setb
+2l1e2setei
+lese2tel
+2l1e2seté
+l1e2seth
+l1e2seti
+l1e2setk
+l1e2setn
+lese2t1o2
+l1e2setr
+le2sésű
+le1s2ka
+le1ski
+2leskü
+le1sla
+le1s2li
+le1sma
+le1s2mi
+le1s2p2
+les3sza
+les3szá
+le1s2tar
+le1stemp
+2l1esten
+l1estébe
+2lesti.
+le1s2til
+2l1estj
+les2t1or
+2lestr
+l1estt
+2l1eszkö
+le1szto
+le2t1ab
+le2tac
+let1a2la
+let1all
+le2t1am
+le2t1ana
+let1apr
+le2t1e2kéb
+le2t1e2la
+le2t1elb
+let1eleg
+le2t1elf
+let1elk
+let1előa
+le2t1e2lőké
+let1elr
+let1emel
+le2t1eml
+le2tene
+le2t1ent
+let1ered
+le2t1eré
+le2t1erk
+le2testé
+let1eszk
+2l1e2teté
+2l1e2teth
+2l1e2tetj
+2l1e2tetv
+le2t1éd
+le2t1é2j
+leté2l
+let1éle
+let1élé
+let1élv
+le2t1é2nekn
+le2t1érb
+le2t1é2ren
+le2t1é2ri
+le2t1érr
+le2t1értő
+let1é2rül
+leté2sz
+let1éter
+let1é2té.
+leté2vede
+let1éves
+le2t1é2véb
+le2t1évéi
+le2t1é2vér
+le2t1é2vét
+le2t1é2vév
+le2tid
+let1ikr
+let1ill
+le2tim
+le2t1ing
+le2t1ist
+leti2sz
+let1iszo
+le2tivá
+le2tod
+le2t1o2k
+le2t1on
+let1ora
+le2t1ox
+le2t1ö2v
+letőe3d
+le2t1őri
+le1traf
+let2teg
+letü2l
+le2t1ülé
+let1üzé
+2lety
+leu2g
+le2uk
+leu2r
+leu2t
+2levene
+2levení
+2levenü
+l1e2vez.
+l1e2vezg
+l1e2vezh
+l1e2vezn
+l1e2vezt
+le2vezü
+l1e2vezv
+levél1l
+le2volú
+le2xá
+le2x1el
+le2x1e2p
+lexkész1
+le2xö
+le1yé
+le2zer
+lezőa2
+lezőe2r
+lezőé2n
+lező1s2p
+2l1ezr
+1lé
+2l1ébr
+lé2ca
+lé2cá
+léc3c
+lé2c1ék
+lé2c3h
+léci2
+lé2cim
+lé2co
+lécs2
+léc3sk
+lé2d1as
+lé2d1el
+lé2d1emb
+lé2dél
+lé2d1és
+lé2dil
+lé2dos
+lé2dot
+lé2dö
+lé2d1ő2
+lée2r
+léé2r
+lé1f2r
+lé2gal
+lé2g1e2c
+2léged
+lé2g1eg
+lég1ell
+lég1els
+lé2g1em
+lé2g1e2r
+lég1ér.
+2l1é2gés
+l1éghet
+lé2gil
+2légí
+lé2g1ö
+2lé2gő
+lé1g2ráf
+l1égtem
+l1égtet
+l1égtél
+lé2gú
+2légü
+l1é2gün
+lé2gyel
+lé2gyes
+lé2gyi
+lé2gyo
+lé2gyö
+3légz
+léh1asz
+2l1é2he.
+lé2hed
+lé2h1em
+2léhes
+2léhet
+2léhező
+lé2h1é
+lé2hol
+2léhs
+2l1éj.
+2l1é2ji
+2l1éjj
+2l1éjs
+lé2kab
+lé2k1a2d
+lé2k1a2g
+lé2k1aj
+lék1aka
+lé2k1a2la
+léka2p
+lé2k1apo
+lé2k1as
+léka2t
+lék1ato
+lé2k1au
+lé2k1av
+lé2kaz
+lé2k1e2g
+lé2k1ep
+lé2kesí
+lé2k1e2sz
+lék1evé
+lé2k1é2k
+léké2l
+lé2k1éle
+lé2k1élv
+lé2k1é2te
+lé2kid
+lé2kít
+lékköz1
+lék1ors
+lé2k1osz
+lé2k1öl
+lé2kör
+lé2köz
+lé2kő
+lé2k1u2r
+lékü2l
+lé2k1ülé
+lé2k1ült
+lékve2g
+l1élc
+2l1é2le.
+2l1é2lei
+2l1é2les
+lé2léb
+lé2lén
+lé2lér
+2l1élm
+lélőkész1
+2l1élr
+lé2lük
+2l1é2lű
+2l1é2mel
+lé2nag
+léná2
+lé2neg
+lé2nekb
+2lénekl
+lé2nel
+2lénkí
+lé2no
+lé2nyö
+lé2p1a2l
+lé2p1el
+lépés3s
+2l1é2pí
+lé2pó
+2lépül
+lé2pülé
+lé3rad
+lé2ral
+lé2rap
+lé2ras
+lé2rat
+lé2rav
+lé2r1á
+2l1érc.
+2l1ércb
+2l1érde
+lé2reg
+lé2r1e2l
+lé2r1eső
+2l1é2rez.
+2l1é2rezv
+lé2r1é2j
+2l1é2rés
+2l1é2rik
+lé2ris
+lé2rit
+lé2rí
+2l1érni
+2l1érnü
+lé2r1osz
+lé2rö
+2l1é2rő.
+lé2rőd
+2l1é2rőe
+lé2rői
+2l1é2rőj
+2l1é2rők
+lé2rőn
+2l1é2rőt
+2l1é2rőv
+2lértelm
+2l1érték
+2l1értj
+2l1értő.
+lé2rut
+2lérvel
+2l1érvén
+2l1érze
+2l1érzé
+lésa2
+lé2s1aj
+lé2sak
+lé2sal
+lé2sar
+lé2s1az
+lé2s1á2
+lé2seg
+lé2s1e2l
+lé2s1eti
+lé2s1é2g
+lé2sés
+lé2s1ikr
+lé2só
+lé2s1ő
+lés3sza
+lés3szer
+lésü2l
+lé2s1ülé
+lé2s1ülő
+lé2s1üt
+lész1ék
+2lészést
+2l1észl
+lés3zse
+lé2tag
+lé2taz
+lé2t1eg
+lé2tel.
+lét1elo
+lét1elő
+lét1elv
+lé2tene
+lé2tesé
+2l1é2teth
+lé2teti
+2l1é2tetn
+lé2tev
+lé2t1ér.
+lé2t1é2te
+lé2t1is
+lé2tít
+2létl
+lé2t1o2k
+3l2étó
+lé2tóh
+lé3tól
+lé2t1ó2r
+létö2
+lét1örö
+lét2rág
+lé2tun
+2l1évad
+2l1évb
+2l1é2ve.
+2l1é2ved
+2lévei
+2l1é2vek
+2lévelf
+2léveli
+2l1é2vem
+2l1é2ven
+2l1é2vet.
+2l1é2véb
+2l1é2véh
+2l1é2véi
+2lévén
+lév1ért
+2l1é2vét
+2l1é2vév
+2l1évf
+2l1évh
+2l1é2vi.
+2l1é2vig
+lé2vir
+lé2vis
+2l1évk
+2l1évl
+2l1évm
+2l1évn
+2l1é2vó
+2l1évr
+2l1évs
+2l1évt
+2lévü
+lé2vük
+lé2vün
+2l1é2vű
+2l1évv
+2l1évz
+lfa2l1e2
+lfat2
+lfa1tr
+lf1aut
+lfá2t1i2
+lf1cl
+lf1ese
+lfe2t
+lf1eti
+lfé2l1é2v
+l2f1élm
+lfé2m1e2ké
+lfi2d1é
+lfin3n
+lfi2nos
+lf1iro
+lf1isk
+lf1kl
+lf2lo
+lf2ló
+lf2lö
+lf2lu
+l2f1okta
+l2f1ó2r
+lf1pr
+lf2ri
+l1f2rí
+l1f2ro
+lf2rö
+lf2rő
+lf1sp
+lf1sz2
+lf1ülő
+lga1p2
+lgatói2ko
+lgau2
+lgár1as
+lgés3s
+lgi2as
+lg2la
+lg2lo
+lg2ló
+lgör2cso
+l1g2ra
+lg2ru
+l2gy1ad
+l2gy1ag
+l2gyaj
+lgy1ala
+lgy1alj
+lgy1any
+l2gy1a2s
+l2gy1au
+l2gyáb
+l2gyál
+l2gyát
+l2gy1e2g
+l2gyelá
+l2gy1e2le
+l2gy1elz
+l2gyembe
+lgy1eré
+l2gy1esem
+l2gy1e2v
+l2gyél
+lgy1ér.
+l2gy1és
+l2gyid
+l2gyikr
+l2gyip
+l2gyis
+l2gy1ok
+l2gy1ol
+l2gyop
+l2gy1os
+l2gy1ó2r
+l2gy1ö2r
+l2gy1ös
+l2gy1u2t
+l2gy1út
+lhai2
+lhón1al
+1li
+li2aa
+li2aá
+li2abi
+li2abo
+lia2cé
+li2aci
+li2acs
+li2acu
+li2a1d2
+li2ae
+li2aé
+li2ag
+li2ah
+li2aid
+li2aí
+li2aj
+li2akép
+li2ala
+li2ale
+li2ali
+li2amé
+li2amo
+li2ao
+li2aó
+li2aő
+li2ap
+li2ara
+li2aré
+li2asá
+li2aso
+lia1sz
+li2asza
+li2aszá
+li2aszé
+li2aszf
+li2aszi
+li2a1t2
+li2aü
+li2av
+li2az
+li3be
+lic3sz
+li2cü
+li1cy
+li2deá
+2li2deg
+li2dén
+li2dét
+2l1i2di
+2l1i2dő
+li2ec
+lie2d
+2lien
+lié2d
+lié2k
+lié2n
+lié2vé
+lifé2l1é2v
+li2fí
+li1fl
+li1f2r
+l2ig.
+2l1i2gaz
+ligán1n
+li2ge.
+2l1i2geb
+2l1i2gek
+2l1i2gep
+li2géb
+li2géh
+li2géi
+li2géj
+li2gék
+li2gén
+li2gér
+li2gés
+li2gét
+li2gév
+li2géz
+li2hat
+2l1ihl
+2l1i2ker.
+2l1i2kerb
+lik2k1ell
+lik2k1elv
+lik2k1e2r
+lik2kérd
+li1k2l
+2l1i2konc
+2l1i2konf
+2l1i2kong
+2l1i2konig
+2l1i2konk
+2likonl
+2l1i2konm
+2l1i2konp
+2l1i2kons
+li1kré
+2lill
+2lima.
+2limád
+li2mák
+li2máv
+l1imbo
+li2me.
+lime2rá
+lim1p2
+2limpo
+limű1
+li2nakr
+li2nal
+lin1any
+lin1ará
+2linas.
+lin2cs1ö2
+2l1indu
+li2ne.
+li2neg
+linék2
+2l1inger
+lin1grá
+ling2rádi
+2l1ingré
+lin1ing
+lin1inj
+lin1kl
+lin3ny
+li2nor
+2l1integ
+2l1intéz
+li2n1u2s
+li2n1ut
+2l1i2nú
+li2oc
+lio2l
+li2oni
+li2óke
+lió2raj
+li2őá
+li2őd
+li2őe
+li2őf
+li2őg
+li2őm
+li2őp
+li2pa.
+li2pai
+li2p1aj
+li2p1á2r
+li2pát
+li2peg
+lip1ele
+li2p1elv
+li2p1esz
+li2pö
+li2p1ő2
+li1pro
+2l1i2ram
+2l1i2rat
+2l1i2rán
+2l1irh
+li2rig
+li2rod
+2l1irr
+2l1irt
+li2sál
+li2s1el
+lise2s
+li2sid
+lis1isk
+2l1iskol
+l1ism
+lis1p2
+2l1ispá
+2l1isten
+2l1istr
+li2s1ü2t
+lis1ü2v
+2l1iszl
+lisz2t1á2z
+li1sztir
+li2t1a2g
+2lital.
+li2tala
+lit1alk
+li2t1áta
+li2t1e2g
+li2t1e2l
+li2t1emb
+li2tez
+li2t1érd
+li2térte
+li2til
+lit1int
+li2t1i2o
+li2t1is
+li2t1okt
+li2t1old
+li2tön
+litő2
+li2t1őr
+l1ittak
+l1ittas
+l1ittat
+li2t1ura
+liú2t
+2l1i2vad
+li2vot
+l1i2vó
+3lix.
+l1izél
+2l1i2zén
+2lizésí
+l1izgu
+2l1izmo
+2lizzí
+2l1izzó
+1lí
+lí2gé
+lí2ja
+lí2ju
+líma1
+2l1íns
+l1í2ny
+línyenc1
+l1írd
+l1írh
+l1írj
+l1írl
+lí2rod
+lí2rog
+lí2rok
+lí2rom
+2l1í2ró
+l1írs
+l1í2ru
+lítés3s
+lítőa2
+lítő2p3r
+2lív.
+líva1
+lívak2
+2l1íz.
+2l1í2ze
+l2ízi
+lízis3s
+2l1ízl
+2l1í2zü
+l1í2zű
+l2j1a2da
+l2j1e2lő
+l2j1er
+ljes1s
+ljharc1
+l2j1ip
+l2j1ir
+l2j1iz
+lj1ír
+l2j1or
+l2j1os
+lj1pr
+lj1sp
+lj1üz
+lka1sl
+lka2tel
+lka2t1é
+lka2tin
+lka2t1ó2
+lké2p1ell
+lké2szel
+lkia2k
+lkiá2
+l1k2lin
+lk2lí
+l1k2lu
+lkö2z1ön.
+l1k2rá
+lk2reá
+l1k2rémb
+l1k2ri
+l1k2rí
+lk2rom
+l1k2ró
+lk1sh
+lkukész1
+lk2va
+lk2vá
+lk2vó
+lla2dój
+lla1f2
+lla2g1ad
+lla2gal
+lla2g1a2s
+lla2gál
+lla2gen
+lla2gép
+llag3g
+lla2gol
+ll1a2ja
+ll1akad
+l2l1akc
+ll1a2kóz
+l2l1akti
+l2l1a2lap
+l2l1alm
+lla2mad
+lla2mal
+lla2mem
+lla2mél
+lla2mor
+l2l1anal
+lla2nyer
+llany1ó2
+lla2pal
+ll1aszf
+llata2l
+lla2tala
+llat1any
+lla2t1ál
+lla2t1ár.
+llatár1a2d
+lla2t1árb
+lla2tés
+lla2tint
+lla2t1olt
+l2latomo
+lla2tors
+lla2t1ű
+l2l1aty
+l2l1aut
+l2l1á2ga
+l2l1ágb
+l2l1ágg
+ll1ágy.
+ll1ágyá
+l2l1állo
+l2l1álm
+llá2mag
+llá2m1al
+llá2m1e2
+llá2m1érté
+llá2mik
+llá2mis
+llá2m1ut
+llán2k1e2
+l2l1á2p
+llára2
+llár1ad
+llá2rak
+llá2r1á2
+llá2s1ikr
+llá2sü
+llá2sza
+l2l1átd
+l2l1átf
+l2l1á2ti
+l2l1átk
+ll1bl
+ll1br
+ll1cl
+ll1d2r
+l2l1e2dz
+ll1eff
+lle2ger
+lleg1g
+lle2gyé
+lleí2
+l2l1e2kés
+lle2l1a
+lle2lin
+l2l1ell
+l2l1e2lőa
+l2l1e2lőd
+lle2m1a2
+lle2m1á
+lle2m1e2g
+lle2mel
+ll1emelé
+llem1ell
+lle2mer
+lle2m1él
+lle2m1ér.
+lle2m1érté
+lle2m1o2
+lle2mu
+lle2na
+llen3n
+lle2n1ő2r
+llens2
+lle2r1in
+l2l1e2ró
+l2l1e2sőt
+ll1estr
+lle2tos
+l2l1e2vet
+l2l1ex
+ll1é2het
+l2l1é2jek
+llé2k1aps
+lléká2
+llé2kár
+llé2k1ol
+llé2kos
+llé2kó
+llé2k1út
+l2l1é2let.
+l2l1é2letb
+l2l1é2lete
+l2l1é2letén
+l2l1é2letét
+l2l1é2letk
+l2l1élt
+l2l1élv
+llé3nya
+llé1sp
+l2l1é2ter
+llét2o
+l2l1év.
+ll1é2vén
+ll1f2l
+ll1fr
+ll1g2r
+ll1ide
+l2l1i2ga
+l2l1igé
+ll1ill
+l2l1i2ma
+l2l1imp
+ll1ina.
+l2l1ind
+ll1inga
+l2l1ingf
+l2l1ingm
+l2l1ings
+lli2nin
+l2l1inv
+lli2p
+l2l1ipa2
+l2l1irá
+l2l1iro
+l2l1isi
+ll1isko
+l2lism
+l2l1iste
+lli2ta
+l2l1ita.
+l2lital
+l2l1izé
+ll1izma
+ll1izmá
+l2l1i2zo
+l2l1íg
+l2l1íj
+l2l1í2v
+ll1k2l
+ll1k2r
+ll1kv
+l2l1oá
+ll1obj
+l2l1off
+l2l1o2l
+ll1ope
+llos3s
+llóá2
+lló1gr
+llóó2
+lló2rák
+lló2rát
+lló2riá
+l2lóvo
+l2l1öb
+l2l1öl
+ll1önt
+l2l1ör
+ll1öss
+ll1ösz
+l2l1ö2z
+l2l1őr.
+ll1ő2rei
+l2l1ő2rö
+l2l1őrt
+l2l1ő2si
+l2l1ő2ze.
+ll1p2l
+ll1p2r
+ll2si.
+ll1sk
+ll1sp
+lls3s
+llsz2
+ll1szt
+ll1tré
+ll1tri
+ll1tró
+ll1u2bo
+l2l1ug
+ll1ult
+llus1s
+l2l1u2t
+l2l1ús
+l2l1ú2to
+l2l1üd
+l2l1üg
+l2l1ür
+l2l1üt
+l2l1üz
+l2l1űz
+llvé2d1e2l
+l2ly
+lly1ö
+l3lyw
+lma2kad
+lma1kré
+l2m1ant
+lma1trá
+l2m1att
+lmá2l
+lm1álm
+lm1álo
+lmá2nyan
+lmá2ny1út
+lmá2ris
+lm1átk
+lm1átt
+lm1bl
+lm1b2r
+lm1cl
+lm1dr
+lme3gon
+lme1kl
+lm1elb
+lm1e2li
+lm1elm
+lm1e2lő
+l2m1ember
+l2m1enc
+l2m1eng
+lmeó2
+lm1epi
+lm1e2seté
+l2m1essz
+l2m1etn
+l2m1etű
+l2m1ex
+l2m1ég
+l2m1élv
+l2m1é2neke
+l2m1ép
+l2m1értő
+l2m1éva
+lm1gl
+lm1gr
+lm1i2dő
+lmi2g
+l2m1iga
+lmigaz1
+l2m1ind
+l2m1inf
+l2m1ing
+l2m1ins
+l2m1inte
+l2m1inté
+l2m1inv
+l2m1i2p
+lm1irá
+lm1iro
+lm1isk
+lm1izz
+lm1íg
+lm1ír
+lm1íz
+lm1kl
+lm1kr
+lm1old
+lm1olv
+l2m1o2p
+lm1ors
+l2m1ov
+l2m1ódá
+lm1ó2rá
+lm1ö2k
+lm1ön
+lm1ö2r
+lm1ös
+lm1öt
+lm1ö2z
+lm1ő2r
+lm1p2l
+lm1p2r
+lm1sk
+lm1sl
+lm1sn
+lm1sp
+lm1st
+lm1sz2
+lm1t2r
+l2m1u2g
+l2m1u2r
+lm1utó
+l2m1új
+l2m1üg
+l2m1ünn
+l2m1üz
+lnak2
+lna2p1e
+lná2ris
+lné2v1á
+lni2ker
+lni2s1
+1lo
+lo2áz
+lo2b1a2r
+2lobá
+lo2b1á2c
+2lo2be
+lo2b1iv
+lo2b1ó2
+2lobu
+lo1by
+lo2ch
+lo1cy
+lo2éc
+lo2éo
+lo2ép
+lo2éz
+lo2g1a2d
+lo2gal
+lo2g1ál
+logás1s
+lo2ger
+lo2gí
+lo2g1or
+lo2gö
+lo1g2ráf.
+lo1g2ráff
+lo2g1ú
+lo2gü
+lo2ir
+lo2kab
+lo2k1a2d
+lo2k1aj
+2l1o2kak
+lo2kárb
+lo2k1á2ro
+lo2k1árr
+lo2k1áru
+lo2k1átj
+lo2káu
+lo2k1e2
+lo2kék
+lo2kid
+lok1is
+lo2k1i2z
+lo2kí
+lokka2l
+lok2k1ala
+lok2k1el
+lok2k1ó2
+lok2kös
+lok2k1ut
+lo2k1ol
+lo2konk
+lo2kor
+2l1o2koz
+lo2kü
+lo2laj
+2l1old
+2l1o2li
+2l1olló
+2l1oltár
+lom1adá
+lom1aga
+lo2m1ajt
+lom1aka
+lom1a2lap
+lom1a2lo
+lom1ará
+lom1ass
+lo2m1att
+lo2maz
+lom1ács
+lo2mág
+lo2m1ál
+lo2m1áré
+lom1ári
+lom1árk
+lo2m1árn
+lo2m1á2ro
+lomba2l
+lom2bala
+lom2bav
+lo2med
+lo2meg
+lo2men
+lom1erk
+lom1erő
+lo2m1es
+lo2méd
+lo2mék
+lo2mél
+lom1é2ne
+lo2m1éri
+lo2m1i2d
+lo2m1i2k
+lo2m1im
+lo2mink
+lom1int
+lomi2s
+lom1isz
+lo2miz
+lo2m1í2
+l1omló
+lo2m1okoz
+lo2mol
+lo2m1o2r
+lo2m1osz
+lom1ott
+lo2m1ó2
+lo2mö
+lo2mő
+lom1p2l
+lo2mü
+lo2mű
+lo2nab
+lo2n1a2d
+lo2n1a2g
+lo2naj
+lo2nak
+lo2n1a2l
+lo2n1ar
+lo2n1as
+lo2n1au
+lo2n1av
+lo2n1á2z
+lon2ch
+lon2cil
+lon2d1ó2
+lo2n1el
+lo2n1ir
+lon1k2
+lo2nol
+lo2n1ó2
+lo2nö
+lon1s2
+lon1tr
+lo2nü
+lo2oi
+lo2oj
+lo2or
+lo2ós
+lo2pap
+lop1ál
+lo2pe
+lop1e2l
+lo2piz
+lo2pí
+lo2p1o2r
+lo2p1osz
+lo2pö
+lop2p1in
+lop1t2
+2l1opti
+lo2pü
+lor2din
+lore2t
+2l1org
+2l1orm
+2lorn
+2l1ors
+2l1orv
+2l1orz
+l2os.
+l2osa
+l2osb
+lo2se
+lo2sü
+lo1t2ha
+2lottl
+lo2xá
+lo2xi
+1ló
+lóa2d
+lóá2r
+ló1bl
+ló1br
+lóc3c
+ló2cem
+ló2ch
+lócsa2p1á2g
+2l1ó2dát
+ló1dro
+lófé2l1é2v
+lófi2úké
+ló1fl
+lóg1g
+ló2gí
+ló1grá
+lóí2v
+ló1k2l
+ló1kré
+ló2nar
+2l1ó2ni.
+2lónn
+2lóno
+2lónr
+2lónt
+lópárba2
+ló1p2l
+ló1p2r
+ló2rac
+lór1ada
+lór1a2la
+lóra2n
+lór1any
+ló2rar
+2lórái
+2lóráj
+ló2rámr
+2lórár
+2lórát
+ló2rem
+ló2r1e2s
+ló2r1ér
+ló2r1ing
+lór1ism
+ló2rí
+lór1old
+ló2rü
+ló2s1aj
+lósa2n
+lós1any
+ló1ski
+ló1sla
+ló1spe
+ló1s2po
+ló1s2rá
+lós3s
+ló1s2ta
+ló1str
+ló1sz
+ló1t2rá
+ló1tre
+ló1tré
+ló1tri
+ló1tro
+2lóvod
+l1ó2vó
+ló2zad
+ló2z1a2k
+ló2zal
+lóza2n
+lóz1any
+lóza2t1e
+ló2zál
+ló2z1es
+ló2zim
+ló2z1ir
+lóz1isk
+lóz1ism
+ló2zolv
+ló2ző
+ló2zü
+ló2z1ű
+1lö
+lö2bö
+lö2ca
+löc3c
+lö2ch
+lö2cő
+2l1ö2dé
+lö2ka
+lö2ká
+lö2ko
+l1öldö
+löl2t1a
+löl2tá
+2l1öltés
+l1ölthe
+löl2to
+l1öltöt
+l1öltöz
+l1öltő
+2l1öml
+lö2möl
+lö2na
+lö2ná
+lön2b1ékét
+lö2ne
+lö2né
+lö2n1o
+lö2nó
+lö2nu
+lö2nú
+lö2pa
+lö2pá
+lö2pe
+lö2pöl
+löpü2
+lö2p1ülé
+lö2p1ülő
+lö2re
+lö2rö
+lös3szá
+2lössze
+lö2sü
+lö2sze
+lö2szis
+2l1ötl
+löt2ter
+2l1ötv
+2l1öv.
+2l1övb
+l1ö2ve.
+l1ö2vez
+2l1övh
+2l1övn
+l1ö2vön
+2l1övr
+l1ö2vük
+2l1övv
+1lő
+lőa2c
+lőa2n
+lőá2g
+lő1bl
+lő1br
+lő2dad
+lő2dá
+2lőde.
+2lődei
+lő2del
+lő2d1ék
+lő2din
+lő2d1iv
+2lődje.
+2lődjét
+lődköz1
+2lődöke
+2lődökn
+2lődökr
+2lődöt.
+lő2d3ze
+lőe2l
+lőe2s
+2lőesé
+lő1fl
+lő1f2r
+lőgépi2
+lőgé2p1ip
+l1őgyel
+2lőhű
+lői2ta
+2lőít
+2lőkése
+lő1kl
+lőko2r1út
+lő1kv
+2lőlege
+2lőnn
+2lőny.
+lő2nyal
+lő2nyár
+2lőnyb
+2lőnye.
+2lőnyei
+lő2ny1elvi
+2lőnyéb
+2lőnyén
+2lőnyér
+2lőnyét
+2lőnyév
+2lőnyh
+2lőnyk
+2lőnyn
+2lőnyö
+2lőnyr
+2lőnyt
+2lőnyü
+lőőr2s1é2g
+2lőpán
+lő1pl
+lő1pr
+lő1ps
+2lőreh
+2lőrej
+lőre3m
+2lőret
+2lőréb
+lő2r1is
+lő2rül
+2l1őrz
+lő2sál
+lő2sin
+lő1s2ka
+lő1ská
+lő1sla
+lősó2
+lő2sór
+lő2s1ót
+lő2ső
+lő1s2pi
+lő1spr
+lő1srá
+lős3s
+lős2tar
+lő1str
+lő1sy
+lősz2
+lős3zára
+lős3zárr
+lő1szf
+l1ő2szít
+lő1szt
+2lőtét.
+2lőtolá
+lő1tre
+lőu2t
+lőü2l
+2lővig
+2l1ő2zét
+2lőzié
+2lőzl
+2lőzm
+2l1ő2zük
+lp1a2lag
+l2p1a2lap
+l2p1alát
+l2p1a2láv
+l2p1alk
+lpanto1
+l2p1any
+l2p1áll
+l2p1átm
+l2p1áts
+lpcsa2p1
+l2p1eg
+lp1e2lu
+l2p1e2m
+lpen1n
+l2p1e2rő
+l2p1ég
+lpé2l
+l2p1éle
+lpé2r
+l2p1éri
+l2p1i2d
+l2p1i2na
+lp1izm
+lp1i2zo
+l2p1ív
+l1p2lá
+l2p1old
+lpo2n
+lpon1á
+lp1p2r
+l1prd
+l1p2ri
+l1p2ro
+l1p2rób
+lpu2s
+lp1uszo
+lrá2k1e
+lrei2
+lre1p2ré
+lre1sz
+lreü2
+lsa2v1a2m
+lság3g
+ls1eprik
+ls2ho
+ls2ka
+ls2ká
+ls2ki
+ls2la
+ls2lá
+ls2li
+ls2ma
+ls2mi
+lsors1s
+lsóé2r
+lső1sz2
+l1s2pa
+l1s2pe
+l1s2pé
+l1s2pi
+l1s2po
+l1s2pó
+l1sp2r
+l1s2rá
+l1s2ró
+l1s2ta
+ls2tá
+lste2i
+l1s2ti
+l1s2tí
+l1s2to
+l1st2r
+l1s2tu
+l1s2tú
+lsza2ké
+lsza2k1ü
+lszá2rú
+l2sz1e2gű
+l1sz2f
+l1sz2l
+l1sz2p
+lszt2
+lsz2tá
+l1sztr
+l1sz2v
+lta2gyá
+lt1ajá
+lta2lapb
+lta2l1á2s
+lta2l1á2z
+lta2len
+lta2l1ev
+lta2l1é2
+lta2liz
+ltal1l
+lta2lö
+l2t1amp
+l2t1apr
+lt1ará
+l2t1arc
+lta2riá
+lt1assz
+lt1aszt
+l2t1a2u
+lt1azo
+lt1ág.
+lt1á2ga
+lt1ágb
+lt1ágg
+lt1ágn
+lt1ágr
+l2t1áll
+ltána2
+ltá2nan
+ltá2rada
+ltár2s1ág
+lt1árur
+ltá2s1á2g
+ltá2tal
+l2t1átr
+lt1bl
+lt1br
+l2t1ell
+l2t1elö
+l2t1emu
+lte2rad
+l2t1e2reik
+l2t1erő
+l2teru
+lte2t1a2
+lte2ték
+l2t1ékné
+lté2l
+lt1éle
+lt1élm
+lt1érc
+l2t1érz
+lté2sa
+lté2s1é2g
+ltés3s
+lté2t1é2
+lté2ves.
+lt1fl
+lt1gl
+lt1gr
+lt1ide
+ltig2
+l2t1i2gé
+lti1kl
+l2t1ill
+lt1imp
+l2t1ind
+l2t1ing
+l2t1i2o
+l2t1isi
+lt1ism
+l2t1ist
+l2t1i2ta
+l2t1ín
+l2t1í2r
+lt1ít
+l2t1í2v
+ltív1e2l
+l2t1í2z
+lt1kr
+l2t1oml
+l2t1ord
+l2t1org
+l2t1orj
+l2t1orr
+lt1ors
+ltos3s
+l2t1o2x
+ltó1p
+ltó1s2p
+ltó1sz
+ltót2
+ltö2l
+l2t1ölé
+lt1önt
+lt1öss
+ltőa2
+ltőe2l
+lt1ő2rö
+lt1pl
+lt1pr
+ltra1s
+lt2rág
+lt2rén
+lt2rik
+lt2ril
+lt2róf
+l1t2rón
+lt2róp
+ltsé2g1el
+lt1sl
+lt1sp
+lt1st
+lt1t2r
+l2t1udv
+l2t1una
+ltu2n1i
+lt1ura
+ltu2sze
+l2t1u2t
+ltú2ri
+l2t1üg
+lt1ü2lé
+lt1üst
+l2t1ü2v
+lt1ü2zem
+1lu
+lua2g
+luá2r
+lu2b1a2d
+lu2bal
+luba2n
+lu2b1as
+lu2bár
+lu2b1e2g
+lube2r
+lu2bes
+lu2bél
+lu2b1in
+lubó2
+lu2bór
+lu2bö
+lub1t2
+lu2bü
+2ludj
+2ludv
+lu1dy
+lue2l
+lu2esé
+lugas1s
+lu2gat
+lu1g2l
+2l1u2gor
+2l1ugr
+lui2r
+2l1ujj
+lu1kl
+lu2k1os
+lu2k1o2v
+lu2l1inf
+lu2lí
+2lulr
+lu2mad
+lu2maz
+lu2mál
+lumen1n
+lu2mer
+lu2mes
+lu2m1i2k
+lu2m1ip
+2lumí
+lum2pel
+2lund
+l1unh
+2l1u2ni
+l1unj
+l1unl
+l1unn
+l1u2no
+l1u2nó
+l1unv
+lu2rak
+lu2ram
+lu2rat
+2l1u2ru
+2l1u2rú
+lu2sad
+lu2s1aka
+lu2sakr
+lu2sal
+lu2s1a2n
+lu2s1ág
+lu2sál
+lu2s1e2r
+lu2s1érté
+lu2sim
+lu2sis
+lu2sír
+luskész1
+lu2s1ó2
+lusö2
+lu2sör
+lu2ső
+lus3sze
+lus3szi
+lust2
+2lutánz
+2l1utc
+lu1t2h
+lu2tód
+lu1tra
+lu2zs
+1lú
+lú2d1a
+lú2dá
+lú2de
+lú2dét
+lú2d3z
+lú2ga
+lú2g1á
+lú2ge
+lúg3g
+lú2gi
+lú2gol
+2l1újd
+2l1ú2jí
+lú2ju
+lú2ri
+lú2ru
+lú2rü
+2l1ú2sz
+lú2té.
+2l1útv
+lú2z1a2n
+1lü
+lü2cs
+lü2dí
+lü2dü
+lü2ge
+lü2gy
+lü2lá
+l1üldö
+lü2lel
+lü2l1e2m
+l1ülep
+lü2lé
+lül1ér
+2l1ülés
+2l1ülhet.
+2l1ülhetne
+2l1ülhets
+lü2lí
+2l1üljek
+2l1ülnek
+2l1ülnék
+2l1ülni
+2l1ü2lö
+2l1ü2lő
+2l1ülsz.
+2l1ült.
+l1ülte.
+2l1ültek
+2l1ültem
+2l1ültes
+2l1ültet.
+2l1ültete
+2l1ülteti
+2l1ültetj
+2lültetl
+2l1ültetn
+2lültets
+2l1ültett
+2l1ültetü
+2l1ültetv
+2lülté
+l1ültéi
+l1ülték
+l1ültél
+l1ültén
+l1ültér
+l1ültét
+l1ültn
+2l1ültü
+lü2lú
+lü2lü
+2l1ülün
+2l1ülve.
+2l1ünn
+lü2re
+lü2rí
+lü2rü
+lü2sz
+lü2te
+lü2té
+lü2ti
+lü2tö
+lü2tő
+lü2tü
+lü2ve
+lü2vö
+lü2ze
+lü2zé
+1lű
+lű2rá
+2l1űrb
+2l1ű2ri
+l1űrl
+lű2ze
+lű2zé
+lű2zi
+lű2zö
+lű2ző
+lű2zü
+lva2dat
+l2v1adm
+lvaj1ak
+lva2j1e
+lv1akad
+l2v1akc
+l2v1a2la
+l2v1alg
+l2v1alk
+l2v1ant
+l2v1a2ny
+l2v1a2rás
+l2v1a2z
+lvá2gy1ón
+l2v1állat
+l2v1állt
+l2v1áp
+lvá2rain
+l2v1á2rak.
+lvá2ras
+lvá2rár
+l2v1árny
+lvá2rol
+l2v1á2rul
+lvás3s
+lvá2szi
+lv1áta
+lv1áth
+lv1átk
+lv1br
+l2v1e2dz
+lv1egys
+lv1egyv
+lv1e2kéb
+l2ve2leme
+l2v1elk
+l2v1ell
+l2v1eró
+l2v1ex
+l2v1é2gés
+lvé2gül
+l2v1élm
+l2v1é2neke
+l2v1ép
+lvé2ri.
+l2vértel
+l2v1érté
+l2v1é2rü
+l2vérzési
+lvé2sza
+lv1fr
+l2v1i2de
+l2v1i2do
+l2v1iga
+lv1iko
+l2v1i2m
+lv1inté
+lv1i2pa
+l2v1iro
+l2v1irt
+l2v1isko
+l2v1ism
+l2v1izm
+l2v1izo
+l2v1í2ve
+lvíze2
+lvíz1es
+lv1kl
+lv1kr
+l2v1ok
+l2v1old
+l2v1olv
+l2v1onto
+l2v1op
+l2v1or
+l2v1os
+lv1ödé
+lvö2l
+l2v1ölé
+l2v1ölt
+l2v1ön
+l2v1ös
+l2v1öv
+l2v1ö2z
+lv1ő2r
+lv1ős
+lv1pr
+lv1ps
+lv1sp
+lv1st
+l2v1ut
+lv1új
+l2v1üg
+l2v1üt
+l2y
+1lya
+lya2dat
+2ly1adm
+2ly1a2dó
+2lyagy.
+2lyagyr
+2lyajt
+2ly1a2kas
+ly1akc
+2ly1akná
+2lyakós
+2lyakt
+ly1a2lat
+2ly1alb
+2ly1alk
+2ly1alm
+ly1a2lom
+ly1alt
+lya2maj
+lya2mará
+lya2m1el
+lya2mem
+lya2m1érté
+2lyang
+2lyani
+lya2nyag
+ly1a2nyá
+ly1a2pán
+lya1p2r
+2ly1arc
+lya2sal
+ly1aspe
+ly1assz
+2ly1atl
+lya1t2r
+2lyaty
+2lyazo
+1lyá
+2lyábé
+2lyábr
+2ly1ág
+ly1áld
+ly1áll
+2ly1áp
+2ly1á2rad
+2ly1á2rak
+2ly1á2ram
+2ly1á2rat
+ly1árk
+2ly1árn
+2ly1árr
+2ly1á2ru
+lyás3s
+lyá2sz
+2lyáta
+2lyátf
+2lyáth
+2lyátlá
+2lyátlé
+2lyátm
+2lyáts
+2lyátt
+2lyátv
+ly1bl
+ly1br
+ly1dr
+1lye
+lye2ga
+ly1e2gye
+lyegyez1
+ly1ej
+2lyeke.
+2lyekek
+2ly1e2kéb
+2ly1e2kérő
+ly1e2le
+ly1elf
+ly1elh
+ly1ell
+ly1elm
+ly1e2lő
+ly1elr
+ly1els
+ly1elt
+ly1elü
+ly1elv
+ly1elz
+lye2m1a
+2lyember
+2ly1e2mel
+lye2min
+2lyemlí
+2ly1eng
+ly1erk
+ly1e2rő
+2ly1esd
+2ly1esemé
+2ly1e2sete
+2lyeseté
+2ly1e2sett
+2lyesél
+2ly1e2sés
+2ly1este
+2lyeszk
+2lyeszm
+2lyeszű
+2lyetet
+2lyevő
+2ly1ex
+1lyé
+2ly1ég
+2lyéhe.
+2lyéhen
+2lyéhet
+lyé2l
+ly1éle
+ly1élm
+2lyéneke
+2ly1ép
+2ly1ér.
+2ly1érc
+2ly1érd
+2ly1é2ré
+2ly1érm
+2lyérő.
+2lyérői
+2lyérők
+2ly1érr
+2ly1érte
+2ly1érté
+2ly1é2rü
+2ly1érv
+2ly1érz
+ly1ész
+2ly1étt
+2lyév.
+2lyéve.
+2lyévei
+2lyévek
+2lyéven
+2lyévet
+2lyévév
+2lyévi
+2lyévr
+2lyévv
+ly1fl
+lyf1ölt
+ly1gl
+ly1gr
+1lyi
+2lyibo
+2lyideá
+2lyideg
+2lyiden
+2lyidi
+2ly1ido
+2lyidő
+lyié2h
+lyi2g
+2lyiga
+2lyigá
+2ly1ige
+2ly1igé
+2ly1iha
+2ly1ill
+ly1ima
+2lyimá
+2lyimp
+2lyind
+2lyinf
+2ly1ing
+2ly1ini
+2ly1int
+2lyinv
+2ly1i2p
+ly1i2rat
+2lyirá
+2lyiri
+2ly1iro
+2lyirr
+2lyirt
+2ly1isk
+2lyism
+2lyisp
+2lyist
+2ly1ita
+2lyivad
+2ly1i2z
+1lyí
+2ly1íg
+2ly1ín
+2ly1í2r
+ly1ív
+ly2kiz
+ly1kl
+ly1kró
+1lyn.
+1lyo
+2ly1ob
+2lyodú
+2ly1of
+2lyokal
+2ly1okl
+2lyokm
+2lyokoz
+2lyokta
+lyo2l
+ly1ola
+ly1old
+ly1oll
+ly1olt
+ly1olv
+lyo2m1as
+2ly1op
+2ly1o2r
+2ly1osz
+2ly1ott
+1lyó
+ly1ódá
+lyó2s1á
+1lyö
+2ly1öb
+2ly1ö2l
+2ly1ö2r
+ly1öss
+2ly1öv
+1lyő
+ly1ő2r
+ly1pl
+ly1pr
+lyrádi2
+lyre1p
+1lys.
+ly1sk
+ly1sp
+lys2t
+lyszá2m1é
+ly2tac
+ly1t2r
+1lyu
+2ly1ud
+2lyugr
+2ly1uh
+2ly1uj
+lyu2kás
+2lyuni
+2ly1u2r
+2ly1u2t
+1lyú
+2lyújs
+2ly1úr.
+2lyúth
+2lyútr
+2lyútt
+2lyútv
+1lyü
+2ly1üd
+2ly1üg
+2lyünn
+2ly1ür
+2ly1ü2v
+2ly1üz
+1lyű
+2ly1űr.
+2ly1űrh
+2ly1űrl
+1lywo
+lyze2t1el
+lzás1s
+lze2ta
+lze2t1e2l
+lze2t1ér.
+lzé2sa
+lzőa2
+lzőe2
+lző2s1orr
+lzus3s
+lzu2s3z
+2m.
+1ma
+maa2d
+ma1bra
+2m1abs
+ma2cél.
+ma2célb
+ma2célt
+2madag
+2m1adap
+ma2datb
+ma2dato
+ma2datt
+madás1s
+ma2d1é2v
+madókész1
+ma2dóz
+3m2a3dz
+mae2r
+maé2r
+ma1f2ra
+ma1fri
+ma2gac
+ma2g1a2dato
+ma2g1a2dá
+ma2g1a2dó
+ma2g1a2du
+maga2l
+mag1ala
+ma2ga2n
+mag1any
+maga2r
+mag1ara
+magas1s
+ma2g1asza
+mag1azo
+ma2gág
+mag1áll
+mag1á2ré
+mag1árn
+mag1árr
+mag1árt
+mag1áta
+ma2g1áto
+ma2geb
+ma2g1el
+2m1aggr
+ma2gid
+ma2g1i2k
+ma2g1í
+magkia3dó
+ma2g1or
+ma2g1osz
+mag1óra
+ma2g1óv
+ma2g1u2r
+ma2g1ü2
+2m1agy.
+2m1agyb
+2m1a2gyu
+m1ahh
+ma2il.
+ma2ilt
+mai2z
+2m1ajta
+maj2ti
+ma2kará
+ma2kác
+2m1akc
+mak2k1e2
+2makkr
+2m1akku
+ma1klu
+2m1a2kol.
+ma1k2rém
+ma1k2ri
+2makro
+m1akti
+ma2kus
+malac3há
+mala2c3s
+2malag
+mala2g1ú
+ma2laku
+2m1alakz
+2m1a2lan
+2m1a2lapí
+malasz2t1a
+2m1alb
+2m1alc
+2m1ald
+2malg
+m1algo
+2m1alj
+2m1alk
+malo2m1e
+mal1os
+m1alr
+2m1alt.
+mal1th
+2m1a2lu
+2malv
+2m1amp
+2m1a2nal
+ma2nat
+2maná
+ma2n1eg
+2m1angi
+2m1anto
+2m1antr
+2m1a2nya.
+ma2nyag
+2m1a2nyá
+2m1a2nyó
+mao2k
+ma2pa.
+ma2pas
+2m1a2pát
+ma1p2l
+ma1p2re
+ma1p2ré
+ma1p2ri
+ma1p2ro
+2m1aps
+2m1a2rány
+2m1arb
+2m1arc.
+2m1arcc
+2m1arch
+mar1cko
+2m1arcu
+2m1arcú
+2m1a2rén
+ma2r1i2si
+mar2k1al
+mar2k1in
+mar2k1ón
+mar2k1ó2r
+2marm
+maro2k1
+ma2romá
+maros1s
+marók2
+maró1kh
+maró1kk
+maró1kn
+maró1kr
+ma1ry
+2m1arz
+ma1s2ká
+ma1s2pe
+ma1spr
+ma1s2rá
+mast2
+ma1s2ta
+ma1ste
+ma1str
+masz1egy
+masz1e2me
+ma2sz1ét
+ma2szév
+ma2szis
+maszí2v
+masz1íve
+masz1ös
+mat1ada
+mat1alap
+mat1anya
+ma2taz
+ma2tág
+matá2raka
+ma2t1á2ras
+mat1á2rár
+ma2t1árn
+ma2t1á2rú
+ma2t1áz
+ma2t1e2g
+mat1eli
+ma2t1ell
+mat1elő
+mat1elt
+ma2t1eme
+mate2s
+ma2tél
+ma2t1érte
+matfé2
+matfél1
+matfélé2
+ma2tid
+ma2t1ind
+ma2t1inf
+ma2t1ing
+ma2t1int
+ma2t1örö
+ma1t2ran
+mat2rág
+mat2tin
+ma2t1ut
+2m1a2tya
+ma2tyá
+2m1a2uk
+mau2ra
+ma2uri
+ma2us
+mau2ta
+2m1a2uto
+2m1a2vat
+ma2z1a2l
+ma2zál
+ma2z1átl
+ma2zel
+mazókész1
+ma2z3sű
+1má
+2m1á2bé
+2m1ábr
+má2cs1as
+má2cs1e2
+má2csin
+má2csir
+má2csis
+má2csó
+má2csü
+má2fá
+2m1ág.
+2m1á2ga
+2m1á2gá
+2m1ágb
+2m1á2gé
+2m1ágg
+má2gi.
+2m1á2gig
+2m1ágk
+m1ágna
+2mágo
+2mágó
+2m1ágr
+má2guk
+má2gun
+2m1á2gú
+2m1á2gy
+mágya2d
+mágy1ada
+má2hí
+má2jan
+má2j1árt
+má2j1e2
+májo2
+má2j1ol
+májren2
+má2j1ul
+má2jü
+máka2
+má2k1al
+má2kar
+má2k1e2
+má2k1ér.
+má2kil
+má2k1ó
+má2kő
+má2k1ü
+má2l1a2l
+2m1álar
+má2lál
+2m1álc
+má2l1e2
+mál1ért
+2m1állam
+m1állap
+m1állat
+2m1állí
+m1állom
+2m1álma
+2m1álmo
+má2los
+má2m1as
+2m1á2mí
+mána2
+má2n1as
+má2nav
+má2nár
+mánc1c
+mán2ce
+mán2c1ég
+mán2cip
+mán2csé
+má2n1e
+má2n1in
+má2nis
+má2n1it
+má2n1ö2
+má2nő
+máns3s
+mán2tac
+mán2tag
+mán2t1al
+mán2t1as
+mántá2
+mán2t1ék
+mán2t1öl
+má2nú
+má2nü
+má2ny1a2d
+má2ny1a2g
+má2nyaj
+má2ny1aka
+má2ny1a2l
+mánya2n
+má2nyany
+má2nyap
+má2nyar
+má2nyau
+má2nyav
+má2nyaz
+má2ny1e2
+má2ny1ér.
+má2nyérd
+má2nyérz
+má2ny1í2
+má2ny1ó2
+má2nyö
+má2po
+2m1á2rad
+má2r1a2g
+2máram
+má2r1a2n
+má2ras
+már1ass
+2m1á2rat
+má2r1au
+má2r1ál
+má2re2
+már1em
+má2rés
+má2r1id
+má2r1ik
+má2r1i2p
+má2r1i2si
+már1isk
+már1istá
+má2rí
+2márkok
+2márol
+má2rö
+má2rő
+má2rug
+m1á2ruh
+má2ruk
+m1árur
+má2rü
+má2s1a2d
+má2sal
+má2sap
+má2s1a2r
+má2s1av
+má2saz
+má2s1á2rá
+má2s1árn
+má2sás
+2m1ásásá
+2m1ásásn
+2m1ásásr
+másbe2j1
+másbejá2
+má2s1e2
+má2sír
+má2sor
+2m1á2só
+má2sö
+má2ső
+mást2
+más1tr
+má2s1ü2
+más3zav
+2m1á2ta
+mát1a2k
+2m1á2tá
+2m1átc
+2m1átd
+máte2
+má2ten
+2máté
+2m1átf
+2m1átg
+2m1áth
+2m1á2tir
+2m1á2tí
+m1átj
+2m1átló
+2m1átn
+má2t1ol
+2m1á2t1ö
+2m1átp
+2m1átre
+2m1áts
+2m1átte
+2m1á2tú
+2m1á2tü
+2m1átv
+má2zal
+má2ze
+mázi2a
+mázi2é
+má2z1i2s
+má2ző
+má2zsal
+mázs1e
+máz3sz
+mb1akc
+m2b1akk
+mba1k2r
+mb1akv
+m2b1a2lag
+m2b1alj
+m2b1alk
+m2b1a2na
+m2b1a2nya
+mba1p
+mb1a2var
+mb1a2zo
+mb1á2gy
+m2b1áll
+m2b1á2ron
+m2b1árró
+mbá2száv
+m2b1ászná
+m2b1á2szoka
+m2b1á2szokk
+m2b1á2szoko
+m2b1á2szokr
+m2b1áta
+m2b1áth
+mbeá2
+mb1e2ce
+mbe1k2
+mbe2led
+mb1e2leg
+m2b1ell
+mb1elr
+mb1elsz
+mb1epe
+mbe2r1a2g
+mbe2ral
+mbe2ran
+mbe2ras
+mbe2rá
+mbe2reg
+mbere2sz
+mber1eszű
+mbe2rev
+mbe2r1él
+mbe2r1é2s
+mbe2rimá
+mbe2ring
+mbe2risz
+mbe2rol
+mbe2ros
+mbert2
+mbe2r1ú
+m2b1é2g
+mb1é2ke
+m2b1ékí
+m2b1ép
+mbé2ress
+m2b1érté
+m2b1érz
+mb1gr
+m2b1ide
+mbi2k1al
+mbi2ke
+m2b1illa
+m2b1i2na.
+m2b1i2nai
+m2binam
+mb1ind
+m2b1inf
+m2b1ing.
+mb1inv
+m2b1ipa
+m2b1izm
+mb1i2zom
+m2b1izz
+m2b1ív
+mb1íz
+mb1kl
+m1b2lú
+mb1ly
+m2b1ob
+mb1olda
+mbo2lyak
+mb1ond
+m2b1op
+m2b1ormá
+m2b1ormú
+m2b1o2roz
+m2b1oszl
+mb1öle
+m2b1öv
+mb1ő2si
+m2b1ő2sz
+mb1pl
+mb1pr
+mbrádi2
+mb2rev
+mb2rok
+mb2ron
+mb1sp
+mb1st2
+mb1sz
+mb1tr
+mbu2sze
+mbu2szí
+m2b1u2t
+mb1új
+m2b1üg
+m2b1ül
+m2b1üs
+m2b1üt
+m2b1üz
+mbvezé2
+mc2lu
+mcsa2p1á2g
+mda1b2
+mda1g2
+mda1p2
+mdi2ale
+mdi3ap
+md2ra
+md2rá
+md2ro
+md2ró
+1me
+mea2l
+mea2n
+me2av
+me2béd
+mede2r1e2
+2medény
+me1d2rá
+2m1e2dz
+mee2s
+me2et
+2m1eff
+me2gaba
+me2g1ala
+me2g1alu
+me2g1alv
+me2g1an
+me2g1a2r
+mega1sz2
+me2gav
+me2g1á
+me3gám
+megá2s
+megá2t
+megá2z
+me2g1eg
+me2g1el
+mege2le
+mege2lő
+me2ger
+me2g1esem
+meg1eszt
+me2geta
+me2g1e2te
+me2gez
+me2g1é2l
+megés3s
+megész1
+meg1f
+megg2
+meg1gr
+me2gi
+meg1igá
+meg1inn
+meg1ir
+meg1is
+meg1itt
+me2g1í
+me2g1o
+me2g1ó2
+me2g1ö2
+me2gőr
+me2g1u2
+me2gú
+me2g1ü2g
+me2g1ü2l
+2megyez
+2m1egyh
+2m1egyl
+2m1egys
+2megyüt
+me2hető
+mei2rá
+me2k1ad
+me2k1ag
+mek1alk
+me2k1am
+mek1arc
+me2k1a2s
+me2k1att
+me2k1á2l
+me2k1á2p
+me2k1ár.
+me2k1ára
+me2kát
+mek1egy
+mek1ell
+me2kep
+me2k1ers
+meke2sz
+me2k1esze
+me2keszm
+mek1eszte
+me2kev
+me2k1ék
+me2kél
+me2k1ér.
+mek1érde
+me2k1érk
+me2k1érte
+me2k1érté
+me2k1éss
+me2k1éte
+me2kido
+me2kij
+mek1imá
+me2k1ing
+me2k1int
+me2k1i2p
+me2k1ist
+me2k1ita
+me2kír
+me2kít
+mek1k2
+mek3lu
+me2kob
+me2k1ok
+me2k1old
+me2k1olt
+me2k1onk
+me2kop
+meko2r
+mek1ora
+mek1oro
+mek1ort
+me2k1os
+mek1ott
+me2k1ó2v
+mek1öltö
+me2kön
+mek1öröm
+me2k1öt
+me2k1ő
+mek1s
+meksz2
+mek1t2
+me2kuj
+me2kun
+me2kur
+me2k1ú2
+me2küd
+me2k1üg
+me2k1üld
+me2k1ü2lé
+me2k1ü2lő
+me2küz
+m1elad
+mel1ak
+me2lág
+me2lál
+2melb
+2m1e2lef
+me2lekt
+mel1e2l
+2m1e2leme
+2m1e2lemz
+2m1e2les
+2melet
+mele2t1ér.
+2m1e2lég
+2m1e2l1é2l
+2m1e2l1ér
+melés3s
+2m1elf
+2m1elgo
+m1elha
+2m1elhá
+2m1elhel
+me2lit.
+2me2l1í2
+2m1eljá
+2melk
+m1elké
+m1elkí
+m1elkö
+mel2lál
+m1ellene
+mel2ler
+mel2l1ér.
+mel2ling
+mel2l1iz
+mel2lo
+mel2lö
+mel2l1u2
+2m1elmé
+2m1elnö
+me2los
+m1előde
+2m1e2lőí
+m1e2lőle
+m1e2lőtt
+2melőz
+me2lőző
+2m1elr
+2m1elszá
+2m1elta
+2m1eltá
+m1elter
+2m1eltett.
+2m1eltettn
+2m1eltér
+2m1elti
+2melty
+2m1elv.
+2m1elvá
+2m1elves
+2m1elvn
+2m1elvo
+me2ly1ék
+2m1elz
+2m1eml
+2m1e2mul
+me2n1a2d
+me2nal
+me2nar
+me2nau
+me2nát
+me2n1e2g
+me2n1el
+me2ner
+mene2t1á2
+mene2tö
+menés3s
+2m1enges
+me2nil
+me2n1ip
+me2ní
+me2nö
+men2s1é2g
+men2t1ell
+men2tip
+men2t1is
+me2n1u
+me2nú
+me2nya
+menye2ma
+me2om
+me2óe
+me1p2h
+me2pik
+me2pos
+me1p2r
+mera1p2
+mer1ass
+2merdő
+2m1e2rec
+2meredm
+mer1egy
+2m1e2rej
+me2r1e2l
+me2r1eml
+mere2t1a
+mere2t1e2l
+mere2t1ér.
+2merezőkh
+me2r1ép
+me2r1il
+me2rim
+mer1inf
+mer1ing
+me2r1ip
+2mernyő
+me2r1ol
+me2ror
+me2r1os
+me2rov
+2meről
+2merősí
+mers2
+mer1st
+mer1tró
+me2r1ü2g
+me2sas
+me2s1emb
+2m1esemén
+mese1s
+2meseté
+2m1e2sett
+2mesély
+2m1e2sésé
+2m1e2sésh
+2mesésk
+2mesésr
+2meséss
+2mesést
+2m1e2ső
+me1s2po
+2m1estb
+2m1este.
+2m1estek
+2m1esté
+2m1estf
+me1s2tó
+2m1estr
+2m1estün
+me2szan
+2meszem
+me1sz2tá
+met1anya
+meta1s
+metasz2
+me2t1e2gy
+met1ell
+2m1e2teté
+met1ing
+me2tór
+me2tú
+me2tűd
+2m1e2ug
+me2uk
+meus3s
+meu2t
+me2vő
+me2zac
+me2z1aj
+meza2k
+me2zau
+me2zál
+me2zedé
+me2zeg
+me2z1elj
+me2z1ell
+me2zelőh
+me2zer
+mez1ere
+me2z1ék
+me2z1ér.
+me2z1érd
+mez1éret
+me2z1é2ri
+me2z1id
+me2zim
+me2zin
+me2zio
+me2zír
+me2z1ol
+me2z1or
+me2z1ö
+mezőe2
+me2z1ő2rö
+me2z1őss
+2mezrem
+m1ezrese
+m1ezresr
+m1ezrest
+me2z3sa
+me2zsá
+me2zsö
+me2zu
+me2zú
+1mé
+mé2ber
+2m1ébr
+mé2cs1a2
+mé2cso
+mé2g1a
+mé2ge
+még1eg
+mé2gé
+mé2gi
+még1is
+mé2g1o2
+mé2gő
+mé2gú
+mé2h1a2
+mé2h1á
+mé2heg
+mé2hel
+mé2hir
+mé2h1is
+mé2h1or
+mé2hö
+méhren2
+2méhsé
+2m1éj.
+2m1éjb
+mé2jes
+2m1éjs
+méka2
+mé2k1ad
+mé2k1aj
+mé2k1ak
+mé2k1al
+mé2k1an
+mé2kar
+mé2kaz
+mé2k1á2
+mé2k1e2g
+mék1elh
+mék1ell
+mék1e2lő
+mé2k1ese
+mé2kev
+mé2kez
+mé2k1é2k
+mé2k1é2l
+mé2kid
+mé2kirá
+mé2kí
+mé2k1o
+mé2k1ö
+mé2kő
+mé2k1u2
+mé2k1ú
+mé2le.
+2m1é2lel
+mé2les
+mé2lez
+2m1é2lén
+2m1élm
+mé2lya
+mé2lyá
+mé2lyeg
+mé2ly1ú
+mé2n1a2r
+mé2n1a2t
+2ménekb
+2ménekh
+2ménekl
+mé2n1el
+mé2n1é2k
+mé2n1és
+mé2nid
+mé2nin
+mé2n1is
+mé2niv
+mént2
+mé2ny1e2g
+mé2ny1e2l
+mé2nyer
+mé2nyék
+mé2nyim
+mé2nyír
+mé2ny1o
+mé2nyö
+mé2nyú
+ményü2l
+mé2ny1ülé
+mé2pí
+mé2pü
+2m1érc.
+2m1é2retts
+2m1é2rén
+mé2rér
+mérés1s
+2m1é2rév
+2m1é2rie
+2m1é2rin
+2m1érké
+2m1érlel
+mé2r1ón
+2mérteke
+2m1értes
+2m1értér
+2m1értés
+2m1é2rül
+mér2v1a2
+2m1érz
+mé2s1a2
+mé2s1á2
+mé2s1e2l
+mé2s1er
+mé2sez
+mé2sin
+mé2sö
+més3sza
+mésza2
+mész1al
+mé2sz1ál
+mé2sz1á2ra
+mé2szed
+mé2sz1el
+2mészl
+mé2sz1ő
+mész3s
+2mészté
+2mészth
+2mészti
+2mésztj
+2mésztl
+2mésztü
+2mésztv
+mé2sz1ü2
+mé2t1ad
+mé2t1ak
+mé2t1a2n
+mét1árt
+mét1elho
+mét1elta
+mé2t1e2v
+mé2tég
+2m1étje
+2m1étjér
+2m1étjév
+2m1étjü
+2m1étke.
+mé2t1o
+mé2tö
+métő2
+mé2tőr
+mé2t1u
+mé2t1ű
+2m1év.
+2m1évb
+2m1é2ve.
+2mévei
+2m1é2vek
+mé2ven
+mé2ves
+2m1é2vet
+2m1é2véb
+mé2vén
+2m1évf
+2m1évh
+2m1é2vi
+2m1évk
+2m1évn
+2m1évr
+2m1évs
+2m1évt
+2m1évv
+mé2z1a
+mé2z1á2
+mé2zeg
+mé2zil
+mé2zim
+mé2zin
+méz1ism
+mé2zit
+mé2zí
+mé2z1o
+mé2z3s
+mé2zu
+mé2zű
+mfa2l1e2
+mfa2lom
+mfa1s2
+mfé2m1a2
+mfit2
+mfi1tr
+mf2la
+m1f2lo
+mf2ló
+mf2lu
+mfog1adat
+m1f2rak
+m1f2ran
+mf2rá
+m1f2re
+m1f2ri
+m1f2rí
+m1f2ro
+m1f2rö
+mgé2p1e2l
+mgépi2
+mgé2p1ip
+mg2li
+mg2ló
+mgör2cso
+mg2ra
+mg2rá
+mha2sábr
+mhossz1út
+1mi
+mi2aa
+mi2aá
+mi2abo
+mi2ac
+mi2ae
+mi2aé
+mia1f2
+mi2afr
+mi2ag
+mi2ah
+mi2aí
+mi2ale
+mi2amé
+mi2ao
+mi2aó
+mi2aö
+mi2aő
+mi2a1p
+mi2aré
+mias2
+mi2aszá
+mi2aszé
+mi2aszi
+mi2aszó
+mi2atá
+mi2ati
+mi2ato
+mi2aü
+mi2av
+2m1i2áz
+mi1bl
+micsa2p1
+2m1i2deá
+2m1i2deg
+2m1i2dei
+2midej
+2miden
+mi2dent
+2m1i2deo
+mi2dén
+mi2dio
+mi2dió
+mi2dol
+2midő
+m1időz
+mie2l
+mi2éf
+mi1fl
+mi1fr
+2m1i2gaz
+2m1i2gén
+mi1gri
+2m1ihl
+mii2d
+mi1k2li
+mi1klu
+mi2kono
+mi2kont
+2miks
+mi2lal
+2mille
+2millu
+2millú
+mi2ma.
+mi2máh
+mi2mit
+mi2mór
+mi2naj
+2m1i2nam
+mina2n
+min1any
+2m1i2nas
+mi2n1ára
+min2c1e2
+min2ch
+min2d1a2
+2m1indá
+min2dek
+min2d1er
+min2din
+2m1indí
+2mindu
+mi2neg
+mine2s
+2minfl
+2m1infú
+min2g1á
+2m1ingé
+min1g2h
+min1inj
+min2k1a2l
+min2k1an
+min2k1as
+min2kec
+min2kó
+min2kö
+2m1insp
+2m1i2nuk
+mi2nü
+2m1inz
+mio2n1a
+mio2n1á
+mio2r
+mió2r
+mi1p2l
+mi1p2r
+mi2ram
+2m1i2rat
+2mi2rán
+2mirg
+2mirh
+miri2gyel
+2m1irk
+2m1i2rod
+2m1i2rom
+mi2rón
+2m1irr
+mi2sal
+mis1elv
+mis1epe
+mis1ing
+2misit
+mi2s1í2r
+mi1s2pi
+mis3szab
+mis3szer
+mi2s1ü2t
+mi2s1ü2v
+mi2s1ű
+mi2szár
+mis3zár.
+mi1sz2f
+mi2tac
+mita2n
+mit1any
+2m1i2tat
+2mitác
+mit1ár.
+mit1árá
+mit1árh
+mit1ári
+mit1árk
+mit1árn
+mit1árr
+mit1árt
+mit1árú
+2mitbo
+mit1ing
+miti2s
+2mitlá
+mi2tök
+mi1tri
+2mitro
+2mitrú
+mi2tür
+miumé2
+miu2min
+miu2s
+2m1i2vad
+2m1i2vó
+mi2x1i
+mi2xö
+mi2xő
+mi2zé.
+mi2zét
+1mí
+m1í2gé
+mí2ja
+mí2já
+m1íns
+2m1í2rá
+2m1í2ró
+m1ív.
+mí2vá
+m1ívb
+mí2vé
+m1ívh
+m1ívr
+m1ívv
+mí2zü
+mí2zű
+mjé2ná
+mjobb1o
+mjo2g1á2s
+m2j1ol
+mj1ósá
+mj1ős
+mkaró2
+mka2r1ór
+mke1p
+mkia2
+mkiá2
+mkie2
+mk2la
+mk2li
+mk2lí
+mk2lo
+mk2lu
+mkó2rost
+mk2ra
+mk2rá
+mk2re
+mk2ré
+mk2ri
+mk2rí
+mk2ro
+mk2ró
+mk2va
+mk2vó
+mla1f
+mlapá2r
+mla2p1áro
+mla2p1e2
+mla2pin
+mla1s2t
+mlás3s
+mlá2s3z
+mle1g2
+mleí2
+mle1kn
+mle1pla
+mlé2k1a2
+mlé2k1á
+mlé2k1el
+mlé2k1est.
+mlé2k1ér.
+mlé2k1ol
+mlé2kos
+mlé2kó
+mlé2k1ú2
+mlé2szé
+mlo2k1ál
+mlo2ké
+mlő2s1a2
+mlő2s1ű2
+mmag1g
+mma1gl
+mmai2
+mmas2
+m2m1atk
+m2me.
+mme2g1é
+mmifé2l1é2v
+1mo
+mo2be
+2m1obj
+moci1
+2m1off
+mo1g2ráf.
+mo1g2ráff
+mo1g2ráfk
+mo1g2ráfn
+mo2gy1a2
+mohu2
+mo2is
+mo2kab
+mo2k1ad
+mo2k1a2k
+mo2k1a2l
+mo2k1a2n
+mo2kar
+mo2kád
+mo2k1ál
+mo2k1á2s
+mo2k1e2
+mo2k1il
+mok1k2
+mo2k1ol
+mo2k1or
+mo2k1ó2
+mo2kö
+mok1t
+2m1oktat
+moku2
+mo2kur
+mokú2
+mo2kús
+mo2k1úto
+mo2kü
+2m1o2laj
+2m1olda
+m1oldó
+2m1o2lim
+molli2
+mol2l1in
+2m1olló
+molói2ko
+2m1oltár
+2m1oltás
+2molvad
+2molvas
+2m1oml
+mon1acé
+mo2n1a2d
+mo2n1a2l
+mo2n1an
+mo2n1a2p
+mona2r
+mo2n1as
+mo2n1áll
+mo2neg
+mo2n1er
+mo2n1is
+mon2or
+mo2nö
+mons2
+mon1sp
+mon1tré
+mo2nü
+mo2nű
+monyá2
+mo2nyáz
+mo2or
+2m1opc
+2mope
+mo2per
+mo1p2l
+2m1opt
+mo2r1ad
+mora2n
+mor1any
+morá2la
+2m1ordí
+mo2r1el
+mo2ren
+mo2r1e2r
+mo2r1est
+mo2rid
+2morie
+mori2s
+mo2r1isk
+mo2r1iszo
+mor1izg
+2morjaia
+2morjaié
+2m1orjait
+mo2r1ol
+mo2r1ont
+mo2r1ón
+mo2r1ó2r
+mo2rós
+mo2rö
+2m1orr.
+mor1s2
+mort2
+mor3tá
+mor1tr
+mo2rü
+mo2rű
+mo2sál
+mo2s1e
+2mosto
+2m1ostr
+2m1osty
+mo2sü
+mo2szal
+mo2szis
+2m1oszlo
+mo1t2h
+2m1ottha
+mot2to
+mo2un
+mo2us2
+mo2vi
+mo2xi
+mo3zso
+1mó
+móá2g
+mó1bl
+mó2ch
+mócsa2p1
+mócsapá2
+mó2d1a2l
+mó2dau
+mó2dák
+mó2dár
+mó2d1e2
+mó2dip
+mó2d1o2r
+módó2
+mó2d1ór
+módu2
+módus1
+mó1fl
+mói2ko
+mó1k2l
+mókus1s
+mó2lar
+mó1p2r
+mó2rak
+mó2rar
+mó2rág
+mó2rái
+mó2ráj
+mó2rám
+móri2as
+móró2
+mó2r1ón
+mó2rö
+mó1s2k
+mó1the
+1mö
+mö2bö
+mö2ko
+möl2cs1a
+möl2csá
+möl2csel
+möl2cs1es
+möl2cs1ér.
+möl2cs1il
+möl2cs1o
+möl2cs1ő
+mö2le
+mö2nu
+mö2ro
+mö2r1ő
+m1ötl
+mö2ve
+mö2vö
+mö2vü
+mö2vű
+1mő
+mőa2n
+mőá2g
+mőe2l
+mőe2r
+mőé2l
+mőé2te
+mő1kl
+mő1ps
+mő2r1á2r
+2m1őrh
+2m1ő2ri
+mő2si
+mő2sü
+mős3zár
+mőü2l
+mő2zi
+mpa1dr
+m2p1akc
+m2p1aktá
+m2p1áll
+m2p1árko
+m2p1átj
+m2p1átk
+mp2ci
+mp1elt
+mp1fr
+mp1ind
+mpi2re
+mp2lak
+mplo2mal
+m1p2lu
+mpon1d2
+m2p1ord
+mporta2
+mpor2t1al
+mpor2t1á2r
+mpor2t1e2
+m2p1osztás
+m2p1ös
+m1p2ref
+m1p2rep
+m1p2rés
+m1prib
+m1p2ric
+mp2rio
+m1p2rod
+m1prof
+m1prog
+m1proj
+m1p2ro1p
+m1p2rot
+m1p2rób
+m1p2ru
+m1p2szi
+m2p1u2ta
+m2p1utó
+m2p1üz
+mra1p
+mren2d1ő2
+mré2m1
+msa2vo
+ms2ka
+ms2ká
+ms2ki
+ms2ko
+ms2lá
+ms2mi
+ms2ni
+ms1ond
+ms2pa
+ms2pe
+ms2pi
+ms2po
+ms2pó
+ms2rá
+ms2ta
+ms2tá
+ms2te
+ms2ti
+ms2tí
+ms2to
+mst2r
+ms2tú
+msza2ké
+msza2k1ü
+mszáraz1
+msz2c
+mszé2dem
+m1sz2f
+mszín3n
+msz2l
+msz2m
+m1sz2p
+msz2tá
+m1sz2v
+mta2n1ó2
+mtára2d
+mtá2r1ada
+mtés3s
+mtőkész1
+mtran2s
+mtransz1
+mt2rá
+mt2re
+mt2ré
+mt2ri
+m1t2ró
+mt2rö
+mt2rü
+1mu
+2m1udv
+2m1ugr
+m1ujj
+2mulet
+2mulz
+mu2m1ad
+mu2m1el
+mu2mél
+mu2m1és
+mu2min
+mu2m1ir
+mu2mis
+mu2m1iv
+mumkész1
+mu2m1ó2
+mu2mö
+mu2mő
+mumus1s
+mun1g
+mu2nok
+2mur.
+mu2ral
+mu2ram
+mu2rat
+mu2rál
+mur1izm
+mu2r1u2
+mu2sal
+mu2san
+mu2sar
+mu2sas
+mu2sat
+mu2s1á2g
+mu2sál
+mu2s1e
+mu2s1érté
+mu2sir
+mu2sor
+mu2s1ó2
+mu2ső
+muss2
+mus3sze
+mus2tárá
+mus2t1erj
+mu2szal
+mus3zav
+mu2szál
+mu2szás
+mu2t1a2g
+mu2tal
+mut1a2la
+2m1utalá
+2mutalv
+muta2n
+mu2t1any
+mu2tasí
+m1u2taz
+mu2t1á2ra
+mu2t1árb
+mu2t1á2ru
+2m1u2tás
+2mutca
+mu2t1el
+mu2til
+mu2t1in
+2m1u2tol
+2m1u2tód
+2m1u2tóp
+mu2t1ö
+mu2tü
+1mú
+mú2jí
+múl2t1e2
+múl2tol
+2m1úr.
+mú2ri
+2m1úrn
+2m1ú2sz
+2m1útb
+m1úth
+2m1ú2ti
+2m1útj
+2m1útk
+2m1útm
+2m1útn
+2m1ú2to
+2m1útr
+2m1útt
+2m1útv
+1mü
+mü2dí
+mü2dü
+mü2gy
+mü2ná
+mü2re
+mü2rí
+mü2rü
+mü2te
+mü2té
+mü2tő
+mü1tz
+mü2ve
+mü2vö
+mü2ze
+1mű
+mű1bl
+mű1br
+mű1fl
+mű1fr
+mű1gr
+mű1kl
+mű1pl
+mű1pn
+mű1pr
+2m1űrl
+mű1sp
+műsú2
+mű1sz
+műtőkész1
+műves3s
+mű2zé
+mű2zi
+mű2zö
+mű2ző
+mű2zü
+m2v1a2dot
+mvágya2d
+mvá2gy1ada
+mverés3s
+mw2hi
+mza2t1e
+mzás3s
+mze2r1o
+mze2t1a2
+mze2t1á2
+mze2t1e2g
+mze2t1el
+mze2ter
+mze2tesz
+mze2t1é2k
+mze2t1érd
+mze2to
+mze2t1ö2
+mze2t1ő2
+mzé2s1a
+mzé2so
+mzókész1
+mzőe2r
+mz2rí
+2n.
+1na
+naa2d
+n1abbó
+2n1abr
+2n1abs
+na1cl
+2n1a2dag
+2n1a2dás
+2n1add
+na2dek
+2n1adm
+2n1a2dó
+na1d2re
+2n1adt
+na2du.
+na2dus
+na2ei
+naé2r
+2n1aff
+na2ga.
+na2gár
+na2git
+na2gón
+na1grá
+nagy1agg
+na2gy1a2l
+na2gyapj
+na2gy1as
+na2gyav
+na2gy1é2k
+nagyú2
+nagy1úr
+nagy1út
+na2ire
+na2ji
+2n1ajk
+2n1a2kad
+nakaró2
+nak1á2sz
+na2k1át
+n1akko
+na1kli
+na1klu
+nako2l
+nak1ola
+2n1a2kó.
+na1k2ré
+n1akti
+2n1a2kus
+na2k1útn
+na2l1a2dó
+2n1a2la2g1
+na2l1aj
+na2l1a2l
+na2lana
+2n1a2lapa
+2n1a2lapd
+na2lapr
+na2lapt
+na2lar
+na2lav
+na2l1ábr
+na2lág
+na2l1á2l
+na2l1á2ro
+nal1á2t1ö
+na2l1áts
+na2l1elá
+na2l1ell
+nal1eng
+nal1ent
+nal1ég.
+na2l1ék
+na2l1éri
+na2lid
+na2l1ing
+na2l1i2o
+na2l1í2r
+2nalízisb
+2nalízise
+2nalízisé
+2nalízish
+2nalízisi
+2nalízisk
+2nalízisn
+2nalízisr
+2nalízist
+2nalízisü
+2nalj.
+n1alja.
+3naljac
+n1aljad
+n1aljai
+2naljak
+n1aljam
+n1aljat
+n1alji
+2naljon
+2nalju
+2naljz
+2n1alkat
+na2l1ob
+na2l1ol
+na2lop
+nal1osz
+na2l1ó2r
+na2l1ő
+nalt2
+nal1tr
+na2lulj
+na2l1ut
+na2lü
+na2mer
+2namitbo
+2n1a2mite
+2n1a2mitg
+2namitha
+2n1a2mitk
+2n1amitl
+2namitm
+2namitö
+2n1a2mitp
+2namitro
+2namitrú
+2namits
+2namittá
+2namittö
+2n1amö
+2n1amp
+2n1a2nal
+2n1ang
+2n1anh
+nano1
+nanog2
+na2nód
+2n1a2nyag
+nao2l
+naó2r
+2napa.
+nap1adó
+na2p1a2g
+na2p1ala
+na2p1alk
+nap1a2pa
+nap1apá
+nap1ará
+na2p1as
+na2pád
+na2p1á2g
+na2pák
+nap1áll
+na2pám
+na2p1árb
+na2p1átm
+nape2l
+nap1ell
+na2pem
+nap1est
+na2p1ill
+na2p1ing
+na2p1int
+nap1isk
+na2pí
+nap2lat
+na2p1ola
+nap1orm
+napos1s
+na2p1ostá
+na2p1ott
+na2pó.
+na2p1ó2r
+napp2
+2nappo
+nap1pr
+n1aprí
+2napróz
+na2p1u2t
+na2p1úr
+2n1a2rai
+2narann
+2n1arany.
+2n1a2ranya.
+2n1a2ranyá
+2naranyb
+2naranyh
+2naranyk
+2naranyn
+2naranyr
+2naranys
+2n1aranyt
+2n1arc.
+2n1arcá
+narchi2ab
+2n1arco
+2n1arcu
+2n1arcú
+n1arró
+2n1arz
+na2sév
+nas1isk
+2nask
+na1s2ka
+na1s2rá
+nast2
+na1s2ta
+na1s2tá
+na1str
+na2sz1an
+na2sz1árad
+naszkész1
+nasz1üg
+na2t1ab
+na2t1aj
+na2t1alk
+na2t1alt
+nat1ará
+nat1áll
+na2t1á2ré
+na2t1árn
+na2t1eg
+nate3le
+na2t1elé
+nat1elle
+na2tél
+nat1érke
+na2t1érv
+na2t1i2m
+na2t1ing
+na2t1old
+nat1ors
+na2t1osz
+na2t1u2t
+na2tül
+natű2z
+2n1a2ty
+na2uc
+na2ul
+nau2ra
+na2urá
+nau2s
+na2uto
+naü2z
+na2vart
+na2vat
+2n1avv
+na1wh
+2n1azb
+na2zé
+2n1a2zo
+1ná
+2n1á2bé
+2nábr
+ná2caj
+ná2c3h
+ná2cí
+ná2csal
+ná2csap
+ná2cs1as
+ná2cse
+nác3sik
+ná2csis
+2nácsolat
+nác3sor
+ná2csö
+ná2csü
+nác3sz
+ná2d1ala
+ná2dap
+ná2d1a2r
+ná2d1asz
+ná2d1a2v
+ná2dá
+nád1d
+ná2d1e2
+ná2d1ö
+ná2dud
+ná2d1ü2
+ná2d3z
+ná2ga
+ná2gá
+ná2gi
+ná2gu
+ná2gú
+ná2gy
+2n1á2hí
+ná2k1ér.
+ná2kol
+ná2kü
+ná2lab
+ná2l1a2l
+ná2lana
+n1álar
+nála2te
+ná2l1az
+ná2l1át
+nále2
+ná2l1eg
+ná2l1el
+ná2lem
+ná2les
+n2álé
+ná2l1ép
+ná2l1in
+ná2lir
+nál2is
+ná2lí
+2n1áll.
+2n1álla.
+2n1állap
+2n1állat
+2n1állí
+2n1állom
+nállóköz1
+ná2lü
+ná2mí
+ná2mu
+ná2nad
+ná2n1al
+ná2nar
+ná2n1á2r
+nán2c1e
+ná2n1e2
+náné2
+ná2nét
+ná2nin
+ná2ní
+nán2se
+ná2nü
+ná2rad
+2n1á2raka
+2n1á2rakb
+2n1á2rakh
+2n1á2rakk
+2n1á2rakn
+2n1á2rako
+2n1á2rakr
+2n1á2rakt
+2n1á2ram
+ná2r1a2n
+ná2rap
+ná2ras
+nár1ass
+2n1á2rat.
+ná2r1att
+ná2r1av
+ná2r1ác
+ná2r1ál
+ná2r1e2
+ná2r1éve
+2n1á2riai
+2n1á2riá
+ná2r1i2p
+ná2rí
+náró2
+ná2r1ór
+ná2rő
+nár1s2
+nárt2
+nár1tr
+2n1árud
+ná2rug
+2nárun.
+nár1ur
+2nárus
+náru2t
+nár1utá
+ná2rút
+ná2rü
+ná2s1as
+nás1áré
+ná2s1á2ru
+2n1á2sás
+ná2s1e2
+ná2s1i2k
+nást2
+nás1tr
+ná2szan
+ná2szas
+ná2szág
+ná2szál
+ná2sze
+ná2szén
+ná2szil
+ná2szin
+ná2szis
+2n1ászka.
+2n1ászoks
+ná2sz1ö
+ná2sz1ú
+ná2sz1ü
+ná2tala
+ná2t1a2n
+ná2tál
+nát1ásv
+ná2t1e2
+2n1áthi
+ná2t1i2o
+2n1á2t1ir
+2n1á2tí
+2n1átlé
+ná2t1ö
+2n1átru
+2n1átug
+2n1átut
+2n1á2tú
+ná2tü
+2n1átvi
+nba2ká
+nba2k1e2
+n2b1é2kéb
+n2b1é2kén
+n2b1é2kér
+n2b1é2kév
+nb2la
+nb2lo
+nb2lú
+nbo2n1a2
+nb2ra
+n1b2ri
+nb2ro
+nb2ró
+nburg2hi
+nc1acé
+n2c1ajá
+nc1ajt
+n2c1akn
+n2c1akt
+nc1a2la
+nc1alj
+n2c1alk
+nc1alt
+nc1alv
+nc1ana
+nc1ant
+nc1a2nya
+nc1ari
+nc1att
+nca2u
+n2c1ava
+n2c1ág
+nc1árb
+nc1árk
+n2c1árn
+nc1árt
+nc1á2sa
+nc1ásá
+nc1bl
+nc1br
+nc3csi
+nc3cso
+nc3csö
+nc3csu
+nc1dr
+ncea2
+nc1egg
+n2c1eld
+nc1e2lek
+nc1e2lem
+nc1elm
+n2c1elv
+nc1e2red
+nc1eró
+n2c1eszt
+nc1etn
+n2c1ex
+ncé2g1ér
+ncé2hes
+n2c1ép
+n2c1évi
+nc1fl
+nc1fr
+nc1gr
+n2c3ha
+n2c3há
+n2che.
+nc3hel
+nc3het
+n2c3hé
+nc3hiá
+nc3hí
+nc3hol
+nc3hon
+n2c3hoz
+n2c3hó
+nc3hö
+n2c3hu
+n2c3hú
+nci2alis
+nci2aso
+n2c1ige
+n2c1i2gé
+n2c1i2ko
+nc1i2má
+n2c1i2na.
+n2c1ind
+nc1inf
+n2c1ing
+n2c1int
+n2c1irá
+nc1iro
+n2c1ist
+n2c1i2ta
+n2c1i2z
+nc1íj
+n2c1ír
+n2c1ív
+n2c1íz
+nc1kl
+nc1kre
+n2c1ob
+n2c1okta
+n2c1o2li
+nc1orv
+n2c1ott
+n2c1ölt.
+nc1öss
+ncö2t
+nc1őr
+nc1pl
+nc1pr
+n2cs1ab
+n2csac
+n2csad
+n2cs1ag
+n2cs1ajt
+n2csakt
+ncs1alap
+n2cs1alj
+n2csam
+n2csan
+ncsa2p1á2g
+ncsa2r
+ncs1ara
+ncs1arg
+ncs1aro
+n2cs1au
+n2csaz
+ncs1ágr
+n2cs1ál
+n2c3sár.
+n2cs1á2rá
+ncs1árb
+n2cs1árn
+ncs1árr
+n2csáru
+n2csáta
+n2csátá
+n2csátv
+ncs1elf
+ncs1é2rés
+n2csérte
+n2cs1érté
+n2c3sérü
+n2c3séta
+ncs1i2kon
+ncs1int
+n2cs1io
+n2csipa
+n2csirá
+ncs1irt
+n2cs1ism
+n2csita
+ncs1izz
+nc3síki
+n2cs1í2rá
+ncs1ízt
+n2csob
+n2cs1oks
+n2csokta
+n2csosz
+n2cs1ö2lé
+n2cs1ös
+n2cs1öz
+n2cs1őr.
+ncs1őrö
+ncs1s
+n2csur
+ncsu2t
+ncs1uta
+n2csút
+n2csüg
+n2csüt
+ncs3zár
+nc3sze
+nc3szó
+nc3szö
+nc1tr
+n2c1ud
+n2c1ug
+nc1uj
+n2c1ur
+n2c1új
+nc1út
+n2c1üg
+n2c1üt
+nc1üv
+n2c1üz
+n2c1űr
+nc1ya
+n2c3zá
+nc3ze
+n2c3zó
+nc3zö
+nc3zs
+nc3zü
+nczy1i
+nd1abl
+nda1br
+nd1a2dat
+nda2dás
+nd1add
+n2d1ajá
+n2d1akc
+n2d1akk
+nd1akt
+n2d1alj
+n2d1alr
+nd1ann
+nd1apó
+nd1a2rán
+nd1arr
+ndat1any
+nda2tap
+nda2t1eg
+nda2tin
+nda2tir
+nd1azo
+nd1azt
+nd1azz
+nd1á2rak
+ndás1s
+nd1bl
+nd1cl
+nd1dr
+nd1ebb
+n2d1e2kéb
+n2d1e2kéin
+nde2köz
+n2d1elf
+n2d1ellen
+n2d1elm
+nd1elö
+nde2mer
+nde2mu
+nde2m1ü
+nde2ná
+n2dennek
+nde1p2
+nde2r1a
+nde2rál
+nde2ráz
+nde2rel
+nde2ro
+n2d1erő
+n2d1e2sett
+n2d1e2sés
+n2d1e2ső
+nde2sza
+n2d1e2szü
+nd1eza
+ndé2go
+ndé2kel
+nd1ékez
+ndé2kö
+n2d1éle
+nd1élm
+n2d1ép
+ndé2raj
+n2d1éssz
+n2d1észh
+n2d1észl
+n2d1észr
+n2d1é2te
+n2d1étt
+nd1fr
+nd1gr
+n2d1iga
+n2d1ige
+n2d1ill
+n2d1i2na.
+n2d1ing
+n2d1ins
+n2d1i2onj
+ndi2óé2
+ndi2óf
+ndi2óm
+n2d1isza
+ndí2j1a2da
+nd1kl
+n2d1oá
+ndo2k1út
+ndo2rál
+n2d1orni
+ndo2r1ú
+n2d1ou
+n2d1ov
+ndóé2r
+nd1ó2ni
+n2d1ó2rá
+ndö2b
+nd1öss
+n2d1ö2z
+n2d1őr.
+n2d1ő2r1a2
+n2d1őrb
+n2d1őrc
+n2d1őrd
+nd1ő2reg
+nd1ő2rei
+nd1ő2rek
+nd1ő2rel
+nd1ő2rék
+nd1ő2rén
+nd1ő2rér
+nd1ő2rét
+nd1ő2rév
+n2d1őrf
+n2d1őrg
+nd1ő2rig
+nd1őris
+nd1ő2rit
+n2d1őrj
+n2d1őrk
+n2d1őrl
+n2d1őrm
+n2d1őrn
+nd1őrok
+nd1őros
+n2d1ő2rö
+nd1őrős
+n2d1őrp
+n2d1őrr
+n2d1őrs
+n2d1őrt
+n2d1őrú
+n2d1őrv
+nd1pr
+nd2raz
+n1d2ruk
+nd1sl
+nd1sp
+nd1st
+ndszá2m1út
+ndsze2r1e2l
+ndtár2s1a2d
+nd1u2szo
+ndu2t
+n2d1uta
+nd1új
+ndú2rá
+nd1úsz
+n2d1üg
+nd1ünn
+n2d1üz
+n2d1űr.
+n2d1űrr
+n2d1űrt
+n2d1űz
+ndy2b
+ndy2h
+ndy2n
+ndy2r
+ndy2t
+ndy2v
+nd3zav
+nd3zár
+n2d3ze
+n2d3zó
+n2d3zu
+1ne
+nea2j
+nea2k
+nea2la
+ne2alo
+nea2n
+nea2r
+ne2bé
+ne1bl
+ne1dra
+ne1d2rá
+ned2v1el
+ne1dy
+2n1e2dzé
+2neff
+2n1e2ger
+2n1egér.
+ne2g1ö
+n1egy.
+n1egyb
+ne2gyek
+ne2gyen
+ne2gyes
+ne2gyet
+ne2gyez
+2n1e2gyé
+n1egyf
+n1egyh
+ne2gyig
+n1egyk
+n1egym
+n1egyn
+n1egyr
+2n1egys
+n1egyt
+ne2gyün
+nehéz1
+2n1ehh
+nei2g
+neí2r
+ne2k1aj
+ne2k1a2n
+ne2kát
+ne2k1e2g
+nek1erő
+nek1é2jé
+ne2kék
+nek1ékn
+nekie2
+2nekj
+nek1k2
+2nekka
+2nekki
+ne1klu
+ne2k1ok
+nekö2r
+ne1kreá
+nek1t2
+ne2k1üg
+nek1üldö
+ne2lag
+ne2laj
+ne2l1an
+ne2lál
+nelá2r
+ne2lef
+ne2leg
+n1elegy.
+nel1e2le
+nele2ma
+nelem1el
+nel1e2més
+nel1eng
+ne2ler
+ne2l1ép
+nelfé2
+nel1g2
+2n1elha
+ne2l1id
+ne2lim
+ne2l1in
+n1elló
+2n1elnev
+ne2l1ot
+ne2l1ó2
+ne2l1ö2
+2n1e2lőa
+2n1e2lőá
+ne2lőd
+ne2lőf
+ne2lőhí
+2n1e2lőí
+2n1e2lőké
+ne2lől
+2n1előny
+2nelőrej
+2n1e2lőté
+2n1eltér
+ne2l1ül
+2n1elz
+ne2mak
+2nemba
+2n1ember
+neme2g
+nem1egy
+2nemele
+2n1emelk
+ne2m1esz
+ne2m1ér.
+ne2m1id
+nem1isz
+2nems
+2nemul
+2n1eng
+2n1enn
+nen2sa
+nense2s
+nen2s1ese
+nens3s
+nen2s3z
+2n1enyv
+2n1enz
+ne2ob
+ne2od
+ne2of
+ne2og
+ne2oh
+ne2oko
+ne2ola
+ne2oli
+ne2oro
+ne2pad
+ne2pelm
+ne2p1est
+ne2pid
+ne2p1ó2r
+ne2p1ut
+ne2r1a2d
+ne2r1a2k
+ne2r1a2n
+ne2r1a2r
+ne2r1as
+ne2raz
+ne2ráb
+ner2co
+ne2r1e2g
+n1e2rej
+ne2r1e2ke.
+ne2r1e2l
+ner1emel
+ne2r1er
+ne2rez
+ne2rég
+ne2r1él
+ne2r1ép
+ne2r1étt
+ne2r1id
+ne2r1iga
+ne2r1il
+ne2r1i2m
+ne2r1inf
+ne2r1ing
+ne2r1int
+ne2ris
+ner1k2
+ne2r1ol
+ne2ror
+ne2r1os
+ne2ró
+ne2r1ön
+2n1e2rő
+3n2e3rőkü
+ner1s
+ner1tr
+ne2r1u2
+ne2r1üg
+ne2s1aljá
+ne2sas
+ne2s1ál
+ne2sár
+2n1e2setb
+2n1e2setr
+2n1e2sés
+2n1e2ső
+nes3sza
+nes3szá
+2n1esté
+2n1esti
+ne2s1ü2v
+nesz1ál
+ne2s3zár
+ne2sz1él
+ne2sz1ű2
+ne2t1ab
+net1a2la
+ne2t1a2ny
+ne2tál
+ne2t1át1
+ne2t1e2g
+net1elá
+net1elm
+ne2t1előa
+ne2t1eml
+net1este
+ne2t1esz
+ne2t1etet
+ne2t1eti
+ne2t1é2k
+ne2t1é2l
+ne2t1ér.
+ne2t1érd
+ne2t1éré
+ne2t1é2rő.
+ne2t1é2rők
+ne2t1érr
+ne2térte
+ne2t1értő
+ne2t1é2rü
+ne2t1ész
+ne2t1é2ve.
+ne2tid
+ne2t1i2ko
+ne2t1int
+ne2tip
+netké2sz1ü
+ne2t1o2k
+ne2tol
+net1old
+ne2t1ő2
+net2tév
+ne2tun
+ne2t1ut
+netü2l
+net1ülé
+ne2t1ü2z
+2n1e2vő
+2n1evv
+nexpor2t1ő2
+ne1yé
+2n1e2zer
+2n1ezred
+2nezüs
+1né
+2n1ébr
+2nédl
+né1f2r
+2n1ég.
+2n1é2gek
+2n1é2geté
+2n1é2gető.
+2négetőh
+2n1é2getők
+2négetőn
+2négetőt
+2n1é2gé
+2n1égj
+2n1égn
+2n1é2gő
+2n1égs
+2n1égt
+2n1é2gü
+né2gyer
+né2gyén
+né2gy1o
+né2gyök
+2n1é2hes
+2n1éhs
+né2kaj
+né2kak
+né2k1a2n
+né2kar
+né2k1á
+néke2l
+nék1ele
+né2ker
+né2kév
+né2kid
+nék1isz
+2n1é2kí
+né2kó
+nékü2
+né2kül
+n1é2les
+2n1é2let
+2n1élm
+né2lői
+né2lőn
+2néneke
+2n1é2neké
+népa2
+né2pad
+né2p1ak
+né2p1al
+né2p1an
+né2pap
+né2p1as
+né2pau
+népá2
+né2p1ál
+né2p1ár
+né2pát
+né2p1áz
+né2peg
+né2p1e2l
+népe2r
+nép1etet
+né2p1etn
+né2pev
+né2p1és
+nép1f2
+2né2pí
+né2p1o
+né2p1ö
+né2pő
+nép1s
+né2p1us
+né2pú
+2népül
+néra2
+né2raj
+né2r1an
+n1érd
+2nérde
+2n1é2rem
+né2ré.
+né2rés
+né2ri.
+né2rin
+né2rip
+né2rö
+2n1é2rő.
+2n1érté
+né2rü
+2n1érz
+né2s1e2l
+né2s1ég
+nés3szer
+nész1ak
+nész1al
+né2sz1á
+né2szeg
+né2sz1e2l
+né2sz1emb
+né2sz1e2sz
+né2sz1ék
+né2szik
+né2sz1í
+nészkész1
+né2szó
+né2sz1ö2
+né2szu
+né2sz1ú
+né2szül
+né2t1eg
+2n1é2tel
+né2t1es
+2n1é2tet
+néti2
+né2tir
+né2tö
+né1t2r
+néva2
+név1ada
+név1adá
+né2vaj
+né2var
+né2vav
+né2v1ág
+2n1évbú
+2n1é2ve.
+2névei
+2n1é2vek
+néve2l
+né2v1ele
+név1elő
+2né2vem
+2névenk
+2névent
+né2v1e2r
+né2ves
+név1esz
+2né2vet
+2névéb
+né2v1é2l
+né2v1éri
+né2vérő
+né2v1érz
+né2vis
+2névny
+né2v1o
+né2vö
+né2vő
+né2v1u2
+né2vú
+né2vün
+né2za
+néziu2m1i2
+nfe2lemé
+n1f2la
+n1f2lo
+nfluor1e
+nfol2ta
+n1f2rak
+n1f2rá
+n1f2rek
+n1f2ri
+n1f2rí
+n1f2rö
+n1f2ru
+nfüs2t1ölé
+n2g1abl
+n2g1a2dat
+n2g1a2dá
+ng1a2dó
+n2gadó.
+n2gadóa
+n2gadób
+n2gadói
+n2gadój
+n2gadók
+n2gadór
+n2gadós
+n2gadót
+n2gadóv
+ng1akn
+n2g1akr
+n2g1akt
+nga2lag
+nga2lak
+nga2lap
+ng1alát
+ng1alel
+n2g1alg
+n2g1alj
+n2g1a2ny
+nga1p2
+n2g1a2rán
+n2g1arc
+n2g1art
+n2g1arz
+n2g1asp
+ng1assz
+n2g1aszt
+nga1tr
+n2g1a2u
+n2g1ava
+nga2zon
+ngá2c
+n2g1á2g
+ng1állá
+ng1állo
+ng1álló
+n2g1áp
+ng1á2rak
+ng1áras
+ng1árat
+ngá2rát
+ngá2ráv
+ngá2ré
+n2g1árnya
+n2g1árta
+ngá2ruk
+n2g1á2rú
+n2g1á2szaib
+n2g1á2szair
+n2g1á2szait
+n2g1á2száv
+n2g1á2szé
+n2g1á2szi.
+n2g1á2szig
+n2g1á2szoké
+n2g1á2szos
+n2g1átá
+ng1átc
+n2g1á2t1e2
+n2g1á2ti
+n2g1átk
+n2g1átl
+n2g1átm
+n2g1áts
+n2g1átv
+n2g1á2zój
+n2g1á2zós
+n2g1áztato
+ng1bl
+ng1br
+ng1d2r
+ng1edz
+ngegész1
+n2g1ela
+nge2lis
+nge2r1a
+nge2rál
+nger1e2sz
+nger2im
+nge2ro
+n2g1esem
+n2g1eszk
+nge2tika
+n2g1ex
+n2g1é2g
+ngé2les
+n2g1épí
+n2g1érc
+ng1érl
+ng1é2rő.
+ng1érté
+ngé2sa
+n2g1éte
+ng1fr
+ng1g2r
+ng3gyi
+ng3gyo
+n2g1i2d
+ngi2g
+n2g1iga
+n2g1ige
+n2g1igé
+ng1i2ko
+n2g1ikr
+n2gill
+ngi2m
+ng1imi
+ng1inf
+n2g1ing
+ng1ins
+ng1iro
+n2g1izg
+ng1íg
+ng1ír
+ng1ív
+ng1íz
+ng1kl
+ng1kr
+ng1kv
+n1glec
+ngmeg1
+n1g2nó
+n2g1of
+n2g1op
+ngora1
+n2g1ord
+n2g1org
+n2g1ork
+ng1osto
+ng1oszt
+n2g1otth
+ngó2riá
+n2g1öb
+ng1önt
+ngö2r
+ng1örö
+ng1örv
+n2g1öv
+n2g1ö2z
+ng1őrö
+ngő2z1ős
+ng1pr
+ng1ps
+n1g2ram
+ng2rádih
+ng2rádj
+n1g2ráf
+ng2run
+ng1sh
+ng1sk
+ng1sp
+ng1tr
+n2g1ud
+n2g1ug
+n2g1uj
+n2g1und
+ng1u2ra
+n2g1uta
+n2g1új
+ng1útt
+n2g1üd
+n2g1ü2g
+ng1ür
+ng1üt
+n2g1üz
+ng1űr
+ngy1a2gya
+ngya2l1ó2
+ngy1ass
+n2gy1á2l
+n2gy1em
+n2gy1es
+n2gyez
+n2gy1é2d
+ngy1éks
+ngy1ékt
+ngy1ér.
+n2gyid
+n2gyim
+n2gy1ut
+n2gy1ü2lő
+nha2b1i
+nhal1k2
+nha2sábr
+nhá2z1alt
+nhá2zip
+nhá2zol
+nhá2zó
+nhá2z3s
+nhe2d3z
+nhe2i
+nhú2sá
+nhús3s
+1ni
+ni2aa
+ni2aá
+ni2abo
+ni2ac
+ni2ad
+ni2ae
+ni2aé
+ni2afo
+nia1g2
+ni2agy
+ni2ah
+ni2aí
+ni2aj
+ni2ala
+ni2alá
+ni2am
+ni2ao
+ni2aó
+ni2aö
+ni2aő
+ni2a1p
+ni2ar
+ni2asza
+ni2aszá
+nia1t2
+ni2ato
+ni2atr
+nia3u
+ni2aü
+ni2av
+ni2az
+niát1a2
+2n1i2bo
+ni1br
+ni2c1e2l
+ni2cha
+ni2c3he
+ni2c3hé
+ni2c3ho
+ni2de.
+2n1i2deg
+2n1i2dő
+ni2dü
+ni2et
+2n1ifj
+2n1i2gal
+2nigaz.
+2n1i2gá
+ni2ge.
+ni2géj
+2n1i2gén
+ni2géz
+2nigm
+2n1ihl
+ni2keb
+ni2k1el
+ni2k1em
+ni2k1érté
+nikk2
+ni1klu
+ni2konr
+2n1ikrit.
+ni2kud
+n1ille
+2nillu
+2n1i2ly
+2nimád
+n1i2máé
+2n1imp
+2n1i2na.
+ni2nas
+ni2n1áll
+2nind
+2n1info
+2n1infú
+nin2gas
+nin2gá
+2n1inge.
+2ningei
+nin2g1e2l
+nin2g1ó2
+nin1g2rá
+nin2gu
+2n1ingük
+ni2n1i2p
+ni2nol
+2n1inté
+2n1i2onb
+ni2onc
+ni2onh
+ni2onj
+ni2onk
+2n1i2onn
+2n1i2ono
+2n1i2onr
+2n1i2ont
+ni2óa
+ni2ód
+ni2óe
+ni2óp
+ni2óta
+ni2ótá
+ni2óü
+nióvá2
+nip2p1i
+ni1pr
+ni2rat
+2nirá
+nirész1
+2n1irg
+2n1irh
+2n1irk
+2n1i2rod
+ni2rón
+ni2si.
+ni2s1in
+nisü2v
+nisz1ak
+ni2szeg
+ni2szeml
+ni2szese
+ni2sz1é2l
+ni2szip
+ni2szis
+nisz1okt
+nisz1ol
+2n1iszon
+ni2szö
+ni2sz1ő
+ni2szu
+ni2t1a2d
+ni2t1ag
+ni2t1aj
+ni2tal
+nit1a2la
+ni2t1as
+2n1i2tat
+nit1ell
+ni2t1ép
+ni2t1ér
+ni2tim
+ni2t1in
+ni2tir
+ni2tob
+nit1old
+nit1olt
+ni2t1osz
+ni2tür
+niu2m1i2o
+2n1i2vad
+2n1i2var
+2n1i2vó
+ni2xa
+ni2xő
+ni2zén
+2n1izg
+2n1izmá
+n1izom
+ni2zsol
+1ní
+ní2gé
+ní2ja
+ní2ju
+níli2a
+ní2ra2
+2n1í2rá
+ní2r1é2
+ní2r1ot
+2n1í2ró
+ní2r1ú
+2nítél
+nítőa2
+ní2ve
+2n1í2vi
+ní2ze
+ní2zű
+nk1a2dós
+nkai2k
+nk1ajt
+n2k1akk
+n2k1alv
+n2k1anó
+nka2nyá
+nkaó2
+nka1p2l
+nk1app
+nka2ris
+nka1s2k
+nka1sp
+nka2tom
+nka1t2r
+nk1azo
+n2k1ág
+nk1árad
+nká2rál
+nká2rol
+nká2ruk
+nká2sad
+nká2sal
+nká2sav
+nkás3s
+nká2s3z
+nkáta2
+n2k1átj
+n2k1átm
+n2k1áts
+n2k1átu
+nk1br
+nkci2ósű
+nk1dr
+nk1e2cse
+nk1e2dz
+nk1ela
+n2kellá
+n2k1eltá
+nke2r1a
+nk1ered
+n2k1e2rő
+n2k1e2ti
+n2k1e2vé
+n2k1é2l
+nké2p1el
+nké2p1és
+n2k1épí
+n2k1érc
+nk1é2szé
+nk1g2r
+nkia2
+nkiá2
+nk1i2ga
+n2k1igé
+n2k1imi
+nk1ind
+n2k1ing
+n2k1int
+n2kinz
+nk1i2on
+nki2s1i2
+nk1ism
+nkká2
+nk1k2r
+nk2lar
+n1k2ló
+n2k1ob
+nk1oke
+nkos3s
+n2k1oszl
+n2k1ox
+n2k1óné
+n2k1óni
+nkó1p2
+n2k1ó2ri
+n2k1ö2lé
+n2k1ö2lő
+nk1öss
+nk1ötl
+nk1őrs
+nk1pl
+nk1pr
+nk2rac
+n1k2ris
+n1k2rí
+nk2roma
+nkron1n
+nk1sp
+nk1st
+nk1sz2
+n2k1ud
+n2k1u2ra
+n2k1u2s
+nk1utal
+n2k1utá
+n2k1uz
+n2k1új
+n2k1ús
+n2k1üg
+nlac1
+nla2pa
+nlap1e
+nla2p1osz
+nla2tal
+nla2t1a2n
+nla2t1e2
+nla2t1é2te
+nlás3s
+nle2g1á
+nleí2
+nle2t1o
+nletü2
+nle2tüz
+nlé2tés
+nlé2t1é2ve.
+nme2g1a2
+nme2g1é
+nműé2n
+nműt2
+nna2ié
+nnak2
+nna1kr
+nn1alv
+nna1p2ré
+nna1s2
+nn1áll
+n2n1eml
+nne2p1a2
+nne2se
+nn1ess
+nn1esz
+n2n1e2tet
+n2n1ett
+nn1evez
+nné2get
+nn1éri
+n2n1id
+nn1irt
+nn1ors
+nnőé2h
+nnőé2n
+nn1sy
+n2n1ug
+nn1ú2s
+n2n1ü2c
+nnü2l
+nn1ülő
+nn1ült
+nn1ülv
+n2ny
+n3nyak
+n3nyalá
+nny1a2n
+n3nyar
+nnyá2r
+nny1áz
+n3nydr
+nny1ell
+n3nyelő
+nny1elt
+nny1elvá
+nny1elvez
+nny1e2sett
+nny1e2sés
+nny1e2ső
+nny1ég
+nny1é2ké
+nny1é2ki
+nnyié2h
+nnyié2ne
+nnyi2g
+nny1igé
+n3nyjé
+nny1old
+nny1on
+nny1öz
+n3nyst
+1no
+no1d2rá
+2n1o2dú
+2nog.
+2nogh
+2nogj
+2nogn
+2nogo
+2nogs
+2nogt
+2nogv
+no2ir
+2nokal
+nok1ala
+no2k1a2r
+no2kau
+no2k1ál
+no2k1é2l
+no2kép
+no2k1ing
+nok1ist
+nok1k2
+2n1okke
+2n1o2koz
+no2kö
+no2kő
+no1k2ro
+nok1s
+noksz2
+no2kur
+no2kúr
+no2kü
+2n1o2la
+nol1f2
+2n1o2lim
+2n1olló
+2n1o2ly
+no2m1a2c
+nom1p
+nona2
+no2n1al
+nonc3c
+non2ch
+nonc3sz
+no2n1e
+non1k2
+no2nö
+no2nő
+non1s2
+no1ny
+no2ok
+2n1o2pe
+no1p2la
+no2r1al
+no2r1a2t
+no2raz
+no2r1el
+no2r1iv
+no2rí
+2n1ormo
+2n1orré
+nor1s2
+no2rü
+2n1orvo
+no2sál
+no2se
+nossz2
+nos3sze
+nos3szf
+nos3szi
+no1s2tab
+nosza2u
+no1sz2f
+2noszl
+no1t2r
+2n1otth
+no1ty
+no2ui
+2n1o2vi.
+no2xi
+1nó
+nóa2k
+nóá2r
+nó2ce
+nó2ch
+nó2da.
+nó2d1a2n
+nó2dák
+nó2d1e2s
+nó2d1is
+nó1fl
+nó1fr
+nó1k2l
+nó2mac
+nó2m1em
+nó2mik
+nó2m1u2t
+nó2mü
+nó2nib
+nó2non
+nó1p2r
+n1ó2rac
+nó2r1ad
+n1ó2raf
+2n1ó2rai
+nó2r1a2l
+n1ó2rar
+n1ó2ras
+n1ó2rat
+nórádi2
+nó2rás
+nó2riá
+nó2rü
+nós1akk
+nó2seg
+nó1sl
+nó1s2p
+nó1s2rá
+nós3s
+nó1s2ta
+nó1sz2
+nós3zene
+nós3zené
+nót1ala
+nó2til
+nó1trá
+nó2vó
+1nö
+nö2ka
+nö2ká
+nö2k1el
+nöke2t
+nök1eti
+nö2k1é2j
+nö2k1ék
+nö2k1é2l
+nö2k1ér.
+nö2k1éri
+nö2k1érté
+nö2ko
+nö2kó
+nö2ku
+nö2kú
+n1ö2le
+n1ö2lé
+nö2lő
+n1öml
+2n1ö2nö
+2n1önz
+nö2rö
+2n1össz
+2n1ö2sz
+nö2te
+nö2té
+nö2ti
+n1ötl
+nöt1t2
+nö2tü
+2n1öv.
+n1övb
+n1ö2ve.
+nö2vön
+2n1övr
+2n1ö2zön
+1nő
+nőa2l
+nőa2n
+nőá2g
+nő1br
+nő2ca
+nő2ch
+nő2csár
+nő2csős
+nő2csü
+nőe2r
+nőé2l
+nőfé2l1é2
+nő1kl
+nő1pl
+nő1pr
+2n1őr.
+2n1ő2r1an
+2n1őras
+2n1őrb
+2n1őrc
+2n1ő2rei
+2n1ő2réh
+2n1ő2rén
+nő2rét.
+nő2rétő
+2n1ő2rév
+2n1őrg
+2n1őrh
+2n1ő2ri
+2n1őrk
+2n1őrl
+2n1őrn
+2n1ő2rö
+2n1őrr
+n1őrs
+2n1őrt
+2n1őrü
+nő2rül
+nő2rün
+2n1őrv
+2n1őrz
+nő2s1a2l
+nő2s1e2l
+nő2ses
+nő2s1í2r
+nő2sok
+nő1spe
+nős3s
+nő1sz2t
+nő1t2r
+nőt2tin
+nőu2t
+nőü2l
+npa2dal
+npe2s
+npesz1
+np2la
+np2lá
+np2le
+np2lé
+np2lo
+np2lü
+npon2t1a2
+npo2r1a
+np2ra
+np2re
+np2ré
+np2ri
+np2ro
+np2ró
+np2sz
+npu2t1a
+npu2t1á2
+npu2t1e2
+npu2t1i
+nrefle2x1í2
+nren2da
+n2s1a2d
+n2s1akc
+ns1alk
+ns1a2rá
+ns1ass
+n2s1au
+nsa2vár
+nsa2v1e2
+nsa2vil
+nsa2vol
+n2s1a2z
+nság1g
+ns1áll
+n2s1á2rak
+ns1áta
+ns1átv
+ns2ch
+nsc3he.
+nsc3hei
+nsc3hé
+ns1dr
+ns1e2lé
+ns1elm
+ns1eln
+ns1elo
+ns1els
+ns1elv
+n2s1ene
+n2s1esz
+nsé2gel
+nsé2g1éj
+nségü2két
+n2s1ék
+n2s1é2l
+n2s1ép
+ns1é2ve.
+ns1fr
+n2s1i2d
+ns1imp
+ns1inf
+n2s1ing
+n2s1iró
+ns1isk
+nsi2z
+ns1izo
+n2s1í2r
+n2s1í2v
+n1s2kál
+ns1kl
+n2s1ob
+n2s1ol
+n2s1op
+ns1osz
+n2s1ott
+n2s1ó2r
+n2s1ös
+ns2pec
+ns1p2l
+ns2por
+n1s2rá
+ns1st
+ns1sy
+ns3szer
+ns3szi
+ns3szo
+ns3szö
+n1s2tab
+n1s2tác
+nste2i
+n1s2tim
+ns2top
+nsu2r
+ns1ura
+n2s1u2t
+ns1úr
+n2sz1a2d
+nsza2k1ü
+nsz1alk
+n2sz1a2n
+ns3zará
+n2sz1á2ba.
+ns3zárá
+nsz1á2ru
+n2sz1it
+n2sziz
+n2sz1omm
+nsz1p2
+n2szut
+n2sz1ü2z
+nsz1z
+nt1abla
+n2t1abr
+nta2cél
+ntad2
+nt1a2dó
+nt1a2ga.
+n2t1agg
+nta2gyu
+nta2gyú
+ntai2k
+n2t1ajk
+n2t1ajt
+n2t1akc
+n2t1aktá
+nt1alát
+nt1alel
+n2t1alf
+nt1anta
+nt1a2ra.
+nta2ran
+n2t1a2rá
+n2t1arc
+n2t1ark
+nta1s2p
+nt1assz
+n2t1aty
+nt1a2ura
+ntaü2
+n2t1azo
+nt1ábr
+ntá2cs
+nt1ácsi
+nt1ácso
+ntá2r1a2d
+n2táram
+ntá2ráv
+nt1árny
+ntá2ruk
+n2t1ásó
+n2t1ásvá
+n2t1áti
+n2t1átl
+n2t1átr
+n2t1áts
+n2t1átv
+ntá2zsi
+nt1bl
+nt1br
+nt1dr
+nt1ebe
+n2tedén
+nt1edi
+nte3gá
+n2t1ela
+n2t1elb
+ntele2mé
+nt1elf
+n2t1eljá
+n2t1elk
+n2t1ellen
+n2telmél
+n2telnö
+n2t1e2lo
+nte2lőá
+n2t1elr
+n2t1elto
+n2t1elvá
+n2t1elz
+n2t1ember
+n2t1e2mel
+n2t1eml
+n2t1emu
+n2t1endr
+n2t1ent
+nte2rál
+nte2rele
+nte2r1in
+nter2v1e2l
+n2t1erz
+n2t1esth
+n2t1eszk
+n2t1eva
+nt1e2vet
+nt1e2vez
+nt1ég.
+nt1é2gé
+n2t1é2kek
+nté2kes
+nté2ké
+n2t1éks
+n2t1é2le
+n2t1é2lés
+n2t1élm
+n2t1élt
+nt1élű
+n2t1é2neke
+n2t1épü
+n2t1érin
+n2t1érmé
+n2t1érté
+n2t1érz
+ntés3s
+nté2ter
+n2t1é2ven
+n2t1é2vet
+n2t1é2véb
+n2t1é2vén
+n2t1é2vér
+n2t1é2vét
+nt1évh
+nt1évk
+nt1évt
+nt1fl
+nt1fr
+nt1gr
+nt2hon
+ntia2n
+ntia2t
+nt1ido
+n2t1ige
+nti1k2l
+ntil2lát.
+n2t1ille
+n2t1imp
+n2t1info
+n2t1ing.
+n2t1inga
+nti1nk.
+n2t1inté
+ntió1
+nti2par
+n2t1irá
+n2t1iro
+n2t1isk
+n2t1ism
+n2t1iste
+nti2vás
+nt1izo
+n2t1íg
+n2t1íj
+nt1írá
+n2t1ívb
+n2t1í2z
+nt1kl
+nt1kr
+n2t1of
+ntoka2
+n2t1o2k1al
+n2t1okl
+n2t1olda
+n2t1oldó
+n2t1o2ly
+nto2m1e2
+nt1opc
+nto2ras
+nto2rék
+nto2rin
+nt1ormá
+nt1orro
+n2t1oszl
+n2t1oszt
+n2t1otth
+ntó1p
+n2t1ó2rá
+n2t1ó2ri
+ntót2
+ntó1tr
+nt1ökl
+nt1ö2kö
+nt1ö2lő
+nt1önt
+n2t1örd
+ntőa2
+ntőé2n
+nt1őrb
+nt1őrl
+nt1őrn
+n2t1őz
+nt1pl
+nt1pr
+nt2rans
+ntransz1
+ntranszk2
+n1t2réf
+n1t2róf
+nt1ry
+nt1sh
+nt1sk
+nt1sp
+nt1st
+ntsz2
+ntszá2m1é
+nt1szv
+nt1t2r
+n2t1udv
+n2t1ug
+n2t1uj
+ntu2mor
+ntu2n
+n2t1una
+nt1und
+ntun1i
+nt1u2rá
+ntu2sza
+nt1utá
+n2t1úg
+n2t1új
+ntú2ral
+ntú2ran
+nt1ú2sz
+n2t1üg
+n2t1ü2lő
+nt1ült
+n2t1üt
+n2t1ü2v
+n2ty1a2l
+n2ty1a2n
+n2tyál
+n2ty1e2l
+n2ty1él
+n2ty1ik
+n2ty1int
+n2ty1iv
+n2tyí
+n2ty1ő2r
+n2tyut
+1nu
+n1ucc
+nu2ga
+nu2go
+2n1ujj
+nu1k2la
+nu1klu
+nu2mü
+2n1und
+2n1u2ni
+2n1u2no
+2n1unt
+nu2ram
+nu2rá
+nu2sal
+nu2sas
+nu2s1av
+nu2s1e
+nu2s1érté
+nu2sik
+nu2sol
+nu1s2po
+nuss2
+nus3szi
+nu2szab
+nu2s3zav
+nu2szir
+nu2szí
+nu2sz1ol
+nu2tal
+nu2tat
+nu2taz
+nu2tál
+nu2te
+1nú
+n1újd
+nú2jí
+2n1újs
+núkész1
+nú1pr
+2n1úr.
+2n1úrb
+2n1úrh
+2n1úrn
+2n1úrr
+2n1úrt
+2n1ú2szá
+2nútb
+2núth
+2nútj
+2n1útk
+2n1útn
+2nútr
+2n1úts
+2nútt
+2n1útv
+1nü
+nü1bl
+2n1ü2dí
+2n1üdv
+nü1fr
+2n1ügg
+nü1gr
+2n1ügy.
+2n1ügyb
+2n1ügyc
+2n1ü2gye.
+2n1ü2gyei
+2n1ü2gyek
+2n1ü2gyes
+2n1ü2gyet
+2n1ü2gyé
+nügy1és
+2n1ügyh
+2n1ü2gyi
+2n1ügyk
+2n1ügyl
+2n1ügyn
+2n1ügyr
+2n1üld
+nü1pr
+nü2rí
+nüst2
+nü1str
+2n1ü2tem
+nü2tés
+nü2ti
+nü2tő.
+nü2tők
+nü2tős
+nü2tü
+nü2vö
+nü2zé
+2n1üzl
+1nű
+nű2zé
+nű2ző
+nva2su
+nvágya2d
+nvá2gy1ada
+nvá2gy1ón
+nvá2r1al
+n2v1át
+nven2ta
+nvé2d1a
+nvé2d1ő2r
+nv1ind
+nvona2l1út
+n2v1os
+nv1sk
+nx1ar
+n2y
+1nya
+2ny1abl
+2ny1abr
+nya2cél
+2ny1adag
+2nyadás
+2nyadó
+nya2dóz
+2nyaff
+nya2gar
+2nyagáh
+2nyagár
+2nyagáv
+2nyagc
+nya2gen
+2nyagi
+2nyagj
+2nyagm
+2nyagos
+2nyagta
+2nyaguk
+2nyagú
+2nyaján
+2nyajk
+2nyajt
+3nyak.
+nya2k1ala
+nya2kara
+2nyakc
+nya2kel
+nya2k1é2k
+nya2kiz
+2nyakt.
+2nyaktá
+2nyaktb
+2nyakti
+2nyaktj
+2nyakto
+2nyaktu
+2ny1a2lag
+2ny1a2lak.
+2nyalakj
+2nyalakk
+2ny1a2lakr
+2nyalany
+nya2lapb
+nya2laph
+nya2lapo
+nya2lapp
+nya2laps
+2ny1alász
+2ny1alb
+ny1alép
+2ny1alm
+ny1alte
+2nyaltú
+2nyamal
+2nyanal
+2nyang
+2ny1ant
+2nyaot
+ny1a2pad
+nya2pát
+2nyapp
+nya2rén
+2ny1arma
+2ny1arz
+nya1sp
+2nyassz
+2nyaszt
+2nyatká
+nya1trá
+2nyaty
+2nyauk
+2nyavat
+1nyá
+2nyábr
+2nyádná
+2nyádt
+2nyáék
+2ny1ág
+2nyáld
+2nyállí
+nyá2lom
+2nyámék
+2nyámná
+2nyáp
+2ny1á2rad
+2ny1á2rai
+2ny1á2rak
+2ny1á2ram
+2nyáras
+2ny1á2rat
+nyá2ráb
+nyá2rán
+nyá2rát
+nyá2ráv
+2nyárc
+2nyáre
+2nyárh
+2ny1árj
+2nyárk
+2nyárp
+3nyárt.
+2nyá2ru
+2nyárú
+2nyárv
+2nyásó
+nyá2szak
+nyá2szár
+2nyáta
+2nyátá
+2nyáté
+2nyátf
+2nyáth
+2nyátk
+2nyátm
+2nyátn
+2nyátö
+2nyátr
+2nyáts
+2nyátt
+2nyátü
+2nyátv
+ny1bl
+ny1br
+ny1cv
+1nydre.
+1nye
+2nyedén
+2nyedzé
+2nyeff
+2nyegyl
+2nyegys
+2nyeke.
+2nyekei
+2nyekéé
+2ny1elb
+2nyelc
+2nyelef
+2nyelemz
+2ny1elf
+ny1elha
+2nyeljá
+ny1elk
+2ny1ellá
+ny1elma
+2nyelnö
+2nyelőí
+2ny1e2lőő
+2nyelőz
+2ny1elr
+2nyelső
+2ny1eltá
+2nyeltér
+2nyelto
+2ny1elül
+nyel2vesz
+2nyelvev
+2nyember
+2nyembl
+2nyembr
+2nyemel
+2ny1emit
+2ny1eml
+2nyenc
+2nyene
+2ny1eng
+nye1p
+2nyerdő
+2nyerej
+nye2rekl
+2ny1erk
+2nyerny
+2nyerőm
+2ny1esemé
+ny1eser
+2nyeseté
+2nyesél
+2nyestj
+2nyeszk
+2nyetik
+2nyeve
+nye2vez
+2nyevé
+2nyevo
+2nyevő
+2ny1ex
+2nyezr
+2nyezüs
+1nyé
+2ny1ébr
+2nyéhen
+2nyéhes
+2nyéhs
+ny1é2jek
+2nyélet
+2nyélm
+2nyéneke
+2ny1é2neké
+2ny1é2nekn
+2ny1ép
+2nyérc.
+2nyérem.
+nyé2r1e2s
+2nyérin
+2nyérő.
+2nyérői
+2nyérőt
+2nyérték
+nyérü2
+2nyérv.
+2nyérzé
+2nyétel
+2nyétke
+2nyétl
+2nyév.
+2nyévb
+2nyéve.
+2nyévei
+2nyévek
+2nyévem
+2nyéven
+2nyéves
+2nyévet
+2nyévez
+2nyévéb
+2nyévér
+2nyévét
+2nyévév
+2nyévf
+2nyévi
+2nyévk
+2nyévm
+2nyévn
+2nyévr
+2nyévs
+2nyévt
+2nyévü
+2nyévű
+2nyévv
+ny1fl
+ny1f2r
+ny1gl
+ny1gr
+1nyi
+2nyibo
+2nyideg
+2nyidej
+2nyidő
+nyié2b
+2nyifjú.
+2nyifjúb
+2nyifjúé
+2nyifjúi
+2nyifjúké
+2nyifjún
+2nyifjúr
+2nyifjús
+2nyifjút
+2nyifjúv
+2nyiga
+2nyiha
+2nyihl
+2ny1ill
+2ny1ima
+2nyimá
+2ny1imb
+2nyimp
+2nyinas
+2nyinc
+2nyind
+2nyinf
+ny1ing.
+2nyinj
+2nyins
+2ny1int
+2nyinv
+2ny1i2p
+2nyirá
+2nyiri
+2nyirod
+2nyirt
+2nyisko
+2nyism
+2nyisp
+2nyist
+2nyivad
+2nyivás
+2nyivó
+2ny1izn
+2ny1izt
+1nyí
+2ny1íg
+2ny1íj
+3nyíl
+2ny1ín
+2ny1ív
+2ny1íz
+1nyjéb
+3nyk.
+nykar1óra
+1nyket.
+1nykk
+ny1kl
+1nykn
+ny1k2r
+ny1k2v
+1nym.
+1nymet.
+1nymt
+1nyn.
+1nyo
+2ny1ob
+2nyodú
+2ny1of
+2ny1okke
+2ny1okl
+2nyokos
+2nyokoz
+2nyokta
+2ny1o2laj
+nyolc1c
+2ny1olda
+2nyoldá
+2nyoldó
+ny1olló
+2ny1oltár
+2nyoltás
+2nyolvas
+3nyom.
+3nyomat.
+3nyomatk
+3nyomatom
+3nyomo
+3nyomt
+2ny1op
+ny1orc
+ny1orm
+ny1ors
+ny1orv
+2ny1osko
+2nyosto
+2nyoszl
+2nyoszt
+2ny1ott
+2ny1ov
+2ny1ox
+1nyó
+ny1ó2ni
+nyó2rác
+nyó2rán
+2nyóri
+nyó2s1ü
+1nyö
+2ny1öb
+2ny1öc
+2ny1ö2l
+ny1önt
+2ny1öv
+1nyő
+2nyőrs
+ny1pl
+ny1pr
+ny1ps
+3nys.
+ny1sc
+3nysek
+ny1sh
+ny1sk
+ny1sl
+ny1sp
+nys2t
+1nyst.
+ny1sta
+ny1stá
+1nyu
+2nyud
+2nyuj
+2nyuká
+2ny1ukrá
+3nyul
+2nyuni
+2nyuno
+ny1urá
+2nyut
+ny1u2ta
+ny1u2tá
+1nyú
+2nyújd
+2nyújé
+2nyújí
+2nyújs
+3nyúl
+nyú2lő
+2ny1úr.
+2nyúrb
+2ny1úrh
+2nyúri
+2nyúrk
+2ny1úrn
+2ny1ú2ro
+2nyúrr
+2ny1ú2sz
+2nyútb
+2ny1úté
+2nyúth
+2ny1úti
+2nyútj
+2nyútk
+ny1útl
+2nyútm
+2nyútn
+2nyútp
+2nyútr
+2nyútt
+2nyútv
+1nyü
+2ny1üd
+2ny1ü2g
+2ny1üld
+ny1üle
+2nyünn
+2ny1ür
+2ny1üt
+2nyüze
+1nyű
+2ny1űr.
+2nyűrb
+2ny1űré
+2ny1űrh
+2ny1ű2ri
+2ny1űrj
+2ny1űrl
+2ny1űrn
+2ny1ű2rö
+2nyűrr
+2ny1űrt
+2ny1ű2zé
+2ny1ű2ző.
+2nyűzőb
+2nyűzően
+2nyűzőé
+2nyűzőh
+2nyűzők
+2nyűzőn
+2nyűzőr
+2nyűzőt
+2nyűzőv
+ny2vék
+ny2v1isk
+ny2vó
+ny2vös
+ny2vő
+ny2vú
+nyzé2ke
+nza2c
+n2z1acé
+nz1adá
+nz1ado
+nz1adó
+nz1a2ga
+nz1agg
+nz1ajta
+nz1akc
+nz1akk
+nzak2o
+n2z1akt
+nz1ald
+n2z1alk
+nz1ang
+n2z1a2ny
+nz1app
+nz1ara
+nz1ará
+nz1arc
+nz1ari
+nz1aut
+nz1á2gy
+nz1áll
+n2z1á2rad
+nz1árny
+nzá2r1ó2ra
+n2z1á2ru
+nzá2s1e2
+nz1ásó
+nzás3s
+nz1át1a2
+nz1d2r
+n2z1e2g
+n2z1elb
+n2ze2leme
+n2z1e2lér
+n2z1elf
+n2z1elha
+n2z1elis
+n2z1elk
+n2z1ellá
+nz1ellen
+n2z1elm
+n2z1elny
+n2z1elo
+n2z1e2lőá
+n2z1e2lől
+n2z1e2lőt
+n2zelőz
+n2z1els
+n2z1elta
+n2z1eltü
+n2z1elver
+n2z1elvé
+n2z1elvo
+nz1ember
+n2z1e2mel
+nz1e2més
+n2z1emi
+nz1eml
+n2zener
+nz1erő
+nzer2t1a2
+nzer2v1a2d
+nzervé2t
+nzer2v1éte
+nzer2vi
+nze2su
+nz1eszk
+n2z1ez
+n2z1ég
+nzé2k1el
+n2z1é2l
+n2z1ér.
+n2z1érd
+n2z1é2rem
+n2z1érk
+n2z1érm
+n2z1érté
+n2z1érv
+n2z1érz
+nz1étv
+nz1gr
+nzi2a
+n2z1i2ga
+n2z1igé
+n2z1ill
+nzi2m1a2
+nzi2má
+nzi2mi
+nzi2n1á2
+nzi2n1o
+nzi2n1ó2
+n2z1i2p
+nz1irá
+nz1ism
+n2z1ist
+nzi2tár
+nzite2
+nzi2t1el
+nzi2ten
+nzi2t1í2ve.
+n2z1íb
+nz1íg
+nz1ín
+nz1kl
+nz1kr
+n2z1okl
+nzo2lin
+nzo2ló
+nzo2n1a
+nzo2né
+nzo2rin
+n2z1osz
+nzókész1
+n2z1ön
+nzö2r
+nz1örö
+n2z1ös
+n2z1ö2v
+n2z1öz
+nz1pl
+nz1pr
+nz3saj
+n2z3sár
+n2z3sát
+n2zsáv
+nz3seg
+n2z3ser
+nz3sik
+n2z3sis
+n2z3sod
+nz3sor
+n2z3só
+nz3s2p
+nz3s2t
+nz3sz
+nztá2r1a2d
+nz1t2r
+n2z1uj
+nzu2l1a
+nzu2mé
+nz1u2ra
+nzu2san
+nzus3s
+n2z1u2t
+nz1új
+nz1ú2t
+n2z1üd
+n2z1ü2g
+nz1üs
+nz1üv
+n2z1ü2z
+nz3zs
+2o.
+o1a
+oa2cé
+oa1fr
+o2aki
+o2a1k2v
+o2ami
+oa2nali
+o2asi
+o2aszó
+o1á
+oá2ga
+oá2r1a2n
+oá2ril
+oá2rí
+oá2r1ol
+oá2zs
+oba1b2
+oba1d2
+o2b1alj
+obal2t1a2
+oba1p
+ob1a2ra
+obau2
+obás3s
+ob1átm
+ob2b1eg
+ob2bö
+o2b1eg
+ob1ele
+o2b1e2m
+o2b1erő
+o2b1ez
+o2b1é2g
+o2b1érz
+obi2ki
+obi2k1ó2
+obi2lin
+obi2lip
+obina2
+ob1ina.
+obi2n1al
+o2b1ing
+o2b1i2s
+ob1ív
+1objek
+ob1kl
+1o2boa
+o2b1oll
+obo2r1a
+obo2rin
+obo2r1os
+obo2t1á2
+obo2tin
+obókész1
+o2b1ó2né
+ob1ó2rá
+ob1öt
+ob1pr
+1obst
+o2b1ut
+o2b1ú2s
+ob1üg
+ob1ür
+ob1üt
+ob1űr
+oca2ké
+o2c1ág
+o2c1ál
+oc1er
+oc1é2k
+o2c3hi.
+oc3hok
+oc3hot
+oci3a
+ocie2
+oci1k2r
+oció2
+oci1p
+oci1sz2
+o1c2kef
+oc2k1é2l
+ocké2n
+ock1éne
+o1c2kér
+o1c2két
+o1c2ki.
+oc2kia
+o1c2kig
+o1c2kin
+o1c2kit
+o1c2kiv
+oc2kop
+o1c2kosn
+o1c2koso
+o1c2kosr
+o1c2koss
+oc1pr
+o2c3sap
+o2cs1ál
+ocsá2s
+o2cs1ász
+o2cs1á2z
+o2cs1e2
+oc3sér
+ocsié2ra
+o2cs1ing
+ocs1izm
+o2csí2
+oc3sín
+o2csop
+ocs1s
+ocs1t
+o2csuj
+o2cs1ü2
+oc3sza
+ocs3zá
+oc3sze
+oc3zs
+o2daad
+oda1b2
+o2d1adj
+oda1dr
+o2d1akk
+o2d1alj
+oda1p2
+odas2
+o2d1ass
+od1aszt
+odat2
+oda1tr
+od1autó
+odáb2
+od1állá
+o2dáru
+odáskész1
+odás3s
+odá2s3z
+1o2dáz
+od1ed
+ode2l
+odel2l1a
+ode2min
+od1e2v
+o2d1é2g
+od1é2ne
+o2d1ép
+o2d1érd
+o2d1é2te
+o2d1é2ve
+od1é2vé
+2odéz
+od1ide
+odi2g
+o2d1iga
+o2d1ikre
+odi2l1e
+odi2lid
+odi2lik
+odi2l1is
+o2d1int
+o2d1iro
+od1isp
+od1í2z
+od1kl
+od1obo
+o2d1okt
+o2d1op
+odo2rak
+odo2rosz
+od1ö2l
+od1ö2r
+od1ő2r
+od1pr
+o1d2ram
+o1d2ráma
+od1st
+odu2l1a2l
+o2d1u2r
+1odún
+od1üg
+od1ün
+od1üz
+1odváb
+od3ze
+od3zo
+o1e
+oe2ir
+oe2le
+oe2mu
+oe2ne
+oe1t2he
+oe2ur
+oe2uv
+o1é
+o2éfa
+o2éfá
+o2éfo
+o2éke
+o2éki
+oéna2
+oé2n1al
+oé2n1an
+oé2n1ar
+oéná2
+oé2n1ár
+oé2nis
+o2ész
+o2évi
+ofi2lad
+ofi2lak
+ofi2l1á
+ofi2lel
+ofi2lér
+ofili2
+ofi2l1iga
+ofi2l1igá
+ofi2lis
+ofi2l1osz
+ofi2tal
+ofi2t1e2
+of2la
+of2ló
+ofona2
+ofo2n1al
+ofo2nan
+ofo2n1á
+ofo2n1ér.
+ofon3n
+ofo2n1ó2
+ofor2m1á2
+ofő2r1e
+ofőrü2
+of2rí
+og1abr
+o2g1a2g
+oga2kar
+o2g1aká
+o2g1a2la
+o2g1a2lá
+o2g1alj
+og1all
+og1alt
+og1alu
+o2g1a2ny
+o2g1ap
+o2g1a2ran
+og1arc
+o2g1a2sz
+oga2t1a2g
+oga2t1e2
+oga2t1i2n
+og1a2ty
+2ogaz
+o2g1á2g
+og1áll
+og1álm
+o2g1áp
+o2g1á2rak
+o2g1áre
+o2g1árja
+o2g1árját
+o2g1á2rok
+ogá2ros
+o2g1á2ru
+ogáskész1
+o2gásó
+o2g1áta
+o2g1áte
+o2g1átj
+o2g1átk
+o2g1átl
+o2g1átn
+o2g1á2to
+o2g1átr
+o2g1áts
+o2g1átt
+og1átü
+o2g1átv
+og1bl
+ogdí2j1a2d
+og1dr
+o2g1e2d
+o2g1e2g
+ogegész1
+o2g1e2l
+o2g1em
+o2g1e2p
+oge2r
+og1ere
+og1ern
+og1erő
+oge2s
+o2g1ese
+o2g1e2v
+o2g1ez
+o2g1é2g
+o2g1é2l
+ogén1n
+o2g1é2p
+o2g1ér.
+og1érte
+og1érté
+o2g1értő
+o2g1érv
+o2g1és
+og1fl
+og1fr
+og1g2l
+o2g1ic
+o2g1i2d
+o2g1if
+ogi2g
+o2g1iga
+o2g1igé
+o2gill
+og1inf
+o2g1ing
+og1ins
+o2g1int
+o2g1ip
+og1i2ro
+og1ita
+o2g1íj
+og1ín
+og1ír
+og1ív
+og1kl
+og1kr
+o1g2lic
+o1g2nai
+o2g1odv
+og1org
+og1orr
+og1orz
+o2g1oszl
+o2g1oszt
+o2g1o2v
+og1ö2b
+og1ö2l
+og1ö2r
+og1ös
+og1ő2r
+og1pl
+og1pr
+2ografi
+2ograp
+2ográf.
+2ográff
+o1g2ráffa
+o1g2ráfh
+o1g2ráfj
+o1g2ráfr
+o1g2rál
+og1sk
+og1sp
+og1s2t
+og1tr
+og1u2ra
+og1u2ru
+o2g1u2s
+o2g1u2t
+o2g1új
+og1ü2g
+og1ül
+og1ür
+og1üt
+og1üz
+og1űz
+ogy1a2c
+ogy1a2p
+ogy1is.
+ogy1os
+ogyóé2
+oha2mal
+oha2mel
+oha2mes
+oha2mis
+ohas2
+oha1sp
+o2h1ág
+o2h1ál
+ohá2nyad
+ohá2nyan
+ohá2r1e
+ohá2szi
+ohá2sz1odv
+o2h1á2z
+oh1e2c
+oh1ing
+oh2ni
+o2h1orr
+ohó2csi
+oh1órá
+oh1ö2v
+oh1urá
+o1i
+oi2ae
+oi2af
+oi2an
+oi2av
+oi2ába
+oida1
+oi2d1ad
+oi2dan
+oi2dál
+oi2d1e2
+oi2dol
+oi2d3z
+oilet2
+oina2
+oi2n1ad
+oi2ne
+oi2re
+oisel2
+oi2zo
+o1í
+ojá2r1as
+ojás3s
+ojás3z
+ojek2t1á2
+ojek2t1í2
+ojek2t1o2
+oj1in
+oj2t1ára
+oj2t1orják
+ojtóá2
+ok1abl
+ok1a2cé
+o2k1a2dat
+o2k1a2dá
+o2k1a2dó
+o2k1a2kar
+ok1akv
+o2k1alj
+o2k1alk
+ok1alm
+ok1alt
+ok1ang
+ok1ani
+ok1ant
+oka1p2l
+ok1app
+ok1a2ra
+ok1arc
+oka2ris
+o2k1asp
+o2k1ass
+ok1aszf
+ok1aszt
+o2k1att
+o2k1aty
+oka2u
+ok1aut
+o2k1ava
+o2k1ág
+ok1ájt
+ok1árad
+o2k1á2rak
+oká2rul
+o2k1árv
+oká2sal
+ok1ásó
+okás3s
+ok1ász
+o2k1áte
+ok1bl
+ok1br
+ok1dr
+o2ke.
+ok1e2b
+o2k1e2c
+oke2d
+ok1edé
+o2k1e2g
+o2k1e2l
+o2k1e2m
+ok1eré
+ok1erk
+ok1ernel.
+ok1e2rő
+o2ke2s
+ok1esé
+o2k1e2v
+ok1e2z
+o2k1ég
+ok1é2ke
+ok1é2ké
+o2k1él.
+ok1é2les
+ok1é2let
+ok1é2lé
+ok1éln
+ok1élt
+o2k1é2ne
+oké2p
+oké3pá
+ok1épí
+o2k1épü
+o2k1ér.
+o2k1érb
+o2k1érc
+o2k1érd
+o2k1érg
+o2k1érh
+o2k1é2ri
+o2k1érm
+o2k1érr
+ok1értá
+o2k1érte
+o2k1érté
+ok1értö
+o2k1érz
+oké1s2
+okész2
+o2k1étk
+o2k1étt
+o2k1é2ve
+ok1fl
+ok1fr
+ok1gr
+o2k1i2de
+o2k1i2do
+ok1i2ga
+okigaz1
+ok1igá
+o2k1igé
+ok1ind
+o2k1int
+o2k1i2rá
+o2k1i2ro
+o2k1isk
+ok1ism
+o2k1isp
+ok1iste
+o2k1i2ta
+o2k1izm
+ok1íj
+ok1ír
+ok1ív
+ok1íz
+ok2kab
+ok2k1a2d
+ok2k1aj
+ok2k1ale
+okk1alk
+ok2k1as
+ok2kaz
+okk1elh
+okk1elö
+okk1elő
+okk1elr
+1okkeré
+ok2k1es
+ok2képü
+ok2kid
+ok1kló
+ok2kob
+okk1öss
+okk1ö2vű
+ok1kri
+ok2kud
+ok2k1ur
+o1k2lí
+ok2lor
+o2k1ob
+okola2
+oko2lár
+o2k1oltás
+okon1n
+oko2n1oks
+oko2ra
+oko2r1á
+oko2ril
+oko2ris
+o2k1ormú
+ok1o2ro
+o2k1osz
+ok1o2varia
+o2k1o2vi
+o2k1öb
+o2k1ö2d
+ok1ö2k
+o2k1öl
+o2k1ön
+okö2r
+o2k1ös
+o2k1ö2v
+ok1ö2z
+ok1ő2r
+ok1pl
+ok1pr
+o1k2ris
+o1k2róm
+ok2sel
+ok1sp
+oksz1alm
+ok2szan
+ok2sz1es
+ok2sz1is
+1oktán
+o2k1ud
+o2k1ug
+o2k1uj
+ok1u2ra
+o2k1u2t
+ok1úr.
+ok1úrb
+ok1úrh
+ok1úrr
+ok1úsz
+o2k1útb
+o2k1úth
+o2k1ú2ti
+o2k1útj
+o2k1útk
+o2k1útn
+o2k1útr
+o2k1útt
+ok1útu
+o2kútv
+ok1üg
+ok1ü2l
+ok1ün
+ok1ür
+ok1ü2t
+ok1ü2v
+ok1üz
+ok1űz
+o3la.
+ol1abl
+ola1d2
+ola1f2
+1o2laj.
+1o2lajb
+1o2lajf
+1o2lajg
+1o2lajh
+1o2laji
+1o2lajj
+1o2lajk
+1o2lajm
+1o2lajn
+1o2lajp
+1o2lajr
+1o2lajs
+o2lajt
+o2laju
+1o2lajú
+o2lajv
+ola1k2r
+o2l1alg
+ol1alk
+ol1amn
+ol1anya
+ola1p2
+ola1s2p
+ola1s2t
+ola2t1ala
+olat1any
+ola2tál
+ola2táp
+ola2ték
+ola2t1inf
+ola2t1í2v
+ola2t1ol
+ola2t1orn
+ola2t1öl
+ola2tüz
+olau2r
+ol1ábrá
+o2l1á2g
+olá2ha
+ol1áll
+o2l1árb
+o2l1árh
+o2l1á2ria
+olá2riá
+o2l1árk
+o2l1árn
+olá2rok
+olá2ron
+o2l1árr
+o2l1árt
+o2l1á2ru
+olá2sza
+o2l1á2ti
+o2l1átv
+ol2caj
+ol2cal
+olca2n
+olc1any
+ol2c1e2k
+ol2cel
+ol2ces
+ol2c1év
+ol2c3h
+olc1iko
+ol2cí
+ol2có
+ol2cö
+ol2c3sor
+ol2csű
+olc3sz
+ol2cü
+ol2cz
+ol2dab
+1oldal.
+1oldalá
+1oldalb
+olda2le
+1oldalh
+1oldalk
+1oldall
+1oldaln
+1oldalo
+1oldalr
+1oldalt
+1oldalu
+1oldalú
+ol2d1any
+ol2dap
+olda2tel
+ol2d1au
+ol2dál
+ol2deg
+ol2d1elé
+ol2d1ell
+ol2d1elv
+old1emb
+ol2d1e2r
+ol2d1e2s
+ol2dev
+ol2dez
+ol2dés
+ol2d1éve
+ol2dip
+ol2d1is
+ol2dor
+1oldós
+ol2d1ö2
+ol2dud
+ol2d1u2g
+ol2d1ü
+ol2dű
+ol1e2g
+o2l1e2l
+o2l1é2d
+o2l1é2g
+o2l1él
+ol1ér.
+ol1érd
+ol1é2re
+ol1éré
+ol1érh
+ol1é2ri
+ol1érj
+ol1érl
+ol1érn
+ol1érő
+ol1érs
+o2l1érté
+ol1é2rü
+ol1érv
+o2l1érz
+olfa2k
+ol2fau
+ol2f1ár
+ol2fes
+ol2fet
+olf1ing
+ol2fir
+ol2fis
+olfu2
+ol2f1ut
+ol2fúj
+ol1gl
+ol1g2r
+2olib
+o2l1i2du
+1o2liga
+oli2gáz
+o2l1igé
+ol1ill
+ol1i2ma.
+o2l1i2má
+1olimp
+oli2nu
+o2l1i2pa
+olipe2
+oli2p1et
+o2l1isk
+oli2szál
+ol1ív.
+oll1a2gy
+ol2l1aj
+olla2l
+ol2l1ala
+ol2l1alj
+ollan2d1ó2
+oll1any
+ol2l1atk
+oll1att
+ol2l1á2g
+ol2l1e2c
+oll1ege
+oll1egé
+ol2l1e2gy
+ol2l1e2h
+olle2l
+oll1ele
+ol2l1emb
+oll1ese
+ol2l1é2k
+ol2l1éri
+ol2l1inf
+oll1inge
+oll1ingé
+oll1ingi
+oll1ingj
+oll1ingn
+oll1ingr
+oll1inj
+ol2lins
+ol2l1int
+oll1isk
+ol2lob
+ol2lor
+ol2l1osz
+ol2l1ö
+ol2l1ő2
+oll1s
+ol2lub
+ol2lul
+ol2l1u2s
+ol2lü
+ol3lyu
+oln1ike
+o2l1o2l
+o2l1op
+olo2r1e
+ol1ott
+o2l1ox
+olóe3dénn
+oló1f2
+o2l1ó2né
+ol1ónn
+ol1ó2no
+ol1ónr
+ol1ónt
+oló2rái
+oló2ráj
+oló2rák
+oló2rán
+oló2rár
+oló2rát
+ol1ó2ri
+olót2
+oló1tr
+ol1ö2l
+ol1ör
+ol1ös
+ol1p2l
+ol1p2r
+ol1sk
+ol2t1aj
+1oltalm
+1oltalo
+ol2t1ari
+ol2t1ág
+ol2t1áta
+ol2t1eg
+ol2t1em
+olte2r
+ol2t1ere
+olte2s
+ol2t1e2v
+ol2t1ép
+ol2t1ér.
+ol2t1érr
+ol2t1és
+ol2tid
+ol2tim
+ol2tis
+ol2tiz
+ol2t1old
+1oltóé
+1oltóh
+1oltóké
+1oltólo
+1oltóm
+1oltón
+oltö2r
+ol2t1őr
+ol2tür
+o2l1ug
+o2l1ur
+o2l1u2tá
+ol1ús
+ol1üg
+ol1ül
+ol1üv
+ol1üz
+1olvad
+1olvas
+o2lyabr
+oly1ada
+oly1aggy
+olyame2
+olya2mes
+oly1aszt
+o2lyál
+o2ly1e2
+1o2lyéb
+1o2lyéh
+1o2lyéi
+o2lyél
+1o2lyén.
+1o2lyiér
+o2lyim
+2olyó
+o2ly1ö
+o2lyő
+o2lyug
+o2ly1ü2
+o2ly1ű2
+o2m1abl
+om1a2dat
+o2m1adm
+o2m1a2dó
+o2m1adt
+oma1f
+omaga2
+oma2ga.
+oma2g1ad
+oma2gal
+oma2g1á2
+oma2ge
+omagi2
+oma2g1in
+o2m1a2gya
+om1agyú
+o2m1ajá
+o2m1ajk
+oma1kré
+o2m1akt
+om1a2lag
+oma2lapo
+oma2lapr
+o2m1alm
+om1alt
+om1alv
+o2m1amb
+om1ang
+o2m1ann
+om1apad
+o2m1app
+oma1pr
+o2m1a2ra
+o2m1arc
+o2m1arg
+oma2t1árak
+o2m1atká
+o2m1aty
+o2m1au
+om1a2zo
+omá2cs
+omá2g
+om1ági
+om1ágo
+omá2nyan
+ományká2
+o2m1áp
+o2m1á2rai
+om1á2rak
+om1á2ram
+om1áras
+o2m1á2rá
+o2m1árd
+o2m1áre
+omá2ré.
+omá2rét
+o2m1árg
+omá2ria
+omá2riá
+o2m1árm
+o2m1á2ru
+omá2sí
+omás3s
+omá2sz
+omás3zó
+o2m1á2t1e
+om1á2t1é
+o2m1átk
+o2m1átm
+om1átol
+o2m1átr
+om2b1a2lo
+om2bág
+om2b1eg
+omb1elh
+om2b1elt
+omb1éne
+om2b1éri
+omb1ón.
+ombó2r
+omb1óra
+om1bro
+om2buj
+omdio2
+om1dr
+o2m1e2b
+o2m1e2ce
+o2m1e2dé
+om1ef
+ome2g
+ome3gá
+om1ege
+om1egé
+o2m1egy
+ome2l
+o2m1ela
+om1elá
+om1elb
+o2m1ele
+o2m1elé
+om1elk
+om1ellá
+o2m1elm
+o2m1eln
+o2m1elo
+o2m1elő
+o2m1els
+om1elte
+o2m1elu
+o2m1elv
+o2m1e2m
+om1ene
+om1eng
+om1eny
+om1enz
+ome2o
+o2mep
+om1erd
+o2m1e2red
+o2m1e2rei
+o2m1erny
+om1e2ro
+ome2rő
+o2m1erő.
+o2m1erőb
+o2m1erőh
+o2m1erőn
+o2m1erőr
+om1erősí
+omer1őss
+o2m1erőt
+o2m1erőv
+om1e2rű
+ome2s
+om1ese
+om1esé
+om1ess
+om1est
+o2m1e2ti
+o2m1etn
+o2m1etű
+o2m1e2v
+o2m1ex
+ome2z
+o2m1eze
+o2m1ezred
+o2m1ébe
+om1é2de
+o2m1ég
+o2m1é2he
+o2méhs
+om1éje
+o2m1é2ke
+o2m1é2le
+om1élé
+om1é2lő
+o2m1ép
+o2m1ér.
+o2m1érb
+o2m1érc
+o2m1é2re
+o2m1é2ré
+omé2ri.
+o2m1érm
+o2m1é2rő
+o2m1érr
+o2m1érte
+o2m1érté
+o2m1értő
+o2m1érv
+o2m1é2s
+omé2tel
+o2m1étt
+o2m1éve
+om1évé
+om1f2l
+om1gl
+om1gr
+om1ide
+omid1i2
+om1i2dő
+omi2g
+o2m1iga
+o2m1igé
+om1iks
+o2m1ill
+om1imá
+omime2
+omi2mel
+omi2m1é
+om1i2na.
+omi2náb
+omi2náv
+o2m1ind
+om1inf
+o2m1ing
+om1inv
+o2m1i2ono
+o2m1i2p
+o2m1irá
+o2m1i2ri
+o2m1iro
+o2m1irt
+o2m1isk
+o2m1ism
+o2m1iste
+omi2sz1á
+om1i2tal
+omi2tan
+omi2t1ás
+omi2t1e
+omi2tis
+om1izé
+om1izo
+om1izz
+om1íj
+o2m1ír
+om1í2v
+om1í2z
+omjó2
+om2jő
+omká2rok.
+om1kl
+om1kr
+omlá2b1út
+omo2dor
+omo2kas
+2omoly
+o2m1ont
+om1ope
+omo2ras
+omo2re
+omo2riz
+o2m1orjá
+om1osto
+omosz2f
+o2m1oszt
+o2m1ox
+om1ök
+om1ö2l
+om1ön
+om1ö2r
+om1ös
+om1ö2t
+om1öv
+om1ö2z
+om1ő2r
+om1ő2s
+om2pel
+om1pla
+om2p1ors
+om2pő
+om2p1u2tá
+om1sk
+om1sl
+om1sp
+om1st
+om2te.
+omtes2s
+om1t2r
+o2m1ud
+o2m1ug
+o2m1uj
+omu2n
+o2m1uno
+o2m1ur
+o2m1u2t
+o2m1u2z
+o2m1új
+om1üd
+om1üg
+om1ü2l
+om1ür
+om1üs
+om1üt
+om1üv
+om1üz
+om1űr
+om1űz
+om1ya
+o2n1abl
+ona2cél
+ona2dat
+ona1dr
+on1ads
+onae2
+on1agg
+on1agi
+on1agó
+on1agyh
+on1ajn
+o2n1ajt
+2onak
+on1akc
+o2n1akk
+on1akn
+o2n1akt
+ona2len
+ona2l1e2s
+ona2lint
+on1alj.
+on1alju
+ona2lok
+ona2los
+1onani
+o2n1a2no
+o2n1ant
+on1app
+ona1pr
+ona1ps
+ona2rác
+onarádi2
+ona1s2p
+ona2tál
+onatü2
+ona2tüz
+on1ábr
+2onác
+o2n1ág
+o2n1állo
+o2n1állv
+o2n1á2p
+on1árad
+o2n1á2rak
+on1á2rat
+on1árb
+o2n1árk
+o2n1árn
+o2n1á2ro
+o2n1árt
+o2n1á2ru
+o2n1á2rú
+on1árv
+o2n1á2sza
+o2n1á2szokr
+o2n1átál
+oná2tás
+o2n1átc
+o2n1áte
+oná2t1ér
+o2n1átf
+o2n1áthe
+o2n1átm
+o2n1átre
+on1bl
+on1br
+on2cal
+on2c1ál
+on2c1e2g
+once2s
+on2c1ez
+on2c1ék
+on2c1ér.
+on2c1éré
+on2che
+on2cid
+on2c1ikr
+onc1ill
+on2cös
+onc3ság
+on2cseg
+oncs1emb
+oncs1ég
+on2cs1ér.
+onc3sikk
+on2cs1im
+on2cú
+on2cü
+on2de.
+ond1iko
+on2d1o2kos
+ond1oksá
+on2d1osz
+2ondoz
+on2d1öl
+on1e2b
+o2n1e2d
+on1e2ge
+on1egg
+o2n1e2gy
+on1e2h
+one2l
+o2n1ela
+o2n1ele
+on1el1é
+o2n1elh
+on1elj
+o2n1elm
+o2n1eln
+o2n1elo
+on1elő
+o2n1elr
+on1els
+on1elt
+o2n1elv
+o2n1e2m
+one2n
+on1ene
+on1erj
+on1erk
+on1ers
+one2s
+o2n1ese
+ones2s
+on1est
+o2n1e2v
+o2n1ex
+2onéb
+oné2d
+on1éde
+o2n1é2g
+o2n1é2he
+on1é2ke
+on1éks
+o2n1é2l
+on1é2ne
+o2n1é2p
+o2n1érbe
+o2n1érc
+o2nérd
+o2n1éri
+o2n1érl
+o2n1érm
+o2n1érp
+o2n1érs
+o2n1érte
+o2n1érv
+o2n1év.
+o2névad
+o2n1évb
+o2n1é2ve
+on1é2vi
+o2n1évk
+o2n1évn
+on1évr
+on2g1áll
+ongás1s
+on2g1e2c
+on2ged
+on2g1eg
+on2g1e2l
+on2gik
+on1g2ló
+on2gü
+on2gyad
+on2győ
+onháro2
+onhárom1
+o2n1i2d
+oni2g
+o2n1iga
+o2n1ige
+o2n1igé
+o2n1ij
+on1i2ke
+o2n1ill
+o2n1inb
+on1ind
+o2n1inf
+o2n1ing
+o2n1inj
+o2n1inn
+o2n1inr
+o2n1ins
+o2n1int
+o2n1i2p
+on1i2rá
+o2n1iro
+o2n1irt
+o2n1isk
+o2n1ism
+on1iste
+onita2
+o2n1i2zé
+on1izo
+o2n1izz
+on1íg
+o2n1ín
+o2n1ív
+on1íz
+onk1áll
+onká2rok.
+onké2t1
+on2ne.
+on3nyár
+on3nye
+on3nyo
+on3nyú
+on3nyü
+o2n1ob
+ono1g2ráf.
+ono1g2ráfn
+onoka2
+on1o2kal
+on1o2kos
+o2n1okta
+o2n1old
+on1oll
+on1opt
+on1oszl
+ono1sztr
+o2n1o2v
+o2n1ox
+o2n1óri
+onó2sak
+onó2si
+onó2szen
+on1öb
+on1öl
+on1ön
+on1ör
+on1ös
+on1ö2t
+on1ö2v
+on1ö2z
+on1ő2s
+on1pl
+on1pr
+on1ps
+2ons.
+onsa2v1a2m
+on1s2k
+on1sl
+on1s2m
+on1spe
+on1spo
+on1spr
+on1sr
+on1sto
+onsz2
+on1szf
+on1szt
+ont1agy
+on2t1aj
+on2t1alk
+on2t1ara
+on2t1atr
+on2taz
+on2t1áll
+ont1árv
+on2teb
+on2t1ed
+on2t1e2g
+ont1elá
+ont1eld
+ont1elh
+ont1ell
+ont1elm
+on2teln
+on2t1elő
+ont1elt
+ont1elv
+ont1emb
+onte2s
+on2t1ese
+ont1éké
+on2tél
+on2tigé
+on2t1i2ko
+ont1ikr
+on2t1i2m
+on2t1inf
+on2t1int
+onti2sz
+ont1iszo
+on2t1iz
+on2t1í2v
+on2t1oml
+on2t1ors
+ont1óni
+1ontóst
+on2t1ös
+on2t1öz
+on2tül
+on2tür
+on2t1üz
+on2tye
+o2n1ud
+o2n1ug
+o2n1uj
+onu2n
+o2n1una
+o2n1u2r
+o2n1u2t
+o2n1új
+o2n1ú2s
+onú2t
+on1útb
+on1úté
+on1úth
+on1úti
+on1útj
+on1úto
+on1útr
+on1útt
+on1ü2c
+o2n1ü2g
+on1ü2l
+o2n1ün
+o2n1ür
+o2n1ü2t
+on1ü2v
+o2n1ü2z
+on1űr
+on1űz
+o2ny1acé
+ony1a2dó
+ony1akc
+ony1alj
+o2ny1alk
+ony1alt
+ony1anya
+onya1p2
+o2ny1apó
+o2ny1ál
+ony1árk
+o2ny1árn
+ony1ázó
+ony1e2c
+ony1e2g
+o2ny1e2l
+o2ny1e2m
+o2nyen
+o2ny1e2r
+ony1e2s
+o2ny1ég
+o2ny1é2j
+o2ny1é2k
+o2ny1él
+o2ny1é2ne
+o2ny1ér.
+o2nyéré
+onygóc1
+o2nyigé
+ony1iko
+ony1ing
+o2nyita
+o2nyitók
+o2ny1í2r
+ony1old
+ony1oml
+o2ny1o2r
+o2nyosz
+ony1ó2r
+o2ny1ö
+o2ny1ő2
+o2nyug
+o2ny1ur
+o2ny1ü2
+onz1abl
+on2zag
+onz1ajtó
+on2zar
+on2zág
+on2z1á2l
+on2z1ed
+on2z1e2l
+on2z1e2m
+on2z1es
+on2z1ék
+on2z1ére
+on2z1im
+onz1ing
+onz3sel
+on2zü
+o1o
+oo2ib
+oo2in
+oo2pe
+oo2re
+oo2xi
+o1ó
+o1ö
+o1ő
+o2p1a2b
+o2p1a2d
+o2pal
+op1a2la
+o2p1any
+op1a2po
+op1a2r
+opa2u
+o2p1a2z
+o2pál
+o2p1ám
+o2p1á2rat
+opáskész1
+o2p1áth
+o2p1átl
+o2p1átm
+op1bl
+op1e2dé
+op1e2g
+op1ejt
+op1elő
+op1em
+opera1s
+operasz2
+op1erd
+op1erk
+op1erő
+op1es
+op1e2t
+o2p1é2l
+o2p1é2n
+op1gr
+op1i2ko
+op1ikr
+o2p1im
+op1ind
+o2p1ing
+o2p1i2p
+o2piram
+o2p1i2rá
+op1isi
+op1ist
+o2p1i2ta
+opi2z
+op1izo
+op1izz
+op1ív
+op1kl
+op1kr
+o2p1ob
+2opol
+o2p1orj
+o2p1orr
+opor2t1a2
+opor2t1á2
+opor2t1e2
+opor2t1érd
+opor2tö
+o2p1orzó
+oposz2f
+o2p1ov
+op1ös
+op2pé
+op2p1is
+op1py
+2opro
+op2roc
+op2rod
+op1sl
+op1sp
+op1sr
+op1s2t
+o2p1ud
+o2p1u2r
+o2p1u2t
+op1új
+o2p1ús
+op1üd
+op1üg
+op1üt
+op1üz
+o2r1abl
+o2r1abr
+ora2dat
+o2r1a2dá
+or1adm
+o2r1a2dó
+or1aff
+or1agg
+or1a2gó
+ora2kad
+ora2kas
+o2r1akc
+ora1kl
+ora2kol
+o2r1akt
+or1alg
+o2r1alj
+or1alk
+o2r1alm
+o2r1alt
+o2r1alv
+or1amp
+o2r1ana
+o2r1ane
+o2r1ank
+o2r1a2no
+o2r1ant
+or1a2nya
+oraó2
+or1app
+o2r1a2rá
+o2r1arc
+or1a2ri
+or1aszk
+o2r1atk
+o2r1atl
+or1att
+or1aty
+o2r1a2zo
+o2r1ábr
+orá2cs
+or1ács.
+or1ácsa
+or1ácso
+o2r1á2g
+orá2le
+or1álló
+o2r1állv
+orá2lö
+o2r1á2p
+o2r1ár.
+o2r1á2rak
+o2r1árá
+o2r1árb
+o2r1árk
+o2r1á2ro
+o2r1árp
+o2r1árr
+o2r1árt
+or1á2ru
+or1árú
+o2r1árv
+o2r1ásv
+orá2sze
+o2r1áta
+o2r1á2t1e2
+o2r1átf
+o2r1áth
+o2r1átj
+o2r1átk
+o2r1átm
+o2r1átr
+o2r1áts
+o2r1átt
+o2r1átv
+or1bl
+or1br
+or2c1a2l
+or2car
+1orcád
+or2chá
+or2c3hé
+or2c3ho
+orc3ság
+or2c3seb
+or2c3sé
+or2cú
+or2cz
+or2d1au
+ord1eme
+ord1e2ső
+or2dex
+or2d1ing
+2orea
+o3reá
+o2r1e2b
+or1ecs
+o2r1e2d
+o2r1ef
+or1e2ge
+or1e2gé
+o2r1e2gy
+2ore2k
+or1eke
+or1eké
+ore2l
+or1ela
+or1ele
+or1elh
+or1elj
+or1elm
+or1eln
+or1elo
+or1elő
+or1elr
+or1els
+or1elt
+or1elv
+o2r1e2m
+ore2n
+or1ene
+o2r1eng
+or1eny
+o2r1ep
+or1eró
+ore2s
+or1ese
+or1esé
+or1eső
+o2r1ess
+o2r1esze
+o2r1e2v
+or1ez
+o2r1é2d
+o2r1é2g
+o2r1é2j
+oré2kás
+oré2k1e2
+or1ékné
+o2r1é2l
+o2r1é2m
+o2r1é2ne
+o2r1ép
+o2r1éré
+o2r1é2te
+o2r1étk
+o2r1év.
+o2r1é2ve
+o2r1é2vé
+o2r1é2vi
+o2r1évn
+o2r1évr
+orfé2l1é2v
+orfi2úér
+2orgiai
+or1gl
+o2r1ibo
+o2r1i2de
+o2r1i2dé
+oridi2
+ori2d1io
+1o2rie
+o2r1ifj
+o2r1i2ga
+o2r1i2gá
+o2r1i2gy
+or1iha
+o2r1i2ma.
+o2r1i2má
+o2r1i2na.
+o2rinas
+o2r1i2nán
+o2r1i2nát
+or1i2náv
+o2r1ind
+o2r1inf
+o2r1ing.
+o2r1ingc
+o2r1ingé
+o2r1ingi
+o2r1ingn
+o2r1ingr
+o2r1ings
+or1inh
+o2r1inj
+o2r1ins
+orin2t1a2
+orin2tel
+orin2t1ő
+ori2og
+o2r1i2p
+o2r1i2si
+o2r1ism
+or1isp
+o2r1iste
+o2r1i2szá
+ori2tan
+o2r1i2zé
+o2r1íg
+o2r1í2j
+o2r1í2n
+o2r1ír
+o2r1í2v
+o2r1í2z
+1orjaia
+1orjaié
+or3já
+or1k2l
+orkö2z1e2p
+or1k2v
+or2m1app
+orma1t2re
+or2m1att
+or2m1azo
+or2m1eb
+orme2g
+or2m1egy
+orm1eli
+orm1elv
+orm1erők
+orm1esz
+ormé2t
+or2m1éte
+or2m1osz
+or2móv
+or2m1ö
+or2m1ő
+or2mü
+or2ne.
+ornis1s
+o2r1o2á
+orogkész1
+oro2k1á2
+oro2kor
+o2r1olda
+o2r1o2li
+o2roltól
+o2r1ontó.
+o2r1ontób
+or1ontóé
+or1ontóig
+o2r1ontój
+o2r1ontón
+o2r1ontór
+o2r1ontót
+o2r1ontóv
+oro2nya
+oro2nyo
+or1ope
+or1opt
+o2r1o2r
+o2r1osko
+o2r1osto
+1o2roszi
+1o2roszr
+o2rosztá
+o2r1o2x
+or1ó2ia
+or1ó2ni
+or1ó2rá
+or1óri
+or1ó2sá
+oróso2r
+oró2soro
+or1ö2b
+or1ö2c
+or1ö2l
+or1ön
+or1ör
+or1ös
+or1öt
+or1öv
+or1ö2z
+or1ő2r
+or1ő2s
+or1ph
+or1pl
+or1p2n
+or1p2r
+orr1abl
+or2r1a2r
+or2r1áta
+1orrb
+1orri.
+or2rin
+or2riz
+1orrk
+1orruk
+1orrú.
+1orrúc
+or2s1a2d
+or2s1ajtók
+ors1alk
+ors1ass
+or2s1ál
+or2sed
+or2s1e2s
+or2s1é2ne
+or2sérte
+ors1é2tát
+or2s1í2r
+or2sön
+or2ső
+or1srá
+or1s2tab
+ors1ült
+ors1ü2tő
+1ország
+orszi2l1
+ors3zóná
+or1sz2t
+or2t1agg
+or2t1alm
+or2tana
+orta2n1á2c
+or2t1aré
+or2tág
+ort1árad
+ort1á2ram
+ort1á2rán
+ort1á2rár
+ort1árbe
+ort1árná
+ort1á2ruk
+or2t1á2rú
+or2t1e2g
+ort1ejt
+or2t1ela
+ort1e2lem
+or2t1elé
+or2t1ell
+or2t1elm
+or2t1eln
+or2t1elo
+or2t1elő
+or2t1elt
+ort1elv
+ort1emb
+or2tene
+orte2r1a
+or2t1ess
+ort1eti
+ort1éle
+ort1élé
+ort1élt
+ort1élv
+or2t1érm
+or2tid
+ort1i2ku
+or2t1int
+or2t1ist
+or2t1ita
+or2tít
+or2t1okm
+or2t1o2kol
+or2t1okta
+or2t1old
+or2t1orm
+or2t1ott
+or2t1ó2r
+or2t1ön
+or2t1ös
+or2t1ö2v
+ort1ura
+or2t1u2t
+ort1úr.
+or2t1ü2zér
+o2r1ud
+o2r1u2g
+o2r1u2r
+o2r1u2t
+o2r1útb
+o2r1úth
+o2r1ú2ti
+o2r1útj
+o2r1útn
+o2r1ú2ton
+o2r1útr
+or1úts
+o2r1útt
+or1üd
+or1ü2g
+or1ü2l
+or1ün
+or1ür
+or1ü2s
+or1üt
+or1ü2v
+or1üz
+or1űr
+1orv.
+or2v1a2n
+2orvá
+orv1isi
+1orvos
+or2vő
+1orvv
+or2z1a2var.
+or2z1e2c
+or2zes
+or2zsan
+orz1z
+o2s1abl
+o2s1a2da
+o2s1a2dó
+o2s1akc
+o2s1a2l
+osa2n
+o2s1ang
+o2s1ant
+o2s1any
+o2s1a2p
+os1arc
+os1assz
+os1a2ty
+o2s1au
+o2s1ábr
+o2s1á2g
+os1áld
+o2s1áll
+os1á2lom
+osára2
+osá2rak
+osári2
+osá2rik
+osá2rok
+o2s1áru
+osás1s
+os1á2t1a
+os1áté
+os1átj
+os1átk
+o2s1átr
+os1e2d
+o2s1e2g
+o2s1e2l
+os1emb
+os1e2n
+o2s1er
+o2s1es
+os1e2t
+os1ex
+os1ez
+o2s1é2g
+o2s1é2l
+o2s1ép
+o2s1érd
+o2s1érte
+o2s1érté
+osgé2
+o2s1ide
+o2s1if
+osi2g
+os1iga
+os1ikr
+os1inf
+o2s1int
+o2s1i2p
+o2s1i2rá
+os1iro
+os1irt
+o2s1ism
+os1isp
+os1iste
+o2s1i2sz
+o2s1íj
+o2s1í2r
+o2s1í2z
+os1kl
+os1kró
+2osok
+o2sonh
+o2sonn
+o2sono
+1o2sont
+o2sonu
+1osonv
+o2s1o2r
+os1osz
+osó1p
+os1ök
+os1ö2l
+os1ön
+os1ö2v
+os1ő2r
+os1p2l
+os1p2r
+os1ps
+os1sta
+ossu2
+os2s1ur
+ossz1áll
+ossz1á2ro
+ossz1es
+ossz1íj
+osszó2
+os3sző
+ost1e2te
+os2tip
+os2tir
+os2tiz
+1ostob
+ost1old
+os2t1ös
+2ostu
+os2t1ü2
+1ostya
+o2s1ud
+o2s1uj
+o2s1u2r
+o2s1u2t
+os1úr.
+o2s1ú2s
+o2s1üg
+o2s1ün
+o2s1ü2v
+o2s1üz
+os3zabá
+o2szaj
+osz1alá
+osz1alk
+osz1alt
+osza2n
+osz1any
+o2szar
+osz1aré
+osza2t1e2
+o2sz1ál
+o2sz1ed
+o2sz1e2g
+o2sz1e2l
+o2s3zen
+osz1ep
+osz1es
+o2szég
+o2széj
+o2sz1é2l
+o2sz1é2p
+o2sz1és
+o2szige
+osz1ing
+osz1ism
+osz1ist
+oszí2
+osz1ív
+o1szkl
+o2sz1o2ro
+osz1ors
+o2sz1orz
+os3zón
+osz1ó2r
+o2szö
+os3zöl
+osz2t1alm
+oszt1any
+osz2t1apo
+osz2tár.
+osz2t1árn
+osz2ted
+osz2tell
+osz2t1em
+oszté2r
+osz2t1éré
+osz2t1ív
+osz2t1osz
+o2szur
+osz1úr
+o2szü
+osz1üg
+os3zül
+ot1abl
+ot1a2da
+otag2
+ota1gr
+ota1k
+ot1ana
+o2t1ant
+ot1a2ny
+ota1p2
+ot1arc
+ot1arz
+ot1ass
+o2t1a2z
+ot1ábr
+o2t1á2g
+ot1á2rak
+o2t1á2rá
+o2t1árb
+o2t1á2ré
+ot1árn
+ot1bl
+o2teb
+o2t1e2g
+otel1a
+ote2l1á
+ote2lel
+ote2lő
+ote2m1á
+ote2m1o
+ot1e2v
+o2t1é2l
+o2t1ép
+o2t1ér.
+o2t1érté
+o2t1érz
+ot1fr
+ot1gr
+oth2r
+o2t1id
+o2t1im
+otina2
+ot1i2na.
+oti2nar
+oti2nár
+o2t1ind
+otinká2
+2otipa
+2otipi
+2otipn
+2otipt
+o2t1irá
+o2t1is
+o2t1izé
+ot1íj
+ot1ín
+ot1kl
+ot1k2r
+o2t1ob
+oto1gram
+ot1ola
+otona2
+oto2n1á
+oto2n1in.
+oto2nis
+oton3n
+oto2rak
+oto2rál
+oto2rár
+oto2re
+oto2rim
+oto2rin
+oto2rol
+otosz2f
+otó1f2
+2otóp
+otó2pan
+otó2pas
+otó2pin
+otó2p1osz
+otó2sétá
+otós3s
+otó1sta
+otó1sz
+otó2s3zár
+otót2
+otó1tr
+ot1ö2l
+ot1ös
+ot1pl
+ot1pr
+ot1ps
+o1t2rag
+ot1sp
+ot1sr
+ot1st
+otta1g2
+ot2t1é2g
+1ottl
+ot1ura
+ot1u2sz
+o2t1új
+ot1úri
+ot1ü2l
+ot1üt
+ot1ü2z
+ot1űr
+otva1k2
+otya1
+o1u
+ou2ag
+ou2il
+ou2le
+o1ú
+o1ü
+o1ű
+ova2ga
+ova2g1i2n
+ova2r1an
+ova2rát
+ova2r1el
+ova2rék
+ova2rés
+ova2ris
+ovas3s
+ovau2
+ováb2b1o
+ová2s1á2rá
+ová2sik
+ovio2
+ow1el
+1oxidb
+1oxidr
+o2xigé
+1oxilc
+oy2ce
+oza2g
+ozag1a
+oz1agi
+o2z1a2l
+oza2mal
+oza2m1e2
+oza2m1érté
+oza2min
+oza2n
+o2z1any
+oza2r
+oz1ara
+oza2tat
+oza2tál
+oza2t1e2
+oza2tés
+oza2t1é2te
+ozat1ill
+oza2t1í2
+oza2t1ol
+o2z1au
+o2z1á2g
+ozá2ke
+oz1áll
+o2z1á2ro
+o2z1áru
+ozá2s1e
+ozás3s
+ozá2s3z
+o2z1átl
+oz1e2g
+oz1e2m
+oz1en
+ozé2k1e2
+o2z1é2l
+o2z1é2p
+o2z1é2ré
+oz1i2do
+o2z1i2par
+oz1iro
+ozi2s1aj
+ozi1sl
+ozi1st
+ozi1sz2
+ozi2t1a2
+oz1í2n
+o2zor
+oz1ors
+o2z1osz
+ozóegyez1
+2ozófia
+2ozófiáb
+2ozófiáh
+2ozófiája
+2ozófián.
+2ozófiána
+2ozófiár
+2ozófiát.
+2ozófiátó
+2ozófiáva
+ozó2tan
+oz1p2r
+o2zs1a2l
+ozsa2n
+ozs1any
+o2zs1ő
+ozs1s
+o2zsü
+oz1ün
+oz1ü2z
+oz1űr
+ozzá1s2
+2ó.
+ó1a
+óa2cé
+óa2dag
+óa2dá
+óa2do
+óa2dó
+óa2ga
+óa2gi
+óa2gy
+óa2já
+óajtói2
+óa2kad
+óa2kar
+óa2ká
+óa2ku
+óa2la
+óala2g1
+óa2lá
+óa2l1e
+óalmana2
+óalmanac3
+óa2lo
+óal1os
+óa2lu
+óa2ma
+óa2na
+óa2nó
+óa2ny
+óa2pá
+óa2po
+óa2pó
+óa2pu
+óa2ra
+óa2rá
+óa2ré
+óa2ri
+óa2ro
+óa2to2
+óatom1
+óa2ty
+óa2uk
+óa2ur
+óa2ut
+óa2va
+óa2xi
+óa2zo
+ó1á
+óá2bé
+óá2cs
+óá2ga
+óá2gi
+óá2go
+óá2gyú
+óá2hí
+óá2la
+óá2lo
+óá2po
+óá2rá
+óá2ru
+óá2rú
+óá2sa
+óá2só
+óá2sz
+óá2ta
+óát1a2dó.
+óá2tá
+óá2t1e2
+óá2té
+óá2t1i2
+óá2tí
+óá2to
+óá2t1ö
+óá2tu
+óá2tú
+óá2tü
+2óbab
+2óbaj
+2óbak
+2óbal
+2óband
+2óbank
+óba1p2
+2óbará
+2óbark
+2óbarna
+óbas2
+óba1t2r
+óbau2
+2óbec
+2óbef
+2óbeg
+2óbeh
+2óbej
+2óbek
+2óbele
+2óbelé
+2óbels
+2óbem
+2óbeo
+2óber
+2óbet
+2óbev
+2óbez
+ó2bég
+2óbil
+2óbio
+2óbir
+2óbit
+2óbiz
+ó1b2le
+ó1b2lo
+2óbój
+2óbólé
+ób2rá
+ó1b2ro
+ób2rók
+ó1b2ru
+óbuda2ik
+óbuszt2
+óbu2sz1ú
+ó2c1aj
+ó2c1akr
+óc1a2la
+óc1alk
+ó2c1ar
+ó2c1ass
+óc1att
+ó2c1ál
+1ó2ceá
+ó2c1e2g
+óce2l
+óc1ele
+óc1elm
+óc1elő
+óc1emb
+ó2c1e2v
+ó2c1ép
+ó2c1ét
+óc3há
+óc3he
+óc3ho
+óci2m
+óc1imi
+óc1ing
+ó2c1i2pa
+ó2c1is
+óc2lu
+ó2c1or
+ó2c1osz
+óc1ó2r
+óc1pr
+2ócsa
+óc3ság
+ó2cs1áru
+2ócse
+2ócsé
+2ócsi
+ó2csit
+2ócsí
+2ócso
+2ócsö
+2ócső
+ócs1p
+óc3s2pá
+óc3sz
+óc1tr
+ó2c1ud
+óc1ün
+óc1üz
+óc3za
+óc3ze
+óc3zu
+ód1ada
+ód1a2dá
+óda2j
+ód1ajá
+ód1akt
+2ódal.
+2ódala
+ód1alg
+ó2d1am
+ód1ana
+2ódarabk
+2ódará
+ód1aut
+ód1azo
+ó2d1áf
+ó2d1ág
+ó2d1ál
+ó2d1áp
+ó2d1árn
+ód1á2ru
+ódás3s
+ód1bl
+ód1br
+ó2d1e2d
+ó2d1e2g
+ód1e2lem
+ó2d1elh
+ód1elj
+ó2d1ell
+ó2d1elm
+ó2d1elo
+ód1elő
+ód1elr
+ó2d1elv
+ód1emb
+ód1eme
+ód1ep
+óde2ra
+ód1erő
+óde2sés
+ó2d1e2v
+ó2d1ez
+ó2d1é2g
+ó2d1ép
+ó2d1érte
+ó2d1érz
+ód1fr
+ód1gl
+ó2d1i2d
+ó2d1igé
+ó2d1int
+ódi2p
+ó2d1ipa
+ó2d1iro
+ódi2sz
+ód1izo
+ó2d1ír
+ód1kl
+ód1kr
+ód1kv
+2ódob
+ódo2ga
+2ódok
+2ódol
+2ódom
+ó2d1op
+ó2d1osz
+ó2d1o2x
+ódókész1
+ód1órá
+ó2d1ö2l
+ód1ös
+ó2d1öt
+ó2d1öv
+ód1őr
+ód1pr
+2ó1d2ram
+2ódrá
+ód2rám
+ó1d2rog
+ó1d2rót
+ód2ruk
+ód1sp
+ód1st
+2ódug
+ódu2r
+ó2d1ura
+ódus3s
+ódu2s3z
+ó2d1u2t
+ó2d1új
+ód1úr.
+ód1üg
+ó2d1ür
+ód1üv
+ód1üz
+ód3zár
+ó2d3ze
+ód3zso
+ó1e
+óe2bé
+óe2ch
+óe2cs
+óe2dé
+óe2dz
+óe2ge
+óe2gé
+óegész1
+óe2gy
+óe2ke
+óe2ké
+óe2l1a2
+óe2l1á2
+óe2le
+óel1en
+óe2lé
+óel1ér
+óe2l2i
+óe2l1í2
+óe2lo
+óe2lő
+óe2lü
+óembe2r1ék
+óe2me
+óe2mé
+óe2mu
+óe2ne
+óe2pé
+óe2pi
+óe2po
+óe2re
+óe2ré
+óe2ró
+óe2rő
+óe2se
+óe2sé
+óe2ső
+óe2sz
+óe2te
+óe2ti
+óe2tű
+óe2ve
+óe2vé
+óe2vő
+óe2zü
+ó1é
+óé2be
+óé2ge
+óé2gé
+óé2gő
+2óé2he
+2óéhs
+óé2ke
+óé2ké
+óé2kí
+óé2le
+óé2lé
+óé2lő
+2óé2ne
+óé2pí
+óé2pü
+2óér.
+2óérd
+2óé2re
+2óé2ré
+óé2ri
+óé2rő
+2óérte
+2óérté
+2óérz
+óé2te
+2óétk
+óé2ve
+óé2vé
+óé2vi
+óé2vü
+2ófa.
+2ófaa
+2ófaá
+2ófab
+2ófac
+2ófad
+2ófae
+2ófaf
+2ófag
+2ófah
+2ófak
+2ófal
+2ófao
+2ófap
+2ófar
+2ófas
+ófa1st
+2ófa1t2
+2ófaü
+2ófav
+2ófaz
+ófe2l1em
+ófe2len
+ó2f1ev
+2ófék
+2ófélő
+2ófélt
+2ófén
+ó2f1ér.
+ófi2ab
+ófi2ad
+ófi2ag
+ó1f2la
+ó1f2lo
+óf2ló
+óf2lö
+óf2lu
+2ófoc
+2ófog
+2ófok
+2ófol
+2óford
+2óforg
+2óformác
+2óformáj
+2óformál
+2óforr
+2ófos
+2ófot
+ó2f1ov
+ó1f2rak
+ó1f2ri
+ó1f2rí
+ó1f2ro
+ó1f2rö
+ó2f1ud
+ófu2r
+óf1ura
+óf1úr.
+óf1úrn
+óga1p
+óg1dr
+óge2o
+ógé2p1i2p
+óg3gy
+ógi2al
+óg1ír
+óg2la
+óg2le
+ógo2ras
+ó1g2raf
+óg2rán
+ógu2sab
+ógu2s3z
+ó2gy1el
+ó2gy1es
+ó3gyi.
+ógy1int
+ógyö2k1érb
+ógyta2n1á2
+ógyte2a
+ógy1ús
+óha2de
+2óhal
+2óhan
+2óhas
+2óhat
+óháza2d
+óhá2z1ada
+2óhon
+2óhor
+2óhos
+óhús1s
+ó1i
+2ói2de
+2óidé
+ói2dén
+ói2di
+2ói2dom
+2ói2dő
+2ói2ga
+2ói2ge
+2óigé
+ói2géb
+ói2géi
+ói2géj
+ói2gék
+ói2gén
+ói2gér
+ói2gét
+ói2gév
+ói2konb
+2ói2konj
+2ói2konn
+2ói2kono
+ói2konr
+ói2kont
+óile2
+2óill
+ói2ma.
+2ói2má
+ói2mi
+2óimp
+2ói2na.
+ói2nai
+ói2naka
+ói2nas
+ói2nat
+ói2nán
+ói2nár
+ói2nát
+2óind
+2óinf
+2óing
+2ói2ni
+2óinj
+2óinp
+2óint
+2óinv
+ói2pa
+2ói2rat
+2ói2rá
+2ói2ro
+ói2sz
+2ói2ta
+ói2tók
+ói2vad
+ói2zé
+ói2zo
+ó1í
+óí2rá
+óí2ri
+óí2ro
+óí2ró
+óí2té
+óí2vé
+óí2vü
+óí2vű
+óí2ze
+óí2zé
+óí2zi
+óí2zü
+óí2zű
+ója1g2
+2ójakén.
+ójak2r
+2ójam
+ója1p2
+2ójav
+2ójárá
+2ójárm
+2ójáró.
+2ójáru
+2ójárv
+2ójáté
+2ójáts
+óje2gy1á2
+2ójut
+2ókab
+ók1a2da
+ók1ajt
+ó2k1akó
+ó2k1alj
+ók1alko
+2ókaló
+2ókamp
+2ókamr
+2ókapa
+2ókapc
+2ókaps
+2ókar.
+2ókara
+2ókarr
+2ókart
+2ókata
+2ókate
+óka1t2r
+ók1aut
+2ókav
+2ókaz
+ó2k1áll
+ók1árad
+ó2k1á2ri
+ó2k1árn
+ó2k1áru
+2óke2d
+ó2k1edz
+ók1egé
+2ókem
+ó2k1emb
+2óker
+óker1este
+óke2r1ékné
+óke2rig
+ó2k1e2rő
+óke2r1üg
+óke2sz
+ók1esze
+óke2t
+ók1ete
+2ókev
+2ókez
+ó2k1é2l
+2ókém
+2ókény
+2ókép.
+2óképb
+2óképe
+óké2p1e2l
+2óképé
+2óképl
+2óképn
+2óképpel
+2óképr
+2óképt
+2óképz
+ó2k1ér.
+2ókérd
+2ókére
+2ókéré
+2ókérő
+2ókés
+ó2k1étt
+ók1étv
+ók1gr
+ók2hiá
+2ókia
+2ókiá
+2ókic
+2ókie2
+2ókié
+2ókif
+óki2g
+ók1iga
+ó2k1igé
+2ókií
+2ókij
+ók1ill
+2ókim
+ók1imi
+2ókinc
+2ókine
+ó2k1int
+2ókiny
+2ókio
+ó2k1isk
+ó2k1ist
+2ókisz
+2ókit
+2ókiv
+ók1i2va
+ók1k2r
+ók2lim
+ó1k2lí
+2ó1k2ló
+2ó1k2lu
+2ókock
+2ókoco
+2ókoe
+2ókoh
+2ókoll
+2ókomé
+2ókomf
+2ókomp
+2ókonc
+2ókonf
+2ókonj
+2ókons
+2ókont
+2ókony
+2ókonz
+2ókoo
+2ókop
+2ókorá
+óko2r1á2s
+2ókorb
+2ókore
+ó2k1org
+2ókori
+2ókorl
+2ókorm
+2ókorn
+2ókoro
+2ókorr
+2ókors
+2ókoru
+ó2k1oszl
+2ókód
+ók1ó2l
+2ókór
+ó2k1óv
+2óköl
+ók1ö2lé
+ók1ö2lő
+ók1örd
+ók1ötl
+ók1pl
+ók1pr
+ó1k2rá
+ók2reá
+2ó1k2rém
+ók2rét
+2ó1k2ri
+ó1k2rí
+ók2ron
+ók2ros
+2ó1k2rón
+ók1sk
+ók1st
+ó2k1ug
+ó2kum
+2ókup
+2ókur
+óku2sz1ál
+óku2sze
+2ókut
+2ókúr
+ó2k1üg
+2ókül
+2óküs
+ók1üzl
+2ó1k2vó
+ól1ajt
+óla2man
+óla2pa
+ó2l1a2pál
+óla2pol
+óla2p1osz
+ól1a2rá
+ól1azo
+ólá2b1út
+1ó2lál
+ólás3s
+ólá2sü
+ól1átl
+óleí2
+ól1e2se
+ól1e2sé
+ól1esh
+ól1esn
+ól1ess
+ól1est
+óle2ta
+ólete2
+óle2t1ev
+ó2l1érz
+ólé2tel
+ólé2tés
+óli2ako
+óli2am
+óli2s
+ól1iszo
+ól1ín
+óloma2
+ólo2m1al
+ólo2m1á
+ólo2m1e
+ólo2mis
+1ó2lomr
+ó2l1osz
+ólóá2
+óló1sl
+óló1sp
+ólót2
+ó2l1öl
+ó2l1ör
+ó2l1ös
+ó2l1ö2z
+ól1p2r
+ólu2m1e
+ólus3s
+ólu2szá
+ól1üt
+ól1üv
+ólya2ga
+ólyag1g
+óly2á
+óm1abl
+ó2m1a2cé
+2ómagn
+óm1akn
+óm1all
+2óman
+2ómara
+2ómarc
+ómaren2
+2ómarh
+2ómark
+ómas2
+óma1sp
+2ómass
+2ómate
+óm1a2to
+ó2m1au
+2ómax
+2ómág
+óm1áll
+2ómárk
+2ómárt
+2ómáz
+óm1b2r
+óm1e2gy
+ó2men.
+2óméd
+2ómél
+óm1éle
+ó2m1ép
+2ómére
+2óméré
+2ómérg
+2ómérk
+2ómérn
+2ómérő
+2ómérs
+2ómérté
+ómiac1
+ómi2as
+ó2m1i2b
+ómi2g
+ó2m1igé
+2ómi2k
+óm1iko
+2ómin
+ó2m1i2ono
+ó2m1i2ont
+ó2m1i2p
+2ómis
+ó2m1isk
+ó2m1ist
+ómi2sz
+ó2m1i2z
+2ómod
+2ómog
+2ómoh
+ó2m1ola
+ó2m1old
+2ómond
+2ómoni
+2ómono
+2ómont
+2ómor
+2ómos
+ó2m1osz
+2ómot
+ó2m1ox
+2ómoz
+óm1öt
+óm1őr
+óm1pr
+óm1üt
+óm1üz
+óműt2
+2ónad
+2ónag
+óna2kás
+óna2k1e2
+óna2kol
+ón1alj.
+ón1aljak
+ón1aljá
+ón1aljo
+ón1alju
+2ónap
+óna2pa.
+óna2pá
+ó2n1apába
+óna2pe
+ón1arc
+ó2n1asp
+ón1aszt
+óna1t2
+2ónav
+óná2l
+ó2n1áll
+ó2n1álo
+ónás1s
+ón1br
+óne2d
+ón1ez
+1ó2néé
+2óném
+ón1épí
+1ó2néra
+ón1érc
+ó2nérd
+1ó2néró
+óné2v1á
+2ónéz
+óni2g
+ó2n1igé
+ó2n1ist
+ón1odv
+1ó2nokul
+2ónor
+ón1ox
+ón1ön
+ó2n1ör
+ón1öt
+ónőé2h
+ón1pr
+ó2n1u2t
+ón1ür
+2ónya
+2ónye
+2ónyil
+2ónyitá
+2ónyitó.
+2ónyí
+2ónyo
+2ónyu
+2ónyú
+ó1o
+óo2dú
+óo2ka
+óo2ká
+óo2k1i2
+óo2ku
+óo2la
+óo2li
+óo2pe
+óo2ra
+óo2ri
+óo2ro
+óo2vi
+óo2xi
+ó1ó
+óó2la
+óó2lá
+óó2li
+óó2lo
+óó2ra
+óó2ri
+óó2sá
+óó2vá
+óó2vo
+óó2vó
+ó1ö
+óö2bö
+óö2ko
+óö2kö
+óö2lé
+óö2lő
+óö2rö
+óö2ve
+óö2zö
+ó1ő
+óő2re
+óő2ré
+óő2ri
+óő2rö
+óő2rü
+óő2sé
+óő2sö
+ó2p1a2da
+ó2p1alk
+óp1anal
+ó2p1a2no
+óp1ant
+ó2p1any
+óp1a2rán
+óp1áll
+ópcsa2p1
+ó2p1ef
+ó2p1e2g
+óp1elo
+ó2p1id
+óp1ind
+ó2p1i2o
+óp1i2rá
+ó1p2lak
+ó1p2las
+ó1p2lu
+ó2p1ob
+ó2p1o2la
+ópo2rad
+óp1óra
+ó1p2ri
+óp2rod
+óp2rop
+ó1prób
+óp1t2r
+ópus3s
+ó2p1új
+óp1üv
+ó2rabé
+ór1ace
+2órada
+óra2dat
+ó2raib
+ó2raié
+óra2iér
+ó2raih
+ó2raii
+ó2raij
+ó2raik
+óra2iké
+óra2iko
+ó2raim
+ó2rain
+ó2raip
+ó2rais
+ó2rait
+ó2raiv
+1ó2raje
+2órajo
+2órajz
+óra1kv
+ó2rala
+ór1alk
+ó2ramo
+ó2r1ani
+ór1ant
+óra1p2l
+ór1arc
+1órare
+óra1s2p
+ó2r1a2tom
+1ó2raü
+1óráén
+ór1ágg
+ór1á2gy
+1órákh
+1ó2ráki
+ó2r1ál
+1ó2rámé
+1ó2rámo
+1órámr
+ó2r1á2p
+órá2se
+2óráta
+ór1átv
+ór1br
+ór1ege
+ó2r1e2gy
+ó2r1e2le
+ór1ell
+ór1elm
+ó2r1elo
+ó2r1e2lő
+ór1elv
+ór1emb
+ór1eml
+ó2r1e2r
+ó2r1e2set
+ó2r1e2tá
+ó2r1e2té
+ó2rezü
+ór1é2je
+ó2r1é2l
+ór1é2ri
+óré2vek
+ór1fl
+órhá2zot
+óri2aka
+óri2al
+ó2riási
+óriás3s
+óri2ch
+ó2r1id
+ó2r1int
+ór1i2onn
+ór1i2ono
+2órip
+ó2r1i2pa
+ó2r1i2si
+ó2r1isme
+2órit
+óri2z
+ór1izo
+ór1í2j
+ó2r1ír
+ór1í2z
+ór1kl
+órmé2s
+ór1o2ká
+ó3roké
+ór1o2ki
+óro2kok
+óro2koz
+ór1o2ku
+ór1okú
+ó2r1osz
+ó2r1o2x
+ó2r1óda
+óró2dáj
+órói2ko
+óró1p
+ór1ósá
+2óróz
+ó2r1ö2l
+ó2r1öml
+ó2r1ös
+ó2r1öt
+ór1őr
+ór1p2r
+ór1trá
+óru2mag
+óru2me
+ó2r1u2r
+óru2sab
+óru2san
+óru2se
+órus3s
+óru2sü
+óru2s3z
+ó2r1uta
+ó2r1ú2s
+ó2r1út
+ór1ün
+ór1ü2v
+ór1üz
+2ósabl
+ó2s1a2d
+ó2s1a2g
+ó2s1alj
+ós1alt
+ós1amn
+ó2s1apr
+2ósar
+ó2s1arcot
+ó2s1asp
+ós1ass
+ó2s1atl
+ó2s1au
+ósa2vo
+ó2s1ábr
+ó2s1áf
+óság1g
+ó2s1áll
+ós1á2lo
+ó2s1á2ro
+ós1áti
+2ósáto
+ós1bl
+ós1br
+óscsap1á2
+2óseb
+ós1e2gy
+2ósej
+ós1elj
+ós1elm
+ós1e2lő
+ós1els
+ós1elv
+óse2m
+ós1emb
+ós1emi
+ó2s1en
+óse2p
+ós1epo
+ós1erő
+ó2s1es
+ó2s1e2t
+ó2s1ez
+ó2s1é2l
+2ósém
+ós1é2ne
+ó2s1ép
+ó2s1ér.
+ó2s1érte
+2ósét
+ósé2táka
+ó2s1é2te
+ós1étk
+ós1étt
+ós1fr
+ó2s1i2d
+ósi2g
+ós1ige
+ósi2kerb
+2ósikl
+ós1ind
+ós1inf
+ósi2p
+ós1ipa
+ós1iro
+ó2s1isk
+ós1ist
+2ósík
+ó2s1ính
+ós1í2rá
+ós1í2ró
+ó1s2kat
+ós2kic
+óski2s
+ós1kl
+ós1kv
+ós2lag
+2óslá
+ó1s2ni
+2ósokas
+2ósokko
+2ósoks
+ós1oli
+2ósor
+ó2s1org
+ó2s1orj
+ó2s1orm
+ó2s1ott
+ó2s1ov
+ó2s1ó2r
+ó2s1ö2l
+ó2s1ös
+ó2s1öt
+ós1őr
+ó1s2pec
+2ó1s2pek
+2ó1s2pir
+ós1pl
+ó1s2pu
+ós1s2k
+ós1s2p
+ós3sze
+ós3szö
+2ó1s2tab
+ó1s2tad
+ó1s2taf
+2ó1stand
+2ó1s2tat
+2óstá
+ós2tább
+ó1s2tád
+ó1s2tát
+ó1s2tég
+2óstí
+ós2topo
+2óst2r
+ós1tré
+ós1tri
+ó1stru
+2óstú
+2ósug
+ó2s1u2r
+ó2s1u2t
+ós1úr.
+ós1ú2ri
+ós1úrn
+2ósül
+2ósür
+ó2s1üs
+ó2s1üz
+2ósűrí
+2ósza
+ó2s3zac
+ósza2k1ü
+ó2sz1a2lap
+2ószá
+ószá2gol
+2ószed
+2ószeg
+ó2sz1e2gű
+2ószek
+2ószel
+2ószem
+2ószen
+2ószer.
+2ószere
+ósze2r1e2pé
+2ószerk
+2ószerv
+2ószerz
+2ószez
+2ószé
+ószé2n1é2
+2ószi
+ó2szima
+2ószí
+2ószk
+ósz2l
+2ószob
+2ószoc
+2ószof
+2ószol
+2ószon
+2ószó
+2ószö
+ó2sz1ös
+2ósző
+2ószp
+ós3zs
+2ószt
+ó1sz2tá
+ószt2rá
+2ószú
+2ószü
+ó2sz1üg
+2ószűk
+2ószűré
+2ószűrő
+ó2s3zűrt
+ósz2v
+ót1adó
+2ótag.
+2ótaga
+óta2gal
+2ótagb
+2ótag1g
+2ótagi
+2ótagj
+2ótagk
+2ótagn
+2ótago
+2ótags
+2ótagu
+ót1ajk
+2ótalap
+2ótalá
+ót1alk
+ó2t1alm
+2ótan
+ót1anti
+2ótap
+2ótar
+ótas2
+ó2t1ass
+2ótat
+ót1a2ur
+2ótax
+2ótág
+ót1á2ga
+ót1ágg
+2ótáp
+ótára2d
+ótá2r1ada
+2ótáro
+2ótárs
+2ótávc
+2ótávi2
+ótá2v1ir
+2ótáví
+2ótávk
+ó2t1e2g
+ó2t1elh
+ó2t1e2lő
+ó2t1emb
+ó2terd
+ót1égé
+ó2t1é2ké
+óté2t1ö2
+ót1fr
+ó2t1i2d
+óti2g
+ó2t1igé
+ót1ill
+ó2t1im
+ó2t1ing
+ót1i2pa
+óti2sz
+ó2t1í2r
+ó2t1í2v
+ó2t1íz
+ót1kr
+ótlé2ke
+2ótoj
+2ótol
+ótol2l1a2d
+ót1oml
+2óton
+2ótor
+ó2t1ors
+2ótov
+2ótó.
+2ótón
+ót1öko
+ótőe2
+ót2rad
+ót2raf
+ót2rak
+ót2ran
+ót2rén
+ót2rik
+ót2ril
+ót2rió
+ót2rom
+ót1sl
+ót1sp
+ótsze2r1ep
+ótu2sze
+ót1ülé
+ót1ü2lő
+ót1üst
+ó2t1ü2v
+ótű2z3s
+ó1u
+óu2bo
+óu2ga
+óugrás1s
+óuj2j1a2da
+óu2ni
+óu2no
+óu2ra
+óu2sz
+óu2ta
+óu2tá
+óu2to
+óu2tó
+óu2tu
+ó1ú
+óú2jí
+óú2ré
+óú2sz
+óú2ti
+óú2to
+ó1ü
+óü2gy
+óü2le
+óü2lé
+óü2lő
+óü2nő
+óü2re
+óü2rí
+óü2rü
+óü2sz
+óü2te
+óü2té
+óü2tő
+óü2ve
+óü2ze
+ó1ű
+óű2ző
+2óvad
+2óvag
+2óvaj
+2óvak.
+2óvaks
+2óvaku
+2óvaló
+2óvar
+2óvas
+ó2vat
+2óvág
+2óvák
+2óvál
+2óván
+óvá2r1al
+óvárosi2h
+ó2vása
+1ó2vási
+ó2váso
+1ó2vásr
+1ó2váss
+1ó2vást
+2óváz
+óve2r1a
+óveri2
+óve2rip
+óv1in
+1ó2vod
+ó2vom
+2óvon
+óza1d2
+óz1a2dá
+óz1a2dó
+2ózaj
+óz1akc
+óza1kr
+óz1akt
+óz1a2la
+óz1arc
+óza1s
+óza2t1a2l
+óza2tan
+óza2tál
+óza2tés
+óza2told
+óza2t1ü2
+2ózav
+ó2z1á2g
+óz1áll
+ó2z1á2ru
+ó2z1á2rú
+óz1bl
+1ózdi
+ó2z1e2g
+ó2z1el
+óz1em
+óz1erő
+ó2z1ex
+óz1ez
+ó2z1é2l
+ó2z1é2te
+óz1fl
+óz1fr
+ózhajói2
+óz1imp
+óz1ing
+ó2z1i2p
+ózi2s1e2
+ózi2sir
+ózis3s
+ózi2s3z
+ó2z1old
+ózo2n1a2
+ózo2n1á
+ózo2ni
+ózós2
+ózó1sp
+óz1őr
+óz1pr
+ózsa1k2
+ó2z3ser
+óz3sor
+óz3sz
+óz1t2r
+2ózuh
+ó2z1u2r
+ó2z1u2t
+óz1ú2s
+ó2z1út
+óz1ü2g
+óz1ül
+óz1ü2z
+2ö.
+ö1a
+ö1á
+öb1a2n
+öb1ál
+öb1á2r
+öb1át
+öb2b1a2
+öb2b1á2
+öb2b1eg
+öbbe2l
+öb2b1ele
+öbbe2m
+öbb1eme
+öb2b1e2r
+öb2b1esz
+öbb1eve
+öb2bél
+öb2bid
+öb2b1is
+öb2bí
+öb2b1ol
+öb2b1os
+öb2bot
+öb2bó
+öb2bö
+öbbü2
+öb2b1ül
+ö2b1ef
+ö2b1eg
+ö2b1e2l
+ö2b1e2m
+ö2b1e2n
+ö2b1er
+ö2b1él
+ö2b1ér.
+ö2b1érté
+ö2b1érz
+öb1fr
+ö2b1i2d
+ö2b1ing
+ö2b1int
+1öbli
+1öblö
+öb1or
+öb1ón
+ö2böll
+1öböltő
+öc1aj
+öccs1a2
+öccs1i
+ö2c1ép
+ö2c1éve
+öc3he
+öc3hö
+öció2
+öc1őr
+ö2cs1a
+öcs1éj
+öcs1ék
+ö2cs1é2te
+ö2csiz
+öcs1izz
+öcs1ó
+ö2cs1ö2l
+öcs1ű2r
+öc3sz
+öd1a2l
+öd1a2n
+öd1ar
+öd1á2l
+öd1ár
+ö2d1ef
+öd1ell
+ö2d1em
+öd1e2vé
+ödé2m1o
+ödé2sa
+ödés3s
+ödé2s3z
+ö2d1é2ves
+öd1é2vén
+öd1é2vér
+öd1gr
+öd1íz
+öd1os
+öd1óc
+öd1ó2r
+öd1sp
+öd1u2s
+öd1új
+öd1ú2s
+ö2d1üv
+ö2d1űz
+öd3zá
+ödzáró2
+öd3zu
+ö1e
+ö1é
+öfés3s
+ög1ab
+ög1a2c
+ög1a2d
+ög1ag
+ög1a2k
+ög1a2l
+ög1a2n
+ög1ap
+ög1ar
+ög1as
+ög1a2t
+ög1áb
+ög1ág
+ög1á2l
+ög1á2r
+ög1át
+ög1dr
+ö2g1e2g
+ö2g1e2kéi
+ög1elb
+ö2ge2leme
+ö2g1elf
+ö2g1elha
+ö2g1elm
+ö2g1elo
+ö2gemel
+ö2g1er
+ö2g1esz
+ög1e2vé
+ö2g1é2g
+ög1ékt
+ö2g1é2p
+ö2g1ér.
+ö2g1érs
+ög1érté
+ögés3s
+ög1fr
+ö2g1id
+ö2g1i2m
+ög1inf
+ö2g1ist
+ö2g1iva
+ö2g1i2z
+ög1ín
+ög1ír
+ög1ív
+ög1kr
+ög1o2l
+ög1op
+ög1o2r
+ög1os
+ög1ó2r
+ög1öli
+ög1ölö
+ö2g1öv
+ög1pr
+ögre1p2
+ög1sk
+ög1sp
+ög1tr
+ög1ud
+ög1u2n
+ög1u2t
+ö2g1üg
+ö2g1üs
+ö2g1üt
+ö2g1üv
+ö2g1üz
+ö2g1űz
+ög3ya
+ö1i
+ö1í
+öj2tél
+öj2t1o
+ök1ab
+ök1a2g
+ök1a2k
+ök1a2l
+ök1a2n
+ök1a2p
+ök1ar
+ök1as
+ök1a2t
+ök1au
+ök1a2v
+ök1ág
+ök1ál
+ök1á2p
+ök1á2r
+ök1át
+ök1áz
+ök1dr
+ö2k1e2d
+ö2k1e2g
+ö2k1eke
+öke2l
+ök1ela
+ök1ele
+ök1elh
+ök1elm
+ök1eln
+ök1elő
+ök1elv
+ö2k1e2m
+öke2né
+öken1s
+ök1erd
+ö2k1e2resz
+ö2k1e2rő
+ö2k1es
+öke2vés
+ö2k1ez
+ö2k1ég
+ö2k1ékn
+ök1éks
+ök1é2les
+ö2k1ép
+öké2r1e2l
+öké2r1em
+ö2k1é2rez
+ö2k1é2rés
+ökés3s
+ö2k1é2te
+ö2k1é2ve.
+ö2k1é2vek
+ök1é2vet
+ök1fr
+ök1gl
+öki2d
+ök1ide
+ök1ido
+öki2g
+ök1iga
+ö2k1igé
+ö2k1ikt
+ö2k1i2na
+ök1ind
+ö2k1ing
+ö2k1int
+ö2k1i2o
+ö2k1i2p
+ö2k1iro
+ö2k1is
+ö2k1iz
+ök1íj
+ö2k1ír
+ök1ív
+ök1íz
+ök1kl
+ök1k2r
+1öklű
+ök1ok
+ök1old
+1ökoló
+1ökon
+ök1o2p
+ök1o2ro
+ök1orr
+ök1ors
+ök1o2v
+ök1ó2r
+ök1óv
+1ökör.
+ökö2rö
+ökőár1a2d
+ökőé2
+ök1pr
+1ökrös
+1ökrü
+1ökrű
+ök1sp
+ök1sr
+ökszi2l1
+ök1t2r
+ök1u2n
+ök1u2r
+ök1us
+ök1u2t
+ök1új
+ök1úr
+ök1út
+ö2k1üg
+ökü2l
+ö2k1ülé
+ö2k1ült
+ö2k1ü2t
+ö2k1ü2v
+ö2k1üz
+öl1a2d
+öl1ag
+öl1a2j
+öl1a2k
+öl1al
+öl1ap
+öl1a2r
+öl1au
+öl1a2v
+öl1á2g
+öl1ál
+öl1á2m
+öl1á2p
+öl1á2r
+öl1á2s
+öl1át
+öl1á2z
+öl1br
+ölcsa2l
+ölcs1á2p
+ölcs1á2r
+ölcs1ell
+öl2csev
+öl2csid
+öl2csiz
+öl2cs1ok
+ölcs1ol
+öl2csos
+öl2csüg
+öl2csül
+öl2dab
+öl2d1a2d
+öl2d1a2k
+öl2d1a2la
+öl2d1alj
+öl2d1alk
+öl2d1a2n
+öl2dap
+öl2d1as
+öl2d1á2
+öl2deg
+öl2dep
+öl2dev
+öl2d1éd
+öl2dél
+öl2d1ing
+öl2dip
+öl2d1o2r
+öl2dos
+öl2d1ó2
+öldő2
+öl2dőr
+öl2dős
+öl1dró
+öl2dur
+öl2d3z
+1ö2l1e2b
+öle2gel
+öleg1g
+ö2lel
+ö2l1e2r
+ö3l2e3sü
+öle2t1á2
+öle2t1el
+öle2to
+öle2t1u
+ö2l1e2v
+ölé2d
+ö2l1éde
+1ö2léé
+ö2l1é2g
+ö2l1é2kes
+ö2l1ékí
+ö2l1él.
+ö2l1é2le
+ö2l1é2lé
+ö2l1élh
+ö2l1é2li
+ö2l1élj
+ö2l1éln
+ö2l1éls
+ö2l1élt
+ö2l1élv
+ö2l1éme
+ö2l1é2neke
+ö2l1é2p
+ö2l1ér.
+ö2l1é2red
+ö2l1é2rek
+ö2l1é2rezn
+ö2l1éré
+ö2l1érh
+ö2l1é2ri
+ö2l1érj
+ö2l1érk
+ö2l1érl
+ö2l1érn
+ö2l1érs
+ö2l1érte
+ö2l1érté
+ö2l1értü
+ö2l1é2rü
+ö2l1érv
+ö2l1érz
+ölés3s
+ö2l1é2tet
+öl1fr
+ölgyá2
+öl2gyer
+ö2l1i2d
+öli2g
+ö2l1iga
+ö2l1igé
+ö2l1igy
+ö2l1ij
+ö2l1il
+ö2l1im
+ö2l1i2n
+ö2l1i2p
+ö2l1i2r
+ö2l1i2s
+ö2l1i2ta
+ö2l1itt
+ö2l1iz
+öl1í2r
+öl1í2v
+öl1o2c
+öl1o2k
+öl1ol
+öl1or
+öl1o2s
+öl1ó2v
+ölö2ki
+ö2l1ökl
+ö2l1öl
+öl1önt
+ö2l1ör
+ö2l1ö2v
+öl1őrl
+öl1őrö
+ölpárba2
+öl1p2r
+öl1sk
+öl1sr
+öl1st
+öl2t1ad
+öl2taj
+ölt1ala
+ölt1alj
+ölta2n
+öl2tid
+öl2til
+öl2tí
+öl1tro
+öl2tur
+öl1u2g
+öl1uj
+öl1u2s
+öl1u2t
+öl1új
+öl1ús
+ö2l1üd
+ö2l1üg
+ölü2le
+öl1ülté
+ö2l1ültö
+ö2l1ülve
+ö2l1üs
+ö2l1üt
+ö2l1üv
+ö2l1üz
+ö2l1űz
+ö2ly1a2
+ö2ly1á
+öly1e2g
+ö2lyel
+öly2föl
+öm1a2d
+öm1a2g
+öm1al
+öm1a2n
+öm1a2p
+öm1ar
+öm1au
+öm1áb
+öm1ág
+öm1áh
+öm1ál
+öm1áp
+öm1á2r
+öm1á2t
+öm1áz
+öm2b1a2c
+öm2b1ak
+ömba2l
+öm2b1a2n
+öm2baz
+öm2b1á
+öm2bec
+ömb1ele
+öm2b1e2m
+öm2b1es
+öm2bék
+öm2b1i2d
+öm2bin
+öm2bí
+öm2b1os
+öm2b1ó2
+öm2bú
+öm2bür
+ö2m1e2b
+öme2g1a2
+ömeg1e2r
+öme2gesz
+öme2g1ék
+öme2gép
+ömeg3g
+öm1egy
+ö2m1e2l
+ö2m1ember
+ö2m1emel
+ö2m1e2r
+öme2s
+ö2m1ese
+ö2m1este
+ö2m1ég
+ö2méhs
+ö2m1é2l
+öm1é2nekb
+ö2m1é2neke
+ö2m1é2neké
+öm1é2nekh
+ö2m1é2nekk
+ö2m1é2nekr
+ömé2ny1ü
+ö2m1ép
+ö2m1ér.
+ö2m1érte
+ö2m1érté
+ömés3s
+öm1gr
+ömi2g
+ö2m1igé
+ö2m1in
+ö2m1i2p
+ö2m1i2ta
+ö2m1itt
+ö2m1izm
+ö2m1i2zo
+öm1í2z
+ömkész1
+öm1kl
+öm1kr
+ömlés3s
+1ömlöt
+öm1o2k
+öm1o2l
+öm1or
+öm1os
+öm1ó2d
+öm1ó2r
+ö2m1önt
+öm1p2r
+öm1sp
+öm1st
+öm1tr
+öm1u2g
+öm1uj
+öm1u2t
+ö2m1üg
+ö2m1ünn
+ö2m1üv
+ö2m1üz
+ö2m1űz
+ön1ab
+ön1a2d
+ön1a2g
+ön1a2j
+ön1a2k
+ön1a2l
+ön1am
+ön1a2n
+ön1a2p
+ön1ar
+ön1as
+ön1at
+ön1au
+ön1a2v
+ön1az
+ön1áb
+ön1ág
+ön1ál
+ön1ám
+ön1á2p
+ön1á2r
+ön1á2t
+önát1a2dó.
+önát1é
+ön1áz
+önbé2két.
+ön1bl
+ön2c1ál
+ön2ch
+ön2cő
+önc3ség
+önc3sz
+ön2cz
+ön2dab
+ön2dap
+önde2m
+ön2d1ér.
+ön2d1érn
+ön2d1érr
+ön2d1értő
+ön2d1or
+ön2d1ő
+ön2dz
+ö2n1eb
+ö2n1e2d
+ö2n1ef
+ö2n1e2g
+ö2n1e2l
+ö2n1e2m
+öne2n
+ön1ene
+ö2n1e2r
+ö2n1es
+ön1e2v
+ön1ex
+ön1é2g
+ö2n1éj
+ö2n1é2k
+ö2n1é2l
+ö2n1é2p
+ö2nérd
+ön1éri
+ön1érl
+ön1érte
+ön1érv
+önés3s
+ön1ész
+ö2n1éte
+ö2n1étt
+ö2n1év.
+ö2n1éves
+ön1évet
+ö2n1é2vér
+ö2n1é2vét
+ö2n1évv
+önfe2lem
+ön1f2r
+ön1g2l
+ön1g2r
+öngy1as
+ön2gyék
+öngy1ó2r
+2öngyö
+ön2győ
+ö2n1i2d
+ön1if
+öni2g
+ö2n1iga
+ön1ige
+ö2n1igé
+ön1ill
+ö2n1im
+ö2n1in
+ö2n1i2p
+ö2n1i2r
+ö2n1is
+ön1ita
+ö2n1i2z
+ön1íj
+ö2n1ír
+ö2n1íz
+ön2k1ag
+ön2k1any
+önk1áru
+ön2kát
+önk1olt
+ön2k1ú
+önkü2
+önmeg1g
+önna2k
+ön2n1á
+önny1a2d
+önny1á
+önny1e2dz
+ön3nyú
+ön1o2d
+ön1o2k
+ön1op
+ön1or
+ön1os
+ön1ox
+ön1ó2c
+ön1ó2r
+ön1óv
+ön1öb
+ö2n1ör
+ö2n1ö2v
+ön1őr
+önő2re
+ön1őz
+ön1pl
+ön1pr
+ön1ps
+önségü2ké
+ön1s2p
+ön1s2t2
+önsz2
+ön2t1ell
+öntgen1n
+öntös3s
+1öntöz
+ön1t2ra
+ön1t2rá
+ön1t2ré
+ön1ud
+ön1un
+ön1u2r
+ön1u2s
+ön1u2t
+ön1új
+ön1ú2s
+ön1út
+ön1üd
+ö2n1ü2g
+ö2n1ür
+ö2n1ü2t
+ö2n1üz
+ö2ny1a2
+ö2ny1á
+öny1d
+ö2ny1el
+ö2ny1id
+ö2ny1in
+ö2nyí
+ö2ny1o
+ö2nyüz
+öny2vaj
+öny2v1a2l
+öny2van
+öny2v1á2r
+öny2v1e2g
+öny2v1er
+öny2v1esz
+öny2vev
+öny2v1ég
+öny2vél
+öny2v1ér.
+öny2v1ill
+öny2v1í
+öny2v1o
+ö1o
+ö1ó
+ö1ö
+ö1ő
+öp1aj
+öp1a2l
+öp1ál
+öp1e2l
+öpe2nyá
+öp1e2r
+ö2p1ép
+öp1ö2lő
+ör1ab
+ör1a2c
+ör1a2d
+ör1a2g
+ör1aj
+ör1a2k
+ör1a2l
+ör1a2n
+ör1a2r
+ör1as
+ör1a2t
+ör1a2u
+ör1a2x
+ör1a2z
+ör1áb
+ör1á2c
+ör1á2g
+ör1á2l
+ör1á2r
+ör1á2s
+ör1á2t
+ör1br
+örcs1ál
+örcs1ell
+örcskész1
+ör2csos
+2ördí
+ör1d2r
+2ördü
+ö2r1e2c
+ör1e2dz
+ö2r1ef
+öre2ga
+öre2g1ék
+ör1e2gy
+öre2j1á
+öre2k1e2sz
+öreké2
+ö2r1e2l
+ö2r1em
+ör1enc
+ö2r1e2p
+ö2r1e2r
+ör1e2se
+ö2r1e2tető
+ö2r1e2v
+ö2r1ex
+ö2r1ez
+ö2r1é2de
+ö2r1é2g
+ö2r1éj.
+ör1éks
+ö2r1é2l
+ö2r1éneke
+ö2r1ép
+ö2r1éré
+ö2r1é2ri
+öré2sel
+öré2t1e2g
+ö2r1étv
+ör1é2ve.
+ö2r1évk
+ör2fá
+ör2f1év
+ör2f1i2p
+ör2fis
+ör2f1os
+ör2főr
+ör1g2r
+ö2r1i2d
+öri2g
+ö2r1iga
+ö2r1igá
+öri2k
+ör1iko
+ö2r1ill
+ö2r1im
+ö2r1ind
+ö2r1ing
+ö2r1inj
+ö2r1ink
+ö2r1int
+ö2r1inv
+ö2r1i2p
+ö2r1ira
+ö2r1i2s
+ö2r1i2ta
+ör1itt
+ö2r1ivá
+ör1i2zo
+ö2r1ír
+ö2r1í2v
+ö2r1í2z
+ör1k2l
+ör2k1öltő
+ör1k2r
+örle2ta
+ör2l1in
+örny1a2l
+örny1a2n
+örny1as
+örnye2l
+örny1ele
+ör2ny1er
+ör2nyéj
+ör2nyés
+örny1í2r
+ör2nyó
+ör1ob
+ör1o2k
+ör1o2l
+ör1op
+ör1o2r
+ör1os
+ör1ó2r
+2örög
+örö3g2e
+1örömü
+ö2r1önt
+ö2r1ör
+ö2rössze
+ö2r1ösz
+örpe1t2
+ör1s2p
+ör1s2v
+örta2r
+örtá2v1
+ör2t1éks
+örté2l
+ör2t1élé
+ör2t1élő
+ört1érne
+örté2sz
+ör2tív
+ör2t1ok
+ör2top
+ör1ud
+ör1uj
+ör1u2n
+ör1u2r
+ör1u2s
+ör1u2t
+ör1új
+ör1úr
+ör1ú2t
+ö2r1üd
+ö2r1ü2g
+örü2l1ék
+ö2r1ür
+ö2r1üs
+ö2r1üt
+ö2r1ü2v
+ö2r1üz
+1örv.
+örva2s
+1örvb
+1örvek
+1örvem
+1örvet
+1örvéb
+1örvéh
+1örvév
+1örvh
+1örvn
+1örvr
+1örvt
+1örvü
+1örvű
+1örvv
+örz4s
+ör2zs1á2
+ör2zs1e2l
+ör2zsid
+ör2zsin
+ör2zsir
+ör2zs1í2
+ör2zs1o
+ör2zsó
+ör2zsu
+ör2zsú
+ös1a2g
+ös1al
+ös1ár
+ö2s1el
+öses3s
+ö2s1ez
+ösié2
+ö2s1i2p
+ös1k2r
+ös1o2l
+ös1o2r
+összá2r
+1összeg
+össz1emb
+1összes
+ös3szí
+öst1arc
+ö2s1ü2v
+ö2sz1a2
+ösz1e2r
+öszi2s
+ösz1isz
+ö2sz1o2
+ö2sz1ő
+ösz2t1ell
+öt1ab
+öt1aj
+öt1a2k
+öt1a2l
+öt1am
+öt1as
+öt1a2t
+öt1áb
+öt1ág
+öt1ál
+öt1ár
+öt1á2s
+öt1eké
+öt1e2m
+öt1ep
+öt1es
+öte2t1a2
+öte2tel
+öte2u
+öt1e2v
+öt1e2z
+ötélé2
+öté2lék
+öté2l1o
+öt1érté
+öt1érz
+ötés3s
+öt1é2ves
+öt1fl
+öt1fr
+öt1gr
+öt1i2r
+öt1í2v
+öt1kr
+1ötlet
+ötle2t1á
+1ötlé
+öt1ok
+öt1ol
+öt1or
+öt1os
+öt1ó2r
+ö2tödb
+1ö2tödd
+1ö2tödne
+1ötödöt
+1ö2tödr
+1ötödü
+ö2tös
+ötőa2
+ötőe2
+ötőé2
+öt1pr
+öt1sc
+öt1st
+öt2t1a2c
+öt2tar
+öt2t1as
+öt2t1ál
+öttá2r
+ött1erk
+ött1érte
+öt2t1ut
+öt1uj
+öt1un
+öt1u2t
+öt1ü2l
+ötve2n1ez
+ö1u
+ö1ú
+ö1ü
+ö1ű
+öv1ab
+öv1ak
+öv1á2r
+öv1e2dz
+öve2g1a2
+öveg1és
+öveg1g
+öve2go
+öv1e2r
+öve2t1a2
+öve2teg
+öve2t1é2l
+öve2to
+öve2t1ú
+övetü2l
+öve2t1ülé
+ö2vé.
+öv1ég
+öv1é2j
+övé2nyel
+övé2nyer
+övé2nyö
+övé2sza
+övé2szá
+övé2szer
+övé2szo
+övé2szö
+övé2szül
+övi2dá
+ö2vih
+övis3s
+ö2viv
+öv1or
+öv1ó2d
+öv1ölt
+övőrés3s
+öv1ut
+öz1ab
+öz1a2c
+öz1a2d
+öz1a2j
+öz1a2k
+öz1a2l
+öz1a2m
+öz1a2n
+öz1a2p
+öz1a2r
+öz1at
+öz1au
+öz1az
+öz1á2g
+öz1ál
+öz1á2m
+öz1á2p
+öz1á2r
+öz1á2t
+özát1é
+öz1d2r
+ö2z1e2b
+ö2z1e2d
+öze2gel
+ö2z1egés
+özegész1
+ö2z1e2gy
+ö2z1ela
+öze2leme
+ö2z1e2m
+öz1eng
+öz1ent
+öz1epr
+ö2z1er
+ö2z1es
+öze2t1é2k
+özető2
+öze2t1őr
+ö2z1e2v
+ö2z1ég
+ö2z1é2je
+özé2k1e2l
+öz1élel
+öz1é2let.
+öz1é2lé
+öz1élm
+öz1élt
+özé2m
+öz1éme
+özé2p1a
+özé2p1el
+özé2p1em
+özé2pí
+öz1épít
+özé2p1o
+ö2z1ér.
+ö2z1érb
+ö2z1érd
+ö2z1érh
+ö2z1é2ri
+özér2t1e2h
+ö2z1értele
+ö2z1érté
+ö2z1értő
+ö2z1érv
+ö2z1érz
+öz1étk
+öz1fr
+özi2g
+ö2z1iga
+özigaz1
+ö2z1igá
+ö2z1igé
+ö2z1igy
+ö2z1i2ko
+ö2z1ikt
+ö2z1ill
+ö2z1i2m
+ö2z1inf
+ö2z1ing
+ö2z1inp
+ö2z1int
+ö2z1inú
+ö2z1inv
+ö2z1ira
+öz1irá
+ö2z1i2ri
+öz1iro
+ö2z1iró
+öz1isko
+ö2z1ism
+ö2z1isp
+ö2z1i2sz
+ö2z1iz
+öz1ír
+öz1íz
+özmeg1g
+öz1ob
+öz1o2k
+öz1ol
+öz1op
+öz1os
+öz1ov
+öz1ó2h
+öz1ón
+1özönt
+ö2z1ö2r
+öz1össz
+ö2z1öv
+özőa2
+özőe2r
+öz1őr.
+öz1őrk
+öz1ő2rö
+öz1pl
+öz1p2r
+öz3sa
+öz3sá
+öz3se
+öz3sé
+öz3s2k
+öz3so
+öz3s2p
+öz3sú
+öz3sz
+öz1t2r
+öz1ug
+öz1u2n
+öz1ur
+öz1ut
+öz1ú2r
+öz1út
+ö2z1üd
+ö2z1ü2g
+öz1ünn
+ö2z1üt
+ö2z1üv
+ö2z1ü2z
+öz3zs
+2ő.
+ő1a
+őa2da
+őa2dá
+őadás1s
+őadá2sz
+őa2do
+őa2dó
+őa2du
+őa2ga
+őa2gá
+őa2gi
+őa2gy
+őagyag1
+őa2ja
+őa2já
+őa2ka
+őa2ká
+őa2kó
+őa2la
+őala2g1
+őa2l1e
+őa2lo
+őa2mő
+őa2na
+őa2no
+őa2nó
+őa2nyá
+őa2pa
+ő2apar
+őa2pá
+őa2po
+őa2pó
+őa2pu
+őa2ra
+őa2rá
+őa2ri
+őa2ro
+őa2sz
+őa2to
+őa2ty
+őa2ul
+őa2ur
+őa2ut
+őautói2k
+őa2va
+őa2xi
+őa2zo
+ő1á
+őá2cs
+őá2gai
+őá2gak
+őá2gas
+őá2gat
+őá2gá
+őá2gé
+őá2gi
+őá2go
+őá2gú
+őá2gy
+őá2hí
+őá2la
+őá2lo
+őá2mí
+őá2po
+őá2ra
+őá2rá
+őá2re2
+őár1em
+őá2ri
+őá2ro
+őá2ru
+őá2rú
+őá2sa
+őá2sá
+őá2so
+őá2só
+őá2su
+őá2sz
+őá2ta
+őá2t1á2
+őá2t1e2
+őá2té
+őá2tí
+őá2tü
+őá2vó
+őba1p
+őb2le
+őb2lo
+őb2ri
+őb2ro
+őb2ró
+őb2ru
+őc1ap
+őc3cso
+őc1gr
+őc3há
+őc3hé
+őc3hö
+őc2lu
+ő2cs1ala
+őcsa2p1á2g
+ő2cs1é2j
+ő2cs1é2rü
+őcs1őst
+őcs1s
+őc3sz
+őd1a2da
+őd1a2dá
+ő2d1a2lap
+ő2d1au
+őd1ál
+őd1á2z
+ődea2
+ő2d1e2g
+őd1eld
+őd1elj
+őd1elk
+őd1e2lő
+őd1els
+ő2d1ép
+ő2d1érte
+ő2d1érz
+ődé2sa
+ődé2so
+ődés3s
+ődé2s3z
+ő2d1id
+ődi2g
+ő2d1iga
+őd1ind
+őd1int
+ő2d1isk
+ő2d1op
+őd1ost
+ő2d1ö2l
+ő2d1öv
+őd1őr.
+őd1ő2ré
+őd1őrn
+őd1őrr
+őd1őrt
+ő2d1őst
+őd1pr
+őd2ram
+őd2rap
+ő1d2rá
+ő1d2res
+ő1d2rog
+ő1d2ró
+ő1d2ru
+őd1st
+őd1t2r
+ő2d1üg
+ő2d1üz
+ő2d3zá
+ő1e
+őe2ce
+őe2cs
+őe2dé
+őe2dz
+őe2ge
+őe2gé
+őe2gy
+őe2ke.
+őe2kék
+őe2la
+őe2l1á2
+őe2lek
+őe2lemé
+őe2lemg
+őe2lemh
+őe2lemm
+őe2lemn
+őe2lemr
+őe2lemü
+őe2li
+őe2lo
+őe2lö
+őe2lőd
+őe2lü
+őe2ma
+őe2me
+őe2mé
+őe2mu
+őe2ne
+őe2pi
+őe2po
+őe2re
+őe2ré
+őe2rőd
+őe2rőé
+őe2rőh
+őe2rői.
+őe2rők
+őe2rőm
+őe2rőrő
+őe2rü
+őe2sé
+őe2si
+őe2ső
+őe2ta
+őe2te
+őe2ti
+őe2un
+őe2vé
+őe2vi
+őe2vo
+őe2vő
+őe2ze
+ő1é
+őé2de
+őé2et
+őé2ge
+őé2gé
+őé2gi
+őé2gő
+őé2hem
+őé2hes
+őé2ji
+őé2ke
+őé2ké
+őé2kí
+őé2lé
+őé2lő
+őé2lű
+őé2nekb
+őé2neke
+őéne2kest
+őé2neké
+őé2nekk
+őé2nekr
+őé2pí
+őé2pü
+őé2rem
+őé2ren
+őé2rez
+őé2ré
+őé2ri
+őé2tek
+őé2va
+őé2ve.
+őé2vek
+őé2ves
+őé2vet
+őé2véb
+őé2vén
+őé2vér
+őé2vét
+őé2vi
+őfa2l1a2d
+őf2la
+őf2le
+őf2lo
+őf2ló
+őf2lö
+őf2lu
+őfo2kál
+őfo2kér
+őfo2kin
+őf2ra
+őf2rá
+őf2ri
+ő1f2ro
+őf2rö
+őgé2p1e2l
+őgépü2l
+őgép1ülé
+őgés3s
+őg2le
+őg2ló
+őg2nó
+ő2g1ö2l
+őg2ra
+őg2rá
+őg2ri
+őg2ró
+őguba2
+őgy1a2la
+őgy1art
+ő2gyeg
+ő2gyel
+őgy1e2lő
+őgy1elv
+őgy1elz
+ő2gyin
+ő2gy1ör
+őhangá2
+őhan2g1ára
+ő1i
+ői2dea
+ői2deá
+ői2deg
+ői2deo
+ői2dén
+ői2do
+ői2dő
+ői2ga
+ői2ge
+ői2gé
+ői2gy
+ői2ko
+ői2ma
+ői2má
+ői2mi
+őim1p2l
+ői2nas
+ői2on
+ői2pa
+ői2ra
+ői2rá
+ői2ri
+ői2ro
+ő2iru
+ői2si
+ői2sz
+ői2tala
+ői2talá
+ői2talé
+ői2tali
+ői2tall
+ői2va
+ői2vá
+ői2vó
+ői2zé
+ői2zo
+ő1í
+őí2gé
+őí2ja
+őí2ra
+őí2rá
+őí2ro
+őí2ró
+őí2ru
+őí2vá
+őí2ve
+őí2vé
+őí2vi
+őí2vükb
+őí2vüke
+őí2vün
+őí2vű
+őí2ze
+őí2zü
+őí2zű
+ője2gy1á2
+őjob2b1ol
+őjob2b1ó
+őjogá2szi
+őke1k2
+őke1p2
+őkes2
+őke1sp
+őke1st
+őké2p1el
+őké2s1el
+őkiá2
+őkie2
+ők2la
+ők2le
+ők2li
+ők2lí
+ők2ló
+ők2lu
+őkóro2
+ő1k2ra
+ő1k2rá
+ő1k2reá
+ők2red
+ő1k2ré
+ő1k2ri
+ő1k2rí
+ő1k2ro
+ő1k2ró
+ők2va
+őleí2
+őlés3s
+őlőé2r
+őlőt2
+őlő1tr
+őma2gár
+őmag1g
+őma2g1ó2
+őműé2h
+őműé2n
+őműt2
+ő2n1e2ke
+őn1ems
+őnéve2
+őnév1es
+ő2ny1a2d
+őnya2g
+ő2ny1aga
+őny1a2la
+őny1ára
+őny1á2ro
+ő2nyát
+ő2nyef
+őnye2lem
+ő2ny1elh
+ő2ny1ell
+ő2ny1elo
+ő2ny1em
+ő2ny1élv
+ő2ny1ő
+ő2nyüz
+ő1o
+őo2áz
+őo2be
+őo2dú
+őo2ká
+őo2k1i2
+őo2kí
+őo2ko
+őo2la
+őola2j1á2r
+őola2je
+őo2pe
+őo2rá
+őo2ri
+őo2ro
+őo2so
+őo2ve
+őo2xi
+ő1ó
+őó2ce
+őó2ha
+őó2no
+őó2nu
+őó2ra
+őó2rá
+őó2ri
+őó2va
+őó2vó
+ő1ö
+őö2bö
+őö2dé
+őö2ko
+őö2kö
+őö2lé
+őö2lő
+őö2na
+őö2re
+őö2rö
+őö2ve
+őö2vé
+őö2vi
+őö2vö
+őö2zö
+ő1ő
+őő2re
+őő2ré
+őő2ri
+őő2rö
+őőr2s1égb
+őőr2s1égn
+őő2se
+őő2si
+őpárba2jo
+őp2la
+őp2le
+őp2lé
+őp2ne
+őponc1
+őpo2ral
+őp2re
+őp2ré
+őprés1s
+őp2ri
+őp2ro
+őp2ró
+őp2sz
+őr1a2dó
+őr1a2gá
+őr1agg
+őr1ajk
+őraj2t1ól
+őr1akc
+ő2r1a2l
+őral1e
+őra2n
+őr1any
+őr1ap
+ő2r1a2r
+ő2r1a2s
+ő2r1at
+ő2r1au
+ő2r1a2z
+1ő2r1áb
+őrádi2ók
+őr1ágy
+őrá2k1e
+ő2r1á2l
+ő2r1á2p
+őr1á2ru
+1őrbí
+1őr1bl
+1őr1br
+2őrea
+őreá2li
+őree2
+őre2get
+őr1e2gye
+őrei2g
+ő2r1ekc
+ő2r1ekh
+őre2lem
+őr1elh
+ő2r1ell
+őr1e2lőa
+őr1els
+őr1elt
+ő2r1elv
+ő2r1emb
+őr1eml
+őren2d1ő2
+őr1enz
+őreo2
+őre1prog
+ő2r1e2ső
+őreu2
+őreü2
+ő2r1ex
+1őrezr
+1ő2r1ég.
+1őrégn
+1őr1égt
+1ő2r1ékh
+őr1ékné
+őr1éks
+ő2r1é2l
+őr1épü
+ő2r1é2ri
+őré2sa
+őré2sza
+1ő2réü
+őr1é2ve.
+őr1é2vek
+őr1fl
+1őrfő
+őr1fr
+őr1g2r
+ő2r1i2d
+ő2r1if
+ő2r1i2ga
+ő2r1i2gá
+őr1iha
+őr1ill
+ő2rim
+őr1imi
+őr1i2na
+őr1ind
+ő2r1inf
+ő2r1int
+őr1i2pa
+őri2s1á
+őr1ivá
+őr1i2zé.
+ő2rizg
+őr1izm
+őr1i2zo
+őr1ír
+1őrjö
+őr1k2l
+őr1k2r
+1őrlö
+ő2r1okt
+őr1old
+1ő2r1o2li
+őr1oll
+ő2r1or
+ő2r1osz
+ő2r1ó2r
+ő3rög
+1ő2rökü
+ő2röl
+1őrömü
+őr1öng
+ő2r1ör
+ő2r1össze
+1ő2r1őr
+ő2r1ő2s
+1őrősr
+ő2r1ő2z
+őr1pl
+őr1p2r
+1őr1p2s
+1őrs.
+őr2s1ál
+1őrsí
+1őrsö
+őr1s2pe
+őr1spi
+őr1srá
+őrs3s
+őr1sz2
+1őrszen
+őr2s3zöm
+1őr1t2r
+1ő2r1un
+1ő2r1u2r
+őr1utá
+ő2r1új
+őr1úr
+ő2r1út
+ő2r1üd
+őr1üld
+1ő2rüle
+ő2r1üs
+ő2r1üt
+ő2r1üz
+2őrzősö
+ő2s1ad
+ő2s1a2g
+ős1ajtób
+ő2s1ajtók
+ősa2n
+ős1ana
+ősa2p
+ős1arc
+ős1ass
+ős1au
+ő2s1áb
+ő2s1á2g
+ősá2l
+ős1áll
+ős1ára
+ős1árv
+ős1dr
+ős1e2d
+ő2s1e2ge
+ő2s1e2gy
+ős1elm
+ős1e2lő
+ős1elv
+ő2s1e2m
+őse2n
+ős1ene
+őse2p
+ős1epi
+ős1epo
+ős1e2rej
+ős1erő
+ős1ess
+ős1esz
+ős1etn
+ő2s1e2v
+ő2s1ez
+ősé2g1e2l
+ő2s1éger
+ősé2gés
+ő2s1ék
+ő2s1é2l
+ős1ép
+ős1fl
+ős1fr
+ős1gn
+ős1gr
+ő2s1i2d
+ő2s1if
+ősi2g
+ős1iga
+ős1i2ma
+ős1i2má
+ős1imi
+ős1inf
+ős1ing
+ős1int
+ő2s1i2pa
+ős1i2ra
+ős1ist
+ős1i2sz
+ő2s1i2z
+ősí2ka
+ős1í2ró
+ős1í2z
+ős2kál
+ős1kl
+ős1k2r
+ős1kv
+ős2lat
+ős2nit
+ős1ob
+őso2k
+ős1oko
+ő2s1o2l
+ő2s1op
+ő2s1org
+ő2s1os
+ős1óc
+ős1óri
+ő2s1ö2l
+ős1önz
+ősö2r
+ős1örd
+ős1öre
+ős1örö
+ős1örv
+ő2s1ö2z
+ős1őr
+ős1ő2s
+ős2pec
+ős2pek
+ős1p2l
+ős2pór
+ősp2r
+ős2rác
+ős1sk
+ős1s2p
+ős1s2t
+őssz2
+ős3sza
+ős3szá
+ős3szeg
+ős3szek
+ős3szell
+ős3szem
+ős3szen
+ős3szer
+ős3szes
+ős3szék
+ős3szén
+ős3szf
+ős3szi
+ős3szí
+ős3szl
+ős3szo
+ős3szó
+ős3szö
+ős3sző
+ős3szu
+ős3szü
+ős2tad
+ős2tat
+ő1s2tát
+ő1s2teri
+ős2tég
+ős2til
+őst2r
+ős1tre
+ős1un
+ősu2t
+ős1uta
+ős1úr.
+ős1ú2s
+ősza2k1e
+ősza2k1ü
+ősz1e2lő
+2őszerk
+ő2szerő
+ősz1est
+őszi2l1i2
+ősz1ill
+ősz1ist
+őszö2l
+ősz1ölé
+ősz1ölő
+ősz1ölt
+ős3zse
+ősz3sir
+őszt2
+ő2s3zűrű
+őtermo1
+őtermosz2
+őtes2t1ő
+őtol2l1a2d
+ő1t2ra
+ő1t2ré
+ő1t2ri
+őt2ro
+ő1t2ró
+őttes3s
+őt2tés
+őtt1int
+őt2t1o2
+őt2t1u2
+őtűfé2
+őtűfél1
+ő1u
+őu2go
+őu2ni
+őu2ra
+őu2rá
+őu2ru
+őu2ta
+őu2tó
+őu2tu
+ő1ú
+őú2jo
+őú2ré
+őú2ri
+őú2ro
+őú2sz
+őú2té
+őú2ti
+őú2to
+ő1ü
+őü2dü
+őü2ge
+őü2gy
+őü2le
+őü2re
+őü2rí
+őü2sz
+őü2te
+őü2té
+őü2ti
+őü2tö
+őü2tő
+őü2ve
+őü2vö
+őü2ze
+őü2zé
+ő1ű
+őű2ré
+őű2ri
+őű2rö
+őű2zé
+őű2ző
+ővasfé2
+ővasfél1
+ővár1al
+őve2r1a
+2ővet
+ővé2res
+ővé2ret
+őz1abs
+ő2z1a2d
+őz1a2g
+ő2z1ak
+ő2z1a2l
+ő2z1a2t
+ő2z1au
+ő2z1ál
+őz1á2t1e2
+őz1bl
+őzeg1g
+őze2g1i
+őz1e2gy
+1ő2zekn
+őz1elo
+őz1els
+őz1elv
+ő2zem
+őz1emb
+őz1e2mel
+ő2z1e2r
+őze2t1a2
+őze2t1eg
+őze2t1el
+őze2ter
+őze2t1o
+ő2z1ér.
+őzé2rem
+ő2z1é2ri
+ő2z1érl
+őz1érté
+1ő2zié
+ő2zi2g
+őz1igé
+ő2z1in
+ő2z1iz
+őz1k2r
+őz1o2k
+őz1ol
+őz1os
+őz1össz
+őzőa2
+őzőe2l
+őzőe2r
+őz1p2r
+őz3saj
+őz3sap
+őz3sát
+őz3sik
+őz3sis
+őz3s2t
+ő2z3sü
+őz3sz
+őz1t2r
+őz1út
+őz1üg
+ő2z1üs
+ő2z1ü2z
+őz1ű2z
+2p.
+1pa
+2p1abl
+pa2cem
+pa2ch
+pa1cl
+pa2csú
+p1a2dag
+pad1ala
+pa2d1as
+pa2d1á2l
+pade2
+pa2d1el
+pa2d1em
+pa2d1id
+pa2d1iga
+p1a2dott
+pa2du.
+pa2dut
+pa2dül
+pae2r
+paé2r
+pa1fl
+pa1f2r
+pa2ga.
+pai2dé
+2p1ajtó
+pa2kad
+paka2r1ó
+pa2k1e2m
+pa2k1ér.
+2pakku
+pa1klu
+pa2k1ó2
+pa1k2ré
+2p1akta.
+pak2tal
+pak2t1e2l
+pak2t1es
+pak2t1e2v
+2p1akti
+pak2t1or.
+pak2t1orr
+pak2tos
+2palag
+pala2g1ú
+pa2lapí
+paláza2d
+palá2z1adá
+pa2l1é2l
+2p1alf
+2p1alg
+2p1alle
+2p1almá
+pal1ud
+pam1ass
+pa2m1ur
+pamu2ta
+pana2d
+pa2n1ag
+pa2nal
+pan1ala
+pa2n1á2r
+panás1s
+pan1d2
+pang1g
+pa2n1il
+pan1kro
+p1anny
+pa2nol
+pans2
+pansz2
+pan1szt
+pa2nü
+2p1a2nya
+p1a2nyu
+pa2p1ad
+pa2p1a2pa
+papa2r
+pap1ara
+pa2p1aszt
+pap1áll
+pa2p1il
+pa2p1i2na.
+pa2p1i2p
+pa2p1o2ku
+pa2pö
+pap1p2
+pa2p1ur
+pa2p1u2t
+pa2pú
+2para.
+para2je
+par1a2la
+2parann
+2p1a2rany
+2pa2r1a2r
+pa2r1ágá
+pa2r1ágn
+pa2r1ágo
+pa2r1ágv
+2paráh
+2p1a2ráj
+par1áll
+2parár
+2paráv
+2parb
+2p1arc.
+2p1arca
+2p1arcc
+2p1arch
+2parci
+2p1arco
+2p1arct
+2p1arcu
+2p1arcú
+pa2r1el
+pa2r1é2l
+2parig
+2paril
+pa2r1ill
+par1isk
+par2k1a2l
+par2k1á
+par2kel
+par2k1ing
+par2kov
+par2kó
+par2kön
+par2k1ö2v
+par2k1ő2
+par2k1ü
+2paros.
+2parosi
+2paroso
+pa2rö
+pa2rő
+2parr
+pars2
+par2tem
+par2t1ol
+par2t1ő2
+pa2r1ü2
+pa2rű
+past2
+pasz1alj
+pasz1alt
+pa2szas
+pat1ada
+patakö2
+pa2t1alk
+pat1anya
+pa2t1ara
+pat1álc
+pa2t1árk
+pa2t1e2g
+pa2t1ell
+pate2s
+pa2tél
+pa2t1ér.
+pa2t1érd
+pa2t1ére
+pa2t1érte
+pa2tid
+pa2t1int
+pa2tir
+2p1atka.
+2p1atkánk
+pa2t1old
+pa2t1olt
+2patombe
+pa2t1osz
+pa2t1otth
+pa2t1ut
+pa2tús
+patü2
+pa2t1üz
+2p1a2tya
+2p1a2tyá
+2paur
+pau2ra
+p1a2vat
+pa1wh
+2p1a2xi
+1pá
+2p1á2bé
+2p1ábr
+2páca
+2pácá
+pá2c1e
+pácé2
+pá2c3h
+pá2c3só
+pá2csö
+pá2csü
+2p1ág.
+2p1á2ga
+2p1ágg
+2p1ágy.
+2p1á2gya.
+2p1á2gyac
+2p1á2gyad
+pá2gyaib
+pá2gyaid
+pá2gyaih
+pá2gyaik
+pá2gyaim
+2p1á2gyain
+pá2gyair
+p1á2gyakb
+pá2gyaké
+pá2gyaki
+p1á2gyako
+2p1á2gyakr
+pá2gyakt
+2p1á2gyal
+2p1á2gyam
+2p1á2gyan
+pá2gyast
+2p1ágyaz
+2p1á2gyáb
+2p1ágyál
+2p1á2gyán
+pá2gyátó
+2p1á2gyáv
+2p1ágyb
+2p1ágyc
+2p1ágye
+2p1á2gyé
+2p1ágyf
+2p1ágyga
+2p1ágygo
+2p1ágyh
+2p1á2gyi
+2p1ágyj
+2p1ágyk
+2p1ágyl
+2p1ágym
+2p1ágyná
+2p1á2gyos
+2p1á2gyö
+2p1ágyp
+2p1ágyr
+2p1ágys
+2p1ágyt
+2p1á2gyu
+pá2gyú
+2p1ágyü
+2p1ágyv
+2p1ágyz
+2p1ájt
+pála2
+pá2lab
+pá2lac
+2p1álar
+2p1áldo
+pá2le
+p1álla.
+2pállap
+2p1állí
+2p1állom
+2p1állv
+2pálmo
+pá2lü
+p2ály
+pálya1s
+2pámi
+2p1á2mí
+pá2mu
+pána2
+pá2naf
+pá2n1am
+pá2n1an
+pá2nar
+pá2n1as
+pá2nár
+pá2n1e2
+pá2nék
+pá2nil
+pá2nir
+pá2nis
+pá2ní
+pán1kré
+2pánkt
+pá2n1ó2
+pá2nö
+pá2nő
+pán1sz
+pánte2
+pán2tek
+pán2t1el
+pá2nü
+pá2ny1ad
+pá2ny1a2l
+pá2ny1a2n
+pá2nyar
+pá2nyat
+pá2nyau
+pá2nyaz
+pá2ny1e2
+pá2nyérd
+pá2nyim
+pá2nyö
+2p1á2po
+pár1adó
+2páras
+2páráé
+pár2d1a2
+pár2del
+pá2r1e2
+pá2r1i2p
+pá2rő
+pár1s2
+pár2t1ag
+2pártal
+párt1any
+pár2tari
+pár2tál
+párte2
+pár2t1el
+pár2tem
+pár2tes
+pár2tet
+pár2tél
+pár2t1ér.
+pár2t1é2te
+pár2tiz
+pár2tott
+pártö2
+pár2tök
+pár2t1ő
+pár2tus
+pártü2
+pár2t1üz
+pá2ruh
+pá2ruk
+páru2t
+pár1utu
+pá2rún
+pá2rü
+2p1á2sás
+pá2s1e
+pá2sir
+pá2ső
+pás3s
+pá2s1ü2
+2p1ásván
+pá2t1a2
+pá2tá
+pá2tel
+pá2t1e2m
+pá2tis
+2p1átka.
+2p1átkát
+2p1átkáv
+p1átlag
+2p1átló
+pá2t1or
+2p1átrak
+2p1átté
+pá2t1uk
+pát1úrt
+pá2tü
+2p1átvét
+pba2l1
+pbé2r1e2l
+pb2lo
+pb2ra
+pb2ri
+pb2ro
+pci2ófo
+pcsa2p1á2g
+pcső2s1orr
+pda2l1ad
+pdal1an
+pda2leg
+pda2lel
+pda2l1es
+pda2lén
+pda2l1í2
+pd2ra
+pd2rá
+pd2ro
+pd2ró
+1pe
+pea2p
+pea2r
+peca1
+pec3c
+pe2cz
+pe2ed
+2p1eff
+pe1fl
+2p1e2gese
+pegész1
+pe1g2r
+2p1egz
+2p1e2ke.
+2p1e2kei
+pe1k2ré
+2pektr
+pe2lál
+pe2lár
+pe2lekt
+2pelemb
+2pe2lemek
+pe2lemet
+2p1e2lemé
+2p1e2lemg
+2p1e2lemh
+2p1e2lemi
+2p1e2lemk
+2p1e2lemm
+2p1e2lemn
+2pelemr
+2p1e2lemz
+pel1eró
+pele2t
+pel1ete
+2p1elgo
+2p1elha
+2p1elhel
+2peljá
+2p1elleb
+2p1elnev
+2p1elny
+pe2los
+2p1e2lö
+2p1e2lőa
+2p1e2lőá
+2p1e2lőe
+pe2lőg
+2p1e2lőh
+pe2lőí
+2p1e2lőjá
+2p1e2lőjeg
+2p1e2lől
+2p1e2lőz
+2p1elren
+2p1elsö
+2p1eltá
+2p1elto
+2pelu
+2p1elv.
+2p1elvá
+pel2v1el
+2p1elven
+2p1elvh
+2p1elvi
+2p1elvo
+2p1elvű
+3pely
+2p1elz
+2p1ember
+2p1e2mel
+2p1e2més
+2p1eml
+2p1ems
+2p1e2mu
+2p1e2ner
+2penged
+pen3ny.
+pen3nyb
+penny1ér
+pen3nyh
+2p1ennyi.
+pen3nyj
+pen3nyk
+pen3nym
+pen3nyn
+pen3nyr
+pen3nyt
+pen3nyv
+pe2nya
+penyá2
+pe2ny1e2l
+pe2ny1e2r
+peo2l
+peo2p
+peó2r
+pe2pe.
+2p1e2pé
+pe1p2r
+pe2r1akt
+per1all
+pera1p2
+perc1c
+per2c1el
+per2c1in
+2perdő
+perec1c
+peregyez1
+p1e2rej
+pe2r1elk
+pe2r1e2lőf
+pe2r1e2lőké
+pere2mért
+per1evé
+2perfa
+pe2rid
+pe2r1il
+pe2r1i2na
+pe2r1i2ná
+pe2r1ind
+pe2r1ing
+pe2rí
+per1k2
+p2erl
+per1okt
+pe2r1os
+pe2r1o2x
+pe2r1ó2r
+pe2rőd
+pe2rőf
+pe2rői
+pe2rőm
+pe2rőn
+pe2rőr
+2p1e2rős
+pe2rőt
+pe2rőv
+per1st
+persz2
+pe2rú
+pe2r1ü2g
+perü2l
+per1ülő
+per1ült
+p2erz
+pe2s1ebbel
+pe2s1ebbő
+pe2sésig
+2p1e2sésű
+pe2sői
+pe1s2p
+2p1esszév
+pes2t1a2
+pes2t1er
+pe2szak
+pe2sz1ál
+pesz1ell
+pe2sz1elv
+pesze2m
+pe2szeme
+pe2szu
+pe2sz1ü2l
+pe2tal
+pe2t1a2n
+pet2á
+petet2
+2petete
+2peteté
+2p1e2tető
+2p1e2tika
+2petim
+2p1e2to
+pet2t1i
+pe2tűd
+pe2ug
+pe2vő
+2p1ezr
+1pé
+pé2csu
+pédü2
+pé2d1ülé
+2pééb
+2pééi
+2péén
+2p1é2ge
+2p1é2gé
+pégés3s
+2p1é2hen
+2p1é2hes
+2p1é2het
+2p1éhs
+2p1éj.
+péje2
+pé2j1eg
+2p1é2ji
+2p1éjj
+pé2k1as
+pé2k1au
+pé2k1á2
+pé2k1er
+pé2k1ék
+pé2k1é2l
+péké2t
+pé2k1éte
+pé2k1i2n
+pé2kis
+2p1él.
+2p1élb
+pé2le.
+pé2lei
+pé2lek
+péle2l
+pél1ele
+pél1elmei
+pé2len
+pé2let
+2p1é2lé
+2pélm
+2p1éln
+2p1é2lő
+2p1élt
+2p1é2lű
+2p1élv
+2péneka
+2p1é2nekb
+2pénekd
+2p1é2neké
+2pénekf
+2pénekg
+2p1é2neki
+2pénekí
+2pénekj
+2p1é2nekk
+2p1é2nekn
+2p1é2nekr
+2p1é2nekt
+2p1é2nekü
+pé2ny1el
+pén2z1a
+pén2z1á2
+pén2zs
+pé2p1i2p
+2p1é2pí
+2pépü
+2p1érc
+2p1érd
+2p1é2ré
+2p1érh
+pé2rig
+2p1é2rin
+2p1érm
+2p1érn
+2p1é2rő.
+2p1érr
+2p1érte
+2p1érté
+2p1értő
+2p1érv
+2p1érz
+pé2s1aj
+pé2sal
+pé2s1e2l
+pé2sés
+péskész1
+pé2so
+pés3sza
+pé2s1ü2t
+pé2sza
+pés3zaj
+pész1ak
+pés3zav
+pé2sz1á2
+pé2sz1emb
+2p1é2széné
+pé2szin
+pé2sz1o
+pé2sz1ö
+pész3s
+pé2szu
+pé2szú
+pé2sz1ű
+péta1
+pé2tel
+2p1étk
+2pétl
+p1étla
+2p1étr
+2p1étv
+2p1év.
+2p1évb
+2p1é2ve.
+2pévei
+2p1é2vek
+pé2ven
+pé2ves
+2p1é2vet
+2p1évf
+2p1évh
+p1évk
+2p1évn
+2p1évr
+2p1évs
+2p1évt
+2p1évv
+pé2zak
+pé2z1ár
+pé2zel
+pé2z1e2m
+pézi2
+pé2zid
+pé2zin
+pé2ziz
+pé2zol
+pé2zsa
+pé2zu
+p2f1ép
+pfi2úé
+pfi2úkér
+pf2lo
+pf2ló
+pf2lu
+pf2rá
+p1f2re
+p1f2ri
+p1f2rí
+p1f2ro
+pf2ru
+pf1st
+pg2ra
+pg2ru
+pg2rü
+pha2de
+p2ha2i
+1phanész
+1p2hed
+phelyü2kü
+1p2hia2
+p2hic
+1phila
+1p2hoi
+phó2i
+1pi
+pi2aa
+pi2aá
+pi2aba
+pia2cel
+pia2cél
+pia2cik
+pia2c3se
+pi2ad
+pi2ae
+pi2aé
+pi2ag
+pi2ah
+pi2aj
+pi2akén.
+pi2al
+pi2am
+pi2ao
+pi2aö
+pi2ap
+pi2aré
+pi2asza
+pi2at
+pi2aú
+pi2aü
+pi2ave
+pi2az
+2picc
+pi2ce.
+2picl
+pida2
+pi2dan
+pi2dea
+pi2deá
+pi2dei
+pi2den
+pi2deo
+2p1i2dom
+2p1i2dő
+2p1i2du
+pi2eg
+pi2er
+pi2ég
+pi1fr
+2p1i2ga
+2p1i2ge
+2p1i2gé
+2pigo
+2p1ihl
+pi2k1ö
+pil2i
+pilis3s
+2pilles
+2p1illet
+2pillés
+2pillu
+2p1i2ly
+2p1i2má
+2p1i2mi
+2p1imm
+pinak2
+pina1p
+2pind
+2p1inf
+pin2gas
+pin2g1á2r
+pin2gelj
+pin2gép
+pin2gos
+2p1ingó
+2pinj
+2p1inp
+pin2tác
+pin2t1or
+pin2tőr
+pintu2
+pin2tur
+pi2nü
+2p1inv
+2p1inz
+pion1n
+pi2óa
+pi2óá
+pi2óe
+pi2óf
+pi2óg
+pi2óki
+pi2ól
+pi2óma
+pi2ómé
+pi2óo
+pi2óp
+2pipai
+2pipar.
+2p1i2pará
+2piparb
+2piparh
+2piparn
+2piparr
+2p1irh
+2p1i2rod
+pisau2
+2pisko
+pi2s1op
+2p1iste
+2p1isza
+piszkos1s
+pi2t1aj
+pi2tala
+pi2tall
+pi2t1a2n
+pi2t1á2p
+pi1tä
+pi1the
+pitos1s
+pi2t1ü2
+pi2vás
+2p1i2zé
+1pí
+pí2gé
+pí2já
+pí2né
+pí2r1a2
+pí2rá
+pír1ál
+pír1á2r
+2p1írás
+pí2r1e2
+pí2r1in
+pír1i2s
+pí2rí
+pí2rol
+2p1í2ró
+pí2r1ö2
+pír1s
+pírt2
+pír1tr
+pí2rü
+pí2rű
+2pítél
+2pítm
+pítőa2
+pítőe2l
+pí2ve
+pí2ze
+pí2zé
+pí2zü
+pí2zű
+pke1p2
+pke1s2
+pkés1s
+pkia2
+pkiá2
+pkie2
+pk2la
+pk2li
+pk2lí
+pk2lu
+pk2rá
+pk2re
+pk2ré
+pk2ri
+pk2ro
+pk2ró
+pk2va
+pk2vó
+p2lacc
+pla1k2l
+pla2pal
+plap1áll
+pla2p1osz
+p2latf
+1plazmá
+pleí2
+ple2t1a2n
+ple2t1e2l
+pléé2
+plé2has
+pli2s3zá
+plo2m1e
+plo2mén
+plom1ol
+plót2
+pló1tr
+plő2sa
+plő1stá
+plő2szár
+plu2m1e
+p2lur
+pmás1s
+pmeg1g
+1po
+po2be
+pocsi2
+po2cs1iz
+po2da.
+po2dz
+pogás1s
+po2in
+poki2
+2p1o2k1ir
+po2kí
+2p1okle
+po1k2ló
+2p1okm
+poko2la
+pokol1l
+2p1okta
+2p1oktá
+polás1s
+pol2can
+polc3c
+pol2c3s
+2p1olda
+polóá2
+2poltár
+2p1oltás
+2p1olti
+2p1oltó
+2polvas
+po2n1a
+pon2c3so
+po2nel
+pon2g1e
+poni2
+po2niz
+pon3n
+po2n1osz
+pon2t1a2d
+pon2tag
+pon2t1a2l
+pont1any
+pon2tál
+pon2tár
+ponte2
+pon2t1el
+pon2tem
+pon2ten
+pon2tes
+pon2ték
+pon2t1ér.
+pon2t1éte
+pon2tisz
+pon2tí
+pon2t1ő2
+2ponz
+po2ol
+po2p1a2
+po2p1á2
+2popc
+2po2pe
+pop1el
+popi2
+po2pik
+po2p1in
+po2p1ir
+po2pis
+po2p1o2l
+pop1p2
+pop1s
+popsz2
+2pop1t2
+po2pú
+po2pü
+po2r1a2c
+po2r1ag
+po2rakk
+por1ala
+por1all
+po2ram
+pora2n
+por1any
+po2r1a2r
+po2rat
+por1ács
+por1áll
+por2can
+por2c3h
+por2c3sí
+pore2
+po2rec
+po2res
+por1f2
+por1g2
+po2rid
+2porie
+po2rih
+po2r1il
+po2r1i2m
+po2r1in
+por1k2
+po2rö
+po2rő
+por2tamb
+por2t1au
+por2t1á2rá
+por2tárb
+por2tárn
+por2tej
+por2t1em
+por2tet
+por2tél
+por2t1ér.
+por2t1érk
+por2t1i2k
+por2tiz
+por2t1ív
+por2tur
+por2t1usz
+por2túr
+por2tű
+po2rü
+2p1orvo
+pos3szo
+pos3szö
+2postol
+2p1osty
+po2sü
+po2sze
+po2szí
+2p1oszl
+posz2tü
+po2tab
+po2tad
+po2t1a2l
+po2tan
+po2t1a2u
+po2t1e2l
+po2t1inf
+po2t1ip
+po2t1í2
+po2tol
+po2tö
+po2tus
+po2tü
+po2vi
+1pó
+pó2ce
+pó1fr
+pói2g
+pó2k1ass
+pó2kau
+pó2k1e2l
+pó2kem
+pó2ket
+pó2k1id
+pó2kim
+póki2s
+pók1isz
+pó2kiv
+pó2k1ös
+pó2k1ú
+pó2l1an
+pó2l1á
+pó2lom
+2p1ó2né.
+pó1p2r
+p1ó2rad
+pór1á2sz
+póre2
+pó2reg
+pó2rem
+p1ó2riá
+pó2rö
+pó2s1or
+pós3s
+pó2s1ü2v
+póta2
+pó2t1ad
+pó2tal
+pó2t1an
+póté2r
+pó2til
+pótü2
+pó2tül
+2póün
+2p1ó2vó
+pó2ze
+pó2z3sá
+1pö
+pö2ka
+pö2ká
+pö2kel
+pö2ker
+pö2kid
+p1ö2ko
+pö2ku
+pö2kú
+pö2lye
+2pönt
+pö2ra
+p1ördö
+pö2res
+3pörg
+pö2ro
+pö2r1ő
+pö2rú
+2p1öss
+p1ötl
+pötty1in
+2p1ötv
+pö2ve
+1pő
+pőa2n
+pőá2g
+pő1bl
+pő1dro
+pőe2r
+pőé2h
+pőé2l
+pő1kl
+pő1pl
+pő1pr
+2p1őr.
+pő2ri.
+p1őrj
+p1őrl
+2p1őrn
+p1őrs
+2p1őrt
+p1ő2rü
+2p1őrz
+pő1sz
+pp1ada
+ppai2
+ppa2j
+pp1ajá
+pp1akk
+ppa2nad
+ppa2n1ell
+ppan1k2
+pp1any
+pp1arc
+ppa1s
+pp1áll
+p2p1árj
+p2p1á2rok
+pp1átm
+p2p1á2to
+pp1átv
+p2p1e2gy
+p2p1e2kéh
+p2p1elo
+p2p1elr
+ppe2r1a
+ppe2ró
+p2p1ég
+p2p1éks
+pp2hó
+ppin2g1e2
+pp1íg
+pp1kl
+pp2las
+pp2lat
+pp1o2ly
+p2p1o2rom
+ppor2t1á2r
+ppor2t1e2
+ppor2t1ő2
+p2p1ó2l
+pp1órá
+pp1ön
+pp1öv
+pp1ö2z
+p1p2ref
+p1p2rem
+p1p2rez
+p1p2rém
+pp2rin
+pp2rio
+p1p2roc
+p1p2rod
+p1prof
+p1prog
+p1proj
+p1p2ros
+p1p2rot
+pp2rób
+pp1sp
+p2p1úg
+p2p1úr.
+ppví2
+ppvíz1
+1p2rax
+p2remi
+1p2repa
+pressz2b
+2pret
+pret2á
+1p2rédi
+p2rép
+pré2sa
+pré2s3zá
+p2riccs
+p2rius
+p2rizm
+prí2m1e2l
+prí2mem
+1probl
+1p2roce
+p2rof
+1profe
+p2rog
+p2roj
+1proje
+pro2mo
+p2ropa
+1p2rote
+1proté
+1p2roto
+1p2rovo
+1próbá
+pró2d1e
+pró2dz
+1p2róza
+pru2s1ág
+pru2se
+1p2rüs
+p2s1a2d
+psé2gel
+ps1i2ha
+ps1í2ze
+p1s2ká
+p1s2mi
+p2s1ón
+p2s1ö2z
+p1s2pe
+ps2pi
+p1s2po
+ps1pr
+ps2rá
+ps3szó
+p1s2tá
+ps2ti
+p1s2tí
+ps2to
+p1st2r
+ps2tu
+p1s2tú
+psza2k1ü
+psz1any
+p2sz1as
+psz1atl
+p2sz1ág
+ps3záp
+p2szég
+psz2fé
+1p2szic
+p2sz1ill
+pszis3s
+psz1k2
+psz1old
+psz1orn
+p2sz1ön
+p2sz1ös
+psz3s
+pta2d
+pt1ada
+pta2n1á2s
+pta2ne
+ptá2raj
+ptáró2
+ptá2rór
+p2t1eg
+p2t1e2ke.
+p2t1e2lő
+p2t1els
+pte2rál
+pté2ká
+pté2k1el
+p2t1érd
+pt1i2ma.
+p2t1i2n
+p2t1i2o
+p2t1i2r
+p2t1í2r
+pt1kl
+p2t1öt
+p1t2rag
+p1t2ran
+p1t2rá
+pt2ré
+ptu2sze
+ptu2szi
+p2t1úrr
+p2t1üt
+1pu
+pua2d
+pu2csor
+pue2l
+2p1ugr
+2puká
+pul2tas
+2p1u2ni
+2puno
+2p1u2nó
+puo2r
+pu1pr
+pu2rak
+pu2ral
+pu2sad
+pu2sal
+pusa2n
+pus1any
+pu2sap
+pu2sál
+pu2s1átl
+pu2s1e2
+pu2s1érté
+pu2sik
+pu2sis
+pu2sí
+pu2sol
+pu2sö
+pu2ső
+puss2
+pussz2
+pust2
+pu2sü
+pu2szag
+pu2szal
+pu2s3zár.
+pusz1é2p
+pu2szö
+pu2tab
+pu2t1a2d
+pu2tak
+puta2n
+2p1u2taz
+put1ing
+pu2tol
+pu2tód
+2p1u2tóp
+pu1trá
+1pú
+2p1úrf
+pú2sz
+2p1útb
+pú2té
+2p1ú2ti
+2p1útj
+2p1útk
+2p1útn
+2p1ú2to
+2p1útp
+2p1útr
+2p1útt
+2p1útv
+1pü
+pü2ge
+pü2gy
+pü2kü
+2püle
+püle2t1o
+2p1ünn
+pü2re
+2p1ü2rí
+2p1üst
+2p1ü2te
+pü2té
+2p1ütk
+2p1ü2tö
+pü2ve
+pü2ze
+1pű
+pű2ző
+pvá2r1al
+pw2hi
+pwhisky2
+py2ba
+py2bó
+py2do
+py2ho
+py2ja
+py2já
+py2ka
+py2ké
+py2ki
+py2ko
+py2ma
+py2na
+py2ná
+py2ra
+py2ró
+py1t2h
+py2tó
+py2va
+py2vá
+pze2t1a2
+pze2t1á2
+pze2t1e2r
+pzőa2
+pzőe2
+pzőé2
+2q.
+1qa
+1qá
+1qe
+1qé
+1qi
+1qí
+1qo
+1qó
+1qö
+1qő
+1qu
+qu2ae
+qu2at
+qu2er
+qu2ez
+que2zi
+qu2éb
+qu2ie
+qu2ij
+qu2il
+qu2in
+qu2is
+qu2od
+1qú
+1qü
+1qű
+2r.
+1ra
+raa2d
+raáta2d
+ra2bad
+rab1asz
+rab1á2ra
+rab1árb
+rab1árr
+ra2b1át
+ra2b1ele
+ra2b1ell
+ra2bid
+rabi2g
+ra2b1iga
+ra2b1igá
+ra2b1im
+ra2b1i2na.
+ra2b1i2ná
+ra2bind
+ra2b1int
+2rabla
+ra1bri
+ra2buj
+ra2c1aj
+rac3csa
+ra2cet
+ra2cha
+rac3hig
+ra2c3hok
+ra2c3hos
+ra2c3hot
+2r1a2cid
+rac2kar
+rac2kit
+rac2k1ö2
+rac2kü
+ra2dag
+ra2dalé
+rada2rad
+2radaté
+radás1s
+ra2de.
+r2a3dí
+2radíc
+2radm
+3radósi.
+2r1a2dóz
+ra1drá
+ra1dru
+2r1a2du.
+ra2dus
+rae2r
+raé2derb
+raé2dere
+raé2derh
+raé2dern
+raé2derr
+raé2dert
+raé2r
+rafikus1s
+ra1fl
+2r1a2ga.
+ra2gak
+rag1alo
+ra2g1ác
+ra2gáé
+2r1a2gán
+rag2de
+ragdi2
+rag2din
+ra2gel
+ra2g1i2na.
+2r1agy.
+ra2gyat
+2r1agyn
+ra2gyon
+2r1agyr
+rai2o
+2raizá
+2raizi
+2raizn
+2raizó
+2raizu
+ra2j1a2d
+ra2j1au
+ra2j1á2ru
+ra2j1es
+ra2jin
+2rajkáró
+2r1ajkú
+rajob2
+raj2t1e2l
+raj2t1en
+raj2zat
+raj2z1e
+raj2z1ón
+raj2z3s
+2r1a2kara
+rak2kép
+rak2kis
+ra1k2li
+ra1klo
+ra1kló
+ra1klu
+2raknáb
+2raknái
+r1a2kóz
+rak2re
+ra1k2ré
+ra1k2ri
+rak2rom
+raktus1s
+2r1a2kus
+r2alab
+2r1a2la2g1
+2ra2laku
+ra2lapa
+r1a2lapú
+ra2lázá
+ra2lázó
+2r1alb
+2r1aljai.
+2r1alji
+2ralk
+ralla2k
+ral2l1akó
+ral2l1at
+rallá2
+ral2lág
+ral2lál
+ral2lev
+ralo2m1e
+ra2mab
+ram1ada
+2ramai
+ram1akk
+rama2l
+ram1ala
+ra2m1any
+ram1áll
+ra2m1árá
+ra2m1árb
+ra2m1áre
+ra2m1árh
+ra2m1árn
+ra2m1árr
+ram1b
+ra2m1éhe
+ram1ide
+ram1i2ko
+ram1ill
+ra2m1im
+ram1ina
+ram1inf
+ram1ing
+ram1inj
+ra2m1i2p
+2rammb
+2rammet
+2rammi
+2rammj
+2rammn
+2rammr
+2rammt
+ra2m1osz
+ra2m1ó2r
+ra2mö
+ra2mő
+ra2mü
+2r1a2nal
+2r1a2nat
+ranás1s
+ran2csal
+rancs1ág
+ran2cse
+ran2csik
+ran2cső
+rancs3z
+2rand.
+ran2dat
+ran2d1au
+2randj
+ran2dz
+ra2nek
+ran2g1a2
+ran2g1á
+ran2ge
+rang1e2l
+ran2g1ó2
+ran2gye
+ra2nil
+ra2nim
+2ranka
+ran2szál
+ran2sze
+ransz1omb
+2rany.
+ra2nyag
+rany1a2la
+ra2ny1a2n
+ra2nyap
+ra2ny1ar
+r1a2nyáit
+r1a2nyáka
+r1a2nyákh
+r1a2nyákk
+ra2ny1ál
+ra2nyás
+r1anyás.
+2ranyb
+ra2ny1e2s
+2ranyé
+ra2nyél
+2ranyh
+ra2nyid
+ra2nyin
+ra2nyir
+rany1í2r
+2ranyk
+2ranyn
+ra2ny1ol
+2ra2nyó
+rany1ó2r
+ra2nyö
+2ranyr
+2ranys
+2ranyt
+ra2ny1ü
+2ranza
+ra2óa
+ra2óá
+ra2óf
+ra2ólá
+ra2óm
+ra2óp
+ra2ósz
+2rapa.
+ra2pák
+2rapp
+rap2pin
+ra1p2re
+ra1pré
+ra1p2ri
+ra1p2ro
+2rarann
+2r1arany.
+2r1a2ranya.
+2r1a2ranyá
+2raranyb
+2raranyn
+2raranyr
+2r1aranyt
+ra2rat
+2r1arco
+ra2rén
+2r1art
+2r1arz
+ra1s2ká
+ra1s2l
+ra1s2pe
+ra1s2po
+rassz1e
+2rasszoc
+rast2
+ra1s2ta
+ra1stá
+ra1str
+ra2sz1abl
+ra2sz1aj
+ra2szas
+ra2szat
+ra2szág
+ra2sz1árr
+rasz1emb
+ra2sz1étt
+ra2szób
+ra2szói
+ra2szón
+ra2szös
+rasz2t1a2ny
+rasz2t1el
+rasz2t1é2te
+rasz2tö
+rasz2tü
+ra2t1a2d
+rat1ajt
+rat1a2la
+rat1alt
+rat1ará
+2r1a2tád
+rat1áll
+ra2t1árad
+ra2t1á2rai
+ra2t1á2rak
+ra2t1árb
+ra2t1árv
+ratát1a2
+ratá2vi
+ra2t1e2g
+ra2t1elk
+ra2t1ell
+2ratég
+rat1ége
+ra2t1érd
+rat1érke
+ra2térte
+ra2t1érv
+rat1ing
+ra2t1ír
+ra2t1íve
+2r1atká
+2ratlé
+2ratoz.
+ra1t2ran
+2r1attr
+ra2tür
+2raty
+ra2tya
+ra2tyá
+ra2tyu
+ra2udi
+2r1a2uk
+ra2ulá
+2raum
+rau2n
+rau2ta
+rau2tá
+ra2uto
+2r1autó
+rautóé2
+raü2t
+raü2z
+2ravató
+2ravú
+ra2xü
+ra1ye
+ra1yé
+raz1ajt
+raza2n
+ra2z1any
+ra2zel
+ra2z1olt
+ra2zono
+1rá
+rá1bre
+rá2cal
+rá2c1e
+rá2c3h
+rá2c1i2n
+ráci2óf
+rá2cö
+rá2csala
+rác3ság
+rá2csét
+rá2csir
+rá2cs1is
+rá2cú
+rá2cü
+rá2d1any
+2rádáh
+2ráddá
+2rádju
+2ráfha
+2ráfhe
+2ráfhi
+2ráfid
+2ráfre
+rág1ad
+2rágam
+2r1á2gaz
+rág1á2zá
+rá2gia
+rá2gil
+rá2gim
+rá2gis
+2rágí
+rá2g1osz
+rágus4
+rá2gü
+2rágya
+2rágyáb
+2rágyáé
+2rágyáh
+2rágyái
+2rágyáj
+2rágyák
+2rágyán
+2rágyár
+2rágyás
+2rágyát
+2rágyáv
+rá2gyu
+ráí2r
+ráj2k1a2
+ráj2kel
+ráj2k1ó2
+rá2jü
+rá2kát
+rá2k1ered
+rá2k1e2s
+rá1kla
+2rákog
+rá2k1osz
+rá2k1ón
+rá2k1ó2r
+rá1krá
+rá1krét
+rá2l1ak
+rá2l1a2l
+rá2lana
+2r1álar
+rála2t1e
+rá2lál
+rál1átl
+r1álcá
+2r1áldá
+rá2lid
+rá2lim
+rá2lí
+2r1állam
+2r1állap
+2r1állat
+2r1állí
+2r1állom
+2r1álma
+rá2lü
+rá2lyal
+rá2ly1a2n
+rá2lyap
+rá2ly1as
+rá2lyav
+rá2lyús
+rá2lyút
+rá2mö
+rá2nal
+rá2n1a2n
+rá2n1a2t
+rá2n1ár
+rá2nás
+ránc1c
+rá2nék
+rán2gál
+rá2niz
+rá2ní
+rán1kl
+rá2nol
+rá2not
+rá2n1ó2
+rán2sav
+ráns3s
+rán2t1ak
+rá2nü
+rá2ny1a2d
+rá2nyag
+rá2nyako
+rány1alt
+rá2ny1a2n
+rá2ny1ap
+rá2nyar
+rá2nyaz
+rá2ny1ár.
+rá2nyérm
+rá2nyérz
+rá2ny1í2r
+rá2nyol
+rá2nyó
+rá1p2l
+2rápo
+rá2pol
+rá1p2r
+2r1á2rad
+rár1a2dá
+2r1á2rai
+2r1á2ram
+2r1á2ras
+2r1á2rat
+rá2raz
+rá2ráb
+rá2ráh
+rá2r1ál
+rá2rár
+rá2rát
+rá2ráv
+rá2r1em
+rá2rér
+2r1árh
+rá2riai
+2r1á2riá
+rá2rin
+2r1árj
+2r1árl
+2r1árn
+rá2r1ol
+r1ártó
+2ráru
+rá2rul
+rá2run
+2rárú
+rá2rú.
+rá2rút
+rá2rúv
+rá2s1a2d
+rá2s1akn
+rá2sal
+rása2r
+rás1ará
+rá2s1as
+2rásatá
+rás1a2to
+rá2saz
+rás1á2ga
+rá2s1árad
+rá2s1árak
+rá2s1á2rá
+rá2s1á2ré
+rá2sás
+rá2ser
+rá2sis
+rá2s1ol
+2r1á2só.
+2rásób
+2rásóé
+2rásóg
+2r1á2sóh
+2rásói
+2rásój
+2rásók
+2rásón
+rás1ó2ra
+2rásóró
+2r1ásós
+2rásót
+2r1ásóv
+rá2ső
+rást2
+rás1tr
+rá2sut
+rá2szan
+rá2szas
+rá2sz1á2ru
+rá2sziv
+rás3zón
+rá2tad
+rát1a2da
+rát1ala
+r1á2tál
+rá2tég
+rá2tél
+2rátép
+rá2t1i2o
+rá2tí
+2r1átlé
+rá1tri
+rá1tro
+rátus1s
+rátú2
+rá2túr
+2r1á2tül
+rá2zal
+2rázisb
+2rázisé
+2rázish
+2rázisk
+2rázisn
+2rázisr
+2ráziss
+2rázist
+rázi2sz
+rá2zsal
+ráz4sá
+rázs1e2
+rázsé2
+rá2zsén
+rázsi2a
+rá2zsis
+rá2zsó
+rázs1ü2
+rba2j1e
+rba2jokt
+rba2n1á
+rbátyá2t
+rbá2ty1áto
+r2b1ell
+r1b2la
+r1b2lo
+rb2lú
+rboc1c
+r2b1olda
+rbo2n1a2
+r1b2ra
+r1b2rá
+rb2ri
+rb2ro
+r1b2ró
+rb2ru
+rbu2t1e
+rc1adá
+rc1ajt
+rca2lak
+r2c1alk
+r2c1ana
+rc1anya
+rca1p
+rc1ara
+rc1ará
+rc1ass
+rc1a2to
+r2c1ág
+r2c1á2l
+rc1ár.
+r2c1ári
+r2c1árn
+r2c1á2ro
+r2c1árr
+r2c1árt
+r2c1á2ru
+rc3csi
+rc3csí
+rc3cso
+rc3csó
+rc3csö
+rce2g1a2
+rceg1g
+rc1egy
+rc1e2leg
+rc1elk
+rc1e2lőd
+r2c1els
+r2c1ember
+r2c1epe
+rc1e2ve
+r2c1ex
+r2c1ez
+rc1é2két
+r2c1éle
+r2c1é2lé
+r2c1é2li
+r2c1élm
+r2c1élü
+r2c1ép
+r2c1ér.
+r2c1érb
+r2c1é2ri
+r2c1érr
+rc1ész
+rc1fr
+rc1gr
+r2c3has
+rc3hel
+r2chen
+r2chig
+r2chom
+rc3hu
+r2c3hú
+r2c3hű
+rci2d
+r2c1ide
+r2c1i2ko
+r2c1ikr
+rc1ill
+r2cimá
+r2c1imi
+rc1i2na.
+rci2náb
+rci2náé
+rc1i2nár
+r2c1i2nát
+r2c1ind
+rc1i2oni
+r2c1i2pa
+r2c1isi
+r2c1isk
+r2c1ist
+rc1izm
+rc1i2zo
+r2c1íj
+r2c1ív
+r1c2ké.
+r1c2kéh
+r1c2kéi
+r1c2két
+r1c2ki.
+r1c2kia
+r1c2kig
+r1c2kok
+rc1k2ré
+rc1kv
+r1c2lu
+r2c1op
+r2c1o2r
+r2c1osz
+rc1ón
+rc1ó2r
+rc1óv
+r2c1öb
+r2c1ön
+r2c1ör
+r2c1ös
+rc1őr
+rc1pl
+rc1pr
+rcs1abl
+rcs1alak
+rcsa2p1á2g
+r2c3sara
+r2csarl
+r2c3sáp
+r2c3sár.
+rcs1áru
+r2c3sej
+r2cseleme
+r2cs1elr
+r2cs1érb
+r2csikr
+rcs1írás
+rc3s2ká
+r2c3sora
+r2c3soro
+rcsóna2k1á2
+rcs1ős.
+rcs1p
+rc3s2pi
+rcs1s
+rc3sto
+rc3sz
+rc1tr
+r2c1ud
+r2c1ur
+r2c1ut
+r2c1új
+rc1üg
+r2c1ür
+r2c1üs
+r2c1üt
+rc1üv
+rc1üz
+rc1űz
+r2c3zá
+rc3zó
+rc3zs
+rc3zu
+rc3zú
+rda2cél
+rd1a2dat
+r2d1akc
+rda2l1í2
+rd1alka
+rd1alko
+r2d1a2nya
+rda1p
+rd1a2rán
+r2d1arc
+rd1aszt
+r2d1azo
+rd1ács.
+rd1á2rak
+rd1árat
+rd1á2ron
+r2d1árv
+rdás1s
+rd1bl
+rd3dz
+r2d1e2g
+rde2k1a2
+rde2ker
+rde2kék
+rde2kol
+rde2k1ö2
+r2d1ela
+rde2sőt
+rd1exp
+rdező2p3
+r2d1é2g
+rd1é2lé
+rd1élr
+rd1élt
+rd1é2lü
+r2d1ép
+r2d1ér.
+r2d1érd
+r2d1é2ri
+rdé2sa
+rdé2sza
+r2d1é2vé
+rd1fr
+r2d1i2d
+r2d1i2ga
+r2d1igé
+r2d1ima
+r2d1i2na.
+r2d1i2nai
+r2d1i2nát.
+rdio2x
+rd1izo
+r2d1íg
+r2d1íz
+rd1kl
+r2d1okta
+r2d1old
+rd1orr
+r2d1osz
+r2d1ou
+rdóa2
+rd1ó2rá
+rdö2g1öl
+r2d1öl
+r2d1ös
+rd1öv
+rdő2s1orr
+rd1pr
+r1d2ram
+rd2rap
+r1d2raz
+rd2rog
+r1d2rót
+rd1sk
+rd1sp
+rd1st
+rdsza2k1
+rd1t2r
+rd1udv
+r2d1urá
+rd1üg
+r2d1üt
+r2d3za
+r2d3zá
+rd3zo
+rd3zó
+r2d3zö
+rd3zsí
+r2d3zú
+1re
+rea2d
+rea2j
+rea2ka
+rea2la
+rea2r
+2reálá
+2reáló
+2r1eb.
+2r1ebbő
+reb1egy
+2r1e2béd
+2r1ebh
+2r1ebk
+2r1ebm
+2r1ebn
+2r1ebs
+2r1ebv
+re2caj
+re2cal
+re2cá
+2recets
+re2ch
+rec3sar
+2r1e2cset
+rec3sor
+re2cz
+re2dan
+red1elv
+2redend
+re2d1e2r
+2redeti
+2redetű
+2redény
+re2d1é2ves
+re2dir
+re2dor
+2r1edzőb
+2redzőj
+2r1e2dzők
+2redzőr
+2r1e2dzőt
+2redzőv
+re2et
+re2ew
+2reff
+re2gap
+re2gas
+reg1áll
+re2gár
+reg1e2le
+reg1elh
+reg1ell
+re2g1elr
+reg1elv
+reg1eng
+reg1e2tető
+reg1e2vé
+regész1
+re2gid
+reg1inj
+re2giz
+re2góc
+reg2óv
+re2gú
+regü2l
+re2g1ülé
+2r1egy.
+2r1egyb
+re2gye.
+re2gyed
+re2gyen
+2r1e2gyes
+re2gyet
+2r1e2gyez
+2r1e2gyé
+2r1egyh
+2r1egyk
+2r1egyl
+2r1egyn
+2r1egyr
+2r1egys
+2r1egyt
+re2gyün
+r1egyv
+rei2rá
+re2ja
+2rejéé
+2rejűe
+2rejűn
+2rejűr
+2rejűt
+re2k1ag
+re2k1ará
+re2k1asz
+re2k1á2l
+re2k1á2p
+re2k1ár.
+re2kás
+rek1elh
+rek1elt
+rek1elü
+rek1erd
+re2k1e2rő
+reke2sz1á
+2rekééh
+re2kéj
+re2kék
+2r1ekék.
+rek1ékh
+re2kél
+2r1e2kénk
+re2k1ér.
+re2k1érd
+re2k1érte
+2r1e2kés.
+re2k1éss
+re2k1id
+re2kij
+re2kil
+re2k1ing
+re2k1int
+re2k1ip
+re2kír
+rek1k2
+re1klu
+re2k1ok
+re2k1old
+rek1opt
+re2k1os
+rek1ott
+re2kór
+re2kök
+re2kötl
+re2kő
+rek1s
+reksz2
+re2k1u2s
+re2küd
+re2k1üg
+rekü2l
+re2k1ülé
+re2k1ülő
+re2küt
+2r1elad
+2r1e2lág
+2r1elbí
+2r1elbo
+2r1elc
+2r1eldo
+2r1e2lef
+2relektr
+rele2ma
+2re2leme.
+2r1e2lemed
+rele2meg
+2relemei
+2re2lemek
+2relemem.
+2r1e2lememe
+2relememm
+2r1e2lemen
+rele2m1er
+2relemes.
+2r1e2lemese
+2relemesn
+2r1e2lemet
+re2lemezé
+rele2m1ér.
+2r1e2lemtel
+2relemük
+2relemünk
+2relemzé
+2relemző
+2r1e2l1eng
+2relér
+2r1elf
+2r1elha
+2r1elhá
+2r1elhel
+2r1elhú
+2r1eljá
+2r1elké
+rella2
+rel2l1an
+2r1ellá
+2r1ellő
+2r1elma
+2r1elmééé
+2relmééh
+2r1elméi.
+2relmél
+2relméte
+2r1elnev
+2r1elnö
+2r1elny
+2r1e2los
+2r1e2lőad
+2relődei
+2r1e2lődök
+2relőnn
+2r1előnye
+2relőzm
+2r1elso
+2r1elszá
+2r1elta
+rel2tár
+2r1eltáv
+2r1eltett.
+2reltettk
+2r1eltéré
+2r1eltév
+2relú
+2r1e2l1ül
+2relű
+2r1elv.
+2r1elvá
+2r1elvb
+2relved
+2r1elvei
+2r1elvek
+2r1elvem
+2r1elven
+2r1elves
+2r1elvé.
+2r1elvéne
+2r1elvér
+2r1elvéü
+2r1elvév
+2r1elvh
+2r1elvi
+2r1elvk
+2r1elvn
+2r1elvo
+2r1elvr
+2r1elvs
+2r1elvt
+2r1elvü
+2r1elvű
+2r1elvv
+2r1elz
+re2m1a2d
+re2m1asz
+re2maz
+re2m1ál
+re2mát
+2rembar
+2r1ember.
+2r1emberb
+2r1embere.
+2rembered
+2r1emberei
+2r1emberek
+2r1emberes
+2r1emberé
+2r1emberh
+2r1emberi
+2r1emberk
+2r1embern
+2r1emberr
+2rembers
+2r1embert
+2r1emberü
+rem1ble
+r1embó
+2rembr
+re2mel
+rem1e2lem
+2r1emelé
+2r1emelg
+r1emelk
+rem1előd
+rem1els
+re2m1eng
+re2m1esz
+re2m1ér.
+re2m1érm
+re2m1é2te
+re2migr
+re2m1ór
+re2mö
+re2m1ő2r
+rem1p2
+2remuk
+2r1e2mul
+rem1ur
+2r1e2mus
+2r1encik
+ren2d1e2r
+ren2d1ég
+ren2déj
+ren2dék
+ren2d1o
+ren2d1ö
+ren2d1ő2s
+2r1e2ner
+renés3s
+2r1enged
+2rení
+ren2s1ég
+rens3s
+re2of
+re2óa
+re2óc
+re2óe
+re2óé
+re2óf
+re2óka
+re2ól
+re2óo
+re2óp
+re2ósá
+re2ósz
+re2p1aj
+rep1ana
+rep1asz
+re2pau
+re2paz
+rep1áll
+rep1álm
+re2pás
+re2pát
+re2p1e2g
+re2p1elf
+re2p1elk
+re2p1ell
+re2pelm
+re2p1eng
+re2p1ep
+2r1e2per.
+re2p1erk
+2repéd
+rep1é2j
+2repénk
+2r1e2pés
+re2p1i2d
+rep1ille
+rep1int
+re2pok
+2reposz.
+2reposzt.
+rep1osztó
+repö2
+re2p1örö
+rep1pl
+rep1pr
+re2pú
+2r1erd
+re2rei
+re2rej
+re2res
+re2rez
+2r1erg
+re2róz
+2r1e2rő
+2r1ers
+re2sas
+re1s2c
+2r1esemé
+res1epr
+rese2t1e2l
+2r1esél
+2reskü
+r1essi
+re2szaj
+2r1e2szet
+resz1ív
+2reszkö
+2reszm
+reszta2
+resz2t1an
+resz2tál
+resz2t1ár
+resz2t1í2v
+resz2t1o2r
+resz2t1os
+2reszű.
+2r1e2szűe
+re2t1ab
+re2t1akt
+re2tal
+ret1a2la
+re2tant
+re2t1a2ny
+re2tág
+re2t1ára
+re2t1áro
+ret1átf
+re2t1elb
+re2t1ell
+re2telm
+ret1emel
+re2t1erk
+rete2sz1á
+2r1e2tetés.
+2r1e2tetésé
+2retetésn
+re2t1é2k
+re2t1él
+re2t1érb
+re2t1érd
+re2tid
+2r1e2tika
+re2tiká
+ret1ill
+r1e2tilt
+re2t1ing
+re2t1int
+re2tis
+r1etnik
+re2t1ok
+re2t1old
+re2t1os
+re2tór
+re2t1örö
+re2t1ö2v
+ret2t1est
+ret2téne
+ret2t1in
+re2t1ut
+re2t1ült
+re2tűd
+re2ud
+re2ute
+re2vező
+2r1e2vő
+2r1exp
+2rezetn
+2rezetü
+2rezor
+2rezőkh
+2r1ezr
+2rezüs
+1ré
+ré2bá
+ré2bis
+ré2biv
+ré2bí
+2rébres
+ré2bü
+2r1é2des
+2réfá
+2r1égb
+ré2gét
+2r1égn
+ré2g1ó2
+ré2gő
+2régt
+2r1éh.
+2r1é2hen
+2r1é2hes
+2r1é2het
+2r1éhs
+2r1éht
+ré2jen
+2r1é2jet
+2r1é2jün
+ré2k1ab
+ré2kac
+ré2k1a2g
+ré2k1a2n
+ré2k1au
+rék1á2sá
+ré2k1e2b
+ré2k1eg
+ré2kel
+rék1ele
+rék1elő
+rék1elr
+rék1els
+ré2k1esz
+ré2k1éte
+ré2kik
+ré2kin
+ré2kit
+rék1ola
+rék1old
+ré2kör
+ré2k1ö2v
+ré2köz
+ré2kő
+réku2
+ré2k1ut
+ré2k1ú
+ré2let.
+ré2letb
+2r1é2lete
+ré2leté
+ré2leth
+ré2letn
+ré2letr
+ré2lett
+ré2letü
+2r1élf
+2r1élm
+2rély
+ré2mad
+ré2m1a2l
+ré2m1an
+ré2mar
+ré2mau
+ré2m1ál
+ré2már
+ré2mel
+rém1e2le
+ré2mer
+ré2m1é2ré
+ré2mil
+ré2m1ist
+ré2mos
+ré2mó
+ré2mö
+2rémtu
+réna1p2
+2r1é2nekh
+2r1é2neki
+2rénekl
+2r1é2nekü
+ré2nel
+2réner
+ré2n1é2j
+ré2nö
+ré2ny1e2l
+ré2p1ed
+ré2peg
+ré2pes
+répi2
+ré2p1ip
+2r1é2pí
+ré2pol
+ré2pö
+ré2pü
+2r1épül
+2r1ér.
+2r1érb
+2r1érc
+2r1érd
+2r1é2ret
+2r1é2rez
+ré2ré.
+ré2réb
+ré2rén
+ré2rér
+ré2rés.
+ré2rése
+ré2résé
+ré2résh
+ré2rési
+ré2résk
+ré2résn
+ré2résr
+ré2réss
+ré2rést
+ré2résü
+ré2rét
+2r1érf
+2r1érh
+ré2rie
+ré2rig
+2r1érk
+2r1érl
+2r1érm
+2r1érn
+2r1é2rő.
+ré2rők
+2r1érr
+2r1értá
+2r1érte
+2r1érté
+2r1értí
+2r1értő
+2r1é2rü
+2r1érv
+2r1érz
+résa2
+ré2sal
+ré2sar
+ré2s1ár
+ré2sát
+ré2seg
+rés1ell
+ré2s1er
+ré2sés
+ré2s1ő2
+rés3sza
+ré2sú
+ré2s1ü2t
+ré2s1ü2v
+rész1a2l
+ré2szan
+rés3zav
+rész1ál
+ré2sz1eml
+ré2sz1e2sz
+ré2sz1é2k
+ré2szinte
+rész1í2v
+ré2szok
+ré2szol
+ré2szó
+rész1ó2r
+ré2szőr
+rész3s
+rész1t2r
+ré2szu
+ré2szú
+részü2l
+ré2sz1ülő
+2rétáz
+ré2t1egy
+2ré2tel
+rét1elm
+2réter
+ré2t1e2sz
+2r1é2tető
+ré2t1é2k
+ré2tiz
+ré2tol
+ré2t1os
+ré1tré
+ré2tud
+révá2
+ré2vát
+2réve.
+2révei
+rév1eké
+ré2v1é2l
+ré2v1éri
+2révé2t
+ré2v1éte
+2r1é2vév
+2révf
+2révh
+2révt
+ré2vú
+2révv
+ré2z1a2
+rézá2
+ré2z1ár
+ré2z1e2g
+réze2l
+réz1elő
+ré2zer
+ré2zes
+réze2t
+réz1ete
+ré2zid
+ré2zin
+ré2zio
+ré2zip
+réz1isz
+ré2zos
+rézó2
+ré2z1ór
+ré2zö
+ré2zsa
+ré2z3sá
+ré2z3se
+ré2z3si
+ré2zsí
+ré2zso
+ré2zsu
+rf1ál
+r2f1ép
+rfé2sza
+rfé2szá
+rf1fl
+rfia2n
+rfi1b2
+rfid2
+rfii2
+rfik2
+rfi1kr
+rf1ind
+rf1isk
+rfi1sz2
+rfit2
+rfi1tr
+rf1kl
+rf1kr
+rf2la
+rf2lo
+rf2ló
+rf2lu
+rf1okt
+rf1őrü
+rf1pr
+r1f2rá
+rf2rí
+r1f2rö
+rf1sp
+rf1st
+r2f1út
+rga1k2
+rgá2csal
+rgá2csan
+rgá2csav
+rgá2z1é
+rge2o
+rge2r1a
+rgés3s
+rg2ha.
+rgi2aia
+rgi2ako
+rgi2al
+rgi2aso
+rg2il
+rg2la
+rg2le
+rg2lo
+rg2ló
+r1g2nó
+rg2öl
+rgö3le
+rgőcsa2
+rgő2z1ölt
+rgő2z1ős
+r1g2rá
+r1g2ru
+r2gyado
+r2gy1aj
+r2gyalak
+r2gy1alap
+r2gy1algá
+r2gy1alk
+r2gy1any
+r2gyap
+r2gyarc
+r2gy1asz
+r2gyau
+r2gy1az
+r2gyál
+r2gy1á2z
+r2gy1eg
+r2gy1e2l
+r2gy1enc
+r2gy1e2s
+r2gy1és
+r2gyévé
+r2gyim
+r2gy1int
+r2gyip
+rgy1ira
+r2gy1ok
+r2gy1öz
+r2győr
+rhajóé2r
+rhatá2s1út
+rháza2d
+rhá2z1ada
+rhá2zal
+rhá2zip
+rhá2z3s
+rhitköz1
+1rhoeá
+1ri
+ri2aa
+ri2aá
+ria1b
+ri2aba
+ri2abá
+ri2abo
+ri2ac
+ri2ae
+ri2aé
+ria1f
+ri2afag
+ri2afr
+ri2a1g2
+ri2ah
+ri2ai2k
+ri2aí
+ri2aj
+ri2akén.
+ri2akó
+ri2ala
+ri2alá
+ri2alu
+ri2am
+ri2ana
+ri2ao
+ri2aó
+ri2aö
+ri2aő
+ri2a1p2
+ri2ará
+ri2aré
+ri2asza
+ri2aszá
+ri2aszi
+ri2aszo
+ri2até
+ri2ato
+ri2a1t2r
+ri2au
+ri2aú
+ri2aü
+ri2av
+ri2az
+2riásá
+2riász
+r1i2ázós
+2ribé
+ri2bol
+2r1ibr
+2ribü
+ri2c1e2l
+rics1il
+ri2d1a2l
+ri2dál
+rid1d
+ri2de.
+2r1i2deá
+ri2dei
+2ridej
+ri2del
+ri2deo
+rid1ere
+ri2d1esz
+2ridil
+2r1i2dom
+2r1i2dő
+ri2du
+ri2ed
+3rie2l
+3rier
+ri1fl
+ri1f2rá
+2r1i2ge.
+2r1i2gé
+2rigi
+ri1gla
+2r1igr
+ri2har
+2r1ihl
+rihó2
+rihón1
+2rijes
+ri1klo
+ri1k2ló
+ri1k2ri
+ri2lal
+ril2l1e2h
+ril2lét
+ril2l1in
+ril2l1ő
+2rillu
+2rillú
+2riló
+2rimáda
+2rimádá
+2r1imp
+ri2n1a2d
+2r1i2nai
+ri2naj
+ri2n1a2l
+ri2n1a2n
+ri2n1a2r
+2rinas.
+2r1i2nasá
+2rinasn
+2r1i2naso
+ri2nass
+2r1i2nast
+rina1sz2
+ri2nat.
+rin2c1a
+rin2cá
+rinc3c
+rin2c1eg
+rin2cel
+rin2cer
+rin2co
+rin2csér
+rin2csi
+2r1inde
+2r1indu
+ri2neg
+2rinfl
+rin2gál
+rin2gel
+2r1ingét
+rin2gül
+2r1inha
+2r1i2nic
+ri2nil
+ri2n1ip
+2r1injek
+rin1kré
+rin3n
+2r1insp
+2r1inst
+rin2t1ad
+rintá2r
+rin2tára
+rin2táro
+rin2társ
+2rinten
+2rinterf
+rinté2r
+rin2t1ér.
+rin2t1éré
+rin2t1éri
+2rintő.
+2rintők
+ri2nül
+ri2o1k2
+rio2lok
+ri2om
+2rionn
+2riono
+2riox
+ri2óa
+ri2óá
+ri2óc
+ri2ódar
+ri2óe
+ri2óg
+ri2óke
+ri2ól
+ri2ómá
+ri2ómé
+ri2óo
+ri2ó1p
+ri2óü
+2r1i2pai
+2ripar.
+2r1ipara
+2r1i2pará
+2riparb
+2riparé
+2riparh
+2riparil
+2riparin
+2riparn
+2riparr
+2ripars
+2riparte
+2ripartó
+2riparu
+2ripl
+ripor2ta
+2r1i2ram
+2r1i2rat
+2r1i2rá
+2r1irh
+2r1i2ri
+2r1i2ro
+2r1i2rón
+2r1irr
+2r1irt
+ri2s1ar
+ri2s1as
+ri2s1ál
+ri2sáp
+ri2s1e2l
+ri2s1emb
+ri2s1e2r
+ri2sid
+ri2sii
+ri2sil
+ri2s1is
+2rismérv
+ri2s1or.
+ri2s1ort
+2r1ispá
+2ristál
+ri2sut
+ris1üté
+ri2s1ü2tő.
+ri2s1ü2v
+2r1i2szák
+ri2t1a2d
+ri2tal
+2rital.
+2r1italb
+rit1alk
+2r1itall
+2ritaln
+2r1italo
+2ritalr
+2r1italt
+rit1a2ny
+ri2tág
+rit1ell
+ri2t1i2o
+ri2t1í
+riu2méne
+riumhid2
+riumhidr1
+riu2m1i2o
+2r1i2vad
+ri2var
+2r1i2vás
+2rivo
+2r1i2vó
+rixe2
+ri2x1el
+ri2xí
+ri2xö
+2riza
+r1i2zét
+2r1izmi
+2r1izmo
+2rizmuk
+2rizmú
+ri2zsar
+ri2zseb
+ri2zsel
+2r1izza
+2r1izzó
+1rí
+rí2gé
+2ríj.
+rí2jai
+rí2jak
+rí2jam
+rí2jas
+2ríjá
+rí2ján
+rí2ját
+rí2jáv
+2r1íjh
+2r1íjj
+2r1íjl
+2r1íjr
+2r1íjv
+rí2m1a2l
+2rímá
+rím1emb
+rí2mo
+rí2mö
+rí2né
+2r1íns
+rí2ra
+r1í2rá
+r1í2ró
+2rítél
+rítés3s
+rítőa2
+rítőe2
+rítőkész1
+2r1ív.
+ríva2
+2r1ívb
+2r1í2ve
+2r1í2vé
+2r1ívh
+rí2vi
+r1í2vü
+rí2vű
+2r1ívv
+rí2za
+rí2z1el
+rízis3s
+rí2zo
+r2j1ado
+rj1any
+r2j1ág
+r2j1áp
+rjet2
+r2j1id
+r2j1ös
+r2j1u2r
+rka1b
+rk1ang
+rka1pr
+rkaros3
+rka2ró2r
+rka2s1ü2v
+rka1t2r
+r2k1ács.
+rká2csá
+rká2ne
+r2k1á2ri
+rkár1om
+r2k1á2ru
+r2k1e2dz
+rk1e2lem
+rk2elm
+r2k1eltá
+rke1p
+r2k1erd
+rk1eredő
+r2k1e2rei
+r2k1e2rez
+r2k1e2rő
+rke2szö
+r2k1ex
+rké2p1e2l
+rké2p1éss
+r2k1ér.
+r2k1érté
+r2k1étt
+r1k2hé
+rk2hón
+rkia2
+rkie2
+rki2g
+rk1iga
+rkigaz1
+rkilenc1
+r2k1imi
+rk1inga
+rki2ont.
+rki2sem
+rki2z1a
+rk1izo
+rk1kl
+r1klie
+r1k2lí
+r1k2lo
+r1k2ló
+rk1o2laj
+rko2nya
+rko2vi.
+rko2vit
+r2k1óné
+rk1ó2rá
+rk1ó2ri
+r2k1öltési
+r2k1ötl
+rkö2ző
+rk1őr.
+rk1ő2ré
+rk1őrk
+rk1őrn
+rk1ő2rö
+rk1őrr
+rk1őrs
+rk1őrt
+rk2rém
+r1k2ri
+r1k2rí
+r1k2rom
+rk1sh
+rktus1s
+rk1udv
+r2k1ug
+rku2sze
+r2k1ú2sz
+r2k1üd
+r2k1üg
+rk2vó
+rlag1g
+rla2g1ol
+rla2p1a
+rla2pál
+rlap1e
+rla2pol
+rla2p1osz
+rla1pro
+rla1s2t
+rla2t1a2n
+rla2t1ó2
+rlá2pe
+rlás3s
+rlá2s1út
+rlá2t1e2
+rlá2t1é
+rlá2tor
+rle2g1a2
+rle2g1á
+rle2ger
+rleg1g
+rlegigaz1
+rleí2
+rle2t1á2
+rle2t1eg
+rle2tell
+rle2t1elő
+rle2t1ék
+rle2tél
+rle2t1ér.
+rle2t1érv
+rleü2
+rlésát1
+rlésáta2
+rlés3s
+rl1gr
+rló1g2
+rlóó2
+rlót2
+rlőe2
+rlő1sta
+r2m1akad
+rmaké2sz1ü
+r2m1a2kó
+rma1kré
+r2m1alt
+r2m1a2nya
+rmaó2
+rma2t1á2ru
+rma2t1ur
+rma2zon
+rmá2lér
+rmá2nyan
+rm1á2ram
+r2m1á2ro
+r2máru
+rm1cl
+rmege2
+rmeg1er
+rme2g1es
+rme2g1é
+rme3g2ö
+rme2k1an
+rme2kar
+rmeká2
+rme2k1eg
+rme2k1e2l
+rme2kérd
+rme2kor
+rme2kot
+rme2k1ó2
+rmekö2r
+rme2körö
+rm1elk
+r2m1elm
+rme2ran
+rme2ras
+rme2rin
+r2m1e2rői
+rme2rők.
+rme2rőke
+rme2rőkn
+r2m1e2rőm
+rmert2
+rmer1tr
+rm1esem
+rme2t1él
+rme2tin
+rmé2k1e2l
+rmé2ker
+r2m1é2le
+r2m1ép
+r2m1ér.
+r2m1érte
+r2m1étk
+r2m1étr
+r2m1étt
+rmi2g
+r2m1iga
+r2m1igé
+rm1illa
+rminc3s
+rm1inte
+r2m1irá
+rmi2si
+r2m1isko
+r2m1ism
+rmite2
+rmi2t1el
+r2m1íg
+rmjob2
+rm1kl
+rmo2n1a
+rmo2nár
+rmo2n1e
+rmon1n
+rm1ope
+r2m1ors
+rmo1sz2fér
+rmő2szá
+rm1p2l
+rm1p2r
+rm1sk
+rm1st
+rm1sz2
+rm1tr
+rm1üg
+rm1üz
+rmű1s
+rm1ya
+rna1b
+rna1f2
+rna2gyú
+rnai2k
+rna1k2r
+rna2pes
+rna1pro
+rnas2
+rna1sp
+rna1sz2
+rna1t2
+rná2cs
+r2n1el.
+r2n1elb
+r2n1elf
+r2n1elh
+r2n1elj
+r2n1ell
+r2n1eln
+r2n1elr
+r2n1elt
+rne2m1is
+r2n1est
+rne2t1a2
+rne2t1e2l1
+rnet1o
+rnés2
+rné1st
+r2n1i2d
+rni2g
+r2n1iga
+rno2kis
+rnó1d2
+rnö2ket
+rnus3sze
+rny1a2dó
+r2nyakad
+r2nyalako
+r2ny1alk
+r2nyarc
+rny1álm
+r2ny1ell
+r2nyelm
+r2ny1eln
+r2ny1elo
+rny1elvo
+rny1emb
+r2nyerd
+r2ny1e2rez
+rny1e2ső
+rny1ékné
+rny1ész
+r2ny1id
+r2nyiz
+rnyolc1
+rny1old
+r2ny1or
+rny1ök
+r2nyöt
+rny1s
+r2ny1ur
+1ro
+ro2ad
+roa2n
+2r1obj
+2robl
+r1obs
+roc2ke
+ro1cker
+roc2kén
+ro1c2kok
+ro1c2kon
+roc2kos.
+2r1o2dú
+rofi2tár
+ro1fl
+ro1fr
+ro2g1ad
+ro2g1ak
+ro2gal
+ro2g1am
+ro2gar
+ro2g1á2r
+ro2g1áz
+rog1enc
+ro2ger
+ro1g2ló
+ro2g1o2l
+ro2gor
+ro2g1osz
+ro2gö
+3rográ
+ro1g2ráf.
+ro1g2ráff
+rogu2
+ro2gur
+ro2gü
+3rogy
+ro2he
+ro2hö
+ro2is
+3rojt
+ro2ka.
+ro2kab
+ro2kac
+ro2k1a2d
+ro2kait
+ro2k1aj
+ro2kak
+ro2k1al
+ro2k1a2n
+ro2k1a2s
+ro2káb
+r1o2kád
+ro2k1ál
+ro2kán
+ro2k1á2s
+roke2
+ro2ked
+ro2k1en
+2rokett.
+r2oké
+ro2kék
+ro2k1é2l
+ro2kép
+ro2kid
+ro2k1ing
+ro2k1í
+2rokod
+rok1old
+ro2kő
+2r1okság
+rok1t2
+2r1oktat
+2roktán
+ro2k1u2s
+rokú2
+ro2kú.
+ro2kús
+ro2kü
+2r1o2laj
+rola2n
+rolás1s
+2r1oldá
+2r1oldó
+ro2l1i2d
+roligar2
+roligarc3
+rol2l1a2d
+rol2lag
+rol2l1akn
+rol2lan
+rol2lat
+rol2leg
+rol2lel
+rol2lis
+2r1olló
+2r1oltás
+2r1oltó.
+2r1oltób
+2roltóé
+2roltóh
+2r1oltói
+2roltóké
+2roltóm
+2roltón
+2r1oltót
+2r1oltóv
+2r1oltv
+ro2lü
+2rolvad
+2rolvas
+2r1o2lyai
+2r1o2lyáh
+2r1o2lyán
+2r1o2lyár
+2rolyéb
+2rolyéh
+2rolyéi
+2rolyén.
+2rolyiér
+2r1o2lyuk
+rom1ajt
+rom1akk
+rom1akó
+ro2m1a2ro
+ro2m1ál
+2romám
+ro2m1á2ri
+ro2m1árk
+ro2m1árn
+ro2m1á2ro
+rombé2
+rom2bén
+ro2meg
+ro2m1el
+ro2m1e2r
+ro2m1es
+ro2méj
+ro2m1é2ne
+rom2f1os
+ro2mim
+rom1iná
+rom1ist
+ro2mita
+ro2miz
+ro2mí
+romköz1
+2r1omni
+ro2m1o2r
+ro2m1ó2r
+ro2mö
+ro2mő
+rom1pr
+ro2mü
+ron1alj
+ron1alt
+ron1alu
+ron1any
+rona1t2
+rona2ut
+ro2n1áta
+ro2n1átr
+ron2csel
+ron2csem
+ro2nen
+ron1esz
+ro2n1ér.
+ron2gal
+ro2n1i2ko
+ro2n1i2m
+ro2ní
+ro2nop
+ro2nóc
+ro2n1ó2r
+ro2nö
+ro2nő
+ron1s2
+ron2tab
+ron2tem
+ron2tev
+ron2t1én
+ron2tin
+ron2tí
+2rontóé
+2r1ontóh
+2rontóig
+2rontós
+ro2nü
+ro2nyac
+rony1a2l
+ro2nyid
+ro2nyik
+ro2nyir
+ro2nyó
+ron2zab
+ron2z1al
+ron2zer
+ron2zin
+ron2z1ol
+ron2z1or
+ron2z1ó2
+ronz1z
+ro2om
+ro2os
+2r1opc
+2rope
+ro2per
+ro1p2l
+ropo1s
+rop2s
+ro2rak
+ro2r1a2l
+ro2rat
+ror1áll
+rore2
+ro2reg
+ro2r1el
+ro2r1es
+ro2r1in
+ro2rosz
+rort2
+ror1tr
+ro2rü
+ro2sar
+ros1ass
+ro2s1atl
+ro2s1av
+ro2s1árk
+ro2s1áro
+ro2sem
+ro2s1ist
+ro2s1ol
+ro2s1ó2
+ro2sö
+ro2ső
+ros3sze
+ros3szék
+ros2tet
+2rostob
+ros2tol
+2rostya
+ro2s1út
+ro2szal
+ro2szan
+ro2szás
+2r1oszlo
+ro2szó
+r1osztá
+2roté
+ro1t2he
+roto2na
+ro1t2ró
+2rotth
+ro2un
+ro2us
+rova2re
+rovás1s
+2r1o2vi.
+2r1o2vib
+2r1o2vik
+ro2vis
+2ro2xidb
+2ro2xidr
+2roxilc
+ro1xy
+ro1ya
+roza2tal
+ro2zsan
+1ró
+róa2d
+rób1ajt
+2róbá
+róc3c
+ró2c3h
+ró2cin
+ró2c1ö
+ró2c3sá
+ró2cz
+ró2dai
+ró2dep
+ródi2ad
+ró2dő
+ró2dü
+2r1óév.
+2róéve
+2r1óévé
+ró2f1ag
+2rófea
+2rófeá
+ró2f1iv
+2rófs
+ró2fur
+ró1g2r
+rói2g
+róke2rest
+róke2r1in
+ró1k2l
+ró1kré
+2r1ólm
+r1ó2lom
+ró2m1a2l
+róma2r
+róm1ara
+ró2mál
+róme2l
+ró2mél
+róm1isz
+ró2mí
+2rómk
+ró2mö
+ró2mü
+róne2m
+2r1ó2néb
+2rónéé
+2r1ó2néh
+2r1ó2nén
+2rónér
+2rónét
+2rónév
+2rónj
+2rónn
+2rónr
+rónus3s
+2rónú
+ró2nü
+róo2k
+róó2r
+ró1p2l
+ró1pro
+2r1ó2raa
+2r1ó2rac
+2r1ó2rad
+2r1ó2rae
+2r1ó2raf
+2r1ó2rag
+2róraje
+2r1ó2ram
+2r1ó2ran
+2r1ó2rap
+2r1ó2rar
+2r1ó2ras
+2r1ó2rat
+2róraü
+2r1ó2rav
+2r1ó2ráb
+2r1ó2rád
+2r1ó2ráé.
+2ró2ráén
+2r1ó2ráév
+2r1ó2ráh
+2r1ó2rái
+ró2rája
+2r1ó2ráka
+2r1ó2rákb
+2r1ó2ráké
+2ró2rákh
+2róráki
+2r1ó2rákk
+2r1ó2rákn
+2r1ó2ráko
+2r1ó2rákr
+2r1ó2rákt
+2r1ó2rán.
+2r1ó2rána
+2r1ó2ráná
+2r1ó2ránk
+2r1ó2rány
+2r1ó2rár
+2r1ó2rás
+2r1ó2rát
+2r1ó2ráv
+2r1ó2riá
+rós1orom
+ró1spi
+2rótb
+2róth
+ró2tip
+rót1ist
+2rótj
+2rótk
+2rótm
+2rótn
+ró2t1ö2v
+ró1tri
+ró2tül
+2r1ó2vó
+róza1t2
+ró2z1e
+ró2z1in
+ró2zú
+ró2zü
+1rö
+2r1öbl
+2r1ö2böl.
+2r1öbölb
+2r1öbölh
+2r1öböli
+2r1öböll
+2r1ö2böln
+2r1öbölr
+2röböltő
+rö2ga
+rö2go
+rö2gó
+rö2k1é2l
+rö2k1érv
+2rökí
+2röklé
+rö2ko
+2r1ö2kör
+2rökösé
+2rökösö
+2r1ökrö
+rö2lős
+rö2lyü
+rö2ma
+rö2má
+2röme.
+2römed
+rö2meg
+2römei
+2römén
+2römét
+2römév
+rö2mí
+2römmű
+rö2mo
+rö2mó
+2römöd
+2römök
+2römöt
+rö2mu
+2römü
+2römű
+rön2d1e
+rön2k1a2
+rön2k1e2
+rön2kép
+rön2kol
+rön2kos
+rön2k1öl
+rön2k1ü
+rö2p1i2
+rö2re
+rö2rö
+rö2sa
+rö2sá
+rö2so
+rös3sza
+2r1öv.
+2r1övb
+2r1ö2ve
+r1ö2vé
+2r1övh
+2r1övn
+2r1ö2vö
+2r1övr
+r1ö2vü
+2r1övv
+1rő
+rőa2n
+rőát1
+rőáta2
+rő1bl
+rő1br
+rő2dá
+rő2d1e2l
+rő2dos
+rő2d1ő2r
+rőe2l
+rőe2r
+rőe2s
+rőé2h
+rőé2l
+rőé2r
+rőé2te
+rő2f1as
+rő1fl
+rő2f1ő
+rőgé2p1és
+rői2ta
+rő1kl
+rő1kv
+2rőlt
+rő1pl
+rő1pr
+2r1őr.
+rőr1ak
+rőr1eg
+r1ő2rei
+r1őrh
+rőr1in
+rő2riz
+rőrköz1
+2r1őrl
+2r1őrm
+2r1őrn
+rő2rö
+2r1őrp
+2r1őrr
+2r1őrs
+2r1őrt
+2r1ő2rü
+2r1őrz
+rősá2
+rő2sár
+rő2sír
+rő1ská
+rő2ső
+rő1spe
+rő1s2pi
+rő1sta
+rő1str
+rősü2l
+rő2s1ülő
+rő2s1ült
+rő2s1ü2t
+rő2s1ű2
+rősza2kál
+rőu2t
+rőü2l
+rőva2s1
+rő2zi.
+rő2zön
+rpei2
+rpe2szel
+rp2he
+r2p1ig
+rpis1á2
+rpi2t1a
+rpi2t1e2
+r2p1ivá
+r1p2la
+rp2le
+rp2lé
+rp2lu
+rp2lü
+rprecíz1
+r1p2ré
+r1p2ri
+r1p2rí
+r1p2ro
+r1p2ró
+rpu2szé
+r2p1üz
+r2r1a2lap
+rra2sza
+rra2szi
+rrata2n
+rrat1any
+rra2t1á2r
+rra2t1e
+r2r1ábr
+rrádiók2
+rrádió1kb
+r2r1á2ga
+r2r1á2gy
+r2r1árb
+rrá2saj
+rrá2sar
+rrá2ság
+rrá2se
+rrás3s
+rrá2sü
+rrá2s3z
+rrá2tal
+r2r1áts
+rre2l1i
+rr1emb
+rren2d1ő2
+r2r1ék
+rré2r
+r2r1éri
+rré2sem
+rr1fl
+rr1fr
+r2r1i2de
+rr1in.
+rr1ing
+r2r1ir
+rri2ta
+rr1i2zé
+rr1izg
+rr1izm
+rr1k2r
+rr1ope
+rro2rál
+rror1osz
+rró1dr
+rró1p
+r2r1öb
+r2r1ös
+rr1pl
+rr1pr
+rr1sp
+rr1t2r
+r2r1u2r
+r2r1ür
+r2r1üt
+rry2n
+r2s1a2dó
+r2s1a2g
+rsa2il2
+rs1akku
+rs1alan
+rsa2lap
+r2s1ale
+rs1alm
+r2s1a2lomb
+r2s1ana
+rs1a2ny
+r2s1a2pá
+r2s1a2po
+rs1a2ra.
+r2s1arc
+rs1arom
+rs1arz
+rs1att
+rsa2v1ar
+rsa2v1é2
+rsa2v1i
+r2s1ax
+r2s1a2z
+r2s1ábr
+rság1g
+rs1áld
+r2s1á2ré
+r2s1árn
+r2s1árr
+r2s1á2ru
+rs1áté
+rs1áti
+rs1bl
+rs1br
+rs2ch2
+r1sche
+rsc3hé
+rs1d2r
+rs1edz
+r2s1ef
+rs1e2gét
+r2s1e2gy
+rse2il
+rse2k1a2
+rse2keg
+r2s1e2leme
+rs1elf
+r2s1elk
+r2s1e2lőa
+r2s1e2lől
+rs1e2mi
+r2s1e2mu
+rse2ny1a2
+rse2nyeg
+rse2ny1e2l
+rse2nyer
+rse2nyí
+rse2nyő
+r2s1erd
+r2s1erk
+rs1erő
+r2s1ess
+r2s1esz
+rsé2g1el
+r2s1él
+r2s1ép
+r2s1ér.
+r2s1érd
+r2s1érl
+r2s1érték
+r2s1és
+rs1é2te
+rs1étk
+rs1étt
+rs1fr
+rs1gl
+rs1gr
+rsi2d
+rs1ide
+rs1ido
+rsi2g
+rs1iga
+r2s1ikr
+r2s1ill
+r2simm
+rs1ind
+r2s1ing
+r2s1int
+r2s1i2o
+rs1i2pa
+rs1iro
+r2s1i2si
+r2s1isk
+r2s1ism
+r2s1ist
+rs1írn
+r2s1í2ró
+r2s1írt
+r1s2kál
+r1skj
+rs1kl
+rs1k2r
+r1s2lu
+rs2mink
+rs2ni
+rs1ond
+rsonya2
+rso2nyal
+rso2nyan
+rso2nyat
+rso2nyé
+r2s1op
+r2s1ord
+r2s1org
+rs1osz
+rsócsa2
+rsócsap1
+r2s1ódá
+r2s1óné
+rsó2s3zárr
+r2s1öb
+rs1önt
+rs1örv
+r2s1ös
+r2s1ö2z
+rs1őr
+rs1pl
+rsp2r
+r1s2rác
+rs1s2t
+rs3szag
+rs3szak
+rs3szá
+rs3szem.
+rs3szemet
+rs3szer.
+rs3szerű.
+rs3szerűb
+rs3szerűe
+rs3szerűn
+rs3szerűs
+rs3szerűt
+rs3szerűv
+rs3szi
+rs3szí
+rs3szó
+rs3szö
+r1stand
+r1s2tat
+r1s2tác
+r1s2tát
+rs2top
+rst2r
+r1strat
+rs1tre
+rs1tré
+r1stró
+r1stru
+r1s2tú
+rsu2r
+rs1ura
+rsu2t
+r2s1uta
+rs1utá
+rs1úr.
+rs1ú2ri
+r2s1ú2s
+rs1úto
+r2s1üd
+rs1üld
+r2s1üz
+rsza2k1a2l
+rsza2k1e
+rsza2kö
+rsza2k1ü
+r2szaló
+r2s3zam
+rszág1g
+rszáraz1
+rs3zárl
+r2s3zené
+r1sz2f
+rsz2lo
+rsz2m
+rszom2j1a2d
+rs3zse
+rs3zsi
+rsz2ta
+rszt1al
+rszt1árv
+rszt2rá
+r2s3zűr.
+r1sz2v
+r2t1abla
+r2t1abr
+r2t1a2dat
+rt1a2dó
+r2t1a2ga.
+rt1agit
+r2t1ajá
+rt1ajtó
+r2t1a2kara
+r2t1akc
+rta1kre
+rta1k2ré
+rt1alapj
+rt1a2láb
+r2t1alár
+r2t1alb
+r2t1alel
+r2t1alg
+r2t1alj
+r2t1alk
+r2t1alt
+r2t1alv
+rta2m1ér
+rt1anim
+rta2n1ó2r
+r2t1anto
+r2t1antr
+rt1a2nyag
+rt1app
+rt1arán
+r2t1arc
+rta2rén
+rt1a2ty
+rt1a2uto
+r2t1azo
+rt1ábr
+r2t1áf
+rt1ág.
+rt1á2ga
+rt1ágb
+rt1ágg
+rt1ágj
+rt1ágn
+rt1ágr
+rt1ágs
+rtá2lad
+rtá2lala
+rtá2rada
+rtá2raj
+rtá2ramr
+rt1ária
+rt1áriá
+r2t1árin
+rt1árszi
+rt1árszí
+r2t1árta
+rtá2ruké
+rtá2rukk
+rtá2rukn
+rtá2rukr
+rtá2rukt
+r2t1árur
+r2t1árut
+rtá2s1ág
+r2t1ásás
+rtá2s3z
+r2t1á2t1a
+r2t1átl
+r2t1áts
+r2t1átv
+rtá2v1é
+rtávi2
+rt1bl
+rt1br
+rt1cl
+rt1cr
+rt1dr
+rtea2
+rt1e2gé
+rt1e2gye
+rtei2
+r2t1eks
+r2t1elad
+r2t1elb
+r2t1elf
+rt1eljá
+rt1elker
+rt1elkö
+rt1elkü
+rtel2la
+rtel2l1á2
+rt1elma
+rt1e2lőa
+rte2lől
+r2t1elr
+r2t1ember
+r2t1eml
+r2t1enc
+r2t1ent
+rte1p
+rte2rac
+rte2rál
+rte2r1in
+rtermo1
+rtermosz2
+rte2r1os
+r2t1e2ró
+r2t1erő
+rte1sp
+rt1esték
+rt1estné
+r2t1estün
+rte2sze.
+rte2szei
+rte2szek
+rte2szem
+rte2szet
+r2t1eszk
+r2t1eszm
+r2t1e2szü
+r2t1é2d
+rt1é2gi
+rté2kaj
+rté2k1a2l
+rtékát1a2
+rték1í
+rté2kos
+rté2ku
+r2t1é2let
+rté2lén
+rt1é2li
+r2t1élm
+r2t1é2neke
+r2t1é2nekk
+r2t1é2nekr
+r2t1épü
+r2t1érdem
+r2t1érem
+r2t1é2ré
+r2t1érin
+r2t1é2rit
+r2t1értek
+r2t1érté
+r2t1érv
+r2t1érz
+rté2s1ég
+rtéskész1
+rtés3sza
+rté2sül
+rté2szá
+rté2szo
+rté2szö
+rtés3zsí
+r2t1étk
+r2t1étl
+r2t1étt
+r2t1étv
+r2t1é2ve.
+r2t1é2vet
+rté2véné
+r2t1é2vér
+rt1évk
+rt1fl
+rt1fr
+rt1gr
+r1t2ha.
+r1t2hág
+r2t1i2de
+rt1idé
+rt1idi
+rt1ifj
+r2t1i2gé
+r2t1ill
+r2timá
+r2t1i2mi
+r2t1imp
+r2t1i2náb
+r2t1i2náé
+r2t1i2náh
+r2t1i2nán
+r2t1ind
+r2t1inf
+r2t1ing
+rti2nik
+r2t1i2pa
+r2t1irá
+r2t1iro
+r2t1isi
+r2t1isk
+r2t1ism
+r2t1isza
+rt1i2tal
+r2t1izé
+rt1izm
+r2t1izz
+r2t1íg
+r2t1íj
+r2t1ín
+rtí2ra
+rtí2rá
+rt1í2ve
+rt1í2vű
+rtí2z
+rt1ízl
+rt1kl
+rt1kr
+rt1kv
+rtmű1
+rtműt2
+r2t1of
+rto2kad
+rto2k1a2l
+rto2k1ar
+r2t1o2li
+r2t1oml
+rto2n1a2
+rtoná2
+rto2nár
+rt1opá
+rt1ope
+rt1opt
+r2t1org
+r2t1o2rom
+r2t1orr
+r2t1ors
+r2t1orv
+r2t1osz
+rtóe3rejü
+rtó1p
+rtó2rák
+rtó2s1ín.
+rtó1sp
+rtó2s3zár
+r2t1ökl
+rt1ököl
+r2t1ö2lőse
+rtön3n
+rt1ö2rök
+rt1öröm
+r2t1össz
+rt1ö2vez
+rtőé2h
+rtőkész1
+r2t1őrköd
+rt1őrl
+r2tőrül
+rt1pl
+rt1pr
+rt1ps
+rt2rad
+r1t2raf
+r1t2ranz
+r1t2rág
+r1t2riá
+r1t2rik
+r1t2ril
+r1t2rió
+r1t2rón
+r1t2rü
+rt1sk
+rt1sl
+rt1sp
+rt1st
+rtsz2
+rt1t2r
+r2t1udv
+rtu2k
+rt1uká
+r2tunik
+rtu2rai
+rtu2ral
+rt1u2rá
+rtu2sze
+rt1utá
+r2t1új
+r2t1ú2s
+r2t1üg
+r2t1üld
+r2t1ü2lé
+rt1ülő
+r2t1üt
+r2t1ü2v
+rt1ű2ző
+r2tying
+rty2j
+rty2s
+r1t2zé
+r1t2zi
+rt2ző
+1ru
+ru2ac
+ru2b1i2k
+ru2c3h
+ru2cz
+2r1udv
+rue2l
+rue2r
+ru1fr
+2rugar
+2r1u2gat
+rug3gy
+2r1ugr
+ruhás1s
+2r1ujj
+ru1k2l
+2ruktu
+2ruktú
+rum1agr
+ru2maj
+ru2mal
+ru2maz
+ru2m1eng
+ru2mer
+ru2mes
+ru2mél
+ru2m1i2k
+rum1ill
+ru2m1i2p
+ru2mis
+ru2m1iv
+ru2miz
+ru2mí
+ru2mol
+ru2m1o2r
+ru2mö
+ru2mő
+ru2mü
+2r1unc
+run2da
+ru2nit
+r1u2nok
+ru2pad
+ru2pe
+ru2p1il
+ru2pü
+ru2rad
+ru2rai
+r1u2ral
+ru2ras
+ru2rat
+r1u2raz
+ru2rán
+ru2rát
+2r1urb
+ru2ruk
+rus1abl
+ru2sad
+ru2sal
+rusa2n
+rus1any
+rusa2r
+rus1aro
+ru2sas
+ru2sál
+ru2s1iz
+ru2sír
+ru2s1ol
+ru2s1ó2
+ru2ső
+russ2
+russz2
+rust2
+rus1tra
+ru2s1ű2
+ru2sz1é2p
+ru2szip
+r1u2tac
+r1u2tak
+r1u2tat
+r1u2taz
+2r1utc
+r1u2tó.
+r1u2tób
+r1u2tód
+r1u2tói
+r1u2tój
+r1u2tók
+r1u2tón
+ru2tóp
+r1u2tór
+r1u2tós
+r1u2tót
+r1u2tóv
+1rú
+rúda2
+rú2dad
+rú2d1al
+rú2d1ar
+rú2d1á
+rú2del
+rú2din
+rú2du
+rú2dü
+rú1dy
+rú2d3z
+rú1gr
+2r1újd
+rú2jí
+2r1újk
+2r1újs
+2r1úr.
+2r1úrb
+2r1úrh
+2r1ú2ri
+2r1úrk
+2r1úrn
+rú2ro
+2r1úrr
+2r1úrt
+rú2szó
+rú2t1a2l
+2r1ú2t1e2
+2r1ú2té.
+rú2tér
+rú2tit
+2r1útk
+2r1útle
+2r1útm
+rúto2
+2rúts
+2r1ú2tü
+2r1útv
+rú2zsad
+rú2zse
+1rü
+rü2dí
+rü2dü
+rü2gyel
+2rügyn
+rü2ha
+rü2la
+rü2lá
+rü2led
+rü2les
+rü2lép
+rü2lér
+rü2lí
+rü2l1o
+rü2ló
+rülö2
+rü2l1ön
+rü2l1öz
+rü2l1őg
+rü2lu
+rü2lú
+rü2l1ül
+2r1ünn
+2r1ü2nő
+rü2rí
+rü2rü
+rü2te
+rü2té
+rü2tö
+rü2tő
+rü2vö
+rü2ze
+rü2zé
+1rű
+rű1gr
+rű1kl
+rű1pr
+2r1űr.
+2r1űrh
+2r1űrm
+rű2rö
+2r1űrt
+rű2s1orr
+rűs1ors
+rű1sp
+rű1str
+r2v1agá
+r2v1akc
+rva2lap
+r2v1alj
+r2v1alk
+r2v1a2rán
+rva2sáb
+rva2sék
+rvasu2
+r2v1a2szó
+rva1t2r
+rvavá2
+r2v1ága
+rvá2gyi
+r2vállam
+r2v1állo
+rv1állv
+rvá2nyad
+rvá2nyan
+rvá2nyú
+r2v1áp
+rvá2r1al
+r2v1á2ram
+rváro2s1os
+rv1á2rú
+r2v1á2sás
+r2v1áta
+rvá2tors
+r2v1e2b
+r2v1e2dz
+r2v1e2gye
+rv1ela
+rv1e2led
+rve2lemb
+r2ve2leme
+rv1e2les
+r2v1elk
+r2v1ell
+r2v1elo
+r2v1e2lőa
+rv1e2lőá
+r2v1e2lőkép
+r2v1előr
+r2velőz
+r2v1eng
+r2v1ep
+rve2r1a
+rve2r1á2
+r2v1e2retn
+rverés3s
+rve2rip
+rve2r1o
+r2v1e2rői
+r2v1e2sete
+r2v1e2sés
+r2v1ex
+rv1éke
+rv1ékk
+rv1ékn
+rv1ékü
+rv1é2lel
+r2v1é2lé
+rvé2ny1el
+r2v1ép
+r2v1é2rem
+r2v1é2ré.
+r2v1érés
+r2v1érp
+r2v1érté
+r2v1érv
+r2v1é2vet
+r2v1évi
+rv1fr
+r2v1ido
+r2v1iga
+rvigaz1
+r2v1igé
+r2v1ik
+r2v1inf
+rv1inte
+rv1inté
+r2v1i2p
+r2virán
+r2v1isme
+rvis3sze
+rv1ital
+rvi2z1a2
+rvi2z1á2
+rvi2z1elv
+rviz1o
+rvi2zó
+rvíze2
+rvíz1es
+rv1kl
+rv1kr
+r2v1ob
+r2v1olv
+r2v1op
+r2v1or
+rv1osz
+r2v1ov
+r2v1ó2h
+r2v1órá
+rv1öss
+rv1ős
+rv1pr
+rv1sk
+rv1sp
+rv1st
+rv1tr
+r2v1ub
+r2v1u2t
+r2v1üg
+rvü2l
+r2v1ülé
+r2v1ülő
+r2v1ült
+r2v1üt
+r2v1ü2v
+r2v1ü2z
+ry2be
+ry2bó
+ry2bő
+ry1é2n
+ry2ho
+ry2na
+ry2ne
+ry2ra
+ry2re
+rys2n
+ry2tó
+ry2tő
+ry2va
+ry2ve
+r2z1a2dot
+r2z1a2la
+r2z1alj
+r2z1alk
+rz1almás
+rza2sz
+r2z1aszó
+rza2tal
+rza2t1e2
+rza2tol
+r2z1áll
+rzá2r1ó2r
+rzá2se
+rzás1s
+rz1e2be
+rze1p2
+rz1est
+rze2tal
+rze2t1eg
+rze2t1e2l
+rzetes3s
+rze2t1o
+rzetü2két
+rzéna2
+rzé2n1al
+rzé2nat
+rzé2ná
+r2z1érm
+rzé2so
+rzi2ab
+rzis3s
+r2z1ín
+rzo2r1ál
+rzó2s3zár
+rzőa2
+rzőe2
+rz1p2r
+rzs1ala
+rzs1any
+rzs1apa
+r2zsaz
+r2z3sár.
+rz3seben
+r2zs1e2g
+r2zs1e2r
+r2zség
+r2zs1ék
+r2zs1ér.
+r2zséva
+r2zs1iga
+rzs1inj
+rzs1int
+r2zsip
+r2zsita
+rzs1or
+r2zs1ö2r
+r2zs1ő2
+rzs1s
+rzs1u2t
+rzs1úr
+rzs1ült
+rzu2sak
+rzu2san
+rzus3s
+rzu2s3z
+r2z1ut
+2s.
+1sa
+2sabo
+2sabr
+2s1abs
+2s1a2cé
+sa2dalé
+2s1adap
+2s1a2data
+2s1a2dato
+2s1adató
+sadás1s
+2s1adm
+sa2dog
+sa2dóc
+sa2dód
+sa2dóé
+sa2dóh
+sa2dói
+sa2dój
+sa2dóm
+sa2dón
+sa2dór
+sa2dóu
+sa2dóz
+sae2r
+sa1f2r
+2saga
+sa2gan
+sa2g1ál
+2sagg
+sa1gne
+2s1a2gó
+sa2gő
+sa1grá
+s1agy.
+s1agyb
+s1a2gyo
+sa2gyú
+3sah.
+saha2r
+sa2hov
+sa2ig
+2saja
+sa2jak
+sa2jág
+2saján
+sa2j1ö
+saj2tal
+saj2t1a2n
+saj2tar
+sajté2r
+saj2t1éré
+saj2tor
+saj2t1ö
+saj2t1ü2
+sa2k1ab
+2s1a2kad
+sa2k1an
+sa2kas
+2s1akci
+sak2k1a2r
+sak2k1as
+sakke2
+sak2k1eg
+sak2ker
+sak2kes
+sak2kis
+sak2kol
+sak2k1orr
+sak2k1ó2
+2sakku
+sa1klu
+2s1akna.
+2saknáb
+2saknái
+2s1aknák
+sak1ola
+sa2k1orm
+sa2k1ös
+sa1k2ru
+2s1akt.
+2s1akti
+2s1aktu
+sa2k1ug
+2s1a2kus
+sa1k2va
+2salab
+sala2g1
+sala2ka
+sa2laku
+2s1a2lapa
+sa2lapí
+sa2lapl
+sa2lapoz
+s1a2lapr
+sa2lapt
+salá2da
+2saláí
+salán1n
+salás1s
+2s1aláté
+2s1alb
+s1a2lel
+s1alépí
+salé2t
+sa2l1éte
+2salf
+2s1algáh
+2s1algái
+2s1algán
+2salgásat
+2s1aljai
+2s1aljáh
+2s1aljár
+2s1alját.
+2s1alka
+2s1alkot
+s1alku
+2salm
+2s1a2lomn
+2s1a2lomr
+sal2tag
+2s1alte
+2s1alth
+2s1altit
+sa2l1ú
+sa2m1any
+sa2mec
+sa2m1il
+sa2m1í
+sa2mol
+sa2m1osz
+2s1a2mő
+sa2nal
+sa2nat
+s2and
+2sane
+sa2nek
+2s1angy
+sa2nód
+sa3nö
+s1ante
+sa2nya.
+s1a2nyag
+sa3nyar
+2sanyá
+saó2r
+sa2p1a2dó
+sa2p1a2g
+sapa2te
+sa2pác
+sap1á2cs
+sap1áll
+sa2p1átm
+sa2páto
+sa2p1el
+sa2p1ék
+3sapka
+3sapkáb
+3sapkán
+3sapkás
+3sapkát
+3sapkáv
+sa2p1osz
+s1a2pókr
+s1a2pósab
+2sapp
+s1aprí
+sa1pro
+2sapu
+sa2ratá
+sa2rató
+sa2rány
+sar2c3ho
+sar2cin
+sa2rén
+sa2rit
+sar2j1e
+sar2k1e2
+3sarki
+sar2kin
+sar2kir
+sar2k1ö2
+3sarkú
+3sarló
+2sarm
+2sarom
+2sarz
+sase2
+sa2s1eb
+sa1s2m
+sa1s2po
+sas3sza
+sas3szá
+sas3sze
+2s1asszo
+3sast
+sa2s1u2t
+sa2sú
+s1aszf
+2saszt
+sata2kés
+sa2t1alj
+sa2t1alt
+sa2t1a2nyá
+sat1apu
+sa2t1á2rak.
+sa2t1árka
+sa2t1érk
+sa2t1érr
+sa2t1i2k
+sa2t1ing
+s1atlé
+satmo1
+satmosz2
+2s1a2tombó
+2s1a2tomo
+sa2t1orm
+sa2t1ó2d
+sa2t1ó2né
+sa1t2rá
+2saty
+sa2tyá
+sa2ul
+sa2urá
+2saut
+sa2uto
+s1autó.
+sautóé2r
+sautói2ko
+sa2uv
+3sav.
+3sava.
+sa2v1a2da
+sa2v1a2l
+3saván
+sav1ára
+sav1ária
+sa2v1árt
+sa2v1el
+sa2v1ér
+sav1ill
+sa2v1i2n
+sa2vő
+sa2vü
+sa2xi
+sa2zon
+1sá
+sá2b1ak
+sá2b1e2l
+sá2b1e2r
+sá2big
+sá2b1il
+sá2bö
+sá2buj
+sá2b1ut
+sá2bü
+sá2csá
+sá2gab
+sága2d
+ság1ada
+2ságadd
+sá2gal
+sá2gan
+sá2gas
+2s1ágas.
+ság1ass
+sá2gat
+2s1á2gaz
+sá2g1ál
+sá2g1á2rak
+sá2g1árn
+sá2g1á2ru
+sá2g1e2
+sá2gép
+sá2g1i2ko
+sá2gí
+sá2g1osz
+sá2g1ó2
+sá2g1ö
+sá2gő
+ság1s
+sá2gü
+sá2gű
+4s1á2gy
+ságy1a2d
+sáka2
+sá2kal
+sá2k1an
+sá2kar
+sá2kát
+sá2k1e2
+sákköz1
+sá2k1ö
+sá2kü
+s1álc
+sá2l1in
+2s1álm
+s1á2lomb
+3sámá
+sán2c1é
+sán2c3so
+sán1k2r
+sánt2
+sán1th
+sá2nü
+sá2p1ost
+sá2rad
+sár1adá
+sár1a2dó
+sá2r1ag
+sá2raj
+2s1á2rak.
+sá2raka
+2s1á2rakb
+2s1á2rakh
+2s1á2rakk
+2s1á2rakn
+2s1á2rako
+2s1á2rakr
+sá2rakt
+sá2r1a2l
+2s1á2ram
+sá2r1a2n
+2sá2ras
+sár1ass
+sár1asz
+2s1á2rat
+sá2rág
+sá2r1ál
+sár1d2
+sá2r1e2
+2sárét
+sá2r1év
+sá2ria.
+2s1á2riá
+sár1iko
+sá2r1i2p
+sá2r1i2s
+sá2rí
+sár1k2
+sá2r1osz
+sár1ott
+sár1óni
+sá2rö
+sá2rő
+2sárro
+sár1s2
+sárt2
+sár1tr
+sá2rug
+2s1á2ruh
+2s1á2rul
+2sárus
+sárú2
+2s1á2rú.
+sá2rü
+sá2s1ad
+sá2sar
+sá2sás
+sá2s1e2
+sá2sis
+sáskész1
+sá2só
+2s1ásó.
+sás1ó2r
+2s1ásóv
+sá2sö
+sá2ső
+sás3sz
+sá2s3za
+sászá2r1a2d
+2s1á2szo
+2sáta
+s1átad
+sá2t1alj
+s1á2tál
+s1á2t1á2z
+2s1átb
+2s1átc
+2s1átd
+2s1á2t1e2
+2sáté
+sá2tél
+2s1átf
+2sáth
+2sáti
+sá2t1ir
+2s1á2tí
+2sátj
+2sátk
+2s1átm
+s1á2tokt
+3sátor
+sátókész1
+2s1á2t1ö
+3sátra
+3sátrá
+s1átre
+2sáts
+2sátt
+s1áttö
+2sátu
+2s1á2tü
+2sátv
+s1átve
+s1átvé
+s1átvi
+3sáv.
+sá2v1a2d
+sáva2l
+sá2v1a2r
+sá2v1ál
+sá2v1á2r
+3sávb
+sá2v1e2
+sá2v1érz
+sá2vis
+sá2viz
+3sávj
+sá2v1or
+sá2vö
+3sávr
+3sávú
+3sávv
+sba2l1
+sbeá2
+sbér2cs
+sb2lo
+sb2lú
+sb2ra
+sb2ri
+sb2ro
+sb2ró
+scar2
+1scheie
+sc3hek
+sc3hen
+sc3het
+sc3hé.
+1schébe.
+sc3héd
+1schéére
+1schére
+sc3hés
+sc3hi.
+sc3hig
+1schil
+sc2ri
+sda2dal
+sdai2
+sdeá2
+sde1b2
+sde2del
+sde1kr
+sdes2
+sde1sp
+sde1st
+sdesz2t
+sdi2ale
+sd2ra
+sd2rá
+sd2ro
+sd2ru
+1se
+sea2d
+sea2l
+sea2n
+seá2l
+seá2r
+se2bag
+se2b1ak
+seb1alt
+sebá2
+se2b1ág
+se2bár
+se2b1e2g
+seb1ell
+seb1elz
+se2b1esh
+seb1esze
+s1e2béd
+3sebés
+se2b1ó2
+se2bö
+se2b1ő2
+seb1p
+seb1s
+se2b1u
+se2bú
+se2bül
+3sebzé
+secs1a2p
+se2csev
+se2cs1ék
+2sedez
+sedél1
+2sedény
+se1dra
+se1d2rá
+se2dzé
+se2dző
+see2l
+see2n
+2seff
+se1f2ra
+2s1e2ger
+3segéd
+2segér
+segés3s
+s1egész1
+2segét
+3segg
+seg2ga
+seg2go
+3segí
+se2gyed
+segy1e2l
+s1e2gyé
+2s1egyh
+2s1együ
+sehü2
+se2h1üv
+seí2r
+sej2t1a2
+sej2t1e2ny
+sej2ter
+sej2tér
+sej2t1o
+sej2tö
+seka2r
+se2k1ál
+2s1e2kés.
+sek2k1á
+sek2kos
+sek2k1ö
+se1klu
+se1k2ra
+se1k2ré
+se2kur
+se2kúr
+sel1ak
+se2lál
+2selb
+s1eldö
+2s1e2lef
+s1e2legy
+se2l1e2h
+se2l1eké
+se2lemek
+2s1e2lemé
+se2lemk
+se2lemm
+2s1e2lemz
+se2l1ere
+s1e2lesé
+sele2sz
+se2l1eszü
+sele2t1a2
+sele2t1e2l
+se2l1e2vé
+se2l1e2vő
+selés3s
+2self
+2s1elha
+2s1elhel
+s1elho
+sel1id
+se2lis
+2s1eljá
+s1ellá
+2selmél
+selnö2k1öl
+2s1elny
+s1e2los
+2s1e2lö
+se2lőad
+s1e2lőí
+2s1e2lőz
+2selr
+s1elta
+s1eltá
+2s1eltö
+2s1elv.
+2s1elvek
+s1elvű
+2s1elvv
+2selz
+2sember
+s1ember.
+s1emberb
+s1embern
+2s1embr
+2semén
+2semlé
+se2nat
+se2n1ál
+sen2d1a
+sen2d1á
+s1e2ner
+senés3s
+2s1enged
+sen1ist
+se2n1or
+s1enta
+seny1ag
+seny1ak
+se2ny1á2
+seny1ell
+seny1ere
+se2ny1él
+se2ny1ér.
+se2nyérd
+se2nyérte
+2senyhi.
+se2nyigé
+se2nyös
+se2nyu
+se2nyú
+se2ny1ü2l
+2senyve.
+s1enz
+seó2r
+se2pid
+s1epiz
+sep2pa
+sep2p1á2
+sep2per
+2sepri
+se1p2ro
+se1p2ró
+se2r1agy
+se2ral
+se2ram
+se2r1a2n
+se2r1a2r
+se2r1as
+se2rau
+se2r1á2g
+ser1áll
+se2rár
+s1erde
+2serdő
+sereg1g
+3seregs
+2serej
+se2r1e2lem.
+se2r1e2lő
+se2r1elt
+se2r1elv
+sere1p
+sere2pedő
+ser1e2sze.
+ser1eszk
+sere1t
+se2r1észb
+se2r1iga
+se2r1il
+seri2n
+se2r1ina
+ser1inf
+ser1ing
+ser1int
+se2ris
+se2riz
+ser1k
+se2r1ol
+se2ró
+s1eróz
+2se2rő
+s1erő.
+s1erőb
+s1erőd
+s1erőé
+s1erőf
+s1erők
+s1erőm
+s1erőn
+ser1ős.
+s1erőt
+s1erőv
+ser1s
+sert2
+ser1tr
+se2r1ü2g
+serví2
+2s1esemé
+2s1e2seté
+2s1esél
+2s1e2sés
+2seskü
+2s1e2ső
+se1s2p
+sessz1a2
+sesszé2l
+sessz1o
+2s1este
+se1sti
+s1eszen
+2seszk
+s1eszkö
+2s1eszm
+se2szű
+se2t1a2la
+se2tana
+se2t1a2ny
+se2tát
+se2t1e2g
+set1eleg
+se2t1elk
+se2t1elm
+2setenk
+2setes.
+2setese
+2s1e2teté
+2s1e2tető
+seté2k
+se2t1ékb
+se2t1éké
+se2t1é2l
+se2t1énk
+se2t1ér.
+se2t1é2ri
+se2t1érté
+se2tika
+se2tiká
+se2tike
+se2t1ing
+se2tol
+set1old
+se1tran
+se1tri
+se1t2ro
+2settk
+seü2t
+2s1e2vés
+2s1e2vő
+se1ye
+se1yé
+se1yi
+s1ezr
+1sé
+2s1ébr
+sé2f1a
+sé2f1á
+sé2g1a2
+sé2g1á2
+3sége.
+sé2g1eg
+3ségei
+3ségek
+ség1ele
+sége2lem
+sé2g1ell
+3ségem
+sé2g1ent
+sé2ger
+ség1erk
+sé2g1esz
+sé2geté
+sé2g1e2ti
+sé2gev
+ség1é2je
+sé2g1é2k
+sé2gép
+sé2g1ér.
+sé2g1é2ré
+sé2g1érn
+sé2g1érr
+sé2g1értő
+sé2g1é2rü
+sé2g1érv
+ség1ész
+ség3g
+ség1iga
+sé2g1igé
+ség1ist
+sé2gí
+3ségk
+ségo2
+sé2g1ok
+sé2gol
+sé2g1ó2
+sé2gör
+sé2gő2
+ség1őr
+ség1ős
+ség1s
+sé2gu
+sé2gú
+3ségü
+sé2g1ü2lő
+ség1ült
+2s1éh.
+2s1é2he.
+2s1é2hek
+2s1é2hes
+2s1é2het
+2s1é2hé
+2s1éhh
+2s1éhr
+2s1éhs
+sé2jem
+s1é2ji
+s1éjs
+sé2kek
+s1ékho
+2s1ékm
+2s1éks
+sé2k1ú
+sé2lel
+s1é2let
+2séll
+2s1élm
+sélőkész1
+sé2lű
+2sély
+sé2lya
+sé2lyeg
+3sémá
+sé2mu
+s1é2nekb
+2s1é2neke
+s1é2neké
+2s1é2nekh
+2s1é2neki
+s1é2nekk
+2sénekl
+2s1é2nekn
+s1é2nekr
+s1é2nekt
+s1é2nekü
+2s1é2pí
+2s1é2pü
+sé2ral
+sé2ran
+sé2rát
+2sérb
+2sérc
+s1érde
+sé2réé
+sé2rie
+sé2rig
+s1érlel
+2sérm
+sé3ró
+2sérr
+s1értéke
+3sérvb
+s1érvei
+3sérvem
+3sérves
+3sérvh
+3sérvr
+3sérvv
+4sé1ry
+2s1érz
+2sésdi
+2séseki
+sé2s1el
+2séssz
+2séstú
+sész1ak
+sé2sz1á
+sé2sz1emb
+sé2szir
+sé2sz1o
+sész3s
+sét1abl
+sé2t1a2d
+2sétk
+sé2t1o
+sétő2
+sé2t1őr
+2sétr
+2sétt
+2sétv
+2s1év.
+2s1évad
+2s1évb
+2séve.
+2s1é2ved
+2sévei
+2s1é2vek
+2s1é2ven
+2sévet
+2sévéb
+2s1é2véi
+2sévén
+2sévét
+2sévév
+2s1évf
+2sévh
+2sévi.
+2s1évk
+2s1évn
+2s1évr
+2s1évt
+2s1é2vü
+2s1évv
+sfaá3gac
+sfa2gy1al
+sfenyőé2
+sfé2má
+sfé2m1e2kéh
+sfé2m1é
+sfé2mi
+sfiúé2
+sfi2úéra
+sfi2úét
+sf2le
+sf2lo
+sf2ló
+sf2lu
+sfo2k1út
+sf2ra
+sf2rá
+sf2re
+sf2ri
+sf2rí
+sf2ro
+sf2rö
+sga1b
+sga1d2
+sga1p
+sga1tr
+sge2o
+sg2le
+sg2ló
+sg2nó
+s1g2ra
+sg2rá
+sg2ri
+sg2ró
+shelyü2kü
+1s2hi.
+1s2hih
+1s2hij
+1s2hik
+shitköz1
+s2hop
+s2horr
+3s2how
+shú2sár
+shús1s
+1si
+si2ac
+sia2d
+si2aé
+si3ak
+sia2l
+sia2ny
+siá2ro
+si2b1á2
+sibilis1
+sidás1s
+si2dea
+si2deá
+si2deg
+si2dei
+si2den
+si2deo
+s2idet
+2sidé
+s1i2dén
+si2dom
+2s1i2dő
+si2du
+si2eg
+sie2l
+si2en
+si2eu
+2s1ifj
+2siga
+s1i2gazo
+2sigá
+2sige
+s1i2ge.
+s1i2gek
+s1i2ges
+2s1i2gé
+sig2n1e
+sig2n1ó2
+2siha
+3sihed
+2s1ihl
+si2k1a2n
+sike2r1esz
+sike2s
+si2k1in
+si2k1ir
+si2k1old
+s1i2konh
+s1i2konj
+2s1i2konk
+s1i2konn
+2s1i2kono
+s1i2konr
+2s1i2kont
+s1i2konu
+sik1orr
+si1kré
+sikus1s
+2simád
+si2m1el
+s1i2mit
+3simí
+3simog
+2simp
+s1impor
+si2m1u2t
+2s1i2nas
+2sind
+s1indu
+si2ner
+2sinf
+2singa
+s1ingá
+s1inget
+s1ingé
+s1ingók
+si2nic
+2sinj
+2s1inku
+2s1ins
+s1inte
+2sinv
+s1invá
+2s1inz
+si2onn
+s1i2ono
+si2óa
+si2óá
+si2óc
+si2óda
+si2óe
+si2óg
+si2ói2k
+si2óo
+si2óp
+si2óú
+2sipar.
+2sipara
+2sipará
+2siparb
+2s1iparc
+2siparh
+2siparm
+2siparn
+2s1i2paro
+2siparr
+2sipartá
+2sipartó
+2siparu
+3sipí
+3sipka
+3sipká
+3sipol
+2s1i2ram
+s1irg
+2s1irh
+2siro
+s1i2rod
+2s1i2rón
+2sirt
+s1irtó
+si2sad
+si2sél
+si2s1is
+si2s1í2
+sis3s
+sist2
+si2s1ü2
+si2s3zab
+s1i2tal
+sita2li
+si2te.
+si2t1i
+si2t1ö
+sit2tin
+3sity
+siú2t
+2s1i2vad
+2s1i2var
+2sivás
+3siví
+2s1i2vó
+2sizé
+si2zé.
+si2zéb
+s1izmo
+1sí
+sí2gé
+sí2ja
+sí2ju
+sí2kas
+síke2
+sí2k1er
+sí2kí
+sí2kü
+sína2
+sí2nac
+sí2nal
+sí2nan
+sí2n1á2
+sí2nel
+sí2nö
+2síns
+sí2n1ú
+sí2r1ad
+sí2r1ál
+sírá2s3z
+sír1á2to
+sí2red
+sí2r1e2m
+sí2ren
+sí2res
+sí2r1e2t
+sí2r1én
+sí2rir
+sí2rí
+s1í2róa
+sí2róf
+sí2ról
+sí2róp
+sí2rö
+sír2t1e2v
+sí2r1ü
+sí1sp
+sí1st
+síté2kol
+2sítél
+sítés3s
+sítőa2
+sítőe2
+sí1tr
+2s1ív.
+sí2vá
+2s1ívb
+s1í2vek
+s1í2ven
+s1í2vet
+sí2vé
+sí2vű
+sí2za
+sí2ze.
+2s1ízl
+s1ízr
+2sízü
+sí2zül
+sje2gy1á2
+skao2
+skapocs1
+ska2r1i2m
+skaros3
+ska2ró2r
+ska1sm
+skat2
+ska1tr
+skau2
+1skálák
+1skálár
+ske1p2
+ske1s2p
+ské2p1el
+skiá2
+1s2kicc
+skie2
+sk2jö
+sk2la
+sk2li
+sk2lí
+sk2lo
+sk2ló
+sk2lu
+skolás1s
+s2korpi
+sko2s1a2rai
+skó1p
+s1k2rá
+s1k2ré
+s1k2rit
+sk2rí
+sk2rón
+sk2ru
+sk2va
+sk2vi
+sk2vó
+sky1ér
+sky1i
+sla1d2
+sla2g1e2
+sla1s2p
+sla2t1a2l
+sla2t1a2n
+sla2tel
+sla2tev
+sla2tés
+sla2t1é2t
+s2lág
+1slágerei
+slá2nyal
+slás3s
+slega2
+sleg1g
+sleí2
+sle2tal
+sle2t1el
+sle2t1em
+sle2tél
+sleves1s
+sléi2
+sléke2
+slé2kev
+slé2k1ol
+slés3s
+slic2c1elv
+sli2d
+sli2ká
+1s2liss
+slős2
+s2lus
+smaó2
+smarc2
+smas2
+sma1sp
+3s2már.
+3s2máru
+sme2g1a2
+sme2g1é
+smen2tel
+1smirg
+sna2pal
+sna2p1e
+sna2p1or
+snap2sz1e2
+sne1yi
+snit2t1elv
+snőé2h
+1so
+s1obj
+so1c2k
+sodaéne2
+soda1g2
+so2d1e
+so2dén
+so2dév
+so2did
+so2dis
+so2dí
+so2dob
+so2d1org
+so2d1os
+so2dö
+so2dő
+sodrás1s
+so2dú
+sod1út
+so2dü
+so2d3z
+so2kab
+so2kai
+so2k1aj
+so2k1a2la
+so2k1ap
+so2kar
+soka2t
+so2k1ato
+so2k1ál
+so2k1árn
+so2k1e2
+sok1ill
+so2kí
+3sokk.
+sokka2l
+sok2k1ala
+sok2k1a2p
+2sokke
+sok2k1el
+sok2kir
+sok2k1ö2v
+sok2k1ü
+2sokl
+2sokm
+so2kok
+sok1old
+2so2kos
+2s1o2koz
+so2k1ó2
+2sokta
+s1oktat
+so2k1ú2
+so2kü
+2s1o2laj
+sola2j1á2r
+sola2je
+sola2tel
+solás1s
+2s1olda
+2s1oldá
+2soldó
+s1oldó.
+s1oldók
+s1oldóm
+s1oldón
+s1oldór
+s1oldót
+s1oldóv
+so2lim
+2s1olló
+solóó2
+s1oltás
+2solvas
+so2lyan
+so2lyó
+so2m1ad
+somag1g
+so2m1a2l
+soma2t
+som1ato
+so2m1e2
+so2mél
+so2m1éte
+so2mil
+so2m1ita
+so2mí
+so2m1odo
+som1ort
+so2m1osz
+som1p
+so2mú
+so2mü
+son2ch
+2sond
+so2n1e
+son2kál
+son2k1e2
+2sonó
+son2tab
+son2t1a2l
+son2t1a2n
+son2tar
+son2t1á2r
+son2t1e2
+sonté2r
+son2t1éré
+son2tik
+son2tip
+son2tö
+son2tő
+2sonv
+so2nye
+so2nyis
+so2ór
+so2ós
+s1opc
+s1o2pe
+sor1ada
+sor1ala
+sor1áll
+so2r1átl
+3so2r1e2
+sor1f2
+s1orgi
+so2rid
+2sorie
+so2rif
+so2rim
+so2r1ing
+so2ris
+3sorké
+sormű1
+sorműt2
+sor1oszt
+3soroza
+so2r1ó2
+so2rö
+so2rő
+2s1orr.
+s1orrát
+2sorrb
+2s1orrn
+2s1orro
+2s1orrú
+3sors.
+sor2sal
+sor2sar
+sor2sas
+sor2s1e2
+sor2sir
+2sorsó
+sor2sü
+sor1sz
+sor2szón
+sor1tre
+sorú2t
+so2r1úto
+so2rü
+so2rű
+2s1osto
+2s1ostr
+s1osty
+2sosz
+s1oszl
+s1oszt
+so2ul
+so2ur
+so2ve
+so2vis
+so2xi
+1só
+sóá2g
+sóá2r
+sócsapá2
+só2dái
+só2dák
+só2dáv
+sógé2p1e2ké
+só1g2r
+sói2g
+sóí2v
+só2k1a2d
+só2kil
+só2kim
+só2kó
+só1kré
+sómű1
+só2né.
+só2ni
+sóó2r
+só2rai
+só2ráb
+só2rái
+só2ráj
+só2rám
+só2rán
+só2rár
+só2rát
+só2riá
+só2s1ü2
+só1sz
+sótá2ny1ér
+só1t2r
+2s1ótv
+2s1ó2vó
+1sö
+sö2bű
+sö2ga
+sö2gá
+sö2g1e2l
+sö2g1em
+sö2g1ék
+sög3g
+sö2go
+sö2g1ö2lé
+sö2g1ölt
+sö2gű
+sö2ka
+sö2k1el
+sö2kid
+2s1ö2ko
+s1ö2kör
+sö2kú
+sö2lőj
+s1ö2lőz
+s1öly
+sö2na
+sö2ná
+sön2d1a2
+sö2no
+sö2n1öl
+sö2n1ő
+s1öntv
+sö2nú
+3sör.
+sö2ra
+sö2rá
+3sörb
+2sörd
+sö2r1ed
+sö2reg
+sö2ren
+sör1f2
+sö2r1iz
+3sörk
+sö2ro
+sö2ró
+sö2r1ö2l
+sö2r1ő
+sör1s
+sö2ru
+2sörv
+s1össz
+s1ösv
+s1ösz
+2s1ötl
+2s1ötv
+2s1öv.
+2söve
+s1övv
+s1ö2zön
+1ső
+sőa2c
+sőa2l
+sőa2n
+2sőá2g
+ső1bl
+2sőbok
+ső2dad
+ső2dalk
+ső2dá
+ső2del
+ső2din
+ső2d1ő2r
+ső1dro
+sőe2l
+sőe2r
+sőe2s
+ső1gr
+ső1kl
+ső1pl
+ső1pn
+ső1pr
+ső2r1aj
+ső2r1á2csot
+ső2riz
+ső2rol
+sőr1ö2l
+s1őrti
+s1őrz
+ső2s1av
+ső2sim
+sős1orra.
+ső2s1orrá
+ső2s1orró
+ső1s2p
+ső1sta
+ső1str
+sősü2
+ső2s1ül
+ső2s1üt
+ső2szap
+ső2sz1áll
+sőszé2k
+sősz1éké
+ső2sz1í
+spa2d1a2
+s2patu
+s2páj
+spá2n1a
+1s2párg
+3s2peci
+1spektr
+1s2peku
+1s2pék
+s2p1ér
+1spirálú
+spis3s
+sp2le2
+s1p2lé
+sp2lu
+sp2ne
+1s2pong
+sporta2
+spor2t1al
+1s2portág
+spor2tár
+3s2portb
+spor2t1e2
+1s2porté
+spor2t1érd
+1s2porth
+spor2t1i2n
+1s2portj
+1s2portn
+1s2portoka
+1s2portol
+1s2porton
+1s2portos
+3s2portot
+spor2t1ö
+spor2tő
+1s2portra
+1s2portró
+1s2porttó
+1s2portu
+spor2t1ü2
+1spórák.
+1spórol
+sp2ra
+s1prak
+3spray
+s1p2re
+s1p2ré
+1spric
+s1p2ro
+s1p2ró
+sp2sz
+1s2raf
+srau2
+1s2ráco
+sren2d1ő2
+3s2róf
+srú2de
+ssab2b1i
+ssa2vo
+sság3g
+ssé2g1e2l
+ssé2g1é2j
+ssé2gid
+s2s1ékt
+s2s1i2z
+ss2kál
+ss2ko
+ss1k2r
+ss2lá
+sso2m1o
+ss2pó
+s1s2rá
+ss3sz
+ss2tad
+ss2tar
+ss2tat
+s1s2tí
+ss2to
+s1st2r
+ss2tú
+ss1ura
+ssy1ér
+ssy1ét
+s2sz
+sszae2
+ssza1p2r
+sszat2
+ssza1tr
+ssz1á2g
+ssz1á2ram
+ssz1á2ruk
+ssz1á2sz
+s3száza
+s3szedé
+sszeg1ér.
+sszegü2l
+ssze2g1ülő
+ssz1egye
+s3szekv
+ssz1e2lőa
+s3szeml
+s3szemm
+ssze1p2
+ssze2reib
+ssze2reid
+ssze2rein
+ssze2reké
+ssze2rekt
+ssze2rem.
+ssze2remm
+ssze2rese
+sszer2t1á2r
+ssze1t2r
+s3széki
+ssz1é2lő
+sszér1in
+s3széto
+s3szige
+ssz1ing
+sszis1s
+sszí2vel
+ssz1k2
+sszkész1
+s3szob
+ssz1osz
+ssz1ósá
+s3szöc
+s3ször
+ssz1ös
+s3szöv
+ssz1p2
+ss3zsi
+sszt2
+ssz1tro
+s3szur
+sszus1s
+ssz1úr.
+1stabil
+1stadio
+st1a2dó
+1stafí
+s2t1alj
+s2t1alk
+s2tand
+1standa
+sta2n1ó2r
+stan2s1é
+st1a2nyag
+s2tarc
+1s2tart.
+star2tas
+1startos
+1s2tartot
+1startt
+sta1sl
+sta1s2t
+sta1t2r
+sta3u
+stau2t
+s2t1a2x
+st1azo
+3stáb.
+1stábj
+1stábk
+1stábn
+1stábot
+st1ág.
+st1áld
+stán2c1ol
+stán2s1á2
+stá2riá
+s2t1árka
+s2t1árká
+st1á2t1a2
+st1áts
+1s2tátu
+st1átv
+st1br
+st1dr
+ste2a
+1s2teak
+s2t1ebé
+s2tedén
+s2t1e2gy
+s2t1e2ke.
+s2t1elf
+s2t1elh
+s2t1ellen
+s2t1elm
+s2t1e2lo
+s2t1elö
+s2t1e2lő
+s2t1elr
+s2t1elt
+s2t1elv
+s2t1ember
+s2t1e2mel
+s2t1eml
+ste2n1a
+ste2n1á
+ste2neg
+ste2n1és
+sten3n
+ste2nos
+ste2n1ő2
+1stepp
+ste2rad
+ste2raj
+ste2ral
+ste2rav
+ste2rác
+ste2rál
+ste2r1e2le
+1sterili
+ste2r1int
+ste2ris
+ste2r1o
+s2t1erő
+ste2sz
+s2t1eszm
+ste2u
+1stégek
+1stéget
+1stégg
+1stégr
+sté2k1a2
+sté2ká
+stékát1
+stékáta2
+sté2k1el
+st1é2kesí
+st1ékí
+sté2k1o
+sté2ku
+s2t1é2le
+st1é2lé
+s2t1élm
+s2t1élt
+st1élv
+s2t1érc
+s2t1érem
+s2t1é2ré
+s2t1é2rőt
+s2t1érté
+s2t1érz
+stés3s
+s2t1észl
+s2t1étk
+s2t1é2ve.
+st1fl
+st1fr
+st1gr
+s2t1i2d
+sti2g
+s2t1ige
+s2t1igé
+s2t1i2ma
+s2t1i2má
+1s2timm
+s2t1imp
+sti2na.
+s2t1ind
+s2tinf
+s2t1ing
+s2t1inv
+s2t1i2o
+st1i2pa
+st1irá
+st1iró
+stis3s
+sti2sz
+s2t1isza
+s2t1i2vá
+st1i2zo
+s2t1íj
+3s2tíl
+s2tír
+st1írá
+st1í2v
+st1í2z
+stká2ro
+st1kr
+st1kv
+stola2t
+sto2lato
+sto2p1a
+1s2topb
+1s2toph
+1s2topr
+1s2topt
+sto2rál
+sto2rás
+sto2re
+sto2ris
+st1o2x
+3s2tóla
+3s2tólá
+st1ó2rá
+1s2tós
+stö2k1ölt
+s2t1önt
+s2t1örö
+s2t1össz
+stőa2
+stőe2
+stőkész1
+s2t1őra
+s2t1őrb
+s2t1őrc
+s2t1őreg
+s2t1őrei
+s2t1őré.
+s2t1őrén
+s2t1őrér
+s2t1őrév
+s2t1őrf
+s2t1őrg
+s2t1őrh
+s2t1ő2ri
+st1őrl
+s2t1őrm
+s2t1őrn
+st1őrp
+s2t1őrs
+s2t1ő2rü
+s2t1őrv
+st1pf
+st1pl
+st1pr
+1strando
+1st2rap
+1straté
+s1trág
+1st2réb
+s1t2rén
+st2riá
+st2róf
+1strófá
+1st2ruc
+1struktú
+st1sc
+st1st
+st1sz
+st1t2r
+s2t1udv
+1stukk
+st1uni
+st1u2ral
+3s2túd
+st1úr.
+st1út
+s2t1üg
+s2t1ü2lő
+st1üst
+s2t1üt
+s2t1ü2v
+s2t1űr.
+s2t1ű2ri
+s2t1űrn
+s2t1űrt
+1su
+suá2r
+subi1
+s1udm
+2s1udv
+3sugár.
+3sugárr
+2s1ugr
+3suhi
+2sujj
+suj2j1a2da
+su2k1ará
+su2ke
+su2k1ö
+su2k1ü
+3summ
+su2nal
+2s1und
+2s1u2ni
+su2no
+supe2
+2sura
+s1u2rad
+su2rai
+su2rak
+su2ral
+su2rat
+su2rát
+2surn
+2s1u2ru
+su2szo
+2s1u2tac
+2s1u2tad
+2sutak
+s1u2tal
+2s1u2tam
+2s1u2tan
+sutas1s
+2s1u2tat
+2su2tazi
+s1u2tazó
+2s1utc
+2sutó
+su2tód
+2sutu
+1sú
+sú2csal
+sú2csat
+sú2csem
+sú2cser
+sú2csip
+súcská2
+sú2cs1ö
+sú2cs1ü2
+súcs3z
+súdi2
+súi2m
+s1újh
+2s1ú2jí
+2s1újs
+3súly
+2súr.
+2súrb
+2súré
+2súrh
+2súri
+2súrk
+3súrl
+2súrn
+2súrp
+2súrr
+2súrt
+sú2sén
+sú2só
+2súsz
+súszó2s3z
+2s1útb
+sút1en
+2súté
+s1úth
+2súti
+sú2tig
+2s1útj
+2s1útk
+s1útn
+2súto
+s1ú2ton
+sú2t1ő
+2s1útr
+2s1útt
+sútü2
+sút1üz
+2s1útv
+1sü
+sü2d1e
+sü2dí
+sü2dü
+3sü3gé
+s1üggy
+2s1ü2gy
+3sü2k1a
+sü2kü
+2süldö
+sü2led
+3sültr
+sülye2
+sü2lyes
+sü2ná
+süne2
+sü2nev
+sü2n1é
+2s1ü2nő
+sü2rí
+2s1ü2rü
+2süst
+2s1ü2sz
+2sütk
+3sütőb
+sü2ze
+sü2zé
+1sű
+sű1pr
+sű2r1a
+3sűrí
+s1ű2ru
+sű2ző
+sva2s1u2
+svá2gy1ón.
+svá2nyan
+svá2r1al
+svárosi2
+sven1
+svezetőé2
+své2nyel
+své2tes
+svíze2
+svíz1es
+s2vun
+sw2hi
+swhisky2
+sy2bő
+sy1ig
+s2z
+1sza
+szaa2
+3szabáz
+3szabd
+sz1a2dás
+2sz1a2dó
+szaé2
+3szaft
+3szag.
+3szagb
+3szagú
+2szagy.
+2szagya
+2szaj.
+2szajá
+2szajj
+2szajú
+2szakci
+3szakm
+sza2k1ó2r
+sza2köz
+2szalás
+2sz1alb
+2sz1alf
+2szalg
+2szalj
+sz1alj.
+sz1aljak
+sz1aljo
+2szall
+2szaln
+2sz1alp
+2sz1als
+2szalt.
+2sz1alte
+2szalto
+2szaltu
+2szane
+sz1antr
+2szanya
+2szanyó
+2szap.
+2szapá
+2szapb
+sza2pel
+2szapé
+2szaph
+2szapi
+2szapj
+2szapn
+2szapr
+2szapt
+2szarán
+3szarb
+2szarc
+2szaré
+3szart
+3szarv
+2szasp
+sz1assz
+sz1aszt
+sza2tala
+3szaty
+2szaut
+szau2ta
+3szax
+2szazo
+1szá
+2szábr
+2szágó
+2szágy
+szá2gyá
+szá2gyo
+szá2j1e
+szá2ke
+2száldo
+szá2lin
+3szálú
+szá2man
+szá2mar
+3számá
+szá2mál
+3számc
+szá2m1e2
+3számé
+szá2m1érté
+3számí
+3számk
+3száml
+3számm
+3számn
+szá2mor
+3számt
+3számú
+3szánd
+3szánt
+2száp
+2száradd
+2szárás
+szá2r1e
+2száriá
+3szárí
+3szárm
+szá2r1ó2ra
+szárt2
+2száru.
+2száruh
+2szárus
+2szásó.
+2szátd
+2sz1á2t1é
+2száti
+2szátl
+2szátm
+2szá2t1ö
+2száts
+2sz1átu
+2sz1á2tü
+2szátv
+sz1bl
+sz1br
+1szcéna
+sz1cl
+sz1d2r
+1sze
+2szeb.
+2szebé
+2szech
+2szecse
+2szedz
+2szeger
+3szegfű
+2szegz
+2szeh
+3szekcső.
+sze2keg
+2szekéit
+2szekés
+sze2kés.
+3szekrén
+3szekto
+3szele.
+2szelef
+2szelemb
+2szelemek
+2szelemé
+2sz1e2lemk
+2szelemm
+2sz1e2lemr
+2szelemü
+2szelemz
+2szelere
+3szelet
+3szelén
+2sz1elf
+2sz1elgo
+2sz1elha
+2szelhá
+2sz1eljá
+2szelkü
+2sz1ellá
+3szellő
+2sz1elm
+2szelnev
+2szelnö
+2szelo
+2szelö
+2sz1e2lőá
+sze2lődö
+2sz1e2lőf
+sze2lőré
+2szelső
+2sz1elszá
+2sz1elta
+2szeltá
+2szeltű
+2szelu
+2sz1elül
+2szelv.
+2sz1elvá
+2szelvek
+2szelves
+2szelvez
+sz1elvi
+2szelvn
+2szelvt
+2sz1elz
+2szember
+3szemek
+3személ
+3szem1p2
+3szemű.
+2szenc
+2szener
+3szenny
+3szentm
+3szenz
+szeo2
+2szepi
+sze2r1á2l
+2szeredm
+szer1e2ge
+sze2rej
+3szerel
+szer1eszt
+3szerke
+3szers
+3szerta
+szer2tálo
+3szerv
+szervíz1
+3szerz
+2sz1esd
+2sz1esemé
+2szesetb
+2szesete
+2szeseté
+2szeseti
+2szesetr
+2sz1e2sés
+2szeskü
+2szeső
+sze1sp
+2szeste
+2szesté
+2szesti
+2szestj
+2szestr
+sze2t1e2lő
+sze2t1é2k
+2szetika
+sze2ton
+sze2tőr
+2szeve
+2szevő
+2szexp
+3szezo
+2szezr
+1szé
+2széber
+2szébr
+2szég.
+2szége
+2szégő
+2szégr
+2széhe.
+2széhen
+2széhet
+2széhs
+2széji
+3széke.
+3széked
+3székei
+3székek
+3székem
+3székes
+2székez
+3székéb
+3székév
+szé2k1ol
+szé2kos
+3széks
+3székü
+3szélek
+2széneke
+2szénekn
+szé1pró
+3széps
+2sz1ér.
+2sz1érb
+2sz1érc
+2sz1érd
+sz1é2rel
+2szérem
+szé2rem.
+szé2remm
+2sz1é2ren
+2széré
+szé2ré.
+szé2rén
+szé2rér
+szé2rét
+szé2rév
+sz1érf
+sz1érg
+sz1érh
+2sz1érin
+sz1érj
+2sz1érk
+2sz1érl
+2sz1érm
+sz1érn
+2szérő.
+2szérői
+2szérők
+2szérőt
+sz1érp
+2sz1érr
+sz1érs
+sz1értá
+2sz1érte
+2sz1érté
+sz1értí
+2sz1értő
+3széru
+2sz1é2rü
+2sz1érv
+2sz1érz
+szé2tel
+széte2s
+2szév.
+2szévad
+2szévb
+2széve.
+2szévei
+2szévek
+2sz1é2vet
+2szévén
+2szévét
+2szévév
+2szévf
+2szévi
+2szévk
+2szévn
+2szévr
+2szévs
+2szévt
+2szévü
+1szférai
+1szféráé
+1szféráso
+sz1fl
+sz1fr
+sz1gl
+1szi
+szi2ab
+2szide
+2sz1idé
+2szidő
+2szifj
+2sz1i2ga
+2sz1igé
+3szign
+szi2k1a2s
+szi2k1e2r
+szi2k1ó2
+sz1imak
+2sz1i2má
+3szimb
+sz1impr
+2szimpu
+2szinas
+2szinde
+2szindí
+2szindu
+sz1info
+2szing
+sz1inko
+2szinteg
+2szio
+2szirat
+2szirá
+2sz1i2ri
+2szirod
+szi2sí
+2sz1i2sza
+szi2szá
+3szitu
+2szivad
+2szivás
+2szivó
+sz1izg
+2sz1izz
+1szí
+2sz1íg
+3színe
+2színna
+szí2vár
+2szívi
+3szívű
+2sz1íz
+szka1pr
+1szkarab
+szk1arch
+1szkenn
+1szlávh
+1szlávok
+1szleng.
+1szlengn
+1szlengr
+szle2t1e2l
+szle2t1o
+1szloge
+1sz2mok
+1sznob
+1szo
+2szobj
+2szoda.
+2szodai
+2szodak
+2szodú
+3szof
+3szoká
+2szokke
+2szokoz
+2szoksö
+2szolaj
+szo2l1ál
+2szolda
+sz1oldá
+2szoldó
+2szo2lim
+2szolló
+2sz1oltár
+2szoltás
+2szolvad
+2szolvas
+2szombor.
+3szoms
+szo2nas
+szo2nár
+3szond
+2szora
+szo2r1ál
+2szorm
+2szorn
+2szors
+2szorv
+2szostá
+2szosto
+2sz1otth
+3szov
+2sz1ox
+1szó
+2szólm
+3szóló
+2szónád
+2szónái
+2szóni
+2szónod
+2sz1ó2rán
+2szórát
+2szóri
+szó2sík
+3szósz.
+szósza2k
+szó2száll
+szó2szón
+szó2szülő
+szó1tr
+1szö
+2szöbli
+3szöge
+2szöldes
+2sz1öle
+2szöre
+2szöv.
+2szövei
+2sz1öz
+1sző
+szőa2
+szőe2r
+szőé2
+3szőlő
+sző2ra
+sz1ősi
+2szőz
+sz1őze
+1sz2pí
+sz1pl
+1szponz
+szrádi2
+sz3saj
+sz3sap
+sz3sas
+sz3sav
+s3zsák
+sz3sán
+sz3sár
+sz3sás
+sz3sát
+sz3sáv
+sz3seg
+s3zsem
+s3zsen
+sz3sep
+sz3ser
+sz3sé
+sz3sh
+sz3sik
+s3zsin
+sz3sis
+sz3siv
+sz3sín
+sz3s2k
+sz3sl
+sz3sod
+sz3sok
+s3zsol
+sz3sor
+sz3só
+sz3sör
+sz3söv
+sz3s2p
+sz3s2r
+sz3s2t
+s3zsúll
+sz3sü
+sz3sz
+sz2t1álla
+sztá2r1a2d
+szt1á2ram
+sz2tá2ras
+sztá2rat
+sz2táre
+sz2tárf
+sz2tárh
+1sz2tárj
+sz2tárny
+sztáró2
+sz2táru
+szt1á2ruk
+sz2tárv
+szte2r1el
+1sztereo
+szté2g
+szt1ége
+sz2térte
+sz2t1érv
+sz2t1été
+szt1örök
+sz2t1őrn
+1sztrádá
+1sztrájk
+sz2tür
+1sztye
+1szu
+szu2b
+szub1o
+szuc1
+2szud
+sz1udv
+2szugo
+2sz1ugr
+2szuh
+2sz1uj
+3szuká
+sz1u2ra
+2sz1u2rá
+2szuta
+sz1utó
+2szutu
+2s3zuz
+1szú
+2szúg
+2szúj
+sz1úron
+2sz1úrr
+sz1úrtó
+2szús
+2szúté
+2szúth
+2szúti
+2szútj
+2szútn
+2szúto
+2szútr
+2szútt
+2szútv
+2szúz
+1szü
+2sz1üd
+2szügg
+3szüks
+2szüld
+2sz1ü2led
+2szülőse
+3szüne
+3szürke
+3szürkés
+2sz1üs
+2sz1üv
+1szű
+3szűk
+2szűrödn
+1szvit.
+1szvitet
+1szvitj
+1szvitn
+1szvitt
+sz3zs
+2t.
+1ta
+taa2d
+taa2l
+taát1
+taáta2
+taboz1
+ta1bra
+2t1abro
+ta1bró
+2t1abs
+ta1cl
+ta2dalé
+2t1adap
+ta2das
+t1a2data
+2t1a2datb
+2t1a2dato
+ta2datu
+2t1a2dá
+2tadio
+t1adj
+t1adl
+2t1adm
+ta2dod
+2t1a2dog
+2t1a2dot
+2tadó
+t1a2dóa
+ta2dóá
+ta2dób
+ta2dód
+ta2dóf
+ta2dóg
+t1a2dóh
+t1a2dóig
+t1a2dóik
+t1a2dóin
+t1a2dóit
+ta2dóí
+t1a2dój
+t1a2dóka
+t1a2dóké
+t1a2dóko
+t1a2dókra
+ta2dól
+t1a2dóna
+t1a2dóná
+ta2dóp
+t1a2dór
+t1a2dótó
+ta2dóü
+t1a2dóv
+ta1drá
+ta1d2re
+ta1dro
+t1ads
+ta2dun
+t1adv
+tae2l
+tae2r
+ta2ero
+taé2r
+2tafí
+ta1f2r
+taf2ta
+ta2g1aj
+ta2gav
+taga2z
+tag1azo
+ta2gág
+ta2g1ál
+ta2gec
+ta2g1el
+ta2g1e2r
+ta2g1é2g
+2taggo
+2t1aggr
+ta2gid
+ta2giz
+ta2g1osz
+ta2g1ott
+ta2góc
+2t1a2gón
+ta2g1ó2r
+ta2góv
+ta1g2raf
+ta1g2ram
+tagrádi2
+ta2g1u2s
+ta2gut
+ta2g1ü2
+2t1agy.
+ta2gya.
+ta2gyáb
+ta2gyáh
+2t1agyb
+2t1agyn
+2t1agyr
+2t1agyv
+ta2ire
+tai2rón
+tai2z
+ta2jé
+ta2j1u2s
+ta2jús
+2t1a2kad
+ta2k1ál
+taká2r
+tak1áro
+ta2kás
+ta2kátk
+2t1akce
+2t1akci
+take2l
+tak1ele
+ta2k1ér.
+tak1é2sze
+2t1akkora
+2takkord
+2t1akku
+ta1k2la
+ta1klu
+t1akna.
+ta2kó.
+ta2k1öb
+ta2k1öröm
+ta2k1ös
+ta1krá
+tak2reá
+ta1krí
+2t1akro
+ta1k2rón
+2t1akta.
+tak2tem
+2takti.
+2t1aktiv
+2t1aktí
+2t1aktj
+taktus1s
+ta2kus
+ta1k2va
+ta2l1a2da
+ta2l1a2dá
+ta2l1adh
+ta2l1adj
+ta2l1adn
+ta2l1a2do
+ta2l1a2dó
+ta2l1adt
+ta2l1a2du
+ta2l1adv
+2tala2g1
+t1a2lagu
+ta2lagú
+2t1a2lakb
+tal1akc
+2talakí
+2t1a2lakj
+2ta2laku
+2t1alakz
+ta2l1a2l
+2t1alany
+2t1a2lapa
+2t1a2lapí
+ta2lapk
+t1a2lapl
+2t1a2lapsz
+ta2l1a2r
+ta2l1as
+tala2te
+2talatti
+ta2l1au
+2taláá
+ta2l1á2g
+2taláí
+ta2l1állo
+tal1á2rak
+talás1s
+ta2l1áta
+tal1átr
+tal1ell
+ta2l1elő
+ta2l1eng
+tal1esi
+talé2g
+talé2k1e2
+ta2l1ér.
+2t1alge
+ta2l1i2ko
+tal1ikr
+tal1imp
+tal1ina.
+ta2lip
+ta2l1isk
+ta2l1í2r
+2taljas
+2t1alji
+2taljz
+2t1alkal
+2talkím
+2talkoh
+2talkot
+2taller
+tal3ly
+ta2l1ol
+talo2m1e
+ta2l1osz
+ta2l1őr
+tal2p1á2ro
+tal2pel
+tal2p1il
+tal2pus
+tal1t2re
+ta2lud
+2t1a2lulj
+ta2l1u2r
+ta2l1u2t
+ta2lúr
+ta2l1út.
+ta2lü
+ta2lű
+2talveo
+ta2mal
+tam1alm
+ta2maz
+ta2m1i2d
+2t1a2mő
+t1ampa
+2t1ampu
+2t1amur
+ta2mü
+ta2n1aj
+ta2nal
+ta2nan
+2t1a2nat
+tan1áll
+tan1álo
+tanás1s
+tan2del
+2tandr
+ta2n1el
+ta2ner
+2ta2n1es
+ta2n1ez
+ta2n1éj
+ta2n1ér.
+ta2n1érk
+tan1évb
+tan1é2vé
+tan1é2vi
+tan1évm
+ta2nid
+2ta2nim
+tan1ist
+tanké2r
+tan2kére
+tan2kés
+tankó2
+tan2k1óra
+2tanny
+ta2n1osz
+ta2nód
+tan2te.
+tan2t1el
+tan2tors
+tan1trá
+ta2nü
+ta2nű
+2tanyag
+2tanyád
+2t1a2nyó
+tao2l
+taó2r
+2t1a2pa.
+2t1a2pai
+ta2paké
+ta2pasá
+2t1a2páb
+2t1a2pád
+2t1a2páé
+2t1a2páh
+2t1a2pái
+2t1a2páj
+2t1a2pák
+2t1a2pám
+ta2pára
+ta2páró
+2tapáu
+2t1a2páv
+ta1p2la
+ta1plé
+t1a2pó.
+2tapp
+ta1p2ré
+2t1aprí
+ta1p2ro
+tap2sor
+taps3s
+tap2s1ü2
+2tapun
+ta2rabe
+ta2rai
+2t1a2ras
+2t1a2rat
+2t1a2ráb
+tarádi2
+2t1a2ráh
+2ta2rán
+2t1a2rát
+2t1a2ráv
+2t1arbi
+2t1arc.
+2t1arch
+2t1arco
+t1arcu
+2t1arcú
+ta2r1i2k
+ta2romá
+tar1s2
+tar2tab
+tar2t1e2l
+tar2t1em
+tar2t1en
+tar2t1ér.
+tar2tit
+tar2told
+2tartos
+2tartr
+2tartt
+2tasc
+ta2sem
+2tasf
+ta1s2ká
+ta1slu
+ta1s2m
+2tasnő
+ta2s1ol
+2t1aspi
+ta1spr
+2tasru
+2tassz
+tas3szá
+tas3szt
+tast2
+ta1s2ta
+2taste
+ta1str
+2tasv
+ta1sy
+2t1aszk
+ta1szl
+ta2t1alj
+ta2t1alm
+ta2t1aszt
+tatá2rai.
+2t1a2tei
+tate2s
+2tatika
+2tatiká
+ta2t1i2na.
+ta2t1i2ná
+ta2t1ing
+t1atlas
+t1a2tomo
+tat1orj
+ta2t1őr
+ta1t2ri
+2t1atti
+tat1u2ra
+ta2tya
+ta2tyá
+2t1a2uk
+tau2ta
+tau2tá
+2tauto
+taü2z
+2tavan
+2tavatá
+2tavató
+ta1wh
+ta2zon
+1tá
+2táb.
+tá2b1á
+tábe2sz1é2l
+2tábé
+tá2big
+tá2bin
+2tábj
+2tábk
+2tábn
+2tábok
+2tábon
+2tábot
+tá2bö
+2tábr
+t1ábrá
+tá2bü
+2táciu
+tá2fa
+tá2fá
+2tág.
+tá2ga.
+tága2d
+tág1ada
+2t1á2gai
+tá2gaz
+2t1á2gá
+2tágb
+2t1ágc
+2t1á2ge
+2t1á2gé
+2t1ágf
+2tágg
+2t1ágh
+2t1á2gi
+2tágj
+2t1ágk
+2t1ágm
+2tágn
+2t1á2go
+2tágr
+2t1ágt
+2t1á2guk
+2t1á2gun
+2t1á2gú
+2t1ágv
+2t1á2gy
+tá2hí
+tá2jal
+tá2jaz
+tá2j1e2g
+tá2j1e2l
+tá2jí
+tá2j1ok
+tá2j1ö2
+tá2jő
+t1á2jul
+tá2lab
+tála2d
+tál1ada
+tá2laj
+tál1a2lap
+tá2lap
+2t1álar
+tá2l1ál
+tá2l1áth
+2t1áldá
+2t1áldo
+tále2
+tá2l1eg
+tá2l1el
+tá2lél
+2t1áll.
+2t1állam
+2t1állan
+2t1állat
+2t1állás
+2t1állh
+2t1állí
+2t1állj
+2t1álln
+2t1állo
+2t1álls
+2t1állt
+2t1állu
+t1állú
+2t1állv
+2t1álma
+2t1álmi
+2t1álmok
+2t1á2lomr
+tá2lomt
+tá2lö
+2t1álru
+tá2lü
+tá2lyab
+tá2ly1a2c
+tá2lyad
+tá2ly1a2g
+tá2ly1a2l
+tá2ly1a2n
+tá2lyap
+tá2ly1at
+tá2lyau
+tá2lyátl
+tá2ly1á2z
+tá2lyid
+tá2lyir
+tá2lyis
+táma2sze
+tá2mí
+tá2mos
+2t1á2mu
+tán1alm
+tá2nár
+tánc3c
+tán2c1e
+tán2céh
+tán2cél
+tán2cén
+tánckész1
+táncs2
+tán2csá
+tán2csor
+tán1d2
+tá2n1e2
+tá2ní
+tá2n1ó2
+tá2nö
+2tánpó
+tán2s1e
+tá2nü
+tá2nű
+tá2nyal
+tá2ny1as
+tá2nye
+2tánz
+tá2p1a2
+tápá2
+tá2pál
+tá2p1ár
+tá2pát
+tá2p1e2
+tá2p1il
+tá2p1in
+táp1oll
+tá2p1osz
+tá2pő
+tá2pü
+2t1á2radá
+tár1a2dot
+tá2radó
+tá2r1a2g
+tár1ajt
+tá2r1a2l
+2tárama.
+2táramá
+2tárami
+2t1á2raml
+2táramok
+2táramol
+2táramot
+2t1á2ramt
+2táramu
+2táramú
+tára2n
+tá2r1any
+tá2rap
+tá2r1asz
+tá2r1att
+tá2r1au
+tá2r1av
+tá2rág
+tá2r1ál
+tá2r1á2sz
+tá2r1átl
+2tárboc
+tá2r1e2
+tá2réd
+tá2rés
+tár2gyö
+tá2r1i2k
+tá2r1i2p
+tár1isk
+tá2r1ism
+tá2rí
+tár1k2
+2t1árkád
+2t1árkána
+2tárkár
+2t1árnyé
+tár1okm
+tá2r1osz
+tá2róc
+tár1órá
+tá2rö
+tá2rő
+tár2s1alt
+2tártás
+tárt1öltő
+tár1tro
+2táru.
+2tárua
+2tárub
+2táruc
+2t1á2rug
+2t1á2ruh
+2tárui
+2t1áruj
+2táruna
+2tárus
+2tárut.
+tár1uta
+2táruü
+2táruv
+2tárúé
+tá2rúj
+2tárúk
+tá2rús
+tá2rü
+tá2rű
+tá2s1a2d
+tá2s1aj
+tá2sal
+tá2s1a2r
+tá2saz
+tás1á2ga
+tá2s1á2rai
+tá2s1á2rá
+tá2s1á2ré
+tá2s1árh
+tá2s1árn
+tá2s1á2ro
+tá2s1árr
+tá2s1árt
+tá2sás
+2t1ásáso
+tá2s1á2to
+tá2s1e2
+tá2sis
+tá2sodv
+tá2s1ol
+tá2sor
+tá2só
+2tásók
+tás1ó2r
+tá2sö
+tá2ső
+tás3s
+tást2
+tás1tr
+tá2sut
+tá2s1ü2
+tá2sű
+t1ásván
+tá2sz1ak
+tá2szal
+tás3zav
+tá2s3zá
+tá2sze
+tás3zen
+2tászi
+2tászo
+tá2szos
+tá2s3zó
+2tászt
+2t1átad
+2t1á2tál
+2t1átc
+2t1átd
+2t1á2t1e2
+2t1á2t1é
+2t1átfo
+2t1átg
+2t1áthe
+2t1áthi
+tá2t1ir
+2t1á2tí
+2t1átje
+2t1átkö
+2t1átlag
+2t1átm
+2t1á2t1ol
+2t1á2t1ö
+2t1á2tő
+2t1átp
+2t1átre
+2t1átru
+2t1átsz
+2t1átte
+2t1átté
+2t1áttö
+2t1áttű
+2t1átut
+2t1á2tü
+2t1átvi
+2t1átvo
+tá2v1a2d
+tá2vak
+táva2l
+tá2v1a2n
+tá2vas
+tá2vaz
+tá2v1ál
+tá2v1e2
+tá2véd
+tá2v1érz
+tá2v1és
+tá2vin
+tá2vis
+tá2ví
+tá2v1or
+2t1á2vó
+tá2vö
+tá2vő
+tá2vü
+tá2zsal
+tá2zsál
+tá2zsó
+tázs1p
+tbal2le
+tbeá2
+tb2la
+tb2le
+tb2li
+tb2lo
+tb2lú
+tb2ra
+tb2re
+t1b2ri
+tb2ro
+tb2ró
+tb2ru
+tca1k
+tca1s
+tca1t2
+tc2lu
+tc2re
+tcsap1á2g
+tdíja2d
+tdí2j1ada
+td2ra
+td2rá
+td2re
+td2ro
+td2ró
+td2ru
+1te
+te2aa
+te2aá
+te2ab
+te2ac
+te2a3d
+te2ae
+te2aé
+te2ag
+te2ah
+teai2
+te2aiv
+te2aí
+te2aj
+te2aku
+te2alap
+te2aláz
+te2ali
+te2ana
+te2ao
+te2aö
+te2aő
+te2apa
+te2apá
+teas2
+te2a1sp
+te2asza
+te2aszá
+te2aszo
+tea1tró
+te2aú
+te2aü
+te2av
+te2az
+te2ber
+te2béd
+2techó
+te2csá
+te2dit
+te2dí
+2t1e2dz
+2t1eff
+te1f2r
+te2gan
+te2g1a2r
+tega2z
+teg1azo
+te2gá
+teg1ál
+teg1ár
+te2g1eg
+teg1e2lem
+te2g1ell
+te2g1elr
+te2gene
+2tegere.
+teg1ered
+te2g1él
+te2g1é2p
+tegész1
+teg3g
+te2gid
+te2gis
+te2giz
+te2g1on
+te2g1ö
+te2gú
+te2g1ü2g
+tegü2l
+te2g1ülé
+te2g1ülő
+2t1egy.
+2t1e2gyes
+t1e2gyez
+t1egyén
+2t1egyh
+2t1egyl
+2t1egys
+2tegyüt
+tei2g
+tein1s
+te2j1a
+teje2g
+te2j1ell
+te2j1elv
+te2j1er
+te2jin
+te2jí
+te2jo
+te2j1ó
+te2j1ös
+te2jő
+te2j1u2
+te2jú
+te2k1ag
+te2k1ál
+te2k1el
+tek1éret
+te2k1i2p
+te2kí
+te1klu
+te2k1ok
+te2k1ös
+te2k1und
+te2k1út
+te2lab
+te2lag
+te2laj
+te2l1an
+te2lap
+te2lar
+te2las
+te2lav
+te2l1á2g
+te2lál
+telá2r
+te2l1át
+2telbü
+teleí3rá
+2telej
+tel1ejt
+2telektr
+tel1e2len
+te2l1elk
+te2l1ell
+te2lemba
+te2leme.
+2telemei
+2te2lemek
+te2lemes
+te2lemén
+2t1e2lemű
+tel1esés
+te2l1e2ső
+te2l1este
+tel1esti
+tele2t1ér.
+t1e2lég
+tel1érét
+te2l1éte
+t1elfoga
+telié2h
+te2l1imi
+te2lind
+te2l1inf
+te2l1ing
+2t1elix
+te2lír
+tel2l1eg
+2tellenf
+2tellenő
+2tellenz
+2t1ellniv
+2telméle
+te2l1ó2
+te2l1öl
+2telőadá
+2t1e2lőí
+2telőnn
+2t1e2lőny
+te2lőtt
+2t1e2lőtu
+te2lővét
+tel1őzi.
+tel1p2
+2t1elsa
+2t1első
+2t1eltelé
+2t1eltett.
+2t1eltéré
+te2lú
+telü2ké.
+2t1elv.
+2t1elvb
+2t1elvei
+2t1elvek
+2t1elvet
+2t1elvév
+2t1elvh
+2t1elvi.
+2t1elvil
+2t1elvk
+2t1elvn
+2t1elvr
+2t1elvt
+2t1elvü
+2t1elvű
+2t1elvv
+te2map
+te2m1as
+2t1embl
+2t1embr
+te2m1e2g
+tem1e2leg
+2t1emelé
+2t1emelk
+2te2melő
+te2melv
+te2m1él
+te2m1ér.
+te2m1é2rő.
+tem1érté
+2t1e2més
+te2m1éte
+te2m1étk
+te2mid
+te2migr
+tem1ill
+te2mim
+tem1ing
+te2m1int
+te2móc
+te2m1ó2r
+te2m1ő2
+2tempá
+2templi
+2t1e2mul
+te2mus
+te2mut
+temü2l
+te2m1ülé
+te2nad
+te2n1a2g
+te2nal
+te2n1a2r
+te2n1as
+te2nat
+te2nau
+te2n1á2t
+ten1d2h
+tene2g
+ten1egy
+te2n1el
+te2ner
+2tenerg
+te2n1esz
+te2n1ékt
+te2n1év.
+te2n1évi
+2t1enged
+te2n1i2p
+te2n1ol
+te2n1ó2
+te2nö
+ten2tin
+ten2t1í2v
+ten1tri
+te2n1u2
+te2nú
+te2n1üg
+te2nünn
+2t1enyh
+t1enyv
+te2oc
+te2of
+teo2s
+2t1epiz
+2t1e2pos
+2tepp
+tep2p1é2k
+ter1abl
+ter1a2cé
+te2r1ada
+ter1aka
+te2r1a2n
+te2r1a2r
+te2rau
+ter1á2cs
+te2ráf
+te2r1áll
+ter1álm
+te2r1á2ri
+ter1áta
+ter2ch
+ter1d2
+2terdő
+2teredm
+te2r1e2dz
+ter1egé
+ter1egy
+2t1e2rej
+te2r1e2ke.
+2t1e2rekl
+te2r1elm
+tereme2
+te2r1ent
+2tereo
+tere2pa
+tere2p1e2l
+tere2p1ü2lé
+te2r1er
+te2r1e2ső
+te2r1este
+te2r1esté
+te2reta
+te2r1eti
+te2retn
+te2rég
+te2r1é2j
+ter1éka
+te2ré2l
+ter1éle
+ter1élv
+ter1g2
+ter1iko
+2terili
+ter1illa
+teri2na
+te2r1i2p
+te2rism
+ter1ist
+ter1izm
+ter1k2
+t1erkölc
+termés1s
+te2r1old
+te2ror
+te2r1ox
+te2r1ó2r
+te2rök
+te2r1ön
+te2rő
+2t1erő.
+2t1erőb
+2t1erőf
+2t1erős
+t1erőt
+t1erőv
+ter1s2
+tersz2
+tert2
+ter1tr
+te2rur
+te2r1ut
+te2r1út
+te2r1üg
+te2r1üld
+ter2vaj
+ter2van
+te2sar
+te2sár
+te2sel
+tes1ell
+2t1esemé
+2t1e2setb
+2t1e2sete.
+2t1e2setei
+2t1e2seten
+2t1e2setet
+2t1e2seté
+2t1e2seth
+2t1e2seti
+2t1e2setn
+2t1e2setr
+2t1e2sett
+te2sél
+2teséll
+2tesély
+2t1e2sés
+te2s1int
+tesí2r
+te2sírn
+te2s1író
+te2síz
+2teskü
+t1esni
+te2sot
+2t1e2ső
+tesp2
+2t1esszen
+tes2tak
+tes2t1áll
+testá2r
+tes2tára
+tes2t1elk
+tes2t1ell
+tes2t1er
+2testéj
+2testék
+tes2t1ékn
+tes2t1éks
+2testém
+tes2tism
+tes2t1o
+testő2
+tes2t1őre
+tes2t1őré
+tes2tur
+te2s1ú
+te2s1ü2v
+2teszet
+2t1eszmé
+tesz2t1a2
+teszte2r
+tesz2t1ere
+tesz2t1é2te
+tesz2tor
+te2t1a2k
+te2t1a2l
+te2tana
+te2t1a2p
+te2tág
+te2t1ál
+tetá2r
+te2t1ára
+te2tát
+te2t1e2g
+te2t1ell
+tet1e2lő
+tet1elr
+te2t1elv
+te2tene
+tete2r
+te2t1eré
+te2t1esz
+te2t1éj
+tet1ékk
+te2t1é2l
+te2t1éri
+te2t1érv
+te2tid
+2t1e2tika
+2t1e2tiká
+te2tim
+te2t1int
+tetkész1
+te2t1olt
+te2t1ot
+te2tór
+te2tur
+te2t1üz
+2t1e2tűd
+te2t1ű2z
+tevés3s
+te2vol
+te2w1a
+2t1exp
+2t1e2zer
+tezőa2
+t1ezred
+1té
+2t1ébr
+té2cő
+té2des
+2tég.
+2tégb
+2téget
+2tégé
+té2gép
+té2gés
+2tégg
+2tégj
+2t1égk
+tégla1
+2tégn
+2t1é2gö
+2t1é2gő
+2tégr
+2tégt
+tégü2
+té2g1ül
+2t1éh.
+2t1é2hek
+2t1é2hen
+2t1é2hes
+2t1é2het
+2t1é2hé
+2t1éhs
+2t1é2jen
+té2jes
+2t1éjr
+2t1éjs
+2t1éjt
+té2kab
+té2kad
+ték1ada
+té2k1aka
+ték1alk
+té2kam
+té2k1a2n
+té2k1ar
+téka2t
+té2k1att
+té2kaz
+té2k1ág
+té2k1e2c
+té2kedé
+té2k1e2g
+té2k1e2kéh
+té2k1e2lőá
+té2k1elr
+té2k1er
+té2k1esz
+té2k1eti
+té2k1é2k
+té2k1é2l
+té2kép
+té2k1ér.
+té2k1és
+tékfélé2
+tékfé2l1év
+té2kid
+té2kik
+té2kim
+té2kirá
+té2k1i2s
+té2kí2
+té2k1o2r
+té2k1osz
+tékó2
+té2kór
+té2k1ö2
+té2kő
+té2k1u2t
+tékü2l
+téla2
+té2lak
+té2l1an
+té2lap
+té2las
+t2élá
+té2láb
+té2lál
+té2lár
+té2l1á2t
+té2lei
+té2le2l
+tél1ele
+tél1ell
+tél1elő
+tél1elv
+té2l1e2r
+té2les
+tél1est
+té2lez
+tél1ékb
+tél1éké
+té2lí
+té2ló
+té2l1ö2
+télőkész1
+télu2
+té2lut
+2té2lű
+té2lyeg
+télyigaz1
+téma1p
+té2mé
+té2mil
+téna2
+té2n1an
+2t1é2nekb
+2t1éneke.
+2ténekek
+2t1é2neké
+2ténekl
+té2n1in
+té2n1ö2
+té2ny1e2g
+té2ny1e2l
+té2nyék
+tényigaz1
+té2nyim
+té2nyo
+té2nyö
+tépés3s
+2t1é2pí
+té1p2la
+2t1é2pül
+té2rab
+té2raj
+tér1akt
+té2r1a2n
+té2rar
+té2ras
+té2rav
+té2r1á2r
+2térdekb
+2térdekl
+2térdekn
+2térdekü
+2térdekű
+tér2d1e2mel
+tér2d1í2j
+té2reg
+té2r1e2l
+té2rem
+tér1eml
+té2r1eng
+té2r1eső
+té2r1essz
+té2r1esz
+2t1é2rett
+térés1s
+té2r1ész
+tér1éte
+téri2d
+té2r1ide
+té2ril
+té2rip
+té2ris
+2térkez
+2t1érmü
+té2r1os
+té2rö
+2t1értes
+2t1érték
+2tértő.
+2t1értők
+tér1t2r
+2t1értv
+té2r1u2
+2t1érv.
+2t1érvei
+2térvek
+2t1érvény
+tésa2
+té2sab
+té2sag
+té2s1aj
+té2sak
+té2s1al
+té2san
+té2sap
+té2s1as
+té2s1az
+té2s1á2
+tésát1a2
+té2s1eg
+té2s1e2l
+té2s1e2r
+té2sés
+tés1iko
+té2s1or
+té2só
+té2s1ő2
+té2su
+tésü2l
+té2s1ülé
+tés1ülő
+té2s1üt
+tés3zav
+tész1ál
+tés3zár
+té2szeg
+té2sz1emb
+tés3zene
+té2szesz
+té2sz1ék
+tés3zsi
+té2t1a2l
+tétcsa2
+té2t1e2g
+tét1e2lemt
+tét1elkés
+té2t1elve
+2t1éteri
+té2t1ers
+té2t1e2v
+té2t1é2te
+té2tok
+té2tol
+té2t1os
+tétó2
+té2tón
+té2t1ór
+2t1év.
+2t1évad
+2t1évb
+2t1évc
+2t1é2vedb
+2tévei
+2t1é2vek
+2t1é2vem
+2téves.
+tévé1sz2
+2t1évf
+2tévh
+2t1é2vi
+2tévk
+2t1évn
+2t1évr
+2t1évs
+2tévt
+té2vú
+2t1évü
+té2vükö
+té2vün
+2t1é2vű
+2t1évv
+té2zs
+tfa2l1aj
+tfa2lan
+tfa2le
+tfa2lom
+tf2jo
+tf2la
+tf2le
+tf2li
+tf2lo
+tf2ló
+tf2ra
+tf2rá
+tf2re
+tf2ri
+tf2rí
+tf2ro
+tf2rö
+tf2ru
+tgá2zak
+tgá2zár
+tgá2zé
+tge2n1el
+tge2né
+tgen1s
+tg2lo
+tg2ló
+tg2ne
+tg2ra
+tg2rá
+tg2ri
+tg2ró
+tg2ru
+tg2rü
+tha2de
+1thagore
+t2har.
+1t2hau
+1t2he.
+the2i2d1
+1theidp
+1theusz
+t2holi
+thon1n
+tho1ny
+1thosz
+th1sc
+1thy
+1ti
+ti2aa
+ti2ae
+ti2aé
+ti2af
+ti2ah
+ti2aj
+tiakész1
+ti2ala
+ti2am
+ti2a1p
+ti2ata
+ti2atl
+ti2aü
+ti2av
+ti2chi
+ti2dea
+2t1i2deá
+2t1i2deg
+ti2dei
+2tidej
+2t1i2deo
+ti2dén
+2tidéz
+ti2dio
+2t1i2dom
+2t1i2dő
+tie2le
+tie2n
+tié2b
+ti1fl
+2t1i2ga
+2t1i2gá
+2t1i2ge.
+2t1i2gék
+ti1g2lo
+ti1g2ra
+2t1ihl
+ti3ki
+ti1kle
+ti1klu
+ti2konb
+ti2kono
+ti2konr
+tiko1sz2
+ti1k2ri
+ti2lac
+ti2lad
+ti2lan
+ti2l1ág
+tile2g
+til1egy
+ti2lex
+ti2lim
+til1ing
+ti2l1i2p
+ti2lir
+til1isk
+2t1illato
+2tillú
+ti2l1ö2
+2t1i2ly
+ti2mak
+ti2máb
+2timádó
+ti2máj
+ti2már
+ti2máz
+ti2mes
+2timmu
+2timrei
+2tinakat.
+2t1inakk
+tin1akt
+ti2n1a2n
+tin1ará
+tina1t2
+ti2n1au
+ti2n1áll
+tin1árt
+2t1indá
+2t1inde
+2t1indí
+2t1indu
+ti2ne.
+ti2neg
+ti2n1eké
+ti2nem
+2t1infar
+2tinfl
+2t1infr
+tin2gal
+tin2gas
+tin2g1ár
+tin2g1e2l
+2t1ingeni
+tin2g1eti
+tin2gos
+tin2g1ó2
+2t1i2nic
+tini2g
+tin1iga
+ti2n1i2m
+tini1sz2
+2t1inku
+2t1inkv
+tin3n
+tin1órá
+ti2nö
+2t1insp
+2t1integ
+2t1intéz
+ti2n1ut
+ti2nű
+ti2ol
+ti2onb
+ti2onh
+ti2oni
+ti2onj
+2t1i2onn
+2t1i2ono
+2t1i2onr
+2t1i2ont
+tio2x
+ti2pad
+ti1p2la
+tip2pin
+tip2po
+2t1i2rat
+2t1i2rán
+2t1irg
+ti2rig
+2t1irk
+2t1i2rod
+2tirol
+ti2rom
+ti2rón
+2t1irr
+2t1irt
+tis2as
+ti2s1a2u
+ti2s1el
+2t1i2si.
+ti2sim
+ti2sin
+ti2s1i2r
+2t1i2sis
+2t1isko
+ti2sor
+2tistv
+tisz2tina
+ti2t1i2o
+ti1t2ri
+ti1t2ro
+tiu2mé
+tiu2m1i2
+2tivad
+2t1i2var
+2t1i2ván
+2t1i2vó
+ti2xa
+tize2n1
+ti2zé.
+2tizéj
+2tizék
+ti2zér
+ti2zét
+ti2zév
+tizo2m
+1tí
+tí2gé
+tí2ja
+tí2já
+tí2jú
+tí2la
+tí2l1ó2
+2tínio
+2t1í2no
+2t1ínr
+2t1íns
+2t1í2ny
+tí2ra2n
+tí2rar
+tí2r1ál
+2t1í2rás
+tí2r1e
+2t1í2ró
+tí2rő
+tí2rü
+títés3s
+títőa2
+títőe2
+tí2v1ec
+2t1í2vei
+tí2vel
+tí2ver
+2t1í2véi
+tívi2
+tí2vik
+tí2vir
+tí2viv
+tí2v1ó2
+tí2vö
+tí2vő
+tív1s
+tí2za
+tí2zá
+tí2zel
+tíz1ele
+tí2z1emb
+tízi2
+tí2zik
+tí2z1is
+tí2zí
+2tízl
+tí2z1o
+tí2zö
+tí2zsá
+tí2zu
+tí2zül
+tíz1ülé
+2t1í2zű
+tje2gy1á2
+tjó2t1
+tka1pr
+tka2ró2r
+tkende2
+tké2p1e2kéh
+tkia2l
+tkiá2
+tkie2
+tkié2
+tk2la
+tk2li
+tk2lí
+tk2ló
+tk2lu
+tkö2z1él
+tkőé2h
+tk2ra
+tk2rá
+t1k2reác
+t1k2ré
+t1k2ri
+tk2rí
+t1k2ro
+t1k2ró
+tk2ru
+tk2va
+tk2vi
+tk2vó
+tla2c3
+tla2g1a2d
+tla2g1ar
+tla2gas
+tla2gál
+tla2g1e
+tlag3g
+tla2g1ó
+tla2n1e2
+tlanká2
+tla2nó
+tla2pár
+tleí2
+tlen3n
+tle2t1a2n
+tle2tas
+tle2tele
+tle2t1elv
+tle2t1ér.
+tle2tos
+tle2tő
+tleü2
+tlé2kal
+tlé2kem
+tlé3pe
+tlés3s
+tlé1trá
+tló1dr
+tma2gál
+tma1k
+tmá2nyir
+tme2g1e2
+tme2g1é
+tme3gif
+tmu2sí
+tmus3s
+tmu2sz
+tna2gya
+tná2d1
+tne2k1el
+tne2küld
+tne2m1e2r
+tne2r1a
+tne2r1á
+tne2sz1a
+tne2szi
+tne2sz1ó2
+tnév1a
+tnómen1
+tnómenk2
+tnö2k1öl
+tnőé2n
+1to
+2t1obj
+2t1obl
+2t1obs
+to1cki
+to2daa
+to2das
+to2dí
+2t1o2dú
+2t1odv
+2t1off
+togás1s
+to1g2ráf.
+to1g2ráff
+to2il
+to2k1aka
+to2k1a2n
+to2k1ap
+tok1ari
+to2k1ál
+tok1á2rok
+to2k1átl
+to2k1átm
+to2k1átr
+to2k1áts
+to2k1átt
+to2k1átv
+to2ker
+to2k1é2l
+to2kép
+to2kid
+to2k1im
+to2k1in
+to2k1ip
+to2k1iv
+to2kí
+t1o2kozá
+to2k1ö
+to2kő
+to1k2ro
+tok1s
+toksz2
+to2k1ur
+to2kúr
+to2kü
+to2kű
+to2l1a2d
+2t1o2laj
+to2l1akt
+tola2n
+to2l1any
+to2l1a2r
+tol1atom
+tol1ábr
+2toldalo
+2toldalt
+2t1o2lim
+tol1k2
+tol2l1árb
+tol2l1á2ré
+tol2l1árh
+tol2l1árr
+tol2leg
+tol2l1in
+tol2l1í2
+to2l1o2r
+2t1oltás
+to2l1ut
+2tolvas
+to2m1ag
+to2m1ak
+to2m1a2l
+to2m1a2n
+to2m1ap
+to2m1ál
+to2m1á2r
+tom1b
+2tombe
+to2m1el
+to2men
+tom1erő
+to2m1es
+to2mí
+to2m1osz
+to2m1ó2
+to2mö
+tom1p2
+tom1s
+2tomtö
+2tomú
+to2mü
+to2mű
+to2nalm
+tona1t2
+tonau2
+ton1áll
+ton1álm
+to2n1á2z
+to2n1el
+to2n1en
+to2ner
+ton1gr
+to2nil
+ton1k2
+to2nol
+to2n1or
+to2n1osz
+to2nóc
+to2nór
+to2nö
+to2nő
+ton1s2
+tont2
+ton1tr
+to2n1út
+to2nü
+to2nű
+to2nyal
+to2nye
+to2p1at
+2topc
+2to2pe
+to2pik
+to2piz
+2topp.
+2toppo
+2toppr
+top1t2
+to2pü
+to2r1a2d
+to2r1ag
+to2r1aj
+to2r1aka
+to2r1akn
+to2r1ako
+to2r1a2l
+tora2n
+to2r1any
+to2r1a2p
+to2r1ar
+tor1ass
+to2rat
+to2r1au
+to2r1av
+tor1ács
+to2r1áll
+to2r1álm
+tor1áté
+to2r1átl
+to2r1á2z
+2t1orcá
+tord2
+tor1dr
+tore2
+to2rec
+to2rek
+to2r1el
+to2ren
+to2r1er
+tor1f2
+tor1g2
+2t1organ
+2torie
+to2r1ill
+to2r1int
+to2r1isk
+tor1k2
+2tornó
+to2rop
+to2rosz
+tor1oszt
+to2r1ov
+toró2
+to2rón
+to2r1ór
+to2rö
+to2rő
+2t1orr.
+2t1orráv
+2t1orri
+tors2
+tor1sc
+tor1sk
+2t1orsó
+tor1sp
+tor1st
+tort2
+tor1tr
+to2rü
+3torvá
+2torvos
+2torvv
+to1ry
+to2s1as
+to2s1e
+to2sik
+to2s1in
+to2sis
+tos3sze
+t1osto
+2t1osty
+to2sü
+to2szal
+to2szan
+to2sz1e
+tosz1k
+2t1oszlop.
+tosz1tr
+3t2ot.
+2t1otthon
+to2ut
+tova1
+2t1o2ve
+2t1o2vi
+2t1o2vu
+2t1oxid
+2t1o2xig
+to1yo
+toza2t1al
+1tó
+tóá2gy
+tóá2r
+tóát1
+tóáta2
+tó1bl
+tó1bra
+tó1bró
+tó1cl
+tócsa2p1á2g
+tó2daj
+tó2d1a2n
+tó2d1esé
+tó1dro
+tó2dúr
+tó1fl
+tó1gl
+tó1g2r
+tói2g
+tóí2v
+tóká2rok
+tó1k2l
+tó1kre
+tó1kré
+tó1kro
+tónus3s
+tóo2k
+tóó2r
+tóp1ass
+tó2p1e2l
+tóp1int
+tó1pro
+tó2ras
+tó2ráb
+tó2ráh
+2t1ó2rái
+tó2rár
+2t1ó2rás
+tó2rát
+t1ó2ráv
+tó2sep
+tós1éták
+tós1é2tát
+tó2sír
+tó1s2kan
+tó1skál
+tó2s1ol
+tó1s2porto
+tó1s2portt
+tó1s2rác
+tó2s1ü2l
+tó2s3zene
+tó1sz2f
+tó1szk
+tó2taj
+tó2tág
+tó2tom
+tó1t2rá
+tó1t2re
+tó1tro
+2tóvod
+2t1ó2vó
+1tö
+töb2bev
+töb2b1o
+2t1öbl
+2tödéé
+tö2dém
+tö2dí
+2tödné
+tö2do
+2tödöt
+2tödü
+tö2ka
+tö2ká
+tö2k1e2v
+tö2k1ér.
+tö2k1érd
+tö2kid
+tö2kí
+2tö2ko
+2t1ö2kör
+tökös3s
+tö2k1ő
+2tökrös
+tö2ku
+2t1ölb
+2t1ölci
+töl2gya
+töl2t1á2
+t1öltön
+2t1öltöz
+töm2b1a
+tömbe2
+töm2bel
+töm2b1o
+t1ömle
+2t1ömlé
+t1ömli
+tö2möl
+tö2na
+tö2ná
+tön1d2
+tö2nen
+tö2n1í
+tön2kár
+tönkész1
+tö2no
+tö2n1ő
+tön1s
+tö2nu
+tö2nú
+2t1ö2reg
+törés3s
+2töröks
+tör2t1a2
+tör2teg
+tör2t1e2lem
+tör2ter
+tör2térn
+tör2t1és
+tör2t1o2
+tör2t1öl
+tör2tös
+tör2zsa
+tör2zs1ö2l
+2t1ösv
+2t1ösz
+2t1ötl
+töt2t1á
+2t1ötv
+2t1öv.
+2t1övb
+2t1övh
+2t1ö2vie
+2tövig
+2t1övj
+2t1övk
+2t1övn
+2t1övr
+2t1övv
+2t1ö2zön
+tözőe2
+1tő
+tőa2c
+tőa2l
+tőá2g
+tő1bl
+tő1br
+tőe2ké
+tőe2r
+tőé2l
+tő1fl
+tő1gr
+tőí2t
+tőí2v
+tő1kl
+tő1kv
+tő1pl
+tő1pr
+tő1ps
+tő2rag
+t1őral
+2t1ő2r1an
+tőr1egy
+2t1őrez
+2t1ő2rék
+2tőréü
+tő2rin
+tő2r1is
+2t1ő2rí
+2t1őrjá
+2t1őrjel
+2tőrjö
+2tőrka
+2tőrl
+2tőr1öl
+2tőrp
+2t1őrti
+2tőrtr
+2t1őrz
+tő2s1a2l
+2t1ősny
+tő1spe
+tő1s2pi
+tő1spr
+tő1srá
+tő1sta
+tő1s2tá
+tő1sté
+tő1str
+2tősű
+tő2sű.
+tősz2
+tő1szt
+tő1tr
+tőü2l
+tőzá2
+tőzár1
+tpen3n
+tp2fe
+tp2la
+tp2lá
+tp2lé
+tp2lu
+tp2ra
+tp2re
+tp2ré
+tp2ri
+tp2ro
+tp2ró
+tp2ru
+tp2sz
+tpu2tin
+t2rafó
+1t2ragé
+1tragi
+tra1k2l
+tra1kro
+tran2d1a2
+tran2dá
+trans1s
+tran2sz1ai
+tran2sz1o2m
+tra1s2p
+trat2
+t2rati
+tra1tr
+1trágya
+1trágyáb
+1trágyáé
+1trágyáh
+1trágyái
+1trágyáj
+1trágyák
+1trágyán
+1trágyár
+1trágyás
+1trágyát
+1trágyáv
+t2rájk
+trán2sz
+trá2nyal
+trá2t1ér
+tre2csa
+tre2cso
+t2rego
+tren2da
+tren2d1ő2
+1trení
+tréé2
+1t2réni
+tré1p2
+tré2sz1á2
+tri1g2
+trii2
+t2rikó
+t2rill
+1t2rió.
+t2riój
+t2riók
+trol2l1in
+tro2mad
+tro2maj
+trona2
+tro2n1ag
+tro2nal
+tro2nan
+tro2nes
+tron3n
+tron1tr
+tr2os
+tro1sz2f
+tro1sz2ta
+t2r1o2x
+tró2de
+tró2nas
+tró2n1e
+1trónj
+1t2róno
+t2rónt
+tró1sz
+tró2zsi
+t3röm
+1t2rös
+1t2rub
+tru2mad
+1t2rup
+tsa2vo
+ts2ch
+1tsche
+tsé2g1éj
+ts2ká
+ts2ko
+ts2la
+ts2lá
+ts2le
+ts2li
+ts2má
+ts2mi
+ts2ni
+tsói2
+ts2pa
+ts2pe
+ts2pi
+ts2po
+ts2pó
+tsp2r
+ts2rá
+t1s2ta
+t1s2tá
+ts2te
+ts2té
+ts2ti
+ts2tí
+ts2to
+tst2r
+ts2tu
+ts2tú
+1t2sub
+tsza2ké
+tsza2k1ü
+tsza2t1e2
+tsza2tö
+tszé2t
+t1sz2f
+t1sz2k
+t1sz2l
+tszö2g1e2le
+t1sz2p
+t1sz2t2
+ttad2
+tta2dó.
+ttag1g
+tta2g1o2ku
+tta2n1ér
+t2t1ará
+t2t1aszt
+tta1t2r
+ttaü2
+t2t1a2z
+ttán2s1á2g
+ttá2v1i2
+tte2leme
+t2t1e2lőa
+tte2r1in
+t2t1erő
+tte2s1a2
+tt1ég.
+t2t1é2le
+tté2rak
+ttér1em
+tté2r1es
+tté2r1é2ne
+tté2rid
+ttér1in
+tt1éss
+tt1é2vér
+t2t1i2o
+t2t1iro
+t2t1isk
+t2tizz
+ttír1a
+tt1írá
+tt1kr
+ttornác1
+t2t1ors
+ttó1dr
+ttó1p2
+t2t1ó2rá
+ttó1s2r
+ttö2l
+tt1ölő
+tt1pr
+t1t2raf
+t1t2rag
+t1t2ran
+ttransz1
+ttranszk2
+t1t2rav
+t1t2róf
+tt2rón
+ttsé2gel
+tt2si
+t2t1ug
+t2t1üd
+t2t1üt
+t2t1ü2v
+ttwe2
+t2ty
+tty1or
+tty1ö2l
+ttyü2
+tty1ül
+ttyülés1
+1tu
+tuá2r
+tubus1s
+tu1ck
+tuda2te
+tuda2t1ö
+2tudí
+tu2ga
+tu2go
+2t1ugr
+tu2hu
+tu2in
+2t1ujj
+2tuká
+tulo2
+2t1ulti
+2t1ultr
+tu2lü
+tu2mab
+tu2m1a2d
+tu2maj
+tu2mal
+tu2man
+tu2mar
+tu2maz
+tu2mál
+tu2meg
+tu2m1el
+tu2mer
+tu2mes
+tu2m1i2k
+tu2mim
+tu2m1inf
+tu2m1int
+tu2m1ir
+tu2mis
+tu2miz
+tu2mí
+tu2mol
+tu2mö
+tu2mő
+tum1p2
+tu2mü
+tu2nal
+2t1unc
+2tunió
+tu2nit
+2t1u2no
+2t1u2nó
+2t1unt
+tu1p2r
+tu2rac
+2turai
+2t1u2rak
+tu2ralo
+tu2ram
+2t1u2ras
+tu2ráh
+2turán
+tu2rár
+tur2g1a
+tu2run
+tus1abl
+tu2sar
+tu2ság
+tu2se
+tu2s1érté
+tu2sis
+tu2s1í
+tu2sor
+tu2s1ó2
+tu2s1ö
+tu2ső
+tuss2
+tus3sze
+tus3szi
+tus3szo
+tu2sü
+tu2szab
+tu2sz1a2d
+tu2szag
+tu2szal
+tu2szap
+tu2szar
+tus3zav
+tu2szál
+tusz1em
+tu2sz1é2l
+tu2sz1é2p
+tuszi2
+tu2sz1il
+tu2szin
+tu2sz1ip
+tu2szir
+tu2szis
+tu2sz1it
+tu2szí
+tusz1k2
+tu2szol
+tu2s3zó
+tu2szö
+tu2sző
+tusz3sa
+tus3zse
+tuszt2
+tusz1tr
+tu2szü
+2t1u2tad
+2t1u2tak
+2t1u2tal
+2t1u2tam
+2t1u2tas
+2t1u2taz
+2tutá
+tu2tán
+2t1utc
+2t1u2to
+tu2tód
+tu2tóp
+tu2tót
+tu2tun
+tu2um
+2t1uzso
+1tú
+tú2ja
+tú2jí
+tú2jo
+tú2ju
+tú2l1a2
+tú2l1á2
+tú2l1e2
+tú2l1é2
+tú2list
+tú2lí
+tú2lok
+tú2lop
+tú2l1ó2
+tú2lö
+tú2l1ő
+túl1s
+túlt2
+tú2lú
+tú2lü
+tú2lű
+túra1sz
+tú2rál
+tú2r1e2
+tú2r1ér
+tú2r1és
+tú2r1ol
+tú2rot
+tú2rö
+tú2rü
+tú2sze
+tú2szö
+tú2szü
+tú2tá
+2t1útb
+tú2t1e2
+2t1ú2té
+2t1úth
+2t1ú2ti
+2t1útj
+2t1útl
+2t1útn
+2t1ú2to
+2t1útr
+2t1útt
+2t1útv
+1tü
+2t1ü2dí
+2t1ü2dü
+2t1üdv
+tü2ge
+tü2gy
+tü2l1a
+tü2lá
+2t1ü2led
+tü2l1e2m
+tü2len
+tü2lep
+tü2l1e2s
+tü2l1e2v
+tü2l1ér
+tü2lir
+tü2lí
+tü2l1o2
+tü2l1ökl
+tü2löm
+tü2l1ön
+tü2l1öz
+tü2lők
+tü2lőr
+tü2lu
+tü2lú
+tü2ma
+tü2mék
+tü2m1ő
+tüne2tel
+2t1ünn
+2türeg
+2türes
+2t1ü2rí
+2t1ü2rü
+2tüst
+2t1ü2te
+2t1ü2té
+tü2ti
+2t1ütk
+tü2tö
+2t1ü2tő
+tü2vö
+2t1ü2zen
+2t1üzl
+1tű
+tűcsa2p1
+tű2d1al
+tű2dá
+tűe2két
+tűé2h
+tűfélé2
+tű1gr
+tű1kv
+tűleü2
+tű1pl
+tű1pr
+tűrés1s
+tű1sp
+tű2z1a2
+tűzá2r
+tű2z1ára
+tű2zát
+tű2zene
+tű2zis
+tű2zí
+tű2zo
+tű2z1ös
+tűz3seb
+tű2zú
+tva2n1e
+tva2név
+tva2raj
+tvá2nyad
+tvá2nyí
+tvá2z1al
+tvá2zip
+tve2n1e2v
+tven3n
+tven3t
+tvenü2
+tve2nül
+tve2n3y
+tve2raj
+tve2ral
+tve2r1á2
+tve2reg
+tve2r1é2sz
+tve2rint
+tve2rip
+tve2r1o
+tvers2
+tver1st
+tve3se
+tvé2nyel
+tvér1int
+tvé2r1o
+tviselőé2
+tvis3szá
+t2víve
+t2y
+1tya
+tyai2ko
+tya1kl
+tya1p2
+tya1sz2
+tyat2
+tya1tr
+tyau2
+1tyá
+2ty1ág
+ty1áld
+ty1áll
+tyá2ran
+tyár1s
+tyás3s
+1tye
+ty1e2gy
+ty1ela
+ty1ell
+ty1emb
+ty1e2rő
+2ty1ex
+1tyé
+2ty1éte
+1tyi
+1tyí
+ty1í2r
+ty1ív
+tynk2
+1tyo
+tyo2lan
+tyo2r1os
+1tyó
+1työ
+1tyő
+ty1ős
+ty2pe
+ty1pr
+ty2sa
+ty1sp
+1tyu
+2ty1ug
+ty1u2tá
+1tyú
+tyú2kü
+1tyü
+1tyű
+1t2zekn
+1tzekrő
+1t2zen.
+t2zenj
+1t2zer
+1t2zes
+tz1ő2r
+tz3sc
+2u.
+u1a
+ua2ch
+ua2da
+ua2dá
+u2ador.
+u2adorb
+u2adoré
+u2adorn
+u2adoro
+u2adorr
+u2adort
+ua2dó
+ua2es
+ua2gá
+ua2ja
+ua2já
+ua2la
+ua2lá
+ua2ny
+ua2sz
+ua2ty
+ua2ut
+ua1yá
+ua1yé
+ua1yi
+ua1yo
+ua2zo
+u1á
+uá2ga
+uá2gy
+uá2po
+uá2r1á
+uá2r1e
+uá2réj
+uá2r1is
+uá2sz
+uá2t1a2
+uá2t1e
+ub1a2la
+ub1alk
+u2b1ang
+ub1arc
+ub1a2ri
+ub1ár.
+ub1á2ro
+ub1dr
+u2b1e2b
+u2b1ed
+ube2lá
+ube2lel
+ub1elö
+ub1e2se
+ub1est
+u2b1éj
+ub1éle
+u2b1é2n
+u2b1ép
+u2b1érd
+u2b1é2re
+u2b1érm
+u2b1érte
+u2b1éve
+ubi2g
+u2b1iga
+u2b1ige
+ubi2ke
+u2b1ina.
+ub1ism
+ub1kr
+ub1olda
+u2bork
+u2b1orv
+u2b1osz
+ub1óri
+ub1öl
+ub1ös
+ub1öv
+ub1pl
+ub1pr
+ub1sl
+ub1sp
+u2b1ud
+ubu2sz
+u2b1új
+ub1üd
+ub1üg
+ub1ü2l
+ub1üz
+uca2t1á2
+uc2c1e
+uc2c3h
+uc2c1ina
+uc2cip
+uc2cö
+ucc3sz
+uc2cú
+uc2cü
+uc2cz
+uc1emb
+uc3há
+u2c3hé
+u2c3ho
+uciá2r
+uci1p
+u1c2kig
+u1c2kon
+u1c2kot
+uc2ky
+uc1ö2l
+uc1pr
+ucsa2p1á2
+uc3ság
+u2cs1ál
+u2csáru
+u2cs1e2l
+u2cs1id
+ucs1s
+u2c3sü
+uc3sz
+u2c1ug
+uc1üg
+uc3zá
+uc3ze
+uda2tal
+uda2tál
+uda2t1á2ram
+uda2t1eg
+uda2ter
+udáskész1
+udás3s
+udi2o
+u2d1isk
+udo1kr
+udó2se
+udó2sor
+u1d2rá
+u1d2ro
+u1e
+ue2bé
+ue2dz
+ue2gé
+uegész1
+ue2gy
+uel1ér
+ue2lő
+ue2me
+ue2rő
+uervíz1
+u2es.
+u2esb
+ue2s1e
+u2esh
+u2esi
+u2esk
+u2esn
+ue2ső
+u2esr
+u2est
+u2esu
+ue2s3zen
+ue2te
+ue2ve
+u1é
+ué2ge
+ué2gé
+ué2ké
+ué2le
+ué2pí
+ué2pü
+ué2te
+ufé2nye
+u1f2le
+uf2ri
+uf2ru
+uf2tü
+ug1agy
+ug1alj
+uga1p
+ug1apa
+1u2garo
+uga2t1el
+uga2tés
+uga2tol
+uga2t1ó2r
+ug1ág
+ugára2
+ugár1ad
+ugá2rá
+ugá2ros
+ugá2ru
+ugár1ú
+ugás3s
+ug1á2sz
+ug1el
+ug1e2v
+ug1é2l
+ugg2l
+ugi2e
+ug1ing
+ug1int
+ug1iro
+ugi2t
+ug1ita
+ug1ivá
+ug1ír
+ug1kl
+ugo2r1á2
+ugó1sv
+ugó2s3zá
+ug1ös
+ug1pr
+ug1sk
+2ugui
+u2g1ut
+u2g1új
+ug1üg
+ug1üz
+ug1űr
+ugya2n
+uh1a2dó
+uh1alk
+uha2r1as
+uha1t2r
+uh1att
+u2h1á2g
+uh1áll
+u2h1ár.
+u2h1árb
+u2h1árf
+u2h1árh
+u2h1árn
+u2h1árr
+u2h1árv
+uhá2szak
+uh1em
+uh1ex
+uh1ind
+uh1ing
+uh1orz
+uh1őr
+uh1pr
+uh1tr
+u2hu.
+u2huj
+uh1ujj
+uh1üz
+u1i
+ui2de
+ui2dő
+ui2eu
+ui2ga
+ui2gé
+u2i1gn
+ui2pa
+ui2rá
+ui2zé
+u1í
+uí2ja
+uí2ju
+uí2ve
+uí2vű
+u2j1an
+1ujja.
+1ujjad
+1ujjai
+1ujjak
+1ujjam
+1ujjas
+1ujjat
+uj2j1á2ru
+1ujjb
+1ujjc
+1ujjd
+1uj2j1e2
+1ujjé
+1ujjf
+1ujjg
+1ujjh
+1ujji
+uj2jí
+1ujjk
+1ujjl
+1ujjm
+1ujjn
+1ujjp
+1ujjr
+1ujjs
+1ujjt
+1ujju
+1ujjú
+uj2jü
+1ujjv
+u2j1op
+uk1abl
+uka2c3se
+u2k1a2lap
+uka1pl
+uka2rán
+u2k1arc
+uka2szás
+uka1t2r
+uk1áll
+uká2sar
+u2k1ásó
+ukás3s
+u2k1átm
+uk1bl
+uke2l
+uk1e2m
+uk1ex
+u2k1ég
+u2k1érz
+u2k1i2p
+uk2k1alt
+uk2k1eg
+uk2k1em
+uk2k1ola
+uk2köl
+uklás1s
+ukló2s3zá
+u2k1old
+ukora2
+uko2ras
+uko2r1á2
+uko2ril
+uko2rin
+uko2r1o
+ukós2
+uk1öb
+uk1pr
+u1k2rón
+uk1ü2t
+uk1űr
+ula2cs1ö2
+ula1g2
+ula2jas
+ul1aleg
+u2l1alj
+ula1s2p
+ulata2l
+ula2t1ala
+ula2t1a2n
+ula2tál
+ula2tem
+ula2tik
+ula2tol
+u2l1ábr
+ulá2k1e
+ulá2k1ü
+u2l1á2ria
+ulá2s1i2k
+uláskész1
+ulás3s
+ulá2sza
+ulá2sze
+ul1bl
+ulcs1e2l
+ulcs1es
+ul2cs1ér.
+ul2csérv
+ul2cs1é2vé
+ul2csiga
+ul2csip
+ul2cs1í2
+ul2csor
+ul2cs1ö2
+ul2cs1ő
+ul2csut
+ul2csü
+ulcs3z
+ule2i
+uleí2
+ule2l
+ul1elő
+ulet2ta
+u2l1ex
+ulé2kal
+ulé2k1e2
+ulé2k1ol
+ulé2kut
+ul1épü
+u2l1érté
+uli2nar
+uli2nin
+ul1í2r
+ul1k2r
+ul2lef
+ul2l1e2l
+ul2l1em
+ul2l1en
+ul2l1ér
+ulot2
+uló1f2
+ulói2kon
+ulókész1
+ulóó2
+ulót2
+uló2zan
+uló2z1á2ra
+uló2z3s
+ul1öt
+ul1pr
+ul1st
+ul2t1aj
+ulta2r
+ult1asz
+ul2taz
+ul2tül
+ul1úr
+ul1üt
+ul1űr
+u2lyi
+u2m1abl
+um1abr
+um1a2cé
+um1ach
+um1a2dat
+u2m1adm
+um1a2do
+um1a2dó
+2umaé
+um1ajá
+u2m1a2ka
+umakész1
+u2m1akk
+u2m1akt
+u2m1a2la
+um1alg
+um1all
+um1alt
+u2m1ana
+u2m1ank
+u2m1a2no
+u2m1a2ny
+2umao
+2uma1p2
+u2m1a2rá
+um1arc
+um1arg
+u2m1a2ri
+um1a2ro
+um1asp
+u2m1atl
+u2m1au
+um1a2zo
+u2m1ág
+u2m1áll
+um1álm
+u2m1á2rak
+um1á2ram
+u2m1áras
+u2m1á2rá
+u2m1árf
+u2m1árk
+u2m1árn
+u2m1á2ro
+u2m1árr
+u2m1árt
+u2m1á2ru
+u2m1árv
+umát1a
+u2m1á2t1e
+u2m1átm
+u2m1átu
+um1bl
+um1b2r
+um1dr
+u2m1e2d
+u2m1ef
+ume2g
+um1egy
+um1ela
+um1elb
+u2m1e2le
+um1elé
+um1elh
+um1elí
+um1elj
+um1elm
+u2m1eln
+um1elo
+um1e2lő
+u2m1elt
+um1elv
+u2m1e2m
+ume2n1á
+ume2n1ó2
+um1e2re
+um1erk
+um1e2rő
+um1e2se
+um1ess
+um1e2sz
+u2m1e2t
+u2m1e2v
+u2m1ex
+um1ezr
+u2m1ég
+u2méhs
+um1é2le
+um1élv
+u2m1ép
+u2m1ér.
+u2m1érc
+u2m1érm
+u2m1érte
+u2m1érté
+u2m1érv
+u2m1é2te
+um1fl
+um1f2r
+um1gl
+um1gr
+umia2
+um1i2dő
+umig2
+umi1gr
+um1imp
+umi2na.
+u2m1ind
+u2m1ing
+u2m1inv
+um1i2onb
+um1i2oné
+um1i2onh
+u2m1i2onj
+um1i2onk
+u2m1i2onn
+u2m1i2ono
+um1i2onr
+um1i2ont
+u2m1irt
+um1isk
+umi1sl
+um1ism
+umi1sp
+umi2szü
+umit2
+umi1tr
+um1izé
+um1ív
+um1íz
+umkész1e
+um1kl
+um1kr
+um1kv
+umna2
+u2m1o2koz
+um1ola
+um1old
+um1oll
+um1olt
+um1olv
+u2m1o2p
+umo2ran
+um1o2rat
+umo2rál
+umo2rin
+um1osto
+u2m1osz
+u2m1ox
+um1ó2rá
+um1ö2l
+um1öm
+um1ön
+um1ö2r
+um1ös
+um1öt
+um1öv
+um1ö2z
+um1ő2r
+um1ős
+umpe2l
+ump1ele
+um2p1ing
+um1p2r
+um1sk
+um1sp
+um1st
+um1sz
+um1t2r
+u2m1ud
+u2m1ug
+u2muni
+umu2r
+um1ura
+u2m1u2t
+um1üg
+um1ü2l
+um1ür
+um1üs
+um1üt
+um1üv
+um1üz
+umva2s
+una1b
+un1adu
+un1akt
+u2n1arc
+u2n1á2g
+un2cs1e
+un2csiv
+un2dz
+un1e2r
+un1e2t
+un1ég
+un2g1a2g
+un2g1eg
+un2g1er
+ung3g
+un2g1ol
+u2n1i2d
+1u2nif
+1u2niku
+u2n1il
+u2n1ingo
+1u2nió
+1u2niv
+unka1p2
+unka1s
+un2k1eg
+u2nod
+u2n1orr
+un1ors
+u2not
+un1pr
+un1s2t2
+unta2i
+u2nun
+un1útj
+un1ü2l
+u1o
+uo2la
+uo2li
+uo2r1a2
+uore2
+uo2r1et
+uo2r1i2o
+uo2xi
+u1ó
+u2óbu
+u2óne
+uó1p2r
+u2óré
+uó2ri
+u2óso
+u2ósz
+u2óve
+u1ö
+uö2ko
+uö2kö
+uö2rö
+uö2zö
+u1ő
+uő2re
+uő2ré
+uő2ri
+uő2rö
+uő2rü
+upa1b2
+up1ada
+upa1pr
+upas2
+upa1sp
+upa1t2r
+upda2
+upe2r1a
+upe2rel
+upe2r1in
+uper1s
+up1e2s
+upé1p2
+up2hi
+upli2n
+up1üz
+1u2raim
+1u2rak.
+1u2rakh
+1u2rakk
+1u2rakn
+1u2rakr
+u2ralh
+1uralk
+1u2ralm
+1u2ram.
+ura2m1is
+1u2rasa
+ura1s2p
+ur1áll
+urát1a
+ur2dar
+ur2d1e
+u2r1ef
+ur2fí
+ur2f1ú
+1urná
+ur2ne
+urn2é
+uro1b2
+uro2k1á
+uro2ke
+uro2ne
+uro1p
+uro1t2
+ur1öl
+urpi2
+ur2t1ag
+ur2t1e2t
+ur2t1e2v
+urti2t
+urt1ita
+ur2t1okta
+uru2c1e
+2urul
+uru1p2
+uru2szál
+u2rú.
+us1abla
+us1a2da
+us1a2dá
+u2s1a2dó
+u2s1a2g
+u2s1a2j
+usa2kar
+u2s1akc
+u2s1a2la
+us1alg
+us1alj
+us1alk
+u2s1alt
+us1alv
+u2s1ana
+us1ane
+us1ant
+us1apá
+u2s1a2ra
+u2s1a2rá
+u2s1arc
+us1arz
+u2s1ass
+u2s1att
+us1a2ty
+u2s1au
+u2s1a2z
+u2s1ábr
+u2s1á2gá
+us1ágb
+u2s1ágg
+us1ágh
+u2s1ágr
+us1áld
+us1áll
+u2s1á2p
+u2s1árad
+u2s1á2rai
+u2s1á2rak
+u2s1á2rá
+u2s1árb
+u2s1árh
+u2s1á2ri
+u2s1árk
+u2s1árn
+u2s1á2ro
+u2s1árr
+u2s1árt
+u2s1á2ru
+us1áta
+us1áth
+us1áti
+us1átk
+us1átt
+us1átu
+us1átv
+us1bl
+us1br
+us1dr
+us1e2c
+us1e2d
+u2s1ef
+us1e2gy
+u2s1e2l
+u2s1e2m
+u2s1e2n
+us1erd
+u2s1e2s
+use1t
+u2s1e2v
+u2s1ex
+us1ez
+u2s1ég
+u2s1éhe
+u2s1é2k
+u2s1é2l
+u2s1é2ne
+u2s1ép
+u2s1érd
+u2s1érte
+u2s1érv
+u2s1és
+u2s1é2te
+us1étk
+us1étt
+u2s1éve
+us1fr
+us1gr
+u2s1i2d
+usi2g
+us1iga
+u2s1i2ko
+u2s1ill
+u2s1i2ma
+u2s1i2má
+us1imi
+u2simm
+us1imp
+u2s1inc
+us1ind
+us1inf
+u2s1ing
+u2s1ink
+u2s1int
+us1inv
+u2s1i2p
+u2s1i2rat
+u2s1i2rá
+us1iro
+us1irt
+u2s1isk
+u2s1ism
+us1ita
+us1izé
+us1íg
+u2s1íj
+usí2r
+us1írá
+us1író
+u2s1í2v
+u1s2kál
+us1kl
+uskói2k
+us1k2r
+us1kv
+u2sodú
+u2s1of
+us1okl
+us1okm
+us1okta
+us1ola
+u2s1old
+us1oli
+u2s1oml
+us1ond
+u2s1op
+u2s1org
+u2sori
+u2s1orr
+u2s1ors
+us1osz
+u2s1ott
+us1óc
+us1ó2s
+u2s1ö2l
+u2s1ön
+us1örd
+us1ö2rö
+u2s1ös
+u2s1öt
+us1ö2v
+u2s1ö2z
+us1ő2r
+u1s2pec
+us1pl
+us1pn
+us1pr
+us1ps
+2uss.
+us2se.
+us1ská
+us1spe
+us1spi
+us1sta
+us1sy
+us3szab
+us3szag
+us3szak
+us3szál
+us3szám
+us3szen
+us3szé
+us3szig
+us3szí
+us3szó
+us3szö
+us3sző
+usszü2
+ussz1ül
+us3szű
+ust1á2rár
+us2teg
+us2t1il
+us1trad
+us1tre
+us1tré
+us1tro
+u1stru
+us2t1ül
+u2s1uj
+usu2s
+us1usz
+u2s1u2t
+u2s1új
+us1úté
+us1üd
+u2s1üg
+usü2l
+us1ülé
+u2s1ün
+u2s1ür
+us1üz
+usz1abl
+u2szaj
+usz1a2la
+usz1alk
+usz1alv
+u2sz1a2n
+usz1app
+usza2r
+usz1ará
+usz1aré
+usz1aro
+usz1asz
+u2sz1au
+u2sz1á2g
+usz1állá
+usz1á2p
+u2sz1á2rad
+u2s3zárako
+u2sz1á2ram
+usz1árje
+usz1ásv
+u2száth
+usz1átö
+u2sz1e2c
+u2szef
+usz1e2ge
+usz1e2gy
+usze2k
+usz1eke
+u2sz1e2l
+usz1emb
+usz1eml
+us3zene
+usz1eng
+u2sz1erd
+usz1e2ré
+usze2s
+u2sz1e2v
+u2sz1ex
+u2széne
+usz1éte
+usz1éto
+usz1imp
+usz1ind
+usz1inj
+usz1isk
+usz1ism
+u2sz1isz
+uszí2j1a2d
+u2sz1ír
+1u2szodá
+u2szola
+u2sz1old
+u2szony
+u2szop
+u2szosz
+u2sz1ö2b
+usz1öl
+usz1ön
+u2sz1ös
+usz1p2
+uszte2r1a
+usz1t2ran
+u2sz1u2s
+u2szut
+usz1útr
+uszü2
+usz1üg
+u2sz1ül
+u2sz1üz
+usz1z
+ut1abl
+uta2csel
+ut1a2dó
+2utakép
+1u2taló
+1u2talv
+utame2
+uta2mel
+uta2mer
+uta1p
+ut1ará
+1utasc
+uta2se
+1utasf
+1u2tasl
+1utasv
+utaü2
+2utav
+1utazi
+2utáb
+2utáé
+2utáib
+2utáin
+2utáju
+2utákb
+2utákt
+2utám
+2utáná
+után1n
+1utánz
+2utáró
+utá2rú
+ut1bl
+1utca
+1utcá
+u2t1e2g
+ute2r1a
+ute2rá
+ute2reg
+ute2rim
+ute2ru
+utén3n
+ut1fr
+uti2k1á2r
+uti2ke
+ut1ill
+uti2m
+uti2n1e2
+uti2nér
+utini2
+uti2nig
+uti2n1ik
+uti2n1ó
+utin1s
+u2t1i2pa
+u2t1isk
+ut1kl
+ut1okke
+u2t1old
+uto2l1é
+u2tols
+2utomata
+uto2rim
+2utos
+2utot
+utó2dal
+u2tódá
+utó2del
+utó1p2
+utó2s1aj
+utós3s
+utó1s2to
+utó1sz
+utó1tr
+utótűz1
+ut1pr
+ut2rak
+ut2ran
+ut2rák
+ut1sp
+ut1st
+ut1t2r
+ut1üg
+ut1ü2z
+utya1s2
+u1u
+uu2m1ag
+uu2mal
+uu2m1as
+uu2mál
+uu2m1e2
+uu2m1é2r
+uu2mim
+uu2min
+uu2mö
+uum1p2
+uu2mü
+uu2ta
+uu2tá
+uu2zs
+u1ú
+u1ü
+uü2gy
+uü2rí
+uü2té
+uü2ve
+uü2ze
+u1ű
+uva2r1a
+uva2r1á2
+uva2r1e
+uva2rin
+uva2szál
+uvata2
+uva2t1ag
+uvi1g2
+uv2re
+uxi2t1a
+uxi2t1á
+uxi2t1e
+uzala2
+uza2lac
+uza2lad
+uza2lan
+uza2lág
+uza2l1át
+uza2lel
+uza2l1ék
+uza1p2
+uza1s2
+2uzál.
+2uzálb
+2uzáll
+2uzálr
+u2z1id
+uz1i2gye
+uz1ír
+uzki2
+uzói2
+uz3sap
+uz3sz
+uz1t2r
+uz1ü2g
+uzü2l
+2ú.
+ú1a
+úa2da
+úa2dá
+úa2dó
+úa2gy
+úa2já
+úa2kar
+úa2kas
+úa2la
+úa2lá
+úa2ny
+úa2sz
+úa2ud
+úa2va
+ú1á
+úá2ga
+úá2gá
+úá2gi
+úá2go
+úá2gy
+úá2hí
+úá2lo
+úá2po
+úá2ra
+úá2ri
+úá2ru
+2úbab
+2úband
+2úbar
+úb2lo
+2úbód
+úb2ri
+úb2ro
+ú2c1aj
+ú2c1a2l
+ú2c1a2n
+ú2c1a2v
+úc1e2t
+úc3he
+úc3ho
+ú2c1i2d
+úci2ókép
+úc1pr
+2úcsa
+ú2csab
+ú2csad
+ú2cs1ag
+ú2cs1aj
+ú2csakt
+úcs1ala
+ú2cs1a2n
+úcsa2p1á2
+ú2cs1a2s
+ú2cs1au
+ú2csaz
+úcs1á2g
+ú2cs1ál
+ú2cs1árá
+ú2cs1árf
+ú2cs1ári
+ú2cs1árv
+ú2csátv
+2úcse
+ú2cs1eb
+ú2cs1e2g
+úc3sej
+ú2cs1e2l
+úcs1emb
+ú2cs1en
+úcs1erő
+ú2cs1e2s
+ú2cs1él
+ú2cs1ér.
+ú2csérd
+ú2cs1érte
+ú2cs1érté
+ú2cs1é2v
+ú2cs1id
+ú2csigaz
+ú2cs1il
+ú2csim
+ú2cs1inf
+ú2cs1int
+úcs1i2pa
+ú2csirá
+ú2cs1is
+ú2cs1iz
+2úcso
+ú2csokta
+ú2csosz
+2úcsó
+ú2cs1ó2r
+úcs1öl
+úcs1ös
+úcs1p
+úcs1s
+úcs1t
+úcsús1s
+úcs1ü2t
+úcs3za
+ú2d1a2c
+úda2d
+úd1ada
+ú2d1a2k
+ú2d1a2n
+úd1ág
+úd1ál
+úd1á2r
+ú2d1e2g
+ú2d1ej
+úde2l
+úd1ele
+úd1elh
+úd1elő
+ú2d1e2m
+úde2ra
+úde2r1ec
+úd1erő
+úd1e2v
+ú2d1ék
+ú2d1ér.
+ú2d1érc
+údé2t
+úd1éte
+ú2d1i2d
+údi2g
+ú2d1igé
+úd1ing
+údi2ódar
+údi2óz
+ú2d1os
+úd1pr
+úd2rá
+úd2ro
+úd1üv
+údy1éh
+údy1ét
+údy1i
+údy2s
+úd3zá
+ú1e
+úe2bé
+úe2gé
+úegész1
+úe2gy
+úe2la
+úe2le
+úe2lo
+úe2lö
+úe2lő
+úe2me
+úe2pi
+úe2re
+úe2ré
+úe2rő
+úe2rű
+úe2sz
+úe2ta
+úe2te
+úe2ve
+úe2vő
+ú1é
+úé2he
+úé2le
+úé2lő
+2úé2ne
+úé2pí
+2úér.
+úé2r1á
+úé2re
+úé2ri
+2úérz
+úé2te
+úé2ve
+úfélé2
+úfé2l1év
+úf2lö
+úf2rá
+úf2ri
+úf2rí
+úf2ro
+úg1a2d
+úgás1s
+úg1el
+úg1i2v
+úg1old
+úgós2
+úg2rá
+úgy1ag
+úgy1el
+úgy1ér.
+úgyi2
+úgy1is
+úgy1iv
+ú2gy1u2
+úgy1út
+ú1i
+2úi2de
+úi2dő
+úi2ga
+úi2gé
+2úi2ke
+2úikre
+2úill
+2úi2má
+úi2mi
+2úing
+2úint
+úi2pa
+úi2rat
+úi2rá
+2úisk
+2úism
+2úist
+úi2ta
+2úi2vad
+úi2vás
+ú1í
+úí2rá
+úí2ve
+úí2vi
+úí2vü
+2újáté
+új1es
+új1ez
+új1éve
+új1évé
+új1k2r
+1ú2jon
+új1or
+új1pl
+újra1
+1újsá
+új1ud
+ú2jul
+2úkab
+ú2k1a2g
+ú2k1a2j
+úk1a2lak
+2úkalan
+ú2k1alk
+ú2k1any
+2úkap
+ú2k1a2pó
+2úkar
+2úkate
+ú2k1atk
+ú2k1ál
+ú2káru
+úke2l
+úk1ele
+úk1ell
+ú2k1em
+úke2s
+úke2t
+úk1ete
+úk1e2vé
+2úkérd
+2úkéré
+2úkés
+ú2k1éss
+ú2k1észr
+ú2k1é2te
+2úkéz
+úkia2
+ú2k1i2d
+2úkin
+ú2k1is
+ú2k1i2t
+ú1k2li
+úk2lu
+2úkol
+ú2k1olt
+2úkom
+2úkonf
+2úkong
+2úkorá
+2úkoro
+2úkos
+úk1ó2l
+úkö2l
+úk1ölő
+úk1pr
+ú1k2re
+úk1t2r
+ú2k1ud
+ú2k1úr
+úkü2l
+úk1ülő
+úk1ült
+ú2k1ür
+ú2k1ü2t
+ú2k1üz
+úl1a2d
+úl1a2ja
+úl1a2l
+úl1a2m
+úla2n
+ú2l1any
+úl1a2ro
+ú2l1á2g
+ú2l1ál
+úl1árn
+ú2l1á2sz
+úl1átv
+úl1br
+úl1d2r
+úl1e2d
+úle2l
+úl1ele
+úl1ell
+ú2l1emb
+úl1en
+ú2l1e2re
+úl1e2s
+ú2l1e2vő
+úl1ex
+ú3lé.
+úl1é2d
+úlé2g
+ú3l2é3va
+úl1fr
+úl1gl
+ú2l1i2d
+ú2l1igé
+ú2l1ij
+ú2l1il
+ú2limá
+ú2l1ind
+ú2l1inf
+ú2l1ing
+ú2l1inj
+ú2l1int
+ú2l1inv
+ú2l1i2p
+ú2l1irá
+ú2l1isk
+ú2l1i2sz
+ú2l1i2ta
+ú2l1itt
+ú2livás
+ú2livo
+ú2lizgato
+ú2l1izz
+úl1íg
+úl1í2v
+úl1k2l
+úl1kv
+úlo2k
+úl1oko
+ú2l1ol
+úl1ope
+ú2l1or
+ú2l1os
+ú2l1ox
+úl1öb
+úl1öl
+úl1ö2m
+úl1ö2n
+úl1ör
+ú2l1ös
+úlövés1s
+úl1őrü
+úl1p2l
+úl1p2r
+úl1p2s
+úl1sk
+úl1sm
+úl1sp
+úl1s2t
+úlsz2
+úlsztá2
+últ1agg
+últ1agy
+úl2t1aj
+úl2t1al
+úl2t1árn
+úl2tél
+úl2térte
+úl2t1és
+últ1éves
+últi2
+úl2tid
+úl2t1im
+úl2t1in
+úl2t1ip
+úl2tis
+úl2tí
+últ1old
+úl2tös
+úl2t1ő2r
+úl1trá
+ú2l1ud
+ú2l1u2g
+ú2l1ur
+ú2l1u2t
+ú2l1úr
+úl1ús
+úl1üg
+úl1ül
+úl1ün
+úl1ür
+úl1üt
+úl1üv
+úl1üz
+úl1űz
+ú2ly1a2d
+ú2ly1a2l
+ú2ly1an
+ú2ly1a2r
+ú2ly1au
+ú2lyál
+ú2ly1átl
+ú2ly1e2
+ú2lyél
+ú2lyés
+ú2lyol
+ú2ly1ö
+ú2lyő
+úly1s
+ú2lyug
+2úmac
+2úmad
+2úmag
+2úmaj
+2úmar
+2úmatr
+úmi2al
+2úmoz
+2únac
+2únap
+únau2
+ú2ny1a2n
+ú2ny1i2r
+úny1tr
+ú1o
+úo2ko
+úo2ve
+ú1ó
+úó2ra
+úó2rá
+úó2sá
+úó2vo
+ú1ö
+úö2le
+úö2lé
+úö2lő
+úö2rö
+úö2ve
+ú1ő
+úő2rö
+úp1eg
+úpe2l
+úp1es
+ú2p1in
+úp2la
+úp2lé
+ú2p1or
+úp1p2l
+úp2rí
+úp2ro
+úraát1
+2úrab
+2úraj
+úr1akk
+úr1alu
+ú2r1ant
+úr1a2nya
+úra1p2
+úra1szp
+ú2rattas
+úrau2r
+ú2r1ábr
+úr1áll
+ú2r1á2ri
+úrás1s
+ú2r1átm
+úr1br
+úr1d2r
+úr1e2c
+úr1e2l
+úr1ez
+ú2rék
+úr1ékk
+ú2r1é2l
+úr1é2ne
+2úrés
+úrfé2l1é2v
+úri2al
+ú2r1i2d
+ú2rie
+úr1ifj
+úri2g
+ú2r1iga
+úri3gényé
+úr1i2m
+ú2r1inf
+úr1ing
+ú2r1int
+ú2ris
+úr1ist
+úr1k2r
+1úrnőr
+úr1ott
+úró1p2
+úró1sp
+úr1ö2c
+úr1ö2l
+úr1ön
+úr1öt
+úr1ős
+úr1pr
+úr1s2k
+úr1sn
+úr1s2r
+úr1s2t
+úr1szn
+úr1u2t
+úr1ü2l
+úr1ü2v
+2úsabl
+ús1abr
+ú2s1a2d
+ú2s1a2j
+ús1a2la
+úsa2n
+ús1any
+ús1apr
+úsa2r
+ús1ará
+ú2s1arc
+2úsarj
+úsá2gol
+ús1áld
+ú2s1á2p
+ú2s1á2rai
+ú2s1á2rak
+ú2s1árb
+ú2s1áre
+ú2s1á2ro
+ú2s1á2ru
+ú2s1á2rú
+ú2s1árv
+2úsát
+ús1átl
+ú2s1á2z
+ús1dr
+ús1e2c
+ús1e2l
+ús1e2v
+ús1ex
+ú2s1é2g
+ú2s1é2l
+ús1é2ne
+ú2s1é2ré
+ús1érm
+ú2s1érté
+ú2s1é2tá
+ú2s1é2te
+ús1étr
+ús1fr
+úsi2g
+ús1iga
+ú2s1il
+ús1imp
+ú2s1in
+ú2s1i2p
+ú2s1i2r
+ú2s1is
+ús1í2z
+ús1kl
+ús1kv
+ú2s1ola
+ú2s1old
+ús1org
+ú2s1orr
+ús1osz
+ús1ó2h
+ús1ös
+ús1őr
+ús2pe
+ús1pr
+ús1s2p
+ús3szag
+ússza2k1
+ús3szav
+ús3sze
+ús3szi
+ús3szí
+ús3szó
+ús3szö
+ús3szú
+ús3szü
+ús2tat
+ús1t2r
+ú2s1u2ga
+ú2s1u2t
+ús1üg
+ús1ün
+ús1ü2t
+ús1üz
+úsvé2t1e
+ú2sz1a2d
+ú2sz1akc
+ú2sz1á2g
+úszás1s
+2úsze
+úsz1ej
+úsz1e2s
+úsz1e2v
+2úszé
+ú2sz1év
+ú2szigá
+2úszí
+úsz1k2
+úsz1old
+úsz1osz
+ú2szóe
+2úszö
+úsz1ös
+úsz1p
+ús3zse
+ú2s3zú
+2úszü
+úsz1ü2g
+úsz2ve
+út1a2d
+út1a2i
+ú2t1a2j
+út1a2v
+ú2t1ál
+út1á2ro
+út1á2s
+ú2t1á2t1
+útá2v1i2
+út1bl
+út1ef
+ú2t1e2g
+út1elá
+út1ell
+út1elz
+ú2téh
+út1é2l
+ú2tén
+ú2t1ép
+út1érd
+ú2t1é2ri
+út1érz
+útfélé2
+út1gr
+ú2tiakh
+ú2tiakn
+út1id
+útie2
+ú2tié
+úti2g
+út1igé
+1ú2tij
+1ú2t1i2ko
+út1ill
+1ú2tiná
+út1ind
+út1inf
+út1ing
+út1int
+út1i2pa
+1ú2tir
+út1irá
+út1ism
+út1ist
+1ú2t1i2z
+út1íg
+út1íj
+út1ív
+út1okm
+ú2t1ola
+út1old
+út1oml
+úto2n1
+út1ont
+út1op
+2útor
+úto2ran
+úto2r1as
+úto2rál
+úto2re
+út1ost
+út1osz
+út1ös
+útő2r
+út1pl
+út1pr
+ú1t2rag
+2ú1t2ri
+útsá2gi
+út1st
+útu2m1é
+útu2r
+út1urá
+ú2t1út
+ú2t1üg
+1útvo
+ú1u
+úu2no
+úu2ra
+ú1ú
+ú1ü
+úü2gy
+úü2lé
+úü2re
+úü2te
+úü2ve
+úü2vö
+úü2ze
+ú1ű
+úű2ző
+2úvál
+úv2ár
+úvá2rad
+úvá2ral
+úvá2ris
+úvá2rosz
+úvá2r1ó2
+úváru2
+úzae2
+úzaé2
+úzak2
+úza1p2
+úz1arc
+úza1t2r
+ú2z1ál
+ú2záru
+úzás1s
+úz1i2d
+úzido2
+úzót2
+úzó1tr
+úz1p2r
+ú2zs1a2l
+ú2zsál
+2úzse
+úzs1e2c
+2úzsi
+úz3sz
+úz1t2r
+2ü.
+ü1a
+üa2já
+üa2la
+ü1á
+üá2ga
+üá2go
+üá2gu
+üá2ra
+üá2sz
+üb2lo
+ücsö2k1
+ü2des
+1ü2dít
+üd1íz
+ü2d1ör
+üdös3s
+üdőé2
+1ü2dül
+üd2v1a2
+üd2v1el
+üd2v1e2s
+üd2vél
+üd2vid
+üd2v1í
+üd2vo
+1üdvö
+üd2völ
+üd2vő
+üd2vu
+üd2vú
+ü1e
+üe2bé
+üe2ge
+üe2gé
+üe2le
+üe2l1é2
+üe2me
+ü1é
+üé2ke
+üé2pí
+üf2f1ö2
+üfö3le
+üf2ro
+üge1k2
+üge3l
+üg2ra
+ü2gy1a2
+ü2gy1á
+ü2gyef
+ügy1e2lemb
+ügy1e2lemm
+ügy1elf
+ü2gy1ell
+ügy1elm
+ügy1elo
+ügy1éjé
+ügy1ékb
+ügy1éré
+ügy1érr
+ü2gyés
+ü2gyil
+1ü2gyin
+ügy1int
+ügy1ira
+ü3gyí
+1ügynö
+ügy1os
+ü2gy1ő2
+üh1af
+üh1at
+üh1ás
+ü2h1e2le
+üh1elf
+üh1ellen
+ü2h1e2lő
+üh1elv
+ü2h1éh
+ü2h1ér.
+ü2h1in
+ü2h1it
+üh1or
+üh1ős
+ü1i
+üi2gé
+üi2ko
+ü1í
+üí2rá
+ük1a2n
+üka2p
+ük2kal
+ük2ká
+ükke2
+ükkel1
+ük2ker
+ükko2
+ük2kop
+ük1u2n
+ül1ab
+ül1a2d
+ül1ag
+ül1aj
+ül1a2k
+ü2l1a2l
+ül1a2r
+ül1at
+ül1au
+ül1á2c
+ül1á2g
+ül1ál
+ül1á2p
+ül1á2r
+ül1á2s
+ül1br
+ül1d2r
+ü2l1ecse
+ül1e2dz
+ü2l1e2g
+2ülek
+ül1ell
+ü2l1e2lőte
+ül1eng
+ül1enn
+ü2l1e2r
+ül1e2ső
+ületa2
+üle2tal
+üle2t1an
+üle2t1as
+üle2tav
+üle2t1á2
+üle2t1eg
+üle2t1e2l
+üle2t1ék
+üle2t1ér.
+üle2t1érn
+üle2t1é2rő.
+üle2térü
+üle2t1é2ve.
+ületo2
+üle2t1or
+üle2tos
+üle2t1ó2
+üle2t1ö2
+ület1t2
+ül1ette.
+ül1etted
+üle2t1u
+üle2tüz
+ü2l1ex
+ü2l1é2g
+ülé2k1a2
+ülé2k1á2
+ülé2k1e2l
+ülé2kev
+ülé2kir
+ülé2k1o
+ülé2ku
+ü2l1él
+ül1é2pü
+ü2l1ér.
+ü2l1é2ré
+ül1éri
+ül1érj
+ül1érn
+ül1érs
+ü2l1é2rü
+ül1érv
+ü2l1érz
+ülé2sa
+ülé2so
+ülés3s
+ülé2s3zá
+ül1fr
+ü2l1i2d
+üli2g
+ü2l1iga
+ül1ill
+ü2l1im
+ü2l1int
+ül1ira
+ü2l1itt
+ü2l1iz
+ül1íg
+ül1í2r
+ül1í2v
+ül2l1a2n
+ül2l1in
+ül2l1ö2vü
+ül2l1u2
+ül3lyu
+ülnö2k1öl
+ül1o2d
+ül1o2l
+ül1om
+ül1op
+ül1or
+ül1ó2v
+ü2l1öb
+ü2l1ö2l
+ü2l1ömö
+ü2l1ör
+ü2l1ö2v
+ülőe2
+ülőé2l
+ülő1sl
+ülő1s2p
+ülő1sta
+ülőt2
+ül1p2l
+ül1p2r
+ül1sl
+ül1sp
+ül1st
+ül2t1ad
+ültá2r
+1ültetl
+1ültets
+ül2t1e2v
+ül1tra
+ül1ud
+ül1u2g
+ül1u2t
+ül1ús
+ü2l1üg
+ülü2l
+ül1ülé
+ül1ülh
+ül1üli
+ül1ülj
+ül1üln
+ül1ült
+ül1ülv
+ü2l1ür
+ü2l1üt
+ü2l1üv
+ü2lyel
+üly1ess
+üly1esz
+üm1a2l
+üm1a2n
+üm1a2r
+üm1á2r
+üme3gi
+üm1éks
+ü2m1ép
+ü2m1érd
+üm1fl
+üm1fr
+ümi2g
+ü2m1iga
+ü2m1il
+ü2m1im
+ü2m1i2p
+ü2m1is
+ü2m1iz
+üm1kl
+üm1kr
+üm1o2l
+üm1or
+üm1os
+ü2m1öss
+üm1őr
+üm1p2r
+üm1tr
+üm1új
+ü2m1ü2l
+ü2m1üv
+ü2m1üz
+ün1ál
+ün1á2r
+ün1e2l
+üne2t1elet
+üne2tés
+ün1evé
+ü2n1é2p
+ün1id
+ü2n1ing
+ü2n1irt
+1ünnep
+ü1o
+üo2k1i2
+ü1ó
+üó2rá
+ü1ö
+ü1ő
+üő2re
+üp2ri
+üp2ro
+ürdés1s
+1ü2reg
+üre2g1a
+üre2gá
+üreg1g
+1ü2res
+üre2tö
+ü2röm
+ür2t1a
+ür2t1á
+ür2t1e2
+ür2tis
+ür2t1o2
+ürtok1
+ürtü2
+ür2tül
+1ü2rül
+üs2s1a2
+üs2s1á
+üs2s1eg
+üs2s1o2
+üss1s
+üssü2
+üs2s1ül
+üs2t1a2
+üs2tá2
+üst1ág
+üst1ál
+üst1ár
+üs2t1e2
+üst1ég
+üs2t1ék
+üs2tél
+üs2t1ér.
+üs2t1ére
+üs2t1érm
+üs2t1il
+üs2tim
+üs2tir
+üs2t1is
+üs2tí
+üs2t1o2
+üs2t1ó2
+üs2t1ör
+üs2t1ö2v
+üs2t1őr
+üs2t1ős
+üs2t1u2
+üs2tú
+üstű2
+üs2t1űz
+üsz1ál
+üszi2
+ü2sz1iv
+üsz1í2v
+ü2sz1önt
+ü2szür
+üt1ab
+üt1aj
+1ü2teg
+1ü2tem.
+üte2m1a2
+ü2temb
+1ü2teme
+üte2m1el
+ü2teméb
+üte2mért
+üte2min
+ütési2
+üté2sik
+ütés3s
+üté2s3z
+1ütkö
+ütő1s2p
+üt2t1á
+üt2t1é2
+ütty1e2g
+üt2zi
+ü1u
+üu2ta
+ü1ú
+ü1ü
+ü1ű
+üve2g1a2
+üveg3g
+üvezé2r
+1üze2m1a2
+üze2m1á
+üze2meg
+üze2m1érté
+üze2m1étk
+1ü2zemi
+üze2m1o
+ü2zemt
+üze2m1u2
+ü2zemű
+üze2t1a
+üze2t1o
+üzé2ra
+üzé2r1e2l
+1üzlet.
+1üzletn
+2ű.
+ű1a
+űa2da
+űa2dó
+űa2gy
+űa2ka
+űa2la
+űala2g1
+űa2lo
+űa2na
+űa2ny
+űa3nyagoc
+űa2or
+űa2pa
+űa2pá
+űa2ra
+űa2rá
+űa2to
+űa2ut
+űa2va
+űa2xi
+űa2zo
+ű1á
+űá2bé
+űá2ga
+űá2gá
+űá2gy
+űá2hí
+űá2je
+űá2lo
+űá2po
+űá2ra
+űá2ri
+űá2ro
+űá2ru
+űá2sí
+űá2té
+űá2tí
+űba2l1
+űbé2rel
+űb2lo
+űb2ró
+űcsapá2
+űcsa2p1ág
+űcs1as
+ű2cs1ék
+űcs1i2pa
+űd1ál
+ű2d1e2l
+ű1d2rá
+űd2ro
+ű1d2ró
+űd1sk
+ű1e
+űe2cs
+űe2ge
+űe2gé
+űe2gy
+űe2kére
+űe2la
+űe2le
+űe2lé
+űe2l1í2
+űe2lő
+űe2lü
+űe2me
+űe2pi
+űe2po
+űe2re
+űe2rő
+űe2se
+űe2sé
+űe2ső
+űe2te
+űe2ti
+űe2vé
+űe2vő
+ű1é
+űé2le
+űé2lé
+űé2nekb
+űé2neke
+űéne2kest
+űé2neké
+űé2nekr
+űé2pí
+űé2te
+űfa2j1e2
+űf2lo
+űfo2g1a2l
+űf2ra
+űf2ri
+űf2ro
+ű2g1ö2lé
+ű2g1ö2lő.
+űg1ős
+űgő2z
+űg2ra
+űg2rá
+űholda2d
+űhol2d1ada
+ű1i
+űi2do
+űi2ga
+űi2gé
+űi2má
+űi2mi
+űi2pa
+űi2rá
+űi2ro
+űi2sz
+űi2ta
+űi2zé
+űi2zo
+ű1í
+űí2rá
+űí2ri
+űí2ró
+űí2té
+űí2ve
+űí2zü
+űí2zű
+űkia2
+űk2la
+űk2li
+űk2lí
+űk2lo
+űk2rep
+ű1k2ré
+ű1k2ri
+ű1k2ro
+ű1k2ró
+űk2va
+űme2g1
+űn1al
+űn1ar
+űn1ál
+űn1á2r
+űn1e2le
+űn1elh
+űn1e2li
+űn1elk
+űn1e2lő
+űn1elr
+űn1elt
+űn1eml
+űn1e2se
+űn1est
+űne1t2
+ű2n1ér.
+ű2n1érte
+űni2g
+ű2n1iga
+ű2n1in
+ű2n1i2p
+ű2n1i2r
+ű2n1is
+űnme2
+űn3ny
+űn1o2k
+űn1ol
+űn1os
+űn1ó2r
+űn1pr
+űn1s2k
+űn1s2t
+űn1u2n
+űn1u2t
+ű2n1üs
+ű2n1üz
+űn1űz
+ű1o
+űo2dú
+űo2ká
+űo2ko
+űo2la
+űo2rá
+űo2ro
+ű1ó
+űó2ce
+űó2ra
+űó2rá
+űó2ri
+ű1ö
+űö2lő
+űö2rö
+űö2ve
+űö2zö
+ű1ő
+űő2rö
+űp2la
+űp2lü
+űp2ne
+űp2ré
+űp2ri
+űp2rí
+űp2ro
+űp2ró
+űr1ad
+űr1a2l
+űr1a2m
+űr1a2n
+űr1au
+űr1a2v
+űr1áb
+űr1ál
+űr1ás
+űr1áz
+űr1egy
+űr1e2l
+űre2n
+ű2r1e2r
+űr1ex
+ű2r1é2j
+űr1é2l
+űr1ép
+űrés3szer
+űré2sza
+űré2szá
+űré2szí
+űré2szo
+űr1fl
+űr1id
+űri2g
+űr1iga
+ű2r1i2m
+űr1int
+űr1i2p
+űr1ist
+ű2r1ír
+űr1o2d
+ű2r1ol
+űr1o2p
+űr1or
+űros2t1a2
+űr1ot
+űr1ón
+ű2r1ö2l
+űr1ör
+űrő1f2
+űr1pl
+űr1pr
+űr1p2s
+űr1s2p
+űr1s2t
+űrszt2
+űr1tra
+űr1uj
+űr1un
+űr1u2t
+űr1út
+űr1üg
+űr1üz
+ű2s1ajtó
+űs1ál
+űsé2g1el
+ű2s1ín.
+ű2s1í2r
+ű1s2ka
+ű1s2ká
+űso2rad
+űso2raj
+űso2ral
+űso2ran
+űso2rál
+űso2rosz
+űsor1s
+űsort2
+űs2pe
+űs2pi
+űs2po
+űsp2r
+űs2rá
+űs3sz
+ű1s2ta
+ű1s2tí
+ű1s2to
+űst2r
+űs1tro
+ű2s1uj
+ű2s1ü2t
+űsze2r1á
+űsze2r1e2le
+űszere2p
+űsze2r1epé
+űsze2r1ült
+űsz2k
+űsz2t
+űtés3s
+űtőa2
+űtőe2
+ű1t2ra
+ű1t2rágá
+ű1t2re
+űt2ri
+ű1t2ro
+ű1u
+űu2ga
+űu2ra
+űu2sz
+űu2ta
+űu2tá
+űu2tu
+ű1ú
+űú2ri
+űú2sz
+űú2ti
+űú2to
+ű1ü
+űü2gy
+űü2lé
+űü2rí
+űü2te
+űü2té
+űü2tö
+űü2ve
+űü2vö
+űü2ze
+ű1ű
+űű2ző
+űvé2sz1a
+űvé2sz1á
+űvé2sz1e2l
+űvé2szer
+űvé2szint
+űvé2szo
+űvé2sz1ó2
+űvé2szö
+űvé2szú
+űví2z1
+űvíze2
+ű2z1a2b
+űz1a2d
+űz1a2g
+űz1ak
+űz1a2l
+űzal1e
+űz1a2p
+űz1a2r
+űz1a2s
+űz1a2t
+űz1a2u
+űz1á2g
+ű2z1ál
+ű2z1árb
+ű2z1árj
+űz1átl
+űz1átu
+ű2z1ed
+ű2z1ef
+ű2z1e2l
+ű2z1em
+ű2z1e2r
+űze2s
+ű2z1ese
+ű2z1esé
+ű2z1est
+ű2z1esz
+űze2teg
+űze2tel
+ű2z1e2v
+ű2z1ég
+ű2z1é2l
+ű2z1érm
+ű2z1érté
+ű2z1érz
+ű2z1ész
+űz1fr
+űz1gl
+űz1g2r
+űzi2g
+ű2z1iga
+űzigaz1
+ű2z1igé
+ű2z1i2m
+ű2z1i2r
+űz1isk
+űz1ism
+űz1ist
+űz1i2sz
+ű2z1iz
+űz1ín
+űz1ír
+űz1í2v
+űz1kl
+űz1kr
+űz1o2k
+űz1o2l
+ű3zom
+űz1on
+űz1op
+űz1or
+űz1os
+ű2z1óc
+ű2z1ó2r
+ű2z1ö2kö
+űzöl2d1el
+ű2z1ö2v
+ű2z1öz
+űzőa2
+űzőe2
+ű2z1őr.
+űz1ő2rei
+ű2z1ő2ri
+űz1őrk
+űz1őrm
+ű2z1őrn
+ű2z1ő2rö
+ű2z1őrr
+ű2z1őrs
+ű2z1őrt
+űz1őrz
+űz1p2r
+űz3sa
+ű2zsám
+ű2z3sár
+ű2z3sáv
+ű2z3ser
+ű2z3sé
+ű2z3só
+ű2z3sö
+űz3s2p
+ű2z3suga
+űz3sü
+ű2z3sű
+űz3sz
+űz1t2r
+ű2z1ug
+űz1úr
+űz1út
+ű2z1ü2g
+ű2z1ül
+űz1ünn
+ű2z1üt
+űz3zs
+2v.
+1va
+vaa2d
+vaát1
+vaáta2
+2v1abl
+va1bra
+v1abs
+vacs1ala
+va2cs1an
+va2csap
+va2csál
+va2cs1ü2
+vacs3z
+2v1a2dag
+va2d1aj
+va2dalé
+2v1adap
+va2d1asz
+v1a2data
+v1a2datb
+v1a2datk
+v1a2dato
+v1a2datr
+va2daz
+va2d1ál
+va2deg
+va2d1e2l
+va2den
+va2dep
+va2d1e2r
+va2d1e2t
+va2dél
+vad1éte
+va2dib
+va2d1id
+va2d1ir
+va2d1i2t
+va2d1ír
+va2d1ol
+2vadom
+va2dóh
+va2dói
+v1a2dój
+va2dór
+v1a2dóu
+va2d1ör
+va2d1ő2
+va2d1ú
+va2dű
+va2dza
+va2dzá
+va2dze
+vaé2r
+va2g1as
+va2gav
+va2gás
+va2g1e2
+va2g1é2n
+vag1g
+va2gid
+va1gle
+va2g1o2ku
+va2goli
+vag1ost
+va2g1osz
+va2g1ura
+va2gú
+2v1a2gyú
+va2j1ar
+va2j1ác
+va2j1á2ro
+va2j1e2g
+va2jí
+va2j1ol
+va2j1ó2s
+va2jö
+va2jü
+2va2kad
+vak1a2dá
+va2k1aj
+vak1akn
+vak1apá
+vak1árn
+va2k1ás
+va2k1át
+va2keg
+va2kem
+va2k1érté
+va2kis
+va2k1ír
+va2k1ó2s
+va1krí
+vak1t2
+2vakti
+2v1aktu
+2vakup
+va2k1út
+va2lac
+va2laku
+va2lap.
+va2lapí
+va2lapú
+vallás1s
+2v1amp
+2v1a2nal
+va2n1e2g
+vane2m
+van1eme
+va2n1es
+vané2v
+van1éve
+van1évi
+2vang
+van3n
+va2nol
+va2nó
+2v1a2nyá
+2v1a2nyó
+va1p2l
+va2pos
+va1p2r
+2v1a2pu
+va2r1ab
+vara2c
+var1acé
+va2r1a2d
+var1ajt
+var1akt
+va2r1al
+va2rany
+var1a2nya
+va2r1a2p
+va2r1a2r
+va2r1assz
+va2r1at
+va2r1av
+va2rág
+va2r1ál
+2v1a2rány
+va2r1ászn
+var1áta
+va2r1átf
+va2r1átm
+va2r1á2to
+va2r1á2zá
+varca2
+var2cag
+var2cal
+var2can
+varc1c
+var2c3ho
+va2r1es
+va2r1e2t
+va2rev
+va2rég
+var1ék.
+var1éks
+va2r1é2l
+va2rép
+va2r1éré
+va2rid
+va2r1i2ko
+va2r1ikr
+va2r1ill
+va2rim
+var1inf
+var1ink
+va2r1inv
+va2r1i2p
+var1isk
+var1ism
+va2rí
+var2k1an
+var1k2b
+var1k2j
+var1k2ká
+var1kl
+va2r1okm
+var1old
+va2rop
+va2ror
+va2rön
+va2rő
+vars2
+varsz2
+var2t1i2n
+var2tor
+vartó2
+var2t1ór
+va2r1ut
+va2r1út
+va2r1ü2
+va2rű
+vas1abl
+va2sag
+va2s1aj
+vas1arc
+vas1asz
+va2s1ábr
+va2s1ál
+va2s1árl
+va2sek
+va2s1e2l
+va2sem
+va2s1e2r
+va2set
+va2s1ék.
+vas1ékk
+va2s1ékn
+vas1ékt
+vasé2r
+va2s1ére
+va2s1érté
+va2s1érv
+vasfélé2v
+va2sid
+va2s1i2na.
+va2s1ing
+va2s1i2s
+va2s1iz
+va2s1ön
+va2ső
+vas3sze
+vas3szi
+vas3sző
+vast2
+vas1tró
+va2sus
+va2s1ü2t
+va2sű
+vasz1e2l
+va2szis
+va2t1a2d
+va2t1aj
+va2tau
+va2t1ál
+va2t1á2ru
+va2t1e2v
+va2t1ék
+va2tél
+va2t1érte
+va2t1é2te
+va2t1id
+va2tim
+vat1inf
+vat1ing
+va2t1is
+va2t1ír
+vatmo1
+vatmosz2
+va2t1okm
+va2t1old
+va2t1ö2v
+vatő2
+va2t1őr
+vatt2
+2vattako
+va2t1ur
+2v1a2uk
+vau2n
+vaza2t1e
+2v1a2zon
+1vá
+váb2baj
+váb2b1as
+váb2b1e2
+váb2b1é
+váb2bil
+váb2bol
+váb2bos
+váb2bő
+váb2bu
+2vábr
+vá2c3h
+vá2cs1a2p
+vá2cse
+vá2cs1ék
+vá2csip
+vá2cs1is
+vá2cső
+vá2csú
+vá2csü
+vács3z
+vá2d1al
+vá2d1a2n
+váde2
+vá2des
+vádé2
+vá2dén
+vá2dik
+vá2d1ir
+vá2d1or
+vá2dö
+vá2dü
+2v1á2gaz
+2v1ágr
+vá2gú
+vá2gyal
+vá2gyan
+vá2gyö
+vá2győ
+vá2k1e
+vá2k1ü
+vá2laj
+vá2l1a2l
+vála2n
+vá2l1any
+vá2l1ap
+vá2lar
+vála2szin
+vá2l1á2r
+vá2l1át
+vá2l1e2
+vá2lél
+vá2lid
+vá2lin
+vá2lir
+vá2lism
+2v1állás
+vál2l1e2
+2v1állom
+2v1álló
+vál2l1ö2
+vá2lú
+vá2lü
+váma2
+vá2m1ad
+vá2m1aj
+vá2m1ak
+vá2m1al
+vá2m1as
+vá2mau
+vá2m1á2
+vám1b2
+vá2m1e2
+vá2m1ér.
+vá2m1érté
+vá2mil
+vá2m1in
+vá2m1ir
+vá2mis
+vá2mí
+vá2m1or
+vá2mö
+vá2mő
+vámu2
+vá2m1ut
+vá2mü
+vá2naj
+vána2n
+ván1any
+vá2n1e
+vá2nis
+váns3s
+vá2n1ú
+vá2nü
+ványa2d
+vá2nyaj
+vá2ny1a2l
+ványa2n
+vá2nyany
+vá2ny1ap
+vá2nyar
+vá2ny1as
+vá2nyau
+vá2nyaz
+vá2ny1e2
+vá2ny1ér.
+vá2nyérd
+vá2nyérr
+vá2nyérv
+vá2nyérz
+vá2ny1ing
+vá2nyis
+vány1í2r
+vá2ny1ó2
+vá2nyö
+vá2po
+vár1a2dato
+vá2radá
+vá2r1a2dó
+vá2r1a2du
+vára2l
+vá2r1ala
+vár1ale
+vá2raml
+vára2n
+vá2r1any
+vá2r1ar
+vá2r1assz
+vá2r1a2sz
+vá2rág
+vá2r1ál
+várd2
+vá2r1e2
+vár1isk
+vár1ism
+vár1ist
+vá2rí
+vár1old
+vá2r1oml
+vá2r1ont
+váro2sz
+vár1oszt
+vá2r1ó2né
+vá2rö
+vá2rő
+várs2
+vár1sp
+vár1sr
+vár2t1es
+vár2t1ér.
+2váru.
+vá2ruh
+vár1u2r
+vár1usz
+vár1ut
+várú2
+vá2rús
+vá2rü
+vá2s1a2d
+vá2sam
+vá2saz
+vásár1a2d
+vá2s1e
+vási2k
+vás1iko
+vá2sis
+vá2sír
+váskész1
+vásó2
+vást2
+vás1tr
+vá2s1ü
+vá2sű
+vá2szan
+vá2s3zav
+vá2sz1e
+vá2szin
+váta2
+vá2t1al
+2v1átd
+2v1á2t1e2r
+2v1átfe
+vá2t1ir
+2v1á2tí
+v1átlé
+2v1átm
+2v1á2t1ö
+2v1átp
+2v1á2tü
+2v1átv
+vá2z1alj
+vá2z1alt
+vá2z1a2tom
+vá2z1a2v
+vá2z1e2
+vázi1s2
+vá2ziz
+vá2zí
+vá2zos
+vá2zö
+vá2ző
+vá2z3sa
+vá2z3sá
+váz3se
+vá2z3sé
+váz3sö
+vá2z3su
+váz3sz
+vá2zü
+vb2lo
+vb2ra
+vcsőé2ne
+vd2rá
+1ve
+vea2g
+vea2l
+vea2n
+vea2r
+veá2l
+2vece
+ve2cet
+ve1cl
+ve2cseg
+2vedény
+ve2gab
+ve2gac
+ve2gar
+ve2g1as
+vega2z
+ve2g1á2
+ve2g1eg
+ve2g1e2kéh
+ve2g1ell
+vege2lőké
+ve2g1elr
+ve2g1e2r
+ve2g1esem
+ve2g1esz
+ve2g1e2tet
+ve2g1ék
+ve2g1él
+ve2g1ép
+veg1éré
+veg1érte
+veg1érv
+vegés3s
+vegé2sz
+vegg2
+veg1gr
+ve2gid
+ve2gik
+ve2gim
+ve2gí
+ve2gol
+ve2gor
+ve2g1ó2
+ve2g1ö2
+ve2g1u
+ve2gú
+ve2gyelem
+ve2gyemb
+ve2gyez
+2v1egyl
+2vegyv
+ve2k1ak
+2v1e2ke.
+2v1e2kei
+2vekéb
+ve2kébő
+2v1e2kék
+2v1e2kés
+ve1klu
+2vela
+2v1e2lef
+2v1e2lemz
+vele2t1e2l
+2v1e2lég
+velés3s
+2v1elf
+v1elgy
+2v1elha
+2v1elhel
+ve2lis
+2v1e2l1í2
+v1eljá
+2v1elm
+ve2los
+2v1e2lőirá
+2v1e2lőí
+2velőkés
+2v1előleg
+2v1elr
+2v1elsa
+2v1elszá
+2v1elszo
+2v1eltá
+2v1elter
+2v1eltér
+2v1elto
+2v1elv.
+2v1elvá
+2v1elvek
+ve2lyö
+ve2lyu
+2v1elz
+2v1embó
+2v1e2mel
+2v1eml
+2v1e2mu
+ve2n1ad
+ve2nau
+ve2n1á
+ve2n1e2g
+ve2n1e2l
+ve2n1esz
+ve2n1é2vi
+ven1f2
+ven1g2
+ven3k2
+ve2n1o
+ve2n1ó2
+ve2nö
+ventü2
+ven2t1ül
+ven1ülé
+ve2nyö
+2v1enz
+veó2r
+ve2ör
+ve2pe
+ve1p2r
+ve2rab
+ve2r1a2c
+ve2r1a2d
+ve2r1a2g
+ve2rajá
+vera2l
+vera2n
+ve2r1a2r
+ve2r1au
+ve2raz
+ve2r1ág
+ve2r1ál
+2verdő
+ver1egy
+ve2r1e2h
+ve2r1e2ke.
+ve2rekl
+ve2r1e2l
+ve2r1eng
+ve2r1er
+ve2r1e2ső
+ve2r1esz
+ve2r1é2l
+ver1g2
+ve2r1iga
+ve2r1ill
+ve2rim
+ve2r1inc
+ve2rind
+ve2r1inf
+ve2r1ing
+ver1inte
+ver1ipa
+ve2ris
+ve2r1ol
+ve2ror
+ve2ró
+ver1ó2r
+ve2rö
+ver1p2
+ver2s1al
+ver2sár
+versé2g
+ver2s1égé
+ver2s1égg
+ver2s1égn
+ver2s1égt
+ver2sir
+ver2s1í2
+ver2só
+vers3s
+ver2s1üt
+vers3zár
+vers3zen
+ver1tra
+ve2rur
+ve2r1ut
+ve2rút
+ve2r1ü2g
+ve2san
+ve2sas
+ve2s1ál
+ve2s1e2kétő
+veset2
+2v1e2sett
+ve2sip
+ve2sis
+ve2s1íz
+ve1ská
+2v1e2ső
+ve1s2pe
+ves3sza
+ves3szer
+vest2
+ve2s1u2
+2v1e2sze.
+2v1e2szekn
+2v1eszm
+2v1e2szű
+veta2l
+ve2tas
+ve2tál
+ve2t1á2r
+vet1egy
+ve2t1e2lől
+ve2tég
+ve2t1é2k
+ve2tid
+2v1e2tika
+v1e2tim
+ve2t1ing
+ve2t1ol
+ve2t1öl
+ve2töv
+vetőé2
+ve2tur
+ve2t1ut
+ve2t1ű2z
+ve2vet
+2v1e2vo
+vezőe2r
+vezőkész1
+vező2sorr
+vezős1s
+2v1ezr
+1vé
+véá2g
+2v1ébr
+vé2dak
+véda2l
+vé2d1as
+vé2dá
+vé2d1emb
+vé2dos
+vé2dóv
+vé2dö
+vé2dú
+vé2dz
+vé1f2r
+véga2
+vé2gab
+vé2gak
+vé2gal
+vé2g1á2
+vé2g1eg
+vé2g1e2le
+vé2g1elg
+vé2g1elh
+vé2g1eli
+vé2g1ell
+vé2g1els
+vé2g1elv
+vég2em
+vége2n
+vé2g1eny
+vé2g1ep
+vé2g1er
+vé2g1esem
+vé2g1e2sete
+vé2geté
+vé2gető
+vé2g1ér.
+vé2g1é2ren
+vé2g1é2ré
+vé2g1érr
+vég1érv
+vég3g
+2véghü
+vé2g1id
+végigaz1
+vé2gim
+vé2giz
+vé2g1í
+végkötés1
+vé2gol
+vé2g1ó2
+vé2gö
+vé2gú
+2v1éh.
+2v1é2he.
+2v1é2hen
+2v1é2hes
+2v1éhs
+vé2kei
+vé2kít
+vé1k2l
+vé1k2ré
+vé1k2ri
+2v1éks
+vé2kük
+vé2l1a2
+vé2láb
+vé2lál
+vé2l1ár
+vé2leg
+vél1ell
+vél1els
+vél1elt
+vél1emb
+vé2l1eme
+vé2l1e2r
+vé2les
+vél1ess
+vél1est
+vé2lev
+vé2lez
+vé2l1é2k
+vé2lin
+vé2lir
+vé2lí
+vé2los
+vé2lői
+vé2lős
+véltá2v
+vé2l1u
+vé2lú
+vé2lű
+véna1p
+2vénekl
+vé2n1emb
+vé2ny1eg
+vénye2l
+vény1ele
+vény1els
+vé2nyid
+vé2nyis
+vé2ny1í
+vé2nyú
+vényü2l
+vé2ny1ülé
+vé2ny1ült
+2v1é2pí
+vé1p2l
+vé1p2r
+2v1é2pü
+vé2ral
+vé2r1a2n
+vé2rap
+vé2rar
+vé2raz
+vé2r1ár
+vé2rát
+vér1d2
+vé2r1e2l
+vér1eml
+véres3s
+vér1eti
+vé2rés
+vér1ész
+vér1éte
+vér1ikr
+vé2rir
+vé2r1o2k
+vé2rot
+vé2róv
+vér1s
+vértes1s
+vér2t1ón.
+vér2töv
+véru2
+vé2rug
+vé2rut
+vé2r1ú
+vérü2kü
+2v1érzet.
+vé2sak
+vé2sal
+vé2seg
+vése2l
+vés1ele
+vés1elt
+vé2s1er
+vé2só
+vé1s2pe
+vés3szer
+vés2táb
+vé2s1ü2v
+vés3zav
+vész1á2r
+vé2szeg
+vész1ell
+vé2sz1ékn
+vé2sz1ő2
+vész3s
+vé2szu
+vészú2
+vész1úr
+vészü2l
+vész1ülé
+vét1est
+2v1év.
+vé3va
+2v1évb
+2vévei
+2v1é2vek
+2v1é2ven
+2v1é2véé
+2v1é2vér
+vé2vi.
+2v1évr
+2v1évt
+2v1é2vü
+vfe2l1em
+vf2ra
+vf2re
+vf2ri
+vf2ro
+vge2o
+vg2ra
+vg2rá
+vhang2a3
+vhez1
+1vi
+vi2aa
+vi2ab
+vi2ac
+vi2aé
+vi2ag
+via2p
+via2szal
+via2sz1ál
+via2sz1árn
+via2sz1em
+viaszé2
+via2szél
+via2szö
+viára2
+viár1ad
+vic2c1a
+2vické
+vi2csag
+vi2csal
+vi2cs1an
+vi2cs1as
+vi2csál
+vi2cs1e2l
+vi2cs1ér.
+vi2csérté
+vicsi2
+vi2csim
+vi2csip
+vi2cs1ö2
+vi2csú
+vics3z
+vi2deg
+vi2d1esz
+2vidéz
+2v1i2dő
+vi2dz
+vi2ew
+2v1i2gaz
+2v1i2gén
+vika2
+vi2k1ag
+vi2k1el
+vi2kon
+vi2l1ék
+villa1s
+villasz2
+2villu
+vi2má
+2v1imm
+vina1t2
+2vind
+vi2n1emb
+vi2n1ó
+vin2tess
+vin2tesz
+2vinté
+vin2tos
+2v1i2on
+2vipa
+vi1p2s
+2v1i2rat.
+2v1i2ratot
+2viratoz.
+2v1i2rod
+visa2
+vi2sal
+vi2s1au
+vi2s1á2g
+vi2ser
+vi2s1ék
+vi2sim
+vi2s1is
+vi2siz
+vi2sö
+vi2szár
+vi2szok
+vit2a
+vi3tad
+vitakész1
+2vital
+vitelő2
+2vitn
+vi2t1ú
+vi2zeg
+vi2z1ell
+viz1é2l
+vi2zin
+vi2zok
+vi2zol
+vi2zom
+viz1os
+vi2zsá
+viz3sz
+vi2zud
+vi2zú
+1ví
+vídi2
+ví2ge
+ví2ny
+vínyenc1
+2v1í2ra
+2v1í2rá
+2v1í2ró
+2vítélet.
+v2í3téletb
+2vítélete
+2v1ívb
+vívókész1
+ví2z1a2
+ví2zá
+ví2zel
+víz1e2le
+víz1elf
+víz1elh
+víz1ell
+víz1eln
+víz1elő
+víz1elp
+víz1els
+víz1elt
+víz1elv
+víze2m
+víz1emb
+víz1eme
+víz1emé
+ví2zék
+ví2zés
+ví2z1ing
+vízi1sk
+ví2z1ist
+ví2z1isz
+ví2zí
+ví2z1o
+ví2z1ó2
+ví2zö
+ví2z1ő2
+ví2z3s2
+ví2zú
+vízü2
+2v1í2zű
+víz3z
+vjára2t1út
+vje2gya
+vje2tel
+vje2tu
+vkia2l
+vkiá2
+vk2li
+vk2ló
+vk2lu
+vk2ri
+vk2rí
+vk2ró
+vla2te
+vleí2
+vleü2
+vme2g1
+vna2p1in
+1vo
+vo2il
+vo2ji
+vo2kí
+2v1okm
+voks3s
+2v1okta
+vola1t
+2v1oldá
+2v1oldó.
+vol2t1a2d
+vome2
+vomec3
+vona2l1e2
+vona2t1e
+vonás1s
+voná2s3z
+vo2od
+vo2pe
+vo2r1a2
+vo2r1in
+2v1orm
+vo2s1as
+vo2s1av
+vo2s1e
+vos3s2
+vo2s1ú
+vo2sü
+vo2uc
+vo2vá
+vo2xi
+1vó
+vóa2k
+vóá2g
+vóá2r
+vócsa2p1á2
+vó1d2re
+vó1f2r
+vó1k2l
+2v1ónn
+vóó2r
+vó1p2l
+vó1p2r
+vó2ran
+vó2rák
+vó2rán
+vó2rát
+vó2s1akk
+vó2s1a2l
+vó2seg
+vó2s1iv
+vó2sol
+vó2s1orr
+vó2só
+vó2sö
+vó2ső
+vó1spi
+vós3s
+vós1tr
+vó1sz2
+vósza2k1
+vó2s3zár
+vó2s3zen
+vóta1t2
+vó1t2r
+vóváros1u
+1vö
+vö2bö
+vö2dém
+2v1ö2ko
+völ2gya
+2v1ö2rök
+2v1ötl
+vö2ve
+vö2vé
+2v1özön
+vözőe3
+vö2zs
+1vő
+vőa2n
+vőá2g
+vőe2l
+vőe2r
+vőé2j
+vőé2n
+vő1fl
+vő1f2r
+vői3dejű
+vő1kl
+vőo2l
+vő1pl
+vő1pr
+v1őrm
+v1ő2rü
+vő1s2p
+vő1sta
+vő1str
+vő1t2r
+vőü2l
+vő2zi
+vp2la
+vp2ra
+vp2re
+vp2ré
+vp2ri
+vp2ro
+vp2ró
+vp2sz
+vs2ká
+vs2ki
+vs2ko
+vs2lá
+vs2pe
+vs2ta
+vs2ti
+vs2tí
+vs2to
+vst2r
+vs2tú
+vsz2p
+v1sz2t
+vta2n1á2s
+vta2n1á2to
+vta2n1ó2
+vtá2raj
+vtá2r1ass
+vtá2ris
+vtáró2
+vtá2r1ór
+vtelés1s
+vt2ra
+vt2ré
+vt2ri
+vt2ro
+1vu
+vu2bo
+vu2mal
+vu2man
+vu2m1e2
+vu2mis
+vu2mö
+2v1u2ni
+vu2ra
+vu2ru
+2v1u2tak
+2v1u2tas
+2v1u2tat
+vu2tá
+v1utc
+v1u2tó
+1vú
+vú1fr
+v1újd
+v1ú2jí
+v1újs
+vú2r1ad
+vú2re
+vúré2
+vú2rén
+vú2rö
+vú2szó
+v1útn
+1vü
+vü2gy
+vü2kü
+vü2lá
+2v1üld
+2v1ünn
+vü1pr
+vü2rí
+vü1st
+vü1sz2
+vü2te
+vü2té
+vü2zé
+1vű
+2v1űrl
+vű2ző
+vvágy1ób
+vverés3s
+vzá2r1ó2ra
+2w.
+1wa
+wa2ii
+wa2le
+war2d1i
+wa2re
+wa1s2h
+wa1ye
+wa1yé
+1wá
+1we
+we2b1a2
+we2b1á2
+we2b1ele
+we2b1é
+we2bir
+we2b1o
+we2b1ú
+we2bü
+we2ed
+we2ek
+we2ig
+we2is
+we2le
+we2ör
+1wé
+whi2t
+1wi
+wi2ch
+wi2cz
+1wí
+1wo
+wo2od
+1wó
+1wö
+1wő
+wri2t
+wsto2
+1wu
+1wú
+1wü
+1wű
+wyo2m1
+2x.
+1xa
+x1a2da
+xa2dá
+xaé2d
+xa1fl
+xa1k2l
+2x1akt
+2x1a2la
+2x1alg
+2x1alj
+2x1alk
+xa2na
+x1a2ny
+x1a2rá
+xa2ri
+xa2vi
+1xá
+2x1ábr
+xá2gy
+2x1áll
+xá2rak
+2x1á2ram
+xá2ras
+2x1á2ro
+2x1árr
+2x1á2ru
+2x1átj
+2x1átr
+2x1átv
+xba2l1
+xb2la
+xb2lo
+xb2ra
+xd2ró
+1xe
+x1e2gy
+2x1e2ke.
+xe2l1a
+xe2l1á
+2x1e2lekt
+xe2lel
+xe2l1emb
+2x1e2lemr
+xe2l1esz
+xe2l1in
+xe2l1o
+2x1emel
+2x1eml
+2x1e2rő
+2x1e2sé
+2x1e2zü
+1xé
+2x1éhs
+xé2pí
+2x1ér.
+2x1érte
+2x1érté
+2x1értő
+2x1érz
+2xévei
+xf2re
+xha2u
+1xi
+xia2n
+xi2av
+xi2d1a2l
+2xidá
+xi2dás
+2xi2de
+2xidé
+2xidgá
+xi2d1i2
+2xidjá
+2xidjé
+2xidl
+2xidm
+xi2dol
+xi2dö
+2xi2dő
+xid1őz
+xi1d2ro
+2xidró
+2xids
+2xidu
+2xidv
+2xi2dz
+xi2el
+2x1i2ga
+xigén1n
+2xilc
+2x1ill
+xina2
+xi2n1an
+2x1ind
+xine2
+xi2n1et
+xi2n1i2
+xi2nö
+xi2on
+xi2óc
+xi2óe
+xi2óg
+xi2ómé
+xi2óo
+xi2óö
+xi2óp
+xió2rá
+2x1i2rá
+2x1i2ro
+xi2sad
+xi2sal
+xise2
+xi2s1el
+xi2s1es
+xi1s2ká
+xis1p
+xis3s
+xi2s1ü
+xi2t1e2g
+xi2t1e2r
+xi2t1é
+xi2t1i2
+xi2t1ü2
+1xí
+xí2ja
+xí2já
+xí2jo
+xí2ju
+x1í2rá
+xí2ró
+2x1ívn
+2x1í2vü
+2x1ívv
+1xo
+2x1old
+xo2n1ai
+xo2n1al
+xo2n1e
+xo2pe
+xo1p2l
+2x1osz
+1xó
+1xö
+xö2dé
+xö2rö
+xö2zö
+1xő
+xő2sé
+xp2la
+xpor2t1a2
+xpor2t1á2r
+xpor2t1e2
+xpor2t1érd
+xpor2t1ü2
+xp2ri
+x1p2ro
+x1p2ró
+xs2ká
+xs2pe
+xs2ta
+xst2r
+x2t1e2d
+xti2la
+xti2lá
+xti2leg
+xti2lin
+xti2lis
+xti2l1o
+xt1ört
+1xu
+xu2sad
+xu2sal
+xu2s1a2n
+xu2s1e
+xu2s1érté
+xusi2
+xu2sil
+xu2sim
+xu2sin
+xu2sit
+xu2s1ol
+xu2s1ó2
+xu2s1ö2
+xus3s
+xust2
+xus1tr
+xu2sus
+xusú2
+xu2s1út
+xu2sü
+xu2s1ű
+xu2s3z
+xu2ta
+1xú
+1xü
+xü2lé
+xü2ve
+xü2ze
+1xű
+2y.
+yaa2d
+y1abla
+y1a2bon
+y1abra
+ya1bri
+y1abs
+ya2cél.
+ya2dako
+ya2dalé
+y1adap
+y1a2data
+y1a2datb
+ya2dati
+y1a2dato
+ya2datu
+yadé2ki
+ya2d1és
+ya2dév
+y1admi
+ya2dóan
+ya2dóbó
+ya2dóé
+y1a2dói
+y1a2dój
+ya2dóké
+ya2dókt
+y1a2dóm
+ya2dóná
+y1a2dór
+y1a2dós
+y1a2dóu
+yae2r
+ya2ero
+yae2t
+yaé2r
+y1aff
+ya1f2r
+ya2g1a2d
+ya2g1ag
+ya2g1am
+ya2gan
+y1aganc
+ya2g1a2s
+ya2g1atl
+ya2g1ato
+ya2gau
+yaga2z
+yag1azo
+ya2g1áll
+yag1árá
+yag1árb
+yag1á2ré
+yag1árh
+yag1ári
+yag1árj
+yag1árk
+yag1á2ro
+yag1árra.
+yag1árs
+yag1árt
+ya2gás
+yag1át1a2
+ya2g1átf
+ya2g1átl
+ya2g1átr
+yag1d2
+ya2gec
+ya2g1el
+ya2g1es
+ya2g1é2g
+ya2gék
+y1aggr
+yag3gyú
+ya2gid
+ya2gim
+ya2g1io
+yag1isz
+ya2giz
+ya2gí
+ya2g1osz
+ya2g1ó2r
+ya2gő
+yag1s
+ya2gur
+ya2g1ut
+y1agy.
+y1a2gyat
+y1agyb
+y1agyf
+y1agyk
+y1a2gyon
+y1agyr
+y1a2jak
+y1a2ján
+y1ajk
+y1ajt
+y1akadá
+ya2k1áll
+ya2k1átk
+ya2k1átm
+yak1elm
+yak1elt
+yak1ékn
+ya2k1ér.
+ya2k1éri
+yak1i2zo
+ya1klu
+y1akna.
+y1aknák
+ya1kné
+y1a2kol.
+ya2k1ola
+ya2k1old
+ya2k1ón
+y1a2kós
+ya2k1örv
+ya1k2rém
+ya1kri
+ya1krí
+y1akt.
+y1akták
+y1aktb
+y1aktiv
+y1aktj
+y1aktot
+y1aktu
+yala2g1ú
+ya2l1agy
+yal1ajk
+ya2lakb
+y1a2lakj
+y1a2lakk
+y1a2lakok
+y1a2lakom
+y1a2lakot
+ya2lakt
+ya2laku
+y1alakz
+ya2l1a2l
+y1alany
+ya2lapa
+y1a2lapí
+ya2lapjá
+y1a2lapú
+yala2te
+yal1ága
+ya2l1ál
+yalás1s
+y1aláté
+ya2l1é2ne
+ya2lif
+yal1i2ko
+ya2l1inv
+y1aljai
+y1alji
+ya2lor
+yalókész1
+ya2l1órá
+ya2l1ő2
+y2alta
+yal1t2r
+y1altú
+ya2lü
+ya2lű
+y1amalg
+ya2m1any
+yam1a2rár
+yama2tal
+ya2m1árb
+ya2m1árn
+yamászás1
+ya2m1á2to
+yam1b2
+yam1emb
+yam1esés
+yami2k
+ya2m1iko
+ya2mind
+ya2m1i2o
+ya2m1is
+ya2m1osz
+ya2m1ó2r
+ya2mö
+ya2mő
+ya2mü
+y1a2nal
+ya2nan
+ya2nar
+yan1arr
+ya2nat
+yan1att
+ya2n3e.
+ya2n1e2g
+ya2nek
+ya2ner
+ya2n1et
+ya2nez
+y1a2ném
+y1ang
+ya2nid
+ya2n1in
+ya2n1is
+ya2nit
+y1a2niz
+y1anny
+yano2d
+yan1oda
+yan1onn
+ya2nő.
+ya2nyas
+y1anyj
+y1a2nyó
+y1a2nyuk
+yaó2r
+y1a2pa.
+y1a2pai
+y1a2pas
+y1a2páb
+y1a2pád
+y1a2páé
+y1a2pái
+y1a2pák
+y1a2pám
+y1a2pára
+y1a2páró
+y1a2pát.
+y1a2páto
+y1a2pátó
+y1a2páv
+y1a2pi.
+y1apjáh
+y1apjái
+y1apju
+ya1p2l
+ya2post
+yapo2tá
+y1a2pó.
+y1a2póé
+y1a2póh
+y1a2pói
+y1a2pój
+ya2póké
+ya2póna
+y1a2pós
+ya2pót.
+ya2pótó
+y1a2póv
+y1app
+ya1pre
+ya1p2ri
+y1aprí
+ya1pro
+ya2r1a2dá
+ya2r1a2dó
+ya2r1a2du
+ya2rasz
+ya2ránn
+y1a2rány
+ya2r1átv
+y1arc.
+y1arca
+y1arcá
+y1arcb
+y1arcc
+y1arch
+y1arck
+y1arcn
+y1arco
+y1arcr
+y1arcu
+y1arcú
+1yard.
+1yardn
+3yardom
+1yardos
+yar1drá
+yar1ell
+ya2roma
+ya2ror
+yar1ó2rá
+yar1óvá
+ya2róz
+yar1s2
+yas1alj
+ya2sap
+ya2s1as
+yaság1g
+ya1sl
+ya1sne
+ya1s2pi
+ya1s2po
+ya1s2rá
+yast2
+ya1s2ta
+ya1sto
+ya1str
+ya1svi
+yasz2tár
+y1a2tád
+yatékát1a2
+y1atka.
+y1atká
+ya2tomh
+y1a2tomm
+y1a2tomo
+yat2rág
+ya1tré
+ya1tróf
+y1attr
+y1a2ty
+y1a2uk
+y1a2ulá
+yau2tá
+y1a2uto
+y1autó
+yautói2ko
+yaü2t
+yaü2z
+y1a2vat
+y1a2zon
+y1a2zúr
+y1á2bé
+y1ábr
+yá2ga
+yá2gá
+yá2gé
+yá2gi
+yá2go
+yá2gu
+yá2gú
+yá2gy
+yá2jal
+yá2j1e
+yá2j1ö
+yá2jő
+yáka2
+yá2k1an
+yá2k1á
+yá2k1e
+yá2kü
+yálas3s
+yá2lál
+y1áldo
+yá2l1e
+y1állam
+y1állat
+y1állás
+y1állí
+y1állo
+y1álló
+y1állv
+yá2lü
+yáma2
+yá2m1al
+yá2m1an
+yá2m1ap
+yá2m1as
+yámi2
+yá2m1in
+yá2mü
+yá2n1e
+yá2nék
+yán3n
+yá2nö
+yánt2
+yán1tr
+yá2nü
+yá1ny2
+y1á2po
+yá2r1a2l
+y1á2raml
+y1á2ramo
+yára2n
+yár1any
+yá2rap
+yá2rar
+yá2r1ass
+yá2r1av
+yá2raz
+y1árazá
+yár1azo
+yá2r1ál
+y1árbev
+yár1d2
+yá2r1e2
+y1árem
+yá2réj
+y1á2riá
+yá2rim
+yá2r1is
+y1árnya
+yáró2
+yá2rór
+yá2rö
+yá2rő
+y1árpá
+yár2sé
+y2árt.
+y1ártám
+yár1tr
+y1á2ruh
+y1árur
+yá2rú2
+y1árú.
+yá2rü
+y1árva
+y1árver
+yá2sal
+yá2sas
+yá2s1á2g
+yá2s1á2rá
+yá2s1árt
+y1á2sás
+yá2se
+yáská2
+y1á2só
+yá2sö
+yá2szab
+yá2szag
+yá2szal
+yá2szas
+yá2sz1ál
+yá2sze
+yász1el
+yász1em
+yás3zen
+yá2szét
+yá2szév
+yá2szim
+yá2szin
+yá2szis
+yá2szit
+yász1ó2d
+yász1ó2r
+yá2sz1ö2
+yá2sző
+yá2sz1ü2
+y1á2ta
+yát1a2l
+y1á2tá
+y1átb
+y1á2t1e2
+y1á2té
+y1átf
+y1áth
+y1á2t1i2
+y1átk
+y1átlag
+y1átlá
+y1átlé
+y1átm
+y1átn
+y1á2t1ö
+y1átp
+y1átr
+y1áts
+y1átt
+y1á2tü
+y1átv
+ybeá2
+yb2la
+yb2le
+yb2lé
+yb2li
+yb2lo
+yb2lú
+yb2ra
+yb2ri
+yb2ro
+yb2ró
+ycsa2p1á2g
+ycsőé2
+yc2vi
+yd2be
+y2desd
+yd2ni
+y1d2ra
+y1d2rá
+yd2ro
+yd2ró
+y1d2ru
+yea2v
+yeá2r
+ye1bl
+y1ecset
+ye2d1á
+ye2deg
+ye2d1esz
+ye2dol
+ye2d1ó2
+ye2d1u2
+ye2d1ú
+ye2d1ü2lő
+yed2vér
+yee2s
+y1eff
+yega2
+ye2g1ala
+ye2gan
+ye2g1az
+ye2g1á2
+ye2g1el
+yeg1e2red
+ye2g1él
+yeg1érbe
+y1egérr
+yegész1
+yeg1észn
+yeg3g2
+ye2gid
+ye2gí
+ye2gú
+ye2g1üg
+ye2gyed
+y1e2gyen
+y1e2gyes
+ye2gyet
+ye2gyez
+y1e2gyé
+y1egyh
+y1egyl
+y1egys
+y1együ
+y1egyv
+yei2g
+y1ejt
+y1e2ke.
+y1e2kei
+y1e2kek
+y1e2kéé
+ye2kéj
+y1e2kés.
+y1e2kése
+ye1k2ré
+y1elad
+y1e2lág
+ye2lál
+y1elc
+y1e2lef
+ye2lege
+ye2l1e2h
+ye2lemek
+y1e2lemez
+y1e2lemű
+y1e2l1e2re
+ye2légt
+ye2l1é2ké
+ye2l1ér.
+yelés3s
+yelé2s3z
+y1elhal
+y1elhel
+y1elhú
+y1e2l1in
+ye2liv
+y1e2l1í2
+y1eljá
+y1elka
+y1elnev
+y1elnö
+y1elny
+ye2los
+y1e2lö
+y1e2lőad
+y1e2lőí
+ye2lőtt
+y1e2lőz
+y1elsa
+y1első
+y1eltér
+y1elto
+y1eltö
+yel2vad
+yel2v1áll
+yel2vás
+yel2v1eg
+yel2v1e2r
+yel2vessz
+yelve2sz
+yelv1esze
+y1elvevé
+yel2véd
+yel2v1ég
+yel2vél
+yel2v1érz
+yel2v1í
+yel2vol
+ye2mak
+ye2m1a2l
+ye2map
+yema2r
+ye2m1at
+ye2mál
+y1ember
+y1e2melé
+y1emelk
+ye2m1er
+y1e2més
+yemi2
+yem1ing
+ye2m1is
+ye2mit
+yem1ita
+ye2miz
+y1emlék
+y1emlí
+y1emlő
+yem1ost
+ye2m1ö
+yem1p2
+yemu2s
+yem1usz
+ye2n1á2
+yen2csa
+yen2c3ser
+ye2n1elj
+ye2n1eln
+ye2n1elv
+y1e2ner
+yenes3s
+ye2n1é2l
+yenfé2l1é2v
+ye2nid
+ye2n1i2p
+yen1k2
+ye2n1o
+ye2n1üg
+yenyá2
+y1enz
+ye2pag
+yep1alo
+ye2p1ará
+ye2p1áll
+ye2pát
+ye2p1e2l
+ye2p1é2k
+y1e2pik
+y1epiz
+ye2pos
+yep2p1e2r
+ye1pro
+yep1t2
+y1erde
+yere2ga
+yere2gete
+yereg1g
+y1e2rej
+yere2k1a
+yere2ká
+yere2k1e2sz
+yere2ko
+yere2k1ö2
+y1e2rény
+y1erké
+y1erkö
+y1erny
+y1e2ro
+ye2rőér
+ye2rőig
+ye2rőné
+ye2rőrő
+ye2rősí
+ye2rőss
+ye2rővá
+yer2s1a
+y1erszé
+ye2sá
+yes1egé
+yes1egy
+ye2s1ej
+yes1e2kétő
+y1esemén
+ye2s1er
+y1e2setb
+y1e2seté
+y1e2seti
+y1e2setk
+y1e2setr
+y1e2setű
+y1esél
+ye2sip
+ye2s1í2r
+y1esőá
+ye2sőbe
+y1e2sőh
+ye2sője
+ye2sők.
+ye2sőkh
+ye2sőkr
+y1e2sőn
+y1e2sőr
+y1e2sős
+ye2sővé
+ye1s2pe
+yes2t1a2
+y1estés
+y1estév
+y1estjü
+yes2tőr
+y1estű
+y1eszk
+y1eszm
+y1esztét
+y1e2szű
+y1e2tal
+yeteg1ér.
+y1e2tet
+ye2t1ért
+y1e2tik
+y1etn
+y1e2tűd
+ye2vet
+ye2vező
+y1e2vé
+y1e2vol
+y1e2vő
+y1e2zer
+yeze2t1ék
+yezőa2
+yé2b1á
+yé2b1ér.
+yé2b1i2
+yé2bü
+yé2des
+y1égb
+y1é2ge
+y1é2gé
+y1é2gi
+y1é2gő
+y1égt
+y1é2he.
+y1é2hen
+y1é2hes
+y1é2het
+y1éhs
+y1éj.
+y1éjb
+yé2jei
+yé2jen
+yé2jért
+y1é2ji
+y1éjj
+y1éjs
+y1éjt
+yé2kab
+yé2kad
+yé2k1aka
+yé2k1a2l
+y1é2kat
+yé2k1el
+yé2ker
+yé2k1é2k
+yé2k1é2l
+yé2k1ér.
+yé2kik
+yé2k1ó2
+yé2k1ö
+yé2kő
+yé2kúr
+yé2l1á
+yé2le.
+yé2les
+y1é2let
+y1é2lén
+yé2lét
+yé2lim
+yél3l
+yé2lős
+y1élsp
+y1é2lű
+yéná2
+yé2n1ár
+yén1e2ke.
+yé2nel
+yé2n1ikr
+yé2no
+yé2pí
+yé2pü
+yéra2
+yé2r1aj
+yé2r1ak
+yé2ral
+yé2r1an
+yé2rar
+yé2r1á2
+y1érch
+yér1d2
+y1érdek
+yé2reg
+yé2r1e2l
+yé2rem
+y1érem.
+yér1eme
+yé2r1enc
+yér1eső
+y1é2ret
+yé2rev
+y1é2rez
+y1é2rés
+yé2ril
+y1é2rin
+y1érmü
+yé2r1osz
+yéró2
+yé2r1ór
+y1é2rő.
+y1é2rői
+y1é2rők
+y1é2rőt
+y1érpa
+y1érték
+yéru2
+yé2rut
+y1érv.
+y1érvén
+y1érvv
+y1érzet
+y1érzé
+y1érző
+yé2sz1á
+yé2sz1emb
+yé2sz1o
+yé2sz1ú
+yé2t1a
+y1é2tel
+y1é2ter
+yé2tén
+y1étke
+y1étl
+y1év.
+y1évad
+y1évb
+y1é2ve.
+y1é2vek
+y1é2vem
+y1é2ven
+y1é2ves
+y1é2vet
+y1évez
+y1é2véb
+y1é2vén
+y1é2vér
+y1é2vét
+y1é2vév
+y1évf
+y1évh
+y1é2vi
+y1évk
+y1évm
+y1évn
+y1évr
+y1évs
+y1évt
+y1é2vü
+y1é2vű
+y1évv
+yfas2
+yfé2lá
+yf1gl
+yf2la
+yf2le
+yf2li
+yf2lo
+yf2ló
+y2föl.
+yf1ő2sö
+y1f2ra
+yf2ri
+yf2rí
+y1f2ro
+yf2rö
+yg2le
+yg2ló
+ygó1g2
+ygót2
+yg2ra
+yg2rá
+yg2ri
+yg2ró
+yg2ru
+yg2rü
+y2h1a2dó
+yha1p2
+yha1t2r
+yhá2zal
+y2h1elv
+y1i2bo
+y1i2deá
+y1i2deg
+y1i2den
+y1i2deo
+y1i2dé
+y1i2dom
+y1i2dő
+y1i2ga
+y1i2gá
+y1i2géz
+y1igm
+y1i2har
+yi2hat
+y1ihl
+y1i2ker
+yi2k1érn
+yi2kont
+yi1k2ri
+y1i2ma.
+y1i2má
+y1i2mit
+y1imp
+y1i2nas
+y1inc
+y1ind
+y1inf
+y1inga
+yi2nic
+y1inj
+y1ins
+y1inv
+yi2ono
+yi2par
+y1i2ram
+y1i2rat.
+y1i2rata
+yira2t1é
+y1i2ratn
+y1i2rato
+yi2ratt
+y1i2rá
+y1i2ri
+y1i2rod
+y1irr
+y1irt
+y1ish
+y1isko
+y1ism
+y1isp
+y1ist
+y1i2sza
+yi2szel
+yi2szon
+y1i2tal
+y1i2tat
+y1i2var
+y1i2vás
+y1i2vó
+y1i2zé
+y1izg
+y1izm
+yi2zom
+yí2gé
+yí2ja
+yí2já
+yí2ju
+yí2ka
+yí2ká
+yí2ke
+yí2kí
+yí2kol
+yí2k1ö
+yí2la
+yí2l1e2
+yí2lí
+yí2lö
+yí2ral
+yí2ráb
+yír1á2sz
+yí2rog
+yí2rő
+yítőa2
+yí2vá
+yí2ve
+yí2vé
+yí2vó
+yí2vü
+yí2vű
+yí2zü
+yí2zű
+yje2gy1á2
+y2jév
+yjob2b1o
+ykai2
+yka1k2
+yka2ró2ra
+yk2bó
+y2k1e2lem
+yk1é2jév
+yké2p1el
+yk2ho
+ykiá2
+ykie2
+yk1izm
+yk2ka
+yk2la
+yk2le
+yk2li
+yk2lí
+yk2ló
+yk2lu
+yk2ná
+ykóro2
+yk2ra
+y1k2rá
+y1k2ri
+yk2rí
+yk2ro
+yk2ró
+yk2vó
+ylal2ta
+yla2t1a2n
+yla2t1é2t
+ylei2
+yleí2
+yle2tal
+yle2tá
+ylóá2
+ylót2
+yma1d2
+y2mat.
+ymá2s1ik
+yme2g1é
+ym2ma
+yné2vér
+yn2ka
+ynk2r
+ynőé2n
+ynő2ié
+yo2be
+y1obj
+y1o2dú
+yo2gal
+yo2gál
+yo2g1ár
+yo2ge
+yog3g
+yogi2
+yo2git
+yo2g1iv
+yo2gí
+yo2g1osz
+yo2gö
+yo2gü
+yo2gű
+yoka2
+y1o2k1al
+y1o2ká
+y1o2k1ir
+y1okm
+y1o2kol
+y1o2kos
+y1o2koz
+y1okta
+yo2l1a2l
+yola2n
+yol1any
+yo2l1ári
+yol2cem
+yolci2
+yol2cik
+y1oldá
+y1oldó
+y1o2lim
+y1oltás
+yol2ter
+yo2lú
+yo2lü
+yolví2
+yo2m1a2l
+yoma2n
+yo2m1any
+yoma2s
+yo2m1aszó
+yo2maz
+yo2m1ál
+yo2m1árk
+yo2m1á2to
+yo2m1á2z
+yo2m1e
+yo2m1ik
+yo2mil
+yo2m1is
+yo2mí
+yo2m1ol
+yo2mö
+yo2mő
+yom1p2
+yo2n1a2d
+yo2nag
+yo2naj
+yon1a2ka
+yo2n1a2l
+yo2n1am
+yo2n1a2n
+yo2nap
+yo2n1a2r
+yo2n1a2s
+yo2n1a2t
+yo2n1au
+yo2n1ál
+yo2n1át1a2
+yo2n1áté
+yo2n1átj
+yon1átk
+yo2n1átr
+yo2n1áts
+yo2n1átv
+yo2n1á2z
+yon1d2
+yo2n1e2
+yo2néd
+yo2néh
+yo2nék
+yo2nén
+yon1f2
+yo2nim
+yo2n1is
+yon1itt
+yo2niz
+yo2ní
+yon1k2
+yon3n
+yo2n1ol
+yo2nop
+yo2n1osz
+yo2nö
+yo2n1ő2
+yon1s2
+yont2
+yon1tr
+yo2n1ü
+y1o2pe
+y1opt
+yo2rad
+yo2r1a2k
+yo2r1a2p
+y1ord
+y1orgi
+y1orrú
+yor2sol
+y1orsó
+yors3s
+yo2se
+yos3s
+y1osto
+y1oszl
+yos3zs
+y1oszt
+yo2ut
+yo2ve
+yo2xi
+yóá2g
+yóá2r
+yócsa2p1á2
+yó2dák
+y1ó2dár
+y1ó2dásak
+yó1f2l
+yó1g2r
+yó2gyár
+yó2gyi
+yó2gyú
+yóí2v
+yóo2k
+yóó2r
+yó1p2r
+y1ó2rac
+y1ó2rad
+yó2rag
+yó2rai
+y1ó2ras
+y1ó2ráb
+y1ó2rád
+y1ó2ráé
+y1ó2ráh
+y1ó2rái
+y1ó2ráj
+y1ó2rák
+y1ó2rám
+y1ó2rár
+y1ó2rás
+y1ó2rát
+y1ó2ráv
+y1ó2ri
+yó2s1aj
+yóscsa2
+yó2sír
+yó2s1ol
+yó2s1orr
+yós1ors
+yós3s
+yósü2l
+yó2s1ű2
+yö2bö
+yö2bű
+yö2cs
+yö2dém
+yö2ka
+yö2ká
+yö2kel
+yö2k1ék
+yö2kid
+yö2kí
+yö2ko
+yök1os
+yö2kó
+yö2kör
+yö2k1öss
+yö2ku
+yö2lők
+y1öltés
+y1öml
+y1ö2ná
+yön2gya
+yön2gyá
+yön2gyó
+yön2gy1öl
+y1önk
+y1önté
+y1önz
+yö2ra
+y1örd
+yö2rit
+yö2ro
+yö2ru
+yö2so
+y1össz
+y1ösv
+y1öszt
+y1ötl
+y1ö2töd.
+y1ö2töde
+y1ö2tödé
+y1ötp
+y1ött
+y1ötv
+yö2ve
+yö2vé
+yö2vi
+y1ö2vö
+y1ö2zön
+yőa2n
+yő1bl
+yőe2l
+yőe2r
+yő1fr
+yő1pr
+yő2ra
+y1ő2rei
+y1őrg
+y1őrl
+y1őrp
+y1őrszi
+y1ő2rül
+y1őrz
+yő2seg
+yő1str
+yősz2
+yő2s3zár.
+yős3zs
+yő1szt
+yőzőkész1
+ypen1n
+ype2te
+yp2la
+yp2le
+yp2lé
+yp2lu
+yponté2
+yp2ra
+yp2re
+yp2ré
+yp2ri
+yp2rí
+yp2ro
+yp2ró
+y2prő
+yp2ru
+yp2sz
+yrádi2ón
+yrágás1
+yrea2
+yren2d1ő2
+yreu2
+ysa2van
+yság1g
+ys2ch
+ysé2g1e2l
+ysé2gés
+ys2ho
+ys2ka
+ys2ká
+ys2ki
+ys2la
+ys2lá
+ys2le
+ys2lu
+ys2mi
+ys2na
+ys2ni
+ys2pe
+ys2pi
+ys2po
+ys2pó
+ysp2r
+ys2ra
+ys2rá
+ys2rő
+ys2sa
+ys2sá
+ys2se
+y1s2tí
+y1s2to
+y1s2tó
+y1st2r
+y1s2tu
+y1s2tú
+ys2tü
+ysza2k1ü
+y2szaló
+y2száld
+yszáraz1
+ysze2ra
+yszer2v1ó2
+y1sz2f
+y1sz2k
+y1sz2l
+y1sz2m
+yszö2g1el
+y1sz2p
+y1sz2t
+y1sz2v
+yta2c
+yt1acé
+yta2n1é
+yta2n1ó2
+ytá2l1é2
+y2t1állá
+y2t1álló
+yt2raf
+yt2ran
+yt2rap
+y1t2rá
+y1t2re
+y1t2ré
+y1t2ri
+y1t2ro
+yt2rón
+yt2rö
+y1udv
+yu2g1á
+yu2ge
+y1ugr
+yu2gy
+yu2hu
+y1ujj
+yuj2j1a2da
+yu2kab
+yu2kar
+yu2k1aszá
+yu2k1ác
+yu2kál
+yuká2s
+yuk1ásá
+yu2k1e
+yu2k1ö
+yu2kő
+yuk1t2
+yu2kű
+y1und
+y1u2ni
+y1u2no
+yu2rad
+yu2rai
+yu2rak
+yu2ral
+yu2ram
+yu2ras
+yu2rat
+y1u2rán
+y1u2ráv
+y1urn
+y1u2ru
+yu2sál
+yus3s
+yu2szá
+y1u2szo
+yu2tak
+yu2tal
+yu2tam
+yu2tat
+yu2taz
+yu2tál
+y1utc
+yu2tód
+y1u2tu
+y1u2tú
+yú1bl
+yú1br
+yú1gr
+y1újd
+y1ú2jé
+y1ú2jí
+y1újr
+y1újs
+yú2kel
+yú2k1es
+yú2ket
+yú2kev
+yú2kó
+yú2köl
+yú2l1ag
+yú2laj
+yú2lar
+yú2l1á2r
+yú2lát
+yú2l1eg
+yú2l1el
+yú2l1e2t
+yú2lin
+yú2l1is
+yúl2tag
+yú2lü
+yú2lű
+yú1pl
+yú1p2r
+y1úrb
+y1ú2ré.
+y1úrél
+y1ú2rév
+y1úrho
+y1ú2ri
+y1úrk
+y1úrnő
+y1úrr
+y1úrtó
+yú1sta
+yú2sü
+y1úszt
+y1útb
+yú2té.
+y1úth
+yúti2
+yú2ti.
+yú2tig
+y1útj
+y1útk
+y1útm
+y1útn
+y1ú2ton
+y1útp
+y1útr
+y1úts
+y1útt
+y1útv
+yü2dü
+y1ü2gy
+yü2két
+yü2lá
+yü2led
+y1ülteté
+y1ünn
+yü2rí
+y1ü2rü
+y1ü2te
+y1ü2té
+y1ütk
+y1ü2tő
+y1ü2veg
+yü2völ
+y1ü2ze
+y1ü2zé
+y1üzl
+yű1bl
+yűé2n
+yű2g1ő
+yű1kl
+yű1pl
+y1űrb
+y1ű2ré.
+yű2réb
+yű2rén
+yű2rön
+y1űrr
+yű2sá
+yű2s1orra.
+yűs1s
+y1ű2zőb
+y1ű2zően
+y1ű2zőé
+y1ű2zőh
+y1ű2zők
+y1ű2zőn
+y1ű2zőr
+y1ű2zőt
+y1ű2zőv
+y2v1abr
+y2v1a2dó
+yva2d3z
+yvai2
+y2v1akc
+y2v1alb
+y2v1alk
+y2v1ank
+y2v1ant
+yv1a2nya
+y2v1apo
+y2v1arz
+yva2s1u2
+y2v1atk
+y2v1au
+y2v1azo
+yv1ábr
+yv1állo
+yv1állv
+yv1á2rai
+yv1á2rán
+y2v1áre
+y2v1árj
+y2v1árl
+yvárosi2b
+yv1árre
+y2v1á2ru
+y2v1árv
+y2v1áta
+y2v1áti
+y2v1átt
+yv1br
+yv1dr
+yv1e2gye
+yv1egys
+yv1e2kéb
+yv1ela
+y2v1e2lá
+y2v1ell
+y2v1elo
+y2v1elti
+y2v1ember
+yven3n
+y2v1e2p
+yve2r1a
+yve2r1á2
+yve2reg
+yve2r1ész
+yve2rip
+yve2r1o
+yvert2
+y2v1esszé
+y2v1eva
+y2v1e2vé
+yv1e2vő.
+y2v1ex
+yvezé2rel
+yvé2du
+yv1ékí
+yv1é2let
+y2v1élm
+y2v1élt
+y2v1ép
+y2v1érd
+y2v1é2ri
+y2v1érrő
+y2v1érté
+y2v1é2rü
+y2v1érze
+y2v1é2ve.
+yv1fr
+yv1gr
+yvigaz1
+y2v1igé
+y2v1i2k
+y2v1ille
+y2v1im
+yv1ind
+y2vint
+y2v1i2p
+y2v1ism
+y2v1ist
+y2v1íg
+y2v1ín
+yví2zis
+yví2zü
+yv1kl
+yv1kr
+y2v1old
+y2v1olv
+y2v1or
+y2v1os
+yv1ó2r
+yv1öss
+y2v1ö2z
+yv1őr
+yv1pr
+yv1sk
+yv1sl
+yv1st
+yv1sz2
+yv1tr
+y2v1ub
+y2v1ud
+y2v1ur
+y2v1u2t
+yv1új
+yv1út
+y2v1üg
+y2v1ü2z
+yza2t1a2l
+yza2t1e
+yza2t1érd
+yzá2r1ó2ra
+yzás3s
+yze2t1a2
+yze2t1á
+yze2t1ér.
+yze2t1é2rő.
+yze2tés
+yze2téte
+yze2t1o
+yze2t1öl
+yzé2k1e2l
+yzőa2
+yz2rí
+2z.
+1za
+3zaba.
+zab2b1i2ko
+za2b1i2ga
+za1bre
+za1bri
+z1abro
+2zabs
+za2ce
+za2c1ég
+za2cho
+zac1ikr
+za2c1im
+za2cipa
+za2c1iv
+za2cí
+zac1k2
+zac3st
+za2dad
+2zadag
+zad1alj
+za2dan
+za2data
+2z1a2dato
+z1a2datr
+zadás1s
+zadi2a
+za2d1ír
+za2dóme
+za2dóz
+za1d2rá
+za2d1ut
+za2dzá
+za1fl
+za1f2r
+za2g1a2d
+za2gak
+za2ga2n
+zag1any
+za2gara
+za2g1a2t
+za2gau
+za2gág
+za2g1ál
+zag1árn
+zag1árt
+za2g1áz
+za2gel
+za2gés
+z1aggy
+2zagi
+za2gin
+z1a2git
+za2g1osz
+zagren2
+za2g1ü
+z1agy.
+z1a2gyak
+z1a2gyar
+z1agyb
+za2ijá
+zai2z
+3zaj.
+3zaja.
+za2j1a2d
+za2jan
+za2j1átv
+3zajáv
+za2jes
+3zajf
+za2jin
+3zajj
+zajká2rok
+3zajol
+za2j1or
+2zajta
+2zajtó.
+z1ajtók
+2zajtót
+zaj1tr
+3zajú
+za2j1ü2
+2zakad
+za2k1a2dat.
+zakai2ko
+za2k1aka
+zak1alk
+za2k1alv
+za2kana
+za2k1ant
+za2kara
+z1akarat
+z1a2karás
+z1a2karó
+z1akarv
+za2k1atl
+za2k1á2p
+za2k1áta
+za2k1átl
+2zakc
+z1akció
+za2k1e2g
+za2k1ele
+za2kelm
+za2k1eln
+za2k1elő
+za2ket
+za2k1é2l
+za2k1int
+za2k1i2p
+zak1iro
+za2k1ír
+zak1k2
+za1klu
+2z1aknák
+zak1oszt
+za2k1o2v
+za2kős
+za1krí
+2zaktá
+2zakti
+z1aktív
+2zaktú
+zaku1p2
+zaku2r
+zak1ura
+za2k1urá
+zakü2
+za1kvó
+zal1acé
+zala2gá
+zalag1g
+2zalakí
+za2lakj
+za2laku
+zala2n
+zal1any
+z1a2lapb
+za2lapj
+zal1átk
+zale2l
+zal1ele
+zal1ell
+zal1elő
+za2l1e2m
+z1algá
+z1alge
+za2lid
+z1alkal
+z1alkat
+z1alkot
+2zalmás
+za2lól
+zalta2n
+zal2tel
+zal2tem
+z1alti
+za2m1a2d
+za2m1aj
+zam1ala
+za2m1a2p
+zama2t1ő2
+za2maz
+2z1ambu
+za2mem
+zam1ing
+za2m1is
+za2mí
+za2m1osz
+za2mü
+z1a2nal
+z1a2nek
+2zang
+z1angy
+2z1ankét
+zan2tes
+z1antil
+za2nya.
+z1a2nyag
+z1a2nyó
+zao2k
+zao2s
+zaó2h
+zaó2v
+z1a2pa.
+za2pad
+za2p1a2g
+z1a2pai
+za2p1ág
+z1a2pán
+za2p1ára
+z1a2pát
+z1a2páv
+zape2l
+zap1ele
+za2pem
+za2pes
+za2pí
+za1p2lán
+z1a2pó.
+z1a2póé
+z1a2pók
+2zap1p2
+zappa2ne
+zap3rof
+zap1s2
+za2r1a2dá
+za2ran
+zar1a2nya
+zar1apa
+za2rar
+z1a2rái
+za2r1ál
+z1a2rány
+z1a2rár
+2zarc
+z1arc.
+z1arca
+z1arcá
+z1arch
+z1arci
+z1arck
+z1arco
+z1arcú
+zare2t
+za2r1ete
+za2rev
+za2réna
+za2réná
+2zarm
+za2r1ön
+za2r1ü
+zar2vág
+2zarz
+za2sem
+za1s2ká
+za1s2ko
+za1s2li
+za1s2pó
+za1spr
+za2t1ab
+za2t1a2d
+za2t1aj
+zat1alap
+zat1alj
+zat1ana
+za2t1a2ny
+zat1ará
+zat1att
+za2tau
+za2taz
+za2t1áll
+zat1álo
+zatá2p
+zat1ápo
+za2t1árad
+za2t1áré
+za2t1á2ru
+za2t1elé
+zat1elk
+za2t1e2ré
+za2t1erk
+za2t1é2g
+za2tél
+zat1i2ko
+za2tim
+za2t1ind
+za2t1ing
+za2tins
+za2t1int
+za2t1ist
+za2tiz
+zat1k2
+2z1atka.
+z1atlas
+zatmo1s
+zatmosz2
+za2t1okos
+zat1olda
+2zatomj
+zat1oml
+za2t1osz
+za2tök
+za2t1ön
+zat2rok
+za1trom
+zatt2
+zat1tr
+za2tura
+za2tül
+za2tür
+2zaty
+za2tya
+za2tyá
+za2ula
+za2ulá
+za2urá
+zau2tak
+z1a2uto
+z1autó
+zaü2t
+zaü2z
+za3vará
+3zavarb
+2zavat
+z1az.
+z1azh
+z1a2zo
+1zá
+2z1ábr
+zá2de
+zág1a2d
+zá2gak.
+zá2gako
+zá2g1al
+z1á2gas
+z1á2gat
+zá2gaz
+zág1azo
+zá2g1ál
+zá2g1á2rak
+zá2g1áru
+zá2g1e
+zá2gép
+zá2golta
+z1á2gói
+zá2g1út.
+zá2gü
+z1ágy.
+z1á2gya
+zágy1a2da
+z1ágyb
+z1ágyh
+z1ágyn
+z1ágyr
+z1á2gyu
+záí2r
+zá2j1ék
+zá2jí
+zá2j1ol
+zá2j1ös
+zá2jő
+zá2jü
+zá2jű
+zá2kin
+zá2k1ö2v
+zála2n
+zá2l1any
+zál1apr
+z1álar
+zál1assz
+z1álca
+z1álcá
+z1áldá
+zá2l1e2g
+zá2l1e2l
+zá2l1em
+zá2lib
+zá2lid
+zál1ing
+zá2lir
+z1állam
+z1állap
+z1álma
+z1álmá
+z1álmo
+zá2lob
+zálo2d
+zá2l1oda
+zá2los
+zá2lü
+zá2ly1a2l
+zá2mac
+zá2m1a2d
+zá2m1aj
+zá2m1a2l
+zám1any
+zá2m1a2p
+záma2r
+zám1ará
+zá2maz
+zá2m1átl
+zá2m1á2to
+zá2mél
+zá2m1é2rő
+zá2m1ik
+zá2mip
+zá2mir
+zám1orm
+zám1ors
+zá2mó
+zá2mö
+zá2mő
+zá2m1ut
+zá2mü
+zá2mű
+zá2naj
+zá2n1as
+zá2n1at
+zá2n1át
+zá2nem
+zá2nis
+zá2n1it
+zán3n
+zá2n1osz
+zán1sp
+zá2nü
+zány2
+zá2p1ad
+zá2p1ag
+zá2p1orzó
+zá1p2r
+z1á2radd
+zá2r1a2dot
+zá2r1a2l
+z1á2ramk
+z1á2raml
+zára2n
+zá2r1any
+zá2r1ap
+zá2rar
+zá2r1ati
+zá2r1a2to
+zá2r1att
+zá2r1av
+zá2r1ál
+3zárás.
+3zárása
+3zárásb
+3zárási
+zárás1s
+zá2r1á2sz
+z1árbev
+3zárdá
+zár2dem
+zár2d3z
+2zá2r1em
+zá2réb
+2zárf
+2z1á2riá
+zá2rid
+zá2r1i2k
+zá2rim
+zá2r1is
+zá2r1iz
+zár1k2
+3zárkák
+2zárkö
+3zárlat
+2zárnö
+2zárny
+zár2nyál
+zá2r1osz
+3záró.
+3záróa
+zá2r1óbo
+3záród
+zár1óév
+zá2r1ó2rá
+zá2rő
+2zárré
+zárs2
+zár1sk
+zárt1anyá
+zár2t1es
+zárté2r
+zár1tro
+zá2rug
+z1á2ruh
+z1áruj
+2zárunkn
+2zárunkr
+zá2rü
+z1árvah
+zá2s1a2d
+zá2saj
+zá2sal
+zá2s1a2r
+zá2s1at
+zá2saz
+zá2s1á2g
+zá2s1árad
+zá2s1á2rá
+zá2s1á2ré
+zá2s1árh
+zá2s1árn
+zá2s1árt
+z1á2sás
+zá2sep
+zás1ikon
+zá2sis
+zá2s1í
+zá2s1ol
+z1á2só.
+zás1ó2r
+z1ásóv
+zá2sut
+zá2sü
+zá2s3zav
+3zászl
+zász3se
+z1átad
+zát1a2dó.
+zát1a2dók
+zátá2r
+2zátb
+2z1átc
+z1átd
+zát1e2m
+zá2tél
+2z1átf
+2záth
+z1átha
+z1áthe
+zá1t2hi
+z1á2t1i2
+2z1átj
+2z1átm
+zá1tra
+zá1tro
+2záts
+2z1átv
+zá2z1ala
+záza2t
+zá2z1ato
+zá2z1e2
+zá2zév
+zá2z1ol
+zá2zos
+zázó2
+zá2zór
+zá2zö
+zá2zsaj
+zá2zsas
+záz4sá
+zá2zsál
+zá2zsol
+zba2ki
+zbeá2
+zb2le
+zb2lo
+zb2lú
+zb2ri
+zb2ró
+zb2rú
+zc2lu
+zcsa2p1á2g
+zda1p2
+zdas2
+z2d1ass
+zd1áll
+zdés1s
+zdő1s2p
+zd2ri
+zd1u2r
+1ze
+zea2d
+zea2g
+zea2k
+zea2l
+zea2s
+zeán2sze
+zeá2r
+zeá2z
+2z1eb.
+2zebe
+ze2be.
+ze2bei
+ze2bek
+z1e2béd
+z1ebf
+z1ebh
+z1ebk
+2z1ebn
+ze1bru
+2zece
+z1e2cet
+z1e2ch
+z1e2cset
+ze2d1ál.
+ze2d1álj
+ze2d1áln
+ze2d1ált
+ze2d1álv
+zede2r1e
+ze2dil
+ze2d1ó2
+2z1e2dz
+zee2s
+z1eff
+ze1fr
+ze2g1a2l
+ze2gap
+ze2gar
+ze2g1ál
+ze2g1ár
+ze2g1eg
+zeg1ell
+ze2gep
+zeget2t1eb
+zeg1érr
+zegé2sz
+zeg1észb
+zeg1észé
+ze2gid
+ze2gil
+ze2gol
+ze2gú
+ze2gyed
+ze2gy1e2l
+ze2gyene
+ze2gyez
+z1egyl
+z1egys
+ze2het
+ze2ia
+zei2g
+zei2s
+zeí2r
+zekci2ósz
+zek1e2gy
+ze2k1ell
+z1e2kéit
+2zekék
+ze2kil
+ze1k2lap
+ze2k1ott
+zek1övek
+ze2kő
+ze1k2reá
+zek1t2
+ze2k1ü2lő
+z1ekviv
+ze2lag
+ze2lar
+ze2lál
+z1elbo
+2zeledel
+z1e2lefá
+ze2leji
+2zelekt
+ze2leme.
+ze2lemek
+zelem1el
+zele2m1ér.
+ze2lemű
+zele2pá
+zele2p1el
+zele2po
+zele2p1ü2l
+z1e2l1e2re
+ze2l1esz
+zele2tá
+zele2ter
+2z1e2lég
+2z1eléré
+zel1érh
+zelés1s
+z1elhá
+2z1elhel
+2z1elher
+ze2litet
+z1elkü
+2z1elláto
+2zellen
+z1ellene
+2z1elnev
+z1elnö
+ze2lof
+z1e2los
+z1e2lö2l
+z1elön
+2z1e2lőha
+zelő2saj
+z1e2lőző
+z1első
+z1eltá
+2z1eltér
+2z1elto
+2z1eltű
+z1e2lu
+2z1e2lú
+z1elv.
+z1elvek
+z1elves
+2z1elvev
+z1elvez
+z1elvn
+z1elvt
+2z1elvű
+z1elzá
+2zema
+ze2mak
+ze2m1ág
+ze2m1ár
+ze2mát
+2zember
+z1ember.
+z1emberb
+z1emberé
+z1emberh
+z1emberk
+z1embern
+z1emberr
+z1embert
+z1embl
+2zeme.
+ze2m1egé
+2zemei
+2zemek
+ze2m1ell
+ze2m1eng
+2zeméb
+2zeméh
+ze2m1ék
+ze2m1éle
+ze2m1é2lé
+ze2m1é2lő
+ze2m1élt
+ze2m1élv
+ze2m1é2rét
+2zemés
+zemé2te
+ze2m1éten
+ze2m1étet
+ze2m1étjé
+2zemév
+ze2migr
+ze2m1ing
+ze2m1int
+ze2mis
+ze2m1iz
+ze2m1í
+2zemk
+2zeml
+2zemmó
+ze2mol
+ze2m1osz
+ze2m1ó2
+ze2m1ő
+2zems
+z1emul
+zem1ur
+ze2mú
+2zemü
+2zemv
+zemvíz1
+3zeneir
+3zeneka
+zenesz2
+3zenéé
+3zenéi
+3zenéj
+ze2nép
+zenké2
+zenkét1
+ze2n1o
+zen2tag
+zen2tal
+zen2t1an
+zen2t1as
+zente2g
+zen2t1egy
+zen2telm
+zen2t1ere
+zen2tev
+zen2t1é2j
+zen2t1imr
+zen2tip
+zen2tis
+zen2tí
+zen2tol
+zen2t1ó2
+zen2t1ö
+zentő2s
+zen2t1őse
+2zenz
+zeo2k
+zeo2m
+zeö2r
+2zepééb
+2zepééi
+2zepéén
+2zepéit
+2z1epéj
+2z1e2pém
+2z1e2pés
+z1epiz
+ze1pla
+ze1ple
+2zepr
+ze1p2ri
+ze1pró
+ze2r1a2d
+ze2rajá
+ze2r1ajt
+ze2rakr
+ze2r1al
+ze2ram
+ze2r1a2n
+ze2r1a2r
+ze2r1as
+ze2r1a2t
+ze2r1au
+ze2raz
+ze2r1ága
+ze2r1á2r
+ze2rás
+ze2r1á2t
+zer2bin
+zer1d2
+z1erdé
+ze2r1eb
+ze2r1e2ce
+ze2redé
+ze2rege
+zer1e2ge.
+ze2r1e2gé
+ze2r1egg
+ze2r1egy
+z1e2reje
+zer1ejt
+z1e2rejü
+z1e2rejű
+ze2r1e2ke.
+z1e2rekl
+ze2relődj
+ze2r1ember
+ze2r1emi
+ze2r1eng
+zere2p1a
+ze2r1e2r
+ze2r1e2sés
+ze2r1essz
+ze2r1este
+zer1e2sze.
+zer1eszk
+ze2reszt
+ze2r1eu
+ze2r1e2v
+ze2rég
+ze2r1é2j
+ze2r1ék
+ze2r1é2l
+ze2r1ép
+zer1g2
+ze2r1i2d
+ze2r1iga
+ze2r1iko
+ze2r1ill
+ze2r1i2m
+ze2r1ina
+ze2rind
+ze2r1inf
+ze2r1ing
+ze2r1inj
+ze2r1ink
+ze2r1intel
+ze2r1inté
+zer1intő
+ze2rio
+ze2rism
+ze2riz
+ze2r1í2j
+zer1k2
+zer2nal
+ze2r1okt
+ze2r1old
+ze2rolv
+ze2ror
+ze2r1ost
+ze2r1osz
+ze2roti
+ze2r1ó2r
+ze2rök
+2ze2rő
+z1erő.
+z1erőf
+z1erői
+z1erők
+z1eről
+z1erőn
+z1erős
+z1erőt
+z1erőv
+zer1őz
+zer1p2
+zer1s
+zers2k
+zers2p
+zers2t
+zert1á2lom
+zer2tit
+zer2tór
+zer1tra
+zer1tren
+ze2r1un
+ze2rur
+ze2rus
+ze2r1u2t
+ze2r1út
+ze2r1ü2g
+2zerű
+zer2v1a2dó
+zer2van
+zer2vel
+zer2vél
+2z1e2sedék
+ze2s1e2kéh
+z1e2setb
+z1e2sete.
+z1esetes
+z1e2setet
+z1e2seté
+z1e2seti
+z1e2setr
+2z1e2sés.
+2z1e2sésb
+2z1esésd
+2z1e2sése.
+2z1e2sései
+2z1e2sések
+2z1e2sésem
+2z1e2sésen
+2z1e2séses
+2z1e2sésé
+2z1e2sésh
+2z1e2sési
+2z1e2sésk
+2z1e2sésn
+2z1e2sésr
+2z1e2séss
+2z1e2sést
+ze2s1it
+ze1s2mi
+2z1e2ső
+zesp2
+ze1s2pe
+ze1spr
+2zeste
+z1estek
+z1estem
+2z1esté
+z1esti.
+ze1s2til
+2z1estj
+ze1sto
+z1estre
+z1estt
+ze2s1ü2v
+ze2szág
+zesz1e2get
+ze2szelle
+ze2szeng
+ze2széh
+ze2sz1é2le
+ze2sz1im
+ze2szip
+2zeszk
+z1eszkö
+ze2szol
+zeszt2
+zesz1tr
+ze2t1ab
+ze2tac
+ze2t1ala
+ze2t1a2ny
+ze2táj
+ze2t1á2l
+ze2t1á2p
+ze2t1át
+zet1egé
+zet1elá
+ze2t1ell
+ze2telm
+ze2t1e2lőá
+ze2t1e2lőd
+ze2t1elr
+zet1emel
+ze2t1eml
+ze2tene
+zet1erk
+zet1e2ró
+zete2s1ég
+zetest2
+zetes1tr
+z1e2teté
+ze2t1eti
+ze2tetn
+ze2t1éd
+ze2t1é2j
+ze2t1é2l
+ze2térte
+ze2t1érté
+zet1értő
+ze2t1é2rü
+zeté2sz
+zet1észe
+zet1éter
+ze2tid
+z1e2tika
+ze2t1i2ko
+zet1ill
+ze2t1ing
+ze2tít
+zetkész1e
+ze2tom
+zet1ont
+ze2top
+ze2t1ó2r
+ze2t1ö2v
+zet1őri
+zet1őrö
+zet1őrt
+ze2tut
+ze2tür
+ze2t1ü2z
+ze2ty
+zeu2g
+z1e2ur
+zeü2t
+z1e2vő
+ze2x1id
+ze2xim
+ze2x1i2p
+z1expe
+zex2t1ö
+ze2xú
+z1e2zer
+z1ezr
+1zé
+z1é2ber
+2z1ébr
+zé2dak
+zé2d1a2l
+zé2d1a2r
+zé2d1as
+zé2dat
+zé2d1á2
+zé2d1ekét
+zé2d1e2lem
+zé2delm
+zéde2r1
+zéd1esem
+zé2d1esz
+zé2d1eti
+zé2d1és
+zé2dik
+zé2dó
+zé2d1ő
+zédren2
+zédu2
+zé2dur
+zé2dú
+zé2d3z
+zé2fá
+z1ég.
+z1égb
+z1é2ge
+zé2gé
+z1é2gi
+z1égn
+z1é2gő
+z1égr
+z1égt
+z1é2he.
+z1é2hen
+2z1é2hes
+z1é2het
+2z1éhs
+2zéid
+z1éj.
+zé2jen
+z1é2ji
+zéjje2l1e2
+z1éjs
+2z1éjül
+2z1é2jün
+zé2k1a2d
+zé2k1a2l
+zé2k1a2n
+zé2k1ap
+zé2k1as
+zé2kás
+zé2k1eg
+zé2k1e2két
+zé2k1elr
+zé2ker
+z1é2kez
+zé2k1ék
+zé2k1é2l
+zé2k1és
+zék1old
+zék1osz
+zé2k1ó2
+zé2kör
+zé2kúr
+zékü2l
+zé2k1ülé
+zé2k1ülő
+zéla2
+zé2lab
+zé2lad
+zé2lak
+zé2l1an
+zé2las
+zé2l1á2
+2zé2le2l
+zél1ele
+zél1ell
+zél1elő
+zél1elt
+zé2l1e2r
+2zélet.
+2z1é2letb
+2z1é2lete.
+2z1é2leten
+2z1é2leté
+zé2letf
+2z1é2leth
+2z1é2leti
+2z1é2letn
+2z1é2letp
+2z1é2letr
+2z1é2lets
+2z1é2lettő
+2z1é2letü
+2z1é2letű
+2zélé
+zé2l1ékh
+zé2lim
+zé2l1ist
+zé2lí
+2zélm
+zé2l1o
+zé2l1ö2
+2zélős
+2zélt
+zé2l1u2
+zé2lú
+zé2lya
+zé2lyá
+zé2ly1esh
+zé2lyo
+2zéme
+zé2n1árn
+zéndio2
+zé2neg
+2z1é2nekb
+2z1é2neke
+z1é2neké
+zé2nekk
+2zénekl
+z1é2nekn
+zé2nekr
+zé2nekü
+zé2n1e2l
+zé2n1e2r
+zéni2
+zé2nik
+zé2nil
+zé2nim
+zé2n1io
+zé2n1is
+zé2ní
+zé2nom
+zé2nö
+zé2nő
+zént2
+zé2n1ü2lő
+zé2p1a2g
+zé2p1a2l
+zé2p1any
+zé2p1a2p
+zé2p1a2r
+zé2pas
+zé2pat
+zé2pau
+zé2pav
+zé2p1á2r
+zé2pát
+zé2peg
+zép1ell
+zé2pez
+zép1f2
+zé2pin
+zé2p1i2p
+zé2pir
+zé2p1i2s
+2zépít
+zépo2
+zé2pol
+zé2pos
+zé2pó
+zé2pö
+zép1s
+zé2pud
+zé2p1us
+zé2pú
+2zépül
+zé2rab
+zé2rag
+zé2r1a2l
+z1é2ram
+zé2r1a2n
+zé2rap
+zé2rar
+zé2r1as
+zé2rat
+zé2rav
+zé2r1á2
+zér1d2
+zé2r1e2lemé
+zé2r1e2lemk
+zé2r1e2lemn
+zé2remb
+zér1eml
+zé2r1esz
+2zérett
+zé2rev
+zé2rés.
+zé2résb
+zé2rése
+zé2rési
+zé2résk
+zé2résn
+zé2r1id
+zé2rim
+zé2ris
+zé2r1o2k
+zé2r1os
+3zérós
+zé2rö
+2z1é2rő.
+z1é2rői
+z1é2rők
+zé2rős
+z1é2rőt
+zér1s
+zér2taj
+2zértekez
+2zértelm
+2z1értetl
+2z1értető
+2z1érték
+2z1érthet
+z1érto
+zé2rú
+zé2sab
+zé2san
+zé2sar
+zé2s1az
+zé2s1á2
+zé2seg
+zé2s1e2l
+zé2s1e2r
+zé2s1eti
+zé2s1ég
+zé2sés
+zé2s1i2k
+zé2sok
+zé2só
+zés3s
+zé2s1ü2t
+zé2s3za
+z1észb
+z1é2szé
+z1észl
+zé2szó
+zés3zs
+zé2t1a2b
+zé2t1ad
+zé2tag
+zé2t1aj
+zé2t1a2k
+zé2t1a2l
+zé2t1ap
+zé2t1a2s
+zé2t1au
+zé2t1á2
+zéte2n
+zéte2se
+zéte2sü
+zé2tég
+zé2t1é2n
+zé2t1i2
+2zétk
+zé2tol
+zé2t1o2m
+zé2tor
+zé2t1o2s
+zé2tun
+zé2tú
+zé2t1ü2
+zé2t1ű
+2zétv
+2z1év.
+2z1évad
+z1évb
+2z1é2ve.
+2z1é2vek
+2z1é2ven
+2z1é2ves
+z1é2vén
+z1é2vét
+z1é2vév
+z1évf
+2zévi
+z1é2vi.
+z1évk
+2z1évn
+z1évr
+z1évs
+z1évt
+z1é2vü
+2z1évv
+zfa2l1a2da
+zfa2l1aj
+zfa2l1e2l
+zfa2les
+zfe2l1em
+zfe2len
+zfe2reg
+zf2la
+zf2le
+zf2li
+zf2lo
+zf2ló
+zfora2
+zfo2rat
+zfo2riz
+zföldié2
+zf2ra
+zf2rá
+zf2re
+zf2ri
+zf2rí
+zf2ro
+zf2rö
+zgás3s
+zgá2s3z
+zgá2zó
+zgé2p1e2két
+zgé2sa
+zgé2sá
+zgé2sem
+zgés3s
+zg2la
+zg2ló
+zgó1g2
+zgő2nyá
+zgő2z1á2
+zgő2zér
+zgő2z1ő
+z1g2ra
+z1g2ráf.
+z1g2ráff
+z1g2ráfh
+z1g2ráfj
+z1g2ráfk
+z1g2ráfn
+z1g2ráfr
+zg2ró
+z1g2ru
+zhán2
+zhá2t1a2d
+zházköz1
+1zi
+zi2aa
+zi2aá
+zi2abo
+zi2ac
+zi2ad
+zi2ae
+zi2aé
+zi2ag
+zi2ah
+zi2aí
+zi2aj
+zi2akép
+zi2akó
+zi2al
+zi2am
+zi2ao
+zi2aö
+zi2a1p2
+zi2ar
+zi2asza
+zi2aszo
+zi2aszó
+zi2at
+zi2au2
+zi2aú
+zi2aü
+zi2av
+2z1ibr
+2zicc
+zi1ch
+z1i2deá
+z1i2deg
+z1i2deo
+zi2dén
+2z1i2dő
+zie2l
+zie2m
+zi2éa
+zi2éá
+zi2éke
+zi2ép
+zi2éta
+zi2étá
+zi2éü
+z1ifj
+z2ig.
+zi2ga.
+2z1igazg
+2z1i2gazo
+z1i2gás
+zi2géj
+2z1i2gén
+zi1g2r
+2zigye
+zi2k1a2n
+zik1ékek
+zi2kik
+zi2kim
+zi2k1ing
+zi1klu
+zi2k1u2r
+zikus1s
+zi2ler
+zi2l1é2j
+zi2l1ék
+zi2l1ing
+zi2l1ü
+z1i2ma.
+zi2mak
+zi2máb
+zi2máj
+zi2mák
+zim1áll
+zi2már
+zi2mát
+zi2máz
+zim1b
+zi2m1e2g
+zi2m1e2l
+zi2m1é2ré
+zi2m1érté
+zim1ind
+zi2m1ip
+z1i2mit
+zi2mö
+zi2n1a2d
+zi2n1a2l
+zi2n1a2n
+zi2n1a2r
+2z1i2nas
+zi2n1au
+zi2nái
+zi2n1áll
+z1indu
+zin1emb
+zi2nég
+zin2gas
+zin2gál
+zi2n1i2m
+zi2n1in
+zi2ní
+zin3n
+zi2nol
+zin1s2
+zin2t1a2d
+zin2t1a2l
+zin2t1a2s
+zin2tát
+zin2t1á2z
+zinte2l
+zin2t1ele
+zin2telő
+zin2telt
+z1interj
+z1interp
+z1interv
+zin2tom
+zin2t1ón
+zi2n1u2t
+zi2nú
+zi2ol
+2z1i2ono
+2z1i2ons
+zi2ot
+zi2óa
+zi2óá
+zi2óc
+zi2óe
+zi2óg
+zi2óí
+zi2ókam
+zi2ókap
+zi2óká
+zi2óke
+zi2ó1kl
+zi2ól
+zi2ómá
+zi2ómé
+zi2óné
+zi2óny
+zi2óo
+zi2ó1p2
+zi2órá
+zi2ósá
+zi2ósé
+zi2ó1s2ká
+zi2ó1sp
+zi2ószű
+zi2óta
+zi2ótá
+zi2óú
+zi2óü
+zi2óű
+zi2pai
+zi2pari
+zi2páj
+zi1p2l
+zi1p2r
+z1i2rat
+2zirá
+z1i2rán
+z2i3re
+2ziro
+z1i2rod
+zi2rón
+z2i3rő
+2zirt
+zir2t1a2
+z1irtá
+zir2to
+z1irtó
+zi2sad
+zi2sal
+zi2sam
+zi2sar
+zi2s1a2s
+zi2sál
+zi2s1áro
+zi2s1e2g
+zi2s1e2l
+zi2s1er
+zise2s
+zi2s1ese
+zi2s1esz
+zi2s1ék
+zi2sérte
+zis1évi
+zi2s1il
+zi2sin
+zi2s1is
+zi2sit
+zi2s1o2v
+zi2s1ó2
+zi2sö
+zi2ső
+ziss2
+zis3sza
+zis3szá
+zis3szo
+zist2
+zis1tra
+zis1tre
+zi2sut
+zi2s1ü2v
+zi2s3zaj
+zis3zav
+zis3zón
+zi2t1áll
+zit1áru
+zi2t1e2g
+zi2t1elr
+zit1eng
+zi2tét
+zi2til
+zi2tin
+zi2tip
+zi2tir
+zi2t1or
+zitó2
+zi2tór
+zi2t1út
+ziú2r
+z1i2vad
+2z1i2vó
+2z1i2zé
+2zizm
+z1izmo
+z1i2zom
+1zí
+zí2gé
+zí2jan
+zí2je
+zí2jö
+zí2jü
+zí2nac
+zí2nad
+zí2naku
+zí2nal
+zí2nan
+zí2nas
+zí2nat
+zí2n1áll
+zí2n1ár
+zí2nát
+zí2n1e2r
+zí2nél
+zí2ní
+z1ínna
+zín3nye
+zíno2
+zí2n1od
+zí2n1ok
+zí2nos
+zí2n1ó2
+zí2nö
+zí2nu
+zí2nú
+z1í2ny
+zínyenc1
+zí2r1a
+2z1í2rá
+zí2rog
+2z1í2ró
+zítőa2
+zítőe2
+zítőkész1
+zí2vaj
+zív1akt
+zí2val
+zí2var
+zí2ver
+zí2v1ő
+zí2vul
+zí2vú
+zí2ze
+zí2zü
+zí2zű
+zje2gy1á2
+z2k1abl
+z2k1alak
+z2k1alj
+z2k1alt
+zka1p2l
+z2k1a2rád
+z2k1a2ráj
+z2k1a2rén
+zkaró2
+zka2rór
+zka1s2k
+z2k1állv
+zk1bl
+zk1dr
+zk1egys
+z2kenn
+zk1eszk
+z2k1etű
+z2k1ér.
+z2k1érté
+z1k2hü
+zkia2
+zkiá2
+zkie2
+zki2g
+z2k1igé
+zki2sé
+zk2la
+z1k2lá
+zk2ler
+z1k2lí
+zk2ló
+z1k2lu
+z2k1olda
+zkon2t1ár
+z2k1ontó
+zko2r1os
+z2k1oszl
+z3koszt
+z2kókor
+zk1ókort
+zkó2pá
+zkó2z3s
+zkö2zele
+zköz1ell
+zkö2z1é2l
+zkőé2h
+zk1pr
+z1k2rak
+zk2rá
+z1k2reá
+z1k2rém
+z1k2réta
+z1k2rétá
+zk2rí
+z1k2ro
+z1k2rón
+zkultú3
+zkultúr2
+z2k1u2rán
+z2k1u2rát.
+z2k1utá
+z1k2val
+zk2vó
+zky2b
+zky2h
+zky2j
+zky2k
+zky2n
+zky2r
+zky2t
+zky2v
+zla2tal
+zlata2n
+zlat1any
+zlá2m1e
+zlá2mis
+zlás3s
+z2láv.
+z2láve
+z2lávé
+z2lávk
+z2lávn
+z2lávo
+z2lávv
+zleg1g
+zlei2
+zleí2
+z2leng.
+zle2tak
+zle2tal
+zle2t1a2n
+zle2tál
+zle2t1á2r
+zle2t1eg
+zle2t1ell
+zle2tesz
+zle2tél
+zle2t1ér.
+zlet1érv
+zle2tés
+zle2t1é2té
+zle2t1é2ve.
+zletigaz1
+zle2t1u
+zle2tüz
+zlé2sí
+zlé2so
+zlés3s
+zlina2
+zli2nan
+zli2nin
+z2loge
+zlo2p1as
+zlo2pó
+zlóó2
+zló2s1orr
+zma1pr
+zmas2
+zma1sp
+zmeá2
+zme2ge
+zme3gom
+zmi2n1a2
+zmi2n1e
+zmuskész1
+zmu2sö
+zmu2s3z
+zmu2tok
+zna2pes
+znie2
+zni2ó
+z2nob
+znó1str
+znót2
+znó1tr
+1zo
+z1obj
+z1o2dú
+zo2es
+z1o2ka.
+z1o2k1a2d
+z1o2kai
+zo2k1ál
+zoki2
+zo2k1ip
+z1o2k1ir
+z1okke
+z1okle
+2z1o2koz
+2zokta
+zo2lab
+2z1o2laj
+zolajá2
+zola2j1ár
+zola2je
+zo2l1a2l
+zo2l1as
+zol1ábr
+zo2l1áro
+z1oldal
+2z1oldh
+2z1oldó
+zo2l1e
+zol1f2
+zol1inf
+zo2l1is
+zo2l1í
+z1olló
+zo2lö
+z1oltás
+z1oltó.
+zol1t2re
+zo2lü
+2zolvad
+zo2m1a2g
+zo2mak
+zo2m1a2l
+zo2m1a2n
+zo2map
+zo2m1a2s
+zom1áll
+zo2m1á2r
+zom1b2
+3zombor.
+2zome
+zo2meg
+zo2m1el
+zo2men
+2zomé
+zo2mél
+zomé2t
+zo2m1éte
+2zomf
+2zomg
+zomi2
+zo2min
+zo2miz
+zom2jó
+2zoml
+zo2m1ors
+zo2m1os
+2zo2mö
+2zom1p2
+2zom1s
+2zomz
+zo2n1aj
+zo2n1ak
+zo2n1a2la
+zo2n1alá
+zo2n1alk
+zona2n
+zo2n1any
+zo2n1a2r
+zon1asz
+zo2n1au
+zo2náld
+zo2n1áll
+zo2n1átl
+zone2
+zo2neg
+zo2nel
+zo2n1er
+zo2nes
+zo2név
+zo2nin
+zo2n1i2o
+zo2n1or
+zono2sé
+zo2n1ó2
+zo2nö
+zon1s2
+zon2t1es
+zon2tin
+zon1tre
+zo2nü
+zo2ny1ad
+zo2ny1a2l
+zo2ny1a2n
+zo2nyar
+zo2nyav
+zo2nye
+zo2nyid
+zo2nyij
+zo2nyó
+zo2ol
+zo2om
+z1opál
+z1o2pe
+zo1pho
+zo2r1a2d
+zo2raf
+zo2r1ag
+zo2r1aj
+zo2r1a2l
+zo2ran
+zo2r1as
+z1o2rat
+zo2r1au
+zo2r1e2
+zor1f2
+zo2rid
+zo2r1il
+zor1ing
+z1ormá
+zo2r1ol
+zo2rop
+zo2rosz
+zo2r1ó2
+zo2rö
+z1orr.
+z1orrú
+z1orsó
+zor1t2re
+zo2rü
+2z1osko
+z1ostá
+z1osto
+zo1sz2f
+z1oszl
+zosz2tat
+2zote
+2zotó
+zotó2pa
+zo2vi
+zo2xi
+1zó
+zóa2d
+zóá2g
+zóá2r
+zó1bl
+zó1b2r
+zó1cl
+zó2d1e2l
+zó1fl
+zó1f2r
+zó1gl
+zógyö2k1ér
+zói2g
+zóí2v
+zója1
+zó1k2l
+zó1kré
+zókupac1
+2zól.
+z1ólm
+zó2lomb
+3zónád
+3zónái
+z1ó2ni
+2z1ónj
+2z1ónn
+z1ó2nod
+2z1ónt
+zóó2r
+zó1p2l
+zó1p2r
+z1ó2rad
+z1ó2rar
+zó2rasz
+zó2rái
+z1ó2ráj
+z1ó2rák
+z1ó2rár
+zórás1s
+z1ó2rát
+z1ó2ráv
+z1ó2riá
+zós1ík.
+zó2s1ín.
+zó1s2ká
+zó1sl
+zó1s2ta
+zó1sté
+zósz1akad
+zósz1állí
+zó2szene
+zó2sz1é2le
+zó2sz1íj
+zósz1ü2lő.
+zóta2g1a2
+zóté2g
+zót1ége
+zó1tré
+z1ó2vó
+1zö
+zö2bá
+zö2bo
+zö2bó
+z1öcc
+zö2dé
+zö2dú
+zö2ga
+zö2gá
+zög3g
+zö2gil
+zö2gí
+zö2go
+zögö2
+zö2g1öl
+zö2gu
+zö2gy
+2z1ökl
+2z1ö2ko
+2zökrü
+3zöldes
+3zölds
+2zöleb
+zö2les
+2z1ölniv
+z1ölyv
+2z1öml
+z1ö2na
+z1ö2ná
+2zönb
+2zöne
+2zöné
+2zöni
+2zönl
+2zönne
+2zönö
+2zönr
+2zönt
+3zörej
+zör2f1e
+zör2f1o
+zör2nya
+zör2nyá
+zör2nyel
+zör2nyesz
+zör2nyék
+zör2nyí
+zö2rök
+zör2p1a2
+zör2pá
+2z1örv
+2zössz
+z1ösv
+z1ösztö
+zö2te
+2z1ötl
+2z1ötv
+z1öv.
+z1ö2vei
+z1ö2vek
+zöve2t1e2l
+z1ö2vez
+zö2zö
+1ző
+zőa2c
+zőa2l
+zőá2g
+ző1bl
+ző1br
+zőé2l
+ző1fl
+ző1f2r
+zőgépi2
+zőgé2p1ip
+ző1gr
+ző1kl
+zőmű1
+zőnyá2
+ző2ny1er
+ző2ny1é2k
+ző2nyért
+ző1pl
+ző1pr
+ző2ran
+ző2r1e2c
+ző2r1ege
+ző2rel
+ző2r1er
+2zőrk
+2zőrl
+z1őrlő
+2zőrm
+ző2rol
+2zőrü
+ző2r1ü2g
+2zőrz
+z1őrzé
+z1őrző
+ző2sis
+ző1ská
+ző1spe
+ző1s2pi
+ző1sta
+ző1sti
+ző1str
+zősz2
+ző1szf
+ző1szt
+ző1tr
+zőü2l
+zpen1n
+zp2fe
+zp2la
+zp2lé
+zp2lo
+zpor2t1e2
+zpor2t1ő2
+zpor2t1ú
+z1p2ra
+z1p2ri
+z1p2ro
+z1p2ru
+zrae3le
+zrádiói2t
+zre2d1á2
+zre2del
+zre2d1é2k
+zre2d3z
+zren2d1ő2
+3z2rí.
+z2s
+1zsa
+zs1abla
+2zs1a2dat
+2zs1a2dó
+zsag2
+2zsah.
+2zsajt
+2zs1akc
+2zs1alj
+2zs1alm
+2zs1alt
+zsa2nyá
+zsa2pa.
+2z3sapk
+zsa2rán
+z3sarj
+2z3sark
+2z3sarl
+2zs1arz
+2zs1aszt
+zs1atl
+zsa1tr
+2zs1a2ty
+2zsautó.
+2zsautón
+zs1azo
+1zsá
+2zs1ábr
+2z3sáf
+2z3ság
+zs1ággy
+zsá2kó
+2zs1ála
+2zsálc
+2zsálm
+2zs1á2p
+2zs1á2rak
+2zsárat
+2z3sári
+2zsáru
+2zsáte
+2zs1átk
+2zsáto
+2zsátö
+2zs1áts
+2zs1á2zós
+zs1bl
+zs1br
+z3s2ch
+zscsapá2
+zsde1s
+zs1dr
+1zse
+zse2ba
+zse2biro
+zse2b1o2
+2zsebz
+zs1e2ce
+zs1e2dé
+z3sej
+2zsell
+zs1elm
+2zselö
+zs1e2lőf
+zs1e2lőr
+2zsember
+2zs1e2mel
+zs1enc
+zs1ene
+zse2raj
+zse2r1á2
+zse2rel
+zsere2s
+zse2r1esz
+zse2r1ék
+zse2rin
+zse2r1o
+2zsese
+zse2szü
+zs1evé
+2zs1ex
+2zsez
+1zsé
+z3ség
+zsé2ge2l
+2zséhs
+2zsél
+zs1éle
+2zsép
+2zs1érd
+2zs1érte
+2zs1érté
+3zséry
+2zsérz
+2zséte
+2zs1étk
+2zs1étr
+2zs1étt
+2zs1é2ve.
+zs1fl
+zs1fr
+zs1gr
+1zsi
+2zsidő
+2zsigá
+2zsigé
+zsi2kor
+2zs1ill
+2zs1i2má
+zsi2min
+zsi2m1u
+2zsinas
+zs1i2pa
+z3sipk
+2zsirat
+zs1irato
+2zs1iro
+2zs1irt
+2zs1ism
+2zsist
+zsi2tat
+2zsivó
+zs1izé
+2zs1izm
+2zs1i2zo
+zs1izz
+1zsí
+2z3síb
+zs1íj
+2z3sík
+2z3síp
+zsí2r1a2
+zsí2rá2
+3zsírbó
+3zsíré
+3zsíros
+3zsírr
+3zsírt2
+2zs1í2v
+2zs1í2z
+zs1kl
+zs1k2r
+1zso
+2z3sof
+2zs1okm
+2zs1okta
+2zsolaj
+zs1oli
+3zsom
+2zs1op
+2zsor
+z3soro
+2zsosty
+2zs1osz
+1zsó
+zs1óné
+zs1órá
+1zsö
+2zsökör
+2zsölőz
+2zs1ös
+zs1ö2ve
+1zső
+zs2pir
+zs1p2l
+zsp2r
+zs1s2k
+zs1s2p
+zs1st
+zs3sz
+zssze2r1e2l
+z3s2tad
+z3s2tat
+z3s2top
+zst2r
+zs1tro
+z3s2tú
+1zsu
+2zs1ud
+2zsugár.
+2zsugárr
+2zsugr
+3zsul
+2zsum
+zsu1s
+zsusz2
+1zsú
+2zs1új
+2zsúl
+zsú2r1a
+1zsü
+2zsüg
+2zsült
+2zsünn
+zs1üs
+2zsüt
+2zs1üz
+1zsű
+zs1wh
+zs3zac
+z3szag
+zsza2ké
+zsza2k1ü
+z3szav
+zs3záp
+zs3zás
+z3szem
+zs3zené
+z3szer
+z3szé
+zsz2f
+z3szi
+zszind2
+z3szí
+z3sz2k
+zsz2l
+z3szo
+z3szó
+z3szö
+zsz2p
+zs3zs
+zsz2t2
+z3szü
+z3szű
+zt1abla
+z2t1a2bor
+z2t1a2cé
+z2ta2dal
+zt1a2dat
+zt1a2dó
+z2t1agre
+z2t1a2ká
+z2t1akc
+z2t1akk
+zt1akn
+ztaköz1
+z2t1akv
+zt1a2lapú
+ztale2l
+zta2lele
+z2t1anal
+ztan2e
+zt1anes
+zt1anké
+zta2n1ó2
+zt1a2nyag
+zt1anyak
+zt1anyas
+zt1anyád
+zt1anyám
+zt1anyáu
+z2t1anyu
+zt1a2pán
+zt1a2pás
+zt1a2pát
+z2t1apó
+zt1app
+z2t1aps
+zt1a2puk
+z2t1a2ra.
+zt1arán
+z2t1arc
+ztaso2
+zta1sp
+zt1assz
+z2taszt
+zt1aszta
+z2tatig
+z2t1atk
+z2t1aty
+z2t1a2ut
+zt1ábr
+ztá2cs
+zt1ácso
+zt1ág.
+z2t1á2ga
+z2táli
+z2t1álm
+ztá2raj
+ztá2r1ass
+zt1árem
+ztá2ris
+z2t1árnö
+zt1árnya
+z2tároc
+z2tárokk
+ztá2r1olt
+ztá2r1óra
+ztár1sm
+ztár1s2p
+ztárt2
+zt1árví
+ztá2sz
+zt1ászo
+zt1ászt
+z2t1átha
+z2t1áts
+z2t1átv
+ztávi2
+ztá2v1ir
+zt1bl
+zt1dr
+z2t1e2b
+z2t1ef
+z2t1e2gé
+z2t1egy
+z2t1e2ke.
+z2t1e2kés
+z2t1ela
+z2t1elá
+z2t1elb
+z2t1e2legy
+z2t1e2leme
+z2t1e2lemm
+z2telemz
+z2t1elf
+z2t1eljá
+z2t1ellát
+z2t1elm
+z2telnö
+z2t1e2lo
+zt1e2lőadá
+z2t1e2lőc
+z2t1elr
+z2t1eltá
+z2t1elto
+z2t1ember
+z2t1e2mel
+z2t1eml
+z2tent
+zt1ente
+zte2raj
+zte2rak
+zte2rál
+zte2rár
+z2terde
+ztere2ot
+zte2repo
+zte2rill
+zte2ris
+zte2riz
+zte2rosz
+z2t1e2rot
+z2t1e2ró
+z2t1erő
+zte2r1ü2lé
+zte2sz
+z2t1esze
+z2t1eszé
+z2t1eszk
+z2t1ezr
+zt1ég.
+zt1égb
+zt1é2gé
+zt1égr
+z2t1é2j
+zté2k1e2l
+z2t1ékné
+z2t1é2le
+z2télé
+zt1é2lés
+z2t1élm
+z2t1é2lő
+z2t1élt
+zt1élű
+z2t1épü
+zté2rá
+z2t1érd
+z2t1érl
+z2t1érté
+z2t1érz
+zté2sz
+z2t1észh
+z2t1észn
+zté2tét
+z2t1étk
+zt1é2ves.
+zt1évt
+zt1fl
+zt1fr
+zt1gr
+z1t2hen
+ztia2g
+zt1i2den
+z2t1idé
+z2tidi
+z2t1ifj
+z2t1i2gé
+z2t1i2kon
+z2t1ille
+z2timá
+z2t1imp
+z2t1ind
+z2tinfe
+z2t1info
+z2t1ing.
+z2t1ingá
+z2t1ingb
+z2t1inge
+z2t1ingé
+z2t1ingg
+z2tingu
+z2t1inte
+z2t1inté
+z2t1invá
+zti2p
+z2t1ipa
+z2t1irá
+z2t1isk
+z2t1ism
+z2t1istá
+z2t1iste
+z2tital
+z2t1i2tat
+z2t1íj
+z2t1í2r
+zt1í2veke
+zt1kl
+zt1kr
+zt1kv
+z2toi
+z2t1o2koz
+z2t1oltó
+zto2lyag
+zt1ope
+zto2ras
+zto2r1e
+z2t1orgi
+ztorkész1
+zt1ornam
+z2torrú
+z2torvo
+z2t1oszl
+zt1osztá
+ztóá2
+ztóigaz1
+z2t1ó2ni
+ztó1p2
+ztó1sp
+ztó1tr
+zt1öko
+ztö2l
+z2t1öle
+ztön3n
+ztö2röks
+z2t1öss
+zt1ö2vez
+zt1övig
+z2t1öz
+ztőa2
+ztőe2l
+ztőé2b
+z2t1őrh
+zt1őrl
+z2t1őrs
+zt1ő2sei
+z2t1ő2sö
+zt1ősű
+zt1pl
+zt1pr
+zt1ps
+z1tranz
+zt2rádá
+z1t2rág
+z1tréf
+z1t2rén
+z1trikó
+z1tril
+z1t2rió
+z1t2rü
+zt1sl
+zt1sn
+zt1sp
+zt1st
+zt1sz
+zt1t2r
+z2t1udv
+z2t1ug
+z2t1ura
+z2t1uru
+ztus3s
+zt1u2tat
+z2t1utu
+z2t1új
+z2t1úr.
+z2t1úrb
+z2t1ú2ré
+z2t1úrh
+z2t1ú2ri
+z2t1úrk
+z2t1úrn
+z2t1ú2ro
+z2t1úrr
+z2t1úrt
+z2t1üg
+ztü2lé
+z2t1ülés
+ztül1l
+z2t1üt
+z2t1ü2v
+zt1ü2zem
+z2t1űr.
+z2t1ű2ri
+z2tye
+1zu
+zu2b1a
+3zubb
+zu2b1i
+zu2bu
+zu2c3s
+3zug.
+zu2gag
+zu2gap
+zu2gáru
+zu2g1ás
+3zugb
+zu2g1e2
+zu2gé
+zu2gin
+zu2git
+zu2giv
+zu2gí
+3zugo
+zu2g1or
+zu2gö
+zu2gü
+zu2gű
+3zuha
+zule2
+zu2lel
+zu2l1enc
+zu2l1es
+zuli2ná
+zu2lú
+zulya2
+zu2ly1ag
+zu2mab
+zu2m1a2d
+zu2maj
+zu2mal
+zu2mar
+zu2m1as
+zume2
+zumegyez1
+zu2mel
+zu2m1en
+zu2mél
+zu2m1é2n
+zu2m1id
+zu2m1in
+zu2m1i2p
+zu2mí
+zumkész1
+zu2mol
+zu2mő
+zu2mur
+zu2mü
+2zund
+z1undo
+zu2ne
+zu2n1é
+2zuni
+zu2n1ö2
+zu2ral
+zu2ram
+zurat2
+2z1urn
+zu2rú
+zu2sad
+zus1aka
+zu2sal
+zusa2n
+zus1any
+zu2sas
+zu2s1ág
+zu2s1e2
+zu2s1érté
+zu2sis
+zu2s1í
+zuskész1
+zu2s1ol
+zu2s1ó2
+zu2ső
+zuss2
+zussz2
+zus3sze
+zus3szi
+zust2
+zus1tr
+zu2s1ü2
+zu2sz1i2k
+zu2szon
+zu2s3zó
+2z1u2ta
+z1u2tá
+2z1utc
+zu2tol
+zu2tó.
+zu2tób
+zu2tói
+zu2tój
+zu2tón
+z1u2tu
+1zú
+zú1dr
+zú1fl
+3zúgá
+z1újd
+z1ú2jé
+z1ú2jí
+z1újs
+zú2r1e2
+zúré2t
+z1ú2szás
+zú2té.
+z1ú2tér
+z1úth
+z1úti
+zú2ti.
+zú2tiak.
+3z2útiaka
+zú2tiakr
+zú2tib
+zú2tig
+zú2tih
+zú2tin
+zú2tiv
+z1ú2tí
+z1útj
+z1útn
+z1ú2ton
+z1útró
+z1útt
+zú2tü
+z1útv
+3zúzá
+3zúzd
+3zúzó
+1zü
+zü2dü
+zügy1és
+z1ügyk
+z1üldö
+z1ü2lep
+z1ü2lőseb
+z1ü2lőset
+zü2ni
+2zünn
+zü2rí
+z1ü2rü
+z1ü2te
+z1ü2té
+z1ütk
+z1ü2tő
+zü2ve
+zü2vö
+zü2zen
+z1üzl
+1zű
+zű2csa
+zű2csá
+zű2csip
+zű2cs1o
+zű2ra
+zű2rá
+zűrés3s
+zű2r1i2z
+z1űrla
+zű2ró
+zű2ru
+zű2z1a2
+zű2z1á
+zű2ze
+zűzé2r
+zű2z1ére
+zű2zo
+z1ű2ző
+zű2zs
+zű2zú
+zva2su
+zvárosé2
+zváro2s1om
+zve2gya
+zvé2nyel
+z2vit.
+zvi2tác
+z2vitj
+zy1ak
+z1yar
+zy2be
+zy2je
+zy2ne
+zy2né
+zy2re
+zy2rő
+zy2sa
+zy2so
+zy2tő
+zy2ve
+z2z1áll
+zzá2r1ó2r
+zzát2
+zzá1tr
+zzi2n1é2
+zz2le
+zz1ly
+z2zs
+z3zsák
+z3zsám
+z3zsi
+z3zsí
+z3zso} \ No newline at end of file
diff --git a/tex/context/patterns/lang-hu.rme b/tex/context/patterns/lang-hu.rme
new file mode 100644
index 000000000..049dfe06a
--- /dev/null
+++ b/tex/context/patterns/lang-hu.rme
@@ -0,0 +1,11 @@
+% generated by mtxrun --script pattern --convert
+
+% Huhyphn - hungarian hyphenation patterns v20081106
+%
+% Copyright (C) 2003-2008, Bence Nagy <nagybence@tipogral.hu>
+% This file can be distributed under the terms of the
+% GNU General Public License version 2.
+%
+% Encoding: UTF8
+%
+\message{Huhyphn - hungarian hyphenation patterns v20081106} \ No newline at end of file
diff --git a/tex/context/patterns/lang-is.hyp b/tex/context/patterns/lang-is.hyp
new file mode 100644
index 000000000..5b7b550fb
--- /dev/null
+++ b/tex/context/patterns/lang-is.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-is.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-is.pat b/tex/context/patterns/lang-is.pat
new file mode 100644
index 000000000..4069fa0ed
--- /dev/null
+++ b/tex/context/patterns/lang-is.pat
@@ -0,0 +1,4195 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-is.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z á æ é í ð ó ö ú ý þ
+
+\patterns{
+.að3
+.aða4
+.aðk2
+.aðl4a
+.af3n
+.af3re
+.afr3í
+.af1s4
+.agn5ú
+.al3e
+.al4l
+.am4s
+.an3k
+.ann4e
+.ar2
+.ar3a4b5
+.arth5
+.asp3
+.aum5a
+.ám4
+.án4a
+.ba4
+.da4
+.dam5a
+.dav3
+.dr4
+.ds4
+.du4
+.dust5
+.ed5ik
+.eftir5
+.eigin5g
+.eink4
+.ekt4
+.er4m
+.eyf2
+.fa4
+.fi4
+.fjár3
+.fl4
+.fla4
+.fr4
+.frá1
+.ga2
+.gar4
+.gas5l
+.gd4
+.gem5
+.gja2
+.gl2
+.gr4
+.gu4
+.her5sk
+.il4
+.ingj5
+.is4m
+.ís1l
+.ja2
+.jar4
+.ka4
+.kal5e
+.kam5e
+.kapí3
+.kart5
+.kast3
+.kn4
+.kr4
+.kur4
+.la4
+.lag5e
+.leik5sv
+.líb5
+.lu4
+.ma2
+.maj5
+.mak5r
+.mi4
+.mj4
+.mu4
+.mynst4
+.na2
+.ní5f
+.ný5f
+.ol4íu.
+.óa4
+.óð5al
+.óf4
+.óg2
+.ók4
+.óm4i
+.ós2
+.pa4
+.pl4
+.ra2
+.ram4
+.rí4
+.róð4
+.rúm3
+.saman5
+.sk4
+.ski4
+.skj4
+.skr4
+.sl2
+.sm4
+.smá3l
+.sn4
+.snar5a
+.sp4
+.spr4
+.st4
+.sta2
+.ta4
+.ti2
+.til3
+.tí5f
+.tr4
+.tu2
+.tví1
+.ung3l
+.unn5usta
+.úr1
+.út1
+.út5s
+.vegg5s
+.vist3
+.yfir3
+.ævi3s
+.öfl3
+.ögr5
+.ör3s
+.öt3u
+2a3a4
+a4ab
+a4ad
+2a1á2
+2a1b
+ab4a
+3abís
+a5by
+abæk4l
+4ac
+2a1d4
+a5dó
+a4du
+1að
+4aðað
+að3al
+að3ar
+2aðfa
+4aðfö
+að3g
+að3i
+2aðl
+að4li
+4að2m
+2aðsh
+3aðu.
+2aðv
+2a1e
+a5ei
+a4es
+2af
+af3ald
+af3arn
+a3fá
+af4fr
+af3g
+a1fj
+a3fló
+a1flu
+af5ork
+a1fr
+af3ré
+afr4u
+a5fræ
+4afsd
+af1sk
+4afsso
+af2u
+a1ful
+a1fun
+3afurð
+2ag
+a3gau
+ag5ál
+ag5is
+a5gj
+agn4ara
+ag2ne
+ag5ot
+a1gr
+ag4ra
+ags4ið
+ag4sp
+ag4stj
+ag4ul
+ag3æð
+4a1h
+4ai
+a3ið
+a4in
+aí4h
+2aj
+a3jö
+2ak
+akaup4s
+a5ká
+a1ke
+a5kinnin
+a5kistu
+a1kj
+ak5rei
+aks4l
+4akss
+ak3u
+a3kv
+a5ky
+a5ký
+a3kö
+2al
+a1lag
+4aland
+a5landið
+a5landinu
+alas4
+alá4
+a4lem
+al3er
+al1f
+al1g
+5alge
+3alh
+alis4
+al4ín
+al3kj
+alk5s
+al3k2u
+al4lí
+all2s
+allst4
+al4lý
+4almað
+al5mann
+al5m2i
+a3log
+a5lok
+al5op
+a5lóð
+al4sæt
+al5up
+al5ú
+al3v4
+a3ly
+a1læ
+a1lö
+2am
+am3ang
+a3mann
+am3ari
+am3ars
+am3a4s
+am3dr
+a3mí
+am3k
+am2m
+amm4is
+a1mó
+am3se
+ams2i
+am1t
+1an
+3an.
+3ana.
+an3ada
+4anag
+2anal
+4anau
+2aná
+4and.
+and1e
+4an4dí
+andr4
+4andö
+4ane
+an5ei
+2ang
+an4ga
+ang1d
+an4gj
+ang5spi
+an2g3ö
+4anib
+4anið
+an5ín
+2ank
+ank5l
+ank3v
+3anm
+ann5d
+4annf
+4annh
+ann1k
+4annl
+4anns
+annsk4
+4an4o
+anst4
+an3sti
+an3tí
+3anu
+4anú
+4aný
+4anæ
+4anö
+2a3o
+2a3ó
+2ap
+ap3al
+a3per
+a3pil
+a3po
+a5pre
+ap3te
+a5p4un
+a5pör
+1ar
+3ar.
+ar3afu
+ara5kr
+ar3ang
+4arani
+ar4arp
+ar2as
+ar5ast.
+ar3au
+2ará4
+4aráð
+5ar3ák
+3ar3ár
+3ar1ás
+ar1át
+3ard2
+4ardí
+4arð.
+arðar5á
+4arði
+4arðs
+3arðu.
+2are
+3ar1ef
+4aref.
+5areig
+5arein
+a3rek
+ar3el
+ar3en
+ar5er
+a3ret
+4a1ré
+2arf
+3arfe
+3arfé
+arfs3k
+ar1fu
+ar3gj
+ar4græ
+args4
+arg3sl
+4ar5ið
+4arif
+ar3in
+ar4ind
+ar5ist.
+4a5rit
+4a1rí
+ar3j4
+4ark.
+ark4is
+ar5kj
+ar3kr4
+4arms
+ar3mú
+4arna.
+4aroð
+4arol
+4arot
+2aró
+2arp
+4arra
+arr2i
+arr4u
+ar4sá
+3arse
+ar1sk
+ar4spi
+arst4
+5arstí
+ar3su
+ar5til
+artr2
+ar5trað
+ar3u
+ar4uð
+4ar4ug
+5arum
+2ar1ú
+a5rús
+ar3v4
+ar3yf
+4arý
+2aræ
+a3ræð
+ar5æv
+4arö
+as2
+4a1sa
+as3an
+2a3sá
+4ase
+4asé
+2asi
+a5sinna
+2asj
+4a1sk
+2asl
+a3slag
+2a1sm
+4asn
+4aso
+4asó
+2asp
+aspít4
+4ass
+ass4v
+1ast
+4astað
+ast4and
+4astau
+4aste
+4asté
+4astig
+4astin
+ast4ing
+4astirð
+4a1stí
+4astj
+ast3l
+4asto
+2astó
+4astrá
+ast5ráð
+4astrí
+4a3stræ
+4aströ
+4astul
+4a3st4un
+4astú
+4a3sty
+4astæ
+4astö
+2a1su
+2a1sv
+4as4y
+2asý
+4asæ
+2asö
+2at
+at3að
+a3tak
+a3tal
+at4anv
+ata4r
+a1te
+at3ey
+3ath
+a1til
+a3tj
+3atk
+atns3
+a4tó
+atr4a
+at1re
+3at1ri
+at2sp
+a5t2un
+a1tú
+at4ve
+3atvi
+a1tö
+2a4u2
+4auð.
+auð5li
+5auðn
+aug4as
+au4m
+aum5ba
+aum5un
+aun5dr
+aup5e
+aup3l
+a5upp
+au4s
+ausa5m
+au4t
+2a1ú
+2a1v
+av4ar.
+a3vir
+2ay
+a5yf
+4az
+2a1þ
+a2þó
+2a3æ
+4a5ö
+á1a
+áak4
+áa5lo
+á1b
+á4bu
+á1d4
+4áð
+áð2s
+áð3sn
+áð3sta
+áð2u
+áð3us
+á1e
+áf2
+á5fá
+á5fí
+á3fl
+áflæð4
+áf5un
+ág2i
+ágl4
+ágr2
+ág1s
+ág3v
+á1h
+á1i
+ák2a
+ákam4
+ákap4
+ákó4
+ála3m
+ál3arf
+ál2as
+á5lau
+á3let
+álf3d4
+álf5sk
+ál4m
+álm5an
+álm5u
+álp3
+ál4se
+ál5sva
+ál5ug
+á5lú
+ál3æð
+2ám
+ámál5a
+ámsl4
+á2n
+án4aro
+án2as
+án4o
+á3ný
+5ánæ
+á3o
+4áp
+ára5g
+ár3an
+árar4
+á5ré
+ár3f4
+ár5g
+ár5k4
+ár1m
+árns4
+árn5sl
+ár2st
+ár5t
+ár1u
+ár3v
+á5ræ
+ás5en
+á1sk
+á2ska
+á4ske
+á3s4l
+ás2m
+ást2
+ást5i
+ást5ráð
+ást5rík
+ást5v
+4ásu4
+ás5va
+át3að
+á1te
+átr4as
+áttar3
+5áttin.
+átt3un
+á1tæ
+á1u
+áuk4
+á3ve
+á3ví
+á1væ
+á1þ
+á5æð
+b2a
+4ba.
+baðk4
+ba4h
+bak5sl
+ba2n
+4bana
+4baní
+bank5an
+4bans
+b5ant
+bar2b
+barð4as
+bar2n
+bá4s
+2b4b
+bb3að
+bb3an
+bb5arn
+bb3i
+bb3uð
+1be
+bess4
+b2i2
+bið5i
+bið5lis
+bið5r4
+bif1
+bilj5
+bill5
+4binn
+bisk3
+b4it
+bit2a
+4bía
+2b3ís
+2b3íu
+3bj
+bjar2
+b4l2
+bl4íunn
+4bn
+5bo
+3bó4
+bók3s
+b4r2
+br5að
+bra4s
+3bro
+br4u
+3brú
+4bum4
+bur2
+3burð
+burst5að
+bu4s
+1bú
+búf4
+bú3sta
+1by
+1bý
+bæk2i
+bæn4a
+1bær
+b5ættism
+1bö
+4böki
+c4a
+ci4
+ck4
+4da.
+daf4
+dak2
+3dal.
+5dals
+da1m4
+d5ang
+d4aní
+d4arad
+d4ar4að
+dar4ár
+d3arf
+d5arp
+dask4
+da3sl
+4dav
+d1b
+2dd
+4dea
+d5ef
+3deg
+1deil
+d1en
+d5eó
+5dep
+d1f4
+d1g2
+d4gi
+d1h
+d1i
+di5fu
+d3ill
+dim4
+di3ma
+di3nav
+d2ine
+dir3s
+dí3d
+d5íð
+d5ínu
+3dís
+dív3
+3dj4
+djarf5a
+d1k2
+d1l2
+d2la
+dl3að
+d3lag
+d3lau
+d4lið
+dl3u
+d1m
+d5olf
+d5óð
+d3óf
+dó5lí
+1dó2m
+dóm5an
+dó5ne
+3dór
+dó2s
+dós5e
+4dq
+d5raðf
+dr4aðs5
+d5raðst
+drafn4
+dr4ara
+3dreg
+d5reip
+d5rey
+d5riða
+d3rík
+d5roð
+dru4
+d4ræt
+2ds
+d5sal
+d4sjö
+dsk2
+ds4ko
+ds5kun
+ds1l
+d5snö
+ds1s4
+d1st4
+d4sti
+ds4uð
+d4söf
+d1t2
+d1u
+duf4
+5duft
+duk4
+d4umb
+du5ræ
+d4usta
+d3ún
+dún4a
+dút4
+d1v4
+4dw
+1dy
+1dý
+d3þ
+1dæ
+4dæf
+4dær
+3dö
+ð1a
+ðaf4
+ða3g
+ðak4
+ð4albo
+ð3ald
+ðal4is
+ð4a1m4
+ð3a4n
+ðanmeg4
+ðar1a
+ð3ar3f
+ðar3l
+ðar4lis
+ðar3t4
+ð3arú
+ðat4a
+ð3au
+ð3á2
+ð1b
+ð1d2
+ð1e
+ð3f4
+ð1g
+ð2ga
+ð2gi
+ðg4l
+ð4gn
+ðgu4
+ð3g4ul
+ð1h
+ð1i
+ði3g
+ðik4
+ð3in
+ðis5l
+ðist4
+ð4ista
+ðis4ve
+ðj3as
+ð3jó
+ð4ju
+ð3ke
+ð1kr
+ðk2un
+ð3kunn
+ð1kv
+ð1lá
+ðl2in
+ðl4ist
+ð3lí
+ðl4ur
+ð1læ
+ð1m2
+ðnum4
+ð3o
+ð3ó
+ð1p2
+ðr5át
+ð1re
+ð1ré
+ð3rik
+ð3rík
+ð5ró
+ðr1u
+ð3rú
+ð1ræ
+ðræðis5
+ðs5afl
+ðs5á
+ð4seg
+ðs4inn
+ð1sk
+ðskr4
+ð4skú
+ðs5kv
+ð4skö
+ðs4lu
+ð2so
+ðs3or
+ðss4
+ð1st2
+ð2stí
+ð3stö
+ðs4u
+ð4svi
+ð2sæ
+ð1t4
+ð1u
+ð3uð
+ð3ug
+ð3ull
+ð5uls
+ð5unn
+ð3unu
+ð3ur
+ður5á
+ður3f
+ður5g4
+ður5st
+ð1v
+ðv5að
+ðv3ann
+ðv3arn
+ð1y
+ð5ý
+ð1þ
+eat4
+ebr5e
+ed4e
+e1dik
+ed3it
+eð3a2
+eðal1
+eð3il
+eð4is
+e2f
+e3fal
+ef3i
+efj5an
+ef4n
+4eft.
+2efts5
+eg4ge
+eg3i
+egr5u
+eg3u4l
+egur4s
+e4i
+eið5ar
+eið4st
+eif4as
+ei4ka
+eik3li
+eik3u
+eil3ag
+eil5ö
+ei2m
+eim5u
+eing4
+1eink
+4eino
+eist5að
+e4k
+ek2is
+ekj5a
+ekn3
+ek3u
+ek5ú
+e2l
+el5ás
+el4d
+el3eg
+elf3in
+el4gr
+el1i
+4elí
+el3ín
+el4ke
+el2l
+ell5an
+ell3e
+elleg4
+el3ó
+el3r
+el1sí
+5elsk
+el4te
+elu5s
+e2m
+em4ba
+1embe
+em5ens
+em3i4
+emj3
+em4l
+eml2i
+empl5
+em5u
+e2n
+4enc
+en4g
+eng3a
+enik4
+2enn
+enn4t
+en4t
+ep4h
+ep3i
+epl5i
+e4pr
+ep4t
+e4r
+er3al
+er5au
+er5á
+4erð
+5ere
+er5et
+erf5ar
+er2fr
+erf3u
+erg5l
+er4gr
+er3i
+er2k
+er4la
+erl3i
+er4lí
+er4mi
+erm5in
+er5ól
+er5skj
+er1un
+er2v
+er3ö
+eröf4
+e2s
+es3a
+es4ban
+es4bu
+4esj
+e5ske
+4eso
+esp3a
+es2s
+est3að
+est5ö
+e3sæ
+etik4
+et5ils
+etna4
+et5o
+etr5an
+etr3u
+etul4
+et2us
+ext4u
+5eyrar
+é3b
+é1d
+éð2s
+é3fe
+é1g4
+é5ky
+é1l
+éla4g
+él4ara
+é2li
+é4lj
+él3r
+ér1
+ér4á
+ér4r
+érs4
+ér4un
+ér3v
+é3sm
+étt4ug
+ét4un
+étur4
+f3að
+fa2g
+fa5k
+1fall
+fal4u
+fa4ná
+fa5p4
+f2ar
+f3arð
+f4are
+f4arg
+farka5l
+f3arl
+fast3e
+fá3f
+f5áns
+fá3rá
+fá3ta
+fá3v
+f1b4
+fd2an
+f1dr
+f5dú
+fða4l
+1fe
+f3ef
+f3ein
+3fel
+f3end
+ferl5i
+fer3t
+f1ey
+1fé
+f4fa
+f2fo
+f1fr
+ff4st
+ffær4a
+f1g2
+f2ga
+f2gi
+fg4n
+f1h
+f3ið
+fik4
+f5il.
+f5ili
+f3ill
+f5ils
+f5ilv
+fim3a
+f4ine
+f3inu
+3firði
+f3irðu
+firg2
+f3irn
+1firs
+3f4isk
+fi5so
+f3ist.
+f3istu
+fis5v
+fí4
+f5íkv
+f3ís
+fj4a
+fj5aðu
+fj5ann
+fj4e
+f1k2
+fl3and
+fl4at
+3flata
+f5lát
+f4len
+fl5g
+1flo
+5flut
+flv4
+4flý
+1flö
+f1m
+4fn
+fn1g
+f5n4í
+fn3k
+fn5ok
+1fo
+4fop
+forf4
+fork4
+1fó
+fr2
+4fra.
+fr3að
+fra4m
+fram3l
+fr5and
+4frar
+2fri.
+fr5in
+frí5m4
+f3róf
+fru4
+fr3uð
+1fræ
+2f3ræk
+4fræn
+fs3á
+f4sel
+f4skaf
+fsl4
+fs3li
+fs5na
+f2so
+fs5or
+fsr4
+fss4
+f4sti
+f5s4tæ
+fs1v
+f4sæ
+ft3að
+fta4sk
+ft5á
+f3te
+ft2s
+fts5l
+ft3u
+ft4ul
+f1u
+4fu.
+f3uð
+3fugl
+fund4as
+2f3ur
+5furðul
+fur5e
+furs4
+fur3t
+4f2us
+f5ust.
+f3ustu
+f1v4
+1fy
+f3yrt
+f1þ
+1fæ
+1fö
+för4l
+g1a
+4ga.
+4g3að
+gaf4ar
+gagl4
+3gagn
+gak4
+ga4lag
+gal4is
+5gals
+5galt
+gam3al
+gam4i
+g5and
+1gang
+gap4a
+g4ard.
+g2arð
+3garð.
+3garða
+3garði
+3garð4s
+5garður
+g3ar3f
+gar4kl
+gar3l
+gar3t
+4gas
+g4as.
+g4así
+g3ast.
+ga5stað
+1gata
+gat4r
+gá2
+3gáf
+gá5le
+g1b
+gd4ans
+g3de
+g4du
+gd4v
+gð4aro
+1ge
+3gei
+2g1el
+gen4
+g5end
+3geng
+g3ent
+5gerð
+ger5í
+germ4
+gerv5a
+get3r
+g1f2
+ggis5
+ggjaf3
+ggj5ar
+gg5rá
+gg3ræ
+ggs4v
+gg3ug
+gg2v
+g4gö
+g1h
+g1i
+4gi.
+4gik
+gi5kv
+3gild
+g5ill
+5gilt
+gim4a
+4g3i4n
+gis4a
+g4isp
+g5istæ
+gír5a
+gís4
+gjaf5ar
+gjaf5o
+gjak4
+gjal4
+gj4asta
+1gjö
+g1k4
+gkal4
+g1lá
+g4leð
+g3leg
+gl5é
+gl3f2
+g3lit
+g5lín
+gl3ót
+glsk4
+3glugg
+glu3s
+gl4y
+g3lær
+g1m4
+gnap4
+gnart4
+g4ná
+gn3g
+g3nó
+gn4se
+gn5ug
+g4ný.
+3gol
+g3or
+3góð
+gór5
+gó4ur
+g1p
+g3rak4
+gr4an
+gra2s
+gras5sv
+g2rá
+1grei
+g3reis
+g5reyð
+gr2i
+2gri.
+grið4
+g3rík
+3gró
+3grund
+3grunn
+g3ræði
+g2ræn
+4gs
+gs1á
+g4sei
+gsk4
+gs4len
+gsl2u
+gs4lö
+gs3m
+gs5or
+gs3s4
+gs4si
+gs1v
+gt3að
+g3te
+gt4s
+2g1u
+g4uði
+guðl4
+5g2uðs
+guð4só
+g3uðu
+5gufu
+gu4lagi
+g5ulin
+g3ull
+g3uls
+gu5mið
+g3un
+gurf4
+gur3g
+g4usta
+g3ú
+gúst5a
+g1v
+g2va
+g3val
+5gyð
+g1þ
+1gæ
+gæð4as
+gæl4
+gær3
+1gö4
+h2a4
+4ha.
+hað4
+haf4sp
+hand5r
+hat3r
+há3g
+hál4
+há3re
+há4ski
+há5sta
+hás4u
+hát4
+há5ti
+hátr4
+há1v
+he4
+hei2
+hellis5
+hen2r
+herk4
+her3l4
+hersk4
+4hersla
+hey5st
+4hg
+h4i
+hig4
+him5b
+hin4
+hit4as
+hit4n
+2hí2
+h5ía
+hí5b
+hj4
+h2l2
+4hl.
+4hls
+hlu4
+h4n2
+hnja4
+hnjá3l
+holl3u
+horm5
+hó2
+hóm5e
+hót3
+hr4
+4hs
+hu4
+hug1r
+hug3u
+hul5i
+hundr4
+hú2
+húm3
+4húr
+hús5k
+hv4
+hvar4
+hvik3
+5hy
+hæf5a
+hætt4us
+höst3
+2ia
+i5as
+4i5á
+4i1b
+ibb3
+ibl3í
+4ic
+2id4
+i3da
+i1de
+i3dr
+1ið.
+4iðf
+2ið3g
+ið5jarð
+4iðr
+4iðs
+ið5sal
+2iðu
+4ie
+i3ef
+4if
+if5arn
+ifat4
+i2fen
+if4g
+if3is
+if4t
+i4fy
+4i2g
+iga3m
+igð5u
+ig1en
+ig5rí
+2i1h
+2ii
+i5ið
+4ij
+4ik
+ik5á
+ik3i
+ik4is
+ikt5o
+i4kvö
+2il
+ila2g
+il4ara
+i1lá
+4ile
+ilf4a
+il1fi
+il1g4
+i5liðu
+il5in
+il3ip
+il5ís
+ilí4um
+il4kv
+il3lag
+ill5an
+il3lá
+i1lo
+il4sa
+il1sk
+il3sn
+ilst4
+ilæk4
+i5lön
+4im
+im4b
+imb3u
+im3i
+im4ið
+im4la
+im4m
+i5mó
+im4sv
+1i2n
+4inaf
+in3an
+4inar
+inat5r
+2i3nau
+2ina2v
+inav3í
+4iná
+4ind.
+in4ga
+ingj6arni
+4ingr
+ingv4
+2inns
+2innu
+in1o
+4inó
+in1s4k
+in2sp
+in3sta
+in5ul
+4iný
+2i3o
+4ió
+2ip
+i5pil
+3ir.
+4ira
+2i1rá
+2irði
+4irðn
+4ire
+4iré
+irf2i
+4irfs
+4irig
+2irit
+4i1rí
+2irk
+irk3u
+ir3l
+ir1m4
+4irnd
+4irni.
+4irnin
+4irnis
+4iró
+irs4á
+irst4
+ir3tal
+irt5i
+4irtl
+irt4ö
+ir3ug
+4irú
+4irö
+i2s
+1is.
+2isa
+4isag
+i5saga
+i3sam
+is2as
+3isd
+2ise
+4ishv
+3isins
+4isí4
+4isj
+i3sjó
+2isk
+is4ka
+isk5el
+iski3m
+isk5inn.
+3isko
+isk2u
+isk1v
+5iskö
+2islé
+is3læ
+5isma
+is5me
+4isni
+isp3að
+isp3u
+iss2i
+is5sú
+ist3al
+2iste
+4isté
+4istig
+i5stik
+ist4is
+ist5ín
+4isto
+4istó
+4isty
+4istæ
+2istö
+is5tök
+is1v
+4isvi
+is4við
+5isvin
+i3svæ
+2isö
+2it
+it3að
+it5ann
+i5tei
+4ith
+it4ha
+it5ill
+itis4m
+it2ka
+itn5es
+it3rí
+it4stö
+it3un
+it4urn
+it4ve
+4iu
+4iú
+4i1v
+i2v5ís
+4ixs
+2i3þ
+4iæ
+4iö
+í1a
+4í5ak
+íal3
+í5ald
+í3ali
+í2as
+í5at
+í5au
+í5á
+íb4a
+í5bar
+í4be
+5íbú
+í5dag
+íð2s3
+íðsk4
+í3el
+í3en
+íet3n
+í5ett
+í2f
+íf3eð
+í4f3i
+íf5rí
+ífs3k
+íf4sp
+í2g
+íg3e
+í3gil
+í1h
+í1i
+ík3a4
+4ík4anar
+4ík4ani
+ík5is
+íkk2i
+5íkm
+ík2n
+íkn5e
+ík4s
+ík3us
+2íl
+ílak4
+íl2as
+íl5ár
+íl5f4
+í3lí
+5ílmá
+íl3sk
+4ím
+ím3að
+íma3l4
+ím3an
+ím4g
+ím5o
+ím5t
+ím3un
+í2n
+í5ná
+ín5e
+ín3ge
+ín5t
+ínu3g4
+ín3ú
+í3óp
+íóp5íu
+4íp
+ír5ak
+íra4s
+í4r5i
+ír4sv
+ír3t
+í1ræ
+ír5ö
+í2se
+í4s5j
+ísl2
+3íslen
+ísl5i
+ís2m
+í2st
+ís5ter
+ít5að
+ít5als
+ít3i
+ítj5
+ít3re
+ítr5ó
+4íub
+í5uð
+4íul
+íu1ma
+í3un
+íu5p
+í3ur
+í4ura
+4íusa
+íu3t
+4íuv
+ívo4
+í5þ
+j2a
+j3að
+j5aði
+3jaf4n
+ja5kl
+jal2
+jal5ið
+ja5ló
+j4am
+j3an
+j4aram
+j3ari
+jark4i
+jarn4ið
+j4aræ
+jas4
+jask4u
+j3ast
+jál5as
+jál4f
+jálf3a
+3járn
+jár4u
+jáv3
+jávar5
+j1e
+jend4a
+j4ep
+j4er
+j4et
+j1i
+jó5b
+jó5fr
+jó2s
+jó5ug
+jó3ve
+j1u
+juf4
+jug2
+jug5as
+ju4gó
+j4u1l2
+jur4e
+5j2urt
+jurt4i
+j2us4
+j3ust.
+3jöfn
+3jök
+jöl3k
+jöl1m
+kað4s
+kaf4an
+ka4fr
+kag4as
+ka4j
+kaj5a
+kak4l
+kal2
+3kald
+4kalf
+k4all
+3kam4b
+kam2s5
+k3ana
+k4anaf
+k3ann.
+k4anó
+k4ant
+5kanta
+4kapa
+kark4
+1k2ar2l
+k4arm
+k3arn
+kar2r
+k4art
+kar4v
+kask4
+3kass
+5kastal
+k5astu.
+1kau
+5kaup
+kák5
+kám3
+k1b
+k1d4
+2k1end
+3kenn
+3kerf
+5kerl
+ker4m
+k1f4
+kfalls5
+k3g
+kgl4
+k1h
+k3ið
+kið5l
+kig4
+k5ill
+k5ilsi
+kim2
+k5ing
+k4ip
+k1ir
+k3irð
+5kirk
+k5irn
+k4irt
+k1is
+k5ise
+kisk4
+k3ist.
+k4it
+ki3te
+3kíl
+kís3
+kít3u
+kja4l
+kjar4a
+kjar5f
+kju3g
+1kjö
+3kjör
+kka5l
+kk5e
+kkj1ó
+k2kl
+kk1lá
+kk4li
+kk3rí
+kk4se
+kkul4
+kkv5ið
+kl2
+kl3að
+kl3ann
+klá4
+5klef
+kleif5a
+k4lem
+k1lin
+3klj
+3kluk
+3klú
+1klæ
+k1m2
+k4mið.
+kn3ar
+k2ney
+kni5svi
+3knú
+1ko
+2kob
+koff5
+kol5d
+kol4l
+kol5sv
+3kon
+4kons
+3kos
+kot4as
+kó3d
+kó3m4
+kór5a
+k1ótt
+kra5l
+kr2as
+k2rá
+k5ré
+kr2i
+krif3a
+1krö
+3kröf
+4ks
+ks4lí
+ks4lö
+ks4má
+ks4n
+ksp4
+k4ste
+k4stó
+k4str
+ksyf4
+kt3að
+kt5er
+k4tí
+k3tora
+k5ty
+2k1u
+k3uð
+k4uði
+kuf4
+kuk4
+kulegr4
+kum4
+kumb5
+k5un.
+k5una.
+k3unar
+k5uni
+5kunnátta
+k3unu
+k3ups
+k2urð
+kur5k
+k2us
+ku5sl
+k3ust.
+k5ustum
+ku3sty
+kú2
+3kúlu
+k3ún
+kú3re
+kút4us
+3kven
+4kvé
+4kvu
+kv4un.
+1k4væ
+3kvö
+4kvör
+k5þ
+3kök
+5köld
+5könn
+5kös
+2la.
+4lac
+la4dan
+2lað
+lað4al
+4laf
+laf4as
+laf4r
+l3afs
+3lagð
+4lage
+2lak
+la5kó
+la1l2
+l3ald
+lam4b
+2lana
+l2and
+3land.
+3lands
+1lang
+lank5as
+4lann
+l5anna.
+l4anó
+lan4t
+la3pl4
+2lar
+l4aram
+l4are
+larg4
+l4aris
+l3arn
+la3ró
+lart4
+l4ary
+2las
+las3i
+las3le
+la5sli
+last5að
+lat3ín
+lat4u
+1lau
+2laum
+laut5as
+lá2g
+lám5a
+lán5e
+4lár
+lá4t
+5látum
+lá3v
+2l1b
+2ld
+ld3ar
+ld3d
+ldem4
+ld3ey
+ldig4
+ldr4as
+ld5rau
+l4dri
+ld5ro
+ldr3ó
+1le
+4le.
+2lef
+l1efn
+4legn
+leif5as
+leik3v
+4lein
+4lek
+4lel
+4lenn
+4lep
+2ler
+le5rí
+les5e
+2let
+l3ex
+2ley.
+4leyj
+2leym
+lf4as
+lf5át
+lf4dr
+lf3f
+lf2i
+lf5inn.
+l3fj
+lf2l
+lfla4
+l4fó
+lf4sp
+lftr4
+lft4un
+4lg
+lg2a
+lgar4s
+lg5ast
+l1gá
+l4ges
+lgil4
+lg4isi
+lg3í
+lgl4
+lgni5s
+l1gr
+lg4ú
+l1h
+4li.
+lik4a
+li5kv
+lil2
+li5la
+li3li
+l2ind
+4lingsá
+l3inn
+l5inn.
+2l3inu
+4l3ir
+l1is
+l5is.
+l4isá
+l3isi
+lisk4
+l5isr
+l4isti
+l5istu.
+lit4ar
+3litl
+l3ía.
+lí4b
+1líf
+líf5a
+lík3k
+lím5ug
+4líp
+1lít
+l1íu
+l4íuf
+l4íuh
+l4íutr
+lj3ar
+lj5arð
+1ljós
+ljós5k
+ljós3l
+lj3ug
+ljur4
+lj4uru
+2lk
+lkap4
+lk4as
+l1ke
+l3kr
+l3kúr
+l1kv
+l3ky
+2ll
+ll3et
+l4ley
+ll3f
+ll1g2
+ll3iða
+lli3g
+lliss4
+l1lit
+llít4
+ll3k4
+ll3m
+ll1ót
+lls5tæ
+ll5te
+ll5ug
+ll3v
+2lm
+lm5ari
+lm3ars
+lmb4
+l3me
+l1mó
+lnar4
+ln4ið
+l5no
+lo4
+5loð
+5loki
+4lon
+4l1or
+5los
+lóð3r
+ló5gr
+ló4ma
+lp5t
+2l1r
+l2ri
+l3rit
+2ls
+lsí4
+l2sj4
+l5skin
+ls4kon
+ls4nesi
+l3stað
+lst4in
+ls1ve
+4lt
+lt3að
+l5til
+lt4s
+lt4ú
+l1tæ
+2lu
+4lu.
+l3uð
+lugl4
+luk4i
+l4u1l4
+l1um
+lu1ma
+l1un
+3lund
+l3unu
+lu5pe
+l1ur
+2l1v
+l2va
+lv3að
+l3val
+l4víu
+ly4
+3lyf
+1lyn
+l1yr
+1lý
+2lýf
+lýt4a
+4lýti
+2l1þ
+1læg
+lækj3
+lækjar5
+5lækk
+1læti
+1lög
+l5öl
+4löt
+m2a
+2ma.
+m4ab
+m4ad
+m3að.
+m3aða
+m3aði
+m3aðr
+m5aðs
+1maðu
+maf4
+m4ag
+3mag4n
+m4ak
+mal4as
+mal3dr
+m3alf
+m3all
+m4alp
+mal4t
+ma1m4
+4man.
+4mana.
+m4aná
+m3anb
+2m3and2
+m3ank
+m3anl
+mann4as
+3manni
+3manns
+mann5t
+2m3ans
+man5sa
+m3ant
+4manu
+ma2r
+m3ara
+m3arb
+m3arð
+1m4ark
+marks5
+m3arn
+mar3o
+mar4s
+mars5m
+m4arú
+m1as
+mask4
+ma4sp
+m3ast.
+1má
+4má.
+3má2l
+mál3f4
+2mám
+má5mu
+má5p
+4már
+4mb
+mb5aði
+m1ban
+mb3i
+mb4ir
+mb3un
+md2as
+md5asta
+md4v
+1me
+4me.
+með3
+m5ef
+megin3
+5m2eis
+meltr4
+m1end
+3menn
+m5erh
+m3er3í
+mest5a
+m1f4
+m4fí
+mför4u
+m1g2
+mgl4
+m1h
+mið3i
+miðr4
+mi3ge
+3mik
+milj3
+mil4l
+millj3
+m3ing
+5minj
+m3inn.
+min4s
+m3inu
+m3ir
+m1is
+mis3k
+mis3lu
+mism4
+2mí
+mjó3sl
+m1k
+m2ka
+mk4arg
+mk4as
+mk2i
+mk4l
+m1l
+m2la
+m3lag
+m3lau
+m2lá
+ml3ár
+m2li
+m5luk
+4mm
+m2m3a
+mm5b
+m4mó
+mm4sv
+mm3u
+m4nesku
+2mog
+4mok
+3mol
+mong5
+mód3
+móð4s
+mó5g4
+m5óní
+mó3rau
+mó4s
+3mót
+mp3á
+m5pe
+mp3i
+m3rau
+m5rá
+m3re
+m3rý
+m1ræ
+4ms
+ms5ál
+m2se
+ms5ei
+m5skau
+ms5kj
+ms5lá
+msn4
+mssetr4
+m1sv
+m4sví
+mt3að
+m4ti
+mt2is
+m3tug
+mt5un
+mt4us
+mt2v
+m1tö
+m1u
+4mu.
+mug4u
+4mul
+4mum
+m2un
+1mund
+m3ung
+4mur
+m4uru
+mu5sta
+m3úð
+múg4u
+m1ún
+mús4a
+m1v4
+1my
+3mý
+mý5m
+m1þ
+1mæ
+1mö
+mör4
+n1a
+4na.
+na2da
+na4dí
+naðar3
+naf4
+nafl4
+nafl5an
+3nafn
+nak4a
+na4kr
+nal2
+na3la
+n3ald
+na3li
+na1ma
+n4anaf
+n5ang
+n5ann
+n4arak
+n3ar3f
+n4arfi
+n4arfö
+narg4
+n4aris
+nar5m
+nar5rin
+n4aru
+n4arú
+nat4
+n5aug
+n3auk
+naum5a
+1ná
+ná1g
+ná1k
+3ná4m
+nán5ast
+n1b
+nbæj4
+nd3er
+nd4isv
+n4dj
+nd3ót
+nd3rek
+ndr1u
+nd1ræ
+nd4sen
+nd3ug
+nd5ul
+ndur5g
+nd3ú
+1ne
+neð2s
+3n2ef
+4nefl
+n4em
+nem5a
+2n1en
+4n4er
+nestr4
+netl4
+n5eyi
+n3eyj
+né5sk
+n1f2
+nfr4
+nga1m
+ng5are
+ng2as
+n2ge
+ng5ek
+n3ger
+n3get
+ng1ey
+ngi5k
+ngil4i
+ngi5lið
+ng5lag
+ngl2i
+ngl5ið
+ng5ólfs
+ng4ra
+ngr5an
+n3grí
+ngr3u
+ng3ræ
+ng4sj
+ng4sp
+ng4ste
+ngurs3
+ngu3t
+n1h
+4n1i
+n4iði
+ni5fr
+ni3gr
+ni3lu
+ni5m
+n4iru
+n3isa
+n4isá
+nisk4
+ni3skó
+nis2m
+nis5s
+ni3ste
+ni5stæ
+n3ía
+n3ísk
+n1íu
+ní4um
+njál4
+nk2
+nk3að
+nk5and
+nk3ans
+n5ká
+n1ke
+nk3i
+n5kó
+n3kunn
+n5ky
+n5kö
+n1l2
+nli4
+n4list.
+n1m4
+n2n
+nn1á
+nn1e
+nn3g2
+nnk4i
+nn4sj
+nn5ske
+nn4sto
+nn5stun
+nn5tó
+nn3ug
+nn2us
+nn3úð
+n1or
+1not
+n5ólf
+5nóttin
+n3p4
+n1r
+n3ram
+n5rau
+n2r4i
+n3rit
+n3sak
+n5sát
+n4seg
+ns5es
+ns5is
+ns1í
+n3skil
+nskír4
+ns5kja
+n5skö
+nsn4a
+ns5r
+nst4e
+nt3að
+n5tak.
+n5taki
+n3tal
+n1te
+ntgen5
+n3til
+n2tí
+nt2s
+nt5sk
+nt5sm
+nt3ug
+nt4v
+n1tý
+n1tö
+n1u
+nuf4
+n4ugr
+nuk2
+nu1l
+nu1ma
+5numd
+nungs3
+nur5f
+nur4l
+n3ust.
+nu5stað
+nu4sv
+nu5ta
+3núm3
+nú4s
+n1v
+n5yf
+n3yrk
+1ný
+n3ýg
+ný3l
+ný5sk
+n1þ
+1næ
+næl4a
+3nöf
+n3öld
+n5ön
+5obs
+oða3l
+oðr4
+oðs5l
+oð4ug
+o2f
+of3ang
+off4u
+of3o
+of5r
+of4sj
+of5su
+oga3l4
+ogast4
+ogs4u
+ok4as
+olak4
+old3u
+ol2g
+oll5eg
+ol5lit
+oll4st
+ol3m
+ol3ó
+oltal4
+o2m
+om3a
+om4m3
+om2u
+om3un
+on3sv
+on4t
+on5tó
+on4us
+opa5p
+op2h3
+op5u4
+ora4
+or4di
+or1e
+or2fe
+or2gr
+3orí
+orlag4
+or2ma
+or4mi
+4orn
+or4ne
+or4sta
+ortr4
+ort3ug
+or1u
+or3ug
+or3v4
+or4við
+or3y
+o4s
+osk3i
+os3m
+os2s
+ost5i
+ost5un
+4o4t
+ot3að
+ota5l4
+otam4
+ot3ro
+ots4á
+ot5un
+o4u
+o3ve
+ox4
+ó1a
+óaflat4
+ó5an
+óar4s
+ób3ak
+ód4a
+óði4
+óðl4
+óðm4
+óðv4
+ó5e
+óf3ar
+óf4as
+óflu5s
+ófr4
+óf5us
+ó2fy
+ó4fö
+ó2g
+ó1h
+ó1i
+ók5lo
+ó3kr
+ók2u
+óla3m
+ól2as
+ól5ik
+ól4is
+ól4kv
+ól5om
+3ólsk
+ó4m3að
+óm3ar
+óm4bæ
+óm2g
+óm4is
+óml4
+óm3p
+óm3stu
+óm3u
+ó2mö
+ó4n
+ón3í
+ón5kv
+óp4e
+óp2h5
+ór4as
+órá4
+ór2d
+ór4dö
+ór5es
+órf4
+órg4
+ó4ri
+ór4is
+órík4
+órj4
+órk4
+órm4
+órn4o
+ór3ón
+órr4
+órs4a
+ór1u
+ósa5f
+ósak4
+ó3sem
+ós3end
+ó5skaf
+ósk4as
+ósk5in
+ós2l
+óslav3
+ó2só
+ósp4
+ós4se
+ó4ta
+ót3að
+ótap4
+ót5ef
+ótil4t
+ó5tí
+ót4ó
+ót2v
+ó1u
+óum5b
+óv4a
+ó5vat
+óy4
+ó5þ
+p1a
+pag4
+pa4le
+pa3m
+pa4n
+pan3gó
+pa2r
+p4arat
+pari3f
+par5í
+p2art
+par5te
+p4aru
+p2ák
+p4ál
+pá5m
+p4ár
+pá2s
+p4át
+p1b
+p5d
+p1el
+1peni
+3pers
+p1f2
+p1g2
+p1h
+p1i
+pil5ar
+5pilt
+p4ink
+pist5i
+pit4
+3píp
+pí2t
+pl2
+pl3að
+pla4s
+p4læ
+3plö
+p1m4
+1pok
+3pós
+p2p
+pp5aks
+pp5e
+pp3í
+ppk4
+pp1l
+pp3ó
+pp1r
+ppsk4
+4pra
+pr2i
+p4ris
+prí4
+3prj
+1pró
+pró5fas
+pró5m
+p1sa
+pss4
+p1st
+pt2ú
+p1u
+puk4i
+pu1l
+pur4a
+3pú
+púf4
+p1v
+qu4
+2ra
+4ra.
+5raðsh
+raf4f
+r3ald
+ral4i
+r4all
+r3als
+3ranal
+r4ani.
+3ranns
+r4anó
+4r3ar
+r4arað
+r4arú
+r4ary
+r4aræ
+ras3i
+ra3tu
+r4aum
+1ráð
+ráf4i
+rá5kvæ
+rárs4
+r4ása
+r1b4
+rba4
+r1d
+r2dí
+r4ð
+rð4ar4á
+rð5is
+rð1l2
+rð4mu
+rð5rá
+rð5su
+rð3sv
+rðv4
+r4ef.
+r4efs
+5reftsk
+1regl
+r3eig
+3reik
+r5enu
+r5eu
+r4eyn
+r4é
+r1fal2
+rfa5li
+rf4ar
+r3fá
+r5feð
+rf1is
+r1fj
+rfjár4
+rf4lö
+rfóg5
+r1fr
+rfr4u
+rf4st
+r3fund
+rf4urð
+rgj4að
+rgj4ar
+rg2l4
+r5gly
+r1gr
+r2gra
+r4grey
+r5h
+4ri.
+4r3ið.
+rig2
+riga5s
+r3ild
+4rin
+rin5e
+ringj5ar
+r3inu
+rip4s
+4r3ir
+ri3sk
+ris5l2
+3risn
+rist5að
+ris4un
+1ri4t
+rit3li
+4rí.
+4ríf
+ríkis3
+4ríl
+ríst4
+4ríu
+4ríþ
+rj3ar
+rjá4l
+rjó3sa
+rjósk5a
+rka1m
+rkaup4s
+r3ká
+r1ke
+rk1ef
+r4kell
+r4kelss
+rkju3s
+rk4se
+rk1sm
+rk4sp
+rk4ú
+rk5vei
+r3kö
+r1l2
+rl3að
+rl5ann
+r2li4
+rl4ið
+rlis5s
+r3lit
+rl3m
+rlof4
+rmak4
+r1man
+rmáls5
+rmb4
+rm2i
+r1mið
+rmil4
+r5mj
+rmk4
+rml4
+r3móð
+rmr4
+rn3ar
+rnar5l
+rn1g
+rn5ór
+rn5sí
+rn5sm
+rn4so
+r4nu
+r5numi
+ro4
+rog4as
+ron4
+r1or
+ró5gr
+ró4m
+ró4sa
+rós3ó
+5róti
+r5pal
+r3pó
+r1pr
+r4pri
+rp2s
+rp3sk
+r5py
+rr5ar
+r1rá
+r1re
+r1ré
+r1rí
+rr2k
+r3ró
+rr1u
+r5rú
+r1ræ
+r1sa
+r4saf
+rs4ár
+rsegl4
+r3ser
+rs4inn
+r3ske
+r5skil
+rs4lan
+rs2má
+r1st
+r2sti
+rst4v
+r3stö
+rs2u
+r5sund
+r4sú
+r1sv
+rt3að
+rta5g
+r3tak
+rta4sk
+r5tá
+rt5er
+rt3ey
+rt2hu
+r4tík
+r3tó
+r3trö
+rt4se
+rt5sl
+rtt4
+rt4uru
+rt4ú
+r4tv
+rt4ve
+r1tæ
+rt1öf
+r1uð
+r4uðun
+ruk4i
+ru5li
+ru2m
+r1ur
+r4uss
+r3ust.
+rut4v
+r4úð
+3rúm
+rúst5
+r1v
+rv3að
+r3ve
+r2vi
+rvi3g
+rv3ing
+rv4un
+r3væ
+r3yr
+1rým
+r1þ
+1rækt
+ræmd5a
+1ræn
+ræt3i
+röf4ug
+rök1r
+röl4
+2sa.
+4sab
+2s3að
+s4aðf
+1sag
+4sagr
+4sagt
+sal5at
+4s3ald
+1sa2m
+sam5b
+4sam1e
+sam3m
+sam1s
+sam5y
+2san
+s4ands
+2s3ar
+s4are
+sarg4
+s4aro
+s4arp
+2s1as
+2sat
+sat4a
+2sau
+s3auk
+4sav
+sá4
+s3áb
+s5áf
+sálar5
+s1ár
+s3ás
+s1b
+s3d4
+1se
+2s1ef
+4seld.
+5semi
+5sens
+2ser
+2ses
+3set
+sex3
+2s1ey
+s4eyð
+1sé
+s5f4
+sfl4
+sfr4
+s1g4
+sgl2
+s1h
+shá4s
+s1i
+s3ið.
+5s4iða
+s4iði
+sif2
+si5fi
+1sig
+sind4ar
+sind4as
+5sinnu
+2s5ins
+s3ir
+s3ist
+s4isv
+si3ta
+sí3br
+1síð
+síðk4
+sígl4
+s3ík
+sí4m
+sínk5a
+s3ír
+s1ís
+s5íu.
+sí3v
+sí4ve
+1sj
+s3jaf
+sjar4
+s4já
+sjó5l
+sjó3m4
+sjó3s
+4sju
+3sjú
+s2k
+2sk.
+4ska.
+4skað
+skaf4a
+4skal
+2skan
+1ska4p
+4skas
+1ská
+1skei
+3skemm
+4sken
+3skey
+s4k2i
+2ski.
+4skið
+sk3inu
+3skip
+2skir
+4skis
+3skír
+5skjá
+4sk4n
+3skoð
+4skon
+4skos
+1s4kot
+1skó
+5skóg
+1skrá
+4skró
+3skrú
+4sks
+sk3uri
+sk3ust
+2skv
+1sky
+3ský
+1skæ
+sla2
+sla3f
+s4lam
+slands5
+3s4lé
+sl2is
+s1lí
+s4líð
+s3lof
+s3lok
+1sló
+slu3s
+1slys
+s3læk
+s1m2
+4sma
+smá1s
+smá5v
+4sme
+s4mek
+s2mi
+1smí
+smj4
+4smö
+s2ne
+3sneið
+5sner
+s3nes
+3sneyd
+sn4ið
+sn2o
+1snú
+4snúm
+s4ný
+snæð5
+1so
+4sod
+3son
+2sor
+s5orði
+1só4
+s4ól
+sól3e
+sól3s
+2sóm
+s5ómag
+4sós
+1sp2
+spít3
+spj4
+4spl
+4spra
+2spró
+s5pund
+sr2an
+s5rau
+s1rá
+s1re
+s1ré
+s1rí
+s5ro
+s5ræ
+s3rö
+s3s4á
+ss3er
+ss5í
+s1s4k4
+ssl2
+ssm4
+ss5or
+s1st
+s4stir
+s1sv
+s2t
+2st.
+s4ta
+2sta.
+4stal
+4stap
+5starfi
+5starfs
+4staæ
+1ste
+3stef
+3stein
+5stekk
+4stet
+1sté
+st4he
+4sti.
+1stig
+st4isl
+3stíg
+2stím
+4stíu
+1stj4
+4stjón
+5stjór
+5stjör
+4stl
+st3le
+1sto
+3stof
+1stó
+4stón
+3stór
+st2r
+str5al
+5stranda
+5strang
+5straum
+5strá.
+1stre
+3strí
+4strú
+s3try
+5strön
+st5t
+2s4tu
+3stund
+1st2ú
+4stv
+3stý
+1stæ
+2stæk
+1s4tö
+3stöð
+4stöl
+5stöng
+s1u
+su3f4
+5sum3a
+s2ung
+s5upp
+s5ura
+sust4i
+sú4
+súln4
+s5ún
+s5úrs
+sút5
+sv4
+4svag
+4sval
+s3vat
+s5veð
+s4vef
+s2vei
+s3veik
+3svein
+5svep
+4svex
+s4viði
+5sviði.
+s4vik
+svik3u
+s5vin
+s1vo
+s2væ
+1svæð
+1sy
+2s3yfi
+3syn
+4s3yr
+3s4ý
+s1þ
+1sæ
+4sæð
+sæf4
+sæ5fa
+3sæj
+3sæl
+4sæs
+1sö
+3sög
+sögu5s
+2s3öld
+3söm
+2s3ör
+t2að
+ta2fr
+1taka
+5takend
+t4al.
+tala4m
+4tam
+ta1ma
+t5amt
+ta4ná
+3tang
+4tar
+t4ar4að
+tar5is5
+tark4
+tarp4
+tar5sá
+taræv4
+t1as
+t4as.
+ta5sl
+tat4
+ta4ví
+t4á4
+5tákn
+4tánd
+t1b
+t1d
+4tegí
+5tegu
+tei4
+tein5g
+t1eis
+1tek
+3tekj
+tekkj5
+t1end
+ten5ó
+4tepl
+t3ett
+2tey
+té4l
+t3f2
+tfirr4
+t1g
+t1h
+th5ers
+t1i
+ti4an
+ti5kis
+tild4
+4tin
+tirk4
+t4iræ
+tist4
+t5ist.
+ti3sta
+tistil4
+t2isv
+1tit
+1tí
+4tí.
+4tía
+3tíð
+tí4l
+3tím
+4tín
+4tít
+tív3
+t4jö
+t1k
+tk4a
+t4k2i
+tlaf4
+t3lag
+t4lag.
+tl2an
+tl5ann
+t1lá
+tl2i
+tlur4
+t1læ
+2t3m4
+tn2s
+tnsk4
+tnskr4
+to4
+1tog
+t3on
+3torg
+5toru
+1tóm
+tóm3a
+tóm5as
+5tónl
+tór1
+tór5au
+tóri3s
+t1ót
+t3p
+tra2b
+5traðari
+tr3alí
+tr2an
+tr3ann
+tr5ar
+3traus
+t4rey
+1tré
+tr4is
+t5risi
+t5ríka
+3trj
+t5róf
+tr3ótt
+tr3ug
+tr3una
+tr5uni
+1t4rú
+1try
+t5ryð
+t3ræn
+3tröð
+4ts
+t1sa
+ts4inn
+t5sí
+tsj4
+t1sk4
+ts1s
+t1st4
+ts4u
+t2sy
+tt3að
+ttak4i
+ttar5f
+tt5á
+tte5rí
+tt5ern
+t4tí
+tt5j
+tt1l
+tt1or
+tt3ræ
+tt3ug
+tt4ugl
+ttv4
+t1tæ
+t1u
+4tu.
+t4uði
+tugl4
+tuk4
+tu3l4ið
+tum2
+tu5min
+t2ung
+3t4ungl
+tup4
+t3ur3e
+tur3k
+t5urs
+t4usa
+t4usu
+tutr4
+túd3
+t3úð
+tú4l
+1tún
+tún4a
+t1úr
+tú3sk
+t1v
+5tveggj
+t5ver
+5týs
+t1þ
+3tæk
+1tök
+1töl
+t5öls
+2u1a
+u3af
+u5au
+2u1á4
+uáætl4
+4u1b4
+4uc
+4ud4
+u1da
+u5dá
+u3de
+u3dó
+u3dr
+2uða
+uð4are
+uð3k4
+2uðl
+uðm4
+2uð4n
+2uðr
+uð5ris
+uð4se
+uð3sv
+uð5sæ
+4uðul
+2u5e
+4ué
+4uf
+uf5á
+ufd4
+u5fit
+u3fj
+u1fr
+u3ful
+u5fú
+2ug
+4ugal
+4ugat
+4uge
+4ugil
+4u1gj
+4ugla
+ug1lj
+4uglu
+ug4n
+4ugó
+u5gran
+4ugre
+4ugrj
+4ugró
+ug3ræ
+ug3ta
+4ugö
+4u1h
+4ui
+u5ið
+4uí4
+2uj
+2uk
+ukak4
+uk4as
+u1ke
+u5kinnin
+ukku3s
+u5kó
+u3kv
+2ul
+3ul.
+4u1lag
+ul3ar
+3ulb
+4ule
+u5lind
+ul4is
+u1lí
+ul3k2
+ul4la
+4ulln
+ullt4
+4u3lo
+u3ló
+ul5sv
+ult4i
+ul3us
+ul5v4
+u3læ
+4u1lö
+3um.
+2uma
+umak4
+u1man
+um4aran
+2umá
+umál4ar
+um4ba
+um5bæ
+um4bö
+2umd
+2ume
+um3ein
+4umi
+umj4
+um4ki
+4uml
+umm4a
+4u5mo
+2umó
+4ump
+2umr
+ums4
+um3sl
+3umst.
+um1t4
+4umu
+um5unn
+4umú
+2umy
+2umý
+2umæ
+2umö
+un3ar1
+unar5a
+un2as
+4unat
+2u1nau
+2uná
+2und
+4une
+4unk
+2unná
+4unns
+2unnu
+unn5ug
+4uno
+4unó
+uns4an
+4unt
+1unu
+4unur
+4unæ
+4unö
+2u3o
+uol4
+4uó
+2up
+upp1
+upp5a
+uppal5
+upp4i
+3ur.
+2ura
+ura4f
+ur5a4m
+ur2an
+ur5anna
+2urá
+urða5rá
+2ure
+u1rek
+ur3ey
+4u1ré
+urf4a
+ur3fl
+urg4e
+ur3gj
+ur5in
+4urit
+4urí
+u3rík
+ur3j4
+urk4a
+ur1m
+ur3ní
+4uro
+4uró
+ur1sk4
+ur3sna
+ur4sta
+ur4svö
+ur5til
+urt4ir
+ur1u
+ur4unn
+4urus
+ur3v4
+ur4vis
+4uryk
+4urý
+2uræ
+4urö
+2usa
+u3sal
+4us4á
+2use
+4usí
+2usj
+4u1sk
+4usl
+2u3s4m
+2usn
+4uso
+4usó
+4usp
+u5starf
+4ustá
+4uste
+2usté
+2usti
+2ustí
+4usto
+4ustó
+4ustr
+3ustu.
+2ustú
+4usty
+4ustý
+4ustæ
+4ustö
+u5sund
+4u3sv
+4usy
+2usý
+2usö
+2ut
+ut3að
+ut2as
+u3te
+u5til
+u3tó
+ut4stó
+ut2ú
+u1tæ
+2u3u
+4u5ú
+4u3v
+2uy
+u3yf
+2u1þ
+4uæ
+2u5ö
+ú1a
+úal4
+ú3arf
+úb3an
+úbli3
+úð3ar
+úð5g
+ú3e
+úf5ar
+úfl2
+úf5li
+úf5ly
+úfs4á
+ú5gala
+úgó3
+ú4gæ
+4ú1i
+úk1l
+úkr1u
+úk4s
+úl5er
+5úl4f
+úlf5al
+úl4í3
+úlíp4
+ú3lo
+4ú2m
+úm4r
+úm4si
+ú4n
+únd4ug
+ún4gö
+úpl5i
+úr5ef
+úrít4
+úr5sl
+úr1t
+úr3un
+úr5v
+ú3ræ
+2ús
+ú4sa
+ús3ei
+ús3í
+ús4sti
+ús4sv
+ús1v
+út3e
+út2he
+úti5f
+út2is
+útj4
+út1l2
+út1r
+4ú1u
+ú1v
+ú4va
+ú5þ
+v2a2
+vaðr5
+va5fo
+va5h
+5vallag
+va4n
+var4ma
+varps3
+var5ú
+var4v
+v3ast
+va4t
+3vax
+veð5l
+ve3fe
+1veg
+v2ei
+3veið
+vein4as
+5veis
+4velg
+2vep
+v4er
+1verð
+ver3gj
+3verk
+ver2s
+vé2
+v5és
+v3ét5
+2v3h
+v2i
+2vi.
+v4ið
+5viðar
+við3l
+vil4i
+vi3lið
+3viln
+vi4lo
+vin3gj
+4vip
+3virk
+visk5un
+3viss
+vis4v
+5vita
+vitk5
+vit2n
+4viv
+4víb
+2víð
+5vík
+3vísi
+vísl3a
+ví1v
+2vn
+vo3k
+vol4
+vork4
+vor4r
+4vr1
+4vs
+2vu
+v1uð
+v1un
+5væg
+wa4
+win4s4
+x5ar
+x2as
+x3e
+x3f
+x5i
+xis4
+xí3
+xík4
+x5íu
+xt5að
+x1u4
+y5ba
+yð2s
+yf5a
+yf1i
+yfj5að
+yft4is
+y1i
+yj3ar
+yj5ó
+yk5e
+yk3i
+yk3su
+yk3u
+yk3v
+ylf5i
+ylgn4
+yll5a
+yl4v
+ym3a
+ymp5í
+y4n
+ynj5ar
+ynj3ó
+yn4k
+yn4t
+yn5u
+yp2us
+yr5e
+yr1i
+yr3il
+yrir3
+yrj3
+yrkv3a
+yr2l
+yr2s
+yr1u
+y2s
+ysj3
+ys2s
+yst3ug
+yt4h
+ytil4
+yt4k
+y3v
+ý5a
+ýaf5
+ý5á
+ýð2s
+ýfl4
+ý3flu
+ýg4r
+ýg4uð
+ý1i
+ýja5f4
+ým4a
+ým4k
+ýpru4
+ýp2s
+ýrf4
+ýri3m
+ýri5p4
+ýr3l
+ý4si
+ýsig4
+ýs4l
+ýs4m
+ý3stá
+ý5u
+ý5ú
+ý3v
+ý5y
+zó4
+þ2a
+þam4
+þarf5a
+þar4m
+4þb
+þ2i
+þist3i
+þjó4
+þol5a
+þor3f4
+þor3g
+þorm4
+þ1ól
+3þór
+þór5i
+þ2r2
+þra4
+þrás4
+þris4
+þríl4
+þrí3t
+þru4
+þum5a
+þumb3
+þur2
+þús3
+þ2v
+þver5sk
+æ1b
+æðn5
+æðnis5
+æð2s
+æð4ug
+4æf
+æf1a
+æ4fi
+æf3ust
+æg5ist
+æ1i
+æj3
+æj4al
+æjark4
+æk1a
+æk1li
+æk3u
+æ2l
+æl3an
+æl3e
+æl3us
+æm3a
+æm4al
+æ4mundu
+ænak4
+æn4k
+ær1a
+ær3e
+ærgöng5
+ærif4
+ær3ist
+æri3sv
+ær3l
+ær4n
+ær2s
+ær5un
+ær1us
+æ5rú
+æs4is
+æt5ise
+ætl5i
+æ5u
+æva5g
+æ5val
+æv3ar
+æv4ara
+æ3ve
+æv3in
+öð2
+öðl3
+öðm5
+öð3un
+öðv5an
+öðv3ar
+ö1fa
+öfl3ó
+öfn5
+öfr3u
+öf3u
+ö4g
+ög3gj
+öggv3
+ög1re
+ög2us
+ök5e
+ök5rá
+ök3st
+ök3ul
+ökv3a
+ö4l
+öl1f4
+ölk2
+ölu5mi
+öl5un
+öl2v
+ölv5an
+öm4b
+öm3u
+önd4l
+öng5sv
+öng4us
+öng4v
+öngv3a
+önk3
+önn4l
+ön3ug
+ön5un
+ör1e
+ör4ge
+ör4lan
+örm5un
+ör3ó
+ör3ug
+ör1un
+ör3und
+örus4
+ör2v
+4örva
+örv5al
+örv5an
+örv5ar
+örv4i
+ör1y
+ör5æ
+ö4s
+ösk3ul
+ös3u
+öt4s
+ö3tug
+öt2v
+ötv3a
+ö5u
+þ6ó} \ No newline at end of file
diff --git a/tex/context/patterns/lang-is.rme b/tex/context/patterns/lang-is.rme
new file mode 100644
index 000000000..ad574059b
--- /dev/null
+++ b/tex/context/patterns/lang-is.rme
@@ -0,0 +1,79 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: icehyph.tex (2004-03-08)
+% Author: Jorgen Pind <jorgen at lexis.hi.is>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% The Icelandic Plain TeX hyphenation tables
+% as of Nov 2 1988.
+% Jorgen Pind, Institute of Lexicography, Univ. of Iceland
+% jorgen@lexis.hi.is (Internet)
+%
+% Mar 2 2004: Uploaded a new version to CTAN, with a clarified license
+% statement, at the request of the author, Jorgen Pind.
+% Kristinn Gylfason (kristgy@ieee.org)
+
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.2
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.2 or later is part of all distributions of LaTeX
+% version 1999/12/01 or later.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-it.hyp b/tex/context/patterns/lang-it.hyp
new file mode 100644
index 000000000..07d5963c8
--- /dev/null
+++ b/tex/context/patterns/lang-it.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-it.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-it.pat b/tex/context/patterns/lang-it.pat
new file mode 100644
index 000000000..8e7ed87eb
--- /dev/null
+++ b/tex/context/patterns/lang-it.pat
@@ -0,0 +1,324 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-it.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z
+
+\patterns{
+.a3p2n
+.anti1
+.anti3m2n
+.bio1
+.ca4p3s
+.circu2m1
+.contro1
+.di2s3cine
+.e2x1eu
+.fran2k3
+.free3
+.li3p2sa
+.narco1
+.opto1
+.orto3p2
+.para1
+.poli3p2
+.pre1
+.p2s
+.re1i2scr
+.sha2re3
+.tran2s3c
+.tran2s3d
+.tran2s3l
+.tran2s3n
+.tran2s3p
+.tran2s3r
+.tran2s3t
+.su2b3lu
+.su2b3r
+.wa2g3n
+.wel2t1
+a1ia
+a1ie
+a1io
+a1iu
+a1uo
+a1ya
+2at.
+e1iu
+e2w
+o1ia
+o1ie
+o1io
+o1iu
+1b
+2bb
+2bc
+2bd
+2bf
+2bm
+2bn
+2bp
+2bs
+2bt
+2bv
+b2l
+b2r
+2b.
+1c
+2cb
+2cc
+2cd
+2cf
+2ck
+2cm
+2cn
+2cq
+2cs
+2ct
+2cz
+2chh
+c2h
+2chb
+ch2r
+2chn
+c2l
+c2r
+2c.
+.c2
+1d
+2db
+2dd
+2dg
+2dl
+2dm
+2dn
+2dp
+d2r
+2ds
+2dt
+2dv
+2dw
+2d.
+.d2
+1f
+2fb
+2fg
+2ff
+2fn
+f2l
+f2r
+2fs
+2ft
+2f.
+1g
+2gb
+2gd
+2gf
+2gg
+g2h
+g2l
+2gm
+g2n
+2gp
+g2r
+2gs
+2gt
+2gv
+2gw
+2gz
+2gh2t
+2g.
+1h
+2hb
+2hd
+2hh
+hi3p2n
+h2l
+2hm
+2hn
+2hr
+2hv
+2h.
+1j
+2j.
+1k
+2kg
+2kf
+k2h
+2kk
+k2l
+2km
+k2r
+2ks
+2kt
+2k.
+1l
+2lb
+2lc
+2ld
+2l3f2
+2lg
+l2h
+2lk
+2ll
+2lm
+2ln
+2lp
+2lq
+2lr
+2ls
+2lt
+2lv
+2lw
+2lz
+2l.
+1m
+2mb
+2mc
+2mf
+2ml
+2mm
+2mn
+2mp
+2mq
+2mr
+2ms
+2mt
+2mv
+2mw
+2m.
+1n
+2nb
+2nc
+2nd
+2nf
+2ng
+2nk
+2nl
+2nm
+2nn
+2np
+2nq
+2nr
+2ns
+n2s3fer
+2nt
+2nv
+2nz
+n2g3n
+2nheit
+2n.
+1p
+2pd
+p2h
+p2l
+2pn
+3p2ne
+2pp
+p2r
+2ps
+3p2sic
+2pt
+2pz
+2p.
+1q
+2qq
+2q.
+1r
+2rb
+2rc
+2rd
+2rf
+r2h
+2rg
+2rk
+2rl
+2rm
+2rn
+2rp
+2rq
+2rr
+2rs
+2rt
+r2t2s3
+2rv
+2rx
+2rw
+2rz
+2r.
+1s2
+2shm
+2sh.
+2s3s
+s4s3m
+2s3p2n
+2stb
+2stc
+2std
+2stf
+2stg
+2stm
+2stn
+2stp
+2sts
+2stt
+2stv
+2sz
+4s.
+1t
+2tb
+2tc
+2td
+2tf
+2tg
+t2h
+t2l
+2tm
+2tn
+2tp
+t2r
+t2s
+3t2sch
+2tt
+t2t3s
+2tv
+2tw
+t2z
+2tzk
+tz2s
+2t.
+1v
+2vc
+v2l
+v2r
+2vv
+2v.
+1w
+w2h
+wa2r
+2w1y
+2w.
+1x
+2xb
+2xc
+2xf
+2xh
+2xm
+2xp
+2xt
+2xw
+2x.
+y1ou
+y1i
+1z
+2zb
+2zd
+2zl
+2zn
+2zp
+2zt
+2zs
+2zv
+2zz
+2z.
+.z2} \ No newline at end of file
diff --git a/tex/context/patterns/lang-it.rme b/tex/context/patterns/lang-it.rme
new file mode 100644
index 000000000..2078e7259
--- /dev/null
+++ b/tex/context/patterns/lang-it.rme
@@ -0,0 +1,88 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: ithyph.tex (2008-03-08)
+% Author: Claudio Beccari <claudio.beccari at polito.it>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%% file ithyph.tex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Prepared by Claudio Beccari e-mail claudio.beccari@polito.it
+%
+% Dipartimento di Elettronica
+% Politecnico di Torino
+% Corso Duca degli Abruzzi, 24
+% 10129 TORINO
+%
+% Copyright 1998, 2008 Claudio Beccari
+%
+% This program is free software; it can be redistributed and/or modified
+% under the terms of the GNU Lesser General Public Licence,
+% as published by the Free Software Foundation, either version 2.1 of the
+% Licence or (at your option) any later version.
+%
+% \versionnumber{4.8g} \versiondate{2008/03/08}
+%
+% These hyphenation patterns for the Italian language are supposed to comply
+% with the Recommendation UNI 6461 on hyphenation issued by the Italian
+% Standards Institution (Ente Nazionale di Unificazione UNI). No guarantee
+% or declaration of fitness to any particular purpose is given and any
+% liability is disclaimed.
+%
+% See comments at the end of the file after the \endinput line
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-la.hyp b/tex/context/patterns/lang-la.hyp
new file mode 100644
index 000000000..08f73571b
--- /dev/null
+++ b/tex/context/patterns/lang-la.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-la.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-la.pat b/tex/context/patterns/lang-la.pat
new file mode 100644
index 000000000..d9173db3e
--- /dev/null
+++ b/tex/context/patterns/lang-la.pat
@@ -0,0 +1,342 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-la.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v x z æ œ
+
+\patterns{
+.a2b3l
+.anti1
+.anti3m2n
+.circu2m1
+.co2n1iun
+.di2s3cine
+.e2x1
+.o2b3
+.para1i
+.para1u
+.su2b3lu
+.su2b3r
+2s3que.
+2s3dem.
+3p2sic
+3p2neu
+æ1
+œ1
+a1ia
+a1ie
+a1io
+a1iu
+ae1a
+ae1o
+ae1u
+e1iu
+io1i
+o1ia
+o1ie
+o1io
+o1iu
+uo3u
+1b
+2bb
+2bd
+b2l
+2bm
+2bn
+b2r
+2bt
+2bs
+2b.
+1c
+2cc
+c2h2
+c2l
+2cm
+2cn
+2cq
+c2r
+2cs
+2ct
+2cz
+2c.
+1d
+2dd
+2dg
+2dm
+d2r
+2ds
+2dv
+2d.
+1f
+2ff
+f2l
+2fn
+f2r
+2ft
+2f.
+1g
+2gg
+2gd
+2gf
+g2l
+2gm
+g2n
+g2r
+2gs
+2gv
+2g.
+1h
+2hp
+2ht
+2h.
+1j
+1k
+2kk
+k2h2
+1l
+2lb
+2lc
+2ld
+2lf
+l3f2t
+2lg
+2lk
+2ll
+2lm
+2ln
+2lp
+2lq
+2lr
+2ls
+2lt
+2lv
+2l.
+1m
+2mm
+2mb
+2mp
+2ml
+2mn
+2mq
+2mr
+2mv
+2m.
+1n
+2nb
+2nc
+2nd
+2nf
+2ng
+2nl
+2nm
+2nn
+2np
+2nq
+2nr
+2ns
+n2s3m
+n2s3f
+2nt
+2nv
+2nx
+2n.
+1p
+p2h
+p2l
+2pn
+2pp
+p2r
+2ps
+2pt
+2pz
+2php
+2pht
+2p.
+1qu2
+1r
+2rb
+2rc
+2rd
+2rf
+2rg
+r2h
+2rl
+2rm
+2rn
+2rp
+2rq
+2rr
+2rs
+2rt
+2rv
+2rz
+2r.
+1s2
+2s3ph
+2s3s
+2stb
+2stc
+2std
+2stf
+2stg
+2st3l
+2stm
+2stn
+2stp
+2stq
+2sts
+2stt
+2stv
+2s.
+2st.
+1t
+2tb
+2tc
+2td
+2tf
+2tg
+t2h
+t2l
+t2r
+2tm
+2tn
+2tp
+2tq
+2tt
+2tv
+2t.
+1v
+v2l
+v2r
+2vv
+1x
+2xt
+2xx
+2x.
+1z
+2z.
+a1ua
+a1ue
+a1ui
+a1uo
+a1uu
+e1ua
+e1ue
+e1ui
+e1uo
+e1uu
+i1ua
+i1ue
+i1ui
+i1uo
+i1uu
+o1ua
+o1ue
+o1ui
+o1uo
+o1uu
+u1ua
+u1ue
+u1ui
+u1uo
+u1uu
+a2l1ua
+a2l1ue
+a2l1ui
+a2l1uo
+a2l1uu
+e2l1ua
+e2l1ue
+e2l1ui
+e2l1uo
+e2l1uu
+i2l1ua
+i2l1ue
+i2l1ui
+i2l1uo
+i2l1uu
+o2l1ua
+o2l1ue
+o2l1ui
+o2l1uo
+o2l1uu
+u2l1ua
+u2l1ue
+u2l1ui
+u2l1uo
+u2l1uu
+a2m1ua
+a2m1ue
+a2m1ui
+a2m1uo
+a2m1uu
+e2m1ua
+e2m1ue
+e2m1ui
+e2m1uo
+e2m1uu
+i2m1ua
+i2m1ue
+i2m1ui
+i2m1uo
+i2m1uu
+o2m1ua
+o2m1ue
+o2m1ui
+o2m1uo
+o2m1uu
+u2m1ua
+u2m1ue
+u2m1ui
+u2m1uo
+u2m1uu
+a2n1ua
+a2n1ue
+a2n1ui
+a2n1uo
+a2n1uu
+e2n1ua
+e2n1ue
+e2n1ui
+e2n1uo
+e2n1uu
+i2n1ua
+i2n1ue
+i2n1ui
+i2n1uo
+i2n1uu
+o2n1ua
+o2n1ue
+o2n1ui
+o2n1uo
+o2n1uu
+u2n1ua
+u2n1ue
+u2n1ui
+u2n1uo
+u2n1uu
+a2r1ua
+a2r1ue
+a2r1ui
+a2r1uo
+a2r1uu
+e2r1ua
+e2r1ue
+e2r1ui
+e2r1uo
+e2r1uu
+i2r1ua
+i2r1ue
+i2r1ui
+i2r1uo
+i2r1uu
+o2r1ua
+o2r1ue
+o2r1ui
+o2r1uo
+o2r1uu
+u2r1ua
+u2r1ue
+u2r1ui
+u2r1uo
+u2r1uu} \ No newline at end of file
diff --git a/tex/context/patterns/lang-la.rme b/tex/context/patterns/lang-la.rme
new file mode 100644
index 000000000..3f238d037
--- /dev/null
+++ b/tex/context/patterns/lang-la.rme
@@ -0,0 +1,105 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: lahyph.tex (2007-09-03)
+% Author: Claudio Beccari <claudio.beccari at polito.it>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% ********** lahyph.tex *************
+%
+% Copyright 1999- 2001 Claudio Beccari
+% [latin hyphenation patterns]
+%
+% -----------------------------------------------------------------
+% IMPORTANT NOTICE:
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+% -----------------------------------------------------------------
+%
+% Patterns for the latin language mainly in modern spelling
+% (u when u is needed and v when v is needed); medieval spelling
+% with the ligatures \ae and \oe and the (uncial) lowercase `v'
+% written as a `u' is also supported; apparently there is no conflict
+% between the patterns of modern Latin and those of medieval Latin.
+%
+% Support for font encoding OT1 with 128-character set and
+% for font encoding T1 with a 256-character set.
+%
+% Prepared by Claudio Beccari
+% Politecnico di Torino
+% Torino, Italy
+% e-mail beccari@polito.it
+%
+% 1999/03/10 Integration of `lahyph7.tex' and `lahyph8.tex' into
+% one file `lahyph.tex' supporting fonts in OT1 and T1 encoding by
+% Bernd Raichle using the macro code from `dehypht.tex' (this code
+% is Copyright 1993,1994,1998,1999 Bernd Raichle/DANTE e.V.).
+%
+%
+% \versionnumber{3.1} \versiondate{2007/04/16}
+%
+% Information after \endinput.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \message{Latin Hyphenation Patterns `lahyph' Version 3.1 <2007/04/16>}
+%
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-lt.hyp b/tex/context/patterns/lang-lt.hyp
new file mode 100644
index 000000000..9cbd13b63
--- /dev/null
+++ b/tex/context/patterns/lang-lt.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-lt.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-lt.pat b/tex/context/patterns/lang-lt.pat
new file mode 100644
index 000000000..5af2c9f8f
--- /dev/null
+++ b/tex/context/patterns/lang-lt.pat
@@ -0,0 +1,1553 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-lt.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v w y z ą č ė ę į š ū ų ž
+
+\patterns{
+.ap1
+.api1
+.ap3r
+.arbi1
+.arti1
+.as3p
+.at1
+.ata1
+.at3r
+.aš3v
+.dina1
+.ek3r
+.i2š3
+.iši2
+.kirti1
+.nu1
+.nusi1
+.pie2č
+.sam1
+.sida1
+.sk4
+.st4
+.su5kr
+.te3s2
+.uk3
+.u2š3
+.už1
+.įs4
+.šven1
+a1a2
+a1b
+a1c
+a2ch
+a1d
+a4dra
+a1e
+ae2l
+a1f
+2a1g
+a4gr
+ag3ra
+a5grio
+a5gro
+a1h
+a5inf
+ai4sk
+ai4tr
+a1j
+a1k
+ak2l
+ak2vi
+a2kėt
+a1l
+a3li
+a5lo1
+a3ly
+a3lė
+a3lū
+a1m
+a1n
+an3k2l
+an4sk
+an4tr
+a2o
+a1p
+ap1a4k
+ap3ei
+ap3i2m
+ap3l
+a3pr
+ap3s2
+a1r
+ar1eit
+a4rg
+ari4s
+a1s
+asi1
+asi5s
+a4sk
+as3kl
+a3sl
+as2mi
+as2mu
+a5s4n
+a4stu
+a1t
+at3aug
+ate5ist
+at3i2m
+ato1
+atp4
+a4tru
+at1ė2
+atū2ž
+a4u
+au4kl
+au4sk
+au4sl
+au4t3r
+a1v
+a1w
+a1y
+a1z
+a1ą
+2a1č
+a1ę
+a1ė2
+a1į
+a1š
+a3šn
+aš4tr
+aš2v
+a1ų
+a1ū2
+a1ž
+až2l
+ba3c
+balta1
+ba4sl
+2b1b
+2b1c
+4b3d
+bep4
+be3s2
+besi1
+be3t2
+2b1f
+2b1g
+2b1h
+b1j
+2b1k
+2b1l
+b2la
+b2liz
+3b2lo
+b2lu
+2b1m
+2b1n
+2b1p
+2b2r
+b3ri
+2b1s
+2b3t
+bu4k
+2b1v
+2b1w
+2b1z
+2b1č
+2b1š
+2b1ž
+car4
+2c1b
+2c1c
+2c1d
+2c1f
+2c1g
+3chi
+2c1k
+2c1l
+2c1m
+2c1n
+2c1p
+2c1r
+2c1s
+2c1t
+cu4
+cuk5
+2c1v
+2c1w
+2c1z
+2c1č
+2c1š
+2c1ž
+da3b4
+2d1b
+2d1c
+2d1d
+de4k
+dema1
+de4pr
+de4sp
+2d1f
+2d1g
+2d1h
+di4p
+di4s
+dis5k
+2d1j
+2d3k
+4d3l
+2d1m
+2d1n
+do3ri
+2d1p
+2d1r
+dro1
+dro2b
+d2rė
+4drų
+2d1s
+2d1t
+du2a
+du4k
+du5ka
+du4sl
+2d1v
+d3va
+dvi3a
+2d1w
+d4z
+2d1č
+2d1š
+d4ž
+džio1
+e1a2
+e2a3l
+eapi1
+eat1
+e1b2
+ebe1
+e3bl
+eb3r
+e1c
+e2ch
+e3d2
+ed3ri
+e4dro
+ed3rė
+e1e
+e1f
+e1g
+eg3ra
+e1h
+e1ie
+ei4k3l
+1ein
+ei4sk
+ei4sl
+2eis3t
+eist2ra
+ei2š1
+e1j
+e1k
+e3kr
+e1l
+e1m
+ema5s4
+2e1n
+en3k2l
+enk4la
+eno1
+ens4
+4enta
+enu1
+e2o
+e3or
+e3o2š
+e3p
+ep4li
+ep4r
+epra1
+epri1
+e1r
+ere3a4
+eri4s
+ero1
+erė2
+e1s
+esi5s
+es4k
+eska1
+e5sko
+e3s2v
+e1t
+e1u4
+euž3
+e1v
+e3vi
+e1w
+e1y
+e1z
+e1ą
+e1č
+e1ę
+e1ė
+e1į4
+eįp3
+eįs3k
+eįt3r
+e1š
+e3šn
+eš2v
+ešė3
+e1ų
+e1ū
+e1ž
+2f1b
+2f1c
+2f1d
+2f1f
+2f1g
+2f1h
+fi4s5
+2f1k
+2f1l
+2f1m
+2f1n
+2f1p
+2f1r
+fri1
+2f1s
+2f1t
+2f1v
+2f1w
+2f1z
+2f1č
+2f1š
+2f1ž
+gaš3
+2g1b
+2g1c
+2g1d
+ge4o1
+2g1f
+2g1g
+2g1h
+2g1k
+2g1l
+g2le
+g2lo
+2g1m
+2g1n
+3g2nų
+2g1p2
+3g2r
+grai2
+g3ran
+5g3re
+g4rei
+g3ri
+4g4rio
+g3ro.
+g4rą
+5grį
+4grų
+2g1s
+4g1t
+3gu
+2g1v
+2g1w
+gyva1
+2g1z
+2g1č
+2g1š
+2g1ž
+2h1b
+2h1c
+2h1d
+2h1f
+2h1g
+2h1h
+hi4b
+2h1k
+2h2l
+2h1m
+h2me
+2h1n
+2h1p
+2h1r
+2h1s
+2h1t
+2h1v
+2h1w
+2h1z
+2h1č
+2h1š
+2h1ž
+i2a
+ia5g4
+i3aiš
+ia3k
+i3antę
+i3antė
+iap4
+i3ar
+i3b2
+i1c
+ice1
+i1d
+id2r
+id3rė
+i2dėm
+i2e
+ie4d3r
+ie3g
+i3ei
+ie3kl
+i3ent
+ie4p5r
+ie4sk
+i1f
+2i1g
+i3g2l
+ig3ru
+2i1h
+i1i2
+i1j
+i1k
+i3k2n
+ik3r
+i1l
+ilo1
+i1m
+1imd
+4i1n
+in4kl
+5inv
+i2o
+io4g3r
+iok2
+io4pl
+i3or
+i1p
+i2p1j
+ip3ru
+i1r
+ira3s2
+i3ri
+4i1s
+i5sa
+i5si
+is4k
+i3sl
+is4li
+i5s4n
+i4ste
+isto1
+2i3t2
+i2u
+i1v
+i1w
+i1y
+i1z
+i2ą
+i1č
+i1ę
+i1ė2
+i1į
+i1š
+i3šn
+iš5t
+i4šv
+išė2
+1išš
+i2ų
+i2ū
+i3ž
+3ja.
+jauna1
+2j1b
+2j1c
+2j1d
+2j1f
+2j1g
+2j1h
+2j1j
+2j1k
+2j1l
+2j1m
+2j1n
+jot3
+jo4tv
+2j1p
+2j1r
+2j1s
+2j1t
+1ju
+2j1v
+2j1w
+2j1z
+2j1č
+2j1š
+1jū
+2j1ž
+3ka.
+5ka3d
+kak3
+ka4kl
+ka4pr
+3kar
+3kas
+3kati
+5kav
+kavar1
+ka3z2
+2k1b
+2k1c
+2k1d
+3ke
+ke4b3
+keren1
+2k1f
+2k1g
+2k1h
+k4i
+5ki.
+5kia
+3kib
+3kil
+5kit
+2k1k
+2k1l
+3k2la
+k4lan
+4kle.
+k2lel
+4klo.
+4klu.
+k2ly
+4klą
+4klų
+2k1m
+2k1n
+3ko
+2k1p
+2k2r
+k4rau
+kris2
+kri5st
+k3ro
+k4rov
+4k3ru
+5krun
+k4ry
+k5rą
+2k1s
+k4sk
+ks3l
+k4s3p
+4k1t
+k3ta
+3ku
+4kub
+ku4k
+ku4pr
+2k1v
+k2va
+k3vo
+k2vė
+2k1w
+3kyt
+2k1z
+5ką
+2k1č
+2k1š
+kš2ly
+kšė3
+2k1ž
+3la.
+lap4s3to
+2l1b
+lb3r
+2l1c
+2l1d
+3le.
+le3c
+le4gr
+4leč
+2l1f
+2l1g
+lg3s2t
+2l1h
+3li.
+li4a
+5li4o
+3lių
+2l1j
+2l1k
+lko1
+2l1l
+2l1m
+2l1n
+3lo.
+log4
+4lop
+4l1p
+lpna1
+2l1r
+4l1s
+l4sk
+l4s3p
+4l3t
+3lu.
+2lup
+4l1v
+2l1w
+3lyč
+2l1z
+3lą
+2l1č
+3lęs
+3lėm
+3lės
+2lėč
+3lį4
+4l1š
+3lų
+2l1ž
+m2a
+2m3aid
+3mas
+mas3ki
+2m1b
+mb3r
+2m1c
+2m1d
+me3c
+meis1
+2m1f
+2m1g
+2m1h
+mi4gl
+mi4gr
+min4s
+mi4tr
+2m1k
+2m1l
+2m1m
+2m1n
+m2o
+2mod
+2m1p
+m4pl
+m3pr
+2m1r
+4m1s
+2m1t
+m3ta
+3muo
+2m1v
+2m1w
+2m1z
+2m1č
+2m1š
+2m1ž
+na3s2
+na3t2
+2n1b
+2n1c
+ncen1
+2n1d
+n3drė
+ne1
+neg4
+nei2m
+ne4o3
+neor2
+nerė3
+nesi1
+ne3sl
+ne3s2t
+ne3t2
+neįs3t
+2n1f
+4n1g
+ng3l
+ng4r
+2n1h
+ni4s
+2n1j
+2n1k
+nk3la
+nk3r
+n3kry
+2n1l
+2n1m
+2n1n
+5no
+2n1p
+2n1r
+4n1s
+ns4ku
+ns3l
+n4s3p
+nst3r
+4n1t
+n3ta
+nt4pl
+n3tru
+nt2ruo
+nua4
+nu3b2
+nu3g
+nu1i
+nuk2
+nu4o3
+nuos2
+nu5s4
+2n1v
+2n1w
+2n1z
+4n1č
+2n1š
+2n1ž
+o1a
+o1b
+o1c
+o1d
+o3dr
+o1e
+o2et
+o1f
+o1g
+o1h
+o1i
+o1j
+o1k
+o3kr
+o1l
+olen1
+o1m
+om4pr
+o1n
+ono1
+o1o2
+o1p
+o1r
+o2rie
+ori4s
+or4tr
+o2rę
+o1s
+o3sl
+os3le
+os4lo
+o3s2v
+o3t2
+oto1
+o1v
+o1w
+o1y
+o1z
+o1ą
+o1č
+o1ę
+o1ė
+o1į
+o1š
+oš2v
+o1ų
+o1ū
+o1ž
+pa3
+pad2
+pai2l
+pai2m
+pai2r
+3pan
+pap4
+p2ar
+parsi1
+pa4r1ė2
+pas2
+pa5sr
+p2at2
+2p1b
+4p1c
+4p3d2
+p2e
+per1
+pe2re
+pe2r3im
+per3s
+pe2rė
+2p1f
+2p1g
+2p1h
+p2i
+p3ieš
+2p3k2
+3p2l
+p3le
+p3li
+4plio
+p4liu
+p3lo
+p4loj
+p4lu
+p4ly
+2p1m
+4p1n
+3po
+po4g
+poli1
+2p1p
+2p2r
+p3rai
+prau2si
+p3raš
+p3ri
+pris2
+p5ro.
+p3rom
+p3ry
+4prą
+p3rė
+p3rū
+4p1s
+psi1
+p5s4k
+p4s3ty
+p3s2v
+4p3t2
+3p4u
+pusiau1
+pu4sk
+pu4sl
+pu4tr
+2p1v
+2p1w
+p2y
+2p1z
+2p1č
+p2ė
+4p3š2
+4p3ž
+r2a
+3ra.
+ra3b
+3rac
+ra1im
+rai4tį
+ra3kr
+3ral
+3ram
+ras4l
+ra3sm
+rau4ka.
+3rav
+2r1b
+rbo1
+r3b4r
+2r1c
+4r1d
+2reb
+4rein
+4reit
+3rel
+re4p5
+5res
+res3l
+3ret
+2r1f
+2r1g
+2r1h
+r2i
+3ri.
+ri3d
+3rij
+ri3kr
+2ril
+ri2ma.
+2r3imt
+3rio
+ri3p
+risi1
+ri3st
+rivin1
+3rią
+3rių
+2riū
+4r1k
+rk3ly
+r3k4r
+4r1l
+2r1m
+4r1n
+r2o
+3rod2
+ro4gr
+3roj
+3rok
+3ron
+3rop
+2r3org
+5ros
+2r1p
+r3p4r
+2r1r
+4r1s
+rs4ko.
+rs4p
+4r1t
+rti5k4
+rti3s2
+r3t2r
+r3t2v
+r2u
+2ruk
+3rul
+4run
+3ruos
+2rup
+3rus
+ru4sk
+4ruto
+4r1v
+2r1w
+2r1z
+3rą
+4rąs
+4r1č
+4r1š
+r3š2l
+r3š2m
+5rų
+2r1ž
+sala1
+2s1amž
+san5t
+sarka1
+2s3b
+2s1c
+2s3d
+s2e
+se4kr
+senat4
+2s1f
+2s1g
+2s1h
+si3auk
+si3a2v
+si3a2š
+si3d
+si3k4
+si3p4
+si3s2
+si5š2v
+3s2k2
+4sk.
+s5ka.
+4ske
+5s4ken
+5ski
+5s4kle
+5sk4r
+5skub
+sk3va
+sk3vi
+5sky
+4ską
+5skę
+2s2l
+3sle
+s3li
+s3lo
+4s3lu
+4s3lū
+2s1m
+4sme.
+4smę
+4s3n
+so4dr
+3s2p
+s3pe
+4spn
+4spu
+4s1r
+s3ri
+2s1s
+2s1t
+s2tal
+s2ten
+4stin
+s2tod
+s2toj
+3s2tov
+st2rai
+st2v
+4stę
+4s3tė
+4stų
+s2tū
+su1
+su3bl
+su3d2
+su3g2
+suk2l
+su3s2
+susi1
+suž4
+2s1v
+s2ve
+3s2vy
+2s1w
+2s1z
+są3
+4s3č
+5sė
+2s1š
+2s1ž
+t2a
+2tab
+ta3kr
+ta5s
+2tat
+taura1
+2tač
+2t1b
+2t1c
+2t1d
+2teb
+3tem
+te4o
+te3t2
+2t1f
+4t3g
+2t1h
+t2i
+ti4gr
+ti4k3l
+3tin
+2tip
+4t3j
+4t3k
+t4kl
+4t3l
+4t3m
+2t1n
+t2o
+3toje
+2tolį
+to3s2
+2tow
+2t3p
+t4pj
+tp3lū
+tp4r
+2t1r
+4trio
+t2riš
+4tro
+4trą
+4trų
+4t3s4
+tsi1
+tskri1
+4t1t
+tua4
+3tur
+2t1v
+t2vo
+4tvėj
+2t1w
+3tyd
+2t1z
+2t1č
+3tę
+t2ėm
+t3ėmu
+t3ėmę
+t3ėmė
+2t3š2
+2t3ž
+u1a2
+u3ai
+u1b
+u2bj
+u1c
+u1d
+u1e2
+u1f
+u1g
+ug4r
+ug5rio
+u1h
+u1i2m
+u5in
+ui2r
+u1j
+u1k
+u3kl
+uk2le
+u3kr
+u3kv
+u5kų
+u1l
+u1m
+u1n
+u2o
+u3or
+uo4sl
+u3p
+up4l
+up3ro
+u1r
+urk2
+ur3kl
+u5ro1
+ur3s2
+u1s
+u2s1al
+u3sl
+us3la
+us3le
+usva1
+us3ve
+u3t2
+uto1
+2utr
+u1u
+u1v
+u1w
+u1y
+u1z
+u1ą
+u1č
+u1ę
+u1ė2
+u1į
+u1š
+u3š2l
+u3š2n
+uš2v
+u1ų
+u1ū2
+u1ž
+uži2m
+u3žl
+už3v
+už1ė2
+3va.
+vap4
+va3t
+2v1b
+2v1c
+2v1d
+v2e
+2vep
+3ves
+2v1f
+2v1g
+2v1h
+viesia1
+vi4s5k
+vi4t3r
+2v1j
+2v1k
+2v1l
+2v1m
+2v1n
+2v1p
+2v1r
+2v4s
+2v1t
+2v1v
+2v1w
+2vydau
+2v1z
+3vą
+2v1č
+3vė
+4vėp
+2v1š
+2v1ž
+2w1b
+2w1c
+2w1d
+2w1f
+2w1g
+2w1h
+2w1k
+2w1l
+2w1m
+2w1n
+2w1p
+2w1r
+2w1s
+2w1t
+2w1v
+2w1w
+2w1z
+2w1č
+2w1š
+2w1ž
+y1a
+y1b
+y1c
+y1d
+y1e
+y1f
+y1g
+ygia1
+y1h
+y1i
+y1j
+y1k
+y4k3l
+y1l
+y1m
+y1n
+y1o
+y1p
+y3r
+y1s
+y4sk
+y1t
+y1u
+y1v
+y1w
+y1y
+y1z
+y1ą
+y1č
+y1ę
+y1ė
+y1į
+y1š
+y1ų
+y1ū
+y1ž
+2z1b
+2z1c
+2z1d
+2z1f
+2z1g
+2z1h
+2z1k
+2z1l
+2z1m
+2z1n
+2z1p
+2z1r
+2z1s
+2z1t
+2z1v
+2z1w
+2z1z
+2z1č
+2z1š
+2z1ž
+ą1a
+ą1b
+ą1c
+ą1d
+ą1e
+ą1f
+ą1g
+ą1h
+ą1i
+ą1j
+ą1k
+ą1l
+ą1m
+ą1n
+ą1o
+ą1p
+ą1r
+ą1s
+ą1t
+ą1u
+ą1v
+ą1w
+ą1y
+ą1z
+ą1ą
+ą1č
+ą1ę
+ą1ė
+ą1į
+ą1š
+ą1ų
+ą1ū
+ą1ž
+2č1b
+2č1c
+2č1d
+čeko1
+2č1f
+2č1g
+2č1h
+čin1
+2č1k
+2č1l
+2č1m
+2č1n
+2č1p
+2č1r
+2č1s
+2č1t
+2č1v
+2č1w
+2č1z
+2č1č
+2č1š
+2č1ž
+ę1a
+ę1b
+ę1c
+ę1d
+ę1e
+ę1f
+ę1g
+ę1h
+ę1i
+ę1j
+ę1k
+ę1l
+ę1m
+ę1n
+ę1o
+ę1p
+ę1r
+ę1s
+ę1t
+ę1u
+ę1v
+ę1w
+ę1y
+ę1z
+ę1ą
+ę1č
+ę1ę
+ę1ė
+ę1į
+ę1š
+ę1ų
+ę1ū
+ę1ž
+ė1a
+ė1b
+ė1c
+ė1d
+ė1e
+ė1f
+ė1g
+ė1h
+ė1i
+ė1j
+ė1k
+ė4k3l
+2ė3l
+ė1m
+ė3me
+ė1n
+ė1o
+ė1p
+ė1r
+2ė1s
+ės3l
+2ė3t
+ė4tr
+ė1u
+ė1v
+ė1w
+ė1y
+ė1z
+ė1ą
+ė1č
+ė1ę
+ė1ė
+ė1į
+ė1š
+ė1ų
+ė1ū
+ė1ž
+į1a
+į1b
+į1c
+į1d2
+į2e
+į1f
+į4g
+į1h
+į1i
+į1j
+į2k4
+į2l
+į2m
+į1n
+į1o
+į4p
+į2r
+į1s
+įsi1
+įs3l
+įs2m
+įs2r
+įst2
+į2t2
+į1u
+į2v
+į1w
+į1y
+į1z
+į1ą
+į1č
+į1ę
+į1ė2
+į1į
+į1š
+į1ų
+į1ū
+į1ž
+2š1b2
+2š1c
+2š3d2
+š1ei
+še2v
+2š1f
+2š1g4
+2š1h
+2š5ist
+šiuk1
+2š1k2
+2š1l
+š2lij
+š2lu
+3šly
+2š1m
+2š1n
+š2ne
+šno1
+šo2r
+2š1p4
+2š1r
+2š3s4
+šsi1
+šsikap1
+4š3t2
+šu4š
+3š1v
+š2vi
+š4vyd
+2š1w
+2š1z
+4š3č
+šė2j
+2š1š
+2š1ž
+ų1a
+ų1b
+ų1c
+ų1d
+ų1e
+ų1f
+ų1g
+ų1h
+ų1i
+ų1j
+ų1k
+ų1l
+ų1m
+ų1n
+ų1o
+ų1p
+ų1r
+ų1s
+ų1t
+ų1u
+ų1v
+ų1w
+ų1y
+ų1z
+ų1ą
+ų1č
+ų1ę
+ų1ė
+ų1į
+ų1š
+ų1ų
+ų1ū
+ų1ž
+ū1a
+ū1b
+ū1c
+ū1d
+ū1e
+ū1f
+ū1g
+ū1h
+ū1i
+ū1j
+ū1k
+ū4k3l
+ū1l
+ū1m
+ū1n
+ū1o
+ū1p
+ū1r
+ū1s
+ū4s3k
+ūs3l
+ūs3t
+ū1t
+ū1u
+ū1v
+ū1w
+ū1y
+ū1z
+ū1ą
+ū1č
+ū1ę
+ū1ė
+ū1į
+ū1š
+ū1ų
+ū1ū
+ū1ž
+žant4
+žants5
+2ž3b2
+2ž1c
+2ž3d2
+žen1
+2ž3f4
+2ž3g
+2ž1h
+ži3mu
+žio3
+ž1j
+2ž3k2
+2ž1l
+ž2lu
+4ž1m
+2ž1n
+2ž3p
+2ž1r
+2ž1s
+žsi1
+ž4sk
+ž4s5l
+žs3t
+4ž3t2
+ž2u
+žu3s2
+3ž2v
+ž4vi
+ž3vo
+2ž1w
+2ž1z
+2ž1č
+žįs3
+2ž1š
+2ž1ž} \ No newline at end of file
diff --git a/tex/context/patterns/lang-lt.rme b/tex/context/patterns/lang-lt.rme
new file mode 100644
index 000000000..7def4fe72
--- /dev/null
+++ b/tex/context/patterns/lang-lt.rme
@@ -0,0 +1,47 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8
+% in October 2008 by Mojca & Arthur.
+%
+% Source available on:
+% - http://www.vtex.lt/tex/littex/index.html
+%
+% Authors:
+%
+% First version in LT encoding (modified T1):
+% - Vytas Statulevičius <vytas at vtex.lt>
+% - Yannis Haralambous
+% (Vilnius, March 4, 1992)
+% Conversion into Latin 7 and aditional support files (babel, fonts):
+% - Sigitas Tolusis <sigitas at vtex.lt>
+% (2002-11-20)
+% Adaptation for hyph-utf8:
+% - Mojca & Arthur (see below), October 2008
+%
+% The copyright statement of this file is:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% A note about lefthyphenmin/righthyphenmin (by Sigitas, February 2009):
+%
+% At the moment the lefthyphenmin & righthyphenmin are both set to 2.
+% The Lithuanian patterns were build earlier then the latest grammatical rules
+% took place in 1997. At that time it was forbidden to leave one character at boundary.
+% One may change it to one now, but from typographical point of view there is no need to do
+% any changes. Even more, changing lefthyphen and righthyphen to 1 requires
+% to review and maybe rebuild the patterns file.
+%
+%------------------------------------------------------------------------------ \ No newline at end of file
diff --git a/tex/context/patterns/lang-mn.hyp b/tex/context/patterns/lang-mn.hyp
new file mode 100644
index 000000000..bd1591d8d
--- /dev/null
+++ b/tex/context/patterns/lang-mn.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-mn.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-mn.pat b/tex/context/patterns/lang-mn.pat
new file mode 100644
index 000000000..a54630e49
--- /dev/null
+++ b/tex/context/patterns/lang-mn.pat
@@ -0,0 +1,995 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-mn.rme
+
+% used: а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё ү ө
+
+\patterns{
+1ба
+1бе
+1бё
+1би
+1бо
+1бө
+1бу
+1бү
+1бы
+1бь2ю
+1бэ
+1бю
+1бя
+1ва
+1ве
+1вё
+1ви
+1во
+1вө
+1ву
+1вү
+1вы
+1вь2ю
+1вэ
+1вю
+1вя
+1га
+1ге
+1гё
+1ги
+1го
+1гө
+1гу
+1гү
+1гы
+1гь2ю
+1гэ
+1гю
+1гя
+1да
+1де
+1дё
+1ди
+1до
+1дө
+1ду
+1дү
+1ды
+1дь2ю
+1дэ
+1дю
+1дя
+1жа
+1же
+1жё
+1жи
+1жо
+1жө
+1жу
+1жү
+1жэ
+1жю
+1жя
+1за
+1зе
+1зё
+1зи
+1зо
+1зө
+1зу
+1зү
+1зы
+1зь2ю
+1зэ
+1зю
+1зя
+1ка
+1ке
+1кё
+1ки
+1ко
+1ку
+1кү
+1кэ
+1кю
+1кя
+1ла
+1ле
+1лё
+1ли
+1ло
+1лө
+1лу
+1лү
+1лы
+1лэ
+1лю
+1ля
+1ма
+1ме
+1мё
+1ми
+1мо
+1мө
+1му
+1мү
+1мы
+1мэ
+1мю
+1мя
+1на
+1не
+1нё
+1ни
+1но
+1нө
+1ну
+1нү
+1ны
+1нь2ю
+1нэ
+1ню
+1ня
+1па
+1пе
+1пё
+1пи
+1по
+1пө
+1пу
+1пү
+1пы
+1пь2ю
+1пэ
+1пю
+1пя
+1ра
+1ре
+1рё
+1ри
+1ро
+1рө
+1ру
+1рү
+1ры
+1рэ
+1рю
+1ря
+1са
+1се
+1сё
+1си
+1со
+1сө
+1су
+1сү
+1сы
+1сэ
+1сю
+1ся
+1та
+1те
+1тё
+1ти
+1то
+1тө
+1ту
+1тү
+1ты
+1ть2ю
+1тэ
+1тю
+1тя
+1фа
+1фе
+1фё
+1фи
+1фо
+1фу
+1фы
+1фэ
+1фю
+1фя
+1ха
+1хе
+1хё
+1хи
+1хо
+1хө
+1ху
+1хү
+1хы
+1хэ
+1хю
+1хя
+1ца
+1це
+1цё
+1ци
+1цо
+1цө
+1цу
+1цү
+1цы
+1цэ
+1цю
+1ця
+1ча
+1че
+1чё
+1чи
+1чо
+1чө
+1чу
+1чү
+1чэ
+1чю
+1чя
+1ша
+1ше
+1шё
+1ши
+1шо
+1шө
+1шу
+1шү
+1шэ
+1шю
+1шя
+1ща
+1ще
+1щи
+1щу
+2а1я
+2аа
+2б3ю4у
+2б3ю4ү
+2в3ю4у
+2в3ю4ү
+2г3ю4у
+2г3ю4ү
+2д3ю4у
+2д3ю4ү
+2ж3ю4у
+2ж3ю4ү
+2з3ю4у
+2з3ю4ү
+2и1е
+2й1е
+2й1ё
+2й1ю
+2й1я
+2л3ю4у
+2л3ю4ү
+2м3ю4у
+2м3ю4ү
+2н3ю4у
+2н3ю4ү
+2о1е
+2о1ё
+2о1я
+2оо
+2ө1е
+2өө
+2п3ю4у
+2п3ю4ү
+2р3ю4у
+2р3ю4ү
+2с3ю4у
+2с3ю4ү
+2т3ю4у
+2т3ю4ү
+2у1я
+2у3ю
+2уу
+2үү
+2х3ю4у
+2х3ю4ү
+2ц3ю4у
+2ц3ю4ү
+2ч3ю4у
+2ч3ю4ү
+2ш3ю4у
+2ш3ю4ү
+2ъ3е
+2ъ3ё
+2ъ3ю
+2ъ3я
+2ь3е
+2ь3ё
+2ь3я
+2э3е
+2ээ
+2ю3а
+2ю3и
+2ю3о
+.авто3а4г
+.авто3а4д
+.авто3а4к
+.авто3а4л
+.авто3а4н
+.авто3а4с
+.авто3б4л
+.авто3б4р
+.авто3в4в
+.авто3в4л
+.авто3г4р
+.авто3д4р
+.авто3и4м
+.авто3и4н
+.авто3и4о
+.авто3к4л
+.авто3к4р
+.авто3о4б
+.авто3о4к
+.авто3о4п
+.авто3о4т
+.авто3п4р
+.авто3с4к
+.авто3с4л
+.авто3с4м
+.авто3с4п
+.авто3с4т
+.авто3с4ц
+.авто3т4р
+.авто3ф4л
+.авто3ф4р
+.авто3х4р
+.авто3х4т
+.авто3ц4в
+.авто3э4к
+.авто3э4л
+.авто3э4м
+.авто3э4п
+.анти3а4в
+.анти3а4д
+.анти3а4л
+.анти3а4н
+.анти3а4п
+.анти3а4р
+.анти3а4с
+.анти3а4т
+.анти3а4у
+.анти3б4л
+.анти3г4л
+.анти3г4р
+.анти3д4р
+.анти3и4д
+.анти3и4з
+.анти3и4м
+.анти3и4н
+.анти3к4в
+.анти3к4л
+.анти3о4б
+.анти3о4з
+.анти3о4к
+.анти3п4л
+.анти3п4н
+.анти3п4р
+.анти3п4с
+.анти3с4в
+.анти3с4к
+.анти3с4т
+.анти3с4ц
+.анти3т4р
+.анти3у4з
+.анти3у4р
+.анти3у4т
+.анти3ф4л
+.анти3ф4р
+.анти3х4л
+.анти3х4р
+.анти3э4м
+.анти3э4н
+.анти3э4р
+.астро3б4л
+.астро3г4л
+.астро3г4р
+.астро3и4н
+.астро3о4р
+.астро3с4п
+.астро3ш4т
+.аэро3д4р
+.аэро3к4л
+.аэро3п4л
+.аэро3с4т
+.аэро3ф4л
+.би3а4к
+.би3а4л
+.би3а4ф
+.би3к4в
+.би3к4р
+.би3о4р
+.би3п4р
+.би3э4к
+.био3а4к
+.био3а4н
+.био3а4п
+.био3а4с
+.био3б4л
+.био3г4р
+.био3и4н
+.био3к4л
+.био3к4р
+.био3о4р
+.био3п4л
+.био3п4р
+.био3с4к
+.био3с4п
+.био3с4т
+.био3с4ф
+.био3х4р
+.био3э4к
+.био3э4л
+.био3э4н
+.био3э4т
+.бь4
+.въ4
+.вь4
+.газо3а4б
+.газо3а4д
+.газо3а4н
+.газо3а4п
+.гео3а4к
+.гео3б4л
+.гео3г4р
+.гео3и4з
+.гео3и4н
+.гео3к4р
+.гео3с4к
+.гео3с4т
+.гео3с4ф
+.гео3т4р
+.гео3ф4л
+.гео3х4р
+.гео3э4к
+.гео3э4л
+.гидро3а4б
+.гидро3а4в
+.гидро3а4г
+.гидро3а4д
+.гидро3а4к
+.гидро3а4л
+.гидро3а4м
+.гидро3а4р
+.гидро3а4э
+.гидро3г4р
+.гидро3и4з
+.гидро3и4н
+.гидро3и4о
+.гидро3к4л
+.гидро3к4р
+.гидро3о4к
+.гидро3п4л
+.гидро3п4н
+.гидро3с4т
+.гидро3с4ф
+.гидро3т4р
+.гидро3у4д
+.гидро3у4з
+.гидро3у4р
+.гидро3х4л
+.гидро3э4к
+.гидро3э4л
+.гидро3э4н
+.гипе2р3а4д
+.гипе2р3а4з
+.гипе2р3а4к
+.гипе2р3а4л
+.гипе2р3а4м
+.гипе2р3а4р
+.гипе2р3а4ц
+.гипе2р3а4э
+.гипе2р3е4а
+.гипе2р3е4м
+.гипе2р3е4р
+.гипе2р3е4с
+.гипе2р3и4з
+.гипе2р3и4м
+.гипе2р3и4н
+.гипе2р3о4в
+.гипе2р3о4к
+.гипе2р3о4с
+.гипер3б4р
+.гипер3г4л
+.гипер3г4р
+.гипер3к4в
+.гипер3к4р
+.гипер3м4н
+.гипер3п4л
+.гипер3п4н
+.гипер3п4р
+.гипер3с4п
+.гипер3с4р
+.гипер3с4с
+.гипер3с4т
+.гипер3т4р
+.гипер3у4р
+.гипер3ф4р
+.гипер3х4л
+.гипер3х4р
+.гипер3э4к
+.гипер3э4л
+.гипер3э4н
+.гипер3э4о
+.гипер3э4с
+.голо3б4л
+.голо3э4д
+.гомо3а4з
+.гомо3а4к
+.гомо3а4т
+.гомо3к4л
+.гомо3п4л
+.гомо3с4п
+.гомо3т4р
+.гомо3ф4т
+.гомо3э4н
+.гомо3э4п
+.гь4
+.ди1а3г4н
+.ди4ст5ри
+.ди4ст5ро
+.диа3д4р
+.диа3к4л
+.диа3к4р
+.диа3с4к
+.диа3с4п
+.диа3с4т
+.диа3т4р
+.диа3ф4р
+.диазо3т4р
+.диазо3э4т
+.диазо3э4ф
+.дина3т4р
+.дь4
+.евро3а4з
+.евро3а4т
+.евро3и4е
+.евро3к4р
+.евро3о4б
+.евро3с4п
+.евро3с4т
+.изо3а4в
+.изо3а4г
+.изо3а4д
+.изо3а4з
+.изо3а4к
+.изо3а4л
+.изо3а4м
+.изо3а4н
+.изо3б4р
+.изо3в4р
+.изо3г4л
+.изо3г4р
+.изо3д4р
+.изо3и4о
+.изо3й4о
+.изо3к4л
+.изо3к4р
+.изо3л4г
+.изо3л4ж
+.изо3о4к
+.изо3п4л
+.изо3п4р
+.изо3с4т
+.изо3т4к
+.изо3т4р
+.изо3х4р
+.изо3ш4л
+.изо3э4в
+.изо3э4д
+.изо3э4й
+.изо3э4л
+.изо3э4н
+.ин3а4кт
+.ин3а4п
+.ин3а4у
+.ин3б4р
+.ин3г4р
+.ин3к4л
+.ин3к4р
+.ин3с4тр
+.инте2р3а4к
+.интер3г4р
+.интер3к4в
+.интер3к4р
+.интер3п4р
+.интер3ф4л
+.кило3а4м
+.кило3г4р
+.кило3э4л
+.кино3а4к
+.кино3а4н
+.кино3а4п
+.кино3а4ф
+.кино3б4л
+.кино3д4р
+.кино3и4с
+.кино3к4л
+.кино3к4р
+.кино3о4п
+.кино3п4л
+.кино3п4р
+.кино3с4к
+.кино3с4ъ
+.кино3ф4л
+.кино3ф4р
+.кино3х4р
+.кино3э4к
+.ко3а4г
+.ко3а4д
+.ко3а4к
+.ко3и4н
+.ко3о4п
+.ко3о4р
+.ко3п4л
+.ко3э4ф
+.кь4
+.ль4
+.макро3а4н
+.макро3а4с
+.макро3б4л
+.макро3б4р
+.макро3г4л
+.макро3г4н
+.макро3г4р
+.макро3и4н
+.макро3и4с
+.макро3к4л
+.макро3к4р
+.макро3о4в
+.макро3о4п
+.макро3о4р
+.макро3п4л
+.макро3п4р
+.макро3с4к
+.макро3с4п
+.макро3с4т
+.макро3с4х
+.макро3т4р
+.макро3ф4л
+.макро3ф4т
+.макро3э4в
+.макро3э4к
+.макро3э4л
+.макро3э4н
+.макро3э4р
+.макро3э4с
+.мега3о4м
+.мега3п4р
+.мега3с4к
+.мега3с4п
+.мега3э4л
+.микро3а4в
+.микро3а4г
+.микро3а4д
+.микро3а4м
+.микро3а4н
+.микро3а4р
+.микро3а4с
+.микро3а4у
+.микро3а4э
+.микро3б4л
+.микро3б4р
+.микро3г4р
+.микро3д4в
+.микро3и4з
+.микро3и4н
+.микро3и4с
+.микро3й4о
+.микро3к4л
+.микро3к4н
+.микро3к4р
+.микро3о4б
+.микро3о4п
+.микро3о4р
+.микро3о4с
+.микро3п4л
+.микро3п4р
+.микро3с4к
+.микро3с4п
+.микро3с4т
+.микро3с4ф
+.микро3с4х
+.микро3т4р
+.микро3ф4л
+.микро3х4р
+.микро3э4в
+.микро3э4л
+.микро3э4м
+.микро3э4н
+.микро3э4р
+.милли3а4м
+.милли3г4р
+.милли3о4м
+.милли3э4к
+.моно3а4в
+.моно3а4з
+.моно3а4л
+.моно3а4м
+.моно3а4н
+.моно3а4р
+.моно3а4т
+.моно3а4ц
+.моно3б4л
+.моно3б4р
+.моно3г4л
+.моно3г4р
+.моно3и4з
+.моно3и4м
+.моно3и4н
+.моно3к4л
+.моно3к4р
+.моно3о4к
+.моно3о4л
+.моно3п4л
+.моно3п4р
+.моно3п4с
+.моно3с4п
+.моно3с4т
+.моно3т4р
+.моно3ф4т
+.моно3х4л
+.моно3х4р
+.моно3э4д
+.моно3э4н
+.моно3э4п
+.моно3э4т
+.моно3э4ф
+.мото3д4р
+.мото3к4р
+.мото3п4л
+.мото3п4р
+.мото3с4п
+.мото3ш4л
+.мь4
+.на3у
+.нано3а4д
+.нано3п4р
+.нео3а4д
+.нео3а4н
+.нео3а4р
+.нео3б4л
+.нео3г4л
+.нео3г4н
+.нео3г4р
+.нео3и4з
+.нео3и4м
+.нео3и4н
+.нео3к4л
+.нео3к4р
+.нео3п4л
+.нео3п4р
+.нео3х4р
+.нео3э4з
+.нео3э4н
+.нео3э4п
+.нео3э4с
+.нь4
+.орто3а4л
+.орто3а4м
+.орто3а4н
+.орто3а4р
+.орто3д4р
+.орто3и4з
+.орто3к4р
+.орто3п4л
+.орто3п4р
+.орто3п4с
+.орто3с4в
+.орто3с4к
+.орто3с4т
+.орто3т4р
+.орто3х4л
+.орто3х4р
+.орто3э4т
+.орто3э4ф
+.пара3а4к
+.пара3а4л
+.пара3а4м
+.пара3а4н
+.пара3а4п
+.пара3а4ц
+.пара3б4л
+.пара3г4н
+.пара3г4р
+.пара3к4л
+.пара3к4р
+.пара3о4к
+.пара3п4л
+.пара3п4с
+.пара3с4п
+.пара3с4ф
+.пара3с4ц
+.пара3т4р
+.пара3х4л
+.пара3х4р
+.пара3э4л
+.пара3э4т
+.паро3п4р
+.поли3а4в
+.поли3а4д
+.поли3а4з
+.поли3а4к
+.поли3а4л
+.поли3а4м
+.поли3а4н
+.поли3а4р
+.поли3а4ц
+.поли3б4р
+.поли3г4л
+.поли3г4р
+.поли3и4з
+.поли3и4м
+.поли3к4л
+.поли3к4р
+.поли3о4к
+.поли3о4л
+.поли3п4л
+.поли3п4н
+.поли3п4р
+.поли3с4п
+.поли3с4т
+.поли3у4р
+.поли3х4л
+.поли3х4р
+.поли3э4д
+.поли3э4к
+.поли3э4л
+.поли3э4н
+.поли3э4т
+.поли3э4ф
+.пре3э4к
+.пре3ю4д
+.про3а4г
+.про3а4к
+.про3а4м
+.про3а4н
+.про3а4у
+.про3г4р
+.про3и4г
+.про3и4з
+.про3и4л
+.про3и4н
+.про3к4л
+.про3с4п
+.про3х4р
+.про3э4к
+.про3э4м
+.про3э4н
+.про3э4р
+.про3э4с
+.прото3х4л
+.прото3х4р
+.прото3э4р
+.проф3г4р
+.пъ4
+.пь4
+.ре3а4б
+.ре3а4г
+.ре3а4д
+.ре3а4к
+.ре3а4с
+.ре3а4ф
+.ре3а4э
+.ре3г4р
+.ре3и4м
+.ре3и4н
+.ре3и4ф
+.ре3к4р
+.ре3п4р
+.ре3т4ра
+.ретро3а4к
+.ретро3а4у
+.ретро3г4р
+.ретро3о4т
+.ретро3ф4л
+.санти3г4р
+.стерео3а4д
+.стерео3а4к
+.стерео3б4л
+.стерео3г4р
+.стерео3и4з
+.стерео3с4к
+.стерео3с4п
+.стерео3т4р
+.стерео3э4л
+.стерео3э4н
+.стерео3э4ф
+.супер3а4г
+.супер3а4д
+.супер3а4к
+.супер3а4н
+.супер3а4р
+.супер3а4э
+.супер3г4р
+.супер3е4с
+.супер3и4з
+.супер3и4к
+.супер3и4м
+.супер3и4н
+.супер3к4л
+.супер3п4р
+.супер3с4к
+.супер3с4п
+.супер3с4т
+.супер3х4р
+.супер3э4в
+.супер3э4к
+.супер3э4ф
+.съ4
+.сь4
+.ть4
+.фь4
+.хризо3и4д
+.хризо3п4р
+.хризо3с4т
+.хь4
+.элек3тро
+.элек3тро3а4в
+.элек3тро3а4г
+.элек3тро3а4к
+.элек3тро3а4н
+.элек3тро3а4э
+.элек3тро3б4л
+.элек3тро3и4з
+.элек3тро3и4с
+.элек3тро3о4б
+.элек3тро3о4в
+.элек3тро3о4г
+.элек3тро3о4д
+.элек3тро3о4к
+.элек3тро3о4п
+.элек3тро3о4с
+.элек3тро3о4т
+.элек3тро3о4ф
+.элек3тро3о4ч
+.элек3тро3с4т
+.элек3тро3т4р
+.элек3тро3э4к
+.элек3тро3э4н
+.элек3тро3э4р
+3авто
+3актив
+3аппа
+3г4рад
+3г4рам
+3г4раф
+3им4пул
+3ин3ст4ру
+3ин3те4р
+3к4ва
+3к4лас
+3к4ри
+3оп3тик
+3п3роек
+3п4ро
+3с4коп
+3с4фе
+3с4хе
+3ск4ла
+3ск4ле
+3ск4ло
+3ск4ля
+3ск4ра
+3ск4ре
+3ск4ри
+3ск4ро
+3ск4ру
+3ск4ры
+3сп4ла
+3ст4ра
+3ст4ре
+3ст4ри
+3ст4ро
+3ст4рук
+3ф4рагм
+3х4лор
+3х4ром
+3ш2таб
+3ш2тат
+3э4к5ви
+3э4ко
+3э4лек4т
+3э4леме
+3э4нерг
+3э4нтро
+3эффе} \ No newline at end of file
diff --git a/tex/context/patterns/lang-mn.rme b/tex/context/patterns/lang-mn.rme
new file mode 100644
index 000000000..338ec58fc
--- /dev/null
+++ b/tex/context/patterns/lang-mn.rme
@@ -0,0 +1,86 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: mnhyphn.tex (2008-03-30)
+% Author: Dorjgotov Batmunkh <bataak at gmail.com>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+%% mnhyphn.tex v1.2 2008/03/23 (2010/04/03)
+%% Copyright 2007-2010 by Dorjgotov Batmunkh, National University of Mongolia
+%% email bataak@gmail.com
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% Special thanks to: Jim Hefferon and Robin Fairbairns
+%
+% There are few basic rules in mongolian
+%
+% 1. If there is a consonant then it can use hyphen before it.
+% And if there're two consonants then it can use hyphen before second consonant.
+% Are there three consonants then it can put hyphen before third consonant,
+% also are there four consonants then it can use hyphen before fourth consonant.
+% 2. In the case of hardsign or softsign, it's possible to hyphen after these signs.
+% For instance, байгуулъ-я, үзүүль-е
+% 3. However one vowel can be belong to a syllable, it's not possible to use hyphen.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-nb.hyp b/tex/context/patterns/lang-nb.hyp
new file mode 100644
index 000000000..cc740c930
--- /dev/null
+++ b/tex/context/patterns/lang-nb.hyp
@@ -0,0 +1,52 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-nb.rme
+
+% used: D N S a b c d e f g h i j k l m n o p r s t u v w y z å æ ø ü
+
+\hyphenation{
+atten-de
+aust-røn
+aviser
+betre
+bortan-for
+bortre
+Dansk-øya
+der-etter
+dess-uak-tet
+dit-over
+finger-spitzen-ge-fühl
+finger-spitz-ge-fühl
+fram-ifrå
+før-enn
+her-etter
+her-etter-dags
+hvor-etter
+hvor-over
+høyt-ærede
+gi-vet-vis
+lands-øl
+lands-ølet
+lands-ølets
+langt-ifra
+ned-imot
+noens
+Not-odden
+Not-oddens
+nøye-reg-nen-de
+opp-imot
+oven-ikjøpet
+promp-te
+spleen
+sel-ves-te
+smal-enden
+sørpe-is
+sørpe-isen
+skrov-is
+skrov-isen
+Steins-land
+syd-enden
+tvert-om
+velan
+velet
+welt-schmerz} \ No newline at end of file
diff --git a/tex/context/patterns/lang-nb.pat b/tex/context/patterns/lang-nb.pat
new file mode 100644
index 000000000..1102ee60c
--- /dev/null
+++ b/tex/context/patterns/lang-nb.pat
@@ -0,0 +1,27154 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-nb.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z å æ è é ê ò ó ô ø
+
+\patterns{
+.a4
+.aa4
+.ab4ba
+.ab7be
+.ab6s5t
+.ac6tin
+.adel4s
+.ad8la.
+.ad6le.
+.ad2r
+.ad1s2
+.af7f
+.af5t4
+.af5f6u
+.ag6na.
+.ag6ne.
+.ag4r
+.ai2
+.a6k
+.ak6ka.
+.ak6ke.
+.ak3kl
+.ak3kr
+.ak6ne.
+.ak6r
+.ak8sa.
+.ak4se.
+.ak6ta
+.ak4te.
+.akte4r
+.akter5e
+.ak5tr
+.akva7
+.a6l
+.albu5en
+.alfa3
+.al4ge.
+.al5gi
+.al6ka.
+.al4ke.
+.al4kom
+.al4la.
+.al4le.
+.al5leg
+.al5lo
+.all5s6
+.al4ma.
+.al8me.
+.al5m6in
+.al4na
+.al6s7k
+.als5o
+.alt4a
+.al4ta.
+.al5tar
+.al4te.
+.alt3o
+.al6ve.
+.am7b
+.a6me
+.am6ma.
+.am4me.
+.am4s4
+.am6ta
+.a6n
+.ana3b
+.an4da.
+.an4de.
+.an5d4ra
+.an4d5ø
+.an3er
+.anes5
+.an4ga.
+.an3ge
+.an4ge.
+.ange4s
+.an4ja.
+.an4ka.
+.an4ke.
+.an4la.
+.an3n
+.an4na.
+.an7nal
+.ann4e
+.an4ne.
+.an5s8
+.an4sa.
+.an4se.
+.ant2
+.an4ta.
+.an4te.
+.an5tem
+.an5tep
+.an4ti.
+.an6tin
+.an4tis
+.an4tiv
+.ap8lan
+.ap1p6
+.ap8t
+.arbi5
+.ar6de.
+.are4o7
+.ar4ge.
+.ar5ges
+.ari6a
+.ari8e
+.arie5ne
+.ar5ka
+.ar8ka.
+.arlan9
+.ar4me.
+.ar7mea
+.ar4na.
+.ar3ne
+.ar4ne.
+.ar5nes
+.ar6ra.
+.ar6r7u
+.ar6ta.
+.ar4te.
+.ar9ti
+.ar6va.
+.ar4ve.
+.ar4ved
+.ar4ver
+.arvi6
+.a6s
+.as8ka
+.as4ke.
+.as5kese
+.as4le.
+.as6pa.
+.as5s
+.ast5ru
+.at4h
+.at4ki
+.at4le.
+.at4na.
+.at2o4
+.at3s
+.atte4
+.att6r
+.a5ty
+.au8de
+.au6e
+.au8ga
+.au4ge
+.au4ka.
+.au8le.
+.au4r
+.au6sa.
+.au6se.
+.aus9k
+.au4sp
+.avi2
+.av7i6d
+.av7inde
+.av4la.
+.av4le.
+.av7s6
+.b6
+.ba6by
+.ba6la.
+.ba4le.
+.ba4ne.
+.ban4k3l
+.ba4re.
+.ba4ri.
+.ba8te.
+.be4de.
+.bede4n
+.be6d5ene
+.be4d5et
+.be8di.
+.be3e4d
+.be6ke.
+.be4la.
+.be9nar
+.be4ne.
+.be6ra.
+.be6re.
+.be4res
+.ber6ett
+.be8ri.
+.be7ska
+.be6sten
+.be4ta.
+.be6te.
+.be5t4v
+.bi6de.
+.bi6en
+.bi4le.
+.bilet5
+.bi6t3r
+.bl4
+.bla4d
+.ble4k3
+.ble5k4e
+.blek4k3f
+.blekk3s4t6
+.blekk9s8v4
+.bling5
+.bo8da
+.bo8de.
+.bogs8
+.bok5
+.bo4k4en.
+.bo8la
+.bon2
+.bo4na.
+.bor6t5
+.bort6e
+.bor8ti8
+.bort9r
+.brudd7s6
+.bruddså7
+.bu6da.
+.bu3d6r
+.bu4et
+.bus6sy
+.by6de.
+.by8ta.
+.bæ2
+.bø6k5a
+.bø8nen
+.bø8ner
+.c4
+.ca4en.
+.car4s5
+.ca6se
+.ce6b
+.cos1
+.co4st
+.d6
+.da4ge.
+.da4le.
+.dags6e
+.da2m
+.da4ne.
+.da4ta
+.dau3s
+.deka9r
+.deko7d
+.de4le.
+.de4l5ei
+.del5s6
+.de4mi.
+.demo7e
+.den5sl
+.de4re.
+.de4r5et
+.de4ri.
+.de6r3i4
+.de7r4i5v
+.de4r5om
+.de6s5m
+.de4so
+.de4sto
+.de4u
+.devi5s
+.di2a
+.di5e4l
+.di6er
+.di4et.
+.di9f6t
+.di4ne.
+.dings7a
+.di4sk
+.di8s3t
+.do4en
+.do4er
+.do8et
+.dome5
+.do4ra
+.do6re.
+.drau4m
+.ds4
+.du4a
+.du4en.
+.du4er
+.duft3
+.du4ge.
+.duk3n
+.du4se.
+.du4st
+.dy4re.
+.dø6la.
+.dø6r3
+.dø7r4a
+.dø7r4e
+.dø4ve.
+.då5ren
+.då7ret
+.e6
+.eb4ba
+.ecu6
+.ed4da
+.ed4le.
+.efo7
+.ef4ta
+.efta5s
+.ef6ter
+.eg8de.
+.ege2
+.ege5l
+.eg6ga.
+.eg4ge.
+.eg4gel
+.eg8la.
+.eg4le.
+.eg6na.
+.eg4ne.
+.ego7t8
+.egs4
+.eg8se.
+.eg5si
+.ei2
+.eid5a
+.ei5den
+.ei4ga.
+.ei7ger
+.eik5a
+.ei4ke.
+.ei3l
+.ei3m
+.ei8ma.
+.ei8me.
+.ein7as
+.ei3ni
+.ein5og5
+.ein5s6ta
+.ein8s7to
+.ei9rar
+.ei5res
+.eir9u
+.ei5te
+.eit9r
+.ekk4o
+.ek4le.
+.ek3li
+.ek6ne.
+.ek4r
+.ek8sa.
+.ek3se
+.ek8se.
+.ek4sp
+.eks6pi
+.eks3t4
+.ek5s4ta
+.ek8ta
+.ek4te.
+.ek7to
+.el8da.
+.el4de.
+.el4g5r
+.eli5ne
+.el3k
+.el5l
+.el6s
+.els6a
+.els4kl
+.els6t
+.el6ta.
+.el6te.
+.el6veg
+.em3b2
+.emfa9
+.em4ma.
+.em8me.
+.em6na.
+.em5p
+.en5a
+.en4da.
+.en4de.
+.end5r
+.en4ga.
+.en6gav
+.en3ge
+.en4ge.
+.en6g5r
+.engs6
+.en6ka
+.en4ke.
+.en5og5
+.en6sa
+.en4se.
+.en5so
+.en3sp
+.en5t
+.en6te.
+.ent4r
+.en6t5ra
+.ent8re
+.en3ø4
+.ep6t
+.er8a
+.er4e
+.er4g5r
+.er4ke
+.er4la.
+.er4le.
+.er6ma.
+.er4me.
+.er4mek
+.er4na.
+.er6ta.
+.er4te.
+.es9ast
+.es1k
+.es3ka
+.es8ka.
+.es4ke.
+.es5l
+.es8la.
+.es8le.
+.es3p
+.es6pa.
+.es6r
+.es8sa.
+.es4se.
+.es4so
+.es5ta
+.es3te
+.es6te.
+.es7tet
+.es5ti
+.est3r
+.es7tu
+.et8la.
+.et8le.
+.et4na
+.et4ne.
+.et4s
+.et8sa.
+.et5s4e
+.et6se.
+.ets4i
+.et1te4
+.et6ter
+.et6ti
+.ev8ja
+.ev4je.
+.ev4ne.
+.ex4
+.f4
+.fa2e
+.fag3s4
+.fa4ne.
+.fan3t4o
+.fe4e
+.feil5i
+.fe2l
+.fela9
+.fel5l
+.fel4ta
+.fe4ma
+.fe8me
+.fem5o6g5
+.fem5t
+.fer8ro
+.fer6s
+.fe8sl
+.fe8st5
+.fes3t6e
+.fi4b5
+.fi6a
+.fi4le.
+.fire5o6g5
+.fis6k
+.fjel4
+.fla4t5o
+.fo4bi.
+.fol2
+.fo2r
+.for3d6ri
+.for7d6ra
+.for5en.
+.form5s
+.for7s6o
+.fre6e
+.fri5e6re
+.fug2
+.fu6ge.
+.ful2
+.fu8se.
+.fy8se
+.fø8rel
+.g6
+.gaf7
+.ga4le.
+.ga8li.
+.ga4me
+.ga4ne.
+.gang5s4
+.gas4
+.gas5ta
+.ga2t
+.ga4ve.
+.ga9vee
+.ge2a
+.gel4e
+.ge3ne
+.ge6ni5
+.gen5s
+.ge4o
+.ge4st
+.ge5s6tap
+.ge9sv
+.gha5
+.gift5s
+.gi4n
+.gi4s
+.gis7p
+.gi8v3a
+.gl6
+.glo6i
+.glo9v
+.gly5s
+.glø9se
+.gnå7la
+.go5des
+.gos7
+.gra4v3end
+.grei4e
+.grunn5s
+.grus5s
+.gu4de.
+.gud3v4
+.gu4lat
+.gus1
+.gu4tu.
+.gø2
+.gås4e5
+.gå4v
+.h4
+.hai5s6
+.ha6ka.
+.ha8ma.
+.hand5s6l
+.handsla9
+.ha6v5ak
+.ha6vi
+.he4er.
+.hei5e
+.he2n
+.hen3i2
+.he6r5i6
+.he6r5o6
+.he9r6oe
+.he7r6oi
+.he7r6ol
+.he9r8os
+.hes4s5
+.het6s5
+.het7s6e
+.he4t5
+.he5t6e
+.hil4l
+.hi4n
+.hi6re.
+.ho2d
+.ho2e
+.ho4re.
+.ho5ren
+.ho7ret
+.ho8ta.
+.ho8va.
+.hu4di
+.hus6val
+.hvit3
+.hvi3t4e
+.hy6ra.
+.hy4re.
+.høi5
+.hø4re
+.hø4va
+.hø4ve.
+.høy6st5æ
+.hå8en.
+.hå8er
+.hånd5s6l
+.i2
+.i3a4
+.i3bl
+.i4da
+.ifø5re
+.ig8la.
+.ig4le.
+.i4her
+.ik2
+.ik6k
+.ikke5
+.i3k6l
+.ik5t
+.ik8te.
+.i5kv
+.i3la
+.i4la.
+.i8lande
+.ilbo8da
+.il6d3r
+.il6de.
+.i3leg
+.i6les
+.il4ja
+.il6je.
+.il6ke.
+.il4le.
+.il6sk
+.il4te.
+.i6me
+.imø5te.
+.in5ad
+.in5de
+.in8ga.
+.in4ge.
+.in3gr
+.in6gri
+.in5k6
+.in6ka.
+.in4n3
+.in4ne.
+.in5n6e
+.in6n7eks
+.in6n7ets
+.in6n7ett
+.in4n3i
+.in5s
+.in7tes
+.io4na
+.io4nom
+.i4rer
+.ir7k8
+.ir8ra.
+.ir6re.
+.i6sa
+.i3sc
+.i6se
+.is7k6
+.isla8ga
+.is6lam
+.is4le.
+.is4let
+.is4me.
+.is8na.
+.is8ne.
+.is5pa
+.i5spe
+.is3s4
+.is6sa.
+.is4se.
+.is5sk
+.ist6
+.is8te.
+.i5sted
+.i5stem
+.is7ti
+.i6s7tj
+.i6s7tr
+.is8ut.
+.i6s5ø
+.i5ti
+.i3va
+.i4van
+.i4var.
+.i3ve
+.i4vel
+.i6ven
+.i4ver.
+.i4vere
+.iv8ra.
+.iv6re.
+.i3ø
+.j4
+.ja4de.
+.ja6e
+.ja4ne
+.ja8se.
+.ja4va.
+.je2a
+.je2l
+.je2m
+.je5re
+.jern5s4
+.je4ta
+.ji4
+.jo8en.
+.jo4se.
+.ju6a
+.ju6la
+.jule3
+.ju4li3
+.jø4dep
+.k6
+.kaf2
+.ka6la.
+.ka6li.
+.kalve5l8
+.ka5me
+.ka3na
+.ka4ne.
+.ka4p3r
+.ka4ra.
+.ka5r6a5v
+.ka6re.
+.ka5rin
+.ka4te.
+.ka5t6h
+.kau9k
+.ka6va.
+.ka4ve.
+.ke6e
+.kel3
+.kier3
+.ki4na
+.ki7ni
+.kino3
+.kir2
+.ki4se.
+.ki8va.
+.ki6ve.
+.kje3de5
+.kje4k
+.kjek7l
+.kjønn4
+.kle4s
+.kli5ne
+.klo9va
+.kly7sa
+.kna7se
+.kne4p3r
+.ko6da.
+.ko7gr
+.ko4la
+.ko3le
+.ko8le.
+.kol5j
+.ko3pe
+.ko6pe.
+.kor6s5ed
+.ko4se.
+.ko6ta.
+.ko4te.
+.ko6ve.
+.kring5s
+.ks6
+.ku5f4l
+.ku4le
+.ku8ra.
+.ku4re.
+.ku8ta.
+.ku8te.
+.kva4r1a
+.kve9ka
+.kve5ke
+.ky8la.
+.ky4le.
+.ky6te.
+.kø3s
+.kå6pa
+.l6
+.la4da.
+.la4de.
+.la4ga
+.la4ge.
+.la5ger
+.la4ma.
+.la6ta.
+.la4te.
+.la3tr
+.la4va
+.la3ve
+.la4ve.
+.le8ar
+.le4da.
+.le4de.
+.le4er
+.le6et
+.le2f
+.lef3l
+.lega5ta
+.le4ge.
+.le4gel
+.le8gi.
+.lei5er.
+.lei4ve
+.le4ke.
+.le4k5r
+.lemu9
+.le4ne.
+.le6o7
+.le7s6a
+.le4se.
+.le4sek
+.le4ses
+.le4s5p
+.le2t
+.le7ta
+.let6tan
+.le2u3
+.le3va
+.le4va.
+.le4ve.
+.le4ves
+.li8a
+.li4de.
+.li4e4
+.li5ene
+.li2g
+.liga3
+.li2k
+.lik5k6
+.lik3o
+.lik3s
+.li4ma
+.link6
+.li6ra
+.li4re.
+.li4sa
+.li4se.
+.li4ta.
+.li4te.
+.li5ti
+.li4ve.
+.li4v5en
+.liv8s7u6
+.liv4s5v
+.lo4e
+.lo6ge.
+.lo8gi.
+.lo6g5r
+.lo4i
+.lo6na
+.lo8o
+.lo6ri
+.lo8sa.
+.lo4se.
+.lo6te
+.lo4va
+.lo3ve
+.lo4ve.
+.lu4d
+.lu2e
+.lu4na
+.lu6pa
+.lu4pe.
+.lu6ra.
+.lu4re.
+.lu6se.
+.lu4ta.
+.lu9tas
+.ly4de.
+.lyd3s
+.ly8e
+.ly8ge
+.ly4se.
+.ly4sk
+.ly5s6e
+.lys5s6
+.ly8str
+.ly4te.
+.ly4ve.
+.lø8de.
+.lø6en.
+.lø8ne.
+.lø6pa.
+.lø4pe.
+.løv5i
+.løye5ne
+.lå8ma
+.lå5re
+.lå6re.
+.lå4te.
+.m8
+.ma4ge.
+.mag9r
+.ma3ka
+.ma4ke.
+.mak6t5at
+.makt5s
+.ma4le.
+.ma4li.
+.ma4na.
+.ma4ne.
+.ma4ni.
+.ma4ra.
+.ma4re.
+.ma4ri.
+.ma4sa.
+.ma4si
+.ma6st
+.ma8ta
+.ma6t8h
+.mat5t8o
+.ma4v
+.me4d3
+.me6d5ei
+.me6d4i
+.me6d7in
+.me6d5r
+.mei5er.
+.mei5et
+.mek5l
+.me6la.
+.mel3l6o
+.me4l5ø
+.me4ne.
+.me3ri
+.me4sk
+.me2t6a3
+.me3ta4ll
+.mes5ti
+.me4tri
+.mi6kj
+.mi4le.
+.mi4me.
+.mi4ni.
+.mi4nik
+.min4k3
+.min5k4e
+.mi6s3t4
+.mne6
+.mo5de
+.mo6er
+.mo4na.
+.mo8ne.
+.mon4st
+.mons6t5r
+.mor5d6e
+.mo4re.
+.mor3t6a5
+.mo4se.
+.mo4ta
+.mo4tek
+.mo4ter
+.mo4tr
+.mo5v
+.mu8ga
+.mu8ge.
+.mu6le.
+.mul5es
+.mur7
+.mu5r8e
+.my8ka
+.my4ke.
+.mø4re.
+.mø5res
+.mø2t
+.må6la.
+.mål3o
+.n8
+.nabo3
+.na6ge.
+.nak2
+.na8ke.
+.nan5s
+.na4r
+.na4sa.
+.nat2
+.na3tr
+.nat6tr
+.ne4de.
+.ne4den
+.ne4d5i
+.ne4d3r
+.ned3s4
+.nei5e
+.ne8pa.
+.ne6pe.
+.ne2s
+.ne4t
+.ni8ar
+.ni6er
+.nig4l
+.ni4na.
+.ni5o6g5
+.ni4pa.
+.ni6pe.
+.ni8sa
+.ni6se.
+.nita9
+.ni4to
+.ni4va
+.no6de.
+.no6e
+.no8ka
+.no4me.
+.no8mi.
+.no4r
+.no8se
+.no8si.
+.no4va.
+.nu4e
+.ny5a
+.ny8sa.
+.ny6se.
+.ny4te.
+.nær9ast.
+.næ4re.
+.nød4d
+.nø4re.
+.nå4de.
+.nå6le.
+.o6
+.obo5e
+.od4da.
+.od4de.
+.od8la.
+.od8le.
+.offsi6
+.of4te.
+.of5teb
+.og4
+.ok1k
+.ok8ka.
+.ok8ke
+.ok4se.
+.old3s
+.ol4ga.
+.oli5
+.ol8la
+.ol8le.
+.ol6m
+.om1
+.om4ar.
+.om6bo.
+.om4e6n
+.om4gå.
+.om4me
+.om5s2
+.on4de.
+.on5des
+.ond3s
+.on6kl
+.on6na
+.on8ne.
+.op5ar
+.op4pa
+.op4pe
+.opp7el
+.op4pi
+.opp3l
+.oppla8te.
+.opp5s6
+.op7r
+.opt6
+.or4da
+.or4de.
+.or4del
+.or4dr
+.ord5s4
+.or5ga
+.or6ka.
+.or4ke.
+.or6me.
+.or4re.
+.ort6
+.or6va
+.osa5
+.os4k
+.os4s
+.os4te.
+.ot5r
+.ot7t8a
+.ot4ta.
+.ot4te.
+.ot4tes
+.ot3to
+.ot4to.
+.ove6
+.over3
+.overen6d
+.over3i4
+.over5k8
+.ov8re
+.ov5u
+.p6
+.pa8la.
+.pa4le.
+.pa5n6e
+.pa6n7eu
+.pa5n6i
+.pa6re.
+.pe3do
+.pe4ke.
+.pek5t
+.pel4sj
+.pe4ne.
+.pe2p
+.pep3r
+.pe8sa.
+.pese5t
+.pe4st
+.ph2
+.pi6le.
+.pi6p
+.pi9ra
+.pi2s
+.plen5g6
+.plus6s5
+.plus7s6e
+.plø7se
+.po4et
+.po3la
+.po8la.
+.po4le.
+.po4log
+.po2p1
+.po2p2e
+.pop3p
+.po3p2u
+.po8ra
+.po6re.
+.po4res
+.po6st
+.po8ta.
+.po6tek
+.ps2
+.pøn3
+.pøn9s6
+.på5d6
+.r6
+.ra6da.
+.ra6et
+.ra4ga.
+.ra4ge.
+.ra4ja.
+.ra4ka
+.raks7
+.ra2m
+.ra4na
+.ra4ne.
+.ran7s6a
+.ra6pa.
+.ra6pe.
+.rap4s
+.rap5s4e
+.rap5s4o4
+.ra4re.
+.ra6sa.
+.ra7ti
+.ra6va.
+.ra4ve.
+.re4al
+.re6da.
+.re4de.
+.ree6l
+.rege4l
+.re4gi.
+.rei2
+.rei7de
+.rei5er.
+.re4ins
+.re6ka.
+.re4ke.
+.re8klar
+.re8kle
+.re4kli
+.re6kn
+.re8le.
+.re4ma.
+.re4na.
+.re4ne.
+.ren6sk
+.ren4t
+.rep5s
+.res9s
+.re5s6tan
+.rett7s8kri
+.re4ve.
+.re4ves
+.rev9n
+.ri2d
+.ri8e
+.rie5ne
+.ri6ka.
+.ri6ma
+.ri4me.
+.ri4pa.
+.ri4pe.
+.ri4p5o
+.ri4sa.
+.ri4se.
+.ris5ko
+.ri4s3ø
+.ri4ta.
+.ri6te.
+.ri6va.
+.ri4ve.
+.ro4an
+.ro4de.
+.ro8di
+.ro4e
+.ro8ke.
+.ro4ma.
+.ro4mi
+.ro6pa
+.ro9par
+.ro3pe
+.ro4pe.
+.ro4sa
+.ro9sar
+.ro4se.
+.ro4sed
+.ro4ta.
+.ro4te.
+.ro4tek4
+.ro8va
+.ro3ve
+.ro8ve.
+.ru8ga.
+.ru4ge.
+.rug9le
+.ru8ka
+.ru4na.
+.ru4ne.
+.runes6
+.run7g
+.ru4se.
+.ru4sk
+.ru8va.
+.ru4ve.
+.ry2e
+.rye7ne
+.ry6ke.
+.rød2
+.rød7s4
+.rø8le.
+.rø4re.
+.rø1v
+.rø8va.
+.rø4ve.
+.røy7e
+.rå8da.
+.rå4de.
+.rå4en
+.rå8er.
+.råg8
+.rå6ka.
+.rå4ke.
+.rå3k4l
+.rå6na.
+.rå8sa.
+.s6
+.sa4ge.
+.sag6n
+.sa4la.
+.sa4le.
+.sa4me.
+.sa4mer
+.san6d7
+.san7d8e
+.san7d8i
+.san8s7ku
+.sau6e
+.sch6
+.se2b
+.se2e
+.se4i
+.se4k5l
+.sek4s5o6g5
+.sel4v5
+.sel4v5i6
+.se6na.
+.se4ne.
+.sen7s
+.se4ra.
+.ser7vel
+.se4te.
+.sha9ke.
+.si2d
+.si6er
+.si6ga.
+.si4ge.
+.sik5k6e
+.si8la.
+.si4le.
+.si4ne.
+.sinn6s5
+.si4ra.
+.si5str
+.si4va
+.si4ve.
+.sje4i
+.sju5o6g5
+.sk4
+.ska7ka
+.ska5ke
+.skat4
+.skei5d
+.ski6n
+.skinns6
+.sko7de.
+.skog5u
+.skritt9s8
+.skudd5s6
+.skuddså7
+.sku6m5
+.sky6f7la
+.skå5ra
+.slim5
+.slotts5
+.slu9ka
+.slu5ke.
+.slø5se
+.sma4s
+.smas5k
+.smo9g
+.små3
+.små7k6
+.små9l
+.små5t4
+.småt5t
+.sn4
+.sne3
+.snitt5s6
+.snø3k
+.soa8
+.so8de
+.somma4
+.son6a
+.sop4pa
+.sor4t5
+.so4ta.
+.s8p6
+.spa5ra
+.spe6e
+.spi9la
+.spri5s6
+.st6
+.sta9ka
+.sta5li
+.stat4s
+.sted4s
+.ste4i
+.stein7a8
+.stein7s8
+.stem4m
+.stev9na
+.sti7me
+.sto5ne
+.sto6ra
+.strek5s6
+.stu8a
+.stu9va
+.stål5l6
+.sund5s6
+.su4ri
+.su5te
+.sv8
+.sva5la
+.sva5ra.
+.sva5re
+.svar5s
+.sver8n
+.syd5
+.sy5d6e
+.sy6na.
+.sy4ne.
+.sy5ter
+.sy3ti
+.sy6v5
+.sy6v5o6g5
+.sz6
+.sæ2
+.sær1
+.sær3e4g
+.sø8ka
+.sø4ke.
+.søl6v5
+.sør3a
+.søye5
+.søy6en
+.så5pen
+.så3re
+.t8
+.ta8ke.
+.tak9r
+.tak5sk
+.tak9s8p
+.ta4la.
+.ta4le.
+.ta4les
+.tal4li
+.tam5m
+.tan5de
+.ta4p5r
+.ta4ra.
+.ta4re.
+.ta2s
+.te4e
+.te6i
+.tei9er
+.te8ke.
+.te4ma.
+.te6o
+.te8ne.
+.te4se.
+.te7si
+.te4sta
+.te4str
+.th2
+.ti8a
+.tid5r
+.tid6s3
+.ti4de.
+.ti4e
+.ti4g3r
+.ti4ki
+.ti4l5
+.tili6
+.ti4med
+.ti4na.
+.ti4ne.
+.ti4p5l
+.ti4s
+.to5arm
+.to6en.
+.to4er.
+.to6et.
+.tokk8
+.to6le.
+.to6na.
+.to5o6g5
+.to4ra.
+.to4re.
+.to6reb
+.to3ro
+.torsk6e5
+.tor4s5v
+.to5rye
+.to4str
+.tota9la.
+.to5t8
+.to8te.
+.to6va
+.to4ve.
+.tr6
+.tra7c
+.tre3b
+.tre7p
+.tre5o6g5
+.tre6skja
+.tre3s8ko
+.tre3sp
+.tre5s6t
+.ts2
+.tsj2
+.tu4en.
+.tu6na
+.tu4ne.
+.tu6ra.
+.tu4re.
+.tu8ve.
+.tve6n
+.tver6r5a6
+.två7g
+.ty6da.
+.ty4de.
+.ty8et
+.ty8re.
+.tyr8s9
+.ty5ter
+.ty5ti
+.tæ4re.
+.tøv9d
+.tø6ve.
+.tø9ver
+.tø5vet
+.tå5ker
+.tå4le.
+.tåp9n
+.tå5ren
+.tå7ret
+.u5a6
+.u1b2
+.u6berg
+.u3d2
+.u7de
+.u3e6
+.u4er.
+.u6era
+.u4ere
+.uf4f
+.uf8sa
+.u4ga
+.u5gi
+.ug6la.
+.ug8n
+.u1i
+.ui6m
+.u1k6
+.u4ka.
+.u6ke
+.u7kn
+.u3le
+.u4le.
+.ule8k
+.ulen4d
+.u6lende
+.u8lene
+.u6let
+.u4lin
+.ul6ka
+.ul4ke.
+.ul4la.
+.ul8le.
+.ul8ma.
+.ul4me.
+.ul4ne.
+.ul5t
+.ul6te
+.u1lu
+.ul4v5i
+.u1ly
+.u3lå
+.u5ma
+.umu7
+.u2n
+.unde6ri
+.und5r
+.une8
+.u5nek
+.u9net
+.un4ge.
+.un2n
+.unn3s
+.u3no
+.un4se.
+.un4t
+.u5nu
+.u1o
+.u1p
+.u4pi
+.up2l
+.u2ra
+.u5raf
+.ur6an
+.u6rane
+.ur4d
+.ure4n
+.u4ret.
+.u6rets
+.u2r2i
+.ur4ke
+.ur6na
+.ur4ne.
+.u1ro
+.ur1s
+.ur8ta
+.ur4te.
+.urte5m8
+.ur6tet
+.u5rut
+.u3ry
+.u5rå
+.u1s2
+.u4sa.
+.u4sas
+.u5se
+.u3ska
+.u5sn
+.u7sp
+.us3se
+.us6t4
+.u7stek
+.u5stel
+.usy5r
+.u2t
+.uta4g
+.ut5age
+.u3tak
+.u4ten.
+.ut5esk
+.ut6e7sko
+.u4ti.
+.ut3kan6t5
+.ut4ne.
+.u5tol
+.ut3o6v
+.ut6rer
+.ut6rov
+.u3trø
+.ut6se.
+.ut4si.
+.ut3t4
+.u3tu
+.v6
+.va4da.
+.va4de.
+.vai4
+.va4ke.
+.va6les
+.valg5s
+.va4ne.
+.van4n5
+.vann5s4
+.va6reta
+.vari4e
+.var5sk
+.ve8en.
+.ve4ga.
+.ve6ge.
+.ve4g3i
+.veg3s4
+.vei3g4
+.vei3s
+.vei4ta
+.ve4l3
+.ve5l4ar
+.ve6l5art
+.vel5d
+.ve4l3e
+.vel5l
+.ve5l4os
+.ve4l5ov
+.ve4ly
+.ve8læ
+.ve4ne.
+.ve4net
+.ve4ra.
+.ve4ras
+.ve6re.
+.vermo9
+.vers4t
+.ver5ste
+.ve4sl
+.ve4st
+.vete5
+.ve8te.
+.ve4ve.
+.vi4da.
+.vide4
+.vi6de.
+.vi4d5å4
+.vi2e
+.vi4ka.
+.vil5l6a5l
+.vil5l6a5t
+.vi6ma.
+.vi8me.
+.ving7s
+.vin5n
+.vi4sa.
+.vi4se.
+.vi6seri
+.vi4ta.
+.vi4te.
+.vi5tr
+.vok4s3
+.vok5s6e
+.vo6r
+.vo6ta.
+.vy4
+.vye5ne
+.væ4ra
+.væ4re.
+.vå4d
+.vå4r3
+.vårs6
+.wa4r
+.wi6e
+.xe2
+.y6
+.ye4
+.yn8da.
+.yn4de.
+.yn6ge.
+.yn8ka.
+.yn6ke.
+.yn4kv
+.yns2
+.yp8pa.
+.yp4pe.
+.yr8ja.
+.yr8je.
+.yr8ka
+.yr4ke.
+.yrkes5
+.yr6t
+.ys4
+.ysterie8
+.yt9ren
+.yt5t
+.yt6te.
+.yv6
+.z4
+.zj8
+.æ8
+.ære4s5a
+.ære4st
+.æt4te.
+.ø6
+.øg8la
+.øg4le.
+.øi5
+.øi6e
+.øko5
+.øk6ta
+.øk4te.
+.øl3ed
+.øl3s6
+.øl3v6
+.øm4me.
+.øres8t
+.ør4je
+.ør5k
+.ør8na.
+.ør4ne.
+.ør6ski
+.ør9sm
+.ør3st
+.ør8ta
+.ørt9an
+.ør8te.
+.øs2
+.øs4t
+.øv4d
+.øve4r5
+.øve4r6s
+.øv4re.
+.øy6de.
+.øy2e
+.øyele8ge.
+.øy5ene
+.øy4n
+.øy6na
+.øy6ra
+.øy4re
+.øy8rer
+.øy4str
+.å2
+.å6e
+.å6f
+.å6g
+.å6k4
+.å8l
+.ål6t
+.ål8ut.
+.å8m
+.ån8da.
+.ån4de.
+.ånd6s5
+.åp6na
+.års3k
+.å6se
+.ås3k
+.ås7l
+.ås3m
+.å3ste
+.ås5v
+.å4t
+.åt4te.
+.åtte5o6g5
+.å6v
+a1ad
+4aaf
+a3aft
+aa4g
+a1aks
+aak5v
+aa3la
+aa2m
+a1a2n
+a6an.
+aans9t
+a7antr
+a1ap
+aa4ri6
+aarie9ne
+aar5n
+aa2s
+3aase
+aa5t6h
+a1av
+a6bab
+ab7av
+ab9b8l
+ab4but
+abe4lei
+abel5t4
+abe9na.
+abes9ka
+4abev
+a5bh
+abie6
+abi9er
+abi9la
+a4bist
+ab1l
+ab9lara
+ab4lok
+abl7u
+a5bo9a
+abo3b
+abo3e
+a3boer
+abo3kl
+a3bord
+5aborte
+ab1r
+ab8re
+ab2sl
+abu5e
+a4buel
+a4buf
+a6busk
+a4bute
+a4by.
+a4byb
+a4byk
+aby3r
+8ac
+aca5
+a6ca.
+ache3a
+ack3
+a1co
+6ada
+a5dal
+ad5ant
+a4dart
+ad9da
+a2deb
+ade5i6s
+a2dek
+a4del
+a4d5elv
+a5dend
+a3dene
+a2deo
+a2dep
+a5der.
+aderle7
+a2des
+a5de4ser
+a3desl
+a3det.
+a3dets
+3adfer
+1adg
+ad8ge
+adi4ene
+ad1j
+1adju
+2adl
+1adm
+ad5n
+ado7a
+a4dob
+ad7opp
+4ador
+a7dora
+ad5raf
+ad7ran
+a2dre
+ad7rel
+ad5rep
+ad3ret
+ad3rid
+ad1ro
+a7drø
+ad4s5amt
+ad4si
+adsle6ge.
+ad5s4let
+ads5te
+ad5s6tek
+ad3str
+ad5un
+1adv
+adva5re
+2adve
+a4dy.
+a4d5øy
+2a1e2
+4aea
+a4ed
+ae3de
+aed7r
+aek5t
+a4el.
+ae5la
+ae3li
+ael5o
+aen5t
+a3ep
+aes8ke.
+aes4t
+6afa
+6afc
+a4fe.
+afei5
+af4fan
+af4fei
+affe3s
+af7fi.
+affi3d
+af5f4u
+af4i
+afia1
+afi5an
+a2fib
+a6f5inn
+afi7re
+a4fiti
+a5fjo
+af9la.
+af9lar
+af3le
+af5li
+a4frik
+6afo
+afo7ra.
+afo7r8e
+afore5ne
+afra5s
+1afri
+afs1l
+aft5ei
+af4t5e4l
+af6t5o
+aft1s4
+af5yr
+afø4r
+afø5ri
+4aga
+a2gaa
+a5gae
+a4ganf
+agang7s8
+a4gart
+a5gas.
+aga6ve.
+ag5de
+a7gelen
+a2gem
+3a4gent
+age4r3a
+age6rek
+age5risk
+a7gers
+a5geru
+age5s2
+a4geta
+a4gé
+ag5gar
+ag4gas
+ag5ge
+agg1s2
+agg7u
+ag6gut
+a4gi.
+ag5id
+agi6s
+ag1la
+ag4lem
+ag6lesa
+ag5lå
+agmo8e
+agn5om
+4ago
+ago5d8
+ag1or
+a5gos
+a3got
+ag5ov
+ag7ras
+ag1re
+ag1ri
+4a3gru
+ag1rå
+ag4samb
+ags4ang
+ag3s4ei
+ag4sel
+ag3sem
+ag5s6ing
+ag6sju
+ag4ska
+ags4kul
+ag2sl
+agsmå6la
+ags3tr
+ags3t2v
+ag2sy
+a6gu.
+agu3ay
+agå8va
+agå8ve.
+a1h
+a5hi
+ah4n5
+ah4v
+ai1a4
+ai3e2
+ai3er.
+ai4is
+ai5ke.
+ai5ko
+ai9kv
+ai5ne
+a3ing
+a1inn
+ai4n5o4
+ai1ro
+ais4e
+ai4s3k
+aisk2h
+ai8sm
+ais6om
+ais5s
+ai5s4v
+ai5ve
+ai5ø
+a1j
+aja9d
+a7je
+a8je.
+ajes7
+a4jé
+a4ji
+a6jl
+6ak.
+a1ka
+4aka.
+1a2kad
+6akaf
+ak3aks
+6akan
+aka4o5
+4akar
+ak6arb
+aka4t5r
+ak4au
+2akd
+2ake
+a9kec
+a2keh
+a3kei5
+a6kek
+akel8e
+akelei9er
+ake5l4i
+ake4rek
+a4kerø
+ake5sm
+akes6p
+a8kete
+akhe6n
+4a1ki
+a6kid
+a6kik
+ak7ind
+akis1
+2a1kj
+akk6and
+ak5ke.
+ak3ken
+akk5erst
+ak4kes
+akki4
+ak5kim
+ak4k5is
+ak6kj
+ak1ko
+akk3ol
+ak6k5ri
+ak1ku
+ak4kul
+ak4k5v
+2ak1l
+ak3lev
+ak6lik
+ak6lus
+6akn
+ak5ne
+a5kno
+2a1ko
+ak5om.
+a5kon
+a7kos
+ak1o2v
+ak4pe6
+akra8sa
+ak5reg
+akregi4
+ak3res
+ak3ro.
+ak3roe
+ak1ru
+ak4s5and
+ak4sek
+akse3l4o
+ak4s5elv
+ak4ses
+ak7s6id
+3aksje
+ak2s1k
+ak7sku
+ak6sl
+4akso
+4aksr
+aks5ti
+ak5stol
+aks4tr
+akst7ren
+4aksu
+ak4tab
+ak4tai
+ak4tak
+akta6le.
+akt5all
+ak6tam
+ak6tans
+ak4tap
+ak4tas
+ak4tav
+ak4teg
+ak4tek
+ak5teme
+4akth
+7aktig
+ak5tit
+aktle6ge.
+ak2tr
+ak6tre
+akt3rå
+akt5s4la
+5aktue
+akut2
+2akv
+ak3val
+ak5øl
+a5kå
+8ala.
+al7adr
+ala4g
+ala9ga
+a5lagm
+alag8ra
+a5lah
+a1lai
+al3all
+al3a4me
+al3ana
+a3land
+a5lande.
+a5lane
+alan5gr
+al3anl
+al3anv
+ala4o
+ala5pr
+a5lar.
+a3lara
+a5laren
+al3ark
+a7larl
+3a4larm
+al5arr
+a5lars
+al3art
+a7larv
+al3a4si
+2alat
+ala7tr
+4alau
+al5auk
+al1av
+ala4va
+al4ba.
+albo4g
+albu7er.
+5album
+al3de
+al7der
+4aldo
+ald3re
+2ale
+a2lef
+a2leg
+a9leg.
+aleie6n
+a9l8eik
+a5leke
+a4leks
+a4leli
+a2lem
+al5e4mu
+al8en.
+a4l3enh
+a4l5en5tr
+ale4pos
+a7lept
+a4lered
+alere6de.
+a4le5ro
+a4leru
+ale1s2
+ale7se
+a4lesk
+ale6s5kr
+a4lesl
+a6lesu
+a4leta
+a4le3te
+a2leu
+ale5v
+a4leva
+a4levi
+3alfab
+2alg.
+al3geb
+al2gu
+al4går
+al3ill
+a2lim
+a9lin.
+ali5na.
+a4l3ind
+a4l3ins
+al3int
+al9ja.
+al3je.
+alj5end
+al3jer
+al1jo
+al4jor
+al2j1u
+al1jø
+alj5ø6v
+al9kera
+alk7s6
+alla4ga
+alla6ge.
+al4lap
+all5art
+al5lea
+alle6ge.
+al4lek
+al5len.
+all5erst
+alle3s4
+al4lest
+al5let
+3allia
+al4lid
+5alli5e
+alli9ne
+al6list.
+al4lo3m
+all4sen
+all4sti
+al6lul
+al6løs.
+al4løse
+al8løst
+al6lå
+al6mek
+al4met
+4aln
+a5lo.
+al1o4b
+a5loi
+al1om
+a1lon
+al3ope
+al7ord
+alori5
+alo6rit
+al3ove
+alow7
+alp2
+al3ps
+2als
+al7sed
+al9skap
+al7skare
+als1l
+als5lø
+al2sn
+al6spu
+als4te
+als6ter
+6alsu
+alt6ak
+alta8le.
+al3ted
+al7tema
+5alterna
+alte4t
+al4t5eta
+al4t5ete
+al4t3op
+a4l5u4k
+alul8la
+al5und
+alu8re.
+al5va.
+alv5aks
+alvak8se.
+al4ved
+al5v6er
+al8v9er8m
+alve5s
+al9ves.
+alvi8se
+al1vo
+alv3s
+6a1ly
+a2l5y4te
+alø5se
+al3øv
+a1lå
+al7å6t
+a4mah
+ama5is
+a2mak
+a5maki
+am3aks
+a2mal
+am5ald
+a3man
+a3mar.
+a5mara
+a7mas.
+amaso7
+3a4matø
+am4bar
+3ambas
+am4bat
+am5be
+a2mei
+am3eie
+a3meis
+a2mek
+am3eks
+amen8de.
+amen4s3
+amen6t7arv
+ame4ram
+a4meret
+3a4meri
+4amerin
+ame5u
+amhu7
+2ami
+ami7na
+ami7ne
+amisk3
+amis4ku
+am4lese
+am6lest
+am4mad
+6amn.
+am4ned
+a2mo
+amo5e
+am1op
+am1or
+amo6ve
+am4pap
+am4pare
+amp5ei
+am8peria
+am6perie
+ampes6
+amp7inn
+am2p3l
+am5p4let
+am4p4re
+am4pun
+am2på
+amru4
+am5rå
+am1s
+am7s6ku
+ams4l
+amst6
+am4s3tr
+ams9ut
+ams2v
+am4s5ve
+am2sø
+am3ti
+amti5da
+5amtm
+am7tv
+am6ul
+am5yr
+am5øy
+6ana.
+anak8te.
+ana3la
+anal4f
+3analy
+8anan
+a3nane
+a5nang
+anant8
+4anar
+a6narb
+an5art
+ana3to
+6an7au
+anaus7
+an9av.
+3anbef
+4and.
+an4da5m6
+anda5ta
+an4dek
+an5den
+anderle7
+an9det
+6ando
+an4dos
+4ands
+and4sel
+and8send
+and7slet
+and5s6tre
+a2ned
+an5egg
+a4n5elv
+a2nem
+2anen
+2aner
+ane3ru
+a5nes.
+a4nest
+ane5sv
+an5e6tika
+a5netike
+an5e6tikk
+an5e4tis
+a2nev
+3anfal
+anfø5re.
+ang4e
+an4ged
+an4g5enh
+ang5erme
+an8geste
+an4gi.
+5angiv
+ang5of
+an5gos
+an4g9ra
+an4gre.
+an6gres
+an4gret
+an4g3ry
+ang4sm
+angs6tro
+angs8t9rå
+angst5y
+ang5sva
+ang6søy
+ang4t5re
+ang5t6ve
+an4gun
+an4gå.
+ania7
+a6nib
+a4nisj
+4aniv
+an4kana
+4anki
+4ankj
+an4kob
+an4kop
+an4kos
+an2k1r
+ankra8na.
+ank3re
+ank3ut
+8an2kv
+an4kø
+an6k5å6
+2anla
+anland6
+anlø9pa
+ann5ans
+an6neme
+an5nen
+an5ner
+an5nid
+an4ninn
+an4nom
+5annon
+an4nov
+ann4sei
+ann4sid
+ann6s7kå
+ann6sl
+ann3st
+ann5sta
+ann4s3u
+an4ny
+an2nø
+a3no.
+a9noa.
+ano6deb
+2anog
+a7norm
+a6not
+a2no4v
+ano5va
+an3ove
+anri7ke
+ans5aft
+ansa7ka
+4ansan
+3ansat
+an4sek
+an4sent
+anseri8e9ne
+an4ses
+3ansik
+ans5ind
+ans5ins
+an4ski
+an3skj
+ans4k3l
+ans6kun
+an5skø
+an6slø
+an4sn
+ans5or
+an4s3pi
+ansport7s6
+an1st6
+6anstar
+ans4te4
+2ansu
+an9s6und
+5ansunda
+1an1sv
+4ansve
+6ansy
+an4så
+anta8la
+an5t6and
+an4tans
+an3ted
+ant5emi
+5antenn
+an4tesl
+anti7kl
+an4tim
+an5toi
+ant5ord
+ant5rab
+ant7rom
+ant5ryg
+ant5s6
+an4tul
+antus4t
+2anu
+anus7a
+an5ut
+3anven
+6anvin
+6any
+a4nya
+a2n1æ2
+anær8
+2anø
+a2nøk
+an7å
+a1o
+ao9a
+aog9
+a2oi
+ao6k6
+aon8de.
+ao2p
+ao4r
+a5pea
+a7pé
+a1pi
+a2pia
+ap1id
+a6pik
+a6pins
+a2pio
+api6r5
+api7r6e
+api7se
+ap1j
+a1pla
+a5p6las
+ap3li
+ap9lo
+ap2ly
+4apol
+a4pon
+a4poo
+apo3p
+apo5s4ti
+a2pot
+3ap3par
+4appar.
+6appare
+app7esk
+ap5plas
+ap4ple
+ap5pli
+ap6pri
+ap3ra
+ap5ren
+ap5ret
+ap3rin
+ap2s1
+apsa4
+ap3sel
+apse4s
+ap8s9l
+a3psy
+ap4s5ø
+8apu
+a6p5ut
+a1py
+ap7ø
+a3p8øls
+a5på.
+a1ra
+ara9bi
+ar5aks
+arak5t
+ar3alt
+a4rami
+2aran
+a4ranor
+a4rans
+a4ranv
+2arar
+a4r5ass
+ara5te.
+ar5aug
+ar7auk
+arau9ken
+ar7avh
+1arb
+2arba
+arba8ne.
+6arbeh
+4arben
+6arbet
+2arbi
+4arbj
+6arbl
+2arbo
+arbo8da
+2arbr
+2arbu
+2arby
+2arbø
+4arbå
+ar7deb
+ar6deli
+ardfø5re
+ard3re
+ard5sta
+a1re
+1a2rea
+4arear
+a4reb
+areba4r
+a2red
+a2ref
+a2rei
+are3in
+a2rek
+a6r5ekt
+a4rela
+ar7elek
+a4r6eli
+ar7emn
+a5remo.
+3arena
+a6r5eng
+a4reni
+aren5tes
+a2reo
+a2rep
+a6rerel
+a4r5erfa
+a6rerk
+a4rero
+a6rerø
+a5res.
+ares8ka
+ar4et
+a7reta.
+a4rev
+ar7e6va
+ar3evn
+arev6ne.
+8a1ré
+6arf
+ar7g6h
+ar5g6i
+6argj
+arg4l
+ar7go
+arg5stj
+2a1ri
+aria7ne
+a3rib
+ariba9
+ar5idr
+a4rim
+ar3inn
+ar3ins
+arins9k
+ar3int
+ari3se
+arise4a
+a4risto
+a2riv
+ar4kau
+ar3ke
+ar4ke5s
+ar5kha
+3arkit
+3arkiv
+ar4kle
+ar4k5løf
+ar6kod
+ark6ste
+ark4str
+ark7veg
+ar4køy
+arla4ga
+ar4map
+5armbå
+ar4medi
+arme7t
+ar6metr
+ar4minf
+armle6ne.
+armå6la
+2ar2n
+ar4nad
+ar4nal
+arneva7la
+ar3ni
+ar3no
+ar3nu
+ar3nå
+a1ro.
+aro8de.
+a5rok
+a1ron
+ar1op
+aro6pa
+a4r1o4r
+a1ros
+ar7ost
+a1rot
+ar3ove
+ar6ped
+ar9po
+arp5ret
+1arra
+ar5ree
+ar7resk
+arri8e7
+arrå6da
+2ars
+arsa6ka
+ars5ans
+ar3sel
+ar6s5ers
+ar4sin
+ars5kam
+ar5skar
+ars5kes
+ars7kre
+ar4spr
+ars6tr
+ars4vei
+ars7æ
+arta4la
+arta6le.
+ar3te
+ar7tele
+8artets
+art4ha.
+art4has
+ar4tika
+6ar4tim
+4artn
+4arto
+ar4top
+6artr
+art9ra
+ar6trin
+art6s5t
+arts5ø
+6artu
+8arty
+ar4tyv
+ar1ul
+ar1un
+ar5u6r
+a1rus
+ar5utb
+ar5utn
+arve3s
+ar6vete
+arvi8sa
+arvi8se.
+a1ry
+ar7æ6
+arø8ve.
+ar1øy
+a1rå
+arå8de.
+ar7åp
+a6r5åt
+6as.
+4a1sa
+asab4
+asak4
+a4salo
+as6an
+as7aug
+asbe2
+a1sc
+a2se.
+asea4
+a2sed
+a2seg
+a2sek
+as4el
+ase5le
+a2sem
+a6senet
+a4senk
+a7seol
+a2se5s
+a6sest
+a4sete
+a2se3u
+as2h
+as5hu
+a4sib
+a2sip
+a2sir
+a7sis.
+asis5t
+a2siv
+as4ja
+a6sjett
+as5jor
+as3kar
+ask6et
+as5keti
+ask2i
+as5kis
+a5skj
+as5ko.
+as5koe
+a4s5kopi
+as3kor
+as3kot
+a1skr
+as7kra
+as3kul
+a5s6kula
+as6kule
+ask9u8t
+as4kv
+ask5øy
+as1l
+a5s4lag
+asla8ga
+as4lev
+as4lit
+a1so
+a4so.
+a2s5om
+as5ov
+as4pan
+as3pe
+as7pis
+as5pl
+as9sa.
+as4sab
+as4sal
+ass5ald
+ass5alt
+as4sam
+as5se.
+as4sed
+as4sek
+asseri7e6
+as4serv
+as4ses
+as6sifr
+as5sing
+assi3s
+as4sit
+as2sj
+as6s1k
+assku6le.
+as2s3n
+as5so.
+asso9a
+as7sos.
+as6s1p
+as2s3t
+as4stan
+as4str
+ass5tru
+as2s1v
+as4sys
+as4søk
+as2s5å
+as1ta
+as6tab
+a6stande
+a4statu
+as5te.
+as3ted
+as4teg
+as4tek
+as4t5enh
+a1stj
+a9stof
+a5stok
+ast5ov
+ast5ren
+as4tro
+as9tua
+astu8ve.
+ast5ø4v
+a1su
+asu3n
+asu9sa
+as1va
+a6sym
+asyn7d
+as7øye
+as5å
+4at.
+4ata1
+a5taene
+at6af
+ata8ka.
+ata8la.
+a4tang
+ata9rar
+a6t7arv
+atas4
+a5tas.
+atat8
+a2tau
+at5avh
+atch5
+a2tea
+a2tec
+at7edd
+a2tee
+a4tei
+at5eid
+at3eig
+ate3in
+a4teka
+ate5k8e
+ateke7ta
+a6t5ekte
+ate7le
+at3emb
+4aten
+a5tene.
+a4teni
+a4tenu
+a2teo
+4ater
+a5ter.
+a6terat
+a8terek
+a4teril
+a2tes
+a4t3ett
+at6e5u
+a4té
+3atfer
+at4ha.
+at8has
+4ati
+atik6ka
+atili5
+ati5nea
+ati4rep
+ati8sta
+at3jo
+5atlant
+atl9øy
+3atmos
+at4nel
+ato5a
+ato5gr
+at1oi
+a2tom
+a6t5oppr
+a1tor
+a5tose
+a3to1v
+a1tra
+at5reg
+at3ren
+at3rer
+a4trif
+at3rin
+at5rot
+a9tru
+at5røs
+at5røy
+2ats
+at3ser
+at7sje
+at7s6kat
+at7skj
+ats6kul
+at2s3ø
+4att.
+at6tat
+4at5te.
+at5tens
+attfø7re
+at4tid
+atti4s
+att5ise
+at3tit
+att1o
+att7o6p
+atto6v
+at1tr
+at4traf
+at4t3re
+at6trin
+att3s6k
+att5s8l
+att3sp
+att3sv
+at6tys
+at2t3ø2
+a1tu
+atu5e4
+a2tut
+at5v
+atvi5er.
+a3t3w
+a1ty
+atyr8ke.
+a5t6yv
+a1tø
+atør3s
+atø9se
+a4t5øy
+a3tå.
+a7tåa
+a1tåe
+at5år
+at5å4se
+at7åt8
+4au.
+8a8ua
+au9ar.
+4au5b
+auba6ne.
+au3c
+au5da.
+au9det
+au4di.
+4a6ue
+au7en
+au7er
+aue5re
+au3est
+au6e5ta
+au5e6te.
+au4gal
+au4gas
+au4gel
+augele8ge.
+5aug2n
+3augu
+au5i
+au5keli
+au5ket
+auk5la
+1auk7s6
+au5kve
+au6las
+au4lat
+aul5l
+aul8la
+au5lu
+au9men
+au6mo
+aum5s6k
+aum7s4t
+a5und
+au5rae
+aure5s
+au5ret
+au5ri
+aur5s6
+au1ru
+auru4e
+au1sa
+aus9kj
+au6skr
+au1so
+aus5s
+au6s8tas
+aus8tett
+austi6s
+aus6t7ise
+aus6ton
+au5str
+au6stri
+au1su
+au4sun
+au2s5ø4
+aut6a
+au3ta.
+au7tar
+au5te
+1auto
+auto5v
+au3t4re
+au4ty
+2aux
+a1va
+av5ab
+a5vae
+ava7g
+6aval
+av3alv
+a4v3and
+av3ang
+a4v5anl
+3a4van5s
+a9var.
+av3art
+avar6ta.
+4avas
+5avbi
+1avd
+3avdel
+2a1ve
+a2ve3d2
+a5vede.
+a7veil
+ave3in
+a2vek
+a4vela
+a4vele
+a5veleg
+avens4
+a5ver.
+ave7ras
+aver5d
+a6verei
+a2ves
+a2vev
+1avfa
+1avg
+avi4ar
+4a5vig
+a1vik
+avi9ke
+a1vin
+a4v5int
+2avir
+5avisa
+avi5sa.
+3a6vise
+av5ising
+avis3t
+a5vit
+avlu9t
+avlø5se
+6avn
+av7na
+av4nes
+a1vo
+a4vok
+avo3r
+avo4v
+av1r
+av4res
+av5ri
+av1sa
+av5seg
+avs2i
+avsko7g
+3avsni
+av1s2p
+avspe9g4
+avs4te
+av5su
+av1s2v
+1avt
+avta9ka
+2avu
+1avvi
+av3øl
+4a1vå
+a6v7å6l
+a1wa
+awat4
+a5we
+awe9ne
+a1wi
+ay2a
+ay7ane.
+ay5ar
+ay9s8t
+a5y4t
+a5zu
+azz3o
+a1ø
+a7å6
+1b4a
+ba3a
+baby5
+ba4bys
+ba5cl
+ba2d
+ba4da.
+ba7dan
+b5add
+ba8de.
+ba4deb
+ba5den.
+ba7dens
+ba3di
+bad1s
+4baf
+ba2k
+ba5kan7
+ba3kar
+bakars9
+ba3ken
+ba4k5end
+baken6de.
+ba3ker
+bake3s
+ba9ket.
+bak9ett
+ba3ki
+ba8ki.
+bak6kers
+bak6ko
+bak5kr
+4bakr
+bak4re
+ba5kri
+bak3ro
+bak3sm
+bak5sp
+bak5s6ti
+bak5str
+bak7t6
+bak1v
+ba3la
+bal7ak
+ba4les
+ba4li.
+bal3j
+bal4lag
+bal4lan
+bal4led
+bal4leg
+bal4lei
+bal4lev
+bal4lig
+bal6lov
+ball5s6
+bal6læ
+ba1lo
+bal5t
+ba1lu
+ban4a
+ba4na.
+ba5nan
+ba5nar
+ban9da
+ba4nel
+ba4nes
+ban6kap
+ban4kor
+ban2k3u
+bantu5
+ba3re
+baret5t
+ba3ri
+bari6e7n
+bark5s
+bar5skr
+bar5tr
+ba5ru
+ba5sen
+ba4seru
+ba4set
+ba3si
+ba2s1k
+bas6sak
+bas4san
+bassi4
+bassis5
+bas4so
+bas4st
+bass6tr
+ba2st
+ba7s8u
+ba1ta
+2ba1tr
+bat6ti
+bau9la
+6bav
+ba5z
+2b1b
+b3ba
+b6bak
+b4b5arb
+b6base
+b3be.
+b4beb
+b4beda
+b2bef
+b4beg
+b6beh
+b2bei
+bb3eie
+bb5eig
+b2bek
+b6belo
+bbel6t3
+bbelte4
+b4bem
+b9bene.
+b2beo
+b3ber
+b4b5erf
+b4bes6
+b7beska
+b6beta
+b6beten
+b4beti
+b6beto
+b6betr
+b2bev
+b8b1h
+b3bi
+bbi9e8
+b4b5inn
+b2b1l
+bb7len
+bb5op
+bb5rek
+bbu9ra
+bb5ut.
+bb5ute
+b2by5
+bby3e
+bby1k
+b4bø
+b6bå
+2bc
+2b1d
+b2dek
+b7den
+b4dep
+1be
+be2au
+be4bo.
+bebo5er.
+bebo9k
+be4da.
+be9dar
+be3der
+bedi9e8
+be4dre
+bed5red
+bed2s1
+bedy9ra
+be1då3
+2bee
+be5ed
+be6ef
+b4ef
+befa5re
+be3g
+bega9
+be4ga.
+be4gi.
+be4gn
+be5go
+be4g5re.
+be4g5rene.
+be4gå.
+be6ha.
+beha7g
+behers7
+4behu
+behå4r
+be6i
+be5ke
+be2k3i
+bek6kel
+bekke5r
+bek4kes
+bek6l
+4beks
+be4l3ab
+bela9ga
+bel5eie
+bel5eig
+bel5ein
+be4lek
+beli9na
+beli9v
+belle5sa
+bel5let
+bel5læ
+be2l1o
+bel5s4p
+bel7s4t
+bel4tag
+bel4te5s
+bel4t3ø
+bel3u
+bel5v
+belæ5re
+belå7ne
+be4na
+be5nat
+be3ne
+4bened
+be4nest
+ben5gu
+be5ni
+ben5s4i
+ben5skj
+ben5sp
+ben5te
+2bep
+b4er
+4berai
+be7ras
+ber5d
+be4rep
+8berest
+bere5te
+ber4ga
+ber4g5ende
+ber5ges
+berg3j
+berg3l
+berg3o
+ber4g3å
+be5rib
+beri5ke
+be7ris
+ber6kl
+ber5na
+ber5ne
+be1ro
+be4ro.
+bero9a
+berri6
+ber5te
+ber5ti
+be1ru
+beru9sa
+berø5v
+b4e1s2
+5bes.
+be4se.
+be5s4i
+4besik
+6besj
+bes5ke
+bes6k5n
+be3sn
+bes7ne
+4be3so
+beso9v
+be5sp
+bes3s
+bes6s7a6
+bes6sel
+bes7si
+bes7tens
+bes6tes
+be5stes.
+be6så
+3b4et
+5bet.
+be4tab
+be3te
+4betei
+be7tes
+beto5ne
+be6trar
+be6tre.
+be4t3ri
+4betu
+be4ty.
+beva5re
+be6ve.
+bevi5se.
+be9vo
+bev9r
+6beå
+beån9
+7bé
+2b5f
+6bg
+2bh
+bhu1
+1b4i
+bi5ak
+bi6bla
+bi5ce
+bi1d
+bi5dee
+bi8dé
+bid6r
+bidu8
+bi5el
+bi6ele
+bi5erv
+4bifa
+bi5g
+bi3ka
+bik1k
+bik6ki
+bi5k4l
+4bi7kr
+bi6la.
+bi4las
+bi4lau
+bi3let
+bilet5r
+bi4lin
+bil3j
+bil5la
+billa8ga
+bil5leg
+bil5m6
+bil1o
+6bi5m
+bi4nans
+bingo5
+bin4gol
+bi7no
+4b5int
+bio7
+bi3o8m3s4
+4bip
+bi4ri5
+bi7ris.
+bir4ken
+bi1ro
+bis2a
+bi3se
+b5ish
+bis6hi
+bis7ke
+bi5s4la
+8bisn
+bi4sp
+bis4p5i
+bis5se
+bi1st
+bi5s6ta
+bis4til
+bis5tru
+bi3s4v
+bi6ta.
+bi4te.
+bi5tes
+bi8ti.
+bi4tre
+bi6tri
+bjar3
+bjek4t5o
+bjø6r
+2b1k4
+b5kh
+bl2
+1b2lad
+blad3a
+bla6f3
+bla8ga
+blak5r
+bla5me
+blan9da
+b4lank
+blan5ke
+b4lant
+b1lar
+b8larar
+b3lat
+bla4u
+b4lef
+bleie5
+blei5er
+b4lek
+ble4k3a
+ble5kes
+ble4mo
+b3ler
+ble7r6a
+b6lesa
+blesse9ne
+b4lest
+2blet
+bli9ke
+bli5ma
+bli5me
+blings6i
+blis3s
+b5lj
+blja4
+blo6dr
+1blok
+blom5m
+b6lu
+blues3
+blu9sa
+bly7gl
+blæ5re.
+blå5n
+blå3r
+blå7sa
+blå5se.
+2b1m
+6bn
+b3ne.
+b3ner
+b7nes.
+b7ni
+b2o
+boa5s4
+bobba6ne.
+bob5by.
+bob9bye
+bo2bl
+bob7la
+bobs4
+bo3de
+bo6din
+bo6d7r
+bo2dø
+4boef
+1boen
+bo2er
+bo4et.
+2bo3f6
+bo4gel
+bogn7
+bog1s
+2boh
+2boj
+3bok.
+bo2ka
+bo6kel
+bo4k3et
+bok1i
+bok1k
+bo6kop
+bo6k5ri
+5bok1s
+boksi8da
+boks4p
+bo2ku
+bok3ve
+b4ol
+bol5eie
+bo7li
+boli7n
+bo7lo.
+bo5loi
+bo4l5o4r
+bol5s4p
+bolst6
+1bomb
+bom4bel
+bom5m
+bo6mo
+bom1s4
+bo5nap
+bon5ato
+4bonn
+bon5ne
+bons4
+bo5nus
+boo6
+boom1
+bo1p4
+bo1ra
+bo4ra.
+bo6re.
+bo7rel
+bo3ren
+bo3ret
+bo4rete
+bo6ri.
+bo3ro
+bor6t7ef
+bor6tei
+bor4tes
+bor6t7et
+bor4ti
+bort5s6
+b4o1s
+bose8te.
+3boska
+bo2sl
+bos5se
+bo4sto
+1bot
+bo4ta.
+bo4tak
+bo4tal
+bo6te.
+2bo7to
+4bot6r
+4bot4v
+bou3c
+4bo1v
+bow4e
+bo6y
+4bp
+b7pl
+br8
+1b4ra
+bra5ka
+brak5s
+bra5se
+bred5sp
+brei5e
+brei3s
+bret7te
+b6rev
+brevi9er.
+bre4vin
+bri5a
+b4rio
+b2ro
+bro9ar
+bro1s4
+3b4ru
+bru5ke
+bruk4s3
+bru4na
+bru7na.
+bru5nes
+bru5pl
+bru7ren
+bru5sa
+brus4l
+1bry
+bryn4s
+b4rø
+brø5de
+bråe6
+brå9ne
+brå5te.
+6b1s
+bs4e
+b5s6e6a5m4
+b4s5el
+b5s6i
+bsk4
+b4sli
+b2sm
+b2s1of
+bs2t6
+b6st7f
+b7s6v
+bså5
+6b5t
+b7t6s
+1b2u
+bu4ar
+4bub
+bu3da
+bud5d6h
+bu3de
+4bu3em
+bu4en.
+bu9ene
+bu4er.
+bue5s
+bu1i
+bu6is
+6buki
+buk3l
+bu5la
+bu4le.
+bul3le
+bun7de
+bund4s3
+bun8ge.
+bunk3r
+bunnla8ga
+bunn3s
+2bu3o
+bu1p
+bu6ra.
+bu4re.
+4bu3ro
+bu3ru
+bus6e
+bu4se.
+bus4h5e
+busk7ø
+bus6sek
+bus4sel
+bus6sent
+bus6set
+busse6te.
+bus6sj
+bus4sn
+bus4sp
+bus4st
+buss3v
+bu1st
+4bustr
+4busy
+bu1ta
+bu4tal
+bu7tem
+b5utg
+4butst
+bu2tu
+bu1tø
+4buv
+6buø
+2b1v
+4b5w
+1by
+bya2
+by5al
+by9are
+by7dep
+by4en.
+by7ene
+by5ens
+by2er
+by3ers
+by4ge.
+byg3l
+3byi
+by1lo
+4bylø
+by5n
+by1re
+by6re.
+by1s
+5bys.
+4byse
+6bysi
+6bysp
+byst4
+by4ste
+4bysv
+by5tar
+by4te.
+by1tr
+2byv
+bæ5rar
+bæ6rar.
+bæ4re.
+bæ5ren
+bæ5rer.
+bæ5rere
+bæ5res.
+bæ5ret.
+bæ3ri
+bæ4r5is
+bæ3ru
+1b4ø
+bø4e
+bø7ens
+bøf3
+bø4kes
+bø6la.
+bø6le.
+bø2n
+bøne5
+bøn6nes
+bøn7o
+bø6re.
+bør4s5k
+bør4sp
+børs3t
+børs8ta.
+børs3v
+bø5ta
+bø1v
+bøy7ar
+bøye5
+bøy4ene
+bøy4es
+bøy4et
+1b4å
+bå4de
+bå9des
+bå6e
+bå7ene
+bå4la
+bå1re
+bå6reg
+bå4rep
+bå4s3te
+bå6s7ti
+bå6t5j
+bå6to
+båt5r
+1c4a
+cab4
+ca4e
+ca5le
+ca5me
+ca5mo
+ca4pe.
+cap1r
+ca6pris
+ca3ra
+car5n
+ca5ro
+car4te.
+ca2sa3
+ca6set
+cash5
+ca5s4til
+cas5to
+ca1t
+cath5
+ca4to.
+6cb
+4cc
+c1ci
+c2d
+cde6
+cebo9
+ce3d
+ce1i
+1cel
+ce5le
+cel4les
+cel4lev
+3cen.
+ce4ned
+ce4nee
+ce4nem
+ce4ne5s4
+ce5nes.
+ce4net
+ce4nev
+5cens
+cen4ti9m
+cen6to
+ce5o4
+1cer
+cerba6ne.
+ce3re
+ce1ro5
+cer3t
+6ceru
+cest3o
+2ch.
+cha5le
+3cham4
+cha7ne
+cha5t
+2chb
+4chei
+chel5s
+che7te
+chi4li
+4ch3h
+2chm
+4chn
+ch5ne
+chom4
+cho5s6
+2chp
+8chs
+6cht
+ch1v
+ci1c
+3cid
+ci2e
+cie8n
+cie2s5
+cil5l
+ci3ne
+ci5ta
+2c6k
+ck5ar.
+ck5art
+ck1en
+ck3er.
+ck4ere
+ck5e4t3
+ck5et.
+cke8y5
+ck1i
+ck1k
+ck1o2
+ck7r
+ck5s2
+cku6
+ckup3
+ck9ut
+c2l
+clai4r5
+cly4
+c1m
+cmini4
+coa6
+coat5
+co6bid
+1co4c
+2cod
+6cof
+6cog
+co4la.
+co4lab
+co4lak
+co4la5r
+co2m
+co5ma
+com5t
+co6n5os
+con5s
+con7t
+co2o
+co7pa
+2cor
+co3r6a
+co1re
+co4so
+4cost
+co4ver
+c1pr
+cr8
+cras4h
+crack4
+cre2e
+creen7
+cros2
+5cru
+4c4s
+4c1t
+c6ta
+cty5
+1cu
+4cu.
+cu5la
+cu5le
+cu5lu
+cup1l
+cu6po
+cup1r
+cup7s
+cu4på
+2cur
+cures4
+cu6t
+cy2a
+cy6p7
+cys3
+c6z
+cæ5
+1da
+4daa
+4daber
+8dabo
+d5abs
+6d5adel
+d4adg
+dadø4
+dadør5
+4daef
+2daf
+5dagb
+da4gev
+4dagj
+dag7l
+da6go.
+da4g1r
+da6gun
+4dagå
+4dahe
+5dahl
+da1i
+2daka
+4dako
+4dakr
+dak4se.
+4daktig
+da5kv
+7d6al5j
+da1la
+da8la.
+da4las
+6dalau
+dalbu8er
+4d5ald
+da4les
+dal6so
+da1lu
+da4ma.
+da4man
+da3mas
+da4me.
+da3men
+6d5ameri
+dame3s
+dame5t6
+da3mo
+dam7pe
+5dan.
+6danal
+d8ane
+9dani
+2d1anl
+3dann
+dan5neb
+4danno
+7dano
+d4ans.
+dan3sa
+dan4sel
+dan9s8kan
+4dansv
+9dant.
+9danti
+8dany
+2da3o
+2dap
+da3pe
+d3app
+3dar.
+5dara
+2darb
+dard3s4
+4darea
+da4res
+d5arn
+da2ro
+dar5os.
+dar5s6
+dar4ta.
+dar6va.
+dar8ve.
+4dasei
+2dash
+6dasi
+4dasjef
+da4sk
+da9sko
+6dastr
+6dasu
+data5
+4da4tal
+data6le.
+datali8na
+da4tek
+7d6ato
+da3toa
+4da5tr
+dats6j
+d6aud
+daud7s8
+dau5go
+2daut
+2dav
+d5avb
+d1avl
+d3av5s
+4daø
+2d1b2
+dba8le.
+dba4ne.
+dbe8ta.
+dbe6te.
+dbling7
+dbo6en.
+d6byf
+4d1c
+6d1d
+d2dad
+ddag4
+d4dak
+d4d5arm
+dd3eie
+d2dek
+dde4lap
+dde4l5o
+ddel5sv
+d4demi
+dder5s
+d4desu
+ddie8
+d7dom
+d4d1re
+dd5run
+ddsa4
+dd4sala
+dd4skap
+dds5tab
+dd3s4te
+dds5tr
+d2dyb
+ddø2
+ddør3
+d4d5øy
+dd1år
+1de
+2dea
+deak3
+de2al
+de7b
+6debar
+4debas
+3debat
+2debe
+4debl
+2debo
+5debon.
+2debr
+3debut
+2deby
+4debø
+de1c
+5ded.
+2deda
+6d7edd
+7dede.
+4dedek
+4dedel
+4dedia
+2ded4r
+2dedy
+2dee
+5dee.
+de7er
+2def
+d5eff
+d5eft
+2deg
+6d6e5ge
+5degg
+de3gl
+2deh
+5dehavs
+2dei
+dei4d
+dei4ene
+3deig.
+dei8ge.
+5deigen
+dei4g5r
+5deik
+d2e1in
+3deir
+de5is.
+de3ist
+7de7it
+2dej
+8deka
+2deke
+2deki
+2dekj
+5dekk
+dekk3a
+dek4kan
+dek4kel
+de6k6kv
+dek2l
+6dekly
+5dekni
+de5ko
+4dekod
+4dekon
+4dekos
+2de5k6r
+dek6st
+deks7ti
+deks6tr
+5dekt
+2deku
+4dekv
+4dekø
+4dekå
+d4el.
+6delad
+6delage
+de6lans
+4delau
+4deled
+de4lef
+4delei
+del5ei4d
+del5eie
+4de4lek
+de5lele
+4d5elem
+de4lest
+6d3e4lev
+4delid
+6delinj
+del5int
+4delis
+4deliv
+del4lap
+del6lei
+del4lek
+del6lerf
+del6lig
+d4els
+del4s5at
+del3se
+delses7
+del4si
+del4spo
+d4elt
+del6tala
+del3te
+del7tr
+6deluk
+del5ve
+4dely
+4delæ
+2delø
+delø6pa.
+6deløy
+2delå
+2de5ma
+d3emb
+2deme
+demie4
+4demj
+dem8na.
+de4mo.
+de4mog
+5demok
+4demol
+demo5no
+5demos
+dem5pe
+3demr
+5dems
+4demu
+2demø
+2demå
+d2en.
+4dena
+de7nak
+6d5en6den.
+de5neb
+4dened
+6denel
+4denem
+4denet
+4denev
+6d5engen.
+4deni
+4deno
+de4nom
+d2ens
+den4sin
+den4s3t8
+den6t5ant
+4dentif
+4dentit
+dent3o
+den4tr
+dent5s8
+den6t5u6
+den6tå
+4denu
+2denæ
+2denø
+de2ob
+de4og
+2deol
+4deopp
+4de3or
+de4ove
+4depak
+4depap
+2depe
+4depi
+4depl
+6depu
+d2er
+der8am
+de6rant
+de4rare
+de4rark
+5de7rast
+dera5te
+der3av
+der5d
+4derea
+4dered
+de4r5edd
+de4ref
+4dereg
+4derep
+6deresi
+der5est
+8derest.
+6dereste
+4derett
+de4rif
+de4ril
+5derin
+de4rinæ
+der5k
+der5ne
+de5rob
+4derog
+4deros
+de5rose
+dero8se.
+6de7rot
+dero4v
+der5s6n
+der4sp
+der3t
+der5un
+de5rup
+6derus
+der3v
+4derør
+2derå
+de1s
+3d6es.
+2desa
+4desc
+2dese
+de5seg
+des5ers
+4desho
+de8s9hop
+desi4s5t
+2desj
+2desk
+9desk.
+5deske
+4des4le
+2deso
+2desp
+7despl
+6de5s6pr
+d4es2t
+5dest.
+5deste.
+des6tem
+de5sti
+4destj
+4desto
+4destrå
+4destu
+6desty
+de4s3tå
+6desup
+des6v
+2desy
+deså7
+d2et.
+2deta
+deta8ka.
+de3te
+4detea
+6deteg
+6detekk
+4detel
+4deten
+4detep
+detes7
+2deti
+2detj
+4deto
+4det6r
+2detu
+4dety
+4detø
+6detå
+2deu
+d1eur
+5deus
+2dev
+deva8ne.
+devi9er.
+3devik
+d7ev8n
+de5vu
+2dey
+4deø
+2deå
+2d1f
+dfø6rarar
+2d1g4
+d4gel
+d5gi
+dgi6n
+dgjø6re7n6h
+d3go
+2d1h
+dhav4s
+dheim2s5
+dhu9ga
+dhø4r
+1di
+di6ak
+di5alg
+dia5li
+di1ar
+dia3re
+dia1s
+dia7sp
+dias6t
+diats4
+2diav
+2dib
+did5ri
+di7ell
+di5en.
+4di5end
+di1er
+dies4
+3diff
+diffe5
+3diful
+4difø
+di8g9and
+di4gat
+di3ge4s5
+dig7g
+2digj
+dig8la.
+dig6le.
+4digren
+dig5ret
+4digru
+di2gu
+4dih
+4dii
+2dij
+di5ka
+di8ka.
+di5kem
+2dikj
+6dikn
+2diko
+2di1kr
+dik7v
+2dili
+dil4les
+di5ma
+6dimed
+6d5i6mel
+4dimes
+4dimet
+2dimo
+4d5imp
+4dimå
+di5na
+2d1ind
+di7nen
+4d5ingk
+din3gr
+ding8s5en
+ding6s5er
+din8g9å
+dini4
+di4ni.
+4d1inn
+2dino
+2dinv
+4dinø
+3diog
+7diol
+dio3na
+dio4no
+di3ori
+dio5tr
+2dip
+3dipl
+4dired
+4direg
+4d5irs
+5dis.
+di6sc
+di6sed
+dis4i
+disie5ne
+d6isk
+dis6kam
+di4skj
+dis6k7l
+di4sk6o
+dis5ko.
+dis7koe
+dis7ku
+dis5s
+dis1t
+dis7tik
+di5sv
+dis4vi
+2disy
+di4tal
+di7te
+4ditek
+dit4tet
+ditt3r
+di9us.
+di4va.
+4dival
+di7van
+4divek
+div6i
+2divu
+2diøk
+d1ja
+d1je.
+d1jen
+djer5ve
+d7jes.
+dje9ve
+d6jingan
+d6jingar
+d1jo
+dju8la.
+5djup
+6djupar
+d4jø.
+2d5k2
+dka8ra.
+dki6
+d5kj
+dko2r
+dku4le.
+4d1l4
+d3la
+dla4ga
+dland7as
+dla6te.
+dla4v
+d4ledi
+d2lef
+d4lega
+d7legar
+dle3ge
+dlei7er.
+d5leka
+d2lel
+dlem4st
+d4lenet
+d4leru
+dleva8ne.
+d5li
+dli4f
+dli5ke
+d5lo
+dly8se.
+dlø8pa.
+d5lå
+dlå9re
+2d1m
+dme6la.
+dmo4e
+dmors6
+dmo8s
+dmø4re.
+dmå6la.
+8d1n
+dn6a
+dno8de.
+1do
+2doav
+do2b3
+4doba
+do3be
+8do9b8lan
+2dobå
+do4da
+dodø4
+dodør5
+4doeu
+2dof
+d3off
+d5ofr
+dog6med
+dog4me5s
+2dogr
+6do5i
+do3ki
+4dokine
+dok6kan
+4dokn
+do5le
+4doled
+doli8ne.
+4dolinj
+6dolis
+4dolj
+dol5l4
+4domes
+do5mis
+4doml
+do4mo
+dom7p
+2domr
+dom8sa
+dom8s5e6
+dom6s5i
+dom4s3k
+doms3l
+domsla6ga
+dom4so
+do4mu
+do4na.
+don5g
+4donke
+6d7on6kl
+don5st
+don5t4
+2dop
+do4pa.
+do4pe.
+3dopi
+d6o1ra
+do5ran
+2d1ord
+dor4da
+do1re
+dor6gest
+d5orie
+dorm8
+do3ro
+5dorp
+3dorr
+dors6
+dors7ke
+do1ru
+do7rye
+5dos.
+do4se.
+do4set
+do1sk
+6do7s6l
+2doso
+4dosp
+2dost
+do3str
+4dotr
+2dov
+do5va
+do5ven
+do4ver
+dov9n
+4doø
+2d7p8
+5dq
+dr4
+d1ra.
+d5raa
+d9rad.
+d5rade
+1d6rag
+dra5gen
+dra6kes
+3drakt
+1dram
+5d6rang
+3drap.
+5drapa
+3drape
+d3rapp
+d1rar
+d6rarar
+d3rarb
+dra6ret
+d5rarm
+d5rarr
+d9ra8sa
+9dratt
+drau7ma
+2dre.
+5dreass
+2dred
+d5rede.
+d5reder
+dre7d6r
+d5reds
+9dreg.
+9drege.
+d3regj
+3dreie
+drei5en
+drei5er.
+drei7ern
+d5rej
+d6reka
+d7rekk
+3drekt
+4drel
+d7relig
+4drem
+d1ren
+4drer
+d3ret.
+d3retn
+d6retr
+d3rets
+drett4
+dretts5
+5drevet
+3drevn
+4dria
+3d2rif
+2d1rig
+d2rik
+d3rik.
+dri8ka.
+d3rike
+3drikk
+drik7s6
+d9rikt
+5d4ril
+2d1rin
+dring6
+drit7tr
+drit5u
+dritun8ge.
+1d2riv
+3dronn
+dro6pa.
+drop5s
+2d1ror
+3d4ros
+dro8ta.
+2d1rov
+dro5va
+dro3ve
+2dru
+3druk
+d1rul
+d1rum
+d3rup
+6d5rut
+2dryk
+drykk4
+d2rys
+d4røm
+drø6re.
+d7røt
+drø3ve
+d1råd
+drå4de.
+3dråp
+8ds
+d5sa.
+d3sabl
+ds1ad
+ds3a6del
+d1sag
+dsa9ga
+dsak6se.
+d1sal
+dsa8la.
+d4s3alf
+d6sall
+d9same
+ds1a6n
+ds5ane
+ds1a2r
+d2sas
+d4satf
+dsbø6n
+d5se.
+dse4d
+ds1ef
+d2s1ei
+ds7eks
+ds3ela
+dsel4s5a
+dse2m
+ds3emi
+d6s7enda
+dsen8de.
+d4s3eng
+d5sens
+ds3e2p
+d7ser.
+d6serf
+ds5erk
+d4s5e4sk
+ds5e4st
+ds3eta
+dse4te.
+d5setj
+ds1ev
+d2s1i
+d3s2id
+d7sida
+ds5ident
+ds3idr
+d7sil
+ds5ind
+d3sir
+ds3i4s
+dsi4ve
+d4s3jen
+d2sjo
+ds7jor
+ds6ju
+ds5kab
+d4s3kan
+ds3kar
+d4skat
+d1skj
+ds5kjen
+d6s5kjøt
+ds1ko
+d5skot
+ds3kro
+ds1kv
+ds1l
+ds5la.
+ds5lan
+ds6lem
+dsli6k
+ds6lo.
+d9slott.
+ds4luk
+ds3ma
+d6smo
+dsmå6la
+ds3ne
+ds5no
+ds1o2
+d7somst
+d4s5os
+d7sot
+ds1p
+d3spek
+d3spel
+ds2pi
+d9s8py
+ds5s4
+dst4
+ds3tak
+d4s3tal
+d3s8tar
+d5s4tat
+ds6tau
+dss8t
+d8s9te.
+ds9teik
+dste6ma.
+d6s5temp
+ds5teo
+d3s4tig
+d3s4tik
+d5stilli
+ds1tj
+d3stor
+d3stri
+dstu8na
+d5stund
+ds3tv
+dsty8e
+ds3tyv
+ds1u2
+dsure6
+d5s6us
+d6s7usk
+ds1v
+dsva8ne.
+d3s4vet
+dsvi6ka.
+d5syk
+d3syn
+dsy6na
+ds1yt
+d2s1ø
+d6sør
+ds1å6
+4d1t
+d3t4a
+dta6la.
+dta4le.
+dta4s
+d3tem
+dte4ma.
+dt4eng
+dterle7
+dte4se.
+d5t4et
+d3ti
+dt6j
+d7to
+d5t4rag
+d6troc
+d5t4rø
+d6t1s2
+d3t2va
+dtø8
+dt6øk
+dtørs3
+dtå4
+1du
+dub5b
+dub5l
+du1c
+du9ene
+du9ens
+due5s
+4dufo
+3dug
+4dugu
+duit6
+du6ka.
+dul5l
+4duly
+dums2
+du4na.
+dun7de
+4d5uni
+dun5s6
+dun7sta
+7duo
+d3upk
+3dur
+du6ra.
+du6re.
+du6rei
+dur8ta
+du1s
+du5s4a
+du9sem
+du5s2i
+du2sk
+du2sl
+du2sp
+duss4
+dust4
+du2sv
+2d1ut
+du6va.
+du4ve.
+2d1v
+dva6la.
+dva6lel
+dva4ne.
+dve6s
+dve6va
+dve8ve.
+d7vo
+dvo8r
+2d1w
+1dy
+dy9a
+2dyba
+2dyf
+dy5ke.
+4dykl
+4dykø
+2dyl
+dy4na.
+dy4ne.
+4dynk
+dynk6s5
+dy3pes
+dy2p3r
+dy4ra.
+dy5reba
+dyrle8ge.
+dyr5s4
+dy2r5u
+dyr5ø
+7dys.
+dy8sa
+4dyse
+dy6se.
+dys7s
+dyst7r
+dy2t
+d5z
+8dz.
+1dæ
+dærs4
+1dø
+4dø.
+død2s1
+dø3gr
+2døk
+d5økn
+dø4ma
+dø4pe.
+dø4pen
+d2ør
+dør3i
+2døs
+d6øs.
+dø2st3
+døt3
+dø9va
+dø3vel
+dø1vi
+6døvl
+døv8le.
+2døy.
+døya8
+døy8g
+4d9øys
+1dåd
+dåd6s5
+då8na.
+1dåp
+då8ra.
+då5ri
+d3ås.
+då8sa.
+då7sem
+d7åt.
+2ea
+e1a2b
+e1ad
+ea2d1i
+eadli5
+e1af
+ea2gu
+e1a2k
+e4akr
+6eakt
+eak6se.
+e1al.
+e5alle
+eal8le.
+ea4lov
+e3alte
+ea2lø
+ea4m1
+e3aman
+e5amn
+e1an
+e2an.
+ea4ne.
+e6a5net
+e4ani
+ean7n
+ea4nor
+e6ans.
+ean3sl
+e1ap
+ea4pe
+e1ar
+ea2re
+ea5rer
+ea5ret
+ea5r4i
+ear6ka.
+ear8ma.
+ear4ta.
+ea2s1i
+e3asp
+e1ass
+ea7ta
+e5a4tel
+eate6ren
+ea4t3et
+eat8h
+eat6le
+e8ato
+ea5tri
+e1att
+e1au
+eau6ga
+eau6ge.
+eau8ra.
+eau6re
+eau5s
+eau8sa
+eau8se.
+e1av
+eav8la
+eav8le.
+2e1b2
+eba3d
+eba4ne.
+eb3be
+eb4be.
+ebe4d3e6
+ebei7er.
+eben6s5k
+ebers6
+ebesku5
+ebet5s
+eb3h
+e5b6lo
+eblæ5
+ebob3
+ebo4da
+ebo5ers.
+ebo6kr
+ebo6la
+eb5s
+ebu4e5re
+ebu5ern
+ebu6et
+eby4ta
+ebø6n
+2ec
+e4ca
+ec4c
+e1ce
+e5cha
+e3com
+e2dad
+ed5ad.
+e5d4ag
+edag4s5
+e2dar
+ed3ark
+ed3arv
+ed7dela
+ed4dyr
+e3de.
+ed5e6ge
+ed5eg4n
+ed3eie
+e4deks
+ede8le.
+e4denf
+e8d5eng
+eden5t
+e6depr
+ede4ra
+e4derø
+e4desk
+ede4sl
+ede4sm
+e4desn
+ede4s5p
+ede4ta
+e6d5ett
+e8dé
+e5d6ia
+edi6a5ne
+edi4ene
+edi6gj
+ed4is
+edi3si
+edi4s5k
+e7div
+edle6ge.
+ed8ob
+edok8se.
+e4dol
+ed1op
+ed1ov
+e1dr
+ed2ra
+ed3reg
+e5drev.
+ed3rom
+e6d5ryg
+ed7ski
+ed3skr
+ed3s4la
+ed2sm
+ed5ta
+ed3te
+edt6r
+edu8a
+ed7va
+edvi6s
+e3dyk
+ed5ynk
+edyr6ke.
+edæ4
+e3d6ø1r
+e3e2
+eea7
+ee3b
+e2ed
+ee3di
+eeg4ga
+eeg6n
+ee5gå
+eei4d
+eei7ni
+eek1e
+eek4te
+ee3la
+e5e4li
+eem6na
+ee4n
+e5enb
+een3in
+een6k
+een5t
+e3epl
+ee8ra
+eer3en
+ee3ri
+e4er3l
+eer4me.
+e6e5sh
+ees8ka
+ees6ke.
+e3e6t
+eev4ne.
+e1f
+4efa
+efal6s7
+e4fana
+ef3ank
+e4fark
+efar6s5
+ef7ea
+ef5ef
+ef3fe
+3effek
+ef3fo
+4efi
+e4f3id
+e5fig
+e5f4ilm
+efi7ren
+efisken8
+4e3fj
+2efl
+efle6ge.
+eflå3
+e2fn
+efo8bi.
+efo4no
+8efr
+ef2sj
+ef2sk
+ef2sp
+ef6str
+e8ft
+ef2ta
+efta5r
+eft5ei
+ef5ter
+eftle8ge.
+eft1s4
+6efu
+efyrs5
+e3fæ
+4efø
+efø5le
+eføy9
+2ega
+e3gaf
+e6gala
+e7gam
+ega4ve.
+egde8l
+eg7des
+e5gedo
+egei9e
+ege4let
+e2gem
+e3geme
+egen5s
+3e4gensk
+e7geom
+e2ges2
+ege5sp
+eg9gen
+egg3l
+eg8g9ut
+egi3an
+egie2
+e4giko
+egis4p
+e3g6lad
+e3g4led
+eg7lesa
+e5g4lit
+eg7ly
+e5g6lø
+6egm
+e9g8nag
+eg4nem
+eg6no
+e7gnå
+4ego
+e4go.
+7egoi
+eg2r
+egrans5
+e7g8rø
+egs4am
+egs4ki
+egs4ta
+e1gø
+egøy6e5ne
+4egå
+egå4va
+egå4ve.
+e1h
+ehea4
+ehei9e
+eh5er.
+e4h5ere
+eh7ern
+eher4s
+ehog5
+ehov2
+ehy6re.
+ehø8va
+e6hå.
+2e8ia
+e9iakt
+ei9a4n
+ei7ar.
+ei4c
+e8id.
+ei3d8ar
+e3idea
+e3ideo
+ei9der
+ei5det
+5eidf
+5eidg
+e6i2do
+e1idr
+ei3d4u
+ei7e
+eie5d
+ei8eg
+eie2n
+ei9en.
+eier3a
+ei4ert
+ei6es
+ei1fl
+8eig.
+ei3ga
+eig6e
+ei6gev
+ei5gi
+ei6gra
+ei6gu
+4eii
+ei5kaa
+ei3ke.
+ei6kee
+ei6keh
+ei4kel
+ei6keri
+ei4ket
+ei1kr
+eiks3a
+eik6se
+eik4so
+4eil
+ei9led
+eil5egg
+e3illu
+ei3lo.
+ei9loa
+eil5op
+ei5los
+eil5s6
+4eim
+ei7ma.
+e5imag
+ei4m5a6l
+ei4med
+ei6mei
+ei7men
+ei4me5s
+ei4met
+eim9ett
+ei6mo
+8e1imp
+ei4n3al
+ei4nans
+ein5ant
+ei7nare
+ein1d
+4e3indu
+ei5ned
+ei7nel
+ein9f
+einga6
+ein3gr
+e4ini
+6ei6nit
+ein3k4
+e5inkar
+4e1inn
+ei4nom
+ei4nov
+einsi9d
+ein4s3l
+eins6o
+e4inspi
+ein7sto
+ei2n1u4
+ei3num
+6einv
+ei2n3ø
+ei5or
+e4ip
+ei9pa
+ei3pe
+eip5s
+2eir
+eir9ak
+ei7ren
+ei3ri
+eir5s
+2eis
+ei5sar
+e4ise
+ei3se.
+eise5i
+ei3sen
+eiseri9e8
+ei3s4ha
+ei4sil
+e3isk.
+e3iske
+ei6s3kj
+eis3ko
+ei3s4pe
+ei4spi
+ei4tek
+ei4tera
+ei4tere
+ei2to
+eit7ta
+ei6t7ut
+ei3tve
+ei6t7ø
+ei4vak
+eiva9r
+ei9ven
+ei3vi
+eiv5s4
+e1j
+ejo8en.
+eju6la
+4e1ka
+ekali7
+ekalie6
+ekam6s5
+eka6ra.
+e5kavr
+ek3eie
+e4kero
+e4kes
+ek5e4ta
+e6key
+e5k6hov
+e1ki
+e4ki.
+4e1kj
+2ekk
+ekke7le
+ekk9ist
+ek1kj
+ek4kjø
+ekk3l
+ek5kok
+ekko5v
+ek6ku
+ek4ky
+e1kl
+e8klane
+ek6leg
+e6klen
+ek5let
+e3klu
+e5klæ
+ek2lø
+4ekn
+ek9na.
+e3knek
+ekne7s
+ekni7p
+ek3no
+e3k4nok
+e1knu
+e5knø
+e1k2o
+e4ko.
+eko7le
+ekords8
+eko6te.
+e4kov
+2e1kr
+e3k2ra
+e3k4red
+e7kref
+e3kren
+e4k5ret.
+e5krets
+e5k4rev
+e3k2ri
+e3kro
+ek4ry
+e3k4rå
+ek5råd
+ek3s4ak
+ek4sal
+3eksam
+ek3sel
+3eksem
+ek4sig
+eks1k
+ek4ska
+1eksp
+eks5pe
+ek4sta
+ek7s6tel
+ek3sti
+ek4stil
+ekst5o
+ekst3å
+ek4sæ
+ek6t7arm
+ekt3av
+ek3tef
+5ek3tep
+ek5tes
+ek6test
+ek4tid
+ekti5m
+ek5tiv
+4ekto
+ektori6a
+ek4t3ra
+e1ku
+eku4le.
+e1k2v
+ek4val
+ek6var.
+6ekve
+e4k5ve4d
+e4k5vik
+ek4vin
+ek6vis
+3ekviv
+6e5kw
+e5ky
+eky6te.
+e3kæ
+e1kø
+e1kå
+ekå6pa
+2e1la
+ela4ga
+el3agg
+e2l1ak
+e5lake
+elak8se.
+el7akt
+el1al
+e8lame
+el3anl
+e6l5arg
+e4larr
+el7arti
+e5las.
+e5lase
+ela4te.
+el5ato
+el5avl
+el3avs
+elbo8da
+el4ch
+el5do
+eld4rer
+eld5sle
+4eled
+e4ledi
+e4ledr
+e3lee
+eleg5d
+ele7ger
+eleg8na
+e7leir
+e7leis
+e5leke
+e2lel
+e2lem
+e5lem.
+e5lemat
+5elemen
+e5lemet
+e3lemm
+e3lemp
+4elen
+ele9na
+e4l5enh
+elens3
+e4lentu
+e5lepa
+2e3ler
+ele8ra.
+e7leret
+e6l7erg
+ele3sk
+e6lesku
+e4leta
+e4lete
+5e8lev.
+ele4vak
+6e5levn
+el5fi
+el9ga.
+el5gele
+el5gi
+elg3s8
+2eli
+e9lie
+eli5e6rer
+e4lif
+e4li5g4r
+e4l3ind
+elin5es
+e4linsp
+eli6o5s
+eli8ta.
+eli4tet
+6e5litt
+eli6v7en
+el1j
+elk2
+el6k5al
+el4ke5s
+el4kete
+el3kn
+el5la.
+el5l6ar
+el4led
+el4leg
+ell5eie
+el5ler
+el3le4s
+el6lete
+elli7ga.
+el4lisj
+ell7sa
+ell5sk
+ell5s4l
+ell5sp
+ell5sv
+el5l4ur
+el4læ
+el5m4o
+el5mu
+el5n
+2e1lo
+elo6ka.
+e2lom
+e3lomm
+el3omn
+el3oms
+el1op
+e2l1or
+e3lort
+el3ost
+el4ot
+elo7vers.
+e4l5ovn
+el4pet
+el5ph
+elro4s
+el4sei
+els5eie
+el3sen
+el3se6s3
+el3si
+el4sje
+el4skal
+7elskand
+els5kare
+els1l
+el6sno
+el4spe
+el3spr
+els4ten
+el4sti
+el4stj
+el2sø
+els5øk
+el5s6åpe
+elta8le.
+el5te.
+el6teg
+el4tero
+el4t5ett
+el4t3op
+el4tro
+elt5rop
+el2tu
+e3lua
+e1lu2e
+e4lu4he
+e3luk
+e7lum
+el3ung
+elun6ge.
+e7lup
+elu8pe.
+e1lur
+e7lus
+el3utr
+elv3an
+el4ve3d
+el4vei
+el6vere
+elv1r
+5elvs.
+elvæ6re.
+4e1ly
+ely8et.
+el5ynd
+2elæ
+elæ5res
+el9ærv
+e6l5æt
+2elø
+e4l3ø4r
+el3øy.
+el5øya
+el5øyd
+e6l3øyn
+2e1lå
+el1år
+e5låt
+4em.
+e2mad
+emafo5
+ema4ge.
+e4magr
+e2mah
+ema4ke.
+e4mako
+em5akti
+e4maku
+ema6le.
+5e4malj
+e4mam
+e4mana
+ema4ni.
+e6manu
+e4mare
+em7ar8m
+e4masi
+e6masku
+e4mata
+ema3uk
+ema5ve
+5emball
+3embed
+embe6r5
+3embet
+6emd
+8eme
+emei9e
+eme4li
+e4mend
+eme5tri
+eme6trisk
+em5e4v
+e4mib
+emi5ert
+e4mig
+4emin
+emi5ni
+emini6st
+e4minor
+e6mir
+emi9sa
+em7je
+e5mju
+em5le
+emle6s
+em5me.
+em5men
+em8mi.
+8emnd
+em4ne.
+em4ned
+em4nem
+6emni
+emo5nol
+em1op
+e2m3o4v
+em4ped
+em6peri
+em2p3l
+emp9lane.
+em6pli
+empo3
+em4pol
+em4pos
+em4ses
+emse8te.
+em4s5ju
+em4s1l
+em2sn
+em4sor
+em1st8
+ems4te
+ems3u
+emta8la
+em4til
+e3mug
+e2muk
+e5my
+emy4k
+6emø
+emø8r
+e5møy
+emå4la
+emå9lan
+emål4s
+em1å8r
+2ena
+en1ak
+en3ald
+ena5li
+en3all
+en5and
+e5nane
+e6n7ang
+e4n3ant
+e5nar.
+en8are
+e4narr
+en3ass
+enat6s5p
+ena2v
+en3avi
+4enb
+enbe9na
+en4d5and
+en4dek
+en3del
+endelø7se
+en5demi
+en3der
+en4desl
+end5l
+1endr
+en4d3ro
+end3st
+en7dø
+endø4r
+endør5e
+en5egg
+eneg8ga
+en3eie
+en5eks
+e3nekt
+4enem
+2enen
+en5eng
+3energ
+e4nesk
+4enev
+ene7ven
+eng6a
+en7gar
+en4gem
+en4geri
+enge6r5u
+en4gle
+eng4les
+eng4r
+eng3s4e
+eng5so
+eng5sp
+engs4ti
+en4gut
+en4g5å
+4enhj
+e4ni.
+e4nierk
+e2nif
+e5nir
+en4kera
+en4keri
+2enna
+en9nal
+2enne
+en4nem
+ennes6t
+enne4s5v
+enn2i
+enn2o
+enn4sj
+enn5sta
+enn7ø
+2eno
+en3ok
+en3og
+en3om.
+en1op
+e6n5ord
+2enp
+en4pås
+en4rem
+en5sab
+ens5af
+en6s7a6ker
+en4sek
+en4seli
+5ensemb
+en4ses4
+ense3u
+en3si
+ensi8de.
+ensi5ert
+en4sim
+ensle7g
+ens6lev
+en7s6opt
+en1st
+en6s7tal
+ens4ter
+ens4ti
+ens7und
+ens4ve
+ensvi6
+en2sø
+ens3øk
+ens7å
+en5ta.
+en4tap
+en5te.
+en4tec
+en4teg
+en4tel
+en3ti
+en5tie
+en5tig
+en5tik
+en9tima
+en7timen
+en4to4r
+ent5ori
+ent5rab
+en4tre
+ent5ren
+en4t5rol
+entropi5
+en4t3rå
+en6tul
+entun6ge.
+3entus
+2enu
+e2n7ul
+e4n5ur
+2en3v
+4enw
+e4ny.
+e2nyb
+e6nyr
+e2nys
+e4nyta
+4e7næ
+enæ8m
+enø4k
+e2n3øv
+en5øyd
+4enå
+en1ås
+en6ås.
+e3o6
+eo3a
+e6obe
+eo2bl
+eo5d
+eod8de.
+e1og1
+eo7gr
+e2o1i
+e2ok
+e3oks
+e2ol
+e4o7lo
+eom1s4
+eon8de.
+eo5ne
+e7onk
+eon4kl
+e3ont
+eo2p
+eo3pa
+eo5pl
+eopo3
+eopp5r
+eo3pr
+eor4da
+eo9re
+e2ori
+eo4rid
+eori5e6
+eo4rik
+eo4ris
+eo1ro
+eo1s
+eos6l
+e2o1u
+2e1p
+epa3t
+e6peno
+epe6p
+eper5r
+e3pes
+epe4st
+e4peta
+e6peu
+3epid
+epi6ka.
+epi7kr
+3episo
+ep2l
+e8plen
+ep5lene
+ep5ler
+eple9s6
+3eplet
+epo6et
+3epoke
+epp2s
+ep6sem
+ep4ses4
+ep6s5lu
+eps1t
+ep2su
+e3p2sy
+ep6tin
+ept6r
+2e1ra
+e4r3abb
+era8da.
+e4rael
+e2raf
+er3aft
+e4ra4g
+e2r1ak
+e3rake
+era5kl
+eral3u
+e4rama
+era6na.
+e5rande.
+e5ra7ne
+er7anli
+era4no
+er5ape.
+er5aper
+er5a4pin
+er3apo
+er5appe
+e5rar.
+e4rarg
+e5rasane
+e5rasar
+e4rasje
+e4rask
+e6raso
+e4r3ass
+er6ast
+e4ratek
+era7tor
+e4ratr
+er5att
+e2rau
+er5auk
+erau9ken
+erau8s
+er3av.
+er3avh
+er5avl
+e3ravn
+er3avr
+er3avs
+4erb
+erbi9ti
+erbo8da
+erbo8de.
+er8byl
+erd2e
+er4ded
+erden8s
+er4dis
+er1dr
+erd4ra
+erd8re
+erd4skj
+erds3t
+erd4sto
+erdsto8ga
+er3d4v
+e1re
+er3eff
+er3eft
+er5e4gen
+er3eid
+er3eie
+ere6ka
+ere6ke.
+e4r3eks
+e6r5ekte
+e4r3e4le
+ere4lit
+e6relli
+e4r3els
+e9rem.
+e5remm
+er3emn
+er5enden
+e4r3eng
+e4r5enh
+e3re4o7
+er8er.
+e4r3erf
+e5reri
+er3ess
+ere4t
+e5ret.
+e4r3eta
+eret6h
+ere5to
+e7rets
+6erett
+eretts5
+e4r3e4va
+e4r5e4ve
+e4r3evn
+erev6ne.
+e8ré
+5erfari
+6erfi
+4erfr
+2erg
+erg5elv
+ergi3f
+er6gli
+er4go.
+erg5ret
+erg5sko
+erg5sp
+2erh
+erhø6re.
+e1ri
+e4riad
+e4riak
+erib3b
+eri3bl
+e4rice
+e2rid
+e5rid.
+e5ridn
+eri4kat
+e6rikn
+4eril
+e7ri6ma.
+er3ind
+e3ring
+6eringar
+ering6si
+er3inn
+er3ins
+er3int
+e5riori
+e5ris.
+e4risa
+eri3se
+e4riso
+e6risp
+e5rist.
+e7rista
+e5riste
+eri5stil
+e4ri5s6to
+eri5sø
+e4rite
+e4rito
+er7ivo
+er7jes.
+4erka
+8erke
+erkeri6e
+er4kesa
+er4kese
+er4kete
+er6k5ett
+3erklæ
+6erkn
+4er5k4o
+4erkr
+erland7as
+erle6ge.
+erle7s8t
+er3me
+ermo8de.
+erm1s
+ermå6la.
+2ern
+er4nad
+er4ned
+er5nede
+er6nee
+er4nero
+er4nest
+er2no
+er3nob
+2ero
+e3roa
+er3obl
+5ero4b7r
+e1roe
+er3off
+e1rog
+er5oks
+e1rol
+er3oly
+e1rom
+er5omk
+ero5mo
+e1ron
+er5ond
+erono5
+er1op
+e5rop.
+e7ro6pa
+e5ropen
+er1o2r
+e5ror.
+e3rore
+e7ro4sa
+3erosj
+er3osl
+ero4ta
+er1ov
+2erp
+2err
+er3ra
+er4rae
+er4rel
+errie9n
+6ersa
+ersa8ka
+ers6al
+er3sep
+6ersj
+er1sk
+er3ska
+ers4ka.
+er8skaran
+er9s6karar
+ers5kor
+er1sl
+ers4la
+ers6led
+ers4mi
+er5sne
+6ersp
+ers5tens
+ers5ter
+er7stev
+er1su
+4ersv
+er4sva
+ers4ve
+er1så
+er4s5år
+2erta
+er4tare
+er4te3s4
+er5tia
+er3tib
+erti4e
+er5til
+erti4mo
+er4top
+ert5rol
+4erts
+ert3sa
+erty6e
+ertå7ren
+2eru
+e1rua
+e5rud3
+e1rui
+er1u2k
+e3rum
+e4r3ung
+er3uni
+e3rup.
+er1u8r
+erure8
+e1rus
+er5ut.
+e5ruta
+e3rute
+er5utn
+er9uto
+e4ruts
+er7u6v
+ervele8
+6ervi
+ervs3
+ervæ6re.
+e1ry4
+e2r3ya
+erye7ne
+er1yr
+erys3
+e1ræ
+e9r4ære
+2e1rø
+er5økn
+e4røko
+er1ø4l
+e4r5øn
+e5r6ønn
+erø8ra
+e6r5ør6s
+er3øya
+e4r5øy7e
+erøy4n
+e4r5øys.
+er7øysk
+2e1rå
+e9rå.
+erå4da
+erå8de.
+erå6e
+erå4k
+er5åke
+er3å4l
+e2r1ån
+er3å4p
+er3å4se
+erå6t
+er7åta9
+e6råv
+2es.
+e1sa
+es5aa
+e2sad
+esag6
+es4al
+esa6la.
+esa9met
+e4s3ant
+es5arab
+es5arv
+esbi9e
+2ese
+es5ege
+es3ei4d
+es5eie.
+es3eig
+esei8ge.
+e3sek
+e4seku
+esel5s4
+e3s2en
+e5ser.
+e5sere
+e5seri
+e4s3erk
+ese5s2
+e3sest
+e4sesv
+ese5tas
+ese4te.
+e5setj
+e9sets
+e4seu
+e4sha
+es6har
+esh9ar.
+es4h5er
+e4shi
+e1sho
+e7s8hop
+esi6ar
+esi5ert
+e4sil
+e5sili
+es3ill
+e4s3ins
+esi6v
+esi3st
+es3jor
+e5skab
+es6ked
+es4kee
+es4ker
+8eskil
+e4sking
+eskinns5
+e1skj
+e8s9kjer.
+es4kjæ
+e6skjøn
+es5k4n
+e5sko.
+es7koa
+e3skot
+e1skr
+e1sku
+esku5et
+es3kvi
+e5sky
+e6skyr
+e1skø
+e7skå
+eskå7r
+e1sla
+es4lek
+es4let
+es7let.
+es7lets
+es4lit
+e4s5lok
+es4løk
+es4løv
+es4make
+e7s4mett
+es9na.
+es4ner
+es2no
+es4nu
+es2ny
+esnæ5re
+4e1so
+eso4b
+e2s3od
+e2s1of
+es3oks
+e2som
+e3somm
+e4s3ori
+e1s2p
+espa9ra
+es3pas
+es5pe.
+e4s4ped
+es5perm
+es3pl
+es4p5le
+es3pol
+e3spor
+es3pun
+es4sed
+es4see
+es4seg
+esse7i
+es6sendi
+es4s5enk
+es4ses
+es4sete
+ess5e4va
+es4s3ja
+es4sje
+es4skr
+ess4let
+ess3om
+es4sos
+es4spa
+ess5tilt
+es4stol
+ess5tor
+ess9tua
+ess5tue
+esstu8en.
+4essu
+es2s1v
+es7så
+e7stad
+es5tae
+es7takt
+es9tala
+e8stane
+e5stans
+es5tant
+es3tap
+e5start
+e3stat
+es5tato
+e4s3tau
+e7stav.
+est5avs
+e6s5te.
+es4teg
+est5eie
+est5eig
+es4tek
+es4tel
+e5stell
+es5tels
+e4stema
+e6steme
+e4stemo
+es5temp
+6esten
+e7steng
+es5tenk
+e8s7ter.
+e5s6terk
+esterne8
+este3s4
+es4test
+es4tien
+e3stif
+es4tig
+e3stik
+es4tikk
+5e6s5tima
+es4tis
+e4stiv
+e1stj
+es3t6on
+e4stog
+e3stok
+e3s4tol
+es6tone
+est5ord
+est5ori
+es5trak
+est5rene
+est5rer
+est9ré
+es5trib
+e5stryk
+e3strå
+e1stu
+e5stud
+es5tus
+8estå
+estå5ren
+estå6s
+est7åse
+e1su
+es5ut
+esva5re
+e5s4vek
+es5vig
+e5svikt
+es3vis
+2e3sy
+esy4na
+e4s5yt
+es5øvi
+es7øye
+e1ta
+4eta.
+e4tae
+e2taf
+etafo7
+e3tak
+e6tako
+e3tal
+eta3la
+eta4la.
+et5ald
+eta5le
+4e5tall
+etal6list
+etall5s6
+etal4s7
+et3amb
+e6tand
+eta4nen
+et4ap
+e9tapa
+e5tape
+3etappe
+et8ar.
+et8are
+et5art
+5e6tasjes
+1e2tat
+4e5tati
+e5tato
+e3tatt
+et5aun
+e8tax
+et1c
+2ete
+e4teie
+e4teka
+ete4ma.
+e5teran
+ete5ru
+etes5i
+e4tesl
+et8et
+e5tet.
+e7tets
+4eté
+4eth
+2eti
+e3tit
+2e1tj
+e7tjer
+et3jø
+6etl
+et5m
+2etn
+et6nev
+etning4
+etnings7
+2e1to
+eto4er
+et5oppd
+et3ord
+e4tot
+2e1tr
+e5t4rad
+e7t6rak
+8etre
+e5tree
+e5tref
+e4t3ris
+e9tru.
+et5rum
+ets1
+et9sar.
+et4sku
+etsku8le.
+ets7l
+etsla8ga
+etsnæ4
+et2sø
+et4tak
+et4tal
+etta6le.
+ett5alt
+et4tank
+et8tap
+et5te.
+et6tei
+et6telt
+et4tenk
+et4tenn
+ettera4
+etter5at
+et5t6erf
+5etterk
+5etterr
+ett5esk
+2etti
+et6tia
+ettian8
+et4til
+et2tj
+etto5a
+et4tr
+ett3re
+ett4ski
+ett4sti
+et3tug
+et4tur
+ettvi5se
+et2ty
+2e1tu
+5e6tui
+etu6na
+et3uni
+2e3t2v
+e4t3va
+e5t6vang
+2e1ty
+4etz
+4etæ
+etæ3ra
+e1tø
+e1tå
+etå5re
+e1u
+eu4a
+e8uf
+eug8la
+eu4h
+eu4ka.
+eu2ke
+eu5kem
+eu7kr
+eu2l
+eum2
+e3u2n
+eun4ge.
+eu5nu
+e4up5a
+e6upk
+e2ur
+eu6rat
+eure4
+2euri
+e3urn
+eur8na
+eur6ne.
+euro1
+3europ
+e3urt
+e2us
+eu4si
+eu1ta
+e3uts
+eut7t
+e4u3z
+e1v
+evad6r
+ev5akti
+eva4la
+evann4s
+e4v5anta
+e4varar
+e4varb
+e4v5ark
+e6vatf
+6eved
+eve5d6a
+eve5del
+6eveg
+e5vegg
+evei6s5
+6evenn
+even5s
+5eventy
+e4veny
+e9ver.
+e5ves.
+e5veta
+e5vev.
+evi4e
+evi5ere
+evi5ert
+evin4s
+evi4se.
+evis3t
+e2vj
+ev2na
+evn5a4k
+ev7nu
+ev7oms
+e4vre
+e7vri.
+ev9rå
+ev1s
+evs8v
+evta8la
+evti4
+e2v3un
+e5vyrk
+e2vø
+ew3a
+ey1
+eybal4
+e1y2d
+ey5k
+e1yng
+e1yr
+eyr6ka
+eyr4ke.
+e1y2t
+e7yti
+ey3tr
+e3zi
+e1zu
+e1æ2
+eær3
+e1ø4
+eør6na.
+eøy4
+eøy9an
+eøy7en
+e1å6
+eåk4
+eån8da
+eåt8t
+é1a
+é1b
+é1d
+édø4r5
+é5e8
+é1f
+é1g
+é1h
+é1i
+é1k
+é1l
+é1m
+é4n5e
+é5n6et
+é5o
+é1p
+é1r
+é2rj
+é1s
+ése2
+é1t
+é1v
+éva8la
+évo8re.
+é5å
+è1r
+è2red
+è2ref
+è2rek4
+è4rener
+è2rep
+ère3s2
+è4rest
+è2rev
+è6ves
+ê8lan
+ê6ra
+ê1re
+êr7o
+êr9sl
+1fa
+4fabo
+fac8
+fa1ci
+fa3de
+fa6de.
+6fadm
+fa4f
+fa2g1a
+fa5ger
+fage4t
+fag5eti
+fa2gi
+fa2go
+fa2gr
+6f5agro
+fag3sk
+fa2g1u
+fai5
+2fakr
+fakse9t
+fakta3
+fa1ku
+5fal
+fa1la
+fal6kes
+fal4k3l
+fal6lers
+fal5m
+fa4lo
+fal4sk
+4fa5mo
+fa4na.
+7fan5d
+5fane
+fanfa5
+fang4s
+fangst7ev
+4fank
+2f3anl
+fan5s6
+fan7tesk
+fan5ti
+fan3to
+fan4try
+6fanu
+2fap
+3far
+9f8ar.
+fa3ra
+fa4ra.
+fa4re.
+fa4res
+far4gel
+far4ges
+fa4rit
+far5n
+far6skj
+fart2
+far4vel
+4fary
+fa7sa
+fa4sel
+fa4seru
+2fasl
+fast3r
+fa3tal
+fa4te.
+fa6t7ers
+fa1to
+fat2r
+fa3t6re
+fav5ne
+fa1vø
+2f1b
+fba4ne.
+2f1d
+1fe
+3fe.
+2fe1a4
+5fea.
+fe5a6l
+2fec
+fe4da
+3fede
+fe2dr
+fe3dra
+fe3d4ri
+fe7ene
+2fef
+2fe3g
+2fehj
+fei5en
+fei5er.
+feig4de
+fei5ge
+feil5es
+fei4li
+9fein.
+7feine
+fei7ter
+8fej
+2fek4a
+4fekl
+2feko
+4fekr
+fek6tes
+fekt5ev
+fe5lag
+fe5len
+fe5li
+feli7e6
+6felik
+felles5
+fel7læ
+2felo
+fel5ok
+fel9ta.
+fel4tek
+fel4ti
+fel4tra
+fem5ak
+fem9b
+fem9ne
+fe4mo
+fem5s
+fem4tid
+fe2m1ø
+5fen.
+4fena
+fend9r
+4feni
+5fens
+fentleg5
+2feo
+2fe3p2
+5fer.
+fe6ral
+4feram
+fe5ras
+fer6at
+fer4dam
+fer5de
+4ferea
+4fereg
+fe4rek
+fer6en
+fe7rer.
+fer5ers
+feri6e
+feri8e5ne
+7fern
+fer2r
+fers9kar
+fers7ke
+2fe1ru
+3fes.
+2fesi
+2fe1sk
+fe2st
+fes9t6i
+fes8t3r
+fes9tum
+fe6st9ø
+4fesy
+fe6ta.
+4fetap
+fe4te.
+4fetea
+fe5ti
+4fetil
+2fet6r
+fett5j
+fett7s6
+4fe4ty
+2feu
+2fev
+fe4ven
+2feø
+fe6øy.
+2feå
+1fér
+2ff
+f7fa.
+f4fab
+f2f3a2g
+f4f3ak
+ffa7l
+f6fann
+f4farb
+ffar6d
+ffa7re
+f9fas
+f6fat
+f8f9au
+f2f3av
+f2feb
+f2fe3d
+f2fee
+f6feh
+f2fem
+f6ferdi
+ffe4rer
+f2fes
+f4feti
+f4feto
+ff5eve
+f2fib
+f4fice
+f2fid
+f9fien
+f4finn
+ff5int
+f2fip
+ffi5s4
+f2fj
+ff3la
+ffla8ga
+ff9leg
+ff3li
+f2fo
+ff4ol
+f2f3re
+ff1ro
+ff5sl
+ff5t4
+ffu6r
+ff5ut
+f3fæ
+f4fø
+2f3g2
+2f1h
+1fi
+fia7l
+fia4n
+4fiap
+fi4as1
+fibi6en
+fi9cen
+fici7
+fi7di
+fie2
+fi1er
+fi7e6re
+fi4f
+fi5fi
+fi5fo
+fi7fl
+f6ig
+figh9t
+fi7g6r
+4fih
+fi9ka
+fikali7
+fikalie6
+fi7ken
+fik6ka
+fik6k5n
+fi5ko
+fik7sa
+4fiku
+fi4la.
+fi3li
+fil6lel
+fil6leri
+fil4les
+fil7leti
+fil8m7at
+fi1lo
+filt6re
+fil7tres
+fil4tri
+4filæ
+fin5art
+fin5d
+fi4ne.
+fi5ner
+fing3r
+6finj
+finn5ei
+6finnsa
+fi4n3o
+fi9nor
+2fins
+fin6sleg
+fin6te5s
+fi2nu
+7fio5
+fi2r
+fi3ra
+fi6ra.
+fi9rene
+fi5res.
+fi3ri
+fi5s4a
+4fisc
+fi6se.
+fiser6s
+fi8si.
+fi2sk
+fi6ska
+fisk5a6d
+fis7kal
+fisk5and
+fis6kart
+fis6k5end
+fis4k3l
+6fiskol
+6fisku
+fis5ti
+6fistu
+fiti6me.
+4fitr
+fitt5s
+fi7ty
+fi4ve.
+1fj
+f1jeg
+fjel6lend
+f5jen
+fjer5ne
+fje4sk
+fje2t3
+f5ju
+fjære5
+fjæ4res8
+2f5k6
+f2l2
+f5lag.
+f6lagg
+fla7ke
+f4las
+2fleg
+fle6i
+f4lek
+f6lel
+fle4sl
+f4lett
+f3lev
+fli7ne
+flis7t
+flit9t8
+1flo
+flo9ga
+flok9s
+flo2m3
+flo6r5o
+flos6kl
+f6lu
+flue3s
+flus8
+fl5ut
+3fly
+fly3s4
+f3løn
+flø5s
+1flå
+flå9sa
+flå7se
+2f1m
+fn6
+1fo
+2fo.
+fo9ar
+6fobs
+2foe
+4fof
+foi7la
+fo8ke.
+fo6la.
+fol4dr
+fo4le.
+fo5led
+fol6k5v
+fol9ler
+fol5lese
+folke5s6
+fol5li
+fo4lu
+3fon
+fo4na
+fond2
+fo5ne
+fo3n4id
+fo4nin
+fon1s2
+f1op
+for1a
+for9drev
+for7dro
+for5d6u
+fo6re.
+for9ei
+for7e6n
+for5ent
+for5ess
+for4et
+for9e8te.
+for9e8ten
+for9g6
+forh6
+fo4r9in
+fork8
+forlo7v
+forlø9pa
+forlø9se
+formo9r
+for3n
+foro6
+for5p
+for3se
+forsi9da
+forsi7de.
+for3s4m
+fors8t
+for9ste
+fors4v
+forta8le.
+for5t6e
+fortei9e
+for7t6i
+forti5da
+for3t4v
+for3u4l
+for7v6
+forva9re
+for5æ4
+for5ø4
+for9å
+fo9se
+fosfo5re
+4fosj
+fo4ta
+fo6te.
+foto5
+fo4tok
+fo4tom
+fo6top
+fo4tor
+fot3s
+fots6v
+fot3t
+4f1ov
+3fô
+2f3p2
+fpo6e
+fr2
+1fra
+fra5l
+fra4m5e
+fra6mi
+framma8ne.
+franko5
+fran7se
+fra7r8
+fra1s
+fra5se.
+fra7sep
+frasi8e
+fra7sk
+fras6p
+fra7v
+fra7v6r
+f2re.
+fred8sel
+freds5t
+fre4e3
+8freg
+f4rek
+fre4m5
+fremma8ne.
+frems4
+fre7ne
+fre6sk
+fres7ko.
+fres5koe
+fre8s9v
+fri5a6re
+6f5ridi
+fri4erf
+f1rin
+fris6ka
+fri5s4p
+fri5s6til
+frite8re.
+friti8me.
+6froc
+fro7f
+fronta9le
+fro8st
+frus1
+fruta6le.
+f1ryt
+frø5b
+frø7ko
+frå9r
+fråve4
+2f1s
+fs2h
+fsho6
+fsi2
+f5sjuk
+f2sl
+fsle6ge.
+f4sm
+f2sn
+fs7ne8
+fs5ov
+fs2t
+f2s3tab
+f6s5tan
+f4s9v
+2ft
+f1ta
+f3ta.
+fta7f
+ft1ak
+fta8la.
+ft3alg
+f2t1am
+f4tana
+f7tane
+ft3anl
+f5tar.
+ft8as4
+f6t1av
+f2tea
+f3ted
+f4tee
+f2teg
+f2tei
+f2tek
+f6tem
+fte4na
+ften3d
+f4t3enh
+ften5s6v
+f2teo
+fte4r5a4
+f4terin
+fter5s
+f4test
+f4teta
+f4t5ett
+ft3ind
+f2t5i4s
+ft5l
+ft7n
+f2t1o2
+f5tog
+3fton
+ft3r
+fts5alt
+fts3ei
+fts5ers
+fts5erv
+ft2s1i
+fts1k
+ft2skaf
+ftsla6ga
+ft5s4lan
+ftsle6ge.
+ft3sto
+ft6s5top
+ft5s6tri
+ft5stø
+fts1u
+ft2s1ø4
+ft5t4
+ftta8ka
+ft1u
+1fu
+fu8ga.
+fug9le.
+fug6l7eg
+fu6le
+full3
+ful9lar
+fulle6
+ful9le.
+ful4len
+fullen8de.
+ful4ler
+ful7les
+fullfø7re
+funn2
+funns3
+funnsla8ga
+fu6ra.
+fu6re.
+fu9ret
+fu7ro
+furu1
+fu7sel
+fu6sk
+fus6o7
+fu4s5t
+fut4h
+futu1
+4f1v
+fva8la
+1fy
+fy5la
+fyr2
+fy8ra.
+fy4r5a4b
+fy1re
+fy4re.
+fyr7k
+fyr8ke.
+fyr5t
+fy3s
+fysa7
+fy8sa.
+2fæ1
+1fø
+fø4da.
+fø4dek
+fø5den
+fø4des
+fø5des.
+fø1f
+2føk
+fø4le.
+f8ør
+før6a
+fø5rar
+fø4re.
+fø4res
+fø7resv
+fø8rete
+før6tin
+4få
+få7ren
+få7ret
+få5ri
+får7u
+få7va
+1ga
+4gaba
+ga1bo
+6gabø
+ga3da
+ga4ded
+4gadg
+2gadm
+4g5adr
+ga4e5k
+6gaflo
+g3aft
+6gah
+6gak
+g1aks
+gak8ta.
+gak8te
+ga3kv
+ga1la
+ga4la.
+galei5
+ga7len
+gal4les
+4galli
+5ga7lo
+ga4ma.
+4gamb
+ga5mer
+gamme6l5
+6gand.
+6ganden
+9gane
+gan5g6en
+gan4g5j
+4gan5k
+2g1anl
+4gann
+4gansa
+4gansv
+4g5antre
+ga6pa.
+ga4pe.
+ga4p5l
+gap3s2
+ga6p7u
+9gar.
+ga6raf
+ga6r5ak
+2garb
+5garbr
+5garby
+gar4dek
+7gare.
+4garea
+gar5es
+gares6ke.
+gar2i
+4garki
+gar3ne
+gar6ta.
+g5arte
+gar8te.
+g3arti
+gart5s6la
+gar4un
+ga4ryl
+ga4sc
+ga5s2i
+gas8ka.
+gas8ke.
+ga6ski
+4gasp
+gas6sel
+gas5sen
+gas7ser
+gass5ett
+gass3l
+5gast
+gas5te
+ga5sto
+gas7t6ra
+gas9tri
+g2at
+ga4te.
+ga5tens
+gate5s
+ga3ti
+ga1to
+ga3tr
+gat6tap
+gau5la.
+9gav.
+2gavd
+6ga4vei
+ga4veri
+4gavg
+g5avk
+2g1avs
+2gavt
+4gavv
+2gaw
+4gaø
+2g1b
+gba4ne.
+g6byk
+2g1c
+8g1d
+gd5alt
+g6d5au
+gde3a
+g2deb
+g3deba
+g4dedi
+gde5lo
+g2dem
+g4dend
+g2de5o
+g4dera
+g4de5re
+g6dero
+g2des
+g2det
+g3det.
+gdevi8sa
+gd5op
+gd1or
+gdy4d
+g6d1øy
+1ge
+2ge1a
+geak8ta
+geak6te.
+gea7ren
+ge4ark
+2geb
+6geba
+4ge5be
+3gebri
+4gebrå
+3gebyr
+ged4
+4gedan
+6gedel
+gedia5
+9gedom.
+7gedoma
+9gedome
+7gedomme
+6gedoms
+4gedos
+2gedr
+2gedy
+2gedø
+2gee
+geen8de.
+2gef
+g5eft
+3gefæ
+2ge1g2
+g5egg
+g3e2gn
+2geh
+gehø8ve.
+2gei
+g1eie
+g4e1in
+gei4r3
+gei9re
+gei8s7p
+gei6st5
+3geit
+geit3a
+geit3o
+gei4t3r
+2gej
+2gek2
+ge9kl
+ge3kn
+g1eks
+6gekt
+5gel.
+ge4lar
+4gelau
+ge6le.
+ge7lea
+4geled
+4gelei
+gelei5er
+4gelek
+4g3elem
+ge5len.
+ge5lens
+5gelet
+gel5ett
+3geli
+4gelid
+6geligg
+4gelit
+6geliv
+2gelo
+ge5lov
+7gels4
+gel3se
+gel5si
+gelsk7l
+gel5t4
+4gelu
+ge5lun
+gel7ve
+4gely
+2gelæ
+2gelø
+2gelå
+5gem.
+2gema
+9gema.
+2gemi
+3geml
+4g5emn
+gem6na
+2gemo
+9gemr
+3gems
+3gem4s5t
+ge3mu
+2gemy
+2gemø
+2gemå
+g2en
+3gen.
+ge2n1a
+ge7n6am
+gends6t
+ge3nea
+4genem
+gen5erf
+ge5nes
+gene4t
+gen5eti
+4genev
+gene5ve.
+gen8ga.
+gen5gr
+ge4ni6n
+6geniv
+gen5k
+genle6ge.
+gen3n
+gens5l
+gen6sun
+gen5tr
+4genum
+4geny
+4genæ
+4genø
+2geo
+5geog
+3geol
+geome5
+geomet4
+ge5on
+6geop
+ge9ope
+2gep
+g2er
+3ger.
+ge5ra.
+ge6ral
+ge4r5ant
+ge9ras
+ger5di
+4gered
+4geref
+4gereg
+4gerek
+ge6rene
+4gerep
+6gerese
+4gerett
+ger4i5d
+4gerik
+geri8ka
+6gerike
+ge4rim
+ge4ris
+ge4rit
+ge4riv
+gerle9g
+g9er8ma.
+ger3n
+gerne6
+4geroa
+4gerom.
+4geromm
+6gerop.
+4gerope
+ger5p
+ger4s5af
+5gerud
+ge5rup
+ger5v
+gerø6re.
+ge4r3ø4v
+4gerå
+g6es
+5ges.
+2gesa
+2gese
+5gesen.
+5gesens
+4gesi
+4ge5sja
+4gesje
+2ge1sk
+ge1sl
+geslu7
+ges4lø
+4geso
+4gespe
+ge4spr
+ge5spra
+2ge1st
+3gest.
+gesta7b6l
+5geste.
+ges6tekk
+ges8ti.
+gest5rid
+gestri8de.
+6gestå
+2gesu
+ges5vik.
+2gesy
+6gesæ
+2gesø
+2ge1så
+geså5re
+5get.
+ge5tak
+geta6le.
+6getat.
+6getate
+4ge3te
+5gete.
+2geti
+2getj
+2geto
+2getr
+5get5s
+2getu
+2gety
+gety8e
+2getø
+2geu
+g2ev
+2ge7v8a
+2geve
+4gevir
+gevi6sa
+4g5evn
+gev6ne.
+4ge5vo
+5gevå
+2gey
+4geæ
+2geø
+2geå
+1gé
+2g1f
+gfe2l
+4g1g
+g6g5al
+gg5ask
+g2g1av
+g4gedi
+gg1ei
+g4gela
+g4gele
+g2gem
+g4genu
+g6gerei
+gge4rin
+g4gerø
+gges6b
+gges5l
+g4gesm
+g6geso
+g4gesp
+g6ges6tio
+g6ge5sv
+g2gev
+ggie6
+g4gif
+g4g5i4m
+gg4je
+ggje5s
+g2gl
+g7glu
+g4gn
+g2g1o2
+g3go.
+g5gos
+gg3rad
+ggra6da
+gg5rat
+gg8re.
+gg3red
+gg7rek
+gg5s4par
+gg3sto
+gg4sy
+gg3sø
+g7g8ud
+g4g5u4r
+2g1h
+ghe8n
+ght5ene
+gh4to
+ghæ8
+1gi
+3gi.
+4giak
+gi1ar
+4giarb
+6giav
+2gib
+gi8c
+2gid
+gi3de
+gi1e
+4giek
+3gien
+gi9end
+5gier
+4gifa
+2gifo
+4gifr
+4gifu
+gi6ga.
+2gigr
+2gih
+2gii
+5gika
+3gike
+4giki
+3gikk
+gi5k4r
+4giku
+gi5le
+4gimess
+gi4metr
+4gimi
+4gimø
+2g1ind
+6gingeni
+gi4nin
+2g1inn
+gin5nu
+4gino
+4g1ins
+4g1int
+2ginv
+4gi5om
+2gi1op
+gio4r
+2gip
+gip5si
+6gira
+gi3re
+gi4re.
+giro3
+gi6rob
+5gis.
+2gisa
+gi3se
+4gisel
+4gisen
+5gisk
+6giska
+gis8lu
+gis4lø
+4giso
+4gisp
+gi3s4pa
+gi5s4pr
+giste6ru
+gis5ti
+gist5ra
+gi5stré
+gi6st5rer
+4gistu
+6gisty
+gi5ta
+4gi5te
+gite4s
+gi2t9r
+git5te
+2giu
+gi7va
+4gival
+4givo
+4givu
+1gj
+2g1jak
+g5jarn
+2gjaz
+gje5f
+4g3jeg
+gjels4
+gje2n
+gjen1opp3s4
+gjen5s8
+6gjent
+3gjer
+gje7sk
+gje4s3p
+gje8v9ak
+2gjob
+2g1ju
+7g6jut
+gjø9de
+2g3k2
+gkly9
+gl2a
+6gla.
+gla3de
+4glag
+gla4ga
+gla8ge.
+g3land
+g1lar
+gl5art
+glar7v
+1g2las
+7glase
+g6lass
+6glast
+g5last.
+3glat
+g5lau
+gl6e
+gle6dero
+g2lef
+gle3ge
+gleg8ga
+6glei
+glei7er.
+g2lek
+g7lek.
+g5leke
+g2lel
+3glemt
+4glen
+g9len.
+g9lene.
+g9lenes
+g9lens
+gle9pl
+4gler
+gle4ra
+glere8de.
+g9les.
+gle6se.
+g4le5sk
+g6le7sm
+4glet
+g2lev
+1g2lid
+gli4del
+gli7e6n
+gli8er
+glig1
+3g2lim
+gli9me
+4glio
+glitt4
+6g7liv
+4glj
+gl7ja
+gl5l
+g4lo.
+g2loa
+5glob
+5g6lome
+1g4lor
+gloria7
+glori6an
+glorie7ne
+g4los
+glo5ste
+6glov
+gls4
+5glug
+g5luk
+6glun
+gl5ung
+glun8ge.
+gl5ut
+g5lyd
+3glyf
+gly4se.
+g2løg
+glø8pa
+2gløs
+gl7øy.
+5gløym
+2g1m
+g4mete
+g4metr
+g5mé
+gmini6
+gmo4e
+g3mu
+gmu8le.
+gmå6la
+g1n
+gn1ak
+gna5lem
+gna4lo
+g2nav
+gn1d
+gndø6
+gndør5
+gn4e
+g2nee
+g4nelo
+g6nero
+g6nerø
+gne1s4
+gne8se.
+g4nesk
+g4nest
+g5net
+g6netr
+g2nev
+g4nib
+g4nid
+g6nik
+gning4
+gnings5
+gni4s
+g6ni5sk
+gni6st
+gnist9r
+gn5k4
+g2nom
+gn5o6p
+gn7o6v
+gn5r
+gn1s
+gn4skr
+gn6sm
+gn4som
+gns4pr
+gn4sti
+gn2s1v
+gn5t4
+gnu5re
+gnæ6re
+g2nå
+1go
+7goan
+go1ar
+7goar.
+2gob
+gobe5
+go4da
+go5dal
+god5ar
+2godd
+go4de.
+gods9t
+2gof
+go9ga
+go5ge.
+go9g8r
+6goi
+2gok
+gok4se.
+go3le
+gol6fa
+go5lo
+gol4va
+gol6var
+go4lå
+2gom
+g7o6ma
+6gometris
+7gomm
+go4n5and
+go9ne.
+go7ni
+go5nok
+gon9s
+2g1op
+3g6or4a5
+go5ra.
+go7rae
+go7ras
+2gord
+gor6da
+go1re
+gore8a7
+2gorg
+g4ori
+gori5e6
+g5orv
+gor8va
+go5rø
+gos3p
+4gost
+6goto
+got6r
+4gov
+go8ve.
+go8vi.
+2g3p6
+1gr4
+8gr.
+4grab
+6grac
+gra5ce
+9grads
+graf5f
+graf5t6
+gra4m5
+grand3s4
+gran5to
+grant4r
+gra9se.
+gra9set
+gra6sk
+gras3t
+gra5t
+gra8te.
+grati4s
+gra4u
+gra4v3ak
+gra7vis
+gravta8
+2grea
+4g5reds
+gre4en
+2gref
+g7refe
+g4rega
+greie5n
+grei6ene
+6g3reis
+4grek
+2g5rel
+g5rent
+4grepi
+grep4s3
+g7rese
+gres6sak
+gres6sent
+6g5rest
+4grett
+4g5ri.
+grib3
+4grid
+4grif
+4g1rig
+gri5sete
+4grit
+gro9ar
+g4ro7i
+grom5m
+g4ron
+gro5sk
+gro3ve
+4g5rui
+4g3rul
+grun7g
+5g4rup
+gru7sa
+grus5t
+2g1rut
+2gryd
+4g5ryg
+6g5rytm
+grø5de.
+6g5rør
+4g5røv
+grø5ve
+4grøy
+gr7øy.
+6gråd
+grå6da
+gråk4
+grå7n
+grå5te.
+8gs1
+gsa2
+gs5akers
+g7sal.
+g7sale
+g5salg.
+g5salge
+gsam3
+gs3amb
+gs7amn
+g3s6ank
+g5sard
+g2sas
+g7sast
+gsbø6n
+gs2ce
+gs5ef
+g2seg
+g2sei
+g2sek
+g5sekr
+g7sekv
+gse9la.
+gsel4s5a
+gsel4st
+g2sem
+gs6ende.
+gsen6ke.
+g5sens
+g3sent
+g2ser
+g5ser.
+g3seri
+gse4st
+gse4t
+g3sete
+gs3eti
+g9sets
+gs4ett
+gse2v
+gsfø2
+g2si
+g5sider
+gs5is
+gsi2v
+gs4jar
+g3sjef
+g5sji
+g2sjo
+g5sjå
+gs4ka.
+g5skad
+gs4kal
+g5skall
+g6skam
+g4skan
+g4skapa
+g5skape
+g4skapi
+gs7kav
+g5skilt
+g7s4kj
+g7s6kjæ
+g3skot
+g5skren
+g7skug
+g6skv
+gsla6ga
+gsle6ge.
+gs6leri
+g4sluk
+gs4lun
+gsl9ut.
+g5slyn
+gs5med
+g9s6mert
+g7snel
+g5sog
+gs9ope
+g5spal
+g3spel
+gs2pi
+gs5pik
+g3spil
+gs5pile
+g6s5pors
+g3spur
+gs3s4
+gsse4e
+gs5tak
+g9s8tand
+g5stang
+gs4tasj
+g7s4tat
+gstatsrå7
+gst6e
+gs5te.
+g5ste4e
+gs4tell
+gs5tema
+gste6ma.
+g7stemt
+gs4tere
+g5s4terf
+g5s4terk
+g5s4tern
+g5s4ters
+g5s4terv
+gst7evnen
+g5s4ti.
+g3s4tie
+g3stif
+g3s4tig
+gs5tiå
+g5sto.
+gs4tol
+g5stol.
+g7stola
+g5stole
+gs5toll
+gs4trap
+g5strau
+gst5rea
+g5strede
+gst5rei
+g5streke
+gs6tret
+gstri8de.
+g5s4trof
+g3strø
+g5s6trå
+g5stue
+gst5ut
+gstyr8ka
+gs4tør
+g5s4tå
+gsu2
+gsu5g
+gs4vane
+gs5vik
+gs7væ
+gsy2d
+g7sym
+gsy6na
+gsy6t
+g2sø
+gsø6ki
+gs6øt
+gså4
+2g1t
+g3ta
+gta8ka.
+gta8ke.
+gta6la.
+gta4le.
+g9t6e
+gte6ke.
+gte6ma.
+g3ti
+gti8de.
+g4t5if
+gt6re.
+gtråd5s6
+gt7sv
+gt5t
+gtu8en.
+gtvek8
+gty8e
+gt9yt
+1gu
+4g5u4bå
+gu2di
+guds3t
+gu4el
+6gug
+g5ug6l
+gui4d
+guid5ar
+gu4le.
+4g5ulk
+gul8ke.
+gul4la
+gul5o
+gul7ø
+7gum
+gun4g
+gur2g
+gu4ri
+gur8na
+gur6ne.
+gu5rua
+gu3rue
+gu4st
+gu1ta
+2gutb
+4gutd
+g5ute.
+6gutg
+g7utl
+4gutn
+2guts
+gut4tak
+gut4tes
+4guttr
+2g1v
+gva4ke.
+gva8la
+gvedli6
+gvi8ta
+6g1w
+1gy
+g9y8a
+gy4da.
+7gym
+gy3ne
+gyr6
+gy8sa.
+gy6se.
+gy4te.
+gy4ve.
+g5æt
+4g5øk
+gør3s
+2g3øv
+gøy9a
+gøye6r
+gøy5n
+1gå
+gå6as
+gå6en.
+gå4er.
+4g5å4k
+4gåm
+4g3ån
+gån8da
+2g1å4p
+2g3åre
+gå2s
+gå3st
+gå9ven
+gå4vet
+h2a
+ha4a
+haba9
+4hae
+ha2el
+4hafi
+ha2g
+ha3ga
+ha4ga.
+ha3gen
+hai1
+ha7ism
+ha5ka
+ha4ke.
+ha5ken
+ha7kera
+ha4ke5s
+ha1la
+ha6la.
+hald4s7
+ha4le.
+ha4lev
+hal6lei
+hal6lø
+hal4s3k
+hal4so
+hal4s3t
+ha5lu
+hal4v5
+ha5ma
+ha8me.
+ham6nest
+ha5mo
+ham4st
+hams4t7r
+ha5na
+han6d5r
+hand7skr
+hand5ø
+ha4ne.
+hani1
+hanis4
+han2n3
+han4ne
+han6nel
+han5nen
+han5n4o5
+han3se
+han4sk
+ha4pe
+ha4re.
+ha5rei
+ha4rel
+ha3rem
+ha4res
+har5k
+ha5rov
+har7se
+har5tre
+har4tri
+ha4sj
+hasj5e
+ha2sl
+has6p7l
+has5v
+ha3tar
+ha4te.
+hat6le
+h4au
+hau5ke.
+hau6st
+hau4t5r
+hav4a
+ha4va.
+ha5van5
+ha4ve.
+ha4veg
+ha4vei
+have3s
+ha1vi
+ha4vo
+hav4sl
+ha6vu6
+hav1ø
+4havå
+2h1b
+hba4ne.
+4hc
+2he.
+he2a
+he7ans
+heat4r
+heb5n
+he4de.
+heder6s5
+he2d9r
+hef9ta
+hef7tes
+he3ge
+he4ge.
+he2g3r
+he2i
+heia3
+hei5en
+3heim
+he3ins
+hei4sk
+heit4s
+he2k
+hek4sek
+hek6serin
+hel1a
+he4la.
+he4le.
+he4l5ei4
+hel6lesu
+hel3o
+hel2s2
+hel3sa
+hel4se7
+helses4
+hel3sk
+hel5sp
+hel5ste
+hel3sv
+hel4tes
+hel9ve
+he4mak
+hem5ne
+hem3s8k
+henfø5re
+hen5o6
+hen1s2
+hen5se
+hera9da
+he5ret
+he4ri.
+her5j
+herle9ge
+herli9ga
+4her5n
+he1ro
+he4ro.
+hero9a
+her7p
+her6rei
+her6resi
+her6ret
+her6ska.
+her8s7kare
+her6sv
+her5un4
+he2r3ø
+he4se.
+he2sp
+hes7pa
+hes5pel
+hes5pen
+hes9per
+heste5ri
+hes4tes
+he6stø
+het2
+he4te.
+he5t6i
+het4s3a4
+het4s5p
+het3t
+he6va.
+he6v7arm
+he4ve.
+hev9na.
+2hf
+2hh
+h5hu
+hi5ao
+hi4bak
+hie4n
+hi2et
+hi4f1
+hiff2
+hif9r
+hi6ge.
+hik7e
+himme6l5o
+hi6n7an
+hin4nes
+hins4
+hins9ke
+hi4pl
+hip3p
+hi1ro
+hi2s1
+hi9se.
+hi3sen
+hi5s4i
+4hisk
+hit7o
+hi4t5r
+hit5ti
+hi8va.
+hi4ve.
+hiv1s
+hjar4
+hje4
+hjem7e
+hjorte5
+hju6l7
+hju7l8e
+2hl
+h5lan
+2h1m
+hma8n
+2hn
+h2na
+hne6n
+hn1s
+h4o
+ho5ar.
+hob6
+ho6da
+ho4de.
+ho5den
+hode3r
+ho5der.
+ho5dy
+hof4f3
+hof4f3a4
+hof4f3e4
+hof5f6er
+hof4fi
+hogs6
+hog6str
+hog7stra
+hoi5
+ho2la
+ho5lag
+ho5lan
+ho4le.
+ho4lin
+hol5l
+ho4lom
+hols4
+ho4lu
+hol7ut
+ho4me.
+ho4mo.
+ho4mod
+ho4mos
+ho5n6o
+ho4o
+ho8pa.
+ho4pe.
+ho8pi.
+ho5ra
+ho6ra.
+hor2e1
+ho1ro
+2hort
+ho4s
+hos5a
+ho5sen
+ho5ser
+ho5si5
+hou2
+ho1v
+hove5re
+ho4vé
+2how
+h1p
+2hr
+h1ra
+h1re
+hri5ne
+hri2s3
+6h1s
+h5s4e
+4ht
+h5ter
+htere4
+h1tr
+ht5t
+hu4da
+hu4d3
+hud5s6
+hudså9re
+hu4er
+hu6et.
+hu4ga
+hu4ge.
+hu8ja.
+hu6ka.
+huk8ra
+hu4la
+hu4le.
+hu4leg
+hu5les
+hu4lev
+hu5ma
+hun6des
+hun2n3
+hu1ru4
+hus1a
+hu8sa.
+hu5s6a6r
+hu6s7arr
+husa7r8e
+hu4se.
+hu4s3ed
+hu2s1i
+hu2s5j
+hu2s1k
+hus7m
+hus5s4
+hus1t
+hu8str
+hust9ran
+hus4tre
+hu6sty
+hu6s5u6
+hu2sø
+hu4va
+hu4ve.
+hu4ves
+hv4
+hva5le
+hvas5
+hve2r
+hver3a
+hvi5l6i
+h4v4ir
+hvits4
+hvo2
+hvor5
+hvor5i6
+h6y
+hya3
+hy2bl
+hyd4
+hy2e
+hye5ne.
+hye9nes
+hyg5gel
+hy6la.
+hyldes7
+hy4le.
+hyr4des
+hys3
+hy8sa
+hy4se.
+hy2s1j
+hys5t
+hæ5g
+hærfø9
+hær3s6
+hø4e
+høf5
+hø2g
+høg3ri
+høg7rø
+høk6
+hø6le.
+hø4na
+hø4ne.
+hø5rar
+hø5ren
+hø5rer
+hø4res
+hør6sp
+hø2s
+høst7a
+høst5ø
+hø1va
+hø1ve
+hø1vi
+høy5a6
+høy5k
+høy7n
+høy7rar
+høys4
+høyse6te.
+h6å
+hå7a
+hå8le
+hå6na.
+hånd5skr
+hå5nel
+hå6pa.
+hå4pe.
+hå4p5l
+hå1re
+hå1ri
+hår3s
+hår7u
+hå8va.
+hå4ve.
+ia9al
+i1abl
+ia1bo
+i2a3de
+i1adj
+ia5d8r
+ia1g2
+ia2ge
+ia1in
+ia1kr
+i1aks
+iak8se.
+ia5ku
+i1al.
+ial1a
+ial5ein
+iale4t
+ial5eti
+ia4l5ett
+i2alf
+ial3g
+ia4lin
+i4alk
+ial3op
+ia6lov
+i5als.
+ials4t
+i3alt.
+ial1u
+ia2lø
+i1an.
+i2ana
+ia4nal
+ian5ald
+ia5nar
+i7andr
+i5a4ne.
+ia8nes
+ia7net
+i5ank
+i1anm
+ia2no1
+i1ans
+ian3sa
+ian3sl
+i1ant
+ia7nø
+ia2pa
+i3app
+i1ar.
+iar4do
+iard5s4
+iar4du
+i2are
+i5area
+ia5r6e8l
+i5arn.
+i9arns
+i7arska
+i6asi
+i1asm
+ia4sp
+ias3s6
+i3assi
+i1ast
+i7ast.
+ia1t
+ia5te
+iat6r
+iaty6ra
+i1att
+i7auk
+i1av
+i1b2
+iba4ne.
+ib5bo
+ib3bu
+i3bere
+ibe4ro
+ibi5er.
+ib7lar
+i2b3le
+ib4leg
+ib4le5s
+i5bo
+ibo4e
+ibo7n
+ib4r
+ib3st
+ib8t
+ibya7
+iby9ar.
+8icanarar
+ice5ne
+i1ci
+ick1
+ick7ete
+i1co
+i5cy
+2ida
+i5dal
+i3das
+id1av
+id3del
+iddel5u
+id6dep
+2ide.
+3ideal
+i2deb
+i6def
+id5e4ge
+i7deki
+i9del.
+id3elv
+2iden
+i5dend
+iden5sv
+5identif
+5identit
+ideo3v
+i6derap
+i9de5re.
+i7deren
+i9deres
+iderla8ga
+iderle7g
+i7dern
+i5ders
+i6desm
+id6gem
+id4ges
+idi4en
+1i2dio
+i8dj
+id7jer
+id9na
+1i4dol
+id9ran
+id5reg
+4i3drev
+2idri
+id2s1
+id5sam
+idse4
+id6sel
+id5sim
+ids5l
+idsla6ga
+ids3t
+id4s5tu
+id2t1
+i2d1un
+i2dy
+3idyl
+i3dyr
+i3dø
+i6d7øy
+id7å
+2ie
+ie1a2
+i2ed
+i1eff
+ie4ge
+iego4
+ie1i
+iei6d
+i1eie
+i3eig
+i5eini
+iek8l
+i1eks
+ie5l6a
+i2ele
+i5elem
+ie4lev
+i7e6lim
+i1els
+i9elt
+ielø8pa
+i8e9ma
+iem7b8
+ie3me
+i1en
+ie7na
+i2end
+ien6dela
+ie8né
+i2e5ni
+ien7n
+ie5no
+i5ens
+ien4sk
+ien4s5v
+ien4t3r
+ie5nu
+i6eny
+ie4ran
+i4erd
+ie6re.
+ie5reg
+ie4r5eng
+i6eret
+i2eri
+ie4ril
+ie4ris
+ie4riv
+i2erl
+i6ero
+ie7ro.
+ier4ra
+ier4sp
+iers3v
+ier5t
+ie3run
+ier5v
+i2e1s
+i6es.
+ies4c
+ie3se
+ies5s
+ies4ti
+i8es6v
+i1et
+i2eta
+i5e4tabl
+i3etat
+ie9te
+ie5té
+iet4re
+ieu2
+ie7ved
+2if
+ife4s1
+if2fa
+ifi6e
+ifjø8
+if3le
+if4les
+iform4
+if1re
+i8ft
+if4tal
+if4tere
+ifte5s
+ift2s
+i3fø
+2ig
+i2gae
+ig3ann
+i7gark
+ig4art
+iga3ru
+iga7te
+ig3att
+i2gav
+ig3d
+i6geb
+i6gedi
+i6gedomm
+igedoms5
+i2gem
+i3gen
+ige6no
+i5gers
+i4gerø
+i4gesp
+ig3e4ta
+ig5ett
+ig4ged
+igges4
+ig4gra
+igg9s2
+i6gh
+i2g1ia
+i5gib
+i4gim
+igion4
+igje9va
+ig1l
+igl6d
+igli6se.
+ig5loa
+ig5neu
+ig5no
+igof6
+igo5fr
+ig1om
+igo4no
+ig2ra
+ig2re
+i2g1rø
+ig3råd
+igrå5t
+igs4al
+ig5sel
+igs2j
+ig5s4ka
+ig3s4kr
+igs4mu
+ig3s4pa
+igst4
+igs4ta
+ig4ste
+ig5stek
+ig7stel
+ig5stem
+igs4tra
+ig5s4va
+ig1un
+ig9ut
+i3h
+ihen3
+iho7le.
+i4huk
+ihu9la
+ihu5le.
+i1i
+i5in
+i7is.
+i6ita
+i1j
+2ik
+i1k2a
+i2kab
+i5kabel
+i2kaf
+i2kak
+ikan9d
+i2kao
+i4kapo
+i5kar.
+i5kara
+ika5re
+i4karei
+i6kasa
+ika3sp
+i2ke.
+i2ked
+ik9ei
+i9keleg
+i5keli
+ike5lu
+i5ken.
+i4kena
+i5kene
+i9kens
+i3ker.
+i4kera
+i5kere.
+ike5ri
+ike4r5o
+i2ke1s2
+ike3si
+i6kesk
+i5keso
+ike5su
+i5ket.
+i5kets
+i1ki
+iki9ne
+ik5inn
+iki5st
+i1kj
+ik4kaf
+ik6kana
+ik4kap
+ikk5arv
+ik4kas
+ik4kat
+ikk5att
+ik6k7ent
+ik4keru
+ik8kesk
+ik4kest
+ik3kjø
+ik4kjøp
+ik4kl
+ikk5lag
+ik2ko
+ikk5ord
+ik4kr
+ikk3re
+ikk5sv
+4ik2ku2
+ikk5und
+ik2kv
+ik6ky
+ik1l
+i5klæ
+i1ko
+i2koa
+i9koar
+i2kob
+i4kod
+iko5de
+i2ko3f
+i4kog
+i4koh
+i2kok
+iko5na.
+i2koo
+i5k6ord
+i4kore
+i2kov
+ik1r
+ik4rak
+ik5rem
+ik5robe
+ik3ros
+ik2ry
+ik2sa
+ik4sek
+iksmå8la
+ik7sot
+ik5spel
+iks5ti
+iks5to
+ik8stu
+ik4tav
+ik4teg
+ik2t1r
+iktsla8ga
+i1ku
+iku6le.
+i6k7u6t
+ik1v
+ik4vin
+i1ky
+i3kø
+i3kå
+ikå8pa
+i1la
+il5adr
+il7af
+i2l3ak
+il3al
+i4lana
+il6and
+i4lark
+il3art
+il5ass
+ilas5t6
+ila5t
+il5av
+il4dak
+il4deko
+il4dete
+il7dj
+ild3re
+ildsfa9re
+ild3s4t
+ilea9r
+ile8are
+i3le7e
+i2lef
+ile4ge.
+i4l3egn
+i2l1ei
+i6leig
+i2lek
+i2lel
+i4leno
+i4lero
+ile1s
+i4lese
+i4le5sk
+i4lest
+ile6tri
+ilet5te
+ile4tu
+i1lé
+ilfø5re
+il5ge
+il1gl
+i4lid
+ili5ers
+ili9ga
+i5lik
+i2l1im
+i4l3ind
+i7line
+i4lins
+i4l3i4r
+ili5s6tik
+il3ja.
+il1je
+il5jese
+il1jo
+il1ju
+ilke3
+il5ker
+il4kes
+ilk4o6s
+il5ku
+il4lab
+il6lam
+illan8da
+il6lap
+il9lau
+il4lee
+illei9e
+il6l7ender
+il6lesk
+il4lev
+illi9ga
+il4lo5m
+ill3s2
+ills5kå
+illæ4
+illæ9re.
+il4m5est
+ilm5e4v
+il4mi
+ilm5s
+i1loe
+i9lolo
+i4lom
+il5omv
+i5lon
+il3opp
+i4l1o4r
+i5loso
+ilot3u
+i4love
+ilo1w
+ilret4
+ilset8je
+il3sl
+ilsla7
+ilsle7ge
+ils4mu
+ils2p
+ils2t
+il5str
+il7su
+il3s2v
+ilsva9ra
+ilsva5re
+ilta9la
+ilt5rett
+il6t7å
+ilu4h
+i5luk
+il7ul8
+il3un
+i5lur
+i9lus
+il1ut
+il5v6
+ilve8d
+ilve4r
+i1ly
+il1å8
+ilår6
+8im.
+4ima
+i2mad
+i4maen
+i2mag
+i6m5akk
+i4mako
+imal8n
+i2mam
+i9man
+i2map
+i5mar.
+ima5s
+i4matr
+i8mb2
+i4mee
+i2me1g
+i2mek
+i6melu
+im5enh
+im8et
+i9met.
+i4meta
+i4meti
+i6mey
+i8mé
+imi9la
+imini6
+i7mj
+im4lev
+im8l9u
+im5m
+i6mog
+imo9l
+im5ord
+imor8da
+im7o6v
+imp2
+5imperi
+imp4l
+1impo
+imp9s
+impse8
+1impu
+im4ref
+im4rek
+im4res
+im9se
+ims4k5l
+ims3kr
+im5s4me
+im1s4t
+im6sti
+imta8la
+4imu
+i3mø2
+2in.
+6ina
+i4nag
+in5agg
+i5nakk
+ina4let
+i4na2m
+in3ame
+in2an
+i9nane
+in5ann
+i2nap
+in5app
+i5nar.
+i5nars
+i4nask
+i4nasp
+i4n5ass
+ina4t5ak
+i6nau
+in7auk
+in5avl
+in5avr
+ince2
+in7der
+6indig
+in4dog
+ind9ra
+in3dru
+indr5ø
+ind5sk
+ind3sp
+ind5s4t
+5industr
+ind7å
+4ine
+ine8are
+i2ned
+inedy6
+in5egg
+in5eid
+in3eie
+i6nele
+ine4li
+in7eng
+ine8pa
+ine8pe.
+i7nere.
+i5neren
+i9neres
+ine4rik
+i7nern
+i5nert
+i5nes.
+i4nesk
+ines8ka
+ines8ke.
+ines4st
+ine5s4ti
+i4nesø
+i2nev
+8iné
+3infek
+in4fos
+in4fot
+infu9
+4infy
+in4g5ald
+in4gav
+in5gebj
+in6gem
+5ingeni
+in5geri
+in4geru
+in3gev
+ing5jen
+in4goa
+in4gos
+in2gr
+ing5rep
+ing7ris
+ing2s
+ings5om
+ingst8
+ings5v
+6ingu
+in2g5ø
+i7nia
+ini9ar.
+i2nib
+i5nie
+i4nif
+i2nig
+i4nil
+ini7m
+i4ninn
+i2nip
+i4nisa
+ini3se
+i4nises
+5initia
+i4nito
+5injek
+2ink
+in5kel
+in4kero
+in4k3la
+in4kok
+in5l
+inla8ga
+2inn.
+in4nal
+in4nem
+in4nerø
+in4nesi
+innes6t
+4innet
+in6n7ette
+innfa9s
+1inng
+5innhal
+3innho
+2inni4
+in4ni.
+in4n5om
+in5n6ova
+inn1s4
+6inns.
+3innsa
+inn5se
+inn9sen
+inn9ste
+inn7sve
+1innt
+in4n5u4
+4innæ
+in2nø4
+2ino
+ino5a
+i5noar
+i4nod
+inok6
+in7oks
+in1s
+4ins.
+8insa
+in9sa.
+in7sal
+in5sar
+in5se.
+in4sek
+in3sen
+inseri8e9ne
+in3si
+insis5
+6insj
+in4sja
+in3sje
+4insk
+in9s8kas
+in5skat
+inske4t
+ins4ki
+in3skj
+ins5kjøt
+ins6kor
+ins4k3v
+ins6kø
+insle7g
+ins8lega
+in3slo
+in3s2lø
+in5s4ma
+in3sop
+1insp
+in4spa
+in5s4pl
+ins4po
+5instal
+in8s5te.
+ins5ten.
+ins9tens
+3in3s4ti
+in4stin
+4in3s6to
+in5stra
+inst5rel
+5instru
+in6stå
+in7sul
+in2sv
+6in3sy
+8int.
+2in3ta
+inta8la
+4inte.
+5in7teg
+in8t7ege
+in5ter
+int5ess
+in5te4t5
+4in5ti
+inti5me
+int2r
+intran4
+int4rer
+in5tres
+6inu
+inu6i
+i8n9ul8
+in7ut.
+in9u8te
+1inv
+6invev
+iny4i
+iny4t
+6inø
+in7øk
+i7nøt
+in3øv
+4io
+io1a4
+i2ob
+io4dere
+i1off
+io5gn
+io1i
+i1oks
+iol4
+io3le
+iol7jen
+io3mu
+io4nans
+io4narr
+io6n5erst
+ion3g4
+io4nin
+io4nu
+io1pl
+i1opp
+io5ra.
+ior8da
+io1re
+io4rie
+io4r5in
+iorla8ga
+iosk3v
+io1st
+iota6le.
+io3t4e
+io4tra
+i5pap
+ipa4ti.
+i4pee
+ipela9
+i7pe6p
+i1pi
+ipi1e
+ipi9ne
+i4p5ings
+i1pl
+i2ple
+ip4peli
+ippel7s6
+ipp6lan
+ipplæ8re.
+ip2pr
+ipp4s3t
+ippsy8na
+ipp4sø
+ip7pun
+i1pr
+i6pra
+ip5ru
+ipru8te.
+ips1a
+ipse4l
+ipsfø5
+ip2si
+ip2s1k
+ipsle6ge.
+ips1t
+ip6tar
+i5py7
+i3pø
+2ir
+i1ra
+i9r6and
+ir5ark
+i9rast
+ira6tr
+ir5de
+ird5s
+i1re
+ir3eie
+ir6ek
+i3repo
+i3rer
+ire6r5a
+ire7st
+i3ret
+i8reto
+ir7g
+i1ri
+iri4a
+iri8ka.
+ir3ind
+ir3inn
+ir5inst
+iri9t
+ir5ka.
+ir4kat
+ir5ker.
+irke3s6
+ir4kest
+ir4kle
+ir5kv
+irk5ø
+ir4mag
+ir4mal
+ir4mast
+ir9mé
+i5roa
+i1roe
+i4roi
+i1rol
+ir5opp
+iro1s
+ir3re
+ir7sko
+irs2p
+ir3s4t
+irt6
+ir3ta
+irti6g5r
+i1ru
+ir5u4k
+iru8m
+iru7sa.
+i1rø
+i1rå
+ir7å6l
+i1sa
+i4saks
+i4sanb
+i4s3ang
+is3ann
+i4s3ans
+is3ant
+i7sas
+is5aud
+3isbry
+is6cen
+isch5
+is3co
+i5scr
+i2sed
+i4seel
+i4seen
+ise5ern
+i2s2e3g4
+i2sei
+is3eie
+is5eig
+ise5is
+i2sek
+i3sekt
+i4sekte
+i6s7eld
+is4e5li
+i2sem
+ise5ne
+i4seno
+isensi6
+i5ser.
+i5sers
+i2ses
+is5ess
+i4sete
+iset8je
+i2seu
+8isé
+isha7ne
+3ishav
+is4h5in
+ishø9ve
+isi6ene
+is5ild
+i4s3ind
+isis5t
+is7jun
+is9ka.
+is3kal
+is3kar
+isk9art.
+isk5arte
+i8ske
+is5ke.
+is8kee
+is4kel
+isk5els
+iske5s4
+is3kje
+i3skjo
+iskla8ga
+is6k5le
+isk3lo
+isko5g
+is7kogr
+is3kop
+is3kot
+is1kr
+is6k5rin
+is1ku
+is4kul
+i5skula
+is1kv
+is4kvi
+is1l
+i6slu
+isl7ut
+isl9øy.
+i5smak
+is4med
+ismo5e
+i6smus
+is5ne
+is5nu
+1isol
+6isold
+5isomo
+is5omr
+iso3pa
+iso5pe
+iso7pr
+3isot
+is1ov
+is1p
+is4pan
+is5pane.
+is6pis
+is7pru
+is4ses
+is5si
+issis5
+is6s7kj
+is4sko
+is7skr
+is5sky
+is4skå
+is5sok
+is7sto
+is6sve
+is5svo
+is9s4ær
+is4søk
+i5stab
+ista9le
+is5tane
+is5tap
+i4s5tar
+ist5avb
+ist7avi
+i2ste
+is5te.
+is4tek
+ist5ekt
+istel5l
+iste6ma.
+ist6en
+is5ten.
+is5tene
+is5ter.
+is5tern
+is6terø
+is6té
+is4tik
+is5tilb
+is5tis
+is3tok
+is3tol
+i2str
+i8s8tre.
+i4st5ren
+i5strer
+i6strer.
+i4stres
+i6stret
+is3try
+is3tus
+6isu
+is5uf
+is5ul
+is1un
+is1v
+is4vak
+is7w
+isy8na
+isy5r
+is5yt
+i2s1øk
+i4søy
+is7åk
+is3år
+i1ta
+ita4l3a
+ita6l5ers
+ita4lo
+ita4ly
+i6tang
+itan7s6v
+itau4
+i4tav
+i4tec
+i2teg
+ite8ke.
+i7teky
+i6t7elg
+i4teni
+i2teo
+ite3re
+i4tero
+iter6s5
+i4te5ru
+i2te1s
+ite6se.
+itet6s5
+i1té
+it2i
+iti6er.
+i4ties
+i2tif
+i4tikam
+i4ti3kv
+iti5me
+i2tio
+i2tip
+iti3r
+i4tisa
+i4tisen
+i4tisi
+i4tisj
+i4tisko
+i4ti3sp
+i4tist
+iti5str
+i2tiu
+itiv4
+itivs5
+it7jaran
+it7jer
+it7ji
+itma6le.
+itnes4s
+i1to
+ito9a
+i4tom
+it5ord
+ito4s
+itostra6
+ito8v
+i1tr
+i4tra.
+i6trae
+it3rel
+it3ren
+it5rim
+itri8ma
+it3rin
+i5tris
+it7ro6s
+it1sa
+it4s3ei
+it3ser
+it6ses
+it5sku
+itsla8ga
+it1sn
+it6sti
+it3sun
+it4tag
+it6tak
+it4tal
+itta9la
+it6tann
+it6tap
+it4t5at
+it5ted
+itte4l5o
+it4tenk
+itte5s4
+itt5ett
+it4tid
+it4til
+it4tj
+itt1o
+it6tof
+it7ton
+it4tr
+itt5skr
+itt4sø
+it4ty
+it7tys
+i1tu
+itu5e
+itær1
+i1tø
+i5tå9
+i1u
+iu6a
+iu2b
+i5u6l
+i5um.
+ium4f5ar
+iu2m1i
+ium5m
+iu4mo
+i6umse
+i4um5s4t
+i4umsu
+iu2n
+iu8p
+i2ur
+iu5se
+4i1va
+i4vad
+i6vaj
+i4v3aks
+i5val
+iva6la.
+i4vana
+i4v5ank
+i4varb
+ivar5s6
+i4v5ass
+ivat3t
+i1ve
+i2veg
+ive6ge
+iv5eg6n
+i4vei
+iv7eig
+i2vek
+ive4ra
+ive5ras
+iver5d
+i6veret
+i4vesk
+i4vesti
+i6vesv
+i6vetø
+i2vev
+i1vé
+i1vi
+iv5ins
+iv5is.
+iv5isb
+ivle6ge.
+iv3n
+i1vo
+iv7om
+iv3r
+iv4sal
+iv2si
+iv2sk
+iv2sl
+iv2sn
+iv4so
+ivs5v
+i2v3un
+iv7y
+ivyr8ke.
+i9væ
+iv7åpn
+i1wa
+iwi5
+i5wie6
+i5y
+iyr8ke.
+i5za.
+i7zas
+i4ze
+i1zo
+i1ø
+i1ø4k
+i1ør.
+iør5i
+iør5s
+i4øs
+iø3se
+i1øy
+i1å4
+iårs7l
+iåt4te.
+ja1ak
+ja9ar
+ja4da
+1jae
+ja7en
+5jag.
+ja4ga.
+ja7gar
+ja4ge.
+jag6r
+ja4ha
+ja4hv
+ja4j
+jak4kel
+jak7kele
+jak4ko
+jakk5s4
+ja1k8r
+ja8kre
+jaktel
+ja7ku
+ja3lo
+ja1lu
+jam7b
+6jambi
+jamhø8ve.
+5jamm
+jams2
+jan4gr
+j5anl
+ja6ra.
+ja6r5ap
+ja9rek
+jarn3s4
+jar5ta
+jar5te.
+jar5tet.
+jar7ti
+6jarø
+ja6rå
+ja7se
+ja8ski
+ja5sti
+ja5ta
+jau4ere
+ja9vi
+1jaz
+j1b
+2jd
+j2e
+2je1a2
+je5ak
+2jeb
+jeb9b
+je4deb
+6je4dek
+4jedr
+jeep1
+6jeev
+2jef
+je4f3et
+je2fj
+jef5lag
+je4f3re
+jef4sa
+jef6s5i
+jef3t4r
+je5ge
+jeg5ge
+6jegl
+jeg6les
+4jego
+4jegr
+4jegy
+2jeh
+je1i
+je5i8s
+4jej
+2jeka
+jek6keru
+4jekl
+je4kli
+2jeko
+jekt3a
+jek4tan
+jek6tes
+jekt5ev
+jek4t5in
+jek4t3r
+jekts4t
+4jekø
+2jel
+je6legr
+jelei7er
+je7lele
+je4les
+jel7ge
+jel6lag
+jell5ang
+jel5len
+jel4lo
+jelt3
+jel4tr
+jel9ut
+jel7va.
+2jem
+je4mia
+je4mit
+jemp6
+jem5pl
+jem5se
+jem4sti
+2je7na
+jen1d
+4jendr
+je3ne.
+je7ne8s
+4jenet
+jen5ged
+jeng5s4
+2jeni
+jen3k
+4jenl
+4jeno
+4jenu
+je2n1y4
+4jenæ
+2je5o4
+2jep
+je3raf
+je4r5ant
+jer4dep
+jerd6s
+je3r6e
+4jered
+6jereg
+6jerei
+6jerenn
+je5rik
+je6rim
+je6rinæ
+jer4kes
+jer6k5l
+jer4kv
+jerle7
+jer6mu
+jer6n5as
+jern5sl
+je6ron
+jer4sp
+jert5s
+4je1ru
+6jerå
+5jesf
+5jesh
+jes4kil
+2je3sp
+jes4tea
+je6stim
+je3str
+5jesut
+je5sve
+je4t3ag
+jeta6ka
+je9tar.
+je7tara
+je9tare
+je4t3ru
+jets2
+jet4t5an
+jet6term
+jett3o
+jett5s6
+je4t3v
+jety8e
+2jeu6
+4jev6a
+je7vark
+je6vas
+4jeve
+jevi4s
+jev7na.
+jev7ne
+6jeø
+j1f
+4jg
+j1h
+4ji.
+jib5b
+ji7e6
+6jik
+2j3inf
+ji7ro
+ji6sj
+4jiø
+2j1k
+j4kap
+6j1l
+6j1m
+6j1n
+6jn.
+j5ni
+j2o
+1job
+5joc
+jo4da.
+jo6dat
+jo6dis
+jo4fl
+jok9ker
+jokk9o8
+jol5t6
+j3omr
+jon2
+jo5ne
+jon7n
+jons1
+jons5a
+jonse4
+jons3p
+jons5t
+jon6sti
+jon4str
+jonsu4
+4jop
+jo5ra
+jor6dek
+jor6d7erv
+jor6d7is.
+jor4d3o
+jord3r
+jord5s
+jords4l
+jor6du
+jo1re
+jo4rie
+jort6a
+jor5tet
+jo3r4u
+2jos
+jo3se
+jo4ses
+jo5stei
+1jou
+jour5
+j1p
+4j1r
+2j3s2
+j1t
+ju8are
+1jub
+jubi3
+ju9bo
+ju3de
+ju2do
+ju7doe
+jue7ni
+ju4e5re
+jue9s
+jug9le
+5jugo
+4ju2k
+ju3ka
+ju3ke.
+ju3ken
+juk9sar
+ju2l
+ju3la.
+ju5lar
+ju5las
+ju8l9ei
+ju4li.
+ju6lid
+ju4lik
+jul7inn
+jull6
+1jung
+jun7ge
+j6u6ni
+8jup
+jup7s
+ju6p5å6
+ju4ra
+ju7ras
+3juris
+ju9ro
+ju3ru
+5jury
+1jus
+ju5so5
+ju1ta
+jut5o
+ju6va.
+ju6vak
+ju1å
+j5v
+jy1
+jy8de.
+jy2p3
+jæ5le.
+jæ3ra.
+jæ9ran
+jæ9res.
+jæ7te.
+j2ø
+1jø.
+1jøa.
+jø5b4
+1jøe
+2jøef
+4jøeg
+6jøei
+2jøek
+4jøend
+4jøeng
+4jøeta
+jø1f
+jø3gr
+jø9kj
+4jøl
+jø4les
+jøl6ver
+jø5me
+jøn5ne
+jø5pa
+jør4kel
+jør4sp
+jørs5v
+jør4tel
+jø3ru
+jør7ut
+jø1rø
+jø4ses
+jøst2
+jø5ta
+jø6t7av
+jø3te.
+jøte4t
+jøt5eta
+jø1tr
+jøtte4
+4jø1v
+jø4vel
+2jå
+jå5ar.
+jå9ge.
+jå6la.
+jå4le.
+jå7les
+jå5let
+1ka.
+2kaa
+5kaa.
+5ka4an4
+k3aas
+ka3at
+6kabes
+ka7bo
+4ka1br
+4kaby
+ka3da
+6kadale
+ka5del
+ka6del.
+ka4deri
+4kadg
+kadi7e
+2kadr
+5kadu
+4kady
+3kaen
+ka3fe
+kaf5fere
+2kafo
+ka9fr
+2kaft
+kaf5ta
+6kafø
+2kag
+k5a4gi
+kag2r
+2kah
+ka5isk
+ka5ism
+6kajo
+ka4ka.
+ka4ke.
+ka4ked
+ka4kel
+ka4kes
+ka4ki.
+ka4kis
+6k5aksj
+4kakt
+ka3ku
+ka3lam
+ka3lan
+ka6lant
+ka3las
+kald5s
+5kaldt
+kal2e
+3kalen
+ka5lev
+5kalis
+k6alk
+5kalky
+kal7la
+kal6lero
+kall4s
+ka1lo
+kal3p
+kal7s6v
+kal4ves
+1kam
+ka6ma.
+ka8me.
+4kameri
+4kammel
+kam4p3i
+kam4pr
+7kamu
+1kana
+ka8na.
+4kanda
+kan6da.
+5k6ande.
+1kane
+ka5ner
+kan4i
+ka5nin
+2k1anl
+4k1anm
+k3anno
+5kano
+ka4no.
+ka8nom
+4kansa
+6kansi
+3kansl
+1kant
+kan6t7end
+kan6t9r
+2kap.
+5kapad
+ka4pak
+3kapas
+ka5pe
+5kapell
+4kapen
+3kapit
+1kapp
+kap3re
+kap4s3t
+1kar.
+1kara
+4karab
+4karam
+karan5
+ka3rav
+1karb
+4karbei
+4karea
+ka6rek
+ka5rel
+1karf
+5karg
+ka4ri.
+ka6rid
+6k3arki
+6k5arkt
+1karm
+kar3n
+ka3rol
+kar3om
+kar5pes
+karp3s
+3karri
+7karsj
+kars4t
+1kart
+kar5ti
+5karu
+4karå
+1kas
+7kas.
+ka5se4i
+ka3sek
+kas5ev
+kas2ju
+6kasjø
+ka4sk
+kas3ka
+kasko5
+6kasp
+ka4spi
+kass6
+kas6sad
+kas4sak
+4k3assi
+kas4so
+ka4st
+8kas5to
+kas2t3r
+1ka7t6a
+ka3ted
+3kateg
+ka3tet
+ka1to
+ka4t5op
+4ka1t4r
+kat7s
+kat5ta
+kat4tel
+kat6term
+katte5s
+kat4til
+kat4tri
+ka4t5y
+k7au4r
+2kav
+ka7ves
+k9avis
+kav8l9u
+9kay
+6k1b4
+2kc
+k5ce
+kcen4
+2k1d
+k5d6v
+1ke
+2ke1a8
+ke9al
+2keb
+4kebr
+4kebuk
+4kec
+ked4
+ke5da
+4kedag
+4kedal
+5kedan.
+9kedant
+ke5de
+6kedei
+4kedem
+4kedes
+7kedes.
+2kedi
+2ke5dr
+ked8sk
+kedu6
+4kedy
+2kedø
+2keeg
+2keek
+2keel
+ke4ep
+ke7ern
+2keev
+4kef
+k3eff
+k5eft
+2ke1g
+k3egg
+keg8ga
+5kegladh
+ke5h
+3kehet
+4kehj
+2kei
+k3ei2d
+k1eig
+ke5il
+ke1im
+k6e1in
+keis2
+2kej
+2kek
+kek2l
+ke3kn
+k1eks
+k5ek4t
+k6el.
+2kela
+ke3l4ak
+5kelal
+ke6lans
+ke6lat
+kel5eier
+kel5eig
+kel7eik
+kelei8ke.
+6keleis
+kel3e4l
+4k5elem
+4keleng
+4ke5lep
+4keles
+7k6elet
+4kelev
+keli8e8
+keli9en
+3kelig
+4kelign
+4kelinj
+kel5int
+4kelis
+ke4lise
+5kelit
+4keliv
+kel5l
+4kelof
+6kelov.
+4kelove
+kels4
+kels7kar
+kel5sl
+kel5sp
+kel5st
+kel3sv
+kelsva9
+kel2t
+kelt3e
+6kelua
+4kelue
+kel9uka
+kel5uke
+ke4l3ur
+6keluv
+kel5v
+2kely
+2kelæ
+2kelø
+kelø8pa.
+6ke5l4å
+kelå7re
+2kem
+ke4mit
+5kena.
+6kenam
+ken6ap
+ke4nas
+5kenatts
+ken5de
+6k5en6den
+6k5en4der
+4kend5r
+ke3ne
+4keneb
+4kenek
+4kenel
+4kenem
+6kenett
+4kenev
+3kenf
+ke4ni
+5k6enh
+4ke5niv
+ken3k
+ken7n
+kenne4l3
+ke4nom
+ken1s2
+4k5ense
+kens6t
+ken7te
+ken5t6r
+4k3entu
+6ke3ny
+6kenø
+2keo
+ke3on
+4kep
+5kepi.
+9kepia
+7kepie
+6kepl
+kera7l
+4keram
+ke4ran
+ker5ant
+6kerau
+4kered
+4kereg
+kerei4d
+4kereir
+6kereis
+4kerek
+4ke5rem
+kere6n
+6kerene
+ke6r5eng
+4kerenn
+4kerep
+ke4r5ert
+ke3res
+4keress
+4kerest
+4keresu
+4keret
+5keret.
+5kereta
+7kerets
+3keri
+ke4rif
+6kerik.
+4kerike
+6kerikt
+ke4rim
+ke4rine
+6keringi
+6keringj
+ke4rinæ
+ke4ris
+8kerist.
+8kerista
+6keriste
+3kerm
+7kerop
+5keror
+4ke3ros
+kero6se.
+ke3rot
+k4ert
+ker5to
+ker3t4v
+ker3un
+4kerus
+keru6se.
+kerø6re.
+8ker8øya
+6ker6øye
+2kerå
+5kes.
+4kesam
+9kesam.
+7kesdale
+5kese.
+k5esel
+ke5sil
+4kesit
+2kesj
+k9es8ka.
+4k5eske
+kes8ke.
+4keski
+4keskj
+6keskå
+kesle6ge.
+kes5ped
+5kespot
+5ke4spu
+5kest.
+4ke3sta
+5keste.
+4ke5sted
+4ke5stei
+kes6tem
+4ke5s4ten
+ke3sto
+4kestri
+4ke5stru
+4kestu
+4kestø
+ke4s5un
+kes1v
+2kesy
+kes1å
+2keta
+keta6ka
+keta6le.
+5ketals
+k6etar
+ke3te
+5kete.
+4ketek
+7keth
+2keti
+2ketj
+2keto
+2ket2r
+kets2
+ket6t7enh
+ket8tes
+2ketu
+2kety
+kety6e
+4ketæ
+ketøy6s5
+2ketå
+2keu2
+ke5ur
+2kev
+kev2a
+keva8ne.
+5kevas
+3kevel
+kevi6sa.
+k1evj
+kev6ja
+kev4je.
+k3evn
+kev6ne.
+ke3vr
+kevæ8ra
+ke2yt
+6keæ
+2keø
+2keå
+1ké4
+két5
+2k1f
+k5fi
+4k5g2
+k3ge
+k5gh
+kgu4
+4k1h
+kh5ak
+k4har
+khe4o
+khjul8s
+kh6m
+ki3a2r
+k3ideo
+4kidol
+ki3dr
+k4ie2
+kie5re
+ki6el
+ki3er.
+2kif
+ki5g4
+ki6ka.
+kikk8s9
+ki1k8l
+ki3k2r
+kik4s
+ki8la.
+3kilde
+ki4le.
+ki5li
+4kilj
+kil9ja
+kil6le5st
+ki7loa
+ki4log
+ki3los
+ki4lov
+2kilt
+ki7lå
+ki8ma.
+ki4me.
+5kimo5
+ki4mol
+2k1imp
+kin9and
+ki4nark
+ki5nas.
+6kind
+ki5ne
+ki6ne.
+2kinf
+1king
+king5and
+kin3ge
+kin5ing
+2kinn
+kinnsi8da
+kinnsi8de.
+kinn4sp
+ki2no
+2kins
+kinsi6de.
+2kint
+kinti8me.
+ki6nu
+2kinv
+kio4
+4kiol
+7kios
+2kip
+ki5pe
+ki4p5l
+kip5pe
+kip2s3
+1kir
+ki5re
+ki5ri
+4kirs
+ki3se
+ki5sko
+ki3smu
+ki1s2p
+ki5stav
+ki5str
+ki6ten
+ki7ti
+5kito
+ki4ton
+4kiu
+k6iv
+ki4vek
+ki4v5enh
+ki6vi.
+kiv3s
+kj2
+3k8jan
+kjap5pe
+6k7jarn
+kje7fj
+kje7f6r
+4kjegg
+3kjeld
+kjel7leg
+5kjemas
+3kjemp
+6kjenk
+kje9ny
+kje1s
+kje6t5r
+kjet5t
+6kjor
+kju5le.
+kju5len
+kju9r
+3kjærl
+k5jødi
+1kjøp
+3kjøri
+kjø4tr
+2kk
+k1ka
+k2kab
+kk3aft
+k2k1ak
+k2k3al
+k2kam
+k4kanb
+kk5and
+k8kand.
+k6kanden
+k4k5ang
+k4kann
+k4kao
+k4karb
+k6karg
+k4k7art
+kkar6ta.
+k5kast
+k6kasu
+k6katt
+k2k1au
+kk1av
+k6kedo
+k4kedu
+k2kee
+k2keh
+kk1ei
+k5kel.
+kke6lei
+kk5e4lev
+kkel3t4
+kkelu4
+kke4luk
+kkel5un
+kke6nan
+k5ker.
+k4kerei
+k4kerel
+k6kerent
+k4kerig
+k4kerit
+kke5r6und
+k4kesa
+k5kesau
+k4kese
+k4kesi
+kke3s4l
+k4kesp
+k6kestad
+k4kete
+k5ketet
+k4ketø
+k4k9g2
+k1ki
+kk3ind
+kk3inf
+kk9inn
+kk3ins
+kk3int
+k2kir
+k1kja
+kkjek8
+kk5jent
+k4k5jern
+kkje7t
+kk5ju
+kk5k
+kkla4g
+kk3lan
+kk8lar
+kk7lau
+kk1lo
+kk1ly
+kk3læ
+k4kn
+kk5ne
+kk5ny
+kk6s5v
+k1kod
+k1koe
+k4k1of
+kko6lig
+kk5oml
+kk7oms
+kk9omt
+k6koo
+kk1op
+kko7s
+k4kosi
+k6kosk
+k4kost
+kk3ove
+k4kra
+kk5ram
+kk3rap
+kk3rea
+kk5rei
+kk3ren
+kk3res
+kkri6k
+kk3ro
+kkro8e
+kkro4s
+kk3ru
+kk4rus
+kk7rø
+kk7rå
+kk7s
+kks6al
+kk4sar
+kk5sed
+kk3s4ei
+kk4sin
+kk1sk
+kks4kj
+kks4l
+kk3sla
+kk7sle
+kk5sli
+kk3spe
+kk1s2t
+kks5tak
+kks7tep
+kkst4r
+kk8s7va
+kk5s4å7
+kk3t2
+kk5uk
+k4kuni
+k2k1u6t
+kk1v
+k2kvo
+k1ky6
+kkyl4
+kk5yr
+kk7yt
+k2k1ø
+k8køl
+kkø6r
+kkøy6
+kk1å2
+kl4
+6kl.
+4kla.
+4k5lagt
+2klak
+kla9ke.
+kla4mel
+3k2las
+k7lati
+kla4tr
+kleby7t
+3k4ledd
+kle4deb
+kle4des
+2kleg
+klei9e
+k7leik
+k4leiv
+k2lem
+5k6lem.
+7k4leno
+k6lerik
+kles7j
+kle5sno
+kle4sp
+kle5sti
+kles7s8
+2klet
+8klia
+4klie.
+4klig
+1k2lim2
+3k4lini
+k5linj
+1klip
+4klit
+klon7a8l
+1klos
+2klov
+k3lukt
+4klun
+klun5t
+k5lyd
+6k7lyf
+3k4lyng
+klyse7te
+k2læ
+klæ5res
+klø7na
+k6lør
+6kløs
+klø9va
+klø5ve
+6k1lån
+klå5re
+2k3m
+kmann6
+kmål2
+2k1n2
+3k2nap
+kna5t4re
+kne4b3l
+k4nedi
+5k2nee
+kne8se.
+k4nest
+kn5f
+3k4nip
+knippe6
+kni2t3
+3k2niv
+kno7g
+kno6kl
+5knop
+kno9ta
+kno5te
+3k2nu
+4k3num
+3k2ny
+kny4s
+k2nø
+knø9le
+kn3øy
+9koa.
+4ko1ak
+9koane
+ko7ar
+ko2b3
+ko3bo
+4ko3br
+ko5da
+4kodd
+ko4de.
+3kodek
+5koden
+2kodø
+ko3e
+3koef
+4koek
+4koel
+4koes
+4koev
+ko4g5eng
+kog9ger
+kog3l
+ko4gre
+kogst6
+ko4gu
+ko6gå
+2koi
+koi4e5ne
+ko7i6k
+ko1in
+2koj
+ko8ja.
+ko4ka.
+ko4kab
+ko4ke.
+ko6kel
+ko1ki
+kokk6o
+k3okku
+4kok4l
+4koko
+2koku
+kolba5
+2kole
+ko4leg
+ko4lei
+ko6lel
+ko4let
+ko4leu
+3kolle
+ko5lo.
+kol5p
+4koly
+2kolå
+1kom
+ko4ma.
+4komaf
+ko4me.
+6komg
+ko4mi.
+4komil
+4komisb
+ko4mise
+2komr
+4komse
+kom3sl
+kom5so
+kom4st
+4kom5t
+4komu
+4komå
+k6on
+ko4na.
+kon3d
+kon6dr
+kone5l6å
+4koniv
+kon3s2
+kon6s7v
+kon6ton
+ko4nu
+1ko1o
+4koom
+ko5pa
+ko5pers
+4kopet
+ko4pi.
+ko4pip
+ko4p9l
+4kopo
+kop5per
+2kopr
+ko1ra
+ko4ra.
+kor6da.
+kor4d3o
+kord5s4ø
+kor4du
+ko1r6e
+6koref
+4ko7rei9
+ko5rem
+ko7ret
+ko3ri
+ko6rik
+4korm
+ko5rol
+6korpa
+6korpe
+1kor3r
+kor4sal
+kor6s5inn
+kor4s5l
+kor6str
+kor4sv
+kor5tes
+kor6top
+kor4t5r
+kort5s4
+ko5ru
+ko6rume
+1kos
+2kosa
+ko6sa.
+ko4sed
+ko4sek
+5kosele
+ko5sen
+ko4ses
+ko9si
+kosi9d
+ko2sk
+ko1sl
+4kosmu
+2koso
+2ko1s2p
+ko6sta
+kost7as
+kos6t5ers
+kost5j
+4kosø
+kotes7
+ko5t4i
+4kotil
+4kotr
+ko6tre
+kot2s
+kots5tr
+kot4ti
+kott4s
+kotts5t
+4koty
+2kou4
+kout3
+kou7ta
+ko1va
+kover7e
+4kovr
+1kov4s3
+4koø
+4koå
+6k1p
+kr6
+k3rad
+1k4raf
+5krag
+3krakk
+krani6e7n
+6krank
+3krans
+4krap
+kra9se
+7k8ra4sj
+kras5s
+kra4to
+kra4u
+1krav
+4kred.
+3kredi
+4k1reg
+kregi3
+4krei
+krei9e
+krei5s
+6krek
+kre4kli
+2krel
+k5rela
+4k3renn
+4krent
+6kreo
+k5repr
+5kreps
+5kresj
+4k3ress
+kreta9
+6k7retn
+k4rets
+k3rett
+2krib
+4krif
+7k6rig
+krig6s5
+kri9ga
+4krik
+kri5ke
+kri4kj
+krik6ka
+1krim
+kri4me
+3k6rins
+krin6s7t
+kri2p
+1k2ris
+7krisene
+k2rit
+3krite
+6kriv
+k2ro
+kro5b4
+kro5de
+k3rofo
+k4rofor
+krok7k
+k6roni
+k5ronl
+kro4nom
+k4rop
+krop9n
+kropp4
+k4rost
+kro9t8e
+kroten9
+kro3v
+kru3i4
+krum3
+kru5sa
+krutt5i
+kru3tr
+2k5ryg
+kry7pa
+kry5pe
+kry4pi
+3krys
+krø5ke
+6k5rør
+krø3v
+4kråd
+krå8da
+kråe6
+5kråk
+krå5le
+krå9m
+krå7ne
+k1sa
+k3sa.
+k2s3ad
+ks3alt
+ksa5me
+k3sane
+k4sans
+k4s3ant
+k3sar.
+k7sara
+k6s3ark
+k7sas
+k1sc
+k2sed
+k2see
+kse6ge
+k2s1ei
+k5sekt
+k5sela
+kse5lev
+ksen5to
+k4serf
+ks3erk
+k5serol
+k4sesa
+k4ses6k
+k4se3sm
+k5seso
+kses4p
+k5sess
+kses6sel
+kses8serie
+kses4sp
+kses4st
+kse6te.
+ksfø4
+k5sia
+k2sif
+ksi5ko
+ks3ind
+k3sing
+ksi7ni
+ks3inn
+k4s3ins
+k7sio
+ksi3st
+k4siti
+ks9kab
+k6s3kal
+k6skio
+ks1kj
+ks5kl
+ksko7na
+ksko5ne
+ks1kr
+ksk8u
+ks9ku.
+ks7kua
+ks8kut
+ks1k6v
+ks1l
+ksla8ga.
+ks5lo
+k7s6lu
+k8s7lug
+ks5løs
+kslø8va
+kslø8ve.
+k5s4mak
+ks4mel
+ksmå
+k5s4no
+k7s8nø
+k1so
+k6s7oa
+k6sod
+k4sog
+k4somb
+k2s1or
+k2sot
+ks1ov
+k3spal
+ks3pek
+ks5pio
+ks3pir
+kspor6t5r
+6k6s5pors
+ks1pr
+k8sr
+k3spy
+kss6
+ks3sm
+k5stad
+k4stak
+ks3tal
+ks5tant
+k7s8vak
+ks6tav
+kste4da
+ks4teg
+k3stei
+k4stek
+kst3ev
+kstev6ne.
+ks4til
+k4stin
+ks1tj
+ks1tr
+kst6ran
+ks4t5rek
+k6stren
+k6strer
+ks4tri
+ks4tro
+ks9tum
+k5stus
+ks3tyv
+k2stå
+k1su
+k6sun
+ks1v
+k9s8vake
+ksva8ne.
+ks5veg
+k7s6vert
+k5s4vin
+ks5w
+ksy8na
+ksy8s7m
+ks5ær
+ksø4ke.
+k6s3øl
+ks1å
+k3så.
+k4såp
+ksår4
+ksåt4
+6k1t
+k5ta.
+kta7f6
+k4tag
+kta6ka
+k4t3aks
+k4takt
+kta6la.
+k4t3ana
+kta9na.
+kt3anl
+k4t3ann
+k4tanv
+kt3app
+k9tar.
+k4t3arr
+k4t3art
+k6tass
+k5tast
+k6t7atl
+kt5avh
+kt5avk
+k6t3avl
+k3ted
+k4teda
+k6tee
+k4tefø
+kt5e4ge
+k2te5i
+k6teka
+kte5le
+k6t5elsk
+kt5e4lit
+ktem8
+kt7emn
+k4t3enh
+k9ter.
+kterie5n
+kterie7ns
+kter5s6
+k7tes.
+k6tesa
+k6tese
+kt5eske
+ktes6ke.
+kt5esti
+k4t5e4ta
+k4tete
+kt5evn
+ktev6ne.
+k5tib
+k3til
+k4t3ins
+k5tir
+ktis5t
+kt7i6te
+kti6v7end
+k2tja
+kt7ju
+kto9a
+kt5off
+k6togram
+k4toli
+k2tom
+kt5omf
+k2t1op
+k9tor.
+k7tora
+kt5ord.
+k5tore
+ktori9e8
+ktor7s
+kt1ov
+kt3ral
+k2t1re
+kt2ro
+ktro5s
+k2t1ru
+kt4s5amb
+kts5ar
+kt5sek
+kt7sem
+kt4s5er
+kt6sin
+kts5kra
+kt5sku
+kts4kv
+ktsle6ge.
+kt6sok
+kt4spa
+kt5spre
+kt4sta
+kts6ton
+kts5top
+kt4stå
+kt3t8
+ktu9er.
+k4tuk
+kt7und
+k2t1ut
+kt7yrk
+ktyr8ke.
+ktør7
+ktør8e
+k6t5øs
+kt1øv
+k2t3år
+ku2a
+ku9an
+ku4be.
+ku3bj
+2kud
+ku4dal
+ku4er.
+kue4r5a
+ku4et
+6kuf
+ku4f3l
+6kug
+k5u4gr
+ku7is
+kuit6
+6kuldi
+kuld3r
+ku4led
+ku4leg
+ku6lei
+ku4lem
+ku5len
+ku4let
+ku4lev
+ku5li
+ku6li.
+3kull
+1kult
+ku4man
+kumen6tal
+ku6mi
+kum2s
+3kumu
+1kun
+kund5s6l
+2k1ung
+kun4ge.
+k6unn
+ku4o
+1kup
+ku4pe.
+kup4pl
+ku7ra
+ku4rek
+ku8r7o
+ku7r6op
+kuro8pa
+1kurs
+kur6sk
+kur4sp
+kur4s3t
+kurs3v
+kur3t
+ku5ru6
+kuru9ken
+kuru7ker
+1kurv
+kur4v3i
+1kus
+5kus.
+ku7sa.
+kus5a6k
+kus5ar
+5kuse
+ku4s5el
+ku4ska
+ku7s6pe
+kus3t
+6k1ut.
+ku1ta
+4ku5te.
+ku5to
+ku6t7r
+2kuts
+1kuu8
+kuøy6
+kv2
+kva8ke
+k4vali
+k6vard
+kvari6e5n
+5k6vart
+kva9se
+kve3d2
+kve7e
+k6veil
+kvei9se
+1k4vel
+kve5la
+4k3verd
+5kvern
+kverns8
+2kves
+kves5t
+7k6via
+4kvid
+3k4vie
+kvi4ene
+kvi5er
+kvi7la
+3kvinn
+kvi5se
+7kvist
+2kviv
+1kvo
+k1vog
+6kvok
+k4vot
+k2vu
+4k3væ
+k1vå
+k7we
+k5wu
+ky5a
+ky6el
+4kyf
+kyf5le
+2kyg
+ky4leg
+2k3yns
+kyn6skjer
+ky2p1
+ky4p5r
+1kyr
+kyrie5ne
+kyr8ke.
+ky8sa
+4kyse
+ky6se.
+kyse8te.
+ky3skr
+kys6sk
+1ky4st
+kyst3a
+kys4tel
+2kyt
+ky6ta.
+kyte3s
+k1æt3
+1kø.
+kø2ar
+1køe
+kø4en.
+kø2er
+6k1øk
+kø4le
+k1øn
+køn6skjer
+k3ørr
+køs4
+kø5se
+køy7ar.
+k7øyd
+køy4e5ne
+1k6øyr
+4kåke
+kå3le
+kån8da
+kå5ne
+kå4pe.
+kå7pen
+kå9ras
+kå1re
+kå1ri
+kå2t5
+k5åt6t
+1la.
+2laa
+la1b
+4laba
+la6bl
+1labo
+2l3abon
+4laby
+4lad.
+l6ade
+la4dem
+4ladg
+ladi9e8
+2ladm
+2ladr
+lad3s4
+1lae
+2laei
+4laent
+4laep
+2laf
+la3fl
+4lagg
+lagi4
+6lagne
+la2go8
+lag5om
+la2g1r
+lag5san
+lag4sj
+2laha
+2la1in
+la5ka
+la4ke.
+4lakj
+l2akk
+la2kr
+l7aksj
+l5aksl
+4lakt
+lakterie6
+la5kø
+2lal
+l1alk
+la5mab
+4lamb
+la4mes
+la4met
+la3mo
+l8a8mu
+4l3anal
+lan2c
+lan6das
+lan6deb
+land3r
+l6a3ne
+3lane.
+4lanet
+lan6gel
+lan4gem
+lan6germ
+lan4gr
+lang3s4
+lang4s5e
+lan6g5ø6
+4lanl
+4lann
+l3anno
+la4nor
+6l5ansi
+lan5ti
+4lanv
+l3anvi
+2lao
+la6pal
+la7pi
+la8pl
+lap5sa
+lap5sen
+lap5s4i
+1l8ar.
+6l7arab
+2larb
+l8are.
+4l7area
+la9red
+la5rem
+l6aren.
+4larena
+lare6t
+la6r7eta
+5larf
+la7ria
+lariar
+lari6e7n
+4l3arki
+l2arm
+lar3n
+6l7arr
+4lart
+lar6ta.
+lar7vet
+la6sc
+la5se
+lasi9e
+la2sk
+7laskj
+4lasm
+la5smi
+4la4sp
+las6sak
+las6sam
+las6sat
+las6sel
+l6ast
+4lastr
+las3v
+la1ta
+lat5ang
+6latau
+la4teg
+lat6ek
+la4teno
+late5s4
+la5ti
+la6ti.
+4latm
+la1to
+lat7ra.
+lat9ran
+lat5rar
+lat4t5is
+lat4tra
+latt6u
+lau7a
+2laud
+laue6
+4laun
+4laur
+lau7se
+lau6st
+2laut
+2lav
+la4v5al
+la4vel
+l5avh
+lav5inn
+6lavs
+7lavå
+1law
+la6y5
+2l1b2
+lba3de
+lba4k
+lba5ke.
+lba4ne.
+l5be
+lbe9na
+lbe8re.
+l4boa
+l6buh
+lby4e
+l5bå
+2l1c
+l4ce.
+6ld
+l7da.
+ld5aks
+ld5akt
+l9dand
+lda6t5o
+lda6t5y
+l2deb
+l5den
+l2de5o
+l2dep
+l3der
+l7der.
+lder7a
+l4derek
+l6derik
+l6derklæ
+lderle9g
+lder5s6te
+lder6s5ti
+l4desh
+l6destr
+l9dé
+ldis7k
+ldo9a
+l8d5oks
+l2dol
+l4dore
+ld5ovn
+l3drak
+ld3ran
+ld5ras
+l6dre.
+ld7regn
+ld5rer.
+l8dres.
+ld1ri
+l7dry
+ld1rø
+ldse8
+ld4sek
+ld4sel
+ld4ses
+lds1k
+ld4ska
+lds4kj
+ldsla8ga
+lds6leg
+lds4let
+ld4s9m
+ld5s4om
+lds3tr
+ld6tus
+ldø2
+ldø5d
+ldø5l
+ld7øy
+1le
+2lea
+le7ag
+le3ak
+le1al
+lea5la
+3leas
+le5at
+2leb
+le4bem
+le6bosta
+5lebæk
+lec4
+2leda
+5ledar
+led4dø
+4ledeb
+le4dem
+6ledep
+le5der
+le3des
+2ledo
+3ledop
+5ledov
+le4dro
+le5dry
+led1s2
+6ledu
+4ledy
+2ledø
+4le3då
+2lee
+6leei
+6lefa
+lefa6ne.
+4l1eff
+2lefi
+4lefl
+4lefor
+4lefot
+2lefr
+l1eft
+6lefy
+4lefø
+6legap
+5legas
+3lege
+le4ged
+le9gen
+le4gera
+le9geran
+le9geras
+le4gero
+le4geta
+le4gev
+7leggi
+le3gi
+6legif
+4legj
+2le1g2l
+le4gol
+4legre
+leg3s4
+2legu
+2legå
+2leh
+6lehal
+6lehamr
+6lehan
+6lehau
+6lehave
+le3ido
+l6eie.
+lei5ende
+lei4e5ne
+l6ei8et
+leig6d
+lei4ger
+lei7ger.
+lei4get
+leig4h5
+leig6na
+leig8ne
+2lein
+le3int
+lei6r7u
+leis7t
+l6eit
+2lej
+2leka
+le4ka.
+6lekan
+lek6e
+le3ki
+2lekj
+lekk7s
+2lek2l
+2lekn
+lek4na
+2leko
+2lekr
+4l3ekso
+4leksp
+lekt5ord
+lekt4s5t
+2leku
+2lekv
+4lekø
+4lekå
+2le3la
+8l9eld
+2lele
+l3elem
+4l5elg
+5lelig
+2lelo
+3lels
+4l3elsk
+le1lu
+4leluk
+l5elv
+2lely
+4lelæ
+2lelø
+lelø6pa
+4lema
+le3me
+le8me.
+4lemet
+8lemetrisk
+8l9emn
+lem8na
+2lemo
+lem9ped
+lem5pes
+3lemr
+lem4si
+lem4s5ø
+2lemt
+lem5ti
+2lemu
+6lemy
+4lemø
+2lemå
+le4na.
+le4nal
+4lenav
+lend8a
+len9dan
+6lenden
+l6endre
+4lendri
+4lened
+4lenem
+4lenev
+l4engd
+len4g5r
+leng9u
+le5ni
+4leniv
+lensa4
+len4s5ak
+4lensem
+len5ses
+len4sta
+len4tam
+len4tr
+len8t9ra
+2lenø
+4lenå
+2leo
+5leol
+2lep
+le5pa
+le4pel
+le8p9enden
+le2p3j
+le8pla.
+le4ple
+4lepo
+4leraba
+4leram
+le2r3amb
+ler5d
+l8ere
+le9re.
+6lerea
+4leref
+4lereg
+4le9r8ei
+4lerek
+le5res
+4lereso
+4leresu
+4leret
+4lerev
+9leri.
+7lerie
+le6riei
+le7rina
+le4riv
+4l5ernæ
+le5ro.
+4lerom
+6lerope
+le3ros
+4le3rot
+7lers.
+lers4p
+ler7te
+le1ru
+4lerus
+leru8se.
+2lery
+5leryr
+2lerø
+2lerå
+5l6es.
+le4sab
+4lesam
+7lesar
+4lesau
+2lesc
+le5sed
+le4seg
+4lesek
+le5sen
+le3ser
+4leset
+4lesho
+le6si.
+4lesig
+le7sing
+les5inn
+4lesit
+4lesju
+le7skap
+le4s3kj
+6leskol
+le6sk9u8t
+4lesla
+2lesp
+6lespal
+les3s6
+lesse6ne.
+4lesta
+9lesta.
+7lestal
+le5sted
+le5steg
+le5stel
+le4stim
+le3sto
+4lestrø
+4lestyr
+4lestø
+4lestå
+4lesug
+les1v
+le5s6vi
+4le5sy
+4lesø
+5lesøy
+3let.
+le4tab
+6letak
+leta8ka
+leta8le.
+l5e4tas
+5lete.
+6letea
+4leteg
+4letek
+le5ten
+6letenk
+6le7tep
+le5ter.
+4letes
+2le3ti
+l5e4tik
+2letj
+2leto
+2let2r
+le7tre
+le5t4ri
+3lets
+let6sj
+lets8k
+let6tea
+let6tr
+lett3s4
+2letu
+le4tv
+2lety
+lety8e
+4letø
+8letå
+4leul
+2leun
+l1eur
+2leut
+le4ute
+2lev.
+le6vad
+le6valu
+le4ved
+4leveg
+4levei
+4levek
+6levern
+4le4vev
+levi6d
+lev5n
+2levo
+lev1r
+4levs
+4levæ
+lex1
+4leø
+2leå
+5lée
+1lér
+7lét.
+7lè
+5lê
+4l1f
+l4fa.
+lf5ant
+l5far
+l5fe
+lf3f
+l5fig
+l5f6in
+lf5ja
+l7fje
+l6f3nul
+l4fom
+l4fut
+2lg
+l6gaf
+lga8le.
+l4g5alt
+l4g3ana
+lga5t
+lga4ve.
+l2ged
+l4gela
+l4gele
+l2gem
+lge3na
+lge4r5an
+lge4rap
+lge5ri
+lger5un
+l4gery
+l4gesl
+l6ge7sp
+lg5g
+lgie8n
+lg1lo
+lg5ly
+lg5n
+lg3ob
+lgo2d
+lg1ok
+lg1om
+lg5ov
+lg3ref
+lgr9øy
+lg3s2e
+lg2sk
+lg5s4kre
+lgsle9g
+lg5s4tr
+lgu4l
+lg3un
+lg3ur
+l1gæ
+lg5ø
+l6gå.
+lg5år.
+lgå8va
+lgå8ve.
+8l1h
+lha8ka.
+lhav6s5
+l5hj
+1li
+li1a
+li4ala
+li2am
+li5ans
+li4as
+liba5
+libe5ro
+libi5
+libie6
+liby5e
+li4dak
+li4ded
+li4do.
+2l1idr
+lid3t
+li4ene
+li3er.
+li5ers.
+lie5s
+3lif
+4lifat
+lif5f
+3lig
+li4ga.
+li4g3an
+li4gar
+lig9art
+li8gas.
+li4g5enh
+li4get
+5lign
+li4g3re
+lig3se
+lig3s4i
+lig3sl
+lig3s4p
+lig5s4ti
+lig5str
+li2gu
+4lih
+li5kan
+li9kar
+li7kas
+li5kee
+li3ken
+li5keså
+li9ki
+likk3o
+li1k2l
+9likn
+liks4t
+li5ku
+6lila
+8l5ild
+li3le
+lil5lebe
+lil5let
+li4mar
+li4mas
+li6mate
+l6ime
+li4me.
+4limh
+limp3r
+lim7r
+lim9u
+li4na.
+4lina6l
+lin6c
+linch5
+5l4indr
+4lindu
+lind3s4
+l5indus
+li4ne.
+li3ne6a
+li6nem
+2l1inf
+lin4g3j
+ling5l
+ling7sen.
+5lingv
+4l5inju
+lin5kes
+lin5kle
+lin4kv
+2l1inn
+lin5net
+3linni
+6linns
+6l5inntr
+li4nor
+l4inse
+5linsk
+4l3inst
+4lint
+2linv
+li6n5ø6
+lio4no
+lion5sp
+lion5sv
+li5o6s
+2lip
+lipes4
+lipp4s3
+li9rar
+li4rek
+4lisak
+li5set
+lis4kl
+2liso
+4lisp
+lis6sp
+lis7tan
+lis6terk
+lis5ti
+4lis6til
+list3o
+li6s8tr
+list7rø
+lis4t3u4
+li4st5y
+listyr8ke.
+li4tee
+li4tek
+li4ti3a
+li4tid
+li4tig
+li4til
+li4tim
+liti5st
+li4tiv
+lit5j
+6litn
+li5to
+li2t1r
+lit5rer
+lit6tele
+lit6terk
+lit6term
+litt5s6
+li5ty
+7liu
+li6va.
+li4v3ak
+liv5eg
+livi5e
+liv2s3
+2lj
+l1jan
+l1jar
+l4jarb
+ljar5s6
+ljas4
+l4jed
+l6jee
+l2jei
+l2jek
+lje3l
+lj9elv
+l1jen
+l3jer.
+l4je1s
+l5jes.
+ljes4t
+l5jet.
+l4jete
+l5jete.
+l6je5t6r
+l2jev
+l5jé
+l1ji
+3l2jod
+ljo8e
+l4jom
+lj5ori
+3ljos
+lj5un
+l7jur
+lj7ut
+ljø3
+l5jøs.
+6l1k
+l3ka
+l5ka6l
+lkali9e8
+lk4an
+l6k5b
+lk4e
+l3ke.
+l2ked
+l5kedal
+l3kede
+lkeei4
+l6keh
+l5keleg
+l3ken
+l7ker.
+l4kera
+l4keri
+l4k5ers
+l4ke3ru
+l5kestad
+l5ket.
+l5kets
+lk2l
+lk4li
+l5k4lu
+l6k5nin
+l6ko.
+lko9ma
+lko9sa
+l2kot
+lkras5
+lk5ri6k
+lk4ser
+l4k3s2h
+lk1s4t
+lku4le.
+lku8t
+lk9ute
+l6kveg
+lkå1
+2l1l
+l5la6a
+ll6a5f
+l2lak
+ll1al
+l4lami
+l5lane
+ll3anl
+l4l5ano
+llans4
+ll5ansk
+ll7apa
+llap3s
+ll4as
+ll5asp
+ll5aur
+llau6re
+ll7avl
+ll5avr
+ll3d2
+lle5a
+l5leak
+lle8da.
+lle4d3r
+l3lee
+l2lef
+lle5gev
+lle5gr
+l5leha
+l5leho
+l5lehå
+l4l5eig
+l4leki
+l6l5ekst
+l4leli
+l2lem
+llen6da.
+ll5enden
+l4lendr
+l6lendt
+l4lenk
+l5l8ens
+l4lentu
+l4lenu
+ll5eple
+l6l5e6rik
+l4lerob
+ll6es
+lle4so
+lles5pr
+lle5stø
+l5let.
+l4leta
+l5lets
+llet6tele
+l8letæ
+l2leu
+ll5even
+lle7vev
+l5levå
+lle6y
+l2lé.
+ll7g2
+lli1e
+lli5e4n
+l9lig
+l2lim
+l4l3ind
+l4lins
+ll3int
+l9lint.
+l3lip
+l4lir
+lli6sen
+l4liv
+ll1j
+ll7k2
+ll5m
+llmue9ne
+llmu7ens
+llmu9er
+l5lo.
+llob5
+l2lod
+l4l3off
+llo5id
+ll5oks
+llo2m1
+llom5s6
+ll3op
+ll5opp
+l2l1or
+l4loso
+l6lote
+ll5p
+llra7n
+ll4sak
+llsa6me.
+ll4sem
+lls5end
+llsk4
+lls6kar
+lls5kv
+ll5skå
+lls5lag
+ll3smy
+lls4no
+lls4te
+lls6tig
+lls7øk
+ll3t4
+llto4e
+l8lua
+l4lu4e
+l4luf
+ll7ug
+llu4k
+l8l7uka
+l4l3uke
+l6luks
+l5lum
+l4l1un
+llun6ge.
+llu4pi
+l2l1ur
+l3lus
+l2l1ut
+ll1v4
+llva8n
+lly4se.
+l4løk
+ll5øks
+llø6pa.
+l4løve
+ll7øy.
+ll5øya
+ll3øye
+lløy6er
+ll5øy6n
+ll1å8r
+ll3å2s
+2l1m
+l5ma.
+lm3anm
+l4map
+l4marki
+lm3av
+lm7b
+l4m3els
+l4melu
+lm5e4po
+l4m5erf
+lme7ri
+lme7sti
+lme5t4r
+l5mil
+lmi8le.
+lm3ind
+l5ming
+lmini6
+lmin7ne
+lm3ins
+lm5int
+l7mis
+lm5l
+lm5m
+lm1op
+lm1s
+lms6j
+lm5s2p
+lm3t
+lmu4le.
+lm3ut
+lmyr8ke.
+l4mø.
+l6m5øs
+lm5øy6
+lmøya9
+lmå6la.
+lm5å4r
+l4m5ås
+2l1n
+l2nab
+l3ne
+lni4u
+l7ny
+lo1al
+7loane
+lo1a4r
+5loar.
+2lob
+lob5by.
+lob9byan
+lob9byar.
+lob5bye
+lo2bl
+lo2d3a
+lo3de
+lo4d3ri
+lod3s4m
+lod7ste
+lod7s6v
+lo6d5u
+6loeng
+6lofj
+3loft
+1log
+lo5ge
+lo6g5e8v
+lo4gir
+log2o
+lo3gop
+log8res
+lo6g5ro
+log5sa
+4loh
+lo5id.
+lo3ide
+lo1in
+3loja
+lo1ki
+lok4ko
+lok6kul
+2lo1k4l
+4lokon
+2lok7s4
+lok8se.
+lo1k4v
+lole6ge.
+2lolj
+lolo9
+l5omdr
+lo4m5in
+lom4mel
+lomst9r
+lo4nal
+6lond
+lo5ne
+lon4g3r
+lo4nit
+lon7skj
+2lop
+lo3pa
+lo4pea
+lop5pa
+5l4opt
+lo1ra
+2lord
+lor6da.
+lo1re
+4l1org
+lor4g5l
+lorie6
+lo1ro
+lo7rød
+lo7sa
+lo6sek
+lo4ses
+lo5sev
+los4kle
+lo1sl
+lo7sp
+2lost
+lo9tes
+lo8ti.
+lo3to
+4lottet
+lo1un
+1lov
+lov7ald
+lo3van
+lo9vand
+lo7vane
+lo3var
+lo3ve7d6
+l6over.
+love5re
+l5overn
+6l5overs
+6l5overt
+7lovo
+lov3sa
+2l1p
+l7pa
+lpa5re
+lpas5
+l4pedo
+l4pee
+l2pei
+l2pel
+l5peleg
+l3peli
+l4pelin
+l3pesm
+l4peti
+l2peu
+lp2h
+lp2i
+lpin3e
+lpi5ne.
+lp2l
+lpo6et
+l4put
+l5q
+2l5r4
+lra8da
+lradi4u
+lra6ne.
+lre4de
+lre4i
+lre8ka
+lre8ke.
+lre8va
+lri8ma
+lri4ve.
+lro8de.
+lro6pa.
+lro8sa.
+lro4se.
+lrot5s
+lrø6re.
+lrø5v
+lrå8da.
+lrå4de.
+8l1s
+l2sad
+lsag6
+ls5ald
+ls4am
+l7sana
+lsan6ke.
+l4s5ano
+l4s3ans
+ls5ark
+l4sat.
+l4scu
+l3se.
+l2sed
+l2see
+ls3eid
+ls5eig
+l4s3ele
+l4s3elv
+l2sem
+ls5emb
+l4seno
+l7ser.
+lse2s
+lses5ku
+lses3l
+lses5pa
+lses5s
+lse8s5tr
+lse4te.
+l2seu
+l6sev
+l4sf
+l2sh
+l5sig
+l5sik
+l6s5ill
+l4sim
+l5simu
+l4s3inn
+ls5jakk
+l5sjef
+ls3jeg
+ls3jen
+8lsk.
+ls5kabi
+l4s5kan
+ls5kari
+lsk5art
+l6s5ke
+lskif5
+l2s3kild
+lskinn6
+lskinns5
+ls1kjed
+ls3kjo
+l6skl
+lsk3læ
+ls3koa
+ls5kor
+ls3kov
+l4skra
+ls8ks
+lsk5un
+ls7kva
+ls3kvi
+l4skå
+ls3kåp
+lskå6pa
+l2sl
+lsla4ga
+l7slagn
+lsle6ge.
+ls5lo
+l5s4luk
+l6s5løs
+l2sm
+l5smør
+lsmå6la
+l2snu
+lsok3
+ls5ond
+lson6de.
+l2s1or
+ls7o6se
+l5sot
+ls1ov
+l2spa
+l9speg
+l5spei
+l9spel
+l5spi
+l4spr
+l5spred
+ls3pri
+l8s7s
+l4s3tak
+l4s3tal
+l6stank
+l6ste.
+ls4ted
+l4steg
+l3ste4i
+ls4tel
+ls5terr
+ls6ti.
+ls4tie
+ls6ton
+ls5tren
+l9stri
+l2su
+l5sub
+l3suk
+ls1un
+l2s1v
+ls7vea
+ls5vee
+lsve8en.
+l6s5vek
+lsve7re
+l4svik
+ls6vind
+l4sør
+l2s1øy
+l2s1å
+2l1t
+l4taa
+l4taf
+lt3akt
+l3tal
+lta4la.
+l4t3alb
+lta6lev
+lt3anl
+lta6no
+lt3art
+lta4st
+lta8tes
+lta4t3o
+ltat3r
+lt3avk
+l5tavæ
+lt9b
+l3tede
+l4teka
+lte6ma.
+lt4en.
+l4t5enh
+lt3epi
+l4teras
+l4t5erst
+ltesa8me.
+ltid6s
+l4tiet
+l2tif
+lti6g5
+l2tik
+l4tina
+lt3ind
+lt9inn
+lt3ins
+l4tivi
+l2t1ja
+ltle8ge.
+lt9n
+lto9ar
+l3tog
+lto4s
+lt3ost
+lt2r
+l3tra
+lt3reg
+lt3rei
+l6treko
+l6t5rel
+l6t7rem
+l4trens
+lt3res
+l5t4rest
+l5trev
+l4t5rit
+lt3rol
+lt3rom
+ltro8pa
+l5tros
+l4t5rød
+l5trå
+lt1s2
+ltsa8me.
+lt5s4i
+lt7s6t
+lt2s3v
+lts4vi
+lt7t8
+lt3und
+ltu4ra
+ltur5e6
+ltu5r6en
+ltu5r6er
+ltur5s6
+ltur5å6
+l2tut
+l5tv.
+ltva8la
+l3tvs
+l4t5w
+l3ty
+lty8d
+lt7øl
+lt3øv
+lua8r
+2lub
+lub6band
+lu6bri
+lu5c
+lu7ere
+1luf
+3lugar
+lu7go
+lui6
+luid6er
+1luj
+4luk.
+lu4ka.
+4luket
+luk6keri
+lu3kr
+5l6ukt
+4luly
+l4um
+lu6mel
+lu2mo
+lum6sk
+lu4mø
+lun5d4r
+lu4ne.
+lun4gel
+l7u2ni
+lun5ne
+3lunsj
+4lunt
+lu6o
+lup4s
+lu2p3u
+lur2e
+6lurei
+lu5ren
+lu5ri
+6l5urn
+lur8na
+lur8ne.
+lur8ta
+1lus.
+lusa5
+lu7sak
+lu6sel
+lush7e
+lu2s5k
+lus4o5
+lus4sid
+lus4s3t
+lus1t
+lus2t3r
+luta3
+lu3ta.
+lu7tet
+6lutf
+4lutg
+luth
+3lu5t6he
+lutla9
+lut6m
+lu1to
+lu4t5r
+2luts
+lut4tal
+lut4tap
+lut4t5at
+6lutv
+1luv
+lu4va
+lu4ve.
+lu9ven
+lu9ver
+8lv
+l1va
+l4va.
+lva6k
+l4vakti
+lva6la
+l4va4m
+l4vana
+lv8and
+l7var.
+lv7asa
+l4v5ass
+lve3d4a
+lve5i6s
+l4vela
+l4vele
+lv4en
+lve9ne
+l9ver.
+lve9rau
+l4veru
+l4vesk
+lve5sl
+l7v6et.
+lve5str
+l9vé
+l1vi
+lvi8ene
+lvi9er
+lvi6ka.
+lv9im
+lvin5g6r
+lv3iro
+lv1j
+lvly8se.
+l6v3n
+lv1of
+lv9op
+lvo8re.
+lvor4s
+lv5o4v
+l6v5p
+lvra8r
+lv9ri
+lv1s2
+lv5se
+lv7s6k
+lvs6l
+lv9ta
+l5vøe
+lv1å
+l3våg
+lvå4p4
+lvå6r
+l5w
+ly1a
+2lyb
+ly4d7r
+ly5e
+lyes3
+ly4gel
+ly5g6l
+ly8is
+2lykj
+lyk6keri
+ly5ku
+ly7kv
+6lykø
+ly5l
+ly5me
+2lymp
+ly2n3a
+ly4ne.
+ly4n5il
+lyn3s2
+2lyo
+ly5ok
+ly3pe
+ly1r8
+ly8ra.
+ly6re.
+6l7yrk
+ly4sa.
+ly4s5a4k
+lyse6te.
+lysk4
+lys3kj
+lys9kl
+ly2s1l
+4lysp
+lyst9ra
+6lysy
+ly8ta.
+4lytek
+ly4teri
+lyte5s
+l5y4tin
+ly1tr
+ly3ve
+l3z
+l6z5b
+1læ1
+6læd
+læ6ra.
+læ5rar
+lær4arm
+læ4re.
+lære3i
+læ3rer
+læ4re3s
+læ5res.
+lær6sv
+læ6ta
+1lø
+lø3de.
+lø4del
+lø5dem
+lø4er
+løk5kj
+4l1økn
+2løko
+lø4k5r
+l5ø6l
+lø9me
+lø2na
+løns5t
+løp6s5
+5l4ørd
+lør5k6
+lør5n
+4l5ørr
+5løs.
+lø2sa
+lø5san
+lø5ser
+løs3k
+løs3s
+2løt
+lø9ta.
+lø3te.
+lø4teg
+løva9r
+6l7øv8d
+lø4ve.
+lø3ver
+lø5ves
+6løy.
+4løya
+2løyd
+4løye
+løy8ed
+løy5el
+2løyf
+løy4g
+løyg5e
+4løym
+6l5øys.
+løy5ter
+lå6gal
+lå6gre
+lågs4
+lå4gå
+2låi
+lå1k4
+lå6ke.
+lå9me
+lå2m5o
+lå2n
+6l5ånd
+lån2s1
+2låp
+l1åp9n
+2lår
+lå8ra.
+lå9rar
+lå5ras
+lå3rin
+lå1ru
+lå6sa.
+lå1sk
+lå6sko
+lå4s5l
+lå4ste
+lås7ten
+lås5ter
+lå5su
+lå3te.
+lå4teg
+lå4tek
+lå8ti.
+4lått
+lå4ve.
+1ma
+2maa
+3maa.
+ma3ar
+2mab
+ma5br
+ma3che
+mada5me
+ma4del
+ma3dra
+m6ad9s
+4maef
+4maek
+7maene
+2ma1f
+3mafia
+3mafr
+6mafrå
+ma8ga.
+ma4ged
+ma4gel
+ma4ges
+3magn
+ma2gr
+2mahe
+ma4is
+ma4ja
+2mak.
+ma5kab
+4makad
+ma4kes
+mak7ke
+4makl
+mak6le
+ma4kot
+mak2r
+ma3kre
+mak5ron
+mak4tal
+4m3akti
+mak4to
+makts4t
+ma1ku
+2ma1kv
+ma1la
+ma7leb
+ma6leng
+ma4let
+mali9e8n
+mal5l
+ma4lov
+mals4
+mal4t5ek
+mal3u
+mal3å
+4mamer
+ma3mo
+m4an.
+ma3nak
+m3anal
+6manam
+4manav
+man8ce
+man4dom
+man4don
+ma3ne
+m4anf
+man5g4a
+m6ange
+4mangr
+mania8
+2manl
+m3anle
+4manm
+5m4ann
+man4nem
+manns5l
+ma4no
+2mao
+4mapa
+2mapr
+4marb
+mar5d6
+7mare.
+6mareg
+ma3rei
+ma7rel
+5ma9ren
+ma5res
+3mar4i
+mari8e9ne
+ma3rin
+m4arka
+4markit
+mar4kv
+mar5m
+marmo9ra.
+mar7n
+ma1ro
+ma4ro6p
+mar3s4h
+mar7sl
+mar5te
+ma4ry.
+ma6rå
+4masel
+ma5set
+mash3
+ma4sia
+ma4sik
+ma4sis
+6masju
+mas4ki
+4masko
+4masp
+mas4see
+mas6set
+massø9
+7mast.
+ma5stem
+4masto
+4ma5str
+2masy
+m6at
+ma1ta
+ma5tad
+ma3te
+ma4te.
+ma6ted
+ma4tel
+7maten
+7mater.
+6matera
+7matet
+6m7atfe
+4matil
+7matil.
+ma1to
+ma1tr
+4matra
+ma4t5ras
+ma4t3re
+ma6t7rom
+mat3s2
+mats8l
+mat5ta
+m8at7t8r
+2mau
+mau4k
+mau7l
+ma1un
+5maur
+mau7su
+2mav
+ma6ve.
+ma5ven
+m7avh
+m5avk
+ma4ze
+ma3zo
+2m1b
+m4bao
+mbar3d
+m2bea
+m4beb
+mbe9da
+m4bedø
+m2bef
+m2bek
+m4beli
+m2bem
+m4bena
+m4beo
+m4bereg
+m4bero
+mbet2
+mbi6ar
+m2bib
+m3b4l
+mboe2
+mbo4end
+mbo5er.
+mbo5ere
+mbo5id
+mbo5n
+m4bop
+mbo5re
+mbo9t
+mbu7ar.
+mbu4e
+mbue7re
+mbus5
+m1c
+m6co
+2m1d2
+m3de
+md7om
+1me
+2mea2
+me5al
+mea5m
+2meb
+2mec
+meck4
+4medat
+2medb
+5mede.
+me4ded
+med5ei
+me7den
+me7det
+4medf
+me3di
+4medik
+4medir
+2medm
+me6dok
+4medom
+2medr
+me6dret
+med1s4
+4medu
+me6dun
+me5d4us
+med5v
+7medve
+2medy
+4medå
+me7e
+2meef
+6meek
+2meel
+4mees
+4meev
+2mef
+m3eff
+6me2ga
+me7gal
+2megr
+2megu
+4meh
+mei2e
+meie5n
+m1eig
+me3ild
+me3ind
+mei5ni
+me7isk
+4meiso
+2mej
+4meki
+4mekj
+2mekk
+me2k1l
+me3kn
+4meko
+2me5k8r
+4meks
+mek5t
+6mekte
+m2el
+4mela
+me5l4aks
+5melane
+5melar
+me3le
+me4le.
+4meled
+4melei
+4melek
+6m5e6lem
+me4l5eng
+4melik
+4melis
+4melit
+4meliv
+mel5le
+mello6m3
+4melok
+4melov
+mel4si
+mel2s3j
+melsk4
+mel5s4t
+mel7tr
+me1lu
+mel5v
+melvi6
+2mely
+2melæ
+4melø
+4me5l4å5
+2mem
+me6mo.
+4m5enga
+men5k
+menle6ge.
+m6enn
+men4ny
+me4nom
+me4nor
+men4si
+men3sm
+men5spl
+men5te
+men6tek
+men4tom
+men5tr
+me4nyt
+2me3o
+me6os
+2mep
+5mer.
+me6rab
+4merad
+me4ra5l
+me4r5ant
+mer5di
+4mered
+4mereg
+4merei
+4merek
+4merel
+me6rense
+me3res
+4meress
+mere6t
+m4eri
+4me5rib
+meri5ke
+5merin
+merle7g
+mer9n
+mer5os
+5mers
+mer5sk
+me3run
+mer5und
+4merus
+2mery
+me2r3ø
+2merå
+me4råk
+5mes.
+2me5sa
+4me5s4h
+2mesj
+2me1sk
+mes5ke
+2me1sl
+mes6le
+4me3so
+2mesp
+5mess
+7mest.
+4mesta
+5meste.
+mes4ti
+6me7sto
+mest3r
+me5stro
+6mestrø
+4mestrå
+4mestu
+4mesu
+2mesy
+2mesø
+4metab
+4me9tap
+me4tar
+me3te
+4meteg
+4metei
+4metek
+4metel
+4metep
+4metil
+2metj
+4meton
+me4t3ra
+me4tre
+met5ren
+met7rer
+met5res
+met5rik
+me4tru
+4metræ
+2metu
+4metv
+2mety
+2metø
+4metå
+2meu4
+7m4eu3s
+2mev
+meva8n
+2meø
+2meå
+2mé
+2m1f
+mfa9ra
+mfar8ta
+mfav5
+m2fek
+m6f3ess
+m4fi.
+m4fibr
+m2fit
+m5fru5s6
+m5funn8s5
+mfu6se.
+2m5g6
+m4ga.
+m4gi.
+mgå8va
+mgå8ve.
+2m1h
+mhea4
+m4hu.
+1mi
+mi1a
+5mi6al
+mia2n
+9miane
+7miar.
+2miav
+mi6c
+miche6l
+8m9idé
+2midi
+mid5j
+mid3s4
+mid4t
+4mi3ele
+mi3er.
+mie9s8
+2mi5f
+5migraf
+2mih
+2mii
+4mij
+mik6h
+4mikj
+2miko
+mik5ro.
+mik5ron
+mik5sa
+6miku
+mi4la.
+mile6t
+mil7eti
+mi4lev
+mi7li
+4milin
+mil6s5v
+4milæ
+2mim
+mi8ma.
+5mimo
+m7imp
+mi4na.
+mi5nar
+mi4ne.
+mi4n5ers
+4m3innh
+4m3inns
+6minnt
+min2s
+min3sp
+mins4t
+mi3nu
+m4inv
+mi4n5y
+mi7ov
+2mip
+4misa
+mi4san
+mi3se
+4misek
+4misel
+9misé
+misha9ge
+4mi7si
+mi2sk
+mis4ko
+mi3s4la
+mis9le
+7mism
+mis4s5k
+mis4s7p
+mista9k
+5mis7te
+mis4tra
+4mistu
+2misy
+4miså
+6mita
+mi3te
+4mitj
+4mito
+2mit6r
+mitt3s
+mi5ur
+2miv
+mi5vå
+m6ja.
+m6jan
+m5jar.
+m7jarn
+2mje
+m7je.
+m1ji
+m8jingan
+m8jingar
+8mjo
+mju7ke
+1mjø
+mjøs5t
+2m3k2
+m4ko.
+mkro5
+mku6le.
+mkå8pa
+4m3l
+m7la
+mla6ga
+m2lef
+mlei5er.
+m2lek
+m2lel
+m2lem
+m4lera
+mle6se.
+m4lesk
+m6le5s8v
+m4leta
+mle4ve.
+ml6i
+ml5ja
+mly6se.
+mlø6pe.
+mløy3
+2m1m4
+m6mai
+mma5kl
+mmal5
+mma8le.
+m4mam
+mmando5
+mman6dol
+m5mar
+mmar7in
+mmar7o
+mmatik7ka
+m4medø
+m2meg
+m2mei
+m2me3k2
+m4melu
+m6meni
+m4menu
+mmer5t
+mme4run
+m2me1s
+mmest6
+m5met.
+m4meta
+m4meti
+m4metra
+mme5t6re
+mme3u
+m3mé
+m4mia
+m7mian
+m2mib
+m4mid
+mmie6n
+m2mik
+mmi5sk
+mmi5so
+mmi3st
+mm5n
+m3mu
+mmø2
+mmå8la.
+2m1n
+m2nee
+mn7eid
+m2ne9l
+mne4ra
+m5nese
+m4nesk
+m4nesta
+mnes9tie
+m9net.
+m4nete
+m2nev
+m6nip
+mn7sk
+1mo
+3moa
+mo2ar
+4moba
+5mode
+mo3dem
+mo5di
+mo6di.
+2mody
+3moe
+mo4en.
+m1off
+mofo6bi.
+mo6gi
+5mogl
+mo5go
+m5ogs
+4moh
+2moka
+mo8ka.
+mo8ke
+mo1ki
+mo6la.
+mo3le
+mo4le.
+mo7le6s
+4molt
+mo3ly
+m5om.
+4momf
+2momr
+mom4s5ø
+mo5ne
+mo4nisa
+mo2no
+mon1s
+mon4ste
+mon5t6
+2mop
+5mo1ra
+mo4ra.
+mo4rar
+mo7rar.
+mor5d6e
+4mordl
+mor6d5r
+mo3re
+mores7
+m2ori
+mo4ri.
+mo6rid
+4m3o4rie
+mor4kl
+morla8ga
+mo5rok
+mo4rom
+mor4si
+mor4skj
+mor7sky
+mor4sp
+mo1rø
+mo9sen
+mo2s7k
+mos4o
+6mostab
+4motap
+mo4te.
+mo6te6g6e
+mo4tei
+mote7kl
+mo5ter.
+mo4tes
+mo5to
+4motr
+mot7re
+mot1s2
+6motsagd
+motsva5
+mot7t
+mour5
+3mo3va
+mo5w
+8m1p
+m4pana
+m4p5anta
+m4pee
+m4pelot
+m6pena
+m6pep
+mpera8te.
+mpe5res
+m6peress
+m4p5erfa
+mperi6e7n
+mpes2
+mpes6te
+mpe4sti
+m5pett
+m2pe5u
+mp3id
+m4pinje
+m8pla.
+m3p4lan
+mp5le.
+m6p5lin
+m6p5n
+m6p5ob
+mpoe4
+m4poeta
+m4pog
+m6pok
+m2pop
+mp3opp
+mp1p8
+mp3rad
+mp5ret
+mp3rop
+mpro8pa
+mp1s
+mp3sek
+mps4p
+mp5s6t
+mpun6ge.
+m9pur
+mp5ut.
+mp5ys
+mpø5
+m9på.
+m3q
+2m1r6
+mro8sa.
+mro6se.
+mru7te.
+mrø9de
+m9rår
+6ms
+m5sa.
+ms1ak
+ms5ant
+m1sc
+mse5lu
+m9s6ei
+m4sem
+m4s3eng
+ms5e4pl
+m4serv
+mse5s
+m5s6etn
+mse6t7jare
+mse8t9jas
+msi6e
+ms4ing
+ms3inn
+m4s5ja
+ms5kab
+mska9k
+ms6kin
+msk5ing
+ms3kor
+msk8u
+ms3lan
+ms6lega
+ms9lua
+ms3lue
+ms4ly
+m2sm
+m1s2n
+ms9ne
+ms5no
+ms3næ
+m1so
+m4soms
+ms3ori
+ms1ov
+ms3s2
+m4s3tal
+m8s7te.
+ms7tea
+ms2ti
+ms5tilb
+ms3tim
+m1sto
+m4s5top
+m5s6topp
+mst5ord
+m8strand
+m5strane
+mst5red
+ms5tref
+mst5ren
+ms5trik
+ms4tru
+ms3unn
+msu9ta
+msu7ten
+ms1v
+msva9ra
+msva5re
+m3s4vet
+ms3ynd
+msø4ke.
+m4s5ør
+ms1øy
+ms1å
+2m1t
+m3ta
+mt4b
+mtbe6
+m2tee
+m2teg
+mteks7
+m6te7kv
+m4tel
+m6testu
+mti9a
+m9tida
+mti5e
+m6tien.
+m6tif
+m2tik
+m6tini
+m4tiø
+mtiør6
+m5to
+mt4r
+mt6ve
+mt4vin
+mtå5
+1mu
+mu6a
+m1u2b
+mu2e
+mu3el
+mue7r
+mues1
+2mug
+mug5l
+mu4he
+mu2k
+8m9uka
+4m1uke
+mu5la
+mu4leg
+mule6s
+mull2
+mull6s7
+mul6tiv
+4muly
+7mum
+mu3mi
+mum2s
+mun2c
+munes6
+4mung
+mun6ge.
+6m5univ
+mun3k
+munn5s6
+mun4t3r
+mu6ra.
+mu4re.
+2murn
+murs4
+6murt
+m2us
+mu4se.
+mu4ses4
+mu4sé
+mu2s3k
+muske6l5a
+must4
+mus5tan
+2mut
+3mu1ta
+mu8ta.
+mutsa8la
+mut7t6r
+2m1v
+mvak5t
+mva6la
+mvari6
+mveg5s4
+mvi7e6
+mvi6se.
+2mw
+1my
+my5a
+myg4ga
+my3ke
+myk4kes
+myk3l
+my8kr
+my2ra
+my9ran
+my9rar
+my1re
+my4re.
+4myrk
+m5yrke
+my4r5u
+mys3
+my6sa
+my4se.
+my4so
+my4te.
+mytt6s5
+5mæ
+mæ6la.
+1mø
+møb3l
+mø7des
+mø6e
+mø9ens
+møkk6a
+m3økn
+2møko
+mø6na
+mø4ne.
+møne9s
+mø8nest
+6m5ønsk
+mø2o
+3mørke
+mør4k5r
+mør5sm
+mør3ø
+mø5se
+7møt
+mø9tas
+mø4tere
+møt9t
+2møy
+møy9ar
+m5øys.
+1må
+2må.
+må5a
+6måenh
+må7g2
+må1k
+må4ka.
+må4ke.
+må4kes
+m6ål
+må5lar
+må4le.
+må6led
+måle3i
+målø6pe.
+må4ne5s6
+må9nese
+må8pa.
+må4pe.
+må7pl
+2mår
+måra6r
+må1re
+må1ro
+må1ru
+må1s4
+må6tak
+6måtf
+må5tr
+må3tø
+1na
+na6ans
+2nabo
+7na7bortr
+na6bot
+4naby
+na4ded
+na8dem
+nadi4
+n3adop
+nad2s1
+4nadv
+8naf
+n1aff
+nafo7r
+na3fr
+naf7t
+na8ga.
+na3ge
+4nagen
+nag3s4
+nagså5
+na7gø
+6nah
+4nair
+2nak
+n6akk
+nak7ka
+nak6ko
+5nakl
+na1kr
+n1aks
+nak8sa
+nak8se.
+8n1akt
+nak6ta.
+na7kv
+na9lag
+na6lare
+6nalarv
+na7leg
+na4l3ei
+na4lek
+nal5epo
+na4les
+na4l5ett
+na4lev
+nal5g
+nal6ge.
+na4lil
+nal6lag
+nal4løp
+nal3op
+nal5s2
+nal3t
+na3lur
+2naly
+na2l5ø
+4nalå
+na3lå5r
+5nam.
+na7mere
+na5mes
+na5mo9
+5nams
+2namø
+9nan.
+4nana
+n3anal
+n6ane
+nanfø8
+4n5angr
+nan5k
+nan6ke.
+4n3anl
+6n5anle
+nan4ne
+na4n5o
+n4n5ans
+nan4sin
+nan4skj
+nan4s5t
+4nany
+na7o
+na5pe
+nape4s
+nap3s4
+n4ar.
+na4rap
+2narb
+nar5dr
+4narea
+nar7ei
+4na5rek
+nari4e5n
+7nariksk
+4narkiv
+6n5armé
+6n5arme
+nar8ma.
+nar5s
+nar8ste
+2nart
+nar6ta.
+nar5ti
+nar7v
+nar5ø
+nasa3r
+na4sas
+nas7h
+8nasik
+na4ski
+na2s5t4
+nasta5
+8nasu
+na1ta
+nate8k
+na7tem
+4natl
+4natom
+natori5e6
+nat8ra
+nat3sp
+nat6tak
+nat6tea
+naty5
+2nauk
+naus6p
+na6va.
+4navd
+6navf
+2navg
+2n3avh
+na1vi
+4n5avk
+4navl
+nav4les
+3navn
+6navo
+4navr
+n1avs
+4navt
+4n1b2
+n5ba2
+nba3d
+nba9ser
+nben4s
+nbo5et
+n6buf
+n6butr
+nbyr5
+nbø9le
+nbø6n
+n1c
+n5ca
+ncel5
+n3che
+nch3ei
+n6cot
+n2cy1
+6nd
+n7daa.
+n6dabi
+n4dad
+nda5f
+n7dag4
+ndags5
+n4daks
+n3dal
+n4dalf
+n4d5all
+ndals3
+n4dark
+n6d3art
+n8dask
+nda5tal
+nd5d4
+n3de.
+nde5a
+n2deb
+n2ded
+n5defi
+nd1ei
+nd4ein
+nd6ek
+n4dekl
+n4deko
+n5d4e5l
+nde4le.
+n4delik
+ndel4sk
+ndel4st
+n2dem
+n5dem.
+nde5mo
+n5den.
+n6dener
+n5dens
+n2de5o2
+n2dep
+n4derab
+n4deras
+n4derei
+n4derim
+nd6erk
+nderla6ga
+n4desi
+n4dest
+n4desu
+n1dé
+ndi4en
+n4d3int
+ndi6sk
+nditori5
+nditorie6
+ndit4t5a
+nd3jer
+nd1ju
+nd5k
+nd4lem
+nd4lese
+nd4lest
+nd4lev
+ndo9a
+n6dob
+n6d5okk
+nd4om4s3
+n2doo
+nd1op
+n2dor
+nd3org
+nd5orm
+n6dote
+nd5rae
+n4d3ram
+nd3ran
+nd6rek
+ndre4ra
+nd5resen
+nd5rett
+nd1ri
+n1dro
+nd4sag
+nds3ak
+nd4s5amb
+nds5elv
+nds5ende
+nd4ser
+nd4sje
+nd4skj
+nds7kul
+ndsla6ga
+nds6lett
+nd7spu
+nd3s4te
+nds9teg
+nds5trek
+nd5stry
+ndta6ka.
+n6duf
+ndu3is
+n4dun
+nd3ung
+ndun6ge.
+n2dup
+ndu6si
+ndus7k
+nd7v
+n2dyg
+ndy1k
+n2dys
+ndy5sp
+ndø5l
+n2d1øy
+1ne
+2nea
+5neae
+nea4g
+ne7a6le
+ne5alp
+ne5als
+nea9m
+ne9a8r9an
+nea9ren
+ne1as
+6ne7av
+2neb
+3nebb
+4nebe
+ne4ble
+neck5
+2neda
+3nedal
+ned3d
+6n5eddik
+4nedeb
+4nedeg
+4nedel
+5nedg
+ne4di.
+nedi4s
+2nedo
+ned5over7
+ned1r
+ne6dre
+5neds
+ned3st
+6nedu
+4nedø
+ne5dår
+4neeg
+4neei
+2neek
+5ne4e4r5
+2nef
+n1eff
+n5eft
+2neg
+5negati
+ne3gla
+neg5lesp
+neg8r
+6negru
+6neh
+2nei
+n2eid
+nei8dan
+n5eig
+n2e1in
+n3eini
+5neir
+2nej
+2nek
+ne4ka.
+6nek2l
+ne3kn
+nek2r
+nek5rin
+n7ekser
+nek5t
+4nela
+nel3de
+4neled
+6nelegg
+7neleggj
+4nelei
+nelei5er
+4n3elem
+6nelê
+4nelid
+4neliga
+4nelis
+4nelit
+4neliv
+nel4lov
+nel7s
+2ne1lu
+4nely
+2nelæ
+2nelø
+nelø8pa
+4nelås
+2nema
+4n3emb
+4nemel
+4nemer
+6nemes
+2nemi
+nemie8
+6nemj
+nem6k
+5nemn
+nem5ne.
+nem7nel
+2nemo
+2nemu
+2nemy
+2nemø
+2nemå
+3nen
+4nena
+nen5at.
+6n5en6den
+6nendr
+nene4
+4nened
+4nenem
+ne3nes
+4nenesl
+4nenet
+nen5eta
+4nenev
+nen4ga.
+4n3enhe
+6nenhet
+4neni
+nen5se
+nent5ei
+6n3en5tr
+4nenu
+4neny
+4nenæ
+2neo
+5neo.
+ne5o4r
+7neos
+2nep
+ne5pe
+3n4er.
+4nerad
+6nerap
+3nerb
+4nerea
+4nered
+nere6de.
+4neref
+4nereg
+4nerek
+4nerent
+4nerep
+ne5res
+4neress
+4neresu
+4neret
+4nerev
+4nerfar
+4ner2g
+ner3ga
+ner3ge
+4ne3rib
+4nerik
+4nerit
+ne4ri9v
+5nerl
+nerla8ga
+n3erob
+6neroc
+ne7rof
+ne5rok
+4nerom
+ne5rot
+ne1r4ov
+n6ers.
+ner7se
+ner5s4i
+ners4p
+ners8ten
+4ne3rul
+ner5un
+2nery
+3neryr
+4nerør
+2nerå
+2nesa
+ne4sa.
+5nesar
+4nesc
+4nese
+6nesek
+nes6er
+5nesets
+nes5eva
+ne3si
+nes5ind
+4nesit
+2ne5sj
+ne5skam
+4ne5skar
+nesk4e
+4neski
+5neskins
+4neskj
+4ne5sko
+4neskr
+6nesku
+2nesl
+ne3sli
+ne7slø
+nes6mi
+6nesn
+ne7snø
+2neso
+3nesot
+2nesp
+nes6sam
+nes4stu
+5nest.
+4nestas
+nes9tas.
+nes9te.
+4nesto
+nes5tor
+4ne3str
+4nestu
+4nestø
+2nesu
+2ne1sv
+nes8va
+6nesy
+4nesæ
+5nesøy
+4ne5så
+neså5re
+3net.
+2neta
+4netaks
+neta6le.
+ne3te
+5nete.
+4ne3ti
+6netid
+2netj
+2ne5to
+6netom
+2net4r
+3nets
+net5s4p
+nett3a4
+net6tel
+2netu
+ne4tv
+4nety
+4netå
+netå5ker
+2neu
+neu1r
+ne5us
+ne6va.
+ne4ve.
+6ne8vent
+5nevik
+nevi8sa
+3nevn
+nev1r
+ne4y5t
+2neø
+4neå
+1né
+4néb
+4néd
+2néf
+6néh
+2nél
+4ném
+6néo
+2nép
+5nér
+4név
+4néå
+4n1f
+nfall4
+nfalls5
+nfan5t
+n6foa
+n4fob
+n4fole
+n4fom
+n4fora
+nfor9en.
+nfos4
+nfø5des
+nføy8ed
+6ng
+n8g8ad
+n4gaf
+n6gag
+ng1ak
+ng5and.
+n8gan8da
+ng3ank
+n4g5arm
+n4gart
+ng5art.
+n5garta
+ngar5u
+n2gat
+ng5ato
+nga4ve.
+ng7avi
+ngd4
+ng4ded
+ng4del
+ng4dep
+ng3dr
+n4geda
+n4gela
+n3gen
+n4gena
+n7gene
+n4g3eng
+n6geno
+n4genu
+n3ger
+n4geret
+nge5run
+n2ges
+nge3sl
+n4geta
+n2ge7v
+ngfø4
+ng5g2
+ng5id
+ngjen5g
+ng1l
+n5glem
+ng4lu
+ng7n
+ngo4d
+ng5odd
+n7goe
+n3g4ok
+n8g7o8m
+ng9ome
+ng5ond
+ng7o6pe
+n2gor
+ng5ord
+ng3ork
+ngos6p
+n2got
+ng3ra.
+n5grad.
+ng5rand
+ng7rea
+ng3reg
+ng3ren
+n4grend
+n4grer
+ng5rest
+ng3ret
+ng3rev
+ng3rid
+ng3rin
+ng7ro.
+ng9roa
+ng7roe
+n5g6ros5
+ng3råd
+ng8sa.
+ngs5elv
+ng4sem
+ng4ses
+ng2sj
+ng2sk
+ng6skj
+ngs7leg
+ng5sløy
+ngsmå6la.
+ngs3ne
+ngs7tep
+ngst5rid
+ngstyr8ke.
+ngs9tør
+ng3und
+ngu5ru.
+ngvi4s
+ng5ye
+n1gø
+n2g1øy
+ngå8va
+ngå8ve.
+4n1h2
+nhat5
+nhet4s
+1ni
+ni1ak
+ni1a2n
+nian5dep
+ni2bl
+4niby
+4nibå
+4nicr
+n8ida
+ni4del
+ni7dele
+n5idé
+ni6do
+nid7r
+nids4
+nid5st
+4nieg
+ni1el
+7ni3e2n
+ni3er.
+nie5ri
+ni7ers
+ni5ert
+4n3i4fr
+ni5gla
+ni9glo
+2nih
+8nij
+ni3ke
+2nikj
+4ni5ko
+2nikr
+4nikv
+ni5l4i
+5nilu
+4nimar
+4nimas
+4nimo
+2nimp
+ni6n7al
+2n1ind
+4ninf
+ning3o
+nin5gr
+ning6s5
+ningse4
+nings5te
+2n1inj
+n1inn
+4ninnb
+4ninnh
+4ninns
+4ninnt
+2n1ins
+2n1int
+2ninv
+5nio.
+nion2
+nions3
+4niop
+7nios
+4ni5ov
+ni4pet
+ni9pet.
+ni9pets
+ni2pl
+nip3li
+nip5si
+4nir
+nir7kel
+4nisem
+ni5set
+nis5im
+4ni3skj
+nis4k3o
+ni9sol
+niso5ne
+niss4
+4nistas
+6nistat
+nis5tik
+4nistil
+ni3str
+4nisty
+4nistø
+6nisu
+6nisy
+n4it
+ni3ted
+6nitj
+ni4tog
+ni4tos
+nitt4r
+nitt4s3
+nitt6sk
+4nitu
+ni3ty
+nit5z
+nitær6e
+2niub
+ni4umf
+2niut
+4niva
+2nive
+niv5ei8
+4n5ivo
+niv3s2
+6niå
+4n1j
+n6jah
+njav9
+n2jed
+n5jede.
+n4jee
+n6jei
+n2je1s
+n3jes.
+n2jet
+n3jet.
+njet6r
+n5jett
+2nk
+n1ka
+n2kak
+nk3aks
+nkal5l
+n2kau
+n4kedo
+n4keer
+n4keh
+nk5eie
+nkel5s
+nkelt3
+n4k5enh
+n8keno
+n4k5erfa
+nker4st
+n4ke1s4
+n6ketø
+n1ki
+n4kid
+n4kie
+nk3ier
+nk5ind
+nk7inf
+nk3inn
+nk7int
+n5kj
+nk1k4
+n1kla
+n5k6lang
+n7k4lis
+nk3lok
+n1klu
+nk3ly
+n3klæ
+nk1lå
+n1knu
+n1kny
+n3ko
+n4kof
+nkofi8
+nk5oks
+nko5le
+nkol4la
+n6kot
+n6kov
+n1kr
+n3krav
+nk1s2
+nk4tak
+nk6tal
+nk4tin
+nkt3sk
+n1ku
+nku4le.
+nkuri9
+nkurie8
+n4ku6t
+nk9ute
+n1kv
+nk3ve
+n7kvit
+n6kvo
+n9ky
+n1kø
+n1kå
+nkå6pa
+4n1l
+nland9a
+nland6se
+n5le
+nlei7er.
+nle8ma.
+nli4en.
+n3lj
+nlu4e
+nly6de.
+nly6di
+nly4se.
+nlø6pa.
+n7lå
+4n3m
+nma4le.
+nmik3
+nmi8l
+nmini6
+nmo6se.
+nmusik7k
+nmå6la.
+4nn
+n2nad
+nn5ad.
+nn9aft
+nn5air
+n6n1ak
+n4nala
+nn5alg
+n4name
+nn4an
+nn5ana
+n9nane
+nna8ni
+n4n5ank
+n5nanl
+n6n7anta
+n9nar.
+n4nari
+n6nasi
+n4nask
+n2nat
+n2nav
+nn3avl
+nnbo9e
+nnbu9e
+nn5d2
+nndø4
+nndør3
+n5nea.
+n5neap
+n5nebar
+nnebe8r
+n5nebu
+n4nedi
+n2nee
+n6nef
+nn1ei
+n3neke
+n4nelo
+n3n4en
+nne6nat
+nne4n3o
+n9ner.
+n4nerel
+n4nero
+n7nes.
+n6nesj
+n5nes4la
+n4ne3st
+n5n6et.
+n4nesø
+n4nete
+n2nev
+n2ney
+nn3g2
+nnhø8re.
+n4nid
+nn3ide
+nni3e
+n2nim
+nn7inf
+n5nis
+nni4sj
+nni4s3t6
+nn7k2
+nnle6ge.
+nnlø6pe.
+n4no.
+nn5of
+nno2m1
+nn6oms
+nnomsy8na
+nn1op
+n2n1o4r
+nn7ord
+n4n3o4ve
+nn9r
+nnsa9ka
+nn4s5amb
+nns5and
+nns3ar
+nn5seg
+nnsei8g
+nn4s3em
+nn6s5enk
+nn4s3es
+nnse6te.
+nnsi7da
+nn4s3in
+nn4s5i6s
+nn6s5jak
+nns5kan
+nn5s4kli
+nns5op
+nns3or
+nnst6
+nn6s5tab
+nns5tal
+nns5telt
+nns4ten
+nns5tep
+nns7tin
+nns5top
+nn6s5tre
+nns5tro
+nns3tv
+nn4s5ul
+nns3va
+nn6s5vo
+nnsy8na
+nn2sø
+nns3øk
+nn3så5r
+nn7t4
+nnte6se.
+nnto9ga
+nnu1i
+nn6ung
+nn1ut
+nnvi4s
+nn1yn
+nny4t
+nn7øk
+nn1øv
+nn1å
+1no
+noa4g
+no1ak
+5noane
+no7ar.
+2nob
+nobe4l
+no4bl
+nob5le
+no3b4r
+no5co
+nodi4e5n
+3noe
+4noef
+4noei
+4noek
+4noent
+2nof
+n1off
+3no3ft
+n6ogra
+no5id
+no3in
+2nok
+no1ki
+nok8r
+nok6se.
+n3oksi
+no9le
+2nolj
+no6mid
+no6mik
+no4mil
+4nomj
+nom9m
+nom7s2
+5nomy
+non1s4
+non5t
+2noo
+2nop
+n1opp
+no1r4a
+no5ran
+no5rar
+no5ras
+nor4da
+nor6d5end
+4nordn
+nor4d5r
+nord3s4
+nor4dø
+no9ree
+no3rek
+no3ren
+no7ret
+nor5g
+3norge
+norges5
+n3o4rie
+7norit
+4nork
+nor6kla
+nor6kle
+n4orm
+normlø7se
+nor2s
+nors6ka.
+no3ræ
+no4sel
+no4ses
+nose8te.
+4nosp
+no3stj
+nostra4
+2nosy
+no4ta.
+no4te.
+note5i
+5notek
+no4tel
+no4tes
+not3s
+4noty
+4nou
+no1v
+no3ve
+4no5vi
+4n5ovn
+7nó
+6n3p2
+n5pe
+npo8ta
+n4påk
+n3q
+2n1r2
+n9ra
+nra8na
+nra8sa
+n3re
+n4reb
+nrei7e
+n6renem
+n6reo
+n6ri.
+nro6de.
+nro6t
+nry6
+nrå8da
+6ns
+n1sa.
+ns1a4d
+n5sag
+n5sakk
+n5sa4kr
+ns3aks
+nsak6se.
+6n5akti
+ns5akv
+n3sala
+ns3ald
+n6s5alp
+n5sane
+n4sanf
+n5s6ann
+n5sanse
+ns5ansi
+ns5ant
+n5saren.
+ns6arm
+n6sart
+n4sati
+n1sch
+n3sco
+nse9a8l
+n2sed
+ns5edd
+ns8ede
+n2see
+nse5ei
+nse6er
+n6sef
+n2seg
+ns5ege
+nsei6d
+ns5eie.
+ns9eig
+n4seks
+n4s3elv
+n2sem
+n5sen.
+n5sene.
+n4sener
+n9senes
+n4senet
+n4seni
+n7sens
+n3ser.
+n4sera
+nseri7e6
+n4sesa
+n4sesi
+n4se3sk
+nse3sl
+n4ses4p
+n4sest
+n6sesu
+n4se3s4v
+n4sete
+n9sets
+n2seu
+ns5fr
+n2sh
+ns3ha
+ns7he
+ns5hi
+nsi5de.
+nsi4ent
+nsi6er.
+nsin5d
+n3s4ing
+ns3inn
+n4sinte
+nsi8ra
+nsis7k
+ns3jak
+n4sjav
+n5sjef
+n6s5jord
+n4skan
+n6s5kauk
+ns7kele
+ns4kete
+n9skim
+ns5kir
+n5skis
+n6skja
+n6skjele
+ns5kjen
+n3skjæ
+nskog6s
+ns5kor
+ns3kro
+nsku9et
+n4skug
+ns5kuli
+n5skum
+ns1kv
+n5s6ky.
+n5s4kye
+n5skyss
+n5slang
+n7slarar
+ns5las
+nsle6ge.
+n3s4lekt
+ns6leri
+ns5lid
+n5slyn
+n1slå
+ns3mi
+n4smal
+n4s5mo
+n4smur
+n4smus
+nsmå6la.
+n5s4nar
+ns5nes
+nso4d
+ns1of
+n3s2ok
+n1sol
+n4sond
+nson6de.
+nso5ris
+ns1ov
+n3sovn
+nspa9ra
+ns5pels
+n5spet
+ns1pr
+n6spros
+n7spur
+ns7s6
+nsse4e
+nsså5
+ns4ta.
+n4stak
+n4stag
+ns5take
+n3stam
+n4stank
+nst5art
+nstar8ta.
+ns4tau
+n3s6ted
+n3s4tei
+ns4tel
+nste6ma.
+ns5tenk
+n6step
+n5s4tik
+ns5tild
+ns7tilf
+n4s5tils
+ns4tin
+ns4t3i4s
+ns1tj
+n5sto.
+n3stru
+ns7trøy
+n3stue
+n6stuk
+ns5tur
+nst3ut
+n1su
+ns1uk
+n4sung
+ns5vang
+nsva9ra
+n2s3ve
+ns9veg
+ns5verd
+ns5vern
+ns1vi
+n5s4vill
+ns4vind
+ns9vis
+n4svu
+n3s4væ
+nsy4d
+ns1yt
+n5søn
+n4s1øv
+ns5øya
+n5såpe
+nså7pen
+ns7ås.
+6n1t
+n5tab
+n4tagr
+nta4lan
+ntall4
+nta5na.
+n4t5and
+nt3anl
+nt4anv
+nt3app
+n7tart
+n6t5arvi
+nt6as
+nta5sia
+nt4at
+nt3avi
+nt5avr
+nt7avs
+n2tea
+n5teat
+n2tee
+n4tef
+n4tege
+n4tegi
+n7tegn
+n2tei
+nt5eini
+nte5ins
+n5teis
+n4teka
+n7tekn
+n4tekse
+n9teleg
+n5telig
+n5tell
+n4tels
+n9telt
+nte4ma.
+nt3emb
+nte4mis
+n5ten.
+n4te7na
+n5tene.
+n4t3enh
+n5tens
+n2teo
+n5teori
+n5tepp
+nt4er
+n5ter.
+n7terek
+n6terest
+nte6risk
+nteriø7ra.
+n5ters
+n7tes.
+n4tesel
+n4teta
+n4tete
+nt4e3u
+nt5e4va
+nt9g
+nti1a
+n4tiat
+n4tid
+n5tiem
+n4tig
+n4tikap
+n5tiki
+n4tikl
+nti5kli
+n5tile
+nti3lo
+n9time.
+n7times
+n4t3ind
+nti6net
+n6tini
+n2tio
+n2tip
+n4tisa
+n4ti5sti
+nt5l
+nt5n
+nto3a
+n2tob
+nt5omf
+nt5omn
+nt3oms
+n2t1op
+n5tor.
+n5to5re
+n6torg
+n2tou
+nt1ov
+nt6ran
+n4trep
+n5trer
+nt5resi
+ntres9kjare
+n4t3rin
+ntrol6li
+n6trom
+n6trul
+ntrøy4
+nt5skj
+nt5s6la
+nts2t
+nt3t4
+n6t7ub
+ntu9e
+ntu4l
+n2t1u2n
+n4t5uro
+n2t1ut
+ntva8la
+nty6e
+ntyr3s
+nt7år.
+1nu
+4nu.
+nu3an
+nu4av
+nuft4
+nufts5
+2nug
+nug6la
+4nu4h
+nuit8e
+nuk5
+nul9t8
+4nulu
+6nuly
+nu9me
+2n1un
+nun4ge.
+nuo2
+6nup
+nu3pl
+nu4re
+nu5sa.
+nu5sen
+nu7ser
+nus4k5l
+nus7l
+nuss4
+nu6st
+nus3ta
+2nut
+nu7ta
+nu3te.
+nute6r
+nut5eri
+n7utl
+nu6ume
+6n1v
+nva6la
+nvand5
+nverle9
+nves1
+n5vi
+nvi4et
+nvi4ka.
+nvi5ke
+n3vu
+nvæ8ra
+n3w
+1ny
+ny5ar.
+ny9ast
+2nyd
+ny4de.
+4nyef
+4nyg
+ny5ge
+5n6yhe
+ny3ke
+ny3k4le
+4nyko
+ny1lo
+2nyn
+nyn8da.
+nyn4de.
+4nyo
+4nyp
+ny8pa
+ny6ra.
+ny4re.
+ny7rev
+ny4ru
+ny1s
+ny5se
+ny9s6k
+nyst4
+nystu4
+ny3te
+ny3tr
+2nyv
+ny8va.
+ny5vak
+ny8ve.
+4nyø
+n1z
+1næ1
+næ8ra.
+nær9and
+næ8rast.
+1nø
+nø2da
+4nødd
+nødde5
+nød3sk
+nød5sto
+nø9dun
+2nøe
+4nøf
+nø1fl
+nø1fr
+nø7gr
+4nøko
+4nøks
+nø4le.
+nø9mo
+nø5mu
+nø3p4
+nø7ra
+nø6red
+nø1ry
+nø3se
+nø1sk
+nøs4l
+nø7te
+nø7tr
+n6øtt
+nøtt6r
+nøv4d
+nø3ver
+nøy1
+2n1øy.
+nøy8a9n
+n7øyh
+4nøys
+n3øys.
+nå6as
+1nåd
+nå5ded
+nå8en
+nå6et
+nå8j
+n1å2k4
+1nål
+nå2la
+nå5lev
+nå8ma
+nån6de.
+n1å4p
+nåp8na
+n1å6r
+nå2s
+nå5sa
+nåse4
+2oa
+oa5c
+o1af
+oa4k
+oak6kana
+oak4ku
+o1all
+o3alt
+o1a2m
+o3a6n
+o9and
+o1a6p
+oar6d7e
+oar4d5in
+oa4r5e4g
+oa4r5enh
+oa6ré
+oa4r5i
+oar5m
+oa9té
+o1au
+o1a4v
+2o3ba
+obakk8s
+obb4l
+ob4bo
+ob4b5r
+ob4b3u
+ob4e
+o4bea
+ober5et
+ober4s
+obers5ta
+obers5te
+o3bes
+2o3bi
+obi5e6
+1ob1j
+o1b2l
+ob5la.
+ob3le.
+ob3len
+o2b5li
+3oblig
+ob4lo
+o1b4o
+obo9a
+2obr
+ob5rar
+ob1re
+ob1ri
+3obser
+ob5st
+2obu
+2oby
+obyl5
+o5bø
+o3bå
+4oc
+ock5ers
+o5cy
+2o1d
+o6dab
+oda4f
+od7att
+odd5ei
+od4del
+od4dest
+od9do
+od4e
+o2deb
+o6d5ei
+o4deko
+o5deku
+o2dep
+oderle7
+o2des
+o5det.
+o5dets
+odie4n
+o4d3igl
+o4dj
+odko5
+od3oml
+od3ov
+o2d5re
+o4d3rø
+od3sk
+ods4ka
+od3s4po
+od5s4tol
+ods8t
+odu7s
+o4dy.
+o4dyb
+od5øk
+o5døs
+od5øy
+o2d1å6
+6o1e
+oe6f
+o4ein
+oek6s
+oe2l
+oe4mu
+oe2n
+oen5a
+o7ene
+oeng5d
+oen2g7r
+oeng3s
+oeng3u
+o5ens4
+o7ens.
+oen5t
+o3e4re
+o6erer
+oer8ma
+o3ersk
+o2es
+oe6sip
+oe6sit
+oes8ka
+oes8ke.
+o4etan
+oet2h
+oe5ti
+oev6ne.
+2ofa
+o2fa.
+ofag6a
+o4fara
+ofa4se
+o2fav
+o2feb
+o4fei
+o4fera
+o4fe3st
+o1fé
+off9and
+of4fek
+of5fes
+of6fia
+off5id
+of6fr
+of2fu
+of6fy
+2ofi
+o4fip
+o1fl
+of5le
+2ofo
+o6fra.
+of9ras
+of1re
+6o5fri
+of8sa
+of8se.
+6oft
+of4tel
+oft2s3
+2ofy
+2og
+o2ga.
+og7ank
+o4gare
+o2g7av
+o2ge.
+o4ged
+og1ei
+oge7na.
+o3get
+og4gera
+og4g5j
+ogg3s4
+og6g7u
+ogi3a4
+ogie2
+o4giev
+o2gif
+o6gig
+o4giko
+o2gil
+o2gim
+o2gin
+o3ging
+o2gi1o
+o6gista
+o6gi7str
+o2giv
+og5jer
+og7la
+ogly7
+og4ned
+5o4g5ni
+og6nel
+o5g6nos
+o2go.
+og6ra
+og4re.
+o4g3reg
+o4g3rei
+og4rer
+og7rett
+o4g3ri
+og3ryd
+o4g5rø
+og5rå
+ogs4a
+ogs6an
+og3s2e
+og1sk
+ogs4kj
+og5sl
+ogs4le
+og1s4p
+ogs5pa
+og5ste
+og3sti
+og4s5tj
+ogs4to
+ogs4tr
+ogs5t6ra
+og5stre
+og5sy
+5og5s6y4v3
+ogt6r
+5o4g5åt
+og1un
+og5ø
+og7ås
+2o1h6
+ohe5te
+ohm9a
+o4ho.
+ohø4
+oia4
+o1i2d9i
+o1idr
+oid5t
+oie4n
+oi5er
+oi6es
+oi5k
+oi4la
+o1im
+o3in.
+o1ing
+oi2n1o4
+o4insp
+oi6r
+o1is
+o2is.
+o6isa
+o2ise
+o4isi
+4o1j
+o8je.
+o4jo.
+o1ka
+ok7aft
+ok1ak
+oka4n5i6
+ok2ar
+ok5ark
+o3kas
+ok1ef
+ok5els5
+ok5elv
+o5k6en
+o4kesk
+o6kev
+o1kj
+ok4kand
+4okke
+ok6kera
+ok4ke5s
+ok3kje
+ok3ko.
+ok5kol
+ok4kun
+4okl
+ok8la.
+okla5m
+ok8le.
+o1klu
+ok7lut
+oklå5
+2okn
+okna8sa
+o3ko
+o8ko.
+ok8ol
+o4k3oms
+ok3omt
+oko5pe
+ok5opp
+ok3orm
+oko4s
+oko9se
+o6kov
+o1kr
+ok5reo
+o6kret
+o4k5ru
+oks4al
+oks4e
+ok4sek
+okse5kr
+ok4sem
+ok7sen
+ok6serin
+ok4ses
+okse9te
+ok5s4i
+oksi7da
+okst2
+oks6ti
+ok6s5vi
+oks6tr
+ok5ta
+3oktan
+ok3ti
+ok5to
+okto4r5i
+okt6r
+o1ku
+ok5u4k
+oku8le.
+oku6t
+ok7ute
+o5kva
+o3kvi
+ok5øy
+o3kå
+8ol.
+4o1la
+ola6ded
+ola8ga
+ol5anl
+ol3ant
+o9lar.
+o6larbe
+ola5t
+olber4
+olbo7e
+olbo7ge.
+ol4bol
+olbu7
+2old
+ol9dan
+ol5de.
+ol4dem
+ol4dest
+ol5det
+ol3do
+oldo7ve7
+ol5drev
+ol3dri
+old3s4kr
+2ole
+o5leaks
+o6leb
+o2led
+o2lef
+ol5eig
+ole5in
+o2lek
+o7leki
+o2lel
+olele6ge.
+o2lem
+o5lem.
+o5lems
+o7lene.
+o9lenes
+o4lenet
+o4leni
+o4leno
+o6lered
+o4leru
+o2les
+ole5sta
+ole5str
+o9let.
+o2lev
+o1lé
+ol4f5i
+ol4fj
+ol3g4e
+ol1g4l
+2oli
+o4liba
+oli9e6n
+oli7ert
+oli5ne
+3o6lj
+olke3s4
+ol4kese
+ol4kesk
+ol4kest
+ol2k3l
+ol9ko
+ol6ku
+ol5kv
+ol5la.
+oll3ak
+ol4lam
+ol7le.
+ol4led
+ol4lel
+ol7len
+ol4les
+ol6linj
+ol4log
+ol4lom
+ol5los
+ol4lov
+oll5over
+olls4t
+oll5sv
+ol2lu
+ol4løp
+ol6løs
+ol6løy
+ol2lå
+olme5s
+ol4mest
+ol4må
+ol9n
+2o1lo
+o4lo.
+o5loan
+o3loe
+o4lof
+olo3i
+ol5oks
+ol3oms
+ol3op
+o6l7os.
+o6l7o6se
+o6l5osf
+olo5ve
+ol4ped
+ol7so
+ols8t
+ol5sva
+ols5vik
+ol3ted
+ol5tep
+ol2tr
+ol6t7ra
+olt5re.
+olt5rer
+olt5ret
+o1lu
+olu5l
+o4l3ung
+olun8ge.
+o4l5ur
+ol5va
+ol1vo
+o1ly
+oly7d
+ol5ør
+o1lå
+2om.
+2oma
+om3ald
+o2ma2m
+om5ang
+oma4nif
+omann4
+oman5t
+om3ars
+omar7ø8
+om4as
+om1av
+omb6
+om4bet
+om4bis
+om3bl
+5ombod
+1ombu
+2ome
+o2m1ek
+o5meka
+o7menes
+omer6s
+o6mese
+o5met
+ome4tak
+ome7tar
+om1eu
+3omfan
+3omgre
+8omh
+o2mia
+o2mib
+omi3e4
+o4miek
+o2mig
+o7mikk
+o7mine
+om7inn
+om3in5s
+o4mio
+o2mir
+o4misj
+o4mist
+o2miu
+om1j
+2omm
+om6mat
+om4med
+om4metr
+3ommø
+2omo
+o4mofo
+om1op
+omo1v
+omp2
+ompa3t
+1omr
+2omre
+2omro
+2omru
+6oms.
+oms3al
+om4sek
+3omset
+omsko9d
+omsku9la
+om4som
+oms3un
+oms4ø
+omt2
+3omtal
+om4tes
+om3ti
+om3tv
+o2m1u
+o3mus
+omvæ8re.
+6omy
+omyr8ke.
+o2møk
+omø4r
+om5øy6
+o5må
+2on
+on3abo
+o4nac
+o6nak
+o4n3ang
+o4nap
+on3app
+o6narb
+o4n3arg
+o4n3arv
+onat5r
+o2n1a4v
+on5b
+on4dar
+onder6e
+ond3re
+on4d5ri
+onds4i
+o4ne.
+on5eie
+o4nele
+o7nell
+o2nem
+o3ner
+o4neru
+onesi6
+o4nesk
+o4ne3s8t
+o4nete
+o2nev
+on7f
+on7ga.
+ong3d
+on5ge.
+on6ged
+onges4
+on5gi
+on5go.
+ong2r
+on8gro
+ong9ros
+ongs4j
+on2gu
+on4gy
+on4g5ø
+o9ni.
+o2n3i2d
+oni1e
+o2nil
+on5ild
+o2nim
+oni6mi
+on3inf
+o6n7inn
+o2ni1o
+o4ni5p
+o6niso
+on3j
+on1k
+on5k6a
+3onkel
+on5k6i
+on4kle
+on5ku
+onle6g
+on5nad
+on3ni
+on5ny
+o4no.
+o5nor.
+o4no4v
+on3ove
+on4sh
+ons1i
+onsi3s
+onsi4v
+ons1k4
+ons7ke
+ons1l
+onsla6ga
+onstitue9ra
+onstitue9re
+onst5rum
+ons5und
+ons1v
+on4sve
+ons1å
+ont6a
+on3te
+on4ted
+on5ten
+on5ti
+on4tok
+on5tor
+ont2r
+on7ul8
+on5ur
+onu4sk
+o4n5ø4
+on6øy.
+on7å6
+2oo
+ood1s
+o1off
+oo2k1
+oo5k8a
+ook5es
+ool7a
+oo4m5i
+oo6mo
+o1o2p
+oopa8
+oop9an
+oo4pe
+oop5en
+oop5et
+o6opi
+o1o4r
+oor6da
+oo5s
+oo6sp
+o1o4v
+2op.
+2opa
+o4pab
+o2pak
+opan9d
+o4pa3re
+o7paren
+o4pasj
+o4pau
+o3pea
+ope1i
+opel6lø
+2open
+o4pena
+o9pend
+o4penet
+o7pent
+o2per
+6o3per.
+3opera
+ope6rar
+o7pero
+o5pert
+2opet
+o4peta
+4oph
+o1pi
+o4piek
+oping9s
+o4pir
+2opl
+o1pla
+o4p5land
+op3li
+op9lu
+op4na.
+op4ne
+2o3po
+2opp.
+4oppa
+op4p5art
+op4pas
+4oppe
+1oppg
+op4pi.
+op6pia
+op4pis
+opp3li
+3opply
+op6poe
+op6pr
+opp5rop
+opp5und
+opp1å2
+2o1pr
+op6re
+op7ru
+op7rå
+op6sa.
+o8p8si
+op2t1r
+o4q
+4or.
+o6r7add
+or3adr
+o2rag
+or1ak
+2oral
+or5ald
+o4r5alg
+oral4st
+or6alt.
+o3r4am
+o4rana
+o3rane
+o4rang
+o4rans
+or6ap
+or3att
+o4rau
+ora3uk
+or1a4v
+4orb
+orbit5
+or7by
+4orc
+orda9ta
+or3dea
+6ordel
+ord7e6pl
+or7dik
+ordi4s
+or4d5ise
+ord3it
+1ordn
+ordre8gi.
+ordsa6me.
+ords6e
+ord3st
+ordy9ra
+8ore
+orear8a
+orear8e
+o5rebra
+o8redi
+or1ei
+or1el
+o4rela
+o6reld
+ore6na.
+ore4ned
+ore4net
+or3enk
+oren3s
+ore6o5g6
+o6rerf
+o4rero
+ore1s2
+o5resc
+ores6te
+o4reta
+or9et8n
+o6retv
+o2rev
+2orf
+orfa6re.
+orfi7ne
+orfø9re.
+1or3g4a
+4orga.
+or3ge
+or5ger
+orge4s
+orgi6e5ne
+org4sk
+orha9g
+orha9le
+o1ri
+o3ria
+ori5b4
+ori4e5ne
+5orient
+o7riet
+o2rig
+ori7ka
+o6rim
+or3ind
+or3ink
+or3inn
+or3ins
+oriro8
+6oris
+oris4a
+6orit
+o4riti
+oriti6me.
+or5ka
+3orkes
+or5ko
+orko6se.
+ork7s2
+6orl
+orla7te
+or5le
+orm5ang
+or6map
+or5mel
+or4m3un
+ormæ9
+or4nar
+orned5
+orne6dr
+or5net
+or4nol
+orn3t
+4oro
+o3roa
+o3roe
+or3off
+o5rog
+oro5i
+o1ron
+or1op
+o4r1or
+oror9da
+o5rosa
+o5rot
+or3ove
+or5ovn
+orpe6s
+4orr
+2ors
+ors5alt
+or5sen
+or4serk
+orse9ta
+orse7te.
+or3si
+ors5kar
+orsk5ei4
+ors8k9l
+ors4ku
+or1s4l
+orsmå8la
+or1sn
+or3s2o
+orso9na
+orso9ne
+orso9v
+ors4pa
+ors4ten
+or1su
+orsva9re
+or3sy
+or9sø
+2ort
+or4t3ak
+orta8la.
+or4t5and
+orta9pe
+or4t5av
+orte5i6g
+or4tek
+or3tem
+or6t5erf
+or4t5erm
+or5tii
+or7til
+or5tis
+3ortod
+or6tok
+orto9ne
+orto4r
+ort5ori
+or4tou
+ort5res
+ort5råd
+ortå4
+or4t3år
+or1u
+oru8d
+or9ude
+oru4h
+o5rum
+oru4t5
+oruta4
+or4utf
+orva9ra
+or5veg
+orv3s
+4ory
+o7rya
+or1yn
+o9r4ære
+2orø
+or9ø8k
+orøk8t
+or5ør
+or3ø4v
+orøv8d
+or1øy
+or5ås
+2os
+o1sa
+o4sa5b
+o6sad
+o2saf
+o4saku
+6o5sau
+osbi7
+osefi5
+o2seg
+o5selei
+o2sem
+os2en
+o6sena
+ose5sl
+ose5sm
+oses4sk
+oses6sp
+oses4st
+o4seu
+osfa9ta
+os2hi
+os7his
+osi6e7ne
+osi5ere
+osi5ert
+o2s1ing
+osk3ei
+oskei6e
+o4skil
+osk9lar
+osk5len
+o1sko
+osko5p
+o3skri
+os8k3v
+os2l
+os3le
+oslo1
+os3lod
+os5lu
+os5lø
+os9ma
+os5me
+os3mo
+o2sn
+o3so
+os7ove
+os6pa.
+os6pe.
+os4pil
+os4por
+os4sek
+os3sem
+os5sens
+osseri7e6
+osse5v
+ossis5te
+os6ski
+oss3kj
+os4s5ko
+oss9l
+os6spa
+oss7tro
+os7sty
+os8sv
+ost5adr
+os5tal
+osta5le
+o8ste.
+os4teg
+ost5egg
+os4tek
+ost6el
+os5teo
+o4sti.
+o8stia
+o4stie
+o4stin
+os5tis
+ost1o
+os6tons
+ost5ran
+ost3re
+o3stro
+ost5rup
+ost7rå
+o5stø
+os1v
+os5øy
+os7år
+2ot
+o1ta
+o5tad
+ota4l5a
+ot5ald
+otal7ev
+ota4lov
+o9tane
+o9tar.
+ot3arg
+o8t9arm
+o5tas
+ote7d
+ot6ei
+ote5int
+otek5i
+ote6k7la
+otekla8ga
+ote4kle
+ot5elem
+ote5lev
+otel6lan
+otel6lek
+otel4li
+otel8lø
+o4tena
+o4t5ende
+oten8de.
+o2teo
+o4teram
+o4teret
+o6terev
+o4tero
+oter5s
+ote5r8u
+o4terå
+otes6ter
+ote5sté
+otet5a
+otet5o
+otet3s6
+otfø4
+oti7ert
+oti2k
+otika3
+ot7i6ko
+o1tj
+o6tja
+ot5jer
+ot6nero
+otno7te.
+ot6nå
+o1to
+o2to.
+o4to3a
+o5toa.
+o2tob
+oto6en.
+o6tof
+ot3off
+o6toga
+o6togram
+o4toi
+o2tol
+oto5ne
+oto4ral
+otor5d
+o2tot
+o2tou
+o1tr
+ot7red
+ot5rer
+ot5rev
+o6t7ri
+o6t5rom
+o6t5rø
+ots5el
+ot6sh
+otshusvæ8
+ot4s3ki
+ots6op
+otsopp6
+ots5pr
+ots5tab
+ot7ste
+ots6å
+ot6tank
+ot5tas
+ot5tegn
+ot6tenk
+ot5tese
+ot5tin
+ot5toa
+ott4s3k
+otts5po
+otts4ti
+ot7tug
+ot4typ
+o1tu
+o6t5ut
+o1ty
+oty8e
+ot1yt
+o1tø
+ot7å
+oub8
+oul5l
+oun6ge.
+ou4r
+ou7ri
+ou5ro
+ou9sa
+out8a
+ouve4
+o5vae
+o1vak
+ovanfø8
+ovan9o
+ov3anv
+o7var.
+o6varb
+ova9re
+ov5art
+ov7arv
+oved3
+o1vei
+o1vel
+ove4la
+4oven
+o4vend
+o5vende
+ove6nya
+ove2r
+over3a
+ove7ra.
+ove9ras
+o6verdr
+overe6
+ove8r5es
+3o6verf
+3overg
+o5verks
+5overr
+5oversik
+overs4p
+over9v
+o1vet
+6ovh
+2o1vi
+oviso3
+2ovj
+6ovna
+ov4nes
+2ovni
+4ovo
+o5vo.
+o7vom
+ov1or
+o5vot
+ov1o2v
+ov5sal
+ov4sek
+ov4sen
+ov9ske
+ov4sle
+ovs1p
+ovs5te
+ov4sti
+ov7sun
+ovsy5k
+ovta6le.
+ovveg7i
+ow1
+owa8
+o7was
+owat2
+ow5h
+ox3
+oy9ar
+oys5l
+o1y2t
+o1za
+o3zy
+o1ø
+o1å
+ô6ra
+ô2re
+ôr5ei
+ô1ri
+ô4t
+ó9sa
+ó7t
+ó8v
+ò9re
+1pa
+4paa
+2pac
+pa8cen
+p5ad.
+pa3deb
+p4adg
+pads4
+2paj
+6pak.
+6paka
+4pake
+pak4kas
+pakke4s
+pakk7esl
+4pakti
+3pa1la
+pa3le
+pa7lim
+pal5in
+pal1j
+pal5lø
+5palm
+4palø
+2pam
+pa5me
+p3anal
+pa4nap
+pan9de
+pa5ne
+pang5s6
+pan3ka
+9panne.
+pan5se
+pan5sl
+pant8r
+4panv
+pa4ny
+2papa
+pa8pa.
+pa3pe
+4papo
+pap4pr
+4papr
+pap3ri
+pa4ra.
+5parad
+2parb
+4parek
+4parena
+par5ess
+par5g
+2pari
+pa4ri.
+pa3ris
+4parki
+par6k7l
+par4kv
+par3m8
+pa1ro
+4parr
+par8ra.
+par9s4
+par6tid
+par4tig
+par4tin
+par5u
+par7v
+parvi6
+6parø
+4parå
+p6as
+pasa5
+pa9se
+pase6r5
+4pasp
+3pass
+pas5sab
+pa4s3t
+pas4tar
+pas5ti
+pas9v
+pa1t
+pa3te
+pa4tist
+pa6tre
+p8atta
+pat6tak
+2patu
+p8at6v
+pau7k
+2pav
+pa4ve.
+3pa1vi
+2p1b6
+pba4ne.
+pbo6da
+pce6
+2p1d4
+pde4le.
+pdø2
+pdø9d
+1pe
+2pea
+peak3
+pe4a3re
+4peb
+pec3
+pe7d6a
+5pedas
+4pedd
+pe3de
+pedfø9
+pedi9e8
+pe6doa
+pe6don
+4pedr
+pe4dro
+4pedu
+4pedy6
+2pedø
+pe7då
+pee6
+pe3er
+2pef
+p5eft
+2peg
+p5egg
+peg8ge.
+pego4
+2peh
+pe4il
+pei4leg
+2pe1in
+pe6ism
+2pej
+2pek
+pe8ka.
+pek4l
+pek4tro
+pekt7ros
+8peku
+p6el
+4pela
+pe5l4aks
+5pelal
+pe5lar
+pel9d
+4peled
+pe4lef
+4pelei
+pe6lep
+4peler
+pe6lev
+6peliv
+6pelj
+pel4lo
+4pelov
+pel5s6e
+pel5s4i
+pel7st
+4pelu
+pe5lun
+2pely
+2pelø
+6pelå
+2pem
+p1emb
+pe4nan
+pe4n3ar
+pen3de
+6p5enden.
+4pener
+pe3net
+5peng8
+pen4gel
+pen7gl
+peni4n
+4peniv
+penly4
+pen7s8a
+pensa7k
+pensa8la
+pen5sk
+pen4s5l
+pen3s6m
+pen5s6o
+pens4t
+pen9sta
+pen7ste
+pen7tag
+pen5tr
+6peny
+2penå
+2peo
+pe7o6s
+2pep
+pep5ar.
+pep7p
+pera3a
+4pe4rab
+4perad
+pe4rai
+pe4ral
+4perap
+pera5t
+4perate
+4pered
+4perei
+4perek
+4peresp
+4perest
+4peresu
+4peret
+pe4rev
+3peri
+perie8ns
+4pe5rik
+peri3s4
+4perit
+per5k
+per6les
+per5mu
+per5n
+4pero
+pe3ros
+pero6se.
+per6regj
+per6rei
+5perro
+pers6m
+per4tro
+per4t5rå
+pervi6k
+2pery
+6perø
+4pe7rå
+2pe1s
+3pes.
+pe3se
+pe6se.
+pe7si
+pes8ka.
+p3eske
+pes4ke.
+6pesl
+pes4n
+5pess
+3pest.
+5peste.
+pes5til
+4petab
+peta6ka
+4petal
+4petas
+4petau
+pe3te
+5pete.
+4peted
+6petei
+6petek
+4petel
+4petem
+pe3ti
+4petid
+4petil
+pe4tim
+2petj
+2peto
+2pet4r
+pe4t5ru
+pet1s6
+4pett
+2petu
+4petø
+4petå
+pe2u
+2pev
+peva8ne.
+pe5vi
+p5evn
+pev6ne.
+4peø
+4peå
+3pér
+2p1f
+3p6fenn
+p3fo
+p5fr
+pfri4
+pfø5re
+2p1g2
+pgjer4
+2p1h
+phav2
+pha9va
+phavs5
+phe9te
+phe7va
+phe5ve
+phi5li
+7pi3ane
+7piar
+pi4as
+7piase
+4piav
+4pib
+pi6ca.
+2pid
+pid3s2
+pie2n
+6piend
+pi3er.
+pi9ers
+2pif
+pi9fr
+pig5ge
+pig6g9u
+p7i6gj
+2pih
+6pii
+pi4keh
+pi6kel
+pike5r6o
+pi4ké
+8pikk
+pik3ko
+4pikl
+piku5
+pi5la
+pi6la.
+pi3lep
+pil4lag
+pillba6
+pil6led
+pil4leg
+pillega6
+pille6ra
+pil4le5s6
+pi1lo
+2pim
+pi4na.
+pi4ne.
+pi9ned
+pi4nel
+pine4v
+3ping
+pin6go
+ping3r
+ping5sk
+6pinns
+pin4sl
+pi2nø
+pio6n5an
+pion5s
+3pi2p
+pi4pi
+pip9la
+pi4rar
+pi4res
+pi4rut
+pisi9e
+pi4ski
+2piso
+piss4l
+pis4sp
+pis4st
+pis1t
+pis4t5r
+pis9t8ra.
+1pit
+pi9ta
+pita7la.
+pi5té
+2piti
+4pitj
+4pitr
+pit5t
+2piu
+2pi5v
+4piø
+4p5k4
+pka5v
+pka8va
+pl6
+8pl.
+2plad
+pla8de.
+p4lak
+p4lan.
+plan7de
+4plane.
+plan5g
+plan5s
+plap3
+4p1lar
+p2las
+pla4st
+p2lat
+platina5
+2ple.
+2pled
+4pleis
+p2lek
+p6le5n4u
+ple5n4a
+ple6r5u
+ple8se.
+4plev
+p2li
+4plit
+p3liv
+pli7va
+plo4gj
+p4lo8i
+p1lok
+4p5lov
+plu4e
+p4luk
+plun3
+plun6d7ri
+p1ly
+ply5d8
+plæ5re
+plø6pa
+p1lå
+2p3m
+2p1n4
+p7ner
+pne6se.
+1po
+po9a
+pod8
+po6da.
+po4de.
+po6em
+2pof
+po6f7r
+pog6
+4poh
+po5id
+2poke
+po6lan
+po3le
+po4lek
+6polj
+pol5li
+po6lom
+pol6s4ka
+po2lu
+2pom
+pom6p9u
+pom5s
+4pon.
+pon5d
+pon4gr
+pongs6
+2pon1s
+pon5sa
+pon4sv
+po2p1a
+po6pe.
+p5opn
+pop1s
+2por.
+po1ra
+2p5ord
+po1r4e
+po4ref
+po6reg
+po8ré
+2p1org
+2pori
+2pork
+por6s7v
+por4tor
+por4t5ro
+por4trå
+2porv
+po1ræ
+po1rø
+po4se.
+po4ses
+4posj
+po2st
+po4sta
+pos5tas
+po5stat
+pos3te
+4pos4v
+5pot.
+7pota
+potak9
+po3te
+po4te.
+potek5l
+po5t6ha
+3poti
+4potr
+4pou
+2po4v
+pove6
+pover6n
+pow4
+2pp
+p2pad
+p2pak
+pp3akt
+p2p3a4l
+p9pane
+pp5angr
+pp5ank
+p4p3anl
+p2pap
+p9par.
+pp5arr
+p7past
+p4p7at
+p4pee
+p2pe5i4
+ppel5s6
+p4pena
+p8p9ender
+p4pendr
+ppe9nes
+ppe5p8
+p4penø
+ppe5ra
+p7pere.
+p4perkl
+pp7e6sen
+pp9esn
+ppes8ti
+p4peta
+pp5e4tas
+p4pete
+pp5ett
+p2peu
+p1pi
+pp1id
+p2p1il
+pp5im
+pp3inf
+p4p5inn
+pp7ir
+ppir8re.
+p4pist
+pp1j
+pp3k
+pp1l
+pp5last
+pp3led
+pp5lei
+pp9lev
+pp5n
+pp1of
+p2pol4
+pp3old
+pp5om
+p2p1op
+pp3ork
+pp1ov
+pp5p
+pp1r
+pp5rei
+pp5rin
+pp4ris
+pp7riss
+pp9riv
+pp9ro.
+ppropri6
+pp7rot
+pp1s
+ppse6te.
+pp3ska
+ppska9k
+pps2p
+pp9spe
+pp3spl
+pps2t
+pp7sto
+pp7t2
+p2pu
+pp1uk
+pp5ut
+pp3ø4
+ppøs8
+p6på
+pr6
+4pr.
+4prad
+3praks
+pra7li
+2pran
+pran3s
+5prat.
+5prate
+pra5te.
+4pray
+5pref
+prei7er.
+4preii
+pr5elem
+1prem
+pren4s
+1pres
+6pres.
+pres6sak
+p6restas
+4prett
+p3rif
+pri5ke
+pri4l3e
+4pring
+5prino
+3pr6in6s5
+3pr6in7s6e
+3pr6in7s6i
+1pris
+pri6s5k
+pris3t
+2prit
+pri9ve
+1p2ro
+8pro.
+6p7roc
+3prof
+4prog.
+4proge
+4progl
+4p3roi
+p5rop.
+3pros
+7prose
+6pru
+prun7ge
+pru5ta
+pru5te
+6prør
+prørs5t
+prø5s4
+5prøv
+prø5vels
+2prøy
+4prå
+prå8da
+pråk3i
+prå4ko
+pråk5k6
+2ps
+p1sa.
+ps5a6n
+p1sc
+p3se.
+psei8ge
+p2sek
+p2s1el
+ps5e4ly
+p3sen.
+p5sens
+p7ser.
+p5sete
+p5sets
+p2sh
+p6sib
+ps5ins
+p7sis
+p3s4jo
+p4s3kil
+ps7kjen
+p2s1ko
+p7s6ko.
+p3skod
+p5s4koe
+p2sle
+p9s8lo.
+pslø8va
+pslø6ve.
+p3s4lå
+p2sm
+psmå8la.
+p2sn
+ps4no
+ps1o
+p3sod
+pspi9la
+ps5ple
+p3s4pre
+p4s5pro
+ps5pu
+ps3s2
+pst2
+ps7tal
+p4s5tem
+ps3tv
+p5s6tå
+psu4r
+p3s4us
+ps1v
+p2sva
+p2sve
+ps4ving
+p4svæ
+ps5w
+psy3ke
+3psyko
+4psys
+p2s1ø
+p3s2øk
+psø4ke.
+psøy8
+psøy9ene
+ps1å
+2p1t
+pta8la.
+pta4le.
+pt7ark
+p3te
+pte6k
+pte4ma.
+pte7re
+p5ti
+pto7g
+p4tou
+ptus5t
+p4tut
+1pu
+pu4br
+5puc
+6pu6dy
+pu2k
+pu7la
+pu8le.
+pull6
+5pum
+pu4ma.
+punk4t5
+punk5t6e
+2punn
+2pur
+pu4re.
+pu8rea
+3puri
+3purk
+pur5u
+pur3v
+pu7sa
+pus4h
+pusl7u
+pu1ta
+pu4ta.
+pu5tas
+pu5ter
+pu5tev
+4putg
+2puts
+put6tr
+put4tu
+2putv
+6putø
+2p1v
+pver7
+pvi4se.
+py4dr
+py8o
+3pyra
+py1re
+py1ro
+6pys
+py6sa.
+py4se.
+pys6t
+4p5z
+1pæ
+pæ4re.
+pø1kj
+pør4ret
+pø8sa.
+pø9ta
+pø9te
+p1ø2v8
+5påb
+på4by.
+på1k2
+1pål
+på4la.
+på4le.
+p5ån
+på3pe
+på1pl
+p1åpn
+på1r
+1pås
+på7sko
+på5sm
+på3t2
+6påtå7
+1påv
+qa5
+qu2
+qu9ar.
+1que
+que7r
+4raam
+4raar
+4rabis
+ra1bo4
+4rabr
+2raby
+ra3cet
+ra3ch
+5raci
+ra3d2a
+4radf
+3radio3
+4radir
+4radj
+2radm
+2ra1dr
+r3adre
+rad2s3
+radvi4
+ra5ede
+rael4
+4raerk
+raf4fer
+ra4fiu
+ra2fj
+2rafo
+ra5fo.
+ra4fos
+2rafr
+ra5fre
+6raft
+ra4fu
+ra6fy
+ra7gea
+ra5gee
+2ragl
+2rah6
+7raid
+ra5int
+ra3isk
+6r5akad
+ra9kar
+ra7kel
+ra5k6ha
+r2akk
+rak4kel
+r6akr
+ra5kro
+2raks
+rak6sa
+rak3s4e
+rak6se.
+rakst6
+4rakti
+rakt3r
+r4a5ku
+4rakv
+ral5ans
+6ralbum
+5ralds
+4raled
+ra5leo
+ral3g
+4r5alge
+4r5algo
+rali5e6n
+ra4lin
+ral1j
+ral5le
+ral7m
+ralo6i
+ral3op
+ra5ly
+4ralø
+4ra5l8å
+ra4mag
+ra4mas
+ram3b
+6r9ambi
+rambu9ens
+6ramed
+4ra4mer
+ram8et.
+4ramil
+ram1o
+ramperi8
+ram6p3u
+ramse8te.
+ramta8la.
+ramta6le.
+4ramu
+6ramy
+r4an.
+ra4naa
+6r3anal
+ra5nar
+ran9cs
+r4an9de.
+r5andel
+rand3r
+rand5s6a
+r4ane
+4ranfa
+ran5ge
+6rangi
+rang5st
+rania8
+ra6nin
+ran3kv
+2r5anl
+r6anli
+2r1anm
+r4ann
+ran6n5ett
+ran4n5in
+rann3s4
+rans7kar
+4ransv
+ran4tik
+ra5nu
+ran6ut
+4ranø
+2rao
+4rapa
+ra4pel
+4rapin
+ra4pir
+ra4pis
+ra6pit
+ra1pl
+4rapo
+ra4pos
+4rappa
+4r5appl
+3rappo
+2ra1pr
+4raps
+4rapu
+1r4ar.
+2rarb
+7rarbeh
+4rarea
+4rareg
+rar5e6l
+4ra3rep
+rar7eta
+r1arg
+6rargu
+8rarinna
+6rarinne
+rar8ka.
+4r1arm
+rar8ma.
+6rarn
+4rarr
+rar3re
+rar5s
+2r1ar5t
+rar6ta.
+ra3rø
+4rasa
+2rasc
+ra3sea
+4rasel
+ras3h
+raska8ra
+ras3ke
+ra4ski
+ra7s6ko
+ra6sl
+rass4l
+ras7st
+4rasti
+ra5s4til
+4rastj
+rast5re
+6rasty
+ras7v
+ra1ta
+ratak9
+r6ate
+ra4te.
+6ra5teg
+8r7a6teli
+4ratfe
+ra1to
+ra1t4r
+ra4t5ro
+ra4trø
+ra5t6røy
+rat5tel
+ratte4s
+4ratub
+rat5ut
+6raty
+7raud
+raud3s
+6raug
+rau6ga
+rau6ge.
+4rau4k
+raus6s
+2rav
+6ravd
+rave5s4
+4ravg
+ra1vi
+r3a4vis
+4ravl
+rav8l9ut
+ravlø8pa
+ravlø8s
+rav6r
+4ravt
+ra5vy
+ra3vør
+4raw
+raz5z6
+2raø
+raøy4
+2r1b8
+rba3d
+rbe2d
+rbede4
+rbed5en
+rbed5et
+rbed9ra
+rbie8
+rbi9er
+r2big
+r2bik
+rbist6
+rbis5tr
+rbo8di.
+rbo4ni
+rbon7s
+rbo5re
+rbra5s
+rbrei6
+rbu5en
+r5bø
+r1c
+4rd
+r4dab
+r5dag
+rdag4s5
+r5dah
+r4d5ak
+rdal4
+r4dala
+rda4le.
+rdals5
+rda4mes
+rda8n9o
+r4dant
+rd5anta
+r4d3arm
+r4d3art
+rd5atl
+r4datm
+r4d3au
+rd3d2
+r6dedi
+rde4en
+r3defi
+rd5e4ge
+rd1ei
+r9deka
+r4dekl
+r4deks
+r6delo
+r6demi
+r7dena
+r6d7eng
+r6d7enh
+rden4s3
+rdense4
+rdenta8le.
+r4deo
+r6depo
+r4derik
+r4d5erst
+rde6sm
+rd3e4ta
+r6d7ett
+r8dé
+rdfes5
+rdi3an
+r4diana
+r4dians
+r6diau
+r4did
+rdi3e2
+r2dif
+rdi6gres
+rdig3s4
+r4dika
+r4dikl
+r4diku
+r2dil
+r6dimi
+r2dio
+rdi3ov
+r4dish
+r2dit
+r2diu
+rd5je
+r1dju
+rd7m
+rd3n
+rdnæ4
+r9dob
+r4d5o4d
+r4dol
+rdon8na.
+rd1op
+r6dor
+rd3ost
+rd1o4v
+rdover5
+r9drad
+r3drak
+rd5ran
+rd7rara
+rd3ras
+r3drei
+rd3ret
+r5drev.
+rd1ri
+rd3rot
+rd3sei
+rd8ske
+rds4kv
+rds5tan
+rd3sto
+rdsto5g
+rds7tre
+rds7tu
+rdsva9r
+rd5t
+rdta8ka
+rd5tr
+rd7tø
+rd3und
+rd5ve
+rdvi8ka.
+r4dyg
+rdy5pe
+rdy3re
+r6d7yt
+r6d5æ
+r7d6ær
+r7d6æ5r6e
+rd1øs6
+rdø4ve.
+rd3år
+rd7å6s
+1re.
+2rean
+re7a6r7an
+rear5e
+4reav
+2reb
+3redak
+6redam
+re3def
+re5den
+re3des
+re3di
+3redig
+r1edl
+2redo
+2redr
+re4d5ri
+red5sku
+red4sl
+reds5la
+red7s6led
+3reduk
+6redy
+2redø
+2ree
+re4el.
+re3er
+8refa
+4reff
+4refi
+2refj
+6refos
+6refr
+4reft
+2refø
+4regar
+rega7ta
+re3ge
+4regeb
+re5gel
+4regen
+4reger
+4regg
+1regi
+re4gia
+re4gil
+reg1l
+2regr
+4regub
+4regud
+2regå
+2reh
+2reid
+2reie
+2r1eig
+rei8ga.
+rei8ge.
+4reik
+rei9l
+rei5na.
+rei7nas
+re5inde
+rei5ne.
+rei7nes
+rein6skj
+re4inva
+rei9ra
+rei5sa
+rei3si
+rei7ska
+reis6led
+re7ism
+rei7va
+rei5ve
+2rej
+6rek.
+re5ka.
+re5kav
+re7ken
+4rekj
+rekk6an
+rek4k5v
+5reklam
+rek4led
+re5k6lir
+re7ko
+4rekob
+4rekom
+4rekon
+6rekos
+4rekra
+3rekru
+r3eksa
+6reksp
+rek4ter
+4reku
+r8el.
+re9la
+4relag
+9relandsk.
+9relandske
+2r2ele
+rele8ge.
+r4e5lei
+6relek
+re7len
+7relene
+6relg
+r3elit
+4re3lj
+r2ell
+rel4lag
+rel6land
+rel5led
+rel4lev
+5r4elm
+rel5ses
+rel4sk
+4re1lu
+4relv
+2re5ly
+2relæ
+2relø
+4re7l6å
+relå7r
+2rem
+remann6
+r1emb
+remi6ene
+remi6l
+re7mis
+rem9ji
+remmed5
+6remn
+rem8na
+rem5p4
+rem1s
+remti9da
+4remu
+8remy
+4remå
+2re3na
+ren4del
+4rendr
+8rened
+re5neg
+re7nei
+4renek
+r3e4nel
+4renest
+6renet
+6rengd
+reng5l
+4rengn
+reng5st
+re5ni
+2renk
+ren6kl
+r3enl
+ren8ne8sl
+rennes9la
+re5no
+ren5sa
+r3enss
+6r7entit
+4r3en5tr
+6rentu
+4renu
+5renz
+6renæ
+4renø
+re5og
+2reop
+re3o2r
+5reou
+8repen
+6r5e6pi
+1repu
+6repus
+1rer
+6rerad
+6re9rang
+4rer6at
+re5re.
+4rered
+4reref
+4rereg
+4rerei
+re4rek
+4rerent
+4rerep
+4rerese
+4reresu
+4reret
+6rerfa
+4rerig
+4rerik
+4r3ernæ
+4rerol
+4rerom
+re3ros
+rero6se.
+re5rot
+3rers
+rers4p
+4rerute
+re6r7øy
+2rerå
+1res.
+2resa
+re2s3c
+re3se
+4resel
+re4sem
+4reset
+resi7ere
+4resin
+2resj
+2resk
+res5ke
+re6s7kje.
+res6kl
+res7kod
+re6sky
+6re1sl
+re4slu
+1resm
+re5smo
+re3sov
+re9spe
+4respi
+4respr
+2ress
+res4sal
+res4sek
+res4sit
+res4sj
+res6sk
+res6sort
+res4sp
+res4st
+res4sy
+res9tane
+5restau
+res6t5erv
+res4tes
+res3té
+4re3sti
+res4til
+re3str
+4restre
+7restv
+4re5sty
+4restå
+1resu
+6resuk
+4resun
+re3svi
+2resy
+2resø
+4retaki
+4retal
+re4tap
+4retea
+8retek.
+6reteke
+4retekn
+6retel
+6re5tem
+re5ten
+4re5ti
+4retj
+4retoa
+2re5t2r
+rets4i
+ret4st
+ret7ted
+ret5ter
+rett8o
+rett6set
+4re5tu
+2rety
+2retø
+5retøya.
+7retøyets
+4re7tå
+2reu
+reu6r
+4revak
+re5van
+reva5re.
+6reveg
+4revei
+4revel
+re6v7enh
+re5ver
+reve5s
+r3e4vig
+re4v5inn
+re7vom
+1revy
+re4v5åp
+3rew
+2reå
+2r1f
+rfa5re
+rfat5
+rfe8en.
+rfe8er
+rfe4et.
+rfei5li
+r4fik
+rflå3
+rfe5m6ø
+rft2
+rfu8se
+rfyr4
+r9fæ
+rfø8rarar
+2r1g
+r5ga.
+rga8le.
+rga8li
+rg5and
+r7gann
+r4g5anv
+rga3ri
+rg3art
+rga4ve.
+r6gedi
+r4gef
+r2gem
+rgent4
+r3geo
+r4gerei
+r4geret
+r4ge3ru
+r4gesj
+r4gesl
+r4gesta
+rgi1a
+rgie4n
+r2gik
+r2gil
+r2gim
+r2gio
+r2gir
+rg3i4ri
+rgi7sl
+r2giø
+rg2le
+rg5le.
+rglem5
+rg3len
+rg3ler
+r2gn
+r4gog
+r3gom
+r2got
+rg5rab
+rg3rea
+rg3rel
+rg5reps
+rg5rin
+r3gru
+rg5sc
+rgs6kor
+rg5s4le
+rg1sn
+rg5s6till
+rg5sto
+rg9stu
+rg2sy
+rgu7d
+rg6ut
+rgå9as
+rgå6va
+rgå6ve.
+2r1h
+rhav2
+rhavs3
+rhjul8s
+rho3d
+r7hu
+rhø5re
+rhånd6s9
+rhå9ne
+ri1an
+4rianf
+4rianl
+6riansv
+ri1ar
+4riarb
+4riarr
+6riau
+2riav
+ri4ava
+3ri6avo
+2rib
+ri2b3l
+ri8ca.
+ri4co.
+ri5da
+4ridale
+ri5der
+ri5di
+2r1idr
+rid3t
+4rieie
+4rieig
+4rieks
+ri1el
+6rield
+4rielem
+6rielim
+riel4la
+rie4n
+ri3end
+4rienh
+4rient
+rien5t4r
+ri1er
+rie5ra
+rie5ri
+4rietat
+ri5even
+2rifa
+riferi9e8
+rif4fi
+rifiserba8
+6rifj
+1rifl
+rif5la
+2rifo
+2rifu
+4rifø4
+ri4ga.
+rig4gr
+ri3gi
+4rigj
+4rigre
+rig2s
+rig6s7t
+2rih
+2rii
+2rij
+5rij.
+ri4kali
+ri5kan
+5rikd
+ri3kes
+ri7ki
+rik7ken
+rikk5j
+4rikl
+ri8k9la
+2ri7ko
+6rikon
+2ri1k2r
+rik4sk
+rik4s5u
+rikt6
+rikts3
+riku6m
+ri3k4v
+4rikå
+2rila
+6r5ilde
+6riled
+ri5lei
+ril6lest
+2ri5lo
+ril4sn
+2rilø
+4rima
+ri9mab
+ri9mar
+6rimes
+ri5met
+2rimi
+ri4mi.
+7rimis
+rim7l
+4rimm
+4rimo
+ri4mor
+4r1imp
+4rimu
+rim9ut
+4rimy
+rina5l
+ri5n6am
+4rinas
+4r5inc
+4rind
+r3indu
+ri4nee
+ri4nes
+2r1inf
+rin7gom
+ring3r
+ring4sa4
+rings5ak
+ring8spa
+2r3inj
+2rink
+4rinn
+rin9nes
+4rinor
+2rins
+rins6k
+rin6sm
+2rint
+rin4t5j
+rin4tr
+2rinv
+ri6nø
+2ri1of
+6ri3om
+2ri1op
+2rior
+rio5s4
+riot3r
+2rip
+4ripe
+ripo4s3
+4ri1r
+4risau
+4rised
+rise5i
+6risek
+4risel
+ri4seli
+4rish
+5risiko
+2risj
+ri6sju
+4riska
+ri4ski
+6risku
+4risky
+6ristad
+4ri5sted
+ris5tik
+4ristil
+ri4sto
+ris5tof
+ri5stun
+6ristø
+ri6stå
+4risv
+4risy
+4risø
+ri3te
+6riteo
+ri7ti
+riti9da
+4ritil
+4ritj
+ri5t6o
+ri5tr
+rit1s6
+ritt8s7t
+ri6tun
+4rity
+2riun
+riu4r
+2riut
+4rivar
+ri6ved
+rive9ge
+ri5vei
+4riverk
+2rivi
+ri4vi4s
+riv5ise
+6rivo
+4riøk
+riø4r3a
+8riøya
+4riå
+r1j
+rj7ambi
+r4jere
+r2jes
+r4jeti
+r4jetr
+r4jetu
+rju6la
+2r1k
+rk3akt
+r6kanf
+r4kao
+r4kapr
+r6katr
+r3ke.
+r2keh
+rk5eik
+rkei8ka
+r6kek
+r4kelo
+r4ke3lu
+r3ken.
+r4kenav
+r3kene
+r4keni
+r5kens
+rke5ri
+r4keris
+r4kero
+r5kers
+r4ke3ru
+r4kerø
+rke4se
+rkeslø7se
+r9ket.
+rk4han
+r3ki
+rki3d
+rki3e
+rki4vi
+rkjek8
+rk5jor
+rk1k2
+r5k8led
+rk2li
+rk5lun
+rk9lut
+rklæ5re
+rk2lø
+rklå9ra
+r3knek
+r5knep
+rk7nes
+r3kno
+r2kob
+rko6b5r
+r6kofo
+r2koh
+r4kola
+r4koli
+r4kope
+r4kora
+r4koru
+r4kosel
+rko6sele
+r4kosj
+r6k7ras
+rk5rei
+r5k6rem
+r8ks
+rk4sar
+r6k6seg
+rk2s1i
+rk4ska
+rk1st
+rk6stal
+rk4sten
+rk4s5ti
+rk4stj
+rk4sto
+rk6s5vi
+rk5ti
+rkti4s
+rk5to
+rku4le.
+r6k7u6t
+r4k5ve6d
+rk9vei
+r5kvel
+r4kver
+rk3ves
+rk5vik
+r4k5øl
+r2k3øy
+rk9øys
+rkå4k
+rk5åke
+rkå6pa
+rk5å4s
+2r1l
+rla4te.
+rle4a
+r2lef
+r3lep
+r4l5e4ri
+r6le7sl
+rle4st
+r4lesu
+r4leu
+r3l4i
+rli9ke
+rling3s4
+rli8ta
+rli4te.
+r3lj
+rl6o
+rlog2
+rlo5ve
+rl4sk
+rlu4e
+r3ly
+rlys7k
+r6l5z
+rlø8pa.
+r5løy9
+2r1m
+rma6ge.
+rma5k4l
+r4m5alte
+rm3anl
+rm4ans
+r6manv
+r4mare
+r4marr
+rm5av
+rm3b
+r2me7g
+r2mek
+rme6lap
+rme5ne
+r4menet
+r6merev
+r4mese
+rme9tar
+r4mey
+r4m5ide
+rmi6ene
+rmini6
+rmin5ski
+r6m5inst
+rm5i4v
+rm1je
+rmlø8pa
+rmo4e
+r2mof
+rm1op
+rmo7st
+rm7p
+rm5s6ko
+rm1sl
+rms6n
+rm1st
+rms5til
+rm1su
+rmta8la
+rm3te
+rmu7an
+rmue4
+rmue5ne
+rmu8la.
+rmu6le.
+rm5øy.
+r9må.
+rmål4
+r6m5åp
+r9mår
+r6m7åta
+2rn
+r3na
+r4n1ak
+r4n3ald
+r6n5appar
+r4narb
+r4n3art
+rnat7r
+r4natv
+r6n9a6vis
+rn3avl
+rn3d
+rndø4
+rndør5
+r3ne.
+rne5a2
+r5neboe
+r2nec
+r4nef
+r2nel
+rnele6ge.
+r3nell
+r3nels
+r4n3eng
+r4nenh
+r4nerei
+r6neris
+rne3ro
+rne1s2
+r5nes.
+rne6se.
+r8nesi
+r4ne3sk
+r4nesm
+rne3so
+rn5e4tab
+r4nete
+r2nev
+rne5vr
+r2nés
+rn5g6
+r4ninn
+rn5k4
+rn3n
+r5no.
+r4noa
+rno5b
+r4nod
+r4noi
+r6nok
+r2nom
+rn5omn
+rn3oms
+r4n1op
+rn3ork
+r2nos
+r4n1o4v
+rn7se
+rn4s3in
+rn5ske
+rn3skr
+rn5sla
+rnsle7ge
+rn7s6mi
+rn6s3ovn
+rn5spon
+rn3s4pr
+rn1st
+rn4sti
+rn3te
+rn5ti
+rn7tr
+rntre4
+rnt4v
+rnu4
+rn5ug
+r6n3ut
+r7nøt
+r4n5øv
+rnå8le.
+rn3ås
+ro1ak
+roa4s
+ro5asi
+9roban
+9robar
+1robe
+ro4bed
+ro4bef
+5roben
+ro4bes
+5robølgj
+1roc
+r3odds
+7rodo
+ro5end
+ro7ens
+ro7fa
+ro4fel
+ro4fem
+roff5ri
+ro7ga.
+roga9ta
+ro7ge.
+rog5ret
+ro6gry
+rog1s4
+ro2gu
+1roi
+ro4kel
+ro5ki
+rok6kat
+rok6keri
+rok5kl
+rok4kom
+ro7k6l
+rok5n
+rok7s
+rok8se.
+rok5v
+roli7ga
+4rolj
+rol4lab
+rol4lap
+rol4leg
+rolle8ge.
+rolle8se.
+rol4lis
+rol6ly
+rolo9v
+2roly
+ro6mak
+ro4mal
+3ro5m8an
+ro4mate
+2rom7b
+4ro3me
+rome5d
+4romk
+4r3omn
+ro4mor
+2romr
+rom5sla
+r7omsy
+romsø3
+rom3t
+ro5ne.
+ro7nim
+6ronism
+6ronista
+8roniste
+6ronisti
+4ronn
+ron4na
+rono5s
+ron1s4
+ronta6le.
+ro4pad
+5ropet
+ro4pia
+ro8pla.
+2ropp
+ro9py
+ror3a
+ror6da.
+ro3re
+ro1ru
+ro4sat
+ro5sel
+ro3sen
+4rosl
+ros3la
+ro4sm
+ro6sov
+ro1s1p
+ros4st
+ros4sy
+ros7tas
+ro3sti
+ro3str
+rost7rø
+rot5ekte
+ro5tes
+rote7ster
+roti7ka
+rot5ord
+ro5tu
+6roty
+roun2
+round3
+ro5ut
+ro5va.
+ro9vare
+ro7vas
+ro5vek
+ro7ven
+rove5re
+rov5sm
+rovve6
+rò6te.
+2r1p
+r5pa
+r6parb
+r5pefo
+r4peno
+r6penø
+r5pesk
+r5pet
+rp6j
+rp2l
+rp3lad
+rprø5ve
+r3pu
+rpun7g
+r6p5ut.
+r6p5øy
+r2påk
+2r1r
+r8raa
+r2rag
+rra3r
+r4raro
+rr3d
+rr6e
+r4reb
+r7rebart.
+r2ref
+rre7int
+r4rekl
+r5relat
+r4reo
+r4repl
+r4re3ru
+rre5sk
+r4resm
+r4reso
+r4respe
+r3ress
+rre4st
+rres5ta
+rre7sti
+rre5str
+rret6s5
+rre5u
+r3ri
+rri6ka.
+r6rip
+rri5v
+rr3m4
+rrmå8la
+rro6e
+r5rom
+rro8sa
+rro8se.
+rro8ta
+rr5s2
+r2r3un
+rr5v
+rrå5de
+4rs
+6rs.
+r1sa
+rs3ab
+r2s7ad
+r3sak
+rsa5ka
+r6sakt
+rsa6la.
+r8s9ald
+rs3all
+r5sam
+r4sarr
+rs3arv
+r1sc
+5s6ch6l
+r8sedi
+rse6g7
+r4seku
+rs4ela
+rs7eld
+r4seli
+r4s3elv
+rs5e4rik
+r3ses
+r4sesi
+r6sesu
+rse4te.
+rs6ett
+rsett8o
+r7sim6
+rsimp7
+rs1in
+r5s4ing
+r4sins
+rsis5t
+r7sja
+r4sjh
+rsj3or
+r3skad
+r6s7kaf
+rs4kam
+r3skap
+r4skar.
+r4skas
+r4ski
+r5skil
+rsk7inns
+r1skj
+rs5kjens
+r6skl
+rskla8g
+rsk5lar
+rs4k5le
+rs4k3læ
+r5sko.
+r5skoe
+rsk3op
+r4skor
+r3skot
+r1skr
+r4s3kra
+r5skriv
+r4s3kro
+r1sku
+r5sku.
+r5skue
+rsku7et
+rsk5und
+rsk5var
+rs5kys
+rsk5ø
+rs4lef
+r4slei
+rs4lek
+rs4les
+r5s6lit
+rs3lok
+r4slun
+rs4make
+rs4mo.
+rsmål4
+rs6nev
+r1so
+rso9a
+rs5oml
+rso6n5
+rso7n6al
+rso5n8e
+rso5n6i
+rsons4
+r2s1or
+rs5ord
+rso7ris
+rs1ov
+r1sp
+rs4pan
+rs6pat
+r5spel
+r4sper
+r7spes
+r5spi
+rs4por
+r5spred
+r4spå
+rs3s6
+r1s2t
+r4s5tabb
+rs5tank
+rs3tap
+r6st7b
+rs4ted
+rs4tem
+rs5tend
+rsten6s
+rs5ter.
+rstev9na
+r3stil
+r4s5tilf
+r4s5tilh
+r4s5tils
+r4s5tilv
+r5stis
+r4stit
+r6st5k
+rst4r
+rs9tre.
+rs7tree
+r4strin
+r4s5tro
+r5strø
+rst7ut
+rstu9va
+rstyg7
+r3st6ø
+r7stå
+rs5ukl
+rsu9r
+rsu7sa
+rs5usi
+r1sv
+rs8vak
+rsva9ra
+rsvar4s5
+rs1ve
+r3s4vek
+rs5vit
+rsy4na
+rsy3t
+r1sz
+rsøks3
+rs9øye
+6r1t
+rt5ad
+r4t5af
+rta4ka.
+r4tana
+rt3anl
+rta9pa
+r4tarr
+rt3art
+rt3avs
+r4tec
+r4teda
+r3tede
+r2tee
+r4tego
+r4tegr
+r4teie
+r4te3in
+r4teka
+rte6ke.
+r4teki
+r4teku
+rt5e4lit
+rte6ma.
+r3temp
+rten4s5k
+rtentle8
+r2teo
+r7t6er
+r5terd
+r5teres
+r4teris
+r5terk
+r4terå
+r4tese
+r6tesk
+r6testi
+r4teta
+r4tete
+r4tev
+r4th
+rtian8d
+r4tians
+r4tiar
+rti8ar.
+rti5en
+rti6gra
+r4ti3kv
+r4tila
+r4tili
+r4tilo
+r4ti7na
+r2tio
+r2tip
+rti7sa
+r6tiska
+r4tiski
+rt6i9so
+r4tisp
+rtis3s
+r4ti5str
+r3titu
+r2tiv
+rtma6le.
+r5to.
+rt3off
+r9tofo
+r9tok.
+rt3omk
+r4t3opp
+rt6opp.
+rt3ord
+r6t7o6s
+rt1o4v
+rt2r
+rt8ra
+r9tre.
+rt6red
+rt3reg
+rt3rei
+r4t5reko
+rt5rel
+rt5rep
+r7trib
+r4t3ris
+r4t5ros
+rt3rut
+r5t6rål
+rts3ar
+rt4seg
+rts5eng
+rt2si
+rt4s5ja
+rt5ske
+rt3skj
+rt5s4no
+rt3s4pe
+rt4sti
+rt7s6trek
+rt4s5tøy
+rts5unde
+rt3t4
+rtu6en.
+r7tug
+rt3und
+r2t1ut
+rtu8ve.
+rty8da.
+rty8de.
+rtyr5s
+rty6ra
+rt5yt
+rtæ9ra
+rt5øl
+r6t5ås3
+ru3and
+6ruav
+ru6avh
+ru8bl
+ru5bo
+ru4di.
+rud4r
+ruds4l
+ru4ele
+rue4r
+rue3s4
+ruga8l
+ruga5t
+rui3d6
+4ruk
+ruk4su
+rukt3s
+ru9la
+4ruli
+6r7ulk
+rul8ke.
+r2ull
+r7ulv
+r4um
+rum3al
+rum4p9l
+5r2unde
+run5del
+6r3under
+7r4under.
+r5unders
+rund3r
+rund3s4
+run6ge.
+4ru2ni
+run5kr
+r7uly
+ru4nøy
+ru2r
+ru5ra
+ru8ran
+ru8rar
+ru9rer
+rur8ta
+r4us
+rus2h3
+6r7u6sik
+rus5j
+rus7lu
+ru1s4o
+rus5sel
+rus4st
+ru4s4t3r
+r4uta
+ru3tal
+ruta8la.
+r7utan.
+r4utbe
+4rutd
+rut8e
+rute3i
+ru4tel
+ru9tene.
+ru9ter
+2rutg
+r1utk
+rut9o
+6rutr
+rut4re
+ru6trø
+rutto5
+2rutv
+ru5va
+ru4ved
+ru4veg
+ru4vei
+ru4vel
+ru4vere
+ru4ves
+ruvi8
+ru6v7is
+2r1v
+rv4a
+rva7ka
+rva6la
+rve3de
+rve4den
+r4ve5dr
+r4vega
+r4vegi
+r4vegr
+r4veim
+rveis7e6
+rve5kl
+r4vela
+rvel9le
+r4v5eng
+r5ver.
+rve5re
+r2ves
+r2vev
+rvil9l
+rville9d
+rv2j
+r4vos
+r4vov
+r3vr
+rv2s1
+rv5ung
+rvå7r
+4r1w
+rx1
+ry1a4
+ry2dr
+ry7fe
+ry5fl
+ry5ke.
+2ry1kl
+ry7le
+ryl4l5i8s
+4r5yndl
+ry4nes
+ry5nes.
+ry4pa.
+2ryr
+ry8re
+r1yrk
+ryr4ke.
+ry9ro
+ry5rø
+rys6sal
+ry5ta
+ry4tek
+1rytm
+r3ytr
+r4z
+ræ7le
+8r3æ4re
+8r3æ4ren
+rær5in
+rær8t
+ræ8v
+2rø.
+rø8ar
+6røb
+rø4be.
+rø4dek
+rød1s
+4røep
+røf5l
+rø4ke.
+rø4kero
+røk3l
+4røkn
+røk5s4
+røk7t
+røk1v
+2røl
+rø6m
+røm1a
+røn5nes
+rønn5s4a
+rønn5sk
+røn5sko
+5r6øntg
+rø4pe.
+røp9l
+1rør
+rør5d6
+r6ørende.
+rø7ret
+5rørl
+rø2r3o
+rør4sp
+r8øs.
+rø3se
+rø5sla
+røs5v
+rø8ta
+røt9as
+rø1va
+rø5vede
+rø9vers
+rø1vi
+r4ø5væ
+2r1øy.
+4røya
+røy9ar
+røy6ed
+røy6ene
+røy5es
+røy4et
+5r6øyk
+3røyr
+røy5re
+røy8senes
+6røy4s3k
+røy4st
+2rå.
+rå7a
+4råag
+4råb
+3rådet
+rådy9ra
+rå9ene
+2råf
+4rå5g4
+2råkj
+råk3re
+rå2k3u
+råk1v
+4rål
+råle7s8
+rå4let
+rå5let.
+rå5lu
+r5ånd
+rån6da
+2råp
+2r1år
+rårs5k
+rå5ru
+rå1s
+4råsb
+2råse
+rå5si
+2råsj
+rås4t
+6råta
+råta8ka.
+rå5tr
+rå5tu
+2saa
+5saa.
+sa4ba.
+s6abe
+s8abl
+sa5bok
+s3abon
+sa5by
+sa3ce
+sa4dag
+4sadam
+sa4dere
+4sadm
+sa4do
+2sadv
+sae5d
+3saen
+7saer
+1safe
+5saga
+sa4ga.
+sa4gas
+sa4gat
+6sagent
+6s5agg
+6s5a6gi
+sag8na
+sa6go.
+sa4gog
+2s1a2gr
+sag3s4
+sa3ik
+sa5ir
+sa1is
+5sak.
+sa2ka
+3saka.
+4sakad
+sa5kai
+3sakb
+3sakd
+3s4a3ke
+5sakf
+1sakh
+sakh5e
+1saki
+sa4kj
+sak5kr
+s4akky
+5sakl
+5sakm
+4sako
+3sakp
+sa1k2r
+5s4aks.
+sak4s3i
+4s3aksj
+sak4sp
+5saksr
+5saksu
+2s1akt
+sak6ta.
+5s4akto
+s4aku
+4sa7kø
+1s4al.
+sa1la
+4s5alarm
+7sala.
+5sa5lat
+4salb
+1sa3le
+sa9let
+1salg
+s4alge
+4s5algo
+salg6s5
+s6ali
+sal4mes
+sa5lo
+5sal2s3
+sals4a
+4salter
+sa1lu
+3salv
+sal5ved
+2saly
+1s2am
+5sam.
+sa2ma
+sa5ma.
+sam4an7
+sa5mas
+sam5ei
+sa4mel
+sa4met
+5saml
+sam4lev
+5samm
+sammen5
+sa4my
+4s1a2na
+sa9na.
+sa7nar
+sa3nat
+san6da.
+san7d8al
+5s6ande.
+sand5r
+sand5s6lo
+sand5st
+san4d5ø
+1s2a5ne
+4s3a6nek
+5sang.
+3sange
+4s3angr
+s7anken
+2s1anl
+s5anm
+san5ne
+6sanno
+sa2no
+s5anor
+san5os
+san1s
+5s4ans.
+4sansa
+5s4ansen
+san7s6k
+4s5ans8l
+6sansv
+s8ant.
+san9te
+6santr
+4santy
+4s1anv
+2s1ap
+sa2po
+1s2ar.
+1sara
+6sarab
+2sarb
+s4ard
+9s8are.
+4sareal
+4sareg
+sa5rev
+3sari
+sa4ri.
+sar6ka.
+4s3arki
+2s1arm
+sar5me
+sar8me.
+s1arr
+2s1art
+sar4ta.
+sa4ru
+4sarv
+s4ary
+1sas
+8sasju
+2s1a4sp
+4s1ass
+s6ast
+4sasty
+2sasu
+4sasy
+1sat
+sa1ta
+sa5ten
+sa3ti
+2s1atl
+4s3atmos
+sa1to
+4sa5t6r
+s5atsk
+5satt.
+4s3atta
+6s5atten
+satte4s
+5sau.
+sau4d
+sau5di.
+5saue
+4saug
+sau6ga
+s3auge
+sau6ge.
+2s1auk
+5saum
+3saus
+4saut
+2s1av
+s2ava
+sa4ve.
+5s6a5v6in
+sav5n
+3savu
+8s9b4
+sba4ne.
+sbi6e
+sbo4da
+sbu6et
+s6bug
+sbul3
+sby8ta
+4sca
+1sce
+2scel
+s4cene
+s3cer
+6sch.
+8schl.
+6s7cl
+4sco.
+6scoc
+4scos
+s4cus
+8s9d6
+sdag4s5
+sdam9p
+sde6le.
+sdu8en.
+sdu8er
+sdø8v
+1se
+2se1a
+3sea.
+sea4g
+se3an5d
+se7ansa
+sea9re
+5se4au3sk
+2seb
+4sec
+4sedag
+sed5d
+se3de
+5sede.
+5sedl
+4sedo
+2sedr
+2sedu
+6sedvanle
+2sedø
+5see.
+see3d
+2seef
+2seeg
+se6e3i
+se3e4l
+se5en
+seer1
+5sees
+2seev
+2sef
+s1eff
+4s1eft
+6sega
+sega6l
+se2ge
+se6ges
+se3gev
+seg8ga.
+9segl.
+7seglet
+3segm
+4s2e7g8r
+2seh
+2seid
+sei8dan
+sei9den
+sei8e9nes
+s5ei4et
+2seig
+sei6ga.
+sei5ge
+sei5k
+3se8il
+6seim
+2sein
+se3ind
+s3eini
+se6ink
+se3ins
+se3int
+sei5r
+3seis
+2sej
+5sej.
+2se5ka
+3seke
+4seki
+2sekj
+5sekk
+sek4kes
+2sek4l
+4se3kn
+2seko
+se2k1r
+4sekra
+4sekri
+4sekro
+3s4eksj
+4seksp
+sek4st
+sek2t3an
+sek6te.
+sekte9ra
+3sek5to
+4seky
+4sekå
+s2el
+2sela
+se6la.
+3selak
+5selane
+5selar
+sel5art
+s3e4las
+se6l5at
+sel1d
+se4le.
+4se5led
+6selega
+4selei
+4s3elem
+4seleng
+4seles
+4s3e4lev
+5s6elg
+4selik
+4selil
+4selis
+4s3e4lit
+sel6løp
+2selo
+7selol
+se3lom
+3sels
+sel4sin
+8s5elske
+sel9s8lag
+sel4spo
+sel5t6
+2selu
+se6l7u6r
+sel4v5ak
+sel4van
+selv3e4
+sel4ve.
+selvei4
+sel4ver
+sel8vin
+2sely
+2selæ
+2selø
+selø8pa.
+6selå
+2se3ma
+3semb
+7semd
+se5me
+se4mi.
+semini6
+2s1emn
+sem4na
+9semnd
+2semo
+sem5pe
+2semå
+s2en.
+6senau
+sen9d8a
+sen6dela
+6senden
+4sendr
+s2ene
+4sened
+se3neg
+4senem
+8senesa
+6senese
+sene8se.
+s5engas
+2s1enh
+se6nin
+s3enkj
+5sen3n
+s2ens
+4s5ensem
+sen6s5end
+sen4sj
+sen3so
+7s6ent
+sen5ter
+8s7en5trep
+4senum
+4seny
+2senæ
+6senø
+2seo2
+7seod
+se3or
+2sep
+se3pe
+seperso5
+3sept
+s2er.
+se3ra
+4seram
+5seran
+4serap
+5seras
+6serau
+ser5d
+s2e5r4e
+5sere.
+4serea
+4sered
+4seref
+4sereg
+4serei
+4serek
+4serel
+4serenn
+4serent
+4serep
+4sereso
+4seress
+4serest
+4seresu
+4seret
+4serev
+s1erf
+s2eri
+seri6e5ne
+4serik
+4serkje
+5serkr
+5sern
+ser7nev
+2se1ro
+se4rop
+se4ror
+se4ros
+9s6ert
+ser4tak
+ser6tat
+ser4tr
+se1ru
+4serul
+se4r3un
+ser4ved
+ser4vel
+2sery
+2se5r6ø
+2serå
+5ses.
+ses5ald
+5sesals
+ses5alt
+4sesc
+2sese
+se4sene
+ses5in
+se3sj
+4sesje
+4sesjuk
+ses5kal
+ses5kar
+ses5kv
+ses5lit
+se3sna
+5seso
+ses3pr
+ses4s5in
+se1st
+5sest.
+5seste.
+4sesto
+ses5un
+ses1v
+2sesy
+4sesø
+ses3å
+3s2et.
+2se2t6a
+3seta.
+se5tae
+seta8ka
+se5tar
+6setea
+4seteg
+4setei
+4setek
+se7tel
+se4tera
+se5tero
+4setes
+2se3ti
+se8ti.
+s3e4tik
+s3e4tis
+4setje
+5setje.
+7setl
+5setn
+2seto
+2set6r
+s4ets
+s5etters
+2setu
+2setv
+2sety
+6setø
+3seum
+4seun
+seure9ne
+seu2t
+2sev
+seva6ne.
+s8e5var
+sev4d
+sevi4sa
+s1evn
+sev4ne.
+se3vr
+3sevåg
+2seyn
+2seø
+2seå
+1sé
+2séa
+6séb
+4sée
+4séf
+4séj
+4sék
+2sél
+4séo
+6sép
+9sér
+4sés
+2sév
+2s1f
+sfa4ne.
+6sfe
+sfe6et.
+sfes5
+sfisken8
+sflå3
+s5fo
+sfo8ra
+sforlø9
+sfra5s
+sfri5e6re
+sfyrs5
+3sfæ
+sfø9ren
+sfø5rer
+sfø5ri
+6s9g6
+sga4l
+sga8va
+sga4ve.
+sgen9s
+sge4st
+sgå4va
+sgå4ve.
+s1h
+4sh.
+sha2k
+s7hat
+s3hau
+6she
+shea4
+s5hei5
+7sh6e4rif
+s4hi.
+s6hip
+sh5isk
+4shj
+6s7hopp
+3short
+3show
+6shs
+2shu
+4s5hy
+s5hø
+shø8l
+shø6va
+shø6ve.
+s7hå
+1si
+sial5v6
+4sia5m
+si7ans
+4siap
+4siav
+si2bl
+3si2da
+3si4de.
+3si3den
+si4deo
+s4ider
+si5der.
+si4dete
+2si2do
+4s1idr
+sid8ra
+4sidy
+4sieg
+si1el
+sie4n
+si5er.
+si6eren
+sie4s
+si3est
+6sife
+si3fl
+2sifo
+si4f3r
+2sifu
+4sifø
+3sig
+siger4s
+4sigi
+4s3iglo
+si5gr
+4sih
+3sik
+si3ka
+si5ke.
+sik2h7
+sik4ka
+sikk8artet
+sik4k5el
+sik4ko
+siko3
+si4kom
+si4kop
+si4kos
+si4kot
+sikt4s3
+s2il
+5sil.
+3sild
+sil4del
+sil4der
+sil4des
+sil5j
+sil2k
+sil4les
+2silø
+si6mel
+4simet
+2simp
+si3mu
+4sinde
+4s3indu
+si3nek
+2s1inf
+sing4s5a4
+7singu
+si4ni
+4sinj
+2sinn
+3s4inn.
+7s4inna
+s6inne.
+5sinnet
+s3innh
+s5innk
+s3innl
+4sinnt
+si5nob
+sinsk5e
+2s1int
+4sinv
+si6nø
+4si5ov
+si4pa.
+si8pe.
+si6re.
+si7ren
+si4ri.
+sir8kl
+s2is
+si5sel
+si4serf
+sis5e4v
+si6sin
+6sisju
+si4sk
+sis5ke
+si4sn
+si4s5te
+si4sti
+sis3to
+4sisy
+3s2it
+si5ta
+sit8ji
+si6t7ra
+si4t5re
+si4tri
+sit3s4
+sitsva9
+sit6term
+sit4tes
+si4umf
+4siut
+5siva
+si9van
+si6vek
+si8vi.
+si9våt
+1sj
+2sj.
+s2ja.
+8s5ja9g
+4sjam
+s4jan
+4sjanl
+s7jarn
+2sj3av
+6s7jaz
+2sjb
+6sjd
+5s4je.
+sje4f3i
+sje4fla
+sjef5t
+sje3g
+sjek4t5o
+3sjel
+sje4lev
+3s2jen.
+5s2jene
+4s3jent
+5s4jer.
+s2je5s4
+5s4jet.
+sjet4ti
+2sjf
+2sjg
+s6jim
+2sjk
+2sjl
+2sjm
+2sjn
+2sjob
+5sjok
+4sjom
+9sjon
+sjons7
+2sjor
+2sjou
+2sjp
+2sjr
+2sjs
+2s6jt
+s6j3t6sj
+sju1a
+6sjub
+6s7jug
+sju8la
+4sjun
+4sjur
+2s7jus
+5s2jø
+sjø3k6
+sjø1p
+sjø9rø
+sjø1s2
+sjø3t8
+6sk.
+1ska
+2ska.
+4skab
+skabe3
+s2kad
+8skae
+4s6kag
+2skak
+5s4kal8a
+ska5lar
+2skam
+s4kaml
+4s5kana
+4skande
+4skane
+4skano
+6skant
+5s6kap.
+9s8kapa.
+4skapas
+5skapen.
+6skapit
+4skapp
+2sk2ar
+sk5arab
+sk7arbe
+5skard
+4s5kark
+6skars
+4skart
+3s8karv
+2skas
+4skate
+8skay
+4skb
+6skd
+2ske
+s4keda
+s6kedo
+s2keh
+s6kei
+skei5er.
+s8k5e4lev
+s6kelik
+skel3t
+s4kelu
+s3ken.
+s4kena
+s6kenav
+s4keno
+s5kens
+5skept
+s5ker.
+s4kero
+s5kers
+s2ke1s
+ske3si
+skes4m
+ske5sn
+s4ketet
+s3ke4t3j
+s6kev
+s2key
+2skf
+2skh
+1ski
+5s6ki.
+7skia
+4skid
+5skie
+5skif
+5s4kik
+s6kill
+5s4kilt
+ski6net
+ski4nin
+5sk8inns5
+skino6
+5skiol
+5skip
+2skir
+s4kire
+6s5kirk
+sk5irs
+s6kis.
+7skiss
+4s5kist
+5s2kiv
+s6kje.
+5skjema
+6skjemas
+5s6kjer4m3
+3skjer5m4e
+7skjers
+3skjor
+4s5kjærl
+5skjøn
+6skjøp
+skjø5res
+2sk1k4
+2s1k2l
+6skla
+sk5lak
+s6k5lan
+s5klas
+sk9leg
+s6klei
+sk3lek
+sk5ling
+sk5lit
+s4k5luf
+s2klyd
+2skm
+2skn
+s1knu
+4skoa
+7skodd
+4skof
+3s2kog
+2s3koi
+1skol
+7s4kola
+3skole
+4s3koll
+4skom
+s6koma
+s5k6ome
+6s1kon
+4skoo
+sk5ord
+s6korpi
+s7kors
+4skort
+2skos
+s2kot
+3skott
+sk8ra
+s4k9ra.
+5s4kral
+s4krat
+s2k7re.
+4s3kref
+6skreg
+5s8krek
+4s3kret
+5skrevn
+3skrib
+3skrif
+4skrig
+3skrik
+3skrip
+4skrite
+3skriv
+5s4krog
+s3kron
+4s3krop
+sk6rud
+skru3s6
+6skryss
+1s2krå
+2sk1s2
+2sk3t4
+5skud
+1s4kue
+sku4end
+sku4er
+skue5re
+1skuf
+5skulan
+5skular
+3skule
+6s5kulis
+4skull
+s4kulp
+4skult
+skum3s
+2skun
+s6k5underv
+4skup
+8s5kurs
+8skurv
+2skv
+sk5va.
+3skvad
+sk3vas
+s6kven
+sk3ver
+sk5vit
+3skvu
+1sky
+s6kya
+s6kye
+4skyr
+sky3re
+4skys
+6s6kyss
+5s6kysk
+3skyt
+6skæ
+6skø.
+6s5køa
+4skøe
+1skå
+skå5re
+6skåt
+sl4
+sla8da
+s3lade
+sla5ge
+sla8ge.
+sla5ke
+s5laks
+3slakt
+3slal
+4s3land
+slap5pe
+s5laran
+s5lare
+4s5last
+s1lat
+sla4te.
+4s1lau
+s5laus
+sla1v
+3slave
+sla4vin
+2sle.
+s8leda
+7slegare
+5s6legas
+s4legi
+s4legn
+s6legr
+6slei
+slei5er.
+s4leiv
+8s5leke
+s5lekk
+s2lel
+s4leme
+4sle7ne
+s6lener
+s6len6t3
+2sler
+8s5les
+s6lesj
+s4leso
+s6lest
+s4leta
+s5lev
+s4leva
+4sley
+s5lia
+2slid
+sli4en.
+6slig
+sli5ke
+s4likk
+2slin
+8s3linj
+slin6t5
+3slip
+5s4lit.
+3s4lite
+4s5liv
+slob5b
+slott4
+s6lott.
+7slottet
+1slu
+8slu7a
+2slu2e
+slu5es
+6sluf
+4slug
+sluk3s6
+slum4p5
+slum5p6e
+s3lund
+s5luns
+s6lup
+slu7sa
+s4lut
+s1ly
+sly8et.
+1s4lyn
+4s5lys
+sly8t
+slæ6rari
+2sløn
+8s5løp
+slø4pa.
+s6lør
+2sløs
+slø8s5a
+3s4løsi
+slø5va
+slø5ve
+slø5vi
+5sløyd
+sløye7
+9s4lå.
+s4låe
+s1lån
+slå5ner
+1slåt
+s1m
+sma6d
+3smak.
+5s4maken
+sma9let
+4sman
+s4med.
+s4mede
+6s5medi
+s4medk
+smeg5
+4smei
+smek7l
+s4mekt
+8s5meld
+3s4mell
+5s4melt
+2s5men
+3s4mert
+6smes
+s6mesi
+s6mia
+s4mie
+smi4ene
+s4mig
+s6mil.
+smi7la
+s6mile
+smini6
+s2mit
+smo7a
+smo8de.
+s2mok
+6smot
+3smug
+6s5mugg
+smul2
+s6mula
+s4muld
+s6mule
+5smurt
+1s2my4k
+6smøn
+1s2mør
+smør3s
+4smøt
+5små.
+små5r
+s8mått
+s1n
+8sna.
+s4nab
+7snak
+4s3nas
+6s3nat
+4snav
+4sne.
+4sneb
+4sned
+s6nee
+s4neg
+3snei
+snei5er
+sne4kri
+s7nekt
+s4nel
+2snem
+4sner
+6snes
+sne9sa
+snes9v
+4snet
+s6nif
+sni6gl
+s2nik
+snik5ko
+3s2nil
+6s3nin
+3s2nip
+snir4
+5s2nit
+2s3niv
+s8no.
+s6noe
+s5nord
+6s7not
+5s6nud
+s3num
+s4nur
+7snut
+8snyh
+2snæ
+snæ4re.
+5s6nø.
+snø5d4r
+5snøe
+1s2nør
+snø1s
+snø5vi
+so3al
+so8ar
+4soav
+2s1ob
+so2bl
+1sod
+so4da.
+5soe
+sofa1
+so4fag
+so4fas
+6s5off
+6s5ofre
+soft1
+so2ga
+so8gi
+so7gl
+sog6nem
+6soh
+5s4oi4
+so5id
+5sokn
+4soks
+sok4se.
+7sol.
+so4la.
+sol5av
+1sold
+so4le.
+solei5er
+so4lene
+sol5f6
+1so7li
+2solj
+so2lo
+so8lo.
+sol3s2
+sol5t4
+so4lum
+so4lø
+3som.
+so6mend
+4s3omfa
+4s1omg
+5somh
+2s1omk
+4soml
+1som5m
+sommar5a
+3s6omme
+somme6r5e6
+2somr
+7somren
+5somrer
+6s3områ
+s1oms
+som5sl
+s4omst
+som5sti
+4somsy
+1s2omt
+5somt.
+6somta
+3son
+so4na.
+son7da
+7s6one
+so8nea
+song3s4
+so4n3o
+sons4k
+son5st
+so2nu
+so4ny.
+2s1o2p
+so7pak
+so9par
+so7pet
+3sopp.
+5soppa
+3soppe
+sop4pi
+8sopple
+so3pr
+1sor.
+7sora
+so3ran
+5sorb
+4s1ord
+sor4da
+1so1re
+so4rek
+7sorga.
+sor4gl
+so2ri
+4s3orie
+7soris
+so5riu
+4sorke
+sor5n
+3sor5s
+7s8ort
+1sos
+4s5osc
+so8se.
+6sosf
+4sosj
+so4sl
+so5te
+so8te.
+so4tra
+sots4
+sot5te
+sot4ti
+4sou
+2sov
+so3va
+so4ve.
+so5ven
+sover5e
+sove3s4
+5sovet
+3sovj
+sp2
+4sp.
+spa5g6h
+7spak.
+7spaka
+5spake
+8spakk
+s2pal
+s3pall
+5spalt
+3s4pann
+3spari
+4spas
+5s6paser
+4spe.
+spe4a
+8speda
+spe9dé
+s4pee
+1s2pei
+s2pel
+spe4leg
+spe4les
+5spelet
+3s4penn
+s4pent
+s5pep
+spe4r5and
+6speri
+4sperl
+s4perr
+s3pers
+3spesi
+s4pest
+s9pet.
+1spi
+6s5pilo
+4sping
+s2pio
+2spip
+spi7res
+spi7ri
+spi7ro
+5s6piss
+2s3piz
+2s1pl
+8s9plant
+sp9lar
+4sple
+s4plin
+3split
+sp6o
+2spoe
+spo6et
+2spol
+5s6pole
+6s7poli
+s4pora
+s4pore
+5s4pors
+sport6s5
+3sporv
+2s5pos
+4spot
+s3pote
+spo5v
+9sprag
+5spran
+6s3preg
+5sprei
+s4prek
+spre5ke
+s3prem
+5s4pren
+6s5pres
+5s4pret
+s6print
+s5prio
+8sprinsi
+8s3pris
+8s7pro
+6s5prob
+s3prod
+4sprof
+5sprog.
+5sproge
+5s6pross
+1spru
+s4pry
+3sprøy
+5språ
+2s3ps
+8spub
+2spul
+3s2pyd
+5s2pø
+6s3pøl
+sp5øy
+9spå.
+5spåd
+8s9r
+sre8ka
+sre8ke.
+sri8e9
+sri8ka
+sri8ma
+sri4ve.
+s5ro
+sro4e
+sro6pa
+sro6sa
+sro6se.
+sro2t
+sro9te
+srot5o
+srø1v
+srå4da.
+sråde9r
+srå6ders
+srå8ma
+4s1s
+s7sabel
+s7sabl
+s6sae
+s4saj
+ssa8ke.
+ssa6la.
+ss5all
+ssa4me.
+ss5amp
+s5sane
+s7s8ar.
+ssari8e9n
+s7s6arm
+s4sarr
+ssar8ve.
+ss6as
+ssau8sa
+ssau6se.
+s6seet
+s2seg
+sse5ge
+ss5egg
+ss4el
+sse5li
+ssel5s
+ss9elv.
+ssel5v6å
+s2sem
+s5sen.
+sse8na.
+ss5enden
+s5sene
+s4seni
+ssen6ke.
+s4senu
+s6senå
+s5ser.
+s6serab
+s6serat
+sse7sk
+s4seski
+s4sest
+s7set.
+s9sets
+s2seu
+s4sey
+s2sh
+ssi4a
+ssi7e6rer
+s4siff
+s6silo
+s8s9ime
+s6s3ind
+ss5init
+ss3inj
+ss3inn
+s4s3ins
+s5sis4
+ssis5m
+ssi6v7end
+s5s6jarg
+ss4kape
+ss3kar
+sska8ra
+ss3kof
+s7skog
+s4skor
+ss6ky.
+ss4kye
+ss4kå
+ss5kål
+s7skåp
+s2sl
+ss1lo
+ss5ly
+s2sm
+ss6nar
+ss2no
+ss4nø
+s4s5nød
+ss5nøk
+s2sof
+s4sok6
+sso5lo
+s2som
+ss4oma
+sso3ra
+s4sorga
+ss3ove
+ss6pil
+ss4por
+ss9ri
+ss2t
+s5stad
+ss4ted
+ss3tek
+sstel6li
+ss5tep
+ss7tilp
+s7stip
+sst6r
+ss5tren
+ss4trå
+ss3tus
+ss3t4v
+s2sul
+s3sur
+ssva7ra
+ss1ve
+ssy6na
+ssy5r
+ss7øye
+s6så
+6st.
+2s1ta.
+stabs3
+3s6t2ad
+stad3a
+sta6d3o
+s5tafa
+3stafe
+sta5fl
+st3aft
+sta7ge
+4stah
+sta6ka.
+5stakk
+4stakl
+6stal.
+6sta4la
+sta5lak
+st5ald
+4stale
+sta4le.
+5s6tali
+5stalt
+s3tame
+3stamm
+sta5na.
+3s4tand
+6stande.
+st8ane
+s4tanf
+s4tang
+stang5s6
+st3anl
+sta8n9o
+s6t5antr
+st3anv
+4stao
+2stap
+s7tapa
+s4tapp
+s8tapå
+s3tari
+1stas
+3s8tasj
+4s5tast
+1stat
+4stato
+sta5top
+sta3tu
+3stave
+2s4t5b
+st7c
+2std
+2s3te.
+2stea
+2steb
+3sted.
+s4teda
+5stedt
+s2tee
+2s4tef
+3s6teg.
+stega6l
+s4tege
+3stegh
+4s5tegn
+s4tegr
+4stegsp
+5stegspl
+ste4her
+s2t4ei
+stei5er
+4steikn
+ste6in6s5
+3s4tek.
+4s4teka
+s6teke
+ste4ket
+s4teki
+4s5tekn
+4steko
+v4s5tekst
+s4tekt
+s8te5kv
+4stela
+ste5le.
+s5teleg
+ste5lev
+s5telig
+5stemd
+3s4temm
+5stemn
+4stemø
+sten5a
+ste4nar
+5s4tenen
+s4tener
+4ste5nes
+3s6teng
+s4teni
+6stenk
+4steno
+stens5l
+4steo
+s5teol
+2step
+step7per
+st8er.
+8s5tera
+s4teram
+s6terest
+s4terev
+s7t6erf
+s4terid
+ste7ris
+s6teri6v
+4s3term
+6sterr
+ste5run
+2stes
+s4tese
+ste7sle
+4stet
+s4teta
+ste7t6r
+s6tetø
+4steve
+4stevi
+6stevl
+5stevn
+6steå
+2s4t5f
+2stg
+stga6ve.
+stgå8va
+stgå8ve.
+2s6t5h
+st5he
+2s3tia
+4stib
+s5tibe
+s9tibl
+3stic
+6s5tid
+s6tidel
+sti5en
+s2tif
+3stift
+s4tigen
+7s6tigi
+st9i8gj
+3stign
+s5tij
+6s5tika
+4s5tike
+s4tikl
+3s6til.
+5s4tila
+sti4lag
+4stild
+3stile
+stile9ge
+s6tilk
+6stiln
+s4tilo
+6s5tils
+5s4tilt.
+6s5tilta
+5stilte
+4stime
+sti7mer
+6stimé
+3s6timu
+s6t3ind
+s6tini
+4s6tinn
+s6tinst
+s6tint
+1s2tip
+4s3tipp
+6stips
+5stir
+2stis
+6s7tisk
+4stitt
+4stiå
+s4tja
+5stjel
+4s3tjen
+s6t5jent
+3stjer
+4stju
+2stk
+2stl
+2stm
+2st5n2
+s2to.
+1stof
+2s3tog
+4stoks
+6stokt
+3stoli
+4stolj
+s5toll
+4stom
+s9tomm
+st3oms
+6s5tomt
+4stoni
+st3ope
+st5oppl
+6s8t5ord
+sto4ret
+s6torm
+stor3o
+4stors
+st5o4s
+s1tot
+sto4t5r
+5s6tore.
+st5ou
+5stova
+2stp
+8str.
+st3ra.
+4s5trad
+s8traff
+6strafi
+6strail
+st3ral
+st4ran
+stra8na.
+5strand
+4strane
+6strans
+4strap
+4strar
+st7ras.
+st7rast.
+5s4traum
+s4tre3a
+s4tred
+7s6treik
+st5reis
+7strek.
+st5rekl
+6streni
+st5rer.
+6strers
+6strh
+9stria
+9s8trid
+5strie
+st5rige
+st3rin
+3s4t6rip
+5stri3s
+6stroe
+s5t4rog
+5s4trok
+st3rol
+6s4t5rom
+st3ron
+st7rop.
+st7ro6pa
+s6trope
+s6t7rug
+9s6truk
+st5rum.
+2stry
+6stryg
+s7trykt
+4s3træ
+1s2trø
+6s5trøb
+st6røm
+4strør
+4strøs
+st5røse
+s5trøst
+4strøy
+6stråd
+2st5s6
+stsa6me.
+stsy8na
+4st7t6
+stta6le.
+st3t4r
+s4tua
+1s2tub
+3s4tud
+s2tue
+stu4el
+stu4er
+stue5re
+3s4tum
+6s3tung
+6stunn
+3s8tunt
+6stur
+2s4tut
+2stv
+s3t4ved
+1sty
+2stya
+2styd
+3s4tyk
+sty6l
+2s5tyn
+2s7typ
+3s4tyr
+styrs3
+6stysk
+4styv
+sty5ve
+1stø
+2støk
+5støl
+6støm
+5støp
+6størk
+5støt
+stø7va.
+stø5var
+stø3ve
+stø5vi
+st8øy
+1stå
+5s4tåe
+stå5k
+4su.
+1su4a
+su7a8l
+1su2b
+sub7l
+sub3o
+5subs
+s3ubå
+1sue
+su8er
+su2f
+5s2ug
+su6ga.
+su4ge.
+sug3g
+su2h
+3sui6
+su3is5
+suit5a
+su2k
+4s1uke
+3suk5k
+suk3r
+1suk5s
+su4le.
+3s4ulf
+su4lik
+sul4t5r
+s1ulu
+2suly
+sulæ5
+3s2um
+4s3umid
+su2mo
+sums6
+5sund.
+8s5under
+5sundet
+5s4undi
+sun6d7r
+9sunds
+sun4ge.
+6s7u2ni
+su4o
+3s2up
+su4pe.
+super3
+supi9
+sup4r
+su8pre
+sur5d
+su4re.
+4s3u4rei
+1surf
+su4rie
+su4riu
+surs5k
+sur4sp
+sur4sti
+1sus
+su3san
+su4se.
+su6s5es
+4susi
+su4sik
+sus3p
+sus3s
+su2sy
+2s1u4t1
+sut6ra.
+sut8reg
+7suv
+8s5u6vi
+sv2
+6sv.
+sva5a
+svai5
+5svak.
+3svake
+6svaks
+sva4la
+sva4les
+6svalet
+5s6vali
+7s6vam
+s4var.
+s4varet
+s3varm
+3s4vart
+6s1vas
+6s1veg
+sve6g7i
+s5veie
+3s4veis
+s5veka
+6s5veks
+5s4vens
+sverd5s4
+sve4re
+sve8res
+3s4verg
+5s4verj
+s5verk
+sver4ki
+s4verm
+6s7verv
+7s4vev
+s4vie
+svi6e3l
+4svig
+svi5ke.
+6svikg
+4sviks.
+3svikt
+4s5vikti
+4svil
+s6vindel
+svi4nes
+sving5s4
+ll6svint
+4svir
+2svis
+svi4sa.
+svi4se
+svi5sen
+svi5ser
+s8viv
+svi9ve
+4svol
+5s2vor
+svor7t
+s3vr
+3svul
+5s6vulm
+s3vy4
+svye7ne
+1s2vø
+4svæs
+2s7vå
+1sy
+sy4c
+sy4de.
+sy5den
+5sye
+sy2er
+sy8ka
+sy4ker
+sy5kere
+2syko
+sy6kog
+s4ym
+sy7me
+s2yn
+4s5yndl
+synk4
+syn6sk
+syn3te
+sy4ra
+sy5rar
+s6yre
+sy4re.
+2s1yrk
+syr4ka
+syr4ke.
+3sy1s
+sy4se
+sy2sl
+sy2s3t
+sys4tr
+2sy2t
+sy5ten
+sy5t6h
+9sytt
+sy2vå
+s4z
+sz3c4z
+6szt.
+1sæ
+sæ2l
+8s3æ4re
+8s3æ4ren
+sæ4r1i
+særle9
+sær5s8
+7s6æ5te4
+4sætt
+1sø
+4sø.
+sø2d
+s1øde
+4søf
+søg4
+4søj
+9søk.
+3s6øke
+5søkj
+5søkk
+søk7kj
+3s6økna
+2søko
+søk4sk
+søk6s3e6
+5s6øksm
+søk4ta
+3s4øl
+sø4la.
+sø4le.
+sø5let
+3s2øm
+sø6må
+3sønn
+s1øns
+s4øp
+sø4ras
+sø4re.
+sø4r5end
+søren6de.
+sø8ret
+sør9ett
+7sørl
+sør3s
+sør5ø
+3s2øs
+4søs.
+sø8sa
+7søt
+sø7tast
+sø7tel
+sø5tes
+2søv
+s1øve
+3søvn
+2s5øy.
+4s3øya
+søy8de.
+6s5øyd
+8søye
+3søyl
+6s5øy4n
+søy2r
+2s7øys
+5såg
+s3å2ke
+5s4ål
+så4le.
+6s1ån
+sån4da
+sån6de.
+så2p
+9såpa
+så5pet
+6s1åpn
+såp9u
+så2r
+så6ra
+sår9ast.
+så4re.
+sår3sk
+sår7ø
+så2s
+s7åsa
+s4åsb
+s5åse
+sås5k
+sås5t
+9såv
+såva7
+ta1a
+4tabo
+tab2r
+tab2s
+ta4bu.
+4tabø
+ta1c
+4tad
+ta2da
+ta8d3ei
+ta6d3e4t
+tad5spa
+tad7s6v
+ta6du
+t8ae
+6taei
+4taek
+4tael
+1taen
+4taend
+4taenh
+ta6es
+2ta5fe
+taf7f6
+5tafis
+4tafl
+1tage
+4tagj
+8tah
+ta7is
+1tak.
+ta4ka.
+4takau
+ta7ken
+ta5ker
+tak7kel
+tak5k4l
+ta8k9la
+2takr
+tak4sal
+tak6se.
+tak4si
+4t3aksj
+5takst
+tak4tal
+4taktig
+tak4to
+t5aktø
+ta1ku
+tak3v
+1tal.
+ta9lam
+ta3lan
+tal5ang
+ta7las
+3tale
+ta4lei
+tal5eie
+ta4lek
+ta5ler.
+tale7s6
+1talg
+tal6ge.
+7talj
+talj5es
+tal4led
+tal4leg
+8t7allerg
+tall7es
+tal8lign
+tall6s9a
+tal4ly
+tal3op
+6talter
+t5altern
+ta6l9u
+ta6lå
+2tamb
+tamba6ne.
+t3ambi
+t4ame
+4tamet
+tam4i
+2ta3m4o
+t6an.
+ta2na
+4t3anal
+ta3nar
+ta5nas
+ta5nat
+t5andak
+5t6ande.
+t7andel.
+t5andele
+tand5r
+tandø4
+tandør5e
+1tane
+ta4nel
+ta5nem
+4tanett
+t3anfa
+tanfø6
+6tangf
+6t3angr
+1tank
+2tanl
+t3anle
+2t1anm
+3tannl
+t5anno
+tanns4
+tan6sk
+tans5ka
+t5an5sl
+4t5anstr
+4tansv
+8tantil
+tan4tra
+6t7antre
+t3anve
+2ta3o4
+5tap.
+ta4pa.
+1tape
+ta4pe.
+3tapi
+4tapl
+4tappa
+5tappi
+1t4ar.
+t6ara
+ta4r3ak
+4taram
+ta6rare
+2tarb
+3tarbo
+5tarbø
+4t9arena
+6t7ark.
+tar8ka.
+4t5arke
+4t3arki
+4tarra
+tar9si
+tar7sp
+tars6v
+4tart
+tart7est
+t5artik
+tar7tit
+tar4t3r
+ta6r5å8k
+4tasa
+ta3se
+6t9asf
+t3a4sia
+tasi3e
+ta4sif
+ta4sil
+ta4si5s4
+tas4p
+tas5s4
+6ta7sto
+ta7str
+4tasu
+ta1ta
+ta7tes
+tate8se.
+tat5e4v
+tati1
+tat3op
+tat2s1
+tat3te
+t3attr
+1tau
+9tau.
+7taue
+4t5aug
+2t1a4uk
+4taun
+tau4ne.
+tau4sk
+2taut
+2tav
+6tavin
+3tavl
+4tavli
+ta9xy
+6t1b2
+tba3d
+tba2n
+t6be.
+tbe6te.
+tbe6t7r
+tbe6t8ra
+tbo6da
+tbu8da
+tby3k
+tby4s
+tby7te
+2tc
+t1ce
+tcen4
+tch5e
+t5co
+2t3d
+tdy5pe
+1te
+4tead
+4te3ag
+2teak
+2te9a8l
+tea6m
+2tea2n
+2teap
+2tear
+te5arb
+tea4s
+3teatr
+4teatt
+2teau
+2teav
+4teb
+t5ebb
+tebu8da
+4tecel
+te1co
+2ted
+6t5eddi
+3tede.
+4tedeb
+te7def
+4tedek
+4tedel
+4tedem
+te5den
+4tedi
+5tedil
+4tedo
+tedo6en.
+tedo4er
+tedo8et.
+te4dor
+ted4sk
+ted4sl
+6tedu
+4tedy
+tedyr9k
+4tedø
+te3e4
+2tef
+8tefa
+4tefi
+4tefl
+4tefo
+tefo8r
+t3efte
+3tefø
+2tega
+5tegat
+4t3egd
+te7gea
+te9gee
+4tegg
+teg8ga.
+2tegh
+te4gim
+2tegj
+2tegl
+te3gla
+te9g8li
+8tegs.
+6tegspl
+6tegsv
+2tegu
+tegvi8
+2tegå
+5tegås
+4teh
+5tei.
+2tei4d
+t3eie
+t3eiga
+tei6ga.
+t7ei6ge.
+6teigr
+3teikn
+tei5le
+te1im
+6teinf
+te4inne
+te5inte
+te5i4s
+6teiso
+2tej
+te7ken
+te5ker
+4tekil
+2tekj
+5tek1k
+2tekl
+te5k4la
+tek6lede.
+tek4li
+4teknu
+2teko
+2tekr
+te7kra
+te6k5ru
+9teks.
+4t3eksa
+t3ekse
+4teksp
+t4ek8st
+tek8t9r
+tekt4s
+tek6ty
+2teku
+te2k3v
+4teky
+2tekø
+4tekå
+2te3la
+tel6ak
+5te4l5ar
+3telav
+8te4le.
+4teled
+4telei
+4telek
+4teleme
+te4lene
+6teler
+te4les
+te5lesk
+4te4lev
+te6leva
+4telid
+4telik
+4telil
+4telin
+te4lir
+4telis
+4telit
+4teliv
+tel5lef
+tel4lei
+tel4lev
+tel8lign
+tel4lo
+2telo
+tel3se
+telses5
+t3elsk
+tel7s6v
+5teltet
+2te1lu
+7telut
+2tely
+6telæ
+2telø
+telø8pa.
+2telå
+2tem
+3temae
+6teman
+te4mans
+t5emba
+6temenn
+5temik
+tem9ma
+6temn
+tem5ne.
+tem5ord
+tem5pe
+tempe8l7
+3tempo
+tem3s
+4temø
+3ten.
+te5nab
+te4n5al
+ten8am
+te4nan
+te4nat
+ten5at.
+6t7enc
+6t5en6den
+4tendr
+4tened
+te5neg
+6tenem
+6tenerg
+5tenes
+4tenet
+2teng
+7tengon
+t5e4nig
+7tenik
+5tenis
+4teniv
+ten9no
+te4nom
+te5nor
+6tenorm
+4tenot
+te6nov
+6tenó
+ten3sa
+ten5sko
+ten6slu
+ten3so
+tens5v
+ten4t5in
+tentle8ge.
+4tenum
+4teny
+4tenæ
+2tenø
+ten5øks
+2teom
+5teon
+4teop
+te6ora
+4teord
+2teov
+2tep
+te3pa
+4tepak
+tepa9ra
+4tepas
+4te5pe
+7tepee
+9tepé
+tep6pere
+t5e6ple
+4tepr
+4terac
+te7rakk
+6teramm
+ter7apa
+4terapp
+te4rare
+6terasa
+4terase
+7terast
+terba6ne.
+t6er5d
+4tered
+4teref
+4tereg
+4tereis
+te4rel
+8terem.
+6teremm
+te4r5eng
+teren6ga
+6terenn
+4terep
+te4rerk
+ter5esti
+4terett
+6terevo
+3ter5g
+3terh
+te4rig
+4terik
+4terisi
+te4riv
+ter5j
+4terk.
+4terke
+4terkh
+7terkr
+6terks4
+4terkt
+terla6ga
+terle7ge
+terle6ve.
+ter8ma.
+ter3no
+tern5s
+te5ro.
+tero6e
+te3rof
+4teroll
+4terom
+5teromr
+4te3ros
+4te3rot
+tero6v
+ter5r
+5ters.
+5tersjøo
+ters4kl
+ter7s6ko
+ters4l
+ters4h
+ter3s4m
+ters6ne
+ter5sv
+tersø6ke.
+3ter3t
+ter9to
+ter9ul
+8terum
+ter7v
+tervi6se
+2tery
+ter5ør
+4terøt
+te4r3øv
+4teråd
+te4r3ås
+t4es
+5tes.
+2tesa
+5tesar
+te7sen
+2te1sh
+4tesid
+4tesik
+6te3sin
+4tesit
+4tesj
+6tesjef
+4te1sk
+t9es6ka.
+6teski
+te5sko
+2te1s2m
+7tesmåe
+2te1sn
+2te3so
+6tesp
+5tesr
+3tess
+5test.
+4testaf
+tes5tas
+4testat
+5tes7te.
+4te5stei
+te5s6tiv
+5testid
+tes4tik
+4te5s4til
+4te3sto
+4te3str
+4testy
+4testø
+2tesu
+4te1sv
+tes8væ
+2tesy
+2te3sø
+te7så
+te8sår
+teså9re
+3tet.
+teta6ka
+teta6le.
+te4tap
+te3te
+5tete.
+tete4e
+4teteg
+4tetei
+4tetek
+4tetem
+2teti
+3tetik
+3tetis
+2tetj
+2teto
+2t8et2r
+3tet2s
+tet5ti
+tett3s
+2tetu
+5tetu.
+2tetv
+2tety
+te2t3å
+2teu
+teu8k
+t1eur
+3teus
+2tev
+t6eva
+te4valu
+3tevl
+tevo6r
+te3vr
+2tey6
+2teø
+2teå
+4téa
+2téb
+2téf
+2téh
+2téi
+4téle
+2tém
+2tése
+4tést
+6t1f
+tfe6e
+tfe4l
+tflå3
+t7fo
+2t3g2
+t4ga.
+tge4a
+tgei5
+t4gi.
+tgi5ros
+tgrei9e
+t4gå.
+2t1h
+t4hap
+t4hea3
+thei5m
+tho7li
+tho3re
+3thr
+thu5le
+thu6s
+thy5r
+1ti
+2tiad
+ti3ag
+2ti1ak
+4ti3all
+ti5als
+2tia2m
+2ti1ap
+ti3asp
+4tiau
+2tiav
+2tib
+2tick
+3tid
+ti2da
+4tidan
+tid7d
+6t3idee
+4ti5dem
+4t7idé
+4tidis
+4tido
+4tidr
+2tidu
+tidvi4
+6tidy
+4tidø
+ti1e2
+2tief
+2tiei
+2tiem
+4tienh
+tie5ra
+4tierf
+4tierk
+ti4ert
+ties3
+ti3esk
+ti3et
+4tieta
+4tiett
+2tifa
+tifa8ne.
+2tife
+4tifl
+2tifo
+2ti5f6r
+t8ifrå
+4tift
+tif5te
+2tifu
+4tifø
+ti9ge.
+4tigj
+2tign
+3tigno
+ti6gun
+2tih
+2tii
+2tij
+ti3ka.
+6tikarr
+ti5ke
+4tiket
+4ti5ki
+6tikj
+tik4kj
+2ti3ko
+2ti1k2r
+ti3ku
+6tikular
+6tikult
+6tiky
+4tikø
+t4il
+tila6ga
+til1d4
+3tilde
+2tile
+ti3lei
+3tilfe
+3tilg
+til3id
+4tilke
+3tilkn
+4tille.
+4tillh
+4tillin
+tillø7
+4tilm
+7tilnæ
+3tilst
+til3t4
+4tilte
+2tilu
+2tilø
+ti7mab
+5timat
+ti4me.
+5timedie
+ti4mera
+5timeri
+2timl
+4timo7
+4tim6o8r
+2t1imp
+tim7s
+2timu
+2timy
+2timø
+ti6nab
+tin5art
+4tinaz
+2tind
+t3indu
+ti4nem
+4t1inf
+tin5ge4s
+6ti4nit
+6t5inj
+2tink
+7tinks
+4t1inn
+6t5inne
+ti5no
+tinsk5
+4tinsp
+4t3inst
+4t1int
+2tinv
+4tinva
+4tiny
+9tiol
+6ti7om
+tion9s6
+4tiop
+ti1or
+ti1ov
+ti3pa
+ti6pla
+4tipr
+3tips
+2tir
+tira4t
+ti4ref
+ti1ro
+6tisak
+4tisam
+ti5s6an
+ti3se
+4tis4ei
+4tisek
+4tisel
+4tisem
+4tisep
+tise8ra.
+4tisers
+6tisig
+4tisio
+4tisje
+4tisju
+tis4ka
+4tiskan
+4tiskil
+tis5kok
+6tisku
+tis5l
+4tisn
+4tiso
+6tisprå
+4tistat
+tis4ti.
+tis4til
+ti5stre
+4tisty
+4tistø
+ti8støy
+2tisy
+2tit
+ti7ta
+ti3te
+ti1tj
+3titl
+tit4r
+tit3s
+3titt
+4tiub
+2tiut
+ti4v5and
+tiva9re
+ti4v5art
+tiv6is
+2tivo
+tiv5si
+tiv5sk
+4tiy
+ti5ær.
+ti7ære
+ti9ært.
+ti1ø8
+2tiå
+6t3jag
+2t1jak
+t5jarn
+2t1je.
+2t1jeg
+2tjel
+1tjen
+tjen6st
+6tjep
+2tjer
+t5jev
+2t1ji
+5t6jingan
+5t6jingar
+2tjo
+t5jord
+2tjub
+tju4e
+2tjun
+6tjur
+3t8juv
+tjæ4res
+2tjø
+4tjå
+4t3k2
+t6kag
+tka8ra.
+tkly9
+tku6le.
+tkå8pa
+6t3l6
+tla4ga
+tla8te.
+tle6da.
+t4ledr
+t6lef
+tlei5er.
+tle8se.
+tle5ti
+tligh6
+tlight5
+tli6nes
+tli4te.
+tlu4e
+t6l7ut
+tlø4pa.
+tl7øy.
+tlå3ne
+tlå7r
+2t1m
+tma3d
+tma8ge.
+t6maku
+t2mam
+t2meg4
+tme3in
+t2mek
+tmini6
+tmin5s6
+t2mos
+tmå4la.
+8t1n
+t3na
+t6nee
+t4neli
+t7nelig
+tne4rek
+tne4r5ø
+tne8se.
+t4nesk
+t4nest
+t5ni
+t8no.
+tn5sk
+tnæ6re
+7toan
+7toar.
+toa6t
+6toau
+2toav
+tobe6r
+t3o2bl
+6tobs
+4toc
+to5da
+to9de.
+to4dera
+3todo
+1toe
+2toek
+6toel
+toe4t
+2tof
+6toff.
+t3ofre
+to5fri
+to2g3at
+to7gen
+4togg
+to6gl
+6tograv
+to4gre
+tog3st
+to2gu
+2toh
+toil3
+2to1in
+4toj
+t6ok
+1to3ke
+to3ki
+2tokj
+2tokk
+tokk5end
+to3kl
+5toksi
+5tokt
+2toku
+to4l5arm
+5tolat
+to5lel
+tolele7
+5tolera
+toli8ne.
+2tolj
+1to4l3k
+7tolki
+tol4lab
+tol4lag
+tol6leg
+tol6lett
+3tolo
+tol5tr
+4tolå
+to9ma.
+2tomb
+to5mene.
+2tomf
+4tomg
+to3mi
+to5mise
+to7mist
+4tomk
+tomlø8pa
+t8omm
+2tomr
+4tom1s
+5toms.
+1ton
+to5na
+to4ned
+to4nel
+tong5s4
+to8nib
+2tono
+ton3sa
+ton5s4l
+ton5sp
+2tonu
+to4ny.
+2to3o
+4to1pl
+4toppd
+6toppg
+6t5opple
+4t5opplæ
+top4po
+4toppt
+4topr
+to1ra
+to4rak
+tor5alt
+tor5ang
+to4r5ant
+to4r3as
+4tord
+tor8da.
+to1re
+6toreg
+to4rek
+tor7eks
+to7rem
+6torent
+5torer
+tore4t
+tor5ete
+4torga
+tor5int
+tor7me
+torm5s
+tor5na
+tors4i
+tor5t8
+torvei5
+to4rø
+4torå
+to1s
+4tosa
+4to3se
+to2sh
+6tosj
+tos5ke
+to8sku
+4tos2p
+2tosy
+4tota
+to5te
+to8ti.
+to5to.
+to4tor
+6toty
+2tov
+to1va
+to7veg
+to5verd
+tove7re
+t5overs
+5tow
+4toø
+6t3p2
+t7pa
+tpi7ne
+tpi7pi
+tpo4et
+t4påk
+tr4
+8tr.
+6t9rabat
+3trafi
+tra8ka.
+trak7to
+t5rane
+3t6rans
+tran7ske
+5trap
+tra3pe
+tra5po
+tra5r4
+5trase
+tra5se.
+tra5ses
+5trasé
+t2rat
+t5rate.
+3trav
+tre4al.
+tre1c
+4t3reds
+t3refu
+6t1reg
+t5regi
+4trei
+tre5int
+6trek.
+4treke
+4trekl
+4t3rekor
+4trela
+3t6re7na
+tre5ne
+t6reng
+3t6reni
+4t3renn
+tren6sk
+t7repe
+t5repres
+t2rer
+t4rero
+t4re3ru
+2tres
+6tresi
+tre5sko
+tres4l
+3tresn
+t5resu
+t1ret
+t4reta
+t6reto
+t5retted
+5t6rettel
+4trev
+tre9va
+t6rib
+4t1ric
+4t4rid
+tri7ei
+t5rig.
+t4rikk
+t8rina
+t4ri5ne
+4t5ring
+3trinn
+7t6rio
+t4rist
+tri5to
+t4riu
+t2riv
+tri7vi
+5trix
+3t4ro.
+5troa
+tro9ar
+3troe
+t4rof
+tro5g
+3t2roi
+tro3in
+t4rok
+t2rol
+4t3rom.
+t6rond
+5t4rong
+tro5per
+t2ros
+5t6rosk
+tros3l
+tro1v
+t8ru.
+t8rua
+7trua.
+5trued
+5truet
+3trug
+tru1i
+5trukn
+t3rull
+2t1run9
+t3rund
+4trupe
+tru5sa.
+7t6rusk
+2trut
+t5ruta
+t3rute
+t3ruti
+tru5v
+try3dr
+3t2ryg
+tryg5ge
+7trykk.
+5trykke
+try7pe.
+t6ræ
+trø8a
+t5rød.
+t5rødt
+4trøk
+4trøm
+2trør
+5trøt
+5trøya
+5trøye5
+trøy9et
+4trøyr
+6trøys
+5trøyt
+trå8da.
+4trådet
+trå4dr
+t6råkl
+t3råst
+4ts
+6ts.
+t5sa.
+t5sab
+tsa2g
+tsak6se.
+ts1an
+ts4ang
+tsau6r
+t1sc
+t6scha
+t6sch5k
+t5se.
+tse6d
+tse4er
+ts5ege
+tsei4d
+ts3eig
+ts2em
+t3sen.
+ts4ende
+t5sendi
+tsen8ka
+tsen6ke.
+t5sens
+t4sentu
+t5ser.
+t3seri
+t4s3erk
+tser3o
+t5s6ers.
+ts4es
+t4sesk
+ts5e6st
+ts3eta
+tse4te.
+ts1e4v
+ts3f
+ts4fæ
+t7s8hop
+ts7ill
+ts3inn
+t4s3ins
+t5sir
+ts5jeg
+tsje5t6sj
+ts5jor
+5t6sjov.
+t7sjuk
+t4sjur
+t5skad
+t4skan
+ts6kis
+t4s5kjed
+ts6kjø
+t5skol
+t6skoll
+t7skot
+ts5kren
+tsk5ru
+ts5krø
+ts1k6v
+ts9kvi
+ts6ky.
+t6s7kyn
+ts1l
+t7s6lo.
+t3s4lot
+ts2lu
+ts5lø
+t5smit
+tsmå6la.
+ts1o
+t4s5o4d
+t5sok
+t5somst
+t5spek
+t3spel
+ts2pi
+t2s3pike
+t3s4por
+ts5s4
+t1st4
+t2s3tabb
+t5stad
+ts3tak
+t4s3tal
+t5stand
+t5stang
+t5star
+t5stat
+ts6tau
+t3sted
+t4steg
+t4stek
+ts6tig
+ts4tik
+t4stilk
+t4stin
+t4stit
+t2s1tj
+ts5ton
+ts5tors
+ts5tree
+t4s5tren
+t4s5tro
+ts3try
+ts6trål
+t5stu
+ts3tv
+t4sua
+tsu7ge
+tsu4l
+ts3uli
+ts3u4r
+ts5usi
+ts1v
+t3svik
+ts1w
+t5syk
+ts5yt
+tsø8ka
+ts5økni
+ts5øv
+tsøy8er
+ts1å
+tsåt8
+6tt
+t1ta
+t3ta.
+t2tab
+ttaba6ne.
+tt9abo
+tt5adr
+t2taf
+tta9fr
+tt3aft
+tta4la.
+t6t3ald
+tta7lel
+ttall4
+t4t3ana
+t5t6ane
+t4t3ang
+t4tans
+t4tanv
+tt5appe
+t7t8ar.
+ttare6
+t4tarr
+tt5ar5t
+tt6arta
+t4tase
+t4tasj
+t4tav
+tt3avi
+tt5avk
+tt5avr
+t3te.
+t2tea
+t3ted
+t4teda
+t5tede.
+t8tedr
+t2tee
+t4tef
+tt3eff
+t2teg
+t2tei
+tt7eid
+tte3in
+t2tek
+tte7kv
+tt7elev
+tteli6te.
+t4tem
+tte4ma.
+tt5emn
+ttem8na
+ttem6ne.
+t3ten
+t5ten.
+t4tena
+t5tene.
+t4teni
+tten5s
+t9tens.
+t4t5ense
+t2teo
+t5ter.
+t4terei
+tter5un
+tte4r5ø
+t4terå
+t4tese
+t4tesi
+ttes6ke.
+t4tesl
+t5tet.
+t4teta
+t4tete
+t1té
+t4th
+tt5he
+tti5a
+t4tidel
+tti3e
+t2tif
+t5tig
+tti4g5j
+tt3ind
+t5tine
+t7tiné
+t5ting
+t4tini
+t4t3ins
+t4tisj
+t6tisti
+t7tite
+ttle6de.
+ttlin5
+t1to.
+t5tofr
+tt5om.
+t7tomr
+t2ton
+tton6na
+tt3opp
+t5tora
+tt3ord
+tto5re
+tt5o4ri
+tt3orm
+tto5u
+ttpar4
+tt6pås
+tt9raka
+tt5rake
+tt3ram
+tt3rap
+tt7rat
+t4t3rep
+tt3res
+tt3rev
+tt5rom
+t5trop
+t5try
+t2t1rø
+t6ts
+tt7saf
+tts3ar
+tts5kan
+tts5kj
+ttsla6ga
+tt3sok
+tt5still
+tts5top
+tts5tra
+tts5tøy
+tt3ugl
+t1tum
+tt1un
+ttun6ge.
+tt1ut
+tt8ute
+ttva8la
+tt5ve
+tt6vun
+t5tw
+t5ty.
+tty8e
+tt1y6t
+ttæ6
+tt3ø4l
+t1tør
+tt3øv
+tt7øy6r
+tt1å4
+5tual
+4tu4av
+tuba3
+tu4be.
+tu6bå
+tu6dem
+5tuel
+tu4er.
+tug8la
+tu1in
+tu2k
+t5uka
+t1uke
+7tukt
+3tula
+1tule
+tul5les
+tum5m
+tum4s
+3tun.
+4tund
+3tune
+tun5gesv
+6tungd
+tung9s
+6t5uni
+tu4nio
+5t4un5n
+9tuns
+3t2ur
+tur7ant
+tu4ras
+4tu4rei
+tu4rek
+turi4
+tu4rin
+tur1o
+tur3p
+tur5s4
+tur3uk
+tu5rus
+tur1ø
+1tus.
+tu1sa
+3tusb
+3tusf
+tu4sin
+tu4sm
+tus5o
+tus7s6t
+tust6r
+tus5u
+2tutg
+t5utj
+t5utk
+t1utr
+tut6tenk
+tut5tor
+tutt5ov
+tu8va.
+2t1v
+tv4a
+tva8k
+tva6ne.
+3tvang
+t4v5anl
+8t9var
+tve5del
+3tveit
+4t7ver
+tvert5
+t2vet
+3tvet.
+7tvets
+t5vik
+tvi8ka.
+t8viklas
+5t4vil.
+tvi5la
+5t4vile
+t4vi5l4i
+t6ving
+tvi4sa.
+tvi4se.
+6t7vo
+3tvung
+6twa2
+1tyd
+tyg9gel
+tyg5ges
+6tyh
+tykk5s6
+ty4med
+1tyn
+ty4ne.
+6t5yo
+1typ
+5t6ype
+ty4pere
+ty4pet
+ty4rak
+5tyrann
+6tyreg
+ty4rep
+tyre5st
+ty4ri.
+tyri9e
+ty4ri5s
+ty2s
+3tysk
+tys3t
+2ty2t
+ty8ta
+t3ytel
+ty5ten
+ty4ve.
+2tz
+t5za
+5t6zel
+6t6z5l
+1tæ
+tæ5l
+tær6ene
+tæ4renh
+tær4er
+tær4et
+tær5s4
+tøf3l
+2t1øk
+tø9ket
+tøk8ta
+4tøl
+t7ø4let
+5t4øm5
+tøn5nes
+4tøp
+tøp5se
+t2ør
+tø4r3as
+tør3in
+tørk4
+7tørk.
+9tørka
+5tørke
+tør5ne
+tørs7ta.
+tørs7ter
+tørs5tin
+tør3t
+tøs4
+tø8sa
+4tøt
+tøt5a
+tø5ta.
+tø3te
+tøtt6
+2tøv
+tøv6d
+tø7vele
+t4øy
+tøy5a
+t9øyem
+tøy5r
+tøy5te
+tå4en.
+tå2k
+tå5ket.
+tå5ki
+tåk6r
+tå2l3a
+tå9la.
+tå4leg
+tå7lel
+tål5s4
+tån8da
+tån6de.
+tå3ne
+4tåp
+tå6pe.
+t1åpn
+tå6re.
+tå4rep
+t3året
+4t5åri
+3t8årn
+2t1års1
+tå3s
+tå2t
+t3åtak
+tå7ten
+ua7g
+u1ak
+uak3s
+u1al.
+ua7la
+ual5l
+ual3o
+ual3u
+u3a4ne.
+u5anl
+u3ans
+u1ar.
+uar5d
+u4arr
+u5ars.
+uash3
+ua3t
+u5au8
+u1av
+1uavh
+u4ba.
+ub7alt
+ub7ant
+ub5ark
+ub4bo
+ub2br
+ub4bu
+ubel5s
+ub5h
+ubi6s
+ubis7t
+ub1j
+ub7lande.
+uble3s4
+u1b4r
+ub5rin
+2ubs
+ubu8e
+u4bå
+uch5en
+uch5er
+u1ci
+uck1
+ucu5
+2ud
+u3da.
+u7das.
+ud4dag
+ud2dr
+udd4s5e
+ud2då
+udea9
+ude8are
+u2deb
+udeie5
+udei5er
+u2dek
+ude3lu
+u2dep
+u6dero
+u2des
+u3d2et
+u6d5ett
+u5devo
+udia2
+udi3an
+udi4en
+udio5
+ud7ir
+ud7ji
+ud5leg
+udle6ge.
+u7dob
+u6doe
+u2dot
+udover7
+ud1r
+udse4
+ud3t
+ud5v
+3u4dy
+udy9ra
+ud5å4s
+ue5a8
+u5ei
+u1el
+uem8na
+u1e2n
+uend5r
+u7ene
+uensar4
+ue7o
+u1er
+u5e6rast
+ue4re.
+ue5ren
+ue4rer
+ue4res
+ue5ri
+uerle7
+u2erm
+ue4se
+ue2si
+ue4skj
+ues6n
+u1et
+uet8r
+ueul8
+u4fe.
+u6feb
+ufe6e
+uf1f4
+uf4f5erm
+ufi9l
+ufi5ne
+u1fl
+u6foa
+ufor3s
+u1fr
+uft3a
+uf4tan
+uft5s4la
+uft3sp
+ufø6
+u5gag
+u5gar
+u6g5av
+ugby7
+u2gem
+u5gen
+u3ger
+u4gerø
+u2ge5s4
+u9get.
+u8geta
+u2gev
+ugg3s4
+u5gis
+u4gl
+ug1la
+u5g4lad
+ug9lar.
+ug4le.
+ug9ler.
+ugle7s
+ug5ly
+ug7na
+ug7ne.
+ugo1
+u4go.
+ug4re
+ugrei9er
+u4grø
+ug5s4i
+ugs4k
+ug7so
+ug3s4pr
+ug5s4va7
+uguay7ans
+ug5øyn
+u1h
+3uhel
+ui8a
+u4i6c
+ui2d
+uid5el
+uid5en.
+uid5ens
+uid5er
+uid5in
+ui3e6
+u4il
+uil5l
+u1im
+ui3ne
+u1ing
+uinnsmi8
+uinnsmig9
+u1ism
+uista7
+uit3en
+uit5er
+u1itt
+u1j
+u4jas
+u8je.
+u7jå
+4uk.
+u1k2a
+u7kar
+ukare6
+ukar5t4
+u5kat
+u2ke.
+u4ked
+uke5l4
+4ukem
+uker5an
+uke4rek
+uker5i
+ukho7
+u7ki
+u1kj
+4ukk
+ukk6a
+uk7kestal
+uk8k9l
+ukk7n
+ukks6
+u5klem
+uk8lu
+ukl7ut
+u5k4no
+u1ko
+u4k5og
+u2kra
+uk3rus
+2uks
+uk2sa
+uk4sek
+uk4sel
+ukse7te
+uk2si
+uk2s1k
+uk7ski
+uk2so
+uks5t
+uk4s3un
+uk2sø
+ukt5e4sk
+ukteslø9se
+uk4t3id
+uk6tj
+uk4t5ori
+uk2t7r
+ukts6l
+ukt3sp
+ukt9s6v
+ukt4sti
+uktu8e9ra
+uktue5re
+u1ku
+uku6e
+uku5le
+uk5vik
+ukys8
+uk3ø4
+uk5å4
+6ul.
+u1la
+u4la.
+ula7d
+u6l1af
+ul3aks
+ul5art
+ul4det
+u4lef
+u2lek
+u2lel
+ulele8ge.
+ule5ma
+u3len.
+u6leni
+u3lens
+u5ler.
+u5lere.
+ule3ri
+u2l3erl
+u4lero
+u2les
+ule3st
+u5lest.
+u5leste.
+u2leu
+u1lé
+ul4f5l
+ul4fo
+ul4fr
+u3l4i
+ulie8
+uli9en
+uli5ke.
+3ulikh
+uli9na.
+uli5ne
+u7linj
+ul1j
+ul5ka
+ul4k3v
+ul4lag
+ul4lam
+ull7arm
+ul4leg
+ull5egg
+ulleg8ga
+ul6leng
+ul9lere
+ul4le3s4
+ul8li.
+ul8lig
+ulling7s
+ull5i4v
+ul4l3o6s
+ul8lot
+ullo3v
+ull5sle
+ull3s6m
+ulls4t
+ull3sv
+ul2lu4
+ul6ly
+ul2lø
+ulm4u
+u1lo
+ulo6i
+ul5op
+ulo7va
+ul4sk
+uls4po
+ul8sn
+ulss8
+ul2st
+ul8s3t6r
+4ult
+ul4teg
+ul4tek
+ul4tes
+ul4til
+ul4tim
+ul4to
+ul7tor
+ul4t3re
+ult3ri
+u7lua
+u3lue
+1uluk
+u5lup
+u5lus
+ul9ut.
+u7luta
+u9lute
+ul7va.
+ul5van
+ul4var
+ul4ve.
+ul4veg
+ul4vei
+ul4ves
+ulv3t
+ul4v3u
+1uly
+ulyk5kes
+ulæ6ra
+ulæ5re
+ulø3se
+uløy6e
+ul5å6l
+2uma
+uma8ge.
+u6mare
+um5au
+umau7ken
+um3av
+2umb
+um5be
+4umc
+4umd
+2ume
+u4mend
+u4m3enh
+umen4t5i
+ume5ra
+2umfo
+2umh
+2umi
+u6midd
+umie6n
+umi9na
+u4mint
+um9ja
+2umk
+4uml
+4umm
+um3me
+um4mil
+um4mis
+um3n
+umna8
+4umo
+umo6g
+um5ok
+2ump
+um7pan
+um4ple
+um4p7ut
+4umr
+ums1
+um7se.
+um4sku
+umsku8le.
+um2sn
+um4sor
+ums3t
+6um7t
+umta8l
+um5ut
+4umve
+umør3s
+um7øy
+umå7
+2un.
+una6da
+un5alg
+u4n3ap
+u9nar
+u7nas
+u3nat
+2und.
+6unda
+6unde.
+un4dek
+un4del
+6unden
+5undersk
+5underv
+4undet
+un6d7im
+4unds
+und5s4i
+u2ned
+u4nee
+u9nei.
+u2nel
+unele6ge.
+u4n5eng
+u4neno
+u2ne1s2
+u3nes.
+u2nev
+unev5n
+1ungd
+ungele8ge.
+un4gem
+un2g1j
+un4g5l
+un4go
+un2g1r
+un9g8ru
+ung3s4i
+un6i
+u4ni.
+u2nid
+1u2nif
+u4nim
+u3nin
+3union
+uni4st
+4unk
+un4k5l
+un7ko
+un4kr
+un7nak
+unn5erf
+un4n5ers
+un4n5erv
+un5nes
+un4niv
+un2no
+unn5ste
+unnta8la
+un4n3y
+u4no.
+u2n3os
+uno7t
+4uns
+un6sj5i
+un3skr
+un5s4p
+un3stek
+unst5e6l
+un7s6tenk
+unst3o
+un1s2v
+un4tal
+un4tam
+un4tas
+un3t2r
+unt5rep
+un4tri
+untun8ge.
+unu6
+un5ut
+u3ny
+u3nø
+un5øy6d
+u7nøyg
+u3nå
+uo9a
+u1ob
+u1om
+uom7s
+u1op
+uor8da
+uo1re
+uo5ro
+u1ov
+up3av
+u3pea4
+u5per
+uper3a
+upe6ren
+u4peta
+6upf
+u3pi
+u8pi.
+up3ins
+up3li
+up6nev
+upo9pe
+up1p2
+up4ped
+up4pla
+up6pre
+upp5s
+4upr
+u3pra
+6ups
+up6sen
+up2s3k
+ups4ke
+ups5pr
+6upt
+6upu
+u1på
+upåvi6
+u1ra
+u2rad
+u2raf
+ur3aft
+u2r1ak
+ura6ly
+u4ram
+u5rane
+u3rans
+uran6t5re
+u5rar.
+u6r7arl
+ur3arv
+u9ras.
+ur5asp
+ur3att
+ur7au
+urau9ken
+ur1av
+ur4bod
+ur4c
+urd4
+ur3di
+ur4d5o
+u1re
+ure8al
+ureer6e
+ur5egg
+uregi6
+uregist5
+3urein
+ure4l
+ur3ele
+u4reli
+u7r8ell
+u7r8elt
+u4r3els
+u4r5eng
+u7reom
+ure7o6s
+u4resu
+u4reta
+u4rete
+ur4e5v
+2urf
+ur4feb
+ur6fed
+ur3ge
+u1ri
+u4ri.
+uri6a7ne
+uri9en.
+uri4e5ne
+uri9er.
+u3rik
+u3rim
+uri5ne
+ur3inn
+ur3ins
+ur3int
+uri6sp
+ur4ke5s
+ur7k6j
+ur6k7ja
+ur8kla
+ur4kle
+ur6k5n
+urk5s
+urla8ga
+urle6ge.
+urle8se.
+urma7g
+ur3nea
+urn1s2
+urnæ6re
+u4ro.
+u6roc
+5uroe
+urom5s
+u2rop
+uro7pi
+ur3opp
+ur1or
+uro3s4
+uro4sta
+uro8ta
+ur4pel
+ur6p9ut
+ur3re
+ursa8ka
+ur4sal
+ur4s3el
+ur4sin
+ur4skr
+ur4spe
+ur5ste
+urs5til
+ur4stj
+ur2sv
+urs3va
+ur2s1ø
+ur3teo
+ur5ti
+ur4to
+ur6t5ri
+urts4t
+urue7re
+u6rug8
+ur7ugl
+uruk6
+uru4ke
+uru7kn
+ur6ul
+urumo7
+urun4g
+u7runk
+uru7v
+ur4vel
+urv3s
+u6rys
+urø2
+ur1ød
+ur1øy
+4usa
+u9sane
+us3ang
+u9sar.
+u7saren
+u6s7ark
+us7au
+us1c
+2use
+u5seal
+use4al.
+us7edvanle
+u2s1ei
+u2sek
+u4sele
+u2sem
+u6s5endi
+us7erk
+u4s5erm
+u6sesi
+uset8je
+us3eva
+4usg
+u2sh
+u2s3h4a
+u2s3h4o
+us4id
+us3ind
+us5inn
+us7jag
+u4sji
+us5kaf
+u4s3kan
+uska8ra
+us7kat
+us5ken
+u6s5kis
+usk4l
+us6k5le
+us5klo
+us1ko
+u1skr
+us7kru
+usk7u6t
+us4ky
+us1l
+usle6ge.
+us5lin
+u4slu
+us7mø
+u4sn
+us1ok
+uso5l
+uso6l5d
+us1or
+u3sori
+usove7r6e
+us1p
+u1s2pin
+us5sar
+us6sat
+us4sjå
+us4skj
+uss5kor
+us4skur
+uss1l
+us7smi
+uss7mø
+us4s5ti
+us4str
+us2sv
+u6stande
+u4stat
+us3tav
+u2ste
+us3ted
+u5stei
+us7ten
+ust9ette
+us5ti
+u5s6tig
+us1tj
+ust5of
+uston8
+ust7onn
+us5tor
+ust5o6v
+us8tra.
+us8tran
+us8trar
+u6stre
+ust5ren
+us4tri
+us3tro
+ust5rød
+u6st5rå
+ust7ut
+u4stå
+us3ung
+u2sur
+us1v
+u5svale
+u7s6valt
+usva8n
+usvi8ka.
+6usæ
+usæ9le
+usø6m
+us1øy
+u1tae
+u2tag
+u7tagg
+u9tal.
+ut3alb
+ut5ald
+u3tall
+u5tande
+uta7no
+ut6anv
+ut3arm
+ut3art
+uta1s4
+u5tas.
+u6t5a6sa
+u6t5a6se
+u2ta1u4
+1utb
+ut4ba.
+utbe8d
+4utbi
+ut6by.
+utch5
+1utd
+4utdat
+utda7ta.
+u2te.
+u2tea
+u4tee
+u4tei
+u2tek
+ut3eks
+u5tekst
+ute6ma.
+u5temm
+u9temt
+ut2en
+u6tena
+u3tenk
+u4tenu
+u2teo
+2uter
+u6terø
+u2te1s6
+u4teta
+u3tett
+ut6eu
+uteva9
+1utf
+utfa7s
+utfø5re
+1utg
+8utgåe
+6u3ti
+u4t5if
+utikk6u
+utiku9
+u4tili
+u6tiven
+ut1j
+u5tjen
+ut6ju
+3utlei
+utlø5se
+utlå7na
+utmå5le
+u8tni
+1utny
+2uto
+ut7oms
+uto5s
+uto4v
+3utpr
+ut4på
+ut1r
+u5t4radi
+ut3re
+u5treng
+u3triv
+u3trol
+u3tros
+5utru
+u5t6rul
+ut4rø
+ut9rød
+1ut1s4
+4uts.
+4utsei
+utse8t9ja
+2utsj
+ut3sk
+5utst
+7uttak.
+5uttake
+ut4terk
+utt5eva
+ut4tid
+ut4til
+ut5torea
+ut1tr
+ut4tra
+3uttry
+utt1s2
+u1tu
+utu5e
+u6t5un
+utun8ge.
+u2t5ut
+1utv
+u3t4vil
+utvi5se
+2u3ty
+3u4t6yd
+u8ty.
+8utz
+ut1ø
+u5tør
+ut4ø8s
+utøs7t
+1utø4v
+ut5øya
+ut7åk
+u3tål
+ut1ån
+ut7år
+u1u
+u7uma
+u5ume
+u7ut
+u1v
+uve5di
+uve3in
+uve6ris
+uve3s
+u7ves.
+uvet5ø
+u6vev
+u5vi
+uvi6k
+uv5ra
+uv9sa
+u5vu
+uvø9re
+u1w
+4ux1
+ux4a4
+uy6a
+u7yn
+u1æ
+uærle9ge
+u1ø6
+uøv5
+u9åra
+u7åre
+va3am
+va8an
+4vab
+6vadj
+vad1r
+vaf3
+vaf6r
+vai5r
+vai5s
+va6ka.
+va7kan
+va5ker
+6vakh
+va8ki.
+4vako
+vak3r
+7v6aksi
+4v3aksj
+vak5s6t
+1vakt
+vakt5r
+va1ku
+vak3v
+va3lan
+va4led
+val9eks
+4valel
+val4g3r
+vali9e8
+val3la
+val6mes
+va6l1o
+va1lu
+va4lun
+4valv
+va4løy
+val7å
+vam8pu
+4v3anal
+vand5s
+v4ane
+vane5s
+va4net
+2vang
+van4gr
+vang4s7
+va8ni.
+1v4ann
+van4nan
+van4niv
+vann6sti
+va4nom
+v4ans
+van5sem
+5vansk
+van5s6ki
+van3sm
+van3ti
+van9tr
+va4ny
+2vap
+va5po
+va4ra.
+va6rak
+va4ral
+va4ram
+va4rap
+va4re.
+va4reg
+va6rem
+va4res
+var8ka
+var5ma
+var4mee
+var4sa
+var4sk
+var4s5ti
+var4sv
+varta9la
+var6tem
+var4t5i4s
+4vasa
+va4sa.
+va9set
+6vasid
+va6sie
+va4sif
+va4sik
+va4sil
+va6sis
+va2sk
+vass5a
+vas4sau
+vas4sel
+vas6s7ø
+4vasta
+vat5a
+va3ta.
+va6t7e8l
+va2terf
+vatle6ge.
+5vatn
+va1to
+va6tr
+vat7ra
+vat1s
+4vau
+2v1av
+va4z
+2v1b2
+vba4ne.
+vber5g
+vbo6da
+6v1d
+v7dev
+vding5s4
+v7doi
+v7don
+vd6r
+vdu6en.
+vdu6er
+v7dø
+1ve.
+2ve1a2
+ve6ag
+ve6ar.
+2veb
+2vec
+ve2d1
+ve9dob
+vedom5
+veds2
+ved5s4k
+3ve8d5t
+vedø4
+vedå6
+2vee
+ve4er
+2vef
+ve6g5av
+ve5ge
+3vegg
+veggs4
+2vegj
+4vegl
+ve3gle
+ve5g6lød
+veg5n
+2vego
+6vegre
+veg5rett
+4vegru
+ve4gut
+ve4g5å
+2veh
+1vei1e
+vei3en
+4veill
+6veit
+2vej
+4veka
+5ve4ka.
+ve4ke.
+ve4ked
+4vekee
+2veki
+4vekj
+2vekl
+vek8la
+vek8le
+ve4kli
+2veko
+2vekr
+3veks
+vek4st
+veks4t5r
+1vekt
+vek4t5an
+vek5to
+vek4t5r
+2vekå
+5vel.
+ve4l5as
+5velat.
+5velatp
+6veld.
+vel4del
+8velds
+4veled
+6velei
+7velet
+4velis
+4velit
+6veliv
+2velo
+5veloc
+vels2
+vel3se
+velses5
+vel3sm
+vel5sp
+vel5st
+4velug
+vel5un
+vel5v
+2vely
+2velæ
+2velø
+velø8pa
+2vem
+ve5ma
+1ven
+ve8na.
+4venem
+ve5net
+ve6nete
+4venev
+ve4nin
+ven6n5i
+vennle7
+ve2no
+ven6sti
+ven6str
+vent6a
+ven5t6r
+vent4s
+4venty
+2venu
+ve4nus
+ve5ny.
+4venya
+ve4nym
+2ve3o4
+2vep
+1v8er.
+ver5ak
+ver3al
+8verau
+ver6des
+ver6din
+ver6dir
+verd7v
+ve3re.
+4vered
+4vereg
+5vereig
+4verek
+ve4rel
+ve6r7eng
+4verenn
+4verep
+ve5rer
+ve5res.
+4verett
+4veretu
+verfø5re
+ve9ri.
+veri3a
+ve4rial
+ve7rie
+4verik
+ver3il
+5verkn
+ver5m6
+ver6nal
+vern6s5
+ve9ro.
+ve3rom
+ver8ska.
+ver5ski
+ver7spo
+verta8la.
+verta6le.
+ve1ru
+5verum.
+6very
+verø6
+ver3øs4
+4verå
+v4es
+3ves.
+2ves4a
+ve5san
+4veset
+4vesh
+4vesi
+4vesj
+4veski
+2vesl
+ve9sli
+ve1s2m
+6ve3so
+4vesp
+ve6s3per
+ve5sted
+ves6t5end
+vest5o4v
+4vestr
+4vestu
+4vestø
+vesva7
+5vesynds
+2vesø
+ve1så
+veså5re
+v4et
+1vet.
+2veta
+8vetaka
+4veteg
+4vetek
+ve5te6s7
+6vetev
+2ve7ti
+4vetj
+2veto
+ve4to.
+veto7e
+9vetoke
+9vetoks.
+ve4tor
+2vetr
+1vets
+vett5sk
+6vetv
+4vety
+vety8e
+2veu
+ve8um
+2veva
+ve6vak
+ve5van
+ve9var
+2vevi
+vevi8sa
+vev4sm
+vev4sp
+2veø
+2veå
+1vê
+2v1f
+vfall4
+vfø7re.
+2v1g2
+v4ga.
+vga4le.
+vga6li
+vga8ve.
+v9ge
+v4gi.
+vgjer6s7
+vgo4
+v4gå.
+2v1h
+vhø4re.
+1via
+vi1an
+vi6bl
+vice5s
+1vid
+vi5de
+vide4o7
+vi4d5o4
+vid3r
+vid3s4
+vi1el
+vi5end
+vig4m
+vi4gu
+vi5gø
+vi4kat
+5vikb
+vi5ked
+7vikg
+vik5ke
+vik5n
+vi2k3o6
+3viks.
+vik5sa
+vik5s6l
+4vikt
+5vikti
+vi4k5ø4
+vi2l1a
+vi5la.
+vi4les4
+vi4l3in
+1vilj
+vil4l5an
+vil4led
+ville6de.
+vil4lei
+vill9ep
+6v5illu
+vil5m
+vil1o
+vil4sti
+vilt7o
+vil6tret
+vil4tri
+vi2lø
+4vim
+vim7p
+vim7u
+4vindl
+5vindu
+vine5st
+v6ing
+4vingn
+vin5gom.
+ving3r
+vin8g9u
+vin3na
+vin4ned
+6vinnh
+4v5innl
+4v5inns
+4vinnt
+vi6n5o6ver
+v2in2s
+vin7sja
+vin4tes
+vin5tre
+vi8pa.
+vi6pe.
+vip5s
+1vir
+4viro
+7viru
+vis3ab
+vis3ak
+vis5and
+vi4see
+vi3sen
+vi6seng
+vi2s1k
+visk6re
+vis5m
+vi1so
+vis3om
+vi4sp
+vis9pa
+viss4p
+vis5ti
+vi4tak
+vi5tese
+5vi6t5j
+vi4t3o
+vi4tr
+vit7ra
+vit5re
+vit5skr
+vit6te6s7
+vi4t5un
+vitun6ge.
+vi4t5øy4
+vi4va.
+vi6ves
+vivi3
+v1ja
+v1je
+vje4t5a
+vje5t6e
+vje4t5r
+vjet3t
+vje4tu
+v1ji
+4v5jo
+vju3t
+6v3k6
+vk4le
+vk4ler
+vku4le.
+6v1l2
+v6lab
+vla6ga
+v9led
+v9leg
+vlei9e
+vl6el
+vle4se.
+v5lesn
+vle5str
+v6lesv
+vli7v
+vls9
+vlu9sa
+2v1m
+vma8le.
+vmo8de.
+vmord4
+vmå8la
+2v1n
+v3nad
+vna8ke.
+vn5al
+v9nar
+vn5dy
+vne7b
+v2ned
+vne7de
+v4nele
+v4neli
+v4nelo
+v2nem
+vne5r6e
+v4nero
+vne1s
+v4nesta
+v6neste
+v2nev
+vnor9s8kas
+vn4s5pa
+vn1s4t
+vn5t4
+vnæ4re.
+vn5ør
+vo1al
+vo2ar
+6vob
+2vof
+vof8fan
+vo4gu
+voi1
+1vok
+4voko
+voks3k
+vok6s5
+1vol
+voli7
+vo4litu
+vol4tes
+2vom
+vo4na
+vo9nal
+vo9nar
+von5de
+vons6
+von5sh
+2v1o6p
+2vord
+vor8da.
+vo1re
+vo9ren
+2v1org
+4voro
+vors7k
+1vos
+4vosj
+vos4se
+vo4teg
+vo4tel
+6votr
+vo1v
+vo4ve.
+vo6vi.
+2v1p4
+2vr8
+3v6rak
+v7rar
+v1re
+vregi3
+6vrenge
+4vrengi
+v6rengj
+v6rengt
+vrett4s
+v6ri.
+3vrid
+7vrie
+v6rigas
+vri6ma.
+vri8me.
+v3ring
+vrin5s
+vri6ve.
+v1ro
+v4rob
+v4rof
+v4rok
+v4rop
+vro8te.
+v1ru
+v7ry
+vrø3ve
+v1rå
+vrå8da.
+8vs
+v6sa.
+v7sali
+v6se.
+v4seg
+vs3egg
+v3s4el
+v4s5e4li
+vse4n
+v5sen.
+v4s5eng
+v5s4ens
+v2ser
+v6si.
+vs1in
+v1sk
+vs8ke
+v6s5kum
+vs1kv
+v1sl
+vs3lan
+vs6let
+v6slik
+vsmå8la
+v1s2n
+v6s7na
+vs3ne
+vs3ny
+vs3næ
+v4s3nø
+vs5od
+vsom5
+vs5oms4
+v7son
+vs1or
+vs2pe
+vsre6de.
+vs7s6t
+vs4s5å
+v1s2t2
+vste6ma.
+vs3til
+vs1v
+vsø6ke.
+vsøl5
+v2s5øy
+vsøy4er
+v8så.
+vså7re
+2v1t
+vta1
+v4ta.
+vta8ka.
+vta6led
+vta9len
+vta4lev
+vta6s
+v5tepp
+v5t4i
+vti8na
+vti8ne.
+v5t4r
+v3t2v
+vty8e
+1vu
+vu2d1
+vud5d
+vuden5t
+vuds4
+8vué
+vu8k
+2vul
+2vung
+vun4ge.
+6vu6o
+2v1ut
+2v1v
+vva8la
+vve8g9ing.
+vve6g7inga
+vven7n6i
+vvi5ke
+vvi6k7l
+vvi8s9an
+vvi4se.
+2vy1
+vya4
+vy7ens
+1væ
+væ1ra
+væ9ret
+væ8ta.
+v3ø4d
+vø4l
+vø7li
+vøm4met
+3vøre
+vø6re.
+v3ørke
+vør8na.
+vø3se.
+v5øv
+4v1øy
+vøy6e
+vøy7ene.
+vøy9enes
+1våa
+1våe
+4våend
+v4åk
+vå8ka.
+vå4ke.
+vå4kene
+vå9kene.
+vå4le.
+1vån
+vå5ne
+4vånu
+vå3ren
+vå8sa.
+vå5tes
+6våtf
+våt7å
+w2a
+wa6l
+5wald
+wal4k
+walk5o4
+wal4l
+2wap
+war6d7er
+wash3
+1wat
+wa3z
+w1b
+wboy5
+we2
+weate7
+we7b
+we3g
+we5re
+wes2
+wes3s
+wester6
+western7
+wet5
+wett4
+w4i2
+wi9ar.
+wich3
+3wicz
+wi3d
+5wi6en
+wi9er.
+wi5f
+wi3ni
+wi5ra
+wi3ren
+wi5ta
+wk3r
+w1l
+w1m
+wn5s
+wob5
+wou6
+wout7
+ws5
+ws6k
+wurs6
+wy2
+w1yo
+wyor2
+wyork3
+w1z
+xan5t
+x7b
+x3f
+xga6
+x7h
+x1ic
+5x6id
+xi5e4
+x5k
+x1l
+x1p6
+x3r
+x1s2
+x7t
+x6u
+xy2
+ya7b
+1yac
+ya5f
+ya4h
+y1ak
+yak6te.
+ya2l
+y7am
+y1an
+y6an.
+y2ana
+ya4ne.
+yan7k
+yan7sl
+y1ark
+y7arr
+yas4
+ya5si
+ya5t
+y1av
+y1b
+yba4ne.
+yb4bed
+ybde3
+ybo2
+ybu6er
+ybue7re
+ybu7ern
+ybyg5
+y1c
+y8ce.
+y8cé
+y2co3
+y6dab
+yd5av
+4ydd
+yd6dela
+yd4dep
+y6d7enh
+y4deo
+y2dep
+y4dero
+y2d1is
+yd6je
+yd1ji
+ydo4
+yd3op
+yd5ov
+y1dr
+y4d4r5au
+yd1re
+yd5rem
+y4dro
+y4d4r5oks
+yd3si
+yds4v
+y2du
+yd1un
+ydø4
+y4døm
+ydør5
+yd1øs
+4y1e
+yed8l
+ye6dre
+y2ek
+y5eks
+ye4len
+ye6let
+yel4s5j
+yel4sk
+yels3m
+yel6s5t
+y2em
+ye2n
+y7e6ne
+y8ener
+y2enh
+ye5ni
+y2enk
+y2enl
+yenle6ge.
+yens4
+y4ense
+y3e6re
+ye4rel
+y3ern
+yer8sk
+y4erst
+yes2
+ye5sm
+ye2t
+ye9te
+ye5ty
+y2ev
+y1f
+yfan9
+yfjell4
+y4fle
+yf5le.
+y8ga.
+yga8ve.
+yg4dal
+yg4dek
+yg4del
+yg4dep
+yg2do
+yg2d1r
+yg2d1y
+yg2dø
+yge5i
+ygen5s
+y6geret
+y2ges
+y4gev
+yg6gam
+ygg7art
+ygges4
+yg5gj
+ygg5l
+yg6gr
+ygg3s2
+yg6gu
+yg6g5å
+ygi2
+y5glo
+yg7m
+yg6r
+y1h
+yhes5
+y1i
+y9in.
+yis7t
+y1j
+6yk
+y1ka
+ykap3
+y6kara
+y2ke
+y7kel.
+y5kelen
+y3keli
+y7kels
+y3ken
+y3ker
+y4kerel
+y4kero
+y5ket.
+y9kets
+y1ki
+y1kj
+y4kjar
+y5kjare
+ykjeva8ne.
+yk4kana
+yk4k5enh
+yk5kesj
+ykke6s5ta
+yk1kj
+ykk5ni
+ykk4s5k
+yk8k5vi6
+yk4ky
+yk1la
+yk6lest
+y1klo
+y3klub
+yk3lus
+y5klæ
+y1ko
+y2koa
+y6koli
+y4komo
+y5kosa
+y2kot
+y5koti
+y1kr
+yk1s
+yku6le.
+yk3var
+y1la
+yla8ga
+yl4dan
+yl4derk
+ylde4s
+yld1r
+yld5s6k
+yle6ge.
+y7les
+y4lev
+yligh9
+yl5k8
+ylke2
+ylke4s3
+ylkesla8ga
+yl4lev
+yll5is.
+yl3s6
+ylst7re
+yl5tet
+y8luse
+3ylven
+y1ly
+ylæ7re
+y6mei
+y4mete
+ym4fe5d6
+ym5jara
+y4mo.
+ymo5e
+ym3p2
+ym1s
+ym8sa.
+ym4se
+ym8sl
+ym6ta.
+ym6te.
+ymå6la
+y9n8and
+yndes8
+yn5det
+y2nel
+yn7eld
+yner3g
+yne5s4
+ynesi8
+y6nev
+yn5gel
+yn4gem
+yn2gr
+yn4g5ø
+ynko3
+yn6k5v
+yn5na
+yn5ne
+ynn3s4
+ynn4ø
+y3no
+y4no.
+yns1
+yns6are
+yn4sem
+yn9set
+yn2si
+yn2sk
+yns9ket.
+yns7ki
+yn5skj
+yns7kjele
+yn8s9kjer.
+yn4st
+yn2su
+yn4s5ver
+yn4tap
+yn8teg
+ynt5ei
+yn4tek
+yn6tete
+yo4gat
+yo6gi.
+y1om
+yon4
+yon5nen
+yo6nu
+y1o2p
+y1o2r
+yor6da
+yo5re
+you4
+yout5
+yp8e
+y2pe.
+y4pee
+y4pena
+y4penet
+ype4rel
+y6peta
+y1pi
+y4pi.
+y7ping
+yp5inn
+ypin8na
+y1p2l
+y5po
+yp7p6a
+yp3pe
+y1pr
+yp5s8
+yp4tok
+y3pu
+y1ra
+yra8ka
+y4r3a6l
+y7rarb
+y4r5au
+yr5av
+yr7da
+yr5dø
+y7real
+yre3in
+y5reis
+yrek4
+y7rek7k
+y3rels
+y5rems
+y1ren
+yre9ne
+y4reo
+y6rerel
+y4rero
+yre5sc
+y5rest.
+yre5ste
+y5reste.
+yres6ten
+y1ret
+y4reta
+y4rete
+y4reto
+y7retø
+yr7ga
+y1ri
+yrin5g6
+yri6ene.
+y4rif
+yri8ka.
+yr3inn
+yris6p
+yr4kee
+yrke4s
+yr5kj
+yr3m
+y7roe
+y3romm
+yr1op
+y5rosk
+yr5r8
+yr4san
+yr7set
+yr5sk
+yr6skj
+yr6skr
+yr2sp
+yrs7tan
+yrs5tar
+yrs7tene
+yrs5tens
+yr3sti
+yr4sv
+yr3te
+yr6tek
+yr2t3r
+yr3tra
+yrty8
+y1ru
+yrul8la.
+yr5ut5r
+yr3v
+y1ry
+yr3øk
+yrøy4
+y1rå1
+yråd2
+yrå8da
+yråde7r
+yrå6ders
+y4rådi
+y2råm
+y6råst
+y4råt
+y4råv
+2ys
+y1sa
+ys6a7kers
+ys4e
+yse4bu
+y4sed
+y4see
+yse5ei
+y2seg
+y2sek
+ys7ekte
+y2sem
+y4sera
+yse7rid
+yseri7e6
+y4sesj
+y4sesk
+y4se5s6l
+y4sest
+y5seste
+y6sesu
+y9set.
+y4seu
+ys6i
+ysi8e
+y5sjk
+y7skag
+ys6kara
+ys7kare
+ysk9au
+ys2k3l
+ysk5øs
+ys4mi
+ys4nø
+y1so
+y4s5or
+ys2pe
+ys5pis
+y5s4po
+ys6sak
+ys6sam
+ys4s3ei
+ys4s3ek
+ys4s5il
+ys2sj
+ys4sku
+ys2so
+ys2sp
+yss5pe
+ys4sta
+yss5tab
+ys4s5ti
+ys4su
+ys2s5v
+ys2t
+ys3ta
+y8star.
+ys4tat
+ys3tel
+ys3ten
+y4s3ter
+ysterie7n
+ys7tesl
+y2s3ti
+yst3op
+yst3r
+ys5t6ry
+ys6ty
+y1su
+ys1ve
+ys5år
+y1ta
+y4t3ana
+y2tee
+y4tef
+y2teg
+yt5e4ge
+yte3in
+y4teka
+y4teki
+y4tena
+y4teno
+y2teo
+y4teret
+yte6ro
+yters6
+yter5ske
+yte5r6ø
+y2tes2
+y2tet
+y3t2hi
+6y5til
+y6tj
+yt9ja
+yt5jen
+yt9jer
+yt4mei
+yt4mes
+y3to
+yt8ra
+yt4re.
+yt5rer
+yt1ri
+yt4rik
+y5trå
+yt4s3en
+yt3sk
+yt5sv
+4ytt
+yt5t6a
+ytt4e
+ytte8r9end
+yttes6
+yt4test
+yt8tien.
+yttsa6me.
+2y3tu
+y1ty
+yt4ys
+y7tå8
+y1u
+y6ua
+y8ue
+yu8g
+yu4l
+y1v
+y4vak
+yva8la
+y2ved
+yve4ria
+yve4ris
+y4vese
+y6vesy
+y6vev
+yvi8sa
+yvi6se.
+yv1år
+yvå5te
+y1w
+y5æ
+y5ø
+y1å2
+za5b
+3zae
+4zaes
+za4g5
+za5k6h
+zani4
+zania5
+5za5v
+z1b4
+zbu4
+z1c
+z1d
+1ze
+zea1
+zebu9
+zeli5
+zen3s
+4z3ense
+4z3ent
+z1f
+z1g
+5zha
+z3hi
+z5hu
+5zie
+1zifi
+5zing
+z5int
+1zis
+6zisty
+4zi5s4v
+2zisy
+z1k
+4z1l
+z1m
+5zo.
+5zoe
+zo1f2
+zo4no
+zo5re
+6zos
+z1p
+z5r
+z1s
+4z1t
+zu3e
+z1un
+z1v
+z1za.
+z2z3el
+æ5by
+æ2bø
+æ5de
+æ7di
+æ1f
+æg6
+æ2k
+æ3ke
+æ5ki
+æ8kj
+æk1ja
+æk7je.
+æk9jer.
+ække7
+ækkel6
+æk6l
+æ1la
+æ4le.
+æ2le3d
+æ4lena
+æ4lev
+æl5j
+ælsle9
+æ4r1ak
+æ3rane
+æ4rans
+æ4rarb
+æ6rarbe
+ær4arte
+æ4r1at
+ærbu5e
+ær1d4
+æ1re
+æ2rea
+æ4red
+æ2ref
+æ2reg
+æ8r7ei
+ærei6e
+æ2rek
+æ6r7eld
+ære5ne.
+ære7nes
+æ2rep
+æ5rern
+æresa4m
+ære6skr
+ære4sl
+ære4sp
+æ4reta
+æ4retek
+æ9rets
+æ2rev
+4ærf
+ærgen5
+ærhø8
+æ1ri
+æri6e7ne
+æ4r3il
+ær3ins
+æri6s
+ær5is.
+4ærk2
+ærle6ge.
+4ærm
+ærmå8la
+ær3n
+ær5ne4
+ær4nå
+æ2r7o6
+ærom5
+æroms4
+ær5r
+ær6sel
+ær4s5il
+ær1sk
+ær7s6no
+ær2sp
+æ2r1u
+ærut5
+ær3v
+æ2r1ø4
+ærøy7e
+ær3å4
+æ8se.
+æ2sj
+æ2s1k
+æ5ta
+4æte
+æ4te.
+æt4r
+æt4ta
+æ5va
+ævar5
+æve4s
+æ5vi
+6ø1a2
+øa7re
+øau4
+ø1b
+øbe6lev
+øbe4li
+ø2bl
+øbl9u
+øb4r
+ød3ag
+ø4dak
+ød3d
+ød9de.
+ø2de.
+ø4dede
+ø6def
+ø4dela
+ø4dem
+ø4deo
+ø4deri
+ø4dero
+ø5dj
+ød1r
+ød4red
+ød4rek
+ød4rep
+ød2sc
+ød6s5ek
+øds7ke
+øds4ko
+ød6sku6
+øds4mu
+ød8t5om
+ødt6r
+ø2du
+ød3und
+ø4d5ur
+ø6d5ø
+4ø1e2
+ø4ed
+ø5ene
+ø5ep
+ø3e6re
+øfe8
+øf3fe
+øf6j
+øf8la.
+øf8le.
+øffe8l7a
+ø5fn
+øfte5s
+øg1
+øg2a
+øg5ak
+øg5al
+ø7gar
+ø5gas
+ø3ger
+øg5gl
+øg8gå
+ø7g4j
+øglo8ve
+øgn6s7p
+ø2g2r
+øg5re.
+øg5res.
+øgs2
+øg4ste
+øg4str
+øgta5
+4øg4u
+ø1h
+ø4i
+øi4e
+ø5ing
+ø5isk
+ø4it
+ø1j
+6øk.
+6ø1ka
+ø5kav
+øka8ve.
+ø6keh
+ø4kelo
+ø6kerada
+ø6kerel
+ø4ke5ru
+øke1s
+ø6kese
+ø8kesl
+ø4kest
+ø4kete
+ø1ki
+4økj
+ø5kjare
+ø5kjas
+ø1kje
+2økk
+øk5kel
+øk5ket
+øk4k5l
+økk5r
+øk3lag
+øk3lan
+2økna
+1øko
+øk5opp
+ø1kr
+ø8krar
+øk8sa.
+øk6se.
+øk4ses
+øk4si
+øk2so
+øks1t6
+øks5ti
+øku4r
+øk5ur.
+øk5ure
+øk7ve
+ø7ky
+ø1la
+ø2lah
+ø6lam
+øl3d
+øled
+ø4ledi
+ø6lelu
+ø4lero
+ø6leta
+ø4le5te
+ø2lev
+øl4gera
+ølge5s6v
+øl1j
+øl2ke
+ølke7s
+øl4lese
+øl9leti
+øl6lev
+ø1lo
+øl7op
+ølrå4
+øl6sel
+øl4sere
+øl4se3s
+øls6t4
+øl5s4v
+ø5luk
+øl7ut
+ølva6
+øl4var
+øl4v3ei
+øl6vek
+øl8vel
+ølv7erk
+øl4v3in
+ølv5o
+ølv7r
+ø1ly
+ø4me.
+ø9met
+1ømfi
+ø5mi
+ømini6
+øm4med
+øm4mero
+ømmet6
+øm4metr
+øm3op
+øm4pel
+øm7s6p
+øm1st
+øm5svi
+ø2m1u
+ømå8la
+øn2ad
+ø6n5al
+ø5nas
+ø2nem
+ø3nes.
+ø9nese
+ønhø8re.
+4ønn
+øn4nal
+ønni4
+øn4n5it
+ønns5al
+ønn4s3e
+ønn4s5i4d
+ønns5kje
+ønns5kre
+ønns5ku
+ønns3l
+ønns3t
+øn2nø
+ø6nom
+øn2s
+øn9sa.
+øn5sak
+øn5sam
+øn5se.
+øn3ser
+øn3skj
+øn8skjer.
+ønst3r
+ønst9ra
+ønt1
+øn2ta
+øn2to
+øn7u8
+ø1o
+ø4peda
+ø6pe5i
+ø4penu
+ø5pero
+ø4peru
+øpes4
+ø4pete
+ø4peti
+ø1pi
+øp3li
+øp5p
+øp6pl
+ø1pr
+øp6s1
+øpsa4
+øpsla8ga
+øps8leg
+øp5ste
+øp4s5ø
+ø1ra
+ø2ra.
+ø2r1af
+ø2r1ak
+ø2r1a2m
+ø4rans
+ø4r3ant
+øra8sa
+øra6si
+ø4r7au
+ørd4e
+ø1re
+ø2rea
+ør7edd
+ø6redu
+ø2ref
+ø2reg
+ø6rein
+ø2rek
+ørek6l
+ør3eks
+ør5ekt
+ørele8se
+ø9relet
+ø4r5eng
+ø2re5o4
+ø2rep
+ø6reret
+ø4reru
+øre1s2
+ø5res.
+ø4rese
+ø6resi
+ø7reskrivi
+ø8reso
+ø4rest
+øre6s7v
+ør6et
+ø4reta
+ør1eu
+ø2rev
+ør5fe
+ørge5s
+ø1ri
+øri8m
+ør4jet
+ør4keri
+ør4kes
+ør8k9lag
+ør6k5n
+ør4kve
+ør4kå
+ørla8ga
+ørm9ut
+ørn4e
+ør4nere
+ør4nes4
+ør4n3u
+ør4n5ø
+ør1o
+ø5r6ok
+ø1ros
+ø4r3ost
+øro4v
+ør4rek
+ør4rep
+ørri4
+ør4r5is
+ør4råt
+ør4sak
+ørsa8ka
+ørsa6me.
+ør4sc
+ør6ses
+ør2si
+ør5ski
+ør4skr
+ørs6lev
+ør4som
+ør4spe
+ør2st
+ørs9tar
+ørste5i
+ørs5tens
+ørs5tig
+ør3sto
+ørs9u
+ør2sv
+ørs1å
+ør9tar
+ør4tek
+ør6ti9a
+ør4tide
+ør8tien.
+ør6tif
+ør3to
+ørum5
+ø6rut
+ør5v
+ør1ø2s
+ørø1v
+ør1åp
+ø1sa
+øsa6me.
+ø8sarar
+ø1sc
+ø2se.
+ø2sem
+øse4n5o
+øseri7
+øserie6
+øs5jo
+øs7kar
+øs1l
+øs4lag
+ø4slu
+øs2me
+ø1s2p
+øs8tas
+øst9ast
+øs6teg
+øs5terse
+øst9ett
+østo2
+øst5of
+øst5ov
+øst1r
+øst3re
+østø4
+ø2s1ø2
+4øt
+øt3ak
+ø9tar
+øta4s
+øt5asa
+ø2te.
+ø2tea
+ø6tef
+ø6tege
+ø2tei
+ø2t5eks
+ø2tel
+ø5tela.
+ø3ten
+ø4teni
+ø3ter.
+øte3ru
+ø2te1s
+øte7sn
+ø4teta
+øt7ri
+øt1sa
+øt3s4p
+øt7s6å
+øtså9re
+øt4tero
+øt6test
+øtt5av
+øtt5eks
+øtt5eta
+øtt5ete
+øtt5ra
+øtt7ri
+øtt1s2
+øttså7re
+øt4tur
+øt4ty
+ø1tu
+ø5ty
+ø1u2
+øug8la
+øv5aa
+øv5ans
+øve5in
+ø4vek
+øve5no
+øveren8
+øve1s
+øves4t
+øve3te
+ø5vik
+øv6l7ut
+øv7ne
+øv6nø
+øv9o8
+øv1r
+øv5reb
+øv1s
+øv9sa
+ø5vå
+øy3al
+øya2n
+7øyan.
+9øy8ans
+øy4dek
+øy4dere
+øyd8i
+5øyeb
+øy7e4de
+øy2ee
+øy4ele
+øye4n
+øy4ep
+øy4erf
+øy1gl
+øy3ke.
+øyks4
+øyk5t
+2øyl
+øy4led
+øy4leg
+øy5na
+øy5ni
+øy3o
+6øyp
+øy3pe.
+øy4pel
+øy4ra.
+øy5rer.
+øyri6v
+øy3rø
+øy1s
+øy5s4ar
+øy5si
+øys2l
+øy4sm
+øy4spi
+5øysund
+øy4tei
+øy4tel
+øy4tere
+øyte5s6
+øyti7da
+øy1tr
+øy2t3y6
+øy5tø
+øy4vei
+5øyvå
+ø1ø2
+ø5å6
+å1a
+åak6ta
+åa4n5
+åan8ka.
+åan6ke.
+å2ar
+å5aran
+åau4re
+å1b4
+åba8ne.
+åber2
+åbo9ta
+6å1d
+å7dan
+å9dar
+å4ded
+å4dek
+å4dem
+å4deo
+å4dep
+å4dere
+å4deri
+å6dero
+å2des
+å7di
+åd4ra
+åd8re
+åds1
+åd2sk
+åd3s4la
+åd7slo
+åd3slå
+åd1s2n
+åd3s4pe
+åd7spu
+åd5st
+åd6s7te
+4å1e
+å2ele
+åem8na
+åe2n
+å7ens
+å3er
+å3e6re.
+å1f
+åfe6
+åfø5re
+2åg
+å4ga.
+åg7ald
+å4ge.
+åg7ei
+å2ges
+ågna5
+åg5ne
+åg4r
+åg5rin
+ågs6k
+åg5sl
+åg7sp
+ågs4t
+ågu4l
+åg5ø
+å4gå.
+å1h
+å1i
+å1j
+å1ka
+å3kan
+å3kar
+å4karb
+åk7av
+å4keh
+å3ken
+å4kena
+å4k3enh
+å4kere
+åke5s
+å4kesl
+å5kevi
+å1ki
+å6kid
+å1kj
+åk1k
+åk5ka
+åkk6l
+åk7kr
+åk7lau
+åklist7
+åk3læ
+å1ko
+åk3opp
+åko4s
+åk6ra
+åk5røk
+åk3rå
+åk1s2
+åks7l
+åk3t4
+åku8
+å5k8ul
+åkva8la.
+åkøy8rar.
+å2k3å
+å1la
+å5l6amp
+å6larb
+å9las
+ål5au8
+ål9av
+ål3d
+å2lef
+ål5eini
+å2lek
+å2lem
+å4l5enh
+å4leni
+åle6ris
+å2le1s2
+åle9s6und
+å4lete
+å2lev
+ålgå6
+å6lio
+ål5j
+ålla6ga
+ål3or
+ål4san
+ål4sek
+ål4ser
+åls7i
+ål2sp
+ål4sti
+ålsy8na
+ål5ti
+ålti5d
+ål1u
+ålul8la
+å1ly
+å2l1øy
+åløy4e
+ål5å6k
+ålå8te.
+6åm
+å6me.
+åm4li.
+åm1om
+åm5øy
+å3nar
+å9nas
+ånd3r
+ånd4sa
+ånd4se
+ånd4so
+å4ne.
+åned4
+åneds5
+åne5i6
+å2nel
+ånely6
+å5nes.
+å3net
+å4netr
+å3ni
+ån5o
+å9ny
+å3o
+åp2e
+åpe4n3a
+åpe4n5i
+åpen3s
+å5per
+å6pero
+å1pi
+åp6j
+å1pla
+åp4ne.
+åp7p
+å1pr
+åpra5
+åp2s1
+åp6ta
+å4på
+år3ak
+å9ran
+å7rara
+ård5str
+å2re.
+å5rei
+å6rel
+åre7s
+å4rest
+årfi4
+å7riv
+år3k2
+år4le.
+2årn
+årn5s
+år3on
+år3op
+årpo8
+år2s
+års5af
+års3el
+år3sem
+års3ko
+år8sku
+årsla8ga
+år3sol
+års3ta
+år7ste
+års3ti
+år7sto
+år5stu
+års1u
+års1v
+år5sy
+år5u4k
+år3un
+år5y4
+å1rø
+å5r8å
+ås2
+å1sa
+ås7au
+å4se.
+å4see
+ås5eid
+å4sek
+å4sem
+åseri7e6
+åse3s2
+å4sesm
+å4seso
+åse5ta
+ås3h
+å8si.
+ås5ka.
+ås9kene
+ås8ki
+å1skj
+ås7kop
+å1skr
+å5sku
+å1sl
+ås5ne
+ås3ni
+å5so
+å1sp
+ås7pl
+ås5sa
+ås5se
+ås3si
+åss3k
+4å1st
+å7stei
+åsu4
+ås3un
+ås7ut
+ås7væ
+ås5øy
+åså9
+å1ta
+å4ta.
+åtaks5
+åta2l
+åta9la
+åtale3
+åta5le.
+åta5len
+å4tang
+å4tark
+å4t5arm
+å2te.
+å2tea
+å4tee
+å2t1ei
+åte6ke.
+å4teo
+å9ter
+å2tes
+5åtferd
+å5ti
+åti7da
+2åtn
+å1to
+åt7ov
+6åtp
+åt1re
+åtri6pa.
+åtri8pe.
+åt1ru
+åt5sk
+åt1t
+åt4ted
+åt4ti
+ått3o
+åt4tri
+åtts4
+åt6t5æ
+åt1u
+åt4un
+åtva5ra
+åtva7re
+åt5ve
+å5ty
+åt1øv
+å3u
+åun8ge.
+å1v
+åv4a
+å2ve7d
+å4veg
+åve5l
+å4veni
+å9ver.
+å2vev
+åv7s6
+å7vy
+åvæ4re.
+å1ø8
+åøy4} \ No newline at end of file
diff --git a/tex/context/patterns/lang-nb.rme b/tex/context/patterns/lang-nb.rme
new file mode 100644
index 000000000..48bfa041a
--- /dev/null
+++ b/tex/context/patterns/lang-nb.rme
@@ -0,0 +1,134 @@
+% generated by mtxrun --script pattern --convert
+
+% Adapted to the new pattern-loading scheme.
+% Original file name was nbhyph.tex
+
+% TeX hyphenation patterns for Norwegian Bokmal
+%
+% Version 2007-02-10
+%
+% Copyright (C) 2007 Karl Ove Hufthammer.
+% Copying and distribution of this file, with or without modification,
+% are permitted in any medium without royalty, provided the copyright
+% notice and this notice are preserved.
+%
+% This file contains hyphenation patterns for Norwegian Bokmal.
+% It uses the Norwegian hyphenation patterns from nohyphbx.tex,
+% created by Rune Kleveland and Ole Michael Selberg. Please see
+% that file for copyright information on those patterns.
+%
+% The patterns in nohyphbx are based on both Norwegian Bokmal
+% and Norwegian Nynorsk, and works about equally well for both
+% languages. This file, nbhyph.tex, contains only a few hyphenation
+% exceptions, for words that needs to be hyphenated differently for
+% the two languages.
+%
+% Please send bugs or suggestions to karl@huftis.org.
+%
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: nohyphbx.tex (2007-02-07)
+% Author:
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% TeX hyphenation patterns for Norwegian
+%
+% version of 2007-02-07.
+% Patterns of January 25, 2005, with later additions and changes
+%
+% Copyright (C) 2004, 2005 Rune Kleveland, Ole Michael Selberg.
+% Copying and distribution of this file, with or without modification,
+% are permitted in any medium without royalty provided the copyright
+% notice and this notice are preserved.
+%
+% Please send bugs or suggestions to tex-live (at) tug.org.
+%
+% Originally generated by a script written by Rune Kleveland
+% from dictionaries available from
+% http://folk.uio.no/runekl/dictionary.html.
+%
+% Adjusted manually by Ole Michael Selberg to prevent
+% numerous wrong hyphenations, especially in compounds.
+%
+% Changes from the former version of 2005-06-29:
+% 388 new patterns. Some old patterns have been deleted or changed.
+%
+% In Kleveland's nohyphb.tex there are 26017 patterns.
+% This version of the revised nohyphbx.tex contains 27149 patterns
+% --- plus 45 exceptions in the \hyphenation-list
+% (which you may change to suit your personal needs).
+%
+% To load these hyphenation patterns the parameters
+% of TeX must have the following minimum values:
+% trie_size = 33385
+% trie_op_size = 815
+% (The corresponding values for nohyphb.tex are
+% trie_size = 31900 trie_op_size = 636)
+% If you want to load more than one set of hyphenation
+% patterns the parameters have to be set to a value
+% larger than or equal to the sum of all required values
+% for each set.
+%
+% Notes on other Norwegian hyphenation pattern files, from Dag Langmyhr,
+% tex-live mail of 29 Jun 2005 11:26:21 +0200.
+% nohyph.tex -- manually created by Ivar Aavatsmark and others;
+% hyphenate according to pre-1973 rules; no longer recommended for use.
+% (Sometimes also known as nohyph1.tex.)
+% nohyph2.tex -- created by Dag and a student; the present file,
+% nohyphbx.tex, is more extensive and is recommended.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-nl.hyp b/tex/context/patterns/lang-nl.hyp
new file mode 100644
index 000000000..a65f61ed4
--- /dev/null
+++ b/tex/context/patterns/lang-nl.hyp
@@ -0,0 +1,47 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-nl.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v w
+
+\hyphenation{
+aan-dachts-trek-ker
+aan-dachts-trek-kers
+acht-en-der
+acht-en-ders
+acht-en-der-tig
+acht-en-der-tig-ste
+be-heers-ta-ken
+be-scherm-en-gel
+be-scherm-en-ge-len
+be-stuurs-la-gen
+be-stuurs-ta-ken
+bij-stands-trek-ker
+bij-stands-trek-kers
+bui-ten-an-ten-ne
+bui-ten-an-ten-nes
+don-der-aal
+han-dels-taal
+her-e-nen
+ket-ting-ste-ken
+lands-taal
+meest-al
+mi-nis-ters-por-te-feuil-le
+mi-nis-ters-por-te-feuil-les
+ont-hoof-din-gen
+pa-ling-ste-ken
+rechts-taal
+schil-ders-ta-lent
+sou-ve-niertje
+sou-ve-niertjes
+spie-gel-ei
+ver-en-gels-te
+ver-hol-lands-te
+ver-in-lands-te
+ver-kinds-te
+ver-ne-der-lands-te
+ver-rechts-te
+ver-steeds-te
+wals-te
+wa-ter-staats-in-ge-ni-eur
+wa-ter-staats-in-ge-ni-eurs} \ No newline at end of file
diff --git a/tex/context/patterns/lang-nl.pat b/tex/context/patterns/lang-nl.pat
new file mode 100644
index 000000000..205b43700
--- /dev/null
+++ b/tex/context/patterns/lang-nl.pat
@@ -0,0 +1,12731 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-nl.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z ä ç è é ê ë î ï ñ ö û ü
+
+\patterns{
+.a4
+.aan5
+.aarts5
+.aat5
+.ab5l
+.acht5end
+.ac5re
+.adi5
+.af3
+.af5l
+.af5s
+.aftu5re
+.al3ee
+.al3f
+.alk4
+.al5ko
+.alko5v
+.al5ma
+.al3om
+.al4st
+.ana3s
+.an3d2
+.an3en
+.an3gl
+.an5th
+.ar5d
+.ar5tr
+.as5h
+.as5l
+.as3t
+.as5tra
+.as3u
+.at4a
+.ave5n
+.b4
+.be3la
+.be5ra
+.be5ri
+.bos1
+.c4
+.coo5
+.co3ro
+.cus5
+.d4
+.daar5
+.da4gi
+.dag5r
+.da2k
+.dan2
+.debe4
+.de2k
+.dek5l
+.dek5s
+.den4k5r
+.de5od
+.de3ro
+.de5sta
+.di4a
+.die4p
+.di3o
+.doet3
+.do3v
+.du4w
+.e4
+.ede2
+.edel5a
+.ed3w
+.ee4n
+.eer5ste
+.eest3
+.eesto4
+.eet3
+.ei3l
+.ei5sc
+.ei3sp
+.ei5t
+.el4s5
+.en5s
+.en5th
+.ep4a
+.ere5s
+.er2f
+.erf3l
+.er3in
+.ert4
+.erts3
+.es3
+.es5c
+.es5pe
+.es5tr
+.eten4
+.et4h
+.ets5te.
+.eu3
+.eus5
+.é2
+.f4
+.fel4s
+.g4
+.gaat5
+.gang5s
+.gea5v
+.ge3l4a
+.ge5le
+.gelo5v
+.ge3n4a
+.gena5z
+.ge5ne
+.ge5no
+.ge3ra
+.ge5r4e
+.ge5r4o
+.gerst5a
+.ge3s
+.ge5sk
+.ge5ta
+.ge5tj
+.ge5to
+.gid4
+.go4m
+.goot3
+.h2
+.handels5
+.her5in
+.hits5t
+.ho4lo
+.houd5s
+.i4
+.ide5o
+.ij4s
+.ijs5l
+.ijs3p
+.ijs3t
+.ik3
+.in1
+.in5d4
+.in3g4
+.in5gr
+.ink2
+.in5kr
+.in5kw
+.in3s4
+.in5sl
+.in5st
+.in5ta
+.is5c
+.j4
+.jor5
+.k4
+.ka3d
+.ka5g
+.ka4taa
+.kerk5l
+.kerk5r
+.kerk5u
+.ker5sten
+.ke4s
+.koot5
+.ko5pe
+.kop5l
+.ko3v
+.kun2
+.l4
+.laat5ste
+.le4b5
+.leg3o
+.le4g3r
+.leid5st
+.len4s3
+.le5r4
+.le4s3
+.le5th
+.lin5d
+.lof5
+.loot3
+.lo4s1
+.lu3e
+.lui5t4j
+.lu4s
+.m4
+.ma5d
+.ma5ï
+.meel5d
+.me5la
+.me5ni
+.merk5l
+.me2s
+.me4st
+.met5ee
+.mij4n5i
+.moot3
+.mor5sten
+.mo4s
+.n4
+.naat5
+.na3d
+.na3n
+.na3s4
+.nee5s
+.ne2p
+.nep3a
+.ne4s
+.ne5te
+.ne4t3j
+.neu4t5j
+.nie4t5j
+.noot5
+.nos5t
+.no5v
+.o4
+.oe4r5
+.oe4s5
+.oeve4
+.ol3f
+.om1
+.omme3
+.on3a
+.on3d
+.onde4r
+.on1e
+.on5g
+.on3i
+.on5k
+.on1o
+.ono5v
+.on2t3
+.on4tee
+.on4ter
+.ont5s
+.ooi5tj
+.oot5jes
+.op5ee
+.opi5
+.op5l
+.op3r
+.op5s
+.org4
+.os5
+.ove4
+.p4
+.pee5tj
+.peri5
+.pers5te.
+.piet5j
+.pits5te.
+.poort5j
+.po4st
+.puit4
+.pui5tj
+.pu2t
+.r4
+.raads5le
+.ran4d
+.rand5a
+.re4men
+.ren4o
+.reno5v
+.re5o
+.rie4t3
+.rij5sp
+.ring5s4
+.roe5tj
+.ro4l
+.ro4st
+.ro4t3h
+.ro5v
+.s4
+.sap3
+.sa5v
+.sci3
+.see3
+.seks5te
+.se5re
+.set3
+.se5v
+.side3
+.ski3s4
+.sneu3
+.sno2
+.so2k3
+.song5
+.spoor5tj
+.st4
+.ste4m
+.t4
+.taart5j
+.tan4da
+.te4a
+.te4f
+.tek2
+.te3le
+.ten5ac
+.te3no
+.ten4t5j
+.te3ra
+.ter4p5a
+.ter5s
+.te4s
+.ti2n
+.tin3a
+.tin3e
+.toe5pr
+.to4lo
+.to4p
+.to5v
+.tri3s4
+.ts4
+.tsa3
+.tuit5j
+.ty2r
+.u4
+.ui2
+.ui5s
+.uit1
+.uit4je
+.uke5
+.ur4a
+.vaat5j
+.ven4t5j
+.ve4r3
+.ves5p
+.vet3j
+.vie4r
+.vol5s
+.w4
+.wals5te.
+.wee4ko
+.wee4t3
+.we4l3
+.wen4s5t
+.west5r
+.win4s
+.xe3
+.y2
+.z4
+.zes5
+.zit5
+.zooi5
+4a.
+a4a4
+4aad
+aad1a
+aad1o
+aad1r
+aad5sap
+aaf5a
+4aag
+aag1a
+aag3e
+aag3o
+aag5r
+aags4
+aag3sa
+aag5so
+aag3sp
+aai3l
+aak1a
+aak3e2
+aak1o
+aak5r
+aak3sp
+aal5a2
+aal1e
+aal5f4o
+aalfo5l
+aal1i
+aal5k
+aal5m
+aal1o2
+aal3sl
+aal5so
+aal5spe
+aal5ste
+aal1u
+aam1a
+aam3o
+aam4sta
+aam4ste
+aan1a
+5aandee
+aand4r
+aan1e2
+aan5g
+aan5i
+3aanj
+aan5k4
+3aann
+aan3o
+aan3sp
+aans4po
+aant4
+3aanta
+3aanv
+aap1a
+aap3i
+aap3o2
+aap3r
+aar3a
+aar4d5as
+aar3e4
+aar1i
+4aarn
+aar1o2
+aar5spel
+aar4t5on
+aarts5l
+aar3u
+aas3e
+aas3i
+4aast
+aas5tr
+aat3a
+aat5e
+aat3h
+aat3i
+aat1o
+aat5r
+abak4s5
+aba4l
+abat4s
+ab5eun
+ab3ijz
+a2bon
+aboot4j
+abot4j
+2abr
+ab3ru
+4ac.
+a3cal
+a3car
+4ace
+ace3st
+4ach.
+a3cha
+2a1che
+4a1chi
+ach3l
+a1cho
+a3chr
+4achs
+ach5tec
+a1chu
+achuut5
+4ack
+ac3kl
+2acl
+2a3co
+2acr
+ac5res
+4acta
+4acu
+4ad.
+a5da.
+ad3ac
+ada2d
+ada4l
+ada2r3
+adas5
+2add
+a5de.
+ad3ei
+ade5re
+a5des
+a3det
+a5deta
+ad3e4te
+2adh
+4ad4i
+adi3al
+adi4oc
+adi4od
+4adk
+2adl
+4ado.
+a3doo
+2adp
+ad3rei
+a3d4ri
+ad3rol
+2ads
+ad5se
+ad3so
+ad1s4t
+ad5sta
+ad3ui
+ad3w
+2ady
+4ae
+aege4
+ae5k4
+a3e2p
+ae3r
+ae2s3
+ae4s5t
+a3eu
+a2ë
+a4ër
+4afa
+af3aa
+a2f3ac
+af4as
+af4at
+afd4i
+afd2r
+af5d4w
+4afe
+afee4
+4afi
+af3l
+4afo
+a5fo.
+a2foe
+afon4d
+af3op
+af5org
+af1r
+af3s4
+afs2c
+af5se
+3afsl
+3afsp
+aft4a
+af5tr
+af3ui
+2afy
+4ag.
+ag1a2d
+ag3af
+ag3a2m
+ag3ar
+ag3di
+a5ge.
+agee5t
+4a5gen.
+ager4s
+ag3ex
+a4gil
+ag3ind
+a4g3ins
+agi5ot
+4ag1l
+ag3of
+a4g3or
+ag4o3v
+a2gr
+ag4ra
+ag5rap
+ag3ru
+ag3sl
+ag4sle
+ag5slu
+ags2p
+ag3spe
+ag3spi
+ag1st
+ag3sta
+ag5str
+2agt
+agu5a
+a2g3ui
+ag3u4r
+a2g3uu
+2ah
+4a1ha
+4a5he
+ahe5ri
+a1hi
+ah3l
+a3ho
+ah5r
+ah5t2
+a3hu
+a3hy
+ai5a2
+ai4dr
+ai1e
+a1ij
+ai5k
+ail3m
+ai2lo
+a2in
+aio4
+ai3ov
+ai3s4
+ai5sc
+ai4s5l
+ai5sn
+ai1so
+ai1st
+ai5tj
+ai3tr
+aiu4
+aïn4
+aïns5
+aïs3o4
+2a1j
+ajaars5
+aka2
+ak3af
+ak3ag
+a4k3ar
+a4k3ed
+ak3emi
+ake2t
+ak3id
+ak3ink
+ak5is
+1akko
+4a2k3l
+a2k3n
+ak5ne
+ak4ni
+a3kof
+ak3on
+ak3o2p
+a2kr
+ak5ru
+2aks
+ak4so
+ak5spe
+ak1st
+ak5to
+ak5t4w
+a2k3u4
+ak1w
+ak3wi
+a1la
+a4l3ach
+al3adr
+a3l4ag
+a3lal
+a5lapr
+al3art
+4ald
+a1le
+a5le.
+al3eff
+2aleg
+a2l3el
+ale5ro
+ale5ste
+ale4tj
+a3lè
+al4fen
+alf3l
+al5fon
+alfu4
+al2gl
+a3lie
+al3int
+alk5ei
+al5kle
+alk3s
+al4kui
+al5le
+al4mac
+al5me
+a1lo
+a4l3ol
+alo2n
+al3ou
+a4l3o4v
+2alp
+al3s4ag
+al3san
+al3scr
+als5j
+al2sl
+als5li
+als5m
+al4sn
+al4s3oo
+al4stem
+al5sten
+als5tou
+altaar5
+al3tha
+al4t3ro
+alt4st
+a1lu
+a2lui
+al3uit
+al3u4r
+alu2s5
+4am.
+a4m3ac
+am3adr
+ama4f
+4amag
+am3art
+5ambt
+ament4j
+ame4ran
+ame5tj
+a2meu
+am4i
+4amm
+am3oli
+a2m3o4v
+3ampè
+am2pl
+am4ple
+am4sm
+am4s3o
+am4spr
+ams5te.
+a2m3ui
+a3nad
+an3alg
+an4a3n
+an3arc
+2anc
+4anda
+anda4d
+and5ank
+an4d3e4d
+an4dex
+2andj
+an4dom
+an5d4ri
+and5roo
+ands5lo
+an4d3ul
+a4nem
+a3nen
+anen3i
+4aner
+an3est
+ane3us
+4ang.
+an4gan
+anga5p
+ange5st
+ang5le
+an2gr
+ang5sna
+angs4te
+aniet3
+anij4
+3anima
+an5ion
+a4n5isl
+ani5t
+4aniv
+4ank.
+an4kaa
+anka4n
+an4k3as
+an2k3j
+an4klu
+ank3of
+an2k3r
+a1no
+an3och
+a4n3oor
+an3ork
+ano3s
+ano3t4
+a4n3ou
+ano5v
+4ans
+an3san
+ans3cr
+an4seg
+an4serv
+an4sid
+an2so4
+ans5or
+ans3pi
+ans5pir
+an1st
+an4s5te.
+an5stru
+an4tac
+ante4n
+an3th
+2anti
+ant5sl
+ant3w
+4a1nu
+a5nuf
+an3ui
+an3ur
+an3uu
+anze5s
+2a1o
+ao4g
+ao2l
+a4om
+a2op2
+aor5t
+a3os
+aos3p
+aos5t
+4ap.
+a1pa
+a4pak
+a4pas
+ap3as.
+ap3ass
+a1pe
+ap5eten
+4a1pi
+apij4t5j
+ap3ijz
+ap1j
+2apl
+ap3le
+ap3li
+ap3lo
+a1plu
+apon5
+ap3oo
+apo3p
+apo5sta
+ap3o4v
+1appa
+4appen
+4apr
+ap3ra
+a3pre
+a4prem
+a5p4ris
+ap3ru
+ap2sa
+ap4si
+ap2s3l
+ap3sn
+ap4ste.
+2apt
+ap3tj
+2apu
+a2q
+4ar.
+a1ra
+araat5j
+a4r3app
+ara3s4
+ar2da
+ard3ac
+ard3ak
+ardo4
+ar4d3om
+ar4d3op
+ar4d3ov
+ar2d1r
+ar4dra
+ard3re
+ar4du
+ard3w
+a1re
+5a2rea
+a3reg
+a3rem
+ar4en
+are4no
+are3sp
+a3rev
+ar3gh
+ar2gl
+a1ri
+arie4tj
+arij3s
+ar3ins
+ark2
+ark3ac
+ar3k4l
+ar4map
+arm3u
+a1ro
+a2r3ob
+ar3oge
+a3rok
+aro4ko
+ar3oog
+a2r1o2p
+a3rot
+arpi4
+ar2s
+ar5sch
+ar3scr
+ars2e
+ar5see
+ar3si
+ars3l
+ar4sla
+ars5m
+ar3sni
+ar4so
+ar4sp
+ar5spo
+ars3ta
+ars5tal
+ar4s5tek
+ar4str
+ar4su
+art4aa
+ar4t3ak
+ar4tan
+art5ank
+ar4tap
+ar3tar
+4arte
+ar4tei
+ar2th
+ar5tij
+4ar4tj
+art5jesv
+4arto
+ar5tof
+art5o4ge
+art5oog
+ar4t3o4v
+ar2t3r
+ar4tro
+art5ru
+art4sl
+art5ste
+a3ru
+ar3ui
+4arw
+arwe3s
+a1ry
+4asa
+as3ad
+as4ag
+as3ak
+as1ap
+a2sc
+as5ce
+2ase
+a4sec
+a4s3eg
+aser5a
+ase5tj
+aseve4
+as5ha
+asis1
+a4sj
+as5ja
+as3ji
+as3k
+as5ka
+as5ki
+as3l
+as4lu
+as3m
+as5mi
+as3n
+as4ne
+as4ni
+4aso
+as3ob
+aso2l
+aso4r
+as1p
+as3pl
+a4s5q
+as5sa
+4assm
+3assu
+a2st
+4as3ta
+a4sta.
+as5tag
+as4tas
+as4tat
+as3te
+a3stek
+a3stem
+as5ten
+as3tè
+asting5sp
+as1to
+as3tob
+ast3op
+4astr
+ast5rem
+as5tro.
+as4tu
+a1t
+ataart5j
+at1ac
+at3ade
+at3af.
+at3ank
+ata3s
+2atek
+a5tell
+ate2n
+ate3no
+aten4t5r
+ater5ad
+ater5sl
+at4eu
+2atg
+at3hu
+ati5ni
+a2t3j
+at4je
+atjes5
+at5jesb
+at5jesh
+at5jesm
+at5jesp
+2atm
+2atn
+a2too
+at3oog
+atos5f
+ato3st
+at3rac
+at3rei
+at3rib
+at4roe
+at5ru
+at4s3a2
+at4s3ec
+atsi4
+at4s3id
+at2s3l
+at4slo
+ats5m
+ats3n
+at4sne
+ats3pr
+at2st
+at4staa
+at4s5tak
+at4ste.
+at5sten
+at5stij
+ats5tol
+ats5top.
+ats5trek
+at4t3u4
+a2t3ui
+at3w
+aua4
+au3ch
+au3co
+au5de
+aud4j
+1aug
+au3na
+aun3t
+aup2
+aur4
+au5re
+aure3u
+4aus
+au3so
+au4s5p
+au3sto
+au3t4
+4aut.
+1auto
+auto3p
+2auts3
+auw3a
+4auz
+a4ü
+avast4
+ave3c
+avee4
+ave4n3i
+aven5sp
+aver3a
+ave3re
+ave3r4u
+4avi
+a2vo
+1a4von
+a5voo
+a5vor
+4avy
+2a1w
+axis4
+ay2a
+4azif
+ä3h
+ämme3
+ä3r
+1b
+4b.
+3ba
+baar5ste
+baar5tj
+ba4da
+bad3ar
+ba4d3r
+bad3s
+ba3g4h
+ba3gl
+5b2ak
+ba4k3o4
+bak4sp
+ba3lan
+ba4lar
+bal3dw
+bale4
+bal3ev
+ba3lië
+bal4kl
+ba3lo
+bals4
+bal3sf
+ba4me
+ba5n2a
+ban4k3a
+ban4kl
+ban4k3o
+ban4kr
+bank3w
+ba3sa
+ba4st
+ba2tr
+ba3tro
+4bb
+bbe4l5ag
+bbe4l5ee
+bbe2n
+bben3a
+4b1c
+4b1d4
+b5de
+bdi5a
+3b4e
+be1a
+be3as
+be2au
+be3ch
+be5dwe
+be5dwi
+be5dwo
+bee4
+beet1
+be5g
+beie4
+bei3s
+bei5tj
+be5ki
+be3k4l
+be1kw
+be3lar
+be5l4as
+bel5dr
+be3le
+be4l3ec
+be4lex
+bel5f
+be3li
+be4l5int
+bel3k
+bel4o
+be3lo5v
+bel3sc
+bel3sp
+belt4
+bemen4s
+be3nep
+be5n4o
+be5ot
+be1ra
+bere5s4
+ber4g5af
+ber4g5et
+ber4gl
+ber4gr
+ber4i
+be1r4o
+bero5v
+be3ru
+be3ry
+be1s4
+bes5ac
+be4sh
+be4sje
+be3so
+be5sp
+bes5s
+bes5te.
+bes5ten.
+be5stie
+bet2
+be3t4h
+be5ton
+bet5ren
+be3tw
+be5twi
+be3und
+beur4s
+4b3f
+2b1g
+4b3h
+3b2i
+bid3s
+bi2du
+bie4li
+bi4en
+bie4t3j
+bij5d
+bij3f
+bij3g4
+bij5k4
+bij1p
+bij1s2
+bik4a
+5bil
+bi3lo
+bil3s2
+bin4dr
+bin4st
+bin4t3j
+bi5ob
+bi3ok
+bi5om
+bi3oso
+bi5ow
+bir3
+bi4st
+bis5troo
+bi1tr
+bit4se
+bit4s3p
+4b1j
+4b1k
+3b4l
+blad5ij
+2b5lap
+b5led
+bles3
+ble5spe
+ble2t3
+b5lid
+blijs4
+blij5ste
+bli2k
+4b5loi
+blok5l
+bloot5j
+blu2s
+2b1m
+4b1n
+b4o
+bo4d3ec
+body3
+boe4g3a
+boe4kn
+boe4ko
+boes4
+boe3st
+boet5st
+bo3f4l
+bo2k
+bok3an
+bokje5
+bok4st
+bolk4
+bo2m3a4
+bo2m3o
+bo5na
+bond2
+bond4s5
+3bone
+bo3no
+bon4t3j
+bon4t5o4
+boot3j
+boots5te.
+bo3p2
+bor4sta
+borst5o
+bor4st5r
+bo4s
+bos3a
+bo5sco
+bo5si
+bo5so
+bos5p
+bos5to
+bot3j
+bo4to
+bot3r
+bot4sp
+bot4st
+bo2tu
+bou5ta
+bouw5s
+bo3v
+bove4
+4b1p
+3br4
+braad5s
+bran4da
+bra5str
+brei5s4
+brie4t
+brie5tje.
+bri4l
+bro2n
+bron3o4
+bru2l
+4b1s4
+b2s5a
+b5sc
+b3si
+bsi3d
+bs5je
+b2s5la
+b2s5m
+bs5s
+b4stij
+4bt4
+b3ta
+b1tr
+bts5
+3b4u
+buit4j
+bul4k
+bu4lu
+bune5t
+b5urb
+bu5ri
+bus5c
+bus3o
+but4a
+but3j
+bu2to
+but4s
+buts5te
+buur4tj
+4bv
+2b3w
+by3
+4bz
+4c.
+1ca
+3ca.
+ca3b
+ca1ch
+5cada
+ca3do
+ca3dr
+cae3
+ca3g2
+cal4l3
+ca3lo
+came5r
+ca3na
+cant4
+ca2of
+ca1pr
+ca4pra
+ca5pri
+ca3ra
+car4u
+ca5se
+ca3s2p
+cas3t
+cas5tr
+ca3ta
+cate4n
+ca3t4h
+cau3
+cau4st
+ca3v
+2cb
+4c1c
+cca3
+cces5
+c4d
+c5do
+1ce
+3ced
+cee4
+3ceel
+3cel
+cel3d
+celes5
+ce5li
+cel5k
+ce4l3o
+2ce3n4a
+2cene
+ce3no
+5cent
+cen4t3j
+ceo4
+ce3ra
+cer2n
+ce5ro
+cer4t3r
+ce2s
+ce3s2a
+ce5sc
+ce3s2h
+ce3sta
+ce3s4ti
+cesu5r
+ce3ta
+ce4t3j
+ceto4
+cet3og
+cet3oo
+1cé
+c3g
+4ch.
+3chaï
+5chao
+3chas
+1chau
+5chauf
+2chc
+1chef
+5chef.
+5chefs
+5chemi
+5cheq
+che5ri
+che3ru
+5ches
+che3us
+1ché
+5chir
+4chn
+2chp
+5chromo
+4cht
+4chw
+1chy
+3ci
+ci5ab
+ci3am
+cie3k
+cier4s5
+ci1eu
+5cij
+5cil
+ci5le
+cil3m
+4cind
+ci3o
+ci5om
+5cir
+ci3t2
+ci5ta
+c3j
+c2k3a
+c4k3ed
+ck3ef
+cke5re
+c5k4et
+ck3id
+c2k3l
+ck4le
+c2k3n
+c2k3o4
+c4k3r
+ck5se
+ck3so
+ck5st
+c3ky
+1c4l
+cla2n
+cle3u
+5clu
+2c1n
+1co
+co3ad
+co3d
+co4i
+coin5
+co3k4
+co3la
+5com
+5cond
+con1g
+2co1no
+5cons
+3con5t4
+2coo
+2co1p2
+3copa
+4copi
+cor4dr
+co4rel
+co5ri
+cor2o
+5corr
+cors4
+co3ru
+co5sc
+co5se
+co5sp
+co3th
+co3tr
+5coun
+2cout
+co5v
+c3p4
+1c4r2
+3cras
+cre5d
+2crip
+3cris
+cro5f
+cro5k
+croo3
+cro5v
+crus5
+c3so
+c3sp
+c3ste
+2c1t
+ct3act
+ct3ad
+ct5c
+ctee5t
+cte2n3
+c2t1h
+c2t3j
+c4t3of
+c3tol
+c2t1on
+ct4or
+ct3rap
+c4t3re
+ct3sl
+ct3sp
+1c2u
+cu5d4
+cu3en
+cu3és
+cui5s
+cui2t
+cuit5e
+cu3k4
+cula5p
+cu3ra
+5cur3s
+cus3o
+c3w
+1cy
+1ç
+ça4o
+4d.
+1da
+3da.
+3daag
+d4aal
+d3aap
+daar5e
+5daat
+4dabo
+2d3acc
+da4ce
+da5den
+4dadr
+3dae
+2d1af
+3dag
+da2g3a4
+da3ge
+da4g3ed
+da4g3e4t
+da4g3on
+da4g3r
+dag4s3t
+da2gu
+3dai
+da3ï
+da3ke
+da4ker
+2dakk
+da4k1r
+4dala
+d3alar
+d3alc
+da3le
+4dalf
+da3li
+2dalm
+da2l3u
+d4am
+dam4a
+da5mac
+d3a4mat
+d2a5me4
+dames3
+dam4pl
+2da2na
+dan3as
+dank3l
+danoot5
+dan4si
+dan4sm
+dan4s3p
+dan4st
+dans5ta
+4d3antw
+2d1ap
+4d3a2pe
+5dapu
+da2r3a
+d3arb
+3dare
+3dari
+dar4mo
+darm5on
+3daro
+dar3s
+dar5st
+3das3
+5dasa
+da3stu
+3d4at
+da3ta
+dat5j
+4d5atl
+4d5atm
+da2t3r
+5daue
+4d1aut
+3dauw
+2db
+dbei5
+dbou4w5i
+2d5c
+4d3d4
+ddags4
+ddag5sp
+ddel5ev
+dde2n
+dden5a
+ddera4
+dder5al
+ddere4
+dder5ee
+dder5ep
+dder3o
+ddi3a
+d5dles
+d5do
+ddo3p
+1de
+3de.
+de2al
+de1ch
+d4e5den
+5dedir
+de4dit
+dee4g3
+dee4l
+deel3i
+4d3een
+dee4r
+4d3eff
+de3g
+4d5eg.
+4d5egg
+2d5egy
+2dei
+d3eie
+d3eig
+d3eil
+d1eis
+d3eiw
+5dek
+de3ke
+dek3lu
+dek3w
+del4aa
+del5da
+del5dr
+del5eek
+4d3e4lek
+4delem
+de4lev
+4d3e4lit
+del3k
+del2s
+del4s3e
+dels3i
+del4so
+4d3e4mai
+2demh
+5demi
+dem5ond
+d2en.
+den4ac
+den5ate
+den3ei
+den3e4p
+den3ev
+4d3engt
+den4k5of
+de4noc
+den3o4r
+den3sh
+den5str
+de3nu
+5denvl
+de4o
+de5ofo
+de5ol
+deo4li
+deo3v
+de3rab
+de4r3ad
+der3a4g
+de3rak
+de3ram
+de3ran
+de3rap
+de3ras
+de4r5as.
+de4r5ass
+der2e
+der5ede
+der5egd
+de4r3ei
+de4r3em
+de5re4n
+de4rep
+de4ret
+de5rij
+de4r3im
+der3k4
+der3on
+dero4r
+4d3eros
+der4s3a
+der4s5om
+der5ste
+der5sto
+der5stra
+der5th
+4d3erts
+der5tw
+de2r3u
+de3rup
+de2s
+de3sav
+des3m
+des3n
+des3p
+de3spe
+de5spel
+de4spl
+des5sm
+de3st
+des5tak
+de5stal
+de4s3te
+de4sti
+de5stic
+des5top
+de3t4
+4d3e4tap
+de5tw
+deu4r3o4
+de3us.
+deu4tj
+deve4
+2dex
+4d1exa
+4dexp
+3dè
+2d1f
+2d3g
+d4gaf
+dge3la
+dge2t
+dgeto4
+dget5on
+dget5ov
+dge4tr
+dg4l
+2d1h
+d5he
+dheer4
+3d4hi.
+1di
+di2a
+di5ae
+di4ak
+di4ano
+dia3s4
+di4atr
+5dich
+di4do
+die2f
+die4r3o
+di3esr
+die3st
+die2t
+diet3r
+di1eu
+3dig
+di2ga
+dig5aa
+diges5
+dijk3r
+di3jo
+2d3ijz
+di2k3o4
+5dil
+2d3imp
+di5n2a
+2d3ind
+2dinf
+3d4ing.
+4d5ingel
+4d3inj
+4d3inko
+2d5inr
+2d3ins
+4d3int
+dintel5
+2d3inv
+2d3inw
+2d3inz
+di2o
+di5ofon
+di4ol
+di4one
+di4oni
+dio1s
+dio5sc
+2d3i2ro
+2d3irr
+3di4s
+dis5ag
+di5se
+di5si
+dis4kr
+dis5p
+dis1t
+dis5tr
+di3th
+dit3j
+dit3r
+5div
+2d1j
+2d3k2
+4d3l
+d5le.
+dli4n
+dlot4s
+2d1m
+2d3n2
+d5ne
+dni3s
+1do
+3do.
+do3a
+2dobj
+4d3obs
+3d4oe
+5doe.
+doe5d
+4doef
+d5oefe
+5doek
+5doen
+5doet
+4d5oev
+3doi
+d4ole
+2do2li
+d4olin
+dolk5s
+5dol5s
+3d4om.
+5domi
+do4m3o4
+d3omr
+dom4sn
+5domu
+d3omv
+4domz
+5don.
+d4ona
+5done
+do5ni
+5d4onn
+5do3n4o
+do3nu
+do5ny
+5donz
+2dop
+do3pa
+d3opb
+d3opd
+do3pee
+5dopj
+4d1opl
+3dopo
+d3ops
+d3opz
+4d5org
+do4rië
+d3ork
+dors5m
+do3sp
+do3sta
+dot3j
+5dou
+2dov
+dover5s
+3dovl
+3dovo
+2d3p
+dpren4
+1dr4
+3dra
+5dra.
+d3raam
+d3raap
+d4rac
+d5race
+5drach
+d3rad.
+d3rada
+5draf
+5d4rag
+d4rama
+d3rame
+4d3rand
+4drap
+4dras
+4d3raz
+2dre
+4d1rec
+d5reco
+d1red
+d2ree
+4d3reek
+4drend
+d4ress
+4dret
+3d2rev
+5dreve
+d3ric
+dries4
+5d2rif
+dri5ga
+d3rijd
+d3rijk
+d3rijm
+d3rijs
+5d4rin
+3dris
+4d3rit
+4d3roei
+d3roer
+5d2rog
+4d3rok
+d3roma
+d3rond
+3droog
+4droos
+5drop
+2drou
+2d3ro5v
+2droz
+drug4s
+d3ruim
+d3ruit
+5d4ru4k
+4d3rus
+2ds
+d2s1a2
+d4saa
+dsa4b
+d3sal
+ds4ate
+ds2ch
+d5schi
+dse2
+ds3eco
+d4s3ed
+d4s5ee
+d4sef
+d4sei
+ds3eis
+ds3elf
+dse4li
+d5sen
+d4s3es
+d4set
+d2sh
+ds3ho
+d2s1i2
+d4s5id
+dsig5a
+ds2im
+ds4ing
+ds5is
+d4s3j
+ds4jo
+ds5jon
+ds4l
+d1sla
+ds5las
+ds5lic
+d4s5lie
+ds5lim
+d3slin
+d2sm
+ds4mak
+d3smij
+ds5mo
+ds3n
+ds4ne
+ds5neu
+d3snu
+ds1o4
+ds3ob
+ds3om
+d4son
+ds2oo
+ds3op
+d4spa
+d5span
+ds5pati
+d5spec
+d5s4pel
+d4s3pet
+d1spi
+d4s3pl
+d5spoe
+d5spok
+d5spor
+ds5s
+dst4
+d1sta
+d5staat
+d4stab
+ds3tak
+d4s3tal
+ds4tan
+d3s4tat
+d5stav
+d3ste
+ds4te.
+d5stee
+d4stek
+ds4ter
+d4sterr
+d4stev
+ds3th
+d3s4ti
+d4stit
+d1sto
+ds5tram
+ds5trekk
+ds5ty
+d2su4
+ds3ure
+ds3uu
+d1sy
+2dt
+d1ta
+dtaart5j
+d1th
+d2tj
+d1to
+d1tr
+d1tu
+1du
+2duca
+5due
+du3en
+du3et
+5duid
+5duif
+5duik
+d3uil
+2duit
+4duit.
+d3uitd
+5duite
+4duitg
+d3uitv
+5duiv
+du4n
+dun5i
+du2o
+du4ol
+3durf
+3durv
+5du1s
+dut3j
+du5wen
+2dv
+dvaat5
+dvee3
+dve5na
+dvies5
+2dw
+d3wac
+d3was
+d3wat
+d1we
+3d2wei
+d3wek
+d3wet
+d3wez
+d1wi
+4d1wo
+d3wor
+d3wr
+1dy
+4d3yo
+dy4sp
+dy2s4t
+2dz
+4e.
+4ea
+e3aa
+e1ab
+ea3bo
+e3ac
+ea4ca
+eac5t
+e1ad
+ea3da
+e5adem
+ea3do
+ead3s2
+ead5sh
+e1af
+e1ag
+e3ai
+ea4k3o4
+e1al
+ea3la
+e3ali
+e4als
+ea5mi
+e3an
+e4an.
+eang3
+ean4s
+e5ap
+ea3pr
+e3aq
+e1ar
+ear2c
+e1as
+e2asc
+ea5s4e
+ease5t
+ea3so
+e1at
+e4at.
+eat3s
+eau3s4t
+e1av
+e3bo
+ebots5te.
+e5br
+3ecd
+e3ce
+e1che
+e1chi
+echt5ec
+echts5o
+e3chu
+4eck
+ec5le
+4ecor
+4ect
+ec3ta
+ec4taa
+3ecz
+e1d
+ed4ag
+e3dam
+e3d4an
+e4d4as
+ede3a
+ed3ei.
+ede5le
+edem4
+ede5nac
+ede5o
+ed4er
+e4d5erns
+ede5rog
+edi3al
+edi3am
+e5die
+4edir
+edoe5tj
+e3d4oo
+ed3opv
+edors5te
+ed3ov
+e3d2r
+ed3rod
+ed3rol
+ed1s
+ed5se
+ed2sl
+ed4so
+ed5sp
+ed3su
+ed3uit
+e4d2w
+e5dwan
+e4e
+eea4
+ee5b
+ee5ca
+ee5che
+ee2d3a
+eed4ac
+eed5as
+ee5de
+ee5do
+eed3ru
+eed3si
+eed3w
+ee2f
+ee3fa
+eef3ac
+ee3fi
+eef3l
+eef3r
+ee4gap
+eeg3l
+ee3i
+ee2k
+ee3ka
+ee5kaa
+eek3ak
+eek5all
+eek1e
+ee5ket
+ee3ki
+ee3kl
+ee4k3lo
+eek3n
+eek3re
+ee3kri
+eek3ro
+eek5st
+eek3w
+ee2l
+eel3a
+ee3lad
+eel4as.
+eel5d4u
+ee3le
+eel4ee
+ee3li
+ee5lij
+eel5k4
+ee3lob
+eel3og
+eelo4ge
+ee3lu4
+eel3ur
+eel3uu
+4eem
+eema4
+ee2n
+een3a
+eena4r
+een3e2
+een5g
+ee3ni
+een5ie
+een5k
+ee5o2
+ee2pa
+eep3an
+ee3pl
+eepo4
+ee4p3re
+eep3ru
+ee2r
+eer1a
+eer3aa
+ee4rad
+eera4l
+ee3ram
+ee3ran
+ee3re
+ee4ree
+ee5rei
+ee4r3i
+ee5ric
+eer5k
+eer3og
+eer5oom
+ee3rot
+eer5ston
+eer5str
+ee2s3
+ee5sch
+ee4s5em
+ees5et
+ee3sj
+ees5lo
+ee3sn
+ee3s4p
+ees5pl
+ees5pot
+ees5ten
+ee3stu
+ee2t
+eet5aa
+ee3tal
+ee3tan
+ee5te
+eet5h
+ee3tj
+eetna4
+ee3to
+eet3og
+eeto4ge
+eet3oo
+eeto4r
+ee3tr
+ee4tro
+eet5rok
+eet3sp
+eet5ste
+ee5v
+ee5z
+eën3
+e5ër
+ef3ad
+efa4z
+efde5l
+ef3do
+ef3ei
+e5fer
+4efi
+efie4t
+efiet5j
+ef3ins
+e3fis5
+e1fl
+ef3li
+ef3loo
+e3flu
+ef3om
+e3foo
+ef3op
+e1fr
+ef3rij
+e5fron
+ef3sf
+4e1g
+egas4
+eg3as.
+ega5sk
+eg3ebb
+e4ge4c
+eg3eig
+egel5ei.
+ege4l5ov
+ege4net
+egen5of
+ege4ra
+eger5eng
+ege4ro
+eger5on
+e3g4i
+eg3ijz
+egip4
+egiste4
+e2gl
+e4go.
+eg3org
+e2gos
+eg3oud
+e5graf
+eg3s4
+eg5sle
+eg5so
+e2g3u4r
+egut4
+e4g3uu
+e1h4
+e5ha
+eheis5
+ehit4
+e2i
+ei5a
+4eid
+ei3do
+eid4sc
+ei1e
+4eien
+eien5s
+eie5re
+ei3f4
+ei3gl
+4eign
+e3ij
+eik4l
+ei3kn
+ei5kr
+eiks4
+4eil.
+eil5ant
+4eild4
+eil5dr
+4eile
+ei4lev
+eil5m
+ei2l3o
+ei4n3ab
+ei3n4ac
+ein4do
+eind5oo
+ein4d3r
+ein5gr
+ein5k
+ei2no
+ein5sl
+ei3o
+ei2sa
+ei5sha
+ei3s4la
+ei3slo
+eis4p
+ei3s4ta
+4eit2
+ei4too
+eit4s3
+eits5c
+eits5n
+eits5te.
+eit5sten
+eits5tr
+eive4
+4eiz
+e1j2
+e3je
+ek3aan
+ekaart5j
+ekaat4
+ek3af.
+e4k3a4g
+ek3al.
+ek3alt
+e5kam
+ek3ang
+ek4ee
+ek1ei
+e3kem
+e5ker.
+e5kers
+ekes3
+ekes4t
+ekes5tr
+e3ket
+ek5eter
+e5kic
+e4kil
+e5kis
+ekla4m
+eklam5a
+ek3lev
+e5klim
+ek5loos
+ek4ni
+e3ko
+e4k3ob
+e5kof
+ek3oli
+ek3opz
+e5kor
+ek5os.
+ek5oss
+e5kran
+ek3roz
+eks4e
+eks5erv
+ek5set
+ek4str
+eks5tra
+ek5t4e
+ek3to
+eku4
+ek3uit
+ek3ur
+ek1uu
+ekwet5ste
+ek3win
+e1la
+el3aan
+el5aand
+el1ac
+el4ade
+el3adj
+el3adm
+el3adr
+el3adv
+el1a4f
+el1al
+e3lan
+el5ana
+e3lap
+e5lap.
+e4lapp
+el3arb
+el3arc
+el3arm
+el3art
+e4l3as.
+el3asi
+e4l3asp
+e4l3ass
+el1au
+e4laut
+e3laz
+el5azi
+el4dec
+el4dr
+el4du
+e1le
+e3le.
+el3eeu
+el5eff
+e5leid
+el5eier
+el3eig
+el3ei5s
+e4lel
+3e2lem
+el3emp
+e5l4en
+e3ler
+ele5r4a
+eler4s
+el3erv
+e3les
+eles4t
+e4l3eta
+ele4tr
+e4l3etu
+el3exc
+e3lé
+elfi4d
+el1fl
+elf3s4
+el3gu
+2eli
+e5lie
+e5lig
+eli5kw
+el3imp
+e4l3ind
+e3ling
+e4l5inkt
+el5inz
+3elix
+el4kee
+elk3s
+el4k3u4r
+el4kw
+4e1lo
+e5loep
+el3oes
+e3lok
+el3ol
+el3oms
+el5ond
+el5ont
+e3loo
+e5lood
+e5loos
+el3ops
+el5opt
+el5opv
+el3o2r
+el5org
+elot4j
+e5lou
+el3o4ve
+e5loz
+elp4o
+el4ps
+el4s5em
+el4s3k
+el5smed
+el5twe
+4e1lu
+el3uit
+eluks5
+2ema
+e4mana
+ema3sc
+ema5to
+emees5
+emens5te
+emer4s
+emes3
+emie4tj
+e5mok
+em3oli
+em3op
+em3org
+emor5sten
+e4mo4v
+em3sa
+em5sc
+em4sli
+em4sm
+em1st
+em3su
+em3uit
+emut4
+en3aap
+e3naar
+e4n3aas
+en1ac
+e5n4acc
+en5af
+e2n1ak
+e2nal
+en3al.
+en3als
+en3amb
+en4ame
+e2nan
+e4n3ang
+en1a2p
+e5nari
+en3ars
+e2n3a2s
+enas3p
+e3nat
+ena4tel
+e4n3att
+en1av
+e2n3a2z
+enci4
+3ency.
+en3da
+en5daa
+end5ama
+5enderti
+en3d4o
+en3dr
+en5drek
+e2n3e2c
+enede4
+e3nee
+en3eed
+enee5t
+en5eg.
+en5egg
+en3ela
+en3elf
+en3ema
+e4n3en5t
+e2ne2p
+en3epo
+e5nere
+5energ
+e4nerv
+en3eta
+en3ete
+ene4ten
+e3neu
+4enf
+en5ga
+en3gl
+en4g5le
+eng4r
+en5gri
+engs4
+eng5se
+eng3sm
+e3nie
+e5nijd
+e2n3im
+e4ninga
+e4n3ink
+e3niv
+e4n3i4vo
+en3k2a
+e4n3och
+en3off
+e4n3oli
+e2n1on
+e4n3oor
+enoot5
+e2n1o2p
+e3nor.
+en3ord
+eno3s
+en3ou
+e2n1ov
+3enq
+en5sce
+en4sei
+ens5ein
+ensek5
+3ensem
+ens4fe
+en4sin
+en5slak
+en4s3on
+en1s2p
+ens5pot
+en5stan
+en5sten
+enst5ijv
+en4stin
+en4stu4r
+en3su
+en4tac
+en5tee
+en5tei
+ente5re
+en4terv
+3entè
+en1t2h
+en5tom
+ent4r
+en3tre
+ent5rol
+ent4sl
+ents3m
+ent4s3p
+en3tw
+e1nu
+e4n1ui
+e2nun
+en3ur
+en3uu
+5envelo
+eny4
+e3o
+eo3d
+eodo3
+e5oe
+eoes3
+e5off
+eo3fr
+e4o3k4
+e5on
+eo5ni
+e5oo
+eo3pa
+eo3pe
+eo3pl
+eop4la
+eo3p2r
+e5ops
+eor5d
+e5org
+e5ori
+eo3ro
+eo3s4
+eo5st
+e4ot
+eo5te
+e5o3t4h
+e1pa
+e3paa
+ep3aak
+ep3ac
+e4paf
+epa4k
+ep5ake
+e3pal
+e3pap
+e4p3app
+e3par
+ep3asp
+e1pe
+e5pe.
+ep5een
+e5per
+epers5te.
+e1pi
+3epid
+ep3ijs
+ep3ijz
+ep5ingr
+ep3ins
+epit4s
+epits5te
+ep1j
+e1pl
+ep3led
+e4p3lod
+e5ploe
+ep3lus
+e1po
+e4p5o4ge
+epoort5j
+epoot4j
+3e4pos.
+e3pot
+epou4
+e1pr
+ep4ra
+e3pri
+ep5rode
+eprot4
+ep2s
+ep4s5ee
+ep4ser
+eps3l
+eps5n
+eps3p
+eps3ta
+eps5taa
+eps5tal
+eps5to
+eps3tr
+eps5tro
+ep4tak
+ep2tj
+ep4tr
+ept3ra
+ep5tro
+ep3uit
+4equa
+e3ra.
+e1raa
+e5raad
+e4raak.
+er3aan
+er5aanp
+e4raap.
+e5raat
+e4r1ac
+e5rac.
+e5race
+e5raco
+e3rad
+e5rad.
+er3ado
+er3af
+e3raff
+era4gen
+e1rai
+e4r3all
+er3ama
+er3ana
+e5randa
+e5rane
+e5ra3pl
+er3arc
+e3rare
+e3rari
+e1rat4
+er3a4tr
+er3azi
+er3d2a
+er3d4i
+erd4o
+er3d2r
+erd5uit.
+er3d4w
+e1re
+er5eat
+4erec
+er5editi
+er3een
+e5reep
+er5eers
+er3eet
+er3ef
+er5eff
+er5eg.
+er3egd
+er5egg
+er5egt
+er3eie
+er3eig
+er3eil
+er5eind
+ere3kl
+er3elk
+e4r3emm
+er3emp
+e3rend
+e5rendel
+ere4ne
+eren5eg
+er5enen.
+e3renm
+e3rent
+er5enth
+e5rento
+eren5tw
+ere2o
+ere4og
+er3epi
+er3e2q
+er3eri
+e3res.
+er3esk
+e3ress
+ere4st
+ere4t3j
+er3etn
+e4r3ets
+e4r5ex
+erg2l
+e3ri
+eri5ab
+e5rif
+e5rig
+erig5a
+er3ijl
+er3ijs
+e4rijs.
+er3ijv
+e4r3ijz
+e5rik
+er5ind
+e4r3ini
+er5inkt
+er3ins
+er3int
+e5rio
+e5ris
+erkeers5
+er2kn
+er3m4i
+er5mo
+er5nu
+e1ro.
+e3rob
+er3oc
+e4r3oed
+er3oef
+e5roep
+eroe5tj
+er3oev
+er3of
+ero2g
+e3rok
+e1ro2l
+e5rol.
+er3oli
+e5roll
+er3om
+er1on
+e3ron.
+e3rone
+er3onv
+er3oog
+er3oor
+e5roos
+e4r3op
+erop3a
+ero5pen
+e2r3or
+er1ov
+er3oxi
+e3roz
+e3rö
+er4plu
+errie5tj
+er3scr
+er3sj
+er5slag
+er5span
+ers4pot
+er5stem
+er5te
+er3t2h
+er5t4i
+er5t4o
+er3tr
+ert5se
+erts5l
+er3t4u
+er3t4w
+e1ru
+e3rub
+e3rug5
+e2rui
+er3uit
+erui5t4j
+e2run
+e3runs
+e4r3ur
+e3rus
+er5uu
+3ervar
+3erwt
+e4saf
+e4s3a2g
+e3sam
+e5san
+es3ap
+es3arr
+e3sa3s
+e3scop
+e3s2cr
+es4e
+e5sec
+es5een
+e5sel
+es5ene
+e4s5eng
+es5ex
+es2fe
+es5he
+e4shi
+e3sid
+e3sie
+es1in
+e4sir
+es5je.
+es5jes
+e3s4jo
+es5jon
+e4s3ka
+es5kr
+e3sl
+es4la
+e5sla.
+e5slag
+es3lak
+es5lat
+es4le
+es5leg
+es2m
+es4mui
+e5smuil.
+e1sn
+e3s4ne
+e1so
+e3sol
+es4oo
+es5oor.
+eso4p
+es3ore
+e1sp
+es5pas
+es4pel
+espit5ste
+e3spl
+e4sprie
+esp5riem
+es4sm
+e3stak
+e3s4tal
+e3stap
+es4tar
+es5tatie
+e4s3te.
+es4tea
+es4teel
+est5ei.
+e4steka
+es5tekam
+e3s4tem
+es5temo
+es3ten
+e4sten.
+es5tenb
+es3ter
+estere5o
+es5tes
+es4tet
+e3steu
+es4tic
+e4stie
+e3stot
+es5tra.
+es5trac
+es5trak
+e5stral
+est5rap
+es5trei
+est4sc
+es4tur
+e3sty
+e3su
+esu4r
+e3sy
+e1ta
+e3ta.
+et3aan
+et3ac
+et3ad
+et3afz
+3e2tag
+e3tak
+e5tak.
+et4ana
+e5tand
+e2tap
+e4tapp
+e5tat
+e4tau
+e2tav
+e3te
+e5tea
+et3edi
+e5tek
+4etel
+e5tel.
+e4t5elf
+e5tels
+et5emb
+et5emm
+etens5u
+eten5tj
+ete5r4a
+ete3ro
+eters5la
+eter5sm
+e5tes
+e1th
+et3ha
+et3hor
+et5hu
+e4t5i4d
+e5tie
+e4t3inc
+e4tiq
+e5tis
+e4tja
+e1to
+e5toc
+e3toe
+e5toev
+e3tol
+eto4p
+et3ope
+et3opl
+e4t3ork
+eto3sf
+e1tr
+et3rec
+e4t5res
+e3troe
+e5tron
+e5troo
+etros4
+e4t3ru
+et4sl
+ets5lap
+et5slu
+ets3n
+et4s3oo
+et3spe
+ets3pr
+et3spu
+et4ste
+ets5tek
+et5sten
+et5sti
+ets4u
+et5su5r
+et5suu
+e1tu
+etui5tj
+etu4r
+et3we
+et2wi
+1eua4
+1euc
+eudi5o
+eu5dr
+eu3e
+eugd3r
+eu3g2r
+eu4ler
+eu4li
+e1um
+e3um.
+e2umd
+eu2na
+eun3t
+1eu1o
+eu2po
+eu4rad
+eu4rec
+eu3ren
+eu4res
+eu4rij
+eur5k
+euro5v
+eur4sta
+eurs5taa
+eurs5te.
+eur4s5tr
+eur4su
+eu5sch
+eus4p
+eu3spa
+eu4st
+eu5str
+eu3tj
+eu1tr
+e3uu
+2euw
+eu4wa
+eu5win
+euw4str
+evaar5tj
+eval4s
+evari5
+eve4lo
+evel5op
+eve5n4aa
+4ever
+eve3ra
+4e1w
+e5wa
+e5we
+ewen4s
+ewens5te.
+ewest5r
+ew2h
+e5wi
+ewo3v
+4ex.
+2ex3aa
+ex3af
+4exco
+3exeg
+3exem
+4exi
+ex3in
+ex5op
+1exp
+e3y4o
+eys4
+ey3st
+e5za
+e3zee
+4e3zen
+ezers5
+e3zo
+ezz4
+é3a
+é1d
+édee4
+édi3
+é1g
+égee5
+é3h
+é3j
+é3n
+é3p
+é3r
+é1t
+è1
+4èc
+è2l
+è2s
+è5t
+èta5
+ê1
+ê2p
+ê3per
+ê5t
+3ë
+4ë.
+ë2b
+ë3c
+ë3d
+ëe2
+ëen3
+ë3j
+ë1l
+5ën
+ënce3
+ën4e
+ëns2
+ën5sc
+ënt2
+ën5th
+ën5tw
+ë3p
+ë1ra
+ë1re
+ë1ri
+ë1ro
+ëro1g2
+ëro3s
+ë2s
+ë3si
+ës3t
+ë1t
+ët4s
+ëts3te
+ëve5
+ëven4
+4ëzu
+4f.
+1fa
+f3aanb
+f4aat
+3fab
+fa2bo
+f3acc
+face4
+f1ach
+2fad
+2f1af
+fa3g
+fal3s
+fa3m
+f3ang
+fant2
+fan4t3j
+fant4s5
+2f3a2p
+f4arm
+3fa5se
+fa2to
+fa3v
+4fb
+fbe5dw
+f1c
+4fd
+f3da
+fda4g
+f5dan
+fd1ar
+fde4k
+fdek3l
+fde4s3
+fdes5e
+fdes5l
+fde5sm
+fdes5t
+f2d3in
+fd3of
+fdors5te
+fd4ra
+f3d4ru
+fd5se
+fd3si
+fd3so
+fd3sp
+f4d2w
+fd3wo
+1fe
+fe2a
+fec4tr
+fede3
+fe4del
+f3een
+5fees
+feest5r
+fel5dr
+fe4l3ee
+3feli
+fe4lom
+fe4l3op
+fel3sp
+fe3no
+f4er
+fe3rab
+fe3ran
+fe4r3et
+fe3rom
+fe3ron
+3fes3
+fe4t3j
+fetu5r
+2f3ex
+1fé
+3fè
+3fê
+4f1f
+f5fe
+f5fi
+ffs2
+ff3sh
+ff3si
+f3fu
+f3g2
+fge3
+fge5r4
+fge5t
+4f5h
+1fi
+fi5ac
+fi4al
+fi3am
+fi3apa
+fi3apo
+fia4s
+3fib
+fi1ch
+5fie
+5fig
+f3ijs
+2f1ijz
+fik4st
+3f2il
+fil4m3a
+film5on
+fi3lo
+4find
+3fini
+f3inj
+4fink
+2finr
+fi3o
+fi4r
+fi4s
+fi5se
+f5iso
+f1j
+fjes5
+4f1k4
+f3ke
+f2l2
+4f3laa
+f1laf
+f4lam
+f3lei
+flen4st
+flens5te.
+f4les
+fle2t
+flet3j
+4flev
+f4lex
+f3lez
+2flie
+2flij
+f4lik
+f4lip
+f4lit
+f3lok
+3f4lor
+flu4t3
+4f1m
+f1n
+1fo
+3fob
+5foc
+foe5d
+foe5ta
+2f3of
+5fok
+2foms
+fo5na
+fond5en
+fonds5l
+fon5eng
+fo1no
+4font
+fon5te
+foo4
+fooi5
+f3oom
+5foon
+2fo4p
+fop5s4
+f4or
+3fo5re
+fo5ri
+5form
+for4t3j
+fo1ru
+fo3t
+2f3oud
+4f1ov
+3fö
+4f5p4
+fpers5te.
+fpits5te.
+fr4
+f4raak.
+fraam5
+5frac
+f3rad
+f2ras
+5frau
+f1rec
+f3rek
+5freq
+frie4s
+frie4t
+friet5j
+f4rik
+f4rod
+4f3rol
+f4rolo
+f3roma
+frus3
+4f1s
+f2sa4
+fs3ad
+fs3an
+fs3ar
+f3sc
+f5sch
+f4scr
+fse2
+f4s3ec
+f4s5ee
+f4sei
+f4s3eth
+fs4fe
+f2sh
+fs5he
+f2si
+f3sie
+fs3im
+fs1in
+f5slaa
+f5slac
+f5slag
+fs3lap
+fs2m
+fs3ma
+fs4mi
+fs3mo
+fs3mu
+f2s1o4
+fs3ob
+fs3om
+fs4oo
+fs2p
+fs4pre
+fs4t
+fst3as
+f3ste
+fs5tec
+f5stell
+fste4m3
+f4sterr
+f3sti
+f5stif
+f3sto
+f4st3oc
+f4ston
+f3str
+f3stu
+f3sy
+4ft
+f1ta
+ft1ac
+fta4kl
+fta4p
+ft3art
+fter5sh
+ft3h
+f1to
+f5tond
+f4tont
+f1tr
+ft2s3l
+ft4sm
+fts3n
+ft4so
+fts3p
+f1tu
+ftu4r
+1fu
+2fuit
+fu4ma
+fum3ac
+3f2un
+fur4o
+3fus
+2fuu
+4fv
+fva2
+fval3
+4f1w4
+3fy1
+2fz
+fzet5
+4g.
+1ga
+3ga.
+gaar5tj
+g4aat
+2g1ac
+4g3adm
+g4af.
+g3afd
+ga3fr
+4g3afs
+4g3afw
+2g3a4h
+4gal.
+ga3la
+ga4l3ap
+ga5ler
+gal3s
+4gamb
+g4a3mi
+3gan
+gan5d
+5gane
+gan4s5t
+ga3pl
+3gar.
+4g3arb
+ga3re
+g1arm
+3gars
+2g3art
+gar5tj
+ga4s
+gas5c
+gas3i
+ga5sla.
+ga3sli
+ga5slo
+gas3o
+gas3p
+gas3tr
+gas5tra
+gast5rol
+3gat
+gat5j
+gat3s
+4gaut
+ga5ve
+g1avo
+2g5b
+2g1c
+4gd
+g5dac
+g5dag
+gd3art
+gd3at
+gd5ate
+g3de
+g4d3elf
+g5der.
+gd3erv
+g4d3id
+gd3im
+g2din
+g3dr
+g5dru
+gd3sa
+gd5sp
+g3du
+1ge
+3ge.
+ge3a
+gea3dr
+gea5na
+gea3q
+ge4ari
+ge5au
+4g3eb.
+2gebb
+ge3c
+ge3d4
+gedi3a
+ge4dit
+ge5dr
+ge5dw
+3gee4
+geest5r
+geet3a
+ge3f4
+2g3eff
+ge5g4
+gege4s
+4geig
+2g3eik
+gei4l5a
+5geit
+geit3j
+ge3k4a
+ge3ke
+ge5ki
+ge5k4l
+ge3kr
+gek4st
+gek4u
+ge3k4w
+ge3lau
+gel4d3a4
+ge3l4e
+4ge4lem
+gel5f
+gel5k
+5ge3l4o
+gel5si
+gel3sl
+gel3sp
+gel5ste
+ge5ma
+4gemb
+4g3emf
+ge5mo
+2g3emp
+gems3
+ge3m4u
+g4en.
+ge3nak
+gen4az
+3ge3ne
+ge4n3ed
+ge4nend
+4g3engt
+3geni
+gen5k
+ge1no
+ge4n4of
+ge4nog
+gen5sfe
+gen5ston
+gen5stu
+genstu5r
+5genw
+ge5om
+geo5pe
+georke5
+ge5os
+ge5ot
+ge5p4
+ge1ra
+ger5aal
+ger5aap.
+ge4r3a4l
+gera4p
+ger5ape
+ger5as.
+ge5reg
+ge3rem
+ge5ren.
+ger4i
+ger5ini
+ge1r2o
+ger4of
+ge5rol
+ger5slan
+ger4sli
+gers5lij
+ger4sp
+4g3erts
+ge3r4u
+3ge1s4
+ge3sa
+ge3sc
+ge5se
+ge3si
+4ge3sk
+ge5sl
+ge3sn
+ge3so
+ge5spend
+ge5sper
+ge5spo
+ge5stan
+ges5te.
+ges5ten.
+ge3str
+ge5sw
+ge3ta
+get4aa
+ge5tam
+ge2th
+ge5t4i
+ge3t4j
+get4o
+ge3tr
+ge5tra
+ge5tro
+ge5tru
+ge5tsj
+ge5tu
+ge5t4w
+ge3ui
+5g4ev
+4gex
+5g4ez
+1gé
+gédi4
+3gè
+4g1f
+gfijn5ste
+4g3g4
+g5ge
+gge3la
+gge4r5on
+gges5ti
+g4g5h
+g5gi
+ggings5
+g5gl
+2g1h
+g2het
+ght4
+gh5te
+g2hum
+1gi
+gids5te
+gie5ra
+gier4s
+gi1eu
+gi2f
+gif5r
+gi3ga
+5gigere
+5gigste
+2gij
+g3ijs
+4gijz
+gi2m
+gi3na
+4g3inb
+4g3inf
+g5infe
+g5infr
+5ging
+2g3inh
+gin3o
+2ginr
+gi4oc
+gi2od
+gi4onet
+gi2or
+gip4st
+5gir
+3gis
+4g1j
+4g1k
+gl4
+g5lab
+3glai
+1gla4s
+glas3e
+g5lat
+3g4laz
+3gle.
+g5leer
+glee5t
+g3len
+2g5lep
+4g5ler
+g3les
+3gle4t
+glet3j
+g5lev
+g5lice
+g5lich
+3glië
+g2lif
+g5lijs
+g2lim
+3g4lio
+g2lob
+3glof
+g5log
+3glom
+4g3lon
+g3loon
+g3lop
+3g2los
+g5loz
+3g2ly
+4g1m
+gmaat5j
+2g1n
+g3na
+gn4e
+gne5g
+gne5m
+gne4t3j
+gnie4tj
+4gnu
+1go
+3go.
+3go2a
+3gob
+2goc
+g1och
+go4d3a
+god4s3
+gods5t
+4goef
+goe1r
+2gof
+go3f2r
+g4og
+4goh
+go2k
+5gom.
+go2ma
+g3oml
+4gomz
+go4n3az
+2g3ong
+go5no
+2g1ont
+g2oo
+2g3oor
+3goot
+2g1op
+go3pa
+g4opr
+g4ora
+4go4re
+go5re.
+5g4ori
+gor2s
+gos1
+go3tr
+gou4d5ee
+2g3ov
+2g5p
+gpes3
+1gr4
+3gra
+5gra.
+graat5j
+g5rak
+gra2m
+g4ram.
+gram3a
+g3ramp
+gra4s3
+5grav
+2g3rec
+2g3red
+5gredi
+g5redu
+g3reek
+g3reel
+g4reep
+g3reis
+4g3rek
+2g3rem
+gren4s
+gre4s
+g4reu
+g3rev
+5gria
+grie4t5j
+g5rijd
+g5rijk
+g5rijm
+g5ring
+5g4ris
+grit5s
+2g3riv
+groet5j
+grof5
+g3rok
+g3rook
+g3room
+groot5j
+2grou
+gro5v
+2g3rug
+g3ruim
+g3rup
+4gs
+gs1a2
+gsa4g
+gs5alar
+gs3alt
+g2sc
+gse4
+gs3eco
+g4s3ed
+gs5een
+gs3ei
+gs3en
+gs5ene
+gs3erv
+gs3et
+gs3ev
+gs5he
+g2s1i2
+g3sie
+gs5is
+gs1j
+g3s4ke.
+gs3l
+gs4la
+gs5laag
+gs5lam
+gs5las
+gs1le
+g3slep
+g4sleu
+gs5lie
+gs4lin
+g5sling
+gs4lo
+gs5log
+gs5lok
+gs5lon
+gs4lu
+g4s5ma
+gs3n
+g4sna
+g3snij
+g4s1o4
+g5sol
+g5som.
+gs5ons
+gs3op
+gs3p
+gs5pand
+g3spec
+g3s4pel
+g3s4pet
+gs4pi
+g3spie
+g3spil
+g5spin.
+g5spinn
+gs5pir
+gs5pol
+g3s4pon
+gs5ps
+gs5q
+gs5sc
+gst2a
+gs5taal
+gst5aang
+gs5tac
+g5stad
+g5s4tan
+g4st3ap
+g5stat
+g1ste
+g5s4te.
+g5sted
+g5stee
+g3stei
+gs3tek
+g5stel
+g3sten
+g3ster
+g5ster.
+gs5terr
+g5sters
+gs3th
+g5s4tic
+g3s4tig
+gs5tijg
+g5stof
+g5stop
+g5stor
+gst3o4v
+g4s3tra
+gs5trad
+gs5trak
+gst5ram
+gs5trap
+g5strat
+gst5res
+gs5troe
+gs5tron
+g4stru
+g5struc
+g3stu
+gs5ty
+g2s1u4
+gsver3
+gs5w
+g5sy
+4gt
+g1ta
+g2t3ap
+g3te
+gte3ro
+gtes4
+gte3st
+g1to
+g3tr
+g1tu
+1gu
+5gu.
+3gue
+gu4eu
+2guit
+gu4ni
+gu2s3
+gut4st
+guts5te.
+4gv
+g5vo
+4g1w
+g5wa
+1gy
+4gyp
+2gz
+4h.
+haams5ta
+haar5sl
+haar5sp
+haars5te
+haar5tj
+haats5te.
+h3afd
+haf4t3u
+ha3g
+ha5ge
+hal2f1
+5hals
+hal4sto
+5halz
+2hamp
+4han.
+han4dr
+hand5sl
+han3ga
+hang5l
+hang5s
+han4s3l
+han3so
+han4st
+hap2s
+hap4se
+har4ta
+harte5l
+hart3j
+har4t3o4
+har5tre
+hart5sl
+hat5j
+ha2t3r
+hat3s
+ha3v
+4have.
+4hb
+2hd
+h4e
+2hea
+he2ar
+3hech
+he3co
+4hee.
+hee3g4
+hee4k
+heek3a
+heek5l
+hee4l3o
+heep4s
+heeps5c
+heers5tak
+hee5sto
+hee5tjes
+he2f
+he4i
+heids5p
+heis4
+hei5tj
+he2k3a
+he2kl
+hek4st
+heks5te.
+hek5sten
+hek3w
+he3le
+he4l3ee
+he3li
+hel4m3a
+helo4
+hel4p3a
+hel3sm
+he5mo
+he5ne
+hen4kr
+he3n4o
+4he5o
+he4pij
+he2p3l
+he2pr
+he1ra
+her4aa
+he4r3ad
+he3r4au
+he4r3i
+herm5eng
+he3ros
+hero5v
+her4p5aa
+3herst
+hert4
+herts5te
+he2ru
+he5se
+he2sp
+he2s5t
+hets5te.
+heu5le
+2h3f
+4h5g
+h3h
+hi5d
+hie4f3
+hielsges5
+hie4r3
+hie5ren
+hier5u
+hie4t5o
+hie4tr
+hiet5s
+hij4sl
+hik4s5
+hi3kw
+hil3m
+him4pl
+him4pr
+hin5d
+h3ins
+hin4t3j
+hi2p5l
+2hir2
+his5p
+hi3tr
+hit4st
+hits5te.
+hit5sten
+h3j
+2hl
+h3la
+h4lag
+h3lep
+h3loc
+2h2m
+h3ma
+h3me
+h4mer
+h1n
+h2na
+hno3
+2ho.
+ho3a
+hoa3n
+hoboot4
+ho3ch
+hoe4ker
+hoe4s
+hoes5l
+hoe3t
+ho2f
+hof5d
+hof3e
+ho3g2
+ho2ka
+ho5mo
+hon3dr
+hond4s
+hon3g
+honi4
+ho1no
+hool3e
+4hoom
+hoort4
+hoor5tr
+2hoot
+ho3pa
+ho1pe
+ho2p3o
+hop3r
+hop4str
+hor5de
+5horl
+ho3ro
+hor4st
+hors5te.
+hor5sten
+hor4t3j
+ho3ru
+ho3sa
+hot3j
+ho3tr
+ho4t3re
+hot4st
+hots5te.
+ho3v
+2ho4w
+how3o
+2h1p
+hpi4
+2hr
+hra4b
+h4re
+h5rea
+hri4
+hro2k
+hrok3o
+hroot3
+4hs
+h3sa
+h3sp
+h3st
+2ht
+h4t1a2
+ht3ac
+h3tal
+ht3ala
+h5tans
+h3te.
+h4t3ec
+ht4eco
+h2t3ee
+h2t3ef
+h2t3ei
+ht5em
+h3ten
+h4ten5t
+ht5entw
+hter3a
+hte4r5o
+h4t3esk
+h4tev
+ht5eve
+h5tevo
+ht3ex
+h2t5h
+h4t3int
+h2t1j
+ht1o4
+ht5oef
+ht5op
+h4t1r
+ht5roo
+ht4sap
+htse4
+ht4ser
+ht2si
+ht4sl
+ht5sla
+ht5slot
+ht3sme
+ht5smij
+ht4s3o
+ht3spe
+hts3pl
+ht3spr
+hts5taal
+ht4s5tak
+ht4s5tek
+ht4sti
+hts5tore
+hts5trekk
+ht1u2
+ht3w
+hu4ba
+3huiz
+hul4der
+hur4t5
+hut3j
+huts5te.
+huur5s
+4h1w
+hy4la
+3hyp
+hypo1
+4i.
+i1a
+i3aa
+i4ab
+i5abi
+i4ac
+i3ady
+i3ae
+i5ae.
+i2a3f4
+i2a3g2
+i3agr
+i3ai
+i5ak.
+i3ake4
+ia4kem
+ia3kl
+ia3kr
+i3al.
+i4a3la
+i3ali
+i2am
+i5am.
+i3ami
+i3an
+ian4o
+ia3o
+i2a1p4
+ia5pa
+i5api
+ia3sc
+ia5se
+ia3so
+ia4s5po
+ia3sta
+i3at
+ia3t2h
+i5atri
+iave4
+i5ble
+iboot4
+4ic
+i3ce
+5i4cepa
+i1cha
+i1che
+ichee4t
+i1chi
+i1cho
+i3chr
+ick5l
+icos4
+ic4t3op
+ict4s5c
+i3dam
+idde4r5a
+ide3a
+i4dee.
+ider4sp
+ider4st
+ides4
+idi3a
+idi5ab
+i2di5o
+id4mak
+i3dok
+i2dr
+id3ran
+id3ru
+id2s1
+id4s3a
+id4ser
+ids5i
+ids5j
+ids5l
+id4sm
+ids5ma
+id5s4mee
+id4s3o
+ids3ta
+ids5tak
+ids5tek
+id4stem
+id4sti
+ids5tr
+id3u4r
+id3uu
+idu3w
+id3w
+4ie
+ie1a2
+ie4d3ac
+ie3de
+ie4dro
+ied3w
+i1ee4
+ieë2
+ie3fi
+ie2fl
+ie3fle
+ie3fon
+ie4fr
+ie4gas
+ie3ge
+ie4g5ins
+i2ek
+iek3e4v
+ie4kl
+iek3li
+ie5klu
+ie2kn
+iek5ond
+iek4s5n
+iek4sp
+ie2ku
+ie3kwa
+ie5lan
+ie5lap
+iel5do
+iel5d4r
+iel4e
+iel5ei.
+iel5k
+iel3sc
+ie3ma
+iem3ov
+ien4dr
+ien3ij
+i3enn
+i5enne.
+ien3s4m
+ien5sp
+ien4sta
+ien4st5o
+ien4str
+ienst5ur
+ieo4
+i4ep
+ie5pen
+iepiet5
+iep5oog
+iepou5
+iep5rel
+iepro4s
+iep3s4
+iep5st
+iep5tr
+ie4pui
+ie5r4ad
+ier3a4l
+ie3ram
+ie3rap
+ier3as
+ie4rat
+ier5el.
+ier5els
+ie5ren.
+ie5ring
+ierk4
+ie3r2o
+ie4rof
+ier4sl
+ier5slu
+ie3ru
+ier4ui
+ie3sf
+ie2si
+ie4sl
+ie5sle
+ies3li
+ies3m
+ie2s3n
+ie2so4
+ie4s3pl
+ie3sta
+ies5te.
+ie5stel
+ies5tere
+ie3sto
+ie4taa
+ie5tal
+iet5ant
+ie5ten
+ie3tj
+ie3to4
+ie4t3og
+ie4too
+ie4top
+ie4tor
+ieto5re
+ie4t3ov
+ie5troe
+iets5te.
+iet3ur
+iet3uu
+ie3twi
+i3ety
+ie2u
+ieu3k
+i1eur
+ieu5r4e
+i1eus
+ieu3sp
+i1euz
+ie3v
+ie3z
+iezel5a
+i3és
+i1ét
+i1è
+i4ëg
+i4ëva
+4if
+if3aa
+if3ad
+if3l
+if3r
+if4ra
+if4taa
+if4tar
+if4tre
+iftu5r
+if3ui
+ig4a
+ig3aa
+ig5ac
+i5gal
+i4g5av
+i3ge
+ige2s
+ig3esk
+ig3ij
+i4gind
+igi3o
+ig5no
+i3g4om
+ig4op
+igs4
+ig3sk
+ig3sl
+ig3sp
+ig3sto
+ig3un
+i1h
+i3i
+i5ie
+ii2n
+i5is
+i2j
+4ij.
+ij5a
+ija4d
+4ijd
+4ije
+ij3ef
+ij3ei
+ij3el
+ij5e4n3
+ij1er
+ij3i
+4ijn
+ij3o4
+i3jou
+4ijso
+4ijsp
+4ijst
+ij5te
+ij4tr
+ij5u
+4ijvo
+4ijzo
+4ik
+ik3aar
+i4kam
+i3ke
+ik3ef
+ike4ra
+iket3
+i2kij
+i3kl
+ik3la
+i4k3lo
+i4k3lu
+i2k4n
+i4k5na
+ik5o2g
+i3kom
+i2koo
+iko2p
+ik3ope
+ik3ord
+i4kr
+ik3re
+ik3ri
+ik3ro
+ik5se
+ik5si
+ik3s4l
+iks3n
+ik3sno
+ik3sp
+ik4spa
+ik1st
+ik5sta
+iks5te.
+ik1w
+ik5war
+i1la
+i3la.
+il4aa
+il5aan
+il3ac
+il4act
+il3ad
+il3af
+i3lak
+il3al
+i5land
+il2da
+il4d3r
+ilds4
+4i3le
+il3een
+ile3l
+i4l3erv
+ile4t
+ilet5r
+ile3u
+il3e4ve
+ilevin4
+i4l3e2z
+i3lé
+il5f
+i3li
+ilie5g
+ilie5t
+il3ink
+ilk4l
+ilk3s2
+illa3s
+1illu
+il2m
+ilme2
+il4min
+il4mo
+i1lo
+ilo4ge
+il3ond
+i3loo
+i5loon
+il3oor
+il1or
+ilo4re
+ilo4ve
+il3s2h
+ils5j
+il4sti
+il2th
+i1lu
+4im.
+i2mag
+i4mago
+im5au
+imee4
+im3een
+i4m3em
+im3enc
+im3ex
+4imf
+i2m3of
+im3op
+im3org
+im5pa
+im4s3oo
+im1st
+i3mu
+in1ac
+i2nau
+ind4aa
+in4dene
+ind3sc
+ind5ste
+1indu
+in3e4de
+in3edi
+in3eed
+inek4
+ineo2
+inet4s
+i5neu
+1inf
+in2ga4
+ing3aa
+ing3ag
+ing3al
+3ingan
+ing5lo
+in2go
+in4gr
+ing4st
+4ini.
+i3nie
+ini5on
+ini5sl
+ini5sta
+4inkj
+in2kn
+3inkom
+in4kri
+3inno
+i1no
+i3noc
+i3nod
+in4o2g
+in1on
+ino5pe
+ino3s4t
+in3ov
+1inri
+4ins.
+in5sch
+in5se
+in3sl
+in3smi
+in3so
+in1sp
+in5spo
+in5sten
+in5swi
+in4t3ap
+in5te
+intes5
+in3th
+1int4r
+i1nu
+inuut3
+4i1o
+io5a
+ioas5
+io5b
+i3o1c
+i3ode
+ioes3
+io3f
+io3g2
+i3ol
+i5ol.
+i5olen
+i5olus
+i3on
+ioneel4
+i5ong
+ion4s3
+ions5c
+i5oo
+i2op4
+io3pa
+io3pr
+i3opt
+io3ra
+i3ori
+io3ru
+io4s
+i3os.
+ios3c
+i3o5se
+i3o5sf
+io5sh
+io5si
+i5osi.
+io5so
+io5sp
+io5s4t
+i5o5su
+i3osy
+i5othek
+i3oti
+iot3j
+i5otorens
+io3tr
+i2o3v
+i3ox
+i2oz
+i1pa
+i2p1ac
+ip3af
+i3pap
+i1pe
+i4perw
+ipe4t3j
+i1pi
+ip1j
+i1pl
+ip3lu
+i1po
+ipo4g
+i1pr
+i2pri
+ip3ru
+i4ps
+ipse4
+ip4si
+ip4sle
+ips5te.
+ip5sten
+i3ra
+ira3k
+i1r2e
+ires4
+ire3st
+i3ré
+i1ri
+irk4s
+i1ro
+iro3p
+iro5v
+ir2s
+ir4sc
+ir3sp
+ir5ste
+irt3r
+i1ru
+4is
+i1sa
+i2saa
+i4s3ad
+is3a2g
+is3ap
+i2s1ar
+i2s3as
+i4sc
+i5scha
+i5schr
+is5col
+i5scoo
+i5scope
+ise2d
+i4s3ei
+is3ell
+is5eng
+i4s3erv
+ise3st
+iset3j
+is4fee
+is4fer
+i4sh
+is5ho
+isi2d
+i2sij
+i2s3im
+is3ja
+i4sk
+is3ka
+is3ke
+is3l
+is5lag
+is5las
+is5le
+i4s5m
+i4s3n
+is5ned
+is5nij
+is5no
+5isol
+i4soo
+is4oor
+iso3s
+i2sot
+is3ott
+is3p
+is5pas
+is2pi
+is5pl
+is5q
+is5sa
+is5so
+i2s3t
+is1ta
+i3stak
+ist3ap
+i4s5tas
+is4tat
+is5terd
+is5tere
+is4th
+is1to
+ist5ong
+i3str
+is5tri
+i5stro.
+i3sty
+isu2m
+i5sy
+4it
+i1ta
+it3ac
+ita5d
+it3een
+i3ten
+i3ter
+ite5rei
+ites4
+ite3st
+ite4t
+it3hie
+it1ho
+it1hu
+it2i
+itie5st
+i4tj
+i1to
+it5oef
+it3oog
+i3t2ou
+i4to4v
+itper5st
+it3red
+it1ru
+it3sje
+it3sli
+it3sop
+it1sp
+its4te
+it4ste.
+it4too
+i3tu
+it3w
+4i3u2
+iu4m
+ium3a4
+ium3e
+ium3o
+iu3r
+i3ve
+iven5s
+ive3re
+i5w
+iwi2
+iwie2
+iwit3
+4iz
+i3ze
+ize3t
+î3
+ît4
+1ï
+2ï.
+ï5a
+ï1c
+ï1d
+ïe4n3
+ïe5nen.
+ï2n3a
+ïns5m
+ïn3sp
+ïn3u
+ï3n4ur
+ï3o
+ï3ri
+ï3ro
+4ïs.
+ïs3a
+ï4sc
+ï5sche
+ïs3l
+ï3so
+ïs3t
+ï1t
+ï5z
+4j.
+1jaar
+jaar5tj
+ja3b
+2jaf
+1jag
+jagers5
+ja3kn
+ja3mi
+jan4s3l
+jan4st
+ja3pl
+ja1po
+1jar
+jare4
+1jas3
+jas5p
+3jaw
+jaz4
+j3b
+jba4l
+jbe4l3i
+j1c
+jda2
+j2d3aa
+jd3an
+j4d3ar
+j2d3ee
+jde4n3e
+jden4s
+jdens5p
+j4d3erv
+jdes4
+jde3sp
+jde5st
+jdi3a
+j2do4
+j3dom
+jd5on
+jd3op
+j3dr
+j4d3re
+j4d1ri
+j4d3ro
+j4d3ru
+jd5sei
+jd3spo
+jd1st
+j2d3u
+jd3w
+j3d4wan
+jea4
+3jeba
+je3ch
+jec4ta
+2j1ee
+jel4
+je3la
+j1en
+je2na2
+je3n4o
+5jep
+jepiet5
+je3ro
+jers4
+jer3sp
+je4s3
+3jesa
+5jesal
+je5sch
+3jeskn
+jes5l
+jes5m
+jeso2
+jes5pa
+jes4pr
+3jesr
+jes5tr
+5jesvo
+3jeswa
+3jeswi
+je2t
+jet3er
+jeto4v
+jet5st
+5jeu
+3jevr
+2jew
+j3ex
+j2f1a
+j2f3ei
+j2f1en5
+j4f3ij
+jf3ink
+jf3l
+j3f4lat
+jf5le
+j2f3o4
+jf3r
+j3f4ra
+j3f4ro
+jf2s
+jfs3a
+jf4sc
+jf4s3er
+jfs5f
+jfs3l
+jfs5m
+jfs3n
+jfs3p
+jfs5pa
+jf3st
+jf4sta
+jfs5tak
+jf5stan
+jf4stel
+jf4sti
+jf4s5to
+jft2
+jf5ti
+jf5tw
+j1g
+j3ge
+jger5sl
+j2g3l
+jg4s5e
+jg3sn
+jg2st
+jg3s4te
+j3h
+jif3
+j3ig
+jin3g
+ji5t2j
+j3j
+2jk
+j3ka
+j4kaa
+jk5aard
+j4kar
+jk3arb
+j4kau
+j4kav
+j2kij
+j2k4l
+j3klaa
+jk5lak
+jk5lap
+jk5las
+j4kle
+j5kled
+jk5les
+jk5li
+j3klon
+jk5lop
+jk5luc
+j2kna
+j2k3of
+j4k3o4l
+j2k3on
+j2ko4p
+jk3opb
+jk3ope
+jk3opl
+j3kops
+j2kr
+j4kra
+jk3raa
+j5kran
+jk3re
+jk3ro
+j4k5ru
+jk3slo
+jks3pl
+jk4sta
+jks5taak
+jks5taal
+jks5tak
+jk5stan
+j2k3ui
+jk3w
+j3k4was
+j1la
+j3laa
+jl5ana
+j1le
+j2l3ef
+j2l3el
+jl5f
+jl3ink
+j1lo
+j2loe
+j3lu
+j2m3af
+j5m4ar
+j3mi
+jm3op
+jm3s
+j2n1a4
+j4naa
+jn5ac
+j3na5g
+jn3ak
+jn2am
+jna5me
+j3n4an
+jn5d2r
+j2nef
+jne4n
+j4n3erk
+j4n3erv
+jn3gl
+j4n3im
+j4n3ink
+jn3k4
+j2n1o4
+jn4si
+jn2s3l
+jns5lac
+jn3slu
+jns5or
+jn2sp
+jns3pl
+jn1st
+jn4ste.
+jnt4
+jn3tr
+joet3
+4joi
+jol4e
+jo5lij
+j3om
+1j4on
+jone2
+j3op
+jo3pe
+jo3ra
+jo3ru
+j4ou
+1jour
+jou5re
+joy3
+j3pa
+j4p3ac
+jp3arm
+j1pe
+j2p3em
+jp3ij
+j1pin
+j3pio
+jp1j
+j1pla
+jp3li
+j1po
+j2p3or
+j4pre
+jp3ri
+jp3rok
+jps4
+j3r
+jraads5
+2js
+js1a
+j4sef
+j4s3ela
+j5seli
+j4s5em
+j4s3e4r
+j2s1i
+js5in
+js4ir
+js4le
+js3lee
+js3li
+js5lie
+js4me
+js5mel
+js5met
+js3n
+j4s1o4
+j5soe
+js3ol
+js3pac
+js3par
+j3spe
+js3pl
+j4spo
+js3poo
+jspoort5j
+j5spor
+j1sta
+j4star
+j2s3te
+j3stee
+j3s4tek
+j3s4tel
+j5s4teng
+js3th
+js4tij
+j5stond
+j4stoo
+js3tou
+jst5ran
+j5strok
+j2su
+j3sy
+j3taal
+jt3aar
+jt1ac
+j1tag
+j3tak
+j3tan
+j3te.
+jt1h
+j3toe
+jt3opt
+j3tr
+jt3ra
+j5tred
+j5tree
+jt3rei
+j5trek
+jt3ri
+j5trok
+jt3rot
+jt1s
+j1tu
+1j4u
+ju3d
+4jum
+jus3
+juve5
+j3v
+jve2n
+jver4s
+jvers5p
+jve3t
+jvie5s
+j1w
+jze4r5o
+4k.
+1ka
+k3aanb
+k3aanl
+5kaart
+kaart5jes
+kaats5te.
+kabe2
+ka3bo
+2k1ac
+kade4t5
+4k3adm
+ka3do
+k3adv
+2kaf
+k3afd
+k4aff
+ka3fl
+3k4aft
+ka4ga
+k3a4gen
+k3ah
+ka3i
+2k3alb
+ka3le
+5kalf
+kalf4s5
+ka3l4i
+kal2k
+kalk3a
+4kalt
+5kalv
+3kam
+4kamb
+kamen4
+kame4re
+kam4pa
+kam4pl
+kam4pr
+ka5naa
+kan5d
+4kang
+kan4sl
+kan4st
+kan4t3j
+kao3
+5kap.
+ka3pe
+kap3l
+ka1po
+4kappa
+ka3pr
+kap3s
+k3arc
+k4a3ro
+kart4
+4k3arti
+kar3tr
+ka4s
+kas5c
+4k3asi
+kast3o4
+ka3str
+kast5ra
+ka5stro
+kas3u4r
+kat5aal
+ka4t5a4le
+ka4tan
+kati4
+ka4t5io
+kat5j
+k3atl
+kato4
+ka4t3og
+ka5tr
+kat3s
+2k1aut
+2kavo
+2k3b
+2k1c
+k3ca
+2k5d
+kdi3a
+1ke
+k4eb
+2k3ec
+ke4di
+2k3een
+kee4p5l
+kee4r
+keer4s
+keers5to
+2kef
+4keff
+k4ei.
+k4eie
+k2eil
+kei3s4
+kei5t
+ke4lap
+kel5da
+kel5dr
+ke5lel
+4kelem
+kel5f
+ke4l5int
+ke4lom
+ke4l3op
+kel3sp
+5k4ema
+2kemm
+2kemp
+ke4n3an
+ke4nau
+ken4ei.
+ke5nen
+ken5k
+ke2n1o
+kens5po
+kepie5t
+4k3e4q
+ke3ram
+ke4r5enk
+ker3kl
+ker4kle
+ker4kn
+ker4k3r
+ker4ku
+ker4kw
+ker4n3a
+ker4no
+ker3o4
+ke3ros
+ker4sm
+ker5spe
+ker4spr
+ker4sta
+ker5ste.
+ker4sti
+4k3erts
+4kerva
+4kerwt
+ke2s
+ke3s4p
+ke3sta
+kes5ten
+ke3sto
+ke5straa
+k2et
+5ketel
+ke2t3j
+ke3to
+ke2t3r
+kets5te.
+ketting5s
+4k3e2tu
+ket3w
+3k2eu
+keviet5
+ke4vl
+4k1ex
+2k3e2z
+2k1f
+2k3g
+2k1h4
+k3ho
+khoud5s
+1ki
+2ki2d
+4kied
+kie4sp
+kie4s4t
+kie5ste
+kie4tj
+kieze4
+2kië
+kijk5l
+k3ijs
+4kijv
+4k1ijz
+ki3lo
+kilo5v
+ki3na
+4kinb
+4k5indel
+kinds5te.
+4kindu
+kin3en
+5king
+kings5l
+2k3inh
+kinie4
+k3inko
+4k1inr
+2k1ins
+2k3int
+4k3inv
+ki3o
+ki2p3l
+ki5se
+ki3s4p
+kit4s
+kits5te
+k1j
+2k3ja
+k3jew
+k3jo
+2k3ju
+4k5k4
+kke5nei
+kker4s
+kkers5ten
+kke3st
+1k2l4
+5klac
+k3ladi
+kla2p1
+k4las
+5klas.
+5klass
+k3last
+k3lat.
+k3latt
+3k4lav
+3k4led
+5kledi
+5kleed
+k5leer.
+4k5leg
+5klem
+4k5len
+k3ler.
+4klera
+k3lers
+k3les
+5k4le4u
+k5lic
+4klid
+k3lig
+2k3lij
+4klijs
+k4lim
+kli4me
+3k4lin
+k5lob
+4klod
+3klok
+5klok.
+k5loka
+k3loke
+k3lood
+5kloof
+k3lope
+5klos
+klots5te.
+2k5loz
+4kluc
+4kluih
+2k1m
+k3ma
+1k2n4
+4knam
+k4nap
+3k4nar
+5knec
+k5nem
+kni2
+5knie.
+knip1
+4k5niv
+3knol
+k3note
+2knum
+1ko
+ko4bl
+k4oc
+2k5oct
+4k1oef
+5koek
+koe4ket
+koers5p
+koes3
+koe3tj
+koets5te.
+koge4
+5ko5gr
+3k4ok
+ko5ko
+kol2e2
+kolen3
+2kolm
+5kolo
+ko4ly
+ko2m3a
+4komg
+kom5p
+k3omsl
+kom4str
+4komz
+konge4
+k4oni
+k3ontb
+kon4t3j
+kon4t3r
+koo4
+2k1oog
+kooi5tj
+koot3
+koot4j
+ko3pa
+4kopb
+4k3opd
+ko1pe
+ko5pen.
+4kopg
+3ko5pi
+5kopj
+ko2pl
+2kops
+4kopz
+2kord
+kor5do
+2k1org
+2k3ork
+kors5te.
+kor4ta
+kor4t3o4
+kor4tr
+ko3ru
+3k4o4s3
+4k3os.
+kos4j
+ko5sjere
+koso4
+4koss
+kot4st
+kots5te.
+4k1ov
+4k3ox
+2k3p
+kpi3s
+k4plam
+kpren4
+1kr4
+3kra
+k5raad
+kraads5
+kra4b
+4k5rad
+k5rand
+2k1rea
+2k3rec
+4k3rede
+k4ree4
+k5reep
+kreet3
+k3ref
+k2reg
+2k3rel
+2k1ric
+k3rijk
+k3rijp
+krij4t
+krijt5j
+k4rit
+k5ritm
+kroet5j
+2krol
+k4ron
+kron3t
+5kroon
+krop3a
+kro4to
+2krou
+k3ro5v
+3k4ru
+k5rub
+5kruis
+kru4l
+krul5a
+2ks
+k3sal
+ks3alm
+ks3an
+ks3ap
+ks1ar
+ks3as
+ks2e2
+k5sec
+ks3ed
+ks5ei.
+ks3ep
+k4serv
+ks3et
+kse3v
+ksges5t
+k4si
+k5sil
+ks1in
+k5sis
+k5sit
+ks1j
+k1sla
+ks3lab
+k4slan
+ks3le
+ks3li
+k4smo
+ks3na
+ks3no
+ks3nu
+kso4
+ks3om
+k5song
+k2s3pa
+ks5pand
+k4spar
+k1spe
+k3spi
+ks3poo
+k5spor
+ks3pot
+ks3pru
+k3spu
+ks5s
+ks4t
+k1sta
+k5staan
+k5staat
+k1ste
+ks5tec
+k4st3ed
+k3sten
+ks5tent
+kste4r
+kster5a
+k4sterr
+ks3th
+k3sti
+k3sto
+ks5ton
+k5stoo
+k4stop
+k5stot
+ks5trek
+ks3tri
+k3stue
+kst5uit
+k1sy
+4kt
+k1ta
+kt3aan
+k3taar
+ktaat5
+kt3ac
+kt3art
+k3te
+kte2c
+kt3eco
+k4tex
+kt1h
+k5tij
+kt3im
+kt3in
+k5tit
+kt3j
+k1to
+kt3om
+kto4p
+kt4or
+kt5ord
+kt5org
+kt5ori
+kt3o4v
+k1tr
+kt3res
+k5troll
+ktro3s
+k3tu
+1ku
+ku5be
+kui2f
+2kuit
+ku5k
+ku5me
+3k4u2n
+4k5uni
+5kuns
+ku2r
+ku3ra
+ku3re
+kur3s
+3ku2s
+kut3
+2kû
+2kv
+k3ve
+kven4t3
+5k4waal
+2k3wac
+k2wad
+k1wag
+5k2wal
+5k2wam
+3k4war
+k5ware
+4kwat
+k3weer
+2kweg
+k1wei
+5kwel
+kwen4st
+kwens5te.
+4k1wer
+5k2wes1
+kwes5tr
+5kwets
+k2wie
+k3wijz
+k4wik
+2kwil
+2kwin
+k3wind
+4k1wo
+ky3
+2kz
+4l.
+2laan
+4laand
+l3aanh
+laa5re
+laar5tj
+laat5sta
+l3abon
+2lac
+la4ca
+5lach.
+la4cha
+5lache
+lach5te
+lacht4s
+l4aci
+la2d5a
+la4det
+2ladj
+4ladm
+la2d3o
+4la2dr
+lad5s
+la2du
+4ladv
+3lae3
+2laf
+la2fa
+la3fl
+lafo2
+4l3afs
+la2g3a
+la4gent
+la2go
+lag3r
+lags4
+lag5sa
+la2k3a
+la4ki
+la3kr
+2lal
+3lald
+lal4o
+lam4p3j
+lam4p5l
+lam4po4
+lam4s3p
+l4an
+4la2na
+lan3ac
+3land
+lan4da
+land5aa
+lan4d5oo
+lan4d3r
+lands5te.
+la4n3ec
+lanel5
+5lange.
+lang5l
+lang5sp
+lang5sta
+lan4k3a
+lan4k3l
+lank3w
+4lann
+la4nor
+lan2s
+lans3l
+lan4st
+lan4t3j
+lap3ac
+la3pi
+lap3l
+lap3o4
+la5pre
+la2p3u
+la3q
+lar3da
+2larm
+4larm.
+lar5st
+las3a4
+lase4
+la2si
+las3to
+5lastt
+la3te
+la4t3he
+lat5j
+la4t3ro
+4lats4
+lat3sl
+2lau
+5lauf
+lau4st
+l2auw
+la3v
+lava3
+la4vo
+5law
+l4az
+4lazi
+la4zij
+2lb4
+lber4t
+lbert5j
+lboot4
+2l1c
+lce4l5
+4ld
+ldaat5
+l2d3ac
+ldak4
+ld3alf
+l4da4r
+ld3arc
+ld3ari
+ld3art
+l2dau
+ld3eco
+ldeks5
+l4d3e4z
+ldi3a
+ld5oef
+ld3oli
+l2d3om
+l2d3on
+ld3oog
+l4do4p
+ld3opi
+ld3ord
+ld1ov
+l3dr
+l5drade
+ld3ram
+ld5rang
+ld3rat
+ld1re
+l5dree
+ld3rij
+ld3roe
+ld3rol
+ld3rom
+ld3rui
+ld3sa
+ld3sl
+ld3sma
+ld5sp
+ld5ste
+l3du
+ld3uit
+ld3uu
+ld1w
+le2a
+le4ane
+le3at
+leba4l
+lecht5st
+lee4
+leeg3
+leege4
+leeg5i
+4leekh
+lee5l
+leem3
+3leen
+4leep
+leep3o
+lees5e
+lees5l
+lees5po
+2leeu
+2leff
+lega5s
+leg3ec
+leg3l
+le4go
+le5go.
+leg5s
+3leidi
+4leier
+4leig
+lei5tj
+leit5s
+le4ko4
+4leks
+lek5str
+5leld
+le2le
+5leli
+l3elp
+le4n3a4d
+len3a4k
+3lene
+le4n3e4m
+len5kw
+le2no
+len3op
+len3sf
+len3sm
+4l3en5th
+le5o
+4lep.
+3le1ra
+le4r3a4k
+le5rei
+le4r3e4v
+ler5g4
+le3r4o
+le4ron
+ler4sl
+ler5spo
+4l3erts
+le2s
+le4sa
+le3sc
+les5et
+le3s4h
+les3m
+le4sp
+le3spe
+4l3essa
+les3t
+les4ta
+les5taa
+le5s4tel
+le3str
+le4s3u
+le4t4h
+le3tha
+let4i
+le5tin
+le4top
+le2t3r
+le3t4re
+let4st
+lets5te.
+le2t3u
+leu3ko
+leum3a
+leur4o
+leus4
+leu5ste
+5leuz
+leven4s
+levink5j
+4lexc
+4lexp
+l2fac
+l3f4ag
+lfa3s
+l2fau
+lfe4n
+l4f3end
+lf3ene
+l2fe2z
+lf3li
+l3f4lo
+lf3lu
+l4fo
+l5foe
+lf3o4l
+lf1op
+lf5ord
+lf5org
+l5fou
+l1fra
+l3fru
+lfs5ei
+lf4sl
+lfs3le
+lf2s3m
+lf4so
+lft4
+lf5ta
+lf5tw
+lf3uu
+2l1g
+l5gaar
+l4gap
+lge4n5a
+l3gla
+l3g4oe
+l3gog
+l3goo
+lg3s4
+lgse5
+4l1h
+1li
+li3ag
+li3am
+licht5st
+3lid
+5lid.
+5lidm
+lid3s4
+lie4g3a
+lie4gr
+lie3ka
+lie4sp
+lie3s4t
+lie4to
+li3eu
+3liè
+3lift
+l4ig
+li3go
+lijk3a
+lij4m3a
+4lijmv
+5lijn
+4lijp
+3lij2s
+lijst5a
+4lijt
+4l3ijz
+li5kr
+lik5sp
+li4kw
+li3kwi
+lim4a
+li3mi
+2limp
+lim4p3j
+lin4da
+4linf
+4l3inh
+li5ni
+lin4k3a
+3linn
+l3inna
+2linr
+2l3ins
+lin4t3j
+l3inv
+4linz
+li3ob
+li5om
+li5o5s4
+li3ot
+li2pa
+li3pi
+li2p3l
+li5see
+2liso
+l5isw
+li1t2h
+lit3r
+lit4sa
+lit4sl
+lit4st
+lits5te.
+lit5sten
+2lix
+4l1j2
+lk3af
+l4k3ank
+lk3arm
+lk3art
+l3ke
+l4k3ei
+l4k3em
+lken5e
+lken4s
+l4k3ep
+l3ki
+lking4
+lk3laa
+lk3lag
+l5klas
+l4k3lev
+l5klim
+l3ko
+l5koe
+lk3ont
+lkooi5
+lk3opb
+l5kor
+l5kou
+l5kra
+l2kre
+lk3rep
+lk3res
+lk3rij
+l2k3ro
+lk2s
+lk4se
+lk4so
+lk3son
+lks3oo
+lks5taa
+lk3ste
+lks5tel
+lks5tr
+l4k3uu
+l3kw
+lk3wi
+l3ky
+2l1l
+l5la
+lla3d
+lla3g4
+lla5tr
+ll3eig
+lle3k
+ll4el
+lleo4
+ller5on
+lle3s4m
+lle5th
+llevie5
+l3l4i
+l3lo
+llo5f
+l5lon
+ll3sh
+2lm
+l3maa
+lmaat5
+lm3a4ca
+lm3af
+lma5ï
+l3mak
+lm3arc
+lm3art
+lma3s2
+lm3au
+l3me
+l4med
+lm3edi
+l4m3ep
+lme2s
+lme5te
+l3mi
+l3mo
+l5mog
+lm3oli
+lm3or
+lmro4z
+lm5sc
+lm3sh
+lm3su
+2l3n
+lni4s
+lo3a
+2lobj
+lo4boo
+loe4d5a
+loed3r
+4loeg
+loe4gr
+loen4st
+loens5te.
+4loes
+l3oeu
+5loev
+lo4faa
+lof5d2
+lof4s4
+log4
+log5l
+lo3go
+5logr
+log2s3
+lo4k3ar
+lo2k3o2
+lo4kr
+lo2ku
+2lo2l
+lo3la
+l3oml
+lom4p3j
+lom4p3l
+l3omt
+l3omv
+4lomz
+3lon.
+4lond
+5long
+lon4gaa
+lon4g3o
+lon4gr
+lon3o
+2lont
+lon4t3j
+3look
+loo5pi
+3loosh
+loot3e
+lo3pa
+4lopb
+l3opd
+lo1pe
+2l3oph
+2l3opl
+lop4la
+2lopn
+lo3p2r
+4lopt
+4l3opv
+4l3opw
+2lor
+3l4or.
+lo3re
+4l1org
+lo3ri
+l4o1r2o3
+3l4ors
+lo3ru
+lo3spe
+lost4
+los5to
+lo4s5tr
+lo5s2u
+lo2ta
+lot3a4l
+lo4tet
+lo2t3h
+lot3j
+lo4tof
+lot3r
+lou3s
+lo3v
+2love
+3lo5z
+4lp
+l1pa
+l3paa
+lp3aan
+lp3a4g
+lp3am
+l3par
+l3pas
+l1pe
+lpe2n
+l2pex
+l3pi
+l5ping
+lp3ins
+lp3j
+l1pl
+l3p4la
+l4plam
+l1po
+lp3of
+l3pom
+lp3on
+lp3ope
+l3pos
+l3pot
+l1pr
+lp3ram
+4l3r
+lraads5
+lrus5
+4ls
+l4saa
+ls1a2d
+ls3a2g
+l1sam
+ls3an
+l3sap
+ls3as
+l2sat
+ls4cor
+ls4cu
+ls3eco
+l4s3e2d
+l4sef
+l5sen
+l4s3e2p
+lsge4st
+l3s2hi
+l3si
+l4s3im
+l4sin
+ls3inj
+ls3ink
+ls3int
+ls4j
+ls5ja
+l3s4kel
+l3s2ki
+l1sl
+l3sla
+l2s4le
+ls5led
+ls5lee
+ls5leg
+ls5len
+l2s3li
+ls4lin
+l3slo
+ls4maak
+ls4med
+ls4mee
+l3smid
+ls3na
+l3sne
+l3sno
+ls3nor
+l3soc
+ls3of
+l3sol
+ls3op
+ls3o4r
+ls1ov
+l1sp
+l2spa
+ls3pac
+l3span
+ls3par
+ls4pe
+l3spi
+ls3pli
+l3spoo
+l4s5poot
+l3spor
+l2spr
+ls3pra
+l1st
+l3sta
+l4staf
+l4stak
+ls5tak.
+l3ste
+l4stek
+l4stev
+ls4ti
+l3sto
+l5straa
+ls5trak
+l5strat
+l3stu
+ls5ty
+l2su
+l3sur
+ls3us
+l3sy
+4l1t
+lt4aa
+lt1ac
+l4tam
+l5tame
+l5t4an
+lt4han
+l4t3hi
+l2t3ho
+l3thu
+lto4l
+lt3oli
+l2t3o4v
+l3tr
+ltra3s
+lt3rug
+lt3sl
+lt3sp
+lts5te.
+l3tu
+lu4b1
+lub5e
+lub5l
+lu1en
+3lui.
+5luia
+5luid
+luids3
+5luie.
+2luit
+luk2s
+luks3t
+lu3na
+3lunc
+2l3u2ni
+lu3sta
+lu3ta
+lut3j
+lut4st
+luts5te.
+lu3wi
+lven5s
+lvera4
+l1w
+1ly
+ly5i
+ly3st
+4lz
+lzooi5
+4m.
+1ma
+maas3
+maat5st
+m3act
+2m3adv
+ma5esto
+m3afl
+ma3fr
+2m3afs
+4m3afw
+m4ag
+ma3gl
+ma5go
+ma3gr
+maï4
+ma5ka
+ma5ke
+5ma3k4r
+ma3kw
+ma3l4a
+ma5lac
+ma4l5ent
+mal5st
+5m4an.
+man3ac
+m3anal
+man5da
+man5do
+mand4s
+5m4ann
+ma5no
+5man2s
+man4se
+mans5ee
+man4so
+mans3p
+man4s3t
+mans5ta
+man4th
+mant4r
+ma5pa
+ma3pr
+ma3q
+m4a5ri
+mariet5
+5m4ark
+mar3sh
+mar4s5t
+mar5ti
+ma1so
+ma3s4po
+5mass
+ma4ste
+ma3str
+ma5ta
+5mater
+mat5j
+ma4tom
+ma3tr
+mat4st
+mats5te.
+ma3v
+4mb
+m5bl
+mboot4j
+mbo5st
+mb4r
+2m1c
+2m1d
+m5da
+mdi3a
+mdis5
+m3do
+mdo3p
+m3dr
+m3dw
+1me
+me1c
+me5de
+5media
+5mediu
+mee5g
+mee3k4r
+mee5las
+mee3lo
+mee5re
+mee5ri
+5mees
+meest5al
+mee5stov
+mee5str
+m5eg.
+me3g2a
+mega5s
+m5egd
+m5egg
+m5egt
+me4i
+mei2n
+mei5tj
+m2el
+me4l4as
+mel5as.
+mel5dr
+mel4ko
+mel4kr
+5melo
+mel3s4m
+me4mi
+3men
+m4en.
+me3na
+men4as
+meng5ra
+men5k
+me5nor
+4menq
+men4s5uu
+men4t3j
+ment3w
+me5nu
+me3p2j
+2m3e2q
+me1ra
+me4r5aak
+me4r3a4k
+me4r4am
+mer5ante
+me4rap
+me3rau
+me4rav
+mer3ei
+5merk
+mer4kl
+mer4kn
+mer4kw
+mer5oc
+me5rong
+me3roo
+4m3eros
+me3rot
+mer4si
+mer4sl
+mers5m
+mers5ta
+me2ru4
+m4es
+me3s4h
+me4s4l
+mes5li
+me5slo
+mes3m
+me3so
+me4sp
+mes3pa
+me5spe
+me5spot
+me5stel
+mesto4
+mest5ov
+me3stu
+me5ta5n
+me3t4h
+3meti
+me5tr
+mets5te.
+meve4
+m3e4ven
+2mex
+3mé
+3mè
+3mê
+2m1f
+mfa3t
+mf4l
+mf3li
+mf5lie
+m5fo
+2m5g
+mger4
+2m1h
+1mi
+3mid
+4mid.
+5midd
+mie5kl
+mie3st
+4m3ijs
+4m3ijz
+mi3kn
+5mili
+mi3lo
+mimie4
+m3imp
+mi5nar
+2minf
+5ming
+4minh
+2m5inr
+2m3ins
+mi5nu
+4m3inw
+m2is
+mis5f
+mi2s3i
+mi3s4la
+mi4st
+mi5stra
+mis5tro
+mi3t4a
+mi1tr
+mit4st
+mits5te.
+mit5sten
+2m1j
+2m3k2
+mkaart5j
+2m3l
+2m1m
+2m1n
+m5na
+1mo
+5mo.
+mo3a
+5moda
+5mode
+moed4s
+2moef
+5moei
+moers5t
+moe2s
+moes3p
+moes4te
+mog2
+5moge
+mogen4s
+mo3gl
+4mok
+5mole
+2moli
+mo4lie
+mol4m3a
+4molt
+3mom
+4m3omv
+mond3r
+mo5no
+5mons
+mon4so
+mon5ta
+3mooi
+2mop
+mo3pa
+m1ope
+m4opp
+mop4s
+mo3ra
+mo3r4e
+mo3ro
+mor4sp
+mor4st
+mors5te.
+5mos
+mo5sc
+mo4s5l
+mo3sta
+mo3t2h
+mot3j
+mot3ol
+mot4st
+mots5te.
+2m3oud
+5mouw
+mou4wi
+mo3v
+m3ox
+2m1p
+mp3ach
+m4p3af
+m5pan
+mp3arm
+mp5arts
+m4p3ec
+m5pen
+m4p3erv
+mp3ins
+m3pl
+mp3lam
+m5plan
+mp3leg
+mp3lei
+mp3lev
+mp3lie
+m4plu
+mp5olie
+m5pon
+mpon4g
+mp3ope
+mp2r
+mp3rec
+mp3red
+m5pres
+m4ps2
+mp5sc
+m5p4se
+mp3sh
+mp5su
+2m1r
+2ms
+m3sam
+ms3ana
+ms3ap
+ms2c
+ms3co
+ms3cu
+ms2j
+m3sje
+m1sl
+m2sle
+ms3len
+ms3lie
+m3s2m
+ms3ma
+m1sn
+ms3nee
+mso4
+m3sol
+ms3or
+m3s2p
+ms4t
+m3sta
+m1ste
+ms5tec
+m5stel
+m5sten
+m1sti
+m1sto
+ms5toc
+m4s5ton
+mst5s
+m3sy
+2mt
+m1ta
+mte5re
+mtes4
+mte5sta
+m1th
+m1to
+m3tr
+m1tu
+1mu
+mu5da
+mue4
+5muilde.
+2muit
+2muk
+mul3p
+mu2m3
+mu3no
+munt3j
+mu3sa
+mus5ta
+5mut
+mut3j
+muts2
+muts5te
+3muu
+5muz
+2mv
+mvari5
+mve4
+mvee3
+mver3e
+2m1w
+1my
+my3e
+2mz
+mze4
+mzet5
+4n.
+1na
+3na.
+3naal
+5n4aam
+4n1aan
+2naap
+n4aar.
+4n3aard
+5naars
+naars5tr
+naar5tj
+5naast
+5naat
+n3abd
+5nabe
+2nac
+na2ca
+nacee5t
+n2aci
+3naco
+4n3act
+na5d4a
+nad4e
+3nade.
+5n4a5den
+3nades
+3nadi
+4n3adm
+na5dra
+2n1adv
+5nae
+n3aë
+4n1af
+na3f4lu
+n2a3g4
+na1h
+3nai
+3naï
+n2ake
+na3k4l
+na3kr
+n3alb
+3n4ale
+5nalen
+4n3alf
+n3alm
+2naly
+4nalys
+3nam
+4namb
+name5st
+n4ami
+n3amp
+n3a2na
+n3ank
+3nant
+5nant.
+5nante
+n5antenn
+nan4t3j
+2nap
+nap3ac
+3na3p4l
+na3p4r
+nap3s
+nap5st
+2n1arb
+5nares
+2n3arg
+narie5t
+2n1arm
+3naro
+4nars
+nar4st
+nars5te.
+nar5sten
+4n1art
+nas2
+3na3sa
+na1s4l
+na1sp
+na3sta
+na3stu
+n4at.
+3n4ati
+nat5j
+4n3atl
+na3to
+nats4
+nat3sp
+5nau.
+5naus
+2na3v
+5naven
+3navi
+3nazif
+na4zij
+2nb
+nbe5st
+nbe5t
+nbots5te.
+2n1c
+n3ce
+nces4t
+n3che
+ncht2
+nch5tr
+nch3u
+n5co
+4nd
+n5da.
+nd3aan
+nd5aas
+nd3abo
+nd3act
+nd5adel
+nd3adr
+ndags5p
+nd3alf
+nd3alm
+n4d3ana
+n4dap
+n2dar
+nd3art
+n4das
+nd3ass
+nda3st
+n4dav
+n4d3a4z
+n3de
+n4d3edi
+n4d1ei
+nde5laa
+n4d3emm
+n5den.
+ndera4
+nder5aal
+nder5al
+nde4r5an
+n4d5e4rec
+nder5in.
+nder5og
+nde4ten
+ndi3a
+ndie4tj
+n4dijs
+nd5ijs.
+n4d3ink
+ndi3o
+n3d2ji
+n5do.
+n5doc
+n4d5of
+nd3oli
+nd3omd
+n4don
+n5dona
+nd5ond
+n5dons
+nd3ont
+nd3oog
+nd3ope
+nd3opp
+nd3ov
+nd5rap
+nd3rat
+nd1re
+nd4rek
+n4dres
+nd3rot
+nd3rug
+nd3s4cu
+nd4sec
+nd5set
+nd3s4i
+nd3sjo
+nd4sm
+nd3sp
+nd4spo
+nd4spra
+nds5taal
+nd3su
+nd3uit
+n2d3u4r
+nd5ure
+n4d3uu
+nd1w
+n3dy
+1ne
+3ne.
+ne5ac
+ne3am
+nebe4s
+3neck
+ne2cl
+ne4dit
+ne3do
+n3edu
+ne5dw
+nee4
+4need
+nee5k
+neel5d
+neel3o
+3neem
+4n1een
+nee5ri
+nee5se
+neet3a
+neet5o
+neet3r
+neet5s
+4n1eff
+ne3g2
+ne4gel
+negen5en
+nege4re
+4n1ei
+5neien
+n5eier
+n2eig
+5neigd
+5nei5t
+ne4k3r
+ne2la
+4nelem
+4nelf
+3nem
+4n3emb
+5n4eme
+4n3e4mig
+4n3emm
+4n3emp
+ne2n
+3n4en.
+5nenb
+5n4end.
+nen5do
+ne4n5enk
+ne4ni
+ne5nig
+nen5k4
+nen1o4
+5nenp
+nen5t4a
+ne5oc
+ne5ok
+ne5om
+neo5p
+ne5os
+ne5ot
+nep3ag
+ne3pe
+nepi3s
+ne1ra
+nera4d
+3n2e5re
+n3erfe
+2nerg
+ne4r3id
+ne3ros
+ner4sl
+ner4sp
+ner4st
+ners5te
+ner3u
+ne3ry
+3nes
+ness5a
+ness5t
+ne3sta
+nes3te
+nes4tei
+ne5s4tek
+ne4ter
+net3on
+net4si
+ne2u
+4neum
+ne3ums
+neu5ste
+2nex
+3né
+2n3f
+2ng
+ngaat5j
+n2g1a2d
+ng3af
+ng3ana
+n4ga4p
+n2gar
+nga5sl
+n3gav
+nge4ad
+n4g3een
+ngels5te.
+ng3emb
+n5gen
+nge4rap
+nge4ras
+n4giger
+n4gigs
+ng3ij
+n4gind
+ng3ink
+n4g3ins
+ng4l
+ng5lad
+ng5lam
+ng5lan
+ng5led
+ng5leu
+ng2li
+ng5lin
+ng5lop
+n3goe
+ng3of
+n3goï
+n2g1on
+ng5oor
+ng5op
+ng3ore
+ng3org
+n3got
+n3gr
+ng3rac
+ng3rad
+ng3rai
+n4gras
+ng5rass
+ng4red
+n4g4ri
+ng5rie
+ng3rij
+n5gron
+ng3rui
+ng2s
+ng4se
+ngs5lop
+ngs5lu
+ng4s5ne
+ngs5tak.
+ngs5take
+ngs5trek
+ng5stri
+ng3uit
+4n3h
+nhek5
+1ni
+n4i2d
+nie5kle
+ni3eri
+nie4s3p
+nie4tr
+3nieu
+ni4g3ee
+nig3ra
+nij3f
+nij3k
+2n3ijz
+ni5kr
+nik4s
+niks3p
+3nil
+3nim.
+5nimf
+n3imp
+2n3in.
+n3inb
+2n1ind
+2ninf
+ning3r
+2n3inh
+n3inj
+2ninr
+2n1ins
+2n1int
+2n3inv
+ni3o
+ni4on.
+ni4one
+ni5or
+ni5o5s4
+nip3l
+3nis
+ni4sau
+ni4sel
+ni4s3ev
+ni3sfe
+ni2s3i
+ni4sl
+nis5n
+ni3sot
+ni5stel
+nis5to
+ni3t2h
+ni1tr
+nits4
+n1j4
+n3je
+njes4
+nje5sp
+nje5st
+nje3t
+4n1k
+nk3aan
+nk5aard
+nkaart5j
+nk3af
+n5k4am
+n4k3arb
+nkar5s
+n4k3asp
+n3kef
+nk3eff
+nk3emp
+n3ken
+nken4e
+nker5ku
+nk3id
+nk2j
+nk3lad
+nk3lod
+nk3luc
+nk3lus
+n2k3na
+n3kne
+n4ko4g
+nk3oge
+nkoot5
+nk4ra
+n4krim
+nk3rol
+nk5se
+nk5si
+nk3sl
+nk3s4m
+nk3sn
+nk4s5o
+nk1sp
+nk1st
+n4kw
+nk3waa
+nk3wez
+nk3wi
+2n3l
+2n3m4
+n3n
+n5n2e
+nnee5t
+nne3ne
+nnepo4
+nne4p5ol
+nne5te
+nnet4j
+nn4i
+nning5r
+nnoot5
+nno5v
+3no.
+1noc
+1no3d
+2noef
+noen5s
+noes3
+noet5s
+n5offi
+n3o2ge
+n5ogi
+1nogr
+3noï
+no3kl
+no3k2w
+no2li
+1nolo
+1nom
+4n3om.
+n2oma
+n3oml
+n1oms
+n3omv
+2n3omw
+2nomz
+3n2on.
+3n4onb
+3nonc
+4n5ond
+n4o5ni
+4nont
+3nood
+4n5oof
+4n1oog
+nooi5tj
+3noot3
+noot4j
+3no3pa
+no4p3as
+4n3opb
+no1pe
+n1opg
+n5opleidi
+no4poo
+no4por
+2nops
+2n3opz
+2nord
+no3re
+2n1org
+1norm
+4norr
+3nors
+3norz
+1nos
+no3sf
+no3sn
+no3sp
+1not
+3nota
+not5a4p
+5noti
+not3j
+not3r
+3nou.
+no3v
+3nova
+no4ve
+3nox
+3noz
+2n1p
+npers5te.
+npi4s5
+npoor4
+npoort5j
+n3ps
+2n3r
+nraads5l
+n5re
+n5ri
+2ns
+ns3a4d
+n3sag
+n1sal
+ns3alp
+n1sam
+ns3an
+n3sanc
+n1sap
+n3s4cal
+n5scho
+ns4ci
+n4sco
+nsee5t
+n4sef
+nse4g
+ns5ege
+ns3eis
+ns5emp
+n3si
+ns3idi
+n2sin
+n5sing
+ns3inj
+ns3ink
+ns3int
+n1sjo
+n1sl
+n5sla.
+n3s4laa
+ns5laag
+n5slag
+ns5lap.
+ns5lapp
+n4sle
+n5slep
+ns4let
+n5sleu
+n5slib
+ns3lie
+n5s4liep
+n5slim
+n5slip
+ns5lot.
+ns3m
+ns5mac
+n3s4me
+n3smij
+n3smol
+n4smu
+n1sn
+n2sna
+n5sne
+ns3nod
+n4snoo
+n4snot
+n1so
+n2s3ob
+n2sof
+n3sol
+n2son
+ns3ong
+ns3onz
+ns4opp
+ns4or
+n2s3ou
+ns1ov
+n4s3paa
+ns3pad
+n1spe
+n5spee
+n5spel
+ns3per
+n4spet
+ns4pi
+ns1po
+ns3pol
+n4spot
+n1spr
+ns5q
+ns5s
+ns4t
+n1sta
+nst5aang
+nst5aans
+nst3a4g
+n3stal
+n3ste
+ns5tec
+n4st3ei
+n4s5teko
+ns5teks
+n5sten.
+ns5tent
+n5ster.
+ns5tes
+ns3the
+n1sti
+n3stig
+n4stijv
+n1sto
+nst5oef
+n4ston
+n3stor
+nst5rade
+n5stree
+ns5trekk
+ns5troe
+ns5trog
+nst5roos
+ns5ty
+ns3uil
+n3sy
+2nt
+n3ta
+n5taal
+n4t5aard
+ntaar5tj
+n5tab
+nt3ach
+nt4act
+nt1ad
+nt3aga
+n4t3art
+nt4as
+n5t4at
+n3te
+n5tec
+n4t3ei
+nte4lo
+n5tem
+n5te2n
+nte5nach
+ntene5ten
+nte5rad
+nte4rof
+n3tè
+nt3ha
+n4tho
+n5thol
+n5tig
+nt3inw
+nt4jo
+n3to
+nt4og
+nt4ol
+n4t5oli
+n5ton
+nt4oo
+nt5oog
+n4top
+nt3opl
+nt3opm
+nt3opt
+n1tr
+nt3rec
+nt3rei
+nt3rel
+ntre4s
+nt5ribb
+nt5rij
+n5troos
+nt4rou
+nt3rus
+n5try
+nts3a
+nt5slu
+nt1sn
+nt4sno
+nt1sp
+nt4spr
+nts5pre
+nt1st
+nt5ste
+n3tu
+n4t3uit
+ntu4n
+n5twijf
+n5t4wis
+3nu.
+3nuc
+3nue
+nu3en
+nu3et
+4nuf
+2nui
+4n3uil
+nu2lo
+3num
+nu2m3a
+5numm
+nu2n
+3nunc
+n3uni
+2nu4r
+3n4u5ri
+nu5ro
+1nus
+nu4s3o
+nu3tr
+nut4st
+4nuu
+5nuut
+nuw5a
+nu2w3i
+2nv
+nve5na
+2n1w
+nx3
+n3xe
+nxo4
+1ny
+4n3yi
+4n3yo
+2nz
+nzet5s
+3ñ
+4o.
+4oa
+o3aa
+o2ad
+o3af
+o1ag
+o3ah
+o3ai
+o1al
+oa2m
+o1a2n
+oa4tiev
+o3au
+o3av
+o3ax
+2o3b
+4ob.
+obal4
+obalt3
+3obj
+1o4bli
+ob5oor
+o4b5o4r
+4obr
+4oca
+ocaat5
+5o2cea
+o3cha
+o1che
+o3chi
+o3cho
+o3chr
+ocke4
+4o3co
+oco3a
+oco3s4
+oc3t4
+od5ac
+oda3g
+ode4m5ar
+ode4mo
+ode5re
+odes4
+odi3a
+o5dru
+od5sc
+od5sei
+od3s4i
+od2sl
+ods5lam
+od5slan
+od3sli
+od5smak
+od4s3o
+od3spo
+od4spr
+ods4t
+od5sta
+od4ste
+ods5te.
+od5stek
+od5sten
+od3w
+o4e
+oe5an
+oe3as
+oe2d3a
+oeda4d
+oede4n
+oe2d3o2
+oe4dr
+oed3re
+oed3ri
+oed3ro
+oe2d3u
+oed3w
+oe3e
+oe5er
+oe4f1a
+1oefe
+oe2fi
+oe2fl
+oef3la
+oef5le
+oef3lo
+oe4f5o4
+oe2f3r
+oege3l
+oeg5ij
+oeg1l
+oe4gou
+oeii4
+oei3n
+oei5s4
+oei5tj
+oei3tr
+oe4kaa
+oek5erk
+oeke4t
+oe2k3l
+oe4k3op
+oe4k3r
+oe2ku
+oek1w
+oe4lap
+oe4lar
+oel5dr
+oe4l3ei
+oe3lem
+oel5f
+oelo4
+oe5loe
+oelo5p
+oel3sp
+oe4m3ac
+oem3o4
+oen3al
+oe5n4e
+oen5gr
+oen3o
+oen4sn
+2oep
+oep5ind
+oe4pl
+oe5plo
+oe4p3r
+oe3pra
+oe4ps
+oeps3e
+oe2p3u
+4oer
+oe1ra
+oe4raa
+oer5aal
+oe4r3a4l
+oer4e
+oer5ei.
+oer5eie
+oero2
+oe3roe
+oer3og
+oer5om
+oer4sl
+oer4sp
+oer4sta
+oers5tak
+oers5te.
+4oes.
+oe3sfe
+oe3si
+oe4sli
+oe4s3o4
+oes4ta
+oes4th
+oe3sto
+oe4taa
+oe2t3h
+oe5t4i
+oe2tj
+oe4t3o4
+oe5toe
+oe4t3ra
+oet4s3p
+oet3w
+2oë
+of3ar
+of3at
+o4fav
+of4d1a4
+ofd3ei
+of2d3o
+of2d3r
+ofd3w
+of3l
+o4fli
+o4flo
+4ofo
+of3om
+o3foo
+of3op
+o3for
+of3ox
+of1r
+o3f2ra
+of5se
+of4sl
+of5sla
+ofs3le
+of2sp
+of3spe
+ofs3pl
+of3spo
+ofs3pr
+ofs3tr
+ofs5tra
+4oft
+of4tu
+oft3ur
+oft3uu
+of3ui
+og5ac
+oga4l
+og3al.
+og5de
+og3di
+oge4d
+oge5laa
+ogel5ei
+2ogem
+o3ger
+oge4ro
+oger5on
+oge4s3t
+2og5h
+1ogig
+og1l
+og5ne
+og3op
+og3sp
+og3sta
+og4st5ei
+og3sto
+og4ston
+og4str
+ogs5tro
+og3ui
+o3gy
+2o1h
+3ohm
+4oi
+oi3do
+oi1e
+oi3j
+oi5k
+o3ing
+oi3o4
+oi3s4
+oi5sc
+ois2p
+oist2
+ois5tj
+o3ï
+2o1j
+2ok
+o3ka.
+o3kaa
+o4k3aas
+ok3ab
+ok3ag
+o3kal
+ok3ank
+o4k3a4z
+ok3ef
+o2k4l
+ok5let
+o4kli
+ok5lu
+o2k3n
+ok3o2l
+ok3op.
+ok3o4pe
+okos5
+o2k3ou
+o2k3r
+ok4ra
+ok1sa
+ok3s4l
+ok3sn
+ok5spri
+ok1st4
+oks5te.
+ok5sten
+ok4s5tr
+ok5te
+okter4s
+oku4
+ok3ur
+ok3uu
+ok1w
+ok2wi
+o1la
+o3l4ab
+ol3ac
+o3lal
+ol3a2p
+ol3arm
+ola3s4m
+4old
+ol3d4o
+ol3d2w
+o1le
+o3le.
+ole5g
+ol1ei
+ol3eks
+ol3emm
+o3len
+o5ler
+oleu2
+ole3um
+ol3exa
+ol2fa
+olf3l
+ol3fr
+olf5sl
+ol2gl
+ol2g1o
+olg5rap
+ol4gre
+ol4g3ri
+ol2g3u
+o3lia
+o3lic
+o5lid
+o3lik
+o3lin
+o5ling
+ol3int
+o3lit
+ol3kaf
+ol5ke
+ol2kr
+olk4s
+olk2v
+ollie4
+o3lo
+o5loc
+olo3k
+ol4om
+o4lop
+ol3op.
+ol3opp
+olo3s4t
+olo4ve
+ol4pra
+4ols
+ol5se
+ol4s5h
+ol5si
+ol1sj
+ol3s4l
+ol3s4n
+ol3so
+ol3sp
+ol5ster
+4o1lu
+ol3uit
+olu4r
+4oma
+om2aa
+om1ac
+om1af
+o3man
+4ome
+o4m3ef
+om3ela
+omen4s
+omen5ste.
+ome5ren
+omer5kl
+ome5sp
+ome5t
+om2i
+o4m3int
+4omm
+4omo
+omo5l
+omo3s
+om4p5ei
+5omro
+om3sl
+om4ste.
+om3ui
+3omz
+on1ac
+on4ag
+o4n3am
+on4an
+on3ap
+ona3th
+2onc
+on4d3ac
+on5d4as
+on5der
+ond5ete
+on4d3id
+ond5ijs
+ond5om.
+on2dr
+ond3re
+ond3ro
+ond5sj
+ond5slo
+on3d4u
+on4dur
+o5ne.
+o3neb
+o2n1e2c
+on3ei
+on3erf
+on3erv
+one3st
+4onet.
+on1e3v
+ong5aan
+ong5aap
+ong3ap
+4ongen
+ong5le
+ong2r
+ongs4
+ong5se
+ong3sp
+ong3st
+on5id
+o5nig
+on4k3ap
+onke5lap
+on3k2i
+on4k3lo
+on3kn
+on5kw
+onnes4
+onne5st
+o4n3of
+ono3l
+on1on
+o2n1ov
+on3sc
+ons4e
+on5sei
+ons2f
+on3s4m
+on2s3n
+ons5op
+on3sor
+on1s2p
+ons4pe
+on3spl
+on1st
+on5sten
+on5str
+4ont.
+on4taa
+3ont1h
+on4tid
+3ont1s4
+ont5sp
+3ontv
+1ont3w
+on1ui
+on3ur
+o4o2
+4oo.
+oo3c
+4oo4d
+ood1a
+ood1e4
+oo5de.
+ood1o
+ood1r
+ood3sl
+ood3sp
+4oof
+oo3fi
+oo4g
+oog1a
+oog3e
+oo5gi
+oog1r
+oogs4
+oog3sh
+oog3sl
+ook3a
+oo3ke
+ook5l
+ook3s4
+ook5st
+oo4k5w
+oo4l
+ool5a2
+oole2
+ool3ed
+ool5f
+ool5g
+oo5lig
+ool3ij
+ool3k
+ool1o4
+ool1u
+oom5a4
+oo3me
+oom3i
+oom1o4
+ooms5te.
+4oon
+oon5a
+oon5du
+oon3in5
+oon5k4
+oon1o
+oon5ta
+oo4p1
+oopa2
+oop5ee
+oop3o4
+oop3r
+oop4sp
+oor3a
+oord5aa
+oor5dop
+oor1e4
+oor3g4
+oor5i
+oor5k
+oor5m
+oor1o
+oor3sm
+oor5ste
+oor5sto
+4oort
+oor4th
+oo4s
+oos3a
+oo5se
+oos5n
+oo4t
+oot1a
+oot3es
+oot3h
+oot5o
+oot3r
+oot4sl
+o1ö
+2opa
+o4p3ac
+op3ad
+o4p3af
+o4p3ak
+op3am
+o3pan
+op3and
+op3at.
+op3att
+3opbre
+3opdr
+o3pe.
+op3ee
+op5eet
+op3ei
+o1pel
+o3pen.
+3o4peni
+o5per.
+o4pera
+op3e4te
+op3e4v
+4opf
+o1pi
+o5pic
+op3i2d
+opie5t
+op3ijz
+op3in.
+o5pina
+o5pis
+4op1j
+op3l
+op5los
+1opn
+o1po
+opoe3
+op1of
+o5pog
+o5poi
+o5pol
+op3ond
+o5poni
+op3ont
+op3ord
+op3o4re
+op3o4v
+op1r
+op3ric
+o4pru
+o4ps
+op5s2c
+op5se
+op5si
+3ops4l
+ops4m
+op3sma
+op3sn
+op3so
+op3sp
+op3sta
+op3su
+2opt
+4opt.
+op5tr
+op3ui
+o2p3u2n
+o1ra
+or3ach
+or3act
+or3adm
+or1af
+ora4g
+o4r3alg
+or3ana
+o5rate
+or4daa
+or4d3as
+or4denv
+or4do
+ord5ond
+ord3or
+ord3o4v
+or3dr
+or4drad
+ord3w
+o1re
+ore5ad
+4orec
+oree4
+ore4no
+or2gl
+o1ri
+o5ria
+3orië
+o5rig.
+o5rigere
+o4r3ink
+or3ins
+ork2a
+or5k4e
+or3kl
+or5kn
+or3kw
+or4m3ac
+or4mas
+or4m3ei
+or4n3ac
+or3ni
+orno3s4
+or3oe
+o3rol
+or1on
+or3ont
+or1oo
+or1o2p
+or3or
+o3ros
+or5ov
+4orp
+or4p3ac
+orp4s5c
+or3sag
+or5sc
+or5se
+or3sli
+or3smi
+or3so
+or4son
+or3sp
+or5s4pa
+or5spu
+or4t3ak
+ort5een
+or4t5ijl
+or2to
+or4tof
+or4t3oo
+or4tred
+ort5sp
+ort5ste
+or1u
+o3ry
+orzet5
+2os
+o4sac
+o5sas
+o3sau
+4o3s2c
+osca4
+o4sci
+o5s4cl
+os3cu
+o5sed
+os4el
+o5ser
+os3f
+os4fe
+o4sha
+o3shi
+os2ho
+o3si
+o4sj
+os5jer.
+o4sk
+os5ko
+os3l
+os5li4
+o4s3m
+os4n
+os5no
+o3s2o
+os3pa
+os3per
+os1pi
+os4pir
+o4spr
+os4s5m
+o2s3t
+os4ta
+os5taal
+os5taar
+osta3c
+ost3a4g
+os5tan
+os5tar
+o3stas
+o3stat
+os5te.
+os4tem
+o5steroï
+os4th
+os4to
+os5toli
+os5tou
+ost3o4v
+os5tra.
+os5traa
+ost3re
+ost3ri
+o3stro
+os5trum
+os1tu
+o3sty
+o3su
+o5sy
+4o1ta
+ot3aar
+ot1ac
+ot3af
+o3tag
+ot3akt
+ot3app
+ot3art
+otas4
+o5tat
+o3te
+ot3e2d
+o5tee.
+o5tees
+o5teg
+ot3ei
+ote4lan
+o5ten
+o5ter
+oter5sp
+ote4st
+ote4t
+ot3eta
+o1th
+o2t1ho
+ot3hu
+o4tj
+otje5sp
+otli2
+o1to
+ot3off
+ot3olv
+o5tom
+ot3ont
+ot3opm
+oto5po
+ot3opr
+o5t4or
+oto3s
+2otr
+o1t4ro
+ot3ru
+ot5s4i
+ot2sl
+ot3sla
+ots3li
+ot3smo
+ot3sn
+ot3sp
+ot4s3pa
+ot4ste.
+ots5tek
+ot5sten
+ot4stu
+o1tu
+ot3ui
+o3tul
+ot5w
+4ou.
+ou5a
+ou1c
+ou4d1a
+ou4des
+ou2do
+ou1e
+oue2t3
+ou3k4
+ou4ren
+ou5ren.
+ou5renn
+ou2r3o2
+4ous
+ou3sa
+ous5c
+oust4
+ou2ta
+out3h
+out1j
+ou2t3o
+out1r
+out5sp
+out5ste
+ouw3a
+ouw5do
+ouw5ins
+o2v
+2o3va
+o5ve.
+2o5vee
+3o4verg
+over5sp
+over5ste
+o5ves
+2ovi
+ovi5so
+4ovl
+4o3vo
+4ovr
+ovu3
+4ow
+o1wa
+o1we
+o5wen
+ow3h
+o1wi
+ow2n
+o3wo
+ow3r
+o4x
+oys4
+ozet5
+ö3l
+ö1p
+öpe1
+ö4r
+ös4
+ös5t
+ö5su
+4p.
+4paan
+paar5du
+paar5tj
+5paas
+3pab
+p3acc
+2pach
+pacht5s
+p4aci
+5pacu
+3pad.
+pa4da
+4padv
+pa3e
+4p3afd
+1pag
+pag2a
+pa4gen
+pa3gh
+p4a5gi
+3pak
+pa2k3a
+4p4ake
+pa4ki
+pa4k5l
+2p3alb
+3pale
+pal3f
+pa3li
+paling5s
+palle4
+palm5ac
+pal4mo
+pa4m
+pa3na
+pa4n3a4d
+5panee
+5panel
+4pank
+pan5sp
+pan4tr
+1pap
+pa4pe4t
+5papi
+pap3l
+pa3po
+pa3pr
+4par.
+3pa3ra
+p3arb
+pard4
+par3da
+3park
+par4ka
+par4k5l
+3parl
+4parm
+pa5ro
+4parr
+par5ta
+3parti
+part3j
+3partn
+pa5ru
+paru5r
+1pa4s3
+pa5sa
+pas5c
+pa5se
+pa5so
+pas4th
+pas5to
+pas5tr
+pa5te
+1path
+p3atl
+3pa3tr
+pats5te.
+2paut
+5pauz
+pa4vl
+5paz
+2pb4
+2p1c
+2p3d2
+pe4al
+4peci
+p3e2co
+3pectu
+1ped
+pe3de
+pe3do
+p4ee4
+3pee.
+3peeë
+pee5li
+4peen
+5pees
+3peg
+1p4eil
+pei4l3a
+4peis
+pek5ee
+pe2k3l
+pe2k3n
+pek5s
+p4el
+pe3l4aa
+pe4l3ak
+pel5dr
+pe3le
+pe4l3ee
+pe4l3e4t
+pe3l4i
+pe3l4or
+pel5si
+pel3so
+pel3sp
+2p3emm
+pe3na
+pe4nak
+pe4nap
+pe4nau
+pe4naz
+p3ency
+pen5d4r
+penge5
+pen5k
+5penn
+pen3sa
+pen5sl
+pen3sm
+pen5sp
+pent4
+pen5to
+2p3epi
+pep3o
+pep5s
+p4er.
+pe1ra
+pera3s4
+per4at
+3perc
+pe4r5eg
+pe5req
+1peri
+peri3s
+per1o
+pe3ron
+pe5ros
+3pers
+per4sm
+per5sti
+per4str
+p2ert
+3pes
+pe3sa
+3pet.
+pe5ta
+5pe5ter
+3peti
+pe4t3ra
+pets5te
+petu5
+3peuk
+5peut
+1pé
+3pê
+2p1f
+2p1g
+pge5s
+2p1h4
+4p3ha
+3p4hec
+p4his
+4pho
+pi3am
+pi5an
+pi4at
+2pid
+piek5la
+5piep
+pie4r3o
+pie4s3p
+pie4tj
+pi2g5a
+pi3gl
+3pij.
+pij3k
+pij5ke
+pij4li
+3pijn
+5pijp
+pij4p3a
+2pijz
+pi4k3l
+pilo5g
+pi5nam
+2pind
+3pinda
+3p4ing
+5ping.
+pin4ga
+pin5gri
+4p3inj
+pink3r
+pink5s
+4pinr
+2pins
+pin4ta
+pi5o
+pis5n
+pis5ta
+pi3th
+pit3j
+pit3r
+pit4sp
+2p1ja
+pjes5
+p3ji
+p1jo
+2p1k
+pkaart5j
+p2l2
+p3la.
+plaat5j
+2p3lad
+pla3di
+4p3lamp
+4p3lang
+p4lant
+p3lap
+1p4las
+3p4lat
+pla4t3r
+5p4lay
+p4lec
+plee5tj
+p3leid
+3p4len
+p3lep
+pleu5ro
+p4lex
+2p3lig
+4plij
+p4lom
+p3lone
+p5lood
+plooi5tj
+p3loon
+p3luie
+2p1m
+pmans5t
+2p1n
+p3na
+3pneum
+3po.
+poda5
+3poei
+poe2s3
+poes5t
+poets5te.
+3poez
+3poë
+p2ofa
+3pogi
+po5gr
+po2k3i2
+po4kol
+1pol
+po5l4o
+polo3p
+pol4s
+pols5te.
+1pom
+2p3oml
+3ponds
+pon4sm
+pon4st
+pons5te.
+pon5ta
+5pony
+poo3d
+poo5de
+4poog.
+3pool
+poo5len
+4poor.
+poor4tj
+poot3
+po4p3a
+4popd
+2pope
+pop5h
+2p3org
+2p3ork
+po3ro
+p4ort
+5portef
+por4to
+por4t5ra
+po3ru
+1pos
+po1sa
+po3sf
+po4taa
+po4t3as
+po5te
+potes5t
+pot1j
+pot3r
+3poul
+po3v
+4p3p
+p5pa
+p5pe
+ppe4l3o
+ppe5ni
+pper5ste
+ppie5k
+ppij5p
+p4ps
+pr4
+p2ra
+3pra.
+p5raad
+praat5j
+p5rad
+3prakt
+4pram
+p5rand
+3prao
+4p3rap
+p4rat
+p4rax
+4preeku
+1prem
+p3remm
+3prent
+pren4t5j
+3pres
+p3reso
+3pret
+pre4t3j
+pret3r
+4pric
+4p3riek
+4priet
+prie4t5j
+1prij
+3prik
+3princ
+pring5s4
+5prins
+3p4rio
+3p4riu
+5priv
+5p4rob
+3p2roc
+1p2rod
+p3roed
+3proef
+proet5j
+3proev
+5p4rof
+5p2rog
+1proj
+pro3la
+3prom
+p3rood
+prooi5
+pro5pa
+p4roq
+3pros
+pro5sc
+pro4s5t
+pro3t4a
+3proto
+3pro5v
+4proy
+pru2t
+prut3o4
+2ps
+p3sab
+ps3a2g
+p3sak
+ps3ar
+ps3ass
+4pse
+ps3erk
+p4s3et
+p3si
+p4s3i2d
+p4sin
+p5sis
+p1sl
+ps3le
+ps2me
+ps5mi
+p4s3na
+ps3neu
+p4sof
+p3sol
+ps3opt
+pso4r
+p1sp
+ps2pl
+ps3ple
+p1s4t
+p3stat
+p3ste
+ps5tent
+ps5tes
+ps5th
+ps3tor
+ps5tron
+p3stu
+ps5ty
+3psy
+5psyc
+p3sys
+4p1t
+pt3ad
+pt3alb
+p3te
+p2t1h
+p5ti
+pt3j
+p4t3o4v
+p3tr
+pt3ric
+1p2u
+3pub
+pu3ch
+pu3e
+puil3o
+pul4st
+3pun
+4pun.
+punt3j
+3put.
+puter5in
+put1j
+pu2t3o
+put3r
+put4st
+puts5te.
+2pv
+pvan4
+pvari5
+2p1w
+1py1
+2p5z
+1q
+5qe
+qu4
+que4s
+5quo
+4r.
+r2aa
+2raan
+4raand
+3raar
+5raar.
+4r3aard
+5raars
+raar5tj
+2rac
+ra4ca
+ra3ce
+5racl
+rad4a
+3radb
+ra5den
+ra3di
+5radia
+3radio
+4radm
+4r3adr
+3rad3s
+4radv
+2rafd
+r4aff
+raf5ond
+ra3fra
+3ragez
+ra5gi
+ra3g2n
+ra5go
+rag4s
+3rais
+raket3
+ra3k4l
+rak5r
+4r3a2la
+ra4l3ee
+4r3alf
+r3a4lim
+r3alt
+ra4man
+r5ameu
+ra3mi
+r2amp
+4rana
+ran4dr
+ran4g3o
+ran4gr
+r5angst.
+ra4nim
+4ranj
+ran4kl
+rank3w
+ran4sa
+ran4st
+ran4t3j
+r3antw
+ra3o
+4rap.
+ra3po
+4rappa
+rap5roe
+ra3q
+2r3arb
+r4a5re
+4rarit
+2r1arm
+4r3arr
+2r1art
+ra5sei
+ra4sk
+ra4sl
+ra1so
+ra2sp
+ras3po
+rast5ri
+r4ati
+rat5j
+ra4tom
+ra4tra
+ra5tri
+rat3sp
+rat4st
+rats5te.
+ra3t4u
+2rau
+3raus
+r1aut
+5ravr
+ra4zij
+rbe4ti
+r1c
+r3ce
+rces3
+r3chi
+r3co
+2r1d
+r4d3act
+rd3alk
+rda2m
+rd5ama
+r3dan
+r2d3ar
+rd3ei
+r4d5e4las
+rden5dr
+rde5o4
+r4derva
+rde5s4t
+rdi3a
+rdi5o
+rd5l
+r3do
+r5doc
+r4d3ol
+rd5olie
+rd3ont
+rd3oos
+rdo3pe
+rdo3v
+rd3ras
+rd3res
+rd5roos
+rd2ru
+rd3sa
+rd3s4c
+rd3so
+rd1sp
+rds4t
+rd5sta
+rd5ste
+rd3su
+r3du
+rd2wi
+rd5wo
+3re.
+1reac
+re4ade
+4reak
+re3amb
+4re5at
+re3co
+3recr
+rec5ta
+3reda
+3redd
+rede4s3
+4re4diti
+3redu
+re5dw
+ree4k
+2r1een
+ree3n4e
+r5eenh
+ree2p
+reeps5
+ree5r4ad
+4reers
+reer5ste
+r3eerw
+ree4s
+ree5sh
+r4ef
+4refb
+2reff
+3refl
+re3fu
+1reg
+4reg.
+4regd
+rege5ne
+rege4s
+4regg
+3regi
+re3gl
+4regt
+4reie
+4reil
+4reind
+rei5tj
+5reiz
+re4kap
+5rekeni
+re2k3l
+re2k5n
+re4ko
+re4k3re
+rek3sp
+re4ku
+re1kw
+rel4di
+rel4d3o
+reld3r
+re4l3ei
+rel5k
+re4lu4r
+3rem.
+re4mai
+remie5tj
+re5mo5v
+2remp
+3r4en.
+re2na
+re4naa
+ren5aar
+re5nade
+re3nal
+re4n3an
+ren3a4r
+r4end
+5rendee
+r5endert
+re5ne.
+re4nel
+re5nen.
+ren5enk
+ren3e4p
+re5ner.
+ren5erf
+ren5erv
+5renf
+2r1eni
+5r4enkl
+r4enn
+re4noc
+ren4og
+ren4opl
+re3nov
+5r4enp
+4renq
+ren4sl
+r4ento
+r3entw
+r5enveer
+re4of
+re4op4
+re5pa
+3repet
+re4pie
+4req
+re3qua
+4r1erf
+2r1erg
+re3r2o
+rer4s
+2r3ert
+4r5erv
+2rerw
+re3sa
+re5se
+re4sl
+res5le
+res3m
+re2s1p
+res3t
+re4tem
+re3t4h
+ret4i
+re4tik
+re5tin
+2retn
+re4t3o4g
+re4t3oo
+rets5te.
+re2u
+reur5es
+reus4t
+reu5ste
+3revis
+3revo
+2r3ex
+r4f3aa
+rf3act
+r2f3a4g
+rf3al
+r3fas
+r3fe
+r4f3eng
+r1fl
+r4f3lag
+rf3lev
+r2f3li
+rf3lus
+r4f3op
+r1fr
+r4f3re
+r5frea
+rf2s2
+rf3sm
+rf3sp
+r4f3u4r
+rf3uu
+r1g
+r4g3ab
+rg3amb
+r4g3een
+rg3ei
+rg4eis
+rgel5dr
+r5gen.
+rge4ra
+rge5rap
+r4g3ins
+r5glas
+r3glo
+r4g3lu
+rg4o3v
+r5grij
+rg3rit
+r3g4ro
+rg1s4
+rg2sm
+rg5so
+rg4s5pr
+r3h
+ri5abel
+ri4ag
+ri2ak
+ri5an
+rias4
+ri4av
+ri4bl
+4rice
+ri3co
+ridde4
+ri3di
+ri4dol
+ri4doo
+rie5dr
+rie4k5ap
+rie5kl
+rie3kw
+rie4la
+riel5aa
+rie4lei
+rie4ro
+rie4ta
+riet3o
+ri1eu
+ri3fl
+ri3fr
+r4ig
+ri4gaa
+ri3gl
+5rigste
+r4ijl
+4r5ijl.
+r5ijld
+r5ijlt
+rij5o
+rij3pl
+rij3pr
+rij3sp
+rij5ster
+rij4str
+4rijv
+ri4k5l
+rik5n
+ri3k4o
+ril5m
+ri3ma
+rim4pr
+4r3inb
+4rind
+ri5ne
+4r5inf
+r4ing
+4r5ingan
+r5ingeni
+ring5l
+4r3inh
+ri4nit
+rin4k3l
+r3inko
+4rinkt
+r3inl
+4r3inna
+4r1inr
+4rins
+r3inst
+4rint
+4r1inv
+ri5on
+ri3o5s
+ri4sam
+ri3sc
+ri3sot
+ris5to
+rit3j
+rit3ov
+rit4st
+rits5te.
+rit5sten
+3ritt
+r5j4
+rjaars5
+r5ka.
+rkaart5j
+rk3adr
+rk3af
+r2kah
+rk3ang
+r4k3art
+r2k3ei
+rke4n
+rken4s
+rker4sl
+r4k3erv
+rke4s
+rke5stree
+rke5strer
+rk5iep
+rk3ijv
+rk3inb
+r4k3ink
+rkjes5
+rk3lag
+r4k3lat
+rk5leid
+r2klo
+rk3loo
+rk3lus
+r3kn
+r4kne
+r2kob
+rk3olm
+rk3omg
+rkoot5
+rk3opg
+rk3ord
+rk5os.
+rk5oss
+rk2r
+r5k4ran
+rk4ri
+r5kris
+r5kron
+rk1s
+rk3s4f
+rk5si
+rks4p
+rk4t5e4v
+rkt3h
+rk4ti
+rkt3o
+rkt1r
+rk3uit
+r1kwa
+rk3waa
+rk5wat
+rk3wee
+r1kwi
+rk3win
+r3l
+rlaat5ste
+rle4g3r
+rlink4s
+rlinks5te
+rlofs5
+rlui5t4
+r1m
+rmaf4r
+r4m3art
+r2m3eb
+r2m5eg
+rme4r3a4
+rmes3
+rme4t3j
+rmet5st
+rm3inh
+rmi2s
+r3mo
+r5moe
+r4mop
+rm3opm
+rmors5te
+rmos5f
+rm3s4a
+rm1st
+rm3uit
+rmun4
+2r1n
+r3na
+r5n4am
+r4n3ap
+rn3ars
+rnee5t
+r4n3ene
+rnes3
+rne5te
+rne4t3j
+r2n5id
+r2nin
+r2n1on
+rn3oor
+r5noot
+rn3ops
+r5not
+rn3ove
+rns4
+rn3sm
+rn3sp
+rn1st
+rn3sta
+rn3th
+rn5tj
+rn5to
+r3nu
+rnu5r
+ro1a
+ro5ac
+r4oc
+ro1ch
+ro3d4o
+3roe.
+4roef
+4roeg
+roe4g3r
+3roem
+roens4
+roen5sm
+roep3l
+roe4rei
+roet4j
+4roev
+3roë
+r5offi
+r4ofi
+ro3fl
+roges5
+1roï
+ro3kl
+3rokm
+rok3sp
+r4ol.
+ro2l3a
+role5st
+rol3g2
+2roli
+rol3ov
+ro5ma
+ro3mo
+4romz
+r2on.
+ron3a4d
+5r4onal
+ron4da
+ron4d3o
+ron4d3r
+ron4d5u
+r2one
+r2oni
+r2onk
+ron4ka
+r2onn
+r2o1no
+r2ons
+ron4ste
+rons5te.
+4ron2t
+ront3j
+ront3r
+ro3nu
+4ronv
+3roof
+2roog
+4roon
+2r1oor
+root5ste
+ro3pa
+ro4paa
+ro4pan
+4ropb
+ro1pe
+ro5pee
+ro4pin
+ro3p4la
+4ropn
+r4opo
+rop5rak
+rop3sh
+r4opte
+ro4pu
+ror5d
+ro3ro
+ro3sa
+ro5se
+ro3sf
+ro3sh
+r4o5si
+ro3sp
+ros4s5t
+ro5stel
+ros5tra
+ro5te
+ro3t2h
+rot3j
+ro5ton
+ro3tr
+rot4ste
+rots5te.
+r1oud
+3rou5t4
+ro3v
+ro4ve
+ro5veri
+4roxi
+3roy
+r1p
+r3pa
+rp3aan
+rp3adv
+rp3ank
+r5pee
+rp3eis
+rpi3s
+r2p3j
+rp4lo
+rp5lod
+rpoort5j
+r4p3o4v
+r4p3rec
+rp3ric
+rp4ro
+r3psa
+rp4si
+rp2sl
+rp3sli
+rp5spe
+rp4s5to
+2r5r
+rre4l3u
+rren5s4
+rre5o
+rreu2
+rri5er.
+rrie4t
+rron5k
+rrot4j
+4rs
+rs3a2d
+rs3a2g
+r3sal
+rs3alm
+rs3amb
+r3san
+rs3ana
+rs3ap
+rs3ar
+rs3as
+rs4asse
+rsa4te
+r5schi
+rs2cr
+r4s3eis
+rsek5ste
+rs4et
+rseve3
+r2s3ez
+rs4fer
+rs4hal
+r3s2hi
+r3s4hoc
+rs3hot
+rs3ini
+rs3int
+r4sj4
+r5sjac
+r5sjou
+r5sjt
+r3s4kat
+r1sl
+r4slan
+r5slec
+r5slep
+r5sleu
+r5slib
+rs4lie
+r5sling
+rs3lob
+rs5loep
+r4s3loo
+r5sluis
+rs4m
+r5smaak
+rs5maal
+rs5mak
+r3sme
+r3smij
+rs5mis
+r5smit
+rs5mu
+r1sn
+r2s3na
+rs3neu
+r2s3no
+r1so
+r5sol
+rs3ong
+r2sor
+rsorkes5
+rs1ov
+r1sp
+r3spaa
+rs3pad
+r4s3par
+rs4pare
+r3spe
+r5spec
+r5spee
+r5spek
+rs4pene
+r4s3pet
+r5spit
+r5spoe
+r5spog
+r5spon
+r5spoo
+rs3pot
+r5spraa
+r4spu
+r5spul
+rs3put
+r1s4t
+r4s5taak
+rst5aang
+rs5tas
+r5stat
+r3ste
+r4s3te.
+r5ster.
+r5sterk
+rs5term
+r5sters
+r5stes
+rste5st
+r4steva
+r3sti
+r4stit
+r3sto
+rs5toma
+r4ston
+rst5ora
+r3str
+rs5trap
+r4st5red
+rs5trei
+r5stren
+rs5trog
+rst5roz
+r3sty
+r3su
+rs3usa
+r3sy
+4rt
+r1ta
+r5ta.
+r4t3aan
+rt5aand
+rt5aanv
+r4t1ac
+rt1ad
+rt3af.
+rt3aff
+rt3am
+r5tans
+r2tar
+rt3art
+r4tau
+r2tav
+rt5c
+r5teco
+rt3eig
+rt3eil
+rte4lei
+rt5emb
+r5ten.
+rte5nach
+rte3no
+rte3ro
+rtes4
+rte5sta
+r2t5e2v
+r4tha
+rt1he
+r3ther
+rt3hi
+r1tho
+rt3hol
+rt3hu
+rt3hy
+rt4ij
+rtij3k
+r4t3ini
+r4t3ink
+rt5jesc
+r3to
+rt3off
+r5tofo
+r5tok
+rt3om.
+rt3ond
+r4t3op
+r5tori
+r1tr
+r3tra
+rt4rap
+r4t3ras
+rt3rec
+r5treden.
+r3t4rek
+r4t3res
+rt3ri
+r4t3rol
+r2t4ru
+rt5ruk
+rt5rus
+rt4s5eco
+rt5sei
+rt2s3l
+rt3sle
+rts5li
+rt4slu
+rts5m
+rts5no
+rt4soo
+rt1sp
+rt4s3pr
+rts5ten
+r1tu
+rt3ui4t
+rt3w
+rt2wi
+5rubr
+rude3r
+ru1e
+4ruf
+ru2g
+ru4gr
+r5uitr
+ru2k
+4ru3ke
+ruk3i
+rul3aa
+rul3ap
+ru2li
+ru4l3ij
+ru3lin
+rul5s
+r2um
+ru2mi
+3run.
+r2und
+runet3
+4r5u2ni
+ru3niv
+ru4r
+ru5ra
+ru5re.
+ru5res
+r2u4s
+rus3e
+rus5tr
+4rut
+rut3j
+rut4st
+ruts5te.
+4ruu
+ru3wa
+rvaat5
+rval4st
+rvals5te.
+rvers5te.
+rves4
+rve3sp
+rvloot5
+r1w
+rwen4st
+rwens5te.
+r4wh
+rw2t3j
+r3x
+r3yu
+4rz
+rzet5st
+4s.
+5sa.
+s1aa
+1saag
+5s2aai
+saai4s
+3s2aal
+3s4aat
+1sab
+sa3bo
+2s1ac
+sa2ca
+3sacr
+s1adv
+2s1af
+3safe
+3safo
+sa3fr
+s5agg
+s4a3gi
+3sagn
+sa3go
+3sah
+3sai
+3saj
+2sak
+3saks
+s1akt
+s2al
+5sal.
+3sa3la
+3sald
+5salh
+s3all
+4salm
+sal5ma
+s3aln
+3s4a3lo
+3s2ame
+5samm
+sam5p
+4sa2na
+sa3nat
+s4anc
+s2a3ne
+s4ant
+san4t3j
+sa2p
+3sap.
+sa3pa
+2s3ape
+sa4pr
+sa5pro
+sa3ra
+s1arb
+3sard
+sa2re
+s1arm
+saro4
+sar3ol
+s4ars
+4s1art
+sart5se
+4sas.
+3sasa
+sa3sc
+3s4ast
+1sat
+3sa3te
+5sati
+2s3atl
+2s1att
+s3aud
+1saur
+3s2aus
+s1aut
+3sauz
+1sax
+4s3b
+s5ba
+s5be
+s5bo
+1sc
+2sca
+4sce
+5scena
+5scè
+3s4ch2
+4sch.
+sch4a
+5schak
+5schap
+4schau
+5sche.
+s5chec
+4schef
+5schen
+4scheq
+5scher
+5schev
+5schew
+s2chi
+4schir
+5schol
+5schoo
+5schot
+sch5ta
+2sci
+4scl
+2sco
+3s4cola
+3scoo
+3scope
+5scopi
+3s4co5re
+3scout
+2scr
+4scris
+2scu
+2scy
+4s1d
+s5de
+s4dh
+sdi5a
+sdis5
+s3do
+s5dr
+s3dw
+3se
+5se.
+se2a
+se3ak
+se3al
+sear4
+se3au
+s4eb
+4s3ech
+se3cr
+5sect
+4secz
+s4ee
+4s5eed
+5seei
+4s1een
+s5eenh
+see4t
+see5ts
+4seev
+s1eff
+se3ge
+2s5e2go
+seg2r
+4s3ei.
+4s3eig
+s4ein
+5sein.
+5seine
+2seis
+seis4t
+sei5tj
+5seiz
+sek4st
+seks5ten
+se1kw
+s2el
+5s4el.
+sel3ad
+se4l3a4g
+se4lak
+se4las
+se3le
+4s3e4lek
+sel3el
+4se4lem
+4self
+se5ling
+4s3elit
+sel5k
+5selm
+selo4
+5selp
+5s4els
+sel3sp
+5selt
+se2l3u
+s4em
+se4m3ac
+s5emm
+sem3oo
+s4en
+5sen.
+se4n3a4g
+se5nan
+se4net
+5sengr
+5senh
+sen5k
+se4n3o
+4s5enq
+sen5tw
+5s4er.
+se1r4a
+ser5au
+5se3r4e
+se4ree
+se5ren
+s4erg
+5sergl
+s5ergo
+5sergr
+ser4i
+se5rij
+4s3ern
+se3ro
+se5rop
+ser2s
+sers3p
+ser3st
+sert5w
+se3ru
+s4es
+se5sc
+se3sf
+2s5esk
+5sess
+se4t
+se5ta
+4s3ete
+se5ti
+se3tj
+set3r
+se5t4ra
+set5st
+4s5etu
+set3w
+se3um
+se4ven
+4s1ex
+4sez
+se2ze
+3sé
+3sè
+2s1f
+4sfed
+s5fei
+4sfi
+4s5fr
+4sfu
+sfu5m
+4s5g
+sgue4
+s1h
+s4ha.
+sha4g
+s5hal.
+3shamp
+4she
+sheid4
+sheids5
+s5hie
+5s4hir
+sh3l
+4shm
+s3hoe
+s3hoo
+3s4hop
+s2hot
+s3hote
+3show
+s5hul
+1si
+5si.
+5s4ia
+si5ac
+si3am
+si5an
+5sic
+sici4
+si3co
+3sie.
+3sieë
+sie5fr
+sie5kl
+siep4
+sies4
+sie5sl
+sie3so
+sie3st
+sie5ta
+sie5to
+si5è
+si1f4
+5s2ig
+si5go5
+s3ijv
+4s1ijz
+5sile
+4s5imper
+3simu
+5sina
+s3inb
+4s3inc
+4s1ind
+2sinf
+sing4
+3sing.
+s3inga
+s5ingeni
+sin3gl
+s3in5gr
+s3inh
+4si2ni
+4s3inko
+sin5kr
+4s3inm
+s4inn
+4sinr
+2s1ins
+2sint
+4s5inv
+4s3inz
+3sir
+5siro
+s3irr
+si4s
+sis3e4
+sis5ee
+sis3i
+sis5tr
+3sit
+si5to
+sito5v
+si3tr
+si4tru
+si5tu
+3siu
+3siz
+sj2
+4sj.
+3s4ja.
+5sjab
+4sj3d
+s1je
+2s3je.
+s5jeb
+3sjee
+3s2jei
+1sjer
+sje4ri
+s3jes
+3sjew
+3s4jez
+4sj5k4
+5sjof
+4s3jon
+sj3s2
+sjt4
+s5ju
+2s1k2
+skaart5j
+s5kad
+s4kele
+s5ken
+3s2kes
+sk4i
+3s2ki.
+3skied
+skie3s
+3skië
+ski5sc
+s2k3j
+s3ko
+s5kre
+sk5ruim
+sk3ste
+4sku
+s3k4w
+s2l4
+3s4la.
+5s4laan
+5slaap
+4s5laar
+4slab
+s4lac
+4s3lad
+3s4lag
+5slagm
+sla4me
+s5lamp.
+s5lampe
+4s5land
+3slang
+3slap
+5slape
+sla3pl
+4s3las
+2s3lat
+3s4la5v
+4slaw
+3s4laz
+s3led
+3s4lee.
+5sleep
+4s5leer
+s4leet
+slee5tj
+4s3leg
+2s5lei
+s5leng
+s3leni
+slen4st
+slens5te.
+3slent
+s4lep
+4s5ler
+s5les
+sle4t3j
+3s4leu
+s5leug
+s5leus
+5sleut
+2s5lev
+s3li.
+4s3lic
+4slid
+2slie
+s5lied
+s3lief
+3s4lier
+s3lif
+s5lig
+4s3lijf
+5slijp
+4s5lijs
+s4li4k
+sli2m
+slim5a
+s5lini
+4slinn
+s4lip
+4s3lit
+slo4b5
+2s3loc
+3s4loe
+3slof
+4s3log
+s3lol
+s3lood
+s5loon
+s5loos
+5s4loot3
+s3los
+3slot
+slo4tr
+4s3lou
+4s5loz
+4s5luc
+1s4lui
+4s5lui.
+4sluid
+5sluis.
+sluis4t
+slui5ste
+5sluit
+5sluiz
+4slun
+2s5lus
+4s3ly
+s1m
+4s5maat
+3smad
+3smak.
+3smal
+2s5man
+s5map
+s4mart
+4s5mat
+4s5mec
+5smeden
+3smeed
+5s4meet
+4s5mei
+4smelo
+4s5men
+4s5mes3
+5smid.
+smie2
+smies5
+s4mij
+s5min
+5smok
+s3mon
+5smuilden
+s5muile
+5smuilt
+s2n4
+s5nam
+5s4nap
+s4nar
+3snau
+3s4nav
+3s4ned
+3snee
+snee5t
+s5neg
+5s4nel
+2s5nes
+4s5net
+sneus4
+sneu5st
+s5neuz
+s3nie
+1s4nij
+s5nim
+3s4nip
+4s5niv
+4snod
+3s4noe
+s3nog
+2snoo
+s4nor.
+s3norm
+sno5v
+3snuf
+s4nui
+2snum
+3so.
+so4bl
+so1c
+s3oce
+3s4o3d
+1soe
+2soef
+3soep
+soes3
+2s1off
+3soft
+2so2g
+3so3ga
+s1oge
+so3gl
+3sogy
+5soi
+3soï
+3sok
+s2ol
+5sol.
+so3la
+so3le
+so3lis
+3so5l4o3
+solo5v
+5sols
+s2om
+3s4om.
+5somm
+2s3oms
+s3omv
+2somz
+5s4on.
+3sona
+so5nar
+s3onb
+2s1ond
+2song
+3sonn
+3so3no
+s4ons
+2s1on4t3
+4s3onv
+s3onw
+3soo
+4s5oog
+4s3ook
+4s3oor.
+s3oord
+4s3oorl
+5soort
+2s1op
+3s4op.
+4s5ope
+so3phi
+s2o5po
+so3pr
+3s4opra
+sop4re
+s2orb
+s3ord
+2s1or3g
+4s5ork
+sor4o
+so3ror
+sor4st
+3s2ort
+sos4
+so3sf
+s4ot
+s3oud
+sou2l
+sou3t
+2sov
+s1ove
+3so5z
+4sp.
+sp4a
+5spaak
+s3paal
+5spaan
+5spaat
+2spad
+2spak
+5spake
+s4pan
+3spann
+4s5pap
+5spar.
+s4pari
+5sparr
+2spas5
+5spatt
+s3pau
+5s4pea
+4spectu
+3s4pee
+speet3
+4s3pei
+s4pek
+5spell
+4s3pen
+s5pen.
+spe4na
+s5pep
+4sper
+s4per.
+s5peri
+s4perm
+5s4perr
+4spes
+s3pez
+s3pid
+1s4pie
+spie5tj
+4spijn
+4spijp
+s5ping
+5s2pio
+s3pis
+spi5sto
+2s1p4l
+4s5pla
+s4plet
+s2pli4
+5splin
+3split
+s3plo
+s3plu
+sp4o
+s2poe
+s3poes
+4spoë
+4spog
+4spol
+2s3pom
+s4pon.
+s4ponn
+s2poo
+s3pop
+5s4pore
+s4pori
+4s3pos
+5spots
+4spou
+4sprakt
+5spray
+s5pred
+5sprei
+s4prek
+4sprem
+4spres
+5spreu
+5spriet
+4s5prij
+4sprik
+4sprob
+4sproc
+4s5prod
+4sprof
+4sprog
+5s4pron
+s4proo
+4spros
+4s3ps
+4spt
+s2p4u
+4spub
+5s4pui
+4spun
+s4pur
+5spuw
+s4q
+4s5r
+sraads5l
+sro5v
+4s3s4
+ssa1s2
+s4sco
+s4s5cu
+s5se
+ssei3s
+sseo4
+s5si
+s5sl
+s4spa
+s5spaa
+ss5pas
+s5su
+s5sy
+s2t
+4st.
+5staaf
+5staan.
+4staang
+4staanw
+staart5j
+s4taat
+staat5j
+st3abo
+2s4t1ac
+3stad
+5stads
+2staf
+5staf.
+sta4fo
+s4tag
+s4tak
+5staki
+4stakk
+st3akt
+4s3tali
+5stam.
+5stamm
+3stamp
+3s4tand
+stan4s
+s4tap
+4stapo
+s4t3arc
+4stari
+2stas
+stasie4
+5statio
+4stau
+st3aut
+s4tav
+4stavo
+4s5tax
+4staz
+2stb
+2st5c
+2std
+4stea
+5steak
+4stec
+s5tech
+5steco
+3s4ted
+4stedu
+3steek
+3steen
+4steenh
+s5teer
+stee5t
+5stein
+5stekar
+5stekk
+5steldh
+ste4lee
+st5elem
+3stell
+5stem.
+5stemd
+5stemm
+4stemo
+4stent
+4stenu
+ste5ran
+4sterm
+ster5og
+st5e4ros
+5sterren
+s5teru
+4ste4s
+4s4t3ex
+s4t3e2z
+2stf
+4stg
+4sth
+s4tha
+st3hed
+st5heer
+st3hek
+s5them
+s3ther
+st1hi
+s4t1ho
+s4t1hu
+s4t3hy
+2stia
+2stib
+4sticu
+s4t3id
+5stiefe
+s5tiev
+4stijd
+3s4tijg
+5s4tijl
+st3ijs
+3stils
+s4tim
+st3imp
+sti5ni
+4stins
+4s5tint
+4stite
+2stiv
+st3ivo
+4s4t1j
+2stk
+4stl
+2stm
+2stn
+2stob
+2stoc
+4stoef
+3stoel
+5stoel.
+5stoele
+4stoen
+4stoer
+4stoes
+4stoez
+3s4tof
+st3o4ge
+5s4tok
+s4tol
+sto5li
+4stoma
+4stomz
+s4tong
+3s4too
+4st3oog
+stoot5j
+s4top
+st3o5pe
+st5opto
+4stora
+sto4rat
+4stord
+sto5ri
+4s5tos
+s4tov
+2stp
+1s4tr
+4stra.
+straat5j
+4st4rad
+3stra4f
+5straf.
+s5trag
+4strai
+4st3rec
+s5tref
+4streg
+4s3trei
+5strel
+3strep
+st3rif
+st5rijp
+s5tris
+4s3troe
+s5troep
+st4rom
+5strook
+5stroom
+4stroos
+st5roos.
+4s5trou
+4stroz
+3stru
+4strui.
+5struik
+4st1s4
+st3sc
+st5se
+st3sf
+st3sk
+st3sl
+st3so
+st5sp
+st5st
+2st5t2
+1stu
+4stub
+4stuc
+5s4tud
+4stuin
+stui5tj
+st5uitk
+5stuk
+2s4tun
+st3uni
+stu4nie
+4stus
+2stv
+2st3w
+2s4ty
+1styl
+s5typ
+2stz
+1su
+5su.
+5sua
+5su4b1
+suba4
+sub5e
+su5bl
+5suc
+5sud
+3sug
+2sui
+5suik
+4s1uit
+5suit.
+s5uitl
+5suits.
+5suk
+3sul
+5sum
+4s1u2n
+5sup
+5surv
+su4s
+sus3e
+suur5
+4s5v
+svaat5
+svari5
+sve4r
+sve5ri
+4s1w
+s5wo
+s4y
+3sy.
+4syc
+3syn
+sy4n3e
+1sys5
+4s5z
+4t.
+3taak.
+t4aal
+t5aando
+t3aank
+taan4st
+t3aanw
+t3aap
+taar5sp
+4t3aas
+taat4st
+taats5ta
+3tabe
+3tabl
+2tac
+ta2ca
+3t4aci
+4tad
+ta4de
+t3ader
+5tado
+t3adr
+tad4s3
+t3adve
+2taf.
+2t3afd
+5ta3fe
+4taff
+t3afha
+t4afr
+ta3fro
+4t1afs
+2t3afw
+4tafz
+ta4gaa
+5tagee
+5ta5g4l
+tag3r
+5taka
+5takg
+5takken
+ta3kl
+5takn
+5takp
+5tak3r
+5taks
+t2al
+ta3laa
+ta5lact
+4talb
+5tale.
+5talent
+ta3li
+5talig
+t5allia
+talm3a
+4talt
+ta4mak
+4tamb
+t3amba
+5tamen
+tament5j
+4tamp
+t3ampu
+5tan.
+4t3a2na
+ta3nag
+ta3nat
+tan4d3r
+tan4k5r
+ta3o
+t4ape
+5tapi
+ta3pl
+5tapo
+ta3q
+ta3ra
+4t3arb
+5tari
+4t1arm
+ta2ro4
+tar5sp
+tar5taa
+t3arti
+3tarw
+3tas
+5tasa
+5tasj
+5taso
+ta3s2p
+ta3sta
+ta3str
+ta3sy
+4tata
+4tatio
+tat5j
+4t3atl
+3tatr
+3tau
+4taut
+2t1avo
+3tax
+t3a2z
+4t3b
+tba2l
+4t3c
+t4ch
+t5cha
+t5che
+t5chi
+t5chu
+4t3d2
+tdor5st
+tdo3v
+1te
+3tea
+te3akt
+5tea4m
+3tec
+4t3echt
+4teco
+te4dit
+t3edu
+tee2
+teeds5te.
+tee4g
+4teek
+tee4k3l
+teem1
+4tee4n
+t5eenhe
+3teer
+tee5rin
+tee4t
+4t3eeu
+t4ef
+t5eff
+3tefl
+3teh
+4t3eier
+4teig
+tei4lo
+t4ein
+t5eind
+5teit
+tei5tj
+2t3eiw
+5tekene
+5tekens
+4teker
+4tekk
+3teko
+te4k3om
+3teks
+te3kw
+te4k3wi
+t4el
+tel5ant
+te4lap
+tel5da
+4telec
+5teleco
+t5elect
+tel5een
+5telef
+5teleg
+tel5ei.
+tel5eie
+tel5eit
+te5lel
+5telev
+5te5lex
+tel3f
+tel5k
+te4loe
+te4l3o4g
+tel5oog
+te4l3op
+telo4r
+tels4
+4telse
+tel3so
+tel5su
+te4l3uu
+t4em
+2temb
+4temm
+te4mor
+tem3ov
+5temper
+5tempo
+t4en
+ten4ach
+ten3a4g
+te3nak
+te5nare
+te4nau
+tene2
+ten3ed
+ten3el
+tene4t
+3tenh
+ten5k4
+te5nore
+4t5enq
+ten5scr
+ten3sn
+ten3sp
+tensu4
+tens5uu
+3tent
+5tenta
+5tenten.
+ten5to
+t3entw
+5tenu
+t2er
+teraads5
+te4r5aak
+ter3a4b
+tera5ca
+te4rad
+tera4de
+te4r5af
+ter3ag
+te3ral
+te4ran
+ter3ap
+ter3as
+5terec
+te4rei
+ter5eik
+te4rel
+te4rem
+te5ren.
+te4r5enk
+te4r5env
+4t4erf.
+4terfd
+ter3fr
+4t4erft
+te4r5in.
+3terj
+4terk.
+4terkt
+ter3k4w
+3term
+5term.
+5termi
+ter5oc
+te3rod
+te3rof
+te3rog
+5teron
+te5rons
+tero5pe
+tero4r
+te3ros
+5terrei
+5terreu
+5terror
+ter4spr
+ter5ste.
+ter5ston
+3tes
+te3s4ap
+tes3m
+te3so
+tes3ta
+te5stel
+tes5ten
+test5op
+test5ri
+test3u
+te3ta
+te5tr
+4t3euv
+t4ev
+t5e4van
+teve4r
+5tevl
+3tevr
+2tex
+3tex.
+4t3exe
+4texp
+1té
+tè3
+4t3f
+4t3g2
+tgaat5
+t5ge
+tge3la
+tger4
+4th.
+2t1ha
+t3haa
+t4haan
+t4had
+t3hak
+t5ham
+t4hans
+t3har
+t3hav
+5thea
+t3heb
+5thee.
+4t3hei
+4t3hel
+3t2hen
+5theo
+1t2her
+5the3ra
+4t3here
+3thes
+3thet
+t4hin
+4thm
+t1hoe
+t2hog
+t3hok
+t1hoo
+thoof5di
+4t1hou
+t3houd
+5thous
+4t3hov
+3thr
+2thu
+t1hul
+4thum
+t4hur
+3ti
+5ti.
+5tia
+ti5ab
+ti5ae
+ti3ap
+5tib
+5tica
+5tice
+5tici
+5ticu
+ti3d4
+5tie.
+tie5d4
+5tiefs
+tie3kn
+tie4kon
+ti3enc
+tien5st
+5tiep
+5ties
+tie5s4l
+tie5ta
+tie5to
+tie5tw
+ti1eu
+5tieven
+ti3fe
+ti3fr
+ti2ga
+tig5aa
+4tigm
+ti4gu4
+tig3ur
+5tijd
+tije4
+tij5ka
+tij4kl
+5tijn
+tij5p
+t3ijs.
+tij3st
+tij3t2
+tij5tr
+tij5tw
+4t1ijz
+ti3ko
+ti5kr
+t4il
+4tils
+5timm
+5timo
+tina4d
+tin3as
+4t3incu
+4t1ind
+4tinf
+tin4g3i
+ting4sa
+t3inh
+ti4nit
+4t3inj
+t3inko
+4t3inl
+t3inq
+4tinr
+4t3ins
+ti3nu
+4t3inv
+4tinw
+ti5om
+ti3o4p5
+t2is
+ti5sa
+ti3s4j
+ti3sl
+ti3so
+ti4son
+ti3s4p
+ti3sta
+5tite
+ti3th
+ti1t2r
+5tivi
+ti4vo
+1tj2
+2t1ja
+t5jaa
+t5jee
+t5jek
+t3jen
+t5jet
+4tjeu
+2tjo
+t1jou
+2tju
+4t3k2
+tkars3
+4t3l
+t5le.
+5tleb
+t5les
+tli4n
+4t3m
+tmen4st
+tmens5te
+tmos5
+4t3n
+tna4m3o
+tne4r
+tnes4
+5to.
+toa2
+to3ac
+to3ar
+to5bl
+3toc
+1toch
+3tod
+to3da
+t4oe
+toe5d4
+3toej
+toe5k
+5toe3l4a
+toe5le
+5toelic
+toemaat5
+5toen
+to5ende
+toe5pl
+3toer
+5toeri
+5toern
+5toe1s4
+toe5st
+toe3tj
+3toets
+5toets.
+5toetse
+toets5te.
+3toev
+5toez
+to2f
+tof5ar
+tof5d
+to4fr
+tof3th
+3togn
+5togr
+3toi
+to4kan
+tok3s
+t2ol
+to3la
+5tolaa
+to5le
+5tolet
+t3olf
+2toli
+5tolic
+to4lie
+tolk5s
+5tolo
+tolp3r
+t3oly
+4tom.
+5tomaa
+tomaat5
+t3oml
+to3mo
+tom4p3j
+4t3om5s
+5ton.
+4tond
+3t2one
+5tonee
+5to5nen
+to5ner
+3t4ong
+5tong.
+3t4oni
+5t4onn
+to3no
+5tons
+ton3sk
+too4m
+toom3e
+5toon
+t4op.
+top5art
+top3as
+to3pen
+to3pet
+to3pi
+2topm
+to4po
+to5pos
+t4opp
+to4pu
+to5pus
+t3opva
+5tor.
+to3ra
+to4r3ag
+t3ord
+to5rec
+5torens
+4t1org
+t5orga
+t4ori
+3toria
+to4rië
+tor3k
+tor4m3a
+toro4
+to4r5oli
+to3rom
+5torr
+3tors
+tors5te.
+to3r2u
+3tos4
+to3sa
+to1sl
+to1s2p
+tos5te
+5tota
+to3tr
+2t3oud
+3tour
+tou4r3e
+to3v
+tove5na
+to4vens
+4toverg
+to3w4
+4t3p4
+tpe4t3
+tpi3s
+tr4
+3tra.
+4t3raad
+5tracé
+5trafo.
+3trag
+4tragez
+3t4rai
+5train
+5traka
+t3rake
+3trakt
+3trans
+5transa
+5trap.
+5trau
+4t3raz
+3t4re.
+4trea
+2trec
+5tred.
+4treda
+t5redes
+4tredu
+3tref
+4t5reg
+4t3reis
+4treiz
+4trel
+t3rese
+t3resu
+tre2t3
+t4reu
+t3rib.
+5tribu
+5trico
+trie5ta
+trig2
+2trij
+5t4ril
+tri5ni
+5t4rio4
+t3risi
+t3rit.
+5t4riti
+5trody
+t3roed
+t3roes
+5trofy
+3trog
+t4roï
+5troj
+4trol.
+5trola
+5trolo
+5tromm
+5tron.
+5trona
+t5rond
+3trone
+5tronn
+5trono
+5trons
+tront5j
+t3rood
+5troon
+t4roos
+tro5pi
+t4ros
+5trotu
+3trou
+4t5rout
+tro5v
+5truc.
+5truf
+4trug
+5trui.
+5truie
+t3ruim
+trui5t4
+t3ruk
+t4rum
+4ts
+ts3a2d
+tsa4g
+ts1am
+t3sap
+ts3as
+tse4d
+ts5een
+t4s3ei
+ts5eind
+t4s5ene
+t4s3eng
+t4s3erg
+ts5erge
+t4s3e2v
+t2sij
+t4s3ink
+ts3int
+ts2j
+ts3ja
+t3sjen
+3tsji
+t1sl
+ts4laa
+t3slac
+t5slag.
+ts3lam
+t2s3le
+t5slib
+t5sloe
+t3s4lu
+ts2me
+ts4moe
+ts3neu
+ts4no
+ts5nor
+ts5not
+ts3nu
+ts3ob
+tso2l
+ts3oli
+ts3om
+ts1on
+ts4opp
+ts1o4r
+ts1ov
+ts3pad
+t3span
+t5spec
+t4s3pet
+t3spi
+t4s3pil
+t3spoe
+t3spoo
+t5s4por
+ts3pot
+t4spro
+ts4pru
+ts5q
+ts5s
+t3sta
+t4staak
+t4s5tank
+ts5tant
+t4star
+t4stas
+t3ste
+t5sted
+t5stee
+ts5teko
+t5stell
+t5stels
+t5stem
+t5ster.
+t4sterr
+t5sters
+t5s4tes.
+t5steu
+ts3th
+t1s4ti
+t3stij
+t5stijg
+t5stil
+ts5tin
+ts5t4j
+t1sto
+ts5toep
+ts5tong
+t4store
+ts5trad
+ts5trei
+t3stri
+ts5troe
+ts5ty
+t4su4
+ts3ur
+ts3us
+ts3uu
+t1sy
+4t3t
+t5t4a
+t5te
+tte5loe
+tte5l4op
+tte2n
+tten4t5j
+tte5ri
+t5tlet
+tt3oog
+ttop2
+t5t4r
+t5tum
+tt3uu
+3tua
+3tub
+3tuch
+3tu3e
+5tueu
+tu3és
+3tuig
+5tuin
+4tuip
+2tuit
+tuit4j
+4tuk
+tu4k3i
+tul5pi
+t4um
+5tune
+5tunn
+tu1o
+5turb
+tu3ri
+3tu4s3
+tut3j
+tuurs5la
+tu3wa
+4tv
+tvaat5
+t3ve
+4t1w
+3t4wijf
+t2win
+1ty1
+3typ
+tys4
+4tz
+t3za
+t3zi
+t5zw
+u1a
+u3ac
+u3an
+ua5ne
+ua3p
+u5ar.
+uar5t
+ua3sa
+uat4
+2u2b
+ub3ac
+ube4li
+ub5em
+u5bi
+u3bo
+ub5or
+4uc
+u1che
+ucht5sl
+uc4ki
+ucle3
+uc4t3a
+uc4tin
+u1d
+uda2
+u5da.
+ud5am
+ud3ei
+ud3ess
+u4de4z
+ud3eze
+udi4o
+udi5ologe
+udi3om
+udoe2
+ud3ond
+ud3oo
+ud3ov
+u4d1r
+uds5lo
+uds4m
+uds5ma
+ud3sme
+ud3smi
+ud1st
+ud4sta
+uds5tak
+ud4sti
+ud1w
+u3ec
+ue2co
+u1ee4
+u3ef
+u3ei
+u1el
+u4ene
+u1er
+uer3il
+ue3st
+u1eu
+u5eul
+u3ez
+u3è
+u4f3an
+u1fl
+u1f4r
+uf2s
+u5ga
+ug4da2
+ug4der
+ug2do
+ug4dr
+uge4l5o
+ug3ij
+ug1l
+u2go
+ug3or
+u2g1r
+ug5sce
+ug4sec
+ugs4p
+ugs5pa
+ug1s4t
+ugs5tra
+u1h
+u2i
+ui5ac
+ui2d3a
+ui2d1o
+uid4s
+uid3sp
+uid5spre
+uid5ste.
+uid3u
+ui3e
+uien4t
+ui2fa
+uif1l
+uif5r
+ui2fu
+4uig
+ui4g5aa
+uig1l
+ui2g3o
+ui4g3r
+ui4gu
+4uik
+ui2k3a
+ui4k3l
+ui2ko
+ui2ku
+ui2la
+uil5aa
+ui4l3em
+uil5m
+ui4l3og
+ui4loo
+uil3ov
+4uim
+ui2m3a
+ui3mag
+ui4n1a
+uin5g
+ui2no
+uin5og
+uin3or
+uin4s5lo
+uin5to
+ui2p3l
+ui4p3o4
+ui2p3r
+4uis
+ui2s3a
+uis5c
+ui4sl
+ui5slu
+uis5p
+ui4st
+ui4t3a4
+uit5aa
+uit5al
+ui5tar
+1uitg
+uit1j
+3uitl
+ui2t1o
+1uit5r
+uit3sl
+uit3sn
+uit5sp
+uits5te.
+3uitw
+3uitz
+ui3v
+4u3j
+2uk
+u2k3al
+uk3as
+ukkers5
+u2k3l
+u3klas
+u2k3n
+u2k3o
+u3koc
+uko2p
+uk4o3pl
+u4k3r
+uk3s2m
+uk3spa
+uk3spl
+uk4sti
+uk1w
+u1la
+ul3ac
+ulam4
+ula4p
+ul4d3a
+uld5erk
+ul5dop
+ul4d3u
+u1le
+ule5sp
+ul3fl
+ul5fo
+ul3fr
+ul3in.
+u5ling
+ul3inn
+ul3k2a
+ul5ke
+ul2k3l
+u1lo
+ul3o2p
+u3los
+ul2pa
+ulp3ac
+ul4pi
+ul2p3l
+ul2po
+ul4p3r
+ul3sa
+ul3so
+ul2s3p
+uls5te.
+uls5tel
+u3lu
+um3af
+um3ar
+3umda
+2ume
+umee4
+umes4
+ume3st
+um3om
+um3op
+um3so
+um3st
+u2m3ui
+un3ac
+un2c
+unch3r
+un4dra
+und4s
+unds5ta
+und5ste
+une4t
+un3g
+1univ
+un4k3r
+un4o
+uno3g
+un5o2p
+unst3a
+un4ste.
+unst3o
+un4st5r
+unst5ui
+un4tag
+unt5een
+un2tj
+un4t5o4
+unt3s4m
+un4t3u
+u3ol
+u3on
+u3oo
+u1or
+uo3ru
+u3os
+uota3
+4up
+u1pa
+u1pe
+upe3k
+upe4ro
+uper5st
+u3ph
+u3pi
+u1pl
+u4p3lei
+u1po
+u3pol
+up3om
+up3op
+u1pr
+up4tr
+u1ra
+ur3aan
+ur1ac
+ur3ada
+ur3adv
+u2r3a4r
+uras3
+u4r3a2z
+urd4o
+u1r2e
+ur3ech
+ur3een
+uree5s
+ure5lu
+urelu5r
+u4rem
+ur3emb
+ure4n
+u3res
+ur3ess
+ure3st
+ur3eta
+4urf
+ur2fa
+ur3gi
+u1ri
+uri4gl
+ur3ijz
+ur3ind
+ur3int
+4urk
+urken5s
+ur4kie
+ur3k4l
+urk4s5t
+u1ro
+ur5opb
+ur3or
+uro5s
+ur5pr
+ur4serv
+ur4s3ev
+ur3s4fe
+ur2sl
+urs5laa
+urs5li
+ur4s5m
+ur2sn
+ur4sp
+urs5pa
+ur5spel
+ur5spor
+urs5take
+urs5th
+ur4sti
+urs5tik
+ur3ta
+ur4tro
+ur5troe
+u3ru
+ur3ui
+4urv
+u1r4y
+4usaa
+us3ad
+us3a2m
+us1ap
+u4sc
+u5s2cr
+use5tj
+u5sie
+u4sj
+u4s5l
+u4sm
+u2s5n
+uso2
+us3oï
+us3os
+u2s3p
+us5pi
+us5pu
+us4ta
+us5tag
+ust3al
+u2s3te
+us4t3ei
+u4sti
+ust3oo
+us5tra.
+us5tre.
+us5tro
+us5tru
+ustu4
+ust3ur
+ust3uu
+u1ta
+ut3aan
+utaar5
+ut1ac
+ut3af
+u3tan
+uta3s4
+ut5c
+u4t3ees
+u4tek
+ut3eks
+ut3em
+ut5emm
+uter5an
+ut3ex
+ut2h
+ut3ho
+u2tj
+u1to
+uto5f
+ut3oog
+uto3pe
+utop4l
+uto5po
+utop4r
+uto5s
+ut3saa
+ut3s2c
+uts5eng
+uts2m
+ut1sn
+ut3sp
+ut4spa
+ut4spo
+ut2st
+uts5tak
+ut4ste.
+ut5sten
+ut3str
+ut5su
+utt4
+u1tu
+ut5w
+u4u4
+uur3a4
+uur3e4
+uur5i
+uur3k
+uur1o2
+uur5ste
+uur5sti
+4uut
+uut3a
+uut3r
+uvel4s
+uve5na
+uw1a
+u3wag
+uw3ar
+uw5art
+u1we
+uw3ec
+uwe5d
+uw3een
+u2w3ei
+uwe4nen
+uwes4
+u1wi
+u2w3ij
+uw5ijz
+u4wind
+u3wing
+u4wins
+uw3inz
+uw1o
+u3woe
+uwo4ge
+uw1r
+uw3u
+uxa3
+u3ya
+4uz
+uze3t4
+uzie2
+ût3s4
+1ü
+ü4b
+ü1n
+ü3ri
+üs3l
+1v2
+2v.
+vaar4ta
+vaart5r
+va3de
+va3g4
+va2ki
+va4kl
+va2ko
+va2l3a
+val5m
+va3lo
+va4loe
+val5si
+val4s5p
+vals5tek
+valu5
+va2n
+van3ac
+vand4
+vang3a
+van4gr
+va3no
+va4noc
+va1p
+va3re
+va5se
+va3s4o
+vast3r
+va3su
+va3te
+va2t3h
+vat5j
+va3z
+v4b
+4v3c
+v4e
+3ve.
+5veb
+vee4l
+veel5e
+vee3p4
+vees4
+ve3g4h
+vei3s4
+vei5tj
+3vek
+5vel
+ve4l3a4g
+vel4d3o
+ve3le
+vel3k
+5vem
+vem4a
+ve4na
+ve5nare
+5vend
+ven5k
+ve2n3o
+2venr
+ven4s3e
+ven4sl
+vens5lan
+vens5lo
+ven4sp
+vens5taak
+vens5take
+vens5tek
+ven4s3u4
+ve2r
+ver1a
+ver5aas
+ve4rad
+vera4g
+ve4rand
+ver5do
+ve3rec
+ver3ed
+ve3reg
+ve3rei
+ver5eis
+ve5ren.
+ve5rend
+ver3e4t
+ver5ijd
+ver5ijl
+ver5ijs
+ve5ring
+ver5k4
+ver3o
+ve3rom
+vero5v
+ver5p
+ver5spe
+ver5sta
+ver5sto
+ver5tw
+ver1u
+ve3ry
+ve2s3
+ves5ti
+ve2tj
+ve2to4
+vet3og
+vet3oo
+ve3tor
+ve2t3r
+vet4roe
+vet5ste
+5ve5z
+3vi
+4vicepa
+vid5st
+vie4r3a
+vie4s3
+vies5n
+vie4tj
+vi3eu
+vijf5
+vik4s
+vil4t3j
+ving4
+vings3
+vi3o
+vi5om
+vi4s3an
+vi1so
+vis5ot
+vis5p
+vi4st
+vis5tr
+vi1tr
+v3j
+vje4
+vjet1
+3vl
+v3lar
+vlei3s4
+vlie4s5
+vlot5s
+v3lov
+5vo.
+3voe
+voe4t3a
+voe4t3r
+voet5sp
+3vog
+voge4
+3voi
+vo2le
+vol4g3a
+vol4gra
+vo2li
+vol3ij
+vol5p
+von4det
+vond5u
+3voo
+voo5d
+vooi5t
+voorn4
+voor5na
+vo3ra
+vorm3a
+vors5te.
+vor5sten
+vos3
+3vot
+vot3j
+3vou
+vous5
+3v4r2
+vrei5
+vrie4s
+vrij5k4
+vrijs4
+vrij5ste
+v3t
+vues4
+vu2l
+vul5p
+vuur5s
+vy3
+2w.
+waad3
+w2aar
+waar5e
+waar5ste
+wa4b3
+wa2ba
+wa5bl
+w2ad
+wa3dr
+w4ag
+wa2la
+wa3lan
+4wam
+wan4d5r
+wan4gr
+wang5sl
+wa2n1o
+wan3s4
+3wap
+w4ar
+w5arc
+5ward
+war4st
+wars5te
+wart3j
+war4to
+wa2si
+wa4s5l
+wa4s5p
+was5tr
+1wate
+wat5j
+wa3tr
+3way
+2wb
+w1c
+2w1d
+w4doo
+wd3oom
+we2a
+2we2c
+3wed
+wede4
+we2d3i
+we4d3r
+wee4ki
+wee4k3r
+wee3lo
+wee3s4t
+wee5ste
+3weg
+we4g1a
+we4gerv
+weg3l
+we2g3o
+we4g5r
+wei3s
+wei5tj
+we4k3r
+we4le2
+4welem
+we3li
+we2lo
+wel3s
+we2m
+wem3a
+we3me
+we2n
+wena4
+wen3ad
+we3ne4
+we4nem
+we5nen.
+wen5enk
+we3ni
+wen4k3a
+wen3o
+wen5to
+wer2f
+4werg
+wer4ka
+wer4k5l
+wer4kn
+wer4k3o
+wer4k3r
+werk5ru
+wer4k3u4
+wer4k3w
+wer4p3a
+wer4p3l
+wer4pr
+wer4s
+wer5ste
+we2s3
+we3spo
+wes4t5o
+3wet.
+we2th
+we2t3j
+wet4st
+we2t3u
+2wex
+wezen4s5
+2w1f
+w1g
+w1h
+wie4la
+wie4t
+w4ij
+3wijd
+wij4ka
+wij4s
+wijs3l
+wijs3p
+wijs5ta
+wi4k
+3wil
+wind3a
+win4d3r
+w4ing
+2winr
+win2s
+winst5aa
+winst5r
+wi4t3h
+wit3j
+wi2t3o4
+wit3r
+w1j
+2w1k
+2w1l
+4w1m
+2wn
+wn3ac
+w3ne
+w3ni
+w3no
+w3ob
+w2oe
+woes3
+woest5a
+wo4l
+wol3a
+wolf4s5
+woon5sf
+woor4d5r
+wor4g3e
+w1p
+wren4st
+wrens5te.
+2ws
+ws3a2
+w3sc
+w1sl
+w2s3le
+w3som
+w3sp
+ws2pl
+w4spr
+w5spra
+w1s4t
+w4stij
+2wt
+wtes3
+wtje5sp
+w1to
+w1tr
+wu2
+wva2
+w1w
+xaf4
+xa3g
+xamen5t
+xan3
+xan5t
+x1c
+x4e
+xen4d
+xe3ro
+x1f
+x1h
+xie4t
+xi3g
+xi5o
+xi3sta
+xi3sto
+xi4t3i
+x3l
+x1m
+xo3no
+x4op
+xo3s4
+x1p
+xpre2
+xpres5
+x3r
+x3so
+x3sp
+x1t
+x2tak
+xtie2
+x3w
+xy3
+y1a
+ya3s4
+ya4s5p
+y3at
+yba2l3
+yber4t3
+y1c
+ycho3
+y3co
+y1d4
+ydi3a
+y5dr
+ydro3
+y1e
+yes3
+y3és
+y3è
+y1f
+y1g
+ygu2
+y1h
+y1i
+y4in
+y5is
+yksge4
+y3la
+yl3al
+y3le
+y4l3et
+y3lo
+ylo3l
+ym2f5l
+ym5pa
+y3na
+yn3er
+y3no
+yn1t
+y1o
+y3on
+y3os
+yo3t
+y1p
+y3p4h
+ypo3
+ypot4
+yp3s
+yp5si
+y1r
+y3r4e
+y5ri
+ys3
+y1s4a
+y3s4c
+y5s4e
+yse5t
+y3s4f
+y3s4h
+ys4i
+y3s4o
+y3s4p
+ys5pl
+ys4ta
+ys5tr
+y3sy
+y1t
+yt3hu
+yto3
+y2tof
+ytop4
+yu5a
+y3ui
+y3u2r
+yvari5
+y1w4
+1z
+4z.
+zaar5t
+za3f2
+zags4t
+za2k3a
+zak3r
+zan2d
+zand5a4
+zan3di
+zan4dr
+zang3s
+za3po
+za3s4
+4zb
+4zc
+4zd
+z4e
+zee3k
+zeel5d
+zee3r4o
+zeero5v
+zeer5s
+zee3s4
+ze5ge
+zeg4sl
+zei3sp
+ze5k
+zel5dr
+ze3lem
+zel2f1
+zel4so
+zen4d3a
+ze4nin
+zen5k
+zen3o4
+zen4og
+ze3non
+ze4r3a
+ze3ro
+zer2s
+zer4s5e
+ze4s3
+ze5sch
+zes5e
+zes5l
+ze5ste
+ze2t3a
+ze2t3h
+ze4ti
+ze2t3j
+ze2t3r
+zeve2
+zeven3
+4zf
+4zg
+2z3h
+z2i
+ziek3l
+zie4k3o
+ziek3w
+ziel4s
+zie5sl
+3zif
+zi2g5a
+zij5kl
+zij3po
+zij5s4
+zik2w
+zi4n3a4
+zings3
+zin4k3l
+zin4s
+zins3t
+zins5ta
+zin5str
+zi3o5
+zipi3
+zi4t
+zit3e
+zit3j
+zit3u4
+4z3k
+4z3l
+4zm
+zodi5
+zoet3j
+zoet5ste
+zo3f2
+zoi4
+zo5ie
+zo3la
+zome4
+zo2na
+zon3sf
+zon5ta
+zooi5tj
+zo1p
+zor4g3a
+zor4gl
+zor4gr
+zo2t
+zot3h
+zo3tr
+zo3v
+4z3p
+4z3r
+2zs
+4z5t
+zui4d3i
+zui4dr
+zus3
+2zv
+z4w
+zwets5te.
+5zy
+2z3z
+zz3in
+zz3or
+z4z5w} \ No newline at end of file
diff --git a/tex/context/patterns/lang-nl.rhl b/tex/context/patterns/lang-nl.rhl
new file mode 100644
index 000000000..9e176ee89
--- /dev/null
+++ b/tex/context/patterns/lang-nl.rhl
@@ -0,0 +1,2907 @@
+ma{-}{i}{ï}s
+ka{-}{i}{ï}n
+ba{-}{a}{ä}l
+Jo{-}{e}{ë}l
+Ba{-}{a}{ä}l
+ta{-}{e}{ë}l
+ia{-}{e}{ë}n
+Ka{-}{i}{ï}n
+tea{-}{e}{ë}n
+r{a-}{}{aa}tje
+p{a-}{}{aa}tje
+ge{-}{e}{ë}bd
+ge{-}{e}{ë}nt
+zee{-}{e}{ë}n
+wee{-}{e}{ë}n
+ski{-}{e}{ë}r
+ski{-}{e}{ë}n
+ru{-}{i}{ï}-ne
+ree{-}{e}{ë}n
+po{-}{e}{ë}et
+pee{-}{e}{ë}n
+oli{-}{e}{ë}n
+ka{-}{i}{ï}ns
+fee{-}{e}{ë}n
+ari{-}{e}{ë}r
+Ha{-}{i}{ï}-ti
+po{-}{e}{ë}ma
+pi{-}{e}{ë}-ta
+po{-}{e}{ë}em
+jeu{-}{i}{ï}g
+na{-}{i}{ï}ef
+moe{-}{e}{ë}r
+de{-}{i}{ï}st
+Za{-}{i}{ï}-re
+ge{-}{i}{ï}nd
+Ka{-}{i}{ï}-ro
+re{-}{e}{ë}el
+re{-}{e}{ë}-le
+ge{-}{e}{ë}gd
+Ca{-}{i}{ï}-ro
+be{-}{e}{ë}rf
+the{-}{i}{ï}st
+stee{-}{e}{ë}n
+ge{-}{e}{ë}rfd
+ge{-}{e}{ë}ist
+di{-}{e}{ë}-ten
+ka-no{-}{e}{ë}n
+va-cu{-}{u}{ü}m
+twee{-}{e}{ë}n
+tree{-}{e}{ë}n
+smeu{-}{i}{ï}g
+slee{-}{e}{ë}n
+ski{-}{e}{ë}rs
+re{-}{u}{ü}-nie
+re-li{-}{e}{ë}f
+po{-}{e}{ë}-zie
+po{-}{e}{ë}-ten
+ma-li{-}{e}{ë}n
+le-li{-}{e}{ë}n
+knie{-}{e}{ë}n
+idee{-}{e}{ë}n
+ge{-}{e}{ë}erd
+dru{-}{i}{ï}-de
+drie{-}{e}{ë}n
+cli{-}{e}{ë}nt
+ca-ri{-}{e}{ë}s
+ari{-}{e}{ë}rs
+ac-ti{-}{e}{ë}n
+Is-ra{-}{e}{ë}l
+ori{-}{e}{ë}nt
+ME{-}{}{–}er
+ole{-}{i}{ï}-ne
+be{-}{e}{ë}rfd
+Ha-ri{-}{e}{ë}t
+Fij-i{-}{e}{ë}r
+Tri{-}{e}{ë}st
+BN{-}{}{–}er
+Is-ma{-}{e}{ë}l
+Li-bi{-}{e}{ë}r
+Ori{-}{e}{ë}nt
+wee{-}{i}{ï}ge
+ra-bi{-}{e}{ë}s
+taxi{-}{e}{ë}n
+thee{-}{e}{ë}n
+ta-li{-}{e}{ë}n
+ru{-}{i}{ï}-nen
+se-ri{-}{e}{ë}n
+si{-}{e}{ë}r-ra
+si{-}{e}{ë}s-ta
+snee{-}{e}{ë}n
+spie{-}{e}{ë}n
+ha-vo{-}{e}{ë}r
+po{-}{e}{ë}-men
+po{-}{e}{ë}-sis
+po-go{-}{e}{ë}n
+po-lo{-}{e}{ë}n
+po-ri{-}{e}{ë}n
+fa-ci{-}{e}{ë}s
+fa{-}{e}{ë}-ton
+na{-}{i}{ï}e-ve
+na-ti{-}{e}{ë}n
+or-gi{-}{e}{ë}n
+owee{-}{e}{ë}r
+jeu{-}{i}{ï}ge
+jo-jo{-}{e}{ë}n
+ju-do{-}{e}{ë}n
+ka-no{-}{e}{ë}r
+kwee{-}{e}{ë}n
+ma-gi{-}{e}{ë}r
+ma-o{-}{i}{ï}st
+me-ni{-}{e}{ë}n
+echo{-}{e}{ë}n
+ego{-}{i}{ï}st
+flu{-}{i}{ï}-de
+fu-ri{-}{e}{ë}n
+ge-ni{-}{e}{ë}n
+glee{-}{e}{ë}n
+he-ro{-}{e}{ë}n
+ide{-}{e}{ë}el
+ide{-}{e}{ë}-le
+In-di{-}{e}{ë}r
+de{-}{i}{ï}s-me
+co{-}{i}{ï}-tus
+li{-}{e}{ë}-ren
+om{a-}{}{aa}tje
+ge{-}{e}{ë}ind
+SP{-}{}{–}er
+ge{-}{e}{ë}tst
+SS{-}{}{–}er
+ru-zi{-}{e}{ë}n
+To-go{-}{e}{ë}r
+ge{-}{i}{ï}nkt
+Sy-ri{-}{e}{ë}r
+Os-lo{-}{e}{ë}r
+uf{o-}{}{oo}tje
+go{-}{e}{ë}-tie
+veto{-}{e}{ë}n
+id{-}{}{–}er
+Li-ma{-}{e}{ë}r
+ge{-}{e}{ë}cht
+ge{-}{e}{ë}est
+the{-}{i}{ï}-ne
+IT{-}{}{–}er
+At-ti{-}{e}{ë}r
+fi{-}{e}{ë}s-ta
+Da-ni{-}{e}{ë}l
+Ra-fa{-}{e}{ë}l
+be-zi{-}{e}{ë}n
+vl{a-}{}{aa}tje
+sk{i-}{}{ie}tje
+op{a-}{}{aa}tje
+ge{-}{u}{ü}rmd
+ge{-}{e}{ë}g-de
+be{-}{i}{ï}nkt
+be{-}{e}{ë}rft
+be{-}{e}{ë}dig
+ge{-}{i}{ï}n-de
+cre{-}{e}{ë}er
+ge{-}{e}{ë}n-te
+ru{-}{i}{ï}-nes
+vree{-}{e}{ë}n
+re{-}{e}{ë}-ler
+ca-f{é-}{}{ee}tje
+fo-t{o-}{}{oo}tje
+ge{-}{e}{ë}is-te
+be-h{a-}{}{aa}tje
+pri{-}{e}{ë}-len
+the{-}{i}{ï}s-me
+ter-ri{-}{e}{ë}r
+su{-}{i}{ï}-ci-de
+stu-di{-}{e}{ë}n
+spe-ci{-}{e}{ë}n
+sau-ri{-}{e}{ë}r
+re{-}{u}{ü}-nies
+re-li{-}{e}{ë}fs
+pin-gu{-}{i}{ï}n
+pi{-}{e}{ë}-teit
+pa-ti{-}{e}{ë}nt
+or-gie{-}{e}{ë}n
+mo-za{-}{i}{ï}ek
+ma-nie{-}{e}{ë}n
+ko-pie{-}{e}{ë}n
+hy-gi{-}{e}{ë}-ne
+he-ro{-}{i}{ï}-ne
+ge{-}{e}{ë}rf-de
+ge{-}{e}{ë}er-de
+co-ca{-}{i}{ï}-ne
+cli{-}{e}{ë}n-te
+ca-fe{-}{i}{ï}-ne
+be{-}{e}{ë}digd
+si-l{o-}{}{oo}tje
+au-t{o-}{}{oo}tje
+Is-ra{-}{e}{ë}-li
+kmo{-}{}{–}er
+hbo{-}{}{–}er
+ftp{-}{}{–}de
+ta-c{o-}{}{oo}tje
+pc{-}{}{–}tje
+ftp{-}{}{–}en
+Sy-ri{-}{e}{ë}rs
+Ibe-ri{-}{e}{ë}r
+sms{-}{}{–}te
+owee{-}{e}{ë}rs
+na{-}{i}{ï}efst
+ma-m{a-}{}{aa}tje
+ki-w{i-}{}{ie}tje
+ka-n{o-}{}{oo}tje
+jo-j{o-}{}{oo}tje
+ide{-}{e}{ë}-ler
+hts{-}{}{–}er
+fu-g{a-}{}{aa}tje
+ech{o-}{}{oo}tje
+ca-su{-}{i}{ï}st
+Tri{-}{e}{ë}sts
+Swa-zi{-}{e}{ë}r
+SGP{-}{}{–}er
+Hen-ri{-}{e}{ë}t
+Ca{-}{i}{ï}-root
+Ca-ra{-}{i}{ï}eb
+Bak-oe{-}{e}{ë}r
+gi-r{o-}{}{oo}tje
+IT{-}{}{–}ers
+A4{-}{}{–}tje
+Ga-bri{-}{e}{ë}l
+me-n{u-}{}{uu}tje
+PSV{-}{}{–}er
+NSB{-}{}{–}er
+in-ge{-}{e}{ë}nt
+VVD{-}{}{–}er
+tbs{-}{}{–}er
+sms{-}{}{–}je
+di{-}{e}{ë}-tiek
+Bos-ni{-}{e}{ë}r
+ju-da{-}{i}{ï}-ca
+fo-bie{-}{e}{ë}n
+ma{-}{i}{ï}s-pap
+tra-li{-}{e}{ë}n
+tri-du{-}{u}{ü}m
+tri{-}{e}{ë}-ren
+uni{-}{e}{ë}-ren
+ta-o{-}{i}{ï}s-me
+ir-re{-}{e}{ë}-le
+sta-ti{-}{e}{ë}n
+sto{-}{i}{ï}sch
+sec-ti{-}{e}{ë}n
+se-ri{-}{e}{ë}-le
+Ser-vi{-}{e}{ë}r
+smeu{-}{i}{ï}ge
+spa-ni{-}{e}{ë}l
+schee{-}{e}{ë}n
+sms{-}{}{–}en
+ru{-}{i}{ï}-neus
+sca-bi{-}{e}{ë}s
+re{-}{u}{ü}-nist
+pi{-}{e}{ë}-tist
+po{-}{e}{ë}-ti-ca
+po{-}{e}{ë}-tiek
+Gal-li{-}{e}{ë}r
+na{-}{i}{ï}e-ver
+na-wee{-}{e}{ë}n
+neu-ri{-}{e}{ë}n
+oblie{-}{e}{ë}n
+In-di{-}{e}{ë}rs
+Ira-ni{-}{e}{ë}r
+ir-re{-}{e}{ë}el
+je-zu{-}{i}{ï}et
+ka-dee{-}{e}{ë}n
+ka-no{-}{e}{ë}rs
+ma-gi{-}{e}{ë}rs
+ma{-}{i}{ï}-ze-na
+man-di{-}{e}{ë}n
+ma-o{-}{i}{ï}s-me
+mis-si{-}{e}{ë}n
+di{-}{e}{ë}-tist
+dru{-}{i}{ï}-den
+ego{-}{i}{ï}s-me
+ego{-}{i}{ï}s-te
+fac-ti{-}{e}{ë}n
+fee{-}{e}{ë}-rie
+flu{-}{i}{ï}-dum
+ge{-}{e}{ë}m-mer
+ge{-}{e}{ë}t-ter
+ge-nie{-}{e}{ë}n
+gla-ri{-}{e}{ë}n
+glo-ri{-}{e}{ë}n
+gra-ti{-}{e}{ë}n
+he-ro{-}{i}{ï}ek
+ho-bo{-}{i}{ï}st
+hos-ti{-}{e}{ë}n
+de{-}{i}{ï}s-ten
+cre{-}{e}{ë}-ren
+da-da{-}{i}{ï}st
+da-na{-}{i}{ï}-de
+ca-mee{-}{e}{ë}n
+ca-se{-}{i}{ï}-ne
+co-de{-}{i}{ï}-ne
+co{-}{i}{ï}-taal
+athe{-}{i}{ï}st
+At-jee{-}{e}{ë}r
+be{-}{e}{ë}rf-de
+be{-}{e}{ë}r-ven
+be-oli{-}{e}{ë}n
+Be-o-ti{-}{e}{ë}r
+tu-t{u-}{}{uu}tje
+ma{-}{i}{ï}s-kip
+To-ki-o{-}{e}{ë}r
+sta-di{-}{e}{ë}n
+Li-bi{-}{e}{ë}rs
+Sa-u-di{-}{e}{ë}r
+AOW{-}{}{–}er
+Mat-te{-}{u}{ü}s
+Apu-li{-}{e}{ë}r
+co-l{a-}{}{aa}tje
+ac-c{u-}{}{uu}tje
+tru{-}{i}{ï}s-me
+la-m{a-}{}{aa}tje
+Mi-cha{-}{e}{ë}l
+Ka{-}{i}{ï}-root
+BN{-}{}{–}ers
+queue{-}{e}{ë}n
+ee-g{a-}{}{aa}tje
+CDA{-}{}{–}er
+echo{-}{e}{ë}nd
+vwo{-}{}{–}er
+lo-g{o-}{}{oo}tje
+WAO{-}{}{–}er
+ME{-}{}{–}ers
+ha-vo{-}{e}{ë}rs
+de-m{o-}{}{oo}tje
+Quito{-}{e}{ë}r
+no-t{a-}{}{aa}tje
+SS{-}{}{–}ers
+Bel-gi{-}{e}{ë}s
+ij{-}{}{–}tje
+bin-go{-}{e}{ë}n
+lo-g{é-}{}{ee}tje
+Za{-}{i}{ï}-rees
+ho-b{o-}{}{oo}tje
+Ven-lo{-}{e}{ë}r
+Um-bri{-}{e}{ë}r
+D66{-}{}{–}er
+fa{-}{e}{ë}-tons
+ba-b{a-}{}{aa}tje
+vl{a-}{}{aa}tjes
+to-k{o-}{}{oo}tje
+to-g{a-}{}{aa}tje
+tax{i-}{}{ie}tje
+sp{a-}{}{aa}tjes
+so-l{o-}{}{oo}tje
+so-f{a-}{}{aa}tje
+sk{i-}{}{ie}tjes
+sa-t{é-}{}{ee}tje
+ru{-}{i}{ï}-neer
+re{-}{e}{ë}elst
+po{-}{e}{ë}ma-ta
+op{a-}{}{aa}tjes
+mum-mi{-}{e}{ë}n
+me-m{o-}{}{oo}tje
+li{-}{e}{ë}er-de
+ge{-}{i}{ï}nk-te
+ge{-}{e}{ë}zeld
+du-{o-}{}{oo}tjes
+be{-}{i}{ï}nk-te
+be{-}{e}{ë}digt
+ge{-}{e}{ë}ts-te
+re{-}{e}{ë}-le-re
+SP{-}{}{–}ers
+ru-zi{-}{e}{ë}nd
+cd{-}{}{–}tje
+tri-{o-}{}{oo}tje
+tv{-}{}{–}tje
+cre{-}{e}{ë}ert
+om{a-}{}{aa}tjes
+pa-p{a-}{}{aa}tje
+ade-no{-}{i}{ï}-de
+ab-lu-ti{-}{e}{ë}n
+the{-}{i}{ï}s-ten
+sal-v{o-}{}{oo}tje
+pyg-mee{-}{e}{ë}n
+ra-di-{o-}{}{oo}tje
+ge{-}{e}{ë}r-gerd
+tro-fee{-}{e}{ë}n
+ter-ri{-}{e}{ë}rs
+sau-ri{-}{e}{ë}rs
+quo-ti{-}{e}{ë}nt
+pin-gu{-}{i}{ï}ns
+pa-ti{-}{e}{ë}n-te
+li-ni{-}{e}{ë}-ren
+lin-gu{-}{i}{ï}st
+ko-pi{-}{e}{ë}-ren
+ko-lo-ni{-}{e}{ë}n
+ju-da{-}{i}{ï}s-me
+gra-fie{-}{e}{ë}n
+ge-vree{-}{e}{ë}n
+ge{-}{e}{ë}i-gend
+cli{-}{e}{ë}n-ten
+bi{-}{e}{ë}n-na-le
+be{-}{e}{ë}dig-de
+be-doe{-}{i}{ï}en
+mas-s{a-}{}{aa}tje
+re-gi-{o-}{}{oo}tje
+agra-ri{-}{e}{ë}r
+al-tru{-}{i}{ï}st
+am-bi{-}{e}{ë}-ren
+Tu-ne-si{-}{e}{ë}r
+ima-g{o-}{}{oo}tje
+fa-ra-{o-}{}{oo}tje
+cor-s{o-}{}{oo}tje
+air-c{o-}{}{oo}tje
+tra-c{é-}{}{ee}tje
+iro-nie{-}{e}{ë}n
+ge{-}{e}{ë}m-merd
+PvdA{-}{}{–}er
+tv{-}{}{–}loos
+scho-li{-}{e}{ë}n
+nu-tri{-}{e}{ë}nt
+ma{-}{i}{ï}s-koek
+las-s{o-}{}{oo}tje
+kom-m{a-}{}{aa}tje
+jum-b{o-}{}{oo}tje
+exe-qui{-}{e}{ë}n
+cou-p{é-}{}{ee}tje
+cor-vee{-}{e}{ë}r
+be{-}{i}{ï}nk-ten
+be{-}{e}{ë}r-ving
+an-dro{-}{i}{ï}-de
+Vo-gezi{-}{e}{ë}r
+Tsja-di{-}{e}{ë}r
+Tri{-}{e}{ë}s-ter
+Sil-ezi{-}{e}{ë}r
+Si-be-ri{-}{e}{ë}r
+PvdV{-}{}{–}er
+Ot-ta-wa{-}{e}{ë}r
+Oce-a-ni{-}{e}{ë}r
+Na-mi-bi{-}{e}{ë}r
+Mo-ra-vi{-}{e}{ë}r
+Ma-la-wi{-}{e}{ë}r
+Li-gu-ri{-}{e}{ë}r
+Hei-loo{-}{e}{ë}r
+Gui-nee{-}{e}{ë}r
+Goe-ree{-}{e}{ë}r
+Ge-nepi{-}{e}{ë}n
+Er-me-lo{-}{e}{ë}r
+Ca-na-ri{-}{e}{ë}r
+Al-me-lo{-}{e}{ë}r
+neu-ri{-}{e}{ë}nd
+NSB{-}{}{–}ers
+Ko-lo-ni{-}{e}{ë}n
+abc{-}{}{–}tje
+ge{-}{e}{ë}n-terd
+fir-m{a-}{}{aa}tje
+A4{-}{}{–}tjes
+hbo{-}{}{–}ers
+Ge-or-gi{-}{e}{ë}r
+Ma-ri{-}{e}{ë}l-le
+WAO{-}{}{–}ers
+CDA{-}{}{–}ers
+AOW{-}{}{–}ers
+EHBO{-}{}{–}er
+VVD{-}{}{–}ers
+sms{-}{}{–}jes
+sur-re{-}{e}{ë}-le
+tbs{-}{}{–}ers
+Ibe-ri{-}{e}{ë}rs
+jet-ski{-}{e}{ë}n
+ma{-}{i}{ï}s-olie
+Sa-oe-di{-}{e}{ë}r
+So-ma-li{-}{e}{ë}r
+Bos-ni{-}{e}{ë}rs
+kaf-ka{-}{e}{ë}sk
+olym-pi{-}{e}{ë}r
+vi-gi-li{-}{e}{ë}n
+snij-ma{-}{i}{ï}s
+tri-du{-}{u}{ü}ms
+uto-pie{-}{e}{ë}n
+va-ca-ti{-}{e}{ë}n
+va-ri{-}{e}{ë}-ren
+sur-re{-}{e}{ë}el
+taxa-ti{-}{e}{ë}n
+ma-o{-}{i}{ï}s-ten
+ste-ro{-}{i}{ï}-de
+sto{-}{i}{ï}-cijn
+sto{-}{i}{ï}-sche
+Ser-vi{-}{e}{ë}rs
+sfe-ro{-}{i}{ï}-de
+spa-ni{-}{e}{ë}ls
+scha-li{-}{e}{ë}n
+ru{-}{i}{ï}-ne-ren
+ru{-}{i}{ï}-neust
+ru{-}{i}{ï}-neu-ze
+re-ga-li{-}{e}{ë}n
+re-li-gi{-}{e}{ë}n
+roe-koe{-}{e}{ë}n
+rom-bo{-}{i}{ï}-de
+di-plo{-}{i}{ï}-de
+pe-ti-ti{-}{e}{ë}n
+pi{-}{e}{ë}-tis-me
+po{-}{e}{ë}-tisch
+prai-ri{-}{e}{ë}n
+pro-te{-}{i}{ï}-ne
+pro-za{-}{i}{ï}st
+al-ka-li{-}{e}{ë}n
+Ar-me-ni{-}{e}{ë}r
+do-mi-no{-}{e}{ë}n
+Gal-li{-}{e}{ë}rs
+mos-kee{-}{e}{ë}n
+mo-za{-}{i}{ï}sch
+ne-gro{-}{i}{ï}-de
+oc-ta{-}{e}{ë}-der
+Oe-kra{-}{i}{ï}-ne
+op-tree{-}{e}{ë}n
+ini-ti{-}{e}{ë}-le
+in-tu{-}{i}{ï}-tie
+Ira-ni{-}{e}{ë}rs
+la{-}{i}{ï}-cis-me
+ma{-}{i}{ï}s-kolf
+ma{-}{i}{ï}s-meel
+ma-te-ri{-}{e}{ë}n
+de-vi{-}{e}{ë}-ren
+di{-}{e}{ë}-tis-te
+ego{-}{i}{ï}s-ten
+ele-gie{-}{e}{ë}n
+epo-pee{-}{e}{ë}n
+fe-ca-li{-}{e}{ë}n
+fee{-}{e}{ë}-riek
+fee{-}{e}{ë}-ries
+fo-li{-}{e}{ë}-ren
+gan-gli{-}{e}{ë}n
+ge-drie{-}{e}{ë}n
+ge-dwee{-}{e}{ë}r
+ge{-}{e}{ë}rf-den
+ge-twee{-}{e}{ë}n
+gra-di{-}{e}{ë}nt
+ha-ci{-}{e}{ë}n-da
+He-bree{-}{e}{ë}n
+He-bree{-}{e}{ë}r
+he-ro{-}{i}{ï}e-ke
+he-ro{-}{i}{ï}sch
+he-ro{-}{i}{ï}s-me
+hexa{-}{e}{ë}-der
+ijs-zee{-}{e}{ë}n
+in-di-ci{-}{e}{ë}n
+cre{-}{e}{ë}er-de
+da-da{-}{i}{ï}s-me
+ci-bo-ri{-}{e}{ë}n
+cof-fe{-}{i}{ï}-ne
+co{-}{i}{ï}-te-ren
+col-lo{-}{i}{ï}-de
+ar-te-ri{-}{e}{ë}n
+athe{-}{i}{ï}s-me
+At-jee{-}{e}{ë}rs
+be{-}{e}{ë}di-gen
+Be-o-ti{-}{e}{ë}rs
+ha-de{-}{i}{ï}-cum
+Ara-mee{-}{e}{ë}r
+col-l{i-}{}{ie}tje
+Sa-u-di{-}{e}{ë}rs
+ge{-}{e}{ë}t-terd
+ge{-}{e}{ë}f-fend
+Mat-the{-}{u}{ü}s
+tro-pee{-}{e}{ë}n
+Ma-ri{-}{e}{ë}t-te
+usan-ti{-}{e}{ë}n
+par-ti{-}{e}{ë}-le
+al-li{-}{e}{ë}-ren
+qui{-}{e}{ë}-tist
+ca-vi-{a-}{}{aa}tje
+ba-ha{-}{i}{ï}s-me
+Ar-te-si{-}{e}{ë}r
+mi-cr{o-}{}{oo}tje
+he-bra{-}{i}{ï}-ca
+Ca-ra{-}{i}{ï}-ben
+PvdD{-}{}{–}er
+gla-c{é-}{}{ee}tje
+cell{o-}{}{oo}tje
+cy-clo{-}{i}{ï}-de
+dra-m{a-}{}{aa}tje
+cor-vee{-}{e}{ë}n
+Ha-ri{-}{e}{ë}t-te
+pa-ri-{a-}{}{aa}tje
+ge{-}{e}{ë}chood
+ma{-}{i}{ï}s-land
+Ha{-}{i}{ï}-ti-aan
+Da-ni{-}{e}{ë}l-le
+pap-p{a-}{}{aa}tje
+jet-ski{-}{e}{ë}r
+ma{-}{i}{ï}s-veld
+tra-vee{-}{e}{ë}n
+he-bra{-}{i}{ï}st
+ze-br{a-}{}{aa}tje
+vil-l{a-}{}{aa}tje
+vi-de-{o-}{}{oo}tje
+tre-m{a-}{}{aa}tje
+to-k{o-}{}{oo}tjes
+to-g{a-}{}{aa}tjes
+the-m{a-}{}{aa}tje
+ta-toe{-}{e}{ë}er
+so-l{o-}{}{oo}tjes
+so-f{a-}{}{aa}tjes
+smeu{-}{i}{ï}gst
+ru{-}{i}{ï}-neert
+re-ç{u-}{}{uu}tje
+pol-k{a-}{}{aa}tje
+poe-m{a-}{}{aa}tje
+pin-d{a-}{}{aa}tje
+pi-a-n{o-}{}{oo}tje
+pa-p{a-}{}{aa}tjes
+ope-r{a-}{}{aa}tje
+no-t{a-}{}{aa}tjes
+me-m{o-}{}{oo}tjes
+ka-n{o-}{}{oo}tjes
+jo-j{o-}{}{oo}tjes
+in-ge{-}{e}{ë}rfd
+fu-g{a-}{}{aa}tjes
+ech{o-}{}{oo}tjes
+ca-f{é-}{}{ee}tjes
+cac-tee{-}{e}{ë}n
+be{-}{e}{ë}rf-den
+alo{-}{e}{ë}–s
+af-ge{-}{e}{ë}ist
+ac-c{u-}{}{uu}tjes
+be{-}{e}{ë}in-dig
+PSV{-}{}{–}ers
+lo-g{é-}{}{ee}tjes
+ki-l{o-}{}{oo}tjes
+SGP{-}{}{–}ers
+bv{-}{}{–}tjes
+mbo{-}{}{–}ers
+me-n{u-}{}{uu}tjes
+tri-{o-}{}{oo}tjes
+D66{-}{}{–}ers
+op-ge{-}{e}{ë}ist
+weg-ge{-}{e}{ë}bd
+ge{-}{u}{ü}p-load
+smeu{-}{i}{ï}ger
+aard-oli{-}{e}{ë}n
+atro-fie{-}{e}{ë}n
+in-sig-ni{-}{e}{ë}n
+hy-gi{-}{e}{ë}-nist
+ca-me-r{a-}{}{aa}tje
+be{-}{i}{ï}n-vloed
+va-ri{-}{e}{ë}-teit
+the-o-rie{-}{e}{ë}n
+spa-ti{-}{e}{ë}-ren
+so-ci{-}{e}{ë}-teit
+pa-ti{-}{e}{ë}n-tie
+pa-ti{-}{e}{ë}n-ten
+pa-ro-chi{-}{e}{ë}n
+of-fi-ci{-}{e}{ë}-le
+me-lo-die{-}{e}{ë}n
+ma-te-ri{-}{e}{ë}-le
+ju-di-ci{-}{e}{ë}-le
+je-zu{-}{i}{ï}e-ten
+in-tu{-}{i}{ï}-tief
+ge{-}{e}{ë}i-gen-de
+ga-le-rie{-}{e}{ë}n
+fi-nan-ci{-}{e}{ë}n
+ef-fi-ci{-}{e}{ë}nt
+con-ci{-}{e}{ë}r-ge
+com-mu-ni{-}{e}{ë}n
+ca-lo-rie{-}{e}{ë}n
+bac-te-ri{-}{e}{ë}n
+au-di{-}{e}{ë}n-tie
+aca-de-mi{-}{e}{ë}n
+pa-ti{-}{e}{ë}n-tje
+agra-ri{-}{e}{ë}rs
+ali{-}{e}{ë}-na-tie
+al-ka-lo{-}{i}{ï}-de
+al-tru{-}{i}{ï}s-me
+am-fi-bie{-}{e}{ë}n
+an-nu{-}{i}{ï}-teit
+em-bo-lie{-}{e}{ë}n
+co{-}{i}{ï}-teer-de
+pon-ch{o-}{}{oo}tje
+plis-s{é-}{}{ee}tje
+sal-vi-{a-}{}{aa}tje
+pa-pa-j{a-}{}{aa}tje
+ma-ri-n{a-}{}{aa}tje
+yaht-zee{-}{e}{ë}n
+So-ma-li{-}{e}{ë}rs
+Ka-na{-}{a}{ä}-niet
+zalf-oli{-}{e}{ë}n
+tro-chee{-}{e}{ë}n
+tran-si{-}{e}{ë}nt
+si-nus-o{-}{i}{ï}-de
+prul-po{-}{e}{ë}et
+po-ny{-}{}{–}tje
+ki-mo-n{o-}{}{oo}tje
+ex-po-s{é-}{}{ee}tje
+eva-cu{é-}{}{ee}tje
+cli-ch{é-}{}{ee}tje
+bi-ki-n{i-}{}{ie}tje
+ali{-}{e}{ë}-neert
+agen-d{a-}{}{aa}tje
+aan-ge{-}{e}{ë}rfd
+Mal-di-vi{-}{e}{ë}r
+Hen-ge-lo{-}{e}{ë}r
+Ha{-}{i}{ï}-ti-aans
+Ca-la-bri{-}{e}{ë}r
+Bree{-}{e}{ë}-naar
+vuur-zee{-}{e}{ë}n
+pa-ti{-}{e}{ë}n-tes
+Eritree{-}{e}{ë}r
+mys-te-ri{-}{e}{ë}n
+Py-re-nee{-}{e}{ë}n
+Hen-ri{-}{e}{ë}t-te
+Oek-ra{-}{i}{ï}-ner
+Ethio-pi{-}{e}{ë}r
+be{-}{e}{ë}in-digd
+idee{-}{e}{ë}n-man
+Sa-oe-di{-}{e}{ë}rs
+ha-wa{-}{i}{ï}hemd
+Jor-da-ni{-}{e}{ë}r
+Eu-ro-pee{-}{e}{ë}r
+fa-ri-zee{-}{e}{ë}n
+ar-te-ri{-}{e}{ë}-le
+kaf-ka{-}{e}{ë}s-ke
+verf-oli{-}{e}{ë}n
+jet-ski{-}{e}{ë}rs
+idee{-}{e}{ë}-loos
+wee{-}{i}{ï}g-heid
+ma{-}{i}{ï}s-plant
+te-tra{-}{e}{ë}-der
+ti{-}{e}{ë}r-ce-ren
+tra-chee{-}{e}{ë}n
+tra-ge-di{-}{e}{ë}n
+tri{-}{e}{ë}n-na-le
+twee{-}{e}{ë}r-lei
+uni-ta-ri{-}{e}{ë}r
+su{-}{i}{ï}-ci-daal
+su{-}{i}{ï}-ci-da-le
+ta-toe{-}{e}{ë}-ren
+ste-ro{-}{i}{ï}-den
+sto{-}{i}{ï}-cijns
+sto{-}{i}{ï}-cis-me
+idee{-}{e}{ë}-lo-ze
+schi-zo{-}{i}{ï}-de
+sek-ta-ri{-}{e}{ë}r
+sfe-ro{-}{i}{ï}-den
+sham-poo{-}{e}{ë}n
+si-tu-a-ti{-}{e}{ë}n
+slag-zee{-}{e}{ë}n
+so-le-no{-}{i}{ï}-de
+spo-li{-}{e}{ë}-ren
+spon-dee{-}{e}{ë}n
+ru{-}{i}{ï}-neer-de
+re{-}{u}{ü}-nis-ten
+re{-}{u}{ü}s-se-ren
+rom-bo{-}{i}{ï}-den
+pa-tri-ci{-}{e}{ë}r
+pen-ta{-}{e}{ë}-der
+pers-wee{-}{e}{ë}n
+pi{-}{e}{ë}-de-stal
+pla-gi{-}{e}{ë}-ren
+po{-}{e}{ë}tas-ter
+po{-}{e}{ë}ti-caal
+po{-}{e}{ë}-ti-sche
+po-li-ti{-}{e}{ë}-le
+pool-zee{-}{e}{ë}n
+pre-fa-ti{-}{e}{ë}n
+pro-te{-}{i}{ï}-nen
+pro-to-zo{-}{e}{ë}n
+pro-to-zo{-}{o}{ö}n
+pro-za{-}{i}{ï}sch
+qui{-}{e}{ë}-tis-me
+rand-zee{-}{e}{ë}n
+re-cep-ti{-}{e}{ë}n
+re-ci-pi{-}{e}{ë}nt
+re-cre{-}{e}{ë}-ren
+Ar-me-ni{-}{e}{ë}rs
+pa-ra-no{-}{i}{ï}de
+pa-ro-die{-}{e}{ë}n
+mo-za{-}{i}{ï}e-ken
+mo-za{-}{i}{ï}-sche
+na{-}{i}{ï}-ve-teit
+na{-}{i}{ï}-vi-teit
+na-zi-ree{-}{e}{ë}r
+ni{-}{e}{ë}l-le-ren
+no-ta-ri{-}{e}{ë}-le
+oc-ta{-}{e}{ë}-ders
+odys-see{-}{e}{ë}n
+Oe-kra{-}{i}{ï}ens
+on-be{-}{e}{ë}digd
+opi-ni{-}{e}{ë}-ren
+ori{-}{e}{ë}n-taal
+ou-bli{-}{e}{ë}t-te
+pa-leo-zo{-}{e}{ë}n
+pa-na-cee{-}{e}{ë}n
+pan-the{-}{i}{ï}st
+ini-ti{-}{e}{ë}-ren
+in-tro{-}{i}{ï}-tus
+in-tu{-}{i}{ï}-ties
+Is-ra{-}{e}{ë}-liet
+jin-go{-}{i}{ï}s-me
+li-ta-nie{-}{e}{ë}n
+ma{-}{i}{ï}s-oogst
+Ma-lei-si{-}{e}{ë}r
+ma-ni{-}{e}{ë}-rist
+me-di{-}{e}{ë}-vist
+di{-}{e}{ë}-tis-ten
+di{-}{e}{ë}-tis-tes
+dou-a-rie{-}{e}{ë}n
+drie{-}{e}{ë}r-lei
+ele-va-ti{-}{e}{ë}n
+en-de-mie{-}{e}{ë}n
+ener-gie{-}{e}{ë}n
+ex-pe-di{-}{e}{ë}nt
+fa-ri-zee{-}{e}{ë}r
+fee{-}{e}{ë}-rie-ke
+fun-da-ti{-}{e}{ë}n
+ge{-}{u}{ü}ni-eerd
+glo-ri{-}{e}{ë}-ren
+gra-ti{-}{e}{ë}-ren
+haar-oli{-}{e}{ë}n
+he-bra{-}{i}{ï}s-me
+He-bree{-}{e}{ë}rs
+Hel-ve-ti{-}{e}{ë}r
+he-re-sie{-}{e}{ë}n
+he-ro{-}{i}{ï}-sche
+hexa{-}{e}{ë}-ders
+his-to-ri{-}{e}{ë}n
+ho-bo{-}{i}{ï}s-ten
+ho-mi-lie{-}{e}{ë}n
+idee{-}{e}{ë}n-bus
+con-ti-nu{-}{u}{ü}m
+co{-}{o}{ö}p-ta-tie
+co{-}{o}{ö}p-te-ren
+co-ry-fee{-}{e}{ë}n
+co-te-rie{-}{e}{ë}n
+da-da{-}{i}{ï}s-ten
+dag-le-li{-}{e}{ë}n
+dal-ma-ti{-}{e}{ë}r
+de-fi-ci{-}{e}{ë}nt
+bron-chi{-}{e}{ë}n
+Chal-dee{-}{e}{ë}n
+Chal-dee{-}{e}{ë}r
+cli{-}{e}{ë}n-teel
+col-lo{-}{i}{ï}-den
+con-ci-li{-}{e}{ë}n
+con-di-ti{-}{e}{ë}n
+ar-cha{-}{i}{ï}sch
+ar-cha{-}{i}{ï}s-me
+as-te-ro{-}{i}{ï}-de
+athe{-}{i}{ï}s-ten
+aus-pi-ci{-}{e}{ë}n
+ba-ro-nie{-}{e}{ë}n
+be{-}{e}{ë}di-ging
+bob-slee{-}{e}{ë}n
+ma{-}{i}{ï}s-brood
+EHBO{-}{}{–}ers
+mo-no-die{-}{e}{ë}n
+tai-chi{-}{e}{ë}n
+Pa-poe-{a-}{}{aa}tje
+high-tea{-}{e}{ë}n
+Ma-ri{-}{e}{ë}n-bad
+vm-bo{-}{}{–}ers
+va-cu{-}{u}{ü}m-pan
+Jak-ar-ta{-}{e}{ë}r
+fee{-}{e}{ë}n-land
+ali{-}{e}{ë}-ne-ren
+co{-}{o}{ö}-pe-rant
+diep-zee{-}{e}{ë}n
+Kauk-asi{-}{e}{ë}r
+ge{-}{e}{ë}in-digd
+fre-si-{a-}{}{aa}tje
+ar-cha{-}{i}{ï}-cum
+Sar-di-ni{-}{e}{ë}r
+bis-tr{o-}{}{oo}tje
+bob-slee{-}{e}{ë}r
+bo-le-r{o-}{}{oo}tje
+Pi-car-di{-}{e}{ë}r
+co-mi-t{é-}{}{ee}tje
+PvdA{-}{}{–}ers
+Mon-go-li{-}{e}{ë}r
+cor-vee{-}{e}{ë}rs
+Py-re-nee{-}{e}{ë}r
+ca-na-p{é-}{}{ee}tje
+ca-su{-}{i}{ï}s-ten
+ce-ta-cee{-}{e}{ë}n
+cu-pi-d{o-}{}{oo}tje
+cy-clo{-}{i}{ï}-den
+am-fo-r{a-}{}{aa}tje
+dy-na-m{o-}{}{oo}tje
+de-cen-ni{-}{e}{ë}n
+shin-to{-}{i}{ï}st
+ru{-}{i}{ï}-ne-stad
+fris-bee{-}{e}{ë}n
+ma-de-r{a-}{}{aa}tje
+ko-pi{-}{e}{ë}-ring
+di{-}{e}{ë}-te-tiek
+aca-ci-{a-}{}{aa}tje
+ma{-}{i}{ï}s-teelt
+Ana-to-li{-}{e}{ë}r
+be{-}{e}{ë}l-ze-bub
+li-do-ca{-}{i}{ï}-ne
+Mol-da-vi{-}{e}{ë}r
+ge-cre{-}{e}{ë}erd
+ma{-}{i}{ï}s-ak-ker
+ka{-}{i}{ï}ns-merk
+Ara-mee{-}{e}{ë}rs
+olym-pi{-}{e}{ë}rs
+zee-le-li{-}{e}{ë}n
+ze-br{a-}{}{aa}tjes
+zand-zee{-}{e}{ë}n
+vil-l{a-}{}{aa}tjes
+tre-m{a-}{}{aa}tjes
+the-m{a-}{}{aa}tjes
+ta-toe{-}{e}{ë}ert
+smeu{-}{i}{ï}g-ste
+smeu{-}{i}{ï}ge-re
+re-ç{u-}{}{uu}tjes
+re-su-m{é-}{}{ee}tje
+py-ja-m{a-}{}{aa}tje
+pol-k{a-}{}{aa}tjes
+poe-m{a-}{}{aa}tjes
+pin-d{a-}{}{aa}tjes
+pi-a-n{o-}{}{oo}tjes
+par-ti{-}{e}{ë}-ler
+pa-gi-n{a-}{}{aa}tje
+ori{-}{e}{ë}n-teer
+ope-r{a-}{}{aa}tjes
+ko-pi{-}{e}{ë}er-de
+kom-m{a-}{}{aa}tjes
+jum-b{o-}{}{oo}tjes
+gs-m{-}{}{–}etje
+ge{-}{u}{ü}p-loade
+ge{-}{e}{ë}n-ter-de
+ge{-}{e}{ë}f-fen-de
+fir-m{a-}{}{aa}tjes
+dra-m{a-}{}{aa}tjes
+cou-p{é-}{}{ee}tjes
+be{-}{e}{ë}dig-den
+bed-stee{-}{e}{ë}n
+aza-le-{a-}{}{aa}tje
+PvdV{-}{}{–}ers
+PvdD{-}{}{–}ers
+sche-m{a-}{}{aa}tje
+weg-ge{-}{e}{ë}b-de
+ra-di-{o-}{}{oo}tjes
+co{-}{o}{ö}p-teert
+cre{-}{e}{ë}er-den
+pro-te{-}{i}{ï}-nes
+op-ge{-}{e}{ë}is-te
+stu-di-{o-}{}{oo}tje
+ge{-}{e}{ë}r-ger-de
+ri-si-c{o-}{}{oo}tje
+ba-by{-}{}{–}tje
+ex-tr{a-}{}{aa}tjes
+be{-}{e}{ë}in-digt
+va-ri{-}{e}{ë}-rend
+ru{-}{i}{ï}-neu-zer
+ge{-}{u}{ü}p-da-tet
+ac-tu-a-ri{-}{e}{ë}-le
+abi-tu-ri{-}{e}{ë}nt
+an-tro-po{-}{i}{ï}-de
+souf-fl{é-}{}{ee}tje
+im-mo-bi-li{-}{e}{ë}n
+hy-gi{-}{e}{ë}-nis-te
+hy-gi{-}{e}{ë}-nisch
+ge-cre{-}{e}{ë}er-de
+ge{-}{e}{ë}-ve-naard
+de-fi-ni{-}{e}{ë}-ren
+Po-ly-ne-si{-}{e}{ë}r
+em-ploy{é-}{}{ee}tje
+the-ra-pie{-}{e}{ë}n
+the{-}{i}{ï}s-tisch
+suf-fi-ci{-}{e}{ë}nt
+spa-ti{-}{e}{ë}-ring
+re-li-kwie{-}{e}{ë}n
+quo-ti{-}{e}{ë}n-ten
+pro-vin-ci{-}{e}{ë}n
+pa-tri-ci{-}{e}{ë}rs
+ori{-}{e}{ë}n-te-ren
+ori{-}{e}{ë}n-ta-tie
+on-der-zee{-}{e}{ë}r
+mo-no-po-li{-}{e}{ë}n
+in-tu{-}{i}{ï}-tie-ve
+in-gre-di{-}{e}{ë}nt
+ge{-}{i}{ï}so-leerd
+fi-nan-ci{-}{e}{ë}-le
+fan-ta-sie{-}{e}{ë}n
+es-sen-ti{-}{e}{ë}-le
+epi-de-mie{-}{e}{ë}n
+ef-fi-ci{-}{e}{ë}n-te
+eco-no-mie{-}{e}{ë}n
+co{-}{o}{ö}r-di-naat
+co{-}{o}{ö}-pe-ra-tie
+con-ve-ni{-}{e}{ë}nt
+ce-re-mo-ni{-}{e}{ë}n
+ca-su{-}{i}{ï}s-tiek
+be-doe{-}{i}{ï}e-nen
+bac-te-ri{-}{e}{ë}-le
+as-te-ro{-}{i}{ï}-den
+al-ler-gie{-}{e}{ë}n
+af-fi-li{-}{e}{ë}-ren
+ali{-}{e}{ë}-na-ties
+al-ka-lo{-}{i}{ï}-den
+al-tru{-}{i}{ï}s-ten
+am-nes-tie{-}{e}{ë}n
+ana-lo-gie{-}{e}{ë}n
+ano-ma-lie{-}{e}{ë}n
+Is-ra{-}{e}{ë}-lisch
+to-ver-fee{-}{e}{ë}n
+dwars-zee{-}{e}{ë}n
+trap-tree{-}{e}{ë}n
+op-ge-vree{-}{e}{ë}n
+hand-knie{-}{e}{ë}n
+si{-}{e}{ë}r-ra–s
+ha-bi-tu-{é-}{}{ee}tje
+ME-pa-ti{-}{e}{ë}nt
+tran-si{-}{e}{ë}n-te
+tand-ca-ri{-}{e}{ë}s
+spo-ran-gi{-}{e}{ë}n
+rê-ve-rie{-}{e}{ë}n
+prik-slee{-}{e}{ë}n
+po-ly-the{-}{i}{ï}st
+mo-no-the{-}{i}{ï}st
+ma-don-n{a-}{}{aa}tje
+kern-idee{-}{e}{ë}n
+gsm{-}{}{–}etjes
+gra-mi-nee{-}{e}{ë}n
+ex-pa-ti{-}{e}{ë}nt
+di-a-bo-l{o-}{}{oo}tje
+cor-ti-co{-}{i}{ï}-de
+con-chy-li{-}{e}{ë}n
+capsa{-}{i}{ï}-ci-ne
+al-ge-bra{-}{i}{ï}st
+Me-la-ne-si{-}{e}{ë}r
+Ma-tâ{-}{}{–}u-tu
+Lom-bar-di{-}{e}{ë}r
+Ka{-}{i}{ï}-ro-tisch
+Karin-thi{-}{e}{ë}r
+En-sche-de{-}{e}{ë}r
+Cu-ra-çao{-}{e}{ë}r
+Ca{-}{i}{ï}-ro-tisch
+Bel-gra-do{-}{e}{ë}r
+ge{-}{e}{ë}ro-deerd
+Ethio-pi{-}{e}{ë}rs
+dy-nas-tie{-}{e}{ë}n
+of-fi-ci{-}{e}{ë}-ren
+Hi{-}{e}{ë}-ro-ny-mus
+nu-tri{-}{e}{ë}n-ten
+ge{-}{e}{ë}ta-leerd
+ma{-}{i}{ï}s-kor-rel
+smeu{-}{i}{ï}g-heid
+re-cre{-}{e}{ë}er-de
+idee{-}{e}{ë}n-leer
+pi{-}{e}{ë}-zo-me-ter
+ma{-}{i}{ï}s-kip-pen
+va-cu{-}{u}{ü}m-glas
+va-cu{-}{u}{ü}m-buis
+Ma-lei-si{-}{e}{ë}rs
+Jor-da-ni{-}{e}{ë}rs
+sad-du-cee{-}{e}{ë}r
+apo-lo-gie{-}{e}{ë}n
+dal-ma-ti{-}{e}{ë}rs
+wa-ter-ski{-}{e}{ë}n
+wa-ter-ski{-}{e}{ë}r
+weeg-bree{-}{e}{ë}n
+ve-ge-ta-ri{-}{e}{ë}r
+ve-ri-fi{-}{e}{ë}-ren
+vic-tu-a-li{-}{e}{ë}n
+temp-ta-ti{-}{e}{ë}n
+te-tra{-}{e}{ë}-ders
+ti{-}{e}{ë}r-ceer-de
+ti{-}{e}{ë}r-ce-ring
+ti-ran-nie{-}{e}{ë}n
+tra-pe-zo{-}{i}{ï}-de
+tri-lo-gie{-}{e}{ë}n
+tro-che{-}{i}{ï}sch
+twee{-}{e}{ë}n-half
+uni-ta-ri{-}{e}{ë}rs
+va-cu{-}{u}{ü}m-lamp
+va-cu{-}{u}{ü}m-pomp
+vak-stu-di{-}{e}{ë}n
+sub-si-di{-}{e}{ë}nt
+sup-pli{-}{e}{ë}-ren
+ta-o{-}{i}{ï}s-tisch
+ta-toe{-}{e}{ë}er-de
+ta-toe{-}{e}{ë}-ring
+sto{-}{i}{ï}-cij-nen
+sto{-}{i}{ï}-cijn-se
+stook-oli{-}{e}{ë}n
+stort-zee{-}{e}{ë}n
+sci{-}{e}{ë}n-tis-me
+sek-ta-ri{-}{e}{ë}rs
+sen-ten-ti{-}{e}{ë}n
+ses-ter-ti{-}{e}{ë}n
+sfe-ro{-}{i}{ï}-daal
+sfe-ro{-}{i}{ï}-da-le
+shin-to{-}{i}{ï}s-me
+so-le-no{-}{i}{ï}-des
+spon-de{-}{i}{ï}sch
+fa-ri-zee{-}{e}{ë}rs
+sca-ra-bee{-}{e}{ë}n
+bob-slee{-}{e}{ë}rs
+sa-la-ri{-}{e}{ë}ren
+sa-tra-pie{-}{e}{ë}n
+re-li{-}{e}{ë}f-druk
+re-me-di{-}{e}{ë}-ren
+reu-ma-to{-}{i}{ï}-de
+re{-}{u}{ü}s-seer-de
+bar-be-cue{-}{e}{ë}n
+ce-no-zo{-}{i}{ï}-cum
+pen-ta{-}{e}{ë}-ders
+per-cep-ti{-}{e}{ë}n
+pla-ne-to{-}{i}{ï}-de
+po{-}{e}{ë}-tas-ters
+po{-}{e}{ë}-ti-se-ren
+pol-le-vie{-}{e}{ë}n
+pro-fe-tie{-}{e}{ë}n
+pro-py-lee{-}{e}{ë}n
+pro-za{-}{i}{ï}-sche
+pro-za{-}{i}{ï}s-ten
+pru-de-rie{-}{e}{ë}n
+rap-so-die{-}{e}{ë}n
+re-bel-lie{-}{e}{ë}n
+re-ci-pi{-}{e}{ë}-ren
+pas-to-rie{-}{e}{ë}n
+pa-ra-no{-}{i}{ï}-cus
+pa-ro-chi{-}{e}{ë}-le
+pa-ro-di{-}{e}{ë}-ren
+mon-go-lo{-}{i}{ï}-de
+na{-}{i}{ï}e-ve-ling
+na-zi-ree{-}{e}{ë}rs
+ne-go-ti{-}{e}{ë}-ren
+ni{-}{e}{ë}l-leer-de
+obe-di{-}{e}{ë}n-tie
+on-be{-}{e}{ë}dig-de
+opi-ni{-}{e}{ë}-rend
+or-chi-dee{-}{e}{ë}n
+ori{-}{e}{ë}n-taals
+ou-bli{-}{e}{ë}t-ten
+pan-de-mie{-}{e}{ë}n
+pan-the{-}{i}{ï}s-me
+In-do-ne-si{-}{e}{ë}r
+in-spec-ti{-}{e}{ë}n
+in-spi-ci{-}{e}{ë}nt
+ja-loe-zie{-}{e}{ë}n
+je-re-mi{-}{e}{ë}-ren
+je-zu{-}{i}{ï}-tisch
+je-zu{-}{i}{ï}-tis-me
+kor-rel-ma{-}{i}{ï}s
+la{-}{i}{ï}-ci-se-ren
+lin-ge-rie{-}{e}{ë}n
+lin-gu{-}{i}{ï}s-ten
+li-tur-gie{-}{e}{ë}n
+ma{-}{i}{ï}s-kol-ven
+ma{-}{i}{ï}s-vel-den
+ma-ni-chee{-}{e}{ë}r
+ma-ni{-}{e}{ë}-ris-me
+ma-o{-}{i}{ï}s-tisch
+ma-te-ri{-}{e}{ë}-ler
+me-di-ta-ti{-}{e}{ë}n
+me-tal-lo{-}{i}{ï}-de
+dia-co-nie{-}{e}{ë}n
+dia-to-mee{-}{e}{ë}n
+di-op-trie{-}{e}{ë}n
+do-de-ca{-}{e}{ë}-der
+do-mi-ci-li{-}{e}{ë}n
+dra-pe-rie{-}{e}{ë}n
+du{-}{u}{ü}m-vi-raat
+ego{-}{i}{ï}s-tisch
+el-lip-so{-}{i}{ï}-de
+evan-ge-li{-}{e}{ë}n
+even-knie{-}{e}{ë}n
+exer-ci-ti{-}{e}{ë}n
+ex-pe-di{-}{e}{ë}-ren
+fa-ri-ze{-}{i}{ï}sch
+fa-ri-ze{-}{i}{ï}s-me
+fox-ter-ri{-}{e}{ë}r
+ge-ni-ta-li{-}{e}{ë}n
+ge-ru{-}{i}{ï}-neerd
+ge{-}{u}{ü}ni-eer-de
+gra-di{-}{e}{ë}n-ten
+grond-zee{-}{e}{ë}n
+har-mo-nie{-}{e}{ë}n
+he-bra{-}{i}{ï}s-men
+Hel-ve-ti{-}{e}{ë}rs
+hi{-}{e}{ë}-rar-chie
+hi{-}{e}{ë}-ra-tisch
+hi{-}{e}{ë}-ro-glief
+hi{-}{e}{ë}-ro-gly-fe
+hin-doe{-}{i}{ï}s-me
+hoog-ge{-}{e}{ë}erd
+co{-}{o}{ö}-pe-ra-tor
+co{-}{o}{ö}-pe-re-ren
+co{-}{o}{ö}p-teer-de
+de-fi-ci{-}{e}{ë}n-te
+bul-ter-ri{-}{e}{ë}r
+cau-se-rie{-}{e}{ë}n
+Chal-dee{-}{e}{ë}rs
+col-lo{-}{i}{ï}-daal
+col-lo{-}{i}{ï}-da-le
+con-ci{-}{e}{ë}r-ges
+ar-cha{-}{i}{ï}-sche
+ar-cha{-}{i}{ï}s-men
+as-so-ci{-}{e}{ë}-ren
+atro-fi{-}{e}{ë}-ren
+au-di{-}{e}{ë}n-ties
+Au-stra-li{-}{e}{ë}r
+bas-re-li{-}{e}{ë}f
+be{-}{e}{ë}in-dig-de
+be{-}{e}{ë}in-di-gen
+be-ne-fi-ci{-}{e}{ë}n
+qui{-}{e}{ë}-tis-ten
+Ki-ri-ba-ti{-}{e}{ë}r
+loem-pi-{a-}{}{aa}tje
+ne-gli-g{é-}{}{ee}tje
+ge{-}{i}{ï}n-ter-net
+me-so-zo{-}{i}{ï}-cum
+ge{-}{e}{ë}-vo-ceerd
+Ca-ra{-}{i}{ï}-bisch
+jus-ti-ti{-}{e}{ë}-le
+Ven-lo{-}{e}{ë}-naar
+re-fu-gi-{é-}{}{ee}tje
+ge{-}{i}{ï}-mi-teerd
+mi-cro-bi{-}{e}{ë}-le
+Bre-da{-}{e}{ë}-naar
+Bree{-}{e}{ë}r-naar
+sar-co{-}{i}{ï}-do-se
+Can-ta-bri{-}{e}{ë}r
+ge{-}{e}{ë}pi-leerd
+drie{-}{e}{ë}n-half
+wa-ran-d{a-}{}{aa}tje
+droog-ski{-}{e}{ë}n
+Nor-man-di{-}{e}{ë}r
+as-so-ci{é-}{}{ee}tje
+pat-je-pee{-}{e}{ë}r
+San-tia-go{-}{e}{ë}r
+An-dal-us-i{-}{e}{ë}r
+re-pli-c{a-}{}{aa}tje
+Pa-ta-go-ni{-}{e}{ë}r
+klei-no-di{-}{e}{ë}n
+bra-de-rie{-}{e}{ë}n
+ca-me-li-{a-}{}{aa}tje
+Is-ra{-}{e}{ë}-li-er
+idee{-}{e}{ë}n-goed
+co{-}{i}{ï}n-ci-dent
+be-go-ni-{a-}{}{aa}tje
+Oe-kra{-}{i}{ï}en-se
+cel-lu-lo{-}{i}{ï}-de
+eet-ca-f{é-}{}{ee}tje
+Mon-go-li{-}{e}{ë}rs
+sad-du-cee{-}{e}{ë}n
+pin-gu{-}{i}{ï}n-tje
+ko-li-br{i-}{}{ie}tje
+gra-ti{-}{e}{ë}-ring
+Korin-thi{-}{e}{ë}r
+Hels-inki{-}{e}{ë}r
+at-ta-ch{é-}{}{ee}tje
+col-le-g{a-}{}{aa}tje
+par-ve-n{u-}{}{uu}tje
+di-plo-m{a-}{}{aa}tje
+At-lan-tee{-}{e}{ë}r
+pa-pri-k{a-}{}{aa}tje
+aan-ge{-}{e}{ë}rf-de
+An-tarc-ti{-}{e}{ë}r
+waan-idee{-}{e}{ë}n
+sym-fo-nie{-}{e}{ë}n
+ma{-}{i}{ï}s-ak-kers
+Ma-ce-do-ni{-}{e}{ë}r
+ka{-}{i}{ï}ns-te-ken
+ini-ti{-}{e}{ë}-ring
+woon-idee{-}{e}{ë}n
+ve-ran-d{a-}{}{aa}tje
+tre-mo-l{o-}{}{oo}tje
+tom-bo-l{a-}{}{aa}tje
+su{-}{i}{ï}-ci-deert
+stu-di-{o-}{}{oo}tjes
+smeer-oli{-}{e}{ë}n
+si{-}{e}{ë}s-ta–s
+sche-m{a-}{}{aa}tjes
+ru{-}{i}{ï}-neer-den
+py-ja-m{a-}{}{aa}tjes
+prul-po{-}{e}{ë}-ten
+pri-mu-l{a-}{}{aa}tje
+po{-}{e}{ë}-ti-seert
+pic-co-l{o-}{}{oo}tje
+per-go-l{a-}{}{aa}tje
+pa-ra-pl{u-}{}{uu}tje
+pa-gi-n{a-}{}{aa}tjes
+of-fi-ci{-}{e}{ë}-ler
+ma{-}{i}{ï}s-koe-ken
+ki-mo-n{o-}{}{oo}tjes
+ge{-}{u}{ü}ri-neerd
+ge{-}{i}{ï}-te-reerd
+ge{-}{e}{ë}-li-deerd
+fee{-}{e}{ë}-rie-ker
+eva-cu{é-}{}{ee}tjes
+do-mi-n{o-}{}{oo}tjes
+cu-pi-d{o-}{}{oo}tjes
+co{-}{o}{ö}r-di-neer
+co-mit{é-}{}{ee}tjes
+cli-ch{é-}{}{ee}tjes
+ca-na-p{é-}{}{ee}tjes
+bo-le-r{o-}{}{oo}tjes
+agen-d{a-}{}{aa}tjes
+af-ge-vree{-}{e}{ë}n
+over-ge{-}{e}{ë}rfd
+ini-ti{-}{e}{ë}-rend
+ori{-}{e}{ë}n-teert
+sec-tori{-}{e}{ë}-le
+pas-fo-t{o-}{}{oo}tje
+be{-}{i}{ï}n-vloedt
+ca-me-r{a-}{}{aa}tjes
+ge{-}{e}{ë}in-dig-de
+va-ri{-}{e}{ë}-ren-de
+pro-te-g{é-}{}{ee}tje
+pro-ce-d{é-}{}{ee}tje
+po-ten-ti{-}{e}{ë}-le
+po{-}{e}{ë}-ti-scher
+pi{-}{e}{ë}-de-stals
+ge{-}{u}{ü}p-gra-ded
+ab-sen-te{-}{i}{ï}s-me
+acro-ba-tie{-}{e}{ë}n
+ap-pre-ci{-}{e}{ë}-ren
+ge{-}{e}{ë}s-say-eerd
+co{-}{o}{ö}-pe-reer-de
+pro-le-ta-ri{-}{e}{ë}r
+gips-ko-pie{-}{e}{ë}n
+al-ge-bra{-}{i}{ï}sch
+al-le-go-rie{-}{e}{ë}n
+al-pi-ne-ski{-}{e}{ë}n
+am-bi-gu{-}{i}{ï}-teit
+ge{-}{e}{ë}-ve-naar-de
+hy-gi{-}{e}{ë}-nis-ten
+hy-gi{-}{e}{ë}-ni-sche
+sym-pa-thie{-}{e}{ë}n
+pre-di-ca-ti{-}{e}{ë}n
+ve-ge-ta-ri{-}{e}{ë}rs
+va-ri{-}{e}{ë}-tei-ten
+the{-}{i}{ï}s-ti-sche
+stra-te-gie{-}{e}{ë}n
+so-ci{-}{e}{ë}-tei-ten
+ori{-}{e}{ë}n-te-ring
+ori{-}{e}{ë}n-teer-de
+ori{-}{e}{ë}n-ta-ties
+on-der-zee{-}{e}{ë}rs
+lin-gu{-}{i}{ï}s-tiek
+in-dus-tri{-}{e}{ë}-le
+in-dus-trie{-}{e}{ë}n
+har-mo-ni{-}{e}{ë}-ren
+ge{-}{i}{ï}r-ri-teerd
+ge{-}{e}{ë}n-ga-geerd
+fi-lo-so-fie{-}{e}{ë}n
+ef-fi-ci{-}{e}{ë}n-tie
+de-fi-ni{-}{e}{ë}-ring
+de-fi-ci{-}{e}{ë}n-tie
+co{-}{o}{ö}r-di-na-tor
+co{-}{o}{ö}r-di-na-tie
+co{-}{o}{ö}r-di-na-ten
+co{-}{o}{ö}-pe-ra-ties
+co{-}{o}{ö}-pe-ra-tief
+com-pag-nie{-}{e}{ë}n
+com-mer-ci{-}{e}{ë}-le
+che-mi-ca-li{-}{e}{ë}n
+ca-te-go-rie{-}{e}{ë}n
+be{-}{e}{ë}in-di-ging
+an-nu{-}{i}{ï}-tei-ten
+Is-ra{-}{e}{ë}-li-sche
+fla-min-g{o-}{}{oo}tje
+com-pri-m{é-}{}{ee}tje
+baan-ca-f{é-}{}{ee}tje
+mag-no-li-{a-}{}{aa}tje
+maag-pa-ti{-}{e}{ë}nt
+tri-bu-la-ti{-}{e}{ë}n
+tem-po-ra-li{-}{e}{ë}n
+bio-gra-fie{-}{e}{ë}n
+com-man-d{o-}{}{oo}tje
+su{-}{i}{ï}-ci-de-plan
+na{-}{i}{ï}-vi-tei-ten
+ma{-}{i}{ï}s-ver-bouw
+lust-pri{-}{e}{ë}-len
+ka-pe-la-nie{-}{e}{ë}n
+hi{-}{e}{ë}-ro-gly-fen
+he-ro{-}{i}{ï}-ne-ba-by
+ge-ni{-}{e}{ë}l-leerd
+fee{-}{e}{ë}n-han-den
+ex-pa-ti{-}{e}{ë}n-te
+bots-au-t{o-}{}{oo}tje
+ar-ren-slee{-}{e}{ë}n
+al-pi-ne-ski{-}{e}{ë}r
+af-spa-ti{-}{e}{ë}-ren
+Mi-cro-ne-si{-}{e}{ë}r
+Bar-to-lo-me{-}{u}{ü}s
+ge{-}{e}{ë}xer-ceerd
+ge{-}{e}{ë}-mul-geerd
+ge{-}{i}{ï}n-du-ceerd
+hy-gi{-}{e}{ë}-ne-co-de
+ge{-}{i}{ï}n-un-deerd
+ge{-}{e}{ë}-ner-veerd
+ge{-}{e}{ë}-mi-greerd
+ge{-}{e}{ë}x-cu-seerd
+Is-ra{-}{e}{ë}-li-ers
+ge{-}{e}{ë}-va-cu-eerd
+men-sen-zee{-}{e}{ë}n
+pat-je-pee{-}{e}{ë}rs
+va-cu{-}{u}{ü}m-ka-mer
+he-ro{-}{i}{ï}-ne-lijn
+he-ro{-}{i}{ï}-ne-hoer
+ma-ni{-}{e}{ë}-ris-ten
+Ma-ce-do-ni{-}{e}{ë}rs
+pa-leo-zo{-}{i}{ï}-cum
+shin-to{-}{i}{ï}s-ten
+aids-pa-ti{-}{e}{ë}nt
+voor-stu-di{-}{e}{ë}n
+wa-ter-le-li{-}{e}{ë}n
+wee{-}{e}{ë}n-rem-mer
+we-reld-zee{-}{e}{ë}n
+ma{-}{i}{ï}s-plan-ten
+the-sau-rie{-}{e}{ë}n
+trans-ac-ti{-}{e}{ë}n
+tra-pe-zo{-}{i}{ï}-den
+tra-ves-tie{-}{e}{ë}n
+tri-ar-chie{-}{e}{ë}n
+tro-che{-}{i}{ï}-sche
+twee{-}{e}{ë}r-han-de
+va-cu{-}{u}{ü}m-me-ter
+sub-si-di{-}{e}{ë}-ren
+taal-stu-di{-}{e}{ë}n
+tan-gen-ti{-}{e}{ë}-le
+ta-toe{-}{e}{ë}er-der
+ta-o{-}{i}{ï}s-ti-sche
+se-quen-ti{-}{e}{ë}-le
+sol-fe-gi{-}{e}{ë}-ren
+sot-ter-nie{-}{e}{ë}n
+spon-de{-}{i}{ï}sche
+twee{-}{e}{ë}n-hal-ve
+on-of-fi-ci{-}{e}{ë}-le
+taxo-no-mie{-}{e}{ë}n
+sa-cri-fi-ci{-}{e}{ë}n
+sa-cri-fi{-}{e}{ë}-ren
+sa-cris-tie{-}{e}{ë}n
+sa-la-ri{-}{e}{ë}ring
+sa-tur-na-li{-}{e}{ë}n
+re-fe-ren-ti{-}{e}{ë}n
+re-li{-}{e}{ë}f-kaart
+re-pa-tri{-}{e}{ë}-ren
+tbs-pa-ti{-}{e}{ë}nt
+pe-ni-ten-ti{-}{e}{ë}n
+per-ci-pi{-}{e}{ë}-ren
+pe-ri-fe-rie{-}{e}{ë}n
+pe-ri-pe-tie{-}{e}{ë}n
+pi{-}{e}{ë}-tis-tisch
+pla-ne-to{-}{i}{ï}-den
+po{-}{e}{ë}-ti-seer-de
+po{-}{e}{ë}-zie-al-bum
+Po-ly-ne-si{-}{e}{ë}rs
+po-ly-the{-}{i}{ï}s-me
+prin-ci-pi{-}{e}{ë}-le
+pri-vi-le-gi{-}{e}{ë}n
+pro-te{-}{i}{ï}-nu-rie
+pro-to-zo{-}{i}{ï}sch
+psal-mo-die{-}{e}{ë}n
+re-ci-pi{-}{e}{ë}n-ten
+re-cog-ni-ti{-}{e}{ë}n
+po{-}{e}{ë}zie-prijs
+wa-ter-po-lo{-}{e}{ë}r
+pa-ra-ly-sie{-}{e}{ë}n
+mo-no-ma-nie{-}{e}{ë}n
+mo-no-po-lo{-}{i}{ï}-de
+mo-no-the{-}{i}{ï}s-me
+munt-spe-ci{-}{e}{ë}n
+na{-}{i}{ï}-ve-tei-ten
+neu-ral-gie{-}{e}{ë}n
+nier-pa-ti{-}{e}{ë}nt
+obe-di{-}{e}{ë}n-ties
+opi-ni{-}{e}{ë}-ren-de
+oran-je-rie{-}{e}{ë}n
+ori{-}{e}{ë}n-ta-list
+an-ti-no-mie{-}{e}{ë}n
+In-do-ne-si{-}{e}{ë}rs
+in-ef-fi-ci{-}{e}{ë}nt
+in-of-fi-ci{-}{e}{ë}-le
+je-zu{-}{i}{ï}-ti-sche
+ka-ko-fo-nie{-}{e}{ë}n
+la{-}{i}{ï}-ci-seer-de
+ma-ni-chee{-}{e}{ë}rs
+ma-ni-che{-}{i}{ï}s-me
+mar-gi-na-li{-}{e}{ë}n
+me-di{-}{e}{ë}-vis-ten
+me-na-ge-rie{-}{e}{ë}n
+me-tal-lo{-}{i}{ï}-den
+me-to-ny-mie{-}{e}{ë}n
+mo-nar-chie{-}{e}{ë}n
+mond-hy-gi{-}{e}{ë}-ne
+de-pre-ci{-}{e}{ë}-ren
+di-no-sau-ri{-}{e}{ë}r
+dis-so-ci{-}{e}{ë}-ren
+do-de-ca{-}{e}{ë}ders
+doxo-lo-gie{-}{e}{ë}n
+du{-}{u}{ü}m-vi-ra-ten
+ef-fi-ci{-}{e}{ë}n-ter
+ego{-}{i}{ï}s-ti-sche
+el-lip-so{-}{i}{ï}-den
+ex-pa-tri{-}{e}{ë}-ren
+ex-pe-di{-}{e}{ë}n-ten
+fal-si-fi{-}{e}{ë}-ren
+fa-ri-ze{-}{i}{ï}-sche
+fas-cis-to{-}{i}{ï}-de
+fo-to-ko-pie{-}{e}{ë}n
+fox-ter-ri{-}{e}{ë}rs
+ge-co{-}{o}{ö}p-teerd
+ge{-}{e}{ë}xal-teerd
+ge{-}{e}{ë}x-po-neerd
+ge{-}{i}{ï}m-po-neerd
+ge{-}{i}{ï}-so-leer-de
+hart-pa-ti{-}{e}{ë}nt
+haut-re-li{-}{e}{ë}f
+he-mor-ro{-}{i}{ï}-den
+he-ro{-}{i}{ï}ne-hond
+hi{-}{e}{ë}-rar-chiek
+hi{-}{e}{ë}-ra-ti-sche
+hoog-ge{-}{e}{ë}er-de
+ide-o-lo-gie{-}{e}{ë}n
+im-ma-te-ri{-}{e}{ë}-le
+de-nun-ci{-}{e}{ë}-ren
+con-ve-ni{-}{e}{ë}-ren
+co{-}{o}{ö}r-di-ne-ren
+da-da{-}{i}{ï}s-tisch
+bras-se-rie{-}{e}{ë}n
+bul-ter-ri{-}{e}{ë}rs
+ca-fe{-}{i}{ï}-ne-vrij
+ca-ro-te-no{-}{i}{ï}-de
+ce-re-mo-nie{-}{e}{ë}n
+ce-re-mo-ni{-}{e}{ë}-le
+co{-}{i}{ï}n-ci-de-ren
+con-ci-li{-}{e}{ë}-ren
+con-ci-pi{-}{e}{ë}-ren
+con-sci{-}{e}{ë}n-tie
+Bour-gon-di{-}{e}{ë}r
+ar-cha{-}{i}{ï}-se-ren
+ar-ti-fi-ci{-}{e}{ë}-le
+athe{-}{i}{ï}s-tisch
+Au-stra-li{-}{e}{ë}rs
+au-tar-chie{-}{e}{ë}n
+ba-rens-wee{-}{e}{ë}n
+bas-re-li{-}{e}{ë}fs
+be{-}{e}{ë}di-gin-gen
+be{-}{i}{ï}n-vloed-de
+be{-}{i}{ï}n-vloe-den
+be-ne-dic-ti{-}{e}{ë}n
+bin-nen-zee{-}{e}{ë}n
+blas-fe-mie{-}{e}{ë}n
+po{-}{e}{ë}-zie-zo-mer
+ge{-}{i}{ï}n-vi-teerd
+ef-fi-ci{-}{e}{ë}ntst
+Ma-lag-as-si{-}{e}{ë}r
+At-lan-te{-}{i}{ï}sch
+ge{-}{e}{ë}s-ca-leerd
+ge{-}{e}{ë}-vo-lu-eerd
+ge{-}{e}{ë}-qui-peerd
+Mau-ri-ta-ni{-}{e}{ë}r
+pan-the{-}{i}{ï}s-ten
+co{-}{o}{ö}-pe-ran-ten
+Nu-ku{-}{}{–}a-lo-fa
+as-su-ran-ti{-}{e}{ë}n
+ver-si-fi{-}{e}{ë}-ren
+post-au-t{o-}{}{oo}tje
+ge{-}{i}{ï}n-to-neerd
+ge{-}{i}{ï}o-ni-seerd
+jazz-ca-f{é-}{}{ee}tje
+ge{-}{e}{ë}x-po-seerd
+ge{-}{e}{ë}xis-teerd
+ca-ra-pa-ti{-}{e}{ë}nt
+long-pa-ti{-}{e}{ë}nt
+ori{-}{e}{ë}n-taal-se
+co-ma-pa-ti{-}{e}{ë}nt
+ge{-}{i}{ï}n-no-veerd
+clow-ne-rie{-}{e}{ë}n
+slaap-stee{-}{e}{ë}n
+ge{-}{e}{ë}n-ta-meerd
+ge{-}{e}{ë}x-hi-beerd
+Kaap-ver-di{-}{e}{ë}r
+on-in-tu{-}{i}{ï}-tief
+Is-ra{-}{e}{ë}-lie-ten
+dys-pla-sie{-}{e}{ë}n
+Hei-loo{-}{e}{ë}-naar
+in-di-vi-d{u-}{}{uu}tje
+ge{-}{e}{ë}men-deerd
+ge{-}{e}{ë}car-teerd
+ge{-}{i}{ï}g-no-reerd
+bro-me-li-{a-}{}{aa}tje
+ge{-}{i}{ï}r-ri-geerd
+ge{-}{i}{ï}n-ha-leerd
+ca-su{-}{i}{ï}s-tisch
+ge{-}{e}{ë}mit-teerd
+ge{-}{e}{ë}x-pi-reerd
+ma{-}{i}{ï}s-zet-meel
+ge{-}{i}{ï}n-dexeerd
+ge{-}{i}{ï}ni-ti-eerd
+ge{-}{e}{ë}va-lu-eerd
+ge{-}{i}{ï}n-di-ceerd
+Is-ra{-}{e}{ë}-li–s
+bour-gon-di{-}{e}{ë}r
+idee{-}{e}{ë}n-ro-man
+po{-}{e}{ë}-zie-avond
+sad-du-cee{-}{e}{ë}rs
+da-na{-}{i}{ï}-den-vat
+wa-ter-ski{-}{e}{ë}rs
+pi{-}{e}{ë}-teits-vol
+ma-o{-}{i}{ï}s-ti-sche
+ve-ran-d{a-}{}{aa}tjes
+tra-pe-zo{-}{i}{ï}-des
+ta-toe{-}{e}{ë}er-den
+sym-me-trie{-}{e}{ë}n
+sto{-}{i}{ï}-cijn-ser
+seks-or-gie{-}{e}{ë}n
+pri-mu-l{a-}{}{aa}tjes
+pic-co-l{o-}{}{oo}tjes
+per-go-l{a-}{}{aa}tjes
+pa-ra-pl{u-}{}{uu}tjes
+pa-no-ra-m{a-}{}{aa}tje
+os-sen-knie{-}{e}{ë}n
+ne-gli-g{é-}{}{ee}tjes
+ma-don-n{a-}{}{aa}tjes
+je-re-mi{-}{e}{ë}er-de
+in-tu{-}{i}{ï}-tie-ver
+in-tu{-}{i}{ï}-tiefst
+ge{-}{u}{ü}-sur-peerd
+ge{-}{i}{ï}-te-reer-de
+ge{-}{i}{ï}n-tri-geer
+ge{-}{i}{ï}n-ti-meerd
+ge{-}{e}{ë}ro-deer-de
+ge{-}{e}{ë}pi-leer-de
+ge-ti{-}{e}{ë}r-ceerd
+ge-re-cre{-}{e}{ë}erd
+ge-a-li{-}{e}{ë}neerd
+fee{-}{e}{ë}-rie-ke-re
+di-plo-m{a-}{}{aa}tjes
+co{-}{o}{ö}p-teer-den
+cor-ti-co{-}{i}{ï}-den
+pas-fo-t{o-}{}{oo}tjes
+fla-vo-no{-}{i}{ï}-den
+ma{-}{i}{ï}s-kor-rels
+pre{-}{e}{ë}mp-tie-ve
+ty-po-lo-gie{-}{e}{ë}n
+pru-den-ti{-}{e}{ë}-le
+be{-}{e}{ë}in-dig-den
+te-rug-ge{-}{e}{ë}ist
+drie{-}{e}{ë}n-hal-ve
+toe-ge{-}{e}{ë}i-gend
+film-ko-pie{-}{e}{ë}n
+Ca-ra{-}{i}{ï}-bische
+ori{-}{e}{ë}n-te-rend
+co{-}{i}{ï}n-ci-deert
+ge{-}{i}{ï}-mi-teer-de
+ge{-}{e}{ë}ta-leer-de
+ge-ta-toe{-}{e}{ë}erd
+co{-}{o}{ö}r-di-neert
+pro-za{-}{i}{ï}-scher
+po-ten-ti{-}{e}{ë}-len
+ge{-}{e}{ë}m-bar-keerd
+pro-le-ta-ri{-}{e}{ë}rs
+ge{-}{i}{ï}n-ter-neerd
+abi-tu-ri{-}{e}{ë}n-ten
+ge{-}{e}{ë}n-ca-dreerd
+machts-va-cu{-}{u}{ü}m
+an-ti-pa-thie{-}{e}{ë}n
+an-tho-lo-gie{-}{e}{ë}n
+al-ge-bra{-}{i}{ï}sche
+al-tru{-}{i}{ï}s-tisch
+an-ci{-}{e}{ë}n-ni-teit
+he-ro{-}{i}{ï}-ne-spuit
+va-cu{-}{u}{ü}m-ka-mers
+lach-sal-v{o-}{}{oo}tje
+graan-si-l{o-}{}{oo}tje
+de-col-le-t{é-}{}{ee}tje
+buurt-ca-f{é-}{}{ee}tje
+su-per-fi-ci{-}{e}{ë}-le
+be{-}{e}{ë}in-di-gen-de
+con-ve-ni{-}{e}{ë}n-tie
+ge{-}{i}{ï}n-for-meerd
+re-fe-ren-ti{-}{e}{ë}-le
+sub-si-di{-}{e}{ë}-ring
+se-cre-ta-rie{-}{e}{ë}n
+re{-}{i}{ï}n-car-na-tie
+mi-nis-te-ri{-}{e}{ë}-le
+lin-gu{-}{i}{ï}s-tisch
+in-gre-di{-}{e}{ë}n-ten
+in-dus-tri{-}{e}{ë}-len
+ge-o-ri{-}{e}{ë}n-teerd
+ge-ma-ni{-}{e}{ë}-reerd
+ge{-}{i}{ï}n-spi-reerd
+ety-mo-lo-gie{-}{e}{ë}n
+dis-cus-si{-}{e}{ë}-ren
+de-mo-cra-tie{-}{e}{ë}n
+con-ti-nu{-}{i}{ï}-teit
+co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
+be{-}{i}{ï}n-vloe-ding
+pa-ti{-}{e}{ë}n-ten-wet
+oud-ko-lo-ni{-}{e}{ë}n
+on-in-tu{-}{i}{ï}-tie-ve
+mo-za{-}{i}{ï}ek-te-gel
+mo-no-the{-}{i}{ï}s-ten
+arts-pa-ti{-}{e}{ë}nt
+pro-gram-m{a-}{}{aa}tje
+he-ro{-}{i}{ï}-ne-markt
+fy-sio-no-mie{-}{e}{ë}n
+co{-}{i}{ï}n-ci-den-ten
+cli{-}{e}{ë}n-ten-bond
+cli{-}{e}{ë}n-te-lis-me
+an-ti-ju-da{-}{i}{ï}s-me
+twee{-}{e}{ë}n-der-tig
+fonds-pa-ti{-}{e}{ë}nt
+drie{-}{e}{ë}n-der-tig
+ri-bo-nu-cle{-}{i}{ï}-ne
+Bour-gon-di{-}{e}{ë}rs
+ge{-}{i}{ï}n-sti-geerd
+ge{-}{e}{ë}ro-ti-seerd
+ge{-}{i}{ï}n-si-nu-eerd
+in-con-ve-ni{-}{e}{ë}nt
+ge{-}{e}{ë}x-pan-deerd
+ge{-}{e}{ë}x-plo-deerd
+pyg-mee{-}{e}{ë}n-volk
+ge{-}{e}{ë}xa-mi-neerd
+ge{-}{i}{ï}n-stru-eerd
+ge{-}{i}{ï}n-cas-seerd
+ge{-}{e}{ë}li-mi-neerd
+ge{-}{e}{ë}x-por-teerd
+ge{-}{i}{ï}so-leer-der
+ge{-}{i}{ï}n-fec-teerd
+ge{-}{e}{ë}s-cor-teerd
+ge{-}{i}{ï}-ro-ni-seerd
+ge{-}{i}{ï}n-tri-geerd
+ge{-}{i}{ï}m-por-teerd
+bour-gon-di{-}{e}{ë}rs
+le-ver-pa-ti{-}{e}{ë}nt
+tri-mes-tri{-}{e}{ë}-le
+idee{-}{e}{ë}n-we-reld
+ge-co{-}{o}{ö}p-teer-de
+dru{-}{i}{ï}-de-tem-pel
+wa-ter-po-lo{-}{e}{ë}rs
+ori{-}{e}{ë}n-ta-lis-me
+echo-gra-fie{-}{e}{ë}n
+vloer-mo-za{-}{i}{ï}ek
+ze-nuw-pa-ti{-}{e}{ë}nt
+zwaard-le-li{-}{e}{ë}n
+veen-ko-lo-ni{-}{e}{ë}n
+te-tra-lo-gie{-}{e}{ë}n
+ti{-}{e}{ë}r-ce-rin-gen
+va-cu{-}{u}{ü}m-lam-pen
+va-cu{-}{u}{ü}m-me-ters
+sub-si-di{-}{e}{ë}n-ten
+sub-stan-ti{-}{e}{ë}-le
+su-per-sti-ti{-}{e}{ë}n
+ta-boe{-}{i}{ï}-se-ring
+ta-pis-se-rie{-}{e}{ë}n
+ta-toe{-}{e}{ë}er-ders
+ta-to{-}{e}{ë}-rin-gen
+tau-to-lo-gie{-}{e}{ë}n
+athe{-}{i}{ï}s-ti-sche
+va-cu{-}{u}{ü}m-pom-pen
+se-cre-ta-ri{-}{e}{ë}-le
+spa-ti{-}{e}{ë}-rin-gen
+sper-ma-to-zo{-}{o}{ö}n
+spi-ri-tu-a-li{-}{e}{ë}n
+pi{-}{e}{ë}-tis-ti-sche
+re{-}{i}{ï}n-car-ne-ren
+re-pa-tri{-}{e}{ë}-ring
+re-si-den-ti{-}{e}{ë}-le
+res-pon-so-ri{-}{e}{ë}n
+pa-tis-se-rie{-}{e}{ë}n
+pe-dan-te-rie{-}{e}{ë}n
+pes-ti-len-ti{-}{e}{ë}n
+pi{-}{e}{ë}-de-stal-len
+pi-kan-te-rie{-}{e}{ë}n
+po{-}{e}{ë}-zie-al-bums
+po{-}{e}{ë}-zie-bun-del
+pro-to-zo{-}{i}{ï}-sche
+psal-mo-di{-}{e}{ë}-ren
+par-fu-me-rie{-}{e}{ë}n
+mo-no-gra-fie{-}{e}{ë}n
+mo-za{-}{i}{ï}ek-vloer
+na{-}{i}{ï}e-ve-lin-gen
+ne-cro-lo-gie{-}{e}{ë}n
+ob-ser-van-ti{-}{e}{ë}n
+oleo-gra-fie{-}{e}{ë}n
+oli-gar-chie{-}{e}{ë}n
+on-ge{-}{e}{ë}ve-naard
+on-hy-gi{-}{e}{ë}-nisch
+ono-ma-to-pee{-}{e}{ë}n
+or-don-nan-ti{-}{e}{ë}n
+pa-ci-fi-ca-ti{-}{e}{ë}n
+in-dul-gen-ti{-}{e}{ë}n
+in-ef-fi-ci{-}{e}{ë}n-te
+in-fir-me-rie{-}{e}{ë}n
+in-suf-fi-ci{-}{e}{ë}nt
+Is-ra{-}{e}{ë}-li-tisch
+ju-ris-dic-ti{-}{e}{ë}n
+kies-quo-ti{-}{e}{ë}nt
+koe-ken-drie{-}{e}{ë}n
+le-pro-ze-rie{-}{e}{ë}n
+ma-chi-ne-rie{-}{e}{ë}n
+ma-li{-}{e}{ë}n-kol-der
+me-di{-}{e}{ë}-vis-tiek
+di-eet-pa-ti{-}{e}{ë}nt
+di-no-sau-ri{-}{e}{ë}rs
+dis-tan-ti{-}{e}{ë}-ren
+do-mi-ci-li{-}{e}{ë}-ren
+exis-ten-ti{-}{e}{ë}-le
+ex-po-nen-ti{-}{e}{ë}-le
+fal-si-fi{-}{e}{ë}-ring
+fo-to-gra-fie{-}{e}{ë}n
+ga-lan-te-rie{-}{e}{ë}n
+ge{-}{e}{ë}n-dos-seerd
+ge{-}{e}{ë}n-ga-geer-de
+ge{-}{e}{ë}xal-teer-de
+ge{-}{e}{ë}x-pli-ceerd
+ge{-}{e}{ë}x-po-neer-de
+ge{-}{i}{ï}m-pli-ceerd
+ge{-}{i}{ï}m-po-neer-de
+ge{-}{i}{ï}n-dos-seerd
+ge{-}{i}{ï}n-te-greerd
+ge{-}{i}{ï}n-ter-viewd
+ge{-}{i}{ï}n-ti-meer-de
+ge{-}{i}{ï}r-ri-teer-de
+ge-la{-}{i}{ï}-ci-seerd
+ge-nea-lo-gie{-}{e}{ë}n
+griep-pa-ti{-}{e}{ë}nt
+hi{-}{e}{ë}-rar-chie-ke
+hi{-}{e}{ë}-rar-chisch
+hi{-}{e}{ë}-ro-glie-fen
+con-tra-ri{-}{e}{ë}-ren
+co{-}{o}{ö}-pe-ra-tie-ve
+co{-}{o}{ö}r-di-na-ties
+co{-}{o}{ö}r-di-neer-de
+da-da{-}{i}{ï}s-ti-sche
+de-fi-ci{-}{e}{ë}n-ties
+ca-fe{-}{i}{ï}-ne-vrije
+co{-}{i}{ï}n-ci-deer-de
+co{-}{i}{ï}n-ci-den-tie
+con-gre-ga-ti{-}{e}{ë}n
+con-sci{-}{e}{ë}n-ties
+ar-cha{-}{i}{ï}-seer-de
+ar-cha{-}{i}{ï}s-tisch
+ast-ma-pa-ti{-}{e}{ë}nt
+au-to-gra-fie{-}{e}{ë}n
+ban-toe{-}{i}{ï}s-tiek
+be-zits-ac-ti{-}{e}{ë}n
+bi-jou-te-rie{-}{e}{ë}n
+ge-zags-va-cu{-}{u}{ü}m
+fo-to-ko-pi{-}{e}{ë}-ren
+Flak-kee{-}{e}{ë}-naar
+ge{-}{e}{ë}-mail-leerd
+Pa-ra-ma-ri-bo{-}{e}{ë}r
+ge{-}{e}{ë}er-bie-digd
+ge{-}{i}{ï}n-ves-teerd
+po{-}{e}{ë}-zie-de-buut
+ge{-}{i}{ï}n-vol-veerd
+hart-pa-ti{-}{e}{ë}n-te
+po-ly-the{-}{i}{ï}s-ten
+Joego-sla-vi{-}{e}{ë}r
+ge{-}{e}{ë}xe-cu-teerd
+echo-sco-pie{-}{e}{ë}n
+de-pen-den-ti{-}{e}{ë}n
+après-ski{-}{e}{ë}n
+af-spa-ti{-}{e}{ë}-ring
+har-mo-ni-c{a-}{}{aa}tje
+sport-be-h{a-}{}{aa}tje
+ge{-}{e}{ë}x-pe-di-eerd
+ge{-}{e}{ë}x-tra-heerd
+nu-cle{-}{i}{ï}ne-zuur
+ge{-}{e}{ë}-ga-li-seerd
+me-de-pa-ti{-}{e}{ë}n-te
+ge{-}{e}{ë}x-plo-reerd
+hy-gi{-}{e}{ë}-ni-scher
+Scan-di-na-vi{-}{e}{ë}r
+idee{-}{e}{ë}n-ro-mans
+ca-su{-}{i}{ï}s-tische
+dorps-ca-f{é-}{}{ee}tje
+cli{-}{e}{ë}n-ten-stop
+my-tho-lo-gie{-}{e}{ë}n
+stads-au-t{o-}{}{oo}tje
+cli{-}{e}{ë}n-ten-raad
+bloe-men-zee{-}{e}{ë}n
+nier-pa-ti{-}{e}{ë}n-te
+ei-gen-ge{-}{e}{ë}rf-de
+ge{-}{e}{ë}x-cel-leerd
+ge{-}{e}{ë}x-cer-peerd
+ge{-}{e}{ë}-ja-cu-leerd
+cli{-}{e}{ë}n-ten-kant
+cli{-}{e}{ë}n-ten-zorg
+co-ca{-}{i}{ï}-ne-ben-de
+ge{-}{i}{ï}n-jec-teerd
+ge{-}{i}{ï}m-mi-greerd
+drie{-}{e}{ë}n-zes-tig
+ge{-}{i}{ï}n-sis-teerd
+dub-bel-twee{-}{e}{ë}n
+ge{-}{i}{ï}n-cli-neerd
+ge{-}{i}{ï}n-car-neerd
+pro-te{-}{i}{ï}-ne-rijk
+in-spi-ci{-}{e}{ë}n-ten
+ge{-}{e}{ë}-clip-seerd
+dood-ge{-}{e}{ë}r-gerd
+en-do-sco-pie{-}{e}{ë}n
+twee{-}{e}{ë}n-zes-tig
+ME-pa-ti{-}{e}{ë}n-ten
+idee{-}{e}{ë}n-bus-sen
+ge{-}{e}{ë}n-sce-neerd
+ca-ro-te-no{-}{i}{ï}-den
+reu-ma-pa-ti{-}{e}{ë}nt
+pre-ju-di-ci{-}{e}{ë}-le
+va-cu{-}{u}{ü}m-bui-zen
+eu-tro-fi{-}{e}{ë}-ring
+haut-re-li{-}{e}{ë}fs
+tra-ge-di{-}{e}{ë}n-nes
+pa-no-ra-m{a-}{}{aa}tjes
+oor-logs-wee{-}{e}{ë}n
+im-ma-te-ri{-}{e}{ë}-ler
+hiv-pa-ti{-}{e}{ë}n-ten
+har-mo-ni{-}{e}{ë}-rend
+ge{-}{u}{ü}-ti-li-seerd
+ge{-}{o}{ö}ri-en-teerd
+ge{-}{i}{ï}n-ver-teerd
+ge{-}{i}{ï}n-un-deer-de
+ge{-}{i}{ï}n-no-veer-de
+ge{-}{e}{ë}x-cu-seer-de
+ge{-}{e}{ë}-ner-veer-de
+ge{-}{e}{ë}-men-deer-de
+fri-tuur-oli{-}{e}{ë}n
+ego{-}{i}{ï}s-ti-scher
+ef-fi-ci{-}{e}{ë}nt-ste
+bus-pa-ti{-}{e}{ë}n-ten
+bank-cli{-}{e}{ë}n-ten
+asym-me-trie{-}{e}{ë}n
+ar-ti-fi-ci{-}{e}{ë}-ler
+al-pi-ne-ski{-}{e}{ë}rs
+ge-de-fi-ni{-}{e}{ë}erd
+ge{-}{e}{ë}-va-cu-eer-de
+to-po-gra-fie{-}{e}{ë}n
+thuis-ko-pie{-}{e}{ë}n
+ge{-}{i}{ï}o-ni-seer-de
+ge{-}{e}{ë}-qui-peer-de
+ge{-}{e}{ë}-vo-lu-eer-de
+ge{-}{i}{ï}r-ri-geer-de
+ge{-}{e}{ë}x-pi-reer-de
+ge{-}{e}{ë}-mit-teer-de
+com-mer-ci{-}{e}{ë}-len
+pa-tho-lo-gie{-}{e}{ë}n
+ge{-}{e}{ë}-va-lu-eer-de
+ge{-}{i}{ï}n-du-ceer-de
+ge{-}{i}{ï}n-ha-leer-de
+ge{-}{u}{ü}ni-fi-ceerd
+ge{-}{e}{ë}s-ca-leer-de
+be{-}{i}{ï}n-vloed-den
+ge{-}{i}{ï}n-dexeer-de
+ge{-}{e}{ë}x-po-seer-de
+toe-ge{-}{e}{ë}i-gen-de
+ori{-}{e}{ë}n-teer-den
+ge{-}{e}{ë}n-ta-meer-de
+ge{-}{i}{ï}n-di-ceer-de
+ge-ta-toe{-}{e}{ë}er-de
+ori{-}{e}{ë}n-te-ren-de
+co{-}{o}{ö}r-di-ne-rend
+com-mer-ci{-}{e}{ë}-ler
+ex-pa-ti{-}{e}{ë}n-ten
+ef-fi-ci{-}{e}{ë}n-te-re
+ge{-}{i}{ï}-ni-ti-eer-de
+ge{-}{e}{ë}-mi-greer-de
+ge{-}{i}{ï}n-vi-teer-de
+ge-po{-}{e}{ë}-ti-seerd
+ge{-}{i}{ï}-de-a-li-seerd
+Is-ra{-}{e}{ë}-li-tische
+al-tru{-}{i}{ï}s-ti-sche
+re{-}{i}{ï}n-car-neer-de
+he-ro{-}{i}{ï}-ne-hoe-ren
+voet-bal-knie{-}{e}{ë}n
+cel-the-ra-pie{-}{e}{ë}n
+ha-gio-gra-fie{-}{e}{ë}n
+ge{-}{i}{ï}r-ri-teer-der
+in-stan-ta-n{é-}{}{ee}tje
+twee{-}{e}{ë}n-tach-tig
+ti-ra-mi-su{-}{}{–}tje
+ri-si-co-pa-ti{-}{e}{ë}nt
+po{-}{e}{ë}-zie-kri-tiek
+mi-to-chon-dri{-}{e}{ë}n
+je-zu{-}{i}{ï}e-ten-kerk
+in-ter-mezz{o-}{}{oo}tje
+com-mu-ni-qu{é-}{}{ee}tje
+co-ca{-}{i}{ï}-ne-kar-tel
+au-di{-}{e}{ë}n-tie-blad
+twee{-}{e}{ë}n-vijf-tig
+Pe-lo-pon-ne-si{-}{e}{ë}r
+co{-}{o}{ö}r-di-ne-ren-de
+ge{-}{i}{ï}n-fec-teer-de
+ge{-}{i}{ï}n-stal-leerd
+ge-co{-}{o}{ö}r-di-neerd
+ge{-}{i}{ï}n-for-meer-de
+ge-o-ri{-}{e}{ë}n-teer-de
+He-ver-lee{-}{e}{ë}-naar
+tech-no-lo-gie{-}{e}{ë}n
+lin-gu{-}{i}{ï}s-ti-sche
+ge{-}{i}{ï}n-spi-reer-de
+ge{-}{i}{ï}l-lu-streerd
+ge{-}{e}{ë}-mo-ti-o-neerd
+ge{-}{e}{ë}-man-ci-peerd
+co{-}{o}{ö}r-di-na-tri-ce
+co{-}{o}{ö}r-di-na-to-ren
+su{-}{i}{ï}-ci-de-ri-si-co
+thuis-ko-pi{-}{e}{ë}-ren
+su{-}{i}{ï}-ci-de-po-ging
+cli{-}{e}{ë}nt-ge-richt
+twee{-}{e}{ë}n-twin-tig
+kan-ker-pa-ti{-}{e}{ë}nt
+drie{-}{e}{ë}n-twin-tig
+be{-}{i}{ï}n-vloed-baar
+ge{-}{e}{ë}-ti-ket-teerd
+ge{-}{i}{ï}n-fil-treerd
+ge{-}{i}{ï}m-plan-teerd
+ge{-}{e}{ë}f-fec-tu-eerd
+twee{-}{e}{ë}n-veer-tig
+ge{-}{i}{ï}n-spec-teerd
+ge{-}{i}{ï}m-preg-neerd
+ge{-}{i}{ï}n-au-gu-reerd
+Em-ma{-}{u}{ü}s-gan-gers
+sui-ker-pa-ti{-}{e}{ë}nt
+pi{-}{e}{ë}-teits-vol-le
+nier-pa-ti{-}{e}{ë}n-ten
+reu-zen-pin-gu{-}{i}{ï}n
+in-tu{-}{i}{ï}-ti-o-nis-me
+co-ca{-}{i}{ï}-ne-maf-fia
+co{-}{o}{ö}-pe-ra-tie-ven
+hart-pa-ti{-}{e}{ë}n-ten
+co-ca{-}{i}{ï}ne-vangst
+aids-pa-ti{-}{e}{ë}n-ten
+zin-ko-gra-fie{-}{e}{ë}n
+co-ca{-}{i}{ï}ne-han-del
+darm-bac-te-ri{-}{e}{ë}n
+straf-ko-lo-ni{-}{e}{ë}n
+spe-ci-fi-ca-ti{-}{e}{ë}n
+sper-ma-to-zo{-}{i}{ï}-de
+spon-ta-ne{-}{i}{ï}-teit
+ca-ra-pa-ti{-}{e}{ë}n-ten
+re{-}{i}{ï}n-car-na-ties
+re-li{-}{e}{ë}f-druk-ken
+re-li{-}{e}{ë}f-kaar-ten
+pa-ti{-}{e}{ë}n-ten-zorg
+pa-ti{-}{e}{ë}n-tie-werk
+per-so-ni-fi{-}{e}{ë}-ren
+plu-to-cra-tie{-}{e}{ë}n
+po{-}{e}{ë}-zie-bun-dels
+pre-ju-di-ci{-}{e}{ë}-ren
+pre-si-den-ti{-}{e}{ë}-le
+pri-vi-le-gi{-}{e}{ë}-ren
+pro-mis-cu{-}{i}{ï}-teit
+pro-vi-den-ti{-}{e}{ë}-le
+psy-cho-hy-gi{-}{e}{ë}-ne
+ra-dio-gra-fie{-}{e}{ë}n
+ra-dio-sco-pie{-}{e}{ë}n
+ery-tro-po{-}{e}{ë}-ti-ne
+pan-the{-}{i}{ï}s-tisch
+och-lo-cra-tie{-}{e}{ë}n
+on-ge{-}{e}{ë}-ve-naar-de
+on-hy-gi{-}{e}{ë}-ni-sche
+ori{-}{e}{ë}n-ta-lis-ten
+or-tho-gra-fie{-}{e}{ë}n
+paas-com-mu-ni{-}{e}{ë}n
+in-ef-fi-ci{-}{e}{ë}n-tie
+in-suf-fi-ci{-}{e}{ë}n-te
+in-ten-si-fi{-}{e}{ë}-ren
+in-ter-li-ni{-}{e}{ë}-ren
+in-ter-ve-ni{-}{e}{ë}-ren
+je-zu{-}{i}{ï}e-ten-or-de
+kal-li-gra-fie{-}{e}{ë}n
+ki-lo-ca-lo-rie{-}{e}{ë}n
+kroon-ko-lo-ni{-}{e}{ë}n
+li-tho-gra-fie{-}{e}{ë}n
+ma-li{-}{e}{ë}n-kol-ders
+ma-ni{-}{e}{ë}-ris-tisch
+mi-li-eu-hy-gi{-}{e}{ë}-ne
+des-o-ri{-}{e}{ë}n-ta-tie
+des-o-ri{-}{e}{ë}n-te-ren
+dif-fe-ren-ti{-}{e}{ë}-le
+dit-to-gra-fie{-}{e}{ë}n
+di-ver-si-fi{-}{e}{ë}-ren
+fa-mi-lie-re{-}{u}{ü}-nie
+for-ti-fi-ca-ti{-}{e}{ë}n
+fra-se-o-lo-gie{-}{e}{ë}n
+ge-ar-cha{-}{i}{ï}-seerd
+ge{-}{e}{ë}m-ploy-eer-de
+ge{-}{e}{ë}xe-cu-teer-de
+ge{-}{e}{ë}x-pli-queerd
+ge{-}{i}{ï}m-pli-ceer-de
+ge{-}{i}{ï}n-te-greer-de
+ge{-}{i}{ï}n-ter-neer-de
+ge{-}{i}{ï}n-ti-meer-den
+ge{-}{i}{ï}n-ver-teer-de
+ge-ma-ni{-}{e}{ë}-reer-de
+ge{-}{u}{ü}ni-for-meerd
+ge{-}{u}{ü}r-ba-ni-seerd
+gram-ca-lo-rie{-}{e}{ë}n
+gra-ti-fi-ca-ti{-}{e}{ë}n
+her-de-fi-ni{-}{e}{ë}-ren
+he-ro{-}{i}{ï}-ne-han-del
+her-ori{-}{e}{ë}n-ta-tie
+her-ori{-}{e}{ë}n-te-ren
+hi{-}{e}{ë}-rar-chie{-}{e}{ë}n
+hi{-}{e}{ë}-rar-chi-sche
+hi{-}{e}{ë}-ro-gli-fisch
+hi{-}{e}{ë}-ro-gly-fisch
+hin-doe{-}{i}{ï}s-tisch
+Cu-ra-çao{-}{e}{ë}-naar
+car-ros-se-rie{-}{e}{ë}n
+chro-no-lo-gie{-}{e}{ë}n
+coc-ker-spa-ni{-}{e}{ë}l
+co{-}{i}{ï}n-ci-den-ties
+con-cor-dan-ti{-}{e}{ë}n
+con-fi-den-ti{-}{e}{ë}-le
+pa-ti{-}{e}{ë}n-ten-stop
+ar-cha{-}{i}{ï}s-ti-sche
+be{-}{i}{ï}n-vloed-ba-re
+ge{-}{i}{ï}m-mu-ni-seerd
+cli{-}{e}{ë}n-ten-recht
+drie{-}{e}{ë}n-veer-tig
+dis-tan-ti{-}{e}{ë}-ring
+ge{-}{e}{ë}x-ploi-teerd
+de-fi-ni{-}{e}{ë}-rin-gen
+va-cu{-}{u}{ü}m-ver-pakt
+fee{-}{e}{ë}n-ko-nin-gin
+maag-pa-ti{-}{e}{ë}n-ten
+jacht-tro-fee{-}{e}{ë}n
+pro-te-ro-zo{-}{i}{ï}-cum
+ge{-}{i}{ï}l-lu-mi-neerd
+se-mi-of-fi-ci{-}{e}{ë}-le
+ge{-}{i}{ï}n-ti-mi-deerd
+co-li-bac-te-ri{-}{e}{ë}n
+ge{-}{i}{ï}n-sti-tu-eerd
+ze-nuw-pa-ti{-}{e}{ë}n-te
+Over-flak-kee{-}{e}{ë}r
+cli{-}{e}{ë}n-ten-ra-den
+do-mi-ci-li{-}{e}{ë}-ring
+long-pa-ti{-}{e}{ë}n-ten
+cis-ter-ci{-}{e}{ë}n-zer
+ca-deau-idee{-}{e}{ë}n
+be{-}{i}{ï}n-vloe-den-de
+idee{-}{e}{ë}n-vor-ming
+bor-der-ter-ri{-}{e}{ë}r
+drie{-}{e}{ë}n-tach-tig
+drie{-}{e}{ë}n-vijf-tig
+he-ro{-}{i}{ï}-ne-vangst
+idee{-}{e}{ë}n-rijk-dom
+pro-te{-}{i}{ï}-ne-rij-ke
+in-con-ve-ni{-}{e}{ë}n-te
+ge{-}{i}{ï}n-ac-ti-veerd
+be-stel-au-t{o-}{}{oo}tje
+ge{-}{e}{ë}n-quê-teerd
+her-ders-po{-}{e}{ë}-zie
+fil-mo-gra-fie{-}{e}{ë}n
+mond-hy-gi{-}{e}{ë}-nist
+gly-co-pro-te{-}{i}{ï}-ne
+co-ma-pa-ti{-}{e}{ë}n-ten
+pre-fe-ren-ti{-}{e}{ë}-le
+am-bi-gu{-}{i}{ï}-tei-ten
+tbs-pa-ti{-}{e}{ë}n-ten
+lief-des-po{-}{e}{ë}-zie
+con-sci{-}{e}{ë}n-ti-eus
+bon-net-te-rie{-}{e}{ë}n
+zaal-pa-ti{-}{e}{ë}n-ten
+pest-bac-te-ri{-}{e}{ë}n
+mo-za{-}{i}{ï}ek-te-gels
+hi{-}{e}{ë}-rar-chie-ker
+ge{-}{u}{ü}ni-fi-ceer-de
+ge{-}{o}{ö}ri-en-teer-de
+ge{-}{i}{ï}n-si-nu-eer-de
+ge{-}{i}{ï}n-cli-neer-de
+ge{-}{e}{ë}x-tra-heer-de
+ge{-}{e}{ë}x-plo-reer-de
+ge{-}{e}{ë}x-pli-ceer-de
+ge{-}{e}{ë}x-pan-deer-de
+ge{-}{e}{ë}xor-ci-seerd
+ge{-}{e}{ë}x-cer-peer-de
+ge{-}{e}{ë}xal-teer-der
+ge{-}{e}{ë}s-cor-teer-de
+ge{-}{e}{ë}n-cryp-teerd
+ge{-}{e}{ë}n-ca-dreer-de
+ge{-}{e}{ë}er-bie-dig-de
+ge{-}{e}{ë}-clip-seer-de
+da-da{-}{i}{ï}s-ti-scher
+co{-}{o}{ö}-pe-ra-tie-ver
+co{-}{o}{ö}r-di-neer-den
+ge{-}{i}{ï}n-vol-veer-de
+hy-gi{-}{e}{ë}-ne-ei-sen
+hiv-pa-ti{-}{e}{ë}n-ten
+ge{-}{e}{ë}-ga-li-seer-de
+ge{-}{i}{ï}n-jec-teer-de
+ge{-}{e}{ë}x-tru-deer-de
+ge{-}{e}{ë}x-por-teer-de
+ge{-}{e}{ë}m-bar-keer-de
+ge{-}{i}{ï}n-cas-seer-de
+ge{-}{e}{ë}xa-mi-neer-de
+ge{-}{i}{ï}m-mi-greer-de
+ge{-}{e}{ë}-mail-leer-de
+hy-gi{-}{e}{ë}-ne-re-gels
+ge{-}{i}{ï}n-car-neer-de
+ge{-}{e}{ë}-li-mi-neer-de
+ge{-}{i}{ï}n-stru-eer-de
+me-de-pa-ti{-}{e}{ë}n-ten
+ge{-}{i}{ï}m-por-teer-de
+ge{-}{i}{ï}n-ves-teer-de
+ge{-}{i}{ï}n-ter-view-de
+ge{-}{e}{ë}n-sce-neer-de
+ge{-}{e}{ë}x-plo-deer-de
+ge{-}{e}{ë}-lek-tri-seerd
+her-ori{-}{e}{ë}n-teer-de
+des-ori{-}{e}{ë}n-teer-de
+va-cu{-}{u}{ü}m-ver-pak-te
+bor-der-ter-ri{-}{e}{ë}rs
+di-eet-pa-ti{-}{e}{ë}n-ten
+ge{-}{e}{ë}utha-na-seerd
+spier-atro-fie{-}{e}{ë}n
+va-gan-ten-po{-}{e}{ë}-zie
+su{-}{i}{ï}-ci-de-nei-ging
+si-mul-ta-ne{-}{i}{ï}-teit
+rijks-in-sig-ni{-}{e}{ë}n
+ori{-}{e}{ë}n-ta-tie-reis
+mo-no-the{-}{i}{ï}s-tisch
+ma-ro-qui-ne-rie{-}{e}{ë}n
+je-zu{-}{i}{ï}e-ten-stijl
+dis-har-mo-ni{-}{e}{ë}-ren
+Cu-ra-çao{-}{e}{ë}-naars
+twee{-}{e}{ë}n-ne-gen-tig
+kan-ker-pa-ti{-}{e}{ë}n-te
+ori{-}{e}{ë}n-ta-tie-jaar
+drie{-}{e}{ë}n-ne-gen-tig
+ge{-}{i}{ï}n-fec-teer-den
+ge-co{-}{o}{ö}r-di-neer-de
+ge{-}{i}{ï}n-te-res-seerd
+ge{-}{i}{ï}l-lu-streer-de
+ge{-}{e}{ë}-man-ci-peer-de
+co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
+pa-ti{-}{e}{ë}nt-re-la-tie
+ge{-}{i}{ï}n-ten-si-veerd
+ge{-}{e}{ë}x-pli-ci-teerd
+her-ori{-}{e}{ë}n-te-ring
+co-ca{-}{i}{ï}-ne-af-fai-re
+le-ver-pa-ti{-}{e}{ë}n-ten
+he-ro{-}{i}{ï}-ne-hoer-tje
+kunst-ga-le-rie{-}{e}{ë}n
+par-le-men-ta-ri{-}{e}{ë}r
+fonds-pa-ti{-}{e}{ë}n-ten
+ori{-}{e}{ë}n-ta-tie-punt
+cho-re-o-gra-fie{-}{e}{ë}n
+pit-bull-ter-ri{-}{e}{ë}r
+ast-ma-pa-ti{-}{e}{ë}n-ten
+he-ro{-}{i}{ï}-ne-ge-bruik
+free-style-ski{-}{e}{ë}n
+po{-}{e}{ë}-zie-fes-ti-val
+con-cur-ren-ti{-}{e}{ë}-le
+fa-mi-lie-re{-}{u}{ü}-nies
+ge{-}{i}{ï}n-ter-neer-den
+ze-nuw-pa-ti{-}{e}{ë}n-ten
+te-ken-aca-de-mi{-}{e}{ë}n
+ter-mi-no-lo-gie{-}{e}{ë}n
+sub-ca-te-go-rie{-}{e}{ë}n
+bu-reau-cra-tie{-}{e}{ë}n
+se-cu-la-ri-sa-ti{-}{e}{ë}n
+sper-ma-to-zo{-}{i}{ï}-den
+sa-cra-men-ta-li{-}{e}{ë}n
+ko-nings-pin-gu{-}{i}{ï}n
+rijks-aca-de-mi{-}{e}{ë}n
+pa-tri-ci{-}{e}{ë}rs-huis
+pest-epi-de-mie{-}{e}{ë}n
+pi{-}{e}{ë}-de-stal-le-tje
+psy-cho-lin-gu{-}{i}{ï}st
+co-ca{-}{i}{ï}-ne-smok-kel
+pan-the{-}{i}{ï}s-ti-sche
+mo-za{-}{i}{ï}ek-vloe-ren
+ori{-}{e}{ë}n-ta-lis-tiek
+in-suf-fi-ci{-}{e}{ë}n-tie
+je-zu{-}{i}{ï}e-ten-pa-ter
+kerk-pro-vin-ci{-}{e}{ë}n
+kies-quo-ti{-}{e}{ë}n-ten
+mond-hy-gi{-}{e}{ë}-nis-te
+dif-fe-ren-ti{-}{e}{ë}-len
+dif-fe-ren-ti{-}{e}{ë}-ren
+en-cy-clo-pe-die{-}{e}{ë}n
+ge{-}{e}{ë}-mo-ti-o-neer-de
+ge{-}{e}{ë}m-ploy-eer-den
+ge{-}{e}{ë}n-quê-teer-de
+ge{-}{i}{ï}m-pro-vi-seerd
+ge{-}{u}{ü}ni-for-meer-de
+ge{-}{u}{ü}r-ba-ni-seer-de
+griep-pa-ti{-}{e}{ë}n-ten
+her-ori{-}{e}{ë}n-ta-ties
+hi{-}{e}{ë}-rar-chi-scher
+hi{-}{e}{ë}-ro-gli-fi-sche
+hin-doe{-}{i}{ï}s-ti-sche
+im-per-ti-nen-ti{-}{e}{ë}n
+con-tro-ver-si{-}{e}{ë}-le
+co{-}{o}{ö}r-di-na-tri-ces
+cis-ter-ci{-}{e}{ë}n-zers
+co-ca{-}{i}{ï}-ne-ge-bruik
+com-men-ta-ri{-}{e}{ë}-ren
+aris-to-cra-tie{-}{e}{ë}n
+be-dis-cus-si{-}{e}{ë}-ren
+be-doe{-}{i}{ï}en-en-tent
+bi-blio-gra-fie{-}{e}{ë}n
+niet-of-fi-ci{-}{e}{ë}-le
+ori{-}{e}{ë}n-ta-tie-loop
+po-ly-the{-}{i}{ï}s-tisch
+ge{-}{i}{ï}n-ter-fe-reerd
+ge{-}{i}{ï}n-tro-du-ceerd
+lands-fi-nan-ci{-}{e}{ë}n
+on-ge{-}{i}{ï}n-spi-reerd
+ge{-}{i}{ï}n-cri-mi-neerd
+net-co{-}{o}{ö}r-di-na-tor
+ar-beids-hy-gi{-}{e}{ë}-ne
+ge{-}{e}{ë}x-tra-po-leerd
+kleur-va-ri{-}{e}{ë}-teit
+ge{-}{i}{ï}so-leerd-heid
+pro-Is-ra{-}{e}{ë}-lisch
+ge{-}{i}{ï}n-flu-en-ceerd
+pa-ti{-}{e}{ë}n-ten-recht
+su{-}{i}{ï}-ci-de-plan-nen
+her-de-fi-ni{-}{e}{ë}-ring
+bank-em-ploy{é-}{}{ee}tje
+kern-on-der-zee{-}{e}{ë}r
+ori{-}{e}{ë}n-ta-tie-fa-se
+zelf-ge-cre{-}{e}{ë}er-de
+buurt-con-ci{-}{e}{ë}r-ge
+cli{-}{e}{ë}n-ten-fol-der
+ge{-}{i}{ï}n-ter-po-leerd
+hi{-}{e}{ë}-ro-gly-fi-sche
+sub-si-di{-}{e}{ë}-rin-gen
+ori{-}{e}{ë}n-ta-tie-no-ta
+kaas-souf-fl{é-}{}{ee}tje
+ge{-}{e}{ë}-che-lon-neerd
+po-li-tie-au-t{o-}{}{oo}tje
+pa-ti{-}{e}{ë}n-ten-groep
+ge{-}{e}{ë}-co-no-mi-seerd
+pa-ti{-}{e}{ë}n-ten-stops
+in-con-ve-ni{-}{e}{ë}n-tie
+twee{-}{e}{ë}n-ze-ven-tig
+ge{-}{i}{ï}n-cor-po-reerd
+di-ver-si-fi{-}{e}{ë}-ring
+cho-co-la-te-rie{-}{e}{ë}n
+on-ge{-}{i}{ï}n-for-meerd
+be{-}{i}{ï}n-vloe-din-gen
+rijks-fi-nan-ci{-}{e}{ë}n
+reu-ma-pa-ti{-}{e}{ë}n-ten
+ma-ni{-}{e}{ë}-ris-ti-sche
+ge{-}{e}{ë}xe-cu-teer-den
+con-sci{-}{e}{ë}n-ti-eu-ze
+su{-}{i}{ï}-ci-de-ple-gers
+pyg-mee{-}{e}{ë}n-vol-ken
+prijs-the-o-rie{-}{e}{ë}n
+in-ter-ve-ni{-}{e}{ë}er-de
+in-stan-ta-n{é-}{}{ee}tjes
+ge{-}{i}{ï}n-fil-treer-de
+ge{-}{i}{ï}m-mu-ni-seer-de
+ge{-}{i}{ï}l-lu-mi-neer-de
+ge{-}{e}{ë}n-cryp-teer-de
+ge-welds-or-gie{-}{e}{ë}n
+ge-ma-ni{-}{e}{ë}-reer-der
+an-ci{-}{e}{ë}n-ni-tei-ten
+al-tru{-}{i}{ï}s-ti-scher
+re-ser-ve-ko-pie{-}{e}{ë}n
+ge{-}{i}{ï}n-ti-mi-deer-de
+niet-ma-te-ri{-}{e}{ë}-le
+sub-stan-ti{-}{e}{ë}-le-re
+ge{-}{e}{ë}-ti-ket-teer-de
+ge{-}{e}{ë}x-ploi-teer-de
+me-tho-do-lo-gie{-}{e}{ë}n
+ge{-}{e}{ë}f-fec-tu-eer-de
+ge{-}{i}{ï}-de-a-li-seer-de
+cli{-}{e}{ë}nt-ge-rich-te
+ge{-}{i}{ï}n-spec-teer-de
+an-ti-bac-te-ri{-}{e}{ë}-le
+kleu-ren-ko-pie{-}{e}{ë}n
+ge{-}{i}{ï}m-preg-neer-de
+fo-to-vol-ta{-}{i}{ï}-sche
+volks-me-lo-die{-}{e}{ë}n
+ge{-}{i}{ï}n-ter-view-den
+ge{-}{i}{ï}n-stal-leer-de
+ori{-}{e}{ë}n-ta-tie-lo-pen
+in-ter-net-ca-f{é-}{}{ee}tje
+sui-ker-pa-ti{-}{e}{ë}n-ten
+tijds-ori{-}{e}{ë}n-ta-tie
+so-ci{-}{e}{ë}-teits-le-ven
+slot-co{-}{o}{ö}r-di-na-tor
+school-con-ci{-}{e}{ë}r-ge
+po-ly-the{-}{i}{ï}s-ti-sche
+pa-ti{-}{e}{ë}nt-si-tu-a-tie
+pa-ti{-}{e}{ë}n-ten-stroom
+on-ge{-}{i}{ï}l-lu-streerd
+on-ge{-}{e}{ë}-man-ci-peerd
+mi-grai-ne-pa-ti{-}{e}{ë}nt
+je-zu{-}{i}{ï}e-ten-ker-ken
+cli{-}{e}{ë}n-ten-rech-ten
+cli{-}{e}{ë}n-ten-dos-sier
+bouw-co{-}{o}{ö}r-di-na-tor
+be-drijfs-hy-gi{-}{e}{ë}-ne
+dif-fe-ren-ti{-}{e}{ë}-ring
+ge{-}{i}{ï}n-ter-ve-ni-eerd
+po{-}{e}{ë}-zie-wed-strijd
+di-a-be-tes-pa-ti{-}{e}{ë}nt
+ge{-}{i}{ï}m-ple-men-teerd
+co{-}{o}{ö}r-di-na-tie-punt
+ge{-}{i}{ï}n-ter-pel-leerd
+ge{-}{i}{ï}n-ter-pre-teerd
+bulk-che-mi-ca-li{-}{e}{ë}n
+on-ge{-}{i}{ï}n-for-meer-de
+wild-wa-ter-ka-no{-}{e}{ë}n
+ge{-}{e}{ë}x-pe-ri-men-teer
+ge{-}{i}{ï}-den-ti-fi-ceerd
+ge{-}{i}{ï}n-te-res-seer-de
+markt-eco-no-mie{-}{e}{ë}n
+kan-ker-pa-ti{-}{e}{ë}n-ten
+par-le-men-ta-ri{-}{e}{ë}rs
+pa-ti{-}{e}{ë}nt-ge-bon-den
+mond-hy-gi{-}{e}{ë}-nis-ten
+co{-}{o}{ö}r-di-na-tie-team
+on-ge{-}{i}{ï}n-spi-reer-de
+ri-si-co-pa-ti{-}{e}{ë}n-ten
+boet-pre-di-ca-ti{-}{e}{ë}n
+kern-on-der-zee{-}{e}{ë}rs
+staats-fi-nan-ci{-}{e}{ë}n
+ve-ge-ta-ri{-}{e}{ë}rs-bond
+twee{-}{e}{ë}n-der-tig-ste
+ko-nings-pin-gu{-}{i}{ï}ns
+ge{-}{e}{ë}n-quê-teer-den
+pa-ti{-}{e}{ë}n-tie-wer-ken
+pit-bull-ter-ri{-}{e}{ë}rs
+post-in-dus-tri{-}{e}{ë}-le
+ras-sen-the-o-rie{-}{e}{ë}n
+atoom-on-der-zee{-}{e}{ë}r
+im-mo-bi-li{-}{e}{ë}n-markt
+on-ge-co{-}{o}{ö}r-di-neerd
+on-ge{-}{e}{ë}-mo-ti-o-neerd
+ope-ra-tie-pa-ti{-}{e}{ë}nt
+ori{-}{e}{ë}n-ta-lis-tisch
+je-zu{-}{i}{ï}e-ten-pa-ters
+dis-con-ti-nu{-}{i}{ï}-teit
+drie{-}{e}{ë}n-der-tig-ste
+fan-tas-ma-go-rie{-}{e}{ë}n
+ge-des-ori{-}{e}{ë}n-teerd
+ge{-}{e}{ë}n-ga-geerd-heid
+ge{-}{i}{ï}m-pro-vi-seer-de
+griep-epi-de-mie{-}{e}{ë}n
+idi-o-syn-cra-sie{-}{e}{ë}n
+bui-ten-pa-ro-chi{-}{e}{ë}n
+chres-to-ma-thie{-}{e}{ë}n
+cli{-}{e}{ë}n-te-lis-tisch
+cli{-}{e}{ë}n-ten-be-stand
+au-to-bio-gra-fie{-}{e}{ë}n
+leu-ke-mie-pa-ti{-}{e}{ë}nt
+hoofd-in-gre-di{-}{e}{ë}nt
+pin-gu{-}{i}{ï}n-ver-blijf
+ge{-}{e}{ë}-van-ge-li-seerd
+rest-ca-te-go-rie{-}{e}{ë}n
+in-con-ve-ni{-}{e}{ë}n-ties
+pro-Is-ra{-}{e}{ë}-li-sche
+ge{-}{i}{ï}n-cri-mi-neer-de
+ge{-}{i}{ï}-ni-ti-a-li-seerd
+ge{-}{e}{ë}n-ca-nail-leerd
+ge{-}{i}{ï}r-ri-teerd-heid
+ge{-}{i}{ï}n-doc-tri-neerd
+kei-zers-pin-gu{-}{i}{ï}ns
+stem-mings-po{-}{e}{ë}-zie
+zorg-co{-}{o}{ö}r-di-na-tor
+hyp-no-the-ra-pie{-}{e}{ë}n
+ge-zins-fi-nan-ci{-}{e}{ë}n
+je-zu{-}{i}{ï}e-ten-school
+ge{-}{e}{ë}en-en-twin-tigd
+wijk-co{-}{o}{ö}r-di-na-tor
+ba-sis-in-gre-di{-}{e}{ë}nt
+ge{-}{i}{ï}n-ter-rum-peerd
+non-com-mer-ci{-}{e}{ë}-le
+ge-her-ori{-}{e}{ë}n-teerd
+kos-ten-ef-fi-ci{-}{e}{ë}nt
+mee-dis-cus-si{-}{e}{ë}-ren
+po{-}{e}{ë}-zie-fes-ti-vals
+pre-in-dus-tri{-}{e}{ë}-le
+pa-ti{-}{e}{ë}nt-ge-ge-vens
+con-sci{-}{e}{ë}n-ti-eu-zer
+pool-co{-}{o}{ö}r-di-na-ten
+oor-logs-tro-fee{-}{e}{ë}n
+mi-ni-bio-gra-fie{-}{e}{ë}n
+la-tex-al-ler-gie{-}{e}{ë}n
+klas-se-pa-ti{-}{e}{ë}n-ten
+ge{-}{i}{ï}n-ter-po-leer-de
+ge{-}{e}{ë}-lek-tri-seer-de
+ge{-}{e}{ë}-co-no-mi-seer-de
+doods-fan-ta-sie{-}{e}{ë}n
+deel-stra-te-gie{-}{e}{ë}n
+co{-}{o}{ö}r-di-naat-as-sen
+cli{-}{e}{ë}n-ten-krin-gen
+au-di{-}{e}{ë}n-tie-bla-den
+dif-fe-ren-ti{-}{e}{ë}-rend
+mo-no-the{-}{i}{ï}s-ti-sche
+team-co{-}{o}{ö}r-di-na-tor
+ge{-}{i}{ï}n-cor-po-reer-de
+su{-}{i}{ï}-ci-de-po-gin-gen
+leer-stra-te-gie{-}{e}{ë}n
+ge{-}{e}{ë}x-pli-ci-teer-de
+ge{-}{e}{ë}x-tra-po-leer-de
+niet-fi-nan-ci{-}{e}{ë}-le
+niet-es-sen-ti{-}{e}{ë}-le
+ge{-}{i}{ï}n-ten-si-veer-de
+ge{-}{i}{ï}n-tro-du-ceer-de
+top-in-dus-tri{-}{e}{ë}-len
+na-zi-sym-pa-thie{-}{e}{ë}n
+pa-tri-ci{-}{e}{ë}rs-hui-zen
+sys-teem-the-o-rie{-}{e}{ë}n
+ge-zins-the-ra-pie{-}{e}{ë}n
+hiv-ge{-}{i}{ï}n-fec-teer-de
+po{-}{e}{ë}-zie-lief-heb-ber
+me-ta-lin-gu{-}{i}{ï}s-tisch
+goed-ge{-}{i}{ï}n-for-meerd
+epi-lep-sie-pa-ti{-}{e}{ë}nt
+cli{-}{e}{ë}n-ten-ver-ha-len
+Frans-Po-ly-ne-si{-}{e}{ë}r
+he-ro{-}{i}{ï}-ne-han-de-laar
+psy-cho-the-ra-pie{-}{e}{ë}n
+ge{-}{i}{ï}n-for-ma-ti-seerd
+re-gio-co{-}{o}{ö}r-di-na-tor
+ge{-}{i}{ï}n-ven-ta-ri-seerd
+niet-in-dus-tri{-}{e}{ë}-le
+ori{-}{e}{ë}n-ta-tie-cur-sus
+ge{-}{i}{ï}-den-ti-fi-ceer-de
+pa-ti{-}{e}{ë}n-ten-be-stand
+niet-com-mer-ci{-}{e}{ë}-le
+on-ge{-}{i}{ï}n-te-res-seerd
+twee{-}{e}{ë}n-twin-tig-ste
+va-cu{-}{u}{ü}m-ver-pak-king
+so-cio-lin-gu{-}{i}{ï}s-tiek
+staats-mo-no-po-li{-}{e}{ë}n
+ri-bo-nu-cle{-}{i}{ï}-ne-zuur
+pok-ken-epi-de-mie{-}{e}{ë}n
+psy-cho-hy-gi{-}{e}{ë}-nisch
+on-ge-co{-}{o}{ö}r-di-neer-de
+ori{-}{e}{ë}n-ta-tie-be-zoek
+ori{-}{e}{ë}n-ta-tie-pun-ten
+je-zu{-}{i}{ï}e-ten-col-le-ge
+le-pro-zen-ko-lo-ni{-}{e}{ë}n
+drie{-}{e}{ë}n-twin-tig-ste
+ge-des-ori{-}{e}{ë}n-teer-de
+ge-ma-ni{-}{e}{ë}-reerd-heid
+groeps-the-ra-pie{-}{e}{ë}n
+cor-ti-co-ste-ro{-}{i}{ï}-den
+as-te-ro{-}{i}{ï}-den-gor-del
+be-com-men-ta-ri{-}{e}{ë}-ren
+be-doe{-}{i}{ï}en-en-ten-ten
+atoom-on-der-zee{-}{e}{ë}rs
+in-koop-co{-}{o}{ö}-pe-ra-tie
+je-zu{-}{i}{ï}e-ten-scho-len
+ori{-}{e}{ë}n-ta-lis-ti-sche
+kleur-va-ri{-}{e}{ë}-tei-ten
+ex-kan-ker-pa-ti{-}{e}{ë}nt
+agro-in-dus-tri{-}{e}{ë}-le
+jeugd-co{-}{o}{ö}r-di-na-tor
+Nieuw-Ca-le-do-ni{-}{e}{ë}r
+pa-ti{-}{e}{ë}n-ten-dos-sier
+alz-hei-mer-pa-ti{-}{e}{ë}nt
+im-mo-bi-li{-}{e}{ë}n-sec-tor
+ge{-}{e}{ë}-ty-mo-lo-gi-seerd
+ba-sis-che-mi-ca-li{-}{e}{ë}n
+pa-tri-ci{-}{e}{ë}rs-wo-ning
+ge{-}{e}{ë}-lek-tro-cu-teerd
+ge{-}{i}{ï}n-stru-men-teerd
+we-reld-ori{-}{e}{ë}n-ta-tie
+niet-co{-}{o}{ö}-pe-ra-tief
+pa-ti{-}{e}{ë}nt-ma-te-ri-aal
+markt-stra-te-gie{-}{e}{ë}n
+re{-}{i}{ï}n-car-na-tie-leer
+cli{-}{e}{ë}n-ten-re-ke-ning
+he-mo-fi-lie-pa-ti{-}{e}{ë}nt
+cli{-}{e}{ë}n-ten-plat-form
+ge{-}{e}{ë}-lek-tri-fi-ceerd
+ge{-}{e}{ë}x-com-mu-ni-ceerd
+pa-ti{-}{e}{ë}n-ten-stro-men
+he-ro{-}{i}{ï}-ne-ge-brui-ker
+ba-sis-in-dus-trie{-}{e}{ë}n
+cli{-}{e}{ë}n-te-lis-ti-sche
+twee-deurs-au-t{o-}{}{oo}tje
+le-vens-ori{-}{e}{ë}n-ta-tie
+an-nu{-}{i}{ï}-tei-ten-ba-sis
+zui-vel-co{-}{o}{ö}-pe-ra-tie
+ge{-}{e}{ë}u-ro-pe-a-ni-seerd
+speel-goed-au-t{o-}{}{oo}tje
+ano-rexia-pa-ti{-}{e}{ë}n-te
+ge{-}{i}{ï}n-ter-na-li-seerd
+mi-li-eu-hy-gi{-}{e}{ë}-nisch
+ge{-}{e}{ë}x-pe-ri-men-teerd
+on-ge{-}{e}{ë}-man-ci-peer-de
+te-ta-nus-bac-te-ri{-}{e}{ë}n
+se-mi-in-dus-tri{-}{e}{ë}-le
+re-li-kwie{-}{e}{ë}n-kast-je
+pa-ti{-}{e}{ë}nt-si-tu-a-ties
+on-ge{-}{i}{ï}l-lu-streer-de
+net-co{-}{o}{ö}r-di-na-to-ren
+mee-ge{-}{i}{ï}n-stal-leerd
+ma-la-ria-pa-ti{-}{e}{ë}n-ten
+in-cest-the-ra-pie{-}{e}{ë}n
+ge{-}{i}{ï}n-ter-rum-peer-de
+ge{-}{i}{ï}n-ter-pun-geer-de
+ge{-}{e}{ë}x-ter-na-li-seerd
+ge{-}{e}{ë}-van-ge-li-seer-de
+ge{-}{e}{ë}-lek-tro-ly-seerd
+dif-fe-ren-ti{-}{e}{ë}-ren-de
+twee{-}{e}{ë}n-veer-tig-ste
+hoofd-ca-te-go-rie{-}{e}{ë}n
+ge{-}{i}{ï}n-ter-pre-teer-de
+di-a-ly-se-pa-ti{-}{e}{ë}n-ten
+pa-ti{-}{e}{ë}n-ten-rech-ten
+ge{-}{i}{ï}m-ple-men-teer-de
+pa-ti{-}{e}{ë}n-ten-groe-pen
+ge{-}{i}{ï}n-doc-tri-neer-de
+ge{-}{i}{ï}n-te-res-seer-den
+com-plot-the-o-rie{-}{e}{ë}n
+as-te-ro{-}{i}{ï}-den-gor-dels
+ge-drags-the-ra-pie{-}{e}{ë}n
+evo-lu-tie-the-o-rie{-}{e}{ë}n
+bor-der-li-ne-pa-ti{-}{e}{ë}nt
+trein-be{-}{i}{ï}n-vloe-ding
+school-co{-}{o}{ö}r-di-na-tor
+po{-}{e}{ë}-zie-tijd-schrift
+me-ta-lin-gu{-}{i}{ï}s-ti-sche
+je-zu{-}{i}{ï}e-ten-kloos-ter
+hu-we-lijks-quo-ti{-}{e}{ë}nt
+be{-}{i}{ï}n-vloe-dings-waan
+ge{-}{e}{ë}n-thou-si-as-meerd
+kruis-sub-si-di{-}{e}{ë}-ring
+mi-li-eu-co{-}{o}{ö}r-di-na-tor
+links-ge-o-ri{-}{e}{ë}n-teerd
+de-fi-ci{-}{e}{ë}n-tie-ziek-te
+ver-koop-co{-}{o}{ö}-pe-ra-tie
+ope-ra-tie-pa-ti{-}{e}{ë}n-ten
+che-mi-ca-li{-}{e}{ë}n-tan-ker
+zen-der-co{-}{o}{ö}r-di-na-tor
+co{-}{o}{ö}r-di-na-tie-or-gaan
+be{-}{i}{ï}n-vloed-baar-heid
+be-roeps-ori{-}{e}{ë}n-ta-tie
+goed-ge{-}{i}{ï}n-for-meer-de
+pa-ti{-}{e}{ë}n-ten-dos-siers
+he-ro{-}{i}{ï}-ne-ge-brui-kers
+volks-de-mo-cra-tie{-}{e}{ë}n
+volks-ety-mo-lo-gie{-}{e}{ë}n
+zie-ken-huis-pa-ti{-}{e}{ë}nt
+ve-ge-ta-ri{-}{e}{ë}rs-bon-den
+hoofd-in-gre-di{-}{e}{ë}n-ten
+schil-der-aca-de-mi{-}{e}{ë}n
+ge-meen-te-fi-nan-ci{-}{e}{ë}n
+psy-cho-lin-gu{-}{i}{ï}s-tiek
+pa-ti{-}{e}{ë}n-ten-plat-form
+ener-gie-ef-fi-ci{-}{e}{ë}nt
+groot-in-dus-tri{-}{e}{ë}-len
+on-ge{-}{i}{ï}n-te-res-seer-de
+je-zu{-}{i}{ï}e-ten-col-le-ges
+leu-ke-mie-pa-ti{-}{e}{ë}n-ten
+dis-con-ti-nu{-}{i}{ï}-tei-ten
+don-qui-chot-te-rie{-}{e}{ë}n
+he-ro{-}{i}{ï}-ne-ver-sla-ving
+cli{-}{e}{ë}n-ten-be-stan-den
+co{-}{o}{ö}r-di-na-tie-cen-tra
+hiv-ge{-}{i}{ï}n-fec-teer-de
+le-vens-be{-}{e}{ë}in-di-ging
+twee{-}{e}{ë}n-der-tig-ja-rig
+vei-lig-heids-va-cu{-}{u}{ü}m
+mi-grai-ne-pa-ti{-}{e}{ë}n-ten
+be-drijfs-fi-nan-ci{-}{e}{ë}n
+ram-pen-co{-}{o}{ö}r-di-na-tor
+in-gre-di{-}{e}{ë}n-ten-lijst
+cli{-}{e}{ë}nt-volg-sys-teem
+co{-}{o}{ö}r-di-naat-stel-sel
+melk-zuur-bac-te-ri{-}{e}{ë}n
+drie{-}{e}{ë}n-der-tig-ja-rig
+dif-fe-ren-ti{-}{e}{ë}-rin-gen
+team-co{-}{o}{ö}r-di-na-tri-ce
+wo-ning-co{-}{o}{ö}-pe-ra-ties
+kos-ten-ef-fi-ci{-}{e}{ë}n-tie
+ano-rexia-pa-ti{-}{e}{ë}n-ten
+on-ge{-}{i}{ï}-den-ti-fi-ceerd
+im-mo-bi-li{-}{e}{ë}n-kan-toor
+he-ro{-}{i}{ï}-ne-ver-slaaf-de
+in-ter-mi-nis-te-ri{-}{e}{ë}-le
+pa-tri-ci{-}{e}{ë}rs-fa-mi-lie
+re-li-kwie{-}{e}{ë}n-kast-jes
+ma-la-ria-epi-de-mie{-}{e}{ë}n
+ge{-}{e}{ë}x-ter-na-li-seer-de
+ge{-}{e}{ë}x-com-mu-ni-ceer-de
+co{-}{o}{ö}-pe-ra-tie-win-kels
+cli{-}{e}{ë}n-ten-plat-forms
+tu-ber-kel-bac-te-ri{-}{e}{ë}n
+zorg-co{-}{o}{ö}r-di-ne-ren-de
+mi-li-eu-co{-}{o}{ö}-pe-ra-ties
+boe-ren-co{-}{o}{ö}-pe-ra-ties
+ba-sis-in-gre-di{-}{e}{ë}n-ten
+ge{-}{e}{ë}-lek-tro-cu-teer-de
+ge{-}{e}{ë}-lek-tri-fi-ceer-de
+bij-stands-cli{-}{e}{ë}n-ten
+pa-ti{-}{e}{ë}n-ten-ge-ge-vens
+ge{-}{i}{ï}n-ven-ta-ri-seer-de
+kos-ten-ca-te-go-rie{-}{e}{ë}n
+zorg-co{-}{o}{ö}r-di-na-to-ren
+co-ca{-}{i}{ï}-ne-ge-brui-kers
+milt-vuur-bac-te-ri{-}{e}{ë}n
+mi-li-eu-hy-gi{-}{e}{ë}-ni-sche
+po{-}{e}{ë}-zie-lief-heb-bers
+al-ler-gie-pa-ti{-}{e}{ë}n-ten
+di-a-be-tes-pa-ti{-}{e}{ë}n-ten
+pa-tri-ci{-}{e}{ë}rs-fa-mi-lies
+de-fi-ci{-}{e}{ë}n-tie-ziek-tes
+va-cu{-}{u}{ü}m-ver-pak-kin-gen
+tekst-ge-o-ri{-}{e}{ë}n-teer-de
+re{-}{i}{ï}n-car-na-tie-ses-sie
+co{-}{o}{ö}r-di-na-ten-sys-teem
+co{-}{o}{ö}r-di-na-ten-stel-sel
+cli{-}{e}{ë}n-ten-in-for-ma-tie
+cli{-}{e}{ë}n-ten-be-spre-king
+be-leids-co{-}{o}{ö}r-di-na-tor
+an-nu{-}{i}{ï}-tei-ten-sys-teem
+de-fi-ci{-}{e}{ë}n-tie-ziek-ten
+ge{-}{i}{ï}n-di-vi-du-a-li-seerd
+ori{-}{e}{ë}n-ta-tie-be-zoe-ken
+im-mo-bi-li{-}{e}{ë}n-kan-to-ren
+hiv-ge{-}{i}{ï}n-fec-teer-den
+al-machts-fan-ta-sie{-}{e}{ë}n
+ener-gie-ef-fi-ci{-}{e}{ë}n-te
+ma-la-ria-epi-de-mie{-}{e}{ë}n
+drie{-}{e}{ë}n-der-tig-ja-ri-ge
+links-ge-o-ri{-}{e}{ë}n-teer-de
+spits-tech-no-lo-gie{-}{e}{ë}n
+over-heids-fi-nan-ci{-}{e}{ë}n
+zie-ken-fonds-pa-ti{-}{e}{ë}nt
+stu-den-ten-so-ci{-}{e}{ë}-teit
+he-ro{-}{i}{ï}-ne-ver-slaaf-den
+pro-ject-co{-}{o}{ö}r-di-na-tor
+bak-ke-rij-in-gre-di{-}{e}{ë}nt
+co{-}{o}{ö}r-di-na-tie-cen-trum
+land-bouw-co{-}{o}{ö}-pe-ra-tie
+cho-le-ra-epi-de-mie{-}{e}{ë}n
+co-ca{-}{i}{ï}-ne-in-spui-ting
+oud-par-le-men-ta-ri{-}{e}{ë}r
+twee{-}{e}{ë}n-der-tig-ja-ri-ge
+han-dels-com-pag-nie{-}{e}{ë}n
+ge{-}{i}{ï}n-du-stri-a-li-seerd
+co{-}{o}{ö}r-di-na-tie-co-mi-té
+Eu-ro-par-le-men-ta-ri{-}{e}{ë}r
+alz-hei-mer-pa-ti{-}{e}{ë}n-ten
+che-mi-ca-li{-}{e}{ë}n-tan-kers
+idee{-}{e}{ë}n-ge-schie-de-nis
+be{-}{i}{ï}n-vloe-dings-wa-nen
+be-leids-co{-}{o}{ö}r-di-na-tie
+ori{-}{e}{ë}n-ta-tie-ver-mo-gen
+che-mi-ca-li{-}{e}{ë}n-ge-bruik
+pa-ti{-}{e}{ë}n-ten-plat-forms
+tran-sis-tor-ra-di-{o-}{}{oo}tje
+twee{-}{e}{ë}n-twin-tig-ja-rig
+he-ro{-}{i}{ï}-ne-ex-pe-ri-ment
+drie{-}{e}{ë}n-twin-tig-ja-rig
+ver-ma-ge-rings-di{-}{e}{ë}-ten
+ope-nings-ce-re-mo-ni{-}{e}{ë}n
+ge-spreks-the-ra-pie{-}{e}{ë}n
+on-ge{-}{i}{ï}-den-ti-fi-ceer-de
+he-mo-fi-lie-pa-ti{-}{e}{ë}n-ten
+epi-lep-sie-pa-ti{-}{e}{ë}n-ten
+vis-sers-co{-}{o}{ö}-pe-ra-ties
+re-gio-co{-}{o}{ö}r-di-na-to-ren
+pso-ri-a-sis-pa-ti{-}{e}{ë}n-ten
+he-ro{-}{i}{ï}-ne-pros-ti-tu-ees
+ge{-}{e}{ë}n-thou-si-as-meer-de
+co{-}{o}{ö}r-di-naat-stel-sels
+co-ca{-}{i}{ï}-ne-trans-por-ten
+cli{-}{e}{ë}n-ten-re-ke-nin-gen
+be-roeps-ca-te-go-rie{-}{e}{ë}n
+hy-gi{-}{e}{ë}-ne-maat-re-ge-len
+sa-la-ris-ca-te-go-rie{-}{e}{ë}n
+markt-ge-o-ri{-}{e}{ë}n-teer-de
+le-vens-be{-}{e}{ë}in-di-gen-de
+co-ca{-}{i}{ï}-ne-ver-slaaf-den
+pro-duct-ca-te-go-rie{-}{e}{ë}n
+co{-}{o}{ö}r-di-na-tie-co-mi-tés
+su{-}{i}{ï}-ci-de-pro-ble-ma-tiek
+pa-ti{-}{e}{ë}n-ten-bij-slui-ter
+dif-fe-ren-tie-quo-ti{-}{e}{ë}nt
+pro-bleem-de-fi-ni{-}{e}{ë}-ring
+top-sport-co{-}{o}{ö}r-di-na-tor
+he-ro{-}{i}{ï}-ne-ver-strek-king
+land-bouw-che-mi-ca-li{-}{e}{ë}n
+oog-hand-co{-}{o}{ö}r-di-na-tie
+le-gi-o-nel-la-bac-te-ri{-}{e}{ë}n
+po-li-tiek-fi-nan-ci{-}{e}{ë}-le
+zie-ken-huis-pa-ti{-}{e}{ë}n-ten
+ver-bruiks-co{-}{o}{ö}-pe-ra-tie
+pa-ti{-}{e}{ë}n-ten-ver-e-ni-ging
+ori{-}{e}{ë}n-ta-tie-cur-sus-sen
+oud-par-le-men-ta-ri{-}{e}{ë}rs
+pa-ti{-}{e}{ë}n-ten-in-for-ma-tie
+twee{-}{e}{ë}n-twin-tig-ja-ri-ge
+be-drijfs-be{-}{e}{ë}in-di-ging
+arts-pa-ti{-}{e}{ë}nt-re-la-tie
+cam-pag-ne-co{-}{o}{ö}r-di-na-tor
+co{-}{o}{ö}r-di-na-ten-sys-te-men
+re{-}{i}{ï}n-car-na-tie-the-o-rie
+ener-gie-ef-fi-ci{-}{e}{ë}n-tie
+ge-drags-be{-}{i}{ï}n-vloe-ding
+bor-der-li-ne-pa-ti{-}{e}{ë}n-ten
+drie{-}{e}{ë}n-twin-tig-ja-ri-ge
+Eu-ro-par-le-men-ta-ri{-}{e}{ë}rs
+land-bouw-co{-}{o}{ö}-pe-ra-ties
+school-co{-}{o}{ö}r-di-na-to-ren
+re-gres-sie-the-ra-pie{-}{e}{ë}n
+pro-ces-tech-no-lo-gie{-}{e}{ë}n
+ob-ject-ge-o-ri{-}{e}{ë}n-teer-de
+ma-na-ge-ment-the-o-rie{-}{e}{ë}n
+co{-}{o}{ö}r-di-na-ten-stel-sels
+ci-lin-der-co{-}{o}{ö}r-di-na-ten
+be-stu-rings-the-o-rie{-}{e}{ë}n
+be-drijfs-stra-te-gie{-}{e}{ë}n
+pa-ti{-}{e}{ë}n-ten-po-pu-la-ties
+in-ko-mens-ca-te-go-rie{-}{e}{ë}n
+ge{-}{i}{ï}n-di-vi-du-a-li-seer-de
+ge{-}{i}{ï}n-du-stri-a-li-seer-de
+pro-duc-tie-stra-te-gie{-}{e}{ë}n
+re{-}{i}{ï}n-car-na-tie-the-ra-pie
+net-werk-tech-no-lo-gie{-}{e}{ë}n
+con-ti-nu{-}{i}{ï}-teits-stre-ven
+cli{-}{e}{ë}n-ten-voor-lich-ting
+doel-groep-de-fi-ni{-}{e}{ë}-ring
+on-ge{-}{i}{ï}n-te-res-seerd-heid
+an-nu{-}{i}{ï}-tei-ten-hy-po-theek
+pro-gram-ma-co{-}{o}{ö}r-di-na-tor
+kun-ste-naars-so-ci{-}{e}{ë}-teit
+zie-ken-fonds-pa-ti{-}{e}{ë}n-ten
+ver-bruiks-co{-}{o}{ö}-pe-ra-ties
+stu-den-ten-so-ci{-}{e}{ë}-tei-ten
+ori{-}{e}{ë}n-te-rings-ver-mo-gen
+in-flu-en-za-epi-de-mie{-}{e}{ë}n
+leef-tijds-ca-te-go-rie{-}{e}{ë}n
+drie{-}{e}{ë}n-twin-tig-dui-zend
+bak-ke-rij-in-gre-di{-}{e}{ë}n-ten
+co{-}{o}{ö}r-di-na-tie-com-mis-sie
+ar-chi-tec-tuur-bi{-}{e}{ë}n-na-le
+be-las-ting-co{-}{o}{ö}r-di-na-tie
+Equa-to-ri-aal-Gui-nee{-}{e}{ë}r
+co{-}{o}{ö}r-di-na-to-ren-over-leg
+ge-meen-te-se-cre-ta-rie{-}{e}{ë}n
+dif-fu-sie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
+be-drijfs-con-ti-nu{-}{i}{ï}-teit
+mi-li-tair-in-dus-tri{-}{e}{ë}-le
+pa-ti{-}{e}{ë}n-ten-or-ga-ni-sa-tie
+vrije-markt-eco-no-mie{-}{e}{ë}n
+voe-dings-in-gre-di{-}{e}{ë}n-ten
+pa-ti{-}{e}{ë}nt-vrien-de-lij-ker
+on-der-houds-the-ra-pie{-}{e}{ë}n
+mar-ke-ting-fi-lo-so-fie{-}{e}{ë}n
+fil-ter-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
+com-bi-na-tie-the-ra-pie{-}{e}{ë}n
+cli{-}{e}{ë}n-ten-be-spre-kin-gen
+brand-won-den-pa-ti{-}{e}{ë}n-ten
+af-stam-mings-the-o-rie{-}{e}{ë}n
+hy-gi{-}{e}{ë}-ne-voor-schrif-ten
+co{-}{o}{ö}r-di-na-tie-pro-ble-men
+cli{-}{e}{ë}n-ten-or-ga-ni-sa-ties
+tu-ber-cu-lo-se-pa-ti{-}{e}{ë}n-ten
+borst-kan-ker-pa-ti{-}{e}{ë}n-ten
+mar-ke-ting-stra-te-gie{-}{e}{ë}n
+rich-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
+eco-no-misch-fi-nan-ci{-}{e}{ë}-le
+op-lei-dings-co{-}{o}{ö}r-di-na-tor
+pa-ti{-}{e}{ë}n-ten-voor-lich-ting
+pa-ti{-}{e}{ë}n-ten-de-mon-stra-tie
+op-los-sings-stra-te-gie{-}{e}{ë}n
+in-tel-li-gen-tie-quo-ti{-}{e}{ë}nt
+ge{-}{i}{ï}n-ter-na-ti-o-na-li-seerd
+re{-}{i}{ï}n-car-na-tie-the-ra-peut
+dif-fe-ren-ti-aal-quo-ti{-}{e}{ë}nt
+wrij-vings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
+on-der-zoeks-co{-}{o}{ö}r-di-na-tor
+ge{-}{i}{ï}n-sti-tu-ti-o-na-li-seerd
+co{-}{o}{ö}r-di-na-tie-com-mis-sies
+pa-ti{-}{e}{ë}n-ten-ver-e-ni-gin-gen
+dif-fe-ren-tie-quo-ti{-}{e}{ë}n-ten
+be-leg-gings-stra-te-gie{-}{e}{ë}n
+ver-pleeg-huis-pa-ti{-}{e}{ë}n-ten
+niet-ge{-}{i}{ï}-den-ti-fi-ceer-de
+ge-lei-dings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
+maat-schap-pij-ori{-}{e}{ë}n-ta-tie
+vei-lig-heids-co{-}{o}{ö}r-di-na-tor
+pa-ti{-}{e}{ë}n-ten-de-mon-stra-ties
+im-mo-bi-li{-}{e}{ë}n-maat-schap-pij
+ef-fi-ci{-}{e}{ë}n-tie-ver-be-te-ring
+cor-re-la-tie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
+ont-wik-ke-lings-the-o-rie{-}{e}{ë}n
+dif-fu-sie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
+ca-su{-}{i}{ï}s-tiek-be-spre-kin-gen
+ge{-}{i}{ï}n-sti-tu-ti-o-na-li-seer-de
+over-le-vings-stra-te-gie{-}{e}{ë}n
+lan-ge-ter-mijn-stra-te-gie{-}{e}{ë}n
+fi-nan-ci{-}{e}{ë}-le-dien-sten-groep
+uit-zet-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
+con-ti-nu{-}{i}{ï}-teits-over-we-ging
+wrij-vings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
+rich-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
+col-le-ga-par-le-men-ta-ri{-}{e}{ë}rs
+on-der-ne-mings-stra-te-gie{-}{e}{ë}n
+cor-re-la-tie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
+be-sluit-vor-mings-the-o-rie{-}{e}{ë}n
+be{-}{i}{ï}n-vloe-dings-mo-ge-lijk-heid
+uit-zet-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
+her-ori{-}{e}{ë}n-te-rings-ge-sprek-ken
+con-ti-nu{-}{i}{ï}-teits-over-we-gin-gen
+com-mu-ni-ca-tie-tech-no-lo-gie{-}{e}{ë}n
+be{-}{i}{ï}n-vloe-dings-mo-ge-lijk-he-den
diff --git a/tex/context/patterns/lang-nl.rme b/tex/context/patterns/lang-nl.rme
new file mode 100644
index 000000000..9b3a852ab
--- /dev/null
+++ b/tex/context/patterns/lang-nl.rme
@@ -0,0 +1,98 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: nehyph96.tex (yyyy-mm-dd)
+% Author: Piet Tutelaers
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% PURPOSE: 8-bit hyphenation patterns for TeX based upon the new Dutch
+% spelling, officially since 1 August 1996. These patterns follow
+% the new hyphenation rules in the `Woordenlijst Nederlandse
+% Taal, SDU Uitgevers, Den Haag 1995' (the so called `Groene
+% Boekje') described in section 5.2 (Het afbreekteken).
+%
+% The main differences with our earlier patterns based upon the
+% CELEX dictionary are:
+% (1) provide 8-bit patterns based upon the T1 character encoding
+% (the encoding for DC/EC compatible TeX fonts)
+% (2) don't hyphenate if this results in a syllable of one letter
+% before or after the hyphen (hence hyphens in a-drenaline,
+% studi-o, mensa-pen and vide-oachtig are invalid)
+% (3) handle words derived from other languages (`bastaard
+% woorden') according to the new rules
+%
+% Like the CELEX patterns these patterns don't hyphenate:
+% (4) in a changing syllable (menuutje can not be hyphenated as
+% menu-tje)
+% (5) in words that have different hyphenations according to
+% there meaning (buur-tje/buurt-je)
+%
+% COPYRIGHT (C) 1996: Piet Tutelaers
+%
+% -----------------------------------------------------------------
+% IMPORTANT NOTICE:
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+% -----------------------------------------------------------------
+% VERSION: 1.1 (November 1996) Copyright changed March 2000
+%
+% AUTHOR: Piet Tutelaers P.T.H.Tutelaers@tue.nl
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-nl.rpl b/tex/context/patterns/lang-nl.rpl
new file mode 100644
index 000000000..7622711ec
--- /dev/null
+++ b/tex/context/patterns/lang-nl.rpl
@@ -0,0 +1,12948 @@
+.aan1
+.aans4
+.aart4
+.aarts3
+.aat1
+.ab1l
+.acht3s
+.ad1s
+.af1
+.air1
+.al3ee
+.aline3a'
+.al3k2
+.alko3v
+.al3om
+.al4st
+.an1d
+.an3gl
+.an1s
+.an3th
+.ar3tr
+.as1c
+.as1l
+.as3tr
+.aus1
+.a-2
+.baan3
+.ba3lo
+.bli2
+.ca4pe
+.co2k
+.co3ro
+.c-2
+.dag3r
+.dag3s
+.da4te.
+.da4tes
+.de4k3l
+.dek3s
+.den4k3l
+.den4k3r
+.de1o
+.de3ra
+.des3tr
+.di3ac
+.di3ad
+.di4aloo
+.di4at
+.die4pi
+.dier3o
+.die3tj
+.di1o
+.di2s
+.doet3
+.do1v
+.du3ro
+.du4wer
+.d-2
+.ede4la
+.ed1w
+.ee2
+.een3e
+.eet1
+.ei1l
+.ei3sp
+.eks2
+.el1d
+.en3th
+.en3tj
+.er3af
+.er4f3l
+.er3in
+.er3on
+.es1
+.eten4d
+.et3sten
+.etui3
+.eu1
+.eus1
+.e-2
+.fra4me.
+.f-2
+.ga4me.
+.gea3v
+.ge3d
+.ge3l4a
+.gelo3v
+.ge3nac
+.ge3n4as
+.ge3n4o
+.ge3ra
+.ge3r4e
+.ge3ro
+.gerst3a
+.ges4k
+.geto3v
+.get4r
+.ge3v
+.g-2
+.haat3
+.he2a
+.he4r3i
+.hier3
+.ho4les
+.huts3t
+.h-2
+.ij4s3l
+.ijs3p
+.ijs3t
+.in1a2
+.in1d4
+.in1e
+.in5g4
+.in3kl
+.in3kr
+.in1s2
+.is1c
+.iso1
+.i-2
+.ka3dr
+.keet3je.
+.ken3s
+.ke3ra
+.ker4k3l
+.ker4k3u
+.ko3pe
+.ko4p5l
+.kore4
+.ko1v
+.laat4j
+.laat3ste
+.la3tr
+.le2b1
+.leer3
+.leg3o
+.le4g3r
+.lei3s4
+.lens3
+.lente3
+.le5r4
+.le2s1
+.le3th
+.li2f
+.lin4k3j
+.lo1v
+.lu1e
+.luid3s4
+.lui3tj
+.maat3
+.ma4k3as
+.me3la
+.me3ra
+.mer4k3l
+.met3ee
+.miet3j
+.mij4n3i
+.mi4ne.
+.mos1
+.mo4st
+.mo3ven
+.mo3ver
+.naat3
+.na1k
+.na1l
+.na1s
+.ne2k1
+.nes3te
+.ne4t3j
+.ne4tr
+.neu4t3j
+.niet3j
+.no3pe
+.no1v
+.nucle4
+.oce1
+.oe2r1
+.oes1
+.of1
+.oi2
+.ol1f
+.olie3
+.om1
+.on1d
+.on3ee
+.on3et
+.on1i
+.on1k
+.on3oo
+.on1s
+.on4t3ee
+.on4t3e4ren
+.on4t3e4ri
+.on4trad
+.on4tri
+.on4t3rol
+.oor1
+.oot4je.
+.op5l
+.op1r
+.ops2
+.orkes5tree
+.or1t
+.os1
+.ove4re
+.ove4rin
+.pee3tj
+.pe3lo
+.pe3na
+.peri3
+.per4s3te.
+.piet3j
+.pi4naa
+.pla4cem
+.plee3t
+.poort3j
+.po4st
+.po1v
+.pui3tj
+.quo4te.
+.raat4
+.radi3o'
+.rat3j
+.rea4n
+.ree3t
+.regi3o'
+.re3kr
+.re4men
+.re3no
+.reno3v
+.ren3s
+.re4sc
+.ries3
+.rie4t3a
+.riet3j
+.rij3sp
+.ring3s4
+.ri1o
+.roe3tj
+.ro2l1
+.ro4s3t
+.ro1v
+.rug1
+.ruit3j
+.ru2s
+.rus3h
+.sa1v
+.scenari5o'
+.sci1
+.see1
+.se3ra
+.se3r4e
+.ser4ve.
+.ser4ves
+.set1
+.side3
+.si4te
+.sj2
+.sli4c
+.so2k
+.sour4c
+.spoor3
+.st4
+.stel4t3j
+.ste4m
+.sto3v
+.studi3o'
+.taart3j
+.tag1
+.te2a
+.ten3ac
+.te3nan
+.te3no
+.ten3s
+.tent3j
+.ter4p3a
+.ter3s
+.te2s
+.ti4me.
+.ti4med
+.ti2n
+.tin3a4
+.to4lo
+.toot4j
+.to4pl
+.to1v
+.traat4
+.ts2
+.tu4ne.
+.ui1s
+.ur4a
+.vaart5jes
+.va3lo
+.vent3j
+.ver3a
+.ve4rei
+.ve4r3e4r
+.ve4rij
+.ves1
+.vet3j
+.ve4t3r
+.vide3o'
+.vloot4j
+.voy1
+.vul1
+.v-2
+.wal4s3te.
+.wa2v
+.wee4t3
+.we4l3a
+.we4l3in
+.wen4s3t
+.wer4kr
+.wer4pl
+.west3r
+.wi2n
+.win4s
+.wi2r
+.wi2t1
+.xe1
+.x-2
+.zet3j
+.zi2t1
+a2a2
+aad1a
+aad1e
+aad1o2
+aad1r
+aaf1
+aag1
+aags4o
+aai1
+aak1a
+aak1e2
+aak1i
+aak1l
+aak1o
+aak1r
+aak3sp
+aak1u
+aal1a2
+aal1e
+aal1i
+aal1k
+aal1o2
+aal3so
+aal1u
+aam1a
+aam1p
+aan1a
+3aandee
+3aandu
+aan1e2
+aan3g
+3aanges
+aan1i2
+aan1k
+1aann
+aan1o2
+aans4po
+aan1t
+3aanva
+3aanvr
+aap1a
+aap1i
+aap1o2
+aap1r
+aar1a2
+aar4du
+aar1e2
+aar1i
+aar1k
+aar1o2
+aas1e2
+aas1l
+aas1p
+aat1a2
+aat1e
+aat3ha
+aat3ho
+aat1i
+aat1o
+aat1r
+2abaa
+abak4s
+aba2l
+abe4laa
+abe4l3ac
+abe4l3o4
+2abes
+3abolo
+abo1s
+abot4j
+ab1ru
+1abso
+a3cal
+2ace
+a2ce.
+a2cea
+a2cec
+a2cef
+a3cen
+a4cepa
+ace1s
+a4cesp
+a4cest
+a2cew
+a1cha
+a1che
+a4cheg
+a1chi
+ach1l
+a1cho
+a1chr
+4achrone
+4achs
+a1chu
+2acl
+2a1co
+ac4tac
+ac4tav
+actmana4
+ac4ton
+ad1ac
+ad1a2d
+ad1ak
+ada2r1
+adas1
+ad1au
+2add
+ade3roo
+ade3st
+adi1a
+adoe4l3
+1adop
+ad1ov
+a1dri
+ad3rui
+ad3spi
+ad3sta
+ad3ste
+1advi
+ad1w
+aeger3
+ae1k2
+a1el
+ae1n
+a1ep
+ae1r
+aes1t
+ae1t
+af2as
+af2at
+af1d
+afd1s
+2afe
+a2f1ei
+afe4l3a
+1affa
+1afgo
+1afha
+2afi
+afie3tj
+af1l
+af4les
+2afo
+af1oe
+a1fol
+af2or
+af3org
+af1re
+af1ru
+af1s
+4afs.
+af2sh
+afs2m
+afs2o
+afs2t
+af1ta
+af1ui
+1afva
+2afy
+2ag.
+ag1a2d
+a2ga2r1
+ag1dr
+a3ge.
+agea2
+4a3gen.
+age3ra
+ager4s3
+ages2
+a4g3ind
+a4g3ins
+agi3ot
+2agl
+ag1le
+ag1li
+a2gn
+ag1of
+4agonal
+a1goo
+ag3ope
+ag3ord
+ago1v
+ag3rap
+ag3red
+ag3reg
+ag3ren
+2agro
+ag1ru
+ag2sh
+ag3slo
+ag3slu
+agsto4
+agu1a
+a2g1ui
+a2g1u2r
+a2g1uu
+a1ha
+a1he
+a1hi
+ah1l
+a1ho
+a1hu
+a1hy2
+a1h
+ai1a2
+aids1
+ai1e
+aier3s
+ai1k
+ail1s2
+aime2
+ain3st
+ai1o
+ai1p
+a2ir
+ai1so2
+ais2t
+ai1tj
+ait1s
+ai2-c
+a1j
+aje2
+ak1ac
+ak1af
+ak1a2g
+ak1al
+ak1ap
+ak3arb
+ak1av
+a2k1e2d
+a4keen
+a2kef
+a2keg
+a2keh
+ak3emi
+4akene
+ake1s
+ake4ti
+ak3etu
+a2kev
+a2kew
+a2k1e2z
+ak1id
+aki1s2
+ak1j
+ak3laa
+ak3lag
+ak3lee
+ak3ler
+ak3let
+ak1li
+ak1lu
+ak1n
+ak2ni
+a2k1on
+a2k1op
+a2k1or
+ak1ru
+ak1sl
+ak3spe
+ak3sti
+ak3sto
+ak3str
+ak1ta
+akt1h
+ak1to
+aku2
+ak1ui
+ak1ur
+ak1w
+a1la.
+a1lab
+2alad
+al3adr
+a1lag
+a1lal
+a1lam
+al3ana
+a3lant
+a3lari
+al3art
+a1laz
+a1la'
+al1da
+al1do
+aldo3v
+al1dr
+a1le
+ale2c
+4alectst
+a2l1e2l
+ale2n
+a4l3ento
+ale3og
+ale3olo
+ale3ro
+a4lesm
+a4lesp
+ale4tj
+alf1l
+al3fon
+al4fur
+al1go
+a1li
+a2lik
+al3int
+al4k3ei
+al1kl
+al4k3laa
+al1kr
+alk3st
+3allia
+a1lo.
+a1log
+4alogen
+4aloger
+al3omv
+4aloogr
+4aloogt
+4aloogv
+al3oor
+al3opl
+al1ou
+al1ov
+al1ox
+al1p
+al3s4ag
+al3s4cr
+al3ski
+als3li
+als3tou
+al2tw
+al3uit
+alu2r
+a1lus1
+4alysec
+a1l
+2am.
+2amaa
+am1af
+2amag
+am3art
+a2maz
+1ambt
+amen3s
+amfor3
+amfo4re
+am3int
+am3oli
+a2m1op
+amo2t1
+a2m1ov
+am4pac
+1amp
+2ams
+am4sle
+ams3oo
+am3spe
+am4s3te.
+am3sti
+a1naa
+an1ae
+an3alf
+an3alg
+3analy
+ana4mer
+ana1n
+an3arc
+ana3th
+an1av
+an1ch
+4anda
+and3ed.
+and3opp
+an3dor
+and3roo
+and4s3te.
+ane1a
+aneet3
+1anem
+anen3i
+an3est
+ane3us
+an4gal
+an4g3an
+an4gins
+ang3le
+ang3ru
+ang3spi
+ang3ste
+a1ni
+3a4nima
+an3i4on
+ani3sf
+a4n3isl
+ani3t
+anka4n
+an4k3as
+an4k3ins
+ank1j
+ank3ro
+ank1s
+4ank1t
+an4kui
+a1nol
+a1nom
+ano1s2
+ano1t
+ano2
+anper4s3t
+an4sce
+an4scr
+ans3eer
+anso2
+ans3or
+ans3po
+an4s3te.
+an4t3ac
+anten3
+ant5w
+a1nu
+an1ui
+a2n1u2r
+anu2s
+a2n1uu
+a2ny1
+a1oe
+a1of
+a1o2g
+a1oh
+a1ok
+a1ol
+a1on
+a1oo
+a1op
+a1or
+aor1t
+a1os1
+a1ot
+a1ou
+a1ov
+a1o
+2ap.
+ap3act
+a1pad
+a1pal
+a4p3as.
+a1pat
+a1pe
+a2pef
+apes1
+a2pet
+ap3e4te
+a1pi
+apij4t3j
+ap3ijz
+ap1j
+2apl
+ap4lan
+ap1le
+ap1li
+ap3lop
+a1p2lu
+ap1oo
+apos3t
+apo4sta
+1apot
+ap1ov
+1appa
+ap3rac
+ap3reg
+a3pres
+apsce4
+ap3sch
+ap3sho
+aps1l
+ap3ster
+ap3s4ti
+ap3sto
+ap3str
+a1psy
+apt1s
+a1pu
+a1q
+a1ra
+a4r3app
+ara3st
+arat3j
+ara3tr
+ard3ac
+ar4dam
+ard3om
+ar3doo
+ard3op
+ard3ov
+ar4d3ran
+ard3re
+ard3ri
+ard1w
+a1re
+a2rea
+a4redr
+aren3o
+aren3t
+a4reri
+a2rew
+ar1gh
+arg1l
+a1ri
+arij3s
+ar3ins
+ark3aan
+ark3ac
+arken4s
+ar1kl
+ar1kn
+arkte4
+ark4ter
+ark4tev
+arm3ins
+arm3ond
+ar2no
+ar3oge
+a1rok
+ar3oli
+ar3oog
+ar1op
+a1rot
+ar1ov
+arp1s
+ar4s3a4t
+ar4sco
+ar4scr
+ars3ho
+ar2s1l
+ars3pa
+ar3spo
+ars3taa
+ars3tal
+ar4s3tek
+ar3sti
+ar2su
+art3ak
+2arth
+3artik
+ar3tof
+art3o4ge
+ar4t3onb
+art3ond
+art3ong
+art3oog
+art3oor
+art3ov
+ar3tra
+art3ru
+ar1ui
+arwe3s
+a1ry
+ary1o
+a1r
+as1aa
+a1sab
+as1ad
+as1ak
+as1ap
+asa2r
+as3ari
+as1av
+as1ef
+a2seg
+ase1s
+ase1t
+as1ho
+a1si
+a2s1ij
+asi5ologische
+as1je
+as4jen
+a4sjes
+a1sji
+as3laag
+as3lam
+as3lan
+as1le
+as1na
+as1ob
+a1soe
+aso2l
+as1pa
+as4per.
+as1pi
+as4pio
+as1pl
+as3pot
+a1spu
+1assu
+as3ta.
+ast3ac
+as3tag
+as3tan
+a3stat
+as1te
+a3s4tem
+as4terr
+as3toe
+3as3tol
+ast3om
+ast3op
+ast3red
+ast3rem
+ast3ren
+a3stru
+as3tui
+a1sy
+ataart3j
+a1tab
+at3ach
+at3ade
+at3af.
+a1tal
+at3ank
+a1tat
+2atb
+a1te
+2atec
+a2tef
+2atek
+a2tem
+ate4nee
+ate4ner.
+ate3no
+ate3ral
+ater3o
+ater3st
+a2tew
+2atg
+at3haa
+4athee
+a1thi
+at3hou
+a1thy
+atie3l
+atie3s4
+2atij
+2a2tj
+a2tl
+2atn
+a1to
+2aton
+at3oog
+ato1s2
+at1ov
+at3rac
+at1re
+at3rib
+at1ru
+ats1a
+at1sc
+atsi2
+ats3id
+ats3le
+ats3lo
+at3soo
+at3span
+ats3par
+at4spe
+ats3pr
+ats3tal
+at3sten
+ats3top
+ats3tre
+3attes3
+at2t3l
+at2t1u2
+a1tu
+at3uil
+a2tw
+a1ty
+2au.
+au1a2
+au1ch
+aud2j
+au2d1r
+au1e
+1aug
+au1n
+aun1t
+aup2
+au1ph
+au1r4
+aure3u
+au1sa
+au1so
+2aut.
+au1ta
+au1th
+au1tj
+1auto
+auts1
+2auwt
+2auz
+ava1s
+a1ve
+ave4n3i
+aven3t
+aver3a
+ave3r4u
+1avon
+2a1vy
+a1wa
+a1we
+a1wi
+a1wo
+a1wu
+axi1s2
+a1yeu
+a1yo
+ay1s2
+a1
+a1
+a1
+a4neh
+a4neva
+as1o2
+a1
+a1-
+a-2c
+1ba
+baad1
+baar3t
+ba2be
+bad1a
+b1adr
+bad1s
+2b1af
+ba1g2h
+ba2k1l
+ba2k1o2
+bak4s3te.
+ba1la
+ba4lar
+bale2
+ba4l3ev
+ba4lin
+bal1s
+ba2me
+ba1n2a
+ban4k3a
+ban4k3o
+bank3w
+ba1o
+ba1ro
+ba1ru
+ba1s2a
+ba4sar
+ba4sed
+ba4sel
+ba4sin
+bas1l
+bas1t
+ba3taa
+ba1th
+2b1b2
+bbe4l3ac
+bbe4l3ag
+bbe4l3ee
+bbe4l3o
+bbe2n
+bbs1
+b2byt
+2bc
+b1co
+2b1d2
+1be
+be1a2d
+be1am
+be1an
+be1ar
+be1a2s
+be4at.
+be1ch
+be4dov
+be3dwe
+be3dwi
+be3dwo
+been1
+beet1
+be1fa
+be1g
+bei1s2
+be1ka
+be4kaf
+be1kl
+be1k2n
+be1kr
+be1kw
+be1la
+bel3aan
+bel1d
+be4l3ec
+be4l3int
+bel1k
+be1lo
+belo3v
+bel3sl
+bel3sp
+belt2
+be1na
+be1ne
+ben3e4t
+be1ni
+be1n4o
+be1nu
+be1o
+beo2l
+be1ra
+be4rac
+be4rav
+bere3s4
+ber4g3af
+ber4get
+berg3l
+be1r4o
+bero3v
+ber3sh
+ber3sp
+ber4sto
+be1ru
+be1ry
+be1s
+be2sh
+be4sje
+be2sk
+bes2m
+bes4n
+bes4ter
+bes4tie
+bes4tij
+be1t
+bet1s
+bet4wi
+beur4s3t
+2b1f
+2b1g
+2b1h
+1bi
+bi1a
+bi1do
+bid1s
+bi2du
+bie4dr
+bie4li
+bi1en
+biet3j
+bi1eu
+bigu1
+bij1d2
+bij1f
+bij1k
+bij1p
+bij1s2
+bij4s3ter
+bij3tr
+bi4ke.
+bi4kes
+bi1la
+bi1lo
+bil1s
+bin1g
+bi1no
+bin3so
+bint3j
+bi2od
+bi4otie
+bi1ov
+bi1o'
+bi1sa
+bit3je.
+bi1to
+bi1tr
+bits3p
+2b1j
+2b1k
+1bl2
+bla4det
+b1lap
+b1led
+blee4m
+b1lei
+ble3sp
+ble2t1
+b1lid
+blijs4
+blij3ste
+blik3o
+blo2k
+blu2s
+b2ly
+2b1m
+2b1n
+1bo
+bo4d3ec
+bod1o
+boe4g3a
+boe4ko
+boek3s
+boe1s2
+bo1ka
+bokje3
+bol1a
+bol1o
+bo4lop
+bo2m1a2
+bo2m1o
+bo3na
+bonda4
+bon3do
+bonds3
+5bone
+bont3j
+boo2n
+boor3t
+boots3t
+bo1pr
+bo1ra
+bor4sto
+bor4st3r
+bos1a2
+bo2s1p
+bo1ta
+bo4tac
+bo4t3on
+bot1r
+bot4spr
+bots3te.
+bouw3s
+bo1v
+bove2
+2b1p
+1br2
+braad3
+bra1d
+bra1f
+bra3str
+b1rec
+b1reg
+bregi3
+brei3s4
+bri2l1
+bri1o
+bro2n
+bron3o
+bru2l1
+2b1s
+bs2c
+bse2n
+bsi2t
+b2sk
+b2s1la
+bs2t
+b4stij
+2bt
+b1ta
+b1te1
+b1th
+b1to
+b1tr
+bt2s1
+b1ty
+1bu
+bu1e
+buk3s4k
+bu1na
+bu1ra
+b1urb
+bu3ri
+bur1s
+bus1a2
+bus1c
+bu2su
+bu1ta
+bu2to
+buts3t
+buur3s
+buur4tj
+2b1v2
+b1w
+1by
+by1e
+by2in
+by1l
+2b1z
+1b
+b2s
+2b'
+2b1-
+b-2k
+1ca
+caat3j
+ca4che.
+ca1do
+ca1dr
+cae1
+ca1f
+ca1g
+ca1k
+ca4ke.
+ca4keb
+ca4kem
+ca4kes
+ca1la
+cal2l1
+ca1lo
+came3ra
+ca3nad
+ca3nat
+ca1ne
+ca1no
+can3th
+ca1pa
+ca4pe.
+ca1po
+cap2r
+ca3pri
+ca1ro
+car1t
+ca1sa
+ca1sp
+cas3tr
+ca1su
+ca1t
+ca2
+c1b
+2c1c
+cca1
+c1do1
+1ce
+ce1a
+4ceact
+2ceba
+4cebel
+ce1c
+cee2r
+ce1f
+2cefe
+2cefi
+ce1g
+2ceha
+2cej
+ce1k
+cela2
+cel1d
+celes3
+cel1k
+2cema
+ce1n2a
+2ce1ne
+ce4nes
+2ce1ni
+3cenia
+ce1no
+cen1s
+cent3j
+ce1o
+ce1ra
+cer2n
+ce1ro
+cer4t3r
+3ces.
+ce3s4aa
+ce3sar
+ce1s2h
+4cesinn
+ces3pa
+ce3s4ti
+ce1ta
+cet1j
+ceto2
+cet3og
+cet3oo
+ce1ty
+ce1um
+2ce-e
+c1f
+c1g
+c2h
+2ch.
+2chaf
+cha1g
+1chao
+3chart
+1chau
+2chc
+che1a
+1chef
+3chemi
+1cheq
+che3ru
+che3us
+4che-p
+2chg
+ch3ins
+2chla
+2chn
+2chp
+2chre
+3chromo
+2chs
+2cht
+2chw
+ch2wa
+1chy
+1ch
+2ch-
+1ci
+ci1am
+ci1c
+ci1d
+cie1g
+cie1k
+cie3ra
+cier4s
+cie3tj
+ci1eu
+2c1ind
+cine3a
+ci1no
+ci1p
+ci1t
+ci2tj
+2c1j
+ck1ac
+c2k1e2d
+c2k1ef
+cket3u
+c2k1id
+ck1j
+c1k2le
+ck1li
+ck1n
+c2k1o
+ck1r
+ck1s
+cks2c
+cksce4
+cks2l
+ck1t
+ck1u
+c1ky
+1cl
+cle1r
+cle1u
+cli2p
+clo4se.
+c2ly
+c1m
+c1n
+3co.
+1coa
+co1ad
+co1al
+1cob
+co1ch
+coco3a
+1co1d
+co1fa
+co1fo
+1cog
+1co1k
+1col
+co1la
+1com
+co4mac
+comana4g
+co4min
+com1s
+1con
+co1na
+con1d
+con1g
+con1s
+3coopde
+3coopga
+3coopro
+co1p4
+1copa
+co1ra
+cor4dr
+1corp
+1corr
+cor3tj
+co1ru
+1cos
+co1sp
+co1s2t
+1co1th
+cot2j
+co1tr
+1cott
+1cou
+2cout
+1co1v
+1co
+1co
+1co'
+1co-
+c1p
+c1q
+1c2r
+cre1o
+cro1p
+crus1
+c1s
+2c1t
+ctaan3
+ct3act
+c2t1ad
+ct3afd
+c2t1am
+c4t3atl
+cte2n1
+ctene4
+c2t1h
+ctie3k
+ctie3s4
+c2t1j
+c2tl
+c4t3ond
+c4tont
+ct3rap
+c2t1re
+ct1s2f
+ct1sl
+ct1sp
+ct3ste
+ct3sto
+ctu4re.
+c2tv
+c2tw
+cty1
+1cu
+cu1d
+cu1ee
+cu1er
+cui2
+cuit1
+cuite4
+cu1k
+cu1lo
+cu1lu
+cu2mo
+cu1na
+cu1o
+cu1ra
+cu1ro
+cur1s
+cus1t
+cu1ta
+cu1
+c1w
+1cy
+cy1a
+cy1o
+c1z
+1c
+2c'
+2c1-
+c-2s
+3da.
+daal1
+daan1
+d3aank
+4d3aanw
+d1aap
+d4aat
+1dabe
+1dabi
+d1a2bo
+d1acc
+1daco
+1dad.
+d3adel
+d1adm
+d1adr
+2d1adv
+d1af
+1dag
+da2g1a2
+da4g3ed
+dag3env
+dag1l
+dag3on
+1dai
+2dais
+1dak.
+d1akk
+dak1l
+dak1r
+dak1s
+1dal
+4d3alar
+2d1alc
+2d1alk
+da1lo
+2d1alt
+dal1u
+1dam
+2d1amb
+d2ame
+1dan
+dan3as
+da1no
+dan4si
+dans3p
+dan4s3t
+4d3antw
+1dao
+da2pe
+da1po
+d1app
+1da1pr
+1dapu
+da2r1a
+1dari
+dar2k1
+dar4mon
+da1ro
+dar1s
+dar4tj
+da1sa
+daso2
+da3stu
+1da1t
+data1
+da4tel
+dat1j
+2d1atl
+2d1atm
+da2tr
+dat1s
+2d1att
+1daue
+2d1aut
+1dauw
+da1v
+3davol
+1da
+1da'
+1da-
+2d1b2
+dbi2k
+dbi2t
+dbou4w3i
+d1c
+dco2r
+2d1d2
+ddag3s4
+ddele4
+dde4lee
+dde4l3ev
+ddel3s
+dde2n
+dden3s
+ddera4
+dder3al
+dde4ree
+dder3s
+ddis2
+1de
+de1an
+de1ar
+de1ch
+de4dit
+dee2g1
+2d1eek
+dee2l
+deel3i
+d1een
+dee2p1
+dee2r
+deer3i
+deers4
+dee1t
+de1fa
+2d1eff
+de1fl
+de1g
+2d1eg.
+deges4
+2d1ei.
+2d1eig
+2d1eis
+de1ka
+2deki
+de1kr
+de1la
+de4l3ac
+del3da
+del3do
+del3dr
+del3eek
+del3eeu
+4d3e4lek
+4d3e4lem
+dele4n
+del1k
+de3lop
+del3or
+de3lot
+del3ov
+del4s3e
+del4s3i
+5delt
+4d3e4mai
+2demh
+4demig.
+4demigh
+dem3ond
+dem1s
+de3naa
+den3e4p
+den3e4v
+den4gra
+4d3engt
+de1ni
+denmana4
+den3ov
+den3sh
+den3sl
+den3sm
+den3sn
+den3so
+den4su
+den3tj
+deo4li
+de1pi
+de3rab
+der3af
+der3a4g
+de3rak
+de3ram
+de3ras
+der3eed
+der3ei.
+der3ein
+de4r3eis
+de4r3em
+de3ren
+de4ret
+4d3erfg
+der3fl
+de4r3id
+de4r3im
+der1k
+der3of
+de3rog
+de3rol
+der3on
+der4s3at
+4d3erts
+dert4w
+der1u
+derve4
+des3ak
+de4scr
+de3sla
+de3slo
+de3sol
+des3pa
+des3po
+de3sta
+de4s3tak
+des3tek
+de3s4tic
+des3top
+de1t
+4d3e4tap
+de4ter.
+de4ters
+det2w
+deu2c
+deur3o
+de3us.
+dever3
+4dexam
+dex1i2
+de2s
+2de-o
+d1f
+dfiet3
+2d1g
+dgas1
+d2ge.
+dge3la
+d3ge1n
+dgeper4
+dgepers3
+d3ger4
+dges2
+dge4t3o
+d1h
+dhe4r3i
+1d2hi.
+1di
+dia1k
+dia1p
+dia3sc
+di4atr
+die1l
+die3sp
+di3esr
+die3st
+die4t3r
+di1eu
+di4gam
+dige4s
+dig1l
+dij3ka
+di2k1o
+dik1w
+2d1in1d
+2d1inf
+4d3ingel
+4d3ingeni
+2d1inj
+4d3inko
+2d1inr
+4d3inst
+2d1int
+2d1inv
+2d1inw
+2d1inz
+di4odi
+di4one
+di4oni
+dio1v
+di1po
+dip1s
+2d1irr
+dis3ag
+dis4k3r
+dis1p
+di1th
+dit1j
+di1to
+d1j
+1d2jah
+1d2ji
+d1k2
+d1l
+dli2n
+2d1m
+d1n
+dni1s
+1do.
+1do1a
+d1obs
+1doc
+1dod
+do1da
+1doe
+2d1oef
+doe4l3a
+doe4lu
+d1oev
+1dog
+1doi
+1dok
+do1la
+do5lin
+do4li
+dolk3s
+1d2om.
+do2m1o
+domo4r
+d1omr
+1don.
+do1na
+1done
+1doni
+1donn
+don4t3e4
+doog1
+door3d
+3doori
+door4n3ac
+door3t
+do1pa
+d1opb
+d1opd
+do4pes
+2d1opg
+1dopj
+d1o2pl
+2d1opn
+1dopo
+d1op1r
+d1ops
+2d1opv
+d1opz
+do3rad
+do3rat
+1dore
+2d1org
+do4ri
+d1ork
+1dorp
+dor4s3te.
+1dos
+do1sp
+dost2
+dos3tj
+do3str
+1dot
+do1ta
+do1th
+do1tr
+1dou
+1dovi
+1dovl
+1dovo
+1dow
+1dox
+1doz
+1do'
+1do-
+d1p
+d1q
+1dra
+d3raam
+d3raap
+d3race
+d3rad.
+d3rada
+4d3rand
+2d1rec
+d1red
+4d3reek
+d1rek
+d1rel
+d3rem.
+4d3rend
+2d1rep
+1drer
+4drese
+d3resu
+1dria
+1drie
+drie3t
+1d4rif
+1drig
+d3rijd
+d3rijk
+1dril
+1drin
+1dris
+2d1rit
+1driv
+1dri
+d3roer
+1drog
+2d1rok
+d3roma
+d3rond
+d3rood
+3droog
+d3rook
+dro3pn
+d1ro1v
+d2ro
+d1rub
+d1ruc
+d3ruim
+1dru2k
+2d1rus
+2ds
+ds1aa
+ds1a2b
+ds1ad
+ds1a2g
+ds1ak
+ds3ang
+ds1ap
+ds1ar
+ds1as1
+ds1au
+dscenari3
+d1sch
+d2scl
+d2sco
+d4scre
+d4s3e4co
+d2s1ee
+d2s1ef
+ds3eis
+dse4l3a
+d2s1ep
+ds3eth
+ds1h
+ds1id
+dsie1
+dsi4g3a
+ds1in
+ds1is
+ds1je
+d3slaa
+d3slac
+d3slak
+ds3lie
+d3slin
+d3sloo
+ds3lop
+ds1na
+dsnes3
+ds3neu
+d1snu
+dso2
+ds1ob
+d1soe
+ds1of
+ds1og
+ds1on
+ds3ord
+ds3ori
+ds1ou
+ds3pac
+d3span
+ds3par
+d3spec
+d3spel
+ds1pl
+d3spoe
+ds3pook.
+ds3pot
+dsregi3o
+dss2
+ds3taak
+d4s3tab
+ds3tak
+d3stam
+d3stap
+d3stat
+d3stav
+d4stec
+d3stee
+ds3tek
+d3stel
+d3sten
+d3ster.
+d3sters
+ds3tes
+ds1th
+d3s4tic
+d3s4til
+d3stoel
+dsto4f
+d3ston
+d3stoo
+d3stop
+d3stot
+ds3tram
+d3stree
+d3stroo
+d3stru
+d1stu
+d4stui
+d1sur
+ds1uu
+d2sw
+d1sy
+2d1t2
+dtaart3
+dtes3t
+dtu2
+1du
+du1a
+2duca
+du4ce.
+du1ee
+du1en
+du1er
+du1et
+2d1uil
+d3uitd
+d3uitg
+4d3uitk
+d3uitr
+d3uitv
+du1ka
+du1lu
+dum4p3a
+du2mu
+dun1i
+du1ra
+dur2f
+2d1uro
+dus1
+dut1j
+2duud
+du4wee
+d1v
+dvee3s
+dvies3
+dwaal3
+d3waar
+d1wac
+d1wap
+d1was
+dwee4p3
+d1weg
+1d2wei
+d1wek
+d1wer
+d1wes
+d1wet
+d1wez
+d1wil
+d1wor
+d1wr
+1dy
+dy1n
+dy3sto
+2d1z
+1d
+1d
+1d
+2d1-
+2ea
+e3aa
+eaan1
+e1ab
+e1ac
+ea2ca
+ea2ch
+eac3t
+ea1da
+ea4dem
+e4ades
+e1adm
+e1a1do
+ead1s2
+e1adv
+e1af
+e1ag
+ea2ga
+ea1g2l
+ea2gu
+e1ai
+e1akk
+ea2k1o2
+ea1la
+e1alf
+e1ali
+eali4
+ea1lo
+eal1s2
+ea4men
+e4amer
+eam1s
+ea2mu
+ea3nat
+e1anc
+e1and
+ea1no
+e1ant
+e3ants.
+e1ap
+ea1pr
+ea1ro
+e1as.
+ea1sc
+ea4sed
+ea4set
+e1ask
+e1ass
+ea2st
+e3ast.
+e3asti
+ea3str
+e1at
+e2atm
+ea1tr
+e2at1s
+eau3s4t
+e1av
+e1b
+eba4le
+eb1ap
+1ebd
+ebe4t3j
+ebit4s
+ebots3
+eca2k
+ecas1
+e2ce.
+e1cha
+e1che
+e1chi
+e1cho
+echore3
+e1chu
+ec1le
+e1co
+eco4m3a
+e4cono
+eco1t
+1ecz
+e1da
+e2daf
+e2d1as
+ede3au
+ede3nac
+eden3in
+ede1o
+eder3sl
+eder3sp
+edeso4
+ed4gef
+edia3g4
+edia3s4
+e4d3ijz
+ed3ins
+edi1o
+e1do
+edoe3t
+ed3ope
+edor4s3
+ed3ove
+e1dr
+ed3rod
+ed3rol
+ed1s2c
+ed1sp
+ed1st
+ed3uit
+e3dwan
+e2e
+ee1a2
+eef3ac
+eef1l
+eef1r
+ee4gap
+eeg3lo
+ee1i
+eek3af
+eek3ak
+ee3kap
+ee4k3en
+eek3lo
+eek1n
+eek3ren
+ee3kri
+eek3ro
+ee4k3ru
+eek3sp
+eek3st
+eek3we
+eel3aa
+eel3ac
+ee3lad
+ee4l3a4m
+eel3ap
+ee3laz
+eel3do
+eel1k
+ee3lob
+eel3o4g
+ee3lot
+eel3scr
+eelu2
+ee4l3ur
+ee4l3uu
+ee4mop
+een3ac
+een3ad
+een3a4g
+een3a4r
+een5d4u
+eene4d
+een3ez
+een3ie
+1eenj
+een1k
+1eenn
+een1o2
+een3sh
+een3sla
+een3sn
+een3so
+een3sp
+een1t
+ee1o2
+ee4p3an
+ee4pas
+eepo2
+ee4pog
+ee4p3oo
+ee4pre
+ee4p3ru
+eera2
+eer3aa
+eer3ak
+eer3al
+ee3ram
+ee4r3eer
+eer3em
+eer1f
+eer1g
+eer1k
+eer3of
+eer3on
+eer3oom
+ee3rot
+eer4so
+eer3str
+eer4su
+ees1a
+eese4t
+ee1sj
+ee3sle
+ees3li
+ee3sni
+ee3soo
+ees3te
+ee2s1u2
+eet1h
+eet3o4g
+ee3ton
+eet3oo
+eeto4r
+ee4t3ree
+eet3sn
+eet3sp
+eet3st
+ef3aan
+ef1ad
+e1far
+e1fau
+ef1a2z
+ef1da
+ef1do
+ef1dr
+efiet3j
+e2f1ij
+ef3ins
+efis3
+ef3loo
+e1fo
+e2f1og
+e4font
+efron4
+efrons3
+ef3s4fe
+ef1sl
+ef1s2m
+ef1sp
+efs2t
+ef3sta
+ef3ste
+ef3sti
+ef3sto
+ef1th
+ef1tu
+2ega
+ega2m
+eg1da
+eg1dr
+e2g1e2c
+eg3eig
+ege4l3ei.
+ege4l3ov
+egen3ac
+ege4net
+egen3s
+eger3of
+eger3on
+eg3ijz
+eg1li
+e1goo
+egoog3
+eg1op
+eg3oud
+eg1ov
+1ego'
+e1gr
+eg3red
+e4grou
+eg1s
+egs2a
+egs2o
+egs2p
+egs2t
+e2g1u2r
+eguts3
+e2g1uu
+e1h
+ehe4r3i
+ehoorder5ess
+e3hu
+ehuts3
+ei1a
+ei3de
+ei1do
+eid4sc
+eid3ste.
+ei1e
+eier3s
+ei1fa
+ei1gl
+e1ij
+ei1kl
+ei1kr
+eik1s
+eik1w
+ei1la
+ei4l3ant
+4eil1d
+eil1o2
+e2in
+ei4n3aar
+ei4n3ab
+ein4ac
+eind3oo
+ein4d3r
+eind3s
+ei4n3e4d
+ein1g
+ein1k
+ein1t
+ei1o
+ei1p
+eis1a2
+3eisar
+ei3sch
+eishe4
+ei3soo
+ei3s4tel
+ei3s4tr
+eis1u2
+ei1tj
+eits3p
+eit3sten
+2eiz
+e1j2
+2ek
+ek3aan
+e3kaar
+ekaats3
+ek3af.
+ek1a2g
+ek3al.
+ek3alt
+ek3arb
+ek2ee
+e2k1ei
+ekes3tr
+eke3ta
+e4k3e4ter
+ekets3
+e2k1e2z
+e4k3ins
+ek1j
+e3klee
+e1kni
+e2k1ob
+ek3oli
+ek3opl
+ek3opz
+ekor4s3
+ek3os.
+ekots3
+e3kran
+e3kred
+ek3rok
+e1kru
+eks3li
+ek3som
+eks3pa
+eks3pl
+eks3poo
+eks3tak
+ek4sted
+ek4sterr
+eks3tra
+ek1t
+ekt1s
+eku2
+ek3uit
+ek3ure
+ek1uu
+e1la.
+e1laa
+e1lab
+e4l3act
+e3lade
+el3adj
+el3adm
+el3adv
+e2l1af
+e1lag
+e1lai
+el1al
+e1lam
+e1lan
+e4l3ank
+e3lapt
+el3arb
+el3arc
+e3lare
+e3lari
+e4l3arm
+e4l3arr
+el3art
+ela2s
+el3asi
+el3asp
+e1lat
+ela3tr
+el3aut
+e1lax
+el3azi
+e1la'
+eld3ov
+e1le
+el3eff
+el3eier
+el3eig
+el3eis
+el3elp
+el3emp
+e3len
+ele5r4a
+e4l3e4ta
+ele3t4h
+e4l3etu
+el1fl
+elf3on
+elf1s
+el1gl
+el1go
+e1li
+elijs3
+eli3kw
+el3imp
+e4l3ind
+eli4nes.
+e4l3ins
+1elix
+el4kee
+elk1s
+e1lo.
+e1loc
+e1lod
+e3loep
+el3oes
+e1lok
+el1ol
+el3oms
+el3omv
+el3ond
+e3lone
+e3lonk
+el3ont
+e1loo
+el3opg
+el3oph
+el3opl
+el3ops
+el3opt
+el3opv
+el3ora
+elo3th
+e1lou
+e1lo1y
+el1pa
+el1pi
+el1po
+el4s3em
+el3slu
+el3sno
+el3s4ti
+elt1s
+e1lu
+el3uit
+e1l
+emaat3
+em3act
+em3afl
+emana4gem
+e4m3as.
+emats3
+2eme
+emen3sl
+emie3s
+em3ins
+e4m3oli
+em3opl
+em3org
+em1pj
+em1sa
+em1so
+em1sp
+e3naai
+e3naak
+e4naan
+en3aap
+en1ab
+ena2c
+e3nacc
+e2naf
+en3akk
+en3akt
+en3al.
+en3alb
+en3als
+en3amb
+en3ana
+en1ap
+ena4pe
+e3nari
+en3arr
+en3ars
+en1a2s
+enas3p
+ena4tel
+en3att
+en3aut
+e2n1av
+en4cep
+end3ach
+enda4m
+en1do
+en1dr
+end3sp
+en4dur
+en4d3uu
+e1neb
+enebe4
+ene2c
+en3ech
+en3eco
+e4neen
+enee3t
+en3ei.
+en3eis
+en3ela
+en3elf
+en3ema
+ene2n
+enen3t
+en3e4po
+3e4nerg
+enes3te
+en3e4ter
+e1neu
+en3eva
+enge3ra
+en1gl
+en1go
+en1gr
+engs2
+eng3sn
+eng3ste
+3enhalf
+3enhalv
+e3nijd
+2enin
+e4n3in.
+e1nit
+e1niv
+en1kj
+en1kl
+en1kn
+en1kr
+en3och
+e1noe
+en3off
+e1nok
+en3oli
+en3oor
+en1op
+en3ord
+en3ork
+en1ou
+3ensem
+ens4fer
+en3sjo
+ens3on
+en3spi
+en3spor
+ens3pot
+enst3ijv
+en4stin
+ens3u4ren
+en4t3erv
+ent3ha
+ent3ond
+en4t3ov
+ent3rol
+ent4se
+1ent
+en1ui
+en3ure
+e1nut
+en1uu
+3envelo
+eo1a
+e1oct
+e1ocu
+eo1d
+eodo1
+e1oe
+eo1fa
+e1off
+eo1fo
+eo1g
+eoga2
+eo4gen.
+eois3
+eo1k
+eo1l
+e3olette
+eo4lied.
+eo4liede.
+e3ologie
+e5ologiseert
+eo2ly
+e1omb
+e1on
+eo1na
+e2ono
+eon3sp
+e1oo
+eo1pa
+eo3penb
+eop4la
+e1opn
+e2o1po
+eo3pre
+e1ops
+e1or
+eo1ra
+eo1ro
+eo1s
+eos2t
+eo3te
+eo1th
+e1ou
+e1ov
+e1ox
+e1pa
+ep3asp
+e1pe
+epe3lot
+eper4s3te.
+epes1
+1epid
+e1pie
+e1pij
+ep3ijs
+e1pik
+e1pil
+ep3ingr
+ep3ins
+e1pit
+ep1j
+e1pl
+ep3led
+e4p3lod
+e1po
+e4p3o4ge
+epon4s3
+epoort3j
+ep3ork
+e1pr
+ep3reg
+ep4s3ee
+ep4set
+eps1l
+eps1n
+epso2
+eps3or
+eps1p
+eps3tal
+eps3to
+ep4tak
+ep2tj
+ep4t3ra
+e1pu
+ep3uit
+e1q
+e4quip
+e1ra.
+e3raad
+e3raam
+er3aan
+e3raat
+er1ac
+e3rac.
+e4rach
+e4ract
+e3rad.
+er3a4der
+e3radi
+er3afb
+er3afd
+e3rafe
+er3afg
+er3afk
+er3afp
+er3afs
+er3aft
+er3afv
+er3afw
+er3afz
+era4gen
+e1rai
+er3al.
+er3ala
+er3alg
+e3rali
+er3all
+er3als
+er3alt
+er3amb
+er3ana
+e3ranc
+e3rane
+e3rang
+er3ank
+e3rans
+e3ranti
+e1rao
+e3rapl
+er3arc
+e3rare
+e1rat
+era3tj
+e4r3att
+er1au
+e1raw
+er3azi
+e1ra'
+e1ra-
+er1d2a
+er1d4o
+erdo3v
+er1dr
+erd3uit.
+er1dw
+e1re
+ere1a
+er3een
+er3eet
+er3eeu
+er3eff
+er3eg.
+eregi3o
+er3eie
+e4r3eig
+er3eil
+er3eind
+er3elk
+e4r3emm
+e3ren.
+ere4nen
+e4r3enen.
+eren3sp
+er3enth
+e4r3envi
+e4r3enze
+ere4ri
+e5r4es.
+eres4t3af
+erest3r
+ere4t3j
+er3etn
+e4r3ets
+er3eu3r
+e2r1ex
+erfo4l
+3ergiemo
+er3gle
+er3gli
+e1ri
+3eridons
+erie3s
+erie3t
+e5rig
+e4r3ijs.
+e5rik
+eri4ma
+e4r3ind
+er3ins
+e4r3int
+er1ir
+eri3sta
+erkeer4s3
+er4k3erv
+er4k3ins
+erk3ta
+erk3to
+erlaat3
+ermana4
+er4m3erg
+er4non
+e1ro.
+e1rob
+e1rod
+er3oed
+er3oef
+e3roep
+e3roer
+e3roes
+eroe3t
+e1rok
+e3rol.
+ero4lem
+er3o4li
+e3roll
+er3om.
+e3roma
+er3omb
+er3omg
+er3omh
+er3oms
+er3omv
+er3omz
+e3ron.
+e3ronal
+er3onc
+e3roni
+e3roof
+er3oog
+e3rook
+er3oor
+e3roos
+er1op
+erop3a
+ero4pen.
+ero4pi
+erop3r
+er1o2r
+er3ove
+er3oxi
+e1roz
+ers3om.
+er3sta
+er3sti
+er1t
+er4t3a4g
+er3te
+ert4s3l
+ert4s3te
+er5t4u
+e1rub
+e1rug1
+er3uit
+erui3tj
+e1rup
+er1u2r
+e1rus
+er1uu
+1erwt
+e1ry'
+e1r
+e1sab
+es1a2g
+e1sam
+e1san
+e1sas
+e1sc
+es4can
+e2sce
+e2sci
+e2scl
+es4crib
+e3se.
+e2seb
+e2s1ee
+ese2n
+es1hi
+e1sid
+es1in
+esi1t
+esi4te
+es1je
+e1sji
+e1sjo
+eska4tes
+es4kel
+e3slep
+e3s4opb
+es3ore
+es3ori
+e1sos
+e1sot
+esp3riem
+es4sce
+es2sm
+es4spr
+es4t3ac
+e3stand
+es3tant
+es3tas
+e4s3te.
+est3ei.
+es3teli
+e3stem
+e4s3ten.
+es3ter
+estere3o
+e4s3tes
+e3steu
+es4tich
+es2tj
+e3stot
+e4s3tra.
+es3trak
+e1stu
+e1s2ty
+e1su
+e1sy
+e1ta.
+et3aan
+et3aca
+et3act
+et1ad
+et3afd
+1etag
+e1tak
+e1tal
+e4talb
+e3tand
+eta2p
+e4tapp
+e1tas
+e2t1av
+e1te
+e3te.
+et3e4co
+et3edi
+et3emb
+et3emm
+eten3tj
+ete3r4aa
+eter4s3l
+etes3p
+e4tete
+et3hal
+et3hor
+et3hou
+e1thr
+e4t3inc
+et3i4ni
+1e2tiq
+e1toe
+e1tom
+et3ope
+et3opl
+et3ops
+etor4s3t
+e1tou
+eto3ver.
+e1tr
+et3rec
+et3res
+etros4
+2ets
+et3sap
+et3slu
+ets1o
+ets3paa
+ets3pr
+ets3te.
+ets3tek
+et3ster
+ets4ti
+et3str
+et1su
+ette3s
+e1tu
+etu4ne.
+et4wij
+1eu1a
+1eu1c
+eu1d
+eu1ed
+eu1en
+eu1er
+eug4d3r
+eu1gr
+1euh
+1euj
+eu4ler
+e1umb
+e1umc
+e1umf
+e1umg
+e1umj
+e1umk
+e1uml
+e1umm
+e1umn
+e1umr
+e1ums
+e1u2mu
+e1umv
+e1umw
+eun1s
+eun1t
+1euo
+e2ur
+eu3ren
+eu4r3es
+eu4rij
+eur1k
+eu3rol
+eu3roo
+eu1sc
+eu3s4te
+eu1t
+eu4wij
+1eu-
+e1v
+evaar3tj
+eva3lo
+evel3op
+eve3naa
+even3t
+2e3ver
+ever4ee
+evol4ga
+e1w
+e3w2e
+ewen4s
+ewens3te
+ew2h
+ewieks5te.
+e2wn
+ew1s
+2ex.
+ex1aa
+1exam
+ex1op
+1exp
+ey2n
+e1yo
+ey1s2
+e1z
+eze3na
+ezin4s3
+e1
+e1
+e1
+e1
+e1
+e1
+e1-
+1fa.
+1faal
+f1aap
+f1aar
+f1aas
+1faat
+1fab
+f1a2bo
+f1acc
+f1ach
+1faci
+fa4de.
+2f1af
+1f2a1g
+1fah
+1fai
+fa4ke.
+1fal
+fa1la
+fa1lo
+fal1s
+f1amb
+1fami
+fa1na
+fa1ne
+f1ang
+fansi4
+fant3j
+fants3
+f1a2p
+1fari
+fa1ro
+f1art
+f1as.
+1fase
+1fasi
+f1ask
+f1ass
+fa1ta
+fa1v
+1faw
+1fax
+1fa'
+2f1b
+f1c
+fcour4
+2fd
+fd1ac
+fda4de
+fd1ar
+fd1as
+f2d1e2c
+fde2k1
+fde2s1
+f2dh
+fdier3o
+f4d3inga
+f4d3ingr
+f4d3ink
+f4d3ins
+fd1of
+fd1or
+fd3ric
+fd3rol
+fd1sc
+fd1so
+fd1sp
+fd3sta
+fd3ste
+fd3str
+1fe
+fe2a
+featu4
+fec4tr
+fe4del
+fede3r
+2f1een
+fee2r1
+fee3sh
+feest3r
+fee1t
+fe1k
+fel3ac
+fe4l3ee
+f3e4lem
+fel1f
+fel1k
+fel3sp
+fe1na
+fe1ne
+fe1ni
+fe1no
+fen1s
+fen1t2
+fe1o
+fe3raa
+fe3rab
+fe3ran
+fe4r3et
+fe3rom
+fer3sl
+fes1
+fe1ta
+fet1j
+fette3
+2f1ex
+2f1f
+ff1d
+ffi4ce
+ff1s
+f1g2
+fge1
+fge4k3lov
+fge4k3nep
+fges2
+fguts3
+2f1h
+1fi
+fi2al
+fi1as
+fi4cep
+fi1ch
+fie1s
+2f1ijz
+fik4s3t
+fi1la
+fi4len
+fil4ma
+fil4m3on
+fi1lo
+2f1ind
+fi4nel
+2f1inr
+f1inv
+fi1o
+fi2r
+fi2st
+fi4tin
+fit1o
+f1j
+2f1k2
+fkaats3t
+fl2
+f1laa
+flaat3
+f1laf
+f3land
+3flat.
+f3late
+flat3j
+3flats
+1flau
+fla1v
+f1leg
+f1lei
+flen4s3t
+fles1
+fle2t
+flet3j
+f1lev
+f1lez
+2f1lie
+f1lig
+f1lij
+flijs3
+f1lin
+f2lip
+1f2lit
+1floe
+f1lok
+flo1r
+f2lot
+fluit3j
+flu2t1
+1f2ly
+f1m
+fma2d
+f1n
+fnes1
+f2nui
+1fo.
+1fob
+1foc
+foe1r
+2f1of
+fo2gi
+fok1
+4f3oli
+2f1omg
+2f1oms
+f1omv
+fo1na
+f3onde
+1foni
+f1ont
+1foo2
+2f1oog
+foon1
+f1o2p
+2fope
+fops2
+f2opt
+1for
+fo1ra
+f1ord
+fo1ru
+1fos
+fo1sa
+fo1st
+1fo1t
+1fou
+2f1oud
+fout3s
+2f1ov
+foy1
+2f1p
+fper4s3te.
+fr2
+1fra
+f1rea
+f1rec
+f1red
+f1ref
+f1reg
+fregi3o
+f1rek
+f1rel
+1f2req
+f1res
+friet3j
+f1rij
+f2rik
+1fris
+f2ro.
+1f2rod
+f1roe
+f4roka
+f1rol
+f4rolo
+1fros
+frus1
+2fs
+fs1aa
+fs1ad
+fs1ar
+f1sc
+f2sca
+f2sce
+f2sci
+f2s1co
+f2scr
+f2scu
+f2s1ee
+fs3erv
+fs3eth
+f2s1e2v
+fsho2
+fsi2d
+fsie1
+fs1i2m
+fs1in
+fs3led
+fs2me
+fs1o2
+fs2ol
+fss2
+fst3ac
+f3stan
+fst3as
+f3stat
+f3stell
+fste4m3
+f3ster.
+f3sters
+f3stert
+f3stif
+fst3oc
+fsto3v
+f1str
+f1stu
+fs1ui
+f1sy
+2ft
+ft3aan
+f1tab
+ft1ac
+f1taf
+f1tal
+f1tan
+ft3art
+f1te
+fter3s
+fte1t
+f2tex
+ft3hed
+ft1ho
+ft3ijs
+fti2m
+f4t3ins
+f1t2j
+f1to
+f1tr
+ft1sc
+fts1l
+fts1p
+ft1st
+f1t2w
+f1ty
+1fu
+fu1lo
+fu4m3ac
+fu2m1i
+fun1s
+fu4ren
+fu1ro
+fus1t
+fu1ta
+2f1v
+fva2l1
+2f1w2
+1fy1
+2f1z
+1f1
+1f
+1f
+1f
+1f
+f1-
+1ga
+3ga.
+gaar3t
+g4aat
+gaat3j
+ga2bo
+g1ac
+g2ada
+2g1adm
+ga1do
+g2af.
+g1afd
+ga1fo
+2g1afs
+2g1afw
+g1afz
+ga2ho
+ga1kr
+ga3lac
+ga4l3ach
+ga3lad
+gal3app
+ga3lav
+ga1lo
+ga4med
+ga4mep
+ga4mes
+gan1d
+ga1ne
+gan3gr
+ga1no
+ga1pr
+2g1arb
+ga3r2e
+2g1arm
+ga1ro
+g1arr
+gar1s
+2g1art
+g4ar3tj
+gas1c
+ga2s1i
+gas1o
+gas1p
+ga1ta
+gat1j
+gat1s
+gaus2
+2g1aut
+g1avo
+3ga'
+g1b
+gby1
+g1c
+2gd
+gd1ar
+gd3ate
+g4d3elf
+gde3sp
+g2dh
+g2d1id
+g2d1im
+gd3ins
+g1do
+gdoe4l3
+gd1op
+g1dri
+gd1sa
+gd1so
+gd1sp
+gd3ste
+gd1w
+1ge
+ge1a
+ge4ade.
+gea4der
+gea3na
+gea4ni
+ge4ari
+2g1eb.
+2g1ebb
+2gebd
+2g1ebt
+ge1c
+ge1d
+2ged.
+ged2e
+4gede.
+ge4dit
+4gediven
+4g3eend
+gee2r
+geest3r
+gee2t1
+gee3t4j
+ge1f
+2g1eff
+ge3fi
+gef2r
+ge1g2
+gei4l3a
+gei4t3j
+ge1k
+ge3k2e
+gek4le
+gek4li
+gek2n
+gek2r
+gek2u
+gek2w
+gel3acht
+ge3lak
+ge3lar
+gel3as.
+ge3lav
+ge3laz
+gel4da4
+3gelde
+3gele
+gel3ein
+4g3e4lem
+ge4l3ink
+gel1k
+ge1lo
+gel1s
+3gelt
+4gementbu
+4gementc
+4gementer
+4gementf
+4gementk
+4gementli
+4gemento
+4gementp
+4gementsa
+4gementsc
+4gementsy
+4gementtr
+4gementv
+gemes3
+2g1emf
+2g1emp
+gem2s
+ge3m2u
+ge3nad
+ge3nak
+gen3an
+ge3naz
+gen1c
+ge1ne
+ge4n3ed
+ge4nei.
+ge5nen.
+4genenvi
+4g3enenz
+4g3engt
+ge1ni
+gen1k
+gen3o4g
+gen3ov
+gen3sfe
+gen3th
+gen3tj
+ge1ob
+ge3oli
+ge1op
+geo3per
+georke3
+ge1oz
+ge1p2
+ge3raak
+ger3aal
+ger3aap.
+ge3raas
+ge3rab
+ge3rad
+ge3rak
+ge3ram
+ge3ran
+ge3rap
+ge3ras
+ger3as.
+ge3rav
+4g3e4r3enz
+geri4n
+ger3ini
+ge3roc
+ge3rol
+ge3rom
+ge3ros
+ge3rot
+ge3rou
+gers3lij
+ge1ru
+ger4ui
+ge1s
+ges2c
+ges2h
+ge4shop
+ges2i
+2g1esk
+ges2l
+ges2m
+ges2n
+ges2o
+ges4pend
+ges4po
+ges4ter
+ges4til
+ges2w
+3get.
+ge1ta
+get4aa
+getes3
+get3ha
+get2i
+ge1t2j
+ge1to
+ge3tsj
+ge1t2w
+ge1ui
+ge1um
+2g1ex
+g1f
+2g1g
+gge3raa
+gge4sti
+g2gh
+ggi1o
+g1h
+g2het
+ghte2
+gh2tr
+ght1s
+g2hum
+1gi
+gi1a
+gids3t
+3gie
+gie1f
+gie1k
+gie1l
+gie1s
+giet3s
+gi1eu
+gi2f
+gif1a
+gif1r
+2g1ijs
+gi1la
+2g1inb
+4ginfe
+4g3infr
+2g1inh
+gi2ni
+gin1o
+g4ins.
+gi2od
+gi1os
+gio1v
+gips3t
+g1irr
+2g1iso
+gis4t3a
+g1j
+2g1k
+g1lab
+g1lam
+gla2s1
+g3last
+g1lat
+g1lau
+1glaz
+1g2le.
+glee3t
+g1leg
+g1lei
+g1lek
+g1len
+g1ler
+1gle2t1
+g1lev
+g3lice
+g3lich
+1glim
+gli4ne
+1glio
+1gli
+1glob
+g1lod
+1glof
+g1log
+g1lok
+1glom
+g1lon
+g1lop
+g1lui
+gluid3
+1g2ly
+2g1m
+g1n
+g2naf
+gnee2
+gne1s
+gne3th
+gne4t3j
+gn1k
+g2nob
+gn2on
+gno1r
+1go.
+1goa
+go1ar
+1gob
+gobe5
+g1och
+1god
+go2d1a
+god3on
+god4s3e
+gods3t
+1goe
+goe4d3a
+goe4dr
+2g1oef
+goe1r
+goes1
+go1fr
+1gog
+g1oh
+go2k1i
+gok1s
+1gol
+go1la
+g1oml
+gom1p
+g1omz
+go1na
+gon1d
+g1ong
+2g1ont
+g1oor
+goot1
+go1pa
+g1opb
+g1opg
+g1opl
+go1pr
+g1ops
+g1opv
+1go1ra
+g1ore
+go4ren
+2g1org
+1gori
+gor2s1
+gos1p
+1g4ot
+go3the
+go1tr
+gou4dee
+1gous
+goven3
+1go
+1go
+1go-
+g1p
+gpes1
+g1q
+gr2
+1gra.
+gra4des
+g1rak
+gra4m3a4
+4g3ramp
+gra2s1
+grase4
+g1rea
+2g1rec
+gree2
+4g3reek
+gre1g
+4greis
+g1rek
+2g1rem
+g3rena
+gren4s
+1greu
+1gria
+griet3j
+g3rijd
+g3rijk
+3grijp
+1gris
+g3rit.
+2g1riv
+g1rod
+groet3j
+g1rok
+g3rook
+g3room
+gro1v
+g2ro
+2g1rug
+4g3ruim
+g1ruk
+4gs
+gs1a
+gsa2d
+gsa2g
+gsa2r
+gsas3p
+gsce4n
+g1sch
+gs1co
+g2s1e2d
+g2s1ee
+g2s1ef
+g2s1ei
+gse2n
+gs3ene
+g2s1e2t
+g2s1e2v
+gs1h
+gs4ham
+gshe4r3
+gs1i
+gsi2d
+g2sin1
+g2sis
+gsi4te
+gsi2z
+gs1j
+gs3laag
+gs3lam
+gs3lan
+gs4lang
+g3slap
+gs3lec
+gs3led
+g3slep
+gs3let
+g3sleut
+gs3lie
+g3sling
+gs3lis
+g3sloe
+gs3lon
+g3slot
+g2sma
+gs1na
+g3snijd
+g3snoe
+gs1o
+g3s4omb
+gs3pand
+g3spann
+gs3par
+g3spel
+gs3pill
+g3spinn
+gs1pl
+gs1pr
+gs4prie
+gs1pu
+gsquo4
+gss2
+gssce4
+gs3taak
+gs3tab
+gs3tac
+gs3tal
+g3stam
+gst3ant
+g3stat
+g3s4te.
+g3stee
+gs3teh
+gs3teks
+g3stel
+g3sten
+g4s3tend
+g3ster.
+gs3terr
+g3sters
+gs3tes
+gs3the
+g3s4tich
+g3s4tig
+gs4tin
+g3stop
+g3stor
+g3stot
+g3strat
+gs3trek
+gs3troe
+g3struc
+gsu2
+gs1ui
+gs1ur
+gs1uu
+g2sw
+g1sy
+gs2-
+g1t
+g2t1ap
+gte3ro
+gte1s
+gti2m
+gto1v
+1gu
+gu1aa
+gu2ac
+gu1av
+2g1uit
+gu1r
+g1u2ri
+gus1
+guts3te.
+gut3sten
+g1v
+gve2r
+gver3a
+gvero5verd
+2g1w
+1gy
+gy1n
+g1z
+1g
+1g
+2g1-
+g2-r
+haak1
+haam4s3ta
+haam4ste
+haar3s
+haar4s3te
+haar3t
+haats3te.
+hade1
+ha1do
+had1s
+h1afs
+haft3u4
+ha4gin
+ha4ke.
+ha4ket
+ha1kr
+hak1s
+ha1la
+half1
+hal4fe
+hal4ka
+ha1lo
+1hals
+hal4sto
+1halv
+1halz
+ham1s
+ha1na
+hand3r
+han3ga
+hang3l
+hang3s
+ha1no
+han3so
+hap1l
+hap1r
+har4e
+ha5ren3
+ha1ro
+har4taa
+hart3j
+harto4
+hart3or
+ha4se.
+has1p
+hat3ee
+hat1j
+hat1r
+hat1s
+ha1v
+4have.
+1haz
+2h1b
+h1c
+h1d
+h2d'
+2he.
+he5co
+hee1g
+hee4k3l
+hee4l3o
+heer4s3ta
+heer4s3te.
+hee3ta
+heet3j
+he2f1e
+he1go
+heids3p
+hei1k
+hei1t
+hei4t3j
+he2k1a
+hek4s3te.
+hek1w
+hel3ac
+he3lar
+he3li
+hel4m3a
+hel2o
+he3lon
+he3lor
+he3lot
+hel3ov
+hel3s4m
+he1na
+he1ne1
+he1ni
+hen4ka
+hen4kr
+he1no
+he3ose
+he1pi
+he4pij
+he2pr
+hep1s
+he1ra
+he4rac
+he4r3a4d
+her4au
+he4r3e4d
+he4r3e4v
+her3inn
+her1k
+her4m3eng
+her3on
+he3ros
+her1s2
+3herst
+he1sa
+hes1t
+he1ta
+he1to
+het3sten
+2hew
+2h1f
+2h1g
+h1h
+hi1a
+hide1
+hie4dr
+hie4fo
+hie3rad
+hie4r3i
+hier3o
+hie4ru
+hie1s
+hie3tj
+hie4to
+hie4tr
+hiet3s
+hi2i
+hik2s1
+hi1kw
+hi1la
+him4pl
+him4pr
+hi1no
+hint3j
+hi2p1i
+hip1l
+hi1po
+hi1sa
+hi1tr
+hits3t
+hi1
+h1j
+h1k
+h1lab
+h1loc
+hlo1r2
+2hm
+h2mi
+2h1n
+h2na
+h2nit
+hno1
+ho1a
+ho1ch
+ho1d
+hoef1
+hoek3st
+hoe2s
+hoes3l
+hoes3te
+hoe1t
+ho2f1e
+hof1s
+ho1g2
+hoi2
+ho2ka
+ho4ke.
+ho1la
+ho4le.
+ho4lek
+honi2
+hono1
+ho2nu
+hoo2
+hooi1
+2hoom
+hoon1
+hoor4n3ac
+hoor3t
+2hoot
+ho1pe
+ho2pl
+hop1o
+hop1r
+hop4s3te.
+hop4str
+ho1ra
+1horl
+1horm
+ho1ro
+hor4s3te.
+hort3j
+ho1ru
+ho1sa
+hos1p
+ho1th
+hot3re
+hots3te.
+3hou4se
+ho1v
+2how
+how1o
+h1p
+hpi2
+h1rea
+hree3t
+hri2
+hrik1
+hro2k1
+2h1s2
+2ht
+ht1a2
+h3tans
+h1te
+h2t1ee
+hten3t
+hter3f
+hter3o
+hter3st
+h4t3esk
+hte3sp
+hte3st
+h4t3e4ve
+h2t1ex
+ht1h
+h4t3ins
+h4t3int
+ht1j
+ht1oe
+ht1of
+ht1om
+ht3ond
+ht3ong
+ht3oor
+ht1op
+ht1or
+ht1ov
+ht1r
+h2tre
+hts1a
+ht4see
+ht4s3erv
+ht3sla
+hts3le
+ht3slot
+ht3slu
+ht2s1o
+ht3span
+hts3par
+hts3pl
+ht3spoo
+ht3spre
+hts3taal
+hts3tak
+ht3stand
+ht3ste.
+hts3tek
+ht3stel
+ht3stes
+ht3stoet
+ht3stop
+hts3tore
+hts3trekk
+hts1u
+ht1u2
+htve2
+htver3
+hu2ba
+huit3j
+hul4der
+2hus
+hut1j
+hut3sta
+huur1
+huw4do
+h1v
+2h1w
+h2wu
+hy1le
+hy1o
+1hyp
+hype2
+hy4pe.
+hy4pes
+h1z
+2h1-
+i1aa
+i3abet
+i1abi
+i3abolisc
+ia4bor
+i1ac.
+i1ae.
+i1a1fa
+i1afr
+i1agn
+i1a1go
+i1a1gr
+i1ai
+i1ak.
+ia1ka
+i1ake
+ia4kem
+i1al
+i2a1la
+ia1lo
+i1ama
+i3amie
+i1an
+i3apas
+i1api
+i1app
+ia1pr
+ia4ren
+i1arr
+ia1sh
+i3aspo
+ia2st
+ia3str
+i1at
+ia1th
+ia1tr
+i5atri
+i1au
+i1a'
+ibie1
+i2ceo
+ice1s
+i1cha
+ic3hal
+i1che
+i1chi
+i1cho
+i1chr
+ic1kl
+ic3ko
+i1co
+ic4t3op
+ict4sc
+i1da
+id3aan
+id3ach
+i2daf
+id3arm
+id3art
+idas1
+id3as.
+idder3a
+id2dl
+i2de1a
+iden3a
+ide3ne
+ide4o3v
+ide1s
+i2dh
+idi1a
+idie3r
+idie3t
+idi3ot
+i1don
+i1dor
+id1ov
+id3ran
+id1re
+id1ro
+id2s1a
+id4sei
+id4s3erv
+id4set
+id2s1i
+ids1j
+ids1l
+idsmana4
+id3s4mee
+ids1o
+ids3pa
+ids3pi
+ids3taal
+ids3tal
+ids3tr
+id1u2r
+id1uu
+idu1w
+id1w
+ie1a2
+iecht3s
+ie4d3ac
+i1ee2
+ie3fle
+ief3ro
+ief3ru
+ie4g3as
+ie4gei
+ie4g3erv
+ie4g3ins
+ieg1l
+ie4k3e4v
+ie3klu
+iek3ond
+ie3kra
+ie3kri
+ie3kro
+ieks3n
+ie3kwa
+iel3aar
+ie3lak
+ie3lap
+iel3do
+iel3ei.
+iel1f
+iel1k
+ie3log
+iel3sc
+iel3sp
+ie4m3ov
+ie1na
+i1enc
+ie3ned
+ie3nev
+ie1ni
+ie4n3ij
+i1enn
+ien3o4g
+ien3ov
+iens4m
+ien3sp
+iens4t
+ien4stij
+ienst3o
+ien1t
+ie1o2
+iep3ach
+ie1pi
+iepiet3
+iep3oog
+iep3sc
+iep3ste
+iep3str
+ie4pui
+ier3aal
+ie3rade
+ier3a4l
+ie3ram
+ie3rap
+ier3as
+ie4r3at
+ier1f
+ier1g
+ier1k
+ier3oe
+ier3of
+ie3rol
+ier3ont
+ie3roo
+ie1ru
+ie3sal
+ie4sco
+ie3s4fe
+ie3sle
+ieso2
+ies3pl
+ie3sto
+ie3str
+iestudi3
+iet3ac
+iet3ant
+ie3the
+iet3ov
+ie4t3rot
+ie4t3ru
+iet3sten
+i1ety
+ieu1k
+i1eur
+i1eus
+ieuw4a
+i1euz
+ie2w1r
+ie-uit3
+if1d
+i2fec
+if1lu
+i1fo
+if1re
+if1s
+if4tre
+ift3ui
+if3tuu
+ig1da
+i2g1ij
+i4gind
+i4g3ins
+ig1le
+ig3lij
+i1gom
+ig3ond
+i1gr
+ig1sc
+ig1s2k
+ig1sl
+ig1s2p
+ig3ste
+ig3sto
+i1ha
+i1he
+i1hi
+i1ho
+ih1r
+i1hu
+i1hy
+i1i
+ii2g
+i2j1a
+ija2d
+ij1ei
+ij1el
+ije2n1
+ij1er
+2ijf
+ij1i
+3ijlin
+2ijn
+ij1ni
+ijo2
+ij1on
+ij1oo
+ij1or
+i1jou
+ij1ov
+ij1ui
+i1ka
+i2k1ac
+ik1ef
+iker3a4
+iker3k
+iker3st
+i4k3erva
+ik1j
+ik1lo
+i2k1lu
+ik1na
+i1kno
+i2k1o2g
+ik3ord
+ik1re
+ik1ro
+ik1sl
+ik3spo
+ik3spr
+ik3sto
+ik1ta
+ik1to
+ik3war
+ik1we
+i1la.
+il3aan
+il1ac
+il1ad
+il1af
+i1lak
+il1al
+il3ami
+i1lat
+il1au
+ild3ri
+ild1s2
+i1le
+i4l3erv
+ile1s
+i4lesp
+ilet3a
+ile4tj
+ile4t3r
+ilet3s
+ile1u2
+ilevin4
+i2l1e2z
+il1f
+il1g
+i1li
+ilie3r
+ilie3s4
+ilie3t4
+il1k
+ilk1s2
+il4lam
+illa3s
+1illu
+illus3t
+il4map
+il4m3ar
+il4mav
+i1lof
+il3ond
+il3oor
+iloot4j
+il3oph
+ilo2r
+il3ore
+i4lots.
+ilo1v
+il1pa
+il1po
+il1sa
+il1sc
+il3spo
+il2t1a
+il2th
+ilt1s
+i1lu
+i1l
+i3ma.
+i2meb
+i2mej
+i2mem
+im3emi
+im3enc
+imes3t
+i4meti
+i2me-
+imma4ge.
+imo1n
+i2m1op
+im3org
+im1pj
+1impu
+im2s1l
+ims3oo
+im1sp
+imte3s
+2i1na
+in1ac
+in3a4ker
+i2n1au
+in4dene
+inde3s
+in4d3e4va
+ind3s4c
+1indu
+in4d3uit
+i1ne
+in3e4di
+i4n3eed
+i2n1ei
+ine1o2
+i4nesm
+ine3ta
+inet4s
+in1ex
+1infe
+in4g3aa
+in4g3a4g
+in4gam
+in4gei
+3ingete
+ing3lo
+ing3ru
+in4g3uu
+i1ni
+ini3sta
+in1kj
+in1kn
+in4kna
+in3kro
+inli2
+innes3t
+1inno
+i1noc
+in1oe
+in1of
+in3ong
+ino3s4t
+in1ov
+inper4s3t
+in1sl
+in3smi
+in1sn
+in1sp
+in5sten
+in4sui
+inta4ge.
+in4t3ap
+intes3
+int1s
+i1nu
+in1un
+io1a
+ioas1
+i2ob
+io1c
+i3oces
+i1o1d
+i2odo
+i1oe
+ioe4ni
+io1fa
+i3ofiele
+io1fo
+io1fr
+io1g2
+io1l
+i1ol.
+i3olen
+i5ologeerde
+i3omen
+i3omer
+i1on
+io1na
+io4nof
+io4nop
+ion4st
+ion1t
+i1oo2
+iop2l
+io1pr
+i1opt
+iop4te
+io1ra
+io1ru
+i1os.
+i1osa
+io1sf
+io1sh
+i3osi.
+io1sp
+io1s2t
+i1o1su
+io1ta
+io1th
+i3othecai
+i3otheekj
+i3otheekl
+i1oti
+io1tr
+io1u
+io1w
+i1ox
+i1pa
+i2p1ac
+i2p1au
+i1pe
+ipe1k
+ipe4t3j
+i1pi
+ipi2r
+ip1j
+i1pl
+ipo4ge
+i1pot
+ip1ru
+ip1sc
+ip1sl
+ips2t
+ip3sti
+i1pu
+iput1
+i1q
+i1ra
+i1r2e
+iree3t
+ire1n
+i1ri
+irie3t
+irmi2
+i1r2o
+iro1p
+ir2sc
+ir1sp
+ir1ta
+ir1th
+ir1tj
+irt1r
+irt1s
+i1ru
+iru2s
+i1r
+is1aa
+is1ad
+is1ak
+i1sal
+is1ap
+is1a2r
+is1as1
+is1av
+i3scha
+ise2d
+is3eil
+is3eis
+is3elf
+ise3ra
+i4s3erv
+ise1s
+ise2t
+is3ete
+iset3j
+is4fee
+is4hen
+is1ho
+i1si
+is1i2d
+isie1
+i2s1ij
+i2s1im
+is3int
+is1j
+i1sji
+is1l
+is4lui
+is1na
+is3ned
+is3nij
+is1no
+i1soe
+1isol
+is3o4li
+is3ord
+iso1s
+is1pa
+is1pl
+is1po
+is1pr
+iss2c
+is1t
+is4t3ap
+is4tat
+i3s4termu
+is2tj
+is3t4le
+isty1
+i4style.
+isu2m1
+i1sy
+i1ta
+it1ap
+it1au
+i1te
+i2teb
+it3een
+iten3aa
+iten3t
+ite3rar
+2ite1s2
+i3tesk
+it3e4te
+it1ha
+itie3r
+itie3s
+it3ins
+it3jesg
+it3jesp
+i1tof
+it1oo
+i1top
+i1t2ou
+it3red
+it3rui
+it4sei
+it2sj
+it3sje
+its4mi
+its3te.
+it3stel
+its4ti
+it3stop
+itsu2
+its3ur
+its3uu
+itte3s
+2i1tu
+i1ty
+i1u2
+ium1
+iuma2
+i1v
+i2vec
+iven1
+ive1s
+i2ve-
+i1w
+iwes1
+iwi2
+2i1z
+i2zed
+i1
+i1
+i1
+i1ta
+i1-
+i-2ch
+i-2g
+jaar3t
+jacht3s
+1jag
+ja1kn
+ja1la
+ja1lo
+1jam
+ja1ne
+jan1o
+jans3l
+jan4s3t
+jan3tj
+jao2
+ja1pa
+ja1po
+ja1ro
+1jas1
+ja1sa
+ja1ta
+2jav
+j1b
+jbal1
+jbe4lu
+j1c
+jd1aa
+jd1ar
+j1das
+j2d1ee
+jde4n3e
+jdens3p
+j4d3erv
+jde1s
+jdo2
+j1dom
+jd1on
+jd1op
+jd1or
+jd1re
+jd1ri
+jd1ro
+jd3rui
+jd3sal
+jd3slo
+jd3slu
+jd3spo
+jds3pr
+jd1st
+j2d1u
+jd1w
+jea2
+1jeb
+1jec
+je1ch
+jec4t3a
+j1ee
+jeen1
+jee1t
+j1ef
+2jei
+je1kl
+je1la
+j1en
+je1na
+je1ne
+jene4t
+je3n4of
+1jep
+je1pi
+je1ro
+1jesa
+3jesbi
+3jeskn
+jes1l
+3jeslu
+3jesme
+jes1o2
+jes3pa
+jes3pu
+1jesr
+jes1t
+je3s4ti
+jet1s2
+1jeu
+1jeva
+1jevr
+j1ex
+1je-p
+jf1a
+jf1da
+j2f1ei
+j2f1en
+j2f1ij
+jf3lap
+j3flat
+jf1le
+jf1lo
+jf1o2
+jf1r
+jf4s3ec
+jf4ser
+jf4set
+jfs1j
+jfs1l
+jfs1n
+jfs3pa
+jfs3tak
+jfs3to
+jf1t
+jg1d
+jge3la
+jg1l
+j1go
+j1gra
+jg1re
+j1gro
+jg1sc
+jg2se
+jg1sn
+jg3ste
+jgs3tr
+j1h
+j1i2d
+j1ig
+ji4ge.
+jin1
+ji1t2j
+ji2ve
+j1j
+2jk
+jk3aan
+jk3aard
+j3kaart
+j1kap
+jk1au
+j2k1ij
+j4k3ins
+jk1j
+j4k3lap
+j3kled
+jk1li
+j3klon
+jk3lop
+jk1lu
+jk1na
+j1kne
+j1kni
+j1kno
+j2k1o2l
+j2k1on
+j4k3opl
+jk3raa
+j3kran
+jk3red
+jk3rin
+jk1ro
+jk1ru
+jks1a
+jks3le
+jks1n
+jk3span
+jks3pl
+jks2t
+jk3sta
+jk3sti
+jk3sto
+jk3stra
+jk1ta
+jk1to
+jk1ui
+jk3waa
+j3kwas
+jk1we
+jk1wi
+j1la
+jl3ana
+jl1d
+j1le
+j2l1ef
+j2l1e2l
+jl1f
+jl1g
+j1li
+jl3ink
+jl1k
+jl1oe
+j1log
+j1loo
+j1lop
+j1lot
+jl1p
+jl1sn
+jl1st
+j1lu
+j2m1af
+j2m1op
+jm1p
+jm1s
+jn3aak
+jn3aal
+jn3aar
+jn1ac
+jn1ad
+jn1a2k
+j1nam
+jn1a2p
+jn1ar
+jn1c
+jn1do
+jn1dr
+jnd1s
+j1ne
+j4neen
+j2n1ef
+j4n3erv
+j2n1ex
+jn1g
+j2n1im
+jn1k
+jn1o2
+jn1sa
+jn4sei
+jn2si2
+jns3la
+jn3slu
+jn3soo
+jns3pl
+jn4ste.
+jn1t
+j1nu
+jo2b1
+jo1d
+joet1
+jo1fa
+jo1go
+2joi
+jo3l2e
+j1om1
+jo1na
+joor1
+j1op
+jo1pe
+jo1ra
+jor1d
+jo1ru
+jo1ta
+1jour
+joy1
+j1pa
+j1pe
+j2p1em
+j1pi
+j2p1ij
+jp1j
+j4p3lam
+jp1li
+j1poo
+jpor1
+j1pot
+j1pr
+jp3rem
+jp3rok
+jp1s
+j1pu
+j1r
+2js
+js1a
+j1sch
+j2s1ef
+j4s3ela
+j2s1em
+j2s1er
+j2s1e2v
+js1h
+js1i
+js1j
+js3lan
+js3lie
+j1slu
+js1no
+js1o2
+j1soe
+j3spel
+j1spi
+js1pl
+jspoort3j
+j3spor
+jss2
+j3sta.
+j3stal
+j3stat
+js3teb
+j3stel
+js3tem
+js3ten
+js3tep
+js3terb
+j4s3terd
+j4s3tere
+j4s3teri
+js1th
+j3stoel
+j3ston
+js3tou
+j1str
+j4stran
+jst3rand
+j1stu
+j1ta
+j2t1ac
+j1te
+jt1h
+j4t3inc
+j4tind
+j1tj
+j1toe
+j1ton
+j1too
+jt3opt
+jt3raa
+jt3rei
+jt3rot
+jt1s
+j1tu
+1ju
+ju1d
+ju2k
+ju1ni
+ju1ra
+jus1
+j1v
+jver4sp
+jvie1
+j1w
+j1z
+jze4r3o
+j1-
+1ka.
+1kaal
+k3aanb
+kaap1
+kaart3j
+1kaas1
+kaats3te.
+1kab
+k1abs
+k1a2ca
+2k1acc
+3kache
+4k3acht
+2k1act
+ka1da
+1kade
+kade4t3
+k1adm
+ka1do
+k1adv
+2k1afd
+1kafe
+k1afh
+ka1f2l
+2k1afs
+k3aftr
+2k1afv
+2k1afz
+3kage.
+k3agen
+3kages
+1kah
+ka1i2
+ka1ka
+kak1s
+ka3lan
+ka3las
+k2ale
+1kalf
+kalf4s3
+k1alg
+k2alk
+kal4k3a
+kal4k3l
+kal4kr
+ka1lo
+1kam
+k1a2ma
+2k1amb
+kamen4
+kame4re
+2k1ami
+kam4pl
+kam4pr
+1kan
+ka1na
+ka1ne
+2k1ang
+ka1no
+kano3v
+kan4s3t
+kant3j
+kan4t3r
+1kap.
+1kape
+1kapi
+ka2p1l
+ka1po
+4kappa
+ka1pr
+kap1s
+1kara
+k1arc
+1kard
+2k1arm
+ka1ro
+kar1t
+4k3arti
+1ka2s
+kas1c
+kas1l
+kas1p
+ka4st
+kast3o4
+kast3r
+kas3u4r
+1kat
+kat3aal
+ka1th
+kati2
+ka4t3io
+kat1j
+k1atl
+kato2
+ka4t3og
+ka4too
+ka1tr
+kat1s
+ka4tui
+2k1aut
+k1avo
+1kay1
+1kaz
+1ka'
+k1b
+kbe2a
+2k1c
+2k1d
+kdan4c
+kdo1v
+kdri2
+1ke
+2k1e2c
+k1een
+kee4p3l
+keep3s
+kee2r
+keer4s3to
+kees1
+kee3tjes
+ke1fa
+2k1eik
+2k1eil
+kei1s2
+2k1eiw
+4kejes
+kel3aan
+kel3ac
+kel3da
+kel3do
+kel3dr
+4k3e4lem
+4kelj.
+ke3loe
+kel3o4p
+kel3ov
+kel3so
+kel3sp
+3keme
+ke4mis
+ken3ac
+ken3an
+ke3nar
+ke3nat
+ken3a4z
+ke3n4ei
+ken1o
+kens3le
+ken3sto
+ken1t
+ke1pi
+kepie3
+ke3rad
+ker1g
+ker4k3ra
+ker4n3a
+ker3oe
+ker3o4g
+ker3on
+ker3oo
+ke3ros
+ker4sti
+ker4stof
+4k3erts
+4kerwt
+ke3stel
+kes3ten
+kes3tra
+4kete.
+ke4ted
+ket1j
+ke2t1r
+ket3sp
+ket3sten
+ketting3s4
+ke2tu
+ke2vl
+2k1ex
+key1
+4k3e4zel
+2ke-
+2k1f
+k1g
+kgang3
+kge3la
+kge1n
+2k1h
+1ki
+ki2de
+ki2di
+2kied
+kies3l
+kiet3j
+kig1l
+kijf1
+kij4k3o
+2k1ijs
+2k1ijz
+ki1kl
+ki1la
+ki1lo
+4k3indel
+4kindu
+kine3a
+kin3en
+2k1inf
+kings3l
+2kinh
+2k1inr
+kin1s
+2k1int
+2k1inv
+ki1o
+2kipa
+ki2p1l
+kip1s
+ki1s2p
+ki3sta
+ki2te
+ki1th
+ki1tr
+kit4sc
+kits3t
+2ki
+2ki'
+k1ja
+k1jew
+k1jo
+2k1k
+kkaart4
+kka1t
+kken3sp
+kker4s3ten
+kke1s
+kl4
+1kla
+k3ladi
+k3land
+klap1
+k3last
+k3lat.
+3kledi
+klee2
+3kleed
+k3leer.
+2k1leg
+k3leid
+k1lek
+1klem
+2k1len
+1klep
+k1les
+1kle2u
+k1lez
+2k1lic
+k1lid
+k3lied
+3klima
+1klin
+k3lite
+k1loc
+k1lod
+k3loke
+1klom
+k3lone
+k3lood
+3kloof
+k3loop
+k3lope
+1klos
+klots3te.
+klo1v
+2kloz
+kluit3j
+2k1m
+kmee2
+4knaal
+kna2l1
+k1nam
+1knec
+knee2
+k2ner
+knie3t
+knik1
+knip1
+2k1niv
+1knob
+1knol
+1knop
+kno3pe
+1ko
+ko1a1
+ko2bl
+2k1oct
+ko1da
+2k1oef
+koes1
+koe3sta
+koets3p
+ko1fo
+koi1
+ko1ka
+ko1la
+ko3le
+kole4n3
+k1o2ly
+ko2m1a
+k3omsl
+kom4str
+2k1omz
+2k1onb
+kon3do
+2k1ong
+k2oni
+kont3j
+kon4t3r
+2k1onw
+koo2
+2k1oog
+koor3tj
+ko1pa
+2k1opb
+2k1opd
+ko3pe.
+2k1opg
+k1oph
+k3opsl
+ko1ra
+kor1d
+2k1org
+2k1ork
+kort3a
+kort3o4
+kort3s
+ko1ru
+ko2s1
+kos3o2
+2k1oss
+kot2j
+kots3te.
+kou3t4j
+2k1ov
+2k1ox
+k1p
+k1q
+k3raad
+1krac
+k1rad
+kradi3
+k1rai
+k3rand
+1kras
+krat3j
+k1rea
+2k1rec
+k3rede
+1kree
+kreet3
+k1ref
+k1rek
+k1res
+2k1ric
+kri2e
+k3rijk
+krijs3t
+krij4t3j
+1krim
+kri1o
+1krit
+4kritm
+k1rob
+k1roc
+2k1rol
+kron3t4
+4k3roof
+1krop
+krop3a
+kro4to
+k1rou
+k1ro1v
+kru2l1
+2ks
+ks1aa
+ks1ad
+ks1ak
+ks3alm
+ks1an
+ks1ar
+ks1as
+ks1av
+k2sca
+k1sch
+k2s1ee
+k4s3ei.
+kse4ma
+kse4mi
+k2s1e2p
+k4s3erv
+k2s1et
+k2she
+ksie1
+k1sil
+k2s1in
+ksi4te
+ks1j
+k2sk
+k3s4kes
+k3slac
+ks3lan
+ks3len
+k3sleu
+k3slot
+k1slu
+ks4mee
+ks1na
+ks1nu
+kso2
+ks1of
+ks1og
+k3song
+k1soo
+ksop1
+ks1or
+ks3par
+k3spel
+k3spor
+ks3pot
+ks3pra
+ks3pru
+kss2
+ks3taak
+k3stag
+k3stat
+k3stav
+k1ste
+k4stec
+k4stele
+k3s4tie
+ks4til
+ks4tin
+kst3op
+k3stot
+ks3trek
+k3stroo
+kst3uit
+ks1ui
+k1sy
+2kt
+kt3aan
+k3taar
+kt1ac
+k1tal
+kt3ana
+kt3art
+k3te
+k4t3e4co
+kter3st
+kte3sp
+kt3even
+kt1ha
+kt3hed
+k1thr
+k2t1in
+kt1j
+k1toe
+kt1om
+kt3ond
+kt3ope
+kt3ord
+kt3org
+kt1ov
+k1tr
+kt3rec
+kt3ren
+kt3res
+kt3reu
+kt3rij
+kt1sc
+kt1sh
+kt1sl
+kt3ste
+kt3str
+k1tu
+k1ty
+1ku.
+1kub
+ku3be
+kui2f
+ku3k
+1kun
+2k1uni
+kun4stu
+k1up
+ku1ra
+kur4ki
+kur1s
+1kus
+kut1
+2k1v
+kve2
+kvee1
+kvent3
+kver1
+kvide3
+k3waar
+k1wac
+2k1wag
+1kwal
+1k2wam
+k1wap
+1kwar
+2kwat
+k3weer
+kwee3t
+k1weg
+k1wei
+kwen4s3t
+k1wer
+1k2wes1
+3kwets
+kwets3te
+k1wez
+1kwir
+k1wo
+1ky.
+ky1l
+k1yo
+k1z
+1k
+2k'
+2k1-
+laad1
+laan1
+4laanb
+4laand
+l3aang
+4l3aant
+4l3aanv
+laap1
+l3aardi
+laar3t
+laas1
+laat3j
+laat3sta
+1lab.
+1labo
+4l3a4bon
+2l1a2ca
+l1acc
+la3ce.
+3lache
+lacht4s
+l2aci
+lad1a
+lad3ete
+la1do
+lad1s2
+la2d1u
+1lae
+2l1afd
+1lafe
+la3fle
+la1fo
+l1afs
+la2g1a
+la4gent
+lag1l
+lag1o
+la3gra
+lag1s2
+1lah
+lak1a
+4l3akko
+la4kla
+1lako
+la1kr
+lakte3
+la1la
+1l2ald
+la1l2o
+la4mid
+lamp3j
+lam4p3l
+lam4p3o4
+lam4s3p
+2lana
+la3nad
+landa4
+lan4d3aa
+lan4ded
+lan4d3ra
+land3re
+la1ne
+la4ne.
+la4n3ec
+la4nes
+lang3l
+lang3sp
+lang3sta
+lan4kan
+lan4k3l
+lank3w
+la3noo
+lans3l
+lan4s3t
+lan5s4ten
+lan3th
+lant3j
+lao2
+1la1pa
+1lapj
+lap1l
+lap1o2
+1lapr
+la3pre
+lap1s2
+lap4ste
+la2p1u
+1lapz
+1larg
+lar4ge.
+lari4
+4larm.
+lar4min
+1la1ro
+lar1s
+lasa2
+la3sch
+las1l
+las1p
+3lastl
+la1ta
+la4tes
+lat3he
+lats2
+lat3sl
+la4t3ui
+2lavo
+1law
+lay1
+la4zij
+1la
+1la-
+2l1b
+lba1t
+lber4t3
+lbet2
+2l1c
+lce2l
+l2cop
+2ld
+l1daa
+ldaat3
+ld1ac
+l1dad
+l1dak
+ldak4s3
+l2da2r
+ld3arb
+ld3ari
+ld3art
+ld3econ
+l4deen
+l2d1ei
+l4d3elf
+lden3k
+ldera4
+lde4r3at
+l2dex
+l2dh
+l4d3ins
+ld1o2l
+ld1om1
+ld3ond
+ld3ont
+ldo2p
+ld3opi
+ld3ori
+ld3ram
+l4d3rat
+l3dree
+ld3reg
+ld3ren
+ld3res
+ldri2
+ld3rol
+ld3rom
+ld3roo
+l1dru
+ld1sa
+ld1sc
+ld4scr
+ld1sl
+ld1sn
+ld3som
+ld1sp
+ld1st
+l4d3uit
+ld3uurr
+ld1w
+le2af
+le2ag
+le1a'
+le4del
+leden3
+4l3e4dit
+lee2g1
+leega4
+leege4
+4leekh
+leen1
+lee4pl
+lee2r
+lee4s3
+le1fa
+2leff
+le1fl
+legel3a
+l2ei.
+4leier
+2leig
+leii3ger
+4leind
+4leisar
+leit3s
+le1ka
+le1kl
+leko2
+le4kol
+le3kra
+lek3ri
+lek3str
+1lel
+le1la
+le4lek
+4l3e4lem
+le4lim
+2lemp
+l2en
+le3naa
+len3a4d
+len3a4k
+le3nar
+1lene2
+len3ei
+le4n3em
+1leng
+le1ni
+len1k
+len3o4g
+len3ov
+len3sn
+4l3en3th
+len3tj
+le1oa
+le1pi
+1le1ra
+le4rac
+le4r3a4k
+le4rau
+le4r3e4v
+le3roe
+ler3sk
+ler3sp
+4l3erts
+le1ru
+4l3erva
+le4s3et
+le3sho
+le3slu
+le3str
+lesu2
+le3taa
+le3tab
+le3te
+le4tem
+le1tj
+le1to
+le4top
+le4t3ri
+le4t3ro
+lets3t
+le2tu
+le3um3a
+le3umi
+leu3ro
+1leuz
+levink3j
+2lexp
+lf3aan
+l1fad
+l1fan
+l1fa2r
+l1fa1s
+l1fat
+lf1au
+l1fav
+lf1d
+l4f3ende
+l2f1e2v
+l2f1e2z
+l4f3ing
+l2f1ir
+lf1lu
+l1foe
+lf1o2l
+lf1om
+lf3org
+lf3rei
+lf1ro
+l1fru
+lfs1a
+lf4s3ei
+lfs3le
+lf1sp
+lf1st
+lf1t
+l2f1uu
+2lg
+l2gac
+l2g1af
+l2g1ap
+lg1d
+lge3la
+lgi1s
+l1gla
+lg1li
+lg1on
+l1g4oo
+lg1op
+lg1ov
+l1gr
+l4g3rom
+lg1s
+lg1ui
+l1h
+li1a
+1libe
+lid1s
+lie4g3a
+lier3st
+lie3st
+lie3ta
+lie3tj
+liet3s
+lie4tu
+li1eu1
+li1fa
+l2ig
+li1go
+lije2
+lijk3a
+lij4k3o
+lij4m3ac
+1lijn
+1lijs
+l3ijs.
+lij3sp
+lijs3te
+2l1ijz
+li4ke.
+li4kes
+li1kr
+lik1s
+li2kw
+li1la
+1limi
+lim4p3j
+l1inb
+lin3dr
+li4nec
+li4nev
+2l1inf
+l2ing
+lin4gi
+ling3l
+ling3r
+2l1inh
+l1inj
+4l3inko
+1linn
+li1no
+2l1inr
+lin1s
+l4ins.
+lint3j
+2l1inv
+2l1inz
+lio1
+li3ose
+li1o'
+lip3ar
+li2p1l
+li1po
+li1sa
+li3shi
+lis3pe
+2l1isw
+li1th
+li1to
+lit1r
+lits3t
+lit3s4ten
+2lix
+2l1j2
+2lk
+l1ka
+l4k3ank
+lk3art
+l2k1au
+l2k1em
+l2k1ep
+lking4
+lk1j
+l4k3lag
+lk3lev
+l1kli
+l1klo
+l1k2n
+lk3ont
+l1kra
+lk3rij
+lk3rot
+l1kru
+lkse2
+lk4s3ed
+lks1p
+lks3taa
+lk4s3tel
+lks3tr
+lk1t
+l1ku
+l2k1uu
+l1kwa
+l1ky
+2l1l
+lla1g
+ll3amb
+lla3tr
+ll1d
+ll3eig
+lle1k
+llen3s
+ller3o
+lle3s4m
+lle3st
+lli2f
+llo1f
+llo3tr
+l2l1ov
+ll1p
+ll1s
+llti4me.
+2lm
+lm3a4ca
+lm3act
+lm3arc
+l2m1au
+l2m1e2p
+l4m3erv
+lme3te
+l2m1e2v
+l4mind
+l4m3ins
+lm3oli
+lm1p
+lm1s2h
+lm1st
+2l1n
+lni2s
+lo1ac
+lo1al
+lo4boo
+lo4bor
+lo1dr
+loe4d3a
+loe4dr
+3loef.
+l3oefe
+2loeg
+loe1l
+1loen
+loen4s3t
+lof5d
+lo1fo
+4lo4gig
+log1l
+lo1go
+logs1
+log4sec
+log4sel
+1loj
+1lo1ka
+lo4k3ar
+lo4kee
+lok1l
+lo4k3op
+lo1la
+lo2li
+l1omg
+lomp3j
+lom4p3l
+l1omt
+l1omz
+lona2
+lo4nam
+2lond
+lon4gaa
+lon4gr
+1loni
+1lonn
+lont3j
+l3ontv
+1look
+loo2n
+3loopr
+loor1
+3loosh
+loo2t
+loot3e
+lo1pa
+l1opd
+lo1pe
+lo4pera
+lop4la
+l1opn
+lo1pr
+2lopv
+l1opw
+1loq
+1lor.
+lo3rad
+lo3rat
+1lorf
+l1org
+l1ork
+l1orn
+1lors
+1lor-
+lo4sce
+lo3spe
+lo4s3tr
+lot3ac
+lot3a4l
+lo4tet
+1loth
+1lotj
+lo4tof
+lou1s2
+2lox
+lo3yaa
+lo4y3aler
+1loz
+1lo-
+2lp
+lp3aan
+lp3age
+lp1am
+l1par
+l1pe
+lpe2n
+l2pex
+lp3ins
+lp1j
+l1pl
+l3p2la
+lp1of
+lp3ond
+lpoort3j
+lp3ope
+l1pr
+lp4ser
+lp1si
+lp1st
+l2pt
+l1pu
+l1q
+2l1r
+lrus1
+2ls
+ls1aa
+l1sab
+ls1a2d
+ls1a2g
+ls1ak
+l1sal
+l1sam
+ls1an
+l1sap
+ls1ar
+ls1as1
+l1sau
+ls1av
+l1sch
+ls4crip
+lse2c
+ls3eco
+l2s1e2d
+l2s1ef
+ls1im
+ls3ink
+ls3int
+lsi4te
+ls1ja
+l3slac
+l3slak
+l3slan
+ls3led
+ls3lee
+l3sleu
+ls3lie
+l1slo
+l3slui
+ls4maak
+l3s4mee
+l3smid
+ls3ned
+ls1of
+l1sol
+l3som.
+ls1o2r
+ls3pac
+l3span
+ls3par
+l1spe
+l1spi
+ls3pli
+l3spor
+ls3pra
+l1spu
+lssie3
+l1sta
+l1ste
+l4s3teko
+l4s3term
+l4stev
+l1sto
+l1str
+l4s3trak
+l4strans
+l1stu
+lsu2r
+ls3ure
+ls1us
+l1sy
+2l1t
+ltaar3
+l4tamp
+lte3na
+l2t1ho
+l2tl
+l2t1ov
+lt1sc
+lt1sl
+lt1sp
+lts3te.
+ltuur3
+l2tv
+l2twi
+1lua
+lu2b1e
+lu2b1l
+lu2br
+lu1ee
+lu1en
+lu1er
+1lui.
+1luia
+1luid
+3luie.
+luk4s3t
+lu1lo
+1lum
+lu1na
+1lunc
+2l1uni
+lu1ra
+lu2sp
+lu3sta
+lus3tra
+lu1ta
+lu1th
+lut1j
+luts3t
+l1v
+lven3s
+lver3a
+2l1w
+lwea1
+1ly
+ly1a
+ly1e
+l1z
+l1
+2l1-
+1ma
+2maad
+maal3sp
+m3aanb
+2m1aap
+m1adm
+ma1do
+2m1adr
+2m1adv
+2m1afd
+ma1fo
+2m1afs
+2m1afw
+ma1gl
+ma1go
+ma1gr
+ma1ka
+ma4ke.
+ma4kes
+ma3ki
+4m3akko
+ma1kr
+ma1la
+ma4l3ent
+mal3sp
+ma1lu
+man3ac
+ma3nak
+4m3anal
+man3do
+ma1ne
+man1g
+ma1no
+man4see
+mans3p
+man4s3ta
+man4ste
+ma1pa
+ma1pr
+2m1arb
+mariet3
+ma1ro
+mars4h
+mar3sha
+mar4s3t
+ma1sa
+ma3sch
+mas2h
+ma3she
+ma1so
+ma1sp
+ma3str
+ma1ta
+ma4tes
+ma1th
+mat1j
+ma1tr
+mats3te.
+m2a'
+mbo1s
+m1c
+mcel1
+m1d
+m2dh
+m2dj
+mdo1p
+md1so
+md3ste
+1me
+me1ad
+me1an
+me1ar
+me2at
+me1c
+mede3s4
+medie3
+4medro
+mee3kr
+mee3las
+meel3d
+mee3lo
+meer3a
+mee3sp
+meest3a
+mee3sto
+mee3str
+mee3tj
+mee4tu
+meg2a
+mega3s4
+m1eig
+me1ka
+me1kn
+me1kr
+me1kw
+m2el
+mel3ac
+me3lad
+me3lak
+me3lar
+mel3as.
+mel3dr
+me4lel
+3melk
+mel4ko
+me3lom
+me3lot
+mel3s4m
+mel3sp
+memana4
+m2en.
+me3nad
+me3nar
+me3n4as
+me1ne
+men4g3ra
+meng3s
+me1ni
+me4n3ij
+men1k
+me3nor
+men3ov
+men4s3te.
+men4sure
+men4s3uu
+ment3ac
+ment3j
+men4ton
+me1nu
+me1of
+me1om
+me1p2j
+2m1e2q
+mer3aak
+me3rab
+me3rad
+me3rag
+me3ral
+me3rama
+mer3ante
+me3ras
+me4r3ei
+mer1f
+merk3lo
+mer3of
+me3rot
+merrie3
+mer4sta
+me3rui
+m2es
+me4sca
+me4sco
+mes1h
+me1sl
+me3sol
+mes3pa
+me3spe
+me3spo
+me3stel
+mes3ten
+mest3ov
+me1t2a
+me4tera
+me1th
+meti4m
+me1tj
+me1to
+met3sten
+me1ui
+m3e4ven
+mever3
+2m1ex
+m1f
+mfi1t
+mf2o
+m1g
+mge3la
+mge1r
+m1h
+mhoog3
+1mi
+mi1a
+mi1ch
+2mid.
+2mids
+mie1l
+mie3s4t
+mijn3s
+2m1ijs
+2m1ijz
+mi1kn
+mi1la
+mi4laa
+mi1lo
+mime1
+m1imp
+mi4nac
+m2ine
+2m1inf
+ming4s3
+4m3inko
+mi1no
+2m1inr
+m1inv
+mi1oc
+mi1of
+mi1op
+mi1ot
+mi1ov
+mi1p
+m2is
+mi3sce
+mi3sfe
+mi4sin
+mismana4
+mis1p
+mis4tac
+m2it
+mi1to
+mi1tr
+mits3t
+m1j
+m1k
+2m1l
+m1m
+mma1f
+mmana4gem
+mmi3s4l
+m1n
+1mo
+mo1a
+mo1da
+mo1do
+moed4s
+2m1oef
+moe3fl
+moer4s3t
+moe2s
+moes3p
+moes4te
+moet3j
+mo1g
+mo2g1a
+mo1ka
+mo1la
+mo4lie
+2molt
+2m1omv
+mo3nad
+mo3nar
+mon1g
+mono5l
+mons3h
+mons4t
+moo2
+mooie4
+moor3t
+mo1pa
+2m1ope
+2m1opn
+mop4sn
+m1opw
+m1opz
+mo1ra
+mo3re
+mo1ro
+mor4sp
+mor4s3t
+mos2c
+mosce4
+mo1sj
+mo2sl
+mo3sta
+mo1ta
+mo1th
+moto4l
+mots3t
+2m1oud
+mo1w
+m1ox
+mo3yant.
+m1pa
+mp3ach
+m2p1af
+m4papp
+mp3arts
+m1pe
+m2p1ec
+m1pi
+mp3inr
+mp3ins
+m1pl
+mp3lei
+mp3lev
+mp3lie
+m2p1lu
+m1po
+mp3oef
+m4p3ope
+mpo1v
+m1pr
+mp3rec
+mp3red
+mp3ring
+mp1s2
+m1pu
+m1q
+m1r
+ms1aa
+m1sal
+m1sam
+ms3ana
+ms1ap
+ms1ar
+m1sau
+m1sc
+ms2ce
+mscenari3
+m2scu
+ms1h
+m1si
+m1sje
+m1sl
+ms2me
+ms2mi
+ms2mo
+m1s4n
+m1sol
+m1son
+ms1o2r
+m3spande
+m1spl
+m1spo
+m1sta
+m1ste
+m4stec
+ms2ti
+m3stig
+m4s3ton
+m3stor
+m1str
+mst3rom
+m1stu
+mstudi3
+ms1ui
+m1sy
+m1t
+mtes2
+mto1v
+1mu
+4muilt
+2m1uit
+2muk
+mu1lo
+mul1p
+mu1lu
+mu2m1
+mu1na
+mu1ni
+munie3
+mu1no
+munt3j
+mu1ra
+mu1sa
+mu1sh
+mus3ta
+mu1ta
+muts3t
+m1v
+mve2
+mvee1
+mver1
+m1w
+1m2y
+my1a
+my1e
+m1z
+mze2t1
+1m
+1m
+1m
+m1-
+1na.
+1naad
+1naal
+1naam
+n1aan1
+3naar.
+n3aardi
+n3aards
+3naars
+4n3aarsa
+4n3aarsv
+naar3t
+3naar-
+n3aas.
+3naast
+1naat
+naat3s
+na4bon
+n1aca
+1nace
+2n1act
+1na1d2a
+3nade.
+3nadem
+3nades
+1nadi
+n1adm
+na1do
+na1dr
+4n1adv
+1nae
+n1af
+2nafb
+na1f2l
+2nafs
+1na1g
+1nai
+1nak.
+na1ka
+na1k2l
+na1kr
+n1ala
+1nale
+nal1k
+n1alm
+na3loo
+1nalt
+2naly
+1nam.
+1nama
+1name
+name3s
+1nami
+n1amn
+n1amp
+na3nac
+na1ne
+n1anj
+na1no
+3nant.
+nan4ta
+n3antenn
+3nants
+3nant-
+nap3ac
+na1p2l
+na4pos
+na1pr
+nap3ste
+1nap
+na2r1a
+n1arb
+3narco
+1nard
+1nare
+na4rend
+n1arg
+narie3
+n1ark
+2n1arm
+na1ro
+nar4s3te.
+n1art
+na1s2a
+na1sc
+na1s2l
+nas4ma
+na1sn
+1nast
+na4ste
+na3stu
+1nat.
+1na1ta
+n3atel
+1nati
+nat1j
+n1atl
+na1t2r
+nat3sp
+nat3ste
+1natu
+1nau.
+1naus
+3nazif
+n3a4zij
+1na
+1na'
+1na-
+n1b
+nbet2
+nbots3t
+2nc
+nca2k
+n4cepa
+nce3sp
+nces4t
+ncest3e
+n4cete
+n1che
+n1chi
+n1chl
+n1chr
+nch1t
+nch1u
+n1co
+2nd
+n1daa
+nd3act
+n4d3ana
+nd3arb
+n3darm
+nd3art
+nd3as.
+nd3ass
+nd3e4del
+n4d3edi
+n2d1ei
+nde4r3an
+n4d3e4rec
+nde4rei
+nde4r3in.
+nde3sl
+nde4ten
+ndiet3j
+n4d3ijs.
+n4d3ijz
+n4dink
+n4d3ins
+ndi1o
+n1dob
+n2d1of
+nd3o4lie
+n1dom
+n3dona
+n4d3ond
+nd3ont
+nd3oog
+nd3ope
+nd3ove
+n4d3rap
+n4d3rat
+nd3reg
+nd3rei
+nd3rese
+n4dret
+nd3ric
+nd3rot
+nd3rug
+nd3sal
+nd3san
+nd1sc
+nd4sce
+nds4cu
+nd4sei
+nd1s2i
+nd3slu
+nd3s4mee
+nds3pat
+nd3spi
+nd3spri
+nds3taal
+nds3tal
+nd3stan
+nd3ste
+nds3trek
+nd3stri
+ndu2r
+n4d3ure
+nd3uri
+nd1w
+1ne.
+1nea
+ne1ad
+ne1am
+ne2ap
+ne1ar
+nebe4st
+1neck
+ne1d
+nede4n
+ne4dit
+n1e2du
+1nee2l
+neel4ste
+1neem
+n1een
+neen3s
+1neer
+neer3s
+1nees
+1neet
+neet3a
+neet3o
+neet3r
+ne1fa
+2n1eff
+ne1fl
+ne1fr
+n1eg.
+1nega
+nege4n3
+n1egg
+ne1g2l
+ne1go
+1negr
+1neh
+n3eier
+n3eige
+n1eii
+n1eik
+n1eil
+n1ei2n
+2neis
+1nek
+ne1ka
+ne1kl
+nek1s2
+ne1ku
+ne2la
+nel3aa
+nel1d
+n3e4leg
+ne4lek
+ne4l3el
+4n3e4lem
+ne1lo
+1nem
+2n1emb
+4n3e4mig
+2n1emp
+1nen
+n4en.
+nen1a
+nen3ei
+ne2ni
+n3enig.
+n3enige
+n3enighe
+nen1k
+nen1o2
+n1enq
+nensi4
+nen3slo
+nen3slu
+nen3sp
+nen3st
+1neo
+ne4ona
+neo1p2
+ne4ore
+ne4p3ag
+nep1s
+1ner
+ne1ra
+ne4rac
+n3erfe
+4nergiem
+ne4r3id
+ne3rol
+ne3ros
+n3erts
+ne1ry
+1nes
+ne1sa
+ne3s4ka
+ne1sl
+ne1so
+ne1sp
+nes4sa
+nes4st
+ne3sta
+nes4tei
+nes3ten
+ne3str
+nestudi3
+1net.
+net3ac
+net3am
+ne4tec
+4n3e4tenl
+netes3
+ne4tet
+net3ha
+1neti
+ne4tin
+ne1tj
+net3on
+ne3top
+net3ov
+1netr
+net3spa
+1nett
+2netu
+1netw
+ne3um.
+neu3ra
+neu3ro
+neu4t3jes
+ne4val
+ne4zel
+1ne
+1ne-
+n1f
+nfra4m
+n2gac
+n2g1a2d
+n2g1af
+n2g1ak
+ng3ala
+nga3sl
+ng1d
+nge4ant
+ng3eig
+nge3las
+nge4n3ar
+ngen3st
+ngeper4s3
+nge4ras
+n2g1ij
+n4gind
+n4g3inf
+ng3ink
+n4g3inr
+ng3ins
+n4g3inz
+ng3lad
+ng3lan
+ng3lee
+n3gleu
+n1glu
+n1g2oc
+n2g1of
+ng1om
+ng1on
+ng1op
+ng1ov
+n1go'
+ng3rac
+ng3rad
+ng3rai
+n3gred
+ng3rie
+ng3rin
+ng4s3eco
+ng4sen
+ngs3lop
+ngs3lu
+ngs3ne
+ngs3po
+ngs3tak
+ngs3tek
+ngs3tem
+2n1h
+nhaat3
+nhap1
+1ni.
+1nia
+ni1ak
+1nic
+1nid
+1niek
+nie3kw
+nie1n
+1nier
+nier3o
+niet3st
+ni2ga
+ni4g3ee
+3niger
+3night
+1nigt
+1nij.
+1nije
+nij1f
+nij4pr
+4nijs.
+3nijve
+2n1ijz
+ni1kl
+ni3ko
+1niks
+nik4s3te
+1nil
+1nimf
+n1imp
+1nin
+n1inb
+2n1ind
+2n1inf
+4n3ingan
+ning3r
+2n1inh
+n1inj
+4n3inko
+n1inl
+2n1inr
+2n1ins
+2n1int
+2n1inv
+1nio
+ni1ok
+ni1ol
+ni4one
+ni1or
+ni2p1l
+nip1s
+1niq
+1nir
+nir1s
+3nis
+ni4s3ec
+ni4sei
+ni4s3el
+ni3she
+ni2s1i
+ni2sl
+nis1n
+nis1p
+nis4taa
+1nite
+ni1th
+5nitieerde
+nit1j
+ni1to
+ni1tr
+nits2
+1niu
+1niz
+ni2
+1ni
+n1j2
+nje3tj
+2nk
+n1ka
+n4k3aan
+n4keen
+n2k1em
+nking4
+nk3inh
+n1kle
+nk3lij
+nk1lu
+nk3nab
+n1kni
+n1kno
+nk2nu
+nk3o4ge
+nk3rel
+nk3ren
+n1kru
+nk1s2c
+nksce4
+nk1sl
+nk1sn
+nks3om
+nk1sp
+nk1s2t
+nk3tan
+nk1to
+nk4tre
+nk4t3ro
+nkt1s
+n1ku
+nk3uit
+n1l
+nlaat4j
+2n1m
+nmes1
+n1n
+nna1s
+nn2e
+nnee3t
+nnepo4
+nne4p3ol
+nno1v
+1no.
+no1a
+1noci
+1no1d
+2noef
+noek3s
+noen3s
+noep3s
+noes3t
+noet3j
+no1fo
+no4gal
+n1o2gi
+1nogr
+1noi
+no1ka
+no1kr
+no1kw
+no1la
+no4lie
+1n2olo
+n1om.
+1noma
+1nome
+n1omg
+1nomi
+n1omk
+n1oml
+n1omr
+n1om1s
+n1omv
+n1omw
+n1omz
+1non.
+1nonb
+1nonc
+2n1ond
+n1ont
+1nood1
+n1oog
+1noot
+1n2o1pa
+n1opg
+n1oph
+n1opm
+n1opn
+n1op1r
+n4opte
+n1opv
+2n1opz
+1nora
+n1org
+1norm
+4norre
+1nors
+nor1t
+1nos
+no1sa
+no1sf
+no1sh
+nosi2
+no1sn
+no1sp
+1not
+no1ta
+no4teb
+no1th
+1nou.
+n1oud
+1nova
+3novee
+n3overs
+1nox
+1n2oz
+1no
+1no
+1no'
+1no-
+2n1p2
+npoort3j
+n4puts
+n1q
+2n1r
+nrif1
+nri1o
+nroes3
+2ns
+ns1aa
+n1sab
+ns1ad
+n1sag
+ns1ak
+n1sal
+n1sam
+ns3ang
+n1sap
+ns1av
+nsbes4
+n1sc
+ns4cal
+nscenari3
+n2s1co
+n2scu
+n2s1ef
+ns2ei
+n4s3eil
+n4s3eis
+ns3emp
+nse4ne
+ns4ham
+ns3he
+ns1hi
+n1si
+ns3ink
+nsi4tes
+ns1ja
+ns4kri
+n3slaa
+ns3laag
+ns3lap.
+ns3lapp
+n3slee
+n3slep
+ns3let
+n3slim
+n3slip
+n3sloe
+n3slop
+ns3lot.
+ns4mak
+n3s4med
+n3s4mel
+ns1na
+n1sne
+n3snoe
+n1soe
+ns1of
+n1sol
+n3som.
+ns3ong
+ns3onw
+ns3onz
+ns4opp
+ns3ork
+n1sou
+nsour4
+n3span
+n3spec
+n3spel
+ns3ple
+n3s4poe
+n3sprak
+nsregi3o
+nss2
+n1sta
+nst3aang
+nst3aans
+nst3ac
+nst3afd
+n1ste
+n4stec
+n4s3teel
+n4st3ei
+n4s3teko
+n4s3teks
+n4s3tes
+n4st3e4v
+n1s2ti
+nst3ing
+n3stom
+nst3opl
+n3stor
+n3sto3v
+n1str
+ns3troe
+nst3roos
+n1stu
+nstudi3o
+nst3uit
+n2sty
+n1su
+ns3uil
+n4suit
+n1sy
+2nt
+n1ta
+n4taanv
+n4t3aard
+ntaar3t
+n2t1a2d
+nta4ke.
+n4tamb
+nt3ana
+n1te
+nt3een
+nt3eig
+nte3la
+nte4nen
+nten3s4
+nte3rad
+nter3ap
+nt3erf.
+nt3erfd
+nt3erft
+nte3so
+nte3sp
+ntes3tat
+nte3sti
+nte3str
+nt3han
+n3t4her
+n3thol
+ntie3s
+n4tind
+n4t3ins
+n1to
+n4t3o4li
+ntoor3
+n4t3opl
+n1tr
+nt3raf
+n4t3rij
+n4t3rol.
+nt3room
+nt3rui
+nts1a
+nt1sl
+nt4sle
+nt3soo
+nts3pre
+nt3ste
+nt3s4ti
+n1tu
+n4t3uit
+ntu2n
+ntune4
+nt4win
+n3t4wis
+n1ty
+1nu.
+1nu1a
+1nub
+1nuc
+1nue
+nu1ee
+nu1en
+nu1er
+nu3et.
+nu3ett
+nu1fa
+1nug
+2n1uil
+1nuk
+nu1ka
+1nul
+1num
+1nunc
+n1uni
+1nuri
+nu1ro
+nur4se.
+1nus1
+nu4ter
+nu1tr
+nuts3t
+1nuw
+nuw1a
+nu2w1i
+1nu'
+n1v
+nve3lo
+nve2r1
+2n1w
+nwa2v
+nwer4kr
+nwes1
+nx1a
+n1xe
+nx1o
+1ny
+2n1ya
+2n1y2i
+2n1yo
+n1z
+nzet3j
+nzet3s
+1n
+1n
+n1
+n1-
+o1aa
+oad1s
+o1af
+o1ag
+o1a2k
+o1a2m
+o1an
+oap1
+o1app
+oa2r
+o1ass
+o1au
+o1av
+o1ax
+o1a2z
+obal4t
+1obj
+ob3oor
+obo2r
+ob3ore
+1occ
+1o2cea
+o1cha
+o1che
+o1chi
+o1chl
+o1cho
+o1chr
+o1chu
+oci1a
+3ocides
+o1co
+oct2
+od1ac
+od1ad
+od1ar
+o3de.
+odel3s
+ode4m3ar
+ode4mat
+ode4mon
+ode1o
+ode3ra
+ode1s2
+2odi1a
+odie3t
+2odir
+od3ong
+od3ons
+od3op.
+od3ord
+2odr
+od1re
+od1ri
+od1s2c
+od1s2i
+ods3lam
+od3sli
+od3slo
+od3spo
+ods2t
+od3s4ta
+ods3te.
+od3sti
+od3str
+od1ui
+od1w
+2ody
+o2e
+oe1a
+oe4d3aa
+oe4d3a4d
+oe4d3ar
+oede3s
+oedo2
+oe4d3og
+oe4d3on
+oe4dop
+oe4dov
+oe2d1u
+oe2d3w
+oe2fa
+oe4fin
+oef3la
+oef3le
+oe3flu
+oe2f1o
+oef1r
+oe2f1u
+oege3l
+oe4gij
+oeg1l
+oei1s2
+oek3ac
+oek3ar
+oe4k3erk
+oe4kil
+oe2k1l
+oe4k3op
+oek3ra
+oek3re
+oek3ri
+oek3we
+oe3lak
+oe3las
+oel1d
+oel3ein
+oe3lon
+oe3lop
+oel3ov
+oel3sp
+oe4m3ac
+oe2m1o2
+oem1s
+oen3ac
+oe3nee
+oen3el
+oe1ni
+oe4nink
+oen3sl
+oen3spar
+oen3sto
+oen1t
+2oep
+oe4p3ac
+oep3ind
+oe2pl
+oep3lu
+oe2p1r
+oep4s3e
+oe2p1u
+oer3aa
+oe3rak
+oer3a4l
+oe3ras
+oer3ei.
+oe4r3el
+oe3re4n
+oer1k
+oero2
+oer3og
+oer3om
+oer4so
+oer4spi
+oer4s3te.
+oer3str
+oer4su
+oer4th
+oe1ru
+oes1a
+oe1sl
+oe4s3li
+oe1sn
+oe1sp
+oes4tal
+oe3taa
+oet3ac
+oete3s
+oet1h
+oe4tij
+oet1o2
+oets3l
+oet3sta
+oet3sten
+oe4t3ui
+2oez
+2ofa
+of1am
+o1fan
+o1fas
+of1a2t
+of1au
+of1a2v
+ofd1a
+of4da4g
+of4dan
+ofde2
+of4d3ei
+of4d3el
+ofd3on
+ofd3oo
+ofd3re
+ofd3ri
+ofd3ro
+of2d1u
+ofd1w
+3offens
+of1l
+o1foe
+of1om
+of1ox
+of1ri
+of1ro
+ofs1i
+of1s2m
+of1sn
+ofs3pl
+of3ste
+of3sto
+ofs3tra
+of4tij
+of1tu
+of1ui
+og1af
+og3al.
+og1ap
+og1au
+og1dr
+og3ede
+oge4l3ei
+oger3o
+oge4s3t
+ogie1
+1ogig
+og1la
+og1le
+og1lu
+og1ov
+o1gr
+o4g3red
+og3se
+og4ser
+og3stan
+ogst3ap
+og1ui
+o1h
+oi1a
+oi1e
+oien1
+oi1k
+oi1l
+oi1o
+oi1p
+oi1sc
+oi1sp
+ois2t2
+oi3ste
+oi1su
+oi1t
+o1j
+oj1k
+okaal3
+o4k3aas
+o2k1ac
+ok3ank
+ok1au
+o2k1a2z
+o2k1ef
+ok1ei
+o2kes
+o3kie
+ok1j
+ok1lo
+ok1lu
+ok1n
+ok1on
+ok3op.
+o2k1ou
+ok1ri
+ok1ro
+ok1s2a
+ok1sc
+oksi2
+ok1sl
+ok1sn
+ok1so
+ok3spe
+ok3spi
+oks3po
+oks2t
+ok4s3te.
+ok3sti
+ok3sto
+ok1ta
+okter4s
+ok1to
+oku2
+ok1ur
+ok1uu
+ok1we
+ok1wi
+o1la.
+olaat4
+ol1ac
+ola2g
+ol1a2p
+ol3arm
+ola3s4m
+ola3tr
+ol1au
+2ol1d
+old2w
+o1le
+o2l1ei
+ol3eks
+olen3s
+ol2er
+ole3ro
+oleu2
+ole3um
+olf1l
+ol4g3ri
+ol2gu
+o1li
+olie3s
+o3lig
+oli1k
+o3lit
+ol4k3ac
+ol1kl
+ol1kw
+olmana4
+o1lo
+olo1f2
+5ologiseerden
+olok2
+ol3op.
+olo3s4t
+ol1pa
+ol1pi
+ol1po
+ol1sc
+ols1h
+ol1sj
+ol1sl
+ols4n
+ol1sp
+ols2t
+o1lu
+ol3uit
+1olus
+o1l
+omaat3
+om3act
+om1af
+oma2g
+om1au
+om1av
+2ome
+o2m1ef
+omen4s3
+omer3sp
+om3eti
+omie1
+o4m3ins
+ommana4
+omme3s
+omo1s2
+omo1v
+om4p3ei
+om3soe
+om3soo
+om3sto
+om1ui
+1omze
+2ona.
+on3aar
+on1a2b
+on1ac
+o2naf
+o1nal
+on3all
+on3ame
+on1ap
+o1nas
+o1nat
+ona3th
+on3att
+2o1naz
+on1c
+ond3ac
+3onderz
+ond3ete
+on4dex
+on4d3ij
+ond3om.
+ond3op
+ond3re
+ond3ro
+ond3sj
+o1ne
+o2n1e2c
+one2d
+on3ede
+on3eet
+on1ef
+o2n1ei
+one3la
+on3erv
+on3est
+on1e2v
+o2nex
+4ong.
+ong3aan
+on3gla
+ong3li
+on4g3oe
+on1gr
+ong3sp
+ong3st
+o1ni
+on1i2d
+onie3t
+onig1
+on4k3ac
+on4k3ap
+on1kn
+on1kr
+on1kw
+onne3s
+o1no
+on1oe
+on3off
+2onom
+on3opl
+on3opt
+on2or
+on3ord
+on3ort
+on1ou
+o2n1ov
+on3se
+on4sem
+on2sj
+on3sla
+ons3le
+on3sor
+on3spo
+on3spr
+on1st
+on4t3aar
+1ontd
+on4t3erv
+1ont1h
+on4t3id
+onto3v
+ont3rade
+on4t3rem
+ont3rie
+on4t3rom
+on4t3ru
+ont1s2
+1ontw
+o1nu
+on1ui
+on1u2r
+1onvr
+o2o
+oo3c
+oo2d
+ood1a
+ood1e2
+ood1i
+ood3ox
+ood1r
+ood3sl
+2oof
+oo3fi
+oof4str
+oo2g
+oog1a
+ooge2
+oog3ee
+oog3en
+oog1l
+oog1o
+oog1r
+oog3s4p
+oog3ste
+4ooi
+ook1a
+oo2ki
+oo2k1o2
+ook1r
+ook1s2
+ook1w
+ool1
+oola2
+oo4lij
+oolo2
+oo2m1a
+oome2
+oo2m1i
+oo2m1o
+oom1p
+2oon
+oon1a2
+oon1d
+oon1g
+oon1k
+oo2n1o
+oon3sp
+oon1t
+oop1
+oopa2
+oo4pee
+oo2pl
+oopo2
+oo2r
+oor1a2
+oor4don
+oor1e2
+oor1i
+oor1o
+oor3sma
+oor3st
+oor3to
+oor3tr
+oo2se
+oo2si
+oos1p
+oost3o
+oot1a
+oot3es
+oot1h
+oo2t1i
+oo2t1o
+oot1r
+oo2tu
+op3ach
+op3act
+op1ad
+op1af
+op3akk
+op1a2m
+op1an
+op3arc
+op3at.
+op3atl
+op3att
+o1pea
+o1pee
+op3een
+op3eet
+o1pek
+o1pel
+o4p3elp
+3o4peni
+3opera
+o3perd
+o3pere
+o1pe2t
+op3ete
+o1peu
+op1e2v
+o1pi
+o2p1id
+opie3t
+op3in.
+o4pind
+op3ins
+op1j
+op1l
+op4las
+opoe1
+op1of
+o1pog
+o1poi
+op3ond
+op3ont
+op3oor
+op3opl
+op3ord
+op3o4re
+op3ork
+op1ov
+op3reg
+op3rie
+o3prij
+op3roe
+op3rol
+op3roo
+op1ru
+op1s
+ops2c
+opsce4
+ops2t
+2opt.
+o1pu
+op1ui
+o2p1un
+o1q
+o1ra.
+or3aalo
+o1rab
+or3act
+oradi3o
+or1af
+o1rai
+o1rak
+o4r3alg
+o1ram
+or3ana
+o3rand
+or1ap
+or1as
+or1au
+or1av
+o1rax
+o1ra'
+or4ce.
+ord3aa
+or4denve
+ord3ond
+ord3oo
+ord3or
+or1dr
+ord1w
+o1re
+2ore1a
+2orec
+2oreg
+o2reh
+ore1k
+oren3o
+oren3t
+2orep
+ore3s4p
+o2re-
+orfiet3
+or1fl
+or1fr
+org1l
+or2gu
+o1ri
+o3ri.
+orie3t
+o4r3ind
+o4r3ink
+or3ins
+o4ril
+or1ka
+or1kl
+or1kn
+or1kw
+or4m3ei
+orno3s4
+or1oe
+o1rof
+or3o4li
+o3roll
+2orom
+or1on
+or4ona
+or1oo
+or1op
+or1or
+o1ros
+or1ou
+or1ov
+orp4sc
+orradi3o
+or3saa
+or3s2c
+or1si
+or1sl
+ors4maa
+or1sn
+or4son
+or1sp
+or3str
+ort3aan
+ort3ak
+ort3ass
+ort3een
+orte3na
+ort3ha
+ort3ond
+ort3oo
+ort3sp
+or1ui
+oru2m
+2o1ry
+os1aa
+os2af
+o1sau
+o1sc
+1o2sci
+os2cl
+o4scoopd
+os2cr
+o2scu
+o2s1ei
+ose2t1
+o2se-
+o1s2fe
+o1shi
+o1si
+osi1t
+os1j
+os1l
+osli2
+osmo1
+os1na
+o1s2o
+oso1p
+os1pa
+os3per
+o1spo
+os3pri
+ost3ac
+ost3age
+o3stat
+os1te
+os4tem
+o3s4tim
+os2tj
+ost3ri
+o3stru
+os3tur
+os3tuu
+o1sty
+os1ui
+o1sy
+5osyncrasie
+o1ta.
+ot3aar
+ot3ach
+ot1af
+o1tag
+ot3akk
+ot3akt
+o1tam
+o1tan
+otan3s
+o2t1a2p
+ota1s2
+ot3as.
+o1tat
+ot1av
+ot1ay
+o1te
+3otech.
+3otechb
+o2t1ei
+o2tej
+ote4lan
+ote4lu
+oten3s
+o3ter
+oter3s
+ot3eta
+ot1ha
+3otheco
+o1thi
+ot3hou
+ot1j
+otje3sp
+o1to
+ot3off
+ot2on
+otoot4
+ot3opm
+oto3po
+oto1s
+ot1ou
+oto3ve
+ot3rec
+ot3red
+ot3res
+ot3rij
+ot3rit
+ot3ron
+ot1ru
+ot1sc
+ot4sei
+ot1si
+ot3s4mo
+ot1sn
+ot1so
+ots3pa
+ot3spl
+ot3spo
+ot3spr
+ot3sta
+ots3tek
+ot3stel
+ot3s4ten
+ot2tw
+o1tu
+ot1ui
+o1ty
+2ou.
+ou1a1
+ou1c
+ou4dez
+ou1e
+ou1k
+ou1lo
+ou1po
+ou1ra
+ou4r3env
+our1k
+our1o
+our1t
+ourw2
+ou1sa
+ou2s1c
+ou4set
+ou2sp
+ous1t2
+out1h
+out1j
+ou2t1o
+out1r
+out3sp
+out3sta
+out3ste
+o2veg
+oven3t
+ove4rat
+3overg
+ovide3o
+o1vo
+2ovs
+o1wa
+o1we
+owes1
+o1wi
+ow1r
+ow1s
+ow4set
+oy1eu
+o1yo
+oys2t
+o1z
+o1
+o2ma
+o1
+o1
+o1
+o2'
+o1-
+1pa.
+1paal
+4p3aanv
+paar5du
+3paarf
+paar3t
+1paas
+1pab
+pa2ce
+pacht3s4
+2p1adv
+2p1afd
+2p1afs
+1pag
+pa4gen
+pa4gers
+2p1agg
+pa1gh
+pa1go
+pa1gr
+1pai
+1paj
+pak1a
+p3akko
+pa2kl
+1pal.
+pa1la
+2p1alb
+1pale
+pal1f
+palle4
+1palm
+pal4m3ac
+pal4mo
+pal4t3r
+pa1lu
+pa3nac
+pan3a4d
+pa4n3ame
+3pand.
+pan4ded
+pa1ne
+3panee
+3panel
+2pan1k
+pa1no
+pan3sp
+pant3j
+pa1pa
+1papi
+pa2p1l
+p1apn
+p1app
+pa1pr
+4par.
+1para
+par1d2
+1park
+par4kl
+1parl
+2p1arm
+pa1ro
+par3ta
+part3j
+3partn
+4parts
+pa3ru
+1pas1
+pa1sa
+pa1s2o
+pas4th
+pata2
+1pa3te
+pa4t3enta
+1pa1t2h
+1pa1tr
+pats3te.
+1paud
+2p1aut
+1pauz
+1pav
+pa2vl
+1pax
+1paz
+1pa'
+p1b
+pbe2a
+p1c
+p1d
+pdan4c
+pda4te.
+pda4tes
+pe1an
+1pech1
+peci3es
+p1e2co
+3pect.
+3pecten
+1ped
+peer1
+1pees1
+pe1f
+1peg
+pe1go
+1pei
+2p1eis
+pek3ac
+pe1kl
+pe4k3la
+pek1n
+pek1s
+pel3ac
+pel3ak
+pe3lar
+pel3do
+pe4l3el
+pe4l3e4t
+pe5l4i
+pel1k
+pel3sl
+pel3sn
+pel3so
+pel3sp
+2p1emm
+1pen.
+1pena
+pe3nad
+pe3nal
+pen3ang
+pe3nat
+pen3a4z
+5penbaard.
+3penbaart
+p3ency
+3pend.
+3penden
+pen3ei
+1penf
+1peng
+1penh
+pe1ni
+1pen1k
+pen1o
+1penp
+1penr
+pen4se.
+pen3sl
+pen3sm
+pen3sn
+pen3so
+pen3sp
+pen3st
+pen1t
+pen4tho
+1penv
+1penz
+1pep
+peper3s
+2p1epi
+pep1s
+1p2er.
+pe1ra
+pera3s4t
+pe4rau
+1perb
+1perc
+pe4r3eg
+1perg
+1perh
+1peri
+1perk
+per3of
+pe3ron
+1perp
+1p2ers
+1pert
+1perz
+1pes
+pes2c
+pes3ten
+pes4th
+pe1ta
+3peter
+pe1tj
+pe1to
+pe4t3ra
+pets3t
+1peuk
+pe1um
+1pez
+p1f
+p1g
+pge3la
+pge1n
+pge1r
+p1h
+1p2his
+1pia1
+pi1ad
+pi1as
+1pice
+2pidp
+3piek.
+3pieke
+pie4kla
+pier3s
+pies3p
+pies3t
+pi1eu
+1pig
+pi1go
+1pije
+pij1k
+pij4li
+1pijn
+1pijp
+pij4p3a
+pijp3l
+2pijz
+1pike
+pi4ke.
+pi4kes
+pi4kor
+pik1s
+pi1la
+pi4l3in
+1pi1lo
+pin3aar
+pi4nap
+pin1d
+3pinda
+1p2ing
+2p1inj
+1pink
+pin3kl
+pin4ko
+pink3r
+pi1no
+2pinr
+2pins
+pi1o
+1pip
+3piram
+1pis
+pi1sa
+pis1n
+pi1th
+pit1j
+pi1to
+pit1r
+pit3sten
+1piz
+p1ja
+pje2s1
+p1ji
+p1jo
+p1k
+pl2
+1pla
+p1la.
+plaats5te.
+2p1lad
+4p3lang
+2p1lap
+plas3t
+p2lat
+pla4te.
+plat3j
+plat3r
+1p2lec
+2p1lep
+1p2lex
+1plez
+p1lid
+pli3er
+2p1lig
+2plij
+pli1o
+1ploe
+p3lone
+4p3lood
+p3loon
+plo1r
+4p3luie
+p1m
+pmana4gem
+p1n
+3p4neum
+1po.
+1poc
+1po1d
+2poef
+1poes
+poes3t
+1poet
+1poez
+po1g
+1pogi
+po2k1i2
+pok1s
+1pol
+po1la
+po4lep
+polo3v
+pol4s3t
+1pom
+pome1
+2p1oml
+pom3pj
+2p1oms
+3ponds
+1pone
+1poni
+pon4se.
+pon4s3te.
+1pony
+4poog.
+1pool
+4poor.
+4poord
+pop3ar
+po3pe.
+pop1i
+po4pin
+po1po
+po2p1r
+1po1ra
+2p1org
+2pork
+po1ro
+3portef
+por3tje
+port3ov
+3portr
+port3ra
+port3s
+po1ru
+1pos
+po1sa
+po1sf
+2poss
+pos3taa
+post3re
+po1su
+potes3
+pot4ha
+po3the
+1poti
+1potl
+po2t1o
+pot1r
+pot1s
+1pou
+1pow
+1po
+1po'
+p1p
+ppe1k
+ppe4l3o
+ppel3sm
+ppie1
+p1q
+1pra.
+p3raad
+praat3
+p1rad
+3prakt
+2p1ram
+2p1rap
+pra1s2
+1pred
+4preeku
+1pref
+preid3s
+p3rem.
+p3remm
+3prent
+prent3j
+p3reso
+1pret
+pre4t3j
+1prev
+2p1ric
+4p3riek
+3pries
+priet3j
+prij4st
+1prik
+3princ
+4pring
+3prins
+1pri1o
+1pris
+1priu
+1prob
+1proc
+1prod
+4p3rode
+p3roed
+3proef
+proet3j
+3proev
+1prof
+1prog
+1proj
+2prok
+1prom
+4p3rood
+1prop
+pro3pa
+pro3pe
+1pros
+pro4sce
+pros3p
+pro4s3t
+3proto
+p1rou
+1pro1v
+pruit3j
+pru2t
+prut3o4
+pr2z
+1pr
+ps1aa
+p2sac
+ps1a2g
+ps3akk
+p2s1am
+ps1ar
+ps1as
+p3schr
+2pse
+ps3ern
+pses1
+ps3eth
+p2she
+ps1hi
+ps1i2d
+pside3
+p1sil
+ps3ink
+ps1j
+p2sk
+ps4lag
+ps4mee
+p2smi
+ps3neu
+p2s1of
+p1sol
+p1so
+p1spi
+ps3ple
+p4spog
+p3stat
+p3stee
+p3stem
+p3ster.
+ps3tes
+ps1th
+p3s4tic
+psto3v
+ps3trot
+p1sus
+p2sw
+1psyc
+p1t
+p2t1ad
+pt3akk
+p4t3alb
+ptea4se.
+pten1
+pte1p
+pter3o
+pte1s
+p2t1h
+pt1j
+p2tl
+p2t1ov
+pt1sc
+pt3ste
+p2tv
+1pub
+pu1ch
+pu1e
+pu1lo
+pul4st
+1pun
+punt3j
+pu1ra
+pur4t3j
+pus2h
+pu3she
+1put.
+put1h
+1put1j
+pu2t1o
+put1r
+puts3t
+p1v
+p1w
+1py
+py1l
+p1z
+pzet1
+1p
+1p
+1p
+p1-3
+qu2
+4quits
+2quiv
+4raalo
+raam1
+raan1
+4raanb
+4raang
+4raanl
+4raant
+raap1
+1raar
+4r3aard
+raat3j
+1rabi
+ra2b1l
+1raby
+r2ac.
+ra2ca
+ra4ceb
+ra4cek
+ra4cet
+1racl
+ra1da
+ra4dap
+1radb
+ra4dede
+3radend
+r1adm
+r1adr
+1rads
+rad3sp
+r1adv
+raf1a
+ra2fu
+1ragd
+rag1l
+ra1go
+ra1gr
+1rais
+ra1ka
+raket3
+ral3ee
+r1alf
+4r3a4lim
+r1alm
+ra1lo
+1ra1lu
+ra4mes
+r3a4meu
+3ramin
+ram4pa
+ramp3j
+ra3nat
+3rand3a
+ran4daa
+ran4dr
+rand3s
+ra1ne
+ran4ge.
+rang3o
+rang3r
+r3a4nij
+ra1no
+rans3p
+ran4s3t
+ran4su
+rant3j
+r3antw
+ra1o
+ra4pas
+rapo1
+3rappo
+rap3roe
+rap3sc
+rap3ste
+2r1arb
+r2are
+r3arit
+2r1arm
+ra1ro
+r1arr
+r1art
+1rasa
+1rasg
+1rask
+1ras1l
+ra1sn
+ra1so
+rast3ri
+ra1su
+ra1ta
+ra1th
+r1atl
+ra3tri
+rats3t
+1ratt
+3ravoe
+1ravr
+ra4zij
+ra2s
+1ra
+r1b2
+rbe2a
+rber3a
+rbe4raa
+r1c
+rce2a
+r4celi
+rces1
+rch3af
+rcu2s
+2rd
+rd3act
+rdags3
+rda2k
+rd3ake
+rda2m
+rd3ama
+rd1ap
+rd1ar
+rd3as.
+rd3ass
+r4deen
+r2d1ei
+rde3kl
+r4d3e4las
+rden3s
+rder3st
+r4d3erva
+rde3s4t
+rdi2e
+r4d3ijz
+rd3o4li
+r1don
+r4d3ont
+rd3opt
+rd3rea
+rd3res
+rd3rod
+rd3rol
+rd1sc
+rd1sj
+rd1sl
+rd1sn
+rd1so
+rd1sp
+rd3ste
+rd3sto
+rd3str
+rd1su
+r4duit.
+r2d1wo
+re1al
+re4all
+re3amb
+re1an
+reau1
+1recl
+1reda
+1redu
+reed3a
+ree4du
+reek3r
+2reen
+4r3eers
+ree3sh
+2reeu
+reewa4
+re1fa
+2reff
+1re1fl
+re1fr
+2reg.
+3regel
+rege4s3
+1regi
+1re1gl
+re4go.
+2reie
+2reil
+4reind
+1reis
+4reise
+1reiz
+3rekeni
+re4k3la
+rek3lu
+rek1n
+re3kra
+rek3re
+rek3spr
+rek4th
+re3kwi
+re1la
+re4l3ac
+rel4dec
+rel4di
+reld3o
+rel4d3r
+rel4duu
+re4l3ei
+4r3e4lem
+rel1k
+4r3ellenw
+re3log
+re3lon
+rel1s
+re4mai
+remie3tj
+remo3v
+1r2en.
+ren3aar
+re4n3a4g
+re3nal
+ren3an
+re4n3a4r
+4r3endert
+ren3ei
+ren3el
+ren3enk
+ren3erf
+4reng.
+4rengd
+4rengt
+2r1eni
+re3nie
+re4n3in
+1renn
+re3nomm
+2r1enq
+4r3entac
+ren3th
+4r3en3tw
+4r3envee
+re5ografie
+re1ol
+3repert
+re1ps
+re4rens
+2r1erf
+2r1erg
+re5rij
+re1ro
+2r1ert
+2r1erv
+2r1erw
+re4scrip
+re5script.
+re1si
+res3le
+re1so
+res1p
+res3ta
+res3te
+res3th
+re3stra
+re4sui
+re1ta
+re4tag
+re4tap
+re4tem
+re3tha
+re4tik
+re1tj
+2retn
+1re1to
+re4t3o4g
+rets2
+ret3sk
+reu4ko
+reuk3s
+re3um.
+reu4t3je.
+3revis
+1revo
+rewa2
+1rexa
+re1n
+r1fa
+rf1aa
+rf1al
+rf1do
+r4f3eng
+rf3lag
+r3flap
+rf3lee
+r3flen4
+r3fles
+r2f1li
+r1flo
+r1flu
+r1fo
+r2f1oo
+r2fop
+rf3ren
+r1fri
+r3from
+r3fron
+rfs2
+rf1sm
+rf1so
+rf1sp
+rfst3aa
+rf3ste
+rf3sti
+r2f1uu
+r2g1ab
+r2gac
+r2g1ah
+rga4me.
+rg1dr
+rge2a
+r2g1ei
+rgel3ac
+rges2
+rg3etap
+rgeto3
+r4g3ins
+r4g3inv
+rg3loo
+rg1lu
+r1go
+r2g1op
+rgo1v
+r1gr
+r4g3rit
+rg1sc
+rg1s2o
+rg3spo
+rg1st
+r1h
+rhoud4s
+ri1ab
+ri1ad
+ri1ak
+ria1p
+ri1ar
+ri1as
+ri2bl
+1ridd
+rid2g
+3ried.
+3riede
+riek3ap
+rie3kw
+rie4laa
+rie4lei
+rie4pac
+rie3so
+rie3spa
+rie3sta
+riet3s
+ri1eu
+ri1fl
+r4ig
+ri4g3aa
+ri1go
+ri2j
+rijk4s3ta
+4r3ijl.
+4r3ijld
+4r3ijlt
+1rijm
+rij3pl
+4rijsd
+rijs3l
+r4ik
+ri4ke.
+ri4kes
+rik1l
+rik1r
+ri1lo
+2r1inb
+2r1inf
+r4ing.
+4r3ingan
+ring3l
+2r1inh
+4rinit
+4r3inko
+4rinni
+ri1no
+2r1inr
+2rins
+r3inst
+rin3tj
+2r1inv
+ri1oc
+ri1oj
+ri1om
+ri1or
+ri1ot
+2rir
+ri3sco
+ri4sei
+ris1h
+ri3sot
+ris3pe
+ri1su
+rit1j
+1ritm
+ri1to
+ri4t3ov
+rit3sp
+rit3sten
+1ritt
+ri4ve.
+ri4ves
+r1j2
+2rk
+rkaat3
+rk3adr
+r1kal
+r1kap
+rk3art
+r1kav
+r4keen
+rker4sl
+rker3st
+r4k3eth
+r2k1id
+rk3iep
+rkind4s3t
+rk3inh
+r4k3ink
+rk1j
+r1kle
+r3klok
+rk3lus
+r1kni
+r1k2no
+r1knu
+r2kob
+rk3omg
+rko3pe
+rk3ops
+r4k3ord
+rk3os.
+r1kr
+rk3rame
+r4k3rel
+r4kres
+rk3roos
+rk1s
+rks2f
+rk4s3li
+rk2sm
+rks2t
+rkt3erk
+rkt3evo
+rkt1h
+rk4tre
+rk4tri
+r1ku
+r3kwas
+rk3wil
+r1l
+rlate4
+rle4g3r
+rlies3
+rlink4s3
+rlof1
+rlos1
+rlo1v
+rl1p
+rlui3t
+rmana4gem
+r4m3art
+rmer3s
+rmes1
+rmet3s
+r4m3ont
+r2m1ov
+rm1p
+rm1sa
+rm1sp
+rm3sto
+rmte1
+r1na
+r2naf
+rna1l
+rn3ars
+rn1do
+r1ne
+rne2n
+r4n3ene
+rnes1
+rne4t3j
+rne4t3r
+r2nex
+rn1g
+r1ni
+r2n1i2d
+rn1k
+r1no
+rn3oef
+rn3ong
+r4n3oor
+rn1op
+rn1s2
+rn1t
+r1nu
+ro1ac
+ro1ar
+1rock
+ro1da
+ro1d2o
+ro1dr
+1roe.
+2roeg
+roe4g3r
+1roem
+roens4
+roen3sm
+roep3l
+roe4rei
+roer3s
+roes3te
+ro3faa
+r3offi
+ro1fo
+rof1s
+rog1s
+ro2gu
+1roi
+ro1ka
+ro1kl
+1rokm
+ro1kr
+1rola
+1rolb
+1rold
+role3s
+1rol1g
+1rolh
+4roli
+1rolv
+1rolw
+r2oma
+r1omk
+2romm
+rom3sp
+r4on.
+ron3a4d
+r4onal
+ro3nau
+ron4da
+ron4dom
+rond3oo
+ron4d3r
+rond3st
+ron4d3u
+r2one
+3rongeh
+r1onp
+r2ons
+3ronsp
+ron4s3te.
+ront3j
+ron4t3r
+roo2
+rood1
+roog1
+2roor
+root3ste
+rop4e
+ro3pe.
+r3opna
+r2o1po
+rops2
+r4opte
+ro2pu
+r1opz
+r1org
+ro1ro
+ro3san
+ros2c
+ro1sf
+ro3sho
+1rosk
+ro1sn
+ro3spi
+ro3stel
+ro1ta
+ro3te
+ro1th
+ro1tr
+rots3te.
+rot3str
+1rotz
+r1oud
+1roul
+1r2out
+1roy
+roy3aals
+ro3y4eert
+ro3yer
+1ro
+1ro
+r1pa
+rp3aan
+rp3ank
+rpats3t
+r1pe
+rpe3lo
+rpe4ra
+r1pi
+rp1j
+r1pl
+rp3lans
+r1po
+rpoort3j
+r2p1ov
+r1pr
+r4p3rec
+rp3reg
+r1psa
+rp3sli
+rp3slo
+rp3sni
+rp3spe
+rp1s2t
+r1psy
+r1pu
+r1q
+r1r
+rregi3o'
+rre4l3u
+rre2n1
+rre1o
+rri3er
+rrie3s
+rro1v
+r1sab
+rs1a2d
+rsa2f
+rs1a2g
+rs1ak
+r1sal
+rs3amb
+rs3ana
+rs1ap
+rs1ar
+rsas1
+rs3asp
+r3sast
+rs1av
+r1sc
+rs4can
+r2sce
+r2sci
+r2scl
+rs4cre
+r2scu
+r4s3e4co
+r2s1e2d
+r2s1ef
+r4s3eis
+rsek2
+r4s3ell
+r4s3erva
+rseve5
+r4s3e4vo
+rs4fer
+rs3hin
+rshy2
+r1sim
+rs3int
+r1sir
+r3sjac
+r2s1je
+rs4kat
+r3s4kie
+r1sla
+r4slas
+r3slec
+rs3led
+r3sleu
+rs4liep
+r3slim
+r3sling
+rs3lob
+rs3loep
+rs3log
+r4s3loo
+r3slot
+rsmana4
+r3s4mee
+r3s4mel
+r3s4met
+r3s4mij
+r3s4moo
+r3sned
+r3snee
+rsnes3
+r3snij
+r3snoe
+r1sob
+r1soe
+rs1of
+rs1og
+r1sol
+r3somb
+r1son
+r4sond
+rs3ong
+r1soo
+rs3ord
+r1sou
+rs3paar
+r3span
+rs3part
+r3spat
+r1spe
+rs4pene
+rs4per.
+rs4pert
+r4s3pet
+r1spi
+r3spoe
+r3spon
+r3spoo
+r3spor
+rs3pot
+r3spraa
+rsregi3o
+r3sta.
+rs3taak
+rst3aang
+rst3ac
+r4s3tale
+r4stali
+r3stan
+r4s3tas
+r3stat
+r4stav
+r1ste
+r4sterm
+rste3s
+r4steva
+rs2ti
+r3stig
+r3stin
+r1sto
+rs4t3oc
+rst3ora
+rsto3v
+r3straa
+r3stral
+rst3red
+r3stree
+r3strek
+r3strep
+r3strij
+r3strom
+r1stu
+r4stun
+r1su
+r1sy
+2rt
+r1ta.
+r3taal3
+rt3aand
+r3taar
+r1tab
+r4t1a2c
+rt1ad
+rt3af.
+rt3afd
+r1tag
+r1tal
+r1tan
+rt3a4pe
+rt3a4re
+rt3art
+r3tast
+r3tati
+rt3att
+rt1au
+r2t1av
+r1te
+rteer3
+rt3eig
+rte4lei
+rte3no
+rte3ro
+rte3str
+r2t1e2v
+rt3han
+rt3har
+r3ther
+rt3hie
+rt3his
+rt3hou
+rties3
+r4tink
+r2tja
+rt3jesc
+rt3jesv
+r2tl
+r1toe
+rt3off
+r3tofo
+r1tol
+rt3om.
+rt3opb
+rt3ope
+rt3opl
+rt3ord
+r4t3org
+r3tori
+r1tot
+r1tou
+r3trac
+rt3ras
+rt3rec
+r3trek
+rt3res
+rt3rie
+rt3rij
+rt3rog
+rt3rus
+rt3sal
+rt1sc
+rts3li
+rts3oo
+rt3ste
+rts3th
+rt3sti
+rt3stoet
+rt3str
+r1tu
+r4t3ui4t
+r2tv
+r1ty
+ru1a
+1rubr
+rude3r
+ru1e
+2ruf
+rug1d
+ru2ge
+rug1r
+ruik4sp
+3ruimt
+ru2ka
+ru2k1i
+ru2k1l
+ruk1s
+ru4l3ij
+rum1a
+5rummanagem
+rune2
+runet3
+1rung
+2r1uni
+r2up
+ru2p1l
+1rups
+ru1ra
+ru2s1e
+ru1ta
+rut1j
+ruts3te.
+rut3sten
+2ruu
+ruw1a
+ru4wij
+1ruz
+r1v
+rval4s3t
+rver3a
+rver4s3te.
+rve3sp
+rvi2c
+rvide3
+r1w
+rwee2
+rwen4s3t
+rwer4k3r
+rw2t1j
+r1x
+ry1le
+ry1s
+r1z
+rzet3j
+rzit1
+rzoet3s
+r1
+r1
+r1-
+1sa.
+1saag
+1s2aai
+saaie4
+s1aan1
+s1aap
+s2aat
+s1ac
+sa2ca
+2sach
+1s2acr
+sa1do
+1sae
+s1af
+sa1fa
+1safe
+sa4fe.
+sa4fel
+sa4fes
+1safo
+s1agg
+1sagi
+sa4gio
+1sagn
+sa1go
+1sah
+1sai
+1sake
+sa1kr
+sa1la
+3salad
+s1alb
+1s2ald
+s1all
+s1aln
+sa1lo
+1salp
+1sa1lu
+1s2ame
+1samm
+sa3nat
+1sand
+sa1ne
+sa1no
+san3sk
+1sant
+sant3j
+1sap.
+2s1a2pe
+s1a2po
+sap3rij
+sa3pro
+1s2ar.
+s1arb
+s1arc
+1sard
+1s2ari
+sari3o
+s1arm
+saro2
+sa3ron
+s1arr
+s2ars
+s1art
+sar3th
+s1as.
+sa1s2c
+sa1sl
+s1ass
+1sat
+sa1ta
+sa4teli
+2s1atl
+sa1tr
+2s1att
+s1aud
+1s2aus
+s1aut
+1sauz
+3savou
+1sax
+sa3y4eerde
+sa3yer
+2s1b
+2scab
+2scad
+2scaf
+2scam
+2scap
+sca4pe
+2scar
+2scat
+2sced
+2scel
+3s4cena
+2scer
+4schao
+1sche
+4schef
+4schemi
+4scheq
+1schi
+3schol
+3schoo
+3schot
+1schu
+2scij
+2scir
+s2ci
+4sco.
+2scod
+s4cola
+4scoll
+2scom
+2sco2n
+1scoo
+4scoopga
+4scoopro
+3scope
+sco4pe.
+sco4pes
+3scopi
+3score
+4scorp
+4scorr
+2scos
+2sco
+4scrim
+4scris
+2scy
+1sc
+2s1d
+s3de
+s2dh
+sdi1a
+sdi1o
+1se
+se1an
+sear2
+se2at
+4seball.
+4seballd
+2s1ech
+2secz
+2s1edu
+4s3eenh
+see2r
+seer3i
+see3t
+2seev
+se1fa
+2s1eig
+seis4t
+se1kl
+se1kr
+sek4s3t
+se1kw
+sel3ac
+se4l3a4g
+sel3ak
+sel1d
+4s3e4lek
+se4l3el
+4s3e4lem
+se4lim
+4selix
+sel1k
+sel1o2
+sel1s
+se2l1u
+se4m3aa
+se4m3ac
+s1emm
+se4m3on
+se4m3oo
+se4n3a4g
+se3nan
+se3nat
+se3nel
+sen3e4t
+se1ni
+se4nin
+sen1k
+se2n1o2
+2s1enq
+sen1s
+sen3tj
+sen3tw
+senu2
+se1o
+se3rab
+ser2e
+se3ren
+4s3ergo
+2sern
+serna4
+se1ro
+ser4sp
+ser3st
+ser4tw
+se1ru
+se1sa2
+2s1e2sc
+se1s2f
+2se1sh
+2s1esk
+se1sl
+se1sp
+se3tan
+se4ter
+2s1e2ti
+setmana4
+set1s
+se1u2m1
+4s3even
+2s1ex
+2s1e2z
+2se-d
+s1f
+2sfa
+3s4feer
+2sfr
+2s1g
+sgeper4
+sgepers3
+sge1r
+sges2
+s1ha
+1s2ha.
+3s4hamp
+sha4ve.
+s1he
+sheids3
+1s2hes
+1shew
+s1hie
+s1him
+s1his
+sh1l
+2s1hoe
+s1hof
+s1hog
+s1hok
+s1hol
+2s1hon
+s1hoo
+sho4re.
+s1hos
+2s1hou
+s1hov
+1show
+s1hu
+s1hy
+1si.
+1si1a
+1sib
+1sic
+si2ch
+si4dec
+1s2ie
+sie3fa
+sie3kl
+sie1s4
+sie3ta
+sie3tj
+si1eu
+1si1f
+1s2ig
+sig1s
+s1ijv
+s1ijz
+1sile
+si1lo
+si4mag
+s1imm
+sim1p2
+1simu
+1sina
+s1inb
+2s1inc
+2s1ind
+2s1inf
+1sing
+4s3inga
+4s3ingeni
+sin3gl
+sin3gr
+sing4s3
+s1inh
+s1i2ni
+s1inj
+s3inko
+s1inm
+s2in2n
+sinno4
+sinnova4
+si1no
+2s1inr
+s1ins
+sin3tj
+2s1inv
+s1inz
+1sio
+si1og
+4s3i4ont
+si1or
+1siro
+s1irr
+1sis
+sis3an
+sise2
+si4s3ee
+si4sei
+si4s3el
+si2s1i
+sis1p
+3sit
+si4tem
+si1to
+sito3v
+situ1
+1siu
+1siv
+1siz
+1si
+1s2ja.
+s1jaa
+1sjab
+1s2jah
+s2jal
+s1jar
+sj2e
+s1je.
+s2jee
+1sjei
+3s2jer1
+s1jes
+1sjew
+1sjez
+s2ji
+2sj1k
+sj1n
+1sjof
+1s2jok
+s1jon
+1s2jor
+3sjouw
+sj1s2
+sj1t
+sj2w
+s1k
+2sk.
+2ska1d
+sk2c
+skee3t
+s4kele
+1s2ki.
+skie1
+skies4
+ski3sc
+1ski
+1ski'
+s2k1j
+2sko
+sk1t
+sl4a
+1sla.
+3slaan
+3slaap
+s3laar
+s3labe
+s1lad
+1slag
+slag3r
+1slal
+sla4me
+s3lamp.
+s3lampe
+4s3land
+3slang
+3slape
+s1las
+2s1lat
+sla3tj
+1slav
+2slaw
+s3leden
+3slee.
+s3leef
+3sleep
+4s3leer
+slee3tj
+s1leg
+2s1lei
+s1lek
+slen4s3
+3slent
+s1ler
+s1les
+sle4t3j
+s3leug
+3sleur
+s3leus
+4s1lev
+sleve3
+s1lez
+s1li.
+1slib
+4slibe
+s1lic
+4s1lid
+s3lied
+s3lief
+s3liev
+s1lif
+s1lig
+s3lijd
+3slijp
+4slijs
+1sli2k1
+slim3a
+s3lini
+slip1
+s1lit
+slo2b1
+s1loc
+1slof
+s1lol
+s3lood
+s3loon
+s3loos
+3sloot
+1s2lor
+s1los
+slo4t3o
+s1lou
+slo1v
+s1luc
+4slui.
+3sluip
+3sluis
+3sluit
+3sluiz
+s1lus
+s1luw
+3smaad
+1s2mad
+3s4mak.
+3s4mal.
+3s4mald
+3s4mall
+3s4malt
+s4meed
+3s4meri
+s2meu
+3smid.
+smies3
+1s2mok
+3smolt
+3s4more
+3smuilt
+s2mul
+sn2
+s1nac
+s1nam
+1snap
+snap3s
+1s2nar
+s1nec
+snee3t
+s1neg
+1snel
+s2ner
+s1net
+s3neus
+s1nie
+s1nim
+1snip
+1snit
+2s1niv
+s1nog
+s1nom
+sno1v
+s1nut
+1so.
+1s2oa
+so1a'
+so2bl
+1so1c
+2s1o2ce
+1so1d
+s1oef
+1soep
+soep3s
+soes1
+1soez
+s1off
+1sofo
+1soga
+s1o2ge
+so1gl
+1sogy
+1soi
+1sok
+so1la
+1sold
+5soleerde.
+sol1s
+s1omg
+s1omk
+s1oml
+1s2omm
+s1omr
+s1oms
+s1omv
+s1omw
+s1omz
+1s2on.
+so1na
+s3onaf
+s1onb
+s1ond
+1sonn
+1sono
+2s1on2t1
+2s1onv
+soo2
+s1oog
+s1ook
+s3oor.
+s3oord
+s3oorl
+3soort
+s3oorz
+1soos
+s1op
+1s2op.
+2sope
+so1po
+3s4o3pra
+1sor.
+1sora
+so3raa
+so3ral
+so3rat
+1sorb
+1sorc
+s1or1g
+1sorm
+1sorn
+1soro
+1sorp
+1sors
+1sort
+1sorw
+so1sf
+s2ot
+1so1tr
+s1oud
+sou1t4
+s1ov
+1so'
+2sp.
+3spaak
+s1pad
+s1pak
+s1pam
+2s1pap
+3spar.
+4spara
+s3parc
+2spas
+s1pau
+1spe.
+1spea
+3s4peci
+1spee
+4spees
+speet3
+2spei
+1spek
+spe3lot
+s1pen
+4spen.
+4spenn
+4spens
+s3pera
+4speri
+4spers
+1spie
+spie3tj
+3spijk
+4spijn
+spi4nac
+spi4nak
+1spio
+3spiri
+2spis
+2spla
+spleet3
+s3plei
+spli2
+3s4plit
+s1plo
+s1plu
+1spoi
+1spok
+s4pon.
+3s4ponse
+spon4s3t
+s1pop
+3s4pore
+s4pori
+3spraak
+3sprak.
+3sprake
+3spray
+3spreeku
+3sprei
+4s3prem
+s3pres
+3spreu
+4spriem
+4s3prij
+3spring
+4sprod
+3sproei
+4sprog
+3sprok
+3s4pron
+3sproo
+s1ps
+2spt
+1s2pui
+spuit3j
+1spul
+1spur
+1spuw
+s1q
+s2qua
+2s1r
+2s1s
+ss2ac
+ss2af
+ssa1g
+ssa1s
+ss2ca
+sscenari3
+s2scl
+s2s2co
+ssei1
+sse3naa
+ss2i
+ssi4te
+ss2j
+s2sk
+sso1t
+ss2t
+s2sw
+4st.
+3staaf
+4staang
+4st3aanv
+4st3aanw
+staart3j
+st3abo
+2stac
+st3acht
+1s2tad
+4stafe
+sta4fo
+4stakk
+st3akt
+sta4lo
+s4talt
+s4tamp
+st3ana
+3standi
+s3tank
+3stape
+3star.
+4stari
+3statieri
+2s1tau
+s2tav
+1stay
+2stb
+2stc
+2std
+4stea
+4stech
+s4teco
+1sted
+steda4
+4stedu
+4steenh
+2stef
+1stej
+4stekam
+3stekk
+4steladm
+ste4lee
+st3e4lem
+s4tem.
+s4temm
+4stemo
+4stempo
+4stenu
+ster3ap
+4stermi
+s4terple
+3sterren
+ster4spo
+1stew
+2s2t1ex
+s2t1e2z
+2sth
+s2t1ha
+st3hec
+st3hed
+st3hek
+s3them
+st1hi
+s2t1ho
+s2thu
+st1hy
+2stia
+2stib
+4sticu
+s2t1i2d
+4stie.
+s4tiefe
+4stiep
+4sties
+4stiev
+4stijd
+s4tijf
+3s4tijl
+4st3ijs
+s4tikt
+s4tild
+s4timu
+s4t3ind
+4st3ins
+4s3tint
+s2tip
+4stite
+st1j
+s2tl
+2stoc
+4stoej
+3stoel.
+3stoele
+4stoen
+4stoes
+3stoet.
+4stoez
+1s2tof
+st3o4ge
+1s2tok
+s3toli
+4stomz
+3stonet
+s3tong
+4st3ont
+3stoof
+st3oog
+4stoon
+3stoot
+4stope
+sto4pl
+4stor.
+4stora
+sto4rat
+4st3ord
+3storm
+4storr
+2stos
+sto3ven
+2stp
+3straf.
+s3trai
+st3rec
+4stref
+4streg
+4s3trei
+3strel
+st3riek
+st3rif
+3strik
+3strip
+s3troep
+s3trof
+3strofs
+4s3trog
+3strok
+st3rol.
+st3roll
+3strome
+4stroos
+st3roos.
+s3trou
+4strui.
+4struim
+2st1s2
+2stt2
+1stua
+1stud
+1stue
+stuit3j
+1stuk
+stu2n
+st3uni
+3stunt
+2s2tv
+2s2tw
+s4tylen
+1su.
+3su1a
+1sub
+su2b1a2
+su2b1e
+su2bo
+su2br
+su2bu
+1suc
+1sud
+1sue
+su1ee
+1sug
+1suik
+s1uit
+s4uit.
+suit3j
+4suitl
+1suk
+su1ka
+1sul
+1sum
+2s1un
+3sun.
+su1na
+1suo
+1sup
+2s1upd
+supda4
+su1ra
+s1urn
+1surp
+1surv
+su2s1e
+su1sh
+suur1
+1su
+susti4
+4s1v
+sve2r1
+sve3ri
+svete3
+svide3
+svoge4
+s1w
+1sy.
+2syc
+1syn
+sy1ne
+1sys
+2s1z
+1s
+1s
+2s1-
+taaie4
+1taam
+t3aando
+t3aanj
+t3aank
+4t3aanz
+2t1aap
+t1aas
+taat3j
+taats3t
+1taba
+t3a4bon
+ta4cad
+tac4to
+tac4t3u4
+ta4der
+2tadi
+2tadm
+ta1do
+t1adr
+tads3p
+1tae
+2taf.
+1tafa
+2tafd
+t3afde
+1tafe
+2t1afs
+4tafv
+t1afw
+t1afz
+ta4gent
+1ta1gl
+ta1go
+ta3gra
+1tah
+1tai
+ta1ka
+ta4kes.
+1takg
+3takken
+1tako
+1takp
+1tak1r
+1taks
+1tak-
+tal3ach
+ta3lact
+ta3lan
+ta3lat
+3tale.
+1talg
+3talig
+ta1lo
+ta1lu
+t3amba
+3tamen
+1tami
+t3ampu
+1tan.
+ta3nat
+tando4
+tan4dr
+tan4du
+ta1ne
+tan3gr
+1tani
+1tanj
+tan4ka
+tan4k3i
+tan4kn
+tan4ko
+tank3r
+t2ans
+tan4ste
+3tants
+1tanu
+1tao
+ta4pav
+ta4per
+1tapi
+tap3st
+1tapu
+2t1arb
+1tari
+2t1arm
+taro2
+tar3taa
+tart3o
+ta1sa
+ta1sc
+3tasj
+ta1sp
+ta3sta
+ta1ta
+3tate.
+3tateu
+ta1th
+4tatieri
+tat1j
+1ta1tr
+tat1s
+2t1aut
+t1avo
+1taw
+1tax
+tax3eer.
+tax3eert
+ta1
+1ta'
+1ta-
+2t1b
+tbaat3
+2t1c
+t2chy
+2t1d
+tdoe4l3
+tdo1v
+1tea
+te3akt
+tea2m
+te1an
+te3arc
+te3ari
+teau1
+1tec
+4t3echt
+t3e4dit
+t1e2du
+tee2k1
+tee2l
+teel3d
+tee2m1
+2tee2n
+t3eenhe
+1teer
+tee1t
+2t1eeu
+te1fa
+2t1eff
+tef3lo
+te1g
+2teig
+4t3eind
+2t1eiw
+te1ka
+3tekam
+3tekene
+3tekens
+2tekk
+te1kl
+te4k3om
+te1kr
+te3kwe
+tel3ac
+3teladm
+tel3ant
+tel3da
+3telec
+4t3e4lect
+tel3een
+3telef
+tel3ei.
+tel3eit
+3teler
+tele3s
+3telev
+tel1f
+tel1k
+tel3o4g
+te4l3oog
+tel3o4r
+te3lot
+tel3ov
+tel1s
+te4l3uu
+1temo
+te4mor
+3temper
+3tempo
+t2en
+te3nak
+3tenbu
+4t3endert
+ten3ed
+te3nee
+ten3ei
+ten3el
+4tenerg
+ten3e4v
+3tenfo
+te1ni
+4tenig
+3tenij
+ten3ijs
+ten1k
+1tenn
+te3nore
+ten3ov
+ten3sm
+ten3sp
+ten3sto
+tensu4
+ten4s3ur
+ten4s3uu
+4t3entac
+3tenten.
+3tento
+4t3entw
+1tenu
+1tenw
+1teo
+te1op
+ter3aak
+te3raal
+ter3af
+ter3ag
+ter3as
+te4r3e4d
+te4r3eik
+te4rel
+te4rem
+te4r3enk
+te4r3env
+4tereo
+te4r3eq
+4terf.
+4terfd
+4terft
+ter3gl
+te4r3ijz
+4teril
+te4r3in.
+1terj
+4terk.
+ter3ka
+ter3kl
+4terkt
+ter3kwe
+3term.
+3termi
+1tero
+ter3oc
+ter3of
+te3rog
+te3rol
+ter3ond
+te3ros
+3terrei
+4terren
+3terst
+ter3stru
+t3erts
+1ter-
+1tesa
+te3sap
+1tesg
+1tesh
+te1si
+1te2sk
+1tesl
+te3sli
+1teso
+te3son
+1tesp
+te3spi
+te3spo
+1tesr
+3test.
+te3stel
+tes3ten
+tes4tij
+test3on
+test3op
+tes4tr
+test3ri
+test3u
+1tesv
+1tesw
+1tesz
+te3tab
+4tete.
+te1th
+te1tj
+te1to
+teur3a
+2t1euv
+t3e4van
+4teven
+tever3
+1tevl
+1tevr
+2t1exe
+2texp
+2t1f
+2t1g
+tgea2
+tgeper4
+tgepers3
+tge1r
+2th.
+t1hak
+t1ham
+t1has
+3t2hea
+t1heb
+t3heer
+thee3s
+t1hef
+2t1hei
+1thek
+4t1hel
+t3hemd
+1then
+1theo
+3ther4a
+t3here
+3therm
+1thes
+1thet
+t1heu
+1the
+t1hl
+2thm
+t1hoe
+t1hok
+t1hoo
+t3houd
+t3hout
+t1hov
+t1hoz
+th1re
+2ths
+t1hu
+1t2hur
+1thus
+thuts3t
+1ti
+ti1a
+tia2m
+tia4re
+ti1d
+ti4deo
+tie1d
+tie3fa
+tie1g
+tie3ka
+tie3kn
+tie4kon
+tie3k4uu
+tie3lop
+tie1p
+4tierf
+tie3ro
+tier3st
+tier4u
+4tierv
+tie3sl
+tie3sp
+tie1t
+ti1eu
+ti1fa
+ti3fe
+2tift
+ti4g3aa
+2tigm
+ti2g1u2
+3tijd
+tij4k3er
+tijk3l
+4t3ijs.
+tij3st
+tij1t2
+t1ijz
+4tijze
+ti1kl
+ti1kr
+tik1s
+ti1la
+ti4laa
+ti1lo
+2tils
+ti4med.
+t1imp
+tin3as
+4t3incu
+4tindu
+2t1inf
+tin4g3i
+ting3r
+t3inko
+2t1inl
+ti1no
+t1inq
+2t1inr
+4t3insl
+4t3insp
+4t3inst
+tint3j
+2t1inv
+2t1inw
+ti1pr
+ti1sa
+tis2j
+ti3sje
+ti1s2l
+ti3spe
+ti3sta
+ti3s4to
+ti3s4tr
+3tite
+ti1th
+ti1to
+ti1tr
+2tiv.
+t1ja
+tje2s
+t1jet
+1tji
+t1jo
+t2jok
+2tjon
+2tjou
+2tju
+2t1k2
+tkots3t
+t1l
+3t4lema
+tli2n
+tlo1v
+2t1m
+tmana4gem
+tmen4s3t
+tme3sto
+2t1n
+tne2r1
+tnes1
+1to.
+1toa2
+to1ac
+to1al
+to1ap
+to1ar
+1tobb
+1toc
+2tock
+1tod
+to1da
+to1do
+t3oefe
+1toej
+toe1k
+3toe3la
+1toen
+toe3nad
+toe3pl
+1toer
+1toe1s2
+toe3tj
+3toets
+1toez
+tof3ar
+tof3on
+tof1s
+tof1t
+to2fu
+to1go
+1togr
+1toh
+1toi
+to1ka
+to4kan
+tok1r
+tok1s
+to1la
+2t1olf
+1tolk
+tol4p3r
+2t1olv
+t1o2ly
+1toma
+t1oml
+tomp3j
+t1omr
+t1omz
+1ton.
+to1na
+t3onder
+1tone
+to4ned
+4to4net
+3tong.
+ton4gr
+1tonh
+1toni
+1tonn
+1tons
+tons3h
+ton3sk
+ton3th
+t3ontv
+4tontw
+4tonvr
+1tooi
+took1
+too2m1
+1toon
+to4p3as
+t3opbr
+2t1opd
+top4let
+2topm
+2t1opn
+top3re
+to3pri
+t3opru
+t3opto
+t3opva
+1topw
+1tor.
+to3raa
+to3rac
+to3rad
+tor3a4g
+to3ral
+to3rat
+3toree
+3torens
+4t3orga
+3toria
+tor4maa
+tor4m3ac
+3torno
+to3rom
+1torr
+1tors
+tor4s3te.
+tor3th
+tor3tj
+to1r2u
+1tos
+to1sa
+to1sf
+to1sh
+to1s2l
+to1sn
+to1sp
+1to1ta
+to1th
+to1tr
+tot1s
+2t1oud
+1tour
+tove3na
+to3verd
+to3veren
+4toverg
+to3veri
+1to1w2
+1tox
+toy1
+1to
+1to'
+2t1p2
+tpla4c
+t1q
+4t3raad
+3trac
+2traf
+3trafi
+3trafo
+1trag
+1trai
+1traj
+t3rake
+3trams
+3trans
+1trap
+trap3l
+4t3rat.
+3trato
+3tratr
+4tratt
+1trau
+t1raz
+1tre.
+t3reac
+4t3redd
+t3redes
+tree3tj
+1tref
+2t1reg
+tre4ko
+trek3st
+t3rese
+4t3resu
+1tre2t1
+1treu
+2trev
+t2re-
+t3rich
+3trico
+3trict
+trie3t
+tri3gl
+t3rijp
+trijs3p
+trijs3t
+1tril
+1tri1o
+trio4de.
+1tris
+t3risi
+t3rit.
+3triti
+1tri
+4t3roed
+4t3roer
+4t3roes
+4trofs
+4trold
+4t3rolt.
+4tromi
+t3rond
+3trone
+3trono
+4t3roof
+4troom
+3troon
+1tros
+tro3sp
+tro3t4j
+4trout
+tro1v
+4t3roven
+t2ro
+3truc.
+2t1rug
+3trui.
+3truie
+t3ruim
+trui3t
+2t1ruk
+2ts
+ts1aa
+ts1a2d
+ts1a2g
+ts1a2m
+ts1an
+ts1as1
+t2sca
+tscenari3
+t1sch
+t4sch.
+t2sci
+t2scl
+t3scou
+t4s3e4co
+tse2d
+ts3een
+t2s1ef
+t4s3ei.
+ts3eie
+ts3eil
+t4s3eind
+t4s3eis
+tse3la
+t4s3e4ne
+t2s1e2v
+t3shop
+ts1ij
+ts3ima
+ts3int
+tsi4te
+t3sjen
+ts4kel
+ts3lab
+t3slac
+ts3lam
+ts3led
+ts3len
+t3slep
+t3sloe
+ts4mel
+tsnes3
+ts3neu
+t3snij
+t3snoe
+ts1ob
+t1soe
+ts1of
+tso2l
+ts3oli
+ts1on
+ts4opp
+tso2r
+ts3ord
+ts3pac
+t3spec
+t3spel
+ts3pet
+t3spin
+ts3ple
+t3spor
+tss2
+t3staan
+t3staat
+t3staf
+t3stam
+t3stap
+ts3tas
+t3stat
+t3stav
+t3stee
+ts3teko
+t3stell
+t3stels
+t3stem
+t3stene
+t3ster.
+t3sterk
+ts3term
+t3sters
+t3steu
+ts4tie
+t3s4tijg
+ts4tik
+ts4tim
+tsto4f
+t3ston
+t3stoo
+ts3trad
+t3stral
+t3stree
+t3streke
+t3strep
+t3stri
+ts3troe
+t3stroo
+t3stru
+t1stu
+t4stui
+t4stun
+t4sw
+t1sy
+2t1t
+ttent3j
+tte1t
+tti4me.
+tt2l
+tto1v
+tt1uu
+tu1a
+1tub
+tu4bel
+tu1d
+tu1e
+tuf1
+1tuin
+tuin3s
+2tuip
+t3uitk
+t3uitr
+t3uitv
+t3uitz
+tu1ka
+tu2k1i
+tu2k1l
+tu2ko
+1tula
+1tule
+1tum
+1tune
+tu4nes
+tu4net
+1tunn
+tunt3j
+tu1o
+tu1ra
+1turb
+1tus
+tu2s1e2
+tu2si
+tut1j
+1tuum
+tuur4sla
+tuurs5taal
+tu1wa
+tu1
+t1v
+tver3a
+tvero3v
+tvoi2
+t1w
+2twa
+twee3s
+twee3t
+twe4gi
+2twet
+twi2
+3t4wijf
+4twil
+t5wind
+2two
+1ty.
+1ty1n
+1typ
+ty1s2
+4t1z
+1t1
+1t
+2t1-
+u1a2b
+u1ac
+ua1dr
+uae2
+u1af
+u1al
+u1an
+ua1na
+u1ar.
+ua4re.
+ua4res
+u1ars
+uar1t
+ua1sa
+uas2h
+ua3she
+uas1p
+u1at
+ua1tr
+uat2s
+u2b1ac
+ub1am
+u2b1ar
+ube4li
+ube4lo
+ub2lo
+ub1or
+ub1ro
+uca1
+u2cet
+u1che
+ucht3st
+ucle1
+u1co
+uc2t1a
+uc4tin
+uc4ton
+ud1ac
+ud1a2d
+u2d1a2m
+ud1ap
+ud1a2r
+udas1
+ud3eerl
+ud3e4ze
+ud3ond
+ud3oom
+udor1
+ud3ove
+ud1re
+ud1ro
+uds1a
+ud3s4me
+ud3smi
+uds1n
+uds1p
+ud3stan
+ud3ste
+ud3str
+ud1w
+ue1a
+u1e2c
+ue2du
+uees1
+u1ef
+u1ei
+u1el
+ue1ru
+ue1sa
+ue1tj
+u1ez
+u1fac
+uf1an
+u1fl
+u1fo
+u1fr
+uf1sk
+uft1h
+ug4dat
+ug4d3er
+ug4din
+ug2do
+ugd1s
+ug1ei
+uge4la
+uge4l3o
+ugen3ac
+ugen3s
+ugie1
+ug1l
+ug1o
+ug1ra
+ug1ri
+ug1ru
+ug3sce
+ugs3pa
+u1h
+u2i
+ui1a
+ui4daa
+ui4dac
+ui4dar
+ui4das
+uider3s
+ui2d1o
+uids3t
+ui1e
+uien1
+uie4re.
+uier3o
+uie4ru
+uif1l
+ui2f1r
+ui4g3aa
+uig1l
+ui2g1r
+ui2k1a
+uik1l
+ui4k3op
+uik1r
+uik1u
+uik1w
+uil3aa
+ui4l3em
+uilo2
+uil3og
+uil3oo
+2uim
+ui4m3ac
+ui2n1a2
+uin1d
+uin1g
+uino2
+uin3og
+uin1t
+ui2pl
+ui2p1o2
+uip1r
+uip1s
+uis1c
+ui2sl
+ui3slu
+uis1o
+uis1p
+uis4tac
+uis4th
+ui2t1a2
+ui4tet
+1uit1h
+3uitle
+1uitn
+uit1o
+ui2t1r
+uit1s
+4uits.
+uits4m
+u3j
+ujo1
+uk1ac
+uk1al
+uk1ap
+uk1as
+uk1au
+uken3s
+uk1j
+ukkers3
+uk1li
+uk1lo
+uk1n
+u2k1of
+u2k1on
+ukop2
+uk3ope
+u2k1or
+uk1r
+uk1sc
+uk1sl
+uk3sme
+uk3sne
+uk3spa
+uk3spl
+uk1t
+u1ku
+uk1we
+uk1wi
+u1la
+u2l1a2p
+uld3erk
+uld3ov
+ul2d1u
+u1le
+u2led
+ul1fa
+ul1fl
+ul1fo
+ul1fr
+ul1g
+u1li
+ul4kar
+ulk1l
+ul1oe
+ul1o2p
+u1los
+ulp3ac
+ul4pag
+ul2p1l
+ulp3on
+ul2p1r
+ul1sc
+ul1sl
+ul1so
+uls3te.
+ul2th
+ult1s
+ul1ui
+umana4
+um3e4di
+ume1s2
+1umh
+um1op
+umpi2
+um1pj
+um1s2
+um1ui
+1umz
+2un.
+2una
+un1ac
+un2ce
+un4ch3r
+un1do
+un1dr
+un4dra
+und1s
+u1ne
+u2ned
+unes1
+un4ge.
+un4geg
+un4gem
+un1gl
+un1gr
+uni4th
+1univ
+un1kl
+unk1s
+un1op
+u1nor
+uns2
+un4st3a
+unst3on
+un4st3r
+un4t3aa
+un2t1o2
+un4tri
+unt3sp
+unt3st
+un2t1u
+u1nu
+u3oden
+u1om1
+u1on
+u1oo
+uoot2
+uo1pa
+uo2pl
+uo1pr
+u1or
+uo1ru
+u1os
+uo1t
+u1ov
+u1pa
+u1pe
+upe1n
+uper3s
+u1pi
+up1j
+u1pl
+up1op
+u1pr
+up1st
+up4tro
+u1pu
+u1q
+ur3aan
+ur1ac
+ur3ada
+ur1af
+u1ral
+ur1ar
+uras1
+ura1t
+ur1au
+ur4cep
+ur1da
+ur1do
+ur1dr
+u1re
+u2rec
+ur3ech
+ur3een
+uree3s
+ur3eff
+ure1k
+u4r3elf
+u2rem
+ur3emb
+ur2en
+uren3o
+ure3st
+u4r3eta
+ur2fa
+ur1fl
+urf1s
+ur1gl
+u1ri
+ur3ijz
+u4r3ind
+u4r3int
+uri1o
+urk3ac
+ur1kl
+ur1kn
+urmana4
+u1rob
+u1roc
+u1ro1f2
+uro1l
+ur1on
+ur4ona
+u1ro1s
+u1rot
+ur3ove
+ur1ps
+ur4sco
+ur4scr
+ur4s3eli
+ur4sev
+ur3s4fe
+ur4s3laa
+urs3lage
+urs3li
+urs3take
+ur4ston
+ur4sui
+ur4t3a4g
+ur1tj
+urt3ond
+ur3to3v
+urt1r
+urt1s
+ur1ui
+u1ry
+us1ad
+us1ak
+us1a2m
+us1ap
+us1ar
+use1a
+use2c
+u2sed
+u5sen
+u2sep
+u2sew
+us1ho
+u1si
+usie1
+us2it
+us1j
+u2s1l
+us1n
+us1on
+us1or
+us1os
+us1p
+us4par
+ussie3ro
+ussi5te.
+u2sta
+ust3al
+us1te
+us4t3ei
+ust3oo
+us3tor
+us3tro
+us3tru
+ust3u4r
+ust3uu
+u1su
+us1ui
+u1taa
+ut3ach
+u1tad
+ut1af
+u1tan
+uta1p
+u1tat
+u1te
+u4t3ees
+u2t1em
+uter3k
+uter3o
+ute1s
+utfi4l
+ut1ho
+u4tind
+u1to
+ut3oog
+utoot4
+uto3ple
+uto3po
+uto1s
+uto1v
+ut3s4aa
+ut1s2c
+ut4s3eng
+ut1si
+ut3ske
+ut1sl
+ut1sn
+ut3spe
+ut3spl
+uts3po
+ut3stel
+ut3str
+ut1su
+u1tu1
+u4t5w
+u1ty
+uu2
+uum1
+uun1
+uur1a2
+uur1e2
+uur1i
+uur1k
+uur1o2
+uur3sti
+uus1
+uut1j
+u1v
+uve1n
+uver1
+uw3aan
+uw1ac
+uw1af
+u1wag
+uw1ak
+uw1al
+uw1am
+uw1ap
+uw1ar
+u2w1at
+uw1au
+u1we
+uw3een
+uwe4nen
+uwen3k
+u1wi
+uw3ijz
+u4wind
+u4w3ins
+uw1n
+uw1o2
+uw1r
+uw1u
+uy1
+u1z
+uze1t
+uzie4k
+uzig1
+u1
+u1
+u1
+u2'
+u1-
+1va
+vaar4ta
+vaat1
+va3ce
+va1g
+va2k1i
+vak1l
+vak1s
+va3laa
+val3ap
+val4s3p
+val4s3tek
+va1lu
+van3ac
+van1d
+vang3o
+vang3r
+va3nop
+va2nu
+va1p
+var1s2
+va1s2o1
+vast3re
+vast3ri
+va1su
+va1ta
+vat1h
+vat1j
+va1tr
+2vb
+v1ch
+v1co
+veau1
+1veb
+1vee
+vee2g
+vee2l
+veel3e
+vee2r
+veer3i
+vee3sta
+vee1t
+vei1s2
+ve1k
+1vel
+vel3aan
+vel3ac
+ve3las
+veld3o
+vel4du
+ve4lim
+ve4lis
+vels3n
+ve4lui
+1vem
+3venaarde
+ve3nan
+1vend
+5vend.
+4venem
+ve5nen.
+ve3net
+ve1ni
+ven1k
+4venot
+ven3ov
+4venrui
+ven4sen
+ven4s3er
+ven4si
+vens3lo
+venso4
+vens3or
+ven4s3taak
+ven4stek
+vensu4
+ven4s3ur
+5vent
+1venz
+ve1o
+3veraarst
+ver3aas
+ver3a4d
+ver3af
+ver3a4g
+ver3am
+ver3and
+ver3as
+ver3at.
+ve4r3e4d
+ve4r3ee
+ver3eis
+3verend
+ve4r3ene
+ve4r3eng
+vere3nig.
+ve4r3enk
+ver3eri
+ve4r3es
+ve4r3e4t
+ve4reu
+ve4r3e4v
+ver3gl
+3verij
+ver3ijd
+ve4r3ijl
+ver3ijs
+ve4r3ijv
+ver3ijz
+ve4r3inn
+ver5k4
+ver1o
+ve3rom
+ver3sag
+ver3s4ass
+ver3si
+ver3sl
+ver3s4mac
+ver3s4me
+ver3sp
+ver3st
+ver5s4ta
+vert2
+3vert.
+ver1u
+ve1ry
+ve1sl
+ves1t
+vet3ac
+ve3tan
+vet3o4g
+vet3oo
+ve3tor
+ve4t3ra
+ve4t3ri
+vet1s4
+1vi
+vi1a
+vi1ch
+vid2
+vid3st
+vie4renh
+vie4renn
+vier3s
+vies3p
+viet2
+viet3j
+vi1eu
+vi1f
+vijf1
+viks1
+vil4t3j
+ving2
+vings3
+vi1no
+vi1o
+vis3an
+vi4set
+vi3sor
+vis3ot
+vis1p
+vi1to
+vi1tr
+v1j
+1vl
+vla1f
+v1lar
+vlei1
+vleis4
+vle4t3je.
+vlie4s
+vlot3ste
+v1lov
+vm2
+1vo.
+1voe
+voel4s3t
+voet3a
+voet3jes
+voe4t3r
+voet3sp
+1voi
+1vol
+vo3lan
+vo3lat
+volg3o
+vol4gra
+vo4l3ij
+vo4lop
+vo4lui
+von4det
+vond3sp
+von4d3u
+1voo
+voo3d
+voor3d
+vo1p
+1vor
+vo1ra
+vor4s3te.
+vo2s1
+1vot
+vo1ta
+1vou
+1vo'
+1vo-
+2v1p
+1vr
+vrij3k
+vrij3s
+2v1t
+1vu
+vue1
+vues4
+vu2l1i
+vuur1
+2v1v
+vy1
+vyme2
+2v'
+2v1-
+1wa.
+waad1
+wa2b1a
+1wade
+w1adm
+wa1do
+wa1dr
+w1adv
+wa1go
+wa1lu
+wan3da
+wang3s4
+wan1o
+wans2
+wan3sm
+wan3sp
+war2e
+wa3ren
+wa1ro
+war4s3t
+war3ta
+wart3j
+wart3r
+wa3shi
+wa2si
+wa2s1l
+wa2s1p
+1wass
+was3tr
+1wat
+wat1j
+wa1tr
+1way
+2waz
+2w1b
+wba2l1
+w1c
+2w1d
+w2dh
+wd3oom
+we2a
+we2ba
+we2b1l
+2w1e2c
+1wed
+we2d1i
+we4dre
+wee4gr
+week3r
+wee3lo
+weep3s
+weer3sp
+wee3sl
+wee3sp
+wees4t
+wee3to
+we2g1a
+weg1l
+weg1o
+we2g1r
+wegs2
+wei1s
+weka2
+wek1r
+wel3do
+we4l3ed
+we4l3ee
+4w3e4lem
+wel3ov
+wel1s
+we2m1a2
+we2m1i
+we2m1o
+wen3ac
+wene2
+wen3ei
+we4nem
+wen3enk
+wen4k3as
+wen1o2
+2w1enq
+wen5se
+wens3ten
+wen3tj
+we1o2
+wer2f1
+wer4k3a
+wer4k3l
+wer4k3o
+wer4kru
+wer4k3u4
+werk3w
+wer4p3a
+wer4pr
+wer2s
+wes3te
+west3o
+1wet.
+1wetg
+wet1h
+wet1j
+wet3sp
+wets3ta
+we2t1u
+2w1ex
+wezen4s3
+2w1f
+w1g
+w1h
+2whei
+whi2
+w3ho
+1wiel
+wie4l3a
+wig1s
+1wijd
+2wijg
+wijka4
+1wijs1
+1wijz
+wi2k1
+wind3r
+wings3
+1wink
+2w1inr
+1wins
+winst3aa
+win4st3r
+wip1
+wis1p
+1wiss
+1wit.
+wi2t1h
+wit1j
+wit1r
+wit1s
+1witt
+w1j
+w1k
+2w1l
+wl1g
+wl1s
+2w1m
+wn1ac
+w1ne
+wnes1
+wn1g
+w1ni
+w1no
+wn1sl
+wn1st
+w1ob
+woest3a
+woes3te
+wo2l
+wol1a
+wolf4s3
+wol1i
+woo2
+woon1
+woor4d3r
+w1op
+wor2c
+wor4g3eng
+wor4m3a
+wo1s2
+w1ov
+2w1p
+wree2
+w1ru
+2ws
+ws1a2
+w1sc
+ws1j
+w1sla
+ws1le
+w1slo
+w1slu
+ws1o
+w1s2om
+w3spec
+w3spel
+w1spi
+w1spl
+ws1pr
+wssi2
+w1sta
+w1ste
+w3s4tic
+w1sto
+w1str
+w1stu
+ws1ui
+w1sy
+2w1t
+wtes1
+wti2
+wtje3sp
+w1v
+wve2r
+w1w
+w1z
+wzee2
+2w1-
+xa1f2
+xa1g
+x1all
+xan1
+x1ap
+x1b
+x1c
+xcu1s
+xe1a
+xe1g
+xe1la
+xeno1
+xe1ro
+xer1s
+x1f
+x1g
+x1h
+xi1c
+xie2t
+xi1g
+xi1om
+xi1p
+xi2t1i
+xit1s
+x1k
+x1l
+x1m
+x1n
+xo1f
+xop2l
+xo1s2
+xo1t
+x1p
+x1q
+x1r
+x1s2
+x1t
+x2t1ak
+xtraat4
+xtu4re.
+xtu4res
+x2tv
+xu1e
+xus3
+x1v
+x1w
+xy1
+x1z
+x1-
+1ya.
+3yaal.
+y1ab
+y1ac
+y1ad
+y1af
+y1ag
+1yal
+yale1
+y1a2m
+yan1d
+y3ante
+y1ar
+yas1p
+y1au
+y1b
+yba2l1
+yber4t3
+ybi2
+y1c
+ycho1
+yco4pe
+ycot1
+y1d
+y1ed
+y1ee
+1yem
+y1en
+ye1o
+y1er.
+1yeri
+y1ers
+y1es1
+y1et
+y1f
+y1g
+yg2d
+y1h
+y1i
+y1j
+y1k
+yl1al
+y1lee
+y1len
+yle1s
+y1li
+y1lo
+ylo3l
+yl1s
+y1lu
+yma4des
+ymbi1
+ymi1s
+ymp1j
+y1na
+yn1d
+yn1g
+y1ni
+y1no
+yn1t
+y1nu
+yo1g2
+y1oo
+y1op
+y1or
+y1os
+yo1t
+y1ov
+y1o'
+y1pa
+y1pe
+y4pete
+y1pi
+y1pl
+y1po1
+y1pr
+yp1s
+y1ra
+y3re
+y1ri
+y1ro
+y1ru
+y1sa
+ysan1
+y1s2c
+ysce2
+yse3ra
+y1s2f
+y1s2h
+ysha2
+y1si
+ys1l
+y1s2o
+ys1t
+y1s2u
+y1sy
+y1t
+y2te.
+yten1
+y2tes
+y2to1f
+yto1p2
+y1u
+yu2r
+yure1
+y1v
+yve2
+y1w
+ywa2r
+y1z
+y1
+y1
+y1-
+y-2a
+1za
+zaad1
+zaal1
+zaar1
+zaat1
+zag3st
+za2ka
+za4ket
+za2k1l
+zak1s
+zak1u
+zan4d3a4
+zan4dr
+zand3s
+zang3s
+za1po
+za1ru
+za1s2
+2zb
+2z1c
+2z1d
+1ze
+ze1a
+zee1k
+zee4p3ac
+zee3r4o
+zeero3v
+zee1s4
+zee1t
+zeg4sl
+zei4la
+zei1s2
+ze1k
+zel3ac
+ze3lar
+zel3dr
+zel4fo
+ze1lo
+zem1s
+zena2
+zen3az
+zen4d3a
+zen3ei
+ze1ni
+ze4n3in
+zen1k
+zen1o2
+zen3sl
+zen3sn
+zen3sp
+zen1t
+ze1pi
+zer1g
+zer1k
+ze1ro
+zer2s
+zers3e
+zer3sn
+zer4st
+zes1
+zes2c
+ze2se
+ze2su
+zet1a
+zet1h
+ze2t1i
+ze4t3ra
+zet3st
+zeve4n3
+ze1
+z1f
+z1g
+2z1h
+1zi
+zie4ki
+ziek3l
+zie4k3o
+ziek3s
+ziek3w
+ziel4s
+2ziep
+zie1t
+zi2g1a
+zi2j
+zij1k
+zij4na
+zij1p
+zij1s
+zik1w
+zine1
+zing4s3
+zin4k3l
+zin4si
+zin4sl
+zins3t
+zi1o
+zipi1
+zi1pr
+zi1s2k
+zi1s2l
+zite2
+zit1h
+zit1j
+zit3st
+zi2t1u2
+2z1k
+2z1l
+2z1m
+zme1
+1zo
+zo1al
+zoet3j
+zoets4
+zoet3ste
+zo1f
+zo1i
+zo1la
+zon3da
+zon3do
+zo2no
+zon3sf
+zo2nu
+zoog1
+zo1p
+zor4g3a
+zor4gr
+zot1h
+zo1tr
+zo1v
+2z1p
+zpa1
+z1r
+2z1s2
+zsce2
+z1t
+1zu
+zue1
+zui4dr
+zus1
+2z1v
+1z2w
+zwets3t
+1zy
+2zz
+z2z1or
+2z1-
+2d
+1m
+1r
+1-
+1h
+1s
+1a
+1b
+1c
+1d
+doe2
+doel3
+1g
+1h
+1j
+1k
+ki1
+1l
+1m
+1o
+om1
+1p
+1re
+r1s
+1r
+1s
+1t
+1u
+1v
+1w
+1z
+1-
+1c
+1d
+1g
+1h
+1l
+1m
+me1
+1n
+ne1
+1r
+re1
+res4
+1t
+ta1
+1v
+1c
+1l
+1m
+1n
+1p
+1t
+te1r
+1v
+2ca
+1che
+1co
+de1s
+2di
+e2
+en1
+f1
+1j
+1l
+1na
+n1d
+1ne
+1ni
+ns2
+ntenvere5
+n1th
+n1tj
+n2t1r
+n1t2w
+1q
+1ra
+1re
+1ri
+ro1
+s1c
+1si
+s1t
+1te
+4ticaa
+1to
+ts1
+1ty
+u1r
+ve1
+1vo
+1z
+2ze
+1c
+1d
+e2n1
+2g
+llu1
+m1
+n1a
+n1d
+ndu1
+ndus4
+1ne
+4nehon
+ne1s
+3nitia
+n1s2
+n1un
+1nur
+o1
+1ro
+s1oo
+s1p
+s1t
+1t
+ti1s
+1v
+1z
+21-
+1t
+1b
+21g
+21l
+21m
+1pe1
+21pl
+ri1
+1g
+1m
+r1
+1t
+1v
+m1
+1su
+t1s2
+o1
+3'n-roll.
+-1a2
+-aan1
+-1b
+-1c
+-1d
+-de2s
+-1e2
+-en1t
+-es1
+-eu1
+-1f2
+-1g2
+-1h
+-1i2
+2-i.
+-in1g
+-1j
+-1k
+-kana4
+-ko1p
+-1l
+-laat3ste
+-m2
+-mana4gem
+-3me
+-1n
+2-n.
+-ne2k1
+-niet3j
+-1o2
+-oe1
+-or1
+-1p
+-1q
+-1r
+-1s4
+2-s.
+-se1n
+-2sn
+-studi3o
+-3t2
+-1u2
+-ui3tjes
+-1v
+2-v.
+-ver1
+-1w
+-1z
+-zout3
+-1
diff --git a/tex/context/patterns/lang-nn.hyp b/tex/context/patterns/lang-nn.hyp
new file mode 100644
index 000000000..0b30104cd
--- /dev/null
+++ b/tex/context/patterns/lang-nn.hyp
@@ -0,0 +1,52 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-nn.rme
+
+% used: D N S a b c d e f g h i j k l m n o p r s t u v w y z å æ ø ü
+
+\hyphenation{
+atten-de
+aust-røn
+aviser
+betre
+bortan-for
+bortre
+Dansk-øya
+der-etter
+dess-uak-tet
+dit-over
+finger-spitzen-ge-fühl
+finger-spitz-ge-fühl
+fram-ifrå
+før-enn
+her-etter
+her-etter-dags
+hvor-etter
+hvor-over
+høyt-ærede
+gi-vet-vis
+lands-øl
+lands-ølet
+lands-ølets
+langt-ifra
+ned-imot
+noens
+Not-odden
+Not-oddens
+nøye-reg-nen-de
+opp-imot
+oven-ikjøpet
+promp-te
+spleen
+sel-ves-te
+smal-enden
+sørpe-is
+sørpe-isen
+skrov-is
+skrov-isen
+Steins-land
+syd-enden
+tvert-om
+velan
+velet
+welt-schmerz} \ No newline at end of file
diff --git a/tex/context/patterns/lang-nn.pat b/tex/context/patterns/lang-nn.pat
new file mode 100644
index 000000000..ff12a14a7
--- /dev/null
+++ b/tex/context/patterns/lang-nn.pat
@@ -0,0 +1,27154 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-nn.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z å æ è é ê ò ó ô ø
+
+\patterns{
+.a4
+.aa4
+.ab4ba
+.ab7be
+.ab6s5t
+.ac6tin
+.adel4s
+.ad8la.
+.ad6le.
+.ad2r
+.ad1s2
+.af7f
+.af5t4
+.af5f6u
+.ag6na.
+.ag6ne.
+.ag4r
+.ai2
+.a6k
+.ak6ka.
+.ak6ke.
+.ak3kl
+.ak3kr
+.ak6ne.
+.ak6r
+.ak8sa.
+.ak4se.
+.ak6ta
+.ak4te.
+.akte4r
+.akter5e
+.ak5tr
+.akva7
+.a6l
+.albu5en
+.alfa3
+.al4ge.
+.al5gi
+.al6ka.
+.al4ke.
+.al4kom
+.al4la.
+.al4le.
+.al5leg
+.al5lo
+.all5s6
+.al4ma.
+.al8me.
+.al5m6in
+.al4na
+.al6s7k
+.als5o
+.alt4a
+.al4ta.
+.al5tar
+.al4te.
+.alt3o
+.al6ve.
+.am7b
+.a6me
+.am6ma.
+.am4me.
+.am4s4
+.am6ta
+.a6n
+.ana3b
+.an4da.
+.an4de.
+.an5d4ra
+.an4d5ø
+.an3er
+.anes5
+.an4ga.
+.an3ge
+.an4ge.
+.ange4s
+.an4ja.
+.an4ka.
+.an4ke.
+.an4la.
+.an3n
+.an4na.
+.an7nal
+.ann4e
+.an4ne.
+.an5s8
+.an4sa.
+.an4se.
+.ant2
+.an4ta.
+.an4te.
+.an5tem
+.an5tep
+.an4ti.
+.an6tin
+.an4tis
+.an4tiv
+.ap8lan
+.ap1p6
+.ap8t
+.arbi5
+.ar6de.
+.are4o7
+.ar4ge.
+.ar5ges
+.ari6a
+.ari8e
+.arie5ne
+.ar5ka
+.ar8ka.
+.arlan9
+.ar4me.
+.ar7mea
+.ar4na.
+.ar3ne
+.ar4ne.
+.ar5nes
+.ar6ra.
+.ar6r7u
+.ar6ta.
+.ar4te.
+.ar9ti
+.ar6va.
+.ar4ve.
+.ar4ved
+.ar4ver
+.arvi6
+.a6s
+.as8ka
+.as4ke.
+.as5kese
+.as4le.
+.as6pa.
+.as5s
+.ast5ru
+.at4h
+.at4ki
+.at4le.
+.at4na.
+.at2o4
+.at3s
+.atte4
+.att6r
+.a5ty
+.au8de
+.au6e
+.au8ga
+.au4ge
+.au4ka.
+.au8le.
+.au4r
+.au6sa.
+.au6se.
+.aus9k
+.au4sp
+.avi2
+.av7i6d
+.av7inde
+.av4la.
+.av4le.
+.av7s6
+.b6
+.ba6by
+.ba6la.
+.ba4le.
+.ba4ne.
+.ban4k3l
+.ba4re.
+.ba4ri.
+.ba8te.
+.be4de.
+.bede4n
+.be6d5ene
+.be4d5et
+.be8di.
+.be3e4d
+.be6ke.
+.be4la.
+.be9nar
+.be4ne.
+.be6ra.
+.be6re.
+.be4res
+.ber6ett
+.be8ri.
+.be7ska
+.be6sten
+.be4ta.
+.be6te.
+.be5t4v
+.bi6de.
+.bi6en
+.bi4le.
+.bilet5
+.bi6t3r
+.bl4
+.bla4d
+.ble4k3
+.ble5k4e
+.blek4k3f
+.blekk3s4t6
+.blekk9s8v4
+.bling5
+.bo8da
+.bo8de.
+.bogs8
+.bok5
+.bo4k4en.
+.bo8la
+.bon2
+.bo4na.
+.bor6t5
+.bort6e
+.bor8ti8
+.bort9r
+.brudd7s6
+.bruddså7
+.bu6da.
+.bu3d6r
+.bu4et
+.bus6sy
+.by6de.
+.by8ta.
+.bæ2
+.bø6k5a
+.bø8nen
+.bø8ner
+.c4
+.ca4en.
+.car4s5
+.ca6se
+.ce6b
+.cos1
+.co4st
+.d6
+.da4ge.
+.da4le.
+.dags6e
+.da2m
+.da4ne.
+.da4ta
+.dau3s
+.deka9r
+.deko7d
+.de4le.
+.de4l5ei
+.del5s6
+.de4mi.
+.demo7e
+.den5sl
+.de4re.
+.de4r5et
+.de4ri.
+.de6r3i4
+.de7r4i5v
+.de4r5om
+.de6s5m
+.de4so
+.de4sto
+.de4u
+.devi5s
+.di2a
+.di5e4l
+.di6er
+.di4et.
+.di9f6t
+.di4ne.
+.dings7a
+.di4sk
+.di8s3t
+.do4en
+.do4er
+.do8et
+.dome5
+.do4ra
+.do6re.
+.drau4m
+.ds4
+.du4a
+.du4en.
+.du4er
+.duft3
+.du4ge.
+.duk3n
+.du4se.
+.du4st
+.dy4re.
+.dø6la.
+.dø6r3
+.dø7r4a
+.dø7r4e
+.dø4ve.
+.då5ren
+.då7ret
+.e6
+.eb4ba
+.ecu6
+.ed4da
+.ed4le.
+.efo7
+.ef4ta
+.efta5s
+.ef6ter
+.eg8de.
+.ege2
+.ege5l
+.eg6ga.
+.eg4ge.
+.eg4gel
+.eg8la.
+.eg4le.
+.eg6na.
+.eg4ne.
+.ego7t8
+.egs4
+.eg8se.
+.eg5si
+.ei2
+.eid5a
+.ei5den
+.ei4ga.
+.ei7ger
+.eik5a
+.ei4ke.
+.ei3l
+.ei3m
+.ei8ma.
+.ei8me.
+.ein7as
+.ei3ni
+.ein5og5
+.ein5s6ta
+.ein8s7to
+.ei9rar
+.ei5res
+.eir9u
+.ei5te
+.eit9r
+.ekk4o
+.ek4le.
+.ek3li
+.ek6ne.
+.ek4r
+.ek8sa.
+.ek3se
+.ek8se.
+.ek4sp
+.eks6pi
+.eks3t4
+.ek5s4ta
+.ek8ta
+.ek4te.
+.ek7to
+.el8da.
+.el4de.
+.el4g5r
+.eli5ne
+.el3k
+.el5l
+.el6s
+.els6a
+.els4kl
+.els6t
+.el6ta.
+.el6te.
+.el6veg
+.em3b2
+.emfa9
+.em4ma.
+.em8me.
+.em6na.
+.em5p
+.en5a
+.en4da.
+.en4de.
+.end5r
+.en4ga.
+.en6gav
+.en3ge
+.en4ge.
+.en6g5r
+.engs6
+.en6ka
+.en4ke.
+.en5og5
+.en6sa
+.en4se.
+.en5so
+.en3sp
+.en5t
+.en6te.
+.ent4r
+.en6t5ra
+.ent8re
+.en3ø4
+.ep6t
+.er8a
+.er4e
+.er4g5r
+.er4ke
+.er4la.
+.er4le.
+.er6ma.
+.er4me.
+.er4mek
+.er4na.
+.er6ta.
+.er4te.
+.es9ast
+.es1k
+.es3ka
+.es8ka.
+.es4ke.
+.es5l
+.es8la.
+.es8le.
+.es3p
+.es6pa.
+.es6r
+.es8sa.
+.es4se.
+.es4so
+.es5ta
+.es3te
+.es6te.
+.es7tet
+.es5ti
+.est3r
+.es7tu
+.et8la.
+.et8le.
+.et4na
+.et4ne.
+.et4s
+.et8sa.
+.et5s4e
+.et6se.
+.ets4i
+.et1te4
+.et6ter
+.et6ti
+.ev8ja
+.ev4je.
+.ev4ne.
+.ex4
+.f4
+.fa2e
+.fag3s4
+.fa4ne.
+.fan3t4o
+.fe4e
+.feil5i
+.fe2l
+.fela9
+.fel5l
+.fel4ta
+.fe4ma
+.fe8me
+.fem5o6g5
+.fem5t
+.fer8ro
+.fer6s
+.fe8sl
+.fe8st5
+.fes3t6e
+.fi4b5
+.fi6a
+.fi4le.
+.fire5o6g5
+.fis6k
+.fjel4
+.fla4t5o
+.fo4bi.
+.fol2
+.fo2r
+.for3d6ri
+.for7d6ra
+.for5en.
+.form5s
+.for7s6o
+.fre6e
+.fri5e6re
+.fug2
+.fu6ge.
+.ful2
+.fu8se.
+.fy8se
+.fø8rel
+.g6
+.gaf7
+.ga4le.
+.ga8li.
+.ga4me
+.ga4ne.
+.gang5s4
+.gas4
+.gas5ta
+.ga2t
+.ga4ve.
+.ga9vee
+.ge2a
+.gel4e
+.ge3ne
+.ge6ni5
+.gen5s
+.ge4o
+.ge4st
+.ge5s6tap
+.ge9sv
+.gha5
+.gift5s
+.gi4n
+.gi4s
+.gis7p
+.gi8v3a
+.gl6
+.glo6i
+.glo9v
+.gly5s
+.glø9se
+.gnå7la
+.go5des
+.gos7
+.gra4v3end
+.grei4e
+.grunn5s
+.grus5s
+.gu4de.
+.gud3v4
+.gu4lat
+.gus1
+.gu4tu.
+.gø2
+.gås4e5
+.gå4v
+.h4
+.hai5s6
+.ha6ka.
+.ha8ma.
+.hand5s6l
+.handsla9
+.ha6v5ak
+.ha6vi
+.he4er.
+.hei5e
+.he2n
+.hen3i2
+.he6r5i6
+.he6r5o6
+.he9r6oe
+.he7r6oi
+.he7r6ol
+.he9r8os
+.hes4s5
+.het6s5
+.het7s6e
+.he4t5
+.he5t6e
+.hil4l
+.hi4n
+.hi6re.
+.ho2d
+.ho2e
+.ho4re.
+.ho5ren
+.ho7ret
+.ho8ta.
+.ho8va.
+.hu4di
+.hus6val
+.hvit3
+.hvi3t4e
+.hy6ra.
+.hy4re.
+.høi5
+.hø4re
+.hø4va
+.hø4ve.
+.høy6st5æ
+.hå8en.
+.hå8er
+.hånd5s6l
+.i2
+.i3a4
+.i3bl
+.i4da
+.ifø5re
+.ig8la.
+.ig4le.
+.i4her
+.ik2
+.ik6k
+.ikke5
+.i3k6l
+.ik5t
+.ik8te.
+.i5kv
+.i3la
+.i4la.
+.i8lande
+.ilbo8da
+.il6d3r
+.il6de.
+.i3leg
+.i6les
+.il4ja
+.il6je.
+.il6ke.
+.il4le.
+.il6sk
+.il4te.
+.i6me
+.imø5te.
+.in5ad
+.in5de
+.in8ga.
+.in4ge.
+.in3gr
+.in6gri
+.in5k6
+.in6ka.
+.in4n3
+.in4ne.
+.in5n6e
+.in6n7eks
+.in6n7ets
+.in6n7ett
+.in4n3i
+.in5s
+.in7tes
+.io4na
+.io4nom
+.i4rer
+.ir7k8
+.ir8ra.
+.ir6re.
+.i6sa
+.i3sc
+.i6se
+.is7k6
+.isla8ga
+.is6lam
+.is4le.
+.is4let
+.is4me.
+.is8na.
+.is8ne.
+.is5pa
+.i5spe
+.is3s4
+.is6sa.
+.is4se.
+.is5sk
+.ist6
+.is8te.
+.i5sted
+.i5stem
+.is7ti
+.i6s7tj
+.i6s7tr
+.is8ut.
+.i6s5ø
+.i5ti
+.i3va
+.i4van
+.i4var.
+.i3ve
+.i4vel
+.i6ven
+.i4ver.
+.i4vere
+.iv8ra.
+.iv6re.
+.i3ø
+.j4
+.ja4de.
+.ja6e
+.ja4ne
+.ja8se.
+.ja4va.
+.je2a
+.je2l
+.je2m
+.je5re
+.jern5s4
+.je4ta
+.ji4
+.jo8en.
+.jo4se.
+.ju6a
+.ju6la
+.jule3
+.ju4li3
+.jø4dep
+.k6
+.kaf2
+.ka6la.
+.ka6li.
+.kalve5l8
+.ka5me
+.ka3na
+.ka4ne.
+.ka4p3r
+.ka4ra.
+.ka5r6a5v
+.ka6re.
+.ka5rin
+.ka4te.
+.ka5t6h
+.kau9k
+.ka6va.
+.ka4ve.
+.ke6e
+.kel3
+.kier3
+.ki4na
+.ki7ni
+.kino3
+.kir2
+.ki4se.
+.ki8va.
+.ki6ve.
+.kje3de5
+.kje4k
+.kjek7l
+.kjønn4
+.kle4s
+.kli5ne
+.klo9va
+.kly7sa
+.kna7se
+.kne4p3r
+.ko6da.
+.ko7gr
+.ko4la
+.ko3le
+.ko8le.
+.kol5j
+.ko3pe
+.ko6pe.
+.kor6s5ed
+.ko4se.
+.ko6ta.
+.ko4te.
+.ko6ve.
+.kring5s
+.ks6
+.ku5f4l
+.ku4le
+.ku8ra.
+.ku4re.
+.ku8ta.
+.ku8te.
+.kva4r1a
+.kve9ka
+.kve5ke
+.ky8la.
+.ky4le.
+.ky6te.
+.kø3s
+.kå6pa
+.l6
+.la4da.
+.la4de.
+.la4ga
+.la4ge.
+.la5ger
+.la4ma.
+.la6ta.
+.la4te.
+.la3tr
+.la4va
+.la3ve
+.la4ve.
+.le8ar
+.le4da.
+.le4de.
+.le4er
+.le6et
+.le2f
+.lef3l
+.lega5ta
+.le4ge.
+.le4gel
+.le8gi.
+.lei5er.
+.lei4ve
+.le4ke.
+.le4k5r
+.lemu9
+.le4ne.
+.le6o7
+.le7s6a
+.le4se.
+.le4sek
+.le4ses
+.le4s5p
+.le2t
+.le7ta
+.let6tan
+.le2u3
+.le3va
+.le4va.
+.le4ve.
+.le4ves
+.li8a
+.li4de.
+.li4e4
+.li5ene
+.li2g
+.liga3
+.li2k
+.lik5k6
+.lik3o
+.lik3s
+.li4ma
+.link6
+.li6ra
+.li4re.
+.li4sa
+.li4se.
+.li4ta.
+.li4te.
+.li5ti
+.li4ve.
+.li4v5en
+.liv8s7u6
+.liv4s5v
+.lo4e
+.lo6ge.
+.lo8gi.
+.lo6g5r
+.lo4i
+.lo6na
+.lo8o
+.lo6ri
+.lo8sa.
+.lo4se.
+.lo6te
+.lo4va
+.lo3ve
+.lo4ve.
+.lu4d
+.lu2e
+.lu4na
+.lu6pa
+.lu4pe.
+.lu6ra.
+.lu4re.
+.lu6se.
+.lu4ta.
+.lu9tas
+.ly4de.
+.lyd3s
+.ly8e
+.ly8ge
+.ly4se.
+.ly4sk
+.ly5s6e
+.lys5s6
+.ly8str
+.ly4te.
+.ly4ve.
+.lø8de.
+.lø6en.
+.lø8ne.
+.lø6pa.
+.lø4pe.
+.løv5i
+.løye5ne
+.lå8ma
+.lå5re
+.lå6re.
+.lå4te.
+.m8
+.ma4ge.
+.mag9r
+.ma3ka
+.ma4ke.
+.mak6t5at
+.makt5s
+.ma4le.
+.ma4li.
+.ma4na.
+.ma4ne.
+.ma4ni.
+.ma4ra.
+.ma4re.
+.ma4ri.
+.ma4sa.
+.ma4si
+.ma6st
+.ma8ta
+.ma6t8h
+.mat5t8o
+.ma4v
+.me4d3
+.me6d5ei
+.me6d4i
+.me6d7in
+.me6d5r
+.mei5er.
+.mei5et
+.mek5l
+.me6la.
+.mel3l6o
+.me4l5ø
+.me4ne.
+.me3ri
+.me4sk
+.me2t6a3
+.me3ta4ll
+.mes5ti
+.me4tri
+.mi6kj
+.mi4le.
+.mi4me.
+.mi4ni.
+.mi4nik
+.min4k3
+.min5k4e
+.mi6s3t4
+.mne6
+.mo5de
+.mo6er
+.mo4na.
+.mo8ne.
+.mon4st
+.mons6t5r
+.mor5d6e
+.mo4re.
+.mor3t6a5
+.mo4se.
+.mo4ta
+.mo4tek
+.mo4ter
+.mo4tr
+.mo5v
+.mu8ga
+.mu8ge.
+.mu6le.
+.mul5es
+.mur7
+.mu5r8e
+.my8ka
+.my4ke.
+.mø4re.
+.mø5res
+.mø2t
+.må6la.
+.mål3o
+.n8
+.nabo3
+.na6ge.
+.nak2
+.na8ke.
+.nan5s
+.na4r
+.na4sa.
+.nat2
+.na3tr
+.nat6tr
+.ne4de.
+.ne4den
+.ne4d5i
+.ne4d3r
+.ned3s4
+.nei5e
+.ne8pa.
+.ne6pe.
+.ne2s
+.ne4t
+.ni8ar
+.ni6er
+.nig4l
+.ni4na.
+.ni5o6g5
+.ni4pa.
+.ni6pe.
+.ni8sa
+.ni6se.
+.nita9
+.ni4to
+.ni4va
+.no6de.
+.no6e
+.no8ka
+.no4me.
+.no8mi.
+.no4r
+.no8se
+.no8si.
+.no4va.
+.nu4e
+.ny5a
+.ny8sa.
+.ny6se.
+.ny4te.
+.nær9ast.
+.næ4re.
+.nød4d
+.nø4re.
+.nå4de.
+.nå6le.
+.o6
+.obo5e
+.od4da.
+.od4de.
+.od8la.
+.od8le.
+.offsi6
+.of4te.
+.of5teb
+.og4
+.ok1k
+.ok8ka.
+.ok8ke
+.ok4se.
+.old3s
+.ol4ga.
+.oli5
+.ol8la
+.ol8le.
+.ol6m
+.om1
+.om4ar.
+.om6bo.
+.om4e6n
+.om4gå.
+.om4me
+.om5s2
+.on4de.
+.on5des
+.ond3s
+.on6kl
+.on6na
+.on8ne.
+.op5ar
+.op4pa
+.op4pe
+.opp7el
+.op4pi
+.opp3l
+.oppla8te.
+.opp5s6
+.op7r
+.opt6
+.or4da
+.or4de.
+.or4del
+.or4dr
+.ord5s4
+.or5ga
+.or6ka.
+.or4ke.
+.or6me.
+.or4re.
+.ort6
+.or6va
+.osa5
+.os4k
+.os4s
+.os4te.
+.ot5r
+.ot7t8a
+.ot4ta.
+.ot4te.
+.ot4tes
+.ot3to
+.ot4to.
+.ove6
+.over3
+.overen6d
+.over3i4
+.over5k8
+.ov8re
+.ov5u
+.p6
+.pa8la.
+.pa4le.
+.pa5n6e
+.pa6n7eu
+.pa5n6i
+.pa6re.
+.pe3do
+.pe4ke.
+.pek5t
+.pel4sj
+.pe4ne.
+.pe2p
+.pep3r
+.pe8sa.
+.pese5t
+.pe4st
+.ph2
+.pi6le.
+.pi6p
+.pi9ra
+.pi2s
+.plen5g6
+.plus6s5
+.plus7s6e
+.plø7se
+.po4et
+.po3la
+.po8la.
+.po4le.
+.po4log
+.po2p1
+.po2p2e
+.pop3p
+.po3p2u
+.po8ra
+.po6re.
+.po4res
+.po6st
+.po8ta.
+.po6tek
+.ps2
+.pøn3
+.pøn9s6
+.på5d6
+.r6
+.ra6da.
+.ra6et
+.ra4ga.
+.ra4ge.
+.ra4ja.
+.ra4ka
+.raks7
+.ra2m
+.ra4na
+.ra4ne.
+.ran7s6a
+.ra6pa.
+.ra6pe.
+.rap4s
+.rap5s4e
+.rap5s4o4
+.ra4re.
+.ra6sa.
+.ra7ti
+.ra6va.
+.ra4ve.
+.re4al
+.re6da.
+.re4de.
+.ree6l
+.rege4l
+.re4gi.
+.rei2
+.rei7de
+.rei5er.
+.re4ins
+.re6ka.
+.re4ke.
+.re8klar
+.re8kle
+.re4kli
+.re6kn
+.re8le.
+.re4ma.
+.re4na.
+.re4ne.
+.ren6sk
+.ren4t
+.rep5s
+.res9s
+.re5s6tan
+.rett7s8kri
+.re4ve.
+.re4ves
+.rev9n
+.ri2d
+.ri8e
+.rie5ne
+.ri6ka.
+.ri6ma
+.ri4me.
+.ri4pa.
+.ri4pe.
+.ri4p5o
+.ri4sa.
+.ri4se.
+.ris5ko
+.ri4s3ø
+.ri4ta.
+.ri6te.
+.ri6va.
+.ri4ve.
+.ro4an
+.ro4de.
+.ro8di
+.ro4e
+.ro8ke.
+.ro4ma.
+.ro4mi
+.ro6pa
+.ro9par
+.ro3pe
+.ro4pe.
+.ro4sa
+.ro9sar
+.ro4se.
+.ro4sed
+.ro4ta.
+.ro4te.
+.ro4tek4
+.ro8va
+.ro3ve
+.ro8ve.
+.ru8ga.
+.ru4ge.
+.rug9le
+.ru8ka
+.ru4na.
+.ru4ne.
+.runes6
+.run7g
+.ru4se.
+.ru4sk
+.ru8va.
+.ru4ve.
+.ry2e
+.rye7ne
+.ry6ke.
+.rød2
+.rød7s4
+.rø8le.
+.rø4re.
+.rø1v
+.rø8va.
+.rø4ve.
+.røy7e
+.rå8da.
+.rå4de.
+.rå4en
+.rå8er.
+.råg8
+.rå6ka.
+.rå4ke.
+.rå3k4l
+.rå6na.
+.rå8sa.
+.s6
+.sa4ge.
+.sag6n
+.sa4la.
+.sa4le.
+.sa4me.
+.sa4mer
+.san6d7
+.san7d8e
+.san7d8i
+.san8s7ku
+.sau6e
+.sch6
+.se2b
+.se2e
+.se4i
+.se4k5l
+.sek4s5o6g5
+.sel4v5
+.sel4v5i6
+.se6na.
+.se4ne.
+.sen7s
+.se4ra.
+.ser7vel
+.se4te.
+.sha9ke.
+.si2d
+.si6er
+.si6ga.
+.si4ge.
+.sik5k6e
+.si8la.
+.si4le.
+.si4ne.
+.sinn6s5
+.si4ra.
+.si5str
+.si4va
+.si4ve.
+.sje4i
+.sju5o6g5
+.sk4
+.ska7ka
+.ska5ke
+.skat4
+.skei5d
+.ski6n
+.skinns6
+.sko7de.
+.skog5u
+.skritt9s8
+.skudd5s6
+.skuddså7
+.sku6m5
+.sky6f7la
+.skå5ra
+.slim5
+.slotts5
+.slu9ka
+.slu5ke.
+.slø5se
+.sma4s
+.smas5k
+.smo9g
+.små3
+.små7k6
+.små9l
+.små5t4
+.småt5t
+.sn4
+.sne3
+.snitt5s6
+.snø3k
+.soa8
+.so8de
+.somma4
+.son6a
+.sop4pa
+.sor4t5
+.so4ta.
+.s8p6
+.spa5ra
+.spe6e
+.spi9la
+.spri5s6
+.st6
+.sta9ka
+.sta5li
+.stat4s
+.sted4s
+.ste4i
+.stein7a8
+.stein7s8
+.stem4m
+.stev9na
+.sti7me
+.sto5ne
+.sto6ra
+.strek5s6
+.stu8a
+.stu9va
+.stål5l6
+.sund5s6
+.su4ri
+.su5te
+.sv8
+.sva5la
+.sva5ra.
+.sva5re
+.svar5s
+.sver8n
+.syd5
+.sy5d6e
+.sy6na.
+.sy4ne.
+.sy5ter
+.sy3ti
+.sy6v5
+.sy6v5o6g5
+.sz6
+.sæ2
+.sær1
+.sær3e4g
+.sø8ka
+.sø4ke.
+.søl6v5
+.sør3a
+.søye5
+.søy6en
+.så5pen
+.så3re
+.t8
+.ta8ke.
+.tak9r
+.tak5sk
+.tak9s8p
+.ta4la.
+.ta4le.
+.ta4les
+.tal4li
+.tam5m
+.tan5de
+.ta4p5r
+.ta4ra.
+.ta4re.
+.ta2s
+.te4e
+.te6i
+.tei9er
+.te8ke.
+.te4ma.
+.te6o
+.te8ne.
+.te4se.
+.te7si
+.te4sta
+.te4str
+.th2
+.ti8a
+.tid5r
+.tid6s3
+.ti4de.
+.ti4e
+.ti4g3r
+.ti4ki
+.ti4l5
+.tili6
+.ti4med
+.ti4na.
+.ti4ne.
+.ti4p5l
+.ti4s
+.to5arm
+.to6en.
+.to4er.
+.to6et.
+.tokk8
+.to6le.
+.to6na.
+.to5o6g5
+.to4ra.
+.to4re.
+.to6reb
+.to3ro
+.torsk6e5
+.tor4s5v
+.to5rye
+.to4str
+.tota9la.
+.to5t8
+.to8te.
+.to6va
+.to4ve.
+.tr6
+.tra7c
+.tre3b
+.tre7p
+.tre5o6g5
+.tre6skja
+.tre3s8ko
+.tre3sp
+.tre5s6t
+.ts2
+.tsj2
+.tu4en.
+.tu6na
+.tu4ne.
+.tu6ra.
+.tu4re.
+.tu8ve.
+.tve6n
+.tver6r5a6
+.två7g
+.ty6da.
+.ty4de.
+.ty8et
+.ty8re.
+.tyr8s9
+.ty5ter
+.ty5ti
+.tæ4re.
+.tøv9d
+.tø6ve.
+.tø9ver
+.tø5vet
+.tå5ker
+.tå4le.
+.tåp9n
+.tå5ren
+.tå7ret
+.u5a6
+.u1b2
+.u6berg
+.u3d2
+.u7de
+.u3e6
+.u4er.
+.u6era
+.u4ere
+.uf4f
+.uf8sa
+.u4ga
+.u5gi
+.ug6la.
+.ug8n
+.u1i
+.ui6m
+.u1k6
+.u4ka.
+.u6ke
+.u7kn
+.u3le
+.u4le.
+.ule8k
+.ulen4d
+.u6lende
+.u8lene
+.u6let
+.u4lin
+.ul6ka
+.ul4ke.
+.ul4la.
+.ul8le.
+.ul8ma.
+.ul4me.
+.ul4ne.
+.ul5t
+.ul6te
+.u1lu
+.ul4v5i
+.u1ly
+.u3lå
+.u5ma
+.umu7
+.u2n
+.unde6ri
+.und5r
+.une8
+.u5nek
+.u9net
+.un4ge.
+.un2n
+.unn3s
+.u3no
+.un4se.
+.un4t
+.u5nu
+.u1o
+.u1p
+.u4pi
+.up2l
+.u2ra
+.u5raf
+.ur6an
+.u6rane
+.ur4d
+.ure4n
+.u4ret.
+.u6rets
+.u2r2i
+.ur4ke
+.ur6na
+.ur4ne.
+.u1ro
+.ur1s
+.ur8ta
+.ur4te.
+.urte5m8
+.ur6tet
+.u5rut
+.u3ry
+.u5rå
+.u1s2
+.u4sa.
+.u4sas
+.u5se
+.u3ska
+.u5sn
+.u7sp
+.us3se
+.us6t4
+.u7stek
+.u5stel
+.usy5r
+.u2t
+.uta4g
+.ut5age
+.u3tak
+.u4ten.
+.ut5esk
+.ut6e7sko
+.u4ti.
+.ut3kan6t5
+.ut4ne.
+.u5tol
+.ut3o6v
+.ut6rer
+.ut6rov
+.u3trø
+.ut6se.
+.ut4si.
+.ut3t4
+.u3tu
+.v6
+.va4da.
+.va4de.
+.vai4
+.va4ke.
+.va6les
+.valg5s
+.va4ne.
+.van4n5
+.vann5s4
+.va6reta
+.vari4e
+.var5sk
+.ve8en.
+.ve4ga.
+.ve6ge.
+.ve4g3i
+.veg3s4
+.vei3g4
+.vei3s
+.vei4ta
+.ve4l3
+.ve5l4ar
+.ve6l5art
+.vel5d
+.ve4l3e
+.vel5l
+.ve5l4os
+.ve4l5ov
+.ve4ly
+.ve8læ
+.ve4ne.
+.ve4net
+.ve4ra.
+.ve4ras
+.ve6re.
+.vermo9
+.vers4t
+.ver5ste
+.ve4sl
+.ve4st
+.vete5
+.ve8te.
+.ve4ve.
+.vi4da.
+.vide4
+.vi6de.
+.vi4d5å4
+.vi2e
+.vi4ka.
+.vil5l6a5l
+.vil5l6a5t
+.vi6ma.
+.vi8me.
+.ving7s
+.vin5n
+.vi4sa.
+.vi4se.
+.vi6seri
+.vi4ta.
+.vi4te.
+.vi5tr
+.vok4s3
+.vok5s6e
+.vo6r
+.vo6ta.
+.vy4
+.vye5ne
+.væ4ra
+.væ4re.
+.vå4d
+.vå4r3
+.vårs6
+.wa4r
+.wi6e
+.xe2
+.y6
+.ye4
+.yn8da.
+.yn4de.
+.yn6ge.
+.yn8ka.
+.yn6ke.
+.yn4kv
+.yns2
+.yp8pa.
+.yp4pe.
+.yr8ja.
+.yr8je.
+.yr8ka
+.yr4ke.
+.yrkes5
+.yr6t
+.ys4
+.ysterie8
+.yt9ren
+.yt5t
+.yt6te.
+.yv6
+.z4
+.zj8
+.æ8
+.ære4s5a
+.ære4st
+.æt4te.
+.ø6
+.øg8la
+.øg4le.
+.øi5
+.øi6e
+.øko5
+.øk6ta
+.øk4te.
+.øl3ed
+.øl3s6
+.øl3v6
+.øm4me.
+.øres8t
+.ør4je
+.ør5k
+.ør8na.
+.ør4ne.
+.ør6ski
+.ør9sm
+.ør3st
+.ør8ta
+.ørt9an
+.ør8te.
+.øs2
+.øs4t
+.øv4d
+.øve4r5
+.øve4r6s
+.øv4re.
+.øy6de.
+.øy2e
+.øyele8ge.
+.øy5ene
+.øy4n
+.øy6na
+.øy6ra
+.øy4re
+.øy8rer
+.øy4str
+.å2
+.å6e
+.å6f
+.å6g
+.å6k4
+.å8l
+.ål6t
+.ål8ut.
+.å8m
+.ån8da.
+.ån4de.
+.ånd6s5
+.åp6na
+.års3k
+.å6se
+.ås3k
+.ås7l
+.ås3m
+.å3ste
+.ås5v
+.å4t
+.åt4te.
+.åtte5o6g5
+.å6v
+a1ad
+4aaf
+a3aft
+aa4g
+a1aks
+aak5v
+aa3la
+aa2m
+a1a2n
+a6an.
+aans9t
+a7antr
+a1ap
+aa4ri6
+aarie9ne
+aar5n
+aa2s
+3aase
+aa5t6h
+a1av
+a6bab
+ab7av
+ab9b8l
+ab4but
+abe4lei
+abel5t4
+abe9na.
+abes9ka
+4abev
+a5bh
+abie6
+abi9er
+abi9la
+a4bist
+ab1l
+ab9lara
+ab4lok
+abl7u
+a5bo9a
+abo3b
+abo3e
+a3boer
+abo3kl
+a3bord
+5aborte
+ab1r
+ab8re
+ab2sl
+abu5e
+a4buel
+a4buf
+a6busk
+a4bute
+a4by.
+a4byb
+a4byk
+aby3r
+8ac
+aca5
+a6ca.
+ache3a
+ack3
+a1co
+6ada
+a5dal
+ad5ant
+a4dart
+ad9da
+a2deb
+ade5i6s
+a2dek
+a4del
+a4d5elv
+a5dend
+a3dene
+a2deo
+a2dep
+a5der.
+aderle7
+a2des
+a5de4ser
+a3desl
+a3det.
+a3dets
+3adfer
+1adg
+ad8ge
+adi4ene
+ad1j
+1adju
+2adl
+1adm
+ad5n
+ado7a
+a4dob
+ad7opp
+4ador
+a7dora
+ad5raf
+ad7ran
+a2dre
+ad7rel
+ad5rep
+ad3ret
+ad3rid
+ad1ro
+a7drø
+ad4s5amt
+ad4si
+adsle6ge.
+ad5s4let
+ads5te
+ad5s6tek
+ad3str
+ad5un
+1adv
+adva5re
+2adve
+a4dy.
+a4d5øy
+2a1e2
+4aea
+a4ed
+ae3de
+aed7r
+aek5t
+a4el.
+ae5la
+ae3li
+ael5o
+aen5t
+a3ep
+aes8ke.
+aes4t
+6afa
+6afc
+a4fe.
+afei5
+af4fan
+af4fei
+affe3s
+af7fi.
+affi3d
+af5f4u
+af4i
+afia1
+afi5an
+a2fib
+a6f5inn
+afi7re
+a4fiti
+a5fjo
+af9la.
+af9lar
+af3le
+af5li
+a4frik
+6afo
+afo7ra.
+afo7r8e
+afore5ne
+afra5s
+1afri
+afs1l
+aft5ei
+af4t5e4l
+af6t5o
+aft1s4
+af5yr
+afø4r
+afø5ri
+4aga
+a2gaa
+a5gae
+a4ganf
+agang7s8
+a4gart
+a5gas.
+aga6ve.
+ag5de
+a7gelen
+a2gem
+3a4gent
+age4r3a
+age6rek
+age5risk
+a7gers
+a5geru
+age5s2
+a4geta
+a4gé
+ag5gar
+ag4gas
+ag5ge
+agg1s2
+agg7u
+ag6gut
+a4gi.
+ag5id
+agi6s
+ag1la
+ag4lem
+ag6lesa
+ag5lå
+agmo8e
+agn5om
+4ago
+ago5d8
+ag1or
+a5gos
+a3got
+ag5ov
+ag7ras
+ag1re
+ag1ri
+4a3gru
+ag1rå
+ag4samb
+ags4ang
+ag3s4ei
+ag4sel
+ag3sem
+ag5s6ing
+ag6sju
+ag4ska
+ags4kul
+ag2sl
+agsmå6la
+ags3tr
+ags3t2v
+ag2sy
+a6gu.
+agu3ay
+agå8va
+agå8ve.
+a1h
+a5hi
+ah4n5
+ah4v
+ai1a4
+ai3e2
+ai3er.
+ai4is
+ai5ke.
+ai5ko
+ai9kv
+ai5ne
+a3ing
+a1inn
+ai4n5o4
+ai1ro
+ais4e
+ai4s3k
+aisk2h
+ai8sm
+ais6om
+ais5s
+ai5s4v
+ai5ve
+ai5ø
+a1j
+aja9d
+a7je
+a8je.
+ajes7
+a4jé
+a4ji
+a6jl
+6ak.
+a1ka
+4aka.
+1a2kad
+6akaf
+ak3aks
+6akan
+aka4o5
+4akar
+ak6arb
+aka4t5r
+ak4au
+2akd
+2ake
+a9kec
+a2keh
+a3kei5
+a6kek
+akel8e
+akelei9er
+ake5l4i
+ake4rek
+a4kerø
+ake5sm
+akes6p
+a8kete
+akhe6n
+4a1ki
+a6kid
+a6kik
+ak7ind
+akis1
+2a1kj
+akk6and
+ak5ke.
+ak3ken
+akk5erst
+ak4kes
+akki4
+ak5kim
+ak4k5is
+ak6kj
+ak1ko
+akk3ol
+ak6k5ri
+ak1ku
+ak4kul
+ak4k5v
+2ak1l
+ak3lev
+ak6lik
+ak6lus
+6akn
+ak5ne
+a5kno
+2a1ko
+ak5om.
+a5kon
+a7kos
+ak1o2v
+ak4pe6
+akra8sa
+ak5reg
+akregi4
+ak3res
+ak3ro.
+ak3roe
+ak1ru
+ak4s5and
+ak4sek
+akse3l4o
+ak4s5elv
+ak4ses
+ak7s6id
+3aksje
+ak2s1k
+ak7sku
+ak6sl
+4akso
+4aksr
+aks5ti
+ak5stol
+aks4tr
+akst7ren
+4aksu
+ak4tab
+ak4tai
+ak4tak
+akta6le.
+akt5all
+ak6tam
+ak6tans
+ak4tap
+ak4tas
+ak4tav
+ak4teg
+ak4tek
+ak5teme
+4akth
+7aktig
+ak5tit
+aktle6ge.
+ak2tr
+ak6tre
+akt3rå
+akt5s4la
+5aktue
+akut2
+2akv
+ak3val
+ak5øl
+a5kå
+8ala.
+al7adr
+ala4g
+ala9ga
+a5lagm
+alag8ra
+a5lah
+a1lai
+al3all
+al3a4me
+al3ana
+a3land
+a5lande.
+a5lane
+alan5gr
+al3anl
+al3anv
+ala4o
+ala5pr
+a5lar.
+a3lara
+a5laren
+al3ark
+a7larl
+3a4larm
+al5arr
+a5lars
+al3art
+a7larv
+al3a4si
+2alat
+ala7tr
+4alau
+al5auk
+al1av
+ala4va
+al4ba.
+albo4g
+albu7er.
+5album
+al3de
+al7der
+4aldo
+ald3re
+2ale
+a2lef
+a2leg
+a9leg.
+aleie6n
+a9l8eik
+a5leke
+a4leks
+a4leli
+a2lem
+al5e4mu
+al8en.
+a4l3enh
+a4l5en5tr
+ale4pos
+a7lept
+a4lered
+alere6de.
+a4le5ro
+a4leru
+ale1s2
+ale7se
+a4lesk
+ale6s5kr
+a4lesl
+a6lesu
+a4leta
+a4le3te
+a2leu
+ale5v
+a4leva
+a4levi
+3alfab
+2alg.
+al3geb
+al2gu
+al4går
+al3ill
+a2lim
+a9lin.
+ali5na.
+a4l3ind
+a4l3ins
+al3int
+al9ja.
+al3je.
+alj5end
+al3jer
+al1jo
+al4jor
+al2j1u
+al1jø
+alj5ø6v
+al9kera
+alk7s6
+alla4ga
+alla6ge.
+al4lap
+all5art
+al5lea
+alle6ge.
+al4lek
+al5len.
+all5erst
+alle3s4
+al4lest
+al5let
+3allia
+al4lid
+5alli5e
+alli9ne
+al6list.
+al4lo3m
+all4sen
+all4sti
+al6lul
+al6løs.
+al4løse
+al8løst
+al6lå
+al6mek
+al4met
+4aln
+a5lo.
+al1o4b
+a5loi
+al1om
+a1lon
+al3ope
+al7ord
+alori5
+alo6rit
+al3ove
+alow7
+alp2
+al3ps
+2als
+al7sed
+al9skap
+al7skare
+als1l
+als5lø
+al2sn
+al6spu
+als4te
+als6ter
+6alsu
+alt6ak
+alta8le.
+al3ted
+al7tema
+5alterna
+alte4t
+al4t5eta
+al4t5ete
+al4t3op
+a4l5u4k
+alul8la
+al5und
+alu8re.
+al5va.
+alv5aks
+alvak8se.
+al4ved
+al5v6er
+al8v9er8m
+alve5s
+al9ves.
+alvi8se
+al1vo
+alv3s
+6a1ly
+a2l5y4te
+alø5se
+al3øv
+a1lå
+al7å6t
+a4mah
+ama5is
+a2mak
+a5maki
+am3aks
+a2mal
+am5ald
+a3man
+a3mar.
+a5mara
+a7mas.
+amaso7
+3a4matø
+am4bar
+3ambas
+am4bat
+am5be
+a2mei
+am3eie
+a3meis
+a2mek
+am3eks
+amen8de.
+amen4s3
+amen6t7arv
+ame4ram
+a4meret
+3a4meri
+4amerin
+ame5u
+amhu7
+2ami
+ami7na
+ami7ne
+amisk3
+amis4ku
+am4lese
+am6lest
+am4mad
+6amn.
+am4ned
+a2mo
+amo5e
+am1op
+am1or
+amo6ve
+am4pap
+am4pare
+amp5ei
+am8peria
+am6perie
+ampes6
+amp7inn
+am2p3l
+am5p4let
+am4p4re
+am4pun
+am2på
+amru4
+am5rå
+am1s
+am7s6ku
+ams4l
+amst6
+am4s3tr
+ams9ut
+ams2v
+am4s5ve
+am2sø
+am3ti
+amti5da
+5amtm
+am7tv
+am6ul
+am5yr
+am5øy
+6ana.
+anak8te.
+ana3la
+anal4f
+3analy
+8anan
+a3nane
+a5nang
+anant8
+4anar
+a6narb
+an5art
+ana3to
+6an7au
+anaus7
+an9av.
+3anbef
+4and.
+an4da5m6
+anda5ta
+an4dek
+an5den
+anderle7
+an9det
+6ando
+an4dos
+4ands
+and4sel
+and8send
+and7slet
+and5s6tre
+a2ned
+an5egg
+a4n5elv
+a2nem
+2anen
+2aner
+ane3ru
+a5nes.
+a4nest
+ane5sv
+an5e6tika
+a5netike
+an5e6tikk
+an5e4tis
+a2nev
+3anfal
+anfø5re.
+ang4e
+an4ged
+an4g5enh
+ang5erme
+an8geste
+an4gi.
+5angiv
+ang5of
+an5gos
+an4g9ra
+an4gre.
+an6gres
+an4gret
+an4g3ry
+ang4sm
+angs6tro
+angs8t9rå
+angst5y
+ang5sva
+ang6søy
+ang4t5re
+ang5t6ve
+an4gun
+an4gå.
+ania7
+a6nib
+a4nisj
+4aniv
+an4kana
+4anki
+4ankj
+an4kob
+an4kop
+an4kos
+an2k1r
+ankra8na.
+ank3re
+ank3ut
+8an2kv
+an4kø
+an6k5å6
+2anla
+anland6
+anlø9pa
+ann5ans
+an6neme
+an5nen
+an5ner
+an5nid
+an4ninn
+an4nom
+5annon
+an4nov
+ann4sei
+ann4sid
+ann6s7kå
+ann6sl
+ann3st
+ann5sta
+ann4s3u
+an4ny
+an2nø
+a3no.
+a9noa.
+ano6deb
+2anog
+a7norm
+a6not
+a2no4v
+ano5va
+an3ove
+anri7ke
+ans5aft
+ansa7ka
+4ansan
+3ansat
+an4sek
+an4sent
+anseri8e9ne
+an4ses
+3ansik
+ans5ind
+ans5ins
+an4ski
+an3skj
+ans4k3l
+ans6kun
+an5skø
+an6slø
+an4sn
+ans5or
+an4s3pi
+ansport7s6
+an1st6
+6anstar
+ans4te4
+2ansu
+an9s6und
+5ansunda
+1an1sv
+4ansve
+6ansy
+an4så
+anta8la
+an5t6and
+an4tans
+an3ted
+ant5emi
+5antenn
+an4tesl
+anti7kl
+an4tim
+an5toi
+ant5ord
+ant5rab
+ant7rom
+ant5ryg
+ant5s6
+an4tul
+antus4t
+2anu
+anus7a
+an5ut
+3anven
+6anvin
+6any
+a4nya
+a2n1æ2
+anær8
+2anø
+a2nøk
+an7å
+a1o
+ao9a
+aog9
+a2oi
+ao6k6
+aon8de.
+ao2p
+ao4r
+a5pea
+a7pé
+a1pi
+a2pia
+ap1id
+a6pik
+a6pins
+a2pio
+api6r5
+api7r6e
+api7se
+ap1j
+a1pla
+a5p6las
+ap3li
+ap9lo
+ap2ly
+4apol
+a4pon
+a4poo
+apo3p
+apo5s4ti
+a2pot
+3ap3par
+4appar.
+6appare
+app7esk
+ap5plas
+ap4ple
+ap5pli
+ap6pri
+ap3ra
+ap5ren
+ap5ret
+ap3rin
+ap2s1
+apsa4
+ap3sel
+apse4s
+ap8s9l
+a3psy
+ap4s5ø
+8apu
+a6p5ut
+a1py
+ap7ø
+a3p8øls
+a5på.
+a1ra
+ara9bi
+ar5aks
+arak5t
+ar3alt
+a4rami
+2aran
+a4ranor
+a4rans
+a4ranv
+2arar
+a4r5ass
+ara5te.
+ar5aug
+ar7auk
+arau9ken
+ar7avh
+1arb
+2arba
+arba8ne.
+6arbeh
+4arben
+6arbet
+2arbi
+4arbj
+6arbl
+2arbo
+arbo8da
+2arbr
+2arbu
+2arby
+2arbø
+4arbå
+ar7deb
+ar6deli
+ardfø5re
+ard3re
+ard5sta
+a1re
+1a2rea
+4arear
+a4reb
+areba4r
+a2red
+a2ref
+a2rei
+are3in
+a2rek
+a6r5ekt
+a4rela
+ar7elek
+a4r6eli
+ar7emn
+a5remo.
+3arena
+a6r5eng
+a4reni
+aren5tes
+a2reo
+a2rep
+a6rerel
+a4r5erfa
+a6rerk
+a4rero
+a6rerø
+a5res.
+ares8ka
+ar4et
+a7reta.
+a4rev
+ar7e6va
+ar3evn
+arev6ne.
+8a1ré
+6arf
+ar7g6h
+ar5g6i
+6argj
+arg4l
+ar7go
+arg5stj
+2a1ri
+aria7ne
+a3rib
+ariba9
+ar5idr
+a4rim
+ar3inn
+ar3ins
+arins9k
+ar3int
+ari3se
+arise4a
+a4risto
+a2riv
+ar4kau
+ar3ke
+ar4ke5s
+ar5kha
+3arkit
+3arkiv
+ar4kle
+ar4k5løf
+ar6kod
+ark6ste
+ark4str
+ark7veg
+ar4køy
+arla4ga
+ar4map
+5armbå
+ar4medi
+arme7t
+ar6metr
+ar4minf
+armle6ne.
+armå6la
+2ar2n
+ar4nad
+ar4nal
+arneva7la
+ar3ni
+ar3no
+ar3nu
+ar3nå
+a1ro.
+aro8de.
+a5rok
+a1ron
+ar1op
+aro6pa
+a4r1o4r
+a1ros
+ar7ost
+a1rot
+ar3ove
+ar6ped
+ar9po
+arp5ret
+1arra
+ar5ree
+ar7resk
+arri8e7
+arrå6da
+2ars
+arsa6ka
+ars5ans
+ar3sel
+ar6s5ers
+ar4sin
+ars5kam
+ar5skar
+ars5kes
+ars7kre
+ar4spr
+ars6tr
+ars4vei
+ars7æ
+arta4la
+arta6le.
+ar3te
+ar7tele
+8artets
+art4ha.
+art4has
+ar4tika
+6ar4tim
+4artn
+4arto
+ar4top
+6artr
+art9ra
+ar6trin
+art6s5t
+arts5ø
+6artu
+8arty
+ar4tyv
+ar1ul
+ar1un
+ar5u6r
+a1rus
+ar5utb
+ar5utn
+arve3s
+ar6vete
+arvi8sa
+arvi8se.
+a1ry
+ar7æ6
+arø8ve.
+ar1øy
+a1rå
+arå8de.
+ar7åp
+a6r5åt
+6as.
+4a1sa
+asab4
+asak4
+a4salo
+as6an
+as7aug
+asbe2
+a1sc
+a2se.
+asea4
+a2sed
+a2seg
+a2sek
+as4el
+ase5le
+a2sem
+a6senet
+a4senk
+a7seol
+a2se5s
+a6sest
+a4sete
+a2se3u
+as2h
+as5hu
+a4sib
+a2sip
+a2sir
+a7sis.
+asis5t
+a2siv
+as4ja
+a6sjett
+as5jor
+as3kar
+ask6et
+as5keti
+ask2i
+as5kis
+a5skj
+as5ko.
+as5koe
+a4s5kopi
+as3kor
+as3kot
+a1skr
+as7kra
+as3kul
+a5s6kula
+as6kule
+ask9u8t
+as4kv
+ask5øy
+as1l
+a5s4lag
+asla8ga
+as4lev
+as4lit
+a1so
+a4so.
+a2s5om
+as5ov
+as4pan
+as3pe
+as7pis
+as5pl
+as9sa.
+as4sab
+as4sal
+ass5ald
+ass5alt
+as4sam
+as5se.
+as4sed
+as4sek
+asseri7e6
+as4serv
+as4ses
+as6sifr
+as5sing
+assi3s
+as4sit
+as2sj
+as6s1k
+assku6le.
+as2s3n
+as5so.
+asso9a
+as7sos.
+as6s1p
+as2s3t
+as4stan
+as4str
+ass5tru
+as2s1v
+as4sys
+as4søk
+as2s5å
+as1ta
+as6tab
+a6stande
+a4statu
+as5te.
+as3ted
+as4teg
+as4tek
+as4t5enh
+a1stj
+a9stof
+a5stok
+ast5ov
+ast5ren
+as4tro
+as9tua
+astu8ve.
+ast5ø4v
+a1su
+asu3n
+asu9sa
+as1va
+a6sym
+asyn7d
+as7øye
+as5å
+4at.
+4ata1
+a5taene
+at6af
+ata8ka.
+ata8la.
+a4tang
+ata9rar
+a6t7arv
+atas4
+a5tas.
+atat8
+a2tau
+at5avh
+atch5
+a2tea
+a2tec
+at7edd
+a2tee
+a4tei
+at5eid
+at3eig
+ate3in
+a4teka
+ate5k8e
+ateke7ta
+a6t5ekte
+ate7le
+at3emb
+4aten
+a5tene.
+a4teni
+a4tenu
+a2teo
+4ater
+a5ter.
+a6terat
+a8terek
+a4teril
+a2tes
+a4t3ett
+at6e5u
+a4té
+3atfer
+at4ha.
+at8has
+4ati
+atik6ka
+atili5
+ati5nea
+ati4rep
+ati8sta
+at3jo
+5atlant
+atl9øy
+3atmos
+at4nel
+ato5a
+ato5gr
+at1oi
+a2tom
+a6t5oppr
+a1tor
+a5tose
+a3to1v
+a1tra
+at5reg
+at3ren
+at3rer
+a4trif
+at3rin
+at5rot
+a9tru
+at5røs
+at5røy
+2ats
+at3ser
+at7sje
+at7s6kat
+at7skj
+ats6kul
+at2s3ø
+4att.
+at6tat
+4at5te.
+at5tens
+attfø7re
+at4tid
+atti4s
+att5ise
+at3tit
+att1o
+att7o6p
+atto6v
+at1tr
+at4traf
+at4t3re
+at6trin
+att3s6k
+att5s8l
+att3sp
+att3sv
+at6tys
+at2t3ø2
+a1tu
+atu5e4
+a2tut
+at5v
+atvi5er.
+a3t3w
+a1ty
+atyr8ke.
+a5t6yv
+a1tø
+atør3s
+atø9se
+a4t5øy
+a3tå.
+a7tåa
+a1tåe
+at5år
+at5å4se
+at7åt8
+4au.
+8a8ua
+au9ar.
+4au5b
+auba6ne.
+au3c
+au5da.
+au9det
+au4di.
+4a6ue
+au7en
+au7er
+aue5re
+au3est
+au6e5ta
+au5e6te.
+au4gal
+au4gas
+au4gel
+augele8ge.
+5aug2n
+3augu
+au5i
+au5keli
+au5ket
+auk5la
+1auk7s6
+au5kve
+au6las
+au4lat
+aul5l
+aul8la
+au5lu
+au9men
+au6mo
+aum5s6k
+aum7s4t
+a5und
+au5rae
+aure5s
+au5ret
+au5ri
+aur5s6
+au1ru
+auru4e
+au1sa
+aus9kj
+au6skr
+au1so
+aus5s
+au6s8tas
+aus8tett
+austi6s
+aus6t7ise
+aus6ton
+au5str
+au6stri
+au1su
+au4sun
+au2s5ø4
+aut6a
+au3ta.
+au7tar
+au5te
+1auto
+auto5v
+au3t4re
+au4ty
+2aux
+a1va
+av5ab
+a5vae
+ava7g
+6aval
+av3alv
+a4v3and
+av3ang
+a4v5anl
+3a4van5s
+a9var.
+av3art
+avar6ta.
+4avas
+5avbi
+1avd
+3avdel
+2a1ve
+a2ve3d2
+a5vede.
+a7veil
+ave3in
+a2vek
+a4vela
+a4vele
+a5veleg
+avens4
+a5ver.
+ave7ras
+aver5d
+a6verei
+a2ves
+a2vev
+1avfa
+1avg
+avi4ar
+4a5vig
+a1vik
+avi9ke
+a1vin
+a4v5int
+2avir
+5avisa
+avi5sa.
+3a6vise
+av5ising
+avis3t
+a5vit
+avlu9t
+avlø5se
+6avn
+av7na
+av4nes
+a1vo
+a4vok
+avo3r
+avo4v
+av1r
+av4res
+av5ri
+av1sa
+av5seg
+avs2i
+avsko7g
+3avsni
+av1s2p
+avspe9g4
+avs4te
+av5su
+av1s2v
+1avt
+avta9ka
+2avu
+1avvi
+av3øl
+4a1vå
+a6v7å6l
+a1wa
+awat4
+a5we
+awe9ne
+a1wi
+ay2a
+ay7ane.
+ay5ar
+ay9s8t
+a5y4t
+a5zu
+azz3o
+a1ø
+a7å6
+1b4a
+ba3a
+baby5
+ba4bys
+ba5cl
+ba2d
+ba4da.
+ba7dan
+b5add
+ba8de.
+ba4deb
+ba5den.
+ba7dens
+ba3di
+bad1s
+4baf
+ba2k
+ba5kan7
+ba3kar
+bakars9
+ba3ken
+ba4k5end
+baken6de.
+ba3ker
+bake3s
+ba9ket.
+bak9ett
+ba3ki
+ba8ki.
+bak6kers
+bak6ko
+bak5kr
+4bakr
+bak4re
+ba5kri
+bak3ro
+bak3sm
+bak5sp
+bak5s6ti
+bak5str
+bak7t6
+bak1v
+ba3la
+bal7ak
+ba4les
+ba4li.
+bal3j
+bal4lag
+bal4lan
+bal4led
+bal4leg
+bal4lei
+bal4lev
+bal4lig
+bal6lov
+ball5s6
+bal6læ
+ba1lo
+bal5t
+ba1lu
+ban4a
+ba4na.
+ba5nan
+ba5nar
+ban9da
+ba4nel
+ba4nes
+ban6kap
+ban4kor
+ban2k3u
+bantu5
+ba3re
+baret5t
+ba3ri
+bari6e7n
+bark5s
+bar5skr
+bar5tr
+ba5ru
+ba5sen
+ba4seru
+ba4set
+ba3si
+ba2s1k
+bas6sak
+bas4san
+bassi4
+bassis5
+bas4so
+bas4st
+bass6tr
+ba2st
+ba7s8u
+ba1ta
+2ba1tr
+bat6ti
+bau9la
+6bav
+ba5z
+2b1b
+b3ba
+b6bak
+b4b5arb
+b6base
+b3be.
+b4beb
+b4beda
+b2bef
+b4beg
+b6beh
+b2bei
+bb3eie
+bb5eig
+b2bek
+b6belo
+bbel6t3
+bbelte4
+b4bem
+b9bene.
+b2beo
+b3ber
+b4b5erf
+b4bes6
+b7beska
+b6beta
+b6beten
+b4beti
+b6beto
+b6betr
+b2bev
+b8b1h
+b3bi
+bbi9e8
+b4b5inn
+b2b1l
+bb7len
+bb5op
+bb5rek
+bbu9ra
+bb5ut.
+bb5ute
+b2by5
+bby3e
+bby1k
+b4bø
+b6bå
+2bc
+2b1d
+b2dek
+b7den
+b4dep
+1be
+be2au
+be4bo.
+bebo5er.
+bebo9k
+be4da.
+be9dar
+be3der
+bedi9e8
+be4dre
+bed5red
+bed2s1
+bedy9ra
+be1då3
+2bee
+be5ed
+be6ef
+b4ef
+befa5re
+be3g
+bega9
+be4ga.
+be4gi.
+be4gn
+be5go
+be4g5re.
+be4g5rene.
+be4gå.
+be6ha.
+beha7g
+behers7
+4behu
+behå4r
+be6i
+be5ke
+be2k3i
+bek6kel
+bekke5r
+bek4kes
+bek6l
+4beks
+be4l3ab
+bela9ga
+bel5eie
+bel5eig
+bel5ein
+be4lek
+beli9na
+beli9v
+belle5sa
+bel5let
+bel5læ
+be2l1o
+bel5s4p
+bel7s4t
+bel4tag
+bel4te5s
+bel4t3ø
+bel3u
+bel5v
+belæ5re
+belå7ne
+be4na
+be5nat
+be3ne
+4bened
+be4nest
+ben5gu
+be5ni
+ben5s4i
+ben5skj
+ben5sp
+ben5te
+2bep
+b4er
+4berai
+be7ras
+ber5d
+be4rep
+8berest
+bere5te
+ber4ga
+ber4g5ende
+ber5ges
+berg3j
+berg3l
+berg3o
+ber4g3å
+be5rib
+beri5ke
+be7ris
+ber6kl
+ber5na
+ber5ne
+be1ro
+be4ro.
+bero9a
+berri6
+ber5te
+ber5ti
+be1ru
+beru9sa
+berø5v
+b4e1s2
+5bes.
+be4se.
+be5s4i
+4besik
+6besj
+bes5ke
+bes6k5n
+be3sn
+bes7ne
+4be3so
+beso9v
+be5sp
+bes3s
+bes6s7a6
+bes6sel
+bes7si
+bes7tens
+bes6tes
+be5stes.
+be6så
+3b4et
+5bet.
+be4tab
+be3te
+4betei
+be7tes
+beto5ne
+be6trar
+be6tre.
+be4t3ri
+4betu
+be4ty.
+beva5re
+be6ve.
+bevi5se.
+be9vo
+bev9r
+6beå
+beån9
+7bé
+2b5f
+6bg
+2bh
+bhu1
+1b4i
+bi5ak
+bi6bla
+bi5ce
+bi1d
+bi5dee
+bi8dé
+bid6r
+bidu8
+bi5el
+bi6ele
+bi5erv
+4bifa
+bi5g
+bi3ka
+bik1k
+bik6ki
+bi5k4l
+4bi7kr
+bi6la.
+bi4las
+bi4lau
+bi3let
+bilet5r
+bi4lin
+bil3j
+bil5la
+billa8ga
+bil5leg
+bil5m6
+bil1o
+6bi5m
+bi4nans
+bingo5
+bin4gol
+bi7no
+4b5int
+bio7
+bi3o8m3s4
+4bip
+bi4ri5
+bi7ris.
+bir4ken
+bi1ro
+bis2a
+bi3se
+b5ish
+bis6hi
+bis7ke
+bi5s4la
+8bisn
+bi4sp
+bis4p5i
+bis5se
+bi1st
+bi5s6ta
+bis4til
+bis5tru
+bi3s4v
+bi6ta.
+bi4te.
+bi5tes
+bi8ti.
+bi4tre
+bi6tri
+bjar3
+bjek4t5o
+bjø6r
+2b1k4
+b5kh
+bl2
+1b2lad
+blad3a
+bla6f3
+bla8ga
+blak5r
+bla5me
+blan9da
+b4lank
+blan5ke
+b4lant
+b1lar
+b8larar
+b3lat
+bla4u
+b4lef
+bleie5
+blei5er
+b4lek
+ble4k3a
+ble5kes
+ble4mo
+b3ler
+ble7r6a
+b6lesa
+blesse9ne
+b4lest
+2blet
+bli9ke
+bli5ma
+bli5me
+blings6i
+blis3s
+b5lj
+blja4
+blo6dr
+1blok
+blom5m
+b6lu
+blues3
+blu9sa
+bly7gl
+blæ5re.
+blå5n
+blå3r
+blå7sa
+blå5se.
+2b1m
+6bn
+b3ne.
+b3ner
+b7nes.
+b7ni
+b2o
+boa5s4
+bobba6ne.
+bob5by.
+bob9bye
+bo2bl
+bob7la
+bobs4
+bo3de
+bo6din
+bo6d7r
+bo2dø
+4boef
+1boen
+bo2er
+bo4et.
+2bo3f6
+bo4gel
+bogn7
+bog1s
+2boh
+2boj
+3bok.
+bo2ka
+bo6kel
+bo4k3et
+bok1i
+bok1k
+bo6kop
+bo6k5ri
+5bok1s
+boksi8da
+boks4p
+bo2ku
+bok3ve
+b4ol
+bol5eie
+bo7li
+boli7n
+bo7lo.
+bo5loi
+bo4l5o4r
+bol5s4p
+bolst6
+1bomb
+bom4bel
+bom5m
+bo6mo
+bom1s4
+bo5nap
+bon5ato
+4bonn
+bon5ne
+bons4
+bo5nus
+boo6
+boom1
+bo1p4
+bo1ra
+bo4ra.
+bo6re.
+bo7rel
+bo3ren
+bo3ret
+bo4rete
+bo6ri.
+bo3ro
+bor6t7ef
+bor6tei
+bor4tes
+bor6t7et
+bor4ti
+bort5s6
+b4o1s
+bose8te.
+3boska
+bo2sl
+bos5se
+bo4sto
+1bot
+bo4ta.
+bo4tak
+bo4tal
+bo6te.
+2bo7to
+4bot6r
+4bot4v
+bou3c
+4bo1v
+bow4e
+bo6y
+4bp
+b7pl
+br8
+1b4ra
+bra5ka
+brak5s
+bra5se
+bred5sp
+brei5e
+brei3s
+bret7te
+b6rev
+brevi9er.
+bre4vin
+bri5a
+b4rio
+b2ro
+bro9ar
+bro1s4
+3b4ru
+bru5ke
+bruk4s3
+bru4na
+bru7na.
+bru5nes
+bru5pl
+bru7ren
+bru5sa
+brus4l
+1bry
+bryn4s
+b4rø
+brø5de
+bråe6
+brå9ne
+brå5te.
+6b1s
+bs4e
+b5s6e6a5m4
+b4s5el
+b5s6i
+bsk4
+b4sli
+b2sm
+b2s1of
+bs2t6
+b6st7f
+b7s6v
+bså5
+6b5t
+b7t6s
+1b2u
+bu4ar
+4bub
+bu3da
+bud5d6h
+bu3de
+4bu3em
+bu4en.
+bu9ene
+bu4er.
+bue5s
+bu1i
+bu6is
+6buki
+buk3l
+bu5la
+bu4le.
+bul3le
+bun7de
+bund4s3
+bun8ge.
+bunk3r
+bunnla8ga
+bunn3s
+2bu3o
+bu1p
+bu6ra.
+bu4re.
+4bu3ro
+bu3ru
+bus6e
+bu4se.
+bus4h5e
+busk7ø
+bus6sek
+bus4sel
+bus6sent
+bus6set
+busse6te.
+bus6sj
+bus4sn
+bus4sp
+bus4st
+buss3v
+bu1st
+4bustr
+4busy
+bu1ta
+bu4tal
+bu7tem
+b5utg
+4butst
+bu2tu
+bu1tø
+4buv
+6buø
+2b1v
+4b5w
+1by
+bya2
+by5al
+by9are
+by7dep
+by4en.
+by7ene
+by5ens
+by2er
+by3ers
+by4ge.
+byg3l
+3byi
+by1lo
+4bylø
+by5n
+by1re
+by6re.
+by1s
+5bys.
+4byse
+6bysi
+6bysp
+byst4
+by4ste
+4bysv
+by5tar
+by4te.
+by1tr
+2byv
+bæ5rar
+bæ6rar.
+bæ4re.
+bæ5ren
+bæ5rer.
+bæ5rere
+bæ5res.
+bæ5ret.
+bæ3ri
+bæ4r5is
+bæ3ru
+1b4ø
+bø4e
+bø7ens
+bøf3
+bø4kes
+bø6la.
+bø6le.
+bø2n
+bøne5
+bøn6nes
+bøn7o
+bø6re.
+bør4s5k
+bør4sp
+børs3t
+børs8ta.
+børs3v
+bø5ta
+bø1v
+bøy7ar
+bøye5
+bøy4ene
+bøy4es
+bøy4et
+1b4å
+bå4de
+bå9des
+bå6e
+bå7ene
+bå4la
+bå1re
+bå6reg
+bå4rep
+bå4s3te
+bå6s7ti
+bå6t5j
+bå6to
+båt5r
+1c4a
+cab4
+ca4e
+ca5le
+ca5me
+ca5mo
+ca4pe.
+cap1r
+ca6pris
+ca3ra
+car5n
+ca5ro
+car4te.
+ca2sa3
+ca6set
+cash5
+ca5s4til
+cas5to
+ca1t
+cath5
+ca4to.
+6cb
+4cc
+c1ci
+c2d
+cde6
+cebo9
+ce3d
+ce1i
+1cel
+ce5le
+cel4les
+cel4lev
+3cen.
+ce4ned
+ce4nee
+ce4nem
+ce4ne5s4
+ce5nes.
+ce4net
+ce4nev
+5cens
+cen4ti9m
+cen6to
+ce5o4
+1cer
+cerba6ne.
+ce3re
+ce1ro5
+cer3t
+6ceru
+cest3o
+2ch.
+cha5le
+3cham4
+cha7ne
+cha5t
+2chb
+4chei
+chel5s
+che7te
+chi4li
+4ch3h
+2chm
+4chn
+ch5ne
+chom4
+cho5s6
+2chp
+8chs
+6cht
+ch1v
+ci1c
+3cid
+ci2e
+cie8n
+cie2s5
+cil5l
+ci3ne
+ci5ta
+2c6k
+ck5ar.
+ck5art
+ck1en
+ck3er.
+ck4ere
+ck5e4t3
+ck5et.
+cke8y5
+ck1i
+ck1k
+ck1o2
+ck7r
+ck5s2
+cku6
+ckup3
+ck9ut
+c2l
+clai4r5
+cly4
+c1m
+cmini4
+coa6
+coat5
+co6bid
+1co4c
+2cod
+6cof
+6cog
+co4la.
+co4lab
+co4lak
+co4la5r
+co2m
+co5ma
+com5t
+co6n5os
+con5s
+con7t
+co2o
+co7pa
+2cor
+co3r6a
+co1re
+co4so
+4cost
+co4ver
+c1pr
+cr8
+cras4h
+crack4
+cre2e
+creen7
+cros2
+5cru
+4c4s
+4c1t
+c6ta
+cty5
+1cu
+4cu.
+cu5la
+cu5le
+cu5lu
+cup1l
+cu6po
+cup1r
+cup7s
+cu4på
+2cur
+cures4
+cu6t
+cy2a
+cy6p7
+cys3
+c6z
+cæ5
+1da
+4daa
+4daber
+8dabo
+d5abs
+6d5adel
+d4adg
+dadø4
+dadør5
+4daef
+2daf
+5dagb
+da4gev
+4dagj
+dag7l
+da6go.
+da4g1r
+da6gun
+4dagå
+4dahe
+5dahl
+da1i
+2daka
+4dako
+4dakr
+dak4se.
+4daktig
+da5kv
+7d6al5j
+da1la
+da8la.
+da4las
+6dalau
+dalbu8er
+4d5ald
+da4les
+dal6so
+da1lu
+da4ma.
+da4man
+da3mas
+da4me.
+da3men
+6d5ameri
+dame3s
+dame5t6
+da3mo
+dam7pe
+5dan.
+6danal
+d8ane
+9dani
+2d1anl
+3dann
+dan5neb
+4danno
+7dano
+d4ans.
+dan3sa
+dan4sel
+dan9s8kan
+4dansv
+9dant.
+9danti
+8dany
+2da3o
+2dap
+da3pe
+d3app
+3dar.
+5dara
+2darb
+dard3s4
+4darea
+da4res
+d5arn
+da2ro
+dar5os.
+dar5s6
+dar4ta.
+dar6va.
+dar8ve.
+4dasei
+2dash
+6dasi
+4dasjef
+da4sk
+da9sko
+6dastr
+6dasu
+data5
+4da4tal
+data6le.
+datali8na
+da4tek
+7d6ato
+da3toa
+4da5tr
+dats6j
+d6aud
+daud7s8
+dau5go
+2daut
+2dav
+d5avb
+d1avl
+d3av5s
+4daø
+2d1b2
+dba8le.
+dba4ne.
+dbe8ta.
+dbe6te.
+dbling7
+dbo6en.
+d6byf
+4d1c
+6d1d
+d2dad
+ddag4
+d4dak
+d4d5arm
+dd3eie
+d2dek
+dde4lap
+dde4l5o
+ddel5sv
+d4demi
+dder5s
+d4desu
+ddie8
+d7dom
+d4d1re
+dd5run
+ddsa4
+dd4sala
+dd4skap
+dds5tab
+dd3s4te
+dds5tr
+d2dyb
+ddø2
+ddør3
+d4d5øy
+dd1år
+1de
+2dea
+deak3
+de2al
+de7b
+6debar
+4debas
+3debat
+2debe
+4debl
+2debo
+5debon.
+2debr
+3debut
+2deby
+4debø
+de1c
+5ded.
+2deda
+6d7edd
+7dede.
+4dedek
+4dedel
+4dedia
+2ded4r
+2dedy
+2dee
+5dee.
+de7er
+2def
+d5eff
+d5eft
+2deg
+6d6e5ge
+5degg
+de3gl
+2deh
+5dehavs
+2dei
+dei4d
+dei4ene
+3deig.
+dei8ge.
+5deigen
+dei4g5r
+5deik
+d2e1in
+3deir
+de5is.
+de3ist
+7de7it
+2dej
+8deka
+2deke
+2deki
+2dekj
+5dekk
+dekk3a
+dek4kan
+dek4kel
+de6k6kv
+dek2l
+6dekly
+5dekni
+de5ko
+4dekod
+4dekon
+4dekos
+2de5k6r
+dek6st
+deks7ti
+deks6tr
+5dekt
+2deku
+4dekv
+4dekø
+4dekå
+d4el.
+6delad
+6delage
+de6lans
+4delau
+4deled
+de4lef
+4delei
+del5ei4d
+del5eie
+4de4lek
+de5lele
+4d5elem
+de4lest
+6d3e4lev
+4delid
+6delinj
+del5int
+4delis
+4deliv
+del4lap
+del6lei
+del4lek
+del6lerf
+del6lig
+d4els
+del4s5at
+del3se
+delses7
+del4si
+del4spo
+d4elt
+del6tala
+del3te
+del7tr
+6deluk
+del5ve
+4dely
+4delæ
+2delø
+delø6pa.
+6deløy
+2delå
+2de5ma
+d3emb
+2deme
+demie4
+4demj
+dem8na.
+de4mo.
+de4mog
+5demok
+4demol
+demo5no
+5demos
+dem5pe
+3demr
+5dems
+4demu
+2demø
+2demå
+d2en.
+4dena
+de7nak
+6d5en6den.
+de5neb
+4dened
+6denel
+4denem
+4denet
+4denev
+6d5engen.
+4deni
+4deno
+de4nom
+d2ens
+den4sin
+den4s3t8
+den6t5ant
+4dentif
+4dentit
+dent3o
+den4tr
+dent5s8
+den6t5u6
+den6tå
+4denu
+2denæ
+2denø
+de2ob
+de4og
+2deol
+4deopp
+4de3or
+de4ove
+4depak
+4depap
+2depe
+4depi
+4depl
+6depu
+d2er
+der8am
+de6rant
+de4rare
+de4rark
+5de7rast
+dera5te
+der3av
+der5d
+4derea
+4dered
+de4r5edd
+de4ref
+4dereg
+4derep
+6deresi
+der5est
+8derest.
+6dereste
+4derett
+de4rif
+de4ril
+5derin
+de4rinæ
+der5k
+der5ne
+de5rob
+4derog
+4deros
+de5rose
+dero8se.
+6de7rot
+dero4v
+der5s6n
+der4sp
+der3t
+der5un
+de5rup
+6derus
+der3v
+4derør
+2derå
+de1s
+3d6es.
+2desa
+4desc
+2dese
+de5seg
+des5ers
+4desho
+de8s9hop
+desi4s5t
+2desj
+2desk
+9desk.
+5deske
+4des4le
+2deso
+2desp
+7despl
+6de5s6pr
+d4es2t
+5dest.
+5deste.
+des6tem
+de5sti
+4destj
+4desto
+4destrå
+4destu
+6desty
+de4s3tå
+6desup
+des6v
+2desy
+deså7
+d2et.
+2deta
+deta8ka.
+de3te
+4detea
+6deteg
+6detekk
+4detel
+4deten
+4detep
+detes7
+2deti
+2detj
+4deto
+4det6r
+2detu
+4dety
+4detø
+6detå
+2deu
+d1eur
+5deus
+2dev
+deva8ne.
+devi9er.
+3devik
+d7ev8n
+de5vu
+2dey
+4deø
+2deå
+2d1f
+dfø6rarar
+2d1g4
+d4gel
+d5gi
+dgi6n
+dgjø6re7n6h
+d3go
+2d1h
+dhav4s
+dheim2s5
+dhu9ga
+dhø4r
+1di
+di6ak
+di5alg
+dia5li
+di1ar
+dia3re
+dia1s
+dia7sp
+dias6t
+diats4
+2diav
+2dib
+did5ri
+di7ell
+di5en.
+4di5end
+di1er
+dies4
+3diff
+diffe5
+3diful
+4difø
+di8g9and
+di4gat
+di3ge4s5
+dig7g
+2digj
+dig8la.
+dig6le.
+4digren
+dig5ret
+4digru
+di2gu
+4dih
+4dii
+2dij
+di5ka
+di8ka.
+di5kem
+2dikj
+6dikn
+2diko
+2di1kr
+dik7v
+2dili
+dil4les
+di5ma
+6dimed
+6d5i6mel
+4dimes
+4dimet
+2dimo
+4d5imp
+4dimå
+di5na
+2d1ind
+di7nen
+4d5ingk
+din3gr
+ding8s5en
+ding6s5er
+din8g9å
+dini4
+di4ni.
+4d1inn
+2dino
+2dinv
+4dinø
+3diog
+7diol
+dio3na
+dio4no
+di3ori
+dio5tr
+2dip
+3dipl
+4dired
+4direg
+4d5irs
+5dis.
+di6sc
+di6sed
+dis4i
+disie5ne
+d6isk
+dis6kam
+di4skj
+dis6k7l
+di4sk6o
+dis5ko.
+dis7koe
+dis7ku
+dis5s
+dis1t
+dis7tik
+di5sv
+dis4vi
+2disy
+di4tal
+di7te
+4ditek
+dit4tet
+ditt3r
+di9us.
+di4va.
+4dival
+di7van
+4divek
+div6i
+2divu
+2diøk
+d1ja
+d1je.
+d1jen
+djer5ve
+d7jes.
+dje9ve
+d6jingan
+d6jingar
+d1jo
+dju8la.
+5djup
+6djupar
+d4jø.
+2d5k2
+dka8ra.
+dki6
+d5kj
+dko2r
+dku4le.
+4d1l4
+d3la
+dla4ga
+dland7as
+dla6te.
+dla4v
+d4ledi
+d2lef
+d4lega
+d7legar
+dle3ge
+dlei7er.
+d5leka
+d2lel
+dlem4st
+d4lenet
+d4leru
+dleva8ne.
+d5li
+dli4f
+dli5ke
+d5lo
+dly8se.
+dlø8pa.
+d5lå
+dlå9re
+2d1m
+dme6la.
+dmo4e
+dmors6
+dmo8s
+dmø4re.
+dmå6la.
+8d1n
+dn6a
+dno8de.
+1do
+2doav
+do2b3
+4doba
+do3be
+8do9b8lan
+2dobå
+do4da
+dodø4
+dodør5
+4doeu
+2dof
+d3off
+d5ofr
+dog6med
+dog4me5s
+2dogr
+6do5i
+do3ki
+4dokine
+dok6kan
+4dokn
+do5le
+4doled
+doli8ne.
+4dolinj
+6dolis
+4dolj
+dol5l4
+4domes
+do5mis
+4doml
+do4mo
+dom7p
+2domr
+dom8sa
+dom8s5e6
+dom6s5i
+dom4s3k
+doms3l
+domsla6ga
+dom4so
+do4mu
+do4na.
+don5g
+4donke
+6d7on6kl
+don5st
+don5t4
+2dop
+do4pa.
+do4pe.
+3dopi
+d6o1ra
+do5ran
+2d1ord
+dor4da
+do1re
+dor6gest
+d5orie
+dorm8
+do3ro
+5dorp
+3dorr
+dors6
+dors7ke
+do1ru
+do7rye
+5dos.
+do4se.
+do4set
+do1sk
+6do7s6l
+2doso
+4dosp
+2dost
+do3str
+4dotr
+2dov
+do5va
+do5ven
+do4ver
+dov9n
+4doø
+2d7p8
+5dq
+dr4
+d1ra.
+d5raa
+d9rad.
+d5rade
+1d6rag
+dra5gen
+dra6kes
+3drakt
+1dram
+5d6rang
+3drap.
+5drapa
+3drape
+d3rapp
+d1rar
+d6rarar
+d3rarb
+dra6ret
+d5rarm
+d5rarr
+d9ra8sa
+9dratt
+drau7ma
+2dre.
+5dreass
+2dred
+d5rede.
+d5reder
+dre7d6r
+d5reds
+9dreg.
+9drege.
+d3regj
+3dreie
+drei5en
+drei5er.
+drei7ern
+d5rej
+d6reka
+d7rekk
+3drekt
+4drel
+d7relig
+4drem
+d1ren
+4drer
+d3ret.
+d3retn
+d6retr
+d3rets
+drett4
+dretts5
+5drevet
+3drevn
+4dria
+3d2rif
+2d1rig
+d2rik
+d3rik.
+dri8ka.
+d3rike
+3drikk
+drik7s6
+d9rikt
+5d4ril
+2d1rin
+dring6
+drit7tr
+drit5u
+dritun8ge.
+1d2riv
+3dronn
+dro6pa.
+drop5s
+2d1ror
+3d4ros
+dro8ta.
+2d1rov
+dro5va
+dro3ve
+2dru
+3druk
+d1rul
+d1rum
+d3rup
+6d5rut
+2dryk
+drykk4
+d2rys
+d4røm
+drø6re.
+d7røt
+drø3ve
+d1råd
+drå4de.
+3dråp
+8ds
+d5sa.
+d3sabl
+ds1ad
+ds3a6del
+d1sag
+dsa9ga
+dsak6se.
+d1sal
+dsa8la.
+d4s3alf
+d6sall
+d9same
+ds1a6n
+ds5ane
+ds1a2r
+d2sas
+d4satf
+dsbø6n
+d5se.
+dse4d
+ds1ef
+d2s1ei
+ds7eks
+ds3ela
+dsel4s5a
+dse2m
+ds3emi
+d6s7enda
+dsen8de.
+d4s3eng
+d5sens
+ds3e2p
+d7ser.
+d6serf
+ds5erk
+d4s5e4sk
+ds5e4st
+ds3eta
+dse4te.
+d5setj
+ds1ev
+d2s1i
+d3s2id
+d7sida
+ds5ident
+ds3idr
+d7sil
+ds5ind
+d3sir
+ds3i4s
+dsi4ve
+d4s3jen
+d2sjo
+ds7jor
+ds6ju
+ds5kab
+d4s3kan
+ds3kar
+d4skat
+d1skj
+ds5kjen
+d6s5kjøt
+ds1ko
+d5skot
+ds3kro
+ds1kv
+ds1l
+ds5la.
+ds5lan
+ds6lem
+dsli6k
+ds6lo.
+d9slott.
+ds4luk
+ds3ma
+d6smo
+dsmå6la
+ds3ne
+ds5no
+ds1o2
+d7somst
+d4s5os
+d7sot
+ds1p
+d3spek
+d3spel
+ds2pi
+d9s8py
+ds5s4
+dst4
+ds3tak
+d4s3tal
+d3s8tar
+d5s4tat
+ds6tau
+dss8t
+d8s9te.
+ds9teik
+dste6ma.
+d6s5temp
+ds5teo
+d3s4tig
+d3s4tik
+d5stilli
+ds1tj
+d3stor
+d3stri
+dstu8na
+d5stund
+ds3tv
+dsty8e
+ds3tyv
+ds1u2
+dsure6
+d5s6us
+d6s7usk
+ds1v
+dsva8ne.
+d3s4vet
+dsvi6ka.
+d5syk
+d3syn
+dsy6na
+ds1yt
+d2s1ø
+d6sør
+ds1å6
+4d1t
+d3t4a
+dta6la.
+dta4le.
+dta4s
+d3tem
+dte4ma.
+dt4eng
+dterle7
+dte4se.
+d5t4et
+d3ti
+dt6j
+d7to
+d5t4rag
+d6troc
+d5t4rø
+d6t1s2
+d3t2va
+dtø8
+dt6øk
+dtørs3
+dtå4
+1du
+dub5b
+dub5l
+du1c
+du9ene
+du9ens
+due5s
+4dufo
+3dug
+4dugu
+duit6
+du6ka.
+dul5l
+4duly
+dums2
+du4na.
+dun7de
+4d5uni
+dun5s6
+dun7sta
+7duo
+d3upk
+3dur
+du6ra.
+du6re.
+du6rei
+dur8ta
+du1s
+du5s4a
+du9sem
+du5s2i
+du2sk
+du2sl
+du2sp
+duss4
+dust4
+du2sv
+2d1ut
+du6va.
+du4ve.
+2d1v
+dva6la.
+dva6lel
+dva4ne.
+dve6s
+dve6va
+dve8ve.
+d7vo
+dvo8r
+2d1w
+1dy
+dy9a
+2dyba
+2dyf
+dy5ke.
+4dykl
+4dykø
+2dyl
+dy4na.
+dy4ne.
+4dynk
+dynk6s5
+dy3pes
+dy2p3r
+dy4ra.
+dy5reba
+dyrle8ge.
+dyr5s4
+dy2r5u
+dyr5ø
+7dys.
+dy8sa
+4dyse
+dy6se.
+dys7s
+dyst7r
+dy2t
+d5z
+8dz.
+1dæ
+dærs4
+1dø
+4dø.
+død2s1
+dø3gr
+2døk
+d5økn
+dø4ma
+dø4pe.
+dø4pen
+d2ør
+dør3i
+2døs
+d6øs.
+dø2st3
+døt3
+dø9va
+dø3vel
+dø1vi
+6døvl
+døv8le.
+2døy.
+døya8
+døy8g
+4d9øys
+1dåd
+dåd6s5
+då8na.
+1dåp
+då8ra.
+då5ri
+d3ås.
+då8sa.
+då7sem
+d7åt.
+2ea
+e1a2b
+e1ad
+ea2d1i
+eadli5
+e1af
+ea2gu
+e1a2k
+e4akr
+6eakt
+eak6se.
+e1al.
+e5alle
+eal8le.
+ea4lov
+e3alte
+ea2lø
+ea4m1
+e3aman
+e5amn
+e1an
+e2an.
+ea4ne.
+e6a5net
+e4ani
+ean7n
+ea4nor
+e6ans.
+ean3sl
+e1ap
+ea4pe
+e1ar
+ea2re
+ea5rer
+ea5ret
+ea5r4i
+ear6ka.
+ear8ma.
+ear4ta.
+ea2s1i
+e3asp
+e1ass
+ea7ta
+e5a4tel
+eate6ren
+ea4t3et
+eat8h
+eat6le
+e8ato
+ea5tri
+e1att
+e1au
+eau6ga
+eau6ge.
+eau8ra.
+eau6re
+eau5s
+eau8sa
+eau8se.
+e1av
+eav8la
+eav8le.
+2e1b2
+eba3d
+eba4ne.
+eb3be
+eb4be.
+ebe4d3e6
+ebei7er.
+eben6s5k
+ebers6
+ebesku5
+ebet5s
+eb3h
+e5b6lo
+eblæ5
+ebob3
+ebo4da
+ebo5ers.
+ebo6kr
+ebo6la
+eb5s
+ebu4e5re
+ebu5ern
+ebu6et
+eby4ta
+ebø6n
+2ec
+e4ca
+ec4c
+e1ce
+e5cha
+e3com
+e2dad
+ed5ad.
+e5d4ag
+edag4s5
+e2dar
+ed3ark
+ed3arv
+ed7dela
+ed4dyr
+e3de.
+ed5e6ge
+ed5eg4n
+ed3eie
+e4deks
+ede8le.
+e4denf
+e8d5eng
+eden5t
+e6depr
+ede4ra
+e4derø
+e4desk
+ede4sl
+ede4sm
+e4desn
+ede4s5p
+ede4ta
+e6d5ett
+e8dé
+e5d6ia
+edi6a5ne
+edi4ene
+edi6gj
+ed4is
+edi3si
+edi4s5k
+e7div
+edle6ge.
+ed8ob
+edok8se.
+e4dol
+ed1op
+ed1ov
+e1dr
+ed2ra
+ed3reg
+e5drev.
+ed3rom
+e6d5ryg
+ed7ski
+ed3skr
+ed3s4la
+ed2sm
+ed5ta
+ed3te
+edt6r
+edu8a
+ed7va
+edvi6s
+e3dyk
+ed5ynk
+edyr6ke.
+edæ4
+e3d6ø1r
+e3e2
+eea7
+ee3b
+e2ed
+ee3di
+eeg4ga
+eeg6n
+ee5gå
+eei4d
+eei7ni
+eek1e
+eek4te
+ee3la
+e5e4li
+eem6na
+ee4n
+e5enb
+een3in
+een6k
+een5t
+e3epl
+ee8ra
+eer3en
+ee3ri
+e4er3l
+eer4me.
+e6e5sh
+ees8ka
+ees6ke.
+e3e6t
+eev4ne.
+e1f
+4efa
+efal6s7
+e4fana
+ef3ank
+e4fark
+efar6s5
+ef7ea
+ef5ef
+ef3fe
+3effek
+ef3fo
+4efi
+e4f3id
+e5fig
+e5f4ilm
+efi7ren
+efisken8
+4e3fj
+2efl
+efle6ge.
+eflå3
+e2fn
+efo8bi.
+efo4no
+8efr
+ef2sj
+ef2sk
+ef2sp
+ef6str
+e8ft
+ef2ta
+efta5r
+eft5ei
+ef5ter
+eftle8ge.
+eft1s4
+6efu
+efyrs5
+e3fæ
+4efø
+efø5le
+eføy9
+2ega
+e3gaf
+e6gala
+e7gam
+ega4ve.
+egde8l
+eg7des
+e5gedo
+egei9e
+ege4let
+e2gem
+e3geme
+egen5s
+3e4gensk
+e7geom
+e2ges2
+ege5sp
+eg9gen
+egg3l
+eg8g9ut
+egi3an
+egie2
+e4giko
+egis4p
+e3g6lad
+e3g4led
+eg7lesa
+e5g4lit
+eg7ly
+e5g6lø
+6egm
+e9g8nag
+eg4nem
+eg6no
+e7gnå
+4ego
+e4go.
+7egoi
+eg2r
+egrans5
+e7g8rø
+egs4am
+egs4ki
+egs4ta
+e1gø
+egøy6e5ne
+4egå
+egå4va
+egå4ve.
+e1h
+ehea4
+ehei9e
+eh5er.
+e4h5ere
+eh7ern
+eher4s
+ehog5
+ehov2
+ehy6re.
+ehø8va
+e6hå.
+2e8ia
+e9iakt
+ei9a4n
+ei7ar.
+ei4c
+e8id.
+ei3d8ar
+e3idea
+e3ideo
+ei9der
+ei5det
+5eidf
+5eidg
+e6i2do
+e1idr
+ei3d4u
+ei7e
+eie5d
+ei8eg
+eie2n
+ei9en.
+eier3a
+ei4ert
+ei6es
+ei1fl
+8eig.
+ei3ga
+eig6e
+ei6gev
+ei5gi
+ei6gra
+ei6gu
+4eii
+ei5kaa
+ei3ke.
+ei6kee
+ei6keh
+ei4kel
+ei6keri
+ei4ket
+ei1kr
+eiks3a
+eik6se
+eik4so
+4eil
+ei9led
+eil5egg
+e3illu
+ei3lo.
+ei9loa
+eil5op
+ei5los
+eil5s6
+4eim
+ei7ma.
+e5imag
+ei4m5a6l
+ei4med
+ei6mei
+ei7men
+ei4me5s
+ei4met
+eim9ett
+ei6mo
+8e1imp
+ei4n3al
+ei4nans
+ein5ant
+ei7nare
+ein1d
+4e3indu
+ei5ned
+ei7nel
+ein9f
+einga6
+ein3gr
+e4ini
+6ei6nit
+ein3k4
+e5inkar
+4e1inn
+ei4nom
+ei4nov
+einsi9d
+ein4s3l
+eins6o
+e4inspi
+ein7sto
+ei2n1u4
+ei3num
+6einv
+ei2n3ø
+ei5or
+e4ip
+ei9pa
+ei3pe
+eip5s
+2eir
+eir9ak
+ei7ren
+ei3ri
+eir5s
+2eis
+ei5sar
+e4ise
+ei3se.
+eise5i
+ei3sen
+eiseri9e8
+ei3s4ha
+ei4sil
+e3isk.
+e3iske
+ei6s3kj
+eis3ko
+ei3s4pe
+ei4spi
+ei4tek
+ei4tera
+ei4tere
+ei2to
+eit7ta
+ei6t7ut
+ei3tve
+ei6t7ø
+ei4vak
+eiva9r
+ei9ven
+ei3vi
+eiv5s4
+e1j
+ejo8en.
+eju6la
+4e1ka
+ekali7
+ekalie6
+ekam6s5
+eka6ra.
+e5kavr
+ek3eie
+e4kero
+e4kes
+ek5e4ta
+e6key
+e5k6hov
+e1ki
+e4ki.
+4e1kj
+2ekk
+ekke7le
+ekk9ist
+ek1kj
+ek4kjø
+ekk3l
+ek5kok
+ekko5v
+ek6ku
+ek4ky
+e1kl
+e8klane
+ek6leg
+e6klen
+ek5let
+e3klu
+e5klæ
+ek2lø
+4ekn
+ek9na.
+e3knek
+ekne7s
+ekni7p
+ek3no
+e3k4nok
+e1knu
+e5knø
+e1k2o
+e4ko.
+eko7le
+ekords8
+eko6te.
+e4kov
+2e1kr
+e3k2ra
+e3k4red
+e7kref
+e3kren
+e4k5ret.
+e5krets
+e5k4rev
+e3k2ri
+e3kro
+ek4ry
+e3k4rå
+ek5råd
+ek3s4ak
+ek4sal
+3eksam
+ek3sel
+3eksem
+ek4sig
+eks1k
+ek4ska
+1eksp
+eks5pe
+ek4sta
+ek7s6tel
+ek3sti
+ek4stil
+ekst5o
+ekst3å
+ek4sæ
+ek6t7arm
+ekt3av
+ek3tef
+5ek3tep
+ek5tes
+ek6test
+ek4tid
+ekti5m
+ek5tiv
+4ekto
+ektori6a
+ek4t3ra
+e1ku
+eku4le.
+e1k2v
+ek4val
+ek6var.
+6ekve
+e4k5ve4d
+e4k5vik
+ek4vin
+ek6vis
+3ekviv
+6e5kw
+e5ky
+eky6te.
+e3kæ
+e1kø
+e1kå
+ekå6pa
+2e1la
+ela4ga
+el3agg
+e2l1ak
+e5lake
+elak8se.
+el7akt
+el1al
+e8lame
+el3anl
+e6l5arg
+e4larr
+el7arti
+e5las.
+e5lase
+ela4te.
+el5ato
+el5avl
+el3avs
+elbo8da
+el4ch
+el5do
+eld4rer
+eld5sle
+4eled
+e4ledi
+e4ledr
+e3lee
+eleg5d
+ele7ger
+eleg8na
+e7leir
+e7leis
+e5leke
+e2lel
+e2lem
+e5lem.
+e5lemat
+5elemen
+e5lemet
+e3lemm
+e3lemp
+4elen
+ele9na
+e4l5enh
+elens3
+e4lentu
+e5lepa
+2e3ler
+ele8ra.
+e7leret
+e6l7erg
+ele3sk
+e6lesku
+e4leta
+e4lete
+5e8lev.
+ele4vak
+6e5levn
+el5fi
+el9ga.
+el5gele
+el5gi
+elg3s8
+2eli
+e9lie
+eli5e6rer
+e4lif
+e4li5g4r
+e4l3ind
+elin5es
+e4linsp
+eli6o5s
+eli8ta.
+eli4tet
+6e5litt
+eli6v7en
+el1j
+elk2
+el6k5al
+el4ke5s
+el4kete
+el3kn
+el5la.
+el5l6ar
+el4led
+el4leg
+ell5eie
+el5ler
+el3le4s
+el6lete
+elli7ga.
+el4lisj
+ell7sa
+ell5sk
+ell5s4l
+ell5sp
+ell5sv
+el5l4ur
+el4læ
+el5m4o
+el5mu
+el5n
+2e1lo
+elo6ka.
+e2lom
+e3lomm
+el3omn
+el3oms
+el1op
+e2l1or
+e3lort
+el3ost
+el4ot
+elo7vers.
+e4l5ovn
+el4pet
+el5ph
+elro4s
+el4sei
+els5eie
+el3sen
+el3se6s3
+el3si
+el4sje
+el4skal
+7elskand
+els5kare
+els1l
+el6sno
+el4spe
+el3spr
+els4ten
+el4sti
+el4stj
+el2sø
+els5øk
+el5s6åpe
+elta8le.
+el5te.
+el6teg
+el4tero
+el4t5ett
+el4t3op
+el4tro
+elt5rop
+el2tu
+e3lua
+e1lu2e
+e4lu4he
+e3luk
+e7lum
+el3ung
+elun6ge.
+e7lup
+elu8pe.
+e1lur
+e7lus
+el3utr
+elv3an
+el4ve3d
+el4vei
+el6vere
+elv1r
+5elvs.
+elvæ6re.
+4e1ly
+ely8et.
+el5ynd
+2elæ
+elæ5res
+el9ærv
+e6l5æt
+2elø
+e4l3ø4r
+el3øy.
+el5øya
+el5øyd
+e6l3øyn
+2e1lå
+el1år
+e5låt
+4em.
+e2mad
+emafo5
+ema4ge.
+e4magr
+e2mah
+ema4ke.
+e4mako
+em5akti
+e4maku
+ema6le.
+5e4malj
+e4mam
+e4mana
+ema4ni.
+e6manu
+e4mare
+em7ar8m
+e4masi
+e6masku
+e4mata
+ema3uk
+ema5ve
+5emball
+3embed
+embe6r5
+3embet
+6emd
+8eme
+emei9e
+eme4li
+e4mend
+eme5tri
+eme6trisk
+em5e4v
+e4mib
+emi5ert
+e4mig
+4emin
+emi5ni
+emini6st
+e4minor
+e6mir
+emi9sa
+em7je
+e5mju
+em5le
+emle6s
+em5me.
+em5men
+em8mi.
+8emnd
+em4ne.
+em4ned
+em4nem
+6emni
+emo5nol
+em1op
+e2m3o4v
+em4ped
+em6peri
+em2p3l
+emp9lane.
+em6pli
+empo3
+em4pol
+em4pos
+em4ses
+emse8te.
+em4s5ju
+em4s1l
+em2sn
+em4sor
+em1st8
+ems4te
+ems3u
+emta8la
+em4til
+e3mug
+e2muk
+e5my
+emy4k
+6emø
+emø8r
+e5møy
+emå4la
+emå9lan
+emål4s
+em1å8r
+2ena
+en1ak
+en3ald
+ena5li
+en3all
+en5and
+e5nane
+e6n7ang
+e4n3ant
+e5nar.
+en8are
+e4narr
+en3ass
+enat6s5p
+ena2v
+en3avi
+4enb
+enbe9na
+en4d5and
+en4dek
+en3del
+endelø7se
+en5demi
+en3der
+en4desl
+end5l
+1endr
+en4d3ro
+end3st
+en7dø
+endø4r
+endør5e
+en5egg
+eneg8ga
+en3eie
+en5eks
+e3nekt
+4enem
+2enen
+en5eng
+3energ
+e4nesk
+4enev
+ene7ven
+eng6a
+en7gar
+en4gem
+en4geri
+enge6r5u
+en4gle
+eng4les
+eng4r
+eng3s4e
+eng5so
+eng5sp
+engs4ti
+en4gut
+en4g5å
+4enhj
+e4ni.
+e4nierk
+e2nif
+e5nir
+en4kera
+en4keri
+2enna
+en9nal
+2enne
+en4nem
+ennes6t
+enne4s5v
+enn2i
+enn2o
+enn4sj
+enn5sta
+enn7ø
+2eno
+en3ok
+en3og
+en3om.
+en1op
+e6n5ord
+2enp
+en4pås
+en4rem
+en5sab
+ens5af
+en6s7a6ker
+en4sek
+en4seli
+5ensemb
+en4ses4
+ense3u
+en3si
+ensi8de.
+ensi5ert
+en4sim
+ensle7g
+ens6lev
+en7s6opt
+en1st
+en6s7tal
+ens4ter
+ens4ti
+ens7und
+ens4ve
+ensvi6
+en2sø
+ens3øk
+ens7å
+en5ta.
+en4tap
+en5te.
+en4tec
+en4teg
+en4tel
+en3ti
+en5tie
+en5tig
+en5tik
+en9tima
+en7timen
+en4to4r
+ent5ori
+ent5rab
+en4tre
+ent5ren
+en4t5rol
+entropi5
+en4t3rå
+en6tul
+entun6ge.
+3entus
+2enu
+e2n7ul
+e4n5ur
+2en3v
+4enw
+e4ny.
+e2nyb
+e6nyr
+e2nys
+e4nyta
+4e7næ
+enæ8m
+enø4k
+e2n3øv
+en5øyd
+4enå
+en1ås
+en6ås.
+e3o6
+eo3a
+e6obe
+eo2bl
+eo5d
+eod8de.
+e1og1
+eo7gr
+e2o1i
+e2ok
+e3oks
+e2ol
+e4o7lo
+eom1s4
+eon8de.
+eo5ne
+e7onk
+eon4kl
+e3ont
+eo2p
+eo3pa
+eo5pl
+eopo3
+eopp5r
+eo3pr
+eor4da
+eo9re
+e2ori
+eo4rid
+eori5e6
+eo4rik
+eo4ris
+eo1ro
+eo1s
+eos6l
+e2o1u
+2e1p
+epa3t
+e6peno
+epe6p
+eper5r
+e3pes
+epe4st
+e4peta
+e6peu
+3epid
+epi6ka.
+epi7kr
+3episo
+ep2l
+e8plen
+ep5lene
+ep5ler
+eple9s6
+3eplet
+epo6et
+3epoke
+epp2s
+ep6sem
+ep4ses4
+ep6s5lu
+eps1t
+ep2su
+e3p2sy
+ep6tin
+ept6r
+2e1ra
+e4r3abb
+era8da.
+e4rael
+e2raf
+er3aft
+e4ra4g
+e2r1ak
+e3rake
+era5kl
+eral3u
+e4rama
+era6na.
+e5rande.
+e5ra7ne
+er7anli
+era4no
+er5ape.
+er5aper
+er5a4pin
+er3apo
+er5appe
+e5rar.
+e4rarg
+e5rasane
+e5rasar
+e4rasje
+e4rask
+e6raso
+e4r3ass
+er6ast
+e4ratek
+era7tor
+e4ratr
+er5att
+e2rau
+er5auk
+erau9ken
+erau8s
+er3av.
+er3avh
+er5avl
+e3ravn
+er3avr
+er3avs
+4erb
+erbi9ti
+erbo8da
+erbo8de.
+er8byl
+erd2e
+er4ded
+erden8s
+er4dis
+er1dr
+erd4ra
+erd8re
+erd4skj
+erds3t
+erd4sto
+erdsto8ga
+er3d4v
+e1re
+er3eff
+er3eft
+er5e4gen
+er3eid
+er3eie
+ere6ka
+ere6ke.
+e4r3eks
+e6r5ekte
+e4r3e4le
+ere4lit
+e6relli
+e4r3els
+e9rem.
+e5remm
+er3emn
+er5enden
+e4r3eng
+e4r5enh
+e3re4o7
+er8er.
+e4r3erf
+e5reri
+er3ess
+ere4t
+e5ret.
+e4r3eta
+eret6h
+ere5to
+e7rets
+6erett
+eretts5
+e4r3e4va
+e4r5e4ve
+e4r3evn
+erev6ne.
+e8ré
+5erfari
+6erfi
+4erfr
+2erg
+erg5elv
+ergi3f
+er6gli
+er4go.
+erg5ret
+erg5sko
+erg5sp
+2erh
+erhø6re.
+e1ri
+e4riad
+e4riak
+erib3b
+eri3bl
+e4rice
+e2rid
+e5rid.
+e5ridn
+eri4kat
+e6rikn
+4eril
+e7ri6ma.
+er3ind
+e3ring
+6eringar
+ering6si
+er3inn
+er3ins
+er3int
+e5riori
+e5ris.
+e4risa
+eri3se
+e4riso
+e6risp
+e5rist.
+e7rista
+e5riste
+eri5stil
+e4ri5s6to
+eri5sø
+e4rite
+e4rito
+er7ivo
+er7jes.
+4erka
+8erke
+erkeri6e
+er4kesa
+er4kese
+er4kete
+er6k5ett
+3erklæ
+6erkn
+4er5k4o
+4erkr
+erland7as
+erle6ge.
+erle7s8t
+er3me
+ermo8de.
+erm1s
+ermå6la.
+2ern
+er4nad
+er4ned
+er5nede
+er6nee
+er4nero
+er4nest
+er2no
+er3nob
+2ero
+e3roa
+er3obl
+5ero4b7r
+e1roe
+er3off
+e1rog
+er5oks
+e1rol
+er3oly
+e1rom
+er5omk
+ero5mo
+e1ron
+er5ond
+erono5
+er1op
+e5rop.
+e7ro6pa
+e5ropen
+er1o2r
+e5ror.
+e3rore
+e7ro4sa
+3erosj
+er3osl
+ero4ta
+er1ov
+2erp
+2err
+er3ra
+er4rae
+er4rel
+errie9n
+6ersa
+ersa8ka
+ers6al
+er3sep
+6ersj
+er1sk
+er3ska
+ers4ka.
+er8skaran
+er9s6karar
+ers5kor
+er1sl
+ers4la
+ers6led
+ers4mi
+er5sne
+6ersp
+ers5tens
+ers5ter
+er7stev
+er1su
+4ersv
+er4sva
+ers4ve
+er1så
+er4s5år
+2erta
+er4tare
+er4te3s4
+er5tia
+er3tib
+erti4e
+er5til
+erti4mo
+er4top
+ert5rol
+4erts
+ert3sa
+erty6e
+ertå7ren
+2eru
+e1rua
+e5rud3
+e1rui
+er1u2k
+e3rum
+e4r3ung
+er3uni
+e3rup.
+er1u8r
+erure8
+e1rus
+er5ut.
+e5ruta
+e3rute
+er5utn
+er9uto
+e4ruts
+er7u6v
+ervele8
+6ervi
+ervs3
+ervæ6re.
+e1ry4
+e2r3ya
+erye7ne
+er1yr
+erys3
+e1ræ
+e9r4ære
+2e1rø
+er5økn
+e4røko
+er1ø4l
+e4r5øn
+e5r6ønn
+erø8ra
+e6r5ør6s
+er3øya
+e4r5øy7e
+erøy4n
+e4r5øys.
+er7øysk
+2e1rå
+e9rå.
+erå4da
+erå8de.
+erå6e
+erå4k
+er5åke
+er3å4l
+e2r1ån
+er3å4p
+er3å4se
+erå6t
+er7åta9
+e6råv
+2es.
+e1sa
+es5aa
+e2sad
+esag6
+es4al
+esa6la.
+esa9met
+e4s3ant
+es5arab
+es5arv
+esbi9e
+2ese
+es5ege
+es3ei4d
+es5eie.
+es3eig
+esei8ge.
+e3sek
+e4seku
+esel5s4
+e3s2en
+e5ser.
+e5sere
+e5seri
+e4s3erk
+ese5s2
+e3sest
+e4sesv
+ese5tas
+ese4te.
+e5setj
+e9sets
+e4seu
+e4sha
+es6har
+esh9ar.
+es4h5er
+e4shi
+e1sho
+e7s8hop
+esi6ar
+esi5ert
+e4sil
+e5sili
+es3ill
+e4s3ins
+esi6v
+esi3st
+es3jor
+e5skab
+es6ked
+es4kee
+es4ker
+8eskil
+e4sking
+eskinns5
+e1skj
+e8s9kjer.
+es4kjæ
+e6skjøn
+es5k4n
+e5sko.
+es7koa
+e3skot
+e1skr
+e1sku
+esku5et
+es3kvi
+e5sky
+e6skyr
+e1skø
+e7skå
+eskå7r
+e1sla
+es4lek
+es4let
+es7let.
+es7lets
+es4lit
+e4s5lok
+es4løk
+es4løv
+es4make
+e7s4mett
+es9na.
+es4ner
+es2no
+es4nu
+es2ny
+esnæ5re
+4e1so
+eso4b
+e2s3od
+e2s1of
+es3oks
+e2som
+e3somm
+e4s3ori
+e1s2p
+espa9ra
+es3pas
+es5pe.
+e4s4ped
+es5perm
+es3pl
+es4p5le
+es3pol
+e3spor
+es3pun
+es4sed
+es4see
+es4seg
+esse7i
+es6sendi
+es4s5enk
+es4ses
+es4sete
+ess5e4va
+es4s3ja
+es4sje
+es4skr
+ess4let
+ess3om
+es4sos
+es4spa
+ess5tilt
+es4stol
+ess5tor
+ess9tua
+ess5tue
+esstu8en.
+4essu
+es2s1v
+es7så
+e7stad
+es5tae
+es7takt
+es9tala
+e8stane
+e5stans
+es5tant
+es3tap
+e5start
+e3stat
+es5tato
+e4s3tau
+e7stav.
+est5avs
+e6s5te.
+es4teg
+est5eie
+est5eig
+es4tek
+es4tel
+e5stell
+es5tels
+e4stema
+e6steme
+e4stemo
+es5temp
+6esten
+e7steng
+es5tenk
+e8s7ter.
+e5s6terk
+esterne8
+este3s4
+es4test
+es4tien
+e3stif
+es4tig
+e3stik
+es4tikk
+5e6s5tima
+es4tis
+e4stiv
+e1stj
+es3t6on
+e4stog
+e3stok
+e3s4tol
+es6tone
+est5ord
+est5ori
+es5trak
+est5rene
+est5rer
+est9ré
+es5trib
+e5stryk
+e3strå
+e1stu
+e5stud
+es5tus
+8estå
+estå5ren
+estå6s
+est7åse
+e1su
+es5ut
+esva5re
+e5s4vek
+es5vig
+e5svikt
+es3vis
+2e3sy
+esy4na
+e4s5yt
+es5øvi
+es7øye
+e1ta
+4eta.
+e4tae
+e2taf
+etafo7
+e3tak
+e6tako
+e3tal
+eta3la
+eta4la.
+et5ald
+eta5le
+4e5tall
+etal6list
+etall5s6
+etal4s7
+et3amb
+e6tand
+eta4nen
+et4ap
+e9tapa
+e5tape
+3etappe
+et8ar.
+et8are
+et5art
+5e6tasjes
+1e2tat
+4e5tati
+e5tato
+e3tatt
+et5aun
+e8tax
+et1c
+2ete
+e4teie
+e4teka
+ete4ma.
+e5teran
+ete5ru
+etes5i
+e4tesl
+et8et
+e5tet.
+e7tets
+4eté
+4eth
+2eti
+e3tit
+2e1tj
+e7tjer
+et3jø
+6etl
+et5m
+2etn
+et6nev
+etning4
+etnings7
+2e1to
+eto4er
+et5oppd
+et3ord
+e4tot
+2e1tr
+e5t4rad
+e7t6rak
+8etre
+e5tree
+e5tref
+e4t3ris
+e9tru.
+et5rum
+ets1
+et9sar.
+et4sku
+etsku8le.
+ets7l
+etsla8ga
+etsnæ4
+et2sø
+et4tak
+et4tal
+etta6le.
+ett5alt
+et4tank
+et8tap
+et5te.
+et6tei
+et6telt
+et4tenk
+et4tenn
+ettera4
+etter5at
+et5t6erf
+5etterk
+5etterr
+ett5esk
+2etti
+et6tia
+ettian8
+et4til
+et2tj
+etto5a
+et4tr
+ett3re
+ett4ski
+ett4sti
+et3tug
+et4tur
+ettvi5se
+et2ty
+2e1tu
+5e6tui
+etu6na
+et3uni
+2e3t2v
+e4t3va
+e5t6vang
+2e1ty
+4etz
+4etæ
+etæ3ra
+e1tø
+e1tå
+etå5re
+e1u
+eu4a
+e8uf
+eug8la
+eu4h
+eu4ka.
+eu2ke
+eu5kem
+eu7kr
+eu2l
+eum2
+e3u2n
+eun4ge.
+eu5nu
+e4up5a
+e6upk
+e2ur
+eu6rat
+eure4
+2euri
+e3urn
+eur8na
+eur6ne.
+euro1
+3europ
+e3urt
+e2us
+eu4si
+eu1ta
+e3uts
+eut7t
+e4u3z
+e1v
+evad6r
+ev5akti
+eva4la
+evann4s
+e4v5anta
+e4varar
+e4varb
+e4v5ark
+e6vatf
+6eved
+eve5d6a
+eve5del
+6eveg
+e5vegg
+evei6s5
+6evenn
+even5s
+5eventy
+e4veny
+e9ver.
+e5ves.
+e5veta
+e5vev.
+evi4e
+evi5ere
+evi5ert
+evin4s
+evi4se.
+evis3t
+e2vj
+ev2na
+evn5a4k
+ev7nu
+ev7oms
+e4vre
+e7vri.
+ev9rå
+ev1s
+evs8v
+evta8la
+evti4
+e2v3un
+e5vyrk
+e2vø
+ew3a
+ey1
+eybal4
+e1y2d
+ey5k
+e1yng
+e1yr
+eyr6ka
+eyr4ke.
+e1y2t
+e7yti
+ey3tr
+e3zi
+e1zu
+e1æ2
+eær3
+e1ø4
+eør6na.
+eøy4
+eøy9an
+eøy7en
+e1å6
+eåk4
+eån8da
+eåt8t
+é1a
+é1b
+é1d
+édø4r5
+é5e8
+é1f
+é1g
+é1h
+é1i
+é1k
+é1l
+é1m
+é4n5e
+é5n6et
+é5o
+é1p
+é1r
+é2rj
+é1s
+ése2
+é1t
+é1v
+éva8la
+évo8re.
+é5å
+è1r
+è2red
+è2ref
+è2rek4
+è4rener
+è2rep
+ère3s2
+è4rest
+è2rev
+è6ves
+ê8lan
+ê6ra
+ê1re
+êr7o
+êr9sl
+1fa
+4fabo
+fac8
+fa1ci
+fa3de
+fa6de.
+6fadm
+fa4f
+fa2g1a
+fa5ger
+fage4t
+fag5eti
+fa2gi
+fa2go
+fa2gr
+6f5agro
+fag3sk
+fa2g1u
+fai5
+2fakr
+fakse9t
+fakta3
+fa1ku
+5fal
+fa1la
+fal6kes
+fal4k3l
+fal6lers
+fal5m
+fa4lo
+fal4sk
+4fa5mo
+fa4na.
+7fan5d
+5fane
+fanfa5
+fang4s
+fangst7ev
+4fank
+2f3anl
+fan5s6
+fan7tesk
+fan5ti
+fan3to
+fan4try
+6fanu
+2fap
+3far
+9f8ar.
+fa3ra
+fa4ra.
+fa4re.
+fa4res
+far4gel
+far4ges
+fa4rit
+far5n
+far6skj
+fart2
+far4vel
+4fary
+fa7sa
+fa4sel
+fa4seru
+2fasl
+fast3r
+fa3tal
+fa4te.
+fa6t7ers
+fa1to
+fat2r
+fa3t6re
+fav5ne
+fa1vø
+2f1b
+fba4ne.
+2f1d
+1fe
+3fe.
+2fe1a4
+5fea.
+fe5a6l
+2fec
+fe4da
+3fede
+fe2dr
+fe3dra
+fe3d4ri
+fe7ene
+2fef
+2fe3g
+2fehj
+fei5en
+fei5er.
+feig4de
+fei5ge
+feil5es
+fei4li
+9fein.
+7feine
+fei7ter
+8fej
+2fek4a
+4fekl
+2feko
+4fekr
+fek6tes
+fekt5ev
+fe5lag
+fe5len
+fe5li
+feli7e6
+6felik
+felles5
+fel7læ
+2felo
+fel5ok
+fel9ta.
+fel4tek
+fel4ti
+fel4tra
+fem5ak
+fem9b
+fem9ne
+fe4mo
+fem5s
+fem4tid
+fe2m1ø
+5fen.
+4fena
+fend9r
+4feni
+5fens
+fentleg5
+2feo
+2fe3p2
+5fer.
+fe6ral
+4feram
+fe5ras
+fer6at
+fer4dam
+fer5de
+4ferea
+4fereg
+fe4rek
+fer6en
+fe7rer.
+fer5ers
+feri6e
+feri8e5ne
+7fern
+fer2r
+fers9kar
+fers7ke
+2fe1ru
+3fes.
+2fesi
+2fe1sk
+fe2st
+fes9t6i
+fes8t3r
+fes9tum
+fe6st9ø
+4fesy
+fe6ta.
+4fetap
+fe4te.
+4fetea
+fe5ti
+4fetil
+2fet6r
+fett5j
+fett7s6
+4fe4ty
+2feu
+2fev
+fe4ven
+2feø
+fe6øy.
+2feå
+1fér
+2ff
+f7fa.
+f4fab
+f2f3a2g
+f4f3ak
+ffa7l
+f6fann
+f4farb
+ffar6d
+ffa7re
+f9fas
+f6fat
+f8f9au
+f2f3av
+f2feb
+f2fe3d
+f2fee
+f6feh
+f2fem
+f6ferdi
+ffe4rer
+f2fes
+f4feti
+f4feto
+ff5eve
+f2fib
+f4fice
+f2fid
+f9fien
+f4finn
+ff5int
+f2fip
+ffi5s4
+f2fj
+ff3la
+ffla8ga
+ff9leg
+ff3li
+f2fo
+ff4ol
+f2f3re
+ff1ro
+ff5sl
+ff5t4
+ffu6r
+ff5ut
+f3fæ
+f4fø
+2f3g2
+2f1h
+1fi
+fia7l
+fia4n
+4fiap
+fi4as1
+fibi6en
+fi9cen
+fici7
+fi7di
+fie2
+fi1er
+fi7e6re
+fi4f
+fi5fi
+fi5fo
+fi7fl
+f6ig
+figh9t
+fi7g6r
+4fih
+fi9ka
+fikali7
+fikalie6
+fi7ken
+fik6ka
+fik6k5n
+fi5ko
+fik7sa
+4fiku
+fi4la.
+fi3li
+fil6lel
+fil6leri
+fil4les
+fil7leti
+fil8m7at
+fi1lo
+filt6re
+fil7tres
+fil4tri
+4filæ
+fin5art
+fin5d
+fi4ne.
+fi5ner
+fing3r
+6finj
+finn5ei
+6finnsa
+fi4n3o
+fi9nor
+2fins
+fin6sleg
+fin6te5s
+fi2nu
+7fio5
+fi2r
+fi3ra
+fi6ra.
+fi9rene
+fi5res.
+fi3ri
+fi5s4a
+4fisc
+fi6se.
+fiser6s
+fi8si.
+fi2sk
+fi6ska
+fisk5a6d
+fis7kal
+fisk5and
+fis6kart
+fis6k5end
+fis4k3l
+6fiskol
+6fisku
+fis5ti
+6fistu
+fiti6me.
+4fitr
+fitt5s
+fi7ty
+fi4ve.
+1fj
+f1jeg
+fjel6lend
+f5jen
+fjer5ne
+fje4sk
+fje2t3
+f5ju
+fjære5
+fjæ4res8
+2f5k6
+f2l2
+f5lag.
+f6lagg
+fla7ke
+f4las
+2fleg
+fle6i
+f4lek
+f6lel
+fle4sl
+f4lett
+f3lev
+fli7ne
+flis7t
+flit9t8
+1flo
+flo9ga
+flok9s
+flo2m3
+flo6r5o
+flos6kl
+f6lu
+flue3s
+flus8
+fl5ut
+3fly
+fly3s4
+f3løn
+flø5s
+1flå
+flå9sa
+flå7se
+2f1m
+fn6
+1fo
+2fo.
+fo9ar
+6fobs
+2foe
+4fof
+foi7la
+fo8ke.
+fo6la.
+fol4dr
+fo4le.
+fo5led
+fol6k5v
+fol9ler
+fol5lese
+folke5s6
+fol5li
+fo4lu
+3fon
+fo4na
+fond2
+fo5ne
+fo3n4id
+fo4nin
+fon1s2
+f1op
+for1a
+for9drev
+for7dro
+for5d6u
+fo6re.
+for9ei
+for7e6n
+for5ent
+for5ess
+for4et
+for9e8te.
+for9e8ten
+for9g6
+forh6
+fo4r9in
+fork8
+forlo7v
+forlø9pa
+forlø9se
+formo9r
+for3n
+foro6
+for5p
+for3se
+forsi9da
+forsi7de.
+for3s4m
+fors8t
+for9ste
+fors4v
+forta8le.
+for5t6e
+fortei9e
+for7t6i
+forti5da
+for3t4v
+for3u4l
+for7v6
+forva9re
+for5æ4
+for5ø4
+for9å
+fo9se
+fosfo5re
+4fosj
+fo4ta
+fo6te.
+foto5
+fo4tok
+fo4tom
+fo6top
+fo4tor
+fot3s
+fots6v
+fot3t
+4f1ov
+3fô
+2f3p2
+fpo6e
+fr2
+1fra
+fra5l
+fra4m5e
+fra6mi
+framma8ne.
+franko5
+fran7se
+fra7r8
+fra1s
+fra5se.
+fra7sep
+frasi8e
+fra7sk
+fras6p
+fra7v
+fra7v6r
+f2re.
+fred8sel
+freds5t
+fre4e3
+8freg
+f4rek
+fre4m5
+fremma8ne.
+frems4
+fre7ne
+fre6sk
+fres7ko.
+fres5koe
+fre8s9v
+fri5a6re
+6f5ridi
+fri4erf
+f1rin
+fris6ka
+fri5s4p
+fri5s6til
+frite8re.
+friti8me.
+6froc
+fro7f
+fronta9le
+fro8st
+frus1
+fruta6le.
+f1ryt
+frø5b
+frø7ko
+frå9r
+fråve4
+2f1s
+fs2h
+fsho6
+fsi2
+f5sjuk
+f2sl
+fsle6ge.
+f4sm
+f2sn
+fs7ne8
+fs5ov
+fs2t
+f2s3tab
+f6s5tan
+f4s9v
+2ft
+f1ta
+f3ta.
+fta7f
+ft1ak
+fta8la.
+ft3alg
+f2t1am
+f4tana
+f7tane
+ft3anl
+f5tar.
+ft8as4
+f6t1av
+f2tea
+f3ted
+f4tee
+f2teg
+f2tei
+f2tek
+f6tem
+fte4na
+ften3d
+f4t3enh
+ften5s6v
+f2teo
+fte4r5a4
+f4terin
+fter5s
+f4test
+f4teta
+f4t5ett
+ft3ind
+f2t5i4s
+ft5l
+ft7n
+f2t1o2
+f5tog
+3fton
+ft3r
+fts5alt
+fts3ei
+fts5ers
+fts5erv
+ft2s1i
+fts1k
+ft2skaf
+ftsla6ga
+ft5s4lan
+ftsle6ge.
+ft3sto
+ft6s5top
+ft5s6tri
+ft5stø
+fts1u
+ft2s1ø4
+ft5t4
+ftta8ka
+ft1u
+1fu
+fu8ga.
+fug9le.
+fug6l7eg
+fu6le
+full3
+ful9lar
+fulle6
+ful9le.
+ful4len
+fullen8de.
+ful4ler
+ful7les
+fullfø7re
+funn2
+funns3
+funnsla8ga
+fu6ra.
+fu6re.
+fu9ret
+fu7ro
+furu1
+fu7sel
+fu6sk
+fus6o7
+fu4s5t
+fut4h
+futu1
+4f1v
+fva8la
+1fy
+fy5la
+fyr2
+fy8ra.
+fy4r5a4b
+fy1re
+fy4re.
+fyr7k
+fyr8ke.
+fyr5t
+fy3s
+fysa7
+fy8sa.
+2fæ1
+1fø
+fø4da.
+fø4dek
+fø5den
+fø4des
+fø5des.
+fø1f
+2føk
+fø4le.
+f8ør
+før6a
+fø5rar
+fø4re.
+fø4res
+fø7resv
+fø8rete
+før6tin
+4få
+få7ren
+få7ret
+få5ri
+får7u
+få7va
+1ga
+4gaba
+ga1bo
+6gabø
+ga3da
+ga4ded
+4gadg
+2gadm
+4g5adr
+ga4e5k
+6gaflo
+g3aft
+6gah
+6gak
+g1aks
+gak8ta.
+gak8te
+ga3kv
+ga1la
+ga4la.
+galei5
+ga7len
+gal4les
+4galli
+5ga7lo
+ga4ma.
+4gamb
+ga5mer
+gamme6l5
+6gand.
+6ganden
+9gane
+gan5g6en
+gan4g5j
+4gan5k
+2g1anl
+4gann
+4gansa
+4gansv
+4g5antre
+ga6pa.
+ga4pe.
+ga4p5l
+gap3s2
+ga6p7u
+9gar.
+ga6raf
+ga6r5ak
+2garb
+5garbr
+5garby
+gar4dek
+7gare.
+4garea
+gar5es
+gares6ke.
+gar2i
+4garki
+gar3ne
+gar6ta.
+g5arte
+gar8te.
+g3arti
+gart5s6la
+gar4un
+ga4ryl
+ga4sc
+ga5s2i
+gas8ka.
+gas8ke.
+ga6ski
+4gasp
+gas6sel
+gas5sen
+gas7ser
+gass5ett
+gass3l
+5gast
+gas5te
+ga5sto
+gas7t6ra
+gas9tri
+g2at
+ga4te.
+ga5tens
+gate5s
+ga3ti
+ga1to
+ga3tr
+gat6tap
+gau5la.
+9gav.
+2gavd
+6ga4vei
+ga4veri
+4gavg
+g5avk
+2g1avs
+2gavt
+4gavv
+2gaw
+4gaø
+2g1b
+gba4ne.
+g6byk
+2g1c
+8g1d
+gd5alt
+g6d5au
+gde3a
+g2deb
+g3deba
+g4dedi
+gde5lo
+g2dem
+g4dend
+g2de5o
+g4dera
+g4de5re
+g6dero
+g2des
+g2det
+g3det.
+gdevi8sa
+gd5op
+gd1or
+gdy4d
+g6d1øy
+1ge
+2ge1a
+geak8ta
+geak6te.
+gea7ren
+ge4ark
+2geb
+6geba
+4ge5be
+3gebri
+4gebrå
+3gebyr
+ged4
+4gedan
+6gedel
+gedia5
+9gedom.
+7gedoma
+9gedome
+7gedomme
+6gedoms
+4gedos
+2gedr
+2gedy
+2gedø
+2gee
+geen8de.
+2gef
+g5eft
+3gefæ
+2ge1g2
+g5egg
+g3e2gn
+2geh
+gehø8ve.
+2gei
+g1eie
+g4e1in
+gei4r3
+gei9re
+gei8s7p
+gei6st5
+3geit
+geit3a
+geit3o
+gei4t3r
+2gej
+2gek2
+ge9kl
+ge3kn
+g1eks
+6gekt
+5gel.
+ge4lar
+4gelau
+ge6le.
+ge7lea
+4geled
+4gelei
+gelei5er
+4gelek
+4g3elem
+ge5len.
+ge5lens
+5gelet
+gel5ett
+3geli
+4gelid
+6geligg
+4gelit
+6geliv
+2gelo
+ge5lov
+7gels4
+gel3se
+gel5si
+gelsk7l
+gel5t4
+4gelu
+ge5lun
+gel7ve
+4gely
+2gelæ
+2gelø
+2gelå
+5gem.
+2gema
+9gema.
+2gemi
+3geml
+4g5emn
+gem6na
+2gemo
+9gemr
+3gems
+3gem4s5t
+ge3mu
+2gemy
+2gemø
+2gemå
+g2en
+3gen.
+ge2n1a
+ge7n6am
+gends6t
+ge3nea
+4genem
+gen5erf
+ge5nes
+gene4t
+gen5eti
+4genev
+gene5ve.
+gen8ga.
+gen5gr
+ge4ni6n
+6geniv
+gen5k
+genle6ge.
+gen3n
+gens5l
+gen6sun
+gen5tr
+4genum
+4geny
+4genæ
+4genø
+2geo
+5geog
+3geol
+geome5
+geomet4
+ge5on
+6geop
+ge9ope
+2gep
+g2er
+3ger.
+ge5ra.
+ge6ral
+ge4r5ant
+ge9ras
+ger5di
+4gered
+4geref
+4gereg
+4gerek
+ge6rene
+4gerep
+6gerese
+4gerett
+ger4i5d
+4gerik
+geri8ka
+6gerike
+ge4rim
+ge4ris
+ge4rit
+ge4riv
+gerle9g
+g9er8ma.
+ger3n
+gerne6
+4geroa
+4gerom.
+4geromm
+6gerop.
+4gerope
+ger5p
+ger4s5af
+5gerud
+ge5rup
+ger5v
+gerø6re.
+ge4r3ø4v
+4gerå
+g6es
+5ges.
+2gesa
+2gese
+5gesen.
+5gesens
+4gesi
+4ge5sja
+4gesje
+2ge1sk
+ge1sl
+geslu7
+ges4lø
+4geso
+4gespe
+ge4spr
+ge5spra
+2ge1st
+3gest.
+gesta7b6l
+5geste.
+ges6tekk
+ges8ti.
+gest5rid
+gestri8de.
+6gestå
+2gesu
+ges5vik.
+2gesy
+6gesæ
+2gesø
+2ge1så
+geså5re
+5get.
+ge5tak
+geta6le.
+6getat.
+6getate
+4ge3te
+5gete.
+2geti
+2getj
+2geto
+2getr
+5get5s
+2getu
+2gety
+gety8e
+2getø
+2geu
+g2ev
+2ge7v8a
+2geve
+4gevir
+gevi6sa
+4g5evn
+gev6ne.
+4ge5vo
+5gevå
+2gey
+4geæ
+2geø
+2geå
+1gé
+2g1f
+gfe2l
+4g1g
+g6g5al
+gg5ask
+g2g1av
+g4gedi
+gg1ei
+g4gela
+g4gele
+g2gem
+g4genu
+g6gerei
+gge4rin
+g4gerø
+gges6b
+gges5l
+g4gesm
+g6geso
+g4gesp
+g6ges6tio
+g6ge5sv
+g2gev
+ggie6
+g4gif
+g4g5i4m
+gg4je
+ggje5s
+g2gl
+g7glu
+g4gn
+g2g1o2
+g3go.
+g5gos
+gg3rad
+ggra6da
+gg5rat
+gg8re.
+gg3red
+gg7rek
+gg5s4par
+gg3sto
+gg4sy
+gg3sø
+g7g8ud
+g4g5u4r
+2g1h
+ghe8n
+ght5ene
+gh4to
+ghæ8
+1gi
+3gi.
+4giak
+gi1ar
+4giarb
+6giav
+2gib
+gi8c
+2gid
+gi3de
+gi1e
+4giek
+3gien
+gi9end
+5gier
+4gifa
+2gifo
+4gifr
+4gifu
+gi6ga.
+2gigr
+2gih
+2gii
+5gika
+3gike
+4giki
+3gikk
+gi5k4r
+4giku
+gi5le
+4gimess
+gi4metr
+4gimi
+4gimø
+2g1ind
+6gingeni
+gi4nin
+2g1inn
+gin5nu
+4gino
+4g1ins
+4g1int
+2ginv
+4gi5om
+2gi1op
+gio4r
+2gip
+gip5si
+6gira
+gi3re
+gi4re.
+giro3
+gi6rob
+5gis.
+2gisa
+gi3se
+4gisel
+4gisen
+5gisk
+6giska
+gis8lu
+gis4lø
+4giso
+4gisp
+gi3s4pa
+gi5s4pr
+giste6ru
+gis5ti
+gist5ra
+gi5stré
+gi6st5rer
+4gistu
+6gisty
+gi5ta
+4gi5te
+gite4s
+gi2t9r
+git5te
+2giu
+gi7va
+4gival
+4givo
+4givu
+1gj
+2g1jak
+g5jarn
+2gjaz
+gje5f
+4g3jeg
+gjels4
+gje2n
+gjen1opp3s4
+gjen5s8
+6gjent
+3gjer
+gje7sk
+gje4s3p
+gje8v9ak
+2gjob
+2g1ju
+7g6jut
+gjø9de
+2g3k2
+gkly9
+gl2a
+6gla.
+gla3de
+4glag
+gla4ga
+gla8ge.
+g3land
+g1lar
+gl5art
+glar7v
+1g2las
+7glase
+g6lass
+6glast
+g5last.
+3glat
+g5lau
+gl6e
+gle6dero
+g2lef
+gle3ge
+gleg8ga
+6glei
+glei7er.
+g2lek
+g7lek.
+g5leke
+g2lel
+3glemt
+4glen
+g9len.
+g9lene.
+g9lenes
+g9lens
+gle9pl
+4gler
+gle4ra
+glere8de.
+g9les.
+gle6se.
+g4le5sk
+g6le7sm
+4glet
+g2lev
+1g2lid
+gli4del
+gli7e6n
+gli8er
+glig1
+3g2lim
+gli9me
+4glio
+glitt4
+6g7liv
+4glj
+gl7ja
+gl5l
+g4lo.
+g2loa
+5glob
+5g6lome
+1g4lor
+gloria7
+glori6an
+glorie7ne
+g4los
+glo5ste
+6glov
+gls4
+5glug
+g5luk
+6glun
+gl5ung
+glun8ge.
+gl5ut
+g5lyd
+3glyf
+gly4se.
+g2løg
+glø8pa
+2gløs
+gl7øy.
+5gløym
+2g1m
+g4mete
+g4metr
+g5mé
+gmini6
+gmo4e
+g3mu
+gmu8le.
+gmå6la
+g1n
+gn1ak
+gna5lem
+gna4lo
+g2nav
+gn1d
+gndø6
+gndør5
+gn4e
+g2nee
+g4nelo
+g6nero
+g6nerø
+gne1s4
+gne8se.
+g4nesk
+g4nest
+g5net
+g6netr
+g2nev
+g4nib
+g4nid
+g6nik
+gning4
+gnings5
+gni4s
+g6ni5sk
+gni6st
+gnist9r
+gn5k4
+g2nom
+gn5o6p
+gn7o6v
+gn5r
+gn1s
+gn4skr
+gn6sm
+gn4som
+gns4pr
+gn4sti
+gn2s1v
+gn5t4
+gnu5re
+gnæ6re
+g2nå
+1go
+7goan
+go1ar
+7goar.
+2gob
+gobe5
+go4da
+go5dal
+god5ar
+2godd
+go4de.
+gods9t
+2gof
+go9ga
+go5ge.
+go9g8r
+6goi
+2gok
+gok4se.
+go3le
+gol6fa
+go5lo
+gol4va
+gol6var
+go4lå
+2gom
+g7o6ma
+6gometris
+7gomm
+go4n5and
+go9ne.
+go7ni
+go5nok
+gon9s
+2g1op
+3g6or4a5
+go5ra.
+go7rae
+go7ras
+2gord
+gor6da
+go1re
+gore8a7
+2gorg
+g4ori
+gori5e6
+g5orv
+gor8va
+go5rø
+gos3p
+4gost
+6goto
+got6r
+4gov
+go8ve.
+go8vi.
+2g3p6
+1gr4
+8gr.
+4grab
+6grac
+gra5ce
+9grads
+graf5f
+graf5t6
+gra4m5
+grand3s4
+gran5to
+grant4r
+gra9se.
+gra9set
+gra6sk
+gras3t
+gra5t
+gra8te.
+grati4s
+gra4u
+gra4v3ak
+gra7vis
+gravta8
+2grea
+4g5reds
+gre4en
+2gref
+g7refe
+g4rega
+greie5n
+grei6ene
+6g3reis
+4grek
+2g5rel
+g5rent
+4grepi
+grep4s3
+g7rese
+gres6sak
+gres6sent
+6g5rest
+4grett
+4g5ri.
+grib3
+4grid
+4grif
+4g1rig
+gri5sete
+4grit
+gro9ar
+g4ro7i
+grom5m
+g4ron
+gro5sk
+gro3ve
+4g5rui
+4g3rul
+grun7g
+5g4rup
+gru7sa
+grus5t
+2g1rut
+2gryd
+4g5ryg
+6g5rytm
+grø5de.
+6g5rør
+4g5røv
+grø5ve
+4grøy
+gr7øy.
+6gråd
+grå6da
+gråk4
+grå7n
+grå5te.
+8gs1
+gsa2
+gs5akers
+g7sal.
+g7sale
+g5salg.
+g5salge
+gsam3
+gs3amb
+gs7amn
+g3s6ank
+g5sard
+g2sas
+g7sast
+gsbø6n
+gs2ce
+gs5ef
+g2seg
+g2sei
+g2sek
+g5sekr
+g7sekv
+gse9la.
+gsel4s5a
+gsel4st
+g2sem
+gs6ende.
+gsen6ke.
+g5sens
+g3sent
+g2ser
+g5ser.
+g3seri
+gse4st
+gse4t
+g3sete
+gs3eti
+g9sets
+gs4ett
+gse2v
+gsfø2
+g2si
+g5sider
+gs5is
+gsi2v
+gs4jar
+g3sjef
+g5sji
+g2sjo
+g5sjå
+gs4ka.
+g5skad
+gs4kal
+g5skall
+g6skam
+g4skan
+g4skapa
+g5skape
+g4skapi
+gs7kav
+g5skilt
+g7s4kj
+g7s6kjæ
+g3skot
+g5skren
+g7skug
+g6skv
+gsla6ga
+gsle6ge.
+gs6leri
+g4sluk
+gs4lun
+gsl9ut.
+g5slyn
+gs5med
+g9s6mert
+g7snel
+g5sog
+gs9ope
+g5spal
+g3spel
+gs2pi
+gs5pik
+g3spil
+gs5pile
+g6s5pors
+g3spur
+gs3s4
+gsse4e
+gs5tak
+g9s8tand
+g5stang
+gs4tasj
+g7s4tat
+gstatsrå7
+gst6e
+gs5te.
+g5ste4e
+gs4tell
+gs5tema
+gste6ma.
+g7stemt
+gs4tere
+g5s4terf
+g5s4terk
+g5s4tern
+g5s4ters
+g5s4terv
+gst7evnen
+g5s4ti.
+g3s4tie
+g3stif
+g3s4tig
+gs5tiå
+g5sto.
+gs4tol
+g5stol.
+g7stola
+g5stole
+gs5toll
+gs4trap
+g5strau
+gst5rea
+g5strede
+gst5rei
+g5streke
+gs6tret
+gstri8de.
+g5s4trof
+g3strø
+g5s6trå
+g5stue
+gst5ut
+gstyr8ka
+gs4tør
+g5s4tå
+gsu2
+gsu5g
+gs4vane
+gs5vik
+gs7væ
+gsy2d
+g7sym
+gsy6na
+gsy6t
+g2sø
+gsø6ki
+gs6øt
+gså4
+2g1t
+g3ta
+gta8ka.
+gta8ke.
+gta6la.
+gta4le.
+g9t6e
+gte6ke.
+gte6ma.
+g3ti
+gti8de.
+g4t5if
+gt6re.
+gtråd5s6
+gt7sv
+gt5t
+gtu8en.
+gtvek8
+gty8e
+gt9yt
+1gu
+4g5u4bå
+gu2di
+guds3t
+gu4el
+6gug
+g5ug6l
+gui4d
+guid5ar
+gu4le.
+4g5ulk
+gul8ke.
+gul4la
+gul5o
+gul7ø
+7gum
+gun4g
+gur2g
+gu4ri
+gur8na
+gur6ne.
+gu5rua
+gu3rue
+gu4st
+gu1ta
+2gutb
+4gutd
+g5ute.
+6gutg
+g7utl
+4gutn
+2guts
+gut4tak
+gut4tes
+4guttr
+2g1v
+gva4ke.
+gva8la
+gvedli6
+gvi8ta
+6g1w
+1gy
+g9y8a
+gy4da.
+7gym
+gy3ne
+gyr6
+gy8sa.
+gy6se.
+gy4te.
+gy4ve.
+g5æt
+4g5øk
+gør3s
+2g3øv
+gøy9a
+gøye6r
+gøy5n
+1gå
+gå6as
+gå6en.
+gå4er.
+4g5å4k
+4gåm
+4g3ån
+gån8da
+2g1å4p
+2g3åre
+gå2s
+gå3st
+gå9ven
+gå4vet
+h2a
+ha4a
+haba9
+4hae
+ha2el
+4hafi
+ha2g
+ha3ga
+ha4ga.
+ha3gen
+hai1
+ha7ism
+ha5ka
+ha4ke.
+ha5ken
+ha7kera
+ha4ke5s
+ha1la
+ha6la.
+hald4s7
+ha4le.
+ha4lev
+hal6lei
+hal6lø
+hal4s3k
+hal4so
+hal4s3t
+ha5lu
+hal4v5
+ha5ma
+ha8me.
+ham6nest
+ha5mo
+ham4st
+hams4t7r
+ha5na
+han6d5r
+hand7skr
+hand5ø
+ha4ne.
+hani1
+hanis4
+han2n3
+han4ne
+han6nel
+han5nen
+han5n4o5
+han3se
+han4sk
+ha4pe
+ha4re.
+ha5rei
+ha4rel
+ha3rem
+ha4res
+har5k
+ha5rov
+har7se
+har5tre
+har4tri
+ha4sj
+hasj5e
+ha2sl
+has6p7l
+has5v
+ha3tar
+ha4te.
+hat6le
+h4au
+hau5ke.
+hau6st
+hau4t5r
+hav4a
+ha4va.
+ha5van5
+ha4ve.
+ha4veg
+ha4vei
+have3s
+ha1vi
+ha4vo
+hav4sl
+ha6vu6
+hav1ø
+4havå
+2h1b
+hba4ne.
+4hc
+2he.
+he2a
+he7ans
+heat4r
+heb5n
+he4de.
+heder6s5
+he2d9r
+hef9ta
+hef7tes
+he3ge
+he4ge.
+he2g3r
+he2i
+heia3
+hei5en
+3heim
+he3ins
+hei4sk
+heit4s
+he2k
+hek4sek
+hek6serin
+hel1a
+he4la.
+he4le.
+he4l5ei4
+hel6lesu
+hel3o
+hel2s2
+hel3sa
+hel4se7
+helses4
+hel3sk
+hel5sp
+hel5ste
+hel3sv
+hel4tes
+hel9ve
+he4mak
+hem5ne
+hem3s8k
+henfø5re
+hen5o6
+hen1s2
+hen5se
+hera9da
+he5ret
+he4ri.
+her5j
+herle9ge
+herli9ga
+4her5n
+he1ro
+he4ro.
+hero9a
+her7p
+her6rei
+her6resi
+her6ret
+her6ska.
+her8s7kare
+her6sv
+her5un4
+he2r3ø
+he4se.
+he2sp
+hes7pa
+hes5pel
+hes5pen
+hes9per
+heste5ri
+hes4tes
+he6stø
+het2
+he4te.
+he5t6i
+het4s3a4
+het4s5p
+het3t
+he6va.
+he6v7arm
+he4ve.
+hev9na.
+2hf
+2hh
+h5hu
+hi5ao
+hi4bak
+hie4n
+hi2et
+hi4f1
+hiff2
+hif9r
+hi6ge.
+hik7e
+himme6l5o
+hi6n7an
+hin4nes
+hins4
+hins9ke
+hi4pl
+hip3p
+hi1ro
+hi2s1
+hi9se.
+hi3sen
+hi5s4i
+4hisk
+hit7o
+hi4t5r
+hit5ti
+hi8va.
+hi4ve.
+hiv1s
+hjar4
+hje4
+hjem7e
+hjorte5
+hju6l7
+hju7l8e
+2hl
+h5lan
+2h1m
+hma8n
+2hn
+h2na
+hne6n
+hn1s
+h4o
+ho5ar.
+hob6
+ho6da
+ho4de.
+ho5den
+hode3r
+ho5der.
+ho5dy
+hof4f3
+hof4f3a4
+hof4f3e4
+hof5f6er
+hof4fi
+hogs6
+hog6str
+hog7stra
+hoi5
+ho2la
+ho5lag
+ho5lan
+ho4le.
+ho4lin
+hol5l
+ho4lom
+hols4
+ho4lu
+hol7ut
+ho4me.
+ho4mo.
+ho4mod
+ho4mos
+ho5n6o
+ho4o
+ho8pa.
+ho4pe.
+ho8pi.
+ho5ra
+ho6ra.
+hor2e1
+ho1ro
+2hort
+ho4s
+hos5a
+ho5sen
+ho5ser
+ho5si5
+hou2
+ho1v
+hove5re
+ho4vé
+2how
+h1p
+2hr
+h1ra
+h1re
+hri5ne
+hri2s3
+6h1s
+h5s4e
+4ht
+h5ter
+htere4
+h1tr
+ht5t
+hu4da
+hu4d3
+hud5s6
+hudså9re
+hu4er
+hu6et.
+hu4ga
+hu4ge.
+hu8ja.
+hu6ka.
+huk8ra
+hu4la
+hu4le.
+hu4leg
+hu5les
+hu4lev
+hu5ma
+hun6des
+hun2n3
+hu1ru4
+hus1a
+hu8sa.
+hu5s6a6r
+hu6s7arr
+husa7r8e
+hu4se.
+hu4s3ed
+hu2s1i
+hu2s5j
+hu2s1k
+hus7m
+hus5s4
+hus1t
+hu8str
+hust9ran
+hus4tre
+hu6sty
+hu6s5u6
+hu2sø
+hu4va
+hu4ve.
+hu4ves
+hv4
+hva5le
+hvas5
+hve2r
+hver3a
+hvi5l6i
+h4v4ir
+hvits4
+hvo2
+hvor5
+hvor5i6
+h6y
+hya3
+hy2bl
+hyd4
+hy2e
+hye5ne.
+hye9nes
+hyg5gel
+hy6la.
+hyldes7
+hy4le.
+hyr4des
+hys3
+hy8sa
+hy4se.
+hy2s1j
+hys5t
+hæ5g
+hærfø9
+hær3s6
+hø4e
+høf5
+hø2g
+høg3ri
+høg7rø
+høk6
+hø6le.
+hø4na
+hø4ne.
+hø5rar
+hø5ren
+hø5rer
+hø4res
+hør6sp
+hø2s
+høst7a
+høst5ø
+hø1va
+hø1ve
+hø1vi
+høy5a6
+høy5k
+høy7n
+høy7rar
+høys4
+høyse6te.
+h6å
+hå7a
+hå8le
+hå6na.
+hånd5skr
+hå5nel
+hå6pa.
+hå4pe.
+hå4p5l
+hå1re
+hå1ri
+hår3s
+hår7u
+hå8va.
+hå4ve.
+ia9al
+i1abl
+ia1bo
+i2a3de
+i1adj
+ia5d8r
+ia1g2
+ia2ge
+ia1in
+ia1kr
+i1aks
+iak8se.
+ia5ku
+i1al.
+ial1a
+ial5ein
+iale4t
+ial5eti
+ia4l5ett
+i2alf
+ial3g
+ia4lin
+i4alk
+ial3op
+ia6lov
+i5als.
+ials4t
+i3alt.
+ial1u
+ia2lø
+i1an.
+i2ana
+ia4nal
+ian5ald
+ia5nar
+i7andr
+i5a4ne.
+ia8nes
+ia7net
+i5ank
+i1anm
+ia2no1
+i1ans
+ian3sa
+ian3sl
+i1ant
+ia7nø
+ia2pa
+i3app
+i1ar.
+iar4do
+iard5s4
+iar4du
+i2are
+i5area
+ia5r6e8l
+i5arn.
+i9arns
+i7arska
+i6asi
+i1asm
+ia4sp
+ias3s6
+i3assi
+i1ast
+i7ast.
+ia1t
+ia5te
+iat6r
+iaty6ra
+i1att
+i7auk
+i1av
+i1b2
+iba4ne.
+ib5bo
+ib3bu
+i3bere
+ibe4ro
+ibi5er.
+ib7lar
+i2b3le
+ib4leg
+ib4le5s
+i5bo
+ibo4e
+ibo7n
+ib4r
+ib3st
+ib8t
+ibya7
+iby9ar.
+8icanarar
+ice5ne
+i1ci
+ick1
+ick7ete
+i1co
+i5cy
+2ida
+i5dal
+i3das
+id1av
+id3del
+iddel5u
+id6dep
+2ide.
+3ideal
+i2deb
+i6def
+id5e4ge
+i7deki
+i9del.
+id3elv
+2iden
+i5dend
+iden5sv
+5identif
+5identit
+ideo3v
+i6derap
+i9de5re.
+i7deren
+i9deres
+iderla8ga
+iderle7g
+i7dern
+i5ders
+i6desm
+id6gem
+id4ges
+idi4en
+1i2dio
+i8dj
+id7jer
+id9na
+1i4dol
+id9ran
+id5reg
+4i3drev
+2idri
+id2s1
+id5sam
+idse4
+id6sel
+id5sim
+ids5l
+idsla6ga
+ids3t
+id4s5tu
+id2t1
+i2d1un
+i2dy
+3idyl
+i3dyr
+i3dø
+i6d7øy
+id7å
+2ie
+ie1a2
+i2ed
+i1eff
+ie4ge
+iego4
+ie1i
+iei6d
+i1eie
+i3eig
+i5eini
+iek8l
+i1eks
+ie5l6a
+i2ele
+i5elem
+ie4lev
+i7e6lim
+i1els
+i9elt
+ielø8pa
+i8e9ma
+iem7b8
+ie3me
+i1en
+ie7na
+i2end
+ien6dela
+ie8né
+i2e5ni
+ien7n
+ie5no
+i5ens
+ien4sk
+ien4s5v
+ien4t3r
+ie5nu
+i6eny
+ie4ran
+i4erd
+ie6re.
+ie5reg
+ie4r5eng
+i6eret
+i2eri
+ie4ril
+ie4ris
+ie4riv
+i2erl
+i6ero
+ie7ro.
+ier4ra
+ier4sp
+iers3v
+ier5t
+ie3run
+ier5v
+i2e1s
+i6es.
+ies4c
+ie3se
+ies5s
+ies4ti
+i8es6v
+i1et
+i2eta
+i5e4tabl
+i3etat
+ie9te
+ie5té
+iet4re
+ieu2
+ie7ved
+2if
+ife4s1
+if2fa
+ifi6e
+ifjø8
+if3le
+if4les
+iform4
+if1re
+i8ft
+if4tal
+if4tere
+ifte5s
+ift2s
+i3fø
+2ig
+i2gae
+ig3ann
+i7gark
+ig4art
+iga3ru
+iga7te
+ig3att
+i2gav
+ig3d
+i6geb
+i6gedi
+i6gedomm
+igedoms5
+i2gem
+i3gen
+ige6no
+i5gers
+i4gerø
+i4gesp
+ig3e4ta
+ig5ett
+ig4ged
+igges4
+ig4gra
+igg9s2
+i6gh
+i2g1ia
+i5gib
+i4gim
+igion4
+igje9va
+ig1l
+igl6d
+igli6se.
+ig5loa
+ig5neu
+ig5no
+igof6
+igo5fr
+ig1om
+igo4no
+ig2ra
+ig2re
+i2g1rø
+ig3råd
+igrå5t
+igs4al
+ig5sel
+igs2j
+ig5s4ka
+ig3s4kr
+igs4mu
+ig3s4pa
+igst4
+igs4ta
+ig4ste
+ig5stek
+ig7stel
+ig5stem
+igs4tra
+ig5s4va
+ig1un
+ig9ut
+i3h
+ihen3
+iho7le.
+i4huk
+ihu9la
+ihu5le.
+i1i
+i5in
+i7is.
+i6ita
+i1j
+2ik
+i1k2a
+i2kab
+i5kabel
+i2kaf
+i2kak
+ikan9d
+i2kao
+i4kapo
+i5kar.
+i5kara
+ika5re
+i4karei
+i6kasa
+ika3sp
+i2ke.
+i2ked
+ik9ei
+i9keleg
+i5keli
+ike5lu
+i5ken.
+i4kena
+i5kene
+i9kens
+i3ker.
+i4kera
+i5kere.
+ike5ri
+ike4r5o
+i2ke1s2
+ike3si
+i6kesk
+i5keso
+ike5su
+i5ket.
+i5kets
+i1ki
+iki9ne
+ik5inn
+iki5st
+i1kj
+ik4kaf
+ik6kana
+ik4kap
+ikk5arv
+ik4kas
+ik4kat
+ikk5att
+ik6k7ent
+ik4keru
+ik8kesk
+ik4kest
+ik3kjø
+ik4kjøp
+ik4kl
+ikk5lag
+ik2ko
+ikk5ord
+ik4kr
+ikk3re
+ikk5sv
+4ik2ku2
+ikk5und
+ik2kv
+ik6ky
+ik1l
+i5klæ
+i1ko
+i2koa
+i9koar
+i2kob
+i4kod
+iko5de
+i2ko3f
+i4kog
+i4koh
+i2kok
+iko5na.
+i2koo
+i5k6ord
+i4kore
+i2kov
+ik1r
+ik4rak
+ik5rem
+ik5robe
+ik3ros
+ik2ry
+ik2sa
+ik4sek
+iksmå8la
+ik7sot
+ik5spel
+iks5ti
+iks5to
+ik8stu
+ik4tav
+ik4teg
+ik2t1r
+iktsla8ga
+i1ku
+iku6le.
+i6k7u6t
+ik1v
+ik4vin
+i1ky
+i3kø
+i3kå
+ikå8pa
+i1la
+il5adr
+il7af
+i2l3ak
+il3al
+i4lana
+il6and
+i4lark
+il3art
+il5ass
+ilas5t6
+ila5t
+il5av
+il4dak
+il4deko
+il4dete
+il7dj
+ild3re
+ildsfa9re
+ild3s4t
+ilea9r
+ile8are
+i3le7e
+i2lef
+ile4ge.
+i4l3egn
+i2l1ei
+i6leig
+i2lek
+i2lel
+i4leno
+i4lero
+ile1s
+i4lese
+i4le5sk
+i4lest
+ile6tri
+ilet5te
+ile4tu
+i1lé
+ilfø5re
+il5ge
+il1gl
+i4lid
+ili5ers
+ili9ga
+i5lik
+i2l1im
+i4l3ind
+i7line
+i4lins
+i4l3i4r
+ili5s6tik
+il3ja.
+il1je
+il5jese
+il1jo
+il1ju
+ilke3
+il5ker
+il4kes
+ilk4o6s
+il5ku
+il4lab
+il6lam
+illan8da
+il6lap
+il9lau
+il4lee
+illei9e
+il6l7ender
+il6lesk
+il4lev
+illi9ga
+il4lo5m
+ill3s2
+ills5kå
+illæ4
+illæ9re.
+il4m5est
+ilm5e4v
+il4mi
+ilm5s
+i1loe
+i9lolo
+i4lom
+il5omv
+i5lon
+il3opp
+i4l1o4r
+i5loso
+ilot3u
+i4love
+ilo1w
+ilret4
+ilset8je
+il3sl
+ilsla7
+ilsle7ge
+ils4mu
+ils2p
+ils2t
+il5str
+il7su
+il3s2v
+ilsva9ra
+ilsva5re
+ilta9la
+ilt5rett
+il6t7å
+ilu4h
+i5luk
+il7ul8
+il3un
+i5lur
+i9lus
+il1ut
+il5v6
+ilve8d
+ilve4r
+i1ly
+il1å8
+ilår6
+8im.
+4ima
+i2mad
+i4maen
+i2mag
+i6m5akk
+i4mako
+imal8n
+i2mam
+i9man
+i2map
+i5mar.
+ima5s
+i4matr
+i8mb2
+i4mee
+i2me1g
+i2mek
+i6melu
+im5enh
+im8et
+i9met.
+i4meta
+i4meti
+i6mey
+i8mé
+imi9la
+imini6
+i7mj
+im4lev
+im8l9u
+im5m
+i6mog
+imo9l
+im5ord
+imor8da
+im7o6v
+imp2
+5imperi
+imp4l
+1impo
+imp9s
+impse8
+1impu
+im4ref
+im4rek
+im4res
+im9se
+ims4k5l
+ims3kr
+im5s4me
+im1s4t
+im6sti
+imta8la
+4imu
+i3mø2
+2in.
+6ina
+i4nag
+in5agg
+i5nakk
+ina4let
+i4na2m
+in3ame
+in2an
+i9nane
+in5ann
+i2nap
+in5app
+i5nar.
+i5nars
+i4nask
+i4nasp
+i4n5ass
+ina4t5ak
+i6nau
+in7auk
+in5avl
+in5avr
+ince2
+in7der
+6indig
+in4dog
+ind9ra
+in3dru
+indr5ø
+ind5sk
+ind3sp
+ind5s4t
+5industr
+ind7å
+4ine
+ine8are
+i2ned
+inedy6
+in5egg
+in5eid
+in3eie
+i6nele
+ine4li
+in7eng
+ine8pa
+ine8pe.
+i7nere.
+i5neren
+i9neres
+ine4rik
+i7nern
+i5nert
+i5nes.
+i4nesk
+ines8ka
+ines8ke.
+ines4st
+ine5s4ti
+i4nesø
+i2nev
+8iné
+3infek
+in4fos
+in4fot
+infu9
+4infy
+in4g5ald
+in4gav
+in5gebj
+in6gem
+5ingeni
+in5geri
+in4geru
+in3gev
+ing5jen
+in4goa
+in4gos
+in2gr
+ing5rep
+ing7ris
+ing2s
+ings5om
+ingst8
+ings5v
+6ingu
+in2g5ø
+i7nia
+ini9ar.
+i2nib
+i5nie
+i4nif
+i2nig
+i4nil
+ini7m
+i4ninn
+i2nip
+i4nisa
+ini3se
+i4nises
+5initia
+i4nito
+5injek
+2ink
+in5kel
+in4kero
+in4k3la
+in4kok
+in5l
+inla8ga
+2inn.
+in4nal
+in4nem
+in4nerø
+in4nesi
+innes6t
+4innet
+in6n7ette
+innfa9s
+1inng
+5innhal
+3innho
+2inni4
+in4ni.
+in4n5om
+in5n6ova
+inn1s4
+6inns.
+3innsa
+inn5se
+inn9sen
+inn9ste
+inn7sve
+1innt
+in4n5u4
+4innæ
+in2nø4
+2ino
+ino5a
+i5noar
+i4nod
+inok6
+in7oks
+in1s
+4ins.
+8insa
+in9sa.
+in7sal
+in5sar
+in5se.
+in4sek
+in3sen
+inseri8e9ne
+in3si
+insis5
+6insj
+in4sja
+in3sje
+4insk
+in9s8kas
+in5skat
+inske4t
+ins4ki
+in3skj
+ins5kjøt
+ins6kor
+ins4k3v
+ins6kø
+insle7g
+ins8lega
+in3slo
+in3s2lø
+in5s4ma
+in3sop
+1insp
+in4spa
+in5s4pl
+ins4po
+5instal
+in8s5te.
+ins5ten.
+ins9tens
+3in3s4ti
+in4stin
+4in3s6to
+in5stra
+inst5rel
+5instru
+in6stå
+in7sul
+in2sv
+6in3sy
+8int.
+2in3ta
+inta8la
+4inte.
+5in7teg
+in8t7ege
+in5ter
+int5ess
+in5te4t5
+4in5ti
+inti5me
+int2r
+intran4
+int4rer
+in5tres
+6inu
+inu6i
+i8n9ul8
+in7ut.
+in9u8te
+1inv
+6invev
+iny4i
+iny4t
+6inø
+in7øk
+i7nøt
+in3øv
+4io
+io1a4
+i2ob
+io4dere
+i1off
+io5gn
+io1i
+i1oks
+iol4
+io3le
+iol7jen
+io3mu
+io4nans
+io4narr
+io6n5erst
+ion3g4
+io4nin
+io4nu
+io1pl
+i1opp
+io5ra.
+ior8da
+io1re
+io4rie
+io4r5in
+iorla8ga
+iosk3v
+io1st
+iota6le.
+io3t4e
+io4tra
+i5pap
+ipa4ti.
+i4pee
+ipela9
+i7pe6p
+i1pi
+ipi1e
+ipi9ne
+i4p5ings
+i1pl
+i2ple
+ip4peli
+ippel7s6
+ipp6lan
+ipplæ8re.
+ip2pr
+ipp4s3t
+ippsy8na
+ipp4sø
+ip7pun
+i1pr
+i6pra
+ip5ru
+ipru8te.
+ips1a
+ipse4l
+ipsfø5
+ip2si
+ip2s1k
+ipsle6ge.
+ips1t
+ip6tar
+i5py7
+i3pø
+2ir
+i1ra
+i9r6and
+ir5ark
+i9rast
+ira6tr
+ir5de
+ird5s
+i1re
+ir3eie
+ir6ek
+i3repo
+i3rer
+ire6r5a
+ire7st
+i3ret
+i8reto
+ir7g
+i1ri
+iri4a
+iri8ka.
+ir3ind
+ir3inn
+ir5inst
+iri9t
+ir5ka.
+ir4kat
+ir5ker.
+irke3s6
+ir4kest
+ir4kle
+ir5kv
+irk5ø
+ir4mag
+ir4mal
+ir4mast
+ir9mé
+i5roa
+i1roe
+i4roi
+i1rol
+ir5opp
+iro1s
+ir3re
+ir7sko
+irs2p
+ir3s4t
+irt6
+ir3ta
+irti6g5r
+i1ru
+ir5u4k
+iru8m
+iru7sa.
+i1rø
+i1rå
+ir7å6l
+i1sa
+i4saks
+i4sanb
+i4s3ang
+is3ann
+i4s3ans
+is3ant
+i7sas
+is5aud
+3isbry
+is6cen
+isch5
+is3co
+i5scr
+i2sed
+i4seel
+i4seen
+ise5ern
+i2s2e3g4
+i2sei
+is3eie
+is5eig
+ise5is
+i2sek
+i3sekt
+i4sekte
+i6s7eld
+is4e5li
+i2sem
+ise5ne
+i4seno
+isensi6
+i5ser.
+i5sers
+i2ses
+is5ess
+i4sete
+iset8je
+i2seu
+8isé
+isha7ne
+3ishav
+is4h5in
+ishø9ve
+isi6ene
+is5ild
+i4s3ind
+isis5t
+is7jun
+is9ka.
+is3kal
+is3kar
+isk9art.
+isk5arte
+i8ske
+is5ke.
+is8kee
+is4kel
+isk5els
+iske5s4
+is3kje
+i3skjo
+iskla8ga
+is6k5le
+isk3lo
+isko5g
+is7kogr
+is3kop
+is3kot
+is1kr
+is6k5rin
+is1ku
+is4kul
+i5skula
+is1kv
+is4kvi
+is1l
+i6slu
+isl7ut
+isl9øy.
+i5smak
+is4med
+ismo5e
+i6smus
+is5ne
+is5nu
+1isol
+6isold
+5isomo
+is5omr
+iso3pa
+iso5pe
+iso7pr
+3isot
+is1ov
+is1p
+is4pan
+is5pane.
+is6pis
+is7pru
+is4ses
+is5si
+issis5
+is6s7kj
+is4sko
+is7skr
+is5sky
+is4skå
+is5sok
+is7sto
+is6sve
+is5svo
+is9s4ær
+is4søk
+i5stab
+ista9le
+is5tane
+is5tap
+i4s5tar
+ist5avb
+ist7avi
+i2ste
+is5te.
+is4tek
+ist5ekt
+istel5l
+iste6ma.
+ist6en
+is5ten.
+is5tene
+is5ter.
+is5tern
+is6terø
+is6té
+is4tik
+is5tilb
+is5tis
+is3tok
+is3tol
+i2str
+i8s8tre.
+i4st5ren
+i5strer
+i6strer.
+i4stres
+i6stret
+is3try
+is3tus
+6isu
+is5uf
+is5ul
+is1un
+is1v
+is4vak
+is7w
+isy8na
+isy5r
+is5yt
+i2s1øk
+i4søy
+is7åk
+is3år
+i1ta
+ita4l3a
+ita6l5ers
+ita4lo
+ita4ly
+i6tang
+itan7s6v
+itau4
+i4tav
+i4tec
+i2teg
+ite8ke.
+i7teky
+i6t7elg
+i4teni
+i2teo
+ite3re
+i4tero
+iter6s5
+i4te5ru
+i2te1s
+ite6se.
+itet6s5
+i1té
+it2i
+iti6er.
+i4ties
+i2tif
+i4tikam
+i4ti3kv
+iti5me
+i2tio
+i2tip
+iti3r
+i4tisa
+i4tisen
+i4tisi
+i4tisj
+i4tisko
+i4ti3sp
+i4tist
+iti5str
+i2tiu
+itiv4
+itivs5
+it7jaran
+it7jer
+it7ji
+itma6le.
+itnes4s
+i1to
+ito9a
+i4tom
+it5ord
+ito4s
+itostra6
+ito8v
+i1tr
+i4tra.
+i6trae
+it3rel
+it3ren
+it5rim
+itri8ma
+it3rin
+i5tris
+it7ro6s
+it1sa
+it4s3ei
+it3ser
+it6ses
+it5sku
+itsla8ga
+it1sn
+it6sti
+it3sun
+it4tag
+it6tak
+it4tal
+itta9la
+it6tann
+it6tap
+it4t5at
+it5ted
+itte4l5o
+it4tenk
+itte5s4
+itt5ett
+it4tid
+it4til
+it4tj
+itt1o
+it6tof
+it7ton
+it4tr
+itt5skr
+itt4sø
+it4ty
+it7tys
+i1tu
+itu5e
+itær1
+i1tø
+i5tå9
+i1u
+iu6a
+iu2b
+i5u6l
+i5um.
+ium4f5ar
+iu2m1i
+ium5m
+iu4mo
+i6umse
+i4um5s4t
+i4umsu
+iu2n
+iu8p
+i2ur
+iu5se
+4i1va
+i4vad
+i6vaj
+i4v3aks
+i5val
+iva6la.
+i4vana
+i4v5ank
+i4varb
+ivar5s6
+i4v5ass
+ivat3t
+i1ve
+i2veg
+ive6ge
+iv5eg6n
+i4vei
+iv7eig
+i2vek
+ive4ra
+ive5ras
+iver5d
+i6veret
+i4vesk
+i4vesti
+i6vesv
+i6vetø
+i2vev
+i1vé
+i1vi
+iv5ins
+iv5is.
+iv5isb
+ivle6ge.
+iv3n
+i1vo
+iv7om
+iv3r
+iv4sal
+iv2si
+iv2sk
+iv2sl
+iv2sn
+iv4so
+ivs5v
+i2v3un
+iv7y
+ivyr8ke.
+i9væ
+iv7åpn
+i1wa
+iwi5
+i5wie6
+i5y
+iyr8ke.
+i5za.
+i7zas
+i4ze
+i1zo
+i1ø
+i1ø4k
+i1ør.
+iør5i
+iør5s
+i4øs
+iø3se
+i1øy
+i1å4
+iårs7l
+iåt4te.
+ja1ak
+ja9ar
+ja4da
+1jae
+ja7en
+5jag.
+ja4ga.
+ja7gar
+ja4ge.
+jag6r
+ja4ha
+ja4hv
+ja4j
+jak4kel
+jak7kele
+jak4ko
+jakk5s4
+ja1k8r
+ja8kre
+jaktel
+ja7ku
+ja3lo
+ja1lu
+jam7b
+6jambi
+jamhø8ve.
+5jamm
+jams2
+jan4gr
+j5anl
+ja6ra.
+ja6r5ap
+ja9rek
+jarn3s4
+jar5ta
+jar5te.
+jar5tet.
+jar7ti
+6jarø
+ja6rå
+ja7se
+ja8ski
+ja5sti
+ja5ta
+jau4ere
+ja9vi
+1jaz
+j1b
+2jd
+j2e
+2je1a2
+je5ak
+2jeb
+jeb9b
+je4deb
+6je4dek
+4jedr
+jeep1
+6jeev
+2jef
+je4f3et
+je2fj
+jef5lag
+je4f3re
+jef4sa
+jef6s5i
+jef3t4r
+je5ge
+jeg5ge
+6jegl
+jeg6les
+4jego
+4jegr
+4jegy
+2jeh
+je1i
+je5i8s
+4jej
+2jeka
+jek6keru
+4jekl
+je4kli
+2jeko
+jekt3a
+jek4tan
+jek6tes
+jekt5ev
+jek4t5in
+jek4t3r
+jekts4t
+4jekø
+2jel
+je6legr
+jelei7er
+je7lele
+je4les
+jel7ge
+jel6lag
+jell5ang
+jel5len
+jel4lo
+jelt3
+jel4tr
+jel9ut
+jel7va.
+2jem
+je4mia
+je4mit
+jemp6
+jem5pl
+jem5se
+jem4sti
+2je7na
+jen1d
+4jendr
+je3ne.
+je7ne8s
+4jenet
+jen5ged
+jeng5s4
+2jeni
+jen3k
+4jenl
+4jeno
+4jenu
+je2n1y4
+4jenæ
+2je5o4
+2jep
+je3raf
+je4r5ant
+jer4dep
+jerd6s
+je3r6e
+4jered
+6jereg
+6jerei
+6jerenn
+je5rik
+je6rim
+je6rinæ
+jer4kes
+jer6k5l
+jer4kv
+jerle7
+jer6mu
+jer6n5as
+jern5sl
+je6ron
+jer4sp
+jert5s
+4je1ru
+6jerå
+5jesf
+5jesh
+jes4kil
+2je3sp
+jes4tea
+je6stim
+je3str
+5jesut
+je5sve
+je4t3ag
+jeta6ka
+je9tar.
+je7tara
+je9tare
+je4t3ru
+jets2
+jet4t5an
+jet6term
+jett3o
+jett5s6
+je4t3v
+jety8e
+2jeu6
+4jev6a
+je7vark
+je6vas
+4jeve
+jevi4s
+jev7na.
+jev7ne
+6jeø
+j1f
+4jg
+j1h
+4ji.
+jib5b
+ji7e6
+6jik
+2j3inf
+ji7ro
+ji6sj
+4jiø
+2j1k
+j4kap
+6j1l
+6j1m
+6j1n
+6jn.
+j5ni
+j2o
+1job
+5joc
+jo4da.
+jo6dat
+jo6dis
+jo4fl
+jok9ker
+jokk9o8
+jol5t6
+j3omr
+jon2
+jo5ne
+jon7n
+jons1
+jons5a
+jonse4
+jons3p
+jons5t
+jon6sti
+jon4str
+jonsu4
+4jop
+jo5ra
+jor6dek
+jor6d7erv
+jor6d7is.
+jor4d3o
+jord3r
+jord5s
+jords4l
+jor6du
+jo1re
+jo4rie
+jort6a
+jor5tet
+jo3r4u
+2jos
+jo3se
+jo4ses
+jo5stei
+1jou
+jour5
+j1p
+4j1r
+2j3s2
+j1t
+ju8are
+1jub
+jubi3
+ju9bo
+ju3de
+ju2do
+ju7doe
+jue7ni
+ju4e5re
+jue9s
+jug9le
+5jugo
+4ju2k
+ju3ka
+ju3ke.
+ju3ken
+juk9sar
+ju2l
+ju3la.
+ju5lar
+ju5las
+ju8l9ei
+ju4li.
+ju6lid
+ju4lik
+jul7inn
+jull6
+1jung
+jun7ge
+j6u6ni
+8jup
+jup7s
+ju6p5å6
+ju4ra
+ju7ras
+3juris
+ju9ro
+ju3ru
+5jury
+1jus
+ju5so5
+ju1ta
+jut5o
+ju6va.
+ju6vak
+ju1å
+j5v
+jy1
+jy8de.
+jy2p3
+jæ5le.
+jæ3ra.
+jæ9ran
+jæ9res.
+jæ7te.
+j2ø
+1jø.
+1jøa.
+jø5b4
+1jøe
+2jøef
+4jøeg
+6jøei
+2jøek
+4jøend
+4jøeng
+4jøeta
+jø1f
+jø3gr
+jø9kj
+4jøl
+jø4les
+jøl6ver
+jø5me
+jøn5ne
+jø5pa
+jør4kel
+jør4sp
+jørs5v
+jør4tel
+jø3ru
+jør7ut
+jø1rø
+jø4ses
+jøst2
+jø5ta
+jø6t7av
+jø3te.
+jøte4t
+jøt5eta
+jø1tr
+jøtte4
+4jø1v
+jø4vel
+2jå
+jå5ar.
+jå9ge.
+jå6la.
+jå4le.
+jå7les
+jå5let
+1ka.
+2kaa
+5kaa.
+5ka4an4
+k3aas
+ka3at
+6kabes
+ka7bo
+4ka1br
+4kaby
+ka3da
+6kadale
+ka5del
+ka6del.
+ka4deri
+4kadg
+kadi7e
+2kadr
+5kadu
+4kady
+3kaen
+ka3fe
+kaf5fere
+2kafo
+ka9fr
+2kaft
+kaf5ta
+6kafø
+2kag
+k5a4gi
+kag2r
+2kah
+ka5isk
+ka5ism
+6kajo
+ka4ka.
+ka4ke.
+ka4ked
+ka4kel
+ka4kes
+ka4ki.
+ka4kis
+6k5aksj
+4kakt
+ka3ku
+ka3lam
+ka3lan
+ka6lant
+ka3las
+kald5s
+5kaldt
+kal2e
+3kalen
+ka5lev
+5kalis
+k6alk
+5kalky
+kal7la
+kal6lero
+kall4s
+ka1lo
+kal3p
+kal7s6v
+kal4ves
+1kam
+ka6ma.
+ka8me.
+4kameri
+4kammel
+kam4p3i
+kam4pr
+7kamu
+1kana
+ka8na.
+4kanda
+kan6da.
+5k6ande.
+1kane
+ka5ner
+kan4i
+ka5nin
+2k1anl
+4k1anm
+k3anno
+5kano
+ka4no.
+ka8nom
+4kansa
+6kansi
+3kansl
+1kant
+kan6t7end
+kan6t9r
+2kap.
+5kapad
+ka4pak
+3kapas
+ka5pe
+5kapell
+4kapen
+3kapit
+1kapp
+kap3re
+kap4s3t
+1kar.
+1kara
+4karab
+4karam
+karan5
+ka3rav
+1karb
+4karbei
+4karea
+ka6rek
+ka5rel
+1karf
+5karg
+ka4ri.
+ka6rid
+6k3arki
+6k5arkt
+1karm
+kar3n
+ka3rol
+kar3om
+kar5pes
+karp3s
+3karri
+7karsj
+kars4t
+1kart
+kar5ti
+5karu
+4karå
+1kas
+7kas.
+ka5se4i
+ka3sek
+kas5ev
+kas2ju
+6kasjø
+ka4sk
+kas3ka
+kasko5
+6kasp
+ka4spi
+kass6
+kas6sad
+kas4sak
+4k3assi
+kas4so
+ka4st
+8kas5to
+kas2t3r
+1ka7t6a
+ka3ted
+3kateg
+ka3tet
+ka1to
+ka4t5op
+4ka1t4r
+kat7s
+kat5ta
+kat4tel
+kat6term
+katte5s
+kat4til
+kat4tri
+ka4t5y
+k7au4r
+2kav
+ka7ves
+k9avis
+kav8l9u
+9kay
+6k1b4
+2kc
+k5ce
+kcen4
+2k1d
+k5d6v
+1ke
+2ke1a8
+ke9al
+2keb
+4kebr
+4kebuk
+4kec
+ked4
+ke5da
+4kedag
+4kedal
+5kedan.
+9kedant
+ke5de
+6kedei
+4kedem
+4kedes
+7kedes.
+2kedi
+2ke5dr
+ked8sk
+kedu6
+4kedy
+2kedø
+2keeg
+2keek
+2keel
+ke4ep
+ke7ern
+2keev
+4kef
+k3eff
+k5eft
+2ke1g
+k3egg
+keg8ga
+5kegladh
+ke5h
+3kehet
+4kehj
+2kei
+k3ei2d
+k1eig
+ke5il
+ke1im
+k6e1in
+keis2
+2kej
+2kek
+kek2l
+ke3kn
+k1eks
+k5ek4t
+k6el.
+2kela
+ke3l4ak
+5kelal
+ke6lans
+ke6lat
+kel5eier
+kel5eig
+kel7eik
+kelei8ke.
+6keleis
+kel3e4l
+4k5elem
+4keleng
+4ke5lep
+4keles
+7k6elet
+4kelev
+keli8e8
+keli9en
+3kelig
+4kelign
+4kelinj
+kel5int
+4kelis
+ke4lise
+5kelit
+4keliv
+kel5l
+4kelof
+6kelov.
+4kelove
+kels4
+kels7kar
+kel5sl
+kel5sp
+kel5st
+kel3sv
+kelsva9
+kel2t
+kelt3e
+6kelua
+4kelue
+kel9uka
+kel5uke
+ke4l3ur
+6keluv
+kel5v
+2kely
+2kelæ
+2kelø
+kelø8pa.
+6ke5l4å
+kelå7re
+2kem
+ke4mit
+5kena.
+6kenam
+ken6ap
+ke4nas
+5kenatts
+ken5de
+6k5en6den
+6k5en4der
+4kend5r
+ke3ne
+4keneb
+4kenek
+4kenel
+4kenem
+6kenett
+4kenev
+3kenf
+ke4ni
+5k6enh
+4ke5niv
+ken3k
+ken7n
+kenne4l3
+ke4nom
+ken1s2
+4k5ense
+kens6t
+ken7te
+ken5t6r
+4k3entu
+6ke3ny
+6kenø
+2keo
+ke3on
+4kep
+5kepi.
+9kepia
+7kepie
+6kepl
+kera7l
+4keram
+ke4ran
+ker5ant
+6kerau
+4kered
+4kereg
+kerei4d
+4kereir
+6kereis
+4kerek
+4ke5rem
+kere6n
+6kerene
+ke6r5eng
+4kerenn
+4kerep
+ke4r5ert
+ke3res
+4keress
+4kerest
+4keresu
+4keret
+5keret.
+5kereta
+7kerets
+3keri
+ke4rif
+6kerik.
+4kerike
+6kerikt
+ke4rim
+ke4rine
+6keringi
+6keringj
+ke4rinæ
+ke4ris
+8kerist.
+8kerista
+6keriste
+3kerm
+7kerop
+5keror
+4ke3ros
+kero6se.
+ke3rot
+k4ert
+ker5to
+ker3t4v
+ker3un
+4kerus
+keru6se.
+kerø6re.
+8ker8øya
+6ker6øye
+2kerå
+5kes.
+4kesam
+9kesam.
+7kesdale
+5kese.
+k5esel
+ke5sil
+4kesit
+2kesj
+k9es8ka.
+4k5eske
+kes8ke.
+4keski
+4keskj
+6keskå
+kesle6ge.
+kes5ped
+5kespot
+5ke4spu
+5kest.
+4ke3sta
+5keste.
+4ke5sted
+4ke5stei
+kes6tem
+4ke5s4ten
+ke3sto
+4kestri
+4ke5stru
+4kestu
+4kestø
+ke4s5un
+kes1v
+2kesy
+kes1å
+2keta
+keta6ka
+keta6le.
+5ketals
+k6etar
+ke3te
+5kete.
+4ketek
+7keth
+2keti
+2ketj
+2keto
+2ket2r
+kets2
+ket6t7enh
+ket8tes
+2ketu
+2kety
+kety6e
+4ketæ
+ketøy6s5
+2ketå
+2keu2
+ke5ur
+2kev
+kev2a
+keva8ne.
+5kevas
+3kevel
+kevi6sa.
+k1evj
+kev6ja
+kev4je.
+k3evn
+kev6ne.
+ke3vr
+kevæ8ra
+ke2yt
+6keæ
+2keø
+2keå
+1ké4
+két5
+2k1f
+k5fi
+4k5g2
+k3ge
+k5gh
+kgu4
+4k1h
+kh5ak
+k4har
+khe4o
+khjul8s
+kh6m
+ki3a2r
+k3ideo
+4kidol
+ki3dr
+k4ie2
+kie5re
+ki6el
+ki3er.
+2kif
+ki5g4
+ki6ka.
+kikk8s9
+ki1k8l
+ki3k2r
+kik4s
+ki8la.
+3kilde
+ki4le.
+ki5li
+4kilj
+kil9ja
+kil6le5st
+ki7loa
+ki4log
+ki3los
+ki4lov
+2kilt
+ki7lå
+ki8ma.
+ki4me.
+5kimo5
+ki4mol
+2k1imp
+kin9and
+ki4nark
+ki5nas.
+6kind
+ki5ne
+ki6ne.
+2kinf
+1king
+king5and
+kin3ge
+kin5ing
+2kinn
+kinnsi8da
+kinnsi8de.
+kinn4sp
+ki2no
+2kins
+kinsi6de.
+2kint
+kinti8me.
+ki6nu
+2kinv
+kio4
+4kiol
+7kios
+2kip
+ki5pe
+ki4p5l
+kip5pe
+kip2s3
+1kir
+ki5re
+ki5ri
+4kirs
+ki3se
+ki5sko
+ki3smu
+ki1s2p
+ki5stav
+ki5str
+ki6ten
+ki7ti
+5kito
+ki4ton
+4kiu
+k6iv
+ki4vek
+ki4v5enh
+ki6vi.
+kiv3s
+kj2
+3k8jan
+kjap5pe
+6k7jarn
+kje7fj
+kje7f6r
+4kjegg
+3kjeld
+kjel7leg
+5kjemas
+3kjemp
+6kjenk
+kje9ny
+kje1s
+kje6t5r
+kjet5t
+6kjor
+kju5le.
+kju5len
+kju9r
+3kjærl
+k5jødi
+1kjøp
+3kjøri
+kjø4tr
+2kk
+k1ka
+k2kab
+kk3aft
+k2k1ak
+k2k3al
+k2kam
+k4kanb
+kk5and
+k8kand.
+k6kanden
+k4k5ang
+k4kann
+k4kao
+k4karb
+k6karg
+k4k7art
+kkar6ta.
+k5kast
+k6kasu
+k6katt
+k2k1au
+kk1av
+k6kedo
+k4kedu
+k2kee
+k2keh
+kk1ei
+k5kel.
+kke6lei
+kk5e4lev
+kkel3t4
+kkelu4
+kke4luk
+kkel5un
+kke6nan
+k5ker.
+k4kerei
+k4kerel
+k6kerent
+k4kerig
+k4kerit
+kke5r6und
+k4kesa
+k5kesau
+k4kese
+k4kesi
+kke3s4l
+k4kesp
+k6kestad
+k4kete
+k5ketet
+k4ketø
+k4k9g2
+k1ki
+kk3ind
+kk3inf
+kk9inn
+kk3ins
+kk3int
+k2kir
+k1kja
+kkjek8
+kk5jent
+k4k5jern
+kkje7t
+kk5ju
+kk5k
+kkla4g
+kk3lan
+kk8lar
+kk7lau
+kk1lo
+kk1ly
+kk3læ
+k4kn
+kk5ne
+kk5ny
+kk6s5v
+k1kod
+k1koe
+k4k1of
+kko6lig
+kk5oml
+kk7oms
+kk9omt
+k6koo
+kk1op
+kko7s
+k4kosi
+k6kosk
+k4kost
+kk3ove
+k4kra
+kk5ram
+kk3rap
+kk3rea
+kk5rei
+kk3ren
+kk3res
+kkri6k
+kk3ro
+kkro8e
+kkro4s
+kk3ru
+kk4rus
+kk7rø
+kk7rå
+kk7s
+kks6al
+kk4sar
+kk5sed
+kk3s4ei
+kk4sin
+kk1sk
+kks4kj
+kks4l
+kk3sla
+kk7sle
+kk5sli
+kk3spe
+kk1s2t
+kks5tak
+kks7tep
+kkst4r
+kk8s7va
+kk5s4å7
+kk3t2
+kk5uk
+k4kuni
+k2k1u6t
+kk1v
+k2kvo
+k1ky6
+kkyl4
+kk5yr
+kk7yt
+k2k1ø
+k8køl
+kkø6r
+kkøy6
+kk1å2
+kl4
+6kl.
+4kla.
+4k5lagt
+2klak
+kla9ke.
+kla4mel
+3k2las
+k7lati
+kla4tr
+kleby7t
+3k4ledd
+kle4deb
+kle4des
+2kleg
+klei9e
+k7leik
+k4leiv
+k2lem
+5k6lem.
+7k4leno
+k6lerik
+kles7j
+kle5sno
+kle4sp
+kle5sti
+kles7s8
+2klet
+8klia
+4klie.
+4klig
+1k2lim2
+3k4lini
+k5linj
+1klip
+4klit
+klon7a8l
+1klos
+2klov
+k3lukt
+4klun
+klun5t
+k5lyd
+6k7lyf
+3k4lyng
+klyse7te
+k2læ
+klæ5res
+klø7na
+k6lør
+6kløs
+klø9va
+klø5ve
+6k1lån
+klå5re
+2k3m
+kmann6
+kmål2
+2k1n2
+3k2nap
+kna5t4re
+kne4b3l
+k4nedi
+5k2nee
+kne8se.
+k4nest
+kn5f
+3k4nip
+knippe6
+kni2t3
+3k2niv
+kno7g
+kno6kl
+5knop
+kno9ta
+kno5te
+3k2nu
+4k3num
+3k2ny
+kny4s
+k2nø
+knø9le
+kn3øy
+9koa.
+4ko1ak
+9koane
+ko7ar
+ko2b3
+ko3bo
+4ko3br
+ko5da
+4kodd
+ko4de.
+3kodek
+5koden
+2kodø
+ko3e
+3koef
+4koek
+4koel
+4koes
+4koev
+ko4g5eng
+kog9ger
+kog3l
+ko4gre
+kogst6
+ko4gu
+ko6gå
+2koi
+koi4e5ne
+ko7i6k
+ko1in
+2koj
+ko8ja.
+ko4ka.
+ko4kab
+ko4ke.
+ko6kel
+ko1ki
+kokk6o
+k3okku
+4kok4l
+4koko
+2koku
+kolba5
+2kole
+ko4leg
+ko4lei
+ko6lel
+ko4let
+ko4leu
+3kolle
+ko5lo.
+kol5p
+4koly
+2kolå
+1kom
+ko4ma.
+4komaf
+ko4me.
+6komg
+ko4mi.
+4komil
+4komisb
+ko4mise
+2komr
+4komse
+kom3sl
+kom5so
+kom4st
+4kom5t
+4komu
+4komå
+k6on
+ko4na.
+kon3d
+kon6dr
+kone5l6å
+4koniv
+kon3s2
+kon6s7v
+kon6ton
+ko4nu
+1ko1o
+4koom
+ko5pa
+ko5pers
+4kopet
+ko4pi.
+ko4pip
+ko4p9l
+4kopo
+kop5per
+2kopr
+ko1ra
+ko4ra.
+kor6da.
+kor4d3o
+kord5s4ø
+kor4du
+ko1r6e
+6koref
+4ko7rei9
+ko5rem
+ko7ret
+ko3ri
+ko6rik
+4korm
+ko5rol
+6korpa
+6korpe
+1kor3r
+kor4sal
+kor6s5inn
+kor4s5l
+kor6str
+kor4sv
+kor5tes
+kor6top
+kor4t5r
+kort5s4
+ko5ru
+ko6rume
+1kos
+2kosa
+ko6sa.
+ko4sed
+ko4sek
+5kosele
+ko5sen
+ko4ses
+ko9si
+kosi9d
+ko2sk
+ko1sl
+4kosmu
+2koso
+2ko1s2p
+ko6sta
+kost7as
+kos6t5ers
+kost5j
+4kosø
+kotes7
+ko5t4i
+4kotil
+4kotr
+ko6tre
+kot2s
+kots5tr
+kot4ti
+kott4s
+kotts5t
+4koty
+2kou4
+kout3
+kou7ta
+ko1va
+kover7e
+4kovr
+1kov4s3
+4koø
+4koå
+6k1p
+kr6
+k3rad
+1k4raf
+5krag
+3krakk
+krani6e7n
+6krank
+3krans
+4krap
+kra9se
+7k8ra4sj
+kras5s
+kra4to
+kra4u
+1krav
+4kred.
+3kredi
+4k1reg
+kregi3
+4krei
+krei9e
+krei5s
+6krek
+kre4kli
+2krel
+k5rela
+4k3renn
+4krent
+6kreo
+k5repr
+5kreps
+5kresj
+4k3ress
+kreta9
+6k7retn
+k4rets
+k3rett
+2krib
+4krif
+7k6rig
+krig6s5
+kri9ga
+4krik
+kri5ke
+kri4kj
+krik6ka
+1krim
+kri4me
+3k6rins
+krin6s7t
+kri2p
+1k2ris
+7krisene
+k2rit
+3krite
+6kriv
+k2ro
+kro5b4
+kro5de
+k3rofo
+k4rofor
+krok7k
+k6roni
+k5ronl
+kro4nom
+k4rop
+krop9n
+kropp4
+k4rost
+kro9t8e
+kroten9
+kro3v
+kru3i4
+krum3
+kru5sa
+krutt5i
+kru3tr
+2k5ryg
+kry7pa
+kry5pe
+kry4pi
+3krys
+krø5ke
+6k5rør
+krø3v
+4kråd
+krå8da
+kråe6
+5kråk
+krå5le
+krå9m
+krå7ne
+k1sa
+k3sa.
+k2s3ad
+ks3alt
+ksa5me
+k3sane
+k4sans
+k4s3ant
+k3sar.
+k7sara
+k6s3ark
+k7sas
+k1sc
+k2sed
+k2see
+kse6ge
+k2s1ei
+k5sekt
+k5sela
+kse5lev
+ksen5to
+k4serf
+ks3erk
+k5serol
+k4sesa
+k4ses6k
+k4se3sm
+k5seso
+kses4p
+k5sess
+kses6sel
+kses8serie
+kses4sp
+kses4st
+kse6te.
+ksfø4
+k5sia
+k2sif
+ksi5ko
+ks3ind
+k3sing
+ksi7ni
+ks3inn
+k4s3ins
+k7sio
+ksi3st
+k4siti
+ks9kab
+k6s3kal
+k6skio
+ks1kj
+ks5kl
+ksko7na
+ksko5ne
+ks1kr
+ksk8u
+ks9ku.
+ks7kua
+ks8kut
+ks1k6v
+ks1l
+ksla8ga.
+ks5lo
+k7s6lu
+k8s7lug
+ks5løs
+kslø8va
+kslø8ve.
+k5s4mak
+ks4mel
+ksmå
+k5s4no
+k7s8nø
+k1so
+k6s7oa
+k6sod
+k4sog
+k4somb
+k2s1or
+k2sot
+ks1ov
+k3spal
+ks3pek
+ks5pio
+ks3pir
+kspor6t5r
+6k6s5pors
+ks1pr
+k8sr
+k3spy
+kss6
+ks3sm
+k5stad
+k4stak
+ks3tal
+ks5tant
+k7s8vak
+ks6tav
+kste4da
+ks4teg
+k3stei
+k4stek
+kst3ev
+kstev6ne.
+ks4til
+k4stin
+ks1tj
+ks1tr
+kst6ran
+ks4t5rek
+k6stren
+k6strer
+ks4tri
+ks4tro
+ks9tum
+k5stus
+ks3tyv
+k2stå
+k1su
+k6sun
+ks1v
+k9s8vake
+ksva8ne.
+ks5veg
+k7s6vert
+k5s4vin
+ks5w
+ksy8na
+ksy8s7m
+ks5ær
+ksø4ke.
+k6s3øl
+ks1å
+k3så.
+k4såp
+ksår4
+ksåt4
+6k1t
+k5ta.
+kta7f6
+k4tag
+kta6ka
+k4t3aks
+k4takt
+kta6la.
+k4t3ana
+kta9na.
+kt3anl
+k4t3ann
+k4tanv
+kt3app
+k9tar.
+k4t3arr
+k4t3art
+k6tass
+k5tast
+k6t7atl
+kt5avh
+kt5avk
+k6t3avl
+k3ted
+k4teda
+k6tee
+k4tefø
+kt5e4ge
+k2te5i
+k6teka
+kte5le
+k6t5elsk
+kt5e4lit
+ktem8
+kt7emn
+k4t3enh
+k9ter.
+kterie5n
+kterie7ns
+kter5s6
+k7tes.
+k6tesa
+k6tese
+kt5eske
+ktes6ke.
+kt5esti
+k4t5e4ta
+k4tete
+kt5evn
+ktev6ne.
+k5tib
+k3til
+k4t3ins
+k5tir
+ktis5t
+kt7i6te
+kti6v7end
+k2tja
+kt7ju
+kto9a
+kt5off
+k6togram
+k4toli
+k2tom
+kt5omf
+k2t1op
+k9tor.
+k7tora
+kt5ord.
+k5tore
+ktori9e8
+ktor7s
+kt1ov
+kt3ral
+k2t1re
+kt2ro
+ktro5s
+k2t1ru
+kt4s5amb
+kts5ar
+kt5sek
+kt7sem
+kt4s5er
+kt6sin
+kts5kra
+kt5sku
+kts4kv
+ktsle6ge.
+kt6sok
+kt4spa
+kt5spre
+kt4sta
+kts6ton
+kts5top
+kt4stå
+kt3t8
+ktu9er.
+k4tuk
+kt7und
+k2t1ut
+kt7yrk
+ktyr8ke.
+ktør7
+ktør8e
+k6t5øs
+kt1øv
+k2t3år
+ku2a
+ku9an
+ku4be.
+ku3bj
+2kud
+ku4dal
+ku4er.
+kue4r5a
+ku4et
+6kuf
+ku4f3l
+6kug
+k5u4gr
+ku7is
+kuit6
+6kuldi
+kuld3r
+ku4led
+ku4leg
+ku6lei
+ku4lem
+ku5len
+ku4let
+ku4lev
+ku5li
+ku6li.
+3kull
+1kult
+ku4man
+kumen6tal
+ku6mi
+kum2s
+3kumu
+1kun
+kund5s6l
+2k1ung
+kun4ge.
+k6unn
+ku4o
+1kup
+ku4pe.
+kup4pl
+ku7ra
+ku4rek
+ku8r7o
+ku7r6op
+kuro8pa
+1kurs
+kur6sk
+kur4sp
+kur4s3t
+kurs3v
+kur3t
+ku5ru6
+kuru9ken
+kuru7ker
+1kurv
+kur4v3i
+1kus
+5kus.
+ku7sa.
+kus5a6k
+kus5ar
+5kuse
+ku4s5el
+ku4ska
+ku7s6pe
+kus3t
+6k1ut.
+ku1ta
+4ku5te.
+ku5to
+ku6t7r
+2kuts
+1kuu8
+kuøy6
+kv2
+kva8ke
+k4vali
+k6vard
+kvari6e5n
+5k6vart
+kva9se
+kve3d2
+kve7e
+k6veil
+kvei9se
+1k4vel
+kve5la
+4k3verd
+5kvern
+kverns8
+2kves
+kves5t
+7k6via
+4kvid
+3k4vie
+kvi4ene
+kvi5er
+kvi7la
+3kvinn
+kvi5se
+7kvist
+2kviv
+1kvo
+k1vog
+6kvok
+k4vot
+k2vu
+4k3væ
+k1vå
+k7we
+k5wu
+ky5a
+ky6el
+4kyf
+kyf5le
+2kyg
+ky4leg
+2k3yns
+kyn6skjer
+ky2p1
+ky4p5r
+1kyr
+kyrie5ne
+kyr8ke.
+ky8sa
+4kyse
+ky6se.
+kyse8te.
+ky3skr
+kys6sk
+1ky4st
+kyst3a
+kys4tel
+2kyt
+ky6ta.
+kyte3s
+k1æt3
+1kø.
+kø2ar
+1køe
+kø4en.
+kø2er
+6k1øk
+kø4le
+k1øn
+køn6skjer
+k3ørr
+køs4
+kø5se
+køy7ar.
+k7øyd
+køy4e5ne
+1k6øyr
+4kåke
+kå3le
+kån8da
+kå5ne
+kå4pe.
+kå7pen
+kå9ras
+kå1re
+kå1ri
+kå2t5
+k5åt6t
+1la.
+2laa
+la1b
+4laba
+la6bl
+1labo
+2l3abon
+4laby
+4lad.
+l6ade
+la4dem
+4ladg
+ladi9e8
+2ladm
+2ladr
+lad3s4
+1lae
+2laei
+4laent
+4laep
+2laf
+la3fl
+4lagg
+lagi4
+6lagne
+la2go8
+lag5om
+la2g1r
+lag5san
+lag4sj
+2laha
+2la1in
+la5ka
+la4ke.
+4lakj
+l2akk
+la2kr
+l7aksj
+l5aksl
+4lakt
+lakterie6
+la5kø
+2lal
+l1alk
+la5mab
+4lamb
+la4mes
+la4met
+la3mo
+l8a8mu
+4l3anal
+lan2c
+lan6das
+lan6deb
+land3r
+l6a3ne
+3lane.
+4lanet
+lan6gel
+lan4gem
+lan6germ
+lan4gr
+lang3s4
+lang4s5e
+lan6g5ø6
+4lanl
+4lann
+l3anno
+la4nor
+6l5ansi
+lan5ti
+4lanv
+l3anvi
+2lao
+la6pal
+la7pi
+la8pl
+lap5sa
+lap5sen
+lap5s4i
+1l8ar.
+6l7arab
+2larb
+l8are.
+4l7area
+la9red
+la5rem
+l6aren.
+4larena
+lare6t
+la6r7eta
+5larf
+la7ria
+lariar
+lari6e7n
+4l3arki
+l2arm
+lar3n
+6l7arr
+4lart
+lar6ta.
+lar7vet
+la6sc
+la5se
+lasi9e
+la2sk
+7laskj
+4lasm
+la5smi
+4la4sp
+las6sak
+las6sam
+las6sat
+las6sel
+l6ast
+4lastr
+las3v
+la1ta
+lat5ang
+6latau
+la4teg
+lat6ek
+la4teno
+late5s4
+la5ti
+la6ti.
+4latm
+la1to
+lat7ra.
+lat9ran
+lat5rar
+lat4t5is
+lat4tra
+latt6u
+lau7a
+2laud
+laue6
+4laun
+4laur
+lau7se
+lau6st
+2laut
+2lav
+la4v5al
+la4vel
+l5avh
+lav5inn
+6lavs
+7lavå
+1law
+la6y5
+2l1b2
+lba3de
+lba4k
+lba5ke.
+lba4ne.
+l5be
+lbe9na
+lbe8re.
+l4boa
+l6buh
+lby4e
+l5bå
+2l1c
+l4ce.
+6ld
+l7da.
+ld5aks
+ld5akt
+l9dand
+lda6t5o
+lda6t5y
+l2deb
+l5den
+l2de5o
+l2dep
+l3der
+l7der.
+lder7a
+l4derek
+l6derik
+l6derklæ
+lderle9g
+lder5s6te
+lder6s5ti
+l4desh
+l6destr
+l9dé
+ldis7k
+ldo9a
+l8d5oks
+l2dol
+l4dore
+ld5ovn
+l3drak
+ld3ran
+ld5ras
+l6dre.
+ld7regn
+ld5rer.
+l8dres.
+ld1ri
+l7dry
+ld1rø
+ldse8
+ld4sek
+ld4sel
+ld4ses
+lds1k
+ld4ska
+lds4kj
+ldsla8ga
+lds6leg
+lds4let
+ld4s9m
+ld5s4om
+lds3tr
+ld6tus
+ldø2
+ldø5d
+ldø5l
+ld7øy
+1le
+2lea
+le7ag
+le3ak
+le1al
+lea5la
+3leas
+le5at
+2leb
+le4bem
+le6bosta
+5lebæk
+lec4
+2leda
+5ledar
+led4dø
+4ledeb
+le4dem
+6ledep
+le5der
+le3des
+2ledo
+3ledop
+5ledov
+le4dro
+le5dry
+led1s2
+6ledu
+4ledy
+2ledø
+4le3då
+2lee
+6leei
+6lefa
+lefa6ne.
+4l1eff
+2lefi
+4lefl
+4lefor
+4lefot
+2lefr
+l1eft
+6lefy
+4lefø
+6legap
+5legas
+3lege
+le4ged
+le9gen
+le4gera
+le9geran
+le9geras
+le4gero
+le4geta
+le4gev
+7leggi
+le3gi
+6legif
+4legj
+2le1g2l
+le4gol
+4legre
+leg3s4
+2legu
+2legå
+2leh
+6lehal
+6lehamr
+6lehan
+6lehau
+6lehave
+le3ido
+l6eie.
+lei5ende
+lei4e5ne
+l6ei8et
+leig6d
+lei4ger
+lei7ger.
+lei4get
+leig4h5
+leig6na
+leig8ne
+2lein
+le3int
+lei6r7u
+leis7t
+l6eit
+2lej
+2leka
+le4ka.
+6lekan
+lek6e
+le3ki
+2lekj
+lekk7s
+2lek2l
+2lekn
+lek4na
+2leko
+2lekr
+4l3ekso
+4leksp
+lekt5ord
+lekt4s5t
+2leku
+2lekv
+4lekø
+4lekå
+2le3la
+8l9eld
+2lele
+l3elem
+4l5elg
+5lelig
+2lelo
+3lels
+4l3elsk
+le1lu
+4leluk
+l5elv
+2lely
+4lelæ
+2lelø
+lelø6pa
+4lema
+le3me
+le8me.
+4lemet
+8lemetrisk
+8l9emn
+lem8na
+2lemo
+lem9ped
+lem5pes
+3lemr
+lem4si
+lem4s5ø
+2lemt
+lem5ti
+2lemu
+6lemy
+4lemø
+2lemå
+le4na.
+le4nal
+4lenav
+lend8a
+len9dan
+6lenden
+l6endre
+4lendri
+4lened
+4lenem
+4lenev
+l4engd
+len4g5r
+leng9u
+le5ni
+4leniv
+lensa4
+len4s5ak
+4lensem
+len5ses
+len4sta
+len4tam
+len4tr
+len8t9ra
+2lenø
+4lenå
+2leo
+5leol
+2lep
+le5pa
+le4pel
+le8p9enden
+le2p3j
+le8pla.
+le4ple
+4lepo
+4leraba
+4leram
+le2r3amb
+ler5d
+l8ere
+le9re.
+6lerea
+4leref
+4lereg
+4le9r8ei
+4lerek
+le5res
+4lereso
+4leresu
+4leret
+4lerev
+9leri.
+7lerie
+le6riei
+le7rina
+le4riv
+4l5ernæ
+le5ro.
+4lerom
+6lerope
+le3ros
+4le3rot
+7lers.
+lers4p
+ler7te
+le1ru
+4lerus
+leru8se.
+2lery
+5leryr
+2lerø
+2lerå
+5l6es.
+le4sab
+4lesam
+7lesar
+4lesau
+2lesc
+le5sed
+le4seg
+4lesek
+le5sen
+le3ser
+4leset
+4lesho
+le6si.
+4lesig
+le7sing
+les5inn
+4lesit
+4lesju
+le7skap
+le4s3kj
+6leskol
+le6sk9u8t
+4lesla
+2lesp
+6lespal
+les3s6
+lesse6ne.
+4lesta
+9lesta.
+7lestal
+le5sted
+le5steg
+le5stel
+le4stim
+le3sto
+4lestrø
+4lestyr
+4lestø
+4lestå
+4lesug
+les1v
+le5s6vi
+4le5sy
+4lesø
+5lesøy
+3let.
+le4tab
+6letak
+leta8ka
+leta8le.
+l5e4tas
+5lete.
+6letea
+4leteg
+4letek
+le5ten
+6letenk
+6le7tep
+le5ter.
+4letes
+2le3ti
+l5e4tik
+2letj
+2leto
+2let2r
+le7tre
+le5t4ri
+3lets
+let6sj
+lets8k
+let6tea
+let6tr
+lett3s4
+2letu
+le4tv
+2lety
+lety8e
+4letø
+8letå
+4leul
+2leun
+l1eur
+2leut
+le4ute
+2lev.
+le6vad
+le6valu
+le4ved
+4leveg
+4levei
+4levek
+6levern
+4le4vev
+levi6d
+lev5n
+2levo
+lev1r
+4levs
+4levæ
+lex1
+4leø
+2leå
+5lée
+1lér
+7lét.
+7lè
+5lê
+4l1f
+l4fa.
+lf5ant
+l5far
+l5fe
+lf3f
+l5fig
+l5f6in
+lf5ja
+l7fje
+l6f3nul
+l4fom
+l4fut
+2lg
+l6gaf
+lga8le.
+l4g5alt
+l4g3ana
+lga5t
+lga4ve.
+l2ged
+l4gela
+l4gele
+l2gem
+lge3na
+lge4r5an
+lge4rap
+lge5ri
+lger5un
+l4gery
+l4gesl
+l6ge7sp
+lg5g
+lgie8n
+lg1lo
+lg5ly
+lg5n
+lg3ob
+lgo2d
+lg1ok
+lg1om
+lg5ov
+lg3ref
+lgr9øy
+lg3s2e
+lg2sk
+lg5s4kre
+lgsle9g
+lg5s4tr
+lgu4l
+lg3un
+lg3ur
+l1gæ
+lg5ø
+l6gå.
+lg5år.
+lgå8va
+lgå8ve.
+8l1h
+lha8ka.
+lhav6s5
+l5hj
+1li
+li1a
+li4ala
+li2am
+li5ans
+li4as
+liba5
+libe5ro
+libi5
+libie6
+liby5e
+li4dak
+li4ded
+li4do.
+2l1idr
+lid3t
+li4ene
+li3er.
+li5ers.
+lie5s
+3lif
+4lifat
+lif5f
+3lig
+li4ga.
+li4g3an
+li4gar
+lig9art
+li8gas.
+li4g5enh
+li4get
+5lign
+li4g3re
+lig3se
+lig3s4i
+lig3sl
+lig3s4p
+lig5s4ti
+lig5str
+li2gu
+4lih
+li5kan
+li9kar
+li7kas
+li5kee
+li3ken
+li5keså
+li9ki
+likk3o
+li1k2l
+9likn
+liks4t
+li5ku
+6lila
+8l5ild
+li3le
+lil5lebe
+lil5let
+li4mar
+li4mas
+li6mate
+l6ime
+li4me.
+4limh
+limp3r
+lim7r
+lim9u
+li4na.
+4lina6l
+lin6c
+linch5
+5l4indr
+4lindu
+lind3s4
+l5indus
+li4ne.
+li3ne6a
+li6nem
+2l1inf
+lin4g3j
+ling5l
+ling7sen.
+5lingv
+4l5inju
+lin5kes
+lin5kle
+lin4kv
+2l1inn
+lin5net
+3linni
+6linns
+6l5inntr
+li4nor
+l4inse
+5linsk
+4l3inst
+4lint
+2linv
+li6n5ø6
+lio4no
+lion5sp
+lion5sv
+li5o6s
+2lip
+lipes4
+lipp4s3
+li9rar
+li4rek
+4lisak
+li5set
+lis4kl
+2liso
+4lisp
+lis6sp
+lis7tan
+lis6terk
+lis5ti
+4lis6til
+list3o
+li6s8tr
+list7rø
+lis4t3u4
+li4st5y
+listyr8ke.
+li4tee
+li4tek
+li4ti3a
+li4tid
+li4tig
+li4til
+li4tim
+liti5st
+li4tiv
+lit5j
+6litn
+li5to
+li2t1r
+lit5rer
+lit6tele
+lit6terk
+lit6term
+litt5s6
+li5ty
+7liu
+li6va.
+li4v3ak
+liv5eg
+livi5e
+liv2s3
+2lj
+l1jan
+l1jar
+l4jarb
+ljar5s6
+ljas4
+l4jed
+l6jee
+l2jei
+l2jek
+lje3l
+lj9elv
+l1jen
+l3jer.
+l4je1s
+l5jes.
+ljes4t
+l5jet.
+l4jete
+l5jete.
+l6je5t6r
+l2jev
+l5jé
+l1ji
+3l2jod
+ljo8e
+l4jom
+lj5ori
+3ljos
+lj5un
+l7jur
+lj7ut
+ljø3
+l5jøs.
+6l1k
+l3ka
+l5ka6l
+lkali9e8
+lk4an
+l6k5b
+lk4e
+l3ke.
+l2ked
+l5kedal
+l3kede
+lkeei4
+l6keh
+l5keleg
+l3ken
+l7ker.
+l4kera
+l4keri
+l4k5ers
+l4ke3ru
+l5kestad
+l5ket.
+l5kets
+lk2l
+lk4li
+l5k4lu
+l6k5nin
+l6ko.
+lko9ma
+lko9sa
+l2kot
+lkras5
+lk5ri6k
+lk4ser
+l4k3s2h
+lk1s4t
+lku4le.
+lku8t
+lk9ute
+l6kveg
+lkå1
+2l1l
+l5la6a
+ll6a5f
+l2lak
+ll1al
+l4lami
+l5lane
+ll3anl
+l4l5ano
+llans4
+ll5ansk
+ll7apa
+llap3s
+ll4as
+ll5asp
+ll5aur
+llau6re
+ll7avl
+ll5avr
+ll3d2
+lle5a
+l5leak
+lle8da.
+lle4d3r
+l3lee
+l2lef
+lle5gev
+lle5gr
+l5leha
+l5leho
+l5lehå
+l4l5eig
+l4leki
+l6l5ekst
+l4leli
+l2lem
+llen6da.
+ll5enden
+l4lendr
+l6lendt
+l4lenk
+l5l8ens
+l4lentu
+l4lenu
+ll5eple
+l6l5e6rik
+l4lerob
+ll6es
+lle4so
+lles5pr
+lle5stø
+l5let.
+l4leta
+l5lets
+llet6tele
+l8letæ
+l2leu
+ll5even
+lle7vev
+l5levå
+lle6y
+l2lé.
+ll7g2
+lli1e
+lli5e4n
+l9lig
+l2lim
+l4l3ind
+l4lins
+ll3int
+l9lint.
+l3lip
+l4lir
+lli6sen
+l4liv
+ll1j
+ll7k2
+ll5m
+llmue9ne
+llmu7ens
+llmu9er
+l5lo.
+llob5
+l2lod
+l4l3off
+llo5id
+ll5oks
+llo2m1
+llom5s6
+ll3op
+ll5opp
+l2l1or
+l4loso
+l6lote
+ll5p
+llra7n
+ll4sak
+llsa6me.
+ll4sem
+lls5end
+llsk4
+lls6kar
+lls5kv
+ll5skå
+lls5lag
+ll3smy
+lls4no
+lls4te
+lls6tig
+lls7øk
+ll3t4
+llto4e
+l8lua
+l4lu4e
+l4luf
+ll7ug
+llu4k
+l8l7uka
+l4l3uke
+l6luks
+l5lum
+l4l1un
+llun6ge.
+llu4pi
+l2l1ur
+l3lus
+l2l1ut
+ll1v4
+llva8n
+lly4se.
+l4løk
+ll5øks
+llø6pa.
+l4løve
+ll7øy.
+ll5øya
+ll3øye
+lløy6er
+ll5øy6n
+ll1å8r
+ll3å2s
+2l1m
+l5ma.
+lm3anm
+l4map
+l4marki
+lm3av
+lm7b
+l4m3els
+l4melu
+lm5e4po
+l4m5erf
+lme7ri
+lme7sti
+lme5t4r
+l5mil
+lmi8le.
+lm3ind
+l5ming
+lmini6
+lmin7ne
+lm3ins
+lm5int
+l7mis
+lm5l
+lm5m
+lm1op
+lm1s
+lms6j
+lm5s2p
+lm3t
+lmu4le.
+lm3ut
+lmyr8ke.
+l4mø.
+l6m5øs
+lm5øy6
+lmøya9
+lmå6la.
+lm5å4r
+l4m5ås
+2l1n
+l2nab
+l3ne
+lni4u
+l7ny
+lo1al
+7loane
+lo1a4r
+5loar.
+2lob
+lob5by.
+lob9byan
+lob9byar.
+lob5bye
+lo2bl
+lo2d3a
+lo3de
+lo4d3ri
+lod3s4m
+lod7ste
+lod7s6v
+lo6d5u
+6loeng
+6lofj
+3loft
+1log
+lo5ge
+lo6g5e8v
+lo4gir
+log2o
+lo3gop
+log8res
+lo6g5ro
+log5sa
+4loh
+lo5id.
+lo3ide
+lo1in
+3loja
+lo1ki
+lok4ko
+lok6kul
+2lo1k4l
+4lokon
+2lok7s4
+lok8se.
+lo1k4v
+lole6ge.
+2lolj
+lolo9
+l5omdr
+lo4m5in
+lom4mel
+lomst9r
+lo4nal
+6lond
+lo5ne
+lon4g3r
+lo4nit
+lon7skj
+2lop
+lo3pa
+lo4pea
+lop5pa
+5l4opt
+lo1ra
+2lord
+lor6da.
+lo1re
+4l1org
+lor4g5l
+lorie6
+lo1ro
+lo7rød
+lo7sa
+lo6sek
+lo4ses
+lo5sev
+los4kle
+lo1sl
+lo7sp
+2lost
+lo9tes
+lo8ti.
+lo3to
+4lottet
+lo1un
+1lov
+lov7ald
+lo3van
+lo9vand
+lo7vane
+lo3var
+lo3ve7d6
+l6over.
+love5re
+l5overn
+6l5overs
+6l5overt
+7lovo
+lov3sa
+2l1p
+l7pa
+lpa5re
+lpas5
+l4pedo
+l4pee
+l2pei
+l2pel
+l5peleg
+l3peli
+l4pelin
+l3pesm
+l4peti
+l2peu
+lp2h
+lp2i
+lpin3e
+lpi5ne.
+lp2l
+lpo6et
+l4put
+l5q
+2l5r4
+lra8da
+lradi4u
+lra6ne.
+lre4de
+lre4i
+lre8ka
+lre8ke.
+lre8va
+lri8ma
+lri4ve.
+lro8de.
+lro6pa.
+lro8sa.
+lro4se.
+lrot5s
+lrø6re.
+lrø5v
+lrå8da.
+lrå4de.
+8l1s
+l2sad
+lsag6
+ls5ald
+ls4am
+l7sana
+lsan6ke.
+l4s5ano
+l4s3ans
+ls5ark
+l4sat.
+l4scu
+l3se.
+l2sed
+l2see
+ls3eid
+ls5eig
+l4s3ele
+l4s3elv
+l2sem
+ls5emb
+l4seno
+l7ser.
+lse2s
+lses5ku
+lses3l
+lses5pa
+lses5s
+lse8s5tr
+lse4te.
+l2seu
+l6sev
+l4sf
+l2sh
+l5sig
+l5sik
+l6s5ill
+l4sim
+l5simu
+l4s3inn
+ls5jakk
+l5sjef
+ls3jeg
+ls3jen
+8lsk.
+ls5kabi
+l4s5kan
+ls5kari
+lsk5art
+l6s5ke
+lskif5
+l2s3kild
+lskinn6
+lskinns5
+ls1kjed
+ls3kjo
+l6skl
+lsk3læ
+ls3koa
+ls5kor
+ls3kov
+l4skra
+ls8ks
+lsk5un
+ls7kva
+ls3kvi
+l4skå
+ls3kåp
+lskå6pa
+l2sl
+lsla4ga
+l7slagn
+lsle6ge.
+ls5lo
+l5s4luk
+l6s5løs
+l2sm
+l5smør
+lsmå6la
+l2snu
+lsok3
+ls5ond
+lson6de.
+l2s1or
+ls7o6se
+l5sot
+ls1ov
+l2spa
+l9speg
+l5spei
+l9spel
+l5spi
+l4spr
+l5spred
+ls3pri
+l8s7s
+l4s3tak
+l4s3tal
+l6stank
+l6ste.
+ls4ted
+l4steg
+l3ste4i
+ls4tel
+ls5terr
+ls6ti.
+ls4tie
+ls6ton
+ls5tren
+l9stri
+l2su
+l5sub
+l3suk
+ls1un
+l2s1v
+ls7vea
+ls5vee
+lsve8en.
+l6s5vek
+lsve7re
+l4svik
+ls6vind
+l4sør
+l2s1øy
+l2s1å
+2l1t
+l4taa
+l4taf
+lt3akt
+l3tal
+lta4la.
+l4t3alb
+lta6lev
+lt3anl
+lta6no
+lt3art
+lta4st
+lta8tes
+lta4t3o
+ltat3r
+lt3avk
+l5tavæ
+lt9b
+l3tede
+l4teka
+lte6ma.
+lt4en.
+l4t5enh
+lt3epi
+l4teras
+l4t5erst
+ltesa8me.
+ltid6s
+l4tiet
+l2tif
+lti6g5
+l2tik
+l4tina
+lt3ind
+lt9inn
+lt3ins
+l4tivi
+l2t1ja
+ltle8ge.
+lt9n
+lto9ar
+l3tog
+lto4s
+lt3ost
+lt2r
+l3tra
+lt3reg
+lt3rei
+l6treko
+l6t5rel
+l6t7rem
+l4trens
+lt3res
+l5t4rest
+l5trev
+l4t5rit
+lt3rol
+lt3rom
+ltro8pa
+l5tros
+l4t5rød
+l5trå
+lt1s2
+ltsa8me.
+lt5s4i
+lt7s6t
+lt2s3v
+lts4vi
+lt7t8
+lt3und
+ltu4ra
+ltur5e6
+ltu5r6en
+ltu5r6er
+ltur5s6
+ltur5å6
+l2tut
+l5tv.
+ltva8la
+l3tvs
+l4t5w
+l3ty
+lty8d
+lt7øl
+lt3øv
+lua8r
+2lub
+lub6band
+lu6bri
+lu5c
+lu7ere
+1luf
+3lugar
+lu7go
+lui6
+luid6er
+1luj
+4luk.
+lu4ka.
+4luket
+luk6keri
+lu3kr
+5l6ukt
+4luly
+l4um
+lu6mel
+lu2mo
+lum6sk
+lu4mø
+lun5d4r
+lu4ne.
+lun4gel
+l7u2ni
+lun5ne
+3lunsj
+4lunt
+lu6o
+lup4s
+lu2p3u
+lur2e
+6lurei
+lu5ren
+lu5ri
+6l5urn
+lur8na
+lur8ne.
+lur8ta
+1lus.
+lusa5
+lu7sak
+lu6sel
+lush7e
+lu2s5k
+lus4o5
+lus4sid
+lus4s3t
+lus1t
+lus2t3r
+luta3
+lu3ta.
+lu7tet
+6lutf
+4lutg
+luth
+3lu5t6he
+lutla9
+lut6m
+lu1to
+lu4t5r
+2luts
+lut4tal
+lut4tap
+lut4t5at
+6lutv
+1luv
+lu4va
+lu4ve.
+lu9ven
+lu9ver
+8lv
+l1va
+l4va.
+lva6k
+l4vakti
+lva6la
+l4va4m
+l4vana
+lv8and
+l7var.
+lv7asa
+l4v5ass
+lve3d4a
+lve5i6s
+l4vela
+l4vele
+lv4en
+lve9ne
+l9ver.
+lve9rau
+l4veru
+l4vesk
+lve5sl
+l7v6et.
+lve5str
+l9vé
+l1vi
+lvi8ene
+lvi9er
+lvi6ka.
+lv9im
+lvin5g6r
+lv3iro
+lv1j
+lvly8se.
+l6v3n
+lv1of
+lv9op
+lvo8re.
+lvor4s
+lv5o4v
+l6v5p
+lvra8r
+lv9ri
+lv1s2
+lv5se
+lv7s6k
+lvs6l
+lv9ta
+l5vøe
+lv1å
+l3våg
+lvå4p4
+lvå6r
+l5w
+ly1a
+2lyb
+ly4d7r
+ly5e
+lyes3
+ly4gel
+ly5g6l
+ly8is
+2lykj
+lyk6keri
+ly5ku
+ly7kv
+6lykø
+ly5l
+ly5me
+2lymp
+ly2n3a
+ly4ne.
+ly4n5il
+lyn3s2
+2lyo
+ly5ok
+ly3pe
+ly1r8
+ly8ra.
+ly6re.
+6l7yrk
+ly4sa.
+ly4s5a4k
+lyse6te.
+lysk4
+lys3kj
+lys9kl
+ly2s1l
+4lysp
+lyst9ra
+6lysy
+ly8ta.
+4lytek
+ly4teri
+lyte5s
+l5y4tin
+ly1tr
+ly3ve
+l3z
+l6z5b
+1læ1
+6læd
+læ6ra.
+læ5rar
+lær4arm
+læ4re.
+lære3i
+læ3rer
+læ4re3s
+læ5res.
+lær6sv
+læ6ta
+1lø
+lø3de.
+lø4del
+lø5dem
+lø4er
+løk5kj
+4l1økn
+2løko
+lø4k5r
+l5ø6l
+lø9me
+lø2na
+løns5t
+løp6s5
+5l4ørd
+lør5k6
+lør5n
+4l5ørr
+5løs.
+lø2sa
+lø5san
+lø5ser
+løs3k
+løs3s
+2løt
+lø9ta.
+lø3te.
+lø4teg
+løva9r
+6l7øv8d
+lø4ve.
+lø3ver
+lø5ves
+6løy.
+4løya
+2løyd
+4løye
+løy8ed
+løy5el
+2løyf
+løy4g
+løyg5e
+4løym
+6l5øys.
+løy5ter
+lå6gal
+lå6gre
+lågs4
+lå4gå
+2låi
+lå1k4
+lå6ke.
+lå9me
+lå2m5o
+lå2n
+6l5ånd
+lån2s1
+2låp
+l1åp9n
+2lår
+lå8ra.
+lå9rar
+lå5ras
+lå3rin
+lå1ru
+lå6sa.
+lå1sk
+lå6sko
+lå4s5l
+lå4ste
+lås7ten
+lås5ter
+lå5su
+lå3te.
+lå4teg
+lå4tek
+lå8ti.
+4lått
+lå4ve.
+1ma
+2maa
+3maa.
+ma3ar
+2mab
+ma5br
+ma3che
+mada5me
+ma4del
+ma3dra
+m6ad9s
+4maef
+4maek
+7maene
+2ma1f
+3mafia
+3mafr
+6mafrå
+ma8ga.
+ma4ged
+ma4gel
+ma4ges
+3magn
+ma2gr
+2mahe
+ma4is
+ma4ja
+2mak.
+ma5kab
+4makad
+ma4kes
+mak7ke
+4makl
+mak6le
+ma4kot
+mak2r
+ma3kre
+mak5ron
+mak4tal
+4m3akti
+mak4to
+makts4t
+ma1ku
+2ma1kv
+ma1la
+ma7leb
+ma6leng
+ma4let
+mali9e8n
+mal5l
+ma4lov
+mals4
+mal4t5ek
+mal3u
+mal3å
+4mamer
+ma3mo
+m4an.
+ma3nak
+m3anal
+6manam
+4manav
+man8ce
+man4dom
+man4don
+ma3ne
+m4anf
+man5g4a
+m6ange
+4mangr
+mania8
+2manl
+m3anle
+4manm
+5m4ann
+man4nem
+manns5l
+ma4no
+2mao
+4mapa
+2mapr
+4marb
+mar5d6
+7mare.
+6mareg
+ma3rei
+ma7rel
+5ma9ren
+ma5res
+3mar4i
+mari8e9ne
+ma3rin
+m4arka
+4markit
+mar4kv
+mar5m
+marmo9ra.
+mar7n
+ma1ro
+ma4ro6p
+mar3s4h
+mar7sl
+mar5te
+ma4ry.
+ma6rå
+4masel
+ma5set
+mash3
+ma4sia
+ma4sik
+ma4sis
+6masju
+mas4ki
+4masko
+4masp
+mas4see
+mas6set
+massø9
+7mast.
+ma5stem
+4masto
+4ma5str
+2masy
+m6at
+ma1ta
+ma5tad
+ma3te
+ma4te.
+ma6ted
+ma4tel
+7maten
+7mater.
+6matera
+7matet
+6m7atfe
+4matil
+7matil.
+ma1to
+ma1tr
+4matra
+ma4t5ras
+ma4t3re
+ma6t7rom
+mat3s2
+mats8l
+mat5ta
+m8at7t8r
+2mau
+mau4k
+mau7l
+ma1un
+5maur
+mau7su
+2mav
+ma6ve.
+ma5ven
+m7avh
+m5avk
+ma4ze
+ma3zo
+2m1b
+m4bao
+mbar3d
+m2bea
+m4beb
+mbe9da
+m4bedø
+m2bef
+m2bek
+m4beli
+m2bem
+m4bena
+m4beo
+m4bereg
+m4bero
+mbet2
+mbi6ar
+m2bib
+m3b4l
+mboe2
+mbo4end
+mbo5er.
+mbo5ere
+mbo5id
+mbo5n
+m4bop
+mbo5re
+mbo9t
+mbu7ar.
+mbu4e
+mbue7re
+mbus5
+m1c
+m6co
+2m1d2
+m3de
+md7om
+1me
+2mea2
+me5al
+mea5m
+2meb
+2mec
+meck4
+4medat
+2medb
+5mede.
+me4ded
+med5ei
+me7den
+me7det
+4medf
+me3di
+4medik
+4medir
+2medm
+me6dok
+4medom
+2medr
+me6dret
+med1s4
+4medu
+me6dun
+me5d4us
+med5v
+7medve
+2medy
+4medå
+me7e
+2meef
+6meek
+2meel
+4mees
+4meev
+2mef
+m3eff
+6me2ga
+me7gal
+2megr
+2megu
+4meh
+mei2e
+meie5n
+m1eig
+me3ild
+me3ind
+mei5ni
+me7isk
+4meiso
+2mej
+4meki
+4mekj
+2mekk
+me2k1l
+me3kn
+4meko
+2me5k8r
+4meks
+mek5t
+6mekte
+m2el
+4mela
+me5l4aks
+5melane
+5melar
+me3le
+me4le.
+4meled
+4melei
+4melek
+6m5e6lem
+me4l5eng
+4melik
+4melis
+4melit
+4meliv
+mel5le
+mello6m3
+4melok
+4melov
+mel4si
+mel2s3j
+melsk4
+mel5s4t
+mel7tr
+me1lu
+mel5v
+melvi6
+2mely
+2melæ
+4melø
+4me5l4å5
+2mem
+me6mo.
+4m5enga
+men5k
+menle6ge.
+m6enn
+men4ny
+me4nom
+me4nor
+men4si
+men3sm
+men5spl
+men5te
+men6tek
+men4tom
+men5tr
+me4nyt
+2me3o
+me6os
+2mep
+5mer.
+me6rab
+4merad
+me4ra5l
+me4r5ant
+mer5di
+4mered
+4mereg
+4merei
+4merek
+4merel
+me6rense
+me3res
+4meress
+mere6t
+m4eri
+4me5rib
+meri5ke
+5merin
+merle7g
+mer9n
+mer5os
+5mers
+mer5sk
+me3run
+mer5und
+4merus
+2mery
+me2r3ø
+2merå
+me4råk
+5mes.
+2me5sa
+4me5s4h
+2mesj
+2me1sk
+mes5ke
+2me1sl
+mes6le
+4me3so
+2mesp
+5mess
+7mest.
+4mesta
+5meste.
+mes4ti
+6me7sto
+mest3r
+me5stro
+6mestrø
+4mestrå
+4mestu
+4mesu
+2mesy
+2mesø
+4metab
+4me9tap
+me4tar
+me3te
+4meteg
+4metei
+4metek
+4metel
+4metep
+4metil
+2metj
+4meton
+me4t3ra
+me4tre
+met5ren
+met7rer
+met5res
+met5rik
+me4tru
+4metræ
+2metu
+4metv
+2mety
+2metø
+4metå
+2meu4
+7m4eu3s
+2mev
+meva8n
+2meø
+2meå
+2mé
+2m1f
+mfa9ra
+mfar8ta
+mfav5
+m2fek
+m6f3ess
+m4fi.
+m4fibr
+m2fit
+m5fru5s6
+m5funn8s5
+mfu6se.
+2m5g6
+m4ga.
+m4gi.
+mgå8va
+mgå8ve.
+2m1h
+mhea4
+m4hu.
+1mi
+mi1a
+5mi6al
+mia2n
+9miane
+7miar.
+2miav
+mi6c
+miche6l
+8m9idé
+2midi
+mid5j
+mid3s4
+mid4t
+4mi3ele
+mi3er.
+mie9s8
+2mi5f
+5migraf
+2mih
+2mii
+4mij
+mik6h
+4mikj
+2miko
+mik5ro.
+mik5ron
+mik5sa
+6miku
+mi4la.
+mile6t
+mil7eti
+mi4lev
+mi7li
+4milin
+mil6s5v
+4milæ
+2mim
+mi8ma.
+5mimo
+m7imp
+mi4na.
+mi5nar
+mi4ne.
+mi4n5ers
+4m3innh
+4m3inns
+6minnt
+min2s
+min3sp
+mins4t
+mi3nu
+m4inv
+mi4n5y
+mi7ov
+2mip
+4misa
+mi4san
+mi3se
+4misek
+4misel
+9misé
+misha9ge
+4mi7si
+mi2sk
+mis4ko
+mi3s4la
+mis9le
+7mism
+mis4s5k
+mis4s7p
+mista9k
+5mis7te
+mis4tra
+4mistu
+2misy
+4miså
+6mita
+mi3te
+4mitj
+4mito
+2mit6r
+mitt3s
+mi5ur
+2miv
+mi5vå
+m6ja.
+m6jan
+m5jar.
+m7jarn
+2mje
+m7je.
+m1ji
+m8jingan
+m8jingar
+8mjo
+mju7ke
+1mjø
+mjøs5t
+2m3k2
+m4ko.
+mkro5
+mku6le.
+mkå8pa
+4m3l
+m7la
+mla6ga
+m2lef
+mlei5er.
+m2lek
+m2lel
+m2lem
+m4lera
+mle6se.
+m4lesk
+m6le5s8v
+m4leta
+mle4ve.
+ml6i
+ml5ja
+mly6se.
+mlø6pe.
+mløy3
+2m1m4
+m6mai
+mma5kl
+mmal5
+mma8le.
+m4mam
+mmando5
+mman6dol
+m5mar
+mmar7in
+mmar7o
+mmatik7ka
+m4medø
+m2meg
+m2mei
+m2me3k2
+m4melu
+m6meni
+m4menu
+mmer5t
+mme4run
+m2me1s
+mmest6
+m5met.
+m4meta
+m4meti
+m4metra
+mme5t6re
+mme3u
+m3mé
+m4mia
+m7mian
+m2mib
+m4mid
+mmie6n
+m2mik
+mmi5sk
+mmi5so
+mmi3st
+mm5n
+m3mu
+mmø2
+mmå8la.
+2m1n
+m2nee
+mn7eid
+m2ne9l
+mne4ra
+m5nese
+m4nesk
+m4nesta
+mnes9tie
+m9net.
+m4nete
+m2nev
+m6nip
+mn7sk
+1mo
+3moa
+mo2ar
+4moba
+5mode
+mo3dem
+mo5di
+mo6di.
+2mody
+3moe
+mo4en.
+m1off
+mofo6bi.
+mo6gi
+5mogl
+mo5go
+m5ogs
+4moh
+2moka
+mo8ka.
+mo8ke
+mo1ki
+mo6la.
+mo3le
+mo4le.
+mo7le6s
+4molt
+mo3ly
+m5om.
+4momf
+2momr
+mom4s5ø
+mo5ne
+mo4nisa
+mo2no
+mon1s
+mon4ste
+mon5t6
+2mop
+5mo1ra
+mo4ra.
+mo4rar
+mo7rar.
+mor5d6e
+4mordl
+mor6d5r
+mo3re
+mores7
+m2ori
+mo4ri.
+mo6rid
+4m3o4rie
+mor4kl
+morla8ga
+mo5rok
+mo4rom
+mor4si
+mor4skj
+mor7sky
+mor4sp
+mo1rø
+mo9sen
+mo2s7k
+mos4o
+6mostab
+4motap
+mo4te.
+mo6te6g6e
+mo4tei
+mote7kl
+mo5ter.
+mo4tes
+mo5to
+4motr
+mot7re
+mot1s2
+6motsagd
+motsva5
+mot7t
+mour5
+3mo3va
+mo5w
+8m1p
+m4pana
+m4p5anta
+m4pee
+m4pelot
+m6pena
+m6pep
+mpera8te.
+mpe5res
+m6peress
+m4p5erfa
+mperi6e7n
+mpes2
+mpes6te
+mpe4sti
+m5pett
+m2pe5u
+mp3id
+m4pinje
+m8pla.
+m3p4lan
+mp5le.
+m6p5lin
+m6p5n
+m6p5ob
+mpoe4
+m4poeta
+m4pog
+m6pok
+m2pop
+mp3opp
+mp1p8
+mp3rad
+mp5ret
+mp3rop
+mpro8pa
+mp1s
+mp3sek
+mps4p
+mp5s6t
+mpun6ge.
+m9pur
+mp5ut.
+mp5ys
+mpø5
+m9på.
+m3q
+2m1r6
+mro8sa.
+mro6se.
+mru7te.
+mrø9de
+m9rår
+6ms
+m5sa.
+ms1ak
+ms5ant
+m1sc
+mse5lu
+m9s6ei
+m4sem
+m4s3eng
+ms5e4pl
+m4serv
+mse5s
+m5s6etn
+mse6t7jare
+mse8t9jas
+msi6e
+ms4ing
+ms3inn
+m4s5ja
+ms5kab
+mska9k
+ms6kin
+msk5ing
+ms3kor
+msk8u
+ms3lan
+ms6lega
+ms9lua
+ms3lue
+ms4ly
+m2sm
+m1s2n
+ms9ne
+ms5no
+ms3næ
+m1so
+m4soms
+ms3ori
+ms1ov
+ms3s2
+m4s3tal
+m8s7te.
+ms7tea
+ms2ti
+ms5tilb
+ms3tim
+m1sto
+m4s5top
+m5s6topp
+mst5ord
+m8strand
+m5strane
+mst5red
+ms5tref
+mst5ren
+ms5trik
+ms4tru
+ms3unn
+msu9ta
+msu7ten
+ms1v
+msva9ra
+msva5re
+m3s4vet
+ms3ynd
+msø4ke.
+m4s5ør
+ms1øy
+ms1å
+2m1t
+m3ta
+mt4b
+mtbe6
+m2tee
+m2teg
+mteks7
+m6te7kv
+m4tel
+m6testu
+mti9a
+m9tida
+mti5e
+m6tien.
+m6tif
+m2tik
+m6tini
+m4tiø
+mtiør6
+m5to
+mt4r
+mt6ve
+mt4vin
+mtå5
+1mu
+mu6a
+m1u2b
+mu2e
+mu3el
+mue7r
+mues1
+2mug
+mug5l
+mu4he
+mu2k
+8m9uka
+4m1uke
+mu5la
+mu4leg
+mule6s
+mull2
+mull6s7
+mul6tiv
+4muly
+7mum
+mu3mi
+mum2s
+mun2c
+munes6
+4mung
+mun6ge.
+6m5univ
+mun3k
+munn5s6
+mun4t3r
+mu6ra.
+mu4re.
+2murn
+murs4
+6murt
+m2us
+mu4se.
+mu4ses4
+mu4sé
+mu2s3k
+muske6l5a
+must4
+mus5tan
+2mut
+3mu1ta
+mu8ta.
+mutsa8la
+mut7t6r
+2m1v
+mvak5t
+mva6la
+mvari6
+mveg5s4
+mvi7e6
+mvi6se.
+2mw
+1my
+my5a
+myg4ga
+my3ke
+myk4kes
+myk3l
+my8kr
+my2ra
+my9ran
+my9rar
+my1re
+my4re.
+4myrk
+m5yrke
+my4r5u
+mys3
+my6sa
+my4se.
+my4so
+my4te.
+mytt6s5
+5mæ
+mæ6la.
+1mø
+møb3l
+mø7des
+mø6e
+mø9ens
+møkk6a
+m3økn
+2møko
+mø6na
+mø4ne.
+møne9s
+mø8nest
+6m5ønsk
+mø2o
+3mørke
+mør4k5r
+mør5sm
+mør3ø
+mø5se
+7møt
+mø9tas
+mø4tere
+møt9t
+2møy
+møy9ar
+m5øys.
+1må
+2må.
+må5a
+6måenh
+må7g2
+må1k
+må4ka.
+må4ke.
+må4kes
+m6ål
+må5lar
+må4le.
+må6led
+måle3i
+målø6pe.
+må4ne5s6
+må9nese
+må8pa.
+må4pe.
+må7pl
+2mår
+måra6r
+må1re
+må1ro
+må1ru
+må1s4
+må6tak
+6måtf
+må5tr
+må3tø
+1na
+na6ans
+2nabo
+7na7bortr
+na6bot
+4naby
+na4ded
+na8dem
+nadi4
+n3adop
+nad2s1
+4nadv
+8naf
+n1aff
+nafo7r
+na3fr
+naf7t
+na8ga.
+na3ge
+4nagen
+nag3s4
+nagså5
+na7gø
+6nah
+4nair
+2nak
+n6akk
+nak7ka
+nak6ko
+5nakl
+na1kr
+n1aks
+nak8sa
+nak8se.
+8n1akt
+nak6ta.
+na7kv
+na9lag
+na6lare
+6nalarv
+na7leg
+na4l3ei
+na4lek
+nal5epo
+na4les
+na4l5ett
+na4lev
+nal5g
+nal6ge.
+na4lil
+nal6lag
+nal4løp
+nal3op
+nal5s2
+nal3t
+na3lur
+2naly
+na2l5ø
+4nalå
+na3lå5r
+5nam.
+na7mere
+na5mes
+na5mo9
+5nams
+2namø
+9nan.
+4nana
+n3anal
+n6ane
+nanfø8
+4n5angr
+nan5k
+nan6ke.
+4n3anl
+6n5anle
+nan4ne
+na4n5o
+n4n5ans
+nan4sin
+nan4skj
+nan4s5t
+4nany
+na7o
+na5pe
+nape4s
+nap3s4
+n4ar.
+na4rap
+2narb
+nar5dr
+4narea
+nar7ei
+4na5rek
+nari4e5n
+7nariksk
+4narkiv
+6n5armé
+6n5arme
+nar8ma.
+nar5s
+nar8ste
+2nart
+nar6ta.
+nar5ti
+nar7v
+nar5ø
+nasa3r
+na4sas
+nas7h
+8nasik
+na4ski
+na2s5t4
+nasta5
+8nasu
+na1ta
+nate8k
+na7tem
+4natl
+4natom
+natori5e6
+nat8ra
+nat3sp
+nat6tak
+nat6tea
+naty5
+2nauk
+naus6p
+na6va.
+4navd
+6navf
+2navg
+2n3avh
+na1vi
+4n5avk
+4navl
+nav4les
+3navn
+6navo
+4navr
+n1avs
+4navt
+4n1b2
+n5ba2
+nba3d
+nba9ser
+nben4s
+nbo5et
+n6buf
+n6butr
+nbyr5
+nbø9le
+nbø6n
+n1c
+n5ca
+ncel5
+n3che
+nch3ei
+n6cot
+n2cy1
+6nd
+n7daa.
+n6dabi
+n4dad
+nda5f
+n7dag4
+ndags5
+n4daks
+n3dal
+n4dalf
+n4d5all
+ndals3
+n4dark
+n6d3art
+n8dask
+nda5tal
+nd5d4
+n3de.
+nde5a
+n2deb
+n2ded
+n5defi
+nd1ei
+nd4ein
+nd6ek
+n4dekl
+n4deko
+n5d4e5l
+nde4le.
+n4delik
+ndel4sk
+ndel4st
+n2dem
+n5dem.
+nde5mo
+n5den.
+n6dener
+n5dens
+n2de5o2
+n2dep
+n4derab
+n4deras
+n4derei
+n4derim
+nd6erk
+nderla6ga
+n4desi
+n4dest
+n4desu
+n1dé
+ndi4en
+n4d3int
+ndi6sk
+nditori5
+nditorie6
+ndit4t5a
+nd3jer
+nd1ju
+nd5k
+nd4lem
+nd4lese
+nd4lest
+nd4lev
+ndo9a
+n6dob
+n6d5okk
+nd4om4s3
+n2doo
+nd1op
+n2dor
+nd3org
+nd5orm
+n6dote
+nd5rae
+n4d3ram
+nd3ran
+nd6rek
+ndre4ra
+nd5resen
+nd5rett
+nd1ri
+n1dro
+nd4sag
+nds3ak
+nd4s5amb
+nds5elv
+nds5ende
+nd4ser
+nd4sje
+nd4skj
+nds7kul
+ndsla6ga
+nds6lett
+nd7spu
+nd3s4te
+nds9teg
+nds5trek
+nd5stry
+ndta6ka.
+n6duf
+ndu3is
+n4dun
+nd3ung
+ndun6ge.
+n2dup
+ndu6si
+ndus7k
+nd7v
+n2dyg
+ndy1k
+n2dys
+ndy5sp
+ndø5l
+n2d1øy
+1ne
+2nea
+5neae
+nea4g
+ne7a6le
+ne5alp
+ne5als
+nea9m
+ne9a8r9an
+nea9ren
+ne1as
+6ne7av
+2neb
+3nebb
+4nebe
+ne4ble
+neck5
+2neda
+3nedal
+ned3d
+6n5eddik
+4nedeb
+4nedeg
+4nedel
+5nedg
+ne4di.
+nedi4s
+2nedo
+ned5over7
+ned1r
+ne6dre
+5neds
+ned3st
+6nedu
+4nedø
+ne5dår
+4neeg
+4neei
+2neek
+5ne4e4r5
+2nef
+n1eff
+n5eft
+2neg
+5negati
+ne3gla
+neg5lesp
+neg8r
+6negru
+6neh
+2nei
+n2eid
+nei8dan
+n5eig
+n2e1in
+n3eini
+5neir
+2nej
+2nek
+ne4ka.
+6nek2l
+ne3kn
+nek2r
+nek5rin
+n7ekser
+nek5t
+4nela
+nel3de
+4neled
+6nelegg
+7neleggj
+4nelei
+nelei5er
+4n3elem
+6nelê
+4nelid
+4neliga
+4nelis
+4nelit
+4neliv
+nel4lov
+nel7s
+2ne1lu
+4nely
+2nelæ
+2nelø
+nelø8pa
+4nelås
+2nema
+4n3emb
+4nemel
+4nemer
+6nemes
+2nemi
+nemie8
+6nemj
+nem6k
+5nemn
+nem5ne.
+nem7nel
+2nemo
+2nemu
+2nemy
+2nemø
+2nemå
+3nen
+4nena
+nen5at.
+6n5en6den
+6nendr
+nene4
+4nened
+4nenem
+ne3nes
+4nenesl
+4nenet
+nen5eta
+4nenev
+nen4ga.
+4n3enhe
+6nenhet
+4neni
+nen5se
+nent5ei
+6n3en5tr
+4nenu
+4neny
+4nenæ
+2neo
+5neo.
+ne5o4r
+7neos
+2nep
+ne5pe
+3n4er.
+4nerad
+6nerap
+3nerb
+4nerea
+4nered
+nere6de.
+4neref
+4nereg
+4nerek
+4nerent
+4nerep
+ne5res
+4neress
+4neresu
+4neret
+4nerev
+4nerfar
+4ner2g
+ner3ga
+ner3ge
+4ne3rib
+4nerik
+4nerit
+ne4ri9v
+5nerl
+nerla8ga
+n3erob
+6neroc
+ne7rof
+ne5rok
+4nerom
+ne5rot
+ne1r4ov
+n6ers.
+ner7se
+ner5s4i
+ners4p
+ners8ten
+4ne3rul
+ner5un
+2nery
+3neryr
+4nerør
+2nerå
+2nesa
+ne4sa.
+5nesar
+4nesc
+4nese
+6nesek
+nes6er
+5nesets
+nes5eva
+ne3si
+nes5ind
+4nesit
+2ne5sj
+ne5skam
+4ne5skar
+nesk4e
+4neski
+5neskins
+4neskj
+4ne5sko
+4neskr
+6nesku
+2nesl
+ne3sli
+ne7slø
+nes6mi
+6nesn
+ne7snø
+2neso
+3nesot
+2nesp
+nes6sam
+nes4stu
+5nest.
+4nestas
+nes9tas.
+nes9te.
+4nesto
+nes5tor
+4ne3str
+4nestu
+4nestø
+2nesu
+2ne1sv
+nes8va
+6nesy
+4nesæ
+5nesøy
+4ne5så
+neså5re
+3net.
+2neta
+4netaks
+neta6le.
+ne3te
+5nete.
+4ne3ti
+6netid
+2netj
+2ne5to
+6netom
+2net4r
+3nets
+net5s4p
+nett3a4
+net6tel
+2netu
+ne4tv
+4nety
+4netå
+netå5ker
+2neu
+neu1r
+ne5us
+ne6va.
+ne4ve.
+6ne8vent
+5nevik
+nevi8sa
+3nevn
+nev1r
+ne4y5t
+2neø
+4neå
+1né
+4néb
+4néd
+2néf
+6néh
+2nél
+4ném
+6néo
+2nép
+5nér
+4név
+4néå
+4n1f
+nfall4
+nfalls5
+nfan5t
+n6foa
+n4fob
+n4fole
+n4fom
+n4fora
+nfor9en.
+nfos4
+nfø5des
+nføy8ed
+6ng
+n8g8ad
+n4gaf
+n6gag
+ng1ak
+ng5and.
+n8gan8da
+ng3ank
+n4g5arm
+n4gart
+ng5art.
+n5garta
+ngar5u
+n2gat
+ng5ato
+nga4ve.
+ng7avi
+ngd4
+ng4ded
+ng4del
+ng4dep
+ng3dr
+n4geda
+n4gela
+n3gen
+n4gena
+n7gene
+n4g3eng
+n6geno
+n4genu
+n3ger
+n4geret
+nge5run
+n2ges
+nge3sl
+n4geta
+n2ge7v
+ngfø4
+ng5g2
+ng5id
+ngjen5g
+ng1l
+n5glem
+ng4lu
+ng7n
+ngo4d
+ng5odd
+n7goe
+n3g4ok
+n8g7o8m
+ng9ome
+ng5ond
+ng7o6pe
+n2gor
+ng5ord
+ng3ork
+ngos6p
+n2got
+ng3ra.
+n5grad.
+ng5rand
+ng7rea
+ng3reg
+ng3ren
+n4grend
+n4grer
+ng5rest
+ng3ret
+ng3rev
+ng3rid
+ng3rin
+ng7ro.
+ng9roa
+ng7roe
+n5g6ros5
+ng3råd
+ng8sa.
+ngs5elv
+ng4sem
+ng4ses
+ng2sj
+ng2sk
+ng6skj
+ngs7leg
+ng5sløy
+ngsmå6la.
+ngs3ne
+ngs7tep
+ngst5rid
+ngstyr8ke.
+ngs9tør
+ng3und
+ngu5ru.
+ngvi4s
+ng5ye
+n1gø
+n2g1øy
+ngå8va
+ngå8ve.
+4n1h2
+nhat5
+nhet4s
+1ni
+ni1ak
+ni1a2n
+nian5dep
+ni2bl
+4niby
+4nibå
+4nicr
+n8ida
+ni4del
+ni7dele
+n5idé
+ni6do
+nid7r
+nids4
+nid5st
+4nieg
+ni1el
+7ni3e2n
+ni3er.
+nie5ri
+ni7ers
+ni5ert
+4n3i4fr
+ni5gla
+ni9glo
+2nih
+8nij
+ni3ke
+2nikj
+4ni5ko
+2nikr
+4nikv
+ni5l4i
+5nilu
+4nimar
+4nimas
+4nimo
+2nimp
+ni6n7al
+2n1ind
+4ninf
+ning3o
+nin5gr
+ning6s5
+ningse4
+nings5te
+2n1inj
+n1inn
+4ninnb
+4ninnh
+4ninns
+4ninnt
+2n1ins
+2n1int
+2ninv
+5nio.
+nion2
+nions3
+4niop
+7nios
+4ni5ov
+ni4pet
+ni9pet.
+ni9pets
+ni2pl
+nip3li
+nip5si
+4nir
+nir7kel
+4nisem
+ni5set
+nis5im
+4ni3skj
+nis4k3o
+ni9sol
+niso5ne
+niss4
+4nistas
+6nistat
+nis5tik
+4nistil
+ni3str
+4nisty
+4nistø
+6nisu
+6nisy
+n4it
+ni3ted
+6nitj
+ni4tog
+ni4tos
+nitt4r
+nitt4s3
+nitt6sk
+4nitu
+ni3ty
+nit5z
+nitær6e
+2niub
+ni4umf
+2niut
+4niva
+2nive
+niv5ei8
+4n5ivo
+niv3s2
+6niå
+4n1j
+n6jah
+njav9
+n2jed
+n5jede.
+n4jee
+n6jei
+n2je1s
+n3jes.
+n2jet
+n3jet.
+njet6r
+n5jett
+2nk
+n1ka
+n2kak
+nk3aks
+nkal5l
+n2kau
+n4kedo
+n4keer
+n4keh
+nk5eie
+nkel5s
+nkelt3
+n4k5enh
+n8keno
+n4k5erfa
+nker4st
+n4ke1s4
+n6ketø
+n1ki
+n4kid
+n4kie
+nk3ier
+nk5ind
+nk7inf
+nk3inn
+nk7int
+n5kj
+nk1k4
+n1kla
+n5k6lang
+n7k4lis
+nk3lok
+n1klu
+nk3ly
+n3klæ
+nk1lå
+n1knu
+n1kny
+n3ko
+n4kof
+nkofi8
+nk5oks
+nko5le
+nkol4la
+n6kot
+n6kov
+n1kr
+n3krav
+nk1s2
+nk4tak
+nk6tal
+nk4tin
+nkt3sk
+n1ku
+nku4le.
+nkuri9
+nkurie8
+n4ku6t
+nk9ute
+n1kv
+nk3ve
+n7kvit
+n6kvo
+n9ky
+n1kø
+n1kå
+nkå6pa
+4n1l
+nland9a
+nland6se
+n5le
+nlei7er.
+nle8ma.
+nli4en.
+n3lj
+nlu4e
+nly6de.
+nly6di
+nly4se.
+nlø6pa.
+n7lå
+4n3m
+nma4le.
+nmik3
+nmi8l
+nmini6
+nmo6se.
+nmusik7k
+nmå6la.
+4nn
+n2nad
+nn5ad.
+nn9aft
+nn5air
+n6n1ak
+n4nala
+nn5alg
+n4name
+nn4an
+nn5ana
+n9nane
+nna8ni
+n4n5ank
+n5nanl
+n6n7anta
+n9nar.
+n4nari
+n6nasi
+n4nask
+n2nat
+n2nav
+nn3avl
+nnbo9e
+nnbu9e
+nn5d2
+nndø4
+nndør3
+n5nea.
+n5neap
+n5nebar
+nnebe8r
+n5nebu
+n4nedi
+n2nee
+n6nef
+nn1ei
+n3neke
+n4nelo
+n3n4en
+nne6nat
+nne4n3o
+n9ner.
+n4nerel
+n4nero
+n7nes.
+n6nesj
+n5nes4la
+n4ne3st
+n5n6et.
+n4nesø
+n4nete
+n2nev
+n2ney
+nn3g2
+nnhø8re.
+n4nid
+nn3ide
+nni3e
+n2nim
+nn7inf
+n5nis
+nni4sj
+nni4s3t6
+nn7k2
+nnle6ge.
+nnlø6pe.
+n4no.
+nn5of
+nno2m1
+nn6oms
+nnomsy8na
+nn1op
+n2n1o4r
+nn7ord
+n4n3o4ve
+nn9r
+nnsa9ka
+nn4s5amb
+nns5and
+nns3ar
+nn5seg
+nnsei8g
+nn4s3em
+nn6s5enk
+nn4s3es
+nnse6te.
+nnsi7da
+nn4s3in
+nn4s5i6s
+nn6s5jak
+nns5kan
+nn5s4kli
+nns5op
+nns3or
+nnst6
+nn6s5tab
+nns5tal
+nns5telt
+nns4ten
+nns5tep
+nns7tin
+nns5top
+nn6s5tre
+nns5tro
+nns3tv
+nn4s5ul
+nns3va
+nn6s5vo
+nnsy8na
+nn2sø
+nns3øk
+nn3så5r
+nn7t4
+nnte6se.
+nnto9ga
+nnu1i
+nn6ung
+nn1ut
+nnvi4s
+nn1yn
+nny4t
+nn7øk
+nn1øv
+nn1å
+1no
+noa4g
+no1ak
+5noane
+no7ar.
+2nob
+nobe4l
+no4bl
+nob5le
+no3b4r
+no5co
+nodi4e5n
+3noe
+4noef
+4noei
+4noek
+4noent
+2nof
+n1off
+3no3ft
+n6ogra
+no5id
+no3in
+2nok
+no1ki
+nok8r
+nok6se.
+n3oksi
+no9le
+2nolj
+no6mid
+no6mik
+no4mil
+4nomj
+nom9m
+nom7s2
+5nomy
+non1s4
+non5t
+2noo
+2nop
+n1opp
+no1r4a
+no5ran
+no5rar
+no5ras
+nor4da
+nor6d5end
+4nordn
+nor4d5r
+nord3s4
+nor4dø
+no9ree
+no3rek
+no3ren
+no7ret
+nor5g
+3norge
+norges5
+n3o4rie
+7norit
+4nork
+nor6kla
+nor6kle
+n4orm
+normlø7se
+nor2s
+nors6ka.
+no3ræ
+no4sel
+no4ses
+nose8te.
+4nosp
+no3stj
+nostra4
+2nosy
+no4ta.
+no4te.
+note5i
+5notek
+no4tel
+no4tes
+not3s
+4noty
+4nou
+no1v
+no3ve
+4no5vi
+4n5ovn
+7nó
+6n3p2
+n5pe
+npo8ta
+n4påk
+n3q
+2n1r2
+n9ra
+nra8na
+nra8sa
+n3re
+n4reb
+nrei7e
+n6renem
+n6reo
+n6ri.
+nro6de.
+nro6t
+nry6
+nrå8da
+6ns
+n1sa.
+ns1a4d
+n5sag
+n5sakk
+n5sa4kr
+ns3aks
+nsak6se.
+6n5akti
+ns5akv
+n3sala
+ns3ald
+n6s5alp
+n5sane
+n4sanf
+n5s6ann
+n5sanse
+ns5ansi
+ns5ant
+n5saren.
+ns6arm
+n6sart
+n4sati
+n1sch
+n3sco
+nse9a8l
+n2sed
+ns5edd
+ns8ede
+n2see
+nse5ei
+nse6er
+n6sef
+n2seg
+ns5ege
+nsei6d
+ns5eie.
+ns9eig
+n4seks
+n4s3elv
+n2sem
+n5sen.
+n5sene.
+n4sener
+n9senes
+n4senet
+n4seni
+n7sens
+n3ser.
+n4sera
+nseri7e6
+n4sesa
+n4sesi
+n4se3sk
+nse3sl
+n4ses4p
+n4sest
+n6sesu
+n4se3s4v
+n4sete
+n9sets
+n2seu
+ns5fr
+n2sh
+ns3ha
+ns7he
+ns5hi
+nsi5de.
+nsi4ent
+nsi6er.
+nsin5d
+n3s4ing
+ns3inn
+n4sinte
+nsi8ra
+nsis7k
+ns3jak
+n4sjav
+n5sjef
+n6s5jord
+n4skan
+n6s5kauk
+ns7kele
+ns4kete
+n9skim
+ns5kir
+n5skis
+n6skja
+n6skjele
+ns5kjen
+n3skjæ
+nskog6s
+ns5kor
+ns3kro
+nsku9et
+n4skug
+ns5kuli
+n5skum
+ns1kv
+n5s6ky.
+n5s4kye
+n5skyss
+n5slang
+n7slarar
+ns5las
+nsle6ge.
+n3s4lekt
+ns6leri
+ns5lid
+n5slyn
+n1slå
+ns3mi
+n4smal
+n4s5mo
+n4smur
+n4smus
+nsmå6la.
+n5s4nar
+ns5nes
+nso4d
+ns1of
+n3s2ok
+n1sol
+n4sond
+nson6de.
+nso5ris
+ns1ov
+n3sovn
+nspa9ra
+ns5pels
+n5spet
+ns1pr
+n6spros
+n7spur
+ns7s6
+nsse4e
+nsså5
+ns4ta.
+n4stak
+n4stag
+ns5take
+n3stam
+n4stank
+nst5art
+nstar8ta.
+ns4tau
+n3s6ted
+n3s4tei
+ns4tel
+nste6ma.
+ns5tenk
+n6step
+n5s4tik
+ns5tild
+ns7tilf
+n4s5tils
+ns4tin
+ns4t3i4s
+ns1tj
+n5sto.
+n3stru
+ns7trøy
+n3stue
+n6stuk
+ns5tur
+nst3ut
+n1su
+ns1uk
+n4sung
+ns5vang
+nsva9ra
+n2s3ve
+ns9veg
+ns5verd
+ns5vern
+ns1vi
+n5s4vill
+ns4vind
+ns9vis
+n4svu
+n3s4væ
+nsy4d
+ns1yt
+n5søn
+n4s1øv
+ns5øya
+n5såpe
+nså7pen
+ns7ås.
+6n1t
+n5tab
+n4tagr
+nta4lan
+ntall4
+nta5na.
+n4t5and
+nt3anl
+nt4anv
+nt3app
+n7tart
+n6t5arvi
+nt6as
+nta5sia
+nt4at
+nt3avi
+nt5avr
+nt7avs
+n2tea
+n5teat
+n2tee
+n4tef
+n4tege
+n4tegi
+n7tegn
+n2tei
+nt5eini
+nte5ins
+n5teis
+n4teka
+n7tekn
+n4tekse
+n9teleg
+n5telig
+n5tell
+n4tels
+n9telt
+nte4ma.
+nt3emb
+nte4mis
+n5ten.
+n4te7na
+n5tene.
+n4t3enh
+n5tens
+n2teo
+n5teori
+n5tepp
+nt4er
+n5ter.
+n7terek
+n6terest
+nte6risk
+nteriø7ra.
+n5ters
+n7tes.
+n4tesel
+n4teta
+n4tete
+nt4e3u
+nt5e4va
+nt9g
+nti1a
+n4tiat
+n4tid
+n5tiem
+n4tig
+n4tikap
+n5tiki
+n4tikl
+nti5kli
+n5tile
+nti3lo
+n9time.
+n7times
+n4t3ind
+nti6net
+n6tini
+n2tio
+n2tip
+n4tisa
+n4ti5sti
+nt5l
+nt5n
+nto3a
+n2tob
+nt5omf
+nt5omn
+nt3oms
+n2t1op
+n5tor.
+n5to5re
+n6torg
+n2tou
+nt1ov
+nt6ran
+n4trep
+n5trer
+nt5resi
+ntres9kjare
+n4t3rin
+ntrol6li
+n6trom
+n6trul
+ntrøy4
+nt5skj
+nt5s6la
+nts2t
+nt3t4
+n6t7ub
+ntu9e
+ntu4l
+n2t1u2n
+n4t5uro
+n2t1ut
+ntva8la
+nty6e
+ntyr3s
+nt7år.
+1nu
+4nu.
+nu3an
+nu4av
+nuft4
+nufts5
+2nug
+nug6la
+4nu4h
+nuit8e
+nuk5
+nul9t8
+4nulu
+6nuly
+nu9me
+2n1un
+nun4ge.
+nuo2
+6nup
+nu3pl
+nu4re
+nu5sa.
+nu5sen
+nu7ser
+nus4k5l
+nus7l
+nuss4
+nu6st
+nus3ta
+2nut
+nu7ta
+nu3te.
+nute6r
+nut5eri
+n7utl
+nu6ume
+6n1v
+nva6la
+nvand5
+nverle9
+nves1
+n5vi
+nvi4et
+nvi4ka.
+nvi5ke
+n3vu
+nvæ8ra
+n3w
+1ny
+ny5ar.
+ny9ast
+2nyd
+ny4de.
+4nyef
+4nyg
+ny5ge
+5n6yhe
+ny3ke
+ny3k4le
+4nyko
+ny1lo
+2nyn
+nyn8da.
+nyn4de.
+4nyo
+4nyp
+ny8pa
+ny6ra.
+ny4re.
+ny7rev
+ny4ru
+ny1s
+ny5se
+ny9s6k
+nyst4
+nystu4
+ny3te
+ny3tr
+2nyv
+ny8va.
+ny5vak
+ny8ve.
+4nyø
+n1z
+1næ1
+næ8ra.
+nær9and
+næ8rast.
+1nø
+nø2da
+4nødd
+nødde5
+nød3sk
+nød5sto
+nø9dun
+2nøe
+4nøf
+nø1fl
+nø1fr
+nø7gr
+4nøko
+4nøks
+nø4le.
+nø9mo
+nø5mu
+nø3p4
+nø7ra
+nø6red
+nø1ry
+nø3se
+nø1sk
+nøs4l
+nø7te
+nø7tr
+n6øtt
+nøtt6r
+nøv4d
+nø3ver
+nøy1
+2n1øy.
+nøy8a9n
+n7øyh
+4nøys
+n3øys.
+nå6as
+1nåd
+nå5ded
+nå8en
+nå6et
+nå8j
+n1å2k4
+1nål
+nå2la
+nå5lev
+nå8ma
+nån6de.
+n1å4p
+nåp8na
+n1å6r
+nå2s
+nå5sa
+nåse4
+2oa
+oa5c
+o1af
+oa4k
+oak6kana
+oak4ku
+o1all
+o3alt
+o1a2m
+o3a6n
+o9and
+o1a6p
+oar6d7e
+oar4d5in
+oa4r5e4g
+oa4r5enh
+oa6ré
+oa4r5i
+oar5m
+oa9té
+o1au
+o1a4v
+2o3ba
+obakk8s
+obb4l
+ob4bo
+ob4b5r
+ob4b3u
+ob4e
+o4bea
+ober5et
+ober4s
+obers5ta
+obers5te
+o3bes
+2o3bi
+obi5e6
+1ob1j
+o1b2l
+ob5la.
+ob3le.
+ob3len
+o2b5li
+3oblig
+ob4lo
+o1b4o
+obo9a
+2obr
+ob5rar
+ob1re
+ob1ri
+3obser
+ob5st
+2obu
+2oby
+obyl5
+o5bø
+o3bå
+4oc
+ock5ers
+o5cy
+2o1d
+o6dab
+oda4f
+od7att
+odd5ei
+od4del
+od4dest
+od9do
+od4e
+o2deb
+o6d5ei
+o4deko
+o5deku
+o2dep
+oderle7
+o2des
+o5det.
+o5dets
+odie4n
+o4d3igl
+o4dj
+odko5
+od3oml
+od3ov
+o2d5re
+o4d3rø
+od3sk
+ods4ka
+od3s4po
+od5s4tol
+ods8t
+odu7s
+o4dy.
+o4dyb
+od5øk
+o5døs
+od5øy
+o2d1å6
+6o1e
+oe6f
+o4ein
+oek6s
+oe2l
+oe4mu
+oe2n
+oen5a
+o7ene
+oeng5d
+oen2g7r
+oeng3s
+oeng3u
+o5ens4
+o7ens.
+oen5t
+o3e4re
+o6erer
+oer8ma
+o3ersk
+o2es
+oe6sip
+oe6sit
+oes8ka
+oes8ke.
+o4etan
+oet2h
+oe5ti
+oev6ne.
+2ofa
+o2fa.
+ofag6a
+o4fara
+ofa4se
+o2fav
+o2feb
+o4fei
+o4fera
+o4fe3st
+o1fé
+off9and
+of4fek
+of5fes
+of6fia
+off5id
+of6fr
+of2fu
+of6fy
+2ofi
+o4fip
+o1fl
+of5le
+2ofo
+o6fra.
+of9ras
+of1re
+6o5fri
+of8sa
+of8se.
+6oft
+of4tel
+oft2s3
+2ofy
+2og
+o2ga.
+og7ank
+o4gare
+o2g7av
+o2ge.
+o4ged
+og1ei
+oge7na.
+o3get
+og4gera
+og4g5j
+ogg3s4
+og6g7u
+ogi3a4
+ogie2
+o4giev
+o2gif
+o6gig
+o4giko
+o2gil
+o2gim
+o2gin
+o3ging
+o2gi1o
+o6gista
+o6gi7str
+o2giv
+og5jer
+og7la
+ogly7
+og4ned
+5o4g5ni
+og6nel
+o5g6nos
+o2go.
+og6ra
+og4re.
+o4g3reg
+o4g3rei
+og4rer
+og7rett
+o4g3ri
+og3ryd
+o4g5rø
+og5rå
+ogs4a
+ogs6an
+og3s2e
+og1sk
+ogs4kj
+og5sl
+ogs4le
+og1s4p
+ogs5pa
+og5ste
+og3sti
+og4s5tj
+ogs4to
+ogs4tr
+ogs5t6ra
+og5stre
+og5sy
+5og5s6y4v3
+ogt6r
+5o4g5åt
+og1un
+og5ø
+og7ås
+2o1h6
+ohe5te
+ohm9a
+o4ho.
+ohø4
+oia4
+o1i2d9i
+o1idr
+oid5t
+oie4n
+oi5er
+oi6es
+oi5k
+oi4la
+o1im
+o3in.
+o1ing
+oi2n1o4
+o4insp
+oi6r
+o1is
+o2is.
+o6isa
+o2ise
+o4isi
+4o1j
+o8je.
+o4jo.
+o1ka
+ok7aft
+ok1ak
+oka4n5i6
+ok2ar
+ok5ark
+o3kas
+ok1ef
+ok5els5
+ok5elv
+o5k6en
+o4kesk
+o6kev
+o1kj
+ok4kand
+4okke
+ok6kera
+ok4ke5s
+ok3kje
+ok3ko.
+ok5kol
+ok4kun
+4okl
+ok8la.
+okla5m
+ok8le.
+o1klu
+ok7lut
+oklå5
+2okn
+okna8sa
+o3ko
+o8ko.
+ok8ol
+o4k3oms
+ok3omt
+oko5pe
+ok5opp
+ok3orm
+oko4s
+oko9se
+o6kov
+o1kr
+ok5reo
+o6kret
+o4k5ru
+oks4al
+oks4e
+ok4sek
+okse5kr
+ok4sem
+ok7sen
+ok6serin
+ok4ses
+okse9te
+ok5s4i
+oksi7da
+okst2
+oks6ti
+ok6s5vi
+oks6tr
+ok5ta
+3oktan
+ok3ti
+ok5to
+okto4r5i
+okt6r
+o1ku
+ok5u4k
+oku8le.
+oku6t
+ok7ute
+o5kva
+o3kvi
+ok5øy
+o3kå
+8ol.
+4o1la
+ola6ded
+ola8ga
+ol5anl
+ol3ant
+o9lar.
+o6larbe
+ola5t
+olber4
+olbo7e
+olbo7ge.
+ol4bol
+olbu7
+2old
+ol9dan
+ol5de.
+ol4dem
+ol4dest
+ol5det
+ol3do
+oldo7ve7
+ol5drev
+ol3dri
+old3s4kr
+2ole
+o5leaks
+o6leb
+o2led
+o2lef
+ol5eig
+ole5in
+o2lek
+o7leki
+o2lel
+olele6ge.
+o2lem
+o5lem.
+o5lems
+o7lene.
+o9lenes
+o4lenet
+o4leni
+o4leno
+o6lered
+o4leru
+o2les
+ole5sta
+ole5str
+o9let.
+o2lev
+o1lé
+ol4f5i
+ol4fj
+ol3g4e
+ol1g4l
+2oli
+o4liba
+oli9e6n
+oli7ert
+oli5ne
+3o6lj
+olke3s4
+ol4kese
+ol4kesk
+ol4kest
+ol2k3l
+ol9ko
+ol6ku
+ol5kv
+ol5la.
+oll3ak
+ol4lam
+ol7le.
+ol4led
+ol4lel
+ol7len
+ol4les
+ol6linj
+ol4log
+ol4lom
+ol5los
+ol4lov
+oll5over
+olls4t
+oll5sv
+ol2lu
+ol4løp
+ol6løs
+ol6løy
+ol2lå
+olme5s
+ol4mest
+ol4må
+ol9n
+2o1lo
+o4lo.
+o5loan
+o3loe
+o4lof
+olo3i
+ol5oks
+ol3oms
+ol3op
+o6l7os.
+o6l7o6se
+o6l5osf
+olo5ve
+ol4ped
+ol7so
+ols8t
+ol5sva
+ols5vik
+ol3ted
+ol5tep
+ol2tr
+ol6t7ra
+olt5re.
+olt5rer
+olt5ret
+o1lu
+olu5l
+o4l3ung
+olun8ge.
+o4l5ur
+ol5va
+ol1vo
+o1ly
+oly7d
+ol5ør
+o1lå
+2om.
+2oma
+om3ald
+o2ma2m
+om5ang
+oma4nif
+omann4
+oman5t
+om3ars
+omar7ø8
+om4as
+om1av
+omb6
+om4bet
+om4bis
+om3bl
+5ombod
+1ombu
+2ome
+o2m1ek
+o5meka
+o7menes
+omer6s
+o6mese
+o5met
+ome4tak
+ome7tar
+om1eu
+3omfan
+3omgre
+8omh
+o2mia
+o2mib
+omi3e4
+o4miek
+o2mig
+o7mikk
+o7mine
+om7inn
+om3in5s
+o4mio
+o2mir
+o4misj
+o4mist
+o2miu
+om1j
+2omm
+om6mat
+om4med
+om4metr
+3ommø
+2omo
+o4mofo
+om1op
+omo1v
+omp2
+ompa3t
+1omr
+2omre
+2omro
+2omru
+6oms.
+oms3al
+om4sek
+3omset
+omsko9d
+omsku9la
+om4som
+oms3un
+oms4ø
+omt2
+3omtal
+om4tes
+om3ti
+om3tv
+o2m1u
+o3mus
+omvæ8re.
+6omy
+omyr8ke.
+o2møk
+omø4r
+om5øy6
+o5må
+2on
+on3abo
+o4nac
+o6nak
+o4n3ang
+o4nap
+on3app
+o6narb
+o4n3arg
+o4n3arv
+onat5r
+o2n1a4v
+on5b
+on4dar
+onder6e
+ond3re
+on4d5ri
+onds4i
+o4ne.
+on5eie
+o4nele
+o7nell
+o2nem
+o3ner
+o4neru
+onesi6
+o4nesk
+o4ne3s8t
+o4nete
+o2nev
+on7f
+on7ga.
+ong3d
+on5ge.
+on6ged
+onges4
+on5gi
+on5go.
+ong2r
+on8gro
+ong9ros
+ongs4j
+on2gu
+on4gy
+on4g5ø
+o9ni.
+o2n3i2d
+oni1e
+o2nil
+on5ild
+o2nim
+oni6mi
+on3inf
+o6n7inn
+o2ni1o
+o4ni5p
+o6niso
+on3j
+on1k
+on5k6a
+3onkel
+on5k6i
+on4kle
+on5ku
+onle6g
+on5nad
+on3ni
+on5ny
+o4no.
+o5nor.
+o4no4v
+on3ove
+on4sh
+ons1i
+onsi3s
+onsi4v
+ons1k4
+ons7ke
+ons1l
+onsla6ga
+onstitue9ra
+onstitue9re
+onst5rum
+ons5und
+ons1v
+on4sve
+ons1å
+ont6a
+on3te
+on4ted
+on5ten
+on5ti
+on4tok
+on5tor
+ont2r
+on7ul8
+on5ur
+onu4sk
+o4n5ø4
+on6øy.
+on7å6
+2oo
+ood1s
+o1off
+oo2k1
+oo5k8a
+ook5es
+ool7a
+oo4m5i
+oo6mo
+o1o2p
+oopa8
+oop9an
+oo4pe
+oop5en
+oop5et
+o6opi
+o1o4r
+oor6da
+oo5s
+oo6sp
+o1o4v
+2op.
+2opa
+o4pab
+o2pak
+opan9d
+o4pa3re
+o7paren
+o4pasj
+o4pau
+o3pea
+ope1i
+opel6lø
+2open
+o4pena
+o9pend
+o4penet
+o7pent
+o2per
+6o3per.
+3opera
+ope6rar
+o7pero
+o5pert
+2opet
+o4peta
+4oph
+o1pi
+o4piek
+oping9s
+o4pir
+2opl
+o1pla
+o4p5land
+op3li
+op9lu
+op4na.
+op4ne
+2o3po
+2opp.
+4oppa
+op4p5art
+op4pas
+4oppe
+1oppg
+op4pi.
+op6pia
+op4pis
+opp3li
+3opply
+op6poe
+op6pr
+opp5rop
+opp5und
+opp1å2
+2o1pr
+op6re
+op7ru
+op7rå
+op6sa.
+o8p8si
+op2t1r
+o4q
+4or.
+o6r7add
+or3adr
+o2rag
+or1ak
+2oral
+or5ald
+o4r5alg
+oral4st
+or6alt.
+o3r4am
+o4rana
+o3rane
+o4rang
+o4rans
+or6ap
+or3att
+o4rau
+ora3uk
+or1a4v
+4orb
+orbit5
+or7by
+4orc
+orda9ta
+or3dea
+6ordel
+ord7e6pl
+or7dik
+ordi4s
+or4d5ise
+ord3it
+1ordn
+ordre8gi.
+ordsa6me.
+ords6e
+ord3st
+ordy9ra
+8ore
+orear8a
+orear8e
+o5rebra
+o8redi
+or1ei
+or1el
+o4rela
+o6reld
+ore6na.
+ore4ned
+ore4net
+or3enk
+oren3s
+ore6o5g6
+o6rerf
+o4rero
+ore1s2
+o5resc
+ores6te
+o4reta
+or9et8n
+o6retv
+o2rev
+2orf
+orfa6re.
+orfi7ne
+orfø9re.
+1or3g4a
+4orga.
+or3ge
+or5ger
+orge4s
+orgi6e5ne
+org4sk
+orha9g
+orha9le
+o1ri
+o3ria
+ori5b4
+ori4e5ne
+5orient
+o7riet
+o2rig
+ori7ka
+o6rim
+or3ind
+or3ink
+or3inn
+or3ins
+oriro8
+6oris
+oris4a
+6orit
+o4riti
+oriti6me.
+or5ka
+3orkes
+or5ko
+orko6se.
+ork7s2
+6orl
+orla7te
+or5le
+orm5ang
+or6map
+or5mel
+or4m3un
+ormæ9
+or4nar
+orned5
+orne6dr
+or5net
+or4nol
+orn3t
+4oro
+o3roa
+o3roe
+or3off
+o5rog
+oro5i
+o1ron
+or1op
+o4r1or
+oror9da
+o5rosa
+o5rot
+or3ove
+or5ovn
+orpe6s
+4orr
+2ors
+ors5alt
+or5sen
+or4serk
+orse9ta
+orse7te.
+or3si
+ors5kar
+orsk5ei4
+ors8k9l
+ors4ku
+or1s4l
+orsmå8la
+or1sn
+or3s2o
+orso9na
+orso9ne
+orso9v
+ors4pa
+ors4ten
+or1su
+orsva9re
+or3sy
+or9sø
+2ort
+or4t3ak
+orta8la.
+or4t5and
+orta9pe
+or4t5av
+orte5i6g
+or4tek
+or3tem
+or6t5erf
+or4t5erm
+or5tii
+or7til
+or5tis
+3ortod
+or6tok
+orto9ne
+orto4r
+ort5ori
+or4tou
+ort5res
+ort5råd
+ortå4
+or4t3år
+or1u
+oru8d
+or9ude
+oru4h
+o5rum
+oru4t5
+oruta4
+or4utf
+orva9ra
+or5veg
+orv3s
+4ory
+o7rya
+or1yn
+o9r4ære
+2orø
+or9ø8k
+orøk8t
+or5ør
+or3ø4v
+orøv8d
+or1øy
+or5ås
+2os
+o1sa
+o4sa5b
+o6sad
+o2saf
+o4saku
+6o5sau
+osbi7
+osefi5
+o2seg
+o5selei
+o2sem
+os2en
+o6sena
+ose5sl
+ose5sm
+oses4sk
+oses6sp
+oses4st
+o4seu
+osfa9ta
+os2hi
+os7his
+osi6e7ne
+osi5ere
+osi5ert
+o2s1ing
+osk3ei
+oskei6e
+o4skil
+osk9lar
+osk5len
+o1sko
+osko5p
+o3skri
+os8k3v
+os2l
+os3le
+oslo1
+os3lod
+os5lu
+os5lø
+os9ma
+os5me
+os3mo
+o2sn
+o3so
+os7ove
+os6pa.
+os6pe.
+os4pil
+os4por
+os4sek
+os3sem
+os5sens
+osseri7e6
+osse5v
+ossis5te
+os6ski
+oss3kj
+os4s5ko
+oss9l
+os6spa
+oss7tro
+os7sty
+os8sv
+ost5adr
+os5tal
+osta5le
+o8ste.
+os4teg
+ost5egg
+os4tek
+ost6el
+os5teo
+o4sti.
+o8stia
+o4stie
+o4stin
+os5tis
+ost1o
+os6tons
+ost5ran
+ost3re
+o3stro
+ost5rup
+ost7rå
+o5stø
+os1v
+os5øy
+os7år
+2ot
+o1ta
+o5tad
+ota4l5a
+ot5ald
+otal7ev
+ota4lov
+o9tane
+o9tar.
+ot3arg
+o8t9arm
+o5tas
+ote7d
+ot6ei
+ote5int
+otek5i
+ote6k7la
+otekla8ga
+ote4kle
+ot5elem
+ote5lev
+otel6lan
+otel6lek
+otel4li
+otel8lø
+o4tena
+o4t5ende
+oten8de.
+o2teo
+o4teram
+o4teret
+o6terev
+o4tero
+oter5s
+ote5r8u
+o4terå
+otes6ter
+ote5sté
+otet5a
+otet5o
+otet3s6
+otfø4
+oti7ert
+oti2k
+otika3
+ot7i6ko
+o1tj
+o6tja
+ot5jer
+ot6nero
+otno7te.
+ot6nå
+o1to
+o2to.
+o4to3a
+o5toa.
+o2tob
+oto6en.
+o6tof
+ot3off
+o6toga
+o6togram
+o4toi
+o2tol
+oto5ne
+oto4ral
+otor5d
+o2tot
+o2tou
+o1tr
+ot7red
+ot5rer
+ot5rev
+o6t7ri
+o6t5rom
+o6t5rø
+ots5el
+ot6sh
+otshusvæ8
+ot4s3ki
+ots6op
+otsopp6
+ots5pr
+ots5tab
+ot7ste
+ots6å
+ot6tank
+ot5tas
+ot5tegn
+ot6tenk
+ot5tese
+ot5tin
+ot5toa
+ott4s3k
+otts5po
+otts4ti
+ot7tug
+ot4typ
+o1tu
+o6t5ut
+o1ty
+oty8e
+ot1yt
+o1tø
+ot7å
+oub8
+oul5l
+oun6ge.
+ou4r
+ou7ri
+ou5ro
+ou9sa
+out8a
+ouve4
+o5vae
+o1vak
+ovanfø8
+ovan9o
+ov3anv
+o7var.
+o6varb
+ova9re
+ov5art
+ov7arv
+oved3
+o1vei
+o1vel
+ove4la
+4oven
+o4vend
+o5vende
+ove6nya
+ove2r
+over3a
+ove7ra.
+ove9ras
+o6verdr
+overe6
+ove8r5es
+3o6verf
+3overg
+o5verks
+5overr
+5oversik
+overs4p
+over9v
+o1vet
+6ovh
+2o1vi
+oviso3
+2ovj
+6ovna
+ov4nes
+2ovni
+4ovo
+o5vo.
+o7vom
+ov1or
+o5vot
+ov1o2v
+ov5sal
+ov4sek
+ov4sen
+ov9ske
+ov4sle
+ovs1p
+ovs5te
+ov4sti
+ov7sun
+ovsy5k
+ovta6le.
+ovveg7i
+ow1
+owa8
+o7was
+owat2
+ow5h
+ox3
+oy9ar
+oys5l
+o1y2t
+o1za
+o3zy
+o1ø
+o1å
+ô6ra
+ô2re
+ôr5ei
+ô1ri
+ô4t
+ó9sa
+ó7t
+ó8v
+ò9re
+1pa
+4paa
+2pac
+pa8cen
+p5ad.
+pa3deb
+p4adg
+pads4
+2paj
+6pak.
+6paka
+4pake
+pak4kas
+pakke4s
+pakk7esl
+4pakti
+3pa1la
+pa3le
+pa7lim
+pal5in
+pal1j
+pal5lø
+5palm
+4palø
+2pam
+pa5me
+p3anal
+pa4nap
+pan9de
+pa5ne
+pang5s6
+pan3ka
+9panne.
+pan5se
+pan5sl
+pant8r
+4panv
+pa4ny
+2papa
+pa8pa.
+pa3pe
+4papo
+pap4pr
+4papr
+pap3ri
+pa4ra.
+5parad
+2parb
+4parek
+4parena
+par5ess
+par5g
+2pari
+pa4ri.
+pa3ris
+4parki
+par6k7l
+par4kv
+par3m8
+pa1ro
+4parr
+par8ra.
+par9s4
+par6tid
+par4tig
+par4tin
+par5u
+par7v
+parvi6
+6parø
+4parå
+p6as
+pasa5
+pa9se
+pase6r5
+4pasp
+3pass
+pas5sab
+pa4s3t
+pas4tar
+pas5ti
+pas9v
+pa1t
+pa3te
+pa4tist
+pa6tre
+p8atta
+pat6tak
+2patu
+p8at6v
+pau7k
+2pav
+pa4ve.
+3pa1vi
+2p1b6
+pba4ne.
+pbo6da
+pce6
+2p1d4
+pde4le.
+pdø2
+pdø9d
+1pe
+2pea
+peak3
+pe4a3re
+4peb
+pec3
+pe7d6a
+5pedas
+4pedd
+pe3de
+pedfø9
+pedi9e8
+pe6doa
+pe6don
+4pedr
+pe4dro
+4pedu
+4pedy6
+2pedø
+pe7då
+pee6
+pe3er
+2pef
+p5eft
+2peg
+p5egg
+peg8ge.
+pego4
+2peh
+pe4il
+pei4leg
+2pe1in
+pe6ism
+2pej
+2pek
+pe8ka.
+pek4l
+pek4tro
+pekt7ros
+8peku
+p6el
+4pela
+pe5l4aks
+5pelal
+pe5lar
+pel9d
+4peled
+pe4lef
+4pelei
+pe6lep
+4peler
+pe6lev
+6peliv
+6pelj
+pel4lo
+4pelov
+pel5s6e
+pel5s4i
+pel7st
+4pelu
+pe5lun
+2pely
+2pelø
+6pelå
+2pem
+p1emb
+pe4nan
+pe4n3ar
+pen3de
+6p5enden.
+4pener
+pe3net
+5peng8
+pen4gel
+pen7gl
+peni4n
+4peniv
+penly4
+pen7s8a
+pensa7k
+pensa8la
+pen5sk
+pen4s5l
+pen3s6m
+pen5s6o
+pens4t
+pen9sta
+pen7ste
+pen7tag
+pen5tr
+6peny
+2penå
+2peo
+pe7o6s
+2pep
+pep5ar.
+pep7p
+pera3a
+4pe4rab
+4perad
+pe4rai
+pe4ral
+4perap
+pera5t
+4perate
+4pered
+4perei
+4perek
+4peresp
+4perest
+4peresu
+4peret
+pe4rev
+3peri
+perie8ns
+4pe5rik
+peri3s4
+4perit
+per5k
+per6les
+per5mu
+per5n
+4pero
+pe3ros
+pero6se.
+per6regj
+per6rei
+5perro
+pers6m
+per4tro
+per4t5rå
+pervi6k
+2pery
+6perø
+4pe7rå
+2pe1s
+3pes.
+pe3se
+pe6se.
+pe7si
+pes8ka.
+p3eske
+pes4ke.
+6pesl
+pes4n
+5pess
+3pest.
+5peste.
+pes5til
+4petab
+peta6ka
+4petal
+4petas
+4petau
+pe3te
+5pete.
+4peted
+6petei
+6petek
+4petel
+4petem
+pe3ti
+4petid
+4petil
+pe4tim
+2petj
+2peto
+2pet4r
+pe4t5ru
+pet1s6
+4pett
+2petu
+4petø
+4petå
+pe2u
+2pev
+peva8ne.
+pe5vi
+p5evn
+pev6ne.
+4peø
+4peå
+3pér
+2p1f
+3p6fenn
+p3fo
+p5fr
+pfri4
+pfø5re
+2p1g2
+pgjer4
+2p1h
+phav2
+pha9va
+phavs5
+phe9te
+phe7va
+phe5ve
+phi5li
+7pi3ane
+7piar
+pi4as
+7piase
+4piav
+4pib
+pi6ca.
+2pid
+pid3s2
+pie2n
+6piend
+pi3er.
+pi9ers
+2pif
+pi9fr
+pig5ge
+pig6g9u
+p7i6gj
+2pih
+6pii
+pi4keh
+pi6kel
+pike5r6o
+pi4ké
+8pikk
+pik3ko
+4pikl
+piku5
+pi5la
+pi6la.
+pi3lep
+pil4lag
+pillba6
+pil6led
+pil4leg
+pillega6
+pille6ra
+pil4le5s6
+pi1lo
+2pim
+pi4na.
+pi4ne.
+pi9ned
+pi4nel
+pine4v
+3ping
+pin6go
+ping3r
+ping5sk
+6pinns
+pin4sl
+pi2nø
+pio6n5an
+pion5s
+3pi2p
+pi4pi
+pip9la
+pi4rar
+pi4res
+pi4rut
+pisi9e
+pi4ski
+2piso
+piss4l
+pis4sp
+pis4st
+pis1t
+pis4t5r
+pis9t8ra.
+1pit
+pi9ta
+pita7la.
+pi5té
+2piti
+4pitj
+4pitr
+pit5t
+2piu
+2pi5v
+4piø
+4p5k4
+pka5v
+pka8va
+pl6
+8pl.
+2plad
+pla8de.
+p4lak
+p4lan.
+plan7de
+4plane.
+plan5g
+plan5s
+plap3
+4p1lar
+p2las
+pla4st
+p2lat
+platina5
+2ple.
+2pled
+4pleis
+p2lek
+p6le5n4u
+ple5n4a
+ple6r5u
+ple8se.
+4plev
+p2li
+4plit
+p3liv
+pli7va
+plo4gj
+p4lo8i
+p1lok
+4p5lov
+plu4e
+p4luk
+plun3
+plun6d7ri
+p1ly
+ply5d8
+plæ5re
+plø6pa
+p1lå
+2p3m
+2p1n4
+p7ner
+pne6se.
+1po
+po9a
+pod8
+po6da.
+po4de.
+po6em
+2pof
+po6f7r
+pog6
+4poh
+po5id
+2poke
+po6lan
+po3le
+po4lek
+6polj
+pol5li
+po6lom
+pol6s4ka
+po2lu
+2pom
+pom6p9u
+pom5s
+4pon.
+pon5d
+pon4gr
+pongs6
+2pon1s
+pon5sa
+pon4sv
+po2p1a
+po6pe.
+p5opn
+pop1s
+2por.
+po1ra
+2p5ord
+po1r4e
+po4ref
+po6reg
+po8ré
+2p1org
+2pori
+2pork
+por6s7v
+por4tor
+por4t5ro
+por4trå
+2porv
+po1ræ
+po1rø
+po4se.
+po4ses
+4posj
+po2st
+po4sta
+pos5tas
+po5stat
+pos3te
+4pos4v
+5pot.
+7pota
+potak9
+po3te
+po4te.
+potek5l
+po5t6ha
+3poti
+4potr
+4pou
+2po4v
+pove6
+pover6n
+pow4
+2pp
+p2pad
+p2pak
+pp3akt
+p2p3a4l
+p9pane
+pp5angr
+pp5ank
+p4p3anl
+p2pap
+p9par.
+pp5arr
+p7past
+p4p7at
+p4pee
+p2pe5i4
+ppel5s6
+p4pena
+p8p9ender
+p4pendr
+ppe9nes
+ppe5p8
+p4penø
+ppe5ra
+p7pere.
+p4perkl
+pp7e6sen
+pp9esn
+ppes8ti
+p4peta
+pp5e4tas
+p4pete
+pp5ett
+p2peu
+p1pi
+pp1id
+p2p1il
+pp5im
+pp3inf
+p4p5inn
+pp7ir
+ppir8re.
+p4pist
+pp1j
+pp3k
+pp1l
+pp5last
+pp3led
+pp5lei
+pp9lev
+pp5n
+pp1of
+p2pol4
+pp3old
+pp5om
+p2p1op
+pp3ork
+pp1ov
+pp5p
+pp1r
+pp5rei
+pp5rin
+pp4ris
+pp7riss
+pp9riv
+pp9ro.
+ppropri6
+pp7rot
+pp1s
+ppse6te.
+pp3ska
+ppska9k
+pps2p
+pp9spe
+pp3spl
+pps2t
+pp7sto
+pp7t2
+p2pu
+pp1uk
+pp5ut
+pp3ø4
+ppøs8
+p6på
+pr6
+4pr.
+4prad
+3praks
+pra7li
+2pran
+pran3s
+5prat.
+5prate
+pra5te.
+4pray
+5pref
+prei7er.
+4preii
+pr5elem
+1prem
+pren4s
+1pres
+6pres.
+pres6sak
+p6restas
+4prett
+p3rif
+pri5ke
+pri4l3e
+4pring
+5prino
+3pr6in6s5
+3pr6in7s6e
+3pr6in7s6i
+1pris
+pri6s5k
+pris3t
+2prit
+pri9ve
+1p2ro
+8pro.
+6p7roc
+3prof
+4prog.
+4proge
+4progl
+4p3roi
+p5rop.
+3pros
+7prose
+6pru
+prun7ge
+pru5ta
+pru5te
+6prør
+prørs5t
+prø5s4
+5prøv
+prø5vels
+2prøy
+4prå
+prå8da
+pråk3i
+prå4ko
+pråk5k6
+2ps
+p1sa.
+ps5a6n
+p1sc
+p3se.
+psei8ge
+p2sek
+p2s1el
+ps5e4ly
+p3sen.
+p5sens
+p7ser.
+p5sete
+p5sets
+p2sh
+p6sib
+ps5ins
+p7sis
+p3s4jo
+p4s3kil
+ps7kjen
+p2s1ko
+p7s6ko.
+p3skod
+p5s4koe
+p2sle
+p9s8lo.
+pslø8va
+pslø6ve.
+p3s4lå
+p2sm
+psmå8la.
+p2sn
+ps4no
+ps1o
+p3sod
+pspi9la
+ps5ple
+p3s4pre
+p4s5pro
+ps5pu
+ps3s2
+pst2
+ps7tal
+p4s5tem
+ps3tv
+p5s6tå
+psu4r
+p3s4us
+ps1v
+p2sva
+p2sve
+ps4ving
+p4svæ
+ps5w
+psy3ke
+3psyko
+4psys
+p2s1ø
+p3s2øk
+psø4ke.
+psøy8
+psøy9ene
+ps1å
+2p1t
+pta8la.
+pta4le.
+pt7ark
+p3te
+pte6k
+pte4ma.
+pte7re
+p5ti
+pto7g
+p4tou
+ptus5t
+p4tut
+1pu
+pu4br
+5puc
+6pu6dy
+pu2k
+pu7la
+pu8le.
+pull6
+5pum
+pu4ma.
+punk4t5
+punk5t6e
+2punn
+2pur
+pu4re.
+pu8rea
+3puri
+3purk
+pur5u
+pur3v
+pu7sa
+pus4h
+pusl7u
+pu1ta
+pu4ta.
+pu5tas
+pu5ter
+pu5tev
+4putg
+2puts
+put6tr
+put4tu
+2putv
+6putø
+2p1v
+pver7
+pvi4se.
+py4dr
+py8o
+3pyra
+py1re
+py1ro
+6pys
+py6sa.
+py4se.
+pys6t
+4p5z
+1pæ
+pæ4re.
+pø1kj
+pør4ret
+pø8sa.
+pø9ta
+pø9te
+p1ø2v8
+5påb
+på4by.
+på1k2
+1pål
+på4la.
+på4le.
+p5ån
+på3pe
+på1pl
+p1åpn
+på1r
+1pås
+på7sko
+på5sm
+på3t2
+6påtå7
+1påv
+qa5
+qu2
+qu9ar.
+1que
+que7r
+4raam
+4raar
+4rabis
+ra1bo4
+4rabr
+2raby
+ra3cet
+ra3ch
+5raci
+ra3d2a
+4radf
+3radio3
+4radir
+4radj
+2radm
+2ra1dr
+r3adre
+rad2s3
+radvi4
+ra5ede
+rael4
+4raerk
+raf4fer
+ra4fiu
+ra2fj
+2rafo
+ra5fo.
+ra4fos
+2rafr
+ra5fre
+6raft
+ra4fu
+ra6fy
+ra7gea
+ra5gee
+2ragl
+2rah6
+7raid
+ra5int
+ra3isk
+6r5akad
+ra9kar
+ra7kel
+ra5k6ha
+r2akk
+rak4kel
+r6akr
+ra5kro
+2raks
+rak6sa
+rak3s4e
+rak6se.
+rakst6
+4rakti
+rakt3r
+r4a5ku
+4rakv
+ral5ans
+6ralbum
+5ralds
+4raled
+ra5leo
+ral3g
+4r5alge
+4r5algo
+rali5e6n
+ra4lin
+ral1j
+ral5le
+ral7m
+ralo6i
+ral3op
+ra5ly
+4ralø
+4ra5l8å
+ra4mag
+ra4mas
+ram3b
+6r9ambi
+rambu9ens
+6ramed
+4ra4mer
+ram8et.
+4ramil
+ram1o
+ramperi8
+ram6p3u
+ramse8te.
+ramta8la.
+ramta6le.
+4ramu
+6ramy
+r4an.
+ra4naa
+6r3anal
+ra5nar
+ran9cs
+r4an9de.
+r5andel
+rand3r
+rand5s6a
+r4ane
+4ranfa
+ran5ge
+6rangi
+rang5st
+rania8
+ra6nin
+ran3kv
+2r5anl
+r6anli
+2r1anm
+r4ann
+ran6n5ett
+ran4n5in
+rann3s4
+rans7kar
+4ransv
+ran4tik
+ra5nu
+ran6ut
+4ranø
+2rao
+4rapa
+ra4pel
+4rapin
+ra4pir
+ra4pis
+ra6pit
+ra1pl
+4rapo
+ra4pos
+4rappa
+4r5appl
+3rappo
+2ra1pr
+4raps
+4rapu
+1r4ar.
+2rarb
+7rarbeh
+4rarea
+4rareg
+rar5e6l
+4ra3rep
+rar7eta
+r1arg
+6rargu
+8rarinna
+6rarinne
+rar8ka.
+4r1arm
+rar8ma.
+6rarn
+4rarr
+rar3re
+rar5s
+2r1ar5t
+rar6ta.
+ra3rø
+4rasa
+2rasc
+ra3sea
+4rasel
+ras3h
+raska8ra
+ras3ke
+ra4ski
+ra7s6ko
+ra6sl
+rass4l
+ras7st
+4rasti
+ra5s4til
+4rastj
+rast5re
+6rasty
+ras7v
+ra1ta
+ratak9
+r6ate
+ra4te.
+6ra5teg
+8r7a6teli
+4ratfe
+ra1to
+ra1t4r
+ra4t5ro
+ra4trø
+ra5t6røy
+rat5tel
+ratte4s
+4ratub
+rat5ut
+6raty
+7raud
+raud3s
+6raug
+rau6ga
+rau6ge.
+4rau4k
+raus6s
+2rav
+6ravd
+rave5s4
+4ravg
+ra1vi
+r3a4vis
+4ravl
+rav8l9ut
+ravlø8pa
+ravlø8s
+rav6r
+4ravt
+ra5vy
+ra3vør
+4raw
+raz5z6
+2raø
+raøy4
+2r1b8
+rba3d
+rbe2d
+rbede4
+rbed5en
+rbed5et
+rbed9ra
+rbie8
+rbi9er
+r2big
+r2bik
+rbist6
+rbis5tr
+rbo8di.
+rbo4ni
+rbon7s
+rbo5re
+rbra5s
+rbrei6
+rbu5en
+r5bø
+r1c
+4rd
+r4dab
+r5dag
+rdag4s5
+r5dah
+r4d5ak
+rdal4
+r4dala
+rda4le.
+rdals5
+rda4mes
+rda8n9o
+r4dant
+rd5anta
+r4d3arm
+r4d3art
+rd5atl
+r4datm
+r4d3au
+rd3d2
+r6dedi
+rde4en
+r3defi
+rd5e4ge
+rd1ei
+r9deka
+r4dekl
+r4deks
+r6delo
+r6demi
+r7dena
+r6d7eng
+r6d7enh
+rden4s3
+rdense4
+rdenta8le.
+r4deo
+r6depo
+r4derik
+r4d5erst
+rde6sm
+rd3e4ta
+r6d7ett
+r8dé
+rdfes5
+rdi3an
+r4diana
+r4dians
+r6diau
+r4did
+rdi3e2
+r2dif
+rdi6gres
+rdig3s4
+r4dika
+r4dikl
+r4diku
+r2dil
+r6dimi
+r2dio
+rdi3ov
+r4dish
+r2dit
+r2diu
+rd5je
+r1dju
+rd7m
+rd3n
+rdnæ4
+r9dob
+r4d5o4d
+r4dol
+rdon8na.
+rd1op
+r6dor
+rd3ost
+rd1o4v
+rdover5
+r9drad
+r3drak
+rd5ran
+rd7rara
+rd3ras
+r3drei
+rd3ret
+r5drev.
+rd1ri
+rd3rot
+rd3sei
+rd8ske
+rds4kv
+rds5tan
+rd3sto
+rdsto5g
+rds7tre
+rds7tu
+rdsva9r
+rd5t
+rdta8ka
+rd5tr
+rd7tø
+rd3und
+rd5ve
+rdvi8ka.
+r4dyg
+rdy5pe
+rdy3re
+r6d7yt
+r6d5æ
+r7d6ær
+r7d6æ5r6e
+rd1øs6
+rdø4ve.
+rd3år
+rd7å6s
+1re.
+2rean
+re7a6r7an
+rear5e
+4reav
+2reb
+3redak
+6redam
+re3def
+re5den
+re3des
+re3di
+3redig
+r1edl
+2redo
+2redr
+re4d5ri
+red5sku
+red4sl
+reds5la
+red7s6led
+3reduk
+6redy
+2redø
+2ree
+re4el.
+re3er
+8refa
+4reff
+4refi
+2refj
+6refos
+6refr
+4reft
+2refø
+4regar
+rega7ta
+re3ge
+4regeb
+re5gel
+4regen
+4reger
+4regg
+1regi
+re4gia
+re4gil
+reg1l
+2regr
+4regub
+4regud
+2regå
+2reh
+2reid
+2reie
+2r1eig
+rei8ga.
+rei8ge.
+4reik
+rei9l
+rei5na.
+rei7nas
+re5inde
+rei5ne.
+rei7nes
+rein6skj
+re4inva
+rei9ra
+rei5sa
+rei3si
+rei7ska
+reis6led
+re7ism
+rei7va
+rei5ve
+2rej
+6rek.
+re5ka.
+re5kav
+re7ken
+4rekj
+rekk6an
+rek4k5v
+5reklam
+rek4led
+re5k6lir
+re7ko
+4rekob
+4rekom
+4rekon
+6rekos
+4rekra
+3rekru
+r3eksa
+6reksp
+rek4ter
+4reku
+r8el.
+re9la
+4relag
+9relandsk.
+9relandske
+2r2ele
+rele8ge.
+r4e5lei
+6relek
+re7len
+7relene
+6relg
+r3elit
+4re3lj
+r2ell
+rel4lag
+rel6land
+rel5led
+rel4lev
+5r4elm
+rel5ses
+rel4sk
+4re1lu
+4relv
+2re5ly
+2relæ
+2relø
+4re7l6å
+relå7r
+2rem
+remann6
+r1emb
+remi6ene
+remi6l
+re7mis
+rem9ji
+remmed5
+6remn
+rem8na
+rem5p4
+rem1s
+remti9da
+4remu
+8remy
+4remå
+2re3na
+ren4del
+4rendr
+8rened
+re5neg
+re7nei
+4renek
+r3e4nel
+4renest
+6renet
+6rengd
+reng5l
+4rengn
+reng5st
+re5ni
+2renk
+ren6kl
+r3enl
+ren8ne8sl
+rennes9la
+re5no
+ren5sa
+r3enss
+6r7entit
+4r3en5tr
+6rentu
+4renu
+5renz
+6renæ
+4renø
+re5og
+2reop
+re3o2r
+5reou
+8repen
+6r5e6pi
+1repu
+6repus
+1rer
+6rerad
+6re9rang
+4rer6at
+re5re.
+4rered
+4reref
+4rereg
+4rerei
+re4rek
+4rerent
+4rerep
+4rerese
+4reresu
+4reret
+6rerfa
+4rerig
+4rerik
+4r3ernæ
+4rerol
+4rerom
+re3ros
+rero6se.
+re5rot
+3rers
+rers4p
+4rerute
+re6r7øy
+2rerå
+1res.
+2resa
+re2s3c
+re3se
+4resel
+re4sem
+4reset
+resi7ere
+4resin
+2resj
+2resk
+res5ke
+re6s7kje.
+res6kl
+res7kod
+re6sky
+6re1sl
+re4slu
+1resm
+re5smo
+re3sov
+re9spe
+4respi
+4respr
+2ress
+res4sal
+res4sek
+res4sit
+res4sj
+res6sk
+res6sort
+res4sp
+res4st
+res4sy
+res9tane
+5restau
+res6t5erv
+res4tes
+res3té
+4re3sti
+res4til
+re3str
+4restre
+7restv
+4re5sty
+4restå
+1resu
+6resuk
+4resun
+re3svi
+2resy
+2resø
+4retaki
+4retal
+re4tap
+4retea
+8retek.
+6reteke
+4retekn
+6retel
+6re5tem
+re5ten
+4re5ti
+4retj
+4retoa
+2re5t2r
+rets4i
+ret4st
+ret7ted
+ret5ter
+rett8o
+rett6set
+4re5tu
+2rety
+2retø
+5retøya.
+7retøyets
+4re7tå
+2reu
+reu6r
+4revak
+re5van
+reva5re.
+6reveg
+4revei
+4revel
+re6v7enh
+re5ver
+reve5s
+r3e4vig
+re4v5inn
+re7vom
+1revy
+re4v5åp
+3rew
+2reå
+2r1f
+rfa5re
+rfat5
+rfe8en.
+rfe8er
+rfe4et.
+rfei5li
+r4fik
+rflå3
+rfe5m6ø
+rft2
+rfu8se
+rfyr4
+r9fæ
+rfø8rarar
+2r1g
+r5ga.
+rga8le.
+rga8li
+rg5and
+r7gann
+r4g5anv
+rga3ri
+rg3art
+rga4ve.
+r6gedi
+r4gef
+r2gem
+rgent4
+r3geo
+r4gerei
+r4geret
+r4ge3ru
+r4gesj
+r4gesl
+r4gesta
+rgi1a
+rgie4n
+r2gik
+r2gil
+r2gim
+r2gio
+r2gir
+rg3i4ri
+rgi7sl
+r2giø
+rg2le
+rg5le.
+rglem5
+rg3len
+rg3ler
+r2gn
+r4gog
+r3gom
+r2got
+rg5rab
+rg3rea
+rg3rel
+rg5reps
+rg5rin
+r3gru
+rg5sc
+rgs6kor
+rg5s4le
+rg1sn
+rg5s6till
+rg5sto
+rg9stu
+rg2sy
+rgu7d
+rg6ut
+rgå9as
+rgå6va
+rgå6ve.
+2r1h
+rhav2
+rhavs3
+rhjul8s
+rho3d
+r7hu
+rhø5re
+rhånd6s9
+rhå9ne
+ri1an
+4rianf
+4rianl
+6riansv
+ri1ar
+4riarb
+4riarr
+6riau
+2riav
+ri4ava
+3ri6avo
+2rib
+ri2b3l
+ri8ca.
+ri4co.
+ri5da
+4ridale
+ri5der
+ri5di
+2r1idr
+rid3t
+4rieie
+4rieig
+4rieks
+ri1el
+6rield
+4rielem
+6rielim
+riel4la
+rie4n
+ri3end
+4rienh
+4rient
+rien5t4r
+ri1er
+rie5ra
+rie5ri
+4rietat
+ri5even
+2rifa
+riferi9e8
+rif4fi
+rifiserba8
+6rifj
+1rifl
+rif5la
+2rifo
+2rifu
+4rifø4
+ri4ga.
+rig4gr
+ri3gi
+4rigj
+4rigre
+rig2s
+rig6s7t
+2rih
+2rii
+2rij
+5rij.
+ri4kali
+ri5kan
+5rikd
+ri3kes
+ri7ki
+rik7ken
+rikk5j
+4rikl
+ri8k9la
+2ri7ko
+6rikon
+2ri1k2r
+rik4sk
+rik4s5u
+rikt6
+rikts3
+riku6m
+ri3k4v
+4rikå
+2rila
+6r5ilde
+6riled
+ri5lei
+ril6lest
+2ri5lo
+ril4sn
+2rilø
+4rima
+ri9mab
+ri9mar
+6rimes
+ri5met
+2rimi
+ri4mi.
+7rimis
+rim7l
+4rimm
+4rimo
+ri4mor
+4r1imp
+4rimu
+rim9ut
+4rimy
+rina5l
+ri5n6am
+4rinas
+4r5inc
+4rind
+r3indu
+ri4nee
+ri4nes
+2r1inf
+rin7gom
+ring3r
+ring4sa4
+rings5ak
+ring8spa
+2r3inj
+2rink
+4rinn
+rin9nes
+4rinor
+2rins
+rins6k
+rin6sm
+2rint
+rin4t5j
+rin4tr
+2rinv
+ri6nø
+2ri1of
+6ri3om
+2ri1op
+2rior
+rio5s4
+riot3r
+2rip
+4ripe
+ripo4s3
+4ri1r
+4risau
+4rised
+rise5i
+6risek
+4risel
+ri4seli
+4rish
+5risiko
+2risj
+ri6sju
+4riska
+ri4ski
+6risku
+4risky
+6ristad
+4ri5sted
+ris5tik
+4ristil
+ri4sto
+ris5tof
+ri5stun
+6ristø
+ri6stå
+4risv
+4risy
+4risø
+ri3te
+6riteo
+ri7ti
+riti9da
+4ritil
+4ritj
+ri5t6o
+ri5tr
+rit1s6
+ritt8s7t
+ri6tun
+4rity
+2riun
+riu4r
+2riut
+4rivar
+ri6ved
+rive9ge
+ri5vei
+4riverk
+2rivi
+ri4vi4s
+riv5ise
+6rivo
+4riøk
+riø4r3a
+8riøya
+4riå
+r1j
+rj7ambi
+r4jere
+r2jes
+r4jeti
+r4jetr
+r4jetu
+rju6la
+2r1k
+rk3akt
+r6kanf
+r4kao
+r4kapr
+r6katr
+r3ke.
+r2keh
+rk5eik
+rkei8ka
+r6kek
+r4kelo
+r4ke3lu
+r3ken.
+r4kenav
+r3kene
+r4keni
+r5kens
+rke5ri
+r4keris
+r4kero
+r5kers
+r4ke3ru
+r4kerø
+rke4se
+rkeslø7se
+r9ket.
+rk4han
+r3ki
+rki3d
+rki3e
+rki4vi
+rkjek8
+rk5jor
+rk1k2
+r5k8led
+rk2li
+rk5lun
+rk9lut
+rklæ5re
+rk2lø
+rklå9ra
+r3knek
+r5knep
+rk7nes
+r3kno
+r2kob
+rko6b5r
+r6kofo
+r2koh
+r4kola
+r4koli
+r4kope
+r4kora
+r4koru
+r4kosel
+rko6sele
+r4kosj
+r6k7ras
+rk5rei
+r5k6rem
+r8ks
+rk4sar
+r6k6seg
+rk2s1i
+rk4ska
+rk1st
+rk6stal
+rk4sten
+rk4s5ti
+rk4stj
+rk4sto
+rk6s5vi
+rk5ti
+rkti4s
+rk5to
+rku4le.
+r6k7u6t
+r4k5ve6d
+rk9vei
+r5kvel
+r4kver
+rk3ves
+rk5vik
+r4k5øl
+r2k3øy
+rk9øys
+rkå4k
+rk5åke
+rkå6pa
+rk5å4s
+2r1l
+rla4te.
+rle4a
+r2lef
+r3lep
+r4l5e4ri
+r6le7sl
+rle4st
+r4lesu
+r4leu
+r3l4i
+rli9ke
+rling3s4
+rli8ta
+rli4te.
+r3lj
+rl6o
+rlog2
+rlo5ve
+rl4sk
+rlu4e
+r3ly
+rlys7k
+r6l5z
+rlø8pa.
+r5løy9
+2r1m
+rma6ge.
+rma5k4l
+r4m5alte
+rm3anl
+rm4ans
+r6manv
+r4mare
+r4marr
+rm5av
+rm3b
+r2me7g
+r2mek
+rme6lap
+rme5ne
+r4menet
+r6merev
+r4mese
+rme9tar
+r4mey
+r4m5ide
+rmi6ene
+rmini6
+rmin5ski
+r6m5inst
+rm5i4v
+rm1je
+rmlø8pa
+rmo4e
+r2mof
+rm1op
+rmo7st
+rm7p
+rm5s6ko
+rm1sl
+rms6n
+rm1st
+rms5til
+rm1su
+rmta8la
+rm3te
+rmu7an
+rmue4
+rmue5ne
+rmu8la.
+rmu6le.
+rm5øy.
+r9må.
+rmål4
+r6m5åp
+r9mår
+r6m7åta
+2rn
+r3na
+r4n1ak
+r4n3ald
+r6n5appar
+r4narb
+r4n3art
+rnat7r
+r4natv
+r6n9a6vis
+rn3avl
+rn3d
+rndø4
+rndør5
+r3ne.
+rne5a2
+r5neboe
+r2nec
+r4nef
+r2nel
+rnele6ge.
+r3nell
+r3nels
+r4n3eng
+r4nenh
+r4nerei
+r6neris
+rne3ro
+rne1s2
+r5nes.
+rne6se.
+r8nesi
+r4ne3sk
+r4nesm
+rne3so
+rn5e4tab
+r4nete
+r2nev
+rne5vr
+r2nés
+rn5g6
+r4ninn
+rn5k4
+rn3n
+r5no.
+r4noa
+rno5b
+r4nod
+r4noi
+r6nok
+r2nom
+rn5omn
+rn3oms
+r4n1op
+rn3ork
+r2nos
+r4n1o4v
+rn7se
+rn4s3in
+rn5ske
+rn3skr
+rn5sla
+rnsle7ge
+rn7s6mi
+rn6s3ovn
+rn5spon
+rn3s4pr
+rn1st
+rn4sti
+rn3te
+rn5ti
+rn7tr
+rntre4
+rnt4v
+rnu4
+rn5ug
+r6n3ut
+r7nøt
+r4n5øv
+rnå8le.
+rn3ås
+ro1ak
+roa4s
+ro5asi
+9roban
+9robar
+1robe
+ro4bed
+ro4bef
+5roben
+ro4bes
+5robølgj
+1roc
+r3odds
+7rodo
+ro5end
+ro7ens
+ro7fa
+ro4fel
+ro4fem
+roff5ri
+ro7ga.
+roga9ta
+ro7ge.
+rog5ret
+ro6gry
+rog1s4
+ro2gu
+1roi
+ro4kel
+ro5ki
+rok6kat
+rok6keri
+rok5kl
+rok4kom
+ro7k6l
+rok5n
+rok7s
+rok8se.
+rok5v
+roli7ga
+4rolj
+rol4lab
+rol4lap
+rol4leg
+rolle8ge.
+rolle8se.
+rol4lis
+rol6ly
+rolo9v
+2roly
+ro6mak
+ro4mal
+3ro5m8an
+ro4mate
+2rom7b
+4ro3me
+rome5d
+4romk
+4r3omn
+ro4mor
+2romr
+rom5sla
+r7omsy
+romsø3
+rom3t
+ro5ne.
+ro7nim
+6ronism
+6ronista
+8roniste
+6ronisti
+4ronn
+ron4na
+rono5s
+ron1s4
+ronta6le.
+ro4pad
+5ropet
+ro4pia
+ro8pla.
+2ropp
+ro9py
+ror3a
+ror6da.
+ro3re
+ro1ru
+ro4sat
+ro5sel
+ro3sen
+4rosl
+ros3la
+ro4sm
+ro6sov
+ro1s1p
+ros4st
+ros4sy
+ros7tas
+ro3sti
+ro3str
+rost7rø
+rot5ekte
+ro5tes
+rote7ster
+roti7ka
+rot5ord
+ro5tu
+6roty
+roun2
+round3
+ro5ut
+ro5va.
+ro9vare
+ro7vas
+ro5vek
+ro7ven
+rove5re
+rov5sm
+rovve6
+rò6te.
+2r1p
+r5pa
+r6parb
+r5pefo
+r4peno
+r6penø
+r5pesk
+r5pet
+rp6j
+rp2l
+rp3lad
+rprø5ve
+r3pu
+rpun7g
+r6p5ut.
+r6p5øy
+r2påk
+2r1r
+r8raa
+r2rag
+rra3r
+r4raro
+rr3d
+rr6e
+r4reb
+r7rebart.
+r2ref
+rre7int
+r4rekl
+r5relat
+r4reo
+r4repl
+r4re3ru
+rre5sk
+r4resm
+r4reso
+r4respe
+r3ress
+rre4st
+rres5ta
+rre7sti
+rre5str
+rret6s5
+rre5u
+r3ri
+rri6ka.
+r6rip
+rri5v
+rr3m4
+rrmå8la
+rro6e
+r5rom
+rro8sa
+rro8se.
+rro8ta
+rr5s2
+r2r3un
+rr5v
+rrå5de
+4rs
+6rs.
+r1sa
+rs3ab
+r2s7ad
+r3sak
+rsa5ka
+r6sakt
+rsa6la.
+r8s9ald
+rs3all
+r5sam
+r4sarr
+rs3arv
+r1sc
+5s6ch6l
+r8sedi
+rse6g7
+r4seku
+rs4ela
+rs7eld
+r4seli
+r4s3elv
+rs5e4rik
+r3ses
+r4sesi
+r6sesu
+rse4te.
+rs6ett
+rsett8o
+r7sim6
+rsimp7
+rs1in
+r5s4ing
+r4sins
+rsis5t
+r7sja
+r4sjh
+rsj3or
+r3skad
+r6s7kaf
+rs4kam
+r3skap
+r4skar.
+r4skas
+r4ski
+r5skil
+rsk7inns
+r1skj
+rs5kjens
+r6skl
+rskla8g
+rsk5lar
+rs4k5le
+rs4k3læ
+r5sko.
+r5skoe
+rsk3op
+r4skor
+r3skot
+r1skr
+r4s3kra
+r5skriv
+r4s3kro
+r1sku
+r5sku.
+r5skue
+rsku7et
+rsk5und
+rsk5var
+rs5kys
+rsk5ø
+rs4lef
+r4slei
+rs4lek
+rs4les
+r5s6lit
+rs3lok
+r4slun
+rs4make
+rs4mo.
+rsmål4
+rs6nev
+r1so
+rso9a
+rs5oml
+rso6n5
+rso7n6al
+rso5n8e
+rso5n6i
+rsons4
+r2s1or
+rs5ord
+rso7ris
+rs1ov
+r1sp
+rs4pan
+rs6pat
+r5spel
+r4sper
+r7spes
+r5spi
+rs4por
+r5spred
+r4spå
+rs3s6
+r1s2t
+r4s5tabb
+rs5tank
+rs3tap
+r6st7b
+rs4ted
+rs4tem
+rs5tend
+rsten6s
+rs5ter.
+rstev9na
+r3stil
+r4s5tilf
+r4s5tilh
+r4s5tils
+r4s5tilv
+r5stis
+r4stit
+r6st5k
+rst4r
+rs9tre.
+rs7tree
+r4strin
+r4s5tro
+r5strø
+rst7ut
+rstu9va
+rstyg7
+r3st6ø
+r7stå
+rs5ukl
+rsu9r
+rsu7sa
+rs5usi
+r1sv
+rs8vak
+rsva9ra
+rsvar4s5
+rs1ve
+r3s4vek
+rs5vit
+rsy4na
+rsy3t
+r1sz
+rsøks3
+rs9øye
+6r1t
+rt5ad
+r4t5af
+rta4ka.
+r4tana
+rt3anl
+rta9pa
+r4tarr
+rt3art
+rt3avs
+r4tec
+r4teda
+r3tede
+r2tee
+r4tego
+r4tegr
+r4teie
+r4te3in
+r4teka
+rte6ke.
+r4teki
+r4teku
+rt5e4lit
+rte6ma.
+r3temp
+rten4s5k
+rtentle8
+r2teo
+r7t6er
+r5terd
+r5teres
+r4teris
+r5terk
+r4terå
+r4tese
+r6tesk
+r6testi
+r4teta
+r4tete
+r4tev
+r4th
+rtian8d
+r4tians
+r4tiar
+rti8ar.
+rti5en
+rti6gra
+r4ti3kv
+r4tila
+r4tili
+r4tilo
+r4ti7na
+r2tio
+r2tip
+rti7sa
+r6tiska
+r4tiski
+rt6i9so
+r4tisp
+rtis3s
+r4ti5str
+r3titu
+r2tiv
+rtma6le.
+r5to.
+rt3off
+r9tofo
+r9tok.
+rt3omk
+r4t3opp
+rt6opp.
+rt3ord
+r6t7o6s
+rt1o4v
+rt2r
+rt8ra
+r9tre.
+rt6red
+rt3reg
+rt3rei
+r4t5reko
+rt5rel
+rt5rep
+r7trib
+r4t3ris
+r4t5ros
+rt3rut
+r5t6rål
+rts3ar
+rt4seg
+rts5eng
+rt2si
+rt4s5ja
+rt5ske
+rt3skj
+rt5s4no
+rt3s4pe
+rt4sti
+rt7s6trek
+rt4s5tøy
+rts5unde
+rt3t4
+rtu6en.
+r7tug
+rt3und
+r2t1ut
+rtu8ve.
+rty8da.
+rty8de.
+rtyr5s
+rty6ra
+rt5yt
+rtæ9ra
+rt5øl
+r6t5ås3
+ru3and
+6ruav
+ru6avh
+ru8bl
+ru5bo
+ru4di.
+rud4r
+ruds4l
+ru4ele
+rue4r
+rue3s4
+ruga8l
+ruga5t
+rui3d6
+4ruk
+ruk4su
+rukt3s
+ru9la
+4ruli
+6r7ulk
+rul8ke.
+r2ull
+r7ulv
+r4um
+rum3al
+rum4p9l
+5r2unde
+run5del
+6r3under
+7r4under.
+r5unders
+rund3r
+rund3s4
+run6ge.
+4ru2ni
+run5kr
+r7uly
+ru4nøy
+ru2r
+ru5ra
+ru8ran
+ru8rar
+ru9rer
+rur8ta
+r4us
+rus2h3
+6r7u6sik
+rus5j
+rus7lu
+ru1s4o
+rus5sel
+rus4st
+ru4s4t3r
+r4uta
+ru3tal
+ruta8la.
+r7utan.
+r4utbe
+4rutd
+rut8e
+rute3i
+ru4tel
+ru9tene.
+ru9ter
+2rutg
+r1utk
+rut9o
+6rutr
+rut4re
+ru6trø
+rutto5
+2rutv
+ru5va
+ru4ved
+ru4veg
+ru4vei
+ru4vel
+ru4vere
+ru4ves
+ruvi8
+ru6v7is
+2r1v
+rv4a
+rva7ka
+rva6la
+rve3de
+rve4den
+r4ve5dr
+r4vega
+r4vegi
+r4vegr
+r4veim
+rveis7e6
+rve5kl
+r4vela
+rvel9le
+r4v5eng
+r5ver.
+rve5re
+r2ves
+r2vev
+rvil9l
+rville9d
+rv2j
+r4vos
+r4vov
+r3vr
+rv2s1
+rv5ung
+rvå7r
+4r1w
+rx1
+ry1a4
+ry2dr
+ry7fe
+ry5fl
+ry5ke.
+2ry1kl
+ry7le
+ryl4l5i8s
+4r5yndl
+ry4nes
+ry5nes.
+ry4pa.
+2ryr
+ry8re
+r1yrk
+ryr4ke.
+ry9ro
+ry5rø
+rys6sal
+ry5ta
+ry4tek
+1rytm
+r3ytr
+r4z
+ræ7le
+8r3æ4re
+8r3æ4ren
+rær5in
+rær8t
+ræ8v
+2rø.
+rø8ar
+6røb
+rø4be.
+rø4dek
+rød1s
+4røep
+røf5l
+rø4ke.
+rø4kero
+røk3l
+4røkn
+røk5s4
+røk7t
+røk1v
+2røl
+rø6m
+røm1a
+røn5nes
+rønn5s4a
+rønn5sk
+røn5sko
+5r6øntg
+rø4pe.
+røp9l
+1rør
+rør5d6
+r6ørende.
+rø7ret
+5rørl
+rø2r3o
+rør4sp
+r8øs.
+rø3se
+rø5sla
+røs5v
+rø8ta
+røt9as
+rø1va
+rø5vede
+rø9vers
+rø1vi
+r4ø5væ
+2r1øy.
+4røya
+røy9ar
+røy6ed
+røy6ene
+røy5es
+røy4et
+5r6øyk
+3røyr
+røy5re
+røy8senes
+6røy4s3k
+røy4st
+2rå.
+rå7a
+4råag
+4råb
+3rådet
+rådy9ra
+rå9ene
+2råf
+4rå5g4
+2råkj
+råk3re
+rå2k3u
+råk1v
+4rål
+råle7s8
+rå4let
+rå5let.
+rå5lu
+r5ånd
+rån6da
+2råp
+2r1år
+rårs5k
+rå5ru
+rå1s
+4råsb
+2råse
+rå5si
+2råsj
+rås4t
+6råta
+råta8ka.
+rå5tr
+rå5tu
+2saa
+5saa.
+sa4ba.
+s6abe
+s8abl
+sa5bok
+s3abon
+sa5by
+sa3ce
+sa4dag
+4sadam
+sa4dere
+4sadm
+sa4do
+2sadv
+sae5d
+3saen
+7saer
+1safe
+5saga
+sa4ga.
+sa4gas
+sa4gat
+6sagent
+6s5agg
+6s5a6gi
+sag8na
+sa6go.
+sa4gog
+2s1a2gr
+sag3s4
+sa3ik
+sa5ir
+sa1is
+5sak.
+sa2ka
+3saka.
+4sakad
+sa5kai
+3sakb
+3sakd
+3s4a3ke
+5sakf
+1sakh
+sakh5e
+1saki
+sa4kj
+sak5kr
+s4akky
+5sakl
+5sakm
+4sako
+3sakp
+sa1k2r
+5s4aks.
+sak4s3i
+4s3aksj
+sak4sp
+5saksr
+5saksu
+2s1akt
+sak6ta.
+5s4akto
+s4aku
+4sa7kø
+1s4al.
+sa1la
+4s5alarm
+7sala.
+5sa5lat
+4salb
+1sa3le
+sa9let
+1salg
+s4alge
+4s5algo
+salg6s5
+s6ali
+sal4mes
+sa5lo
+5sal2s3
+sals4a
+4salter
+sa1lu
+3salv
+sal5ved
+2saly
+1s2am
+5sam.
+sa2ma
+sa5ma.
+sam4an7
+sa5mas
+sam5ei
+sa4mel
+sa4met
+5saml
+sam4lev
+5samm
+sammen5
+sa4my
+4s1a2na
+sa9na.
+sa7nar
+sa3nat
+san6da.
+san7d8al
+5s6ande.
+sand5r
+sand5s6lo
+sand5st
+san4d5ø
+1s2a5ne
+4s3a6nek
+5sang.
+3sange
+4s3angr
+s7anken
+2s1anl
+s5anm
+san5ne
+6sanno
+sa2no
+s5anor
+san5os
+san1s
+5s4ans.
+4sansa
+5s4ansen
+san7s6k
+4s5ans8l
+6sansv
+s8ant.
+san9te
+6santr
+4santy
+4s1anv
+2s1ap
+sa2po
+1s2ar.
+1sara
+6sarab
+2sarb
+s4ard
+9s8are.
+4sareal
+4sareg
+sa5rev
+3sari
+sa4ri.
+sar6ka.
+4s3arki
+2s1arm
+sar5me
+sar8me.
+s1arr
+2s1art
+sar4ta.
+sa4ru
+4sarv
+s4ary
+1sas
+8sasju
+2s1a4sp
+4s1ass
+s6ast
+4sasty
+2sasu
+4sasy
+1sat
+sa1ta
+sa5ten
+sa3ti
+2s1atl
+4s3atmos
+sa1to
+4sa5t6r
+s5atsk
+5satt.
+4s3atta
+6s5atten
+satte4s
+5sau.
+sau4d
+sau5di.
+5saue
+4saug
+sau6ga
+s3auge
+sau6ge.
+2s1auk
+5saum
+3saus
+4saut
+2s1av
+s2ava
+sa4ve.
+5s6a5v6in
+sav5n
+3savu
+8s9b4
+sba4ne.
+sbi6e
+sbo4da
+sbu6et
+s6bug
+sbul3
+sby8ta
+4sca
+1sce
+2scel
+s4cene
+s3cer
+6sch.
+8schl.
+6s7cl
+4sco.
+6scoc
+4scos
+s4cus
+8s9d6
+sdag4s5
+sdam9p
+sde6le.
+sdu8en.
+sdu8er
+sdø8v
+1se
+2se1a
+3sea.
+sea4g
+se3an5d
+se7ansa
+sea9re
+5se4au3sk
+2seb
+4sec
+4sedag
+sed5d
+se3de
+5sede.
+5sedl
+4sedo
+2sedr
+2sedu
+6sedvanle
+2sedø
+5see.
+see3d
+2seef
+2seeg
+se6e3i
+se3e4l
+se5en
+seer1
+5sees
+2seev
+2sef
+s1eff
+4s1eft
+6sega
+sega6l
+se2ge
+se6ges
+se3gev
+seg8ga.
+9segl.
+7seglet
+3segm
+4s2e7g8r
+2seh
+2seid
+sei8dan
+sei9den
+sei8e9nes
+s5ei4et
+2seig
+sei6ga.
+sei5ge
+sei5k
+3se8il
+6seim
+2sein
+se3ind
+s3eini
+se6ink
+se3ins
+se3int
+sei5r
+3seis
+2sej
+5sej.
+2se5ka
+3seke
+4seki
+2sekj
+5sekk
+sek4kes
+2sek4l
+4se3kn
+2seko
+se2k1r
+4sekra
+4sekri
+4sekro
+3s4eksj
+4seksp
+sek4st
+sek2t3an
+sek6te.
+sekte9ra
+3sek5to
+4seky
+4sekå
+s2el
+2sela
+se6la.
+3selak
+5selane
+5selar
+sel5art
+s3e4las
+se6l5at
+sel1d
+se4le.
+4se5led
+6selega
+4selei
+4s3elem
+4seleng
+4seles
+4s3e4lev
+5s6elg
+4selik
+4selil
+4selis
+4s3e4lit
+sel6løp
+2selo
+7selol
+se3lom
+3sels
+sel4sin
+8s5elske
+sel9s8lag
+sel4spo
+sel5t6
+2selu
+se6l7u6r
+sel4v5ak
+sel4van
+selv3e4
+sel4ve.
+selvei4
+sel4ver
+sel8vin
+2sely
+2selæ
+2selø
+selø8pa.
+6selå
+2se3ma
+3semb
+7semd
+se5me
+se4mi.
+semini6
+2s1emn
+sem4na
+9semnd
+2semo
+sem5pe
+2semå
+s2en.
+6senau
+sen9d8a
+sen6dela
+6senden
+4sendr
+s2ene
+4sened
+se3neg
+4senem
+8senesa
+6senese
+sene8se.
+s5engas
+2s1enh
+se6nin
+s3enkj
+5sen3n
+s2ens
+4s5ensem
+sen6s5end
+sen4sj
+sen3so
+7s6ent
+sen5ter
+8s7en5trep
+4senum
+4seny
+2senæ
+6senø
+2seo2
+7seod
+se3or
+2sep
+se3pe
+seperso5
+3sept
+s2er.
+se3ra
+4seram
+5seran
+4serap
+5seras
+6serau
+ser5d
+s2e5r4e
+5sere.
+4serea
+4sered
+4seref
+4sereg
+4serei
+4serek
+4serel
+4serenn
+4serent
+4serep
+4sereso
+4seress
+4serest
+4seresu
+4seret
+4serev
+s1erf
+s2eri
+seri6e5ne
+4serik
+4serkje
+5serkr
+5sern
+ser7nev
+2se1ro
+se4rop
+se4ror
+se4ros
+9s6ert
+ser4tak
+ser6tat
+ser4tr
+se1ru
+4serul
+se4r3un
+ser4ved
+ser4vel
+2sery
+2se5r6ø
+2serå
+5ses.
+ses5ald
+5sesals
+ses5alt
+4sesc
+2sese
+se4sene
+ses5in
+se3sj
+4sesje
+4sesjuk
+ses5kal
+ses5kar
+ses5kv
+ses5lit
+se3sna
+5seso
+ses3pr
+ses4s5in
+se1st
+5sest.
+5seste.
+4sesto
+ses5un
+ses1v
+2sesy
+4sesø
+ses3å
+3s2et.
+2se2t6a
+3seta.
+se5tae
+seta8ka
+se5tar
+6setea
+4seteg
+4setei
+4setek
+se7tel
+se4tera
+se5tero
+4setes
+2se3ti
+se8ti.
+s3e4tik
+s3e4tis
+4setje
+5setje.
+7setl
+5setn
+2seto
+2set6r
+s4ets
+s5etters
+2setu
+2setv
+2sety
+6setø
+3seum
+4seun
+seure9ne
+seu2t
+2sev
+seva6ne.
+s8e5var
+sev4d
+sevi4sa
+s1evn
+sev4ne.
+se3vr
+3sevåg
+2seyn
+2seø
+2seå
+1sé
+2séa
+6séb
+4sée
+4séf
+4séj
+4sék
+2sél
+4séo
+6sép
+9sér
+4sés
+2sév
+2s1f
+sfa4ne.
+6sfe
+sfe6et.
+sfes5
+sfisken8
+sflå3
+s5fo
+sfo8ra
+sforlø9
+sfra5s
+sfri5e6re
+sfyrs5
+3sfæ
+sfø9ren
+sfø5rer
+sfø5ri
+6s9g6
+sga4l
+sga8va
+sga4ve.
+sgen9s
+sge4st
+sgå4va
+sgå4ve.
+s1h
+4sh.
+sha2k
+s7hat
+s3hau
+6she
+shea4
+s5hei5
+7sh6e4rif
+s4hi.
+s6hip
+sh5isk
+4shj
+6s7hopp
+3short
+3show
+6shs
+2shu
+4s5hy
+s5hø
+shø8l
+shø6va
+shø6ve.
+s7hå
+1si
+sial5v6
+4sia5m
+si7ans
+4siap
+4siav
+si2bl
+3si2da
+3si4de.
+3si3den
+si4deo
+s4ider
+si5der.
+si4dete
+2si2do
+4s1idr
+sid8ra
+4sidy
+4sieg
+si1el
+sie4n
+si5er.
+si6eren
+sie4s
+si3est
+6sife
+si3fl
+2sifo
+si4f3r
+2sifu
+4sifø
+3sig
+siger4s
+4sigi
+4s3iglo
+si5gr
+4sih
+3sik
+si3ka
+si5ke.
+sik2h7
+sik4ka
+sikk8artet
+sik4k5el
+sik4ko
+siko3
+si4kom
+si4kop
+si4kos
+si4kot
+sikt4s3
+s2il
+5sil.
+3sild
+sil4del
+sil4der
+sil4des
+sil5j
+sil2k
+sil4les
+2silø
+si6mel
+4simet
+2simp
+si3mu
+4sinde
+4s3indu
+si3nek
+2s1inf
+sing4s5a4
+7singu
+si4ni
+4sinj
+2sinn
+3s4inn.
+7s4inna
+s6inne.
+5sinnet
+s3innh
+s5innk
+s3innl
+4sinnt
+si5nob
+sinsk5e
+2s1int
+4sinv
+si6nø
+4si5ov
+si4pa.
+si8pe.
+si6re.
+si7ren
+si4ri.
+sir8kl
+s2is
+si5sel
+si4serf
+sis5e4v
+si6sin
+6sisju
+si4sk
+sis5ke
+si4sn
+si4s5te
+si4sti
+sis3to
+4sisy
+3s2it
+si5ta
+sit8ji
+si6t7ra
+si4t5re
+si4tri
+sit3s4
+sitsva9
+sit6term
+sit4tes
+si4umf
+4siut
+5siva
+si9van
+si6vek
+si8vi.
+si9våt
+1sj
+2sj.
+s2ja.
+8s5ja9g
+4sjam
+s4jan
+4sjanl
+s7jarn
+2sj3av
+6s7jaz
+2sjb
+6sjd
+5s4je.
+sje4f3i
+sje4fla
+sjef5t
+sje3g
+sjek4t5o
+3sjel
+sje4lev
+3s2jen.
+5s2jene
+4s3jent
+5s4jer.
+s2je5s4
+5s4jet.
+sjet4ti
+2sjf
+2sjg
+s6jim
+2sjk
+2sjl
+2sjm
+2sjn
+2sjob
+5sjok
+4sjom
+9sjon
+sjons7
+2sjor
+2sjou
+2sjp
+2sjr
+2sjs
+2s6jt
+s6j3t6sj
+sju1a
+6sjub
+6s7jug
+sju8la
+4sjun
+4sjur
+2s7jus
+5s2jø
+sjø3k6
+sjø1p
+sjø9rø
+sjø1s2
+sjø3t8
+6sk.
+1ska
+2ska.
+4skab
+skabe3
+s2kad
+8skae
+4s6kag
+2skak
+5s4kal8a
+ska5lar
+2skam
+s4kaml
+4s5kana
+4skande
+4skane
+4skano
+6skant
+5s6kap.
+9s8kapa.
+4skapas
+5skapen.
+6skapit
+4skapp
+2sk2ar
+sk5arab
+sk7arbe
+5skard
+4s5kark
+6skars
+4skart
+3s8karv
+2skas
+4skate
+8skay
+4skb
+6skd
+2ske
+s4keda
+s6kedo
+s2keh
+s6kei
+skei5er.
+s8k5e4lev
+s6kelik
+skel3t
+s4kelu
+s3ken.
+s4kena
+s6kenav
+s4keno
+s5kens
+5skept
+s5ker.
+s4kero
+s5kers
+s2ke1s
+ske3si
+skes4m
+ske5sn
+s4ketet
+s3ke4t3j
+s6kev
+s2key
+2skf
+2skh
+1ski
+5s6ki.
+7skia
+4skid
+5skie
+5skif
+5s4kik
+s6kill
+5s4kilt
+ski6net
+ski4nin
+5sk8inns5
+skino6
+5skiol
+5skip
+2skir
+s4kire
+6s5kirk
+sk5irs
+s6kis.
+7skiss
+4s5kist
+5s2kiv
+s6kje.
+5skjema
+6skjemas
+5s6kjer4m3
+3skjer5m4e
+7skjers
+3skjor
+4s5kjærl
+5skjøn
+6skjøp
+skjø5res
+2sk1k4
+2s1k2l
+6skla
+sk5lak
+s6k5lan
+s5klas
+sk9leg
+s6klei
+sk3lek
+sk5ling
+sk5lit
+s4k5luf
+s2klyd
+2skm
+2skn
+s1knu
+4skoa
+7skodd
+4skof
+3s2kog
+2s3koi
+1skol
+7s4kola
+3skole
+4s3koll
+4skom
+s6koma
+s5k6ome
+6s1kon
+4skoo
+sk5ord
+s6korpi
+s7kors
+4skort
+2skos
+s2kot
+3skott
+sk8ra
+s4k9ra.
+5s4kral
+s4krat
+s2k7re.
+4s3kref
+6skreg
+5s8krek
+4s3kret
+5skrevn
+3skrib
+3skrif
+4skrig
+3skrik
+3skrip
+4skrite
+3skriv
+5s4krog
+s3kron
+4s3krop
+sk6rud
+skru3s6
+6skryss
+1s2krå
+2sk1s2
+2sk3t4
+5skud
+1s4kue
+sku4end
+sku4er
+skue5re
+1skuf
+5skulan
+5skular
+3skule
+6s5kulis
+4skull
+s4kulp
+4skult
+skum3s
+2skun
+s6k5underv
+4skup
+8s5kurs
+8skurv
+2skv
+sk5va.
+3skvad
+sk3vas
+s6kven
+sk3ver
+sk5vit
+3skvu
+1sky
+s6kya
+s6kye
+4skyr
+sky3re
+4skys
+6s6kyss
+5s6kysk
+3skyt
+6skæ
+6skø.
+6s5køa
+4skøe
+1skå
+skå5re
+6skåt
+sl4
+sla8da
+s3lade
+sla5ge
+sla8ge.
+sla5ke
+s5laks
+3slakt
+3slal
+4s3land
+slap5pe
+s5laran
+s5lare
+4s5last
+s1lat
+sla4te.
+4s1lau
+s5laus
+sla1v
+3slave
+sla4vin
+2sle.
+s8leda
+7slegare
+5s6legas
+s4legi
+s4legn
+s6legr
+6slei
+slei5er.
+s4leiv
+8s5leke
+s5lekk
+s2lel
+s4leme
+4sle7ne
+s6lener
+s6len6t3
+2sler
+8s5les
+s6lesj
+s4leso
+s6lest
+s4leta
+s5lev
+s4leva
+4sley
+s5lia
+2slid
+sli4en.
+6slig
+sli5ke
+s4likk
+2slin
+8s3linj
+slin6t5
+3slip
+5s4lit.
+3s4lite
+4s5liv
+slob5b
+slott4
+s6lott.
+7slottet
+1slu
+8slu7a
+2slu2e
+slu5es
+6sluf
+4slug
+sluk3s6
+slum4p5
+slum5p6e
+s3lund
+s5luns
+s6lup
+slu7sa
+s4lut
+s1ly
+sly8et.
+1s4lyn
+4s5lys
+sly8t
+slæ6rari
+2sløn
+8s5løp
+slø4pa.
+s6lør
+2sløs
+slø8s5a
+3s4løsi
+slø5va
+slø5ve
+slø5vi
+5sløyd
+sløye7
+9s4lå.
+s4låe
+s1lån
+slå5ner
+1slåt
+s1m
+sma6d
+3smak.
+5s4maken
+sma9let
+4sman
+s4med.
+s4mede
+6s5medi
+s4medk
+smeg5
+4smei
+smek7l
+s4mekt
+8s5meld
+3s4mell
+5s4melt
+2s5men
+3s4mert
+6smes
+s6mesi
+s6mia
+s4mie
+smi4ene
+s4mig
+s6mil.
+smi7la
+s6mile
+smini6
+s2mit
+smo7a
+smo8de.
+s2mok
+6smot
+3smug
+6s5mugg
+smul2
+s6mula
+s4muld
+s6mule
+5smurt
+1s2my4k
+6smøn
+1s2mør
+smør3s
+4smøt
+5små.
+små5r
+s8mått
+s1n
+8sna.
+s4nab
+7snak
+4s3nas
+6s3nat
+4snav
+4sne.
+4sneb
+4sned
+s6nee
+s4neg
+3snei
+snei5er
+sne4kri
+s7nekt
+s4nel
+2snem
+4sner
+6snes
+sne9sa
+snes9v
+4snet
+s6nif
+sni6gl
+s2nik
+snik5ko
+3s2nil
+6s3nin
+3s2nip
+snir4
+5s2nit
+2s3niv
+s8no.
+s6noe
+s5nord
+6s7not
+5s6nud
+s3num
+s4nur
+7snut
+8snyh
+2snæ
+snæ4re.
+5s6nø.
+snø5d4r
+5snøe
+1s2nør
+snø1s
+snø5vi
+so3al
+so8ar
+4soav
+2s1ob
+so2bl
+1sod
+so4da.
+5soe
+sofa1
+so4fag
+so4fas
+6s5off
+6s5ofre
+soft1
+so2ga
+so8gi
+so7gl
+sog6nem
+6soh
+5s4oi4
+so5id
+5sokn
+4soks
+sok4se.
+7sol.
+so4la.
+sol5av
+1sold
+so4le.
+solei5er
+so4lene
+sol5f6
+1so7li
+2solj
+so2lo
+so8lo.
+sol3s2
+sol5t4
+so4lum
+so4lø
+3som.
+so6mend
+4s3omfa
+4s1omg
+5somh
+2s1omk
+4soml
+1som5m
+sommar5a
+3s6omme
+somme6r5e6
+2somr
+7somren
+5somrer
+6s3områ
+s1oms
+som5sl
+s4omst
+som5sti
+4somsy
+1s2omt
+5somt.
+6somta
+3son
+so4na.
+son7da
+7s6one
+so8nea
+song3s4
+so4n3o
+sons4k
+son5st
+so2nu
+so4ny.
+2s1o2p
+so7pak
+so9par
+so7pet
+3sopp.
+5soppa
+3soppe
+sop4pi
+8sopple
+so3pr
+1sor.
+7sora
+so3ran
+5sorb
+4s1ord
+sor4da
+1so1re
+so4rek
+7sorga.
+sor4gl
+so2ri
+4s3orie
+7soris
+so5riu
+4sorke
+sor5n
+3sor5s
+7s8ort
+1sos
+4s5osc
+so8se.
+6sosf
+4sosj
+so4sl
+so5te
+so8te.
+so4tra
+sots4
+sot5te
+sot4ti
+4sou
+2sov
+so3va
+so4ve.
+so5ven
+sover5e
+sove3s4
+5sovet
+3sovj
+sp2
+4sp.
+spa5g6h
+7spak.
+7spaka
+5spake
+8spakk
+s2pal
+s3pall
+5spalt
+3s4pann
+3spari
+4spas
+5s6paser
+4spe.
+spe4a
+8speda
+spe9dé
+s4pee
+1s2pei
+s2pel
+spe4leg
+spe4les
+5spelet
+3s4penn
+s4pent
+s5pep
+spe4r5and
+6speri
+4sperl
+s4perr
+s3pers
+3spesi
+s4pest
+s9pet.
+1spi
+6s5pilo
+4sping
+s2pio
+2spip
+spi7res
+spi7ri
+spi7ro
+5s6piss
+2s3piz
+2s1pl
+8s9plant
+sp9lar
+4sple
+s4plin
+3split
+sp6o
+2spoe
+spo6et
+2spol
+5s6pole
+6s7poli
+s4pora
+s4pore
+5s4pors
+sport6s5
+3sporv
+2s5pos
+4spot
+s3pote
+spo5v
+9sprag
+5spran
+6s3preg
+5sprei
+s4prek
+spre5ke
+s3prem
+5s4pren
+6s5pres
+5s4pret
+s6print
+s5prio
+8sprinsi
+8s3pris
+8s7pro
+6s5prob
+s3prod
+4sprof
+5sprog.
+5sproge
+5s6pross
+1spru
+s4pry
+3sprøy
+5språ
+2s3ps
+8spub
+2spul
+3s2pyd
+5s2pø
+6s3pøl
+sp5øy
+9spå.
+5spåd
+8s9r
+sre8ka
+sre8ke.
+sri8e9
+sri8ka
+sri8ma
+sri4ve.
+s5ro
+sro4e
+sro6pa
+sro6sa
+sro6se.
+sro2t
+sro9te
+srot5o
+srø1v
+srå4da.
+sråde9r
+srå6ders
+srå8ma
+4s1s
+s7sabel
+s7sabl
+s6sae
+s4saj
+ssa8ke.
+ssa6la.
+ss5all
+ssa4me.
+ss5amp
+s5sane
+s7s8ar.
+ssari8e9n
+s7s6arm
+s4sarr
+ssar8ve.
+ss6as
+ssau8sa
+ssau6se.
+s6seet
+s2seg
+sse5ge
+ss5egg
+ss4el
+sse5li
+ssel5s
+ss9elv.
+ssel5v6å
+s2sem
+s5sen.
+sse8na.
+ss5enden
+s5sene
+s4seni
+ssen6ke.
+s4senu
+s6senå
+s5ser.
+s6serab
+s6serat
+sse7sk
+s4seski
+s4sest
+s7set.
+s9sets
+s2seu
+s4sey
+s2sh
+ssi4a
+ssi7e6rer
+s4siff
+s6silo
+s8s9ime
+s6s3ind
+ss5init
+ss3inj
+ss3inn
+s4s3ins
+s5sis4
+ssis5m
+ssi6v7end
+s5s6jarg
+ss4kape
+ss3kar
+sska8ra
+ss3kof
+s7skog
+s4skor
+ss6ky.
+ss4kye
+ss4kå
+ss5kål
+s7skåp
+s2sl
+ss1lo
+ss5ly
+s2sm
+ss6nar
+ss2no
+ss4nø
+s4s5nød
+ss5nøk
+s2sof
+s4sok6
+sso5lo
+s2som
+ss4oma
+sso3ra
+s4sorga
+ss3ove
+ss6pil
+ss4por
+ss9ri
+ss2t
+s5stad
+ss4ted
+ss3tek
+sstel6li
+ss5tep
+ss7tilp
+s7stip
+sst6r
+ss5tren
+ss4trå
+ss3tus
+ss3t4v
+s2sul
+s3sur
+ssva7ra
+ss1ve
+ssy6na
+ssy5r
+ss7øye
+s6så
+6st.
+2s1ta.
+stabs3
+3s6t2ad
+stad3a
+sta6d3o
+s5tafa
+3stafe
+sta5fl
+st3aft
+sta7ge
+4stah
+sta6ka.
+5stakk
+4stakl
+6stal.
+6sta4la
+sta5lak
+st5ald
+4stale
+sta4le.
+5s6tali
+5stalt
+s3tame
+3stamm
+sta5na.
+3s4tand
+6stande.
+st8ane
+s4tanf
+s4tang
+stang5s6
+st3anl
+sta8n9o
+s6t5antr
+st3anv
+4stao
+2stap
+s7tapa
+s4tapp
+s8tapå
+s3tari
+1stas
+3s8tasj
+4s5tast
+1stat
+4stato
+sta5top
+sta3tu
+3stave
+2s4t5b
+st7c
+2std
+2s3te.
+2stea
+2steb
+3sted.
+s4teda
+5stedt
+s2tee
+2s4tef
+3s6teg.
+stega6l
+s4tege
+3stegh
+4s5tegn
+s4tegr
+4stegsp
+5stegspl
+ste4her
+s2t4ei
+stei5er
+4steikn
+ste6in6s5
+3s4tek.
+4s4teka
+s6teke
+ste4ket
+s4teki
+4s5tekn
+4steko
+v4s5tekst
+s4tekt
+s8te5kv
+4stela
+ste5le.
+s5teleg
+ste5lev
+s5telig
+5stemd
+3s4temm
+5stemn
+4stemø
+sten5a
+ste4nar
+5s4tenen
+s4tener
+4ste5nes
+3s6teng
+s4teni
+6stenk
+4steno
+stens5l
+4steo
+s5teol
+2step
+step7per
+st8er.
+8s5tera
+s4teram
+s6terest
+s4terev
+s7t6erf
+s4terid
+ste7ris
+s6teri6v
+4s3term
+6sterr
+ste5run
+2stes
+s4tese
+ste7sle
+4stet
+s4teta
+ste7t6r
+s6tetø
+4steve
+4stevi
+6stevl
+5stevn
+6steå
+2s4t5f
+2stg
+stga6ve.
+stgå8va
+stgå8ve.
+2s6t5h
+st5he
+2s3tia
+4stib
+s5tibe
+s9tibl
+3stic
+6s5tid
+s6tidel
+sti5en
+s2tif
+3stift
+s4tigen
+7s6tigi
+st9i8gj
+3stign
+s5tij
+6s5tika
+4s5tike
+s4tikl
+3s6til.
+5s4tila
+sti4lag
+4stild
+3stile
+stile9ge
+s6tilk
+6stiln
+s4tilo
+6s5tils
+5s4tilt.
+6s5tilta
+5stilte
+4stime
+sti7mer
+6stimé
+3s6timu
+s6t3ind
+s6tini
+4s6tinn
+s6tinst
+s6tint
+1s2tip
+4s3tipp
+6stips
+5stir
+2stis
+6s7tisk
+4stitt
+4stiå
+s4tja
+5stjel
+4s3tjen
+s6t5jent
+3stjer
+4stju
+2stk
+2stl
+2stm
+2st5n2
+s2to.
+1stof
+2s3tog
+4stoks
+6stokt
+3stoli
+4stolj
+s5toll
+4stom
+s9tomm
+st3oms
+6s5tomt
+4stoni
+st3ope
+st5oppl
+6s8t5ord
+sto4ret
+s6torm
+stor3o
+4stors
+st5o4s
+s1tot
+sto4t5r
+5s6tore.
+st5ou
+5stova
+2stp
+8str.
+st3ra.
+4s5trad
+s8traff
+6strafi
+6strail
+st3ral
+st4ran
+stra8na.
+5strand
+4strane
+6strans
+4strap
+4strar
+st7ras.
+st7rast.
+5s4traum
+s4tre3a
+s4tred
+7s6treik
+st5reis
+7strek.
+st5rekl
+6streni
+st5rer.
+6strers
+6strh
+9stria
+9s8trid
+5strie
+st5rige
+st3rin
+3s4t6rip
+5stri3s
+6stroe
+s5t4rog
+5s4trok
+st3rol
+6s4t5rom
+st3ron
+st7rop.
+st7ro6pa
+s6trope
+s6t7rug
+9s6truk
+st5rum.
+2stry
+6stryg
+s7trykt
+4s3træ
+1s2trø
+6s5trøb
+st6røm
+4strør
+4strøs
+st5røse
+s5trøst
+4strøy
+6stråd
+2st5s6
+stsa6me.
+stsy8na
+4st7t6
+stta6le.
+st3t4r
+s4tua
+1s2tub
+3s4tud
+s2tue
+stu4el
+stu4er
+stue5re
+3s4tum
+6s3tung
+6stunn
+3s8tunt
+6stur
+2s4tut
+2stv
+s3t4ved
+1sty
+2stya
+2styd
+3s4tyk
+sty6l
+2s5tyn
+2s7typ
+3s4tyr
+styrs3
+6stysk
+4styv
+sty5ve
+1stø
+2støk
+5støl
+6støm
+5støp
+6størk
+5støt
+stø7va.
+stø5var
+stø3ve
+stø5vi
+st8øy
+1stå
+5s4tåe
+stå5k
+4su.
+1su4a
+su7a8l
+1su2b
+sub7l
+sub3o
+5subs
+s3ubå
+1sue
+su8er
+su2f
+5s2ug
+su6ga.
+su4ge.
+sug3g
+su2h
+3sui6
+su3is5
+suit5a
+su2k
+4s1uke
+3suk5k
+suk3r
+1suk5s
+su4le.
+3s4ulf
+su4lik
+sul4t5r
+s1ulu
+2suly
+sulæ5
+3s2um
+4s3umid
+su2mo
+sums6
+5sund.
+8s5under
+5sundet
+5s4undi
+sun6d7r
+9sunds
+sun4ge.
+6s7u2ni
+su4o
+3s2up
+su4pe.
+super3
+supi9
+sup4r
+su8pre
+sur5d
+su4re.
+4s3u4rei
+1surf
+su4rie
+su4riu
+surs5k
+sur4sp
+sur4sti
+1sus
+su3san
+su4se.
+su6s5es
+4susi
+su4sik
+sus3p
+sus3s
+su2sy
+2s1u4t1
+sut6ra.
+sut8reg
+7suv
+8s5u6vi
+sv2
+6sv.
+sva5a
+svai5
+5svak.
+3svake
+6svaks
+sva4la
+sva4les
+6svalet
+5s6vali
+7s6vam
+s4var.
+s4varet
+s3varm
+3s4vart
+6s1vas
+6s1veg
+sve6g7i
+s5veie
+3s4veis
+s5veka
+6s5veks
+5s4vens
+sverd5s4
+sve4re
+sve8res
+3s4verg
+5s4verj
+s5verk
+sver4ki
+s4verm
+6s7verv
+7s4vev
+s4vie
+svi6e3l
+4svig
+svi5ke.
+6svikg
+4sviks.
+3svikt
+4s5vikti
+4svil
+s6vindel
+svi4nes
+sving5s4
+ll6svint
+4svir
+2svis
+svi4sa.
+svi4se
+svi5sen
+svi5ser
+s8viv
+svi9ve
+4svol
+5s2vor
+svor7t
+s3vr
+3svul
+5s6vulm
+s3vy4
+svye7ne
+1s2vø
+4svæs
+2s7vå
+1sy
+sy4c
+sy4de.
+sy5den
+5sye
+sy2er
+sy8ka
+sy4ker
+sy5kere
+2syko
+sy6kog
+s4ym
+sy7me
+s2yn
+4s5yndl
+synk4
+syn6sk
+syn3te
+sy4ra
+sy5rar
+s6yre
+sy4re.
+2s1yrk
+syr4ka
+syr4ke.
+3sy1s
+sy4se
+sy2sl
+sy2s3t
+sys4tr
+2sy2t
+sy5ten
+sy5t6h
+9sytt
+sy2vå
+s4z
+sz3c4z
+6szt.
+1sæ
+sæ2l
+8s3æ4re
+8s3æ4ren
+sæ4r1i
+særle9
+sær5s8
+7s6æ5te4
+4sætt
+1sø
+4sø.
+sø2d
+s1øde
+4søf
+søg4
+4søj
+9søk.
+3s6øke
+5søkj
+5søkk
+søk7kj
+3s6økna
+2søko
+søk4sk
+søk6s3e6
+5s6øksm
+søk4ta
+3s4øl
+sø4la.
+sø4le.
+sø5let
+3s2øm
+sø6må
+3sønn
+s1øns
+s4øp
+sø4ras
+sø4re.
+sø4r5end
+søren6de.
+sø8ret
+sør9ett
+7sørl
+sør3s
+sør5ø
+3s2øs
+4søs.
+sø8sa
+7søt
+sø7tast
+sø7tel
+sø5tes
+2søv
+s1øve
+3søvn
+2s5øy.
+4s3øya
+søy8de.
+6s5øyd
+8søye
+3søyl
+6s5øy4n
+søy2r
+2s7øys
+5såg
+s3å2ke
+5s4ål
+så4le.
+6s1ån
+sån4da
+sån6de.
+så2p
+9såpa
+så5pet
+6s1åpn
+såp9u
+så2r
+så6ra
+sår9ast.
+så4re.
+sår3sk
+sår7ø
+så2s
+s7åsa
+s4åsb
+s5åse
+sås5k
+sås5t
+9såv
+såva7
+ta1a
+4tabo
+tab2r
+tab2s
+ta4bu.
+4tabø
+ta1c
+4tad
+ta2da
+ta8d3ei
+ta6d3e4t
+tad5spa
+tad7s6v
+ta6du
+t8ae
+6taei
+4taek
+4tael
+1taen
+4taend
+4taenh
+ta6es
+2ta5fe
+taf7f6
+5tafis
+4tafl
+1tage
+4tagj
+8tah
+ta7is
+1tak.
+ta4ka.
+4takau
+ta7ken
+ta5ker
+tak7kel
+tak5k4l
+ta8k9la
+2takr
+tak4sal
+tak6se.
+tak4si
+4t3aksj
+5takst
+tak4tal
+4taktig
+tak4to
+t5aktø
+ta1ku
+tak3v
+1tal.
+ta9lam
+ta3lan
+tal5ang
+ta7las
+3tale
+ta4lei
+tal5eie
+ta4lek
+ta5ler.
+tale7s6
+1talg
+tal6ge.
+7talj
+talj5es
+tal4led
+tal4leg
+8t7allerg
+tall7es
+tal8lign
+tall6s9a
+tal4ly
+tal3op
+6talter
+t5altern
+ta6l9u
+ta6lå
+2tamb
+tamba6ne.
+t3ambi
+t4ame
+4tamet
+tam4i
+2ta3m4o
+t6an.
+ta2na
+4t3anal
+ta3nar
+ta5nas
+ta5nat
+t5andak
+5t6ande.
+t7andel.
+t5andele
+tand5r
+tandø4
+tandør5e
+1tane
+ta4nel
+ta5nem
+4tanett
+t3anfa
+tanfø6
+6tangf
+6t3angr
+1tank
+2tanl
+t3anle
+2t1anm
+3tannl
+t5anno
+tanns4
+tan6sk
+tans5ka
+t5an5sl
+4t5anstr
+4tansv
+8tantil
+tan4tra
+6t7antre
+t3anve
+2ta3o4
+5tap.
+ta4pa.
+1tape
+ta4pe.
+3tapi
+4tapl
+4tappa
+5tappi
+1t4ar.
+t6ara
+ta4r3ak
+4taram
+ta6rare
+2tarb
+3tarbo
+5tarbø
+4t9arena
+6t7ark.
+tar8ka.
+4t5arke
+4t3arki
+4tarra
+tar9si
+tar7sp
+tars6v
+4tart
+tart7est
+t5artik
+tar7tit
+tar4t3r
+ta6r5å8k
+4tasa
+ta3se
+6t9asf
+t3a4sia
+tasi3e
+ta4sif
+ta4sil
+ta4si5s4
+tas4p
+tas5s4
+6ta7sto
+ta7str
+4tasu
+ta1ta
+ta7tes
+tate8se.
+tat5e4v
+tati1
+tat3op
+tat2s1
+tat3te
+t3attr
+1tau
+9tau.
+7taue
+4t5aug
+2t1a4uk
+4taun
+tau4ne.
+tau4sk
+2taut
+2tav
+6tavin
+3tavl
+4tavli
+ta9xy
+6t1b2
+tba3d
+tba2n
+t6be.
+tbe6te.
+tbe6t7r
+tbe6t8ra
+tbo6da
+tbu8da
+tby3k
+tby4s
+tby7te
+2tc
+t1ce
+tcen4
+tch5e
+t5co
+2t3d
+tdy5pe
+1te
+4tead
+4te3ag
+2teak
+2te9a8l
+tea6m
+2tea2n
+2teap
+2tear
+te5arb
+tea4s
+3teatr
+4teatt
+2teau
+2teav
+4teb
+t5ebb
+tebu8da
+4tecel
+te1co
+2ted
+6t5eddi
+3tede.
+4tedeb
+te7def
+4tedek
+4tedel
+4tedem
+te5den
+4tedi
+5tedil
+4tedo
+tedo6en.
+tedo4er
+tedo8et.
+te4dor
+ted4sk
+ted4sl
+6tedu
+4tedy
+tedyr9k
+4tedø
+te3e4
+2tef
+8tefa
+4tefi
+4tefl
+4tefo
+tefo8r
+t3efte
+3tefø
+2tega
+5tegat
+4t3egd
+te7gea
+te9gee
+4tegg
+teg8ga.
+2tegh
+te4gim
+2tegj
+2tegl
+te3gla
+te9g8li
+8tegs.
+6tegspl
+6tegsv
+2tegu
+tegvi8
+2tegå
+5tegås
+4teh
+5tei.
+2tei4d
+t3eie
+t3eiga
+tei6ga.
+t7ei6ge.
+6teigr
+3teikn
+tei5le
+te1im
+6teinf
+te4inne
+te5inte
+te5i4s
+6teiso
+2tej
+te7ken
+te5ker
+4tekil
+2tekj
+5tek1k
+2tekl
+te5k4la
+tek6lede.
+tek4li
+4teknu
+2teko
+2tekr
+te7kra
+te6k5ru
+9teks.
+4t3eksa
+t3ekse
+4teksp
+t4ek8st
+tek8t9r
+tekt4s
+tek6ty
+2teku
+te2k3v
+4teky
+2tekø
+4tekå
+2te3la
+tel6ak
+5te4l5ar
+3telav
+8te4le.
+4teled
+4telei
+4telek
+4teleme
+te4lene
+6teler
+te4les
+te5lesk
+4te4lev
+te6leva
+4telid
+4telik
+4telil
+4telin
+te4lir
+4telis
+4telit
+4teliv
+tel5lef
+tel4lei
+tel4lev
+tel8lign
+tel4lo
+2telo
+tel3se
+telses5
+t3elsk
+tel7s6v
+5teltet
+2te1lu
+7telut
+2tely
+6telæ
+2telø
+telø8pa.
+2telå
+2tem
+3temae
+6teman
+te4mans
+t5emba
+6temenn
+5temik
+tem9ma
+6temn
+tem5ne.
+tem5ord
+tem5pe
+tempe8l7
+3tempo
+tem3s
+4temø
+3ten.
+te5nab
+te4n5al
+ten8am
+te4nan
+te4nat
+ten5at.
+6t7enc
+6t5en6den
+4tendr
+4tened
+te5neg
+6tenem
+6tenerg
+5tenes
+4tenet
+2teng
+7tengon
+t5e4nig
+7tenik
+5tenis
+4teniv
+ten9no
+te4nom
+te5nor
+6tenorm
+4tenot
+te6nov
+6tenó
+ten3sa
+ten5sko
+ten6slu
+ten3so
+tens5v
+ten4t5in
+tentle8ge.
+4tenum
+4teny
+4tenæ
+2tenø
+ten5øks
+2teom
+5teon
+4teop
+te6ora
+4teord
+2teov
+2tep
+te3pa
+4tepak
+tepa9ra
+4tepas
+4te5pe
+7tepee
+9tepé
+tep6pere
+t5e6ple
+4tepr
+4terac
+te7rakk
+6teramm
+ter7apa
+4terapp
+te4rare
+6terasa
+4terase
+7terast
+terba6ne.
+t6er5d
+4tered
+4teref
+4tereg
+4tereis
+te4rel
+8terem.
+6teremm
+te4r5eng
+teren6ga
+6terenn
+4terep
+te4rerk
+ter5esti
+4terett
+6terevo
+3ter5g
+3terh
+te4rig
+4terik
+4terisi
+te4riv
+ter5j
+4terk.
+4terke
+4terkh
+7terkr
+6terks4
+4terkt
+terla6ga
+terle7ge
+terle6ve.
+ter8ma.
+ter3no
+tern5s
+te5ro.
+tero6e
+te3rof
+4teroll
+4terom
+5teromr
+4te3ros
+4te3rot
+tero6v
+ter5r
+5ters.
+5tersjøo
+ters4kl
+ter7s6ko
+ters4l
+ters4h
+ter3s4m
+ters6ne
+ter5sv
+tersø6ke.
+3ter3t
+ter9to
+ter9ul
+8terum
+ter7v
+tervi6se
+2tery
+ter5ør
+4terøt
+te4r3øv
+4teråd
+te4r3ås
+t4es
+5tes.
+2tesa
+5tesar
+te7sen
+2te1sh
+4tesid
+4tesik
+6te3sin
+4tesit
+4tesj
+6tesjef
+4te1sk
+t9es6ka.
+6teski
+te5sko
+2te1s2m
+7tesmåe
+2te1sn
+2te3so
+6tesp
+5tesr
+3tess
+5test.
+4testaf
+tes5tas
+4testat
+5tes7te.
+4te5stei
+te5s6tiv
+5testid
+tes4tik
+4te5s4til
+4te3sto
+4te3str
+4testy
+4testø
+2tesu
+4te1sv
+tes8væ
+2tesy
+2te3sø
+te7så
+te8sår
+teså9re
+3tet.
+teta6ka
+teta6le.
+te4tap
+te3te
+5tete.
+tete4e
+4teteg
+4tetei
+4tetek
+4tetem
+2teti
+3tetik
+3tetis
+2tetj
+2teto
+2t8et2r
+3tet2s
+tet5ti
+tett3s
+2tetu
+5tetu.
+2tetv
+2tety
+te2t3å
+2teu
+teu8k
+t1eur
+3teus
+2tev
+t6eva
+te4valu
+3tevl
+tevo6r
+te3vr
+2tey6
+2teø
+2teå
+4téa
+2téb
+2téf
+2téh
+2téi
+4téle
+2tém
+2tése
+4tést
+6t1f
+tfe6e
+tfe4l
+tflå3
+t7fo
+2t3g2
+t4ga.
+tge4a
+tgei5
+t4gi.
+tgi5ros
+tgrei9e
+t4gå.
+2t1h
+t4hap
+t4hea3
+thei5m
+tho7li
+tho3re
+3thr
+thu5le
+thu6s
+thy5r
+1ti
+2tiad
+ti3ag
+2ti1ak
+4ti3all
+ti5als
+2tia2m
+2ti1ap
+ti3asp
+4tiau
+2tiav
+2tib
+2tick
+3tid
+ti2da
+4tidan
+tid7d
+6t3idee
+4ti5dem
+4t7idé
+4tidis
+4tido
+4tidr
+2tidu
+tidvi4
+6tidy
+4tidø
+ti1e2
+2tief
+2tiei
+2tiem
+4tienh
+tie5ra
+4tierf
+4tierk
+ti4ert
+ties3
+ti3esk
+ti3et
+4tieta
+4tiett
+2tifa
+tifa8ne.
+2tife
+4tifl
+2tifo
+2ti5f6r
+t8ifrå
+4tift
+tif5te
+2tifu
+4tifø
+ti9ge.
+4tigj
+2tign
+3tigno
+ti6gun
+2tih
+2tii
+2tij
+ti3ka.
+6tikarr
+ti5ke
+4tiket
+4ti5ki
+6tikj
+tik4kj
+2ti3ko
+2ti1k2r
+ti3ku
+6tikular
+6tikult
+6tiky
+4tikø
+t4il
+tila6ga
+til1d4
+3tilde
+2tile
+ti3lei
+3tilfe
+3tilg
+til3id
+4tilke
+3tilkn
+4tille.
+4tillh
+4tillin
+tillø7
+4tilm
+7tilnæ
+3tilst
+til3t4
+4tilte
+2tilu
+2tilø
+ti7mab
+5timat
+ti4me.
+5timedie
+ti4mera
+5timeri
+2timl
+4timo7
+4tim6o8r
+2t1imp
+tim7s
+2timu
+2timy
+2timø
+ti6nab
+tin5art
+4tinaz
+2tind
+t3indu
+ti4nem
+4t1inf
+tin5ge4s
+6ti4nit
+6t5inj
+2tink
+7tinks
+4t1inn
+6t5inne
+ti5no
+tinsk5
+4tinsp
+4t3inst
+4t1int
+2tinv
+4tinva
+4tiny
+9tiol
+6ti7om
+tion9s6
+4tiop
+ti1or
+ti1ov
+ti3pa
+ti6pla
+4tipr
+3tips
+2tir
+tira4t
+ti4ref
+ti1ro
+6tisak
+4tisam
+ti5s6an
+ti3se
+4tis4ei
+4tisek
+4tisel
+4tisem
+4tisep
+tise8ra.
+4tisers
+6tisig
+4tisio
+4tisje
+4tisju
+tis4ka
+4tiskan
+4tiskil
+tis5kok
+6tisku
+tis5l
+4tisn
+4tiso
+6tisprå
+4tistat
+tis4ti.
+tis4til
+ti5stre
+4tisty
+4tistø
+ti8støy
+2tisy
+2tit
+ti7ta
+ti3te
+ti1tj
+3titl
+tit4r
+tit3s
+3titt
+4tiub
+2tiut
+ti4v5and
+tiva9re
+ti4v5art
+tiv6is
+2tivo
+tiv5si
+tiv5sk
+4tiy
+ti5ær.
+ti7ære
+ti9ært.
+ti1ø8
+2tiå
+6t3jag
+2t1jak
+t5jarn
+2t1je.
+2t1jeg
+2tjel
+1tjen
+tjen6st
+6tjep
+2tjer
+t5jev
+2t1ji
+5t6jingan
+5t6jingar
+2tjo
+t5jord
+2tjub
+tju4e
+2tjun
+6tjur
+3t8juv
+tjæ4res
+2tjø
+4tjå
+4t3k2
+t6kag
+tka8ra.
+tkly9
+tku6le.
+tkå8pa
+6t3l6
+tla4ga
+tla8te.
+tle6da.
+t4ledr
+t6lef
+tlei5er.
+tle8se.
+tle5ti
+tligh6
+tlight5
+tli6nes
+tli4te.
+tlu4e
+t6l7ut
+tlø4pa.
+tl7øy.
+tlå3ne
+tlå7r
+2t1m
+tma3d
+tma8ge.
+t6maku
+t2mam
+t2meg4
+tme3in
+t2mek
+tmini6
+tmin5s6
+t2mos
+tmå4la.
+8t1n
+t3na
+t6nee
+t4neli
+t7nelig
+tne4rek
+tne4r5ø
+tne8se.
+t4nesk
+t4nest
+t5ni
+t8no.
+tn5sk
+tnæ6re
+7toan
+7toar.
+toa6t
+6toau
+2toav
+tobe6r
+t3o2bl
+6tobs
+4toc
+to5da
+to9de.
+to4dera
+3todo
+1toe
+2toek
+6toel
+toe4t
+2tof
+6toff.
+t3ofre
+to5fri
+to2g3at
+to7gen
+4togg
+to6gl
+6tograv
+to4gre
+tog3st
+to2gu
+2toh
+toil3
+2to1in
+4toj
+t6ok
+1to3ke
+to3ki
+2tokj
+2tokk
+tokk5end
+to3kl
+5toksi
+5tokt
+2toku
+to4l5arm
+5tolat
+to5lel
+tolele7
+5tolera
+toli8ne.
+2tolj
+1to4l3k
+7tolki
+tol4lab
+tol4lag
+tol6leg
+tol6lett
+3tolo
+tol5tr
+4tolå
+to9ma.
+2tomb
+to5mene.
+2tomf
+4tomg
+to3mi
+to5mise
+to7mist
+4tomk
+tomlø8pa
+t8omm
+2tomr
+4tom1s
+5toms.
+1ton
+to5na
+to4ned
+to4nel
+tong5s4
+to8nib
+2tono
+ton3sa
+ton5s4l
+ton5sp
+2tonu
+to4ny.
+2to3o
+4to1pl
+4toppd
+6toppg
+6t5opple
+4t5opplæ
+top4po
+4toppt
+4topr
+to1ra
+to4rak
+tor5alt
+tor5ang
+to4r5ant
+to4r3as
+4tord
+tor8da.
+to1re
+6toreg
+to4rek
+tor7eks
+to7rem
+6torent
+5torer
+tore4t
+tor5ete
+4torga
+tor5int
+tor7me
+torm5s
+tor5na
+tors4i
+tor5t8
+torvei5
+to4rø
+4torå
+to1s
+4tosa
+4to3se
+to2sh
+6tosj
+tos5ke
+to8sku
+4tos2p
+2tosy
+4tota
+to5te
+to8ti.
+to5to.
+to4tor
+6toty
+2tov
+to1va
+to7veg
+to5verd
+tove7re
+t5overs
+5tow
+4toø
+6t3p2
+t7pa
+tpi7ne
+tpi7pi
+tpo4et
+t4påk
+tr4
+8tr.
+6t9rabat
+3trafi
+tra8ka.
+trak7to
+t5rane
+3t6rans
+tran7ske
+5trap
+tra3pe
+tra5po
+tra5r4
+5trase
+tra5se.
+tra5ses
+5trasé
+t2rat
+t5rate.
+3trav
+tre4al.
+tre1c
+4t3reds
+t3refu
+6t1reg
+t5regi
+4trei
+tre5int
+6trek.
+4treke
+4trekl
+4t3rekor
+4trela
+3t6re7na
+tre5ne
+t6reng
+3t6reni
+4t3renn
+tren6sk
+t7repe
+t5repres
+t2rer
+t4rero
+t4re3ru
+2tres
+6tresi
+tre5sko
+tres4l
+3tresn
+t5resu
+t1ret
+t4reta
+t6reto
+t5retted
+5t6rettel
+4trev
+tre9va
+t6rib
+4t1ric
+4t4rid
+tri7ei
+t5rig.
+t4rikk
+t8rina
+t4ri5ne
+4t5ring
+3trinn
+7t6rio
+t4rist
+tri5to
+t4riu
+t2riv
+tri7vi
+5trix
+3t4ro.
+5troa
+tro9ar
+3troe
+t4rof
+tro5g
+3t2roi
+tro3in
+t4rok
+t2rol
+4t3rom.
+t6rond
+5t4rong
+tro5per
+t2ros
+5t6rosk
+tros3l
+tro1v
+t8ru.
+t8rua
+7trua.
+5trued
+5truet
+3trug
+tru1i
+5trukn
+t3rull
+2t1run9
+t3rund
+4trupe
+tru5sa.
+7t6rusk
+2trut
+t5ruta
+t3rute
+t3ruti
+tru5v
+try3dr
+3t2ryg
+tryg5ge
+7trykk.
+5trykke
+try7pe.
+t6ræ
+trø8a
+t5rød.
+t5rødt
+4trøk
+4trøm
+2trør
+5trøt
+5trøya
+5trøye5
+trøy9et
+4trøyr
+6trøys
+5trøyt
+trå8da.
+4trådet
+trå4dr
+t6råkl
+t3råst
+4ts
+6ts.
+t5sa.
+t5sab
+tsa2g
+tsak6se.
+ts1an
+ts4ang
+tsau6r
+t1sc
+t6scha
+t6sch5k
+t5se.
+tse6d
+tse4er
+ts5ege
+tsei4d
+ts3eig
+ts2em
+t3sen.
+ts4ende
+t5sendi
+tsen8ka
+tsen6ke.
+t5sens
+t4sentu
+t5ser.
+t3seri
+t4s3erk
+tser3o
+t5s6ers.
+ts4es
+t4sesk
+ts5e6st
+ts3eta
+tse4te.
+ts1e4v
+ts3f
+ts4fæ
+t7s8hop
+ts7ill
+ts3inn
+t4s3ins
+t5sir
+ts5jeg
+tsje5t6sj
+ts5jor
+5t6sjov.
+t7sjuk
+t4sjur
+t5skad
+t4skan
+ts6kis
+t4s5kjed
+ts6kjø
+t5skol
+t6skoll
+t7skot
+ts5kren
+tsk5ru
+ts5krø
+ts1k6v
+ts9kvi
+ts6ky.
+t6s7kyn
+ts1l
+t7s6lo.
+t3s4lot
+ts2lu
+ts5lø
+t5smit
+tsmå6la.
+ts1o
+t4s5o4d
+t5sok
+t5somst
+t5spek
+t3spel
+ts2pi
+t2s3pike
+t3s4por
+ts5s4
+t1st4
+t2s3tabb
+t5stad
+ts3tak
+t4s3tal
+t5stand
+t5stang
+t5star
+t5stat
+ts6tau
+t3sted
+t4steg
+t4stek
+ts6tig
+ts4tik
+t4stilk
+t4stin
+t4stit
+t2s1tj
+ts5ton
+ts5tors
+ts5tree
+t4s5tren
+t4s5tro
+ts3try
+ts6trål
+t5stu
+ts3tv
+t4sua
+tsu7ge
+tsu4l
+ts3uli
+ts3u4r
+ts5usi
+ts1v
+t3svik
+ts1w
+t5syk
+ts5yt
+tsø8ka
+ts5økni
+ts5øv
+tsøy8er
+ts1å
+tsåt8
+6tt
+t1ta
+t3ta.
+t2tab
+ttaba6ne.
+tt9abo
+tt5adr
+t2taf
+tta9fr
+tt3aft
+tta4la.
+t6t3ald
+tta7lel
+ttall4
+t4t3ana
+t5t6ane
+t4t3ang
+t4tans
+t4tanv
+tt5appe
+t7t8ar.
+ttare6
+t4tarr
+tt5ar5t
+tt6arta
+t4tase
+t4tasj
+t4tav
+tt3avi
+tt5avk
+tt5avr
+t3te.
+t2tea
+t3ted
+t4teda
+t5tede.
+t8tedr
+t2tee
+t4tef
+tt3eff
+t2teg
+t2tei
+tt7eid
+tte3in
+t2tek
+tte7kv
+tt7elev
+tteli6te.
+t4tem
+tte4ma.
+tt5emn
+ttem8na
+ttem6ne.
+t3ten
+t5ten.
+t4tena
+t5tene.
+t4teni
+tten5s
+t9tens.
+t4t5ense
+t2teo
+t5ter.
+t4terei
+tter5un
+tte4r5ø
+t4terå
+t4tese
+t4tesi
+ttes6ke.
+t4tesl
+t5tet.
+t4teta
+t4tete
+t1té
+t4th
+tt5he
+tti5a
+t4tidel
+tti3e
+t2tif
+t5tig
+tti4g5j
+tt3ind
+t5tine
+t7tiné
+t5ting
+t4tini
+t4t3ins
+t4tisj
+t6tisti
+t7tite
+ttle6de.
+ttlin5
+t1to.
+t5tofr
+tt5om.
+t7tomr
+t2ton
+tton6na
+tt3opp
+t5tora
+tt3ord
+tto5re
+tt5o4ri
+tt3orm
+tto5u
+ttpar4
+tt6pås
+tt9raka
+tt5rake
+tt3ram
+tt3rap
+tt7rat
+t4t3rep
+tt3res
+tt3rev
+tt5rom
+t5trop
+t5try
+t2t1rø
+t6ts
+tt7saf
+tts3ar
+tts5kan
+tts5kj
+ttsla6ga
+tt3sok
+tt5still
+tts5top
+tts5tra
+tts5tøy
+tt3ugl
+t1tum
+tt1un
+ttun6ge.
+tt1ut
+tt8ute
+ttva8la
+tt5ve
+tt6vun
+t5tw
+t5ty.
+tty8e
+tt1y6t
+ttæ6
+tt3ø4l
+t1tør
+tt3øv
+tt7øy6r
+tt1å4
+5tual
+4tu4av
+tuba3
+tu4be.
+tu6bå
+tu6dem
+5tuel
+tu4er.
+tug8la
+tu1in
+tu2k
+t5uka
+t1uke
+7tukt
+3tula
+1tule
+tul5les
+tum5m
+tum4s
+3tun.
+4tund
+3tune
+tun5gesv
+6tungd
+tung9s
+6t5uni
+tu4nio
+5t4un5n
+9tuns
+3t2ur
+tur7ant
+tu4ras
+4tu4rei
+tu4rek
+turi4
+tu4rin
+tur1o
+tur3p
+tur5s4
+tur3uk
+tu5rus
+tur1ø
+1tus.
+tu1sa
+3tusb
+3tusf
+tu4sin
+tu4sm
+tus5o
+tus7s6t
+tust6r
+tus5u
+2tutg
+t5utj
+t5utk
+t1utr
+tut6tenk
+tut5tor
+tutt5ov
+tu8va.
+2t1v
+tv4a
+tva8k
+tva6ne.
+3tvang
+t4v5anl
+8t9var
+tve5del
+3tveit
+4t7ver
+tvert5
+t2vet
+3tvet.
+7tvets
+t5vik
+tvi8ka.
+t8viklas
+5t4vil.
+tvi5la
+5t4vile
+t4vi5l4i
+t6ving
+tvi4sa.
+tvi4se.
+6t7vo
+3tvung
+6twa2
+1tyd
+tyg9gel
+tyg5ges
+6tyh
+tykk5s6
+ty4med
+1tyn
+ty4ne.
+6t5yo
+1typ
+5t6ype
+ty4pere
+ty4pet
+ty4rak
+5tyrann
+6tyreg
+ty4rep
+tyre5st
+ty4ri.
+tyri9e
+ty4ri5s
+ty2s
+3tysk
+tys3t
+2ty2t
+ty8ta
+t3ytel
+ty5ten
+ty4ve.
+2tz
+t5za
+5t6zel
+6t6z5l
+1tæ
+tæ5l
+tær6ene
+tæ4renh
+tær4er
+tær4et
+tær5s4
+tøf3l
+2t1øk
+tø9ket
+tøk8ta
+4tøl
+t7ø4let
+5t4øm5
+tøn5nes
+4tøp
+tøp5se
+t2ør
+tø4r3as
+tør3in
+tørk4
+7tørk.
+9tørka
+5tørke
+tør5ne
+tørs7ta.
+tørs7ter
+tørs5tin
+tør3t
+tøs4
+tø8sa
+4tøt
+tøt5a
+tø5ta.
+tø3te
+tøtt6
+2tøv
+tøv6d
+tø7vele
+t4øy
+tøy5a
+t9øyem
+tøy5r
+tøy5te
+tå4en.
+tå2k
+tå5ket.
+tå5ki
+tåk6r
+tå2l3a
+tå9la.
+tå4leg
+tå7lel
+tål5s4
+tån8da
+tån6de.
+tå3ne
+4tåp
+tå6pe.
+t1åpn
+tå6re.
+tå4rep
+t3året
+4t5åri
+3t8årn
+2t1års1
+tå3s
+tå2t
+t3åtak
+tå7ten
+ua7g
+u1ak
+uak3s
+u1al.
+ua7la
+ual5l
+ual3o
+ual3u
+u3a4ne.
+u5anl
+u3ans
+u1ar.
+uar5d
+u4arr
+u5ars.
+uash3
+ua3t
+u5au8
+u1av
+1uavh
+u4ba.
+ub7alt
+ub7ant
+ub5ark
+ub4bo
+ub2br
+ub4bu
+ubel5s
+ub5h
+ubi6s
+ubis7t
+ub1j
+ub7lande.
+uble3s4
+u1b4r
+ub5rin
+2ubs
+ubu8e
+u4bå
+uch5en
+uch5er
+u1ci
+uck1
+ucu5
+2ud
+u3da.
+u7das.
+ud4dag
+ud2dr
+udd4s5e
+ud2då
+udea9
+ude8are
+u2deb
+udeie5
+udei5er
+u2dek
+ude3lu
+u2dep
+u6dero
+u2des
+u3d2et
+u6d5ett
+u5devo
+udia2
+udi3an
+udi4en
+udio5
+ud7ir
+ud7ji
+ud5leg
+udle6ge.
+u7dob
+u6doe
+u2dot
+udover7
+ud1r
+udse4
+ud3t
+ud5v
+3u4dy
+udy9ra
+ud5å4s
+ue5a8
+u5ei
+u1el
+uem8na
+u1e2n
+uend5r
+u7ene
+uensar4
+ue7o
+u1er
+u5e6rast
+ue4re.
+ue5ren
+ue4rer
+ue4res
+ue5ri
+uerle7
+u2erm
+ue4se
+ue2si
+ue4skj
+ues6n
+u1et
+uet8r
+ueul8
+u4fe.
+u6feb
+ufe6e
+uf1f4
+uf4f5erm
+ufi9l
+ufi5ne
+u1fl
+u6foa
+ufor3s
+u1fr
+uft3a
+uf4tan
+uft5s4la
+uft3sp
+ufø6
+u5gag
+u5gar
+u6g5av
+ugby7
+u2gem
+u5gen
+u3ger
+u4gerø
+u2ge5s4
+u9get.
+u8geta
+u2gev
+ugg3s4
+u5gis
+u4gl
+ug1la
+u5g4lad
+ug9lar.
+ug4le.
+ug9ler.
+ugle7s
+ug5ly
+ug7na
+ug7ne.
+ugo1
+u4go.
+ug4re
+ugrei9er
+u4grø
+ug5s4i
+ugs4k
+ug7so
+ug3s4pr
+ug5s4va7
+uguay7ans
+ug5øyn
+u1h
+3uhel
+ui8a
+u4i6c
+ui2d
+uid5el
+uid5en.
+uid5ens
+uid5er
+uid5in
+ui3e6
+u4il
+uil5l
+u1im
+ui3ne
+u1ing
+uinnsmi8
+uinnsmig9
+u1ism
+uista7
+uit3en
+uit5er
+u1itt
+u1j
+u4jas
+u8je.
+u7jå
+4uk.
+u1k2a
+u7kar
+ukare6
+ukar5t4
+u5kat
+u2ke.
+u4ked
+uke5l4
+4ukem
+uker5an
+uke4rek
+uker5i
+ukho7
+u7ki
+u1kj
+4ukk
+ukk6a
+uk7kestal
+uk8k9l
+ukk7n
+ukks6
+u5klem
+uk8lu
+ukl7ut
+u5k4no
+u1ko
+u4k5og
+u2kra
+uk3rus
+2uks
+uk2sa
+uk4sek
+uk4sel
+ukse7te
+uk2si
+uk2s1k
+uk7ski
+uk2so
+uks5t
+uk4s3un
+uk2sø
+ukt5e4sk
+ukteslø9se
+uk4t3id
+uk6tj
+uk4t5ori
+uk2t7r
+ukts6l
+ukt3sp
+ukt9s6v
+ukt4sti
+uktu8e9ra
+uktue5re
+u1ku
+uku6e
+uku5le
+uk5vik
+ukys8
+uk3ø4
+uk5å4
+6ul.
+u1la
+u4la.
+ula7d
+u6l1af
+ul3aks
+ul5art
+ul4det
+u4lef
+u2lek
+u2lel
+ulele8ge.
+ule5ma
+u3len.
+u6leni
+u3lens
+u5ler.
+u5lere.
+ule3ri
+u2l3erl
+u4lero
+u2les
+ule3st
+u5lest.
+u5leste.
+u2leu
+u1lé
+ul4f5l
+ul4fo
+ul4fr
+u3l4i
+ulie8
+uli9en
+uli5ke.
+3ulikh
+uli9na.
+uli5ne
+u7linj
+ul1j
+ul5ka
+ul4k3v
+ul4lag
+ul4lam
+ull7arm
+ul4leg
+ull5egg
+ulleg8ga
+ul6leng
+ul9lere
+ul4le3s4
+ul8li.
+ul8lig
+ulling7s
+ull5i4v
+ul4l3o6s
+ul8lot
+ullo3v
+ull5sle
+ull3s6m
+ulls4t
+ull3sv
+ul2lu4
+ul6ly
+ul2lø
+ulm4u
+u1lo
+ulo6i
+ul5op
+ulo7va
+ul4sk
+uls4po
+ul8sn
+ulss8
+ul2st
+ul8s3t6r
+4ult
+ul4teg
+ul4tek
+ul4tes
+ul4til
+ul4tim
+ul4to
+ul7tor
+ul4t3re
+ult3ri
+u7lua
+u3lue
+1uluk
+u5lup
+u5lus
+ul9ut.
+u7luta
+u9lute
+ul7va.
+ul5van
+ul4var
+ul4ve.
+ul4veg
+ul4vei
+ul4ves
+ulv3t
+ul4v3u
+1uly
+ulyk5kes
+ulæ6ra
+ulæ5re
+ulø3se
+uløy6e
+ul5å6l
+2uma
+uma8ge.
+u6mare
+um5au
+umau7ken
+um3av
+2umb
+um5be
+4umc
+4umd
+2ume
+u4mend
+u4m3enh
+umen4t5i
+ume5ra
+2umfo
+2umh
+2umi
+u6midd
+umie6n
+umi9na
+u4mint
+um9ja
+2umk
+4uml
+4umm
+um3me
+um4mil
+um4mis
+um3n
+umna8
+4umo
+umo6g
+um5ok
+2ump
+um7pan
+um4ple
+um4p7ut
+4umr
+ums1
+um7se.
+um4sku
+umsku8le.
+um2sn
+um4sor
+ums3t
+6um7t
+umta8l
+um5ut
+4umve
+umør3s
+um7øy
+umå7
+2un.
+una6da
+un5alg
+u4n3ap
+u9nar
+u7nas
+u3nat
+2und.
+6unda
+6unde.
+un4dek
+un4del
+6unden
+5undersk
+5underv
+4undet
+un6d7im
+4unds
+und5s4i
+u2ned
+u4nee
+u9nei.
+u2nel
+unele6ge.
+u4n5eng
+u4neno
+u2ne1s2
+u3nes.
+u2nev
+unev5n
+1ungd
+ungele8ge.
+un4gem
+un2g1j
+un4g5l
+un4go
+un2g1r
+un9g8ru
+ung3s4i
+un6i
+u4ni.
+u2nid
+1u2nif
+u4nim
+u3nin
+3union
+uni4st
+4unk
+un4k5l
+un7ko
+un4kr
+un7nak
+unn5erf
+un4n5ers
+un4n5erv
+un5nes
+un4niv
+un2no
+unn5ste
+unnta8la
+un4n3y
+u4no.
+u2n3os
+uno7t
+4uns
+un6sj5i
+un3skr
+un5s4p
+un3stek
+unst5e6l
+un7s6tenk
+unst3o
+un1s2v
+un4tal
+un4tam
+un4tas
+un3t2r
+unt5rep
+un4tri
+untun8ge.
+unu6
+un5ut
+u3ny
+u3nø
+un5øy6d
+u7nøyg
+u3nå
+uo9a
+u1ob
+u1om
+uom7s
+u1op
+uor8da
+uo1re
+uo5ro
+u1ov
+up3av
+u3pea4
+u5per
+uper3a
+upe6ren
+u4peta
+6upf
+u3pi
+u8pi.
+up3ins
+up3li
+up6nev
+upo9pe
+up1p2
+up4ped
+up4pla
+up6pre
+upp5s
+4upr
+u3pra
+6ups
+up6sen
+up2s3k
+ups4ke
+ups5pr
+6upt
+6upu
+u1på
+upåvi6
+u1ra
+u2rad
+u2raf
+ur3aft
+u2r1ak
+ura6ly
+u4ram
+u5rane
+u3rans
+uran6t5re
+u5rar.
+u6r7arl
+ur3arv
+u9ras.
+ur5asp
+ur3att
+ur7au
+urau9ken
+ur1av
+ur4bod
+ur4c
+urd4
+ur3di
+ur4d5o
+u1re
+ure8al
+ureer6e
+ur5egg
+uregi6
+uregist5
+3urein
+ure4l
+ur3ele
+u4reli
+u7r8ell
+u7r8elt
+u4r3els
+u4r5eng
+u7reom
+ure7o6s
+u4resu
+u4reta
+u4rete
+ur4e5v
+2urf
+ur4feb
+ur6fed
+ur3ge
+u1ri
+u4ri.
+uri6a7ne
+uri9en.
+uri4e5ne
+uri9er.
+u3rik
+u3rim
+uri5ne
+ur3inn
+ur3ins
+ur3int
+uri6sp
+ur4ke5s
+ur7k6j
+ur6k7ja
+ur8kla
+ur4kle
+ur6k5n
+urk5s
+urla8ga
+urle6ge.
+urle8se.
+urma7g
+ur3nea
+urn1s2
+urnæ6re
+u4ro.
+u6roc
+5uroe
+urom5s
+u2rop
+uro7pi
+ur3opp
+ur1or
+uro3s4
+uro4sta
+uro8ta
+ur4pel
+ur6p9ut
+ur3re
+ursa8ka
+ur4sal
+ur4s3el
+ur4sin
+ur4skr
+ur4spe
+ur5ste
+urs5til
+ur4stj
+ur2sv
+urs3va
+ur2s1ø
+ur3teo
+ur5ti
+ur4to
+ur6t5ri
+urts4t
+urue7re
+u6rug8
+ur7ugl
+uruk6
+uru4ke
+uru7kn
+ur6ul
+urumo7
+urun4g
+u7runk
+uru7v
+ur4vel
+urv3s
+u6rys
+urø2
+ur1ød
+ur1øy
+4usa
+u9sane
+us3ang
+u9sar.
+u7saren
+u6s7ark
+us7au
+us1c
+2use
+u5seal
+use4al.
+us7edvanle
+u2s1ei
+u2sek
+u4sele
+u2sem
+u6s5endi
+us7erk
+u4s5erm
+u6sesi
+uset8je
+us3eva
+4usg
+u2sh
+u2s3h4a
+u2s3h4o
+us4id
+us3ind
+us5inn
+us7jag
+u4sji
+us5kaf
+u4s3kan
+uska8ra
+us7kat
+us5ken
+u6s5kis
+usk4l
+us6k5le
+us5klo
+us1ko
+u1skr
+us7kru
+usk7u6t
+us4ky
+us1l
+usle6ge.
+us5lin
+u4slu
+us7mø
+u4sn
+us1ok
+uso5l
+uso6l5d
+us1or
+u3sori
+usove7r6e
+us1p
+u1s2pin
+us5sar
+us6sat
+us4sjå
+us4skj
+uss5kor
+us4skur
+uss1l
+us7smi
+uss7mø
+us4s5ti
+us4str
+us2sv
+u6stande
+u4stat
+us3tav
+u2ste
+us3ted
+u5stei
+us7ten
+ust9ette
+us5ti
+u5s6tig
+us1tj
+ust5of
+uston8
+ust7onn
+us5tor
+ust5o6v
+us8tra.
+us8tran
+us8trar
+u6stre
+ust5ren
+us4tri
+us3tro
+ust5rød
+u6st5rå
+ust7ut
+u4stå
+us3ung
+u2sur
+us1v
+u5svale
+u7s6valt
+usva8n
+usvi8ka.
+6usæ
+usæ9le
+usø6m
+us1øy
+u1tae
+u2tag
+u7tagg
+u9tal.
+ut3alb
+ut5ald
+u3tall
+u5tande
+uta7no
+ut6anv
+ut3arm
+ut3art
+uta1s4
+u5tas.
+u6t5a6sa
+u6t5a6se
+u2ta1u4
+1utb
+ut4ba.
+utbe8d
+4utbi
+ut6by.
+utch5
+1utd
+4utdat
+utda7ta.
+u2te.
+u2tea
+u4tee
+u4tei
+u2tek
+ut3eks
+u5tekst
+ute6ma.
+u5temm
+u9temt
+ut2en
+u6tena
+u3tenk
+u4tenu
+u2teo
+2uter
+u6terø
+u2te1s6
+u4teta
+u3tett
+ut6eu
+uteva9
+1utf
+utfa7s
+utfø5re
+1utg
+8utgåe
+6u3ti
+u4t5if
+utikk6u
+utiku9
+u4tili
+u6tiven
+ut1j
+u5tjen
+ut6ju
+3utlei
+utlø5se
+utlå7na
+utmå5le
+u8tni
+1utny
+2uto
+ut7oms
+uto5s
+uto4v
+3utpr
+ut4på
+ut1r
+u5t4radi
+ut3re
+u5treng
+u3triv
+u3trol
+u3tros
+5utru
+u5t6rul
+ut4rø
+ut9rød
+1ut1s4
+4uts.
+4utsei
+utse8t9ja
+2utsj
+ut3sk
+5utst
+7uttak.
+5uttake
+ut4terk
+utt5eva
+ut4tid
+ut4til
+ut5torea
+ut1tr
+ut4tra
+3uttry
+utt1s2
+u1tu
+utu5e
+u6t5un
+utun8ge.
+u2t5ut
+1utv
+u3t4vil
+utvi5se
+2u3ty
+3u4t6yd
+u8ty.
+8utz
+ut1ø
+u5tør
+ut4ø8s
+utøs7t
+1utø4v
+ut5øya
+ut7åk
+u3tål
+ut1ån
+ut7år
+u1u
+u7uma
+u5ume
+u7ut
+u1v
+uve5di
+uve3in
+uve6ris
+uve3s
+u7ves.
+uvet5ø
+u6vev
+u5vi
+uvi6k
+uv5ra
+uv9sa
+u5vu
+uvø9re
+u1w
+4ux1
+ux4a4
+uy6a
+u7yn
+u1æ
+uærle9ge
+u1ø6
+uøv5
+u9åra
+u7åre
+va3am
+va8an
+4vab
+6vadj
+vad1r
+vaf3
+vaf6r
+vai5r
+vai5s
+va6ka.
+va7kan
+va5ker
+6vakh
+va8ki.
+4vako
+vak3r
+7v6aksi
+4v3aksj
+vak5s6t
+1vakt
+vakt5r
+va1ku
+vak3v
+va3lan
+va4led
+val9eks
+4valel
+val4g3r
+vali9e8
+val3la
+val6mes
+va6l1o
+va1lu
+va4lun
+4valv
+va4løy
+val7å
+vam8pu
+4v3anal
+vand5s
+v4ane
+vane5s
+va4net
+2vang
+van4gr
+vang4s7
+va8ni.
+1v4ann
+van4nan
+van4niv
+vann6sti
+va4nom
+v4ans
+van5sem
+5vansk
+van5s6ki
+van3sm
+van3ti
+van9tr
+va4ny
+2vap
+va5po
+va4ra.
+va6rak
+va4ral
+va4ram
+va4rap
+va4re.
+va4reg
+va6rem
+va4res
+var8ka
+var5ma
+var4mee
+var4sa
+var4sk
+var4s5ti
+var4sv
+varta9la
+var6tem
+var4t5i4s
+4vasa
+va4sa.
+va9set
+6vasid
+va6sie
+va4sif
+va4sik
+va4sil
+va6sis
+va2sk
+vass5a
+vas4sau
+vas4sel
+vas6s7ø
+4vasta
+vat5a
+va3ta.
+va6t7e8l
+va2terf
+vatle6ge.
+5vatn
+va1to
+va6tr
+vat7ra
+vat1s
+4vau
+2v1av
+va4z
+2v1b2
+vba4ne.
+vber5g
+vbo6da
+6v1d
+v7dev
+vding5s4
+v7doi
+v7don
+vd6r
+vdu6en.
+vdu6er
+v7dø
+1ve.
+2ve1a2
+ve6ag
+ve6ar.
+2veb
+2vec
+ve2d1
+ve9dob
+vedom5
+veds2
+ved5s4k
+3ve8d5t
+vedø4
+vedå6
+2vee
+ve4er
+2vef
+ve6g5av
+ve5ge
+3vegg
+veggs4
+2vegj
+4vegl
+ve3gle
+ve5g6lød
+veg5n
+2vego
+6vegre
+veg5rett
+4vegru
+ve4gut
+ve4g5å
+2veh
+1vei1e
+vei3en
+4veill
+6veit
+2vej
+4veka
+5ve4ka.
+ve4ke.
+ve4ked
+4vekee
+2veki
+4vekj
+2vekl
+vek8la
+vek8le
+ve4kli
+2veko
+2vekr
+3veks
+vek4st
+veks4t5r
+1vekt
+vek4t5an
+vek5to
+vek4t5r
+2vekå
+5vel.
+ve4l5as
+5velat.
+5velatp
+6veld.
+vel4del
+8velds
+4veled
+6velei
+7velet
+4velis
+4velit
+6veliv
+2velo
+5veloc
+vels2
+vel3se
+velses5
+vel3sm
+vel5sp
+vel5st
+4velug
+vel5un
+vel5v
+2vely
+2velæ
+2velø
+velø8pa
+2vem
+ve5ma
+1ven
+ve8na.
+4venem
+ve5net
+ve6nete
+4venev
+ve4nin
+ven6n5i
+vennle7
+ve2no
+ven6sti
+ven6str
+vent6a
+ven5t6r
+vent4s
+4venty
+2venu
+ve4nus
+ve5ny.
+4venya
+ve4nym
+2ve3o4
+2vep
+1v8er.
+ver5ak
+ver3al
+8verau
+ver6des
+ver6din
+ver6dir
+verd7v
+ve3re.
+4vered
+4vereg
+5vereig
+4verek
+ve4rel
+ve6r7eng
+4verenn
+4verep
+ve5rer
+ve5res.
+4verett
+4veretu
+verfø5re
+ve9ri.
+veri3a
+ve4rial
+ve7rie
+4verik
+ver3il
+5verkn
+ver5m6
+ver6nal
+vern6s5
+ve9ro.
+ve3rom
+ver8ska.
+ver5ski
+ver7spo
+verta8la.
+verta6le.
+ve1ru
+5verum.
+6very
+verø6
+ver3øs4
+4verå
+v4es
+3ves.
+2ves4a
+ve5san
+4veset
+4vesh
+4vesi
+4vesj
+4veski
+2vesl
+ve9sli
+ve1s2m
+6ve3so
+4vesp
+ve6s3per
+ve5sted
+ves6t5end
+vest5o4v
+4vestr
+4vestu
+4vestø
+vesva7
+5vesynds
+2vesø
+ve1så
+veså5re
+v4et
+1vet.
+2veta
+8vetaka
+4veteg
+4vetek
+ve5te6s7
+6vetev
+2ve7ti
+4vetj
+2veto
+ve4to.
+veto7e
+9vetoke
+9vetoks.
+ve4tor
+2vetr
+1vets
+vett5sk
+6vetv
+4vety
+vety8e
+2veu
+ve8um
+2veva
+ve6vak
+ve5van
+ve9var
+2vevi
+vevi8sa
+vev4sm
+vev4sp
+2veø
+2veå
+1vê
+2v1f
+vfall4
+vfø7re.
+2v1g2
+v4ga.
+vga4le.
+vga6li
+vga8ve.
+v9ge
+v4gi.
+vgjer6s7
+vgo4
+v4gå.
+2v1h
+vhø4re.
+1via
+vi1an
+vi6bl
+vice5s
+1vid
+vi5de
+vide4o7
+vi4d5o4
+vid3r
+vid3s4
+vi1el
+vi5end
+vig4m
+vi4gu
+vi5gø
+vi4kat
+5vikb
+vi5ked
+7vikg
+vik5ke
+vik5n
+vi2k3o6
+3viks.
+vik5sa
+vik5s6l
+4vikt
+5vikti
+vi4k5ø4
+vi2l1a
+vi5la.
+vi4les4
+vi4l3in
+1vilj
+vil4l5an
+vil4led
+ville6de.
+vil4lei
+vill9ep
+6v5illu
+vil5m
+vil1o
+vil4sti
+vilt7o
+vil6tret
+vil4tri
+vi2lø
+4vim
+vim7p
+vim7u
+4vindl
+5vindu
+vine5st
+v6ing
+4vingn
+vin5gom.
+ving3r
+vin8g9u
+vin3na
+vin4ned
+6vinnh
+4v5innl
+4v5inns
+4vinnt
+vi6n5o6ver
+v2in2s
+vin7sja
+vin4tes
+vin5tre
+vi8pa.
+vi6pe.
+vip5s
+1vir
+4viro
+7viru
+vis3ab
+vis3ak
+vis5and
+vi4see
+vi3sen
+vi6seng
+vi2s1k
+visk6re
+vis5m
+vi1so
+vis3om
+vi4sp
+vis9pa
+viss4p
+vis5ti
+vi4tak
+vi5tese
+5vi6t5j
+vi4t3o
+vi4tr
+vit7ra
+vit5re
+vit5skr
+vit6te6s7
+vi4t5un
+vitun6ge.
+vi4t5øy4
+vi4va.
+vi6ves
+vivi3
+v1ja
+v1je
+vje4t5a
+vje5t6e
+vje4t5r
+vjet3t
+vje4tu
+v1ji
+4v5jo
+vju3t
+6v3k6
+vk4le
+vk4ler
+vku4le.
+6v1l2
+v6lab
+vla6ga
+v9led
+v9leg
+vlei9e
+vl6el
+vle4se.
+v5lesn
+vle5str
+v6lesv
+vli7v
+vls9
+vlu9sa
+2v1m
+vma8le.
+vmo8de.
+vmord4
+vmå8la
+2v1n
+v3nad
+vna8ke.
+vn5al
+v9nar
+vn5dy
+vne7b
+v2ned
+vne7de
+v4nele
+v4neli
+v4nelo
+v2nem
+vne5r6e
+v4nero
+vne1s
+v4nesta
+v6neste
+v2nev
+vnor9s8kas
+vn4s5pa
+vn1s4t
+vn5t4
+vnæ4re.
+vn5ør
+vo1al
+vo2ar
+6vob
+2vof
+vof8fan
+vo4gu
+voi1
+1vok
+4voko
+voks3k
+vok6s5
+1vol
+voli7
+vo4litu
+vol4tes
+2vom
+vo4na
+vo9nal
+vo9nar
+von5de
+vons6
+von5sh
+2v1o6p
+2vord
+vor8da.
+vo1re
+vo9ren
+2v1org
+4voro
+vors7k
+1vos
+4vosj
+vos4se
+vo4teg
+vo4tel
+6votr
+vo1v
+vo4ve.
+vo6vi.
+2v1p4
+2vr8
+3v6rak
+v7rar
+v1re
+vregi3
+6vrenge
+4vrengi
+v6rengj
+v6rengt
+vrett4s
+v6ri.
+3vrid
+7vrie
+v6rigas
+vri6ma.
+vri8me.
+v3ring
+vrin5s
+vri6ve.
+v1ro
+v4rob
+v4rof
+v4rok
+v4rop
+vro8te.
+v1ru
+v7ry
+vrø3ve
+v1rå
+vrå8da.
+8vs
+v6sa.
+v7sali
+v6se.
+v4seg
+vs3egg
+v3s4el
+v4s5e4li
+vse4n
+v5sen.
+v4s5eng
+v5s4ens
+v2ser
+v6si.
+vs1in
+v1sk
+vs8ke
+v6s5kum
+vs1kv
+v1sl
+vs3lan
+vs6let
+v6slik
+vsmå8la
+v1s2n
+v6s7na
+vs3ne
+vs3ny
+vs3næ
+v4s3nø
+vs5od
+vsom5
+vs5oms4
+v7son
+vs1or
+vs2pe
+vsre6de.
+vs7s6t
+vs4s5å
+v1s2t2
+vste6ma.
+vs3til
+vs1v
+vsø6ke.
+vsøl5
+v2s5øy
+vsøy4er
+v8så.
+vså7re
+2v1t
+vta1
+v4ta.
+vta8ka.
+vta6led
+vta9len
+vta4lev
+vta6s
+v5tepp
+v5t4i
+vti8na
+vti8ne.
+v5t4r
+v3t2v
+vty8e
+1vu
+vu2d1
+vud5d
+vuden5t
+vuds4
+8vué
+vu8k
+2vul
+2vung
+vun4ge.
+6vu6o
+2v1ut
+2v1v
+vva8la
+vve8g9ing.
+vve6g7inga
+vven7n6i
+vvi5ke
+vvi6k7l
+vvi8s9an
+vvi4se.
+2vy1
+vya4
+vy7ens
+1væ
+væ1ra
+væ9ret
+væ8ta.
+v3ø4d
+vø4l
+vø7li
+vøm4met
+3vøre
+vø6re.
+v3ørke
+vør8na.
+vø3se.
+v5øv
+4v1øy
+vøy6e
+vøy7ene.
+vøy9enes
+1våa
+1våe
+4våend
+v4åk
+vå8ka.
+vå4ke.
+vå4kene
+vå9kene.
+vå4le.
+1vån
+vå5ne
+4vånu
+vå3ren
+vå8sa.
+vå5tes
+6våtf
+våt7å
+w2a
+wa6l
+5wald
+wal4k
+walk5o4
+wal4l
+2wap
+war6d7er
+wash3
+1wat
+wa3z
+w1b
+wboy5
+we2
+weate7
+we7b
+we3g
+we5re
+wes2
+wes3s
+wester6
+western7
+wet5
+wett4
+w4i2
+wi9ar.
+wich3
+3wicz
+wi3d
+5wi6en
+wi9er.
+wi5f
+wi3ni
+wi5ra
+wi3ren
+wi5ta
+wk3r
+w1l
+w1m
+wn5s
+wob5
+wou6
+wout7
+ws5
+ws6k
+wurs6
+wy2
+w1yo
+wyor2
+wyork3
+w1z
+xan5t
+x7b
+x3f
+xga6
+x7h
+x1ic
+5x6id
+xi5e4
+x5k
+x1l
+x1p6
+x3r
+x1s2
+x7t
+x6u
+xy2
+ya7b
+1yac
+ya5f
+ya4h
+y1ak
+yak6te.
+ya2l
+y7am
+y1an
+y6an.
+y2ana
+ya4ne.
+yan7k
+yan7sl
+y1ark
+y7arr
+yas4
+ya5si
+ya5t
+y1av
+y1b
+yba4ne.
+yb4bed
+ybde3
+ybo2
+ybu6er
+ybue7re
+ybu7ern
+ybyg5
+y1c
+y8ce.
+y8cé
+y2co3
+y6dab
+yd5av
+4ydd
+yd6dela
+yd4dep
+y6d7enh
+y4deo
+y2dep
+y4dero
+y2d1is
+yd6je
+yd1ji
+ydo4
+yd3op
+yd5ov
+y1dr
+y4d4r5au
+yd1re
+yd5rem
+y4dro
+y4d4r5oks
+yd3si
+yds4v
+y2du
+yd1un
+ydø4
+y4døm
+ydør5
+yd1øs
+4y1e
+yed8l
+ye6dre
+y2ek
+y5eks
+ye4len
+ye6let
+yel4s5j
+yel4sk
+yels3m
+yel6s5t
+y2em
+ye2n
+y7e6ne
+y8ener
+y2enh
+ye5ni
+y2enk
+y2enl
+yenle6ge.
+yens4
+y4ense
+y3e6re
+ye4rel
+y3ern
+yer8sk
+y4erst
+yes2
+ye5sm
+ye2t
+ye9te
+ye5ty
+y2ev
+y1f
+yfan9
+yfjell4
+y4fle
+yf5le.
+y8ga.
+yga8ve.
+yg4dal
+yg4dek
+yg4del
+yg4dep
+yg2do
+yg2d1r
+yg2d1y
+yg2dø
+yge5i
+ygen5s
+y6geret
+y2ges
+y4gev
+yg6gam
+ygg7art
+ygges4
+yg5gj
+ygg5l
+yg6gr
+ygg3s2
+yg6gu
+yg6g5å
+ygi2
+y5glo
+yg7m
+yg6r
+y1h
+yhes5
+y1i
+y9in.
+yis7t
+y1j
+6yk
+y1ka
+ykap3
+y6kara
+y2ke
+y7kel.
+y5kelen
+y3keli
+y7kels
+y3ken
+y3ker
+y4kerel
+y4kero
+y5ket.
+y9kets
+y1ki
+y1kj
+y4kjar
+y5kjare
+ykjeva8ne.
+yk4kana
+yk4k5enh
+yk5kesj
+ykke6s5ta
+yk1kj
+ykk5ni
+ykk4s5k
+yk8k5vi6
+yk4ky
+yk1la
+yk6lest
+y1klo
+y3klub
+yk3lus
+y5klæ
+y1ko
+y2koa
+y6koli
+y4komo
+y5kosa
+y2kot
+y5koti
+y1kr
+yk1s
+yku6le.
+yk3var
+y1la
+yla8ga
+yl4dan
+yl4derk
+ylde4s
+yld1r
+yld5s6k
+yle6ge.
+y7les
+y4lev
+yligh9
+yl5k8
+ylke2
+ylke4s3
+ylkesla8ga
+yl4lev
+yll5is.
+yl3s6
+ylst7re
+yl5tet
+y8luse
+3ylven
+y1ly
+ylæ7re
+y6mei
+y4mete
+ym4fe5d6
+ym5jara
+y4mo.
+ymo5e
+ym3p2
+ym1s
+ym8sa.
+ym4se
+ym8sl
+ym6ta.
+ym6te.
+ymå6la
+y9n8and
+yndes8
+yn5det
+y2nel
+yn7eld
+yner3g
+yne5s4
+ynesi8
+y6nev
+yn5gel
+yn4gem
+yn2gr
+yn4g5ø
+ynko3
+yn6k5v
+yn5na
+yn5ne
+ynn3s4
+ynn4ø
+y3no
+y4no.
+yns1
+yns6are
+yn4sem
+yn9set
+yn2si
+yn2sk
+yns9ket.
+yns7ki
+yn5skj
+yns7kjele
+yn8s9kjer.
+yn4st
+yn2su
+yn4s5ver
+yn4tap
+yn8teg
+ynt5ei
+yn4tek
+yn6tete
+yo4gat
+yo6gi.
+y1om
+yon4
+yon5nen
+yo6nu
+y1o2p
+y1o2r
+yor6da
+yo5re
+you4
+yout5
+yp8e
+y2pe.
+y4pee
+y4pena
+y4penet
+ype4rel
+y6peta
+y1pi
+y4pi.
+y7ping
+yp5inn
+ypin8na
+y1p2l
+y5po
+yp7p6a
+yp3pe
+y1pr
+yp5s8
+yp4tok
+y3pu
+y1ra
+yra8ka
+y4r3a6l
+y7rarb
+y4r5au
+yr5av
+yr7da
+yr5dø
+y7real
+yre3in
+y5reis
+yrek4
+y7rek7k
+y3rels
+y5rems
+y1ren
+yre9ne
+y4reo
+y6rerel
+y4rero
+yre5sc
+y5rest.
+yre5ste
+y5reste.
+yres6ten
+y1ret
+y4reta
+y4rete
+y4reto
+y7retø
+yr7ga
+y1ri
+yrin5g6
+yri6ene.
+y4rif
+yri8ka.
+yr3inn
+yris6p
+yr4kee
+yrke4s
+yr5kj
+yr3m
+y7roe
+y3romm
+yr1op
+y5rosk
+yr5r8
+yr4san
+yr7set
+yr5sk
+yr6skj
+yr6skr
+yr2sp
+yrs7tan
+yrs5tar
+yrs7tene
+yrs5tens
+yr3sti
+yr4sv
+yr3te
+yr6tek
+yr2t3r
+yr3tra
+yrty8
+y1ru
+yrul8la.
+yr5ut5r
+yr3v
+y1ry
+yr3øk
+yrøy4
+y1rå1
+yråd2
+yrå8da
+yråde7r
+yrå6ders
+y4rådi
+y2råm
+y6råst
+y4råt
+y4råv
+2ys
+y1sa
+ys6a7kers
+ys4e
+yse4bu
+y4sed
+y4see
+yse5ei
+y2seg
+y2sek
+ys7ekte
+y2sem
+y4sera
+yse7rid
+yseri7e6
+y4sesj
+y4sesk
+y4se5s6l
+y4sest
+y5seste
+y6sesu
+y9set.
+y4seu
+ys6i
+ysi8e
+y5sjk
+y7skag
+ys6kara
+ys7kare
+ysk9au
+ys2k3l
+ysk5øs
+ys4mi
+ys4nø
+y1so
+y4s5or
+ys2pe
+ys5pis
+y5s4po
+ys6sak
+ys6sam
+ys4s3ei
+ys4s3ek
+ys4s5il
+ys2sj
+ys4sku
+ys2so
+ys2sp
+yss5pe
+ys4sta
+yss5tab
+ys4s5ti
+ys4su
+ys2s5v
+ys2t
+ys3ta
+y8star.
+ys4tat
+ys3tel
+ys3ten
+y4s3ter
+ysterie7n
+ys7tesl
+y2s3ti
+yst3op
+yst3r
+ys5t6ry
+ys6ty
+y1su
+ys1ve
+ys5år
+y1ta
+y4t3ana
+y2tee
+y4tef
+y2teg
+yt5e4ge
+yte3in
+y4teka
+y4teki
+y4tena
+y4teno
+y2teo
+y4teret
+yte6ro
+yters6
+yter5ske
+yte5r6ø
+y2tes2
+y2tet
+y3t2hi
+6y5til
+y6tj
+yt9ja
+yt5jen
+yt9jer
+yt4mei
+yt4mes
+y3to
+yt8ra
+yt4re.
+yt5rer
+yt1ri
+yt4rik
+y5trå
+yt4s3en
+yt3sk
+yt5sv
+4ytt
+yt5t6a
+ytt4e
+ytte8r9end
+yttes6
+yt4test
+yt8tien.
+yttsa6me.
+2y3tu
+y1ty
+yt4ys
+y7tå8
+y1u
+y6ua
+y8ue
+yu8g
+yu4l
+y1v
+y4vak
+yva8la
+y2ved
+yve4ria
+yve4ris
+y4vese
+y6vesy
+y6vev
+yvi8sa
+yvi6se.
+yv1år
+yvå5te
+y1w
+y5æ
+y5ø
+y1å2
+za5b
+3zae
+4zaes
+za4g5
+za5k6h
+zani4
+zania5
+5za5v
+z1b4
+zbu4
+z1c
+z1d
+1ze
+zea1
+zebu9
+zeli5
+zen3s
+4z3ense
+4z3ent
+z1f
+z1g
+5zha
+z3hi
+z5hu
+5zie
+1zifi
+5zing
+z5int
+1zis
+6zisty
+4zi5s4v
+2zisy
+z1k
+4z1l
+z1m
+5zo.
+5zoe
+zo1f2
+zo4no
+zo5re
+6zos
+z1p
+z5r
+z1s
+4z1t
+zu3e
+z1un
+z1v
+z1za.
+z2z3el
+æ5by
+æ2bø
+æ5de
+æ7di
+æ1f
+æg6
+æ2k
+æ3ke
+æ5ki
+æ8kj
+æk1ja
+æk7je.
+æk9jer.
+ække7
+ækkel6
+æk6l
+æ1la
+æ4le.
+æ2le3d
+æ4lena
+æ4lev
+æl5j
+ælsle9
+æ4r1ak
+æ3rane
+æ4rans
+æ4rarb
+æ6rarbe
+ær4arte
+æ4r1at
+ærbu5e
+ær1d4
+æ1re
+æ2rea
+æ4red
+æ2ref
+æ2reg
+æ8r7ei
+ærei6e
+æ2rek
+æ6r7eld
+ære5ne.
+ære7nes
+æ2rep
+æ5rern
+æresa4m
+ære6skr
+ære4sl
+ære4sp
+æ4reta
+æ4retek
+æ9rets
+æ2rev
+4ærf
+ærgen5
+ærhø8
+æ1ri
+æri6e7ne
+æ4r3il
+ær3ins
+æri6s
+ær5is.
+4ærk2
+ærle6ge.
+4ærm
+ærmå8la
+ær3n
+ær5ne4
+ær4nå
+æ2r7o6
+ærom5
+æroms4
+ær5r
+ær6sel
+ær4s5il
+ær1sk
+ær7s6no
+ær2sp
+æ2r1u
+ærut5
+ær3v
+æ2r1ø4
+ærøy7e
+ær3å4
+æ8se.
+æ2sj
+æ2s1k
+æ5ta
+4æte
+æ4te.
+æt4r
+æt4ta
+æ5va
+ævar5
+æve4s
+æ5vi
+6ø1a2
+øa7re
+øau4
+ø1b
+øbe6lev
+øbe4li
+ø2bl
+øbl9u
+øb4r
+ød3ag
+ø4dak
+ød3d
+ød9de.
+ø2de.
+ø4dede
+ø6def
+ø4dela
+ø4dem
+ø4deo
+ø4deri
+ø4dero
+ø5dj
+ød1r
+ød4red
+ød4rek
+ød4rep
+ød2sc
+ød6s5ek
+øds7ke
+øds4ko
+ød6sku6
+øds4mu
+ød8t5om
+ødt6r
+ø2du
+ød3und
+ø4d5ur
+ø6d5ø
+4ø1e2
+ø4ed
+ø5ene
+ø5ep
+ø3e6re
+øfe8
+øf3fe
+øf6j
+øf8la.
+øf8le.
+øffe8l7a
+ø5fn
+øfte5s
+øg1
+øg2a
+øg5ak
+øg5al
+ø7gar
+ø5gas
+ø3ger
+øg5gl
+øg8gå
+ø7g4j
+øglo8ve
+øgn6s7p
+ø2g2r
+øg5re.
+øg5res.
+øgs2
+øg4ste
+øg4str
+øgta5
+4øg4u
+ø1h
+ø4i
+øi4e
+ø5ing
+ø5isk
+ø4it
+ø1j
+6øk.
+6ø1ka
+ø5kav
+øka8ve.
+ø6keh
+ø4kelo
+ø6kerada
+ø6kerel
+ø4ke5ru
+øke1s
+ø6kese
+ø8kesl
+ø4kest
+ø4kete
+ø1ki
+4økj
+ø5kjare
+ø5kjas
+ø1kje
+2økk
+øk5kel
+øk5ket
+øk4k5l
+økk5r
+øk3lag
+øk3lan
+2økna
+1øko
+øk5opp
+ø1kr
+ø8krar
+øk8sa.
+øk6se.
+øk4ses
+øk4si
+øk2so
+øks1t6
+øks5ti
+øku4r
+øk5ur.
+øk5ure
+øk7ve
+ø7ky
+ø1la
+ø2lah
+ø6lam
+øl3d
+øled
+ø4ledi
+ø6lelu
+ø4lero
+ø6leta
+ø4le5te
+ø2lev
+øl4gera
+ølge5s6v
+øl1j
+øl2ke
+ølke7s
+øl4lese
+øl9leti
+øl6lev
+ø1lo
+øl7op
+ølrå4
+øl6sel
+øl4sere
+øl4se3s
+øls6t4
+øl5s4v
+ø5luk
+øl7ut
+ølva6
+øl4var
+øl4v3ei
+øl6vek
+øl8vel
+ølv7erk
+øl4v3in
+ølv5o
+ølv7r
+ø1ly
+ø4me.
+ø9met
+1ømfi
+ø5mi
+ømini6
+øm4med
+øm4mero
+ømmet6
+øm4metr
+øm3op
+øm4pel
+øm7s6p
+øm1st
+øm5svi
+ø2m1u
+ømå8la
+øn2ad
+ø6n5al
+ø5nas
+ø2nem
+ø3nes.
+ø9nese
+ønhø8re.
+4ønn
+øn4nal
+ønni4
+øn4n5it
+ønns5al
+ønn4s3e
+ønn4s5i4d
+ønns5kje
+ønns5kre
+ønns5ku
+ønns3l
+ønns3t
+øn2nø
+ø6nom
+øn2s
+øn9sa.
+øn5sak
+øn5sam
+øn5se.
+øn3ser
+øn3skj
+øn8skjer.
+ønst3r
+ønst9ra
+ønt1
+øn2ta
+øn2to
+øn7u8
+ø1o
+ø4peda
+ø6pe5i
+ø4penu
+ø5pero
+ø4peru
+øpes4
+ø4pete
+ø4peti
+ø1pi
+øp3li
+øp5p
+øp6pl
+ø1pr
+øp6s1
+øpsa4
+øpsla8ga
+øps8leg
+øp5ste
+øp4s5ø
+ø1ra
+ø2ra.
+ø2r1af
+ø2r1ak
+ø2r1a2m
+ø4rans
+ø4r3ant
+øra8sa
+øra6si
+ø4r7au
+ørd4e
+ø1re
+ø2rea
+ør7edd
+ø6redu
+ø2ref
+ø2reg
+ø6rein
+ø2rek
+ørek6l
+ør3eks
+ør5ekt
+ørele8se
+ø9relet
+ø4r5eng
+ø2re5o4
+ø2rep
+ø6reret
+ø4reru
+øre1s2
+ø5res.
+ø4rese
+ø6resi
+ø7reskrivi
+ø8reso
+ø4rest
+øre6s7v
+ør6et
+ø4reta
+ør1eu
+ø2rev
+ør5fe
+ørge5s
+ø1ri
+øri8m
+ør4jet
+ør4keri
+ør4kes
+ør8k9lag
+ør6k5n
+ør4kve
+ør4kå
+ørla8ga
+ørm9ut
+ørn4e
+ør4nere
+ør4nes4
+ør4n3u
+ør4n5ø
+ør1o
+ø5r6ok
+ø1ros
+ø4r3ost
+øro4v
+ør4rek
+ør4rep
+ørri4
+ør4r5is
+ør4råt
+ør4sak
+ørsa8ka
+ørsa6me.
+ør4sc
+ør6ses
+ør2si
+ør5ski
+ør4skr
+ørs6lev
+ør4som
+ør4spe
+ør2st
+ørs9tar
+ørste5i
+ørs5tens
+ørs5tig
+ør3sto
+ørs9u
+ør2sv
+ørs1å
+ør9tar
+ør4tek
+ør6ti9a
+ør4tide
+ør8tien.
+ør6tif
+ør3to
+ørum5
+ø6rut
+ør5v
+ør1ø2s
+ørø1v
+ør1åp
+ø1sa
+øsa6me.
+ø8sarar
+ø1sc
+ø2se.
+ø2sem
+øse4n5o
+øseri7
+øserie6
+øs5jo
+øs7kar
+øs1l
+øs4lag
+ø4slu
+øs2me
+ø1s2p
+øs8tas
+øst9ast
+øs6teg
+øs5terse
+øst9ett
+østo2
+øst5of
+øst5ov
+øst1r
+øst3re
+østø4
+ø2s1ø2
+4øt
+øt3ak
+ø9tar
+øta4s
+øt5asa
+ø2te.
+ø2tea
+ø6tef
+ø6tege
+ø2tei
+ø2t5eks
+ø2tel
+ø5tela.
+ø3ten
+ø4teni
+ø3ter.
+øte3ru
+ø2te1s
+øte7sn
+ø4teta
+øt7ri
+øt1sa
+øt3s4p
+øt7s6å
+øtså9re
+øt4tero
+øt6test
+øtt5av
+øtt5eks
+øtt5eta
+øtt5ete
+øtt5ra
+øtt7ri
+øtt1s2
+øttså7re
+øt4tur
+øt4ty
+ø1tu
+ø5ty
+ø1u2
+øug8la
+øv5aa
+øv5ans
+øve5in
+ø4vek
+øve5no
+øveren8
+øve1s
+øves4t
+øve3te
+ø5vik
+øv6l7ut
+øv7ne
+øv6nø
+øv9o8
+øv1r
+øv5reb
+øv1s
+øv9sa
+ø5vå
+øy3al
+øya2n
+7øyan.
+9øy8ans
+øy4dek
+øy4dere
+øyd8i
+5øyeb
+øy7e4de
+øy2ee
+øy4ele
+øye4n
+øy4ep
+øy4erf
+øy1gl
+øy3ke.
+øyks4
+øyk5t
+2øyl
+øy4led
+øy4leg
+øy5na
+øy5ni
+øy3o
+6øyp
+øy3pe.
+øy4pel
+øy4ra.
+øy5rer.
+øyri6v
+øy3rø
+øy1s
+øy5s4ar
+øy5si
+øys2l
+øy4sm
+øy4spi
+5øysund
+øy4tei
+øy4tel
+øy4tere
+øyte5s6
+øyti7da
+øy1tr
+øy2t3y6
+øy5tø
+øy4vei
+5øyvå
+ø1ø2
+ø5å6
+å1a
+åak6ta
+åa4n5
+åan8ka.
+åan6ke.
+å2ar
+å5aran
+åau4re
+å1b4
+åba8ne.
+åber2
+åbo9ta
+6å1d
+å7dan
+å9dar
+å4ded
+å4dek
+å4dem
+å4deo
+å4dep
+å4dere
+å4deri
+å6dero
+å2des
+å7di
+åd4ra
+åd8re
+åds1
+åd2sk
+åd3s4la
+åd7slo
+åd3slå
+åd1s2n
+åd3s4pe
+åd7spu
+åd5st
+åd6s7te
+4å1e
+å2ele
+åem8na
+åe2n
+å7ens
+å3er
+å3e6re.
+å1f
+åfe6
+åfø5re
+2åg
+å4ga.
+åg7ald
+å4ge.
+åg7ei
+å2ges
+ågna5
+åg5ne
+åg4r
+åg5rin
+ågs6k
+åg5sl
+åg7sp
+ågs4t
+ågu4l
+åg5ø
+å4gå.
+å1h
+å1i
+å1j
+å1ka
+å3kan
+å3kar
+å4karb
+åk7av
+å4keh
+å3ken
+å4kena
+å4k3enh
+å4kere
+åke5s
+å4kesl
+å5kevi
+å1ki
+å6kid
+å1kj
+åk1k
+åk5ka
+åkk6l
+åk7kr
+åk7lau
+åklist7
+åk3læ
+å1ko
+åk3opp
+åko4s
+åk6ra
+åk5røk
+åk3rå
+åk1s2
+åks7l
+åk3t4
+åku8
+å5k8ul
+åkva8la.
+åkøy8rar.
+å2k3å
+å1la
+å5l6amp
+å6larb
+å9las
+ål5au8
+ål9av
+ål3d
+å2lef
+ål5eini
+å2lek
+å2lem
+å4l5enh
+å4leni
+åle6ris
+å2le1s2
+åle9s6und
+å4lete
+å2lev
+ålgå6
+å6lio
+ål5j
+ålla6ga
+ål3or
+ål4san
+ål4sek
+ål4ser
+åls7i
+ål2sp
+ål4sti
+ålsy8na
+ål5ti
+ålti5d
+ål1u
+ålul8la
+å1ly
+å2l1øy
+åløy4e
+ål5å6k
+ålå8te.
+6åm
+å6me.
+åm4li.
+åm1om
+åm5øy
+å3nar
+å9nas
+ånd3r
+ånd4sa
+ånd4se
+ånd4so
+å4ne.
+åned4
+åneds5
+åne5i6
+å2nel
+ånely6
+å5nes.
+å3net
+å4netr
+å3ni
+ån5o
+å9ny
+å3o
+åp2e
+åpe4n3a
+åpe4n5i
+åpen3s
+å5per
+å6pero
+å1pi
+åp6j
+å1pla
+åp4ne.
+åp7p
+å1pr
+åpra5
+åp2s1
+åp6ta
+å4på
+år3ak
+å9ran
+å7rara
+ård5str
+å2re.
+å5rei
+å6rel
+åre7s
+å4rest
+årfi4
+å7riv
+år3k2
+år4le.
+2årn
+årn5s
+år3on
+år3op
+årpo8
+år2s
+års5af
+års3el
+år3sem
+års3ko
+år8sku
+årsla8ga
+år3sol
+års3ta
+år7ste
+års3ti
+år7sto
+år5stu
+års1u
+års1v
+år5sy
+år5u4k
+år3un
+år5y4
+å1rø
+å5r8å
+ås2
+å1sa
+ås7au
+å4se.
+å4see
+ås5eid
+å4sek
+å4sem
+åseri7e6
+åse3s2
+å4sesm
+å4seso
+åse5ta
+ås3h
+å8si.
+ås5ka.
+ås9kene
+ås8ki
+å1skj
+ås7kop
+å1skr
+å5sku
+å1sl
+ås5ne
+ås3ni
+å5so
+å1sp
+ås7pl
+ås5sa
+ås5se
+ås3si
+åss3k
+4å1st
+å7stei
+åsu4
+ås3un
+ås7ut
+ås7væ
+ås5øy
+åså9
+å1ta
+å4ta.
+åtaks5
+åta2l
+åta9la
+åtale3
+åta5le.
+åta5len
+å4tang
+å4tark
+å4t5arm
+å2te.
+å2tea
+å4tee
+å2t1ei
+åte6ke.
+å4teo
+å9ter
+å2tes
+5åtferd
+å5ti
+åti7da
+2åtn
+å1to
+åt7ov
+6åtp
+åt1re
+åtri6pa.
+åtri8pe.
+åt1ru
+åt5sk
+åt1t
+åt4ted
+åt4ti
+ått3o
+åt4tri
+åtts4
+åt6t5æ
+åt1u
+åt4un
+åtva5ra
+åtva7re
+åt5ve
+å5ty
+åt1øv
+å3u
+åun8ge.
+å1v
+åv4a
+å2ve7d
+å4veg
+åve5l
+å4veni
+å9ver.
+å2vev
+åv7s6
+å7vy
+åvæ4re.
+å1ø8
+åøy4} \ No newline at end of file
diff --git a/tex/context/patterns/lang-nn.rme b/tex/context/patterns/lang-nn.rme
new file mode 100644
index 000000000..0c2df2eba
--- /dev/null
+++ b/tex/context/patterns/lang-nn.rme
@@ -0,0 +1,134 @@
+% generated by mtxrun --script pattern --convert
+
+% Adapted to the new pattern-loading scheme.
+% Original file name was nnhyph.tex
+
+% TeX hyphenation patterns for Norwegian Nynorsk
+%
+% Version 2007-02-10
+%
+% Copyright (C) 2007 Karl Ove Hufthammer.
+% Copying and distribution of this file, with or without modification,
+% are permitted in any medium without royalty, provided the copyright
+% notice and this notice are preserved.
+%
+% This file contains hyphenation patterns for Norwegian Nynorsk.
+% It uses the Norwegian hyphenation patterns from nohyphbx.tex,
+% created by Rune Kleveland and Ole Michael Selberg. Please see
+% that file for copyright information on those patterns.
+%
+% The patterns in nohyphbx are based on both Norwegian Bokmal
+% and Norwegian Nynorsk, and works about equally well for both
+% languages. This file, nnhyph.tex, contains only a few hyphenation
+% exceptions, for words that needs to be hyphenated differently for
+% the two languages.
+%
+% Please send bugs or suggestions to karl@huftis.org.
+%
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: nohyphbx.tex (2007-02-07)
+% Author:
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% TeX hyphenation patterns for Norwegian
+%
+% version of 2007-02-07.
+% Patterns of January 25, 2005, with later additions and changes
+%
+% Copyright (C) 2004, 2005 Rune Kleveland, Ole Michael Selberg.
+% Copying and distribution of this file, with or without modification,
+% are permitted in any medium without royalty provided the copyright
+% notice and this notice are preserved.
+%
+% Please send bugs or suggestions to tex-live (at) tug.org.
+%
+% Originally generated by a script written by Rune Kleveland
+% from dictionaries available from
+% http://folk.uio.no/runekl/dictionary.html.
+%
+% Adjusted manually by Ole Michael Selberg to prevent
+% numerous wrong hyphenations, especially in compounds.
+%
+% Changes from the former version of 2005-06-29:
+% 388 new patterns. Some old patterns have been deleted or changed.
+%
+% In Kleveland's nohyphb.tex there are 26017 patterns.
+% This version of the revised nohyphbx.tex contains 27149 patterns
+% --- plus 45 exceptions in the \hyphenation-list
+% (which you may change to suit your personal needs).
+%
+% To load these hyphenation patterns the parameters
+% of TeX must have the following minimum values:
+% trie_size = 33385
+% trie_op_size = 815
+% (The corresponding values for nohyphb.tex are
+% trie_size = 31900 trie_op_size = 636)
+% If you want to load more than one set of hyphenation
+% patterns the parameters have to be set to a value
+% larger than or equal to the sum of all required values
+% for each set.
+%
+% Notes on other Norwegian hyphenation pattern files, from Dag Langmyhr,
+% tex-live mail of 29 Jun 2005 11:26:21 +0200.
+% nohyph.tex -- manually created by Ivar Aavatsmark and others;
+% hyphenate according to pre-1973 rules; no longer recommended for use.
+% (Sometimes also known as nohyph1.tex.)
+% nohyph2.tex -- created by Dag and a student; the present file,
+% nohyphbx.tex, is more extensive and is recommended.
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-pl.hyp b/tex/context/patterns/lang-pl.hyp
new file mode 100644
index 000000000..060fa5083
--- /dev/null
+++ b/tex/context/patterns/lang-pl.hyp
@@ -0,0 +1,27 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-pl.rme
+
+% used: a b c d e g h i j k l m n o p r s t w y z ó ą ł ż
+
+\hyphenation{
+be-zach
+be-zami
+by-naj-mniej
+gdzie-nie-gdzie
+ina-czej
+na-dal
+ni-gdy
+ni-gdzie
+niech-że
+niech-by
+ow-szem
+pó-łach
+pó-łami
+pó-łek
+pod-ów-czas
+przy-naj-mniej
+skąd-inąd
+tró-jach
+tró-jami
+tró-jek} \ No newline at end of file
diff --git a/tex/context/patterns/lang-pl.pat b/tex/context/patterns/lang-pl.pat
new file mode 100644
index 000000000..6c2e61a83
--- /dev/null
+++ b/tex/context/patterns/lang-pl.pat
@@ -0,0 +1,4060 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-pl.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v w x y z ó ą ć ę ł ń ś ź ż
+
+\patterns{
+.ćć8
+.ćł8
+.ćń8
+.ćś8
+.ćź8
+.ćż8
+.ć8
+.ćb8
+.ćc8
+.ćd8
+.ćf8
+.ćg8
+.ćh8
+.ćj8
+.ćk8
+.ćl8
+.ćm8
+.ćn8
+.ćp8
+.ćr8
+.ćs8
+.ćt8
+.ćv8
+.ćw8
+.ćwier2ć3
+.ćx8
+.ćz8
+.łć8
+.łł8
+.łń8
+.łś8
+.łź8
+.łż8
+.ł8
+.łb8
+.łc8
+.łd8
+.łf8
+.łg8
+.łh8
+.łj8
+.łk8
+.łl8
+.łm8
+.łn8
+.łp8
+.łr8
+.łs8
+.łt8
+.łv8
+.łw8
+.łx8
+.łz8
+.ńć8
+.ńł8
+.ńń8
+.ńś8
+.ńź8
+.ńż8
+.ń8
+.ńb8
+.ńc8
+.ńd8
+.ńf8
+.ńg8
+.ńh8
+.ńj8
+.ńk8
+.ńl8
+.ńm8
+.ńn8
+.ńp8
+.ńr8
+.ńs8
+.ńt8
+.ńv8
+.ńw8
+.ńx8
+.ńz8
+.ść8
+.śł8
+.śń8
+.śś8
+.śź8
+.śż8
+.ś8
+.śb8
+.śc8
+.śd8
+.śf8
+.śg8
+.śh8
+.śj8
+.śk8
+.śl8
+.śm8
+.śn8
+.śp8
+.śró2d5
+.śródr2
+.śr8
+.śs8
+.śt8
+.śv8
+.św8
+.światło3w2
+.śx8
+.śz8
+.źć8
+.źł8
+.źń8
+.źś8
+.źź8
+.źż8
+.ź8
+.źb8
+.źc8
+.źdź8
+.źd8
+.źf8
+.źg8
+.źh8
+.źj8
+.źk8
+.źl8
+.źm8
+.źn8
+.źp8
+.źr8
+.źs8
+.źt8
+.źv8
+.źw8
+.źx8
+.źz8
+.żć8
+.żł8
+.żń8
+.żś8
+.żź8
+.żż8
+.ż8
+.żb8
+.żc8
+.żd8
+.żf8
+.żg8
+.żh8
+.żj8
+.żk8
+.żl8
+.żm8
+.żn8
+.żp8
+.żr8
+.żs8
+.żt8
+.żv8
+.żw8
+.żx8
+.żz8
+.a2b2s3t
+.a2d3
+.ad4a
+.ad4e
+.ad4i
+.ad4o
+.ad4u
+.ad4y
+.ad5apt
+.ad5iu
+.ad5op
+.ad5or
+.ae3ro
+.aeroa2
+.aeroe2
+.aeroi2
+.aeroo2
+.aerou2
+.antya2
+.antye2
+.antyi2
+.antyo2
+.antyu2
+.arcy3ł2
+.arcy3b2
+.arcy3bz2
+.arcy3k2
+.arcy3m2
+.arcya2
+.arcye2
+.arcyi2
+.arcyo2
+.arcyu2
+.au3g2
+.au3k2
+.au3t2
+.auto3ch2
+.autoa2
+.autoe2
+.autoi2
+.autoo2
+.autotran2s3
+.autou2
+.bć8
+.bł8
+.bń8
+.bś8
+.bź8
+.bż8
+.b8
+.bb8
+.bc8
+.bd8
+.be2z3
+.be3z4an
+.be3z4ec
+.be3z4ik
+.bezch2
+.bezm2
+.bezo2
+.bezo2b1j
+.bezw2
+.bezzw2
+.bf8
+.bg8
+.bh8
+.bj8
+.bk8
+.bl8
+.bm8
+.bn8
+.bp8
+.br8
+.brz8
+.bs8
+.bt8
+.bv8
+.bw8
+.bx8
+.bz8
+.cć8
+.cł8
+.cń8
+.cś8
+.cź8
+.cż8
+.c8
+.cało3ś2
+.cało3k2
+.cb8
+.cc8
+.cd8
+.cf8
+.cg8
+.ch8
+.chrz8
+.cienko3w2
+.ciepło3kr2
+.cj8
+.ck8
+.cl8
+.cm8
+.cn8
+.cp8
+.cr8
+.cs8
+.ct8
+.cv8
+.cw8
+.cx8
+.cz8
+.czarno3k2
+.czk8
+.cztere2ch3
+.czterechse2t3
+.cztero3ś2
+.czwó2r3
+.czwó3r4ą
+.czwó3r4ę
+.czwó3r4a
+.czwó3r4e
+.czwó3r4o
+.dć8
+.dł8
+.długo3tr2
+.długo3w2
+.dń8
+.dś8
+.dź8
+.dż8
+.d8
+.daleko3w2
+.db8
+.dc8
+.dd8
+.de2z3
+.de3z4a3bil
+.de3z4a3wu
+.de3z4el
+.de3z4er
+.de3z4y
+.deza2
+.dezo2
+.df8
+.dg8
+.dh8
+.dj8
+.dk8
+.dl8
+.dm8
+.dn8
+.do3ć2
+.do3ł2
+.do3ś2
+.do3ź2
+.do3ż2
+.do3b2
+.do3c2
+.do3d2
+.do3f2
+.do3g2
+.do3h2
+.do3k2
+.do3l2
+.do3m2
+.do3p2
+.do3r2
+.do3s2
+.do3t2
+.do3w2
+.do3z2
+.do4ł3k
+.do4k3t
+.do4l3n
+.do4m3k
+.do4r3s
+.do4w3c
+.do5m4k2n
+.dobr2
+.dobrz2
+.doch2
+.docz2
+.dodź2
+.dodż2
+.dodz2
+.dogrz2
+.dopch2
+.doprz2
+.dorż2
+.dorz2
+.dosch2
+.dosm2
+.dosz2
+.dotk2
+.dotr2
+.dp8
+.dr8
+.drogo3w2
+.drz8
+.ds8
+.dt8
+.dv8
+.dwó2j3
+.dwó3j4ą
+.dwó3j4ę
+.dwó3j4a
+.dwó3j4e
+.dwó3j4o
+.dw8
+.dx8
+.dy2s3
+.dy2z3
+.dy3s4e
+.dy3s4o
+.dy3s4ta
+.dy3s4y
+.dy3sz
+.dy3z4e
+.dyzu2
+.dz8
+.dziesięcio3ś2
+.dziewięćse2t3
+.dziewię2ć3
+.dziewięcio3ś2
+.e2k2s3
+.e2m3e2s5ze2t
+.e2s1e2s1ma
+.e2s1ha
+.e2s1t
+.egoa2
+.egoe2
+.egoi2
+.egoo2
+.egou2
+.eks4y
+.elektroa2
+.elektroe2
+.elektroi2
+.elektroo2
+.elektrou2
+.fć8
+.fł8
+.fń8
+.fś8
+.fź8
+.fż8
+.f8
+.fb8
+.fc8
+.fd8
+.ff8
+.fg8
+.fh8
+.fj8
+.fk8
+.fl8
+.fm8
+.fn8
+.fp8
+.fr8
+.fs8
+.ft8
+.fv8
+.fw8
+.fx8
+.fz8
+.gć8
+.gł8
+.gń8
+.gś8
+.gź8
+.gż8
+.g8
+.gb8
+.gc8
+.gd8
+.ge2o3
+.gf8
+.gg8
+.gh8
+.gj8
+.gk8
+.gl8
+.gm8
+.gn8
+.go2u3
+.gp8
+.gr8
+.grubo3w2
+.grz8
+.gs8
+.gt8
+.gv8
+.gw8
+.gx8
+.gz8
+.hć8
+.hł8
+.hń8
+.hś8
+.hź8
+.hż8
+.h8
+.hb8
+.hc8
+.hd8
+.hf8
+.hg8
+.hh8
+.hipe2r3
+.hipe3r4o
+.hipera2
+.hipere2
+.hj8
+.hk8
+.hl8
+.hm8
+.hn8
+.hp8
+.hr8
+.hs8
+.ht8
+.hv8
+.hw8
+.hx8
+.hz8
+.i2n3
+.i2s3l
+.i3n4ic
+.i3n4o
+.i3n4u
+.i4n5o2k
+.in4f3lan
+.ino3w2
+.izoa2
+.izoe2
+.izoi2
+.izoo2
+.izou2
+.jć8
+.jł8
+.jń8
+.jś8
+.jź8
+.jż8
+.j8
+.jadło3w2
+.jb8
+.jc8
+.jd8
+.jf8
+.jg8
+.jh8
+.jj8
+.jk8
+.jl8
+.jm8
+.jn8
+.jp8
+.jr8
+.js8
+.jt8
+.jv8
+.jw8
+.jx8
+.jz8
+.kć8
+.kł8
+.kń8
+.kś8
+.kź8
+.kż8
+.k8
+.kb8
+.kc8
+.kd8
+.kf8
+.kg8
+.kh8
+.kilkuse2t3
+.kilkuseto2
+.kj8
+.kk8
+.kl8
+.km8
+.kn8
+.koło3w2
+.kon2t2r3
+.kon3tr4a
+.kon3tr4e
+.kon3tr4o3l
+.kon3tr4o3w
+.kon3tr4y
+.kon4tr5a2gi
+.kon4tr5a2se
+.kon4tr5a2sy
+.kon4tr5a2ta
+.kon4tr5adm
+.kon4tr5akc
+.kon4tr5alt
+.kon4tr5arg
+.kontro2
+.kontru2
+.kp8
+.krótko3tr2
+.krótko3w2
+.kr8
+.kro2ć3
+.krz8
+.ks8
+.kt8
+.kv8
+.kw8
+.kx8
+.kz8
+.lć8
+.lł8
+.lń8
+.lś8
+.lź8
+.lż8
+.l8
+.lb8
+.lc8
+.ld8
+.lf8
+.lg8
+.lh8
+.lj8
+.lk8
+.ll8
+.lm8
+.ln8
+.lp8
+.lr8
+.ls8
+.lt8
+.ludo3w2
+.lv8
+.lw8
+.lx8
+.lz8
+.mć8
+.mł8
+.mń8
+.mś8
+.mź8
+.mż8
+.m8
+.mb8
+.mc8
+.md8
+.mf8
+.mg8
+.mh8
+.mili3amp
+.mj8
+.mk8
+.ml8
+.mm8
+.mn8
+.możno3w2
+.mp8
+.mr8
+.ms8
+.mt8
+.mv8
+.mw8
+.mx8
+.mz8
+.nć8
+.nł8
+.nń8
+.nś8
+.nź8
+.nż8
+.n8
+.na2d2
+.na2j
+.na3ć2
+.na3ł2
+.na3ś2
+.na3ź2
+.na3ż2
+.na3b2
+.na3c2
+.na3dą
+.na3dę
+.na3dź2
+.na3d4łub
+.na3d4ir
+.na3d4much
+.na3d4ręcz
+.na3d4r2w
+.na3d4repcz
+.na3d4rept
+.na3d4ruk
+.na3d4rz
+.na3d4worn
+.na3daj
+.na3de
+.na3do
+.na3dy
+.na3dzi
+.na3f2
+.na3g2
+.na3h2
+.na3ją
+.na3ję
+.na3jazd
+.na3je
+.na3k2
+.na3l2
+.na3m2
+.na3p2
+.na3r2
+.na3s2
+.na3t2
+.na3u2
+.na3w2
+.na3z2
+.na4d3o2b2ł
+.na4d3o2bojcz
+.na4d3o2bowi
+.na4d3o2brot
+.na4d3o2drz
+.na4d3o2kien
+.na4d3olbrz
+.na4d5rzą
+.na4d5rzę
+.na4d5rzecz
+.na4d5rzy
+.na4d5ziem
+.na4f3c
+.na4f3t
+.na4j3e2f
+.na4j3e2g
+.na4j3e2k2s
+.na4j3e2ko
+.na4j3e2n
+.na4j3e2r
+.na4j3e2s
+.na4j3e2w
+.na4j3emf
+.na4j3eu
+.na4r3c
+.na4r3d
+.na4r3k
+.na4r3r
+.na4r3t
+.nabrz2
+.nach2
+.nacz2
+.nadśrod5ziem
+.nad3ć2
+.nad3ł2
+.nad3ś2
+.nad3b2
+.nad3c2
+.nad3d2
+.nad3e2tat
+.nad3f2
+.nad3g2
+.nad3h2
+.nad3i2
+.nad3j2
+.nad3k2
+.nad3l2
+.nad3m2
+.nad3n2
+.nad3p2
+.nad3r2
+.nad3s2
+.nad3t2
+.nad3u2
+.nad3w2
+.nad5ż2
+.nad5zó
+.nad5z2mys
+.nad5zo
+.nad5zwycz
+.nadch2
+.nadcz2
+.naddź2
+.nade3ć2
+.nade3ł2
+.nade3ś2
+.nade3ź2
+.nade3ż2
+.nade3b2
+.nade3c2
+.nade3d2
+.nade3f2
+.nade3g2
+.nade3h2
+.nade3k2
+.nade3l2
+.nade3m2
+.nade3p2
+.nade3r2
+.nade3s2
+.nade3t2
+.nade3w2
+.nade3z2
+.nade4p3c
+.nade4p3n
+.nade4p3t
+.nadech2
+.nadecz2
+.nadedź2
+.nadedż2
+.nadedz2
+.naderż2
+.naderz2
+.nadesz2
+.nadsz2
+.nadtr2
+.nadz2
+.nagrz2
+.naj3ć2
+.naj3ł2
+.naj3ś2
+.naj3ź2
+.naj3ż2
+.naj3akt
+.naj3au
+.naj3b2
+.naj3c2
+.naj3d2
+.naj3f2
+.naj3g2
+.naj3h2
+.naj3i2
+.naj3k2
+.naj3l2
+.naj3m2
+.naj3o2
+.naj3o2ć2
+.naj3o2ł2
+.naj3o2ś2
+.naj3o2ź2
+.naj3o2ż2
+.naj3o2b2
+.naj3o2c2
+.naj3o2d2
+.naj3o2f2
+.naj3o2g2
+.naj3o2h2
+.naj3o2k2
+.naj3o2l2
+.naj3o2m2
+.naj3o2p2
+.naj3o2r2
+.naj3o2s2
+.naj3o2t2
+.naj3o2w2
+.naj3o2z2
+.naj3p2
+.naj3r2
+.naj3ro2z3
+.naj3s2
+.naj3t2
+.naj3u2
+.naj3w2
+.naj3z2
+.najbe2z3
+.najbezw2
+.najch2
+.najcz2
+.najdź2
+.najdż2
+.najdo3ć2
+.najdo3ł2
+.najdo3ś2
+.najdo3ź2
+.najdo3ż2
+.najdo3b2
+.najdo3c2
+.najdo3d2
+.najdo3f2
+.najdo3g2
+.najdo3h2
+.najdo3k2
+.najdo3l2
+.najdo3m2
+.najdo3p2
+.najdo3r2
+.najdo3s2
+.najdo3t2
+.najdo3w2
+.najdo3z2
+.najdoch2
+.najdocz2
+.najdodź2
+.najdodż2
+.najdodz2
+.najdorz2
+.najdosz2
+.najdotk2
+.najdz2
+.najkr2
+.najob3ć2
+.najob3ł2
+.najob3ś2
+.najob3ź2
+.najob3ż2
+.najob3c2
+.najob3d2
+.najob3f2
+.najob3g2
+.najob3h2
+.najob3j2
+.najob3k2
+.najob3l2
+.najob3m2
+.najob3n2
+.najob3p2
+.najob3s2
+.najob3t2
+.najob3w2
+.najobch2
+.najobcz2
+.najobdź2
+.najobdż2
+.najobdz2
+.najobrz2
+.najobsz2
+.najoch2
+.najocz2
+.najodź2
+.najod3ć2
+.najod3ś2
+.najod3c2
+.najod3d2
+.najod3f2
+.najod3g2
+.najod3h2
+.najod3j2
+.najod3k2
+.najod3l2
+.najod3m2
+.najod3n2
+.najod3p2
+.najod3s2
+.najod3t2
+.najod3w2
+.najod5ż2
+.najodch2
+.najodcz2
+.najoddź2
+.najoddż2
+.najoddz2
+.najodsz2
+.najodz2
+.najorz2
+.najosz2
+.najro3z4u
+.najrz2
+.najsm2
+.najsz2
+.najtk2
+.najtr2
+.najucz2
+.najzw2
+.nakr2
+.napo2d2
+.napo3ć2
+.napo3ł2
+.napo3ś2
+.napo3ź2
+.napo3ż2
+.napo3b2
+.napo3c2
+.napo3f2
+.napo3g2
+.napo3h2
+.napo3k2
+.napo3l2
+.napo3m2
+.napo3p2
+.napo3r2
+.napo3s2
+.napo3t2
+.napo3w2
+.napo3z2
+.napo4m3p
+.napoch2
+.napocz2
+.napodź2
+.napodż2
+.napod3d
+.napomk2
+.naporz2
+.naposz2
+.naprz2
+.narż2
+.naro2z3
+.narz2
+.nasm2
+.nasz2
+.natch2
+.natk2
+.naz3m2
+.nazw2
+.nb8
+.nc8
+.nd8
+.ne2o3
+.nf8
+.ng8
+.nh8
+.nie3ć2
+.nie3ł2
+.nie3ś2
+.nie3ź2
+.nie3ż2
+.nie3b2
+.nie3c2
+.nie3d2
+.nie3f2
+.nie3g2
+.nie3h2
+.nie3k2
+.nie3l2
+.nie3m2
+.nie3p2
+.nie3r2
+.nie3s2
+.nie3t2
+.nie3u2
+.nie3w2
+.nie3z2
+.nie4c3c
+.nie4c3k
+.nie4dź3
+.nie4m3c
+.nie4m3k
+.niech2
+.niecz2
+.niedż2
+.niedo3ć2
+.niedo3ł2
+.niedo3ś2
+.niedo3ź2
+.niedo3ż2
+.niedo3b2
+.niedo3c2
+.niedo3d2
+.niedo3f2
+.niedo3g2
+.niedo3h2
+.niedo3k2
+.niedo3l2
+.niedo3m2
+.niedo3p2
+.niedo3r2
+.niedo3s2
+.niedo3t2
+.niedo3w2
+.niedo3z2
+.niedobrz2
+.niedoch2
+.niedocz2
+.niedodź2
+.niedodż2
+.niedodz2
+.niedokr2
+.niedomk2
+.niedopch2
+.niedorz2
+.niedosz2
+.niedotk2
+.niedz2
+.nieoć2
+.nieoł2
+.nieoś2
+.nieoź2
+.nieoż2
+.nieo2
+.nieob2
+.nieob3ć2
+.nieob3ś2
+.nieob3ź2
+.nieob3ż2
+.nieob3c2
+.nieob3d2
+.nieob3f2
+.nieob3g2
+.nieob3h2
+.nieob3j2
+.nieob3k2
+.nieob3m2
+.nieob3p2
+.nieob3s2
+.nieob3w2
+.nieobch2
+.nieobcz2
+.nieobdź2
+.nieobdż2
+.nieobdz2
+.nieobsz2
+.nieoc2
+.nieoch2
+.nieocz2
+.nieodź2
+.nieod2
+.nieod3ć2
+.nieod3ł2
+.nieod3ś2
+.nieod3c2
+.nieod3d2
+.nieod3f2
+.nieod3g2
+.nieod3h2
+.nieod3j2
+.nieod3k2
+.nieod3l2
+.nieod3n2
+.nieod3p2
+.nieod3s2
+.nieod3t2
+.nieod3wr
+.nieod5ż2
+.nieodch2
+.nieodcz2
+.nieoddź2
+.nieoddż2
+.nieoddz2
+.nieodsz2
+.nieodw2
+.nieodz2
+.nieof2
+.nieog2
+.nieoh2
+.nieok2
+.nieol2
+.nieom2
+.nieop2
+.nieor2
+.nieorz2
+.nieos2
+.nieosz2
+.nieot2
+.nieow2
+.nieoz2
+.niepo2d2
+.niepo3ć2
+.niepo3ł2
+.niepo3ś2
+.niepo3ź2
+.niepo3ż2
+.niepo3b2
+.niepo3c2
+.niepo3dź2
+.niepo3d4łu
+.niepo3d4much
+.niepo3d4ręcz
+.niepo3d4raż
+.niepo3d4rap
+.niepo3d4repcz
+.niepo3d4rept
+.niepo3d4waj
+.niepo3d4woj
+.niepo3do
+.niepo3du
+.niepo3dz2
+.niepo3f2
+.niepo3g2
+.niepo3h2
+.niepo3k2
+.niepo3l2
+.niepo3m2
+.niepo3p2
+.niepo3r2
+.niepo3s2
+.niepo3t2
+.niepo3w2
+.niepo3z2
+.niepo4d3o2choc
+.niepo4d3o2strz
+.niepoch2
+.niepocz2
+.niepod3ć2
+.niepod3ł2
+.niepod3ś2
+.niepod3b2
+.niepod3c2
+.niepod3d2
+.niepod3f2
+.niepod3g2
+.niepod3h2
+.niepod3j2
+.niepod3k2
+.niepod3l2
+.niepod3m2
+.niepod3n2
+.niepod3p2
+.niepod3r2
+.niepod3s2
+.niepod3t2
+.niepod3w2
+.niepod5ż
+.niepodch2
+.niepodcz2
+.niepoddź2
+.niepoddż2
+.niepodsm2
+.niepodsz2
+.nieporz2
+.nieposm2
+.nieposz2
+.nieprzełk2
+.nieprze2d2
+.nieprze3ć2
+.nieprze3ł2
+.nieprze3ś2
+.nieprze3ź2
+.nieprze3ż2
+.nieprze3b2
+.nieprze3brz2
+.nieprze3c2
+.nieprze3dź2
+.nieprze3d4łuż
+.nieprze3d4much
+.nieprze3d4ramat
+.nieprze3d4ruk
+.nieprze3d4ryl
+.nieprze3d4rz2
+.nieprze3d4um
+.nieprze3dy
+.nieprze3dz2
+.nieprze3e2k2s3
+.nieprze3f2
+.nieprze3g2
+.nieprze3h2
+.nieprze3k2
+.nieprze3l2
+.nieprze3m2
+.nieprze3n2
+.nieprze3p2
+.nieprze3r2
+.nieprze3s2
+.nieprze3t2
+.nieprze3w2
+.nieprze3z2
+.nieprze4d5łużyc
+.nieprze4d5ż2
+.nieprze4d5z2a
+.nieprze4d5zg2
+.nieprze4d5zim
+.nieprze4d5zj
+.nieprze4d5zl
+.nieprze4d5zw2r
+.nieprze4d5zwoj
+.nieprzech2
+.nieprzecz2
+.nieprzed3ć2
+.nieprzed3ł2
+.nieprzed3ś2
+.nieprzed3c2
+.nieprzed3d2
+.nieprzed3f2
+.nieprzed3g2
+.nieprzed3h2
+.nieprzed3i2
+.nieprzed3j2
+.nieprzed3k2
+.nieprzed3l2
+.nieprzed3m2
+.nieprzed3n2
+.nieprzed3p2
+.nieprzed3r2
+.nieprzed3s2
+.nieprzed3sz2
+.nieprzed3t2
+.nieprzed3u2
+.nieprzed3w2
+.nieprzedch2
+.nieprzedcz2
+.nieprzeddź2
+.nieprzeddż2
+.nieprzeddz2
+.nieprzegrz2
+.nieprzekl2
+.nieprzekr2
+.nieprzepch2
+.nieprzerż2
+.nieprzerz2
+.nieprzesch2
+.nieprzesm2
+.nieprzesz2
+.nieprzetk2
+.nieprzetr2
+.niero2z3
+.niero3z4e
+.niero3z4u
+.nierozś2
+.nierozbrz2
+.nieroze3r2
+.nierozm2
+.nieroztr2
+.nierz2
+.niesu2b3
+.niesu3b4ie
+.niesz2
+.nietk2
+.nietr2
+.nieucz2
+.nieuw2
+.niewy3ć2
+.niewy3ł2
+.niewy3ś2
+.niewy3ź2
+.niewy3ż2
+.niewy3b2
+.niewy3c2
+.niewy3d2
+.niewy3f2
+.niewy3g2
+.niewy3h2
+.niewy3k2
+.niewy3l2
+.niewy3m2
+.niewy3p2
+.niewy3r2
+.niewy3s2
+.niewy3t2
+.niewy3w2
+.niewy3z2
+.niewybrz2
+.niewych2
+.niewycz2
+.niewydź2
+.niewydż2
+.niewydz2
+.niewyrz2
+.niewysz2
+.niewytk2
+.niewytr2
+.niezw2
+.nj8
+.nk8
+.nl8
+.nm8
+.nn8
+.np8
+.nr8
+.ns8
+.nt8
+.nv8
+.nw8
+.nx8
+.nz8
+.oć2
+.oś2
+.ośmio3ś2
+.oź2
+.oż2
+.o2b2
+.o2d2
+.o2t3chł
+.o3b4łą
+.o3b4łę
+.o3b4łoc
+.o3b4luzg
+.o3b4rać
+.o3b4raso
+.o3b4roń
+.o3b4ron
+.o3b4ryź
+.o3b4ryz
+.o3b4rz2
+.o3be
+.o3bi
+.o3d4iu
+.o3d4ręt
+.o3d4rap
+.o3d4robin
+.o3d4rut
+.o3d4rwi
+.o3d4rzeć
+.o3d4rzw
+.o3d6zia
+.o3d6zie
+.o3de
+.o3l2śn
+.o4b5łocz
+.o4b5rzą
+.o4b5rzęd
+.o4b5rzez
+.o4b5rzuc
+.o4b5rzut
+.o4b5rzyn
+.o4d7ziar
+.o4d7ziem
+.oa3z
+.ob3ć2
+.ob3ł2
+.ob3ś2
+.ob3ź2
+.ob3ż2
+.ob3c2
+.ob3d2
+.ob3f2
+.ob3g2
+.ob3h2
+.ob3j2
+.ob3k2
+.ob3l2
+.ob3m2
+.ob3n2
+.ob3o2strz
+.ob3p2
+.ob3r
+.ob3s2
+.ob3t2
+.ob3u2m2
+.ob3w2
+.obch2
+.obcz2
+.obdź2
+.obdż2
+.obdz2
+.obe3ć2
+.obe3ł2
+.obe3ś2
+.obe3ź2
+.obe3ż2
+.obe3b2
+.obe3c2
+.obe3d2
+.obe3f2
+.obe3g2
+.obe3h2
+.obe3k2
+.obe3l2
+.obe3m2
+.obe3p2
+.obe3r2
+.obe3r3t
+.obe3s2
+.obe3t2
+.obe3w2
+.obe3z2
+.obe4c3n
+.obe4z3w
+.obech2
+.obecz2
+.obedź2
+.obedż2
+.obedz2
+.oberż2
+.ober3m
+.oberz2
+.obesch2
+.obesz2
+.obetk2
+.obi3b2
+.obsz2
+.oc2
+.och2
+.ochrz2
+.ocz2
+.odź2
+.od3ć2
+.od3ś2
+.od3au
+.od3b2
+.od3c2
+.od3d2
+.od3f2
+.od3g2
+.od3h2
+.od3i2
+.od3i2zo
+.od3j2
+.od3k2
+.od3l2
+.od3m2
+.od3n2
+.od3o2s
+.od3p2
+.od3r2
+.od3s2
+.od3t2
+.od3u2cz
+.od3u2m2
+.od3w2
+.od5ż2
+.od5z2
+.odbe2z3
+.odch2
+.odcz2
+.oddź2
+.oddż2
+.oddz2
+.ode3ć2
+.ode3ł2
+.ode3ś2
+.ode3ź2
+.ode3ż2
+.ode3b2
+.ode3c2
+.ode3d2
+.ode3f2
+.ode3g2
+.ode3h2
+.ode3k2
+.ode3l2
+.ode3m2
+.ode3mk2
+.ode3p2
+.ode3r2
+.ode3s2
+.ode3t2
+.ode3w2
+.ode3z2
+.odech2
+.odecz2
+.odedź2
+.odedż2
+.odedz2
+.odepch2
+.oderż2
+.oderz2
+.odesz2
+.odetch2
+.odetk2
+.odkrz2
+.odrz2
+.odsz2
+.of2
+.ogólno3k2
+.og2
+.ognio3tr2
+.oh2
+.ok2
+.oka3m2
+.okr2
+.ole2o3
+.om2
+.op2
+.opch2
+.or2ż2
+.or2tę
+.or2z2
+.os2
+.osie2m3
+.osiemse2t3
+.osz2
+.ot2
+.ow2
+.oz2
+.pć8
+.pł8
+.płasko3w2
+.pń8
+.półk2
+.półkr2
+.półm2
+.póło2
+.półob3r
+.półom2d
+.półprzy3m2k
+.pó2ł3
+.pó3ł4ą
+.pó3ł4ę
+.pó3ł4ecz
+.pó3ł4y
+.pś8
+.pź8
+.pż8
+.p8
+.pb8
+.pc8
+.pch8
+.pd8
+.pełno3kr2
+.pe2r3
+.pe3c2k
+.pe3r4e
+.pe3r4i
+.pe3r4o
+.pe3r4u
+.pe3r4y
+.pe4r5i2n
+.pee2se2l
+.pepee2r
+.pepee2s
+.peze2t1pee2r
+.pf8
+.pg8
+.ph8
+.pięćse2t3
+.pię2ć3
+.pięcio3ś2
+.pierwo3w2
+.piono3w2
+.pj8
+.pk8
+.pl8
+.pm8
+.pn8
+.połk2
+.po2d2
+.po3ć2
+.po3ł2
+.po3ś2
+.po3ź2
+.po3ż2
+.po3b2
+.po3c2
+.po3dą
+.po3dę
+.po3dź2
+.po3d4łu
+.po3d4much
+.po3d4naw
+.po3d4ręcz
+.po3d4rętw
+.po3d4róż
+.po3d4r2wi
+.po3d4raż
+.po3d4rap
+.po3d4repcz
+.po3d4rept
+.po3d4roż
+.po3d4robó
+.po3d4roba
+.po3d4robo
+.po3d4roby
+.po3d4rocz
+.po3d4ruzg
+.po3d4ryg
+.po3d4rze
+.po3d4wójn
+.po3d4wór
+.po3d4waj
+.po3d4woi
+.po3d4woj
+.po3d4worz
+.po3da
+.po3de
+.po3dej
+.po3diu
+.po3do
+.po3du
+.po3dy
+.po3dz2
+.po3e2k2s3
+.po3f2
+.po3g2
+.po3h2
+.po3k2
+.po3l2
+.po3m2
+.po3p2
+.po3rż
+.po3r2
+.po3s2
+.po3t2
+.po3w2
+.po3z2
+.po4ń3c
+.po4cz3d
+.po4cz3t
+.po4d3ów
+.po4d3e4k2s3
+.po4d3o2bóz
+.po4d3o2biad
+.po4d3o2bojcz
+.po4d3o2braz
+.po4d3o2choc
+.po4d3o2dm
+.po4d3o2f
+.po4d3o2g
+.po4d3o2kien
+.po4d3o2kn
+.po4d3o2kręg
+.po4d3o2kres
+.po4d3o2piecz
+.po4d3o2ryw
+.po4d3o2siniak
+.po4d3o2strz
+.po4d3obsz
+.po4d3odd
+.po4d3olbrz
+.po4d3u2cz
+.po4d3u2dz
+.po4d3u2pa
+.po4d3u2ral
+.po4d3u2sta
+.po4d3u2szcz
+.po4d5ręczn
+.po4d5zakr
+.po4d5zam
+.po4d5zast
+.po4d5zbi
+.po4d5ze
+.po4d5zielenią
+.po4d5zielenić
+.po4d5zielenię
+.po4d5zielenił
+.po4d5zielenic
+.po4d5zielenien
+.po4d5zielenil
+.po4d5zielenim
+.po4d5zielenio
+.po4d5zielenis
+.po4d5ziem
+.po4d5ziom
+.po4d5zw2r
+.po4l3s
+.po4m3p
+.po4r3c
+.po4r3f
+.po4r3n
+.po4r3t
+.po4st3d
+.po4st3f
+.po4st3g
+.po4st3h
+.po4st3i2
+.po4st3k
+.po4st3l
+.po4st3m
+.po4st3p
+.po4st3rom
+.po4st3s
+.po5d4uszczyn
+.po5r4tę
+.pobr2
+.pobrz2
+.poch2
+.pochrz2
+.pocz2
+.pod3ć2
+.pod3ł2
+.pod3ś2
+.pod3śró2d5
+.pod3alp
+.pod3b2
+.pod3c2
+.pod3d2
+.pod3f2
+.pod3g2
+.pod3h2
+.pod3i2n
+.pod3j2
+.pod3k2
+.pod3l2
+.pod3m2
+.pod3n2
+.pod3p2
+.pod3r2
+.pod3s2
+.pod3t2
+.pod3w2
+.pod5ż2
+.podch2
+.podcz2
+.poddź2
+.poddż2
+.pode3ć2
+.pode3ł2
+.pode3ś2
+.pode3ź2
+.pode3ż2
+.pode3b2
+.pode3c2
+.pode3d2
+.pode3f2
+.pode3g2
+.pode3h2
+.pode3k2
+.pode3l2
+.pode3m2
+.pode3p2
+.pode3r2
+.pode3s2
+.pode3t2
+.pode3tk2
+.pode3w2
+.pode3z2
+.podech2
+.podecz2
+.podedź2
+.podedż2
+.podedz2
+.podepch2
+.poderż2
+.poderz2
+.podesch2
+.podesz2
+.podro2z3
+.podsm2
+.podsz2
+.pogrz2
+.pokl2
+.pokr2
+.pom4pk
+.pomk2
+.pona2d2
+.pona3ć2
+.pona3ł2
+.pona3ś2
+.pona3ź2
+.pona3ż2
+.pona3b2
+.pona3c2
+.pona3cz2
+.pona3dź2
+.pona3do
+.pona3f2
+.pona3g2
+.pona3h2
+.pona3k2
+.pona3l2
+.pona3m2
+.pona3p2
+.pona3r2
+.pona3s2
+.pona3t2
+.pona3w2
+.pona3z2
+.pona4f3t
+.ponabrz2
+.ponach2
+.ponad3ć2
+.ponad3ś2
+.ponad3c2
+.ponad3ch2
+.ponad3cz2
+.ponad3dź2
+.ponad3f2
+.ponad3g2
+.ponad3h2
+.ponad3j2
+.ponad3k2
+.ponad3l2
+.ponad3p2
+.ponad3s2
+.ponad3t2
+.ponadz2
+.ponarz2
+.ponasm2
+.ponasz2
+.ponaz3m2
+.ponazw2
+.ponie3k2
+.ponie3w2
+.popch2
+.popo3w2
+.poprz2
+.por4t1w
+.por4tf
+.por4tm
+.poro2z3
+.poro3z4u
+.porz2
+.posch2
+.posm2
+.posz2
+.potk2
+.potr2
+.poz4m2
+.poza3u2
+.pozw2
+.pp8
+.pr8
+.pra3s2
+.pra3w2nu
+.pra3w2z
+.prapra3w2nu
+.predy2s3po
+.prz8
+.przełk2
+.prze2d2
+.prze3ć2
+.prze3ł2
+.prze3ś2
+.prze3ź2
+.prze3ż2
+.prze3b2
+.prze3c2
+.prze3dą
+.prze3dę
+.prze3dź2
+.prze3d4łuż
+.prze3d4much
+.prze3d4o3br
+.prze3d4o3st
+.prze3d4o3zo
+.prze3d4ramat
+.prze3d4ruk
+.prze3d4ryl
+.prze3d4rz2
+.prze3d4um
+.prze3dy
+.prze3dz2
+.prze3e2k2s3
+.prze3f2
+.prze3g2
+.prze3h2
+.prze3k2
+.prze3l2
+.prze3m2
+.prze3n2
+.prze3p2
+.prze3r2
+.prze3s2
+.prze3t2
+.prze3u2
+.prze3w2
+.prze3z2
+.prze4d5łużyc
+.prze4d5ż2
+.prze4d5o4stat
+.prze4d5za
+.prze4d5zg2
+.prze4d5zim
+.prze4d5zj
+.prze4d5zl
+.prze4d5zw2r
+.prze4d5zwoj
+.przebr2
+.przebrz2
+.przech2
+.przechrz2
+.przeci2w3
+.przeci3w4ie
+.przeciwa2
+.przeciww2
+.przecz2
+.przed3ć2
+.przed3ł2
+.przed3ś2
+.przed3a2gon
+.przed3a2kc
+.przed3alp
+.przed3b2
+.przed3c2
+.przed3d2
+.przed3e2gz
+.przed3e2mer
+.przed3f2
+.przed3g2
+.przed3h2
+.przed3i2
+.przed3j2
+.przed3k2
+.przed3l2
+.przed3m2
+.przed3n2
+.przed3o2
+.przed3p2
+.przed3r2
+.przed3s2
+.przed3się3w2
+.przed3sz2
+.przed3t2
+.przed3u2
+.przed3w2
+.przedch2
+.przedcz2
+.przeddź2
+.przeddż2
+.przeddz2
+.przedgrz2
+.przedy2s3ku
+.przegrz2
+.przekl2
+.przekr2
+.przemk2
+.przepch2
+.przerż2
+.przerz2
+.przesch2
+.przesm2
+.przesz2
+.przetk2
+.przetr2
+.przetran2s3
+.przy3ć2
+.przy3ł2
+.przy3ś2
+.przy3ź2
+.przy3ż2
+.przy3b2
+.przy3c2
+.przy3d2
+.przy3f2
+.przy3g2
+.przy3h2
+.przy3k2
+.przy3l2
+.przy3m2
+.przy3p2
+.przy3r2
+.przy3s2
+.przy3t2
+.przy3w2
+.przy3z2
+.przybr2
+.przych2
+.przycz2
+.przydź2
+.przydż2
+.przydz2
+.przygrz2
+.przymk2
+.przyoz2
+.przypch2
+.przyrż2
+.przyrz2
+.przysch2
+.przysz2
+.przytk2
+.ps8
+.pt8
+.pv8
+.pw8
+.px8
+.pz8
+.rć8
+.rł8
+.rń8
+.rś8
+.rź8
+.rż8
+.r8
+.rb8
+.rc8
+.rd8
+.retran2s3
+.rf8
+.rg8
+.rh8
+.rj8
+.rk8
+.rl8
+.rm8
+.rn8
+.ro2z3
+.ro3z4a
+.ro3z4e
+.ro3z4e3ć2
+.ro3z4e3ł2
+.ro3z4e3ś2
+.ro3z4e3ź2
+.ro3z4e3ż2
+.ro3z4e3b2
+.ro3z4e3c2
+.ro3z4e3d2
+.ro3z4e3f2
+.ro3z4e3g2
+.ro3z4e3h2
+.ro3z4e3k2
+.ro3z4e3l2
+.ro3z4e3m2
+.ro3z4e3p2
+.ro3z4e3r2
+.ro3z4e3s2
+.ro3z4e3t2
+.ro3z4e3w2
+.ro3z4e3z2
+.ro3z4ej
+.ro3z4u
+.ro4z5a2gi
+.ro4z5a2nie
+.ro4z5e2mo
+.ro4z5e4g3z
+.ro4z5e4n3t
+.rozś2
+.rozbrz2
+.rozd2
+.rozech2
+.rozecz2
+.rozedź2
+.rozedż2
+.rozedz2
+.rozepch2
+.rozerż2
+.rozerz2
+.rozesch2
+.rozesz2
+.rozi2
+.rozm2
+.rozo2
+.rozpo3w2
+.rozt2
+.roztr2
+.rozw2
+.rp8
+.rr8
+.rs8
+.rt8
+.rv8
+.rw8
+.rx8
+.rz8
+.sć8
+.sł8
+.sń8
+.sś8
+.sź8
+.sż8
+.s8
+.samo3ch2
+.samo3k2
+.samo3p2
+.samo3w2
+.samoro2z3
+.sb8
+.sc8
+.sch8
+.sd8
+.sf8
+.sg8
+.sh8
+.siede2m3
+.siedemse2t3
+.siedmio3ś2
+.sj8
+.ską2d5że
+.sk8
+.skl8
+.skr8
+.sl8
+.sm8
+.sn8
+.sobo3w2
+.spó2ł3
+.sp8
+.spo2d2
+.spo3ć2
+.spo3ł2
+.spo3ś2
+.spo3ź2
+.spo3ż2
+.spo3b2
+.spo3c2
+.spo3dz2
+.spo3f2
+.spo3g2
+.spo3h2
+.spo3k2
+.spo3l2
+.spo3m2
+.spo3p2
+.spo3r2
+.spo3s2
+.spo3t2
+.spo3w2
+.spo3z2
+.spo4r3n
+.spo4r3t
+.spoch2
+.spocz2
+.spodź2
+.spodż2
+.spod3d
+.sporz2
+.sposz2
+.sr8
+.ss8
+.st8
+.stere2o3
+.stereoa2
+.stereoe2
+.stereoi2
+.stereoo2
+.stereou2
+.su2b3
+.su3b4ie
+.su3b4otn
+.supe2r3
+.supe3r4at
+.supe3r4io
+.supe4r5a2tr
+.super5z2b
+.supere2
+.supero2d1rzut
+.sv8
+.sw8
+.sx8
+.sz8
+.sześćse2t3
+.sześcio3ś2
+.sze2ś2ć3
+.sze2s3
+.tć8
+.tł8
+.tń8
+.tś8
+.tź8
+.tż8
+.t8
+.ta2o3
+.ta2r7zan
+.tb8
+.tc8
+.tch8
+.td8
+.te2o3
+.tf8
+.tg8
+.th8
+.tj8
+.tk8
+.tl8
+.tm8
+.tn8
+.toa3
+.tp8
+.tró2j3
+.tró3j4ą
+.tró3j4ę
+.tró3j4ecz
+.tr8
+.tran2s3
+.tran3s4e
+.tran3s4ie
+.tran3s4y
+.tran3sz
+.tran4s5eu
+.transa2
+.transo2
+.trz8
+.trze2ch3
+.trzechse2t3
+.ts8
+.tt8
+.tv8
+.tw8
+.tx8
+.tysią2c3
+.tysią3c4a
+.tysią3c4e
+.tysią3cz
+.tysią4c5zł
+.tz8
+.uć2
+.uś2
+.u3ł2
+.u3ź2
+.u3ż2
+.u3b2
+.u3c2
+.u3d2
+.u3f2
+.u3g2
+.u3h2
+.u3k2
+.u3l2
+.u3m2
+.u3n2
+.u3p2
+.u3r2
+.u3s2
+.u3t2
+.u3w2
+.u3z2
+.u4d3k
+.u4f3n
+.u4k3lej
+.u4l3s
+.u4l3t
+.u4m3br
+.u4n3c
+.u4n3d
+.u4p3p2s
+.u4r3s
+.u4st3n
+.u4stc
+.u4stk
+.u4z3be
+.ube2z3
+.ubezw2
+.ubr2
+.uch2
+.ucz2
+.udź2
+.udż2
+.udz2
+.ukr2
+.umk2
+.upch2
+.upo2d2
+.upo3ć2
+.upo3ł2
+.upo3ś2
+.upo3ź2
+.upo3ż2
+.upo3b2
+.upo3c2
+.upo3da
+.upo3f2
+.upo3g2
+.upo3h2
+.upo3k2
+.upo3l2
+.upo3m2
+.upo3p2
+.upo3r2
+.upo3s2
+.upo3t2
+.upo3w2
+.upo3z2
+.upoch2
+.upocz2
+.upodź2
+.upodż2
+.upod3d
+.uporz2
+.uposz2
+.urż2
+.uro2z3
+.urz2
+.usch2
+.usz2
+.utk2
+.utr2
+.uze3w2
+.vć8
+.vł8
+.vń8
+.vś8
+.vź8
+.vż8
+.v8
+.vb8
+.vc8
+.vd8
+.vf8
+.vg8
+.vh8
+.vj8
+.vk8
+.vl8
+.vm8
+.vn8
+.vp8
+.vr8
+.vs8
+.vt8
+.vv8
+.vw8
+.vx8
+.vz8
+.wć8
+.wł8
+.wń8
+.wś8
+.wź8
+.wż8
+.w8
+.wb8
+.wc8
+.wd8
+.we3ć2
+.we3ł2
+.we3ś2
+.we3ż2
+.we3b2
+.we3c2
+.we3d2
+.we3f2
+.we3g2
+.we3h2
+.we3k2
+.we3l2
+.we3m2
+.we3n2
+.we3p2
+.we3r2
+.we3s2
+.we3t2
+.we3w2
+.we3z2
+.we4ł3n
+.we4k3t
+.we4l3w
+.we4n3d
+.we4n3t
+.we4r3b
+.we4r3d
+.we4r3n
+.we4r3s
+.we4r3t
+.we4s3prz
+.we4s3tch2
+.we4z3br
+.we4z3gł
+.wech2
+.wecz2
+.wedź2
+.wedż2
+.wedz2
+.wemk2
+.wepch2
+.werz2
+.wesz2
+.wetk2
+.wewną2trz3
+.wf8
+.wg8
+.wh8
+.wielo3ś2
+.wielo3d2
+.wielo3k2
+.wieluse2t3
+.wilczo3m2
+.wj8
+.wk8
+.wl8
+.wm8
+.wn8
+.wniebo3w2
+.wodo3w2
+.wp8
+.wr8
+.ws8
+.współi2
+.współo2b3w
+.współu2
+.współw2
+.wspó2ł3
+.wsze2ch3
+.wszecho2
+.wszechw2
+.wt8
+.wv8
+.ww8
+.wx8
+.wy3ć2
+.wy3ł2
+.wy3ś2
+.wy3ź2
+.wy3ż2
+.wy3b2
+.wy3c2
+.wy3d2
+.wy3f2
+.wy3g2
+.wy3h2
+.wy3k2
+.wy3l2
+.wy3m2
+.wy3o2d3r
+.wy3p2
+.wy3r2
+.wy3s2
+.wy3t2
+.wy3w2
+.wy3z2
+.wy4ż3sz
+.wy4cz3ha
+.wybr2
+.wybrz2
+.wych2
+.wycz2
+.wydź2
+.wydż2
+.wydr2
+.wydz2
+.wye2k2s3
+.wygrz2
+.wyi2zo
+.wykl2
+.wykr2
+.wykrz2
+.wymk2
+.wypch2
+.wyprz2
+.wyrż2
+.wyrz2
+.wysch2
+.wysm2
+.wysz2
+.wytch2
+.wytk2
+.wytr2
+.wz8
+.xć8
+.xł8
+.xń8
+.xś8
+.xź8
+.xż8
+.x8
+.xb8
+.xc8
+.xd8
+.xf8
+.xg8
+.xh8
+.xj8
+.xk8
+.xl8
+.xm8
+.xn8
+.xp8
+.xr8
+.xs8
+.xt8
+.xv8
+.xw8
+.xx8
+.xz8
+.zć8
+.zł8
+.zło3w2
+.zń8
+.zś8
+.zź8
+.zż8
+.z8
+.za3ć2
+.za3ł2
+.za3ś2
+.za3ź2
+.za3ż2
+.za3b2
+.za3c2
+.za3d2
+.za3f2
+.za3g2
+.za3h2
+.za3k2
+.za3l2
+.za3m2
+.za3o2b3r
+.za3o2b3s
+.za3p2
+.za3r2
+.za3s2
+.za3t2
+.za3u2
+.za3w2
+.za3z2
+.za4k3t
+.za4l3g
+.za4l3k
+.za4l3t
+.za4m3k
+.za4r3ch
+.za4uto
+.za5m4k2n
+.zabr2
+.zabrz2
+.zach2
+.zacz2
+.zadź2
+.zadż2
+.zadośću4
+.zado2ść3
+.zadr2
+.zady2s3po
+.zadz2
+.zagrz2
+.zai2n3
+.zai2zo
+.zain4ic
+.zakl2
+.zakr2
+.zakrz2
+.zanie3d2
+.zarż2
+.zarz2
+.zasch2
+.zasm2
+.zasz2
+.zatk2
+.zatr2
+.zb8
+.zc8
+.zd8
+.zde2z3
+.zde3z4awu
+.zde3z4el
+.zde3z4er
+.zde3z4y
+.zdy2s3kont
+.zdy2s3kred
+.zdy2s3kwal
+.ze3ć2
+.ze3ł2
+.ze3ś2
+.ze3ź2
+.ze3ż2
+.ze3b2
+.ze3c2
+.ze3d2
+.ze3f2
+.ze3g2
+.ze3h2
+.ze3k2
+.ze3l2
+.ze3m2
+.ze3p2
+.ze3r2
+.ze3s2
+.ze3t2
+.ze3tk2
+.ze3w2
+.ze3z2
+.ze4r3k
+.ze4t3e2m1e2s
+.ze4t3e2s1e2l
+.ze4t3emp
+.ze4t3hap
+.zech2
+.zecz2
+.zedź2
+.zedż2
+.zedz2
+.zekl2
+.zepch2
+.zerż2
+.zerz2
+.zesch2
+.zesm4
+.zesz2
+.zf8
+.zg8
+.zh8
+.zimno3kr2
+.zj8
+.zk8
+.zl8
+.zm8
+.zmartwy2ch3
+.zmartwychw2
+.zn8
+.znie3ć2
+.znie3ł2
+.znie3ń2
+.znie3ś2
+.znie3ź2
+.znie3ż2
+.znie3b2
+.znie3c2
+.znie3d2
+.znie3f2
+.znie3g2
+.znie3h2
+.znie3k2
+.znie3l2
+.znie3m2
+.znie3n2
+.znie3p2
+.znie3r2
+.znie3s2
+.znie3t2
+.znie3w2
+.znie3z2
+.znie4dź3
+.znie4m3c
+.zniech2
+.zniecz2
+.zniedż2
+.zniedz2
+.znierz2
+.zniesz2
+.zo2o3
+.zp8
+.zr8
+.zro2z3
+.zro3z4u
+.zs8
+.zt8
+.zv8
+.zw8
+.zx8
+.zz8
+ą1
+ę1
+ó1
+ó4w3cz
+ś1c
+ź2dź
+1ś2ci
+2ć1ń
+2ć1ś
+2ć1ź
+2ć1ż
+2ć1b
+2ć1c
+2ć1d
+2ć1f
+2ć1g
+2ć1k
+2ć1m
+2ć1n
+2ć1p
+2ć1s
+2ć1t
+2ć1z
+2ł1ć
+2ł1ń
+2ł1ś
+2ł1ź
+2ł1ż
+2ł1b
+2ł1c
+2ł1d
+2ł1f
+2ł1g
+2ł1h
+2ł1j
+2ł1k
+2ł1l
+2ł1m
+2ł1n
+2ł1p
+2ł1r
+2ł1s
+2ł1t
+2ł1w
+2ł1z
+2ń1ć
+2ń1ł
+2ń1ń
+2ń1ś
+2ń1ź
+2ń1ż
+2ń1b
+2ń1c
+2ń1d
+2ń1f
+2ń1g
+2ń1h
+2ń1j
+2ń1k
+2ń1l
+2ń1m
+2ń1n
+2ń1p
+2ń1r
+2ń1s
+2ń1t
+2ń1w
+2ń1z
+2śćc
+2ś1ś
+2ś1ź
+2ś1ż
+2ś1b
+2ś1d
+2ś1f
+2ś1g
+2ś1k
+2ś1p
+2ś1s
+2ś1t
+2ś1z
+2ślm
+2śln
+2ź1ć
+2ź1ś
+2ź1ż
+2ź1b
+2ź1c
+2ź1d
+2ź1f
+2ź1g
+2ź1k
+2ź1l
+2ź1m
+2ź1n
+2ź1p
+2ź1s
+2ź1t
+2ź1w
+2ź1z
+2ż1ć
+2ż1ł
+2ż1ń
+2ż1ś
+2ż1ź
+2ż1b
+2ż1c
+2ż1d
+2ż1f
+2ż1g
+2ż1j
+2ż1k
+2ż1l
+2ż1m
+2ż1n
+2ż1p
+2ż1r
+2ż1s
+2ż1t
+2ż1w
+2ż1z
+2błk
+2b1ć
+2b1ń
+2b1ś
+2b1ź
+2b1ż
+2b1c
+2b1d
+2b1f
+2b1g
+2b1k
+2b1m
+2b1n
+2b1p
+2b1s
+2b1t
+2b1z
+2brn
+2c1ć
+2c1ń
+2c1ś
+2c1ź
+2c1ż
+2c1b
+2c1d
+2c1f
+2c1g
+2c1k
+2c1l
+2c1m
+2c1n
+2c1p
+2c1s
+2c1t
+2ch1ć
+2ch1ń
+2ch1ś
+2ch1ź
+2ch1ż
+2ch1b
+2ch1c
+2ch1d
+2ch1f
+2ch1g
+2ch1k
+2ch1m
+2ch1n
+2ch1p
+2ch1s
+2ch1t
+2ch1z
+2cz1ć
+2cz1ń
+2cz1ś
+2cz1ź
+2cz1ż
+2cz1b
+2cz1c
+2cz1d
+2cz1f
+2cz1g
+2cz1k
+2cz1l
+2cz1m
+2cz1n
+2cz1p
+2cz1s
+2cz1t
+2cz1z
+2dłb
+2dłsz
+2dź1ć
+2dź1ń
+2dź1ś
+2dź1ź
+2dź1ż
+2dź1b
+2dź1c
+2dź1d
+2dź1f
+2dź1g
+2dź1k
+2dź1m
+2dź1n
+2dź1p
+2dź1s
+2dź1t
+2dź1z
+2dż1ć
+2dż1ń
+2dż1ś
+2dż1ź
+2dż1ż
+2dż1b
+2dż1c
+2dż1d
+2dż1f
+2dż1g
+2dż1k
+2dż1m
+2dż1n
+2dż1p
+2dż1s
+2dż1t
+2dż1z
+2d1ć
+2d1ń
+2d1ś
+2d1b
+2d1c
+2d1f
+2d1g
+2d1k
+2d1m
+2d1n
+2d1p
+2d1s
+2d1t
+2drn
+2dz1ć
+2dz1ń
+2dz1ś
+2dz1ź
+2dz1ż
+2dz1b
+2dz1c
+2dz1d
+2dz1f
+2dz1g
+2dz1k
+2dz1l
+2dz1m
+2dz1n
+2dz1p
+2dz1s
+2dz1t
+2dz1z
+2f1c
+2f1k
+2f1m
+2f1n
+2głb
+2g1ć
+2g1ń
+2g1ś
+2g1ź
+2g1ż
+2g1b
+2g1c
+2g1d
+2g1f
+2g1k
+2g1m
+2g1p
+2g1s
+2g1t
+2g1z
+2h1ć
+2h1ł
+2h1ń
+2h1ś
+2h1ź
+2h1ż
+2h1b
+2h1c
+2h1d
+2h1f
+2h1g
+2h1j
+2h1k
+2h1l
+2h1m
+2h1n
+2h1p
+2h1r
+2h1s
+2h1t
+2h1w
+2h1z
+2j1ć
+2j1ł
+2j1ń
+2j1ś
+2j1ź
+2j1ż
+2j1b
+2j1c
+2j1d
+2j1f
+2j1g
+2j1h
+2j1k
+2j1l
+2j1m
+2j1n
+2j1p
+2j1r
+2j1s
+2j1t
+2j1w
+2j1z
+2kłb
+2k1ć
+2k1ń
+2k1ś
+2k1ź
+2k1ż
+2k1b
+2k1c
+2k1d
+2k1f
+2k1g
+2k1m
+2k1n
+2k1p
+2k1s
+2k1sz
+2k1t
+2k1z
+2l1ć
+2l1ł
+2l1ń
+2l1ś
+2l1ź
+2l1ż
+2l1b
+2l1c
+2l1d
+2l1f
+2l1g
+2l1h
+2l1j
+2l1k
+2l1m
+2l1n
+2l1p
+2l1r
+2l1s
+2l1t
+2l1w
+2l1z
+2m1ć
+2m1ł
+2m1ń
+2m1ś
+2m1ź
+2m1ż
+2m1b
+2m1c
+2m1d
+2m1f
+2m1g
+2m1h
+2m1j
+2m1k
+2m1l
+2m1n
+2m1p
+2m1r
+2m1s
+2m1t
+2m1w
+2m1z
+2n1ć
+2n1ł
+2n1ń
+2n1ś
+2n1ź
+2n1ż
+2n1b
+2n1c
+2n1d
+2n1f
+2n1g
+2n1h
+2n1j
+2n1k
+2n1l
+2n1m
+2n1p
+2n1r
+2n1s
+2n1t
+2n1w
+2n1z
+2ntn
+2p1ć
+2p1ń
+2p1ś
+2p1ź
+2p1ż
+2p1b
+2p1c
+2p1d
+2p1f
+2p1g
+2p1k
+2p1m
+2p1n
+2p1s
+2p1sz
+2p1t
+2p1z
+2pln
+2r1ć
+2r1ł
+2r1ń
+2r1ś
+2r1ź
+2r1ż
+2r1b
+2r1c
+2r1d
+2r1f
+2r1g
+2r1h
+2r1j
+2r1k
+2r1l
+2r1m
+2r1n
+2r1p
+2r1s
+2r1t
+2r1w
+2rz1ć
+2rz1ł
+2rz1ń
+2rz1ś
+2rz1ź
+2rz1ż
+2rz1b
+2rz1c
+2rz1d
+2rz1f
+2rz1g
+2rz1h
+2rz1j
+2rz1k
+2rz1l
+2rz1m
+2rz1n
+2rz1p
+2rz1r
+2rz1s
+2rz1t
+2rz1w
+2słb
+2s1ź
+2s1ż
+2s1b
+2s1d
+2s1f
+2s1g
+2s1s
+2snk
+2stk
+2stn
+2stsz
+2sz1ć
+2sz1ś
+2sz1c
+2sz1f
+2sz1k
+2sz1l
+2sz1m
+2sz1n
+2sz1p
+2sz1s
+2sz1t
+2sz1w
+2sz1z
+2szln
+2t1ć
+2t1ń
+2t1ś
+2t1ź
+2t1ż
+2t1b
+2t1c
+2t1d
+2t1f
+2t1g
+2t1k
+2t1m
+2t1n
+2t1p
+2t1s
+2t1z
+2tln
+2trk
+2trzn
+2w1ć
+2w1ł
+2w1ń
+2w1ś
+2w1ź
+2w1ż
+2w1b
+2w1c
+2w1d
+2w1f
+2w1g
+2w1j
+2w1k
+2w1l
+2w1m
+2w1n
+2w1p
+2w1r
+2w1s
+2w1t
+2w1z
+2z1ć
+2z1ś
+2z1c
+2z1d
+2z1f
+2z1k
+2z1p
+2z1s
+2z1t
+2zdk
+2zdn
+3d2niow
+3k2sz2t
+3m2k2n
+3m2nest
+3m2nezj
+3m2sk2n
+3p2neu
+3w2ład
+3w2łos
+3w2czas
+4ć3ć
+4ł3ł
+4ź3ź
+4ż3ż
+4b3b
+4c3c
+4d3d
+4f3f
+4g3g
+4h3h
+4j3j
+4k3k
+4l3l
+4m3m
+4n3n
+4p3p
+4r3r
+4t3t
+4w3w
+4z3z
+8ć.
+8ćć.
+8ćł.
+8ćń.
+8ćś.
+8ćź.
+8ćż.
+8ćb.
+8ćc.
+8ćd.
+8ćf.
+8ćg.
+8ćh.
+8ćj.
+8ćk.
+8ćl.
+8ćm.
+8ćn.
+8ćp.
+8ćr.
+8ćs.
+8ćt.
+8ćv.
+8ćw.
+8ćx.
+8ćz.
+8ł.
+8łć.
+8łł.
+8łń.
+8łś.
+8łź.
+8łż.
+8łb.
+8łc.
+8łd.
+8łf.
+8łg.
+8łh.
+8łj.
+8łk.
+8łl.
+8łm.
+8łn.
+8łp.
+8łr.
+8łs.
+8łt.
+8łv.
+8łw.
+8łx.
+8łz.
+8ń.
+8ńć.
+8ńł.
+8ńń.
+8ńś.
+8ńź.
+8ńż.
+8ńb.
+8ńc.
+8ńd.
+8ńf.
+8ńg.
+8ńh.
+8ńj.
+8ńk.
+8ńl.
+8ńm.
+8ńn.
+8ńp.
+8ńr.
+8ńs.
+8ńt.
+8ńv.
+8ńw.
+8ńx.
+8ńz.
+8ś.
+8ść.
+8śł.
+8śń.
+8śś.
+8śź.
+8śż.
+8śb.
+8śc.
+8śd.
+8śf.
+8śg.
+8śh.
+8śj.
+8śk.
+8śl.
+8śm.
+8śn.
+8śp.
+8śr.
+8śs.
+8śt.
+8śv.
+8św.
+8śx.
+8śz.
+8ź.
+8źć.
+8źł.
+8źń.
+8źś.
+8źź.
+8źż.
+8źb.
+8źc.
+8źd.
+8źf.
+8źg.
+8źh.
+8źj.
+8źk.
+8źl.
+8źm.
+8źn.
+8źp.
+8źr.
+8źs.
+8źt.
+8źv.
+8źw.
+8źx.
+8źz.
+8ż.
+8żć.
+8żł.
+8żń.
+8żś.
+8żź.
+8żż.
+8żb.
+8żc.
+8żd.
+8żf.
+8żg.
+8żh.
+8żj.
+8żk.
+8żl.
+8żm.
+8żn.
+8żp.
+8żr.
+8żs.
+8żt.
+8żv.
+8żw.
+8żx.
+8żz.
+8b.
+8bć.
+8bł.
+8bń.
+8bś.
+8bź.
+8bż.
+8bb.
+8bc.
+8bd.
+8bf.
+8bg.
+8bh.
+8bj.
+8bk.
+8bl.
+8bm.
+8bn.
+8bp.
+8br.
+8brz.
+8bs.
+8bt.
+8bv.
+8bw.
+8bx.
+8bz.
+8c.
+8cć.
+8cł.
+8cń.
+8cś.
+8cź.
+8cż.
+8cb.
+8cc.
+8cd.
+8cf.
+8cg.
+8ch.
+8chł.
+8chrz.
+8chw.
+8cj.
+8ck.
+8cl.
+8cm.
+8cn.
+8cp.
+8cr.
+8cs.
+8ct.
+8cv.
+8cw.
+8cx.
+8cz.
+8czt.
+8d.
+8dć.
+8dł.
+8dń.
+8dś.
+8dź.
+8dż.
+8db.
+8dc.
+8dd.
+8df.
+8dg.
+8dh.
+8dj.
+8dk.
+8dl.
+8dm.
+8dn.
+8dp.
+8dr.
+8drz.
+8ds.
+8dt.
+8dv.
+8dw.
+8dx.
+8dz.
+8f.
+8fć.
+8fł.
+8fń.
+8fś.
+8fź.
+8fż.
+8fb.
+8fc.
+8fd.
+8ff.
+8fg.
+8fh.
+8fj.
+8fk.
+8fl.
+8fm.
+8fn.
+8fp.
+8fr.
+8fs.
+8ft.
+8fv.
+8fw.
+8fx.
+8fz.
+8g.
+8gć.
+8gł.
+8gń.
+8gś.
+8gź.
+8gż.
+8gb.
+8gc.
+8gd.
+8gf.
+8gg.
+8gh.
+8gj.
+8gk.
+8gl.
+8gm.
+8gn.
+8gp.
+8gr.
+8gs.
+8gt.
+8gv.
+8gw.
+8gx.
+8gz.
+8h.
+8hć.
+8hł.
+8hń.
+8hś.
+8hź.
+8hż.
+8hb.
+8hc.
+8hd.
+8hf.
+8hg.
+8hh.
+8hj.
+8hk.
+8hl.
+8hm.
+8hn.
+8hp.
+8hr.
+8hs.
+8ht.
+8hv.
+8hw.
+8hx.
+8hz.
+8j.
+8jć.
+8jł.
+8jń.
+8jś.
+8jź.
+8jż.
+8jb.
+8jc.
+8jd.
+8jf.
+8jg.
+8jh.
+8jj.
+8jk.
+8jl.
+8jm.
+8jn.
+8jp.
+8jr.
+8js.
+8jt.
+8jv.
+8jw.
+8jx.
+8jz.
+8k.
+8kć.
+8kł.
+8kń.
+8kś.
+8kź.
+8kż.
+8kb.
+8kc.
+8kd.
+8kf.
+8kg.
+8kh.
+8kj.
+8kk.
+8kl.
+8km.
+8kn.
+8kp.
+8kr.
+8ks.
+8kst.
+8kt.
+8kv.
+8kw.
+8kx.
+8kz.
+8l.
+8lć.
+8lł.
+8lń.
+8lś.
+8lź.
+8lż.
+8lb.
+8lc.
+8ld.
+8lf.
+8lg.
+8lh.
+8lj.
+8lk.
+8ll.
+8lm.
+8ln.
+8lp.
+8lr.
+8ls.
+8lt.
+8lv.
+8lw.
+8lx.
+8lz.
+8m.
+8mć.
+8mł.
+8mń.
+8mś.
+8mź.
+8mż.
+8mb.
+8mc.
+8md.
+8mf.
+8mg.
+8mh.
+8mj.
+8mk.
+8ml.
+8mm.
+8mn.
+8mp.
+8mr.
+8ms.
+8mst.
+8mt.
+8mv.
+8mw.
+8mx.
+8mz.
+8n.
+8nć.
+8nł.
+8nń.
+8nś.
+8nź.
+8nż.
+8nb.
+8nc.
+8nd.
+8nf.
+8ng.
+8nh.
+8nj.
+8nk.
+8nl.
+8nm.
+8nn.
+8np.
+8nr.
+8ns.
+8nt.
+8nv.
+8nw.
+8nx.
+8nz.
+8p.
+8pć.
+8pł.
+8pń.
+8pś.
+8pź.
+8pż.
+8pb.
+8pc.
+8pd.
+8pf.
+8pg.
+8ph.
+8pj.
+8pk.
+8pl.
+8pm.
+8pn.
+8pp.
+8pr.
+8prz.
+8ps.
+8pt.
+8pv.
+8pw.
+8px.
+8pz.
+8r.
+8rć.
+8rł.
+8rń.
+8rś.
+8rź.
+8rż.
+8rb.
+8rc.
+8rd.
+8rf.
+8rg.
+8rh.
+8rj.
+8rk.
+8rl.
+8rm.
+8rn.
+8rp.
+8rr.
+8rs.
+8rsz.
+8rt.
+8rv.
+8rw.
+8rx.
+8rz.
+8rzł.
+8s.
+8sć.
+8sł.
+8sń.
+8sś.
+8sź.
+8sż.
+8sb.
+8sc.
+8sch.
+8sd.
+8sf.
+8sg.
+8sh.
+8sj.
+8sk.
+8skrz.
+8sl.
+8sm.
+8sn.
+8sp.
+8sr.
+8ss.
+8st.
+8str.
+8strz.
+8stw.
+8sv.
+8sw.
+8sx.
+8sz.
+8szcz.
+8szczb.
+8szk.
+8szn.
+8szt.
+8sztr.
+8t.
+8tć.
+8tł.
+8tń.
+8tś.
+8tź.
+8tż.
+8tb.
+8tc.
+8td.
+8tf.
+8tg.
+8th.
+8tj.
+8tk.
+8tl.
+8tm.
+8tn.
+8tp.
+8tr.
+8trz.
+8ts.
+8tt.
+8tv.
+8tw.
+8tx.
+8tz.
+8v.
+8vć.
+8vł.
+8vń.
+8vś.
+8vź.
+8vż.
+8vb.
+8vc.
+8vd.
+8vf.
+8vg.
+8vh.
+8vj.
+8vk.
+8vl.
+8vm.
+8vn.
+8vp.
+8vr.
+8vs.
+8vt.
+8vv.
+8vw.
+8vx.
+8vz.
+8w.
+8wć.
+8wł.
+8wń.
+8wś.
+8wź.
+8wż.
+8wb.
+8wc.
+8wd.
+8wf.
+8wg.
+8wh.
+8wj.
+8wk.
+8wl.
+8wm.
+8wn.
+8wp.
+8wr.
+8ws.
+8wt.
+8wv.
+8ww.
+8wx.
+8wz.
+8x.
+8xć.
+8xł.
+8xń.
+8xś.
+8xź.
+8xż.
+8xb.
+8xc.
+8xd.
+8xf.
+8xg.
+8xh.
+8xj.
+8xk.
+8xl.
+8xm.
+8xn.
+8xp.
+8xr.
+8xs.
+8xt.
+8xv.
+8xw.
+8xx.
+8xz.
+8z.
+8zć.
+8zł.
+8zń.
+8zś.
+8zź.
+8zż.
+8zb.
+8zc.
+8zd.
+8zdr.
+8zdrz.
+8zf.
+8zg.
+8zh.
+8zj.
+8zk.
+8zl.
+8zm.
+8zn.
+8zp.
+8zr.
+8zs.
+8zt.
+8zv.
+8zw.
+8zx.
+8zz.
+a1
+a2u
+a2y
+aa2
+ae2
+ai2
+ao2
+be2eth
+be2f3sz2
+be2k1hend
+bi2n3o2ku
+bi2sz3kop
+bi2z3ne2s3m
+bi2z3nes
+birmin2g1ham
+blo2k1hauz
+bo2s3ma
+br2d
+bro2a2d3way
+bu2sz3me
+buk2sz3pan
+busine2ss3m
+busines2s
+c4h
+c4z
+cal2d1well
+ch2ł
+ch2j
+ch2l
+ch2r
+ch2w
+chus1t
+cu2r7zon
+dż2ł
+dż2j
+dż2l
+dż2r
+dż2w
+dże4z3b
+dże4z3m
+d4ź
+d4ż
+d4z
+deut4sch3land
+drz2w
+du2sz3past
+e1
+e2r5zac
+e2u
+e2y
+e3u2sz
+ea2
+ee2
+ei2
+eo2
+fi2s3harm
+fi2sz3bin
+fo2k2s3t
+fo2r5zac
+fol2k1lor
+fos2f1a2zot
+ga3d2get
+gado3p2ta
+gol2f3s
+golfsz2
+gran2d1ilo
+gro4t3r
+hi2sz3p
+hu2cz1w
+hu2x3ley
+i1
+i2ą
+i2ę
+i2ó
+i2a
+i2e
+i2i
+i2o
+i2u
+i2y
+in4nsbruck
+in4sbruc
+j2t1ł
+j2t1r
+ja4z4z3b
+ja4z4z3m
+karl2s1kron
+karl2s1ruhe
+kir2chhoff
+kongre2s3m
+led1w
+lu2ft3waffe
+lu2ks1fer
+ly2o
+ma2r5zł
+ma2r5zl
+ma2r5zn
+mi2sz1masz
+mie2r5zł
+mie2r5zi
+mon2t3real
+moza2i3k
+mu2r7zasich3l
+na4ł3kows
+na4r3v
+o1
+o2y
+oa2
+och3mistrz
+oe2
+of2f3set
+oi2
+oo2
+ou2
+pa2n3a2mer
+pa2s3cal
+pa2s3ch
+połu3d2ni
+po3d4nieprz
+po3m2ną
+po3m2nę
+po3m2ni
+po4rt2s3mo2uth
+po4rt3land
+poli3e2t
+poli3u2re
+powsze3d2ni
+pr2chal
+pre2sz3pa
+r4z
+ro2e3nt2gen
+ro2k3rocz
+ro2s3to3c2k
+s4z
+se2t3le
+sko2r5zoner
+sm2r
+sowi3z2
+sy2n3opt
+sy2s1tem
+sza2sz1ły
+sze2z1long
+sze4ść
+szto2k1holm
+szyn2k1was
+to3y2o3t
+turboo2d3rzut
+tygo3d2ni
+u1
+u2y
+ua2
+ue2
+ui2
+uo2
+uu2
+vo2lk2s3
+we2e2k1end
+we4st3f
+we4st3m
+y1
+ya2
+ye2
+yi2
+yo2
+yu2
+ze4p3p} \ No newline at end of file
diff --git a/tex/context/patterns/lang-pl.rme b/tex/context/patterns/lang-pl.rme
new file mode 100644
index 000000000..35641d3a4
--- /dev/null
+++ b/tex/context/patterns/lang-pl.rme
@@ -0,0 +1,88 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: plhyph.tex (1995-06-26)
+% Author: Hanna Kołodziejska, Bogusław Jackowski, Marek Ryćko
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% This is PLHYPH.TeX - the Polish hyphenation patterns
+% version 3.0a, Wednesday, May 17th, 1995
+% to be used for the inclusion of Polish hyphenation patterns in any format,
+% not necessarily in the MeX or LaMeX ones. The patterns are exactly
+% the same as in the version 3.0 being the part of the MeX package,
+% only the surrounding of the \pattern command is changed. The authors
+% claim the upward compatibility, i.e., the version 3.0a can also be used
+% with the MeX or LaMeX formats.
+
+% The history of development of the Polish hyphenation patterns:
+%
+% The first version of the patterns was developed
+% by Hanna Kołodziejska (1987).
+%
+% The adaptation to the LeX format (see below) and extensive modification
+% were done by Bogusław Jackowski & Marek Ryćko (1987--1989).
+%
+% The hyphenation rules were further improved and adapted to the
+% TeX 3.x requirements by Hanna Kołodziejska (1991).
+%
+% Lone-standing version (3.0a) of patterns was prepared (under pressure
+% from LaTeX users) by Bogusław Jackowski and Marek Ryćko, following
+% Mariusz Olko's suggestions, 1995.
+
+% The LeX format mentioned above was the first version of the adaptation
+% of TeX to the Polish language. The next version is called MeX.
diff --git a/tex/context/patterns/lang-pt.hyp b/tex/context/patterns/lang-pt.hyp
new file mode 100644
index 000000000..083b38298
--- /dev/null
+++ b/tex/context/patterns/lang-pt.hyp
@@ -0,0 +1,9 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-pt.rme
+
+% used: a d e f h o r s t w
+
+\hyphenation{
+hard-ware
+soft-ware} \ No newline at end of file
diff --git a/tex/context/patterns/lang-pt.pat b/tex/context/patterns/lang-pt.pat
new file mode 100644
index 000000000..dbf617830
--- /dev/null
+++ b/tex/context/patterns/lang-pt.pat
@@ -0,0 +1,313 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-pt.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x z á â ã ç é ê í ó ô õ ú
+
+\patterns{
+1b2l
+1b2r
+1ba
+1be
+1bi
+1bo
+1bu
+1bá
+1bâ
+1bã
+1bé
+1bí
+1bó
+1bú
+1bê
+1bõ
+1c2h
+1c2l
+1c2r
+1ca
+1ce
+1ci
+1co
+1cu
+1cá
+1câ
+1cã
+1cé
+1cí
+1có
+1cú
+1cê
+1cõ
+1ça
+1çe
+1çi
+1ço
+1çu
+1çá
+1çâ
+1çã
+1çé
+1çí
+1çó
+1çú
+1çê
+1çõ
+1d2l
+1d2r
+1da
+1de
+1di
+1do
+1du
+1dá
+1dâ
+1dã
+1dé
+1dí
+1dó
+1dú
+1dê
+1dõ
+1f2l
+1f2r
+1fa
+1fe
+1fi
+1fo
+1fu
+1fá
+1fâ
+1fã
+1fé
+1fí
+1fó
+1fú
+1fê
+1fõ
+1g2l
+1g2r
+1ga
+1ge
+1gi
+1go
+1gu
+1gu4a
+1gu4e
+1gu4i
+1gu4o
+1gá
+1gâ
+1gã
+1gé
+1gí
+1gó
+1gú
+1gê
+1gõ
+1ja
+1je
+1ji
+1jo
+1ju
+1já
+1jâ
+1jã
+1jé
+1jí
+1jó
+1jú
+1jê
+1jõ
+1k2l
+1k2r
+1ka
+1ke
+1ki
+1ko
+1ku
+1ká
+1kâ
+1kã
+1ké
+1kí
+1kó
+1kú
+1kê
+1kõ
+1l2h
+1la
+1le
+1li
+1lo
+1lu
+1lá
+1lâ
+1lã
+1lé
+1lí
+1ló
+1lú
+1lê
+1lõ
+1ma
+1me
+1mi
+1mo
+1mu
+1má
+1mâ
+1mã
+1mé
+1mí
+1mó
+1mú
+1mê
+1mõ
+1n2h
+1na
+1ne
+1ni
+1no
+1nu
+1ná
+1nâ
+1nã
+1né
+1ní
+1nó
+1nú
+1nê
+1nõ
+1p2l
+1p2r
+1pa
+1pe
+1pi
+1po
+1pu
+1pá
+1pâ
+1pã
+1pé
+1pí
+1pó
+1pú
+1pê
+1põ
+1qu4a
+1qu4e
+1qu4i
+1qu4o
+1ra
+1re
+1ri
+1ro
+1ru
+1rá
+1râ
+1rã
+1ré
+1rí
+1ró
+1rú
+1rê
+1rõ
+1sa
+1se
+1si
+1so
+1su
+1sá
+1sâ
+1sã
+1sé
+1sí
+1só
+1sú
+1sê
+1sõ
+1t2l
+1t2r
+1ta
+1te
+1ti
+1to
+1tu
+1tá
+1tâ
+1tã
+1té
+1tí
+1tó
+1tú
+1tê
+1tõ
+1v2l
+1v2r
+1va
+1ve
+1vi
+1vo
+1vu
+1vá
+1vâ
+1vã
+1vé
+1ví
+1vó
+1vú
+1vê
+1võ
+1w2l
+1w2r
+1xa
+1xe
+1xi
+1xo
+1xu
+1xá
+1xâ
+1xã
+1xé
+1xí
+1xó
+1xú
+1xê
+1xõ
+1za
+1ze
+1zi
+1zo
+1zu
+1zá
+1zâ
+1zã
+1zé
+1zí
+1zó
+1zú
+1zê
+1zõ
+a3a
+a3e
+a3o
+c3c
+e3a
+e3e
+e3o
+i3a
+i3e
+i3i
+i3o
+i3â
+i3ê
+i3ô
+o3a
+o3e
+o3o
+r3r
+s3s
+u3a
+u3e
+u3o
+u3u} \ No newline at end of file
diff --git a/tex/context/patterns/lang-pt.rme b/tex/context/patterns/lang-pt.rme
new file mode 100644
index 000000000..ed3602f04
--- /dev/null
+++ b/tex/context/patterns/lang-pt.rme
@@ -0,0 +1,86 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: pthyph.tex (1994-10-13 - date on CTAN) or (1996-07-21 - date in file) - no idea
+% Author: Pedro J. de Rezende <rezende at dcc.unicamp.br>, J.Joao Dias Almeida <jj at di.uminho.pt>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The Portuguese TeX hyphenation table.
+% (C) 1996 by Pedro J. de Rezende (rezende@dcc.unicamp.br)
+% and J.Joao Dias Almeida (jj@di.uminho.pt)
+% Version: 1.2 Release date: 21/07/96
+%
+% (C) 1994 by Pedro J. de Rezende (rezende@dcc.unicamp.br)
+% Version: 1.1 Release date: 04/12/94
+%
+% (C) 1987 by Pedro J. de Rezende
+% Version: 1.0 Release date: 02/13/87
+%
+% -----------------------------------------------------------------
+% IMPORTANT NOTICE:
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+% -----------------------------------------------------------------
+% Remember! If you *must* change it, then call the resulting file
+% something else and attach your name to your *documented* changes.
+% ======================================================================
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-ro.hyp b/tex/context/patterns/lang-ro.hyp
new file mode 100644
index 000000000..33982f8cf
--- /dev/null
+++ b/tex/context/patterns/lang-ro.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-ro.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-ro.pat b/tex/context/patterns/lang-ro.pat
new file mode 100644
index 000000000..8c6b6a460
--- /dev/null
+++ b/tex/context/patterns/lang-ro.pat
@@ -0,0 +1,654 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-ro.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v x z î ă ș ț
+
+\patterns{
+.a3ic
+.a4n3is
+.a2z
+.cre1
+.de2aj
+.de2z1
+.g4
+.i2a
+.i2e
+.i3ț
+.i4u3
+.i3v
+.î4m
+.n2
+.ni2
+.p4
+.pre3ș
+.s4
+.ș4
+.u4i
+.u5ni
+.z2
+a1
+2acă
+achi5
+a3e
+afo3
+a3i2a
+a3i2e
+a3il
+ai3s2
+a3iu
+alie6
+2alt
+a2m
+a2n
+2an.
+a5n2e
+ani2e
+ani3ș4
+an4s
+2anu
+an2z
+ao2g
+ati4a
+2atr
+a5t4u
+2ața
+2ață
+2au
+a3ua
+a3ud
+a3ug
+a3ul
+a3un
+a3ur
+a3us
+a3ute
+a3u2ț
+a3uz
+2ă1
+ă3i
+ăi2e
+ă2m2
+ănu3
+ărgi5
+ă3ș
+ă4ș3t
+ă2ti.
+ăti4e
+ă3u
+ă3v
+ă2zi
+1b
+2b.
+ba2ț
+bănu5
+2bc
+2bd
+bi2a.
+bi2at
+bi2e
+3bii
+b2l
+3b4lim
+b4lu
+bo1
+bo3ric
+2bs
+2bt
+2bț
+bți4ne.
+bu3
+1c
+4c.
+ca3ut
+că2c
+cătu5
+2cc
+ce2a
+ce2ț
+2chi.
+2ci.
+ci3ale
+ci2o
+cis2
+ci3sp
+ciza2
+c4l
+2cm
+2c5n
+copia2tă
+co2ț
+2cs
+2ct
+2cț
+cu3im
+3cul
+cu2ț
+2cv
+1d
+4d.
+da4m
+da2ț
+2dc
+de4sc
+dez3in
+di2an
+dia2tă
+2dj
+2dm
+2d1n
+do4il
+3du
+e1ac
+e1aj
+e1al
+e1aș
+e1at
+ea2ț
+e1av
+ebu5i
+2ec
+eci2a
+ecla2re
+edi4ulu
+e3e
+ee2a
+1efa
+e1h
+e3i2a
+e3i2e
+e3ii
+e3il
+e3im
+e3in
+e3i2o
+e3i3s2
+e3it
+e3i4u
+e1î
+2el
+e2m
+emon5
+2en
+e5ne
+e1o1
+e3on
+e1r
+2era
+2eră
+2erc
+2e2s
+es3co
+es5ti
+2eș
+e3și
+etan4ț
+2eț
+e3u
+eu5ș
+1evit
+e2x
+2ez
+eză5
+ezi3a
+e2z1o
+1f4
+2f.
+3fa
+3făș
+2fi.
+fi3e
+3fo
+2ft
+f5tu
+1g2
+2g.
+gă3ț
+2ghi.
+2gi.
+g4l
+2g3m
+2g3n
+go5n
+3gu3
+2g3v
+2h.
+2hi.
+hi2a
+hi3c
+hi4u
+2h1n
+2i1
+4i.
+3i2ac
+ia3g4
+i2ai
+i2aș
+ia2ț
+i3că
+i2ed
+i3ia
+i3ie
+i3ii
+i3il
+i3in
+i3ir
+i3it
+iitu2ră
+i2î
+4ila
+i3le
+i3lo
+imateri6
+i2n
+i4n1ed
+in2gă
+inți4i
+3inv
+i3od
+i3oni
+io2ț
+ipă5
+i2s
+is3f
+4isp
+iș3t
+i5ti
+iți2a
+i3ți2o
+i3ua
+i3ul
+i3um
+i3und
+i3unu
+i3us
+i3ut
+iz3v
+î2
+î3d
+î3e
+î3lo
+îna3
+în5ș
+î3ri
+î3rî
+îr5ș
+îș3t
+î3t
+î4ti
+î3ț
+î4ți
+î5ții
+î3z
+1j
+2j.
+2jd
+2ji.
+ji2ț
+2jl
+j4u
+ju3t
+1k
+1l
+4l.
+larați2
+lă2ti
+lătu5
+2lb
+2lc
+2ld
+le2a
+2lf
+2lg
+4li.
+li3a
+li3e
+li3o
+2lm
+2l5n
+2lp
+2ls
+2l3ș
+2lt
+2lț
+3lu
+2lv
+1m
+2m.
+3ma
+3mă
+2mb
+mblîn3
+3me
+me2z
+2mf
+3mi
+4mi.
+mi2ț
+3mî
+2m1n
+3mo
+mon4
+2mp
+2m3s2
+2mt
+2mț
+3mu
+mu2ț
+2mv
+4n.
+3na
+4n1ad
+na3in
+3nă
+2nc
+n2cis
+n2ciz
+2nd
+3ne
+ne1ab
+ne1an
+ne1ap
+4nef
+4n1eg
+ne3s2
+4nevi
+4n1ex
+2ng
+ng3ăt
+3ni
+4ni.
+ni3ez
+3nî
+n3j
+n1n
+3no
+no4ș
+n1r
+2n3s2
+ns3f
+n4sî
+ns3po
+n3ș2
+n4și
+2nt
+n5ti
+n5t4u
+2nț
+5nu
+nu3a
+nu3ă
+nu5m
+nu3s2
+2nz
+o1ag
+o2al
+o2bi.
+2oca
+ocu5i
+2od
+odi2a
+o3e
+o3i2
+oiecti2
+oi3s2p
+omedi2e.
+om4n
+2on
+o1o
+opi3e
+opla2
+oplagi2
+o1ra
+o1ră
+or2c
+o1re
+o1ri
+o2ric
+o1rî
+o1ro
+or2te.
+o1ru
+os5ti
+o3și
+otați4
+o5ti
+ot3od
+o3u
+1p2
+2p.
+3pa
+păr3ț
+2p3c
+pecți2
+pe2ț
+2pi.
+pi2e
+pi3e.
+pi3ez
+pi3o
+pi2ț
+pi2z
+p4l
+po4ș
+po2ț
+2p3s
+2p3ș
+2p3t
+2p3ț
+p4ți.
+pu3b4
+puri2e
+pu4ș
+4r.
+2rb
+2rc
+2rd
+r2e
+re2bi
+recizi2
+re3s2cr
+re4și
+2rf
+2rg
+2r1h
+4ri.
+ri3a
+ri4ali
+ri3eț
+ri3ez
+ri5mi
+2ri3un
+ri3v
+2rk
+2rl
+2rm
+2r1n
+rna2ț
+rografi6
+2rp
+2r1r
+2rs2
+r3sp
+r3st
+2r3ș
+2rt
+rtua2le
+2rț
+ru3il
+ru3sp
+2rv
+2rz
+1s
+4s.
+5sa
+5să
+să4m
+să4ș
+2sc
+4sc.
+3s2co
+3se
+se2a
+se4e.
+ses2
+se3sp
+se4ș
+4s2f
+5sfî
+3si
+si3p
+3sî
+3s4l
+4sm
+s1n
+3so
+so3ric
+2sp
+2st
+sto3
+5su
+su2ț
+2ș
+4ș.
+3șa
+șa2ț
+3șă2
+3șe
+1și
+4și.
+5șii
+5șil
+3șin
+3șî
+4ș5n
+șnu5
+3șo
+ș2p
+ș2ti
+4ști.
+4ș3tr
+3șu
+1t2
+4t.
+ta3ut
+2t3c
+2t3d
+te2a
+te5ni
+teri6ală
+te3s2p
+2t3f
+4ti.
+ti3a
+ti3e
+3tii.
+3til
+3tin
+ti2ț
+2tî.
+t4l
+2t3m
+3tol
+3tor
+to2to
+3tru.
+3trul
+3truo
+4t3s2
+2t3t
+tu3a
+tu3im
+4t3un
+tu4ș
+4t3z
+1ț
+2ț.
+3ța
+3ță
+țe2ț
+2ți.
+3ția
+ți3a.
+3ție
+3ții
+3țil
+ți2ț
+3țiu
+țu3
+țu5i
+2u1
+6u.
+u2a.
+u2ad
+u3au
+uă3
+uăs2
+u2bia
+u2b3l
+u2b1o
+ub3s2
+u3e
+4ugu
+u3i2a
+u3i2e
+u3in
+u3ir
+u3is
+u3it
+u3i2ț
+u3iz
+u2l
+u3la
+u3lă
+u3le
+u3lii
+u3lî
+u3lo
+umi5r
+ur2z
+u2s
+us2pr
+u4st
+u3ș
+u4șt
+u2to
+3utor
+u3ui
+u3um
+1v
+2v.
+ve5ni
+ve2ț
+ve2z
+2vi.
+vi2ț
+2v1n
+vorbito2
+3vr
+1x
+2x.
+3xa
+3xă
+3xe
+xe2z
+3xi
+3xo
+3xu
+1z
+2z.
+za2ț
+2zb
+2z2g
+2zi.
+zi2an
+zi2ar
+3zii
+3zil
+z4m
+2z1n
+3z2ol
+3zon
+zu2ț
+2z2v
+z3vă} \ No newline at end of file
diff --git a/tex/context/patterns/lang-ro.rme b/tex/context/patterns/lang-ro.rme
new file mode 100644
index 000000000..577239236
--- /dev/null
+++ b/tex/context/patterns/lang-ro.rme
@@ -0,0 +1,110 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: rohyphen.tex (1996-11-11)
+% Author: drian Rezus <adriaan at {sci,cs}.kun.nl>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% ROHYPHEN.TEX, version 1.1 <29.10.1996> R [7.11.1996] %%
+%% (C) 1995-1996 Adrian Rezus [adriaan@{sci,cs}.kun.nl] %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Romanian TeX hyphenation table: NFSS 2 encoding, medium.
+%% Contents: 647 Romanian hyphen patterns, with diacritics.
+%%
+%% This file is part of the Romanian TeX system.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Romanian TeX, version 1.3R <29.10.1996> %%
+%% (C) 1994-1996 Adrian Rezus %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% History:
+%% ROHYPHEN.TEX 1.0 <10.02.1995>: Plain TeX and LaTeX 2.09.
+%% ROHYPHEN.TEX 1.1 <29.10.1996>: Plain TeX and LaTeX2e.
+%
+% -------------------------------------------------------------------
+
+% TODO: fix the notice below - it only holds for the old patterns
+
+% NB This file must be used in conjunction with either one of
+%
+% (1) ROMANIAN.TEX v1.2(R) [1994-1995] [(La)TeX] or
+% (2) ROMANIAN.STY v1.3R [1996] [(La)TeX(2e)]
+%
+% NB Romanian has LR-HYPHEN-MINs [2 2] (like German)!
+% NB Romanian has STRUCTURAL HYPHEN-AMBIGUA:
+% i.e., words that canNOT be hyphenated correctly without
+% additional (e.g., semantic, stress-mark) information.
+% --------------------------------------------------------
+% The Romanian TeX encoding of the Romanian diacritics:
+% --------------------------------------------------------
+% Romanian TeX DQ-macro encodings = (La)TeX macros
+% --------------------------------------------------------
+% ă = \u{a} [-] \u{A} [not encoded]
+% â = \^{a} [-] \^{A} [not encoded]
+% î = \^{\i} "I = \^{I}
+% ș = \c{s} "S = \c{S}
+% ț = \c{t} "T = \c{T}
+% -------------------------------------------------------------
+% NB Romanian \^{a} behaves like \^{\i} as regards hyphenation.
+% NB The capital \u{A} and \^{A} are rare in script; as such,
+% they occur only in records of the Romanian substandard.
+% -------------------------------------------------------------------
+%
+% original patterns generated by PatGen2-output hyphen-level 9: do NOT modify the list by hand!
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-ru.hyp b/tex/context/patterns/lang-ru.hyp
new file mode 100644
index 000000000..0e5852ed4
--- /dev/null
+++ b/tex/context/patterns/lang-ru.hyp
@@ -0,0 +1,191 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-ru.rme
+
+% used: а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ы ь э ю я
+
+\hyphenation{
+ас-бест
+бездн
+биз-нес-мен
+буй-нак-ске
+вбли-зи
+взба-ла-муть-ся
+вздрем-нешь
+во-до-сли-вом
+волж-ске
+воп-лем
+вопль
+вост-ра
+во-ткать
+во-ткем
+во-ткешь
+во-тку
+во-ткут
+впол-обо-ро-та
+впол-уха
+все-во-лож-ске
+вцспс
+га-рем-но-го
+го-ло-дра-нец
+грэс
+дву-зу-бец
+днепр
+добре-ем
+до-бре-ем-ся
+добре-ет
+добре-е-те
+до-бре-е-тесь
+до-бре-ет-ся
+добре-ешь
+до-бре-ешь-ся
+добрею
+до-бре-юсь
+добре-ют
+до-бре-ют-ся
+до-бре-сти
+до-бро-дят
+до-брось
+до-брось-те
+до-бро-сят
+до-бро-шу
+домну
+доп-пель
+драх-му
+дрейф-лю
+дрейфь-те
+еди-но-жды
+зав-сек-то-ром
+за-мру
+за-члись
+из-древ-ле
+изо-тру
+ин-ког-ни-то
+искр
+ка-за-шек
+казнь
+кольд-кре-мом
+корн-па-пир
+ксендз
+лик-бе-зом
+ло-шадь-ми
+людь-ми
+лю-э-сом
+ма-зу-те
+ме-ти-лам
+ме-ти-ла-ми
+мно-га-жды
+морщь-те
+на-бе-крень
+навз-ничь
+на-вскид-ку
+на-встре-чу
+нагл
+на-изусть
+на-ис-ко-сок
+наи-ме-нее
+на-ис-кось
+на-обо-рот
+на-от-рез
+на-супь-ся
+на-угад
+на-уголь-ник
+не-ост-ра
+нес-лась
+нес-лись
+нет-то
+не-уду
+обидь-ся
+обо-шлось
+об-ра-сти
+од-на-жды
+ослаб-ла
+ото-мстят
+ото-мщу
+ото-тру
+отру
+отрусь
+паб-ли-си-ти
+па-на-ме
+па-на-мец
+па-ра-так-сис
+пе-ре-вру
+пе-ре-ме-жать
+пе-ре-ме-жать-ся
+пе-ре-шла
+пис-чая
+по-все-дне-вен
+по-гре-мок
+по-до-тру
+по-ис-ти-не
+по-лу-то-ра-ста
+по-лу-явью
+по-млад-ше
+помни
+по-мнись
+помни-те
+по-мни-тесь
+по-мно-гу
+по-мру
+пол-вто-ро-го
+пол-шка-фа
+по-на-доб-люсь
+по-трафь-те
+преж-де
+прид-ти
+при-шла
+при-шлось
+про-тру
+про-хлад-ца
+пско-ва
+пыл-че
+раз-орем-ся
+раз-оре-тесь
+раз-орет-ся
+раз-орешь-ся
+разо-тру
+ра-зу-мом
+резв-люсь
+рсфср
+сан-узел
+сдрейф-лю
+се-го-дня
+сме-жат
+со-блю-сти
+со-лжешь
+сост-рим
+сост-ришь
+сост-рю
+сост-рят
+со-ткать
+со-ткем
+со-ткешь
+сотку
+со-ткут
+срос-лась
+срос-лись
+стрем-глав
+так-же
+тве-ре-зо-го
+те-ле-ате-лье
+тер-но-сли-вом
+троп-лю
+тьфу
+узу-фрукт
+умнем
+умнет
+умнете
+умну
+умру
+услышь-те
+ушла
+фо-то-пле-нок
+ца-ре-дво-рец
+че-рес-чур
+чер-но-сли-вом
+чресл
+чуж-дость
+шесть-де-сят
+юсом
+ядо-зу-бе
+ярем-но-го} \ No newline at end of file
diff --git a/tex/context/patterns/lang-ru.pat b/tex/context/patterns/lang-ru.pat
new file mode 100644
index 000000000..7f5a4502b
--- /dev/null
+++ b/tex/context/patterns/lang-ru.pat
@@ -0,0 +1,4815 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-ru.rme
+
+% used: а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё
+
+\patterns{
+.аб1р
+.аг1ро
+.ади2
+.аи2
+.ак1р
+.аль3я
+.ар2т1о2
+.ас1то
+.аст1р
+.ау2
+.би2о
+.во2б3л
+.во3ж2д
+.го2ф
+.дек2
+.де1кв
+.ди2ак
+.ди1о
+.до3п
+.до3т2
+.епи3
+.зав2р
+.за3м2н
+.за3п
+.иг1р
+.изг2
+.из3н
+.ии2
+.ик1р
+.ио2
+.ио4на
+.ис3
+.ле2о
+.ле2п3р
+.лес1к
+.ль2
+.люст1
+.ме2ж1у2
+.ми1ом
+.мо2к1
+.му2шт1
+.на1в
+.на3т
+.на3ш2
+.не3вн
+.не1др
+.не1з2
+.не1сл
+.не1с2ц
+.не3т
+.нос1к
+.нук1л
+.обо3ж2
+.ово1
+.ог3н
+.оз4
+.ос2ка
+.ос2п
+.ос3пи
+.от1в
+.от1ро
+.от1ру
+.от1уж
+.по3в2
+.по3ж2
+.поз2н
+.прос2
+.ра2с3т
+.ре2бр
+.ре2з3в
+.ри2ск
+.ри2ч
+.ро2з3в
+.ро2с3л
+.ро2х
+.септ2
+.ск2
+.ст2
+.су2ж
+.те2о3
+.тиа3
+.ти2г
+.тиг1р
+.ти2о
+.уб2
+.уд2
+.уе2
+.уз2на
+.ук2
+.ум2ч
+.уо3
+.уп2
+.ур2в
+.ус2
+.ут2р
+.ую2
+.хо2р3в
+.че2с1к
+.юс1
+4а3а
+аа2п
+аа2р
+аа2ц
+а1б
+абе3ст
+а3бла
+аб2лю
+аб1ри
+а3бу
+ав1в
+а1ве
+ав3зо
+а1ви
+ави2а
+а1во
+аво1с
+а2вот
+ав1ра
+ав2се
+а2вт
+а1ву
+а2вх
+а3в2че
+2ага
+ага1с2
+а2гд
+а2гити
+а2гле
+аг2ли
+а2глос
+аг2лот
+2аго
+а3гу
+а1д
+2адв
+а2две
+ад2жи
+ади2од
+а2дл
+а2д1обл
+ад1ро
+а2д1ру
+аду3ч
+ад2ц
+а2дын
+а1е
+ае2го
+ае2ди
+ае2л
+а2еп
+ае2ре
+ае2с
+аза4ш3
+азв2
+аз3вез
+аз1вл
+азг2
+аз1др
+аз1об
+аз2о1бр
+а2зовь
+а2золь
+а1зори
+аз2о1с
+аз1р
+а1и
+аи2г1
+аи3гл
+а2их
+а1к
+ак1в
+1акк
+ак2л
+ак3лем
+ако1б2
+2аконс
+ако3т
+2акри
+ак1с
+а1ла
+а3лаг
+а1ле
+2алек
+а3ли
+ало1з
+а1лу
+алу2ш
+алуш1т
+а1лы
+а2льщ
+а1лю
+2ама
+амб4
+2амет
+а2минт
+ам2нет
+2амо
+амо1з2
+амои2
+а2мч
+ана2дц
+а2н1а2ме
+а2наф
+ан2дра
+а2н1о2б
+ан1о2хр
+ан1р
+ан2сп
+анс1у
+ан2сур
+а2н1уз
+а1нь
+2а1о
+ао2д
+ао2к
+ао2р
+ао2с
+аост1
+а3пла
+ап2лом
+2апо
+апо4вс
+апо3ч2т
+ап2ра
+ап1рел
+а1ра
+ара2ст
+ар2бок
+ар2вал
+1аргу
+а1ре
+аре1дв
+аре1ол
+ар2жа
+а1ри
+а1ро
+ар2тор
+ар2т1р
+а1ру
+ар1х
+а1ры
+а1рю
+а1ря
+2ас1к
+ас3ми
+ас3но
+1ассиг
+аст1ву
+ас3тем
+ас2тин
+ас2тия
+ас1тоо
+ас1тух
+а1стье
+ас2шед
+ас2шес
+а1сьи
+а1та
+1атак
+ат3ва
+ат1ви
+ат1ву
+2атез
+а1ти
+а1то
+ат1обе
+а2томн
+ато2ш
+ат1рах
+ат1ри
+а1ту
+ат2х
+а1ты
+а1тье
+а3тью
+а3тья
+а1тю
+а1тя
+а1у
+а2уб
+ау2д
+ау3до
+а2уле
+аут1р
+ау2х
+ау2ч
+ау3чь
+ауэ1
+а2ф1л
+ах2а
+ахми2
+ах3с
+а1ч
+2ача
+а2чл
+ач1т
+а2шл
+аэ2ли
+а2эр
+аю1та
+а1я
+ая2б
+ая2в
+ая2з
+1ба
+ба2бв
+ба2г1р
+ба2др
+ба1з
+ба3зу
+балю1
+ба2о
+бас3м
+ба1ст
+ба1тр
+2б1б
+б1в
+бвы2
+бг2
+2б1д
+1бе
+3бев
+бе2гл
+бе2гн
+бе2д1р
+3бее
+3бе2з
+без1а2
+без5д4
+бе3зи
+без3н
+без1о2
+без1р
+бе2с1к
+бес3п
+бе2с1т
+бес3те
+бес3ти
+3бец
+2бещ
+2бж
+б1з2
+1б2и
+3биа
+би2б
+2биж
+3бик
+били3т2
+3био
+би2об
+би2од
+би2он
+би2ор
+би2тв
+би1х
+2б3к
+б1л
+1благ
+1б2лаз
+б3лази
+б2лан
+1б2лее
+б3лен
+б2лес1к
+1б2лея
+б2луд
+1б2луж
+2блы
+2б2ль
+2б3лю.
+б2люд
+б2люе
+б2люл
+2б3люсь
+2бля
+2б3н
+1бо
+бо1бра
+бо3вш
+бо2гд
+бо1дра
+бо1з2
+бо1л2ж
+бо1льс
+бо3м2л
+бо2мч
+бо3мш
+бону1
+бо1ру
+бо2са
+бо1ск
+бо3ско
+бо3сти
+3бот
+бо2тв
+бот2р
+боя2р
+2бр.
+б3раб
+б2рав
+бра1зо
+1б2рал
+2б1рам
+б2ран
+1брас
+б2рать
+б1рах
+1б2рач
+2б3рая
+1б2ред
+б1рей
+б1рек
+б2рем
+б2рех
+б2рид
+б2рито
+б2риты
+1б2роди
+б1рол
+б1ром.
+1б2роси
+бро2с1к
+2брс
+б1ру
+3брукс
+2брь
+1б2рю
+2б3рю.
+б1ря
+2б1с2
+б3ск
+бс4л
+б1т
+1б2у
+бу2г1р
+бук1л
+бу1с
+2бф
+2б1х
+2бц
+2б1ч
+2бш
+2бщ
+1бы
+бы2г1
+бы2с
+быс1к
+быст1
+1бь
+2бь.
+2бьс
+2бьт
+бэ1р
+3б2ю
+бю1та
+1бя
+1ва
+ва2бр
+3ваг
+ва2д1р
+вадь2
+ва3ж2д
+ва1з
+ванс2
+ва1ст
+ва2стр
+ва1тр
+вах1
+3вац
+3вая
+2в1б
+в1ви
+в1вр
+2вг2
+в1д
+в2дох
+1вев
+3вег
+вед1р
+ве3ду
+1вее
+1вез
+3везе
+3везл
+вез2у
+1вей.
+ве2п1
+2верд
+1вес
+ве2с1к
+ве2ст1в
+вет3р
+1вец
+1вею
+1вея
+1в2з2
+взг2
+взд2
+взо1б
+взъ2
+взъе3д
+ви2аз
+ви2ак
+ви2ар
+ви2а1с2
+виа1т
+ви3аф
+ви2гв
+ви2гл
+1виз
+1винт
+1винч
+ви1о
+ви1с2ни
+виу3
+ви2ф
+2в1к
+вк2л
+3в2кус
+в1л
+в2ла
+2в3лаб
+в2лев
+в2лек
+в2лет
+в2леч
+2вли
+в2лия
+2влю
+в2люб
+2вля
+2вм
+1вме
+2в1н
+4в3на
+в2нес
+вно1
+в3ну.
+3в2нук
+3в2нуч
+в3ны
+во1б2
+во2б3ла
+вов2
+во3вк
+1вод
+во1дв
+во1др
+во2ер
+во2жж
+вои2с1
+1вок
+во3м2
+воп2
+во1ру
+2ворц
+2ворь
+вос1к
+во1см
+во1сн
+вос3пе
+во2стр
+вот2р
+1вох
+во1хл
+во3х2т
+1вою
+2вп2
+2вр.
+2вра.
+в2рав
+2в1рам
+в1рас
+2в1рах
+2врац
+2вре.
+2в1рен
+1врид
+1в2риз
+в1рии
+в1рик
+в1рил
+в1рис
+в1рит
+2в1ро
+вро3т2
+2в1ры
+1врю
+в1ря
+2в1с2
+3все3
+в3ская
+4в3ски
+4в3ску
+3в2сп
+3в2сю
+в1т2
+вто1б2
+вто3ш
+1вуа
+ву3г
+1ву1з
+2вуи
+2ву1к
+ву3п
+ву1с2
+ву2х1а
+вух3в
+ву1чл
+вф2
+1вхо
+2вц
+2в1ч
+2вш
+3в2шив
+2вщ
+въ2
+1вы
+вы3г2
+вы3зн
+вып2
+вы3т2
+вых2
+вы3ш2л
+2вь.
+1вье
+1вьин
+2вьс
+2вьт
+1вью
+1вья
+1в2э1
+1в2ю
+1вя
+1г
+г2а
+га1з
+га1ст2
+га2у
+2г3б
+гба2
+г1ви
+2гг
+г3дан
+2г3ди
+3ге.
+ге2б1
+гено1
+ге2об
+ге2од
+ге1ор
+2г3ж
+2г1з
+г2и
+ги2бл
+ги3бр
+ги2гр
+ги1сл
+гист2
+2г1к
+2гла.
+г2лав
+г1лай
+г1лами
+2глась
+2глая
+г1ле
+г2лет
+2гли.
+г2лин
+3г2лиф
+2гло.
+г3лобл
+2глов
+2глог
+2глое
+2глой
+2глою
+2глую
+2г1лы
+г2ляж
+2гляк
+2г3м
+г2нав
+г2нан
+г3не.
+г2нев
+г3нен
+г3неп
+г3нес
+г2нир
+гнит2р
+г2ное
+г2нои
+г2нос
+г3ня
+го1б2
+го2вл
+го3ж2д
+го1з
+го2зл
+гоз2н
+гоиг2
+3гой
+г2ол
+гоми2
+го2с1а
+го2сд
+го1скл
+го1сн
+го1спа
+2готд
+гоу3т
+го1чл
+3гою
+2гп
+2гр.
+г1рае
+г1рай
+г1рар
+г1рег
+г1рек
+г1рец
+гри4в3н
+г1рик
+г1рил
+г1рин
+г1рис
+г1рич
+г1ров
+г2роз
+г1рок
+г1рон
+г1роп
+г1рот
+г1роф
+гру2п
+г1рыв
+2грю
+г1ряе
+г1рял
+г1рят
+2г3с2
+г4са
+г4сб
+2г3т
+гу1в
+гу1с
+гу2с1к
+2гф
+2г1ч
+2г3ш
+2г3э
+1да
+да2б1
+да2ген
+да2гр
+да1з
+да2о
+даст1р
+дат1р
+2д1б
+дв2
+д1ве
+1дви
+2д1вид
+2двиз
+2двинт
+2двинч
+2д1вис
+2д1вит
+д3вк
+д1вл
+2двод
+д1воз
+1дворь
+2двя
+2дг2
+2д1д2
+1де
+де1б2л
+де1б2р
+3девр
+3дез
+де2з1а2
+де2зи
+дез1о2
+де2зу
+деио2
+де1кл
+3деме
+де2од
+део3п
+де3пл
+дерас2
+де2с3в
+дес2к
+де2ср
+де1хл
+2дж.
+д2жам
+д2ж3м
+2джс
+2д1з2
+1ди
+ди2ад
+диа2з
+ди2али
+ди2ало
+ди2ар
+ди2ас
+ди2об
+дио3де
+ди2ор
+дио1с
+ди1оти
+дип2
+ди2пи
+ди3пт
+ди2с1тр
+диу3
+ди3фр
+ди3фто
+ди1х
+2д1к
+д1л
+д2лев
+2д3м2
+2д1н
+д3на
+днеа2
+3дневн
+4д3но1
+дно3д2
+днос2
+4д3ны
+3д2няш
+1до
+2д1о2бед
+до2бл
+2д1обла
+до1б2ра
+дов2л
+до3в2м
+до1д2
+до3дн
+до3ж2д
+до1з
+доз2н
+дои2р
+2докт
+2долим
+до2м1р
+доп2
+до3пл
+2допле
+до2пре
+до2руб
+до1с
+д1о2сен
+д1о2син
+2д1осно
+дос2п
+2дотд
+2дотл
+дот2ри
+2д1отря
+2дотъ
+до3ть
+3дохл
+до2ш3в
+до3ш2к
+до2шлы
+до2щу
+2дп
+2др.
+д1раб
+1дравш
+2дразв
+1д2разн
+д1ране
+д1рар
+д1ра2с3
+д1рах
+д1рач
+д2раю
+д1ре
+д2реб
+2д3реж
+2дрез
+д2рел
+д2рем
+1дрема
+1дремл
+дрем3н
+1дремы
+2д3рен
+дре2ск
+д2ресс
+д1ри
+д2рий
+2дрин
+д2рип
+д2рих
+дро2г3н
+д1род
+д1рое
+1д2рож
+2д3роз
+д1рой
+д1рол
+д1рон
+д1рос
+д1рот
+д1рою
+д1руб
+1друг
+1друж
+д1рум
+д1рую
+д1ры
+2дрыв
+1д2рыг
+д1ря
+д2ряб
+1д2ряг
+д2рях
+2д1с2
+дск2
+дс3кн
+2д1т
+1ду
+дуб3р
+ду3г
+2д1уд
+ду2да
+ду2о
+дуп1л
+дус1к
+д1усл
+ду1ст
+ду2ста
+2дут1р
+ду1х
+ду2чи
+дуэ1т
+2дф
+д1х
+2д3це
+2дцу
+2дцы
+2д1ч
+2д3ш2
+2дщ
+2дъ
+дъе2м
+1ды
+2дыг
+ды2г1р
+2дыд
+2дыме
+2ды2с1
+2дыт
+2дыщ
+2дь.
+1дье
+2дьк
+2дьт
+1дью
+1дья
+дь3яр
+1д2ю
+1дя
+е1а
+еа2д
+еади3
+еа3до
+еа2з
+еан2д1р
+еат1р
+2еб
+еба2с
+е1бра
+еб1рен
+еб1ри
+е1бро
+еб1ров
+еб1ры
+е2б3рю
+е1ве
+2евер
+е1ви
+е3в2ме
+ев2ним
+ев2нят
+е1во
+2евол
+евра1с
+2е1вре
+ев1рее
+ев1рей
+ев1рея
+ев1ри
+е2вт
+е1ву
+е1вх
+ев2хо
+е1вь
+ега1с2
+ег2д
+е2глан
+е2гле
+е2гли
+е2гло
+ег2на
+ег2но
+2ег2р
+ед1во
+ед2ж
+е1дже
+е1д2лин
+едноу3
+ед1опр
+е2дотв
+е2дох
+е2д1ощ
+е1дру
+е2дру.
+е2ду2б
+ед1убо
+е2дуве
+е2дуг
+е2дус
+ед1уст
+2е3душ
+е2дын
+е1е
+е2евид
+ее2в1р
+ее2ги
+ее1с2
+ее2ст
+еест1р
+ее2х
+е2жг
+е4ждев
+еж3ди
+2еже
+е2ж1р
+еза2вр
+езау3
+е1з2ва
+езд1р
+е3зе
+еззу3
+е3зит
+ез1об
+ез1о2г
+е1зом
+ез1оп
+ез1о2р
+ез1от
+ез1ош
+ез2ря
+ез1у2д
+ез1у2к
+ез1уп
+ез1ус
+езу2со
+езу2сы
+ез1у2х
+ез1уча
+е3зя
+е1и
+еи2г1
+еи2д
+еи2м
+еи2о
+еис1л
+еис1тр
+е1ка
+ека2б
+ек2з
+е1ки
+2е1ко
+2е1кр
+ек2ро
+ек1ск
+ек1сте
+е1ку
+е1ла
+е1ле
+еле3ск
+еле1сц
+е1лу
+е1лы
+е1лю
+е3ля
+еми3д2
+еми3к
+емо1с
+2емуж
+е2мч
+2емыс
+е3на
+ен2д1р
+2е1нр
+енс2
+ен3ш2
+е1нэ
+2ео
+е1о2б
+еоб2ро
+е2о3гл
+ео2гро
+е1од
+ео3да
+ео2де
+еоде3з
+ео2до
+е1о2ж
+е2ои
+ео3кл
+е1ол.
+е1ола
+ео3ли
+е1олк
+е1олы
+е1оль
+е2ом
+е1он.
+е2она
+е2они
+ео3но
+е1онс
+еоп2
+е1опе
+ео2пр
+ео4пу
+е2о3ро
+еос2
+е1о2сви
+ео1ск
+е1осм
+е1осн
+еост1р
+ео3сх
+е1отл
+еот2ру
+е1о2ч
+е1о2щ
+епат2
+епа1тр
+2епе
+епис2к
+е2пл
+е3пла
+еп1леш
+е3п2лод
+еп1лу
+е3плы
+еп1лющ
+е4пн
+2епо
+е4п3с
+е4пт
+е1ра
+ер1акт
+е2рв
+ер1ве
+е1ре
+е3ре.
+ере3до
+ере1др
+ере1к2
+ере3м2н
+ере3п
+ере1х4
+е1ри
+ерио3з
+е1ро
+еро2б
+ер1обл
+2ерови
+2ерокр
+2ерол
+еро3ф2
+ер3ск
+е1ру
+е2р1у2п
+е1ры
+е1рю
+е1ря
+е3с2а
+ес2ба
+е1сг
+е1ск
+е2с1ка.
+ес1кал
+е2ске
+е2сков
+е4с1ку.
+2есл
+ес1лас
+ес2лин
+ес2лов
+ес2лом
+е1слу
+е1слы
+е1с4м
+е3со
+2есп
+ес2пек
+ес3пол
+е2спу
+е1ст
+ес2тан
+е2стл
+е3сту
+ес2чет
+е1та
+ет1ве
+ет1ви
+е1тво
+2етеч
+е1ти
+е1то
+ето1с
+ет1р
+ет2ря
+е1ту
+е1ты
+е1тье
+е3тью
+е3тья
+е1тю
+е1тя
+е1у2
+2еуб
+еуб3р
+еуз2
+еук2ло
+ефи3б2
+еф2л
+еф1ре
+еха2т
+ех1ато
+ех3вал
+ех3лоп
+ех1об
+ех1опо
+ех1ре
+ех1ру
+ех1у2ч
+2ецв
+е1чл
+е2шл
+еэ2
+ею2г
+е1я
+ея2з
+1ж
+жа2бл
+жа2бр
+жа1з
+жат1в
+2ж1б2
+2ж1в
+жг2
+2жга
+ж2ги
+3ж2гл
+ж2гу
+2ж1д
+ж2дак
+ж2дач
+3ж2дел
+4ждеме
+ж2деп
+ж2ди
+4ж2дл
+ждо3
+жду1
+4ждь
+3ж2дя
+3жев
+же3д2
+же1к2в
+же1кл
+же1о2
+же3п2
+же1с2
+же3ск
+2жжа
+ж2же
+2жжев
+2ж1з2
+жи1о
+2жирр
+2ж1к
+2ж1л
+ж2м
+ж3ма
+2ж3мо
+2ж1н
+жно1
+2ж1об
+2ж1о2т1
+жоу3
+жоу1с
+2жп2
+жпо1
+ж2ру
+2ж1с
+2жф
+2жц
+2ж1ч
+2жъ
+2жь.
+2жьс
+2жьт
+1за1
+заа2
+заб2
+за2в1ри
+за2вру
+з1аву
+заг4
+з1адр
+зае2д
+зае2х
+за3ж2д
+за3з2
+з1акт
+за3мне
+3з2ан
+за3на
+занс2
+зап2
+зар2в
+за3р2д
+зар2ж
+зас2
+заст2
+зат2
+за3тк
+зау2
+зах2
+зач2т
+за3ш2
+зая2
+з1б2
+2з3ва.
+з2вав
+з3валь
+з2ван
+2звая
+з1ве
+з2вез
+з1ви
+з3в2к
+з1вла
+з1во
+2звол
+1з2вон
+з1вр
+1зву
+2з1вую
+з1вь
+2зг
+з3га
+з2гли
+зг2на
+з2гну
+з1д2в
+з2деш
+здож3
+1зе
+зе2б1
+зе2ев
+зе2од
+2зж2
+з3з2
+1зи
+3зи.
+3зий.
+з1инт
+зи2оз
+зи2оно
+зи1оп
+3зис
+зи3т2р
+зиу3м
+3зич
+2з1к
+зко1
+зко3п2
+з1л
+з2лащ
+з2лоб
+з2лоп
+з2лор
+з2лющ
+2зм2
+з3мн
+з1н
+2зна.
+з2нав
+з2нае
+з2най
+з2нак
+з2нан
+з2нат
+з2наю
+2зная
+2зне
+2з3ни
+2зно
+2зну
+2з3ны
+з2обе
+зо2би
+1зов
+зо3в2м
+зо2гл
+зо1др
+1зое
+зо1з2
+1зои
+1зой.
+1зок.
+з1окс
+1зол2
+зо1лг
+зо1лж
+зо3м2
+1зом.
+2зомн
+1зон
+2зонр
+1зоо
+зо2о3п
+зо2ос
+зо2па
+з2опл
+з2опр
+з1орг
+1з2о3ре
+зос2
+з1осн
+зо1сп
+зо2тв
+з2оте
+з1отк
+з2ото
+зот2ре
+зот2ри
+1зох
+зош2
+зо2ши
+1зоэ
+1зою
+з1ра
+з2рак
+зра2с
+з2рач
+з2рен
+з1рес
+з2риш
+з1ро
+зро2с3
+з1ру
+з2рю
+з1ря
+2з1с
+2зт
+з1ти
+1зу
+3зу.
+2з1у2бе
+зу2б3р
+зу1в
+2зуве
+2зу2г
+3зуе
+2з1уз3
+2зу1к
+3зуме
+з1у2мо
+2зуп
+зу2пр
+з1урб
+з1у2те
+зу2час
+2зц
+з1ч
+2зш
+зъе2м
+1зы
+2зы2г1
+зы2з
+2зыме
+2зымч
+2зы2с1
+2зыщ
+1зье
+1зьи
+1зью
+3зья
+1з2ю
+1зя
+и1а
+и2аб
+и2ав
+иаг2
+и2агр
+и2аде
+и2ади
+иа2зов
+иа2му
+и3ана
+иа2нал
+ианд2
+иао2
+и2ап
+иа1с2к
+иа1ста
+иа1сто
+иат1ро
+и3ату
+и2аф
+и2а1х
+иа2це
+2и1б
+и2б1р
+2иваж
+2и1ве
+и2в3з
+и1ви
+2и1во
+и1в2р
+и3в2с
+и1ву
+ив2хо
+2ивы
+иг2д
+и3ге
+2игл
+и2гле
+и2гли
+и2гн
+игни3
+иг1рен
+иг1ро
+иг1ру
+иг1ры
+и2г1ря
+и1дв
+и2дей
+и1д2ж
+иди1ом
+иди1от
+ид1р
+и1дь
+и1е
+и2евод
+ие2г
+ие2д
+ие3де
+ие2зу
+и3ени
+ие1о2
+иепи1
+ие2р
+и3ж2д
+из1в2
+из2гне
+1из1д
+из2нал
+и1зо
+изо2о
+из1р
+и1и
+ийс2
+и1к
+и3к2а
+ика1с2
+ик2ва
+и2кви
+и2кля
+и3ко
+ик1ро
+ик1ск
+ик2с1т
+и3ку
+и1л
+и2л1а2ц
+ило1ск
+илп2
+и2л1у2п
+и2ль
+ильт2
+2има
+и2мено
+и2мену
+2имень
+и3ми
+имои2
+им3пл
+и2м1р
+и2мч
+им2ча
+инд2
+1инж
+ино2к3л
+ино3п2л
+ино1с
+инс2
+1инсп
+1инсти
+1инсу
+1инф
+1инъ
+и1об
+ио2бо
+ио2вр
+и2ог
+и1од
+ио2де
+и1оз
+ио3зо
+и1окс
+и1оле
+и1он
+и3онов
+и1опт
+и1ор
+и3ора
+ио1ру
+ио2са
+ио3скл
+ио1с2п
+и1ота
+ио2т1в
+и1отк
+и1отс
+иоуг2
+ио2хо
+и1ош
+2ип
+ипат2
+ипа1тр
+ип2ля
+ип3н
+ипо3к2
+и1р
+ира2ст
+и2р1ау
+и2рв
+и2рж
+ири2ск
+ириу3
+иро1з2
+1ирр
+исан2д1
+и2сб
+и2сд
+ис1к
+ис3ка.
+ис3кам
+ис3ках
+ис3ке
+ис3ки
+ис3ков
+ис3ку.
+и2слам
+ис1лы
+ис3ме
+ис3му
+ис3но
+исо2ск
+и2с3пр
+и4сс
+и1ст
+и2ст1в
+и2стл
+ис1тяз
+и1сьи
+и1т
+ита2в
+ит3ва
+и2т1ве
+ит1ви
+ит1ву
+и2тм
+и2т1р
+ит2рес
+ит3ром
+и2т1уч
+и3тью
+и3тья
+и1у2
+иу3п
+иф1л
+иф2лю
+и2фр
+иха3д
+и2х1ас
+их2ло2
+ихлор1
+и3х2о
+ихо3к
+их1ре
+их1ри
+и1ху
+и1ч
+иш2ли
+и2шлы
+и2шт
+ию4л
+ию2н
+ию2т
+ию3та
+и1я
+ия2д
+2й1
+йд2
+й2д3в
+йно1
+й2о1с
+йо2тр
+йп2л
+й2сб
+й3ска
+йс2ке
+йс4мо
+й2с3му
+й2сн
+й2с3ф
+й2сш
+й2тм
+й2хм
+йх2с3
+йя1
+ка2бл
+ка2бри
+1кав
+к2ад
+ка3дне
+ка2д1р
+1кае
+каз3н
+ка1зо
+1кай
+1кал.
+1кало
+1калс
+1кам
+1кан
+ка2п1л
+ка2пре
+кар3тр
+3к2ас
+ка1ст
+1кат
+ка1т2р
+1ках
+ка2ш1т
+1каю
+2к1б
+к2вак
+к2вас
+к2ваш
+к1ви
+к2воз
+к1ву
+2кг
+2к1д
+кда2
+1ке
+2кеа
+ке2гл
+кед1р
+ке2с1к
+ке2ст1
+2к1з
+1кив
+ки1о
+киос1
+ки2пл
+ки1с2ни
+1кит
+2к1к2
+кк3с
+2к3ла.
+2к3лась
+2к3ле.
+2клем
+к3лем.
+к3лен
+к1лео
+2к3ли.
+2к3лив
+к2лик
+к2лин
+2к3лис
+к3лия
+2к3ло.
+к2лоз
+к3лом
+2к3лос
+кло3т
+1клук
+к3лы
+2кль
+1клю
+2к3лю.
+2кля.
+2клям
+2клях
+2км
+2к1н
+3к2ниж
+к2ноп
+3к2няж
+к2о
+ко1б2ри
+1ков
+3кова
+1код
+ко1др
+1коз
+1кольс
+2комин
+3конс
+коп2р
+ко2р3в
+ко1ру
+1кос
+ко1ск
+кос3м
+ко1сп
+1котн
+ко2фр
+кохо2р3
+1кош
+2кп
+2кр.
+к1рел
+кре1о
+кре2сл
+к1реч
+1криб
+к1рид
+к2риз
+кри2о3
+к2рит
+к1рих
+к1роа
+к1роб
+к2рое
+к1рок
+к1роо
+к1рор
+к1рос
+к1роф
+к1рох
+к1роэ
+кру1с
+к1ряд
+2кс
+ксанд2
+к2с3в
+кс3г
+к2с3д
+к2сиб
+к1ски
+кс1кл
+к1ско
+кс3м
+к3со
+к1стам
+к1стан
+кс3те
+к1сто
+кс1тр
+к1сту
+к3су
+2к1т
+кта2к
+3к2то.
+кто1с
+кт2р
+к2у
+ку1ве
+3куе
+1куй
+1куля
+3кум
+куп1л
+ку2п1р
+1кур
+ку3ро
+кус1к
+ку1ст
+1кут
+ку3ть
+1куче
+1куют
+3кующ
+2кф
+2к1х2
+2кц
+2к1ч
+2кш
+1кь
+к2ю
+1ла.
+2лабе
+ла2бл
+2лаго
+ла2гр
+ла2д1аг
+1лае
+ла3ж2д
+ла1зо
+л2ак
+лак2р
+1лам.
+1лами.
+лан2д1р
+ла1ста
+ласт1в
+ла1сте
+ла1сто
+ла2ст1р
+ла1сту
+ла1стя
+ла1т2р
+лау1
+ла2ус
+ла2фр
+1ла1х
+1лая
+2лб
+л1бр
+л1ве
+л1ви
+л1во
+л1ву
+1л2гал
+л2гл
+лго1
+2л3д2
+1ле.
+ле1вл
+лев1ра
+ле2г1л
+ле1дж
+ле3до
+ле1з2о3
+ле1зр
+лек1л
+2лемн
+1лен
+ле1онт
+ле1о2с
+ле2сб
+ле2ск
+ле4ска
+ле1с2л
+ле1спе
+ле1тв
+ле1т2р
+1лех
+ле1хр
+л1зо
+1ли
+лиа2м
+3ливо
+3ливы
+лиг2л
+ли2гро
+лие3р
+ли2кв
+2лимп
+лио1с
+ли2пл
+лис3м
+2л1исп
+ли2тв
+лиу3м
+ли2х3в
+ли1хл
+ли1хр
+2л1к
+лк2в
+л2к1л
+2л1л
+л2ль
+ллю1
+2лм
+2л1н
+лни2е
+1ло
+ло2бл
+ло1б2р
+2ловия
+ло2вл
+3ловод
+ло2г3д
+лого1с
+ло1др
+2лоен
+ло1зв
+ло2к1а2у
+ло2кл
+лок3ла
+3лопас
+ло2рв
+2л1орг
+ло1ру
+лос1к
+ло1с2п
+2лотд
+лот2р
+ло2шл
+2лп
+2л1с2
+лс3б
+л1т
+1лу.
+лу1бр
+лу1в
+лу3г
+лу1д4р
+1луе
+лу1зн
+лу1кр
+1лун
+луо2д
+лу3п2ло
+лу1с
+лу3ть
+1лую
+2л3ф2
+2л1х2
+л2х3в
+2лц
+л1ч
+1лы.
+1лые
+1лыж
+1лый
+1лым
+1лых.
+4ль.
+2льд
+3лье
+3льи
+2льк
+2льм
+2льн
+3льо
+2льск
+1льсти
+1льстя
+2льт
+2льц
+2льч
+1льща
+1льще
+1льщу
+3лью
+3лья
+л2ю
+1лю.
+1люж
+1люсь
+лю1та
+1ля
+3ля.
+ля1ви
+3ляво
+3лявы
+2ляд
+3лям
+ля1ре
+ля1ру
+3лях
+1м
+ма2вз
+3маг
+ма2гн
+ма2др
+ма2дь
+ма1зо
+ма2к1р
+2м1алл
+ман2д1р
+мас3л
+ма1с4т
+ма2тоб
+ма2т1р
+ма2у
+маф2
+3мач
+ма2чт
+4м1б
+м3би
+мб2л
+м3бля
+2м3в2
+2мг2
+3м2гл
+2м1д
+меан2
+ме2ег
+ме2ел
+ме2ж1ат
+ме1зо
+ме2с1к
+ме2ст1р
+меч1т
+2мж
+2м1з2
+ми2гре
+ми1зв
+2мизд
+ми1зн
+ми2кр
+мик1ри
+ми2оз
+ми1опи
+ми2ор
+ми1с2л
+2м1к2
+3мкн
+2м1л
+м2лее
+м2лел
+2мм
+2м1н
+4м3на
+мне1д
+3м2неш
+4мное
+м2нож
+4мной
+4мном
+м2нор
+4мною
+м2нут
+4м3ны
+мо1б2
+мо3вл
+3мод
+мо1др
+мо2жж
+мо1зв
+мо1зр
+моис1т
+мо2к3в
+мо3м2
+3мон
+3моп
+мо1ру
+мос1ка
+мо1см
+мо1сн
+мо1с2п
+3моти
+мо2т1р
+3моф
+2мп
+мп2л
+м1раб
+2мри
+2м1ро
+м1ры
+2м1с
+мс2к
+мс2н
+м2с1ор
+3м2сти
+2м1т
+му1с2к
+му1с4л
+му1ст
+мут1р
+му3ть
+2мф
+мфи3
+2м1х
+2мц
+м2чав
+м2чал
+м2чит
+м2чиш
+2мш2
+2мщ
+3м2ще
+мым1
+мы2мр
+мы2с
+2мь.
+2мьс
+мью1
+2мэ
+мэ1р
+м2ю
+мя1р
+мя1ст
+1на
+наби1о
+наб2р
+на1в2р
+наг2н
+на3жд
+на1з2
+на2ил
+на2ин
+на2и1с2
+4накк
+на3м2н
+нап2л
+на1рва
+на1р2ви
+на1с2
+на1тв
+на1т2р
+н1а2фр
+на1х2
+2нач
+на3ш2л
+2нащ
+наэ1р
+3ная
+2н1б2
+2н1в
+2нг
+н2г1в
+нги2о
+нг4л
+нго1с
+нг2р
+2н1д
+н2дак
+н2д1в
+нде3з
+нде2с
+нд2ж
+н3д2з
+н2дл
+нд1раг
+нд1раж
+нд2ре
+нд2риа
+н2дря
+нд2сп
+н2дц
+1не
+не1б2
+не1в2д
+2невн
+не3вня
+нег2
+3нед
+не1д2л
+нед2о
+не2дра
+не1дро
+не3ду
+не3е
+нее2д
+не3ж2д
+не1зв
+не1з2л
+не1зн
+не1зо
+не1зр
+неи2
+не1к2в
+не1кл
+не3м2н
+3не1о2
+не2ода
+не2ол
+не3п2
+не1р2ж
+не2р1от
+нес2к
+не3с2н
+не1с2п
+нест2
+не1с2х
+не1с2ч
+не1т2в
+не3т2л
+не1т2р
+3неу
+не2фр
+не1хр
+не3шк
+нея2
+2н1з2
+нзо1с
+1ни
+ни3б2
+ни2ен
+3ний
+ни2кл
+нила2
+ни2л1ал
+ни2л1ам
+2нинсп
+2н1инст
+ни1сл
+нис3п
+нист2р
+ниу3
+ни1х
+3ниц
+3нищ
+2н1к
+нк2в
+нк2л
+нкоб2
+нко3п2
+н2к1ро
+нк1с
+н1л
+2н1н
+нно3п2
+1но
+ноб2
+но1бр
+но2вл
+но1дв
+но1др
+но2ер
+но1зв
+но2зд
+но3з2о
+но1зр
+но3кн
+3номе
+ном3ш
+но2рв
+но1ру
+но1скл
+но2сли
+но1с2п
+но2сч
+2нотд
+но3ф2
+ноэ2
+н3п2
+2н1ре
+2н1ри
+н1ро
+2н1с
+н2с3в
+н2сг
+нс2ке
+н2скон
+н2сл
+н3сла
+н2с3м
+н2сн
+н2с1ок
+н3с2пе
+нст2р
+нсу2р
+н2с3ф
+н2съ3
+2н1т
+н2т1в
+нти1о2к
+н2тм
+нт2ра
+н2тр1а2г
+нтр1аж
+н2трар
+нтрас2
+нт2ре
+н2трив
+н2трок
+нт2ру
+нтр1уд
+нт2ры
+н2т1ря
+1ну
+нут1р
+ну1х
+3ную
+2нф2
+н1х
+нхо1
+2нц
+2н1ч
+н2чл
+2нш
+нш2т
+2нщ
+1ны
+3ны.
+2нь.
+1нье
+1ньи
+2ньк
+1ньо
+2ньс
+2ньт
+2ньч
+1нью
+1нья
+н2э
+1н2ю
+2н3ю2р
+1ня
+ня1ви
+2о1а2
+о3ав
+оап1
+2оба
+2обио
+об2лев
+об2лем
+о1блю
+1обм
+обо1л2г
+обо3м2
+обо2с
+2обот
+об1р
+о2бра.
+о1брав
+о1бран
+1объ
+2обь
+о1в
+о3вла
+о3в2ло
+ов3но
+о3в2нуш
+о2в1ри
+ов2се
+ов3ско
+ов2т
+о2вх
+ог2
+2о3ге
+ог3ла.
+ог3ли.
+ог3ло.
+о3гря
+2одан
+од1вое
+о3де.
+1о2деял
+2оди3а
+2о3дим
+од2лит
+о2д1о2пе
+одо3пр
+о2д1о2пы
+о2доси
+о2д1отч
+о1драг
+од1раж
+од1раз
+од1рак
+о1драл
+од3реб
+о1дроб
+од1ров
+о2д1у2ч
+о2дыма
+о2дыму
+о2дын
+о1дь
+о2дьб
+о1е
+ое1б
+о2е1вл
+ое2д
+о3ежек
+ое2жи
+ое1о
+ое1с2
+ое2ст
+о2ето
+ое2ц
+о3жди
+о3ж2ду
+оза2б3в
+2озав
+о1з2ва
+оз2вен
+оз2ви
+о1з2вя
+оз2гло
+оз2дор
+о1здр
+озе1о
+оз3но
+о1зо
+о2з1об
+2озон
+о2зоп
+озо1ру
+оз1уг
+о2зым
+о3зыс
+о3и
+ои2г1
+оиг2н
+оие3
+ои2з
+ои2м
+ои3мо
+ои2о
+2ой
+ойс2
+о1к
+2о3кан
+ок2в
+2ок2л
+о3клю
+око1б
+2о3кол
+око3п2л
+ок1ск
+1окт
+2окти
+2окум
+о3ла
+ол2ган
+о1ле
+1олимп
+о3ло
+о1лу
+олу3д2
+о1лы
+о1лю
+о3ля
+о3ма
+ом2бл
+2оме
+о3м2нем
+о3м2нет
+о3множ
+ом1ри
+ом2ч
+ом2ше
+о2мь
+о3мья
+о3на
+онд2
+оне3ф2
+оно1б
+о1нр
+онс2
+он2тру
+о1о2
+о2ол
+оо3пс
+оос3м
+оост1р
+о2оти
+о2оф
+о3пак
+о3пар
+о2пле.
+о2п1лей
+о2пли
+оп2лит
+оп2ло
+оп3лю.
+о2пля
+о3пляс
+опо4вс
+опоз2н
+опо2ш3л
+оп2ри
+о3п2те
+оп2то
+о1ра
+ора2с3
+ор2б3л
+о1р2в
+о1ре
+2о3рег
+оре2ск
+о1ри
+ор1исп
+о1ро
+оро2с3л
+ор2тр
+о1руе
+о1рук
+ор1укс
+о1рус
+2орц
+о1ры
+о1рю
+о1ря
+о3сад
+оса3ж2
+ос2б
+о2с3ба
+о2с1ка.
+ос3кар
+оск1во
+о2ске
+ос1ки
+о2ски.
+о2сков
+ос1кой
+ос1ком
+о1с2коп
+ос1кою
+о2с1ку.
+ос1кую
+о1с2л
+ос3лей
+ос3лог
+ос3лых
+ос3ми
+ос3мос
+о1с2ним
+ос2нял
+ос2пас
+о1с2пу
+ос2пя
+ос2св
+ос2с3м
+о1ст
+ос2та
+о3стра
+о2суч
+2осх
+ос2цен
+о1с2ч
+о1с2шив
+о1т
+отв2
+от3ва
+от1ве
+от1ви
+от1вл
+1отг
+1отд
+2о3тек
+о3тер
+2о3тех
+о3ти
+о3ткал
+о2тм
+от1раб
+от1рад
+от1раз
+отра2с
+от1реж
+от1рек
+от1реч
+от1реш
+от1ри
+от1род
+от1рое
+от1рок
+от1рос
+от1роч
+от1руг
+от3см
+оту2а
+от1у2ч
+1отх
+о3тью
+о3тья
+о1у2
+оуп2
+оус2к
+оу3та
+оу3то
+2офаш
+о3фе
+2офит
+2офон
+о2фори
+2офот
+о2фри
+2охи
+ох1лы
+о2хля
+ох2ме
+2охор
+о1хр
+о1ху
+о2цо
+оча1с
+оч2л
+оч1ле
+о3чли
+о1чт
+о2ч1то
+ош3ва
+ош2ла
+ошпа2к3
+ош2т
+оэ1ти
+2ою
+о1я
+оя2в
+оя2д
+оя2з
+оя2ри
+1п
+пави3
+пав3л
+па2вь
+па2др
+па2ен
+па1зо
+пас1л
+пас1та
+па1сте
+пас1то
+пас1ту
+па2с1ты
+па1тро
+па2ун
+па3ф
+па1ху
+па2шт
+2п1в2
+2п1д
+пе1
+пе2дв
+пе2д1ин
+пе2з
+пе3за
+пе3зо
+пе2к1ла
+пе2ль
+пе4пл
+пери1о
+пе2с1к
+пе2сн
+пе2ст1р
+пе2сц
+пе2сч
+пе2тр
+пе2шт
+пиаст1
+пи2ж3м
+пи2к1р
+3пинк
+3пися
+4п3к
+2пл.
+4пла.
+пла1с
+п1лем.
+п1лемс
+2плен
+п2ленк
+п1ле2о
+плес1к
+п1лею
+2плив
+3п2лик
+2пло.
+2плов
+2плог
+2плый
+2плым
+п1лын
+п1лых
+2плю.
+п1лют
+п2ляс
+п2ляш
+2п1н
+п3на
+п3но1
+п3ны
+по1б2
+по3вл
+по3в2с
+под1во
+по2д1о2к
+подо3м2
+пое2л
+пое2х
+по1зве
+по1здо
+по1з2л
+по1зн
+пои2щ
+3пой
+3полк
+по3мно
+по3мну
+3по3п2
+п1орг
+пор2ж
+по1ру
+по1с4
+3посл
+по3сс
+пот2в
+пот2р
+по1х2
+по2шло
+по2шлы
+по2шля
+поэ3м
+2пп2
+ппо1д
+2пр.
+3прев
+пре1з
+прей2
+пре1л
+пре1ог
+3прет
+при1
+при3в
+приг2
+при3д2
+при3к
+при3л
+приль2
+прип2
+п2риц
+про1бл
+прод2л
+про3ж2
+про1з2
+п1розо
+3прои
+про3п
+профо2
+2прс
+п2ру
+2п1с2
+3п2сал
+п3син
+3п2сих
+п3со
+2п1т
+п2т3в
+3п2тих
+п3ту
+3пуб
+пуг3н
+пус1ку
+пу1ст
+пу3ть
+2пф2
+пх2
+2пц
+4п3ч
+2пш
+2пщ
+2пь.
+2пьт
+пэ1ра
+п2ю1
+1ра.
+раа2
+ра2бл
+1рабо
+ра2б1р
+1равня
+ра2гв
+ра2гл
+рад2ж
+радо1б2
+ра2дц
+ра2жур
+ра2зий
+ра2зуб
+рак2в
+1ракиз
+ра2к3л
+1ралг
+1рамк
+1рамн
+ра2нох
+ран2сц
+ра2п1л
+рас3к2
+1расл
+рас3п
+рас1т
+1раста
+рас3т2л
+ра2так
+рат1в
+ра1т2р
+2рахи
+1ращи
+1раю
+1рая
+2раят
+2р1б
+рб2ла
+р2бле
+рб2ло
+рб2лю
+рбо3с
+1р2вав
+р3вак
+р3вар
+р3вата
+р3веж
+р2вео
+1рвет
+р1ви
+р3вин
+р2вит
+р1во
+рво1з2д
+р1вь
+2рг
+р2гв
+р2г1л
+р2гн
+рг2р
+2р1д
+рда1с
+р2д1в
+рд2ж
+рди2а
+р2дл
+рдос2
+р2дц
+1ре.
+ре1вр
+рег2ля
+рег2н
+ре2д1о2п
+ре2дос
+рее2в
+рее2д
+рее2л
+ре3ж2д
+1резк
+ре1з2л
+ре1зна
+1ре1зо
+ре1зр
+рез2у
+1рейш
+ре1к2л
+1рекш
+ре3мно
+3ремо
+ремо2г3
+1ренк
+1рень
+ре1он
+ре1оп
+ре1о2р
+ре1о2ф
+ре1ох
+ре1о2ц
+1репь
+ре3р2
+рес1ки
+ре1сл
+ре1с2п
+рес2с3м
+ре3ста
+ре3сто
+ре1сч
+ре1тв
+ре1т2р
+реуч3т
+ре1чт
+ре3шл
+р3жа.
+р3жам
+р3жан
+р3ж2д
+2рз
+р1з2в
+р1зо
+ри3а
+риб2
+ри3бр
+ри3в2н
+2риги
+ри2гло
+ри3г2н
+2ридж
+ри1д2р
+рие2л
+рие3р
+риз2в
+рик2р
+ри3м2н
+ри3м2ч
+р2ин
+1ринс
+рио2з
+рио2с
+ри1от
+ри3р2
+ри1с2
+ри3сб
+2рисп
+ри3ств
+ри3т2р
+1риу
+ри2фл
+ри3фр
+ри1хл
+1риц
+1риш
+риэти2
+2р1к
+р2кв
+р2к1л
+рк1с
+2р1л2
+р2ль
+рлю1
+р3ля
+2рм
+р2мч
+2р1н
+рнас4
+рне3о
+рне1с2
+рно3сл
+1ро.
+ро2блю
+ро1б2р
+ро2вл
+1рогол
+1рогру
+ро1дв
+ро3д2з
+ро1дл
+род2ле
+ро2д1от
+ро1др
+1родь
+рое2л
+рое2м
+рое2х
+1розар
+ро1з2в
+ро1зр
+3розыс
+рои2с3
+1рокон
+1рокр
+1ролис
+1ролиц
+1ромор
+1ронаж
+1ронап
+1ронос
+рооп1р
+ро2плю
+ро3пс
+2р1орг
+ро1р2ж
+ро1ру
+ро1ск
+ро2ски
+ро2ску
+1росл
+ро1см
+ро1с2п
+рос2ф
+1росш
+1росю
+1рот2в
+1ротк
+рот2ри
+1роу
+роуг2
+ро2ф1ак
+ро2фр
+ро1хл
+рош2л
+ро3шн
+1рояз
+2рп
+рп2ло
+р2плю
+2р1р
+4р1с
+рс2к
+р2сн
+рс2п
+рств2
+р3ствл
+2р1т
+р2такк
+р2т1акт
+р2т1в
+рт3ва
+рт2вл
+р2тм
+р2т1об
+рт1орг
+рт1ра
+рт2ран
+рт1ре
+рт1ри
+ртус1
+р2т1у2чи
+р3тью
+рт1яч
+1ру.
+1руба
+руг3н
+ру2дар
+1ружей
+2рукс
+1рул
+рус1к
+рус3л
+ру1ста
+руст1р
+ру3ть
+1руха
+1рухо
+1ручн
+2рф
+рф2л
+2рх
+р2хв
+р2х1ин
+рх1л
+р1х2ло
+р2х1оп
+рх1р
+2рц
+р2цв
+2р1ч
+р2чл
+р2чм
+2рш
+р3ш2м
+рш2т
+2рщ
+2ръ
+1ры.
+1рыб
+ры2дв
+2рыз
+ры2кл
+1рым
+ры2с1к
+ры2х1
+2рь.
+1рье
+1рьи
+2рьк
+2рьс
+2рьт
+1рью
+1рья
+рэ1л
+р2ю
+1рю.
+1рюс
+ря1ви
+1ряю
+1са
+са2бл
+са2дь
+са2кв
+са2кл
+2с1альп
+с1апп
+2с1арк
+2с1атл
+са1тр
+са2ун
+са2ф1р
+са1х2
+1сб2
+2сбе3з2
+сбезо3
+сбе3с2
+2с3бу
+с2бы
+2сбю
+1с2в
+2с3вен
+сг2
+с2ги
+с2гн
+с2го
+1сд2
+с2да
+с2де
+с3ди
+с2до
+1с2е
+сег2н
+се1з2
+се1кв
+сек1л
+се2к1р
+секс4
+семи1
+сере2б
+се2ск
+се2ст
+се3ста
+се3сте
+сест1р
+1с2ж
+с1з
+1с2и
+3сиз
+си1ом
+си1оп
+си2пл
+си1х
+4ск.
+2скам
+с2канд
+1с2каф
+2сках
+ск2ва
+с2кви
+3скино
+ск2л
+с2кля
+ск3ляв
+2скн
+с1кон
+2скона
+с2копс
+2скош
+ск2р
+с1кра
+2скриб
+ск1с
+2скуе
+2с3ла.
+1слав
+1слад
+с1лам
+2с3лая
+с3лев
+с3лее
+с1лей
+слео2
+с1лет
+с3лею
+2с3ли.
+2слиц
+2с3ло.
+с2лож
+с3лому
+2с3лос
+2с3лую
+2с3лые
+2с3лый
+2с3лым
+2сль
+с1люс
+2с3ля
+с2м
+1смес
+с4мея
+с3мур
+с1н
+1с2наб
+с2нас
+2сная
+1с2неж
+2с3ник
+2сно
+сно1з2
+2сную
+2с3ны
+1со
+со1б2р
+с2ов
+сов2р
+со1д
+со1з2
+со1л2г
+со3м2
+со2рие
+со1ру
+со1ск
+со1с2п
+со2сь
+сот2р
+со1чл
+сош2л
+сп2
+с2пав
+с2пее
+с2пел
+с2пен
+с2пех
+1с2пец
+с2пеш
+с2пею
+с2пим
+2спися
+с3пн
+спо1з2
+2спол
+с2пос
+2спь
+1ср
+2ср.
+с2раб
+сра2с
+с1рат
+сре2б1
+сре3до
+2с1с
+ссанд2
+с2сб
+сс3во
+4с5си
+с3с2к
+сс2л
+с2сн
+с3с2не
+с2сори
+сс2п
+сст2
+сс2ч
+2ст.
+1ста.
+2стб
+4ств.
+ст1вер
+2ствл
+ст2вол
+ст2вя
+с2те
+1с4те.
+1стей
+1стел
+1стен.
+с3тет.
+с3тете
+сте3х
+с3теш
+1сти
+с2тие
+с2тии
+2стимп
+2стинд
+2стинф
+2стинъ
+с2тич
+с2тишк
+с2тию
+2стк
+ст2ла
+с3т2ле
+2стли
+ст2лил
+ст2лит
+2стля
+2стм
+2стн
+1сто.
+с2то1б
+1стов
+1стог
+сто2г3н
+1стод
+1стое
+3с2тои
+1сток
+1стом
+1стон
+2сторг
+2сторж
+2сторс
+1стос
+1стот
+с2тоц
+1стою
+2стп
+2стр.
+страс2
+4страя
+2стред
+ст1рей
+2стрив
+ст1риз
+2стрил
+2стрищ
+ст1роа
+с4т1ров
+ст1род
+ст1рох
+ст2руб
+ст1руш
+2стс
+с1тут
+1стую
+2стф
+2стц
+1сты
+с2тыв
+с4ть
+2сть.
+2стьс
+3стью
+1стья
+1стям
+1стях
+1су
+су2б
+суб1а2
+суб1о
+су1в
+су3гл
+су2ев
+су2з
+су1кр
+сума1
+супе2
+сус3л
+сус3п
+су1ст
+сут1р
+су2ф3
+су1х
+1с2фе
+с1х2
+1с2хе
+2сца
+с2цена
+2с3ци
+2сцо
+сч2
+1сча
+с2час
+сче2с1к
+с3чив
+2счик
+с2чит
+с1чл
+2счо
+сш2
+с3шн
+1съ2
+съе3д
+съе3л
+1сы
+сы2г1
+сы2з
+сы2п1л
+сы2с
+сыс1ка
+2сь.
+1сье
+2ськ
+2сьт
+1сью
+1сья
+сэ1р
+с2эс
+1с2ю
+сю1с
+1ся
+2сяз
+ся3ть
+та2бл
+таб2р
+та1ври
+1таг
+та2гн
+та1з2
+так3ле
+т2ан
+та2пл
+1тас
+та1ст
+та1тр
+1тащ
+2т1б2
+2тв.
+2т2ва
+т1вей
+т1вел
+т1вет
+2тви
+т1вое
+т1во1з
+2т1вой
+т1вос
+2твою
+2т1вр
+2тву
+2твы
+2твя
+2тг
+2т1д
+1т2е
+те2гн
+те1д
+те1зо
+3тека
+тек1л
+3текш
+теле1о
+тем2б1
+те2о3д
+те1ох
+те4п1л
+те2рак
+тере2о
+3терз
+тер3к
+3теря
+те2ска
+те2с1ки
+те2с1ко
+те2ску
+тест2
+те2хо
+2тж
+2т1з
+тиа2м
+ти2бл
+ти3д2
+ти1зна
+тии2
+тиис1
+тик2
+тила2м
+т1имп
+2т1инв
+т1инд
+2тинж
+2тинф
+ти1с2л
+ти3ств
+ти3ф2р
+ти1хр
+2т1к2
+3т2кав
+3т2кан
+3т2кет
+3ткн
+2т1л
+тло2б
+т2ль
+тм2
+тми2с
+тмист1
+т3мщ
+2т1н
+то2бес
+то1б2л
+2тобъ
+то2вл
+то1д
+то3д2р
+то1з2
+ток2р
+2т1омм
+2томс
+2тонг
+1торг
+1торж
+1торс
+то1ру
+1торш
+то1с2н
+то1с2п
+то1с2ц
+2тотд
+то3тк
+1тощ
+2тп2
+тпа1т
+т1рага
+2т1раж
+2трб
+2трв
+2трг
+2трд
+трдо2
+т1реа
+1требо
+1требу
+т1ребь
+т1реве
+т1ревш
+т1рег
+т1ред
+т1рее
+т1реза
+т1резн
+треп1л
+3тре2с
+трес1к
+т1рест
+т1рету
+3т2ре2х
+т1рец
+т2решь
+т1рею
+1триб
+т1рив
+три2г1л
+т1рил
+т1рим
+4тринс
+три1о
+т1рит
+три3ф
+т1рищ
+2трм
+2трн
+т1рогл
+т1роид
+2трой
+тро3пл
+т1рор
+т1росо
+тро3т
+4т3роц
+2трою
+2трп
+2трр
+1труб
+т2руд
+2трук
+т2рум
+т2рут
+2трф
+2трщ
+2тръ
+т1ры
+т1ря.
+т1ряв
+2т1ряд
+т1ряе
+т1ряж
+т1ряй
+т3ряк
+т1рят
+т1рящ
+т1ряя
+4т1с2
+т2сб
+т2с3д
+тсеп2
+т2с3м
+т2с3п
+2т1т
+т2тм
+ту2гр
+ту2жин
+2т1у2пр
+ту1сл
+ту1ст
+ту2фл
+1туша
+1тушо
+1тушь
+1тущ
+2тф
+2т1х
+4тц
+2т1ч
+2тш2
+2тщ
+2тъ
+ты2г1
+ты2с1к
+2ть
+4ть.
+3тье
+3тьи
+ть2м
+4тьт
+тью1
+2тэ
+т2ю
+тю1т
+1тяг
+1тяж
+1тяп
+2тя2ч
+у1а
+у2але
+у2ас
+у3бел
+убо1д
+убос2
+уб1р
+1убра
+уб3рю
+1у2быт
+у1ве.
+у1ви
+ув2л
+у1во
+у1ву
+у2гв
+у2гл
+у2гн
+уг2на
+уг2не
+уг1ре
+уг1ря
+уда1с
+уд2в
+уд1рам
+уд1ро
+у3ду
+у1е
+уе2д
+уе2л
+уе1с
+уе2с1к
+уес2л
+уе2х
+у2жж
+у1з2в
+у1зо
+узо3п
+у1и
+у1ка
+ук1в
+у1ки
+у1ко
+уко1б
+у1ку1
+у1ла
+у1ле
+у1лу
+у1лых
+у1лю
+у2мч
+у3на
+ун2д1р
+у1нь
+у1о
+уо2б
+уо2в
+у2оза
+уо2к
+уо2п
+уо2с
+уост1
+уо2т1
+уо2ф
+у2пл
+уп1лю
+у3про
+у1ра
+у1ре
+уре2т3р
+у1ри
+урке3
+у1ро
+у2род
+уро2дл
+урт2р
+у3ру
+у1ры
+у1рю
+у1ря
+у2сад
+у1сг
+ус1ка
+ус1ки
+уск3л
+ус1ком
+у1скр
+ус1ку.
+ус2л
+усла4ж3
+ус3ли
+у1см
+у2сн
+ус2п
+ус3с
+у1сте
+у1стя
+у1сф
+2усц
+у2сч
+у2сь
+у3сья
+у1та
+у3тер
+у1ти
+ут2ля
+у1то
+уто3п2с
+ут1ри
+у1ту
+у1ты
+у1тье
+у3тью
+1утю
+у1тя
+у1у
+ууг2
+уу2с
+у3фи
+уф1л
+уф2ля
+у2фр
+ух1ад
+уха2т
+у2хв
+у3х4во
+ух1л
+ух3ля
+ух1р
+у2чеб
+1учр
+у1чь
+у3ше
+у3ши
+у2шл
+уш1ла
+у2шп
+2уэ
+у1я
+уя2з
+1ф
+фа2б1
+фа2гн
+фа1зо
+фан2д
+фанд1р
+фа1тр
+фа2х
+3фаш
+фаэ1
+2ф1б
+2ф1в
+2фг
+2ф1д
+фев1р
+фед1р
+фе1о3
+фе2с1к
+ф4и
+фиа2к1
+фи2гл
+фи2ж
+фи2зо
+фи2нин
+фи1о
+3фит
+2ф1к
+ф2ла
+ф2ли
+ф2ло
+2фм
+2ф1н
+2фобъ
+3фон
+фо2рв
+2ф1орг
+фор3тр
+фо1ру
+фос1к
+3фот
+фото3п
+ф1раб
+фра1з
+фра1с
+ф1рат
+ф2рен
+фре2с
+ф1ри
+ф2риж
+ф2риз
+ф1ро
+ф2рон
+ф1ру
+2ф3с
+2ф1т
+ф2тм
+ф2тор
+2ф1у2п
+фу3тл
+2фуф
+2фф
+2ф1ч
+2фш2
+2фь.
+ф2ю1
+1ха
+ха2бл
+ха2д
+2х1ак
+хан2д
+хао3
+х1арш
+2х1б
+1х2в
+2х3ве
+2х3ви
+х3вы
+2хг
+х3д2
+1хе
+хео3
+х1з2
+1хи
+хиат1
+хие2
+2х1изы
+хи1с2
+х1к2
+х1лав
+х1лас
+х1лат
+х1лац
+1хлеб
+х2лес
+х1лет
+х3ло.
+х2лоп
+1х2лор
+х1лу
+1х2му
+2х1н
+3х2ны
+1хо
+2х1о2к
+хоп2
+хо2пе
+хо2пор
+хо1ру
+х1осм
+2х1осн
+хоф2
+хох1л
+хоя2
+хп2
+х1раз
+1хран
+х1ра1с2
+х1рей
+хри2пл
+х2рис
+х1ров
+1хром
+хро2мч
+х1ры
+х1ря
+2х1с2
+2х1т
+1ху.
+х1у2г
+2хуе
+2хуй
+1хун
+х1у2р
+ху3ра
+1хус
+1хуш
+2хую
+х1х2
+2х1ч2
+2хш
+хью1
+1ц
+ца1
+3ца.
+3цам
+ца2пл
+3цах
+2ц1б
+ц2ве
+2цвы
+2цг
+2ц1д
+це1з
+це1к
+це1от
+цеп1л
+цес2л
+це1т
+2цетат
+2ц1з
+ци1
+ци2к1
+цик3л
+ци2ол
+цип2
+ци2ск
+циу3
+циф1р
+2ц1к2
+2ц1л
+2цм
+2ц1н
+ц1о2б
+2ц1о2д
+2ц1от
+2цп2
+2ц1р
+2ц1с
+2ц1т
+3цу
+2цц
+2ц3ш2
+3цы
+цы2п
+цып3л
+цю1
+1ча
+ча2др
+ча2дц
+ча2ево
+ча2евы
+ча2ер
+част1в
+ча1сте
+ча1сту
+ча1стя
+3чато
+3чаты
+2ч1б
+ч1в
+2ч1д
+1че
+че1вл
+че2гл
+че1о
+чер2с
+черст1
+че1сл
+ч2ж
+чжо2
+1чи
+3чик
+3чиц
+2ч1к
+1ч2ла
+ч2ле
+ч3лег
+ч3леж
+2чли
+ч2ли.
+1ч2ло
+1чм
+2чма
+2чме
+ч2мо
+2ч1н
+3чо
+2ч1с
+2ч1та
+ч2те
+2чтм
+1чу
+3чук
+ч2х
+2ч1ч
+2чь.
+1чье
+1чьи
+2чьс
+2чьт
+1чью
+1чья
+1ш
+ша2бл
+ша2гн
+ша2г1р
+ша2др
+шан2кр
+шар3т2
+ша1ст
+ша1тро
+2ш1б
+ш2в
+ш3вен
+ше2гл
+ше1к
+ше1о2
+ше3пл
+ше1с2
+ши2бл
+ши2пл
+шиф1р
+2ш1к2
+3ш2кол
+2ш1лей
+2шлен
+ш2ли.
+2шлив
+2шлил
+ш2лин
+ш2лис
+ш2лите
+ш2лиф
+ш2ло.
+2шлов
+ш2лог
+ш1лы
+ш2лю
+2шляе
+2шляк
+ш2ляп
+2шлят
+2шляч
+2шляю
+2шм
+3ш2мы
+4ш3мы.
+2ш1н
+4шни
+ш2нур
+ш2п2
+ш3пр
+2ш1р
+2ш1с
+ш1ти
+2штс
+шу2ев
+шуст1
+2шф
+ш1х
+2шц
+2ш1ч
+2шь
+4шь.
+3шье
+3шьи
+3шью
+3шья
+ш2ю1
+1щ
+2щ3в2
+ще1б2л
+ще2гл
+щед1р
+щеи2
+щеис1
+ще1с
+ще1х
+щеш2
+ще3шк
+щи2п1л
+2щм
+2щ1н
+2щ1р
+2щь.
+ъ1
+ъе2г
+ъе2д
+ъе3до
+ъе2л
+ъ2е2р
+ъе2с
+ъе2хи
+ъю2
+ъя2
+ъя3н
+ы1
+ы2бл
+ы3га
+ы3ги
+ыг2л
+ы2гн
+ы2дл
+ыд2ре
+ы2д1ро
+ы2дря
+ые2
+ы3ж2д
+ыз2ва
+ыз2д
+ы2зл
+ы2зн
+ыз2на
+ыи2
+ыиг1
+ы2к1в
+ык2л
+ы2к3ло
+ыко1з
+ык1с
+ы2ль
+ы2мч
+ынос3л
+ы3по
+ыра2с3
+ыр2в
+ыре2х
+ы3са
+ы3се
+ыс1ки
+ыс1ку
+ы2сн
+ы3со
+ыс2п
+ы2сх
+ыс2ч
+ы2сш
+ыт1ви
+ыт2р
+ы3тью
+ы3тья
+ыу2
+ы2ш1л
+ы3шь
+ь1
+ьб2
+ь2вя
+ь2дц
+ь2е
+ье1зо
+ье1к
+ье2с1к
+ь2зн
+ь2и1
+ь2кл
+ьми3д
+ьми3к
+ьмо1
+ьне2о
+ь2о
+ь2п1л
+ь3п2то
+ьс2к
+ь2сн
+ь2сти
+ь2стя
+ь2т1амп
+ьти3м
+ь2тм
+ь2тот
+ь2траб
+ьт2ре
+ьт2ру
+ьт2ры
+ьхо2
+ьхоз1
+ь2ща
+ь2ще
+ь2щу
+ь2ю
+ь2я
+ья1в
+ь3ягс
+1э
+э1в
+эв1р
+2эг
+эд1р
+эк1л
+экс1
+эк2ст
+эле1о
+э2м
+э3ма
+э2н
+э3нь
+эо2з
+э2п
+эпи3к
+э1ре
+э1ри
+эри4тр
+эро1с2
+э1ру
+э1ры
+эс1
+эск2
+эс3м
+э2со
+эс3те
+эс2т1р
+э2те
+этил1а
+эт1ра
+э2ф
+эх2
+эхо3
+э2ц
+эя2
+1ю
+ю1а
+ю1б
+ю2бв
+ю2бл
+ю2б1ре
+ю1в
+ю1дь
+ю1е
+юз2г
+юзи2к
+ю1зо
+ю1и
+ю2идал
+ю1к
+ю2к1в
+ю1ла
+ю1ле
+ю2ли
+ю1лю
+2юм
+ю2мч
+ю2нь
+ю1о1
+ю1ра
+ю1ре
+юре4м
+ю1ри
+юри2ск
+ю1ро
+ю1ру
+ю1ры
+ю2с1к
+ю1ста
+ю1сте
+ю1сто
+ю1стя
+ю1ти
+ю1то
+ю1ту
+ю1ты
+ю1х
+юха1с
+ю1ч
+ю2щь
+ю1я
+я2бр
+яб1ра
+яб3ре
+яб1ри
+яб3рю
+3явикс
+я1во
+я1ву
+я1в2х
+я2г1л
+я2гн
+яд1в
+яд1р
+я1е
+яз2гн
+я1зо
+я1и
+я1к
+я2к1в
+я2к1л
+як1с
+я1л
+я2ль
+ям2б3л
+я2мь
+я3на
+янс2
+я1ра
+я1ри
+я1ро
+я1рь
+яс1к
+яс1л
+яс2т
+яст3в
+я1сто
+яст1р
+я1та
+ят3в
+я3ти
+яти1з
+я1то
+я1ту
+я1ты
+я3тью
+я3тья
+я1тя
+я1у
+ях1л
+я1ху
+яце1
+я2шл
+2яю.
+2я1я
+.бо2дра
+.вст2р
+.доб2рел
+.до1б2ри
+.об2люю
+.об2рее
+.об2рей
+.об2рею
+.об2рив
+.об2рил
+.об2рит
+.па2н1ис
+.пом2ну
+.реа2н
+.ро2с3пи
+.со2пла
+а2ньш
+атро2ск
+безу2с
+бино2ск
+виз2гн
+выб2ре
+гст4р
+ди1с2лов
+дос2ня
+дро2ж3ж
+2дружей
+е2мьд
+е2о3плато
+е2о3пози
+ере3с2со
+4ж3дик
+4ж3дич
+заи2л
+зао2з
+2з1а2хав
+заю2л
+з2рят
+зу2мь
+6зь.
+и2л1а2мин
+илло3к2
+й2кь
+ла2б1р
+лу3с4н
+ме2динс
+ме2д1о2см
+мети2л1ам
+мис4с3н
+нар2ват
+не2о3ре
+ни1с2кол
+ни4сь.
+но4л1а2мин
+н2трасс
+о2д1о2бол
+о4ж3дев
+о1и2с1тр
+ойс4ков
+о2м3че.
+они3л2ам
+он2трат
+о2плюс
+осо4м3н
+оти4дн
+пере1с2н
+по2доде
+по2д1у2ро
+пое2ж
+по2стин
+прем2но
+приче2с1к
+пти4дн
+редо4пл
+реж4ди
+рни3л2а3м
+роб2лею
+2сбрук1
+со2стрит
+со3т2кал
+2стче.
+2стьт
+сы2мит
+2сься.
+6тр.
+тро2етес
+6хуя.
+ы2рьм
+ыя2вя
+ьбат2
+а1вё
+а2двё
+а1ё
+аз3вёз
+а1лё
+2алёк
+2амёт
+ам2нёт
+а1рё
+ас3тём
+а1тьё
+1бё
+бё2д1р
+б3лён
+б2лёс1к
+б2люё
+б1рёк
+б2рём
+б2рёх
+1веё
+3везё
+вёд1р
+1вёз
+2вёрд
+1вёс
+в2лёк
+в2лёт
+1вмё
+в2нёс
+2в1рён
+3всё3
+1вьё
+г1лё
+г2лёт
+г2нёв
+г3нён
+г2ноё
+д1вё
+1дё
+.доб2рёл
+2доплё
+до2прё
+д1рё
+д2рёб
+2д3рёж
+д2рём
+1дрёма
+1дрёмы
+2д3рён
+дъё2м
+1дьё
+еб1рён
+е1вё
+2евёр
+2е1врё
+е2глё
+е1ё
+2ежё
+е3зё
+е1лё
+2епё
+ер1вё
+е1рё
+ерё3до
+ерё1к2
+ес2чёт
+ет1вё
+е1тьё
+2ёб
+ё1бра
+ёб1ры
+ё1ве
+ё1во
+2ё1вре
+ё1ву
+ё1дру
+2ё3душ
+2ёже
+ё3зе
+ёз1о2г
+ё1зом
+ё1ка
+ё1ки
+2ё1ко
+2ё1кр
+ёк2ро
+ё1ку
+ё1ла
+ё1ле
+ё1лу
+ё1лы
+2ёмуж
+ё2мч
+ё3на
+ён2д1р
+ёнс2
+ёпат2
+2ёпе
+ё2пл
+ё3пла
+ёп1лу
+ё3плы
+ё4пн
+2ёпо
+ё4пт
+ё1ра
+ё1ре
+ё3ре.
+ё1ри
+ё1ро
+ёр3ск
+ё1ру
+ё1ры
+ё3с2а
+ё1ск
+ё2с1ка.
+ё2ске
+ё4с1ку.
+2ёсл
+ё3со
+ё1ст
+ёс2тан
+ё3сту
+ё1та
+2ётеч
+ё1ти
+ё1то
+ёто1с
+ёт1р
+ё1ту
+ё1ты
+ё1тю
+ё1тя
+ёха2т
+ёх1ато
+ёх3вал
+ёх3лоп
+ёх1опо
+ёх1ру
+3жёв
+жё1с2
+ж2жё
+за3мнё
+з1вё
+з2вёз
+1зё
+з2наё
+2знё
+1з2о3рё
+з2отё
+зот2рё
+3зуё
+зъё2м
+2зымё
+2и1вё
+иг1рён
+и1ё
+их1рё
+1каё
+1кё
+к3лён
+к2роё
+3куё
+ла1стё
+лё3до
+лё1з2о3
+лёк1л
+1лён
+лё2ск
+лё4ска
+1лёх
+2лоён
+1луё
+3льё
+1льщё
+3м2нёш
+3м2щё
+нд2рё
+не3ё
+1нё
+нё1б2
+3номё
+1ньё
+од3рёб
+о1ё
+оё2жи
+о1лё
+2омё
+о3м2нём
+о3м2нёт
+о2п1лёй
+о1рё
+о2скё
+от1вё
+2о3тёк
+о3тёр
+от1рёк
+от1рёш
+о3фё
+пё1
+пё2ст1р
+пё2тр
+2плён
+п2лёнк
+плёс1к
+п1лёю
+поё2ж
+3прёт
+причё2с1к
+р2блё
+1рвёт
+.рё2бр
+1рёзк
+рё1зна
+1рё1зо
+рёз2у
+1рёкш
+3рёмо
+1рёнк
+рё3ста
+рё3сто
+род2лё
+роё2м
+1рьё
+с2дё
+се3стё
+1с2ё
+сёкс4
+сё2ст
+сёст1р
+2скуё
+с1лёт
+с2тё
+1стёл
+1стён.
+с3тёт.
+с3тёте
+стё3х
+с3тёш
+с3т2лё
+счё2с1к
+1сьё
+т1вёл
+т1воё
+1т2ё
+тё2гн
+тё1зо
+3тёка
+тёк1л
+3тёкш
+тё4п1л
+тёр3к
+тё2ска
+тё2с1ки
+тё2с1ко
+тё2ску
+тё2хо
+3т2кёт
+т1ревё
+3т2рё2х
+т2рёшь
+тро2етёс
+3тьё
+уг2нё
+уг1рё
+.уё2
+у1ё
+у1лё
+у1рё
+у1стё
+у3тёр
+у1тьё
+у2чёб
+у3шё
+2х3вё
+1хлёб
+х2лёс
+ц2вё
+1чё
+чёр2с
+чёрст1
+.чё2с1к
+ч2тё
+1чьё
+2шлён
+3шьё
+ъ2ё2р
+ыд2рё
+ырё2х
+ы3сё
+ь2ё
+ьё1зо
+ь2щё
+ю1ё
+яб3рё
+.не8
+8не.
+8бъ.
+8въ.
+8гъ.
+8дъ.
+8жъ.
+8зъ.
+8къ.
+8лъ.
+8мъ.
+8нъ.
+8пъ.
+8ръ.
+8съ.
+8тъ.
+8фъ.
+8хъ.
+8цъ.
+8чъ.
+8шъ.
+8щъ.} \ No newline at end of file
diff --git a/tex/context/patterns/lang-ru.rme b/tex/context/patterns/lang-ru.rme
new file mode 100644
index 000000000..bcb3ef768
--- /dev/null
+++ b/tex/context/patterns/lang-ru.rme
@@ -0,0 +1,77 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: TODO:WRITEME (2003-03-10)
+% Author: Alexander I. Lebedev <swan at scon155.phys.msu.su>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Russian hyphenation patterns, version 2003/03/10
+% Copyright 1999-2003 Alexander I. Lebedev <swan@scon155.phys.msu.su>
+%
+% This program may be distributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.2 or any later
+% version.
+%
+% Patterns were generated with patgen from a 990,000-word list and then
+% manually corrected.
+%
+% The program consists of the files ruhyphal.tex, cyryoal.tex and two
+% document files README.ruhyphal and hyphen.rules. The file cyryoal.tex
+% can be regenerated using mkcyryo script (a part of ruhyphen package)
+% and the latest release of rus-ispell dictionaries
+% <ftp://scon155.phys.msu.su/pub/russian/ispell/>. \ No newline at end of file
diff --git a/tex/context/patterns/lang-sk.hyp b/tex/context/patterns/lang-sk.hyp
new file mode 100644
index 000000000..ee41c9603
--- /dev/null
+++ b/tex/context/patterns/lang-sk.hyp
@@ -0,0 +1,12 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sk.rme
+
+% used: a b d e i k m n o p r s t y ó ť
+
+\hyphenation{
+dosť
+me-tó-da
+me-tó-dy
+ne-do-stat-ka-mi
+sep-tem-bra} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sk.pat b/tex/context/patterns/lang-sk.pat
new file mode 100644
index 000000000..c2b22beb0
--- /dev/null
+++ b/tex/context/patterns/lang-sk.pat
@@ -0,0 +1,2474 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sk.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v w x y z á ä é í ó ô ú ý č ď ľ ň ŕ š ť ž
+
+\patterns{
+a1
+á1
+ä1
+e1
+é1
+i1
+í1
+o1
+ó1
+ô1
+u1
+ú1
+y1
+ý1
+i2a
+i2á
+i2e
+i2u
+o2u
+c2h
+d2z
+d2ž
+2b1b
+2b1c
+2b1č
+2b1d
+2b1ď
+2b1f
+2b1g
+2b1h
+2b1c2h
+2b1j
+2b1k
+2b1l
+2b1ľ
+2b1m
+2b1n
+2b1ň
+2b1p
+2b1r
+2b1s
+2b1š
+2b1t
+2b1ť
+2b1v
+2b1w
+2b1x
+2b1z
+2b1ž
+2b1d2z
+2b1d2ž
+2c1b
+2c1c
+2c1č
+2c1d
+2c1ď
+2c1f
+2c1g
+2c1c2h
+2c1j
+2c1k
+2c1l
+2c1ľ
+2c1m
+2c1n
+2c1ň
+2c1p
+2c1r
+2c1s
+2c1š
+2c1t
+2c1ť
+2c1v
+2c1w
+2c1x
+2c1z
+2c1ž
+2c1d2z
+2c1d2ž
+2č1b
+2č1c
+2č1č
+2č1d
+2č1ď
+2č1f
+2č1g
+2č1h
+2č1c2h
+2č1j
+2č1k
+2č1l
+2č1ľ
+2č1m
+2č1n
+2č1ň
+2č1p
+2č1r
+2č1s
+2č1š
+2č1t
+2č1ť
+2č1v
+2č1w
+2č1x
+2č1z
+2č1ž
+2č1d2z
+2č1d2ž
+2d1b
+2d1c
+2d1č
+2d1d
+2d1ď
+2d1f
+2d1g
+2d1h
+2d1c2h
+2d1j
+2d1k
+2d1l
+2d1ľ
+2d1m
+2d1n
+2d1ň
+2d1p
+2d1r
+2d1s
+2d1š
+2d1t
+2d1ť
+2d1v
+2d1d2z
+2d1d2ž
+2ď1b
+2ď1c
+2ď1č
+2ď1d
+2ď1ď
+2ď1f
+2ď1g
+2ď1h
+2ď1c2h
+2ď1j
+2ď1k
+2ď1l
+2ď1ľ
+.as4t4ro3
+.atmo3
+.a2u1to3
+2ď1m
+2ď1n
+2ď1ň
+2ď1p
+2ď1r
+2ď1s
+2ď1š
+2ď1t
+2ď1ť
+2ď1v
+2ď1z
+2ď1ž
+2ď1d2z
+2ď1d2ž
+2f1b
+2f1c
+2f1č
+2f1d
+2f1ď
+2f1f
+2f1g
+2f1h
+2f1c2h
+2f1j
+2f1k
+2f1l
+2f1ľ
+2f1m
+2f1n
+2f1ň
+2f1p
+2f1r
+2f1s
+2f1š
+2f1t
+2f1ť
+2f1v
+2f1z
+2f1ž
+2f1d2z
+2f1d2ž
+2g1b
+2g1c
+2g1č
+2g1d
+2g1ď
+2g1f
+2g1g
+2g1h
+2g1c2h
+2g1j
+2g1k
+2g1l
+2g1ľ
+2g1m
+2g1n
+2g1ň
+2g1p
+2g1r
+2g1s
+2g1š
+2g1t
+2g1ť
+2g1v
+2g1z
+2g1ž
+2g1d2z
+2g1d2ž
+2h1b
+2h1c
+2h1č
+2h1d
+2h1ď
+2h1f
+2h1g
+2h1h
+2h1c2h
+2h1j
+2h1k
+2h1l
+2h1ľ
+2h1m
+2h1n
+2h1ň
+2h1p
+2h1r
+2h1s
+2h1š
+2h1t
+2h1ť
+2h1v
+2h1z
+2h1ž
+2h1d2z
+2h1d2ž
+2c2h1b
+2c2h1c
+2c2h1č
+2c2h1d
+2c2h1ď
+2c2h1f
+2c2h1g
+2c2h1h
+2c2h1c2h
+2c2h1j
+2c2h1k
+2c2h1l
+2c2h1ľ
+2c2h1m
+2c2h1n
+2c2h1ň
+2c2h1p
+2c2h1r
+2c2h1s
+2c2h1š
+2c2h1t
+2c2h1ť
+2c2h1v
+2c2h1w
+2c2h1ž
+2c2h1d2z
+2c2h1d2ž
+2j1b
+2j1c
+2j1č
+2j1d
+2j1ď
+2j1f
+2j1g
+2j1h
+2j1c2h
+2j1j
+2j1k
+2j1l
+2j1ľ
+2j1m
+2j1n
+2j1ň
+2j1p
+2j1r
+2j1s
+2j1š
+2j1t
+2j1ť
+2j1v
+2j1w
+2j1x
+2j1z
+2j1ž
+2j1d2z
+2j1d2ž
+2k1b
+2k1c
+2k1č
+2k1d
+2k1ď
+2k1f
+2k1g
+2k1h
+2k1c2h
+2k1j
+2k1k
+2k1l
+2k1ľ
+2k1m
+2k1n
+2k1ň
+2k1p
+2k1r
+2k1s
+2k1š
+2k1t
+2k1ť
+2k1v
+2k1w
+2k1x
+2k1z
+2k1ž
+2k1d2z
+2k1d2ž
+2l1b
+2l1c
+2l1č
+2l1d
+2l1ď
+2l1f
+2l1g
+2l1h
+2l1c2h
+2l1j
+2l1k
+2l1l
+2l1ľ
+2l1m
+2l1n
+2l1ň
+2l1p
+2l1r
+2l1s
+2l1š
+2l1t
+2l1ť
+2l1v
+2l1z
+2l1ž
+2l1d2z
+2l1d2ž
+2ľ1b
+2ľ1c
+2ľ1č
+2ľ1d
+2ľ1ď
+2ľ1f
+2ľ1g
+2ľ1h
+2ľ1c2h
+2ľ1j
+2ľ1k
+2ľ1l
+2ľ1ľ
+2ľ1m
+2ľ1n
+2ľ1ň
+2ľ1p
+2ľ1r
+2ľ1s
+2ľ1š
+2ľ1t
+2ľ1ť
+2ľ1v
+2ľ1z
+2ľ1ž
+2ľ1d2z
+2ľ1d2ž
+2m1b
+2m1c
+2m1č
+2m1d
+2m1ď
+2m1f
+2m1g
+2m1h
+2m1c2h
+2m1j
+2m1k
+2m1l
+2m1ľ
+2m1m
+2m1n
+2m1ň
+2m1p
+2m1r
+2m1s
+2m1š
+2m1t
+2m1ť
+2m1v
+2m1z
+2m1ž
+2m1d2z
+2m1d2ž
+2n1b
+2n1c
+2n1č
+2n1d
+2n1ď
+2n1f
+2n1g
+2n1h
+2n1c2h
+2n1j
+2n1k
+2n1l
+2n1ľ
+2n1m
+2n1n
+2n1ň
+2n1p
+2n1r
+2n1s
+2n1š
+2n1t
+2n1ť
+2n1v
+2n1w
+2n1x
+2n1z
+2n1ž
+2n1d2z
+2n1d2ž
+2ň1b
+2ň1c
+2ň1č
+2ň1d
+2ň1ď
+2ň1f
+2ň1g
+2ň1h
+2ň1c2h
+2ň1j
+2ň1k
+2ň1l
+2ň1ľ
+2ň1m
+2ň1n
+2ň1ň
+2ň1p
+2ň1r
+2ň1s
+2ň1š
+2ň1t
+2ň1ť
+2ň1v
+2ň1z
+2ň1ž
+2ň1d2z
+2ň1d2ž
+2p1b
+2p1c
+2p1č
+2p1d
+2p1ď
+2p1f
+2p1g
+2p1h
+2p1c2h
+2p1j
+2p1k
+2p1l
+2p1ľ
+2p1m
+2p1n
+2p1ň
+2p1p
+2p1r
+2p1s
+2p1š
+2p1t
+2p1ť
+2p1v
+2p1w
+2p1x
+2p1z
+2p1ž
+2p1d2z
+2p1d2ž
+2r1b
+2r1c
+2r1č
+2r1d
+2r1ď
+2r1f
+2r1g
+2r1h
+2r1c2h
+2r1j
+2r1k
+2r1l
+2r1ľ
+2r1m
+2r1n
+2r1ň
+2r1p
+2r1r
+2r1s
+2r1š
+2r1t
+2r1ť
+2r1v
+2r1w
+2r1x
+2r1z
+2r1ž
+2r1d2z
+2r1d2ž
+2s1b
+2s1c
+2s1č
+2s1d
+2s1ď
+2s1f
+2s1g
+2s1h
+2s1c2h
+2s1j
+2s1k
+2s1l
+2s1ľ
+2s1m
+2s1n
+2s1ň
+2s1p
+2s1r
+2s1s
+2s1š
+2s1t
+2s1ť
+2s1v
+2s1z
+2s1ž
+2s1d2z
+2s1d2ž
+2š1b
+2š1c
+2š1č
+2š1d
+2š1ď
+2š1f
+2š1g
+2š1h
+2š1c2h
+2š1j
+2š1k
+2š1l
+2š1ľ
+2š1m
+2š1n
+2š1ň
+2š1p
+2š1r
+2š1s
+2š1š
+2š1t
+2š1ť
+2š1v
+2š1w
+2š1x
+2š1z
+2š1ž
+2š1d2z
+2š1d2ž
+2t1b
+2t1c
+2t1č
+2t1d
+2t1ď
+2t1f
+2t1g
+2t1h
+2t1c2h
+2t1j
+2t1k
+2t1l
+2t1ľ
+2t1m
+2t1n
+2t1ň
+2t1p
+2t1r
+2t1s
+2t1š
+2t1t
+2t1ť
+2t1v
+2t1w
+2t1x
+2t1z
+2t1ž
+2t1d2z
+2t1d2ž
+2ť1b
+2ť1c
+2ť1č
+2ť1d
+2ť1ď
+2ť1f
+2ť1g
+2ť1h
+2ť1c2h
+2ť1j
+2ť1k
+2ť1l
+2ť1ľ
+2ť1m
+2ť1n
+2ť1ň
+2ť1p
+2ť1r
+2ť1s
+2ť1š
+2ť1t
+2ť1ť
+2ť1v
+2ť1w
+2ť1x
+2ť1z
+2ť1ž
+2ť1d2z
+2ť1d2ž
+2v1b
+2v1c
+2v1č
+2v1d
+2v1ď
+2v1f
+2v1g
+2v1h
+2v1c2h
+2v1j
+2v1k
+2v1l
+2v1ľ
+2v1m
+2v1n
+2v1ň
+2v1p
+2v1r
+2v1s
+2v1š
+2v1t
+2v1ť
+2v1v
+2v1w
+2v1x
+2v1z
+2v1ž
+2v1d2z
+2v1d2ž
+2z1b
+2z1c
+2z1č
+2z1d
+2z1ď
+2z1f
+2z1g
+2z1h
+2z1c2h
+2z1j
+2z1k
+2z1l
+2z1ľ
+2z1m
+2z1n
+2z1ň
+2z1p
+2z1r
+2z1s
+2z1š
+2z1t
+2z1ť
+2z1v
+2z1z
+2z1ž
+2z1d2z
+2z1d2ž
+2ž1b
+2ž1c
+2ž1č
+2ž1d
+2ž1ď
+2ž1f
+2ž1g
+2ž1h
+2ž1c2h
+2ž1j
+2ž1k
+2ž1l
+2ž1ľ
+2ž1m
+2ž1n
+2ž1ň
+2ž1p
+2ž1r
+2ž1s
+2ž1š
+2ž1t
+2ž1ť
+2ž1v
+2ž1z
+2ž1ž
+2ž1d2z
+2ž1d2ž
+2d2z1k
+2d2z1n
+2d2z1r
+2d2z1s
+2d2ž1š
+2x1t
+2x1n
+2b1ŕ
+2ŕ1b
+2d2z1ŕ
+2ŕ1d2z
+2d2z1ľ
+2ŕ1d2ž
+2d2ž1ľ
+a1í2
+a1o2
+e1á2
+e1í2
+e1o2
+e1ó2
+e1u2
+i1o2
+o1a2
+o1e2
+o1i2
+o1o2
+u1a2
+u1á2
+u1i2
+u1í2
+u1o2
+u1u2
+y1a2
+y1e2
+y1ó2
+y1u2
+a2u1
+a2i1
+b2l3b
+3b2l3č
+b2l3c2h
+3b2l3k
+3b2ľ3k
+3b2l3ň
+b2l3š
+b2ľ3š
+3b2r3b
+b2r3d
+3b2r3k
+3b2ŕ3k
+3b2r3l
+3b2ŕ3ľ
+3b2r3n
+3b2r3ň
+3b2r3v
+b2r3z
+b3s2c
+b3s2t
+c3k2t
+3c2r3č
+3c2ŕ3č
+3c2r3k
+3c2ŕ3k
+c3t2v
+3č2l3n
+3č2r3č
+č2r3p
+3č2r3t
+3č2r3v
+d3c4h4n
+3d2l3b
+3d2l3h
+d2l3n
+3d2l3ž
+3d2ľ3ž
+3d2r3d
+3d2r3g
+d2r3l
+3d2r3k
+3d2r3m
+d2r3n
+3d2r3v
+3d2r3z
+3d2r3ž
+3d2ŕ3ž
+d3s2v
+d3s2t
+d3v2r
+3f2r3č
+3f2r3f
+3f2r3k
+3f2ŕ3k
+3f2r3m
+3f2r3n
+3g2l3g
+3g2r3c
+3g2r3g
+3h2l3b
+3h2ľ3b
+3h2l3t
+3h2m2l
+3h2r3b
+3h2ŕ3b
+3h2r3č
+3h2r3d
+3h2r3d2z
+3h2r3k
+3h2r3m
+3h2r3n
+3h2r3ň
+3h2r3t
+3h2r3v
+3c2h2l3p
+3c2h2r3b
+3c2h2r3č
+c2h2r3c4h
+3c2h2r3l
+3c2h2r3t
+j2c2h3n
+j3s2t
+j3š2le
+j3t2m
+j3t2r
+3k2l3b
+3k2ľ3b
+3k2l3č
+3k2l3z
+3k2ľ3z
+k2r3b
+3k2r3č
+3k2ŕ3č
+3k2ŕ3d
+3k2r3k
+3k2ŕ3k
+3k2ŕ3m
+3k2r3p
+3k2r3s
+3k2r3t
+3k2r3v
+k3s2ľ
+k2s3n
+k3t2r
+l3d2r
+ľ3k2n
+l3t2r
+m3b2l
+m3b2ľ
+m3b2r
+m3f2l
+m3f2r
+m3k2n
+3m2l3č
+3m2l3k
+m3p2l
+m3p2ľ
+m3p2r
+m3p2s
+3m2r3h
+m2r3c4h
+3m2r3k
+m2r3l
+m2r3š
+m2r3t
+3m2r3v
+3m2r3z
+3m2ŕ3z
+m3s2t
+m3š2t
+n3dľa
+n3d2r
+n3f2l
+n3f2r
+n3g2h
+n3g2l
+n3g2ľ
+n2g3n
+n3g2r
+n3g2v
+n3k2c
+n3k2h
+n3k2n
+n3k2r
+n3k2v
+n3s2c
+n3š2p
+n3š2t
+n3t2g
+n3t2l
+n3t2n
+n3t2r
+n2ž3m
+3p2l3n
+3p2l3ň
+3p2ľ3ň
+3p2l3z
+3p2ľ3z
+3p2ľ3ž
+3p2ŕ3c
+3p2r3č
+3p2r3d
+3p2r3s
+3p2r3š
+p3š2ť
+p3t2r
+r2b3n
+r3g2ľ
+r3g2r
+r3g2s
+r3k2d
+r2k3n
+r3k2t
+r3k2v
+r3p2c
+r3p2č
+r3p2r
+r3s2p
+r3š2č
+r3š2l
+r3š2r
+r2t3m
+r3t2n
+r2t3ň
+r3t2r
+r3t2v
+3s4c4h4n
+s2k3l
+s2k3m
+s2k3n
+s3k2r
+s3k2v
+3s2l3n
+3s2l3ň
+3s2l3z
+s3p2r
+3s2r3d
+3s4ŕ3k
+3s4r3š
+s3t2k
+ôs4t3k2ár3s4t4v
+s2t3l
+s3t2m
+s2t3n
+s3t2r
+s3t2v
+s2ť3h
+s2ť3m
+s2ť3p
+š3k2l
+š3k2r
+š3t2r
+3š4t4v
+t3k2l
+t3k2n
+3t2l3č
+3t2l3k
+t3h2l
+3t4r3č
+3t4r3h
+3t2r3l
+3t2r3k
+3t2r3m
+a4t2r3n
+3t2r3n
+3t2ŕ3n
+3t2ŕ3ň
+3t4r3p
+3t2r3v
+3t2ŕ3ž
+3v2l3č
+3v2ľ3č
+3v2l3h
+3v2l3k
+3v2l3n
+3v2r3h
+3v2r3c2h
+3v2r3l
+3v2ŕ3š
+3v2ŕ3t
+3v2r3z
+3v2ŕ3z
+3v4z4d
+3v4z4h
+3v4z4n
+3v3z2ť
+z3d2n
+noz5d4r
+3z4d4r
+3z4d4v
+z3g2n
+3z4h4r
+3z2r3k
+3z2r3n
+3z4v4l
+ž2d3n
+3ž2l3č
+3ž2l3t
+3ž2ľt
+3ž2r3ď
+ž3s2t
+x3p2l
+x3p2r
+x3t2r
+3b2l4č3n
+3b2ľ4č3k
+3b2l4n3k
+3b2ľ3k2n
+3b2r4b3l
+3b2r4b3t
+3b2r4č3k
+3b2r4d3c
+3b2ŕ4d3n
+3b2r3h2l
+3b4ŕ4k3n
+3b4r4m3b
+3b4r4n3č
+3b4r4n3k
+3b4r4š3l
+3b4r4t3l
+3b4r4t3n
+3b4r4v3n
+3b4r4z3d
+3b4r4z3l
+3b4r4z3n
+b3s2t2r
+3c4ŕ4č3k
+3c4r4k3n
+3c4v4r3č
+3c4v4r3k
+3c4v4ŕ3k
+3c4v4r3l
+3č4l4n3k
+3č4r3č4r
+3č4r4c4h3n
+3č4r4p3k
+3č4r4p3n
+3č4r4t3n
+3č4v4r3k
+3č4v4r3l
+3d4l4b3n
+d4ľ4ž3k
+d4l4ž3n
+d4ľ4ž3n
+3d4r4c3n
+3d4r4g3ľ
+3d4r4g3n
+3d4r4h3n
+3d4r4n3č
+3d4r4n3k
+3d4r4s3n
+3d4r4ž3b
+3d4r4ž3k
+3f4r4c3k
+3f4r4c3n
+3f4r4č3k
+3f4r4f3l
+3f4r4k3n
+3f4r4n3d
+3f4r4n3d4ž
+3f4r4n3g
+3f4r4n3k
+3g4l4g3n
+3g2r4c3k
+3h2ľ4b3k
+3h2l3t4n
+3h2r4b3č
+3h2r4č3k
+h2r4d3l
+3h2r4g3ľ
+3h2r4k3ľ
+3h2r4k3n
+3h2ŕ4k3n
+3h2r4n3č
+3h2r4s3t
+3h2r4s3ť
+3ch4ľ4p3k
+3c2h2r4b3t
+3c2h2r4c4h3l
+3c2h2r4c4h3ľ
+3c4h4r4s3t
+j3s4t4r
+j3s4t4v
+3k4l4b3č
+3k4l4b3k
+3k4l4z3k
+3k4l4z3n
+3k4r4č3m
+3k4r4č3n
+3k4r4k3v
+3k4r4m3n
+3k4ŕ4m3n
+3k4r4p3č
+3k4r4s3t
+3k4r4š3t
+3k4r4t3k
+3k4r4v3n
+3m2l4č3k
+3m2ľ4k3n
+3m2ľ4k3v
+3m2l4s3n
+m3p4r3p
+m3p4r3v
+3m4r4k3n
+3m4r4k3v
+3m4r4m3l
+3m4r4n3č
+3m4r4n3k
+3m4ŕ4š3t
+3m4ŕ4t3v
+3m4r4z3l
+3m4r4z3k
+3m4r4z3n
+n4g3s4t
+n3š4t4r
+n3t4l3m
+3p2l4z3l
+3p2ľ4z3n
+p2ŕ4c3n
+3p2r4č3k
+3p4r4d3n
+3p4ŕ4c2h3n
+3p4r4s3k
+3p4r4t3k
+r2s3k4d
+r2s3k4t
+čer4s3t4v
+3s4l4n3k
+3s4k4r3z
+3s4m4r3c
+3s4m4r3č
+3s4m4r3d
+3s4m4r3k
+3s4m4r3t
+3s4p4r3c4h
+3s4r4d3c
+3s4r4k3n
+3s4r4s3t
+3s4t4ľ3k
+s3t4r3b
+ko4s3t4r3č
+3s4t4r3č
+3s4t4ŕ3h
+3s4t4r3k
+s4t4r3v
+4s4ť5k4rát
+3š4k4l3b
+3š4k4r3k
+3š4k4ŕ3k
+maš3k4r3t
+3š4k4r3t
+3š4p4l3h
+3š4t4r3b
+š4t4r3n
+3š4t4v4r3t
+3š4t4v4r3ť
+3t2ľ4c3ť
+3t2r4b3l
+t2r4č3k
+3t2r4d3l
+3t2r4h3l
+3t2r4h3n
+3t2r4k3n
+3t2r4k3v
+3t2r4m3n
+3t4ŕ4p3n
+3t2r4ž3k
+3t2r4ž3n
+3t2v4r3d
+3t2v4r3d4z
+3t2v4ŕ3d4z
+3v2l4h3č
+3v2l4h3k
+3v2l4h3n
+3v2l4n3k
+3v2l4n3n
+3v4r4h3n
+3v4r4k3n
+3v4ŕ4z3g
+3v4r4z3g
+3v4r4z3n
+3v4r4ž3l
+3z4h4ŕ3ň
+3z4r4n3n
+3ž4l4č3n
+3ž4l4t3n
+3ž4r4d3k
+3b4r4n3k4n
+b3d4ľ4ž3n
+3c4v4r4č3k
+3c4v4r4n3k
+3č4ŕ4s3t4v
+3č4r4t4t3n
+3č4v4r4k3n
+3d4r4ž3g4r
+3f4r4n4g3n
+h2ŕ4s3t4k
+3c4h4r4s4t3n
+3k4r4s4t3n
+3k4r4s4t3ň
+3s4m4r4š3ť
+3s4m4r4t3k
+s3t4r4n3k
+3š4k4l4b3n
+maš3k4r4t3n
+3š4k4r4t3n
+3š4k4v4r3č
+3š4k4v4r3k
+3š4k4v4ŕ3k
+3š4k4v4r3n
+3š4m4r4d3k
+3š4m4r4n3c
+3š4p4l4h3n
+3š4t4r4k3n
+3š3t4r4n3g
+3t4v4r4d3n
+3v4r4s3t4v
+3v4r4z3g4n
+3c4v4r4n3g4n
+3š4k4v4r4k3n
+3š4k4v4ŕ4k3n
+k4č3ný.
+k4č3ného.
+k4č3nému.
+k4č3nom.
+k4č3ným.
+k4č3né.
+k4č3ná.
+k4č3nej.
+k4č3nú.
+k4č3nou.
+k4č3ní.
+k4č3ných.
+k4č3nými.
+k4t3ný.
+k4t3ného.
+k4t3nému.
+k4t3nom.
+k4t3ným.
+k4t3né.
+k4t3ná.
+k4t3nej.
+k4t3nú.
+k4t3nou.
+k4t3ní.
+k4t3ných.
+k4t3nými.
+n4č3ný.
+n4č3ného.
+n4č3nému.
+n4č3nom.
+n4č3ným.
+n4č3né.
+n4č3ná.
+n4č3nej.
+n4č3nú.
+n4č3nou.
+n4č3ní.
+n4č3ných.
+n4č3nými.
+n4k4č3n
+n4t3ný.
+n4t3ného.
+n4t3nému.
+n4t3nom.
+n4t3ným.
+n4t3né.
+n4t3ná.
+n4t3nej.
+n4t3nú.
+n4t3nou.
+n4t3ní.
+n4t3ných.
+n4t3nými.
+r4d3ný.
+r4d3ného.
+r4d3nému.
+r4d3nom.
+r4d3ným.
+r4d3né.
+r4d3ná.
+r4d3nej.
+r4d3nú.
+r4d3nou.
+r4d3ní.
+r4d3ných.
+r4d3nými.
+r4m3ný.
+r4m3ného.
+r4m3nému.
+r4m3nom.
+r4m3ným.
+r4m3né.
+r4m3ná.
+r4m3nej.
+r4m3nú.
+r4m3nou.
+r4m3ní.
+r4m3ných.
+r4m3nými.
+r4p4č3n
+r4t3ný.
+r4t3ného.
+r4t3nému.
+r4t3nom.
+r4t3ným.
+r4t3né.
+r4t3ná.
+r4t3nej.
+r4t3nú.
+r4t3nou.
+r4t3ní.
+r4t3ných.
+r4t3nými.
+s4t3ný.
+s4t3ného.
+s4t3nému.
+s4t3nom.
+s4t3ným.
+s4t3né.
+s4t3ná.
+s4t3nej.
+s4t3nú.
+s4t3nou.
+s4t3ní.
+s4t3ných.
+s4t3nými.
+z4d3ny.
+z4d3neho.
+z4d3nemu.
+z4d3nom.
+z4d3nym.
+z4d3ne.
+z4d3na.
+z4d3nej.
+z4d3nu.
+z4d3nou.
+z4d3ni.
+z4d3nych.
+z4d3nymi.
+z4d3ný.
+z4d3ného.
+z4d3nému.
+z4d3ným.
+z4d3né.
+z4d3ná.
+z4d3nú.
+z4d3ní.
+z4d3ných.
+z4d3nými.
+b2l4š3k
+l2t3k2a.
+l2t3k2y.
+l2t3k2e.
+l2t3k2u.
+l2t3k2ou.
+l2t3k2ám.
+l2t3k2ách.
+l2t3k2a1mi.
+n2t3k2a.
+n2t3k2y.
+n2t3k2e.
+n2t3k2u.
+n2t3k2ou.
+n2t3k2ám.
+n2t3k2ách.
+n2t3k2a1mi.
+n2k2t3k
+p2t3k2a.
+p2t3k2y.
+p2t3k2e.
+p2t3k2u.
+p2t3k2ou.
+p2t3k2ám.
+p2t3k2ách.
+p2t3k2a1mi.
+s2t3k2a.
+s2t3k2y.
+s2t3k2e.
+s2t3k2u.
+s2t3k2ou.
+s2t3k2ám.
+s2t3k2ách.
+s2t3k2a1mi.
+5p4r4s3t
+b3s4k
+d3s4k
+j3s4k
+l4p3s4k
+l3s4k
+ľ3s4k
+l4t3s4k
+4m3s4k
+4m4p3s4k
+n4d3s4k
+n4k4t3s4k
+n3s4k
+n4t3s4k
+p3s4k
+p4t3s4k
+r3s4k
+r4t3s4k
+r4z5s4k
+5s4r4b3s4k
+š3s4k
+t3s4k
+v3s4k
+z3s4k
+ž3s4k
+n2d3č
+z3š2t2
+r4z3š2t2
+b3s4t4v
+č3s4t4v
+d3s4t4v
+ď3s4t4v
+ľ3s4t4v
+m3s4t4v
+n3s4t4v
+n4t3s4t4v
+p3s4t4v
+r3s4t4v
+r4v5s4t4v
+š3s4t4v
+t3s4t4v
+v3s4t4v
+ž3s4t4v
+.a2e2ro
+.a2e2ro3d2r
+.aero3g2r
+.a2e2ro3k2l
+.aero3p2l
+.aero3s2k
+.aero3s2t
+.aero3t2r
+.akcie3s2c2h
+.ane3s2teti
+.ane3s2téz
+.anti5k4l
+.anti5k4r
+.apo5p4le
+.ap4rio
+.ap4rió
+.arci5k4
+.aristo5k4
+.as3k2lep
+.austro5s4
+.bac2k3hand
+.balne2o3
+.belo5
+.belo5h4
+.bez5
+.bez5b4
+.bez5d4
+.bez5h4
+.bez5k4
+.bez5m4
+.bez5p4
+.bez5s4
+.bez5t4
+.bez5v4
+.bez5z4
+.bielo5
+.bielob4
+.bieloh4
+.bielov4
+.bi2o5
+.biok4
+.biop4
+.bios4
+.blaho5
+.blahop4
+.blahos4
+.bledo5
+.boha5p4
+.boho5s4
+.bože5
+.bože5d4
+.božec2h4
+.brato5v4r
+.b2z2d
+.cáro5v4ra
+.celo5d4
+.celo5k4
+.celo5p4
+.celo5s4
+.celo5u4
+.ceno5t4
+.ces2t5maj
+.cirkevno5
+.cirkevno5p4
+.c4t4n
+.cudzo5k4
+.cudzo5o4
+.cudzo5s4
+.cudzo5t4
+.cudzo5v4
+.cyto5p4
+.čaro5k4
+.čaro5s4
+.čaro5v4
+.čaro5z4
+.černo5b4
+.černo5h4
+.černo5k4
+.černo5o4
+.červeno5a4
+.červeno5b4
+.červeno5h4
+.červeno5k4
+.červeno5o4
+.červeno5p4
+.čierno5b4
+.čierno5h4
+.čierno5o4
+.čo5ch4
+.čo5s4
+.čudo5t4
+.da3k2d
+.ďatelino5t4
+.de5f4
+.de5g4
+.dek4l
+.desať5
+.de5š4t2
+.dez5i2
+.dez5o2
+.dis2k3d4
+.divo5t4
+.dlho5h4
+.dlho5p4
+.dobro5d4
+.dobro5p4
+.dobro5s4
+.do5č2m
+.do5d4
+.do5f4
+.do5h4
+.do5c4h4
+.do5i4
+.do5k4
+.do5o
+.do5p4
+.do5s4
+.do5š4p
+.do5š4tie
+.do5š4tí
+.do5t4l
+.do5t4m
+.do5t4r
+.do5t4v
+.do5u
+.do5v4
+.do5z4
+.do5ž4
+.drevo5p4
+.drevo5o
+.drevo5v4
+.drobno5z4
+.druho5s4
+.dvoj5al
+.dvoj5č4
+.dvoj5d4
+.dvoj5h4
+.dvoj5i4
+.dvoj5k4
+.dvoj5p4
+.dvoj5s4
+.dvoj5t4
+.dvoj5u
+.dvoj5v4
+.dvoj5z4
+.elektro5
+.ex5k4
+.fol2k5
+.foto5
+.gala5p4
+.gama5g4
+.ge4o
+.hnedo5o
+.hnedo5u
+.holo5b4
+.holo5h4
+.holo5k4
+.hore5z4
+.horno5u4
+.hrôzo5s4t4
+.hrôzo5v4
+.hrôzy5p4
+.hrubo5s4
+.hydro5
+.chorobo5p4
+.jasno5o
+.jasno5z4
+.jedno5h4
+.jedno5i4
+.jedno5p4
+.jedno5s4
+.jedno5u4
+.jedno5z4
+.juho5a
+.juho5s4
+.južno5s4
+.kata5k4
+.kata5s4t4
+.kmeňo5t4
+.koso5d4
+.koso5š4
+.koso5u
+.krivo5p4
+.kruto5v4
+.krvi5p4
+.krvi5s4
+.krvi5t4
+.ktovie5a2
+.lásky5p4
+.lesos4
+.ľ4s4t
+.ľudovo5u
+.makro5k4
+.makro5o4
+.makro5s4
+.málo5k4
+.malo5o
+.málo5v4
+.márno5t4
+.medzi5h4
+.medzi5i4
+.medzi5p4
+.medzi5š4
+.medzi5t4
+.melo5d4
+.meru5ô2
+.miesto5d4
+.miesto5p4
+.mikro5e4
+.mikro5k4
+.mikro5o
+.mikro5p4
+.mimo5š4
+.mimo5ú
+.mimo5v4
+.mnoho5s4
+.mnoho5t4
+.mnoho5u
+.mnoho5v
+.mnoho5z
+.modro5o
+.mrako5d4
+.mravo5u
+.mucho5t4
+.m4z4d
+.na5a4
+.na5b4
+.na5c4
+.nad5h4
+.na5d4nes.
+.nad5p4
+.na5d4p4.
+.na5d4ŕ4.
+.na5d4robno.
+.na5h4
+.na5i4
+.na5k4
+.na5m4
+.na5o4
+.na5p4
+.ná5p4
+.národno5o
+.na5s4
+.na5st4
+.ná5s4
+.ná5st4
+.na5š4
+.na5šk4
+.na6š5sk
+.na5t4
+.na5u4
+.na5ú4
+.ná5u4
+.ná5ú4
+.na5v4l
+.na5v4na
+.na5v4r4
+.ná5v4r4
+.na5v4z4
+.na5z4r
+.na5z4v
+.na6z5vyš
+.náz5v4
+.na5ž4
+.ne5a4
+.ne5do3u2k
+.ne5e4
+.ne5i4
+.ne5m4
+.ne5na5h4
+.ne5na5i4
+.ne5na5k4
+.ne5na5m4
+.ne5na5p4
+.ne5na5s4
+.ne5na5t4
+.ne5p4
+.ne5s4
+.ne6s5tor
+.ne5š4
+.ne5t4
+.ne6t5t
+.ne5u2
+.ne5ú2
+.ne5v4
+.ne5z4d4r
+.ne5z4d4v
+.ne5z4l
+.ne5z4m
+.ne5z4n
+.ne5z4r
+.ne5z4v
+.nie5k4
+.ni5k4
+.ni6k5toš
+.nízko5k4
+.novo5u2
+.novo5z2
+.obi5d4
+.ob5k4
+.obo5s4
+.obo5z4
+.ob5s4
+.ob5t4
+.ob5z4
+.od5b4
+.od5c4
+.od5d4
+.od5f4
+.od5h4
+.od5c4h4
+.od5i4
+.od6i5ó
+.od5í4
+.od5k4
+.odo5b4
+.odo5h4
+.odo5k4
+.odo5m4k4
+.odo5p4
+.odo5s4
+.od5p4
+.od5s4
+.od5š4
+.od5t4
+.od5v4
+.od5z4
+.t4v4r
+.o5h4l
+.o5h4ľ
+.o5h4na
+.o5h4nú
+.o5h4r
+.o5c4h4
+.o5k4l
+.o5k4ľ
+.okolo5i
+.okolo5s4
+.o5k4ra
+.o5k4rá
+.o5k4resať
+.o5k4resávať
+.o5k4ri
+.o5k4rí
+.o5k4ru
+.o5k4rú
+.o5m4l
+.o5m4n
+.o5m4r
+.o5p4
+.o6p5lan
+.o6p5rat
+.o5s4lab
+.o5s4lad
+.o5s4lav
+.o5s4láv
+.o5s4lep
+.o5s4lo
+.o5s4p4
+.o5s4tar
+.o5s4tať
+.o5s4tan
+.o5s4taň
+.o6s5tatn
+.o5s4tatok
+.o5s4tatk
+.o5s4táv
+.o5s6to5
+.o5s6t4rap
+.ostro5u
+.o5s4ved
+.o5s4vetl
+.o5s4viet
+.o5s4viež
+.o5s4vit
+.o5s4voj
+.o5š4k4
+.o5š4ľ4
+.o5š4m4
+.o5š4p4
+.o5š4v4
+.o5t4ras
+.o5t4rav
+.o5t4ráv
+.o5t4rep
+.o5t4ria
+.o5v4dov
+.o5v4lád
+.o5v4laž
+.o5v4p4
+.o5v4r
+.o5z4l4
+.o5z4n
+.o5z4re
+.o5z4v4l
+.päť5izbo
+.plno5a
+.plno5p4
+.plno5š4
+.plno5kr4
+.plocho5d4
+.po5b4
+.po5č4
+.poda5k4
+.pod5b4r
+.pod5h4
+.pod5c4h
+.pod5k4
+.pod5p4
+.po5d4ráž
+.po5d4rep
+.pod5re
+.po5d4rh
+.po5d4rie
+.po5d4rm
+.po5d4rv
+.po5d4r4ž
+.pod5s4koč
+.pod5v4
+.pod3zem
+.pod3zol
+.pod3ža
+.pod3žu
+.po5h4
+.po6h5reb
+.po5c4h4
+.po5i4
+.po5k4
+.pol5d4
+.pol5i4z
+.polo5a
+.polo5b4
+.pol5o4blú
+.polo5d4
+.polo5h4l
+.polo5i
+.polo5k4
+.polo5m4
+.polo5o4
+.polo5p4
+.polo5s4
+.polo5t4
+.polo5u4
+.polo5ú4
+.polo5v4
+.polo5z4
+.pol5s4t
+.po5m4
+.po6m5ník
+.po5o4
+.po5ob4h
+.po5ob4l
+.po5s4
+.po6s4t5s4k4rip
+.po6s5tul
+.po5š4
+.po6š5ta
+.po6š5tov
+.po6š5v
+.po5t4k4n
+.po5t4ľ
+.po5t4r
+.poroz5p4
+.poroz5s4
+.poroz5v4
+.po6st5g4r
+.po6s5ti
+.po5t4
+.po5u
+.po5v4
+.po4v5ra
+.povy5h4
+.povy5k4
+.povy5p4
+.povy5s4
+.povy5v4
+.povy5z4
+.po5v4z4b
+.po5z4
+.pra5o4
+.pra5p4
+.pravicovo5o
+.pra5v4l
+.pra5v4nu
+.pra5v4nú
+.prá5vo5p4
+.pra5vo5s4
+.pre5b4
+.pre5c4
+.pred5c4
+.pred5h4
+.pred5ch4
+.pred5i
+.pred5k4
+.pred5m4
+.predo5h4
+.pred5op
+.pred5ostatn
+.pred5p4
+.pre5d4rah
+.pre5d4rap
+.pre5d4rať
+.pre5d4raž
+.pre5d4ri
+.pre5d4rž
+.pred5s4
+.pred5v4
+.pred5z4
+.pre5č4
+.pre5e2
+.pre5f2
+.pre5h4
+.pre5c4h4
+.pre5i4
+.pre5k4
+.pre6k5vap
+.pre5m4
+.pre5o4
+.pre5p4
+.pre5s4
+.pre6s5n
+.pre5š4
+.pre5t4
+.pre5v4
+.pre5z4
+.pre5ž4
+.pri5b4
+.pri5č4
+.pri5d4
+.pri5h4
+.pri5c4h4
+.pri5k4
+.prí5k4
+.pri5m4
+.pri5p4
+.pri5s4
+.prí5s4
+.prí6s5p
+.pri6s5p
+.pri5s4pô
+.pri5š4
+.pri6š5la.
+.pri6š5li.
+.pri6š5lo.
+.pri5t4
+.pri5v4
+.pri5z4
+.pri5ž4
+.re5g4
+.re5k4
+.re6k5v
+.re5p4
+.re6p5n
+.re5š4
+.re5t4
+.ro4z5i4
+.ro6z5í4
+.rozo5b4
+.rozo5d4
+.rozo5c4h4
+.rozo5m4
+.rozo5p4
+.rozo5r4
+.rozo5s4
+.rozo5š4
+.rozo5z4
+.rozo5ž4
+.ro6z5u4
+.ro6z5v4
+3s4polu5
+3s4polu5h4
+3s4polu5p4
+3s4polu5v4
+.šikmo5o
+.široko5
+.široko5p4
+.štáto5
+.št4vor5
+.su4b5s4
+.sú5h4
+.sú5k4r
+.sú5m4r
+.sú5s4
+.sú5v4
+.sú5z4
+.troj5
+.t4v4r4do5
+.viac5k4
+.viac5v4
+.vide2o5
+.vnútro5s4
+.vnútro5š4
+.vo5p4ch
+.vo5p4r
+.vo5s4p
+.vo5t4
+.vo5v4
+.vy5
+.vý5
+.vy5b4
+.vy5c4
+.vý5c4
+.vy5č4
+.vý5č4
+.vy5d4
+.vý5d4
+.vy5h4
+.vy6h5ň
+.vy6h5ne
+.vý5h4
+.vy5c4h4
+.vy5k4
+.vý5k4
+.vy5m4
+.vy5p4
+.vý5p4
+.vy5s4
+.vý5s4
+.vy5š4
+.vy6š5š
+.vý6š5k
+.vy5t4
+.vý5t4
+.vy5v4
+.vy5z4
+.vý5z4
+.za5b4
+.zá5b4
+.za5c4
+.za5č4
+.za5d4
+.za5h4
+.za5c4h4
+.za5k4
+.za5m4
+.za5p4
+.za5r4
+.za5s4
+.za5š4
+.za5t4
+.za5v4
+.za5z4
+.za5ž4
+.zá5k4
+.zá5z4
+.zo5b4
+.zo6d5p
+.zo5d4r
+.zo5d4v
+.zo5h4
+.zo5m4l
+.zo5m4r
+.zo5s4
+.zo5š4
+.zo5t4
+.zo5v4
+.zo5z4
+.zo5ž4
+5alkohol
+auto4rk
+auto4rs
+5b4lah
+5b4ledn
+5b4lesk
+5b4lok
+5b4lúd
+5b4lysk
+5b4lysn
+5boh3vi4e3a2k
+5boh3vi4e3o2d3k
+5boh3z4
+5boles4t5n
+5b4rať
+5b4rázd
+5b4rec2h
+5b4ronz
+5b4ruč
+5b4rús
+5b4rýzg
+5c4muk
+5c4nie
+5c4vak
+5c4vič
+5c4vik
+čí6s5lov
+5č4len
+5č4lánk
+5č4lánok
+5č4lov
+5d4ňov
+5d4ramat
+5d4rať
+5d4vanás4ť5
+5d4vih
+5d4viž
+5d4voj
+5d4vor
+5e2u2róp
+5f4ľak
+5f4lias
+5f4rancú
+5f4rekven
+5f4ráz
+5g4raf
+5g4ram
+pro6g5ram
+5g4réč
+5g4rob
+5g4vardej
+5h4lad
+5h4las
+5h4lav
+5h4ľad
+5h4liad
+5h4luch
+5h4mat
+5h4mot
+5h4nať
+5h4ned
+5h4nev
+5h4niezd
+5h4noj
+5h4nut
+5h4núť
+5h4nút
+5h4rab
+5h4r3mot
+5h4ran
+5h4rať
+5h4rob
+5h4rom
+5h4roz
+5h4rub
+5h4ryz
+5h4viezd
+5c6h4lap
+5c6h4leb
+5c6hran
+5c6h4rán
+5c6h4ráň
+5c6h4vál
+5c6h4vát
+5c6h4vat
+5c6h4vost
+5jedenás4t5k
+5jedenás4ť5
+5k4lad
+5k4laď
+5k4ľak
+5k4lam
+5k4lásť
+5k4liat
+5k4liať
+5k4lep
+5k4les
+5k4ľúč
+5k4resb
+5k4resť
+5k4ritic
+5k4rídl
+5k4rôch
+5k4ruh
+5k4rúž
+5k4ryt
+5k4valif
+5k4valit
+5k4vet
+5k4vadr
+5m4ladis4t3v
+5m4nož
+5m4rav
+5m4ráz
+na5d4ž4ga
+na5d4ž4gá
+nav3š4tev
+náv3š4tev
+nav3š4tív
+5p4lán
+5p4lastik
+5p4lat
+5p4lav
+5p4leta
+5p4letie
+5p4letú
+5p4liesť
+5p4ne2umat
+5p4ráv
+s6práv
+5p4riam
+5p4rirod
+5p2risám
+5p4roduk
+5s4fér
+5s4c2hopn
+5s4k4lad
+5s4k4lon
+5s4koč
+5s4kok
+5s4kop
+5s4kor
+5s4kôr
+5s4k4romne
+5s4k4rot
+5s4k4rúc
+5s4k4rutk
+5s4k4rýv
+5s4kúsen
+5s4kutoč
+5s4k4vúc
+5s4ladk
+5s4lav
+5s4láv
+5s4led
+5s4lep
+5s4lovn
+5s4love
+5s4lova
+5s4lovk
+5s4luh
+5s4lúž
+5s4ľub
+5s4maž
+5s4mel
+5s4mer
+5s4piev
+5s4pev
+5s4por
+5s4potreb
+5s4p4ravod
+5s4p4raved
+5s4p4rávn
+5s4p4ravo
+5s4tarost
+5s4tatic
+5s4tav
+5s4t4rach
+5s4t4ran
+5s4t4rán
+5s4t4ráda
+5s4t4raš
+5s4t2rat
+5s4t2red
+5s4t2rek
+5s4t4rel
+5s4t4reľ
+5s4t4riel
+5s4t4rieľ
+5s4t4rih
+5s4t4riž
+5s4t4rom
+5s4t4rúh
+5s4t4run
+5s4t4ruž
+5s4tati
+5d2ve5s4to
+5t2ri5s4to
+5š4tyri5s4to
+5päť5s4to
+5šes4ť5s4to
+5sedem5s4to
+5osem5s4to
+5deväť5s4to
+5päť5
+5šes4ť5
+5s4t4la
+5s4tup
+5s4ved
+5š4ľah
+5š4liap
+5š4kola
+5š4k4rab
+5š4k4rie
+5š4pin
+5š4p4liech
+5š4print
+5š4tart
+5š4tát
+5š4tep
+5š4tít
+5š4t4ruktúr
+5š4tude
+5š4tudo
+5š4t4vera
+5š4t4vorec
+5š4tyli
+5š4ťast
+5štiep4
+5š4t4v4r4ť5k4
+5š4t4v4r4ť5l4
+5š4t4v4r4ť5r4
+5š4t4v4r4ť5s4
+5t4lač
+5t4lak
+5t4ran4s5
+5t4ras
+5t4resk
+5t4retin
+5t4ried
+5t4rub
+5t4r4vaj
+5t4r4val
+5t4r4van
+5uholník
+5uhoľn
+5viac5h4
+5v4čera
+5v4lád
+5v4las
+5v4rás
+5v4rav
+5v4rat
+5v4rát
+5v4šimn
+5v4ták
+5v4tip
+5vy5s4t4rája
+5v4z4du
+5v4z4ťah
+5v4z4ťaž
+5z4lom
+5z4luč
+5z4mysel
+5z4mysl
+5z4nak
+5z4nám
+5z4náša
+5z4rak
+5z4väz
+5z4vest
+5zv4esť
+5z4vod
+5z4vuk
+5z4vuč
+5ž4ráč
+5ž4rane
+5ž4reb
+5ž4rút
+.cv6
+.ch6
+.sp6
+.st6
+.šk6
+.šp6
+.št6
+.tk6
+.uh6
+.uc6h6
+.uk6
+.um6
+.up6
+.us6
+.ús6
+.usc6h6
+.úsc6h
+.usk6
+.úsl6
+.usm6
+.úsm6
+.ús7ta.
+.ús7tami.
+.ús7toč
+.ús7ti
+.ust6l
+.úst7ny
+.ust6r
+.ús7tret
+.us7t4ric
+.ús6t6r
+.úš6
+.ut6
+.uv6
+.uz6
+.vd6
+.vh6
+.vk6
+.vp6
+.vs6
+.vš6
+.vt6
+.vz6
+.vzh6
+.vzk6
+.vzl6
+.vzp6
+.vž6
+.zb6
+.zd6n
+.zd6r
+.zd6v
+.zg6
+.zh6
+.zm6
+.zr6
+.zv6
+4b4s4ť.
+8c4h.
+8d4z.
+8d4ž.
+4c4ht4.
+4j4s4ť.
+4lt.
+4m4p4r.
+4m4p4s.
+4m4š4t.
+4n4k4t.
+4p4r4v.
+4rd.
+r4p4t.
+r4š4č.
+r4t4z.
+4st.
+4sť.
+5k4rát.
+5s4to5k4rát.
+5t4ľ4c4ť.
+akci3a2
+akvári3u2m
+gymnázi3um
+le2u3kémia
+t2ri3u2mf
+kli3e2nt} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sk.rme b/tex/context/patterns/lang-sk.rme
new file mode 100644
index 000000000..23e94d65d
--- /dev/null
+++ b/tex/context/patterns/lang-sk.rme
@@ -0,0 +1,83 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: skhyphen.tex (yyyy-mm-dd), skhyphen.ex (yy-mm-dd)
+% Author: Jana Chlebikova <chlebikj at dcs.fmph.uniba.sk>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Slovak hyphenation (version 2.0) 24.4.1992
+% Autor: Jana Chlebikova, department of Informatics Education,
+% Comenius University, 842 15 Bratislava, Slovakia
+% <chlebikj@dcs.fmph.uniba.sk>
+%
+% This is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This file is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+%%% --------------------------------------------------------------------
+% \message {Loading SK hyphenation patterns: Jana Chlebikova, 1992}
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-sl.hyp b/tex/context/patterns/lang-sl.hyp
new file mode 100644
index 000000000..1dc0ccf59
--- /dev/null
+++ b/tex/context/patterns/lang-sl.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sl.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sl.pat b/tex/context/patterns/lang-sl.pat
new file mode 100644
index 000000000..17e1a9989
--- /dev/null
+++ b/tex/context/patterns/lang-sl.pat
@@ -0,0 +1,1075 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sl.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z č š ž
+
+\patterns{
+.av5r
+.di6spo
+.ek3s
+.ek5v
+.is1
+.iz1
+.obi4d
+.ob5it
+.od1
+.po4d5n
+.po4v5s
+.pre6d7n
+.se4k5s
+.si4s
+.st4
+.voz5l
+.voz5n
+.zliz6
+a1a
+a1b
+ab5ba
+ab6rod
+a1c
+ac5ci
+a1č
+a1d
+ad2l
+a6dobl
+ad6rl.
+ad6rla
+ad6rob
+ad5ur
+a1e1
+a1f
+af5ga
+af1t
+a1g
+a1h
+a4hm
+ah5mi
+ah5mo
+a1i
+ai2n1
+a1j
+a4j5ek
+a4jf
+aj5fi
+aj5fo
+aj5ha
+aj5he
+aj5im
+aj6imo
+aj3os
+aj6stb
+a5ju.
+aj3uč
+aj3ug
+aj5žn
+a1k
+ak4s
+a4kst
+a1l
+a1m
+a4mz
+a1n
+an6dga
+an6dhi
+a4nm
+an5mi
+an5zi
+a1o
+ao2b1
+a1p
+a4ph
+a1ra
+ar6dwa
+a1re
+a1ri
+a1ro
+a1ru
+ar5xa
+ar5xo
+ar5xu
+a1s
+a4sš
+as5šč
+a1š
+a1t
+a4tf
+at4i
+a1u1
+a4uf
+a2uk
+a4ul
+a1v
+av5ši
+a4vž
+av5ža
+ay5to
+a1ze
+az5fo
+a4zig
+az3la
+az3le
+az4lil
+az4lit
+az4liv
+a4zob
+a4z3oč
+az5ora
+az5oro
+a4zra
+az4red
+az5vp
+a1ž
+až5mi
+ba6bba
+ban3č4
+ba4u
+2b1c
+2b1č
+2b1d
+be1
+be4v
+b1h
+bi1
+b1ja
+b4ja.
+b5jel
+b3jem
+b5jet
+2b1k
+b3lep
+b5leta
+b5lil
+b5lit
+b5liv
+b1m
+4bmi
+2b1n
+bo1
+bo6chm
+b5ord
+bo5vp
+b3rab
+b5ras
+b3raš
+b3rez
+bre4zg
+bre4zi
+bre4zr
+b5reže
+b3rob
+br6žda
+2b1s
+2b1š
+2b1t
+bu5ki
+bu5ku
+bu5kv
+bu5ry
+2b1v
+b1z
+b1ž
+2cc
+2ch.
+ch5ma
+2ck
+c1ka
+ck1o2
+c5ko.
+ckov3
+ck1s
+ck5we
+2c1n
+2c1t
+2č1b
+2č1g
+či1
+1čj
+2č1k
+1čl
+4č3let
+č5mes
+2č1n
+4čop
+2č1p
+2č1s
+4čup
+2d1b
+2d1c
+2d1č
+2d1d
+dd6voj
+d2e
+6d5elem
+de4min
+de4mn
+de4z3i
+2d1g
+2d1h
+di5ck
+4dind
+d4i5no
+dis1
+di4skr
+di6spr
+2d1j
+2d1k
+5dlet
+d2li
+d5lit
+d5liv
+d1lo
+2d3m
+4d3nac
+4d5nač
+4d5nap
+4d3nar
+4dnas
+4d5neb
+d5niv
+4d5niz
+4d5njač
+4d3nož
+d2o
+4dobč
+4d5obd
+2d3o2f
+do5rd
+do5vč
+do5v4z
+2d1p
+d5raz
+d3rep
+dre6pn
+d4rev
+2d1s
+2d1š
+2d1t
+dteks6
+d4ur
+du5ro
+du5um
+2d1v
+4d3vi
+2d1z2
+e1a
+e1b
+eb4j
+eb6liz
+e1c
+e1č
+e4čd
+eč5de
+eč5di
+eč5do
+eč3le
+eč5op
+e4čt
+eč5ti
+eč5to
+eč5tr
+eč5up
+e2č1v
+eč6vrs
+e1d
+e4df
+ed5ig
+ed2l
+ed5ob
+ed6obe
+ed6obr
+e4dobs
+e4d3oč
+ed5vč
+ed5zb
+e1e
+e4ep
+e1f
+e4ff
+ef5fe
+ef5ta
+e1g
+e1h
+e1i
+ei6pzi
+ei2z
+eiz5e
+e1j
+e1k
+ek6mal
+ek6tre
+e1l
+e1m
+e1n
+e1o1
+eob4j
+eob4r
+eo4dl
+eo4z5n
+e1p
+ep5nik
+e1ra
+era6z5l
+era5z4r
+era5z4v
+e1re
+e4rf
+e1ri
+e1ro
+e4rr
+e1ru
+e1s
+es5da
+e5sta
+e5sti.
+e5stih
+e5stil
+e1š
+e4šp
+eš5po
+e1t
+4eth
+e4tinš
+e1u1
+e1v
+eve6t5l
+ev5ha
+ev6pre
+ev6ste
+ev5stv
+2ew
+ew6ind
+ew5le
+e4wt
+ew5to
+e4yw
+e1z
+ez5dj
+e3z4dr
+ez2g
+ez5gl
+e5zij
+ez6ijo
+ez5imn
+e5zis
+ez6ist
+ez5iz
+ez4l
+ez6lom
+ez6man
+ez4mo
+e4zob
+e4z5or
+ez4re
+e4zt
+e4z5u4m5
+e4zž
+e1ž
+1fa
+fe1
+fe6ljt
+ff5ma
+fi6zlj
+2f1n
+fo6uri
+fre4u
+2f1s
+2ft
+ft5ve
+fu1
+2g1d
+ge6ige
+gel5č4
+ge6njč
+gi6tpr
+go1
+go5vz
+2g1t
+gu1
+ha4u
+2h1č
+he4i
+2h1k
+4hl.
+h4lo
+2h1n
+h5ren
+2h1š
+2h1t
+1hu
+hu6ffm
+i1a
+i1b
+i1c
+i4cs
+i1ča
+i1če
+i1či
+ič5ra
+i1ču
+ič5vr
+i1d
+4idor
+i1e1
+i1f
+i1g
+4igh
+i1h
+i1i
+ii2n1
+i1j
+i1k
+i4kč
+ik5ča
+i1l
+il5č4k
+4ile
+4ilo
+i1m
+i4mh
+im5hi
+i1n
+1ind
+2ine
+3i4n3os
+1inp
+3inse
+1inš
+4inšk
+3intr
+i1o1
+i1p
+i1r
+4ire
+i1s
+is4a
+is6ert
+isis4
+i4skv
+2iss
+i1š
+i1t
+it5pr
+i1u
+i1v
+iv5jo
+i1x
+i1z
+iz1l
+iz4la
+izli4z
+iz5me
+iz5mo
+iz6ode
+iz5po
+i2zr
+iz1u
+iz6ure
+i1ž
+j5akt
+2j1b
+2j1c
+2j1č
+2j1d
+je4ks4
+2j1g
+2jh
+j1hi
+4jime
+4j5int
+2j1k
+2j1l
+2j1m
+2j1n
+4job
+2j1od
+jod4l
+2jos
+4jož
+2j1p
+2j1r
+jra1
+jraz4
+2j1s
+jsis6t
+2j1š
+2j1t
+ju1
+2juč
+ju5dm
+2jus
+ju2ž1
+2j1v
+2j1z
+jz6ves
+2k1c
+2k1d
+ke5ti
+ki1
+2k1m
+1kn
+ko1
+kok4
+ko5kd
+ko6vše
+koz6lo
+1kre
+2ks.
+k5sat
+ks1c
+ks1p
+ks4po
+ks1t
+4kst.
+ks6taz
+ks5te
+2k1t
+3ktr
+4ktra
+ku5ro
+k5vip
+la4ir
+la6vz.
+2l1b
+2l1c
+2l1č
+2l1d
+le1
+le4e
+le6ipz
+le5me
+2l1f
+2l1g
+lg5ča
+2l1h
+l2i1
+li6dž.
+1liz
+4l5izd
+2lj.
+4ljc
+2ljč
+2ljk
+2ljn
+2ljs
+2ljš
+lju5d6j
+2l1k
+2l1l
+2l1m
+2l1n
+lo1
+1loč
+2l1p
+2l1s
+2l1š
+2l1t
+lu5ki
+lu5ku
+2l1v
+2l1z
+2l1ž
+2m1b
+2m1c
+2m1č
+2m1d
+me4d5n
+me6dos
+me4dr
+2m1f
+4mind
+4minp
+4minš
+mi6th.
+2m1k
+2m1m
+m5niv
+mo6št.
+mo6vš.
+2m1p
+2m1s
+2m1š
+2m1t
+m5urn
+2m1v
+my5hi
+2m1ž
+na1
+5načel
+na4d5nj
+nad5r
+na6dra
+na4dre
+na6dur
+1naj
+na6jak
+na4j5en
+naj3o
+na6joč
+na4j3u
+1nas
+na4v3z
+navze6
+1naz
+naz6or
+2n1b
+2n1c
+2nč
+n1ča
+n1če
+n1či
+n1ču
+2n3d2
+nd5ga
+nd5hi
+n4dm
+ne1
+ne3d2
+1neh
+ne3zm
+nez4v
+2n1f
+2n1g
+n4gh
+ng5ha
+n4gv
+ng5vi
+2n1h
+2nj.
+2njc
+nje4v5s
+2njk
+2njs
+2njš
+4njv
+2n1k
+2n1l
+2n1n
+no5rd
+n4ost
+2n1p
+2n1s
+nsis4
+2n1š
+2n1t
+nteks4
+n4tg
+nt5ga
+nt5ge
+n4tv
+nt5vi
+nu1
+2n1v
+ny5qu
+2n1z
+nz4i
+2n1ž
+o1a
+o4as
+o1b
+ob5gl
+ob5ide
+ob5jo
+5obla
+5obro
+o4bz
+o1c
+oc5ke
+oc5ki
+o4cr
+o1č
+o1d
+od5dv
+od5nal
+o6drep
+od5zd
+o2d1ž
+o1e
+oele4
+o1f
+o1g
+4ogl
+o1h
+o1i
+oiz2
+o1j
+o1k
+o4kb
+ok5ba
+ok5be
+o4kt
+o1l
+o6l5avt
+ol6gča
+o4lr
+ol5re
+o1m
+o1n
+o1o
+ood4l
+o2ol
+o4om
+o1p
+o4pm
+op5me
+4opy
+o1ra
+or4deč
+o1re
+o1ri
+o1ro
+o1ru
+o1s
+5oseb
+ose4m5
+o1š
+o1t
+o1u
+ou5ki
+ou5ku
+o1v
+ov5sem
+ov5šk
+o2v1z
+o5vza
+ov3zd
+o1y
+o1z
+oz4b
+ozd5j
+oz4g
+oz5lo
+oz6lož
+oz2n
+oz5nic
+oz5niš
+oz2o
+oz2r
+oz2v
+o1ž
+ož5mi
+2p1c
+2p3č2
+pč5ka
+pe1
+1peč
+pe4kt
+pet3l
+pe4tle
+pe4v5s
+pev5t4
+4phs
+ph5so
+pi5zo
+2p1k
+4ploz
+po1
+po6dfa
+po4d3l
+po4dna
+po4d5oč
+po6lob
+po6std
+prez4
+2p1s
+2p1š
+2p1t
+pz6ig.
+qu2
+3raču
+2rae
+ra6jžn
+rav5z
+ra6vza
+ra4z5id
+3razl
+ra4z5or
+2r1b
+2r1c
+2r1č
+2r1d
+re1
+3real
+re6cht
+re5čv
+5redč
+re6dig
+re6dnju
+re6iba
+re5jo
+re5km
+re6sda
+rev6sk
+re6znač
+re6zus
+re6zve
+r1f
+2r1g
+2r1h
+ri1
+r4in
+ri5n4o
+riz4g
+riz4l
+riz4n
+2r1j
+2r1k
+2r1l
+2r1m
+2r1n
+ro1
+rob6id
+3rodi
+ro5zo
+2r1p
+r1r
+2r1s
+2r1š
+2r1t
+r4th
+rt5ha
+ru5kl
+2r1v
+r3v2j
+rv5jo
+ry5an
+2r1z
+rz2l
+r1ž
+rž5da
+2s1b
+1sc
+4sc.
+s2ci
+se4k5sa
+sek5si
+se5ma
+se5vp
+2s1f
+si1
+s4id
+si6gn.
+sis1
+2s1j
+2sk.
+s2kn
+4skre
+s4lav
+s4on
+soni5
+sonič4
+1sp
+s4plod
+spod4l
+2s1s
+2st.
+3ste
+s4ten
+4stf
+s4tič
+5stim
+s4tir
+2stk
+2stm
+1str
+s4tra.
+su1
+su4bo
+sve5t
+š2č
+2šč.
+2ščk
+2ščn
+še2s
+2š1j
+ta5wi
+taz4
+2t1b
+2t1c
+tch5o
+2t1d
+tek6st
+5tema
+te5xa
+t1f
+4tind
+4tinos
+4tinp
+4tinse
+4t3int
+2t1k
+6tletno
+2t1m
+4tnaj
+to6vž.
+trt5u
+tr6tur
+2t1s
+2t1t
+tu1
+4tz.
+2u1a
+u1b
+ub4j
+u4bp
+ub5po
+u1c
+u1č
+u1d
+ud6mi.
+u1e
+u1f
+u1g
+u1h
+u1i
+u1j
+u1ka
+u1ke
+u1ko
+u1l
+u1m
+u1n
+u1p
+up6čka
+u1ra
+u1re
+4urg
+u1ri
+u1s
+1usp
+u1š
+uše3s
+u1t
+u4th
+uth5o
+u1v
+ux5em
+u1z
+u1ž
+2v1b
+2v1c
+2vč
+v1ča
+v1če
+v4čer
+v1či
+2v1d
+ve4čl
+ve4čm
+ve4i
+ve4tin
+vetle6t
+v1f
+v1g
+vi5dv
+vid6va
+1viv
+vi6žg.
+2v1j
+4vjo
+2v1k
+2v1m
+2v1n
+vo5rd
+voz5le
+2v1p
+3v2pa
+v4pij
+v4pil
+v5skn
+v5šek
+4všk
+2v1t
+vt4k
+vz2
+v2za
+3v2zg
+2v3zk
+2vzo
+v3zp
+v2zu
+1wa
+wo2
+x1f
+1ye
+2y1f
+y1j
+y1l
+y1w
+1z2a
+z6ane.
+za5uk
+za3vp
+za1z2
+za5zd
+2z1b
+3zbir
+z1c
+2z1č
+2z1d2
+zd5ju
+z3dv
+z1g
+z4gni
+z5got
+2z1h
+1zi
+z1ig
+2z1is
+4z5išč
+2z1j
+2z1k
+z3ku
+z5las
+z1li
+3zlil
+5zlit
+5zliv
+zliz5
+1zlj
+3zlog
+z5lom
+3zlož
+z1lu
+2z1m
+1zn
+1zo
+z1ob
+2z1od
+z1og
+z2ol
+z4om
+2z1p
+1z1r
+4zredč
+4zreš
+4zrez
+4zrež
+4zri
+4zru
+2z1s
+z1š
+z1t
+1zu
+z4uj
+2z1up
+2z1uz
+z1v2
+z4ven
+z3vn
+3z4voj
+z4vok
+2z1z2
+z1ž
+2ž1b
+2ž1c
+2ž1č
+2ž1j
+2ž1k
+4žmi
+.č8
+.š8
+.ž8
+8ž.
+8š.
+8č.} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sl.rme b/tex/context/patterns/lang-sl.rme
new file mode 100644
index 000000000..2cd175132
--- /dev/null
+++ b/tex/context/patterns/lang-sl.rme
@@ -0,0 +1,94 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: slhyph.tex (2007-01-29)
+% Author: Matjaž Vrečko <matjaz at mg-soft.si>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% This is `slhyph.tex' as of 15. 4. 97.
+%
+% Copyright (C) 1990 Matjaž Vrečko, TeXCeX (SLO)
+% [slovenian hyphenation patterns]
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or any later version.
+%
+% This file contains slovene hyphen patterns with čšž
+%
+% Generation of hyphen patterns for TeX
+%
+% Matjaž Vrečko, TeXCeH (SLO), 1990
+% Email: matjaz@mg-soft.si
+%
+% Changes:
+% 1990 First version of `hyphen.si' (Matjaž Vrečko, TeXCeX)
+%
+% Some cosmetic changes done later on, but none of these apply any more;
+% the patterns are still the same as they were originally:
+%
+% 1994-05-17 Use of code page 852 in patterns (Leon Žlajpah)
+% 1995-04-06 Release of `sihyph21.tex'
+% 1995-06-20 Added \slovenehyphenmins
+% Release of `sihyph22.tex'
+% 1997-15-04 Some changes concerning "c, "s, "z and ...
+% Release of `sihyph23.tex'
+% 2007-01-20 `sihyph23.tex' renamed to `slhyph.tex'
+% (sl is the proper language code for Slovenian)
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-sr.hyp b/tex/context/patterns/lang-sr.hyp
new file mode 100644
index 000000000..cd2c5bc31
--- /dev/null
+++ b/tex/context/patterns/lang-sr.hyp
@@ -0,0 +1,137 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sr.rme
+
+% used: а б в г д е з и к л м н о п р с т у ц ш ј њ ћ
+
+\hyphenation{
+на-дно
+на-тка
+на-тка-ти
+на-тка-ше
+о-дно
+о-тка
+о-тка-ти
+о-тка-ше
+по-дно
+по-дне
+по-тку
+по-тки
+по-тке
+по-тка
+у-дно
+и-где
+и-гдје
+сву-где
+све-где
+сву-гдје
+све-гдје
+по-не-где
+по-не-гдје
+и-зби
+и-збе
+и-зба
+и-зби-ци
+и-зби-це
+и-зби-ца
+и-звит
+и-зим
+изо-ба-ру
+изо-ба-ри
+изо-ба-ре
+изо-ба-ра
+и-скок
+и-ско-ку
+и-ско-ка
+и-скон
+и-ско-ну
+и-ско-ни
+и-ско-на
+и-скру
+и-скре
+и-скри
+и-скра
+и-скрав
+и-спод
+и-спо-да
+и-стру
+и-стри
+и-стро
+и-стре
+и-стра
+на-ју
+на-ји
+на-јо
+на-је
+на-ја
+на-јам
+на-јест
+о-браз
+о-брет
+о-дви-ка
+о-дран
+о-дра-ти
+пре-двој
+ра-зму
+ра-зми
+ра-змо
+ра-зме
+ра-зма
+ра-зну
+ра-зни
+ра-зно
+ра-зне
+ра-зна
+ра-склоп
+ра-спе-лу
+ра-спе-ло
+ра-спе-ла
+ра-спе-ћа
+ра-спе-ћу
+ра-спе-ће
+ра-сту
+ра-сти
+ра-сте
+ра-ста
+ра-стом
+ра-стер
+ра-шћу
+ра-шћи
+ра-шћо
+ра-шће
+ра-шћа
+у-зно
+у-зна
+у-зни
+у-зник
+у-зрок
+у-ску
+у-ски
+у-ско
+у-ске
+у-ска
+ус-кос
+у-спио
+у-спео
+у-спор
+у-шћу
+у-шће
+у-шћа
+ин-те-рес
+тран-су
+тран-са
+тран-сом
+те-ле-ви-зор
+те-ле-ви-зо-ру
+те-ле-ви-зо-ром
+те-ле-ви-зо-ра
+те-ле-ви-зо-ри
+при-ти-сак
+при-ти-с-ком
+при-ти-с-ку
+при-ти-с-ка
+по-ја-ви-ће
+на-пу-шта
+про-гра-ми-ра-ње
+сни-ма-ња
+сни-ма-ње} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sr.pat b/tex/context/patterns/lang-sr.pat
new file mode 100644
index 000000000..77ca7ef17
--- /dev/null
+++ b/tex/context/patterns/lang-sr.pat
@@ -0,0 +1,2432 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sr.rme
+
+% used: а б в г д е ж з и к л м н о п р с т у ф х ц ч ш ђ ј љ њ ћ џ
+
+\patterns{
+.ђ2
+.ћ2
+.ч2
+.ш2
+.ж2
+.а2б3алиј
+.а2б3анац
+.а2б3ерац
+.а2б3ерир
+.а2б3евак
+.а2б3ирит
+.а2б3ју
+.а2б3ла
+.а2б3лег
+.а2б3леп
+.а2б3лок
+.а2б3лу
+.а2б3ориг
+.а2б3реак
+.а2б3рог
+.а2б3узус
+.а2д3ерац
+.а2д3ј
+.а2д3лат
+.а2д3рен
+.а2д3рог
+.а2д3верб
+.а2н3а4е2ро
+.а2н3афиј
+.а2н3афрод
+.а2н3аго
+.а2н3акуз
+.а2н3алд
+.а2н3алфа
+.а2н3алг
+.а2н3амерт
+.а2н3андр
+.а2н3ант
+.а2н3апто
+.а2н3арх
+.а2н3егер
+.а2н3екл
+.а2н3екум
+.а2н3елек
+.а2н3енер
+.а2н3епи
+.а2н3ерг
+.а2н3ерит
+.а2н3есте
+.а2н3идр
+.а2н3ирид
+.а2н3изог
+.а2н3изом
+.а2н3изур
+.а2н3јон
+.а2н3офт
+.а2н3окс
+.а2н3опис
+.а2н3орг
+.а2н3орх
+.а2н3овар
+.а2набап
+.а2набат
+.а2набаз
+.а2набио
+.а2набол
+.а2надем
+.а2надипл
+.а2надоз
+.а2нафаз
+.а2нафила
+.а2нафон
+.а2нафор
+.а2наген
+.а2нагно
+.а2награ
+.а2нахор
+.а2нахро
+.а2накал
+.а2накам
+.а2накат
+.а2накеф
+.а2накла
+.а2накли
+.а2накој
+.а2накол
+.а2накрон
+.а2накру
+.а2налеп
+.а2налис
+.а2налит
+.а2нализ
+.а2намне
+.а2нанео
+.а2напла
+.а2напле
+.а2напне
+.а2напно
+.а2напро
+.а2напти
+.а2нарт
+.а2насар
+.а2насеи
+.а2наспаз
+.а2наста
+.а2настиг
+.а2настом
+.а2натим
+.а2натоц
+.а2натом
+.а2натре
+.а2натри
+.а2натро
+.а2неор
+.а3г2нос
+.а3г2ноз
+.а4е2ро
+.б2
+.бе2ш3ћ
+.бе2ш3ч
+.бе2с3ц
+.бе2с3к
+.бе2с3п
+.бе2с3т
+.бе2з3алкохол
+.бе2з3атомск
+.бе2з3б
+.бе2з3д
+.бе2з3г
+.бе2з3и
+.бе2з3л
+.бе2з3љ
+.бе2з3м
+.бе2з3н
+.бе2з3њ
+.бе2з3о
+.бе2з3р
+.бе2з3у
+.бе2з3в
+.бе3с4крупул
+.бе3с4покоја
+.бе3с4покојн
+.бе3с4пора
+.бе3с4порн
+.бе3с4тид
+.бе3с4тија
+.бе3с4тиљ
+.бе3с4тилу
+.бе3с4трана
+.бе3с4трас
+.бе3с4твар
+.бе3з4беда
+.бе3з4бедн
+.бе3з4бели
+.бе3з4бједа
+.бе3з4бједн
+.бе3з4бол
+.бе3з4истан
+.бе3з4истен
+.бе3з4јач
+.бе3з4јак
+.бе3з4лоба
+.бе3з4лобн
+.бе3з4начај
+.бе3з4рача
+.бе3з4рачн
+.бе3з4уб
+.бе3з4уп
+.бе3з4вуча
+.бе3з4вучн
+.бе4о
+.бес4тселер
+.би4о
+.ц2
+.д2
+.џ2
+.ди2с3акор
+.ди2с3јунк
+.ди2с3конт
+.ди2с3корд
+.ди2с3кре
+.ди2с3кри
+.ди2с3кур
+.ди2с3квал
+.ди2с3ло
+.ди2с3ориј
+.ди2с3парит
+.ди2с3пон
+.ди2с3поз
+.ди2с3проп
+.ди2с3тон
+.ди2с3трак
+.ф2
+.г2
+.ге4о
+.х2
+.и2ш3ћ
+.и2ш3ч
+.и2ж3ђ
+.и2н3абруп
+.и2н3адек
+.и2н3афек
+.и2н3акце
+.и2н3акур
+.и2н3амор
+.и2н3аниц
+.и2н3аплик
+.и2н3апст
+.и2н3арт
+.и2н3аугур
+.и2н3аура
+.и2н3ед
+.и2н3ефек
+.и2н3ег
+.и2н3екс
+.и2н3екв
+.и2н3елиг
+.и2н3епц
+.и2н3евид
+.и2н3јек
+.и2н3јур
+.и2н3јуст
+.и2н3обл
+.и2н3офиц
+.и2н3окуп
+.и2н3опер
+.и2н3опор
+.и2н3опсе
+.и2н3умбр
+.и2н3унда
+.и2н3унк
+.и2н3утил
+.и2ноген
+.и2нокор
+.и2с3ц
+.и2с3к
+.и2с3п
+.и2с3т
+.и2з3аба
+.и2з3ака
+.и2з3анал
+.и2з3б
+.и2з3бија
+.и2з3бива
+.и2з3д
+.и2з3дај
+.и2з3г
+.и2з3и
+.и2з3л
+.и2з3љ
+.и2з3м
+.и2з3н
+.и2з3њ
+.и2з3о
+.и2з3р
+.и2з3у
+.и2з3в
+.и2з3ведб
+.и2з3веде
+.и2з3веди
+.и2з3ведн
+.и3с4как
+.и3с4кариот
+.и3с4кат
+.и3с4кин
+.и3с4кита
+.и3с4коч
+.и3с4конск
+.и3с4крам
+.и3с4крат
+.и3с4крен
+.и3с4крењ
+.и3с4крич
+.и3с4криш
+.и3с4криц
+.и3с4крит
+.и3с4крој
+.и3с4крса
+.и3с4крсн
+.и3с4купља
+.и3с4квас
+.и3с4кврч
+.и3с4лаб
+.и3с4лам
+.и3с4леђ
+.и3с4лед
+.и3с4лијеђ
+.и3с4лијед
+.и3с4лик
+.и3с4лин
+.и3с4љеђ
+.и3с4љед
+.и3с4лов
+.и3с4луш
+.и3с4луж
+.и3с4ме
+.и3с4мије
+.и3с4мје
+.и3с4паљив
+.и3с4пав
+.и3с4пира
+.и3с4плић
+.и3с4плит
+.и3с4покој
+.и3с4полин
+.и3с4пон
+.и3с4порав
+.и3с4права
+.и3с4прави
+.и3с4правк
+.и3с4прављ
+.и3с4правн
+.и3с4пупч
+.и3с4пур
+.и3с4ред
+.и3с4рк
+.и3с4таћ
+.и3с4такн
+.и3с4там
+.и3с4тар
+.и3с4тас
+.и3с4тави
+.и3с4тављ
+.и3с4тиц
+.и3с4тифан
+.и3с4тин
+.и3с4тир
+.и3с4точа
+.и3с4точн
+.и3с4точњ
+.и3с4ток
+.и3с4тори
+.и3с4трад
+.и3с4тран
+.и3с4трав
+.и3с4трић
+.и3с4триж
+.и3с4триц
+.и3с4труг
+.и3с4туп
+.и3с4уш
+.и3с4ук
+.и3с4ус
+.и3с4ут
+.и3з4бав
+.и3з4бичкава
+.и3з4блеушан
+.и3з4бојак
+.и3з4бојк
+.и3з4драв
+.и3з4гомет
+.и3з4гред
+.и3з4грн
+.и3з4грт
+.и3з4иђ
+.и3з4ид
+.и3з4ими
+.и3з4јежљ
+.и3з4лож
+.и3з4лог
+.и3з4лопаћ
+.и3з4лоз
+.и3з4ним
+.и3з4ној
+.и3з4олац
+.и3з4олат
+.и3з4олир
+.и3з4олов
+.и3з4рачи
+.и3з4раел
+.и3з4раиљ
+.и3з4ун
+.и3з4упч
+.и3з4вала
+.и3з4вале
+.и3з4вали
+.и3з4ваљи
+.и3з4валу
+.и3з4вижд
+.и3з4виискр
+.и3з4вија
+.и3з4вијен
+.и3з4вин
+.и3з4вињ
+.и3з4вир
+.и3з4витоп
+.и3з4вјед
+.и3з4војац
+.и3з4војц
+.и3з4вор
+.инте2р3а
+.инте2р3е
+.инте2р3и
+.инте2р3је
+.инте2р3о
+.инте2р3у
+.инте3р4ежџ
+.инте3р4егн
+.инте3р4еса
+.инте3р4есе
+.инте3р4еси
+.инте3р4есн
+.инте3р4есо
+.инте3р4есу
+.инте3р4ије
+.инте3р4огат
+.ист2к
+.из3бе2з3обр
+.из3бе2з3ум
+.из3г2н
+.из3ва2н3евр
+.из4оанем
+.из4оаном
+.из4обат
+.из4оброн
+.из4одим
+.из4один
+.из4одоз
+.из4офон
+.из4офот
+.из4огам
+.из4огео
+.из4оглос
+.из4огон
+.из4ограф
+.из4охал
+.из4охаз
+.из4охел
+.из4охиј
+.из4охим
+.из4охипс
+.из4охит
+.из4охор
+.из4охро
+.из4оклин
+.из4околон
+.из4олекс
+.из4олукс
+.из4омер
+.из4ометр
+.из4оморф
+.из4онеф
+.из4оном
+.из4опат
+.из4опер
+.из4опле
+.из4опол
+.из4опсеф
+.из4орах
+.из4осеи
+.из4осинт
+.из4осист
+.из4оскел
+.из4оскоп
+.из4остаз
+.из4осте
+.из4отах
+.из4отал
+.из4отер
+.из4отон
+.из4отоп
+.из4отро
+.иза3г2н
+.иза3т2к
+.изд2на
+.изд2но
+.изд2ну
+.изр2к
+.јури2с3к
+.јури2с3п
+.к2
+.љ2
+.м2
+.н2
+.на2д3жањ
+.на2д3ждр
+.на2д3же
+.на2д3жир
+.на2д3жив
+.на2д3жњ
+.на2д3жуп
+.на2д3игр
+.на2д3инж
+.на2д3ина
+.на2д3иск
+.на2д3јач
+.на2д3јах
+.на2д3јеч
+.на2д3јек
+.на2д3јез
+.на2д3јун
+.на2д3л
+.на2д3љ
+.на2д3оч
+.на2д3офи
+.на2д3ора
+.на2д3осе
+.на2д3осје
+.на2д3осо
+.на2д3рач
+.на2д3рашћ
+.на2д3ран
+.на2д3раст
+.на2д3реал
+.на2д3реп
+.на2д3руч
+.на2д3руг
+.на2д3рук
+.на2д3уч
+.на2д3удар
+.на2д3ум
+.на2д3в
+.на2ј3а
+.на2ј3е
+.на2ј3и
+.на2ј3о
+.на2ј3у
+.на3д2нев
+.на3д2нич
+.на3д2ниц
+.на3д4лан
+.на3д4леш
+.на3д4леж
+.на3д4вал
+.на3д4веси
+.на3д4вест
+.на3д4виј
+.на3д4вит
+.на3д4вла
+.на3д4воје
+.на3д4вор
+.на3ј4аш
+.на3ј4ажи
+.на3ј4ада
+.на3ј4аде
+.на3ј4ади
+.на3ј4ах
+.на3ј4ака
+.на3ј4ако
+.на3ј4ало
+.на3ј4ами
+.на3ј4амл
+.на3ј4амн
+.на3ј4арц
+.на3ј4ари
+.на3ј4арм
+.на3ј4ати
+.на3ј4аук
+.на3ј4ава
+.на3ј4аве
+.на3ј4ави
+.на3ј4ављ
+.на3ј4ази
+.на3ј4еже
+.на3ј4ежи
+.на3ј4ежу
+.на3ј4ец
+.на3ј4еда
+.на3ј4еди
+.на3ј4едн
+.на3ј4едр
+.на3ј4ести
+.на3ј4етк
+.на3ј4езд
+.на3ј4езн
+.на3ј4урен
+.на3ј4ури
+.на3т2ках
+.на3т2кам
+.на3т2касм
+.на3т2каст
+.наг2н
+.наг2њ
+.ну2с3пос
+.ну2с3про
+.ну2з3бел
+.ну2з3биљ
+.ну2з3љуб
+.ну2з3ре
+.ну2з3рје
+.ну2з3уж
+.о2б3игр
+.о2б3истин
+.о2б3истињ
+.о2б3ј
+.о2б3лај
+.о2б3лакш
+.о2б3лам
+.о2б3ласк
+.о2б3лећ
+.о2б3леж
+.о2б3леден
+.о2б3лег
+.о2б3леп
+.о2б3лет
+.о2б3лијеж
+.о2б3лијег
+.о2б3лијеп
+.о2б3лијет
+.о2б3лист
+.о2б3лив
+.о2б3лизат
+.о2б3лизав
+.о2б3лизи
+.о2б3љ
+.о2б3лока
+.о2б3луч
+.о2б3лук
+.о2б3ору
+.о2б3р
+.о2б3уж
+.о2б3убож
+.о2б3уд
+.о2б3уме
+.о2б3уми
+.о2б3умр
+.о2б3уз
+.о2д3жал
+.о2д3жаљ
+.о2д3же
+.о2д3жи
+.о2д3жв
+.о2д3арг
+.о2д3и2з3д
+.о2д3и2з3в
+.о2д3игр
+.о2д3иск
+.о2д3исти
+.о2д3ј
+.о2д3л
+.о2д3љ
+.о2д3ок
+.о2д3онд
+.о2д3онл
+.о2д3оно
+.о2д3ону
+.о2д3озд
+.о2д3озг
+.о2д3р
+.о2д3уч
+.о2д3ук
+.о2д3ул
+.о2д3ум
+.о2д3уве
+.о2д3уви
+.о2д3узд
+.о2д3узе
+.о2д3узи
+.о2д3узл
+.о2д3в
+.о3б4јеш
+.о3б4јек
+.о3б4јер
+.о3б4јеси
+.о3б4јет
+.о3б4љан
+.о3б4љут
+.о3б4љуз
+.о3б4рђ
+.о3б4рч
+.о3б4рш
+.о3б4раћ
+.о3б4рашч
+.о3б4рашн
+.о3б4раже
+.о3б4рамб
+.о3б4ран
+.о3б4рањ
+.о3б4рат
+.о3б4раза
+.о3б4разд
+.о3б4рази
+.о3б4разн
+.о3б4разо
+.о3б4разу
+.о3б4ређ
+.о3б4реч
+.о3б4реж
+.о3б4рец
+.о3б4ред
+.о3б4рем
+.о3б4рес
+.о3б4рети
+.о3б4ретн
+.о3б4рич
+.о3б4риц
+.о3б4риј
+.о3б4рис
+.о3б4рит
+.о3б4рив
+.о3б4рк
+.о3б4рл
+.о3б4рљ
+.о3б4рн
+.о3б4роћ
+.о3б4роч
+.о3б4рок
+.о3б4рон
+.о3б4рова
+.о3б4ровц
+.о3б4рс
+.о3б4руч
+.о3б4руш
+.о3б4рук
+.о3б4рун
+.о3б4рус
+.о3д4јећ
+.о3д4јен
+.о3д4јев
+.о3д4лаж
+.о3д4лаг
+.о3д4лака
+.о3д4лаз
+.о3д4луч
+.о3д4лук
+.о3д4рж
+.о3д4раћ
+.о3д4рачи
+.о3д4раж
+.о3д4рана
+.о3д4ране
+.о3д4рани
+.о3д4рано
+.о3д4рану
+.о3д4рапа
+.о3д4рапи
+.о3д4рапљ
+.о3д4раз
+.о3д4ређ
+.о3д4ред
+.о3д4рем
+.о3д4рен
+.о3д4рич
+.о3д4риш
+.о3д4риб
+.о3д4риц
+.о3д4рин
+.о3д4рињ
+.о3д4рл
+.о3д4рљ
+.о3д4рн
+.о3д4рон
+.о3д4роњ
+.о3д4рп
+.о3д4рт
+.о3д4руж
+.о3д4руг
+.о3д4рвеч
+.о3д4рвен
+.о3д4рвењ
+.о3д4важ
+.о3д4вај
+.о3д4веса
+.о3д4весн
+.о3д4вест
+.о3д4вић
+.о3д4викав
+.о3д4викн
+.о3д4вис
+.о3д4вој
+.о3т2ках
+.о3т2кам
+.о3т2касм
+.о3т2каст
+.обе2ш3ћ
+.обе2ш3ч
+.обе2с3ц
+.обе2с3к
+.обе2с3п
+.обе2с3т
+.обе2з3б
+.обе2з3д
+.обе2з3г
+.обе2з3ј
+.обе2з3л
+.обе2з3љ
+.обе2з3м
+.обе2з3н
+.обе2з3о
+.обе2з3р
+.обе2з3у
+.обе2з3в
+.обе3с4тан
+.обе3с4тиј
+.обе3с4тран
+.обе3з4нач
+.обе3з4нан
+.обе3з4нањ
+.обе3з4уб
+.обе3з4виј
+.од3г2н
+.од3м2н
+.ода3д2н
+.ода3г2н
+.по2д3адм
+.по2д3игр
+.по2д3изв
+.по2д3ј
+.по2д3лакат
+.по2д3лакт
+.по2д3лећ
+.по2д3леж
+.по2д3лег
+.по2д3леп
+.по2д3лет
+.по2д3лијећ
+.по2д3лијеж
+.по2д3лијег
+.по2д3лијеп
+.по2д3лијет
+.по2д3лист
+.по2д3лиз
+.по2д3љут
+.по2д3лок
+.по2д3лом
+.по2д3луч
+.по2д3луж
+.по2д3луп
+.по2д3оч
+.по2д3ош
+.по2д3оф
+.по2д3окн
+.по2д3ра2з3д
+.по2д3рад
+.по2д3рам
+.по2д3ран
+.по2д3рањ
+.по2д3рас
+.по2д3равн
+.по2д3равњ
+.по2д3разр
+.по2д3разу
+.по2д3реп
+.по2д3рес
+.по2д3рез
+.по2д3рик
+.по2д3рит
+.по2д3рож
+.по2д3рон
+.по2д3ров
+.по2д3руча
+.по2д3ручи
+.по2д3ручн
+.по2д3руб
+.по2д3рук
+.по2д3упла
+.по2д3усм
+.по2д3усн
+.по2д3вариј
+.по2д3веч
+.по2д3веж
+.по2д3вез
+.по2д3вик
+.по2д3вил
+.по2д3вир
+.по2д3влаш
+.по2д3влас
+.по2д3вођ
+.по2д3вож
+.по2д3вод
+.по2д3воз
+.по2д3врћ
+.по2д3врж
+.по2д3враћ
+.по2д3врат
+.по2д3врг
+.по2д3врис
+.по2д3врс
+.по2д3вућ
+.по2ст3егз
+.по2ст3инду
+.по2ст3лим
+.по2ст3онк
+.по2ст3опер
+.по3д2нев
+.по3д4јеч
+.по3д4јен
+.по3г2н
+.по3м2н
+.по3м2њ
+.по3р2ђ
+.по3т2ках
+.по3т2кам
+.по3т2кат
+.по3т2кав
+.пре2д3же
+.пре2д3жи
+.пре2д3ид
+.пре2д3игр
+.пре2д3испи
+.пре2д3исто
+.пре2д3истр
+.пре2д3изб
+.пре2д3ј
+.пре2д3обј
+.пре2д3одре
+.пре2д3окус
+.пре2д3осе
+.пре2д3осје
+.пре2д3осв
+.пре2д3рач
+.пре2д3рад
+.пре2д3рат
+.пре2д3руч
+.пре2д3убеђ
+.пре2д3убијеђ
+.пре2д3убјеђ
+.пре2д3удар
+.пре2д3угов
+.пре2д3упис
+.пре2д3усло
+.пре2д3увер
+.пре2д3увјер
+.пре2д3увјет
+.пре2д3в
+.пре3д4јен
+.пре3д4вај
+.пре3д4вар
+.пре3д4вест
+.пре3д4воја
+.пре3д4воје
+.пре3д4воји
+.пре3д4вор
+.пре3д4вос
+.пре3т2ках
+.пре3т2кам
+.пре3т2кат
+.пред3м2н
+.пред3м2њ
+.про3г2н
+.про3т2ка
+.про3т2ки
+.проти2в3акц
+.проти2в3оф
+.проти2в3отр
+.проти2в3р
+.проти2в3уд
+.проти2в3ус
+.р2
+.ра2ш3ћ
+.ра2ш3ч
+.ра2ж3ђ
+.ра2с3ц
+.ра2с3к
+.ра2с3п
+.ра2с3т
+.ра2з3анал
+.ра2з3б
+.ра2з3д
+.ра2з3е
+.ра2з3г
+.ра2з3и
+.ра2з3л
+.ра2з3љ
+.ра2з3м
+.ра2з3н
+.ра2з3њ
+.ра2з3оба
+.ра2з3обл
+.ра2з3обр
+.ра2з3од
+.ра2з3орат
+.ра2з3орав
+.ра2з3орт
+.ра2з3ору
+.ра2з3от
+.ра2з3р
+.ра2з3уда
+.ра2з3удб
+.ра2з3уди
+.ра2з3улар
+.ра2з3умр
+.ра2з3уве
+.ра2з3узд
+.ра2з3узе
+.ра2з3узи
+.ра2з3в
+.ра3ш4ћењ
+.ра3ш4чић
+.ра3с4как
+.ра3с4канд
+.ра3с4кин
+.ра3с4клад
+.ра3с4клањ
+.ра3с4клап
+.ра3с4клон
+.ра3с4клопа
+.ра3с4клопи
+.ра3с4клопљ
+.ра3с4кош
+.ра3с4кроп
+.ра3с4пај
+.ра3с4пав
+.ра3с4пета
+.ра3с4пете
+.ра3с4пети
+.ра3с4пето
+.ра3с4пику
+.ра3с4пињ
+.ра3с4плин
+.ра3с4плињ
+.ра3с4пн
+.ра3с4полож
+.ра3с4пон
+.ра3с4пор
+.ра3с4прав
+.ра3с4прем
+.ра3с4рђ
+.ра3с4рд
+.ра3с4ре
+.ра3с4тај
+.ра3с4тан
+.ра3с4тат
+.ра3с4тав
+.ра3с4тењ
+.ра3с4тил
+.ра3с4тињ
+.ра3с4тир
+.ра3с4тис
+.ра3с4тит
+.ра3с4тој
+.ра3с4трел
+.ра3с4трет
+.ра3с4трој
+.ра3с4трт
+.ра3с4тућ
+.ра3с4туп
+.ра3с4тур
+.ра3з4башур
+.ра3з4бад
+.ра3з4бан
+.ра3з4бар
+.ра3з4бау
+.ра3з4бој
+.ра3з4бор
+.ра3з4ев
+.ра3з4гађ
+.ра3з4грт
+.ра3з4иђ
+.ра3з4ић
+.ра3з4ид
+.ра3з4иј
+.ра3з4ин
+.ра3з4ир
+.ра3з4из
+.ра3з4лаг
+.ра3з4лаз
+.ра3з4лич
+.ра3з4лик
+.ра3з4лож
+.ра3з4лог
+.ра3з4лоз
+.ра3з4мећ
+.ра3з4мет
+.ра3з4мрск
+.ра3з4нат
+.ра3з4ред
+.ра3з4роч
+.ра3з4рок
+.ра3з4вал
+.ра3з4веде
+.ра3з4вест
+.ра3з4вић
+.ра3з4виго
+.ра3з4вија
+.ра3з4вије
+.ра3з4вију
+.ра3з4вит
+.ра3з4вој
+.ра3з4вон
+.ра3з4врћ
+.ра3з4враћ
+.ра3з4врат
+.ра3з4врт
+.ра4с5турч
+.раз3д2ни
+.раз3г2н
+.раза3г2н
+.раза3т2ка
+.с2
+.су2б3а
+.су2б3инв
+.су2б3јунк
+.су2б3л
+.су2б3окс
+.су2б3орд
+.су2б3реп
+.су2б3рог
+.су3б4аш
+.супе2р3а
+.супе2р3е
+.супе2р3и
+.супе2р3о
+.супе2р3у
+.супе3р4иор
+.тран2с3а
+.тран2с3ц
+.тран2с3е
+.тран2с3к
+.тран2с3л
+.тран2с3м
+.тран2с3н
+.тран2с3о
+.тран2с3п
+.тран2с3т
+.тран2с3у
+.тран2с3в
+.тран3с4еп
+.тран3с4кри
+.тран3с4уд
+.тран3с4ум
+.у2ш3ћ
+.у2ш3ч
+.у2с3ц
+.у2с3к
+.у2с3п
+.у2с3талас
+.у2с3тара
+.у2с3тећ
+.у2с3тег
+.у2с3тер
+.у2с3тов
+.у2с3трћ
+.у2с3трч
+.у2с3трај
+.у2с3трал
+.у2с3треб
+.у2с3треп
+.у2с3трес
+.у2с3трг
+.у2с3трк
+.у2с3трн
+.у2с3трп
+.у2с3тућ
+.у2с3тум
+.у2с3тур
+.у2с3тврђ
+.у2с3тврд
+.у2з3б
+.у2з3д
+.у2з3г
+.у2з3и
+.у2з3игр
+.у2з3инат
+.у2з3искр
+.у2з3л
+.у2з3љ
+.у2з3м
+.у2з3н
+.у2з3њ
+.у2з3обест
+.у2з3обијест
+.у2з3охо
+.у2з3орат
+.у2з3орав
+.у2з3р
+.у2з3угар
+.у2з3в
+.у3г2ми
+.у3г2н
+.у3с4как
+.у3с4клађ
+.у3с4клад
+.у3с4ко
+.у3с4куп
+.у3с4пало
+.у3с4пав
+.у3с4пеш
+.у3с4пех
+.у3с4пел
+.у3с4пем
+.у3с4пент
+.у3с4пет
+.у3с4пев
+.у3с4пија
+.у3с4пије
+.у3с4пијуш
+.у3с4пикуш
+.у3с4пјеш
+.у3с4пјех
+.у3с4пјел
+.у3с4пјем
+.у3с4пјет
+.у3с4пјев
+.у3с4пон
+.у3с4пора
+.у3с4пореч
+.у3с4порен
+.у3с4порењ
+.у3с4пори
+.у3с4пособ
+.у3с4према
+.у3с4преми
+.у3с4рђ
+.у3с4рж
+.у3с4ра
+.у3с4рд
+.у3с4ре
+.у3с4ријед
+.у3с4рк
+.у3с4рљ
+.у3с4рн
+.у3с4рп
+.у3з4бор
+.у3з4диц
+.у3з4лан
+.у3з4лат
+.у3з4лић
+.у3з4лиц
+.у3з4лим
+.у3з4лит
+.у3з4лов
+.у3з4лудоб
+.у3з4нач
+.у3з4нак
+.у3з4неве
+.у3з4невје
+.у3з4нич
+.у3з4ниц
+.у3з4ној
+.у3з4рет
+.у3з4рев
+.у3з4ријет
+.у3з4ријев
+.у3з4рн
+.у3з4рњ
+.у3з4роч
+.у3з4рока
+.у3з4роко
+.у3з4року
+.у3з4руј
+.у3з4ван
+.у3з4ват
+.у3з4виж
+.у3з4вија
+.у3з4вије
+.у3з4вијо
+.у3з4вију
+.у3з4вој
+.у4с5кош
+.у4с5коко
+.у4с5коле
+.у4с5колу
+.у4с5ком
+.у4с5копа
+.у4с5кора
+.у4с5коси
+.у4с5котр
+.у4с5ков
+.уза3т2ка
+.ва2н3евр
+.ва2н3устав
+.з2
+.за3г2н
+.за3т2ка
+2ђ1ђ
+2ђ1ћ
+2ђ1ч
+2ђ1ш
+2ђ1ж
+2ђ1б
+2ђ1ц
+2ђ1д
+2ђ1џ
+2ђ1ф
+2ђ1г
+2ђ1х
+2ђ1к
+2ђ1љ
+2ђ1м
+2ђ1н
+2ђ1р
+2ђ1с
+2ђ1з
+2ћ1ђ
+2ћ1ћ
+2ћ1ч
+2ћ1ш
+2ћ1ж
+2ћ1б
+2ћ1ц
+2ћ1д
+2ћ1џ
+2ћ1ф
+2ћ1г
+2ћ1х
+2ћ1к
+2ћ1љ
+2ћ1м
+2ћ1н
+2ћ1р
+2ћ1с
+2ћ1з
+2ч1ђ
+2ч1ћ
+2ч1ч
+2ч1ш
+2ч1ж
+2ч1б
+2ч1ц
+2ч1д
+2ч1џ
+2ч1ф
+2ч1г
+2ч1х
+2ч1ј
+2ч1к
+2ч1љ
+2ч1м
+2ч1н
+2ч1р
+2ч1с
+2ч1т
+2ч1з
+2ч3вј
+2ч3вл
+2ч3вљ
+2чв.
+2ш1ђ
+2ш1ш
+2ш1ж
+2ш1б
+2ш1д
+2ш1џ
+2ш1ф
+2ш1г
+2ш1х
+2ш1ј
+2ш1р
+2ш1с
+2ш1з
+2ш3чв
+2ш3цј
+2ш3цв
+2ш3мј
+2ш3мл
+2ш3мљ
+2ш3пј
+2ш3пл
+2ш3пљ
+2ш3тј
+2ш3тл
+2ш3тљ
+2ш3вл
+2ш3вљ
+2шћ.
+2шч.
+2шчћ
+2шчч
+2шчш
+2шчж
+2шчб
+2шчц
+2шчд
+2шчџ
+2шчф
+2шчг
+2шчх
+2шчј
+2шчк
+2шчљ
+2шчм
+2шчн
+2шчр
+2шчс
+2шчт
+2шчз
+2шц.
+2шцћ
+2шцч
+2шцш
+2шцж
+2шцб
+2шцц
+2шцд
+2шцџ
+2шцф
+2шцг
+2шцх
+2шцк
+2шцљ
+2шцм
+2шцн
+2шцр
+2шцс
+2шцт
+2шцз
+2шк.
+2шкђ
+2шкћ
+2шкч
+2шкш
+2шкж
+2шкб
+2шкц
+2шкд
+2шкџ
+2шкф
+2шкг
+2шкх
+2шкк
+2шкм
+2шкн
+2шкс
+2шкт
+2шкз
+2шљ.
+2шм.
+2шмђ
+2шмч
+2шмш
+2шмж
+2шмб
+2шмц
+2шмд
+2шмџ
+2шмф
+2шмг
+2шмх
+2шмк
+2шмм
+2шмн
+2шмс
+2шмт
+2шмз
+2шн.
+2шп.
+2шпђ
+2шпч
+2шпш
+2шпж
+2шпб
+2шпц
+2шпд
+2шпџ
+2шпф
+2шпг
+2шпх
+2шпк
+2шпм
+2шпн
+2шпс
+2шпт
+2шпз
+2шт.
+2штђ
+2штч
+2штш
+2штж
+2штб
+2штц
+2штд
+2штџ
+2штф
+2штг
+2штх
+2штк
+2штм
+2штн
+2штс
+2штт
+2штз
+2шв.
+2швђ
+2швч
+2швш
+2швж
+2швб
+2швц
+2швд
+2швџ
+2швф
+2швг
+2швх
+2швк
+2швм
+2швн
+2швс
+2швт
+2швз
+2ж1ћ
+2ж1ч
+2ж1ш
+2ж1ж
+2ж1ц
+2ж1џ
+2ж1ф
+2ж1х
+2ж1ј
+2ж1к
+2ж1р
+2ж1с
+2ж1т
+2ж1з
+2ж3бј
+2ж3бл
+2ж3бљ
+2ж3бр
+2ж3дј
+2ж3дл
+2ж3дљ
+2ж3дв
+2ж3гј
+2ж3гл
+2ж3гљ
+2ж3гр
+2ж3гв
+2ж3мј
+2ж3мл
+2ж3мљ
+2ж3мр
+2ж3вл
+2ж3вљ
+2жђ.
+2жб.
+2жбђ
+2жбч
+2жбш
+2жбж
+2жбб
+2жбц
+2жбд
+2жбџ
+2жбф
+2жбг
+2жбх
+2жбк
+2жбм
+2жбн
+2жбс
+2жбт
+2жбз
+2жд.
+2ждч
+2ждш
+2ждб
+2ждц
+2ждд
+2ждџ
+2ждф
+2ждг
+2ждх
+2ждк
+2ждм
+2ждн
+2ждс
+2ждт
+2ждз
+2жг.
+2жгч
+2жгш
+2жгж
+2жгб
+2жгц
+2жгд
+2жгџ
+2жгф
+2жгг
+2жгх
+2жгк
+2жгм
+2жгн
+2жгс
+2жгт
+2жгз
+2жл.
+2жљ.
+2жм.
+2жмђ
+2жмч
+2жмш
+2жмж
+2жмб
+2жмц
+2жмд
+2жмџ
+2жмф
+2жмг
+2жмх
+2жмк
+2жмм
+2жмн
+2жмс
+2жмт
+2жмз
+2жн.
+2жњ.
+2жвђ
+2жвч
+2жвш
+2жвж
+2жвб
+2жвц
+2жвд
+2жвџ
+2жвф
+2жвг
+2жвх
+2жвк
+2жвм
+2жвн
+2жвс
+2жвт
+2жвз
+2а1
+2б1ђ
+2б1ћ
+2б1ч
+2б1ш
+2б1ж
+2б1б
+2б1ц
+2б1д
+2б1џ
+2б1ф
+2б1г
+2б1х
+2б1к
+2б1м
+2б1н
+2б1с
+2б1т
+2б1з
+2бј.
+2бл.
+2бљ.
+2бр.
+2ц1ђ
+2ц1ћ
+2ц1ч
+2ц1ш
+2ц1ж
+2ц1б
+2ц1ц
+2ц1д
+2ц1џ
+2ц1ф
+2ц1г
+2ц1х
+2ц1к
+2ц1љ
+2ц1м
+2ц1н
+2ц1с
+2ц1т
+2ц1з
+2ц3вл
+2ц3вљ
+2цј.
+2цр.
+2цв.
+2д1ђ
+2д1ћ
+2д1ч
+2д1ш
+2д1б
+2д1ц
+2д1д
+2д1џ
+2д1ф
+2д1г
+2д1х
+2д1к
+2д1м
+2д1н
+2д1с
+2д1т
+2д1з
+2д3вл
+2д3вљ
+2д3вр
+2џ1ђ
+2џ1ћ
+2џ1ч
+2џ1ш
+2џ1ж
+2џ1б
+2џ1ц
+2џ1д
+2џ1џ
+2џ1ф
+2џ1г
+2џ1х
+2џ1ј
+2џ1к
+2џ1љ
+2џ1м
+2џ1н
+2џ1р
+2џ1с
+2џ1т
+2џ1з
+2џ.
+2дј.
+2дл.
+2дљ.
+2др.
+2дв.
+2е1
+2ф1ђ
+2ф1ћ
+2ф1ч
+2ф1ш
+2ф1ж
+2ф1б
+2ф1ц
+2ф1д
+2ф1џ
+2ф1ф
+2ф1г
+2ф1х
+2ф1к
+2ф1м
+2ф1н
+2ф1с
+2ф1т
+2ф1з
+2фј.
+2фл.
+2фљ.
+2фр.
+2г1ђ
+2г1ћ
+2г1ч
+2г1ш
+2г1ж
+2г1б
+2г1ц
+2г1д
+2г1џ
+2г1ф
+2г1г
+2г1х
+2г1к
+2г1м
+2г1н
+2г1с
+2г1т
+2г1з
+2г3вј
+2г3вл
+2г3вљ
+2г3вр
+2гј.
+2гл.
+2гљ.
+2гр.
+2гв.
+2х1ђ
+2х1ћ
+2х1ч
+2х1ш
+2х1ж
+2х1б
+2х1ц
+2х1д
+2х1џ
+2х1ф
+2х1г
+2х1х
+2х1к
+2х1м
+2х1н
+2х1с
+2х1т
+2х1з
+2х3вј
+2х3вл
+2х3вљ
+2х3вр
+2хј.
+2хл.
+2хљ.
+2хр.
+2хв.
+2хвђ
+2хвч
+2хвш
+2хвж
+2хвб
+2хвц
+2хвд
+2хвџ
+2хвф
+2хвг
+2хвх
+2хвк
+2хвм
+2хвн
+2хвс
+2хвт
+2хвз
+2и1
+2ј1ђ
+2ј1ћ
+2ј1ч
+2ј1ш
+2ј1ж
+2ј1б
+2ј1ц
+2ј1д
+2ј1џ
+2ј1ф
+2ј1г
+2ј1х
+2ј1ј
+2ј1к
+2ј1љ
+2ј1м
+2ј1н
+2ј1р
+2ј1с
+2ј1т
+2ј1з
+2к1ђ
+2к1ћ
+2к1ч
+2к1ш
+2к1ж
+2к1б
+2к1ц
+2к1д
+2к1џ
+2к1ф
+2к1г
+2к1х
+2к1к
+2к1м
+2к1н
+2к1с
+2к1т
+2к1з
+2к3вј
+2к3вл
+2к3вљ
+2кј.
+2кл.
+2кљ.
+2кр.
+2кв.
+2љ1ђ
+2љ1ћ
+2љ1ч
+2љ1ш
+2љ1ж
+2љ1б
+2љ1ц
+2љ1д
+2љ1џ
+2љ1ф
+2љ1г
+2љ1х
+2љ1ј
+2љ1к
+2љ1љ
+2љ1м
+2љ1н
+2љ1р
+2љ1с
+2љ1т
+2љ1з
+2м1ђ
+2м1ћ
+2м1ч
+2м1ш
+2м1ж
+2м1б
+2м1ц
+2м1д
+2м1џ
+2м1ф
+2м1г
+2м1х
+2м1к
+2м1м
+2м1н
+2м1с
+2м1т
+2м1з
+2мј.
+2мл.
+2мљ.
+2мр.
+2н1ђ
+2н1ћ
+2н1ч
+2н1ш
+2н1ж
+2н1б
+2н1ц
+2н1д
+2н1џ
+2н1ф
+2н1г
+2н1х
+2н1к
+2н1љ
+2н1м
+2н1н
+2н1р
+2н1с
+2н1т
+2н1з
+2о1
+2пј.
+2пл.
+2пљ.
+2пр.
+2р1ђ
+2р1ћ
+2р1ч
+2р1ш
+2р1ж
+2р1б
+2р1ц
+2р1д
+2р1џ
+2р1ф
+2р1г
+2р1х
+2р1ј
+2р1к
+2р1љ
+2р1м
+2р1н
+2р1р
+2р1с
+2р1т
+2р1з
+2с1ђ
+2с1ћ
+2с1ч
+2с1ш
+2с1ж
+2с1б
+2с1д
+2с1џ
+2с1ф
+2с1г
+2с1х
+2с1с
+2с1з
+2с3кј
+2с3кљ
+2с3тл
+2с3вљ
+2сц.
+2сцђ
+2сцћ
+2сцч
+2сцш
+2сцж
+2сцб
+2сцц
+2сцд
+2сцџ
+2сцф
+2сцг
+2сцх
+2сцк
+2сцљ
+2сцм
+2сцн
+2сцр
+2сцс
+2сцт
+2сцз
+2сј.
+2ск.
+2скђ
+2скћ
+2скч
+2скш
+2скж
+2скб
+2скц
+2скд
+2скџ
+2скф
+2скг
+2скх
+2скк
+2скм
+2скн
+2скс
+2скт
+2скз
+2сл.
+2сљ.
+2см.
+2смђ
+2смћ
+2смч
+2смш
+2смж
+2смб
+2смц
+2смд
+2смџ
+2смф
+2смг
+2смх
+2смк
+2смм
+2смн
+2смс
+2смт
+2смз
+2сн.
+2сњ.
+2сп.
+2спђ
+2спћ
+2спч
+2спш
+2спж
+2спб
+2спц
+2спд
+2спџ
+2спф
+2спг
+2спх
+2спк
+2спм
+2спн
+2спп
+2спс
+2спт
+2спв
+2спз
+2ср.
+2ст.
+2стђ
+2стћ
+2стч
+2стш
+2стж
+2стб
+2стц
+2стд
+2стџ
+2стф
+2стг
+2стх
+2стк
+2стм
+2стн
+2стп
+2стс
+2стт
+2стз
+2св.
+2свђ
+2свћ
+2свч
+2свш
+2свж
+2свб
+2свц
+2свд
+2свџ
+2свф
+2свг
+2свх
+2свк
+2свм
+2свн
+2свп
+2свс
+2свт
+2свв
+2свз
+2т1ђ
+2т1ћ
+2т1ч
+2т1ш
+2т1ж
+2т1б
+2т1ц
+2т1д
+2т1џ
+2т1ф
+2т1г
+2т1х
+2т1к
+2т1м
+2т1н
+2т1п
+2т1с
+2т1т
+2т1з
+2т3вј
+2т3вл
+2т3вљ
+2тј.
+2тл.
+2тљ.
+2тр.
+2тв.
+2у1
+2в1ђ
+2в1ћ
+2в1ч
+2в1ш
+2в1ж
+2в1б
+2в1ц
+2в1д
+2в1џ
+2в1ф
+2в1г
+2в1х
+2в1к
+2в1м
+2в1н
+2в1п
+2в1с
+2в1т
+2в1в
+2в1з
+2вј.
+2вл.
+2вљ.
+2вр.
+2з1ђ
+2з1ћ
+2з1ч
+2з1ш
+2з1ж
+2з1ц
+2з1џ
+2з1ф
+2з1х
+2з1к
+2з1п
+2з1с
+2з1з
+2з3бљ
+2з3дл
+2з3дљ
+2з3дв
+2з3гј
+2з3гљ
+2з3мл
+2з3мр
+2з3вл
+2з3вљ
+2зб.
+2збђ
+2збћ
+2збч
+2збш
+2збж
+2збб
+2збц
+2збд
+2збџ
+2збф
+2збг
+2збх
+2збк
+2збм
+2збн
+2збп
+2збс
+2збв
+2збз
+2зд.
+2здђ
+2здћ
+2здч
+2здш
+2здб
+2здц
+2здд
+2здџ
+2здф
+2здг
+2здх
+2здк
+2здм
+2здн
+2здп
+2здс
+2здз
+2зг.
+2згђ
+2згћ
+2згч
+2згж
+2згб
+2згц
+2згд
+2згџ
+2згф
+2згг
+2згх
+2згк
+2згм
+2згн
+2згп
+2згс
+2згз
+2зј.
+2зл.
+2зљ.
+2зм.
+2змђ
+2змћ
+2змч
+2змш
+2змж
+2змб
+2змц
+2змд
+2змџ
+2змф
+2змг
+2змх
+2змк
+2змм
+2змн
+2змп
+2змс
+2змв
+2змз
+2зн.
+2зњ.
+2зр.
+2зв.
+2звђ
+2звћ
+2звч
+2звш
+2звж
+2звб
+2звц
+2звд
+2звџ
+2звф
+2звг
+2звх
+2звк
+2звм
+2звн
+2звп
+2звс
+2звв
+2звз
+3ч2лан
+3ч2лањ
+3б2дењ
+3б2дет
+3б2дјењ
+3б2дјет
+3ц2мач
+3ц2мак
+3ц2миз
+3ц2мок
+3г2дегод.
+3г2декад
+3г2декак
+3г2дјегод.
+3г2дјекад
+3г2дјекак
+3г2мил
+3г2миљ
+3г2миз
+3г2нај
+3г2нежђ
+3г2нев
+3г2незд
+3г2нијежђ
+3г2нијезд
+3г2њав
+3г2њеч
+3г2њес
+3г2њет
+3г2њев
+3г2њил
+3г2њиљ
+3г2њио
+3г2њит
+3г2њур
+3г2ној
+3г2нос
+3г2ноз
+3х2тел
+3х2тењ
+3х2тети
+3х2тев
+3х2тјел
+3х2тјењ
+3х2тјети
+3х2тјев
+3к2неж
+3к2нез
+3к2њиж
+3к2њиг
+3м2наж
+3м2нож
+3м2ног
+3п2сич
+3п2сик
+3п2сов
+3п2суј
+3р2ђа
+3с2фер
+3т2маст
+3т2мул
+3т2муљ
+3т2муо
+3т2мур
+4р3је.
+4р3јем
+ч2в
+ш2ч
+ш2л
+ш2љ
+ш2м
+ш2н
+ш2п
+ш2т
+ш2в
+ж2ђ
+ж2б
+ж2д
+ж2г
+ж2л
+ж2љ
+ж2м
+ж2н
+ж2в
+а3а
+а3е
+а3и
+а3о
+а3у
+б2ј
+б2л
+б2љ
+б2р
+ц2ј
+ц2р
+ц2в
+д2ж
+д2ј
+д2л
+д2љ
+д2р
+д2в
+е3а
+е3е
+е3и
+е3о
+е3у
+ф2ј
+ф2л
+ф2љ
+ф2р
+г2л
+г2љ
+г2р
+г2в
+х2л
+х2љ
+х2р
+х2в
+и3а
+и3е
+и3и
+и3о
+и3у
+к2л
+к2љ
+к2р
+к2в
+л2ј
+м2л
+м2љ
+м2р
+не3г2де.
+не3г2дје.
+ни3г2де.
+ни3г2дје.
+о3а
+о3е
+о3и
+о3о
+о3у
+п2ј
+п2л
+п2љ
+п2р
+с2ц
+с2к
+с2л
+с2љ
+с2м
+с2н
+с2п
+с2р
+с2в
+т2ј
+т2л
+т2в
+у3а
+у3е
+у3и
+у3о
+у3у
+в2л
+в2љ
+в2р
+з2б
+з2д
+з2г
+з2ј
+з2л
+з2љ
+з2м
+з2н
+з2р
+з2в} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sr.rme b/tex/context/patterns/lang-sr.rme
new file mode 100644
index 000000000..7a4df255a
--- /dev/null
+++ b/tex/context/patterns/lang-sr.rme
@@ -0,0 +1,80 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: srhyphc.tex (2003-06-09)
+% Author: Aleksandar Jelenak <ajelenak AT yahoo.com>, Dejan Muhamedagić
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% This is `srhyphc.tex' file. It contains hyphenation patterns for Serbian
+% language in the Cyrillic alphabet. TeX font encoding is T2A.
+%
+% This file is distributed under the terms of the GNU General Public License.
+% Latest version of the license is at <http://www.gnu.org/copyleft/gpl.html>.
+%
+% Version: 1.0a
+% Last change: 2003-06-09
+%
+% Credits:
+% - Initial hyphenation patterns for T1 font encoding by Dejan Muhamedagić
+% - Improvements and adaptation to T2A font encoding by Strahinja Radić
+% - Further improvements and integration into one file by Aleksandar Jelenak
+%
+% Current maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
+%
+% \message{Serbian Cyrillic Hyphenation Patterns `srhyphc.tex' v1.0a <2003-06-09>}
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-sv.hyp b/tex/context/patterns/lang-sv.hyp
new file mode 100644
index 000000000..cff149089
--- /dev/null
+++ b/tex/context/patterns/lang-sv.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sv.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sv.pat b/tex/context/patterns/lang-sv.pat
new file mode 100644
index 000000000..b4aab06c3
--- /dev/null
+++ b/tex/context/patterns/lang-sv.pat
@@ -0,0 +1,4700 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-sv.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z ä å é ö
+
+\patterns{
+.a4b
+.ab5i
+.ab5ol
+.ab3r
+.ac3
+.a4d
+.a3dr
+.ad3s
+.a5g4ra
+.a5gre
+.a5kl
+.a5le
+.al4pr
+.a3lu
+.am4br
+.amp3l
+.a5mu
+.and4rar
+.a2n5es
+.ang4er
+.an5go
+.an5s
+.ap1p
+.as2k
+.a3sket
+.as4t
+.a5sten
+.a3sti
+.a5ta
+.at3t
+.au3st
+.a4val
+.av3s4
+.b4
+.bak5s
+.ben5s
+.bild3s
+.bo2k
+.bort1
+.cis4
+.cy5klop
+.d4
+.där3
+.ek1v
+.e3l4a
+.e2l5in
+.en5st
+.e4nä
+.e2r3i
+.e2s
+.e5skad
+.es3kal
+.es5kap
+.es4t
+.e5strad
+.e3tr
+.evan5
+.ex3
+.f4
+.feb3r
+.fram3
+.fres5
+.fågel3
+.för1a
+.för1en
+.g2
+.gu4lä
+.gus3
+.he2m
+.hu5sa
+.ib4
+.ik4
+.im3p
+.i2n1
+.i4na
+.in3d
+.in4ger
+.ink2
+.in3s2
+.in3t
+.is5ka
+.i3so
+.k4
+.kans4k
+.ko5li
+.kort5s
+.kring3
+.krings2
+.köp5s
+.l2
+.lak5r
+.lek5tr
+.lu2st
+.m2
+.mas2ke
+.ma5skeri
+.me4re
+.minis4
+.mjölk5s
+.mon2s
+.mån3s
+.må4st
+.män5sko
+.mörk5r
+.n4
+.ner1
+.no4n
+.nöd5r
+.oc1ku
+.ok3t
+.o3kv
+.o2ma
+.o2mo
+.om3s4
+.o3mu
+.on4k
+.o3o
+.ord3s
+.o5sc
+.o1s4k
+.o3sl
+.o3stra
+.o3sv
+.o3tr
+.o1u
+.p4
+.papp5s
+.pa3ste
+.pa5sti
+.pi5sti
+.pres2s
+.pub3lika
+.r2
+.re4gr
+.re2ste
+.runs4
+.rym2d
+.röve5
+.s4
+.sa2k
+.seg3r
+.si5o
+.sjö1
+.sk4
+.skott3s
+.slut3s
+.st4
+.sta2m
+.sten3s
+.string4
+.sup3p
+.t4
+.ta3bl
+.ta4k
+.tak5l
+.tes3ta
+.tig3r
+.til4l
+.ti3o
+.topp5s
+.tred2s
+.tre3s
+.trä5k
+.u3k
+.ult5r
+.ung2e
+.up2
+.u4ra
+.ur3s
+.u2t1
+.u4ta
+.u5trer
+.ut5s
+.v2
+.var4t
+.vatten3
+.ved5s
+.vä2g
+.väg3s
+.x2
+.y2a
+.y4e
+.ång3
+.år4s5
+.å3st
+.åter1
+.ä3ro
+.ö3ro
+a2b
+ab4bu
+a5be
+abel4s
+abe2s
+ab1l
+ab3la
+ab3ort
+ab5ric
+ab3rio
+ab4sc
+ab4sk
+a5bu
+ac4kes
+ac4kis
+ack3sk
+ack3u4p
+a5dag
+a5dek
+a5del
+ad5ep
+ad3j
+ad3op
+a5dran
+a3dre
+1adres
+ad3ril
+ad3ru
+ad2s
+a5ed
+af4fo
+3affä
+1af3ri
+af4tor
+a1ga
+aga4ra
+a1ge
+a2ge.
+ag1gr
+ag1l
+ag5ord
+ag3ro
+a4gur
+a4hj
+aib4
+a3iv
+a1j
+a3ka
+a4kart
+a5ke
+a1ki
+ak3n
+a1ko
+ak5ram
+akri5s
+ak3rob
+ak4sta
+1aktig
+ak3tri
+a1ku
+a5kvari
+ak3ve
+a5kår
+ak5åt
+4akö
+a1la
+al5adm
+ali2br
+a2lin
+a5lin.
+a3line
+al3ins
+ali5stik
+a4lj
+alk3ak
+al2kv
+al4kä
+all3st
+al3lå
+alms4k
+a1lo
+al5ort
+als5pa
+al3tr
+al4tu
+al4tä
+a1lu
+alu5s
+alv3s
+a1ly
+a4maf
+am4i
+am4pr
+am1s
+am3åt
+a3mö
+ana4bo
+an3alf
+an3ark
+an3c
+anci5
+an5dak
+andel2s
+an4dun
+an4dän
+a4nef
+ang4es
+an3gi
+an1gr
+aniu4
+ank3r
+ano2i
+a4nok
+a4nop
+an5sce
+ansis3t
+an4sj
+ans5ku
+ans3li
+ans3par
+an1st
+an4sto
+an4sty
+1ansvar
+an4tj
+an4tre
+a1nu
+a5ny
+a3nö
+a1o
+a1pe
+a2pe.
+ape4n3
+a1pi
+ap4lan
+apo3str
+1appara
+apps4k
+ap3ric
+ap3rif
+a5pris
+ap2s
+ap3se
+aps5l
+aps3p
+apu5s
+a5py
+a5pä
+2ara
+a4rann
+a4rarv
+1arb
+4arbi
+2arbo
+4arbr
+ar3dr
+ard5st
+a4rend
+arg5si
+2arh
+a1ri
+a4rigen
+ar3ka
+ark3lan
+ar5kr
+4arl
+4arn.
+ar4nal
+a1ro
+a2rob
+4arp
+ar2sa
+ar5skal
+arsk5l
+ar2sv
+ar4tro
+arts5p
+ar4tur
+4aru
+a4rur
+a5rus
+ar4väg
+a3ry
+a3rä
+2asa
+asbe4
+a1sc
+as2h
+asis5t
+as3kis
+a2sko
+a4skr
+as3ku
+as5l
+as3pa
+as3pig
+as2sk
+as2s5op
+as2sp
+as2st
+ass5up
+as3ta
+a5stard
+as5ter
+as5tiker
+asti5o
+as3to
+as4tr
+ast5rak
+a5stral
+ast3rol
+as5tör
+a3su
+a4sul
+a4sund
+as2ut
+as3v
+a1sy
+a2s5å
+a2sö
+a1t
+ata5ra
+a5te
+ati5ö
+a4tj
+a2tr
+a3tral
+4atrar
+a4t3re
+at3ria
+a3tric
+at3rie
+a5trik
+a3tris
+a3t4ro
+a4tro.
+at4ska
+1attac
+at2tak
+at4tj
+at4tos
+att3s
+a4tung
+2au
+au5b
+au2t5a
+3autom
+aut5s
+2a1va
+a4vart
+1avg
+2a1vi
+av3r
+4a3vä
+a5å
+1b2
+3ba
+ba4di
+ba4do
+bad3s4
+bak5l
+ba4ko
+ba4ku
+bank5l
+bas4ta
+ba5stu
+4bb
+b4bak
+b4batt
+bbb4
+bb3l
+bb4ler
+b4b3r
+bb4so
+4b3d
+3be
+be3d4r
+be5e
+be1k
+4beld
+be5lu
+be3ly
+be3lå
+be5lö
+beng4
+be3nå
+be1rö
+be1s
+be3sl
+bes5s
+be4sta
+be4ste
+be5su
+be3tr
+be3tv
+be3u
+4bex
+2b3f
+2b5h
+3bi
+bi3d4
+4binv
+bis3ko
+bi5skv
+b3je
+b3k
+b5lar
+b5lat
+ble4mo
+b5len
+5blera
+3bles
+5blid
+3blikr
+3bliks
+4b3m
+2b3n
+3bo
+bo4gr
+bo2kl
+bo1mu
+5bon
+bors5te
+bor4ti
+bort3r
+borts2
+bort3sl
+bo1s
+bo4sc
+boy5
+4b3p
+2b5raf
+4brar
+2b5rati
+3brik.
+b3rika
+3brike
+3briks
+b5rikö
+bru4st
+3bry
+3brö
+4b3s
+b5sce
+bs3ch
+b4slan
+b4sof
+b4sp
+bst4
+b4stj
+4b3t
+3bu
+bund4s
+bus2st
+b3v
+3by
+by5r
+3bå
+bång3
+båt2s
+3bä
+3bö
+bör2s
+c2
+5cap
+c3c
+1c4e
+cens3t
+3centr
+ceu4s
+4ch.
+3chau
+3chef
+5choc
+4cht
+chäs3
+chör4
+1ci
+ci4lu
+cim2
+cipp4
+4ck
+c3ka
+c3ke
+c3ki
+ck5j
+ck1l
+ck5lis
+ck3n
+c3ko
+c4kordn
+ck3org
+c4kort
+ck3r
+ck4re
+ck3sla
+ckus2
+ck3va
+ck3ve
+ck3vä
+ck5ä
+ck3ö
+cle2a
+co2a
+co4m
+4cr
+cros2
+4cs
+1cy
+1d
+3da
+5da.
+4dadr
+dags3
+2dak
+5dako
+da3li
+5dam
+da3må
+4dand.
+4d1ap
+4darb
+4dart
+da4tr
+dat5t
+4dax
+2db
+4dc
+dcen3
+2dd
+ddd4
+ddi4s
+d3dj
+d4dos
+dd3ra
+dd3re
+dd3ri
+d3drä
+dd2s
+dds3v
+3d2e
+de1k4
+4deko
+4deld
+del2sa
+dels5ti
+de5lut
+d4en
+denti5ö
+den2to
+de3pr
+5der
+der1k
+de2ro
+de5rol
+der5sti
+de4ru
+de2s
+de3se
+de3sp
+des3ti
+d4et
+de3tr
+4dex
+2d1f
+dfö3ra
+2d1g
+d3gl
+2d5h
+3di
+dias4
+di5el
+di2gr
+di3ka
+di5ku
+4dinf
+din3g4o
+4dinr
+4dins
+2dinsp
+4dint
+di1o
+di4od
+di3sc
+di4sj
+dis3ko
+dis1kr
+dis1p
+dis5to
+dis3tra
+di4tre
+2dj
+d3jor
+djup5p
+3djur
+2d3k2
+4d5l
+2d1m
+2d1n
+3do
+d2ol
+do5lo
+4domr
+dom2sk
+5don
+do4pak
+4d5ord
+4dori
+4dort
+d5ost
+do3y
+2d1p
+2d2r2
+d3rad
+3d4rag
+d3rand
+d5rarb
+d5rassera
+d5ratu
+3drej
+d3ren
+5dres
+d3ret
+d4ric
+3drif
+d3rig
+4d5rik
+d3rin
+3d4riv
+d5roc
+3dropp
+d3ror
+4drot
+drotts3
+d3räkn
+3dräkt
+5drän
+d3rät
+d5röd
+4ds
+d2s1an
+d2se
+ds5enh
+d4sf
+d2si
+ds3ins
+d2sj
+dsk2
+d3skef
+ds4ken
+d3ski
+ds3kl
+ds5kn
+ds1l
+ds4lot
+ds4mo
+d4små
+ds5nå
+d2so
+ds3pl
+ds3s4
+ds3tal
+d5stat
+ds4te
+dste4a
+d5stig
+ds3tin
+ds5tro
+d2su
+ds1v
+d2sö
+2d3t
+3du
+dub3ble
+4dup
+du1s
+du2sc
+du4ste
+du5sö
+4dut
+du4vu
+2d1v
+d3vr
+2d3w
+3dy
+dy4kan
+dy4ro
+4dz
+5dåg
+2dås
+4dåt
+4däg
+dä2r
+3dö
+döds1
+4dög
+4döp
+d5öst
+dé4
+e1a
+e2ake
+e4am
+4eb
+e2br
+eb3ril
+4ec
+e3ch
+echiff5
+ecis4
+e3co
+e2d
+e4dans
+edd4r
+edi4u
+ed3j
+e5dral
+ed1sk
+ed2sko
+ed3s2l
+edso4
+e3då
+e1e
+e2ed
+e4ei
+ee2k5
+e4en.
+e4ene
+e1f
+ef4s
+3efte
+e1g
+e3ga
+e3ge
+ege2l
+eg1l
+eg2ler
+e3glera
+e5gleri
+e4gran
+eg5rat
+eg3rin
+e5gru
+egs3
+e5gå
+eig2
+ei5gn
+e3ik
+e1in
+ei5sh
+e1isk
+e1jo
+e3ju
+e3jä
+e5jö
+e3ka
+e1ki
+e1kl
+ek3lat
+ek4le
+ek3n
+e1ko
+ekord5s
+ek3orr
+ek4ret.
+ek5ro
+e1ku
+e1kve
+ek5vis
+e1ky
+e1kä
+e1la
+el1akt
+el4arb
+3eld.
+eleb3r
+elekt3ri
+el4fra
+eli5ku
+el3k4
+el3li
+ell3s
+el3lä
+e1lo
+e4lob
+el3p
+el2si
+el5ug
+e5luv
+2e1lä
+e1m
+e5mat
+e5mis
+emon1s
+em5ort
+emp5le
+en5art
+e2nav
+en4ce
+e4ned
+e4nek
+ene3rö
+2enj
+en5klo
+en3kn
+en5kr
+en5kä
+enning5
+ennings2
+eno2m
+en3si
+ens5ke
+ens2m
+en2sp
+ens4te
+ens4vin
+en4så
+ent4ha
+en2t1r
+ent4rat.
+ent3rati
+ent3ri
+ent5ru
+e5nus
+2eny
+2e1nä
+e1o
+e2og
+eo4i
+e5or
+2ep
+e1pe
+e1pi
+e3pla
+ep5le
+epp2s3
+epps5t
+e1pr
+ep3s
+ep4tr
+epu3b
+e3på
+er1ak
+4eras
+er3d4
+erg4l
+er4gu
+er4gås
+e1ri
+e5rib
+e4rinf
+erings3
+eri5stik
+erk4lin
+erlä4
+er5na
+e1ro
+e3rob
+e2rom
+erp4
+er3ra
+er5sc
+ers4ken
+er3sl
+ers4le
+er4sta
+er2ste
+er3str
+er3sv
+e1ru
+e5rum
+e3ry
+e5råd
+e1rä
+e2sal
+es5all
+es3arm
+e1sc
+2ese
+es4hi
+esi4u
+es2k
+e4skan
+es5kar
+e4s3ken
+es3ker
+es5kul
+e1sl
+e5slag
+es2mi
+e1sp
+es3pl
+es2sk
+ess5lä
+es2st
+e3stal
+es5ten.
+esti2ge
+es3tin
+es5tor.
+es4tr
+est5rer
+e3stru
+est4rö
+e3stå
+es2u
+e1sy
+eta3b
+e5ti
+eti3ö
+e1to
+e5tri.
+et3ris
+e5trä
+et2s
+ets2ad
+ets3kr
+ets1l
+ets3m
+ets5pa
+et4sv
+ett3r
+e1tu
+etu4ri
+et4va
+et5vu
+e1ty
+2etz
+e1tä
+etäc4
+euk4
+e5um.
+e5up4
+4eur
+eu4se.
+eu5tro
+e1v
+e4varm
+e4vj
+ev3r
+3exp
+ext4r
+4eä
+f2
+3fa
+fac4
+fac5ke
+4fans
+4farb
+fa3sh
+fa4st
+fa4tö
+4fav
+4f3b
+f3d
+3fe
+4fef
+fe2l
+fes5ta
+fe3sto
+4fex
+2f1f
+fff4
+ff3l
+ff3n
+f3fo
+ff3r
+ffs4
+f3fä
+ffö5re
+f3g2
+f5h
+3fi
+fi2br
+fib5rig
+fi3li
+fin5sm
+fi3skal
+fisk3r
+fi2ti
+2f3k
+1fl
+flo4da
+4f3m
+fma4
+1fo
+4fof
+fol2
+folk1
+2f5om
+fo2na
+for4mo
+fost3r
+4f3p
+fra2m
+fram5p
+f4rer
+5freri
+fre4s
+f4ri.
+fri5sp
+5frit
+fros5ta
+fru5str
+från5
+2f3s
+fs2k
+f4sl
+f4sm
+f4sn
+f4sp
+f4st
+f4sv
+2ft
+f3ta
+f4taf
+f4tak
+f4tap
+f4tarm
+fte4r
+f4tex
+f3ti
+f4tin
+f3to
+f4t3r
+ft2sa
+ft4set
+ft2s5i
+ft4sj
+fts4t
+fts5vä
+ft5t
+ft1v
+3fu
+furs5te
+fu5ru
+fu3tu
+4fv
+5fy
+fy4ma
+få3tö
+1fä
+fäs5ti
+3fö
+fö2ra
+fö2ren
+fö2ri
+för3k
+för3sm
+för3su
+fört4
+för1ö
+ga5br
+3g2ag
+4gakt
+3g2al
+gall3s
+ga5lä
+ga4no
+2garb
+4garm
+ga2ro
+4gart
+ga4st
+ga4su
+5g2ati
+gaus4
+g4av
+g5avsn
+4gax
+2gb
+2gd
+g3d4r
+ge2a
+ge5b4
+2gef
+2ge4j
+g2eli
+3gelis
+gel5st
+gel5y
+3gelä
+gel5än
+g4em
+ge4nap
+gen5g
+3g2eni
+3genj
+4genm
+genom5
+gen4sa
+g4ense
+1g2ent
+4genv
+ge5ny
+3genä
+ge2o
+1g2era
+4gerarb
+3g2eri
+gers5n
+5gese
+ge4to
+get5s
+5g2ett
+2g1f
+2gg
+g1ga
+g4gap
+g1ge
+gg5g
+gg1l
+g4gos
+ggs4la
+ggs4m
+gg3s4t
+gg3s4v
+g4gu
+2gh
+gh4te
+1g2i
+gi1o
+gi5sn
+gi4ste
+gis4tr
+gi5stral
+gi5st4rat
+3giv
+gi2ö
+g2jo
+3gjor
+g3jä
+2g3k2
+2gl
+g4lans
+g1lar
+g2las
+5glase
+glas5k
+5glasö
+g4lid
+4glj
+g4lög
+5glöm
+2g1m
+2g1n
+g4nag
+g2no
+1g2o
+3go.
+3gol
+gon3s4
+4gont
+2gord
+4gorm
+4gort
+go3sl
+2g1p
+g2r4
+3graf
+5gral
+gra2m5
+5grans
+4gras
+5grec
+5grett
+g3rig
+4g5rik
+5grip
+3gris
+g5roi
+gro2v
+4grum
+grus5t
+g4rå
+5grå.
+grä4n
+5gräns
+2g2s
+gs1an
+g5satt
+g3sel
+g4sf
+gsi4d
+g3sju
+g5skaf
+gs4ki
+gs3kn
+gs4kot
+g3sky
+gs1l
+gs1m
+g4sme
+gs3n
+gs4ni
+gs4nö
+gs1or
+gs3pl
+gs3po
+gs4por
+gs5pre
+gs3pu
+gs3s
+gs3tak
+gs3tal
+g3stark
+gs4ten
+g3stif
+gs3till
+gs3tj
+g3stol
+gs3tra
+gst4re
+g3stäm
+g4sug
+gs1v
+g4s3ve
+gs3vi
+gs3vå
+gs3yt
+gs1ä
+2g1t
+g3tr
+1g2u
+4gug
+guld3
+gul4da
+4gulä
+gu2ma
+4gup
+gu5ru
+gus4k
+2gut
+g3utb
+2g1v
+4gw
+3gy
+gytt3j
+1g2å
+gårds5
+2g5åri
+g4äl
+g2är
+gä4s
+1g2ö
+4gög
+gö5ro
+2g5ört
+1h
+ha3bl
+ha5ge
+ha4li
+hal4so
+halv3å
+ham4st
+handels3
+hands4l
+han5g2a
+ha5ra
+ha4sc
+ha4sp
+hasp5l
+has3t
+hav2
+havs3
+h5c
+4hd
+he4at
+he4fr
+he4lä
+hets1
+hets3t
+hets3v
+h3g
+h2i
+4hir
+his2sk
+hi4t
+hjäl3s
+h1k
+2hl
+h4le
+2hm
+4hn
+h2na
+h2nit
+ho5nu
+hop5plo
+hop3s
+hos3p
+hos5ti
+4how
+h3p
+h5ru
+h1s
+2ht
+hu2s
+hust5r
+hyg5r
+hys4t
+hys5ta
+hy3ster
+hård5s4
+häll2
+hälls1
+hälso3
+hä4ri
+hä4s
+hä4var
+h2ö
+hö2g
+hö5gen
+hög5r
+hörn5s
+hö4s
+höst5r
+i1a
+ia3fr
+ia3g
+ia4lu
+ia4sk
+ia3tr
+i2b3l
+i5bril
+i3ca
+i4ce.
+i5cha
+ic4kord
+ick3u4
+i5co
+i2d
+iden3s
+id4ge
+i4dom
+id1r
+id3ro
+id2s
+ids3v
+i4dun
+i3då
+i4dö
+2i1e
+ifes4
+i5fn
+i1fr
+3ifrån
+i1g
+4igan
+i2geb
+ig5ej
+ig1l
+ig3no
+i3i
+i4kart
+i1ki
+i3klo
+ik5län
+ik3n
+i1ko
+ik3re
+i5krob
+ik5rof
+ik5ros
+ik5s2h
+ik5skor
+i3kul
+i3kum
+ik5u4t
+ik1v
+i3ky
+i3kå
+i3kö
+i1la
+il4dan
+i2lin
+il1jö
+il5k
+il5lak
+il4lik
+ill3s2
+3illu
+il5lär
+il2min
+i1lo
+il2tj
+i3lu
+ilufts5
+i4lup
+i5lä
+im2b3r
+im5sm
+im4so
+i1mu
+i5må
+i3mä
+i5mö
+i4nau
+ind5skä
+ind5sti
+1indu
+in4ga
+in4ge.
+ing4es.
+ing5is
+in5glas
+ings5te
+i3ni
+i4nif
+in5j
+in5kve
+1inneh
+5inre
+1inri
+3inrä
+in4sem
+in3skrä
+in3sl
+ins4m
+in3sn
+1inspe
+5inspeln
+in5spr
+3instink
+3instru
+in4stå
+in5te
+1intr
+in4tra
+int3s
+i1nu
+i4nun
+in3ym
+i1nä
+i5oc
+i1og
+i3ok
+io4kr
+i1ol
+io5li
+i5om
+ion2
+i3ono
+ions3
+i1op
+i1or
+i1os
+i1ot
+i1pe
+i1pi
+ipos4
+ip5pi
+i3ra
+i4res
+i1ri
+irk5l
+i1ro
+iro3p
+i1ru
+i5sce
+isel4
+is2h
+i2sk
+is5kep
+isk5na
+is3kopa
+is3ku
+is4kun
+is3ky
+i5slam
+is3län
+is3m
+is3n
+i2s3p
+is4pri
+is3sa
+is3se
+iss5n
+is4s3tr
+iss3tä
+i1stal
+i1stans
+ist5att
+is5ten.
+i1stent
+is4tes
+is3tig
+is5ting
+is5tor.
+is5tore
+ist5ro
+istå4
+is5v
+i3sy
+i4så
+i1t
+it5c
+i4tei
+i4tex
+i4tj
+it5ran
+i5trin
+i3tris
+it2t5op
+it4t3r
+it4tu
+i2t5å
+4i1u
+i1va
+i2vak
+i1vi
+i4vin
+iv3r
+iv2s
+i1vå
+ix2t
+ix5tu
+i1ö
+1ja
+3jakt.
+4jarb
+jas5p
+2jb
+2jd
+jd3r
+jd4sty
+j4du
+1je
+je2a
+5jef
+je5sta
+2j1f
+4j3g
+4jh
+1ji
+4jin
+4jk
+j4kl
+j3ko
+jk3v
+2j1l
+2jm
+2j1n
+j2o
+3job
+jo4kr
+4jolj
+jo5lö
+jor4din
+jord3s4
+3jou
+4jp
+j5pl
+2j3r
+2j1s
+j5sa
+j4sk
+js4me
+js4te
+2jt
+jts4
+2j2u
+ju4kos
+juk3s
+jul3k
+4jur
+jus5kr
+juss4
+jus4t
+jus5ta
+jut4sta
+jä5lo
+jäl4p5r
+jäl4sa
+järn3sk
+jär5s
+jör2s
+jös4t
+5jé
+1k2a
+3ka.
+3kad.
+3kade.
+ka4dr
+2kaf
+5kafä
+ka3i
+ka5ju
+2kak
+k3akti
+4kalf
+4kalg
+kal4lo
+kall3s
+3kamp
+3kamr
+3kan.
+4kand.
+5kano
+2kap
+3kapi
+ka5pla
+kap4pr
+kaps5t
+5kapten
+3kar.
+ka3ra
+4karb
+k5arbet
+ka5ri
+4kark
+3karna
+4karp
+karp5s
+4kart.
+4karte
+4karv
+3kas
+ka4sk
+kas3ti
+3kat.
+3kats.
+4kau
+2kb
+4kc
+2k3d4
+kdom4
+1k2e
+3ke.
+2ked.
+2keda
+ke3dr
+ked4s
+ke4er
+2kefu
+4keld
+kels4
+4kense
+ke5nå
+2kep
+3kern
+ke2s
+kes3s
+4kex
+2k1f
+kfö2
+kfö3ri
+2k5g4
+2kh4
+kid3s
+4kif
+1kig
+kik4s
+kilt4
+5kimå
+king3r
+4kinne
+4kins
+2kint
+ki4nu
+ki4tr
+kiv3s
+4kj
+5kjol
+k3jä
+2k3k
+kl2
+1klag
+k2lama
+kla4mi
+3klang.
+3klass
+2klat
+5klav
+2kle
+k2lej
+2klig
+k2lim
+3klip
+k2lis
+5klist3r
+k5lock.
+5klocka
+3klos
+1klub
+4kluk
+1kläd
+2k3läg
+2k1m
+2k2n
+k4nal
+3k4nap
+5knip
+3k4niv
+3k4nu
+k4ny
+k5nyk
+k2o
+4koc
+ko5de
+k5odl
+kog3n
+ko4gr
+kog4s3
+4kola
+ko2lin
+4kolj
+kol5tr
+5kolv.
+1kom
+3komm
+5komp
+2k3omr
+kom4s
+1kon
+3konf
+3konst
+3kont
+ko3nu
+1kor
+3korg
+ko3ri
+2korr
+3korres
+5kortera
+ko5s4k
+ko3sl
+3kost
+ko4str
+4k3ou
+2k1p
+k2r4
+3kraf
+5kra3ge
+4krang
+5krera
+k4reten
+krid5s2
+1krig
+krigs3
+krings2k
+4kriv
+3kropp
+kropps5
+kru5stad
+k3ryg
+kråk5s
+krå4pa
+k5rädd.
+kräk5l
+4kräl
+k3rät
+2ks
+ksaks5
+k2s5as
+ks3ch
+k4ser
+ks2k4
+ks3kl
+ks5kra
+ks5kv
+k3skä
+k3skö
+k5slag.
+ks2li
+k5sly
+k2so
+ks3pl
+k1s4t
+kstavs3
+ks5tid
+k2su
+4k1t
+k4tex
+kti5ge
+k4tinn
+k2tins
+k2tod
+k2tom
+k2tr
+kt3re
+kt3rin
+k5trod
+kt5rog
+kt3rol
+kt5rät
+kt2st
+kt5t4
+k4tug
+k2tut
+k4täl
+4kug
+k5ugn
+ku5la
+4kuld
+3kulö
+kum5pl
+kungs5
+5kunn
+ku4pen
+ku4ro
+3kurs
+3kus
+kust3a
+kv4
+3kvali
+k5vare
+3kvarn
+kvar3s
+3kvart
+k4vato
+k2ve
+2kvente
+1kvinn
+5kvire
+k4vo
+k1vå
+3kväll
+k1vär
+kydds3
+ky4lin
+3kyrk
+käl4m
+5kämp
+5känn
+3käns
+3kärl
+4kög
+köks5t
+5köp.
+kör4l
+kör4sl
+3la.
+1lade.
+2ladm
+4ladr
+2laf
+3lagd.
+la4gin
+5lagm
+lag3r
+2lak
+5lakan.
+5laki
+3laktis
+la5lo
+3lande.
+lan4di
+2lappara
+2larb
+1larn
+lar5s
+4lart
+las3h
+4lask
+la4st
+5laste.
+1lat.
+la5tr
+lat4tis
+2lau
+2lav
+la5vu
+2lb4
+4l1c
+2l2d
+lder4s
+l3dj
+ld3ra
+l5dry
+lds4an
+1le
+3le.
+le4ge.
+le5ig
+le2kl
+le4kv
+lem4sö
+2l5enl
+3ler.
+ler5k
+3lern
+ler3ste
+le5s2l
+le5tå
+le3um
+le4vu
+2lex
+2l1f
+2l1g
+l2gj
+l3g2l
+lgs4
+lg5st
+2lh
+1li
+li5ch
+3lif
+3lig
+li4go
+lig3s
+lik2l
+li5kli
+lik3s
+5limer
+2lind
+2linga.
+ling5o
+4lingr
+lings5t
+2lini
+5linj
+2lint
+li1o
+2lip
+lis3c
+li4sta
+li3strö
+li4vo
+livs1
+l2jak
+4l1jo
+1lju
+l5jå
+l1jä
+l3jör
+2l1k
+l3ke
+l5kju
+l2kl
+lk5lag
+l5klä
+l2kr
+l3k4ra
+lk3t
+l1la
+lld4
+ll3dr
+lle5b
+ll3k
+ll1l
+l1lo
+llok5v
+ll3p
+ll4san
+ll2se
+ll3ska
+ll2so
+ll4sva
+ll4tig
+ll3tr
+l1lu
+ll5un
+llust3ra
+ll5v
+l5ly
+lläggs5
+l5löd
+llör4
+ll5ört
+4l1m
+l4mol
+lm3st
+l1n
+lo2af
+loc4ku
+4lodl
+lo4do
+lod3st
+lo2ge.
+2lolj
+2lom
+4lord
+2lorg
+lor4s
+lo4vo
+l4pak
+l1pe
+l1pi
+l5pla
+lp5lö
+lp4st
+4l3r
+2l1s
+l2sc
+l4sjo
+l4sjä
+l2sk
+l4skensv
+l3ski
+lsk3n
+l5skot
+l3skrä
+l3sky
+l3skå
+lskå4p
+l3skä
+l3slu
+l4sm
+ls4mo
+ls5nyt
+l2sp
+l3spe
+ls3pl
+ls3pol
+ls5s
+l2st
+l3sta
+l4stak
+ls4te
+ls5ter
+l3sto
+l3sty
+l4styg
+l3stå
+l3stä
+l5stö
+l2su
+l5sur
+l2sv
+l4svi
+ls5vid
+l4så
+4l1t
+lta2tu
+l4tef
+l4tif
+l4tih
+l4tos
+lt5rati
+l4tret
+l4trö
+lt5sk
+ltu4
+lu5i
+luk4to
+4lull.
+2lun
+lung3
+2lupp
+lu4pu
+lus2s5p
+5lust.
+4lutb
+4luts
+2lv
+l1va
+l4varm
+lvers4
+l1vi
+l4vos
+lv3ri
+lv3sp
+l1vä
+lväv4
+lycks5t
+ly4gat
+lyg3r
+lyg3s2
+3lyste
+5lystn
+ly4str
+2lå.
+låg3s
+1lång
+lång3s
+lå4sk
+lås5te
+lå4stå
+4läc
+läg5r
+1länds
+5längder
+lä4san
+lä4sp
+lätt3s
+4löl
+4löm
+3lön
+3lörer
+1lös
+lö4vä
+3lé
+1ma
+ma5fr
+mag5n
+mag5s
+ma5ju
+mak3r
+ma3li
+mand4
+mang2a
+man5g4o
+ma5ni
+mani1k
+5ma3ri
+mash5
+mas3ko
+mask3ro
+ma5skö
+mas3ti
+mas4v
+2mb
+mb4sk
+2mc
+2md
+m4dat
+m4di
+m4do
+m3d4r
+1me
+2meds
+me4du
+me4kl
+me4ko
+4meld
+melo5
+me5lu
+men5k
+me5nu
+me5ny
+mer2sko
+me4so
+mes4t
+me3sti
+2meta
+me5trin
+met3ro
+meu4
+2mex
+2m1f
+m4fes
+m4fn
+2m1g4
+2mh
+1mi
+mid3s
+mi4lu
+2mind
+ming4o
+4mink
+min4kr
+4minv
+mi3nö
+mis2
+mi5sf
+mi4sp
+miss3t
+mi4te.
+mi4tr
+mitt3s
+2m1k
+2m3l
+2m1m2
+mme5d
+mm3s4
+m4mul
+2m1n
+m2nam
+mnas3t
+m4nav
+mn5dr
+mn3g4
+mn5st
+mn5tu
+m2n3å
+1mo
+m4od
+mo4i
+2momr
+mo3na
+mos3k
+mo2ta
+mo4tin
+mo4tu
+mot3v
+2m1p
+m2pak
+m4part
+m2pl
+mp3lad
+m5plane
+mp3lat
+mp3lin
+mpos4
+mp5p4
+mps4k
+mp5sp
+m4på
+2m1r
+4ms
+m4sal
+m4ske
+m3slag
+ms3lä
+ms2m
+mste2
+m1sto
+m2str
+mst3rin
+ms5äp
+2m1t
+4mud
+mulls3
+mult5r
+5mum
+4mun3g4
+mun4ko
+3mur
+3musi
+mu3sta
+mut4sl
+2m3v
+1myn
+mys4te
+måg4
+1mål.
+5målet.
+5mån.
+4mår
+må1s
+4mäg
+mäk3
+1män
+mäns4
+3märk
+1mäs
+mäs5ta
+1mät
+mö4bl
+mö4gen.
+3möj
+mör4kl
+3mös
+4möv
+1na
+3na.
+3nad
+nads3
+2naf
+na5gr
+2nak
+3nako
+3nakr
+na3kro
+n1akt
+2nalf
+5nalfl
+4nalg
+nal3s
+na2lu
+n5amb
+5namn
+4nand.
+4nanv
+na4rap
+2narb
+2nark
+4narm
+2nart
+nast3r
+2nb4
+2n1c
+n2ch
+n3cha
+n3che
+n3chi
+ncis4
+ncyk3l
+2nd
+n4dak
+n4dav
+nd3d4
+n5de
+nde3s
+n4dil
+nd5rak
+nd5ras
+nd3rat
+nd3ri
+n5dril
+n3drop
+nd5ros
+nd5skal
+nd3sn
+nds3or
+nds5vä
+nd5ås
+1ne
+3ne.
+ne4di
+5nedl
+ne4d3r
+ned3s
+ne4dö
+ne2gr
+ne5gres
+4nek.
+ne5ly
+4nenl
+ner5sm
+nes3s4
+ne4sta
+ne5s4ti
+ne3tre
+ne1ut
+2nex
+2n1f4
+nfalls5
+nfis3
+2ng1
+n4gar
+n4gen.
+n4gend
+n4gens
+n4genti
+n4germ
+n4get
+n2gi
+ng3ig
+ngi4s
+ng4ly
+n2go
+ng5om
+ng3or
+ng3rad
+n4grö
+ng4ser
+ngs1k
+ngs3pa
+ngs5tim
+ngs3val
+n4göd
+2nh
+1n2i
+4nid
+ni5ec
+ni4ki
+ni5li
+3nin
+nings1
+nings3k
+nings5v
+ni1o
+4nip
+nip4pr
+ni5steri
+nist3ra
+ni3t4r
+niv5sk
+niv5st
+2n1j
+n4jar
+n3jun
+nju4s
+n3jä
+2nk
+n4kart
+n1ki
+n4kis.
+n3kny
+n1ko
+nkrafts5
+nk3ri
+n1kro
+nkrus4
+nk5sl
+nk3sp
+nk4tin
+n1ku
+n1kö
+2n1l
+2n1m
+2n1n
+nn3d
+n3ne
+nnis4
+nn3k
+nn3s4t
+1no
+2nodl
+no4kl
+2nolj
+2nomr
+nom3s4
+2nord
+2norg
+no5sa
+no5sc
+no4tu
+2n1p
+2n1r
+4ns
+ns2i
+n4sint
+n4sis.
+n4sise
+ns2k
+ns3kan
+n1ski
+ns3kor
+nslags5
+ns5las
+ns5mit
+n4soc
+n1spi
+ns3pl
+ns3po
+ns3s4
+n3stans
+n3stap
+ns4tel
+n3stif
+ns3tig
+ns4tra
+n2strik
+nst5up
+nst5vil
+n3s4ty
+n1sva
+ns3vi
+ns3vär
+2n1t
+n4tark
+nter5s4
+n4tinf
+n2t5omb
+nt3rad
+n3trah
+n3trak
+n5trala
+nt3rali
+n5tram
+nt3rep
+n3trer
+nt3ria
+nt3rin
+nt3ris
+n4tropin
+n4tror
+n4trö
+nts3c
+nt4se
+nts5kor
+nt4str
+n4tut
+n3två
+nufts4
+4nug
+n5ugn
+3nui
+3num
+nums5
+2nup
+n3upp
+2nutb
+2n1v
+ny5gr
+n5z
+4når
+4nä.
+4näc
+3näm
+3nät
+4nög4
+3nöj
+nö2ja
+nö5kr
+4nöl
+nös4
+nös5ke
+o1a
+o2ard
+o2b
+5o4bj
+o4bli
+oby4
+oc4k5r
+ock3sk
+oc3ku
+o2d
+ode4k
+odi4a
+1odli
+o5dral
+o3dro
+ods4k
+od2st
+ods4ti
+od5stu
+o3dä
+o1e
+offs5t
+o4fl
+o3fr
+oförmå4
+o1g
+o4gav
+og3gr
+o4gj
+o5glo
+o5gly
+ognos4
+ogno5st
+o4gri
+o4grö
+og3se
+og4s3t
+o4gä
+o1i
+o4il
+o1j
+o1k
+o4kli
+ok3n
+ok3sl
+ok4su
+o2kv
+o1la
+o5lak
+ol5au
+olfö4
+1olj
+ol3ka
+olk3r
+ol4ku
+ol4kä
+oll4si
+oll5slä
+ol3lä
+olm4s
+oln3s
+o1lo
+olo5kv
+ol4sa
+ol4tå
+o1lu
+o4lug
+o4lur
+o1ly
+ol5år
+o1lä
+om4brä
+o3men
+o4mord
+om5pa
+om3pl
+1omr
+4omra
+om1sk
+om4ste
+3omsät
+om4tr
+om3tv
+on3c
+on5gi
+on1gr
+ongs4l
+o4nins
+on3j
+on1k4
+ons3c
+onsi3s
+ons3m
+on5stel
+ons4ter
+on3tras
+on4tre
+ont4s
+o1ny
+on5å
+o1nä
+o3nö
+oo4d
+oom5s
+o3or
+o1pe
+o1pi
+o5pline
+op4pl
+opp3le
+op4pr
+op4pu
+o3pri
+op4st
+o3på
+o5q
+4ora
+o3rak
+oran3g4
+o2rap
+1ordn
+or4d5ä
+o4reh
+1orga
+5organi
+or4gr
+or4gå
+o1ri
+3orient
+4ork
+or4mö
+or4nu
+or4nä
+o1ro
+or4pl
+or5pr
+or4spa
+ors5tig
+or5te
+or2tr
+ort3re
+ort3ro
+o1ru
+o3ry
+o1rä
+o1rö
+o3s2fä
+osk4l
+o1skop
+o3som
+os5pig
+os4sk
+os4s4t
+os3tig
+os5tiker
+o5still
+os4tr
+ost5ron
+ost5rö
+os3tul
+ota2lan
+4oti.
+4otie
+4otin
+o1to
+o5tro
+ot5run
+ot3sv
+ot5ti
+ot4trä
+ott2s
+o1tu
+o5tun
+otvin4
+o1ty
+o5tå
+o3tä
+oun4
+oup4
+4our
+ou3rö
+ou4s
+o3ut3t
+o1va
+ova4n
+o1vi
+ov3r
+ov4si
+ov3sl
+ovs4me
+o1vä
+o3we
+ox5
+oy2
+o3å
+o3än
+o3ö
+1pa
+4paf
+pag4
+paki3
+pakis4
+pa5la
+pals5
+pa5lä
+4pand.
+pan4tr
+3pap
+2parb
+4parm
+par3s
+2pask
+pa5ski
+pa2st
+3patr
+pa3u
+2pb4
+2pc
+2p3d4
+pek5tri
+pekt3ro
+4peld
+pel3s4i
+4pem
+5peng
+3penn
+pent5r
+per4bl
+3perio
+3pers
+per4sl
+pe5tro
+4pex
+2p1f
+4p3g
+2ph
+pi4el
+1pig
+pi1o
+3pip
+pi5so
+pi5sta
+pi5sto
+p2j
+3pjäs
+4p3k2
+p2l
+p4lac
+5plan.
+p4lane
+p3larn
+p3lev
+3plex
+3plic
+1plik
+4plit
+p3lj
+1plom
+p3lop
+2p1m
+4p1n
+p3ni
+1po
+5poa
+2poc
+2pof
+po2i
+3polit
+4polj
+poly3
+2porg
+3pos
+pos4ter
+4pov
+po4vä
+2pp
+p4part
+pp5ask
+p4pax
+p3pe
+p1pi
+p4pins
+pp3j
+pp1l
+pp3la
+pp3lin
+pp5lis
+pp5lu
+pp3ly
+pp3lån
+pp3låt
+pp3lä
+pp3lö
+pp5oc
+pp3of
+pp3p4
+pp1r
+pp3ra
+pp3ri
+pp3ru
+pp3ry
+pp3rä
+pp3tr
+p2pu
+p5py
+pp3å
+p2r2
+2pra
+5prax
+1pres
+pres4t
+pre3sta
+pres5to
+p3rig
+p3rik
+5pril
+3princ
+pring3
+p5riol
+3pro
+pro3g
+p3ror
+4prå
+3präs
+3pröv
+2ps
+p2sal
+3psalm
+p5s2ho
+ps4ken
+ps2li
+p3sna
+4pso
+p3sod
+p1s4t
+p4stak
+p4stäv
+p2sö
+2p1t
+p3tri
+1pu
+4pug
+pul2l5ov
+pul5tr
+5pung
+3punk
+pus3t
+2p1v
+på3dr
+3päl
+pä5ro
+4pör
+3pé
+qu4
+3que
+1ra
+3ra.
+raci4t
+3rade.
+4radr
+ra4du
+5ra1e
+2raffä
+ra3fr
+ra5is
+2rak
+ra2lo
+r4ande
+3rande.
+4ran4d3r
+rand3s
+2ransv
+ra3pl
+3rar
+r4ar.
+4rarb
+r4are
+4rarg
+r4ark
+4rarm
+r4arn
+r4ars
+4rart
+r3arta
+ra5rö
+r4as
+ras3h
+ra2st
+3raste.
+3rativ
+ra3tri
+2rav
+ra5yo
+2rb
+2r1c
+2r2d
+r4daf
+rda5gr
+r3dj
+r4dos
+rd3ran
+rd3rat
+r4dul
+r3då
+r3dä
+r4dös
+1re
+3re.
+4reaus
+re3b
+4rec
+5reco
+re3d4r
+re5du
+4reft
+4regg
+3regn.
+re1kr
+rek5tri
+4reld
+re3lu
+rem5p
+3rems
+r4en.
+2reni
+2renk
+2renl
+re3nö
+re3o
+3rer.
+3rern
+3reso
+ress5k
+re1sti
+3ret.
+4retet
+ret3ro
+4rety
+re5tå
+2revig
+4rex
+2r1f
+rfö3ri
+2r1g
+rg3g2
+rgs5top
+2rh
+rhands5
+3rial
+4rib
+3rifi
+2rifr
+r3ifrå
+3rifu
+3rigt
+rik2s
+3riktn
+ri4mo
+2rind
+rind3s
+5ringen.
+ring3r
+2rinr
+2rins
+2rint
+ri1o
+3riot
+ri5ple
+ri2stä
+ri4tut
+ri4vis
+riv3s
+4rj
+r4jis
+r3jo
+r5ju
+r5jö
+2rk
+rk3akt
+r4kek
+rkes3
+r1ki
+r3klas
+rk2le
+r4klö
+rk3n
+rk4ne
+r1ko
+r4kod
+rk3tr
+r1ku
+r4kup
+r1kä
+r5kör
+2r1l
+r5laka
+r5lav
+rld2
+rlds3
+rl5sp
+2r1m
+r4marb
+r4mil
+rm2s5j
+rm5tr
+2r1n
+rnal4
+rn3g4
+rn1k
+r2nom
+rns4k
+rns4t
+rn3t
+ro3b
+ro4gro
+ro2kr
+2rolj
+rol4li
+rom4a
+5roman
+5ronau
+5rond.
+ron4v
+ro3pl
+ropp2s
+ro4ra
+2rord
+2rorg
+2rorie
+3rorn
+ro4sin
+ro4sn
+ros3v
+ro5te
+2r1p
+r4plö
+r4pö
+4r1r
+rra4n
+rrd4
+rreligi5
+rres4
+r5rib
+rr5k4
+r4rob
+r4rom
+rr1s
+rrs2k
+r4rur
+2rs
+r4seld
+r4sex
+r2sin
+r1ski
+r4skid
+rsk3na
+rs5koll
+rs4kos
+rskotts3
+r2sku
+r3skö
+rslags4v
+r4sle
+r4slo
+r4s5lö
+rs4mo
+rs5nat
+rs5nä
+r1sp
+r2spl
+r2spo
+rs3s4
+rs5tak
+rs4te
+r5stek
+rs5tend
+r5steni
+rs5till
+r1sto
+r4ston
+rst4r
+r3strö
+r3stu
+r1sv
+rs4vag
+r2svä
+r1sy
+2r1t
+r2taf
+r2takti
+rt4an
+r4tins
+r4tom
+r5trit
+r3trä
+rt3t
+r4tut
+rubb5l
+ru3br
+ru4dan
+ruks1
+ruks3v
+5rullera
+3rum.
+runn2
+runns5
+4rupp
+rus2h
+ru5sha
+2rut
+5rutig
+rut4ra
+ru4vi
+5ruö
+2r1v
+rv4sj
+rv2s5kä
+r3w
+rydd5s
+ry5o
+råge5l
+4rål
+rång3s
+rå5ra
+rå3st
+räck5s
+4räkt
+4räm
+räng3s
+räns5t
+4räs
+rä4san
+räs3s
+rä5sti
+räv5s
+röd5el
+röd5r
+röd3s
+2rög
+r3öi
+rök3s
+röns4t
+4röp
+3rör
+rör4s
+rö4st
+röst3r
+r1övr
+1sa
+3sa.
+3sad.
+3sade
+4sadj
+2sa3dr
+sad5s
+2saf
+sa3i
+sak5ri
+2s1akt
+sa5lo
+3s2am
+sa2ma
+samman3
+sa2mor
+sand3s
+4sang
+2sanl
+s3anlä
+san3sla
+2sap
+3s4ar.
+2sarb
+2sarm
+s5arm.
+3sarn
+2sart
+4sarv
+4sass
+5sat.
+sa4tu
+2sau
+s3auk
+2s1av
+4sb
+s2c
+2sch.
+1scha
+2schau
+4schb
+1schen
+1scher
+1schet
+1schi
+4schk
+4schm
+4schp
+3schy
+3schö
+sci3p
+4s3d
+1se
+se4at.
+se2g
+2s3egg
+3segl
+seg3ra
+sek5le
+sek3r
+sek5tr
+3sel.
+se5ly
+sem2
+3sen.
+s5ersä
+3set.
+2sexp
+2s1f
+s4fär.
+sfö2
+4s3g2
+2sh
+5s2haw
+shi1s
+s5hö
+1si
+sid5s
+5sie
+si4eri
+si4esk
+si2ett
+3s2ig
+3sik
+sikts3
+5sill.
+silver3
+silv3r
+2s1ind
+2s1inf
+sinne2s3
+3sinni
+4sinr
+2sin1s
+s1inst
+5sint.
+2sintr
+3sio
+sis4t
+siu4
+1s2j
+2sjak
+s3jakt
+4sjn
+4sjt
+s4ju
+5sjuk
+4sjur
+själs3
+3sjö
+4sk.
+2ska.
+3s2kada
+s2kado
+3skaffn
+1skaft
+s4kag
+s2kal
+3skal.
+1skap
+5skap.
+5skapet
+4skapi
+skaps1
+4skar
+s4kara
+5skarv
+4skas
+s2kat
+s4kav
+4ske.
+3sked.
+s4kene
+3skepp
+4skh
+sk4i
+3skif
+5skin
+4skis.
+5skiv
+5skjor
+3skju
+4skl
+sk5lap
+s3klas
+4skn
+3s4ko.
+1s4kog
+4skogsg
+1skol
+3skola
+s4kolo
+s4korp
+skor1st
+1skot
+s5kran.
+3skrat
+sk4ret
+3skrev
+1skri
+3skrif
+s3krig
+5skrin
+3skrip
+s5kris
+3skriv
+s5kron
+s4kru
+5skrub
+3skruv
+5skräc
+sk3s
+2skt
+3skulp
+s3kup
+2skv
+s4kve
+1s2ky
+s4kyn
+2skyrk
+1skå
+s4kål
+5skåp.
+4skår
+5skänk
+3skärv
+2sl2
+4sla.
+s5lad.
+s3land
+3s2lang
+s4lant
+s3lar.
+4slas
+s1lat
+s2lev
+3slev.
+s4lic
+slins3
+4slis
+s2lit
+s5lor
+slotts3
+s2lu
+s3luc
+s3luf
+4slus
+s3lust
+3slut
+slu4to
+3slå.
+5s4lår
+s4läk
+s5läm
+s5länn
+3s4läp
+4s3lär
+s2lät
+3s2löj
+2sm
+s2mak
+3smak.
+s3makt
+s2mal
+s2met.
+s2mid
+s2mit
+3smitta
+s3mj
+5smug
+5smyg
+små5g
+små3k
+små3s
+3smäd
+3smäl
+4smäs
+3smör
+2s2n4
+3snab
+3s4nac
+s3nam
+s5nare
+s3nast
+s5ner
+3snib
+3snil
+3snit
+1snitt
+s3niv
+3snut
+s4nå
+5snår
+5snäc
+s4när
+3snö.
+snö5g
+3snör
+snö3s
+1so
+3soc
+5sock
+2sod
+5soi
+2solj
+sol3s2
+2som
+5somm
+3son
+son4st
+so5pra
+so4pu
+3sor.
+2sord
+s5ord.
+2sorg
+3sorn
+3sot
+4sott
+s2p2
+5spann.
+s4park
+5sparv
+4spas
+s3pass
+spa5tr
+1spe
+4sped
+3s4pek
+3s4pel
+4spelsl
+2spen
+2sper
+5spets
+3spill
+3spir
+4spl
+s1pla
+s3plan
+s3plats
+spli4
+s4plin
+5split
+s5plä
+4spre
+s3pres
+4s3pris
+3sprit
+2spro
+s3pry
+3språ
+5sprän
+s3ps
+1s4på
+3spån
+3spår
+5spän
+3spö
+4s1r
+4s1s
+s5sad
+sse4lin
+s5sil
+ss2k
+ss5kl
+ss3kun
+ss1l
+ss2lag.
+ss2lä
+ss2lö
+ss3na
+sss4
+ss3unn
+s2sv
+ss3vi
+s2t
+2st.
+4sta.
+5stac
+3stadi
+s4taf
+5stalgis
+3stalla
+2stalli
+5stam.
+5stamm
+1stant
+5stark.
+5startad
+1state
+3statl
+1stau
+st3c
+2s5te.
+4stea
+5steg.
+s4tek.
+2stekn
+5stekt
+s4tell
+3stem.
+3steme
+5stenar
+3s4tene
+3stense
+5stensm
+1stera
+1stering
+s4teriu
+3sterne
+5stetis
+2stia
+2stib
+3stick
+2stid
+s4tiken
+2stil
+3stil.
+3stink
+3stisc
+1stit
+2stj
+s5tju
+3stjäl
+3stjär
+2stm
+5stoc
+1stol
+4stolk
+4stom
+stori4eu
+5storis
+stor3s
+3straff
+4strativ
+3strato
+3strec
+3strej
+st3ren
+1strer
+2stria
+1strid
+5stride
+2striel
+st4rif
+1strikt
+st5risk
+1stru
+3struk
+2strumm
+s3tryc
+5stryk
+5stråk
+3strål
+3sträc
+4sträd
+3sträng
+5sträv
+3ström
+2st3s4
+st3t
+4stv
+s3tvis
+1sty
+2styp
+1stå
+4ståg
+5stål
+1stä
+3stäl
+1stö
+1su
+su4b
+3sug
+su3i
+3sum
+2sun
+5sun.
+s1under
+5sune
+s5ung
+2sup
+5supa
+su2pu
+5sus
+2s1ut
+su4to
+su4tr
+s2v2
+5svag.
+s3vagn
+4s3vak
+5svam
+4svap
+svars3
+3svart
+4svas
+s3vat
+4svec
+3sven
+5svep
+4s3ver
+s5ves
+4s3vil
+s4vine
+4svis
+s5vitt
+s5våd
+3svåri
+3sväng
+5svärm.
+s3väs
+s3vät
+4syk
+5syl
+3syn
+syn3k
+s3yrk
+3sys
+sys4t
+sys5ter
+syt2
+sy5th
+1så
+5såg
+4såk
+2sålde
+sång3
+1sä
+s4äd
+2s5ägg
+s4äl
+2säp
+5säs
+3sät
+4säta
+1sö
+4söd
+2sög
+s5öga
+sö4ko
+4söl
+4söp
+sör2s
+2s3ört
+1ta
+3ta.
+ta1ch
+3tade.
+4tadi
+4tads5
+2taff
+3taga
+5tak.
+ta5kre
+2taktig
+tak4to
+4talf
+5tallise
+tall5s
+4talv
+3tame
+3tami
+3tan.
+ta4nab
+3tande.
+2t3anfa
+4tanl
+t4ap3l
+2tappar
+3tar.
+4tarb
+tar4mi
+3tarn
+tars4
+4tart
+5tartavl
+4tarv
+4task
+3tast
+ta1str
+tat2
+ta4tan
+tats3
+2tatt
+2tav
+4tave
+5tavla.
+3tavlan
+3tavlo
+tav2s
+3tax
+2tb4
+2tc
+t3cha
+t3che
+2t3d4
+3t2e
+te4as
+te3b4
+5tec
+4teg
+te2g1r
+te3gre
+te3i
+te4int
+4tej
+tej2s
+te4kl
+5teknik
+5teknis
+4teld
+5te5lö
+5tema
+4temo
+te4mu
+ten3g4
+5tensi
+ten3tr
+te4nä
+te5nör
+5ter.
+5teriö
+ter3k4
+5term
+5terna
+5ters
+ter3t
+te4ru
+5tes.
+5test
+tes4te
+te5stik
+te5stu
+5tetik
+tets3
+4texa
+2texp
+2t1f4
+2t3g4
+2th
+t4hen
+1ti
+3tial
+5tib
+5tici
+3tid
+5tide
+ti4du
+4tidö
+ti4ed
+tifts5
+ti2gel
+3tigh
+ti4go
+ti2gr
+3tigt
+tik3l
+3tiks
+5tikul
+t2il
+5tilj
+3tillst
+3tillv
+3tillä
+5time
+2tind
+2tinr
+2tint
+ti4od
+3tion
+ti2os
+3tis
+4tisc
+5tisk
+3tiva
+ti4van
+5tivite
+ti2ö
+t2j
+4tje
+4tjob
+2tjou
+4tjäl
+4tjäm
+3tjän
+2t3k2
+2t3l
+2t1m
+2t5n4
+tne4r
+4todl
+3tok
+4tol.
+4tolj
+2tomr
+4toms
+t2op
+5torap
+t5ord.
+5toriett
+4torm
+torm3s
+3torn
+tor1st
+4tort.
+tos4k
+t5ost.
+t4ov
+2t1p
+t2r4
+2tra
+t4raf
+3trafi
+3t4ral.
+t4rala
+3t4rale
+5tralo
+3trals
+t4ralt
+3trans
+tran2s5a
+4trar
+t3ras.
+t3rat.
+t4rato
+4treg
+4tren
+4trer.
+4trern
+t3rets.
+2tri
+3tribu
+5trick
+trids3
+t5riel
+t1ring
+t3ring.
+2troc
+t3rock
+t4rog
+t5ronik
+t3rono
+4tropi.
+5tross
+5trotn
+t4rump
+t4rup
+3trupp
+trus5ta
+1tryc
+5tryck.
+5tryggh
+4tråk
+5trä.
+3träd
+träds4
+3träf
+3träg
+4träk
+t3räkn
+t4rän
+5träni
+5tröja
+t4röt
+5tré
+2ts
+t5s4and
+ts5art
+t3s4at
+t3se
+t4seg
+ts4en
+t4sex
+ts2k
+t5skall
+t3skatt
+t1ski
+ts3kl
+tskotts5
+t5slot
+ts5läk
+ts3nä
+t3snö
+t2so
+ts3ord
+ts3pl
+tss4
+t1st
+ts4te
+ts5ter
+ts5tillf
+ts3tj
+t3stol
+t4ston
+t2stra
+t4stry
+t4stur
+t5styr
+t2su
+t3sud
+t5sy
+2tt
+t3tac
+t4tau
+t4ted
+tte5g4
+t4tem
+tte2n
+ttes4
+t4tex
+t4tins
+t4tip
+tt3ja
+t1to
+tt3rad
+tt3rand
+tt3rat
+tt3re
+tt3ri
+tt4ry
+tt4se
+tt2si
+tt4sta
+t3tu
+t4tug
+tt1v
+tt4vå
+t3ty
+t3tä
+t3tör
+4t5ugn
+2tund
+3tunga
+tung3s
+5tunn
+2tupp
+tu5re
+2tutb
+t3utv
+t3utö
+tu4vu
+5tuö
+2tv
+t1va
+4tve
+t3vig
+3tving
+t3vit
+3tviv
+t3våg
+3tvån
+t3vän
+tvär3s
+3tvätt
+ty5da
+5tyg.
+3tyngd
+3typ
+ty3pi
+5tys
+2tz
+3tåg
+tås4
+4tåt
+täc4ko
+4t5äg
+4täm
+4tärm
+3tävl
+4tö4d
+tö5de
+4tög
+4töp
+tö4pi
+3törer
+törs3t
+tö4vas
+5té
+u1a
+u2b
+ub5al
+ubb4le
+ub3lic
+u4bo
+u3cha
+u5cl
+u2d
+u4dak
+u5de
+ud3r
+ud4ret
+uds4a
+u4du
+u4dy
+u1e
+u2es
+uf4fä
+uf4tan
+uf4to
+4u1ga
+u1ge
+ugg3s
+ugn4
+ugns5
+ug3s4
+u5ie
+u1in
+u3is
+u3itet
+u3j
+u2keb
+u5ki
+u4kl
+uk5la
+uk3n
+u1ko
+ukos4
+uk2s
+uks5ko
+uk3tris
+ukt5s
+uk4tä
+u3ku
+uk3v
+u1la
+ul4di
+ulds2m
+ul4du
+ul4dö
+ull3ste
+ull3än
+u1lo
+uls5ti
+ul2tr
+u3lu
+u1lä
+u1lö
+um4fä
+um4so
+ums4t
+u1mu
+u3mör
+5underl
+1undersö
+1underv
+un4dom
+und3r
+un4då
+un5g2ef
+un3gersk
+ung5it
+ung3r
+ungs4p
+3unif
+unk3l
+unk3n
+un4kr
+un1sk
+un4tr
+un5trati
+u5nu
+u1o
+u1pe
+u4pern
+u1pi
+u2pl
+u3plet
+up3lik
+3uppfa
+1uppg
+up4pin
+1uppla
+5upplä
+up4p3r
+upp3s
+upp5sp
+up5ut
+ur5ak
+ur5arv
+u3re
+u1ri
+u1ro
+u4rob
+u4rom
+urs5tin
+ur4stä
+u5ry
+u2sak
+us5anl
+u3scha
+u3se
+usen3
+u2s1k
+us3ka
+us4kla
+us4kr
+u5sky
+us4kå
+us5lä
+us3n
+u2sp
+us3pen
+us5tat
+us3tig
+u3stik
+us5tin
+ust5ro
+u4stå
+u4stä
+us3v
+u4så
+u4sä
+u2sö
+u4tak
+1utb
+u4tef
+ute3s
+utik2
+u5til
+uti3ö
+ut3j
+3utjäm
+utlands3
+u1to
+u3top
+uto5s
+ut3r
+ut4rer
+ut4ro
+ut5rop
+1utru
+2utsid
+ut3sl
+3utslä
+2utt
+utt4j
+ut1v
+3utvec
+u5ty
+ut3öv
+u5u
+2u1v
+u2vak
+u4vj
+u4vä
+u5å
+u3ö
+va5dro
+1vagn
+2v1akti
+val3k
+val4li
+val4st
+5valv
+5vama
+4vand.
+4vanp
+van4st
+van5tr
+5vap
+2varb
+va4res
+va4ri.
+4vark
+var2s
+vart5r
+va1ru
+vas5ti
+5vattn
+4vau
+4vav
+5vavi
+2vb4
+2v1c
+2v3d4
+1ve
+5vec
+ve2k
+ve3ke
+4veld
+vensk3ä
+5ventera
+ve3ny
+ve5nö
+4vep
+ver5g
+3verk
+ves4
+ve2s5p
+ve1st
+3veta
+3vete
+vet5sa
+vett5s
+2v1f
+2v1g
+2vh
+v4i
+vi4c
+vid3s
+vild3s
+vil4t
+3vind.
+ving3s4
+3vinkl
+vi2no
+5vinst.
+5vinste
+vi5ny
+3vis.
+vi5sa
+vis5h
+vis5ko
+vi4st
+vis3ta
+vi2tr
+vi4var
+4vjo
+2v3k2
+2v1l
+2v1m
+vmörk4
+2v1n4
+1vo
+4vok.
+2vom
+4vord
+2vorg
+vos4
+2v1p
+2v2r
+5vrak
+3vrera
+v3ru
+2vs
+v4sc
+v1s2k
+v2skri
+vs4mi
+v3sni
+v2so
+v1st
+vs4te
+vs5trå
+v5styc
+vs3vå
+v2sö
+2v1t
+vu4d1
+v1und
+4v5up
+4vut
+2v1v
+3vy
+5våld
+vångs3
+3vård
+4våri
+vå3ru
+3väg
+vägg5s
+vä4l
+väll4s3
+3vänl
+3värde
+vä4ril
+4värj
+5värk
+3värld
+2vät
+3väx
+4vög
+4vöp
+3vör
+1wa
+we2
+w2h
+whi2
+wi2e
+w4na
+x1
+xan5d4
+xem3pla
+xis4
+xk2
+xli4
+xs4
+xti2
+x4tå
+2y
+y1a
+y4bris
+yb4s
+y2d
+y4da
+y5dan
+y4do
+yd3r
+yds4
+y4du
+y4dö
+y1e
+y1ga
+y1ge
+ygg3r
+yg4gå
+ygs4p
+y1i
+y1ki
+y5klist
+yk5lon
+yk3n
+y1ko
+y1la
+yl4gj
+y3li
+yl5k
+yl5lä
+y1lo
+yl4tr
+ym2fl
+ym4for
+y3må
+yng3r
+ynk5l
+yn4sa
+yns4t
+y3or
+y5ou
+y1pe
+y5po
+yp3ri
+yre4s
+y1ri
+yr4ku
+yrk5v
+y1ro
+yrs4k
+yr5st
+yr5tu
+y1rå3
+y5scho
+ys2st
+ys3ta
+ys3ti
+ys4tik.
+yst3ra
+y2tak
+y4te.
+y4tea
+y1to
+ytt3r
+yt5v
+y3va
+y3vi
+y3vä
+y5w
+y5å
+1za
+1ze
+ze4ro
+1zi
+1zo
+zo4nal
+4zp
+z5s
+3zu
+z4zin
+å1a
+å3dj
+åds4l
+å1e
+å1f
+å1ga
+å1ge
+åge2l
+åg3l
+åg3s4k
+åg3st
+ågå4
+å3i
+å1ki
+5åklag
+åk4strä
+å1la
+1ålder
+å2lin
+ål3k
+åll4sp
+ål2s5e
+ål3st
+å1lä
+å1m
+åman4s
+ånd4r
+ån4du
+åns4t
+åns4v
+å3o
+å1p
+å2pl
+å5pla
+å4pö
+år4do
+ård4ra
+ård2s
+ård4s3t
+å4rel
+å1ri
+å5ror
+5årsav
+år5s2li
+år2sv
+år5ö
+ås4ke
+ås3n
+åss4
+ås4skr
+ås4t
+åte2
+åt3ri
+å3trå
+åt2sj
+ått5s
+å1v
+ä1a
+ä2b
+2äc
+äck5v
+ä2d
+ädd3s
+äd4du
+äde4s
+äd3r
+äd5se
+äd3st
+ä3e
+ä1ga
+ä1ge
+äg4go
+äg1l
+äg3r
+äg4re
+äg3se
+ä3i
+ä5jo
+4äk
+ä1ki
+äk3n
+äk3r
+ä1la
+äl4pap
+äl4seg
+äls5kog
+äl4slu
+äl2t3r
+äl2tu
+äl4vin
+ämp3l
+4ändligh
+änd3r
+änd1st
+äng5r
+änni3s
+änn3s
+ä4no
+äns1l
+än4st
+äns5te
+än4sv
+än2t3r
+ä3pe
+äpp3l
+ä4pr
+äp4st
+ä4rap
+är2bre
+ärg5l
+är4gr
+ä1ri
+ärib4
+är4kä
+är4nis
+ärn3st
+är2nå
+är4nö
+är5ob
+ä5rol
+ä3rop
+ä5ror
+ä5ros
+är2si
+är4sko
+är2so
+är4sp
+är2sv
+är4tand
+är2tr
+ärt3s
+4äs
+äs3pa
+äs5pi
+äs4sk
+äs4sp
+äs3ta
+äst3r
+ä4stä
+ä4så
+2ät
+ä3to
+ä5tre
+ät4s3k
+ät5te
+ät4top
+ätt3r
+ät4tu
+ät4tv
+ä1va
+ä2vak
+ä3vi
+ä5vu
+ö1a
+ö2d
+ö4dak
+ö4dal
+ö4darv
+öde4s5
+ö4dis
+öd3ra
+öd2s
+öd3se
+ö4du
+ö4dö
+ö1e
+ö1ga
+ög5ak
+ö5gar
+1ögd
+ö1ge
+ö5ger
+ögg4
+ög1l
+ög2n
+ögn3e
+1ögo
+ög3si
+ög3sk
+ö1i
+ö3jo
+öj4sv
+ö4karm
+ö1ki
+ök3n
+ök2s
+ök3sl
+ö1la
+öl4kv
+öl4kö
+öl2p
+ö5lä
+öman4
+öm2kl
+ö4nal
+ö2nom
+öns3ke
+ön4so
+önst3r
+ö3pe
+ö4pel
+ö3pi
+öp5li
+ö5plo
+1öppn
+ö4pr
+ö3rande
+ö3ras
+ö4rask
+örb4
+ör3d4r
+ör1eni
+ö3res
+ö4restr
+ö3ret
+ör5evig
+ör3g
+ö1ri
+ö5rig
+ö3ring
+ör3int
+ör5ir
+ör5iv
+ör4kal
+ör1k2l
+ör5kli
+ör4nis
+ör3ol
+ör1or
+ör2p5la
+ör1s2k
+ör3sl
+ör4slä
+ör5te
+ört5s
+ör1u
+ör3vr
+ör3y
+ör1ä
+örö4d
+ö2sak
+ös3n
+ös4sj
+ös2sk
+ös4sp
+ös3ta
+öst3v
+ö2tak
+öts5ko
+öt4st
+ö1v
+öve4
+över1
+5övere
+ö2vj
+öv3ra
+öv3ri
+öv4sk
+é3e} \ No newline at end of file
diff --git a/tex/context/patterns/lang-sv.rme b/tex/context/patterns/lang-sv.rme
new file mode 100644
index 000000000..e0cb27225
--- /dev/null
+++ b/tex/context/patterns/lang-sv.rme
@@ -0,0 +1,112 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: sehyph.tex (2003-09-08)
+% Author: Jan Michael Rynning
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Swedish hyphenation patterns.
+%
+% Copyright 1994 by Jan Michael Rynning. All rights reserved.
+% This program may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.2 of this license or
+% (at your option) any later version. The latest version of this license
+% is in http://www.latex-project.org/lppl.txt and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% Last update: 1994-03-03 (March 3, 1994).
+% Revision history:
+% 1991-01-08: First version available for anonymous FTP.
+% 1991-08-08: Changed \aa to \aa0 at end of line, to stop TeX from
+% concatenating the patterns.
+% 1991-09-03: Cleaned up lots of inconsistencies in the dictionary.
+% As a consequence, the patterns shrunk a lot. Also
+% added some 4000 one-syllable words, some of which were
+% hyphenated by the old patterns, and some 1500 compound
+% words, about half of which were incorrectly hyphenated
+% by the old patterns.
+% 1991-11-01: Added another some 6200 compound words, all of which were
+% incorrectly hyphenated by the old patterns.
+% 1991-11-13: Added another some 6500 compound words, all of which were
+% incorrectly hyphenated by the old patterns.
+% 1992-01-30: Changed macros to ^^, for use with LaTeX and dc fonts.
+% 1994-03-03: The hyphenated dictionary now contains about 118,000 words.
+% The hyphenation now works much better for compound words.
+% Patgen parameters: 1 2 20, 2 1 8, 1 4 7, 3 2 1, 1 10000 4.
+%
+% This file contains Swedish hyphenation patterns for TeX. It assumes
+% that you have fonts with the Swedish letters in the positions where
+% they occur in ISO Latin 1 (ISO 8859/1):
+% Letter: \AA \"A \"O \'E \aa \"a \"o \'e
+% Position: "C5 "C4 "D6 "C9 "E5 "E4 "F6 "E9
+%
+% Load this file into initex after plain.tex (or lplain.tex, splain.tex,
+% or whatever).
+%
+% The patterns were generated in such a way that they will hyphenate
+% correctly if \lefthyphenmin>=1 and \righthyphenmin>=2.
+%
+% These hyphenation patterns work quite well for simple words, but not
+% quite as well for compound words. I'm working on improving the quality,
+% by adding more words. If you know any Swedish words which are not
+% correctly hypheneted using these patterns, or if you have questions or
+% comments, please contact me:
+%
+% Jan Michael Rynning <jmr@incolumitas.se>
+% --------------------------------------------------------------------------
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-tk.hyp b/tex/context/patterns/lang-tk.hyp
new file mode 100644
index 000000000..70002aa05
--- /dev/null
+++ b/tex/context/patterns/lang-tk.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-tk.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-tk.pat b/tex/context/patterns/lang-tk.pat
new file mode 100644
index 000000000..33290cb16
--- /dev/null
+++ b/tex/context/patterns/lang-tk.pat
@@ -0,0 +1,2378 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-tk.rme
+
+% used: a b d e f g h i j k l m n o p r s t u w y z ä ç ö ü ý ň ş ž
+
+\patterns{
+ä1bä
+ä1be
+ä1bi
+ä1bö
+ä1bü
+ä1çä
+ä1çe
+ä1çi
+ä1çö
+ä1çü
+ä1dä
+ä1de
+ä1di
+ä1dö
+ä1dü
+ä1fä
+ä1fe
+ä1fi
+ä1fö
+ä1fü
+ä1gä
+ä1ge
+ä1gi
+ä1gö
+ä1gü
+ä1hä
+ä1he
+ä1hi
+ä1hö
+ä1hü
+ä1jä
+ä1je
+ä1ji
+ä1jö
+ä1jü
+ä1kä
+ä1ke
+ä1ki
+ä1kö
+ä1kü
+ä1lä
+ä1le
+ä1li
+ä1lö
+ä1lü
+ä1mä
+ä1me
+ä1mi
+ä1mö
+ä1mü
+ä1nä
+ä1ne
+ä1ni
+ä1nö
+ä1nü
+ä1pä
+ä1pe
+ä1pi
+ä1pö
+ä1pü
+ä1rä
+ä1re
+ä1ri
+ä1rö
+ä1rü
+ä1sä
+ä1se
+ä1si
+ä1sö
+ä1sü
+ä1tä
+ä1te
+ä1ti
+ä1tö
+ä1tü
+ä1wä
+ä1we
+ä1wi
+ä1wö
+ä1wü
+ä1ýä
+ä1ýe
+ä1ýi
+ä1ýö
+ä1ýü
+ä1zä
+ä1ze
+ä1zi
+ä1zö
+ä1zü
+ä1ňä
+ä1ňe
+ä1ňi
+ä1ňö
+ä1ňü
+ä1žä
+ä1že
+ä1ži
+ä1žö
+ä1žü
+ä1şä
+ä1şe
+ä1şi
+ä1şö
+ä1şü
+e1bä
+e1be
+e1bi
+e1bö
+e1bü
+e1çä
+e1çe
+e1çi
+e1çö
+e1çü
+e1dä
+e1de
+e1di
+e1dö
+e1dü
+e1fä
+e1fe
+e1fi
+e1fö
+e1fü
+e1gä
+e1ge
+e1gi
+e1gö
+e1gü
+e1hä
+e1he
+e1hi
+e1hö
+e1hü
+e1jä
+e1je
+e1ji
+e1jö
+e1jü
+e1kä
+e1ke
+e1ki
+e1kö
+e1kü
+e1lä
+e1le
+e1li
+e1lö
+e1lü
+e1mä
+e1me
+e1mi
+e1mö
+e1mü
+e1nä
+e1ne
+e1ni
+e1nö
+e1nü
+e1pä
+e1pe
+e1pi
+e1pö
+e1pü
+e1rä
+e1re
+e1ri
+e1rö
+e1rü
+e1sä
+e1se
+e1si
+e1sö
+e1sü
+e1tä
+e1te
+e1ti
+e1tö
+e1tü
+e1wä
+e1we
+e1wi
+e1wö
+e1wü
+e1ýä
+e1ýe
+e1ýi
+e1ýö
+e1ýü
+e1zä
+e1ze
+e1zi
+e1zö
+e1zü
+e1ňä
+e1ňe
+e1ňi
+e1ňö
+e1ňü
+e1žä
+e1že
+e1ži
+e1žö
+e1žü
+e1şä
+e1şe
+e1şi
+e1şö
+e1şü
+i1bä
+i1be
+i1bi
+i1bö
+i1bü
+i1çä
+i1çe
+i1çi
+i1çö
+i1çü
+i1dä
+i1de
+i1di
+i1dö
+i1dü
+i1fä
+i1fe
+i1fi
+i1fö
+i1fü
+i1gä
+i1ge
+i1gi
+i1gö
+i1gü
+i1hä
+i1he
+i1hi
+i1hö
+i1hü
+i1jä
+i1je
+i1ji
+i1jö
+i1jü
+i1kä
+i1ke
+i1ki
+i1kö
+i1kü
+i1lä
+i1le
+i1li
+i1lö
+i1lü
+i1mä
+i1me
+i1mi
+i1mö
+i1mü
+i1nä
+i1ne
+i1ni
+i1nö
+i1nü
+i1pä
+i1pe
+i1pi
+i1pö
+i1pü
+i1rä
+i1re
+i1ri
+i1rö
+i1rü
+i1sä
+i1se
+i1si
+i1sö
+i1sü
+i1tä
+i1te
+i1ti
+i1tö
+i1tü
+i1wä
+i1we
+i1wi
+i1wö
+i1wü
+i1ýä
+i1ýe
+i1ýi
+i1ýö
+i1ýü
+i1zä
+i1ze
+i1zi
+i1zö
+i1zü
+i1ňä
+i1ňe
+i1ňi
+i1ňö
+i1ňü
+i1žä
+i1že
+i1ži
+i1žö
+i1žü
+i1şä
+i1şe
+i1şi
+i1şö
+i1şü
+ö1bä
+ö1be
+ö1bi
+ö1bö
+ö1bü
+ö1çä
+ö1çe
+ö1çi
+ö1çö
+ö1çü
+ö1dä
+ö1de
+ö1di
+ö1dö
+ö1dü
+ö1fä
+ö1fe
+ö1fi
+ö1fö
+ö1fü
+ö1gä
+ö1ge
+ö1gi
+ö1gö
+ö1gü
+ö1hä
+ö1he
+ö1hi
+ö1hö
+ö1hü
+ö1jä
+ö1je
+ö1ji
+ö1jö
+ö1jü
+ö1kä
+ö1ke
+ö1ki
+ö1kö
+ö1kü
+ö1lä
+ö1le
+ö1li
+ö1lö
+ö1lü
+ö1mä
+ö1me
+ö1mi
+ö1mö
+ö1mü
+ö1nä
+ö1ne
+ö1ni
+ö1nö
+ö1nü
+ö1pä
+ö1pe
+ö1pi
+ö1pö
+ö1pü
+ö1rä
+ö1re
+ö1ri
+ö1rö
+ö1rü
+ö1sä
+ö1se
+ö1si
+ö1sö
+ö1sü
+ö1tä
+ö1te
+ö1ti
+ö1tö
+ö1tü
+ö1wä
+ö1we
+ö1wi
+ö1wö
+ö1wü
+ö1ýä
+ö1ýe
+ö1ýi
+ö1ýö
+ö1ýü
+ö1zä
+ö1ze
+ö1zi
+ö1zö
+ö1zü
+ö1ňä
+ö1ňe
+ö1ňi
+ö1ňö
+ö1ňü
+ö1žä
+ö1že
+ö1ži
+ö1žö
+ö1žü
+ö1şä
+ö1şe
+ö1şi
+ö1şö
+ö1şü
+ü1bä
+ü1be
+ü1bi
+ü1bö
+ü1bü
+ü1çä
+ü1çe
+ü1çi
+ü1çö
+ü1çü
+ü1dä
+ü1de
+ü1di
+ü1dö
+ü1dü
+ü1fä
+ü1fe
+ü1fi
+ü1fö
+ü1fü
+ü1gä
+ü1ge
+ü1gi
+ü1gö
+ü1gü
+ü1hä
+ü1he
+ü1hi
+ü1hö
+ü1hü
+ü1jä
+ü1je
+ü1ji
+ü1jö
+ü1jü
+ü1kä
+ü1ke
+ü1ki
+ü1kö
+ü1kü
+ü1lä
+ü1le
+ü1li
+ü1lö
+ü1lü
+ü1mä
+ü1me
+ü1mi
+ü1mö
+ü1mü
+ü1nä
+ü1ne
+ü1ni
+ü1nö
+ü1nü
+ü1pä
+ü1pe
+ü1pi
+ü1pö
+ü1pü
+ü1rä
+ü1re
+ü1ri
+ü1rö
+ü1rü
+ü1sä
+ü1se
+ü1si
+ü1sö
+ü1sü
+ü1tä
+ü1te
+ü1ti
+ü1tö
+ü1tü
+ü1wä
+ü1we
+ü1wi
+ü1wö
+ü1wü
+ü1ýä
+ü1ýe
+ü1ýi
+ü1ýö
+ü1ýü
+ü1zä
+ü1ze
+ü1zi
+ü1zö
+ü1zü
+ü1ňä
+ü1ňe
+ü1ňi
+ü1ňö
+ü1ňü
+ü1žä
+ü1že
+ü1ži
+ü1žö
+ü1žü
+ü1şä
+ü1şe
+ü1şi
+ü1şö
+ü1şü
+a1ba
+a1by
+a1bo
+a1bu
+a1ça
+a1çy
+a1ço
+a1çu
+a1da
+a1dy
+a1do
+a1du
+a1fa
+a1fy
+a1fo
+a1fu
+a1ga
+a1gy
+a1go
+a1gu
+a1ha
+a1hy
+a1ho
+a1hu
+a1ja
+a1jy
+a1jo
+a1ju
+a1ka
+a1ky
+a1ko
+a1ku
+a1la
+a1ly
+a1lo
+a1lu
+a1ma
+a1my
+a1mo
+a1mu
+a1na
+a1ny
+a1no
+a1nu
+a1pa
+a1py
+a1po
+a1pu
+a1ra
+a1ry
+a1ro
+a1ru
+a1sa
+a1sy
+a1so
+a1su
+a1ta
+a1ty
+a1to
+a1tu
+a1wa
+a1wy
+a1wo
+a1wu
+a1ýa
+a1ýy
+a1ýo
+a1ýu
+a1za
+a1zy
+a1zo
+a1zu
+a1ňa
+a1ňy
+a1ňo
+a1ňu
+a1ža
+a1žy
+a1žo
+a1žu
+a1şa
+a1şy
+a1şo
+a1şu
+y1ba
+y1by
+y1bo
+y1bu
+y1ça
+y1çy
+y1ço
+y1çu
+y1da
+y1dy
+y1do
+y1du
+y1fa
+y1fy
+y1fo
+y1fu
+y1ga
+y1gy
+y1go
+y1gu
+y1ha
+y1hy
+y1ho
+y1hu
+y1ja
+y1jy
+y1jo
+y1ju
+y1ka
+y1ky
+y1ko
+y1ku
+y1la
+y1ly
+y1lo
+y1lu
+y1ma
+y1my
+y1mo
+y1mu
+y1na
+y1ny
+y1no
+y1nu
+y1pa
+y1py
+y1po
+y1pu
+y1ra
+y1ry
+y1ro
+y1ru
+y1sa
+y1sy
+y1so
+y1su
+y1ta
+y1ty
+y1to
+y1tu
+y1wa
+y1wy
+y1wo
+y1wu
+y1ýa
+y1ýy
+y1ýo
+y1ýu
+y1za
+y1zy
+y1zo
+y1zu
+y1ňa
+y1ňy
+y1ňo
+y1ňu
+y1ža
+y1žy
+y1žo
+y1žu
+y1şa
+y1şy
+y1şo
+y1şu
+o1ba
+o1by
+o1bo
+o1bu
+o1ça
+o1çy
+o1ço
+o1çu
+o1da
+o1dy
+o1do
+o1du
+o1fa
+o1fy
+o1fo
+o1fu
+o1ga
+o1gy
+o1go
+o1gu
+o1ha
+o1hy
+o1ho
+o1hu
+o1ja
+o1jy
+o1jo
+o1ju
+o1ka
+o1ky
+o1ko
+o1ku
+o1la
+o1ly
+o1lo
+o1lu
+o1ma
+o1my
+o1mo
+o1mu
+o1na
+o1ny
+o1no
+o1nu
+o1pa
+o1py
+o1po
+o1pu
+o1ra
+o1ry
+o1ro
+o1ru
+o1sa
+o1sy
+o1so
+o1su
+o1ta
+o1ty
+o1to
+o1tu
+o1wa
+o1wy
+o1wo
+o1wu
+o1ýa
+o1ýy
+o1ýo
+o1ýu
+o1za
+o1zy
+o1zo
+o1zu
+o1ňa
+o1ňy
+o1ňo
+o1ňu
+o1ža
+o1žy
+o1žo
+o1žu
+o1şa
+o1şy
+o1şo
+o1şu
+u1ba
+u1by
+u1bo
+u1bu
+u1ça
+u1çy
+u1ço
+u1çu
+u1da
+u1dy
+u1do
+u1du
+u1fa
+u1fy
+u1fo
+u1fu
+u1ga
+u1gy
+u1go
+u1gu
+u1ha
+u1hy
+u1ho
+u1hu
+u1ja
+u1jy
+u1jo
+u1ju
+u1ka
+u1ky
+u1ko
+u1ku
+u1la
+u1ly
+u1lo
+u1lu
+u1ma
+u1my
+u1mo
+u1mu
+u1na
+u1ny
+u1no
+u1nu
+u1pa
+u1py
+u1po
+u1pu
+u1ra
+u1ry
+u1ro
+u1ru
+u1sa
+u1sy
+u1so
+u1su
+u1ta
+u1ty
+u1to
+u1tu
+u1wa
+u1wy
+u1wo
+u1wu
+u1ýa
+u1ýy
+u1ýo
+u1ýu
+u1za
+u1zy
+u1zo
+u1zu
+u1ňa
+u1ňy
+u1ňo
+u1ňu
+u1ža
+u1žy
+u1žo
+u1žu
+u1şa
+u1şy
+u1şo
+u1şu
+a1bi
+a1be
+y1bä
+y1bi
+y1be
+o1bi
+o1be
+u1bi
+u1be
+i1ba
+i1bo
+e1ba
+e1bo
+ä1bo
+ä1ba
+ö1ba
+a1çi
+a1çe
+y1çä
+y1çi
+y1çe
+o1çi
+o1çe
+u1çi
+u1çe
+i1ça
+i1ço
+e1ça
+e1ço
+ä1ço
+ä1ça
+ö1ça
+a1di
+a1de
+y1dä
+y1di
+y1de
+o1di
+o1de
+u1di
+u1de
+i1da
+i1do
+e1da
+e1do
+ä1do
+ä1da
+ö1da
+a1fi
+a1fe
+y1fä
+y1fi
+y1fe
+o1fi
+o1fe
+u1fi
+u1fe
+i1fa
+i1fo
+e1fa
+e1fo
+ä1fo
+ä1fa
+ö1fa
+a1gi
+a1ge
+y1gä
+y1gi
+y1ge
+o1gi
+o1ge
+u1gi
+u1ge
+i1ga
+i1go
+e1ga
+e1go
+ä1go
+ä1ga
+ö1ga
+a1hi
+a1he
+y1hä
+y1hi
+y1he
+o1hi
+o1he
+u1hi
+u1he
+i1ha
+i1ho
+e1ha
+e1ho
+ä1ho
+ä1ha
+ö1ha
+a1ji
+a1je
+y1jä
+y1ji
+y1je
+o1ji
+o1je
+u1ji
+u1je
+i1ja
+i1jo
+e1ja
+e1jo
+ä1jo
+ä1ja
+ö1ja
+a1ki
+a1ke
+y1kä
+y1ki
+y1ke
+o1ki
+o1ke
+u1ki
+u1ke
+i1ka
+i1ko
+e1ka
+e1ko
+ä1ko
+ä1ka
+ö1ka
+a1li
+a1le
+y1lä
+y1li
+y1le
+o1li
+o1le
+u1li
+u1le
+i1la
+i1lo
+e1la
+e1lo
+ä1lo
+ä1la
+ö1la
+a1mi
+a1me
+y1mä
+y1mi
+y1me
+o1mi
+o1me
+u1mi
+u1me
+i1ma
+i1mo
+e1ma
+e1mo
+ä1mo
+ä1ma
+ö1ma
+a1ni
+a1ne
+y1nä
+y1ni
+y1ne
+o1ni
+o1ne
+u1ni
+u1ne
+i1na
+i1no
+e1na
+e1no
+ä1no
+ä1na
+ö1na
+a1pi
+a1pe
+y1pä
+y1pi
+y1pe
+o1pi
+o1pe
+u1pi
+u1pe
+i1pa
+i1po
+e1pa
+e1po
+ä1po
+ä1pa
+ö1pa
+a1ri
+a1re
+y1rä
+y1ri
+y1re
+o1ri
+o1re
+u1ri
+u1re
+i1ra
+i1ro
+e1ra
+e1ro
+ä1ro
+ä1ra
+ö1ra
+a1si
+a1se
+y1sä
+y1si
+y1se
+o1si
+o1se
+u1si
+u1se
+i1sa
+i1so
+e1sa
+e1so
+ä1so
+ä1sa
+ö1sa
+a1ti
+a1te
+y1tä
+y1ti
+y1te
+o1ti
+o1te
+u1ti
+u1te
+i1ta
+i1to
+e1ta
+e1to
+ä1to
+ä1ta
+ö1ta
+a1wi
+a1we
+y1wä
+y1wi
+y1we
+o1wi
+o1we
+u1wi
+u1we
+i1wa
+i1wo
+e1wa
+e1wo
+ä1wo
+ä1wa
+ö1wa
+a1ýi
+a1ýe
+y1ýä
+y1ýi
+y1ýe
+o1ýi
+o1ýe
+u1ýi
+u1ýe
+i1ýa
+i1ýo
+e1ýa
+e1ýo
+ä1ýo
+ä1ýa
+ö1ýa
+a1zi
+a1ze
+y1zä
+y1zi
+y1ze
+o1zi
+o1ze
+u1zi
+u1ze
+i1za
+i1zo
+e1za
+e1zo
+ä1zo
+ä1za
+ö1za
+a1ňi
+a1ňe
+y1ňä
+y1ňi
+y1ňe
+o1ňi
+o1ňe
+u1ňi
+u1ňe
+i1ňa
+i1ňo
+e1ňa
+e1ňo
+ä1ňo
+ä1ňa
+ö1ňa
+a1ži
+a1že
+y1žä
+y1ži
+y1že
+o1ži
+o1že
+u1ži
+u1že
+i1ža
+i1žo
+e1ža
+e1žo
+ä1žo
+ä1ža
+ö1ža
+a1şi
+a1şe
+y1şä
+y1şi
+y1şe
+o1şi
+o1şe
+u1şi
+u1şe
+i1şa
+i1şo
+e1şa
+e1şo
+ä1şo
+ä1şa
+ö1şa
+b1b
+.b2b
+b1ç
+.b2ç
+b1d
+.b2d
+b1f
+.b2f
+b1g
+.b2g
+b1h
+.b2h
+b1j
+.b2j
+b1k
+.b2k
+b1l
+.b2l
+b1m
+.b2m
+b1n
+.b2n
+b1p
+.b2p
+b1r
+.b2r
+b1s
+.b2s
+b1t
+.b2t
+b1w
+.b2w
+b1ý
+.b2ý
+b1z
+.b2z
+b1ň
+.b2ň
+b1ž
+.b2ž
+b1ş
+.b2ş
+ç1b
+.ç2b
+ç1ç
+.ç2ç
+ç1d
+.ç2d
+ç1f
+.ç2f
+ç1g
+.ç2g
+ç1h
+.ç2h
+ç1j
+.ç2j
+ç1k
+.ç2k
+ç1l
+.ç2l
+ç1m
+.ç2m
+ç1n
+.ç2n
+ç1p
+.ç2p
+ç1r
+.ç2r
+ç1s
+.ç2s
+ç1t
+.ç2t
+ç1w
+.ç2w
+ç1ý
+.ç2ý
+ç1z
+.ç2z
+ç1ň
+.ç2ň
+ç1ž
+.ç2ž
+ç1ş
+.ç2ş
+d1b
+.d2b
+d1ç
+.d2ç
+d1d
+.d2d
+d1f
+.d2f
+d1g
+.d2g
+d1h
+.d2h
+d1j
+.d2j
+d1k
+.d2k
+d1l
+.d2l
+d1m
+.d2m
+d1n
+.d2n
+d1p
+.d2p
+d1r
+.d2r
+d1s
+.d2s
+d1t
+.d2t
+d1w
+.d2w
+d1ý
+.d2ý
+d1z
+.d2z
+d1ň
+.d2ň
+d1ž
+.d2ž
+d1ş
+.d2ş
+f1b
+.f2b
+f1ç
+.f2ç
+f1d
+.f2d
+f1f
+.f2f
+f1g
+.f2g
+f1h
+.f2h
+f1j
+.f2j
+f1k
+.f2k
+f1l
+.f2l
+f1m
+.f2m
+f1n
+.f2n
+f1p
+.f2p
+f1r
+.f2r
+f1s
+.f2s
+f1t
+.f2t
+f1w
+.f2w
+f1ý
+.f2ý
+f1z
+.f2z
+f1ň
+.f2ň
+f1ž
+.f2ž
+f1ş
+.f2ş
+g1b
+.g2b
+g1ç
+.g2ç
+g1d
+.g2d
+g1f
+.g2f
+g1g
+.g2g
+g1h
+.g2h
+g1j
+.g2j
+g1k
+.g2k
+g1l
+.g2l
+g1m
+.g2m
+g1n
+.g2n
+g1p
+.g2p
+g1r
+.g2r
+g1s
+.g2s
+g1t
+.g2t
+g1w
+.g2w
+g1ý
+.g2ý
+g1z
+.g2z
+g1ň
+.g2ň
+g1ž
+.g2ž
+g1ş
+.g2ş
+h1b
+.h2b
+h1ç
+.h2ç
+h1d
+.h2d
+h1f
+.h2f
+h1g
+.h2g
+h1h
+.h2h
+h1j
+.h2j
+h1k
+.h2k
+h1l
+.h2l
+h1m
+.h2m
+h1n
+.h2n
+h1p
+.h2p
+h1r
+.h2r
+h1s
+.h2s
+h1t
+.h2t
+h1w
+.h2w
+h1ý
+.h2ý
+h1z
+.h2z
+h1ň
+.h2ň
+h1ž
+.h2ž
+h1ş
+.h2ş
+j1b
+.j2b
+j1ç
+.j2ç
+j1d
+.j2d
+j1f
+.j2f
+j1g
+.j2g
+j1h
+.j2h
+j1j
+.j2j
+j1k
+.j2k
+j1l
+.j2l
+j1m
+.j2m
+j1n
+.j2n
+j1p
+.j2p
+j1r
+.j2r
+j1s
+.j2s
+j1t
+.j2t
+j1w
+.j2w
+j1ý
+.j2ý
+j1z
+.j2z
+j1ň
+.j2ň
+j1ž
+.j2ž
+j1ş
+.j2ş
+k1b
+.k2b
+k1ç
+.k2ç
+k1d
+.k2d
+k1f
+.k2f
+k1g
+.k2g
+k1h
+.k2h
+k1j
+.k2j
+k1k
+.k2k
+k1l
+.k2l
+k1m
+.k2m
+k1n
+.k2n
+k1p
+.k2p
+k1r
+.k2r
+k1s
+.k2s
+k1t
+.k2t
+k1w
+.k2w
+k1ý
+.k2ý
+k1z
+.k2z
+k1ň
+.k2ň
+k1ž
+.k2ž
+k1ş
+.k2ş
+l1b
+.l2b
+l1ç
+.l2ç
+l1d
+.l2d
+l1f
+.l2f
+l1g
+.l2g
+l1h
+.l2h
+l1j
+.l2j
+l1k
+.l2k
+l1l
+.l2l
+l1m
+.l2m
+l1n
+.l2n
+l1p
+.l2p
+l1r
+.l2r
+l1s
+.l2s
+l1t
+.l2t
+l1w
+.l2w
+l1ý
+.l2ý
+l1z
+.l2z
+l1ň
+.l2ň
+l1ž
+.l2ž
+l1ş
+.l2ş
+m1b
+.m2b
+m1ç
+.m2ç
+m1d
+.m2d
+m1f
+.m2f
+m1g
+.m2g
+m1h
+.m2h
+m1j
+.m2j
+m1k
+.m2k
+m1l
+.m2l
+m1m
+.m2m
+m1n
+.m2n
+m1p
+.m2p
+m1r
+.m2r
+m1s
+.m2s
+m1t
+.m2t
+m1w
+.m2w
+m1ý
+.m2ý
+m1z
+.m2z
+m1ň
+.m2ň
+m1ž
+.m2ž
+m1ş
+.m2ş
+n1b
+.n2b
+n1ç
+.n2ç
+n1d
+.n2d
+n1f
+.n2f
+n1g
+.n2g
+n1h
+.n2h
+n1j
+.n2j
+n1k
+.n2k
+n1l
+.n2l
+n1m
+.n2m
+n1n
+.n2n
+n1p
+.n2p
+n1r
+.n2r
+n1s
+.n2s
+n1t
+.n2t
+n1w
+.n2w
+n1ý
+.n2ý
+n1z
+.n2z
+n1ň
+.n2ň
+n1ž
+.n2ž
+n1ş
+.n2ş
+p1b
+.p2b
+p1ç
+.p2ç
+p1d
+.p2d
+p1f
+.p2f
+p1g
+.p2g
+p1h
+.p2h
+p1j
+.p2j
+p1k
+.p2k
+p1l
+.p2l
+p1m
+.p2m
+p1n
+.p2n
+p1p
+.p2p
+p1r
+.p2r
+p1s
+.p2s
+p1t
+.p2t
+p1w
+.p2w
+p1ý
+.p2ý
+p1z
+.p2z
+p1ň
+.p2ň
+p1ž
+.p2ž
+p1ş
+.p2ş
+r1b
+.r2b
+r1ç
+.r2ç
+r1d
+.r2d
+r1f
+.r2f
+r1g
+.r2g
+r1h
+.r2h
+r1j
+.r2j
+r1k
+.r2k
+r1l
+.r2l
+r1m
+.r2m
+r1n
+.r2n
+r1p
+.r2p
+r1r
+.r2r
+r1s
+.r2s
+r1t
+.r2t
+r1w
+.r2w
+r1ý
+.r2ý
+r1z
+.r2z
+r1ň
+.r2ň
+r1ž
+.r2ž
+r1ş
+.r2ş
+s1b
+.s2b
+s1ç
+.s2ç
+s1d
+.s2d
+s1f
+.s2f
+s1g
+.s2g
+s1h
+.s2h
+s1j
+.s2j
+s1k
+.s2k
+s1l
+.s2l
+s1m
+.s2m
+s1n
+.s2n
+s1p
+.s2p
+s1r
+.s2r
+s1s
+.s2s
+s1t
+.s2t
+s1w
+.s2w
+s1ý
+.s2ý
+s1z
+.s2z
+s1ň
+.s2ň
+s1ž
+.s2ž
+s1ş
+.s2ş
+t1b
+.t2b
+t1ç
+.t2ç
+t1d
+.t2d
+t1f
+.t2f
+t1g
+.t2g
+t1h
+.t2h
+t1j
+.t2j
+t1k
+.t2k
+t1l
+.t2l
+t1m
+.t2m
+t1n
+.t2n
+t1p
+.t2p
+t1r
+.t2r
+t1s
+.t2s
+t1t
+.t2t
+t1w
+.t2w
+t1ý
+.t2ý
+t1z
+.t2z
+t1ň
+.t2ň
+t1ž
+.t2ž
+t1ş
+.t2ş
+w1b
+.w2b
+w1ç
+.w2ç
+w1d
+.w2d
+w1f
+.w2f
+w1g
+.w2g
+w1h
+.w2h
+w1j
+.w2j
+w1k
+.w2k
+w1l
+.w2l
+w1m
+.w2m
+w1n
+.w2n
+w1p
+.w2p
+w1r
+.w2r
+w1s
+.w2s
+w1t
+.w2t
+w1w
+.w2w
+w1ý
+.w2ý
+w1z
+.w2z
+w1ň
+.w2ň
+w1ž
+.w2ž
+w1ş
+.w2ş
+ý1b
+.ý2b
+ý1ç
+.ý2ç
+ý1d
+.ý2d
+ý1f
+.ý2f
+ý1g
+.ý2g
+ý1h
+.ý2h
+ý1j
+.ý2j
+ý1k
+.ý2k
+ý1l
+.ý2l
+ý1m
+.ý2m
+ý1n
+.ý2n
+ý1p
+.ý2p
+ý1r
+.ý2r
+ý1s
+.ý2s
+ý1t
+.ý2t
+ý1w
+.ý2w
+ý1ý
+.ý2ý
+ý1z
+.ý2z
+ý1ň
+.ý2ň
+ý1ž
+.ý2ž
+ý1ş
+.ý2ş
+z1b
+.z2b
+z1ç
+.z2ç
+z1d
+.z2d
+z1f
+.z2f
+z1g
+.z2g
+z1h
+.z2h
+z1j
+.z2j
+z1k
+.z2k
+z1l
+.z2l
+z1m
+.z2m
+z1n
+.z2n
+z1p
+.z2p
+z1r
+.z2r
+z1s
+.z2s
+z1t
+.z2t
+z1w
+.z2w
+z1ý
+.z2ý
+z1z
+.z2z
+z1ň
+.z2ň
+z1ž
+.z2ž
+z1ş
+.z2ş
+ň1b
+.ň2b
+ň1ç
+.ň2ç
+ň1d
+.ň2d
+ň1f
+.ň2f
+ň1g
+.ň2g
+ň1h
+.ň2h
+ň1j
+.ň2j
+ň1k
+.ň2k
+ň1l
+.ň2l
+ň1m
+.ň2m
+ň1n
+.ň2n
+ň1p
+.ň2p
+ň1r
+.ň2r
+ň1s
+.ň2s
+ň1t
+.ň2t
+ň1w
+.ň2w
+ň1ý
+.ň2ý
+ň1z
+.ň2z
+ň1ň
+.ň2ň
+ň1ž
+.ň2ž
+ň1ş
+.ň2ş
+ž1b
+.ž2b
+ž1ç
+.ž2ç
+ž1d
+.ž2d
+ž1f
+.ž2f
+ž1g
+.ž2g
+ž1h
+.ž2h
+ž1j
+.ž2j
+ž1k
+.ž2k
+ž1l
+.ž2l
+ž1m
+.ž2m
+ž1n
+.ž2n
+ž1p
+.ž2p
+ž1r
+.ž2r
+ž1s
+.ž2s
+ž1t
+.ž2t
+ž1w
+.ž2w
+ž1ý
+.ž2ý
+ž1z
+.ž2z
+ž1ň
+.ž2ň
+ž1ž
+.ž2ž
+ž1ş
+.ž2ş
+ş1b
+.ş2b
+ş1ç
+.ş2ç
+ş1d
+.ş2d
+ş1f
+.ş2f
+ş1g
+.ş2g
+ş1h
+.ş2h
+ş1j
+.ş2j
+ş1k
+.ş2k
+ş1l
+.ş2l
+ş1m
+.ş2m
+ş1n
+.ş2n
+ş1p
+.ş2p
+ş1r
+.ş2r
+ş1s
+.ş2s
+ş1t
+.ş2t
+ş1w
+.ş2w
+ş1ý
+.ş2ý
+ş1z
+.ş2z
+ş1ň
+.ş2ň
+ş1ž
+.ş2ž
+ş1ş
+.ş2ş
+ý2t1b
+ý2n1b
+ý2d1b
+r2t1b
+ý2p1b
+l2p1b
+l2t1b
+g2t1b
+n2t1b
+r2k1b
+r2p1b
+k2t1b
+r2h1b
+s2t1b
+l2k1b
+w2p1b
+n2s1b
+r2s1b
+l2m1b
+ý2t1ç
+ý2n1ç
+ý2d1ç
+r2t1ç
+ý2p1ç
+l2p1ç
+l2t1ç
+g2t1ç
+n2t1ç
+r2k1ç
+r2p1ç
+k2t1ç
+r2h1ç
+s2t1ç
+l2k1ç
+w2p1ç
+n2s1ç
+r2s1ç
+l2m1ç
+ý2t1d
+ý2n1d
+ý2d1d
+r2t1d
+ý2p1d
+l2p1d
+l2t1d
+g2t1d
+n2t1d
+r2k1d
+r2p1d
+k2t1d
+r2h1d
+s2t1d
+l2k1d
+w2p1d
+n2s1d
+r2s1d
+l2m1d
+ý2t1g
+ý2n1g
+ý2d1g
+r2t1g
+ý2p1g
+l2p1g
+l2t1g
+g2t1g
+n2t1g
+r2k1g
+r2p1g
+k2t1g
+r2h1g
+s2t1g
+l2k1g
+w2p1g
+n2s1g
+r2s1g
+l2m1g
+ý2t1j
+ý2n1j
+ý2d1j
+r2t1j
+ý2p1j
+l2p1j
+l2t1j
+g2t1j
+n2t1j
+r2k1j
+r2p1j
+k2t1j
+r2h1j
+s2t1j
+l2k1j
+w2p1j
+n2s1j
+r2s1j
+l2m1j
+ý2t1k
+ý2n1k
+ý2d1k
+r2t1k
+ý2p1k
+l2p1k
+l2t1k
+g2t1k
+n2t1k
+r2k1k
+r2p1k
+k2t1k
+r2h1k
+s2t1k
+l2k1k
+w2p1k
+n2s1k
+r2s1k
+l2m1k
+ý2t1l
+ý2n1l
+ý2d1l
+r2t1l
+ý2p1l
+l2p1l
+l2t1l
+g2t1l
+n2t1l
+r2k1l
+r2p1l
+k2t1l
+r2h1l
+s2t1l
+l2k1l
+w2p1l
+n2s1l
+r2s1l
+l2m1l
+ý2t1m
+ý2n1m
+ý2d1m
+r2t1m
+ý2p1m
+l2p1m
+l2t1m
+g2t1m
+n2t1m
+r2k1m
+r2p1m
+k2t1m
+r2h1m
+s2t1m
+l2k1m
+w2p1m
+n2s1m
+r2s1m
+l2m1m
+ý2t1n
+ý2n1n
+ý2d1n
+r2t1n
+ý2p1n
+l2p1n
+l2t1n
+g2t1n
+n2t1n
+r2k1n
+r2p1n
+k2t1n
+r2h1n
+s2t1n
+l2k1n
+w2p1n
+n2s1n
+r2s1n
+l2m1n
+ý2t1p
+ý2n1p
+ý2d1p
+r2t1p
+ý2p1p
+l2p1p
+l2t1p
+g2t1p
+n2t1p
+r2k1p
+r2p1p
+k2t1p
+r2h1p
+s2t1p
+l2k1p
+w2p1p
+n2s1p
+r2s1p
+l2m1p
+ý2t1s
+ý2n1s
+ý2d1s
+r2t1s
+ý2p1s
+l2p1s
+l2t1s
+g2t1s
+n2t1s
+r2k1s
+r2p1s
+k2t1s
+r2h1s
+s2t1s
+l2k1s
+w2p1s
+n2s1s
+r2s1s
+l2m1s
+ý2t1t
+ý2n1t
+ý2d1t
+r2t1t
+ý2p1t
+l2p1t
+l2t1t
+g2t1t
+n2t1t
+r2k1t
+r2p1t
+k2t1t
+r2h1t
+s2t1t
+l2k1t
+w2p1t
+n2s1t
+r2s1t
+l2m1t
+ý2t1ý
+ý2n1ý
+ý2d1ý
+r2t1ý
+ý2p1ý
+l2p1ý
+l2t1ý
+g2t1ý
+n2t1ý
+r2k1ý
+r2p1ý
+k2t1ý
+r2h1ý
+s2t1ý
+l2k1ý
+w2p1ý
+n2s1ý
+r2s1ý
+l2m1ý
+ý2t1z
+ý2n1z
+ý2d1z
+r2t1z
+ý2p1z
+l2p1z
+l2t1z
+g2t1z
+n2t1z
+r2k1z
+r2p1z
+k2t1z
+r2h1z
+s2t1z
+l2k1z
+w2p1z
+n2s1z
+r2s1z
+l2m1z
+ý2t1ş
+ý2n1ş
+ý2d1ş
+r2t1ş
+ý2p1ş
+l2p1ş
+l2t1ş
+g2t1ş
+n2t1ş
+r2k1ş
+r2p1ş
+k2t1ş
+r2h1ş
+s2t1ş
+l2k1ş
+w2p1ş
+n2s1ş
+r2s1ş
+l2m1ş
+s2k1d
+l1s2k
+l1s2t
+s1t2r
+n2g1l
+n1g2r
+s2k1w} \ No newline at end of file
diff --git a/tex/context/patterns/lang-tk.rme b/tex/context/patterns/lang-tk.rme
new file mode 100644
index 000000000..d5a71a636
--- /dev/null
+++ b/tex/context/patterns/lang-tk.rme
@@ -0,0 +1,18 @@
+% generated by mtxrun --script pattern --convert
+
+% Hyphenation patterns for Turkmen (hyph-tk.tex)
+%
+% Author: Nazar Annagurban <nazartm at gmail.com>
+% License: Public domain
+% Version: 0.1
+% Date: 16 March 2010
+%
+% ----------------------------------------------------------------------
+%
+% The file has been auto-generated from generate_patterns_tk.rb
+% that is part of hyph-utf8.
+%
+% For more information about UTF-8 hyphenation patterns for TeX and
+% links to this file see
+% http://www.tug.org/tex-hyphen/
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-tr.hyp b/tex/context/patterns/lang-tr.hyp
new file mode 100644
index 000000000..ad68813ae
--- /dev/null
+++ b/tex/context/patterns/lang-tr.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-tr.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-tr.pat b/tex/context/patterns/lang-tr.pat
new file mode 100644
index 000000000..0d91c5ca3
--- /dev/null
+++ b/tex/context/patterns/lang-tr.pat
@@ -0,0 +1,604 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-tr.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v y z â ç î ö û ü ğ ı ş
+
+\patterns{
+2a1
+2â1
+2e1
+2ı1
+2i1
+2î1
+2o1
+2ö1
+2u1
+2ü1
+2û1
+1b1
+1c1
+1ç1
+1d1
+1f1
+1g1
+1ğ1
+1h1
+1j1
+1k1
+1l1
+1m1
+1n1
+1p1
+1r1
+1s1
+1ş1
+1t1
+1v1
+1y1
+1z1
+2e2cek.
+2bb
+2bc
+2bç
+2bd
+2bf
+2bg
+2bğ
+2bh
+2bj
+2bk
+2bl
+2bm
+2bn
+2bp
+2br
+2bs
+2bş
+2bt
+2bv
+2by
+2bz
+2cb
+2cc
+2cç
+2cd
+2cf
+2cg
+2cğ
+2ch
+2cj
+2ck
+2cl
+2cm
+2cn
+2cp
+2cr
+2cs
+2cş
+2ct
+2cv
+2cy
+2cz
+2çb
+2çc
+2çç
+2çd
+2çf
+2çg
+2çğ
+2çh
+2çj
+2çk
+2çl
+2çm
+2çn
+2çp
+2çr
+2çs
+2çş
+2çt
+2çv
+2çy
+2çz
+2db
+2dc
+2dç
+2dd
+2df
+2dg
+2dğ
+2dh
+2dj
+2dk
+2dl
+2dm
+2dn
+2dp
+2dr
+2ds
+2dş
+2dt
+2dv
+2dy
+2dz
+2fb
+2fc
+2fç
+2fd
+2ff
+2fg
+2fğ
+2fh
+2fj
+2fk
+2fl
+2fm
+2fn
+2fp
+2fr
+2fs
+2fş
+2ft
+2fv
+2fy
+2fz
+2gb
+2gc
+2gç
+2gd
+2gf
+2gg
+2gğ
+2gh
+2gj
+2gk
+2gl
+2gm
+2gn
+2gp
+2gr
+2gs
+2gş
+2gt
+2gv
+2gy
+2gz
+2ğb
+2ğc
+2ğç
+2ğd
+2ğf
+2ğg
+2ğğ
+2ğh
+2ğj
+2ğk
+2ğl
+2ğm
+2ğn
+2ğp
+2ğr
+2ğs
+2ğş
+2ğt
+2ğv
+2ğy
+2ğz
+2hb
+2hc
+2hç
+2hd
+2hf
+2hg
+2hğ
+2hh
+2hj
+2hk
+2hl
+2hm
+2hn
+2hp
+2hr
+2hs
+2hş
+2ht
+2hv
+2hy
+2hz
+2jb
+2jc
+2jç
+2jd
+2jf
+2jg
+2jğ
+2jh
+2jj
+2jk
+2jl
+2jm
+2jn
+2jp
+2jr
+2js
+2jş
+2jt
+2jv
+2jy
+2jz
+2kb
+2kc
+2kç
+2kd
+2kf
+2kg
+2kğ
+2kh
+2kj
+2kk
+2kl
+2km
+2kn
+2kp
+2kr
+2ks
+2kş
+2kt
+2kv
+2ky
+2kz
+2lb
+2lc
+2lç
+2ld
+2lf
+2lg
+2lğ
+2lh
+2lj
+2lk
+2ll
+2lm
+2ln
+2lp
+2lr
+2ls
+2lş
+2lt
+2lv
+2ly
+2lz
+2mb
+2mc
+2mç
+2md
+2mf
+2mg
+2mğ
+2mh
+2mj
+2mk
+2ml
+2mm
+2mn
+2mp
+2mr
+2ms
+2mş
+2mt
+2mv
+2my
+2mz
+2nb
+2nc
+2nç
+2nd
+2nf
+2ng
+2nğ
+2nh
+2nj
+2nk
+2nl
+2nm
+2nn
+2np
+2nr
+2ns
+2nş
+2nt
+2nv
+2ny
+2nz
+2pb
+2pc
+2pç
+2pd
+2pf
+2pg
+2pğ
+2ph
+2pj
+2pk
+2pl
+2pm
+2pn
+2pp
+2pr
+2ps
+2pş
+2pt
+2pv
+2py
+2pz
+2rb
+2rc
+2rç
+2rd
+2rf
+2rg
+2rğ
+2rh
+2rj
+2rk
+2rl
+2rm
+2rn
+2rp
+2rr
+2rs
+2rş
+2rt
+2rv
+2ry
+2rz
+2sb
+2sc
+2sç
+2sd
+2sf
+2sg
+2sğ
+2sh
+2sj
+2sk
+2sl
+2sm
+2sn
+2sp
+2sr
+2ss
+2sş
+2st
+2sv
+2sy
+2sz
+2şb
+2şc
+2şç
+2şd
+2şf
+2şg
+2şğ
+2şh
+2şj
+2şk
+2şl
+2şm
+2şn
+2şp
+2şr
+2şs
+2şş
+2şt
+2şv
+2şy
+2şz
+2tb
+2tc
+2tç
+2td
+2tf
+2tg
+2tğ
+2th
+2tj
+2tk
+2tl
+2tm
+2tn
+2tp
+2tr
+2ts
+2tş
+2tt
+2tv
+2ty
+2tz
+2vb
+2vc
+2vç
+2vd
+2vf
+2vg
+2vğ
+2vh
+2vj
+2vk
+2vl
+2vm
+2vn
+2vp
+2vr
+2vs
+2vş
+2vt
+2vv
+2vy
+2vz
+2yb
+2yc
+2yç
+2yd
+2yf
+2yg
+2yğ
+2yh
+2yj
+2yk
+2yl
+2ym
+2yn
+2yp
+2yr
+2ys
+2yş
+2yt
+2yv
+2yy
+2yz
+2zb
+2zc
+2zç
+2zd
+2zf
+2zg
+2zğ
+2zh
+2zj
+2zk
+2zl
+2zm
+2zn
+2zp
+2zr
+2zs
+2zş
+2zt
+2zv
+2zy
+2zz
+a3a2
+a3â2
+a3e2
+a3ı2
+a3i2
+a3î2
+a3o2
+a3ö2
+a3u2
+a3ü2
+a3û2
+â3a2
+â3â2
+â3e2
+â3ı2
+â3i2
+â3î2
+â3o2
+â3ö2
+â3u2
+â3ü2
+â3û2
+e3a2
+e3â2
+e3e2
+e3ı2
+e3i2
+e3î2
+e3o2
+e3ö2
+e3u2
+e3ü2
+e3û2
+ı3a2
+ı3â2
+ı3e2
+ı3ı2
+ı3i2
+ı3î2
+ı3o2
+ı3ö2
+ı3u2
+ı3ü2
+ı3û2
+i3a2
+i3â2
+i3e2
+i3ı2
+i3i2
+i3î2
+i3o2
+i3ö2
+i3u2
+i3ü2
+i3û2
+î3a2
+î3â2
+î3e2
+î3ı2
+î3i2
+î3î2
+î3o2
+î3ö2
+î3u2
+î3ü2
+î3û2
+o3a2
+o3â2
+o3e2
+o3ı2
+o3i2
+o3î2
+o3o2
+o3ö2
+o3u2
+o3ü2
+o3û2
+ö3a2
+ö3â2
+ö3e2
+ö3ı2
+ö3i2
+ö3î2
+ö3o2
+ö3ö2
+ö3u2
+ö3ü2
+ö3û2
+u3a2
+u3â2
+u3e2
+u3ı2
+u3i2
+u3î2
+u3o2
+u3ö2
+u3u2
+u3ü2
+u3û2
+ü3a2
+ü3â2
+ü3e2
+ü3ı2
+ü3i2
+ü3î2
+ü3o2
+ü3ö2
+ü3u2
+ü3ü2
+ü3û2
+û3a2
+û3â2
+û3e2
+û3ı2
+û3i2
+û3î2
+û3o2
+û3ö2
+û3u2
+û3ü2
+û3û2
+tu4r4k
+m1t4rak} \ No newline at end of file
diff --git a/tex/context/patterns/lang-tr.rme b/tex/context/patterns/lang-tr.rme
new file mode 100644
index 000000000..143164e25
--- /dev/null
+++ b/tex/context/patterns/lang-tr.rme
@@ -0,0 +1,26 @@
+% generated by mtxrun --script pattern --convert
+
+% hyph-tr.tex
+%
+% File auto-generated from generate_patterns_tr.rb that is part of hyph-utf8
+%
+% Licence:
+% - Free enough for Debian & TeX Live or any other distributor
+% - If you are reading this and have some suggestion about what to put here, please advise
+% - I (Mojca) would prefer to say 'public domain', but don't know what it means for the original authors
+%
+% Credits:
+% - algorithm developed by P. A. MacKay for the Ottoman Texts Project in 1987
+% - rules adapted for modern Turkish by H. Turgut Uyar <uyar at itu.edu.tr>
+% - initiative to improve Turkish patterns by S. Ekin Kocabas <kocabas at stanford.edu>
+% - script written by Mojca Miklavec <mojca.miklavec.lists at gmail.com> in June 2008
+%
+% Modifications:
+% - adapted for the use on modern UTF-8 TeX engines
+% - UTF-8 patterns are used
+% - only letters for Modern Turkish + âîû (the first one often needed, the other two don't hurt)
+% - if needed, support for Ottoman Turkish might be provided separately under 'ota' (not 'tr')
+%
+% Notes:
+% - you need to use loadhyph-tr.tex, please do not try to put \catcode-s & \lccode-s here
+% \ No newline at end of file
diff --git a/tex/context/patterns/lang-uk.hyp b/tex/context/patterns/lang-uk.hyp
new file mode 100644
index 000000000..faa79bb74
--- /dev/null
+++ b/tex/context/patterns/lang-uk.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-uk.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-uk.pat b/tex/context/patterns/lang-uk.pat
new file mode 100644
index 000000000..2a876540e
--- /dev/null
+++ b/tex/context/patterns/lang-uk.pat
@@ -0,0 +1,1905 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-uk.rme
+
+% used: а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ь ю я є і ї ґ
+
+\patterns{
+2а1
+а3а
+а3е
+а3і
+а3о
+а3у
+а3ю
+а3я
+а3є
+а3ї
+2е1
+е3а
+е3е
+е3і
+е3о
+е3у
+е3ю
+е3я
+е3є
+е3ї
+2и1
+и3а
+и3е
+и3і
+и3о
+и3у
+и3ю
+и3я
+и3є
+и3ї
+2і1
+і3а
+і3е
+і3и
+і3о
+і3у
+і3ю
+і3я
+і3є
+і3ї
+2о1
+о3а
+о3е
+о3і
+о3о
+о3у
+о3ю
+о3я
+о3є
+о3ї
+2у1
+у3а
+у3е
+у3і
+у3о
+у3у
+у3ю
+у3я
+у3є
+у3ї
+2ю1
+ю3а
+ю3е
+ю3і
+ю3о
+ю3у
+ю3ю
+ю3я
+ю3є
+ю3ї
+2я1
+я3а
+я3е
+я3о
+я3у
+я3ю
+я3я
+я3є
+я3ї
+2є1
+є3у
+є3ю
+є3є
+є3ї
+2ї1
+ї3е
+ї3о
+ї3ю
+2б1к
+2б1п
+2б1с
+2б1т
+2б1ф
+2б1х
+2б1ц
+2б1ч
+2б1ш
+2б1щ
+2в1б
+2в1г
+2в1д
+2в1ж
+2в1з
+2в1к
+2в1л
+2в1м
+2в1н
+2в1п
+2в1р
+2в1с
+2в1т
+2в1ф
+2в1х
+2в1ц
+2в1ч
+2в1ш
+2в1щ
+2в1й
+2г1к
+2г1п
+2г1с
+2г1т
+2г1ф
+2г1ц
+2г1ч
+2г1ш
+2д1к
+2д1п
+2д1с
+2д1т
+2д1ф
+2д1х
+2д1ц
+2д1ч
+2д1ш
+2д1щ
+2ж1к
+2ж1п
+2ж1с
+2ж1т
+2ж1ф
+2ж1х
+2ж1ц
+2ж1ч
+2ж1ш
+2з1к
+2з1п
+2з1с
+2з1т
+2з1ф
+2з1х
+2з1ц
+2з1ч
+2з1ш
+2з1щ
+2к1б
+2к1г
+2к1д
+2к1з
+2л1б
+2л1в
+2л1г
+2л1ґ
+2л1д
+2л1ж
+2л1з
+2л1к
+2л1м
+2л1н
+2л1п
+2л1р
+2л1с
+2л1т
+2л1ф
+2л1х
+2л1ц
+2л1ч
+2м1б
+2м1в
+2м1г
+2м1д
+2м1ж
+2м1з
+2м1к
+2м1л
+2м1н
+2м1п
+2м1р
+2м1с
+2м1т
+2м1ф
+2м1х
+2м1ц
+2м1ч
+2м1ш
+2м1щ
+2н1б
+2н1в
+2н1г
+2н1д
+2н1ж
+2н1з
+2н1к
+2н1л
+2н1м
+2н1п
+2н1р
+2н1с
+2н1т
+2н1ф
+2н1х
+2н1ц
+2н1ч
+2н1ш
+2н1щ
+2п1б
+2п1д
+2п1з
+2р1б
+2р1в
+2р1г
+2р1ґ
+2р1д
+2р1ж
+2р1з
+2р1к
+2р1л
+2р1м
+2р1н
+2р1п
+2р1с
+2р1т
+2р1ф
+2р1х
+2р1ц
+2р1ч
+2р1ш
+2р1щ
+2р1й
+2с1б
+2с1г
+2с1д
+2т1б
+2т1г
+2т1д
+2т1ж
+2т1з
+2ф1б
+2ф1г
+2ф1з
+2х1г
+2х1д
+2ц1б
+2ц1г
+2ц1д
+2ц1з
+2ч1б
+2ч1д
+2ч1ж
+2ш1б
+2ш1г
+2й1б
+2й1в
+2й1г
+2й1д
+2й1ж
+2й1з
+2й1к
+2й1л
+2й1м
+2й1н
+2й1п
+2й1р
+2й1с
+2й1т
+2й1ф
+2й1х
+2й1ц
+2й1ч
+2й1ш
+2й1щ
+2дь1к
+2дь1с
+2дь1т
+2дь1ц
+2зь1к
+2зь1с
+2зь1т
+2ль1б
+2ль1в
+2ль1г
+2ль1д
+2ль1ж
+2ль1з
+2ль1к
+2ль1м
+2ль1н
+2ль1п
+2ль1р
+2ль1с
+2ль1т
+2ль1ф
+2ль1х
+2ль1ц
+2ль1ч
+2ль1ш
+2ль1щ
+2ль1й
+2нь1б
+2нь1г
+2нь1з
+2нь1к
+2нь1л
+2нь1м
+2нь1с
+2нь1т
+2нь1х
+2нь1ц
+2нь1ч
+2нь1ш
+2нь1й
+2рь1к
+2рь1ц
+2сь1б
+2сь1д
+2ть1б
+2к1сп
+2к1ст
+2к1ськ
+2п1сп
+2п1ст
+2п1ськ
+2с1пк
+2с1пп
+2с1пс
+2с1пт
+2с1пх
+2с1пч
+2с1ськ
+2с1тк
+2с1тп
+2с1тс
+2с1тсь
+2с1тт
+2с1тф
+2с1тц
+2с1шт
+2сь1кк
+2сь1кс
+2сь1кт
+2т1ск
+2т1сп
+2т1ст
+2т1ськ
+2т1шк
+2ф1сп
+2ф1ст
+2ф1ськ
+2ф1шт
+2х1ст
+2х1ськ
+2ц1ст
+2ц1шк
+2ш1тк
+2ш1тсь
+2б1б
+2в1в
+2г1г
+2ґ1ґ
+2д1д
+2ж1ж
+2з1з
+2к1к
+2л1л
+2м1м
+2н1н
+2п1п
+2р1р
+2с1с
+2т1т
+2ф1ф
+2х1х
+2ц1ц
+2ч1ч
+2ш1ш
+2щ1щ
+2й1й
+3ння
+3ття
+3ттю
+3лля
+3ллє
+3ллю
+3ддя
+д4ж
+д4з
+а2й
+е2й
+и2й
+і2й
+о2й
+у2й
+ю2й
+я2й
+є2й
+ї2й
+3й6о
+ь6о
+6ь
+.бд6
+.бр6
+.вб6
+.вг6
+.вд6
+.вж6
+.вз6
+.вз6д6
+.вк6
+.вл6
+.вм6
+.вп6
+.вп6х6
+.вс6
+.вс6т6
+.вт6
+.вш6к6
+.дж6
+.дз6
+.дл6
+.дс6
+.зб6
+.зг6
+.зд6
+.зд6з6
+.зл6
+.зс6
+.зс6к6
+.зс6т6
+.зч6
+.зш6
+.зш6к6
+.зґ6
+.йш6
+.кл6
+.кп6
+.кс6
+.кх6
+.кш6
+.лк6с6
+.лс6
+.ль6
+.мс6
+.мф6
+.нб6
+.пр6
+.пс6
+.пх6
+.рт6
+.ск6
+.ск6л6
+.сл6
+.сп6
+.сп6л6
+.сп6х6
+.ст6
+.сх6
+.сх6л6
+.тк6
+.тр6
+.тх6
+.ть6
+.фл6
+.хл6
+.ць6
+.чх6
+.шк6
+.шл6
+.шп6
+.шт6
+6бв.
+6бз.
+6бй.
+6бл.
+6б6ль.
+6бн.
+6бр.
+6бс.
+6б6ст.
+6б6с6тв.
+6б6с6тр.
+6б6с6ьк.
+6б6ць.
+6вб.
+6вв.
+6вд.
+6в6др.
+6в6дь.
+6вж.
+6вз.
+6в6зь.
+6вй.
+6вк.
+6вл.
+6в6ль.
+6вм.
+6вн.
+6вп.
+6вр.
+6вс.
+6в6с6тв.
+6в6с6ть.
+6в6сь.
+6в6с6ьк.
+6вт.
+6вх.
+6в6ць.
+6вч.
+6вш.
+6вщ.
+6гв.
+6гг.
+6гд.
+6гл.
+6г6ль.
+6гм.
+6гн.
+6гр.
+6гс.
+6г6с6тв.
+6г6сь.
+6гт.
+6дж.
+6дз.
+6д6зь.
+6дл.
+6дм.
+6дн.
+6др.
+6д6с6тв.
+6д6с6ьк.
+6дт.
+6дь.
+6д6ь6сь.
+6жб.
+6жв.
+6ж6дь.
+6ж6сь.
+6зв.
+6зг.
+6зд.
+6з6дв.
+6з6дн.
+6з6дь.
+6зк.
+6зл.
+6зм.
+6зн.
+6з6нь.
+6зр.
+6з6сь.
+6зь.
+6з6ьб.
+6з6ьк.
+6йб.
+6йв.
+6йг.
+6йд.
+6йз.
+6йк.
+6й6кл.
+6йл.
+6й6ль.
+6йм.
+6й6мс.
+6йн.
+6й6нс.
+6йп.
+6йр.
+6йс.
+6й6ст.
+6й6с6тв.
+6й6с6тр.
+6й6сь.
+6й6с6ьк.
+6йт.
+6й6тс.
+6йф.
+6йх.
+6йц.
+6йч.
+6йш.
+6кв.
+6кк.
+6кл.
+6к6ль.
+6кр.
+6кс.
+6к6ст.
+6к6сь.
+6кт.
+6к6тр.
+6кх.
+6кш.
+6лб.
+6лг.
+6лд.
+6лк.
+6лл.
+6л6ль.
+6лм.
+6л6мс.
+6лн.
+6лп.
+6лс.
+6лт.
+6л6хв.
+6ль.
+6л6ьб.
+6л6ьв.
+6л6ьг.
+6л6ьд.
+6л6ь6дс.
+6л6ьз.
+6л6ьк.
+6л6ьм.
+6л6ьн.
+6л6ьп.
+6л6ьс.
+6л6ь6ств.
+6л6ь6сь.
+6л6ь6ськ.
+6л6ьт.
+6л6ь6тр.
+6л6ьф.
+6л6ьх.
+6л6ьц.
+6л6ьч.
+6л6ьш.
+6л6ьщ.
+6мб.
+6м6б6ль.
+6м6бр.
+6мг.
+6мж.
+6мк.
+6мл.
+6м6ль.
+6мм.
+6мн.
+6мп.
+6мр.
+6мс.
+6м6с6тв.
+6м6сь.
+6м6с6ьк.
+6мт.
+6мф.
+6мх.
+6мш.
+6нв.
+6нг.
+6н6гл.
+6н6г6ль.
+6н6гр.
+6н6гс.
+6нд.
+6н6дж.
+6н6дз.
+6н6дп.
+6н6др.
+6нж.
+6нз.
+6нк.
+6н6кс.
+6н6кт.
+6нм.
+6нн.
+6нр.
+6нс.
+6н6ск.
+6н6ст.
+6н6с6тв.
+6н6с6тр.
+6н6с6ьк.
+6н6с6ькй.
+6нт.
+6н6тк.
+6н6тр.
+6н6т6ств.
+6н6ть.
+6нф.
+6нх.
+6нц.
+6н6ць.
+6нч.
+6нш.
+6нь.
+6н6ьб.
+6н6ьг.
+6н6ьк.
+6н6ь6сь.
+6пд.
+6пл.
+6пр.
+6пс.
+6п6с6тв.
+6п6сь.
+6пт.
+6п6тр.
+6пф.
+6пц.
+6рб.
+6рв.
+6рг.
+6рд.
+6р6дв.
+6р6дж.
+6р6дь.
+6рж.
+6рз.
+6р6зн.
+6р6зь.
+6рк.
+6р6кс.
+6р6кт.
+6рл.
+6р6ль.
+6р6л6ьз.
+6рм.
+6рн.
+6р6нс.
+6р6н6ст.
+6р6нь.
+6рп.
+6рр.
+6рс.
+6р6ср.
+6р6ст.
+6р6с6тв.
+6р6с6ть.
+6р6сь.
+6р6с6ьк.
+6рт.
+6р6тв.
+6р6тр.
+6р6ть.
+6рф.
+6рх.
+6рц.
+6р6ць.
+6рч.
+6рш.
+6рщ.
+6р6щ6сь.
+6рь.
+6с6дп.
+6с6д6рп.
+6ск.
+6сл.
+6с6ль.
+6см.
+6сн.
+6сп.
+6сс.
+6ст.
+6с6тв.
+6с6тй.
+6с6тм.
+6с6тр.
+6с6т6рь.
+6с6ть.
+6с6ць.
+6сь.
+6с6ьб.
+6с6ьк.
+6с6ьм.
+6тв.
+6т6вт.
+6т6зт.
+6тл.
+6т6ль.
+6тм.
+6т6мр.
+6тр.
+6тс.
+6т6с6тв.
+6т6с6ьк.
+6тт.
+6тц.
+6тч.
+6ть.
+6т6ь6сь.
+6фм.
+6фр.
+6ф6с6тв.
+6фт.
+6ф6ть.
+6фф.
+6фь.
+6хв.
+6хм.
+6хн.
+6хр.
+6хт.
+6хш.
+6ц6тв.
+6ць.
+6ц6ьк.
+6чб.
+6чм.
+6чн.
+6чт.
+6шв.
+6ш6ль.
+6шм.
+6шн.
+6ш6нл.
+6ш6сь.
+6шт.
+6ш6тв.
+6щ6сь.
+.бе4з3
+.безу4
+.бе5з4о3д
+.без5о4соб
+.безві4д3
+.без3ро4з3
+виї4
+.ві5д4ом
+.ві5д4озв
+.ві5д4ун
+віду4ч
+.ві5д4а
+.ві5д4ер
+.ві5д4і
+.ві4д3
+.мі4ж3
+безві4д3
+ові4д3
+ді4єві4д3
+за4вві4д3
+неві4д3
+про4ф3ві4д3
+спе4ц3ві4д3
+співві4д3
+те4х3ві4д3
+.пере4д3бач
+.пере4д3виб
+.пере4д3г
+.пере4д3д
+.пере4д3м
+.пере4д3ост
+.пере4д3пла
+.пере4д3пок
+.пере4д3р
+.пере4д3св
+.пере4д3умов
+.пере4д3усі
+.пере4д3фр
+.пере4д3ч
+.пере3
+.пона4д3
+.пона5д4і
+.пона5д4и
+.пона5д4я
+3п4ре
+3п4ри
+приї4
+3п4ро
+3п4рі
+.пі5д4о
+.пі5д4і
+.пі4д3
+.пі5д4е
+.пі5д4и
+.пі5д4у
+.пі4в3
+.спі4в3
+.напі4в3
+.ро5з4і
+.ро5з4е
+ро5з4йом
+.ро5з4а
+.ро4з3
+.чере4з3
+оо4б
+ооб3м
+ооб3ро
+за5о4р
+до5о4р
+по5о4р
+пере5о4р
+пі6д5о4р
+бе4з5і4дей
+за3ю4ш
+за3я4ло
+коу4роч
+зу4роч
+наду4роч
+позау4роч
+поу4роч
+приу4роч
+на4й3у4бог
+нао4р
+прио4р
+неу4к
+3в4б4лаг
+3в4к4лад
+3в4п4лив
+3в4п4равн
+3в4р4одлив
+3в4т4рут
+3в4т4руч
+3з4б4рой
+3з4б4рою
+3з4б4роє
+3й4ш4л
+3м4к4не
+3м4к4ну
+3м4к4ні
+3п4с4ков
+3с4к4лад
+3с4к4ле
+3с4к4лит
+3с4к4ло
+3с4к4рипт
+3с4п4лав
+3с4п4лат
+3с4п4лач
+3с4п4рав
+3с4п4ритн
+3с4п4рият
+3с4п4ромо
+3с4т4вор
+3с4т4ражд
+3с4т4рах
+3с4т4риб
+3с4т4риж
+3с4т4рой
+3с4т4рок
+3с4т4ром
+3с4т4роф
+3с4т4роч
+3с4т4рою
+3с4т4роя
+3с4т4роє
+3с4т4рої
+3с4т4рукт
+3с4т4рукц
+3с4т4рій
+3с4т4ріл
+3с4т4річ
+3т4к4нен
+3т4ь4мар
+3т4ь4мяні
+3у4п4рав
+3блаж
+3ближ
+3близ
+3блиск
+3блок
+3блоці
+3бран
+3брати
+3брест
+3бризк
+3британ
+3бруд
+3в4бив
+3в4веден
+3в4дал
+3в4довз
+3в4довол
+3в4живан
+3в4лад
+3в4ласн
+3в4лашт
+3в4лов
+3в4певн
+3в4поряд
+3в4разлив
+3в4рожай
+3в4сюд
+3в4тіл
+3глад
+3глиб
+3глин
+3глоб
+3глуз
+3глуш
+3гляд
+3глян
+3гнан
+3гнил
+3гноз
+3гнучк
+3грав
+3град
+3грай
+3грам
+3гран
+3грати
+3граф
+3граш
+3граю
+3грає
+3грес
+3грець
+3гроб
+3грож
+3гроз
+3громад
+3груван
+3грунт
+3груп
+3грів
+3гріт
+3гріш
+3г4ідро
+3д4ан
+3д4бав
+3д4бал
+3д4бан
+3д4бат
+3д4бає
+3двиг
+3двою
+3двоє
+3двій
+3двір
+3двічі
+3драж
+3дром
+3друж
+3друк
+3дряп
+3дріб
+3дріма
+3жвав
+3жміть
+3жріть
+3з4бага
+3з4баланс
+3з4був
+3з4бут
+3зваж
+3зван
+3звед
+3звел
+3звест
+3звись
+3звич
+3звищ
+3зворуш
+3звук
+3звуч
+3звіт
+3з4год
+3з4дат
+3з4довж
+3з4доров
+3з4дійсн
+3змін
+3зйом
+3зміш
+3знав
+3знай
+3знак
+3знал
+3знан
+3знат
+3знаход
+3знач
+3знаю
+3знає
+3зниж
+3знім
+3зрозум
+3зрюв
+3зрів
+3зріл
+3зрін
+3з4чеп
+3й4ма
+3й4менн
+3й4мищ
+3й4мовірн
+3й4му.
+3й4муть
+3й4міть
+3й4шов
+3м4нож
+3м4ріть
+3м4щен
+3п4сов
+3п4сон
+3п4сув
+3р4вав
+3р4вати
+3р4віть
+3с4кид
+3с4кок
+3с4коп
+3с4кор
+3с4короч
+3с4коч
+3с4кіль
+3с4кіпл
+3с4пад
+3с4пект
+3с4перм
+3с4пин
+3с4повід
+3с4пожив
+3с4постер
+3с4пі
+3с4піть
+3с4піш
+3с4табіл
+3с4тав
+3с4тад
+3с4таз
+3с4тайн
+3с4тал
+3с4тан
+3с4тар
+3с4тара
+3с4тат
+3с4тач
+3с4тає
+3с4теп
+3с4тереж
+3с4теріг
+3с4тиг
+3с4тиж
+3с4тисл
+3с4титу
+3с4товб
+3с4той
+3с4торон
+3с4торін
+3с4тосо
+3с4тосу
+3с4тою
+3с4тоян
+3с4туп
+3с4тяг
+3с4тіб
+3с4тій
+3с4тіль
+3с4тір
+3с4фер
+3с4хил
+3с4хов
+3с4хід
+3т4кан
+3х4то
+3ш4код
+3ш4кол
+3ш4кідл
+3ш4кіл
+3ш4кір
+3ш4таб
+3ш4туч
+3ґрунт
+3а4вторит
+3а4гент
+3а4грес
+3а4декват
+3а4дитив
+3а4зарт
+3а4ктив
+3а4ктуал
+3а4курат
+3а4куст
+3а4кцепт
+3а4кциз
+3а4лергі
+3а4матор
+3а4наліз
+3а4натом
+3а4парат
+3а4пеляц
+3а4постол
+3а4птеч
+3а4ргумен
+3а4ромат
+3а4соці
+3а4спект
+3а4тлет
+3а4халі
+3е4колог
+3е4коном
+3е4легант
+3е4лектр
+3е4лемент
+3е4моці
+3е4мігр
+3е4нерг
+3е4стакад
+3е4стет
+3е4тап
+3о4береж
+3о4бира
+3о4борон
+3о4бід
+3о4біц
+3о4даль
+3о4дяг
+3о4збро
+3о4крем
+3о4перат
+3о4плат
+3о4птим
+3о4пуст
+3о4пуше
+3о4пуще
+3о4рдинац
+3о4ренд
+3о4соб
+3о4сяжн
+3о4холо
+3о4хорон
+3о4хоч
+3о4чисн
+3о4чищ
+3у4ваг
+3у4важ
+3у4гав
+3у4згод
+3у4клад
+3у4компл
+3у4крупн
+3у4люблен
+3у4мит
+3у4міл
+3у4перед
+3у4разлив
+3у4рбан
+3у4рочист
+3у4ряд
+3у4рядов
+3у4спіш
+3у4станов
+3у4стпіш
+3у4сувати
+3у4твор
+3у4тробн
+3я4дерн
+3я4зик
+3я4кіс
+3я4рус
+3я4скрав
+3є4д3н
+3є4дин
+3є4писк
+3є4рей
+3і4зотоп
+3і4люстр
+3і4мовір
+3і4нтенс
+3і4нформ
+3і4ніціат
+3і4снув
+3ї4ждж
+3ї4зд
+3ї4ст
+3ї4хав
+3ї4хат
+.заї4к
+.заї4ц
+.заї4ч
+.наї4д
+аві4а
+авої4д
+ае4тил
+альбі5он
+ахої4д
+ауді4о
+ай4с3берг
+бактері4о
+ба4с3енер
+ба4с3антра
+.бе5зе.
+бей4сбол
+бе5кон
+бйор4нс
+бі4о3
+бо4г3дан
+бран4д
+брі4дж3порт
+без5і4мен
+бо4є3гол
+бо4є3гот
+бо4є3зап
+бо4є3здат
+бо4є3комп
+бо4є3пост
+бо4є3прип
+бори4с5п
+4в3антрац
+вер4х3н
+ви3й4д
+вина3й4д
+ви3й4т
+вина3й4т
+від7зна
+ві5д4ен
+ві5д4е4о
+ві5д4ом
+від5о4браж
+від5о4браз
+во4с5ко
+водо5с4ток
+водо5з4бір
+воль4т3метр
+воль4т3ампер
+ге2ть3ман
+ге4о
+го4с4п5роз
+гі4д5ро5мет
+4д7зем
+дер4ж5а4том
+дер4ж5а4дм
+дер4ж5бюдж
+дер4ж5вид
+дер4ж5дум
+дер4ж5замов
+дер4ж5ком
+дер4ж5нафт
+дер4ж5реєс
+дер4ж3без
+дер4ж3резерв
+дер4ж5стр
+дер4ж5служ
+двох4а5том
+джен4тль
+дисбаланс
+ди4с3гарм
+ди4с3квал
+ди4с3комф
+ди4с3конт
+ди4с3кред
+ди4с3крет
+ди4с3крец
+ди4с3крим
+ди4с3кусі
+ди4с3куту
+ди4с3лок
+ди4с3парит
+ди4с3перс
+ди4с3петч
+ди4с3пле
+ди4с3плей
+ди4с3пози
+ди4с3проп
+ди4с3пут
+ди4с3тил
+ди4с3триб
+ди4с3троф
+ди4с3функц
+ді3й4т
+ді3й4д
+д4ні3п4р
+.дої4в
+.дої4л
+.дої5ль
+дої4д
+дої4м
+дої4х
+дої4ж
+дої4ст
+до3з4вол
+до3з4віл
+дорого5в4каз
+еу4стр
+ео4сві
+енерго3з4береж
+енерго3з4беріг
+ек2с1к
+ек2с1п
+ек2с1т
+ек2с1ц
+єв4р3атом
+єпі4с5коп
+єпи4с5коп
+за4п3част
+заї4д
+заї4ж
+заї4з
+заї4л
+заї4м
+заї4х
+зе4кономити
+зна3й4д
+зна3й4т
+зо4ка
+зо4ке
+зо4ки
+зо4ку
+зо4кі
+игої4д
+ий4ти
+іе4тил
+і4л3е4тил
+ій4ти
+інфор4м3аген
+йо4сві
+каза4х3стан
+квої4д
+корої4д
+квар4т3плат
+киї4венер
+кон4трре
+кон4тр3арг
+жко4м5а4том
+кому4ненерг
+мі4н5е4ко
+мі4н5е4нер
+мо4к5рий
+на3б4лиз
+на3в4ряд
+на3в4ча
+на3з4в
+на4д7з4в
+наї4вс
+наї4вш
+наї4ж
+наї4з
+наї4л
+наї4м
+наї4с
+наї4х
+на4й3а
+на4й3е
+на4й3обереж
+на4й7о4бер
+на4й7о4гид
+на4й7о4гол
+на4й7о4гряд
+на4й7о4пук
+на4й7о4хай
+на4й3масл
+на4й3спри
+на4й3якіс
+на3в4чен
+на3в4чіть
+не3в4том
+не3д4бан
+на3д4бан
+не3з4вич
+не3з4важ
+нео4пал
+недої4
+неї4ст
+на5п4лив
+ні4т5рат
+оної4д
+оо4пал
+ео4пал
+обі3д4ран
+обі3й4д
+обі3й4т
+об5у4мов
+онаї4д
+оо4сві
+оо4к
+оу4стр
+оа4том
+об4лдер4ж
+об4л3а4дмін
+переї4д
+переї4ж
+переї4з
+переї4л
+переї4с
+переї4х
+пере5п4лив
+пере3й4д
+пре4й4с
+пере3й4т
+перег4ній
+перед5о4бід
+пере3в4том
+пере4д5см
+перед5у4мов
+під5о4дин
+пів5о4с4тр
+пі5в4ень
+по3б4лизу
+по3в4тор
+поч4не
+поч4ни
+поч4ну
+поя4в
+по3в4чен
+по3в4чіть
+по3д4роб
+по3д4раз
+по3д4во
+по5ж4ніть
+по5з4бав
+.пої4
+пої4д
+прої4
+пої4зд
+по4с4т5радян
+по4с4т5кому
+по4с4т3декр
+по4с4т3контра
+по4с4т3менопауз
+по4с4тприват
+по4с4т3раді
+по4с4т5соці
+пос4т3кап
+пос4т3ком
+пос4т3нат
+пос4т3проц
+пос4т3соц
+пос4т3фікс
+при3й4т
+про3с4тирад
+про4ф3с
+полі4т5екон
+пор4т3н
+пор4т3рет
+пор4т3фел
+при3й4д
+при4нцип
+про4ект3н
+про3б4лем
+про4м3май
+пр4о5плат
+раді4о
+рай3в4но
+ро4з5д4во
+ро4з5мінний
+роз5у4чен
+роз5і4мен
+роз5вант
+роз5вин
+роз5вит
+ро4з5діл
+ро4з5гор
+ро4з5вер
+ро4з5чеп
+руко5с4тиск
+ро5з4ум
+ро4з3гром
+ро4з3лив
+рмої4д
+сан4к4т3
+сеї4д
+серцеї4д
+спе4ц3кур
+спе4ц3мон
+спе4цпр
+спе4ц3с
+спор4т3вир
+спор4т3зал
+спор4т3ком
+спор4т3клуб
+спор4т3май
+спор4т4с3ме
+сор4тн
+3с4промож
+сь4квуг
+стат5упр
+тор4г3пред
+тран4с3
+тур4к3мен
+цук3ро
+у4к4р
+укр3а4вт
+укр3а4гр
+укр3е4кс
+укр3і4н4банк
+убої4д
+чорно3б4рив
+цен4т4р3енерг
+ясої4д
+ви3у4ч
+за3у4ч
+на3у4ч
+недо3у4ч
+не3у4ч
+під3у4ч
+пед3у4чи
+пере3у4ч
+само3у4ч
+вия4в
+зая4в
+ная4в
+уя4в
+во4євод
+во4єнач
+сво4єчас
+сво4єкорис
+сво4єрід
+хво4є3г4риз
+гелі4о
+ді4о
+еті4о
+мі4о
+і4он
+полі4о
+соці4о
+фізі4о
+хімі4о
+гоме4о
+ді4алог
+ді4оген
+дея4к
+оо4динок
+ао4пік
+ао4ха
+ео4ха
+зо6о
+ка5нал
+оі4зол
+міжу4соб
+мете4о
+абия4к
+нія4к
+вия4сн
+най3я4сн
+нея4сн
+поя4сн
+проя4сн
+ро5з4ора.
+ро5з4о5рам
+ро5з4орах
+ро5з4ори
+ро5з4оро
+ро5з4ору
+ро5з4оря
+ро5з4орю
+ро5з4орі
+ро6з5о4ри.
+розо4ра
+розо4ре
+розо4реш
+розо4рн
+напоу4м
+неа4би
+ео4цін
+оо4цін
+доу4к
+доу4м
+ео4бур
+ео4голош
+ео4зор
+бальне4о
+не4оліт
+не4омальт
+не4оклас
+не4окомун
+не4оландш
+не4олог
+не4олібер
+не4онац
+не4офіт
+нею4н
+нея4к
+нея4рок
+но4к3а4ут
+пі5в4оні
+піво4с
+пале4о
+па4н3о4тець
+.пе4ом.
+д3у4сім
+п4о5бере
+ао4хот
+ое4ко
+ео4хот
+ео4щад
+ао4щад
+оо4чищ
+поя4с
+те4одоліт
+те4олог
+те4ософ
+оо4біг
+оу4сун
+оу4ком
+пів3о4вал
+а3у4дар
+о3у4дар
+з3у4дар
+в3у4дар
+контр3у4дар
+о3о4кисл
+и3о4кисл
+ень7о4кисл
+е3о4кисл
+х3о4кисл
+и3і4стор
+о3і4стор
+і3і4стор
+а3і4стор
+я3і4стор
+е3і4стор
+наді4стор
+най3і4стор
+пів3і4стор
+перед3і4стор
+пост3і4стор
+ар4т3афіш
+ар4т3взвод
+ар4т3десант
+ар4т3кафе
+ар4т3майс
+ар4т3медіа
+ар4т3мейс
+ар4т3мін
+ар4т3о4бстр
+ар4т3о4дин
+ар4т3о4збр
+ар4т3під
+ар4т3рин
+ар4т3у4стан
+ар4т3факт
+ар4т3хім
+ар4т3центр
+наді4стот
+найі4стот
+еі4стот
+оі4стот
+ау4т3екол
+оо4чист
+з3а4кт
+оа4кт
+еа4кт
+гіпер3а4кт
+найа4кт
+піва4кт
+ао4браз
+ео4браз
+оо4браз
+граф3о4браз
+най3о4браз
+супер3о4браз
+ар4т3мейст
+баге4р3мейст
+бале4т3мейст
+бран4д3мейст
+ва4ль4д3мейст
+ве4ль4т3мейст
+го4ф3мейст
+гро4с3мейст
+декре4т3мейст
+до4к3мейст
+капе4ль3мейст
+кварти4р3мейст
+конце4р4т3мейст
+кра4н3мейст
+полі4ц3мейст
+по4ш4т3мейст
+фо4р4с4т3мейст
+хо4р3мейст
+шапі4т3мейст
+шта4л3мейст
+єге4р3мейст
+иа4варі
+яа4варі
+оа4варі
+еа4варі
+беза4варі
+між3а4варі
+над3а4варі
+пост3а4варі
+напів3а4варі
+перед3а4варі
+супер3а4варі
+аа4дрес
+еа4дрес
+оа4дрес
+іа4дрес
+без3а4дрес
+ае4фект
+ее4фект
+ое4фект
+най3е4фект
+супер3е4фект
+ое4місі
+ие4місі
+яе4місі
+ее4місі
+безе4місі
+гіпер3е4місі
+еу4бог
+й3у4бог
+ий4ня
+зай4ня
+здій4ня
+най4ня
+обій4ня
+перей4ня
+підій4ня
+прий4м
+пій4м
+дій4ма
+вий4м
+най4ма
+зай4м
+д4о3й4м
+обой4м
+прой4м
+обій4м
+перей4м
+безу4гл
+безу4пин
+бло4к3пост
+.блі4ц3ана
+.блі4ц3криг
+.блі4ц3опит
+.блі4ц3торг
+.блі4ц3тур
+.блі4ц3і4спит
+о3а4наліз
+бак3а4наліз
+ц3а4наліз
+ген3а4наліз
+з3а4наліз
+м3а4наліз
+нт3а4наліз
+між3а4наліз
+полі3а4наліз
+ре3а4наліз
+оу4год
+ау4год
+еу4год
+пів3у4год
+роз3у4год
+гос4п3у4год
+ео4пис
+оо4пис
+ао4пис
+бо4р4т3мех
+бо4р4т3о4пер
+бо4р4т3про
+бо4р4т3рад
+бо4р4т3і4нж
+оа4каці
+оу4с
+оо4держ
+оа4на
+біблі4о
+.на3в4ч
+.ви3в4ч
+.до3в4ч
+.за3в4ч
+.по3в4ч
+.при3в4ч
+ана3в4ч
+ена3в4ч
+мона3в4ч
+жона3в4ч
+іона3в4ч
+ови3в4ч
+еви3в4ч
+едо3в4ч
+оза3в4ч
+по3в4ча
+.ом4рі
+е3м4рій
+.ви3м4р
+.віді3м4р
+.зав3м4р
+.за3м4р
+.зі3м4р
+.на3м4р
+.пере3м4р
+.по3м4р
+.при3м4р
+.роз3м4р
+.ум4ри
+.ум4рі
+.ум4ру
+.ум4ре
+во4станнє
+най3о4станн
+перед3о4станн
+ие4стет
+ое4стет
+ее4стет
+й3е4стет
+пан3е4стет
+пар3е4стет
+оо4ктан
+іо4ктан
+оо4плачув
+ео4плачув
+перед3о4пла
+виу4ди
+о3в4каз
+е3в4каз} \ No newline at end of file
diff --git a/tex/context/patterns/lang-uk.rme b/tex/context/patterns/lang-uk.rme
new file mode 100644
index 000000000..9d6e5ee88
--- /dev/null
+++ b/tex/context/patterns/lang-uk.rme
@@ -0,0 +1,70 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: TODO:WRITEME (yyyy-mm-dd)
+% Author: Maksym Polyakov <polyama at auburn.edu>, <mpoliak at i.com.ua>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% Ukrainian hyphenation patterns in LCY (cp866nav) encoding.
+% Copyright 1998-2001 Maksym Polyakov.
+% Released 2001/05/10.
+% This file can be redistributed and/or modified
+% under the terms of the LaTeX Project Public License (lppl).
+% Please, send bug reports via e-mail:
+% polyama@auburn.edu
+% mpoliak@i.com.ua \ No newline at end of file
diff --git a/tex/context/patterns/lang-us.hyp b/tex/context/patterns/lang-us.hyp
new file mode 100644
index 000000000..0bcdd1210
--- /dev/null
+++ b/tex/context/patterns/lang-us.hyp
@@ -0,0 +1,21 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-us.rme
+
+% used: a b c d e f g h i j l m n o p r s t u y z
+
+\hyphenation{
+as-so-ciate
+as-so-ciates
+dec-li-na-tion
+oblig-a-tory
+phil-an-thropic
+present
+presents
+project
+projects
+reci-procity
+re-cog-ni-zance
+ref-or-ma-tion
+ret-ri-bu-tion
+ta-ble} \ No newline at end of file
diff --git a/tex/context/patterns/lang-us.pat b/tex/context/patterns/lang-us.pat
new file mode 100644
index 000000000..cbd867385
--- /dev/null
+++ b/tex/context/patterns/lang-us.pat
@@ -0,0 +1,4945 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-us.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u v w x y z
+
+\patterns{
+.ach4
+.ad4der
+.af1t
+.al3t
+.am5at
+.an5c
+.ang4
+.ani5m
+.ant4
+.an3te
+.anti5s
+.ar5s
+.ar4tie
+.ar4ty
+.as3c
+.as1p
+.as1s
+.aster5
+.atom5
+.au1d
+.av4i
+.awn4
+.ba4g
+.ba5na
+.bas4e
+.ber4
+.be5ra
+.be3sm
+.be5sto
+.bri2
+.but4ti
+.cam4pe
+.can5c
+.capa5b
+.car5ol
+.ca4t
+.ce4la
+.ch4
+.chill5i
+.ci2
+.cit5r
+.co3e
+.co4r
+.cor5ner
+.de4moi
+.de3o
+.de3ra
+.de3ri
+.des4c
+.dictio5
+.do4t
+.du4c
+.dumb5
+.earth5
+.eas3i
+.eb4
+.eer4
+.eg2
+.el5d
+.el3em
+.enam3
+.en3g
+.en3s
+.eq5ui5t
+.er4ri
+.es3
+.eu3
+.eye5
+.fes3
+.for5mer
+.ga2
+.ge2
+.gen3t4
+.ge5og
+.gi5a
+.gi4b
+.go4r
+.hand5i
+.han5k
+.he2
+.hero5i
+.hes3
+.het3
+.hi3b
+.hi3er
+.hon5ey
+.hon3o
+.hov5
+.id4l
+.idol3
+.im3m
+.im5pin
+.in1
+.in3ci
+.ine2
+.in2k
+.in3s
+.ir5r
+.is4i
+.ju3r
+.la4cy
+.la4m
+.lat5er
+.lath5
+.le2
+.leg5e
+.len4
+.lep5
+.lev1
+.li4g
+.lig5a
+.li2n
+.li3o
+.li4t
+.mag5a5
+.mal5o
+.man5a
+.mar5ti
+.me2
+.mer3c
+.me5ter
+.mis1
+.mist5i
+.mon3e
+.mo3ro
+.mu5ta
+.muta5b
+.ni4c
+.od2
+.odd5
+.of5te
+.or5ato
+.or3c
+.or1d
+.or3t
+.os3
+.os4tl
+.oth3
+.out3
+.ped5al
+.pe5te
+.pe5tit
+.pi4e
+.pio5n
+.pi2t
+.pre3m
+.ra4c
+.ran4t
+.ratio5na
+.ree2
+.re5mit
+.res2
+.re5stat
+.ri4g
+.rit5u
+.ro4q
+.ros5t
+.row5d
+.ru4d
+.sci3e
+.self5
+.sell5
+.se2n
+.se5rie
+.sh2
+.si2
+.sing4
+.st4
+.sta5bl
+.sy2
+.ta4
+.te4
+.ten5an
+.th2
+.ti2
+.til4
+.tim5o5
+.ting4
+.tin5k
+.ton4a
+.to4p
+.top5i
+.tou5s
+.trib5ut
+.un1a
+.un3ce
+.under5
+.un1e
+.un5k
+.un5o
+.un3u
+.up3
+.ure3
+.us5a
+.ven4de
+.ve5ra
+.wil5i
+.ye4
+4ab.
+a5bal
+a5ban
+abe2
+ab5erd
+abi5a
+ab5it5ab
+ab5lat
+ab5o5liz
+4abr
+ab5rog
+ab3ul
+a4car
+ac5ard
+ac5aro
+a5ceou
+ac1er
+a5chet
+4a2ci
+a3cie
+ac1in
+a3cio
+ac5rob
+act5if
+ac3ul
+ac4um
+a2d
+ad4din
+ad5er.
+2adi
+a3dia
+ad3ica
+adi4er
+a3dio
+a3dit
+a5diu
+ad4le
+ad3ow
+ad5ran
+ad4su
+4adu
+a3duc
+ad5um
+ae4r
+aeri4e
+a2f
+aff4
+a4gab
+aga4n
+ag5ell
+age4o
+4ageu
+ag1i
+4ag4l
+ag1n
+a2go
+3agog
+ag3oni
+a5guer
+ag5ul
+a4gy
+a3ha
+a3he
+ah4l
+a3ho
+ai2
+a5ia
+a3ic.
+ai5ly
+a4i4n
+ain5in
+ain5o
+ait5en
+a1j
+ak1en
+al5ab
+al3ad
+a4lar
+4aldi
+2ale
+al3end
+a4lenti
+a5le5o
+al1i
+al4ia.
+ali4e
+al5lev
+4allic
+4alm
+a5log.
+a4ly.
+4alys
+5a5lyst
+5alyt
+3alyz
+4ama
+am5ab
+am3ag
+ama5ra
+am5asc
+a4matis
+a4m5ato
+am5era
+am3ic
+am5if
+am5ily
+am1in
+ami4no
+a2mo
+a5mon
+amor5i
+amp5en
+a2n
+an3age
+3analy
+a3nar
+an3arc
+anar4i
+a3nati
+4and
+ande4s
+an3dis
+an1dl
+an4dow
+a5nee
+a3nen
+an5est.
+a3neu
+2ang
+ang5ie
+an1gl
+a4n1ic
+a3nies
+an3i3f
+an4ime
+a5nimi
+a5nine
+an3io
+a3nip
+an3ish
+an3it
+a3niu
+an4kli
+5anniz
+ano4
+an5ot
+anoth5
+an2sa
+an4sco
+an4sn
+an2sp
+ans3po
+an4st
+an4sur
+antal4
+an4tie
+4anto
+an2tr
+an4tw
+an3ua
+an3ul
+a5nur
+4ao
+apar4
+ap5at
+ap5ero
+a3pher
+4aphi
+a4pilla
+ap5illar
+ap3in
+ap3ita
+a3pitu
+a2pl
+apoc5
+ap5ola
+apor5i
+apos3t
+aps5es
+a3pu
+aque5
+2a2r
+ar3act
+a5rade
+ar5adis
+ar3al
+a5ramete
+aran4g
+ara3p
+ar4at
+a5ratio
+ar5ativ
+a5rau
+ar5av4
+araw4
+arbal4
+ar4chan
+ar5dine
+ar4dr
+ar5eas
+a3ree
+ar3ent
+a5ress
+ar4fi
+ar4fl
+ar1i
+ar5ial
+ar3ian
+a3riet
+ar4im
+ar5inat
+ar3io
+ar2iz
+ar2mi
+ar5o5d
+a5roni
+a3roo
+ar2p
+ar3q
+arre4
+ar4sa
+ar2sh
+4as.
+as4ab
+as3ant
+ashi4
+a5sia.
+a3sib
+a3sic
+5a5si4t
+ask3i
+as4l
+a4soc
+as5ph
+as4sh
+as3ten
+as1tr
+asur5a
+a2ta
+at3abl
+at5ac
+at3alo
+at5ap
+ate5c
+at5ech
+at3ego
+at3en.
+at3era
+ater5n
+a5terna
+at3est
+at5ev
+4ath
+ath5em
+a5then
+at4ho
+ath5om
+4ati.
+a5tia
+at5i5b
+at1ic
+at3if
+ation5ar
+at3itu
+a4tog
+a2tom
+at5omiz
+a4top
+a4tos
+a1tr
+at5rop
+at4sk
+at4tag
+at5te
+at4th
+a2tu
+at5ua
+at5ue
+at3ul
+at3ura
+a2ty
+au4b
+augh3
+au3gu
+au4l2
+aun5d
+au3r
+au5sib
+aut5en
+au1th
+a2va
+av3ag
+a5van
+ave4no
+av3era
+av5ern
+av5ery
+av1i
+avi4er
+av3ig
+av5oc
+a1vor
+3away
+aw3i
+aw4ly
+aws4
+ax4ic
+ax4id
+ay5al
+aye4
+ays4
+azi4er
+azz5i
+5ba.
+bad5ger
+ba4ge
+bal1a
+ban5dag
+ban4e
+ban3i
+barbi5
+bari4a
+bas4si
+1bat
+ba4z
+2b1b
+b2be
+b3ber
+bbi4na
+4b1d
+4be.
+beak4
+beat3
+4be2d
+be3da
+be3de
+be3di
+be3gi
+be5gu
+1bel
+be1li
+be3lo
+4be5m
+be5nig
+be5nu
+4bes4
+be3sp
+be5str
+3bet
+bet5iz
+be5tr
+be3tw
+be3w
+be5yo
+2bf
+4b3h
+bi2b
+bi4d
+3bie
+bi5en
+bi4er
+2b3if
+1bil
+bi3liz
+bina5r4
+bin4d
+bi5net
+bi3ogr
+bi5ou
+bi2t
+3bi3tio
+bi3tr
+3bit5ua
+b5itz
+b1j
+bk4
+b2l2
+blath5
+b4le.
+blen4
+5blesp
+b3lis
+b4lo
+blun4t
+4b1m
+4b3n
+bne5g
+3bod
+bod3i
+bo4e
+bol3ic
+bom4bi
+bon4a
+bon5at
+3boo
+5bor.
+4b1ora
+bor5d
+5bore
+5bori
+5bos4
+b5ota
+both5
+bo4to
+bound3
+4bp
+4brit
+broth3
+2b5s2
+bsor4
+2bt
+bt4l
+b4to
+b3tr
+buf4fer
+bu4ga
+bu3li
+bumi4
+bu4n
+bunt4i
+bu3re
+bus5ie
+buss4e
+5bust
+4buta
+3butio
+b5uto
+b1v
+4b5w
+5by.
+bys4
+1ca
+cab3in
+ca1bl
+cach4
+ca5den
+4cag4
+2c5ah
+ca3lat
+cal4la
+call5in
+4calo
+can5d
+can4e
+can4ic
+can5is
+can3iz
+can4ty
+cany4
+ca5per
+car5om
+cast5er
+cas5tig
+4casy
+ca4th
+4cativ
+cav5al
+c3c
+ccha5
+cci4a
+ccompa5
+ccon4
+ccou3t
+2ce.
+4ced.
+4ceden
+3cei
+5cel.
+3cell
+1cen
+3cenc
+2cen4e
+4ceni
+3cent
+3cep
+ce5ram
+4cesa
+3cessi
+ces5si5b
+ces5t
+cet4
+c5e4ta
+cew4
+2ch
+4ch.
+4ch3ab
+5chanic
+ch5a5nis
+che2
+cheap3
+4ched
+che5lo
+3chemi
+ch5ene
+ch3er.
+ch3ers
+4ch1in
+5chine.
+ch5iness
+5chini
+5chio
+3chit
+chi2z
+3cho2
+ch4ti
+1ci
+3cia
+ci2a5b
+cia5r
+ci5c
+4cier
+5cific.
+4cii
+ci4la
+3cili
+2cim
+2cin
+c4ina
+3cinat
+cin3em
+c1ing
+c5ing.
+5cino
+cion4
+4cipe
+ci3ph
+4cipic
+4cista
+4cisti
+2c1it
+cit3iz
+5ciz
+ck1
+ck3i
+1c4l4
+4clar
+c5laratio
+5clare
+cle4m
+4clic
+clim4
+cly4
+c5n
+1co
+co5ag
+coe2
+2cog
+co4gr
+coi4
+co3inc
+col5i
+5colo
+col3or
+com5er
+con4a
+c4one
+con3g
+con5t
+co3pa
+cop3ic
+co4pl
+4corb
+coro3n
+cos4e
+cov1
+cove4
+cow5a
+coz5e
+co5zi
+c1q
+cras5t
+5crat.
+5cratic
+cre3at
+5cred
+4c3reta
+cre4v
+cri2
+cri5f
+c4rin
+cris4
+5criti
+cro4pl
+crop5o
+cros4e
+cru4d
+4c3s2
+2c1t
+cta4b
+ct5ang
+c5tant
+c2te
+c3ter
+c4ticu
+ctim3i
+ctu4r
+c4tw
+cud5
+c4uf
+c4ui
+cu5ity
+5culi
+cul4tis
+3cultu
+cu2ma
+c3ume
+cu4mi
+3cun
+cu3pi
+cu5py
+cur5a4b
+cu5ria
+1cus
+cuss4i
+3c4ut
+cu4tie
+4c5utiv
+4cutr
+1cy
+cze4
+1d2a
+5da.
+2d3a4b
+dach4
+4daf
+2dag
+da2m2
+dan3g
+dard5
+dark5
+4dary
+3dat
+4dativ
+4dato
+5dav4
+dav5e
+5day
+d1b
+d5c
+d1d4
+2de.
+deaf5
+deb5it
+de4bon
+decan4
+de4cil
+de5com
+2d1ed
+4dee.
+de5if
+deli4e
+del5i5q
+de5lo
+d4em
+5dem.
+3demic
+dem5ic.
+de5mil
+de4mons
+demor5
+1den
+de4nar
+de3no
+denti5f
+de3nu
+de1p
+de3pa
+depi4
+de2pu
+d3eq
+d4erh
+5derm
+dern5iz
+der5s
+des2
+d2es.
+de1sc
+de2s5o
+des3ti
+de3str
+de4su
+de1t
+de2to
+de1v
+dev3il
+4dey
+4d1f
+d4ga
+d3ge4t
+dg1i
+d2gy
+d1h2
+5di.
+1d4i3a
+dia5b
+di4cam
+d4ice
+3dict
+3did
+5di3en
+d1if
+di3ge
+di4lato
+d1in
+1dina
+3dine.
+5dini
+di5niz
+1dio
+dio5g
+di4pl
+dir2
+di1re
+dirt5i
+dis1
+5disi
+d4is3t
+d2iti
+1di1v
+d1j
+d5k2
+4d5la
+3dle.
+3dled
+3dles.
+4dless
+2d3lo
+4d5lu
+2dly
+d1m
+4d1n4
+1do
+3do.
+do5de
+5doe
+2d5of
+d4og
+do4la
+doli4
+do5lor
+dom5iz
+do3nat
+doni4
+doo3d
+dop4p
+d4or
+3dos
+4d5out
+do4v
+3dox
+d1p
+1dr
+drag5on
+4drai
+dre4
+drea5r
+5dren
+dri4b
+dril4
+dro4p
+4drow
+5drupli
+4dry
+2d1s2
+ds4p
+d4sw
+d4sy
+d2th
+1du
+d1u1a
+du2c
+d1uca
+duc5er
+4duct.
+4ducts
+du5el
+du4g
+d3ule
+dum4be
+du4n
+4dup
+du4pe
+d1v
+d1w
+d2y
+5dyn
+dy4se
+dys5p
+e1a4b
+e3act
+ead1
+ead5ie
+ea4ge
+ea5ger
+ea4l
+eal5er
+eal3ou
+eam3er
+e5and
+ear3a
+ear4c
+ear5es
+ear4ic
+ear4il
+ear5k
+ear2t
+eart3e
+ea5sp
+e3ass
+east3
+ea2t
+eat5en
+eath3i
+e5atif
+e4a3tu
+ea2v
+eav3en
+eav5i
+eav5o
+2e1b
+e4bel.
+e4bels
+e4ben
+e4bit
+e3br
+e4cad
+ecan5c
+ecca5
+e1ce
+ec5essa
+ec2i
+e4cib
+ec5ificat
+ec5ifie
+ec5ify
+ec3im
+eci4t
+e5cite
+e4clam
+e4clus
+e2col
+e4comm
+e4compe
+e4conc
+e2cor
+ec3ora
+eco5ro
+e1cr
+e4crem
+ec4tan
+ec4te
+e1cu
+e4cul
+ec3ula
+2e2da
+4ed3d
+e4d1er
+ede4s
+4edi
+e3dia
+ed3ib
+ed3ica
+ed3im
+ed1it
+edi5z
+4edo
+e4dol
+edon2
+e4dri
+e4dul
+ed5ulo
+ee2c
+eed3i
+ee2f
+eel3i
+ee4ly
+ee2m
+ee4na
+ee4p1
+ee2s4
+eest4
+ee4ty
+e5ex
+e1f
+e4f3ere
+1eff
+e4fic
+5efici
+efil4
+e3fine
+ef5i5nite
+3efit
+efor5es
+e4fuse.
+4egal
+eger4
+eg5ib
+eg4ic
+eg5ing
+e5git5
+eg5n
+e4go.
+e4gos
+eg1ul
+e5gur
+5egy
+e1h4
+eher4
+ei2
+e5ic
+ei5d
+eig2
+ei5gl
+e3imb
+e3inf
+e1ing
+e5inst
+eir4d
+eit3e
+ei3th
+e5ity
+e1j
+e4jud
+ej5udi
+eki4n
+ek4la
+e1la
+e4la.
+e4lac
+elan4d
+el5ativ
+e4law
+elaxa4
+e3lea
+el5ebra
+5elec
+e4led
+el3ega
+e5len
+e4l1er
+e1les
+el2f
+el2i
+e3libe
+e4l5ic.
+el3ica
+e3lier
+el5igib
+e5lim
+e4l3ing
+e3lio
+e2lis
+el5ish
+e3liv3
+4ella
+el4lab
+ello4
+e5loc
+el5og
+el3op.
+el2sh
+el4ta
+e5lud
+el5ug
+e4mac
+e4mag
+e5man
+em5ana
+em5b
+e1me
+e2mel
+e4met
+em3ica
+emi4e
+em5igra
+em1in2
+em5ine
+em3i3ni
+e4mis
+em5ish
+e5miss
+em3iz
+5emniz
+emo4g
+emoni5o
+em3pi
+e4mul
+em5ula
+emu3n
+e3my
+en5amo
+e4nant
+ench4er
+en3dic
+e5nea
+e5nee
+en3em
+en5ero
+en5esi
+en5est
+en3etr
+e3new
+en5ics
+e5nie
+e5nil
+e3nio
+en3ish
+en3it
+e5niu
+5eniz
+4enn
+4eno
+eno4g
+e4nos
+en3ov
+en4sw
+ent5age
+4enthes
+en3ua
+en5uf
+e3ny.
+4en3z
+e5of
+eo2g
+e4oi4
+e3ol
+eop3ar
+e1or
+eo3re
+eo5rol
+eos4
+e4ot
+eo4to
+e5out
+e5ow
+e2pa
+e3pai
+ep5anc
+e5pel
+e3pent
+ep5etitio
+ephe4
+e4pli
+e1po
+e4prec
+ep5reca
+e4pred
+ep3reh
+e3pro
+e4prob
+ep4sh
+ep5ti5b
+e4put
+ep5uta
+e1q
+equi3l
+e4q3ui3s
+er1a
+era4b
+4erand
+er3ar
+4erati.
+2erb
+er4bl
+er3ch
+er4che
+2ere.
+e3real
+ere5co
+ere3in
+er5el.
+er3emo
+er5ena
+er5ence
+4erene
+er3ent
+ere4q
+er5ess
+er3est
+eret4
+er1h
+er1i
+e1ria4
+5erick
+e3rien
+eri4er
+er3ine
+e1rio
+4erit
+er4iu
+eri4v
+e4riva
+er3m4
+er4nis
+4ernit
+5erniz
+er3no
+2ero
+er5ob
+e5roc
+ero4r
+er1ou
+er1s
+er3set
+ert3er
+4ertl
+er3tw
+4eru
+eru4t
+5erwau
+e1s4a
+e4sage.
+e4sages
+es2c
+e2sca
+es5can
+e3scr
+es5cu
+e1s2e
+e2sec
+es5ecr
+es5enc
+e4sert.
+e4serts
+e4serva
+4esh
+e3sha
+esh5en
+e1si
+e2sic
+e2sid
+es5iden
+es5igna
+e2s5im
+es4i4n
+esis4te
+esi4u
+e5skin
+es4mi
+e2sol
+es3olu
+e2son
+es5ona
+e1sp
+es3per
+es5pira
+es4pre
+2ess
+es4si4b
+estan4
+es3tig
+es5tim
+4es2to
+e3ston
+2estr
+e5stro
+estruc5
+e2sur
+es5urr
+es4w
+eta4b
+eten4d
+e3teo
+ethod3
+et1ic
+e5tide
+etin4
+eti4no
+e5tir
+e5titio
+et5itiv
+4etn
+et5ona
+e3tra
+e3tre
+et3ric
+et5rif
+et3rog
+et5ros
+et3ua
+et5ym
+et5z
+4eu
+e5un
+e3up
+eu3ro
+eus4
+eute4
+euti5l
+eu5tr
+eva2p5
+e2vas
+ev5ast
+e5vea
+ev3ell
+evel3o
+e5veng
+even4i
+ev1er
+e5verb
+e1vi
+ev3id
+evi4l
+e4vin
+evi4v
+e5voc
+e5vu
+e1wa
+e4wag
+e5wee
+e3wh
+ewil5
+ew3ing
+e3wit
+1exp
+5eyc
+5eye.
+eys4
+1fa
+fa3bl
+fab3r
+fa4ce
+4fag
+fain4
+fall5e
+4fa4ma
+fam5is
+5far
+far5th
+fa3ta
+fa3the
+4fato
+fault5
+4f5b
+4fd
+4fe.
+feas4
+feath3
+fe4b
+4feca
+5fect
+2fed
+fe3li
+fe4mo
+fen2d
+fend5e
+fer1
+5ferr
+fev4
+4f1f
+f4fes
+f4fie
+f5fin.
+f2f5is
+f4fly
+f2fy
+4fh
+1fi
+fi3a
+2f3ic.
+4f3ical
+f3ican
+4ficate
+f3icen
+fi3cer
+fic4i
+5ficia
+5ficie
+4fics
+fi3cu
+fi5del
+fight5
+fil5i
+fill5in
+4fily
+2fin
+5fina
+fin2d5
+fi2ne
+f1in3g
+fin4n
+fis4ti
+f4l2
+f5less
+flin4
+flo3re
+f2ly5
+4fm
+4fn
+1fo
+5fon
+fon4de
+fon4t
+fo2r
+fo5rat
+for5ay
+fore5t
+for4i
+fort5a
+fos5
+4f5p
+fra4t
+f5rea
+fres5c
+fri2
+fril4
+frol5
+2f3s
+2ft
+f4to
+f2ty
+3fu
+fu5el
+4fug
+fu4min
+fu5ne
+fu3ri
+fusi4
+fus4s
+4futa
+1fy
+1ga
+gaf4
+5gal.
+3gali
+ga3lo
+2gam
+ga5met
+g5amo
+gan5is
+ga3niz
+gani5za
+4gano
+gar5n4
+gass4
+gath3
+4gativ
+4gaz
+g3b
+gd4
+2ge.
+2ged
+geez4
+gel4in
+ge5lis
+ge5liz
+4gely
+1gen
+ge4nat
+ge5niz
+4geno
+4geny
+1geo
+ge3om
+g4ery
+5gesi
+geth5
+4geto
+ge4ty
+ge4v
+4g1g2
+g2ge
+g3ger
+gglu5
+ggo4
+gh3in
+gh5out
+gh4to
+5gi.
+1gi4a
+gia5r
+g1ic
+5gicia
+g4ico
+gien5
+5gies.
+gil4
+g3imen
+3g4in.
+gin5ge
+5g4ins
+5gio
+3gir
+gir4l
+g3isl
+gi4u
+5giv
+3giz
+gl2
+gla4
+glad5i
+5glas
+1gle
+gli4b
+g3lig
+3glo
+glo3r
+g1m
+g4my
+gn4a
+g4na.
+gnet4t
+g1ni
+g2nin
+g4nio
+g1no
+g4non
+1go
+3go.
+gob5
+5goe
+3g4o4g
+go3is
+gon2
+4g3o3na
+gondo5
+go3ni
+5goo
+go5riz
+gor5ou
+5gos.
+gov1
+g3p
+1gr
+4grada
+g4rai
+gran2
+5graph.
+g5rapher
+5graphic
+4graphy
+4gray
+gre4n
+4gress.
+4grit
+g4ro
+gruf4
+gs2
+g5ste
+gth3
+gu4a
+3guard
+2gue
+5gui5t
+3gun
+3gus
+4gu4t
+g3w
+1gy
+2g5y3n
+gy5ra
+h3ab4l
+hach4
+hae4m
+hae4t
+h5agu
+ha3la
+hala3m
+ha4m
+han4ci
+han4cy
+5hand.
+han4g
+hang5er
+hang5o
+h5a5niz
+han4k
+han4te
+hap3l
+hap5t
+ha3ran
+ha5ras
+har2d
+hard3e
+har4le
+harp5en
+har5ter
+has5s
+haun4
+5haz
+haz3a
+h1b
+1head
+3hear
+he4can
+h5ecat
+h4ed
+he5do5
+he3l4i
+hel4lis
+hel4ly
+h5elo
+hem4p
+he2n
+hena4
+hen5at
+heo5r
+hep5
+h4era
+hera3p
+her4ba
+here5a
+h3ern
+h5erou
+h3ery
+h1es
+he2s5p
+he4t
+het4ed
+heu4
+h1f
+h1h
+hi5an
+hi4co
+high5
+h4il2
+himer4
+h4ina
+hion4e
+hi4p
+hir4l
+hi3ro
+hir4p
+hir4r
+his3el
+his4s
+hith5er
+hi2v
+4hk
+4h1l4
+hlan4
+h2lo
+hlo3ri
+4h1m
+hmet4
+2h1n
+h5odiz
+h5ods
+ho4g
+hoge4
+hol5ar
+3hol4e
+ho4ma
+home3
+hon4a
+ho5ny
+3hood
+hoon4
+hor5at
+ho5ris
+hort3e
+ho5ru
+hos4e
+ho5sen
+hos1p
+1hous
+house3
+hov5el
+4h5p
+4hr4
+hree5
+hro5niz
+hro3po
+4h1s2
+h4sh
+h4tar
+ht1en
+ht5es
+h4ty
+hu4g
+hu4min
+hun5ke
+hun4t
+hus3t4
+hu4t
+h1w
+h4wart
+hy3pe
+hy3ph
+hy2s
+2i1a
+i2al
+iam4
+iam5ete
+i2an
+4ianc
+ian3i
+4ian4t
+ia5pe
+iass4
+i4ativ
+ia4tric
+i4atu
+ibe4
+ib3era
+ib5ert
+ib5ia
+ib3in
+ib5it.
+ib5ite
+i1bl
+ib3li
+i5bo
+i1br
+i2b5ri
+i5bun
+4icam
+5icap
+4icar
+i4car.
+i4cara
+icas5
+i4cay
+iccu4
+4iceo
+4ich
+2ici
+i5cid
+ic5ina
+i2cip
+ic3ipa
+i4cly
+i2c5oc
+4i1cr
+5icra
+i4cry
+ic4te
+ictu2
+ic4t3ua
+ic3ula
+ic4um
+ic5uo
+i3cur
+2id
+i4dai
+id5anc
+id5d
+ide3al
+ide4s
+i2di
+id5ian
+idi4ar
+i5die
+id3io
+idi5ou
+id1it
+id5iu
+i3dle
+i4dom
+id3ow
+i4dr
+i2du
+id5uo
+2ie4
+ied4e
+5ie5ga
+ield3
+ien5a4
+ien4e
+i5enn
+i3enti
+i1er.
+i3esc
+i1est
+i3et
+4if.
+if5ero
+iff5en
+if4fr
+4ific.
+i3fie
+i3fl
+4ift
+2ig
+iga5b
+ig3era
+ight3i
+4igi
+i3gib
+ig3il
+ig3in
+ig3it
+i4g4l
+i2go
+ig3or
+ig5ot
+i5gre
+igu5i
+ig1ur
+i3h
+4i5i4
+i3j
+4ik
+i1la
+il3a4b
+i4lade
+i2l5am
+ila5ra
+i3leg
+il1er
+ilev4
+il5f
+il1i
+il3ia
+il2ib
+il3io
+il4ist
+2ilit
+il2iz
+ill5ab
+4iln
+il3oq
+il4ty
+il5ur
+il3v
+i4mag
+im3age
+ima5ry
+imenta5r
+4imet
+im1i
+im5ida
+imi5le
+i5mini
+4imit
+im4ni
+i3mon
+i2mu
+im3ula
+2in.
+i4n3au
+4inav
+incel4
+in3cer
+4ind
+in5dling
+2ine
+i3nee
+iner4ar
+i5ness
+4inga
+4inge
+in5gen
+4ingi
+in5gling
+4ingo
+4ingu
+2ini
+i5ni.
+i4nia
+in3io
+in1is
+i5nite.
+5initio
+in3ity
+4ink
+4inl
+2inn
+2i1no
+i4no4c
+ino4s
+i4not
+2ins
+in3se
+insur5a
+2int.
+2in4th
+in1u
+i5nus
+4iny
+2io
+4io.
+ioge4
+io2gr
+i1ol
+io4m
+ion3at
+ion4ery
+ion3i
+io5ph
+ior3i
+i4os
+io5th
+i5oti
+io4to
+i4our
+2ip
+ipe4
+iphras4
+ip3i
+ip4ic
+ip4re4
+ip3ul
+i3qua
+iq5uef
+iq3uid
+iq3ui3t
+4ir
+i1ra
+ira4b
+i4rac
+ird5e
+ire4de
+i4ref
+i4rel4
+i4res
+ir5gi
+ir1i
+iri5de
+ir4is
+iri3tu
+5i5r2iz
+ir4min
+iro4g
+5iron.
+ir5ul
+2is.
+is5ag
+is3ar
+isas5
+2is1c
+is3ch
+4ise
+is3er
+3isf
+is5han
+is3hon
+ish5op
+is3ib
+isi4d
+i5sis
+is5itiv
+4is4k
+islan4
+4isms
+i2so
+iso5mer
+is1p
+is2pi
+is4py
+4is1s
+is4sal
+issen4
+is4ses
+is4ta.
+is1te
+is1ti
+ist4ly
+4istral
+i2su
+is5us
+4ita.
+ita4bi
+i4tag
+4ita5m
+i3tan
+i3tat
+2ite
+it3era
+i5teri
+it4es
+2ith
+i1ti
+4itia
+4i2tic
+it3ica
+5i5tick
+it3ig
+it5ill
+i2tim
+2itio
+4itis
+i4tism
+i2t5o5m
+4iton
+i4tram
+it5ry
+4itt
+it3uat
+i5tud
+it3ul
+4itz.
+i1u
+2iv
+iv3ell
+iv3en.
+i4v3er.
+i4vers.
+iv5il.
+iv5io
+iv1it
+i5vore
+iv3o3ro
+i4v3ot
+4i5w
+ix4o
+4iy
+4izar
+izi4
+5izont
+5ja
+jac4q
+ja4p
+1je
+jer5s
+4jestie
+4jesty
+jew3
+jo4p
+5judg
+3ka.
+k3ab
+k5ag
+kais4
+kal4
+k1b
+k2ed
+1kee
+ke4g
+ke5li
+k3en4d
+k1er
+kes4
+k3est.
+ke4ty
+k3f
+kh4
+k1i
+5ki.
+5k2ic
+k4ill
+kilo5
+k4im
+k4in.
+kin4de
+k5iness
+kin4g
+ki4p
+kis4
+k5ish
+kk4
+k1l
+4kley
+4kly
+k1m
+k5nes
+1k2no
+ko5r
+kosh4
+k3ou
+kro5n
+4k1s2
+k4sc
+ks4l
+k4sy
+k5t
+k1w
+lab3ic
+l4abo
+laci4
+l4ade
+la3dy
+lag4n
+lam3o
+3land
+lan4dl
+lan5et
+lan4te
+lar4g
+lar3i
+las4e
+la5tan
+4lateli
+4lativ
+4lav
+la4v4a
+2l1b
+lbin4
+4l1c2
+lce4
+l3ci
+2ld
+l2de
+ld4ere
+ld4eri
+ldi4
+ld5is
+l3dr
+l4dri
+le2a
+le4bi
+left5
+5leg.
+5legg
+le4mat
+lem5atic
+4len.
+3lenc
+5lene.
+1lent
+le3ph
+le4pr
+lera5b
+ler4e
+3lerg
+3l4eri
+l4ero
+les2
+le5sco
+5lesq
+3less
+5less.
+l3eva
+lev4er.
+lev4era
+lev4ers
+3ley
+4leye
+2lf
+l5fr
+4l1g4
+l5ga
+lgar3
+l4ges
+lgo3
+2l3h
+li4ag
+li2am
+liar5iz
+li4as
+li4ato
+li5bi
+5licio
+li4cor
+4lics
+4lict.
+l4icu
+l3icy
+l3ida
+lid5er
+3lidi
+lif3er
+l4iff
+li4fl
+5ligate
+3ligh
+li4gra
+3lik
+4l4i4l
+lim4bl
+lim3i
+li4mo
+l4im4p
+l4ina
+1l4ine
+lin3ea
+lin3i
+link5er
+li5og
+4l4iq
+lis4p
+l1it
+l2it.
+5litica
+l5i5tics
+liv3er
+l1iz
+4lj
+lka3
+l3kal
+lka4t
+l1l
+l4law
+l2le
+l5lea
+l3lec
+l3leg
+l3lel
+l3le4n
+l3le4t
+ll2i
+l2lin4
+l5lina
+ll4o
+lloqui5
+ll5out
+l5low
+2lm
+l5met
+lm3ing
+l4mod
+lmon4
+2l1n2
+3lo.
+lob5al
+lo4ci
+4lof
+3logic
+l5ogo
+3logu
+lom3er
+5long
+lon4i
+l3o3niz
+lood5
+5lope.
+lop3i
+l3opm
+lora4
+lo4rato
+lo5rie
+lor5ou
+5los.
+los5et
+5losophiz
+5losophy
+los4t
+lo4ta
+loun5d
+2lout
+4lov
+2lp
+lpa5b
+l3pha
+l5phi
+lp5ing
+l3pit
+l4pl
+l5pr
+4l1r
+2l1s2
+l4sc
+l2se
+l4sie
+4lt
+lt5ag
+ltane5
+l1te
+lten4
+ltera4
+lth3i
+l5ties.
+ltis4
+l1tr
+ltu2
+ltur3a
+lu5a
+lu3br
+luch4
+lu3ci
+lu3en
+luf4
+lu5id
+lu4ma
+5lumi
+l5umn.
+5lumnia
+lu3o
+luo3r
+4lup
+luss4
+lus3te
+1lut
+l5ven
+l5vet4
+2l1w
+1ly
+4lya
+4lyb
+ly5me
+ly3no
+2lys4
+l5yse
+1ma
+2mab
+ma2ca
+ma5chine
+ma4cl
+mag5in
+5magn
+2mah
+maid5
+4mald
+ma3lig
+ma5lin
+mal4li
+mal4ty
+5mania
+man5is
+man3iz
+4map
+ma5rine.
+ma5riz
+mar4ly
+mar3v
+ma5sce
+mas4e
+mas1t
+5mate
+math3
+ma3tis
+4matiza
+4m1b
+mba4t5
+m5bil
+m4b3ing
+mbi4v
+4m5c
+4me.
+2med
+4med.
+5media
+me3die
+m5e5dy
+me2g
+mel5on
+mel4t
+me2m
+mem1o3
+1men
+men4a
+men5ac
+men4de
+4mene
+men4i
+mens4
+mensu5
+3ment
+men4te
+me5on
+m5ersa
+2mes
+3mesti
+me4ta
+met3al
+me1te
+me5thi
+m4etr
+5metric
+me5trie
+me3try
+me4v
+4m1f
+2mh
+5mi.
+mi3a
+mid4a
+mid4g
+mig4
+3milia
+m5i5lie
+m4ill
+min4a
+3mind
+m5inee
+m4ingl
+min5gli
+m5ingly
+min4t
+m4inu
+miot4
+m2is
+mis4er.
+mis5l
+mis4ti
+m5istry
+4mith
+m2iz
+4mk
+4m1l
+m1m
+mma5ry
+4m1n
+mn4a
+m4nin
+mn4o
+1mo
+4mocr
+5mocratiz
+mo2d1
+mo4go
+mois2
+moi5se
+4mok
+mo5lest
+mo3me
+mon5et
+mon5ge
+moni3a
+mon4ism
+mon4ist
+mo3niz
+monol4
+mo3ny.
+mo2r
+4mora.
+mos2
+mo5sey
+mo3sp
+moth3
+m5ouf
+3mous
+mo2v
+4m1p
+mpara5
+mpa5rab
+mpar5i
+m3pet
+mphas4
+m2pi
+mpi4a
+mp5ies
+m4p1in
+m5pir
+mp5is
+mpo3ri
+mpos5ite
+m4pous
+mpov5
+mp4tr
+m2py
+4m3r
+4m1s2
+m4sh
+m5si
+4mt
+1mu
+mula5r4
+5mult
+multi3
+3mum
+mun2
+4mup
+mu4u
+4mw
+1na
+2n1a2b
+n4abu
+4nac.
+na4ca
+n5act
+nag5er.
+nak4
+na4li
+na5lia
+4nalt
+na5mit
+n2an
+nanci4
+nan4it
+nank4
+nar3c
+4nare
+nar3i
+nar4l
+n5arm
+n4as
+nas4c
+nas5ti
+n2at
+na3tal
+nato5miz
+n2au
+nau3se
+3naut
+nav4e
+4n1b4
+ncar5
+n4ces.
+n3cha
+n5cheo
+n5chil
+n3chis
+nc1in
+nc4it
+ncour5a
+n1cr
+n1cu
+n4dai
+n5dan
+n1de
+nd5est.
+ndi4b
+n5d2if
+n1dit
+n3diz
+n5duc
+ndu4r
+nd2we
+2ne.
+n3ear
+ne2b
+neb3u
+ne2c
+5neck
+2ned
+ne4gat
+neg5ativ
+5nege
+ne4la
+nel5iz
+ne5mi
+ne4mo
+1nen
+4nene
+3neo
+ne4po
+ne2q
+n1er
+nera5b
+n4erar
+n2ere
+n4er5i
+ner4r
+1nes
+2nes.
+4nesp
+2nest
+4nesw
+3netic
+ne4v
+n5eve
+ne4w
+n3f
+n4gab
+n3gel
+nge4n4e
+n5gere
+n3geri
+ng5ha
+n3gib
+ng1in
+n5git
+n4gla
+ngov4
+ng5sh
+n1gu
+n4gum
+n2gy
+4n1h4
+nha4
+nhab3
+nhe4
+3n4ia
+ni3an
+ni4ap
+ni3ba
+ni4bl
+ni4d
+ni5di
+ni4er
+ni2fi
+ni5ficat
+n5igr
+nik4
+n1im
+ni3miz
+n1in
+5nine.
+nin4g
+ni4o
+5nis.
+nis4ta
+n2it
+n4ith
+3nitio
+n3itor
+ni3tr
+n1j
+4nk2
+n5kero
+n3ket
+nk3in
+n1kl
+4n1l
+n5m
+nme4
+nmet4
+4n1n2
+nne4
+nni3al
+nni4v
+nob4l
+no3ble
+n5ocl
+4n3o2d
+3noe
+4nog
+noge4
+nois5i
+no5l4i
+5nologis
+3nomic
+n5o5miz
+no4mo
+no3my
+no4n
+non4ag
+non5i
+n5oniz
+4nop
+5nop5o5li
+nor5ab
+no4rary
+4nosc
+nos4e
+nos5t
+no5ta
+1nou
+3noun
+nov3el3
+nowl3
+n1p4
+npi4
+npre4c
+n1q
+n1r
+nru4
+2n1s2
+ns5ab
+nsati4
+ns4c
+n2se
+n4s3es
+nsid1
+nsig4
+n2sl
+ns3m
+n4soc
+ns4pe
+n5spi
+nsta5bl
+n1t
+nta4b
+nter3s
+nt2i
+n5tib
+nti4er
+nti2f
+n3tine
+n4t3ing
+nti4p
+ntrol5li
+nt4s
+ntu3me
+nu1a
+nu4d
+nu5en
+nuf4fe
+n3uin
+3nu3it
+n4um
+nu1me
+n5umi
+3nu4n
+n3uo
+nu3tr
+n1v2
+n1w4
+nym4
+nyp4
+4nz
+n3za
+4oa
+oad3
+o5a5les
+oard3
+oas4e
+oast5e
+oat5i
+ob3a3b
+o5bar
+obe4l
+o1bi
+o2bin
+ob5ing
+o3br
+ob3ul
+o1ce
+och4
+o3chet
+ocif3
+o4cil
+o4clam
+o4cod
+oc3rac
+oc5ratiz
+ocre3
+5ocrit
+octor5a
+oc3ula
+o5cure
+od5ded
+od3ic
+odi3o
+o2do4
+odor3
+od5uct.
+od5ucts
+o4el
+o5eng
+o3er
+oe4ta
+o3ev
+o2fi
+of5ite
+ofit4t
+o2g5a5r
+og5ativ
+o4gato
+o1ge
+o5gene
+o5geo
+o4ger
+o3gie
+1o1gis
+og3it
+o4gl
+o5g2ly
+3ogniz
+o4gro
+ogu5i
+1ogy
+2ogyn
+o1h2
+ohab5
+oi2
+oic3es
+oi3der
+oiff4
+oig4
+oi5let
+o3ing
+oint5er
+o5ism
+oi5son
+oist5en
+oi3ter
+o5j
+2ok
+o3ken
+ok5ie
+o1la
+o4lan
+olass4
+ol2d
+old1e
+ol3er
+o3lesc
+o3let
+ol4fi
+ol2i
+o3lia
+o3lice
+ol5id.
+o3li4f
+o5lil
+ol3ing
+o5lio
+o5lis.
+ol3ish
+o5lite
+o5litio
+o5liv
+olli4e
+ol5ogiz
+olo4r
+ol5pl
+ol2t
+ol3ub
+ol3ume
+ol3un
+o5lus
+ol2v
+o2ly
+om5ah
+oma5l
+om5atiz
+om2be
+om4bl
+o2me
+om3ena
+om5erse
+o4met
+om5etry
+o3mia
+om3ic.
+om3ica
+o5mid
+om1in
+o5mini
+5ommend
+omo4ge
+o4mon
+om3pi
+ompro5
+o2n
+on1a
+on4ac
+o3nan
+on1c
+3oncil
+2ond
+on5do
+o3nen
+on5est
+on4gu
+on1ic
+o3nio
+on1is
+o5niu
+on3key
+on4odi
+on3omy
+on3s
+onspi4
+onspir5a
+onsu4
+onten4
+on3t4i
+ontif5
+on5um
+onva5
+oo2
+ood5e
+ood5i
+oo4k
+oop3i
+o3ord
+oost5
+o2pa
+ope5d
+op1er
+3opera
+4operag
+2oph
+o5phan
+o5pher
+op3ing
+o3pit
+o5pon
+o4posi
+o1pr
+op1u
+opy5
+o1q
+o1ra
+o5ra.
+o4r3ag
+or5aliz
+or5ange
+ore5a
+o5real
+or3ei
+ore5sh
+or5est.
+orew4
+or4gu
+4o5ria
+or3ica
+o5ril
+or1in
+o1rio
+or3ity
+o3riu
+or2mi
+orn2e
+o5rof
+or3oug
+or5pe
+3orrh
+or4se
+ors5en
+orst4
+or3thi
+or3thy
+or4ty
+o5rum
+o1ry
+os3al
+os2c
+os4ce
+o3scop
+4oscopi
+o5scr
+os4i4e
+os5itiv
+os3ito
+os3ity
+osi4u
+os4l
+o2so
+os4pa
+os4po
+os2ta
+o5stati
+os5til
+os5tit
+o4tan
+otele4g
+ot3er.
+ot5ers
+o4tes
+4oth
+oth5esi
+oth3i4
+ot3ic.
+ot5ica
+o3tice
+o3tif
+o3tis
+oto5s
+ou2
+ou3bl
+ouch5i
+ou5et
+ou4l
+ounc5er
+oun2d
+ou5v
+ov4en
+over4ne
+over3s
+ov4ert
+o3vis
+oviti4
+o5v4ol
+ow3der
+ow3el
+ow5est
+ow1i
+own5i
+o4wo
+oy1a
+1pa
+pa4ca
+pa4ce
+pac4t
+p4ad
+5pagan
+p3agat
+p4ai
+pain4
+p4al
+pan4a
+pan3el
+pan4ty
+pa3ny
+pa1p
+pa4pu
+para5bl
+par5age
+par5di
+3pare
+par5el
+p4a4ri
+par4is
+pa2te
+pa5ter
+5pathic
+pa5thy
+pa4tric
+pav4
+3pay
+4p1b
+pd4
+4pe.
+3pe4a
+pear4l
+pe2c
+2p2ed
+3pede
+3pedi
+pedia4
+ped4ic
+p4ee
+pee4d
+pek4
+pe4la
+peli4e
+pe4nan
+p4enc
+pen4th
+pe5on
+p4era.
+pera5bl
+p4erag
+p4eri
+peri5st
+per4mal
+perme5
+p4ern
+per3o
+per3ti
+pe5ru
+per1v
+pe2t
+pe5ten
+pe5tiz
+4pf
+4pg
+4ph.
+phar5i
+phe3no
+ph4er
+ph4es.
+ph1ic
+5phie
+ph5ing
+5phisti
+3phiz
+ph2l
+3phob
+3phone
+5phoni
+pho4r
+4phs
+ph3t
+5phu
+1phy
+pi3a
+pian4
+pi4cie
+pi4cy
+p4id
+p5ida
+pi3de
+5pidi
+3piec
+pi3en
+pi4grap
+pi3lo
+pi2n
+p4in.
+pind4
+p4ino
+3pi1o
+pion4
+p3ith
+pi5tha
+pi2tu
+2p3k2
+1p2l2
+3plan
+plas5t
+pli3a
+pli5er
+4plig
+pli4n
+ploi4
+plu4m
+plum4b
+4p1m
+2p3n
+po4c
+5pod.
+po5em
+po3et5
+5po4g
+poin2
+5point
+poly5t
+po4ni
+po4p
+1p4or
+po4ry
+1pos
+pos1s
+p4ot
+po4ta
+5poun
+4p1p
+ppa5ra
+p2pe
+p4ped
+p5pel
+p3pen
+p3per
+p3pet
+ppo5site
+pr2
+pray4e
+5preci
+pre5co
+pre3em
+pref5ac
+pre4la
+pre3r
+p3rese
+3press
+pre5ten
+pre3v
+5pri4e
+prin4t3
+pri4s
+pris3o
+p3roca
+prof5it
+pro3l
+pros3e
+pro1t
+2p1s2
+p2se
+ps4h
+p4sib
+2p1t
+pt5a4b
+p2te
+p2th
+pti3m
+ptu4r
+p4tw
+pub3
+pue4
+puf4
+pul3c
+pu4m
+pu2n
+pur4r
+5pus
+pu2t
+5pute
+put3er
+pu3tr
+put4ted
+put4tin
+p3w
+qu2
+qua5v
+2que.
+3quer
+3quet
+2rab
+ra3bi
+rach4e
+r5acl
+raf5fi
+raf4t
+r2ai
+ra4lo
+ram3et
+r2ami
+rane5o
+ran4ge
+r4ani
+ra5no
+rap3er
+3raphy
+rar5c
+rare4
+rar5ef
+4raril
+r2as
+ration4
+rau4t
+ra5vai
+rav3el
+ra5zie
+r1b
+r4bab
+r4bag
+rbi2
+rbi4f
+r2bin
+r5bine
+rb5ing.
+rb4o
+r1c
+r2ce
+rcen4
+r3cha
+rch4er
+r4ci4b
+rc4it
+rcum3
+r4dal
+rd2i
+rdi4a
+rdi4er
+rdin4
+rd3ing
+2re.
+re1al
+re3an
+re5arr
+5reav
+re4aw
+r5ebrat
+rec5oll
+rec5ompe
+re4cre
+2r2ed
+re1de
+re3dis
+red5it
+re4fac
+re2fe
+re5fer.
+re3fi
+re4fy
+reg3is
+re5it
+re1li
+re5lu
+r4en4ta
+ren4te
+re1o
+re5pin
+re4posi
+re1pu
+r1er4
+r4eri
+rero4
+re5ru
+r4es.
+re4spi
+ress5ib
+res2t
+re5stal
+re3str
+re4ter
+re4ti4z
+re3tri
+reu2
+re5uti
+rev2
+re4val
+rev3el
+r5ev5er.
+re5vers
+re5vert
+re5vil
+rev5olu
+re4wh
+r1f
+rfu4
+r4fy
+rg2
+rg3er
+r3get
+r3gic
+rgi4n
+rg3ing
+r5gis
+r5git
+r1gl
+rgo4n
+r3gu
+rh4
+4rh.
+4rhal
+ri3a
+ria4b
+ri4ag
+r4ib
+rib3a
+ric5as
+r4ice
+4rici
+5ricid
+ri4cie
+r4ico
+rid5er
+ri3enc
+ri3ent
+ri1er
+ri5et
+rig5an
+5rigi
+ril3iz
+5riman
+rim5i
+3rimo
+rim4pe
+r2ina
+5rina.
+rin4d
+rin4e
+rin4g
+ri1o
+5riph
+riph5e
+ri2pl
+rip5lic
+r4iq
+r2is
+r4is.
+ris4c
+r3ish
+ris4p
+ri3ta3b
+r5ited.
+rit5er.
+rit5ers
+rit3ic
+ri2tu
+rit5ur
+riv5el
+riv3et
+riv3i
+r3j
+r3ket
+rk4le
+rk4lin
+r1l
+rle4
+r2led
+r4lig
+r4lis
+rl5ish
+r3lo4
+r1m
+rma5c
+r2me
+r3men
+rm5ers
+rm3ing
+r4ming.
+r4mio
+r3mit
+r4my
+r4nar
+r3nel
+r4ner
+r5net
+r3ney
+r5nic
+r1nis4
+r3nit
+r3niv
+rno4
+r4nou
+r3nu
+rob3l
+r2oc
+ro3cr
+ro4e
+ro1fe
+ro5fil
+rok2
+ro5ker
+5role.
+rom5ete
+rom4i
+rom4p
+ron4al
+ron4e
+ro5n4is
+ron4ta
+1room
+5root
+ro3pel
+rop3ic
+ror3i
+ro5ro
+ros5per
+ros4s
+ro4the
+ro4ty
+ro4va
+rov5el
+rox5
+r1p
+r4pea
+r5pent
+rp5er.
+r3pet
+rp4h4
+rp3ing
+r3po
+r1r4
+rre4c
+rre4f
+r4reo
+rre4st
+rri4o
+rri4v
+rron4
+rros4
+rrys4
+4rs2
+r1sa
+rsa5ti
+rs4c
+r2se
+r3sec
+rse4cr
+rs5er.
+rs3es
+rse5v2
+r1sh
+r5sha
+r1si
+r4si4b
+rson3
+r1sp
+r5sw
+rtach4
+r4tag
+r3teb
+rten4d
+rte5o
+r1ti
+rt5ib
+rti4d
+r4tier
+r3tig
+rtil3i
+rtil4l
+r4tily
+r4tist
+r4tiv
+r3tri
+rtroph4
+rt4sh
+ru3a
+ru3e4l
+ru3en
+ru4gl
+ru3in
+rum3pl
+ru2n
+runk5
+run4ty
+r5usc
+ruti5n
+rv4e
+rvel4i
+r3ven
+rv5er.
+r5vest
+r3vey
+r3vic
+rvi4v
+r3vo
+r1w
+ry4c
+5rynge
+ry3t
+sa2
+2s1ab
+5sack
+sac3ri
+s3act
+5sai
+salar4
+sal4m
+sa5lo
+sal4t
+3sanc
+san4de
+s1ap
+sa5ta
+5sa3tio
+sat3u
+sau4
+sa5vor
+5saw
+4s5b
+scan4t5
+sca4p
+scav5
+s4ced
+4scei
+s4ces
+sch2
+s4cho
+3s4cie
+5scin4d
+scle5
+s4cli
+scof4
+4scopy
+scour5a
+s1cu
+4s5d
+4se.
+se4a
+seas4
+sea5w
+se2c3o
+3sect
+4s4ed
+se4d4e
+s5edl
+se2g
+seg3r
+5sei
+se1le
+5self
+5selv
+4seme
+se4mol
+sen5at
+4senc
+sen4d
+s5ened
+sen5g
+s5enin
+4sentd
+4sentl
+sep3a3
+4s1er.
+s4erl
+ser4o
+4servo
+s1e4s
+se5sh
+ses5t
+5se5um
+5sev
+sev3en
+sew4i
+5sex
+4s3f
+2s3g
+s2h
+2sh.
+sh1er
+5shev
+sh1in
+sh3io
+3ship
+shiv5
+sho4
+sh5old
+shon3
+shor4
+short5
+4shw
+si1b
+s5icc
+3side.
+5sides
+5sidi
+si5diz
+4signa
+sil4e
+4sily
+2s1in
+s2ina
+5sine.
+s3ing
+1sio
+5sion
+sion5a
+si2r
+sir5a
+1sis
+3sitio
+5siu
+1siv
+5siz
+sk2
+4ske
+s3ket
+sk5ine
+sk5ing
+s1l2
+s3lat
+s2le
+slith5
+2s1m
+s3ma
+small3
+sman3
+smel4
+s5men
+5smith
+smol5d4
+s1n4
+1so
+so4ce
+soft3
+so4lab
+sol3d2
+so3lic
+5solv
+3som
+3s4on.
+sona4
+son4g
+s4op
+5sophic
+s5ophiz
+s5ophy
+sor5c
+sor5d
+4sov
+so5vi
+2spa
+5spai
+spa4n
+spen4d
+2s5peo
+2sper
+s2phe
+3spher
+spho5
+spil4
+sp5ing
+4spio
+s4ply
+s4pon
+spor4
+4spot
+squal4l
+s1r
+2ss
+s1sa
+ssas3
+s2s5c
+s3sel
+s5seng
+s4ses.
+s5set
+s1si
+s4sie
+ssi4er
+ss5ily
+s4sl
+ss4li
+s4sn
+sspend4
+ss2t
+ssur5a
+ss5w
+2st.
+s2tag
+s2tal
+stam4i
+5stand
+s4ta4p
+5stat.
+s4ted
+stern5i
+s5tero
+ste2w
+stew5a
+s3the
+st2i
+s4ti.
+s5tia
+s1tic
+5stick
+s4tie
+s3tif
+st3ing
+5stir
+s1tle
+5stock
+stom3a
+5stone
+s4top
+3store
+st4r
+s4trad
+5stratu
+s4tray
+s4trid
+4stry
+4st3w
+s2ty
+1su
+su1al
+su4b3
+su2g3
+su5is
+suit3
+s4ul
+su2m
+sum3i
+su2n
+su2r
+4sv
+sw2
+4swo
+s4y
+4syc
+3syl
+syn5o
+sy5rin
+1ta
+3ta.
+2tab
+ta5bles
+5taboliz
+4taci
+ta5do
+4taf4
+tai5lo
+ta2l
+ta5la
+tal5en
+tal3i
+4talk
+tal4lis
+ta5log
+ta5mo
+tan4de
+tanta3
+ta5per
+ta5pl
+tar4a
+4tarc
+4tare
+ta3riz
+tas4e
+ta5sy
+4tatic
+ta4tur
+taun4
+tav4
+2taw
+tax4is
+2t1b
+4tc
+t4ch
+tch5et
+4t1d
+4te.
+tead4i
+4teat
+tece4
+5tect
+2t1ed
+te5di
+1tee
+teg4
+te5ger
+te5gi
+3tel.
+teli4
+5tels
+te2ma2
+tem3at
+3tenan
+3tenc
+3tend
+4tenes
+1tent
+ten4tag
+1teo
+te4p
+te5pe
+ter3c
+5ter3d
+1teri
+ter5ies
+ter3is
+teri5za
+5ternit
+ter5v
+4tes.
+4tess
+t3ess.
+teth5e
+3teu
+3tex
+4tey
+2t1f
+4t1g
+2th.
+than4
+th2e
+4thea
+th3eas
+the5at
+the3is
+3thet
+th5ic.
+th5ica
+4thil
+5think
+4thl
+th5ode
+5thodic
+4thoo
+thor5it
+tho5riz
+2ths
+1tia
+ti4ab
+ti4ato
+2ti2b
+4tick
+t4ico
+t4ic1u
+5tidi
+3tien
+tif2
+ti5fy
+2tig
+5tigu
+till5in
+1tim
+4timp
+tim5ul
+2t1in
+t2ina
+3tine.
+3tini
+1tio
+ti5oc
+tion5ee
+5tiq
+ti3sa
+3tise
+tis4m
+ti5so
+tis4p
+5tistica
+ti3tl
+ti4u
+1tiv
+tiv4a
+1tiz
+ti3za
+ti3zen
+2tl
+t5la
+tlan4
+3tle.
+3tled
+3tles.
+t5let.
+t5lo
+4t1m
+tme4
+2t1n2
+1to
+to3b
+to5crat
+4todo
+2tof
+to2gr
+to5ic
+to2ma
+tom4b
+to3my
+ton4ali
+to3nat
+4tono
+4tony
+to2ra
+to3rie
+tor5iz
+tos2
+5tour
+4tout
+to3war
+4t1p
+1tra
+tra3b
+tra5ch
+traci4
+trac4it
+trac4te
+tras4
+tra5ven
+trav5es5
+tre5f
+tre4m
+trem5i
+5tria
+tri5ces
+5tricia
+4trics
+2trim
+tri4v
+tro5mi
+tron5i
+4trony
+tro5phe
+tro3sp
+tro3v
+tru5i
+trus4
+4t1s2
+t4sc
+tsh4
+t4sw
+4t3t2
+t4tes
+t5to
+ttu4
+1tu
+tu1a
+tu3ar
+tu4bi
+tud2
+4tue
+4tuf4
+5tu3i
+3tum
+tu4nis
+2t3up.
+3ture
+5turi
+tur3is
+tur5o
+tu5ry
+3tus
+4tv
+tw4
+4t1wa
+twis4
+4two
+1ty
+4tya
+2tyl
+type3
+ty5ph
+4tz
+tz4e
+4uab
+uac4
+ua5na
+uan4i
+uar5ant
+uar2d
+uar3i
+uar3t
+u1at
+uav4
+ub4e
+u4bel
+u3ber
+u4bero
+u1b4i
+u4b5ing
+u3ble.
+u3ca
+uci4b
+uc4it
+ucle3
+u3cr
+u3cu
+u4cy
+ud5d
+ud3er
+ud5est
+udev4
+u1dic
+ud3ied
+ud3ies
+ud5is
+u5dit
+u4don
+ud4si
+u4du
+u4ene
+uens4
+uen4te
+uer4il
+3ufa
+u3fl
+ugh3en
+ug5in
+2ui2
+uil5iz
+ui4n
+u1ing
+uir4m
+uita4
+uiv3
+uiv4er.
+u5j
+4uk
+u1la
+ula5b
+u5lati
+ulch4
+5ulche
+ul3der
+ul4e
+u1len
+ul4gi
+ul2i
+u5lia
+ul3ing
+ul5ish
+ul4lar
+ul4li4b
+ul4lis
+4ul3m
+u1l4o
+4uls
+uls5es
+ul1ti
+ultra3
+4ultu
+u3lu
+ul5ul
+ul5v
+um5ab
+um4bi
+um4bly
+u1mi
+u4m3ing
+umor5o
+um2p
+unat4
+u2ne
+un4er
+u1ni
+un4im
+u2nin
+un5ish
+uni3v
+un3s4
+un4sw
+unt3ab
+un4ter.
+un4tes
+unu4
+un5y
+un5z
+u4ors
+u5os
+u1ou
+u1pe
+uper5s
+u5pia
+up3ing
+u3pl
+up3p
+upport5
+upt5ib
+uptu4
+u1ra
+4ura.
+u4rag
+u4ras
+ur4be
+urc4
+ur1d
+ure5at
+ur4fer
+ur4fr
+u3rif
+uri4fic
+ur1in
+u3rio
+u1rit
+ur3iz
+ur2l
+url5ing.
+ur4no
+uros4
+ur4pe
+ur4pi
+urs5er
+ur5tes
+ur3the
+urti4
+ur4tie
+u3ru
+2us
+u5sad
+u5san
+us4ap
+usc2
+us3ci
+use5a
+u5sia
+u3sic
+us4lin
+us1p
+us5sl
+us5tere
+us1tr
+u2su
+usur4
+uta4b
+u3tat
+4ute.
+4utel
+4uten
+uten4i
+4u1t2i
+uti5liz
+u3tine
+ut3ing
+ution5a
+u4tis
+5u5tiz
+u4t1l
+ut5of
+uto5g
+uto5matic
+u5ton
+u4tou
+uts4
+u3u
+uu4m
+u1v2
+uxu3
+uz4e
+1va
+5va.
+2v1a4b
+vac5il
+vac3u
+vag4
+va4ge
+va5lie
+val5o
+val1u
+va5mo
+va5niz
+va5pi
+var5ied
+3vat
+4ve.
+4ved
+veg3
+v3el.
+vel3li
+ve4lo
+v4ely
+ven3om
+v5enue
+v4erd
+5vere.
+v4erel
+v3eren
+ver5enc
+v4eres
+ver3ie
+vermi4n
+3verse
+ver3th
+v4e2s
+4ves.
+ves4te
+ve4te
+vet3er
+ve4ty
+vi5ali
+5vian
+5vide.
+5vided
+4v3iden
+5vides
+5vidi
+v3if
+vi5gn
+vik4
+2vil
+5vilit
+v3i3liz
+v1in
+4vi4na
+v2inc
+vin5d
+4ving
+vio3l
+v3io4r
+vi1ou
+vi4p
+vi5ro
+vis3it
+vi3so
+vi3su
+4viti
+vit3r
+4vity
+3viv
+5vo.
+voi4
+3vok
+vo4la
+v5ole
+5volt
+3volv
+vom5i
+vor5ab
+vori4
+vo4ry
+vo4ta
+4votee
+4vv4
+v4y
+w5abl
+2wac
+wa5ger
+wag5o
+wait5
+w5al.
+wam4
+war4t
+was4t
+wa1te
+wa5ver
+w1b
+wea5rie
+weath3
+wed4n
+weet3
+wee5v
+wel4l
+w1er
+west3
+w3ev
+whi4
+wi2
+wil2
+will5in
+win4de
+win4g
+wir4
+3wise
+with3
+wiz5
+w4k
+wl4es
+wl3in
+w4no
+1wo2
+wom1
+wo5ven
+w5p
+wra4
+wri4
+writa4
+w3sh
+ws4l
+ws4pe
+w5s4t
+4wt
+wy4
+x1a
+xac5e
+x4ago
+xam3
+x4ap
+xas5
+x3c2
+x1e
+xe4cuto
+x2ed
+xer4i
+xe5ro
+x1h
+xhi2
+xhil5
+xhu4
+x3i
+xi5a
+xi5c
+xi5di
+x4ime
+xi5miz
+x3o
+x4ob
+x3p
+xpan4d
+xpecto5
+xpe3d
+x1t2
+x3ti
+x1u
+xu3a
+xx4
+y5ac
+3yar4
+y5at
+y1b
+y1c
+y2ce
+yc5er
+y3ch
+ych4e
+ycom4
+ycot4
+y1d
+y5ee
+y1er
+y4erf
+yes4
+ye4t
+y5gi
+4y3h
+y1i
+y3la
+ylla5bl
+y3lo
+y5lu
+ymbol5
+yme4
+ympa3
+yn3chr
+yn5d
+yn5g
+yn5ic
+5ynx
+y1o4
+yo5d
+y4o5g
+yom4
+yo5net
+y4ons
+y4os
+y4ped
+yper5
+yp3i
+y3po
+y4poc
+yp2ta
+y5pu
+yra5m
+yr5ia
+y3ro
+yr4r
+ys4c
+y3s2e
+ys3ica
+ys3io
+3ysis
+y4so
+yss4
+ys1t
+ys3ta
+ysur4
+y3thin
+yt3ic
+y1w
+za1
+z5a2b
+zar2
+4zb
+2ze
+ze4n
+ze4p
+z1er
+ze3ro
+zet4
+2z1i
+z4il
+z4is
+5zl
+4zm
+1zo
+zo4m
+zo5ol
+zte4
+4z1z2
+z4zy
+.con5gr
+.de5riva
+.dri5v4
+.eth1y6l1
+.eu4ler
+.ev2
+.ever5si5b
+.ga4s1om1
+.ge4ome
+.ge5ot1
+.he3mo1
+.he3p6a
+.he3roe
+.in5u2t
+.kil2n3i
+.ko6r1te1
+.le6ices
+.me4ga1l
+.met4ala
+.mim5i2c1
+.mi1s4ers
+.ne6o3f
+.noe1th
+.non1e2m
+.poly1s
+.post1am
+.pre1am
+.rav5en1o
+.semi5
+.sem4ic
+.semid6
+.semip4
+.semir4
+.sem6is4
+.semiv4
+.sph6in1
+.spin1o
+.ta5pes1tr
+.te3legr
+.to6pog
+.to2q
+.un3at5t
+.un5err5
+.vi2c3ar
+.we2b1l
+.re1e4c
+a5bolic
+a2cabl
+af6fish
+am1en3ta5b
+anal6ys
+ano5a2c
+ans5gr
+ans3v
+anti1d
+an3ti1n2
+anti1re
+a4pe5able
+ar3che5t
+ar2range
+as5ymptot
+ath3er1o1s
+at6tes.
+augh4tl
+au5li5f
+av3iou
+back2er.
+ba6r1onie
+ba1thy
+bbi4t
+be2vie
+bi5d2if
+bil2lab
+bio5m
+bi1orb
+bio1rh
+b1i3tive
+blan2d1
+blin2d1
+blon2d2
+bor1no5
+bo2t1u1l
+brus4q
+bus6i2er
+bus6i2es
+buss4ing
+but2ed.
+but4ted
+cad5e1m
+cat1a1s2
+4chs.
+chs3hu
+chie5vo
+cig3a3r
+cin2q
+cle4ar
+co6ph1o3n
+cous2ti
+cri3tie
+croc1o1d
+cro5e2co
+c2tro3me6c
+1cu2r1ance
+2d3alone
+data1b
+dd5a5b
+d2d5ib
+de4als.
+de5clar1
+de2c5lina
+de3fin3iti
+de2mos
+des3ic
+de2tic
+dic1aid
+dif5fra
+3di1methy
+di2ren
+di2rer
+2d1lead
+2d1li2e
+3do5word
+dren1a5l
+drif2t1a
+d1ri3pleg5
+drom3e5d
+d3tab
+du2al.
+du1op1o1l
+ea4n3ies
+e3chas
+edg1l
+ed1uling
+eli2t1is
+e1loa
+en1dix
+eo3grap
+1e6p3i3neph1
+e2r3i4an.
+e3spac6i
+eth1y6l1ene
+5eu2clid1
+feb1rua
+fermi1o
+3fich
+fit5ted.
+fla1g6el
+flow2er.
+3fluor
+gen2cy.
+ge3o1d
+ght1we
+g1lead
+get2ic.
+4g1lish
+5glo5bin
+1g2nac
+gnet1ism
+gno5mo
+g2n1or.
+g2noresp
+2g1o4n3i1za
+graph5er.
+griev1
+g1utan
+hair1s
+ha2p3ar5r
+hatch1
+hex2a3
+hite3sid
+h3i5pel1a4
+hnau3z
+ho6r1ic.
+h2t1eou
+hypo1tha
+id4ios
+ifac1et
+ign4it
+ignit1er
+i4jk
+im3ped3a
+infra1s2
+i5nitely.
+irre6v3oc
+i1tesima
+ith5i2l
+itin5er5ar
+janu3a
+japan1e2s
+je1re1m
+1ke6ling
+1ki5netic
+1kovian
+k3sha
+la4c3i5e
+lai6n3ess
+lar5ce1n
+l3chai
+l3chil6d1
+lead6er.
+lea4s1a
+1lec3ta6b
+le3g6en2dre
+1le1noid
+lith1o5g
+ll1fl
+l2l3ish
+l5mo3nell
+lo1bot1o1
+lo2ges.
+load4ed.
+load6er.
+l3tea
+lth5i2ly
+lue1p
+1lunk3er
+1lum5bia.
+3lyg1a1mi
+ly5styr
+ma1la1p
+m2an.
+man3u1sc
+mar1gin1
+medi2c
+med3i3cin
+medio6c1
+me3gran3
+m2en.
+3mi3da5b
+3milita
+mil2l1ag
+mil5li5li
+mi6n3is.
+mi1n2ut1er
+mi1n2ut1est
+m3ma1b
+5maph1ro1
+5moc1ra1t
+mo5e2las
+mol1e5c
+mon4ey1l
+mono3ch
+mo4no1en
+moro6n5is
+mono1s6
+moth4et2
+m1ou3sin
+m5shack2
+mu2dro
+mul2ti5u
+n3ar4chs.
+n3ch2es1t
+ne3back
+2ne1ski
+n1dieck
+nd3thr
+nfi6n3ites
+4n5i4an.
+nge5nes
+ng1ho
+ng1spr
+nk3rup
+n5less
+5noc3er1os
+nom1a6l
+nom5e1no
+n1o1mist
+non1eq
+non1i4so
+5nop1oly.
+no1vemb
+ns5ceiv
+ns4moo
+ntre1p
+obli2g1
+o3chas
+odel3li
+odit1ic
+oerst2
+oke1st
+o3les3ter
+oli3gop1o1
+o1lo3n4om
+o3mecha6
+onom1ic
+o3norma
+o3no2t1o3n
+o3nou
+op1ism.
+or4tho3ni4t
+orth1ri
+or5tively
+o4s3pher
+o5test1er
+o5tes3tor
+oth3e1o1s
+ou3ba3do
+o6v3i4an.
+oxi6d1ic
+pal6mat
+parag6ra4
+par4a1le
+param4
+para3me
+pee2v1
+phi2l3ant
+phi5lat1e3l
+pi2c1a3d
+pli2c1ab
+pli5nar
+poin3ca
+1pole.
+poly1e
+po3lyph1ono
+1prema3c
+pre1neu
+pres2pli
+pro2cess
+proc3i3ty.
+pro2g1e
+3pseu2d
+pseu3d6o3d2
+pseu3d6o3f2
+pto3mat4
+p5trol3
+pu5bes5c
+quain2t1e
+qu6a3si3
+quasir6
+quasis6
+quin5tes5s
+qui3v4ar
+r1abolic
+3rab1o1loi
+ra3chu
+r3a3dig
+radi1o6g
+r2amen
+3ra4m5e1triz
+ra3mou
+ra5n2has
+ra1or
+r3bin1ge
+re2c3i1pr
+rec5t6ang
+re4t1ribu
+r3ial.
+riv1o1l
+6rk.
+rk1ho
+r1krau
+6rks.
+r5le5qu
+ro1bot1
+ro5e2las
+ro5epide1
+ro3mesh
+ro1tron
+r3pau5li
+rse1rad1i
+r1thou
+r1treu
+r1veil
+rz1sc
+sales3c
+sales5w
+5sa3par5il
+sca6p1er
+sca2t1ol
+s4chitz
+schro1ding1
+1sci2utt
+scrap4er.
+scy4th1
+sem1a1ph
+se3mes1t
+se1mi6t5ic
+sep3temb
+shoe1st
+sid2ed.
+side5st
+side5sw
+si5resid
+sky1sc
+3slova1kia
+3s2og1a1my
+so2lute
+3s2pace
+1s2pacin
+spe3cio
+spher1o
+spi2c1il
+spokes5w
+sports3c
+sports3w
+s3qui3to
+s2s1a3chu1
+ss3hat
+s2s3i4an.
+s5sign5a3b
+1s2tamp
+s2t1ant5shi
+star3tli
+sta1ti
+st5b
+1stor1ab
+strat1a1g
+strib5ut
+st5scr
+stu1pi4d1
+styl1is
+su2per1e6
+1sync
+1syth3i2
+swimm6
+5tab1o1lism
+ta3gon.
+talk1a5
+t1a1min
+t6ap6ath
+5tar2rh
+tch1c
+tch3i1er
+t1cr
+teach4er.
+tele2g
+tele1r6o
+3ter1gei
+ter2ic.
+t3ess2es
+tha4l1am
+tho3don
+th1o5gen1i
+tho1k2er
+thy4l1an
+thy3sc
+2t3i4an.
+ti2n3o1m
+t1li2er
+tolo2gy
+tot3ic
+trai3tor1
+tra1vers
+travers3a3b
+treach1e
+tr4ial.
+3tro1le1um
+trof4ic.
+tro3fit
+tro1p2is
+3trop1o5les
+3trop1o5lis
+t1ro1pol3it
+tsch3ie
+ttrib1ut1
+turn3ar
+t1wh
+ty2p5al
+ua3drati
+uad1ratu
+u5do3ny
+uea1m
+u2r1al.
+uri4al.
+us2er.
+v1ativ
+v1oir5du1
+va6guer
+vaude3v
+1verely.
+v1er1eig
+ves1tite
+vi1vip3a3r
+voice1p
+waste3w6a2
+wave1g4
+w3c
+week1n
+wide5sp
+wo4k1en
+wrap3aro
+writ6er.
+x1q
+xquis3
+y5che3d
+ym5e5try
+y1stro
+yes5ter1y
+z3ian.
+z3o1phr
+z2z3w} \ No newline at end of file
diff --git a/tex/context/patterns/lang-us.rme b/tex/context/patterns/lang-us.rme
new file mode 100644
index 000000000..31b289805
--- /dev/null
+++ b/tex/context/patterns/lang-us.rme
@@ -0,0 +1,40 @@
+% generated by mtxrun --script pattern --convert
+
+% This file has been renamed from ushyphmax.tex to hyph-en-us.tex in June 2008
+% for consistency with other files with hyphenation patterns in hyph-utf8 package.
+% No other changes made. See http://www.tug.org/tex-hyphen for more details.
+
+% ushyphmax.tex -- patterns for more hyphenation pattern memory (12000+).
+% Also known as ushyphen.max.
+%
+% version of 2005-05-30.
+% Patterns of March 1, 1990.
+%
+% Copyright (C) 1990, 2004, 2005 Gerard D.C. Kuiken.
+% Copying and distribution of this file, with or without modification,
+% are permitted in any medium without royalty provided the copyright
+% notice and this notice are preserved.
+%
+% Needs extended pattern memory.
+% Hyphenation trie becomes 7283 with 377 ops.
+%
+% These patterns are based on the Hyphenation Exception Log
+% published in TUGboat, Volume 10 (1989), No. 3, pp. 337-341,
+% and a large number of incorrectly hyphenated words not yet published.
+% If added to Liang's before the closing bracket } of \patterns,
+% the patterns run errorfree as far as known at this moment.
+%
+% These patterns find all admissible hyphens of the words in
+% the Exception Log. ushyph2.tex is a smaller set.
+%
+% Please send bugs or suggestions to tex-live (at) tug.org.
+%
+% 2005-05-30 (karl): in the past, ushyphmax.tex was a file containing
+% only the additional patterns, without the \patterns command, etc.
+% This turned out not to be very useful, since in practice the TeX
+% distributions need one self-contained file for a language. Therefore,
+% ushyphmax.tex now contains both the additional patterns from
+% Dr. Kuiken, and the original patterns and hyphenations from Knuth's
+% hyphen.tex.
+%
+% The Plain TeX hyphenation tables. \ No newline at end of file
diff --git a/tex/context/patterns/lang-zh.hyp b/tex/context/patterns/lang-zh.hyp
new file mode 100644
index 000000000..7b3e518b4
--- /dev/null
+++ b/tex/context/patterns/lang-zh.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-zh.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/tex/context/patterns/lang-zh.pat b/tex/context/patterns/lang-zh.pat
new file mode 100644
index 000000000..264c84b9b
--- /dev/null
+++ b/tex/context/patterns/lang-zh.pat
@@ -0,0 +1,195 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-zh.rme
+
+% used: a b c d e f g h i j k l m n o p q r s t u w x y z ü
+
+\patterns{
+a1b
+a1c
+a1d
+a1f
+a1g
+a1h
+a1j
+a1k
+a1l
+a1m
+a1p
+a1q
+a1r
+a1s
+a1t
+a1w
+a1x
+a1y
+a1z
+e1b
+e1c
+e1d
+e1f
+e1g
+e1h
+e1j
+e1k
+e1l
+e1m
+e1p
+e1q
+e1s
+e1t
+e1w
+e1x
+e1y
+e1z
+1ga
+g1b
+g1c
+g1d
+1ge
+g1f
+g1g
+g1h
+g1j
+g1k
+g1l
+g1m
+g1n
+1go
+g1p
+g1q
+g1r
+g1s
+g1t
+1gu
+g1w
+g1x
+g1y
+g1z
+i1b
+i1c
+i1d
+i1f
+i1g
+i1h
+i1j
+i1k
+i1l
+i1m
+i1p
+i1q
+i1r
+i1s
+i1t
+i1w
+i1x
+i1y
+i1z
+1na
+n1b
+n1c
+n1d
+1ne
+n1f
+n1h
+1ni
+n1j
+n1k
+n1l
+n1m
+n1n
+1no
+n1p
+n1q
+n1r
+n1s
+n1t
+1nu
+1nü
+n1w
+n1x
+n1y
+n1z
+o1b
+o1c
+o1d
+o1f
+o1g
+o1h
+o1j
+o1k
+o1l
+o1m
+o1p
+o1q
+o1r
+o1s
+o1t
+o1w
+o1x
+o1y
+o1z
+1ra
+r1b
+r1c
+r1d
+1re
+r1f
+r1g
+r1h
+1ri
+r1j
+r1k
+r1l
+r1m
+r1n
+1ro
+r1p
+r1q
+r1r
+r1s
+r1t
+1ru
+r1w
+r1x
+r1y
+r1z
+u1b
+u1c
+u1d
+u1f
+u1g
+u1h
+u1j
+u1k
+u1l
+u1m
+u1p
+u1q
+u1r
+u1s
+u1t
+u1w
+u1x
+u1y
+u1z
+ü1b
+ü1c
+ü1d
+ü1f
+ü1g
+ü1h
+ü1j
+ü1k
+ü1l
+ü1m
+ü1n
+ü1p
+ü1q
+ü1r
+ü1s
+ü1t
+ü1w
+ü1x
+ü1y
+ü1z} \ No newline at end of file
diff --git a/tex/context/patterns/lang-zh.rme b/tex/context/patterns/lang-zh.rme
new file mode 100644
index 000000000..f2dd9def7
--- /dev/null
+++ b/tex/context/patterns/lang-zh.rme
@@ -0,0 +1,88 @@
+% generated by mtxrun --script pattern --convert
+
+% This file is part of hyph-utf8 package and resulted from
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
+%
+% Source: pyhyph.tex (yyyy-mm-dd)
+% Author: Werner Lemberg <wl at gnu.org>
+%
+% The above mentioned file should become obsolete,
+% and the author of the original file should preferaby modify this file instead.
+%
+% Modificatios were needed in order to support native UTF-8 engines,
+% but functionality (hopefully) didn't change in any way, at least not intentionally.
+% This file is no longer stand-alone; at least for 8-bit engines
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+%
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
+% with help & support from:
+% - Karl Berry, who gave us free hands and all resources
+% - Taco Hoekwater, with useful macros
+% - Hans Hagen, who did the unicodifisation of patterns already long before
+% and helped with testing, suggestions and bug reports
+% - Norbert Preining, who tested & integrated patterns into TeX Live
+%
+% However, the "copyright/copyleft" owner of patterns remains the original author.
+%
+% The copyright statement of this file is thus:
+%
+% Do with this file whatever needs to be done in future for the sake of
+% "a better world" as long as you respect the copyright of original file.
+% If you're the original author of patterns or taking over a new revolution,
+% plese remove all of the TUG comments & credits that we added here -
+% you are the Queen / the King, we are only the servants.
+%
+% If you want to change this file, rather than uploading directly to CTAN,
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
+% or ask for credentials for SVN repository and commit it yourself;
+% we will then upload the whole "package" to CTAN.
+%
+% Before a new "pattern-revolution" starts,
+% please try to follow some guidelines if possible:
+%
+% - \lccode is *forbidden*, and I really mean it
+% - all the patterns should be in UTF-8
+% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
+% and if you really cannot do without, also \input and \message
+% - in particular, please no \catcode or \lccode changes,
+% they belong to loadhyph-foo.tex,
+% and no \lefthyphenmin and \righthyphenmin,
+% they have no influence here and belong elsewhere
+% - \begingroup and/or \endinput is not needed
+% - feel free to do whatever you want inside comments
+%
+% We know that TeX is extremely powerful, but give a stupid parser
+% at least a chance to read your patterns.
+%
+% For more unformation see
+%
+% http://tug.org/tex-hyphen
+%
+%------------------------------------------------------------------------------
+%
+% This is the file pyhyph.tex of the CJK package
+% for hyphenating Chinese pinyin syllables.
+%
+% created by Werner Lemberg <wl@gnu.org>
+%
+% Version 4.8.0 (22-May-2008)
+%
+% Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org>
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program in doc/COPYING; if not, write to the Free
+% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+% MA 02110-1301 USA
+%
+% \message{Hyphenation patterns for unaccented pinyin syllables (CJK 4.7.0)}
+% \ No newline at end of file
diff --git a/tex/context/sample/aesop-de.tex b/tex/context/sample/aesop-de.tex
new file mode 100644
index 000000000..80a41f295
--- /dev/null
+++ b/tex/context/sample/aesop-de.tex
@@ -0,0 +1,25 @@
+% German example file from Aesop
+
+Der L\"owe und die M\"ucke
+
+Eine M\"ucke forderte mit den \"uberm\"utigsten Worten
+einen L\"owen zum Zweikampf heraus: \quotation {Ich
+f\"urchte dich nicht, du gro\SS es Ungeheuer}, rief sie ihm
+zu, \quotation {weil du gar keine Vorz\"uge vor mir hast;
+oder nenne sie mir, wenn du solche zu haben glaubst; etwa
+die, da\SS\ du deinen Raub mit Krallen zerrei\SS est und
+mit Z\"ahnen zermalmest? Jedes andere feige Tier, wenn es
+mit einem Tapfern k\"ampft, tut dasselbe, es bei\SS t und
+kratzt. Du sollst aber empfinden, da\SS\ ich st\"arker bin
+als du!} Mit diesen Worten flog sie in eines seiner
+Nasenl\"ocher und stach ihn so sehr, da\SS\ er sich vor
+Schmerz selbst zerfleischte und sich f\"ur \"uberwunden
+erkl\"arte.
+
+Stolz auf diesen Sieg flog die M\"ucke davon, um ihn aller
+Welt auszuposaunen, \"ubersah aber das Gewebe einer Spinne
+und verfing sich in demselben. Gierig umarmte die Spinne
+sie und sog ihr das Heldenblut aus. Sterbend empfand die
+M\"ucke ihre Nichtigkeit, indem sie, die Besiegerin des
+L\"owen, einem so ver\"achtlichen Tiere, einer Spinne,
+erliegen mu\SS te.
diff --git a/tex/context/sample/bryson.tex b/tex/context/sample/bryson.tex
new file mode 100644
index 000000000..ecda71c58
--- /dev/null
+++ b/tex/context/sample/bryson.tex
@@ -0,0 +1,9 @@
+Imagine trying to live in a world dominated by dihydrogen oxide, a
+compound that has no taste or smell and is so viable in its properties
+that it is generally benign but at other times swiftly lethal.
+Depending on its state, it can scald you or freeze you. In the
+presence of certain organic molecules it can form carbonic acids so
+nasty that they can strip the leaves from trees and eat the faces off
+statuary. In bulk, when agitated, it can strike with a fury that no
+human edifice could withstand. Even for those who have learned to live
+with it, it is often murderous substance. We call it water. \ No newline at end of file
diff --git a/tex/context/sample/davis.tex b/tex/context/sample/davis.tex
new file mode 100644
index 000000000..8d45c9849
--- /dev/null
+++ b/tex/context/sample/davis.tex
@@ -0,0 +1,13 @@
+This nation, turning 100 years old, had no {\em Odyssey}, no
+St.~George slaying the dragon, no Prometheus. The emerging American
+genius for making a lot of money was a poor substitute for King
+Arthur and his knights (although the Horatio Alger myth of rags to
+riches was good for a lot of mileage). Without a mythology and set
+of ancient heroes to call its own, America had to manufacture its
+heroes. So the mythmaking machinery of nineteenth|-|century American
+media created a suitable heroic archetype in the cowboys of the Wild
+West. The image was of the undaunted cattle drivers living a life of
+reckless individualism, braving the elements, staving off brutal
+Indian attacks. Or of heroic lawmen dueling with six|-|guns in the
+streets at high noon. This artificial Wild West became America's
+Iliad. \ No newline at end of file
diff --git a/tex/context/sample/dawkins.tex b/tex/context/sample/dawkins.tex
new file mode 100644
index 000000000..3490b79b0
--- /dev/null
+++ b/tex/context/sample/dawkins.tex
@@ -0,0 +1,20 @@
+I used a similar illustration in one of my Royal
+Institution Christmas Lectures in 1991. I said I had reason
+to believe that among my audience was a psychic,
+clairvoyant individual, capable of influencing events
+purely by power of thought. I would try to flush this
+individual out. \quotation {Let's first establish,} I said,
+\quotation {whether the psychic is in the left half or the
+right half of the lecture hall.} I invited everybody to
+stand up while my assistant tossed a coin. Everybody on the
+left of the hall was asked to \quote {will} the coin to
+come down head. Everybody on the right had to will it to be
+tails. Obviously one side had to lose, and they were asked
+to sit down. Then those who remained were divided into two,
+with half \quote {willing} heads and the other half tails.
+Again the losers sat down. And so on by successive halvings
+until, inevitably, after seven or eight tosses, one
+individual was left standing. \quotation {A big round of
+applause for our psychic.} He must be psychic, mustn't he,
+because he successfully influenced the coin eight times in
+a row? \ No newline at end of file
diff --git a/tex/context/sample/demo-mps.tex b/tex/context/sample/demo-mps.tex
new file mode 100644
index 000000000..57bb690c0
--- /dev/null
+++ b/tex/context/sample/demo-mps.tex
@@ -0,0 +1,23 @@
+% interface=en
+
+\starttext
+
+\setupcolors
+ [state=start]
+
+\startMPpage
+ path p ; color c[] ;
+ p := fullsquare scaled 4cm ;
+ c[0] := transparent(1,.5,red) ;
+ c[1] := transparent(1,.5,green) ;
+ c[2] := transparent(1,.5,blue) ;
+ for i = 0 upto 2 :
+ fill p rotated (i*30) withcolor white ;
+ endfor ;
+ for i = 0 upto 2 :
+ fill p rotated (i*30) withcolor c[i] ;
+ endfor ;
+ addbackground withcolor transparent(1,.5,cmyk(0,0,1,0)) ;
+\stopMPpage
+
+\stoptext \ No newline at end of file
diff --git a/tex/context/sample/demo-tex.tex b/tex/context/sample/demo-tex.tex
new file mode 100644
index 000000000..309a0acfc
--- /dev/null
+++ b/tex/context/sample/demo-tex.tex
@@ -0,0 +1,23 @@
+% interface=en
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [width=middle,
+ height=middle]
+
+\setuphead
+ [chapter]
+ [header=high,
+ style=\bfc,
+ alternative=middle]
+
+\starttext
+
+\title{Peter D. Ward} \processfile{ward}
+\title{Hermann Zapf} \processfile{zapf}
+\title{Bill Bryson} \processfile{bryson}
+\title{Edward R. Tufte} \processfile{tufte}
+
+\stoptext \ No newline at end of file
diff --git a/tex/context/sample/demo-xml.tex b/tex/context/sample/demo-xml.tex
new file mode 100644
index 000000000..bf527a747
--- /dev/null
+++ b/tex/context/sample/demo-xml.tex
@@ -0,0 +1,53 @@
+% interface=en
+
+\defineXMLargument
+ [title] [label=]
+ {\title[\XMLop{label}]}
+
+\defineXMLenvironment
+ [itemize] [packed=]
+ {\doifelseXMLop{packed}{yes}
+ {\startitemize[packed]}
+ {\startitemize}}
+ {\stopitemize}
+
+\defineXMLenvironment
+ [item]
+ {\item}
+ {\par}
+
+\defineXMLenvironment
+ [p]
+ {\ignorespaces}
+ {\par}
+
+\starttext
+
+\startXMLdata
+<title label="example">Just an Example</title>
+
+<p>There are three items:</p>
+
+<itemize packed="yes">
+ <item>Number One</item>
+ <item>Number Two</item>
+ <item>Number Three</item>
+</itemize>
+
+<p>And tree more</p>
+
+<itemize>
+ <item>First Line</item>
+ <item>Second Line</item>
+ <item>Third Line</item>
+</itemize>
+\stopXMLdata
+
+Instead of putting the data in here you can put it in a file, say
+\type {sample.xml} and load that file using:
+
+\starttyping
+\processXMLfilegrouped{sample.xml}
+\stoptyping
+
+\stoptext \ No newline at end of file
diff --git a/tex/context/sample/douglas.tex b/tex/context/sample/douglas.tex
new file mode 100644
index 000000000..cf5fd50f3
--- /dev/null
+++ b/tex/context/sample/douglas.tex
@@ -0,0 +1,23 @@
+Donald Knuth has spent the past several years working on a
+system allowing him to control many aspects of the design
+of his forthcoming books|.|from the typesetting and layout
+down to the very shapes of the letters! Seldom has an
+author had anything remotely like this power to control the
+final appearance of his or her work. Knuth's \TEX\
+typesetting system has become well|-|known and available in
+many countries around the world. By contrast, his
+\METAFONT\ system for designing families of typefaces has
+not become as well known or available.
+
+In his article \quotation {The Concept of a Meta|-|Font},
+Knuth sets forth for the first time the underlying
+philosophy of \METAFONT, as well as some of its products.
+Not only is the concept exiting and clearly well executed,
+but in my opinion the article is charmingly written as well.
+However, despite my overall enthusiasm for Knuth's idea and
+article, there are some points in it that I feel might be
+taken wrongly by many readers, and since they are points
+that touch close to my deepest interests in artificial
+intelligence and esthetic theory, I felt compelled to make
+some comments to clarify certain important issues raised by
+\quotation {The Concept of a Meta|-|Font}.
diff --git a/tex/context/sample/hawking.tex b/tex/context/sample/hawking.tex
new file mode 100644
index 000000000..e0e0cccd2
--- /dev/null
+++ b/tex/context/sample/hawking.tex
@@ -0,0 +1,7 @@
+If [in 2600] you stacked all the new books being published next to
+each other, you would have to move at ninety miles an hour just to
+keep up with the end of the line. Of course, by 2600 new artistic
+and scientific work will come in electronic forms, rather than as
+physical books and paper. Nevertheless, if the exponential growth
+continued, there would be ten papers a second in my kind of
+theoretical physics, and no time to read them.
diff --git a/tex/context/sample/knuth.tex b/tex/context/sample/knuth.tex
new file mode 100644
index 000000000..30b6310cc
--- /dev/null
+++ b/tex/context/sample/knuth.tex
@@ -0,0 +1,16 @@
+Thus, I came to the conclusion that the designer of a new
+system must not only be the implementer and first
+large||scale user; the designer should also write the first
+user manual.
+
+The separation of any of these four components would have
+hurt \TeX\ significantly. If I had not participated fully in
+all these activities, literally hundreds of improvements
+would never have been made, because I would never have
+thought of them or perceived why they were important.
+
+But a system cannot be successful if it is too strongly
+influenced by a single person. Once the initial design is
+complete and fairly robust, the real test begins as people
+with many different viewpoints undertake their own
+experiments.
diff --git a/tex/context/sample/linden.tex b/tex/context/sample/linden.tex
new file mode 100644
index 000000000..9aaccc5e9
--- /dev/null
+++ b/tex/context/sample/linden.tex
@@ -0,0 +1,8 @@
+The warm water spills north and south through a series of ocean currents
+that mirror to some degree the cells in the atmosphere above the water.
+Like the atmospheric cells, for instance, these giant oceanic gears
+---called gyres--- fall unders the influence of the winds and the Coriolis
+effect and form loops that move water first away from the equator, then
+parallel, and then back to rejoin the equatorial currents. The familiar
+Gulf Stream is one of these gyres, and because of its unique characteristics
+it has particular salience to the fortunes of many civilizations.
diff --git a/tex/context/sample/materie.tex b/tex/context/sample/materie.tex
new file mode 100644
index 000000000..5e2597186
--- /dev/null
+++ b/tex/context/sample/materie.tex
@@ -0,0 +1,50 @@
+Zaagh, of Steek||zaagh.
+Domme||kraght.
+Mokers.
+Yzere Wiggen.
+Brandt||yzer.
+Hout||haak.
+Spaander||haak.
+Een Klaas Jacobzen.
+Tange.
+Nagel||hamer.
+Wigge.
+Oor||houten.
+Kluften.
+Hellen.
+Steven||haken.
+Hevels en Klein||touwen.
+Een Koe||voet.
+Schot||bouten.
+Yzere ram.
+Avegaar.
+Een houte Ram.
+Een groote Wigge daar toe.
+Teer||ketel.
+Slyp||steen.
+Een Mal.
+Rye.
+Hout||bok.
+Schraagh.
+Vlotten.
+Een Slee.
+Dwars||slee.
+Kaap||stander.
+Bytels.
+Klavaats||hamer.
+Rabat||yzer.
+Klavaats||yzer.
+Spyker||yzer.
+Werk||bytel.
+Duim||stok.
+Schraper.
+Een Moker.
+Spyker||hamertje.
+Een Roffel.
+Gerf||schaaf.
+Odief.
+Ploegen.
+Handt||zaagh.
+Klamp||spykers||boor, tien duims Boor.
+Dissel.
+Byl.
diff --git a/tex/context/sample/montgomery.tex b/tex/context/sample/montgomery.tex
new file mode 100644
index 000000000..a38357ea4
--- /dev/null
+++ b/tex/context/sample/montgomery.tex
@@ -0,0 +1,13 @@
+Making oil requires a specific series of geological accidents over
+inconceivable amounts of time. First, organic-rich sediment needs to
+be burried faster than it can decay. Then the stuff needs to get pushed
+miles down into the earth's crust to be cooked slowly. Burried too
+deep or cooked too fast and the organic molecules burn off;
+trapped too shallow or not for long enough and the muck never
+turns into oil. Finally, an impermeable layer needs to seal the
+oil in a porous layer of rock from which it can be recovered. Then
+somebody has to find it and get it out of the ground. It takes
+millions of years to produce a barrel of oil; we use millions of
+barrels a day. There is no question that we will run out of oil ---
+the only question is when.
+
diff --git a/tex/context/sample/reich.tex b/tex/context/sample/reich.tex
new file mode 100644
index 000000000..db9d4404f
--- /dev/null
+++ b/tex/context/sample/reich.tex
@@ -0,0 +1,11 @@
+\quotation {Heavy smoke}
+\quotation {Stand by, stand by}
+\quotation {It's full a' smoke}
+\quotation {Full a' smoke}
+\quotation {Urgent}
+\quotation {Guns, knives or weapons on ya?}
+\quotation {Wha' were ya doin'?}
+\quotation {Be careful}
+\quotation {Where you go}
+\quotation {Careful}
+\quotation {Stand by}
diff --git a/tex/context/sample/sample.tex b/tex/context/sample/sample.tex
new file mode 100644
index 000000000..5f97ea009
--- /dev/null
+++ b/tex/context/sample/sample.tex
@@ -0,0 +1,75 @@
+\starttext
+
+The sample directory contains a few files with quotes that can be used
+while testing styles.
+
+I'll complete this file when I've reorganized my books and audio cd's.
+
+If someone makes a nice bibtex file of these, the quotes can also be
+used in testing bibliographic references and citations.
+
+\starttabulate[|l|l|p|]
+\NC \bf file \NC \bf author \NC \bf source \NC \NR
+\HL
+%NC stork.tex \NC David F. Stork \NC \NC \NR
+\NC knuth.tex \NC Donald E. Knuth \NC \NC \NR
+\NC tufte.tex \NC Edward R. Tufte \NC \NC \NR
+\NC reich.tex \NC Steve Reich \NC \NC \NR
+\NC materie.tex \NC Louis Andriessen \NC De Materie \NC \NR
+\NC douglas.tex \NC Douglas R. Hofstadter \NC \NC \NR
+\NC dawkins.tex \NC Dawkins \NC \NC \NR
+\NC ward.tex \NC Peter D. Ward \NC The Life and Death of Planet Earth \NC \NR
+\NC zapf.tex \NC Hermann Zapf \NC About micro-typography and the hz-program, \endgraf
+ Electronic Publishing, vol. 6(3), \endgraf
+ 283-288 (September 1993) \NC \NR
+\NC bryson.tex \NC Bill Bryson \NC A Short History of Nearly Everything, \endgraf
+ Random House, 2003 \NC \NR
+\NC davis.tex \NC Kenneth C. Davis \NC Don't Know Much About History, \endgraf
+ Everything You Need to Know About American
+ History but Never Learned, \endgraf
+ HarperCollins, 2003 \NC \NR
+\NC thuan.tex \NC Trinh Xuan Thuan \NC Chaos and Harmony, Perspectives on Scientific
+ Revolutions of the Twentieth Century, \endgraf
+ Oxford University Press, 2001 \NC \NR
+\NC hawking.tex \NC Steve W. Hawking \NC The Universe in a Nutshell, Bantam Books
+ Random House, 2001 \NC \NR
+\NC linden.tex \NC Eugene Linden \NC The Winds of Change, Climate, Weather, and the
+ Destruction of Civilizations, \endgraf
+ Simon \& Schuster, 2006, p.106 \NC \NR
+\NC weisman.tex \NC Alan Weisman \NC The World Without Us, \endgraf
+ Thomas Dunne Books, 2007, p.160 \NC \NR
+\NC montgomery.tex \NC David R Montgomery \NC Dirt, The Erosion of Civilizations, \endgraf
+ University of California Press, 2007, p.199 \NC \NR
+\NC carrol.tex \NC Sean B. Carrol \NC The Making of the Fittest, \endgraf
+ Quercus, London, 2006 \NC \NR
+%NC schwarzenegger.tex \NC Arnold Schwarzenegger \NC Several place on the World Wide Web. \NC \NR
+\stoptabulate
+
+% Tufte: This quote will always produce hyphenated text, apart from the content,
+% it's a pretty good test case for protruding.
+
+% Ward: I should find a quote in the extremely well written Rare Earth as well. All Wards
+% books excell.
+
+% A Short History of Nearly Everything: I wish that I had the memory to remember this book
+% verbatim.
+
+% Chaos and Harmony: very nice and well written book, but the typography is rather bad:
+% quite visible inter-character spacing in a text that can be typeset quite well by \TeX.
+
+% The Universe in a Nutshell: a beautiful designed book, (companion of A Short History
+% of Time).
+
+% The World Without Us: A properly typeset, very readable book. Read it and you'll look at
+% the world around you differently (and a bit more freightened).
+
+% Dirt, The Erosion of Civilizations: one of those books that you buy immediately after
+% reading a few sentences. Also one of those books that every politician should read.
+
+% The Making of the Fittest: nice sample for color ans subsentence testing. A very
+% readable book but unfortunately it has inter-character spacing.
+
+% The Schwarzenegger letter was originally typeset at a width equivalent to 16.1cm in
+% a default ConTeXt setup.
+
+\stoptext
diff --git a/tex/context/sample/thuan.tex b/tex/context/sample/thuan.tex
new file mode 100644
index 000000000..e38c58489
--- /dev/null
+++ b/tex/context/sample/thuan.tex
@@ -0,0 +1,10 @@
+Had our solar system included two suns, the problem would have
+involved three bodies (the two suns and each planet), and chaos
+would have been immediately obvious. Planets would have had
+erratic and unpredictable orbits, and creatures living on one
+of these planets would never have been able to percieve the
+slightest harmony. Nor would it have occurred to them that the
+universe might be ruled by laws and that it is up to man's
+intellect to discover them. Besides, it is not at all obvious
+that life and conscience could even emerge in such a chaotic
+system. \ No newline at end of file
diff --git a/tex/context/sample/tufte.tex b/tex/context/sample/tufte.tex
new file mode 100644
index 000000000..1b54d2780
--- /dev/null
+++ b/tex/context/sample/tufte.tex
@@ -0,0 +1,13 @@
+We thrive in information||thick worlds because of our
+marvelous and everyday capacity to select, edit,
+single out, structure, highlight, group, pair, merge,
+harmonize, synthesize, focus, organize, condense,
+reduce, boil down, choose, categorize, catalog, classify,
+list, abstract, scan, look into, idealize, isolate,
+discriminate, distinguish, screen, pigeonhole, pick over,
+sort, integrate, blend, inspect, filter, lump, skip,
+smooth, chunk, average, approximate, cluster, aggregate,
+outline, summarize, itemize, review, dip into,
+flip through, browse, glance into, leaf through, skim,
+refine, enumerate, glean, synopsize, winnow the wheat
+from the chaff and separate the sheep from the goats.
diff --git a/tex/context/sample/ward.tex b/tex/context/sample/ward.tex
new file mode 100644
index 000000000..f73b62a58
--- /dev/null
+++ b/tex/context/sample/ward.tex
@@ -0,0 +1,5 @@
+The Earth, as a habitat for animal life, is in old age and
+has a fatal illness. Several, in fact. It would be happening
+whether humans had ever evolved or not. But our presence is
+like the effect of an old|-|age patient who smokes many packs
+of cigarettes per day |=| and we humans are the cigarettes.
diff --git a/tex/context/sample/weisman.tex b/tex/context/sample/weisman.tex
new file mode 100644
index 000000000..7526d407a
--- /dev/null
+++ b/tex/context/sample/weisman.tex
@@ -0,0 +1,5 @@
+Since the mid-1990s, humans have taken an unprecedented step in Earthly
+annals by introducing not just exotic flora or fauna from one ecosystem
+into another, but actually inserting exotic genes into the operating
+systems of individual plants and animals, where they're intended to do
+exactly the same thing: copy themselves, over and over.
diff --git a/tex/context/sample/zapf.tex b/tex/context/sample/zapf.tex
new file mode 100644
index 000000000..4029ec6ce
--- /dev/null
+++ b/tex/context/sample/zapf.tex
@@ -0,0 +1,11 @@
+Coming back to the use of typefaces in electronic
+publishing: many of the new typographers receive their
+knowledge and information about the rules of typography
+from books, from computer magazines or the instruction
+manuals which they get with the purchase of a PC or
+software. There is not so much basic instruction, as of
+now, as there was in the old days, showing the differences
+between good and bad typographic design. Many people are
+just fascinated by their PC's tricks, and think that a
+widely||praised program, called up on the screen, will make
+everything automatic from now on.
diff --git a/tex/context/test/context-test.tex b/tex/context/test/context-test.tex
new file mode 100644
index 000000000..3cf002baf
--- /dev/null
+++ b/tex/context/test/context-test.tex
@@ -0,0 +1,27 @@
+\starttext
+
+\startmode[mkiv]
+
+ \startluacode
+ tex.sprint("hello")
+ \stopluacode
+
+ \startMPcode
+ draw textext("hello") rotated 45 ;
+ \stopMPcode
+
+ \framed{hello}
+
+\stopmode
+
+\startnotmode[mkiv]
+
+ \startMPcode
+ draw textext("hello") rotated -45 ;
+ \stopMPcode
+
+ \framed{hello}
+
+\stopnotmode
+
+\stoptext
diff --git a/tex/context/user/cont-sys.rme b/tex/context/user/cont-sys.rme
new file mode 100644
index 000000000..11c0141e7
--- /dev/null
+++ b/tex/context/user/cont-sys.rme
@@ -0,0 +1,182 @@
+%D \module
+%D [ file=cont-sys,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=System Specific Setups,
+%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
+
+% Speed up typescript loading, but at the cost of much memory:
+
+\preloadtypescripts
+
+% If you want another default font:
+%
+% \let\preloadfonts\relax
+% \usetypescript[palatino][\defaultencoding]
+% \setupbodyfont[palatino,rm,12pt]
+%
+% Please make sure that this defines rm, ss, tt and mm.
+
+% Occasionally we will support both A4 and letter in
+% styles. If you want letter size paper to be the default,
+% uncomment:
+%
+% \enablemode[\systemmodeprefix letter]
+%
+% If you always want to default to letter, you may uncomment
+% the following line, but beware: it makes your documents less
+% portable:
+%
+% \setuppapersize[letter][letter]
+
+% If you want some extras, just uncomment the following
+% line:
+%
+% \usemodule[plus] % experimental code
+%
+% Here you can take care of overloading some (style)
+% defaults. What goes here, depends on your local system.
+
+% The following commands sets the default font encoding:
+%
+% \setupencoding [\s!default=texnansi]
+%
+% or:
+
+\setupencoding [\s!default=ec]
+
+% If you want the default berry names:
+%
+% \usetypescript [berry] [\defaultencoding]
+%
+% or, if you also want other encodings:
+
+\usetypescript [berry] [ec,t5,8r] % texnansi is never present
+
+% If you run into missing font metrics kind of problems,
+% you may want to uncomment:
+%
+% \usetypescript[adobekb] [\defaultencoding]
+
+% You can let \CONTEXT\ load the map files for \PDFTEX.
+
+\autoloadmapfilestrue
+
+% (1) you can prevent loading with:
+%
+% \preloadmapfile[<...somename...>.map]
+%
+% (2) otherwise, use this if you have a fast machine
+%
+% \resetmapfiles \usetypescript [map] [base] [all]
+%
+% (3) or this if it's a slow one:
+
+\resetmapfiles
+
+% more recent versions of pdftex support map loading on each page
+
+\donefalse \ifx\pdftexversion\undefined \else \ifnum\number\pdftexversion>119
+ \donetrue
+\fi \fi \ifdone
+
+ \loadmapfile[original-base.map]
+ \loadmapfile[original-ams-base.map]
+ \loadmapfile[original-ams-euler.map]
+ \loadmapfile[original-public-lm.map]
+
+\else
+
+ \loadmapfile[original-base.map]
+ \loadmapfile[texnansi-base.map]
+ \loadmapfile[ec-base.map]
+ \loadmapfile[qx-base.map]
+ \loadmapfile[t5-base.map]
+ %loadmapfile[il2-base.map]
+ %loadmapfile[pl0-base.map]
+ \loadmapfile[8r-base.map]
+
+ \loadmapfile[original-ams-base.map]
+ \loadmapfile[original-ams-euler.map]
+
+ \loadmapfile[original-public-lm.map]
+
+ %loadmapfile[texnansi-public-lm.map]
+ %loadmapfile[ec-public-lm.map]
+ %loadmapfile[qx-public-lm.map]
+ %loadmapfile[t5-public-lm.map]
+ %loadmapfile[pl0-public-lm.map]
+ %loadmapfile[il2-public-lm.map]
+
+\fi
+
+% When you have your own fonts installed, you may want to predefine:
+%
+% \usetypescriptfile[type-buy]
+
+% Some styles default to Lucida Bright. You can overload
+% Lucida by Times cum suis. Watch out, the pos collection
+% is not scaled relatively.
+%
+% \definetypescriptsynonym [lbr] [pos]
+
+% Compensate for missing files:
+%
+% \definefontsynonym [gbhei] [gbsong]
+% \definefontsynonym [gbheisl] [gbsong]
+% \definefontsynonym [gbheisl] [gbsong]
+
+% Setting up a global figure path
+%
+% \setupexternalfigures [\c!directory={e:/fig/eps,t:/mine/figs}]
+%
+% Loading a specific special driver:
+%
+% \setupoutput [dviwindo]
+
+% Changing language defaults
+%
+% \setuplanguage
+% [nl]
+% [\c!leftquote=\upperleftsinglesixquote,
+% \c!leftquotation=\upperleftdoublesixquote]
+
+% Loading local preferences, for example
+%
+% \input prag-gen % company styles
+% \input prag-log % more company styles
+%
+% Enabling run time \METAPOST\ (also enable \write18 in
+% texmf.cnf):
+
+\runMPgraphicstrue
+\runMPTEXgraphicstrue
+
+% This saves some runtime, but needs a format, which you can
+% make with 'texexec --make --alone metafun'. Make sure that
+% the mem files are moved to the used web2c path (locate with
+% 'kpsewhich plain.mem').
+
+\useMETAFUNformattrue
+
+% This can be a way to get things working on system with
+% name clashes. (Some \TeX's tend do search system wide.)
+
+\protectbufferstrue
+
+% You can enable a more extensive figure searching, but
+% normally this is not really needed and even annoying.
+%
+% \runutilityfiletrue
+
+% So far.
+
+\protect \endinput
diff --git a/tex/generic/context/luatex-basics.tex b/tex/generic/context/luatex-basics.tex
new file mode 100644
index 000000000..8308204d5
--- /dev/null
+++ b/tex/generic/context/luatex-basics.tex
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=luatex-basics,
+%D version=2009.12.01,
+%D title=\LUATEX\ Support Macros,
+%D subtitle=Attribute Allocation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=public domain]
+
+%D As soon as we feel the need this file will file will contain an extension
+%D to the standard plain register allocation. For the moment we stick to a
+%D rather dumb attribute allocator. We start at 256 because we don't want
+%D any interference with the attributes used in the font handler.
+
+\newcount \lastallocatedattribute \lastallocatedattribute=255
+
+\def\newattribute#1%
+ {\global\advance\lastallocatedattribute 1
+ \attributedef#1\lastallocatedattribute}
+
+\endinput
diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua
new file mode 100644
index 000000000..da81735ff
--- /dev/null
+++ b/tex/generic/context/luatex-fonts-merged.lua
@@ -0,0 +1,12389 @@
+-- merged file : luatex-fonts-merged.lua
+-- parent file : luatex-fonts.lua
+-- merge date : 05/24/10 13:05:12
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['l-string'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
+local lpegmatch = lpeg.match
+
+-- some functions may disappear as they are not used anywhere
+
+if not string.split then
+
+ -- this will be overloaded by a faster lpeg variant
+
+ function string:split(pattern)
+ if #self > 0 then
+ local t = { }
+ for s in gmatch(self..pattern,"(.-)"..pattern) do
+ t[#t+1] = s
+ end
+ return t
+ else
+ return { }
+ end
+ end
+
+end
+
+local chr_to_esc = {
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["^"] = "%^", ["$"] = "%$",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ ["{"] = "%{", ["}"] = "%}"
+}
+
+string.chr_to_esc = chr_to_esc
+
+function string:esc() -- variant 2
+ return (gsub(self,"(.)",chr_to_esc))
+end
+
+function string:unquote()
+ return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+end
+
+--~ function string:unquote()
+--~ if find(self,"^[\'\"]") then
+--~ return sub(self,2,-2)
+--~ else
+--~ return self
+--~ end
+--~ end
+
+function string:quote() -- we could use format("%q")
+ return format("%q",self)
+end
+
+function string:count(pattern) -- variant 3
+ local n = 0
+ for _ in gmatch(self,pattern) do
+ n = n + 1
+ end
+ return n
+end
+
+function string:limit(n,sentinel)
+ if #self > n then
+ sentinel = sentinel or " ..."
+ return sub(self,1,(n-#sentinel)) .. sentinel
+ else
+ return self
+ end
+end
+
+--~ function string:strip() -- the .- is quite efficient
+--~ -- return match(self,"^%s*(.-)%s*$") or ""
+--~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
+--~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
+--~ end
+
+do -- roberto's variant:
+ local space = lpeg.S(" \t\v\n")
+ local nospace = 1 - space
+ local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
+ function string.strip(str)
+ return lpegmatch(stripper,str) or ""
+ end
+end
+
+function string:is_empty()
+ return not find(self,"%S")
+end
+
+function string:enhance(pattern,action)
+ local ok, n = true, 0
+ while ok do
+ ok = false
+ self = gsub(self,pattern, function(...)
+ ok, n = true, n + 1
+ return action(...)
+ end)
+ end
+ return self, n
+end
+
+local chr_to_hex, hex_to_chr = { }, { }
+
+for i=0,255 do
+ local c, h = char(i), format("%02X",i)
+ chr_to_hex[c], hex_to_chr[h] = h, c
+end
+
+function string:to_hex()
+ return (gsub(self or "","(.)",chr_to_hex))
+end
+
+function string:from_hex()
+ return (gsub(self or "","(..)",hex_to_chr))
+end
+
+if not string.characters then
+
+ local function nextchar(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, sub(str,index,index)
+ end
+ function string:characters()
+ return nextchar, self, 0
+ end
+ local function nextbyte(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, byte(sub(str,index,index))
+ end
+ function string:bytes()
+ return nextbyte, self, 0
+ end
+
+end
+
+-- we can use format for this (neg n)
+
+function string:rpadd(n,chr)
+ local m = n-#self
+ if m > 0 then
+ return self .. rep(chr or " ",m)
+ else
+ return self
+ end
+end
+
+function string:lpadd(n,chr)
+ local m = n-#self
+ if m > 0 then
+ return rep(chr or " ",m) .. self
+ else
+ return self
+ end
+end
+
+string.padd = string.rpadd
+
+function is_number(str) -- tonumber
+ return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+end
+
+--~ print(is_number("1"))
+--~ print(is_number("1.1"))
+--~ print(is_number(".1"))
+--~ print(is_number("-0.1"))
+--~ print(is_number("+0.1"))
+--~ print(is_number("-.1"))
+--~ print(is_number("+.1"))
+
+function string:split_settings() -- no {} handling, see l-aux for lpeg variant
+ if find(self,"=") then
+ local t = { }
+ for k,v in gmatch(self,"(%a+)=([^%,]*)") do
+ t[k] = v
+ end
+ return t
+ else
+ return nil
+ end
+end
+
+local patterns_escapes = {
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["+"] = "%+",
+ ["*"] = "%*",
+ ["%"] = "%%",
+ ["("] = "%)",
+ [")"] = "%)",
+ ["["] = "%[",
+ ["]"] = "%]",
+}
+
+function string:pattesc()
+ return (gsub(self,".",patterns_escapes))
+end
+
+local simple_escapes = {
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+function string:simpleesc()
+ return (gsub(self,".",simple_escapes))
+end
+
+function string:tohash()
+ local t = { }
+ for s in gmatch(self,"([^, ]+)") do -- lpeg
+ t[s] = true
+ end
+ return t
+end
+
+local pattern = lpeg.Ct(lpeg.C(1)^0)
+
+function string:totable()
+ return lpegmatch(pattern,self)
+end
+
+--~ local t = {
+--~ "1234567123456712345671234567",
+--~ "a\tb\tc",
+--~ "aa\tbb\tcc",
+--~ "aaa\tbbb\tccc",
+--~ "aaaa\tbbbb\tcccc",
+--~ "aaaaa\tbbbbb\tccccc",
+--~ "aaaaaa\tbbbbbb\tcccccc",
+--~ }
+--~ for k,v do
+--~ print(string.tabtospace(t[k]))
+--~ end
+
+function string.tabtospace(str,tab)
+ -- we don't handle embedded newlines
+ while true do
+ local s = find(str,"\t")
+ if s then
+ if not tab then tab = 7 end -- only when found
+ local d = tab-(s-1) % tab
+ if d > 0 then
+ str = gsub(str,"\t",rep(" ",d),1)
+ else
+ str = gsub(str,"\t","",1)
+ end
+ else
+ break
+ end
+ end
+ return str
+end
+
+function string:compactlong() -- strips newlines and leading spaces
+ self = gsub(self,"[\n\r]+ *","")
+ self = gsub(self,"^ *","")
+ return self
+end
+
+function string:striplong() -- strips newlines and leading spaces
+ self = gsub(self,"^%s*","")
+ self = gsub(self,"[\n\r]+ *","\n")
+ return self
+end
+
+function string:topattern(lowercase,strict)
+ if lowercase then
+ self = lower(self)
+ end
+ self = gsub(self,".",simple_escapes)
+ if self == "" then
+ self = ".*"
+ elseif strict then
+ self = "^" .. self .. "$"
+ end
+ return self
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['l-lpeg'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local lpeg = require("lpeg")
+
+lpeg.patterns = lpeg.patterns or { } -- so that we can share
+local patterns = lpeg.patterns
+
+local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
+local match = lpeg.match
+
+local digit, sign = R('09'), S('+-')
+local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
+local utf8byte = R("\128\191")
+
+patterns.utf8byte = utf8byte
+patterns.utf8one = R("\000\127")
+patterns.utf8two = R("\194\223") * utf8byte
+patterns.utf8three = R("\224\239") * utf8byte * utf8byte
+patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+
+patterns.digit = digit
+patterns.sign = sign
+patterns.cardinal = sign^0 * digit^1
+patterns.integer = sign^0 * digit^1
+patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.number = patterns.float + patterns.integer
+patterns.oct = P("0") * R("07")^1
+patterns.octal = patterns.oct
+patterns.HEX = P("0x") * R("09","AF")^1
+patterns.hex = P("0x") * R("09","af")^1
+patterns.hexadecimal = P("0x") * R("09","AF","af")^1
+patterns.lowercase = R("az")
+patterns.uppercase = R("AZ")
+patterns.letter = patterns.lowercase + patterns.uppercase
+patterns.space = S(" ")
+patterns.eol = S("\n\r")
+patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
+patterns.newline = crlf + cr + lf
+patterns.nonspace = 1 - patterns.space
+patterns.nonspacer = 1 - patterns.spacer
+patterns.whitespace = patterns.eol + patterns.spacer
+patterns.nonwhitespace = 1 - patterns.whitespace
+patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+
+function lpeg.anywhere(pattern) --slightly adapted from website
+ return P { P(pattern) + 1 * V(1) } -- why so complex?
+end
+
+function lpeg.splitter(pattern, action)
+ return (((1-P(pattern))^1)/action+1)^0
+end
+
+local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+local capture = Ct(content^0)
+
+function string:splitlines()
+ return match(capture,self)
+end
+
+patterns.textline = content
+
+--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
+--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
+--~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
+--~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
+
+local splitters_s, splitters_m = { }, { }
+
+local function splitat(separator,single)
+ local splitter = (single and splitters_s[separator]) or splitters_m[separator]
+ if not splitter then
+ separator = P(separator)
+ if single then
+ local other, any = C((1 - separator)^0), P(1)
+ splitter = other * (separator * C(any^0) + "") -- ?
+ splitters_s[separator] = splitter
+ else
+ local other = C((1 - separator)^0)
+ splitter = other * (separator * other)^0
+ splitters_m[separator] = splitter
+ end
+ end
+ return splitter
+end
+
+lpeg.splitat = splitat
+
+local cache = { }
+
+function lpeg.split(separator,str)
+ local c = cache[separator]
+ if not c then
+ c = Ct(splitat(separator))
+ cache[separator] = c
+ end
+ return match(c,str)
+end
+
+function string:split(separator)
+ local c = cache[separator]
+ if not c then
+ c = Ct(splitat(separator))
+ cache[separator] = c
+ end
+ return match(c,self)
+end
+
+lpeg.splitters = cache
+
+local cache = { }
+
+function lpeg.checkedsplit(separator,str)
+ local c = cache[separator]
+ if not c then
+ separator = P(separator)
+ local other = C((1 - separator)^0)
+ c = Ct(separator^0 * other * (separator^1 * other)^0)
+ cache[separator] = c
+ end
+ return match(c,str)
+end
+
+function string:checkedsplit(separator)
+ local c = cache[separator]
+ if not c then
+ separator = P(separator)
+ local other = C((1 - separator)^0)
+ c = Ct(separator^0 * other * (separator^1 * other)^0)
+ cache[separator] = c
+ end
+ return match(c,self)
+end
+
+--~ function lpeg.append(list,pp)
+--~ local p = pp
+--~ for l=1,#list do
+--~ if p then
+--~ p = p + P(list[l])
+--~ else
+--~ p = P(list[l])
+--~ end
+--~ end
+--~ return p
+--~ end
+
+--~ from roberto's site:
+
+local f1 = string.byte
+
+local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2 - 12416 end
+local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
+local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
+
+patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['l-boolean'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+boolean = boolean or { }
+
+local type, tonumber = type, tonumber
+
+function boolean.tonumber(b)
+ if b then return 1 else return 0 end
+end
+
+function toboolean(str,tolerant)
+ if tolerant then
+ local tstr = type(str)
+ if tstr == "string" then
+ return str == "true" or str == "yes" or str == "on" or str == "1" or str == "t"
+ elseif tstr == "number" then
+ return tonumber(str) ~= 0
+ elseif tstr == "nil" then
+ return false
+ else
+ return str
+ end
+ elseif str == "true" then
+ return true
+ elseif str == "false" then
+ return false
+ else
+ return str
+ end
+end
+
+function string.is_boolean(str)
+ if type(str) == "string" then
+ if str == "true" or str == "yes" or str == "on" or str == "t" then
+ return true
+ elseif str == "false" or str == "no" or str == "off" or str == "f" then
+ return false
+ end
+ end
+ return nil
+end
+
+function boolean.alwaystrue()
+ return true
+end
+
+function boolean.falsetrue()
+ return false
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['l-math'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local floor, sin, cos, tan = math.floor, math.sin, math.cos, math.tan
+
+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
+
+local pipi = 2*math.pi/360
+
+function math.sind(d)
+ return sin(d*pipi)
+end
+
+function math.cosd(d)
+ return cos(d*pipi)
+end
+
+function math.tand(d)
+ return tan(d*pipi)
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['l-table'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+table.join = table.concat
+
+local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
+local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
+local getmetatable, setmetatable = getmetatable, setmetatable
+local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
+
+-- Starting with version 5.2 Lua no longer provide ipairs, which makes
+-- sense. As we already used the for loop and # in most places the
+-- impact on ConTeXt was not that large; the remaining ipairs already
+-- have been replaced. In a similar fashio we also hardly used pairs.
+--
+-- Just in case, we provide the fallbacks as discussed in Programming
+-- in Lua (http://www.lua.org/pil/7.3.html):
+
+if not ipairs then
+
+ -- for k, v in ipairs(t) do ... end
+ -- for k=1,#t do local v = t[k] ... end
+
+ local function iterate(a,i)
+ i = i + 1
+ local v = a[i]
+ if v ~= nil then
+ return i, v --, nil
+ end
+ end
+
+ function ipairs(a)
+ return iterate, a, 0
+ end
+
+end
+
+if not pairs then
+
+ -- for k, v in pairs(t) do ... end
+ -- for k, v in next, t do ... end
+
+ function pairs(t)
+ return next, t -- , nil
+ end
+
+end
+
+-- Also, unpack has been moved to the table table, and for compatiility
+-- reasons we provide both now.
+
+if not table.unpack then
+ table.unpack = _G.unpack
+elseif not unpack then
+ _G.unpack = table.unpack
+end
+
+-- extra functions, some might go (when not used)
+
+function table.strip(tab)
+ local lst = { }
+ for i=1,#tab do
+ local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
+ if s == "" then
+ -- skip this one
+ else
+ lst[#lst+1] = s
+ end
+ end
+ return lst
+end
+
+function table.keys(t)
+ local k = { }
+ for key, _ in next, t do
+ k[#k+1] = key
+ end
+ return k
+end
+
+local function compare(a,b)
+ return (tostring(a) < tostring(b))
+end
+
+local function sortedkeys(tab)
+ local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ for key,_ in next, tab do
+ srt[#srt+1] = key
+ if kind == 3 then
+ -- no further check
+ else
+ local tkey = type(key)
+ if tkey == "string" then
+ -- if kind == 2 then kind = 3 else kind = 1 end
+ kind = (kind == 2 and 3) or 1
+ elseif tkey == "number" then
+ -- if kind == 1 then kind = 3 else kind = 2 end
+ kind = (kind == 1 and 3) or 2
+ else
+ kind = 3
+ end
+ end
+ end
+ if kind == 0 or kind == 3 then
+ sort(srt,compare)
+ else
+ sort(srt)
+ end
+ return srt
+end
+
+local function sortedhashkeys(tab) -- fast one
+ local srt = { }
+ for key,_ in next, tab do
+ srt[#srt+1] = key
+ end
+ sort(srt)
+ return srt
+end
+
+table.sortedkeys = sortedkeys
+table.sortedhashkeys = sortedhashkeys
+
+function table.sortedhash(t)
+ local s = sortedhashkeys(t) -- maybe just sortedkeys
+ local n = 0
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+end
+
+table.sortedpairs = table.sortedhash
+
+function table.append(t, list)
+ for _,v in next, list do
+ insert(t,v)
+ end
+end
+
+function table.prepend(t, list)
+ for k,v in next, list do
+ insert(t,k,v)
+ end
+end
+
+function table.merge(t, ...) -- first one is target
+ t = t or {}
+ local lst = {...}
+ for i=1,#lst do
+ for k, v in next, lst[i] do
+ t[k] = v
+ end
+ end
+ return t
+end
+
+function table.merged(...)
+ local tmp, lst = { }, {...}
+ for i=1,#lst do
+ for k, v in next, lst[i] do
+ tmp[k] = v
+ end
+ end
+ return tmp
+end
+
+function table.imerge(t, ...)
+ local lst = {...}
+ for i=1,#lst do
+ local nst = lst[i]
+ for j=1,#nst do
+ t[#t+1] = nst[j]
+ end
+ end
+ return t
+end
+
+function table.imerged(...)
+ local tmp, lst = { }, {...}
+ for i=1,#lst do
+ local nst = lst[i]
+ for j=1,#nst do
+ tmp[#tmp+1] = nst[j]
+ end
+ end
+ return tmp
+end
+
+local function fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in next, old do
+ if type(v) == "table" then
+ new[k] = fastcopy(v) -- was just table.copy
+ else
+ new[k] = v
+ end
+ end
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
+ return new
+ else
+ return { }
+ end
+end
+
+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 next, 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]
+ else
+ tcopy[i] = copy(v, tables)
+ end
+ end
+ local mt = getmetatable(t)
+ if mt then
+ setmetatable(tcopy,mt)
+ end
+ return tcopy
+end
+
+table.fastcopy = fastcopy
+table.copy = copy
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
+end
+
+function table.replace(a,b)
+ for k,v in next, b do
+ a[k] = v
+ end
+end
+
+-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
+
+function table.is_empty(t) -- obolete, use inline code instead
+ return not t or not next(t)
+end
+
+function table.one_entry(t) -- obolete, use inline code instead
+ local n = next(t)
+ return n and not next(t,n)
+end
+
+--~ function table.starts_at(t) -- obsolete, not nice anyway
+--~ return ipairs(t,1)(t,0)
+--~ end
+
+function table.tohash(t,value)
+ local h = { }
+ if t then
+ if value == nil then value = true end
+ for _, v in next, t do -- no ipairs here
+ h[v] = value
+ end
+ end
+ return h
+end
+
+function table.fromhash(t)
+ local h = { }
+ for k, v in next, 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")
+--~ print(table.serialize(t,false), "\n")
+--~ print(table.serialize(t,true), "\n")
+--~ print(table.serialize(t,"name",true), "\n")
+--~ print(table.serialize(t,"name",true,true), "\n")
+
+table.serialize_functions = true
+table.serialize_compact = true
+table.serialize_inline = true
+
+local noquotes, hexify, handle, reduce, compact, inline, functions
+
+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 simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in next, 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] = format("0x%04X",v)
+ else
+ tt[#tt+1] = tostring(v) -- tostring not needed
+ end
+ elseif tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = format("%q",v)
+ else
+ tt = nil
+ break
+ end
+ end
+ return tt
+ end
+ end
+ return nil
+end
+
+-- Because this is a core function of mkiv I moved some function calls
+-- inline.
+--
+-- twice as fast in a test:
+--
+-- local propername = lpeg.P(lpeg.R("AZ","az","__") * lpeg.R("09","AZ","az", "__")^0 * lpeg.P(-1) )
+
+-- problem: there no good number_to_string converter with the best resolution
+
+local function do_serialize(root,name,depth,level,indexed)
+ if level > 0 then
+ depth = depth .. " "
+ if indexed then
+ handle(format("%s{",depth))
+ elseif name then
+ --~ handle(format("%s%s={",depth,key(name)))
+ if type(name) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s[0x%04X]={",depth,name))
+ else
+ handle(format("%s[%s]={",depth,name))
+ end
+ elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ else
+ handle(format("%s{",depth))
+ end
+ end
+ -- we could check for k (index) being number (cardinal)
+ if root and next(root) then
+ local first, last = nil, 0 -- #root cannot be trusted here (will be ok in 5.2 when ipairs is gone)
+ if compact then
+ -- NOT: for k=1,#root do (we need to quit at nil)
+ for k,v in ipairs(root) do -- can we use next?
+ if not first then first = k end
+ last = last + 1
+ end
+ 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(format("%s 0x%04X,",depth,v))
+ else
+ handle(format("%s %s,",depth,v)) -- %.99g
+ end
+ elseif t == "string" then
+ if reduce and tonumber(v) then
+ handle(format("%s %s,",depth,v))
+ else
+ handle(format("%s %q,",depth,v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(format("%s {},",depth))
+ elseif inline then -- and #t > 0
+ local st = simple_table(v)
+ if st then
+ handle(format("%s { %s },",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(format("%s %s,",depth,tostring(v)))
+ elseif t == "function" then
+ if functions then
+ handle(format('%s loadstring(%q),',depth,dump(v)))
+ else
+ handle(format('%s "function",',depth))
+ end
+ else
+ handle(format("%s %q,",depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(format("%s __p__=nil,",depth))
+ end
+ elseif t == "number" then
+ --~ if hexify then
+ --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
+ --~ else
+ --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
+ --~ end
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
+ else
+ handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ if hexify then
+ handle(format("%s %s=0x%04X,",depth,k,v))
+ else
+ handle(format("%s %s=%s,",depth,k,v)) -- %.99g
+ end
+ else
+ if hexify then
+ handle(format("%s [%q]=0x%04X,",depth,k,v))
+ else
+ handle(format("%s [%q]=%s,",depth,k,v)) -- %.99g
+ end
+ end
+ elseif t == "string" then
+ if reduce and tonumber(v) then
+ --~ handle(format("%s %s=%s,",depth,key(k),v))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%s,",depth,k,v))
+ else
+ handle(format("%s [%s]=%s,",depth,k,v))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%s,",depth,k,v))
+ else
+ handle(format("%s [%q]=%s,",depth,k,v))
+ end
+ else
+ --~ handle(format("%s %s=%q,",depth,key(k),v))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%q,",depth,k,v))
+ else
+ handle(format("%s [%s]=%q,",depth,k,v))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%q,",depth,k,v))
+ else
+ handle(format("%s [%q]=%q,",depth,k,v))
+ end
+ end
+ elseif t == "table" then
+ if not next(v) then
+ --~ handle(format("%s %s={},",depth,key(k)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]={},",depth,k))
+ else
+ handle(format("%s [%s]={},",depth,k))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s={},",depth,k))
+ else
+ handle(format("%s [%q]={},",depth,k))
+ end
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
+ else
+ handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
+ else
+ handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
+ end
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ else
+ do_serialize(v,k,depth,level+1)
+ end
+ elseif t == "boolean" then
+ --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%s]=%s,",depth,k,tostring(v)))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%s,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%q]=%s,",depth,k,tostring(v)))
+ end
+ elseif t == "function" then
+ if functions then
+ --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
+ else
+ handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
+ else
+ handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ end
+ end
+ else
+ --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
+ if type(k) == "number" then -- or find(k,"^%d+$") then
+ if hexify then
+ handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%s]=%q,",depth,k,tostring(v)))
+ end
+ elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
+ handle(format("%s %s=%q,",depth,k,tostring(v)))
+ else
+ handle(format("%s [%q]=%q,",depth,k,tostring(v)))
+ end
+ end
+ --~ end
+ end
+ end
+ if level > 0 then
+ handle(format("%s},",depth))
+ end
+end
+
+-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
+-- faster (0.03 on 1.00 for zapfino.tma)
+
+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
+ 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
+
+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()
+ end
+end
+
+local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
+ 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.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+end
+
+table.flatten_one_level = table.unnest
+
+-- a better one:
+
+local function flattened(t,f)
+ if not f then
+ f = { }
+ end
+ for k, v in next, t do
+ if type(v) == "table" then
+ flattened(v,f)
+ else
+ f[k] = v
+ end
+ end
+ return f
+end
+
+table.flattened = flattened
+
+-- 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)
+ 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
+end
+
+function table.insert_after_value(t,value,str)
+ 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
+end
+
+local function are_equal(a,b,n,m) -- indexed
+ if a and b and #a == #b then
+ n = n or 1
+ m = m or #a
+ for i=n,m do
+ local ai, bi = a[i], b[i]
+ if ai==bi then
+ -- same
+ elseif type(ai)=="table" and type(bi)=="table" then
+ if not are_equal(ai,bi) then
+ return false
+ end
+ else
+ return false
+ end
+ end
+ return true
+ else
+ return false
+ end
+end
+
+local function identical(a,b) -- assumes same structure
+ for ka, va in next, a do
+ local vb = b[k]
+ if va == vb then
+ -- same
+ elseif type(va) == "table" and type(vb) == "table" then
+ if not identical(va,vb) then
+ return false
+ end
+ else
+ return false
+ end
+ end
+ return true
+end
+
+table.are_equal = are_equal
+table.identical = identical
+
+-- maybe also make a combined one
+
+function table.compact(t)
+ if t then
+ for k,v in next, t do
+ if not next(v) then
+ t[k] = nil
+ end
+ end
+ end
+end
+
+function table.contains(t, v)
+ if t then
+ for i=1, #t do
+ if t[i] == v then
+ return i
+ end
+ end
+ end
+ return false
+end
+
+function table.count(t)
+ local n, e = 0, next(t)
+ while e do
+ n, e = n + 1, next(t,e)
+ end
+ return n
+end
+
+function table.swapped(t)
+ local s = { }
+ for k, v in next, t do
+ s[v] = k
+ end
+ return s
+end
+
+--~ function table.are_equal(a,b)
+--~ return table.serialize(a) == table.serialize(b)
+--~ end
+
+function table.clone(t,p) -- t is optional or nil or table
+ if not p then
+ t, p = { }, t or { }
+ elseif not t then
+ t = { }
+ end
+ setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
+ return t
+end
+
+function table.hexed(t,seperator)
+ local tt = { }
+ for i=1,#t do tt[i] = format("0x%04X",t[i]) end
+ return concat(tt,seperator or " ")
+end
+
+function table.reverse_hash(h)
+ local r = { }
+ for k,v in next, h do
+ r[v] = lower(gsub(k," ",""))
+ end
+ return r
+end
+
+function table.reverse(t)
+ local tt = { }
+ if #t > 0 then
+ for i=#t,1,-1 do
+ tt[#tt+1] = t[i]
+ end
+ end
+ return tt
+end
+
+function table.insert_before_value(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,extra)
+ return
+ end
+ end
+ insert(t,1,extra)
+end
+
+function table.insert_after_value(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,extra)
+ return
+ end
+ end
+ insert(t,#t+1,extra)
+end
+
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['l-file'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- needs a cleanup
+
+file = file or { }
+
+local concat = table.concat
+local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local lpegmatch = lpeg.match
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
+end
+
+function file.addsuffix(filename, suffix)
+ if not suffix or suffix == "" then
+ return filename
+ elseif not find(filename,"%.[%a%d]+$") then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+end
+
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
+
+function file.dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
+end
+
+function file.basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
+end
+
+function file.nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+end
+
+function file.extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
+end
+
+file.suffix = file.extname
+
+--~ function file.join(...)
+--~ local pth = concat({...},"/")
+--~ pth = gsub(pth,"\\","/")
+--~ local a, b = match(pth,"^(.*://)(.*)$")
+--~ if a and b then
+--~ return a .. gsub(b,"//+","/")
+--~ end
+--~ a, b = match(pth,"^(//)(.*)$")
+--~ if a and b then
+--~ return a .. gsub(b,"//+","/")
+--~ end
+--~ return (gsub(pth,"//+","/"))
+--~ end
+
+local trick_1 = char(1)
+local trick_2 = "^" .. trick_1 .. "/+"
+
+function file.join(...)
+ local lst = { ... }
+ local a, b = lst[1], lst[2]
+ if a == "" then
+ lst[1] = trick_1
+ elseif b and find(a,"^/+$") and find(b,"^/") then
+ lst[1] = ""
+ lst[2] = gsub(b,"^/+","")
+ end
+ local pth = concat(lst,"/")
+ pth = gsub(pth,"\\","/")
+ local a, b = match(pth,"^(.*://)(.*)$")
+ if a and b then
+ return a .. gsub(b,"//+","/")
+ end
+ a, b = match(pth,"^(//)(.*)$")
+ if a and b then
+ return a .. gsub(b,"//+","/")
+ end
+ pth = gsub(pth,trick_2,"")
+ return (gsub(pth,"//+","/"))
+end
+
+--~ print(file.join("//","/y"))
+--~ print(file.join("/","/y"))
+--~ print(file.join("","/y"))
+--~ print(file.join("/x/","/y"))
+--~ print(file.join("x/","/y"))
+--~ print(file.join("http://","/y"))
+--~ print(file.join("http://a","/y"))
+--~ print(file.join("http:///a","/y"))
+--~ print(file.join("//nas-1","/y"))
+
+function file.iswritable(name)
+ local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+ return a and sub(a.permissions,2,2) == "w"
+end
+
+function file.isreadable(name)
+ local a = lfs.attributes(name)
+ return a and sub(a.permissions,1,1) == "r"
+end
+
+file.is_readable = file.isreadable
+file.is_writable = file.iswritable
+
+-- todo: lpeg
+
+--~ function file.split_path(str)
+--~ local t = { }
+--~ str = gsub(str,"\\", "/")
+--~ str = gsub(str,"(%a):([;/])", "%1\001%2")
+--~ for name in gmatch(str,"([^;:]+)") do
+--~ if name ~= "" then
+--~ t[#t+1] = gsub(name,"\001",":")
+--~ end
+--~ end
+--~ return t
+--~ end
+
+local checkedsplit = string.checkedsplit
+
+function file.split_path(str,separator)
+ str = gsub(str,"\\","/")
+ return checkedsplit(str,separator or io.pathseparator)
+end
+
+function file.join_path(tab)
+ return concat(tab,io.pathseparator) -- can have trailing //
+end
+
+-- we can hash them weakly
+
+function file.collapse_path(str)
+ str = gsub(str,"\\","/")
+ if find(str,"/") then
+ str = gsub(str,"^%./",(gsub(lfs.currentdir(),"\\","/")) .. "/") -- ./xx in qualified
+ str = gsub(str,"/%./","/")
+ local n, m = 1, 1
+ while n > 0 or m > 0 do
+ str, n = gsub(str,"[^/%.]+/%.%.$","")
+ str, m = gsub(str,"[^/%.]+/%.%./","")
+ end
+ str = gsub(str,"([^/])/$","%1")
+ -- str = gsub(str,"^%./","") -- ./xx in qualified
+ str = gsub(str,"/%.$","")
+ end
+ if str == "" then str = "." end
+ return str
+end
+
+--~ print(file.collapse_path("/a"))
+--~ print(file.collapse_path("a/./b/.."))
+--~ print(file.collapse_path("a/aa/../b/bb"))
+--~ print(file.collapse_path("a/../.."))
+--~ print(file.collapse_path("a/.././././b/.."))
+--~ print(file.collapse_path("a/./././b/.."))
+--~ print(file.collapse_path("a/b/c/../.."))
+
+function file.robustname(str)
+ return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
+end
+
+file.readdata = io.loaddata
+file.savedata = io.savedata
+
+function file.copy(oldname,newname)
+ file.savedata(newname,io.loaddata(oldname))
+end
+
+-- lpeg variants, slightly faster, not always
+
+--~ local period = lpeg.P(".")
+--~ local slashes = lpeg.S("\\/")
+--~ local noperiod = 1-period
+--~ local noslashes = 1-slashes
+--~ local name = noperiod^1
+
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
+
+--~ function file.extname(name)
+--~ return lpegmatch(pattern,name) or ""
+--~ end
+
+--~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
+
+--~ function file.removesuffix(name)
+--~ return lpegmatch(pattern,name)
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
+
+--~ function file.basename(name)
+--~ return lpegmatch(pattern,name) or name
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
+
+--~ function file.dirname(name)
+--~ local p = lpegmatch(pattern,name)
+--~ if p then
+--~ return sub(name,1,p-2)
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+
+--~ function file.addsuffix(name, suffix)
+--~ local p = lpegmatch(pattern,name)
+--~ if p then
+--~ return name
+--~ else
+--~ return name .. "." .. suffix
+--~ end
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+
+--~ function file.replacesuffix(name,suffix)
+--~ local p = lpegmatch(pattern,name)
+--~ if p then
+--~ return sub(name,1,p-2) .. "." .. suffix
+--~ else
+--~ return name .. "." .. suffix
+--~ end
+--~ end
+
+--~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
+
+--~ function file.nameonly(name)
+--~ local a, b = lpegmatch(pattern,name)
+--~ if b then
+--~ return sub(name,a,b-2)
+--~ elseif a then
+--~ return sub(name,a)
+--~ else
+--~ return name
+--~ end
+--~ end
+
+--~ local test = file.extname
+--~ local test = file.basename
+--~ local test = file.dirname
+--~ local test = file.addsuffix
+--~ local test = file.replacesuffix
+--~ local test = file.nameonly
+
+--~ print(1,test("./a/b/c/abd.def.xxx","!!!"))
+--~ print(2,test("./../b/c/abd.def.xxx","!!!"))
+--~ print(3,test("a/b/c/abd.def.xxx","!!!"))
+--~ print(4,test("a/b/c/def.xxx","!!!"))
+--~ print(5,test("a/b/c/def","!!!"))
+--~ print(6,test("def","!!!"))
+--~ print(7,test("def.xxx","!!!"))
+
+--~ local tim = os.clock() for i=1,250000 do local ext = test("abd.def.xxx","!!!") end print(os.clock()-tim)
+
+-- also rewrite previous
+
+local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
+local separator = lpeg.P("://")
+
+local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
+local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+
+-- ./name ../name /name c: :// name/name
+
+function file.is_qualified_path(filename)
+ return lpegmatch(qualified,filename) ~= nil
+end
+
+function file.is_rootbased_path(filename)
+ return lpegmatch(rootbased,filename) ~= nil
+end
+
+local slash = lpeg.S("\\/")
+local period = lpeg.P(".")
+local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
+local path = lpeg.C(((1-slash)^0 * slash)^0)
+local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
+local base = lpeg.C((1-suffix)^0)
+
+local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+
+function file.splitname(str) -- returns drive, path, base, suffix
+ return lpegmatch(pattern,str)
+end
+
+-- function test(t) for k, v in next, t do print(v, "=>", file.splitname(v)) end end
+--
+-- test { "c:", "c:/aa", "c:/aa/bb", "c:/aa/bb/cc", "c:/aa/bb/cc.dd", "c:/aa/bb/cc.dd.ee" }
+-- test { "c:", "c:aa", "c:aa/bb", "c:aa/bb/cc", "c:aa/bb/cc.dd", "c:aa/bb/cc.dd.ee" }
+-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
+-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
+
+--~ -- todo:
+--~
+--~ if os.type == "windows" then
+--~ local currentdir = lfs.currentdir
+--~ function lfs.currentdir()
+--~ return (gsub(currentdir(),"\\","/"))
+--~ end
+--~ end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['l-io'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local byte, find, gsub = string.byte, string.find, string.gsub
+
+if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator = "\\", ";"
+else
+ io.fileseparator, io.pathseparator = "/" , ":"
+end
+
+function io.loaddata(filename,textmode)
+ local f = io.open(filename,(textmode and 'r') or 'rb')
+ if f then
+ -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
+ local data = f:read('*all')
+ -- garbagecollector.check(data)
+ f:close()
+ return data
+ else
+ return nil
+ end
+end
+
+function io.savedata(filename,data,joiner)
+ local f = io.open(filename,"wb")
+ if f then
+ if type(data) == "table" then
+ f:write(table.join(data,joiner or ""))
+ elseif type(data) == "function" then
+ data(f)
+ else
+ f:write(data or "")
+ end
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function io.exists(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return false
+ else
+ assert(f:close())
+ return true
+ end
+end
+
+function io.size(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return 0
+ else
+ local s = f:seek("end")
+ assert(f:close())
+ return s
+ end
+end
+
+function io.noflines(f)
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
+end
+
+local nextchar = {
+ [ 4] = function(f)
+ return f:read(1,1,1,1)
+ end,
+ [ 2] = function(f)
+ return f:read(1,1)
+ end,
+ [ 1] = function(f)
+ return f:read(1)
+ end,
+ [-2] = function(f)
+ local a, b = f:read(1,1)
+ return b, a
+ end,
+ [-4] = function(f)
+ local a, b, c, d = f:read(1,1,1,1)
+ return d, c, b, a
+ end
+}
+
+function io.characters(f,n)
+ if f then
+ return nextchar[n or 1], f
+ else
+ return nil, nil
+ end
+end
+
+local nextbyte = {
+ [4] = function(f)
+ local a, b, c, d = f:read(1,1,1,1)
+ if d then
+ return byte(a), byte(b), byte(c), byte(d)
+ else
+ return nil, nil, nil, nil
+ end
+ end,
+ [2] = function(f)
+ local a, b = f:read(1,1)
+ if b then
+ return byte(a), byte(b)
+ else
+ return nil, nil
+ end
+ end,
+ [1] = function (f)
+ local a = f:read(1)
+ if a then
+ return byte(a)
+ else
+ return nil
+ end
+ end,
+ [-2] = function (f)
+ local a, b = f:read(1,1)
+ if b then
+ return byte(b), byte(a)
+ else
+ return nil, nil
+ end
+ end,
+ [-4] = function(f)
+ local a, b, c, d = f:read(1,1,1,1)
+ if d then
+ return byte(d), byte(c), byte(b), byte(a)
+ else
+ return nil, nil, nil, nil
+ end
+ end
+}
+
+function io.bytes(f,n)
+ if f then
+ return nextbyte[n or 1], f
+ else
+ return nil, nil
+ end
+end
+
+function io.ask(question,default,options)
+ while true do
+ io.write(question)
+ if options then
+ io.write(string.format(" [%s]",table.concat(options,"|")))
+ end
+ if default then
+ io.write(string.format(" [%s]",default))
+ end
+ io.write(string.format(" "))
+ local answer = io.read()
+ answer = gsub(answer,"^%s*(.*)%s*$","%1")
+ if answer == "" and default then
+ return default
+ elseif not options then
+ return answer
+ else
+ for k=1,#options do
+ if options[k] == answer then
+ return answer
+ end
+ end
+ local pattern = "^" .. answer
+ for k=1,#options do
+ local v = options[k]
+ if find(v,pattern) then
+ return v
+ end
+ end
+ end
+ end
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['luat-dum'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local dummyfunction = function() end
+
+statistics = {
+ register = dummyfunction,
+ starttiming = dummyfunction,
+ stoptiming = dummyfunction,
+}
+directives = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+trackers = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+experiments = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+storage = {
+ register = dummyfunction,
+ shared = { },
+}
+logs = {
+ report = dummyfunction,
+ simple = dummyfunction,
+}
+tasks = {
+ new = dummyfunction,
+ actions = dummyfunction,
+ appendaction = dummyfunction,
+ prependaction = dummyfunction,
+}
+callbacks = {
+ register = function(n,f) return callback.register(n,f) end,
+}
+
+-- we need to cheat a bit here
+
+texconfig.kpse_init = true
+
+resolvers = resolvers or { } -- no fancy file helpers used
+
+local remapper = {
+ otf = "opentype fonts",
+ ttf = "truetype fonts",
+ ttc = "truetype fonts",
+ dfont = "truetype dictionary",
+ cid = "cid maps",
+ fea = "font feature files",
+}
+
+function resolvers.find_file(name,kind)
+ name = string.gsub(name,"\\","\/")
+ kind = string.lower(kind)
+ return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or file.extname(name,"tex"))
+end
+
+function resolvers.findbinfile(name,kind)
+ if not kind or kind == "" then
+ kind = file.extname(name) -- string.match(name,"%.([^%.]-)$")
+ end
+ return resolvers.find_file(name,(kind and remapper[kind]) or kind)
+end
+
+-- Caches ... I will make a real stupid version some day when I'm in the
+-- mood. After all, the generic code does not need the more advanced
+-- ConTeXt features. Cached data is not shared between ConTeXt and other
+-- usage as I don't want any dependency at all. Also, ConTeXt might have
+-- different needs and tricks added.
+
+caches = { }
+
+--~ containers.usecache = true
+
+function caches.setpath(category,subcategory)
+ local root = kpse.var_value("TEXMFCACHE") or ""
+ if root == "" then
+ root = kpse.var_value("VARTEXMF") or ""
+ end
+ if root ~= "" then
+ root = file.join(root,category)
+ lfs.mkdir(root)
+ root = file.join(root,subcategory)
+ lfs.mkdir(root)
+ return lfs.isdir(root) and root
+ end
+end
+
+local function makefullname(path,name)
+ if path and path ~= "" then
+ name = "temp-" and name -- clash prevention
+ return file.addsuffix(file.join(path,name),"lua")
+ end
+end
+
+function caches.iswritable(path,name)
+ local fullname = makefullname(path,name)
+ return fullname and file.iswritable(fullname)
+end
+
+function caches.loaddata(path,name)
+ local fullname = makefullname(path,name)
+ if fullname then
+ local data = loadfile(fullname)
+ return data and data()
+ end
+end
+
+function caches.savedata(path,name,data)
+ local fullname = makefullname(path,name)
+ if fullname then
+ table.tofile(fullname,data,'return',false,true,false)
+ end
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['data-con'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, lower, gsub = string.format, string.lower, string.gsub
+
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
+local trace_containers = false trackers.register("resolvers.containers", function(v) trace_containers = v end)
+local trace_storage = false trackers.register("resolvers.storage", function(v) trace_storage = v end)
+
+--[[ldx--
+<p>Once we found ourselves defining similar cache constructs
+several times, containers were introduced. Containers are used
+to collect tables in memory and reuse them when possible based
+on (unique) hashes (to be provided by the calling function).</p>
+
+<p>Caching to disk is disabled by default. Version numbers are
+stored in the saved table which makes it possible to change the
+table structures without bothering about the disk cache.</p>
+
+<p>Examples of usage can be found in the font related code.</p>
+--ldx]]--
+
+containers = containers or { }
+
+containers.usecache = true
+
+local function report(container,tag,name)
+ if trace_cache or trace_containers then
+ logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ end
+end
+
+local allocated = { }
+
+-- tracing
+
+function containers.define(category, subcategory, version, enabled)
+ return function()
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or 1.000,
+ trace = false,
+ path = caches and caches.setpath and caches.setpath(category,subcategory),
+ }
+ c[subcategory] = s
+ end
+ return s
+ else
+ return nil
+ end
+ end
+end
+
+function containers.is_usable(container, name)
+ return container.enabled and caches and caches.iswritable(container.path, name)
+end
+
+function containers.is_valid(container, name)
+ if name and name ~= "" then
+ local storage = container.storage[name]
+ return storage and storage.cache_version == container.version
+ else
+ return false
+ end
+end
+
+function containers.read(container,name)
+ if container.enabled and caches and not container.storage[name] and containers.usecache then
+ container.storage[name] = caches.loaddata(container.path,name)
+ if containers.is_valid(container,name) then
+ report(container,"loaded",name)
+ else
+ container.storage[name] = nil
+ end
+ end
+ if container.storage[name] then
+ report(container,"reusing",name)
+ end
+ return container.storage[name]
+end
+
+function containers.write(container, name, data)
+ if data then
+ data.cache_version = container.version
+ if container.enabled and caches then
+ local unique, shared = data.unique, data.shared
+ data.unique, data.shared = nil, nil
+ caches.savedata(container.path, name, data)
+ report(container,"saved",name)
+ data.unique, data.shared = unique, shared
+ end
+ report(container,"stored",name)
+ container.storage[name] = data
+ end
+ return data
+end
+
+function containers.content(container,name)
+ return container.storage[name]
+end
+
+function containers.cleanname(name)
+ return (gsub(lower(name),"[^%w%d]+","-"))
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['node-ini'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Most of the code that had accumulated here is now separated in
+modules.</p>
+--ldx]]--
+
+-- this module is being reconstructed
+
+local utf = unicode.utf8
+local next, type = next, type
+local format, concat, match, utfchar = string.format, table.concat, string.match, utf.char
+
+local chardata = characters and characters.data
+
+--[[ldx--
+<p>We start with a registration system for atributes so that we can use the
+symbolic names later on.</p>
+--ldx]]--
+
+attributes = attributes or { }
+
+attributes.names = attributes.names or { }
+attributes.numbers = attributes.numbers or { }
+attributes.list = attributes.list or { }
+attributes.unsetvalue = -0x7FFFFFFF
+
+storage.register("attributes/names", attributes.names, "attributes.names")
+storage.register("attributes/numbers", attributes.numbers, "attributes.numbers")
+storage.register("attributes/list", attributes.list, "attributes.list")
+
+local names, numbers, list = attributes.names, attributes.numbers, attributes.list
+
+function attributes.define(name,number) -- at the tex end
+ if not numbers[name] then
+ numbers[name], names[number], list[number] = number, name, { }
+ end
+end
+
+--[[ldx--
+<p>We can use the attributes in the range 127-255 (outside user space). These
+are only used when no attribute is set at the \TEX\ end which normally
+happens in <l n='context'/>.</p>
+--ldx]]--
+
+storage.shared.attributes_last_private = storage.shared.attributes_last_private or 127
+
+function attributes.private(name) -- at the lua end (hidden from user)
+ local number = numbers[name]
+ if not number then
+ local last = storage.shared.attributes_last_private or 127
+ if last < 255 then
+ last = last + 1
+ storage.shared.attributes_last_private = last
+ end
+ number = last
+ numbers[name], names[number], list[number] = number, name, { }
+ end
+ return number
+end
+
+--[[ldx--
+<p>Access to nodes is what gives <l n='luatex'/> its power. Here we
+implement a few helper functions. These functions are rather optimized.</p>
+--ldx]]--
+
+--[[ldx--
+<p>When manipulating node lists in <l n='context'/>, we will remove
+nodes and insert new ones. While node access was implemented, we did
+quite some experiments in order to find out if manipulating nodes
+in <l n='lua'/> was feasible from the perspective of performance.</p>
+
+<p>First of all, we noticed that the bottleneck is more with excessive
+callbacks (some gets called very often) and the conversion from and to
+<l n='tex'/>'s datastructures. However, at the <l n='lua'/> end, we
+found that inserting and deleting nodes in a table could become a
+bottleneck.</p>
+
+<p>This resulted in two special situations in passing nodes back to
+<l n='tex'/>: a table entry with value <type>false</type> is ignored,
+and when instead of a table <type>true</type> is returned, the
+original table is used.</p>
+
+<p>Insertion is handled (at least in <l n='context'/> as follows. When
+we need to insert a node at a certain position, we change the node at
+that position by a dummy node, tagged <type>inline</type> which itself
+has_attribute the original node and one or more new nodes. Before we pass
+back the list we collapse the list. Of course collapsing could be built
+into the <l n='tex'/> engine, but this is a not so natural extension.</p>
+
+<p>When we collapse (something that we only do when really needed), we
+also ignore the empty nodes. [This is obsolete!]</p>
+--ldx]]--
+
+nodes = nodes or { }
+
+local hlist = node.id('hlist')
+local vlist = node.id('vlist')
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local penalty = node.id('penalty')
+local kern = node.id('kern')
+local whatsit = node.id('whatsit')
+
+local traverse_id = node.traverse_id
+local traverse = node.traverse
+local free_node = node.free
+local remove_node = node.remove
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+
+function nodes.remove(head, current, free_too)
+ local t = current
+ head, current = remove_node(head,current)
+ if t then
+ if free_too then
+ free_node(t)
+ t = nil
+ else
+ t.next, t.prev = nil, nil
+ end
+ end
+ return head, current, t
+end
+
+function nodes.delete(head,current)
+ return nodes.remove(head,current,true)
+end
+
+nodes.before = insert_node_before
+nodes.after = insert_node_after
+
+-- we need to test this, as it might be fixed now
+
+function nodes.before(h,c,n)
+ if c then
+ if c == h then
+ n.next = h
+ n.prev = nil
+ h.prev = n
+ else
+ local cp = c.prev
+ n.next = c
+ n.prev = cp
+ if cp then
+ cp.next = n
+ end
+ c.prev = n
+ return h, n
+ end
+ end
+ return n, n
+end
+
+function nodes.after(h,c,n)
+ if c then
+ local cn = c.next
+ if cn then
+ n.next = cn
+ cn.prev = n
+ else
+ n.next = nil
+ end
+ c.next = n
+ n.prev = c
+ return h, n
+ end
+ return n, n
+end
+
+-- local h, c = nodes.replace(head,current,new)
+-- local c = nodes.replace(false,current,new)
+-- local c = nodes.replace(current,new)
+
+function nodes.replace(head,current,new) -- no head returned if false
+ if not new then
+ head, current, new = false, head, current
+ end
+ local prev, next = current.prev, current.next
+ if next then
+ new.next, next.prev = next, new
+ end
+ if prev then
+ new.prev, prev.next = prev, new
+ end
+ if head then
+ if head == current then
+ head = new
+ end
+ free_node(current)
+ return head, new
+ else
+ free_node(current)
+ return new
+ end
+end
+
+-- will move
+
+local function count(stack,flat)
+ local n = 0
+ while stack do
+ local id = stack.id
+ if not flat and id == hlist or id == vlist then
+ local list = stack.list
+ if list then
+ n = n + 1 + count(list) -- self counts too
+ else
+ n = n + 1
+ end
+ else
+ n = n + 1
+ end
+ stack = stack.next
+ end
+ return n
+end
+
+nodes.count = count
+
+-- new, will move
+
+function attributes.ofnode(n)
+ local a = n.attr
+ if a then
+ local names = attributes.names
+ a = a.next
+ while a do
+ local number, value = a.number, a.value
+ texio.write_nl(format("%s : attribute %3i, value %4i, name %s",tostring(n),number,value,names[number] or '?'))
+ a = a.next
+ end
+ end
+end
+
+local left, space = lpeg.P("<"), lpeg.P(" ")
+
+nodes.filterkey = left * (1-left)^0 * left * space^0 * lpeg.C((1-space)^0)
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['node-res'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local gmatch, format = string.gmatch, string.format
+local copy_node, free_node, free_list, new_node, node_type, node_id = node.copy, node.free, node.flush_list, node.new, node.type, node.id
+local tonumber, round = tonumber, math.round
+
+local glyph_node = node_id("glyph")
+
+--[[ldx--
+<p>The next function is not that much needed but in <l n='context'/> we use
+for debugging <l n='luatex'/> node management.</p>
+--ldx]]--
+
+nodes = nodes or { }
+
+nodes.whatsits = { } -- table.swapped(node.whatsits())
+
+local reserved = { }
+local whatsits = nodes.whatsits
+
+for k, v in next, node.whatsits() do
+ whatsits[k], whatsits[v] = v, k -- two way
+end
+
+local function register_node(n)
+ reserved[#reserved+1] = n
+ return n
+end
+
+nodes.register = register_node
+
+function nodes.cleanup_reserved(nofboxes) -- todo
+ nodes.tracers.steppers.reset() -- todo: make a registration subsystem
+ local nr, nl = #reserved, 0
+ for i=1,nr do
+ local ri = reserved[i]
+ -- if not (ri.id == glue_spec and not ri.is_writable) then
+ free_node(reserved[i])
+ -- end
+ end
+ if nofboxes then
+ local tb = tex.box
+ for i=0,nofboxes do
+ local l = tb[i]
+ if l then
+ free_node(tb[i])
+ nl = nl + 1
+ end
+ end
+ end
+ reserved = { }
+ return nr, nl, nofboxes -- can be nil
+end
+
+function nodes.usage()
+ local t = { }
+ for n, tag in gmatch(status.node_mem_usage,"(%d+) ([a-z_]+)") do
+ t[tag] = n
+ end
+ return t
+end
+
+local disc = register_node(new_node("disc"))
+local kern = register_node(new_node("kern",1))
+local penalty = register_node(new_node("penalty"))
+local glue = register_node(new_node("glue")) -- glue.spec = nil
+local glue_spec = register_node(new_node("glue_spec"))
+local glyph = register_node(new_node("glyph",0))
+local textdir = register_node(new_node("whatsit",whatsits.dir)) -- 7 (6 is local par node)
+local rule = register_node(new_node("rule"))
+local latelua = register_node(new_node("whatsit",whatsits.late_lua)) -- 35
+local user_n = register_node(new_node("whatsit",whatsits.user_defined)) user_n.type = 100 -- 44
+local user_l = register_node(new_node("whatsit",whatsits.user_defined)) user_l.type = 110 -- 44
+local user_s = register_node(new_node("whatsit",whatsits.user_defined)) user_s.type = 115 -- 44
+local user_t = register_node(new_node("whatsit",whatsits.user_defined)) user_t.type = 116 -- 44
+local left_margin_kern = register_node(new_node("margin_kern",0))
+local right_margin_kern = register_node(new_node("margin_kern",1))
+local lineskip = register_node(new_node("glue",1))
+local baselineskip = register_node(new_node("glue",2))
+local leftskip = register_node(new_node("glue",8))
+local rightskip = register_node(new_node("glue",9))
+local temp = register_node(new_node("temp",0))
+
+function nodes.zeroglue(n)
+ local s = n.spec
+ return not writable or (
+ s.width == 0
+ and s.stretch == 0
+ and s.shrink == 0
+ and s.stretch_order == 0
+ and s.shrink_order == 0
+ )
+end
+
+function nodes.glyph(fnt,chr)
+ local n = copy_node(glyph)
+ if fnt then n.font = fnt end
+ if chr then n.char = chr end
+ return n
+end
+
+function nodes.penalty(p)
+ local n = copy_node(penalty)
+ n.penalty = p
+ return n
+end
+
+function nodes.kern(k)
+ local n = copy_node(kern)
+ n.kern = k
+ return n
+end
+
+function nodes.glue_spec(width,stretch,shrink)
+ local s = copy_node(glue_spec)
+ s.width, s.stretch, s.shrink = width, stretch, shrink
+ return s
+end
+
+local function someskip(skip,width,stretch,shrink)
+ local n = copy_node(skip)
+ if not width then
+ -- no spec
+ elseif tonumber(width) then
+ local s = copy_node(glue_spec)
+ s.width, s.stretch, s.shrink = width, stretch, shrink
+ n.spec = s
+ else
+ -- shared
+ n.spec = copy_node(width)
+ end
+ return n
+end
+
+function nodes.glue(width,stretch,shrink)
+ return someskip(glue,width,stretch,shrink)
+end
+function nodes.leftskip(width,stretch,shrink)
+ return someskip(leftskip,width,stretch,shrink)
+end
+function nodes.rightskip(width,stretch,shrink)
+ return someskip(rightskip,width,stretch,shrink)
+end
+function nodes.lineskip(width,stretch,shrink)
+ return someskip(lineskip,width,stretch,shrink)
+end
+function nodes.baselineskip(width,stretch,shrink)
+ return someskip(baselineskip,width,stretch,shrink)
+end
+
+function nodes.disc()
+ return copy_node(disc)
+end
+
+function nodes.textdir(dir)
+ local t = copy_node(textdir)
+ t.dir = dir
+ return t
+end
+
+function nodes.rule(width,height,depth,dir)
+ local n = copy_node(rule)
+ if width then n.width = width end
+ if height then n.height = height end
+ if depth then n.depth = depth end
+ if dir then n.dir = dir end
+ return n
+end
+
+function nodes.latelua(code)
+ local n = copy_node(latelua)
+ n.data = code
+ return n
+end
+
+function nodes.leftmarginkern(glyph,width)
+ local n = copy_node(left_margin_kern)
+ if not glyph then
+ logs.fatal("nodes","invalid pointer to left margin glyph node")
+ elseif glyph.id ~= glyph_node then
+ logs.fatal("nodes","invalid node type %s for left margin glyph node",node_type(glyph))
+ else
+ n.glyph = glyph
+ end
+ if width then
+ n.width = width
+ end
+ return n
+end
+
+function nodes.rightmarginkern(glyph,width)
+ local n = copy_node(right_margin_kern)
+ if not glyph then
+ logs.fatal("nodes","invalid pointer to right margin glyph node")
+ elseif glyph.id ~= glyph_node then
+ logs.fatal("nodes","invalid node type %s for right margin glyph node",node_type(p))
+ else
+ n.glyph = glyph
+ end
+ if width then
+ n.width = width
+ end
+ return n
+end
+
+function nodes.temp()
+ return copy_node(temp)
+end
+--[[
+<p>At some point we ran into a problem that the glue specification
+of the zeropoint dimension was overwritten when adapting a glue spec
+node. This is a side effect of glue specs being shared. After a
+couple of hours tracing and debugging Taco and I came to the
+conclusion that it made no sense to complicate the spec allocator
+and settled on a writable flag. This all is a side effect of the
+fact that some glues use reserved memory slots (with the zeropoint
+glue being a noticeable one). So, next we wrap this into a function
+and hide it for the user. And yes, LuaTeX now gives a warning as
+well.</p>
+]]--
+
+if tex.luatexversion > 51 then
+
+ function nodes.writable_spec(n)
+ local spec = n.spec
+ if not spec then
+ spec = copy_node(glue_spec)
+ n.spec = spec
+ elseif not spec.writable then
+ spec = copy_node(spec)
+ n.spec = spec
+ end
+ return spec
+ end
+
+else
+
+ function nodes.writable_spec(n)
+ local spec = n.spec
+ if not spec then
+ spec = copy_node(glue_spec)
+ else
+ spec = copy_node(spec)
+ end
+ n.spec = spec
+ return spec
+ end
+
+end
+
+local cache = { }
+
+function nodes.usernumber(num)
+ local n = cache[num]
+ if n then
+ return copy_node(n)
+ else
+ local n = copy_node(user_n)
+ if num then n.value = num end
+ return n
+ end
+end
+
+function nodes.userlist(list)
+ local n = copy_node(user_l)
+ if list then n.value = list end
+ return n
+end
+
+local cache = { } -- we could use the same cache
+
+function nodes.userstring(str)
+ local n = cache[str]
+ if n then
+ return copy_node(n)
+ else
+ local n = copy_node(user_s)
+ n.type = 115
+ if str then n.value = str end
+ return n
+ end
+end
+
+function nodes.usertokens(tokens)
+ local n = copy_node(user_t)
+ if tokens then n.value = tokens end
+ return n
+end
+
+statistics.register("cleaned up reserved nodes", function()
+ return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"]))
+end) -- \topofboxstack
+
+statistics.register("node memory usage", function() -- comes after cleanup !
+ return status.node_mem_usage
+end)
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['node-inj'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini)
+
+-- This is very experimental (this will change when we have luatex > .50 and
+-- a few pending thingies are available. Also, Idris needs to make a few more
+-- test fonts. Btw, future versions of luatex will have extended glyph properties
+-- that can be of help.
+
+local next = next
+
+local trace_injections = false trackers.register("nodes.injections", function(v) trace_injections = v end)
+
+fonts = fonts or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+
+local fontdata = fonts.ids
+
+local glyph = node.id('glyph')
+local kern = node.id('kern')
+
+local traverse_id = node.traverse_id
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+
+local newkern = nodes.kern
+
+local markbase = attributes.private('markbase')
+local markmark = attributes.private('markmark')
+local markdone = attributes.private('markdone')
+local cursbase = attributes.private('cursbase')
+local curscurs = attributes.private('curscurs')
+local cursdone = attributes.private('cursdone')
+local kernpair = attributes.private('kernpair')
+
+local cursives = { }
+local marks = { }
+local kerns = { }
+
+-- currently we do gpos/kern in a bit inofficial way but when we
+-- have the extra fields in glyphnodes to manipulate ht/dp/wd
+-- explicitly i will provide an alternative; also, we can share
+-- tables
+
+-- for the moment we pass the r2l key ... volt/arabtype tests
+
+function nodes.set_cursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
+ local dx, dy = factor*(exit[1]-entry[1]), factor*(exit[2]-entry[2])
+ local ws, wn = tfmstart.width, tfmnext.width
+ local bound = #cursives + 1
+ set_attribute(start,cursbase,bound)
+ set_attribute(nxt,curscurs,bound)
+ cursives[bound] = { rlmode, dx, dy, ws, wn }
+ return dx, dy, bound
+end
+
+function nodes.set_pair(current,factor,rlmode,r2lflag,spec,tfmchr)
+ local x, y, w, h = factor*spec[1], factor*spec[2], factor*spec[3], factor*spec[4]
+ -- dy = y - h
+ if x ~= 0 or w ~= 0 or y ~= 0 or h ~= 0 then
+ local bound = has_attribute(current,kernpair)
+ if bound then
+ local kb = kerns[bound]
+ -- inefficient but singles have less, but weird anyway, needs checking
+ kb[2], kb[3], kb[4], kb[5] = (kb[2] or 0) + x, (kb[3] or 0) + y, (kb[4] or 0)+ w, (kb[5] or 0) + h
+ else
+ bound = #kerns + 1
+ set_attribute(current,kernpair,bound)
+ kerns[bound] = { rlmode, x, y, w, h, r2lflag, tfmchr.width }
+ end
+ return x, y, w, h, bound
+ end
+ return x, y, w, h -- no bound
+end
+
+function nodes.set_kern(current,factor,rlmode,x,tfmchr)
+ local dx = factor*x
+ if dx ~= 0 then
+ local bound = #kerns + 1
+ set_attribute(current,kernpair,bound)
+ kerns[bound] = { rlmode, dx }
+ end
+ return dx, bound
+end
+
+function nodes.set_mark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, ma=markanchor
+ local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2])
+ local bound = has_attribute(base,markbase)
+ if bound then
+ local mb = marks[bound]
+ if mb then
+ if not index then index = #mb + 1 end
+ mb[index] = { dx, dy }
+ set_attribute(start,markmark,bound)
+ set_attribute(start,markdone,index)
+ return dx, dy, bound
+ else
+ logs.report("nodes mark", "possible problem, U+%04X is base without data (id: %s)",base.char,bound)
+ end
+ end
+ index = index or 1
+ bound = #marks + 1
+ set_attribute(base,markbase,bound)
+ set_attribute(start,markmark,bound)
+ set_attribute(start,markdone,index)
+ marks[bound] = { [index] = { dx, dy } }
+ return dx, dy, bound
+end
+
+function nodes.trace_injection(head)
+ local function dir(n)
+ return (n and n<0 and "r-to-l") or (n and n>0 and "l-to-r") or ("unset")
+ end
+ local function report(...)
+ logs.report("nodes finisher",...)
+ end
+ report("begin run")
+ for n in traverse_id(glyph,head) do
+ if n.subtype < 256 then
+ local kp = has_attribute(n,kernpair)
+ local mb = has_attribute(n,markbase)
+ local mm = has_attribute(n,markmark)
+ local md = has_attribute(n,markdone)
+ local cb = has_attribute(n,cursbase)
+ local cc = has_attribute(n,curscurs)
+ report("char U+%05X, font=%s",n.char,n.font)
+ if kp then
+ local k = kerns[kp]
+ if k[3] then
+ report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?")
+ else
+ report(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?")
+ end
+ end
+ if mb then
+ report(" markbase: bound=%s",mb)
+ end
+ if mm then
+ local m = marks[mm]
+ if mb then
+ local m = m[mb]
+ if m then
+ report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?")
+ else
+ report(" markmark: bound=%s, missing index",mm)
+ end
+ else
+ m = m[1]
+ report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?")
+ end
+ end
+ if cb then
+ report(" cursbase: bound=%s",cb)
+ end
+ if cc then
+ local c = cursives[cc]
+ report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?")
+ end
+ end
+ end
+ report("end run")
+end
+
+-- todo: reuse tables (i.e. no collection), but will be extra fields anyway
+
+function nodes.inject_kerns(head,where,keep)
+ local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns)
+ if has_marks or has_cursives then
+--~ if has_marks or has_cursives or has_kerns then
+ if trace_injections then
+ nodes.trace_injection(head)
+ end
+ -- in the future variant we will not copy items but refs to tables
+ local done, ky, rl, valid, cx, wx, mk = false, { }, { }, { }, { }, { }, { }
+ if has_kerns then -- move outside loop
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph,head) do
+ if n.subtype < 256 then
+ valid[#valid+1] = n
+ if n.font ~= nf then
+ nf = n.font
+ tm = fontdata[nf].marks
+ end
+ mk[n] = tm[n.char]
+ local k = has_attribute(n,kernpair)
+ if k then
+ local kk = kerns[k]
+ if kk then
+ local x, y, w, h = kk[2] or 0, kk[3] or 0, kk[4] or 0, kk[5] or 0
+ local dy = y - h
+ if dy ~= 0 then
+ ky[n] = dy
+ end
+ if w ~= 0 or x ~= 0 then
+ wx[n] = kk
+ end
+ rl[n] = kk[1] -- could move in test
+ end
+ end
+ end
+ end
+ else
+ local nf, tm = nil, nil
+ for n in traverse_id(glyph,head) do
+ if n.subtype < 256 then
+ valid[#valid+1] = n
+ if n.font ~= nf then
+ nf = n.font
+ tm = fontdata[nf].marks
+ end
+ mk[n] = tm[n.char]
+ end
+ end
+ end
+ if #valid > 0 then
+ -- we can assume done == true because we have cursives and marks
+ local cx = { }
+ if has_kerns and next(ky) then
+ for n, k in next, ky do
+ n.yoffset = k
+ end
+ end
+ -- todo: reuse t and use maxt
+ if has_cursives then
+ local p_cursbase, p = nil, nil
+ -- since we need valid[n+1] we can also use a "while true do"
+ local t, d, maxt = { }, { }, 0
+ for i=1,#valid do -- valid == glyphs
+ local n = valid[i]
+ if not mk[n] then
+ local n_cursbase = has_attribute(n,cursbase)
+ if p_cursbase then
+ local n_curscurs = has_attribute(n,curscurs)
+ if p_cursbase == n_curscurs then
+ local c = cursives[n_curscurs]
+ if c then
+ local rlmode, dx, dy, ws, wn = c[1], c[2], c[3], c[4], c[5]
+ if rlmode >= 0 then
+ dx = dx - ws
+ else
+ dx = dx + wn
+ end
+ if dx ~= 0 then
+ cx[n] = dx
+ rl[n] = rlmode
+ end
+ -- if rlmode and rlmode < 0 then
+ dy = -dy
+ -- end
+ maxt = maxt + 1
+ t[maxt] = p
+ d[maxt] = dy
+ else
+ maxt = 0
+ end
+ end
+ elseif maxt > 0 then
+ local ny = n.yoffset
+ for i=maxt,1,-1 do
+ ny = ny + d[i]
+ local ti = t[i]
+ ti.yoffset = ti.yoffset + ny
+ end
+ maxt = 0
+ end
+ if not n_cursbase and maxt > 0 then
+ local ny = n.yoffset
+ for i=maxt,1,-1 do
+ ny = ny + d[i]
+ local ti = t[i]
+ ti.yoffset = ny
+ end
+ maxt = 0
+ end
+ p_cursbase, p = n_cursbase, n
+ end
+ end
+ if maxt > 0 then
+ local ny = n.yoffset
+ for i=maxt,1,-1 do
+ ny = ny + d[i]
+ local ti = t[i]
+ ti.yoffset = ny
+ end
+ maxt = 0
+ end
+ if not keep then
+ cursives = { }
+ end
+ end
+ if has_marks then
+ for i=1,#valid do
+ local p = valid[i]
+ local p_markbase = has_attribute(p,markbase)
+ if p_markbase then
+ local mrks = marks[p_markbase]
+ for n in traverse_id(glyph,p.next) do
+ local n_markmark = has_attribute(n,markmark)
+ if p_markbase == n_markmark then
+ local index = has_attribute(n,markdone) or 1
+ local d = mrks[index]
+ if d then
+ -- local rlmode = d[3] -- not used
+ -- if rlmode and rlmode > 0 then
+ -- todo
+ -- else
+ local k = wx[p]
+ if k then
+ n.xoffset = p.xoffset - d[1] - k[2]
+ else
+ n.xoffset = p.xoffset - d[1]
+ end
+ -- end
+ if mk[p] then
+ n.yoffset = p.yoffset + d[2]
+ else
+ n.yoffset = n.yoffset + p.yoffset + d[2]
+ end
+ end
+ else
+ break
+ end
+ end
+ end
+ end
+ if not keep then
+ marks = { }
+ end
+ end
+ -- todo : combine
+ if next(wx) then
+ for n, k in next, wx do
+ -- only w can be nil, can be sped up when w == nil
+ local rl, x, w, r2l = k[1], k[2] or 0, k[4] or 0, k[6]
+ local wx = w - x
+--~ if rl < 0 then
+--~ if r2l then
+--~ if wx ~= 0 then
+--~ insert_node_before(head,n,newkern(wx))
+--~ end
+--~ if x ~= 0 then
+--~ insert_node_after (head,n,newkern(x))
+--~ end
+--~ else
+--~ if x ~= 0 then
+--~ insert_node_before(head,n,newkern(x))
+--~ end
+--~ if wx ~= 0 then
+--~ insert_node_after(head,n,newkern(wx))
+--~ end
+--~ end
+--~ else
+ if r2l then
+ if wx ~= 0 then
+ insert_node_before(head,n,newkern(wx))
+ end
+ if x ~= 0 then
+ insert_node_after (head,n,newkern(x))
+ end
+ else
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
+ if wx ~= 0 then
+ insert_node_after(head,n,newkern(wx))
+ end
+ end
+--~ end
+ end
+ end
+ if next(cx) then
+ for n, k in next, cx do
+ if k ~= 0 then
+ local rln = rl[n]
+ if rln and rln < 0 then
+ insert_node_before(head,n,newkern(-k))
+ else
+ insert_node_before(head,n,newkern(k))
+ end
+ end
+ end
+ end
+ if not keep then
+ kerns = { }
+ end
+ return head, true
+ elseif not keep then
+ kerns, cursives, marks = { }, { }, { }
+ end
+ elseif has_kerns then
+ if trace_injections then
+ nodes.trace_injection(head)
+ end
+ for n in traverse_id(glyph,head) do
+ local k = has_attribute(n,kernpair)
+ if k then
+ local kk = kerns[k]
+ if kk then
+ local rl, x, y, w = kk[1], kk[2] or 0, kk[3], kk[4]
+ if y and y ~= 0 then
+ n.yoffset = y -- todo: h ?
+ end
+ if w then
+ -- copied from above
+ local r2l = kk[6]
+ local wx = w - x
+--~ if rl < 0 then
+--~ if r2l then
+--~ if x ~= 0 then
+--~ insert_node_before(head,n,newkern(x))
+--~ end
+--~ if wx ~= 0 then
+--~ insert_node_after(head,n,newkern(wx))
+--~ end
+--~ else
+--~ if wx ~= 0 then
+--~ insert_node_before(head,n,newkern(wx))
+--~ end
+--~ if x ~= 0 then
+--~ insert_node_after (head,n,newkern(x))
+--~ end
+--~ end
+--~ else
+ if r2l then
+ if wx ~= 0 then
+ insert_node_before(head,n,newkern(wx))
+ end
+ if x ~= 0 then
+ insert_node_after (head,n,newkern(x))
+ end
+ else
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
+ if wx ~= 0 then
+ insert_node_after(head,n,newkern(wx))
+ end
+ end
+--~ end
+ else
+ -- simple (e.g. kernclass kerns)
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
+ end
+ end
+ end
+ end
+ if not keep then
+ kerns = { }
+ end
+ return head, true
+ else
+ -- no tracing needed
+ end
+ return head, false
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['node-fnt'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local next, type = next, type
+
+local trace_characters = false trackers.register("nodes.characters", function(v) trace_characters = v end)
+
+local glyph = node.id('glyph')
+
+local traverse_id = node.traverse_id
+local has_attribute = node.has_attribute
+
+local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+
+fonts = fonts or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+
+local fontdata = fonts.ids
+
+-- some tests with using an array of dynamics[id] and processes[id] demonstrated
+-- that there was nothing to gain (unless we also optimize other parts)
+--
+-- maybe getting rid of the intermediate shared can save some time
+
+-- potential speedup: check for subtype < 256 so that we can remove that test
+-- elsewhere, danger: injected nodes will not be dealt with but that does not
+-- happen often; we could consider processing sublists but that might need mor
+-- checking later on; the current approach also permits variants
+
+if tex.attribute[0] < 0 then
+
+ texio.write_nl("log","!")
+ texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
+ texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
+ texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.")
+ texio.write_nl("log","!")
+
+ tex.attribute[0] = 0 -- else no features
+
+end
+
+-- this will be redone and split in a generic one and a context one
+
+function nodes.process_characters(head)
+ -- either next or not, but definitely no already processed list
+ starttiming(nodes)
+ local usedfonts, attrfonts, done = { }, { }, false
+ local a, u, prevfont, prevattr = 0, 0, nil, 0
+ for n in traverse_id(glyph,head) do
+ local font, attr = n.font, has_attribute(n,0) -- zero attribute is reserved for fonts in context
+ if attr and attr > 0 then
+ if font ~= prevfont or attr ~= prevattr then
+ local used = attrfonts[font]
+ if not used then
+ used = { }
+ attrfonts[font] = used
+ end
+ if not used[attr] then
+ -- we do some testing outside the function
+ local tfmdata = fontdata[font]
+ local shared = tfmdata.shared
+ if shared then
+ local dynamics = shared.dynamics
+ if dynamics then
+ local d = shared.set_dynamics(font,dynamics,attr) -- still valid?
+ if d then
+ used[attr] = d
+ a = a + 1
+ end
+ end
+ end
+ end
+ prevfont, prevattr = font, attr
+ end
+ elseif font ~= prevfont then
+ prevfont, prevattr = font, 0
+ local used = usedfonts[font]
+ if not used then
+ local tfmdata = fontdata[font]
+ if tfmdata then
+ local shared = tfmdata.shared -- we need to check shared, only when same features
+ if shared then
+ local processors = shared.processes
+ if processors and #processors > 0 then
+ usedfonts[font] = processors
+ u = u + 1
+ end
+ end
+ else
+ -- probably nullfont
+ end
+ end
+ else
+ prevattr = attr
+ end
+ end
+ -- we could combine these and just make the attribute nil
+ if u == 1 then
+ local font, processors = next(usedfonts)
+ local n = #processors
+ if n > 0 then
+ local h, d = processors[1](head,font,false)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,false)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ elseif u > 0 then
+ for font, processors in next, usedfonts do
+ local n = #processors
+ local h, d = processors[1](head,font,false)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,false)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ end
+ if a == 1 then
+ local font, dynamics = next(attrfonts)
+ for attribute, processors in next, dynamics do -- attr can switch in between
+ local n = #processors
+ local h, d = processors[1](head,font,attribute)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,attribute)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ elseif a > 0 then
+ for font, dynamics in next, attrfonts do
+ for attribute, processors in next, dynamics do -- attr can switch in between
+ local n = #processors
+ local h, d = processors[1](head,font,attribute)
+ head, done = h or head, done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,attribute)
+ head, done = h or head, done or d
+ end
+ end
+ end
+ end
+ end
+ stoptiming(nodes)
+ if trace_characters then
+ nodes.report(head,done)
+ end
+ return head, true
+end
+
+if node.protect_glyphs then
+
+ nodes.protect_glyphs = node.protect_glyphs
+ nodes.unprotect_glyphs = node.unprotect_glyphs
+
+else do
+
+ -- initial value subtype : X000 0001 = 1 = 0x01 = char
+ --
+ -- expected before linebreak : X000 0000 = 0 = 0x00 = glyph
+ -- X000 0010 = 2 = 0x02 = ligature
+ -- X000 0100 = 4 = 0x04 = ghost
+ -- X000 1010 = 10 = 0x0A = leftboundary lig
+ -- X001 0010 = 18 = 0x12 = rightboundary lig
+ -- X001 1010 = 26 = 0x1A = both boundaries lig
+ -- X000 1100 = 12 = 0x1C = leftghost
+ -- X001 0100 = 20 = 0x14 = rightghost
+
+ function nodes.protect_glyphs(head)
+ local done = false
+ for g in traverse_id(glyph,head) do
+ local s = g.subtype
+ if s == 1 then
+ done, g.subtype = true, 256
+ elseif s <= 256 then
+ done, g.subtype = true, 256 + s
+ end
+ end
+ return done
+ end
+
+ function nodes.unprotect_glyphs(head)
+ local done = false
+ for g in traverse_id(glyph,head) do
+ local s = g.subtype
+ if s > 256 then
+ done, g.subtype = true, s - 256
+ end
+ end
+ return done
+ end
+
+end end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['node-dum'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+nodes = nodes or { }
+
+function nodes.simple_font_handler(head)
+-- lang.hyphenate(head)
+ head = nodes.process_characters(head)
+ nodes.inject_kerns(head)
+ nodes.protect_glyphs(head)
+ head = node.ligaturing(head)
+ head = node.kerning(head)
+ return head
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-ini'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Not much is happening here.</p>
+--ldx]]--
+
+local utf = unicode.utf8
+local format, serialize = string.format, table.serialize
+local write_nl = texio.write_nl
+
+if not fontloader then fontloader = fontforge end
+
+fontloader.totable = fontloader.to_table
+
+-- vtf comes first
+-- fix comes last
+
+fonts = fonts or { }
+
+fonts.ids = fonts.ids or { } fonts.identifiers = fonts.ids -- aka fontdata
+fonts.chr = fonts.chr or { } fonts.characters = fonts.chr -- aka chardata
+fonts.qua = fonts.qua or { } fonts.quads = fonts.qua -- aka quaddata
+
+fonts.tfm = fonts.tfm or { }
+
+fonts.mode = 'base'
+fonts.private = 0xF0000 -- 0x10FFFF
+fonts.verbose = false -- more verbose cache tables
+
+fonts.ids[0] = { -- nullfont
+ characters = { },
+ descriptions = { },
+ name = "nullfont",
+}
+
+fonts.chr[0] = { }
+
+fonts.methods = fonts.methods or {
+ base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+ node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+}
+
+fonts.initializers = fonts.initializers or {
+ base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+ node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }
+}
+
+fonts.triggers = fonts.triggers or {
+ 'mode',
+ 'language',
+ 'script',
+ 'strategy',
+}
+
+fonts.processors = fonts.processors or {
+}
+
+fonts.manipulators = fonts.manipulators or {
+}
+
+fonts.define = fonts.define or { }
+fonts.define.specify = fonts.define.specify or { }
+fonts.define.specify.synonyms = fonts.define.specify.synonyms or { }
+
+-- tracing
+
+if not fonts.color then
+
+ fonts.color = {
+ set = function() end,
+ reset = function() end,
+ }
+
+end
+
+-- format identification
+
+fonts.formats = { }
+
+function fonts.fontformat(filename,default)
+ local extname = file.extname(filename)
+ local format = fonts.formats[extname]
+ if format then
+ return format
+ else
+ logs.report("fonts define","unable to detemine font format for '%s'",filename)
+ return default
+ end
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-tfm'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local next, format, match, lower, gsub = next, string.format, string.match, string.lower, string.gsub
+local concat, sortedkeys, utfbyte, serialize = table.concat, table.sortedkeys, utf.byte, table.serialize
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_scaling = false trackers.register("fonts.scaling" , function(v) trace_scaling = v end)
+
+-- tfmdata has also fast access to indices and unicodes
+-- to be checked: otf -> tfm -> tfmscaled
+--
+-- watch out: no negative depths and negative eights permitted in regular fonts
+
+--[[ldx--
+<p>Here we only implement a few helper functions.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+
+local tfm = fonts.tfm
+
+fonts.loaded = fonts.loaded or { }
+fonts.dontembed = fonts.dontembed or { }
+fonts.triggers = fonts.triggers or { } -- brrr
+fonts.initializers = fonts.initializers or { }
+fonts.initializers.common = fonts.initializers.common or { }
+
+local fontdata = fonts.ids
+local disc = node.id('disc')
+local glyph = node.id('glyph')
+local set_attribute = node.set_attribute
+
+--[[ldx--
+<p>The next function encapsulates the standard <l n='tfm'/> loader as
+supplied by <l n='luatex'/>.</p>
+--ldx]]--
+
+tfm.resolve_vf = true -- false
+tfm.share_base_kerns = false -- true (.5 sec slower on mk but brings down mem from 410M to 310M, beware: then script/lang share too)
+tfm.mathactions = { }
+tfm.fontname_mode = "fullpath"
+
+tfm.enhance = tfm.enhance or function() end
+
+function tfm.read_from_tfm(specification)
+ local fname, tfmdata = specification.filename or "", nil
+ if fname ~= "" then
+ if trace_defining then
+ logs.report("define font","loading tfm file %s at size %s",fname,specification.size)
+ 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 = resolvers.findbinfile(specification.name, 'ovf')
+ if fname and fname ~= "" then
+ local vfdata = font.read_vf(fname,specification.size) -- not cached, fast enough
+ if vfdata then
+ local chars = tfmdata.characters
+ for k,v in next, vfdata.characters do
+ chars[k].commands = v.commands
+ end
+ tfmdata.type = 'virtual'
+ tfmdata.fonts = vfdata.fonts
+ end
+ end
+ end
+ tfm.enhance(tfmdata,specification)
+ end
+ elseif trace_defining then
+ logs.report("define font","loading tfm with name %s fails",specification.name)
+ end
+ return tfmdata
+end
+
+--[[ldx--
+<p>We need to normalize the scale factor (in scaled points). This has to
+do with the fact that <l n='tex'/> uses a negative multiple of 1000 as
+a signal for a font scaled based on the design size.</p>
+--ldx]]--
+
+local factors = {
+ pt = 65536.0,
+ bp = 65781.8,
+}
+
+function tfm.setfactor(f)
+ tfm.factor = factors[f or 'pt'] or factors.pt
+end
+
+tfm.setfactor()
+
+function tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as well
+ if scaledpoints < 0 then
+ if designsize then
+ if designsize > tfm.factor then -- or just 1000 / when? mp?
+ return (- scaledpoints/1000) * designsize -- sp's
+ else
+ return (- scaledpoints/1000) * designsize * tfm.factor
+ end
+ else
+ return (- scaledpoints/1000) * 10 * tfm.factor
+ end
+ else
+ return scaledpoints
+ end
+end
+
+--[[ldx--
+<p>Before a font is passed to <l n='tex'/> we scale it. Here we also need
+to scale virtual characters.</p>
+--ldx]]--
+
+function tfm.get_virtual_id(tfmdata)
+ -- since we don't know the id yet, we use 0 as signal
+ if not tfmdata.fonts then
+ tfmdata.type = "virtual"
+ tfmdata.fonts = { { id = 0 } }
+ return 1
+ else
+ tfmdata.fonts[#tfmdata.fonts+1] = { id = 0 }
+ return #tfmdata.fonts
+ end
+end
+
+function tfm.check_virtual_id(tfmdata, id)
+ if tfmdata and tfmdata.type == "virtual" then
+ if not tfmdata.fonts or #tfmdata.fonts == 0 then
+ tfmdata.type, tfmdata.fonts = "real", nil
+ else
+ local vfonts = tfmdata.fonts
+ for f=1,#vfonts do
+ local fnt = vfonts[f]
+ if fnt.id and fnt.id == 0 then
+ fnt.id = id
+ end
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>Beware, the boundingbox is passed as reference so we may not overwrite it
+in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to
+excessive memory usage in CJK fonts, we no longer pass the boundingbox.)</p>
+--ldx]]--
+
+fonts.trace_scaling = false
+
+-- the following hack costs a bit of runtime but safes memory
+--
+-- basekerns are scaled and will be hashed by table id
+-- sharedkerns are unscaled and are be hashed by concatenated indexes
+
+--~ function tfm.check_base_kerns(tfmdata)
+--~ if tfm.share_base_kerns then
+--~ local sharedkerns = tfmdata.sharedkerns
+--~ if sharedkerns then
+--~ local basekerns = { }
+--~ tfmdata.basekerns = basekerns
+--~ return sharedkerns, basekerns
+--~ end
+--~ end
+--~ return nil, nil
+--~ end
+
+--~ function tfm.prepare_base_kerns(tfmdata)
+--~ if tfm.share_base_kerns and not tfmdata.sharedkerns then
+--~ local sharedkerns = { }
+--~ tfmdata.sharedkerns = sharedkerns
+--~ for u, chr in next, tfmdata.characters do
+--~ local kerns = chr.kerns
+--~ if kerns then
+--~ local hash = concat(sortedkeys(kerns), " ")
+--~ local base = sharedkerns[hash]
+--~ if not base then
+--~ sharedkerns[hash] = kerns
+--~ else
+--~ chr.kerns = base
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+-- we can have cache scaled characters when we are in node mode and don't have
+-- protruding and expansion: hash == fullname @ size @ protruding @ expansion
+-- but in practice (except from mk) the otf hash will be enough already so it
+-- makes no sense to mess up the code now
+
+local charactercache = { }
+
+-- The scaler is only used for otf and afm and virtual fonts. If
+-- a virtual font has italic correction make sure to set the
+-- has_italic flag. Some more flags will be added in the future.
+
+function tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
+ if scaledpoints < 0 then
+ scaledpoints = (- scaledpoints/1000) * tfmtable.designsize -- already in sp
+ end
+ local units = tfmtable.units or 1000
+ local delta = scaledpoints/units -- brr, some open type fonts have 2048
+ return scaledpoints, delta, units
+end
+
+function tfm.do_scale(tfmtable, scaledpoints, relativeid)
+ -- tfm.prepare_base_kerns(tfmtable) -- optimalization
+ local t = { } -- the new table
+ local scaledpoints, delta, units = tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
+ t.units_per_em = units or 1000
+ local hdelta, vdelta = delta, delta
+ -- unicoded unique descriptions shared cidinfo characters changed parameters indices
+ for k,v in next, tfmtable do
+ if type(v) == "table" then
+ -- print(k)
+ else
+ t[k] = v
+ end
+ end
+ local extend_factor = tfmtable.extend_factor or 0
+ if extend_factor ~= 0 and extend_factor ~= 1 then
+ hdelta = hdelta * extend_factor
+ t.extend = extend_factor * 1000
+ else
+ t.extend = 1000
+ end
+ local slant_factor = tfmtable.slant_factor or 0
+ if slant_factor ~= 0 then
+ t.slant = slant_factor * 1000
+ else
+ t.slant = 0
+ end
+ -- status
+ local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized
+ local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil)
+ local nodemode = tfmtable.mode == "node"
+ local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude
+ local hasitalic = tfmtable.has_italic
+ --
+ t.parameters = { }
+ t.characters = { }
+ t.MathConstants = { }
+ -- fast access
+ local descriptions = tfmtable.descriptions or { }
+ t.unicodes = tfmtable.unicodes
+ t.indices = tfmtable.indices
+ t.marks = tfmtable.marks
+t.goodies = tfmtable.goodies
+t.colorscheme = tfmtable.colorscheme
+--~ t.embedding = tfmtable.embedding
+ t.descriptions = descriptions
+ if tfmtable.fonts then
+ t.fonts = table.fastcopy(tfmtable.fonts) -- hm also at the end
+ end
+ local tp = t.parameters
+ local mp = t.math_parameters
+ local tfmp = tfmtable.parameters -- let's check for indexes
+ --
+ tp.slant = (tfmp.slant or tfmp[1] or 0)
+ tp.space = (tfmp.space or tfmp[2] or 0)*hdelta
+ tp.space_stretch = (tfmp.space_stretch or tfmp[3] or 0)*hdelta
+ tp.space_shrink = (tfmp.space_shrink or tfmp[4] or 0)*hdelta
+ tp.x_height = (tfmp.x_height or tfmp[5] or 0)*vdelta
+ tp.quad = (tfmp.quad or tfmp[6] or 0)*hdelta
+ tp.extra_space = (tfmp.extra_space or tfmp[7] or 0)*hdelta
+ local protrusionfactor = (tp.quad ~= 0 and 1000/tp.quad) or 0
+ local tc = t.characters
+ local characters = tfmtable.characters
+ local nameneeded = not tfmtable.shared.otfdata --hack
+ local changed = tfmtable.changed or { } -- for base mode
+ local ischanged = changed and next(changed)
+ local indices = tfmtable.indices
+ local luatex = tfmtable.luatex
+ local tounicode = luatex and luatex.tounicode
+ local defaultwidth = luatex and luatex.defaultwidth or 0
+ local defaultheight = luatex and luatex.defaultheight or 0
+ local defaultdepth = luatex and luatex.defaultdepth or 0
+ -- experimental, sharing kerns (unscaled and scaled) saves memory
+ -- local sharedkerns, basekerns = tfm.check_base_kerns(tfmtable)
+ -- loop over descriptions (afm and otf have descriptions, tfm not)
+ -- there is no need (yet) to assign a value to chr.tonunicode
+ local scaledwidth = defaultwidth * hdelta
+ local scaledheight = defaultheight * vdelta
+ local scaleddepth = defaultdepth * vdelta
+ local stackmath = tfmtable.ignore_stack_math ~= true
+ local private = fonts.private
+ local sharedkerns = { }
+ for k,v in next, characters do
+ local chr, description, index
+ if ischanged then
+ -- basemode hack
+ local c = changed[k]
+ if c then
+ description = descriptions[c] or v
+ v = characters[c] or v
+ index = (indices and indices[c]) or c
+ else
+ description = descriptions[k] or v
+ index = (indices and indices[k]) or k
+ end
+ else
+ description = descriptions[k] or v
+ index = (indices and indices[k]) or k
+ end
+ local width = description.width
+ local height = description.height
+ local depth = description.depth
+ if width then width = hdelta*width else width = scaledwidth end
+ if height then height = vdelta*height else height = scaledheight end
+ -- if depth then depth = vdelta*depth else depth = scaleddepth end
+ if depth and depth ~= 0 then
+ depth = delta*depth
+ if nameneeded then
+ chr = {
+ name = description.name,
+ index = index,
+ height = height,
+ depth = depth,
+ width = width,
+ }
+ else
+ chr = {
+ index = index,
+ height = height,
+ depth = depth,
+ width = width,
+ }
+ end
+ else
+ -- this saves a little bit of memory time and memory, esp for big cjk fonts
+ if nameneeded then
+ chr = {
+ name = description.name,
+ index = index,
+ height = height,
+ width = width,
+ }
+ else
+ chr = {
+ index = index,
+ height = height,
+ width = width,
+ }
+ end
+ end
+ -- if trace_scaling then
+ -- logs.report("define font","t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-')
+ -- end
+ if tounicode then
+ local tu = tounicode[index] -- nb: index!
+ if tu then
+ chr.tounicode = tu
+ end
+ end
+ if hasquality then
+ -- we could move these calculations elsewhere (saves calculations)
+ local ve = v.expansion_factor
+ if ve then
+ chr.expansion_factor = ve*1000 -- expansionfactor, hm, can happen elsewhere
+ end
+ local vl = v.left_protruding
+ if vl then
+ chr.left_protruding = protrusionfactor*width*vl
+ end
+ local vr = v.right_protruding
+ if vr then
+ chr.right_protruding = protrusionfactor*width*vr
+ end
+ end
+ -- todo: hasitalic
+ if hasitalic then
+ local vi = description.italic or v.italic
+ if vi and vi ~= 0 then
+ chr.italic = vi*hdelta
+ end
+ end
+ -- to be tested
+ if hasmath then
+ -- todo, just operate on descriptions.math
+ local vn = v.next
+ if vn then
+ chr.next = vn
+ else
+ local vv = v.vert_variants
+ if vv then
+ local t = { }
+ for i=1,#vv do
+ local vvi = vv[i]
+ t[i] = {
+ ["start"] = (vvi["start"] or 0)*vdelta,
+ ["end"] = (vvi["end"] or 0)*vdelta,
+ ["advance"] = (vvi["advance"] or 0)*vdelta,
+ ["extender"] = vvi["extender"],
+ ["glyph"] = vvi["glyph"],
+ }
+ end
+ chr.vert_variants = t
+ --~ local ic = v.vert_italic_correction
+ --~ if ic then
+ --~ chr.italic = ic * hdelta
+ --~ print(format("0x%05X -> %s",k,chr.italic))
+ --~ end
+ else
+ local hv = v.horiz_variants
+ if hv then
+ local t = { }
+ for i=1,#hv do
+ local hvi = hv[i]
+ t[i] = {
+ ["start"] = (hvi["start"] or 0)*hdelta,
+ ["end"] = (hvi["end"] or 0)*hdelta,
+ ["advance"] = (hvi["advance"] or 0)*hdelta,
+ ["extender"] = hvi["extender"],
+ ["glyph"] = hvi["glyph"],
+ }
+ end
+ chr.horiz_variants = t
+ end
+ end
+ end
+ local vt = description.top_accent
+ if vt then
+ chr.top_accent = vdelta*vt
+ end
+ if stackmath then
+ local mk = v.mathkerns
+ if mk then
+ local kerns = { }
+ local v = mk.top_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.top_right = k end
+ local v = mk.top_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.top_left = k end
+ local v = mk.bottom_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.bottom_left = k end
+ local v = mk.bottom_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.bottom_right = k end
+ chr.mathkern = kerns -- singular
+ end
+ end
+ end
+ if not nodemode then
+ local vk = v.kerns
+ if vk then
+ --~ if sharedkerns then
+ --~ local base = basekerns[vk] -- hashed by table id, not content
+ --~ if not base then
+ --~ base = {}
+ --~ for k,v in next, vk do base[k] = v*hdelta end
+ --~ basekerns[vk] = base
+ --~ end
+ --~ chr.kerns = base
+ --~ else
+ --~ local tt = {}
+ --~ for k,v in next, vk do tt[k] = v*hdelta end
+ --~ chr.kerns = tt
+ --~ end
+ local s = sharedkerns[vk]
+ if not s then
+ s = { }
+ for k,v in next, vk do s[k] = v*hdelta end
+ sharedkerns[vk] = s
+ end
+ chr.kerns = s
+ end
+ local vl = v.ligatures
+ if vl then
+ if true then
+ chr.ligatures = vl -- shared
+ else
+ local tt = { }
+ for i,l in next, vl do
+ tt[i] = l
+ end
+ chr.ligatures = tt
+ end
+ end
+ end
+ if isvirtual then
+ local vc = v.commands
+ if vc then
+ -- we assume non scaled commands here
+ -- tricky .. we need to scale pseudo math glyphs too
+ -- which is why we deal with rules too
+ local ok = false
+ for i=1,#vc do
+ local key = vc[i][1]
+ if key == "right" or key == "down" then
+ ok = true
+ break
+ end
+ end
+ if ok then
+ local tt = { }
+ for i=1,#vc do
+ local ivc = vc[i]
+ local key = ivc[1]
+ if key == "right" then
+ tt[#tt+1] = { key, ivc[2]*hdelta }
+ elseif key == "down" then
+ tt[#tt+1] = { key, ivc[2]*vdelta }
+ elseif key == "rule" then
+ tt[#tt+1] = { key, ivc[2]*vdelta, ivc[3]*hdelta }
+ else -- not comment
+ tt[#tt+1] = ivc -- shared since in cache and untouched
+ end
+ end
+ chr.commands = tt
+ else
+ chr.commands = vc
+ end
+ end
+ end
+ tc[k] = chr
+ end
+ -- t.encodingbytes, t.filename, t.fullname, t.name: elsewhere
+ t.size = scaledpoints
+ t.factor = delta
+ t.hfactor = hdelta
+ t.vfactor = vdelta
+ if t.fonts then
+ t.fonts = table.fastcopy(t.fonts) -- maybe we virtualize more afterwards
+ end
+ if hasmath then
+ -- mathematics.extras.copy(t) -- can be done elsewhere if needed
+ local ma = tfm.mathactions
+ for i=1,#ma do
+ ma[i](t,tfmtable,delta,hdelta,vdelta) -- what delta?
+ end
+ end
+ -- needed for \high cum suis
+ local tpx = tp.x_height
+ if hasmath then
+ if not tp[13] then tp[13] = .86*tpx end -- mathsupdisplay
+ if not tp[14] then tp[14] = .86*tpx end -- mathsupnormal
+ if not tp[15] then tp[15] = .86*tpx end -- mathsupcramped
+ if not tp[16] then tp[16] = .48*tpx end -- mathsubnormal
+ if not tp[17] then tp[17] = .48*tpx end -- mathsubcombined
+ if not tp[22] then tp[22] = 0 end -- mathaxisheight
+ if t.MathConstants then t.MathConstants.AccentBaseHeight = nil end -- safeguard
+ end
+ t.tounicode = 1
+ t.cidinfo = tfmtable.cidinfo
+ -- we have t.name=metricfile and t.fullname=RealName and t.filename=diskfilename
+ -- when collapsing fonts, luatex looks as both t.name and t.fullname as ttc files
+ -- can have multiple subfonts
+ if hasmath then
+ if trace_defining then
+ logs.report("define font","math enabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+ end
+ else
+ if trace_defining then
+ logs.report("define font","math disabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+ end
+ t.nomath, t.MathConstants = true, nil
+ end
+ if not t.psname then
+ -- name used in pdf file as well as for selecting subfont in ttc/dfont
+ t.psname = t.fontname or (t.fullname and fonts.names.cleanname(t.fullname))
+ end
+ if trace_defining then
+ logs.report("define font","used for accesing subfont: '%s'",t.psname or "nopsname")
+ logs.report("define font","used for subsetting: '%s'",t.fontname or "nofontname")
+ end
+--~ print(t.fontname,table.serialize(t.MathConstants))
+ return t, delta
+end
+
+--[[ldx--
+<p>The reason why the scaler is split, is that for a while we experimented
+with a helper function. However, in practice the <l n='api'/> calls are too slow to
+make this profitable and the <l n='lua'/> based variant was just faster. A days
+wasted day but an experience richer.</p>
+--ldx]]--
+
+tfm.auto_cleanup = true
+
+local lastfont = nil
+
+-- we can get rid of the tfm instance when we have fast access to the
+-- scaled character dimensions at the tex end, e.g. a fontobject.width
+--
+-- flushing the kern and ligature tables from memory saves a lot (only
+-- base mode) but it complicates vf building where the new characters
+-- demand this data .. solution: functions that access them
+
+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 tfmdata.type == 'virtual' or tfmdata.virtualized then
+ for k, v in next, tfmdata.characters do
+ if v.commands then v.commands = nil end
+ -- if v.kerns then v.kerns = nil end
+ end
+ else
+ -- for k, v in next, tfmdata.characters do
+ -- if v.kerns then v.kerns = nil end
+ -- end
+ end
+ end
+end
+
+function tfm.cleanup(tfmdata) -- we need a cleanup callback, now we miss the last one
+end
+
+function tfm.scale(tfmtable, scaledpoints, relativeid)
+ local t, factor = tfm.do_scale(tfmtable, scaledpoints, relativeid)
+ t.factor = factor
+ t.ascender = factor*(tfmtable.ascender or 0)
+ t.descender = factor*(tfmtable.descender or 0)
+ t.shared = tfmtable.shared or { }
+ t.unique = table.fastcopy(tfmtable.unique or {})
+--~ print("scaling", t.name, t.factor) -- , tfm.hash_features(tfmtable.specification))
+ tfm.cleanup(t)
+ return t
+end
+
+--[[ldx--
+<p>Analyzers run per script and/or language and are needed in order to
+process features right.</p>
+--ldx]]--
+
+fonts.analyzers = fonts.analyzers or { }
+fonts.analyzers.aux = fonts.analyzers.aux or { }
+fonts.analyzers.methods = fonts.analyzers.methods or { }
+fonts.analyzers.initializers = fonts.analyzers.initializers or { }
+
+-- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
+-- e.g. latin -> hyphenate, arab -> 1/2/3 analyze
+
+-- an example analyzer (should move to font-ota.lua)
+
+local state = attributes.private('state')
+
+function fonts.analyzers.aux.setstate(head,font)
+ 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
+ local id = current.id
+ if id == glyph and current.font == font 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
+ first, last, n = current, current, 1
+ set_attribute(current,state,1) -- init
+ else
+ last, n = current, n+1
+ set_attribute(current,state,2) -- medi
+ end
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ elseif id == disc then
+ -- always in the middle
+ set_attribute(current,state,2) -- midi
+ last = current
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ current = current.next
+ end
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ return head, done
+end
+
+function tfm.replacements(tfm,value)
+ -- tfm.characters[0x0022] = table.fastcopy(tfm.characters[0x201D])
+ -- tfm.characters[0x0027] = table.fastcopy(tfm.characters[0x2019])
+ -- tfm.characters[0x0060] = table.fastcopy(tfm.characters[0x2018])
+ -- tfm.characters[0x0022] = tfm.characters[0x201D]
+ tfm.characters[0x0027] = tfm.characters[0x2019]
+ -- tfm.characters[0x0060] = tfm.characters[0x2018]
+end
+
+-- checking
+
+function tfm.checked_filename(metadata,whatever)
+ local foundfilename = metadata.foundfilename
+ if not foundfilename then
+ local askedfilename = metadata.filename or ""
+ if askedfilename ~= "" then
+ foundfilename = resolvers.findbinfile(askedfilename,"") or ""
+ if foundfilename == "" then
+ logs.report("fonts","source file '%s' is not found",askedfilename)
+ foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or ""
+ if foundfilename ~= "" then
+ logs.report("fonts","using source file '%s' (cache mismatch)",foundfilename)
+ end
+ end
+ elseif whatever then
+ logs.report("fonts","no source file for '%s'",whatever)
+ foundfilename = ""
+ end
+ metadata.foundfilename = foundfilename
+ -- logs.report("fonts","using source file '%s'",foundfilename)
+ end
+ return foundfilename
+end
+
+-- status info
+
+statistics.register("fonts load time", function()
+ return statistics.elapsedseconds(fonts)
+end)
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-cid'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (cidmaps)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, match, lower = string.format, string.match, string.lower
+local tonumber = tonumber
+local lpegmatch = lpeg.match
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+
+fonts = fonts or { }
+fonts.cid = fonts.cid or { }
+fonts.cid.map = fonts.cid.map or { }
+fonts.cid.max = fonts.cid.max or 10
+
+
+-- original string parser: 0.109, lpeg parser: 0.036 seconds for Adobe-CNS1-4.cidmap
+--
+-- 18964 18964 (leader)
+-- 0 /.notdef
+-- 1..95 0020
+-- 99 3000
+
+local number = lpeg.C(lpeg.R("09","af","AF")^1)
+local space = lpeg.S(" \n\r\t")
+local spaces = space^0
+local period = lpeg.P(".")
+local periods = period * period
+local name = lpeg.P("/") * lpeg.C((1-space)^1)
+
+local unicodes, names = { }, { }
+
+local function do_one(a,b)
+ unicodes[tonumber(a)] = tonumber(b,16)
+end
+
+local function do_range(a,b,c)
+ c = tonumber(c,16)
+ for i=tonumber(a),tonumber(b) do
+ unicodes[i] = c
+ c = c + 1
+ end
+end
+
+local function do_name(a,b)
+ names[tonumber(a)] = b
+end
+
+local grammar = lpeg.P { "start",
+ start = number * spaces * number * lpeg.V("series"),
+ series = (spaces * (lpeg.V("one") + lpeg.V("range") + lpeg.V("named")) )^1,
+ one = (number * spaces * number) / do_one,
+ range = (number * periods * number * spaces * number) / do_range,
+ named = (number * spaces * name) / do_name
+}
+
+function fonts.cid.load(filename)
+ local data = io.loaddata(filename)
+ if data then
+ unicodes, names = { }, { }
+ lpegmatch(grammar,data)
+ local supplement, registry, ordering = match(filename,"^(.-)%-(.-)%-()%.(.-)$")
+ return {
+ supplement = supplement,
+ registry = registry,
+ ordering = ordering,
+ filename = filename,
+ unicodes = unicodes,
+ names = names
+ }
+ else
+ return nil
+ end
+end
+
+local template = "%s-%s-%s.cidmap"
+
+
+local function locate(registry,ordering,supplement)
+ local filename = format(template,registry,ordering,supplement)
+ local hashname = lower(filename)
+ local cidmap = fonts.cid.map[hashname]
+ if not cidmap then
+ if trace_loading then
+ logs.report("load otf","checking cidmap, registry: %s, ordering: %s, supplement: %s, filename: %s",registry,ordering,supplement,filename)
+ end
+ local fullname = resolvers.find_file(filename,'cid') or ""
+ if fullname ~= "" then
+ cidmap = fonts.cid.load(fullname)
+ if cidmap then
+ if trace_loading then
+ logs.report("load otf","using cidmap file %s",filename)
+ end
+ fonts.cid.map[hashname] = cidmap
+ cidmap.usedname = file.basename(filename)
+ return cidmap
+ end
+ end
+ end
+ return cidmap
+end
+
+function fonts.cid.getmap(registry,ordering,supplement)
+ -- cf Arthur R. we can safely scan upwards since cids are downward compatible
+ local supplement = tonumber(supplement)
+ if trace_loading then
+ logs.report("load otf","needed cidmap, registry: %s, ordering: %s, supplement: %s",registry,ordering,supplement)
+ end
+ local cidmap = locate(registry,ordering,supplement)
+ if not cidmap then
+ local cidnum = nil
+ -- next highest (alternatively we could start high)
+ if supplement < fonts.cid.max then
+ for supplement=supplement+1,fonts.cid.max do
+ local c = locate(registry,ordering,supplement)
+ if c then
+ cidmap, cidnum = c, supplement
+ break
+ end
+ end
+ end
+ -- next lowest (least worse fit)
+ if not cidmap and supplement > 0 then
+ for supplement=supplement-1,0,-1 do
+ local c = locate(registry,ordering,supplement)
+ if c then
+ cidmap, cidnum = c, supplement
+ break
+ end
+ end
+ end
+ -- prevent further lookups
+ if cidmap and cidnum > 0 then
+ for s=0,cidnum-1 do
+ filename = format(template,registry,ordering,s)
+ if not fonts.cid.map[filename] then
+ fonts.cid.map[filename] = cidmap -- copy of ref
+ end
+ end
+ end
+ end
+ return cidmap
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-otf'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (tables)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local gsub, lower = string.gsub, string.lower
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+
+local otf = fonts.otf
+
+otf.tables = otf.tables or { }
+otf.meanings = otf.meanings or { }
+
+otf.tables.scripts = {
+ ['dflt'] = 'Default',
+
+ ['arab'] = 'Arabic',
+ ['armn'] = 'Armenian',
+ ['bali'] = 'Balinese',
+ ['beng'] = 'Bengali',
+ ['bopo'] = 'Bopomofo',
+ ['brai'] = 'Braille',
+ ['bugi'] = 'Buginese',
+ ['buhd'] = 'Buhid',
+ ['byzm'] = 'Byzantine Music',
+ ['cans'] = 'Canadian Syllabics',
+ ['cher'] = 'Cherokee',
+ ['copt'] = 'Coptic',
+ ['cprt'] = 'Cypriot Syllabary',
+ ['cyrl'] = 'Cyrillic',
+ ['deva'] = 'Devanagari',
+ ['dsrt'] = 'Deseret',
+ ['ethi'] = 'Ethiopic',
+ ['geor'] = 'Georgian',
+ ['glag'] = 'Glagolitic',
+ ['goth'] = 'Gothic',
+ ['grek'] = 'Greek',
+ ['gujr'] = 'Gujarati',
+ ['guru'] = 'Gurmukhi',
+ ['hang'] = 'Hangul',
+ ['hani'] = 'CJK Ideographic',
+ ['hano'] = 'Hanunoo',
+ ['hebr'] = 'Hebrew',
+ ['ital'] = 'Old Italic',
+ ['jamo'] = 'Hangul Jamo',
+ ['java'] = 'Javanese',
+ ['kana'] = 'Hiragana and Katakana',
+ ['khar'] = 'Kharosthi',
+ ['khmr'] = 'Khmer',
+ ['knda'] = 'Kannada',
+ ['lao' ] = 'Lao',
+ ['latn'] = 'Latin',
+ ['limb'] = 'Limbu',
+ ['linb'] = 'Linear B',
+ ['math'] = 'Mathematical Alphanumeric Symbols',
+ ['mlym'] = 'Malayalam',
+ ['mong'] = 'Mongolian',
+ ['musc'] = 'Musical Symbols',
+ ['mymr'] = 'Myanmar',
+ ['nko' ] = "N'ko",
+ ['ogam'] = 'Ogham',
+ ['orya'] = 'Oriya',
+ ['osma'] = 'Osmanya',
+ ['phag'] = 'Phags-pa',
+ ['phnx'] = 'Phoenician',
+ ['runr'] = 'Runic',
+ ['shaw'] = 'Shavian',
+ ['sinh'] = 'Sinhala',
+ ['sylo'] = 'Syloti Nagri',
+ ['syrc'] = 'Syriac',
+ ['tagb'] = 'Tagbanwa',
+ ['tale'] = 'Tai Le',
+ ['talu'] = 'Tai Lu',
+ ['taml'] = 'Tamil',
+ ['telu'] = 'Telugu',
+ ['tfng'] = 'Tifinagh',
+ ['tglg'] = 'Tagalog',
+ ['thaa'] = 'Thaana',
+ ['thai'] = 'Thai',
+ ['tibt'] = 'Tibetan',
+ ['ugar'] = 'Ugaritic Cuneiform',
+ ['xpeo'] = 'Old Persian Cuneiform',
+ ['xsux'] = 'Sumero-Akkadian Cuneiform',
+ ['yi' ] = 'Yi',
+}
+
+otf.tables.languages = {
+ ['dflt'] = 'Default',
+
+ ['aba'] = 'Abaza',
+ ['abk'] = 'Abkhazian',
+ ['ady'] = 'Adyghe',
+ ['afk'] = 'Afrikaans',
+ ['afr'] = 'Afar',
+ ['agw'] = 'Agaw',
+ ['als'] = 'Alsatian',
+ ['alt'] = 'Altai',
+ ['amh'] = 'Amharic',
+ ['ara'] = 'Arabic',
+ ['ari'] = 'Aari',
+ ['ark'] = 'Arakanese',
+ ['asm'] = 'Assamese',
+ ['ath'] = 'Athapaskan',
+ ['avr'] = 'Avar',
+ ['awa'] = 'Awadhi',
+ ['aym'] = 'Aymara',
+ ['aze'] = 'Azeri',
+ ['bad'] = 'Badaga',
+ ['bag'] = 'Baghelkhandi',
+ ['bal'] = 'Balkar',
+ ['bau'] = 'Baule',
+ ['bbr'] = 'Berber',
+ ['bch'] = 'Bench',
+ ['bcr'] = 'Bible Cree',
+ ['bel'] = 'Belarussian',
+ ['bem'] = 'Bemba',
+ ['ben'] = 'Bengali',
+ ['bgr'] = 'Bulgarian',
+ ['bhi'] = 'Bhili',
+ ['bho'] = 'Bhojpuri',
+ ['bik'] = 'Bikol',
+ ['bil'] = 'Bilen',
+ ['bkf'] = 'Blackfoot',
+ ['bli'] = 'Balochi',
+ ['bln'] = 'Balante',
+ ['blt'] = 'Balti',
+ ['bmb'] = 'Bambara',
+ ['bml'] = 'Bamileke',
+ ['bos'] = 'Bosnian',
+ ['bre'] = 'Breton',
+ ['brh'] = 'Brahui',
+ ['bri'] = 'Braj Bhasha',
+ ['brm'] = 'Burmese',
+ ['bsh'] = 'Bashkir',
+ ['bti'] = 'Beti',
+ ['cat'] = 'Catalan',
+ ['ceb'] = 'Cebuano',
+ ['che'] = 'Chechen',
+ ['chg'] = 'Chaha Gurage',
+ ['chh'] = 'Chattisgarhi',
+ ['chi'] = 'Chichewa',
+ ['chk'] = 'Chukchi',
+ ['chp'] = 'Chipewyan',
+ ['chr'] = 'Cherokee',
+ ['chu'] = 'Chuvash',
+ ['cmr'] = 'Comorian',
+ ['cop'] = 'Coptic',
+ ['cos'] = 'Corsican',
+ ['cre'] = 'Cree',
+ ['crr'] = 'Carrier',
+ ['crt'] = 'Crimean Tatar',
+ ['csl'] = 'Church Slavonic',
+ ['csy'] = 'Czech',
+ ['dan'] = 'Danish',
+ ['dar'] = 'Dargwa',
+ ['dcr'] = 'Woods Cree',
+ ['deu'] = 'German',
+ ['dgr'] = 'Dogri',
+ ['div'] = 'Divehi',
+ ['djr'] = 'Djerma',
+ ['dng'] = 'Dangme',
+ ['dnk'] = 'Dinka',
+ ['dri'] = 'Dari',
+ ['dun'] = 'Dungan',
+ ['dzn'] = 'Dzongkha',
+ ['ebi'] = 'Ebira',
+ ['ecr'] = 'Eastern Cree',
+ ['edo'] = 'Edo',
+ ['efi'] = 'Efik',
+ ['ell'] = 'Greek',
+ ['eng'] = 'English',
+ ['erz'] = 'Erzya',
+ ['esp'] = 'Spanish',
+ ['eti'] = 'Estonian',
+ ['euq'] = 'Basque',
+ ['evk'] = 'Evenki',
+ ['evn'] = 'Even',
+ ['ewe'] = 'Ewe',
+ ['fan'] = 'French Antillean',
+ ['far'] = 'Farsi',
+ ['fin'] = 'Finnish',
+ ['fji'] = 'Fijian',
+ ['fle'] = 'Flemish',
+ ['fne'] = 'Forest Nenets',
+ ['fon'] = 'Fon',
+ ['fos'] = 'Faroese',
+ ['fra'] = 'French',
+ ['fri'] = 'Frisian',
+ ['frl'] = 'Friulian',
+ ['fta'] = 'Futa',
+ ['ful'] = 'Fulani',
+ ['gad'] = 'Ga',
+ ['gae'] = 'Gaelic',
+ ['gag'] = 'Gagauz',
+ ['gal'] = 'Galician',
+ ['gar'] = 'Garshuni',
+ ['gaw'] = 'Garhwali',
+ ['gez'] = "Ge'ez",
+ ['gil'] = 'Gilyak',
+ ['gmz'] = 'Gumuz',
+ ['gon'] = 'Gondi',
+ ['grn'] = 'Greenlandic',
+ ['gro'] = 'Garo',
+ ['gua'] = 'Guarani',
+ ['guj'] = 'Gujarati',
+ ['hai'] = 'Haitian',
+ ['hal'] = 'Halam',
+ ['har'] = 'Harauti',
+ ['hau'] = 'Hausa',
+ ['haw'] = 'Hawaiin',
+ ['hbn'] = 'Hammer-Banna',
+ ['hil'] = 'Hiligaynon',
+ ['hin'] = 'Hindi',
+ ['hma'] = 'High Mari',
+ ['hnd'] = 'Hindko',
+ ['ho'] = 'Ho',
+ ['hri'] = 'Harari',
+ ['hrv'] = 'Croatian',
+ ['hun'] = 'Hungarian',
+ ['hye'] = 'Armenian',
+ ['ibo'] = 'Igbo',
+ ['ijo'] = 'Ijo',
+ ['ilo'] = 'Ilokano',
+ ['ind'] = 'Indonesian',
+ ['ing'] = 'Ingush',
+ ['inu'] = 'Inuktitut',
+ ['iri'] = 'Irish',
+ ['irt'] = 'Irish Traditional',
+ ['isl'] = 'Icelandic',
+ ['ism'] = 'Inari Sami',
+ ['ita'] = 'Italian',
+ ['iwr'] = 'Hebrew',
+ ['jan'] = 'Japanese',
+ ['jav'] = 'Javanese',
+ ['jii'] = 'Yiddish',
+ ['jud'] = 'Judezmo',
+ ['jul'] = 'Jula',
+ ['kab'] = 'Kabardian',
+ ['kac'] = 'Kachchi',
+ ['kal'] = 'Kalenjin',
+ ['kan'] = 'Kannada',
+ ['kar'] = 'Karachay',
+ ['kat'] = 'Georgian',
+ ['kaz'] = 'Kazakh',
+ ['keb'] = 'Kebena',
+ ['kge'] = 'Khutsuri Georgian',
+ ['kha'] = 'Khakass',
+ ['khk'] = 'Khanty-Kazim',
+ ['khm'] = 'Khmer',
+ ['khs'] = 'Khanty-Shurishkar',
+ ['khv'] = 'Khanty-Vakhi',
+ ['khw'] = 'Khowar',
+ ['kik'] = 'Kikuyu',
+ ['kir'] = 'Kirghiz',
+ ['kis'] = 'Kisii',
+ ['kkn'] = 'Kokni',
+ ['klm'] = 'Kalmyk',
+ ['kmb'] = 'Kamba',
+ ['kmn'] = 'Kumaoni',
+ ['kmo'] = 'Komo',
+ ['kms'] = 'Komso',
+ ['knr'] = 'Kanuri',
+ ['kod'] = 'Kodagu',
+ ['koh'] = 'Korean Old Hangul',
+ ['kok'] = 'Konkani',
+ ['kon'] = 'Kikongo',
+ ['kop'] = 'Komi-Permyak',
+ ['kor'] = 'Korean',
+ ['koz'] = 'Komi-Zyrian',
+ ['kpl'] = 'Kpelle',
+ ['kri'] = 'Krio',
+ ['krk'] = 'Karakalpak',
+ ['krl'] = 'Karelian',
+ ['krm'] = 'Karaim',
+ ['krn'] = 'Karen',
+ ['krt'] = 'Koorete',
+ ['ksh'] = 'Kashmiri',
+ ['ksi'] = 'Khasi',
+ ['ksm'] = 'Kildin Sami',
+ ['kui'] = 'Kui',
+ ['kul'] = 'Kulvi',
+ ['kum'] = 'Kumyk',
+ ['kur'] = 'Kurdish',
+ ['kuu'] = 'Kurukh',
+ ['kuy'] = 'Kuy',
+ ['kyk'] = 'Koryak',
+ ['lad'] = 'Ladin',
+ ['lah'] = 'Lahuli',
+ ['lak'] = 'Lak',
+ ['lam'] = 'Lambani',
+ ['lao'] = 'Lao',
+ ['lat'] = 'Latin',
+ ['laz'] = 'Laz',
+ ['lcr'] = 'L-Cree',
+ ['ldk'] = 'Ladakhi',
+ ['lez'] = 'Lezgi',
+ ['lin'] = 'Lingala',
+ ['lma'] = 'Low Mari',
+ ['lmb'] = 'Limbu',
+ ['lmw'] = 'Lomwe',
+ ['lsb'] = 'Lower Sorbian',
+ ['lsm'] = 'Lule Sami',
+ ['lth'] = 'Lithuanian',
+ ['ltz'] = 'Luxembourgish',
+ ['lub'] = 'Luba',
+ ['lug'] = 'Luganda',
+ ['luh'] = 'Luhya',
+ ['luo'] = 'Luo',
+ ['lvi'] = 'Latvian',
+ ['maj'] = 'Majang',
+ ['mak'] = 'Makua',
+ ['mal'] = 'Malayalam Traditional',
+ ['man'] = 'Mansi',
+ ['map'] = 'Mapudungun',
+ ['mar'] = 'Marathi',
+ ['maw'] = 'Marwari',
+ ['mbn'] = 'Mbundu',
+ ['mch'] = 'Manchu',
+ ['mcr'] = 'Moose Cree',
+ ['mde'] = 'Mende',
+ ['men'] = "Me'en",
+ ['miz'] = 'Mizo',
+ ['mkd'] = 'Macedonian',
+ ['mle'] = 'Male',
+ ['mlg'] = 'Malagasy',
+ ['mln'] = 'Malinke',
+ ['mlr'] = 'Malayalam Reformed',
+ ['mly'] = 'Malay',
+ ['mnd'] = 'Mandinka',
+ ['mng'] = 'Mongolian',
+ ['mni'] = 'Manipuri',
+ ['mnk'] = 'Maninka',
+ ['mnx'] = 'Manx Gaelic',
+ ['moh'] = 'Mohawk',
+ ['mok'] = 'Moksha',
+ ['mol'] = 'Moldavian',
+ ['mon'] = 'Mon',
+ ['mor'] = 'Moroccan',
+ ['mri'] = 'Maori',
+ ['mth'] = 'Maithili',
+ ['mts'] = 'Maltese',
+ ['mun'] = 'Mundari',
+ ['nag'] = 'Naga-Assamese',
+ ['nan'] = 'Nanai',
+ ['nas'] = 'Naskapi',
+ ['ncr'] = 'N-Cree',
+ ['ndb'] = 'Ndebele',
+ ['ndg'] = 'Ndonga',
+ ['nep'] = 'Nepali',
+ ['new'] = 'Newari',
+ ['ngr'] = 'Nagari',
+ ['nhc'] = 'Norway House Cree',
+ ['nis'] = 'Nisi',
+ ['niu'] = 'Niuean',
+ ['nkl'] = 'Nkole',
+ ['nko'] = "N'ko",
+ ['nld'] = 'Dutch',
+ ['nog'] = 'Nogai',
+ ['nor'] = 'Norwegian',
+ ['nsm'] = 'Northern Sami',
+ ['nta'] = 'Northern Tai',
+ ['nto'] = 'Esperanto',
+ ['nyn'] = 'Nynorsk',
+ ['oci'] = 'Occitan',
+ ['ocr'] = 'Oji-Cree',
+ ['ojb'] = 'Ojibway',
+ ['ori'] = 'Oriya',
+ ['oro'] = 'Oromo',
+ ['oss'] = 'Ossetian',
+ ['paa'] = 'Palestinian Aramaic',
+ ['pal'] = 'Pali',
+ ['pan'] = 'Punjabi',
+ ['pap'] = 'Palpa',
+ ['pas'] = 'Pashto',
+ ['pgr'] = 'Polytonic Greek',
+ ['pil'] = 'Pilipino',
+ ['plg'] = 'Palaung',
+ ['plk'] = 'Polish',
+ ['pro'] = 'Provencal',
+ ['ptg'] = 'Portuguese',
+ ['qin'] = 'Chin',
+ ['raj'] = 'Rajasthani',
+ ['rbu'] = 'Russian Buriat',
+ ['rcr'] = 'R-Cree',
+ ['ria'] = 'Riang',
+ ['rms'] = 'Rhaeto-Romanic',
+ ['rom'] = 'Romanian',
+ ['roy'] = 'Romany',
+ ['rsy'] = 'Rusyn',
+ ['rua'] = 'Ruanda',
+ ['rus'] = 'Russian',
+ ['sad'] = 'Sadri',
+ ['san'] = 'Sanskrit',
+ ['sat'] = 'Santali',
+ ['say'] = 'Sayisi',
+ ['sek'] = 'Sekota',
+ ['sel'] = 'Selkup',
+ ['sgo'] = 'Sango',
+ ['shn'] = 'Shan',
+ ['sib'] = 'Sibe',
+ ['sid'] = 'Sidamo',
+ ['sig'] = 'Silte Gurage',
+ ['sks'] = 'Skolt Sami',
+ ['sky'] = 'Slovak',
+ ['sla'] = 'Slavey',
+ ['slv'] = 'Slovenian',
+ ['sml'] = 'Somali',
+ ['smo'] = 'Samoan',
+ ['sna'] = 'Sena',
+ ['snd'] = 'Sindhi',
+ ['snh'] = 'Sinhalese',
+ ['snk'] = 'Soninke',
+ ['sog'] = 'Sodo Gurage',
+ ['sot'] = 'Sotho',
+ ['sqi'] = 'Albanian',
+ ['srb'] = 'Serbian',
+ ['srk'] = 'Saraiki',
+ ['srr'] = 'Serer',
+ ['ssl'] = 'South Slavey',
+ ['ssm'] = 'Southern Sami',
+ ['sur'] = 'Suri',
+ ['sva'] = 'Svan',
+ ['sve'] = 'Swedish',
+ ['swa'] = 'Swadaya Aramaic',
+ ['swk'] = 'Swahili',
+ ['swz'] = 'Swazi',
+ ['sxt'] = 'Sutu',
+ ['syr'] = 'Syriac',
+ ['tab'] = 'Tabasaran',
+ ['taj'] = 'Tajiki',
+ ['tam'] = 'Tamil',
+ ['tat'] = 'Tatar',
+ ['tcr'] = 'TH-Cree',
+ ['tel'] = 'Telugu',
+ ['tgn'] = 'Tongan',
+ ['tgr'] = 'Tigre',
+ ['tgy'] = 'Tigrinya',
+ ['tha'] = 'Thai',
+ ['tht'] = 'Tahitian',
+ ['tib'] = 'Tibetan',
+ ['tkm'] = 'Turkmen',
+ ['tmn'] = 'Temne',
+ ['tna'] = 'Tswana',
+ ['tne'] = 'Tundra Nenets',
+ ['tng'] = 'Tonga',
+ ['tod'] = 'Todo',
+ ['trk'] = 'Turkish',
+ ['tsg'] = 'Tsonga',
+ ['tua'] = 'Turoyo Aramaic',
+ ['tul'] = 'Tulu',
+ ['tuv'] = 'Tuvin',
+ ['twi'] = 'Twi',
+ ['udm'] = 'Udmurt',
+ ['ukr'] = 'Ukrainian',
+ ['urd'] = 'Urdu',
+ ['usb'] = 'Upper Sorbian',
+ ['uyg'] = 'Uyghur',
+ ['uzb'] = 'Uzbek',
+ ['ven'] = 'Venda',
+ ['vit'] = 'Vietnamese',
+ ['wa' ] = 'Wa',
+ ['wag'] = 'Wagdi',
+ ['wcr'] = 'West-Cree',
+ ['wel'] = 'Welsh',
+ ['wlf'] = 'Wolof',
+ ['xbd'] = 'Tai Lue',
+ ['xhs'] = 'Xhosa',
+ ['yak'] = 'Yakut',
+ ['yba'] = 'Yoruba',
+ ['ycr'] = 'Y-Cree',
+ ['yic'] = 'Yi Classic',
+ ['yim'] = 'Yi Modern',
+ ['zhh'] = 'Chinese Hong Kong',
+ ['zhp'] = 'Chinese Phonetic',
+ ['zhs'] = 'Chinese Simplified',
+ ['zht'] = 'Chinese Traditional',
+ ['znd'] = 'Zande',
+ ['zul'] = 'Zulu'
+}
+
+otf.tables.features = {
+ ['aalt'] = 'Access All Alternates',
+ ['abvf'] = 'Above-Base Forms',
+ ['abvm'] = 'Above-Base Mark Positioning',
+ ['abvs'] = 'Above-Base Substitutions',
+ ['afrc'] = 'Alternative Fractions',
+ ['akhn'] = 'Akhands',
+ ['blwf'] = 'Below-Base Forms',
+ ['blwm'] = 'Below-Base Mark Positioning',
+ ['blws'] = 'Below-Base Substitutions',
+ ['c2pc'] = 'Petite Capitals From Capitals',
+ ['c2sc'] = 'Small Capitals From Capitals',
+ ['calt'] = 'Contextual Alternates',
+ ['case'] = 'Case-Sensitive Forms',
+ ['ccmp'] = 'Glyph Composition/Decomposition',
+ ['cjct'] = 'Conjunct Forms',
+ ['clig'] = 'Contextual Ligatures',
+ ['cpsp'] = 'Capital Spacing',
+ ['cswh'] = 'Contextual Swash',
+ ['curs'] = 'Cursive Positioning',
+ ['dflt'] = 'Default Processing',
+ ['dist'] = 'Distances',
+ ['dlig'] = 'Discretionary Ligatures',
+ ['dnom'] = 'Denominators',
+ ['dtls'] = 'Dotless Forms', -- math
+ ['expt'] = 'Expert Forms',
+ ['falt'] = 'Final glyph Alternates',
+ ['fin2'] = 'Terminal Forms #2',
+ ['fin3'] = 'Terminal Forms #3',
+ ['fina'] = 'Terminal Forms',
+ ['flac'] = 'Flattened Accents Over Capitals', -- math
+ ['frac'] = 'Fractions',
+ ['fwid'] = 'Full Width',
+ ['half'] = 'Half Forms',
+ ['haln'] = 'Halant Forms',
+ ['halt'] = 'Alternate Half Width',
+ ['hist'] = 'Historical Forms',
+ ['hkna'] = 'Horizontal Kana Alternates',
+ ['hlig'] = 'Historical Ligatures',
+ ['hngl'] = 'Hangul',
+ ['hojo'] = 'Hojo Kanji Forms',
+ ['hwid'] = 'Half Width',
+ ['init'] = 'Initial Forms',
+ ['isol'] = 'Isolated Forms',
+ ['ital'] = 'Italics',
+ ['jalt'] = 'Justification Alternatives',
+ ['jp04'] = 'JIS2004 Forms',
+ ['jp78'] = 'JIS78 Forms',
+ ['jp83'] = 'JIS83 Forms',
+ ['jp90'] = 'JIS90 Forms',
+ ['kern'] = 'Kerning',
+ ['lfbd'] = 'Left Bounds',
+ ['liga'] = 'Standard Ligatures',
+ ['ljmo'] = 'Leading Jamo Forms',
+ ['lnum'] = 'Lining Figures',
+ ['locl'] = 'Localized Forms',
+ ['mark'] = 'Mark Positioning',
+ ['med2'] = 'Medial Forms #2',
+ ['medi'] = 'Medial Forms',
+ ['mgrk'] = 'Mathematical Greek',
+ ['mkmk'] = 'Mark to Mark Positioning',
+ ['mset'] = 'Mark Positioning via Substitution',
+ ['nalt'] = 'Alternate Annotation Forms',
+ ['nlck'] = 'NLC Kanji Forms',
+ ['nukt'] = 'Nukta Forms',
+ ['numr'] = 'Numerators',
+ ['onum'] = 'Old Style Figures',
+ ['opbd'] = 'Optical Bounds',
+ ['ordn'] = 'Ordinals',
+ ['ornm'] = 'Ornaments',
+ ['palt'] = 'Proportional Alternate Width',
+ ['pcap'] = 'Petite Capitals',
+ ['pnum'] = 'Proportional Figures',
+ ['pref'] = 'Pre-base Forms',
+ ['pres'] = 'Pre-base Substitutions',
+ ['pstf'] = 'Post-base Forms',
+ ['psts'] = 'Post-base Substitutions',
+ ['pwid'] = 'Proportional Widths',
+ ['qwid'] = 'Quarter Widths',
+ ['rand'] = 'Randomize',
+ ['rkrf'] = 'Rakar Forms',
+ ['rlig'] = 'Required Ligatures',
+ ['rphf'] = 'Reph Form',
+ ['rtbd'] = 'Right Bounds',
+ ['rtla'] = 'Right-To-Left Alternates',
+ ['rtlm'] = 'Right To Left Math', -- math
+ ['ruby'] = 'Ruby Notation Forms',
+ ['salt'] = 'Stylistic Alternates',
+ ['sinf'] = 'Scientific Inferiors',
+ ['size'] = 'Optical Size',
+ ['smcp'] = 'Small Capitals',
+ ['smpl'] = 'Simplified Forms',
+ ['ss01'] = 'Stylistic Set 1',
+ ['ss02'] = 'Stylistic Set 2',
+ ['ss03'] = 'Stylistic Set 3',
+ ['ss04'] = 'Stylistic Set 4',
+ ['ss05'] = 'Stylistic Set 5',
+ ['ss06'] = 'Stylistic Set 6',
+ ['ss07'] = 'Stylistic Set 7',
+ ['ss08'] = 'Stylistic Set 8',
+ ['ss09'] = 'Stylistic Set 9',
+ ['ss10'] = 'Stylistic Set 10',
+ ['ss11'] = 'Stylistic Set 11',
+ ['ss12'] = 'Stylistic Set 12',
+ ['ss13'] = 'Stylistic Set 13',
+ ['ss14'] = 'Stylistic Set 14',
+ ['ss15'] = 'Stylistic Set 15',
+ ['ss16'] = 'Stylistic Set 16',
+ ['ss17'] = 'Stylistic Set 17',
+ ['ss18'] = 'Stylistic Set 18',
+ ['ss19'] = 'Stylistic Set 19',
+ ['ss20'] = 'Stylistic Set 20',
+ ['ssty'] = 'Script Style', -- math
+ ['subs'] = 'Subscript',
+ ['sups'] = 'Superscript',
+ ['swsh'] = 'Swash',
+ ['titl'] = 'Titling',
+ ['tjmo'] = 'Trailing Jamo Forms',
+ ['tnam'] = 'Traditional Name Forms',
+ ['tnum'] = 'Tabular Figures',
+ ['trad'] = 'Traditional Forms',
+ ['twid'] = 'Third Widths',
+ ['unic'] = 'Unicase',
+ ['valt'] = 'Alternate Vertical Metrics',
+ ['vatu'] = 'Vattu Variants',
+ ['vert'] = 'Vertical Writing',
+ ['vhal'] = 'Alternate Vertical Half Metrics',
+ ['vjmo'] = 'Vowel Jamo Forms',
+ ['vkna'] = 'Vertical Kana Alternates',
+ ['vkrn'] = 'Vertical Kerning',
+ ['vpal'] = 'Proportional Alternate Vertical Metrics',
+ ['vrt2'] = 'Vertical Rotation',
+ ['zero'] = 'Slashed Zero',
+
+ ['trep'] = 'Traditional TeX Replacements',
+ ['tlig'] = 'Traditional TeX Ligatures',
+}
+
+otf.tables.baselines = {
+ ['hang'] = 'Hanging baseline',
+ ['icfb'] = 'Ideographic character face bottom edge baseline',
+ ['icft'] = 'Ideographic character face tope edige baseline',
+ ['ideo'] = 'Ideographic em-box bottom edge baseline',
+ ['idtp'] = 'Ideographic em-box top edge baseline',
+ ['math'] = 'Mathmatical centered baseline',
+ ['romn'] = 'Roman baseline'
+}
+
+-- can be sped up by local tables
+
+function otf.tables.to_tag(id)
+ return stringformat("%4s",lower(id))
+end
+
+local function resolve(tab,id)
+ if tab and id then
+ id = lower(id)
+ return tab[id] or tab[gsub(id," ","")] or tab['dflt'] or ''
+ else
+ return "unknown"
+ end
+end
+
+function otf.meanings.script(id)
+ return resolve(otf.tables.scripts,id)
+end
+function otf.meanings.language(id)
+ return resolve(otf.tables.languages,id)
+end
+function otf.meanings.feature(id)
+ return resolve(otf.tables.features,id)
+end
+function otf.meanings.baseline(id)
+ return resolve(otf.tables.baselines,id)
+end
+
+otf.tables.to_scripts = table.reverse_hash(otf.tables.scripts )
+otf.tables.to_languages = table.reverse_hash(otf.tables.languages)
+otf.tables.to_features = table.reverse_hash(otf.tables.features )
+
+local scripts = otf.tables.scripts
+local languages = otf.tables.languages
+local features = otf.tables.features
+
+local to_scripts = otf.tables.to_scripts
+local to_languages = otf.tables.to_languages
+local to_features = otf.tables.to_features
+
+for k, v in next, to_features do
+ local stripped = gsub(k,"%-"," ")
+ to_features[stripped] = v
+ local stripped = gsub(k,"[^a-zA-Z0-9]","")
+ to_features[stripped] = v
+end
+for k, v in next, to_features do
+ to_features[lower(k)] = v
+end
+
+otf.meanings.checkers = {
+ rand = function(v)
+ return v and "random"
+ end
+}
+
+local checkers = otf.meanings.checkers
+
+function otf.meanings.normalize(features)
+ local h = { }
+ for k,v in next, features do
+ k = lower(k)
+ if k == "language" or k == "lang" then
+ v = gsub(lower(v),"[^a-z0-9%-]","")
+ k = language
+ if not languages[v] then
+ h.language = to_languages[v] or "dflt"
+ else
+ h.language = v
+ end
+ elseif k == "script" then
+ v = gsub(lower(v),"[^a-z0-9%-]","")
+ if not scripts[v] then
+ h.script = to_scripts[v] or "dflt"
+ else
+ h.script = v
+ end
+ else
+ if type(v) == "string" then
+ local b = v:is_boolean()
+ if type(b) == "nil" then
+ v = tonumber(v) or lower(v)
+ else
+ v = b
+ end
+ end
+ k = to_features[k] or k
+ local c = checkers[k]
+ h[k] = c and c(v) or v
+ end
+ end
+ return h
+end
+
+-- When I feel the need ...
+
+--~ otf.tables.aat = {
+--~ [ 0] = {
+--~ name = "allTypographicFeaturesType",
+--~ [ 0] = "allTypeFeaturesOnSelector",
+--~ [ 1] = "allTypeFeaturesOffSelector",
+--~ },
+--~ [ 1] = {
+--~ name = "ligaturesType",
+--~ [0 ] = "requiredLigaturesOnSelector",
+--~ [1 ] = "requiredLigaturesOffSelector",
+--~ [2 ] = "commonLigaturesOnSelector",
+--~ [3 ] = "commonLigaturesOffSelector",
+--~ [4 ] = "rareLigaturesOnSelector",
+--~ [5 ] = "rareLigaturesOffSelector",
+--~ [6 ] = "logosOnSelector ",
+--~ [7 ] = "logosOffSelector ",
+--~ [8 ] = "rebusPicturesOnSelector",
+--~ [9 ] = "rebusPicturesOffSelector",
+--~ [10] = "diphthongLigaturesOnSelector",
+--~ [11] = "diphthongLigaturesOffSelector",
+--~ [12] = "squaredLigaturesOnSelector",
+--~ [13] = "squaredLigaturesOffSelector",
+--~ [14] = "abbrevSquaredLigaturesOnSelector",
+--~ [15] = "abbrevSquaredLigaturesOffSelector",
+--~ },
+--~ [ 2] = {
+--~ name = "cursiveConnectionType",
+--~ [ 0] = "unconnectedSelector",
+--~ [ 1] = "partiallyConnectedSelector",
+--~ [ 2] = "cursiveSelector ",
+--~ },
+--~ [ 3] = {
+--~ name = "letterCaseType",
+--~ [ 0] = "upperAndLowerCaseSelector",
+--~ [ 1] = "allCapsSelector ",
+--~ [ 2] = "allLowerCaseSelector",
+--~ [ 3] = "smallCapsSelector ",
+--~ [ 4] = "initialCapsSelector",
+--~ [ 5] = "initialCapsAndSmallCapsSelector",
+--~ },
+--~ [ 4] = {
+--~ name = "verticalSubstitutionType",
+--~ [ 0] = "substituteVerticalFormsOnSelector",
+--~ [ 1] = "substituteVerticalFormsOffSelector",
+--~ },
+--~ [ 5] = {
+--~ name = "linguisticRearrangementType",
+--~ [ 0] = "linguisticRearrangementOnSelector",
+--~ [ 1] = "linguisticRearrangementOffSelector",
+--~ },
+--~ [ 6] = {
+--~ name = "numberSpacingType",
+--~ [ 0] = "monospacedNumbersSelector",
+--~ [ 1] = "proportionalNumbersSelector",
+--~ },
+--~ [ 7] = {
+--~ name = "appleReserved1Type",
+--~ },
+--~ [ 8] = {
+--~ name = "smartSwashType",
+--~ [ 0] = "wordInitialSwashesOnSelector",
+--~ [ 1] = "wordInitialSwashesOffSelector",
+--~ [ 2] = "wordFinalSwashesOnSelector",
+--~ [ 3] = "wordFinalSwashesOffSelector",
+--~ [ 4] = "lineInitialSwashesOnSelector",
+--~ [ 5] = "lineInitialSwashesOffSelector",
+--~ [ 6] = "lineFinalSwashesOnSelector",
+--~ [ 7] = "lineFinalSwashesOffSelector",
+--~ [ 8] = "nonFinalSwashesOnSelector",
+--~ [ 9] = "nonFinalSwashesOffSelector",
+--~ },
+--~ [ 9] = {
+--~ name = "diacriticsType",
+--~ [ 0] = "showDiacriticsSelector",
+--~ [ 1] = "hideDiacriticsSelector",
+--~ [ 2] = "decomposeDiacriticsSelector",
+--~ },
+--~ [10] = {
+--~ name = "verticalPositionType",
+--~ [ 0] = "normalPositionSelector",
+--~ [ 1] = "superiorsSelector ",
+--~ [ 2] = "inferiorsSelector ",
+--~ [ 3] = "ordinalsSelector ",
+--~ },
+--~ [11] = {
+--~ name = "fractionsType",
+--~ [ 0] = "noFractionsSelector",
+--~ [ 1] = "verticalFractionsSelector",
+--~ [ 2] = "diagonalFractionsSelector",
+--~ },
+--~ [12] = {
+--~ name = "appleReserved2Type",
+--~ },
+--~ [13] = {
+--~ name = "overlappingCharactersType",
+--~ [ 0] = "preventOverlapOnSelector",
+--~ [ 1] = "preventOverlapOffSelector",
+--~ },
+--~ [14] = {
+--~ name = "typographicExtrasType",
+--~ [0 ] = "hyphensToEmDashOnSelector",
+--~ [1 ] = "hyphensToEmDashOffSelector",
+--~ [2 ] = "hyphenToEnDashOnSelector",
+--~ [3 ] = "hyphenToEnDashOffSelector",
+--~ [4 ] = "unslashedZeroOnSelector",
+--~ [5 ] = "unslashedZeroOffSelector",
+--~ [6 ] = "formInterrobangOnSelector",
+--~ [7 ] = "formInterrobangOffSelector",
+--~ [8 ] = "smartQuotesOnSelector",
+--~ [9 ] = "smartQuotesOffSelector",
+--~ [10] = "periodsToEllipsisOnSelector",
+--~ [11] = "periodsToEllipsisOffSelector",
+--~ },
+--~ [15] = {
+--~ name = "mathematicalExtrasType",
+--~ [ 0] = "hyphenToMinusOnSelector",
+--~ [ 1] = "hyphenToMinusOffSelector",
+--~ [ 2] = "asteriskToMultiplyOnSelector",
+--~ [ 3] = "asteriskToMultiplyOffSelector",
+--~ [ 4] = "slashToDivideOnSelector",
+--~ [ 5] = "slashToDivideOffSelector",
+--~ [ 6] = "inequalityLigaturesOnSelector",
+--~ [ 7] = "inequalityLigaturesOffSelector",
+--~ [ 8] = "exponentsOnSelector",
+--~ [ 9] = "exponentsOffSelector",
+--~ },
+--~ [16] = {
+--~ name = "ornamentSetsType",
+--~ [ 0] = "noOrnamentsSelector",
+--~ [ 1] = "dingbatsSelector ",
+--~ [ 2] = "piCharactersSelector",
+--~ [ 3] = "fleuronsSelector ",
+--~ [ 4] = "decorativeBordersSelector",
+--~ [ 5] = "internationalSymbolsSelector",
+--~ [ 6] = "mathSymbolsSelector",
+--~ },
+--~ [17] = {
+--~ name = "characterAlternativesType",
+--~ [ 0] = "noAlternatesSelector",
+--~ },
+--~ [18] = {
+--~ name = "designComplexityType",
+--~ [ 0] = "designLevel1Selector",
+--~ [ 1] = "designLevel2Selector",
+--~ [ 2] = "designLevel3Selector",
+--~ [ 3] = "designLevel4Selector",
+--~ [ 4] = "designLevel5Selector",
+--~ },
+--~ [19] = {
+--~ name = "styleOptionsType",
+--~ [ 0] = "noStyleOptionsSelector",
+--~ [ 1] = "displayTextSelector",
+--~ [ 2] = "engravedTextSelector",
+--~ [ 3] = "illuminatedCapsSelector",
+--~ [ 4] = "titlingCapsSelector",
+--~ [ 5] = "tallCapsSelector ",
+--~ },
+--~ [20] = {
+--~ name = "characterShapeType",
+--~ [0 ] = "traditionalCharactersSelector",
+--~ [1 ] = "simplifiedCharactersSelector",
+--~ [2 ] = "jis1978CharactersSelector",
+--~ [3 ] = "jis1983CharactersSelector",
+--~ [4 ] = "jis1990CharactersSelector",
+--~ [5 ] = "traditionalAltOneSelector",
+--~ [6 ] = "traditionalAltTwoSelector",
+--~ [7 ] = "traditionalAltThreeSelector",
+--~ [8 ] = "traditionalAltFourSelector",
+--~ [9 ] = "traditionalAltFiveSelector",
+--~ [10] = "expertCharactersSelector",
+--~ },
+--~ [21] = {
+--~ name = "numberCaseType",
+--~ [ 0] = "lowerCaseNumbersSelector",
+--~ [ 1] = "upperCaseNumbersSelector",
+--~ },
+--~ [22] = {
+--~ name = "textSpacingType",
+--~ [ 0] = "proportionalTextSelector",
+--~ [ 1] = "monospacedTextSelector",
+--~ [ 2] = "halfWidthTextSelector",
+--~ [ 3] = "normallySpacedTextSelector",
+--~ },
+--~ [23] = {
+--~ name = "transliterationType",
+--~ [ 0] = "noTransliterationSelector",
+--~ [ 1] = "hanjaToHangulSelector",
+--~ [ 2] = "hiraganaToKatakanaSelector",
+--~ [ 3] = "katakanaToHiraganaSelector",
+--~ [ 4] = "kanaToRomanizationSelector",
+--~ [ 5] = "romanizationToHiraganaSelector",
+--~ [ 6] = "romanizationToKatakanaSelector",
+--~ [ 7] = "hanjaToHangulAltOneSelector",
+--~ [ 8] = "hanjaToHangulAltTwoSelector",
+--~ [ 9] = "hanjaToHangulAltThreeSelector",
+--~ },
+--~ [24] = {
+--~ name = "annotationType",
+--~ [ 0] = "noAnnotationSelector",
+--~ [ 1] = "boxAnnotationSelector",
+--~ [ 2] = "roundedBoxAnnotationSelector",
+--~ [ 3] = "circleAnnotationSelector",
+--~ [ 4] = "invertedCircleAnnotationSelector",
+--~ [ 5] = "parenthesisAnnotationSelector",
+--~ [ 6] = "periodAnnotationSelector",
+--~ [ 7] = "romanNumeralAnnotationSelector",
+--~ [ 8] = "diamondAnnotationSelector",
+--~ },
+--~ [25] = {
+--~ name = "kanaSpacingType",
+--~ [ 0] = "fullWidthKanaSelector",
+--~ [ 1] = "proportionalKanaSelector",
+--~ },
+--~ [26] = {
+--~ name = "ideographicSpacingType",
+--~ [ 0] = "fullWidthIdeographsSelector",
+--~ [ 1] = "proportionalIdeographsSelector",
+--~ },
+--~ [103] = {
+--~ name = "cjkRomanSpacingType",
+--~ [ 0] = "halfWidthCJKRomanSelector",
+--~ [ 1] = "proportionalCJKRomanSelector",
+--~ [ 2] = "defaultCJKRomanSelector",
+--~ [ 3] = "fullWidthCJKRomanSelector",
+--~ },
+--~ }
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-map'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower
+local lpegmatch = lpeg.match
+local utfbyte = utf.byte
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local trace_unimapping = false trackers.register("otf.unimapping", function(v) trace_unimapping = v end)
+
+local ctxcatcodes = tex and tex.ctxcatcodes
+
+--[[ldx--
+<p>Eventually this code will disappear because map files are kind
+of obsolete. Some code may move to runtime or auxiliary modules.</p>
+<p>The name to unciode related code will stay of course.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.map = fonts.map or { }
+
+local function load_lum_table(filename) -- will move to font goodies
+ local lumname = file.replacesuffix(file.basename(filename),"lum")
+ local lumfile = resolvers.find_file(lumname,"map") or ""
+ if lumfile ~= "" and lfs.isfile(lumfile) then
+ if trace_loading or trace_unimapping then
+ logs.report("load otf","enhance: loading %s ",lumfile)
+ end
+ lumunic = dofile(lumfile)
+ return lumunic, lumfile
+ end
+end
+
+local hex = lpeg.R("AF","09")
+local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end
+local hexsix = (hex^1) / function(s) return tonumber(s,16) end
+local dec = (lpeg.R("09")^1) / tonumber
+local period = lpeg.P(".")
+
+local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true))
+local ucode = lpeg.P("u") * (hexsix * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexsix ^1) * lpeg.Cc(true))
+local index = lpeg.P("index") * dec * lpeg.Cc(false)
+
+local parser = unicode + ucode + index
+
+local parsers = { }
+
+local function make_name_parser(str)
+ if not str or str == "" then
+ return parser
+ else
+ local p = parsers[str]
+ if not p then
+ p = lpeg.P(str) * period * dec * lpeg.Cc(false)
+ parsers[str] = p
+ end
+ return p
+ end
+end
+
+--~ local parser = fonts.map.make_name_parser("Japan1")
+--~ local parser = fonts.map.make_name_parser()
+--~ local function test(str)
+--~ local b, a = lpegmatch(parser,str)
+--~ print((a and table.serialize(b)) or b)
+--~ end
+--~ test("a.sc")
+--~ test("a")
+--~ test("uni1234")
+--~ test("uni1234.xx")
+--~ test("uni12349876")
+--~ test("index1234")
+--~ test("Japan1.123")
+
+local function tounicode16(unicode)
+ if unicode < 0x10000 then
+ return format("%04X",unicode)
+ else
+ return format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+ end
+end
+
+local function tounicode16sequence(unicodes)
+ local t = { }
+ for l=1,#unicodes do
+ local unicode = unicodes[l]
+ if unicode < 0x10000 then
+ t[l] = format("%04X",unicode)
+ else
+ t[l] = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+ end
+ end
+ return concat(t)
+end
+
+--~ This is quite a bit faster but at the cost of some memory but if we
+--~ do this we will also use it elsewhere so let's not follow this route
+--~ now. I might use this method in the plain variant (no caching there)
+--~ but then I need a flag that distinguishes between code branches.
+--~
+--~ local cache = { }
+--~
+--~ function fonts.map.tounicode16(unicode)
+--~ local s = cache[unicode]
+--~ if not s then
+--~ if unicode < 0x10000 then
+--~ s = format("%04X",unicode)
+--~ else
+--~ s = format("%04X%04X",unicode/1024+0xD800,unicode%1024+0xDC00)
+--~ end
+--~ cache[unicode] = s
+--~ end
+--~ return s
+--~ end
+
+fonts.map.load_lum_table = load_lum_table
+fonts.map.make_name_parser = make_name_parser
+fonts.map.tounicode16 = tounicode16
+fonts.map.tounicode16sequence = tounicode16sequence
+
+local separator = lpeg.S("_.")
+local other = lpeg.C((1 - separator)^1)
+local ligsplitter = lpeg.Ct(other * (separator * other)^0)
+
+--~ print(table.serialize(lpegmatch(ligsplitter,"this")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"this.that")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"japan1.123")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more")))
+--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that")))
+
+fonts.map.add_to_unicode = function(data,filename)
+ local unicodes = data.luatex and data.luatex.unicodes
+ if not unicodes then
+ return
+ end
+ -- we need to move this code
+ unicodes['space'] = unicodes['space'] or 32
+ unicodes['hyphen'] = unicodes['hyphen'] or 45
+ unicodes['zwj'] = unicodes['zwj'] or 0x200D
+ unicodes['zwnj'] = unicodes['zwnj'] or 0x200C
+ -- the tounicode mapping is sparse and only needed for alternatives
+ local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?"))
+ data.luatex.tounicode, data.luatex.originals = tounicode, originals
+ local lumunic, uparser, oparser
+ if false then -- will become an option
+ lumunic = load_lum_table(filename)
+ lumunic = lumunic and lumunic.tounicode
+ end
+ local cidinfo, cidnames, cidcodes = data.cidinfo
+ local usedmap = cidinfo and cidinfo.usedname
+ usedmap = usedmap and lower(usedmap)
+ usedmap = usedmap and fonts.cid.map[usedmap]
+ if usedmap then
+ oparser = usedmap and make_name_parser(cidinfo.ordering)
+ cidnames = usedmap.names
+ cidcodes = usedmap.unicodes
+ end
+ uparser = make_name_parser()
+ local aglmap = fonts.map and fonts.map.agl_to_unicode
+ for index, glyph in next, data.glyphs do
+ local name, unic = glyph.name, glyph.unicode or -1 -- play safe
+ if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then
+ local unicode = (lumunic and lumunic[name]) or (aglmap and aglmap[name])
+ if unicode then
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ end
+ -- cidmap heuristics, beware, there is no guarantee for a match unless
+ -- the chain resolves
+ if (not unicode) and usedmap then
+ local foundindex = lpegmatch(oparser,name)
+ if foundindex then
+ unicode = cidcodes[foundindex] -- name to number
+ if unicode then
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ else
+ local reference = cidnames[foundindex] -- number to name
+ if reference then
+ local foundindex = lpegmatch(oparser,reference)
+ if foundindex then
+ unicode = cidcodes[foundindex]
+ if unicode then
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ end
+ end
+ if not unicode then
+ local foundcodes, multiple = lpegmatch(uparser,reference)
+ if foundcodes then
+ if multiple then
+ originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true
+ else
+ originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ -- a.whatever or a_b_c.whatever or a_b_c (no numbers)
+ if not unicode then
+ local split = lpegmatch(ligsplitter,name)
+ local nplit = (split and #split) or 0
+ if nplit == 0 then
+ -- skip
+ elseif nplit == 1 then
+ local base = split[1]
+ unicode = unicodes[base] or (aglmap and aglmap[base])
+ if unicode then
+ if type(unicode) == "table" then
+ unicode = unicode[1]
+ end
+ originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
+ end
+ else
+ local t = { }
+ for l=1,nplit do
+ local base = split[l]
+ local u = unicodes[base] or (aglmap and aglmap[base])
+ if not u then
+ break
+ elseif type(u) == "table" then
+ t[#t+1] = u[1]
+ else
+ t[#t+1] = u
+ end
+ end
+ if #t > 0 then -- done then
+ originals[index], tounicode[index], nl, unicode = t, tounicode16sequence(t), nl + 1, true
+ end
+ end
+ end
+ -- last resort
+ if not unicode then
+ local foundcodes, multiple = lpegmatch(uparser,name)
+ if foundcodes then
+ if multiple then
+ originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true
+ else
+ originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes
+ end
+ end
+ end
+ if not unicode then
+ originals[index], tounicode[index] = 0xFFFD, "FFFD"
+ end
+ end
+ end
+ if trace_unimapping then
+ for index, glyph in table.sortedhash(data.glyphs) do
+ local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe
+ if toun then
+ logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
+ else
+ logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic)
+ end
+ end
+ end
+ if trace_loading and (ns > 0 or nl > 0) then
+ logs.report("load otf","enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns)
+ end
+end
+
+-- the following is sort of obsolete
+--
+-- fonts.map.data = fonts.map.data or { }
+-- fonts.map.encodings = fonts.map.encodings or { }
+-- fonts.map.loaded = fonts.map.loaded or { }
+-- fonts.map.line = fonts.map.line or { }
+--
+-- function fonts.map.line.pdftex(e)
+-- if e.name and e.fontfile then
+-- local fullname = e.fullname or ""
+-- if e.slant and e.slant ~= 0 then
+-- if e.encoding then
+-- pdf.mapline(format('= %s %s "%g SlantFont" <%s <%s',e.name,fullname,e.slant,e.encoding,e.fontfile)))
+-- else
+-- pdf.mapline(format('= %s %s "%g SlantFont" <%s',e.name,fullname,e.slant,e.fontfile)))
+-- end
+-- elseif e.extend and e.extend ~= 1 and e.extend ~= 0 then
+-- if e.encoding then
+-- pdf.mapline(format('= %s %s "%g ExtendFont" <%s <%s',e.name,fullname,e.extend,e.encoding,e.fontfile)))
+-- else
+-- pdf.mapline(format('= %s %s "%g ExtendFont" <%s',e.name,fullname,e.extend,e.fontfile)))
+-- end
+-- else
+-- if e.encoding then
+-- pdf.mapline(format('= %s %s <%s <%s',e.name,fullname,e.encoding,e.fontfile)))
+-- else
+-- pdf.mapline(format('= %s %s <%s',e.name,fullname,e.fontfile)))
+-- end
+-- end
+-- else
+-- return nil
+-- end
+-- end
+--
+-- function fonts.map.flush(backend) -- will also erase the accumulated data
+-- local flushline = fonts.map.line[backend or "pdftex"] or fonts.map.line.pdftex
+-- for _, e in next, fonts.map.data do
+-- flushline(e)
+-- end
+-- fonts.map.data = { }
+-- end
+--
+-- fonts.map.line.dvips = fonts.map.line.pdftex
+-- fonts.map.line.dvipdfmx = function() end
+--
+-- function fonts.map.convert_entries(filename)
+-- if not fonts.map.loaded[filename] then
+-- fonts.map.data, fonts.map.encodings = fonts.map.load_file(filename,fonts.map.data, fonts.map.encodings)
+-- fonts.map.loaded[filename] = true
+-- end
+-- end
+--
+-- function fonts.map.load_file(filename, entries, encodings)
+-- entries = entries or { }
+-- encodings = encodings or { }
+-- local f = io.open(filename)
+-- if f then
+-- local data = f:read("*a")
+-- if data then
+-- for line in gmatch(data,"(.-)[\n\t]") do
+-- if find(line,"^[%#%%%s]") then
+-- -- print(line)
+-- else
+-- local extend, slant, name, fullname, fontfile, encoding
+-- line = gsub(line,'"(.+)"', function(s)
+-- extend = find(s,'"([^"]+) ExtendFont"')
+-- slant = find(s,'"([^"]+) SlantFont"')
+-- return ""
+-- end)
+-- if not name then
+-- -- name fullname encoding fontfile
+-- name, fullname, encoding, fontfile = match(line,"^(%S+)%s+(%S*)[%s<]+(%S*)[%s<]+(%S*)%s*$")
+-- end
+-- if not name then
+-- -- name fullname (flag) fontfile encoding
+-- name, fullname, fontfile, encoding = match(line,"^(%S+)%s+(%S*)[%d%s<]+(%S*)[%s<]+(%S*)%s*$")
+-- end
+-- if not name then
+-- -- name fontfile
+-- name, fontfile = match(line,"^(%S+)%s+[%d%s<]+(%S*)%s*$")
+-- end
+-- if name then
+-- if encoding == "" then encoding = nil end
+-- entries[name] = {
+-- name = name, -- handy
+-- fullname = fullname,
+-- encoding = encoding,
+-- fontfile = fontfile,
+-- slant = tonumber(slant),
+-- extend = tonumber(extend)
+-- }
+-- encodings[name] = encoding
+-- elseif line ~= "" then
+-- -- print(line)
+-- end
+-- end
+-- end
+-- end
+-- f:close()
+-- end
+-- return entries, encodings
+-- end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-otf'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local utf = unicode.utf8
+
+local concat, getn, utfbyte = table.concat, table.getn, utf.byte
+local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local abs = math.abs
+local lpegmatch = lpeg.match
+
+local trace_private = false trackers.register("otf.private", function(v) trace_private = v end)
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local trace_features = false trackers.register("otf.features", function(v) trace_features = v end)
+local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
+local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end)
+local trace_math = false trackers.register("otf.math", function(v) trace_math = v end)
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+--~ trackers.enable("otf.loading")
+
+--[[ldx--
+<p>The fontforge table has organized lookups in a certain way. A first implementation
+of this code was organized featurewise: information related to features was
+collected and processing boiled down to a run over the features. The current
+implementation honors the order in the main feature table. Since we can reorder this
+table as we want, we can eventually support several models of processing. We kept
+the static as well as dynamic feature processing, because it had proved to be
+rather useful. The formerly three loop variants have beem discarded but will
+reapear at some time.</p>
+
+<itemize>
+<item>we loop over all lookups</item>
+<item>for each lookup we do a run over the list of glyphs</item>
+<item>but we only process them for features that are enabled</item>
+<item>if we're dealing with a contextual lookup, we loop over all contexts</item>
+<item>in that loop we quit at a match and then process the list of sublookups</item>
+<item>we always continue after the match</item>
+</itemize>
+
+<p>In <l n='context'/> we do this for each font that is used in a list, so in
+practice we have quite some nested loops.</p>
+
+<p>We process the whole list and then consult the glyph nodes. An alternative approach
+is to collect strings of characters using the same font including spaces (because some
+lookups involve spaces). However, we then need to reconstruct the list which is no fun.
+Also, we need to carry quite some information, like attributes, so eventually we don't
+gain much (if we gain something at all).</p>
+
+<p>Another consideration has been to operate on sublists (subhead, subtail) but again
+this would complicate matters as we then neext to keep track of a changing subhead
+and subtail. On the other hand, this might save some runtime. The number of changes
+involved is not that large. This only makes sense when we have many fonts in a list
+and don't change to frequently.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+fonts.tfm = fonts.tfm or { }
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local fontdata = fonts.ids
+
+otf.tables = otf.tables or { } -- defined in font-ott.lua
+otf.meanings = otf.meanings or { } -- defined in font-ott.lua
+otf.tables.features = otf.tables.features or { } -- defined in font-ott.lua
+otf.tables.languages = otf.tables.languages or { } -- defined in font-ott.lua
+otf.tables.scripts = otf.tables.scripts or { } -- defined in font-ott.lua
+
+otf.features = otf.features or { }
+otf.features.list = otf.features.list or { }
+otf.features.default = otf.features.default or { }
+
+otf.enhancers = otf.enhancers or { }
+otf.glists = { "gsub", "gpos" }
+
+otf.version = 2.650 -- beware: also sync font-mis.lua
+otf.pack = true -- beware: also sync font-mis.lua
+otf.syncspace = true
+otf.notdef = false
+otf.cache = containers.define("fonts", "otf", otf.version, true)
+otf.cleanup_aat = false -- only context
+
+local wildcard = "*"
+local default = "dflt"
+
+--[[ldx--
+<p>We start with a lot of tables and related functions.</p>
+--ldx]]--
+
+otf.tables.global_fields = table.tohash {
+ "lookups",
+ "glyphs",
+ "subfonts",
+ "luatex",
+ "pfminfo",
+ "cidinfo",
+ "tables",
+ "names",
+ "unicodes",
+ "names",
+--~ "math",
+ "anchor_classes",
+ "kern_classes",
+ "gpos",
+ "gsub"
+}
+
+otf.tables.valid_fields = {
+ "anchor_classes",
+ "ascent",
+ "cache_version",
+ "cidinfo",
+ "copyright",
+ "creationtime",
+ "descent",
+ "design_range_bottom",
+ "design_range_top",
+ "design_size",
+ "encodingchanged",
+ "extrema_bound",
+ "familyname",
+ "fontname",
+ "fontstyle_id",
+ "fontstyle_name",
+ "fullname",
+ "glyphs",
+ "hasvmetrics",
+ "head_optimized_for_cleartype",
+ "horiz_base",
+ "issans",
+ "isserif",
+ "italicangle",
+ "kerns",
+ "lookups",
+ -- "luatex",
+ "macstyle",
+ "modificationtime",
+ "onlybitmaps",
+ "origname",
+ "os2_version",
+ "pfminfo",
+ "private",
+ "serifcheck",
+ "sfd_version",
+ -- "size",
+ "strokedfont",
+ "strokewidth",
+ "subfonts",
+ "table_version",
+ -- "tables",
+ -- "ttf_tab_saved",
+ "ttf_tables",
+ "uni_interp",
+ "uniqueid",
+ "units_per_em",
+ "upos",
+ "use_typo_metrics",
+ "uwidth",
+ "validation_state",
+ "verbose",
+ "version",
+ "vert_base",
+ "weight",
+ "weight_width_slope_only",
+ "xuid",
+}
+
+--[[ldx--
+<p>Here we go.</p>
+--ldx]]--
+
+local function load_featurefile(ff,featurefile)
+ if featurefile then
+ featurefile = resolvers.find_file(file.addsuffix(featurefile,'fea'),'fea')
+ if featurefile and featurefile ~= "" then
+ if trace_loading then
+ logs.report("load otf", "featurefile: %s", featurefile)
+ end
+ fontloader.apply_featurefile(ff, featurefile)
+ end
+ end
+end
+
+function otf.enhance(name,data,filename,verbose)
+ local enhancer = otf.enhancers[name]
+ if enhancer then
+ if (verbose ~= nil and verbose) or trace_loading then
+ logs.report("load otf","enhance: %s (%s)",name,filename)
+ end
+ enhancer(data,filename)
+ end
+end
+
+local enhancers = {
+ -- pack and unpack are handled separately; they might even be moved
+ -- away from the enhancers namespace
+ "patch bugs",
+ "merge cid fonts", "prepare unicode", "cleanup ttf tables", "compact glyphs", "reverse coverage",
+ "cleanup aat", "enrich with features", "add some missing characters",
+ "reorganize mark classes",
+ "reorganize kerns", -- moved here
+ "flatten glyph lookups", "flatten anchor tables", "flatten feature tables",
+ "simplify glyph lookups", -- some saving
+ "prepare luatex tables",
+ "analyse features", "rehash features",
+ "analyse anchors", "analyse marks", "analyse unicodes", "analyse subtables",
+ "check italic correction","check math",
+ "share widths",
+ "strip not needed data",
+ "migrate metadata",
+ "check math parameters",
+}
+
+function otf.load(filename,format,sub,featurefile)
+ local name = file.basename(file.removesuffix(filename))
+ if featurefile then
+ name = name .. "@" .. file.removesuffix(file.basename(featurefile))
+ end
+ if sub == "" then sub = false end
+ local hash = name
+ if sub then
+ hash = hash .. "-" .. sub
+ end
+ hash = containers.cleanname(hash)
+ local data = containers.read(otf.cache(), hash)
+ local size = lfs.attributes(filename,"size") or 0
+ if not data or data.verbose ~= fonts.verbose or data.size ~= size then
+ logs.report("load otf","loading: %s (hash: %s)",filename,hash)
+ local ff, messages
+ if sub then
+ ff, messages = fontloader.open(filename,sub)
+ else
+ ff, messages = fontloader.open(filename)
+ end
+ if trace_loading and messages and #messages > 0 then
+ if type(messages) == "string" then
+ logs.report("load otf","warning: %s",messages)
+ else
+ for m=1,#messages do
+ logs.report("load otf","warning: %s",tostring(messages[m]))
+ end
+ end
+ else
+ logs.report("load otf","font loaded okay")
+ end
+ if ff then
+ load_featurefile(ff,featurefile)
+ data = fontloader.to_table(ff)
+ fontloader.close(ff)
+ if data then
+ logs.report("load otf","file size: %s", size)
+ logs.report("load otf","enhancing ...")
+ for e=1,#enhancers do
+ otf.enhance(enhancers[e],data,filename)
+ io.flush() -- we want instant messages
+ end
+ if otf.pack and not fonts.verbose then
+ otf.enhance("pack",data,filename)
+ end
+ data.size = size
+ data.verbose = fonts.verbose
+ logs.report("load otf","saving in cache: %s",filename)
+ data = containers.write(otf.cache(), hash, data)
+ collectgarbage("collect")
+ data = containers.read(otf.cache(), hash) -- this frees the old table and load the sparse one
+ collectgarbage("collect")
+ else
+ logs.report("load otf","loading failed (table conversion error)")
+ end
+ else
+ logs.report("load otf","loading failed (file read error)")
+ end
+ end
+ if data then
+ if trace_defining then
+ logs.report("define font","loading from cache: %s",hash)
+ end
+ otf.enhance("unpack",data,filename,false) -- no message here
+ otf.add_dimensions(data)
+ if trace_sequences then
+ otf.show_feature_order(data,filename)
+ end
+ end
+ return data
+end
+
+function otf.add_dimensions(data)
+ -- todo: forget about the width if it's the defaultwidth (saves mem)
+ -- we could also build the marks hash here (instead of storing it)
+ if data then
+ local force = otf.notdef
+ local luatex = data.luatex
+ local defaultwidth = luatex.defaultwidth or 0
+ local defaultheight = luatex.defaultheight or 0
+ local defaultdepth = luatex.defaultdepth or 0
+ for _, d in next, data.glyphs do
+ local bb, wd = d.boundingbox, d.width
+ if not wd then
+ d.width = defaultwidth
+ elseif wd ~= 0 and d.class == "mark" then
+ d.width = -wd
+ end
+ if force and not d.name then
+ d.name = ".notdef"
+ end
+ if bb then
+ local ht, dp = bb[4], -bb[2]
+ if ht == 0 or ht < 0 then
+ -- no need to set it and no negative heights, nil == 0
+ else
+ d.height = ht
+ end
+ if dp == 0 or dp < 0 then
+ -- no negative depths and no negative depths, nil == 0
+ else
+ d.depth = dp
+ end
+ end
+ end
+ end
+end
+
+function otf.show_feature_order(otfdata,filename)
+ local sequences = otfdata.luatex.sequences
+ if sequences and #sequences > 0 then
+ if trace_loading then
+ logs.report("otf check","font %s has %s sequences",filename,#sequences)
+ logs.report("otf check"," ")
+ end
+ for nos=1,#sequences do
+ local sequence = sequences[nos]
+ local typ = sequence.type or "no-type"
+ local name = sequence.name or "no-name"
+ local subtables = sequence.subtables or { "no-subtables" }
+ local features = sequence.features
+ if trace_loading then
+ logs.report("otf check","%3i %-15s %-20s [%s]",nos,name,typ,concat(subtables,","))
+ end
+ if features then
+ for feature, scripts in next, features do
+ local tt = { }
+ for script, languages in next, scripts do
+ local ttt = { }
+ for language, _ in next, languages do
+ ttt[#ttt+1] = language
+ end
+ tt[#tt+1] = format("[%s: %s]",script,concat(ttt," "))
+ end
+ if trace_loading then
+ logs.report("otf check"," %s: %s",feature,concat(tt," "))
+ end
+ end
+ end
+ end
+ if trace_loading then
+ logs.report("otf check","\n")
+ end
+ elseif trace_loading then
+ logs.report("otf check","font %s has no sequences",filename)
+ end
+end
+
+-- todo: normalize, design_size => designsize
+
+otf.enhancers["reorganize mark classes"] = function(data,filename)
+ if data.mark_classes then
+ local unicodes = data.luatex.unicodes
+ local reverse = { }
+ for name, class in next, data.mark_classes do
+ local t = { }
+ for s in gmatch(class,"[^ ]+") do
+ local us = unicodes[s]
+ if type(us) == "table" then
+ for u=1,#us do
+ t[us[u]] = true
+ end
+ else
+ t[us] = true
+ end
+ end
+ reverse[name] = t
+ end
+ data.luatex.markclasses = reverse
+ data.mark_classes = nil
+ end
+end
+
+otf.enhancers["prepare luatex tables"] = function(data,filename)
+ data.luatex = data.luatex or { }
+ local luatex = data.luatex
+ luatex.filename = filename
+ luatex.version = otf.version
+ luatex.creator = "context mkiv"
+end
+
+otf.enhancers["cleanup aat"] = function(data,filename)
+ if otf.cleanup_aat then
+ end
+end
+
+local function analyze_features(g, features)
+ if g then
+ local t, done = { }, { }
+ for k=1,#g do
+ local f = features or g[k].features
+ if f then
+ for k=1,#f do
+ -- scripts and tag
+ local tag = f[k].tag
+ if not done[tag] then
+ t[#t+1] = tag
+ done[tag] = true
+ end
+ end
+ end
+ end
+ if #t > 0 then
+ return t
+ end
+ end
+ return nil
+end
+
+otf.enhancers["analyse features"] = function(data,filename)
+ -- local luatex = data.luatex
+ -- luatex.gposfeatures = analyze_features(data.gpos)
+ -- luatex.gsubfeatures = analyze_features(data.gsub)
+end
+
+otf.enhancers["rehash features"] = function(data,filename)
+ local features = { }
+ data.luatex.features = features
+ for k, what in next, otf.glists do
+ local dw = data[what]
+ if dw then
+ local f = { }
+ features[what] = f
+ for i=1,#dw do
+ local d= dw[i]
+ local dfeatures = d.features
+ if dfeatures then
+ for i=1,#dfeatures do
+ local df = dfeatures[i]
+ local tag = strip(lower(df.tag))
+ local ft = f[tag] if not ft then ft = {} f[tag] = ft end
+ local dscripts = df.scripts
+ for script, languages in next, dscripts do
+ script = strip(lower(script))
+ local fts = ft[script] if not fts then fts = {} ft[script] = fts end
+ for i=1,#languages do
+ fts[strip(lower(languages[i]))] = true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["analyse anchors"] = function(data,filename)
+ local classes = data.anchor_classes
+ local luatex = data.luatex
+ local anchor_to_lookup, lookup_to_anchor = { }, { }
+ luatex.anchor_to_lookup, luatex.lookup_to_anchor = anchor_to_lookup, lookup_to_anchor
+ if classes then
+ for c=1,#classes do
+ local class = classes[c]
+ local anchor = class.name
+ local lookups = class.lookup
+ if type(lookups) ~= "table" then
+ lookups = { lookups }
+ end
+ local a = anchor_to_lookup[anchor]
+ if not a then a = { } anchor_to_lookup[anchor] = a end
+ for l=1,#lookups do
+ local lookup = lookups[l]
+ local l = lookup_to_anchor[lookup]
+ if not l then l = { } lookup_to_anchor[lookup] = l end
+ l[anchor] = true
+ a[lookup] = true
+ end
+ end
+ end
+end
+
+otf.enhancers["analyse marks"] = function(data,filename)
+ local glyphs = data.glyphs
+ local marks = { }
+ data.luatex.marks = marks
+ for unicode, index in next, data.luatex.indices do
+ local glyph = glyphs[index]
+ if glyph.class == "mark" then
+ marks[unicode] = true
+ end
+ end
+end
+
+otf.enhancers["analyse unicodes"] = fonts.map.add_to_unicode
+
+otf.enhancers["analyse subtables"] = function(data,filename)
+ data.luatex = data.luatex or { }
+ local luatex = data.luatex
+ local sequences = { }
+ local lookups = { }
+ luatex.sequences = sequences
+ luatex.lookups = lookups
+ for _, g in next, { data.gsub, data.gpos } do
+ for k=1,#g do
+ local gk = g[k]
+ local typ = gk.type
+ if typ == "gsub_contextchain" or typ == "gpos_contextchain" then
+ gk.chain = 1
+ elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then
+ gk.chain = -1
+ else
+ gk.chain = 0
+ end
+ local features = gk.features
+ if features then
+ sequences[#sequences+1] = gk
+ -- scripts, tag, ismac
+ local t = { }
+ for f=1,#features do
+ local feature = features[f]
+ local hash = { }
+ -- only script and langs matter
+ for s, languages in next, feature.scripts do
+ s = lower(s)
+ local h = hash[s]
+ if not h then h = { } hash[s] = h end
+ for l=1,#languages do
+ h[strip(lower(languages[l]))] = true
+ end
+ end
+ t[feature.tag] = hash
+ end
+ gk.features = t
+ else
+ lookups[gk.name] = gk
+ gk.name = nil
+ end
+ local subtables = gk.subtables
+ if subtables then
+ local t = { }
+ for s=1,#subtables do
+ local subtable = subtables[s]
+ local name = subtable.name
+ t[#t+1] = name
+ end
+ gk.subtables = t
+ end
+ local flags = gk.flags
+ if flags then
+ gk.flags = { -- forcing false packs nicer
+ (flags.ignorecombiningmarks and "mark") or false,
+ (flags.ignoreligatures and "ligature") or false,
+ (flags.ignorebaseglyphs and "base") or false,
+ flags.r2l or false,
+ }
+ if flags.mark_class then
+ gk.markclass = luatex.markclasses[flags.mark_class]
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["merge cid fonts"] = function(data,filename)
+ -- we can also move the names to data.luatex.names which might
+ -- save us some more memory (at the cost of harder tracing)
+ if data.subfonts then
+ if data.glyphs and next(data.glyphs) then
+ logs.report("load otf","replacing existing glyph table due to subfonts")
+ end
+ local cidinfo = data.cidinfo
+ local verbose = fonts.verbose
+ if cidinfo.registry then
+ local cidmap, cidname = fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement)
+ if cidmap then
+ cidinfo.usedname = cidmap.usedname
+ local glyphs, uni_to_int, int_to_uni, nofnames, nofunicodes = { }, { }, { }, 0, 0
+ local unicodes, names = cidmap.unicodes, cidmap.names
+ for n, subfont in next, data.subfonts do
+ for index, g in next, subfont.glyphs do
+ if not next(g) then
+ -- dummy entry
+ else
+ local unicode, name = unicodes[index], names[index]
+ g.cidindex = n
+ g.boundingbox = g.boundingbox -- or zerobox
+ g.name = g.name or name or "unknown"
+ if unicode then
+ uni_to_int[unicode] = index
+ int_to_uni[index] = unicode
+ nofunicodes = nofunicodes + 1
+ g.unicode = unicode
+ elseif name then
+ nofnames = nofnames + 1
+ g.unicode = -1
+ end
+ glyphs[index] = g
+ end
+ end
+ subfont.glyphs = nil
+ end
+ if trace_loading then
+ logs.report("load otf","cid font remapped, %s unicode points, %s symbolic names, %s glyphs",nofunicodes, nofnames, nofunicodes+nofnames)
+ end
+ data.glyphs = glyphs
+ data.map = data.map or { }
+ data.map.map = uni_to_int
+ data.map.backmap = int_to_uni
+ elseif trace_loading then
+ logs.report("load otf","unable to remap cid font, missing cid file for %s",filename)
+ end
+ elseif trace_loading then
+ logs.report("load otf","font %s has no glyphs",filename)
+ end
+ end
+end
+
+otf.enhancers["prepare unicode"] = function(data,filename)
+ local luatex = data.luatex
+ if not luatex then luatex = { } data.luatex = luatex end
+ local indices, unicodes, multiples, internals = { }, { }, { }, { }
+ local glyphs = data.glyphs
+ local mapmap = data.map
+ if not mapmap then
+ logs.report("load otf","no map in %s",filename)
+ mapmap = { }
+ data.map = { map = mapmap }
+ elseif not mapmap.map then
+ logs.report("load otf","no unicode map in %s",filename)
+ mapmap = { }
+ data.map.map = mapmap
+ else
+ mapmap = mapmap.map
+ end
+ local criterium = fonts.private
+ local private = fonts.private
+ for index, glyph in next, glyphs do
+ if index > 0 then
+ local name = glyph.name
+ if name then
+ local unicode = glyph.unicode
+ if unicode == -1 or unicode >= criterium then
+ glyph.unicode = private
+ indices[private] = index
+ unicodes[name] = private
+ internals[index] = true
+ if trace_private then
+ logs.report("load otf","enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
+ end
+ private = private + 1
+ else
+ indices[unicode] = index
+ unicodes[name] = unicode
+ end
+ end
+ end
+ end
+ -- beware: the indices table is used to initialize the tfm table
+ for unicode, index in next, mapmap do
+ if not internals[index] then
+ 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
+ if un ~= unicode then
+ multiples[#multiples+1] = name
+ unicodes[name] = { un, unicode }
+ indices[unicode] = index
+ end
+ else
+ local ok = false
+ for u=1,#un do
+ if un[u] == unicode then
+ ok = true
+ break
+ end
+ end
+ if not ok then
+ multiples[#multiples+1] = name
+ un[#un+1] = unicode
+ indices[unicode] = index
+ end
+ end
+ end
+ end
+ end
+ if trace_loading then
+ if #multiples > 0 then
+ logs.report("load otf","%s glyph are reused: %s",#multiples, concat(multiples," "))
+ else
+ logs.report("load otf","no glyph are reused")
+ end
+ end
+ luatex.indices = indices
+ luatex.unicodes = unicodes
+ luatex.private = private
+end
+
+otf.enhancers["cleanup ttf tables"] = function(data,filename)
+ local ttf_tables = data.ttf_tables
+ if ttf_tables then
+ for k=1,#ttf_tables do
+ if ttf_tables[k].data then ttf_tables[k].data = "deleted" end
+ end
+ end
+ data.ttf_tab_saved = nil
+end
+
+otf.enhancers["compact glyphs"] = function(data,filename)
+ table.compact(data.glyphs) -- needed?
+ if data.subfonts then
+ for _, subfont in next, data.subfonts do
+ table.compact(subfont.glyphs) -- needed?
+ end
+ end
+end
+
+otf.enhancers["reverse coverage"] = function(data,filename)
+ -- we prefer the before lookups in a normal order
+ if data.lookups then
+ for _, v in next, data.lookups do
+ if v.rules then
+ for _, vv in next, v.rules do
+ local c = vv.coverage
+ if c and c.before then
+ c.before = table.reverse(c.before)
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["check italic correction"] = function(data,filename)
+ local glyphs = data.glyphs
+ local ok = false
+ for index, glyph in next, glyphs do
+ local ic = glyph.italic_correction
+ if ic then
+ if ic ~= 0 then
+ glyph.italic = ic
+ end
+ glyph.italic_correction = nil
+ ok = true
+ end
+ end
+ -- we can use this to avoid calculations
+ otf.tables.valid_fields[#otf.tables.valid_fields+1] = "has_italic"
+ data.has_italic = true
+end
+
+otf.enhancers["check math"] = function(data,filename)
+ if data.math then
+ -- we move the math stuff into a math subtable because we then can
+ -- test faster in the tfm copy
+ local glyphs = data.glyphs
+ local unicodes = data.luatex.unicodes
+ for index, glyph in next, glyphs do
+ local mk = glyph.mathkern
+ local hv = glyph.horiz_variants
+ local vv = glyph.vert_variants
+ if mk or hv or vv then
+ local math = { }
+ glyph.math = math
+ if mk then
+ for k, v in next, mk do
+ if not next(v) then
+ mk[k] = nil
+ end
+ end
+ math.kerns = mk
+ glyph.mathkern = nil
+ end
+ if hv then
+ math.horiz_variants = hv.variants
+ local p = hv.parts
+ if p then
+ if #p>0 then
+ for i=1,#p do
+ local pi = p[i]
+ pi.glyph = unicodes[pi.component] or 0
+ end
+ math.horiz_parts = p
+ end
+ end
+ local ic = hv.italic_correction
+ if ic and ic ~= 0 then
+ math.horiz_italic_correction = ic
+ end
+ glyph.horiz_variants = nil
+ end
+ if vv then
+ local uc = unicodes[index]
+ math.vert_variants = vv.variants
+ local p = vv.parts
+ if p then
+ if #p>0 then
+ for i=1,#p do
+ local pi = p[i]
+ pi.glyph = unicodes[pi.component] or 0
+ end
+ math.vert_parts = p
+ end
+ end
+ local ic = vv.italic_correction
+ if ic and ic ~= 0 then
+ math.vert_italic_correction = ic
+ end
+ glyph.vert_variants = nil
+ end
+ local ic = glyph.italic_correction
+ if ic then
+ if ic ~= 0 then
+ math.italic_correction = ic
+ end
+ glyph.italic_correction = nil
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["share widths"] = function(data,filename)
+ local glyphs = data.glyphs
+ local widths = { }
+ for index, glyph in next, glyphs do
+ local width = glyph.width
+ widths[width] = (widths[width] or 0) + 1
+ end
+ -- share width for cjk fonts
+ local wd, most = 0, 1
+ for k,v in next, widths do
+ if v > most then
+ wd, most = k, v
+ end
+ end
+ if most > 1000 then
+ if trace_loading then
+ logs.report("load otf", "most common width: %s (%s times), sharing (cjk font)",wd,most)
+ end
+ for k, v in next, glyphs do
+ if v.width == wd then
+ v.width = nil
+ end
+ end
+ data.luatex.defaultwidth = wd
+ end
+end
+
+-- kern: ttf has a table with kerns
+
+--~ otf.enhancers["reorganize kerns"] = function(data,filename)
+--~ local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
+--~ local mkdone = false
+--~ for index, glyph in next, data.glyphs do
+--~ if glyph.kerns then
+--~ local mykerns = { }
+--~ for k,v in next, glyph.kerns do
+--~ 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 not uvc then
+--~ if trace_loading then
+--~ logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
+--~ end
+--~ else
+--~ if type(vl) ~= "table" then
+--~ vl = { vl }
+--~ end
+--~ for l=1,#vl do
+--~ local vll = vl[l]
+--~ local mkl = mykerns[vll]
+--~ if not mkl then
+--~ mkl = { }
+--~ mykerns[vll] = mkl
+--~ end
+--~ if type(uvc) == "table" then
+--~ for u=1,#uvc do
+--~ mkl[uvc[u]] = vo
+--~ end
+--~ else
+--~ mkl[uvc] = vo
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ glyph.mykerns = mykerns
+--~ glyph.kerns = nil -- saves space and time
+--~ mkdone = true
+--~ end
+--~ end
+--~ if trace_loading and mkdone then
+--~ logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
+--~ end
+--~ if data.kerns then
+--~ if trace_loading then
+--~ logs.report("load otf", "removing global 'kern' table")
+--~ end
+--~ data.kerns = nil
+--~ end
+--~ local dgpos = data.gpos
+--~ if dgpos then
+--~ for gp=1,#dgpos do
+--~ local gpos = dgpos[gp]
+--~ local subtables = gpos.subtables
+--~ if subtables then
+--~ for s=1,#subtables do
+--~ local subtable = subtables[s]
+--~ local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
+--~ if kernclass then -- the next one is quite slow
+--~ for k=1,#kernclass do
+--~ local kcl = kernclass[k]
+--~ local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
+--~ if type(lookups) ~= "table" then
+--~ lookups = { lookups }
+--~ end
+--~ for l=1,#lookups do
+--~ local lookup = lookups[l]
+--~ -- weird, as maxfirst and maxseconds can have holes
+--~ local maxfirsts, maxseconds = getn(firsts), getn(seconds)
+--~ if trace_loading then
+--~ logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
+--~ end
+--~ for fk, fv in next, firsts do
+--~ for first in gmatch(fv,"[^ ]+") do
+--~ local first_unicode = unicodes[first]
+--~ if type(first_unicode) == "number" then
+--~ first_unicode = { first_unicode }
+--~ end
+--~ for f=1,#first_unicode do
+--~ local glyph = glyphs[mapmap[first_unicode[f]]]
+--~ if glyph then
+--~ 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 next, seconds do
+--~ local offset = offsets[(fk-1) * maxseconds + sk]
+--~ --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
+--~ for second in gmatch(sv,"[^ ]+") 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
+--~ elseif trace_loading then
+--~ logs.report("load otf", "no glyph data for U+%04X", first_unicode[f])
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
+--~ subtable.kernclass = { }
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+otf.enhancers["reorganize kerns"] = function(data,filename)
+ local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
+ local mkdone = false
+ for index, glyph in next, data.glyphs do
+ if glyph.kerns then
+ local mykerns = { }
+ for k,v in next, glyph.kerns do
+ 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 not uvc then
+ if trace_loading then
+ logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
+ end
+ else
+ if type(vl) ~= "table" then
+ vl = { vl }
+ end
+ for l=1,#vl do
+ local vll = vl[l]
+ local mkl = mykerns[vll]
+ if not mkl then
+ mkl = { }
+ mykerns[vll] = mkl
+ end
+ if type(uvc) == "table" then
+ for u=1,#uvc do
+ mkl[uvc[u]] = vo
+ end
+ else
+ mkl[uvc] = vo
+ end
+ end
+ end
+ end
+ end
+ glyph.mykerns = mykerns
+ glyph.kerns = nil -- saves space and time
+ mkdone = true
+ end
+ end
+ if trace_loading and mkdone then
+ logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
+ end
+ if data.kerns then
+ if trace_loading then
+ logs.report("load otf", "removing global 'kern' table")
+ end
+ data.kerns = nil
+ end
+ local dgpos = data.gpos
+ if dgpos then
+ local separator = lpeg.P(" ")
+ local other = ((1 - separator)^0) / unicodes
+ local splitter = lpeg.Ct(other * (separator * other)^0)
+ for gp=1,#dgpos do
+ local gpos = dgpos[gp]
+ local subtables = gpos.subtables
+ if subtables then
+ for s=1,#subtables do
+ local subtable = subtables[s]
+ local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
+ if kernclass then -- the next one is quite slow
+ for k=1,#kernclass do
+ local kcl = kernclass[k]
+ local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
+ if type(lookups) ~= "table" then
+ lookups = { lookups }
+ end
+ local split = { }
+ for l=1,#lookups do
+ local lookup = lookups[l]
+ -- weird, as maxfirst and maxseconds can have holes, first seems to be indexed, seconds starts at 2
+ local maxfirsts, maxseconds = getn(firsts), getn(seconds)
+ for _, s in next, firsts do
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
+ for _, s in next, seconds do
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
+ if trace_loading then
+ logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
+ end
+ local function do_it(fk,first_unicode)
+ local glyph = glyphs[mapmap[first_unicode]]
+ if glyph then
+ 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
+ local baseoffset = (fk-1) * maxseconds
+ for sk=2,maxseconds do
+ local sv = seconds[sk]
+ local offset = offsets[baseoffset + sk]
+ --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
+ local splt = split[sv]
+ if splt then
+ for i=1,#splt do
+ local second_unicode = splt[i]
+ if tonumber(second_unicode) then
+ lookupkerns[second_unicode] = offset
+ else
+ for s=1,#second_unicode do
+ lookupkerns[second_unicode[s]] = offset
+ end
+ end
+ end
+ end
+ end
+ elseif trace_loading then
+ logs.report("load otf", "no glyph data for U+%04X", first_unicode)
+ end
+ end
+ for fk=1,#firsts do
+ local fv = firsts[fk]
+ local splt = split[fv]
+ if splt then
+ for i=1,#splt do
+ local first_unicode = splt[i]
+ if tonumber(first_unicode) then
+ do_it(fk,first_unicode)
+ else
+ for f=1,#first_unicode do
+ do_it(fk,first_unicode[f])
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
+ subtable.kernclass = { }
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["strip not needed data"] = function(data,filename)
+ local verbose = fonts.verbose
+ local int_to_uni = data.luatex.unicodes
+ for k, v in next, data.glyphs do
+ local d = v.dependents
+ if d then v.dependents = nil end
+ local a = v.altuni
+ if a then v.altuni = nil end
+ if verbose then
+ local code = int_to_uni[k]
+ -- looks like this is done twice ... bug?
+ if code then
+ local vu = v.unicode
+ if not vu then
+ v.unicode = code
+ elseif type(vu) == "table" then
+ if vu[#vu] == code then
+ -- weird
+ else
+ vu[#vu+1] = code
+ end
+ elseif vu ~= code then
+ 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.map = nil
+ data.names = nil -- funny names for editors
+ data.glyphcnt = nil
+ data.glyphmax = nil
+ if true then
+ data.gpos = nil
+ data.gsub = nil
+ data.anchor_classes = nil
+ end
+end
+
+otf.enhancers["migrate metadata"] = function(data,filename)
+ local global_fields = otf.tables.global_fields
+ local metadata = { }
+ for k,v in next, data do
+ if not global_fields[k] then
+ metadata[k] = v
+ data[k] = nil
+ end
+ end
+ data.metadata = metadata
+ -- goodies
+ local pfminfo = data.pfminfo
+ metadata.isfixedpitch = metadata.isfixedpitch or (pfminfo.panose and pfminfo.panose["proportion"] == "Monospaced")
+ metadata.charwidth = pfminfo and pfminfo.avgwidth
+end
+
+local private_math_parameters = {
+ "FractionDelimiterSize",
+ "FractionDelimiterDisplayStyleSize",
+}
+
+otf.enhancers["check math parameters"] = function(data,filename)
+ local mathdata = data.metadata.math
+ if mathdata then
+ for m=1,#private_math_parameters do
+ local pmp = private_math_parameters[m]
+ if not mathdata[pmp] then
+ if trace_loading then
+ logs.report("load otf", "setting math parameter '%s' to 0", pmp)
+ end
+ mathdata[pmp] = 0
+ end
+ end
+ end
+end
+
+otf.enhancers["flatten glyph lookups"] = function(data,filename)
+ for k, v in next, data.glyphs do
+ local lookups = v.lookups
+ if lookups then
+ for kk, vv in next, lookups do
+ for kkk=1,#vv do
+ local vvv = vv[kkk]
+ local s = vvv.specification
+ if s then
+ local t = vvv.type
+ if t == "ligature" then
+ vv[kkk] = { "ligature", s.components, s.char }
+ elseif t == "alternate" then
+ vv[kkk] = { "alternate", s.components }
+ elseif t == "substitution" then
+ vv[kkk] = { "substitution", s.variant }
+ elseif t == "multiple" then
+ vv[kkk] = { "multiple", s.components }
+ elseif t == "position" then
+ vv[kkk] = { "position", { s.x or 0, s.y or 0, s.h or 0, s.v or 0 } }
+ elseif t == "pair" then
+ local one, two, paired = s.offsets[1], s.offsets[2], s.paired or ""
+ if one then
+ if two then
+ vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0 } }
+ else
+ vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 } }
+ end
+ else
+ if two then
+ vv[kkk] = { "pair", paired, { }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0} } -- maybe nil instead of { }
+ else
+ vv[kkk] = { "pair", paired }
+ end
+ end
+ else
+ if trace_loading then
+ logs.report("load otf", "flattening needed, report to context list")
+ end
+ for a, b in next, s do
+ if trace_loading and vvv[a] then
+ logs.report("load otf", "flattening conflict, report to context list")
+ end
+ vvv[a] = b
+ end
+ vvv.specification = nil
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["simplify glyph lookups"] = function(data,filename)
+ for k, v in next, data.glyphs do
+ local lookups = v.lookups
+ if lookups then
+ local slookups, mlookups
+ for kk, vv in next, lookups do
+ if #vv == 1 then
+ if not slookups then
+ slookups = { }
+ v.slookups = slookups
+ end
+ slookups[kk] = vv[1]
+ else
+ if not mlookups then
+ mlookups = { }
+ v.mlookups = mlookups
+ end
+ mlookups[kk] = vv
+ end
+ end
+ v.lookups = nil
+ end
+ end
+end
+
+otf.enhancers["flatten anchor tables"] = function(data,filename)
+ for k, v in next, data.glyphs do
+ if v.anchors then
+ for kk, vv in next, v.anchors do
+ for kkk, vvv in next, vv do
+ if vvv.x or vvv.y then
+ vv[kkk] = { vvv.x or 0, vvv.y or 0 }
+ else
+ for kkkk=1,#vvv do
+ local vvvv = vvv[kkkk]
+ vvv[kkkk] = { vvvv.x or 0, vvvv.y or 0 }
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers["flatten feature tables"] = function(data,filename)
+ -- is this needed? do we still use them at all?
+ for _, tag in next, otf.glists do
+ if data[tag] then
+ if trace_loading then
+ logs.report("load otf", "flattening %s table", tag)
+ end
+ for k, v in next, data[tag] do
+ local features = v.features
+ if features then
+ for kk=1,#features do
+ local vv = features[kk]
+ local t = { }
+ local scripts = vv.scripts
+ for kkk=1,#scripts do
+ local vvv = scripts[kkk]
+ t[vvv.script] = vvv.langs
+ end
+ vv.scripts = t
+ end
+ end
+ end
+ end
+ end
+end
+
+otf.enhancers.patches = otf.enhancers.patches or { }
+
+otf.enhancers["patch bugs"] = function(data,filename)
+ local basename = file.basename(lower(filename))
+ for pattern, action in next, otf.enhancers.patches do
+ if find(basename,pattern) then
+ action(data,filename)
+ end
+ end
+end
+
+-- tex features
+
+fonts.otf.enhancers["enrich with features"] = function(data,filename)
+ -- later, ctx only
+end
+
+function otf.features.register(name,default)
+ otf.features.list[#otf.features.list+1] = name
+ otf.features.default[name] = default
+end
+
+-- for context this will become a task handler
+
+function otf.set_features(tfmdata,features)
+ local processes = { }
+ if features and next(features) then
+ local lists = { -- why local
+ fonts.triggers,
+ fonts.processors,
+ fonts.manipulators,
+ }
+ local mode = tfmdata.mode or fonts.mode -- or features.mode
+ local initializers = fonts.initializers
+ local fi = initializers[mode]
+ if fi then
+ local fiotf = fi.otf
+ if fiotf then
+ local done = { }
+ for l=1,4 do
+ local list = lists[l]
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ local value = features[f]
+ if value and fiotf[f] then -- brr
+ if not done[f] then -- so, we can move some to triggers
+ if trace_features then
+ logs.report("define otf","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown', tfmdata.fullname or 'unknown')
+ end
+ fiotf[f](tfmdata,value) -- can set mode (no need to pass otf)
+ mode = tfmdata.mode or fonts.mode -- keep this, mode can be set local !
+ local im = initializers[mode]
+ if im then
+ fiotf = initializers[mode].otf
+ end
+ done[f] = true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ local fm = fonts.methods[mode] -- todo: zonder node/mode otf/...
+ if fm then
+ local fmotf = fm.otf
+ if fmotf then
+ for l=1,4 do
+ local list = lists[l]
+ if list then
+ for i=1,#list do
+ local f = list[i]
+ if fmotf[f] then -- brr
+ if trace_features then
+ logs.report("define otf","installing feature handler %s for mode %s for font %s",f,mode or 'unknown', tfmdata.fullname or 'unknown')
+ end
+ processes[#processes+1] = fmotf[f]
+ end
+ end
+ end
+ end
+ end
+ else
+ -- message
+ end
+ end
+ return processes, features
+end
+
+function otf.otf_to_tfm(specification)
+ local name = specification.name
+ local sub = specification.sub
+ local filename = specification.filename
+ local format = specification.format
+ local features = specification.features.normal
+ local cache_id = specification.hash
+ local tfmdata = containers.read(tfm.cache(),cache_id)
+--~ print(cache_id)
+ if not tfmdata then
+ local otfdata = otf.load(filename,format,sub,features and features.featurefile)
+ if otfdata and next(otfdata) then
+ otfdata.shared = otfdata.shared or {
+ featuredata = { },
+ anchorhash = { },
+ initialized = false,
+ }
+ tfmdata = otf.copy_to_tfm(otfdata,cache_id)
+ if tfmdata and next(tfmdata) then
+ tfmdata.unique = tfmdata.unique or { }
+ tfmdata.shared = tfmdata.shared or { } -- combine
+ local shared = tfmdata.shared
+ shared.otfdata = otfdata
+ shared.features = features -- default
+ shared.dynamics = { }
+ shared.processes = { }
+ shared.set_dynamics = otf.set_dynamics -- fast access and makes other modules independent
+ -- this will be done later anyway, but it's convenient to have
+ -- them already for fast access
+ tfmdata.luatex = otfdata.luatex
+ tfmdata.indices = otfdata.luatex.indices
+ tfmdata.unicodes = otfdata.luatex.unicodes
+ tfmdata.marks = otfdata.luatex.marks
+ tfmdata.originals = otfdata.luatex.originals
+ tfmdata.changed = { }
+ tfmdata.has_italic = otfdata.metadata.has_italic
+ if not tfmdata.language then tfmdata.language = 'dflt' end
+ if not tfmdata.script then tfmdata.script = 'dflt' end
+ shared.processes, shared.features = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
+ end
+ end
+ containers.write(tfm.cache(),cache_id,tfmdata)
+ end
+ return tfmdata
+end
+
+--~ {
+--~ ['boundingbox']={ 95, -458, 733, 1449 },
+--~ ['class']="base",
+--~ ['name']="braceleft",
+--~ ['unicode']=123,
+--~ ['vert_variants']={
+--~ ['italic_correction']=0,
+--~ ['parts']={
+--~ { ['component']="uni23A9", ['endConnectorLength']=1000, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=0, }, -- bot
+--~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
+--~ { ['component']="uni23A8", ['endConnectorLength']=1000, ['fullAdvance']=4688, ['is_extender']=0, ['startConnectorLength']=1000, }, -- mid
+--~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
+--~ { ['component']="uni23A7", ['endConnectorLength']=0, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=1000, }, -- top
+--~ },
+--~ ['variants']="braceleft braceleft.vsize1 braceleft.vsize2 braceleft.vsize3 braceleft.vsize4 braceleft.vsize5 braceleft.vsize6 braceleft.vsize7",
+--~ },
+--~ ['width']=793,
+--~ },
+
+-- the first version made a top/mid/not extensible table, now we just pass on the variants data
+-- and deal with it in the tfm scaler (there is no longer an extensible table anyway)
+
+-- we cannot share descriptions as virtual fonts might extend them (ok, we could
+-- use a cache with a hash
+
+fonts.formats.dfont = "truetype"
+fonts.formats.ttc = "truetype"
+fonts.formats.ttf = "truetype"
+fonts.formats.otf = "opentype"
+
+function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)
+ if data then
+ local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { }
+ local luatex = data.luatex
+ local unicodes = luatex.unicodes -- names to unicodes
+ local indices = luatex.indices
+ local characters, parameters, math_parameters, descriptions = { }, { }, { }, { }
+ local designsize = metadata.designsize or metadata.design_size or 100
+ if designsize == 0 then
+ designsize = 100
+ end
+ local spaceunits = 500
+ -- indices maps from unicodes to indices
+ for u, i in next, indices do
+ characters[u] = { } -- we need this because for instance we add protruding info and loop over characters
+ descriptions[u] = glyphs[i]
+ end
+ -- math
+ if metadata.math then
+ -- parameters
+ for name, value in next, metadata.math do
+ math_parameters[name] = value
+ end
+ -- we could use a subset
+ for u, char in next, characters do
+ local d = descriptions[u]
+ local m = d.math
+ -- we have them shared because that packs nicer
+ -- we could prepare the variants and keep 'm in descriptions
+ if m then
+ local variants = m.horiz_variants
+ if variants then
+ local c = char
+ for n in gmatch(variants,"[^ ]+") do
+ local un = unicodes[n]
+ if un and u ~= un then
+ c.next = un
+ c = characters[un]
+ end
+ end
+ c.horiz_variants = m.horiz_parts
+ else
+ local variants = m.vert_variants
+ if variants then
+ local c = char
+ for n in gmatch(variants,"[^ ]+") do
+ local un = unicodes[n]
+ if un and u ~= un then
+ c.next = un
+ c = characters[un]
+ end
+ end
+ c.vert_variants = m.vert_parts
+ c.vert_italic_correction = m.vert_italic_correction
+ end
+ end
+ local kerns = m.kerns
+ if kerns then
+ char.mathkerns = kerns
+ end
+ end
+ end
+ end
+ -- end math
+ local endash, emdash, space = 0x20, 0x2014, "space" -- unicodes['space'], unicodes['emdash']
+ if metadata.isfixedpitch then
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, spacer = descriptions[emdash].width, "emdash"
+ end
+ if not spaceunits and metadata.charwidth then
+ spaceunits, spacer = metadata.charwidth, "charwidth"
+ end
+ else
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
+ end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, spacer = descriptions[emdash].width/2, "emdash/2"
+ end
+ if not spaceunits and metadata.charwidth then
+ spaceunits, spacer = metadata.charwidth, "charwidth"
+ end
+ end
+ spaceunits = tonumber(spaceunits) or tfm.units/2 -- 500 -- brrr
+ -- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't we use the basename then?)
+ local filename = fonts.tfm.checked_filename(luatex)
+ local fontname = metadata.fontname
+ local fullname = metadata.fullname or fontname
+ local cidinfo = data.cidinfo
+ local units = metadata.units_per_em or 1000
+ --
+ cidinfo.registry = cidinfo and cidinfo.registry or "" -- weird here, fix upstream
+ --
+ parameters.slant = 0
+ parameters.space = spaceunits -- 3.333 (cmr10)
+ parameters.space_stretch = units/2 -- 500 -- 1.666 (cmr10)
+ parameters.space_shrink = 1*units/3 -- 333 -- 1.111 (cmr10)
+ parameters.x_height = 2*units/5 -- 400
+ parameters.quad = units -- 1000
+ if spaceunits < 2*units/5 then
+ -- todo: warning
+ end
+ local italicangle = metadata.italicangle
+ if italicangle then -- maybe also in afm _
+ parameters.slant = parameters.slant - math.round(math.tan(italicangle*math.pi/180))
+ end
+ if metadata.isfixedpitch then
+ parameters.space_stretch = 0
+ parameters.space_shrink = 0
+ elseif otf.syncspace then --
+ parameters.space_stretch = spaceunits/2
+ parameters.space_shrink = spaceunits/3
+ end
+ parameters.extra_space = parameters.space_shrink -- 1.111 (cmr10)
+ if pfminfo.os2_xheight and pfminfo.os2_xheight > 0 then
+ parameters.x_height = pfminfo.os2_xheight
+ else
+ local x = 0x78 -- unicodes['x']
+ if x then
+ local x = descriptions[x]
+ if x then
+ parameters.x_height = x.height
+ end
+ end
+ end
+ --
+ return {
+ characters = characters,
+ parameters = parameters,
+ math_parameters = math_parameters,
+ descriptions = descriptions,
+ indices = indices,
+ unicodes = unicodes,
+ type = "real",
+ direction = 0,
+ boundarychar_label = 0,
+ boundarychar = 65536,
+ designsize = (designsize/10)*65536,
+ spacer = "500 units",
+ encodingbytes = 2,
+ filename = filename,
+ fontname = fontname,
+ fullname = fullname,
+ psname = fontname or fullname,
+ name = filename or fullname,
+ units = units,
+ format = fonts.fontformat(filename,"opentype"),
+ cidinfo = cidinfo,
+ ascender = abs(metadata.ascent or 0),
+ descender = abs(metadata.descent or 0),
+ spacer = spacer,
+ italicangle = italicangle,
+ }
+ else
+ return nil
+ end
+end
+
+otf.features.register('mathsize')
+
+function tfm.read_from_open_type(specification)
+ local tfmtable = otf.otf_to_tfm(specification)
+ if tfmtable then
+ local otfdata = tfmtable.shared.otfdata
+ tfmtable.name = specification.name
+ tfmtable.sub = specification.sub
+ local s = specification.size
+ local m = otfdata.metadata.math
+ if m then
+ -- this will move to a function
+ local f = specification.features
+ if f then
+ local f = f.normal
+ if f and f.mathsize then
+ local mathsize = specification.mathsize or 0
+ if mathsize == 2 then
+ local p = m.ScriptPercentScaleDown
+ if p then
+ local ps = p * specification.textsize / 100
+ if trace_math then
+ logs.report("define font","asked script size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
+ end
+ s = ps
+ end
+ elseif mathsize == 3 then
+ local p = m.ScriptScriptPercentScaleDown
+ if p then
+ local ps = p * specification.textsize / 100
+ if trace_math then
+ logs.report("define font","asked scriptscript size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
+ end
+ s = ps
+ end
+ end
+ end
+ end
+ end
+ tfmtable = tfm.scale(tfmtable,s,specification.relativeid)
+ if tfm.fontname_mode == "specification" then
+ -- not to be used in context !
+ local specname = specification.specification
+ if specname then
+ tfmtable.name = specname
+ if trace_defining then
+ logs.report("define font","overloaded fontname: '%s'",specname)
+ end
+ end
+ end
+ fonts.logger.save(tfmtable,file.extname(specification.filename),specification)
+ end
+--~ print(tfmtable.fullname)
+ return tfmtable
+end
+
+-- helpers
+
+function otf.collect_lookups(otfdata,kind,script,language)
+ -- maybe store this in the font
+ local sequences = otfdata.luatex.sequences
+ if sequences then
+ local featuremap, featurelist = { }, { }
+ for s=1,#sequences do
+ local sequence = sequences[s]
+ local features = sequence.features
+ features = features and features[kind]
+ features = features and (features[script] or features[default] or features[wildcard])
+ features = features and (features[language] or features[default] or features[wildcard])
+ if features then
+ local subtables = sequence.subtables
+ if subtables then
+ for s=1,#subtables do
+ local ss = subtables[s]
+ if not featuremap[s] then
+ featuremap[ss] = true
+ featurelist[#featurelist+1] = ss
+ end
+ end
+ end
+ end
+ end
+ if #featurelist > 0 then
+ return featuremap, featurelist
+ end
+ end
+ return nil, nil
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-otd'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+
+local otf = fonts.otf
+local fontdata = fonts.ids
+
+otf.features = otf.features or { }
+otf.features.default = otf.features.default or { }
+
+local context_setups = fonts.define.specify.context_setups
+local context_numbers = fonts.define.specify.context_numbers
+
+local a_to_script = { } otf.a_to_script = a_to_script
+local a_to_language = { } otf.a_to_language = a_to_language
+
+function otf.set_dynamics(font,dynamics,attribute)
+ features = context_setups[context_numbers[attribute]] -- can be moved to caller
+ if features then
+ local script = features.script or 'dflt'
+ local language = features.language or 'dflt'
+ local ds = dynamics[script]
+ if not ds then
+ ds = { }
+ dynamics[script] = ds
+ end
+ local dsl = ds[language]
+ if not dsl then
+ dsl = { }
+ ds[language] = dsl
+ end
+ local dsla = dsl[attribute]
+ if dsla then
+ -- if trace_dynamics then
+ -- logs.report("otf define","using dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
+ -- end
+ return dsla
+ else
+ local tfmdata = fontdata[font]
+ a_to_script [attribute] = script
+ a_to_language[attribute] = language
+ -- we need to save some values
+ local saved = {
+ script = tfmdata.script,
+ language = tfmdata.language,
+ mode = tfmdata.mode,
+ features = tfmdata.shared.features
+ }
+ tfmdata.mode = "node"
+ tfmdata.language = language
+ tfmdata.script = script
+ tfmdata.shared.features = { }
+ -- end of save
+ dsla = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
+ if trace_dynamics then
+ logs.report("otf define","setting dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
+ end
+ -- we need to restore some values
+ tfmdata.script = saved.script
+ tfmdata.language = saved.language
+ tfmdata.mode = saved.mode
+ tfmdata.shared.features = saved.features
+ -- end of restore
+ dynamics[script][language][attribute] = dsla -- cache
+ return dsla
+ end
+ end
+ return nil -- { }
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-oti'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- i need to check features=yes|no also in relation to hashing
+
+local lower = string.lower
+
+local otf = fonts.otf
+
+otf.default_language = 'latn'
+otf.default_script = 'dflt'
+
+local languages = otf.tables.languages
+local scripts = otf.tables.scripts
+
+function otf.features.language(tfmdata,value)
+ if value then
+ value = lower(value)
+ if languages[value] then
+ tfmdata.language = value
+ end
+ end
+end
+
+function otf.features.script(tfmdata,value)
+ if value then
+ value = lower(value)
+ if scripts[value] then
+ tfmdata.script = value
+ end
+ end
+end
+
+function otf.features.mode(tfmdata,value)
+ if value then
+ tfmdata.mode = lower(value)
+ end
+end
+
+fonts.initializers.base.otf.language = otf.features.language
+fonts.initializers.base.otf.script = otf.features.script
+fonts.initializers.base.otf.mode = otf.features.mode
+fonts.initializers.base.otf.method = otf.features.mode
+
+fonts.initializers.node.otf.language = otf.features.language
+fonts.initializers.node.otf.script = otf.features.script
+fonts.initializers.node.otf.mode = otf.features.mode
+fonts.initializers.node.otf.method = otf.features.mode
+
+otf.features.register("features",true) -- we always do features
+table.insert(fonts.processors,"features") -- we need a proper function for doing this
+
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-otb'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local concat = table.concat
+local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local lpegmatch = lpeg.match
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
+local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
+local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
+local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
+local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
+local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
+local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
+
+local wildcard = "*"
+local default = "dflt"
+
+local split_at_space = lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+
+local pcache, fcache = { }, { } -- could be weak
+
+local function gref(descriptions,n)
+ if type(n) == "number" then
+ local name = descriptions[n].name
+ if name then
+ return format("U+%04X (%s)",n,name)
+ else
+ return format("U+%04X")
+ end
+ elseif n then
+ local num, nam = { }, { }
+ for i=1,#n do
+ local ni = n[i]
+ num[i] = format("U+%04X",ni)
+ nam[i] = descriptions[ni].name or "?"
+ end
+ return format("%s (%s)",concat(num," "), concat(nam," "))
+ else
+ return "?"
+ end
+end
+
+local function cref(kind,lookupname)
+ if lookupname then
+ return format("feature %s, lookup %s",kind,lookupname)
+ else
+ return format("feature %s",kind)
+ end
+end
+
+local function resolve_ligatures(tfmdata,ligatures,kind)
+ kind = kind or "unknown"
+ local unicodes = tfmdata.unicodes
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local changed = tfmdata.changed
+ local done = { }
+ while true do
+ local ok = false
+ for k,v in next, ligatures do
+ local lig = v[1]
+ if not done[lig] then
+ local ligs = lpegmatch(split_at_space,lig)
+ if #ligs == 2 then
+ local uc = v[2]
+ local c, f, s = characters[uc], ligs[1], ligs[2]
+ local uft, ust = unicodes[f] or 0, unicodes[s] or 0
+ if not uft or not ust then
+ logs.report("define otf","%s: unicode problem with base ligature %s = %s + %s",cref(kind),gref(descriptions,uc),gref(descriptions,uft),gref(descriptions,ust))
+ -- 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_baseinit and trace_ligatures then
+ logs.report("define otf","%s: base ligature %s + %s ignored",cref(kind),gref(descriptions,uf),gref(descriptions,us))
+ end
+ else
+ local first, second = characters[uf], us
+ if first and second then
+ local t = first.ligatures
+ if not t then
+ t = { }
+ first.ligatures = t
+ end
+ if type(uc) == "number" then
+ t[second] = { type = 0, char = uc }
+ else
+ t[second] = { type = 0, char = uc[1] } -- can this still happen?
+ end
+ if trace_baseinit and trace_ligatures then
+ logs.report("define otf","%s: base ligature %s + %s => %s",cref(kind),gref(descriptions,uf),gref(descriptions,us),gref(descriptions,uc))
+ end
+ end
+ end
+ end
+ end
+ end
+ ok, done[lig] = true, descriptions[uc].name
+ end
+ end
+ end
+ if ok then
+ -- done has "a b c" = "a_b_c" and ligatures the already set ligatures: "a b" = 123
+ -- and here we add extras (f i i = fi + i and alike)
+ --
+ -- we could use a hash for fnc and pattern
+ --
+ -- this might be interfering !
+ for d,n in next, done do
+ local pattern = pcache[d] if not pattern then pattern = "^(" .. d .. ") " pcache[d] = pattern end
+ local fnc = fcache[n] if not fnc then fnc = function() return n .. " " end fcache[n] = fnc end
+ for k,v in next, ligatures do
+ v[1] = gsub(v[1],pattern,fnc)
+ end
+ end
+ else
+ break
+ end
+ end
+end
+
+local splitter = lpeg.splitat(" ")
+
+function prepare_base_substitutions(tfmdata,kind,value) -- we can share some code with the node features
+ if value then
+ local otfdata = tfmdata.shared.otfdata
+ local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
+ if validlookups then
+ local ligatures = { }
+ local unicodes = tfmdata.unicodes -- names to unicodes
+ local indices = tfmdata.indices
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local changed = tfmdata.changed
+ --
+ local actions = {
+ substitution = function(p,lookup,k,glyph,unicode)
+ local pv = p[2] -- p.variant
+ if pv then
+ local upv = unicodes[pv]
+ if upv then
+ if type(upv) == "table" then
+ upv = upv[1]
+ end
+ if characters[upv] then
+ if trace_baseinit and trace_singles then
+ logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv))
+ end
+ changed[k] = upv
+ end
+ end
+ end
+ end,
+ alternate = function(p,lookup,k,glyph,unicode)
+ local pc = p[2] -- p.components
+ if pc then
+ -- a bit optimized ugliness
+ if value == 1 then
+ pc = lpegmatch(splitter,pc)
+ elseif value == 2 then
+ local a, b = lpegmatch(splitter,pc)
+ pc = b or a
+ else
+ pc = { lpegmatch(splitter,pc) }
+ pc = pc[value] or pc[#pc]
+ end
+ if pc then
+ local upc = unicodes[pc]
+ if upc then
+ if type(upc) == "table" then
+ upc = upc[1]
+ end
+ if characters[upc] then
+ if trace_baseinit and trace_alternatives then
+ logs.report("define otf","%s: base alternate %s %s => %s",cref(kind,lookup),tostring(value),gref(descriptions,k),gref(descriptions,upc))
+ end
+ changed[k] = upc
+ end
+ end
+ end
+ end
+ end,
+ ligature = function(p,lookup,k,glyph,unicode)
+ local pc = p[2]
+ if pc then
+ if trace_baseinit and trace_ligatures then
+ local upc = { lpegmatch(splitter,pc) }
+ for i=1,#upc do upc[i] = unicodes[upc[i]] end
+ -- we assume that it's no table
+ logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k))
+ end
+ ligatures[#ligatures+1] = { pc, k }
+ end
+ end,
+ }
+ --
+ for k,c in next, characters do
+ local glyph = descriptions[k]
+ local lookups = glyph.slookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local p = lookups[lookup]
+ if p then
+ local a = actions[p[1]]
+ if a then
+ a(p,lookup,k,glyph,unicode)
+ end
+ end
+ end
+ end
+ local lookups = glyph.mlookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local ps = lookups[lookup]
+ if ps then
+ for i=1,#ps do
+ local p = ps[i]
+ local a = actions[p[1]]
+ if a then
+ a(p,lookup,k,glyph,unicode)
+ end
+ end
+ end
+ end
+ end
+ end
+ resolve_ligatures(tfmdata,ligatures,kind)
+ end
+ else
+ tfmdata.ligatures = tfmdata.ligatures or { } -- left over from what ?
+ end
+end
+
+local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all
+ if value then
+ local otfdata = tfmdata.shared.otfdata
+ local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
+ if validlookups then
+ local unicodes = tfmdata.unicodes -- names to unicodes
+ local indices = tfmdata.indices
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local sharedkerns = { }
+ for u, chr in next, characters do
+ local d = descriptions[u]
+ if d then
+ local dk = d.mykerns -- shared
+ if dk then
+ local s = sharedkerns[dk]
+ if s == false then
+ -- skip
+ elseif s then
+ chr.kerns = s
+ else
+ local t, done = chr.kerns or { }, false
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local kerns = dk[lookup]
+ if kerns then
+ for k, v in next, kerns do
+ if v ~= 0 and not t[k] then -- maybe no 0 test here
+ t[k], done = v, true
+ if trace_baseinit and trace_kerns then
+ logs.report("define otf","%s: base kern %s + %s => %s",cref(kind,lookup),gref(descriptions,u),gref(descriptions,k),v)
+ end
+ end
+ end
+ end
+ end
+ if done then
+ sharedkerns[dk] = t
+ chr.kerns = t -- no empty assignments
+ else
+ sharedkerns[dk] = false
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+-- In principle we could register each feature individually which was
+-- what we did in earlier versions. However, after the rewrite it
+-- made more sense to collect them in an overall features initializer
+-- just as with the node variant. There it was needed because we need
+-- to do complete mixed runs and not run featurewise (as we did before).
+
+local supported_gsub = {
+ 'liga', 'dlig', 'rlig', 'hlig',
+ 'pnum', 'onum', 'tnum', 'lnum',
+ 'zero',
+ 'smcp', 'cpsp', 'c2sc', 'ornm', 'aalt',
+ 'hwid', 'fwid',
+ 'ssty', 'rtlm', -- math
+-- 'tlig', 'trep',
+}
+
+local supported_gpos = {
+ 'kern'
+}
+
+function otf.features.register_base_substitution(tag)
+ supported_gsub[#supported_gsub+1] = tag
+end
+function otf.features.register_base_kern(tag)
+ supported_gsub[#supported_gpos+1] = tag
+end
+
+local basehash, basehashes = { }, 1
+
+function fonts.initializers.base.otf.features(tfmdata,value)
+ if true then -- value then
+ -- not shared
+ local t = trace_preparing and os.clock()
+ local features = tfmdata.shared.features
+ if features then
+ local h = { }
+ for f=1,#supported_gsub do
+ local feature = supported_gsub[f]
+ local value = features[feature]
+ prepare_base_substitutions(tfmdata,feature,value)
+ if value then
+ h[#h+1] = feature .. "=" .. tostring(value)
+ end
+ end
+ for f=1,#supported_gpos do
+ local feature = supported_gpos[f]
+ local value = features[feature]
+ prepare_base_kerns(tfmdata,feature,features[feature])
+ if value then
+ h[#h+1] = feature .. "=" .. tostring(value)
+ end
+ end
+ local hash = concat(h," ")
+ local base = basehash[hash]
+ if not base then
+ basehashes = basehashes + 1
+ base = basehashes
+ basehash[hash] = base
+ end
+ -- We need to make sure that luatex sees the difference between
+ -- base fonts that have different glyphs in the same slots in fonts
+ -- that have the same fullname (or filename). LuaTeX will merge fonts
+ -- eventually (and subset later on). If needed we can use a more
+ -- verbose name as long as we don't use <()<>[]{}/%> and the length
+ -- is < 128.
+ tfmdata.fullname = tfmdata.fullname .. "-" .. base -- tfmdata.psname is the original
+ --~ logs.report("otf define","fullname base hash: '%s', featureset '%s'",tfmdata.fullname,hash)
+ end
+ if trace_preparing then
+ logs.report("otf define","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ end
+ end
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-otn'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this is still somewhat preliminary and it will get better in due time;
+-- much functionality could only be implemented thanks to the husayni font
+-- of Idris Samawi Hamid to who we dedicate this module.
+
+-- I'm in the process of cleaning up the code (which happens in another
+-- file) so don't rely on things staying the same.
+
+-- some day when we can jit this, we can use more functions
+
+-- we can use more lpegs when lpeg is extended with function args and so
+-- resolving to unicode does not gain much
+
+-- in retrospect it always looks easy but believe it or not, it took a lot
+-- of work to get proper open type support done: buggy fonts, fuzzy specs,
+-- special made testfonts, many skype sessions between taco, idris and me,
+-- torture tests etc etc ... unfortunately the code does not show how much
+-- time it took ...
+
+-- todo:
+--
+-- kerning is probably not yet ok for latin around dics nodes
+-- extension infrastructure (for usage out of context)
+-- sorting features according to vendors/renderers
+-- alternative loop quitters
+-- check cursive and r2l
+-- find out where ignore-mark-classes went
+-- remove unused tables
+-- slide tail (always glue at the end so only needed once
+-- default features (per language, script)
+-- cleanup kern(class) code, remove double info
+-- handle positions (we need example fonts)
+-- handle gpos_single (we might want an extra width field in glyph nodes because adding kerns might interfere)
+
+--[[ldx--
+<p>This module is a bit more split up that I'd like but since we also want to test
+with plain <l n='tex'/> it has to be so. This module is part of <l n='context'/>
+and discussion about improvements and functionality mostly happens on the
+<l n='context'/> mailing list.</p>
+
+<p>The specification of OpenType is kind of vague. Apart from a lack of a proper
+free specifications there's also the problem that Microsoft and Adobe
+may have their own interpretation of how and in what order to apply features.
+In general the Microsoft website has more detailed specifications and is a
+better reference. There is also some information in the FontForge help files.</p>
+
+<p>Because there is so much possible, fonts might contain bugs and/or be made to
+work with certain rederers. These may evolve over time which may have the side
+effect that suddenly fonts behave differently.</p>
+
+<p>After a lot of experiments (mostly by Taco, me and Idris) we're now at yet another
+implementation. Of course all errors are mine and of course the code can be
+improved. There are quite some optimizations going on here and processing speed
+is currently acceptable. Not all functions are implemented yet, often because I
+lack the fonts for testing. Many scripts are not yet supported either, but I will
+look into them as soon as <l n='context'/> users ask for it.</p>
+
+<p>Because there are different interpretations possible, I will extend the code
+with more (configureable) variants. I can also add hooks for users so that they can
+write their own extensions.</p>
+
+<p>Glyphs are indexed not by unicode but in their own way. This is because there is no
+relationship with unicode at all, apart from the fact that a font might cover certain
+ranges of characters. One character can have multiple shapes. However, at the
+<l n='tex'/> end we use unicode so and all extra glyphs are mapped into a private
+space. This is needed because we need to access them and <l n='tex'/> has to include
+then in the output eventually.</p>
+
+<p>The raw table as it coms from <l n='fontforge'/> gets reorganized in to fit out needs.
+In <l n='context'/> that table is packed (similar tables are shared) and cached on disk
+so that successive runs can use the optimized table (after loading the table is
+unpacked). The flattening code used later is a prelude to an even more compact table
+format (and as such it keeps evolving).</p>
+
+<p>This module is sparsely documented because it is a moving target. The table format
+of the reader changes and we experiment a lot with different methods for supporting
+features.</p>
+
+<p>As with the <l n='afm'/> code, we may decide to store more information in the
+<l n='otf'/> table.</p>
+
+<p>Incrementing the version number will force a re-cache. We jump the number by one
+when there's a fix in the <l n='fontforge'/> library or <l n='lua'/> code that
+results in different tables.</p>
+--ldx]]--
+
+-- action handler chainproc chainmore comment
+--
+-- gsub_single ok ok ok
+-- gsub_multiple ok ok not implemented yet
+-- gsub_alternate ok ok not implemented yet
+-- gsub_ligature ok ok ok
+-- gsub_context ok --
+-- gsub_contextchain ok --
+-- gsub_reversecontextchain ok --
+-- chainsub -- ok
+-- reversesub -- ok
+-- gpos_mark2base ok ok
+-- gpos_mark2ligature ok ok
+-- gpos_mark2mark ok ok
+-- gpos_cursive ok untested
+-- gpos_single ok ok
+-- gpos_pair ok ok
+-- gpos_context ok --
+-- gpos_contextchain ok --
+--
+-- actions:
+--
+-- handler : actions triggered by lookup
+-- chainproc : actions triggered by contextual lookup
+-- chainmore : multiple substitutions triggered by contextual lookup (e.g. fij -> f + ij)
+--
+-- remark: the 'not implemented yet' variants will be done when we have fonts that use them
+-- remark: we need to check what to do with discretionaries
+
+local concat, insert, remove = table.concat, table.insert, table.remove
+local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
+local type, next, tonumber, tostring = type, next, tonumber, tostring
+local lpegmatch = lpeg.match
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local trace_lookups = false trackers.register("otf.lookups", function(v) trace_lookups = v end)
+local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
+local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
+local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
+local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
+local trace_contexts = false trackers.register("otf.contexts", function(v) trace_contexts = v end)
+local trace_marks = false trackers.register("otf.marks", function(v) trace_marks = v end)
+local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
+local trace_cursive = false trackers.register("otf.cursive", function(v) trace_cursive = v end)
+local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
+local trace_bugs = false trackers.register("otf.bugs", function(v) trace_bugs = v end)
+local trace_details = false trackers.register("otf.details", function(v) trace_details = v end)
+local trace_applied = false trackers.register("otf.applied", function(v) trace_applied = v end)
+local trace_steps = false trackers.register("otf.steps", function(v) trace_steps = v end)
+local trace_skips = false trackers.register("otf.skips", function(v) trace_skips = v end)
+local trace_directions = false trackers.register("otf.directions", function(v) trace_directions = v end)
+
+trackers.register("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end)
+trackers.register("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end)
+
+trackers.register("otf.replacements", "otf.singles,otf.multiples,otf.alternatives,otf.ligatures")
+trackers.register("otf.positions","otf.marks,otf.kerns,otf.cursive")
+trackers.register("otf.actions","otf.replacements,otf.positions")
+trackers.register("otf.injections","nodes.injections")
+
+trackers.register("*otf.sample","otf.steps,otf.actions,otf.analyzing")
+
+local insert_node_after = node.insert_after
+local delete_node = nodes.delete
+local copy_node = node.copy
+local find_node_tail = node.tail or node.slide
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+
+local zwnj = 0x200C
+local zwj = 0x200D
+local wildcard = "*"
+local default = "dflt"
+
+local split_at_space = lpeg.splitters[" "] or lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local kern = node.id('kern')
+local disc = node.id('disc')
+local whatsit = node.id('whatsit')
+
+local state = attributes.private('state')
+local markbase = attributes.private('markbase')
+local markmark = attributes.private('markmark')
+local markdone = attributes.private('markdone')
+local cursbase = attributes.private('cursbase')
+local curscurs = attributes.private('curscurs')
+local cursdone = attributes.private('cursdone')
+local kernpair = attributes.private('kernpair')
+
+local set_mark = nodes.set_mark
+local set_cursive = nodes.set_cursive
+local set_kern = nodes.set_kern
+local set_pair = nodes.set_pair
+
+local markonce = true
+local cursonce = true
+local kernonce = true
+
+local fontdata = fonts.ids
+
+otf.features.process = { }
+
+-- 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 descriptions = false
+local marks = false
+local indices = false
+local unicodes = false
+local currentfont = false
+local lookuptable = false
+local anchorlookups = false
+local handlers = { }
+local rlmode = 0
+local featurevalue = false
+
+-- we cheat a bit and assume that a font,attr combination are kind of ranged
+
+local context_setups = fonts.define.specify.context_setups
+local context_numbers = fonts.define.specify.context_numbers
+local context_merged = fonts.define.specify.context_merged
+
+-- we cannot optimize with "start = first_character(head)" because then we don't
+-- know which rlmode we're in which messes up cursive handling later on
+--
+-- head is always a whatsit so we can safely assume that head is not changed
+
+local special_attributes = {
+ init = 1,
+ medi = 2,
+ fina = 3,
+ isol = 4
+}
+
+-- we use this for special testing and documentation
+
+local checkstep = (nodes and nodes.tracers and nodes.tracers.steppers.check) or function() end
+local registerstep = (nodes and nodes.tracers and nodes.tracers.steppers.register) or function() end
+local registermessage = (nodes and nodes.tracers and nodes.tracers.steppers.message) or function() end
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf direct",...)
+end
+local function logwarning(...)
+ logs.report("otf direct",...)
+end
+
+local function gref(n)
+ if type(n) == "number" then
+ local description = descriptions[n]
+ local name = description and description.name
+ if name then
+ return format("U+%04X (%s)",n,name)
+ else
+ return format("U+%04X",n)
+ end
+ elseif not n then
+ return "<error in tracing>"
+ else
+ local num, nam = { }, { }
+ for i=1,#n do
+ local ni = n[i]
+ num[#num+1] = format("U+%04X",ni)
+ local dni = descriptions[ni]
+ nam[#num] = (dni and dni.name) or "?"
+ end
+ return format("%s (%s)",concat(num," "), concat(nam," "))
+ end
+end
+
+local function cref(kind,chainname,chainlookupname,lookupname,index)
+ if index then
+ return format("feature %s, chain %s, sub %s, lookup %s, index %s",kind,chainname,chainlookupname,lookupname,index)
+ elseif lookupname then
+ return format("feature %s, chain %s, sub %s, lookup %s",kind,chainname or "?",chainlookupname or "?",lookupname)
+ elseif chainlookupname then
+ return format("feature %s, chain %s, sub %s",kind,chainname or "?",chainlookupname)
+ elseif chainname then
+ return format("feature %s, chain %s",kind,chainname)
+ else
+ return format("feature %s",kind)
+ end
+end
+
+local function pref(kind,lookupname)
+ return format("feature %s, lookup %s",kind,lookupname)
+end
+
+-- we can assume that languages that use marks are not hyphenated
+-- we can also assume that at most one discretionary is present
+
+local function markstoligature(kind,lookupname,start,stop,char)
+ local n = copy_node(start)
+ local keep = start
+ local current
+ current, start = insert_node_after(start,start,n)
+ local snext = stop.next
+ current.next = snext
+ if snext then
+ snext.prev = current
+ end
+ start.prev, stop.next = nil, nil
+ current.char, current.subtype, current.components = char, 2, start
+ return keep
+end
+
+local function toligature(kind,lookupname,start,stop,char,markflag,discfound) -- brr head
+ if start ~= stop then
+--~ if discfound then
+--~ local lignode = copy_node(start)
+--~ lignode.font = start.font
+--~ lignode.char = char
+--~ lignode.subtype = 2
+--~ start = node.do_ligature_n(start, stop, lignode)
+--~ if start.id == disc then
+--~ local prev = start.prev
+--~ start = start.next
+--~ end
+ if discfound then
+ -- print("start->stop",nodes.tosequence(start,stop))
+ local lignode = copy_node(start)
+ lignode.font, lignode.char, lignode.subtype = start.font, char, 2
+ local next, prev = stop.next, start.prev
+ stop.next = nil
+ lignode = node.do_ligature_n(start, stop, lignode)
+ prev.next = lignode
+ if next then
+ next.prev = lignode
+ end
+ lignode.next, lignode.prev = next, prev
+ start = lignode
+ -- print("start->end",nodes.tosequence(start))
+ else -- start is the ligature
+ local deletemarks = markflag ~= "mark"
+ local n = copy_node(start)
+ local current
+ current, start = insert_node_after(start,start,n)
+ local snext = stop.next
+ current.next = snext
+ if snext then
+ snext.prev = current
+ end
+ start.prev, stop.next = nil, nil
+ current.char, current.subtype, current.components = char, 2, start
+ local head = current
+ if deletemarks then
+ if trace_marks then
+ while start do
+ if marks[start.char] then
+ logwarning("%s: remove mark %s",pref(kind,lookupname),gref(start.char))
+ end
+ start = start.next
+ end
+ end
+ else
+ local i = 0
+ while start do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
+ end
+ head, current = insert_node_after(head,current,copy_node(start))
+ else
+ i = i + 1
+ end
+ start = start.next
+ end
+ start = current.next
+ while start and start.id == glyph do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
+ end
+ else
+ break
+ end
+ start = start.next
+ end
+ end
+ return head
+ end
+ else
+ start.char = char
+ end
+ return start
+end
+
+function handlers.gsub_single(start,kind,lookupname,replacement)
+ if trace_singles then
+ logprocess("%s: replacing %s by single %s",pref(kind,lookupname),gref(start.char),gref(replacement))
+ end
+ start.char = replacement
+ return start, true
+end
+
+local function alternative_glyph(start,alternatives,kind,chainname,chainlookupname,lookupname) -- chainname and chainlookupname optional
+ local value, choice, n = featurevalue or tfmdata.shared.features[kind], nil, #alternatives -- global value, brrr
+ if value == "random" then
+ local r = math.random(1,n)
+ value, choice = format("random, choice %s",r), alternatives[r]
+ elseif value == "first" then
+ value, choice = format("first, choice %s",1), alternatives[1]
+ elseif value == "last" then
+ value, choice = format("last, choice %s",n), alternatives[n]
+ else
+ value = tonumber(value)
+ if type(value) ~= "number" then
+ value, choice = "default, choice 1", alternatives[1]
+ elseif value > n then
+ value, choice = format("no %s variants, taking %s",value,n), alternatives[n]
+ elseif value == 0 then
+ value, choice = format("choice %s (no change)",value), start.char
+ elseif value < 1 then
+ value, choice = format("no %s variants, taking %s",value,1), alternatives[1]
+ else
+ value, choice = format("choice %s",value), alternatives[value]
+ end
+ end
+ if not choice then
+ logwarning("%s: no variant %s for %s",cref(kind,chainname,chainlookupname,lookupname),value,gref(start.char))
+ choice, value = start.char, format("no replacement instead of %s",value)
+ end
+ return choice, value
+end
+
+function handlers.gsub_alternate(start,kind,lookupname,alternative,sequence)
+ local choice, index = alternative_glyph(start,alternative,kind,lookupname)
+ if trace_alternatives then
+ logprocess("%s: replacing %s by alternative %s (%s)",pref(kind,lookupname),gref(start.char),gref(choice),index)
+ end
+ start.char = choice
+ return start, true
+end
+
+function handlers.gsub_multiple(start,kind,lookupname,multiple)
+ if trace_multiples then
+ logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple))
+ end
+ start.char = multiple[1]
+ if #multiple > 1 then
+ for k=2,#multiple do
+ local n = copy_node(start)
+ n.char = multiple[k]
+ local sn = start.next
+ n.next = sn
+ n.prev = start
+ if sn then
+ sn.prev = n
+ end
+ start.next = n
+ start = n
+ end
+ end
+ return start, true
+end
+
+function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or maybe pass lookup ref
+ local s, stop, discfound = start.next, nil, false
+ local startchar = start.char
+ if marks[startchar] then
+ while s do
+ local id = s.id
+ if id == glyph and s.subtype<256 then
+ if s.font == currentfont then
+ local char = s.char
+ local lg = ligature[1][char]
+ if not lg then
+ break
+ else
+ stop = s
+ ligature = lg
+ s = s.next
+ end
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ if stop and ligature[2] then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = markstoligature(kind,lookupname,start,stop,ligature[2])
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = markstoligature(kind,lookupname,start,stop,ligature[2])
+ end
+ return start, true
+ end
+ else
+ local skipmark = sequence.flags[1]
+ while s do
+ local id = s.id
+ if id == glyph and s.subtype<256 then
+ if s.font == currentfont then
+ local char = s.char
+ if skipmark and marks[char] then
+ s = s.next
+ else
+ local lg = ligature[1][char]
+ if not lg then
+ break
+ else
+ stop = s
+ ligature = lg
+ s = s.next
+ end
+ end
+ else
+ break
+ end
+ elseif id == disc then
+ discfound = true
+ s = s.next
+ else
+ break
+ end
+ end
+ if stop and ligature[2] then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
+ end
+ return start, true
+ end
+ end
+ return start, false
+end
+
+--[[ldx--
+<p>We get hits on a mark, but we're not sure if the it has to be applied so
+we need to explicitly test for basechar, baselig and basemark entries.</p>
+--ldx]]--
+
+function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
+ local markchar = start.char
+ if marks[markchar] then
+ local base = start.prev -- [glyph] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+ end
+ end
+ end
+ local baseanchors = descriptions[basechar]
+ if baseanchors then
+ baseanchors = baseanchors.anchors
+ end
+ if baseanchors then
+ local baseanchors = baseanchors['basechar']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
+ pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s, no matching anchors for mark %s and base %s",pref(kind,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
+ fonts.register_message(currentfont,basechar,"no base anchors")
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char",pref(kind,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
+ -- check chainpos variant
+ local markchar = start.char
+ if marks[markchar] then
+ local base = start.prev -- [glyph] [optional marks] [start=mark]
+ local index = 1
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ else
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+ end
+ end
+ end
+ local i = has_attribute(start,markdone)
+ if i then index = i end
+ local baseanchors = descriptions[basechar]
+ if baseanchors then
+ baseanchors = baseanchors.anchors
+ if baseanchors then
+ local baseanchors = baseanchors['baselig']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ ba = ba[index]
+ if ba then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ if trace_marks then
+ logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
+ pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and baselig %s",pref(kind,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
+ fonts.register_message(currentfont,basechar,"no base anchors")
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char",pref(kind,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
+ local markchar = start.char
+ if marks[markchar] then
+--~ local alreadydone = markonce and has_attribute(start,markmark)
+--~ if not alreadydone then
+ local base = start.prev -- [glyph] [basemark] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ local basechar = base.char
+ local baseanchors = descriptions[basechar]
+ if baseanchors then
+ baseanchors = baseanchors.anchors
+ if baseanchors then
+ baseanchors = baseanchors['basemark']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
+ pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start,true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and basemark %s",pref(kind,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
+ fonts.register_message(currentfont,basechar,"no base anchors")
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no mark",pref(kind,lookupname))
+ end
+--~ elseif trace_marks and trace_details then
+--~ logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone)
+--~ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",pref(kind,lookupname),gref(markchar))
+ end
+ return start,false
+end
+
+function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to be checked
+ local alreadydone = cursonce and has_attribute(start,cursbase)
+ if not alreadydone then
+ local done = false
+ local startchar = start.char
+ if marks[startchar] then
+ if trace_cursive then
+ logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
+ end
+ else
+ local nxt = start.next
+ while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ local nextchar = nxt.char
+ if marks[nextchar] then
+ -- should not happen (maybe warning)
+ nxt = nxt.next
+ else
+ local entryanchors = descriptions[nextchar]
+ if entryanchors then
+ entryanchors = entryanchors.anchors
+ if entryanchors then
+ entryanchors = entryanchors['centry']
+ if entryanchors then
+ local al = anchorlookups[lookupname]
+ for anchor, entry in next, entryanchors do
+ if al[anchor] then
+ local exit = exitanchors[anchor]
+ if exit then
+ local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ if trace_cursive then
+ logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
+ end
+ done = true
+ break
+ end
+ end
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
+ fonts.register_message(currentfont,startchar,"no entry anchors")
+ end
+ break
+ end
+ end
+ end
+ return start, done
+ else
+ if trace_cursive and trace_details then
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ end
+ return start, false
+ end
+end
+
+function handlers.gpos_single(start,kind,lookupname,kerns,sequence)
+ local startchar = start.char
+ local dx, dy, w, h = set_pair(start,tfmdata.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting single %s by (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),dx,dy,w,h)
+ end
+ return start, false
+end
+
+function handlers.gpos_pair(start,kind,lookupname,kerns,sequence)
+ -- todo: kerns in disc nodes: pre, post, replace -> loop over disc too
+ -- todo: kerns in components of ligatures
+ local snext = start.next
+ if not snext then
+ return start, false
+ else
+ local prev, done = start, false
+ local factor = tfmdata.factor
+ while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local nextchar = snext.char
+local krn = kerns[nextchar]
+ if not krn and marks[nextchar] then
+ prev = snext
+ snext = snext.next
+ else
+ local krn = kerns[nextchar]
+ if not krn then
+ -- skip
+ elseif type(krn) == "table" then
+ if krn[1] == "pair" then
+ local a, b = krn[3], krn[4]
+ if a and #a > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting first of pair %s and %s by (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ if b and #b > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
+ if trace_kerns then
+ logprocess("%s: shifting second of pair %s and %s by (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ else
+ logs.report("%s: check this out (old kern stuff)",pref(kind,lookupname))
+ local a, b = krn[3], krn[7]
+ if a and a ~= 0 then
+ local k = set_kern(snext,factor,rlmode,a)
+ if trace_kerns then
+ logprocess("%s: inserting first kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar))
+ end
+ end
+ if b and b ~= 0 then
+ logwarning("%s: ignoring second kern xoff %s",pref(kind,lookupname),b*factor)
+ end
+ end
+ done = true
+ elseif krn ~= 0 then
+ local k = set_kern(snext,factor,rlmode,krn)
+ if trace_kerns then
+ logprocess("%s: inserting kern %s between %s and %s",pref(kind,lookupname),k,gref(prev.char),gref(nextchar))
+ end
+ done = true
+ end
+ break
+ end
+ end
+ return start, done
+ end
+end
+
+--[[ldx--
+<p>I will implement multiple chain replacements once I run into a font that uses
+it. It's not that complex to handle.</p>
+--ldx]]--
+
+local chainmores = { }
+local chainprocs = { }
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf subchain",...)
+end
+local function logwarning(...)
+ logs.report("otf subchain",...)
+end
+
+-- ['coverage']={
+-- ['after']={ "r" },
+-- ['before']={ "q" },
+-- ['current']={ "a", "b", "c" },
+-- },
+-- ['lookups']={ "ls_l_1", "ls_l_1", "ls_l_1" },
+
+function chainmores.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname,n)
+ logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+
+-- handled later:
+--
+-- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- end
+
+function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+ logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+ logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+
+-- handled later:
+--
+-- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- end
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf chain",...)
+end
+local function logwarning(...)
+ logs.report("otf chain",...)
+end
+
+-- We could share functions but that would lead to extra function calls with many
+-- arguments, redundant tests and confusing messages.
+
+function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname)
+ logwarning("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
+ return start, false
+end
+
+-- The reversesub is a special case, which is why we need to store the replacements
+-- in a bit weird way. There is no lookup and the replacement comes from the lookup
+-- itself. It is meant mostly for dealing with Urdu.
+
+function chainprocs.reversesub(start,stop,kind,chainname,currentcontext,cache,replacements)
+ local char = start.char
+ local replacement = replacements[char]
+ if replacement then
+ if trace_singles then
+ logprocess("%s: single reverse replacement of %s by %s",cref(kind,chainname),gref(char),gref(replacement))
+ end
+ start.char = replacement
+ return start, true
+ else
+ return start, false
+ end
+end
+
+--[[ldx--
+<p>This chain stuff is somewhat tricky since we can have a sequence of actions to be
+applied: single, alternate, multiple or ligature where ligature can be an invalid
+one in the sense that it will replace multiple by one but not neccessary one that
+looks like the combination (i.e. it is the counterpart of multiple then). For
+example, the following is valid:</p>
+
+<typing>
+<line>xxxabcdexxx [single a->A][multiple b->BCD][ligature cde->E] xxxABCDExxx</line>
+</typing>
+
+<p>Therefore we we don't really do the replacement here already unless we have the
+single lookup case. The efficiency of the replacements can be improved by deleting
+as less as needed but that would also mke the code even more messy.</p>
+--ldx]]--
+
+local function delete_till_stop(start,stop,ignoremarks)
+ if start ~= stop then
+ -- todo keep marks
+ local done = false
+ while not done do
+ done = start == stop
+ delete_node(start,start.next)
+ end
+ end
+end
+
+--[[ldx--
+<p>Here we replace start by a single variant, First we delete the rest of the
+match.</p>
+--ldx]]--
+
+function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+ -- todo: marks ?
+ if not chainindex then
+ delete_till_stop(start,stop) -- ,currentlookup.flags[1])
+ end
+ local current = start
+ local subtables = currentlookup.subtables
+ while current do
+ if current.id == glyph then
+ local currentchar = current.char
+ local lookupname = subtables[1]
+ local replacement = cache.gsub_single[lookupname]
+ if not replacement then
+ if trace_bugs then
+ logwarning("%s: no single hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
+ end
+ else
+ replacement = replacement[currentchar]
+ if not replacement then
+ if trace_bugs then
+ logwarning("%s: no single for %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar))
+ end
+ else
+ if trace_singles then
+ logprocess("%s: replacing single %s by %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(currentchar),gref(replacement))
+ end
+ current.char = replacement
+ end
+ end
+ return start, true
+ elseif current == stop then
+ break
+ else
+ current = current.next
+ end
+ end
+ return start, false
+end
+
+chainmores.gsub_single = chainprocs.gsub_single
+
+--[[ldx--
+<p>Here we replace start by a sequence of new glyphs. First we delete the rest of
+the match.</p>
+--ldx]]--
+
+function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ delete_till_stop(start,stop)
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local replacements = cache.gsub_multiple[lookupname]
+ if not replacements then
+ if trace_bugs then
+ logwarning("%s: no multiple hits",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ else
+ replacements = replacements[startchar]
+ if not replacements then
+ if trace_bugs then
+ logwarning("%s: no multiple for %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar))
+ end
+ else
+ if trace_multiples then
+ logprocess("%s: replacing %s by multiple characters %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar),gref(replacements))
+ end
+ local sn = start.next
+ for k=1,#replacements do
+ if k == 1 then
+ start.char = replacements[k]
+ else
+ local n = copy_node(start) -- maybe delete the components and such
+ n.char = replacements[k]
+ n.next, n.prev = sn, start
+ if sn then
+ sn.prev = n
+ end
+ start.next, start = n, n
+ end
+ end
+ return start, true
+ end
+ end
+ return start, false
+end
+
+--[[ldx--
+<p>Here we replace start by new glyph. First we delete the rest of the match.</p>
+--ldx]]--
+
+function chainprocs.gsub_alternate(start,stop,kind,lookupname,currentcontext,cache,currentlookup)
+ -- todo: marks ?
+ delete_till_stop(start,stop)
+ local current = start
+ local subtables = currentlookup.subtables
+ while current do
+ if current.id == glyph then
+ local currentchar = current.char
+ local lookupname = subtables[1]
+ local alternatives = cache.gsub_alternate[lookupname]
+ if not alternatives then
+ if trace_bugs then
+ logwarning("%s: no alternative hits",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ else
+ alternatives = alternatives[currentchar]
+ if not alternatives then
+ if trace_bugs then
+ logwarning("%s: no alternative for %s",cref(kind,chainname,chainlookupname,lookupname),gref(currentchar))
+ end
+ else
+ local choice, index = alternative_glyph(current,alternatives,kind,chainname,chainlookupname,lookupname)
+ current.char = choice
+ if trace_alternatives then
+ logprocess("%s: replacing single %s by alternative %s (%s)",cref(kind,chainname,chainlookupname,lookupname),index,gref(currentchar),gref(choice),index)
+ end
+ end
+ end
+ return start, true
+ elseif current == stop then
+ break
+ else
+ current = current.next
+ end
+ end
+ return start, false
+end
+
+--[[ldx--
+<p>When we replace ligatures we use a helper that handles the marks. I might change
+this function (move code inline and handle the marks by a separate function). We
+assume rather stupid ligatures (no complex disc nodes).</p>
+--ldx]]--
+
+function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local ligatures = cache.gsub_ligature[lookupname]
+ if not ligatures then
+ if trace_bugs then
+ logwarning("%s: no ligature hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
+ end
+ else
+ ligatures = ligatures[startchar]
+ if not ligatures then
+ if trace_bugs then
+ logwarning("%s: no ligatures starting with %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
+ end
+ else
+ local s, discfound, last, nofreplacements = start.next, false, stop, 0
+ while s do
+ local id = s.id
+ if id == disc then
+ s = s.next
+ discfound = true
+ else
+ local schar = s.char
+ if marks[schar] then -- marks
+ s = s.next
+ else
+ local lg = ligatures[1][schar]
+ if not lg then
+ break
+ else
+ ligatures, last, nofreplacements = lg, s, nofreplacements + 1
+ if s == stop then
+ break
+ else
+ s = s.next
+ end
+ end
+ end
+ end
+ end
+ local l2 = ligatures[2]
+ if l2 then
+ if chainindex then
+ stop = last
+ end
+ if trace_ligatures then
+ if start == stop then
+ logprocess("%s: replacing character %s by ligature %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(l2))
+ else
+ logprocess("%s: replacing character %s upto %s by ligature %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2))
+ end
+ end
+ start = toligature(kind,lookup,start,stop,l2,currentlookup.flags[1],discfound)
+ return start, true, nofreplacements
+ elseif trace_bugs then
+ if start == stop then
+ logwarning("%s: replacing character %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar))
+ else
+ logwarning("%s: replacing character %s upto %s by ligature fails",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char))
+ end
+ end
+ end
+ end
+ return start, false, 0
+end
+
+chainmores.gsub_ligature = chainprocs.gsub_ligature
+
+function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local markchar = start.char
+ if marks[markchar] then
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local markanchors = cache.gpos_mark2base[lookupname]
+ if markanchors then
+ markanchors = markanchors[markchar]
+ end
+ if markanchors then
+ local base = start.prev -- [glyph] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if not marks[basechar] then
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",pref(kind,lookupname),gref(markchar))
+ end
+ return start, false
+ end
+ end
+ end
+ local baseanchors = descriptions[basechar].anchors
+ if baseanchors then
+ local baseanchors = baseanchors['basechar']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s, no matching anchors for mark %s and base %s",cref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no char",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local markchar = start.char
+ if marks[markchar] then
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local markanchors = cache.gpos_mark2ligature[lookupname]
+ if markanchors then
+ markanchors = markanchors[markchar]
+ end
+ if markanchors then
+ local base = start.prev -- [glyph] [optional marks] [start=mark]
+ local index = 1
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ local basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ while true do
+ base = base.prev
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ basechar = base.char
+ if marks[basechar] then
+ index = index + 1
+ else
+ break
+ end
+ else
+ if trace_bugs then
+ logwarning("%s: no base for mark %s",cref(kind,chainname,chainlookupname,lookupname),markchar)
+ end
+ return start, false
+ end
+ end
+ end
+ -- todo: like marks a ligatures hash
+ local i = has_attribute(start,markdone)
+ if i then index = i end
+ local baseanchors = descriptions[basechar].anchors
+ if baseanchors then
+ local baseanchors = baseanchors['baselig']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ ba = ba[index]
+ if ba then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and baselig %s",cref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("feature %s, lookup %s: prev node is no char",kind,lookupname)
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
+ end
+ return start, false
+end
+
+function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local markchar = start.char
+ if marks[markchar] then
+--~ local alreadydone = markonce and has_attribute(start,markmark)
+--~ if not alreadydone then
+ -- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local markanchors = cache.gpos_mark2mark[lookupname]
+ if markanchors then
+ markanchors = markanchors[markchar]
+ end
+ if markanchors then
+ local base = start.prev -- [glyph] [basemark] [start=mark]
+ if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ local basechar = base.char
+ local baseanchors = descriptions[basechar].anchors
+ if baseanchors then
+ baseanchors = baseanchors['basemark']
+ if baseanchors then
+ local al = anchorlookups[lookupname]
+ for anchor,ba in next, baseanchors do
+ if al[anchor] then
+ local ma = markanchors[anchor]
+ if ma then
+ local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ if trace_marks then
+ logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
+ cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
+ end
+ return start, true
+ end
+ end
+ end
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and basemark %s",gref(kind,chainname,chainlookupname,lookupname),gref(markchar),gref(basechar))
+ end
+ end
+ end
+ elseif trace_bugs then
+ logwarning("%s: prev node is no mark",cref(kind,chainname,chainlookupname,lookupname))
+ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s has no anchors",cref(kind,chainname,chainlookupname,lookupname),gref(markchar))
+ end
+--~ elseif trace_marks and trace_details then
+--~ logprocess("%s, mark %s is already bound (n=%s), ignoring mark2mark",pref(kind,lookupname),gref(markchar),alreadydone)
+--~ end
+ elseif trace_bugs then
+ logwarning("%s: mark %s is no mark",cref(kind,chainname,chainlookupname),gref(markchar))
+ end
+ return start, false
+end
+
+-- ! ! ! untested ! ! !
+
+function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+ local alreadydone = cursonce and has_attribute(start,cursbase)
+ if not alreadydone then
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local exitanchors = cache.gpos_cursive[lookupname]
+ if exitanchors then
+ exitanchors = exitanchors[startchar]
+ end
+ if exitanchors then
+ local done = false
+ if marks[startchar] then
+ if trace_cursive then
+ logprocess("%s: ignoring cursive for mark %s",pref(kind,lookupname),gref(startchar))
+ end
+ else
+ local nxt = start.next
+ while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ local nextchar = nxt.char
+ if marks[nextchar] then
+ -- should not happen (maybe warning)
+ nxt = nxt.next
+ else
+ local entryanchors = descriptions[nextchar]
+ if entryanchors then
+ entryanchors = entryanchors.anchors
+ if entryanchors then
+ entryanchors = entryanchors['centry']
+ if entryanchors then
+ local al = anchorlookups[lookupname]
+ for anchor, entry in next, entryanchors do
+ if al[anchor] then
+ local exit = exitanchors[anchor]
+ if exit then
+ local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ if trace_cursive then
+ logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
+ end
+ done = true
+ break
+ end
+ end
+ end
+ end
+ end
+ else -- if trace_bugs then
+ -- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
+ fonts.register_message(currentfont,startchar,"no entry anchors")
+ end
+ break
+ end
+ end
+ end
+ return start, done
+ else
+ if trace_cursive and trace_details then
+ logprocess("%s, cursive %s is already done",pref(kind,lookupname),gref(start.char),alreadydone)
+ end
+ return start, false
+ end
+ end
+ return start, false
+end
+
+function chainprocs.gpos_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
+ -- untested
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local kerns = cache.gpos_single[lookupname]
+ if kerns then
+ kerns = kerns[startchar]
+ if kerns then
+ local dx, dy, w, h = set_pair(start,tfmdata.factor,rlmode,sequence.flags[4],kerns,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting single %s by (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),dx,dy,w,h)
+ end
+ end
+ end
+ return start, false
+end
+
+-- when machines become faster i will make a shared function
+
+function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
+-- logwarning("%s: gpos_pair not yet supported",cref(kind,chainname,chainlookupname))
+ local snext = start.next
+ if snext then
+ local startchar = start.char
+ local subtables = currentlookup.subtables
+ local lookupname = subtables[1]
+ local kerns = cache.gpos_pair[lookupname]
+ if kerns then
+ kerns = kerns[startchar]
+ if kerns then
+ local prev, done = start, false
+ local factor = tfmdata.factor
+ while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local nextchar = snext.char
+ local krn = kerns[nextchar]
+ if not krn and marks[nextchar] then
+ prev = snext
+ snext = snext.next
+ else
+ if not krn then
+ -- skip
+ elseif type(krn) == "table" then
+ if krn[1] == "pair" then
+ local a, b = krn[3], krn[4]
+ if a and #a > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(start,factor,rlmode,sequence.flags[4],a,characters[startchar])
+ if trace_kerns then
+ logprocess("%s: shifting first of pair %s and %s by (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ if b and #b > 0 then
+ local startchar = start.char
+ local x, y, w, h = set_pair(snext,factor,rlmode,sequence.flags[4],b,characters[nextchar])
+ if trace_kerns then
+ logprocess("%s: shifting second of pair %s and %s by (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
+ end
+ end
+ else
+ logs.report("%s: check this out (old kern stuff)",cref(kind,chainname,chainlookupname))
+ local a, b = krn[3], krn[7]
+ if a and a ~= 0 then
+ local k = set_kern(snext,factor,rlmode,a)
+ if trace_kerns then
+ logprocess("%s: inserting first kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ end
+ end
+ if b and b ~= 0 then
+ logwarning("%s: ignoring second kern xoff %s",cref(kind,chainname,chainlookupname),b*factor)
+ end
+ end
+ done = true
+ elseif krn ~= 0 then
+ local k = set_kern(snext,factor,rlmode,krn)
+ if trace_kerns then
+ logprocess("%s: inserting kern %s between %s and %s",cref(kind,chainname,chainlookupname),k,gref(prev.char),gref(nextchar))
+ end
+ done = true
+ end
+ break
+ end
+ end
+ return start, done
+ end
+ end
+ end
+ return start, false
+end
+
+-- what pointer to return, spec says stop
+-- to be discussed ... is bidi changer a space?
+-- elseif char == zwnj and sequence[n][32] then -- brrr
+
+-- somehow l or f is global
+-- we don't need to pass the currentcontext, saves a bit
+-- make a slow variant then can be activated but with more tracing
+
+local function show_skip(kind,chainname,char,ck,class)
+ if ck[9] then
+ logwarning("%s: skipping char %s (%s) in rule %s, lookuptype %s (%s=>%s)",cref(kind,chainname),gref(char),class,ck[1],ck[2],ck[9],ck[10])
+ else
+ logwarning("%s: skipping char %s (%s) in rule %s, lookuptype %s",cref(kind,chainname),gref(char),class,ck[1],ck[2])
+ end
+end
+
+local function normal_handle_contextchain(start,kind,chainname,contexts,sequence,cache)
+ -- local rule, lookuptype, sequence, f, l, lookups = ck[1], ck[2] ,ck[3], ck[4], ck[5], ck[6]
+ local flags, done = sequence.flags, false
+ local skipmark, skipligature, skipbase = flags[1], flags[2], flags[3]
+ local someskip = skipmark or skipligature or skipbase -- could be stored in flags for a fast test (hm, flags could be false !)
+ local markclass = sequence.markclass -- todo, first we need a proper test
+ local skipped = false
+ for k=1,#contexts do
+ local match, current, last = true, start, start
+ local ck = contexts[k]
+ local seq = ck[3]
+ local s = #seq
+ -- f..l = mid string
+ if s == 1 then
+ -- never happens
+ match = current.id == glyph and current.subtype<256 and current.font == currentfont and seq[1][current.char]
+ else
+ -- todo: better space check (maybe check for glue)
+ local f, l = ck[4], ck[5]
+ if f == l then
+ -- already a hit
+ match = true
+ else
+ -- no need to test first hit (to be optimized)
+ local n = f + 1
+ last = last.next
+ -- we cannot optimize for n=2 because there can be disc nodes
+ -- if not someskip and n == l then
+ -- -- n=2 and no skips then faster loop
+ -- match = last and last.id == glyph and last.subtype<256 and last.font == currentfont and seq[n][last.char]
+ -- else
+ while n <= l do
+ if last then
+ local id = last.id
+ if id == glyph then
+ if last.subtype<256 and last.font == currentfont then
+ local char = last.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ skipped = true
+ if trace_skips then
+ show_skip(kind,chainname,char,ck,class)
+ end
+ last = last.next
+ elseif seq[n][char] then
+ if n < l then
+ last = last.next
+ end
+ n = n + 1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ elseif id == disc then -- what to do with kerns?
+ last = last.next
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ end
+ -- end
+ end
+ if match and f > 1 then
+ -- before
+ local prev = start.prev
+ if prev then
+ local n = f-1
+ while n >= 1 do
+ if prev then
+ local id = prev.id
+ if id == glyph then
+ if prev.subtype<256 and prev.font == currentfont then -- normal char
+ local char = prev.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ skipped = true
+ if trace_skips then
+ show_skip(kind,chainname,char,ck,class)
+ end
+ elseif seq[n][char] then
+ n = n -1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ elseif id == disc then
+ -- skip 'm
+ elseif seq[n][32] then
+ n = n -1
+ else
+ match = false break
+ end
+ prev = prev.prev
+ elseif seq[n][32] then
+ n = n -1
+ else
+ match = false break
+ end
+ end
+ elseif f == 2 then
+ match = seq[1][32]
+ else
+ for n=f-1,1 do
+ if not seq[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ if match and s > l then
+ -- after
+ local current = last.next
+ if current then
+ -- removed optimization for s-l == 1, we have to deal with marks anyway
+ local n = l + 1
+ while n <= s do
+ if current then
+ local id = current.id
+ if id == glyph then
+ if current.subtype<256 and current.font == currentfont then -- normal char
+ local char = current.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ skipped = true
+ if trace_skips then
+ show_skip(kind,chainname,char,ck,class)
+ end
+ elseif seq[n][char] then
+ n = n + 1
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ elseif id == disc then
+ -- skip 'm
+ elseif seq[n][32] then -- brrr
+ n = n + 1
+ else
+ match = false break
+ end
+ current = current.next
+ elseif seq[n][32] then
+ n = n + 1
+ else
+ match = false break
+ end
+ end
+ elseif s-l == 1 then
+ match = seq[s][32]
+ else
+ for n=l+1,s do
+ if not seq[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ end
+ if match then
+ -- ck == currentcontext
+ if trace_contexts then
+ local rule, lookuptype, f, l = ck[1], ck[2], ck[4], ck[5]
+ local char = start.char
+ if ck[9] then
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s (%s=>%s)",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
+ else
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype)
+ end
+ end
+ local chainlookups = ck[6]
+ if chainlookups then
+ local nofchainlookups = #chainlookups
+ -- we can speed this up if needed
+ if nofchainlookups == 1 then
+ local chainlookupname = chainlookups[1]
+ local chainlookup = lookuptable[chainlookupname]
+ local cp = chainprocs[chainlookup.type]
+ if cp then
+ start, done = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,nil,sequence)
+ else
+ logprocess("%s: %s is not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
+ end
+ else
+ -- actually this needs a more complex treatment for which we will use chainmores
+--~ local i = 1
+--~ repeat
+--~ local chainlookupname = chainlookups[i]
+--~ local chainlookup = lookuptable[chainlookupname]
+--~ local cp = chainmores[chainlookup.type]
+--~ if cp then
+--~ local ok, n
+--~ start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
+--~ -- messy since last can be changed !
+--~ if ok then
+--~ done = true
+--~ start = start.next
+--~ if n then
+--~ -- skip next one(s) if ligature
+--~ i = i + n - 1
+--~ end
+--~ end
+--~ else
+--~ logprocess("%s: multiple subchains for %s are not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
+--~ end
+--~ i = i + 1
+--~ until i > nofchainlookups
+
+ local i = 1
+ repeat
+if skipped then
+ while true do
+ local char = start.char
+ local ccd = descriptions[char]
+ if ccd then
+ local class = ccd.class
+ if class == skipmark or class == skipligature or class == skipbase or (markclass and class == "mark" and not markclass[char]) then
+ start = start.next
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+end
+ local chainlookupname = chainlookups[i]
+ local chainlookup = lookuptable[chainlookupname]
+ local cp = chainmores[chainlookup.type]
+ if cp then
+ local ok, n
+ start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
+ -- messy since last can be changed !
+ if ok then
+ done = true
+ -- skip next one(s) if ligature
+ i = i + (n or 1)
+ else
+ i = i + 1
+ end
+ else
+ logprocess("%s: multiple subchains for %s are not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
+ i = i + 1
+ end
+ start = start.next
+ until i > nofchainlookups
+
+ end
+ else
+ local replacements = ck[7]
+ if replacements then
+ start, done = chainprocs.reversesub(start,last,kind,chainname,ck,cache,replacements) -- sequence
+ else
+ done = true -- can be meant to be skipped
+ if trace_contexts then
+ logprocess("%s: skipping match",cref(kind,chainname))
+ end
+ end
+ end
+ end
+ end
+ return start, done
+end
+
+-- Because we want to keep this elsewhere (an because speed is less an issue) we
+-- pass the font id so that the verbose variant can access the relevant helper tables.
+
+local verbose_handle_contextchain = function(font,...)
+ logwarning("no verbose handler installed, reverting to 'normal'")
+ otf.setcontextchain()
+ return normal_handle_contextchain(...)
+end
+
+otf.chainhandlers = {
+ normal = normal_handle_contextchain,
+ verbose = verbose_handle_contextchain,
+}
+
+function otf.setcontextchain(method)
+ if not method or method == "normal" or not otf.chainhandlers[method] then
+ if handlers.contextchain then -- no need for a message while making the format
+ logwarning("installing normal contextchain handler")
+ end
+ handlers.contextchain = normal_handle_contextchain
+ else
+ logwarning("installing contextchain handler '%s'",method)
+ local handler = otf.chainhandlers[method]
+ handlers.contextchain = function(...)
+ return handler(currentfont,...) -- hm, get rid of ...
+ end
+ end
+ handlers.gsub_context = handlers.contextchain
+ handlers.gsub_contextchain = handlers.contextchain
+ handlers.gsub_reversecontextchain = handlers.contextchain
+ handlers.gpos_contextchain = handlers.contextchain
+ handlers.gpos_context = handlers.contextchain
+end
+
+otf.setcontextchain()
+
+local missing = { } -- we only report once
+
+local function logprocess(...)
+ if trace_steps then
+ registermessage(...)
+ end
+ logs.report("otf process",...)
+end
+local function logwarning(...)
+ logs.report("otf process",...)
+end
+
+local function report_missing_cache(typ,lookup)
+ local f = missing[currentfont] if not f then f = { } missing[currentfont] = f end
+ local t = f[typ] if not t then t = { } f[typ] = t end
+ if not t[lookup] then
+ t[lookup] = true
+ logwarning("missing cache for lookup %s of type %s in font %s (%s)",lookup,typ,currentfont,tfmdata.fullname)
+ end
+end
+
+local resolved = { } -- we only resolve a font,script,language pair once
+
+-- todo: pass all these 'locals' in a table
+
+function fonts.methods.node.otf.features(head,font,attr)
+ if trace_steps then
+ checkstep(head)
+ end
+ tfmdata = fontdata[font]
+ local shared = tfmdata.shared
+ otfdata = shared.otfdata
+ local luatex = otfdata.luatex
+ descriptions = tfmdata.descriptions
+ characters = tfmdata.characters
+ indices = tfmdata.indices
+ unicodes = tfmdata.unicodes
+ marks = tfmdata.marks
+ anchorlookups = luatex.lookup_to_anchor
+ currentfont = font
+ rlmode = 0
+ local featuredata = otfdata.shared.featuredata -- can be made local to closure
+ local sequences = luatex.sequences
+ lookuptable = luatex.lookups
+ local done = false
+ local script, language, s_enabled, a_enabled, dyn
+ local attribute_driven = attr and attr ~= 0
+ if attribute_driven then
+ local features = context_setups[context_numbers[attr]] -- could be a direct list
+ dyn = context_merged[attr] or 0
+ language, script = features.language or "dflt", features.script or "dflt"
+ a_enabled = features -- shared.features -- can be made local to the resolver
+ if dyn == 2 or dyn == -2 then
+ -- font based
+ s_enabled = shared.features
+ end
+ else
+ language, script = tfmdata.language or "dflt", tfmdata.script or "dflt"
+ s_enabled = shared.features -- can be made local to the resolver
+ dyn = 0
+ end
+ -- we can save some runtime by caching feature tests
+ local res = resolved[font] if not res then res = { } resolved[font] = res end
+ local rs = res [script] if not rs then rs = { } res [script] = rs end
+ local rl = rs [language] if not rl then rl = { } rs [language] = rl end
+ local ra = rl [attr] if ra == nil then ra = { } rl [attr] = ra end -- attr can be false
+ -- sequences always > 1 so no need for optimization
+ for s=1,#sequences do
+ local pardir, txtdir = 0, { }
+ local success = false
+ local sequence = sequences[s]
+ local r = ra[s] -- cache
+ if r == nil then
+ --
+ -- this bit will move to font-ctx and become a function
+ ---
+ local chain = sequence.chain or 0
+ local features = sequence.features
+ if not features then
+ -- indirect lookup, part of chain (todo: make this a separate table)
+ r = false -- { false, false, chain }
+ else
+ local valid, attribute, kind, what = false, false
+ for k,v in next, features do
+ -- we can quit earlier but for the moment we want the tracing
+ local s_e = s_enabled and s_enabled[k]
+ local a_e = a_enabled and a_enabled[k]
+ if s_e or a_e then
+ local l = v[script] or v[wildcard]
+ if l then
+ -- not l[language] or l[default] or l[wildcard] because we want tracing
+ -- only first attribute match check, so we assume simple fina's
+ -- default can become a font feature itself
+ if l[language] then
+ valid, what = s_e or a_e, language
+ -- elseif l[default] then
+ -- valid, what = true, default
+ elseif l[wildcard] then
+ valid, what = s_e or a_e, wildcard
+ end
+ if valid then
+ kind, attribute = k, special_attributes[k] or false
+ if a_e and dyn < 0 then
+ valid = false
+ end
+ if trace_applied then
+ local typ, action = match(sequence.type,"(.*)_(.*)")
+ logs.report("otf node mode",
+ "%s font: %03i, dynamic: %03i, kind: %s, lookup: %3i, script: %-4s, language: %-4s (%-4s), type: %s, action: %s, name: %s",
+ (valid and "+") or "-",font,attr or 0,kind,s,script,language,what,typ,action,sequence.name)
+ end
+ break
+ end
+ end
+ end
+ end
+ if valid then
+ r = { valid, attribute, chain, kind }
+ else
+ r = false -- { valid, attribute, chain, "generic" } -- false anyway, could be flag instead of table
+ end
+ end
+ ra[s] = r
+ end
+ featurevalue = r and r[1] -- todo: pass to function instead of using a global
+ if featurevalue then
+ local attribute, chain, typ, subtables = r[2], r[3], sequence.type, sequence.subtables
+ if chain < 0 then
+ -- this is a limited case, no special treatments like 'init' etc
+ local handler = handlers[typ]
+ local thecache = featuredata[typ] or { }
+ -- we need to get rid of this slide !
+ local start = find_node_tail(head) -- slow (we can store tail because there's always a skip at the end): todo
+ while start do
+ local id = start.id
+ if id == glyph then
+ if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) then
+--~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) then
+ for i=1,#subtables do
+ local lookupname = subtables[i]
+ local lookupcache = thecache[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ start, success = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
+ if success then
+ break
+ end
+ end
+ else
+ report_missing_cache(typ,lookupname)
+ end
+ end
+ if start then start = start.prev end
+ else
+ start = start.prev
+ end
+ else
+ start = start.prev
+ end
+ end
+ else
+ local handler = handlers[typ]
+ local ns = #subtables
+ local thecache = featuredata[typ] or { }
+ local start = head -- local ?
+ rlmode = 0 -- to be checked ?
+ if ns == 1 then
+ local lookupname = subtables[1]
+ local lookupcache = thecache[lookupname]
+ if not lookupcache then
+ report_missing_cache(typ,lookupname)
+ else
+ while start do
+ local id = start.id
+ if id == glyph then
+--~ if start.font == font and start.subtype<256 and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
+ if start.font == font and start.subtype<256 and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ -- sequence kan weg
+ local ok
+ start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,1)
+ if ok then
+ success = true
+ end
+ end
+ if start then start = start.next end
+ else
+ start = start.next
+ end
+ -- elseif id == glue then
+ -- if p[5] then -- chain
+ -- local pc = pp[32]
+ -- if pc then
+ -- start, ok = start, false -- p[1](start,kind,p[2],pc,p[3],p[4])
+ -- if ok then
+ -- done = true
+ -- end
+ -- if start then start = start.next end
+ -- else
+ -- start = start.next
+ -- end
+ -- else
+ -- start = start.next
+ -- end
+ elseif id == whatsit then
+ local subtype = start.subtype
+ if subtype == 7 then
+ local dir = start.dir
+ if dir == "+TRT" or dir == "+TLT" then
+ insert(txtdir,dir)
+ elseif dir == "-TRT" or dir == "-TLT" then
+ remove(txtdir)
+ end
+ local d = txtdir[#txtdir]
+ if d == "+TRT" then
+ rlmode = -1
+ elseif d == "+TLT" then
+ rlmode = 1
+ else
+ rlmode = pardir
+ end
+ if trace_directions then
+ logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ elseif subtype == 6 then
+ local dir = start.dir
+ if dir == "TRT" then
+ pardir = -1
+ elseif dir == "TLT" then
+ pardir = 1
+ else
+ pardir = 0
+ end
+ rlmode = pardir
+ --~ txtdir = { }
+ if trace_directions then
+ logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ end
+ start = start.next
+ else
+ start = start.next
+ end
+ end
+ end
+ else
+ while start do
+ local id = start.id
+ if id == glyph then
+ if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
+--~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
+ for i=1,ns do
+ local lookupname = subtables[i]
+ local lookupcache = thecache[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ -- we could move all code inline but that makes things even more unreadable
+ local ok
+ start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
+ if ok then
+ success = true
+ break
+ end
+ end
+ else
+ report_missing_cache(typ,lookupname)
+ end
+ end
+ if start then start = start.next end
+ else
+ start = start.next
+ end
+ -- elseif id == glue then
+ -- if p[5] then -- chain
+ -- local pc = pp[32]
+ -- if pc then
+ -- start, ok = start, false -- p[1](start,kind,p[2],pc,p[3],p[4])
+ -- if ok then
+ -- done = true
+ -- end
+ -- if start then start = start.next end
+ -- else
+ -- start = start.next
+ -- end
+ -- else
+ -- start = start.next
+ -- end
+ elseif id == whatsit then
+ local subtype = start.subtype
+ local subtype = start.subtype
+ if subtype == 7 then
+ local dir = start.dir
+ if dir == "+TRT" or dir == "+TLT" then
+ insert(txtdir,dir)
+ elseif dir == "-TRT" or dir == "-TLT" then
+ remove(txtdir)
+ end
+ local d = txtdir[#txtdir]
+ if d == "+TRT" then
+ rlmode = -1
+ elseif d == "+TLT" then
+ rlmode = 1
+ else
+ rlmode = pardir
+ end
+ if trace_directions then
+ logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ elseif subtype == 6 then
+ local dir = start.dir
+ if dir == "TRT" then
+ pardir = -1
+ elseif dir == "TLT" then
+ pardir = 1
+ else
+ pardir = 0
+ end
+ rlmode = pardir
+ --~ txtdir = { }
+ if trace_directions then
+ logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ end
+ end
+ start = start.next
+ else
+ start = start.next
+ end
+ end
+ end
+ end
+ if success then
+ done = true
+ end
+ if trace_steps then -- ?
+ registerstep(head)
+ end
+ end
+ end
+ return head, done
+end
+
+otf.features.prepare = { }
+
+-- we used to share code in the following functions but that costs a lot of
+-- memory due to extensive calls to functions (easily hundreds of thousands per
+-- document)
+
+local function split(replacement,original,cache,unicodes)
+ -- we can cache this too, but not the same (although unicode is a unique enough hash)
+ local o, t, n = { }, { }, 0
+ for s in gmatch(original,"[^ ]+") do
+ local us = unicodes[s]
+ if type(us) == "number" then -- tonumber(us)
+ o[#o+1] = us
+ else
+ o[#o+1] = us[1]
+ end
+ end
+ for s in gmatch(replacement,"[^ ]+") do
+ n = n + 1
+ local us = unicodes[s]
+ if type(us) == "number" then -- tonumber(us)
+ t[o[n]] = us
+ else
+ t[o[n]] = us[1]
+ end
+ end
+ return t
+end
+
+local function uncover(covers,result,cache,unicodes)
+ -- lpeg hardly faster (.005 sec on mk)
+ for n=1,#covers do
+ local c = covers[n]
+ local cc = cache[c]
+ if not cc then
+ local t = { }
+ for s in gmatch(c,"[^ ]+") do
+ 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
+ else
+ result[#result+1] = cc
+ end
+ end
+end
+
+local function prepare_lookups(tfmdata)
+ local otfdata = tfmdata.shared.otfdata
+ local featuredata = otfdata.shared.featuredata
+ local anchor_to_lookup = otfdata.luatex.anchor_to_lookup
+ local lookup_to_anchor = otfdata.luatex.lookup_to_anchor
+ --
+ local multiple = featuredata.gsub_multiple
+ local alternate = featuredata.gsub_alternate
+ local single = featuredata.gsub_single
+ local ligature = featuredata.gsub_ligature
+ local pair = featuredata.gpos_pair
+ local position = featuredata.gpos_single
+ local kerns = featuredata.gpos_pair
+ local mark = featuredata.gpos_mark2mark
+ local cursive = featuredata.gpos_cursive
+ --
+ local unicodes = tfmdata.unicodes -- names to unicodes
+ local indices = tfmdata.indices
+ local descriptions = tfmdata.descriptions
+ --
+ -- we can change the otf table after loading but then we need to adapt base mode
+ -- as well (no big deal)
+ --
+ local action = {
+ substitution = function(p,lookup,k,glyph,unicode)
+ local old, new = unicode, unicodes[p[2]]
+ if type(new) == "table" then
+ new = new[1]
+ end
+ local s = single[lookup]
+ if not s then s = { } single[lookup] = s end
+ s[old] = new
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new)
+ --~ end
+ end,
+ multiple = function (p,lookup,k,glyph,unicode)
+ local old, new = unicode, { }
+ local m = multiple[lookup]
+ if not m then m = { } multiple[lookup] = m end
+ m[old] = new
+ for pc in gmatch(p[2],"[^ ]+") do
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ new[#new+1] = upc
+ else
+ new[#new+1] = upc[1]
+ end
+ end
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," "))
+ --~ end
+ end,
+ alternate = function(p,lookup,k,glyph,unicode)
+ local old, new = unicode, { }
+ local a = alternate[lookup]
+ if not a then a = { } alternate[lookup] = a end
+ a[old] = new
+ for pc in gmatch(p[2],"[^ ]+") do
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ new[#new+1] = upc
+ else
+ new[#new+1] = upc[1]
+ end
+ end
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|"))
+ --~ end
+ end,
+ ligature = function (p,lookup,k,glyph,unicode)
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name)
+ --~ end
+ local first = true
+ local t = ligature[lookup]
+ if not t then t = { } ligature[lookup] = t end
+ for s in gmatch(p[2],"[^ ]+") do
+ if first then
+ local u = unicodes[s]
+ if not u then
+ logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name)
+ break
+ 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
+ first = false
+ else
+ s = unicodes[s]
+ local t1 = t[1]
+ if not t1[s] then
+ t1[s] = { { } }
+ end
+ t = t1[s]
+ end
+ end
+ t[2] = unicode
+ end,
+ position = function(p,lookup,k,glyph,unicode)
+ -- not used
+ local s = position[lookup]
+ if not s then s = { } position[lookup] = s end
+ s[unicode] = p[2] -- direct pointer to kern spec
+ end,
+ pair = function(p,lookup,k,glyph,unicode)
+ local s = pair[lookup]
+ if not s then s = { } pair[lookup] = s end
+ local others = s[unicode]
+ if not others then others = { } s[unicode] = others end
+ -- todo: fast check for space
+ local two = p[2]
+ local upc = unicodes[two]
+ if not upc then
+ for pc in gmatch(two,"[^ ]+") do
+ local upc = unicodes[pc]
+ if type(upc) == "number" then
+ others[upc] = p -- direct pointer to main table
+ else
+ for i=1,#upc do
+ others[upc[i]] = p -- direct pointer to main table
+ end
+ end
+ end
+ elseif type(upc) == "number" then
+ others[upc] = p -- direct pointer to main table
+ else
+ for i=1,#upc do
+ others[upc[i]] = p -- direct pointer to main table
+ end
+ end
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode)
+ --~ end
+ end,
+ }
+ --
+ for unicode, glyph in next, descriptions do
+ local lookups = glyph.slookups
+ if lookups then
+ for lookup, p in next, lookups do
+ action[p[1]](p,lookup,k,glyph,unicode)
+ end
+ end
+ local lookups = glyph.mlookups
+ if lookups then
+ for lookup, whatever in next, lookups do
+ for i=1,#whatever do -- normaly one
+ local p = whatever[i]
+ action[p[1]](p,lookup,k,glyph,unicode)
+ end
+ end
+ end
+ local list = glyph.mykerns
+ if list then
+ for lookup, krn in next, list do
+ local k = kerns[lookup]
+ if not k then k = { } kerns[lookup] = k end
+ k[unicode] = krn -- ref to glyph, saves lookup
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode)
+ --~ end
+ end
+ end
+ local oanchor = glyph.anchors
+ if oanchor then
+ for typ, anchors in next, oanchor do -- types
+ if typ == "mark" then
+ for name, anchor in next, anchors do
+ local lookups = anchor_to_lookup[name]
+ if lookups then
+ for lookup, _ in next, lookups do
+ local f = mark[lookup]
+ if not f then f = { } mark[lookup] = f end
+ f[unicode] = anchors -- ref to glyph, saves lookup
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode)
+ --~ end
+ end
+ end
+ end
+ elseif typ == "cexit" then -- or entry?
+ for name, anchor in next, anchors do
+ local lookups = anchor_to_lookup[name]
+ if lookups then
+ for lookup, _ in next, lookups do
+ local f = cursive[lookup]
+ if not f then f = { } cursive[lookup] = f end
+ f[unicode] = anchors -- ref to glyph, saves lookup
+ --~ if trace_lookups then
+ --~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode)
+ --~ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+-- local cache = { }
+luatex = luatex or {} -- this has to change ... we need a better one
+
+function prepare_contextchains(tfmdata)
+ local otfdata = tfmdata.shared.otfdata
+ local lookups = otfdata.lookups
+ if lookups then
+ local featuredata = otfdata.shared.featuredata
+ local contextchain = featuredata.gsub_contextchain -- shared with gpos
+ local reversecontextchain = featuredata.gsub_reversecontextchain -- shared with gpos
+ local characters = tfmdata.characters
+ local unicodes = tfmdata.unicodes
+ local indices = tfmdata.indices
+ local cache = luatex.covers
+ if not cache then
+ cache = { }
+ luatex.covers = cache
+ end
+ --
+ for lookupname, lookupdata in next, otfdata.lookups do
+ local lookuptype = lookupdata.type
+ if not lookuptype then
+ logs.report("otf process","missing lookuptype for %s",lookupname)
+ else
+ local rules = lookupdata.rules
+ if rules then
+ local fmt = lookupdata.format
+ -- contextchain[lookupname][unicode]
+ if fmt == "coverage" then
+ if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+ logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
+ else
+ local contexts = contextchain[lookupname]
+ if not contexts then
+ contexts = { }
+ contextchain[lookupname] = contexts
+ end
+ local t = { }
+ for nofrules=1,#rules do -- does #rules>1 happen often?
+ local rule = rules[nofrules]
+ local coverage = rule.coverage
+ if coverage and coverage.current then
+ local current, before, after, sequence = coverage.current, coverage.before, coverage.after, { }
+ if before then
+ uncover(before,sequence,cache,unicodes)
+ end
+ local start = #sequence + 1
+ uncover(current,sequence,cache,unicodes)
+ local stop = #sequence
+ if after then
+ uncover(after,sequence,cache,unicodes)
+ end
+ if sequence[1] then
+ t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif fmt == "reversecoverage" then
+ if lookuptype ~= "reversesub" then
+ logs.report("otf process","unsupported reverse coverage %s for %s",lookuptype,lookupname)
+ else
+ local contexts = reversecontextchain[lookupname]
+ if not contexts then
+ contexts = { }
+ reversecontextchain[lookupname] = contexts
+ end
+ local t = { }
+ for nofrules=1,#rules do
+ local rule = rules[nofrules]
+ local reversecoverage = rule.reversecoverage
+ if reversecoverage and reversecoverage.current then
+ local current, before, after, replacements, sequence = reversecoverage.current, reversecoverage.before, reversecoverage.after, reversecoverage.replacements, { }
+ if before then
+ uncover(before,sequence,cache,unicodes)
+ end
+ local start = #sequence + 1
+ uncover(current,sequence,cache,unicodes)
+ local stop = #sequence
+ if after then
+ uncover(after,sequence,cache,unicodes)
+ end
+ if replacements then
+ replacements = split(replacements,current[1],cache,unicodes)
+ end
+ if sequence[1] then
+ -- this is different from normal coverage, we assume only replacements
+ t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
+ end
+ end
+ end
+ end
+ end
+ end
+ elseif fmt == "glyphs" then
+ if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+ logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
+ else
+ local contexts = contextchain[lookupname]
+ if not contexts then
+ contexts = { }
+ contextchain[lookupname] = contexts
+ end
+ local t = { }
+ for nofrules=1,#rules do
+ -- nearly the same as coverage so we could as well rename it
+ local rule = rules[nofrules]
+ local glyphs = rule.glyphs
+ if glyphs and glyphs.names then
+ local fore, back, names, sequence = glyphs.fore, glyphs.back, glyphs.names, { }
+ if fore and fore ~= "" then
+ fore = lpegmatch(split_at_space,fore)
+ uncover(fore,sequence,cache,unicodes)
+ end
+ local start = #sequence + 1
+ names = lpegmatch(split_at_space,names)
+ uncover(names,sequence,cache,unicodes)
+ local stop = #sequence
+ if back and back ~= "" then
+ back = lpegmatch(split_at_space,back)
+ uncover(back,sequence,cache,unicodes)
+ end
+ if sequence[1] then
+ t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function fonts.initializers.node.otf.features(tfmdata,value)
+ if true then -- value then
+ if not tfmdata.shared.otfdata.shared.initialized then
+ local t = trace_preparing and os.clock()
+ local otfdata = tfmdata.shared.otfdata
+ local featuredata = otfdata.shared.featuredata
+ -- caches
+ featuredata.gsub_multiple = { }
+ featuredata.gsub_alternate = { }
+ featuredata.gsub_single = { }
+ featuredata.gsub_ligature = { }
+ featuredata.gsub_contextchain = { }
+ featuredata.gsub_reversecontextchain = { }
+ featuredata.gpos_pair = { }
+ featuredata.gpos_single = { }
+ featuredata.gpos_mark2base = { }
+ featuredata.gpos_mark2ligature = featuredata.gpos_mark2base
+ featuredata.gpos_mark2mark = featuredata.gpos_mark2base
+ featuredata.gpos_cursive = { }
+ featuredata.gpos_contextchain = featuredata.gsub_contextchain
+ featuredata.gpos_reversecontextchain = featuredata.gsub_reversecontextchain
+ --
+ prepare_contextchains(tfmdata)
+ prepare_lookups(tfmdata)
+ otfdata.shared.initialized = true
+ if trace_preparing then
+ logs.report("otf process","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ end
+ end
+ end
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-ota'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (analysing)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this might become scrp-*.lua
+
+local type, tostring, match, format, concat = type, tostring, string.match, string.format, table.concat
+
+if not trackers then trackers = { register = function() end } end
+
+local trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
+local trace_cjk = false trackers.register("cjk.injections", function(v) trace_cjk = v end)
+
+trackers.register("cjk.analyzing","otf.analyzing")
+
+fonts = fonts or { }
+fonts.analyzers = fonts.analyzers or { }
+fonts.analyzers.initializers = fonts.analyzers.initializers or { node = { otf = { } } }
+fonts.analyzers.methods = fonts.analyzers.methods or { node = { otf = { } } }
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+local initializers = fonts.analyzers.initializers
+local methods = fonts.analyzers.methods
+
+local glyph = node.id('glyph')
+local glue = node.id('glue')
+local penalty = node.id('penalty')
+
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local traverse_node_list = node.traverse
+
+local fontdata = fonts.ids
+local state = attributes.private('state')
+
+local fcs = (fonts.color and fonts.color.set) or function() end
+local fcr = (fonts.color and fonts.color.reset) or function() end
+
+local a_to_script = otf.a_to_script
+local a_to_language = otf.a_to_language
+
+-- in the future we will use language/script attributes instead of the
+-- font related value, but then we also need dynamic features which is
+-- somewhat slower; and .. we need a chain of them
+
+function fonts.initializers.node.otf.analyze(tfmdata,value,attr)
+ if attr and attr > 0 then
+ script, language = a_to_script[attr], a_to_language[attr]
+ else
+ script, language = tfmdata.script, tfmdata.language
+ end
+ local action = initializers[script]
+ if action then
+ if type(action) == "function" then
+ return action(tfmdata,value)
+ else
+ local action = action[language]
+ if action then
+ return action(tfmdata,value)
+ end
+ end
+ end
+ return nil
+end
+
+function fonts.methods.node.otf.analyze(head,font,attr)
+ local tfmdata = fontdata[font]
+ local script, language
+ if attr and attr > 0 then
+ script, language = a_to_script[attr], a_to_language[attr]
+ else
+ script, language = tfmdata.script, tfmdata.language
+ end
+ local action = methods[script]
+ if action then
+ if type(action) == "function" then
+ return action(head,font,attr)
+ else
+ action = action[language]
+ if action then
+ return action(head,font,attr)
+ end
+ end
+ end
+ return head, false
+end
+
+otf.features.register("analyze",true) -- we always analyze
+table.insert(fonts.triggers,"analyze") -- we need a proper function for doing this
+
+-- latin
+
+fonts.analyzers.methods.latn = fonts.analyzers.aux.setstate
+
+-- this info eventually will go into char-def
+
+local zwnj = 0x200C
+local zwj = 0x200D
+
+local isol = {
+ [0x0600] = true, [0x0601] = true, [0x0602] = true, [0x0603] = true,
+ [0x0608] = true, [0x060B] = true, [0x0621] = true, [0x0674] = true,
+ [0x06DD] = true, [zwnj] = true,
+}
+
+local isol_fina = {
+ [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true,
+ [0x0627] = true, [0x0629] = true, [0x062F] = true, [0x0630] = true,
+ [0x0631] = true, [0x0632] = true, [0x0648] = true, [0x0671] = true,
+ [0x0672] = true, [0x0673] = true, [0x0675] = true, [0x0676] = true,
+ [0x0677] = true, [0x0688] = true, [0x0689] = true, [0x068A] = true,
+ [0x068B] = true, [0x068C] = true, [0x068D] = true, [0x068E] = true,
+ [0x068F] = true, [0x0690] = true, [0x0691] = true, [0x0692] = true,
+ [0x0693] = true, [0x0694] = true, [0x0695] = true, [0x0696] = true,
+ [0x0697] = true, [0x0698] = true, [0x0699] = true, [0x06C0] = true,
+ [0x06C3] = true, [0x06C4] = true, [0x06C5] = true, [0x06C6] = true,
+ [0x06C7] = true, [0x06C8] = true, [0x06C9] = true, [0x06CA] = true,
+ [0x06CB] = true, [0x06CD] = true, [0x06CF] = true, [0x06D2] = true,
+ [0x06D3] = true, [0x06D5] = true, [0x06EE] = true, [0x06EF] = true,
+ [0x0759] = true, [0x075A] = true, [0x075B] = true, [0x076B] = true,
+ [0x076C] = true, [0x0771] = true, [0x0773] = true, [0x0774] = true,
+ [0x0778] = true, [0x0779] = true, [0xFEF5] = true, [0xFEF7] = true,
+ [0xFEF9] = true, [0xFEFB] = true,
+}
+
+local isol_fina_medi_init = {
+ [0x0626] = true, [0x0628] = true, [0x062A] = true, [0x062B] = true,
+ [0x062C] = true, [0x062D] = true, [0x062E] = true, [0x0633] = true,
+ [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true,
+ [0x0638] = true, [0x0639] = true, [0x063A] = true, [0x063B] = true,
+ [0x063C] = true, [0x063D] = true, [0x063E] = true, [0x063F] = true,
+ [0x0640] = true, [0x0641] = true, [0x0642] = true, [0x0643] = true,
+ [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true,
+ [0x0649] = true, [0x064A] = true, [0x066E] = true, [0x066F] = true,
+ [0x0678] = true, [0x0679] = true, [0x067A] = true, [0x067B] = true,
+ [0x067C] = true, [0x067D] = true, [0x067E] = true, [0x067F] = true,
+ [0x0680] = true, [0x0681] = true, [0x0682] = true, [0x0683] = true,
+ [0x0684] = true, [0x0685] = true, [0x0686] = true, [0x0687] = true,
+ [0x069A] = true, [0x069B] = true, [0x069C] = true, [0x069D] = true,
+ [0x069E] = true, [0x069F] = true, [0x06A0] = true, [0x06A1] = true,
+ [0x06A2] = true, [0x06A3] = true, [0x06A4] = true, [0x06A5] = true,
+ [0x06A6] = true, [0x06A7] = true, [0x06A8] = true, [0x06A9] = true,
+ [0x06AA] = true, [0x06AB] = true, [0x06AC] = true, [0x06AD] = true,
+ [0x06AE] = true, [0x06AF] = true, [0x06B0] = true, [0x06B1] = true,
+ [0x06B2] = true, [0x06B3] = true, [0x06B4] = true, [0x06B5] = true,
+ [0x06B6] = true, [0x06B7] = true, [0x06B8] = true, [0x06B9] = true,
+ [0x06BA] = true, [0x06BB] = true, [0x06BC] = true, [0x06BD] = true,
+ [0x06BE] = true, [0x06BF] = true, [0x06C1] = true, [0x06C2] = true,
+ [0x06CC] = true, [0x06CE] = true, [0x06D0] = true, [0x06D1] = true,
+ [0x06FA] = true, [0x06FB] = true, [0x06FC] = true, [0x06FF] = true,
+ [0x0750] = true, [0x0751] = true, [0x0752] = true, [0x0753] = true,
+ [0x0754] = true, [0x0755] = true, [0x0756] = true, [0x0757] = true,
+ [0x0758] = true, [0x075C] = true, [0x075D] = true, [0x075E] = true,
+ [0x075F] = true, [0x0760] = true, [0x0761] = true, [0x0762] = true,
+ [0x0763] = true, [0x0764] = true, [0x0765] = true, [0x0766] = true,
+ [0x0767] = true, [0x0768] = true, [0x0769] = true, [0x076A] = true,
+ [0x076D] = true, [0x076E] = true, [0x076F] = true, [0x0770] = true,
+ [0x0772] = true, [0x0775] = true, [0x0776] = true, [0x0777] = true,
+ [0x077A] = true, [0x077B] = true, [0x077C] = true, [0x077D] = true,
+ [0x077E] = true, [0x077F] = true, [zwj] = true,
+}
+
+local arab_warned = { }
+
+-- todo: gref
+
+local function warning(current,what)
+ local char = current.char
+ if not arab_warned[char] then
+ log.report("analyze","arab: character %s (U+%04X) has no %s class", char, char, what)
+ arab_warned[char] = true
+ end
+end
+
+function fonts.analyzers.methods.nocolor(head,font,attr)
+ for n in traverse_node_list(head,glyph) do
+ if not font or n.font == font then
+ fcr(n)
+ end
+ end
+ return head, true
+end
+
+local function finish(first,last)
+ if last then
+ if first == last then
+ local fc = first.char
+ if isol_fina_medi_init[fc] or isol_fina[fc] then
+ set_attribute(first,state,4) -- isol
+ if trace_analyzing then fcs(first,"font:isol") end
+ else
+ warning(first,"isol")
+ set_attribute(first,state,0) -- error
+ if trace_analyzing then fcr(first) end
+ end
+ else
+ local lc = last.char
+ if isol_fina_medi_init[lc] or isol_fina[lc] then -- why isol here ?
+ -- if laststate == 1 or laststate == 2 or laststate == 4 then
+ set_attribute(last,state,3) -- fina
+ if trace_analyzing then fcs(last,"font:fina") end
+ else
+ warning(last,"fina")
+ set_attribute(last,state,0) -- error
+ if trace_analyzing then fcr(last) end
+ end
+ end
+ first, last = nil, nil
+ elseif first then
+ -- first and last are either both set so we never com here
+ local fc = first.char
+ if isol_fina_medi_init[fc] or isol_fina[fc] then
+ set_attribute(first,state,4) -- isol
+ if trace_analyzing then fcs(first,"font:isol") end
+ else
+ warning(first,"isol")
+ set_attribute(first,state,0) -- error
+ if trace_analyzing then fcr(first) end
+ end
+ first = nil
+ end
+ return first, last
+end
+
+function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special version with no trace
+ local tfmdata = fontdata[font]
+ local marks = tfmdata.marks
+ local first, last, current, done = nil, nil, head, false
+ while current do
+ if current.id == glyph and current.subtype<256 and current.font == font and not has_attribute(current,state) then
+ done = true
+ local char = current.char
+ if marks[char] then
+ set_attribute(current,state,5) -- mark
+ if trace_analyzing then fcs(current,"font:mark") end
+ elseif isol[char] then -- can be zwj or zwnj too
+ first, last = finish(first,last)
+ set_attribute(current,state,4) -- isol
+ if trace_analyzing then fcs(current,"font:isol") end
+ first, last = nil, nil
+ elseif not first then
+ if isol_fina_medi_init[char] then
+ set_attribute(current,state,1) -- init
+ if trace_analyzing then fcs(current,"font:init") end
+ first, last = first or current, current
+ elseif isol_fina[char] then
+ set_attribute(current,state,4) -- isol
+ if trace_analyzing then fcs(current,"font:isol") end
+ first, last = nil, nil
+ else -- no arab
+ first, last = finish(first,last)
+ end
+ elseif isol_fina_medi_init[char] then
+ first, last = first or current, current
+ set_attribute(current,state,2) -- medi
+ if trace_analyzing then fcs(current,"font:medi") end
+ elseif isol_fina[char] then
+ if not has_attribute(last,state,1) then
+ -- tricky, we need to check what last may be !
+ set_attribute(last,state,2) -- medi
+ if trace_analyzing then fcs(last,"font:medi") end
+ end
+ set_attribute(current,state,3) -- fina
+ if trace_analyzing then fcs(current,"font:fina") end
+ first, last = nil, nil
+ elseif char >= 0x0600 and char <= 0x06FF then
+ if trace_analyzing then fcs(current,"font:rest") end
+ first, last = finish(first,last)
+ else --no
+ first, last = finish(first,last)
+ end
+ else
+ first, last = finish(first,last)
+ end
+ current = current.next
+ end
+ first, last = finish(first,last)
+ return head, done
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-otc'] = {
+ version = 1.001,
+ comment = "companion to font-otf.lua (context)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, insert = string.format, table.insert
+local type, next = type, next
+
+-- we assume that the other otf stuff is loaded already
+
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+
+local otf = fonts.otf
+local tfm = fonts.tfm
+
+-- instead of "script = "DFLT", langs = { 'dflt' }" we now use wildcards (we used to
+-- have always); some day we can write a "force always when true" trick for other
+-- features as well
+--
+-- we could have a tnum variant as well
+
+local extra_lists = {
+ tlig = {
+ {
+ endash = "hyphen hyphen",
+ emdash = "hyphen hyphen hyphen",
+ -- quotedblleft = "quoteleft quoteleft",
+ -- quotedblright = "quoteright quoteright",
+ -- quotedblleft = "grave grave",
+ -- quotedblright = "quotesingle quotesingle",
+ -- quotedblbase = "comma comma",
+ },
+ },
+ trep = {
+ {
+ -- [0x0022] = 0x201D,
+ [0x0027] = 0x2019,
+ -- [0x0060] = 0x2018,
+ },
+ },
+ anum = {
+ { -- arabic
+ [0x0030] = 0x0660,
+ [0x0031] = 0x0661,
+ [0x0032] = 0x0662,
+ [0x0033] = 0x0663,
+ [0x0034] = 0x0664,
+ [0x0035] = 0x0665,
+ [0x0036] = 0x0666,
+ [0x0037] = 0x0667,
+ [0x0038] = 0x0668,
+ [0x0039] = 0x0669,
+ },
+ { -- persian
+ [0x0030] = 0x06F0,
+ [0x0031] = 0x06F1,
+ [0x0032] = 0x06F2,
+ [0x0033] = 0x06F3,
+ [0x0034] = 0x06F4,
+ [0x0035] = 0x06F5,
+ [0x0036] = 0x06F6,
+ [0x0037] = 0x06F7,
+ [0x0038] = 0x06F8,
+ [0x0039] = 0x06F9,
+ },
+ },
+}
+
+local extra_features = { -- maybe just 1..n so that we prescribe order
+ tlig = {
+ {
+ features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "tlig", comment = "added bij mkiv" }, },
+ name = "ctx_tlig_1",
+ subtables = { { name = "ctx_tlig_1_s" } },
+ type = "gsub_ligature",
+ flags = { },
+ },
+ },
+ trep = {
+ {
+ features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "trep", comment = "added bij mkiv" }, },
+ name = "ctx_trep_1",
+ subtables = { { name = "ctx_trep_1_s" } },
+ type = "gsub_single",
+ flags = { },
+ },
+ },
+ anum = {
+ {
+ features = { { scripts = { { script = "arab", langs = { "dflt", "FAR" }, } }, tag = "anum", comment = "added bij mkiv" }, },
+ name = "ctx_anum_1",
+ subtables = { { name = "ctx_anum_1_s" } },
+ type = "gsub_single",
+ flags = { },
+ },
+ {
+ features = { { scripts = { { script = "arab", langs = { "URD" }, } }, tag = "anum", comment = "added bij mkiv" }, },
+ name = "ctx_anum_2",
+ subtables = { { name = "ctx_anum_2_s" } },
+ type = "gsub_single",
+ flags = { },
+ },
+ },
+}
+
+fonts.otf.enhancers["add some missing characters"] = function(data,filename)
+ -- todo
+end
+
+fonts.otf.enhancers["enrich with features"] = function(data,filename)
+ -- could be done elsewhere (true can be #)
+ local used = { }
+ for i=1,#otf.glists do
+ local g = data[otf.glists[i]]
+ if g then
+ for i=1,#g do
+ local f = g[i].features
+ if f then
+ for i=1,#f do
+ local t = f[i].tag
+ if t then used[t] = true end
+ end
+ end
+ end
+ end
+ end
+ --
+ local glyphs = data.glyphs
+ local indices = data.map.map
+ data.gsub = data.gsub or { }
+ for kind, specifications in next, extra_features do
+ if not used[kind] then
+ local done = 0
+ for s=1,#specifications do
+ local added = false
+ local specification = specifications[s]
+ local list = extra_lists[kind][s]
+ local name = specification.name .. "_s"
+ if specification.type == "gsub_ligature" then
+ for unicode, index in next, indices do
+ local glyph = glyphs[index]
+ local ligature = list[glyph.name]
+ if ligature then
+ local o = glyph.lookups or { }
+ -- o[name] = { "ligature", ligature, glyph.name }
+ o[name] = {
+ {
+ ["type"] = "ligature",
+ ["specification"] = {
+ char = glyph.name,
+ components = ligature,
+ }
+ }
+ }
+ glyph.lookups, done, added = o, done+1, true
+ end
+ end
+ elseif specification.type == "gsub_single" then
+ for unicode, index in next, indices do
+ local glyph = glyphs[index]
+ local r = list[unicode]
+ if r then
+ local replacement = indices[r]
+ if replacement and glyphs[replacement] then
+ local o = glyph.lookups or { }
+ -- o[name] = { { "substitution", glyphs[replacement].name } }
+ o[name] = {
+ {
+ ["type"] = "substitution",
+ ["specification"] = {
+ variant = glyphs[replacement].name,
+ }
+ }
+ }
+ glyph.lookups, done, added = o, done+1, true
+ end
+ end
+ end
+ end
+ if added then
+ insert(data.gsub,s,table.fastcopy(specification)) -- right order
+ end
+ end
+ if done > 0 then
+ if trace_loading then
+ logs.report("load otf","enhance: registering %s feature (%s glyphs affected)",kind,done)
+ end
+ end
+ end
+ end
+end
+
+otf.tables.features['tlig'] = 'TeX Ligatures'
+otf.tables.features['trep'] = 'TeX Replacements'
+otf.tables.features['anum'] = 'Arabic Digits'
+
+otf.features.register_base_substitution('tlig')
+otf.features.register_base_substitution('trep')
+otf.features.register_base_substitution('anum')
+
+-- the functionality is defined elsewhere
+
+fonts.initializers.base.otf.equaldigits = fonts.initializers.common.equaldigits
+fonts.initializers.node.otf.equaldigits = fonts.initializers.common.equaldigits
+
+fonts.initializers.base.otf.lineheight = fonts.initializers.common.lineheight
+fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight
+
+fonts.initializers.base.otf.compose = fonts.initializers.common.compose
+fonts.initializers.node.otf.compose = fonts.initializers.common.compose
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-def'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
+local tostring, next = tostring, next
+local lpegmatch = lpeg.match
+
+local trace_defining = false trackers .register("fonts.defining", function(v) trace_defining = v end)
+local directive_embedall = false directives.register("fonts.embedall", function(v) directive_embedall = v end)
+
+trackers.register("fonts.loading", "fonts.defining", "otf.loading", "afm.loading", "tfm.loading")
+trackers.register("fonts.all", "fonts.*", "otf.*", "afm.*", "tfm.*")
+
+--[[ldx--
+<p>Here we deal with defining fonts. We do so by intercepting the
+default loader that only handles <l n='tfm'/>.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.define = fonts.define or { }
+fonts.tfm = fonts.tfm or { }
+fonts.ids = fonts.ids or { }
+fonts.vf = fonts.vf or { }
+fonts.used = fonts.used or { }
+
+local tfm = fonts.tfm
+local vf = fonts.vf
+local define = fonts.define
+
+tfm.version = 1.01
+tfm.cache = containers.define("fonts", "tfm", tfm.version, false) -- better in font-tfm
+
+define.method = "afm or tfm" -- afm, tfm, afm or tfm, tfm or afm
+define.specify = fonts.define.specify or { }
+define.methods = fonts.define.methods or { }
+
+tfm.fonts = tfm.fonts or { }
+tfm.readers = tfm.readers or { }
+tfm.internalized = tfm.internalized or { } -- internal tex numbers
+
+tfm.readers.sequence = { 'otf', 'ttf', 'afm', 'tfm' }
+
+tfm.auto_afm = true
+
+local readers = tfm.readers
+local sequence = readers.sequence
+
+--[[ldx--
+<p>We hardly gain anything when we cache the final (pre scaled)
+<l n='tfm'/> table. But it can be handy for debugging.</p>
+--ldx]]--
+
+fonts.version = 1.05
+fonts.cache = containers.define("fonts", "def", fonts.version, false)
+
+--[[ldx--
+<p>We can prefix a font specification by <type>name:</type> or
+<type>file:</type>. The first case will result in a lookup in the
+synonym table.</p>
+
+<typing>
+[ name: | file: ] identifier [ separator [ specification ] ]
+</typing>
+
+<p>The following function split the font specification into components
+and prepares a table that will move along as we proceed.</p>
+--ldx]]--
+
+-- 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, ""
+
+local P, C, S, Cc = lpeg.P, lpeg.C, lpeg.S, lpeg.Cc
+
+local left = P("(")
+local right = P(")")
+local colon = P(":")
+local space = P(" ")
+
+define.defaultlookup = "file"
+
+local prefixpattern = P(false)
+
+function define.add_specifier(symbol)
+ specifiers = specifiers .. symbol
+ local method = S(specifiers)
+ local lookup = C(prefixpattern) * colon
+ local sub = left * C(P(1-left-right-method)^1) * right
+ local specification = C(method) * C(P(1)^1)
+ local name = C((1-sub-specification)^1)
+ splitter = P((lookup + Cc("")) * name * (sub + Cc("")) * (specification + Cc("")))
+end
+
+function define.add_lookup(str,default)
+ prefixpattern = prefixpattern + P(str)
+end
+
+define.add_lookup("file")
+define.add_lookup("name")
+define.add_lookup("spec")
+
+function define.get_specification(str)
+ return lpegmatch(splitter,str)
+end
+
+function define.register_split(symbol,action)
+ define.add_specifier(symbol)
+ define.specify[symbol] = action
+end
+
+function define.makespecification(specification, lookup, name, sub, method, detail, size)
+ size = size or 655360
+ if trace_defining 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
+--~ if specification.lookup then
+--~ lookup = specification.lookup -- can come from xetex [] syntax
+--~ specification.lookup = nil
+--~ end
+ if not lookup or lookup == "" then
+ lookup = define.defaultlookup
+ end
+ local t = {
+ lookup = lookup, -- forced type
+ specification = specification, -- full specification
+ size = size, -- size in scaled points or -1000*n
+ name = name, -- font or filename
+ sub = sub, -- subfont (eg in ttc)
+ method = method, -- specification method
+ detail = detail, -- specification
+ resolved = "", -- resolved font name
+ forced = "", -- forced loader
+ features = { }, -- preprocessed features
+ }
+ return t
+end
+
+function define.analyze(specification, size)
+ -- can be optimized with locals
+ local lookup, name, sub, method, detail = define.get_specification(specification or "")
+ return define.makespecification(specification, lookup, name, sub, method, detail, size)
+end
+
+--[[ldx--
+<p>A unique hash value is generated by:</p>
+--ldx]]--
+
+local sortedhashkeys = table.sortedhashkeys
+
+function tfm.hash_features(specification)
+ local features = specification.features
+ if features then
+ local t = { }
+ local normal = features.normal
+ if normal and next(normal) then
+ local f = sortedhashkeys(normal)
+ for i=1,#f do
+ local v = f[i]
+ if v ~= "number" and v ~= "features" then -- i need to figure this out, features
+ t[#t+1] = v .. '=' .. tostring(normal[v])
+ end
+ end
+ end
+ local vtf = features.vtf
+ if vtf and next(vtf) then
+ local f = sortedhashkeys(vtf)
+ for i=1,#f do
+ local v = f[i]
+ t[#t+1] = v .. '=' .. tostring(vtf[v])
+ end
+ end
+--~ if specification.mathsize then
+--~ t[#t+1] = "mathsize=" .. specification.mathsize
+--~ end
+ if #t > 0 then
+ return concat(t,"+")
+ end
+ end
+ return "unknown"
+end
+
+fonts.designsizes = { }
+
+--[[ldx--
+<p>In principle we can share tfm tables when we are in node for a font, but then
+we need to define a font switch as an id/attr switch which is no fun, so in that
+case users can best use dynamic features ... so, we will not use that speedup. Okay,
+when we get rid of base mode we can optimize even further by sharing, but then we
+loose our testcases for <l n='luatex'/>.</p>
+--ldx]]--
+
+function tfm.hash_instance(specification,force)
+ 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 = math.round(tfm.scaled(size, fonts.designsizes[hash]))
+ specification.size = size
+ end
+--~ local mathsize = specification.mathsize or 0
+--~ if mathsize > 0 then
+--~ local textsize = specification.textsize
+--~ if fallbacks then
+--~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks
+--~ else
+--~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]'
+--~ end
+--~ else
+ if fallbacks then
+ return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks
+ else
+ return hash .. ' @ ' .. tostring(size)
+ end
+--~ end
+end
+
+--[[ldx--
+<p>We can resolve the filename using the next function:</p>
+--ldx]]--
+
+define.resolvers = resolvers
+
+function define.resolvers.file(specification)
+ specification.forced = file.extname(specification.name)
+ specification.name = file.removesuffix(specification.name)
+end
+
+function define.resolvers.name(specification)
+ local resolve = fonts.names.resolve
+ if resolve 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
+ else
+ define.resolvers.file(specification)
+ end
+end
+
+function define.resolvers.spec(specification)
+ local resolvespec = fonts.names.resolvespec
+ if resolvespec then
+ specification.resolved, specification.sub = fonts.names.resolvespec(specification.name,specification.sub)
+ if specification.resolved then
+ specification.forced = file.extname(specification.resolved)
+ specification.name = file.removesuffix(specification.resolved)
+ end
+ else
+ define.resolvers.name(specification)
+ end
+end
+
+function define.resolve(specification)
+ if not specification.resolved or specification.resolved == "" then -- resolved itself not per se in mapping hash
+ local r = define.resolvers[specification.lookup]
+ if r then
+ r(specification)
+ end
+ end
+ if specification.forced == "" then
+ specification.forced = nil
+ else
+ specification.forced = specification.forced
+ end
+ specification.hash = lower(specification.name .. ' @ ' .. tfm.hash_features(specification))
+ if specification.sub and specification.sub ~= "" then
+ specification.hash = specification.sub .. ' @ ' .. specification.hash
+ end
+ return specification
+end
+
+--[[ldx--
+<p>The main read function either uses a forced reader (as determined by
+a lookup) or tries to resolve the name using the list of readers.</p>
+
+<p>We need to cache when possible. We do cache raw tfm data (from <l
+n='tfm'/>, <l n='afm'/> or <l n='otf'/>). After that we can cache based
+on specificstion (name) and size, that is, <l n='tex'/> only needs a number
+for an already loaded fonts. However, it may make sense to cache fonts
+before they're scaled as well (store <l n='tfm'/>'s with applied methods
+and features). However, there may be a relation between the size and
+features (esp in virtual fonts) so let's not do that now.</p>
+
+<p>Watch out, here we do load a font, but we don't prepare the
+specification yet.</p>
+--ldx]]--
+
+function tfm.read(specification)
+ local hash = tfm.hash_instance(specification)
+ local tfmtable = tfm.fonts[hash] -- hashes by size !
+ if not tfmtable then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ tfmtable = readers[lower(forced)](specification)
+ if not tfmtable then
+ logs.report("define font","forced type %s of %s not found",forced,specification.name)
+ end
+ else
+ for s=1,#sequence do -- reader sequence
+ local reader = sequence[s]
+ if readers[reader] then -- not really needed
+ if trace_defining then
+ logs.report("define font","trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown")
+ end
+ tfmtable = readers[reader](specification)
+ if tfmtable then
+ break
+ else
+ specification.filename = nil
+ end
+ end
+ end
+ end
+ if tfmtable then
+ if directive_embedall then
+ tfmtable.embedding = "full"
+ elseif tfmtable.filename and fonts.dontembed[tfmtable.filename] then
+ tfmtable.embedding = "no"
+ else
+ tfmtable.embedding = "subset"
+ end
+ tfm.fonts[hash] = tfmtable
+ fonts.designsizes[specification.hash] = tfmtable.designsize -- we only know this for sure after loading once
+ --~ tfmtable.mode = specification.features.normal.mode or "base"
+ end
+ end
+ if not tfmtable then
+ logs.report("define font","font with name %s is not found",specification.name)
+ end
+ return tfmtable
+end
+
+--[[ldx--
+<p>For virtual fonts we need a slightly different approach:</p>
+--ldx]]--
+
+function tfm.read_and_define(name,size) -- no id
+ local specification = define.analyze(name,size)
+ local method = specification.method
+ if method and define.specify[method] then
+ specification = define.specify[method](specification)
+ end
+ specification = define.resolve(specification)
+ local hash = tfm.hash_instance(specification)
+ local id = define.registered(hash)
+ if not id then
+ local fontdata = tfm.read(specification)
+ if fontdata then
+ fontdata.hash = hash
+ id = font.define(fontdata)
+ define.register(fontdata,id)
+ tfm.cleanup_table(fontdata)
+ else
+ id = 0 -- signal
+ end
+ end
+ return fonts.ids[id], id
+end
+
+--[[ldx--
+<p>Next follow the readers. This code was written while <l n='luatex'/>
+evolved. Each one has its own way of dealing with its format.</p>
+--ldx]]--
+
+local function check_tfm(specification,fullname)
+ -- ofm directive blocks local path search unless set; btw, in context we
+ -- don't support ofm files anyway as this format is obsolete
+ local foundname = resolvers.findbinfile(fullname, 'tfm') or "" -- just to be sure
+ if foundname == "" then
+ foundname = resolvers.findbinfile(fullname, 'ofm') or "" -- bonus for usage outside context
+ end
+ if foundname ~= "" then
+ specification.filename, specification.format = foundname, "ofm"
+ return tfm.read_from_tfm(specification)
+ end
+end
+
+local function check_afm(specification,fullname)
+ local foundname = resolvers.findbinfile(fullname, 'afm') or "" -- just to be sure
+ if foundname == "" and tfm.auto_afm then
+ local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.*
+ if encoding and shortname and fonts.enc.known[encoding] then
+ shortname = resolvers.findbinfile(shortname,'afm') or "" -- just to be sure
+ if shortname ~= "" then
+ foundname = shortname
+ -- tfm.set_normal_feature(specification,'encoding',encoding) -- will go away
+ if trace_loading then
+ logs.report("load afm","stripping encoding prefix from filename %s",afmname)
+ end
+ end
+ end
+ end
+ if foundname ~= "" then
+ specification.filename, specification.format = foundname, "afm"
+ return tfm.read_from_afm(specification)
+ end
+end
+
+function readers.tfm(specification)
+ local fullname, tfmtable = specification.filename or "", nil
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ tfmtable = check_tfm(specification,specification.name .. "." .. forced)
+ end
+ if not tfmtable then
+ tfmtable = check_tfm(specification,specification.name)
+ end
+ else
+ tfmtable = check_tfm(specification,fullname)
+ end
+ return tfmtable
+end
+
+function readers.afm(specification,method)
+ local fullname, tfmtable = specification.filename or "", nil
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ tfmtable = check_afm(specification,specification.name .. "." .. forced)
+ end
+ if not tfmtable then
+ method = method or define.method or "afm or tfm"
+ if method == "tfm" then
+ tfmtable = check_tfm(specification,specification.name)
+ elseif method == "afm" then
+ tfmtable = check_afm(specification,specification.name)
+ elseif method == "tfm or afm" then
+ tfmtable = check_tfm(specification,specification.name) or check_afm(specification,specification.name)
+ else -- method == "afm or tfm" or method == "" then
+ tfmtable = check_afm(specification,specification.name) or check_tfm(specification,specification.name)
+ end
+ end
+ else
+ tfmtable = check_afm(specification,fullname)
+ end
+ return tfmtable
+end
+
+-- maybe some day a set of names
+
+local function check_otf(forced,specification,suffix,what)
+ local name = specification.name
+ if forced then
+ name = file.addsuffix(name,suffix)
+ end
+ local fullname, tfmtable = resolvers.findbinfile(name,suffix) or "", nil -- one shot
+ if fullname == "" then
+ local fb = fonts.names.old_to_new[name]
+ if fb then
+ fullname = resolvers.findbinfile(fb,suffix) or ""
+ end
+ end
+ if fullname == "" then
+ local fb = fonts.names.new_to_old[name]
+ if fb then
+ fullname = resolvers.findbinfile(fb,suffix) or ""
+ end
+ end
+ if fullname ~= "" then
+ specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then
+ tfmtable = tfm.read_from_open_type(specification) -- we need to do it for all matches / todo
+ end
+ return tfmtable
+end
+
+function readers.opentype(specification,suffix,what)
+ local forced = specification.forced or ""
+ if forced == "otf" then
+ return check_otf(true,specification,forced,"opentype")
+ elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then
+ return check_otf(true,specification,forced,"truetype")
+ else
+ return check_otf(false,specification,suffix,what)
+ end
+end
+
+function readers.otf (specification) return readers.opentype(specification,"otf","opentype") end
+function readers.ttf (specification) return readers.opentype(specification,"ttf","truetype") end
+function readers.ttc (specification) return readers.opentype(specification,"ttf","truetype") end -- !!
+function readers.dfont(specification) return readers.opentype(specification,"ttf","truetype") end -- !!
+
+--[[ldx--
+<p>We need to check for default features. For this we provide
+a helper function.</p>
+--ldx]]--
+
+function define.check(features,defaults) -- nb adapts features !
+ local done = false
+ if features and next(features) then
+ for k,v in next, defaults do
+ if features[k] == nil then
+ features[k], done = v, true
+ end
+ end
+ else
+ features, done = table.fastcopy(defaults), true
+ end
+ return features, done -- done signals a change
+end
+
+--[[ldx--
+<p>So far the specifyers. Now comes the real definer. Here we cache
+based on id's. Here we also intercept the virtual font handler. Since
+it evolved stepwise I may rewrite this bit (combine code).</p>
+
+In the previously defined reader (the one resulting in a <l n='tfm'/>
+table) we cached the (scaled) instances. Here we cache them again, but
+this time based on id. We could combine this in one cache but this does
+not gain much. By the way, passing id's back to in the callback was
+introduced later in the development.</p>
+--ldx]]--
+
+define.last = nil
+
+function define.register(fontdata,id)
+ if fontdata and id then
+ local hash = fontdata.hash
+ if not tfm.internalized[hash] then
+ if trace_defining then
+ logs.report("define font","loading at 2 id %s, hash: %s",id or "?",hash or "?")
+ end
+ fonts.identifiers[id] = fontdata
+ fonts.characters [id] = fontdata.characters
+ fonts.quads [id] = fontdata.parameters.quad
+ -- todo: extra functions, e.g. setdigitwidth etc in list
+ tfm.internalized[hash] = id
+ end
+ end
+end
+
+function define.registered(hash)
+ local id = tfm.internalized[hash]
+ return id, id and fonts.ids[id]
+end
+
+local cache_them = false
+
+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 = define.methods[specification.features.vtf.preset]
+ if fvm then
+ return fvm(specification)
+ else
+ return nil
+ end
+end
+
+function define.read(specification,size,id) -- id can be optional, name can already be table
+ statistics.starttiming(fonts)
+ if type(specification) == "string" then
+ specification = define.analyze(specification,size)
+ end
+ local method = specification.method
+ if method and define.specify[method] then
+ specification = define.specify[method](specification)
+ end
+ specification = define.resolve(specification)
+ local hash = tfm.hash_instance(specification)
+ if cache_them then
+ local fontdata = containers.read(fonts.cache(),hash) -- for tracing purposes
+ end
+ local fontdata = define.registered(hash) -- id
+ if not fontdata then
+ if specification.features.vtf and specification.features.vtf.preset then
+ fontdata = tfm.make(specification)
+ else
+ fontdata = tfm.read(specification)
+ if fontdata then
+ tfm.check_virtual_id(fontdata)
+ end
+ end
+ if cache_them then
+ fontdata = containers.write(fonts.cache(),hash,fontdata) -- for tracing purposes
+ end
+ if fontdata then
+ fontdata.hash = hash
+ fontdata.cache = "no"
+ if id then
+ define.register(fontdata,id)
+ end
+ end
+ end
+ define.last = fontdata or id -- todo ! ! ! ! !
+ if not fontdata then
+ logs.report("define font", "unknown font %s, loading aborted",specification.name)
+ elseif trace_defining and type(fontdata) == "table" then
+ logs.report("define font","using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s",
+ fontdata.type or "unknown",
+ id or "?",
+ fontdata.name or "?",
+ fontdata.size or "default",
+ fontdata.encodingbytes or "?",
+ fontdata.encodingname or "unicode",
+ fontdata.fullname or "?",
+ file.basename(fontdata.filename or "?"))
+
+ end
+ statistics.stoptiming(fonts)
+ return fontdata
+end
+
+function vf.find(name)
+ name = file.removesuffix(file.basename(name))
+ if tfm.resolve_vf then
+ local format = fonts.logger.format(name)
+ if format == 'tfm' or format == 'ofm' then
+ if trace_defining then
+ logs.report("define font","locating vf for %s",name)
+ end
+ return resolvers.findbinfile(name,"ovf")
+ else
+ if trace_defining then
+ logs.report("define font","vf for %s is already taken care of",name)
+ end
+ return nil -- ""
+ end
+ else
+ if trace_defining then
+ logs.report("define font","locating vf for %s",name)
+ end
+ return resolvers.findbinfile(name,"ovf")
+ end
+end
+
+--[[ldx--
+<p>We overload both the <l n='tfm'/> and <l n='vf'/> readers.</p>
+--ldx]]--
+
+callbacks.register('define_font' , define.read, "definition of fonts (tfmtable preparation)")
+callbacks.register('find_vf_file', vf.find , "locating virtual fonts, insofar needed") -- not that relevant any more
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-xtx'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local texsprint, count = tex.sprint, tex.count
+local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
+local tostring, next = tostring, next
+local lpegmatch = lpeg.match
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+--[[ldx--
+<p>Choosing a font by name and specififying its size is only part of the
+game. In order to prevent complex commands, <l n='xetex'/> introduced
+a method to pass feature information as part of the font name. At the
+risk of introducing nasty parsing and compatinility problems, this
+syntax was expanded over time.</p>
+
+<p>For the sake of users who have defined fonts using that syntax, we
+will support it, but we will provide additional methods as well.
+Normally users will not use this direct way, but use a more abstract
+interface.</p>
+
+<p>The next one is the official one. However, in the plain
+variant we need to support the crappy [] specification as
+well and that does not work too well with the general design
+of the specifier.</p>
+--ldx]]--
+
+--~ function fonts.define.specify.colonized(specification) -- xetex mode
+--~ local list = { }
+--~ if specification.detail and specification.detail ~= "" then
+--~ for v in gmatch(specification.detail,"%s*([^;]+)%s*") do
+--~ local a, b = match(v,"^(%S*)%s*=%s*(%S*)$")
+--~ if a and b then
+--~ list[a] = b:is_boolean()
+--~ if type(list[a]) == "nil" then
+--~ list[a] = b
+--~ end
+--~ else
+--~ local a, b = match(v,"^([%+%-]?)%s*(%S+)$")
+--~ if a and b then
+--~ list[b] = a ~= "-"
+--~ end
+--~ end
+--~ end
+--~ end
+--~ specification.features.normal = list
+--~ return specification
+--~ end
+
+--~ check("oeps/BI:+a;-b;c=d")
+--~ check("[oeps]/BI:+a;-b;c=d")
+--~ check("file:oeps/BI:+a;-b;c=d")
+--~ check("name:oeps/BI:+a;-b;c=d")
+
+local list = { }
+
+fonts.define.specify.colonized_default_lookup = "file"
+
+local function issome () list.lookup = fonts.define.specify.colonized_default_lookup end
+local function isfile () list.lookup = 'file' end
+local function isname () list.lookup = 'name' end
+local function thename(s) list.name = s end
+local function issub (v) list.sub = v end
+local function iscrap (s) list.crap = string.lower(s) end
+local function istrue (s) list[s] = 'yes' end
+local function isfalse(s) list[s] = 'no' end
+local function iskey (k,v) list[k] = v end
+
+local function istrue (s) list[s] = true end
+local function isfalse(s) list[s] = false end
+
+local spaces = lpeg.P(" ")^0
+local namespec = (1-lpeg.S("/:("))^0 -- was: (1-lpeg.S("/: ("))^0
+local crapspec = spaces * lpeg.P("/") * (((1-lpeg.P(":"))^0)/iscrap) * spaces
+local filename = (lpeg.P("file:")/isfile * (namespec/thename)) + (lpeg.P("[") * lpeg.P(true)/isname * (((1-lpeg.P("]"))^0)/thename) * lpeg.P("]"))
+local fontname = (lpeg.P("name:")/isname * (namespec/thename)) + lpeg.P(true)/issome * (namespec/thename)
+local sometext = (lpeg.R("az","AZ","09") + lpeg.S("+-."))^1
+local truevalue = lpeg.P("+") * spaces * (sometext/istrue)
+local falsevalue = lpeg.P("-") * spaces * (sometext/isfalse)
+local keyvalue = (lpeg.C(sometext) * spaces * lpeg.P("=") * spaces * lpeg.C(sometext))/iskey
+local somevalue = sometext/istrue
+local subvalue = lpeg.P("(") * (lpeg.C(lpeg.P(1-lpeg.S("()"))^1)/issub) * lpeg.P(")") -- for Kim
+local option = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces
+local options = lpeg.P(":") * spaces * (lpeg.P(";")^0 * option)^0
+local pattern = (filename + fontname) * subvalue^0 * crapspec^0 * options^0
+
+local normalize_meanings = fonts.otf.meanings.normalize
+
+function fonts.define.specify.colonized(specification) -- xetex mode
+ list = { }
+ lpegmatch(pattern,specification.specification)
+--~ for k, v in next, list do
+--~ list[k] = v:is_boolean()
+--~ if type(list[a]) == "nil" then
+--~ list[k] = v
+--~ end
+--~ end
+ list.crap = nil -- style not supported, maybe some day
+ if list.name then
+ specification.name = list.name
+ list.name = nil
+ end
+ if list.lookup then
+ specification.lookup = list.lookup
+ list.lookup = nil
+ end
+ if list.sub then
+ specification.sub = list.sub
+ list.sub = nil
+ end
+-- specification.features.normal = list
+ specification.features.normal = normalize_meanings(list)
+ return specification
+end
+
+fonts.define.register_split(":", fonts.define.specify.colonized)
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-dum'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+fonts = fonts or { }
+
+-- general
+
+fonts.otf.pack = false -- only makes sense in context
+fonts.tfm.resolve_vf = false -- no sure about this
+fonts.tfm.fontname_mode = "specification" -- somehow latex needs this
+
+-- readers
+
+fonts.tfm.readers = fonts.tfm.readers or { }
+fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm' }
+fonts.tfm.readers.afm = nil
+
+-- define
+
+fonts.define = fonts.define or { }
+
+--~ fonts.define.method = "tfm"
+
+fonts.define.specify.colonized_default_lookup = "name"
+
+function fonts.define.get_specification(str)
+ return "", str, "", ":", str
+end
+
+-- logger
+
+fonts.logger = fonts.logger or { }
+
+function fonts.logger.save()
+end
+
+-- names
+--
+-- Watch out, the version number is the same as the one used in
+-- the mtx-fonts.lua function scripts.fonts.names as we use a
+-- simplified font database in the plain solution and by using
+-- a different number we're less dependent on context.
+
+fonts.names = fonts.names or { }
+
+fonts.names.version = 1.001 -- not the same as in context
+fonts.names.basename = "luatex-fonts-names.lua"
+fonts.names.new_to_old = { }
+fonts.names.old_to_new = { }
+
+local data, loaded = nil, false
+
+local fileformats = { "lua", "tex", "other text files" }
+
+function fonts.names.resolve(name,sub)
+ if not loaded then
+ local basename = fonts.names.basename
+ if basename and basename ~= "" then
+ for i=1,#fileformats do
+ local format = fileformats[i]
+ local foundname = resolvers.find_file(basename,format) or ""
+ if foundname ~= "" then
+ data = dofile(foundname)
+ break
+ end
+ end
+ end
+ loaded = true
+ end
+ if type(data) == "table" and data.version == fonts.names.version then
+ local condensed = string.gsub(string.lower(name),"[^%a%d]","")
+ local found = data.mappings and data.mappings[condensed]
+ if found then
+ local fontname, filename, subfont = found[1], found[2], found[3]
+ if subfont then
+ return filename, fontname
+ else
+ return filename, false
+ end
+ else
+ return name, false -- fallback to filename
+ end
+ end
+end
+
+fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv
+
+-- For the moment we put this (adapted) pseudo feature here.
+
+table.insert(fonts.triggers,"itlc")
+
+local function itlc(tfmdata,value)
+ if value then
+ -- the magic 40 and it formula come from Dohyun Kim
+ local metadata = tfmdata.shared.otfdata.metadata
+ if metadata then
+ local italicangle = metadata.italicangle
+ if italicangle and italicangle ~= 0 then
+ local uwidth = (metadata.uwidth or 40)/2
+ for unicode, d in next, tfmdata.descriptions do
+ local it = d.boundingbox[3] - d.width + uwidth
+ if it ~= 0 then
+ d.italic = it
+ end
+ end
+ tfmdata.has_italic = true
+ end
+ end
+ end
+end
+
+fonts.initializers.base.otf.itlc = itlc
+fonts.initializers.node.otf.itlc = itlc
+
+-- slant and extend
+
+function fonts.initializers.common.slant(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 1 then
+ value = 1
+ elseif value < -1 then
+ value = -1
+ end
+ tfmdata.slant_factor = value
+end
+
+function fonts.initializers.common.extend(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 10 then
+ value = 10
+ elseif value < -10 then
+ value = -10
+ end
+ tfmdata.extend_factor = value
+end
+
+table.insert(fonts.triggers,"slant")
+table.insert(fonts.triggers,"extend")
+
+fonts.initializers.base.otf.slant = fonts.initializers.common.slant
+fonts.initializers.node.otf.slant = fonts.initializers.common.slant
+fonts.initializers.base.otf.extend = fonts.initializers.common.extend
+fonts.initializers.node.otf.extend = fonts.initializers.common.extend
+
+-- expansion and protrusion
+
+fonts.protrusions = fonts.protrusions or { }
+fonts.protrusions.setups = fonts.protrusions.setups or { }
+
+local setups = fonts.protrusions.setups
+
+function fonts.initializers.common.protrusion(tfmdata,value)
+ if value then
+ local setup = setups[value]
+ if setup then
+ local factor, left, right = setup.factor or 1, setup.left or 1, setup.right or 1
+ local emwidth = tfmdata.parameters.quad
+ tfmdata.auto_protrude = true
+ for i, chr in next, tfmdata.characters do
+ local v, pl, pr = setup[i], nil, nil
+ if v then
+ pl, pr = v[1], v[2]
+ end
+ if pl and pl ~= 0 then chr.left_protruding = left *pl*factor end
+ if pr and pr ~= 0 then chr.right_protruding = right*pr*factor end
+ end
+ end
+ end
+end
+
+fonts.expansions = fonts.expansions or { }
+fonts.expansions.setups = fonts.expansions.setups or { }
+
+local setups = fonts.expansions.setups
+
+function fonts.initializers.common.expansion(tfmdata,value)
+ if value then
+ local setup = setups[value]
+ if setup then
+ local stretch, shrink, step, factor = setup.stretch or 0, setup.shrink or 0, setup.step or 0, setup.factor or 1
+ tfmdata.stretch, tfmdata.shrink, tfmdata.step, tfmdata.auto_expand = stretch * 10, shrink * 10, step * 10, true
+ for i, chr in next, tfmdata.characters do
+ local v = setup[i]
+ if v and v ~= 0 then
+ chr.expansion_factor = v*factor
+ else -- can be option
+ chr.expansion_factor = factor
+ end
+ end
+ end
+ end
+end
+
+table.insert(fonts.manipulators,"protrusion")
+table.insert(fonts.manipulators,"expansion")
+
+fonts.initializers.base.otf.protrusion = fonts.initializers.common.protrusion
+fonts.initializers.node.otf.protrusion = fonts.initializers.common.protrusion
+fonts.initializers.base.otf.expansion = fonts.initializers.common.expansion
+fonts.initializers.node.otf.expansion = fonts.initializers.common.expansion
+
+-- left over
+
+function fonts.register_message()
+end
+
+-- example vectors
+
+local byte = string.byte
+
+fonts.expansions.setups['default'] = {
+
+ stretch = 2, shrink = 2, step = .5, factor = 1,
+
+ [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
+ [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
+ [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
+ [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
+ [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
+ [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
+ [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
+ [byte('w')] = 0.7, [byte('z')] = 0.7,
+ [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
+}
+
+fonts.protrusions.setups['default'] = {
+
+ factor = 1, left = 1, right = 1,
+
+ [0x002C] = { 0, 1 }, -- comma
+ [0x002E] = { 0, 1 }, -- period
+ [0x003A] = { 0, 1 }, -- colon
+ [0x003B] = { 0, 1 }, -- semicolon
+ [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 。
+ [0x060C] = { 0, 1 }, -- arabic comma ،
+ [0x061B] = { 0, 1 }, -- arabic semicolon ؛
+ [0x06D4] = { 0, 1 }, -- arabic full stop ۔
+
+}
+
+-- normalizer
+
+fonts.otf.meanings = fonts.otf.meanings or { }
+
+fonts.otf.meanings.normalize = fonts.otf.meanings.normalize or function(t)
+ if t.rand then
+ t.rand = "random"
+ end
+end
+
+-- bonus
+
+function fonts.otf.name_to_slot(name)
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata and tfmdata.shared then
+ local otfdata = tfmdata.shared.otfdata
+ local unicode = otfdata.luatex.unicodes[name]
+ return unicode and (type(unicode) == "number" and unicode or unicode[1])
+ end
+end
+
+function fonts.otf.char(n)
+ if type(n) == "string" then
+ n = fonts.otf.name_to_slot(n)
+ end
+ if type(n) == "number" then
+ tex.sprint("\\char" .. n)
+ end
+end
+
+-- another one:
+
+fonts.strippables = table.tohash {
+ 0x000AD, 0x017B4, 0x017B5, 0x0200B, 0x0200C, 0x0200D, 0x0200E, 0x0200F, 0x0202A, 0x0202B,
+ 0x0202C, 0x0202D, 0x0202E, 0x02060, 0x02061, 0x02062, 0x02063, 0x0206A, 0x0206B, 0x0206C,
+ 0x0206D, 0x0206E, 0x0206F, 0x0FEFF, 0x1D173, 0x1D174, 0x1D175, 0x1D176, 0x1D177, 0x1D178,
+ 0x1D179, 0x1D17A, 0xE0001, 0xE0020, 0xE0021, 0xE0022, 0xE0023, 0xE0024, 0xE0025, 0xE0026,
+ 0xE0027, 0xE0028, 0xE0029, 0xE002A, 0xE002B, 0xE002C, 0xE002D, 0xE002E, 0xE002F, 0xE0030,
+ 0xE0031, 0xE0032, 0xE0033, 0xE0034, 0xE0035, 0xE0036, 0xE0037, 0xE0038, 0xE0039, 0xE003A,
+ 0xE003B, 0xE003C, 0xE003D, 0xE003E, 0xE003F, 0xE0040, 0xE0041, 0xE0042, 0xE0043, 0xE0044,
+ 0xE0045, 0xE0046, 0xE0047, 0xE0048, 0xE0049, 0xE004A, 0xE004B, 0xE004C, 0xE004D, 0xE004E,
+ 0xE004F, 0xE0050, 0xE0051, 0xE0052, 0xE0053, 0xE0054, 0xE0055, 0xE0056, 0xE0057, 0xE0058,
+ 0xE0059, 0xE005A, 0xE005B, 0xE005C, 0xE005D, 0xE005E, 0xE005F, 0xE0060, 0xE0061, 0xE0062,
+ 0xE0063, 0xE0064, 0xE0065, 0xE0066, 0xE0067, 0xE0068, 0xE0069, 0xE006A, 0xE006B, 0xE006C,
+ 0xE006D, 0xE006E, 0xE006F, 0xE0070, 0xE0071, 0xE0072, 0xE0073, 0xE0074, 0xE0075, 0xE0076,
+ 0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F,
+}
+
+
+end -- closure
diff --git a/tex/generic/context/luatex-fonts.lua b/tex/generic/context/luatex-fonts.lua
new file mode 100644
index 000000000..84acb2b18
--- /dev/null
+++ b/tex/generic/context/luatex-fonts.lua
@@ -0,0 +1,140 @@
+if not modules then modules = { } end modules ['luatex-fonts'] = {
+ version = 1.001,
+ comment = "companion to luatex-fonts.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- We keep track of load time by storing the current time. That
+-- way we cannot be accused of slowing down luading too much.
+
+local starttime = os.gettimeofday()
+
+-- As we don't use the ConTeXt file searching, we need to
+-- initialize the kpse library. As the progname can be anything
+-- we will temporary switch to the ConTeXt namespace if needed.
+-- Just adding the context paths to the path specification is
+-- somewhat faster
+
+-- kpse.set_program_name("luatex")
+
+local ctxkpse = nil
+local verbose = true
+
+local function loadmodule(name,continue)
+ local foundname = kpse.find_file(name,"tex") or ""
+ if not foundname then
+ if not ctxkpse then
+ ctxkpse = kpse.new("luatex","context")
+ end
+ foundname = ctxkpse:find_file(name,"tex") or ""
+ end
+ if foundname == "" then
+ if not continue then
+ texio.write_nl(string.format(" <luatex-fonts: unable to locate %s>",name))
+ os.exit()
+ end
+ else
+ if verbose then
+ texio.write(string.format(" <%s>",foundname)) -- no file.basename yet
+ end
+ dofile(foundname)
+ end
+end
+
+loadmodule('luatex-fonts-merged.lua',true) -- you might comment this line
+
+if fonts then
+
+ -- We're using the merged version. That one could be outdated so
+ -- remove it from your system when you want to use the files from
+ -- from the ConTeXt tree, or keep your copy of the merged version
+ -- up to date.
+
+ texio.write_nl("log",[[
+
+I am using the merged version of 'luatex-fonts.lua' here. If
+you run into problems or experience unexpected behaviour, and
+if you have ConTeXt installed you can try to delete the file
+'luatex-font-merged.lua' as I might then use the possibly
+updated libraries. The merged version is not supported as it
+is a frozen instance.
+
+ ]])
+
+else
+
+ -- The following helpers are a bit overkill but I don't want to
+ -- mess up ConTeXt code for the sake of general generality. Around
+ -- version 1.0 there will be an official api defined.
+
+ loadmodule('l-string.lua')
+ loadmodule('l-lpeg.lua')
+ loadmodule('l-boolean.lua')
+ loadmodule('l-math.lua')
+ loadmodule('l-table.lua')
+ loadmodule('l-file.lua')
+ loadmodule('l-io.lua')
+
+ -- The following modules contain code that is either not used
+ -- at all outside ConTeXt or will fail when enabled due to
+ -- lack of other modules.
+
+ -- First we load a few helper modules. This is about the miminum
+ -- needed to let the font modules do theuir work.
+
+ loadmodule('luat-dum.lua') -- not used in context at all
+ loadmodule('data-con.lua') -- maybe some day we don't need this one
+
+ -- We do need some basic node support although the following
+ -- modules contain a little bit of code that is not used. It's
+ -- not worth weeding.
+
+ loadmodule('node-ini.lua')
+ loadmodule('node-res.lua') -- will be stripped
+ loadmodule('node-inj.lua') -- will be replaced (luatex > .50)
+ loadmodule('node-fnt.lua')
+ loadmodule('node-dum.lua')
+
+ -- Now come the font modules that deal with traditional TeX fonts
+ -- as well as open type fonts. We don't load the afm related code
+ -- from font-enc.lua and font-afm.lua as only ConTeXt deals with
+ -- it.
+ --
+ -- The font database file (if used at all) must be put someplace
+ -- visible for kpse and is not shared with ConTeXt. The mtx-fonts
+ -- script can be used to genate this file (using the --names
+ -- option).
+
+ loadmodule('font-ini.lua')
+ loadmodule('font-tfm.lua') -- will be split (we may need font-log)
+ loadmodule('font-cid.lua')
+ loadmodule('font-ott.lua') -- might be split
+ loadmodule('font-map.lua') -- for loading lum file (will be stripped)
+ loadmodule('font-otf.lua')
+ loadmodule('font-otd.lua')
+ loadmodule('font-oti.lua')
+ loadmodule('font-otb.lua')
+ loadmodule('font-otn.lua')
+ loadmodule('font-ota.lua') -- might be split
+ loadmodule('font-otc.lua')
+ loadmodule('font-def.lua')
+ loadmodule('font-xtx.lua')
+ loadmodule('font-dum.lua')
+
+end
+
+-- In order to deal with the fonts we need to initialize some
+-- callbacks. One can overload them later on if needed.
+
+callback.register('ligaturing', false)
+callback.register('kerning', false)
+callback.register('pre_linebreak_filter', nodes.simple_font_handler)
+callback.register('hpack_filter', nodes.simple_font_handler)
+callback.register('define_font' , fonts.define.read)
+callback.register('find_vf_file', nil) -- reset to normal
+
+-- We're done.
+
+texio.write(string.format(" <luatex-fonts.lua loaded in %0.3f seconds>", os.gettimeofday()-starttime))
diff --git a/tex/generic/context/luatex-fonts.tex b/tex/generic/context/luatex-fonts.tex
new file mode 100644
index 000000000..644d168f5
--- /dev/null
+++ b/tex/generic/context/luatex-fonts.tex
@@ -0,0 +1,139 @@
+%D \module
+%D [ file=luatex-fonts,
+%D version=2009.12.01,
+%D title=\LUATEX\ Support Macros,
+%D subtitle=Generic \OPENTYPE\ Font Handler,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=public domain]
+
+%D \subject{Welcome}
+%D
+%D This file is one of a set of basic functionality enhancements
+%D for \LUATEX\ derived from the \CONTEXT\ \MKIV\ code base. Please
+%D don't polute the \type {luatex-*} namespace with code not coming
+%D from the \CONTEXT\ development team as we may add more files.
+%D
+%D As this is an experimental setup, it might not always work out as
+%D expected. Around \LUATEX\ version 0.50 we expect the code to be
+%D more or less okay.
+%D
+%D This file implements a basic font system for a bare \LUATEX\
+%D system. By default \LUATEX\ only knows about the classic \TFM\
+%D fonts but it can read other font formats and pass them to \LUA.
+%D With some glue code one can then construct a suitable \TFM\
+%D representation that \LUATEX\ can work with. For more advanced font
+%D support a bit more code is needed that needs to be hooked
+%D into the callback mechanism.
+%D
+%D This file is currently rather simple: it just loads the \LUA\ file
+%D with the same name. An example of a \type {luatex.tex} file that is
+%D just plain \TEX:
+%D
+%D \starttyping
+%D \catcode`\{=1 % left brace is begin-group character
+%D \catcode`\}=2 % right brace is end-group character
+%D
+%D \input plain
+%D
+%D \everyjob\expandafter{\the\everyjob\input luatex-fonts\relax}
+%D
+%D \dump
+%D \stoptyping
+%D
+%D We could load the \LUA\ file in \type {\everyjob} but maybe some
+%D day we need more here.
+%D
+%D When defining a font you can use two prefixes. A \type {file:}
+%D prefix forced a file search, while a \type {name:} prefix will
+%D result in consulting the names database. Such a database can be
+%D generated with:
+%D
+%D \starttyping
+%D mtxrun --usekpse --script fonts --names
+%D \stoptyping
+%D
+%D This will generate a file \type {luatex-fonts-names.lua} that has
+%D to be placed in a location where it can be found by \KPSE. Beware:
+%D the \type {--kpseonly} flag is only used outside \CONTEXT\ and
+%D provides very limited functionality, just enough for this task.
+%D
+%D The code loaded here does not come out of thin air, but is mostly
+%D shared with \CONTEXT, however, in that macropackage we go beyond
+%D what is provided here. When you use the code packaged here you
+%D need to keep a few things in mind:
+%D
+%D \startitemize
+%D
+%D \item This subsystem will be extended, improved etc. in about the
+%D same pace as \CONTEXT\ \MKIV. However, because \CONTEXT\ provides a
+%D rather high level of integration not all features will be supported
+%D in the same quality. Use \CONTEXT\ if you want more goodies.
+%D
+%D \item There is no official \API\ yet, which means that using
+%D functions implemented here is at your own risk, in the sense that
+%D names and namespaces might change. There will be a minimal \API\
+%D defined once \LUATEX\ version 1.0 is out. Instead of patching the
+%D files it's better to overload functions if needed.
+%D
+%D \item The modules are not stripped too much, which makes it
+%D possible to benefit from improvements in the code that take place
+%D in the perspective of \CONTEXT\ development. They might be split a
+%D bit more in due time so the baseline might become smaller.
+%D
+%D \item The code is maintained and tested by the \CONTEXT\
+%D development team. As such it might be better suited for this macro
+%D package and integration in other systems might demand some
+%D additional wrapping. Problems can be reported to the team but as we
+%D use \CONTEXT\ \MKIV\ as baseline, you'd better check if the problem
+%D is a general \CONTEXT\ problem too.
+%D
+%D \item The more high level support for features that is provided in
+%D \CONTEXT\ is not part of the code loaded here as it makes no sense
+%D elsewhere. Some experimental features are not part of this code
+%D either but some might show up later.
+%D
+%D \item Math font support will be added but only in its basic form
+%D once that the Latin Modern and \TEX\ Gyre math fonts are
+%D available.
+%D
+%D \item At this moment the more nifty speed-ups are not enabled
+%D because they work in tandem with the alternative file handling
+%D that \CONTEXT\ uses. Maybe around \LUATEX\ 1.0 we will bring some
+%D speedup into this code too (if it pays off at all).
+%D
+%D \item The code defines a few global tables. If this code is used
+%D in a larger perspective then you can best make sure that no
+%D conflicts occur. The \CONTEXT\ package expects users to work in
+%D their own namespace (\type {userdata}, \type {thirddata}, \type
+%D {moduledata} or \type {document}. The team takes all freedom to
+%D use any table at the global level but will not use tables that are
+%D named after macro packages. Later the \CONTEXT\ might operate in
+%D a more controlled namespace but it has a low priority.
+%D
+%D \item There is some tracing code present but this is not enabled
+%D and not supported outside \CONTEXT\ either as it integrates quite
+%D tightly into \CONTEXT. In case of problems you can use \CONTEXT\
+%D for tracking down problems.
+%D
+%D \item Patching the code in distributions is dangerous as it might
+%D fix your problem but introduce new ones for \CONTEXT. So, best keep
+%D the original code as it is.
+%D
+%D \item Attributes are (automatically) taken from the range 127-255 so
+%D you'd best not use these yourself.
+%D
+%D \stopitemize
+%D
+%D If this all sounds a bit tricky, keep in mind that it makes no sense
+%D for us to maintain multiple code bases and we happen to use \CONTEXT.
+%D
+%D For more details about how the font subsystem works we refer to
+%D publications in \TEX\ related journals, the \CONTEXT\ documentation,
+%D and the \CONTEXT\ wiki.
+
+\directlua {
+ dofile(kpse.find_file("luatex-fonts.lua","tex"))
+}
+
+\endinput
diff --git a/tex/generic/context/luatex-mplib.lua b/tex/generic/context/luatex-mplib.lua
new file mode 100644
index 000000000..0afad083a
--- /dev/null
+++ b/tex/generic/context/luatex-mplib.lua
@@ -0,0 +1,469 @@
+if not modules then modules = { } end modules ['supp-mpl'] = {
+ version = 1.001,
+ comment = "companion to luatex-mplib.tex",
+ author = "Hans Hagen & Taco Hoekwater",
+ copyright = "ConTeXt Development Team",
+ license = "public domain",
+}
+
+--[[ldx--
+<p>This module is a stripped down version of libraries that are used
+by <l n='context'/>. It can be used in other macro packages and/or
+serve as an example. Embedding in a macro package is upto others and
+normally boils down to inputting <t>supp-mpl.tex</t>.</p>
+--ldx]]--
+
+if metapost and metapost.version then
+
+ --[[ldx--
+ <p>Let's silently quit and make sure that no one loads it
+ manually in <l n='context'/>.</p>
+ --ldx]]--
+
+else
+
+ local format, concat, abs, match = string.format, table.concat, math.abs, string.match
+
+ local mplib = require ('mplib')
+ local kpse = require ('kpse')
+
+ --[[ldx--
+ <p>We create a namespace and some variables to it. If a namespace is
+ already defined it wil not be initialized. This permits hooking
+ in code beforehand.</p>
+
+ <p>We don't make a format automatically. After all, distributions
+ might have their own preferences and normally a format (mem) file will
+ have some special place in the <l n='tex'/> tree. Also, there can already
+ be format files, different memort settings and other nasty pitfalls that
+ we don't want to interfere with. If you want, you can define a function
+ <t>metapost.make(name,mem_name) that does the job.</t></p>
+ --ldx]]--
+
+ metapost = metapost or { }
+ metapost.version = 1.00
+ metapost.showlog = metapost.showlog or false
+ metapost.lastlog = ""
+
+ --[[ldx--
+ <p>A few helpers, taken from <t>l-file.lua</t>.</p>
+ --ldx]]--
+
+ local file = file or { }
+
+ function file.replacesuffix(filename, suffix)
+ return (string.gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+ end
+
+ function file.stripsuffix(filename)
+ return (string.gsub(filename,"%.[%a%d]+$",""))
+ end
+
+ --[[ldx--
+ <p>We use the <l n='kpse'/> library unless a finder is already
+ defined.</p>
+ --ldx]]--
+
+ local mpkpse = kpse.new("luatex","mpost")
+
+ metapost.finder = metapost.finder or function(name, mode, ftype)
+ if mode == "w" then
+ return name
+ else
+ return mpkpse:find_file(name,ftype)
+ end
+ end
+
+ --[[ldx--
+ <p>You can use your own reported if needed, as long as it handles multiple
+ arguments and formatted strings.</p>
+ --ldx]]--
+
+ metapost.report = metapost.report or function(...)
+ texio.write(format("<mplib: %s>",format(...)))
+ end
+
+ --[[ldx--
+ <p>The rest of this module is not documented. More info can be found in the
+ <l n='luatex'/> manual, articles in user group journals and the files that
+ ship with <l n='context'/>.</p>
+ --ldx]]--
+
+ function metapost.resetlastlog()
+ metapost.lastlog = ""
+ end
+
+ metapost.make = metapost.make or function(name,mem_name,dump)
+ if false then
+ metapost.report("no format %s made for %s",mem_name,name)
+ return false
+ else
+ local t = os.clock()
+ local mpx = mplib.new {
+ ini_version = true,
+ find_file = metapost.finder,
+ job_name = file.stripsuffix(name)
+ }
+ mpx:execute(string.format("input %s ;",name))
+ if dump then
+ mpx:execute("dump ;")
+ metapost.report("format %s made and dumped for %s in %0.3f seconds",mem_name,name,os.clock()-t)
+ else
+ metapost.report("%s read in %0.3f seconds",name,os.clock()-t)
+ end
+ return mpx
+ end
+ end
+
+ function metapost.load(name)
+ local mem_name = file.replacesuffix(name,"mem")
+ local mpx = mplib.new {
+ ini_version = false,
+ mem_name = mem_name,
+ find_file = metapost.finder
+ }
+ if not mpx and type(metapost.make) == "function" then
+ -- when i have time i'll locate the format and dump
+ mpx = metapost.make(name,mem_name)
+ end
+ if mpx then
+ metapost.report("using format %s",mem_name,false)
+ return mpx, nil
+ else
+ return nil, { status = 99, error = "out of memory or invalid format" }
+ end
+ end
+
+ function metapost.unload(mpx)
+ if mpx then
+ mpx:finish()
+ end
+ end
+
+ function metapost.reporterror(result)
+ if not result then
+ metapost.report("mp error: no result object returned")
+ elseif result.status > 0 then
+ local t, e, l = result.term, result.error, result.log
+ if t then
+ metapost.report("mp terminal: %s",t)
+ end
+ if e then
+ metapost.report("mp error: %s", e)
+ end
+ if not t and not e and l then
+ metapost.lastlog = metapost.lastlog .. "\n " .. l
+ metapost.report("mp log: %s",l)
+ else
+ metapost.report("mp error: unknown, no error, terminal or log messages")
+ end
+ else
+ return false
+ end
+ return true
+ end
+
+ function metapost.process(mpx, data)
+ local converted, result = false, {}
+ mpx = metapost.load(mpx)
+ if mpx and data then
+ local result = mpx:execute(data)
+ if not result then
+ metapost.report("mp error: no result object returned")
+ elseif result.status > 0 then
+ metapost.report("mp error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
+ elseif metapost.showlog then
+ metapost.lastlog = metapost.lastlog .. "\n" .. result.term
+ metapost.report("mp info: %s",result.term or "no-term")
+ elseif result.fig then
+ converted = metapost.convert(result)
+ else
+ metapost.report("mp error: unknown error, maybe no beginfig/endfig")
+ end
+ else
+ metapost.report("mp error: mem file not found")
+ end
+ return converted, result
+ end
+
+ local function getobjects(result,figure,f)
+ return figure:objects()
+ end
+
+ function metapost.convert(result, flusher)
+ metapost.flush(result, flusher)
+ return true -- done
+ end
+
+ --[[ldx--
+ <p>We removed some message and tracing code. We might even remove the flusher</p>
+ --ldx]]--
+
+ local function pdf_startfigure(n,llx,lly,urx,ury)
+ tex.sprint(format("\\startMPLIBtoPDF{%s}{%s}{%s}{%s}",llx,lly,urx,ury))
+ end
+
+ local function pdf_stopfigure()
+ tex.sprint("\\stopMPLIBtoPDF")
+ end
+
+ function pdf_literalcode(fmt,...) -- table
+ tex.sprint(format("\\MPLIBtoPDF{%s}",format(fmt,...)))
+ end
+
+ function pdf_textfigure(font,size,text,width,height,depth)
+ text = text:gsub(".","\\hbox{%1}") -- kerning happens in metapost
+ tex.sprint(format("\\MPLIBtextext{%s}{%s}{%s}{%s}{%s}",font,size,text,0,-( 7200/ 7227)/65536*depth))
+ end
+
+ local bend_tolerance = 131/65536
+
+ local rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
+
+ local function pen_characteristics(object)
+ if mplib.pen_info then
+ local t = mplib.pen_info(object)
+ rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
+ divider = sx*sy - rx*ry
+ return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
+ else
+ rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
+ return false, 1
+ end
+ end
+
+ local function concat(px, py) -- no tx, ty here
+ return (sy*px-ry*py)/divider,(sx*py-rx*px)/divider
+ end
+
+ local function curved(ith,pth)
+ local d = pth.left_x - ith.right_x
+ if abs(ith.right_x - ith.x_coord - d) <= bend_tolerance and abs(pth.x_coord - pth.left_x - d) <= bend_tolerance then
+ d = pth.left_y - ith.right_y
+ if abs(ith.right_y - ith.y_coord - d) <= bend_tolerance and abs(pth.y_coord - pth.left_y - d) <= bend_tolerance then
+ return false
+ end
+ end
+ return true
+ end
+
+ local function flushnormalpath(path,open)
+ local pth, ith
+ for i=1,#path do
+ pth = path[i]
+ if not ith then
+ pdf_literalcode("%f %f m",pth.x_coord,pth.y_coord)
+ elseif curved(ith,pth) then
+ pdf_literalcode("%f %f %f %f %f %f c",ith.right_x,ith.right_y,pth.left_x,pth.left_y,pth.x_coord,pth.y_coord)
+ else
+ pdf_literalcode("%f %f l",pth.x_coord,pth.y_coord)
+ end
+ ith = pth
+ end
+ if not open then
+ local one = path[1]
+ if curved(pth,one) then
+ pdf_literalcode("%f %f %f %f %f %f c",pth.right_x,pth.right_y,one.left_x,one.left_y,one.x_coord,one.y_coord )
+ else
+ pdf_literalcode("%f %f l",one.x_coord,one.y_coord)
+ end
+ elseif #path == 1 then
+ -- special case .. draw point
+ local one = path[1]
+ pdf_literalcode("%f %f l",one.x_coord,one.y_coord)
+ end
+ return t
+ end
+
+ local function flushconcatpath(path,open)
+ pdf_literalcode("%f %f %f %f %f %f cm", sx, rx, ry, sy, tx ,ty)
+ local pth, ith
+ for i=1,#path do
+ pth = path[i]
+ if not ith then
+ pdf_literalcode("%f %f m",concat(pth.x_coord,pth.y_coord))
+ elseif curved(ith,pth) then
+ local a, b = concat(ith.right_x,ith.right_y)
+ local c, d = concat(pth.left_x,pth.left_y)
+ pdf_literalcode("%f %f %f %f %f %f c",a,b,c,d,concat(pth.x_coord, pth.y_coord))
+ else
+ pdf_literalcode("%f %f l",concat(pth.x_coord, pth.y_coord))
+ end
+ ith = pth
+ end
+ if not open then
+ local one = path[1]
+ if curved(pth,one) then
+ local a, b = concat(pth.right_x,pth.right_y)
+ local c, d = concat(one.left_x,one.left_y)
+ pdf_literalcode("%f %f %f %f %f %f c",a,b,c,d,concat(one.x_coord, one.y_coord))
+ else
+ pdf_literalcode("%f %f l",concat(one.x_coord,one.y_coord))
+ end
+ elseif #path == 1 then
+ -- special case .. draw point
+ local one = path[1]
+ pdf_literalcode("%f %f l",concat(one.x_coord,one.y_coord))
+ end
+ return t
+ end
+
+ --[[ldx--
+ <p>Support for specials has been removed.</p>
+ --ldx]]--
+
+ function metapost.flush(result,flusher)
+ if result then
+ local figures = result.fig
+ if figures then
+ for f=1, #figures do
+ metapost.report("flushing figure %s",f)
+ local figure = figures[f]
+ local objects = getobjects(result,figure,f)
+ local fignum = tonumber(match(figure:filename(),"([%d]+)$") or figure:charcode() or 0)
+ local miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
+ local bbox = figure:boundingbox()
+ local llx, lly, urx, ury = bbox[1], bbox[2], bbox[3], bbox[4] -- faster than unpack
+ if urx < llx then
+ -- invalid
+ pdf_startfigure(fignum,0,0,0,0)
+ pdf_stopfigure()
+ else
+ pdf_startfigure(fignum,llx,lly,urx,ury)
+ pdf_literalcode("q")
+ if objects then
+ for o=1,#objects do
+ local object = objects[o]
+ local objecttype = object.type
+ if objecttype == "start_bounds" or objecttype == "stop_bounds" then
+ -- skip
+ elseif objecttype == "start_clip" then
+ pdf_literalcode("q")
+ flushnormalpath(object.path,t,false)
+ pdf_literalcode("W n")
+ elseif objecttype == "stop_clip" then
+ pdf_literalcode("Q")
+ miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
+ elseif objecttype == "special" then
+ -- not supported
+ elseif objecttype == "text" then
+ local ot = object.transform -- 3,4,5,6,1,2
+ pdf_literalcode("q %f %f %f %f %f %f cm",ot[3],ot[4],ot[5],ot[6],ot[1],ot[2])
+ pdf_textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth)
+ pdf_literalcode("Q")
+ else
+ local cs = object.color
+ if cs and #cs > 0 then
+ pdf_literalcode(metapost.colorconverter(cs))
+ end
+ local ml = object.miterlimit
+ if ml and ml ~= miterlimit then
+ miterlimit = ml
+ pdf_literalcode("%f M",ml)
+ end
+ local lj = object.linejoin
+ if lj and lj ~= linejoin then
+ linejoin = lj
+ pdf_literalcode("%i j",lj)
+ end
+ local lc = object.linecap
+ if lc and lc ~= linecap then
+ linecap = lc
+ pdf_literalcode("%i J",lc)
+ end
+ local dl = object.dash
+ if dl then
+ local d = format("[%s] %i d",concat(dl.dashes or {}," "),dl.offset)
+ if d ~= dashed then
+ dashed = d
+ pdf_literalcode(dashed)
+ end
+ elseif dashed then
+ pdf_literalcode("[] 0 d")
+ dashed = false
+ end
+ local path = object.path
+ local transformed, penwidth = false, 1
+ local open = path and path[1].left_type and path[#path].right_type
+ local pen = object.pen
+ if pen then
+ if pen.type == 'elliptical' then
+ transformed, penwidth = pen_characteristics(object) -- boolean, value
+ pdf_literalcode("%f w",penwidth)
+ if objecttype == 'fill' then
+ objecttype = 'both'
+ end
+ else -- calculated by mplib itself
+ objecttype = 'fill'
+ end
+ end
+ if transformed then
+ pdf_literalcode("q")
+ end
+ if path then
+ if transformed then
+ flushconcatpath(path,open)
+ else
+ flushnormalpath(path,open)
+ end
+ if objecttype == "fill" then
+ pdf_literalcode("h f")
+ elseif objecttype == "outline" then
+ pdf_literalcode((open and "S") or "h S")
+ elseif objecttype == "both" then
+ pdf_literalcode("h B")
+ end
+ end
+ if transformed then
+ pdf_literalcode("Q")
+ end
+ local path = object.htap
+ if path then
+ if transformed then
+ pdf_literalcode("q")
+ end
+ if transformed then
+ flushconcatpath(path,open)
+ else
+ flushnormalpath(path,open)
+ end
+ if objecttype == "fill" then
+ pdf_literalcode("h f")
+ elseif objecttype == "outline" then
+ pdf_literalcode((open and "S") or "h S")
+ elseif objecttype == "both" then
+ pdf_literalcode("h B")
+ end
+ if transformed then
+ pdf_literalcode("Q")
+ end
+ end
+ if cr then
+ pdf_literalcode(cr)
+ end
+ end
+ end
+ end
+ pdf_literalcode("Q")
+ pdf_stopfigure()
+ end
+ end
+ end
+ end
+ end
+
+ function metapost.colorconverter(cr)
+ local n = #cr
+ if n == 4 then
+ local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
+ return format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k), "0 g 0 G"
+ elseif n == 3 then
+ local r, g, b = cr[1], cr[2], cr[3]
+ return format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b), "0 g 0 G"
+ else
+ local s = cr[1]
+ return format("%.3f g %.3f G",s,s), "0 g 0 G"
+ end
+ end
+
+end
diff --git a/tex/generic/context/luatex-mplib.tex b/tex/generic/context/luatex-mplib.tex
new file mode 100644
index 000000000..206518d7d
--- /dev/null
+++ b/tex/generic/context/luatex-mplib.tex
@@ -0,0 +1,118 @@
+%D \module
+%D [ file=luatex-mplib,
+%D version=2009.12.01,
+%D title=\LUATEX\ Support Macros,
+%D subtitle=\METAPOST\ to \PDF\ conversion,
+%D author=Taco Hoekwater \& Hans Hagen,
+%D date=\currentdate,
+%D copyright=public domain]
+
+%D This is the companion to the \LUA\ module \type {supp-mpl.lua}. Further
+%D embedding is up to others. A simple example of usage in plain \TEX\ is:
+%D
+%D \starttyping
+%D \pdfoutput=1
+%D
+%D \input luatex-mplib.tex
+%D
+%D \setmplibformat{plain}
+%D
+%D \mplibcode
+%D beginfig(1);
+%D draw fullcircle
+%D scaled 10cm
+%D withcolor red
+%D withpen pencircle xscaled 4mm yscaled 2mm rotated 30 ;
+%D endfig;
+%D \endmplibcode
+%D
+%D \end
+%D \stoptyping
+
+\def\setmplibformat#1{\def\mplibformat{#1}}
+
+\def\setupmplibcatcodes
+ {\catcode`\{=12 \catcode`\}=12 \catcode`\#=12 \catcode`\^=12 \catcode`\~=12
+ \catcode`\_=12 \catcode`\%=12 \catcode`\&=12 \catcode`\$=12 }
+
+\def\mplibcode
+ {\bgroup
+ \setupmplibcatcodes
+ \domplibcode}
+
+\long\def\domplibcode#1\endmplibcode
+ {\egroup
+ \directlua{metapost.process('\mplibformat',[[#1]])}}
+
+%D We default to \type {plain} \METAPOST:
+
+\def\mplibformat{plain}
+
+%D We use a dedicated scratchbox:
+
+\ifx\mplibscratchbox\undefined \newbox\mplibscratchbox \fi
+
+%D Now load the needed \LUA\ code.
+
+\directlua{dofile(kpse.find_file('luatex-mplib.lua'))}
+
+%D The following code takes care of encapsulating the literals:
+
+\def\startMPLIBtoPDF#1#2#3#4%
+ {\hbox\bgroup
+ \xdef\MPllx{#1}\xdef\MPlly{#2}%
+ \xdef\MPurx{#3}\xdef\MPury{#4}%
+ \xdef\MPwidth{\the\dimexpr#3bp-#1bp\relax}%
+ \xdef\MPheight{\the\dimexpr#4bp-#2bp\relax}%
+ \parskip0pt%
+ \leftskip0pt%
+ \parindent0pt%
+ \everypar{}%
+ \setbox\mplibscratchbox\vbox\bgroup
+ \noindent}
+
+\def\stopMPLIBtoPDF
+ {\egroup
+ \setbox\mplibscratchbox\hbox
+ {\hskip-\MPllx bp%
+ \raise-\MPlly bp%
+ \box\mplibscratchbox}%
+ \setbox\mplibscratchbox\vbox to \MPheight
+ {\vfill
+ \hsize\MPwidth
+ \wd\mplibscratchbox0pt%
+ \ht\mplibscratchbox0pt%
+ \dp\mplibscratchbox0pt%
+ \box\mplibscratchbox}%
+ \wd\mplibscratchbox\MPwidth
+ \ht\mplibscratchbox\MPheight
+ \box\mplibscratchbox
+ \egroup}
+
+%D The body of picture, except for text items, is taken care of by:
+
+\ifnum\pdfoutput>0
+ \let\MPLIBtoPDF\pdfliteral
+\else
+ \def\MPLIBtoPDF#1{\special{pdf:literal direct #1}} % not ok yet
+\fi
+
+%D Text items have a special handler:
+
+\def\MPLIBtextext#1#2#3#4#5%
+ {\begingroup
+ \setbox\mplibscratchbox\hbox
+ {\font\temp=#1 at #2bp%
+ \temp
+ #3}%
+ \setbox\mplibscratchbox\hbox
+ {\hskip#4 bp%
+ \raise#5 bp%
+ \box\mplibscratchbox}%
+ \wd\mplibscratchbox0pt%
+ \ht\mplibscratchbox0pt%
+ \dp\mplibscratchbox0pt%
+ \box\mplibscratchbox
+ \endgroup}
+
+\endinput
diff --git a/tex/generic/context/luatex-plain.tex b/tex/generic/context/luatex-plain.tex
new file mode 100644
index 000000000..ae2588327
--- /dev/null
+++ b/tex/generic/context/luatex-plain.tex
@@ -0,0 +1,25 @@
+%D \module
+%D [ file=luatex-basics,
+%D version=2009.12.01,
+%D title=\LUATEX\ Support Macros,
+%D subtitle=Attribute Allocation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=public domain]
+
+\input plain
+
+\directlua {tex.enableprimitives('', tex.extraprimitives())}
+
+\pdfoutput=1
+
+\everyjob \expandafter {%
+ \the\everyjob
+ \input luatex-basics\relax
+ \input luatex-fonts\relax
+ \input luatex-mplib\relax
+}
+
+\edef\fmtversion{\fmtversion+luatex}
+
+\dump
diff --git a/tex/generic/context/luatex-test.tex b/tex/generic/context/luatex-test.tex
new file mode 100644
index 000000000..a142d1635
--- /dev/null
+++ b/tex/generic/context/luatex-test.tex
@@ -0,0 +1,53 @@
+%D \module
+%D [ file=luatex-test,
+%D version=2009.12.01,
+%D title=\LUATEX\ Support Macros,
+%D subtitle=Simple Test File,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=public domain]
+
+%D See \type {luatex-plain.tex} (or on my machine \type {luatex.tex}
+%D for how to make a format.
+
+\pdfoutput=1
+
+\font\testa=file:lmroman10-regular at 12pt \testa \input tufte \par
+\font\testb=file:lmroman12-regular:+liga; at 24pt \testb effe flink fietsen \par
+\font\testc=file:lmroman12-regular:mode=node;+liga; at 24pt \testc effe flink fietsen \par
+\font\testd=name:lmroman10bold at 12pt \testd a bit bold \par
+
+\font\oeps=[lmroman12-regular]:+liga at 30pt \oeps crap
+\font\oeps=[lmroman12-regular] at 40pt \oeps more crap
+
+\font\oeps=cmr10
+
+\font\testx=ptmr8t \testx abc
+
+\font\cidtest=adobesongstd-light
+
+\font\mathtest=cambria(math) {\mathtest 123}
+
+% \font\testy=file:IranNastaliq.ttf:mode=node;script=arab;language=dflt;+calt;+ccmp;+init;+isol;+medi;+fina;+liga;+rlig;+kern;+mark;+mkmk at 14pt
+% \testy این یک متن نمونه است با قلم ذر که درست آمده است.
+% \font\testz=name:linlibertineo \testz
+
+\pdfprotrudechars2 \pdfadjustspacing2
+
+\font\testb=file:lmroman12-regular:+liga;extend=1.5 at 12pt \testb \input tufte \par
+\font\testb=file:lmroman12-regular:+liga;slant=0.8 at 12pt \testb \input tufte \par
+\font\testb=file:lmroman12-regular:+liga;protrusion=default at 12pt \testb \input tufte \par
+
+\setmplibformat{plain}
+
+\mplibcode
+ beginfig(1) ;
+ draw fullcircle
+ scaled 10cm
+ withcolor red
+ withpen pencircle xscaled 4mm yscaled 2mm rotated 30 ;
+ endfig ;
+\endmplibcode
+
+\end
+
diff --git a/tex/generic/context/m-ch-de.tex b/tex/generic/context/m-ch-de.tex
new file mode 100644
index 000000000..467cdc670
--- /dev/null
+++ b/tex/generic/context/m-ch-de.tex
@@ -0,0 +1,10 @@
+% name : PPCHTEX / german interface
+% version : 1997.03.05
+% author : J. Hagen
+% copyright : J. Hagen, A.F. Otten
+
+\chardef\interfacenumber=2
+
+\input ppchtex.noc
+
+\endinput
diff --git a/tex/generic/context/m-ch-en.tex b/tex/generic/context/m-ch-en.tex
new file mode 100644
index 000000000..6bd435319
--- /dev/null
+++ b/tex/generic/context/m-ch-en.tex
@@ -0,0 +1,10 @@
+% name : PPCHTEX / english interface
+% version : 1997.03.05
+% author : J. Hagen
+% copyright : J. Hagen, A.F. Otten
+
+\chardef\interfacenumber=0
+
+\input ppchtex.noc
+
+\endinput
diff --git a/tex/generic/context/m-ch-nl.tex b/tex/generic/context/m-ch-nl.tex
new file mode 100644
index 000000000..c9d77733a
--- /dev/null
+++ b/tex/generic/context/m-ch-nl.tex
@@ -0,0 +1,10 @@
+% name : PPCHTEX / english interface
+% version : 1997.03.05
+% author : J. Hagen
+% copyright : J. Hagen, A.F. Otten
+
+\chardef\interfacenumber=1
+
+\input ppchtex.noc
+
+\endinput
diff --git a/tex/generic/context/m-metapo.tex b/tex/generic/context/m-metapo.tex
new file mode 100644
index 000000000..8680f69c6
--- /dev/null
+++ b/tex/generic/context/m-metapo.tex
@@ -0,0 +1,89 @@
+%D \module
+%D [ file=m-metapo,
+%D version=1999.03.26,
+%D title=\LATEX\ Modules,
+%D subtitle=\METAPOST\ Inclusion,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ distribution and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We quit when \CONTEXT\ is found and use some deep down
+%D macro to trigger this:
+
+\ifx\undefined\dodoplaceexternalfigure \else \expandafter \endinput \fi
+
+%D \macros
+%D {includeMPgraphics}
+%D
+%D This rather small \LATEX\ module is dedicated to David
+%D Arnold. It takes care of including the fonts used in
+%D \METAPOST\ graphics in the file. This hack is needed when
+%D one uses another \DVI\ driver than \DVIPS. This module
+%D falls back on the generic \CONTEXT\ support module:
+
+\ifx\undefined\includeMPfonts \input supp-mps.tex \relax \fi
+
+%D Instead of using \type {\includegraphics}, one should use its
+%D little brother \type {\includeMPgraphics}. This macro takes
+%D the same arguments.
+
+\def\includeMPgraphics#1#%
+ {\leavevmode\vbox\bgroup\hbox\bgroup
+ \def\includeMPgraphics##1%
+ {\includeMPfonts{##1}%
+ \includegraphics#1{##1}%
+ \egroup\egroup}%
+ \includeMPgraphics}
+
+%D An example of using this module is given below:
+%D
+%D \starttyping
+%D \documentclass[10pt]{article}
+%D
+%D \usepackage{graphicx}
+%D \usepackage{m-metapo}
+%D
+%D \begin{document}
+%D \includeMPgraphics{somefile.1}
+%D \includeMPgraphics[angle=90]{somefile.2}
+%D \end{document}
+%D \stoptyping
+%D
+%D This module needs \type {supp-mps} and \type {supp-mis},
+%D that both are present in the \CONTEXT\ path.
+%D
+%D Please do not forget to say \type {prologues:=1} at the
+%D top of the metapost file!
+%D
+%D For non \LATEX\ (and \CONTEXT) users we provide an
+%D alternative inclusion macro. This one has no optional
+%D arguments.
+
+\ifx\includegraphics\undefined
+
+ \ifx\undefined\dogetEPSboundingbox \input supp-eps.tex \relax \fi
+
+ \def\includeMPgraphics#1%
+ {\hbox\bgroup
+ \includeMPfonts{#1}%
+ \dogetEPSboundingbox{#1}{\dimen2}{\dimen4}{\dimen6}{\dimen8}%
+ \vbox to \dimen8
+ {\forgetall
+ \hsize\dimen6
+ \vfill
+ \hbox to \hsize
+ {\special
+ {PSfile="#1"\space
+ llx=\EPSllx\space
+ lly=\EPSlly\space
+ urx=\EPSurx\space
+ ury=\EPSury\space}}}%
+ \egroup}
+
+\fi
+
+\endinput
diff --git a/tex/generic/context/mptopdf.tex b/tex/generic/context/mptopdf.tex
new file mode 100644
index 000000000..1f229678d
--- /dev/null
+++ b/tex/generic/context/mptopdf.tex
@@ -0,0 +1,176 @@
+%D \module
+%D [ file=mptopdf,
+%D version=2000.03.27,
+%D title=\METAPOST,
+%D subtitle=conversion to \PDF,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The file \type {mptopdf} provides a quick way to convert
+%D \METAPOST\ files to \PDF\ using a slightly stripped down
+%D plain \TEX, \PDFTEX, and a few \CONTEXT\ modules.
+%D
+%D First generate a format, which in \WEBC\ looks like:
+%D
+%D \starttyping
+%D pdftex --ini mptopdf
+%D \stoptyping
+%D
+%D or:
+%D
+%D \starttyping
+%D texexec --make --tex=pdftex --format=mptopdf --alone
+%D \stoptyping
+%D
+%D Since this conversion only works with \PDFTEX\ or \PDFETEX,
+%D the session is aborted when another \TEX\ is used. When
+%D finished, the resulting \type {fmt} file should be moved to
+%D the right location.
+%D
+%D The conversion itself is accomplished by:
+%D
+%D \starttyping
+%D pdftex &mptopdf \relax filename.number
+%D \stoptyping
+%D
+%D The \type {\relax} is needed since we don't want to process
+%D the file directly. Instead we pick up the filename using
+%D \type {\everypar}. Since this file is still the first one
+%D we load, although delayed, the jobname is as we expect. So,
+%D at least in \WEBC, the result of the conversion comes
+%D available in the file \type {filename.pdf}. This conversion
+%D process is roughly compatible with:
+%D
+%D \starttyping
+%D texexec --pdf --fig=c --result=filename filename.number
+%D \stoptyping
+%D
+%D This uses \CONTEXT, and is therefore slower. Therefore,
+%D we provide a small \PERL\ script that does a faster job,
+%D using the minimal format. Given that a format is
+%D generated, one can say:
+%D
+%D \starttyping
+%D mptopdf somefile
+%D mptopdf somefile.123
+%D mptopdf mp*.*
+%D \stoptyping
+%D
+%D The results are copied into files named \type
+%D {somefile-number}. This mechanism will also be available
+%D in a next release of \TEXUTIL.
+
+%D The \TEX\ implementation is rather simple, since we use some
+%D generic \CONTEXT\ modules. Because we need a few register
+%D allocation macros, we preload plain \TEX. We don't load
+%D fonts yet.
+
+\input syst-tex.mkii
+
+%D We check for the usage of \PDFTEX, and quit if another
+%D \TEX\ is used.
+
+\ifx\pdfoutput\undefined
+ \message{Sorry, you should use pdf(e)TeX instead.}
+ \expandafter \endinput
+\fi
+
+%D The conversion to \PDF\ is carried out by macros, that
+%D are collected in the file:
+
+\input supp-mis.mkii
+\input supp-pdf.mkii
+\input supp-mpe.mkii \MPcmykcolorstrue \MPspotcolorstrue
+
+%D We use no output routine.
+
+\output{}
+
+%D Since we need to calculate and set the bounding box,
+%D we definitely don't want to indent paragraphs.
+
+\parindent=0pt
+
+%D We use \type {\everypar} to pick up the filename and
+%D process the \METAPOST\ graphic.
+
+\everypar{\processMPfile}
+
+%D The main macro shows a few \PDFTEX\ primitives. The main
+%D work is done by the macro \type {\convertMPtoPDF} which is
+%D defined in \type supp-pdf}. This macro interprets the
+%D \METAPOST\ file. Close reading of this macro will probably
+%D learn a few (\PDF) tricks. Apart from some path
+%D transformations, which are needed since \PDF\ has a
+%D different vision on paths, the graphic is positioned in
+%D such a way that accuracy in \PDF\ xforms is guaranteed.
+
+\def\processMPfile#1 %
+ {\pdfoutput=1
+ \pdfpkresolution600
+ \pdfcompresslevel=9
+ \chardef\makeMPintoPDFobject=1
+ \hsize=100in
+ \vsize=\hsize
+ \hoffset=-1in
+ \voffset=\hoffset
+ \topskip=0pt
+ \setbox0=\vbox{\convertMPtoPDF{#1}{1}{1}}%
+ \ifdim\wd0<1in \message{[warning: the width is less than 1in]}\fi
+ \ifdim\ht0<1in \message{[warning: the height is less than 1in]}\fi
+ \pdfpageheight=\ht0
+ \pdfpagewidth=\wd0
+ \box0
+ \bye}
+
+%D The \type {\chardef} forces the converter to build a so
+%D called xform object. This is needed in case the graphic
+%D uses special trickery, like shading.
+
+%D Since \ACROBAT\ has troubles with figures smaller than
+%D 1~inch, we issue a warning. When embedding graphics in
+%D documents, a size less that 1~inch does not harm. In
+%D order to overload runtime directives in the \PDFTEX\
+%D configuration file, we set the offsets and output method
+%D in the macro.
+%D
+%D The resulting \PDF\ file is about as efficient as such a
+%D self contained file can be. However, if needed, this \PDF\
+%D file can be converted to \EPS\ using for instance the
+%D \PDFTOPS\ program (in \WEBC) or \GHOSTSCRIPT.
+
+%D A few helpers:
+
+{\catcode`\.=12
+ \catcode`\p=12
+ \catcode`\t=12
+ \gdef\WITHOUTPT#1pt{#1}}
+
+\def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+\def\negatecolorcomponent#1% #1 = \macro
+ {\scratchdimen1pt\advance\scratchdimen-#1\onepoint
+ \ifdim\scratchdimen<\zeropoint\scratchdimen\zeropoint\fi
+ \edef#1{\withoutpt\the\scratchdimen}}
+
+\let\negatedcolorcomponent\firstofoneargument
+
+\def\negatedcolorcomponent#1%
+ {\ifdim\dimexpr1pt-#1pt\relax<\zeropoint
+ 0pt%
+ \else
+ \expandafter\withoutpt\the\dimexpr1pt-#1pt\relax
+ \fi}
+
+\def\negatecolorcomponent#1% #1 = \macro
+ {\edef#1{\negatedcolorcomponent{#1}}}
+
+\countdef\realpageno=0 % to satisfy mkiv status reports
+
+\dump
diff --git a/tex/generic/context/ppchtex.noc b/tex/generic/context/ppchtex.noc
new file mode 100644
index 000000000..99d073255
--- /dev/null
+++ b/tex/generic/context/ppchtex.noc
@@ -0,0 +1,212 @@
+%D \module
+%D [ file=ppchtex (m-chemie),
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
+%D author=Hans Hagen,
+%D date=\huidigedatum,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten},
+%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
+%C details.
+
+%D This module facilitates the use of \PPCHTEX\ in macro
+%D packages other than \CONTEXT. One of the features of
+%D \CONTEXT\ is that the user interface can be in any
+%D language. This language is defined at loading time.
+%D
+%D This module is indeed a surrogate one and is only a poor
+%D man's alternative to the more extensive \type{mult-***}
+%D modules of \CONTEXT. The extra overhead in terms of macros
+%D and functionality that these modules offer is only useful
+%D in \CONTEXT.
+%D
+%D Two interfaces are supported here, but others can easily be
+%D defined. This module expects the general system macros to be
+%D loaded as wel as a interface switch \type{\ifalternativeinterface}
+%D to be set.
+
+%D First we load some auxiliary macro's:
+
+\input supp-mis.mkii \let\writestatus\undefined
+\input syst-gen.mkii
+\input syst-fnt.mkii
+
+%D after which we can go on with:
+
+\unprotect
+
+%D 0 = english
+%D 1 = dutch
+%D 2 = german
+
+\ifx\interfacenumber\undefined
+ \chardef\interfacenumber=0
+\fi
+
+\def\definesystemvariable #1 %
+ {\setvalue{??#1}{@@#1}}
+
+\def\definesystemconstant #1 %
+ {\setvalue{s!#1}{#1}}
+
+\def\definevariable #1 #2 #3 % en nl de
+ {\ifcase\interfacenumber
+ \setvalue{v!#1}{#1}
+ \or
+ \setvalue{v!#1}{#2}
+ \or
+ \setvalue{v!#1}{#3}
+ \fi}
+
+\def\defineconstant #1 #2 #3 % en nl de
+ {\ifcase\interfacenumber
+ \setvalue{c!#1}{#1}
+ \setvalue{c!#2}{#1}
+ \or
+ \setvalue{c!#1}{#1}
+ \or
+ \setvalue{c!#1}{#1}
+ \setvalue{c!#3}{#1}
+ \fi}
+
+\def\definecommand #1 #2 #3 %
+ {\ifcase\interfacenumber
+ % core commands are english
+ \or
+ \doifnot{#1}{#2}{\setvalue{#2}{\getvalue{#1}}}
+ \or
+ \doifnot{#1}{#3}{\setvalue{#3}{\getvalue{#1}}}
+ \fi}
+
+\long\def\startcommands#1\stopcommands
+ {}
+
+\def\dosetvalue#1#2#3%
+ {\p!doifundefined{\c!prefix!#2}%
+ \let\donottest=\doprocesstest
+ \@EA\def\csname#1#2\endcsname{#3}%
+ \else
+ \let\donottest=\doprocesstest
+ \@EA\def\csname#1\csname\c!prefix!#2\endcsname\endcsname{#3}%
+ \fi}
+
+\def\dosetevalue#1#2#3%
+ {\p!doifundefined{\c!prefix!#2}%
+ \let\donottest=\doprocesstest
+ \@EA\edef\csname#1#2\endcsname{#3}%
+ \else
+ \let\donottest=\doprocesstest
+ \@EA\edef\csname#1\csname\c!prefix!#2\endcsname\endcsname{#3}%
+ \fi}
+
+\def\docopyvalue#1#2#3%
+ {\p!doifundefined{\c!prefix!#3}%
+ \let\donottest=\doprocesstest
+ \@EA\def\csname#1#3\endcsname%
+ {\csname#2#3\endcsname}%
+ \else
+ \let\donottest=\doprocesstest
+ \@EA\def\csname#1\csname\c!prefix!#3\endcsname\endcsname%
+ {\csname#2\csname\c!prefix!#3\endcsname\endcsname}%
+ \fi}
+
+\def\doresetvalue#1#2%
+ {\dosetvalue{#1}{#2}{}}
+
+\def\dogetvalue#1#2%
+ {\csname#1\csname\c!prefix!#2\endcsname\endcsname}
+
+\defineconstant axis assenstelsel achsen
+\defineconstant top boven oben
+\defineconstant width breedte breite
+\defineconstant size formaat groesse
+\defineconstant number getal nummer
+\defineconstant height hoogte hoehe
+\defineconstant factor factor faktor
+\defineconstant frame kader rahmen
+%defineconstant framecolor kaderkleur rahmenfarbe
+\defineconstant color kleur farbe
+\defineconstant bodyfont korps fliesstext
+\defineconstant style letter schriftstil
+\defineconstant rulethickness lijndikte liniendicke
+\defineconstant rulecolor lijnkleur linienfarbe
+\defineconstant left links links
+\defineconstant offset offset offset
+\defineconstant bottom onder unten
+\defineconstant option optie option
+\defineconstant location plaats platz
+\defineconstant right rechts rechts
+\defineconstant resolution resolutie aufloesung
+\defineconstant scale schaal format
+\defineconstant state status status
+\defineconstant text tekst text
+\defineconstant textcolor tekstkleur tekstfarbe
+\defineconstant textsize tekstformaat textgroesse
+\defineconstant alternative variant alternative
+\defineconstant x x x
+\defineconstant y y y
+
+\definevariable on aan an
+\definevariable big groot gross
+\definevariable intext intekst imtext
+\definevariable small klein klein
+\definevariable medium middel mittel
+\definevariable fit passend passend
+\definevariable start start start
+\definevariable stop stop stop
+\definevariable test test test
+\definevariable off uit aus
+
+\definecommand definechemical definieerchemie definierechemie
+\definecommand setupchemical stelchemiein stellechemieein
+\definecommand chemical chemie chemie
+\definecommand tochemical naarchemie zurchemie
+\definecommand startchemical startchemie startchemie
+\definecommand stopchemical stopchemie stopchemie
+\definecommand toptext boventekst textueber
+\definecommand bottext ondertekst textunter
+\definecommand midtext middentekst textmitte
+
+\protect
+
+%D After those definitions we actually load \PPCHTEX:
+
+\input ppchtex.mkii
+
+%D We also change some setup values. Let's hope that the next
+%D setups forever suits \LATEX.
+
+\unprotect
+
+\ifx\bodyfontsize\undefined
+ \ifx\f@size\undefined
+ \ifx\@ptsize\undefined
+ \setupchemical[\c!bodyfont=11pt]
+ \else
+ \setupchemical[\c!bodyfont=1\@ptsize pt]
+ \fi
+ \else
+ \setupchemical[\c!bodyfont=\f@size pt]
+ \fi
+\else
+ \setupchemical[\c!bodyfont=\bodyfontsize]
+\fi
+
+\ifx\mathrm\undefined
+ \setupchemical[\c!style=\rm]
+\else
+ \setupchemical[\c!style=\mathrm]
+\fi
+
+\ifx\outputresolution\undefined
+ \setupchemical[\c!resolution=300]
+\else
+ \setupchemical[\c!resolution=\outputresolution]
+\fi
+
+\let\unexpanded\normalunexpanded
+
+\protect \endinput
diff --git a/tex/latex/context/m-ch-de.sty b/tex/latex/context/m-ch-de.sty
new file mode 100644
index 000000000..d35f8cf2d
--- /dev/null
+++ b/tex/latex/context/m-ch-de.sty
@@ -0,0 +1,19 @@
+\ProvidesPackage{m-ch-de}[2004/07/30 package wrapper for m-ch-de.tex]
+
+\newif\ifPPCH@PSTRICKS
+
+\DeclareOption{pstricks}{\PPCH@PSTRICKStrue}
+\DeclareOption{pictex}{\PPCH@PSTRICKSfalse}
+
+\ExecuteOptions{pictex}
+\ProcessOptions\relax
+
+\ifPPCH@PSTRICKS
+ \RequirePackage{pstricks,pst-plot}
+\else
+ \RequirePackage{m-pictex}
+\fi
+
+\input{m-ch-de.tex}
+
+\endinput \ No newline at end of file
diff --git a/tex/latex/context/m-ch-en.sty b/tex/latex/context/m-ch-en.sty
new file mode 100644
index 000000000..e93a49867
--- /dev/null
+++ b/tex/latex/context/m-ch-en.sty
@@ -0,0 +1,19 @@
+\ProvidesPackage{m-ch-en}[2004/07/30 package wrapper for m-ch-en.tex]
+
+\newif\ifPPCH@PSTRICKS
+
+\DeclareOption{pstricks}{\PPCH@PSTRICKStrue}
+\DeclareOption{pictex}{\PPCH@PSTRICKSfalse}
+
+\ExecuteOptions{pictex}
+\ProcessOptions\relax
+
+\ifPPCH@PSTRICKS
+ \RequirePackage{pstricks,pst-plot}
+\else
+ \RequirePackage{m-pictex}
+\fi
+
+\input{m-ch-en.tex}
+
+\endinput \ No newline at end of file
diff --git a/tex/latex/context/m-ch-nl.sty b/tex/latex/context/m-ch-nl.sty
new file mode 100644
index 000000000..6e2b8d43d
--- /dev/null
+++ b/tex/latex/context/m-ch-nl.sty
@@ -0,0 +1,19 @@
+\ProvidesPackage{m-ch-nl}[2004/07/30 package wrapper for m-ch-nl.tex]
+
+\newif\ifPPCH@PSTRICKS
+
+\DeclareOption{pstricks}{\PPCH@PSTRICKStrue}
+\DeclareOption{pictex}{\PPCH@PSTRICKSfalse}
+
+\ExecuteOptions{pictex}
+\ProcessOptions\relax
+
+\ifPPCH@PSTRICKS
+ \RequirePackage{pstricks,pst-plot}
+\else
+ \RequirePackage{m-pictex}
+\fi
+
+\input{m-ch-nl.tex}
+
+\endinput \ No newline at end of file
diff --git a/tex/latex/context/m-metapo.sty b/tex/latex/context/m-metapo.sty
new file mode 100644
index 000000000..2d568df96
--- /dev/null
+++ b/tex/latex/context/m-metapo.sty
@@ -0,0 +1,5 @@
+\ProvidesPackage{m-metapo}[2004/07/30 package wrapper for m-metapo.tex]
+
+\input{m-metapo.tex}
+
+\endinput \ No newline at end of file
diff --git a/tex/latex/context/m-pictex.sty b/tex/latex/context/m-pictex.sty
new file mode 100644
index 000000000..18630f2cc
--- /dev/null
+++ b/tex/latex/context/m-pictex.sty
@@ -0,0 +1,5 @@
+\ProvidesPackage{m-pictex}[2004/07/30 package wrapper for m-pictex.tex]
+
+\input{m-pictex.tex}
+
+\endinput \ No newline at end of file